diff --git a/compile_min.sh b/compile_min.sh deleted file mode 100755 index 606642aed..000000000 --- a/compile_min.sh +++ /dev/null @@ -1,92 +0,0 @@ -#!/bin/bash -# ngspice build script for MINGW-w64, release or debug version, 64 bit -# compile_min.sh - -#Procedure: -# Install MSYS2, plus gcc 64 bit, libtool, autoconf, automake, bison, git, and make -# See either https://github.com/orlp/dev-on-windows/wiki/Installing-GCC--&-MSYS2 -# (allows to generate either 32 or 64 bit executables by setting flag -m32 or -m64) -# start compiling with -# './compile_min.sh' for release or './compile_min.sh d' for debug version. - -# Options: -# --adms and --enable-adms will install extra HICUM, EKV and MEXTRAM models via the -# adms interface. -# Please see http://ngspice.sourceforge.net/admshowto.html for more info on adms. -# CIDER, XSPICE, and OpenMP may be selected at will. -# --disable-debug will give O2 optimization (versus O0 for debug) and removes all debugging info. -# --enable-oldapps will make ngnutmeg ngsconvert ngproc2mod ngmultidec ngmakeidx in addition to ngspice - -# ngspice as shared library: -# Replace --with-wingui by --with-ngshared in line ../configure ... . -# Add (optionally) --enable-relpath to avoid absolute paths when searching for code models. -# It might be necessary to uncomment and run ./autogen.sh . - -SECONDS=0 - -if test "$1" = "d"; then - if [ ! -d "debug" ]; then - mkdir debug - if [ $? -ne 0 ]; then echo "mkdir debug failed"; exit 1 ; fi - fi -else - if [ ! -d "release" ]; then - mkdir release - if [ $? -ne 0 ]; then echo "mkdir release failed"; exit 1 ; fi - fi -fi - -# If compiling sources from git, you may need to uncomment the following two lines: -./autogen.sh -if [ $? -ne 0 ]; then echo "./autogen.sh failed"; exit 1 ; fi - -# Alternatively, if compiling sources from git, and want to add adms created devices, -# you may need to uncomment the following two lines (and don't forget to add adms option -# to the ../configure statement): -#./autogen.sh --adms -#if [ $? -ne 0 ]; then echo "./autogen.sh failed"; exit 1 ; fi - -echo -if test "$1" = "d"; then - cd debug - if [ $? -ne 0 ]; then echo "cd debug failed"; exit 1 ; fi - echo "configuring for 64 bit debug" - echo -# You may add --enable-adms to the following command for adding adms generated devices - ../configure --with-wingui --enable-xspice --enable-cider --enable-openmp prefix="C:/Spice64d" CFLAGS="-g -m64 -O0 -Wall -Wno-unused-but-set-variable" LDFLAGS="-g -m64" -else - cd release - if [ $? -ne 0 ]; then echo "cd release failed"; exit 1 ; fi - echo "configuring for 64 bit release" - echo -# You may add --enable-adms to the following command for adding adms generated devices - ../configure --with-wingui --enable-xspice --enable-cider --enable-openmp --disable-debug prefix="C:/Spice64" CFLAGS="-m64 -O2" LDFLAGS="-m64 -s" -fi -if [ $? -ne 0 ]; then echo "../configure failed"; exit 1 ; fi - -echo -# make clean is required for properly making the code models -echo "cleaning (see make_clean.log)" -make clean 2>&1 -j8 | tee make_clean.log -exitcode=${PIPESTATUS[0]} -if [ $exitcode -ne 0 ]; then echo "make clean failed"; exit 1 ; fi -# echo "compiling the icon" -# windres ../src/ngicon.rc -O coff -o ./src/ngicon.o -# exitcode=${PIPESTATUS[0]} -# if [ $exitcode -ne 0 ]; then echo "compiling the icon failed"; exit 1 ; fi -echo "compiling (see make.log)" -make 2>&1 -j8 | tee make.log -exitcode=${PIPESTATUS[0]} -if [ $exitcode -ne 0 ]; then echo "make failed"; exit 1 ; fi -# 64 bit debug: Install to C:\Spice64d -# 64 bit: Install to C:\Spice64 -echo "installing (see make_install.log)" -make install 2>&1 | tee make_install.log -exitcode=${PIPESTATUS[0]} -if [ $exitcode -ne 0 ]; then echo "make install failed"; exit 1 ; fi - -ELAPSED="Elapsed compile time: $(($SECONDS / 3600))hrs $((($SECONDS / 60) % 60))min $(($SECONDS % 60))sec" -echo -echo $ELAPSED -echo "success" -exit 0 diff --git a/configure.ac b/configure.ac index 19a0a3a03..6f1c064c4 100644 --- a/configure.ac +++ b/configure.ac @@ -1352,69 +1352,15 @@ AC_CONFIG_FILES([Makefile src/spicelib/Makefile src/spicelib/analysis/Makefile src/spicelib/devices/Makefile - src/spicelib/devices/asrc/Makefile src/spicelib/devices/bjt/Makefile - src/spicelib/devices/bsim1/Makefile - src/spicelib/devices/bsim2/Makefile - src/spicelib/devices/bsim3/Makefile - src/spicelib/devices/bsim3v0/Makefile - src/spicelib/devices/bsim3v1/Makefile - src/spicelib/devices/bsim3v32/Makefile - src/spicelib/devices/bsim4/Makefile - src/spicelib/devices/bsim4v5/Makefile - src/spicelib/devices/bsim4v6/Makefile - src/spicelib/devices/bsim4v7/Makefile - src/spicelib/devices/bsim3soi_pd/Makefile - src/spicelib/devices/bsim3soi_fd/Makefile - src/spicelib/devices/bsim3soi_dd/Makefile - src/spicelib/devices/bsimsoi/Makefile src/spicelib/devices/cap/Makefile - src/spicelib/devices/cccs/Makefile - src/spicelib/devices/ccvs/Makefile - src/spicelib/devices/csw/Makefile - src/spicelib/devices/cpl/Makefile src/spicelib/devices/dio/Makefile src/spicelib/devices/ind/Makefile src/spicelib/devices/isrc/Makefile - src/spicelib/devices/hfet1/Makefile - src/spicelib/devices/hfet2/Makefile - src/spicelib/devices/hicum2/Makefile - src/spicelib/devices/hisim2/Makefile - src/spicelib/devices/hisimhv1/Makefile - src/spicelib/devices/hisimhv2/Makefile - src/spicelib/devices/jfet/Makefile - src/spicelib/devices/jfet2/Makefile - src/spicelib/devices/ltra/Makefile - src/spicelib/devices/mes/Makefile - src/spicelib/devices/mesa/Makefile src/spicelib/devices/mos1/Makefile - src/spicelib/devices/mos2/Makefile - src/spicelib/devices/mos3/Makefile - src/spicelib/devices/mos6/Makefile - src/spicelib/devices/mos9/Makefile - src/spicelib/devices/ndev/Makefile src/spicelib/devices/res/Makefile - src/spicelib/devices/soi3/Makefile - src/spicelib/devices/sw/Makefile - src/spicelib/devices/tra/Makefile - src/spicelib/devices/txl/Makefile - src/spicelib/devices/urc/Makefile - src/spicelib/devices/vbic/Makefile - src/spicelib/devices/vccs/Makefile - src/spicelib/devices/vcvs/Makefile - src/spicelib/devices/vdmos/Makefile src/spicelib/devices/vsrc/Makefile - src/spicelib/devices/nbjt/Makefile - src/spicelib/devices/nbjt2/Makefile - src/spicelib/devices/numd/Makefile - src/spicelib/devices/numd2/Makefile - src/spicelib/devices/numos/Makefile src/spicelib/parser/Makefile - src/ciderlib/Makefile - src/ciderlib/input/Makefile - src/ciderlib/support/Makefile - src/ciderlib/oned/Makefile - src/ciderlib/twod/Makefile src/frontend/Makefile src/frontend/numparam/Makefile src/frontend/help/Makefile @@ -1434,16 +1380,6 @@ AC_CONFIG_FILES([Makefile src/maths/sparse/Makefile src/maths/dense/Makefile src/misc/Makefile - src/xspice/Makefile - src/xspice/cm/Makefile - src/xspice/cmpp/Makefile - src/xspice/icm/makedefs - src/xspice/icm/GNUmakefile - src/xspice/mif/Makefile - src/xspice/evt/Makefile - src/xspice/enh/Makefile - src/xspice/ipc/Makefile - src/xspice/idn/Makefile tests/Makefile tests/bsim1/Makefile tests/bsim2/Makefile diff --git a/src/Makefile.am b/src/Makefile.am index 1f0e53588..cba498f4a 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -1,15 +1,7 @@ ## Process this file with automake to produce Makefile.in -SUBDIRS = include/ngspice include/cppduals/duals misc maths frontend spicelib -DIST_SUBDIRS = include/ngspice include/cppduals/duals misc maths frontend spicelib xspice ciderlib - -if XSPICE_WANTED -SUBDIRS += xspice -endif - -if CIDER_WANTED -SUBDIRS += ciderlib -endif +SUBDIRS = include/ngspice misc maths frontend spicelib +DIST_SUBDIRS = include/ngspice misc maths frontend spicelib if !TCL_MODULE if !SHARED_MODULE @@ -43,56 +35,13 @@ initdata_DATA += devload devaxis ciderinit endif DYNAMIC_DEVICELIBS = \ - spicelib/devices/asrc/libasrc.la \ spicelib/devices/bjt/libbjt.la \ - spicelib/devices/bsim1/libbsim1.la \ - spicelib/devices/bsim2/libbsim2.la \ - spicelib/devices/bsim3/libbsim3.la \ - spicelib/devices/bsim3v0/libbsim3v0.la \ - spicelib/devices/bsim3v1/libbsim3v1.la \ - spicelib/devices/bsim3v32/libbsim3v32.la \ - spicelib/devices/bsim4/libbsim4.la \ - spicelib/devices/bsim4v5/libbsim4v5.la \ - spicelib/devices/bsim4v6/libbsim4v6.la \ - spicelib/devices/bsim4v7/libbsim4v7.la \ spicelib/devices/cap/libcap.la \ - spicelib/devices/bsim3soi_pd/libbsim3soipd.la \ - spicelib/devices/bsim3soi_fd/libbsim3soifd.la \ - spicelib/devices/bsim3soi_dd/libbsim3soidd.la \ - spicelib/devices/bsimsoi/libbsim4soi.la \ - spicelib/devices/cccs/libcccs.la \ - spicelib/devices/ccvs/libccvs.la \ - spicelib/devices/cpl/libcpl.la \ - spicelib/devices/csw/libcsw.la \ spicelib/devices/dio/libdio.la \ spicelib/devices/ind/libind.la \ spicelib/devices/isrc/libisrc.la \ - spicelib/devices/hfet1/libhfet.la \ - spicelib/devices/hfet2/libhfet2.la \ - spicelib/devices/hicum2/libhicum2.la \ - spicelib/devices/hisim2/libhisim2.la \ - spicelib/devices/hisimhv1/libhisimhv1.la \ - spicelib/devices/hisimhv2/libhisimhv2.la \ - spicelib/devices/jfet/libjfet.la \ - spicelib/devices/jfet2/libjfet2.la \ - spicelib/devices/ltra/libltra.la \ - spicelib/devices/mes/libmes.la \ - spicelib/devices/mesa/libmesa.la \ spicelib/devices/mos1/libmos1.la \ - spicelib/devices/mos2/libmos2.la \ - spicelib/devices/mos3/libmos3.la \ - spicelib/devices/mos6/libmos6.la \ - spicelib/devices/mos9/libmos9.la \ spicelib/devices/res/libres.la \ - spicelib/devices/soi3/libsoi3.la \ - spicelib/devices/sw/libsw.la \ - spicelib/devices/txl/libtxl.la \ - spicelib/devices/tra/libtra.la \ - spicelib/devices/urc/liburc.la \ - spicelib/devices/vbic/libvbic.la \ - spicelib/devices/vccs/libvccs.la \ - spicelib/devices/vcvs/libvcvs.la \ - spicelib/devices/vdmos/libvdmos.la \ spicelib/devices/vsrc/libvsrc.la \ @VLADEV@ @@ -133,48 +82,16 @@ ngspice_LDADD += \ spicelib/devices/dev.lo \ $(DYNAMIC_DEVICELIBS) -if NDEV_WANTED -ngspice_LDADD += spicelib/devices/ndev/libndev.la -endif - -if NUMDEV_WANTED -ngspice_LDADD += \ - spicelib/devices/nbjt/libnbjt.la \ - spicelib/devices/nbjt2/libnbjt2.la \ - spicelib/devices/numd/libnumd.la \ - spicelib/devices/numd2/libnumd2.la \ - spicelib/devices/numos/libnumos.la -endif - ngspice_LDADD += \ spicelib/analysis/libckt.la \ spicelib/devices/libdev.la -if XSPICE_WANTED -ngspice_LDADD += \ - xspice/cm/libcmxsp.la \ - xspice/mif/libmifxsp.la \ - xspice/evt/libevtxsp.la \ - xspice/enh/libenhxsp.la \ - xspice/ipc/libipcxsp.la \ - xspice/idn/libidnxsp.la \ - @XSPICEDLLIBS@ -endif - ngspice_LDADD += \ frontend/parser/libparser.la \ frontend/numparam/libnumparam.la \ frontend/trannoise/libtrannoise.la \ spicelib/parser/libinp.la -if CIDER_WANTED -ngspice_LDADD += \ - ciderlib/twod/libcidertwod.la \ - ciderlib/oned/libcideroned.la \ - ciderlib/input/libciderinput.la \ - ciderlib/support/libcidersuprt.la -endif - ngspice_LDADD += \ maths/deriv/libderiv.la \ maths/cmaths/libcmaths.la \ @@ -421,42 +338,16 @@ libspice_la_LIBADD += \ spicelib/devices/ndev/libndev.la endif -if NUMDEV_WANTED -libspice_la_LIBADD += \ - spicelib/devices/nbjt/libnbjt.la \ - spicelib/devices/nbjt2/libnbjt2.la \ - spicelib/devices/numd/libnumd.la \ - spicelib/devices/numd2/libnumd2.la \ - spicelib/devices/numos/libnumos.la -endif - libspice_la_LIBADD += \ spicelib/analysis/libckt.la \ spicelib/devices/libdev.la -if XSPICE_WANTED -libspice_la_LIBADD += \ - xspice/evt/libevtxsp.la \ - xspice/enh/libenhxsp.la \ - xspice/ipc/libipcxsp.la \ - xspice/idn/libidnxsp.la \ - @XSPICEDLLIBS@ -endif - libspice_la_LIBADD += \ frontend/parser/libparser.la \ frontend/numparam/libnumparam.la \ frontend/trannoise/libtrannoise.la \ spicelib/parser/libinp.la -if CIDER_WANTED -libspice_la_LIBADD += \ - ciderlib/twod/libcidertwod.la \ - ciderlib/oned/libcideroned.la \ - ciderlib/input/libciderinput.la \ - ciderlib/support/libcidersuprt.la -endif - libspice_la_LIBADD += \ maths/deriv/libderiv.la \ maths/cmaths/libcmaths.la \ @@ -526,56 +417,19 @@ libngspice_la_LIBADD = \ libngspice_la_LIBADD += \ frontend/plotting/libplotting.la -if XSPICE_WANTED -libngspice_la_LIBADD += \ - xspice/cm/libcmxsp.la \ - xspice/mif/libmifxsp.la -endif - libngspice_la_LIBADD += \ $(DYNAMIC_DEVICELIBS) -if NDEV_WANTED -libngspice_la_LIBADD += \ - spicelib/devices/ndev/libndev.la -endif - -if NUMDEV_WANTED -libngspice_la_LIBADD += \ - spicelib/devices/nbjt/libnbjt.la \ - spicelib/devices/nbjt2/libnbjt2.la \ - spicelib/devices/numd/libnumd.la \ - spicelib/devices/numd2/libnumd2.la \ - spicelib/devices/numos/libnumos.la -endif - libngspice_la_LIBADD += \ spicelib/analysis/libckt.la \ spicelib/devices/libdev.la -if XSPICE_WANTED -libngspice_la_LIBADD += \ - xspice/evt/libevtxsp.la \ - xspice/enh/libenhxsp.la \ - xspice/ipc/libipcxsp.la \ - xspice/idn/libidnxsp.la \ - @XSPICEDLLIBS@ -endif - libngspice_la_LIBADD += \ frontend/parser/libparser.la \ frontend/numparam/libnumparam.la \ frontend/trannoise/libtrannoise.la \ spicelib/parser/libinp.la -if CIDER_WANTED -libngspice_la_LIBADD += \ - ciderlib/twod/libcidertwod.la \ - ciderlib/oned/libcideroned.la \ - ciderlib/input/libciderinput.la \ - ciderlib/support/libcidersuprt.la -endif - libngspice_la_LIBADD += \ maths/deriv/libderiv.la \ maths/cmaths/libcmaths.la \ diff --git a/src/ciderlib/Makefile.am b/src/ciderlib/Makefile.am deleted file mode 100644 index b82862052..000000000 --- a/src/ciderlib/Makefile.am +++ /dev/null @@ -1,7 +0,0 @@ -## Process this file with automake - -EXTRA_DIST = notes - -SUBDIRS = input support oned twod - -MAINTAINERCLEANFILES = Makefile.in diff --git a/src/ciderlib/input/Makefile.am b/src/ciderlib/input/Makefile.am deleted file mode 100644 index 5288e21b2..000000000 --- a/src/ciderlib/input/Makefile.am +++ /dev/null @@ -1,34 +0,0 @@ -## Process this file with automake to produce Makefile.in - -noinst_LTLIBRARIES = libciderinput.la - -libciderinput_la_SOURCES = \ - bdryset.c \ - boundary.c \ - cards.c \ - contact.c \ - contset.c \ - domain.c \ - domnset.c \ - doping.c \ - dopset.c \ - elctset.c \ - electrod.c \ - material.c \ - matlset.c \ - mesh.c \ - meshset.c \ - method.c \ - mobility.c \ - mobset.c \ - models.c \ - modlset.c \ - optionsc.c \ - outpset.c \ - output.c - - -EXTRA_DIST = readme -AM_CPPFLAGS = @AM_CPPFLAGS@ -I$(top_srcdir)/src/include -AM_CFLAGS = $(STATIC) -MAINTAINERCLEANFILES = Makefile.in diff --git a/src/ciderlib/input/bdryset.c b/src/ciderlib/input/bdryset.c deleted file mode 100644 index ff1c80f6a..000000000 --- a/src/ciderlib/input/bdryset.c +++ /dev/null @@ -1,179 +0,0 @@ -/********** -Copyright 1991 Regents of the University of California. All rights reserved. -Author: 1991 David A. Gates, U. C. Berkeley CAD Group -Modified: 2001 Paolo Nenzi -**********/ - -#include "ngspice/ngspice.h" -#include "ngspice/cktdefs.h" -#include "ngspice/bdrydefs.h" -#include "ngspice/meshext.h" -#include "ngspice/gendev.h" -#include "ngspice/sperror.h" - -extern int BDRYcheck( BDRYcard *, DOMNdomain * ); -extern int BDRYsetup( BDRYcard *, MESHcoord *, MESHcoord *, DOMNdomain * ); - - -/* - * Name: BDRYcheck - * Purpose: checks a list of BDRYcards for input errors - * Formals: cardList: the list to check - * Returns: OK/E_PRIVATE - * Users: numerical device setup routines - * Calls: error message handler - */ -int -BDRYcheck(BDRYcard *cardList, DOMNdomain *domnList) -{ - BDRYcard *card; - DOMNdomain *domn; - int cardNum = 0; - int error = OK; - - for ( card = cardList; card != NULL; card = card->BDRYnextCard ) { - cardNum++; - if (card->BDRYxLowGiven && card->BDRYixLowGiven) { - SPfrontEnd->IFerrorf( ERR_INFO, "boundary card %d uses both location and index - location ignored", cardNum ); - card->BDRYxLowGiven = FALSE; - } - if (card->BDRYxHighGiven && card->BDRYixHighGiven) { - SPfrontEnd->IFerrorf( ERR_INFO, "boundary card %d uses both location and index - location ignored", cardNum ); - card->BDRYxHighGiven = FALSE; - } - if (card->BDRYyLowGiven && card->BDRYiyLowGiven) { - SPfrontEnd->IFerrorf( ERR_INFO, "boundary card %d uses both location and index - location ignored", cardNum ); - card->BDRYyLowGiven = FALSE; - } - if (card->BDRYyHighGiven && card->BDRYiyHighGiven) { - SPfrontEnd->IFerrorf( ERR_INFO, "boundary card %d uses both location and index - location ignored", cardNum ); - card->BDRYyHighGiven = FALSE; - } - if (!card->BDRYdomainGiven) { - SPfrontEnd->IFerrorf( ERR_WARNING, "boundary card %d is missing a domain index", cardNum ); - error = E_PRIVATE; - } else { - /* Make sure the domain exists */ - for ( domn = domnList; domn != NULL; domn = domn->next ) { - if ( card->BDRYdomain == domn->id ) { - break; - } - } - if (domn == NULL) { - SPfrontEnd->IFerrorf( ERR_WARNING, "boundary card %d specifies a non-existent domain", cardNum ); - error = E_PRIVATE; - } - } - - if (!card->BDRYneighborGiven) { - card->BDRYneighbor = card->BDRYdomain; - } else { - /* Make sure the neighbor exists */ - for ( domn = domnList; domn != NULL; domn = domn->next ) { - if ( card->BDRYneighbor == domn->id ) { - break; - } - } - if (domn == NULL) { - SPfrontEnd->IFerrorf( ERR_WARNING, "interface card %d specifies a non-existent domain", cardNum ); - error = E_PRIVATE; - } - } - - if (!card->BDRYqfGiven) { - card->BDRYqf = 0.0; - } - if (!card->BDRYsnGiven) { - card->BDRYsn = 0.0; - } - if (!card->BDRYspGiven) { - card->BDRYsp = 0.0; - } - if (!card->BDRYlayerGiven) { - card->BDRYlayer = 0.0; - } - -/* Return now if anything has failed */ - if (error) return(error); - } - return(OK); -} - - - -/* - * Name: BDRYsetup - * Purpose: Checks BDRY cards and then sets the indices - * Formals: cardList: list of cards to setup, returns with indices set - * xMeshList: list of coordinates in the x mesh - * yMeshList: list of coordinates in the y mesh - * Returns: OK/E_PRIVATE - * Users: numerical devices - * Calls: BDRYcheck - */ -int -BDRYsetup(BDRYcard *cardList, MESHcoord *xMeshList, MESHcoord *yMeshList,DOMNdomain *domnList) -{ - BDRYcard *card; - int ixMin, ixMax, iyMin, iyMax; - int cardNum = 0; - int error; - -/* Check the card list */ - if ((error = BDRYcheck( cardList, domnList )) != 0) return( error ); - -/* Find the limits on the indices */ - MESHiBounds( xMeshList, &ixMin, &ixMax ); - MESHiBounds( yMeshList, &iyMin, &iyMax ); - - error = OK; - for ( card = cardList; card != NULL; card = card->BDRYnextCard ) { - cardNum++; - - if (card->BDRYixLowGiven) { - card->BDRYixLow = MAX(card->BDRYixLow, ixMin); - } - else if (card->BDRYxLowGiven) { - card->BDRYixLow = MESHlocate( xMeshList, card->BDRYxLow ); - } - else { - card->BDRYixLow = ixMin; - } - if (card->BDRYixHighGiven) { - card->BDRYixHigh = MIN(card->BDRYixHigh, ixMax); - } - else if (card->BDRYxHighGiven) { - card->BDRYixHigh = MESHlocate( xMeshList, card->BDRYxHigh ); - } - else { - card->BDRYixHigh = ixMax; - } - if (card->BDRYixLow > card->BDRYixHigh) { - SPfrontEnd->IFerrorf( ERR_WARNING, "boundary card %d has low x index (%d) > high x index (%d)", cardNum, card->BDRYixHigh, card->BDRYixLow ); - error = E_PRIVATE; - } - if (card->BDRYiyLowGiven) { - card->BDRYiyLow = MAX(card->BDRYiyLow, iyMin); - } - else if (card->BDRYyLowGiven) { - card->BDRYiyLow = MESHlocate( yMeshList, card->BDRYyLow ); - } - else { - card->BDRYiyLow = iyMin; - } - if (card->BDRYiyHighGiven) { - card->BDRYiyHigh = MIN(card->BDRYiyHigh, iyMax); - } - else if (card->BDRYyHighGiven) { - card->BDRYiyHigh = MESHlocate( yMeshList, card->BDRYyHigh ); - } - else { - card->BDRYiyHigh = iyMax; - } - if (card->BDRYiyLow > card->BDRYiyHigh) { - SPfrontEnd->IFerrorf( ERR_WARNING, "boundary card %d has low y index (%d) > high y index (%d)", cardNum, card->BDRYiyHigh, card->BDRYiyLow ); - error = E_PRIVATE; - } - } - return( error ); -} diff --git a/src/ciderlib/input/boundary.c b/src/ciderlib/input/boundary.c deleted file mode 100644 index d0be8c935..000000000 --- a/src/ciderlib/input/boundary.c +++ /dev/null @@ -1,157 +0,0 @@ -/********** -Copyright 1991 Regents of the University of California. All rights reserved. -Author: 1991 David A. Gates, U. C. Berkeley CAD Group -Modified: 2001 Paolo Nenzi -**********/ - -#include "ngspice/ngspice.h" -#include "ngspice/numcards.h" -#include "ngspice/numgen.h" -#include "ngspice/bdrydefs.h" -#include "ngspice/devdefs.h" -#include "ngspice/sperror.h" -#include "ngspice/suffix.h" - -#define UM_TO_CM 1.0e-4 - -extern int BDRYnewCard(GENcard**,GENmodel*); -extern int BDRYparam(int,IFvalue*,GENcard*); - -IFparm BDRYpTable[] = { - IP("domain", BDRY_DOMAIN, IF_INTEGER, "Primary domain"), - IP("neighbor",BDRY_NEIGHBOR, IF_INTEGER, "Neighboring domain"), - IP("x.low", BDRY_X_LOW, IF_REAL, "Location of left edge"), - IP("x.high", BDRY_X_HIGH, IF_REAL, "Location of right edge"), - IP("y.low", BDRY_Y_LOW, IF_REAL, "Location of top edge"), - IP("y.high", BDRY_Y_HIGH, IF_REAL, "Location of bottom edge"), - IP("ix.low", BDRY_IX_LOW, IF_INTEGER, "Index of left edge"), - IP("ix.high", BDRY_IX_HIGH, IF_INTEGER, "Index of right edge"), - IP("iy.low", BDRY_IY_LOW, IF_INTEGER, "Index of top edge"), - IP("iy.high", BDRY_IY_HIGH, IF_INTEGER, "Index of bottom edge"), - IP("nss", BDRY_QF, IF_REAL, "Fixed charge"), - IP("qss", BDRY_QF, IF_REAL, "Fixed charge"), - IP("qf", BDRY_QF, IF_REAL, "Fixed charge"), - IP("sn", BDRY_SN, IF_REAL, "Electron recomb velocity"), - IP("srvn", BDRY_SN, IF_REAL, "Electron recomb velocity"), - IP("vsrfn", BDRY_SN, IF_REAL, "Electron recomb velocity"), - IP("sp", BDRY_SP, IF_REAL, "Hole recomb velocity"), - IP("srvp", BDRY_SP, IF_REAL, "Hole recomb velocity"), - IP("vsrfp", BDRY_SP, IF_REAL, "Hole recomb velocity"), - IP("layer.width",BDRY_LAYER, IF_REAL, "Width of surface charge layer") -}; - -IFcardInfo BDRYinfo = { - "boundary", - "Specify properties of a domain boundary", - NUMELEMS(BDRYpTable), - BDRYpTable, - - BDRYnewCard, - BDRYparam, - NULL -}; -IFcardInfo INTFinfo = { - "interface", - "Specify properties of an interface between two domains", - NUMELEMS(BDRYpTable), - BDRYpTable, - - BDRYnewCard, - BDRYparam, - NULL -}; - -int -BDRYnewCard(GENcard **inCard, GENmodel *inModel) -{ - BDRYcard *tmpCard, *newCard; - GENnumModel *model = (GENnumModel *)inModel; - - newCard = TMALLOC(BDRYcard, 1); - if (!newCard) { - *inCard = NULL; - return(E_NOMEM); - } - newCard->BDRYnextCard = NULL; - *inCard = (GENcard *) newCard; - - tmpCard = model->GENboundaries; - if (!tmpCard) { /* First in list */ - model->GENboundaries = newCard; - } else { - /* Go to end of list */ - while (tmpCard->BDRYnextCard) tmpCard = tmpCard->BDRYnextCard; - /* And add new card */ - tmpCard->BDRYnextCard = newCard; - } - return(OK); -} - -int -BDRYparam(int param, IFvalue *value, GENcard *inCard) -{ - BDRYcard *card = (BDRYcard *)inCard; - - switch (param) { - case BDRY_DOMAIN: - card->BDRYdomain = value->iValue; - card->BDRYdomainGiven = TRUE; - break; - case BDRY_NEIGHBOR: - card->BDRYneighbor = value->iValue; - card->BDRYneighborGiven = TRUE; - break; - case BDRY_X_LOW: - card->BDRYxLow = value->rValue * UM_TO_CM; - card->BDRYxLowGiven = TRUE; - break; - case BDRY_X_HIGH: - card->BDRYxHigh = value->rValue * UM_TO_CM; - card->BDRYxHighGiven = TRUE; - break; - case BDRY_Y_LOW: - card->BDRYyLow = value->rValue * UM_TO_CM; - card->BDRYyLowGiven = TRUE; - break; - case BDRY_Y_HIGH: - card->BDRYyHigh = value->rValue * UM_TO_CM; - card->BDRYyHighGiven = TRUE; - break; - case BDRY_IX_LOW: - card->BDRYixLow = value->iValue; - card->BDRYixLowGiven = TRUE; - break; - case BDRY_IX_HIGH: - card->BDRYixHigh = value->iValue; - card->BDRYixHighGiven = TRUE; - break; - case BDRY_IY_LOW: - card->BDRYiyLow = value->iValue; - card->BDRYiyLowGiven = TRUE; - break; - case BDRY_IY_HIGH: - card->BDRYiyHigh = value->iValue; - card->BDRYiyHighGiven = TRUE; - break; - case BDRY_QF: - card->BDRYqf = value->rValue; - card->BDRYqfGiven = TRUE; - break; - case BDRY_SN: - card->BDRYsn = value->rValue; - card->BDRYsnGiven = TRUE; - break; - case BDRY_SP: - card->BDRYsp = value->rValue; - card->BDRYspGiven = TRUE; - break; - case BDRY_LAYER: - card->BDRYlayer = value->rValue; - card->BDRYlayerGiven = TRUE; - break; - default: - return(E_BADPARM); - break; - } - return(OK); -} diff --git a/src/ciderlib/input/cards.c b/src/ciderlib/input/cards.c deleted file mode 100644 index b9dc36802..000000000 --- a/src/ciderlib/input/cards.c +++ /dev/null @@ -1,46 +0,0 @@ -/********** -Copyright 1991 Regents of the University of California. All rights reserved. -Author: 1991 David A. Gates, U. C. Berkeley CAD Group -Modified: 2001 Paolo Nenzi -**********/ - -#include "ngspice/ngspice.h" -#include "ngspice/numcards.h" - -extern IFcardInfo CONTinfo; -extern IFcardInfo DOPinfo; -extern IFcardInfo ELCTinfo; -extern IFcardInfo BDRYinfo; -extern IFcardInfo INTFinfo; -extern IFcardInfo XMSHinfo; -extern IFcardInfo YMSHinfo; -extern IFcardInfo METHinfo; -extern IFcardInfo MOBinfo; -extern IFcardInfo MODLinfo; -extern IFcardInfo PHYSinfo; -extern IFcardInfo MATLinfo; -extern IFcardInfo DOMNinfo; -extern IFcardInfo REGNinfo; -extern IFcardInfo OPTNinfo; -extern IFcardInfo OUTPinfo; - -IFcardInfo *INPcardTab[] = { - &CONTinfo, - &DOPinfo, - &ELCTinfo, - &BDRYinfo, - &INTFinfo, - &XMSHinfo, - &YMSHinfo, - &METHinfo, - &MOBinfo, - &MODLinfo, - &PHYSinfo, - &MATLinfo, - &DOMNinfo, - ®Ninfo, - &OPTNinfo, - &OUTPinfo -}; - -int INPnumCards = NUMELEMS(INPcardTab); diff --git a/src/ciderlib/input/contact.c b/src/ciderlib/input/contact.c deleted file mode 100644 index e1a90a342..000000000 --- a/src/ciderlib/input/contact.c +++ /dev/null @@ -1,130 +0,0 @@ -/********** -Copyright 1991 Regents of the University of California. All rights reserved. -Author: 1991 David A. Gates, U. C. Berkeley CAD Group -Modified: 2001 Paolo Nenzi -**********/ - -#include "ngspice/ngspice.h" -#include "ngspice/numcards.h" -#include "ngspice/numgen.h" -#include "ngspice/contdefs.h" -#include "ngspice/devdefs.h" -#include "ngspice/sperror.h" -#include "ngspice/suffix.h" - -extern int CONTnewCard(GENcard**,GENmodel*); -extern int CONTparam(int,IFvalue*,GENcard*); - - -IFparm CONTpTable[] = { - IP("neutral", CONT_NEUTRAL, IF_FLAG, "Charge neutral"), - IP("aluminum", CONT_ALUMINUM, IF_FLAG, "Aluminum contact"), - IP("p.polysilicon", CONT_P_POLY, IF_FLAG, "P poly contact"), - IP("n.polysilicon", CONT_N_POLY, IF_FLAG, "N poly contact"), - IP("workfunction", CONT_WORKFUN, IF_REAL, "Metal work function"), - IP("number", CONT_NUMBER, IF_INTEGER, "Electrode ID number") -}; - -IFcardInfo CONTinfo = { - "contact", - "Properties of a contact to the device", - NUMELEMS(CONTpTable), - CONTpTable, - - CONTnewCard, - CONTparam, - NULL -}; - -int -CONTnewCard(GENcard **inCard, GENmodel *inModel) -{ - CONTcard *tmpCard, *newCard; - GENnumModel *model = (GENnumModel *)inModel; - - newCard = TMALLOC(CONTcard, 1); - if (!newCard) { - *inCard = NULL; - return(E_NOMEM); - } - newCard->CONTnextCard = NULL; - *inCard = (GENcard *) newCard; - - tmpCard = model->GENcontacts; - if (!tmpCard) { /* First in list */ - model->GENcontacts = newCard; - } else { - /* Go to end of list */ - while (tmpCard->CONTnextCard) tmpCard = tmpCard->CONTnextCard; - /* And add new card */ - tmpCard->CONTnextCard = newCard; - } - return(OK); -} - -int -CONTparam(int param, IFvalue *value, GENcard *inCard) -{ - CONTcard *card = (CONTcard *)inCard; - - switch (param) { - case CONT_NEUTRAL: - if ( value->iValue ) { - card->CONTtype = CONT_NEUTRAL; - card->CONTtypeGiven = TRUE; - } else { - if ( card->CONTtype == CONT_NEUTRAL ) { - card->CONTtype = -1; - card->CONTtypeGiven = FALSE; - } - } - break; - case CONT_ALUMINUM: - if ( value->iValue ) { - card->CONTtype = CONT_ALUMINUM; - card->CONTtypeGiven = TRUE; - } else { - if ( card->CONTtype == CONT_ALUMINUM ) { - card->CONTtype = -1; - card->CONTtypeGiven = FALSE; - } - } - break; - case CONT_P_POLY: - if ( value->iValue ) { - card->CONTtype = CONT_P_POLY; - card->CONTtypeGiven = TRUE; - } else { - if ( card->CONTtype == CONT_P_POLY ) { - card->CONTtype = -1; - card->CONTtypeGiven = FALSE; - } - } - break; - case CONT_N_POLY: - if ( value->iValue ) { - card->CONTtype = CONT_N_POLY; - card->CONTtypeGiven = TRUE; - } else { - if ( card->CONTtype == CONT_N_POLY ) { - card->CONTtype = -1; - card->CONTtypeGiven = FALSE; - } - } - break; - case CONT_WORKFUN: - card->CONTtype = CONT_WORKFUN; - card->CONTtypeGiven = TRUE; - card->CONTworkfun = value->rValue; - card->CONTworkfunGiven = TRUE; - break; - case CONT_NUMBER: - card->CONTnumber = value->iValue; - card->CONTnumberGiven = TRUE; - break; - default: - return(E_BADPARM); - break; - } - return(OK); -} diff --git a/src/ciderlib/input/contset.c b/src/ciderlib/input/contset.c deleted file mode 100644 index 43f48008a..000000000 --- a/src/ciderlib/input/contset.c +++ /dev/null @@ -1,83 +0,0 @@ -/********** -Copyright 1991 Regents of the University of California. All rights reserved. -Author: 1991 David A. Gates, U. C. Berkeley CAD Group -Modified: 2001 Paolo Nenzi -**********/ - -#include "ngspice/ngspice.h" -#include "ngspice/cktdefs.h" -#include "ngspice/contdefs.h" -#include "ngspice/meshext.h" -#include "ngspice/gendev.h" -#include "ngspice/sperror.h" -#include "ngspice/suffix.h" - -extern int CONTcheck( CONTcard * ); -extern int CONTsetup( CONTcard *, ELCTelectrode * ); - - -/* - * Name: CONTcheck - * Purpose: checks a list of CONTcards for input errors - * Formals: cardList: the list to check - * Returns: OK/E_PRIVATE - * Users: numerical device setup routines - * Calls: error message handler - */ -int -CONTcheck(CONTcard *cardList) -{ - CONTcard *card; - int cardNum = 0; - int error = OK; - - for ( card = cardList; card != NULL; card = card->CONTnextCard ) { - cardNum++; - if (!card->CONTnumberGiven) { - SPfrontEnd->IFerrorf( ERR_WARNING, "contact card %d is missing an electrode index", cardNum ); - error = E_PRIVATE; - } - -/* Return now if anything has failed */ - if (error) return(error); - } - return(OK); -} - - - -/* - * Name: CONTsetup - * Purpose: copies information from list of CONTcard's to ELCTelectrode's - * Formals: cardList: list of cards to setup - * electrodeList: previously built list of ELCTelectrode's - * Returns: OK/E_PRIVATE - * Users: numerical devices - * Calls: CONTcheck - */ -int -CONTsetup(CONTcard *cardList, ELCTelectrode *electrodeList) -{ - CONTcard *card; - ELCTelectrode *electrode; - int error; - -/* Check the card list */ - if ((error = CONTcheck( cardList )) != 0) return( error ); - - for ( card = cardList; card != NULL; card = card->CONTnextCard ) { - - /* Copy workfunction to all matching electrodes */ - for ( electrode = electrodeList; electrode != NULL; - electrode = electrode->next ) { - if ( card->CONTnumber == electrode->id ) { - if ( card->CONTworkfunGiven ) { - electrode->workf = card->CONTworkfun; - } else { - electrode->workf = 4.10 /* electron volts */; - } - } - } - } - return( OK ); -} diff --git a/src/ciderlib/input/domain.c b/src/ciderlib/input/domain.c deleted file mode 100644 index 6117c437c..000000000 --- a/src/ciderlib/input/domain.c +++ /dev/null @@ -1,133 +0,0 @@ -/********** -Copyright 1991 Regents of the University of California. All rights reserved. -Author: 1991 David A. Gates, U. C. Berkeley CAD Group\ -Modified: 2001 Paolo Nenzi -**********/ - -#include "ngspice/ngspice.h" -#include "ngspice/numcards.h" -#include "ngspice/numgen.h" -#include "ngspice/numenum.h" -#include "ngspice/domndefs.h" -#include "ngspice/devdefs.h" -#include "ngspice/sperror.h" -#include "ngspice/suffix.h" - -#define UM_TO_CM 1.0e-4 - -extern int DOMNnewCard(GENcard**,GENmodel*); -extern int DOMNparam(int,IFvalue*,GENcard*); - - -IFparm DOMNpTable[] = { - IP("x.low", DOMN_X_LOW, IF_REAL, "Location of left edge"), - IP("x.high", DOMN_X_HIGH, IF_REAL, "Location of right edge"), - IP("y.low", DOMN_Y_LOW, IF_REAL, "Location of top edge"), - IP("y.high", DOMN_Y_HIGH, IF_REAL, "Location of bottom edge"), - IP("ix.low", DOMN_IX_LOW, IF_INTEGER, "Index of left edge"), - IP("ix.high", DOMN_IX_HIGH, IF_INTEGER, "Index of right edge"), - IP("iy.low", DOMN_IY_LOW, IF_INTEGER, "Index of top edge"), - IP("iy.high", DOMN_IY_HIGH, IF_INTEGER, "Index of bottom edge"), - IP("number", DOMN_NUMBER, IF_INTEGER, "Domain ID number"), - IP("material",DOMN_MATERIAL, IF_INTEGER, "Material ID number") -}; - -IFcardInfo DOMNinfo = { - "domain", - "Identify material-type for portion of a device", - NUMELEMS(DOMNpTable), - DOMNpTable, - - DOMNnewCard, - DOMNparam, - NULL -}; -IFcardInfo REGNinfo = { - "region", - "Identify material-type for portion of a device", - NUMELEMS(DOMNpTable), - DOMNpTable, - - DOMNnewCard, - DOMNparam, - NULL -}; - -int -DOMNnewCard(GENcard **inCard, GENmodel *inModel) -{ - DOMNcard *tmpCard, *newCard; - GENnumModel *model = (GENnumModel *)inModel; - - newCard = TMALLOC(DOMNcard, 1); - if (!newCard) { - *inCard = NULL; - return(E_NOMEM); - } - newCard->DOMNnextCard = NULL; - *inCard = (GENcard *)newCard; - - tmpCard = model->GENdomains; - if (!tmpCard) { /* First in list */ - model->GENdomains = newCard; - } else { - /* Go to end of list */ - while (tmpCard->DOMNnextCard) tmpCard = tmpCard->DOMNnextCard; - /* And add new card */ - tmpCard->DOMNnextCard = newCard; - } - return(OK); -} - -int -DOMNparam(int param, IFvalue *value, GENcard *inCard) -{ - DOMNcard *card = (DOMNcard *)inCard; - - switch (param) { - case DOMN_X_LOW: - card->DOMNxLow = value->rValue * UM_TO_CM; - card->DOMNxLowGiven = TRUE; - break; - case DOMN_X_HIGH: - card->DOMNxHigh = value->rValue * UM_TO_CM; - card->DOMNxHighGiven = TRUE; - break; - case DOMN_Y_LOW: - card->DOMNyLow = value->rValue * UM_TO_CM; - card->DOMNyLowGiven = TRUE; - break; - case DOMN_Y_HIGH: - card->DOMNyHigh = value->rValue * UM_TO_CM; - card->DOMNyHighGiven = TRUE; - break; - case DOMN_IX_LOW: - card->DOMNixLow = value->iValue; - card->DOMNixLowGiven = TRUE; - break; - case DOMN_IX_HIGH: - card->DOMNixHigh = value->iValue; - card->DOMNixHighGiven = TRUE; - break; - case DOMN_IY_LOW: - card->DOMNiyLow = value->iValue; - card->DOMNiyLowGiven = TRUE; - break; - case DOMN_IY_HIGH: - card->DOMNiyHigh = value->iValue; - card->DOMNiyHighGiven = TRUE; - break; - case DOMN_NUMBER: - card->DOMNnumber = value->iValue; - card->DOMNnumberGiven = TRUE; - break; - case DOMN_MATERIAL: - card->DOMNmaterial = value->iValue; - card->DOMNmaterialGiven = TRUE; - break; - default: - return(E_BADPARM); - break; - } - return(OK); -} diff --git a/src/ciderlib/input/domnset.c b/src/ciderlib/input/domnset.c deleted file mode 100644 index 54032dbc2..000000000 --- a/src/ciderlib/input/domnset.c +++ /dev/null @@ -1,178 +0,0 @@ -/********** -Copyright 1991 Regents of the University of California. All rights reserved. -Author: 1991 David A. Gates, U. C. Berkeley CAD Group -Modifed: 2001 Paolo Nenzi -**********/ - -#include "ngspice/ngspice.h" -#include "ngspice/cktdefs.h" -#include "ngspice/numenum.h" -#include "ngspice/domndefs.h" -#include "ngspice/material.h" -#include "ngspice/meshext.h" -#include "ngspice/gendev.h" -#include "ngspice/sperror.h" -#include "ngspice/suffix.h" - - -extern int DOMNcheck( DOMNcard *, MATLmaterial * ); -extern int DOMNsetup( DOMNcard *, DOMNdomain **, MESHcoord *, MESHcoord *, - MATLmaterial * ); - - -/* - * Name: DOMNcheck - * Purpose: checks a list of DOMNcards for input errors - * Formals: cardList: the list to check - * Returns: OK/E_PRIVATE - * Users: numerical device setup routines - * Calls: error message handler - */ -int -DOMNcheck(DOMNcard *cardList, MaterialInfo *matlList) -{ - DOMNcard *card; - MATLmaterial *matl; - int cardNum = 0; - int error = OK; - - for ( card = cardList; card != NULL; card = card->DOMNnextCard ) { - cardNum++; - if (card->DOMNxLowGiven && card->DOMNixLowGiven) { - SPfrontEnd->IFerrorf( ERR_INFO, "domain card %d uses both location and index - location ignored", cardNum ); - card->DOMNxLowGiven = FALSE; - } - if (card->DOMNxHighGiven && card->DOMNixHighGiven) { - SPfrontEnd->IFerrorf( ERR_INFO, "domain card %d uses both location and index - location ignored", cardNum ); - card->DOMNxHighGiven = FALSE; - } - if (card->DOMNyLowGiven && card->DOMNiyLowGiven) { - SPfrontEnd->IFerrorf( ERR_INFO, "domain card %d uses both location and index - location ignored", cardNum ); - card->DOMNyLowGiven = FALSE; - } - if (card->DOMNyHighGiven && card->DOMNiyHighGiven) { - SPfrontEnd->IFerrorf( ERR_INFO, "domain card %d uses both location and index - location ignored", cardNum ); - card->DOMNyHighGiven = FALSE; - } - if (!card->DOMNmaterialGiven) { - SPfrontEnd->IFerrorf( ERR_WARNING, "domain card %d is missing a material index", cardNum ); - error = E_PRIVATE; - } else { - /* Make sure the material exists */ - for ( matl = matlList; matl != NULL; matl = matl->next ) { - if ( card->DOMNmaterial == matl->id ) { - break; - } - } - if (matl == NULL) { - SPfrontEnd->IFerrorf( ERR_WARNING, "domain card %d specifies a non-existent material", cardNum ); - error = E_PRIVATE; - } - } - if (!card->DOMNnumberGiven) { - SPfrontEnd->IFerrorf( ERR_WARNING, "domain card %d is missing an ID number", cardNum ); - error = E_PRIVATE; - } - -/* Return now if anything has failed */ - if (error) return(error); - } - return(OK); -} - - - -/* - * Name: DOMNsetup - * Purpose: convert a list of DOMNcard's to DOMNdomain's - * Formals: cardList: list of cards to setup - * domainList: returns the list of DOMNdomain's - * xMeshList: list of coordinates in the x mesh - * yMeshList: list of coordinates in the y mesh - * Returns: OK/E_PRIVATE - * Users: numerical devices - * Calls: DOMNcheck - */ -int -DOMNsetup(DOMNcard *cardList, DOMNdomain **domainList, MESHcoord *xMeshList, - MESHcoord *yMeshList, MaterialInfo *materialList) -{ - DOMNcard *card; - DOMNdomain *newDomain = NULL; - int ixMin, ixMax, iyMin, iyMax; - int cardNum = 0; - int error; - -/* Initialize list of domains */ - *domainList = NULL; - -/* Check the card list */ - if ((error = DOMNcheck( cardList, materialList )) != 0) return( error ); - -/* Find the limits on the indices */ - MESHiBounds( xMeshList, &ixMin, &ixMax ); - MESHiBounds( yMeshList, &iyMin, &iyMax ); - - error = OK; - for ( card = cardList; card != NULL; card = card->DOMNnextCard ) { - cardNum++; - - if (*domainList == NULL) { - RALLOC( newDomain, DOMNdomain, 1 ); - *domainList = newDomain; - } else { - RALLOC( newDomain->next, DOMNdomain, 1 ); - newDomain = newDomain->next; - } - - newDomain->id = card->DOMNnumber; - newDomain->material = card->DOMNmaterial; - newDomain->next = NULL; - - if (card->DOMNixLowGiven) { - newDomain->ixLo = MAX(card->DOMNixLow, ixMin); - } - else if (card->DOMNxLowGiven) { - newDomain->ixLo = MESHlocate( xMeshList, card->DOMNxLow ); - } - else { - newDomain->ixLo = ixMin; - } - if (card->DOMNixHighGiven) { - newDomain->ixHi = MIN(card->DOMNixHigh, ixMax); - } - else if (card->DOMNxHighGiven) { - newDomain->ixHi = MESHlocate( xMeshList, card->DOMNxHigh ); - } - else { - newDomain->ixHi = ixMax; - } - if (newDomain->ixLo > newDomain->ixHi) { - SPfrontEnd->IFerrorf( ERR_WARNING, "domain card %d has low x index (%d) > high x index (%d)", cardNum, newDomain->ixLo, newDomain->ixHi ); - error = E_PRIVATE; - } - if (card->DOMNiyLowGiven) { - newDomain->iyLo = MAX(card->DOMNiyLow, iyMin); - } - else if (card->DOMNyLowGiven) { - newDomain->iyLo = MESHlocate( yMeshList, card->DOMNyLow ); - } - else { - newDomain->iyLo = iyMin; - } - if (card->DOMNiyHighGiven) { - newDomain->iyHi = MIN(card->DOMNiyHigh, iyMax); - } - else if (card->DOMNyHighGiven) { - newDomain->iyHi = MESHlocate( yMeshList, card->DOMNyHigh ); - } - else { - newDomain->iyHi = iyMax; - } - if (newDomain->iyLo > newDomain->iyHi) { - SPfrontEnd->IFerrorf( ERR_WARNING, "domain card %d has low y index (%d) > high y index (%d)", cardNum, newDomain->iyLo, newDomain->iyHi ); - error = E_PRIVATE; - } - } - return( error ); -} diff --git a/src/ciderlib/input/doping.c b/src/ciderlib/input/doping.c deleted file mode 100644 index b512ef7eb..000000000 --- a/src/ciderlib/input/doping.c +++ /dev/null @@ -1,286 +0,0 @@ -/********** -Copyright 1991 Regents of the University of California. All rights reserved. -Author: 1991 David A. Gates, U. C. Berkeley CAD Group -Modified: 2001 Paolo Nenzi -**********/ - -#include "ngspice/ngspice.h" -#include "ngspice/numcards.h" -#include "ngspice/numgen.h" -#include "ngspice/dopdefs.h" -#include "ngspice/devdefs.h" -#include "ngspice/sperror.h" -#include "ngspice/suffix.h" - -#define UM_TO_CM 1.0e-4 - -extern int DOPnewCard(GENcard**,GENmodel*); -extern int DOPparam(int,IFvalue*,GENcard*); - - -IFparm DOPpTable[] = { - IP("domains", DOP_DOMAIN, IF_INTVEC, "Domain(s) to dope"), - IP("uniform", DOP_UNIF, IF_FLAG, "Uniform doping"), - IP("linear", DOP_LINEAR, IF_FLAG, "Linear graded doping"), - IP("gaussian",DOP_GAUSS, IF_FLAG, "Gaussian doping"), - IP("gdiff", DOP_GAUSS, IF_FLAG, "Gaussian diffusion"), - IP("gimp", DOP_GAUSS, IF_FLAG, "Gaussian implantation"), - IP("erfc", DOP_ERFC, IF_FLAG, "Error-function doping"), - IP("errfc", DOP_ERFC, IF_FLAG, "Error-function doping"), - IP("exponential",DOP_EXP, IF_FLAG, "Exponential doping"), - IP("suprem3", DOP_SUPREM3, IF_FLAG, "Suprem3 doping"), - IP("ascii", DOP_ASCII, IF_FLAG, "Ascii-input doping"), - IP("infile", DOP_INFILE, IF_STRING, "Input-file name"), - IP("lat.rotate",DOP_ROTATE_LAT,IF_FLAG, "Rotate principal profile"), - IP("lat.unif",DOP_UNIF_LAT, IF_FLAG, "Uniform lateral falloff"), - IP("lat.linf",DOP_LINEAR_LAT, IF_FLAG, "Linear lateral falloff"), - IP("lat.gauss",DOP_GAUSS_LAT, IF_FLAG, "Gaussian lateral falloff"), - IP("lat.erfc",DOP_ERFC_LAT, IF_FLAG, "Erfc lateral falloff"), - IP("lat.exp", DOP_EXP_LAT, IF_FLAG, "Exponential lateral falloff"), - IP("boron", DOP_BORON, IF_FLAG, "Boron impurities"), - IP("phosphorus",DOP_PHOSP, IF_FLAG, "Phosphorus impurities"), - IP("arsenic", DOP_ARSEN, IF_FLAG, "Arsenic impurities"), - IP("antimony",DOP_ANTIM, IF_FLAG, "Antimony impurities"), - IP("p.type", DOP_P_TYPE, IF_FLAG, "P-type impurities"), - IP("acceptor",DOP_P_TYPE, IF_FLAG, "Acceptor impurities"), - IP("n.type", DOP_N_TYPE, IF_FLAG, "N-type impurities"), - IP("donor", DOP_N_TYPE, IF_FLAG, "Donor impurities"), - IP("x.axis", DOP_X_AXIS, IF_FLAG, "X principal axis"), - IP("y.axis", DOP_Y_AXIS, IF_FLAG, "Y principal axis"), - IP("x.low", DOP_X_LOW, IF_REAL, "Low X edge"), - IP("x.high", DOP_X_HIGH, IF_REAL, "High X edge"), - IP("y.low", DOP_Y_LOW, IF_REAL, "Low Y edge"), - IP("y.high", DOP_Y_HIGH, IF_REAL, "High Y edge"), - IP("conc", DOP_CONC, IF_REAL, "Concentration"), - IP("peak.conc",DOP_CONC, IF_REAL, "Peak concentration"), - IP("location",DOP_LOCATION, IF_REAL, "Peak location"), - IP("range", DOP_LOCATION, IF_REAL, "Peak location"), - IP("char.length",DOP_CHAR_LEN,IF_REAL, "Characteristic length"), - IP("ratio.lat",DOP_RATIO_LAT, IF_REAL, "Lateral ratio") -}; - -IFcardInfo DOPinfo = { - "doping", - "Add dopant to domains of a device", - NUMELEMS(DOPpTable), - DOPpTable, - - DOPnewCard, - DOPparam, - NULL -}; - -int -DOPnewCard(GENcard **inCard, GENmodel *inModel) -{ - DOPcard *tmpCard, *newCard; - GENnumModel *model = (GENnumModel *)inModel; - - newCard = TMALLOC(DOPcard, 1); - if (!newCard) { - *inCard = NULL; - return(E_NOMEM); - } - newCard->DOPnextCard = NULL; - *inCard = (GENcard *) newCard; - - tmpCard = model->GENdopings; - if (!tmpCard) { /* First in list */ - model->GENdopings = newCard; - } else { - /* Go to end of list */ - while (tmpCard->DOPnextCard) tmpCard = tmpCard->DOPnextCard; - /* And add new card */ - tmpCard->DOPnextCard = newCard; - } - return(OK); -} - - -int -DOPparam(int param, IFvalue *value, GENcard *inCard) -{ - int i; - DOPcard *card = (DOPcard *)inCard; - - switch (param) { - case DOP_DOMAIN: - if ( !card->DOPdomainsGiven ) { - card->DOPnumDomains = value->v.numValue; - card->DOPdomains = TMALLOC(int, value->v.numValue); - for ( i=0; i < card->DOPnumDomains; i++ ) { - card->DOPdomains[i] = value->v.vec.iVec[i]; - } - card->DOPdomainsGiven = TRUE; - } /* else: do nothing, can only define domains once */ - break; - case DOP_ROTATE_LAT: - card->DOProtateLat = TRUE; - card->DOProtateLatGiven = TRUE; - break; - case DOP_UNIF: - if ( !card->DOPprofileTypeGiven ) { - card->DOPprofileType = DOP_UNIF; - card->DOPprofileTypeGiven = TRUE; - } - break; - case DOP_UNIF_LAT: - if ( !card->DOPlatProfileTypeGiven ) { - card->DOPlatProfileType = DOP_UNIF; - card->DOPlatProfileTypeGiven = TRUE; - } - break; - case DOP_LINEAR: - if ( !card->DOPprofileTypeGiven ) { - card->DOPprofileType = DOP_LINEAR; - card->DOPprofileTypeGiven = TRUE; - } - break; - case DOP_LINEAR_LAT: - if ( !card->DOPlatProfileTypeGiven ) { - card->DOPlatProfileType = DOP_LINEAR_LAT; - card->DOPlatProfileTypeGiven = TRUE; - } - break; - case DOP_GAUSS: - if ( !card->DOPprofileTypeGiven ) { - card->DOPprofileType = DOP_GAUSS; - card->DOPprofileTypeGiven = TRUE; - } - break; - case DOP_GAUSS_LAT: - if ( !card->DOPlatProfileTypeGiven ) { - card->DOPlatProfileType = DOP_GAUSS; - card->DOPlatProfileTypeGiven = TRUE; - } - break; - case DOP_ERFC: - if ( !card->DOPprofileTypeGiven ) { - card->DOPprofileType = DOP_ERFC; - card->DOPprofileTypeGiven = TRUE; - } - break; - case DOP_ERFC_LAT: - if ( !card->DOPlatProfileTypeGiven ) { - card->DOPlatProfileType = DOP_ERFC; - card->DOPlatProfileTypeGiven = TRUE; - } - break; - case DOP_EXP: - if ( !card->DOPprofileTypeGiven ) { - card->DOPprofileType = DOP_EXP; - card->DOPprofileTypeGiven = TRUE; - } - break; - case DOP_EXP_LAT: - if ( !card->DOPlatProfileTypeGiven ) { - card->DOPlatProfileType = DOP_EXP; - card->DOPlatProfileTypeGiven = TRUE; - } - break; - case DOP_SUPREM3: - if ( !card->DOPprofileTypeGiven ) { - card->DOPprofileType = DOP_SUPREM3; - card->DOPprofileTypeGiven = TRUE; - } else if ( card->DOPprofileType == DOP_ASCII ) { - card->DOPprofileType = DOP_SUPASCII; - } - break; - case DOP_ASCII: - if ( !card->DOPprofileTypeGiven ) { - card->DOPprofileType = DOP_ASCII; - card->DOPprofileTypeGiven = TRUE; - } else if ( card->DOPprofileType == DOP_SUPREM3 ) { - card->DOPprofileType = DOP_SUPASCII; - } - break; - case DOP_BORON: - if ( !card->DOPimpurityTypeGiven ) { - card->DOPimpurityType = DOP_BORON; - card->DOPimpurityTypeGiven = TRUE; - } - break; - case DOP_PHOSP: - if ( !card->DOPimpurityTypeGiven ) { - card->DOPimpurityType = DOP_PHOSP; - card->DOPimpurityTypeGiven = TRUE; - } - break; - case DOP_ARSEN: - if ( !card->DOPimpurityTypeGiven ) { - card->DOPimpurityType = DOP_ARSEN; - card->DOPimpurityTypeGiven = TRUE; - } - break; - case DOP_ANTIM: - if ( !card->DOPimpurityTypeGiven ) { - card->DOPimpurityType = DOP_ANTIM; - card->DOPimpurityTypeGiven = TRUE; - } - break; - case DOP_P_TYPE: - if ( !card->DOPimpurityTypeGiven ) { - card->DOPimpurityType = DOP_P_TYPE; - card->DOPimpurityTypeGiven = TRUE; - } - break; - case DOP_N_TYPE: - if ( !card->DOPimpurityTypeGiven ) { - card->DOPimpurityType = DOP_N_TYPE; - card->DOPimpurityTypeGiven = TRUE; - } - break; - case DOP_X_AXIS: - if ( !card->DOPaxisTypeGiven ) { - card->DOPaxisType = DOP_X_AXIS; - card->DOPaxisTypeGiven = TRUE; - } - break; - case DOP_Y_AXIS: - if ( !card->DOPaxisTypeGiven ) { - card->DOPaxisType = DOP_Y_AXIS; - card->DOPaxisTypeGiven = TRUE; - } - break; - case DOP_INFILE: - card->DOPinFile = value->sValue; - card->DOPinFileGiven = TRUE; - break; - case DOP_X_LOW: - card->DOPxLow = value->rValue * UM_TO_CM; - card->DOPxLowGiven = TRUE; - break; - case DOP_X_HIGH: - card->DOPxHigh = value->rValue * UM_TO_CM; - card->DOPxHighGiven = TRUE; - break; - case DOP_Y_LOW: - card->DOPyLow = value->rValue * UM_TO_CM; - card->DOPyLowGiven = TRUE; - break; - case DOP_Y_HIGH: - card->DOPyHigh = value->rValue * UM_TO_CM; - card->DOPyHighGiven = TRUE; - break; - case DOP_CONC: - card->DOPconc = fabs(value->rValue); - card->DOPconcGiven = TRUE; - break; - case DOP_LOCATION: - card->DOPlocation = value->rValue * UM_TO_CM; - card->DOPlocationGiven = TRUE; - break; - case DOP_CHAR_LEN: - card->DOPcharLen = value->rValue * UM_TO_CM; - card->DOPcharLenGiven = TRUE; - break; - case DOP_RATIO_LAT: - card->DOPratioLat = value->rValue; - card->DOPratioLatGiven = TRUE; - break; - default: - return(E_BADPARM); - break; - } - return(OK); -} diff --git a/src/ciderlib/input/dopset.c b/src/ciderlib/input/dopset.c deleted file mode 100644 index ad69fe23e..000000000 --- a/src/ciderlib/input/dopset.c +++ /dev/null @@ -1,378 +0,0 @@ -/********** -Copyright 1991 Regents of the University of California. All rights reserved. -Author: 1991 David A. Gates, U. C. Berkeley CAD Group -Modifed: 2001 Paolo Nenzi -**********/ - -#include "ngspice/carddefs.h" -#include "ngspice/cidersupt.h" -#include "ngspice/cktdefs.h" -#include "ngspice/ciderinp.h" -#include "ngspice/cpextern.h" -#include "ngspice/dopdefs.h" -#include "ngspice/meshext.h" -#include "ngspice/ngspice.h" -#include "ngspice/numenum.h" -#include "ngspice/profile.h" -#include "ngspice/gendev.h" -#include "ngspice/sperror.h" -#include "ngspice/suffix.h" - - -/* - * Name: DOPcheck - * Purpose: checks a list of DOPcards for input errors - * Formals: cardList: the list to check - * Returns: OK/E_PRIVATE - * Users: numerical device setup routines - * Calls: error message handler - */ -int -DOPcheck(DOPcard *cardList, MESHcoord *xMeshList, MESHcoord *yMeshList) -{ - DOPcard *card; - int cardNum = 0; - int error = OK; - - for ( card = cardList; card != NULL; card = card->DOPnextCard ) { - cardNum++; - if (!card->DOPdomainsGiven) { - card->DOPnumDomains = 0; - card->DOPdomains = NULL; - } - if (!card->DOPprofileTypeGiven) { - SPfrontEnd->IFerrorf( ERR_WARNING, "doping card %d does not specify profile type", cardNum ); - error = E_PRIVATE; - } else switch (card->DOPprofileType) { - case DOP_UNIF: - if (!card->DOPconcGiven) { - SPfrontEnd->IFerrorf( ERR_WARNING, "doping card %d needs conc of uniform distribution", cardNum ); - error = E_PRIVATE; - } - break; - case DOP_LINEAR: - if (!card->DOPconcGiven) { - SPfrontEnd->IFerrorf( ERR_WARNING, "doping card %d needs peak conc of linear distribution", cardNum ); - error = E_PRIVATE; - } - break; - case DOP_GAUSS: - if (!card->DOPconcGiven) { - SPfrontEnd->IFerrorf( ERR_WARNING, "doping card %d needs peak conc of gaussian distribution", cardNum ); - error = E_PRIVATE; - } - break; - case DOP_ERFC: - if (!card->DOPconcGiven) { - SPfrontEnd->IFerrorf( ERR_WARNING, "doping card %d needs peak conc of error-function distribution", cardNum ); - error = E_PRIVATE; - } - break; - case DOP_EXP: - if (!card->DOPconcGiven) { - SPfrontEnd->IFerrorf( ERR_WARNING, "doping card %d needs peak conc of exponential distribution", cardNum ); - error = E_PRIVATE; - } - break; - case DOP_SUPREM3: - case DOP_SUPASCII: - if (!card->DOPinFileGiven) { - SPfrontEnd->IFerrorf( ERR_WARNING, "doping card %d needs input-file name of suprem3 data", cardNum ); - error = E_PRIVATE; - } - break; - case DOP_ASCII: - if (!card->DOPinFileGiven) { - SPfrontEnd->IFerrorf( ERR_WARNING, "doping card %d needs input-file name of ascii data", cardNum ); - error = E_PRIVATE; - } - break; - default: - SPfrontEnd->IFerrorf( ERR_FATAL, "doping card %d has unrecognized profile type", cardNum ); - error = E_NOTFOUND; - break; - } - if (!card->DOProtateLatGiven) { - card->DOProtateLat = FALSE; - } - if (!card->DOPlatProfileTypeGiven || card->DOProtateLat) { - card->DOPlatProfileType = card->DOPprofileType; - } - if (!card->DOPratioLatGiven) { - card->DOPratioLat = 1.0; - } - if (!card->DOPcharLenGiven) { - card->DOPcharLen = 1.0e-4; /* 1um in centimeters */ - } - if (!card->DOPlocationGiven) { - card->DOPlocation = 0.0; - } - if (!card->DOPimpurityTypeGiven) { - card->DOPimpurityType = IMP_N_TYPE; - } else switch (card->DOPimpurityType) { - case DOP_BORON: - card->DOPimpurityType = IMP_BORON; - break; - case DOP_PHOSP: - card->DOPimpurityType = IMP_PHOSPHORUS; - break; - case DOP_ARSEN: - card->DOPimpurityType = IMP_ARSENIC; - break; - case DOP_ANTIM: - card->DOPimpurityType = IMP_ANTIMONY; - break; - case DOP_N_TYPE: - card->DOPimpurityType = IMP_N_TYPE; - break; - case DOP_P_TYPE: - card->DOPimpurityType = IMP_P_TYPE; - break; - default: - break; - } - - if (!card->DOPaxisTypeGiven) { - if ( xMeshList && yMeshList ) { /* both lists are non-empty */ - card->DOPaxisType = DOP_Y_AXIS; - } else if ( xMeshList ) { /* x-mesh list is non-empty */ - card->DOPaxisType = DOP_X_AXIS; - } else if ( yMeshList ) { /* y-mesh list is non-empty */ - card->DOPaxisType = DOP_Y_AXIS; - } - } - -/* Return now if anything has failed */ - if (error) return(error); - } - return(OK); -} - - - -/* - * Name: DOPsetup - * Purpose: convert a list of DOPcard's to DOPprofile's - * Formals: cardList: list of cards to setup - * profileList: returns the list of DOPprofile's - * xMeshList: list of coordinates in the x mesh - * yMeshList: list of coordinates in the y mesh - * Returns: OK/E_PRIVATE - * Users: numerical devices - * Calls: DOPcheck - */ -int -DOPsetup(DOPcard *cardList, DOPprofile **profileList, DOPtable **tableList, - MESHcoord *xMeshList, MESHcoord *yMeshList) -{ - DOPcard *card; - DOPprofile *newProfile = NULL, *endProfile; - int impurityId = 0; - double xMin, xMax, yMin, yMax; - double sign; - int error, xProfUnif, yProfUnif; - -/* Initialize list of profiles */ - *profileList = endProfile = NULL; - -/* Check the card list */ - if ((error = DOPcheck( cardList, xMeshList, yMeshList )) != 0) return( error ); - -/* Find the limits on locations */ - MESHlBounds( xMeshList, &xMin, &xMax ); - MESHlBounds( yMeshList, &yMin, &yMax ); - - for ( card = cardList; card != NULL; card = card->DOPnextCard ) { - - if (*profileList == NULL) { - RALLOC( newProfile, DOPprofile, 1 ); - *profileList = newProfile; - } - else { - RALLOC( newProfile->next, DOPprofile, 1 ); - newProfile = newProfile->next; - } - newProfile->next = NULL; - - newProfile->numDomains = card->DOPnumDomains; - if ( newProfile->numDomains > 0 ) { - int i; - RALLOC( newProfile->domains, int, newProfile->numDomains ); - for ( i=0; i < newProfile->numDomains; i++ ) { - newProfile->domains[i] = card->DOPdomains[i]; - } - } - else { - newProfile->domains = NULL; - } - - if ( card->DOPimpurityType == IMP_P_TYPE ) { - sign = -1.0; - } - else { - sign = 1.0; - } - switch( card->DOPprofileType ) { - case DOP_UNIF: - newProfile->type = UNIF; - newProfile->CONC = sign * card->DOPconc; - break; - case DOP_LINEAR: - newProfile->type = LIN; - newProfile->CONC = sign * card->DOPconc; - break; - case DOP_GAUSS: - newProfile->type = GAUSS; - newProfile->CONC = sign * card->DOPconc; - break; - case DOP_ERFC: - newProfile->type = ERRFC; - newProfile->CONC = sign * card->DOPconc; - break; - case DOP_EXP: - newProfile->type = EXP; - newProfile->CONC = sign * card->DOPconc; - break; - case DOP_SUPREM3: - newProfile->type = LOOKUP; - if (readSupremData( card->DOPinFile, 0, card->DOPimpurityType, - tableList) != 0) { - (void) fprintf(cp_err, "Doping setup failed.\n"); - return -1; - } - newProfile->IMPID = ++impurityId; - break; - case DOP_SUPASCII: - newProfile->type = LOOKUP; - if (readSupremData( card->DOPinFile, 1, card->DOPimpurityType, - tableList) != 0) { - (void) fprintf(cp_err, "Doping setup failed.\n"); - return -1; - } - newProfile->IMPID = ++impurityId; - break; - case DOP_ASCII: - newProfile->type = LOOKUP; - if (readAsciiData(card->DOPinFile, card->DOPimpurityType, - tableList) != 0) { - (void) fprintf(cp_err, "Doping setup failed.\n"); - return -1; - } - newProfile->IMPID = ++impurityId; - break; - default: - break; - } - switch( card->DOPlatProfileType ) { - case DOP_UNIF: - newProfile->latType = UNIF; - break; - case DOP_LINEAR: - newProfile->latType = LIN; - break; - case DOP_GAUSS: - newProfile->latType = GAUSS; - break; - case DOP_ERFC: - newProfile->latType = ERRFC; - break; - case DOP_EXP: - newProfile->latType = EXP; - break; - case DOP_SUPREM3: - case DOP_SUPASCII: - newProfile->latType = LOOKUP; - break; - case DOP_ASCII: - newProfile->latType = LOOKUP; - break; - default: - break; - } - newProfile->rotate = card->DOProtateLat; - newProfile->LOCATION = card->DOPlocation; - newProfile->CHAR_LENGTH = card->DOPcharLen; - newProfile->LAT_RATIO = card->DOPratioLat; - - xProfUnif = yProfUnif = FALSE; - if (card->DOPaxisType == DOP_X_AXIS) { - newProfile->DIRECTION = X; - if (newProfile->type == UNIF) xProfUnif = TRUE; - if (newProfile->latType == UNIF) yProfUnif = TRUE; - } - else { - newProfile->DIRECTION = Y; - if (newProfile->type == UNIF) yProfUnif = TRUE; - if (newProfile->latType == UNIF) xProfUnif = TRUE; - } - -/* Fill in x coordinates. Use defaults if necessary */ - if (card->DOPxLowGiven && card->DOPxHighGiven) { - newProfile->X_LOW = card->DOPxLow; - newProfile->X_HIGH = card->DOPxHigh; - } - else if (card->DOPxLowGiven) { - newProfile->X_LOW = card->DOPxLow; - if (xProfUnif) { - newProfile->X_HIGH = xMax; - } - else { - newProfile->X_HIGH = newProfile->X_LOW; - } - } - else if (card->DOPxHighGiven) { - newProfile->X_HIGH = card->DOPxHigh; - if (xProfUnif) { - newProfile->X_LOW = xMin; - } - else { - newProfile->X_LOW = newProfile->X_HIGH; - } - } - else { - if (xProfUnif) { - newProfile->X_LOW = xMin; - newProfile->X_HIGH = xMax; - } - else { - newProfile->X_LOW = 0.5 * (xMin + xMax); - newProfile->X_HIGH = 0.5 * (xMin + xMax); - } - } - -/* Fill in y coordinates. Use defaults if necessary */ - if (card->DOPyLowGiven && card->DOPyHighGiven) { - newProfile->Y_LOW = card->DOPyLow; - newProfile->Y_HIGH = card->DOPyHigh; - } - else if (card->DOPyLowGiven) { - newProfile->Y_LOW = card->DOPyLow; - if (yProfUnif) { - newProfile->Y_HIGH = yMax; - } - else { - newProfile->Y_HIGH = newProfile->Y_LOW; - } - } - else if (card->DOPyHighGiven) { - newProfile->Y_HIGH = card->DOPyHigh; - if (xProfUnif) { - newProfile->Y_LOW = yMin; - } - else { - newProfile->Y_LOW = newProfile->Y_HIGH; - } - } - else { - if (yProfUnif) { - newProfile->Y_LOW = yMin; - newProfile->Y_HIGH = yMax; - } - else { - newProfile->Y_LOW = 0.5 * (yMin + yMax); - newProfile->Y_HIGH = 0.5 * (yMin + yMax); - } - } - } - return( OK ); -} diff --git a/src/ciderlib/input/elctset.c b/src/ciderlib/input/elctset.c deleted file mode 100644 index 65ce46330..000000000 --- a/src/ciderlib/input/elctset.c +++ /dev/null @@ -1,157 +0,0 @@ -/********** -Copyright 1991 Regents of the University of California. All rights reserved. -Author: 1991 David A. Gates, U. C. Berkeley CAD Group -Modified: 2001 Paolo Nenzi -**********/ - -#include "ngspice/ngspice.h" -#include "ngspice/cktdefs.h" -#include "ngspice/elctdefs.h" -#include "ngspice/meshext.h" -#include "ngspice/twomesh.h" -#include "ngspice/gendev.h" -#include "ngspice/sperror.h" -#include "ngspice/suffix.h" - - -extern int ELCTcheck( ELCTcard * ); -extern int ELCTsetup( ELCTcard *, ELCTelectrode **, MESHcoord *, MESHcoord * ); - - -/* - * Name: ELCTcheck - * Purpose: checks a list of ELCTcards for input errors - * Formals: cardList: the list to check - * Returns: OK/E_PRIVATE - * Users: numerical device setup routines - * Calls: error message handler - */ -int -ELCTcheck(ELCTcard *cardList) -{ - ELCTcard *card; - int cardNum = 0; - int error = OK; - - for ( card = cardList; card != NULL; card = card->ELCTnextCard ) { - cardNum++; - if (card->ELCTxLowGiven && card->ELCTixLowGiven) { - SPfrontEnd->IFerrorf( ERR_INFO, "electrode card %d uses both location and index - location ignored", cardNum ); - card->ELCTxLowGiven = FALSE; - } - if (card->ELCTxHighGiven && card->ELCTixHighGiven) { - SPfrontEnd->IFerrorf( ERR_INFO, "electrode card %d uses both location and index - location ignored", cardNum ); - card->ELCTxHighGiven = FALSE; - } - if (card->ELCTyLowGiven && card->ELCTiyLowGiven) { - SPfrontEnd->IFerrorf( ERR_INFO, "electrode card %d uses both location and index - location ignored", cardNum ); - card->ELCTyLowGiven = FALSE; - } - if (card->ELCTyHighGiven && card->ELCTiyHighGiven) { - SPfrontEnd->IFerrorf( ERR_INFO, "electrode card %d uses both location and index - location ignored", cardNum ); - card->ELCTyHighGiven = FALSE; - } - if (!card->ELCTnumberGiven) { - card->ELCTnumber = -1; - } - -/* Return now if anything has failed */ - if (error) return(error); - } - return(OK); -} - - -/* - * Name: ELCTsetup - * Purpose: convert a list of ELCTcard's to ELCTelectrode's - * Formals: cardList: list of cards to setup - * electrodeList: returns the list of ELCTelectrode's - * xMeshList: list of coordinates in the x mesh - * yMeshList: list of coordinates in the y mesh - * Returns: OK/E_PRIVATE - * Users: numerical devices - * Calls: ELCTcheck - */ -int -ELCTsetup(ELCTcard *cardList, ELCTelectrode **electrodeList, - MESHcoord *xMeshList, MESHcoord *yMeshList) -{ - ELCTcard *card; - ELCTelectrode *newElectrode = NULL; - int ixMin, ixMax, iyMin, iyMax; - int cardNum = 0; - int error; - -/* Initialize list of electrodes */ - *electrodeList = NULL; - -/* Check the card list */ - if ((error = ELCTcheck( cardList )) != 0) return( error ); - -/* Find the limits on the indices */ - MESHiBounds( xMeshList, &ixMin, &ixMax ); - MESHiBounds( yMeshList, &iyMin, &iyMax ); - - error = OK; - for ( card = cardList; card != NULL; card = card->ELCTnextCard ) { - cardNum++; - - if (*electrodeList == NULL) { - RALLOC( newElectrode, ELCTelectrode, 1 ); - *electrodeList = newElectrode; - } else { - RALLOC( newElectrode->next, ELCTelectrode, 1 ); - newElectrode = newElectrode->next; - } - newElectrode->next = NULL; - newElectrode->id = card->ELCTnumber; - newElectrode->workf = 4.10 /* electron volts */; - - if (card->ELCTixLowGiven) { - newElectrode->ixLo = MAX(card->ELCTixLow, ixMin); - } - else if (card->ELCTxLowGiven) { - newElectrode->ixLo = MESHlocate( xMeshList, card->ELCTxLow ); - } - else { - newElectrode->ixLo = ixMin; - } - if (card->ELCTixHighGiven) { - newElectrode->ixHi = MIN(card->ELCTixHigh, ixMax); - } - else if (card->ELCTxHighGiven) { - newElectrode->ixHi = MESHlocate( xMeshList, card->ELCTxHigh ); - } - else { - newElectrode->ixHi = ixMax; - } - if (newElectrode->ixLo > newElectrode->ixHi) { - SPfrontEnd->IFerrorf( ERR_WARNING, "electrode card %d has low x index (%d) > high x index (%d)", cardNum, newElectrode->ixLo, newElectrode->ixHi ); - error = E_PRIVATE; - } - if (card->ELCTiyLowGiven) { - newElectrode->iyLo = MAX(card->ELCTiyLow, iyMin); - } - else if (card->ELCTyLowGiven) { - newElectrode->iyLo = MESHlocate( yMeshList, card->ELCTyLow ); - } - else { - newElectrode->iyLo = iyMin; - } - if (card->ELCTiyHighGiven) { - newElectrode->iyHi = MIN(card->ELCTiyHigh, iyMax); - } - else if (card->ELCTyHighGiven) { - newElectrode->iyHi = MESHlocate( yMeshList, card->ELCTyHigh ); - } - else { - newElectrode->iyHi = iyMax; - } - if (newElectrode->iyLo > newElectrode->iyHi) { - SPfrontEnd->IFerrorf( ERR_WARNING, "electrode card %d has low y index (%d) > high y index (%d)", cardNum, newElectrode->iyLo, newElectrode->iyHi ); - error = E_PRIVATE; - } - } - return( error ); -} diff --git a/src/ciderlib/input/electrod.c b/src/ciderlib/input/electrod.c deleted file mode 100644 index cd88b28f4..000000000 --- a/src/ciderlib/input/electrod.c +++ /dev/null @@ -1,118 +0,0 @@ -/********** -Copyright 1991 Regents of the University of California. All rights reserved. -Author: 1991 David A. Gates, U. C. Berkeley CAD Group -Modified: 2001 Paolo Nenzi -**********/ - -#include "ngspice/ngspice.h" -#include "ngspice/numcards.h" -#include "ngspice/numgen.h" -#include "ngspice/elctdefs.h" -#include "ngspice/devdefs.h" -#include "ngspice/sperror.h" -#include "ngspice/suffix.h" - -#define UM_TO_CM 1.0e-4 - -extern int ELCTnewCard(GENcard**,GENmodel*); -extern int ELCTparam(int,IFvalue*,GENcard*); - - -IFparm ELCTpTable[] = { - IP("x.low", ELCT_X_LOW, IF_REAL, "Location of left edge"), - IP("x.high", ELCT_X_HIGH, IF_REAL, "Location of right edge"), - IP("y.low", ELCT_Y_LOW, IF_REAL, "Location of top edge"), - IP("y.high", ELCT_Y_HIGH, IF_REAL, "Location of bottom edge"), - IP("ix.low", ELCT_IX_LOW, IF_INTEGER, "Index of left edge"), - IP("ix.high", ELCT_IX_HIGH, IF_INTEGER, "Index of right edge"), - IP("iy.low", ELCT_IY_LOW, IF_INTEGER, "Index of top edge"), - IP("iy.high", ELCT_IY_HIGH, IF_INTEGER, "Index of bottom edge"), - IP("number", ELCT_NUMBER, IF_INTEGER, "Electrode ID number") -}; - -IFcardInfo ELCTinfo = { - "electrode", - "Location of a contact to the device", - NUMELEMS(ELCTpTable), - ELCTpTable, - - ELCTnewCard, - ELCTparam, - NULL -}; - -int -ELCTnewCard(GENcard **inCard, GENmodel *inModel) -{ - ELCTcard *tmpCard, *newCard; - GENnumModel *model = (GENnumModel *)inModel; - - newCard = TMALLOC(ELCTcard, 1); - if (!newCard) { - *inCard = NULL; - return(E_NOMEM); - } - newCard->ELCTnextCard = NULL; - *inCard = (GENcard *) newCard; - - tmpCard = model->GENelectrodes; - if (!tmpCard) { /* First in list */ - model->GENelectrodes = newCard; - } else { - /* Go to end of list */ - while (tmpCard->ELCTnextCard) tmpCard = tmpCard->ELCTnextCard; - /* And add new card */ - tmpCard->ELCTnextCard = newCard; - } - return(OK); -} - - -int -ELCTparam(int param, IFvalue *value, GENcard *inCard) -{ - ELCTcard *card = (ELCTcard *)inCard; - - switch (param) { - case ELCT_X_LOW: - card->ELCTxLow = value->rValue * UM_TO_CM; - card->ELCTxLowGiven = TRUE; - break; - case ELCT_X_HIGH: - card->ELCTxHigh = value->rValue * UM_TO_CM; - card->ELCTxHighGiven = TRUE; - break; - case ELCT_Y_LOW: - card->ELCTyLow = value->rValue * UM_TO_CM; - card->ELCTyLowGiven = TRUE; - break; - case ELCT_Y_HIGH: - card->ELCTyHigh = value->rValue * UM_TO_CM; - card->ELCTyHighGiven = TRUE; - break; - case ELCT_IX_LOW: - card->ELCTixLow = value->iValue; - card->ELCTixLowGiven = TRUE; - break; - case ELCT_IX_HIGH: - card->ELCTixHigh = value->iValue; - card->ELCTixHighGiven = TRUE; - break; - case ELCT_IY_LOW: - card->ELCTiyLow = value->iValue; - card->ELCTiyLowGiven = TRUE; - break; - case ELCT_IY_HIGH: - card->ELCTiyHigh = value->iValue; - card->ELCTiyHighGiven = TRUE; - break; - case ELCT_NUMBER: - card->ELCTnumber = value->iValue; - card->ELCTnumberGiven = TRUE; - break; - default: - return(E_BADPARM); - break; - } - return(OK); -} diff --git a/src/ciderlib/input/material.c b/src/ciderlib/input/material.c deleted file mode 100644 index 7bbbd58d4..000000000 --- a/src/ciderlib/input/material.c +++ /dev/null @@ -1,305 +0,0 @@ -/********** -Copyright 1991 Regents of the University of California. All rights reserved. -Author: 1991 David A. Gates, U. C. Berkeley CAD Group -Modified: 2001 Paolo Nenzi -**********/ - -#include "ngspice/ngspice.h" -#include "ngspice/numcards.h" -#include "ngspice/numgen.h" -#include "ngspice/numenum.h" -#include "ngspice/matldefs.h" -#include "ngspice/devdefs.h" -#include "ngspice/sperror.h" -#include "ngspice/suffix.h" - - -extern int MATLnewCard(GENcard**,GENmodel *); -extern int MATLparam(int,IFvalue*,GENcard *); - - -IFparm MATLpTable[] = { - IP("number", MATL_NUMBER, IF_INTEGER, "Material ID number"), - IP("insulator",MATL_INSULATOR,IF_FLAG, "Insulator"), - IP("oxide", MATL_OXIDE, IF_FLAG, "Oxide"), - IP("sio2", MATL_OXIDE, IF_FLAG, "Oxide"), - IP("nitride", MATL_NITRIDE, IF_FLAG, "Nitride"), - IP("si3n4", MATL_NITRIDE, IF_FLAG, "Nitride"), - IP("semiconductor",MATL_SEMICON,IF_FLAG, "Semiconductor"), - IP("silicon", MATL_SILICON, IF_FLAG, "Silicon"), - IP("polysilicon",MATL_POLYSIL,IF_FLAG, "Polysilicon"), - IP("gaas", MATL_GAAS, IF_FLAG, "Gallium-Arsenide"), - IP("nc", MATL_NC0, IF_REAL, "Conduction band density"), - IP("nc0", MATL_NC0, IF_REAL, "Conduction band density"), - IP("nc300", MATL_NC0, IF_REAL, "Conduction band density"), - IP("nv", MATL_NV0, IF_REAL, "Valence band density"), - IP("nv0", MATL_NV0, IF_REAL, "Valence band density"), - IP("nv300", MATL_NV0, IF_REAL, "Valence band density"), - IP("eg", MATL_EG0, IF_REAL, "Energy gap"), - IP("eg0", MATL_EG0, IF_REAL, "Energy gap"), - IP("eg300", MATL_EG0, IF_REAL, "Energy gap"), - IP("deg.dt", MATL_DEGDT, IF_REAL, "Bandgap narrowing w/ temp"), - IP("egalpha", MATL_DEGDT, IF_REAL, "Bandgap narrowing w/ temp"), - IP("eg.tref", MATL_TREF_EG, IF_REAL, "E-gap reference temperature"), - IP("egbeta", MATL_TREF_EG, IF_REAL, "E-gap reference temperature"), - IP("deg.dc", MATL_DEGDC, IF_REAL, "Bandgap narrowing w/ N&P doping"), - IP("eg.cref", MATL_CREF_EG, IF_REAL, "E-gap reference conc (N&P type)"), - IP("nbgn", MATL_CREF_EG, IF_REAL, "E-gap reference conc (N&P type)"), - IP("deg.dn", MATL_DEGDN, IF_REAL, "Bandgap narrowing w/ N doping"), - IP("eg.nref", MATL_NREF_EG, IF_REAL, "E-gap reference conc (N type)"), - IP("nbgnn", MATL_NREF_EG, IF_REAL, "E-gap reference conc (N type)"), - IP("deg.dp", MATL_DEGDP, IF_REAL, "Bandgap narrowing w/ P doping"), - IP("eg.pref", MATL_PREF_EG, IF_REAL, "E-gap reference conc (P type)"), - IP("nbgnp", MATL_PREF_EG, IF_REAL, "E-gap reference conc (P type)"), - IP("affinity",MATL_AFFIN, IF_REAL, "Electron affinity"), - IP("permittivity",MATL_PERMIT,IF_REAL, "Dielectric permittivity"), - IP("epsilon", MATL_PERMIT, IF_REAL, "Dielectric permittivity"), - IP("tn", MATL_TAUN0, IF_REAL, "SRH electron lifetime"), - IP("tn0", MATL_TAUN0, IF_REAL, "SRH electron lifetime"), - IP("taun0", MATL_TAUN0, IF_REAL, "SRH electron lifetime"), - IP("tp", MATL_TAUP0, IF_REAL, "SRH hole lifetime"), - IP("tp0", MATL_TAUP0, IF_REAL, "SRH hole lifetime"), - IP("taup0", MATL_TAUP0, IF_REAL, "SRH hole lifetime"), - IP("nsrhn", MATL_NSRHN, IF_REAL, "SRH reference conc (electrons)"), - IP("srh.nref",MATL_NSRHN, IF_REAL, "SRH reference conc (electrons)"), - IP("nsrhp", MATL_NSRHP, IF_REAL, "SRH reference conc (holes)"), - IP("srh.pref",MATL_NSRHP, IF_REAL, "SRH reference conc (holes)"), - IP("cn", MATL_CNAUG, IF_REAL, "Auger coefficient (electrons)"), - IP("cnaug", MATL_CNAUG, IF_REAL, "Auger coefficient (electrons)"), - IP("augn", MATL_CNAUG, IF_REAL, "Auger coefficient (electrons)"), - IP("cp", MATL_CPAUG, IF_REAL, "Auger coefficient (holes)"), - IP("cpaug", MATL_CPAUG, IF_REAL, "Auger coefficient (holes)"), - IP("augp", MATL_CPAUG, IF_REAL, "Auger coefficient (holes)"), - IP("arichn", MATL_ARICHN, IF_REAL, "Richardson constant (electrons)"), - IP("arichp", MATL_ARICHP, IF_REAL, "Richardson constant (holes)") -}; - -IFcardInfo MATLinfo = { - "material", - "Specify physical properties of a material", - NUMELEMS(MATLpTable), - MATLpTable, - - MATLnewCard, - MATLparam, - NULL -}; - -IFcardInfo PHYSinfo = { - "physics", - "Specify physical properties of a material", - NUMELEMS(MATLpTable), - MATLpTable, - - MATLnewCard, - MATLparam, - NULL -}; - -int -MATLnewCard(GENcard **inCard, GENmodel *inModel) -{ - MATLcard *tmpCard, *newCard; - GENnumModel *model = (GENnumModel *)inModel; - - newCard = TMALLOC(MATLcard, 1); - if (!newCard) { - *inCard = NULL; - return(E_NOMEM); - } - newCard->MATLnextCard = NULL; - *inCard = (GENcard *) newCard; - - tmpCard = model->GENmaterials; - if (!tmpCard) { /* First in list */ - model->GENmaterials = newCard; - } else { - /* Go to end of list */ - while (tmpCard->MATLnextCard) tmpCard = tmpCard->MATLnextCard; - /* And add new card */ - tmpCard->MATLnextCard = newCard; - } - return(OK); -} - -int -MATLparam(int param, IFvalue *value, GENcard *inCard) -{ - MATLcard *card = (MATLcard *)inCard; - - switch (param) { - case MATL_NUMBER: - card->MATLnumber = value->iValue; - card->MATLnumberGiven = TRUE; - break; - case MATL_NC0: - card->MATLnc0 = value->rValue; - card->MATLnc0Given = TRUE; - break; - case MATL_NV0: - card->MATLnv0 = value->rValue; - card->MATLnv0Given = TRUE; - break; - case MATL_EG0: - card->MATLeg0 = value->rValue; - card->MATLeg0Given = TRUE; - break; - case MATL_DEGDT: - card->MATLdEgdT = value->rValue; - card->MATLdEgdTGiven = TRUE; - break; - case MATL_TREF_EG: - card->MATLtrefEg = value->rValue; - card->MATLtrefEgGiven = TRUE; - break; - case MATL_DEGDC: - card->MATLdEgdN = value->rValue; - card->MATLdEgdNGiven = TRUE; - card->MATLdEgdP = value->rValue; - card->MATLdEgdPGiven = TRUE; - break; - case MATL_CREF_EG: - card->MATLnrefEg = value->rValue; - card->MATLnrefEgGiven = TRUE; - card->MATLprefEg = value->rValue; - card->MATLprefEgGiven = TRUE; - break; - case MATL_DEGDN: - card->MATLdEgdN = value->rValue; - card->MATLdEgdNGiven = TRUE; - break; - case MATL_NREF_EG: - card->MATLnrefEg = value->rValue; - card->MATLnrefEgGiven = TRUE; - break; - case MATL_DEGDP: - card->MATLdEgdP = value->rValue; - card->MATLdEgdPGiven = TRUE; - break; - case MATL_PREF_EG: - card->MATLprefEg = value->rValue; - card->MATLprefEgGiven = TRUE; - break; - case MATL_AFFIN: - card->MATLaffinity = value->rValue; - card->MATLaffinityGiven = TRUE; - break; - case MATL_PERMIT: - card->MATLpermittivity = value->rValue; - card->MATLpermittivityGiven = TRUE; - break; - case MATL_TAUN0: - card->MATLtaun0 = value->rValue; - card->MATLtaun0Given = TRUE; - break; - case MATL_TAUP0: - card->MATLtaup0 = value->rValue; - card->MATLtaup0Given = TRUE; - break; - case MATL_NSRHN: - card->MATLnrefSRHn = value->rValue; - card->MATLnrefSRHnGiven = TRUE; - break; - case MATL_NSRHP: - card->MATLnrefSRHp = value->rValue; - card->MATLnrefSRHpGiven = TRUE; - break; - case MATL_CNAUG: - card->MATLcnAug = value->rValue; - card->MATLcnAugGiven = TRUE; - break; - case MATL_CPAUG: - card->MATLcpAug = value->rValue; - card->MATLcpAugGiven = TRUE; - break; - case MATL_ARICHN: - card->MATLaRichN = value->rValue; - card->MATLaRichNGiven = TRUE; - break; - case MATL_ARICHP: - card->MATLaRichP = value->rValue; - card->MATLaRichPGiven = TRUE; - break; - case MATL_INSULATOR: - if ( value->iValue ) { - card->MATLmaterial = INSULATOR; - card->MATLmaterialGiven = TRUE; - } else { - if ( card->MATLmaterial == INSULATOR ) { - card->MATLmaterial = -1; - card->MATLmaterialGiven = FALSE; - } - } - break; - case MATL_OXIDE: - if ( value->iValue ) { - card->MATLmaterial = OXIDE; - card->MATLmaterialGiven = TRUE; - } else { - if ( card->MATLmaterial == OXIDE ) { - card->MATLmaterial = -1; - card->MATLmaterialGiven = FALSE; - } - } - break; - case MATL_NITRIDE: - if ( value->iValue ) { - card->MATLmaterial = NITRIDE; - card->MATLmaterialGiven = TRUE; - } else { - if ( card->MATLmaterial == NITRIDE ) { - card->MATLmaterial = -1; - card->MATLmaterialGiven = FALSE; - } - } - break; - case MATL_SEMICON: - if ( value->iValue ) { - card->MATLmaterial = SEMICON; - card->MATLmaterialGiven = TRUE; - } else { - if ( card->MATLmaterial == SEMICON ) { - card->MATLmaterial = -1; - card->MATLmaterialGiven = FALSE; - } - } - break; - case MATL_SILICON: - if ( value->iValue ) { - card->MATLmaterial = SILICON; - card->MATLmaterialGiven = TRUE; - } else { - if ( card->MATLmaterial == SILICON ) { - card->MATLmaterial = -1; - card->MATLmaterialGiven = FALSE; - } - } - break; - case MATL_POLYSIL: - if ( value->iValue ) { - card->MATLmaterial = POLYSILICON; - card->MATLmaterialGiven = TRUE; - } else { - if ( card->MATLmaterial == POLYSILICON ) { - card->MATLmaterial = -1; - card->MATLmaterialGiven = FALSE; - } - } - break; - case MATL_GAAS: - if ( value->iValue ) { - card->MATLmaterial = GAAS; - card->MATLmaterialGiven = TRUE; - } else { - if ( card->MATLmaterial == GAAS ) { - card->MATLmaterial = -1; - card->MATLmaterialGiven = FALSE; - } - } - break; - default: - return(E_BADPARM); - break; - } - return(OK); -} diff --git a/src/ciderlib/input/matlset.c b/src/ciderlib/input/matlset.c deleted file mode 100644 index c95d198dd..000000000 --- a/src/ciderlib/input/matlset.c +++ /dev/null @@ -1,173 +0,0 @@ -/********** -Copyright 1992 Regents of the University of California. All rights reserved. -Author: 1992 David A. Gates, U. C. Berkeley CAD Group -Modified: 2001 Paolo Nenzi -**********/ - -#include "ngspice/ngspice.h" -#include "ngspice/cktdefs.h" -#include "ngspice/numconst.h" -#include "ngspice/numenum.h" -#include "ngspice/matldefs.h" -#include "ngspice/material.h" -#include "ngspice/sperror.h" -#include "ngspice/suffix.h" -#include "ngspice/cidersupt.h" - -extern int MATLcheck( MATLcard * ); -extern int MATLsetup( MATLcard *, MaterialInfo ** ); - -/* - * Name: MATLcheck - * Purpose: checks a list of MATLcards for input errors - * Formals: cardList: the list to check - * Returns: OK/E_PRIVATE - * Users: numerical device setup routines - * Calls: error message handler - */ -int - MATLcheck(MATLcard *cardList) -{ - MATLcard *card, *card2; - int cardNum = 0, cardNum2; - int error = OK; - - for ( card = cardList; card != NULL; card = card->MATLnextCard ) { - cardNum++; - - if( !card->MATLmaterialGiven ) { - card->MATLmaterial = SILICON; - } - if (!card->MATLnumberGiven) { - SPfrontEnd->IFerrorf( ERR_WARNING, "material card %d is missing an id number", cardNum ); - error = E_PRIVATE; - } - - /* Return now if anything has failed */ - if (error) return(error); - - /* Make sure this id is different from all previous ones. */ - cardNum2 = 0; - for ( card2 = cardList; card2 != card; card2 = card2->MATLnextCard ) { - cardNum2++; - if (card2->MATLnumber == card->MATLnumber) { - SPfrontEnd->IFerrorf( ERR_WARNING, "material cards %d and %d use same id %d", cardNum2, cardNum, card->MATLnumber ); - error = E_PRIVATE; - } - } - - /* Return now if anything has failed */ - if (error) return(error); - } - return(OK); -} - - - -/* - * Name: MATLsetup - * Purpose: setup the physical model parameters - * Formals: cardList: list of cards to setup - * Returns: OK/E_PRIVATE - * Users: numerical devices - * Calls: MATLcheck - */ -int - MATLsetup(MATLcard *cardList, MaterialInfo **materialList) -{ - MATLcard *card; - MATLmaterial *newMaterial = NULL; - int error; - -/* Initialize list of electrodes */ - *materialList = NULL; - - /* Check the card list */ - if ((error = MATLcheck( cardList )) != 0) return( error ); - - for ( card = cardList; card != NULL; card = card->MATLnextCard ) { - - if (*materialList == NULL) { - RALLOC( newMaterial, MATLmaterial, 1 ); - *materialList = newMaterial; - } - else { - RALLOC( newMaterial->next, MATLmaterial, 1 ); - newMaterial = newMaterial->next; - } - newMaterial->next = NULL; - newMaterial->id = card->MATLnumber; - newMaterial->material = card->MATLmaterial; - - /* Fill in default values */ - MATLdefaults( newMaterial ); - - /* Now override with parameters set on the card */ - if ( card->MATLpermittivityGiven ) { - newMaterial->eps = card->MATLpermittivity; - /* Multiply by permittivity of free space if relative epsilon given. */ - if (newMaterial->eps > 0.1) { - newMaterial->eps *= EPS0; - } - } - if ( card->MATLaffinityGiven ) { - newMaterial->affin = card->MATLaffinity; - } - if ( card->MATLnc0Given ) { - newMaterial->nc0 = card->MATLnc0; - } - if ( card->MATLnv0Given ) { - newMaterial->nv0 = card->MATLnv0; - } - if ( card->MATLeg0Given ) { - newMaterial->eg0 = card->MATLeg0; - } - if ( card->MATLdEgdTGiven ) { - newMaterial->dEgDt = card->MATLdEgdT; - } - if ( card->MATLtrefEgGiven ) { - newMaterial->trefBGN = card->MATLtrefEg; - } - if ( card->MATLdEgdNGiven ) { - newMaterial->dEgDn[ELEC] = card->MATLdEgdN; - } - if ( card->MATLnrefEgGiven ) { - newMaterial->nrefBGN[ELEC] = card->MATLnrefEg; - } - if ( card->MATLdEgdPGiven ) { - newMaterial->dEgDn[HOLE] = card->MATLdEgdP; - } - if ( card->MATLprefEgGiven ) { - newMaterial->nrefBGN[HOLE] = card->MATLprefEg; - } - if ( card->MATLtaup0Given ) { - newMaterial->tau0[HOLE] = card->MATLtaup0; - } - if ( card->MATLtaun0Given ) { - newMaterial->tau0[ELEC] = card->MATLtaun0; - } - if ( card->MATLtaup0Given ) { - newMaterial->tau0[HOLE] = card->MATLtaup0; - } - if ( card->MATLnrefSRHnGiven ) { - newMaterial->nrefSRH[ELEC] = card->MATLnrefSRHn; - } - if ( card->MATLnrefSRHpGiven ) { - newMaterial->nrefSRH[HOLE] = card->MATLnrefSRHp; - } - if ( card->MATLcnAugGiven ) { - newMaterial->cAug[ELEC] = card->MATLcnAug; - } - if ( card->MATLcpAugGiven ) { - newMaterial->cAug[HOLE] = card->MATLcpAug; - } - if ( card->MATLaRichNGiven ) { - newMaterial->aRich[ELEC] = card->MATLaRichN; - } - if ( card->MATLaRichPGiven ) { - newMaterial->aRich[HOLE] = card->MATLaRichP; - } - - } - return( OK ); -} diff --git a/src/ciderlib/input/mesh.c b/src/ciderlib/input/mesh.c deleted file mode 100644 index 07c520ed4..000000000 --- a/src/ciderlib/input/mesh.c +++ /dev/null @@ -1,148 +0,0 @@ -/********** -Copyright 1991 Regents of the University of California. All rights reserved. -Author: 1991 David A. Gates, U. C. Berkeley CAD Group -Modified: 2001 Paolo Nenzi -**********/ - -#include "ngspice/ngspice.h" -#include "ngspice/numcards.h" -#include "ngspice/numgen.h" -#include "ngspice/meshdefs.h" -#include "ngspice/devdefs.h" -#include "ngspice/sperror.h" -#include "ngspice/suffix.h" - -extern int XMSHnewCard(GENcard**,GENmodel*); -extern int YMSHnewCard(GENcard**,GENmodel*); -extern int MESHparam(int,IFvalue*,GENcard*); - - - -IFparm MESHpTable[] = { - IP("location",MESH_LOCATION, IF_REAL, "Meshline location"), - IP("width", MESH_WIDTH, IF_REAL, "Distance to next line"), - IP("number", MESH_NUMBER, IF_INTEGER, "Meshline number"), - IP("node", MESH_NUMBER, IF_INTEGER, "Meshline number"), - IP("ratio", MESH_RATIO, IF_REAL, "Suggested spacing ratio"), - IP("h.start", MESH_H_START, IF_REAL, "Spacing at start of interval"), - IP("h1", MESH_H_START, IF_REAL, "Spacing at start of interVal"), - IP("h.end", MESH_H_END, IF_REAL, "Spacing at end of interval"), - IP("h2", MESH_H_END, IF_REAL, "Spacing at end of interval"), - IP("h.max", MESH_H_MAX, IF_REAL, "Max spacing during interval"), - IP("h3", MESH_H_MAX, IF_REAL, "Max spacing during interval") -}; - -IFcardInfo XMSHinfo = { - "x.mesh", - "Location of mesh lines", - NUMELEMS(MESHpTable), - MESHpTable, - - XMSHnewCard, - MESHparam, - NULL -}; - -IFcardInfo YMSHinfo = { - "y.mesh", - "Location of mesh lines", - NUMELEMS(MESHpTable), - MESHpTable, - - YMSHnewCard, - MESHparam, - NULL -}; - -int -XMSHnewCard(GENcard **inCard, GENmodel *inModel) -{ - MESHcard *tmpCard, *newCard; - GENnumModel *model = (GENnumModel *)inModel; - - newCard = TMALLOC(MESHcard, 1); - if (!newCard) { - *inCard = NULL; - return(E_NOMEM); - } - newCard->MESHnextCard = NULL; - *inCard = (GENcard *) newCard; - - tmpCard = model->GENxMeshes; - if (!tmpCard) { /* First in list */ - model->GENxMeshes = newCard; - } else { - /* Go to end of list */ - while (tmpCard->MESHnextCard) tmpCard = tmpCard->MESHnextCard; - /* And add new card */ - tmpCard->MESHnextCard = newCard; - } - return(OK); -} - -int -YMSHnewCard(GENcard **inCard, GENmodel *inModel) -{ - MESHcard *tmpCard, *newCard; - GENnumModel *model = (GENnumModel *)inModel; - - newCard = TMALLOC(MESHcard, 1); - if (!newCard) { - *inCard = NULL; - return(E_NOMEM); - } - newCard->MESHnextCard = NULL; - *inCard = (GENcard *) newCard; - - tmpCard = model->GENyMeshes; - if (!tmpCard) { /* First in list */ - model->GENyMeshes = newCard; - } else { - /* Go to end of list */ - while (tmpCard->MESHnextCard) tmpCard = tmpCard->MESHnextCard; - /* And add new card */ - tmpCard->MESHnextCard = newCard; - } - return(OK); -} - -int -MESHparam(int param, IFvalue *value, GENcard *inCard) -{ - MESHcard *card = (MESHcard *)inCard; - - switch (param) { - case MESH_LOCATION: - card->MESHlocation = value->rValue; - card->MESHlocationGiven = TRUE; - break; - case MESH_WIDTH: - card->MESHwidth = value->rValue; - card->MESHwidthGiven = TRUE; - break; - case MESH_H_START: - card->MESHhStart = value->rValue; - card->MESHhStartGiven = TRUE; - break; - case MESH_H_END: - card->MESHhEnd = value->rValue; - card->MESHhEndGiven = TRUE; - break; - case MESH_H_MAX: - card->MESHhMax = value->rValue; - card->MESHhMaxGiven = TRUE; - break; - case MESH_RATIO: - card->MESHratio = value->rValue; - card->MESHratioGiven = TRUE; - break; - case MESH_NUMBER: - card->MESHnumber = value->iValue; - card->MESHnumberGiven = TRUE; - break; - default: - return(E_BADPARM); - break; - } - return(OK); -} diff --git a/src/ciderlib/input/meshset.c b/src/ciderlib/input/meshset.c deleted file mode 100644 index a1e8c8964..000000000 --- a/src/ciderlib/input/meshset.c +++ /dev/null @@ -1,1247 +0,0 @@ -/********** -Copyright 1991 Regents of the University of California. All rights reserved. -Author: 1991 David A. Gates, U. C. Berkeley CAD Group -Modified: 2001 Paolo Nenzi -**********/ -/********** -Mesh Setup & Query Routines. -**********/ - -/* Imports */ -#include "ngspice/ngspice.h" -#include "ngspice/cktdefs.h" -#include "ngspice/meshdefs.h" -#include "ngspice/meshext.h" -#include "ngspice/gendev.h" -#include "ngspice/sperror.h" -#include "ngspice/suffix.h" - -/* Local Constants */ -#define CMP_TOL 1.0e-9 /* Tolerance on (double) comparisons */ -#define RAT_TOL 1.0e-6 /* Error allowed in ratio calc's */ -#define RAT_LIM 50 /* Maximum number of ratio iterations */ -#define UM_TO_CM 1.0e-4 /* Micron to centimeter conversion */ - -/* Forward Declarations */ -static int oneSideSpacing( double, double, double, - double *, int * ); -static int twoSideSpacing( double, double, double, double, - double *, double *, int *, int * ); -static int maxLimSpacing( double, double, double, double, - double *, int *, int * ); -static int oneSideRatio( double, double, double *, int ); -static int twoSideRatio( double, double, double, double *, int, int ); -static int MESHspacing( MESHcard *, double *, double *, int *, int *, int * ); - -/* END OF HEADER */ - - -/* - * Name: MESHmkArray - * Purpose: Turn a coordinate list into a coordinate array. - * Formals: < I > coordList: a sorted list of all the coordinates - * < I > numCoords: the length of the listi, if 0 find it - * Returns: a (double) array of those coordinates, with length in a[0] - * Users: routines used to create the final mesh - * Calls: (none) - */ -double * -MESHmkArray(MESHcoord *coordList, int numCoords) -{ - double *array = NULL; - MESHcoord *coord; - - if ( numCoords <= 0 ) { - numCoords = 0; - for ( coord = coordList; coord != NULL; coord = coord->next ) { - numCoords++; - } - } - if ( numCoords != 0 ) { - XALLOC( array, double, 1 + numCoords ); - numCoords = 0; - array[ 0 ] = (double) numCoords; - numCoords = 1; - for ( coord = coordList; coord != NULL; coord = coord->next ) { - array[ numCoords++ ] = coord->location; - } - return array; - } - else { - return NULL; - } - /* NOTREACHED */ -} - - -/* - * Name: MESHiBounds - * Purpose: Find the minimum and maximum indices in a mesh list. - * Formals: < I > coordList: a sorted list of all the coordinates - * < O > ixMin: the minimum index - * < O > ixMax: the maximum index - * Returns: (none) - * Users: routines wanting to fine the ends of a mesh - * Calls: (none) - */ -void -MESHiBounds(MESHcoord *coordList, int *ixMin, int *ixMax) -{ - MESHcoord *last; - - if (coordList) { - *ixMin = coordList->number; - for ( last = coordList; last->next != NULL; last = last->next ) - ; - *ixMax = last->number; - } - else { - *ixMin = *ixMax = -1; - } -} - - -/* - * Name: MESHlBounds - * Purpose: Find the minimum and maximum locations in a mesh list. - * Formals: < I > coordList: a sorted list of all the coordinates - * < O > lcMin: the minimum location - * < O > lcMax: the maximum location - * Returns: (none) - * Users: routines wanting to find the ends of a mesh - * Calls: (none) - */ -void -MESHlBounds(MESHcoord *coordList, double *lcMin, double *lcMax) -{ - MESHcoord *last; - - if (coordList) { - *lcMin = coordList->location; - for ( last = coordList; last->next != NULL; last = last->next ) - ; - *lcMax = last->location; - } - else { - *lcMin = *lcMax = 0.0; - } -} - - -/* - * Name: MESHlocate - * Purpose: Finds the index of the MESHcoord nearest to a location. - * Formals: < I > coordList: a sorted list of all available coordinates - * < I > location: the location to find - * Returns: index / -1 (list empty) - * Users: routines that convert distances to indices - * Calls: (none) - */ -int -MESHlocate(MESHcoord *coordList, double location) -{ - MESHcoord *coord, *prevCoord = NULL; - int index; - -/* Find the coordinates which flank the location. */ - for ( coord = coordList; coord != NULL; coord = coord->next ) { - if ( coord->location > location ) break; - prevCoord = coord; - } - -/* Get the index. */ - if (prevCoord && coord) { - if ( location <= (prevCoord->location + coord->location) / 2.0 ) { - index = prevCoord->number; - } - else { - index = coord->number; - } - } - else if ( coord ) { - index = coord->number; - } - else if ( prevCoord ) { - index = prevCoord->number; - } - else { - index = -1; - } - return( index ); -} - - - -/* - * Name: MESHcheck - * Purpose: Checks a list of mesh cards for input errors. - * Formals: cardList: pointer to head of linked list of MESHcard's - * < I > dim: 'x', 'y' or 'z' dimension - * Returns: OK / E_PRIVATE - * Users: setup routines - * Calls: error-message handler - */ -int -MESHcheck(char dim, MESHcard *cardList) -{ - MESHcard *card; - int cardNum = 0; - double locStart = 0.0, locEnd; - double ratio; - int error = OK; - - if ( cardList == NULL ) { - SPfrontEnd->IFerrorf( ERR_FATAL, "%c.mesh card list is empty", dim ); - locEnd = locStart; - return( E_PRIVATE ); - } - - for ( card = cardList; card != NULL; card = card->MESHnextCard ) { - cardNum++; - -/* Am I trying to find number of nodes directly & indirectly? */ - if (card->MESHnumberGiven && card->MESHratioGiven) { - SPfrontEnd->IFerrorf( ERR_INFO, "%c.mesh card %d uses both number and ratio - number ignored", dim, cardNum ); - - card->MESHnumberGiven = FALSE; - } - -/* Will I be able to locate endpoints? */ - if (!card->MESHlocationGiven && !card->MESHwidthGiven) { - SPfrontEnd->IFerrorf( ERR_FATAL, "%c.mesh card %d has no distances", dim, cardNum ); - locEnd = locStart; - error = E_PRIVATE; - } - else if (card->MESHlocationGiven && card->MESHwidthGiven) { - SPfrontEnd->IFerrorf( ERR_INFO, "%c.mesh card %d uses both location and width - location ignored", dim, cardNum ); - - card->MESHlocationGiven = FALSE; - locEnd = locStart + card->MESHwidth; - } - else if (card->MESHlocationGiven) { - locEnd = card->MESHlocation; - if (cardNum == 1) locStart = locEnd; - } - else { - locEnd = locStart + card->MESHwidth; - } - -/* Are the endpoints in the wrong order? */ - if ( locEnd - locStart < - CMP_TOL ) { - SPfrontEnd->IFerrorf( ERR_FATAL, "%c.mesh card %d uses negative width", dim, cardNum ); - error = E_PRIVATE; - } - -/* Are the endpoints too close together? */ - else if ( (locEnd - locStart <= CMP_TOL) ) { - if ( !(cardNum == 1 && locStart == locEnd) ) { - SPfrontEnd->IFerrorf( ERR_INFO, "%c.mesh card %d has negligible width - ignored", dim, cardNum ); - locStart = locEnd; - } - } - -/* Is the ratio out of the acceptable range? */ - if (card->MESHratioGiven) { - ratio = card->MESHratio; - } - else { - ratio = 1.0; - } - if ((ratio < 1.0) || (ratio > 10.0)) { - SPfrontEnd->IFerrorf( ERR_INFO, "%c.mesh card %d has ratio out of range - reset to 1.0", dim, cardNum ); - ratio = 1.0; - } - -/* Check sizes of h.start, h.end and h.max. */ - if ((card->MESHhStartGiven && (card->MESHhStart <= 0.0)) || - (card->MESHhEndGiven && (card->MESHhEnd <= 0.0)) || - (card->MESHhMaxGiven && (card->MESHhMax <= 0.0))) { - SPfrontEnd->IFerrorf( ERR_FATAL, "%c.mesh card %d wants to use a non-positive spacing", dim, cardNum ); - error = E_PRIVATE; - } - -/* Is the max spacing being used improperly? */ - if (card->MESHhMaxGiven && ( - ( card->MESHhStartGiven && card->MESHhEndGiven) || - (!card->MESHhStartGiven && !card->MESHhEndGiven))) { - SPfrontEnd->IFerrorf( ERR_FATAL, "%c.mesh card %d needs to use one of h.start or h.end with h.max", dim, cardNum ); - error = E_PRIVATE; - } - else if (card->MESHhMaxGiven && card->MESHhStartGiven) { - if (card->MESHhStart > card->MESHhMax) { - SPfrontEnd->IFerrorf( ERR_FATAL, "%c.mesh card %d wants h.start > h.max", dim, cardNum ); - error = E_PRIVATE; - } - else { - card->MESHhEnd = card->MESHhMax; - } - } - else if (card->MESHhMaxGiven && card->MESHhEndGiven) { - if (card->MESHhEnd > card->MESHhMax) { - SPfrontEnd->IFerrorf( ERR_FATAL, "%c.mesh card %d wants h.end > h.max", dim, cardNum ); - error = E_PRIVATE; - } - else { - card->MESHhStart = card->MESHhMax; - } - } - -/* Return now if anything has failed. */ - if (error) return(error); - -/* Note: at this point we still aren't sure whether node numbers are OK. */ - -/* Fill-in newly computed information. */ - card->MESHlocStart = locStart; - card->MESHlocEnd = locEnd; - card->MESHratio = ratio; - -/* Advance current location. */ - locStart = locEnd; - } - return(OK); -} - - -/* - * Name: geomSum - * Purpose: Computes the sum of n terms of a geometric series. - * Formals: < I > r: ratio of one term to the next - * < I > n: number of terms to sum - * Returns: sum / 0.0 - * Users: spacing routines - * Calls: pow - */ -static double -geomSum(double r, double n) -{ - double sum; - - if ((r < 0.0) || (n <= 0.0)) { - sum = 0.0; - } - else if (r == 0.0) { - sum = 1.0; - } - else { - if (ABS(r - 1.0) < 1.0e-4) { - sum = n * (1.0 + (n - 1.0)*(r - 1.0)/2.0); - } - else { - sum = (1.0 - pow(r,n))/(1.0 - r); - } - } - return( sum ); -} - - -/* - * Name: addCoord - * Purpose: add a new coordinate to the tail of a linked list - * Formals: head: head of linked list - * tail: tail of linked list - * < I > number: node number of coordinate - * < I > location: location of coordinate - * Returns: OK / E_NOMEM - * Users: MESHsetup - * Calls: memory allocator - */ -static int -addCoord(MESHcoord **head, MESHcoord **tail, int number, double location) -{ - MESHcoord *newCoord; - - if (*head == NULL) { - RALLOC( *tail, MESHcoord, 1 ); - newCoord = *head = *tail; - } - else { - RALLOC( (*tail)->next, MESHcoord, 1 ); - newCoord = *tail = (*tail)->next; - } - newCoord->next = NULL; - newCoord->number = number; - newCoord->location = location * UM_TO_CM; - return(OK); -} - - -/* - * Name: MESHsetup - * Purpose: Converts a list of input MESHcard's to a list of MESHcoord's. - * Expansion is performed so that node numbers in the final list - * increase by one from coordinate to coordinate. The list - * will grow until the input ends or a bad card is found. - * Formals: < I > dim: 'x', 'y', or 'z' dimension - * cardList: the list of input cards - * < O > coordList: the final list of coordinates - * < O > numCoords: the number of coords in coordList - * Returns: OK / E_PRIVATE - * Users: numerical device setup routines - * Calls: MESHcheck, MESHspacing, error-message handler - */ -int -MESHsetup(char dim, MESHcard *cardList, MESHcoord **coordList, int *numCoords) -{ - MESHcard *card; - MESHcoord *endCoord; - int cardNum = 0; - int i, totCoords, numStart=1, numEnd = 0, nspStart, nspEnd, nspMax, nspLeft; - double locStart, locEnd = 0.0, location, space; - double hStart, hEnd, hMax, hBig; - double ratStart, ratEnd; - int error = OK; - -/* Initialize list of coordinates. */ - *coordList = endCoord = NULL; - *numCoords = totCoords = 0; - -/* Check the card list. */ - if ((error = MESHcheck( dim, cardList )) != 0) return( error ); - -/* Print info header. */ -#ifdef NOTDEF - fprintf( stdout, " %c.Mesh Card Information\n", toupper_c(dim) ); - fprintf( stdout, "-------------------------\n" ); - fprintf( stdout, " %3s %3s %3s %9s %9s %9s %9s %9s %9s\n", - "n.s", "n.m", "n.e", "l.e", "h.s", "h.e", "h.m", "r.s", "r.e" ); -#endif - - for ( card = cardList; card != NULL; card = card->MESHnextCard ) { - cardNum++; - locStart = card->MESHlocStart; - locEnd = card->MESHlocEnd; - - if (locEnd == locStart) { /* This card has no width. */ -/* First update the node number. */ - if (card->MESHnumberGiven) { - if (card->MESHlocationGiven) { /* Absolute node number given */ - numEnd = card->MESHnumber; - if (cardNum == 1) numStart = numEnd; - } - else { /* Number of spaces instead */ - numEnd = numStart + card->MESHnumber; - } - } -/* Are node numbers in the wrong order? */ - if ( numEnd < numStart ) { - SPfrontEnd->IFerrorf( ERR_FATAL, "%c.mesh card %d has out-of-order node numbers ( %d > %d )", dim, cardNum, numStart, numEnd ); - error = E_PRIVATE; - } - } - else { /* This card has some width. */ -/* First update the node number. */ - if (card->MESHnumberGiven) { /* Uniform mesh */ - if (card->MESHlocationGiven) { /* Absolute node number given */ - numEnd = card->MESHnumber; - if (cardNum == 1) numStart = numEnd; - nspStart = numEnd - numStart; - } - else { /* Number of spaces instead */ - nspStart = card->MESHnumber; - numEnd = numStart + nspStart; - } - ratStart = 1.0; - ratEnd = 0.0; - nspEnd = 0; - nspMax = 0; - if ( nspStart > 0 ) { - card->MESHhStart = (locEnd - locStart) / (double)nspStart; - card->MESHhEnd = 0.0; - } - } - else { /* Nonuniform mesh */ - error = MESHspacing( card, &ratStart, &ratEnd, - &nspStart, &nspMax, &nspEnd ); - if (error) { - SPfrontEnd->IFerrorf( ERR_FATAL, "%c.mesh card %d can't be spaced automatically", dim, cardNum ); - return( error ); - } - else { - numEnd = numStart + nspStart + nspMax + nspEnd; - } - } -/* Are the node numbers properly ordered? */ - if ( numEnd <= numStart ) { - SPfrontEnd->IFerrorf( ERR_FATAL, "%c.mesh card %d results in out-of-order node numbers ( %d > %d )", dim, cardNum, numStart, numEnd ); - error = E_PRIVATE; - } - else { -/* Create the new MESHcoord's. */ - hStart = card->MESHhStart; - hEnd = card->MESHhEnd; - hMax = card->MESHhMax; - hBig = 0.0; - -/* Generate the first coord in this section */ - location = locStart; - error = addCoord( coordList, &endCoord, ++totCoords, location ); - if (error) return(error); - -/* Generate new coords for the starting section. */ - nspLeft = nspStart + nspMax + nspEnd; - if ( nspStart != 0 ) { - hBig = MAX( hBig, hStart*pow( ratStart, (double) (nspStart - 1) ) ); - space = hStart; - for ( i = 0; (i < nspStart)&&(nspLeft > 1); i++, nspLeft-- ) { - location += space; - space *= ratStart; - error = addCoord( coordList, &endCoord, ++totCoords, location ); - if (error) return(error); - } - } - -/* Generate new coords for the maximum section. */ - if ( nspMax != 0 ) { - hBig = MAX( hBig, hMax ); - space = hMax; - for ( i = 0; (i < nspMax)&&(nspLeft > 1); i++, nspLeft-- ) { - location += space; - error = addCoord( coordList, &endCoord, ++totCoords, location ); - if (error) return(error); - } - } - -/* Generate new coords for the ending section. */ - if ( nspEnd != 0 ) { - hBig = MAX( hBig, hEnd*pow( ratEnd, (double) (nspEnd - 1) ) ); - space = hEnd * pow( ratEnd, (double) (nspEnd - 1) ); - for ( i = 0; (i < nspEnd)&&(nspLeft > 1); i++, nspLeft-- ) { - location += space; - space /= ratEnd; - error = addCoord( coordList, &endCoord, ++totCoords, location ); - if (error) return(error); - } - } -#ifdef NOTDEF - fprintf( stdout, " %9.5f\n", locStart ); - fprintf( stdout, - " %3d %3d %3d %9.5f %9.5f %9.5f %9.5f %9.5f\n", - nspStart, nspMax, nspEnd, - hStart, hEnd, hBig, ratStart, ratEnd ); -#endif - } - } - -/* Return now if anything has failed. */ - if (error) return(error); - -/* Advance the node number. */ - numStart = numEnd; - } - -/* - * If the mesh is not empty, then the loop above has exited before - * adding the final coord to the list. So we need to do that now. - */ - if (*coordList != NULL) { - error = addCoord( coordList, &endCoord, ++totCoords, locEnd ); - if (error) return(error); -#ifdef NOTDEF - fprintf( stdout, " %9.5f\n", locEnd ); -#endif - } -#ifdef NOTDEF - fprintf( stdout, "\n" ); -#endif - *numCoords = totCoords; - return(OK); -} - - - -/* - * Name: MESHspacing - * Purpose: Find ratios, spacings, and node numbers for a mesh span. - * Formals: < I > card: the input card for this span - * < O > rS: ratio found for spacings at start of span - * < O > rE: ratio found for spacings at end of span - * < O > nS: number of start spaces - * < O > nM: number of max spaces - * < O > nE: number of end spaces - * Returns: OK / E_PRIVATE - * Users: MESHsetup - * Calls: oneSideSpacing, twoSideSpacing, maxLimSpacing - */ -static int -MESHspacing(MESHcard *card, double *rS, double *rE, int *nS, int *nM, int *nE) -{ - int error = OK; - int hStartGiven = card->MESHhStartGiven; - int hEndGiven = card->MESHhEndGiven; - int hMaxGiven = card->MESHhMaxGiven; - double hS = card->MESHhStart; - double hE = card->MESHhEnd; - double hM = card->MESHhMax; - double rW = card->MESHratio; /* The ratio wanted */ - double width; - - width = card->MESHlocEnd - card->MESHlocStart; - -/* Call subsidiary routine depending on how flags are set. */ - if (!hStartGiven && hEndGiven && !hMaxGiven ) { -/* End section only */ - error = oneSideSpacing( width, hE, rW, rE, nE ); - *nM = *nS = 0; - *rS = 0.0; - } - else if ( hStartGiven && !hEndGiven && !hMaxGiven ) { -/* Start section only */ - error = oneSideSpacing( width, hS, rW, rS, nS ); - *nM = *nE = 0; - *rE = 0.0; - } - else if ( hStartGiven && hEndGiven && !hMaxGiven ) { -/* Both a start and an end section */ - error = twoSideSpacing( width, hS, hE, rW, rS, rE, nS, nE ); - *nM = 0; - } - else if ( hStartGiven && !hEndGiven && hMaxGiven ) { -/* Limited size in end section */ - error = maxLimSpacing( width, hS, hM, rW, rS, nS, nM ); - *nE = 0; - *rE = 1.0; - } - else if (!hStartGiven && hEndGiven && hMaxGiven ) { -/* Limited size in start section */ - error = maxLimSpacing( width, hE, hM, rW, rE, nE, nM ); - *nS = 0; - *rS = 1.0; - } - else if ( hStartGiven && hEndGiven && hMaxGiven ) { -/* Limited size somewhere in the middle */ - /* NOT IMPLEMENTED */ - /* - error = midLimSpacing( width, hS, hE, hM, rW, rS, rE, nS, nE, nM ); - */ - error = E_PRIVATE; - } - else { -/* Illegal situations */ - error = E_PRIVATE; - } - - return( error ); -} - - - -/* - * Name: stepsInSpan - * Purpose: Finds the number of steps needed to go a given distance - * while increasing each step by a given ratio. - * Formals: < I > width: size of total distance - * < I > spacing: size of initial step - * < O > ratio: increase with each step - * Returns: number of steps - * Users: spacing routines - * Calls: log - */ -static double -stepsInSpan(double width, double spacing, double ratio) -{ - double nSpaces; - -/* Handle ratios near 1.0 specially. */ - if ( ABS(ratio - 1.0) < 1.0e-4 ) { - nSpaces = (width/spacing); - } - else { - nSpaces = (log(1.0-width*(1.0-ratio)/spacing)/log(ratio)); - } - return(nSpaces); -} - - -/* - * Name: oneSideSpacing - * Purpose: Find compatible number of spaces and ratio when the spacing - * is constrained at one end of a span. - * Formals: < I > width: width of the span - * < I > spacing: spacing constraint - * < I > rWanted: ideal ratio of one spacing to the next - * < O > rFound: actual ratio discovered - * < O > nFound: number of spaces found - * Returns: OK / E_PRIVATE - * Users: MESHspacing - * Calls: oneSideRatio, stepsInSpan - */ -static int -oneSideSpacing(double width, double spacing, double rWanted, double *rFound, - int *nFound) -{ - int nSpaces; /* Number of spaces */ - double rTemp1, rTemp2; /* For temporarily calc'ed ratios */ - -/* Make sure we can take at least one step. */ - if ( width < spacing ) { - SPfrontEnd->IFerrorf( ERR_WARNING, "one-sided spacing can't find an acceptable solution\n"); - *rFound = 0.0; - *nFound = 0; - return(E_PRIVATE); - } - - nSpaces = (int)stepsInSpan( width, spacing, rWanted ); - -/* Check to see whether a flat span is acceptable. */ - if ( ABS(nSpaces*spacing - width) < 1.0e-3*spacing ) { - *rFound = 1.0; - *nFound = nSpaces; - return( OK ); - } - else if ( ABS((nSpaces+1)*spacing - width) < 1.0e-3*spacing ) { - *rFound = 1.0; - *nFound = nSpaces + 1; - return( OK ); - } - -/* Too much error involved in flat span means we have to ramp up. */ - rTemp1 = rTemp2 = rWanted; - oneSideRatio( width, spacing, &rTemp1, nSpaces ); - oneSideRatio( width, spacing, &rTemp2, nSpaces+1 ); - if ( (rTemp1 == 0.0) && (rTemp2 == 0.0) ) { - SPfrontEnd->IFerrorf( ERR_WARNING, "one-sided spacing can't find an acceptable solution\n"); - *rFound = 0.0; - *nFound = 0; - return(E_PRIVATE); - } - else if (rTemp1 == 0.0) { - *rFound = rTemp2; - *nFound = nSpaces + 1; - } - else if (rTemp2 == 0.0) { - *rFound = rTemp1; - *nFound = nSpaces; - } - else if (ABS(rWanted-rTemp2) < 4.0*ABS(rWanted-rTemp1)) { - *rFound = rTemp2; - *nFound = nSpaces + 1; - } - else { - *rFound = rTemp1; - *nFound = nSpaces; - } - return(OK); -} - - - -/* - * Name: oneSideRatio - * Purpose: Compute the unique ratio 'r' which satisfies the following - * constraint: w = hs*(1-r^ns)/(1-r) - * Formals: < I > w : width of a span - * < I > hs: step at one end of the span - * argRatio: ratio found, contains initial guess at entry - * < I > ns: number of spaces to use in the span - * Returns: OK / E_PRIVATE - * Users: oneSideSpacing, maxLimSpacing - * Calls: error-message handler - */ -static int -oneSideRatio(double w, double hs, double *argRatio, int ns) -{ - double funcLow, funcUpp, func; - double ratLow, ratUpp, ratio = *argRatio; - double dns = (double)ns; - int i; - -/* Get lower bound on solution. */ - ratLow = 0.0; - funcLow = hs - w; - if ((funcLow > 0.0) || ((funcLow < 0.0)&&(ns <= 1))) { - *argRatio = 0.0; - return(E_PRIVATE); - } - -/* Find upper bound on solution. */ - ratUpp = ratio; - do { - ratUpp += 0.2; - funcUpp = hs*geomSum(ratUpp, dns) - w; - } while (funcUpp < 0.0); - -/* Do bisections to find new ratio. */ - for ( i=0; i < RAT_LIM; i++ ) { - ratio = ratLow + 0.5 * (ratUpp - ratLow); - func = hs*geomSum(ratio, dns) - w; - if ((func == 0.0) || (ratUpp - ratLow < RAT_TOL)) break; - - funcLow = hs*geomSum(ratLow, dns) - w; - if (funcLow*func > 0.0) { - ratLow = ratio; - } - else { - ratUpp = ratio; - } - } - - if (i == RAT_LIM) { /* No solution found */ - *argRatio = 0.0; - return(E_PRIVATE); - } - else { - *argRatio = ratio; - return(OK); - } -} - - - -/* Name: quadRoots - * Purpose: Find real roots of a quadratic equation if they exist. - * Formals: < I > a, b, c: coefficients in ax^2+bx+c - * < O > rp: the root using the positive sqrt value - * < O > rn: the root using the negative sqrt value - * Returns: TRUE / FALSE - * Users: general - * Calls: sqrt - */ -static int -quadRoots(double a, double b, double c, double *rp, double *rn) -{ - double d; /* Discriminant */ - double f; /* Root factor */ - - if (a == 0.0) return(FALSE); - - if (b == 0.0) { - d = -c/a; - if (d >= 0.0) { - *rn = - (*rp = sqrt(d)); - } - else { - return(FALSE); - } - } - else { - d = 1.0 - 4*a*c/(b*b); - if (d >= 0.0) { - f = (1.0 + sqrt(d))/2.0; - *rp = - (b*f)/a; - *rn = - c/(b*f); - } - else { - return(FALSE); - } - } - return(TRUE); -} - - -/* - * Name: twoSideSpacing - * Purpose: Find a compatible set of ratios and node numbers when the - * spacing is constrained at both ends of a span. - * Formals: < I > width: size the span - * < I > hStart: spacing at start of span - * < I > hEnd: spacing at end of span - * < I > rWanted: desired ratio of spacings - * < O > rSfound: ratio found for start of span - * < O > rEfound: ratio found for end of span - * < O > nSfound: number of start spaces - * < O > nEfound: number of end spaces - * Returns: OK / E_PRIVATE - * Users: MESHspacing - * Calls: twoSideRatio, error-message handler - */ -static int -twoSideSpacing(double width, double hStart, double hEnd, double rWanted, - double *rSfound, double *rEfound, int *nSfound, int *nEfound) -{ - int nSpaceS; /* Number of spaces at the start */ - int nSpaceE; /* Number of spaces at the end */ - int nSpaceT; /* Number of spaces total */ - double dSpaceS; /* Exact value of nSpaceS */ - double dSpaceE; /* Exact value of nSpaceE */ - double dSpaceT; /* Exact value of nSpaceT */ - double dDiff; /* Difference between dSpaceS & dSpaceE */ - double remaining; /* Length of span between hs and he */ - double rTempS = 0.0, rTempE = 0.0; /* For temporarily calc'ed ratios */ - double hsLast, heLast; /* Used to ensure ratio is valid */ - double rConnect; /* " */ - double hMax, hMin; /* Max and min between hStart and hEnd */ - double tmp; - int i; /* Indices for searching for best ratio */ - int solnFound; /* For partial search termination */ - int solnError; /* For partial search termination */ - int nSaveS = 0; /* Saves best solution so far */ - int nSaveE = 0; /* " */ - double rSaveS = 0.0; /* " */ - double rSaveE = 0.0; /* " */ - -/* - * It's an error if there isn't enough width to fit in both spaces. - */ - remaining = width - (hStart + hEnd); - if (remaining < 0.0) { - SPfrontEnd->IFerrorf( ERR_WARNING, "two-sided spacing can't find an acceptable solution\n"); - *rSfound = *rEfound = 0.0; - *nSfound = *nEfound = 0; - return(E_PRIVATE); - } - -/* Adjust ratio wanted to acceptable limits, and find number of extra spaces - * needed to bring the smaller ratio up to the size of the bigger one. - */ - hMax = MAX( hStart, hEnd ); - hMin = MIN( hStart, hEnd ); - - if ( hMax == hMin ) { - dDiff = 0.0; - } - else { -/* Does a solution exist if we allow the number of spaces to take on - * a non-integral value? - * If not, then adjust the ratio to lie within acceptable bounds. - * Since the choice of whether or not to require a peak in the plot - * of "spacing vs number" is arbitrary, both cases are checked, and - * the one that gives the closest answer to the original ratio - * is chosen. The function quadRoots is used to find limits for the - * ratio in the peaked case. The unpeaked case can find a lower - * bound more easily. - */ - if (quadRoots( hMax, hMax - width, remaining, &rTempS, &rTempE )) { - rWanted = MIN(rWanted, rTempS); - rTempS = 1.0 + (hMax - hMin)/(width - hMax); - rWanted = MAX(rWanted, rTempS); - if ((rWanted != rTempS) && (rTempE > rWanted)) { - if (ABS(rWanted - rTempE) < 4.0*ABS(rWanted - rTempS)) { - rWanted = rTempE; - } - else { - rWanted = rTempS; - } - } - } - else { /* Complex roots */ - rTempS = 1.0 + (hMax - hMin)/(width - hMax); - rWanted = MAX(rWanted, rTempS); - } - dDiff = log(hMax/hMin)/log(rWanted); - dDiff *= ( hStart < hEnd ) ? -1.0 : 1.0; - } - -/* Find the number of spaces at the start and at the end. */ -/* Handle ratio near 1.0 carefully. */ - if ( ABS(rWanted - 1.0) < 1.0e-4 ) { - dSpaceS = (width - dDiff*hEnd)/(hStart+hEnd); - } - else { - tmp = (hStart+hEnd-width+width*rWanted)/ - (hStart+hEnd*pow(rWanted,dDiff)); - dSpaceS = log(tmp)/log(rWanted); - } - dSpaceE = dSpaceS + dDiff; - dSpaceT = dSpaceS + dSpaceE; - -/* Search until an acceptable solution is found. Some - * cases may be repeated, but no harm is done. - */ - for (i = 0; i <= 1; i++) { - nSpaceT = (int)dSpaceT + i; -/* Guess a starting point which is guaranteed to have a solution. */ - nSpaceS = MIN( nSpaceT - 1, MAX( 4, (int) dSpaceS) ); - nSpaceE = nSpaceT - nSpaceS; - - solnFound = solnError = FALSE; - while ( !solnFound ) { - -/* Take care of special cases first. */ - if ((nSpaceE <= 0) || (nSpaceS <= 0)) { - solnError = TRUE; - } - else if (nSpaceT == 2) { /* Check for exact fit */ - if (ABS(remaining) < 1.0e-3*hMax ) { - rTempS = hEnd / hStart; - rTempE = 1.0 / rTempS; - nSpaceS = nSpaceE = 1; - } - else { - solnError = TRUE; - } - } - else if (nSpaceT == 3) { /* Trivial to solve */ - if (remaining > 0.0) { - rTempS = remaining / hStart; - rTempE = remaining / hEnd; - nSpaceS = 2; /* Always put middle space at start */ - nSpaceE = 1; - } - else { - solnError = TRUE; - } - } - else { /* Finally, the general case */ - if (remaining > 0.0) { - rTempS = rWanted; - twoSideRatio( width, hStart, hEnd, &rTempS, nSpaceS, nSpaceE ); - rTempE = rTempS; - } - else { - solnError = TRUE; - } - } - - if ( solnError ) - break; /* while loop */ - -/* Check whether the ratio discovered is good or not. */ - hsLast = hStart*pow(rTempS, (double)nSpaceS-1.0); - heLast = hEnd*pow(rTempE, (double)nSpaceE-1.0); - rConnect = heLast/hsLast; - if ( rConnect < 1.0/rTempE - RAT_TOL ) { - nSpaceS--; - nSpaceE++; - } - else if ( rConnect > rTempS + RAT_TOL ) { - nSpaceS++; - nSpaceE--; - } - else { - solnFound = TRUE; -/* Save if this solution is better than the previous one. */ - if (ABS(rWanted - rTempS) <= ABS(rWanted - rSaveS)) { - rSaveS = rTempS; - rSaveE = rTempE; - nSaveS = nSpaceS; - nSaveE = nSpaceE; - } - } - } - } - -/* Prepare return values. */ - if (rSaveS == 0.0) { - SPfrontEnd->IFerrorf( ERR_WARNING, "two-sided spacing can't find an acceptable solution\n"); - *rSfound = *rEfound = 0.0; - *nSfound = *nEfound = 0; - return(E_PRIVATE); - } - else { - *rSfound = rSaveS; - *rEfound = rSaveE; - *nSfound = nSaveS; - *nEfound = nSaveE; - return(OK); - } -} - - - -/* - * Name: twoSideRatio - * Purpose: Finds the unique ratio 'r' which satisfies the - * constraint: - * w = hs*(1-r^ns)/(1-r) + he*(1-r^ne)/(1-r) - * Formals: < I > w: size of a span - * < I > hs: spacing at start of span - * < I > he: spacing at end of span - * argRatio: returns r, contains initial guess for r - * < I > ns: number of steps to take at start - * < I > ne: number of steps to take at end - * Returns: OK / E_PRIVATE - * Users: twoSideSpacing - * Calls: error-message handler - */ -static int -twoSideRatio(double w, double hs, double he, double *argRatio, int ns, - int ne) -{ - double funcLow, funcUpp, func; - double ratLow, ratUpp, ratio = *argRatio; - double dns = (double)ns; - double dne = (double)ne; - int i; - -/* Get lower bound on solution. */ - ratLow = 0.0; - funcLow = hs + he - w; - if ((funcLow > 0.0) || ((funcLow < 0.0) && (MAX(ns,ne) <= 1))) { - *argRatio = 0.0; - return(E_PRIVATE); - } - -/* Find upper bound on solution. */ - ratUpp = ratio; - do { - ratUpp += 0.2; - funcUpp = hs*geomSum(ratUpp, dns) + he*geomSum(ratUpp, dne) - w; - } while (funcUpp < 0.0); - -/* Do bisections to find new ratio. */ - for ( i=0; i < RAT_LIM; i++ ) { - ratio = ratLow + 0.5 * (ratUpp - ratLow); - func = hs*geomSum(ratio, dns) + he*geomSum(ratio, dne) - w; - if ((func == 0.0) || (ratUpp - ratLow < RAT_TOL)) break; - - funcLow = hs*geomSum(ratLow, dns) + he*geomSum(ratLow, dne) - w; - if (funcLow*func > 0.0) { - ratLow = ratio; - } - else { - ratUpp = ratio; - } - } - - if (i == RAT_LIM) { /* No solution found */ - *argRatio = 0.0; - return(E_PRIVATE); - } - else { - *argRatio = ratio; - return(OK); - } -} - - - -/* - * Name: maxLimSpacing - * Purpose: Find compatible number of spaces and ratio when the spacing - * is constrained at start of a span, and has to be smaller - * than a user-specified maximum at the end. - * Formals: < I > width: width of the span - * < I > hStart: spacing constraint at one end - * < I > hMax: maximum spacing allowable - * < I > rWanted: ideal ratio of one spacing to the next - * < O > rFound: actual ratio discovered - * < O > nSfound: number of start spaces - * < O > nMfound: number of maximum spaces - * Returns: OK / E_PRIVATE - * Users: MESHspacing - * Calls: oneSideRatio, stepsInSpan - */ -static int -maxLimSpacing(double width, double hStart, double hMax, double rWanted, - double *rFound, int *nSfound, int *nMfound) -{ - int nSpaceS; /* Number of spaces at the start */ - int nSpaceM; /* Number of spaces with maximum size */ - int nSpaceT; /* Total number of spaces */ - double dSpaceS; /* Exact number of start spaces needed */ - double dSpaceM; /* Exact number of max spaces needed */ - double dSpaceT; /* Exact total number of spaces */ - double rTempS; /* For temporarily calc'ed ratio */ - double remaining; /* Width taken up by start spaces */ - double rConnect, hBiggest = 0.0; /* Used to ensure ratio is valid */ - double rSaveS = 0.0; /* Saves best solution so far */ - int nSaveS = 0; /* " */ - int nSaveM = 0; /* " */ - int i; /* Searching indices */ - int solnFound; /* For partial search termination */ - int solnError; /* For partial search termination */ - -/* Compute the ratio needed to exactly go from hStart to hMax - * in the given width. If hMax is really big, then we know - * the spaces can't exceed it. - */ - if ( width > hMax ) { - rTempS = 1.0 + (hMax - hStart)/(width - hMax); - } - else { - rTempS = 1.0e6; /* an impossibly large value */ - } - - if (rWanted <= rTempS) { /* Spacings stay below maximum allowed */ - dSpaceS = stepsInSpan( width, hStart, rWanted ); - dSpaceM = 0.0; - } - else { -/* Find number of spaces needed to increase hStart to hMax. */ - dSpaceS = log(hMax/hStart)/log(rWanted); - remaining = hStart*geomSum(rWanted, dSpaceS); - dSpaceM = (width - remaining)/hMax; - } - dSpaceT = dSpaceS + dSpaceM; - -/* Search until an acceptable solution is found. Some - * cases may be repeated, but no harm is done. - */ - for (i = 0; i <= 1; i++) { - nSpaceT = (int)dSpaceT + i; -/* Guess a starting point which is guaranteed to have a solution. */ - nSpaceS = MIN( nSpaceT, MAX( 3, (int) dSpaceS) ); - nSpaceM = nSpaceT - nSpaceS; - - solnFound = solnError = FALSE; - while ( !solnFound ) { - remaining = width - hMax*nSpaceM; - -/* Test for the various special cases first. */ - if ( nSpaceM < 0 || nSpaceS <= 0 ) { - solnError = TRUE; - } - else if (nSpaceS == 1) { /* check for exact fit */ - if ( ABS(remaining - hStart) < 1.0e-3*hStart ) { - hBiggest = hStart; - if (nSpaceM == 0) { - rTempS = 1.0; - } - else { - rTempS = hMax / hStart; - } - } - else { - solnError = TRUE; - } - } - else if (nSpaceS == 2) { /* Easy to solve */ - if (remaining > hStart) { - hBiggest = remaining - hStart; - rTempS = hBiggest / hStart; - } - else { - solnError = TRUE; - } - } - else { - if (remaining > hStart) { - rTempS = rWanted; - oneSideRatio( remaining, hStart, &rTempS, nSpaceS ); - hBiggest = hStart*pow(rTempS, (double)nSpaceS - 1.0); - } - else { - solnError = TRUE; - } - } - - if ( solnError ) - break; /* while loop */ - - rConnect = hMax / hBiggest; - if ( rConnect < 1.0 - RAT_TOL ) { - nSpaceS--; - nSpaceM++; - } - else if ( (rConnect > rTempS + RAT_TOL) && nSpaceM != 0 ) { - nSpaceS++; - nSpaceM--; - } - else { - solnFound = TRUE; -/* Save solution if it's better. */ - if ( (rTempS >= 1.0 - RAT_TOL) - && ABS(rWanted - rTempS) <= ABS(rWanted - rSaveS)) { - rSaveS = rTempS; - nSaveS = nSpaceS; - nSaveM = nSpaceM; - } - } - } - } - -/* Prepare return values. */ - if (rSaveS == 0.0) { - SPfrontEnd->IFerrorf( ERR_WARNING, "max-limited spacing can't find an acceptable solution\n"); - *rFound = 0.0; - *nSfound = *nMfound = 0; - return(E_PRIVATE); - } - else { - *rFound = rSaveS; - *nSfound = nSaveS; - *nMfound = nSaveM; - return(OK); - } -} diff --git a/src/ciderlib/input/method.c b/src/ciderlib/input/method.c deleted file mode 100644 index 5182e1fd5..000000000 --- a/src/ciderlib/input/method.c +++ /dev/null @@ -1,114 +0,0 @@ -/********** -Copyright 1991 Regents of the University of California. All rights reserved. -Author: 1991 David A. Gates, U. C. Berkeley CAD Group -Modified: 2001 Paolo Nenzi -**********/ - -#include "ngspice/ngspice.h" -#include "ngspice/numcards.h" -#include "ngspice/numgen.h" -#include "ngspice/numenum.h" -#include "ngspice/methdefs.h" -#include "ngspice/sperror.h" -#include "ngspice/devdefs.h" -#include "ngspice/suffix.h" - - -extern int METHnewCard(GENcard**,GENmodel*); -extern int METHparam(int,IFvalue*,GENcard*); - - -IFparm METHpTable[] = { - IP("devtol", METH_DABSTOL, IF_REAL, "Absolute tolerance on device equations"), - IP("dabstol", METH_DABSTOL, IF_REAL, "Absolute tolerance on device equations"), - IP("dreltol", METH_DRELTOL, IF_REAL, "Relative tolerance on device equations"), - IP("onecarrier",METH_ONEC, IF_FLAG, "Solve for majority carriers only"), - IP("ac.analysis",METH_ACANAL, IF_STRING, "AC solution technique"), - IP("frequency",METH_OMEGA, IF_REAL, "AC default frequency"), - IP("nomobderiv",METH_NOMOBDERIV,IF_FLAG, "Ignore mobility derivatives"), - IP("itlim", METH_ITLIM, IF_INTEGER, "Iteration limit"), - IP("voltpred",METH_VOLTPRED, IF_FLAG, "Perform DC voltage prediction") -}; - -IFcardInfo METHinfo = { - "method", - "Specify parameters and types of simulation methods", - NUMELEMS(METHpTable), - METHpTable, - - METHnewCard, - METHparam, - NULL -}; - -int -METHnewCard(GENcard **inCard, GENmodel *inModel) -{ - METHcard *tmpCard, *newCard; - GENnumModel *model = (GENnumModel *)inModel; - - tmpCard = model->GENmethods; - if (!tmpCard) { /* First in list */ - newCard = TMALLOC(METHcard, 1); - if (!newCard) { - *inCard = NULL; - return(E_NOMEM); - } - newCard->METHnextCard = NULL; - *inCard = (GENcard *) newCard; - model->GENmethods = newCard; - } else { /* Only one card of this type allowed */ - *inCard = (GENcard *)tmpCard; - } - return(OK); -} - -int -METHparam(int param, IFvalue *value, GENcard *inCard) -{ - METHcard *card = (METHcard *)inCard; - - switch (param) { - case METH_DABSTOL: - card->METHdabstol = value->rValue; - card->METHdabstolGiven = TRUE; - break; - case METH_DRELTOL: - card->METHdreltol = value->rValue; - card->METHdreltolGiven = TRUE; - break; - case METH_OMEGA: - card->METHomega = 2.0 * M_PI * value->rValue; - card->METHomegaGiven = TRUE; - break; - case METH_ONEC: - card->METHoneCarrier = value->iValue; - card->METHoneCarrierGiven = TRUE; - break; - case METH_NOMOBDERIV: - card->METHmobDeriv = !(value->iValue); - card->METHmobDerivGiven = TRUE; - break; - case METH_ACANAL: - if ( cinprefix( value->sValue, "direct", 1 ) ) { - card->METHacAnalysisMethod = DIRECT; - card->METHacAnalysisMethodGiven = TRUE; - } else if ( cinprefix( value->sValue, "sor", 1 ) ) { - card->METHacAnalysisMethod = SOR; - card->METHacAnalysisMethodGiven = TRUE; - } - break; - case METH_ITLIM: - card->METHitLim = value->iValue; - card->METHitLimGiven = TRUE; - break; - case METH_VOLTPRED: - card->METHvoltPred = value->iValue; - card->METHvoltPredGiven = TRUE; - break; - default: - return(E_BADPARM); - break; - } - return(OK); -} diff --git a/src/ciderlib/input/mobility.c b/src/ciderlib/input/mobility.c deleted file mode 100644 index 955c3f16e..000000000 --- a/src/ciderlib/input/mobility.c +++ /dev/null @@ -1,210 +0,0 @@ -/********** -Copyright 1991 Regents of the University of California. All rights reserved. -Author: 1991 David A. Gates, U. C. Berkeley CAD Group -Modified: 2001 Paolo Nenzi -**********/ - -#include "ngspice/ngspice.h" -#include "ngspice/numcards.h" -#include "ngspice/numgen.h" -#include "ngspice/numenum.h" -#include "ngspice/mobdefs.h" -#include "ngspice/sperror.h" -#include "ngspice/devdefs.h" -#include "ngspice/suffix.h" - -extern int MOBnewCard(GENcard**,GENmodel*); -extern int MOBparam(int,IFvalue*,GENcard*); - - - -IFparm MOBpTable[] = { - IP("material",MOB_MATERIAL, IF_INTEGER, "Material index"), - IP("electron",MOB_ELEC, IF_FLAG, "Electron mobility flag"), - IP("hole", MOB_HOLE, IF_FLAG, "Hole mobility flag"), - IP("majority",MOB_MAJOR, IF_FLAG, "Majority carrier flag"), - IP("minority",MOB_MINOR, IF_FLAG, "Minority carrier flag"), - IP("mumax", MOB_MUMAX, IF_REAL, "Maximum bulk mobility"), - IP("mumin", MOB_MUMIN, IF_REAL, "Minimum bulk mobility"), - IP("ntref", MOB_NTREF, IF_REAL, "Ionized impurity ref. conc."), - IP("ntexp", MOB_NTEXP, IF_REAL, "Ionized impurity exponent"), - IP("vsat", MOB_VSAT, IF_REAL, "Saturation velocity"), - IP("vwarm", MOB_VWARM, IF_REAL, "Warm carrier ref. velocity"), - IP("mus", MOB_MUS, IF_REAL, "Initial surface mobility"), - IP("ec.a", MOB_EC_A, IF_REAL, "Surf. mobility critical field"), - IP("ec.b", MOB_EC_B, IF_REAL, "Surf. mobility critical field #2"), - IP("concmodel",MOB_CONC_MOD, IF_STRING, "Concentration dep. model"), - IP("fieldmodel",MOB_FIELD_MOD,IF_STRING, "Driving field dep. model"), - IP("init", MOB_INIT, IF_FLAG, "Initialize with defaults") -}; - -IFcardInfo MOBinfo = { - "mobility", - "Specify parameters and types of mobility models", - NUMELEMS(MOBpTable), - MOBpTable, - - MOBnewCard, - MOBparam, - NULL -}; - -int -MOBnewCard(GENcard **inCard, GENmodel *inModel) -{ - MOBcard *tmpCard, *newCard; - GENnumModel *model = (GENnumModel *)inModel; - - newCard = TMALLOC(MOBcard, 1); - if (!newCard) { - *inCard = NULL; - return(E_NOMEM); - } - newCard->MOBnextCard = NULL; - *inCard = (GENcard *) newCard; - - tmpCard = model->GENmobility; - if (!tmpCard) { /* First in list */ - model->GENmobility = newCard; - } else { - /* Go to end of list */ - while (tmpCard->MOBnextCard) tmpCard = tmpCard->MOBnextCard; - /* And add new card */ - tmpCard->MOBnextCard = newCard; - } - return(OK); -} - -int -MOBparam(int param, IFvalue *value, GENcard *inCard) -{ - MOBcard *card = (MOBcard *)inCard; - - switch (param) { - case MOB_MATERIAL: - card->MOBmaterial = value->iValue; - card->MOBmaterialGiven = TRUE; - break; - case MOB_ELEC: - if ( value->iValue ) { - card->MOBcarrier = ELEC; - card->MOBcarrierGiven = TRUE; - } else { - if ( card->MOBcarrier == ELEC ) { - card->MOBcarrier = -1; - card->MOBcarrierGiven = FALSE; - } - } - break; - case MOB_HOLE: - if ( value->iValue ) { - card->MOBcarrier = HOLE; - card->MOBcarrierGiven = TRUE; - } else { - if ( card->MOBcarrier == HOLE ) { - card->MOBcarrier = -1; - card->MOBcarrierGiven = FALSE; - } - } - break; - case MOB_MAJOR: - if ( value->iValue ) { - card->MOBcarrType = MAJOR; - card->MOBcarrTypeGiven = TRUE; - } else { - if ( card->MOBcarrType == MAJOR ) { - card->MOBcarrType = -1; - card->MOBcarrTypeGiven = FALSE; - } - } - break; - case MOB_MINOR: - if ( value->iValue ) { - card->MOBcarrType = MINOR; - card->MOBcarrTypeGiven = TRUE; - } else { - if ( card->MOBcarrType == MINOR ) { - card->MOBcarrType = -1; - card->MOBcarrTypeGiven = FALSE; - } - } - break; - case MOB_MUMAX: - card->MOBmuMax = value->rValue; - card->MOBmuMaxGiven = TRUE; - break; - case MOB_MUMIN: - card->MOBmuMin = value->rValue; - card->MOBmuMinGiven = TRUE; - break; - case MOB_NTREF: - card->MOBntRef = value->rValue; - card->MOBntRefGiven = TRUE; - break; - case MOB_NTEXP: - card->MOBntExp = value->rValue; - card->MOBntExpGiven = TRUE; - break; - case MOB_VSAT: - card->MOBvSat = value->rValue; - card->MOBvSatGiven = TRUE; - break; - case MOB_VWARM: - card->MOBvWarm = value->rValue; - card->MOBvWarmGiven = TRUE; - break; - case MOB_MUS: - card->MOBmus = value->rValue; - card->MOBmusGiven = TRUE; - break; - case MOB_EC_A: - card->MOBecA = value->rValue; - card->MOBecAGiven = TRUE; - break; - case MOB_EC_B: - card->MOBecB = value->rValue; - card->MOBecBGiven = TRUE; - break; - case MOB_CONC_MOD: - if ( cinprefix( value->sValue, "ct", 1 ) ) { - card->MOBconcModel = CT; - card->MOBconcModelGiven = TRUE; - } else if ( cinprefix( value->sValue, "ar", 1 ) ) { - card->MOBconcModel = AR; - card->MOBconcModelGiven = TRUE; - } else if ( cinprefix( value->sValue, "uf", 1 ) ) { - card->MOBconcModel = UF; - card->MOBconcModelGiven = TRUE; - } else if ( cinprefix( value->sValue, "sg", 1 ) ) { - card->MOBconcModel = SG; - card->MOBconcModelGiven = TRUE; - } else if ( cinprefix( value->sValue, "ga", 1 ) ) { - card->MOBconcModel = GA; - card->MOBconcModelGiven = TRUE; - } - break; - case MOB_FIELD_MOD: - if ( cinprefix( value->sValue, "ct", 1 ) ) { - card->MOBfieldModel = CT; - card->MOBfieldModelGiven = TRUE; - } else if ( cinprefix( value->sValue, "ar", 1 ) ) { - card->MOBfieldModel = AR; - card->MOBfieldModelGiven = TRUE; - } else if ( cinprefix( value->sValue, "sg", 1 ) ) { - card->MOBfieldModel = SG; - card->MOBfieldModelGiven = TRUE; - } else if ( cinprefix( value->sValue, "ga", 1 ) ) { - card->MOBfieldModel = GA; - card->MOBfieldModelGiven = TRUE; - } - break; - case MOB_INIT: - card->MOBinit = value->iValue; - card->MOBinitGiven = TRUE; - break; - default: - return(E_BADPARM); - break; - } - return(OK); -} diff --git a/src/ciderlib/input/mobset.c b/src/ciderlib/input/mobset.c deleted file mode 100644 index 7a207a870..000000000 --- a/src/ciderlib/input/mobset.c +++ /dev/null @@ -1,151 +0,0 @@ -/********** -Copyright 1991 Regents of the University of California. All rights reserved. -Author: 1991 David A. Gates, U. C. Berkeley CAD Group -Modified: 2001 Paolo Nenzi -**********/ - -#include "ngspice/ngspice.h" -#include "ngspice/cktdefs.h" -#include "ngspice/numconst.h" -#include "ngspice/numenum.h" -#include "ngspice/mobdefs.h" -#include "ngspice/material.h" -#include "ngspice/sperror.h" -#include "ngspice/suffix.h" -#include "ngspice/cidersupt.h" - -extern int MOBcheck( MOBcard *, MaterialInfo * ); -extern int MOBsetup( MOBcard *, MaterialInfo * ); - -/* - * Name: MOBcheck - * Purpose: checks a list of MOBcards for input errors - * Formals: cardList: the list to check - * Returns: OK/E_PRIVATE - * Users: numerical device setup routines - * Calls: error message handler - */ -int -MOBcheck(MOBcard *cardList, MaterialInfo *matlList) -{ - MOBcard *card; - MATLmaterial *matl; - int cardNum = 0; - int error = OK; - - for ( card = cardList; card != NULL; card = card->MOBnextCard ) { - cardNum++; - if (!card->MOBmaterialGiven) { - SPfrontEnd->IFerrorf( ERR_WARNING, "mobility card %d is missing a material index", cardNum ); - error = E_PRIVATE; - } else { - /* Make sure the material exists */ - for ( matl = matlList; matl != NULL; matl = matl->next ) { - if ( card->MOBmaterial == matl->id ) { - break; - } - } - if (matl == NULL) { - SPfrontEnd->IFerrorf( ERR_WARNING, "mobility card %d specifies a non-existent material", cardNum ); - error = E_PRIVATE; - } - } - if (!card->MOBcarrierGiven) { - card->MOBcarrier = ELEC; - } - if (!card->MOBcarrTypeGiven) { - card->MOBcarrType = MAJOR; - } - if (!card->MOBinitGiven) { - card->MOBinit = FALSE; - } - -/* Return now if anything has failed */ - if (error) return(error); - - } - return(OK); -} - - - -/* - * Name: MOBsetup - * Purpose: setup the mobility model parameters - * Formals: cardList: list of cards to setup - * Returns: OK/E_PRIVATE - * Users: numerical devices - * Calls: MOBcheck - */ -int -MOBsetup(MOBcard *cardList, MaterialInfo *materialList) -{ - MOBcard *card; - MATLmaterial *matl; - int error; - -/* Check the card list */ - if ((error = MOBcheck( cardList, materialList )) != 0) return( error ); - - for ( card = cardList; card != NULL; card = card->MOBnextCard ) { - - /* Find the right material */ - for ( matl = materialList; matl != NULL; matl = matl->next ) { - if ( card->MOBmaterial == matl->id ) { - break; - } - } - - /* Default models depend on previous value */ - if (!card->MOBconcModelGiven) { - card->MOBconcModel = matl->concModel; - } - if (!card->MOBfieldModelGiven) { - card->MOBfieldModel = matl->fieldModel; - } - - /* Load in default values if desired */ - if ( card->MOBinitGiven ) { - MOBdefaults( matl, card->MOBcarrier, card->MOBcarrType, - card->MOBconcModel, card->MOBfieldModel ); - } - - /* Override defaults */ - if ( card->MOBconcModelGiven ) { - matl->concModel = card->MOBconcModel; - } - if ( card->MOBfieldModelGiven ) { - matl->fieldModel = card->MOBfieldModel; - } - if ( card->MOBmuMaxGiven ) { - matl->muMax[card->MOBcarrier][card->MOBcarrType] = card->MOBmuMax; - } - if ( card->MOBmuMinGiven ) { - matl->muMin[card->MOBcarrier][card->MOBcarrType] = card->MOBmuMin; - } - if ( card->MOBntRefGiven ) { - matl->ntRef[card->MOBcarrier][card->MOBcarrType] = card->MOBntRef; - } - if ( card->MOBntExpGiven ) { - matl->ntExp[card->MOBcarrier][card->MOBcarrType] = card->MOBntExp; - } - if ( card->MOBvSatGiven ) { - matl->vSat[card->MOBcarrier] = card->MOBvSat; - } - if ( card->MOBvWarmGiven ) { - matl->vWarm[card->MOBcarrier] = card->MOBvWarm; - } - if ( card->MOBmusGiven ) { - matl->mus[card->MOBcarrier] = card->MOBmus; - } - if ( card->MOBecAGiven ) { - matl->thetaA[card->MOBcarrier] = 1.0 / MAX( card->MOBecA, 1e-20 ); - } - if ( card->MOBecBGiven ) { - matl->thetaB[card->MOBcarrier] = 1.0 / MAX( ABS(card->MOBecB), 1e-20 ); - matl->thetaB[card->MOBcarrier] *= matl->thetaB[card->MOBcarrier]; - matl->thetaB[card->MOBcarrier] *= SGN( card->MOBecB ); - } - } - return( OK ); -} diff --git a/src/ciderlib/input/models.c b/src/ciderlib/input/models.c deleted file mode 100644 index ac3d70df6..000000000 --- a/src/ciderlib/input/models.c +++ /dev/null @@ -1,133 +0,0 @@ -/********** -Copyright 1991 Regents of the University of California. All rights reserved. -Author: 1991 David A. Gates, U. C. Berkeley CAD Group -Modified: 2001 Paolo Nenzi -**********/ - -#include "ngspice/ngspice.h" -#include "ngspice/numcards.h" -#include "ngspice/numgen.h" -#include "ngspice/modldefs.h" -#include "ngspice/devdefs.h" -#include "ngspice/sperror.h" -#include "ngspice/suffix.h" - -extern int MODLnewCard(GENcard**,GENmodel*); -extern int MODLparam(int,IFvalue*,GENcard*); - - -IFparm MODLpTable[] = { - IP("bgn", MODL_BGNW, IF_FLAG, "Bandgap narrowing"), - IP("bgnw", MODL_BGNW, IF_FLAG, "Bandgap narrowing"), - IP("tmpmob", MODL_TEMPMOB, IF_FLAG, "Temp-dependent mobility"), - IP("tempmob", MODL_TEMPMOB, IF_FLAG, "Temp-dependent mobility"), - IP("conmob", MODL_CONCMOB, IF_FLAG, "Conc-dependent mobility"), - IP("concmob", MODL_CONCMOB, IF_FLAG, "Conc-dependent mobility"), - IP("fldmob", MODL_FIELDMOB, IF_FLAG, - "Lateral-field-dependent mobility"), - IP("fieldmob",MODL_FIELDMOB, IF_FLAG, - "Lateral-field-dependent mobility"), - IP("trfmob",MODL_TRANSMOB, IF_FLAG, - "Transverse-field-dependent surface mobility"), - IP("transmob",MODL_TRANSMOB, IF_FLAG, - "Transverse-field-dependent surface mobility"), - IP("srfmob", MODL_SURFMOB, IF_FLAG, "Activate surface mobility"), - IP("surfmob", MODL_SURFMOB, IF_FLAG, "Activate surface mobility"), - IP("matchmob",MODL_MATCHMOB, IF_FLAG, - "Matching low-field surface/bulk mobilities"), - IP("srh", MODL_SRH, IF_FLAG, "SRH recombination"), - IP("consrh", MODL_CONCTAU, IF_FLAG, "Conc-dependent SRH recomb"), - IP("conctau", MODL_CONCTAU, IF_FLAG, "Conc-dependent SRH recomb"), - IP("auger", MODL_AUGER, IF_FLAG, "Auger recombination"), - IP("avalanche",MODL_AVAL, IF_FLAG, "Local avalanche generation") -}; - -IFcardInfo MODLinfo = { - "models", - "Specify which physical models should be simulated", - NUMELEMS(MODLpTable), - MODLpTable, - - MODLnewCard, - MODLparam, - NULL -}; - -int -MODLnewCard(GENcard **inCard, GENmodel *inModel) -{ - MODLcard *tmpCard, *newCard; - GENnumModel *model = (GENnumModel *)inModel; - - tmpCard = model->GENmodels; - if (!tmpCard) { /* First in list */ - newCard = TMALLOC(MODLcard, 1); - if (!newCard) { - *inCard = NULL; - return(E_NOMEM); - } - newCard->MODLnextCard = NULL; - *inCard = (GENcard *) newCard; - model->GENmodels = newCard; - } else { /* Only one card of this type allowed */ - *inCard = (GENcard *) tmpCard; - } - return(OK); -} - -int -MODLparam(int param, IFvalue *value, GENcard *inCard) -{ - MODLcard *card = (MODLcard *)inCard; - - switch (param) { - case MODL_BGNW: - card->MODLbandGapNarrowing = value->iValue; - card->MODLbandGapNarrowingGiven = TRUE; - break; - case MODL_TEMPMOB: - card->MODLtempDepMobility = value->iValue; - card->MODLtempDepMobilityGiven = TRUE; - break; - case MODL_CONCMOB: - card->MODLconcDepMobility = value->iValue; - card->MODLconcDepMobilityGiven = TRUE; - break; - case MODL_TRANSMOB: - card->MODLtransDepMobility = value->iValue; - card->MODLtransDepMobilityGiven = TRUE; - break; - case MODL_FIELDMOB: - card->MODLfieldDepMobility = value->iValue; - card->MODLfieldDepMobilityGiven = TRUE; - break; - case MODL_SURFMOB: - card->MODLsurfaceMobility = value->iValue; - card->MODLsurfaceMobilityGiven = TRUE; - break; - case MODL_MATCHMOB: - card->MODLmatchingMobility = value->iValue; - card->MODLmatchingMobilityGiven = TRUE; - break; - case MODL_SRH: - card->MODLsrh = value->iValue; - card->MODLsrhGiven = TRUE; - break; - case MODL_CONCTAU: - card->MODLconcDepLifetime = value->iValue; - card->MODLconcDepLifetimeGiven = TRUE; - break; - case MODL_AUGER: - card->MODLauger = value->iValue; - card->MODLaugerGiven = TRUE; - break; - case MODL_AVAL: - card->MODLavalancheGen = value->iValue; - card->MODLavalancheGenGiven = TRUE; - break; - default: - return(E_BADPARM); - break; - } - return(OK); -} diff --git a/src/ciderlib/input/modlset.c b/src/ciderlib/input/modlset.c deleted file mode 100644 index cf3d140e1..000000000 --- a/src/ciderlib/input/modlset.c +++ /dev/null @@ -1,90 +0,0 @@ -/********** -Copyright 1992 Regents of the University of California. All rights reserved. -Author: 1992 David A. Gates, U. C. Berkeley CAD Group -Modified: 2001 Paolo Nenzi -**********/ - -#include "ngspice/ngspice.h" -#include "ngspice/cktdefs.h" -#include "ngspice/modldefs.h" -#include "ngspice/sperror.h" -#include "ngspice/suffix.h" - -extern int MODLcheck( MODLcard * ); -extern int MODLsetup( MODLcard * ); - -/* - * Name: MODLcheck - * Purpose: checks a list of MODLcards for input errors, sets defaults - * Formals: cardList: the list to check - * Returns: OK/E_PRIVATE - * Users: numerical device setup routines - * Calls: error message handler - */ -int - MODLcheck(MODLcard *cardList) -{ - MODLcard *card; - int cardNum = 0; - - for ( card = cardList; card != NULL; card = card->MODLnextCard ) { - cardNum++; - - if ( !card->MODLbandGapNarrowingGiven ) { - card->MODLbandGapNarrowing = FALSE; - } - if ( !card->MODLtempDepMobilityGiven ) { - card->MODLtempDepMobility = FALSE; - } - if ( !card->MODLconcDepMobilityGiven ) { - card->MODLconcDepMobility = FALSE; - } - if ( !card->MODLfieldDepMobilityGiven ) { - card->MODLfieldDepMobility = FALSE; - } - if ( !card->MODLtransDepMobilityGiven ) { - card->MODLtransDepMobility = FALSE; - } - if ( !card->MODLsurfaceMobilityGiven ) { - card->MODLsurfaceMobility = FALSE; - } - if ( !card->MODLmatchingMobilityGiven ) { - card->MODLmatchingMobility = FALSE; - } - if ( !card->MODLsrhGiven ) { - card->MODLsrh = FALSE; - } - if ( !card->MODLconcDepLifetimeGiven ) { - card->MODLconcDepLifetime = FALSE; - } - if ( !card->MODLaugerGiven ) { - card->MODLauger = FALSE; - } - if ( !card->MODLavalancheGenGiven ) { - card->MODLavalancheGen = FALSE; - } - } - return(OK); -} - - - -/* - * Name: MODLsetup - * Purpose: setup the physical models used - * Formals: cardList: list of cards to setup - * Returns: OK/E_PRIVATE - * Users: numerical devices - * Calls: MODLcheck - */ -int - MODLsetup(MODLcard *cardList) -{ - int error; - - /* Check the card list */ - if ((error = MODLcheck( cardList )) != 0) return( error ); - - /* Nothing else to do. */ - return( OK ); -} diff --git a/src/ciderlib/input/optionsc.c b/src/ciderlib/input/optionsc.c deleted file mode 100644 index e8ba415fc..000000000 --- a/src/ciderlib/input/optionsc.c +++ /dev/null @@ -1,163 +0,0 @@ -/********** -Copyright 1991 Regents of the University of California. All rights reserved. -Author: 1991 David A. Gates, U. C. Berkeley CAD Group -Modified: 2001 Paolo Nenzi -**********/ - -#include "ngspice/ngspice.h" -#include "ngspice/numcards.h" -#include "ngspice/numgen.h" -#include "ngspice/optndefs.h" -#include "ngspice/devdefs.h" -#include "ngspice/sperror.h" -#include "ngspice/suffix.h" - -#define M_TO_CM 1.0e2 -#define M2_TO_CM2 (M_TO_CM * M_TO_CM) -#define UM_TO_CM 1.0e-4 -#define UM2_TO_CM2 (UM_TO_CM * UM_TO_CM) - -extern int OPTNnewCard(GENcard**,GENmodel*); -extern int OPTNparam(int,IFvalue*,GENcard*); - - - -IFparm OPTNpTable[] = { -/* Supported Types of Devices. Ideally should be automatically extracted */ - IP("resistor",OPTN_RESISTOR, IF_FLAG, "Resistor"), - IP("capacitor",OPTN_CAPACITOR, IF_FLAG, "Capacitor"), - IP("diode", OPTN_DIODE, IF_FLAG, "Diode"), - IP("bipolar", OPTN_BIPOLAR, IF_FLAG, "Bipolar Transistor"), - IP("bjt", OPTN_BIPOLAR, IF_FLAG, "Bipolar Transistor"), - IP("soibjt", OPTN_SOIBJT, IF_FLAG, "SOI Bipolar"), - IP("moscap", OPTN_MOSCAP, IF_FLAG, "MOS Capacitor"), - IP("mosfet", OPTN_MOSFET, IF_FLAG, "MOSFET"), - IP("soimos", OPTN_SOIMOS, IF_FLAG, "SOI MOSFET"), - IP("jfet", OPTN_JFET, IF_FLAG, "Junction FET"), - IP("mesfet", OPTN_MESFET, IF_FLAG, "MESFET"), -/* Various layout dimensions */ - IP("defa", OPTN_DEFA, IF_REAL, "Default Mask Area"), - IP("defw", OPTN_DEFW, IF_REAL, "Default Mask Width"), - IP("defl", OPTN_DEFL, IF_REAL, "Default Mask Length"), - IP("base.area",OPTN_BASE_AREA, IF_REAL, "1D BJT Base Area"), - IP("base.length",OPTN_BASE_LENGTH,IF_REAL, "1D BJT Base Length"), - IP("base.depth",OPTN_BASE_DEPTH, IF_REAL, "1D BJT Base Depth"), -/* Values */ - IP("tnom", OPTN_TNOM, IF_REAL, "Nominal Temperature"), -/* Device Initial Condition File */ - IP("ic.file", OPTN_IC_FILE, IF_STRING, "Initial condition file"), - IP("unique", OPTN_UNIQUE, IF_FLAG, "Generate unique filename") -}; - -IFcardInfo OPTNinfo = { - "options", - "Provide optional information and hints", - NUMELEMS(OPTNpTable), - OPTNpTable, - - OPTNnewCard, - OPTNparam, - NULL -}; - -int -OPTNnewCard(GENcard **inCard, GENmodel *inModel) -{ - OPTNcard *tmpCard, *newCard; - GENnumModel *model = (GENnumModel *)inModel; - - tmpCard = model->GENoptions; - if (!tmpCard) { /* First in list */ - newCard = TMALLOC(OPTNcard, 1); - if (!newCard) { - *inCard = NULL; - return(E_NOMEM); - } - newCard->OPTNnextCard = NULL; - *inCard = (GENcard *) newCard; - model->GENoptions = newCard; - } else { /* Only one card of this type allowed */ - *inCard = (GENcard *) tmpCard; - } - return(OK); -} - -int -OPTNparam(int param, IFvalue *value, GENcard *inCard) -{ - OPTNcard *card = (OPTNcard *)inCard; - - switch (param) { - case OPTN_RESISTOR: - card->OPTNdeviceType = OPTN_RESISTOR; - card->OPTNdeviceTypeGiven = TRUE; - break; - case OPTN_CAPACITOR: - card->OPTNdeviceType = OPTN_CAPACITOR; - card->OPTNdeviceTypeGiven = TRUE; - break; - case OPTN_DIODE: - card->OPTNdeviceType = OPTN_DIODE; - card->OPTNdeviceTypeGiven = TRUE; - break; - case OPTN_MOSCAP: - card->OPTNdeviceType = OPTN_MOSCAP; - card->OPTNdeviceTypeGiven = TRUE; - break; - case OPTN_BIPOLAR: - case OPTN_SOIBJT: /* XXX Treat SOI as normal */ - card->OPTNdeviceType = OPTN_BIPOLAR; - card->OPTNdeviceTypeGiven = TRUE; - break; - case OPTN_MOSFET: - case OPTN_SOIMOS: /* XXX Treat SOI as normal */ - card->OPTNdeviceType = OPTN_MOSFET; - card->OPTNdeviceTypeGiven = TRUE; - break; - case OPTN_JFET: - case OPTN_MESFET: /* XXX Treat MES as junction */ - card->OPTNdeviceType = OPTN_JFET; - card->OPTNdeviceTypeGiven = TRUE; - break; - case OPTN_DEFA: - card->OPTNdefa = value->rValue * M2_TO_CM2; - card->OPTNdefaGiven = TRUE; - break; - case OPTN_DEFW: - card->OPTNdefw = value->rValue * M_TO_CM; - card->OPTNdefwGiven = TRUE; - break; - case OPTN_DEFL: - card->OPTNdefl = value->rValue * M_TO_CM; - card->OPTNdeflGiven = TRUE; - break; - case OPTN_BASE_AREA: - card->OPTNbaseArea = value->rValue; - card->OPTNbaseAreaGiven = TRUE; - break; - case OPTN_BASE_LENGTH: - card->OPTNbaseLength = value->rValue * UM_TO_CM; - card->OPTNbaseLengthGiven = TRUE; - break; - case OPTN_BASE_DEPTH: - card->OPTNbaseDepth = value->rValue * UM_TO_CM; - card->OPTNbaseDepthGiven = TRUE; - break; - case OPTN_TNOM: - card->OPTNtnom = value->rValue; - card->OPTNtnomGiven = TRUE; - break; - case OPTN_IC_FILE: - card->OPTNicFile = value->sValue; - card->OPTNicFileGiven = TRUE; - break; - case OPTN_UNIQUE: - card->OPTNunique = value->iValue; - card->OPTNuniqueGiven = TRUE; - break; - default: - return(E_BADPARM); - break; - } - return(OK); -} diff --git a/src/ciderlib/input/outpset.c b/src/ciderlib/input/outpset.c deleted file mode 100644 index 800498a82..000000000 --- a/src/ciderlib/input/outpset.c +++ /dev/null @@ -1,146 +0,0 @@ -/********** -Copyright 1992 Regents of the University of California. All rights reserved. -Author: 1992 David A. Gates, U. C. Berkeley CAD Group -Modified: 2001 Paolo Nenzi -**********/ - -#include "ngspice/ngspice.h" -#include "ngspice/cktdefs.h" -#include "ngspice/numenum.h" -#include "ngspice/outpdefs.h" -#include "ngspice/sperror.h" -#include "ngspice/suffix.h" - -extern int OUTPcheck( OUTPcard * ); -extern int OUTPsetup( OUTPcard * ); - - -/* - * Name: OUTPcheck - * Purpose: checks a list of OUTPcards for input errors, sets defaults - * Formals: cardList: the list to check - * Returns: OK/E_PRIVATE - * Users: numerical device setup routines, output routines - * Calls: error message handler - */ -int - OUTPcheck(OUTPcard *cardList) -{ - OUTPcard *card; - int cardNum = 0; - - for ( card = cardList; card != NULL; card = card->OUTPnextCard ) { - cardNum++; - - card->OUTPnumVars = -1; - - if ( !card->OUTPdcDebugGiven ) { - card->OUTPdcDebug = FALSE; - } - if ( !card->OUTPtranDebugGiven ) { - card->OUTPtranDebug = FALSE; - } - if ( !card->OUTPacDebugGiven ) { - card->OUTPacDebug = FALSE; - } - if ( !card->OUTPgeomGiven ) { - card->OUTPgeom = FALSE; - } - if ( !card->OUTPmeshGiven ) { - card->OUTPmesh = FALSE; - } - if ( !card->OUTPmaterialGiven ) { - card->OUTPmaterial = FALSE; - } - if ( !card->OUTPglobalsGiven ) { - card->OUTPglobals = FALSE; - } - if ( !card->OUTPstatsGiven ) { - card->OUTPstats = TRUE; - } - if ( !card->OUTProotFileGiven ) { - card->OUTProotFile = copy(""); - } - if ( !card->OUTPfileTypeGiven ) { - card->OUTPfileType = RAWFILE; - } - if ( !card->OUTPdopingGiven ) { - card->OUTPdoping = TRUE; - } - if ( !card->OUTPpsiGiven ) { - card->OUTPpsi = TRUE; - } - if ( !card->OUTPequPsiGiven ) { - card->OUTPequPsi = FALSE; - } - if ( !card->OUTPvacPsiGiven ) { - card->OUTPvacPsi = FALSE; - } - if ( !card->OUTPnConcGiven ) { - card->OUTPnConc = TRUE; - } - if ( !card->OUTPpConcGiven ) { - card->OUTPpConc = TRUE; - } - if ( !card->OUTPphinGiven ) { - card->OUTPphin = FALSE; - } - if ( !card->OUTPphipGiven ) { - card->OUTPphip = FALSE; - } - if ( !card->OUTPphicGiven ) { - card->OUTPphic = FALSE; - } - if ( !card->OUTPphivGiven ) { - card->OUTPphiv = FALSE; - } - if ( !card->OUTPeFieldGiven ) { - card->OUTPeField = TRUE; - } - if ( !card->OUTPjcGiven ) { - card->OUTPjc = FALSE; - } - if ( !card->OUTPjdGiven ) { - card->OUTPjd = TRUE; - } - if ( !card->OUTPjnGiven ) { - card->OUTPjn = TRUE; - } - if ( !card->OUTPjpGiven ) { - card->OUTPjp = TRUE; - } - if ( !card->OUTPjtGiven ) { - card->OUTPjt = FALSE; - } - if ( !card->OUTPuNetGiven ) { - card->OUTPuNet = FALSE; - } - if ( !card->OUTPmunGiven ) { - card->OUTPmun = FALSE; - } - if ( !card->OUTPmupGiven ) { - card->OUTPmup = FALSE; - } - } - return(OK); -} - - -/* - * Name: OUTPsetup - * Purpose: setup the output card - * Formals: cardList: list of cards to setup - * Returns: OK/E_PRIVATE - * Users: numerical devices - * Calls: OUTPcheck - */ -int - OUTPsetup(OUTPcard *cardList) -{ - int error; - - /* Check the card list */ - if ((error = OUTPcheck( cardList )) != 0) return( error ); - - return( OK ); -} diff --git a/src/ciderlib/input/output.c b/src/ciderlib/input/output.c deleted file mode 100644 index b6d00da49..000000000 --- a/src/ciderlib/input/output.c +++ /dev/null @@ -1,242 +0,0 @@ -/********** -Copyright 1992 Regents of the University of California. All rights reserved. -Author: 1992 David A. Gates, U. C. Berkeley CAD Group -Modified: 2001 Paolo Nenzi -**********/ - -#include "ngspice/ngspice.h" -#include "ngspice/numcards.h" -#include "ngspice/numgen.h" -#include "ngspice/numenum.h" -#include "ngspice/outpdefs.h" -#include "ngspice/devdefs.h" -#include "ngspice/sperror.h" -#include "ngspice/suffix.h" -#include "../misc/tilde.h" - -extern int OUTPnewCard(GENcard**,GENmodel*); -extern int OUTPparam(int,IFvalue*,GENcard*); - - -IFparm OUTPpTable[] = { -/* Debugging Flags */ - IP("all.debug",OUTP_ALL_DEBUG,IF_FLAG, "Debug All Analyses"), - IP("op.debug",OUTP_DC_DEBUG, IF_FLAG, "Debug DC/OP Analyses"), - IP("dc.debug",OUTP_DC_DEBUG, IF_FLAG, "Debug DC/OP Analyses"), - IP("tran.debug",OUTP_TRAN_DEBUG,IF_FLAG, "Debug TRAN Analysis"), - IP("ac.debug",OUTP_AC_DEBUG, IF_FLAG, "Debug AC/PZ Analyses"), - IP("pz.debug",OUTP_AC_DEBUG, IF_FLAG, "Debug AC/PZ Analyses"), -/* General Information */ - IP("geometry",OUTP_GEOM, IF_FLAG, "Geometric information"), - IP("mesh", OUTP_MESH, IF_FLAG, "Mesh information"), - IP("material",OUTP_MATERIAL, IF_FLAG, "Material information"), - IP("globals", OUTP_GLOBALS, IF_FLAG, "Global information"), - IP("statistics", OUTP_STATS, IF_FLAG, "Resource usage information"), - IP("resources", OUTP_STATS, IF_FLAG, "Resource usage information"), -/* Solution Information */ - IP("rootfile", OUTP_ROOTFILE, IF_STRING, "Root of output file names"), - IP("rawfile", OUTP_RAWFILE, IF_FLAG, "SPICE rawfile data format"), - IP("hdf", OUTP_HDF, IF_FLAG, "HDF data format"), - IP("doping", OUTP_DOPING, IF_FLAG, "Net doping"), - IP("psi", OUTP_PSI, IF_FLAG, "Potential"), - IP("equ.psi", OUTP_EQU_PSI, IF_FLAG, "Equilibrium potential"), - IP("vac.psi", OUTP_VAC_PSI, IF_FLAG, "Vacuum potential"), - IP("n.conc", OUTP_N_CONC, IF_FLAG, "Electron concentration"), - IP("electrons", OUTP_N_CONC, IF_FLAG, "Electron concentration"), - IP("p.conc", OUTP_P_CONC, IF_FLAG, "Hole concentration"), - IP("holes", OUTP_P_CONC, IF_FLAG, "Hole concentration"), - IP("phin", OUTP_PHIN, IF_FLAG, "Electron quasi-fermi potential"), - IP("qfn", OUTP_PHIN, IF_FLAG, "Electron quasi-fermi potential"), - IP("phip", OUTP_PHIP, IF_FLAG, "Hole quasi-fermi potential"), - IP("qfp", OUTP_PHIP, IF_FLAG, "Hole quasi-fermi potential"), - IP("phic", OUTP_PHIC, IF_FLAG, "Conduction band potential"), - IP("band.con",OUTP_PHIC, IF_FLAG, "Conduction band potential"), - IP("phiv", OUTP_PHIV, IF_FLAG, "Valence band potential"), - IP("band.val",OUTP_PHIV, IF_FLAG, "Valence band potential"), - IP("e.field", OUTP_E_FIELD, IF_FLAG, "Electric field"), - IP("jc", OUTP_J_C, IF_FLAG, "Conduction current density"), - IP("j.conduc",OUTP_J_C, IF_FLAG, "Conduction current density"), - IP("jd", OUTP_J_D, IF_FLAG, "Displacement current density"), - IP("j.disp", OUTP_J_D, IF_FLAG, "Displacement current density"), - IP("jn", OUTP_J_N, IF_FLAG, "Electron current density"), - IP("j.electr",OUTP_J_N, IF_FLAG, "Electron current density"), - IP("jp", OUTP_J_P, IF_FLAG, "Hole current density"), - IP("j.hole", OUTP_J_P, IF_FLAG, "Hole current density"), - IP("jt", OUTP_J_T, IF_FLAG, "Total current density"), - IP("j.total", OUTP_J_T, IF_FLAG, "Total current density"), - IP("unet", OUTP_U_NET, IF_FLAG, "Net recombination"), - IP("recomb", OUTP_U_NET, IF_FLAG, "Net recombination"), - IP("mun", OUTP_MUN, IF_FLAG, "Elctron mobility"), - IP("mob.elec",OUTP_MUN, IF_FLAG, "Electron mobility"), - IP("mup", OUTP_MUP, IF_FLAG, "Hole mobility"), - IP("mob.hole",OUTP_MUP, IF_FLAG, "Hole mobility") -}; - -IFcardInfo OUTPinfo = { - "output", - "Identify information to be output to user", - NUMELEMS(OUTPpTable), - OUTPpTable, - - OUTPnewCard, - OUTPparam, - NULL -}; - -int -OUTPnewCard(GENcard **inCard, GENmodel *inModel) -{ - OUTPcard *tmpCard, *newCard; - GENnumModel *model = (GENnumModel *)inModel; - - tmpCard = model->GENoutputs; - if (!tmpCard) { /* First in list */ - newCard = TMALLOC(OUTPcard, 1); - if (!newCard) { - *inCard = NULL; - return(E_NOMEM); - } - newCard->OUTPnextCard = NULL; - *inCard = (GENcard *) newCard; - model->GENoutputs = newCard; - } else { /* Only one card of this type allowed */ - *inCard = (GENcard *) tmpCard; - } - return(OK); -} - -int -OUTPparam(int param, IFvalue *value, GENcard *inCard) -{ - OUTPcard *card = (OUTPcard *)inCard; - - switch (param) { - case OUTP_ALL_DEBUG: - card->OUTPdcDebug = value->iValue; - card->OUTPdcDebugGiven = TRUE; - card->OUTPtranDebug = value->iValue; - card->OUTPtranDebugGiven = TRUE; - card->OUTPacDebug = value->iValue; - card->OUTPacDebugGiven = TRUE; - break; - case OUTP_DC_DEBUG: - card->OUTPdcDebug = value->iValue; - card->OUTPdcDebugGiven = TRUE; - break; - case OUTP_TRAN_DEBUG: - card->OUTPtranDebug = value->iValue; - card->OUTPtranDebugGiven = TRUE; - break; - case OUTP_AC_DEBUG: - card->OUTPacDebug = value->iValue; - card->OUTPacDebugGiven = TRUE; - break; - case OUTP_GEOM: - card->OUTPgeom = value->iValue; - card->OUTPgeomGiven = TRUE; - break; - case OUTP_MESH: - card->OUTPmesh = value->iValue; - card->OUTPmeshGiven = TRUE; - break; - case OUTP_MATERIAL: - card->OUTPmaterial = value->iValue; - card->OUTPmaterialGiven = TRUE; - break; - case OUTP_GLOBALS: - card->OUTPglobals = value->iValue; - card->OUTPglobalsGiven = TRUE; - break; - case OUTP_STATS: - card->OUTPstats = value->iValue; - card->OUTPstatsGiven = TRUE; - break; - case OUTP_ROOTFILE: - card->OUTProotFile = tildexpand(value->sValue); /*xxx*/ - card->OUTProotFileGiven = TRUE; - break; - case OUTP_RAWFILE: - card->OUTPfileType = RAWFILE; - card->OUTPfileTypeGiven = TRUE; - break; - case OUTP_HDF: - return(E_UNSUPP); - break; - case OUTP_DOPING: - card->OUTPdoping = value->iValue; - card->OUTPdopingGiven = TRUE; - break; - case OUTP_PSI: - card->OUTPpsi = value->iValue; - card->OUTPpsiGiven = TRUE; - break; - case OUTP_EQU_PSI: - card->OUTPequPsi = value->iValue; - card->OUTPequPsiGiven = TRUE; - break; - case OUTP_VAC_PSI: - card->OUTPvacPsi = value->iValue; - card->OUTPvacPsiGiven = TRUE; - break; - case OUTP_N_CONC: - card->OUTPnConc = value->iValue; - card->OUTPnConcGiven = TRUE; - break; - case OUTP_P_CONC: - card->OUTPpConc = value->iValue; - card->OUTPpConcGiven = TRUE; - break; - case OUTP_PHIN: - card->OUTPphin = value->iValue; - card->OUTPphinGiven = TRUE; - break; - case OUTP_PHIP: - card->OUTPphip = value->iValue; - card->OUTPphipGiven = TRUE; - break; - case OUTP_PHIC: - card->OUTPphic = value->iValue; - card->OUTPphicGiven = TRUE; - break; - case OUTP_PHIV: - card->OUTPphiv = value->iValue; - card->OUTPphivGiven = TRUE; - break; - case OUTP_J_C: - card->OUTPjc = value->iValue; - card->OUTPjcGiven = TRUE; - break; - case OUTP_J_D: - card->OUTPjd = value->iValue; - card->OUTPjdGiven = TRUE; - break; - case OUTP_J_N: - card->OUTPjn = value->iValue; - card->OUTPjnGiven = TRUE; - break; - case OUTP_J_P: - card->OUTPjp = value->iValue; - card->OUTPjpGiven = TRUE; - break; - case OUTP_J_T: - card->OUTPjt = value->iValue; - card->OUTPjtGiven = TRUE; - break; - case OUTP_U_NET: - card->OUTPuNet = value->iValue; - card->OUTPuNetGiven = TRUE; - break; - case OUTP_MUN: - card->OUTPmun = value->iValue; - card->OUTPmunGiven = TRUE; - break; - case OUTP_MUP: - card->OUTPmup = value->iValue; - card->OUTPmupGiven = TRUE; - break; - default: - return(E_BADPARM); - break; - } - return(OK); -} diff --git a/src/ciderlib/input/readme b/src/ciderlib/input/readme deleted file mode 100644 index 79dab0de0..000000000 --- a/src/ciderlib/input/readme +++ /dev/null @@ -1,6 +0,0 @@ -Directory: input ----------------- -The files in this directory serve two purposes: - 1. Serve as collection point for numerical model parameters. - 2. Translate data structures containing raw input into - a form usable by the one- and two-dimensional device simulators. diff --git a/src/ciderlib/notes b/src/ciderlib/notes deleted file mode 100644 index ff1168028..000000000 --- a/src/ciderlib/notes +++ /dev/null @@ -1,9 +0,0 @@ -1. Crucial Difference between Spice3f1 and Spice3e2: - The 'states' field in the ***instance structured has been moved. - Belongs below the node id's in Spice3e2. -2. Crucial Differences between Spice3f2 and Spice3f1: - Addition of DEVunSetup call to ***itf.h files - The 3f2 input parser can't handle arithmetic operators in strings. - A special call has been added in spiceitf/inpgval.c to specially - parse strings. Quotes (either "foobar" or 'foobar') are stripped - from the string. diff --git a/src/ciderlib/oned/Makefile.am b/src/ciderlib/oned/Makefile.am deleted file mode 100644 index ce9e4200b..000000000 --- a/src/ciderlib/oned/Makefile.am +++ /dev/null @@ -1,26 +0,0 @@ -## Process this file with automake to produce Makefile.in - -noinst_LTLIBRARIES = libcideroned.la - -libcideroned_la_SOURCES = \ - oneadmit.c \ - oneaval.c \ - onecond.c \ - onecont.c \ - oneddefs.h \ - onedest.c \ - onedext.h \ - onedopng.c \ - onefreez.c \ - onemesh.c \ - onepoiss.c \ - oneprint.c \ - oneproj.c \ - oneread.c \ - onesetup.c \ - onesolve.c - -EXTRA_DIST = notes readme -AM_CPPFLAGS = @AM_CPPFLAGS@ -I$(top_srcdir)/src/include -AM_CFLAGS = $(STATIC) -MAINTAINERCLEANFILES = Makefile.in diff --git a/src/ciderlib/oned/notes b/src/ciderlib/oned/notes deleted file mode 100644 index 6da21d283..000000000 --- a/src/ciderlib/oned/notes +++ /dev/null @@ -1,36 +0,0 @@ -Some comments on keeping track of where the solution is: - -There are 3 places that the internal state variables can be hiding: - 1. In the (psi,n,p) triple of a node (pNode). - 2. In the solution vectors (dcSolution, copiedSolution). - 3. In the state tables (pDevice->devStates[]). - - To access node variables use: - pNode->psi - pNode->nConc - pNode->pConc - - To access solution vectors use: - solution[ pNode->psiEqn ] - solution[ pNode->nEqn ] - solution[ pNode->pEqn ] - - To access state vector X (0,1,etc.) use: - *(pDevice->devStateX + pNode->nodePsi) - *(pDevice->devStateX + pNode->nodeN) - *(pDevice->devStateX + pNode->nodeP) - -There are several functions that copy from one form of these -to another: - storeInitialGuess: dcSolution <- nodevars - biasSolve: nodevars <- dcSolution (DC) - state0 <- nodevars <- dcSolution (Transient) - saveState: nodevars <- state1 (Transient) - -In addition the main device-level Newton iteration copies during -the computation of currents and derivatives: - state0 <- dcSolution - -and the function predict() does a forward prediction step using -the previous state: - nodevars <- predict(state1) (Transient) diff --git a/src/ciderlib/oned/oneadmit.c b/src/ciderlib/oned/oneadmit.c deleted file mode 100644 index 13df2f602..000000000 --- a/src/ciderlib/oned/oneadmit.c +++ /dev/null @@ -1,738 +0,0 @@ -/********** -Copyright 1992 Regents of the University of California. All rights reserved. -Author: 1987 Kartikeya Mayaram, U. C. Berkeley CAD Group -**********/ - -/* Functions to compute small-signal parameters of 1D devices */ - -#include "ngspice/ngspice.h" -#include "ngspice/numglobs.h" -#include "ngspice/numenum.h" -#include "ngspice/numconst.h" -#include "ngspice/onedev.h" -#include "ngspice/onemesh.h" -#include "ngspice/complex.h" -#include "ngspice/spmatrix.h" -#include "ngspice/ifsim.h" - -#include "onedext.h" -#include "oneddefs.h" -#include "ngspice/cidersupt.h" - - -extern IFfrontEnd *SPfrontEnd; - - -/* - * mmhhh this may cause troubles - * Paolo Nenzi 2002 - */ - SPcomplex yAc; - - - -int -NUMDadmittance(ONEdevice *pDevice, double omega, SPcomplex *yd) -{ - ONEnode *pNode; - ONEelem *pElem; - ONEedge *pEdge; - int index, i; - double yReal, yImag; - double *solutionReal, *solutionImag; - SPcomplex yAc_adm, cOmega; - SPcomplex *y; - BOOLEAN SORFailed; - double startTime; - - - /* Each time we call this counts as one AC iteration. */ - pDevice->pStats->numIters[STAT_AC] += 1; - - /* - * Change context names of solution vectors for ac analysis. - * dcDeltaSolution stores the real part and copiedSolution stores the - * imaginary part of the ac solution vector. - */ - solutionReal = pDevice->dcDeltaSolution; - solutionImag = pDevice->copiedSolution; - pDevice->solverType = SLV_SMSIG; - - /* use a normalized radian frequency */ - omega *= TNorm; - CMPLX_ASSIGN_VALUE(cOmega, 0.0, omega); - yReal = 0.0; - yImag = 0.0; - - if ((AcAnalysisMethod == SOR) || (AcAnalysisMethod == SOR_ONLY)) { - /* LOAD */ - startTime = SPfrontEnd->IFseconds(); - /* zero the rhs before loading in the new rhs */ - for (index = 1; index <= pDevice->numEqns; index++) { - pDevice->rhs[index] = 0.0; - pDevice->rhsImag[index] = 0.0; - } - /* store the new rhs vector */ - pElem = pDevice->elemArray[pDevice->numNodes - 1]; - pNode = pElem->pLeftNode; - pDevice->rhs[pNode->psiEqn] = pElem->epsRel * pElem->rDx; - if (pElem->elemType == SEMICON) { - pEdge = pElem->pEdge; - pDevice->rhs[pNode->nEqn] -= pEdge->dJnDpsiP1; - pDevice->rhs[pNode->pEqn] -= pEdge->dJpDpsiP1; - } - pDevice->pStats->loadTime[STAT_AC] += SPfrontEnd->IFseconds() - startTime; - - /* SOLVE */ - startTime = SPfrontEnd->IFseconds(); - SORFailed = ONEsorSolve(pDevice, solutionReal, solutionImag, omega); - pDevice->pStats->solveTime[STAT_AC] += SPfrontEnd->IFseconds() - startTime; - - if (SORFailed && AcAnalysisMethod == SOR) { - AcAnalysisMethod = DIRECT; - printf("SOR failed at %g Hz, switching to direct-method ac analysis.\n", - omega / (2 * M_PI * TNorm) ); - } else if (SORFailed) { /* Told to only do SOR, so give up. */ - printf("SOR failed at %g Hz, returning null admittance.\n", - omega / (2 * M_PI * TNorm) ); - CMPLX_ASSIGN_VALUE(*yd, 0.0, 0.0); - return (AcAnalysisMethod); - } - } - if (AcAnalysisMethod == DIRECT) { - /* LOAD */ - startTime = SPfrontEnd->IFseconds(); - /* solve the system of equations directly */ - for (index = 1; index <= pDevice->numEqns; index++) { - pDevice->rhs[index] = 0.0; - pDevice->rhsImag[index] = 0.0; - } - pElem = pDevice->elemArray[pDevice->numNodes - 1]; - pNode = pElem->pLeftNode; - pDevice->rhs[pNode->psiEqn] = pElem->epsRel * pElem->rDx; - if (pElem->elemType == SEMICON) { - pEdge = pElem->pEdge; - pDevice->rhs[pNode->nEqn] -= pEdge->dJnDpsiP1; - pDevice->rhs[pNode->pEqn] -= pEdge->dJpDpsiP1; - } - ONE_jacLoad(pDevice); - spSetComplex(pDevice->matrix); - for (index = 1; index < pDevice->numNodes; index++) { - pElem = pDevice->elemArray[index]; - if (pElem->elemType == SEMICON) { - for (i = 0; i <= 1; i++) { - pNode = pElem->pNodes[i]; - if (pNode->nodeType != CONTACT) { - spADD_COMPLEX_ELEMENT(pNode->fNN, 0.0, -0.5 * pElem->dx * omega); - spADD_COMPLEX_ELEMENT(pNode->fPP, 0.0, 0.5 * pElem->dx * omega); - } - } - } - } - pDevice->pStats->loadTime[STAT_AC] += SPfrontEnd->IFseconds() - startTime; - - /* FACTOR */ - startTime = SPfrontEnd->IFseconds(); - spFactor(pDevice->matrix); - pDevice->pStats->factorTime[STAT_AC] += SPfrontEnd->IFseconds() - startTime; - - /* SOLVE */ - startTime = SPfrontEnd->IFseconds(); - spSolve(pDevice->matrix, pDevice->rhs, solutionReal, - pDevice->rhsImag, solutionImag); - pDevice->pStats->solveTime[STAT_AC] += SPfrontEnd->IFseconds() - startTime; - } - /* MISC */ - startTime = SPfrontEnd->IFseconds(); - pNode = pDevice->elemArray[1]->pLeftNode; - y = computeAdmittance(pNode, FALSE, solutionReal, solutionImag, &cOmega); - CMPLX_ASSIGN_VALUE(yAc_adm, -y->real, -y->imag); - CMPLX_ASSIGN(*yd, yAc_adm); - CMPLX_MULT_SELF_SCALAR(*yd, GNorm * pDevice->area); - pDevice->pStats->miscTime[STAT_AC] += SPfrontEnd->IFseconds() - startTime; - - return (AcAnalysisMethod); -} /* end of function NUMDadmittance */ - - -int -NBJTadmittance(ONEdevice *pDevice, double omega, SPcomplex *yIeVce, - SPcomplex *yIcVce, SPcomplex *yIeVbe, SPcomplex *yIcVbe) -{ - ONEelem *pCollElem = pDevice->elemArray[pDevice->numNodes - 1]; - ONEelem *pBaseElem = pDevice->elemArray[pDevice->baseIndex - 1]; - ONEelem *pElem; - ONEedge *pEdge; - ONEnode *pNode; - int index, i; - double area = pDevice->area; - double *solutionReal, *solutionImag; - BOOLEAN SORFailed; - SPcomplex *y; - SPcomplex cOmega, pIeVce, pIcVce, pIeVbe, pIcVbe; - double startTime; - - /* Each time we call this counts as one AC iteration. */ - pDevice->pStats->numIters[STAT_AC] += 1; - - /* - * change context names of solution vectors for ac analysis dcDeltaSolution - * stores the real part and copiedSolution stores the imaginary part of the - * ac solution vector - */ - solutionReal = pDevice->dcDeltaSolution; - solutionImag = pDevice->copiedSolution; - pDevice->solverType = SLV_SMSIG; - - /* use a normalized radian frequency */ - omega *= TNorm; - CMPLX_ASSIGN_VALUE(cOmega, 0.0, omega); - CMPLX_ASSIGN_VALUE(pIeVce, NAN, NAN); - CMPLX_ASSIGN_VALUE(pIcVce, NAN, NAN); - - if ((AcAnalysisMethod == SOR) || (AcAnalysisMethod == SOR_ONLY)) { - /* LOAD */ - startTime = SPfrontEnd->IFseconds(); - /* zero the rhs before loading in the new rhs */ - for (index = 1; index <= pDevice->numEqns; index++) { - pDevice->rhs[index] = 0.0; - pDevice->rhsImag[index] = 0.0; - } - /* store the new rhs vector */ - pNode = pCollElem->pLeftNode; - pDevice->rhs[pNode->psiEqn] = pCollElem->epsRel * pCollElem->rDx; - if (pCollElem->elemType == SEMICON) { - pEdge = pCollElem->pEdge; - pDevice->rhs[pNode->nEqn] -= pEdge->dJnDpsiP1; - pDevice->rhs[pNode->pEqn] -= pEdge->dJpDpsiP1; - } - pDevice->pStats->loadTime[STAT_AC] += SPfrontEnd->IFseconds() - startTime; - - /* SOLVE */ - startTime = SPfrontEnd->IFseconds(); - SORFailed = ONEsorSolve(pDevice, solutionReal, solutionImag, omega); - pDevice->pStats->solveTime[STAT_AC] += SPfrontEnd->IFseconds() - startTime; - if (SORFailed && (AcAnalysisMethod == SOR)) { - AcAnalysisMethod = DIRECT; - printf("SOR failed at %g Hz, switching to direct-method ac analysis.\n", - omega / (2 * M_PI * TNorm) ); - } else if (SORFailed) { /* Told to only do SOR, so give up. */ - printf("SOR failed at %g Hz, returning null admittance.\n", - omega / (2 * M_PI * TNorm) ); - CMPLX_ASSIGN_VALUE(*yIeVce, 0.0, 0.0); - CMPLX_ASSIGN_VALUE(*yIcVce, 0.0, 0.0); - CMPLX_ASSIGN_VALUE(*yIeVbe, 0.0, 0.0); - CMPLX_ASSIGN_VALUE(*yIcVbe, 0.0, 0.0); - return (AcAnalysisMethod); - } else { - /* MISC */ - startTime = SPfrontEnd->IFseconds(); - pElem = pDevice->elemArray[1]; - pNode = pElem->pLeftNode; - y = computeAdmittance(pNode, FALSE, solutionReal, solutionImag, &cOmega); - CMPLX_ASSIGN_VALUE(pIeVce, -y->real, -y->imag); - pNode = pCollElem->pRightNode; - y = computeAdmittance(pNode, TRUE, solutionReal, solutionImag, &cOmega); - CMPLX_ASSIGN_VALUE(pIcVce, -y->real, -y->imag); - pDevice->pStats->miscTime[STAT_AC] += SPfrontEnd->IFseconds() - startTime; - - /* LOAD */ - startTime = SPfrontEnd->IFseconds(); - /* load in the base contribution to the rhs */ - for (index = 1; index <= pDevice->numEqns; index++) { - pDevice->rhs[index] = 0.0; - } - pNode = pBaseElem->pRightNode; - if (pNode->baseType == N_TYPE) { - pDevice->rhs[pNode->nEqn] = pNode->nConc * pNode->eg; - } else if (pNode->baseType == P_TYPE) { - pDevice->rhs[pNode->pEqn] = pNode->pConc * pNode->eg; - } else { - printf("projectBJTsolution: unknown base type\n"); - } - pDevice->pStats->loadTime[STAT_AC] += SPfrontEnd->IFseconds() - startTime; - - /* SOLVE */ - startTime = SPfrontEnd->IFseconds(); - SORFailed = ONEsorSolve(pDevice, solutionReal, solutionImag, omega); - pDevice->pStats->solveTime[STAT_AC] += - SPfrontEnd->IFseconds() - startTime; - if (SORFailed && (AcAnalysisMethod == SOR)) { - AcAnalysisMethod = DIRECT; - printf("SOR failed at %g Hz, switching to direct-method ac analysis.\n", - omega / (2 * M_PI * TNorm) ); - } else if (SORFailed) { /* Told to only do SOR, so give up. */ - printf("SOR failed at %g Hz, returning null admittance.\n", - omega / (2 * M_PI * TNorm) ); - CMPLX_ASSIGN_VALUE(*yIeVce, 0.0, 0.0); - CMPLX_ASSIGN_VALUE(*yIcVce, 0.0, 0.0); - CMPLX_ASSIGN_VALUE(*yIeVbe, 0.0, 0.0); - CMPLX_ASSIGN_VALUE(*yIcVbe, 0.0, 0.0); - return (AcAnalysisMethod); - } - } - } - if (AcAnalysisMethod == DIRECT) { - /* LOAD */ - startTime = SPfrontEnd->IFseconds(); - for (index = 1; index <= pDevice->numEqns; index++) { - pDevice->rhs[index] = 0.0; - pDevice->rhsImag[index] = 0.0; - } - /* solve the system of equations directly */ - ONE_jacLoad(pDevice); - pNode = pCollElem->pLeftNode; - pDevice->rhs[pNode->psiEqn] = pCollElem->epsRel * pCollElem->rDx; - if (pCollElem->elemType == SEMICON) { - pEdge = pCollElem->pEdge; - pDevice->rhs[pNode->nEqn] -= pEdge->dJnDpsiP1; - pDevice->rhs[pNode->pEqn] -= pEdge->dJpDpsiP1; - } - spSetComplex(pDevice->matrix); - for (index = 1; index < pDevice->numNodes; index++) { - pElem = pDevice->elemArray[index]; - if (pElem->elemType == SEMICON) { - for (i = 0; i <= 1; i++) { - pNode = pElem->pNodes[i]; - if (pNode->nodeType != CONTACT) { - spADD_COMPLEX_ELEMENT(pNode->fNN, 0.0, -0.5 * pElem->dx * omega); - spADD_COMPLEX_ELEMENT(pNode->fPP, 0.0, 0.5 * pElem->dx * omega); - } - } - } - } - pDevice->pStats->loadTime[STAT_AC] += SPfrontEnd->IFseconds() - startTime; - - /* FACTOR */ - startTime = SPfrontEnd->IFseconds(); - spFactor(pDevice->matrix); - pDevice->pStats->factorTime[STAT_AC] += SPfrontEnd->IFseconds() - startTime; - - /* SOLVE */ - startTime = SPfrontEnd->IFseconds(); - spSolve(pDevice->matrix, pDevice->rhs, solutionReal, - pDevice->rhsImag, solutionImag); - pDevice->pStats->solveTime[STAT_AC] += SPfrontEnd->IFseconds() - startTime; - - /* MISC */ - startTime = SPfrontEnd->IFseconds(); - pElem = pDevice->elemArray[1]; - pNode = pElem->pLeftNode; - y = computeAdmittance(pNode, FALSE, solutionReal, solutionImag, &cOmega); - CMPLX_ASSIGN_VALUE(pIeVce, -y->real, -y->imag); - pNode = pCollElem->pRightNode; - y = computeAdmittance(pNode, TRUE, solutionReal, solutionImag, &cOmega); - CMPLX_ASSIGN_VALUE(pIcVce, -y->real, -y->imag); - pDevice->pStats->miscTime[STAT_AC] += SPfrontEnd->IFseconds() - startTime; - - /* LOAD */ - startTime = SPfrontEnd->IFseconds(); - /* load in the base contribution in the rhs */ - for (index = 1; index <= pDevice->numEqns; index++) { - pDevice->rhs[index] = 0.0; - } - pNode = pBaseElem->pRightNode; - if (pNode->baseType == N_TYPE) { - pDevice->rhs[pNode->nEqn] = pNode->nConc * pNode->eg; - } else if (pNode->baseType == P_TYPE) { - pDevice->rhs[pNode->pEqn] = pNode->pConc * pNode->eg; - } else { - printf("\n BJTadmittance: unknown base type"); - } - pDevice->pStats->loadTime[STAT_AC] += SPfrontEnd->IFseconds() - startTime; - - /* FACTOR: already done, no need to repeat. */ - - /* SOLVE */ - startTime = SPfrontEnd->IFseconds(); - spSolve(pDevice->matrix, pDevice->rhs, solutionReal, - pDevice->rhsImag, solutionImag); - pDevice->pStats->solveTime[STAT_AC] += SPfrontEnd->IFseconds() - startTime; - } - /* MISC */ - startTime = SPfrontEnd->IFseconds(); - pElem = pDevice->elemArray[1]; - pNode = pElem->pLeftNode; - y = computeAdmittance(pNode, FALSE, solutionReal, solutionImag, &cOmega); - CMPLX_ASSIGN_VALUE(pIeVbe, -y->real, -y->imag); - pNode = pCollElem->pRightNode; - y = computeAdmittance(pNode, FALSE, solutionReal, solutionImag, &cOmega); - CMPLX_ASSIGN_VALUE(pIcVbe, -y->real, -y->imag); - - CMPLX_ASSIGN(*yIeVce, pIeVce); - CMPLX_ASSIGN(*yIcVce, pIcVce); - CMPLX_ASSIGN(*yIeVbe, pIeVbe); - CMPLX_ASSIGN(*yIcVbe, pIcVbe); - CMPLX_MULT_SELF_SCALAR(*yIeVce, GNorm * area); - CMPLX_MULT_SELF_SCALAR(*yIeVbe, GNorm * area); - CMPLX_MULT_SELF_SCALAR(*yIcVce, GNorm * area); - CMPLX_MULT_SELF_SCALAR(*yIcVbe, GNorm * area); - pDevice->pStats->miscTime[STAT_AC] += SPfrontEnd->IFseconds() - startTime; - - return (AcAnalysisMethod); -} - -BOOLEAN -ONEsorSolve(ONEdevice *pDevice, double *xReal, double *xImag, double omega) -{ - ONEnode *pNode; - ONEelem *pElem; - double wRelax = 1.0; /* SOR relaxation parameter */ - double *rhsSOR = pDevice->rhsImag; - int numEqns = pDevice->numEqns; - int numNodes = pDevice->numNodes; - BOOLEAN SORConverged = FALSE; - BOOLEAN SORFailed = FALSE; - int i, index, indexN, indexP, iterationNum; - double dx; - - - /* clear xReal, xImag arrays */ - for (index = 1; index <= numEqns; index++) { - xReal[index] = 0.0; - xImag[index] = 0.0; - } - - iterationNum = 1; - for (; (!SORConverged) &&(!SORFailed); iterationNum++) { - /* first setup the rhs for the real part */ - for (index = 1; index <= numEqns; index++) { - rhsSOR[index] = 0.0; - } - for (index = 1; index < numNodes; index++) { - pElem = pDevice->elemArray[index]; - dx = 0.5 * pElem->dx; - for (i = 0; i <= 1; i++) { - pNode = pElem->pNodes[i]; - if ((pNode->nodeType != CONTACT) - && (pElem->elemType == SEMICON)) { - indexN = pNode->nEqn; - indexP = pNode->pEqn; - rhsSOR[indexN] -= dx * omega * xImag[indexN]; - rhsSOR[indexP] += dx * omega * xImag[indexP]; - } - } - } - /* now setup the rhs for the SOR equations */ - for (index = 1; index <= numEqns; index++) { - rhsSOR[index] += pDevice->rhs[index]; - } - /* compute xReal(k+1). solution stored in rhsSOR */ - spSolve(pDevice->matrix, rhsSOR, rhsSOR, NULL, NULL); - - /* modify solution when wRelax is not 1 */ - if (wRelax != 1) { - for (index = 1; index <= numEqns; index++) { - rhsSOR[index] = (1 - wRelax) * xReal[index] + - wRelax * rhsSOR[index]; - } - } - if (iterationNum > 1) { - SORConverged = hasSORConverged(xReal, rhsSOR, numEqns); - } - /* copy real solution into xReal */ - for (index = 1; index <= numEqns; index++) { - xReal[index] = rhsSOR[index]; - } - - /* now compute the imaginary part of the solution, xImag */ - for (index = 1; index <= numEqns; index++) { - rhsSOR[index] = 0.0; - } - for (index = 1; index < numNodes; index++) { - pElem = pDevice->elemArray[index]; - dx = 0.5 * pElem->dx; - for (i = 0; i <= 1; i++) { - pNode = pElem->pNodes[i]; - if ((pNode->nodeType != CONTACT) - && (pElem->elemType == SEMICON)) { - indexN = pNode->nEqn; - indexP = pNode->pEqn; - rhsSOR[indexN] += dx * omega * xReal[indexN]; - rhsSOR[indexP] -= dx * omega * xReal[indexP]; - } - } - } - /* compute xImag(k+1) */ - spSolve(pDevice->matrix, rhsSOR, rhsSOR, - NULL, NULL); - /* modify solution when wRelax is not 1 */ - if (wRelax != 1) { - for (index = 1; index <= numEqns; index++) { - rhsSOR[index] = (1 - wRelax) * xImag[index] + - wRelax * rhsSOR[index]; - } - } - if (iterationNum > 1) { - SORConverged = SORConverged && hasSORConverged(xImag, rhsSOR, numEqns); - } - /* copy imag solution into xImag */ - for (index = 1; index <= numEqns; index++) { - xImag[index] = rhsSOR[index]; - } - if (ONEacDebug) - printf("SOR iteration number = %d\n", iterationNum); - if (iterationNum > 4) { - SORFailed = TRUE; - } - } - return (SORFailed); -} - -void -NUMDys(ONEdevice *pDevice, SPcomplex *s, SPcomplex *yd) -{ - ONEnode *pNode; - ONEelem *pElem; - ONEedge *pEdge; - int index, i; - double *solutionReal, *solutionImag; - SPcomplex temp, cOmega; - SPcomplex *y; - - - /* - * change context names of solution vectors for ac analysis dcDeltaSolution - * stores the real part and copiedSolution stores the imaginary part of the - * ac solution vector - */ - solutionReal = pDevice->dcDeltaSolution; - solutionImag = pDevice->copiedSolution; - - /* use a normalized radian frequency */ - CMPLX_MULT_SCALAR(cOmega, *s, TNorm); - - /* solve the system of equations directly */ - for (index = 1; index <= pDevice->numEqns; index++) { - pDevice->rhs[index] = 0.0; - pDevice->rhsImag[index] = 0.0; - } - ONE_jacLoad(pDevice); - pElem = pDevice->elemArray[pDevice->numNodes - 1]; - pNode = pElem->pLeftNode; - pDevice->rhs[pNode->psiEqn] = pElem->epsRel * pElem->rDx; - if (pElem->elemType == SEMICON) { - pEdge = pElem->pEdge; - pDevice->rhs[pNode->nEqn] -= pEdge->dJnDpsiP1; - pDevice->rhs[pNode->pEqn] -= pEdge->dJpDpsiP1; - } - spSetComplex(pDevice->matrix); - for (index = 1; index < pDevice->numNodes; index++) { - pElem = pDevice->elemArray[index]; - if (pElem->elemType == SEMICON) { - for (i = 0; i <= 1; i++) { - pNode = pElem->pNodes[i]; - if (pNode->nodeType != CONTACT) { - CMPLX_MULT_SCALAR(temp, cOmega, 0.5 * pElem->dx); - spADD_COMPLEX_ELEMENT(pNode->fNN, -temp.real, -temp.imag); - spADD_COMPLEX_ELEMENT(pNode->fPP, temp.real, temp.imag); - } - } - } - } - - - spFactor(pDevice->matrix); - spSolve(pDevice->matrix, pDevice->rhs, solutionReal, - pDevice->rhsImag, solutionImag); - - pElem = pDevice->elemArray[1]; - pNode = pElem->pLeftNode; - y = computeAdmittance(pNode, FALSE, solutionReal, solutionImag, &cOmega); - CMPLX_ASSIGN_VALUE(*yd, -y->real, -y->imag); - CMPLX_MULT_SELF_SCALAR(*yd, GNorm * pDevice->area); -} - - -void -NBJTys(ONEdevice *pDevice, SPcomplex *s, SPcomplex *yIeVce, - SPcomplex *yIcVce, SPcomplex *yIeVbe, SPcomplex *yIcVbe) -{ - ONEelem *pCollElem = pDevice->elemArray[pDevice->numNodes - 1]; - ONEelem *pBaseElem = pDevice->elemArray[pDevice->baseIndex - 1]; - ONEelem *pElem; - ONEnode *pNode; - ONEedge *pEdge; - int index, i; - SPcomplex *y; - double area = pDevice->area; - double *solutionReal, *solutionImag; - SPcomplex temp, cOmega; - SPcomplex pIeVce, pIcVce, pIeVbe, pIcVbe; - - /* - * change context names of solution vectors for ac analysis dcDeltaSolution - * stores the real part and copiedSolution stores the imaginary part of the - * ac solution vector - */ - - solutionReal = pDevice->dcDeltaSolution; - solutionImag = pDevice->copiedSolution; - - /* use a normalized radian frequency */ - CMPLX_MULT_SCALAR(cOmega, *s, TNorm); - for (index = 1; index <= pDevice->numEqns; index++) { - pDevice->rhs[index] = 0.0; - pDevice->rhsImag[index] = 0.0; - } - /* solve the system of equations directly */ - ONE_jacLoad(pDevice); - pNode = pCollElem->pLeftNode; - pDevice->rhs[pNode->psiEqn] = pCollElem->epsRel * pCollElem->rDx; - if (pCollElem->elemType == SEMICON) { - pEdge = pCollElem->pEdge; - pDevice->rhs[pNode->nEqn] -= pEdge->dJnDpsiP1; - pDevice->rhs[pNode->pEqn] -= pEdge->dJpDpsiP1; - } - spSetComplex(pDevice->matrix); - for (index = 1; index < pDevice->numNodes; index++) { - pElem = pDevice->elemArray[index]; - if (pElem->elemType == SEMICON) { - for (i = 0; i <= 1; i++) { - pNode = pElem->pNodes[i]; - if (pNode->nodeType != CONTACT) { - CMPLX_MULT_SCALAR(temp, cOmega, 0.5 * pElem->dx); - spADD_COMPLEX_ELEMENT(pNode->fNN, -temp.real, -temp.imag); - spADD_COMPLEX_ELEMENT(pNode->fPP, temp.real, temp.imag); - } - } - } - } - - spFactor(pDevice->matrix); - spSolve(pDevice->matrix, pDevice->rhs, solutionReal, - pDevice->rhsImag, solutionImag); - pElem = pDevice->elemArray[1]; - pNode = pElem->pLeftNode; - y = computeAdmittance(pNode, FALSE, solutionReal, solutionImag, &cOmega); - CMPLX_ASSIGN_VALUE(pIeVce, -y->real, -y->imag); - pNode = pCollElem->pRightNode; - y = computeAdmittance(pNode, TRUE, solutionReal, solutionImag, &cOmega); - CMPLX_ASSIGN_VALUE(pIcVce, -y->real, -y->imag); - - /* load in the base contribution in the rhs */ - for (index = 1; index <= pDevice->numEqns; index++) { - pDevice->rhs[index] = 0.0; - } - pNode = pBaseElem->pRightNode; - if (pNode->baseType == N_TYPE) { - pDevice->rhs[pNode->nEqn] = pNode->nConc * pNode->eg; - } else if (pNode->baseType == P_TYPE) { - pDevice->rhs[pNode->pEqn] = pNode->pConc * pNode->eg; - } else { - printf("\n BJTadmittance: unknown base type"); - } - - /* don't need to LU factor the jacobian since it exists */ - spSolve(pDevice->matrix, pDevice->rhs, solutionReal, - pDevice->rhsImag, solutionImag); - pElem = pDevice->elemArray[1]; - pNode = pElem->pLeftNode; - y = computeAdmittance(pNode, FALSE, solutionReal, solutionImag, &cOmega); - CMPLX_ASSIGN_VALUE(pIeVbe, -y->real, -y->imag); - pNode = pCollElem->pRightNode; - y = computeAdmittance(pNode, FALSE, solutionReal, solutionImag, &cOmega); - CMPLX_ASSIGN_VALUE(pIcVbe, -y->real, -y->imag); - - - CMPLX_ASSIGN(*yIeVce, pIeVce); - CMPLX_ASSIGN(*yIcVce, pIcVce); - CMPLX_ASSIGN(*yIeVbe, pIeVbe); - CMPLX_ASSIGN(*yIcVbe, pIcVbe); - CMPLX_MULT_SELF_SCALAR(*yIeVce, GNorm * area); - CMPLX_MULT_SELF_SCALAR(*yIeVbe, GNorm * area); - CMPLX_MULT_SELF_SCALAR(*yIcVce, GNorm * area); - CMPLX_MULT_SELF_SCALAR(*yIcVbe, GNorm * area); -} - -/* function to compute the admittance of a one-D device */ -/* cOmega is the complex frequency */ - -SPcomplex * -computeAdmittance(ONEnode *pNode, BOOLEAN delVContact, double *xReal, - double *xImag, SPcomplex *cOmega) -{ - ONEnode *pHNode; - ONEedge *pEdge; - ONEelem *pElem; - SPcomplex psi, n, p; - SPcomplex sum, prod1, prod2; -/* SPcomplex yAc; */ - int i; - - - CMPLX_ASSIGN_VALUE(yAc, 0.0, 0.0); - - for (i = 0; i <= 1; i++) { - pElem = pNode->pElems[i]; - if (pElem != NULL) { - switch (i) { - case 0: - /* the right node of the element */ - pHNode = pElem->pLeftNode; - pEdge = pElem->pEdge; - CMPLX_ASSIGN_VALUE(psi, xReal[pHNode->psiEqn], - xImag[pHNode->psiEqn]); - if (pElem->elemType == SEMICON) { - CMPLX_ASSIGN_VALUE(n, xReal[pHNode->nEqn], - xImag[pHNode->nEqn]); - CMPLX_ASSIGN_VALUE(p, xReal[pHNode->pEqn], - xImag[pHNode->pEqn]); - - CMPLX_MULT_SCALAR(prod1, psi, -pEdge->dJnDpsiP1); - CMPLX_MULT_SCALAR(prod2, n, pEdge->dJnDn); - CMPLX_ADD(yAc, prod1, prod2); - CMPLX_MULT_SCALAR(prod1, psi, -pEdge->dJpDpsiP1); - CMPLX_MULT_SCALAR(prod2, p, pEdge->dJpDp); - CMPLX_ADD(sum, prod1, prod2); - CMPLX_ADD_ASSIGN(yAc, sum); - if (delVContact) { - CMPLX_ADD_SELF_SCALAR(yAc, pEdge->dJnDpsiP1 + pEdge->dJpDpsiP1); - } - } - CMPLX_MULT_SCALAR(prod1, *cOmega, pElem->epsRel * pElem->rDx); - CMPLX_MULT(prod2, prod1, psi) - CMPLX_ADD_ASSIGN(yAc, prod2); - if (delVContact) { - CMPLX_SUBT_ASSIGN(yAc, prod1); - } - break; - - case 1: - /* the left node of the element */ - pHNode = pElem->pRightNode; - pEdge = pElem->pEdge; - CMPLX_ASSIGN_VALUE(psi, xReal[pHNode->psiEqn], - xImag[pHNode->psiEqn]); - if (pElem->elemType == SEMICON) { - CMPLX_ASSIGN_VALUE(n, xReal[pHNode->nEqn], - xImag[pHNode->nEqn]); - CMPLX_ASSIGN_VALUE(p, xReal[pHNode->pEqn], - xImag[pHNode->pEqn]); - CMPLX_MULT_SCALAR(prod1, psi, pEdge->dJnDpsiP1); - CMPLX_MULT_SCALAR(prod2, n, pEdge->dJnDnP1); - CMPLX_ADD(yAc, prod1, prod2); - CMPLX_MULT_SCALAR(prod1, psi, pEdge->dJpDpsiP1); - CMPLX_MULT_SCALAR(prod2, p, pEdge->dJpDpP1); - CMPLX_ADD(sum, prod1, prod2); - CMPLX_ADD_ASSIGN(yAc, sum); - - if (delVContact) { - CMPLX_ADD_SELF_SCALAR(yAc, -(pEdge->dJnDpsiP1 + pEdge->dJpDpsiP1)); - } - } - CMPLX_MULT_SCALAR(prod1, *cOmega, pElem->epsRel * pElem->rDx); - CMPLX_MULT(prod2, prod1, psi); - CMPLX_SUBT_ASSIGN(yAc, prod2); - if (delVContact) { - CMPLX_ADD_ASSIGN(yAc, prod1); - } - break; - default: - /* should never be here. Error */ - printf("computeAdmittance: Error - unknown element\n"); - } - } - } - return (&yAc); -} diff --git a/src/ciderlib/oned/oneaval.c b/src/ciderlib/oned/oneaval.c deleted file mode 100644 index ba05eac3d..000000000 --- a/src/ciderlib/oned/oneaval.c +++ /dev/null @@ -1,172 +0,0 @@ -/********** -Copyright 1991 Regents of the University of California. All rights reserved. -Author: 1987 Kartikeya Mayaram, U. C. Berkeley CAD Group -**********/ - -#include "ngspice/ngspice.h" -#include "ngspice/numglobs.h" -#include "ngspice/onemesh.h" -#include "ngspice/onedev.h" -#include "ngspice/macros.h" - -#include "onedext.h" -#include "oneddefs.h" - -double -ONEavalanche(BOOLEAN rhsOnly, ONEdevice *pDevice, ONEnode *pNode) -{ - ONEelem *pLElem, *pRElem; - ONEedge *pLEdge, *pREdge; - int numNodes = pDevice->numNodes; - double dJnDpsiPrev, dJpDpsiPrev; - double eField, temp, jn, jp; - double signE, signN, signP, coeffR, coeffL, alphaN, alphaP; - double generation = 0.0; - double dAlphaNDpsiM1, dAlphaNDpsi, dAlphaNDpsiP1; - double dAlphaPDpsiM1, dAlphaPDpsi, dAlphaPDpsiP1; - ONEmaterial *info; - - - pRElem = pNode->pRightElem; - pLElem = pNode->pLeftElem; - - if (pRElem->evalNodes[0]) { - info = pRElem->matlInfo; - } else { - info = pLElem->matlInfo; - } - - pREdge = pRElem->pEdge; - pLEdge = pLElem->pEdge; - dJnDpsiPrev = pLEdge->dJnDpsiP1; - dJpDpsiPrev = pLEdge->dJpDpsiP1; - - temp = pRElem->dx + pLElem->dx; - coeffR = pLElem->dx / temp; - coeffL = pRElem->dx / temp; - - eField = -(coeffR * pREdge->dPsi * pRElem->rDx + - coeffL * pLEdge->dPsi * pLElem->rDx); - jn = coeffR * pREdge->jn + coeffL * pLEdge->jn; - jp = coeffR * pREdge->jp + coeffL * pLEdge->jp; - - signE = SGN(eField); - eField = ABS(eField); - if (eField == 0.0) { - return (0.0); - } - signN = SGN(jn); - if (signN * signE > 0.0) { - /* field accelerates the carriers, hence avalanche */ - if (info->bii[ELEC] / eField > 80.0) { - alphaN = 0.0; - } else { - alphaN = info->aii[ELEC] * exp(-info->bii[ELEC] / eField); - } - } else { - alphaN = 0.0; - } - signP = SGN(jp); - if (signP * signE > 0.0) { - /* field accelerates the carriers, hence avalanche */ - if (info->bii[HOLE] / eField > 80.0) { - alphaP = 0.0; - } else { - alphaP = info->aii[HOLE] * exp(-info->bii[HOLE] / eField); - } - } else { - alphaP = 0.0; - } - - if ((alphaN == 0.0) && (alphaP == 0.0)) { - return (generation); - } - generation = (alphaN * ABS(jn) + alphaP * ABS(jp)) * - 0.5 * (pRElem->dx + pLElem->dx); - if (rhsOnly) { - return (generation); - } - if (alphaN == 0.0) { - dAlphaNDpsiM1 = 0.0; - dAlphaNDpsiP1 = 0.0; - dAlphaNDpsi = 0.0; - } else { - temp = alphaN * info->bii[ELEC] / (eField * eField); - dAlphaNDpsiM1 = signE * temp * (coeffL * pLElem->rDx); - dAlphaNDpsiP1 = -signE * temp * (coeffR * pRElem->rDx); - dAlphaNDpsi = -(dAlphaNDpsiM1 + dAlphaNDpsiP1); - } - - if (alphaP == 0.0) { - dAlphaPDpsiM1 = 0.0; - dAlphaPDpsiP1 = 0.0; - dAlphaPDpsi = 0.0; - } else { - temp = alphaP * info->bii[HOLE] / (eField * eField); - dAlphaPDpsiM1 = signE * temp * (coeffL * pLElem->rDx); - dAlphaPDpsiP1 = -signE * temp * (coeffR * pRElem->rDx); - dAlphaPDpsi = -(dAlphaPDpsiM1 + dAlphaPDpsiP1); - } - - coeffR = 0.5 * pLElem->dx; - coeffL = 0.5 * pRElem->dx; - - if (pNode->nodeI != 2) { - *(pNode->fNPsiiM1) += - signN * (-alphaN * coeffL * dJnDpsiPrev + - coeffL * pLEdge->jn * dAlphaNDpsiM1) + - signP * (-alphaP * coeffL * dJpDpsiPrev + - coeffL * pLEdge->jp * dAlphaPDpsiM1); - *(pNode->fNNiM1) += signN * alphaN * coeffL * pLEdge->dJnDn; - *(pNode->fNPiM1) += signP * alphaP * coeffL * pLEdge->dJpDp; - - *(pNode->fPPsiiM1) -= - signN * (-alphaN * coeffL * dJnDpsiPrev + - coeffL * pLEdge->jn * dAlphaNDpsiM1) + - signP * (-alphaP * coeffL * dJpDpsiPrev + - coeffL * pLEdge->jp * dAlphaPDpsiM1); - *(pNode->fPPiM1) -= signP * alphaP * coeffL * pLEdge->dJpDp; - *(pNode->fPNiM1) -= signN * alphaN * coeffL * pLEdge->dJnDn; - } - if (pNode->nodeI != numNodes - 1) { - *(pNode->fNPsiiP1) += - signN * (alphaN * coeffR * pREdge->dJnDpsiP1 + - coeffR * pREdge->jn * dAlphaNDpsiP1) + - signP * (alphaP * coeffR * pREdge->dJpDpsiP1 + - coeffR * pREdge->jp * dAlphaPDpsiP1); - *(pNode->fNNiP1) += signN * alphaN * coeffR * pREdge->dJnDnP1; - *(pNode->fNPiP1) += signP * alphaP * coeffR * pREdge->dJpDpP1; - *(pNode->fPPsiiP1) -= - signN * (alphaN * coeffR * pREdge->dJnDpsiP1 + - coeffR * pREdge->jn * dAlphaNDpsiP1) + - signP * (alphaP * coeffR * pREdge->dJpDpsiP1 + - coeffR * pREdge->jp * dAlphaPDpsiP1); - *(pNode->fPPiP1) -= signP * alphaP * coeffR * pREdge->dJpDpP1; - *(pNode->fPNiP1) -= signN * alphaN * coeffR * pREdge->dJnDnP1; - } - *(pNode->fNPsi) += - signN * (alphaN * (-coeffR * pREdge->dJnDpsiP1 + - coeffL * dJnDpsiPrev) + (coeffR * pREdge->jn + - coeffL * pLEdge->jn) * dAlphaNDpsi) + - signP * (alphaP * (-coeffR * pREdge->dJpDpsiP1 + - coeffL * dJpDpsiPrev) + (coeffR * pREdge->jp + - coeffL * pLEdge->jp) * dAlphaPDpsi); - *(pNode->fNN) += signN * alphaN * (coeffR * pREdge->dJnDn + - coeffL * pLEdge->dJnDnP1); - *(pNode->fNP) += signP * alphaP * (coeffR * pREdge->dJpDp + - coeffL * pLEdge->dJpDpP1); - - *(pNode->fPPsi) -= - signN * (alphaN * (-coeffR * pREdge->dJnDpsiP1 + - coeffL * dJnDpsiPrev) + (coeffR * pREdge->jn + - coeffL * pLEdge->jn) * dAlphaNDpsi) + - signP * (alphaP * (-coeffR * pREdge->dJpDpsiP1 + - coeffL * dJpDpsiPrev) + (coeffR * pREdge->jp + - coeffL * pLEdge->jp) * dAlphaPDpsi); - *(pNode->fPN) -= signN * alphaN * (coeffR * pREdge->dJnDn + - coeffL * pLEdge->dJnDnP1); - *(pNode->fPP) -= signP * alphaP * (coeffR * pREdge->dJpDp + - coeffL * pLEdge->dJpDpP1); - - return (generation); -} diff --git a/src/ciderlib/oned/onecond.c b/src/ciderlib/oned/onecond.c deleted file mode 100644 index e70078c50..000000000 --- a/src/ciderlib/oned/onecond.c +++ /dev/null @@ -1,242 +0,0 @@ -/********** -Copyright 1992 Regents of the University of California. All rights reserved. -Author: 1987 Kartikeya Mayaram, U. C. Berkeley CAD Group -**********/ - -/* Functions to compute device conductances and currents */ - -#include "ngspice/ngspice.h" -#include "ngspice/numglobs.h" -#include "ngspice/numenum.h" -#include "ngspice/onemesh.h" -#include "ngspice/onedev.h" -#include "ngspice/macros.h" -#include "ngspice/spmatrix.h" - -#include "onedext.h" -#include "oneddefs.h" - -void -NUMDconductance(ONEdevice *pDevice, BOOLEAN tranAnalysis, - double *intCoeff, double *gd) -{ - ONEelem *pElem = pDevice->elemArray[pDevice->numNodes - 1]; - ONEnode *pNode; - ONEedge *pEdge; - int index; - double dPsiDv, dNDv, dPDv, *incVpn; - - - *gd = 0.0; - - /* zero the rhs before loading in the new rhs */ - for (index = 1; index <= pDevice->numEqns; index++) { - pDevice->rhs[index] = 0.0; - } - /* compute incremental changes due to N contact */ - pNode = pElem->pLeftNode; - pDevice->rhs[pNode->psiEqn] = pElem->epsRel * pElem->rDx; - if (pElem->elemType == SEMICON) { - pEdge = pElem->pEdge; - pDevice->rhs[pNode->nEqn] = -pEdge->dJnDpsiP1; - pDevice->rhs[pNode->pEqn] = -pEdge->dJpDpsiP1; - } - incVpn = pDevice->dcDeltaSolution; - spSolve(pDevice->matrix, pDevice->rhs, incVpn, NULL, NULL); - - pElem = pDevice->elemArray[1]; - pNode = pElem->pRightNode; - pEdge = pElem->pEdge; - dPsiDv = incVpn[pNode->psiEqn]; - if (pElem->elemType == SEMICON) { - dNDv = incVpn[pNode->nEqn]; - dPDv = incVpn[pNode->pEqn]; - *gd += pEdge->dJnDpsiP1 * dPsiDv + pEdge->dJnDnP1 * dNDv + - pEdge->dJpDpsiP1 * dPsiDv + pEdge->dJpDpP1 * dPDv; - } - /* For transient analysis, add the displacement term */ - if (tranAnalysis) { - *gd -= intCoeff[0] * pElem->epsRel * pElem->rDx * dPsiDv; - } - *gd *= -GNorm * pDevice->area; - -} - -void -NBJTconductance(ONEdevice *pDevice, BOOLEAN tranAnalysis, double *intCoeff, - double *dIeDVce, double *dIcDVce, double *dIeDVbe, double *dIcDVbe) -{ - ONEelem *pLastElem = pDevice->elemArray[pDevice->numNodes - 1]; - ONEelem *pBaseElem = pDevice->elemArray[pDevice->baseIndex - 1]; - ONEelem *pElem; - ONEnode *pNode; - ONEedge *pEdge; - int index; - double dPsiDVce, dPsiDVbe, dNDVce, dNDVbe, dPDVce, dPDVbe; - double *incVce, *incVbe; - double nConc, pConc; - double area = pDevice->area; - - *dIeDVce = 0.0; - *dIcDVce = 0.0; - *dIeDVbe = 0.0; - *dIcDVbe = 0.0; - - /* zero the rhs before loading in the new rhs */ - for (index = 1; index <= pDevice->numEqns; index++) { - pDevice->rhs[index] = 0.0; - } - /* store the new rhs for computing CE incremental quantities */ - pNode = pLastElem->pLeftNode; - pDevice->rhs[pNode->psiEqn] = pLastElem->epsRel * pLastElem->rDx; - if (pLastElem->elemType == SEMICON) { - pEdge = pLastElem->pEdge; - pDevice->rhs[pNode->nEqn] = -pEdge->dJnDpsiP1; - pDevice->rhs[pNode->pEqn] = -pEdge->dJpDpsiP1; - } - incVce = pDevice->dcDeltaSolution; - spSolve(pDevice->matrix, pDevice->rhs, incVce, NULL, NULL); - - /* zero the rhs before loading in the new rhs base contribution */ - for (index = 1; index <= pDevice->numEqns; index++) { - pDevice->rhs[index] = 0.0; - } - pNode = pBaseElem->pRightNode; - - if (pNode->baseType == N_TYPE) { - nConc = pDevice->devState0 [pNode->nodeN]; - pDevice->rhs[pNode->nEqn] = nConc * pNode->eg; - } else if (pNode->baseType == P_TYPE) { - pConc = pDevice->devState0 [pNode->nodeP]; - pDevice->rhs[pNode->pEqn] = pConc * pNode->eg; - } else { - printf("NBJTconductance: unknown base type\n"); - } - - incVbe = pDevice->copiedSolution; - spSolve(pDevice->matrix, pDevice->rhs, incVbe, NULL, NULL); - - pElem = pDevice->elemArray[1];/* first element */ - pEdge = pElem->pEdge; - pNode = pElem->pRightNode; - - dPsiDVce = incVce[pNode->psiEqn]; - dPsiDVbe = incVbe[pNode->psiEqn]; - if (pElem->elemType == SEMICON) { - dNDVce = incVce[pNode->nEqn]; - dPDVce = incVce[pNode->pEqn]; - dNDVbe = incVbe[pNode->nEqn]; - dPDVbe = incVbe[pNode->pEqn]; - *dIeDVce += pEdge->dJnDpsiP1 * dPsiDVce + pEdge->dJnDnP1 * dNDVce + - pEdge->dJpDpsiP1 * dPsiDVce + pEdge->dJpDpP1 * dPDVce; - *dIeDVbe += pEdge->dJnDpsiP1 * dPsiDVbe + pEdge->dJnDnP1 * dNDVbe + - pEdge->dJpDpsiP1 * dPsiDVbe + pEdge->dJpDpP1 * dPDVbe; - } - /* For transient analysis add the displacement term */ - if (tranAnalysis) { - *dIeDVce -= intCoeff[0] * pElem->epsRel * dPsiDVce * pElem->rDx; - *dIeDVbe -= intCoeff[0] * pElem->epsRel * dPsiDVbe * pElem->rDx; - } - pElem = pDevice->elemArray[pDevice->numNodes - 1]; /* last element */ - pEdge = pElem->pEdge; - pNode = pElem->pLeftNode; - dPsiDVce = incVce[pNode->psiEqn]; - dPsiDVbe = incVbe[pNode->psiEqn]; - if (pElem->elemType == SEMICON) { - dNDVce = incVce[pNode->nEqn]; - dPDVce = incVce[pNode->pEqn]; - dNDVbe = incVbe[pNode->nEqn]; - dPDVbe = incVbe[pNode->pEqn]; - *dIcDVce += -pEdge->dJnDpsiP1 * dPsiDVce + pEdge->dJnDn * dNDVce + - -pEdge->dJpDpsiP1 * dPsiDVce + pEdge->dJpDp * dPDVce + - /* add terms since adjacent to boundary */ - pEdge->dJnDpsiP1 + pEdge->dJpDpsiP1; - *dIcDVbe += -pEdge->dJnDpsiP1 * dPsiDVbe + pEdge->dJnDn * dNDVbe + - -pEdge->dJpDpsiP1 * dPsiDVbe + pEdge->dJpDp * dPDVbe; - } - if (tranAnalysis) { - *dIcDVce += intCoeff[0] * pElem->epsRel * (dPsiDVce - 1.0) * pElem->rDx; - *dIcDVbe += intCoeff[0] * pElem->epsRel * dPsiDVbe * pElem->rDx; - } - *dIeDVce *= -GNorm * area; - *dIcDVce *= -GNorm * area; - *dIeDVbe *= -GNorm * area; - *dIcDVbe *= -GNorm * area; -} - -void -NUMDcurrent(ONEdevice *pDevice, BOOLEAN tranAnalysis, double *intCoeff, - double *id) -{ - ONEnode *pNode; - ONEelem *pElem; - ONEedge *pEdge; - double *delta = pDevice->dcDeltaSolution; - double dPsi, dN, dP; - - *id = 0.0; - - pElem = pDevice->elemArray[1]; - pNode = pElem->pRightNode; - pEdge = pElem->pEdge; - dPsi = delta[pNode->psiEqn]; - *id = pEdge->jn + pEdge->jp + pElem->epsRel * pEdge->jd; - if (pElem->elemType == SEMICON) { - dN = delta[pNode->nEqn]; - dP = delta[pNode->pEqn]; - *id += pEdge->dJnDpsiP1 * dPsi + pEdge->dJnDnP1 * dN + - pEdge->dJpDpsiP1 * dPsi + pEdge->dJpDpP1 * dP; - } - /* for transient analysis add the displacement term */ - if (tranAnalysis) { - *id -= intCoeff[0] * pElem->epsRel * pElem->rDx * dPsi; - } - *id *= JNorm * pDevice->area; -} - -void -NBJTcurrent(ONEdevice *pDevice, BOOLEAN tranAnalysis, double *intCoeff, - double *ie, double *ic) -{ - ONEnode *pNode; - ONEelem *pElem; - ONEedge *pEdge; - double dPsi, dN, dP; - double *solution; - - solution = pDevice->dcDeltaSolution; - - /* first edge for calculating ie */ - pElem = pDevice->elemArray[1]; - pNode = pElem->pRightNode; - pEdge = pElem->pEdge; - dPsi = solution[pNode->psiEqn]; - *ie = pEdge->jn + pEdge->jp + pElem->epsRel * pEdge->jd; - if (pElem->elemType == SEMICON) { - dN = solution[pNode->nEqn]; - dP = solution[pNode->pEqn]; - *ie += pEdge->dJnDpsiP1 * dPsi + pEdge->dJnDnP1 * dN + - pEdge->dJpDpsiP1 * dPsi + pEdge->dJpDpP1 * dP; - } - /* for transient analysis add the displacement term */ - if (tranAnalysis) { - *ie -= intCoeff[0] * pElem->epsRel * dPsi * pElem->rDx; - } - /* last edge for calculating ic */ - pElem = pDevice->elemArray[pDevice->numNodes - 1]; - pNode = pElem->pLeftNode; - pEdge = pElem->pEdge; - dPsi = solution[pNode->psiEqn]; - *ic = pEdge->jn + pEdge->jp + pElem->epsRel * pEdge->jd; - if (pElem->elemType == SEMICON) { - dN = solution[pNode->nEqn]; - dP = solution[pNode->pEqn]; - *ic += -pEdge->dJnDpsiP1 * dPsi + pEdge->dJnDn * dN + - -pEdge->dJpDpsiP1 * dPsi + pEdge->dJpDp * dP; - } - if (tranAnalysis) { - *ic += intCoeff[0] * pElem->epsRel * dPsi * pElem->rDx; - } - *ic *= -JNorm * pDevice->area; - *ie *= -JNorm * pDevice->area; -} diff --git a/src/ciderlib/oned/onecont.c b/src/ciderlib/oned/onecont.c deleted file mode 100644 index 4bcffdc33..000000000 --- a/src/ciderlib/oned/onecont.c +++ /dev/null @@ -1,652 +0,0 @@ -/********** -Copyright 1991 Regents of the University of California. All rights reserved. -Author: 1987 Kartikeya Mayaram, U. C. Berkeley CAD Group -**********/ - -#include "ngspice/ngspice.h" -#include "ngspice/numglobs.h" -#include "ngspice/numenum.h" -#include "ngspice/onemesh.h" -#include "ngspice/onedev.h" -#include "ngspice/spmatrix.h" -#include "ngspice/macros.h" -#include "onedext.h" -#include "oneddefs.h" -#include "ngspice/cidersupt.h" -#include "../../maths/misc/bernoull.h" - - -/* functions to setup and solve the continuity equations */ -/* Both continuity equations are solved */ - - -void -ONE_jacBuild(ONEdevice *pDevice) -{ - SMPmatrix *matrix = pDevice->matrix; - ONEelem *pElem; - ONEnode *pNode; - int index, eIndex; - int psiEqn, nEqn, pEqn; /* scratch for deref'd eqn numbers */ - int psiEqnL=0, nEqnL=0, pEqnL=0; - int psiEqnR=0, nEqnR=0, pEqnR=0; - - - for (eIndex = 1; eIndex < pDevice->numNodes; eIndex++) { - pElem = pDevice->elemArray[eIndex]; - /* first the self terms */ - for (index = 0; index <= 1; index++) { - pNode = pElem->pNodes[index]; - /* get poisson pointer */ - psiEqn = pNode->psiEqn; - pNode->fPsiPsi = spGetElement(matrix, psiEqn, psiEqn); - - if (pElem->elemType == SEMICON) { - /* get continuity-coupling terms */ - nEqn = pNode->nEqn; - pEqn = pNode->pEqn; - /* pointers for additional terms */ - pNode->fPsiN = spGetElement(matrix, psiEqn, nEqn); - pNode->fPsiP = spGetElement(matrix, psiEqn, pEqn); - pNode->fNPsi = spGetElement(matrix, nEqn, psiEqn); - pNode->fNN = spGetElement(matrix, nEqn, nEqn); - pNode->fNP = spGetElement(matrix, nEqn, pEqn); - pNode->fPPsi = spGetElement(matrix, pEqn, psiEqn); - pNode->fPP = spGetElement(matrix, pEqn, pEqn); - pNode->fPN = spGetElement(matrix, pEqn, nEqn); - } else { - nEqn = 0; - pEqn = 0; - } - - /* save indices */ - if (index == 0) { /* left node */ - psiEqnL = psiEqn; - nEqnL = nEqn; - pEqnL = pEqn; - } else { - psiEqnR = psiEqn; - nEqnR = nEqn; - pEqnR = pEqn; - } - } - - /* now terms to couple to adjacent nodes */ - pNode = pElem->pLeftNode; - pNode->fPsiPsiiP1 = spGetElement(matrix, psiEqnL, psiEqnR); - if (pElem->elemType == SEMICON) { - /* pointers for additional terms */ - pNode->fNPsiiP1 = spGetElement(matrix, nEqnL, psiEqnR); - pNode->fNNiP1 = spGetElement(matrix, nEqnL, nEqnR); - pNode->fPPsiiP1 = spGetElement(matrix, pEqnL, psiEqnR); - pNode->fPPiP1 = spGetElement(matrix, pEqnL, pEqnR); - if (AvalancheGen) { - pNode->fNPiP1 = spGetElement(matrix, nEqnL, pEqnR); - pNode->fPNiP1 = spGetElement(matrix, pEqnL, nEqnR); - } - } - pNode = pElem->pRightNode; - pNode->fPsiPsiiM1 = spGetElement(matrix, psiEqnR, psiEqnL); - if (pElem->elemType == SEMICON) { - /* pointers for additional terms */ - pNode->fNPsiiM1 = spGetElement(matrix, nEqnR, psiEqnL); - pNode->fNNiM1 = spGetElement(matrix, nEqnR, nEqnL); - pNode->fPPsiiM1 = spGetElement(matrix, pEqnR, psiEqnL); - pNode->fPPiM1 = spGetElement(matrix, pEqnR, pEqnL); - if (AvalancheGen) { - pNode->fNPiM1 = spGetElement(matrix, nEqnR, pEqnL); - pNode->fPNiM1 = spGetElement(matrix, pEqnR, nEqnL); - } - } - } -} - - -void -ONE_sysLoad(ONEdevice *pDevice, BOOLEAN tranAnalysis, - ONEtranInfo *info) -{ - ONEelem *pElem; - ONEnode *pNode; - ONEedge *pEdge; - int index, eIndex; - double *pRhs = pDevice->rhs; - double dx, rDx, dPsi; - double generation; - double perTime = 0.0; - double fNd, fNa, fdNd, fdNa; - double netConc, dNd, dNa, psi, nConc, pConc; - - - /* first compute the currents and their derivatives */ - ONE_commonTerms(pDevice, FALSE, tranAnalysis, info); - - /* find reciprocal timestep */ - if (tranAnalysis) { - perTime = info->intCoeff[0]; - } - /* zero the rhs vector */ - for (index = 1; index <= pDevice->numEqns; index++) { - pRhs[index] = 0.0; - } - - /* zero the matrix */ - spClear(pDevice->matrix); - - for (eIndex = 1; eIndex < pDevice->numNodes; eIndex++) { - pElem = pDevice->elemArray[eIndex]; - dx = 0.5 * pElem->dx; - rDx = pElem->epsRel * pElem->rDx; - - /* load for all i */ - for (index = 0; index <= 1; index++) { - pNode = pElem->pNodes[index]; - if (pNode->nodeType != CONTACT) { - *(pNode->fPsiPsi) += rDx; - pRhs[pNode->psiEqn] += pNode->qf; - if (pElem->elemType == SEMICON) { - pEdge = pElem->pEdge; - netConc = pNode->netConc; - dNd = 0.0; - dNa = 0.0; - psi = pDevice->devState0 [pNode->nodePsi]; - nConc = pDevice->devState0 [pNode->nodeN]; - pConc = pDevice->devState0 [pNode->nodeP]; - - - if (FreezeOut) { - ONE_freezeOut(pNode, nConc, pConc, &fNd, &fNa, &fdNd, &fdNa); - netConc = pNode->nd * fNd - pNode->na * fNa; - dNd = pNode->nd * fdNd; - dNa = pNode->na * fdNa; - } - *(pNode->fPsiN) += dx * (1.0 - dNd); - *(pNode->fPsiP) -= dx * (1.0 - dNa); - *(pNode->fNPsi) -= pEdge->dJnDpsiP1; - *(pNode->fPPsi) -= pEdge->dJpDpsiP1; - - pRhs[pNode->psiEqn] += dx * (netConc + pConc - nConc); - - /* Handle generation terms */ - *(pNode->fNN) -= dx * pNode->dUdN; - *(pNode->fNP) -= dx * pNode->dUdP; - *(pNode->fPP) += dx * pNode->dUdP; - *(pNode->fPN) += dx * pNode->dUdN; - pRhs[pNode->nEqn] -= -dx * pNode->uNet; - pRhs[pNode->pEqn] -= dx * pNode->uNet; - - /* Handle dXdT continuity terms */ - if (tranAnalysis) { - *(pNode->fNN) -= dx * perTime; - *(pNode->fPP) += dx * perTime; - pRhs[pNode->nEqn] += dx * pNode->dNdT; - pRhs[pNode->pEqn] -= dx * pNode->dPdT; - } - /* Take care of base contact if necessary */ - /* eg holds the base edge mu/dx */ - if (pNode->baseType == N_TYPE) { - pRhs[pNode->nEqn] += 0.5 * pNode->eg * nConc * - (pNode->vbe - psi + log(nConc / pNode->nie)); - *(pNode->fNPsi) += 0.5 * pNode->eg * nConc; - *(pNode->fNN) -= 0.5 * pNode->eg * - (pNode->vbe - psi + log(nConc / pNode->nie) + 1.0); - } else if (pNode->baseType == P_TYPE) { - pRhs[pNode->pEqn] += 0.5 * pNode->eg * pConc * - (pNode->vbe - psi - log(pConc / pNode->nie)); - *(pNode->fPPsi) += 0.5 * pNode->eg * pConc; - *(pNode->fPP) -= 0.5 * pNode->eg * - (pNode->vbe - psi - log(pConc / pNode->nie) - 1.0); - } - } - } - } - - pEdge = pElem->pEdge; - dPsi = pEdge->dPsi; - - pNode = pElem->pLeftNode; - if (pNode->nodeType != CONTACT) { - pRhs[pNode->psiEqn] += rDx * dPsi; - *(pNode->fPsiPsiiP1) -= rDx; - if (pElem->elemType == SEMICON) { - pRhs[pNode->nEqn] -= pEdge->jn; - pRhs[pNode->pEqn] -= pEdge->jp; - - *(pNode->fNN) += pEdge->dJnDn; - *(pNode->fPP) += pEdge->dJpDp; - *(pNode->fNPsiiP1) += pEdge->dJnDpsiP1; - *(pNode->fNNiP1) += pEdge->dJnDnP1; - *(pNode->fPPsiiP1) += pEdge->dJpDpsiP1; - *(pNode->fPPiP1) += pEdge->dJpDpP1; - } - } - pNode = pElem->pRightNode; - if (pNode->nodeType != CONTACT) { - pRhs[pNode->psiEqn] -= rDx * dPsi; - *(pNode->fPsiPsiiM1) -= rDx; - if (pElem->elemType == SEMICON) { - pRhs[pNode->nEqn] += pEdge->jn; - pRhs[pNode->pEqn] += pEdge->jp; - - - *(pNode->fNN) -= pEdge->dJnDnP1; - *(pNode->fPP) -= pEdge->dJpDpP1; - *(pNode->fNPsiiM1) += pEdge->dJnDpsiP1; - *(pNode->fNNiM1) -= pEdge->dJnDn; - *(pNode->fPPsiiM1) += pEdge->dJpDpsiP1; - *(pNode->fPPiM1) -= pEdge->dJpDp; - } - } - } - if (AvalancheGen) { - /* add the generation terms */ - for (eIndex = 1; eIndex < pDevice->numNodes; eIndex++) { - pElem = pDevice->elemArray[eIndex]; - for (index = 0; index <= 1; index++) { - if (pElem->evalNodes[index]) { - pNode = pElem->pNodes[index]; - if ((pNode->nodeType != CONTACT) && (pElem->elemType == SEMICON)) { - generation = ONEavalanche(FALSE, pDevice, pNode); - pRhs[pNode->nEqn] -= generation; - pRhs[pNode->pEqn] += generation; - } - } - } - } - } -} - - -void -ONE_jacLoad(ONEdevice *pDevice) -{ - /* used only for ac analysis */ - ONEelem *pElem; - ONEnode *pNode, *pNode1; - ONEedge *pEdge; - int index, eIndex; - double dx, rDx, dPsi; - double generation; - double fNd, fNa, fdNd, fdNa; - double dNd, dNa, psi, nConc, pConc; - - - /* first compute the currents and their derivatives */ - ONE_commonTerms(pDevice, FALSE, FALSE, NULL); - - /* zero the matrix */ - spClear(pDevice->matrix); - - for (eIndex = 1; eIndex < pDevice->numNodes; eIndex++) { - pElem = pDevice->elemArray[eIndex]; - dx = 0.5 * pElem->dx; - rDx = pElem->epsRel * pElem->rDx; - /* load for all i */ - for (index = 0; index <= 1; index++) { - pNode = pElem->pNodes[index]; - if (pNode->nodeType != CONTACT) { - *(pNode->fPsiPsi) += rDx; - if (pElem->elemType == SEMICON) { - pEdge = pElem->pEdge; - dNd = 0.0; - dNa = 0.0; - psi = pDevice->devState0 [pNode->nodePsi]; - nConc = pDevice->devState0 [pNode->nodeN]; - pConc = pDevice->devState0 [pNode->nodeP]; - if (FreezeOut) { - ONE_freezeOut(pNode, nConc, pConc, &fNd, &fNa, &fdNd, &fdNa); - dNd = pNode->nd * fdNd; - dNa = pNode->na * fdNa; - } - *(pNode->fPsiN) += dx * (1.0 - dNd); - *(pNode->fPsiP) -= dx * (1.0 - dNa); - *(pNode->fNPsi) -= pEdge->dJnDpsiP1; - *(pNode->fPPsi) -= pEdge->dJpDpsiP1; - - if (pNode->baseType == N_TYPE) { - *(pNode->fNPsi) += 0.5 * nConc * pNode->eg; - *(pNode->fNN) -= 0.5 * pNode->eg - * (pNode->vbe - psi + log(nConc / pNode->nie) + 1.0); - } - if (pNode->baseType == P_TYPE) { - *(pNode->fPPsi) += 0.5 * pConc * pNode->eg; - *(pNode->fPP) -= 0.5 * pNode->eg - * (pNode->vbe - psi - log(pConc / pNode->nie) - 1.0); - } - } - } - } - pNode = pElem->pLeftNode; - if (pNode->nodeType != CONTACT) { - pEdge = pElem->pEdge; - dPsi = pEdge->dPsi; - if (pElem->elemType == SEMICON) { - *(pNode->fNN) += pEdge->dJnDn - dx * pNode->dUdN; - *(pNode->fNP) -= dx * pNode->dUdP; - *(pNode->fPP) += pEdge->dJpDp + dx * pNode->dUdP; - *(pNode->fPN) += dx * pNode->dUdN; - } - pNode1 = pElem->pRightNode; - if (pNode1->nodeType != CONTACT) { - *(pNode->fPsiPsiiP1) -= rDx; - if (pElem->elemType == SEMICON) { - *(pNode->fNPsiiP1) += pEdge->dJnDpsiP1; - *(pNode->fNNiP1) += pEdge->dJnDnP1; - *(pNode->fPPsiiP1) += pEdge->dJpDpsiP1; - *(pNode->fPPiP1) += pEdge->dJpDpP1; - } - } - } - pNode = pElem->pRightNode; - if (pNode->nodeType != CONTACT) { - pEdge = pElem->pEdge; - dPsi = pEdge->dPsi; - if (pElem->elemType == SEMICON) { - *(pNode->fNN) += -pEdge->dJnDnP1 - dx * pNode->dUdN; - *(pNode->fNP) -= dx * pNode->dUdP; - *(pNode->fPP) += -pEdge->dJpDpP1 + dx * pNode->dUdP; - *(pNode->fPN) += dx * pNode->dUdN; - } - pNode1 = pElem->pLeftNode; - if (pNode1->nodeType != CONTACT) { - *(pNode->fPsiPsiiM1) -= rDx; - if (pElem->elemType == SEMICON) { - *(pNode->fNPsiiM1) += pEdge->dJnDpsiP1; - *(pNode->fNNiM1) -= pEdge->dJnDn; - *(pNode->fPPsiiM1) += pEdge->dJpDpsiP1; - *(pNode->fPPiM1) -= pEdge->dJpDp; - } - } - } - } - if (AvalancheGen) { - /* add the generation terms */ - for (eIndex = 1; eIndex < pDevice->numNodes; eIndex++) { - pElem = pDevice->elemArray[eIndex]; - for (index = 0; index <= 1; index++) { - if (pElem->evalNodes[index]) { - pNode = pElem->pNodes[index]; - if ((pNode->nodeType != CONTACT) && (pElem->elemType == SEMICON)) { - generation = ONEavalanche(FALSE, pDevice, pNode); - } - } - } - } - } -} - -void -ONE_rhsLoad(ONEdevice *pDevice, BOOLEAN tranAnalysis, - ONEtranInfo *info) -{ - ONEelem *pElem; - ONEnode *pNode; - ONEedge *pEdge; - int index, eIndex; - double *pRhs = pDevice->rhs; - double dx, rDx, dPsi; - double generation; - double perTime; - double fNd, fNa, fdNd, fdNa; - double netConc, dNd, dNa, psi, nConc, pConc; - - /* first compute the currents and their derivatives */ - ONE_commonTerms(pDevice, FALSE, tranAnalysis, info); - - /* find reciprocal timestep */ - if (tranAnalysis) { - perTime = info->intCoeff[0]; - } - /* zero the rhs vector */ - for (index = 1; index <= pDevice->numEqns; index++) { - pRhs[index] = 0.0; - } - - for (eIndex = 1; eIndex < pDevice->numNodes; eIndex++) { - pElem = pDevice->elemArray[eIndex]; - - dx = 0.5 * pElem->dx; - rDx = pElem->epsRel * pElem->rDx; - - /* load for all i */ - for (index = 0; index <= 1; index++) { - pNode = pElem->pNodes[index]; - if (pNode->nodeType != CONTACT) { - pRhs[pNode->psiEqn] += pNode->qf; - if (pElem->elemType == SEMICON) { - pEdge = pElem->pEdge; - netConc = pNode->netConc; - dNd = 0.0; - dNa = 0.0; - psi = pDevice->devState0 [pNode->nodePsi]; - nConc = pDevice->devState0 [pNode->nodeN]; - pConc = pDevice->devState0 [pNode->nodeP]; - if (FreezeOut) { - ONE_freezeOut(pNode, nConc, pConc, &fNd, &fNa, &fdNd, &fdNa); - netConc = pNode->nd * fNd - pNode->na * fNa; - dNd = pNode->nd * fdNd; - dNa = pNode->na * fdNa; - } - pRhs[pNode->psiEqn] += dx * (netConc + pConc - nConc); - - /* Handle generation terms */ - pRhs[pNode->nEqn] -= -dx * pNode->uNet; - pRhs[pNode->pEqn] -= dx * pNode->uNet; - - /* Handle dXdT continuity terms */ - if (tranAnalysis) { - pRhs[pNode->nEqn] += dx * pNode->dNdT; - pRhs[pNode->pEqn] -= dx * pNode->dPdT; - } - /* Take care of base contact if necessary */ - /* eg holds the base edge mu/dx */ - if (pNode->baseType == N_TYPE) { - pRhs[pNode->nEqn] += 0.5 * pNode->eg * nConc * - (pNode->vbe - psi + log(nConc / pNode->nie)); - } else if (pNode->baseType == P_TYPE) { - pRhs[pNode->pEqn] += 0.5 * pNode->eg * pConc * - (pNode->vbe - psi - log(pConc / pNode->nie)); - } - } - } - } - - pEdge = pElem->pEdge; - dPsi = pEdge->dPsi; - - pNode = pElem->pLeftNode; - if (pNode->nodeType != CONTACT) { - pRhs[pNode->psiEqn] += rDx * dPsi; - if (pElem->elemType == SEMICON) { - pRhs[pNode->nEqn] -= pEdge->jn; - pRhs[pNode->pEqn] -= pEdge->jp; - } - } - pNode = pElem->pRightNode; - if (pNode->nodeType != CONTACT) { - pRhs[pNode->psiEqn] -= rDx * dPsi; - if (pElem->elemType == SEMICON) { - pRhs[pNode->nEqn] += pEdge->jn; - pRhs[pNode->pEqn] += pEdge->jp; - } - } - } - if (AvalancheGen) { - /* add the generation terms */ - for (eIndex = 1; eIndex < pDevice->numNodes; eIndex++) { - pElem = pDevice->elemArray[eIndex]; - for (index = 0; index <= 1; index++) { - if (pElem->evalNodes[index]) { - pNode = pElem->pNodes[index]; - if ((pNode->nodeType != CONTACT) && (pElem->elemType == SEMICON)) { - generation = ONEavalanche(TRUE, pDevice, pNode); - pRhs[pNode->nEqn] -= generation; - pRhs[pNode->pEqn] += generation; - } - } - } - } - } -} - -void -ONE_commonTerms(ONEdevice *pDevice, BOOLEAN currentOnly, - BOOLEAN tranAnalysis, ONEtranInfo *info) -{ - ONEelem *pElem; - ONEedge *pEdge; - ONEnode *pNode; - int index, eIndex; - double psi1, psi2, psi, nConc=0.0, pConc=0.0, nC, pC, nP1, pP1; - double dPsiN, dPsiP; - double bPsiN, dbPsiN, bMPsiN, dbMPsiN; - double bPsiP, dbPsiP, bMPsiP, dbMPsiP; - double mun, dMun, mup, dMup; - double conc1, conc2; - double cnAug, cpAug; - - - /* evaluate all node (including recombination) and edge quantities */ - for (eIndex = 1; eIndex < pDevice->numNodes; eIndex++) { - pElem = pDevice->elemArray[eIndex]; - cnAug = pElem->matlInfo->cAug[ELEC]; - cpAug = pElem->matlInfo->cAug[HOLE]; - for (index = 0; index <= 1; index++) { - if (pElem->evalNodes[index]) { - pNode = pElem->pNodes[index]; - if (pNode->nodeType != CONTACT) { - psi = pDevice->dcSolution[pNode->psiEqn]; - if (pElem->elemType == SEMICON) { - nConc = pDevice->dcSolution[pNode->nEqn]; - pConc = pDevice->dcSolution[pNode->pEqn]; - if (Srh) { - recomb(nConc, pConc, - pNode->tn, pNode->tp, cnAug, cpAug, pNode->nie, - &pNode->uNet, &pNode->dUdN, &pNode->dUdP); - } else { - pNode->uNet = 0.0; - pNode->dUdN = 0.0; - pNode->dUdP = 0.0; - } - if (pNode->baseType == P_TYPE && pConc <= 0.0) { - pConc = pNode->na; - } else if (pNode->baseType == N_TYPE && nConc <= 0.0) { - nConc = pNode->nd; - } - } - } else { - /* a contact node */ - psi = pNode->psi; - if (pElem->elemType == SEMICON) { - nConc = pNode->nConc; - pConc = pNode->pConc; - } - } - /* store info in the state tables */ - pDevice->devState0 [pNode->nodePsi] = psi; - if (pElem->elemType == SEMICON) { - pDevice->devState0 [pNode->nodeN] = nConc; - pDevice->devState0 [pNode->nodeP] = pConc; - if (tranAnalysis && pNode->nodeType != CONTACT) { - pNode->dNdT = integrate(pDevice->devStates, info, pNode->nodeN); - pNode->dPdT = integrate(pDevice->devStates, info, pNode->nodeP); - } - } - } - } - pEdge = pElem->pEdge; - pNode = pElem->pLeftNode; - if (pNode->nodeType != CONTACT) { - psi1 = pDevice->dcSolution[pNode->psiEqn]; - } else { - psi1 = pNode->psi; - } - pNode = pElem->pRightNode; - if (pNode->nodeType != CONTACT) { - psi2 = pDevice->dcSolution[pNode->psiEqn]; - } else { - psi2 = pNode->psi; - } - pEdge->dPsi = psi2 - psi1; - pDevice->devState0 [pEdge->edgeDpsi] = pEdge->dPsi; - } - /* calculate the current densities and mobility values */ - for (eIndex = 1; eIndex < pDevice->numNodes; eIndex++) { - pElem = pDevice->elemArray[eIndex]; - pEdge = pElem->pEdge; - if (pElem->elemType == SEMICON) { - dPsiN = pEdge->dPsi + pEdge->dCBand; - dPsiP = pEdge->dPsi - pEdge->dVBand; - bernoulli(dPsiN, &bPsiN, &dbPsiN, &bMPsiN, &dbMPsiN, !currentOnly); - bernoulli(dPsiP, &bPsiP, &dbPsiP, &bMPsiP, &dbMPsiP, !currentOnly); - nC = pDevice->devState0 [pElem->pLeftNode->nodeN]; - nP1 = pDevice->devState0 [pElem->pRightNode->nodeN]; - pC = pDevice->devState0 [pElem->pLeftNode->nodeP]; - pP1 = pDevice->devState0 [pElem->pRightNode->nodeP]; - conc1 = pElem->pLeftNode->totalConc; - conc2 = pElem->pRightNode->totalConc; - pEdge->jn = (bPsiN * nP1 - bMPsiN * nC); - pEdge->jp = (bPsiP * pC - bMPsiP * pP1); - - - mun = pEdge->mun; - dMun = 0.0; - mup = pEdge->mup; - dMup = 0.0; - MOBfieldDep(pElem->matlInfo, ELEC, dPsiN * pElem->rDx, &mun, &dMun); - MOBfieldDep(pElem->matlInfo, HOLE, dPsiP * pElem->rDx, &mup, &dMup); - - - mun *= pElem->rDx; - dMun *= pElem->rDx * pElem->rDx; - mup *= pElem->rDx; - dMup *= pElem->rDx * pElem->rDx; - - - - /* - * The base continuity equation makes use of mu/dx in eg. The base - * length has already been calculated and converted to normalized, - * reciprocal form during setup. The name should be changed, but that's - * a big hassle. - */ - for (index = 0; index <= 1; index++) { - if (pElem->evalNodes[index]) { - pNode = pElem->pNodes[index]; - if (pNode->baseType == N_TYPE) { - pNode->eg = pEdge->mun * pDevice->baseLength; - } else if (pNode->baseType == P_TYPE) { - pNode->eg = pEdge->mup * pDevice->baseLength; - } - } - } - - pEdge->jn *= mun; - pEdge->jp *= mup; - - - if (!currentOnly) { - if (dMun == 0.0) { - pEdge->dJnDpsiP1 = mun * (dbPsiN * nP1 - dbMPsiN * nC); - } else { - pEdge->dJnDpsiP1 = dMun * (bPsiN * nP1 - bMPsiN * nC) - + mun * (dbPsiN * nP1 - dbMPsiN * nC); - } - pEdge->dJnDn = -mun * bMPsiN; - pEdge->dJnDnP1 = mun * bPsiN; - if (dMup == 0.0) { - pEdge->dJpDpsiP1 = mup * (dbPsiP * pC - dbMPsiP * pP1); - } else { - pEdge->dJpDpsiP1 = dMup * (bPsiP * pC - bMPsiP * pP1) - + mup * (dbPsiP * pC - dbMPsiP * pP1); - } - pEdge->dJpDp = mup * bPsiP; - pEdge->dJpDpP1 = -mup * bMPsiP; - } - } - if (tranAnalysis) { - pEdge->jd = -integrate(pDevice->devStates, info, - pEdge->edgeDpsi) * pElem->rDx; - } - } -} diff --git a/src/ciderlib/oned/oneddefs.h b/src/ciderlib/oned/oneddefs.h deleted file mode 100644 index e8e93b156..000000000 --- a/src/ciderlib/oned/oneddefs.h +++ /dev/null @@ -1,29 +0,0 @@ -/* - * 2001 Paolo Nenzi - */ - -#ifndef ngspice_ONEDDEFS_H -#define ngspice_ONEDDEFS_H - -/* Debug statements */ - -extern BOOLEAN ONEacDebug; -extern BOOLEAN ONEdcDebug; -extern BOOLEAN ONEtranDebug; -extern BOOLEAN ONEjacDebug; - -/* Now some defines for the one dimensional simulator - * library. - * Theese defines were gathered from all the code in - * oned directory. - */ - -#define LEVEL_ALPHA_SI 3.1e-8 /* From de Graaf & Klaasen, pg. 12 */ -#define MIN_DELV 1e-3 -#define NORM_RED_MAXITERS 10 - - - - - -#endif diff --git a/src/ciderlib/oned/onedest.c b/src/ciderlib/oned/onedest.c deleted file mode 100644 index 385f68299..000000000 --- a/src/ciderlib/oned/onedest.c +++ /dev/null @@ -1,74 +0,0 @@ -/********** -Copyright 1991 Regents of the University of California. All rights reserved. -Author: 1991 David A. Gates, U. C. Berkeley CAD Group -**********/ - -#include "ngspice/ngspice.h" -#include "ngspice/numglobs.h" -#include "ngspice/numenum.h" -#include "ngspice/onedev.h" -#include "ngspice/onemesh.h" -#include "ngspice/spmatrix.h" -#include "onedext.h" -#include "oneddefs.h" - -void -ONEdestroy(ONEdevice *pDevice) -{ - int index, eIndex; - ONEelem *pElem; - ONEnode *pNode; - ONEedge *pEdge; - - - if (!pDevice) - return; - - switch (pDevice->solverType) { - case SLV_SMSIG: - case SLV_BIAS: - /* free up memory allocated for the bias solution */ - FREE(pDevice->dcSolution); - FREE(pDevice->dcDeltaSolution); - FREE(pDevice->copiedSolution); - FREE(pDevice->rhs); - FREE(pDevice->rhsImag); - spDestroy(pDevice->matrix); - break; - case SLV_EQUIL: - /* free up the vectors allocated in the equilibrium solution */ - FREE(pDevice->dcSolution); - FREE(pDevice->dcDeltaSolution); - FREE(pDevice->copiedSolution); - FREE(pDevice->rhs); - spDestroy(pDevice->matrix); - break; - case SLV_NONE: - break; - default: - fprintf(stderr, "Panic: Unknown solver type in ONEdestroy.\n"); - exit(-1); - break; - } - - /* destroy the mesh */ - if (pDevice->elemArray) { - for (eIndex = 1; eIndex < pDevice->numNodes-1; eIndex++) { - pElem = pDevice->elemArray[eIndex]; - pEdge = pElem->pEdge; - FREE(pEdge); - for (index = 0; index <= 1; index++) { - if (pElem->evalNodes[index]) { - pNode = pElem->pNodes[index]; - FREE(pNode); - } - } - FREE(pElem); - } - FREE(pDevice->elemArray); - } - /* destroy any other lists */ - /* NOT IMPLEMENTED */ - - FREE(pDevice); -} diff --git a/src/ciderlib/oned/onedext.h b/src/ciderlib/oned/onedext.h deleted file mode 100644 index 8548e7b36..000000000 --- a/src/ciderlib/oned/onedext.h +++ /dev/null @@ -1,119 +0,0 @@ -/* - * 2001 Paolo Nenzi - */ - - /* External symbols for ONE Dimensional simulator */ - -#ifndef ngspice_ONEDEXT_H -#define ngspice_ONEDEXT_H - -#include "ngspice/profile.h" -#include "ngspice/onemesh.h" -#include "ngspice/onedev.h" -#include "ngspice/carddefs.h" -#include "ngspice/bool.h" -#include "ngspice/complex.h" - -/* oneadmit.c */ -extern int NUMDadmittance(ONEdevice *, double, SPcomplex *); -extern int NBJTadmittance(ONEdevice *, double, SPcomplex *, - SPcomplex *, SPcomplex *, - SPcomplex *); -extern BOOLEAN ONEsorSolve(ONEdevice *, double *, double *, double omega); -extern void NUMDys(ONEdevice *, SPcomplex *, SPcomplex *); -extern void NBJTys(ONEdevice *,SPcomplex *, SPcomplex *, SPcomplex *, - SPcomplex *, SPcomplex *); - -extern SPcomplex *computeAdmittance(ONEnode *, BOOLEAN, double *xReal, - double *,SPcomplex *); - -/* oneaval.c */ -extern double ONEavalanche(BOOLEAN, ONEdevice *, ONEnode *); - -/* onecond.c */ -extern void NUMDconductance(ONEdevice *, BOOLEAN, double *, double *); -extern void NBJTconductance(ONEdevice *, BOOLEAN, double *, double *, - double *, double *, double *); -extern void NUMDcurrent(ONEdevice *, BOOLEAN, double *, double *); -extern void NBJTcurrent(ONEdevice *, BOOLEAN, double *, double *, - double *); - - -/* onecont */ -extern void ONE_jacBuild(ONEdevice *); -extern void ONE_sysLoad(ONEdevice *, BOOLEAN, ONEtranInfo *); -extern void ONE_jacLoad(ONEdevice *); -extern void ONE_rhsLoad(ONEdevice *, BOOLEAN, ONEtranInfo *); -extern void ONE_commonTerms(ONEdevice *, BOOLEAN, BOOLEAN, ONEtranInfo *); - - -/* onedest */ -extern void ONEdestroy(ONEdevice *); - -/* onedopng.c */ -extern double ONEdopingValue(DOPprofile *, DOPtable *, double ); -extern void ONEsetDoping(ONEdevice *, DOPprofile *, DOPtable *); - -/* onefreez.c */ -extern void ONEQfreezeOut(ONEnode *, double *, double *, double *, - double *); -extern void ONE_freezeOut(ONEnode *, double, double, double *, - double*, double *, double *); - - -/* onemesh.c */ -extern void ONEbuildMesh(ONEdevice *, ONEcoord *, ONEdomain *, - ONEmaterial *); -extern void ONEgetStatePointers(ONEdevice *, int *); -extern void adjustBaseContact(ONEdevice *, int, int); -extern void NBJTjunctions(ONEdevice *, int *, int *); -extern void ONEprnMesh(ONEdevice *); - -/* onepoiss.c */ -extern void ONEQjacBuild(ONEdevice *); -extern void ONEQsysLoad(ONEdevice *); -extern void ONEQrhsLoad(ONEdevice *); -extern void ONEQcommonTerms(ONEdevice *); - -/*oneprint.c */ -extern void ONEprnSolution(FILE *, ONEdevice *, OUTPcard *, BOOLEAN, char *); -extern void ONEmemStats(FILE *, ONEdevice *); -extern void ONEcpuStats(FILE *f, ONEdevice *); - - -/* oneproj.c */ -extern void NUMDproject(ONEdevice *, double); -extern void NBJTproject(ONEdevice *, double, double, double); -extern void NUMDupdate(ONEdevice *,double, BOOLEAN); -extern void NBJTupdate(ONEdevice *, double, double, double, BOOLEAN); -extern void NUMDsetBCs(ONEdevice *, double); -extern void NBJTsetBCs(ONEdevice *, double, double); - -/* oneread.c */ -extern int ONEreadState(ONEdevice *, char *, int, double *, double *); - -/*onesetup.c */ -extern void ONEsetup(ONEdevice *); -extern void ONEsetBCparams(ONEdevice *, BDRYcard *, CONTcard *); -extern void ONEnormalize(ONEdevice *); - -/* onesolve.c */ -extern void ONEdcSolve(ONEdevice *, int, BOOLEAN, BOOLEAN, ONEtranInfo *); -extern BOOLEAN ONEpsiDeltaConverged(ONEdevice *, int *); -extern BOOLEAN ONEdeltaConverged(ONEdevice *); -extern void ONEresetJacobian(ONEdevice *); -extern void ONEstoreNeutralGuess(ONEdevice *); -extern void ONEequilSolve(ONEdevice *); -extern void ONEbiasSolve(ONEdevice *, int, BOOLEAN, ONEtranInfo *); -extern void ONEstoreEquilibGuess(ONEdevice *); -extern void ONEstoreInitialGuess(ONEdevice *); -extern int ONEnewDelta(ONEdevice *, BOOLEAN, ONEtranInfo *); -extern double ONEtrunc(ONEdevice *, ONEtranInfo *, double); -extern void ONEsaveState(ONEdevice *); -extern double ONEnuNorm(ONEdevice *); -extern void ONEjacCheck(ONEdevice *, BOOLEAN, ONEtranInfo *); -extern void ONEpredict(ONEdevice *, ONEtranInfo *); -extern BOOLEAN ONEdeviceConverged(ONEdevice *); - - -#endif diff --git a/src/ciderlib/oned/onedopng.c b/src/ciderlib/oned/onedopng.c deleted file mode 100644 index ab0fc4ca9..000000000 --- a/src/ciderlib/oned/onedopng.c +++ /dev/null @@ -1,167 +0,0 @@ -/********** -Copyright 1991 Regents of the University of California. All rights reserved. -Author: 1987 Kartikeya Mayaram, U. C. Berkeley CAD Group -Author: 1991 David A. Gates, U. C. Berkeley CAD Group -**********/ - -#include "ngspice/ngspice.h" -#include "ngspice/numglobs.h" -#include "ngspice/numenum.h" -#include "ngspice/onemesh.h" -#include "ngspice/onedev.h" -#include "ngspice/profile.h" -#include "ngspice/macros.h" -#include "onedext.h" -#include "oneddefs.h" -#include "ngspice/cidersupt.h" - -/* functions in this file are used to calculate the conc */ - -double -ONEdopingValue(DOPprofile *pProfile, DOPtable *pTable, double x) -{ - double argX, argP, value=0.0; - - - /* Find the appropriate lookup table if necessary */ - if (pProfile->type == LOOKUP) { - while (pTable != NULL) { - if (pTable->impId == pProfile->IMPID) { - /* Found it */ - break; - } else { - pTable = pTable->next; - } - } - if (pTable == NULL) { - fprintf(stderr, "Error: unknown impurity profile %d\n", - ((int)pProfile->IMPID)); - controlled_exit(1); - } - } - /* Find distances */ - if (pProfile->X_LOW > x) { - argX = pProfile->X_LOW - x; - } else if (x > pProfile->X_HIGH) { - argX = x - pProfile->X_HIGH; - } else { - argX = 0.0; - } - - argP = argX; - - /* Transform to coordinates of profile peak */ - argP -= pProfile->LOCATION; - argP /= pProfile->CHAR_LENGTH; - - switch (pProfile->type) { - case UNIF: - if (argP > 0.0) { - value = 0.0; - } else { - value = pProfile->CONC; - } - break; - case LIN: - argP = ABS(argP); - if (argP > 1.0) { - value = 0.0; - } else { - value = pProfile->CONC * (1.0 - argP); - } - break; - case GAUSS: - argP *= argP; - if (argP > 80.0) { - value = 0.0; - } else { - value = pProfile->PEAK_CONC * exp(-argP); - } - break; - case EXP: - argP = ABS(argP); - if (argP > 80.0) { - value = 0.0; - } else { - value = pProfile->PEAK_CONC * exp(-argP); - } - break; - case ERRFC: - argP = ABS(argP); - if (argP > 10.0) { - value = 0.0; - } else { - value = pProfile->PEAK_CONC * erfc(argP); - } - break; - case LOOKUP: - argP = ABS(argP); - value = lookup(pTable->dopData, argP); - break; - default: - break; - } - return (value); -} - - -void -ONEsetDoping(ONEdevice *pDevice, DOPprofile *pProfile, DOPtable *pTable) -{ - ONEnode *pNode; - ONEelem *pElem; - DOPprofile *pP; - double conc; - int index, eIndex; - BOOLEAN dopeMe; - - - /* Clear doping info for all nodes. */ - for (eIndex = 1; eIndex < pDevice->numNodes; eIndex++) { - pElem = pDevice->elemArray[eIndex]; - for (index = 0; index <= 1; index++) { - if (pElem->evalNodes[index]) { - pNode = pElem->pNodes[index]; - pNode->na = 0.0; - pNode->nd = 0.0; - pNode->netConc = 0.0; - pNode->totalConc = 0.0; - } - } - } - /* Now compute the contribution to the total doping from each profile. */ - for (pP = pProfile; pP != NULL; pP = pP->next) { - for (eIndex = 1; eIndex < pDevice->numNodes; eIndex++) { - pElem = pDevice->elemArray[eIndex]; - if (pElem->elemType == SEMICON) { - if (pP->numDomains > 0) { - dopeMe = FALSE; - for (index = 0; index < pP->numDomains; index++) { - if (pElem->domain == pP->domains[index]) { - dopeMe = TRUE; - break; - } - } - } else { /* domains not given, so dope all */ - dopeMe = TRUE; - } - if (dopeMe) { - for (index = 0; index <= 1; index++) { - if (pElem->evalNodes[index]) { - pNode = pElem->pNodes[index]; - conc = ONEdopingValue(pP, pTable, pNode->x); - pNode->netConc += conc; - if (conc < 0.0) { - pNode->totalConc -= conc; - pNode->na -= conc; - } else { - pNode->totalConc += conc; - pNode->nd += conc; - } - } - } - } - } - } - } -} diff --git a/src/ciderlib/oned/onefreez.c b/src/ciderlib/oned/onefreez.c deleted file mode 100644 index d4429a1ee..000000000 --- a/src/ciderlib/oned/onefreez.c +++ /dev/null @@ -1,121 +0,0 @@ -/********** -Copyright 1992 Regents of the University of California. All rights reserved. -Author: 1987 Kartikeya Mayaram, U. C. Berkeley CAD Group -**********/ - -#include "ngspice/ngspice.h" -#include "ngspice/numglobs.h" -#include "ngspice/numconst.h" -#include "ngspice/onemesh.h" -#include "../../maths/misc/accuracy.h" -#include "onedext.h" -#include "oneddefs.h" - - -void -ONEQfreezeOut(ONEnode *pNode, double *ndFac, double *naFac, double *dNdFac, - double *dNaFac) -{ - double temp1, temp2; - double eLev; - ONEmaterial *info; - - - if (pNode->pRightElem && pNode->pRightElem->evalNodes[0]) { - info = pNode->pRightElem->matlInfo; - } else { - info = pNode->pLeftElem->matlInfo; - } - - eLev = info->eDon; - if (info->material != GAAS) { - eLev -= LEVEL_ALPHA_SI * pow(pNode->nd * NNorm, 1.0 / 3.0); - if (eLev < 0.0) - eLev = 0.0; - } - if (eLev >= ExpLim) { - *ndFac = 0.0; - *dNdFac = 0.0; - } else if (eLev <= -ExpLim) { - *ndFac = 1.0; - *dNdFac = 0.0; - } else { - temp1 = info->gDon * pNode->nConc * NNorm * exp(eLev) / info->nc0; - temp2 = 1.0 / (1.0 + temp1); - *ndFac = temp2; - *dNdFac = -temp2 * temp2 * temp1; - } - - eLev = info->eAcc; - if (info->material != GAAS) { - eLev -= LEVEL_ALPHA_SI * pow(pNode->na * NNorm, 1.0 / 3.0); - if (eLev < 0.0) - eLev = 0.0; - } - if (eLev >= ExpLim) { - *naFac = 0.0; - *dNaFac = 0.0; - } else if (eLev <= -ExpLim) { - *naFac = 1.0; - *dNaFac = 0.0; - } else { - temp1 = info->gAcc * pNode->pConc * NNorm * exp(eLev) / info->nv0; - temp2 = 1.0 / (1.0 + temp1); - *naFac = temp2; - *dNaFac = temp2 * temp2 * temp1; - } -} - -void -ONE_freezeOut(ONEnode *pNode, double nConc, double pConc, double *ndFac, - double *naFac, double *dNdFac, double *dNaFac) -{ - double temp1, temp2; - double eLev; - ONEmaterial *info; - - - if (pNode->pRightElem && pNode->pRightElem->evalNodes[0]) { - info = pNode->pRightElem->matlInfo; - } else { - info = pNode->pLeftElem->matlInfo; - } - - eLev = info->eDon; - if (info->material != GAAS) { - eLev -= LEVEL_ALPHA_SI * pow(pNode->nd * NNorm, 1.0 / 3.0); - if (eLev < 0.0) - eLev = 0.0; - } - if (eLev >= ExpLim) { - *ndFac = 0.0; - *dNdFac = 0.0; - } else if (eLev <= -ExpLim) { - *ndFac = 1.0; - *dNdFac = 0.0; - } else { - temp1 = info->gDon * exp(eLev) * NNorm / info->nc0; - temp2 = 1.0 / (1.0 + nConc * temp1); - *ndFac = temp2; - *dNdFac = -temp2 * temp2 * temp1; - } - - eLev = info->eAcc; - if (info->material != GAAS) { - eLev -= LEVEL_ALPHA_SI * pow(pNode->na * NNorm, 1.0 / 3.0); - if (eLev < 0.0) - eLev = 0.0; - } - if (eLev >= ExpLim) { - *naFac = 0.0; - *dNaFac = 0.0; - } else if (eLev <= -ExpLim) { - *naFac = 1.0; - *dNaFac = 0.0; - } else { - temp1 = info->gAcc * exp(eLev) * NNorm / info->nv0; - temp2 = 1.0 / (1.0 + pConc * temp1); - *naFac = temp2; - *dNaFac = -temp2 * temp2 * temp1; - } -} diff --git a/src/ciderlib/oned/onemesh.c b/src/ciderlib/oned/onemesh.c deleted file mode 100644 index f7135c2d3..000000000 --- a/src/ciderlib/oned/onemesh.c +++ /dev/null @@ -1,372 +0,0 @@ -/********** -Copyright 1992 Regents of the University of California. All rights reserved. -Author: 1987 Kartikeya Mayaram, U. C. Berkeley CAD Group -**********/ - -#include "ngspice/ngspice.h" -#include "ngspice/numglobs.h" -#include "ngspice/numenum.h" -#include "ngspice/onemesh.h" -#include "ngspice/onedev.h" -#include "ngspice/macros.h" -#include "onedext.h" -#include "oneddefs.h" - - -/* Forward Declarations */ -/* static void ONEresetEvalFlag(ONEdevice *); sjb - not used */ - -void -ONEbuildMesh(ONEdevice *pDevice, ONEcoord *pCoord, ONEdomain *pDomain, - ONEmaterial *pMaterial) -{ - int index, i; - int elemType; - double xPos; - ONEcoord *pC; - ONEnode *pNode; - ONEdomain *pD; - ONEelem *pElem; - ONEmaterial *pM; - int poiEqn, numEqn; - ONEedge *pEdge; - ONEnode **nodeArray=NULL; - BOOLEAN error = FALSE; - - - /* generate the work array for setting up nodes and elements */ - XCALLOC(nodeArray, ONEnode *, 1 + pDevice->numNodes); - - for (pC = pCoord; pC != NULL; pC = pC->next) { - xPos = pC->location; - XCALLOC(pNode, ONEnode, 1); - pNode->x = xPos; - pNode->nodeI = pC->number; - nodeArray[pNode->nodeI] = pNode; - } - - /* mark the domain info on the nodes */ - if (pDomain == NULL) { - fprintf(stderr, "Error: domains not defined for device\n"); - exit(-1); - } - for (pD = pDomain; pD != NULL; pD = pD->next) { - for (pM = pMaterial; pM != NULL; pM = pM->next) { - if (pD->material == pM->id) { - break; - } - } - elemType = pM->type; - for (index = pD->ixLo; index <= pD->ixHi; index++) { - pNode = nodeArray[index]; - if (!pNode->nodeType) { - pNode->nodeType = elemType; - } - } - } - - /* - * check to see if a domain has been defined for all nodes. if not flag an - * error message - */ - for (index = 2; index < pDevice->numNodes; index++) { - pNode = nodeArray[index]; - if (!pNode->nodeType) { - fprintf(stderr, "Error: No domain defined for node %d\n", pNode->nodeI); - error = TRUE; - } - } - if (error) { - /* nodes with undefined domains -- exit */ - exit(-1); - } - /* mark the first and last nodes to be contact nodes */ - nodeArray[1]->nodeType = CONTACT; - nodeArray[pDevice->numNodes]->nodeType = CONTACT; - - - /* generate the elements and the edges */ - for (index = 1; index < pDevice->numNodes; index++) { - XCALLOC(pElem, ONEelem, 1); - XCALLOC(pEdge, ONEedge, 1); - pElem->pEdge = pEdge; - pElem->pLeftNode = nodeArray[index]; - pElem->pRightNode = nodeArray[index + 1]; - pDevice->elemArray[index] = pElem; - } - - /* now setup the nodes to which an element belongs */ - for (index = 1; index < pDevice->numNodes; index++) { - pElem = pDevice->elemArray[index]; - pElem->pLeftNode->pRightElem = pElem; - pElem->pRightNode->pLeftElem = pElem; - if (index > 1) { - pElem->pLeftElem = pDevice->elemArray[index - 1]; - } - if (index < pDevice->numNodes - 1) { - pElem->pRightElem = pDevice->elemArray[index + 1]; - } - } - - /* mark the domain info on the elements */ - for (pD = pDomain; pD != NULL; pD = pD->next) { - for (pM = pMaterial; pM != NULL; pM = pM->next) { - if (pD->material == pM->id) { - break; - } - } - elemType = pM->type; - for (index = pD->ixLo; index < pD->ixHi; index++) { - pElem = pDevice->elemArray[index]; - pElem->domain = pD->id; - pElem->elemType = elemType; - pElem->matlInfo = pM; - } - } - - /* identify the interface nodes */ - for (index = 2; index < pDevice->numNodes; index++) { - pNode = nodeArray[index]; - if (pNode->pLeftElem->elemType != - pNode->pRightElem->elemType) { - /* an interface node */ - pNode->nodeType = INTERFACE; - } - } - - /* now mark the nodes to be evaluated */ - /* all interface nodes marked in silicon elements */ - - for (index = 1; index < pDevice->numNodes; index++) { - pElem = pDevice->elemArray[index]; - pElem->dx = pElem->pRightNode->x - pElem->pLeftNode->x; - for (i = 0; i <= 1; i++) { - pNode = pElem->pNodes[i]; - pElem->evalNodes[i] = FALSE; - if (pElem->elemType == INSULATOR) { - if ((!pNode->evaluated) && - (pNode->nodeType != INTERFACE)) { - /* a non interface node in oxide domain */ - pNode->evaluated = TRUE; - pElem->evalNodes[i] = TRUE; - } - } - if (pElem->elemType == SEMICON) { - if (!pNode->evaluated) { - pNode->evaluated = TRUE; - pElem->evalNodes[i] = TRUE; - } - } - } - } - - /* set up the equation number for the nodes */ - poiEqn = numEqn = 1; - for (index = 1; index < pDevice->numNodes; index++) { - pElem = pDevice->elemArray[index]; - for (i = 0; i <= 1; i++) { - if (pElem->evalNodes[i]) { - pNode = pElem->pNodes[i]; - if (pNode->nodeType != CONTACT) { - pNode->poiEqn = poiEqn++; - - pNode->psiEqn = numEqn; - if (pElem->elemType == INSULATOR) { - numEqn += 1; /* only poisson's equation */ - } else { - pNode->nEqn = numEqn + 1; - pNode->pEqn = numEqn + 2; - numEqn += 3; - } - } else { /* this is a contact node */ - pNode->poiEqn = 0; - pNode->psiEqn = 0; - pNode->nEqn = 0; - pNode->pEqn = 0; - } - /* - * fprintf(stdout,"NODE: %d %d\n",pNode->nodeI,pNode->poiEqn); - */ - } - } - } - pDevice->dimEquil = poiEqn; - pDevice->dimBias = numEqn; - - /* - * ONEprnMesh( pDevice ); - */ -} - -/* - * We have a separate function for this, so that the setup routines can reset - * the state pointers without rebuilding the entire mesh. - */ -void -ONEgetStatePointers(ONEdevice *pDevice, int *numStates) -{ - int eIndex, nIndex; - ONEelem *pElem; - ONEnode *pNode; - - - for (eIndex = 1; eIndex < pDevice->numNodes; eIndex++) { - pElem = pDevice->elemArray[eIndex]; - for (nIndex = 0; nIndex <= 1; nIndex++) { - if (pElem->evalNodes[nIndex]) { - pNode = pElem->pNodes[nIndex]; - pNode->nodeState = *numStates; - *numStates += ONEnumNodeStates; - } - } - pElem->pEdge->edgeState = *numStates; - *numStates += ONEnumEdgeStates; - } -} - -/* adjust the base contact to be the position of maximum density */ -/* index EB and BC are the indexes for the eb, bc junctions */ -void -adjustBaseContact(ONEdevice *pDevice, int indexEB, int indexBC) -{ - int index, i, newBaseIndex, midPoint; - double maxDensity; - ONEnode *pNode; - ONEelem *pElem; - ONEnode *pBaseNode = pDevice->elemArray[pDevice->baseIndex]->pNodes[0]; - - - /* Initialize the base contact to be the center of the two junctions */ - /* This should take care of uniform dopings. */ - - midPoint = (indexEB + indexBC) / 2; - newBaseIndex = midPoint; - - if (pBaseNode->baseType == P_TYPE) { - maxDensity = pDevice->elemArray[midPoint]->pNodes[0]->pConc; - for (index = indexEB; index < indexBC; index++) { - pElem = pDevice->elemArray[index]; - for (i = 0; i <= 1; i++) { - pNode = pElem->pNodes[i]; - if (pNode->pConc > maxDensity) { - maxDensity = pNode->pConc; - newBaseIndex = index; - } - } - } - } else if (pBaseNode->baseType == N_TYPE) { - maxDensity = pDevice->elemArray[midPoint]->pNodes[0]->nConc; - for (index = indexEB; index < indexBC; index++) { - pElem = pDevice->elemArray[index]; - for (i = 0; i <= 1; i++) { - pNode = pElem->pNodes[i]; - if (pNode->nConc > maxDensity) { - maxDensity = pNode->nConc; - newBaseIndex = index; - } - } - } - } else { - printf("adjustBaseContact: unknown base type %d\n", pBaseNode->baseType); - } - /* at the conclusion of this loop have the point of max density */ - if (pDevice->baseIndex != newBaseIndex) { - /* so change the position */ - pNode = pDevice->elemArray[newBaseIndex]->pNodes[0]; - pNode->baseType = pBaseNode->baseType; - pNode->vbe = pBaseNode->vbe; - pBaseNode->baseType = FALSE; - pBaseNode->vbe = 0.0; - pDevice->baseIndex = newBaseIndex; - } -} - -void -NBJTjunctions(ONEdevice *pDevice, int *indexEB, int *indexBC) -{ - int index; - double conc1, conc2; - BOOLEAN findFirstJunction = TRUE; - BOOLEAN notFound = TRUE; - - for (index = 1; (index < pDevice->numNodes) && (notFound); index++) { - conc1 = pDevice->elemArray[index]->pNodes[0]->netConc; - conc2 = pDevice->elemArray[index]->pNodes[1]->netConc; - - if ((conc1 * conc2 < 0.0) && (findFirstJunction)) { - *indexEB = index; - findFirstJunction = FALSE; - } else if ((conc1 * conc2 < 0.0) && (!findFirstJunction)) { - *indexBC = index; - notFound = FALSE; - } - } - - if (notFound) { - fprintf(stderr, "BJT: Device does not have two junctions!\n"); - exit(-1); - } -} - -void -ONEprnMesh(ONEdevice *pDevice) -{ - int eIndex, index; - ONEelem *pElem; - ONEnode *pNode; - char *name; - - - for (eIndex = 1; eIndex < pDevice->numNodes; eIndex++) { - pElem = pDevice->elemArray[eIndex]; - fprintf(stderr, "elem %5d:\n", eIndex); - for (index = 0; index <= 1; index++) { - if (pElem->evalNodes[index]) { - pNode = pElem->pNodes[index]; - switch (pNode->nodeType) { - case SEMICON: - name = "semiconductor"; - break; - case INSULATOR: - name = "insulator"; - break; - case CONTACT: - name = "contact"; - break; - case SCHOTTKY: - name = "schottky"; - break; - case INTERFACE: - name = "interface"; - break; - default: - name = "unknown"; - break; - } - - - fprintf(stderr, "node %5d: %s %5d\n", index, name, - pNode->nodeI); - - } - } - } -} - -/* sjb - not used -static void -ONEresetEvalFlag(ONEdevice *pDevice) -{ - int index, eIndex; - ONEelem *pElem; - - - for (eIndex = 1; eIndex < pDevice->numNodes; eIndex++) { - pElem = pDevice->elemArray[eIndex]; - for (index = 0; index <= 1; index++) { - pElem->pNodes[index]->evaluated = FALSE; - } - pElem->pEdge->evaluated = FALSE; - } -} -*/ diff --git a/src/ciderlib/oned/onepoiss.c b/src/ciderlib/oned/onepoiss.c deleted file mode 100644 index 0d993e006..000000000 --- a/src/ciderlib/oned/onepoiss.c +++ /dev/null @@ -1,189 +0,0 @@ -/********** -Copyright 1992 Regents of the University of California. All rights reserved. -Author: 1987 Kartikeya Mayaram, U. C. Berkeley CAD Group -**********/ - -#include "ngspice/ngspice.h" -#include "ngspice/numglobs.h" -#include "ngspice/numenum.h" -#include "ngspice/onemesh.h" -#include "ngspice/onedev.h" -#include "onedext.h" -#include "oneddefs.h" -#include "ngspice/spmatrix.h" - -/* Functions to setup and solve the 1D poisson equation. */ - - -void -ONEQjacBuild(ONEdevice *pDevice) -{ - SMPmatrix *matrix = pDevice->matrix; - ONEelem *pElem; - ONEnode *pNode, *pNode1; - int index; - - - for (index = 1; index < pDevice->numNodes; index++) { - pElem = pDevice->elemArray[index]; - pNode = pElem->pLeftNode; - pNode->fPsiPsi = spGetElement(matrix, pNode->poiEqn, pNode->poiEqn); - pNode1 = pElem->pRightNode; - pNode->fPsiPsiiP1 = spGetElement(matrix, pNode->poiEqn, pNode1->poiEqn); - pNode = pElem->pRightNode; - pNode->fPsiPsi = spGetElement(matrix, pNode->poiEqn, pNode->poiEqn); - pNode1 = pElem->pLeftNode; - pNode->fPsiPsiiM1 = spGetElement(matrix, pNode->poiEqn, pNode1->poiEqn); - } -} - - -void -ONEQsysLoad(ONEdevice *pDevice) -{ - ONEelem *pElem; - ONEnode *pNode; - int index, i; - double *pRhs = pDevice->rhs; - double rDx, dPsi; - double netConc, dNetConc; - double fNd, fdNd, fNa, fdNa; - - - ONEQcommonTerms(pDevice); - - /* zero the rhs vector */ - for (index = 1; index <= pDevice->numEqns; index++) { - pRhs[index] = 0.0; - } - - /* zero the matrix */ - spClear(pDevice->matrix); - - for (index = 1; index < pDevice->numNodes; index++) { - pElem = pDevice->elemArray[index]; - rDx = pElem->epsRel * pElem->rDx; - for (i = 0; i <= 1; i++) { - pNode = pElem->pNodes[i]; - if (pNode->nodeType != CONTACT) { - *(pNode->fPsiPsi) += rDx; - pRhs[pNode->poiEqn] += pNode->qf; - if (pElem->elemType == SEMICON) { - netConc = pNode->netConc; - dNetConc = 0.0; - if (FreezeOut) { - ONEQfreezeOut(pNode, &fNd, &fNa, &fdNd, &fdNa); - netConc = pNode->nd * fNd - pNode->na * fNa; - dNetConc = pNode->nd * fdNd - pNode->na * fdNa; - } - *(pNode->fPsiPsi) += 0.5 * pElem->dx * - (pNode->nConc + pNode->pConc - dNetConc); - pRhs[pNode->poiEqn] += 0.5 * pElem->dx * - (netConc + pNode->pConc - pNode->nConc); - } - } - } - - dPsi = pElem->pEdge->dPsi; - - pNode = pElem->pLeftNode; - pRhs[pNode->poiEqn] += rDx * dPsi; - *(pNode->fPsiPsiiP1) -= rDx; - - pNode = pElem->pRightNode; - pRhs[pNode->poiEqn] -= rDx * dPsi; - *(pNode->fPsiPsiiM1) -= rDx; - } -} - - -void -ONEQrhsLoad(ONEdevice *pDevice) -{ - ONEelem *pElem; - ONEnode *pNode; - int index, i; - double *pRhs = pDevice->rhs; - double rDx, dPsi; - double fNd, fNa, fdNd, fdNa; - double netConc; - - - ONEQcommonTerms(pDevice); - - /* zero the rhs vector */ - for (index = 1; index <= pDevice->numEqns; index++) { - pRhs[index] = 0.0; - } - - for (index = 1; index < pDevice->numNodes; index++) { - pElem = pDevice->elemArray[index]; - rDx = pElem->epsRel * pElem->rDx; - for (i = 0; i <= 1; i++) { - pNode = pElem->pNodes[i]; - if (pNode->nodeType != CONTACT) { - pRhs[pNode->poiEqn] += pNode->qf; - if (pElem->elemType == SEMICON) { - netConc = pNode->netConc; - if (FreezeOut) { - ONEQfreezeOut(pNode, &fNd, &fNa, &fdNd, &fdNa); - netConc = pNode->nd * fNd - pNode->na * fNa; - } - pRhs[pNode->poiEqn] += 0.5 * pElem->dx * - (netConc + pNode->pConc - pNode->nConc); - } - } - } - - dPsi = pElem->pEdge->dPsi; - - pNode = pElem->pLeftNode; - pRhs[pNode->poiEqn] += rDx * dPsi; - - pNode = pElem->pRightNode; - pRhs[pNode->poiEqn] -= rDx * dPsi; - } -} - - -void -ONEQcommonTerms(ONEdevice *pDevice) -{ - ONEelem *pElem; - ONEedge *pEdge; - ONEnode *pNode; - int i, index; - double psi1, psi2, refPsi; - - - for (index = 1; index < pDevice->numNodes; index++) { - pElem = pDevice->elemArray[index]; - refPsi = pElem->matlInfo->refPsi; - for (i = 0; i <= 1; i++) { - if (pElem->evalNodes[i]) { - pNode = pElem->pNodes[i]; - if (pNode->nodeType != CONTACT) { - pNode->psi = pDevice->dcSolution[pNode->poiEqn]; - if (pElem->elemType == SEMICON) { - pNode->nConc = pNode->nie * exp(pNode->psi - refPsi); - pNode->pConc = pNode->nie * exp(-pNode->psi + refPsi); - } - } - } - } - pEdge = pElem->pEdge; - pNode = pElem->pNodes[0]; - if (pNode->nodeType != CONTACT) { - psi1 = pDevice->dcSolution[pNode->poiEqn]; - } else { - psi1 = pNode->psi; - } - pNode = pElem->pNodes[1]; - if (pNode->nodeType != CONTACT) { - psi2 = pDevice->dcSolution[pNode->poiEqn]; - } else { - psi2 = pNode->psi; - } - pEdge->dPsi = psi2 - psi1; - } -} diff --git a/src/ciderlib/oned/oneprint.c b/src/ciderlib/oned/oneprint.c deleted file mode 100644 index 7e7ae33f8..000000000 --- a/src/ciderlib/oned/oneprint.c +++ /dev/null @@ -1,557 +0,0 @@ -/********** -Copyright 1992 Regents of the University of California. All rights reserved. -Author: 1987 Kartikeya Mayaram, U. C. Berkeley CAD Group -Author: 1992 David A. Gates, U. C. Berkeley CAD Group -**********/ - -#include "ngspice/ngspice.h" -#include "ngspice/numglobs.h" -#include "ngspice/numconst.h" -#include "ngspice/numenum.h" -#include "ngspice/onemesh.h" -#include "ngspice/onedev.h" -#include "ngspice/carddefs.h" -#include "ngspice/spmatrix.h" -#include "onedext.h" -#include "oneddefs.h" - -#include - - -void -ONEprnSolution(FILE *file, ONEdevice *pDevice, OUTPcard *output, BOOLEAN asciiSave, char *extra) -{ - int index, i, ii; - int numVars = 0; - ONEnode **nodeArray=NULL; - ONEnode *pNode; - ONEelem *pElem, *pPrevElem; - ONEmaterial *info=NULL; - double data[50]; - double eField, refPsi = 0.0, eGap, dGap; - double mun, mup, jc, jd, jn, jp, jt; - double coeff1, coeff2; - - - if (output->OUTPnumVars == -1) { - /* First pass. Need to count number of variables in output. */ - numVars++; /* For the X scale */ - if (output->OUTPdoping) { - numVars++; - } - if (output->OUTPpsi) { - numVars++; - } - if (output->OUTPequPsi) { - numVars++; - } - if (output->OUTPvacPsi) { - numVars++; - } - if (output->OUTPnConc) { - numVars++; - } - if (output->OUTPpConc) { - numVars++; - } - if (output->OUTPphin) { - numVars++; - } - if (output->OUTPphip) { - numVars++; - } - if (output->OUTPphic) { - numVars++; - } - if (output->OUTPphiv) { - numVars++; - } - if (output->OUTPeField) { - numVars++; - } - if (output->OUTPjc) { - numVars++; - } - if (output->OUTPjd) { - numVars++; - } - if (output->OUTPjn) { - numVars++; - } - if (output->OUTPjp) { - numVars++; - } - if (output->OUTPjt) { - numVars++; - } - if (output->OUTPuNet) { - numVars++; - } - if (output->OUTPmun) { - numVars++; - } - if (output->OUTPmup) { - numVars++; - } - output->OUTPnumVars = numVars; - } - /* generate the work array for printing node info */ - XCALLOC(nodeArray, ONEnode *, 1 + pDevice->numNodes); - - /* store the nodes in this work array and print out later */ - for (index = 1; index < pDevice->numNodes; index++) { - pElem = pDevice->elemArray[index]; - if (refPsi == 0.0 && pElem->matlInfo->type == SEMICON) { - refPsi = pElem->matlInfo->refPsi; - } - for (i = 0; i <= 1; i++) { - if (pElem->evalNodes[i]) { - pNode = pElem->pNodes[i]; - nodeArray[pNode->nodeI] = pNode; - } - } - } - - /* Initialize rawfile */ - numVars = output->OUTPnumVars; - if (extra != NULL) { - fprintf(file, "Title: Device %s (%s) internal state\n", pDevice->name, extra); - } else { - fprintf(file, "Title: Device %s internal state\n", pDevice->name); - } - fprintf(file, "Plotname: Device Cross Section\n"); - fprintf(file, "Flags: real\n"); - fprintf(file, "Command: deftype p xs cross\n"); - fprintf(file, "Command: deftype v distance m\n"); - fprintf(file, "Command: deftype v concentration cm^-3\n"); - fprintf(file, "Command: deftype v electric_field V/cm\n"); - fprintf(file, "Command: deftype v current_density A/cm^2\n"); - fprintf(file, "Command: deftype v concentration/time cm^-3/s\n"); - fprintf(file, "Command: deftype v mobility cm^2/Vs\n"); - fprintf(file, "No. Variables: %d\n", numVars); - fprintf(file, "No. Points: %d\n", pDevice->numNodes); - numVars = 0; - fprintf(file, "Variables:\n"); - fprintf(file, "\t%d x distance\n", numVars++); - if (output->OUTPpsi) { - fprintf(file, "\t%d psi voltage\n", numVars++); - } - if (output->OUTPequPsi) { - fprintf(file, "\t%d equ.psi voltage\n", numVars++); - } - if (output->OUTPvacPsi) { - fprintf(file, "\t%d vac.psi voltage\n", numVars++); - } - if (output->OUTPphin) { - fprintf(file, "\t%d phin voltage\n", numVars++); - } - if (output->OUTPphip) { - fprintf(file, "\t%d phip voltage\n", numVars++); - } - if (output->OUTPphic) { - fprintf(file, "\t%d phic voltage\n", numVars++); - } - if (output->OUTPphiv) { - fprintf(file, "\t%d phiv voltage\n", numVars++); - } - if (output->OUTPdoping) { - fprintf(file, "\t%d dop concentration\n", numVars++); - } - if (output->OUTPnConc) { - fprintf(file, "\t%d n concentration\n", numVars++); - } - if (output->OUTPpConc) { - fprintf(file, "\t%d p concentration\n", numVars++); - } - if (output->OUTPeField) { - fprintf(file, "\t%d e electric_field\n", numVars++); - } - if (output->OUTPjc) { - fprintf(file, "\t%d jc current_density\n", numVars++); - } - if (output->OUTPjd) { - fprintf(file, "\t%d jd current_density\n", numVars++); - } - if (output->OUTPjn) { - fprintf(file, "\t%d jn current_density\n", numVars++); - } - if (output->OUTPjp) { - fprintf(file, "\t%d jp current_density\n", numVars++); - } - if (output->OUTPjt) { - fprintf(file, "\t%d jt current_density\n", numVars++); - } - if (output->OUTPuNet) { - fprintf(file, "\t%d unet concentration/time\n", numVars++); - } - if (output->OUTPmun) { - fprintf(file, "\t%d mun mobility\n", numVars++); - } - if (output->OUTPmup) { - fprintf(file, "\t%d mup mobility\n", numVars++); - } - if (asciiSave) { - fprintf(file, "Values:\n"); - } else { - fprintf(file, "Binary:\n"); - } - - for (index = 1; index <= pDevice->numNodes; index++) { - pNode = nodeArray[index]; - if ((index > 1) && (index < pDevice->numNodes)) { - pElem = pNode->pRightElem; - pPrevElem = pNode->pLeftElem; - if (pElem->evalNodes[0]) { - info = pElem->matlInfo; - } else if (pPrevElem->evalNodes[1]) { - info = pPrevElem->matlInfo; - } - coeff1 = pPrevElem->dx / (pPrevElem->dx + pElem->dx); - coeff2 = pElem->dx / (pPrevElem->dx + pElem->dx); - eField = -coeff1 * pElem->pEdge->dPsi * pElem->rDx - - coeff2 * pPrevElem->pEdge->dPsi * pPrevElem->rDx; - mun = coeff1 * pElem->pEdge->mun + coeff2 * pPrevElem->pEdge->mun; - mup = coeff1 * pElem->pEdge->mup + coeff2 * pPrevElem->pEdge->mup; - jn = coeff1 * pElem->pEdge->jn + coeff2 * pPrevElem->pEdge->jn; - jp = coeff1 * pElem->pEdge->jp + coeff2 * pPrevElem->pEdge->jp; - jd = coeff1 * pElem->pEdge->jd + coeff2 * pPrevElem->pEdge->jd; - } else if (index == 1) { - info = pNode->pRightElem->matlInfo; - eField = 0.0; - mun = pNode->pRightElem->pEdge->mun; - mup = pNode->pRightElem->pEdge->mup; - jn = pNode->pRightElem->pEdge->jn; - jp = pNode->pRightElem->pEdge->jp; - jd = pNode->pRightElem->pEdge->jd; - } else { - info = pNode->pLeftElem->matlInfo; - eField = 0.0; - mun = pNode->pLeftElem->pEdge->mun; - mup = pNode->pLeftElem->pEdge->mup; - jn = pNode->pLeftElem->pEdge->jn; - jp = pNode->pLeftElem->pEdge->jp; - jd = pNode->pLeftElem->pEdge->jd; - } - jc = jn + jp; - jt = jc + jd; - /* Crude hack to get around the fact that the base node wipes out 'eg' */ - if (index == pDevice->baseIndex) { - eGap = info->eg0; - dGap = 0.0; - } else { - eGap = pNode->eg * VNorm; - dGap = 0.5 * (info->eg0 - eGap); - } - - /* Now fill in the data array */ - numVars = 0; - data[numVars++] = pNode->x * 1e-2; - if (output->OUTPpsi) { - data[numVars++] = (pNode->psi - refPsi) * VNorm; - } - if (output->OUTPequPsi) { - data[numVars++] = (pNode->psi0 - refPsi) * VNorm; - } - if (output->OUTPvacPsi) { - data[numVars++] = pNode->psi * VNorm; - } - if (output->OUTPphin) { - if (info->type != INSULATOR) { - data[numVars++] = (pNode->psi - refPsi - log(pNode->nConc / pNode->nie)) - * VNorm; - } else { - data[numVars++] = 0.0; - } - } - if (output->OUTPphip) { - if (info->type != INSULATOR) { - data[numVars++] = (pNode->psi - refPsi + log(pNode->pConc / pNode->nie)) - * VNorm; - } else { - data[numVars++] = 0.0; - } - } - if (output->OUTPphic) { - data[numVars++] = (pNode->psi + pNode->eaff) * VNorm + dGap; - } - if (output->OUTPphiv) { - data[numVars++] = (pNode->psi + pNode->eaff) * VNorm + dGap + eGap; - } - if (output->OUTPdoping) { - data[numVars++] = pNode->netConc * NNorm; - } - if (output->OUTPnConc) { - data[numVars++] = pNode->nConc * NNorm; - } - if (output->OUTPpConc) { - data[numVars++] = pNode->pConc * NNorm; - } - if (output->OUTPeField) { - data[numVars++] = eField * ENorm; - } - if (output->OUTPjc) { - data[numVars++] = jc * JNorm; - } - if (output->OUTPjd) { - data[numVars++] = jd * JNorm; - } - if (output->OUTPjn) { - data[numVars++] = jn * JNorm; - } - if (output->OUTPjp) { - data[numVars++] = jp * JNorm; - } - if (output->OUTPjt) { - data[numVars++] = jt * JNorm; - } - if (output->OUTPuNet) { - data[numVars++] = pNode->uNet * NNorm / TNorm; - } - if (output->OUTPmun) { - data[numVars++] = mun; - } - if (output->OUTPmup) { - data[numVars++] = mup; - } - if (asciiSave) { - for (ii = 0; ii < numVars; ii++) { - if (ii == 0) { - fprintf(file, "%d", index - 1); - } - fprintf(file, "\t%e\n", data[ii]); - } - } else { - fwrite(data, sizeof(double), (size_t) numVars, file); - } - } - FREE(nodeArray); -} - -/* - * XXX This is what the SPARSE element structure looks like. We can't take it - * from its definition because the include file redefines all sorts of - * things. Note that we are violating data encapsulation to find out the - * size of this thing. - */ -struct MatrixElement { - spREAL Real; - spREAL Imag; - int Row; - int Col; - struct MatrixElement *NextInRow; - struct MatrixElement *NextInCol; -}; - -void -ONEmemStats(FILE *file, ONEdevice *pDevice) -{ - const char memFormat[] = "%-20s" "%10d" "%10" PRIuPTR "\n"; -/* static const char sumFormat[] = "%20s %-10d\n";*/ - int size; - size_t memory; - ONEmaterial *pMaterial; - ONEcontact *pContact; - int numContactNodes; - - - if (!pDevice) { return; } - fprintf(file, "----------------------------------------\n"); - fprintf(file, "Device %s Memory Usage:\n", pDevice->name); - fprintf(file, "Item Count Bytes\n"); - fprintf(file, "----------------------------------------\n"); - - size = 1; - memory = (size_t) size * sizeof(ONEdevice); - fprintf(file, memFormat, "Device", size, memory); - size = pDevice->numNodes - 1; - memory = (size_t) size * sizeof(ONEelem); - fprintf(file, memFormat, "Elements", size, memory); - size = pDevice->numNodes; - memory = (size_t) size * sizeof(ONEnode); - fprintf(file, memFormat, "Nodes", size, memory); - size = pDevice->numNodes - 1; - memory = (size_t) size * sizeof(ONEedge); - fprintf(file, memFormat, "Edges", size, memory); - - size = pDevice->numNodes; - memory = (size_t) size * sizeof(ONEelem *); - size = 0; - for (pMaterial = pDevice->pMaterials; pMaterial; pMaterial = pMaterial->next) - size++; - memory += (size_t) size * sizeof(ONEmaterial); - size = numContactNodes = 0; - for (pContact = pDevice->pFirstContact; pContact; pContact = pContact->next) { - numContactNodes += pContact->numNodes; - size++; - } - memory += (size_t) size * sizeof(ONEcontact); - size = numContactNodes; - memory += (size_t) size * sizeof(ONEnode *); - size = 0; - fprintf(file, "%-20s%10s%10" PRIuPTR "\n", "Misc Mesh", "n/a", memory); - - size = pDevice->numOrigEquil; - memory = (size_t) size * sizeof(struct MatrixElement); - fprintf(file, memFormat, "Equil Orig NZ", size, memory); - size = pDevice->numFillEquil; - memory = (size_t) size * sizeof(struct MatrixElement); - fprintf(file, memFormat, "Equil Fill NZ", size, memory); - size = pDevice->numOrigEquil + pDevice->numFillEquil; - memory = (size_t) size * sizeof(struct MatrixElement); - fprintf(file, memFormat, "Equil Tot NZ", size, memory); - size = pDevice->dimEquil; - memory = (size_t) size * 4 * sizeof(double); - fprintf(file, memFormat, "Equil Vectors", size, memory); - - size = pDevice->numOrigBias; - memory = (size_t) size * sizeof(struct MatrixElement); - fprintf(file, memFormat, "Bias Orig NZ", size, memory); - size = pDevice->numFillBias; - memory = (size_t) size * sizeof(struct MatrixElement); - fprintf(file, memFormat, "Bias Fill NZ", size, memory); - size = pDevice->numOrigBias + pDevice->numFillBias; - memory = (size_t) size * sizeof(struct MatrixElement); - fprintf(file, memFormat, "Bias Tot NZ", size, memory); - size = pDevice->dimBias; - memory = (size_t) size * 5 * sizeof(double); - fprintf(file, memFormat, "Bias Vectors", size, memory); - - size = (pDevice->numNodes - 1) * ONEnumEdgeStates + - pDevice->numNodes * ONEnumNodeStates; - memory = (size_t) size * sizeof(double); - fprintf(file, memFormat, "State Vector", size, memory); -} - -void -ONEcpuStats(FILE *file, ONEdevice *pDevice) -{ - static const char cpuFormat[] = "%-20s%10g%10g%10g%10g%10g\n"; - ONEstats *pStats = NULL; - double total; - int iTotal; - - if (!pDevice) { return; } - pStats = pDevice->pStats; - fprintf(file, - "----------------------------------------------------------------------\n"); - fprintf(file, - "Device %s Time Usage:\n", pDevice->name); - fprintf(file, - "Item SETUP DC TRAN AC TOTAL\n"); - fprintf(file, - "----------------------------------------------------------------------\n"); - - total = pStats->setupTime[STAT_SETUP] + - pStats->setupTime[STAT_DC] + - pStats->setupTime[STAT_TRAN] + - pStats->setupTime[STAT_AC]; - fprintf(file, cpuFormat, "Setup Time", - pStats->setupTime[STAT_SETUP], - pStats->setupTime[STAT_DC], - pStats->setupTime[STAT_TRAN], - pStats->setupTime[STAT_AC], - total); - - total = pStats->loadTime[STAT_SETUP] + - pStats->loadTime[STAT_DC] + - pStats->loadTime[STAT_TRAN] + - pStats->loadTime[STAT_AC]; - fprintf(file, cpuFormat, "Load Time", - pStats->loadTime[STAT_SETUP], - pStats->loadTime[STAT_DC], - pStats->loadTime[STAT_TRAN], - pStats->loadTime[STAT_AC], - total); - - total = pStats->orderTime[STAT_SETUP] + - pStats->orderTime[STAT_DC] + - pStats->orderTime[STAT_TRAN] + - pStats->orderTime[STAT_AC]; - fprintf(file, cpuFormat, "Order Time", - pStats->orderTime[STAT_SETUP], - pStats->orderTime[STAT_DC], - pStats->orderTime[STAT_TRAN], - pStats->orderTime[STAT_AC], - total); - - total = pStats->factorTime[STAT_SETUP] + - pStats->factorTime[STAT_DC] + - pStats->factorTime[STAT_TRAN] + - pStats->factorTime[STAT_AC]; - fprintf(file, cpuFormat, "Factor Time", - pStats->factorTime[STAT_SETUP], - pStats->factorTime[STAT_DC], - pStats->factorTime[STAT_TRAN], - pStats->factorTime[STAT_AC], - total); - - total = pStats->solveTime[STAT_SETUP] + - pStats->solveTime[STAT_DC] + - pStats->solveTime[STAT_TRAN] + - pStats->solveTime[STAT_AC]; - fprintf(file, cpuFormat, "Solve Time", - pStats->solveTime[STAT_SETUP], - pStats->solveTime[STAT_DC], - pStats->solveTime[STAT_TRAN], - pStats->solveTime[STAT_AC], - total); - - total = pStats->updateTime[STAT_SETUP] + - pStats->updateTime[STAT_DC] + - pStats->updateTime[STAT_TRAN] + - pStats->updateTime[STAT_AC]; - fprintf(file, cpuFormat, "Update Time", - pStats->updateTime[STAT_SETUP], - pStats->updateTime[STAT_DC], - pStats->updateTime[STAT_TRAN], - pStats->updateTime[STAT_AC], - total); - - total = pStats->checkTime[STAT_SETUP] + - pStats->checkTime[STAT_DC] + - pStats->checkTime[STAT_TRAN] + - pStats->checkTime[STAT_AC]; - fprintf(file, cpuFormat, "Check Time", - pStats->checkTime[STAT_SETUP], - pStats->checkTime[STAT_DC], - pStats->checkTime[STAT_TRAN], - pStats->checkTime[STAT_AC], - total); - - total = pStats->setupTime[STAT_SETUP] + - pStats->setupTime[STAT_DC] + - pStats->setupTime[STAT_TRAN] + - pStats->setupTime[STAT_AC]; - fprintf(file, cpuFormat, "Misc Time", - pStats->miscTime[STAT_SETUP], - pStats->miscTime[STAT_DC], - pStats->miscTime[STAT_TRAN], - pStats->miscTime[STAT_AC], - total); - - fprintf(file, "%-40s%10g%10s%10g\n", "LTE Time", - pStats->lteTime, - "", pStats->lteTime); - - total = pStats->totalTime[STAT_SETUP] + - pStats->totalTime[STAT_DC] + - pStats->totalTime[STAT_TRAN] + - pStats->totalTime[STAT_AC]; - fprintf(file, cpuFormat, "Total Time", - pStats->totalTime[STAT_SETUP], - pStats->totalTime[STAT_DC], - pStats->totalTime[STAT_TRAN], - pStats->totalTime[STAT_AC], - total); - - iTotal = pStats->numIters[STAT_SETUP] + - pStats->numIters[STAT_DC] + - pStats->numIters[STAT_TRAN] + - pStats->numIters[STAT_AC]; - fprintf(file, "%-20s%10d%10d%10d%10d%10d\n", "Iterations", - pStats->numIters[STAT_SETUP], - pStats->numIters[STAT_DC], - pStats->numIters[STAT_TRAN], - pStats->numIters[STAT_AC], - iTotal); -} diff --git a/src/ciderlib/oned/oneproj.c b/src/ciderlib/oned/oneproj.c deleted file mode 100644 index c7c88502f..000000000 --- a/src/ciderlib/oned/oneproj.c +++ /dev/null @@ -1,347 +0,0 @@ -/********** -Copyright 1992 Regents of the University of California. All rights reserved. -Author: 1987 Kartikeya Mayaram, U. C. Berkeley CAD Group -**********/ - -#include "ngspice/ngspice.h" -#include "ngspice/numglobs.h" -#include "ngspice/numenum.h" -#include "ngspice/onemesh.h" -#include "ngspice/onedev.h" -#include "ngspice/macros.h" -#include "ngspice/spmatrix.h" -#include "ngspice/bool.h" -#include "onedext.h" -#include "oneddefs.h" -#include "ngspice/cidersupt.h" - - -/* - * Functions for projecting the next solution point for modified two-level - * newton scheme - */ - -void -NUMDproject(ONEdevice *pDevice, double delV) -{ - ONEelem *pElem = pDevice->elemArray[pDevice->numNodes - 1]; - ONEnode *pNode; - ONEedge *pEdge; - double delPsi, delN, delP, newN, newP; - double *incVpn; - int i, index; - - - delV = - delV / VNorm; - pElem->pRightNode->psi += delV; - - if (ABS(delV) < MIN_DELV) { - ONEstoreInitialGuess(pDevice); - return; - } - /* zero the rhs before loading in the new rhs */ - for (index = 1; index <= pDevice->numEqns; index++) { - pDevice->rhs[index] = 0.0; - } - /* compute incremental changes due to N contact */ - pNode = pElem->pLeftNode; - pDevice->rhs[pNode->psiEqn] = pElem->epsRel * pElem->rDx; - if (pElem->elemType == SEMICON) { - pEdge = pElem->pEdge; - pDevice->rhs[pNode->nEqn] = -pEdge->dJnDpsiP1; - pDevice->rhs[pNode->pEqn] = -pEdge->dJpDpsiP1; - } - incVpn = pDevice->dcDeltaSolution; - spSolve(pDevice->matrix, pDevice->rhs, incVpn, NULL, NULL); - - for (index = 1; index < pDevice->numNodes; index++) { - pElem = pDevice->elemArray[index]; - for (i = 0; i <= 1; i++) { - if (pElem->evalNodes[i]) { - pNode = pElem->pNodes[i]; - if (pNode->nodeType != CONTACT) { - delPsi = incVpn[pNode->psiEqn] * delV; - pDevice->dcSolution[pNode->psiEqn] = pNode->psi + delPsi; - if (pElem->elemType == SEMICON) { - delN = incVpn[pNode->nEqn] * delV; - delP = incVpn[pNode->pEqn] * delV; - newN = pNode->nConc + delN; - newP = pNode->pConc + delP; - /* if new conc less than 0.0 then use a fraction of the guess */ - if (newN <= 0.0) { - pDevice->dcSolution[pNode->nEqn] = - guessNewConc(pNode->nConc, delN); - } else { - pDevice->dcSolution[pNode->nEqn] = newN; - } - if (newP <= 0.0) { - pDevice->dcSolution[pNode->pEqn] = - guessNewConc(pNode->pConc, delP); - } else { - pDevice->dcSolution[pNode->pEqn] = newP; - } - } - } - } - } - } -} - - -void -NBJTproject(ONEdevice *pDevice, double delVce, double delVbe, - double vbe) -{ - ONEelem *pLastElem = pDevice->elemArray[pDevice->numNodes - 1]; - ONEelem *pBaseElem = pDevice->elemArray[pDevice->baseIndex - 1]; - ONEelem *pElem; - ONEnode *pNode; - ONEedge *pEdge; - double delPsi, delN, delP, newN, newP, *incVce, *incVbe; - double baseConc=0.0; - int i, index; - double nConc, pConc; - - /* normalize the voltages for calculations */ - delVce = delVce / VNorm; - delVbe = delVbe / VNorm; - pLastElem->pRightNode->psi += delVce; - pBaseElem->pRightNode->vbe = vbe / VNorm + pBaseElem->matlInfo->refPsi; - pNode = pBaseElem->pRightNode; - if (pNode->baseType == N_TYPE) { - baseConc = pNode->nConc; - } else if (pNode->baseType == P_TYPE) { - baseConc = pNode->pConc; - } - if (ABS(delVce) > MIN_DELV) { - - /* zero the rhs before loading in the new rhs */ - for (index = 1; index <= pDevice->numEqns; index++) { - pDevice->rhs[index] = 0.0; - } - /* store the new rhs for computing the incremental quantities */ - pNode = pLastElem->pLeftNode; - pDevice->rhs[pNode->psiEqn] = pLastElem->epsRel * pLastElem->rDx; - if (pLastElem->elemType == SEMICON) { - pEdge = pLastElem->pEdge; - pDevice->rhs[pNode->nEqn] = -pEdge->dJnDpsiP1; - pDevice->rhs[pNode->pEqn] = -pEdge->dJpDpsiP1; - } - incVce = pDevice->dcDeltaSolution; - spSolve(pDevice->matrix, pDevice->rhs, incVce, NULL, NULL); - - for (index = 1; index < pDevice->numNodes; index++) { - pElem = pDevice->elemArray[index]; - for (i = 0; i <= 1; i++) { - if (pElem->evalNodes[i]) { - pNode = pElem->pNodes[i]; - if (pNode->nodeType != CONTACT) { - delPsi = incVce[pNode->psiEqn] * delVce; - pDevice->dcSolution[pNode->psiEqn] = pNode->psi + delPsi; - if (pElem->elemType == SEMICON) { - delN = incVce[pNode->nEqn] * delVce; - delP = incVce[pNode->pEqn] * delVce; - newN = pNode->nConc + delN; - newP = pNode->pConc + delP; - /* if new conc less than 0.0 then use a fraction of the guess */ - if (newN <= 0.0) { - pDevice->dcSolution[pNode->nEqn] = - guessNewConc(pNode->nConc, delN); - } else { - pDevice->dcSolution[pNode->nEqn] = newN; - } - if (newP <= 0.0) { - pDevice->dcSolution[pNode->pEqn] = - guessNewConc(pNode->pConc, delP); - } else { - pDevice->dcSolution[pNode->pEqn] = newP; - } - } - } - } - } - } - } else { - ONEstoreInitialGuess(pDevice); - } - - if (ABS(delVbe) > MIN_DELV) { - - /* zero the rhs before loading in the new rhs base contribution */ - for (index = 1; index <= pDevice->numEqns; index++) { - pDevice->rhs[index] = 0.0; - } - pNode = pBaseElem->pRightNode; - if (pNode->baseType == N_TYPE) { - pDevice->rhs[pNode->nEqn] = baseConc * pNode->eg; - } else if (pNode->baseType == P_TYPE) { - pDevice->rhs[pNode->pEqn] = baseConc * pNode->eg; - } - - incVbe = pDevice->copiedSolution; - spSolve(pDevice->matrix, pDevice->rhs, incVbe, NULL, NULL); - - for (index = 1; index < pDevice->numNodes; index++) { - pElem = pDevice->elemArray[index]; - for (i = 0; i <= 1; i++) { - if (pElem->evalNodes[i]) { - pNode = pElem->pNodes[i]; - if (pNode->nodeType != CONTACT) { - delPsi = incVbe[pNode->psiEqn] * delVbe; - pDevice->dcSolution[pNode->psiEqn] += delPsi; - if (pElem->elemType == SEMICON) { - delN = incVbe[pNode->nEqn] * delVbe; - delP = incVbe[pNode->pEqn] * delVbe; - nConc = pDevice->dcSolution[pNode->nEqn]; - pConc = pDevice->dcSolution[pNode->pEqn]; - newN = nConc + delN; - newP = pConc + delP; - /* if new conc less than 0.0 then use a fraction of the guess */ - if (newN <= 0.0) { - pDevice->dcSolution[pNode->nEqn] = - guessNewConc(nConc, delN); - } else { - pDevice->dcSolution[pNode->nEqn] = newN; - } - if (newP <= 0.0) { - pDevice->dcSolution[pNode->pEqn] = - guessNewConc(pConc, delP); - } else { - pDevice->dcSolution[pNode->pEqn] = newP; - } - } - } - } - } - } - } -} - -/* functions to update device states for full-LU algorithm */ - -void -NUMDupdate(ONEdevice *pDevice, double delV, BOOLEAN updateBoundary) -{ - ONEelem *pElem = pDevice->elemArray[pDevice->numNodes - 1]; - ONEnode *pNode; - double delPsi, delN, delP; - int i, index; - - - delV = - delV / VNorm; - if (updateBoundary) { - pElem->pRightNode->psi += delV; - } - for (index = 1; index < pDevice->numNodes; index++) { - pElem = pDevice->elemArray[index]; - for (i = 0; i <= 1; i++) { - if (pElem->evalNodes[i]) { - pNode = pElem->pNodes[i]; - if (pNode->nodeType != CONTACT) { - delPsi = pDevice->dcDeltaSolution[pNode->psiEqn] * delV; - pDevice->dcSolution[pNode->psiEqn] = pNode->psi + delPsi; - if (pElem->elemType == SEMICON) { - delN = pDevice->dcDeltaSolution[pNode->nEqn] * delV; - delP = pDevice->dcDeltaSolution[pNode->pEqn] * delV; - pDevice->dcSolution[pNode->nEqn] = pNode->nConc + delN; - pDevice->dcSolution[pNode->pEqn] = pNode->pConc + delP; - } - } - } - } - } -} - -void -NBJTupdate(ONEdevice *pDevice, double delVce, double delVbe, - double vbe, BOOLEAN updateBoundary) -{ - ONEelem *pLastElem = pDevice->elemArray[pDevice->numNodes - 1]; - ONEelem *pBaseElem = pDevice->elemArray[pDevice->baseIndex - 1]; - ONEelem *pElem; - ONEnode *pNode; - double delPsi, delN, delP, *incVce, *incVbe; - int i, index; - - /* normalize the voltages for calculations */ - delVce = delVce / VNorm; - delVbe = delVbe / VNorm; - if (updateBoundary) { - pLastElem->pRightNode->psi += delVce; - pBaseElem->pRightNode->vbe = vbe / VNorm + pBaseElem->matlInfo->refPsi; - } - /* - * The incremental quantities are available from NBJTconductance. incVce - * (dcDeltaSolution) and incVbe (copiedSolution) are used to store the - * incremental quantities associated with Vce and Vbe - */ - - /* set incVce = dcDeltaSolution; incVbe = copiedSolution */ - incVce = pDevice->dcDeltaSolution; - incVbe = pDevice->copiedSolution; - - for (index = 1; index < pDevice->numNodes; index++) { - pElem = pDevice->elemArray[index]; - for (i = 0; i <= 1; i++) { - if (pElem->evalNodes[i]) { - pNode = pElem->pNodes[i]; - if (pNode->nodeType != CONTACT) { - delPsi = incVce[pNode->psiEqn] * delVce - + incVbe[pNode->psiEqn] * delVbe; - pDevice->dcSolution[pNode->psiEqn] = pNode->psi + delPsi; - if (pElem->elemType == SEMICON) { - delN = incVce[pNode->nEqn] * delVce - + incVbe[pNode->nEqn] * delVbe; - delP = incVce[pNode->pEqn] * delVce - + incVbe[pNode->pEqn] * delVbe; - pDevice->dcSolution[pNode->nEqn] = pNode->nConc + delN; - pDevice->dcSolution[pNode->pEqn] = pNode->pConc + delP; - } - } - } - } - } -} - -void -NUMDsetBCs(ONEdevice *pDevice, double vpn) -{ - ONEelem *pElem = pDevice->elemArray[pDevice->numNodes - 1]; - - - /* normalize the voltage */ - vpn = - vpn / VNorm; - - /* set the boundary conditions */ - pElem->pRightNode->psi = vpn + pElem->pRightNode->psi0; -} - -void -NBJTsetBCs(ONEdevice *pDevice, double vce, double vbe) -{ - ONEelem *pLastElem = pDevice->elemArray[pDevice->numNodes - 1]; - ONEelem *pBaseElem = pDevice->elemArray[pDevice->baseIndex - 1]; -/* ONEnode *pNode; - double psi, conc, sign, absConc; - double nie, ni, pi; */ - - /* normalize the voltages */ - vce = vce / VNorm; - vbe = vbe / VNorm; - - /* set the boundary conditions */ - pBaseElem->pRightNode->vbe = vbe + pBaseElem->matlInfo->refPsi; - pLastElem->pRightNode->psi = vce + pLastElem->pRightNode->psi0; - - /* - * if (pLastElem->elemType IS INSULATOR) { pNode->psi = RefPsi - - * pNode->eaff; pNode->nConc = 0.0; pNode->pConc = 0.0; } else if - * (pLastElem->elemType IS SEMICON) { nie = pNode->nie; conc = - * pNode->netConc / pNode->nie; psi = 0.0; ni = nie; pi = nie; sign = SGN( - * conc ); absConc = ABS( conc ); if ( conc ISNOT 0.0 ) { psi = sign * log( - * 0.5 * absConc + sqrt( 1.0 + 0.25*absConc*absConc )); ni = nie * exp( psi - * ); pi = nie * exp( -psi ); } pNode->psi = pLastElem->matlInfo->refPsi + - * psi; pNode->nConc = ni; pNode->pConc = pi; } pNode->psi = pNode->psi0; - * pNode->psi += vce; - */ -} diff --git a/src/ciderlib/oned/oneread.c b/src/ciderlib/oned/oneread.c deleted file mode 100644 index 24b899265..000000000 --- a/src/ciderlib/oned/oneread.c +++ /dev/null @@ -1,93 +0,0 @@ -/********** -Copyright 1992 Regents of the University of California. All rights reserved. -Author: 1992 David A. Gates, U. C. Berkeley CAD Group -**********/ - -/* - * Functions needed to read solutions for 1D devices. - */ - -#include "ngspice/ngspice.h" -#include "ngspice/numglobs.h" -#include "ngspice/numenum.h" -#include "ngspice/onedev.h" -#include "ngspice/onemesh.h" -#include "ngspice/plot.h" -#include "onedext.h" -#include "oneddefs.h" -#include "ngspice/cidersupt.h" - -int -ONEreadState(ONEdevice *pDevice, char *fileName, int numVolts, - double *pV1, double *pV2 ) -/* fileName | File containing raw data */ -/* int numVolts | Number of voltage differences */ -/* double *pV1, *pV2 | Pointer to return them in */ -{ - int dataLength; - int index, i; - ONEnode **nodeArray=NULL; - ONEnode *pNode; - ONEelem *pElem; - double refPsi = 0.0; - double *psiData, *nData, *pData; - double *vData[2]; - struct plot *stateDB; - struct plot *voltsDB; - char voltName[80]; - - - stateDB = DBread( fileName ); - if (stateDB == NULL) return (-1); - voltsDB = stateDB->pl_next; - if (voltsDB == NULL) return (-1); - - for (i=0; i < numVolts; i++ ) { - sprintf( voltName, "v%d%d", i+1, numVolts+1 ); - vData[i] = DBgetData( voltsDB, voltName, 1 ); - if (vData[i] == NULL) return (-1); - } - dataLength = pDevice->numNodes; - psiData = DBgetData( stateDB, "psi", dataLength ); - nData = DBgetData( stateDB, "n", dataLength ); - pData = DBgetData( stateDB, "p", dataLength ); - if (psiData == NULL || nData == NULL || pData == NULL) return (-1); - - if (pV1 != NULL) { - *pV1 = vData[0][0]; - FREE( vData[0] ); - } - if (pV2 != NULL) { - *pV2 = vData[1][0]; - FREE( vData[1] ); - } - - /* generate the work array for copying node info */ - XCALLOC(nodeArray, ONEnode *, 1 + pDevice->numNodes); - - /* store the nodes in this work array and print out later */ - for (index = 1; index < pDevice->numNodes; index++) { - pElem = pDevice->elemArray[index]; - if (refPsi == 0.0 && pElem->matlInfo->type == SEMICON) { - refPsi = pElem->matlInfo->refPsi; - } - for (i = 0; i <= 1; i++) { - if (pElem->evalNodes[i]) { - pNode = pElem->pNodes[i]; - nodeArray[pNode->nodeI] = pNode; - } - } - } - for (index = 1; index <= pDevice->numNodes; index++) { - pNode = nodeArray[index]; - pNode->psi = psiData[index-1]/VNorm + refPsi; - pNode->nConc = nData[index-1]/NNorm; - pNode->pConc = pData[index-1]/NNorm; - } - FREE(nodeArray); - FREE(psiData); - FREE(nData); - FREE(pData); - - return (0); -} diff --git a/src/ciderlib/oned/onesetup.c b/src/ciderlib/oned/onesetup.c deleted file mode 100644 index 5db457808..000000000 --- a/src/ciderlib/oned/onesetup.c +++ /dev/null @@ -1,230 +0,0 @@ -/********** -Copyright 1991 Regents of the University of California. All rights reserved. -Author: 1987 Kartikeya Mayaram, U. C. Berkeley CAD Group -Author: 1991 David A. Gates, U. C. Berkeley CAD Group -**********/ - -/********** -One-Dimensional Numerical Device Setup Routines -**********/ - -#include "ngspice/ngspice.h" -#include "ngspice/numglobs.h" -#include "ngspice/numconst.h" -#include "ngspice/numenum.h" -#include "ngspice/onemesh.h" -#include "ngspice/onedev.h" -#include "ngspice/carddefs.h" /* XXX Not really modular if we need this. */ -/* #include "material.h" */ -#include "onedext.h" -#include "oneddefs.h" -#include "ngspice/cidersupt.h" - -/* compute node parameters */ -void -ONEsetup(ONEdevice *pDevice) -{ - double temp1, deltaEg, avgConc, totalConc, absNetConc; - double ncv0, dBand, dNie, psiBand[2]; - int index, eIndex; - ONEnode *pNode; - ONEelem *pElem; - ONEedge *pEdge; - ONEmaterial *info; - - - for (eIndex = 1; eIndex < pDevice->numNodes; eIndex++) { - pElem = pDevice->elemArray[eIndex]; - info = pElem->matlInfo; - - pElem->dx = pElem->pRightNode->x - pElem->pLeftNode->x; - pElem->epsRel = info->eps; - - if (pElem->elemType == INSULATOR) { - for (index = 0; index <= 1; index++) { - if (pElem->evalNodes[index]) { - pNode = pElem->pNodes[index]; - if (pNode->nodeType == CONTACT) { - pNode->eaff = PHI_METAL; - pNode->eg = 0.0; - } else { - pNode->eaff = info->affin; - pNode->eg = info->eg0; - } - } - } - } else if (pElem->elemType == SEMICON) { - ncv0 = sqrt(info->nc0) * sqrt(info->nv0); - for (index = 0; index <= 1; index++) { - if (pElem->evalNodes[index]) { - pNode = pElem->pNodes[index]; - - /* Fixed Interface Charge */ - pNode->qf = 0.0; - - /* Narrowing of Energy Band-Gap */ - if (BandGapNarrowing) { - absNetConc = ABS(pNode->netConc); - if (pNode->netConc > 0.0) { - temp1 = log(absNetConc / info->nrefBGN[ELEC]); - deltaEg = -info->dEgDn[ELEC] * (temp1 + sqrt(temp1 * temp1 + 0.5)); - pNode->eg = info->eg0 + deltaEg; - } else if (pNode->netConc < 0.0) { - temp1 = log(absNetConc / info->nrefBGN[HOLE]); - deltaEg = -info->dEgDn[HOLE] * (temp1 + sqrt(temp1 * temp1 + 0.5)); - pNode->eg = info->eg0 + deltaEg; - } else { - pNode->eg = info->eg0; - } - } else { - pNode->eg = info->eg0; - } - pNode->nie = ncv0 * exp(-0.5 * pNode->eg / Vt); - pNode->eaff = info->affin; - /* Save band structure parameter. */ - psiBand[index] = -info->refPsi; - - /* Ionized-Impurity-Scattering Reduction of Carrier Lifetime */ - if (ConcDepLifetime) { - totalConc = pNode->totalConc; - temp1 = 1.0 / (1.0 + totalConc / info->nrefSRH[ELEC]); - pNode->tn = info->tau0[ELEC] * temp1; - temp1 = 1.0 / (1.0 + totalConc / info->nrefSRH[HOLE]); - pNode->tp = info->tau0[HOLE] * temp1; - } else { - pNode->tn = info->tau0[ELEC]; - pNode->tp = info->tau0[HOLE]; - } - } - } - - pEdge = pElem->pEdge; - - /* Variable Band Built-In Potential */ - dBand = psiBand[1] - psiBand[0]; - dNie = log(pElem->pNodes[1]->nie / pElem->pNodes[0]->nie); - pEdge->dCBand = dBand + dNie; - pEdge->dVBand = -dBand + dNie; - - /* Evaluate conc.-dep. mobility. */ - avgConc = 0.5 * (pElem->pRightNode->totalConc + pElem->pLeftNode->totalConc); - MOBconcDep(info, avgConc, &pEdge->mun, &pEdge->mup); - } - } -} - -/* Transfer BC info from bdry to nodes and edges. */ -static void -ONEcopyBCinfo(ONEdevice *pDevice, ONEelem *pElem, BDRYcard *bdry, int index) -{ - ONEnode *pNode; - ONEelem *pNElem; - int eIndex; - double length; - - NG_IGNORE(pDevice); - - /* First add fixed charge. */ - pNode = pElem->pNodes[index]; - pNode->qf += bdry->BDRYqf; - - /* Now add surface recombination. */ - /* Compute semiconductor length around this node. */ - length = 0.0; - for (eIndex = 0; eIndex <= 1; eIndex++) { - pNElem = pNode->pElems[eIndex]; - if ((pNElem != NULL) && (pElem->elemType == SEMICON)) { - length += 0.5 * pElem->dx; - } - } - if (bdry->BDRYsnGiven) { - pNode->tn = pNode->tn / - (1.0 + ((bdry->BDRYsn * TNorm) * pNode->tn) / length); - } - if (bdry->BDRYspGiven) { - pNode->tp = pNode->tp / - (1.0 + ((bdry->BDRYsp * TNorm) * pNode->tp) / length); - } - /* Finally, surface layer is irrelevant for 1d devices. */ -} - - -/* Compute boundary condition parameters. */ -void -ONEsetBCparams(ONEdevice *pDevice, BDRYcard *bdryList, CONTcard *contList) -{ - int index, xIndex; - ONEelem *pElem, *pNElem; - BDRYcard *bdry; - CONTcard *cont; - - for (bdry = bdryList; bdry != NULL; bdry = bdry->BDRYnextCard) { - for (xIndex = bdry->BDRYixLow; xIndex < bdry->BDRYixHigh; xIndex++) { - pElem = pDevice->elemArray[xIndex]; - if (pElem != NULL) { - if (pElem->domain == bdry->BDRYdomain) { - for (index = 0; index <= 1; index++) { - if (pElem->evalNodes[index]) { - pNElem = pElem->pElems[index]; - if (bdry->BDRYneighborGiven) { - if (pNElem && (pNElem->domain == bdry->BDRYneighbor)) { - /* Found an interface node. */ - ONEcopyBCinfo(pDevice, pElem, bdry, index); - } - } else { - if ((!pNElem) || (pNElem->domain != pElem->domain)) { - /* Found a boundary node. */ - ONEcopyBCinfo(pDevice, pElem, bdry, index); - } - } - } - } - } - } - } - } - for (cont = contList; cont != NULL; cont = cont->CONTnextCard) { - if (!cont->CONTworkfunGiven) { - cont->CONTworkfun = PHI_METAL; - } - /* - * XXX This won't work right if someone tries to change the 1d BJT base - * contact workfunction and doesn't want to change the emitter. But no - * one will probably try to do that. - */ - if (cont->CONTnumber == 1) { - pDevice->elemArray[1]->pNodes[0]->eaff = cont->CONTworkfun; - } else if ((cont->CONTnumber == 2) || (cont->CONTnumber == 3)) { - pDevice->elemArray[pDevice->numNodes - 1]->pNodes[1]->eaff = - cont->CONTworkfun; - } - } -} - -void -ONEnormalize(ONEdevice *pDevice) -{ - int index, eIndex; - ONEelem *pElem; - ONEnode *pNode; - - for (eIndex = 1; eIndex < pDevice->numNodes; eIndex++) { - pElem = pDevice->elemArray[eIndex]; - - pElem->dx /= LNorm; - pElem->rDx = 1.0 / pElem->dx; - pElem->epsRel /= EpsNorm; - for (index = 0; index <= 1; index++) { - if (pElem->evalNodes[index]) { - pNode = pElem->pNodes[index]; - pNode->netConc /= NNorm; - pNode->nd /= NNorm; - pNode->na /= NNorm; - pNode->qf /= (NNorm * LNorm); - pNode->nie /= NNorm; - pNode->eg /= VNorm; - pNode->eaff /= VNorm; - } - } - } -} diff --git a/src/ciderlib/oned/onesolve.c b/src/ciderlib/oned/onesolve.c deleted file mode 100644 index 7586100c2..000000000 --- a/src/ciderlib/oned/onesolve.c +++ /dev/null @@ -1,1067 +0,0 @@ -/********** -Copyright 1991 Regents of the University of California. All rights reserved. -Author: 1987 Kartikeya Mayaram, U. C. Berkeley CAD Group -Author: 1991 David A. Gates, U. C. Berkeley CAD Group -**********/ - -/* - * Functions needed to calculate solutions for 1D devices. - */ - -#include "ngspice/ngspice.h" -#include "ngspice/numglobs.h" -#include "ngspice/numenum.h" -#include "ngspice/onedev.h" -#include "ngspice/onemesh.h" -#include "ngspice/spmatrix.h" -#include "ngspice/bool.h" -#include "ngspice/macros.h" -#include "onedext.h" -#include "oneddefs.h" -#include "ngspice/cidersupt.h" -#include "../../maths/misc/norm.h" - -#include "ngspice/ifsim.h" -extern IFfrontEnd *SPfrontEnd; - - - -/* The iteration driving loop and convergence check */ -void -ONEdcSolve(ONEdevice *pDevice, int iterationLimit, BOOLEAN newSolver, - BOOLEAN tranAnalysis, ONEtranInfo *info) -{ - ONEnode *pNode; - ONEelem *pElem; - int index, eIndex, error; - int timesConverged = 0, negConc = FALSE; - int size = pDevice->numEqns; - BOOLEAN quitLoop; - BOOLEAN debug = FALSE; - double *rhs = pDevice->rhs; -/* double *intermediate = pDevice->copiedSolution; */ - double *solution = pDevice->dcSolution; - double *delta = pDevice->dcDeltaSolution; - double poissNorm, contNorm; - double startTime, totalStartTime; - double totalTime, loadTime, factorTime, solveTime, updateTime, checkTime; - double orderTime = 0.0; - - quitLoop = FALSE; - debug = (!tranAnalysis && ONEdcDebug) - ||(tranAnalysis && ONEtranDebug); - pDevice->iterationNumber = 0; - pDevice->converged = FALSE; - - - totalTime = loadTime = factorTime = solveTime = updateTime = checkTime = 0.0; - totalStartTime = SPfrontEnd->IFseconds(); - - if (debug) { - if (pDevice->poissonOnly) { - fprintf(stdout, "Equilibrium Solution:\n"); - } else { - fprintf(stdout, "Bias Solution:\n"); - } - fprintf(stdout, "Iteration RHS Norm\n"); - } - while (! (pDevice->converged - || pDevice->iterationNumber > iterationLimit - || quitLoop)) { - pDevice->iterationNumber++; - - if ((!pDevice->poissonOnly) && (iterationLimit > 0) - &&(!tranAnalysis)) { - ONEjacCheck(pDevice, tranAnalysis, info); - } - /* LOAD */ - startTime = SPfrontEnd->IFseconds(); - if (pDevice->poissonOnly) { - ONEQsysLoad(pDevice); - } else { - ONE_sysLoad(pDevice, tranAnalysis, info); - } - pDevice->rhsNorm = maxNorm(rhs, size); - loadTime += SPfrontEnd->IFseconds() - startTime; - if (debug) { - fprintf(stdout, "%7d %11.4e%s\n", - pDevice->iterationNumber - 1, pDevice->rhsNorm, - negConc ? " negative conc encountered" : ""); - negConc = FALSE; - } - /* FACTOR */ - startTime = SPfrontEnd->IFseconds(); - error = spFactor(pDevice->matrix); - factorTime += SPfrontEnd->IFseconds() - startTime; - if (newSolver) { - if (pDevice->iterationNumber == 1) { - orderTime = factorTime; - } else if (pDevice->iterationNumber == 2) { - orderTime -= factorTime - orderTime; - factorTime -= orderTime; - if (pDevice->poissonOnly) { - pDevice->pStats->orderTime[STAT_SETUP] += orderTime; - } else { - pDevice->pStats->orderTime[STAT_DC] += orderTime; - } - newSolver = FALSE; - } - } - if (foundError(error)) { - if (error == spSINGULAR) { - int badRow, badCol; - spWhereSingular(pDevice->matrix, &badRow, &badCol); - printf("***** singular at (%d,%d)\n", badRow, badCol); - } - /* Should probably try to recover now, but we'll punt instead. */ - exit(-1); - } - /* SOLVE */ - startTime = SPfrontEnd->IFseconds(); - spSolve(pDevice->matrix, rhs, delta, NULL, NULL); - solveTime += SPfrontEnd->IFseconds() - startTime; - - /* UPDATE */ - startTime = SPfrontEnd->IFseconds(); - /* - * Use norm reducing Newton method only for DC bias solutions. Since norm - * reducing can get trapped by numerical errors, turn it off when we are - * somewhat close to the solution. - */ - if ((!pDevice->poissonOnly) && (iterationLimit > 0) - && (!tranAnalysis) && (pDevice->rhsNorm > 1e-6)) { - error = ONEnewDelta(pDevice, tranAnalysis, info); - if (error) { - pDevice->converged = FALSE; - quitLoop = TRUE; - updateTime += SPfrontEnd->IFseconds() - startTime; - continue; - } - } - for (index = 1; index <= size; index++) { - solution[index] += delta[index]; - } - updateTime += SPfrontEnd->IFseconds() - startTime; - - /* CHECK CONVERGENCE */ - startTime = SPfrontEnd->IFseconds(); - /* Check if updates have gotten sufficiently small. */ - if (pDevice->iterationNumber != 1) { - /* - * pDevice->converged = ONEdeltaConverged(pDevice); - */ - pDevice->converged = ONEpsiDeltaConverged(pDevice, &negConc); - } - /* Check if the rhs residual is smaller than abstol. */ - if (pDevice->converged &&(!pDevice->poissonOnly) - &&(!tranAnalysis)) { - ONE_rhsLoad(pDevice, tranAnalysis, info); - pDevice->rhsNorm = maxNorm(rhs, size); - if (pDevice->rhsNorm > pDevice->abstol) { - pDevice->converged = FALSE; - } - if ((++timesConverged >= 2) - &&(pDevice->rhsNorm < 1e3 * pDevice->abstol)) { - pDevice->converged = TRUE; - } else if (timesConverged >= 5) { - pDevice->converged = FALSE; - quitLoop = TRUE; - } - } else if (pDevice->converged && pDevice->poissonOnly) { - ONEQrhsLoad(pDevice); - pDevice->rhsNorm = maxNorm(rhs, size); - if (pDevice->rhsNorm > pDevice->abstol) { - pDevice->converged = FALSE; - } - if (++timesConverged >= 5) { - pDevice->converged = TRUE; - } - } - /* Check if any of the carrier concentrations are negative. */ - if (pDevice->converged &&(!pDevice->poissonOnly)) { - /* Clear garbage entry since carrier-free elements reference it */ - solution[0] = 0.0; - - for (eIndex = 1; eIndex < pDevice->numNodes; eIndex++) { - pElem = pDevice->elemArray[eIndex]; - for (index = 0; index <= 1; index++) { - if (pElem->evalNodes[index]) { - pNode = pElem->pNodes[index]; - if (solution[pNode->nEqn] < 0.0) { - pDevice->converged = FALSE; - negConc = TRUE; - if (tranAnalysis) { - quitLoop = TRUE; - } else { - solution[pNode->nEqn] = 0.0; - } - } - if (solution[pNode->pEqn] < 0.0) { - pDevice->converged = FALSE; - negConc = TRUE; - if (tranAnalysis) { - quitLoop = TRUE; - } else { - solution[pNode->pEqn] = 0.0; - } - } - } - } - } - /* Set to a consistent state if negative conc was encountered. */ - if (!pDevice->converged) { - ONE_rhsLoad(pDevice, tranAnalysis, info); - pDevice->rhsNorm = maxNorm(rhs, size); - } - } - checkTime += SPfrontEnd->IFseconds() - startTime; - } - totalTime += SPfrontEnd->IFseconds() - totalStartTime; - - if (tranAnalysis) { - pDevice->pStats->loadTime[STAT_TRAN] += loadTime; - pDevice->pStats->factorTime[STAT_TRAN] += factorTime; - pDevice->pStats->solveTime[STAT_TRAN] += solveTime; - pDevice->pStats->updateTime[STAT_TRAN] += updateTime; - pDevice->pStats->checkTime[STAT_TRAN] += checkTime; - pDevice->pStats->numIters[STAT_TRAN] += pDevice->iterationNumber; - } else if (pDevice->poissonOnly) { - pDevice->pStats->loadTime[STAT_SETUP] += loadTime; - pDevice->pStats->factorTime[STAT_SETUP] += factorTime; - pDevice->pStats->solveTime[STAT_SETUP] += solveTime; - pDevice->pStats->updateTime[STAT_SETUP] += updateTime; - pDevice->pStats->checkTime[STAT_SETUP] += checkTime; - pDevice->pStats->numIters[STAT_SETUP] += pDevice->iterationNumber; - } else { - pDevice->pStats->loadTime[STAT_DC] += loadTime; - pDevice->pStats->factorTime[STAT_DC] += factorTime; - pDevice->pStats->solveTime[STAT_DC] += solveTime; - pDevice->pStats->updateTime[STAT_DC] += updateTime; - pDevice->pStats->checkTime[STAT_DC] += checkTime; - pDevice->pStats->numIters[STAT_DC] += pDevice->iterationNumber; - } - - if (debug) { - if (!tranAnalysis) { - pDevice->rhsNorm = maxNorm(rhs, size); - fprintf(stdout, "%7d %11.4e%s\n", - pDevice->iterationNumber, pDevice->rhsNorm, - negConc ? " negative conc in solution" : ""); - } - if (pDevice->converged) { - if (!pDevice->poissonOnly) { - rhs[0] = 0.0; - poissNorm = contNorm = 0.0; - for (eIndex = 1; eIndex < pDevice->numNodes; eIndex++) { - pElem = pDevice->elemArray[eIndex]; - for (index = 0; index <= 1; index++) { - if (pElem->evalNodes[index]) { - pNode = pElem->pNodes[index]; - poissNorm = MAX(poissNorm, ABS(rhs[pNode->psiEqn])); - contNorm = MAX(contNorm, ABS(rhs[pNode->nEqn])); - contNorm = MAX(contNorm, ABS(rhs[pNode->pEqn])); - } - } - } - fprintf(stdout, - "Residual: %11.4e C/um^2 poisson, %11.4e A/um^2 continuity\n", - poissNorm * EpsNorm * ENorm * 1e-8, - contNorm * JNorm * 1e-8); - } else { - fprintf(stdout, "Residual: %11.4e C/um^2 poisson\n", - pDevice->rhsNorm * EpsNorm * ENorm * 1e-8); - } - } - } -} - -/* - * A function that checks convergence based on the convergence of the quasi - * Fermi levels. In theory, this should work better than the one currently - * being used since we are always looking at potentials: (psi, phin, phip). - */ -BOOLEAN -ONEpsiDeltaConverged(ONEdevice *pDevice, int *pNegConc) -{ - int index, nIndex, eIndex; - ONEnode *pNode; - ONEelem *pElem; - double xOld, xNew, xDelta, tol; - double psi, newPsi, nConc, pConc, newN, newP; - double phiN, phiP, newPhiN, newPhiP; - BOOLEAN converged = TRUE; - - /* Equilibrium solution. */ - if (pDevice->poissonOnly) { - for (index = 1; index <= pDevice->numEqns; index++) { - xOld = pDevice->dcSolution[index]; - xDelta = pDevice->dcDeltaSolution[index]; - xNew = xOld + xDelta; - tol = pDevice->abstol + pDevice->reltol * MAX(ABS(xOld), ABS(xNew)); - if (ABS(xDelta) > tol) { - converged = FALSE; - goto done; - } - } - return (converged); - - } - /* Bias solution. Check convergence on psi, phin, phip. */ - for (eIndex = 1; eIndex < pDevice->numNodes; eIndex++) { - pElem = pDevice->elemArray[eIndex]; - for (nIndex = 0; nIndex <= 1; nIndex++) { - if (pElem->evalNodes[nIndex]) { - pNode = pElem->pNodes[nIndex]; - if (pNode->nodeType != CONTACT) { - /* check convergence on psi */ - xOld = pDevice->dcSolution[pNode->psiEqn]; - xDelta = pDevice->dcDeltaSolution[pNode->psiEqn]; - xNew = xOld + xDelta; - tol = pDevice->abstol + - pDevice->reltol * MAX(ABS(xOld), ABS(xNew)); - if (ABS(xDelta) > tol) { - converged = FALSE; - goto done; - } - } - /* check convergence on phin and phip */ - if (pElem->elemType == SEMICON && pNode->nodeType != CONTACT) { - psi = pDevice->dcSolution[pNode->psiEqn]; - nConc = pDevice->dcSolution[pNode->nEqn]; - pConc = pDevice->dcSolution[pNode->pEqn]; - newPsi = psi + pDevice->dcDeltaSolution[pNode->psiEqn]; - newN = nConc + pDevice->dcDeltaSolution[pNode->nEqn]; - newP = pConc + pDevice->dcDeltaSolution[pNode->pEqn]; - if (newN <= 0.0 || newP <= 0.0) { - *pNegConc = TRUE; - converged = FALSE; - goto done; - } - phiN = psi - log(nConc / pNode->nie); - phiP = psi + log(pConc / pNode->nie); - newPhiN = newPsi - log(newN / pNode->nie); - newPhiP = newPsi + log(newP / pNode->nie); - tol = pDevice->abstol + pDevice->reltol * MAX(ABS(phiN), ABS(newPhiN)); - if (ABS(newPhiN - phiN) > tol) { - converged = FALSE; - goto done; - } - tol = pDevice->abstol + pDevice->reltol * MAX(ABS(phiP), ABS(newPhiP)); - if (ABS(newPhiP - phiP) > tol) { - converged = FALSE; - goto done; - } - } - } - } - } -done: - - return (converged); -} - -/* - * See if the update to the solution is small enough. Returns TRUE if it is. - */ -BOOLEAN -ONEdeltaConverged(ONEdevice *pDevice) -{ - int index; - BOOLEAN converged = TRUE; - double *solution = pDevice->dcSolution; - double *delta = pDevice->dcDeltaSolution; - double xOld, xNew, tol; - - - for (index = 1; index <= pDevice->numEqns; index++) { - xOld = solution[index]; - xNew = xOld + delta[index]; - tol = pDevice->abstol + pDevice->reltol * MAX(ABS(xOld), ABS(xNew)); - if (ABS(xOld - xNew) > tol) { - converged = FALSE; - break; - } - } - return (converged); -} - -/* - * See if the update to the solution is small enough and the solution is - * physically reasonable. Returns TRUE if it is. - */ -BOOLEAN -ONEdeviceConverged(ONEdevice *pDevice) -{ - int index, eIndex; - BOOLEAN converged = TRUE; - double *solution = pDevice->dcSolution; - ONEnode *pNode; - ONEelem *pElem; - double startTime; - - /* - * If the update is sufficently small, and the carrier concentrations are - * all positive, then return TRUE, else return FALSE. - */ - - - /* CHECK CONVERGENCE */ - startTime = SPfrontEnd->IFseconds(); - if ((converged = ONEdeltaConverged(pDevice)) == TRUE) { - for (eIndex = 1; eIndex < pDevice->numNodes; eIndex++) { - pElem = pDevice->elemArray[eIndex]; - for (index = 0; index <= 1; index++) { - if (pElem->evalNodes[index]) { - pNode = pElem->pNodes[index]; - if (pNode->nEqn != 0 && solution[pNode->nEqn] < 0.0) { - converged = FALSE; - solution[pNode->nEqn] = pNode->nConc = 0.0; - } - if (pNode->pEqn != 0 && solution[pNode->pEqn] < 0.0) { - converged = FALSE; - solution[pNode->pEqn] = pNode->pConc = 0.0; - } - } - } - } - } - pDevice->pStats->checkTime[STAT_TRAN] += SPfrontEnd->IFseconds() - startTime; - - return (converged); -} - -/* - * Load and factor the Jacobian so that it is consistent with the current - * solution. - */ -void -ONEresetJacobian(ONEdevice *pDevice) -{ - int error; - - - ONE_jacLoad(pDevice); - error = spFactor(pDevice->matrix); - if (foundError(error)) { - exit(-1); - } -} - -/* - * Compute the device state assuming charge neutrality exists everywhere in - * the device. In insulators, where there is no charge, assign the potential - * at half the insulator band gap (refPsi). - */ -void -ONEstoreNeutralGuess(ONEdevice *pDevice) -{ - int nIndex, eIndex; - ONEelem *pElem; - ONEnode *pNode; - double nie, conc, absConc, refPsi, psi, ni, pi, sign; - - - for (eIndex = 1; eIndex < pDevice->numNodes; eIndex++) { - pElem = pDevice->elemArray[eIndex]; - refPsi = pElem->matlInfo->refPsi; - if (pElem->elemType == INSULATOR) { - for (nIndex = 0; nIndex <= 1; nIndex++) { - if (pElem->evalNodes[nIndex]) { - pNode = pElem->pNodes[nIndex]; - if (pNode->nodeType == CONTACT) { - /* - * A metal contact to insulating domain, so use work function - * difference as the value of psi. - */ - pNode->psi = RefPsi - pNode->eaff; - } else { - pNode->psi = refPsi; - } - } - } - } - if (pElem->elemType == SEMICON) { - for (nIndex = 0; nIndex <= 1; nIndex++) { - if (pElem->evalNodes[nIndex]) { - pNode = pElem->pNodes[nIndex]; - nie = pNode->nie; - conc = pNode->netConc / nie; - psi = 0.0; - ni = nie; - pi = nie; - sign = SGN(conc); - absConc = ABS(conc); - if (conc != 0.0) { - psi = sign * log(0.5 * absConc + sqrt(1.0 + 0.25 * absConc * absConc)); - ni = nie * exp(psi); - pi = nie * exp(-psi); - if (FreezeOut) { - /* Use Newton's Method to solve for psi. */ - int ctr, maxiter = 10; - double rhs, deriv, fNa, fNd, fdNa, fdNd; - for (ctr = 0; ctr < maxiter; ctr++) { - pNode->nConc = ni; - pNode->pConc = pi; - ONEQfreezeOut(pNode, &fNd, &fNa, &fdNd, &fdNa); - rhs = pi - ni + pNode->nd * fNd - pNode->na * fNa; - deriv = pi + ni - pNode->nd * fdNd + pNode->na * fdNa; - psi += rhs / deriv; - ni = nie * exp(psi); - pi = nie * exp(-psi); - } - } - } - pNode->psi = refPsi + psi; - pNode->psi0 = pNode->psi; - pNode->vbe = refPsi; - pNode->nConc = ni; - pNode->pConc = pi; - /* Now store the initial guess in the dc solution vector. */ - pDevice->dcSolution[pNode->poiEqn] = pNode->psi; - } - } - } - } -} - -/* - * Compute the device state at thermal equilibrium. This state is equal to - * the solution of just Poisson's equation. The charge-neutral solution is - * taken as an initial guess. - */ -void -ONEequilSolve(ONEdevice *pDevice) -{ - BOOLEAN newSolver = FALSE; - int error; - int nIndex, eIndex; - ONEelem *pElem; - ONEnode *pNode; - double startTime, setupTime, miscTime; - - - setupTime = miscTime = 0.0; - - /* SETUP */ - startTime = SPfrontEnd->IFseconds(); - switch (pDevice->solverType) { - case SLV_SMSIG: - case SLV_BIAS: - /* free up memory allocated for the bias solution */ - FREE(pDevice->dcSolution); - FREE(pDevice->dcDeltaSolution); - FREE(pDevice->copiedSolution); - FREE(pDevice->rhs); - FREE(pDevice->rhsImag); - spDestroy(pDevice->matrix); - /* FALLTHRU */ - case SLV_NONE: - pDevice->poissonOnly = TRUE; - pDevice->numEqns = pDevice->dimEquil - 1; - XCALLOC(pDevice->dcSolution, double, pDevice->dimEquil); - XCALLOC(pDevice->dcDeltaSolution, double, pDevice->dimEquil); - XCALLOC(pDevice->copiedSolution, double, pDevice->dimEquil); - XCALLOC(pDevice->rhs, double, pDevice->dimEquil); - pDevice->matrix = spCreate(pDevice->numEqns, 0, &error); - if (error == spNO_MEMORY) { - printf("ONEequilSolve: Out of Memory\n"); - exit(-1); - } - newSolver = TRUE; - spSetReal(pDevice->matrix); - ONEQjacBuild(pDevice); - pDevice->numOrigEquil = spElementCount(pDevice->matrix); - pDevice->numFillEquil = 0; - /* FALLTHRU */ - case SLV_EQUIL: - pDevice->solverType = SLV_EQUIL; - break; - default: - fprintf(stderr, "Panic: Unknown solver type in equil solution.\n"); - exit(-1); - break; - } - ONEstoreNeutralGuess(pDevice); - setupTime += SPfrontEnd->IFseconds() - startTime; - - /* SOLVE */ - ONEdcSolve(pDevice, MaxIterations, newSolver, FALSE, NULL); - - /* MISCELLANEOUS */ - startTime = SPfrontEnd->IFseconds(); - if (newSolver) { - pDevice->numFillEquil = spFillinCount(pDevice->matrix); - } - if (pDevice->converged) { - ONEQcommonTerms(pDevice); - - /* Save equilibrium potential. */ - for (eIndex = 1; eIndex < pDevice->numNodes; eIndex++) { - pElem = pDevice->elemArray[eIndex]; - for (nIndex = 0; nIndex <= 1; nIndex++) { - if (pElem->evalNodes[nIndex]) { - pNode = pElem->pNodes[nIndex]; - pNode->psi0 = pNode->psi; - } - } - } - } else { - printf("ONEequilSolve: No Convergence\n"); - } - miscTime += SPfrontEnd->IFseconds() - startTime; - pDevice->pStats->setupTime[STAT_SETUP] += setupTime; - pDevice->pStats->miscTime[STAT_SETUP] += miscTime; -} - -/* - * Compute the device state under an applied bias. The equilibrium solution - * is taken as an initial guess the first time this is called. - */ -void -ONEbiasSolve(ONEdevice *pDevice, int iterationLimit, - BOOLEAN tranAnalysis, ONEtranInfo *info) -{ - BOOLEAN newSolver = FALSE; - int error; - int index, eIndex; - double *solution; - ONEelem *pElem; - ONEnode *pNode; - double startTime, setupTime, miscTime; - - - setupTime = miscTime = 0.0; - - - /* SETUP */ - startTime = SPfrontEnd->IFseconds(); - switch (pDevice->solverType) { - case SLV_EQUIL: - /* Free up the vectors allocated in the equilibrium solution. */ - FREE(pDevice->dcSolution); - FREE(pDevice->dcDeltaSolution); - FREE(pDevice->copiedSolution); - FREE(pDevice->rhs); - spDestroy(pDevice->matrix); - /* FALLTHRU */ - case SLV_NONE: - pDevice->poissonOnly = FALSE; - pDevice->numEqns = pDevice->dimBias - 1; - XCALLOC(pDevice->dcSolution, double, pDevice->dimBias); - XCALLOC(pDevice->dcDeltaSolution, double, pDevice->dimBias); - XCALLOC(pDevice->copiedSolution, double, pDevice->dimBias); - XCALLOC(pDevice->rhs, double, pDevice->dimBias); - XCALLOC(pDevice->rhsImag, double, pDevice->dimBias); - pDevice->matrix = spCreate(pDevice->numEqns, 1, &error); - if (error == spNO_MEMORY) { - exit(-1); - } - newSolver = TRUE; - ONE_jacBuild(pDevice); - pDevice->numOrigBias = spElementCount(pDevice->matrix); - pDevice->numFillBias = 0; - ONEstoreInitialGuess(pDevice); - /* FALLTHRU */ - case SLV_SMSIG: - spSetReal(pDevice->matrix); - /* FALLTHRU */ - case SLV_BIAS: - pDevice->solverType = SLV_BIAS; - break; - default: - fprintf(stderr, "Panic: Unknown solver type in bias solution.\n"); - exit(-1); - break; - } - setupTime += SPfrontEnd->IFseconds() - startTime; - - /* SOLVE */ - ONEdcSolve(pDevice, iterationLimit, newSolver, tranAnalysis, info); - - /* MISCELLANEOUS */ - startTime = SPfrontEnd->IFseconds(); - if (newSolver) { - pDevice->numFillBias = spFillinCount(pDevice->matrix); - } - solution = pDevice->dcSolution; - if ((!pDevice->converged) && iterationLimit > 1) { - } else if (pDevice->converged) { - /* Update the nodal quantities. */ - for (eIndex = 1; eIndex < pDevice->numNodes; eIndex++) { - pElem = pDevice->elemArray[eIndex]; - for (index = 0; index <= 1; index++) { - if (pElem->evalNodes[index]) { - pNode = pElem->pNodes[index]; - if (pNode->psiEqn != 0) { - pNode->psi = solution[pNode->psiEqn]; - } - if (pNode->nEqn != 0) { - pNode->nConc = solution[pNode->nEqn]; - } - if (pNode->pEqn != 0) { - pNode->pConc = solution[pNode->pEqn]; - } - } - } - } - /* Update the current terms. */ - ONE_commonTerms(pDevice, FALSE, tranAnalysis, info); - } else if (iterationLimit <= 1) { - for (eIndex = 1; eIndex < pDevice->numNodes; eIndex++) { - pElem = pDevice->elemArray[eIndex]; - for (index = 0; index <= 1; index++) { - if (pElem->evalNodes[index]) { - pNode = pElem->pNodes[index]; - if (pNode->nodeType != CONTACT) { - pNode->psi = solution[pNode->psiEqn]; - pDevice->devState0 [pNode->nodePsi] = pNode->psi; - if (pElem->elemType == SEMICON) { - pNode->nConc = solution[pNode->nEqn]; - pNode->pConc = solution[pNode->pEqn]; - pDevice->devState0 [pNode->nodeN] = pNode->nConc; - pDevice->devState0 [pNode->nodeP] = pNode->pConc; - } - } - } - } - } - } - miscTime += SPfrontEnd->IFseconds() - startTime; - if (tranAnalysis) { - pDevice->pStats->setupTime[STAT_TRAN] += setupTime; - pDevice->pStats->miscTime[STAT_TRAN] += miscTime; - } else { - pDevice->pStats->setupTime[STAT_DC] += setupTime; - pDevice->pStats->miscTime[STAT_DC] += miscTime; - } -} - -/* Copy the device's equilibrium state into the solution vector. */ -void -ONEstoreEquilibGuess(ONEdevice *pDevice) -{ - int nIndex, eIndex; - double *solution = pDevice->dcSolution; - double refPsi; - ONEelem *pElem; - ONEnode *pNode; - - - for (eIndex = 1; eIndex < pDevice->numNodes; eIndex++) { - pElem = pDevice->elemArray[eIndex]; - refPsi = pElem->matlInfo->refPsi; - for (nIndex = 0; nIndex <= 1; nIndex++) { - if (pElem->evalNodes[nIndex]) { - pNode = pElem->pNodes[nIndex]; - if (pNode->nodeType != CONTACT) { - solution[pNode->psiEqn] = pNode->psi0; - if (pElem->elemType == SEMICON) { - solution[pNode->nEqn] = pNode->nie * exp(pNode->psi0 - refPsi); - solution[pNode->pEqn] = pNode->nie * exp(-pNode->psi0 + refPsi); - } - } - } - } - } -} - -/* Copy the device's internal state into the solution vector. */ -void -ONEstoreInitialGuess(ONEdevice *pDevice) -{ - int nIndex, eIndex; - double *solution = pDevice->dcSolution; - ONEelem *pElem; - ONEnode *pNode; - - - for (eIndex = 1; eIndex < pDevice->numNodes; eIndex++) { - pElem = pDevice->elemArray[eIndex]; - for (nIndex = 0; nIndex <= 1; nIndex++) { - if (pElem->evalNodes[nIndex]) { - pNode = pElem->pNodes[nIndex]; - if (pNode->nodeType != CONTACT) { - solution[pNode->psiEqn] = pNode->psi; - if (pElem->elemType == SEMICON) { - solution[pNode->nEqn] = pNode->nConc; - solution[pNode->pEqn] = pNode->pConc; - } - } - } - } - } -} - - -int -ONEnewDelta(ONEdevice *pDevice, BOOLEAN tranAnalysis, ONEtranInfo *info) -{ - int index, iterNum; - double newNorm, fib, lambda, fibn, fibp; - BOOLEAN acceptable = FALSE, error = FALSE; - iterNum = 0; - lambda = 1.0; - fibn = 1.0; - fibp = 1.0; - - - /* - * Copy the contents of dcSolution into copiedSolution and modify - * dcSolution by adding the deltaSolution. - */ - for (index = 1; index <= pDevice->numEqns; index++) { - pDevice->copiedSolution[index] = pDevice->dcSolution[index]; - pDevice->dcSolution[index] += pDevice->dcDeltaSolution[index]; - } - - if (pDevice->poissonOnly) { - ONEQrhsLoad(pDevice); - } else { - ONE_rhsLoad(pDevice, tranAnalysis, info); - } - newNorm = maxNorm(pDevice->rhs, pDevice->numEqns); - if (pDevice->rhsNorm <= pDevice->abstol) { - lambda = 0.0; - newNorm = pDevice->rhsNorm; - } else if (newNorm < pDevice->rhsNorm) { - acceptable = TRUE; - } else { - /* chop the step size so that deltax is acceptable */ - if (ONEdcDebug) { - fprintf(stdout, " %11.4e %11.4e\n", - newNorm, lambda); - } - while (!acceptable) { - iterNum++; - - if (iterNum > NORM_RED_MAXITERS) { - error = TRUE; - lambda = 0.0; - /* Don't break out until after we've reset the device. */ - } - fib = fibp; - fibp = fibn; - fibn += fib; - lambda *= (fibp / fibn); - - for (index = 1; index <= pDevice->numEqns; index++) { - pDevice->dcSolution[index] = pDevice->copiedSolution[index] - + lambda * pDevice->dcDeltaSolution[index]; - } - if (pDevice->poissonOnly) { - ONEQrhsLoad(pDevice); - } else { - ONE_rhsLoad(pDevice, tranAnalysis, info); - } - newNorm = maxNorm(pDevice->rhs, pDevice->numEqns); - if (error) { - break; - } - if (newNorm <= pDevice->rhsNorm) { - acceptable = TRUE; - } - if (ONEdcDebug) { - fprintf(stdout, " %11.4e %11.4e\n", - newNorm, lambda); - } - } - } - /* Restore the previous dcSolution and store the new deltaSolution. */ - pDevice->rhsNorm = newNorm; - for (index = 1; index <= pDevice->numEqns; index++) { - pDevice->dcSolution[index] = pDevice->copiedSolution[index]; - pDevice->dcDeltaSolution[index] *= lambda; - } - return(error); -} - - -/* Predict the values of the internal variables at the next timepoint. */ -/* Needed for Predictor-Corrector LTE estimation */ -void -ONEpredict(ONEdevice *pDevice, ONEtranInfo *info) -{ - int nIndex, eIndex; - ONEnode *pNode; - ONEelem *pElem; - double startTime, miscTime = 0.0; - - - /* TRANSIENT MISC */ - startTime = SPfrontEnd->IFseconds(); - for (eIndex = 1; eIndex < pDevice->numNodes; eIndex++) { - pElem = pDevice->elemArray[eIndex]; - for (nIndex = 0; nIndex <= 1; nIndex++) { - if (pElem->evalNodes[nIndex]) { - pNode = pElem->pNodes[nIndex]; - pNode->psi = pDevice->devState1 [pNode->nodePsi]; - if (pElem->elemType == SEMICON && pNode->nodeType != CONTACT) { - pNode->nPred = predict(pDevice->devStates, info, pNode->nodeN); - pNode->pPred = predict(pDevice->devStates, info, pNode->nodeP); - pNode->nConc = pNode->nPred; - pNode->pConc = pNode->pPred; - } - } - } - } - miscTime += SPfrontEnd->IFseconds() - startTime; - pDevice->pStats->miscTime[STAT_TRAN] += miscTime; -} - - -/* Estimate the device's overall truncation error. */ -double -ONEtrunc(ONEdevice *pDevice, ONEtranInfo *info, double delta) -{ - int nIndex, eIndex; - ONEelem *pElem; - ONEnode *pNode; - double tolN, tolP, lte, relError, temp; - double lteCoeff = info->lteCoeff; - double mult = 10.0; - double reltol; - double startTime, lteTime = 0.0; - - - /* TRANSIENT LTE */ - startTime = SPfrontEnd->IFseconds(); - - relError = 0.0; - reltol = pDevice->reltol * mult; - - /* Need to get the predictor for the current order. */ - /* The scheme currently used is very dumb. Need to fix later. */ - /* XXX Why is the scheme dumb? Never understood this. */ - computePredCoeff(info->method, info->order, info->predCoeff, info->delta); - - for (eIndex = 1; eIndex < pDevice->numNodes; eIndex++) { - pElem = pDevice->elemArray[eIndex]; - for (nIndex = 0; nIndex <= 1; nIndex++) { - if (pElem->evalNodes[nIndex]) { - pNode = pElem->pNodes[nIndex]; - if (pElem->elemType == SEMICON && pNode->nodeType != CONTACT) { - tolN = pDevice->abstol + reltol * ABS(pNode->nConc); - tolP = pDevice->abstol + reltol * ABS(pNode->pConc); - pNode->nPred = predict(pDevice->devStates, info, pNode->nodeN); - pNode->pPred = predict(pDevice->devStates, info, pNode->nodeP); - lte = lteCoeff * (pNode->nConc - pNode->nPred); - temp = lte / tolN; - relError += temp * temp; - lte = lteCoeff * (pNode->pConc - pNode->pPred); - temp = lte / tolP; - relError += temp * temp; - } - } - } - } - - /* Make sure error is non-zero. */ - relError = MAX(pDevice->abstol, relError); - - /* The total relative error has been calculated norm-2 squared. */ - relError = sqrt(relError / pDevice->numEqns); - - /* Use the order of the integration method to compute new delta. */ - temp = delta / pow(relError, 1.0 / (info->order + 1)); - - lteTime += SPfrontEnd->IFseconds() - startTime; - pDevice->pStats->lteTime += lteTime; - - return (temp); -} - -/* Save info from state table into the internal state. */ -void -ONEsaveState(ONEdevice *pDevice) -{ - int nIndex, eIndex; - ONEnode *pNode; - ONEelem *pElem; - - for (eIndex = 1; eIndex < pDevice->numNodes; eIndex++) { - pElem = pDevice->elemArray[eIndex]; - for (nIndex = 0; nIndex <= 1; nIndex++) { - if (pElem->evalNodes[nIndex]) { - pNode = pElem->pNodes[nIndex]; - pNode->psi = pDevice->devState1 [pNode->nodePsi]; - if (pElem->elemType == SEMICON && pNode->nodeType != CONTACT) { - pNode->nConc = pDevice->devState1 [pNode->nodeN]; - pNode->pConc = pDevice->devState1 [pNode->nodeP]; - } - } - } - } -} - -/* Function to compute Nu norm of the rhs vector. */ -/* Nu-norm calculation based upon work done at Stanford. */ -double -ONEnuNorm(ONEdevice *pDevice) -{ - /* The LU Decomposed matrix is available. Use it to calculate x. */ - spSolve(pDevice->matrix, pDevice->rhs, pDevice->rhsImag, - NULL, NULL); - - /* Compute L2-norm of the solution vector (stored in rhsImag) */ - return (l2Norm(pDevice->rhsImag, pDevice->numEqns)); -} - - -/* - * Check for numerical errors in the Jacobian. Useful debugging aid when new - * models are being incorporated. - */ -void -ONEjacCheck(ONEdevice *pDevice, BOOLEAN tranAnalysis, ONEtranInfo *info) -{ - int index, rIndex; - double del, diff, tol, *dptr; - - - if (ONEjacDebug) { - ONE_sysLoad(pDevice, tranAnalysis, info); - /* - * spPrint( pDevice->matrix, 0, 1, 1 ); - */ - pDevice->rhsNorm = maxNorm(pDevice->rhs, pDevice->numEqns); - for (index = 1; index <= pDevice->numEqns; index++) { - if (1e3 * ABS(pDevice->rhs[index]) > pDevice->rhsNorm) { - fprintf(stderr, "eqn %d: res %11.4e, norm %11.4e\n", - index, pDevice->rhs[index], pDevice->rhsNorm); - } - } - for (index = 1; index <= pDevice->numEqns; index++) { - pDevice->rhsImag[index] = pDevice->rhs[index]; - } - for (index = 1; index <= pDevice->numEqns; index++) { - pDevice->copiedSolution[index] = pDevice->dcSolution[index]; - del = 1e-4 * pDevice->abstol + 1e-6 * ABS(pDevice->dcSolution[index]); - pDevice->dcSolution[index] += del; - ONE_rhsLoad(pDevice, tranAnalysis, info); - pDevice->dcSolution[index] = pDevice->copiedSolution[index]; - for (rIndex = 1; rIndex <= pDevice->numEqns; rIndex++) { - diff = (pDevice->rhsImag[rIndex] - pDevice->rhs[rIndex]) / del; - dptr = spFindElement(pDevice->matrix, rIndex, index); - /* - * if ( dptr ISNOT NULL ) { fprintf( stderr, "[%d][%d]: FD = - * %11.4e, AJ = %11.4e\n", rIndex, index, diff, *dptr ); } else { - * fprintf( stderr, "[%d][%d]: FD = %11.4e, AJ = %11.4e\n", rIndex, - * index, diff, 0.0 ); } - */ - if (dptr != NULL) { - tol = (1e-4 * pDevice->abstol) + (1e-2 * MAX(ABS(diff), ABS(*dptr))); - if ((diff != 0.0) && (ABS(diff - *dptr) > tol)) { - fprintf(stderr, "Mismatch[%d][%d]: FD = %11.4e, AJ = %11.4e\n\t FD-AJ = %11.4e vs. %11.4e\n", - rIndex, index, diff, *dptr, - ABS(diff - *dptr), tol); - } - } else { - if (diff != 0.0) { - fprintf(stderr, "Missing [%d][%d]: FD = %11.4e, AJ = 0.0\n", - rIndex, index, diff); - } - } - } - } - } -} diff --git a/src/ciderlib/oned/readme b/src/ciderlib/oned/readme deleted file mode 100644 index 282a53aca..000000000 --- a/src/ciderlib/oned/readme +++ /dev/null @@ -1,13 +0,0 @@ -Directory: oned ---------------- -This directory contains the files that are primarily responsible for -implementing the 1D device simulator. It also contains files that help -interface the circuit simulator to the device simulator. Most functions -that are common to all 1D device simulations start with the prefix ONE, -e.g. ONEbiasSolve. The device-specific routines start with either -NUMD or NBJT, e.g. NUMDadmittance or NBJTproject. The simulator contains -both a Poisson Solver for equilibrium and a three-equation solver for bias -solutions. An attempt has been made to keep the function names parallel -in the two portions. Poisson routines are identified with a 'Q' (for charge -only) after the ONE, and Full solver routines are identified with an -underscore '_'. diff --git a/src/ciderlib/support/Makefile.am b/src/ciderlib/support/Makefile.am deleted file mode 100644 index c4d277df3..000000000 --- a/src/ciderlib/support/Makefile.am +++ /dev/null @@ -1,24 +0,0 @@ -## Process this file with automake to produce Makefile.in - -noinst_LTLIBRARIES = libcidersuprt.la - -libcidersuprt_la_SOURCES = \ - database.c \ - devprint.c \ - geominfo.c \ - globals.c \ - integset.c \ - integuse.c \ - logfile.c \ - mater.c \ - misc.c \ - mobil.c \ - recomb.c \ - suprem.c \ - suprmitf.c - -AM_CPPFLAGS = @AM_CPPFLAGS@ -I$(top_srcdir)/src/include -AM_CFLAGS = $(STATIC) -MAINTAINERCLEANFILES = Makefile.in - -EXTRA_DIST = readme diff --git a/src/ciderlib/support/database.c b/src/ciderlib/support/database.c deleted file mode 100644 index 5428d014e..000000000 --- a/src/ciderlib/support/database.c +++ /dev/null @@ -1,69 +0,0 @@ -/********** -Copyright 1992 Regents of the University of California. All rights reserved. -Author: 1992 David A. Gates, U. C. Berkeley CAD Group -**********/ - -#include "ngspice/ngspice.h" -#include "ngspice/fteext.h" -/* #include "ftedata.h" */ -#include "ngspice/cidersupt.h" - -struct plot * -DBread( char *fileName ) -{ - struct plot *plot; - - plot = raw_read( fileName ); - - return(plot); -} - -double * -DBgetData(struct plot *plot, char *name, int lengthWanted) -{ - struct dvec *v; - double *data; - int i; - - v = vec_fromplot(name,plot); - - if (!v) { - fprintf( stderr, "Error: cannot locate variable '%s'\n", name ); - return(NULL); - } - if (v->v_length != lengthWanted ) { - fprintf( stderr, "Error: vector '%s' has incorrect length\n", name ); - return(NULL); - } - - data = TMALLOC(double, v->v_length); - if (isreal(v)) { - memcpy(data, v->v_realdata, sizeof (double) * (size_t) v->v_length); - } else { - for (i=0; i < v->v_length; i++) { - data[i] = realpart(v->v_compdata[i]); - } - } - return(data); -} - -void -DBfree(struct plot *plot) -{ - struct dvec *v, *nextv; - struct plot *pl, *nextpl; - - for (pl = plot; pl; pl = nextpl) { - nextpl = pl->pl_next; - tfree( pl->pl_title ); - tfree( pl->pl_date ); - tfree( pl->pl_name ); - tfree( pl->pl_typename ); - for (v = pl->pl_dvecs; v; v = nextv) { - nextv = v->v_next; - vec_free( v ); - } - wl_free( pl->pl_commands ); - /* XXX Environment variables (pl->pl_env) will leak. */ - } -} diff --git a/src/ciderlib/support/devprint.c b/src/ciderlib/support/devprint.c deleted file mode 100644 index a7f86a1a8..000000000 --- a/src/ciderlib/support/devprint.c +++ /dev/null @@ -1,75 +0,0 @@ -/********** -Copyright 1992 Regents of the University of California. All rights reserved. -Author: 1992 David A. Gates, U. C. Berkeley CAD Group -**********/ - -/* Device-type Dependent Printing Routines */ - -#include "ngspice/ngspice.h" -#include "ngspice/optndefs.h" -#include "ngspice/cidersupt.h" - -void -printVoltages(FILE *file, char *mName, char *iName, int devType, - int numVolt, double v1, double delV1, double v2, - double delV2, double v3, double delV3 ) -/* FILE *file output filestream */ -/* char *mName name of model */ -/* char *iName name of instance */ -{ - fprintf( file, "\n" ); - switch ( devType ) { - case OPTN_RESISTOR: - fprintf( file, "RES %s:%s voltage:\n", mName, iName ); - fprintf( file, " Vpn =% .4e delVpn =% .4e\n", v1, delV1 ); - break; - case OPTN_CAPACITOR: - fprintf( file, "CAP %s:%s voltage:\n", mName, iName ); - fprintf( file, " Vpn =% .4e delVpn =% .4e\n", v1, delV1 ); - break; - case OPTN_DIODE: - fprintf( file, "DIO %s:%s voltage:\n", mName, iName ); - fprintf( file, " Vpn =% .4e delVpn =% .4e\n", v1, delV1 ); - break; - case OPTN_MOSCAP: - fprintf( file, "MOS %s:%s voltage:\n", mName, iName ); - fprintf( file, " Vgb =% .4e delVgb =% .4e\n", v1, delV1 ); - break; - case OPTN_BIPOLAR: - fprintf( file, "BJT %s:%s voltages:\n", mName, iName ); - if ( numVolt == 3 ) { - fprintf( file, " Vce =% .4e delVce =% .4e\n", - v1 - v3, delV1 - delV3 ); - fprintf( file, " Vbe =% .4e delVbe =% .4e\n", - v2 - v3, delV2 - delV3 ); - fprintf( file, " Vcs =% .4e delVcs =% .4e\n", v1, delV1 ); - } else { - fprintf( file, " Vce =% .4e delVce =% .4e\n", v1, delV1 ); - fprintf( file, " Vbe =% .4e delVbe =% .4e\n", v2, delV2 ); - } - break; - case OPTN_MOSFET: - fprintf( file, "MOS %s:%s voltages:\n", mName, iName ); - fprintf( file, " Vdb =% .4e delVdb =% .4e\n", v1, delV1 ); - fprintf( file, " Vgb =% .4e delVgb =% .4e\n", v2, delV2 ); - fprintf( file, " Vsb =% .4e delVsb =% .4e\n", v3, delV3 ); - break; - case OPTN_JFET: - if ( numVolt == 3 ) { - fprintf( file, "JFET %s:%s voltages:\n", mName, iName ); - fprintf( file, " Vdb =% .4e delVdb =% .4e\n", v1, delV1 ); - fprintf( file, " Vgb =% .4e delVgb =% .4e\n", v2, delV2 ); - fprintf( file, " Vsb =% .4e delVsb =% .4e\n", v3, delV3 ); - } else { - fprintf( file, "JFET %s:%s voltages:\n", mName, iName ); - fprintf( file, " Vds =% .4e delVds =% .4e\n", v1, delV1 ); - fprintf( file, " Vgs =% .4e delVgs =% .4e\n", v2, delV2 ); - } - break; - case OPTN_SOIBJT: - case OPTN_SOIMOS: - case OPTN_MESFET: - default: - break; - } -} diff --git a/src/ciderlib/support/geominfo.c b/src/ciderlib/support/geominfo.c deleted file mode 100644 index 0a0a2ab3b..000000000 --- a/src/ciderlib/support/geominfo.c +++ /dev/null @@ -1,131 +0,0 @@ -/********** -Copyright 1991 Regents of the University of California. All rights reserved. -Author: 1987 Kartikeya Mayaram, U. C. Berkeley CAD Group -Author: 1991 David A. Gates, U. C. Berkeley CAD Group -**********/ - -#include "ngspice/ngspice.h" -#include "ngspice/gendev.h" -#include "ngspice/macros.h" -#include "ngspice/memory.h" -#include "ngspice/cidersupt.h" - -void printCoordInfo(CoordInfo *pFirstCoord) -{ - CoordInfo *pCoord; - - for ( pCoord = pFirstCoord; pCoord != NULL; - pCoord = pCoord->next ) { - fprintf(stderr, "mesh number=%4d location=%11.4e\n", - pCoord->number, pCoord->location ); - } -} - -void killCoordInfo(CoordInfo *pFirstCoord) -{ - CoordInfo *pCoord, *pKill; - - for ( pCoord = pFirstCoord; pCoord != NULL; ) { - pKill = pCoord; - pCoord = pCoord->next; - FREE( pKill ); - } -} - -void ONEprintDomainInfo(DomainInfo *pFirstDomain) -{ - DomainInfo *pDomain; - - for ( pDomain = pFirstDomain; pDomain != NULL; - pDomain = pDomain->next ) { - fprintf( stderr, "domain id=%4d mat=%4d ixLo=%4d ixHi=%4d\n", - pDomain->id, pDomain->material, pDomain->ixLo, pDomain->ixHi ); - } -} - -void TWOprintDomainInfo(DomainInfo *pFirstDomain) -{ - DomainInfo *pDomain; - - for ( pDomain = pFirstDomain; pDomain != NULL; - pDomain = pDomain->next ) { - fprintf( stderr, - "domain id=%4d mat=%4d ixLo=%4d ixHi=%4d iyLo=%4d iyHi=%4d\n", - pDomain->id, pDomain->material, - pDomain->ixLo, pDomain->ixHi, - pDomain->iyLo, pDomain->iyHi); - } -} - -void killDomainInfo(DomainInfo *pFirstDomain) -{ - DomainInfo *pDomain, *pKill; - - for ( pDomain = pFirstDomain; pDomain != NULL; ) { - pKill = pDomain; - pDomain = pDomain->next; - FREE( pKill ); - } -} - -void ONEprintBoundaryInfo(BoundaryInfo *pFirstBoundary) -{ - BoundaryInfo *pBoundary; - - for ( pBoundary = pFirstBoundary; pBoundary != NULL; - pBoundary = pBoundary->next ) { - fprintf( stderr, - "boundary dom=%4d nbr=%4d ixLo=%4d ixHi=%4d\n", - pBoundary->domain, pBoundary->neighbor, - pBoundary->ixLo, pBoundary->ixHi ); - } -} - -void TWOprintBoundaryInfo(BoundaryInfo *pFirstBoundary) -{ - BoundaryInfo *pBoundary; - - for ( pBoundary = pFirstBoundary; pBoundary != NULL; - pBoundary = pBoundary->next ) { - fprintf( stderr, - "boundary dom=%4d nbr=%4d ixLo=%4d ixHi=%4d iyLo=%4d iyHi=%4d\n", - pBoundary->domain, pBoundary->neighbor, - pBoundary->ixLo, pBoundary->ixHi, - pBoundary->iyLo, pBoundary->iyHi); - } -} - -void killBoundaryInfo(BoundaryInfo *pFirstBoundary) -{ - BoundaryInfo *pBoundary, *pKill; - - for ( pBoundary = pFirstBoundary; pBoundary != NULL; ) { - pKill = pBoundary; - pBoundary = pBoundary->next; - FREE( pKill ); - } -} - -void TWOprintElectrodeInfo(ElectrodeInfo *pFirstElectrode) -{ - ElectrodeInfo *pElectrode; - - for ( pElectrode = pFirstElectrode; pElectrode != NULL; - pElectrode = pElectrode->next ) { - fprintf( stderr, - "electrode id=%4d ixLo=%4d ixHi=%4d iyLo=%4d iyHi=%4d\n", - pElectrode->id, pElectrode->ixLo, pElectrode->ixHi, - pElectrode->iyLo, pElectrode->iyHi ); - } -} - -void killElectrodeInfo(ElectrodeInfo *pFirstElectrode) -{ - ElectrodeInfo *pElectrode, *pKill; - - for ( pElectrode = pFirstElectrode; pElectrode != NULL; ) { - pKill = pElectrode; - pElectrode = pElectrode->next; - FREE( pKill ); - } -} diff --git a/src/ciderlib/support/globals.c b/src/ciderlib/support/globals.c deleted file mode 100644 index 8f98e5e75..000000000 --- a/src/ciderlib/support/globals.c +++ /dev/null @@ -1,157 +0,0 @@ -/********** -Copyright 1991 Regents of the University of California. All rights reserved. -Author: 1987 Kartikeya Mayaram, U. C. Berkeley CAD Group -Author: 1991 David A. Gates, U. C. Berkeley CAD Group -**********/ - -#include "ngspice/ngspice.h" -#include "ngspice/numglobs.h" -#include "ngspice/numconst.h" -#include "ngspice/numenum.h" -#include "ngspice/cidersupt.h" - -/* Global Variable Declarations -char *LogFileName = "cider.log"; - -int BandGapNarrowing; -int TempDepMobility, ConcDepMobility, FieldDepMobility, TransDepMobility; -int SurfaceMobility, MatchingMobility, MobDeriv; -int CCScattering; -int Srh, Auger, ConcDepLifetime, AvalancheGen; -int FreezeOut = FALSE; -int OneCarrier; - -int MaxIterations = 100; -int AcAnalysisMethod = DIRECT; - -double Temp, RelTemp, Vt, RefPsi; -double EpsNorm, VNorm, NNorm, LNorm, TNorm, JNorm, GNorm, ENorm; - RefPsi is the potential at Infinity */ - -/* - * Compute global values for this device. - */ -void GLOBcomputeGlobals(GLOBvalues *pGlobals, double temp) -/* GLOBvalues *pGlobals Global Parameter Data Structure */ -/* double temp Instance Temperature */ -{ - double tmp1; - double mnSi, mpSi; /* electron and hole conduction mass */ - double eg0; /* band gap */ - double nc0, nv0; /* conduction/valence band states */ - - /* compute temp. dependent global parameters */ - Temp = temp; - RelTemp = Temp / 300.0; - tmp1 = pow( RelTemp, 1.5 ); - - Vt = BOLTZMANN_CONSTANT * Temp / CHARGE; - eg0 = EGAP300_SI + DGAPDT_SI * ( (300.0 * 300.0) / (300.0 + TREF_EG_SI) - - (Temp * Temp) / (Temp + TREF_EG_SI) ); - mnSi = 1.039 + 5.477e-4 * Temp - 2.326e-7 * Temp * Temp; - mpSi = 0.262 * log( 0.259 * Temp ); - nc0 = NCV_NOM * pow( mnSi, 1.5 ) * tmp1; - nv0 = NCV_NOM * pow( mpSi, 1.5 ) * tmp1; - RefPsi = 0.0; - - /* set up the normalization factors */ - EpsNorm = EPS_SI; - VNorm = Vt; - NNorm = sqrt( nc0 ) * sqrt( nv0 ); /* this way no overflow */ - LNorm = sqrt( ( VNorm * EpsNorm ) / ( CHARGE * NNorm ) ); - TNorm = LNorm * LNorm / VNorm; - JNorm = CHARGE * NNorm * VNorm / LNorm; - GNorm = JNorm / VNorm; - ENorm = VNorm / LNorm; - - RefPsi /= VNorm; - - /* Save Globals */ - GLOBputGlobals( pGlobals ); - /* - * GLOBprnGlobals( stdout, pGlobals ); - */ - -} - -void GLOBputGlobals(GLOBvalues *values) -{ - if ( values == NULL ) { - fprintf( stderr, "Error: tried to get from NIL GLOBvalues\n"); - exit(-1); - } - - /* Temperature-related globals */ - values->Temp = Temp; - values->RelTemp = RelTemp; - values->Vt = Vt; - values->RefPsi = RefPsi; - - /* Normalization Factors */ - values->EpsNorm = EpsNorm; - values->VNorm = VNorm; - values->NNorm = NNorm; - values->LNorm = LNorm; - values->TNorm = TNorm; - values->JNorm = JNorm; - values->GNorm = GNorm; - values->ENorm = ENorm; - - return; -} - -/* - * Reload all globals needed during DEV loading routines - * and DEV output routines - */ -void GLOBgetGlobals(GLOBvalues *values) -{ - if ( values == NULL ) { - fprintf( stderr, "Error: tried to get from NIL GLOBvalues\n"); - exit(-1); - } - - /* Temperature-related globals */ - Temp = values->Temp; - RelTemp = values->RelTemp; - Vt = values->Vt; - RefPsi = values->RefPsi; - - /* Normalization Factors */ - EpsNorm = values->EpsNorm; - VNorm = values->VNorm; - NNorm = values->NNorm; - LNorm = values->LNorm; - TNorm = values->TNorm; - JNorm = values->JNorm; - GNorm = values->GNorm; - ENorm = values->ENorm; - - return; -} - -void GLOBprnGlobals(FILE *file, GLOBvalues *values) -{ - static const char tabformat[] = "%12s: % .4e %-12s\t"; - static const char newformat[] = "%12s: % .4e %-12s\n"; - - if ( values == NULL ) { - fprintf( stderr, "Error: tried to print NIL GLOBvalues\n"); - exit(-1); - } - fprintf( file, "*** GLOBAL PARAMETERS AT %g deg K\n", values->Temp ); - fprintf( file, "****** Temperature-Dependent Voltages\n" ); - fprintf( file, tabformat, "Vt", values->Vt, "V" ); - fprintf( file, newformat, "RefPsi", values->RefPsi * values->VNorm, "V" ); - fprintf( file, "****** Normalization Factors\n" ); - fprintf( file, newformat, "EpsNorm", values->EpsNorm, "F/cm" ); - fprintf( file, newformat, "VNorm", values->VNorm, "V" ); - fprintf( file, newformat, "NNorm", values->NNorm, "/cm^3" ); - fprintf( file, newformat, "LNorm", values->LNorm, "cm" ); - fprintf( file, newformat, "TNorm", values->TNorm, "s" ); - fprintf( file, newformat, "JNorm", values->JNorm, "A/cm^2" ); - fprintf( file, newformat, "GNorm", values->GNorm, "A/V" ); - fprintf( file, newformat, "ENorm", values->ENorm, "V/cm" ); - - return; -} diff --git a/src/ciderlib/support/integset.c b/src/ciderlib/support/integset.c deleted file mode 100644 index 958529b08..000000000 --- a/src/ciderlib/support/integset.c +++ /dev/null @@ -1,156 +0,0 @@ -/********** -Copyright 1991 Regents of the University of California. All rights reserved. -Author: 1987 Kartikeya Mayaram, U. C. Berkeley CAD Group -**********/ - -#include "ngspice/ngspice.h" -#include "ngspice/numenum.h" -#include "ngspice/cidersupt.h" - -/* compute the coefficient for the integration and predictor methods */ -/* based on the Lagrange polynomial method in Liniger et. al. */ - -void -computeIntegCoeff(int method, int order, double *intCoeff, double *delta) -{ - int i, j, k; - double sum, temp, preMult; - double num, denom, prod; - - switch( method ) { - case BDF: - /* determine coeff[0] first */ - - sum = 0.0; - temp = 0.0; - for( j = 0 ; j < order; j++ ) { - temp += delta[ j ]; - sum += 1.0 / temp; - } - intCoeff[ 0 ] = sum; - - /* now compute the higher order coefficients */ - for( j = 1; j <= order ; j++ ) { - /* compute the pre multiplier */ - temp = 0.0; - for( i = 0; i < j; i++ ) { - temp += delta[ i ]; - } - preMult = 1.0 / temp; - prod = 1.0; - /* now compute the product */ - for( i = 1; i <= order; i++ ) { - /* product loop */ - if( i != j ) { - num = 0.0; - for( k = 0; k < i; k++ ) { - /* first the numerator */ - num += delta[ k ]; - } - if( i > j ) { - /* denom is positive */ - denom = 0.0; - for( k = j; k < i; k++ ) { - denom += delta[ k ]; - } - } - else { - /* i < j */ - denom = 0.0; - for( k = i; k < j; k++ ) { - denom += delta[ k ]; - } - denom = -denom; - } - prod *= num / denom ; - } - } - intCoeff[ j ] = -preMult * prod; - } - break; - case TRAPEZOIDAL: - default: - switch( order ) { - case 1: - temp = 1.0 / delta[ 0 ]; - intCoeff[ 0 ] = temp; - intCoeff[ 1 ] = -temp; - break; - case 2: - temp = 2.0 / delta[ 0 ]; - intCoeff[ 0 ] = temp; - intCoeff[ 1 ] = -temp; - intCoeff[ 2 ] = -1.0; - break; - } - break; - } -} - - - -void -computePredCoeff(int method, int order, double *predCoeff, double *delta) -{ - int i, j, k; - double num, denom, prod; - - if( method == TRAPEZOIDAL && order > 2 ) { - printf("\n computePredCoeff: order > 2 for trapezoidal"); - exit( -1 ); - } - for( j = 1; j <= order+1 ; j++ ) { - prod = 1.0; - /* now compute the product */ - for( i = 1; i <= order+1; i++ ) { - /* product loop */ - if( i != j ) { - num = 0.0; - for( k = 0; k < i; k++ ) { - /* first the numerator */ - num += delta[ k ]; - } - if( i > j ) { - /* denom is positive */ - denom = 0.0; - for( k = j; k < i; k++ ) { - denom += delta[ k ]; - } - } - else { - /* i < j */ - denom = 0.0; - for( k = i; k < j; k++ ) { - denom += delta[ k ]; - } - denom = -denom; - } - prod *= num / denom ; - } - } - predCoeff[ j - 1 ] = prod; - } -} - - - -/* main program to check the coefficients -main() -{ - double intCoeff[ 7 ], predCoeff[ 7 ]; - double delta[ 7 ]; - int order = 1; - int i; - - for( i = 0; i <= 6; i++ ) { - delta[ i ] = 1.0; - } - - computeIntegCoeff(TRAPEZOIDAL, order, intCoeff, delta ); - computePredCoeff(TRAPEZOIDAL, order, predCoeff, delta ); - - for(i = 0; i <= order; i++ ) { - printf("\n IntCoeff[ %d ] = %e PredCoeff[ %d ] = %e ", i, intCoeff[ i ], i, predCoeff[ i ] ); - } -} -*/ diff --git a/src/ciderlib/support/integuse.c b/src/ciderlib/support/integuse.c deleted file mode 100644 index 8c38d1755..000000000 --- a/src/ciderlib/support/integuse.c +++ /dev/null @@ -1,303 +0,0 @@ -/********** -Copyright 1991 Regents of the University of California. All rights reserved. -Author: 1987 Kartikeya Mayaram, U. C. Berkeley CAD Group -**********/ - -#include "ngspice/ngspice.h" -#include "ngspice/numglobs.h" -#include "ngspice/numenum.h" -#include "ngspice/gendev.h" -#include "ngspice/cidersupt.h" - -/* function to compute the integrated variables discretization */ - -#define ccap qcap+1 - -double -integrate(double **devStates, TranInfo *info, int qcap ) -{ - double value; - double *coeff = info->intCoeff; - - switch ( info->method ) { - case BDF: - switch( info->order ) { - case 1: - value = coeff[0] * devStates[0][qcap] + - coeff[1] * devStates[1][qcap]; - break; - case 2: - value = coeff[0] * devStates[0][qcap] + - coeff[1] * devStates[1][qcap] + - coeff[2] * devStates[2][qcap]; - break; - case 3: - value = coeff[0] * devStates[0][qcap] + - coeff[1] * devStates[1][qcap] + - coeff[2] * devStates[2][qcap] + - coeff[3] * devStates[3][qcap]; - break; - case 4: - value = coeff[0] * devStates[0][qcap] + - coeff[1] * devStates[1][qcap] + - coeff[2] * devStates[2][qcap] + - coeff[3] * devStates[3][qcap] + - coeff[4] * devStates[4][qcap]; - break; - case 5: - value = coeff[0] * devStates[0][qcap] + - coeff[1] * devStates[1][qcap] + - coeff[2] * devStates[2][qcap] + - coeff[3] * devStates[3][qcap] + - coeff[4] * devStates[4][qcap] + - coeff[5] * devStates[5][qcap]; - break; - case 6: - value = coeff[0] * devStates[0][qcap] + - coeff[1] * devStates[1][qcap] + - coeff[2] * devStates[2][qcap] + - coeff[3] * devStates[3][qcap] + - coeff[4] * devStates[4][qcap] + - coeff[5] * devStates[5][qcap] + - coeff[6] * devStates[6][qcap]; - break; - default: - printf( "\n integration order %d !! STOP \n", info->order ); - exit( 0 ); - } - break; - case TRAPEZOIDAL: - default: - switch( info->order ) { - case 1: - value = coeff[0] * devStates[0][qcap] + - coeff[1] * devStates[1][qcap]; - devStates[0][ccap] = value; - break; - case 2: - value = coeff[0] * devStates[0][qcap] + - coeff[1] * devStates[1][qcap] + - coeff[2] * devStates[1][ccap]; - devStates[0][ccap] = value; - break; - default: - printf( "\n integration order %d !! STOP \n", info->order ); - exit( 0 ); - } - break; - } - - return( value ); -} - -/* function to predict the value of the variables */ - -double -predict(double **devStates, TranInfo *info, int qcap ) -{ - double value; - double *coeff = info->predCoeff; - - switch ( info->method ) { - case BDF: - switch( info->order ) { - case 1: - value = coeff[0] * devStates[1][qcap] + - coeff[1] * devStates[2][qcap]; - break; - case 2: - value = coeff[0] * devStates[1][qcap] + - coeff[1] * devStates[2][qcap] + - coeff[2] * devStates[3][qcap]; - break; - case 3: - value = coeff[0] * devStates[1][qcap] + - coeff[1] * devStates[2][qcap] + - coeff[2] * devStates[3][qcap] + - coeff[3] * devStates[4][qcap]; - break; - case 4: - value = coeff[0] * devStates[1][qcap] + - coeff[1] * devStates[2][qcap] + - coeff[2] * devStates[3][qcap] + - coeff[3] * devStates[4][qcap] + - coeff[4] * devStates[5][qcap]; - break; - case 5: - value = coeff[0] * devStates[1][qcap] + - coeff[1] * devStates[2][qcap] + - coeff[2] * devStates[3][qcap] + - coeff[3] * devStates[4][qcap] + - coeff[4] * devStates[5][qcap] + - coeff[5] * devStates[6][qcap]; - break; - case 6: - value = coeff[0] * devStates[1][qcap] + - coeff[1] * devStates[2][qcap] + - coeff[2] * devStates[3][qcap] + - coeff[3] * devStates[4][qcap] + - coeff[4] * devStates[5][qcap] + - coeff[5] * devStates[6][qcap] + - coeff[6] * devStates[7][qcap]; - break; - default: - printf( "\n prediction order %d !! STOP \n", info->order ); - exit( 0 ); - } - break; - case TRAPEZOIDAL: - default: - switch( info->order ) { - case 1: - value = coeff[0] * devStates[1][qcap] + - coeff[1] * devStates[2][qcap]; - break; - case 2: - value = coeff[0] * devStates[1][qcap] + - coeff[1] * devStates[2][qcap] + - coeff[2] * devStates[3][qcap]; - /* - value = coeff[0] * devStates[1][qcap] + - coeff[1] * devStates[2][qcap] + - coeff[2] * devStates[1][ccap]; - */ - break; - default: - printf( "\n prediction order %d !! STOP \n", info->order ); - exit( 0 ); - } - break; - } - - return( value ); -} - -double -computeLTECoeff( TranInfo *info ) -{ - double *delta = info->delta; - double temp, denom, lteCoeff; - - switch ( info->method ) { - case BDF: - switch( info->order ) { - case 1: - denom = delta[ 0 ] + delta[ 1 ]; - break; - case 2: - denom = delta[ 0 ] + delta[ 1 ] + delta[ 2 ]; - break; - case 3: - denom = delta[ 0 ] + delta[ 1 ] + delta[ 2 ] + - delta[ 3 ]; - break; - case 4: - denom = delta[ 0 ] + delta[ 1 ] + delta[ 2 ] + - delta[ 3 ] + delta[ 4 ]; - break; - case 5: - denom = delta[ 0 ] + delta[ 1 ] + delta[ 2 ] + - delta[ 3 ] + delta[ 4 ] + delta[ 5 ]; - break; - case 6: - denom = delta[ 0 ] + delta[ 1 ] + delta[ 2 ] + - delta[ 3 ] + delta[ 4 ] + delta[ 5 ] + delta[ 6 ]; - break; - default: - printf( "\n integration order %d !! STOP \n", info->order ); - exit( 0 ); - break; - } - break; - case TRAPEZOIDAL: - default: - switch( info->order ) { - case 1: - denom = delta[ 0 ] + delta[ 1 ]; - break; - case 2: - /* - denom = delta[ 0 ] + delta[ 1 ]; - */ - temp = delta[ 0 ] + delta [ 1 ]; - denom = 2.0 * temp * (temp + delta[ 2 ]) / delta[ 0 ]; - break; - default: - printf( "\n integration order %d !! STOP \n", info->order ); - exit( 0 ); - break; - } - break; - } - lteCoeff = delta[ 0 ] / denom; - return( lteCoeff ); -} - -/* function to integrate a linear DAE */ -double -integrateLin(double **devStates, TranInfo *info, int qcap ) -{ - double value; - double *coeff = info->intCoeff; - - switch ( info->method ) { - case BDF: - switch( info->order ) { - case 1: - value = coeff[1] * devStates[1][qcap]; - break; - case 2: - value = coeff[1] * devStates[1][qcap] + - coeff[2] * devStates[2][qcap]; - break; - case 3: - value = coeff[1] * devStates[1][qcap] + - coeff[2] * devStates[2][qcap] + - coeff[3] * devStates[3][qcap]; - break; - case 4: - value = coeff[1] * devStates[1][qcap] + - coeff[2] * devStates[2][qcap] + - coeff[3] * devStates[3][qcap] + - coeff[4] * devStates[4][qcap]; - break; - case 5: - value = coeff[1] * devStates[1][qcap] + - coeff[2] * devStates[2][qcap] + - coeff[3] * devStates[3][qcap] + - coeff[4] * devStates[4][qcap] + - coeff[5] * devStates[5][qcap]; - break; - case 6: - value = coeff[1] * devStates[1][qcap] + - coeff[2] * devStates[2][qcap] + - coeff[3] * devStates[3][qcap] + - coeff[4] * devStates[4][qcap] + - coeff[5] * devStates[5][qcap] + - coeff[6] * devStates[6][qcap]; - break; - default: - printf( "\n integration order %d !! STOP \n", info->order ); - exit( 0 ); - } - break; - case TRAPEZOIDAL: - default: - switch( info->order ) { - case 1: - value = coeff[1] * devStates[1][qcap]; - break; - case 2: - value = coeff[1] * devStates[1][qcap] + - coeff[2] * devStates[1][ccap]; - break; - default: - printf( "\n integration order %d !! STOP \n", info->order ); - exit( 0 ); - } - break; - } - - return( value ); -} - diff --git a/src/ciderlib/support/logfile.c b/src/ciderlib/support/logfile.c deleted file mode 100644 index ba42a1309..000000000 --- a/src/ciderlib/support/logfile.c +++ /dev/null @@ -1,40 +0,0 @@ -/********** -Copyright 1992 Regents of the University of California. All rights reserved. -Author: 1992 David A. Gates, U. C. Berkeley CAD Group -**********/ - -#include "ngspice/ngspice.h" -#include "ngspice/cidersupt.h" - -static char *LogFileName = "cider.log"; -static int LogError = 0; - -void -LOGmakeEntry(char *name, char *description) -{ - int procStamp; - FILE *fpLog; - -#ifdef HAS_GETPID - procStamp = getpid(); -#else - procStamp = 0; -#endif - -/* Want to make sure that multiple processes can access the log file - * without stepping on each other. - */ -#ifdef ultrix - if ((fpLog = fopen(LogFileName, "A")) == NULL) { -#else - if ((fpLog = fopen(LogFileName, "a")) == NULL) { -#endif - if (!LogError) - perror(LogFileName); - LogError = 1; - } else { - fprintf(fpLog, "<%05d> %s: %s\n", procStamp, name, description); - fclose(fpLog); - LogError = 0; - } -} diff --git a/src/ciderlib/support/mater.c b/src/ciderlib/support/mater.c deleted file mode 100644 index 9bfe69767..000000000 --- a/src/ciderlib/support/mater.c +++ /dev/null @@ -1,399 +0,0 @@ -/********** -Copyright 1991 Regents of the University of California. All rights reserved. -Author: 1987 Kartikeya Mayaram, U. C. Berkeley CAD Group -Author: 1991 David A. Gates, U. C. Berkeley CAD Group -**********/ - -#include "ngspice/ngspice.h" -#include "ngspice/numglobs.h" -#include "ngspice/numconst.h" -#include "ngspice/numenum.h" -#include "ngspice/material.h" -#include "ngspice/cidersupt.h" - - -/* - * Set material info values to their defaults. - */ -void -MATLdefaults(MaterialInfo *info) -{ - if ((info->material == OXIDE) || (info->material == INSULATOR)) { - info->type = INSULATOR; - info->eps = EPS_OX; - info->affin = AFFIN_OX; - info->eg0 = EGAP300_OX; - } else if (info->material == NITRIDE) { - info->type = INSULATOR; - info->eps = EPS_NI; - info->affin = AFFIN_NI; - info->eg0 = EGAP300_NI; - } else if (info->material == POLYSILICON) { - info->type = SEMICON; - info->eps = EPS_SI; - info->affin = AFFIN_SI; - info->nc0 = 0.0; - info->nv0 = 0.0; - info->eg0 = EGAP300_SI; - info->dEgDt = DGAPDT_SI; - info->trefBGN = TREF_EG_SI; - info->dEgDn[ELEC] = DGAPDN_N; - info->dEgDn[HOLE] = DGAPDN_P; - info->nrefBGN[ELEC] = NBGN_N; - info->nrefBGN[HOLE] = NBGN_P; - info->tau0[ELEC] = TAU0_N_SI; - info->tau0[HOLE] = TAU0_P_SI; - info->nrefSRH[ELEC] = NSRH_N_SI; - info->nrefSRH[HOLE] = NSRH_P_SI; - info->cAug[ELEC] = C_AUG_N_SI; - info->cAug[HOLE] = C_AUG_P_SI; - info->aRich[ELEC] = A_RICH_N_SI; - info->aRich[HOLE] = A_RICH_P_SI; - info->eDon = E_DON_SI; - info->eAcc = E_ACC_SI; - info->gDon = G_DON_SI; - info->gAcc = G_ACC_SI; - info->concModel = CT; - info->muMax[ELEC][MAJOR] = 0.07 * AR_MUMAX_N; - info->muMin[ELEC][MAJOR] = 0.07 * AR_MUMIN_N; - info->ntRef[ELEC][MAJOR] = AR_NTREF_N; - info->ntExp[ELEC][MAJOR] = AR_NTEXP_N; - info->muMax[HOLE][MAJOR] = 0.07 * AR_MUMAX_P; - info->muMin[HOLE][MAJOR] = 0.07 * AR_MUMIN_P; - info->ntRef[HOLE][MAJOR] = AR_NTREF_P; - info->ntExp[HOLE][MAJOR] = AR_NTEXP_P; - info->muMax[ELEC][MINOR] = 0.07 * UF_MUMAX_N; - info->muMin[ELEC][MINOR] = 0.07 * UF_MUMIN_N; - info->ntRef[ELEC][MINOR] = UF_NTREF_N; - info->ntExp[ELEC][MINOR] = UF_NTEXP_N; - info->muMax[HOLE][MINOR] = 0.07 * UF_MUMAX_P; - info->muMin[HOLE][MINOR] = 0.07 * UF_MUMIN_P; - info->ntRef[HOLE][MINOR] = UF_NTREF_P; - info->ntExp[HOLE][MINOR] = UF_NTEXP_P; - info->fieldModel = CT; - info->vSat[ELEC] = AR_VSAT_N; - info->vSat[HOLE] = AR_VSAT_P; - info->vWarm[ELEC] = SG_VWARM_N; - info->vWarm[HOLE] = SG_VWARM_P; - info->mus[ELEC] = 0.07 * MUS_N; - info->thetaA[ELEC] = THETAA_N; - info->thetaB[ELEC] = THETAB_N; - info->mus[HOLE] = 0.07 * MUS_P; - info->thetaA[HOLE] = THETAA_P; - info->thetaB[HOLE] = THETAB_P; - } else if ((info->material == SILICON) || (info->material == SEMICON)) { - info->type = SEMICON; - info->eps = EPS_SI; - info->affin = AFFIN_SI; - info->nc0 = 0.0; - info->nv0 = 0.0; - info->eg0 = EGAP300_SI; - info->dEgDt = DGAPDT_SI; - info->trefBGN = TREF_EG_SI; - info->dEgDn[ELEC] = DGAPDN_N; - info->dEgDn[HOLE] = DGAPDN_P; - info->nrefBGN[ELEC] = NBGN_N; - info->nrefBGN[HOLE] = NBGN_P; - info->tau0[ELEC] = TAU0_N_SI; - info->tau0[HOLE] = TAU0_P_SI; - info->nrefSRH[ELEC] = NSRH_N_SI; - info->nrefSRH[HOLE] = NSRH_P_SI; - info->cAug[ELEC] = C_AUG_N_SI; - info->cAug[HOLE] = C_AUG_P_SI; - info->aRich[ELEC] = A_RICH_N_SI; - info->aRich[HOLE] = A_RICH_P_SI; - info->eDon = E_DON_SI; - info->eAcc = E_ACC_SI; - info->gDon = G_DON_SI; - info->gAcc = G_ACC_SI; - info->concModel = CT; - info->muMax[ELEC][MAJOR] = AR_MUMAX_N; - info->muMin[ELEC][MAJOR] = AR_MUMIN_N; - info->ntRef[ELEC][MAJOR] = AR_NTREF_N; - info->ntExp[ELEC][MAJOR] = AR_NTEXP_N; - info->muMax[HOLE][MAJOR] = AR_MUMAX_P; - info->muMin[HOLE][MAJOR] = AR_MUMIN_P; - info->ntRef[HOLE][MAJOR] = AR_NTREF_P; - info->ntExp[HOLE][MAJOR] = AR_NTEXP_P; - info->muMax[ELEC][MINOR] = UF_MUMAX_N; - info->muMin[ELEC][MINOR] = UF_MUMIN_N; - info->ntRef[ELEC][MINOR] = UF_NTREF_N; - info->ntExp[ELEC][MINOR] = UF_NTEXP_N; - info->muMax[HOLE][MINOR] = UF_MUMAX_P; - info->muMin[HOLE][MINOR] = UF_MUMIN_P; - info->ntRef[HOLE][MINOR] = UF_NTREF_P; - info->ntExp[HOLE][MINOR] = UF_NTEXP_P; - info->fieldModel = CT; - info->vSat[ELEC] = AR_VSAT_N; - info->vSat[HOLE] = AR_VSAT_P; - info->vWarm[ELEC] = SG_VWARM_N; - info->vWarm[HOLE] = SG_VWARM_P; - info->mus[ELEC] = MUS_N; - info->thetaA[ELEC] = THETAA_N; - info->thetaB[ELEC] = THETAB_N; - info->mus[HOLE] = MUS_P; - info->thetaA[HOLE] = THETAA_P; - info->thetaB[HOLE] = THETAB_P; - } else if (info->material == GAAS) { - info->type = SEMICON; - info->eps = EPS_GA; - info->affin = AFFIN_GA; - info->nc0 = NCV_NOM * pow(M_N_GA, 1.5); - info->nv0 = NCV_NOM * pow(M_P_GA, 1.5); - info->eg0 = EGAP300_GA; - info->dEgDt = DGAPDT_GA; - info->trefBGN = TREF_EG_GA; - info->dEgDn[ELEC] = DGAPDN_N; - info->dEgDn[HOLE] = DGAPDN_P; - info->nrefBGN[ELEC] = NBGN_N; - info->nrefBGN[HOLE] = NBGN_P; - info->tau0[ELEC] = TAU0_N_GA; - info->tau0[HOLE] = TAU0_P_GA; - info->nrefSRH[ELEC] = NSRH_N_GA; - info->nrefSRH[HOLE] = NSRH_P_GA; - info->cAug[ELEC] = C_AUG_N_GA; - info->cAug[HOLE] = C_AUG_P_GA; - info->aRich[ELEC] = A_RICH_N_GA; - info->aRich[HOLE] = A_RICH_P_GA; - info->eDon = E_DON_GA; - info->eAcc = E_ACC_GA; - info->gDon = G_DON_GA; - info->gAcc = G_ACC_GA; - info->concModel = GA; - info->muMax[ELEC][MAJOR] = GA_MUMAX_N; - info->muMin[ELEC][MAJOR] = GA_MUMIN_N; - info->ntRef[ELEC][MAJOR] = GA_NTREF_N; - info->ntExp[ELEC][MAJOR] = GA_NTEXP_N; - info->muMax[HOLE][MAJOR] = GA_MUMAX_P; - info->muMin[HOLE][MAJOR] = GA_MUMIN_P; - info->ntRef[HOLE][MAJOR] = GA_NTREF_P; - info->ntExp[HOLE][MAJOR] = GA_NTEXP_P; - info->muMax[ELEC][MINOR] = GA_MUMAX_N; - info->muMin[ELEC][MINOR] = GA_MUMIN_N; - info->ntRef[ELEC][MINOR] = GA_NTREF_N; - info->ntExp[ELEC][MINOR] = GA_NTEXP_N; - info->muMax[HOLE][MINOR] = GA_MUMAX_P; - info->muMin[HOLE][MINOR] = GA_MUMIN_P; - info->ntRef[HOLE][MINOR] = GA_NTREF_P; - info->ntExp[HOLE][MINOR] = GA_NTEXP_P; - info->fieldModel = GA; - info->vSat[ELEC] = GA_VSAT_N; - info->vSat[HOLE] = GA_VSAT_P; - info->vWarm[ELEC] = GA_VWARM_N; - info->vWarm[HOLE] = GA_VWARM_P; - info->mus[ELEC] = MUS_N; - info->thetaA[ELEC] = THETAA_N; - info->thetaB[ELEC] = THETAB_N; - info->mus[HOLE] = MUS_P; - info->thetaA[HOLE] = THETAA_P; - info->thetaB[HOLE] = THETAB_P; - } -} - -/* - * Compute the temperature-dependent physical parameters of materials - * Normalize physical constants Actual Instance Temperature is passed in thru - * the global var 'Temp' - */ -void -MATLtempDep(MaterialInfo *info, double tnom) -/* double tnom Nominal Parameter Temperature */ -{ - double tmp1; - double relTemp, perRelTemp; - double eg0; - - if (info->type == INSULATOR) { - info->refPsi = RefPsi - (info->affin + 0.5 * info->eg0) / VNorm; - } else if (info->type == SEMICON) { - - /* compute temperature dependent semiconductor parameters */ - relTemp = Temp / tnom; - perRelTemp = 1.0 / relTemp; - tmp1 = pow(relTemp, 1.5); - - /* Bandgap and intrinsic concentration */ - eg0 = info->eg0 + (info->dEgDt * tnom * tnom) / (tnom + info->trefBGN); - info->eg0 = eg0 - (info->dEgDt * Temp * Temp) / (Temp + info->trefBGN); - if (info->nc0 > 0.0) { - info->mass[ELEC] = pow(info->nc0 / NCV_NOM / tmp1, 2.0 / 3.0); - } else { - info->mass[ELEC] = 1.039 + 5.477e-4 * Temp - 2.326e-7 * Temp * Temp; - } - if (info->nv0 > 0.0) { - info->mass[HOLE] = pow(info->nv0 / NCV_NOM / tmp1, 2.0 / 3.0); - } else { - info->mass[HOLE] = 0.262 * log(0.259 * Temp); - } - info->nc0 = NCV_NOM * pow(info->mass[ELEC], 1.5) * tmp1; - info->nv0 = NCV_NOM * pow(info->mass[HOLE], 1.5) * tmp1; - info->ni0 = sqrt(info->nc0) * sqrt(info->nv0) * - exp(-0.5 * info->eg0 / Vt); - info->refPsi = RefPsi - (info->affin - + 0.5 * (info->eg0 + Vt * log(info->nc0 / info->nv0))) / VNorm; - - /* Impurity energies */ - info->eDon /= VNorm; - info->eAcc /= VNorm; - - /* SRH lifetimes */ - tmp1 = sqrt(perRelTemp) * exp(3.8667 * (perRelTemp - 1.0)); - info->tau0[ELEC] *= tmp1 / TNorm; - info->tau0[HOLE] *= tmp1 / TNorm; - - /* Auger recombination coefficients */ - info->cAug[ELEC] *= pow(relTemp, 0.14) * NNorm * NNorm * TNorm; - info->cAug[HOLE] *= pow(relTemp, 0.18) * NNorm * NNorm * TNorm; - - /* Avalanche generation parameters */ - info->aii[ELEC] = AII_N * LNorm; - info->bii[ELEC] = BII_N / ENorm; - info->aii[HOLE] = AII_P * LNorm; - info->bii[HOLE] = BII_P / ENorm; - - /* Effective recombination velocities */ - info->vRich[ELEC] = info->aRich[ELEC] * Temp * Temp / - (CHARGE * info->nc0 * ENorm); - info->vRich[HOLE] = info->aRich[HOLE] * Temp * Temp / - (CHARGE * info->nv0 * ENorm); - - /* Mobility Temperature Dependence */ - MOBtempDep(info, Temp); - - /* Velocity Saturation Parameters */ - info->vSat[ELEC] /= ENorm; - info->vWarm[ELEC] /= ENorm; - info->vSat[HOLE] /= ENorm; - info->vWarm[HOLE] /= ENorm; - - /* Normal Field Mobility Degradation Parameters */ - info->thetaA[ELEC] *= ENorm; - info->thetaB[ELEC] *= ENorm * ENorm; - info->thetaA[HOLE] *= ENorm; - info->thetaB[HOLE] *= ENorm * ENorm; - } -} - -void -printMaterialInfo(MaterialInfo *info) -{ - static const char tabformat[] = "%12s: % .4e %-12s\t"; - static const char newformat[] = "%12s: % .4e %-12s\n"; - - char *name; - - - if (info == NULL) { - fprintf(stderr, "Error: tried to print NIL MaterialInfo\n"); - exit(-1); - } - /* Find material name. */ - switch (info->material) { - case OXIDE: - name = "OXIDE"; - break; - case NITRIDE: - name = "NITRIDE"; - break; - case INSULATOR: - name = "INSULATOR"; - break; - case SILICON: - name = "SILICON"; - break; - case POLYSILICON: - name = "POLYSILICON"; - break; - case GAAS: - name = "GAAS"; - break; - case SEMICON: - name = "SEMICONDUCTOR"; - break; - default: - name = "MATERIAL"; - break; - } - if (info->type == INSULATOR) { - fprintf(stdout, "***** %s PARAMETERS AT %g deg K\n", name, Temp); - fprintf(stdout, "*** Poisson Equation Parameters -\n"); - fprintf(stdout, tabformat, "Eps", info->eps, "F/cm"); - fprintf(stdout, newformat, "Affin", info->affin, "eV"); - fprintf(stdout, tabformat, "Egap", info->eg0, "eV"); - fprintf(stdout, newformat, "PsiB", -info->refPsi * VNorm, "V"); - } else if (info->type == SEMICON) { - fprintf(stdout, "***** %s PARAMETERS AT %g deg K\n", name, Temp); - fprintf(stdout, "*** Poisson Equation\n"); - fprintf(stdout, tabformat, "Eps", info->eps, "F/cm"); - fprintf(stdout, newformat, "Affin", info->affin, "eV"); - fprintf(stdout, tabformat, "Vt", Vt, "V"); - fprintf(stdout, newformat, "Ni", info->ni0, "/cm^3"); - fprintf(stdout, tabformat, "Nc", info->nc0, "/cm^3"); - fprintf(stdout, newformat, "Nv", info->nv0, "/cm^3"); - fprintf(stdout, tabformat, "MnSi", info->mass[ELEC], "*m0 kg"); - fprintf(stdout, newformat, "MpSi", info->mass[HOLE], "*m0 kg"); - fprintf(stdout, tabformat, "Egap", info->eg0, "eV"); - fprintf(stdout, newformat, "PsiB", -info->refPsi * VNorm, "V"); - fprintf(stdout, tabformat, "dEg/dT", info->dEgDt, "eV"); - fprintf(stdout, newformat, "Tref", info->trefBGN, "deg K"); - fprintf(stdout, tabformat, "dEg/dN", info->dEgDn[ELEC], "eV"); - fprintf(stdout, newformat, "Nref", info->nrefBGN[ELEC], "/cm^3"); - fprintf(stdout, tabformat, "dEg/dP", info->dEgDn[HOLE], "eV"); - fprintf(stdout, newformat, "Pref", info->nrefBGN[HOLE], "/cm^3"); - fprintf(stdout, tabformat, "Edon", info->eDon * VNorm, "eV"); - fprintf(stdout, newformat, "Eacc", info->eAcc * VNorm, "eV"); - fprintf(stdout, tabformat, "Gdon", info->gDon, ""); - fprintf(stdout, newformat, "Gacc", info->gAcc, ""); - fprintf(stdout, "*** Generation - Recombination\n"); - fprintf(stdout, tabformat, "Tn0", info->tau0[ELEC] * TNorm, "s"); - fprintf(stdout, newformat, "Tp0", info->tau0[HOLE] * TNorm, "s"); - fprintf(stdout, tabformat, "CnAug", - info->cAug[ELEC] / (NNorm * NNorm * TNorm), "cm^6/s"); - fprintf(stdout, newformat, "CpAug", - info->cAug[HOLE] / (NNorm * NNorm * TNorm), "cm^6/s"); - fprintf(stdout, tabformat, "Aiin", info->aii[ELEC] / LNorm, "/cm"); - fprintf(stdout, newformat, "Aiip", info->aii[HOLE] / LNorm, "/cm"); - fprintf(stdout, tabformat, "Biin", info->bii[ELEC] * ENorm, "V/cm"); - fprintf(stdout, newformat, "Biip", info->bii[HOLE] * ENorm, "V/cm"); - fprintf(stdout, "*** Thermionic Emission\n"); - fprintf(stdout, tabformat, "Arichn", info->aRich[ELEC], "A/cm^2/oK^2"); - fprintf(stdout, newformat, "Arichp", info->aRich[HOLE], "A/cm^2/oK^2"); - fprintf(stdout, tabformat, "Vrichn", info->vRich[ELEC] * ENorm, "cm/s"); - fprintf(stdout, newformat, "Vrichp", info->vRich[HOLE] * ENorm, "cm/s"); - fprintf(stdout, "*** Majority Carrier Mobility\n"); - fprintf(stdout, tabformat, "MunMax", - info->muMax[ELEC][MAJOR], "cm^2/V-s"); - fprintf(stdout, newformat, "MupMax", - info->muMax[HOLE][MAJOR], "cm^2/V-s"); - fprintf(stdout, tabformat, "MunMin", - info->muMin[ELEC][MAJOR], "cm^2/V-s"); - fprintf(stdout, newformat, "MupMin", - info->muMin[HOLE][MAJOR], "cm^2/V-s"); - fprintf(stdout, "*** Minority Carrier Mobility\n"); - fprintf(stdout, tabformat, "MunMax", - info->muMax[ELEC][MINOR], "cm^2/V-s"); - fprintf(stdout, newformat, "MupMax", - info->muMax[HOLE][MINOR], "cm^2/V-s"); - fprintf(stdout, tabformat, "MunMin", - info->muMin[ELEC][MINOR], "cm^2/V-s"); - fprintf(stdout, newformat, "MupMin", - info->muMin[HOLE][MINOR], "cm^2/V-s"); - fprintf(stdout, "*** Surface Mobility\n"); - fprintf(stdout, tabformat, "Muns", info->mus[ELEC], "cm^2/V-s"); - fprintf(stdout, newformat, "Mups", info->mus[HOLE], "cm^2/V-s"); - fprintf(stdout, tabformat, "ThetaAN", info->thetaA[ELEC] / ENorm, "cm/V"); - fprintf(stdout, newformat, "ThetaAP", info->thetaA[HOLE] / ENorm, "cm/V"); - fprintf(stdout, tabformat, "ThetaBN", - info->thetaB[ELEC] / ENorm / ENorm, "cm^2/V^2"); - fprintf(stdout, newformat, "ThetaBP", - info->thetaB[HOLE] / ENorm / ENorm, "cm^2/V^2"); - fprintf(stdout, "*** Velocity Saturation\n"); - fprintf(stdout, tabformat, "VsatN", info->vSat[ELEC] * ENorm, "cm/s"); - fprintf(stdout, newformat, "VsatP", info->vSat[HOLE] * ENorm, "cm/s"); - if (info->fieldModel == SG || info->fieldModel == GA) { - fprintf(stdout, tabformat, "VwarmN", info->vWarm[ELEC] * ENorm, "cm/s"); - fprintf(stdout, newformat, "VwarmP", info->vWarm[HOLE] * ENorm, "cm/s"); - } - } - return; -} diff --git a/src/ciderlib/support/misc.c b/src/ciderlib/support/misc.c deleted file mode 100644 index e96ed0ff0..000000000 --- a/src/ciderlib/support/misc.c +++ /dev/null @@ -1,180 +0,0 @@ -/********** -Copyright 1992 Regents of the University of California. All rights reserved. -Author: 1987 Kartikeya Mayaram, U. C. Berkeley CAD Group -Author: 1992 David A. Gates, U. C. Berkeley CAD Group -**********/ - -/* - * Miscellaneous routines culled from the oned directory so that the twod - * code will run without having to compile the oned code - */ - -#include "ngspice/ngspice.h" -#include "ngspice/numglobs.h" -#include "ngspice/numenum.h" -#include "ngspice/spmatrix.h" -#include "ngspice/cidersupt.h" -#include "ngspice/cpextern.h" - - -/* Used in Solution Projection Calculations */ -double guessNewConc(double conc, double delta) -{ - BOOLEAN acceptable = FALSE; - double fib, newConc, lambda, fibn, fibp; - lambda = 1.0; - fibn = 1.0; - fibp = 1.0; - newConc = 0.0; - for ( ; !acceptable ; ) { - fib = fibp; - fibp = fibn; - fibn += fib; - lambda *= fibp / fibn; - newConc = conc + delta * lambda; - if( newConc > 0.0 ) { - acceptable = TRUE; - } - else { - /* newConc is still negative but fibp and fibn are large */ - if ( (fibp > 1e6) || (fibn > 1e6) ) { - acceptable = TRUE; - newConc = conc; - } - } - } - return( newConc ); -} - -/* Used in Doping Calculation */ -/* compute the concentration at x given an array of data. - * The data is stored in a two-dimensional array x, N(x). - * x is assumed to be in ascending order. given an x - * a search is performed to determine the data points closest - * to it and linear interpolation is performed to generate N(x) - */ - -/* -#define LOGSUPREM -*/ -double lookup(double **dataTable, double x) -{ - double conc=0.0, x0, x1, y0, y1; -#ifdef LOGSUPREM - double lnconc, lny0, lny1; -#endif - int index, numPoints; - BOOLEAN done = FALSE; - - numPoints = (int)dataTable[ 0 ][ 0 ]; - for( index = 2; index <= numPoints && (!done); index++ ) { - x1 = dataTable[ 0 ][ index ]; - /* check if x1 > x */ - if( x1 >= x ) { - /* found an x1 larger than x, so linear interpolate */ - x0 = dataTable[ 0 ][ index - 1 ]; - y0 = dataTable[ 1 ][ index - 1 ]; - y1 = dataTable[ 1 ][ index ]; -#ifdef LOGSUPREM - /* Ignore concentrations below 1.0 */ - if ( ABS(y0) < 1.0 ) - lny0 = 0.0; - else - lny0 = SGN(y0) * log( ABS(y0) ); - if ( ABS(y1) < 1.0 ) - lny1 = 0.0; - else - lny1 = SGN(y0) * log( ABS(y0) ); - lnconc = lny0 + (lny1 - lny0) * (x - x0) / (x1 - x0); - conc = SGN(lnconc) * exp( ABS(lnconc) ); -#else - conc = y0 + (y1 - y0) * (x - x0) / (x1 - x0); -#endif /* LOGSUPREM */ - done = TRUE; - } else { - if( index == numPoints ) { - /* set to concentration of last node - due to roundoff errors */ - conc = dataTable[ 1 ][ numPoints ]; - } - } - } - return ( conc ); -} - -/* Used in admittance calculations */ -/* this function returns TRUE is SOR iteration converges otherwise FALSE */ - -BOOLEAN hasSORConverged(double *oldSolution, double *newSolution, - int numEqns) -{ - BOOLEAN converged = TRUE; - int index; - double xOld, xNew, tol; - double absTol = 1e-12; - double relTol = 1e-3; - for( index = 1 ; index <= numEqns ; index++ ) { - xOld = oldSolution[ index ]; - xNew = newSolution[ index ]; - tol = absTol + relTol * MAX( ABS( xOld ), ABS( xNew )); - if( ABS( xOld - xNew ) > tol ) { - converged = FALSE; - printf("hasSORconverged failed\n"); - break; - } - } - return( converged ); -} - -/* Used to Check Sparse Matrix Errors */ -BOOLEAN -foundError(int error) -{ - BOOLEAN matrixError; - - switch( error ) { - /* Removed for Spice3e1 Compatibility - case spSMALL_PIVOT: - printf( "Warning: LU Decomposition Problem - SMALL PIVOT\n" ); - matrixError = FALSE; - break; - */ - case spPANIC: - printf( "Error: LU Decomposition Failed - PANIC\n" ); - matrixError = TRUE; - break; - case spSINGULAR: - printf( "Error: LU Decomposition Failed - SINGULAR\n" ); - matrixError = TRUE; - break; - /* Removed for Spice3e1 Compatibility - case spZERO_DIAG: - printf( "Error: LU Decomposition Failed - ZERO PIVOT\n" ); - matrixError = TRUE; - break; - */ - case spNO_MEMORY: - printf( "Error: LU Decomposition Failed - NO MEMORY\n" ); - matrixError = TRUE; - break; - default: - matrixError = FALSE; - break; - } - return( matrixError ); -} - -/* Return TRUE if the filetype variable matches the string 's' */ -BOOLEAN compareFiletypeVar(char *s) -{ - char buf[BSIZE_SP]; - - if (cp_getvar("filetype", CP_STRING, buf, sizeof(buf))) { - if (!strcmp(buf, s)) { - return TRUE; - } else { - return FALSE; - } - } else { - return FALSE; - } -} diff --git a/src/ciderlib/support/mobil.c b/src/ciderlib/support/mobil.c deleted file mode 100644 index 7946aac44..000000000 --- a/src/ciderlib/support/mobil.c +++ /dev/null @@ -1,422 +0,0 @@ -/********** -Copyright 1991 Regents of the University of California. All rights reserved. -Author: 1992 David A. Gates, U. C. Berkeley CAD Group -**********/ - -#include "ngspice/ngspice.h" -#include "ngspice/numglobs.h" -#include "ngspice/numconst.h" -#include "ngspice/numenum.h" -#include "ngspice/macros.h" -#include "ngspice/material.h" -#include "ngspice/cidersupt.h" - -void MOBdefaults(MaterialInfo *info , int carrier, int type, - int concmodel, int fieldmodel ) -{ - switch (concmodel) { - case CT: - info->concModel = CT; - if (carrier == ELEC) { - info->muMax[ELEC][type] = CT_MUMAX_N; - info->muMin[ELEC][type] = CT_MUMIN_N; - info->ntRef[ELEC][type] = CT_NTREF_N; - info->ntExp[ELEC][type] = CT_NTEXP_N; - } else { - info->muMax[HOLE][type] = CT_MUMAX_P; - info->muMin[HOLE][type] = CT_MUMIN_P; - info->ntRef[HOLE][type] = CT_NTREF_P; - info->ntExp[HOLE][type] = CT_NTEXP_P; - } - break; - case AR: - info->concModel = AR; - if (carrier == ELEC) { - info->muMax[ELEC][type] = AR_MUMAX_N; - info->muMin[ELEC][type] = AR_MUMIN_N; - info->ntRef[ELEC][type] = AR_NTREF_N; - info->ntExp[ELEC][type] = AR_NTEXP_N; - } else { - info->muMax[HOLE][type] = AR_MUMAX_P; - info->muMin[HOLE][type] = AR_MUMIN_P; - info->ntRef[HOLE][type] = AR_NTREF_P; - info->ntExp[HOLE][type] = AR_NTEXP_P; - } - break; - case UF: - info->concModel = UF; - if (carrier == ELEC) { - info->muMax[ELEC][type] = UF_MUMAX_N; - info->muMin[ELEC][type] = UF_MUMIN_N; - info->ntRef[ELEC][type] = UF_NTREF_N; - info->ntExp[ELEC][type] = UF_NTEXP_N; - } else { - info->muMax[HOLE][type] = UF_MUMAX_P; - info->muMin[HOLE][type] = UF_MUMIN_P; - info->ntRef[HOLE][type] = UF_NTREF_P; - info->ntExp[HOLE][type] = UF_NTEXP_P; - } - break; - case GA: - info->concModel = GA; - if (carrier == ELEC) { - info->muMax[ELEC][type] = GA_MUMAX_N; - info->muMin[ELEC][type] = GA_MUMIN_N; - info->ntRef[ELEC][type] = GA_NTREF_N; - info->ntExp[ELEC][type] = GA_NTEXP_N; - } else { - info->muMax[HOLE][type] = GA_MUMAX_P; - info->muMin[HOLE][type] = GA_MUMIN_P; - info->ntRef[HOLE][type] = GA_NTREF_P; - info->ntExp[HOLE][type] = GA_NTEXP_P; - } - break; - case SG: - default: - info->concModel = SG; - if (carrier == ELEC) { - info->muMax[ELEC][type] = SG_MUMAX_N; - info->muMin[ELEC][type] = SG_MUMIN_N; - info->ntRef[ELEC][type] = SG_NTREF_N; - info->ntExp[ELEC][type] = SG_NTEXP_N; - } else { - info->muMax[HOLE][type] = SG_MUMAX_P; - info->muMin[HOLE][type] = SG_MUMIN_P; - info->ntRef[HOLE][type] = SG_NTREF_P; - info->ntExp[HOLE][type] = SG_NTEXP_P; - } - break; - } - if (type == MAJOR) { - switch (fieldmodel) { - case CT: - info->fieldModel = CT; - if (carrier == ELEC) { - info->vSat[ELEC] = CT_VSAT_N; - } else { - info->vSat[HOLE] = CT_VSAT_P; - } - break; - case AR: - case UF: - info->fieldModel = AR; - if (carrier == ELEC) { - info->vSat[ELEC] = AR_VSAT_N; - } else { - info->vSat[HOLE] = AR_VSAT_P; - } - break; - case GA: - info->fieldModel = GA; - if (carrier == ELEC) { - info->vSat[ELEC] = GA_VSAT_N; - info->vWarm[ELEC] = GA_VWARM_N; - } else { - info->vSat[HOLE] = GA_VSAT_P; - info->vWarm[HOLE] = GA_VWARM_P; - } - break; - case SG: - default: - info->fieldModel = SG; - if (carrier == ELEC) { - info->vSat[ELEC] = SG_VSAT_N; - info->vWarm[ELEC] = SG_VWARM_N; - } else { - info->vSat[HOLE] = SG_VSAT_P; - info->vWarm[HOLE] = SG_VWARM_P; - } - break; - } - } -} - -void -MOBtempDep (MaterialInfo *info, double temp) -{ - double relTemp = temp / 300.0; - double factor, muMin, mu0; - - /* Modify if necessary. */ - if (TempDepMobility) - { - /* Do concentration dependence parameters */ - muMin = info->muMin[ELEC][MAJOR]; - mu0 = info->muMax[ELEC][MAJOR] - muMin; - factor = pow(relTemp, TD_EXPMUMIN_N); - muMin *= factor; - factor = pow(relTemp, TD_EXPMUMAX_N); - mu0 *= factor; - info->muMin[ELEC][MAJOR] = muMin; - info->muMax[ELEC][MAJOR] = mu0 + muMin; - factor = pow(relTemp, TD_EXPNTREF_N); - info->ntRef[ELEC][MAJOR] *= factor; - factor = pow(relTemp, TD_EXPNTEXP_N); - info->ntExp[ELEC][MAJOR] *= factor; - - muMin = info->muMin[ELEC][MINOR]; - mu0 = info->muMax[ELEC][MINOR] - muMin; - factor = pow(relTemp, TD_EXPMUMIN_N); - muMin *= factor; - factor = pow(relTemp, TD_EXPMUMAX_N); - mu0 *= factor; - info->muMin[ELEC][MINOR] = muMin; - info->muMax[ELEC][MINOR] = mu0 + muMin; - factor = pow(relTemp, TD_EXPNTREF_N); - info->ntRef[ELEC][MINOR] *= factor; - factor = pow(relTemp, TD_EXPNTEXP_N); - info->ntExp[ELEC][MINOR] *= factor; - - muMin = info->muMin[HOLE][MAJOR]; - mu0 = info->muMax[HOLE][MAJOR] - muMin; - factor = pow(relTemp, TD_EXPMUMIN_P); - muMin *= factor; - factor = pow(relTemp, TD_EXPMUMAX_P); - mu0 *= factor; - info->muMin[HOLE][MAJOR] = muMin; - info->muMax[HOLE][MAJOR] = mu0 + muMin; - factor = pow(relTemp, TD_EXPNTREF_P); - info->ntRef[HOLE][MAJOR] *= factor; - factor = pow(relTemp, TD_EXPNTEXP_P); - info->ntExp[HOLE][MAJOR] *= factor; - - muMin = info->muMin[HOLE][MINOR]; - mu0 = info->muMax[HOLE][MINOR] - muMin; - factor = pow(relTemp, TD_EXPMUMIN_P); - muMin *= factor; - factor = pow(relTemp, TD_EXPMUMAX_P); - mu0 *= factor; - info->muMin[HOLE][MINOR] = muMin; - info->muMax[HOLE][MINOR] = mu0 + muMin; - factor = pow(relTemp, TD_EXPNTREF_P); - info->ntRef[HOLE][MINOR] *= factor; - factor = pow(relTemp, TD_EXPNTEXP_P); - info->ntExp[HOLE][MINOR] *= factor; - - /* Modify field dependence parameters */ - /* Assume warm carrier reference velocity has same temperature dep. */ - factor = sqrt( tanh( TD_TREFVS_N / Temp ) ); - info->vSat[ELEC] *= factor; - info->vWarm[ELEC] *= factor; - factor = sqrt( tanh( TD_TREFVS_P / Temp ) ); - info->vSat[HOLE] *= factor; - info->vWarm[HOLE] *= factor; - } -} - -void -MOBconcDep (MaterialInfo *info, double conc, double *pMun, double *pMup) -{ - double s; - - /* We have to check sign of conc even when concentration dependence - * is not used because it affects whether carriers are majority or - * minority carriers. Ideally, the minority/majority carrier models - * should agree at 0.0 concentration, but often they'll be inconsistent. - */ - - if (conc >= 0.0) - { /* N type */ - if (ConcDepMobility) - { - switch (info->concModel) - { - case CT: - case AR: - case UF: - case GA: - *pMun = info->muMin[ELEC][MAJOR] + - (info->muMax[ELEC][MAJOR] - info->muMin[ELEC][MAJOR]) / - (1.0 + pow(conc / info->ntRef[ELEC][MAJOR], - info->ntExp[ELEC][MAJOR])); - - *pMup = info->muMin[HOLE][MINOR] + - (info->muMax[HOLE][MINOR] - info->muMin[HOLE][MINOR]) / - (1.0 + pow(conc / info->ntRef[HOLE][MINOR], - info->ntExp[HOLE][MINOR])); - break; - case SG: - default: - s = info->muMax[ELEC][MAJOR] / info->muMin[ELEC][MAJOR]; - s = pow(s, 1.0 / info->ntExp[ELEC][MAJOR]) - 1; - *pMun = info->muMax[ELEC][MAJOR] / - pow(1.0 + conc / (conc / s + info->ntRef[ELEC][MAJOR]), - info->ntExp[ELEC][MAJOR]); - - s = info->muMax[HOLE][MINOR] / info->muMin[HOLE][MINOR]; - s = pow(s, 1.0 / info->ntExp[HOLE][MINOR]) - 1; - *pMup = info->muMax[HOLE][MINOR] / - pow(1.0 + conc / (conc / s + info->ntRef[HOLE][MINOR]), - info->ntExp[HOLE][MINOR]); - break; - } - } - else - { - *pMun = info->muMax[ELEC][MAJOR]; - *pMup = info->muMax[HOLE][MINOR]; - } - } - else - { /* P type */ - if (ConcDepMobility) - { - conc = -conc; /* Take absolute value. */ - switch (info->concModel) - { - case CT: - case AR: - case UF: - case GA: - *pMun = info->muMin[ELEC][MINOR] + - (info->muMax[ELEC][MINOR] - info->muMin[ELEC][MINOR]) / - (1.0 + pow(conc / info->ntRef[ELEC][MINOR], - info->ntExp[ELEC][MINOR])); - - *pMup = info->muMin[HOLE][MAJOR] + - (info->muMax[HOLE][MAJOR] - info->muMin[HOLE][MAJOR]) / - (1.0 + pow(conc / info->ntRef[HOLE][MAJOR], - info->ntExp[HOLE][MAJOR])); - break; - case SG: - default: - s = info->muMax[ELEC][MINOR] / info->muMin[ELEC][MINOR]; - s = pow(s, 1.0 / info->ntExp[ELEC][MINOR]) - 1; - *pMun = info->muMax[ELEC][MINOR] / - pow(1.0 + conc / (conc / s + info->ntRef[ELEC][MINOR]), - info->ntExp[ELEC][MINOR]); - - s = info->muMax[HOLE][MAJOR] / info->muMin[HOLE][MAJOR]; - s = pow(s, 1.0 / info->ntExp[HOLE][MAJOR]) - 1; - *pMup = info->muMax[HOLE][MAJOR] / - pow(1.0 + conc / (conc / s + info->ntRef[HOLE][MAJOR]), - info->ntExp[HOLE][MAJOR]); - break; - } - } - else - { - *pMun = info->muMax[ELEC][MINOR]; - *pMup = info->muMax[HOLE][MAJOR]; - } - } - return; -} - - -void -MOBfieldDep (MaterialInfo *info, int carrier, double field, double *pMu, - double *pDMu) -{ - double eLateral, mu; - double sgnL; - double temp1, temp2, temp3, temp4, temp5, temp6; - double dMuDEl; /* Lateral Field Derivative */ - - /* Quick check to make sure we really belong here. */ - if (!FieldDepMobility) /* XXX Global */ - return; - - sgnL = SGN (field); - eLateral = ABS (field); - mu = *pMu; /* Grab temp. and conc.-dep. mobility */ - - - if (carrier == ELEC) - { - switch (info->fieldModel) - { - case CT: - case AR: - case UF: - temp1 = mu / info->vSat[ELEC]; - temp2 = temp1 * eLateral; - temp3 = 1.0 / (1.0 + temp2 * temp2); - mu *= sqrt(temp3); - dMuDEl = -sgnL * mu * temp3 * temp2 * temp1; - - - break; - case GA: - temp1 = info->vSat[ELEC] / info->vWarm[ELEC]; /* Vsat / Vwarm */ - temp2 = mu / info->vWarm[ELEC]; - temp3 = temp2 * eLateral; /* Vdrift / Vwarm */ - temp4 = temp3 * temp3 * temp3; - temp5 = 1.0 + temp1 * temp4; - temp6 = 1.0 / (1.0 + temp3 * temp4); - mu *= temp5 * temp6; - dMuDEl = - sgnL * mu * temp2 * - (4.0 * temp4 * temp6 - 3.0 * temp1 * temp3 * temp3 / temp5 ); - - /* - dMuDEl = 0.0; - */ - break; - case SG: - default: - temp1 = mu / info->vSat[ELEC]; - temp2 = temp1 * eLateral;/* Vdrift / Vsat */ - temp3 = mu / info->vWarm[ELEC]; - temp4 = temp3 * eLateral;/* Vdrift / Vwarm */ - temp5 = temp4 / (temp4 + SG_FIT_N); - temp6 = 1.0 / (1.0 + temp4 * temp5 + temp2 * temp2); - mu *= sqrt(temp6); - dMuDEl = -sgnL * 0.5 * mu * temp6 * - (temp5 * (2.0 - temp5) * temp3 + (2.0 * temp2 * temp1)); - - - break; - } - } - else - { /* Hole Mobility */ - switch (info->fieldModel) - { - case CT: - case AR: - case UF: - temp1 = mu / info->vSat[HOLE]; - temp2 = temp1 * eLateral; - temp3 = 1.0 / (1.0 + temp2); - mu *= temp3; - dMuDEl = -sgnL * mu * temp3 * temp1; - - break; - case GA: - temp1 = info->vSat[HOLE] / info->vWarm[HOLE]; /* Vsat / Vwarm */ - temp2 = mu / info->vWarm[HOLE]; - temp3 = temp2 * eLateral; /* Vdrift / Vwarm */ - temp4 = temp3 * temp3 * temp3; - temp5 = 1.0 + temp1 * temp4; - temp6 = 1.0 / (1.0 + temp3 * temp4); - mu *= temp5 * temp6; - dMuDEl = - sgnL * mu * temp2 * - (4.0 * temp4 * temp6 - 3.0 * temp1 * temp3 * temp3 / temp5 ); - - - /* - dMuDEl = 0.0; - */ - break; - case SG: - default: - temp1 = mu / info->vSat[HOLE]; - temp2 = temp1 * eLateral;/* Vdrift / Vsat */ - temp3 = mu / info->vWarm[HOLE]; - temp4 = temp3 * eLateral;/* Vdrift / Vwarm */ - temp5 = temp4 / (temp4 + SG_FIT_P); - temp6 = 1.0 / (1.0 + temp4 * temp5 + temp2 * temp2); - mu *= sqrt(temp6); - dMuDEl = -sgnL * 0.5 * mu * temp6 * - (temp5 * (2.0 - temp5) * temp3 + (2.0 * temp2 * temp1)); - - - break; - } - } - - *pMu = mu; - *pDMu = dMuDEl; - - return; -} diff --git a/src/ciderlib/support/readme b/src/ciderlib/support/readme deleted file mode 100644 index 9bdf2f1d1..000000000 --- a/src/ciderlib/support/readme +++ /dev/null @@ -1,9 +0,0 @@ -Directory: support ------------------- -This directory contains the files that support the device simulators and -their interfaces to the circuit simulators. They fall into four basic -areas: - 1. Numerical algorithms: integration, accuracy limits, special functions - 2. Semiconductor device physics: material properties, recombination, mobility - 3. File access for input: doping profiles from SUPREMIII, saved states - 4. Miscellaneous: diagnstic I/O, string routines diff --git a/src/ciderlib/support/recomb.c b/src/ciderlib/support/recomb.c deleted file mode 100644 index 279e6c012..000000000 --- a/src/ciderlib/support/recomb.c +++ /dev/null @@ -1,51 +0,0 @@ -/********** -Copyright 1991 Regents of the University of California. All rights reserved. -Author: 1987 Kartikeya Mayaram, U. C. Berkeley CAD Group -**********/ - -#include "ngspice/ngspice.h" -#include "ngspice/numglobs.h" -#include "ngspice/cidersupt.h" - -/* - * function recomb calculates the recobination rates and the - * derivatives with respect to n and p. SRH recombination is - * always assumed. Auger recombination is specified by the flag - * 'Auger' which by default is false. - */ - -void -recomb (double ni, double pi, double tn, double tp, double cn, double cp, - double nie, double *pUnet, double *pDuDn, double *pDuDp) -{ - double uSrh, uSrhNum, uSrhDen, perUdenSq, duSrhDn, duSrhDp; - double cncp, uAug, duAugDn, duAugDp, uNet, duDn, duDp; - - uSrhNum = ni * pi - nie * nie; - uSrhDen = tp * (ni + nie) + tn * (pi + nie); - uSrh = uSrhNum / uSrhDen; - perUdenSq = 1.0 / (uSrhDen * uSrhDen); - duSrhDn = (pi * uSrhDen - uSrhNum * tp) * perUdenSq; - duSrhDp = (ni * uSrhDen - uSrhNum * tn) * perUdenSq; - - - if (Auger && uSrhNum >= 0.0) { /* XXX Auger Global */ - cncp = cn * ni + cp * pi; - uAug = cncp * uSrhNum; - duAugDn = cn * uSrhNum + cncp * pi; - duAugDp = cp * uSrhNum + cncp * ni; - uNet = uSrh + uAug; - duDn = duSrhDn + duAugDn; - duDp = duSrhDp + duAugDp; - } - else { - uNet = uSrh; - duDn = duSrhDn; - duDp = duSrhDp; - } - -/* return uNet duDn duDp */ - *pUnet = uNet; - *pDuDn = duDn; - *pDuDp = duDp; -} diff --git a/src/ciderlib/support/suprem.c b/src/ciderlib/support/suprem.c deleted file mode 100644 index 9ad72ab58..000000000 --- a/src/ciderlib/support/suprem.c +++ /dev/null @@ -1,282 +0,0 @@ -/********** -Copyright 1991 Regents of the University of California. All rights reserved. -Author: 1987 Kartikeya Mayaram, U. C. Berkeley CAD Group -Author: 1991 David A. Gates, U. C. Berkeley CAD Group -**********/ - -/* Functions to read SUPREM (Binary or Ascii) & ASCII input files */ -#include -#include - -#include "ngspice/cidersupt.h" -#include "ngspice/cpextern.h" -#include "ngspice/ngspice.h" -#include "ngspice/profile.h" - - -static void free_profile_data(double **p); -static double **alloc_profile_data(size_t n); - - -int readAsciiData(const char *fileName, int impType, DOPtable **ppTable) -{ - int xrc = 0; - FILE *fpAscii = (FILE *) NULL; - int index; - double x, y; - int numPoints; - DOPtable *tmpTable = (DOPtable *) NULL; - double **profileData = (double **) NULL; - double sign; - - /* Open Input File */ - if ((fpAscii = fopen( fileName, "r" )) == NULL) { - (void) fprintf(cp_err, "unable to open SUPREM file \"%s\": %s\n", - fileName, strerror(errno)); - xrc = -1; - return xrc; /* return immediately, nothing to free */ - } - - /* Get sign of concentrations */ - if (impType == IMP_P_TYPE) { - sign = -1.0; - } else { - sign = 1.0; - } - - /* read the number of points */ - if (fscanf(fpAscii, "%d", &numPoints) != 1) { - (void) fprintf(cp_err, "unable to read point count " - "from SUPREM file \"%s\"\n", - fileName); - xrc = -1; - goto EXITPOINT; - } - - - /* allocate 2-D array to read in data of x-coordinate and N(x) */ - profileData = alloc_profile_data((size_t) numPoints + 1); - - /* the number of points is stored as profileData[0][0] */ - profileData[0][0] = numPoints; - - for (index = 1; index <= numPoints; index++ ) { - if (fscanf(fpAscii, "%lf %lf ", &x, &y) != 2) { - (void) fprintf(cp_err, "unable to read point %d" - "from SUPREM file \"%s\"\n", - index + 1, fileName); - xrc = -1; - goto EXITPOINT; - } - profileData[0][index] = x; - profileData[1][index] = sign * ABS(y); - } /* end of loop over points */ - - /* Now create a new lookup table */ - XCALLOC(tmpTable, DOPtable, 1); - if (*ppTable == NULL) { - /* First Entry */ - tmpTable->impId = 1; - tmpTable->dopData = profileData; - tmpTable->next = NULL; - *ppTable = tmpTable; - } - else { - tmpTable->impId = (*ppTable)->impId + 1; - tmpTable->dopData = profileData; - tmpTable->next = *ppTable; - *ppTable = tmpTable; - } - - /* for debugging print the data that has been just read */ - /* - for( index = 1; index <= numPoints; index++ ) { - printf("\n %e %e", profileData[ 0 ][ index ], profileData[ 1 ][ index ]); - } - */ -EXITPOINT: - if (fpAscii != (FILE *) NULL) { /* close data file if open */ - fclose(fpAscii); - } - - /* Free resources on error */ - if (xrc != 0) { - free_profile_data(profileData); - free(tmpTable); - } - - return xrc; -} /* end of function readAsciiData */ - - - -/* interface routine based on notes provided by Steve Hansen of Stanford */ - -/* - * The material types are: - * 1 = single crystal silicon - * 2 = silicon dioxide - * 3 = poly-crystalline silicon - * 4 = silicon nitride - * 5 = aluminum - - * The impurity types are: - * 1 = boron - * 2 = phosphorus - * 3 = arsenic - * 4 = antimony - - * The crystalline orientations are: - * 1 = <111> - * 2 = <100> - * 3 = <110> - - * The layer thinkness, poly-crystalline grain size, node spacing and - * distance from the surface are all in microns. - - * The integrated dopant concentration and the phophorus implant dose are - * in atoms per square centimeter. - - * The interior polycrystalline grain concentration and the impurity - * concentrations at each node are in atoms per cubic centimeter. - */ - - -int readSupremData(const char *fileName, int fileType, int impType, - DOPtable **ppTable) -{ - int xrc = 0; -#define MAX_GRID 500 - float x[ MAX_GRID ], conc[ MAX_GRID ]; - - int index; - DOPtable *tmpTable = (DOPtable *) NULL; - double **profileData = (double **) NULL; - int numNodes; - - /* read the Suprem data file */ - if ( fileType == 0 ) { /* BINARY FILE */ - xrc = SUPbinRead(fileName, x, conc, &impType, &numNodes); - } - else { - xrc = SUPascRead( fileName, x, conc, &impType, &numNodes ); - } - if (xrc != 0) { - (void) fprintf(cp_err, "Data input failed.\n"); - xrc = -1; - return xrc; /* return immediately, nothing to free */ - } - - /* allocate 2-D array to read in data of x-coordinate and N(x) */ - profileData = alloc_profile_data((size_t) numNodes + 1); - - /* the number of points is stored as profileData[0][0] */ - profileData[0][0] = numNodes; - - for( index = 1; index <= numNodes; index++ ) { - profileData[ 0 ][ index ] = x[ index ]; - profileData[ 1 ][ index ] = conc[ index ]; - } - - /* Now create a new lookup table */ - XCALLOC(tmpTable, DOPtable, 1); - if ( *ppTable == NULL ) { - /* First Entry */ - tmpTable->impId = 1; - tmpTable->dopData = profileData; - tmpTable->next = NULL; - *ppTable = tmpTable; - } else { - tmpTable->impId = (*ppTable)->impId + 1; - tmpTable->dopData = profileData; - tmpTable->next = *ppTable; - *ppTable = tmpTable; - } - - /* for debugging print the data that has been just read */ - /* - for( index = 1; index <= numNodes; index++ ) { - printf("%e %e\n", profileData[ 0 ][ index ], profileData[ 1 ][ index ]); - } - */ - - if (xrc != 0) { - free_profile_data(profileData); - free(tmpTable); - } - return xrc; -} /* end of function readSupremData */ - - - -/* Allocate a profile data */ -static double **alloc_profile_data(size_t n) -{ - double **p; - XCALLOC(p, double *, 2); - XCALLOC(p[0], double, n); - XCALLOC(p[1], double, n); - return p; -} /* end of function alloc_profile_data */ - - - -/* Free a profile data */ -static void free_profile_data(double **p) -{ - /* Immediate exit if no allocation */ - if (p == (double **) NULL) { - return; - } - - free(p[0]); - free(p[1]); - free(p); -} /* end of function alloc_profile_data */ - - - - - - - - -/* main program to debug readSupremData */ - -/* -main(ac, av) -char **av; -{ - void readSupremData(); - DOPtable *supTable = NULL; - double **supInput; - int numPoints, index; - char *impName; - int impType; - - switch (ac) { - case 1: - printf( "Usage: %s suprem-file ...\n", av[0] ); - exit(-1); - break; - default: - break; - } - - for ( index = 1; index < ac; index++ ) { - for ( impType=1; impType <= 4; impType++ ) { - readSupremData( av[index], 1, impType, &supTable ); - } - } - for ( ; supTable ISNOT NULL; supTable = supTable->next ) { - fprintf( stdout, "\"Impurity Number: %d\n", supTable->impId ); - supInput = supTable->dopData; - numPoints = supInput[0][0]; - for( index = 1; index <= numPoints; index++ ) { - printf("%e\t%e\n", - supInput[ 0 ][ index ], ABS(supInput[ 1 ][ index ]) + 1e-20 ); - } - fprintf( stdout, "\n" ); - } -} -*/ diff --git a/src/ciderlib/support/suprmitf.c b/src/ciderlib/support/suprmitf.c deleted file mode 100644 index 9b9d1afa2..000000000 --- a/src/ciderlib/support/suprmitf.c +++ /dev/null @@ -1,469 +0,0 @@ -/********** -Copyright 1991 Regents of the University of California. All rights reserved. -Author: 1991 David A. Gates, U. C. Berkeley CAD Group -**********/ - -/* - * Translated FORTRAN subroutine to read the SUPREM-3 binary file - * the data is read and stored in two arrays x and conc - */ - -#include -#include - -#include "ngspice/cidersupt.h" -#include "ngspice/cpextern.h" -#include "ngspice/ngspice.h" - -#define MAXMAT 10 -#define MAXIMP 4 -#define MAXLAYER 10 -#define MAXGRID 500 - -#define GFREAD( fp, ptr, type, num )\ - if (num && (fread( ptr, sizeof(type), (size_t) num,\ - fp ) != (size_t) num)) {\ - xrc = -1;\ - goto EXITPOINT;\ - } - -#define DEBUG if (0) - -int SUPbinRead(const char *inFile, float *x, float *conc, int *impId, - int *numNod) -{ - int xrc = 0; - int idata, recordMark; - int ldata; - int i, j; - float rdata; - char cdata[21]; - int numLay, numImp, numGrid; - int impTyp[4], matTyp[10], topNod[10], siIndex, offset; - float xStart; - float layerTh[10]; - float con[500]; - FILE *fpSuprem = (FILE *) NULL; - - /* Clear Concentration Array */ - for ( i=0; i < MAXGRID; i++ ) { - conc[i] = 0.0; - } - - /* Open Input File */ - if ((fpSuprem = fopen( inFile, "r" )) == NULL) { - (void) fprintf(cp_err, "Unable to read file \"%s\": %s.\n", - inFile, strerror(errno)); - xrc = -1; - goto EXITPOINT; - } - -/* - * The first record contains the number of layers (I4), the number of - * impurities (I4), and the number of nodes (I4) present in the structure. - */ - GFREAD( fpSuprem, &recordMark, int, 1 ); - GFREAD( fpSuprem, &numLay, int, 1 ); - GFREAD( fpSuprem, &numImp, int, 1 ); - GFREAD( fpSuprem, &numGrid, int, 1 ); - DEBUG fprintf(stderr,"rec 1: %d %d %d\n", numLay, numImp, numGrid); - GFREAD( fpSuprem, &recordMark, int, 1 ); - -/* - * The second record contains, for each layer, the material type (I4), the - * layer thickness (R4), and the pointer to the top node of the layer (I4). - */ - GFREAD( fpSuprem, &recordMark, int, 1 ); - for ( i=0; i < numLay; i++ ) { - GFREAD( fpSuprem, &matTyp[i], int, 1 ); - GFREAD( fpSuprem, &layerTh[i], float, 1 ); - GFREAD( fpSuprem, &topNod[i], int, 1 ); - DEBUG fprintf(stderr,"rec 2: %d %f %d\n", matTyp[i], layerTh[i], topNod[i] ); - } - GFREAD( fpSuprem, &recordMark, int, 1 ); - -/* - * The third record contains, for each layer, the material name (A20). - */ - /* Put a null at the end */ - cdata[20] = '\0'; - GFREAD( fpSuprem, &recordMark, int, 1 ); - for ( i=0; i < numLay; i++ ) { - GFREAD( fpSuprem, cdata, char, 20 ); - DEBUG fprintf(stderr,"rec 3: %s\n", cdata ); - } - GFREAD( fpSuprem, &recordMark, int, 1 ); - -/* - * The fourth record contains, for each layer, the crystalline orientation - * (I4), and the poly-crystalline grain size in microns (R4). - */ - GFREAD( fpSuprem, &recordMark, int, 1 ); - for ( i=0; i < numLay; i++ ) { - GFREAD( fpSuprem, &idata, int, 1 ); - GFREAD( fpSuprem, &rdata, float, 1 ); - DEBUG fprintf(stderr,"rec 4: %d %f\n", idata, rdata ); - } - GFREAD( fpSuprem, &recordMark, int, 1 ); - -/* - * The fifth record contains, for each impurity, the type of impurity (I4). - */ - GFREAD( fpSuprem, &recordMark, int, 1 ); - for ( i=0; i < numImp; i++ ) { - GFREAD( fpSuprem, &impTyp[i], int, 1 ); - DEBUG fprintf(stderr,"rec 5: %d\n", impTyp[i] ); - } - GFREAD( fpSuprem, &recordMark, int, 1 ); - -/* - * The sixth record contains, for each impurity, the impurity name (A20). - */ - GFREAD( fpSuprem, &recordMark, int, 1 ); - for ( i=0; i < numImp; i++ ) { - GFREAD( fpSuprem, cdata, char, 20 ); - DEBUG fprintf(stderr,"rec 6: %s\n", cdata ); - } - GFREAD( fpSuprem, &recordMark, int, 1 ); - -/* - * The seventh record contains, for each layer by each impurity, the - * integrated dopant (R4), and the interior concentration of the - * polysilicon grains (R4). - */ - GFREAD( fpSuprem, &recordMark, int, 1 ); - for ( j=0; j < numLay; j++ ) { - for ( i=0; i < numImp; i++ ) { - GFREAD( fpSuprem, &rdata, float, 1 ); - DEBUG fprintf(stderr,"rec 7: %e", rdata ); - GFREAD( fpSuprem, &rdata, float, 1 ); - DEBUG fprintf(stderr," %e\n", rdata ); - } - } - GFREAD( fpSuprem, &recordMark, int, 1 ); - -/* - * The eighth record contains, for each node in the structure, the distance - * to the next deepest node (R4). - */ - GFREAD( fpSuprem, &recordMark, int, 1 ); - for ( i=0; i < numGrid; i++ ) { - GFREAD( fpSuprem, &rdata, float, 1 ); - } - DEBUG fprintf(stderr,"rec 8: %f\n", rdata ); - GFREAD( fpSuprem, &recordMark, int, 1 ); - -/* - * The ninth record contains, for each node in the structure, the distance - * from the surface (R4). - */ - GFREAD( fpSuprem, &recordMark, int, 1 ); - GFREAD( fpSuprem, &x[1], float, numGrid ); - DEBUG fprintf(stderr,"rec 9: %f\n", x[1] ); - GFREAD( fpSuprem, &recordMark, int, 1 ); - -/* - * Next, for each impurity there is a record containing the impurity's - * chemical concentration at each node (R4) and a record containing the - * impurity's active concentration at each node (R4). - */ - - for ( j=0; j < numImp; j++ ) { -/* chemical concentration - not required */ - GFREAD( fpSuprem, &recordMark, int, 1 ); - GFREAD( fpSuprem, &con[1], float, numGrid ); - DEBUG fprintf(stderr,"rec 10: %e\n", con[1] ); - GFREAD( fpSuprem, &recordMark, int, 1 ); - -/* store active concentration */ - GFREAD( fpSuprem, &recordMark, int, 1 ); - GFREAD( fpSuprem, &con[1], float, numGrid ); - DEBUG fprintf(stderr,"rec 11: %e\n", con[1] ); - GFREAD( fpSuprem, &recordMark, int, 1 ); - - if (impTyp[j] == *impId) { -/*...Boron...*/ - if (impTyp[j] == 1) { - for ( i=1; i <= numGrid; i++ ) conc[i] = - con[i]; - } else { -/*...All Other Impurities: P, As, Sb ...*/ - for ( i=1; i <= numGrid; i++ ) conc[i] = con[i]; - } - } - } - -/* - * The last record in the file contains some random stuff that might be - * useful to some people, the temperature in degrees Kelvin of the last - * diffusion step (R4), the phosphorus implant dose (R4), the arsenic - * implant flag (L4). - */ - GFREAD( fpSuprem, &recordMark, int, 1 ); - GFREAD( fpSuprem, &rdata, float, 1 ); - DEBUG fprintf(stderr,"rec 12: %f", rdata ); - GFREAD( fpSuprem, &rdata, float, 1 ); - DEBUG fprintf(stderr," %e", rdata ); - GFREAD( fpSuprem, &ldata, int, 1 ); - DEBUG fprintf(stderr," %d\n", ldata ); - GFREAD( fpSuprem, &recordMark, int, 1 ); - - if (fclose(fpSuprem) != 0) { - (void) fprintf(cp_err, "Unable to close file \"%s\": %s.\n", - inFile, strerror(errno)); - xrc = -1; - goto EXITPOINT; - } - fpSuprem = (FILE *) NULL; - - /* shift silicon layer to beginning of array */ - for (j = numLay; --j >= 0; ) { - if (matTyp[j] == 1) { - break; - } - } - - if (j < 0) { - (void) fprintf(cp_err, "internal error in %s!\n", __FUNCTION__); - xrc = -1; - goto EXITPOINT; - } - - - siIndex = j; - - offset = topNod[ siIndex ] - 1; - numGrid -= offset; - xStart = x[1 + offset]; - for ( i=1; i <= numGrid; i++ ) { - x[i] = x[i + offset] - xStart; - conc[i] = conc[i + offset]; - } - -/* Store number of valid nodes using pointer */ - *numNod = numGrid; - -EXITPOINT: - if (fpSuprem != (FILE *) NULL) { - if (fclose(fpSuprem) != 0) { - (void) fprintf(cp_err, "Unable to close \"%s\" at exit: %s\n", - inFile, strerror(errno)); - xrc = -1; - } - } - - return xrc; -} /* end of function SUPbinRead */ - - - -int SUPascRead(const char *inFile, float *x, float *conc, int *impId, - int *numNod) -{ - int xrc = 0; - int i, j; - char cdata[21]; - int numLay, numImp, numGrid; - int impTyp[4], matTyp[10], topNod[10], siIndex, offset; - float xStart; - float layerTh[10]; - float con[500]; - FILE *fpSuprem; - - /* Clear Concentration Array */ - for ( i=0; i < MAXGRID; i++ ) { - conc[i] = 0.0; - } - - /* Open Input File */ - if ((fpSuprem = fopen( inFile, "r" )) == NULL) { - (void) fprintf(cp_err, "Unable to open file \"%s\": %s.\n", - inFile, strerror(errno)); - xrc = -1; - goto EXITPOINT; - } - -/* - * The first line contains the number of layers (I4), the number of - * impurities (I4), and the number of nodes (I4) present in the structure. - */ - if (fscanf( fpSuprem, "%d %d %d\n", &numLay, &numImp, &numGrid) != 3) { - (void) fprintf(cp_err, "Unable to read file first line of \"%s\"\n", - inFile); - xrc = -1; - goto EXITPOINT; - } - - DEBUG fprintf( stderr, "set 1: %d %d %d\n", numLay, numImp, numGrid); - - /* - * The second set of lines contains, for each layer, the material name - * (A20), the material type (I4), the layer thickness (R4), and the - * pointer to the top node of the layer (I4), and an unknown int and - * unknown float. - * - * The material type code: - * 1 - Si - * 2 - SiO2 - * 3 - Poly - * 4 - Si3N4 - * 5 - Alum - */ - for (i = 0; i < numLay; ++i) { - int idata; - float rdata; - if (fscanf(fpSuprem, "%s\n %d %e %d %d %e\n", - cdata, &matTyp[i], &layerTh[i], &topNod[i], - &idata, &rdata) != 6) { - (void) fprintf(cp_err, "Unable to read layer %d " - "from file \"%s\".\n", - i + 1, inFile); - xrc = -1; - goto EXITPOINT; - } - - DEBUG fprintf(stderr,"set 2: %s: %d %f %d\n", - cdata, matTyp[i], layerTh[i], topNod[i]); - } /* end of loop over layers */ - - /* - * The third set of lines contains, for each impurity, the name of the - * impurity (A20) and the type of impurity (I4). - */ - for (i = 0; i < numImp; ++i) { - if (fscanf( fpSuprem, "%s\n %d\n", cdata, &impTyp[i]) != 2) { - (void) fprintf(cp_err, "Unable to read impurity %d " - "from file \"%s\".\n", - i + 1, inFile); - xrc = -1; - goto EXITPOINT; - } - DEBUG fprintf(stderr,"set 3: %s: %d\n", cdata, impTyp[i]); - } /* end of loop over impurities */ - - /* - * The fourth set of lines contains, for each layer by each impurity, - * the integrated dopant (R4), and the interior concentration of the - * polysilicon grains (R4). - */ - for (j = 0; j < numLay; ++j) { - for (i = 0; i < numImp; ++i) { - float rdata; - if (fscanf(fpSuprem, "%e%e", &rdata, &rdata) != 2) { - (void) fprintf(cp_err, "Unable to read integrated dopant " - "and interior concentration of layer %d and " - "impurity %d from file \"%s\".\n", - j + 1, i + 1, inFile); - xrc = -1; - goto EXITPOINT; - } - } - } - DEBUG fprintf(stderr,"set 4:\n" ); - - /* - * The fifth set of lines contains, for each node in the structure, - * the distance to the next deepest node (R4), the distance from the - * surface (R4), and, for each impurity type, the impurity's - * chemical concentration (R4) and the impurity's active concentration (R4). - */ - for (i = 1; i <= numGrid; ++i) { - float rdata; - if (fscanf(fpSuprem, "%e %e", &rdata, &x[i]) != 2) { - (void) fprintf(cp_err, "Unable to read grid %d " - "from file \"%s\".\n", - i + 1, inFile); - xrc = -1; - goto EXITPOINT; - } - - for (j = 0; j < numImp; j++) { - float junk; - /* chemical concentration - not required */ - if (fscanf(fpSuprem, "%e", &junk) != 1) { - (void) fprintf(cp_err, "Unable to chemical concentration " - "%d of layer %d " - "from file \"%s\".\n", - j + 1, i + 1, inFile); - xrc = -1; - goto EXITPOINT; - } - - /* store active concentration */ - if (fscanf(fpSuprem, "%e", &con[i]) != 1) { - (void) fprintf(cp_err, "Unable to active concentration " - "%d of layer %d " - "from file \"%s\".\n", - j + 1, i + 1, inFile); - xrc = -1; - goto EXITPOINT; - } - - /* orient sign properly */ - if (impTyp[j] == *impId) { - /*...Boron...*/ - if (impTyp[j] == 1) { - conc[i] = - con[i]; - } - else { - /*...All Other Impurities: P, As, Sb ...*/ - conc[i] = con[i]; - } - } - } - } /* end of loop over num grid */ - DEBUG fprintf( stderr, "set 5: %e %e\n", x[1], conc[1] ); - - /* - * The last line in the file contains some random stuff that might be - * useful to some people, the temperature in degrees Kelvin of the last - * diffusion step (R4), the phosphorus implant dose (R4), the arsenic - * implant flag (L4). However, we can just ignore that stuff. - */ - if (fclose(fpSuprem) != 0) { - (void) fprintf(cp_err, "Unable to close file \"%s\": %s.\n", - inFile, strerror(errno)); - xrc = -1; - goto EXITPOINT; - } - fpSuprem = (FILE *) NULL; - - /* shift silicon layer to beginning of array */ - for (j = numLay; --j >= 0; ) { - if (matTyp[j] == 1) { - break; - } - } - - if (j < 0) { - (void) fprintf(cp_err, "internal error in %s!\n", __FUNCTION__); - xrc = -1; - goto EXITPOINT; - } - - siIndex = j; - - offset = topNod[siIndex] - 1; - numGrid -= offset; - xStart = x[1 + offset]; - for (i = 1; i <= numGrid; i++) { - x[i] = x[i + offset] - xStart; - conc[i] = conc[i + offset]; - } - - /* Store number of valid nodes using pointer */ - *numNod = numGrid; - -EXITPOINT: - if (fpSuprem != (FILE *) NULL) { - if (fclose(fpSuprem) != 0) { - (void) fprintf(cp_err, "Unable to close \"%s\" at exit: %s\n", - inFile, strerror(errno)); - xrc = -1; - } - } - - return xrc; -} /* end of function SUPascRead */ - - - diff --git a/src/ciderlib/twod/Makefile.am b/src/ciderlib/twod/Makefile.am deleted file mode 100644 index 6e42d4d8c..000000000 --- a/src/ciderlib/twod/Makefile.am +++ /dev/null @@ -1,34 +0,0 @@ -## Process this file with automake to produce Makefile.in - -noinst_LTLIBRARIES = libcidertwod.la - -libcidertwod_la_SOURCES = \ - twoadmit.c \ - twoaval.c \ - twocond.c \ - twocont.c \ - twocurr.c \ - twoddefs.h \ - twodest.c \ - twodext.h \ - twodopng.c \ - twoelect.c \ - twofield.c \ - twomesh.c \ - twomobdv.c \ - twomobfn.c \ - twomobil.c \ - twoncont.c \ - twopcont.c \ - twopoiss.c \ - twoprint.c \ - twoproj.c \ - tworead.c \ - twosetbc.c \ - twosetup.c \ - twosolve.c - -EXTRA_DIST = readme -AM_CPPFLAGS = @AM_CPPFLAGS@ -I$(top_srcdir)/src/include -AM_CFLAGS = $(STATIC) -MAINTAINERCLEANFILES = Makefile.in diff --git a/src/ciderlib/twod/readme b/src/ciderlib/twod/readme deleted file mode 100644 index e643fbf01..000000000 --- a/src/ciderlib/twod/readme +++ /dev/null @@ -1,15 +0,0 @@ -Directory: twod ---------------- -This directory contains the files that are primarily responsible for -implementing the 2D device simulator. It also contains files that help -interface the circuit simulator to the device simulator. Most functions -that are common to all 2D device simulations start with the prefix TWO, -e.g. TWObiasSolve. The device-specific routines start with either NUMD2, -NBJT2 or NUMOS, e.g. NUMD2admittance, NBJTproject or NUMOSconductance. The -simulator contains a Poisson Solver for equilibrium, and a Two-carrier -solver and One-carrier solvers for bias solutions. An attempt has been -made to keep the function names parallel in the four portions. Poisson -routines are identified with a 'Q' (for charge only) after the TWO, Full -solver routines are identified with an underscore '_', -Electron-current-only routines are identified with an 'N', and -Hole-current-only routines are identified with a 'P'. diff --git a/src/ciderlib/twod/twoadmit.c b/src/ciderlib/twod/twoadmit.c deleted file mode 100644 index bf877639c..000000000 --- a/src/ciderlib/twod/twoadmit.c +++ /dev/null @@ -1,1320 +0,0 @@ -/********** -Copyright 1991 Regents of the University of California. All rights reserved. -Author: 1987 Kartikeya Mayaram, U. C. Berkeley CAD Group -**********/ - -/* Functions to compute the ac admittances of a device. */ - -#include "ngspice/ngspice.h" -#include "ngspice/numglobs.h" -#include "ngspice/numenum.h" -#include "ngspice/numconst.h" -#include "ngspice/twodev.h" -#include "ngspice/twomesh.h" -#include "ngspice/complex.h" -#include "ngspice/spmatrix.h" -#include "ngspice/bool.h" -#include "ngspice/macros.h" -#include "ngspice/ifsim.h" -#include "twoddefs.h" -#include "twodext.h" -#include "ngspice/cidersupt.h" - -extern IFfrontEnd *SPfrontEnd; - -/* - * mmhhh this may cause troubles - * Paolo Nenzi 2002 - */ - SPcomplex yTotal; - -int -NUMD2admittance(TWOdevice *pDevice, double omega, SPcomplex *yd) -{ - TWOnode *pNode; - TWOelem *pElem; - int index, eIndex; - double dxdy; - double *solnReal, *solnImag; - double *rhsReal, *rhsImag; - SPcomplex yAc, cOmega, *y; - BOOLEAN deltaVContact = FALSE; - BOOLEAN SORFailed; - double startTime; - - /* Each time we call this counts as one AC iteration. */ - pDevice->pStats->numIters[STAT_AC] += 1; - - /* - * change context names of solution vectors for ac analysis dcDeltaSolution - * stores the real part and copiedSolution stores the imaginary part of the - * ac solution vector - */ - pDevice->solverType = SLV_SMSIG; - rhsReal = pDevice->rhs; - rhsImag = pDevice->rhsImag; - solnReal = pDevice->dcDeltaSolution; - solnImag = pDevice->copiedSolution; - - /* use a normalized radian frequency */ - omega *= TNorm; - CMPLX_ASSIGN_VALUE(cOmega, 0.0, omega); - - if ((AcAnalysisMethod == SOR) || (AcAnalysisMethod == SOR_ONLY)) { - /* LOAD */ - startTime = SPfrontEnd->IFseconds(); - /* zero the rhsImag */ - for (index = 1; index <= pDevice->numEqns; index++) { - rhsImag[index] = 0.0; - } - /* store the new rhs vector */ - storeNewRhs(pDevice, pDevice->pLastContact); - pDevice->pStats->loadTime[STAT_AC] += SPfrontEnd->IFseconds() - startTime; - - /* SOLVE */ - startTime = SPfrontEnd->IFseconds(); - SORFailed = TWOsorSolve(pDevice, solnReal, solnImag, omega); - pDevice->pStats->solveTime[STAT_AC] += SPfrontEnd->IFseconds() - startTime; - if (SORFailed && AcAnalysisMethod == SOR) { - AcAnalysisMethod = DIRECT; - printf("SOR failed at %g Hz, switching to direct-method ac analysis.\n", - omega / (2 * M_PI * TNorm) ); - } else if (SORFailed) { /* Told to only do SOR, so give up. */ - printf("SOR failed at %g Hz, returning null admittance.\n", - omega / (2 * M_PI * TNorm) ); - CMPLX_ASSIGN_VALUE(*yd, 0.0, 0.0); - return (AcAnalysisMethod); - } - } - if (AcAnalysisMethod == DIRECT) { - /* LOAD */ - startTime = SPfrontEnd->IFseconds(); - for (index = 1; index <= pDevice->numEqns; index++) { - rhsImag[index] = 0.0; - } - /* solve the system of equations directly */ - if (!OneCarrier) { - TWO_jacLoad(pDevice); - } else if (OneCarrier == N_TYPE) { - TWONjacLoad(pDevice); - } else if (OneCarrier == P_TYPE) { - TWOPjacLoad(pDevice); - } - storeNewRhs(pDevice, pDevice->pLastContact); - - spSetComplex(pDevice->matrix); - for (eIndex = 1; eIndex <= pDevice->numElems; eIndex++) { - pElem = pDevice->elements[eIndex]; - if (pElem->elemType == SEMICON) { - dxdy = 0.25 * pElem->dx * pElem->dy; - for (index = 0; index <= 3; index++) { - pNode = pElem->pNodes[index]; - if (pNode->nodeType != CONTACT) { - if (!OneCarrier) { - spADD_COMPLEX_ELEMENT(pNode->fNN, 0.0, -dxdy * omega); - spADD_COMPLEX_ELEMENT(pNode->fPP, 0.0, dxdy * omega); - } else if (OneCarrier == N_TYPE) { - spADD_COMPLEX_ELEMENT(pNode->fNN, 0.0, -dxdy * omega); - } else if (OneCarrier == P_TYPE) { - spADD_COMPLEX_ELEMENT(pNode->fPP, 0.0, dxdy * omega); - } - } - } - } - } - pDevice->pStats->loadTime[STAT_AC] += SPfrontEnd->IFseconds() - startTime; - - /* FACTOR */ - startTime = SPfrontEnd->IFseconds(); - spFactor(pDevice->matrix); - pDevice->pStats->factorTime[STAT_AC] += SPfrontEnd->IFseconds() - startTime; - - /* SOLVE */ - startTime = SPfrontEnd->IFseconds(); - spSolve(pDevice->matrix, rhsReal, solnReal, rhsImag, solnImag); - pDevice->pStats->solveTime[STAT_AC] += SPfrontEnd->IFseconds() - startTime; - } - /* MISC */ - startTime = SPfrontEnd->IFseconds(); - y = contactAdmittance(pDevice, pDevice->pFirstContact, deltaVContact, - solnReal, solnImag, &cOmega); - CMPLX_ASSIGN_VALUE(yAc, -y->real, -y->imag); - CMPLX_ASSIGN(*yd, yAc); - CMPLX_MULT_SELF_SCALAR(*yd, GNorm * pDevice->width * LNorm); - pDevice->pStats->miscTime[STAT_AC] += SPfrontEnd->IFseconds() - startTime; - - return (AcAnalysisMethod); -} - - -int -NBJT2admittance(TWOdevice *pDevice, double omega, SPcomplex *yIeVce, - SPcomplex *yIcVce, SPcomplex *yIeVbe, SPcomplex *yIcVbe) -{ - TWOcontact *pEmitContact = pDevice->pLastContact; - TWOcontact *pColContact = pDevice->pFirstContact; - TWOcontact *pBaseContact = pDevice->pFirstContact->next; - TWOnode *pNode; - TWOelem *pElem; - int index, eIndex; - double width = pDevice->width; - double dxdy; - double *solnReal, *solnImag; - double *rhsReal, *rhsImag; - BOOLEAN SORFailed; - SPcomplex *y; - SPcomplex pIeVce, pIcVce, pIeVbe, pIcVbe; - SPcomplex cOmega; - double startTime; - - /* Each time we call this counts as one AC iteration. */ - pDevice->pStats->numIters[STAT_AC] += 1; - - pDevice->solverType = SLV_SMSIG; - rhsReal = pDevice->rhs; - rhsImag = pDevice->rhsImag; - solnReal = pDevice->dcDeltaSolution; - solnImag = pDevice->copiedSolution; - - /* use a normalized radian frequency */ - omega *= TNorm; - CMPLX_ASSIGN_VALUE(cOmega, 0.0, omega); - CMPLX_ASSIGN_VALUE(pIeVce, NAN, NAN); - CMPLX_ASSIGN_VALUE(pIcVce, NAN, NAN); - - if ((AcAnalysisMethod == SOR) || (AcAnalysisMethod == SOR_ONLY)) { - /* LOAD */ - startTime = SPfrontEnd->IFseconds(); - /* zero the rhs before loading in the new rhs */ - for (index = 1; index <= pDevice->numEqns; index++) { - rhsImag[index] = 0.0; - } - storeNewRhs(pDevice, pColContact); - pDevice->pStats->loadTime[STAT_AC] += SPfrontEnd->IFseconds() - startTime; - - /* SOLVE */ - startTime = SPfrontEnd->IFseconds(); - SORFailed = TWOsorSolve(pDevice, solnReal, solnImag, omega); - pDevice->pStats->solveTime[STAT_AC] += SPfrontEnd->IFseconds() - startTime; - if (SORFailed && AcAnalysisMethod == SOR) { - AcAnalysisMethod = DIRECT; - printf("SOR failed at %g Hz, switching to direct-method ac analysis.\n", - omega / (2 * M_PI * TNorm) ); - } else if (SORFailed) { /* Told to only do SOR, so give up. */ - printf("SOR failed at %g Hz, returning null admittance.\n", - omega / (2 * M_PI * TNorm) ); - CMPLX_ASSIGN_VALUE(*yIeVce, 0.0, 0.0); - CMPLX_ASSIGN_VALUE(*yIcVce, 0.0, 0.0); - CMPLX_ASSIGN_VALUE(*yIeVbe, 0.0, 0.0); - CMPLX_ASSIGN_VALUE(*yIcVbe, 0.0, 0.0); - return (AcAnalysisMethod); - } else { - /* MISC */ - startTime = SPfrontEnd->IFseconds(); - y = contactAdmittance(pDevice, pEmitContact, FALSE, - solnReal, solnImag, &cOmega); - CMPLX_ASSIGN_VALUE(pIeVce, y->real, y->imag); - y = contactAdmittance(pDevice, pColContact, TRUE, - solnReal, solnImag, &cOmega); - CMPLX_ASSIGN_VALUE(pIcVce, y->real, y->imag); - pDevice->pStats->miscTime[STAT_AC] += SPfrontEnd->IFseconds() - startTime; - - /* LOAD */ - startTime = SPfrontEnd->IFseconds(); - /* load in the base contribution to the rhs */ - for (index = 1; index <= pDevice->numEqns; index++) { - rhsImag[index] = 0.0; - } - storeNewRhs(pDevice, pBaseContact); - pDevice->pStats->loadTime[STAT_AC] += SPfrontEnd->IFseconds() - startTime; - - /* SOLVE */ - startTime = SPfrontEnd->IFseconds(); - SORFailed = TWOsorSolve(pDevice, solnReal, solnImag, omega); - pDevice->pStats->solveTime[STAT_AC] += - SPfrontEnd->IFseconds() - startTime; - if (SORFailed && AcAnalysisMethod == SOR) { - AcAnalysisMethod = DIRECT; - printf("SOR failed at %g Hz, switching to direct-method ac analysis.\n", - omega / (2 * M_PI * TNorm) ); - } else if (SORFailed) { /* Told to only do SOR, so give up. */ - printf("SOR failed at %g Hz, returning null admittance.\n", - omega / (2 * M_PI * TNorm) ); - CMPLX_ASSIGN_VALUE(*yIeVce, 0.0, 0.0); - CMPLX_ASSIGN_VALUE(*yIcVce, 0.0, 0.0); - CMPLX_ASSIGN_VALUE(*yIeVbe, 0.0, 0.0); - CMPLX_ASSIGN_VALUE(*yIcVbe, 0.0, 0.0); - return (AcAnalysisMethod); - } - } - } - if (AcAnalysisMethod == DIRECT) { - /* LOAD */ - startTime = SPfrontEnd->IFseconds(); - for (index = 1; index <= pDevice->numEqns; index++) { - rhsImag[index] = 0.0; - } - /* solve the system of equations directly */ - if (!OneCarrier) { - TWO_jacLoad(pDevice); - } else if (OneCarrier == N_TYPE) { - TWONjacLoad(pDevice); - } else if (OneCarrier == P_TYPE) { - TWOPjacLoad(pDevice); - } - storeNewRhs(pDevice, pColContact); - spSetComplex(pDevice->matrix); - for (eIndex = 1; eIndex <= pDevice->numElems; eIndex++) { - pElem = pDevice->elements[eIndex]; - if (pElem->elemType == SEMICON) { - dxdy = 0.25 * pElem->dx * pElem->dy; - for (index = 0; index <= 3; index++) { - pNode = pElem->pNodes[index]; - if (pNode->nodeType != CONTACT) { - if (!OneCarrier) { - spADD_COMPLEX_ELEMENT(pNode->fNN, 0.0, -dxdy * omega); - spADD_COMPLEX_ELEMENT(pNode->fPP, 0.0, dxdy * omega); - } else if (OneCarrier == N_TYPE) { - spADD_COMPLEX_ELEMENT(pNode->fNN, 0.0, -dxdy * omega); - } else if (OneCarrier == P_TYPE) { - spADD_COMPLEX_ELEMENT(pNode->fPP, 0.0, dxdy * omega); - } - } - } - } - } - pDevice->pStats->loadTime[STAT_AC] += SPfrontEnd->IFseconds() - startTime; - - /* FACTOR */ - startTime = SPfrontEnd->IFseconds(); - spFactor(pDevice->matrix); - pDevice->pStats->factorTime[STAT_AC] += SPfrontEnd->IFseconds() - startTime; - - /* SOLVE */ - startTime = SPfrontEnd->IFseconds(); - spSolve(pDevice->matrix, rhsReal, solnReal, rhsImag, solnImag); - pDevice->pStats->solveTime[STAT_AC] += SPfrontEnd->IFseconds() - startTime; - - /* MISC */ - startTime = SPfrontEnd->IFseconds(); - y = contactAdmittance(pDevice, pEmitContact, FALSE, - solnReal, solnImag, &cOmega); - CMPLX_ASSIGN_VALUE(pIeVce, y->real, y->imag); - y = contactAdmittance(pDevice, pColContact, TRUE, - solnReal, solnImag, &cOmega); - CMPLX_ASSIGN_VALUE(pIcVce, y->real, y->imag); - pDevice->pStats->miscTime[STAT_AC] += SPfrontEnd->IFseconds() - startTime; - - /* LOAD */ - startTime = SPfrontEnd->IFseconds(); - for (index = 1; index <= pDevice->numEqns; index++) { - rhsImag[index] = 0.0; - } - storeNewRhs(pDevice, pBaseContact); - pDevice->pStats->loadTime[STAT_AC] += SPfrontEnd->IFseconds() - startTime; - - /* FACTOR: already done, no need to repeat. */ - - /* SOLVE */ - startTime = SPfrontEnd->IFseconds(); - spSolve(pDevice->matrix, rhsReal, solnReal, rhsImag, solnImag); - pDevice->pStats->solveTime[STAT_AC] += SPfrontEnd->IFseconds() - startTime; - } - /* MISC */ - startTime = SPfrontEnd->IFseconds(); - y = contactAdmittance(pDevice, pEmitContact, FALSE, - solnReal, solnImag, &cOmega); - CMPLX_ASSIGN_VALUE(pIeVbe, y->real, y->imag); - y = contactAdmittance(pDevice, pColContact, FALSE, - solnReal, solnImag, &cOmega); - CMPLX_ASSIGN_VALUE(pIcVbe, y->real, y->imag); - - CMPLX_ASSIGN(*yIeVce, pIeVce); - CMPLX_ASSIGN(*yIeVbe, pIeVbe); - CMPLX_ASSIGN(*yIcVce, pIcVce); - CMPLX_ASSIGN(*yIcVbe, pIcVbe); - CMPLX_MULT_SELF_SCALAR(*yIeVce, GNorm * width * LNorm); - CMPLX_MULT_SELF_SCALAR(*yIeVbe, GNorm * width * LNorm); - CMPLX_MULT_SELF_SCALAR(*yIcVce, GNorm * width * LNorm); - CMPLX_MULT_SELF_SCALAR(*yIcVbe, GNorm * width * LNorm); - pDevice->pStats->miscTime[STAT_AC] += SPfrontEnd->IFseconds() - startTime; - - return (AcAnalysisMethod); -} - -int -NUMOSadmittance(TWOdevice *pDevice, double omega, struct mosAdmittances *yAc) -{ - TWOcontact *pDContact = pDevice->pFirstContact; - TWOcontact *pGContact = pDevice->pFirstContact->next; - TWOcontact *pSContact = pDevice->pFirstContact->next->next; -/* TWOcontact *pBContact = pDevice->pLastContact; */ - TWOnode *pNode; - TWOelem *pElem; - int index, eIndex; - double width = pDevice->width; - double dxdy; - double *solnReal, *solnImag; - double *rhsReal, *rhsImag; - BOOLEAN SORFailed; - SPcomplex *y, cOmega; - double startTime; - - /* Each time we call this counts as one AC iteration. */ - pDevice->pStats->numIters[STAT_AC] += 1; - - pDevice->solverType = SLV_SMSIG; - rhsReal = pDevice->rhs; - rhsImag = pDevice->rhsImag; - solnReal = pDevice->dcDeltaSolution; - solnImag = pDevice->copiedSolution; - - /* use a normalized radian frequency */ - omega *= TNorm; - CMPLX_ASSIGN_VALUE(cOmega, 0.0, omega); - - if ((AcAnalysisMethod == SOR) || (AcAnalysisMethod == SOR_ONLY)) { - /* LOAD */ - startTime = SPfrontEnd->IFseconds(); - /* zero the rhs before loading in the new rhs */ - for (index = 1; index <= pDevice->numEqns; index++) { - rhsImag[index] = 0.0; - } - storeNewRhs(pDevice, pDContact); - pDevice->pStats->loadTime[STAT_AC] += SPfrontEnd->IFseconds() - startTime; - - /* SOLVE */ - startTime = SPfrontEnd->IFseconds(); - SORFailed = TWOsorSolve(pDevice, solnReal, solnImag, omega); - pDevice->pStats->solveTime[STAT_AC] += SPfrontEnd->IFseconds() - startTime; - if (SORFailed && AcAnalysisMethod == SOR) { - AcAnalysisMethod = DIRECT; - printf("SOR failed at %g Hz, switching to direct-method ac analysis.\n", - omega / (2 * M_PI * TNorm) ); - } else if (SORFailed) { /* Told to only do SOR, so give up. */ - printf("SOR failed at %g Hz, returning null admittance.\n", - omega / (2 * M_PI * TNorm) ); - CMPLX_ASSIGN_VALUE(yAc->yIdVdb, 0.0, 0.0); - CMPLX_ASSIGN_VALUE(yAc->yIdVsb, 0.0, 0.0); - CMPLX_ASSIGN_VALUE(yAc->yIdVgb, 0.0, 0.0); - CMPLX_ASSIGN_VALUE(yAc->yIsVdb, 0.0, 0.0); - CMPLX_ASSIGN_VALUE(yAc->yIsVsb, 0.0, 0.0); - CMPLX_ASSIGN_VALUE(yAc->yIsVgb, 0.0, 0.0); - CMPLX_ASSIGN_VALUE(yAc->yIgVdb, 0.0, 0.0); - CMPLX_ASSIGN_VALUE(yAc->yIgVsb, 0.0, 0.0); - CMPLX_ASSIGN_VALUE(yAc->yIgVgb, 0.0, 0.0); - return (AcAnalysisMethod); - } else { - /* MISC */ - startTime = SPfrontEnd->IFseconds(); - y = contactAdmittance(pDevice, pDContact, TRUE, - solnReal, solnImag, &cOmega); - CMPLX_ASSIGN_VALUE(yAc->yIdVdb, y->real, y->imag); - y = contactAdmittance(pDevice, pSContact, FALSE, - solnReal, solnImag, &cOmega); - CMPLX_ASSIGN_VALUE(yAc->yIsVdb, y->real, y->imag); - y = GateTypeAdmittance(pDevice, pGContact, FALSE, - solnReal, solnImag, &cOmega); - CMPLX_ASSIGN_VALUE(yAc->yIgVdb, y->real, y->imag); - pDevice->pStats->miscTime[STAT_AC] += SPfrontEnd->IFseconds() - startTime; - - /* LOAD */ - startTime = SPfrontEnd->IFseconds(); - /* load in the source contribution to the rhs */ - for (index = 1; index <= pDevice->numEqns; index++) { - rhsImag[index] = 0.0; - } - storeNewRhs(pDevice, pSContact); - pDevice->pStats->loadTime[STAT_AC] += SPfrontEnd->IFseconds() - startTime; - - /* SOLVE */ - startTime = SPfrontEnd->IFseconds(); - SORFailed = TWOsorSolve(pDevice, solnReal, solnImag, omega); - pDevice->pStats->solveTime[STAT_AC] += - SPfrontEnd->IFseconds() - startTime; - if (SORFailed && AcAnalysisMethod == SOR) { - AcAnalysisMethod = DIRECT; - printf("SOR failed at %g Hz, switching to direct-method ac analysis.\n", - omega / (2 * M_PI * TNorm) ); - } else if (SORFailed) { /* Told to only do SOR, so give up. */ - printf("SOR failed at %g Hz, returning null admittance.\n", - omega / (2 * M_PI * TNorm) ); - CMPLX_ASSIGN_VALUE(yAc->yIdVdb, 0.0, 0.0); - CMPLX_ASSIGN_VALUE(yAc->yIdVsb, 0.0, 0.0); - CMPLX_ASSIGN_VALUE(yAc->yIdVgb, 0.0, 0.0); - CMPLX_ASSIGN_VALUE(yAc->yIsVdb, 0.0, 0.0); - CMPLX_ASSIGN_VALUE(yAc->yIsVsb, 0.0, 0.0); - CMPLX_ASSIGN_VALUE(yAc->yIsVgb, 0.0, 0.0); - CMPLX_ASSIGN_VALUE(yAc->yIgVdb, 0.0, 0.0); - CMPLX_ASSIGN_VALUE(yAc->yIgVsb, 0.0, 0.0); - CMPLX_ASSIGN_VALUE(yAc->yIgVgb, 0.0, 0.0); - return (AcAnalysisMethod); - } else { - /* MISC */ - startTime = SPfrontEnd->IFseconds(); - y = contactAdmittance(pDevice, pDContact, FALSE, - solnReal, solnImag, &cOmega); - CMPLX_ASSIGN_VALUE(yAc->yIdVsb, y->real, y->imag); - y = contactAdmittance(pDevice, pSContact, TRUE, - solnReal, solnImag, &cOmega); - CMPLX_ASSIGN_VALUE(yAc->yIsVsb, y->real, y->imag); - y = GateTypeAdmittance(pDevice, pGContact, FALSE, - solnReal, solnImag, &cOmega); - CMPLX_ASSIGN_VALUE(yAc->yIgVsb, y->real, y->imag); - pDevice->pStats->miscTime[STAT_AC] += - SPfrontEnd->IFseconds() - startTime; - - /* LOAD */ - startTime = SPfrontEnd->IFseconds(); - /* load in the gate contribution to the rhs */ - for (index = 1; index <= pDevice->numEqns; index++) { - rhsImag[index] = 0.0; - } - storeNewRhs(pDevice, pGContact); - pDevice->pStats->loadTime[STAT_AC] += - SPfrontEnd->IFseconds() - startTime; - - /* SOLVE */ - startTime = SPfrontEnd->IFseconds(); - SORFailed = TWOsorSolve(pDevice, solnReal, solnImag, omega); - pDevice->pStats->solveTime[STAT_AC] += - SPfrontEnd->IFseconds() - startTime; - if (SORFailed && AcAnalysisMethod == SOR) { - AcAnalysisMethod = DIRECT; - printf("SOR failed at %g Hz, switching to direct-method ac analysis.\n", - omega / (2 * M_PI * TNorm) ); - } else if (SORFailed) { /* Told to only do SOR, so give up. */ - printf("SOR failed at %g Hz, returning null admittance.\n", - omega / (2 * M_PI * TNorm) ); - CMPLX_ASSIGN_VALUE(yAc->yIdVdb, 0.0, 0.0); - CMPLX_ASSIGN_VALUE(yAc->yIdVsb, 0.0, 0.0); - CMPLX_ASSIGN_VALUE(yAc->yIdVgb, 0.0, 0.0); - CMPLX_ASSIGN_VALUE(yAc->yIsVdb, 0.0, 0.0); - CMPLX_ASSIGN_VALUE(yAc->yIsVsb, 0.0, 0.0); - CMPLX_ASSIGN_VALUE(yAc->yIsVgb, 0.0, 0.0); - CMPLX_ASSIGN_VALUE(yAc->yIgVdb, 0.0, 0.0); - CMPLX_ASSIGN_VALUE(yAc->yIgVsb, 0.0, 0.0); - CMPLX_ASSIGN_VALUE(yAc->yIgVgb, 0.0, 0.0); - return (AcAnalysisMethod); - } - } - } - } - if (AcAnalysisMethod == DIRECT) { - /* solve the system of equations directly */ - /* LOAD */ - startTime = SPfrontEnd->IFseconds(); - for (index = 1; index <= pDevice->numEqns; index++) { - rhsImag[index] = 0.0; - } - storeNewRhs(pDevice, pDContact); - - /* Need to load & factor jacobian once. */ - if (!OneCarrier) { - TWO_jacLoad(pDevice); - } else if (OneCarrier == N_TYPE) { - TWONjacLoad(pDevice); - } else if (OneCarrier == P_TYPE) { - TWOPjacLoad(pDevice); - } - spSetComplex(pDevice->matrix); - for (eIndex = 1; eIndex <= pDevice->numElems; eIndex++) { - pElem = pDevice->elements[eIndex]; - if (pElem->elemType == SEMICON) { - dxdy = 0.25 * pElem->dx * pElem->dy; - for (index = 0; index <= 3; index++) { - pNode = pElem->pNodes[index]; - if (pNode->nodeType != CONTACT) { - if (!OneCarrier) { - spADD_COMPLEX_ELEMENT(pNode->fNN, 0.0, -dxdy * omega); - spADD_COMPLEX_ELEMENT(pNode->fPP, 0.0, dxdy * omega); - } else if (OneCarrier == N_TYPE) { - spADD_COMPLEX_ELEMENT(pNode->fNN, 0.0, -dxdy * omega); - } else if (OneCarrier == P_TYPE) { - spADD_COMPLEX_ELEMENT(pNode->fPP, 0.0, dxdy * omega); - } - } - } - } - } - pDevice->pStats->loadTime[STAT_AC] += SPfrontEnd->IFseconds() - startTime; - - /* FACTOR */ - startTime = SPfrontEnd->IFseconds(); - spFactor(pDevice->matrix); - pDevice->pStats->factorTime[STAT_AC] += SPfrontEnd->IFseconds() - startTime; - - /* SOLVE */ - startTime = SPfrontEnd->IFseconds(); - spSolve(pDevice->matrix, rhsReal, solnReal, rhsImag, solnImag); - pDevice->pStats->solveTime[STAT_AC] += SPfrontEnd->IFseconds() - startTime; - - /* MISC */ - startTime = SPfrontEnd->IFseconds(); - y = contactAdmittance(pDevice, pDContact, TRUE, - solnReal, solnImag, &cOmega); - CMPLX_ASSIGN_VALUE(yAc->yIdVdb, y->real, y->imag); - y = contactAdmittance(pDevice, pSContact, FALSE, - solnReal, solnImag, &cOmega); - CMPLX_ASSIGN_VALUE(yAc->yIsVdb, y->real, y->imag); - y = GateTypeAdmittance(pDevice, pGContact, FALSE, - solnReal, solnImag, &cOmega); - CMPLX_ASSIGN_VALUE(yAc->yIgVdb, y->real, y->imag); - pDevice->pStats->miscTime[STAT_AC] += SPfrontEnd->IFseconds() - startTime; - - /* LOAD */ - startTime = SPfrontEnd->IFseconds(); - for (index = 1; index <= pDevice->numEqns; index++) { - rhsImag[index] = 0.0; - } - storeNewRhs(pDevice, pSContact); - pDevice->pStats->loadTime[STAT_AC] += SPfrontEnd->IFseconds() - startTime; - - /* FACTOR: already done, no need to repeat. */ - - /* SOLVE */ - startTime = SPfrontEnd->IFseconds(); - spSolve(pDevice->matrix, rhsReal, solnReal, rhsImag, solnImag); - pDevice->pStats->solveTime[STAT_AC] += SPfrontEnd->IFseconds() - startTime; - - /* MISC */ - startTime = SPfrontEnd->IFseconds(); - y = contactAdmittance(pDevice, pDContact, FALSE, - solnReal, solnImag, &cOmega); - CMPLX_ASSIGN_VALUE(yAc->yIdVsb, y->real, y->imag); - y = contactAdmittance(pDevice, pSContact, TRUE, - solnReal, solnImag, &cOmega); - CMPLX_ASSIGN_VALUE(yAc->yIsVsb, y->real, y->imag); - y = GateTypeAdmittance(pDevice, pGContact, FALSE, - solnReal, solnImag, &cOmega); - CMPLX_ASSIGN_VALUE(yAc->yIgVsb, y->real, y->imag); - pDevice->pStats->miscTime[STAT_AC] += SPfrontEnd->IFseconds() - startTime; - - /* LOAD */ - startTime = SPfrontEnd->IFseconds(); - for (index = 1; index <= pDevice->numEqns; index++) { - rhsImag[index] = 0.0; - } - storeNewRhs(pDevice, pGContact); - pDevice->pStats->loadTime[STAT_AC] += SPfrontEnd->IFseconds() - startTime; - - /* FACTOR: already done, no need to repeat. */ - - /* SOLVE */ - startTime = SPfrontEnd->IFseconds(); - spSolve(pDevice->matrix, rhsReal, solnReal, rhsImag, solnImag); - pDevice->pStats->solveTime[STAT_AC] += SPfrontEnd->IFseconds() - startTime; - } - /* MISC */ - startTime = SPfrontEnd->IFseconds(); - y = contactAdmittance(pDevice, pDContact, FALSE, - solnReal, solnImag, &cOmega); - CMPLX_ASSIGN_VALUE(yAc->yIdVgb, y->real, y->imag); - y = contactAdmittance(pDevice, pSContact, FALSE, - solnReal, solnImag, &cOmega); - CMPLX_ASSIGN_VALUE(yAc->yIsVgb, y->real, y->imag); - y = GateTypeAdmittance(pDevice, pGContact, TRUE, - solnReal, solnImag, &cOmega); - CMPLX_ASSIGN_VALUE(yAc->yIgVgb, y->real, y->imag); - - CMPLX_MULT_SELF_SCALAR(yAc->yIdVdb, GNorm * width * LNorm); - CMPLX_MULT_SELF_SCALAR(yAc->yIdVsb, GNorm * width * LNorm); - CMPLX_MULT_SELF_SCALAR(yAc->yIdVgb, GNorm * width * LNorm); - CMPLX_MULT_SELF_SCALAR(yAc->yIsVdb, GNorm * width * LNorm); - CMPLX_MULT_SELF_SCALAR(yAc->yIsVsb, GNorm * width * LNorm); - CMPLX_MULT_SELF_SCALAR(yAc->yIsVgb, GNorm * width * LNorm); - CMPLX_MULT_SELF_SCALAR(yAc->yIgVdb, GNorm * width * LNorm); - CMPLX_MULT_SELF_SCALAR(yAc->yIgVsb, GNorm * width * LNorm); - CMPLX_MULT_SELF_SCALAR(yAc->yIgVgb, GNorm * width * LNorm); - pDevice->pStats->miscTime[STAT_AC] += SPfrontEnd->IFseconds() - startTime; - - return (AcAnalysisMethod); -} - -BOOLEAN -TWOsorSolve(TWOdevice *pDevice, double *xReal, double *xImag, - double omega) -{ - double dxdy; - double wRelax = 1.0; /* SOR relaxation parameter */ - double *rhsReal = pDevice->rhs; - double *rhsSOR = pDevice->rhsImag; - BOOLEAN SORConverged = FALSE; - BOOLEAN SORFailed = FALSE; - int numEqns = pDevice->numEqns; - int iterationNum; - int indexN, indexP; - int index, eIndex; - TWOnode *pNode; - TWOelem *pElem; - - /* clear xReal and xImag arrays */ - for (index = 1; index <= numEqns; index++) { - xReal[index] = 0.0; - xImag[index] = 0.0; - } - - iterationNum = 1; - for (; (!SORConverged) &&(!SORFailed); iterationNum++) { - for (index = 1; index <= numEqns; index++) { - rhsSOR[index] = 0.0; - } - for (eIndex = 1; eIndex <= pDevice->numElems; eIndex++) { - pElem = pDevice->elements[eIndex]; - dxdy = 0.25 * pElem->dx * pElem->dy; - for (index = 0; index <= 3; index++) { - pNode = pElem->pNodes[index]; - if ((pNode->nodeType != CONTACT) && (pElem->elemType == SEMICON)) { - if (!OneCarrier) { - indexN = pNode->nEqn; - indexP = pNode->pEqn; - rhsSOR[indexN] -= dxdy * omega * xImag[indexN]; - rhsSOR[indexP] += dxdy * omega * xImag[indexP]; - } else if (OneCarrier == N_TYPE) { - indexN = pNode->nEqn; - rhsSOR[indexN] -= dxdy * omega * xImag[indexN]; - } else if (OneCarrier == P_TYPE) { - indexP = pNode->pEqn; - rhsSOR[indexP] += dxdy * omega * xImag[indexP]; - } - } - } - } - - /* now add the terms from rhs to rhsImag */ - for (index = 1; index <= numEqns; index++) { - rhsSOR[index] += rhsReal[index]; - } - - /* compute xReal(k+1). solution stored in rhsImag */ - spSolve(pDevice->matrix, rhsSOR, rhsSOR, NULL, NULL); - /* modify solution when wRelax is not 1 */ - if (wRelax != 1) { - for (index = 1; index <= numEqns; index++) { - rhsSOR[index] = (1 - wRelax) * xReal[index] + - wRelax * rhsSOR[index]; - } - } - if (iterationNum > 1) { - SORConverged = hasSORConverged(xReal, rhsSOR, numEqns); - } - /* copy real solution into xReal */ - for (index = 1; index <= numEqns; index++) { - xReal[index] = rhsSOR[index]; - } - - /* now compute the imaginary part of the solution xImag */ - for (index = 1; index <= numEqns; index++) { - rhsSOR[index] = 0.0; - } - for (eIndex = 1; eIndex <= pDevice->numElems; eIndex++) { - pElem = pDevice->elements[eIndex]; - dxdy = 0.25 * pElem->dx * pElem->dy; - for (index = 0; index <= 3; index++) { - pNode = pElem->pNodes[index]; - if ((pNode->nodeType != CONTACT) && (pElem->elemType == SEMICON)) { - if (!OneCarrier) { - indexN = pNode->nEqn; - indexP = pNode->pEqn; - rhsSOR[indexN] += dxdy * omega * xReal[indexN]; - rhsSOR[indexP] -= dxdy * omega * xReal[indexP]; - } else if (OneCarrier == N_TYPE) { - indexN = pNode->nEqn; - rhsSOR[indexN] += dxdy * omega * xReal[indexN]; - } else if (OneCarrier == P_TYPE) { - indexP = pNode->pEqn; - rhsSOR[indexP] -= dxdy * omega * xReal[indexP]; - } - } - } - } - /* compute xImag(k+1) */ - spSolve(pDevice->matrix, rhsSOR, rhsSOR, NULL, NULL); - /* modify solution when wRelax is not 1 */ - if (wRelax != 1) { - for (index = 1; index <= numEqns; index++) { - rhsSOR[index] = (1 - wRelax) * xImag[index] + - wRelax * rhsSOR[index]; - } - } - if (iterationNum > 1) { - SORConverged = SORConverged && hasSORConverged(xImag, rhsSOR, numEqns); - } - /* copy imag solution into xImag */ - for (index = 1; index <= numEqns; index++) { - xImag[index] = rhsSOR[index]; - } - if ((iterationNum > 4) && !SORConverged) { - SORFailed = TRUE; - } - if (TWOacDebug) - printf("SOR iteration number = %d\n", iterationNum); - } - return (SORFailed); -} - - -SPcomplex * -contactAdmittance(TWOdevice *pDevice, TWOcontact *pContact, BOOLEAN delVContact, - double *xReal, double *xImag, SPcomplex *cOmega) -{ - TWOnode *pNode, *pHNode = NULL, *pVNode = NULL; - TWOedge *pHEdge = NULL, *pVEdge = NULL; - int index, i, indexPsi, indexN, indexP, numContactNodes; - TWOelem *pElem; - SPcomplex psiAc, nAc, pAc; - SPcomplex prod1, prod2, sum; - double temp; - - NG_IGNORE(pDevice); - - CMPLX_ASSIGN_VALUE(yTotal, 0.0, 0.0); - - numContactNodes = pContact->numNodes; - for (index = 0; index < numContactNodes; index++) { - pNode = pContact->pNodes[index]; - for (i = 0; i <= 3; i++) { - pElem = pNode->pElems[i]; - if (pElem != NULL) { - switch (i) { - case 0: - /* the TL element */ - pHNode = pElem->pBLNode; - pVNode = pElem->pTRNode; - pHEdge = pElem->pBotEdge; - pVEdge = pElem->pRightEdge; - if (pElem->elemType == SEMICON) { - /* compute the derivatives with n,p */ - if (pHNode->nodeType != CONTACT) { - indexN = pHNode->nEqn; - indexP = pHNode->pEqn; - CMPLX_ASSIGN_VALUE(nAc, xReal[indexN], xImag[indexN]); - CMPLX_ASSIGN_VALUE(pAc, xReal[indexP], xImag[indexP]); - CMPLX_MULT_SCALAR(prod1, nAc, pHEdge->dJnDn); - CMPLX_MULT_SCALAR(prod2, pAc, pHEdge->dJpDp); - CMPLX_ADD(sum, prod1, prod2); - CMPLX_MULT_SCALAR(prod1, sum, 0.5 * pElem->dy); - CMPLX_SUBT_ASSIGN(yTotal, prod1); - } - if (pVNode->nodeType != CONTACT) { - indexN = pVNode->nEqn; - indexP = pVNode->pEqn; - CMPLX_ASSIGN_VALUE(nAc, xReal[indexN], xImag[indexN]); - CMPLX_ASSIGN_VALUE(pAc, xReal[indexP], xImag[indexP]); - CMPLX_MULT_SCALAR(prod1, nAc, pVEdge->dJnDn); - CMPLX_MULT_SCALAR(prod2, pAc, pVEdge->dJpDp); - CMPLX_ADD(sum, prod1, prod2); - CMPLX_MULT_SCALAR(prod1, sum, 0.5 * pElem->dx); - CMPLX_SUBT_ASSIGN(yTotal, prod1); - } - } - break; - case 1: - /* the TR element */ - pHNode = pElem->pBRNode; - pVNode = pElem->pTLNode; - pHEdge = pElem->pBotEdge; - pVEdge = pElem->pLeftEdge; - if (pElem->elemType == SEMICON) { - /* compute the derivatives with n,p */ - if (pHNode->nodeType != CONTACT) { - indexN = pHNode->nEqn; - indexP = pHNode->pEqn; - CMPLX_ASSIGN_VALUE(nAc, xReal[indexN], xImag[indexN]); - CMPLX_ASSIGN_VALUE(pAc, xReal[indexP], xImag[indexP]); - CMPLX_MULT_SCALAR(prod1, nAc, pHEdge->dJnDnP1); - CMPLX_MULT_SCALAR(prod2, pAc, pHEdge->dJpDpP1); - CMPLX_ADD(sum, prod1, prod2); - CMPLX_MULT_SCALAR(prod1, sum, 0.5 * pElem->dy); - CMPLX_ADD_ASSIGN(yTotal, prod1); - } - if (pVNode->nodeType != CONTACT) { - indexN = pVNode->nEqn; - indexP = pVNode->pEqn; - CMPLX_ASSIGN_VALUE(nAc, xReal[indexN], xImag[indexN]); - CMPLX_ASSIGN_VALUE(pAc, xReal[indexP], xImag[indexP]); - CMPLX_MULT_SCALAR(prod1, nAc, pVEdge->dJnDn); - CMPLX_MULT_SCALAR(prod2, pAc, pVEdge->dJpDp); - CMPLX_ADD(sum, prod1, prod2); - CMPLX_MULT_SCALAR(prod1, sum, 0.5 * pElem->dx); - CMPLX_SUBT_ASSIGN(yTotal, prod1); - } - } - break; - case 2: - /* the BR element */ - pHNode = pElem->pTRNode; - pVNode = pElem->pBLNode; - pHEdge = pElem->pTopEdge; - pVEdge = pElem->pLeftEdge; - if (pElem->elemType == SEMICON) { - /* compute the derivatives with n,p */ - if (pHNode->nodeType != CONTACT) { - indexN = pHNode->nEqn; - indexP = pHNode->pEqn; - CMPLX_ASSIGN_VALUE(nAc, xReal[indexN], xImag[indexN]); - CMPLX_ASSIGN_VALUE(pAc, xReal[indexP], xImag[indexP]); - CMPLX_MULT_SCALAR(prod1, nAc, pHEdge->dJnDnP1); - CMPLX_MULT_SCALAR(prod2, pAc, pHEdge->dJpDpP1); - CMPLX_ADD(sum, prod1, prod2); - CMPLX_MULT_SCALAR(prod1, sum, 0.5 * pElem->dy); - CMPLX_ADD_ASSIGN(yTotal, prod1); - } - if (pVNode->nodeType != CONTACT) { - indexN = pVNode->nEqn; - indexP = pVNode->pEqn; - CMPLX_ASSIGN_VALUE(nAc, xReal[indexN], xImag[indexN]); - CMPLX_ASSIGN_VALUE(pAc, xReal[indexP], xImag[indexP]); - CMPLX_MULT_SCALAR(prod1, nAc, pVEdge->dJnDnP1); - CMPLX_MULT_SCALAR(prod2, pAc, pVEdge->dJpDpP1); - CMPLX_ADD(sum, prod1, prod2); - CMPLX_MULT_SCALAR(prod1, sum, 0.5 * pElem->dx); - CMPLX_ADD_ASSIGN(yTotal, prod1); - } - } - break; - case 3: - /* the BL element */ - pHNode = pElem->pTLNode; - pVNode = pElem->pBRNode; - pHEdge = pElem->pTopEdge; - pVEdge = pElem->pRightEdge; - if (pElem->elemType == SEMICON) { - /* compute the derivatives with n,p */ - if (pHNode->nodeType != CONTACT) { - indexN = pHNode->nEqn; - indexP = pHNode->pEqn; - CMPLX_ASSIGN_VALUE(nAc, xReal[indexN], xImag[indexN]); - CMPLX_ASSIGN_VALUE(pAc, xReal[indexP], xImag[indexP]); - CMPLX_MULT_SCALAR(prod1, nAc, pHEdge->dJnDn); - CMPLX_MULT_SCALAR(prod2, pAc, pHEdge->dJpDp); - CMPLX_ADD(sum, prod1, prod2); - CMPLX_MULT_SCALAR(prod1, sum, 0.5 * pElem->dy); - CMPLX_SUBT_ASSIGN(yTotal, prod1); - } - if (pVNode->nodeType != CONTACT) { - indexN = pVNode->nEqn; - indexP = pVNode->pEqn; - CMPLX_ASSIGN_VALUE(nAc, xReal[indexN], xImag[indexN]); - CMPLX_ASSIGN_VALUE(pAc, xReal[indexP], xImag[indexP]); - CMPLX_MULT_SCALAR(prod1, nAc, pVEdge->dJnDnP1); - CMPLX_MULT_SCALAR(prod2, pAc, pVEdge->dJpDpP1); - CMPLX_ADD(sum, prod1, prod2); - CMPLX_MULT_SCALAR(prod1, sum, 0.5 * pElem->dx); - CMPLX_ADD_ASSIGN(yTotal, prod1); - } - } - break; - } - if (pElem->elemType == SEMICON) { - if (pHNode->nodeType != CONTACT) { - indexPsi = pHNode->psiEqn; - CMPLX_ASSIGN_VALUE(psiAc, xReal[indexPsi], xImag[indexPsi]); - temp = 0.5 * pElem->dy * (pHEdge->dJnDpsiP1 + pHEdge->dJpDpsiP1); - CMPLX_MULT_SCALAR(prod1, psiAc, temp); - CMPLX_ADD_ASSIGN(yTotal, prod1); - if (delVContact) { - CMPLX_ADD_SELF_SCALAR(yTotal, -temp); - } - } - if (pVNode->nodeType != CONTACT) { - indexPsi = pVNode->psiEqn; - CMPLX_ASSIGN_VALUE(psiAc, xReal[indexPsi], xImag[indexPsi]); - temp = 0.5 * pElem->dx * (pVEdge->dJnDpsiP1 + pVEdge->dJpDpsiP1); - CMPLX_MULT_SCALAR(prod1, psiAc, temp); - CMPLX_ADD_ASSIGN(yTotal, prod1); - if (delVContact) { - CMPLX_ADD_SELF_SCALAR(yTotal, -temp); - } - } - } - /* displacement current terms */ - if (pHNode->nodeType != CONTACT) { - indexPsi = pHNode->psiEqn; - CMPLX_ASSIGN_VALUE(psiAc, xReal[indexPsi], xImag[indexPsi]); - CMPLX_MULT_SCALAR(prod1, *cOmega, pElem->epsRel * 0.5 * pElem->dyOverDx); - CMPLX_MULT(prod2, prod1, psiAc); - CMPLX_SUBT_ASSIGN(yTotal, prod2); - if (delVContact) { - CMPLX_ADD_ASSIGN(yTotal, prod1); - } - } - if (pVNode->nodeType != CONTACT) { - indexPsi = pVNode->psiEqn; - CMPLX_ASSIGN_VALUE(psiAc, xReal[indexPsi], xImag[indexPsi]); - CMPLX_MULT_SCALAR(prod1, *cOmega, pElem->epsRel * 0.5 * pElem->dxOverDy); - CMPLX_MULT(prod2, prod1, psiAc); - CMPLX_SUBT_ASSIGN(yTotal, prod2); - if (delVContact) { - CMPLX_ADD_ASSIGN(yTotal, prod1); - } - } - } - } - } - return (&yTotal); /* XXX */ -} - - -SPcomplex * -oxideAdmittance(TWOdevice *pDevice, TWOcontact *pContact, BOOLEAN delVContact, - double *xReal, double *xImag, SPcomplex *cOmega) -{ - TWOnode *pNode, *pHNode = NULL, *pVNode = NULL; - TWOedge *pHEdge, *pVEdge; - int index, i, indexPsi, numContactNodes; - TWOelem *pElem; - SPcomplex psiAc; - SPcomplex prod1, prod2; - - NG_IGNORE(pDevice); - - CMPLX_ASSIGN_VALUE(yTotal, 0.0, 0.0); - - numContactNodes = pContact->numNodes; - for (index = 0; index < numContactNodes; index++) { - pNode = pContact->pNodes[index]; - for (i = 0; i <= 3; i++) { - pElem = pNode->pElems[i]; - if (pElem != NULL) { - switch (i) { - case 0: - /* the TL element */ - pHNode = pElem->pBLNode; - pVNode = pElem->pTRNode; - pHEdge = pElem->pBotEdge; - pVEdge = pElem->pRightEdge; - break; - case 1: - /* the TR element */ - pHNode = pElem->pBRNode; - pVNode = pElem->pTLNode; - pHEdge = pElem->pBotEdge; - pVEdge = pElem->pLeftEdge; - break; - case 2: - /* the BR element */ - pHNode = pElem->pTRNode; - pVNode = pElem->pBLNode; - pHEdge = pElem->pTopEdge; - pVEdge = pElem->pLeftEdge; - break; - case 3: - /* the BL element */ - pHNode = pElem->pTLNode; - pVNode = pElem->pBRNode; - pHEdge = pElem->pTopEdge; - pVEdge = pElem->pRightEdge; - break; - } - /* displacement current terms */ - if (pHNode->nodeType != CONTACT) { - indexPsi = pHNode->psiEqn; - CMPLX_ASSIGN_VALUE(psiAc, xReal[indexPsi], xImag[indexPsi]); - CMPLX_MULT_SCALAR(prod1, *cOmega, pElem->epsRel * 0.5 * pElem->dyOverDx); - CMPLX_MULT(prod2, prod1, psiAc); - CMPLX_SUBT_ASSIGN(yTotal, prod2); - if (delVContact) { - CMPLX_ADD_ASSIGN(yTotal, prod1); - } - } - if (pVNode->nodeType != CONTACT) { - indexPsi = pVNode->psiEqn; - CMPLX_ASSIGN_VALUE(psiAc, xReal[indexPsi], xImag[indexPsi]); - CMPLX_MULT_SCALAR(prod1, *cOmega, pElem->epsRel * 0.5 * pElem->dxOverDy); - CMPLX_MULT(prod2, prod1, psiAc); - CMPLX_SUBT_ASSIGN(yTotal, prod2); - if (delVContact) { - CMPLX_ADD_ASSIGN(yTotal, prod1); - } - } - } - } - } - return (&yTotal); -} - -void -NUMD2ys(TWOdevice *pDevice, SPcomplex *s, SPcomplex *yIn) -{ - TWOnode *pNode; - TWOelem *pElem; - int index, eIndex; - double dxdy; - double *solnReal, *solnImag; - double *rhsReal, *rhsImag; - SPcomplex yAc, *y; - BOOLEAN deltaVContact = FALSE; - SPcomplex temp, cOmega; - - /* - * change context names of solution vectors for ac analysis dcDeltaSolution - * stores the real part and copiedSolution stores the imaginary part of the - * ac solution vector - */ - pDevice->solverType = SLV_SMSIG; - rhsReal = pDevice->rhs; - rhsImag = pDevice->rhsImag; - solnReal = pDevice->dcDeltaSolution; - solnImag = pDevice->copiedSolution; - - /* use a normalized radian frequency */ - CMPLX_MULT_SCALAR(cOmega, *s, TNorm); - for (index = 1; index <= pDevice->numEqns; index++) { - rhsImag[index] = 0.0; - } - /* solve the system of equations directly */ - if (!OneCarrier) { - TWO_jacLoad(pDevice); - } else if (OneCarrier == N_TYPE) { - TWONjacLoad(pDevice); - } else if (OneCarrier == P_TYPE) { - TWOPjacLoad(pDevice); - } - storeNewRhs(pDevice, pDevice->pLastContact); - - spSetComplex(pDevice->matrix); - for (eIndex = 1; eIndex <= pDevice->numElems; eIndex++) { - pElem = pDevice->elements[eIndex]; - if (pElem->elemType == SEMICON) { - dxdy = 0.25 * pElem->dx * pElem->dy; - for (index = 0; index <= 3; index++) { - pNode = pElem->pNodes[index]; - if (pNode->nodeType != CONTACT) { - if (!OneCarrier) { - CMPLX_MULT_SCALAR(temp, cOmega, dxdy); - spADD_COMPLEX_ELEMENT(pNode->fNN, -temp.real, -temp.imag); - spADD_COMPLEX_ELEMENT(pNode->fPP, temp.real, temp.imag); - } else if (OneCarrier == N_TYPE) { - CMPLX_MULT_SCALAR(temp, cOmega, dxdy); - spADD_COMPLEX_ELEMENT(pNode->fNN, -temp.real, -temp.imag); - } else if (OneCarrier == P_TYPE) { - CMPLX_MULT_SCALAR(temp, cOmega, dxdy); - spADD_COMPLEX_ELEMENT(pNode->fPP, temp.real, temp.imag); - } - } - } - } - } - - spFactor(pDevice->matrix); - spSolve(pDevice->matrix, rhsReal, solnReal, rhsImag, solnImag); - y = contactAdmittance(pDevice, pDevice->pFirstContact, deltaVContact, - solnReal, solnImag, &cOmega); - CMPLX_ASSIGN_VALUE(yAc, y->real, y->imag); - CMPLX_ASSIGN(*yIn, yAc); - CMPLX_NEGATE_SELF(*yIn); - CMPLX_MULT_SELF_SCALAR(*yIn, GNorm * pDevice->width * LNorm); -} - - -void -NBJT2ys(TWOdevice *pDevice, SPcomplex *s, SPcomplex *yIeVce, SPcomplex *yIcVce, - SPcomplex *yIeVbe, SPcomplex *yIcVbe) -{ - TWOcontact *pEmitContact = pDevice->pLastContact; - TWOcontact *pColContact = pDevice->pFirstContact; - TWOcontact *pBaseContact = pDevice->pFirstContact->next; - TWOnode *pNode; - TWOelem *pElem; - int index, eIndex; - double width = pDevice->width; - double dxdy; - double *solnReal, *solnImag; - double *rhsReal, *rhsImag; - SPcomplex *y; - SPcomplex pIeVce, pIcVce, pIeVbe, pIcVbe; - SPcomplex temp, cOmega; - - pDevice->solverType = SLV_SMSIG; - rhsReal = pDevice->rhs; - rhsImag = pDevice->rhsImag; - solnReal = pDevice->dcDeltaSolution; - solnImag = pDevice->copiedSolution; - - /* use a normalized radian frequency */ - CMPLX_MULT_SCALAR(cOmega, *s, TNorm); - - for (index = 1; index <= pDevice->numEqns; index++) { - rhsImag[index] = 0.0; - } - /* solve the system of equations directly */ - if (!OneCarrier) { - TWO_jacLoad(pDevice); - } else if (OneCarrier == N_TYPE) { - TWONjacLoad(pDevice); - } else if (OneCarrier == P_TYPE) { - TWOPjacLoad(pDevice); - } - storeNewRhs(pDevice, pColContact); - spSetComplex(pDevice->matrix); - for (eIndex = 1; eIndex <= pDevice->numElems; eIndex++) { - pElem = pDevice->elements[eIndex]; - if (pElem->elemType == SEMICON) { - dxdy = 0.25 * pElem->dx * pElem->dy; - for (index = 0; index <= 3; index++) { - pNode = pElem->pNodes[index]; - if (pNode->nodeType != CONTACT) { - if (!OneCarrier) { - CMPLX_MULT_SCALAR(temp, cOmega, dxdy); - spADD_COMPLEX_ELEMENT(pNode->fNN, -temp.real, -temp.imag); - spADD_COMPLEX_ELEMENT(pNode->fPP, temp.real, temp.imag); - } else if (OneCarrier == N_TYPE) { - CMPLX_MULT_SCALAR(temp, cOmega, dxdy); - spADD_COMPLEX_ELEMENT(pNode->fNN, -temp.real, -temp.imag); - } else if (OneCarrier == P_TYPE) { - CMPLX_MULT_SCALAR(temp, cOmega, dxdy); - spADD_COMPLEX_ELEMENT(pNode->fPP, temp.real, temp.imag); - } - } - } - } - } - spFactor(pDevice->matrix); - spSolve(pDevice->matrix, rhsReal, solnReal, rhsImag, solnImag); - - y = contactAdmittance(pDevice, pEmitContact, FALSE, - solnReal, solnImag, &cOmega); - CMPLX_ASSIGN_VALUE(pIeVce, y->real, y->imag); - y = contactAdmittance(pDevice, pColContact, TRUE, - solnReal, solnImag, &cOmega); - CMPLX_ASSIGN_VALUE(pIcVce, y->real, y->imag); - for (index = 1; index <= pDevice->numEqns; index++) { - rhsImag[index] = 0.0; - } - storeNewRhs(pDevice, pBaseContact); - /* don't need to LU factor the jacobian since it exists */ - spSolve(pDevice->matrix, rhsReal, solnReal, rhsImag, solnImag); - y = contactAdmittance(pDevice, pEmitContact, FALSE, - solnReal, solnImag, &cOmega); - CMPLX_ASSIGN_VALUE(pIeVbe, y->real, y->imag); - y = contactAdmittance(pDevice, pColContact, FALSE, - solnReal, solnImag, &cOmega); - CMPLX_ASSIGN_VALUE(pIcVbe, y->real, y->imag); - - - CMPLX_ASSIGN(*yIeVce, pIeVce); - CMPLX_ASSIGN(*yIeVbe, pIeVbe); - CMPLX_ASSIGN(*yIcVce, pIcVce); - CMPLX_ASSIGN(*yIcVbe, pIcVbe); - CMPLX_MULT_SELF_SCALAR(*yIeVce, GNorm * width * LNorm); - CMPLX_MULT_SELF_SCALAR(*yIeVbe, GNorm * width * LNorm); - CMPLX_MULT_SELF_SCALAR(*yIcVce, GNorm * width * LNorm); - CMPLX_MULT_SELF_SCALAR(*yIcVbe, GNorm * width * LNorm); -} - -void -NUMOSys(TWOdevice *pDevice, SPcomplex *s, struct mosAdmittances *yAc) -{ - TWOcontact *pDContact = pDevice->pFirstContact; - TWOcontact *pGContact = pDevice->pFirstContact->next; - TWOcontact *pSContact = pDevice->pFirstContact->next->next; -/* TWOcontact *pBContact = pDevice->pLastContact; */ - TWOnode *pNode; - TWOelem *pElem; - int index, eIndex; - double width = pDevice->width; - double dxdy; - double *rhsReal, *rhsImag; - double *solnReal, *solnImag; - SPcomplex *y; - SPcomplex temp, cOmega; - - pDevice->solverType = SLV_SMSIG; - rhsReal = pDevice->rhs; - rhsImag = pDevice->rhsImag; - solnReal = pDevice->dcDeltaSolution; - solnImag = pDevice->copiedSolution; - - /* use a normalized radian frequency */ - CMPLX_MULT_SCALAR(cOmega, *s, TNorm); - for (index = 1; index <= pDevice->numEqns; index++) { - rhsImag[index] = 0.0; - } - /* solve the system of equations directly */ - if (!OneCarrier) { - TWO_jacLoad(pDevice); - } else if (OneCarrier == N_TYPE) { - TWONjacLoad(pDevice); - } else if (OneCarrier == P_TYPE) { - TWOPjacLoad(pDevice); - } - storeNewRhs(pDevice, pDContact); - spSetComplex(pDevice->matrix); - - for (eIndex = 1; eIndex <= pDevice->numElems; eIndex++) { - pElem = pDevice->elements[eIndex]; - if (pElem->elemType == SEMICON) { - dxdy = 0.25 * pElem->dx * pElem->dy; - for (index = 0; index <= 3; index++) { - pNode = pElem->pNodes[index]; - if (pNode->nodeType != CONTACT) { - if (!OneCarrier) { - CMPLX_MULT_SCALAR(temp, cOmega, dxdy); - spADD_COMPLEX_ELEMENT(pNode->fNN, -temp.real, -temp.imag); - spADD_COMPLEX_ELEMENT(pNode->fPP, temp.real, temp.imag); - } else if (OneCarrier == N_TYPE) { - CMPLX_MULT_SCALAR(temp, cOmega, dxdy); - spADD_COMPLEX_ELEMENT(pNode->fNN, -temp.real, -temp.imag); - } else if (OneCarrier == P_TYPE) { - CMPLX_MULT_SCALAR(temp, cOmega, dxdy); - spADD_COMPLEX_ELEMENT(pNode->fPP, temp.real, temp.imag); - } - } - } - } - } - - spFactor(pDevice->matrix); - spSolve(pDevice->matrix, rhsReal, solnReal, rhsImag, solnImag); - - y = contactAdmittance(pDevice, pDContact, TRUE, - solnReal, solnImag, &cOmega); - CMPLX_ASSIGN_VALUE(yAc->yIdVdb, y->real, y->imag); - y = contactAdmittance(pDevice, pSContact, FALSE, - solnReal, solnImag, &cOmega); - CMPLX_ASSIGN_VALUE(yAc->yIsVdb, y->real, y->imag); - y = GateTypeAdmittance(pDevice, pGContact, FALSE, - solnReal, solnImag, &cOmega); - CMPLX_ASSIGN_VALUE(yAc->yIgVdb, y->real, y->imag); - - for (index = 1; index <= pDevice->numEqns; index++) { - rhsImag[index] = 0.0; - } - storeNewRhs(pDevice, pSContact); - /* don't need to LU factor the jacobian since it exists */ - spSolve(pDevice->matrix, rhsReal, solnReal, rhsImag, solnImag); - y = contactAdmittance(pDevice, pDContact, FALSE, - solnReal, solnImag, &cOmega); - CMPLX_ASSIGN_VALUE(yAc->yIdVsb, y->real, y->imag); - y = contactAdmittance(pDevice, pSContact, TRUE, - solnReal, solnImag, &cOmega); - CMPLX_ASSIGN_VALUE(yAc->yIsVsb, y->real, y->imag); - y = GateTypeAdmittance(pDevice, pGContact, FALSE, - solnReal, solnImag, &cOmega); - CMPLX_ASSIGN_VALUE(yAc->yIgVsb, y->real, y->imag); - for (index = 1; index <= pDevice->numEqns; index++) { - rhsImag[index] = 0.0; - } - storeNewRhs(pDevice, pGContact); - spSolve(pDevice->matrix, rhsReal, solnReal, rhsImag, solnImag); - y = contactAdmittance(pDevice, pDContact, FALSE, - solnReal, solnImag, &cOmega); - CMPLX_ASSIGN_VALUE(yAc->yIdVgb, y->real, y->imag); - y = contactAdmittance(pDevice, pSContact, FALSE, - solnReal, solnImag, &cOmega); - CMPLX_ASSIGN_VALUE(yAc->yIsVgb, y->real, y->imag); - y = GateTypeAdmittance(pDevice, pGContact, TRUE, - solnReal, solnImag, &cOmega); - CMPLX_ASSIGN_VALUE(yAc->yIgVgb, y->real, y->imag); - - CMPLX_MULT_SELF_SCALAR(yAc->yIdVdb, GNorm * width * LNorm); - CMPLX_MULT_SELF_SCALAR(yAc->yIdVsb, GNorm * width * LNorm); - CMPLX_MULT_SELF_SCALAR(yAc->yIdVgb, GNorm * width * LNorm); - CMPLX_MULT_SELF_SCALAR(yAc->yIsVdb, GNorm * width * LNorm); - CMPLX_MULT_SELF_SCALAR(yAc->yIsVsb, GNorm * width * LNorm); - CMPLX_MULT_SELF_SCALAR(yAc->yIsVgb, GNorm * width * LNorm); - CMPLX_MULT_SELF_SCALAR(yAc->yIgVdb, GNorm * width * LNorm); - CMPLX_MULT_SELF_SCALAR(yAc->yIgVsb, GNorm * width * LNorm); - CMPLX_MULT_SELF_SCALAR(yAc->yIgVgb, GNorm * width * LNorm); -} diff --git a/src/ciderlib/twod/twoaval.c b/src/ciderlib/twod/twoaval.c deleted file mode 100644 index 57e543f9e..000000000 --- a/src/ciderlib/twod/twoaval.c +++ /dev/null @@ -1,208 +0,0 @@ -/********** -Copyright 1991 Regents of the University of California. All rights reserved. -Author: 1987 Kartikeya Mayaram, U. C. Berkeley CAD Group -Author: 1990 David A. Gates, U. C. Berkeley CAD Group -**********/ - -#include "ngspice/ngspice.h" -#include "ngspice/numglobs.h" -#include "ngspice/numenum.h" -#include "ngspice/twomesh.h" -#include "twoddefs.h" -#include "twodext.h" - - -double -TWOavalanche(TWOelem *pElem, TWOnode *pNode) -{ - - TWOelem *pElemTL, *pElemTR, *pElemBL, *pElemBR; - TWOedge *pEdgeT, *pEdgeB, *pEdgeL, *pEdgeR; - int materT = 0 , materB = 0, materL = 0 , materR = 0; - double dxL = 0.0, dxR = 0.0, dyT = 0.0, dyB = 0.0; - double ef1, ef2, coeff1, coeff2; - double enx, eny, epx, epy, jnx, jny, jpx, jpy; - double current, eField; - double generation = 0.0; - double eiip2 = 4.0e5 / ENorm; - double aiip2 = 6.71e5 * LNorm; - double biip2 = 1.693e6 / ENorm; - TWOmaterial *info = pElem->matlInfo; - - /* Find all four neighboring elements */ - pElemTL = pNode->pTLElem; - pElemTR = pNode->pTRElem; - pElemBL = pNode->pBLElem; - pElemBR = pNode->pBRElem; - - /* Null edge pointers */ - pEdgeT = pEdgeB = pEdgeL = pEdgeR = NULL; - - /* Find edges next to node */ - if ( pElemTL != NULL ) { - if (pElemTL->evalEdges[1]) { - pEdgeT = pElemTL->pRightEdge; - materT = pElemTL->elemType; - dyT = pElemTL->dy; - } - if (pElemTL->evalEdges[2]) { - pEdgeL = pElemTL->pBotEdge; - materL = pElemTL->elemType; - dxL = pElemTL->dx; - } - } - if ( pElemTR != NULL ) { - if (pElemTR->evalEdges[3]) { - pEdgeT = pElemTR->pLeftEdge; - materT = pElemTR->elemType; - dyT = pElemTR->dy; - } - if (pElemTR->evalEdges[2]) { - pEdgeR = pElemTR->pBotEdge; - materR = pElemTR->elemType; - dxR = pElemTR->dx; - } - } - if ( pElemBR != NULL ) { - if (pElemBR->evalEdges[3]) { - pEdgeB = pElemBR->pLeftEdge; - materB = pElemBR->elemType; - dyB = pElemBR->dy; - } - if (pElemBR->evalEdges[0]) { - pEdgeR = pElemBR->pTopEdge; - materR = pElemBR->elemType; - dxR = pElemBR->dx; - } - } - if ( pElemBL != NULL ) { - if (pElemBL->evalEdges[1]) { - pEdgeB = pElemBL->pRightEdge; - materB = pElemBL->elemType; - dyB = pElemBL->dy; - } - if (pElemBL->evalEdges[0]) { - pEdgeL = pElemBL->pTopEdge; - materL = pElemBL->elemType; - dxL = pElemBL->dx; - } - } - - /* compute horizontal vector components */ - /* No more than one of Left Edge or Right Edge is absent */ - /* If one is absent the other is guaranteed to be from silicon */ - if (pEdgeL == NULL) { - if ( pNode->nodeType == CONTACT ) { - enx = -(pEdgeR->dPsi + pEdgeR->dCBand) / dxR; - epx = -(pEdgeR->dPsi - pEdgeR->dVBand) / dxR; - jnx = pEdgeR->jn; - jpx = pEdgeR->jp; - } else { - enx = 0.0; - epx = 0.0; - jnx = 0.0; - jpx = 0.0; - } - } else if (pEdgeR == NULL) { - if ( pNode->nodeType == CONTACT ) { - enx = -(pEdgeL->dPsi + pEdgeL->dCBand) / dxL; - epx = -(pEdgeL->dPsi - pEdgeL->dVBand) / dxL; - jnx = pEdgeL->jn; - jpx = pEdgeL->jp; - } else { - enx = 0.0; - epx = 0.0; - jnx = 0.0; - jpx = 0.0; - } - } else { /* Both edges are present */ - coeff1 = dxL / (dxL + dxR); - coeff2 = dxR / (dxL + dxR); - ef1 = -(pEdgeL->dPsi + pEdgeL->dCBand) / dxL; - ef2 = -(pEdgeR->dPsi + pEdgeR->dCBand) / dxR; - enx = coeff2 * ef1 + coeff1 * ef2; - ef1 = -(pEdgeL->dPsi - pEdgeL->dVBand) / dxL; - ef2 = -(pEdgeR->dPsi - pEdgeR->dVBand) / dxR; - epx = coeff2 * ef1 + coeff1 * ef2; - if ( (materL == INSULATOR) || (materR == INSULATOR) ) { - jnx = 0.0; - jpx = 0.0; - } else { - jnx = coeff2 * pEdgeL->jn + coeff1 * pEdgeR->jn; - jpx = coeff2 * pEdgeL->jp + coeff1 * pEdgeR->jp; - } - } - - /* compute vertical vector components */ - /* No more than one of Top Edge or Bottom Edge is absent */ - /* If one is absent the other is guaranteed to be from silicon */ - if (pEdgeT == NULL) { - if ( pNode->nodeType == CONTACT ) { - eny = -(pEdgeB->dPsi + pEdgeB->dCBand) / dyB; - epy = -(pEdgeB->dPsi - pEdgeB->dVBand) / dyB; - jny = pEdgeB->jn; - jpy = pEdgeB->jp; - } else { - eny = 0.0; - epy = 0.0; - jny = 0.0; - jpy = 0.0; - } - } else if (pEdgeB == NULL) { - if ( pNode->nodeType == CONTACT ) { - eny = -(pEdgeT->dPsi + pEdgeT->dCBand) / dyT; - epy = -(pEdgeT->dPsi - pEdgeT->dVBand) / dyT; - jny = pEdgeT->jn; - jpy = pEdgeT->jp; - } else { - eny = 0.0; - epy = 0.0; - jny = 0.0; - jpy = 0.0; - } - } else { /* Both edges are present */ - coeff1 = dyT / (dyT + dyB); - coeff2 = dyB / (dyT + dyB); - ef1 = -(pEdgeT->dPsi + pEdgeT->dCBand) / dyT; - ef2 = -(pEdgeB->dPsi + pEdgeB->dCBand) / dyB; - eny = coeff2 * ef1 + coeff1 * ef2; - ef1 = -(pEdgeT->dPsi - pEdgeT->dVBand) / dyT; - ef2 = -(pEdgeB->dPsi - pEdgeB->dVBand) / dyB; - epy = coeff2 * ef1 + coeff1 * ef2; - if ( (materT == INSULATOR) || (materB == INSULATOR) ) { - jny = 0.0; - jpy = 0.0; - } else { - jny = coeff2 * pEdgeT->jn + coeff1 * pEdgeB->jn; - jpy = coeff2 * pEdgeT->jp + coeff1 * pEdgeB->jp; - } - } - -/* - fprintf(stderr,"%% en = (%9.2e,%9.2e), jn = (%9.2e,%9.2e)\n", - enx,eny,jnx,jny); - fprintf(stderr,"%% ep = (%9.2e,%9.2e), jp = (%9.2e,%9.2e)\n", - epx,epy,jpx,jpy); -*/ - - /* now calculate the avalanche generation rate */ - current = hypot(jnx, jny); - if ( current != 0.0 ) { - eField = (enx * jnx + eny * jny) / current; - if ( (eField > 0) && ( info->bii[ELEC] / eField <= 80.0) ) { - generation += current * info->aii[ELEC] - * exp( - info->bii[ELEC] / eField ); - } - } - current = hypot(jpx, jpy); - if ( current != 0.0 ) { - eField = (epx * jpx + epy * jpy) / current; - if ( eField > eiip2 ) { - generation += current * aiip2 * exp( - biip2 / eField ); - } else if ( (eField > 0) && ( info->bii[HOLE] / eField <= 80.0) ) { - generation += current * info->aii[HOLE] - * exp( - info->bii[HOLE] / eField ); - } - } - return( generation ); -} diff --git a/src/ciderlib/twod/twocond.c b/src/ciderlib/twod/twocond.c deleted file mode 100644 index cd717b535..000000000 --- a/src/ciderlib/twod/twocond.c +++ /dev/null @@ -1,611 +0,0 @@ -/********** -Copyright 1991 Regents of the University of California. All rights reserved. -Author: 1987 Kartikeya Mayaram, U. C. Berkeley CAD Group -**********/ - -/* Functions to compute terminal conductances & currents. */ - -#include "ngspice/ngspice.h" -#include "ngspice/numglobs.h" -#include "ngspice/numenum.h" -#include "ngspice/twomesh.h" -#include "ngspice/twodev.h" -#include "ngspice/bool.h" -#include "ngspice/spmatrix.h" -#include "twoddefs.h" -#include "twodext.h" - - -void - NUMD2conductance(TWOdevice *pDevice, BOOLEAN tranAnalysis, - double *intCoeff, double *gd) -{ - TWOcontact *pContact = pDevice->pFirstContact; - double *incVpn; - BOOLEAN deltaVContact = FALSE; - - /* - * store the new rhs for computing the incremental quantities - * with the second to last node. solve the system of equations - */ - incVpn = pDevice->dcDeltaSolution; - storeNewRhs( pDevice, pDevice->pLastContact ); - spSolve( pDevice->matrix, pDevice->rhs, incVpn, NULL, NULL); - - incVpn = pDevice->dcDeltaSolution; - *gd = contactConductance( pDevice, pContact, deltaVContact, incVpn, - tranAnalysis, intCoeff ); - *gd *= - GNorm * pDevice->width * LNorm; -} - -void - NBJT2conductance(TWOdevice *pDevice, BOOLEAN tranAnalysis, - double *intCoeff, double *dIeDVce, double *dIcDVce, - double *dIeDVbe, double *dIcDVbe) -{ - TWOcontact *pEmitContact = pDevice->pLastContact; - TWOcontact *pColContact = pDevice->pFirstContact; - TWOcontact *pBaseContact = pDevice->pFirstContact->next; - double width = pDevice->width; - double *incVce, *incVbe; - - /* - * store the new rhs for computing the incremental quantities - * incVce (dcDeltaSolution) and incVbe (copiedSolution) are used to - * store the incremental quantities associated with Vce and Vbe - */ - - incVce = pDevice->dcDeltaSolution; - incVbe = pDevice->copiedSolution; - storeNewRhs( pDevice, pColContact ); - spSolve( pDevice->matrix, pDevice->rhs, incVce, NULL, NULL); - storeNewRhs( pDevice, pBaseContact ); - spSolve( pDevice->matrix, pDevice->rhs, incVbe, NULL, NULL); - - *dIeDVce = contactConductance( pDevice, pEmitContact, FALSE, incVce, - tranAnalysis, intCoeff ); - *dIeDVbe = contactConductance( pDevice, pEmitContact, FALSE, incVbe, - tranAnalysis, intCoeff ); - - *dIcDVce = contactConductance( pDevice, pColContact, TRUE, incVce, - tranAnalysis, intCoeff ); - *dIcDVbe = contactConductance( pDevice, pColContact, FALSE, incVbe, - tranAnalysis, intCoeff ); - *dIeDVce *= GNorm * width * LNorm; - *dIcDVce *= GNorm * width * LNorm; - *dIeDVbe *= GNorm * width * LNorm; - *dIcDVbe *= GNorm * width * LNorm; -} - -void - NUMOSconductance(TWOdevice *pDevice, BOOLEAN tranAnalysis, double *intCoeff, - struct mosConductances *dIdV) -{ - TWOcontact *pDContact = pDevice->pFirstContact; - TWOcontact *pGContact = pDevice->pFirstContact->next; - TWOcontact *pSContact = pDevice->pFirstContact->next->next; - double width = pDevice->width; - double *incVdb, *incVsb, *incVgb; - - /* - * store the new rhs for computing the incremental quantities - * incVdb (dcDeltaSolution) - */ - - incVdb = pDevice->dcDeltaSolution; - incVsb = pDevice->copiedSolution; - incVgb = pDevice->rhsImag; - storeNewRhs( pDevice, pDContact ); - spSolve( pDevice->matrix, pDevice->rhs, incVdb, NULL, NULL); - storeNewRhs( pDevice, pSContact ); - spSolve( pDevice->matrix, pDevice->rhs, incVsb, NULL, NULL); - storeNewRhs( pDevice, pGContact ); - spSolve( pDevice->matrix, pDevice->rhs, incVgb, NULL, NULL); - - dIdV->dIdDVdb = contactConductance( pDevice, pDContact, TRUE, - incVdb, tranAnalysis, intCoeff ); - dIdV->dIsDVdb = contactConductance( pDevice, pSContact, FALSE, - incVdb, tranAnalysis, intCoeff ); - dIdV->dIgDVdb = GateTypeConductance( pDevice, pGContact, FALSE, - incVdb, tranAnalysis, intCoeff ); - dIdV->dIdDVsb = contactConductance( pDevice, pDContact, FALSE, - incVsb, tranAnalysis, intCoeff ); - dIdV->dIsDVsb = contactConductance( pDevice, pSContact, TRUE, - incVsb, tranAnalysis, intCoeff ); - dIdV->dIgDVsb = GateTypeConductance( pDevice, pGContact, FALSE, - incVsb, tranAnalysis, intCoeff ); - dIdV->dIdDVgb = contactConductance( pDevice, pDContact, FALSE, - incVgb, tranAnalysis, intCoeff ); - dIdV->dIsDVgb = contactConductance( pDevice, pSContact, FALSE, - incVgb, tranAnalysis, intCoeff ); - dIdV->dIgDVgb = GateTypeConductance( pDevice, pGContact, TRUE, - incVgb, tranAnalysis, intCoeff ); - - dIdV->dIdDVdb *= GNorm * width * LNorm; - dIdV->dIdDVsb *= GNorm * width * LNorm; - dIdV->dIdDVgb *= GNorm * width * LNorm; - dIdV->dIsDVdb *= GNorm * width * LNorm; - dIdV->dIsDVsb *= GNorm * width * LNorm; - dIdV->dIsDVgb *= GNorm * width * LNorm; - dIdV->dIgDVdb *= GNorm * width * LNorm; - dIdV->dIgDVsb *= GNorm * width * LNorm; - dIdV->dIgDVgb *= GNorm * width * LNorm; - -} - -double - contactCurrent(TWOdevice *pDevice, TWOcontact *pContact) -{ - /* computes the current through the contact given in pContact */ - int index, i, numContactNodes; - TWOnode *pNode; - TWOelem *pElem; - TWOedge *pHEdge, *pVEdge; - double dx, dy; - double jTotal = 0.0; - - numContactNodes = pContact->numNodes; - for ( index = 0; index < numContactNodes; index++ ) { - pNode = pContact->pNodes[ index ]; - for ( i = 0; i <= 3; i++ ) { - pElem = pNode->pElems[ i ]; - if ( pElem != NULL ) { - dx = 0.5 * pElem->dx; - dy = 0.5 * pElem->dy; - switch ( i ) { - case 0: - /* Bottom Right node */ - pHEdge = pElem->pBotEdge; - pVEdge = pElem->pRightEdge; - jTotal += pElem->epsRel * ( -dy * pHEdge->jd - dx * pVEdge->jd ); - if ( pElem->elemType == SEMICON ) { - jTotal += -dy * (pHEdge->jn + pHEdge->jp) - -dx * (pVEdge->jn + pVEdge->jp); - } - break; - case 1: - /* Bottom Left node */ - pHEdge = pElem->pBotEdge; - pVEdge = pElem->pLeftEdge; - jTotal += pElem->epsRel * ( dy * pHEdge->jd - dx * pVEdge->jd ); - if ( pElem->elemType == SEMICON ) { - jTotal += dy * (pHEdge->jn + pHEdge->jp) - -dx * (pVEdge->jn + pVEdge->jp); - } - break; - case 2: - /* Top Left node */ - pHEdge = pElem->pTopEdge; - pVEdge = pElem->pLeftEdge; - jTotal += pElem->epsRel * ( dy * pHEdge->jd + dx * pVEdge->jd ); - if ( pElem->elemType == SEMICON ) { - jTotal += dy * (pHEdge->jn + pHEdge->jp) - + dx * (pVEdge->jn + pVEdge->jp); - } - break; - case 3: - /* Top Right Node */ - pHEdge = pElem->pTopEdge; - pVEdge = pElem->pRightEdge; - jTotal += pElem->epsRel * ( -dy * pHEdge->jd + dx * pVEdge->jd ); - if ( pElem->elemType == SEMICON ) { - jTotal += -dy * (pHEdge->jn + pHEdge->jp) - + dx * (pVEdge->jn + pVEdge->jp); - } - break; - } - } - } - } - - return( jTotal * pDevice->width * LNorm * JNorm ); -} - -double - oxideCurrent(TWOdevice *pDevice, TWOcontact *pContact, - BOOLEAN tranAnalysis) -{ - /* computes the current through the contact given in pContact */ - int index, i, numContactNodes; - TWOnode *pNode; - TWOelem *pElem; - TWOedge *pHEdge, *pVEdge; - double dx, dy; - double jTotal = 0.0; - - if ( !tranAnalysis ) { - return( jTotal ); - } - - numContactNodes = pContact->numNodes; - for ( index = 0; index < numContactNodes; index++ ) { - pNode = pContact->pNodes[ index ]; - for ( i = 0; i <= 3; i++ ) { - pElem = pNode->pElems[ i ]; - if ( pElem != NULL ) { - dx = 0.5 * pElem->dx; - dy = 0.5 * pElem->dy; - switch ( i ) { - case 0: - /* Bottom Right node */ - pHEdge = pElem->pBotEdge; - pVEdge = pElem->pRightEdge; - jTotal += pElem->epsRel * ( -dy * pHEdge->jd - dx * pVEdge->jd ); - break; - case 1: - /* Bottom Left node */ - pHEdge = pElem->pBotEdge; - pVEdge = pElem->pLeftEdge; - jTotal += pElem->epsRel * ( dy * pHEdge->jd - dx * pVEdge->jd ); - break; - case 2: - /* Top Left node */ - pHEdge = pElem->pTopEdge; - pVEdge = pElem->pLeftEdge; - jTotal += pElem->epsRel * ( dy * pHEdge->jd + dx * pVEdge->jd ); - break; - case 3: - /* Top Right Node */ - pHEdge = pElem->pTopEdge; - pVEdge = pElem->pRightEdge; - jTotal += pElem->epsRel * ( -dy * pHEdge->jd + dx * pVEdge->jd ); - break; - } - } - } - } - - return( jTotal * pDevice->width * LNorm * JNorm ); -} - - -double - contactConductance(TWOdevice *pDevice, TWOcontact *pContact, - BOOLEAN delVContact, double *dxDv, - BOOLEAN tranAnalysis, double *intCoeff) -{ - /* computes the conductance of the contact given in pContact */ - int index, i, numContactNodes; - TWOnode *pNode, *pHNode = NULL, *pVNode = NULL; - TWOelem *pElem; - TWOedge *pHEdge = NULL, *pVEdge = NULL; - double dPsiDv, dnDv, dpDv; - double gTotal = 0.0; - int nInc, pInc; - - NG_IGNORE(pDevice); - - /* for one carrier the rest of this code relies on appropriate - current derivative term to be zero */ - if ( !OneCarrier ) { - nInc = 1; - pInc = 2; - } else { - nInc = 1; - pInc = 1; - } - - numContactNodes = pContact->numNodes; - for ( index = 0; index < numContactNodes; index++ ) { - pNode = pContact->pNodes[ index ]; - for ( i = 0; i <= 3; i++ ) { - pElem = pNode->pElems[ i ]; - if ( pElem != NULL ) { - switch ( i ) { - case 0: - /* the TL element */ - pHNode = pElem->pBLNode; - pVNode = pElem->pTRNode; - pHEdge = pElem->pBotEdge; - pVEdge = pElem->pRightEdge; - if ( pElem->elemType == SEMICON ) { - /* compute the derivatives with n,p */ - if ( pHNode->nodeType != CONTACT ) { - dnDv = dxDv[ pHNode->nEqn ]; - dpDv = dxDv[ pHNode->pEqn ]; - gTotal -= 0.5 * pElem->dy * (pHEdge->dJnDn * dnDv - + pHEdge->dJpDp * dpDv); - } - if ( pVNode->nodeType != CONTACT ) { - dnDv = dxDv[ pVNode->nEqn ]; - dpDv = dxDv[ pVNode->pEqn ]; - gTotal -= 0.5 * pElem->dx * (pVEdge->dJnDn * dnDv - + pVEdge->dJpDp * dpDv); - } - } - break; - case 1: - /* the TR element */ - pHNode = pElem->pBRNode; - pVNode = pElem->pTLNode; - pHEdge = pElem->pBotEdge; - pVEdge = pElem->pLeftEdge; - if ( pElem->elemType == SEMICON ) { - /* compute the derivatives with n,p */ - if ( pHNode->nodeType != CONTACT ) { - dnDv = dxDv[ pHNode->nEqn ]; - dpDv = dxDv[ pHNode->pEqn ]; - gTotal += 0.5 * pElem->dy * (pHEdge->dJnDnP1 * dnDv - + pHEdge->dJpDpP1 * dpDv); - } - if ( pVNode->nodeType != CONTACT ) { - dnDv = dxDv[ pVNode->nEqn ]; - dpDv = dxDv[ pVNode->pEqn ]; - gTotal -= 0.5 * pElem->dx * (pVEdge->dJnDn * dnDv - + pVEdge->dJpDp * dpDv); - } - } - break; - case 2: - /* the BR element*/ - pHNode = pElem->pTRNode; - pVNode = pElem->pBLNode; - pHEdge = pElem->pTopEdge; - pVEdge = pElem->pLeftEdge; - if ( pElem->elemType == SEMICON ) { - /* compute the derivatives with n,p */ - if ( pHNode->nodeType != CONTACT ) { - dnDv = dxDv[ pHNode->nEqn ]; - dpDv = dxDv[ pHNode->pEqn ]; - gTotal += 0.5 * pElem->dy * (pHEdge->dJnDnP1 * dnDv - + pHEdge->dJpDpP1 * dpDv); - } - if ( pVNode->nodeType != CONTACT ) { - dnDv = dxDv[ pVNode->nEqn ]; - dpDv = dxDv[ pVNode->pEqn ]; - gTotal += 0.5 * pElem->dx * (pVEdge->dJnDnP1 * dnDv - + pVEdge->dJpDpP1 * dpDv); - } - } - break; - case 3: - /* the BL element */ - pHNode = pElem->pTLNode; - pVNode = pElem->pBRNode; - pHEdge = pElem->pTopEdge; - pVEdge = pElem->pRightEdge; - if ( pElem->elemType == SEMICON ) { - /* compute the derivatives with n,p */ - if ( pHNode->nodeType != CONTACT ) { - dnDv = dxDv[ pHNode->nEqn ]; - dpDv = dxDv[ pHNode->pEqn ]; - gTotal -= 0.5 * pElem->dy * (pHEdge->dJnDn * dnDv - + pHEdge->dJpDp * dpDv); - } - if ( pVNode->nodeType != CONTACT ) { - dnDv = dxDv[ pVNode->nEqn ]; - dpDv = dxDv[ pVNode->pEqn ]; - gTotal += 0.5 * pElem->dx * (pVEdge->dJnDnP1 * dnDv - + pVEdge->dJpDpP1 * dpDv); - } - } - break; - } - if ( pElem->elemType == SEMICON ) { - if ( pHNode->nodeType != CONTACT ) { - dPsiDv = dxDv[ pHNode->psiEqn ]; - gTotal += 0.5 * pElem->dy * dPsiDv * (pHEdge->dJnDpsiP1 + pHEdge->dJpDpsiP1 ); - if ( delVContact ) { - gTotal -= 0.5 * pElem->dy * (pHEdge->dJnDpsiP1 + pHEdge->dJpDpsiP1 ); - } - } - if ( pVNode->nodeType != CONTACT ) { - dPsiDv = dxDv[ pVNode->psiEqn ]; - gTotal += 0.5 * pElem->dx * dPsiDv * (pVEdge->dJnDpsiP1 + pVEdge->dJpDpsiP1 ); - if ( delVContact ) { - gTotal -= 0.5 * pElem->dx * (pVEdge->dJnDpsiP1 + pVEdge->dJpDpsiP1 ); - } - } - } - if ( tranAnalysis ) { - /* add the displacement current terms */ - if ( pHNode->nodeType != CONTACT ) { - dPsiDv = dxDv[ pHNode->psiEqn ]; - gTotal -= intCoeff[0] * pElem->epsRel * 0.5 * pElem->dyOverDx * dPsiDv; - if ( delVContact ) { - gTotal += intCoeff[0] * pElem->epsRel * 0.5 * pElem->dyOverDx; - } - } - if ( pVNode->nodeType != CONTACT ) { - dPsiDv = dxDv[ pVNode->psiEqn ]; - gTotal -= intCoeff[0] * pElem->epsRel * 0.5 * pElem->dxOverDy * dPsiDv; - if ( delVContact ) { - gTotal += intCoeff[0] * pElem->epsRel * 0.5 * pElem->dxOverDy; - } - } - } - } - } - } - - return( gTotal ); -} - - -double - oxideConductance(TWOdevice *pDevice, TWOcontact *pContact, - BOOLEAN delVContact, double *dxDv, - BOOLEAN tranAnalysis, double *intCoeff) -{ - /* computes the conductance of the contact given in pContact */ - int index, i, numContactNodes; - TWOnode *pNode, *pHNode = NULL, *pVNode = NULL; - TWOelem *pElem; - double dPsiDv; - double gTotal = 0.0; - - NG_IGNORE(pDevice); - - if ( !tranAnalysis ) { - return( gTotal ); - } - - numContactNodes = pContact->numNodes; - for ( index = 0; index < numContactNodes; index++ ) { - pNode = pContact->pNodes[ index ]; - for ( i = 0; i <= 3; i++ ) { - pElem = pNode->pElems[ i ]; - if ( pElem != NULL ) { - switch ( i ) { - case 0: - /* the TL element */ - pHNode = pElem->pBLNode; - pVNode = pElem->pTRNode; - break; - case 1: - /* the TR element */ - pHNode = pElem->pBRNode; - pVNode = pElem->pTLNode; - break; - case 2: - /* the BR element*/ - pHNode = pElem->pTRNode; - pVNode = pElem->pBLNode; - break; - case 3: - /* the BL element */ - pHNode = pElem->pTLNode; - pVNode = pElem->pBRNode; - break; - } - /* add the displacement current terms */ - if ( pHNode->nodeType != CONTACT ) { - dPsiDv = dxDv[ pHNode->psiEqn ]; - gTotal -= intCoeff[0] * pElem->epsRel * 0.5 * pElem->dyOverDx * dPsiDv; - if ( delVContact ) { - gTotal += intCoeff[0] * pElem->epsRel * 0.5 * pElem->dyOverDx; - } - } - if ( pVNode->nodeType != CONTACT ) { - dPsiDv = dxDv[ pVNode->psiEqn ]; - gTotal -= intCoeff[0] * pElem->epsRel * 0.5 * pElem->dxOverDy * dPsiDv; - if ( delVContact ) { - gTotal += intCoeff[0] * pElem->epsRel * 0.5 * pElem->dxOverDy; - } - } - } - } - } - - return( gTotal ); -} - -/* these functions are used for solving the complete system of - * equations directly using LU decomposition 1/22/88 - */ - -void - NUMD2current(TWOdevice *pDevice, BOOLEAN tranAnalysis, - double *intCoeff, double *id) -{ - TWOcontact *pPContact = pDevice->pFirstContact; -/* TWOcontact *pNContact = pDevice->pLastContact; */ - double ip, ipPrime, *solution; -/* double in;*/ - BOOLEAN deltaVContact = FALSE; - - solution = pDevice->dcDeltaSolution; - ip = contactCurrent( pDevice, pPContact ); - /* - in = contactCurrent( pDevice, pNContact ); - fprintf(stdout, "DIO current: ( %11.4e error )\n", ip+in ); - fprintf(stdout, " Ip = %11.4e In = %11.4e\n", ip, in ); - */ - - /* - * for the additional contribution to id will make use of - * contactConductance. This function will be called - * with the dcDeltaSolution vector instead of the incremental quantities - */ - ipPrime = contactConductance( pDevice, pPContact, deltaVContact, - solution, tranAnalysis, intCoeff ); - - ipPrime *= JNorm * pDevice->width * LNorm; - ip += ipPrime; - *id = ip; -} - -void - NBJT2current(TWOdevice *pDevice, BOOLEAN tranAnalysis, double *intCoeff, - double *ie, double *ic) -{ - TWOcontact *pEmitContact = pDevice->pLastContact; - TWOcontact *pColContact = pDevice->pFirstContact; -/* TWOcontact *pBaseContact = pDevice->pFirstContact->next; */ - double *solution, iePrime, icPrime; -/* double ib; */ - - solution = pDevice->dcDeltaSolution; - - *ie = contactCurrent( pDevice, pEmitContact ); - *ic = contactCurrent( pDevice, pColContact ); - /* - ib = contactCurrent( pDevice, pBaseContact ); - fprintf(stdout, "BJT current: ( %11.4e error )\n", *ic+ib+*ie ); - fprintf(stdout, " Ic = %11.4e Ib = %11.4e\n", *ic, ib ); - fprintf(stdout, " Ie = %11.4e\n", *ie ); - */ - - iePrime = contactConductance( pDevice, pEmitContact, FALSE, solution, - tranAnalysis, intCoeff ); - - icPrime = contactConductance( pDevice, pColContact, FALSE, solution, - tranAnalysis, intCoeff ); - - iePrime *= JNorm * pDevice->width * LNorm; - icPrime *= JNorm * pDevice->width * LNorm; - - *ie += iePrime; - *ic += icPrime; -} - -void - NUMOScurrent(TWOdevice *pDevice, BOOLEAN tranAnalysis, double *intCoeff, - double *id, double *is, double *ig) -{ - TWOcontact *pDContact = pDevice->pFirstContact; - TWOcontact *pGContact = pDevice->pFirstContact->next; - TWOcontact *pSContact = pDevice->pFirstContact->next->next; -/* TWOcontact *pBContact = pDevice->pLastContact; */ - double *solution, idPrime, isPrime, igPrime; -/* double ib; */ - - solution = pDevice->dcDeltaSolution; - - *id = contactCurrent( pDevice, pDContact ); - -/* - * This is a terrible hack - */ - -#ifdef NORMAL_GATE - *ig = GateTypeCurrent( pDevice, pGContact, tranAnalysis ); -#else - *ig = GateTypeCurrent( pDevice, pGContact); -#endif - - *is = contactCurrent( pDevice, pSContact ); - /* - ib = contactCurrent( pDevice, pBContact ); - fprintf(stdout, "MOS current: ( %11.4e error )\n", *id+*ig+*is+ib ); - fprintf(stdout, " Id = %11.4e Is = %11.4e\n", *id, *is ); - fprintf(stdout, " Ig = %11.4e Ib = %11.4e\n", *ig, ib ); - */ - - idPrime = contactConductance( pDevice, pDContact, FALSE, - solution, tranAnalysis, intCoeff ); - - isPrime = contactConductance( pDevice, pSContact, FALSE, - solution, tranAnalysis, intCoeff ); - - igPrime = GateTypeConductance( pDevice, pGContact, FALSE, - solution, tranAnalysis, intCoeff ); - - idPrime *= JNorm * pDevice->width * LNorm; - isPrime *= JNorm * pDevice->width * LNorm; - igPrime *= JNorm * pDevice->width * LNorm; - - *id += idPrime; - *is += isPrime; - *ig += igPrime; -} diff --git a/src/ciderlib/twod/twocont.c b/src/ciderlib/twod/twocont.c deleted file mode 100644 index 590dffe27..000000000 --- a/src/ciderlib/twod/twocont.c +++ /dev/null @@ -1,1048 +0,0 @@ -/********** -Copyright 1991 Regents of the University of California. All rights reserved. -Author: 1987 Kartikeya Mayaram, U. C. Berkeley CAD Group -Author: 1991 David A. Gates, U. C. Berkeley CAD Group -**********/ - -#include "ngspice/ngspice.h" -#include "ngspice/numglobs.h" -#include "ngspice/numenum.h" -#include "ngspice/twomesh.h" -#include "ngspice/twodev.h" -#include "ngspice/bool.h" -#include "ngspice/spmatrix.h" -#include "twoddefs.h" -#include "twodext.h" -#include "ngspice/cidersupt.h" -#include "../../maths/misc/bernoull.h" - -/* - * Functions to setup and solve the continuity equations. - * Both continuity equations are solved. - * Separate functions are used for one continuity equation. - */ - - -/* - * setup matrix pointers to Jacobian values and - * store direct pointers with the nodes - */ - -void - TWO_jacBuild(TWOdevice *pDevice) -{ - SMPmatrix *matrix = pDevice->matrix; - TWOelem *pElem; - TWOnode *pNode; - TWOchannel *pCh; - int eIndex, nIndex; - int nextIndex; /* index of node to find next element */ - int psiEqn, nEqn, pEqn; /* scratch for deref'd eqn numbers */ - int psiEqnTL = 0, nEqnTL = 0, pEqnTL = 0; - int psiEqnTR = 0, nEqnTR = 0, pEqnTR = 0; - int psiEqnBR = 0, nEqnBR = 0, pEqnBR = 0; - int psiEqnBL = 0, nEqnBL = 0, pEqnBL = 0; - int psiEqnInM = 0, psiEqnInP = 0; /* scratch for deref'd surface eqns */ - int psiEqnOxM = 0, psiEqnOxP = 0; /* M= more negative, P= more positive */ - - for ( eIndex = 1; eIndex <= pDevice->numElems; eIndex++ ) { - pElem = pDevice->elements[ eIndex ]; - - /* first the self terms */ - for ( nIndex = 0; nIndex <= 3; nIndex++ ) { - pNode = pElem->pNodes[ nIndex ]; - /* get poisson-only pointer */ - psiEqn = pNode->psiEqn; - pNode->fPsiPsi = spGetElement( matrix, psiEqn, psiEqn ); - - if ( pElem->elemType == SEMICON ) { - /* get continuity-coupling terms */ - nEqn = pNode->nEqn; - pEqn = pNode->pEqn; - /* pointers for additional terms */ - pNode->fPsiN = spGetElement( matrix, psiEqn, nEqn ); - pNode->fPsiP = spGetElement( matrix, psiEqn, pEqn ); - pNode->fNPsi = spGetElement( matrix, nEqn, psiEqn ); - pNode->fNN = spGetElement( matrix, nEqn, nEqn ); - pNode->fNP = spGetElement( matrix, nEqn, pEqn ); - pNode->fPPsi = spGetElement( matrix, pEqn, psiEqn ); - pNode->fPN = spGetElement( matrix, pEqn, nEqn ); - pNode->fPP = spGetElement( matrix, pEqn, pEqn ); - } else { - nEqn = 0; - pEqn = 0; - } - /* save equation indices */ - switch ( nIndex ) { - case 0: /* TL Node */ - psiEqnTL = psiEqn; - nEqnTL = nEqn; - pEqnTL = pEqn; - break; - case 1: /* TR Node */ - psiEqnTR = psiEqn; - nEqnTR = nEqn; - pEqnTR = pEqn; - break; - case 2: /* BR Node */ - psiEqnBR = psiEqn; - nEqnBR = nEqn; - pEqnBR = pEqn; - break; - case 3: /* BL Node */ - psiEqnBL = psiEqn; - nEqnBL = nEqn; - pEqnBL = pEqn; - break; - default: - break; - } - } - - /* now terms to couple to adjacent nodes */ - pNode = pElem->pTLNode; - pNode->fPsiPsiiP1 = spGetElement(matrix, psiEqnTL, psiEqnTR ); - pNode->fPsiPsijP1 = spGetElement(matrix, psiEqnTL, psiEqnBL ); - if ( pElem->elemType == SEMICON ) { - /* continuity equation pointers */ - pNode->fNPsiiP1 = spGetElement( matrix, nEqnTL, psiEqnTR ); - pNode->fNNiP1 = spGetElement( matrix, nEqnTL, nEqnTR ); - pNode->fNPsijP1 = spGetElement( matrix, nEqnTL, psiEqnBL ); - pNode->fNNjP1 = spGetElement( matrix, nEqnTL, nEqnBL ); - pNode->fPPsiiP1 = spGetElement( matrix, pEqnTL, psiEqnTR ); - pNode->fPPiP1 = spGetElement( matrix, pEqnTL, pEqnTR ); - pNode->fPPsijP1 = spGetElement( matrix, pEqnTL, psiEqnBL ); - pNode->fPPjP1 = spGetElement( matrix, pEqnTL, pEqnBL ); - /* Surface Mobility Model depends on diagonal node values */ - if ( MobDeriv && SurfaceMobility && pElem->channel ) { - pNode->fNPsiiP1jP1 = spGetElement( matrix, nEqnTL, psiEqnBR ); - pNode->fNNiP1jP1 = spGetElement( matrix, nEqnTL, nEqnBR ); - pNode->fPPsiiP1jP1 = spGetElement( matrix, pEqnTL, psiEqnBR ); - pNode->fPPiP1jP1 = spGetElement( matrix, pEqnTL, pEqnBR ); - } - } - - pNode = pElem->pTRNode; - pNode->fPsiPsiiM1 = spGetElement(matrix, psiEqnTR, psiEqnTL ); - pNode->fPsiPsijP1 = spGetElement(matrix, psiEqnTR, psiEqnBR ); - if ( pElem->elemType == SEMICON ) { - /* continuity equation pointers */ - pNode->fNPsiiM1 = spGetElement( matrix, nEqnTR, psiEqnTL ); - pNode->fNNiM1 = spGetElement( matrix, nEqnTR, nEqnTL ); - pNode->fNPsijP1 = spGetElement( matrix, nEqnTR, psiEqnBR ); - pNode->fNNjP1 = spGetElement( matrix, nEqnTR, nEqnBR ); - pNode->fPPsiiM1 = spGetElement( matrix, pEqnTR, psiEqnTL ); - pNode->fPPiM1 = spGetElement( matrix, pEqnTR, pEqnTL ); - pNode->fPPsijP1 = spGetElement( matrix, pEqnTR, psiEqnBR ); - pNode->fPPjP1 = spGetElement( matrix, pEqnTR, pEqnBR ); - /* Surface Mobility Model depends on diagonal node values */ - if ( MobDeriv && SurfaceMobility && pElem->channel ) { - pNode->fNPsiiM1jP1 = spGetElement( matrix, nEqnTR, psiEqnBL ); - pNode->fNNiM1jP1 = spGetElement( matrix, nEqnTR, nEqnBL ); - pNode->fPPsiiM1jP1 = spGetElement( matrix, pEqnTR, psiEqnBL ); - pNode->fPPiM1jP1 = spGetElement( matrix, pEqnTR, pEqnBL ); - } - } - - pNode = pElem->pBRNode; - pNode->fPsiPsiiM1 = spGetElement(matrix, psiEqnBR, psiEqnBL ); - pNode->fPsiPsijM1 = spGetElement(matrix, psiEqnBR, psiEqnTR ); - if ( pElem->elemType == SEMICON ) { - /* continuity equation pointers */ - pNode->fNPsiiM1 = spGetElement( matrix, nEqnBR, psiEqnBL ); - pNode->fNNiM1 = spGetElement( matrix, nEqnBR, nEqnBL ); - pNode->fNPsijM1 = spGetElement( matrix, nEqnBR, psiEqnTR ); - pNode->fNNjM1 = spGetElement( matrix, nEqnBR, nEqnTR ); - pNode->fPPsiiM1 = spGetElement( matrix, pEqnBR, psiEqnBL ); - pNode->fPPiM1 = spGetElement( matrix, pEqnBR, pEqnBL ); - pNode->fPPsijM1 = spGetElement( matrix, pEqnBR, psiEqnTR ); - pNode->fPPjM1 = spGetElement( matrix, pEqnBR, pEqnTR ); - /* Surface Mobility Model depends on diagonal node values */ - if ( MobDeriv && SurfaceMobility && pElem->channel ) { - pNode->fNPsiiM1jM1 = spGetElement( matrix, nEqnBR, psiEqnTL ); - pNode->fNNiM1jM1 = spGetElement( matrix, nEqnBR, nEqnTL ); - pNode->fPPsiiM1jM1 = spGetElement( matrix, pEqnBR, psiEqnTL ); - pNode->fPPiM1jM1 = spGetElement( matrix, pEqnBR, pEqnTL ); - } - } - - pNode = pElem->pBLNode; - pNode->fPsiPsiiP1 = spGetElement(matrix, psiEqnBL, psiEqnBR ); - pNode->fPsiPsijM1 = spGetElement(matrix, psiEqnBL, psiEqnTL ); - if ( pElem->elemType == SEMICON ) { - /* continuity equation pointers */ - pNode->fNPsiiP1 = spGetElement( matrix, nEqnBL, psiEqnBR ); - pNode->fNNiP1 = spGetElement( matrix, nEqnBL, nEqnBR ); - pNode->fNPsijM1 = spGetElement( matrix, nEqnBL, psiEqnTL ); - pNode->fNNjM1 = spGetElement( matrix, nEqnBL, nEqnTL ); - pNode->fPPsiiP1 = spGetElement( matrix, pEqnBL, psiEqnBR ); - pNode->fPPiP1 = spGetElement( matrix, pEqnBL, pEqnBR ); - pNode->fPPsijM1 = spGetElement( matrix, pEqnBL, psiEqnTL ); - pNode->fPPjM1 = spGetElement( matrix, pEqnBL, pEqnTL ); - /* Surface Mobility Model depends on diagonal node values */ - if ( MobDeriv && SurfaceMobility && pElem->channel ) { - pNode->fNPsiiP1jM1 = spGetElement( matrix, nEqnBL, psiEqnTR ); - pNode->fNNiP1jM1 = spGetElement( matrix, nEqnBL, nEqnTR ); - pNode->fPPsiiP1jM1 = spGetElement( matrix, pEqnBL, psiEqnTR ); - pNode->fPPiP1jM1 = spGetElement( matrix, pEqnBL, pEqnTR ); - } - } - } - /* - * Add terms for surface-field of inversion-layer mobility model. - * Elements MUST be made from silicon for this to work. - * No empty elements are allowed. - * Don't need these pointers if SurfaceMobility isn't set. - */ - if ( MobDeriv && SurfaceMobility ) { - for ( pCh = pDevice->pChannel; pCh != NULL; - pCh = pCh->next ) { - pElem = pCh->pNElem; - switch (pCh->type) { - case 0: - psiEqnInM = pElem->pBLNode->psiEqn; - psiEqnInP = pElem->pBRNode->psiEqn; - psiEqnOxM = pElem->pTLNode->psiEqn; - psiEqnOxP = pElem->pTRNode->psiEqn; - break; - case 1: - psiEqnInM = pElem->pTLNode->psiEqn; - psiEqnInP = pElem->pBLNode->psiEqn; - psiEqnOxM = pElem->pTRNode->psiEqn; - psiEqnOxP = pElem->pBRNode->psiEqn; - break; - case 2: - psiEqnInM = pElem->pTLNode->psiEqn; - psiEqnInP = pElem->pTRNode->psiEqn; - psiEqnOxM = pElem->pBLNode->psiEqn; - psiEqnOxP = pElem->pBRNode->psiEqn; - break; - case 3: - psiEqnInM = pElem->pTRNode->psiEqn; - psiEqnInP = pElem->pBRNode->psiEqn; - psiEqnOxM = pElem->pTLNode->psiEqn; - psiEqnOxP = pElem->pBLNode->psiEqn; - break; - } - pElem = pCh->pSeed; - nextIndex = (pCh->type + 2)%4; - while (pElem && pElem->channel == pCh->id) { - for ( nIndex = 0; nIndex <= 3; nIndex++ ) { - pNode = pElem->pNodes[ nIndex ]; - psiEqn = pNode->psiEqn; - nEqn = pNode->nEqn; - pEqn = pNode->pEqn; - if ( pCh->type % 2 == 0 ) { /* Vertical Slice */ - if ( nIndex == 0 || nIndex == 3 ) { /* Left Side */ - pNode->fNPsiIn = spGetElement( matrix, nEqn, psiEqnInM ); - pNode->fNPsiInP1 = spGetElement( matrix, nEqn, psiEqnInP ); - pNode->fNPsiOx = spGetElement( matrix, nEqn, psiEqnOxM ); - pNode->fNPsiOxP1 = spGetElement( matrix, nEqn, psiEqnOxP ); - pNode->fPPsiIn = spGetElement( matrix, pEqn, psiEqnInM ); - pNode->fPPsiInP1 = spGetElement( matrix, pEqn, psiEqnInP ); - pNode->fPPsiOx = spGetElement( matrix, pEqn, psiEqnOxM ); - pNode->fPPsiOxP1 = spGetElement( matrix, pEqn, psiEqnOxP ); - } else { /* Right Side */ - pNode->fNPsiInM1 = spGetElement( matrix, nEqn, psiEqnInM ); - pNode->fNPsiIn = spGetElement( matrix, nEqn, psiEqnInP ); - pNode->fNPsiOxM1 = spGetElement( matrix, nEqn, psiEqnOxM ); - pNode->fNPsiOx = spGetElement( matrix, nEqn, psiEqnOxP ); - pNode->fPPsiInM1 = spGetElement( matrix, pEqn, psiEqnInM ); - pNode->fPPsiIn = spGetElement( matrix, pEqn, psiEqnInP ); - pNode->fPPsiOxM1 = spGetElement( matrix, pEqn, psiEqnOxM ); - pNode->fPPsiOx = spGetElement( matrix, pEqn, psiEqnOxP ); - } - } else { /* Horizontal Slice */ - if ( nIndex == 0 || nIndex == 3 ) { /* Left (Top?) Side : bug 483 */ - pNode->fNPsiIn = spGetElement( matrix, nEqn, psiEqnInM ); - pNode->fNPsiInP1 = spGetElement( matrix, nEqn, psiEqnInP ); - pNode->fNPsiOx = spGetElement( matrix, nEqn, psiEqnOxM ); - pNode->fNPsiOxP1 = spGetElement( matrix, nEqn, psiEqnOxP ); - pNode->fPPsiIn = spGetElement( matrix, pEqn, psiEqnInM ); - pNode->fPPsiInP1 = spGetElement( matrix, pEqn, psiEqnInP ); - pNode->fPPsiOx = spGetElement( matrix, pEqn, psiEqnOxM ); - pNode->fPPsiOxP1 = spGetElement( matrix, pEqn, psiEqnOxP ); - } else { /* Bottom Side */ - pNode->fNPsiInM1 = spGetElement( matrix, nEqn, psiEqnInM ); - pNode->fNPsiIn = spGetElement( matrix, nEqn, psiEqnInP ); - pNode->fNPsiOxM1 = spGetElement( matrix, nEqn, psiEqnOxM ); - pNode->fNPsiOx = spGetElement( matrix, nEqn, psiEqnOxP ); - pNode->fPPsiInM1 = spGetElement( matrix, pEqn, psiEqnInM ); - pNode->fPPsiIn = spGetElement( matrix, pEqn, psiEqnInP ); - pNode->fPPsiOxM1 = spGetElement( matrix, pEqn, psiEqnOxM ); - pNode->fPPsiOx = spGetElement( matrix, pEqn, psiEqnOxP ); - } - } - } /* endfor nIndex */ - pElem = pElem->pElems[ nextIndex ]; - } /* endwhile pElem */ - } /* endfor pCh */ - } /* endif SurfaceMobility */ -} - - -/* - * The Jacobian and Rhs are loaded by the following function. - * Inputs are the transient analysis flag and the transient - * information structure - */ - -void - TWO_sysLoad(TWOdevice *pDevice, BOOLEAN tranAnalysis, TWOtranInfo *info) -{ - TWOelem *pElem; - TWOnode *pNode; - TWOedge *pHEdge, *pVEdge; - TWOedge *pTEdge, *pBEdge, *pLEdge, *pREdge; - TWOchannel *pCh; - int index, eIndex; - int nextIndex; /* index of node to find next element */ - double *pRhs = pDevice->rhs; - double dx, dy, dxdy, dyOverDx, dxOverDy; - double ds; - double dPsiT, dPsiB, dPsiL, dPsiR; - double rhsN, rhsP; - double generation; - double nConc, pConc; - double perTime = 0.0; - - /* first compute the currents and derivatives */ - TWO_commonTerms( pDevice, FALSE, tranAnalysis, info ); - - /* find reciprocal timestep */ - if ( tranAnalysis ) { - perTime = info->intCoeff[0]; - } - - /* zero the rhs vector */ - for ( index = 1 ; index <= pDevice->numEqns ; index++ ) { - pRhs[ index ] = 0.0; - } - - /* zero the matrix */ - spClear( pDevice->matrix ); - - for ( eIndex = 1; eIndex <= pDevice->numElems; eIndex++ ) { - pElem = pDevice->elements[ eIndex ]; - - dx = 0.5 * pElem->dx; - dy = 0.5 * pElem->dy; - dxdy = dx * dy; - dxOverDy = 0.5 * pElem->epsRel * pElem->dxOverDy; - dyOverDx = 0.5 * pElem->epsRel * pElem->dyOverDx; - - pTEdge = pElem->pTopEdge; - pBEdge = pElem->pBotEdge; - pLEdge = pElem->pLeftEdge; - pREdge = pElem->pRightEdge; - dPsiT = pTEdge->dPsi; - dPsiB = pBEdge->dPsi; - dPsiL = pLEdge->dPsi; - dPsiR = pREdge->dPsi; - - /* load for all i,j */ - for ( index = 0; index <= 3; index++ ) { - pNode = pElem->pNodes[ index ]; - if ( pNode->nodeType != CONTACT ) { - *(pNode->fPsiPsi) += dyOverDx + dxOverDy; - if ( index <= 1 ) { - pHEdge = pTEdge; - } else { - pHEdge = pBEdge; - } - if ( index == 0 || index == 3 ) { - pVEdge = pLEdge; - } else { - pVEdge = pREdge; - } - /* Add surface state charges. */ - pRhs[ pNode->psiEqn ] += dx * pHEdge->qf; - pRhs[ pNode->psiEqn ] += dy * pVEdge->qf; - if ( pElem->elemType == SEMICON ) { - *(pNode->fPsiN) += dxdy; - *(pNode->fPsiP) -= dxdy; - *(pNode->fNPsi) -= dy * pHEdge->dJnDpsiP1 + - dx * pVEdge->dJnDpsiP1; - *(pNode->fPPsi) -= dy * pHEdge->dJpDpsiP1 + - dx * pVEdge->dJpDpsiP1; - - nConc = pDevice->devState0 [pNode->nodeN]; - pConc = pDevice->devState0 [pNode->nodeP]; - pRhs[ pNode->psiEqn ] += dxdy * (pNode->netConc + pConc - nConc); - - /* Handle generation terms */ - *(pNode->fNN) -= dxdy * pNode->dUdN; - *(pNode->fNP) -= dxdy * pNode->dUdP; - *(pNode->fPP) += dxdy * pNode->dUdP; - *(pNode->fPN) += dxdy * pNode->dUdN; - rhsN = - dxdy * pNode->uNet; - rhsP = dxdy * pNode->uNet; - if ( AvalancheGen ) { - generation = TWOavalanche( pElem, pNode ); - rhsN += dxdy * generation; - rhsP -= dxdy * generation; - } - pRhs[ pNode->nEqn ] -= rhsN; - pRhs[ pNode->pEqn ] -= rhsP; - - /* Handle dXdT continuity terms */ - if ( tranAnalysis ) { - *(pNode->fNN) -= dxdy * perTime; - *(pNode->fPP) += dxdy * perTime; - pRhs[ pNode->nEqn ] += dxdy * pNode->dNdT; - pRhs[ pNode->pEqn ] -= dxdy * pNode->dPdT; - } - } - } - } - - /* Handle neighbor and edge dependent terms */ - pNode = pElem->pTLNode; - if ( pNode->nodeType != CONTACT ) { - pRhs[ pNode->psiEqn ] -= -dyOverDx * dPsiT - dxOverDy * dPsiL; - *(pNode->fPsiPsiiP1) -= dyOverDx; - *(pNode->fPsiPsijP1) -= dxOverDy; - if ( pElem->elemType == SEMICON ) { - pRhs[ pNode->nEqn ] -= dy * pTEdge->jn + dx * pLEdge->jn; - pRhs[ pNode->pEqn ] -= dy * pTEdge->jp + dx * pLEdge->jp; - *(pNode->fNN) += dy * pTEdge->dJnDn + dx * pLEdge->dJnDn; - *(pNode->fPP) += dy * pTEdge->dJpDp + dx * pLEdge->dJpDp; - *(pNode->fNPsiiP1) += dy * pTEdge->dJnDpsiP1; - *(pNode->fNNiP1) += dy * pTEdge->dJnDnP1; - *(pNode->fPPsiiP1) += dy * pTEdge->dJpDpsiP1; - *(pNode->fPPiP1) += dy * pTEdge->dJpDpP1; - *(pNode->fNPsijP1) += dx * pLEdge->dJnDpsiP1; - *(pNode->fNNjP1) += dx * pLEdge->dJnDnP1; - *(pNode->fPPsijP1) += dx * pLEdge->dJpDpsiP1; - *(pNode->fPPjP1) += dx * pLEdge->dJpDpP1; - } - } - pNode = pElem->pTRNode; - if ( pNode->nodeType != CONTACT ) { - pRhs[ pNode->psiEqn ] -= dyOverDx * dPsiT - dxOverDy * dPsiR; - *(pNode->fPsiPsiiM1) -= dyOverDx; - *(pNode->fPsiPsijP1) -= dxOverDy; - if ( pElem->elemType == SEMICON ) { - pRhs[ pNode->nEqn ] -= -dy * pTEdge->jn + dx * pREdge->jn; - pRhs[ pNode->pEqn ] -= -dy * pTEdge->jp + dx * pREdge->jp; - *(pNode->fNN) += -dy * pTEdge->dJnDnP1 + dx * pREdge->dJnDn; - *(pNode->fPP) += -dy * pTEdge->dJpDpP1 + dx * pREdge->dJpDp; - *(pNode->fNPsiiM1) += dy * pTEdge->dJnDpsiP1; - *(pNode->fNNiM1) -= dy * pTEdge->dJnDn; - *(pNode->fPPsiiM1) += dy * pTEdge->dJpDpsiP1; - *(pNode->fPPiM1) -= dy * pTEdge->dJpDp; - *(pNode->fNPsijP1) += dx * pREdge->dJnDpsiP1; - *(pNode->fNNjP1) += dx * pREdge->dJnDnP1; - *(pNode->fPPsijP1) += dx * pREdge->dJpDpsiP1; - *(pNode->fPPjP1) += dx * pREdge->dJpDpP1; - } - } - pNode = pElem->pBRNode; - if ( pNode->nodeType != CONTACT ) { - pRhs[ pNode->psiEqn ] -= dyOverDx * dPsiB + dxOverDy * dPsiR; - *(pNode->fPsiPsiiM1) -= dyOverDx; - *(pNode->fPsiPsijM1) -= dxOverDy; - if ( pElem->elemType == SEMICON ) { - pRhs[ pNode->nEqn ] -= -dy * pBEdge->jn - dx * pREdge->jn; - pRhs[ pNode->pEqn ] -= -dy * pBEdge->jp - dx * pREdge->jp; - *(pNode->fNN) += -dy * pBEdge->dJnDnP1 - dx * pREdge->dJnDnP1; - *(pNode->fPP) += -dy * pBEdge->dJpDpP1 - dx * pREdge->dJpDpP1; - *(pNode->fNPsiiM1) += dy * pBEdge->dJnDpsiP1; - *(pNode->fNNiM1) -= dy * pBEdge->dJnDn; - *(pNode->fPPsiiM1) += dy * pBEdge->dJpDpsiP1; - *(pNode->fPPiM1) -= dy * pBEdge->dJpDp; - *(pNode->fNPsijM1) += dx * pREdge->dJnDpsiP1; - *(pNode->fNNjM1) -= dx * pREdge->dJnDn; - *(pNode->fPPsijM1) += dx * pREdge->dJpDpsiP1; - *(pNode->fPPjM1) -= dx * pREdge->dJpDp; - } - } - pNode = pElem->pBLNode; - if ( pNode->nodeType != CONTACT ) { - pRhs[ pNode->psiEqn ] -= -dyOverDx * dPsiB + dxOverDy * dPsiL; - *(pNode->fPsiPsiiP1) -= dyOverDx; - *(pNode->fPsiPsijM1) -= dxOverDy; - if ( pElem->elemType == SEMICON ) { - pRhs[ pNode->nEqn ] -= dy * pBEdge->jn - dx * pLEdge->jn; - pRhs[ pNode->pEqn ] -= dy * pBEdge->jp - dx * pLEdge->jp; - *(pNode->fNN) += dy * pBEdge->dJnDn - dx * pLEdge->dJnDnP1; - *(pNode->fPP) += dy * pBEdge->dJpDp - dx * pLEdge->dJpDpP1; - *(pNode->fNPsiiP1) += dy * pBEdge->dJnDpsiP1; - *(pNode->fNNiP1) += dy * pBEdge->dJnDnP1; - *(pNode->fPPsiiP1) += dy * pBEdge->dJpDpsiP1; - *(pNode->fPPiP1) += dy * pBEdge->dJpDpP1; - *(pNode->fNPsijM1) += dx * pLEdge->dJnDpsiP1; - *(pNode->fNNjM1) -= dx * pLEdge->dJnDn; - *(pNode->fPPsijM1) += dx * pLEdge->dJpDpsiP1; - *(pNode->fPPjM1) -= dx * pLEdge->dJpDp; - } - } - } - - /* Calculate the Inversion-Layer Mobility Dependent Terms in Jac. */ - if ( MobDeriv && SurfaceMobility ) { - for ( pCh = pDevice->pChannel; pCh != NULL; - pCh = pCh->next ) { - /* Find effective height of oxide element at interface. */ - if ( pCh->type%2 == 0 ) { /* Vertical slice */ - ds = pCh->pNElem->dy / pCh->pNElem->epsRel; - } else { /* Horizontal slice */ - ds = pCh->pNElem->dx / pCh->pNElem->epsRel; - } - pElem = pCh->pSeed; - nextIndex = (pCh->type + 2)%4; - while (pElem && pElem->channel == pCh->id) { - TWO_mobDeriv( pElem, pCh->type, ds ); - pElem = pElem->pElems[ nextIndex ]; - } - } /* endfor pCh != NULL */ - } /* endif MobDeriv and SurfaceMobility */ -} - - -/* this function used only for direct method ac analysis - Used to load only the dc Jacobian matrix. Rhs is unaffected - */ - -void - TWO_jacLoad(TWOdevice *pDevice) -{ - TWOelem *pElem; - TWOnode *pNode; - TWOedge *pHEdge, *pVEdge; - TWOedge *pTEdge, *pBEdge, *pLEdge, *pREdge; - TWOchannel *pCh; - int index, eIndex; - int nextIndex; /* index of node to find next element */ - double dx, dy, dxdy, dyOverDx, dxOverDy; - double ds; - - /* first compute the currents and derivatives */ - TWO_commonTerms( pDevice, FALSE, FALSE, NULL ); - - /* zero the matrix */ - spClear( pDevice->matrix ); - - for ( eIndex = 1; eIndex <= pDevice->numElems; eIndex++ ) { - pElem = pDevice->elements[ eIndex ]; - dx = 0.5 * pElem->dx; - dy = 0.5 * pElem->dy; - dxdy = dx * dy; - dxOverDy = 0.5 * pElem->epsRel * pElem->dxOverDy; - dyOverDx = 0.5 * pElem->epsRel * pElem->dyOverDx; - - pTEdge = pElem->pTopEdge; - pBEdge = pElem->pBotEdge; - pLEdge = pElem->pLeftEdge; - pREdge = pElem->pRightEdge; - - /* load for all i,j */ - for ( index = 0; index <= 3; index++ ) { - pNode = pElem->pNodes[ index ]; - if ( pNode->nodeType != CONTACT ) { - *(pNode->fPsiPsi) += dyOverDx + dxOverDy; - if ( pElem->elemType == SEMICON ) { - if ( index <= 1 ) { - pHEdge = pTEdge; - } else { - pHEdge = pBEdge; - } - if ( index == 0 || index == 3 ) { - pVEdge = pLEdge; - } else { - pVEdge = pREdge; - } - *(pNode->fPsiN) += dxdy; - *(pNode->fPsiP) -= dxdy; - *(pNode->fNPsi) -= dy * pHEdge->dJnDpsiP1 + - dx * pVEdge->dJnDpsiP1; - *(pNode->fPPsi) -= dy * pHEdge->dJpDpsiP1 + - dx * pVEdge->dJpDpsiP1; - - /* Handle generation terms */ - *(pNode->fNN) -= dxdy * pNode->dUdN; - *(pNode->fNP) -= dxdy * pNode->dUdP; - *(pNode->fPP) += dxdy * pNode->dUdP; - *(pNode->fPN) += dxdy * pNode->dUdN; - } - } - } - - /* Handle neighbor and edge dependent terms */ - pNode = pElem->pTLNode; - if ( pNode->nodeType != CONTACT ) { - *(pNode->fPsiPsiiP1) -= dyOverDx; - *(pNode->fPsiPsijP1) -= dxOverDy; - if ( pElem->elemType == SEMICON ) { - *(pNode->fNN) += dy * pTEdge->dJnDn + dx * pLEdge->dJnDn; - *(pNode->fPP) += dy * pTEdge->dJpDp + dx * pLEdge->dJpDp; - *(pNode->fNPsiiP1) += dy * pTEdge->dJnDpsiP1; - *(pNode->fNNiP1) += dy * pTEdge->dJnDnP1; - *(pNode->fPPsiiP1) += dy * pTEdge->dJpDpsiP1; - *(pNode->fPPiP1) += dy * pTEdge->dJpDpP1; - *(pNode->fNPsijP1) += dx * pLEdge->dJnDpsiP1; - *(pNode->fNNjP1) += dx * pLEdge->dJnDnP1; - *(pNode->fPPsijP1) += dx * pLEdge->dJpDpsiP1; - *(pNode->fPPjP1) += dx * pLEdge->dJpDpP1; - } - } - pNode = pElem->pTRNode; - if ( pNode->nodeType != CONTACT ) { - *(pNode->fPsiPsiiM1) -= dyOverDx; - *(pNode->fPsiPsijP1) -= dxOverDy; - if ( pElem->elemType == SEMICON ) { - *(pNode->fNN) += -dy * pTEdge->dJnDnP1 + dx * pREdge->dJnDn; - *(pNode->fPP) += -dy * pTEdge->dJpDpP1 + dx * pREdge->dJpDp; - *(pNode->fNPsiiM1) += dy * pTEdge->dJnDpsiP1; - *(pNode->fNNiM1) -= dy * pTEdge->dJnDn; - *(pNode->fPPsiiM1) += dy * pTEdge->dJpDpsiP1; - *(pNode->fPPiM1) -= dy * pTEdge->dJpDp; - *(pNode->fNPsijP1) += dx * pREdge->dJnDpsiP1; - *(pNode->fNNjP1) += dx * pREdge->dJnDnP1; - *(pNode->fPPsijP1) += dx * pREdge->dJpDpsiP1; - *(pNode->fPPjP1) += dx * pREdge->dJpDpP1; - } - } - pNode = pElem->pBRNode; - if ( pNode->nodeType != CONTACT ) { - *(pNode->fPsiPsiiM1) -= dyOverDx; - *(pNode->fPsiPsijM1) -= dxOverDy; - if ( pElem->elemType == SEMICON ) { - *(pNode->fNN) += -dy * pBEdge->dJnDnP1 - dx * pREdge->dJnDnP1; - *(pNode->fPP) += -dy * pBEdge->dJpDpP1 - dx * pREdge->dJpDpP1; - *(pNode->fNPsiiM1) += dy * pBEdge->dJnDpsiP1; - *(pNode->fNNiM1) -= dy * pBEdge->dJnDn; - *(pNode->fPPsiiM1) += dy * pBEdge->dJpDpsiP1; - *(pNode->fPPiM1) -= dy * pBEdge->dJpDp; - *(pNode->fNPsijM1) += dx * pREdge->dJnDpsiP1; - *(pNode->fNNjM1) -= dx * pREdge->dJnDn; - *(pNode->fPPsijM1) += dx * pREdge->dJpDpsiP1; - *(pNode->fPPjM1) -= dx * pREdge->dJpDp; - } - } - pNode = pElem->pBLNode; - if ( pNode->nodeType != CONTACT ) { - *(pNode->fPsiPsiiP1) -= dyOverDx; - *(pNode->fPsiPsijM1) -= dxOverDy; - if ( pElem->elemType == SEMICON ) { - *(pNode->fNN) += dy * pBEdge->dJnDn - dx * pLEdge->dJnDnP1; - *(pNode->fPP) += dy * pBEdge->dJpDp - dx * pLEdge->dJpDpP1; - *(pNode->fNPsiiP1) += dy * pBEdge->dJnDpsiP1; - *(pNode->fNNiP1) += dy * pBEdge->dJnDnP1; - *(pNode->fPPsiiP1) += dy * pBEdge->dJpDpsiP1; - *(pNode->fPPiP1) += dy * pBEdge->dJpDpP1; - *(pNode->fNPsijM1) += dx * pLEdge->dJnDpsiP1; - *(pNode->fNNjM1) -= dx * pLEdge->dJnDn; - *(pNode->fPPsijM1) += dx * pLEdge->dJpDpsiP1; - *(pNode->fPPjM1) -= dx * pLEdge->dJpDp; - } - } - } - - /* Calculate the Inversion-Layer Mobility Dependent Terms in Jac. */ - if ( MobDeriv && SurfaceMobility ) { - for ( pCh = pDevice->pChannel; pCh != NULL; - pCh = pCh->next ) { - /* Find effective height of oxide element at interface. */ - if ( pCh->type%2 == 0 ) { /* Vertical slice */ - ds = pCh->pNElem->dy / pCh->pNElem->epsRel; - } else { /* Horizontal slice */ - ds = pCh->pNElem->dx / pCh->pNElem->epsRel; - } - pElem = pCh->pSeed; - nextIndex = (pCh->type + 2)%4; - while (pElem && pElem->channel == pCh->id) { - TWO_mobDeriv( pElem, pCh->type, ds ); - pElem = pElem->pElems[ nextIndex ]; - } - } /* endfor pCh != NULL */ - } /* endif MobDeriv and SurfaceMobility */ -} - -/* load only the Rhs vector */ -void - TWO_rhsLoad(TWOdevice *pDevice, BOOLEAN tranAnalysis, TWOtranInfo *info) -{ - TWOelem *pElem; - TWOnode *pNode; - TWOedge *pHEdge, *pVEdge; - TWOedge *pTEdge, *pBEdge, *pLEdge, *pREdge; - int index, eIndex; - double *pRhs = pDevice->rhs; - double dx, dy, dxdy, dyOverDx, dxOverDy; - double dPsiT, dPsiB, dPsiL, dPsiR; - double rhsN, rhsP; - double generation; - double nConc, pConc; - double perTime; - - /* first compute the currents */ - TWO_commonTerms( pDevice, TRUE, tranAnalysis, info ); - - /* find reciprocal timestep */ - if ( tranAnalysis ) { - perTime = info->intCoeff[0]; - } - - /* zero the rhs vector */ - for ( index = 1 ; index <= pDevice->numEqns ; index++ ) { - pRhs[ index ] = 0.0; - } - - for ( eIndex = 1; eIndex <= pDevice->numElems; eIndex++ ) { - pElem = pDevice->elements[ eIndex ]; - - dx = 0.5 * pElem->dx; - dy = 0.5 * pElem->dy; - dxdy = dx * dy; - dxOverDy = 0.5 * pElem->epsRel * pElem->dxOverDy; - dyOverDx = 0.5 * pElem->epsRel * pElem->dyOverDx; - - pTEdge = pElem->pTopEdge; - pBEdge = pElem->pBotEdge; - pLEdge = pElem->pLeftEdge; - pREdge = pElem->pRightEdge; - dPsiT = pTEdge->dPsi; - dPsiB = pBEdge->dPsi; - dPsiL = pLEdge->dPsi; - dPsiR = pREdge->dPsi; - - /* load for all i,j */ - for ( index = 0; index <= 3; index++ ) { - pNode = pElem->pNodes[ index ]; - if ( pNode->nodeType != CONTACT ) { - if ( index <= 1 ) { - pHEdge = pTEdge; - } else { - pHEdge = pBEdge; - } - if ( index == 0 || index == 3 ) { - pVEdge = pLEdge; - } else { - pVEdge = pREdge; - } - /* Add surface state charges. */ - pRhs[ pNode->psiEqn ] += dx * pHEdge->qf; - pRhs[ pNode->psiEqn ] += dy * pVEdge->qf; - if ( pElem->elemType == SEMICON ) { - nConc = pDevice->devState0 [pNode->nodeN]; - pConc = pDevice->devState0 [pNode->nodeP]; - pRhs[ pNode->psiEqn ] += dxdy * (pNode->netConc + pConc - nConc); - - /* Handle generation terms */ - rhsN = - dxdy * pNode->uNet; - rhsP = dxdy * pNode->uNet; - if ( AvalancheGen ) { - generation = TWOavalanche( pElem, pNode ); - rhsN += dxdy * generation; - rhsP -= dxdy * generation; - } - pRhs[ pNode->nEqn ] -= rhsN; - pRhs[ pNode->pEqn ] -= rhsP; - - /* Handle dXdT continuity terms */ - if ( tranAnalysis ) { - pRhs[ pNode->nEqn ] += dxdy * pNode->dNdT; - pRhs[ pNode->pEqn ] -= dxdy * pNode->dPdT; - } - } - } - } - - /* Handle neighbor and edge dependent terms */ - pNode = pElem->pTLNode; - if ( pNode->nodeType != CONTACT ) { - pRhs[ pNode->psiEqn ] -= -dyOverDx * dPsiT - dxOverDy * dPsiL; - if ( pElem->elemType == SEMICON ) { - pRhs[ pNode->nEqn ] -= dy * pTEdge->jn + dx * pLEdge->jn; - pRhs[ pNode->pEqn ] -= dy * pTEdge->jp + dx * pLEdge->jp; - } - } - pNode = pElem->pTRNode; - if ( pNode->nodeType != CONTACT ) { - pRhs[ pNode->psiEqn ] -= dyOverDx * dPsiT - dxOverDy * dPsiR; - if ( pElem->elemType == SEMICON ) { - pRhs[ pNode->nEqn ] -= -dy * pTEdge->jn + dx * pREdge->jn; - pRhs[ pNode->pEqn ] -= -dy * pTEdge->jp + dx * pREdge->jp; - } - } - pNode = pElem->pBRNode; - if ( pNode->nodeType != CONTACT ) { - pRhs[ pNode->psiEqn ] -= dyOverDx * dPsiB + dxOverDy * dPsiR; - if ( pElem->elemType == SEMICON ) { - pRhs[ pNode->nEqn ] -= -dy * pBEdge->jn - dx * pREdge->jn; - pRhs[ pNode->pEqn ] -= -dy * pBEdge->jp - dx * pREdge->jp; - } - } - pNode = pElem->pBLNode; - if ( pNode->nodeType != CONTACT ) { - pRhs[ pNode->psiEqn ] -= -dyOverDx * dPsiB + dxOverDy * dPsiL; - if ( pElem->elemType == SEMICON ) { - pRhs[ pNode->nEqn ] -= dy * pBEdge->jn - dx * pLEdge->jn; - pRhs[ pNode->pEqn ] -= dy * pBEdge->jp - dx * pLEdge->jp; - } - } - } -} - -/* - * computation of current densities, recombination rates, - * mobilities and their derivatives - */ -void - TWO_commonTerms(TWOdevice *pDevice, BOOLEAN currentOnly, - BOOLEAN tranAnalysis, TWOtranInfo *info) -{ - TWOelem *pElem; - TWOedge *pEdge; - TWOnode *pNode; - int index, eIndex; - int nextIndex; /* index of node to find next element */ - double psi1, psi2, nC, pC, nP1, pP1; - double dPsiN, dPsiP; - double bPsiN, dbPsiN, bMPsiN, dbMPsiN; - double bPsiP, dbPsiP, bMPsiP, dbMPsiP; - double muN, dMuN, muP, dMuP, rDx, rDy; - double psi, nConc = 0.0, pConc = 0.0; - double cnAug, cpAug; - double eSurf = 0.0; /* For channel mobilities */ - double qInt = 0.0; - TWOchannel *pCh; - - /* evaluate all node (including recombination) and edge quantities */ - for ( eIndex = 1; eIndex <= pDevice->numElems; eIndex++ ) { - pElem = pDevice->elements[ eIndex ]; - cnAug = pElem->matlInfo->cAug[ELEC]; - cpAug = pElem->matlInfo->cAug[HOLE]; - for ( index = 0; index <= 3; index++ ) { - if ( pElem->evalNodes[ index ] ) { - pNode = pElem->pNodes[ index ]; - if ( pNode->nodeType != CONTACT ) { - psi = pDevice->dcSolution[ pNode->psiEqn ]; - if ( pElem->elemType == SEMICON ) { - nConc = pDevice->dcSolution[ pNode->nEqn ]; - pConc = pDevice->dcSolution[ pNode->pEqn ]; - if ( Srh ) { - recomb(nConc, pConc, - pNode->tn, pNode->tp, cnAug, cpAug, pNode->nie, - &pNode->uNet, &pNode->dUdN, &pNode->dUdP); - } else { - pNode->uNet = 0.0; - pNode->dUdN = 0.0; - pNode->dUdP = 0.0; - } - } - } else { - /* a contact node */ - psi = pNode->psi; - if ( pElem->elemType == SEMICON ) { - nConc = pNode->nConc; - pConc = pNode->pConc; - } - } - - /* store info in the state tables */ - pDevice->devState0 [pNode->nodePsi] = psi; - if ( pElem->elemType == SEMICON ) { - pDevice->devState0 [pNode->nodeN] = nConc; - pDevice->devState0 [pNode->nodeP] = pConc; - if ( tranAnalysis && (pNode->nodeType != CONTACT) ) { - pNode->dNdT = integrate( pDevice->devStates, info, pNode->nodeN ); - pNode->dPdT = integrate( pDevice->devStates, info, pNode->nodeP ); - } - } - } - } - for ( index = 0; index <= 3; index++ ) { - if ( pElem->evalEdges[ index ] ) { - pEdge = pElem->pEdges[ index ]; - pNode = pElem->pNodes[ index ]; - if ( pNode->nodeType != CONTACT ) { - psi1 = pDevice->dcSolution[pNode->psiEqn]; - } else { - psi1 = pNode->psi; - } - pNode = pElem->pNodes[ (index + 1) % 4 ]; - if ( pNode->nodeType != CONTACT ) { - psi2 = pDevice->dcSolution[pNode->psiEqn]; - } else { - psi2 = pNode->psi; - } - if ( index <= 1 ) { - pEdge->dPsi = psi2 - psi1; - } else { - pEdge->dPsi = psi1 - psi2; - } - pDevice->devState0 [pEdge->edgeDpsi] = pEdge->dPsi; - - if ( pElem->elemType == SEMICON ) { - /* Calculate weighted driving forces - wdfn & wdfp for the edge */ - dPsiN = pEdge->dPsi + pEdge->dCBand; - dPsiP = pEdge->dPsi - pEdge->dVBand; - bernoulli( dPsiN, &bPsiN, &dbPsiN, - &bMPsiN, &dbMPsiN, !currentOnly ); - bernoulli( dPsiP, &bPsiP, &dbPsiP, - &bMPsiP, &dbMPsiP, !currentOnly); - if ( index <= 1 ) { - nC = *(pDevice->devState0 + pElem->pNodes[ index ]->nodeN); - nP1 = *(pDevice->devState0 + pElem->pNodes[ index+1 ]->nodeN); - pC = *(pDevice->devState0 + pElem->pNodes[ index ]->nodeP); - pP1 = *(pDevice->devState0 + pElem->pNodes[ index+1 ]->nodeP); - } else { - nC = *(pDevice->devState0 + pElem->pNodes[(index+1)%4]->nodeN); - nP1 = *(pDevice->devState0 + pElem->pNodes[ index ]->nodeN); - pC = *(pDevice->devState0 + pElem->pNodes[(index+1)%4]->nodeP); - pP1 = *(pDevice->devState0 + pElem->pNodes[ index ]->nodeP); - } - pEdge->wdfn = bPsiN * nP1 - bMPsiN * nC; - pEdge->wdfp = bPsiP * pC - bMPsiP * pP1; - pEdge->jn = 0.0; - pEdge->jp = 0.0; - if ( !currentOnly ) { - pEdge->dWnDpsiP1 = dbPsiN * nP1 - dbMPsiN * nC; - pEdge->dWnDn = - bMPsiN; - pEdge->dWnDnP1 = bPsiN; - pEdge->dWpDpsiP1 = dbPsiP * pC - dbMPsiP * pP1; - pEdge->dWpDp = bPsiP; - pEdge->dWpDpP1 = - bMPsiP; - pEdge->dJnDpsiP1 = 0.0; - pEdge->dJnDn = 0.0; - pEdge->dJnDnP1 = 0.0; - pEdge->dJpDpsiP1 = 0.0; - pEdge->dJpDp = 0.0; - pEdge->dJpDpP1 = 0.0; - } - } - } - } - } - - /* DAG: calculate mobilities for channel elems */ - if ( SurfaceMobility ) { - for ( pCh = pDevice->pChannel; - pCh != NULL; pCh = pCh->next ) { - pElem = pCh->pNElem; - switch (pCh->type) { - case 0: - eSurf = - 0.5 * (pElem->pLeftEdge->dPsi + pElem->pRightEdge->dPsi ) - * pElem->epsRel / pElem->dy; - qInt = 0.5 * pElem->pBotEdge->qf; - break; - case 1: - eSurf = - 0.5 * (pElem->pTopEdge->dPsi + pElem->pBotEdge->dPsi ) - * pElem->epsRel / pElem->dx; - qInt = 0.5 * pElem->pLeftEdge->qf; - break; - case 2: - eSurf = - 0.5 * (pElem->pLeftEdge->dPsi + pElem->pRightEdge->dPsi ) - * pElem->epsRel / pElem->dy; - qInt = 0.5 * pElem->pTopEdge->qf; - break; - case 3: - eSurf = - 0.5 * (pElem->pTopEdge->dPsi + pElem->pBotEdge->dPsi ) - * pElem->epsRel / pElem->dx; - qInt = 0.5 * pElem->pRightEdge->qf; - break; - } - eSurf += qInt; - pElem = pCh->pSeed; - nextIndex = (pCh->type + 2)%4; - while (pElem && pElem->channel == pCh->id) { - TWO_mobility( pElem, eSurf ); - pElem = pElem->pElems[ nextIndex ]; - } - } /* endfor pCH != NULL */ - } /* endif SurfaceMobility */ - - /* calculate the current densities assuming mobility value depend on Ex,Ey*/ - for ( eIndex = 1; eIndex <= pDevice->numElems; eIndex++ ) { - pElem = pDevice->elements[ eIndex ]; - - rDx = 1.0 / pElem->dx; - rDy = 1.0 / pElem->dy; - for ( index = 0; index <= 3; index++ ) { - pEdge = pElem->pEdges[ index ]; - /* calculate conductive currents */ - if ( pElem->elemType == SEMICON ) { - /* get mobility for this edge */ - if ( !pElem->channel ) { - /* Calculate mobility for non-channel elements */ - muN = pElem->mun0; - dMuN = 0.0; - muP = pElem->mup0; - dMuP = 0.0; - dPsiN = pEdge->dPsi + pEdge->dCBand; - dPsiP = pEdge->dPsi - pEdge->dVBand; - if ( index%2 == 0 ) { - MOBfieldDep( pElem->matlInfo, ELEC, - dPsiN * rDx, &muN, &dMuN ); - MOBfieldDep( pElem->matlInfo, HOLE, - dPsiP * rDx, &muP, &dMuP ); - } else { - MOBfieldDep( pElem->matlInfo, ELEC, - dPsiN * rDy, &muN, &dMuN ); - MOBfieldDep( pElem->matlInfo, HOLE, - dPsiP * rDy, &muP, &dMuP ); - } - } else { - /* Retrieve previously calculated value. */ - muN = pElem->mun; - dMuN = 0.0; - muP = pElem->mup; - dMuP = 0.0; - } - switch ( index ) { - case 0: - muN *= pEdge->kPos * rDx; - dMuN *= pEdge->kPos * rDx * rDx; - muP *= pEdge->kPos * rDx; - dMuP *= pEdge->kPos * rDx * rDx; - break; - case 1: - muN *= pEdge->kNeg * rDy; - dMuN *= pEdge->kNeg * rDy * rDy; - muP *= pEdge->kNeg * rDy; - dMuP *= pEdge->kNeg * rDy * rDy; - break; - case 2: - muN *= pEdge->kNeg * rDx; - dMuN *= pEdge->kNeg * rDx * rDx; - muP *= pEdge->kNeg * rDx; - dMuP *= pEdge->kNeg * rDx * rDx; - break; - case 3: - muN *= pEdge->kPos * rDy; - dMuN *= pEdge->kPos * rDy * rDy; - muP *= pEdge->kPos * rDy; - dMuP *= pEdge->kPos * rDy * rDy; - break; - } - /* Now that the mobility for this edge is known, do current */ - pEdge->jn += muN * pEdge->wdfn; - pEdge->jp += muP * pEdge->wdfp; - if ( !currentOnly ) { - pEdge->dJnDpsiP1 += muN * pEdge->dWnDpsiP1; - pEdge->dJnDn += muN * pEdge->dWnDn; - pEdge->dJnDnP1 += muN * pEdge->dWnDnP1; - pEdge->dJpDpsiP1 += muP * pEdge->dWpDpsiP1; - pEdge->dJpDp += muP * pEdge->dWpDp; - pEdge->dJpDpP1 += muP * pEdge->dWpDpP1; - if ( MobDeriv && (!pElem->channel) ) { - pEdge->dJnDpsiP1 -= dMuN * pEdge->wdfn; - pEdge->dJpDpsiP1 -= dMuP * pEdge->wdfp; - } - } - } - /* calculate displacement current only once */ - if ( pElem->evalEdges[ index ] ) { - if ( tranAnalysis ) { - if ( index == 0 || index == 2 ) { - /* horizontal edges */ - pEdge->jd = -integrate(pDevice->devStates, info, - pEdge->edgeDpsi) * rDx; - } else { - /* vertical edges */ - pEdge->jd = -integrate(pDevice->devStates, info, - pEdge->edgeDpsi) * rDy; - } - } - } - } - } -} diff --git a/src/ciderlib/twod/twocurr.c b/src/ciderlib/twod/twocurr.c deleted file mode 100644 index a49a62238..000000000 --- a/src/ciderlib/twod/twocurr.c +++ /dev/null @@ -1,185 +0,0 @@ -/********** -Copyright 1991 Regents of the University of California. All rights reserved. -Author: 1987 Kartikeya Mayaram, U. C. Berkeley CAD Group -Author: 1991 David A. Gates, U. C. Berkeley CAD Group -**********/ - -#include "ngspice/ngspice.h" -#include "ngspice/numglobs.h" -#include "ngspice/numenum.h" -#include "ngspice/twomesh.h" -#include "twoddefs.h" -#include "twodext.h" - -void -nodeCurrents(TWOelem *pElem, TWOnode *pNode, double *mun, double *mup, - double *jnx, double *jny, double *jpx, double *jpy, - double *jdx, double *jdy) -{ - - TWOelem *pElemTL, *pElemTR, *pElemBL, *pElemBR; - TWOedge *pEdgeT, *pEdgeB, *pEdgeL, *pEdgeR; - int materT = 0, materB = 0, materL = 0, materR = 0; - int numFound = 0; - double dxL = 0.0, dxR = 0.0, dyT = 0.0, dyB = 0.0; - double epsL = 0.0, epsR = 0.0, epsT = 0.0, epsB = 0.0; - double coeff1, coeff2; - - NG_IGNORE(pElem); - - /* Find all four neighboring elements */ - pElemTL = pNode->pTLElem; - pElemTR = pNode->pTRElem; - pElemBL = pNode->pBLElem; - pElemBR = pNode->pBRElem; - - /* Null edge pointers */ - pEdgeT = pEdgeB = pEdgeL = pEdgeR = NULL; - - /* Zero mobilities */ - *mun = *mup = 0.0; - - /* Find edges next to node */ - if (pElemTL != NULL) { - numFound++; - *mun += pElemTL->mun0; - *mup += pElemTL->mup0; - if (pElemTL->evalEdges[1]) { - pEdgeT = pElemTL->pRightEdge; - materT = pElemTL->elemType; - dyT = pElemTL->dy; - epsT = pElemTL->epsRel; - } - if (pElemTL->evalEdges[2]) { - pEdgeL = pElemTL->pBotEdge; - materL = pElemTL->elemType; - dxL = pElemTL->dx; - epsL = pElemTL->epsRel; - } - } - if (pElemTR != NULL) { - numFound++; - *mun += pElemTR->mun0; - *mup += pElemTR->mup0; - if (pElemTR->evalEdges[3]) { - pEdgeT = pElemTR->pLeftEdge; - materT = pElemTR->elemType; - epsT = pElemTR->epsRel; - } - if (pElemTR->evalEdges[2]) { - pEdgeR = pElemTR->pBotEdge; - materR = pElemTR->elemType; - dxR = pElemTR->dx; - epsR = pElemTR->epsRel; - } - } - if (pElemBR != NULL) { - numFound++; - *mun += pElemBR->mun0; - *mup += pElemBR->mup0; - if (pElemBR->evalEdges[3]) { - pEdgeB = pElemBR->pLeftEdge; - materB = pElemBR->elemType; - dyB = pElemBR->dy; - epsB = pElemBR->epsRel; - } - if (pElemBR->evalEdges[0]) { - pEdgeR = pElemBR->pTopEdge; - materR = pElemBR->elemType; - dxR = pElemBR->dx; - epsR = pElemBR->epsRel; - } - } - if (pElemBL != NULL) { - numFound++; - *mun += pElemBL->mun0; - *mup += pElemBL->mup0; - if (pElemBL->evalEdges[1]) { - pEdgeB = pElemBL->pRightEdge; - materB = pElemBL->elemType; - dyB = pElemBL->dy; - epsB = pElemBL->epsRel; - } - if (pElemBL->evalEdges[0]) { - pEdgeL = pElemBL->pTopEdge; - materL = pElemBL->elemType; - dxL = pElemBL->dx; - epsL = pElemBL->epsRel; - } - } - *mun /= (double) numFound; - *mup /= (double) numFound; - /* compute horizontal vector components */ - /* No more than one of Left Edge or Right Edge is absent */ - /* If one is absent the other is guaranteed to be from silicon */ - if (pEdgeL == NULL) { - if (pNode->nodeType == CONTACT) { - *jnx = pEdgeR->jn; - *jpx = pEdgeR->jp; - *jdx = pEdgeR->jd; - } else { - *jnx = 0.0; - *jpx = 0.0; - *jdx = 0.0; - } - } else if (pEdgeR == NULL) { - if (pNode->nodeType == CONTACT) { - *jnx = pEdgeL->jn; - *jpx = pEdgeL->jp; - *jdx = pEdgeL->jd; - } else { - *jnx = 0.0; - *jpx = 0.0; - *jdx = 0.0; - } - } else { /* Both edges are present */ - coeff1 = dxL / (dxL + dxR); - coeff2 = dxR / (dxL + dxR); - if ((materL == INSULATOR) || (materR == INSULATOR)) { - *jnx = 0.0; - *jpx = 0.0; - *jdx = coeff2 * epsL * pEdgeL->jd + coeff1 * epsR * pEdgeR->jd; - } else { - *jnx = coeff2 * pEdgeL->jn + coeff1 * pEdgeR->jn; - *jpx = coeff2 * pEdgeL->jp + coeff1 * pEdgeR->jp; - *jdx = coeff2 * pEdgeL->jd + coeff1 * pEdgeR->jd; - } - } - - /* compute vertical vector components */ - /* No more than one of Top Edge or Bottom Edge is absent */ - /* If one is absent the other is guaranteed to be from silicon */ - if (pEdgeT == NULL) { - if (pNode->nodeType == CONTACT) { - *jny = pEdgeB->jn; - *jpy = pEdgeB->jp; - *jdy = pEdgeB->jd; - } else { - *jny = 0.0; - *jpy = 0.0; - *jdy = 0.0; - } - } else if (pEdgeB == NULL) { - if (pNode->nodeType == CONTACT) { - *jny = pEdgeT->jn; - *jpy = pEdgeT->jp; - *jdy = pEdgeT->jd; - } else { - *jny = 0.0; - *jpy = 0.0; - *jdy = 0.0; - } - } else { /* Both edges are present */ - coeff1 = dyT / (dyT + dyB); - coeff2 = dyB / (dyT + dyB); - if ((materT == INSULATOR) || (materB == INSULATOR)) { - *jny = 0.0; - *jpy = 0.0; - *jdy = coeff2 * epsT * pEdgeT->jd + coeff1 * epsB * pEdgeB->jd; - } else { - *jny = coeff2 * pEdgeT->jn + coeff1 * pEdgeB->jn; - *jpy = coeff2 * pEdgeT->jp + coeff1 * pEdgeB->jp; - *jdy = coeff2 * pEdgeT->jd + coeff1 * pEdgeB->jd; - } - } -} diff --git a/src/ciderlib/twod/twoddefs.h b/src/ciderlib/twod/twoddefs.h deleted file mode 100644 index 349940f33..000000000 --- a/src/ciderlib/twod/twoddefs.h +++ /dev/null @@ -1,57 +0,0 @@ -/* - * 2001 Paolo Nenzi - */ - -#ifndef ngspice_TWODDEFS_H -#define ngspice_TWODDEFS_H - -/* Debug statements */ - -extern BOOLEAN TWOacDebug; -extern BOOLEAN TWOdcDebug; -extern BOOLEAN TWOtranDebug; -extern BOOLEAN TWOjacDebug; - -/* Now some defines for the two dimensional simulator - * library. - * Theese defines were gathered from all the code in - * oned directory. - */ - - -/* Temporary hack to remove NUMOS gate special case */ -#ifdef NORMAL_GATE -#define GateTypeAdmittance oxideAdmittance -#else -#define GateTypeAdmittance contactAdmittance -#endif /* NORMAL_GATE */ - -/* Temporary hack to remove NUMOS gate special case */ -#ifdef NORMAL_GATE -#define GateTypeConductance oxideConductance -#define GateTypeCurrent oxideCurrent -#else -#define GateTypeConductance contactConductance -#define GateTypeCurrent contactCurrent -#endif /* NORMAL_GATE */ - - /* This structure was moved up from twoadmit.c */ -struct mosAdmittances { - SPcomplex yIdVdb; - SPcomplex yIdVsb; - SPcomplex yIdVgb; - SPcomplex yIsVdb; - SPcomplex yIsVsb; - SPcomplex yIsVgb; - SPcomplex yIgVdb; - SPcomplex yIgVsb; - SPcomplex yIgVgb; -}; - -#define MAXTERMINALS 5 /* One more than max number of terminals */ -#define ELCT_ID poiEqn - -#define MIN_DELV 1e-3 -#define NORM_RED_MAXITERS 10 - -#endif diff --git a/src/ciderlib/twod/twodest.c b/src/ciderlib/twod/twodest.c deleted file mode 100644 index d51297f93..000000000 --- a/src/ciderlib/twod/twodest.c +++ /dev/null @@ -1,76 +0,0 @@ -/********** -Copyright 1991 Regents of the University of California. All rights reserved. -Author: 1991 David A. Gates, U. C. Berkeley CAD Group -**********/ - -#include "ngspice/ngspice.h" -#include "ngspice/numglobs.h" -#include "ngspice/numenum.h" -#include "ngspice/twodev.h" -#include "ngspice/twomesh.h" -#include "ngspice/spmatrix.h" -#include "twoddefs.h" -#include "twodext.h" - -void -TWOdestroy(TWOdevice *pDevice) -{ - int index, eIndex; - TWOelem *pElem; - TWOnode *pNode; - TWOedge *pEdge; - - if ( !pDevice ) return; - - switch ( pDevice->solverType ) { - case SLV_SMSIG: - case SLV_BIAS: - /* free up memory allocated for the bias solution */ - FREE( pDevice->dcSolution ); - FREE( pDevice->dcDeltaSolution ); - FREE( pDevice->copiedSolution ); - FREE( pDevice->rhs ); - FREE( pDevice->rhsImag ); - spDestroy( pDevice->matrix ); - break; - case SLV_EQUIL: - /* free up the vectors allocated in the equilibrium solution */ - FREE( pDevice->dcSolution ); - FREE( pDevice->dcDeltaSolution ); - FREE( pDevice->copiedSolution ); - FREE( pDevice->rhs ); - spDestroy( pDevice->matrix ); - break; - case SLV_NONE: - break; - default: - fprintf( stderr, "Panic: Unknown solver type in TWOdestroy.\n" ); - exit( -1 ); - break; - } - - /* destroy the mesh */ - if ( pDevice->elements ) { - for ( eIndex = 1; eIndex <= pDevice->numElems; eIndex++ ) { - pElem = pDevice->elements[ eIndex ]; - for ( index = 0; index <= 3; index++ ) { - if ( pElem->evalNodes[ index ] ) { - pNode = pElem->pNodes[ index ]; - FREE( pNode ); - } - if ( pElem->evalEdges[ index ] ) { - pEdge = pElem->pEdges[ index ]; - FREE( pEdge ); - } - } - FREE( pElem ); - } - FREE( pDevice->elements ); - FREE( pDevice->elemArray ); - } - - /* destroy the contacts & channels */ - /* NOT IMPLEMENTED */ - - FREE( pDevice ); -} diff --git a/src/ciderlib/twod/twodext.h b/src/ciderlib/twod/twodext.h deleted file mode 100644 index e4a3c2924..000000000 --- a/src/ciderlib/twod/twodext.h +++ /dev/null @@ -1,169 +0,0 @@ -/* - * 2001 Paolo Nenzi - */ - - /* External symbols for Two Dimensional simulator */ - -#ifndef ngspice_TWODEXT_H -#define ngspice_TWODEXT_H - -#include "ngspice/profile.h" -#include "ngspice/twomesh.h" -#include "ngspice/twodev.h" -#include "ngspice/carddefs.h" -#include "ngspice/bool.h" -#include "ngspice/complex.h" - -/* twoadmit.c */ -extern int NUMD2admittance(TWOdevice *, double, SPcomplex *); -extern int NBJT2admittance(TWOdevice *, double, SPcomplex *, - SPcomplex *, SPcomplex *, SPcomplex *); -extern int NUMOSadmittance(TWOdevice *, double, struct mosAdmittances *); -extern BOOLEAN TWOsorSolve(TWOdevice *, double *, double *, double); -extern SPcomplex *contactAdmittance(TWOdevice *, TWOcontact *, BOOLEAN, - double *, double *, SPcomplex *); -extern SPcomplex *oxideAdmittance(TWOdevice *, TWOcontact *,BOOLEAN, - double *, double *, SPcomplex *); - -extern void NUMD2ys(TWOdevice *, SPcomplex *, SPcomplex *); -extern void NBJT2ys(TWOdevice *,SPcomplex *, SPcomplex *, SPcomplex *, - SPcomplex *, SPcomplex *); -extern void NUMOSys(TWOdevice *, SPcomplex *, struct mosAdmittances *); - -/* twoaval.c */ -extern double TWOavalanche(TWOelem *, TWOnode *); - -/* twocond.c */ -extern void NUMD2conductance(TWOdevice *, BOOLEAN, double *, double *); -extern void NBJT2conductance(TWOdevice *, BOOLEAN, double *, double *, - double *, double *, double *); -extern void NUMOSconductance(TWOdevice *, BOOLEAN, double *, - struct mosConductances *); -extern double contactCurrent(TWOdevice *, TWOcontact *); -extern double oxideCurrent(TWOdevice *, TWOcontact *, BOOLEAN); -extern double contactConductance(TWOdevice *, TWOcontact *, BOOLEAN, - double *, BOOLEAN, double *); -extern double oxideConductance(TWOdevice *, TWOcontact *, BOOLEAN, - double *, BOOLEAN, double *); -extern void NUMD2current(TWOdevice *, BOOLEAN, double *, double *); -extern void NBJT2current(TWOdevice *, BOOLEAN, double *, double *, - double *); -extern void NUMOScurrent(TWOdevice *, BOOLEAN , double *, double *, double *, - double *); - -/* twocont */ -extern void TWO_jacBuild(TWOdevice *); -extern void TWO_sysLoad(TWOdevice *, BOOLEAN, TWOtranInfo *); -extern void TWO_jacLoad(TWOdevice *); -extern void TWO_rhsLoad(TWOdevice *, BOOLEAN, TWOtranInfo *); -extern void TWO_commonTerms(TWOdevice *, BOOLEAN, BOOLEAN, TWOtranInfo *); - -/* twocurr.c */ -extern void nodeCurrents(TWOelem *, TWOnode *, double *, double *, - double *, double *, double *, double *, double *, double *); - -/* twodest */ -extern void TWOdestroy(TWOdevice *); - -/* twodopng.c */ -extern double TWOdopingValue(DOPprofile *, DOPtable *, double, double); -extern void TWOsetDoping(TWOdevice *, DOPprofile *, DOPtable *); - -/* twoelect.c */ -extern int TWOcmpElectrode(TWOelectrode *, TWOelectrode *); -extern void checkElectrodes(TWOelectrode *, int); -extern void setupContacts(TWOdevice *, TWOelectrode *, TWOnode ***); - -/* twofield.c */ -extern void nodeFields(TWOelem *, TWOnode *, double *, double *); - -/* twomesh.c */ -extern void TWObuildMesh(TWOdevice *, TWOdomain *, TWOelectrode *, - TWOmaterial *); -extern void TWOprnMesh(TWOdevice *); -extern void TWOgetStatePointers(TWOdevice *, int *); - -/* twomobdv.c */ -extern void TWO_mobDeriv(TWOelem *, int, double); -extern void TWONmobDeriv(TWOelem *, int, double); -extern void TWOPmobDeriv(TWOelem *, int, double); - -/* twomobfn.c */ -extern void MOBsurfElec(TWOmaterial *, TWOelem *, double, double, - double, double, double, double); -extern void MOBsurfHole(TWOmaterial *, TWOelem *, double, double, - double, double, double, double); - -/* twomobil.c */ -extern void TWO_mobility(TWOelem *, double); -extern void TWONmobility(TWOelem *, double); -extern void TWOPmobility(TWOelem *, double); - -/* twoncont.c */ -extern void TWONjacBuild(TWOdevice *); -extern void TWONsysLoad(TWOdevice *, BOOLEAN, TWOtranInfo *); -extern void TWONjacLoad(TWOdevice *); -extern void TWONrhsLoad(TWOdevice *, BOOLEAN, TWOtranInfo *); -extern void TWONcommonTerms(TWOdevice *, BOOLEAN, BOOLEAN, TWOtranInfo *); - -/* twopcont.c */ -extern void TWOPjacBuild(TWOdevice *); -extern void TWOPsysLoad(TWOdevice *, BOOLEAN, TWOtranInfo *); -extern void TWOPjacLoad(TWOdevice *); -extern void TWOPrhsLoad(TWOdevice *, BOOLEAN, TWOtranInfo *); -extern void TWOPcommonTerms(TWOdevice *, BOOLEAN, BOOLEAN, TWOtranInfo *); - -/* twopoiss.c */ -extern void TWOQjacBuild(TWOdevice *); -extern void TWOQsysLoad(TWOdevice *); -extern void TWOQrhsLoad(TWOdevice *); -extern void TWOQcommonTerms(TWOdevice *); - -/*twoprint.c */ -extern void TWOprnSolution(FILE *, TWOdevice *, OUTPcard *, BOOLEAN, char *); -extern void TWOmemStats(FILE *, TWOdevice *); -extern void TWOcpuStats(FILE *, TWOdevice *); - - -/* twoproj.c */ -extern void NUMD2project(TWOdevice *, double); -extern void NBJT2project(TWOdevice *, double, double); -extern void NUMOSproject(TWOdevice *, double, double, double); -extern void NUMD2update(TWOdevice *,double, BOOLEAN); -extern void NBJT2update(TWOdevice *, double, double, BOOLEAN); -extern void NUMOSupdate(TWOdevice *, double, double, double, BOOLEAN); -extern void storeNewRhs(TWOdevice *, TWOcontact *); - -/* tworead.c */ -extern int TWOreadState(TWOdevice *, char *, int, double *, double *, double *); - -/*twosetbc.c */ -extern void NUMD2setBCs(TWOdevice *, double); -extern void NBJT2setBCs(TWOdevice *, double, double); -extern void NUMOSsetBCs(TWOdevice *, double, double, double); - -/*twosetup.c */ -extern void TWOsetup(TWOdevice *); -extern void TWOsetBCparams(TWOdevice *, BDRYcard *); -extern void TWOnormalize(TWOdevice *); - -/* twosolve.c */ -extern void TWOdcSolve(TWOdevice *, int, BOOLEAN, BOOLEAN, TWOtranInfo *); -extern BOOLEAN TWOdeltaConverged(TWOdevice *); -extern BOOLEAN TWOdeviceConverged(TWOdevice *); -extern void TWOresetJacobian(TWOdevice *); -extern void TWOstoreNeutralGuess(TWOdevice *); -extern int TWOequilSolve(TWOdevice *); -extern void TWObiasSolve(TWOdevice *, int, BOOLEAN, TWOtranInfo *); -extern void TWOstoreEquilibGuess(TWOdevice *); -extern void TWOstoreInitialGuess(TWOdevice *); -extern void oldTWOnewDelta(TWOdevice *, BOOLEAN, TWOtranInfo *); -extern int TWOnewDelta(TWOdevice *, BOOLEAN, TWOtranInfo *); -extern void TWOpredict(TWOdevice *, TWOtranInfo *); -extern double TWOtrunc(TWOdevice *, TWOtranInfo *, double); -extern void TWOsaveState(TWOdevice *); -extern BOOLEAN TWOpsiDeltaConverged(TWOdevice *); -extern double TWOnuNorm(TWOdevice *); -extern void TWOjacCheck(TWOdevice *, BOOLEAN, TWOtranInfo *); - -#endif diff --git a/src/ciderlib/twod/twodopng.c b/src/ciderlib/twod/twodopng.c deleted file mode 100644 index 77d0d4d05..000000000 --- a/src/ciderlib/twod/twodopng.c +++ /dev/null @@ -1,236 +0,0 @@ -/********** -Copyright 1991 Regents of the University of California. All rights reserved. -Author: 1987 Kartikeya Mayaram, U. C. Berkeley CAD Group -Author: 1991 David A. Gates, U. C. Berkeley CAD Group -**********/ - -#include "ngspice/ngspice.h" -#include "ngspice/numglobs.h" -#include "ngspice/numenum.h" -#include "ngspice/twomesh.h" -#include "ngspice/twodev.h" -#include "ngspice/profile.h" -#include "ngspice/macros.h" -#include "ngspice/bool.h" -#include "twoddefs.h" -#include "twodext.h" -#include "ngspice/cidersupt.h" - -/* functions in this file are used to calculate the conc */ - -double -TWOdopingValue(DOPprofile *pProfile, DOPtable *pTable, double x, - double y) -{ - double argX, argY, argP, argL, value = 0.0; - - /* Find the appropriate lookup table if necessary */ - if (pProfile->type == LOOKUP) { - while ( pTable != NULL ) { - if (pTable->impId == pProfile->IMPID) { - /* Found it */ - break; - } else { - pTable = pTable->next; - } - } - if ( pTable == NULL ) { - fprintf( stderr, "Error: unknown impurity profile %d\n", - ((int)pProfile->IMPID) ); - controlled_exit(1); - } - } - /* Find distances */ - if ( pProfile->Y_LOW > y ) { - argY = pProfile->Y_LOW - y; - } else if ( y > pProfile->Y_HIGH ) { - argY = y - pProfile->Y_HIGH; - } else { - argY = 0.0; - } - if ( pProfile->X_LOW > x ) { - argX = pProfile->X_LOW - x; - } else if ( x > pProfile->X_HIGH ) { - argX = x - pProfile->X_HIGH; - } else { - argX = 0.0; - } - - if ( pProfile->DIRECTION == Y ) { - argP = argY; - argL = argX / pProfile->LAT_RATIO; - } - else { - argP = argX; - argL = argY / pProfile->LAT_RATIO; - } - if ( pProfile->rotate ) { - argP = hypot(argP, argL); - argL = 0.0; - } - - /* Transform to coordinates of profile peak */ - argP -= pProfile->LOCATION; - argP /= pProfile->CHAR_LENGTH; - argL -= pProfile->LOCATION; - argL /= pProfile->CHAR_LENGTH; - - switch (pProfile->type) { - case UNIF: - if (argP > 0.0) { - value = 0.0; - } else { - value = pProfile->CONC; - } - break; - case LIN: - argP = ABS(argP); - if (argP > 1.0) { - value = 0.0; - } else { - value = pProfile->CONC * ( 1.0 - argP ); - } - break; - case GAUSS: - argP *= argP; - if ( argP > 80.0 ) { - value = 0.0; - } else { - value = pProfile->PEAK_CONC * exp( -argP ); - } - break; - case EXP: - argP = ABS(argP); - if ( argP > 80.0 ) { - value = 0.0; - } else { - value = pProfile->PEAK_CONC * exp( -argP ); - } - break; - case ERRFC: - argP = ABS(argP); - if ( argP > 10.0 ) { - value = 0.0; - } else { - value = pProfile->PEAK_CONC * erfc( argP ); - } - break; - case LOOKUP: - argP = ABS(argP); - value = lookup( pTable->dopData, argP ); - break; - default: - break; - } - if (!pProfile->rotate) { /* Tensor product in lateral direction */ - switch (pProfile->latType) { - case UNIF: - if (argL > 0.0) { - value = 0.0; - } - break; - case LIN: - argL = ABS(argL); - if (argL > 1.0) { - value = 0.0; - } else { - value *= ( 1.0 - argL ); - } - break; - case GAUSS: - argL *= argL; - if ( argL > 80.0 ) { - value = 0.0; - } else { - value *= exp( -argL ); - } - break; - case EXP: - argL = ABS(argL); - if ( argL > 80.0 ) { - value = 0.0; - } else { - value *= exp( -argL ); - } - break; - case ERRFC: - argL = ABS(argL); - if ( argP > 10.0 ) { - value = 0.0; - } else { - value *= erfc( argL ); - } - break; - case LOOKUP: - argL = ABS(argL); - value *= lookup( pTable->dopData, argL ) / lookup( pTable->dopData, 0.0 ); - break; - default: - break; - } - } /* end: not rotated */ - return( value ); -} - -void -TWOsetDoping(TWOdevice *pDevice, DOPprofile *pProfile, DOPtable *pTable) -{ - TWOnode *pNode; - TWOelem *pElem; - DOPprofile *pP; - double conc; - int index, eIndex; - BOOLEAN dopeMe; - - /* Clear doping info for all nodes. */ - for ( eIndex = 1; eIndex <= pDevice->numElems; eIndex++ ) { - pElem = pDevice->elements[ eIndex ]; - for (index = 0; index <= 3; index++) { - if (pElem->evalNodes[index]) { - pNode = pElem->pNodes[index]; - pNode->na = 0.0; - pNode->nd = 0.0; - pNode->netConc = 0.0; - pNode->totalConc = 0.0; - } - } - } - /* Now compute the contribution to the total doping from each profile. */ - for ( pP = pProfile; pP != NULL; pP = pP->next ) { - for ( eIndex = 1; eIndex <= pDevice->numElems; eIndex++ ) { - pElem = pDevice->elements[ eIndex ]; - if ( pElem->elemType == SEMICON ) { - if ( pP->numDomains > 0 ) { - dopeMe = FALSE; - for ( index = 0; index < pP->numDomains; index++ ) { - if ( pElem->domain == pP->domains[ index ] ) { - dopeMe = TRUE; - break; - } - } - } else { /* domains not given, so dope all */ - dopeMe = TRUE; - } - if ( dopeMe ) { - for ( index = 0; index <= 3; index++ ) { - if ( pElem->evalNodes[ index ] ) { - pNode = pElem->pNodes[ index ]; - conc = TWOdopingValue( pP, pTable, - pDevice->xScale[ pNode->nodeI ], - pDevice->yScale[ pNode->nodeJ ] ); - pNode->netConc += conc; - if ( conc < 0.0 ) { - pNode->totalConc -= conc; - pNode->na -= conc; - } - else { - pNode->totalConc += conc; - pNode->nd += conc; - } - } - } - } - } - } - } -} diff --git a/src/ciderlib/twod/twoelect.c b/src/ciderlib/twod/twoelect.c deleted file mode 100644 index d3ffbbad8..000000000 --- a/src/ciderlib/twod/twoelect.c +++ /dev/null @@ -1,180 +0,0 @@ -/********** -Copyright 1991 Regents of the University of California. All rights reserved. -Author: 1987 Kartikeya Mayaram, U. C. Berkeley CAD Group -Author: 1991 David A. Gates, U. C. Berkeley CAD Group -**********/ - -#include "ngspice/ngspice.h" -#include "ngspice/numglobs.h" -#include "ngspice/numconst.h" -#include "ngspice/numenum.h" -#include "ngspice/twomesh.h" -#include "ngspice/twodev.h" -#include "ngspice/bool.h" -#include "twoddefs.h" -#include "twodext.h" - -/* Use list-sorting header file to create electrode sorter */ -#define TYPE TWOelectrode -#define NEXT next -#define SORT TWOssortElectrodes -#define SORT1 TWOsortElectrodes -#include "ngspice/lsort.h" - -#define ARG_MIN(a,b,c) ((a) > (b) ? 1 : ((a) < (b) ? -1 : (c))) - -int -TWOcmpElectrode(TWOelectrode *a, TWOelectrode *b) -{ - return ARG_MIN(a->id, b->id, 0); -} - -/* - * checkElectrodes - * debug list of electrodes for errors, exit on any error: - * 1. list doesn't have only contiguous id's from 1 to idHigh - * 2. electrodes with box shapes - * 3. order of node numbers is correct - */ -void -checkElectrodes(TWOelectrode *pElectrode, int idHigh) -{ - TWOelectrode *pE; - int id; - BOOLEAN error = FALSE; - - /* - * order the electrodes - * assign electrode numbers to uninitialized electrodes ( id == -1 ) - * uninit electrodes are in reverse order from order in input file - * resort electrodes - */ - pElectrode = TWOsortElectrodes( pElectrode, TWOcmpElectrode ); - id = 1; - for (pE = pElectrode; pE != NULL; pE = pE->next) { - if (pE->id == -1) pE->id = id++; - } - pElectrode = TWOsortElectrodes( pElectrode, TWOcmpElectrode ); - - for (pE = pElectrode, id = 1; pE != NULL; pE = pE->next) { - /* Check id's */ - if ( pE->id < 1 || pE->id > idHigh) { - fprintf(stderr, "Error: electrode %d out of range\n",pE->id); - error = TRUE; - } else if ( pE->id != id ) { - if ( pE->id != ++id ) { - fprintf(stderr, "Error: electrode(s) %d to %d missing\n",id,pE->id-1); - id = pE->id; - error = TRUE; - } - } - } - - /* Make sure total number of distinct electrodes is correct */ - if ( id != idHigh ) { - fprintf(stderr, "Error: %d electrode%s not equal to %d required\n", - id, (id != 1) ? "s are" : " is", idHigh); - error = TRUE; - } - - if (error) { - exit(-1); - } -} - -/* - * setupContacts - * go through each set of electrode segments, find its size and find nodes - */ - - -void -setupContacts(TWOdevice *pDevice, TWOelectrode *pElectrode, - TWOnode ***nodeArray) -{ - TWOelectrode *pE; - TWOcontact *pNew = NULL, *pTail; - TWOnode *pNode; - int xIndex, yIndex, nIndex = 0; - int id = 0, electrodeSize[MAXTERMINALS], electrodeType; - int error = FALSE; - - /* INITIALIZATION - * 0. Assume ELCT_ID's are initialized to 0 before setup is called - * 1. Add a node only once to only one electrode - * 2. Compute number of nodes in each electrode - * 3. Overwrite SEMICON or INSULATOR nodeType at electrodes - */ - for ( pE = pElectrode; pE != NULL; pE = pE->next ) { - if (pE->id != id) { /* Found the next electrode */ - id = pE->id; - electrodeSize[id] = 0; - electrodeType = 0; - } - for ( xIndex = pE->ixLo; xIndex <= pE->ixHi; xIndex++ ) { - for ( yIndex = pE->iyLo; yIndex <= pE->iyHi; yIndex++ ) { - pNode = nodeArray[ xIndex ][ yIndex ]; - if ( pNode != NULL ) { - pNode->nodeType = CONTACT; - - /* Assign each node to an electrode only once */ - if (pNode->ELCT_ID == 0) { /* Is this a new node? */ - pNode->ELCT_ID = id; /* Mark electrode ownership */ - electrodeSize[id]++; /* Increase electrode size */ - } else if (pNode->ELCT_ID != id) { - /* Node already owned by another electrode */ - fprintf(stderr, "Error: electrodes %d and %d overlap at (%d,%d)\n", - pNode->ELCT_ID, id, xIndex, yIndex); - error = TRUE; - } - } - } - } - } - if (error) { - exit(-1); - } - - /* ALLOCATION AND NODE GRABBING - * 1. For each electrode, create a new contact structure for the electrode. - * 2. Fill in entries of contact structure - * 3. Update First and Last Contact pointers of device - */ -/* - printElectrodes( pDevice->pFirstContact ); -*/ - id = 0; - pDevice->pFirstContact = pTail = NULL; - for ( pE = pElectrode; pE != NULL; pE = pE->next ) { - if (pE->id != id) { /* Found the next electrode */ - if ( pDevice->pFirstContact == NULL ) { - XCALLOC( pNew, TWOcontact, 1 ); - pDevice->pFirstContact = pTail = pNew; - } else { - XCALLOC( pNew->next, TWOcontact, 1 ); - pTail = pNew = pNew->next; - } - pNew->next = NULL; - id = pNew->id = pE->id; - pNew->workf = pE->workf; - pNew->numNodes = electrodeSize[id]; - nIndex = 0; - XCALLOC( pNew->pNodes, TWOnode *, electrodeSize[id] ); - } - for ( xIndex = pE->ixLo; xIndex <= pE->ixHi; xIndex++ ) { - for ( yIndex = pE->iyLo; yIndex <= pE->iyHi; yIndex++ ) { - pNode = nodeArray[ xIndex ][ yIndex ]; - if ( pNode != NULL ) { - /* Make sure node belongs to this electrode, then - * clear ELCT_ID so that it is not grabbed again. - */ - if (pNode->ELCT_ID == id) { - pNew->pNodes[ nIndex++ ] = pNode; - pNode->ELCT_ID = 0; - } - } - } - } - } - pDevice->pLastContact = pTail; -} diff --git a/src/ciderlib/twod/twofield.c b/src/ciderlib/twod/twofield.c deleted file mode 100644 index 03532c8af..000000000 --- a/src/ciderlib/twod/twofield.c +++ /dev/null @@ -1,127 +0,0 @@ -/********** -Copyright 1991 Regents of the University of California. All rights reserved. -Author: 1987 Kartikeya Mayaram, U. C. Berkeley CAD Group -Author: 1991 David A. Gates, U. C. Berkeley CAD Group -**********/ - -#include "ngspice/ngspice.h" -#include "ngspice/numglobs.h" -#include "ngspice/numenum.h" -#include "ngspice/twomesh.h" -#include "twoddefs.h" -#include "twodext.h" - -void -nodeFields(TWOelem *pElem, TWOnode *pNode, double *ex, double *ey) -{ - - TWOelem *pElemTL, *pElemTR, *pElemBL, *pElemBR; - TWOedge *pEdgeT, *pEdgeB, *pEdgeL, *pEdgeR; - int materT, materB, materL, materR; - double dxL = 0.0, dxR = 0.0, dyT = 0.0, dyB = 0.0; - double ef1, ef2, coeff1, coeff2; - - NG_IGNORE(pElem); - - /* Find all four neighboring elements */ - pElemTL = pNode->pTLElem; - pElemTR = pNode->pTRElem; - pElemBL = pNode->pBLElem; - pElemBR = pNode->pBRElem; - - /* Null edge pointers */ - pEdgeT = pEdgeB = pEdgeL = pEdgeR = NULL; - - /* Find edges next to node */ - if (pElemTL != NULL) { - if (pElemTL->evalEdges[1]) { - pEdgeT = pElemTL->pRightEdge; - materT = pElemTL->elemType; - dyT = pElemTL->dy; - } - if (pElemTL->evalEdges[2]) { - pEdgeL = pElemTL->pBotEdge; - materL = pElemTL->elemType; - dxL = pElemTL->dx; - } - } - if (pElemTR != NULL) { - if (pElemTR->evalEdges[3]) { - pEdgeT = pElemTR->pLeftEdge; - materT = pElemTR->elemType; - dyT = pElemTR->dy; - } - if (pElemTR->evalEdges[2]) { - pEdgeR = pElemTR->pBotEdge; - materR = pElemTR->elemType; - dxR = pElemTR->dx; - } - } - if (pElemBR != NULL) { - if (pElemBR->evalEdges[3]) { - pEdgeB = pElemBR->pLeftEdge; - materB = pElemBR->elemType; - dyB = pElemBR->dy; - } - if (pElemBR->evalEdges[0]) { - pEdgeR = pElemBR->pTopEdge; - materR = pElemBR->elemType; - dxR = pElemBR->dx; - } - } - if (pElemBL != NULL) { - if (pElemBL->evalEdges[1]) { - pEdgeB = pElemBL->pRightEdge; - materB = pElemBL->elemType; - dyB = pElemBL->dy; - } - if (pElemBL->evalEdges[0]) { - pEdgeL = pElemBL->pTopEdge; - materL = pElemBL->elemType; - dxL = pElemBL->dx; - } - } - /* compute horizontal vector components */ - /* No more than one of Left Edge or Right Edge is absent */ - if (pEdgeL == NULL) { - if (pNode->nodeType == CONTACT) { - *ex = -pEdgeR->dPsi / dxR; - } else { - *ex = 0.0; - } - } else if (pEdgeR == NULL) { - if (pNode->nodeType == CONTACT) { - *ex = -pEdgeL->dPsi / dxL; - } else { - *ex = 0.0; - } - } else { /* Both edges are present */ - coeff1 = dxL / (dxL + dxR); - coeff2 = dxR / (dxL + dxR); - ef1 = -pEdgeL->dPsi / dxL; - ef2 = -pEdgeR->dPsi / dxR; - *ex = coeff2 * ef1 + coeff1 * ef2; - } - - /* compute vertical vector components */ - /* No more than one of Top Edge or Bottom Edge is absent */ - if (pEdgeT == NULL) { - if (pNode->nodeType == CONTACT) { - *ey = -pEdgeB->dPsi / dyB; - } else { - *ey = 0.0; - } - } else if (pEdgeB == NULL) { - if (pNode->nodeType == CONTACT) { - *ey = -pEdgeT->dPsi / dyT; - } else { - *ey = 0.0; - } - } else { /* Both edges are present */ - coeff1 = dyT / (dyT + dyB); - coeff2 = dyB / (dyT + dyB); - ef1 = -pEdgeT->dPsi / dyT; - ef2 = -pEdgeB->dPsi / dyB; - *ey = coeff2 * ef1 + coeff1 * ef2; - } -} diff --git a/src/ciderlib/twod/twomesh.c b/src/ciderlib/twod/twomesh.c deleted file mode 100644 index 161bb0c3c..000000000 --- a/src/ciderlib/twod/twomesh.c +++ /dev/null @@ -1,626 +0,0 @@ -/********** -Copyright 1991 Regents of the University of California. All rights reserved. -Author: 1987 Kartikeya Mayaram, U. C. Berkeley CAD Group -Author: 1991 David A. Gates, U. C. Berkeley CAD Group -**********/ - -#include "ngspice/ngspice.h" -#include "ngspice/numglobs.h" -#include "ngspice/numconst.h" -#include "ngspice/numenum.h" -#include "ngspice/twomesh.h" -#include "ngspice/twodev.h" -#include "ngspice/bool.h" -#include "twoddefs.h" -#include "twodext.h" - - - -static void doMobCoeffs(TWOelem *, int); -static void resetEvalFlag(TWOdevice *pDevice); - - -void -TWObuildMesh(TWOdevice *pDevice, TWOdomain *pDomain, - TWOelectrode *pElectrode, TWOmaterial *pMaterial) -{ - int xIndex, yIndex, eIndex, index; - int elemType; - TWOelem *pElem, *pElem1; - TWOnode *pNode, *pNode1, *pNextHNode, *pNextVNode, *pNextDNode; - TWOnode ***nodeArray = NULL; - TWOedge *pEdge; - TWOedge ***edgeArrayH = NULL, ***edgeArrayV = NULL; - TWOdomain *pD; - TWOelectrode *pE; - TWOmaterial *pM; - BOOLEAN interiorNode; - int poiEqn, numEqn, numElem, numNodes, numEdges; - int numXNodes = pDevice->numXNodes; - int numYNodes = pDevice->numYNodes; - double *xScale = pDevice->xScale; - double *yScale = pDevice->yScale; -#ifdef NOTDEF - FILE *meshFile; -#endif - - /* Generate work arrays. */ - XCALLOC(nodeArray, TWOnode **, 1 + numXNodes); - for (xIndex = 1; xIndex <= numXNodes; xIndex++) { - XCALLOC(nodeArray[xIndex], TWOnode *, 1 + numYNodes); - } - - /* Generate the nodes. */ - for (xIndex = 1; xIndex <= numXNodes; xIndex++) { - for (yIndex = 1; yIndex <= numYNodes; yIndex++) { - XCALLOC(pNode, TWOnode, 1); - pNode->nodeI = xIndex; - pNode->nodeJ = yIndex; - pNode->poiEqn = 0; - nodeArray[xIndex][yIndex] = pNode; - } - } - - /* Mark the semiconductor/insulator domains. */ - if (pDomain == NULL) { - fprintf(stderr, "Error: domains not defined for device\n"); - exit(-1); - } - for (pD = pDomain; pD != NULL; pD = pD->next) { - for (pM = pMaterial; pM != NULL; pM = pM->next) { - if (pD->material == pM->id) { - break; - } - } - elemType = pM->type; - for (xIndex = pD->ixLo; xIndex <= pD->ixHi; xIndex++) { - for (yIndex = pD->iyLo; yIndex <= pD->iyHi; yIndex++) { - pNode = nodeArray[xIndex][yIndex]; - pNode->nodeType = elemType; - } - } - } - /* Now mark all the metallic domains */ - for (pE = pElectrode; pE != NULL; pE = pE->next) { - for (xIndex = pE->ixLo; xIndex <= pE->ixHi; xIndex++) { - for (yIndex = pE->iyLo; yIndex <= pE->iyHi; yIndex++) { - pNode = nodeArray[xIndex][yIndex]; - pNode->nodeType = CONTACT; - } - } - } - /* - * Now mark as NULL any node in the interior of an electrode, i.e. none of - * its neighbors is a different material. - */ - for (xIndex = 1; xIndex <= numXNodes; xIndex++) { - for (yIndex = 1; yIndex <= numYNodes; yIndex++) { - pNode = nodeArray[xIndex][yIndex]; - if (pNode->nodeType == CONTACT) { - interiorNode = TRUE; - if (xIndex > 1) { - pNode1 = nodeArray[xIndex - 1][yIndex]; - if (pNode1->nodeType != 0 - && pNode1->nodeType != CONTACT) { - interiorNode = FALSE; - } - } - if (interiorNode && xIndex < numXNodes) { - pNode1 = nodeArray[xIndex + 1][yIndex]; - if (pNode1->nodeType != 0 - && pNode1->nodeType != CONTACT) { - interiorNode = FALSE; - } - } - if (interiorNode && yIndex > 1) { - pNode1 = nodeArray[xIndex][yIndex - 1]; - if (pNode1->nodeType != 0 - && pNode1->nodeType != CONTACT) { - interiorNode = FALSE; - } - } - if (interiorNode && yIndex < numYNodes) { - pNode1 = nodeArray[xIndex][yIndex + 1]; - if (pNode1->nodeType != 0 - && pNode1->nodeType != CONTACT) { - interiorNode = FALSE; - } - } - if (interiorNode) { - pNode->nodeType = 0; - } - } - } - } - - /* Delete nodes that do not belong to any domain. */ - numNodes = 0; - for (yIndex = 1; yIndex <= numYNodes; yIndex++) { - for (xIndex = 1; xIndex <= numXNodes; xIndex++) { - pNode = nodeArray[xIndex][yIndex]; - if (pNode->nodeType == 0) { - /* This node doesn't belong to a domain so delete it. */ - nodeArray[xIndex][yIndex] = NULL; - FREE(pNode); - } else { - numNodes++; - } - } - } - pDevice->numNodes = numNodes; - - /* Now relabel any remaining nodes that are part of electrodes. */ - setupContacts(pDevice, pElectrode, nodeArray); - - /* Done with the nodes. Now construct the elements and the edges. */ - numEdges = 0; - - /* Generate the horizontal edges and store in a work array. */ - XCALLOC(edgeArrayH, TWOedge **, numXNodes); - for (xIndex = 1; xIndex < numXNodes; xIndex++) { - XCALLOC(edgeArrayH[xIndex], TWOedge *, 1 + numYNodes); - } - for (yIndex = 1; yIndex <= numYNodes; yIndex++) { - for (xIndex = 1; xIndex < numXNodes; xIndex++) { - pNode = nodeArray[xIndex][yIndex]; - pNextHNode = nodeArray[xIndex + 1][yIndex]; - if (pNode != NULL && - pNextHNode != NULL) { - XCALLOC(pEdge, TWOedge, 1); - numEdges++; - edgeArrayH[xIndex][yIndex] = pEdge; - } - } - } - - /* Generate the vertical edges and store in a work array. */ - XCALLOC(edgeArrayV, TWOedge **, 1 + numXNodes); - for (xIndex = 1; xIndex <= numXNodes; xIndex++) { - XCALLOC(edgeArrayV[xIndex], TWOedge *, numYNodes); - } - for (xIndex = 1; xIndex <= numXNodes; xIndex++) { - for (yIndex = 1; yIndex < numYNodes; yIndex++) { - pNode = nodeArray[xIndex][yIndex]; - pNextVNode = nodeArray[xIndex][yIndex + 1]; - if (pNode != NULL && - pNextVNode != NULL) { - XCALLOC(pEdge, TWOedge, 1); - numEdges++; - edgeArrayV[xIndex][yIndex] = pEdge; - } - } - } - pDevice->numEdges = numEdges; - - /* Now construct and count the elements and store the node/edge pointers. */ - numElem = 1; - for (yIndex = 1; yIndex < numYNodes; yIndex++) { - for (xIndex = 1; xIndex < numXNodes; xIndex++) { - pNode = nodeArray[xIndex][yIndex]; - pNextHNode = nodeArray[xIndex + 1][yIndex]; - pNextVNode = nodeArray[xIndex][yIndex + 1]; - pNextDNode = nodeArray[xIndex + 1][yIndex + 1]; - if (pNode != NULL && - pNextHNode != NULL && - pNextVNode != NULL && - pNextDNode != NULL) { - numElem++; - XCALLOC(pElem, TWOelem, 1); - pElem->pTLNode = pNode; - pElem->pTRNode = pNextHNode; - pElem->pBLNode = pNextVNode; - pElem->pBRNode = pNextDNode; - pElem->pTopEdge = edgeArrayH[xIndex][yIndex]; - pElem->pBotEdge = edgeArrayH[xIndex][yIndex + 1]; - pElem->pLeftEdge = edgeArrayV[xIndex][yIndex]; - pElem->pRightEdge = edgeArrayV[xIndex + 1][yIndex]; - pDevice->elemArray[xIndex][yIndex] = pElem; - } else { - pDevice->elemArray[xIndex][yIndex] = NULL; - } - } - } - - /* Create and pack the 1D element array. */ - pDevice->numElems = numElem - 1; - XCALLOC(pDevice->elements, TWOelem *, 1 + numElem); - numElem = 1; - for (yIndex = 1; yIndex < numYNodes; yIndex++) { - for (xIndex = 1; xIndex < numXNodes; xIndex++) { - pElem = pDevice->elemArray[xIndex][yIndex]; - if (pElem != NULL) { - pDevice->elements[numElem++] = pElem; - } - } - } - - /* Now create back links from elements to nodes. */ - for (yIndex = 1; yIndex < numYNodes; yIndex++) { - for (xIndex = 1; xIndex < numXNodes; xIndex++) { - pElem = pDevice->elemArray[xIndex][yIndex]; - if (pElem != NULL) { - pElem->pTLNode->pBRElem = pElem; - pElem->pTRNode->pBLElem = pElem; - pElem->pBLNode->pTRElem = pElem; - pElem->pBRNode->pTLElem = pElem; - if (xIndex > 1) { - pElem->pLeftElem = pDevice->elemArray[xIndex-1][yIndex]; - } - if (xIndex < numXNodes - 1) { - pElem->pRightElem = pDevice->elemArray[xIndex+1][yIndex]; - } - if (yIndex > 1) { - pElem->pTopElem = pDevice->elemArray[xIndex][yIndex-1]; - } - if (yIndex < numYNodes - 1) { - pElem->pBotElem = pDevice->elemArray[xIndex][yIndex+1]; - } - } - } - } - - /* Establish the element types using domain info. */ - for (pD = pDomain; pD != NULL; pD = pD->next) { - for (pM = pMaterial; pM != NULL; pM = pM->next) { - if (pD->material == pM->id) { - break; - } - } - elemType = pM->type; - for (yIndex = pD->iyLo; yIndex < pD->iyHi; yIndex++) { - for (xIndex = pD->ixLo; xIndex < pD->ixHi; xIndex++) { - pElem = pDevice->elemArray[xIndex][yIndex]; - if (pElem != NULL) { - pElem->domain = pD->id; - pElem->elemType = elemType; - pElem->matlInfo = pM; - } - } - } - } - - /* Establish the edge types. */ - for (yIndex = 1; yIndex < numYNodes; yIndex++) { - for (xIndex = 1; xIndex < numXNodes; xIndex++) { - pElem = pDevice->elemArray[xIndex][yIndex]; - if (pElem != NULL) { - for (index = 0; index <= 3; index++) { - pEdge = pElem->pEdges[index]; - pNode = pElem->pNodes[index]; - pNode1 = pElem->pNodes[(index + 1) % 4]; - pElem1 = pNode1->pElems[index]; - - if (pNode->nodeType == CONTACT && - pNode1->nodeType == CONTACT) { - /* Contact edge */ - pEdge->edgeType = CONTACT; - } else if (pNode->nodeType == SCHOTTKY && - pNode1->nodeType == SCHOTTKY) { - /* Schottky edge */ - pEdge->edgeType = SCHOTTKY; - } else if (pElem1 == NULL) { - /* Neumann edge */ - pEdge->edgeType = pElem->elemType; - } else if (pElem->elemType != pElem1->elemType) { - /* Interface edge */ - pEdge->edgeType = INTERFACE; - } else { /* Ignore heterojnxns for now */ - /* Heterojunction or Homojunction edge */ - pEdge->edgeType = pElem->elemType; - } - } - } - } - } - - resetEvalFlag(pDevice); - /* Set evaluation flags on nodes and edges. */ - /* Assign the dx and dy terms in the elements while we're at it. */ - for (yIndex = 1; yIndex < numYNodes; yIndex++) { - for (xIndex = 1; xIndex < numXNodes; xIndex++) { - pElem = pDevice->elemArray[xIndex][yIndex]; - if (pElem != NULL) { - pElem->dx = xScale[xIndex + 1] - xScale[xIndex]; - pElem->dy = yScale[yIndex + 1] - yScale[yIndex]; - pElem->dxOverDy = pElem->dx / pElem->dy; - pElem->dyOverDx = pElem->dy / pElem->dx; - - /* - * Semiconductor elements take precedence over Insulator elements, so - * set them up first. - */ - for (index = 0; index <= 3; index++) { - if (pElem->elemType == SEMICON) { - pNode = pElem->pNodes[index]; - if (!pNode->evaluated) { - pNode->evaluated = TRUE; - pElem->evalNodes[index] = TRUE; - } else { - pElem->evalNodes[index] = FALSE; - } - pEdge = pElem->pEdges[index]; - if (!pEdge->evaluated) { - pEdge->evaluated = TRUE; - pElem->evalEdges[index] = TRUE; - } else { - pElem->evalEdges[index] = FALSE; - } - } - } - } - } - } - - /* Do a second setup pass for Insulator elements */ - /* Do mobility coefficients now, because we set up dx and dy - * in the previous pass - */ - for (yIndex = 1; yIndex < numYNodes; yIndex++) { - for (xIndex = 1; xIndex < numXNodes; xIndex++) { - pElem = pDevice->elemArray[xIndex][yIndex]; - if (pElem != NULL) { - pElem->direction = 0; - pElem->channel = 0; - pElem->surface = FALSE; - for (index = 0; index <= 3; index++) { - if (pElem->elemType == SEMICON) { - doMobCoeffs( pElem, index ); - } else if (pElem->elemType == INSULATOR) { - pNode = pElem->pNodes[index]; - if (!pNode->evaluated) { - pNode->evaluated = TRUE; - pElem->evalNodes[index] = TRUE; - } else { - pElem->evalNodes[index] = FALSE; - } - pEdge = pElem->pEdges[index]; - if (!pEdge->evaluated) { - pEdge->evaluated = TRUE; - pElem->evalEdges[index] = TRUE; - } else { - pElem->evalEdges[index] = FALSE; - } - } - } - } - } - } - - /* Set up the equation numbers for nodes. */ - poiEqn = numEqn = 1; - for (eIndex = 1; eIndex <= pDevice->numElems; eIndex++) { - pElem = pDevice->elements[eIndex]; - for (index = 0; index <= 3; index++) { - if (pElem->evalNodes[index]) { - pNode = pElem->pNodes[index]; - if (pNode->nodeType != CONTACT) { - /* First assign potential equation numbers */ - if (pNode->nodeType != SCHOTTKY) { - pNode->poiEqn = poiEqn++; - pNode->psiEqn = numEqn++; - } - /* Now assign carrier-concentration equation numbers */ - if (pElem->elemType == INSULATOR) { - pNode->nEqn = 0; - pNode->pEqn = 0; - } else { - if (OneCarrier) { - /* n and p get same number */ - pNode->nEqn = numEqn; - pNode->pEqn = numEqn++; - } else { - pNode->nEqn = numEqn++; - pNode->pEqn = numEqn++; - } - } - } else { /* This is a contact node. */ - pNode->poiEqn = 0; - pNode->psiEqn = 0; - pNode->nEqn = 0; - pNode->pEqn = 0; - } - } - } - } - pDevice->dimEquil = poiEqn; - pDevice->dimBias = numEqn; - - /* Open and Print Mesh Output File for Debugging */ - /* Nuked from release version */ -#ifdef NOTDEF - if (!(meshFile = fopen("mesh.out", "w"))) { - perror("mesh.out"); - exit(-1); - } - for (eIndex = 1; eIndex <= pDevice->numElems; eIndex++) { - pElem = pDevice->elements[eIndex]; - for (index = 0; index <= 3; index++) { - if (pElem->evalNodes[index]) { - pNode = pElem->pNodes[index]; - fprintf(meshFile, "node: %5d %5d %5d %5d\n", pNode->nodeI, - pNode->nodeJ, pNode->poiEqn, pNode->psiEqn); - } - } - } - fflush(meshFile); - fclose(meshFile); -#endif - - /* Delete work arrays. */ - for (xIndex = 1; xIndex <= numXNodes; xIndex++) { - FREE(nodeArray[xIndex]); - FREE(edgeArrayV[xIndex]); - } - for (xIndex = 1; xIndex < numXNodes; xIndex++) { - FREE(edgeArrayH[xIndex]); - } - FREE(nodeArray); - FREE(edgeArrayV); - FREE(edgeArrayH); - - /* - * TWOprnMesh( pDevice ); - */ -} - -void -TWOprnMesh(TWOdevice *pDevice) -{ - int eIndex, index; - TWOelem *pElem; - TWOnode *pNode; - TWOedge *pEdge; - char *name; - - for (eIndex = 1; eIndex <= pDevice->numElems; eIndex++) { - pElem = pDevice->elements[eIndex]; - fprintf(stderr, "elem %5d:\n", eIndex); - for (index = 0; index <= 3; index++) { - if (pElem->evalNodes[index]) { - pNode = pElem->pNodes[index]; - switch (pNode->nodeType) { - case SEMICON: - name = "semiconductor"; - break; - case INSULATOR: - name = "insulator"; - break; - case CONTACT: - name = "contact"; - break; - case SCHOTTKY: - name = "schottky"; - break; - case INTERFACE: - name = "interface"; - break; - default: - name = "unknown"; - break; - } - fprintf(stderr, "node %5d: %s %5d %5d\n", index, name, - pNode->nodeI, pNode->nodeJ); - } - if (pElem->evalEdges[index]) { - pEdge = pElem->pEdges[index]; - switch (pEdge->edgeType) { - case SEMICON: - name = "semiconductor"; - break; - case INSULATOR: - name = "insulator"; - break; - case CONTACT: - name = "contact"; - break; - case SCHOTTKY: - name = "schottky"; - break; - case INTERFACE: - name = "interface"; - break; - default: - name = "unknown"; - break; - } - fprintf(stderr, "edge %5d: %s\n", index, name); - } - } - } -} - -/* - * We have a separate function for this, so that the setup routines can - * reset the state pointers without rebuilding the entire mesh. - */ -void -TWOgetStatePointers(TWOdevice *pDevice, int *numStates) -{ - int eIndex, index; - TWOelem *pElem; - TWOnode *pNode; - TWOedge *pEdge; - - for (eIndex = 1; eIndex <= pDevice->numElems; eIndex++) { - pElem = pDevice->elements[eIndex]; - for (index = 0; index <= 3; index++) { - if (pElem->evalNodes[index]) { - pNode = pElem->pNodes[index]; - pNode->nodeState = *numStates; - *numStates += TWOnumNodeStates; - } - if (pElem->evalEdges[index]) { - pEdge = pElem->pEdges[index]; - pEdge->edgeState = *numStates; - *numStates += TWOnumEdgeStates; - } - } - } -} - -/* - * This function computes the percentages of the total semiconductor - * width of an edge on the negative and positive sides of the edge - */ -static void -doMobCoeffs(TWOelem *pElem, int index) -{ - TWOelem *pNElem; - TWOedge *pEdge; - double dl1 = 0.0, dl2 = 0.0; - - pNElem = pElem->pElems[ index ]; - pEdge = pElem->pEdges[ index ]; - - /* If neighbor is not SEMICON, assign and return */ - if ( (pNElem == NULL) || (pNElem->elemType == INSULATOR) ) { - if ( index == 0 || index == 3 ) { - pEdge->kNeg = 0.0; - pEdge->kPos = 1.0; - } else { - pEdge->kNeg = 1.0; - pEdge->kPos = 0.0; - } - return; - } - - /* Find appropriate dimensions of the elements */ - switch ( index ) { - case 0: - dl1 = pNElem->dy; - dl2 = pElem->dy; - break; - case 1: - dl1 = pElem->dx; - dl2 = pNElem->dx; - break; - case 2: - dl1 = pElem->dy; - dl2 = pNElem->dy; - break; - case 3: - dl1 = pNElem->dx; - dl2 = pElem->dx; - break; - } - - /* Assign coefficients */ - pEdge->kNeg = dl1 / (dl1 + dl2); - pEdge->kPos = dl2 / (dl1 + dl2); - -} - -static void -resetEvalFlag(TWOdevice *pDevice) -{ - int index, eIndex; - TWOelem *pElem; - - for (eIndex = 1; eIndex <= pDevice->numElems; eIndex++) { - pElem = pDevice->elements[eIndex]; - for (index = 0; index <= 3; index++) { - pElem->pNodes[index]->evaluated = FALSE; - pElem->pEdges[index]->evaluated = FALSE; - } - } -} diff --git a/src/ciderlib/twod/twomobdv.c b/src/ciderlib/twod/twomobdv.c deleted file mode 100644 index 7c18122df..000000000 --- a/src/ciderlib/twod/twomobdv.c +++ /dev/null @@ -1,1399 +0,0 @@ -/********** -Copyright 1991 Regents of the University of California. All rights reserved. -Author: 1991 David A. Gates, U. C. Berkeley CAD Group -**********/ - -#include "ngspice/ngspice.h" -#include "ngspice/numglobs.h" -#include "ngspice/twomesh.h" -#include "ngspice/bool.h" -#include "twoddefs.h" -#include "twodext.h" - -/* - * Load the derivatives of the current with respect to changes in - * the mobility, for all edges of a silicon element. - * It is known a priori that the element is made of semiconductor. - * These routines work for both channel and bulk elements. - */ - -void - TWO_mobDeriv( TWOelem* pElem, int chanType, double ds ) - /* TWOelem *pElem: channel or bulk element */ - /* int chanType: flag for direction of channel */ - /* double ds: normalized hgt (len) of interface element */ -{ - TWOnode *pNode; - TWOedge *pTEdge, *pBEdge, *pLEdge, *pREdge; - BOOLEAN channel = pElem->channel; - double dx, dy, rDx, rDy; - double coeffHx, coeffHy, coeffHs = 0.0; - double coeffVx, coeffVy, coeffVs = 0.0; - double dFnxDMun, dFnyDMun, dFnDEs = 0.0; - double dFpxDMup, dFpyDMup, dFpDEs = 0.0; - double dMnDEs, dMnDEx, dMnDEy, dMnDWx, dMnDWy; - double dMpDEs, dMpDEx, dMpDEy, dMpDWx, dMpDWy; - - /* Initialize various quantities */ - dx = pElem->dx; - dy = pElem->dy; - rDx = 1.0 / dx; - rDy = 1.0 / dy; - - /* compute length-dependent parameters */ - coeffHx = 0.25 * dy * rDx; /* For horizontal edges */ - coeffHy = 0.25; - coeffVx = 0.25; /* For vertical edges */ - coeffVy = 0.25 * dx * rDy; - switch ( chanType ) { - case 0: - case 3: - coeffHs = 0.25 * dy / ds; - coeffVs = 0.25 * dx / ds; - break; - case 1: - case 2: - coeffHs = - 0.25 * dy / ds; - coeffVs = - 0.25 * dx / ds; - break; - } - - /* Get pointers to element's edges */ - pTEdge = pElem->pTopEdge; - pBEdge = pElem->pBotEdge; - pLEdge = pElem->pLeftEdge; - pREdge = pElem->pRightEdge; - - /* Get element mobility derivatives for fast access later */ - dMnDEs = pElem->dMunDEs; - dMnDEx = pElem->dMunDEx; - dMnDEy = pElem->dMunDEy; - dMnDWx = pElem->dMunDWx; - dMnDWy = pElem->dMunDWy; - dMpDEs = pElem->dMupDEs; - dMpDEx = pElem->dMupDEx; - dMpDEy = pElem->dMupDEy; - dMpDWx = pElem->dMupDWx; - dMpDWy = pElem->dMupDWy; - - /* Add mobility derivatives due to Top Edge */ - /* First compute derivatives of cont. eqn's */ - dFnxDMun = coeffHx * (pTEdge->wdfn * rDx); - dFnyDMun = coeffHy * (pTEdge->wdfn * rDx); - dFpxDMup = coeffHx * (pTEdge->wdfp * rDx); - dFpyDMup = coeffHy * (pTEdge->wdfp * rDx); - - /* Do Top-Left (TL) Node of Element */ - pNode = pElem->pTLNode; - /* n continuity wrto potential derivatives */ - *(pNode->fNPsi) += - dFnxDMun * ( dMnDEx - dMnDWx * pTEdge->dWnDpsiP1 ) - + dFnyDMun * ( dMnDEy - dMnDWy * pLEdge->dWnDpsiP1 ); - *(pNode->fNPsiiP1) += - - dFnxDMun * ( dMnDEx - dMnDWx * pTEdge->dWnDpsiP1 ) - + dFnyDMun * ( dMnDEy - dMnDWy * pREdge->dWnDpsiP1 ); - *(pNode->fNPsiiP1jP1) += - - dFnxDMun * ( dMnDEx - dMnDWx * pBEdge->dWnDpsiP1 ) - - dFnyDMun * ( dMnDEy - dMnDWy * pREdge->dWnDpsiP1 ); - *(pNode->fNPsijP1) += - dFnxDMun * ( dMnDEx - dMnDWx * pBEdge->dWnDpsiP1 ) - - dFnyDMun * ( dMnDEy - dMnDWy * pLEdge->dWnDpsiP1 ); - /* p continuity wrto potential derivatives */ - *(pNode->fPPsi) += - dFpxDMup * ( dMpDEx - dMpDWx * pTEdge->dWpDpsiP1 ) - + dFpyDMup * ( dMpDEy - dMpDWy * pLEdge->dWpDpsiP1 ); - *(pNode->fPPsiiP1) += - - dFpxDMup * ( dMpDEx - dMpDWx * pTEdge->dWpDpsiP1 ) - + dFpyDMup * ( dMpDEy - dMpDWy * pREdge->dWpDpsiP1 ); - *(pNode->fPPsiiP1jP1) += - - dFpxDMup * ( dMpDEx - dMpDWx * pBEdge->dWpDpsiP1 ) - - dFpyDMup * ( dMpDEy - dMpDWy * pREdge->dWpDpsiP1 ); - *(pNode->fPPsijP1) += - dFpxDMup * ( dMpDEx - dMpDWx * pBEdge->dWpDpsiP1 ) - - dFpyDMup * ( dMpDEy - dMpDWy * pLEdge->dWpDpsiP1 ); - /* n continuity wrto n derivatives */ - *(pNode->fNN) += - dFnxDMun * ( dMnDWx * pTEdge->dWnDn ) - + dFnyDMun * ( dMnDWy * pLEdge->dWnDn ); - *(pNode->fNNiP1) += - dFnxDMun * ( dMnDWx * pTEdge->dWnDnP1 ) - + dFnyDMun * ( dMnDWy * pREdge->dWnDn ); - *(pNode->fNNiP1jP1) += - dFnxDMun * ( dMnDWx * pBEdge->dWnDnP1 ) - + dFnyDMun * ( dMnDWy * pREdge->dWnDnP1 ); - *(pNode->fNNjP1) += - dFnxDMun * ( dMnDWx * pBEdge->dWnDn ) - + dFnyDMun * ( dMnDWy * pLEdge->dWnDnP1 ); - /* p continuity wrto p derivatives */ - *(pNode->fPP) += - dFpxDMup * ( dMpDWx * pTEdge->dWpDp ) - + dFpyDMup * ( dMpDWy * pLEdge->dWpDp ); - *(pNode->fPPiP1) += - dFpxDMup * ( dMpDWx * pTEdge->dWpDpP1 ) - + dFpyDMup * ( dMpDWy * pREdge->dWpDp ); - *(pNode->fPPiP1jP1) += - dFpxDMup * ( dMpDWx * pBEdge->dWpDpP1 ) - + dFpyDMup * ( dMpDWy * pREdge->dWpDpP1 ); - *(pNode->fPPjP1) += - dFpxDMup * ( dMpDWx * pBEdge->dWpDp ) - + dFpyDMup * ( dMpDWy * pLEdge->dWpDpP1 ); - - /* both continuity wrto surface potential derivatives */ - if ( channel ) { - dFnDEs = coeffHs * (pTEdge->wdfn * rDx) * dMnDEs; - dFpDEs = coeffHs * (pTEdge->wdfp * rDx) * dMpDEs; - *(pNode->fNPsiIn) -= dFnDEs; - *(pNode->fNPsiInP1) -= dFnDEs; - *(pNode->fNPsiOx) += dFnDEs; - *(pNode->fNPsiOxP1) += dFnDEs; - *(pNode->fPPsiIn) -= dFpDEs; - *(pNode->fPPsiInP1) -= dFpDEs; - *(pNode->fPPsiOx) += dFpDEs; - *(pNode->fPPsiOxP1) += dFpDEs; - } - - /* Do Top-Right (TR) Node of Element */ - pNode = pElem->pTRNode; - /* n continuity wrto potential derivatives */ - *(pNode->fNPsiiM1) -= - dFnxDMun * ( dMnDEx - dMnDWx * pTEdge->dWnDpsiP1 ) - + dFnyDMun * ( dMnDEy - dMnDWy * pLEdge->dWnDpsiP1 ); - *(pNode->fNPsi) -= - - dFnxDMun * ( dMnDEx - dMnDWx * pTEdge->dWnDpsiP1 ) - + dFnyDMun * ( dMnDEy - dMnDWy * pREdge->dWnDpsiP1 ); - *(pNode->fNPsijP1) -= - - dFnxDMun * ( dMnDEx - dMnDWx * pBEdge->dWnDpsiP1 ) - - dFnyDMun * ( dMnDEy - dMnDWy * pREdge->dWnDpsiP1 ); - *(pNode->fNPsiiM1jP1) -= - dFnxDMun * ( dMnDEx - dMnDWx * pBEdge->dWnDpsiP1 ) - - dFnyDMun * ( dMnDEy - dMnDWy * pLEdge->dWnDpsiP1 ); - /* p continuity wrto potential derivatives */ - *(pNode->fPPsiiM1) -= - dFpxDMup * ( dMpDEx - dMpDWx * pTEdge->dWpDpsiP1 ) - + dFpyDMup * ( dMpDEy - dMpDWy * pLEdge->dWpDpsiP1 ); - *(pNode->fPPsi) -= - - dFpxDMup * ( dMpDEx - dMpDWx * pTEdge->dWpDpsiP1 ) - + dFpyDMup * ( dMpDEy - dMpDWy * pREdge->dWpDpsiP1 ); - *(pNode->fPPsijP1) -= - - dFpxDMup * ( dMpDEx - dMpDWx * pBEdge->dWpDpsiP1 ) - - dFpyDMup * ( dMpDEy - dMpDWy * pREdge->dWpDpsiP1 ); - *(pNode->fPPsiiM1jP1) -= - dFpxDMup * ( dMpDEx - dMpDWx * pBEdge->dWpDpsiP1 ) - - dFpyDMup * ( dMpDEy - dMpDWy * pLEdge->dWpDpsiP1 ); - /* n continuity wrto n derivatives */ - *(pNode->fNNiM1) -= - dFnxDMun * ( dMnDWx * pTEdge->dWnDn ) - + dFnyDMun * ( dMnDWy * pLEdge->dWnDn ); - *(pNode->fNN) -= - dFnxDMun * ( dMnDWx * pTEdge->dWnDnP1 ) - + dFnyDMun * ( dMnDWy * pREdge->dWnDn ); - *(pNode->fNNjP1) -= - dFnxDMun * ( dMnDWx * pBEdge->dWnDnP1 ) - + dFnyDMun * ( dMnDWy * pREdge->dWnDnP1 ); - *(pNode->fNNiM1jP1) -= - dFnxDMun * ( dMnDWx * pBEdge->dWnDn ) - + dFnyDMun * ( dMnDWy * pLEdge->dWnDnP1 ); - /* p continuity wrto p derivatives */ - *(pNode->fPPiM1) -= - dFpxDMup * ( dMpDWx * pTEdge->dWpDp ) - + dFpyDMup * ( dMpDWy * pLEdge->dWpDp ); - *(pNode->fPP) -= - dFpxDMup * ( dMpDWx * pTEdge->dWpDpP1 ) - + dFpyDMup * ( dMpDWy * pREdge->dWpDp ); - *(pNode->fPPjP1) -= - dFpxDMup * ( dMpDWx * pBEdge->dWpDpP1 ) - + dFpyDMup * ( dMpDWy * pREdge->dWpDpP1 ); - *(pNode->fPPiM1jP1) -= - dFpxDMup * ( dMpDWx * pBEdge->dWpDp ) - + dFpyDMup * ( dMpDWy * pLEdge->dWpDpP1 ); - - /* both continuity wrto surface potential derivatives */ - if ( channel ) { - *(pNode->fNPsiInM1) += dFnDEs; - *(pNode->fNPsiIn) += dFnDEs; - *(pNode->fNPsiOxM1) -= dFnDEs; - *(pNode->fNPsiOx) -= dFnDEs; - *(pNode->fPPsiInM1) += dFpDEs; - *(pNode->fPPsiIn) += dFpDEs; - *(pNode->fPPsiOxM1) -= dFpDEs; - *(pNode->fPPsiOx) -= dFpDEs; - } - - - /* Add mobility derivatives due to Bottom Edge */ - /* First compute derivatives of cont. eqn's */ - dFnxDMun = coeffHx * (pBEdge->wdfn * rDx); - dFnyDMun = coeffHy * (pBEdge->wdfn * rDx); - dFpxDMup = coeffHx * (pBEdge->wdfp * rDx); - dFpyDMup = coeffHy * (pBEdge->wdfp * rDx); - - /* Do Bottom-Left (BL) Node of Element */ - pNode = pElem->pBLNode; - /* n continuity wrto potential derivatives */ - *(pNode->fNPsijM1) += - dFnxDMun * ( dMnDEx - dMnDWx * pTEdge->dWnDpsiP1 ) - + dFnyDMun * ( dMnDEy - dMnDWy * pLEdge->dWnDpsiP1 ); - *(pNode->fNPsiiP1jM1) += - - dFnxDMun * ( dMnDEx - dMnDWx * pTEdge->dWnDpsiP1 ) - + dFnyDMun * ( dMnDEy - dMnDWy * pREdge->dWnDpsiP1 ); - *(pNode->fNPsiiP1) += - - dFnxDMun * ( dMnDEx - dMnDWx * pBEdge->dWnDpsiP1 ) - - dFnyDMun * ( dMnDEy - dMnDWy * pREdge->dWnDpsiP1 ); - *(pNode->fNPsi) += - dFnxDMun * ( dMnDEx - dMnDWx * pBEdge->dWnDpsiP1 ) - - dFnyDMun * ( dMnDEy - dMnDWy * pLEdge->dWnDpsiP1 ); - /* p continuity wrto potential derivatives */ - *(pNode->fPPsijM1) += - dFpxDMup * ( dMpDEx - dMpDWx * pTEdge->dWpDpsiP1 ) - + dFpyDMup * ( dMpDEy - dMpDWy * pLEdge->dWpDpsiP1 ); - *(pNode->fPPsiiP1jM1) += - - dFpxDMup * ( dMpDEx - dMpDWx * pTEdge->dWpDpsiP1 ) - + dFpyDMup * ( dMpDEy - dMpDWy * pREdge->dWpDpsiP1 ); - *(pNode->fPPsiiP1) += - - dFpxDMup * ( dMpDEx - dMpDWx * pBEdge->dWpDpsiP1 ) - - dFpyDMup * ( dMpDEy - dMpDWy * pREdge->dWpDpsiP1 ); - *(pNode->fPPsi) += - dFpxDMup * ( dMpDEx - dMpDWx * pBEdge->dWpDpsiP1 ) - - dFpyDMup * ( dMpDEy - dMpDWy * pLEdge->dWpDpsiP1 ); - /* n continuity wrto n derivatives */ - *(pNode->fNNjM1) += - dFnxDMun * ( dMnDWx * pTEdge->dWnDn ) - + dFnyDMun * ( dMnDWy * pLEdge->dWnDn ); - *(pNode->fNNiP1jM1) += - dFnxDMun * ( dMnDWx * pTEdge->dWnDnP1 ) - + dFnyDMun * ( dMnDWy * pREdge->dWnDn ); - *(pNode->fNNiP1) += - dFnxDMun * ( dMnDWx * pBEdge->dWnDnP1 ) - + dFnyDMun * ( dMnDWy * pREdge->dWnDnP1 ); - *(pNode->fNN) += - dFnxDMun * ( dMnDWx * pBEdge->dWnDn ) - + dFnyDMun * ( dMnDWy * pLEdge->dWnDnP1 ); - /* p continuity wrto p derivatives */ - *(pNode->fPPjM1) += - dFpxDMup * ( dMpDWx * pTEdge->dWpDp ) - + dFpyDMup * ( dMpDWy * pLEdge->dWpDp ); - *(pNode->fPPiP1jM1) += - dFpxDMup * ( dMpDWx * pTEdge->dWpDpP1 ) - + dFpyDMup * ( dMpDWy * pREdge->dWpDp ); - *(pNode->fPPiP1) += - dFpxDMup * ( dMpDWx * pBEdge->dWpDpP1 ) - + dFpyDMup * ( dMpDWy * pREdge->dWpDpP1 ); - *(pNode->fPP) += - dFpxDMup * ( dMpDWx * pBEdge->dWpDp ) - + dFpyDMup * ( dMpDWy * pLEdge->dWpDpP1 ); - - /* both continuity wrto surface potential derivatives */ - if (channel ) { - dFnDEs = coeffHs * (pBEdge->wdfn * rDx) * dMnDEs; - dFpDEs = coeffHs * (pBEdge->wdfp * rDx) * dMpDEs; - *(pNode->fNPsiIn) -= dFnDEs; - *(pNode->fNPsiInP1) -= dFnDEs; - *(pNode->fNPsiOx) += dFnDEs; - *(pNode->fNPsiOxP1) += dFnDEs; - *(pNode->fPPsiIn) -= dFpDEs; - *(pNode->fPPsiInP1) -= dFpDEs; - *(pNode->fPPsiOx) += dFpDEs; - *(pNode->fPPsiOxP1) += dFpDEs; - } - - /* Do Bottom-Right (BR) Node of Element */ - pNode = pElem->pBRNode; - /* n continuity wrto potential derivatives */ - *(pNode->fNPsiiM1jM1) -= - dFnxDMun * ( dMnDEx - dMnDWx * pTEdge->dWnDpsiP1 ) - + dFnyDMun * ( dMnDEy - dMnDWy * pLEdge->dWnDpsiP1 ); - *(pNode->fNPsijM1) -= - - dFnxDMun * ( dMnDEx - dMnDWx * pTEdge->dWnDpsiP1 ) - + dFnyDMun * ( dMnDEy - dMnDWy * pREdge->dWnDpsiP1 ); - *(pNode->fNPsi) -= - - dFnxDMun * ( dMnDEx - dMnDWx * pBEdge->dWnDpsiP1 ) - - dFnyDMun * ( dMnDEy - dMnDWy * pREdge->dWnDpsiP1 ); - *(pNode->fNPsiiM1) -= - dFnxDMun * ( dMnDEx - dMnDWx * pBEdge->dWnDpsiP1 ) - - dFnyDMun * ( dMnDEy - dMnDWy * pLEdge->dWnDpsiP1 ); - /* p continuity wrto potential derivatives */ - *(pNode->fPPsiiM1jM1) -= - dFpxDMup * ( dMpDEx - dMpDWx * pTEdge->dWpDpsiP1 ) - + dFpyDMup * ( dMpDEy - dMpDWy * pLEdge->dWpDpsiP1 ); - *(pNode->fPPsijM1) -= - - dFpxDMup * ( dMpDEx - dMpDWx * pTEdge->dWpDpsiP1 ) - + dFpyDMup * ( dMpDEy - dMpDWy * pREdge->dWpDpsiP1 ); - *(pNode->fPPsi) -= - - dFpxDMup * ( dMpDEx - dMpDWx * pBEdge->dWpDpsiP1 ) - - dFpyDMup * ( dMpDEy - dMpDWy * pREdge->dWpDpsiP1 ); - *(pNode->fPPsiiM1) -= - dFpxDMup * ( dMpDEx - dMpDWx * pBEdge->dWpDpsiP1 ) - - dFpyDMup * ( dMpDEy - dMpDWy * pLEdge->dWpDpsiP1 ); - /* n continuity wrto n derivatives */ - *(pNode->fNNiM1jM1) -= - dFnxDMun * ( dMnDWx * pTEdge->dWnDn ) - + dFnyDMun * ( dMnDWy * pLEdge->dWnDn ); - *(pNode->fNNjM1) -= - dFnxDMun * ( dMnDWx * pTEdge->dWnDnP1 ) - + dFnyDMun * ( dMnDWy * pREdge->dWnDn ); - *(pNode->fNN) -= - dFnxDMun * ( dMnDWx * pBEdge->dWnDnP1 ) - + dFnyDMun * ( dMnDWy * pREdge->dWnDnP1 ); - *(pNode->fNNiM1) -= - dFnxDMun * ( dMnDWx * pBEdge->dWnDn ) - + dFnyDMun * ( dMnDWy * pLEdge->dWnDnP1 ); - /* p continuity wrto p derivatives */ - *(pNode->fPPiM1jM1) -= - dFpxDMup * ( dMpDWx * pTEdge->dWpDp ) - + dFpyDMup * ( dMpDWy * pLEdge->dWpDp ); - *(pNode->fPPjM1) -= - dFpxDMup * ( dMpDWx * pTEdge->dWpDpP1 ) - + dFpyDMup * ( dMpDWy * pREdge->dWpDp ); - *(pNode->fPP) -= - dFpxDMup * ( dMpDWx * pBEdge->dWpDpP1 ) - + dFpyDMup * ( dMpDWy * pREdge->dWpDpP1 ); - *(pNode->fPPiM1) -= - dFpxDMup * ( dMpDWx * pBEdge->dWpDp ) - + dFpyDMup * ( dMpDWy * pLEdge->dWpDpP1 ); - - /* both continuity wrto surface potential derivatives */ - if ( channel ) { - *(pNode->fNPsiInM1) += dFnDEs; - *(pNode->fNPsiIn) += dFnDEs; - *(pNode->fNPsiOxM1) -= dFnDEs; - *(pNode->fNPsiOx) -= dFnDEs; - *(pNode->fPPsiInM1) += dFpDEs; - *(pNode->fPPsiIn) += dFpDEs; - *(pNode->fPPsiOxM1) -= dFpDEs; - *(pNode->fPPsiOx) -= dFpDEs; - } - - /* Add mobility derivatives due to Left Edge */ - /* First compute derivatives of cont. eqn's */ - dFnxDMun = coeffVx * (pLEdge->wdfn * rDy); - dFnyDMun = coeffVy * (pLEdge->wdfn * rDy); - dFpxDMup = coeffVx * (pLEdge->wdfp * rDy); - dFpyDMup = coeffVy * (pLEdge->wdfp * rDy); - - /* Do Top-Left (TL) Node of Element */ - pNode = pElem->pTLNode; - /* n continuity wrto potential derivatives */ - *(pNode->fNPsi) += - dFnxDMun * ( dMnDEx - dMnDWx * pTEdge->dWnDpsiP1 ) - + dFnyDMun * ( dMnDEy - dMnDWy * pLEdge->dWnDpsiP1 ); - *(pNode->fNPsiiP1) += - - dFnxDMun * ( dMnDEx - dMnDWx * pTEdge->dWnDpsiP1 ) - + dFnyDMun * ( dMnDEy - dMnDWy * pREdge->dWnDpsiP1 ); - *(pNode->fNPsiiP1jP1) += - - dFnxDMun * ( dMnDEx - dMnDWx * pBEdge->dWnDpsiP1 ) - - dFnyDMun * ( dMnDEy - dMnDWy * pREdge->dWnDpsiP1 ); - *(pNode->fNPsijP1) += - dFnxDMun * ( dMnDEx - dMnDWx * pBEdge->dWnDpsiP1 ) - - dFnyDMun * ( dMnDEy - dMnDWy * pLEdge->dWnDpsiP1 ); - /* p continuity wrto potential derivatives */ - *(pNode->fPPsi) += - dFpxDMup * ( dMpDEx - dMpDWx * pTEdge->dWpDpsiP1 ) - + dFpyDMup * ( dMpDEy - dMpDWy * pLEdge->dWpDpsiP1 ); - *(pNode->fPPsiiP1) += - - dFpxDMup * ( dMpDEx - dMpDWx * pTEdge->dWpDpsiP1 ) - + dFpyDMup * ( dMpDEy - dMpDWy * pREdge->dWpDpsiP1 ); - *(pNode->fPPsiiP1jP1) += - - dFpxDMup * ( dMpDEx - dMpDWx * pBEdge->dWpDpsiP1 ) - - dFpyDMup * ( dMpDEy - dMpDWy * pREdge->dWpDpsiP1 ); - *(pNode->fPPsijP1) += - dFpxDMup * ( dMpDEx - dMpDWx * pBEdge->dWpDpsiP1 ) - - dFpyDMup * ( dMpDEy - dMpDWy * pLEdge->dWpDpsiP1 ); - /* n continuity wrto n derivatives */ - *(pNode->fNN) += - dFnxDMun * ( dMnDWx * pTEdge->dWnDn ) - + dFnyDMun * ( dMnDWy * pLEdge->dWnDn ); - *(pNode->fNNiP1) += - dFnxDMun * ( dMnDWx * pTEdge->dWnDnP1 ) - + dFnyDMun * ( dMnDWy * pREdge->dWnDn ); - *(pNode->fNNiP1jP1) += - dFnxDMun * ( dMnDWx * pBEdge->dWnDnP1 ) - + dFnyDMun * ( dMnDWy * pREdge->dWnDnP1 ); - *(pNode->fNNjP1) += - dFnxDMun * ( dMnDWx * pBEdge->dWnDn ) - + dFnyDMun * ( dMnDWy * pLEdge->dWnDnP1 ); - /* p continuity wrto p derivatives */ - *(pNode->fPP) += - dFpxDMup * ( dMpDWx * pTEdge->dWpDp ) - + dFpyDMup * ( dMpDWy * pLEdge->dWpDp ); - *(pNode->fPPiP1) += - dFpxDMup * ( dMpDWx * pTEdge->dWpDpP1 ) - + dFpyDMup * ( dMpDWy * pREdge->dWpDp ); - *(pNode->fPPiP1jP1) += - dFpxDMup * ( dMpDWx * pBEdge->dWpDpP1 ) - + dFpyDMup * ( dMpDWy * pREdge->dWpDpP1 ); - *(pNode->fPPjP1) += - dFpxDMup * ( dMpDWx * pBEdge->dWpDp ) - + dFpyDMup * ( dMpDWy * pLEdge->dWpDpP1 ); - /* both continuity wrto surface potential derivatives */ - if ( channel ) { - dFnDEs = coeffVs * (pLEdge->wdfn * rDy) * dMnDEs; - dFpDEs = coeffVs * (pLEdge->wdfp * rDy) * dMpDEs; - *(pNode->fNPsiIn) -= dFnDEs; - *(pNode->fNPsiInP1) -= dFnDEs; - *(pNode->fNPsiOx) += dFnDEs; - *(pNode->fNPsiOxP1) += dFnDEs; - *(pNode->fPPsiIn) -= dFpDEs; - *(pNode->fPPsiInP1) -= dFpDEs; - *(pNode->fPPsiOx) += dFpDEs; - *(pNode->fPPsiOxP1) += dFpDEs; - } - - /* Do Bottom-Left (BL) Node of Element */ - pNode = pElem->pBLNode; - /* n continuity wrto potential derivatives */ - *(pNode->fNPsijM1) -= - dFnxDMun * ( dMnDEx - dMnDWx * pTEdge->dWnDpsiP1 ) - + dFnyDMun * ( dMnDEy - dMnDWy * pLEdge->dWnDpsiP1 ); - *(pNode->fNPsiiP1jM1) -= - - dFnxDMun * ( dMnDEx - dMnDWx * pTEdge->dWnDpsiP1 ) - + dFnyDMun * ( dMnDEy - dMnDWy * pREdge->dWnDpsiP1 ); - *(pNode->fNPsiiP1) -= - - dFnxDMun * ( dMnDEx - dMnDWx * pBEdge->dWnDpsiP1 ) - - dFnyDMun * ( dMnDEy - dMnDWy * pREdge->dWnDpsiP1 ); - *(pNode->fNPsi) -= - dFnxDMun * ( dMnDEx - dMnDWx * pBEdge->dWnDpsiP1 ) - - dFnyDMun * ( dMnDEy - dMnDWy * pLEdge->dWnDpsiP1 ); - /* p continuity wrto potential derivatives */ - *(pNode->fPPsijM1) -= - dFpxDMup * ( dMpDEx - dMpDWx * pTEdge->dWpDpsiP1 ) - + dFpyDMup * ( dMpDEy - dMpDWy * pLEdge->dWpDpsiP1 ); - *(pNode->fPPsiiP1jM1) -= - - dFpxDMup * ( dMpDEx - dMpDWx * pTEdge->dWpDpsiP1 ) - + dFpyDMup * ( dMpDEy - dMpDWy * pREdge->dWpDpsiP1 ); - *(pNode->fPPsiiP1) -= - - dFpxDMup * ( dMpDEx - dMpDWx * pBEdge->dWpDpsiP1 ) - - dFpyDMup * ( dMpDEy - dMpDWy * pREdge->dWpDpsiP1 ); - *(pNode->fPPsi) -= - dFpxDMup * ( dMpDEx - dMpDWx * pBEdge->dWpDpsiP1 ) - - dFpyDMup * ( dMpDEy - dMpDWy * pLEdge->dWpDpsiP1 ); - /* n continuity wrto n derivatives */ - *(pNode->fNNjM1) -= - dFnxDMun * ( dMnDWx * pTEdge->dWnDn ) - + dFnyDMun * ( dMnDWy * pLEdge->dWnDn ); - *(pNode->fNNiP1jM1) -= - dFnxDMun * ( dMnDWx * pTEdge->dWnDnP1 ) - + dFnyDMun * ( dMnDWy * pREdge->dWnDn ); - *(pNode->fNNiP1) -= - dFnxDMun * ( dMnDWx * pBEdge->dWnDnP1 ) - + dFnyDMun * ( dMnDWy * pREdge->dWnDnP1 ); - *(pNode->fNN) -= - dFnxDMun * ( dMnDWx * pBEdge->dWnDn ) - + dFnyDMun * ( dMnDWy * pLEdge->dWnDnP1 ); - /* p continuity wrto p derivatives */ - *(pNode->fPPjM1) -= - dFpxDMup * ( dMpDWx * pTEdge->dWpDp ) - + dFpyDMup * ( dMpDWy * pLEdge->dWpDp ); - *(pNode->fPPiP1jM1) -= - dFpxDMup * ( dMpDWx * pTEdge->dWpDpP1 ) - + dFpyDMup * ( dMpDWy * pREdge->dWpDp ); - *(pNode->fPPiP1) -= - dFpxDMup * ( dMpDWx * pBEdge->dWpDpP1 ) - + dFpyDMup * ( dMpDWy * pREdge->dWpDpP1 ); - *(pNode->fPP) -= - dFpxDMup * ( dMpDWx * pBEdge->dWpDp ) - + dFpyDMup * ( dMpDWy * pLEdge->dWpDpP1 ); - /* both continuity wrto surface potential derivatives */ - if ( channel ) { - *(pNode->fNPsiIn) += dFnDEs; - *(pNode->fNPsiInP1) += dFnDEs; - *(pNode->fNPsiOx) -= dFnDEs; - *(pNode->fNPsiOxP1) -= dFnDEs; - *(pNode->fPPsiIn) += dFpDEs; - *(pNode->fPPsiInP1) += dFpDEs; - *(pNode->fPPsiOx) -= dFpDEs; - *(pNode->fPPsiOxP1) -= dFpDEs; - } - - /* Add mobility derivatives due to Right Edge */ - /* First compute derivatives of cont. eqn's */ - dFnxDMun = coeffVx * (pREdge->wdfn * rDy); - dFnyDMun = coeffVy * (pREdge->wdfn * rDy); - dFpxDMup = coeffVx * (pREdge->wdfp * rDy); - dFpyDMup = coeffVy * (pREdge->wdfp * rDy); - - /* Do Top-Right (TR) Node of Element */ - pNode = pElem->pTRNode; - /* n continuity wrto potential derivatives */ - *(pNode->fNPsiiM1) += - dFnxDMun * ( dMnDEx - dMnDWx * pTEdge->dWnDpsiP1 ) - + dFnyDMun * ( dMnDEy - dMnDWy * pLEdge->dWnDpsiP1 ); - *(pNode->fNPsi) += - - dFnxDMun * ( dMnDEx - dMnDWx * pTEdge->dWnDpsiP1 ) - + dFnyDMun * ( dMnDEy - dMnDWy * pREdge->dWnDpsiP1 ); - *(pNode->fNPsijP1) += - - dFnxDMun * ( dMnDEx - dMnDWx * pBEdge->dWnDpsiP1 ) - - dFnyDMun * ( dMnDEy - dMnDWy * pREdge->dWnDpsiP1 ); - *(pNode->fNPsiiM1jP1) += - dFnxDMun * ( dMnDEx - dMnDWx * pBEdge->dWnDpsiP1 ) - - dFnyDMun * ( dMnDEy - dMnDWy * pLEdge->dWnDpsiP1 ); - /* p continuity wrto potential derivatives */ - *(pNode->fPPsiiM1) += - dFpxDMup * ( dMpDEx - dMpDWx * pTEdge->dWpDpsiP1 ) - + dFpyDMup * ( dMpDEy - dMpDWy * pLEdge->dWpDpsiP1 ); - *(pNode->fPPsi) += - - dFpxDMup * ( dMpDEx - dMpDWx * pTEdge->dWpDpsiP1 ) - + dFpyDMup * ( dMpDEy - dMpDWy * pREdge->dWpDpsiP1 ); - *(pNode->fPPsijP1) += - - dFpxDMup * ( dMpDEx - dMpDWx * pBEdge->dWpDpsiP1 ) - - dFpyDMup * ( dMpDEy - dMpDWy * pREdge->dWpDpsiP1 ); - *(pNode->fPPsiiM1jP1) += - dFpxDMup * ( dMpDEx - dMpDWx * pBEdge->dWpDpsiP1 ) - - dFpyDMup * ( dMpDEy - dMpDWy * pLEdge->dWpDpsiP1 ); - /* n continuity wrto n derivatives */ - *(pNode->fNNiM1) += - dFnxDMun * ( dMnDWx * pTEdge->dWnDn ) - + dFnyDMun * ( dMnDWy * pLEdge->dWnDn ); - *(pNode->fNN) += - dFnxDMun * ( dMnDWx * pTEdge->dWnDnP1 ) - + dFnyDMun * ( dMnDWy * pREdge->dWnDn ); - *(pNode->fNNjP1) += - dFnxDMun * ( dMnDWx * pBEdge->dWnDnP1 ) - + dFnyDMun * ( dMnDWy * pREdge->dWnDnP1 ); - *(pNode->fNNiM1jP1) += - dFnxDMun * ( dMnDWx * pBEdge->dWnDn ) - + dFnyDMun * ( dMnDWy * pLEdge->dWnDnP1 ); - /* p continuity wrto p derivatives */ - *(pNode->fPPiM1) += - dFpxDMup * ( dMpDWx * pTEdge->dWpDp ) - + dFpyDMup * ( dMpDWy * pLEdge->dWpDp ); - *(pNode->fPP) += - dFpxDMup * ( dMpDWx * pTEdge->dWpDpP1 ) - + dFpyDMup * ( dMpDWy * pREdge->dWpDp ); - *(pNode->fPPjP1) += - dFpxDMup * ( dMpDWx * pBEdge->dWpDpP1 ) - + dFpyDMup * ( dMpDWy * pREdge->dWpDpP1 ); - *(pNode->fPPiM1jP1) += - dFpxDMup * ( dMpDWx * pBEdge->dWpDp ) - + dFpyDMup * ( dMpDWy * pLEdge->dWpDpP1 ); - /* both continuity wrto surface potential derivatives */ - if ( channel ) { - dFnDEs = coeffVs * (pREdge->wdfn * rDy) * dMnDEs; - dFpDEs = coeffVs * (pREdge->wdfp * rDy) * dMpDEs; - *(pNode->fNPsiInM1) -= dFnDEs; - *(pNode->fNPsiIn) -= dFnDEs; - *(pNode->fNPsiOxM1) += dFnDEs; - *(pNode->fNPsiOx) += dFnDEs; - *(pNode->fPPsiInM1) -= dFpDEs; - *(pNode->fPPsiIn) -= dFpDEs; - *(pNode->fPPsiOxM1) += dFpDEs; - *(pNode->fPPsiOx) += dFpDEs; - } - - /* Do Bottom-Right (BR) Node of Element */ - pNode = pElem->pBRNode; - /* n continuity wrto potential derivatives */ - *(pNode->fNPsiiM1jM1) -= - dFnxDMun * ( dMnDEx - dMnDWx * pTEdge->dWnDpsiP1 ) - + dFnyDMun * ( dMnDEy - dMnDWy * pLEdge->dWnDpsiP1 ); - *(pNode->fNPsijM1) -= - - dFnxDMun * ( dMnDEx - dMnDWx * pTEdge->dWnDpsiP1 ) - + dFnyDMun * ( dMnDEy - dMnDWy * pREdge->dWnDpsiP1 ); - *(pNode->fNPsi) -= - - dFnxDMun * ( dMnDEx - dMnDWx * pBEdge->dWnDpsiP1 ) - - dFnyDMun * ( dMnDEy - dMnDWy * pREdge->dWnDpsiP1 ); - *(pNode->fNPsiiM1) -= - dFnxDMun * ( dMnDEx - dMnDWx * pBEdge->dWnDpsiP1 ) - - dFnyDMun * ( dMnDEy - dMnDWy * pLEdge->dWnDpsiP1 ); - /* p continuity wrto potential derivatives */ - *(pNode->fPPsiiM1jM1) -= - dFpxDMup * ( dMpDEx - dMpDWx * pTEdge->dWpDpsiP1 ) - + dFpyDMup * ( dMpDEy - dMpDWy * pLEdge->dWpDpsiP1 ); - *(pNode->fPPsijM1) -= - - dFpxDMup * ( dMpDEx - dMpDWx * pTEdge->dWpDpsiP1 ) - + dFpyDMup * ( dMpDEy - dMpDWy * pREdge->dWpDpsiP1 ); - *(pNode->fPPsi) -= - - dFpxDMup * ( dMpDEx - dMpDWx * pBEdge->dWpDpsiP1 ) - - dFpyDMup * ( dMpDEy - dMpDWy * pREdge->dWpDpsiP1 ); - *(pNode->fPPsiiM1) -= - dFpxDMup * ( dMpDEx - dMpDWx * pBEdge->dWpDpsiP1 ) - - dFpyDMup * ( dMpDEy - dMpDWy * pLEdge->dWpDpsiP1 ); - /* n continuity wrto n derivatives */ - *(pNode->fNNiM1jM1) -= - dFnxDMun * ( dMnDWx * pTEdge->dWnDn ) - + dFnyDMun * ( dMnDWy * pLEdge->dWnDn ); - *(pNode->fNNjM1) -= - dFnxDMun * ( dMnDWx * pTEdge->dWnDnP1 ) - + dFnyDMun * ( dMnDWy * pREdge->dWnDn ); - *(pNode->fNN) -= - dFnxDMun * ( dMnDWx * pBEdge->dWnDnP1 ) - + dFnyDMun * ( dMnDWy * pREdge->dWnDnP1 ); - *(pNode->fNNiM1) -= - dFnxDMun * ( dMnDWx * pBEdge->dWnDn ) - + dFnyDMun * ( dMnDWy * pLEdge->dWnDnP1 ); - /* p continuity wrto p derivatives */ - *(pNode->fPPiM1jM1) -= - dFpxDMup * ( dMpDWx * pTEdge->dWpDp ) - + dFpyDMup * ( dMpDWy * pLEdge->dWpDp ); - *(pNode->fPPjM1) -= - dFpxDMup * ( dMpDWx * pTEdge->dWpDpP1 ) - + dFpyDMup * ( dMpDWy * pREdge->dWpDp ); - *(pNode->fPP) -= - dFpxDMup * ( dMpDWx * pBEdge->dWpDpP1 ) - + dFpyDMup * ( dMpDWy * pREdge->dWpDpP1 ); - *(pNode->fPPiM1) -= - dFpxDMup * ( dMpDWx * pBEdge->dWpDp ) - + dFpyDMup * ( dMpDWy * pLEdge->dWpDpP1 ); - /* both continuity wrto surface potential derivatives */ - if ( channel ) { - *(pNode->fNPsiInM1) += dFnDEs; - *(pNode->fNPsiIn) += dFnDEs; - *(pNode->fNPsiOxM1) -= dFnDEs; - *(pNode->fNPsiOx) -= dFnDEs; - *(pNode->fPPsiInM1) += dFpDEs; - *(pNode->fPPsiIn) += dFpDEs; - *(pNode->fPPsiOxM1) -= dFpDEs; - *(pNode->fPPsiOx) -= dFpDEs; - } - - return; -} - -void - TWONmobDeriv(TWOelem *pElem, int chanType, double ds) - /* TWOelem *pElem: channel or bulk element */ - /* int chanType: flag for direction of channel */ - /* double ds: normalized hgt (len) of interface element */ -{ - TWOnode *pNode; - TWOedge *pTEdge, *pBEdge, *pLEdge, *pREdge; - BOOLEAN channel = pElem->channel; - double dx, dy, rDx, rDy; - double coeffHx, coeffHy, coeffHs = 0.0; - double coeffVx, coeffVy, coeffVs = 0.0; - double dFnxDMun, dFnyDMun, dFnDEs = 0.0; - double dMnDEs, dMnDEx, dMnDEy, dMnDWx, dMnDWy; - - /* Initialize various quantities */ - dx = pElem->dx; - dy = pElem->dy; - rDx = 1.0 / dx; - rDy = 1.0 / dy; - - /* compute length-dependent parameters */ - coeffHx = 0.25 * dy * rDx; /* For horizontal edges */ - coeffHy = 0.25; - coeffVx = 0.25; /* For vertical edges */ - coeffVy = 0.25 * dx * rDy; - switch ( chanType ) { - case 0: - case 3: - coeffHs = 0.25 * dy / ds; - coeffVs = 0.25 * dx / ds; - break; - case 1: - case 2: - coeffHs = - 0.25 * dy / ds; - coeffVs = - 0.25 * dx / ds; - break; - } - - /* Get pointers to element's edges */ - pTEdge = pElem->pTopEdge; - pBEdge = pElem->pBotEdge; - pLEdge = pElem->pLeftEdge; - pREdge = pElem->pRightEdge; - - /* Get element mobility derivatives for fast access later */ - dMnDEs = pElem->dMunDEs; - dMnDEx = pElem->dMunDEx; - dMnDEy = pElem->dMunDEy; - dMnDWx = pElem->dMunDWx; - dMnDWy = pElem->dMunDWy; - - /* Add mobility derivatives due to Top Edge */ - /* First compute derivatives of cont. eqn's */ - dFnxDMun = coeffHx * (pTEdge->wdfn * rDx); - dFnyDMun = coeffHy * (pTEdge->wdfn * rDx); - - /* Do Top-Left (TL) Node of Element */ - pNode = pElem->pTLNode; - /* n continuity wrto potential derivatives */ - *(pNode->fNPsi) += - dFnxDMun * ( dMnDEx - dMnDWx * pTEdge->dWnDpsiP1 ) - + dFnyDMun * ( dMnDEy - dMnDWy * pLEdge->dWnDpsiP1 ); - *(pNode->fNPsiiP1) += - - dFnxDMun * ( dMnDEx - dMnDWx * pTEdge->dWnDpsiP1 ) - + dFnyDMun * ( dMnDEy - dMnDWy * pREdge->dWnDpsiP1 ); - *(pNode->fNPsiiP1jP1) += - - dFnxDMun * ( dMnDEx - dMnDWx * pBEdge->dWnDpsiP1 ) - - dFnyDMun * ( dMnDEy - dMnDWy * pREdge->dWnDpsiP1 ); - *(pNode->fNPsijP1) += - dFnxDMun * ( dMnDEx - dMnDWx * pBEdge->dWnDpsiP1 ) - - dFnyDMun * ( dMnDEy - dMnDWy * pLEdge->dWnDpsiP1 ); - /* n continuity wrto n derivatives */ - *(pNode->fNN) += - dFnxDMun * ( dMnDWx * pTEdge->dWnDn ) - + dFnyDMun * ( dMnDWy * pLEdge->dWnDn ); - *(pNode->fNNiP1) += - dFnxDMun * ( dMnDWx * pTEdge->dWnDnP1 ) - + dFnyDMun * ( dMnDWy * pREdge->dWnDn ); - *(pNode->fNNiP1jP1) += - dFnxDMun * ( dMnDWx * pBEdge->dWnDnP1 ) - + dFnyDMun * ( dMnDWy * pREdge->dWnDnP1 ); - *(pNode->fNNjP1) += - dFnxDMun * ( dMnDWx * pBEdge->dWnDn ) - + dFnyDMun * ( dMnDWy * pLEdge->dWnDnP1 ); - - /* both continuity wrto surface potential derivatives */ - if ( channel ) { - dFnDEs = coeffHs * (pTEdge->wdfn * rDx) * dMnDEs; - *(pNode->fNPsiIn) -= dFnDEs; - *(pNode->fNPsiInP1) -= dFnDEs; - *(pNode->fNPsiOx) += dFnDEs; - *(pNode->fNPsiOxP1) += dFnDEs; - } - - /* Do Top-Right (TR) Node of Element */ - pNode = pElem->pTRNode; - /* n continuity wrto potential derivatives */ - *(pNode->fNPsiiM1) -= - dFnxDMun * ( dMnDEx - dMnDWx * pTEdge->dWnDpsiP1 ) - + dFnyDMun * ( dMnDEy - dMnDWy * pLEdge->dWnDpsiP1 ); - *(pNode->fNPsi) -= - - dFnxDMun * ( dMnDEx - dMnDWx * pTEdge->dWnDpsiP1 ) - + dFnyDMun * ( dMnDEy - dMnDWy * pREdge->dWnDpsiP1 ); - *(pNode->fNPsijP1) -= - - dFnxDMun * ( dMnDEx - dMnDWx * pBEdge->dWnDpsiP1 ) - - dFnyDMun * ( dMnDEy - dMnDWy * pREdge->dWnDpsiP1 ); - *(pNode->fNPsiiM1jP1) -= - dFnxDMun * ( dMnDEx - dMnDWx * pBEdge->dWnDpsiP1 ) - - dFnyDMun * ( dMnDEy - dMnDWy * pLEdge->dWnDpsiP1 ); - - /* n continuity wrto n derivatives */ - *(pNode->fNNiM1) -= - dFnxDMun * ( dMnDWx * pTEdge->dWnDn ) - + dFnyDMun * ( dMnDWy * pLEdge->dWnDn ); - *(pNode->fNN) -= - dFnxDMun * ( dMnDWx * pTEdge->dWnDnP1 ) - + dFnyDMun * ( dMnDWy * pREdge->dWnDn ); - *(pNode->fNNjP1) -= - dFnxDMun * ( dMnDWx * pBEdge->dWnDnP1 ) - + dFnyDMun * ( dMnDWy * pREdge->dWnDnP1 ); - *(pNode->fNNiM1jP1) -= - dFnxDMun * ( dMnDWx * pBEdge->dWnDn ) - + dFnyDMun * ( dMnDWy * pLEdge->dWnDnP1 ); - - /* both continuity wrto surface potential derivatives */ - if ( channel ) { - *(pNode->fNPsiInM1) += dFnDEs; - *(pNode->fNPsiIn) += dFnDEs; - *(pNode->fNPsiOxM1) -= dFnDEs; - *(pNode->fNPsiOx) -= dFnDEs; - } - - - /* Add mobility derivatives due to Bottom Edge */ - /* First compute derivatives of cont. eqn's */ - dFnxDMun = coeffHx * (pBEdge->wdfn * rDx); - dFnyDMun = coeffHy * (pBEdge->wdfn * rDx); - - /* Do Bottom-Left (BL) Node of Element */ - pNode = pElem->pBLNode; - /* n continuity wrto potential derivatives */ - *(pNode->fNPsijM1) += - dFnxDMun * ( dMnDEx - dMnDWx * pTEdge->dWnDpsiP1 ) - + dFnyDMun * ( dMnDEy - dMnDWy * pLEdge->dWnDpsiP1 ); - *(pNode->fNPsiiP1jM1) += - - dFnxDMun * ( dMnDEx - dMnDWx * pTEdge->dWnDpsiP1 ) - + dFnyDMun * ( dMnDEy - dMnDWy * pREdge->dWnDpsiP1 ); - *(pNode->fNPsiiP1) += - - dFnxDMun * ( dMnDEx - dMnDWx * pBEdge->dWnDpsiP1 ) - - dFnyDMun * ( dMnDEy - dMnDWy * pREdge->dWnDpsiP1 ); - *(pNode->fNPsi) += - dFnxDMun * ( dMnDEx - dMnDWx * pBEdge->dWnDpsiP1 ) - - dFnyDMun * ( dMnDEy - dMnDWy * pLEdge->dWnDpsiP1 ); - /* n continuity wrto n derivatives */ - *(pNode->fNNjM1) += - dFnxDMun * ( dMnDWx * pTEdge->dWnDn ) - + dFnyDMun * ( dMnDWy * pLEdge->dWnDn ); - *(pNode->fNNiP1jM1) += - dFnxDMun * ( dMnDWx * pTEdge->dWnDnP1 ) - + dFnyDMun * ( dMnDWy * pREdge->dWnDn ); - *(pNode->fNNiP1) += - dFnxDMun * ( dMnDWx * pBEdge->dWnDnP1 ) - + dFnyDMun * ( dMnDWy * pREdge->dWnDnP1 ); - *(pNode->fNN) += - dFnxDMun * ( dMnDWx * pBEdge->dWnDn ) - + dFnyDMun * ( dMnDWy * pLEdge->dWnDnP1 ); - - /* both continuity wrto surface potential derivatives */ - if (channel ) { - dFnDEs = coeffHs * (pBEdge->wdfn * rDx) * dMnDEs; - *(pNode->fNPsiIn) -= dFnDEs; - *(pNode->fNPsiInP1) -= dFnDEs; - *(pNode->fNPsiOx) += dFnDEs; - *(pNode->fNPsiOxP1) += dFnDEs; - } - - /* Do Bottom-Right (BR) Node of Element */ - pNode = pElem->pBRNode; - /* n continuity wrto potential derivatives */ - *(pNode->fNPsiiM1jM1) -= - dFnxDMun * ( dMnDEx - dMnDWx * pTEdge->dWnDpsiP1 ) - + dFnyDMun * ( dMnDEy - dMnDWy * pLEdge->dWnDpsiP1 ); - *(pNode->fNPsijM1) -= - - dFnxDMun * ( dMnDEx - dMnDWx * pTEdge->dWnDpsiP1 ) - + dFnyDMun * ( dMnDEy - dMnDWy * pREdge->dWnDpsiP1 ); - *(pNode->fNPsi) -= - - dFnxDMun * ( dMnDEx - dMnDWx * pBEdge->dWnDpsiP1 ) - - dFnyDMun * ( dMnDEy - dMnDWy * pREdge->dWnDpsiP1 ); - *(pNode->fNPsiiM1) -= - dFnxDMun * ( dMnDEx - dMnDWx * pBEdge->dWnDpsiP1 ) - - dFnyDMun * ( dMnDEy - dMnDWy * pLEdge->dWnDpsiP1 ); - /* n continuity wrto n derivatives */ - *(pNode->fNNiM1jM1) -= - dFnxDMun * ( dMnDWx * pTEdge->dWnDn ) - + dFnyDMun * ( dMnDWy * pLEdge->dWnDn ); - *(pNode->fNNjM1) -= - dFnxDMun * ( dMnDWx * pTEdge->dWnDnP1 ) - + dFnyDMun * ( dMnDWy * pREdge->dWnDn ); - *(pNode->fNN) -= - dFnxDMun * ( dMnDWx * pBEdge->dWnDnP1 ) - + dFnyDMun * ( dMnDWy * pREdge->dWnDnP1 ); - *(pNode->fNNiM1) -= - dFnxDMun * ( dMnDWx * pBEdge->dWnDn ) - + dFnyDMun * ( dMnDWy * pLEdge->dWnDnP1 ); - - /* both continuity wrto surface potential derivatives */ - if ( channel ) { - *(pNode->fNPsiInM1) += dFnDEs; - *(pNode->fNPsiIn) += dFnDEs; - *(pNode->fNPsiOxM1) -= dFnDEs; - *(pNode->fNPsiOx) -= dFnDEs; - } - - /* Add mobility derivatives due to Left Edge */ - /* First compute derivatives of cont. eqn's */ - dFnxDMun = coeffVx * (pLEdge->wdfn * rDy); - dFnyDMun = coeffVy * (pLEdge->wdfn * rDy); - - /* Do Top-Left (TL) Node of Element */ - pNode = pElem->pTLNode; - /* n continuity wrto potential derivatives */ - *(pNode->fNPsi) += - dFnxDMun * ( dMnDEx - dMnDWx * pTEdge->dWnDpsiP1 ) - + dFnyDMun * ( dMnDEy - dMnDWy * pLEdge->dWnDpsiP1 ); - *(pNode->fNPsiiP1) += - - dFnxDMun * ( dMnDEx - dMnDWx * pTEdge->dWnDpsiP1 ) - + dFnyDMun * ( dMnDEy - dMnDWy * pREdge->dWnDpsiP1 ); - *(pNode->fNPsiiP1jP1) += - - dFnxDMun * ( dMnDEx - dMnDWx * pBEdge->dWnDpsiP1 ) - - dFnyDMun * ( dMnDEy - dMnDWy * pREdge->dWnDpsiP1 ); - *(pNode->fNPsijP1) += - dFnxDMun * ( dMnDEx - dMnDWx * pBEdge->dWnDpsiP1 ) - - dFnyDMun * ( dMnDEy - dMnDWy * pLEdge->dWnDpsiP1 ); - /* n continuity wrto n derivatives */ - *(pNode->fNN) += - dFnxDMun * ( dMnDWx * pTEdge->dWnDn ) - + dFnyDMun * ( dMnDWy * pLEdge->dWnDn ); - *(pNode->fNNiP1) += - dFnxDMun * ( dMnDWx * pTEdge->dWnDnP1 ) - + dFnyDMun * ( dMnDWy * pREdge->dWnDn ); - *(pNode->fNNiP1jP1) += - dFnxDMun * ( dMnDWx * pBEdge->dWnDnP1 ) - + dFnyDMun * ( dMnDWy * pREdge->dWnDnP1 ); - *(pNode->fNNjP1) += - dFnxDMun * ( dMnDWx * pBEdge->dWnDn ) - + dFnyDMun * ( dMnDWy * pLEdge->dWnDnP1 ); - - /* both continuity wrto surface potential derivatives */ - if ( channel ) { - dFnDEs = coeffVs * (pLEdge->wdfn * rDy) * dMnDEs; - *(pNode->fNPsiIn) -= dFnDEs; - *(pNode->fNPsiInP1) -= dFnDEs; - *(pNode->fNPsiOx) += dFnDEs; - *(pNode->fNPsiOxP1) += dFnDEs; - } - - /* Do Bottom-Left (BL) Node of Element */ - pNode = pElem->pBLNode; - /* n continuity wrto potential derivatives */ - *(pNode->fNPsijM1) -= - dFnxDMun * ( dMnDEx - dMnDWx * pTEdge->dWnDpsiP1 ) - + dFnyDMun * ( dMnDEy - dMnDWy * pLEdge->dWnDpsiP1 ); - *(pNode->fNPsiiP1jM1) -= - - dFnxDMun * ( dMnDEx - dMnDWx * pTEdge->dWnDpsiP1 ) - + dFnyDMun * ( dMnDEy - dMnDWy * pREdge->dWnDpsiP1 ); - *(pNode->fNPsiiP1) -= - - dFnxDMun * ( dMnDEx - dMnDWx * pBEdge->dWnDpsiP1 ) - - dFnyDMun * ( dMnDEy - dMnDWy * pREdge->dWnDpsiP1 ); - *(pNode->fNPsi) -= - dFnxDMun * ( dMnDEx - dMnDWx * pBEdge->dWnDpsiP1 ) - - dFnyDMun * ( dMnDEy - dMnDWy * pLEdge->dWnDpsiP1 ); - /* n continuity wrto n derivatives */ - *(pNode->fNNjM1) -= - dFnxDMun * ( dMnDWx * pTEdge->dWnDn ) - + dFnyDMun * ( dMnDWy * pLEdge->dWnDn ); - *(pNode->fNNiP1jM1) -= - dFnxDMun * ( dMnDWx * pTEdge->dWnDnP1 ) - + dFnyDMun * ( dMnDWy * pREdge->dWnDn ); - *(pNode->fNNiP1) -= - dFnxDMun * ( dMnDWx * pBEdge->dWnDnP1 ) - + dFnyDMun * ( dMnDWy * pREdge->dWnDnP1 ); - *(pNode->fNN) -= - dFnxDMun * ( dMnDWx * pBEdge->dWnDn ) - + dFnyDMun * ( dMnDWy * pLEdge->dWnDnP1 ); - - /* both continuity wrto surface potential derivatives */ - if ( channel ) { - *(pNode->fNPsiIn) += dFnDEs; - *(pNode->fNPsiInP1) += dFnDEs; - *(pNode->fNPsiOx) -= dFnDEs; - *(pNode->fNPsiOxP1) -= dFnDEs; - } - - /* Add mobility derivatives due to Right Edge */ - /* First compute derivatives of cont. eqn's */ - dFnxDMun = coeffVx * (pREdge->wdfn * rDy); - dFnyDMun = coeffVy * (pREdge->wdfn * rDy); - - /* Do Top-Right (TR) Node of Element */ - pNode = pElem->pTRNode; - /* n continuity wrto potential derivatives */ - *(pNode->fNPsiiM1) += - dFnxDMun * ( dMnDEx - dMnDWx * pTEdge->dWnDpsiP1 ) - + dFnyDMun * ( dMnDEy - dMnDWy * pLEdge->dWnDpsiP1 ); - *(pNode->fNPsi) += - - dFnxDMun * ( dMnDEx - dMnDWx * pTEdge->dWnDpsiP1 ) - + dFnyDMun * ( dMnDEy - dMnDWy * pREdge->dWnDpsiP1 ); - *(pNode->fNPsijP1) += - - dFnxDMun * ( dMnDEx - dMnDWx * pBEdge->dWnDpsiP1 ) - - dFnyDMun * ( dMnDEy - dMnDWy * pREdge->dWnDpsiP1 ); - *(pNode->fNPsiiM1jP1) += - dFnxDMun * ( dMnDEx - dMnDWx * pBEdge->dWnDpsiP1 ) - - dFnyDMun * ( dMnDEy - dMnDWy * pLEdge->dWnDpsiP1 ); - /* n continuity wrto n derivatives */ - *(pNode->fNNiM1) += - dFnxDMun * ( dMnDWx * pTEdge->dWnDn ) - + dFnyDMun * ( dMnDWy * pLEdge->dWnDn ); - *(pNode->fNN) += - dFnxDMun * ( dMnDWx * pTEdge->dWnDnP1 ) - + dFnyDMun * ( dMnDWy * pREdge->dWnDn ); - *(pNode->fNNjP1) += - dFnxDMun * ( dMnDWx * pBEdge->dWnDnP1 ) - + dFnyDMun * ( dMnDWy * pREdge->dWnDnP1 ); - *(pNode->fNNiM1jP1) += - dFnxDMun * ( dMnDWx * pBEdge->dWnDn ) - + dFnyDMun * ( dMnDWy * pLEdge->dWnDnP1 ); - - /* both continuity wrto surface potential derivatives */ - if ( channel ) { - dFnDEs = coeffVs * (pREdge->wdfn * rDy) * dMnDEs; - *(pNode->fNPsiInM1) -= dFnDEs; - *(pNode->fNPsiIn) -= dFnDEs; - *(pNode->fNPsiOxM1) += dFnDEs; - *(pNode->fNPsiOx) += dFnDEs; - } - - /* Do Bottom-Right (BR) Node of Element */ - pNode = pElem->pBRNode; - /* n continuity wrto potential derivatives */ - *(pNode->fNPsiiM1jM1) -= - dFnxDMun * ( dMnDEx - dMnDWx * pTEdge->dWnDpsiP1 ) - + dFnyDMun * ( dMnDEy - dMnDWy * pLEdge->dWnDpsiP1 ); - *(pNode->fNPsijM1) -= - - dFnxDMun * ( dMnDEx - dMnDWx * pTEdge->dWnDpsiP1 ) - + dFnyDMun * ( dMnDEy - dMnDWy * pREdge->dWnDpsiP1 ); - *(pNode->fNPsi) -= - - dFnxDMun * ( dMnDEx - dMnDWx * pBEdge->dWnDpsiP1 ) - - dFnyDMun * ( dMnDEy - dMnDWy * pREdge->dWnDpsiP1 ); - *(pNode->fNPsiiM1) -= - dFnxDMun * ( dMnDEx - dMnDWx * pBEdge->dWnDpsiP1 ) - - dFnyDMun * ( dMnDEy - dMnDWy * pLEdge->dWnDpsiP1 ); - /* n continuity wrto n derivatives */ - *(pNode->fNNiM1jM1) -= - dFnxDMun * ( dMnDWx * pTEdge->dWnDn ) - + dFnyDMun * ( dMnDWy * pLEdge->dWnDn ); - *(pNode->fNNjM1) -= - dFnxDMun * ( dMnDWx * pTEdge->dWnDnP1 ) - + dFnyDMun * ( dMnDWy * pREdge->dWnDn ); - *(pNode->fNN) -= - dFnxDMun * ( dMnDWx * pBEdge->dWnDnP1 ) - + dFnyDMun * ( dMnDWy * pREdge->dWnDnP1 ); - *(pNode->fNNiM1) -= - dFnxDMun * ( dMnDWx * pBEdge->dWnDn ) - + dFnyDMun * ( dMnDWy * pLEdge->dWnDnP1 ); - - /* both continuity wrto surface potential derivatives */ - if ( channel ) { - *(pNode->fNPsiInM1) += dFnDEs; - *(pNode->fNPsiIn) += dFnDEs; - *(pNode->fNPsiOxM1) -= dFnDEs; - *(pNode->fNPsiOx) -= dFnDEs; - } - - return; -} - -void - TWOPmobDeriv( TWOelem *pElem, int chanType, double ds ) - /* TWOelem *pElem: channel or bulk element */ - /*int chanType: flag for direction of channel */ - /*double ds: normalized hgt (len) of interface element */ -{ - TWOnode *pNode; - TWOedge *pTEdge, *pBEdge, *pLEdge, *pREdge; - BOOLEAN channel = pElem->channel; - double dx, dy, rDx, rDy; - double coeffHx, coeffHy, coeffHs = 0.0; - double coeffVx, coeffVy, coeffVs = 0.0; - double dFpxDMup, dFpyDMup, dFpDEs = 0.0; - double dMpDEs, dMpDEx, dMpDEy, dMpDWx, dMpDWy; - - /* Initialize various quantities */ - dx = pElem->dx; - dy = pElem->dy; - rDx = 1.0 / dx; - rDy = 1.0 / dy; - - /* compute length-dependent parameters */ - coeffHx = 0.25 * dy * rDx; /* For horizontal edges */ - coeffHy = 0.25; - coeffVx = 0.25; /* For vertical edges */ - coeffVy = 0.25 * dx * rDy; - switch ( chanType ) { - case 0: - case 3: - coeffHs = 0.25 * dy / ds; - coeffVs = 0.25 * dx / ds; - break; - case 1: - case 2: - coeffHs = - 0.25 * dy / ds; - coeffVs = - 0.25 * dx / ds; - break; - } - - /* Get pointers to element's edges */ - pTEdge = pElem->pTopEdge; - pBEdge = pElem->pBotEdge; - pLEdge = pElem->pLeftEdge; - pREdge = pElem->pRightEdge; - - /* Get element mobility derivatives for fast access later */ - dMpDEs = pElem->dMupDEs; - dMpDEx = pElem->dMupDEx; - dMpDEy = pElem->dMupDEy; - dMpDWx = pElem->dMupDWx; - dMpDWy = pElem->dMupDWy; - - /* Add mobility derivatives due to Top Edge */ - /* First compute derivatives of cont. eqn's */ - dFpxDMup = coeffHx * (pTEdge->wdfp * rDx); - dFpyDMup = coeffHy * (pTEdge->wdfp * rDx); - - /* Do Top-Left (TL) Node of Element */ - pNode = pElem->pTLNode; - /* p continuity wrto potential derivatives */ - *(pNode->fPPsi) += - dFpxDMup * ( dMpDEx - dMpDWx * pTEdge->dWpDpsiP1 ) - + dFpyDMup * ( dMpDEy - dMpDWy * pLEdge->dWpDpsiP1 ); - *(pNode->fPPsiiP1) += - - dFpxDMup * ( dMpDEx - dMpDWx * pTEdge->dWpDpsiP1 ) - + dFpyDMup * ( dMpDEy - dMpDWy * pREdge->dWpDpsiP1 ); - *(pNode->fPPsiiP1jP1) += - - dFpxDMup * ( dMpDEx - dMpDWx * pBEdge->dWpDpsiP1 ) - - dFpyDMup * ( dMpDEy - dMpDWy * pREdge->dWpDpsiP1 ); - *(pNode->fPPsijP1) += - dFpxDMup * ( dMpDEx - dMpDWx * pBEdge->dWpDpsiP1 ) - - dFpyDMup * ( dMpDEy - dMpDWy * pLEdge->dWpDpsiP1 ); - /* p continuity wrto p derivatives */ - *(pNode->fPP) += - dFpxDMup * ( dMpDWx * pTEdge->dWpDp ) - + dFpyDMup * ( dMpDWy * pLEdge->dWpDp ); - *(pNode->fPPiP1) += - dFpxDMup * ( dMpDWx * pTEdge->dWpDpP1 ) - + dFpyDMup * ( dMpDWy * pREdge->dWpDp ); - *(pNode->fPPiP1jP1) += - dFpxDMup * ( dMpDWx * pBEdge->dWpDpP1 ) - + dFpyDMup * ( dMpDWy * pREdge->dWpDpP1 ); - *(pNode->fPPjP1) += - dFpxDMup * ( dMpDWx * pBEdge->dWpDp ) - + dFpyDMup * ( dMpDWy * pLEdge->dWpDpP1 ); - - /* both continuity wrto surface potential derivatives */ - if ( channel ) { - dFpDEs = coeffHs * (pTEdge->wdfp * rDx) * dMpDEs; - *(pNode->fPPsiIn) -= dFpDEs; - *(pNode->fPPsiInP1) -= dFpDEs; - *(pNode->fPPsiOx) += dFpDEs; - *(pNode->fPPsiOxP1) += dFpDEs; - } - - /* Do Top-Right (TR) Node of Element */ - pNode = pElem->pTRNode; - /* p continuity wrto potential derivatives */ - *(pNode->fPPsiiM1) -= - dFpxDMup * ( dMpDEx - dMpDWx * pTEdge->dWpDpsiP1 ) - + dFpyDMup * ( dMpDEy - dMpDWy * pLEdge->dWpDpsiP1 ); - *(pNode->fPPsi) -= - - dFpxDMup * ( dMpDEx - dMpDWx * pTEdge->dWpDpsiP1 ) - + dFpyDMup * ( dMpDEy - dMpDWy * pREdge->dWpDpsiP1 ); - *(pNode->fPPsijP1) -= - - dFpxDMup * ( dMpDEx - dMpDWx * pBEdge->dWpDpsiP1 ) - - dFpyDMup * ( dMpDEy - dMpDWy * pREdge->dWpDpsiP1 ); - *(pNode->fPPsiiM1jP1) -= - dFpxDMup * ( dMpDEx - dMpDWx * pBEdge->dWpDpsiP1 ) - - dFpyDMup * ( dMpDEy - dMpDWy * pLEdge->dWpDpsiP1 ); - /* p continuity wrto p derivatives */ - *(pNode->fPPiM1) -= - dFpxDMup * ( dMpDWx * pTEdge->dWpDp ) - + dFpyDMup * ( dMpDWy * pLEdge->dWpDp ); - *(pNode->fPP) -= - dFpxDMup * ( dMpDWx * pTEdge->dWpDpP1 ) - + dFpyDMup * ( dMpDWy * pREdge->dWpDp ); - *(pNode->fPPjP1) -= - dFpxDMup * ( dMpDWx * pBEdge->dWpDpP1 ) - + dFpyDMup * ( dMpDWy * pREdge->dWpDpP1 ); - *(pNode->fPPiM1jP1) -= - dFpxDMup * ( dMpDWx * pBEdge->dWpDp ) - + dFpyDMup * ( dMpDWy * pLEdge->dWpDpP1 ); - - /* both continuity wrto surface potential derivatives */ - if ( channel ) { - *(pNode->fPPsiInM1) += dFpDEs; - *(pNode->fPPsiIn) += dFpDEs; - *(pNode->fPPsiOxM1) -= dFpDEs; - *(pNode->fPPsiOx) -= dFpDEs; - } - - - /* Add mobility derivatives due to Bottom Edge */ - /* First compute derivatives of cont. eqn's */ - dFpxDMup = coeffHx * (pBEdge->wdfp * rDx); - dFpyDMup = coeffHy * (pBEdge->wdfp * rDx); - - /* Do Bottom-Left (BL) Node of Element */ - pNode = pElem->pBLNode; - /* p continuity wrto potential derivatives */ - *(pNode->fPPsijM1) += - dFpxDMup * ( dMpDEx - dMpDWx * pTEdge->dWpDpsiP1 ) - + dFpyDMup * ( dMpDEy - dMpDWy * pLEdge->dWpDpsiP1 ); - *(pNode->fPPsiiP1jM1) += - - dFpxDMup * ( dMpDEx - dMpDWx * pTEdge->dWpDpsiP1 ) - + dFpyDMup * ( dMpDEy - dMpDWy * pREdge->dWpDpsiP1 ); - *(pNode->fPPsiiP1) += - - dFpxDMup * ( dMpDEx - dMpDWx * pBEdge->dWpDpsiP1 ) - - dFpyDMup * ( dMpDEy - dMpDWy * pREdge->dWpDpsiP1 ); - *(pNode->fPPsi) += - dFpxDMup * ( dMpDEx - dMpDWx * pBEdge->dWpDpsiP1 ) - - dFpyDMup * ( dMpDEy - dMpDWy * pLEdge->dWpDpsiP1 ); - /* p continuity wrto p derivatives */ - *(pNode->fPPjM1) += - dFpxDMup * ( dMpDWx * pTEdge->dWpDp ) - + dFpyDMup * ( dMpDWy * pLEdge->dWpDp ); - *(pNode->fPPiP1jM1) += - dFpxDMup * ( dMpDWx * pTEdge->dWpDpP1 ) - + dFpyDMup * ( dMpDWy * pREdge->dWpDp ); - *(pNode->fPPiP1) += - dFpxDMup * ( dMpDWx * pBEdge->dWpDpP1 ) - + dFpyDMup * ( dMpDWy * pREdge->dWpDpP1 ); - *(pNode->fPP) += - dFpxDMup * ( dMpDWx * pBEdge->dWpDp ) - + dFpyDMup * ( dMpDWy * pLEdge->dWpDpP1 ); - - /* both continuity wrto surface potential derivatives */ - if (channel ) { - dFpDEs = coeffHs * (pBEdge->wdfp * rDx) * dMpDEs; - *(pNode->fPPsiIn) -= dFpDEs; - *(pNode->fPPsiInP1) -= dFpDEs; - *(pNode->fPPsiOx) += dFpDEs; - *(pNode->fPPsiOxP1) += dFpDEs; - } - - /* Do Bottom-Right (BR) Node of Element */ - pNode = pElem->pBRNode; - /* p continuity wrto potential derivatives */ - *(pNode->fPPsiiM1jM1) -= - dFpxDMup * ( dMpDEx - dMpDWx * pTEdge->dWpDpsiP1 ) - + dFpyDMup * ( dMpDEy - dMpDWy * pLEdge->dWpDpsiP1 ); - *(pNode->fPPsijM1) -= - - dFpxDMup * ( dMpDEx - dMpDWx * pTEdge->dWpDpsiP1 ) - + dFpyDMup * ( dMpDEy - dMpDWy * pREdge->dWpDpsiP1 ); - *(pNode->fPPsi) -= - - dFpxDMup * ( dMpDEx - dMpDWx * pBEdge->dWpDpsiP1 ) - - dFpyDMup * ( dMpDEy - dMpDWy * pREdge->dWpDpsiP1 ); - *(pNode->fPPsiiM1) -= - dFpxDMup * ( dMpDEx - dMpDWx * pBEdge->dWpDpsiP1 ) - - dFpyDMup * ( dMpDEy - dMpDWy * pLEdge->dWpDpsiP1 ); - /* p continuity wrto p derivatives */ - *(pNode->fPPiM1jM1) -= - dFpxDMup * ( dMpDWx * pTEdge->dWpDp ) - + dFpyDMup * ( dMpDWy * pLEdge->dWpDp ); - *(pNode->fPPjM1) -= - dFpxDMup * ( dMpDWx * pTEdge->dWpDpP1 ) - + dFpyDMup * ( dMpDWy * pREdge->dWpDp ); - *(pNode->fPP) -= - dFpxDMup * ( dMpDWx * pBEdge->dWpDpP1 ) - + dFpyDMup * ( dMpDWy * pREdge->dWpDpP1 ); - *(pNode->fPPiM1) -= - dFpxDMup * ( dMpDWx * pBEdge->dWpDp ) - + dFpyDMup * ( dMpDWy * pLEdge->dWpDpP1 ); - - /* both continuity wrto surface potential derivatives */ - if ( channel ) { - *(pNode->fPPsiInM1) += dFpDEs; - *(pNode->fPPsiIn) += dFpDEs; - *(pNode->fPPsiOxM1) -= dFpDEs; - *(pNode->fPPsiOx) -= dFpDEs; - } - - /* Add mobility derivatives due to Left Edge */ - /* First compute derivatives of cont. eqn's */ - dFpxDMup = coeffVx * (pLEdge->wdfp * rDy); - dFpyDMup = coeffVy * (pLEdge->wdfp * rDy); - - /* Do Top-Left (TL) Node of Element */ - pNode = pElem->pTLNode; - /* p continuity wrto potential derivatives */ - *(pNode->fPPsi) += - dFpxDMup * ( dMpDEx - dMpDWx * pTEdge->dWpDpsiP1 ) - + dFpyDMup * ( dMpDEy - dMpDWy * pLEdge->dWpDpsiP1 ); - *(pNode->fPPsiiP1) += - - dFpxDMup * ( dMpDEx - dMpDWx * pTEdge->dWpDpsiP1 ) - + dFpyDMup * ( dMpDEy - dMpDWy * pREdge->dWpDpsiP1 ); - *(pNode->fPPsiiP1jP1) += - - dFpxDMup * ( dMpDEx - dMpDWx * pBEdge->dWpDpsiP1 ) - - dFpyDMup * ( dMpDEy - dMpDWy * pREdge->dWpDpsiP1 ); - *(pNode->fPPsijP1) += - dFpxDMup * ( dMpDEx - dMpDWx * pBEdge->dWpDpsiP1 ) - - dFpyDMup * ( dMpDEy - dMpDWy * pLEdge->dWpDpsiP1 ); - /* p continuity wrto p derivatives */ - *(pNode->fPP) += - dFpxDMup * ( dMpDWx * pTEdge->dWpDp ) - + dFpyDMup * ( dMpDWy * pLEdge->dWpDp ); - *(pNode->fPPiP1) += - dFpxDMup * ( dMpDWx * pTEdge->dWpDpP1 ) - + dFpyDMup * ( dMpDWy * pREdge->dWpDp ); - *(pNode->fPPiP1jP1) += - dFpxDMup * ( dMpDWx * pBEdge->dWpDpP1 ) - + dFpyDMup * ( dMpDWy * pREdge->dWpDpP1 ); - *(pNode->fPPjP1) += - dFpxDMup * ( dMpDWx * pBEdge->dWpDp ) - + dFpyDMup * ( dMpDWy * pLEdge->dWpDpP1 ); - /* both continuity wrto surface potential derivatives */ - if ( channel ) { - dFpDEs = coeffVs * (pLEdge->wdfp * rDy) * dMpDEs; - *(pNode->fPPsiIn) -= dFpDEs; - *(pNode->fPPsiInP1) -= dFpDEs; - *(pNode->fPPsiOx) += dFpDEs; - *(pNode->fPPsiOxP1) += dFpDEs; - } - - /* Do Bottom-Left (BL) Node of Element */ - pNode = pElem->pBLNode; - /* p continuity wrto potential derivatives */ - *(pNode->fPPsijM1) -= - dFpxDMup * ( dMpDEx - dMpDWx * pTEdge->dWpDpsiP1 ) - + dFpyDMup * ( dMpDEy - dMpDWy * pLEdge->dWpDpsiP1 ); - *(pNode->fPPsiiP1jM1) -= - - dFpxDMup * ( dMpDEx - dMpDWx * pTEdge->dWpDpsiP1 ) - + dFpyDMup * ( dMpDEy - dMpDWy * pREdge->dWpDpsiP1 ); - *(pNode->fPPsiiP1) -= - - dFpxDMup * ( dMpDEx - dMpDWx * pBEdge->dWpDpsiP1 ) - - dFpyDMup * ( dMpDEy - dMpDWy * pREdge->dWpDpsiP1 ); - *(pNode->fPPsi) -= - dFpxDMup * ( dMpDEx - dMpDWx * pBEdge->dWpDpsiP1 ) - - dFpyDMup * ( dMpDEy - dMpDWy * pLEdge->dWpDpsiP1 ); - /* p continuity wrto p derivatives */ - *(pNode->fPPjM1) -= - dFpxDMup * ( dMpDWx * pTEdge->dWpDp ) - + dFpyDMup * ( dMpDWy * pLEdge->dWpDp ); - *(pNode->fPPiP1jM1) -= - dFpxDMup * ( dMpDWx * pTEdge->dWpDpP1 ) - + dFpyDMup * ( dMpDWy * pREdge->dWpDp ); - *(pNode->fPPiP1) -= - dFpxDMup * ( dMpDWx * pBEdge->dWpDpP1 ) - + dFpyDMup * ( dMpDWy * pREdge->dWpDpP1 ); - *(pNode->fPP) -= - dFpxDMup * ( dMpDWx * pBEdge->dWpDp ) - + dFpyDMup * ( dMpDWy * pLEdge->dWpDpP1 ); - /* both continuity wrto surface potential derivatives */ - if ( channel ) { - *(pNode->fPPsiIn) += dFpDEs; - *(pNode->fPPsiInP1) += dFpDEs; - *(pNode->fPPsiOx) -= dFpDEs; - *(pNode->fPPsiOxP1) -= dFpDEs; - } - - /* Add mobility derivatives due to Right Edge */ - /* First compute derivatives of cont. eqn's */ - dFpxDMup = coeffVx * (pREdge->wdfp * rDy); - dFpyDMup = coeffVy * (pREdge->wdfp * rDy); - - /* Do Top-Right (TR) Node of Element */ - pNode = pElem->pTRNode; - /* p continuity wrto potential derivatives */ - *(pNode->fPPsiiM1) += - dFpxDMup * ( dMpDEx - dMpDWx * pTEdge->dWpDpsiP1 ) - + dFpyDMup * ( dMpDEy - dMpDWy * pLEdge->dWpDpsiP1 ); - *(pNode->fPPsi) += - - dFpxDMup * ( dMpDEx - dMpDWx * pTEdge->dWpDpsiP1 ) - + dFpyDMup * ( dMpDEy - dMpDWy * pREdge->dWpDpsiP1 ); - *(pNode->fPPsijP1) += - - dFpxDMup * ( dMpDEx - dMpDWx * pBEdge->dWpDpsiP1 ) - - dFpyDMup * ( dMpDEy - dMpDWy * pREdge->dWpDpsiP1 ); - *(pNode->fPPsiiM1jP1) += - dFpxDMup * ( dMpDEx - dMpDWx * pBEdge->dWpDpsiP1 ) - - dFpyDMup * ( dMpDEy - dMpDWy * pLEdge->dWpDpsiP1 ); - /* p continuity wrto p derivatives */ - *(pNode->fPPiM1) += - dFpxDMup * ( dMpDWx * pTEdge->dWpDp ) - + dFpyDMup * ( dMpDWy * pLEdge->dWpDp ); - *(pNode->fPP) += - dFpxDMup * ( dMpDWx * pTEdge->dWpDpP1 ) - + dFpyDMup * ( dMpDWy * pREdge->dWpDp ); - *(pNode->fPPjP1) += - dFpxDMup * ( dMpDWx * pBEdge->dWpDpP1 ) - + dFpyDMup * ( dMpDWy * pREdge->dWpDpP1 ); - *(pNode->fPPiM1jP1) += - dFpxDMup * ( dMpDWx * pBEdge->dWpDp ) - + dFpyDMup * ( dMpDWy * pLEdge->dWpDpP1 ); - /* both continuity wrto surface potential derivatives */ - if ( channel ) { - dFpDEs = coeffVs * (pREdge->wdfp * rDy) * dMpDEs; - *(pNode->fPPsiInM1) -= dFpDEs; - *(pNode->fPPsiIn) -= dFpDEs; - *(pNode->fPPsiOxM1) += dFpDEs; - *(pNode->fPPsiOx) += dFpDEs; - } - - /* Do Bottom-Right (BR) Node of Element */ - pNode = pElem->pBRNode; - /* p continuity wrto potential derivatives */ - *(pNode->fPPsiiM1jM1) -= - dFpxDMup * ( dMpDEx - dMpDWx * pTEdge->dWpDpsiP1 ) - + dFpyDMup * ( dMpDEy - dMpDWy * pLEdge->dWpDpsiP1 ); - *(pNode->fPPsijM1) -= - - dFpxDMup * ( dMpDEx - dMpDWx * pTEdge->dWpDpsiP1 ) - + dFpyDMup * ( dMpDEy - dMpDWy * pREdge->dWpDpsiP1 ); - *(pNode->fPPsi) -= - - dFpxDMup * ( dMpDEx - dMpDWx * pBEdge->dWpDpsiP1 ) - - dFpyDMup * ( dMpDEy - dMpDWy * pREdge->dWpDpsiP1 ); - *(pNode->fPPsiiM1) -= - dFpxDMup * ( dMpDEx - dMpDWx * pBEdge->dWpDpsiP1 ) - - dFpyDMup * ( dMpDEy - dMpDWy * pLEdge->dWpDpsiP1 ); - /* p continuity wrto p derivatives */ - *(pNode->fPPiM1jM1) -= - dFpxDMup * ( dMpDWx * pTEdge->dWpDp ) - + dFpyDMup * ( dMpDWy * pLEdge->dWpDp ); - *(pNode->fPPjM1) -= - dFpxDMup * ( dMpDWx * pTEdge->dWpDpP1 ) - + dFpyDMup * ( dMpDWy * pREdge->dWpDp ); - *(pNode->fPP) -= - dFpxDMup * ( dMpDWx * pBEdge->dWpDpP1 ) - + dFpyDMup * ( dMpDWy * pREdge->dWpDpP1 ); - *(pNode->fPPiM1) -= - dFpxDMup * ( dMpDWx * pBEdge->dWpDp ) - + dFpyDMup * ( dMpDWy * pLEdge->dWpDpP1 ); - - /* both continuity wrto surface potential derivatives */ - if ( channel ) { - *(pNode->fPPsiInM1) += dFpDEs; - *(pNode->fPPsiIn) += dFpDEs; - *(pNode->fPPsiOxM1) -= dFpDEs; - *(pNode->fPPsiOx) -= dFpDEs; - } - - return; -} diff --git a/src/ciderlib/twod/twomobfn.c b/src/ciderlib/twod/twomobfn.c deleted file mode 100644 index 75e4856fc..000000000 --- a/src/ciderlib/twod/twomobfn.c +++ /dev/null @@ -1,419 +0,0 @@ -/********** -Copyright 1991 Regents of the University of California. All rights reserved. -Author: 1990 David A. Gates, U. C. Berkeley CAD Group -**********/ - -#include "ngspice/ngspice.h" -#include "ngspice/numglobs.h" -#include "ngspice/numconst.h" -#include "ngspice/numenum.h" -#include "ngspice/twomesh.h" -#include "ngspice/material.h" -#include "twoddefs.h" -#include "twodext.h" - -/* - * These functions calculate the variable-dependence - * of the surface mobilities - */ - -void -MOBsurfElec(TWOmaterial *info, TWOelem *pElem, double ex, double ey, - double es, double wx, double wy, double totalConc) -{ - double thetaA = info->thetaA[ELEC]; - double thetaB = info->thetaB[ELEC]; - double eL, eN, eD, e0, mun; - double temp1, temp2, temp3, temp4, temp5; - double temp6, temp7, temp8, temp9; - double sgnN, sgnL; - double dMunDEs; /* Surface Field Derivative */ - double dMunDEn; /* (Local) Normal Field Derivative */ - double dMunDEl; /* Tangent Field Derivative */ - double muHC, muSR, muLV; - double dMuSRDEn; - double d2MuSRDEn2; - double dMuHCDEl; - double dMuHCDMuSR; - double d2MuHCDMuSR2; - double d2MuHCDElDMuSR; - double dEnDEx; /* Normal Derivative x Component */ - double dEnDEy; /* Normal Derivative y Component */ - double dEnDWx; /* Normal Derivative x Component */ - double dEnDWy; /* Normal Derivative y Component */ - double dElDEx; /* Lateral Derivative x Component */ - double dElDEy; /* Lateral Derivative y Component */ - double dElDWx; /* Lateral Derivative x Component */ - double dElDWy; /* Lateral Derivative y Component */ - - NG_IGNORE(wx); - NG_IGNORE(wy); - NG_IGNORE(totalConc); - - if ( pElem->surface ) { /* replace one field component with surface field */ - if ( pElem->direction == 0 ) { - ey = es; - } else { - ex = es; - } - } - - e0 = 1.0 / ENorm; - if ( pElem->direction == 0 ) { - eN = ABS( SALPHA_N*ey + SBETA_N*es ); - sgnN = SGN( SALPHA_N*ey + SBETA_N*es ); - eD = SALPHA_N*( es - ey ); - dEnDEx = 0.0; - dEnDEy = 1.0; - dEnDWx = 0.0; - dEnDWy = 0.0; - eL = ABS( ex ); - sgnL = SGN( ex ); - dElDEx = 1.0; - dElDEy = 0.0; - dElDWx = 0.0; - dElDWy = 0.0; - } else { /* pElem->direction == Y */ - eN = ABS( SALPHA_N*ex + SBETA_N*es ); - sgnN = SGN( SALPHA_N*ex + SBETA_N*es ); - eD = SALPHA_N*( es - ex ); - dEnDEx = 1.0; - dEnDEy = 0.0; - dEnDWx = 0.0; - dEnDWy = 0.0; - eL = ABS( ey ); - sgnL = SGN( ey ); - dElDEx = 0.0; - dElDEy = 1.0; - dElDWx = 0.0; - dElDWy = 0.0; - } - /* - fprintf(stderr,"En = %e, Ep = %e, Ey = %e, Es= %e\n",eN,eL,ey,es); - */ - - muLV = pElem->mun0; - if ( TransDepMobility ) { - /* Compute various partial derivatives of muSR */ - temp1 = 1.0 / ( 1.0 + thetaA*eN + thetaB*eN*eN ); - temp2 = (thetaA + 2.0*thetaB*eN); - muSR = muLV * temp1; - dMuSRDEn = - muSR * temp1 * temp2; - d2MuSRDEn2 = - 2.0 * (dMuSRDEn * temp1 * temp2 + muSR * temp1 * thetaB); - if ( FieldDepMobility ) { - /* Compute various partial derivatives of muHC */ - switch ( info->fieldModel ) { - case CT: - case AR: - case UF: - temp1 = 1.0 / info->vSat[ELEC]; - temp2 = muSR * temp1; - temp3 = eL * temp1; - temp4 = eL * temp2; - temp5 = 1.0 / ( 1.0 + temp4 * temp4 ); - temp6 = sqrt( temp5 ); - muHC = muSR * temp6; - dMuHCDMuSR = temp5 * temp6; - temp7 = temp4 * dMuHCDMuSR; - temp8 = - 3.0 * temp7 * temp5; - dMuHCDEl = - muSR * temp7 * temp2; - d2MuHCDMuSR2 = temp8 * temp3; - d2MuHCDElDMuSR = temp8 * temp2; - break; - case SG: - default: - temp1 = 1.0 / info->vSat[ELEC]; - temp2 = muSR * eL * temp1; /* Vdrift / Vsat */ - temp3 = 1.0 / info->vWarm[ELEC]; - temp4 = muSR * eL * temp3; /* Vdrift / Vwarm */ - temp5 = temp4 / (temp4 + SG_FIT_N); - temp6 = 1.0 / (1.0 + temp5*temp4 + temp2*temp2); - temp7 = sqrt(temp6); - muHC = muSR * temp7; - temp7 *= temp6; - temp8 = (2.0 - temp5)*temp5*temp3 + 2.0*temp2*temp1; - dMuHCDEl = - 0.5*muSR*temp7*temp8 * muSR; - temp9 = temp5*temp5; - dMuHCDMuSR = (1.0 + 0.5*temp9*temp4) * temp7; - temp9 = (1.5 - temp5)*temp9*temp3 * temp7; - temp9 -= 1.5 * dMuHCDMuSR * temp6 * temp8; - d2MuHCDMuSR2 = temp9 * eL; - d2MuHCDElDMuSR = temp9 * muSR; - break; - } - - /* Now compute total derivatives */ - temp1 = dMuHCDMuSR * dMuSRDEn * sgnN; - temp2 = d2MuHCDMuSR2 * dMuSRDEn * dMuSRDEn + dMuHCDMuSR * d2MuSRDEn2; - temp3 = temp1 - temp2 * eD; - mun = muHC - temp1 * eD; - dMunDEn = (temp3 + temp1) * SALPHA_N; - dMunDEs = temp3 * SBETA_N - temp1 * SALPHA_N; - dMunDEl = (dMuHCDEl - d2MuHCDElDMuSR * dMuSRDEn * sgnN * eD) * sgnL; - } else { - /* Now compute total derivatives */ - temp1 = dMuSRDEn * sgnN; - temp3 = temp1 - d2MuSRDEn2 * eD; - mun = muSR - temp1 * eD; - dMunDEn = (temp3 + temp1) * SALPHA_N; - dMunDEs = temp3 * SBETA_N - temp1 * SALPHA_N; - dMunDEl = 0.0; - } - } else { - if ( FieldDepMobility ) { - /* Compute various partial derivatives of muHC */ - switch ( info->fieldModel ) { - case CT: - case AR: - case UF: - temp1 = muLV / info->vSat[ELEC]; - temp2 = eL * temp1; - temp3 = 1.0 / ( 1.0 + temp2 * temp2 ); - temp4 = sqrt( temp3 ); - muHC = muLV * temp4; - dMuHCDEl = - muHC*temp2*temp3 * temp1; - break; - case SG: - default: - temp1 = 1.0 / info->vSat[ELEC]; - temp2 = muLV * eL * temp1; /* Vdrift / Vsat */ - temp3 = 1.0 / info->vWarm[ELEC]; - temp4 = muLV * eL * temp3; /* Vdrift / Vwarm */ - temp5 = temp4 / (temp4 + SG_FIT_N); - temp6 = 1.0 / (1.0 + temp5*temp4 + temp2*temp2); - temp7 = sqrt(temp6); - muHC = muLV * temp7; - temp8 = (2.0 - temp5)*temp5*temp3 + 2.0*temp2*temp1; - dMuHCDEl = - 0.5*muHC*temp6*temp8 * muLV; - break; - } - - /* Now compute total derivatives */ - mun = muHC; - dMunDEn = 0.0; - dMunDEs = 0.0; - dMunDEl = dMuHCDEl * sgnL; - } else { - mun = muLV; - dMunDEn = 0.0; - dMunDEs = 0.0; - dMunDEl = 0.0; - } - } - - pElem->mun = mun; - pElem->dMunDEs = dMunDEs; - pElem->dMunDEx = dMunDEn * dEnDEx + dMunDEl * dElDEx; - pElem->dMunDEy = dMunDEn * dEnDEy + dMunDEl * dElDEy; - pElem->dMunDWx = dMunDEn * dEnDWx + dMunDEl * dElDWx; - pElem->dMunDWy = dMunDEn * dEnDWy + dMunDEl * dElDWy; - - if ( pElem->surface ) { /* replace one field component with surface field */ - if ( pElem->direction == 0 ) { - pElem->dMunDEs += pElem->dMunDEy; - pElem->dMunDEy = 0.0; - } else { - pElem->dMunDEs += pElem->dMunDEx; - pElem->dMunDEx = 0.0; - } - } - - return; -} - -void -MOBsurfHole(TWOmaterial *info, TWOelem *pElem, double ex, double ey, - double es, double wx, double wy, double totalConc) -{ - double thetaA = info->thetaA[HOLE]; - double thetaB = info->thetaB[HOLE]; - double eL, eN, eD, mup; - double temp1, temp2, temp3, temp4, temp5; - double temp6, temp7, temp8, temp9; - double sgnN, sgnL; - double dMupDEs; /* Surface Field Derivative */ - double dMupDEn; /* (Local) Normal Field Derivative */ - double dMupDEl; /* Tangent Field Derivative */ - double muHC, muSR, muLV; - double dMuSRDEn; - double d2MuSRDEn2; - double dMuHCDEl; - double dMuHCDMuSR; - double d2MuHCDMuSR2; - double d2MuHCDElDMuSR; - double dEnDEx; /* Normal Derivative x Component */ - double dEnDEy; /* Normal Derivative y Component */ - double dEnDWx; /* Normal Derivative x Component */ - double dEnDWy; /* Normal Derivative y Component */ - double dElDEx; /* Lateral Derivative x Component */ - double dElDEy; /* Lateral Derivative y Component */ - double dElDWx; /* Lateral Derivative x Component */ - double dElDWy; /* Lateral Derivative y Component */ - - NG_IGNORE(wx); - NG_IGNORE(wy); - NG_IGNORE(totalConc); - - if ( pElem->surface ) { /* replace one field component with surface field */ - if ( pElem->direction == 0 ) { - ey = es; - } else { - ex = es; - } - } - - if ( pElem->direction == 0 ) { - eN = ABS( SALPHA_P*ey + SBETA_P*es ); - sgnN = SGN( SALPHA_P*ey + SBETA_P*es ); - eD = SALPHA_P*( es - ey ); - dEnDEx = 0.0; - dEnDEy = 1.0; - dEnDWx = 0.0; - dEnDWy = 0.0; - eL = ABS( ex ); - sgnL = SGN( ex ); - dElDEx = 1.0; - dElDEy = 0.0; - dElDWx = 0.0; - dElDWy = 0.0; - } else { /* pElem->direction == Y */ - eN = ABS( SALPHA_P*ex + SBETA_P*es ); - sgnN = SGN( SALPHA_P*ex + SBETA_P*es ); - eD = SALPHA_P*( es - ex ); - dEnDEx = 1.0; - dEnDEy = 0.0; - dEnDWx = 0.0; - dEnDWy = 0.0; - eL = ABS( ey ); - sgnL = SGN( ey ); - dElDEx = 0.0; - dElDEy = 1.0; - dElDWx = 0.0; - dElDWy = 0.0; - } - - muLV = pElem->mup0; - if ( TransDepMobility ) { - /* Compute various partial derivatives of muSR */ - temp1 = 1.0 / ( 1.0 + thetaA*eN + thetaB*eN*eN ); - temp2 = thetaA + 2.0*thetaB*eN; - muSR = muLV * temp1; - dMuSRDEn = - muSR * temp1 * temp2; - d2MuSRDEn2 = - 2.0 * (dMuSRDEn * temp1 * temp2 + muSR * temp1 * thetaB); - if ( FieldDepMobility ) { - /* Compute various partial derivatives of muHC */ - switch ( info->fieldModel ) { - case CT: - case AR: - case UF: - temp1 = 1.0 / info->vSat[HOLE]; - temp2 = muSR * temp1; - temp3 = eL * temp1; - temp4 = eL * temp2; - temp5 = 1.0 / ( 1.0 + temp4 ); - muHC = muSR * temp5; - dMuHCDMuSR = temp5 * temp5; - dMuHCDEl = - muSR * dMuHCDMuSR * temp2; - temp6 = - 2.0 * dMuHCDMuSR * temp5; - d2MuHCDMuSR2 = temp6 * temp3; - d2MuHCDElDMuSR = temp6 * temp2; - break; - case SG: - default: - temp1 = 1.0 / info->vSat[HOLE]; - temp2 = muSR * eL * temp1; /* Vdrift / Vsat */ - temp3 = 1.0 / info->vWarm[HOLE]; - temp4 = muSR * eL * temp3; /* Vdrift / Vwarm */ - temp5 = temp4 / (temp4 + SG_FIT_P); - temp6 = 1.0 / (1.0 + temp5*temp4 + temp2*temp2); - temp7 = sqrt(temp6); - muHC = muSR * temp7; - temp7 *= temp6; - temp8 = (2.0 - temp5)*temp5*temp3 + 2.0*temp2*temp1; - dMuHCDEl = - 0.5*muSR*temp7*temp8 * muSR; - temp9 = temp5*temp5; - dMuHCDMuSR = (1.0 + 0.5*temp9*temp4) * temp7; - temp9 = (1.5 - temp5)*temp9*temp3 * temp7; - temp9 -= 1.5 * dMuHCDMuSR * temp6 * temp8; - d2MuHCDMuSR2 = temp9 * eL; - d2MuHCDElDMuSR = temp9 * muSR; - break; - } - - /* Now compute total derivatives */ - temp1 = dMuHCDMuSR * dMuSRDEn * sgnN; - temp2 = d2MuHCDMuSR2 * dMuSRDEn * dMuSRDEn + dMuHCDMuSR * d2MuSRDEn2; - temp3 = temp1 - temp2 * eD; - mup = muHC - temp1 * eD; - dMupDEn = (temp3 + temp1) * SALPHA_P; - dMupDEs = temp3 * SBETA_P - temp1 * SALPHA_P; - dMupDEl = (dMuHCDEl - d2MuHCDElDMuSR * dMuSRDEn * sgnN * eD ) * sgnL; - } else { - /* Now compute total derivatives */ - temp1 = dMuSRDEn * sgnN; - temp3 = temp1 - d2MuSRDEn2 * eD; - mup = muSR - temp1 * eD; - dMupDEn = (temp3 + temp1) * SALPHA_P; - dMupDEs = temp3 * SBETA_P - temp1 * SALPHA_P; - dMupDEl = 0.0; - } - } else { - if ( FieldDepMobility ) { - /* Compute various partial derivatives of muHC */ - switch ( info->fieldModel ) { - case CT: - case AR: - case UF: - temp1 = muLV / info->vSat[HOLE]; - temp2 = eL * temp1; - temp3 = 1.0 / ( 1.0 + temp2 ); - muHC = muLV * temp3; - dMuHCDEl = - muHC * temp3 * temp1; - break; - case SG: - default: - temp1 = 1.0 / info->vSat[HOLE]; - temp2 = muLV * eL * temp1; /* Vdrift / Vsat */ - temp3 = 1.0 / info->vWarm[HOLE]; - temp4 = muLV * eL * temp3; /* Vdrift / Vwarm */ - temp5 = temp4 / (temp4 + SG_FIT_P); - temp6 = 1.0 / (1.0 + temp5*temp4 + temp2*temp2); - temp7 = sqrt(temp6); - muHC = muLV * temp7; - temp8 = (2.0 - temp5)*temp5*temp3 + 2.0*temp2*temp1; - dMuHCDEl = - 0.5*muHC*temp6*temp8 * muLV; - break; - } - - /* Now compute total derivatives */ - mup = muHC; - dMupDEn = 0.0; - dMupDEs = 0.0; - dMupDEl = dMuHCDEl * sgnL; - } else { - mup = muLV; - dMupDEn = 0.0; - dMupDEs = 0.0; - dMupDEl = 0.0; - } - } - - pElem->mup = mup; - pElem->dMupDEs = dMupDEs; - pElem->dMupDEx = dMupDEn * dEnDEx + dMupDEl * dElDEx; - pElem->dMupDEy = dMupDEn * dEnDEy + dMupDEl * dElDEy; - pElem->dMupDWx = dMupDEn * dEnDWx + dMupDEl * dElDWx; - pElem->dMupDWy = dMupDEn * dEnDWy + dMupDEl * dElDWy; - - if ( pElem->surface ) { /* replace one field component with surface field */ - if ( pElem->direction == 0 ) { - pElem->dMupDEs += pElem->dMupDEy; - pElem->dMupDEy = 0.0; - } else { - pElem->dMupDEs += pElem->dMupDEx; - pElem->dMupDEx = 0.0; - } - } - - return; -} diff --git a/src/ciderlib/twod/twomobil.c b/src/ciderlib/twod/twomobil.c deleted file mode 100644 index 159a80c99..000000000 --- a/src/ciderlib/twod/twomobil.c +++ /dev/null @@ -1,131 +0,0 @@ -/********** -Copyright 1991 Regents of the University of California. All rights reserved. -Author: 1990 David A. Gates, U. C. Berkeley CAD Group -**********/ - -#include "ngspice/ngspice.h" -#include "ngspice/numglobs.h" -#include "ngspice/twomesh.h" -#include "twoddefs.h" -#include "twodext.h" - -/* - * Compute the 2-D field-dependent mobility at the center of an element. - * It is known a priori that the element belongs to a semiconductor domain. - */ - -void -TWO_mobility(TWOelem *pElem, double eSurf) -{ - - TWOedge *pTEdge, *pBEdge, *pLEdge, *pREdge; - double dx, dy, rDx, rDy; - double enx, eny, wnx, wny, concav; - double epx, epy, wpx, wpy; - - /* Initialize various quantities */ - dx = pElem->dx; - dy = pElem->dy; - rDx = 0.5 / dx; /* Includes averaging factor of 0.5 */ - rDy = 0.5 / dy; /* Includes averaging factor of 0.5 */ - - /* Get pointers to element's edges */ - pTEdge = pElem->pTopEdge; - pBEdge = pElem->pBotEdge; - pLEdge = pElem->pLeftEdge; - pREdge = pElem->pRightEdge; - - /* Calculate electric field at element center */ - enx = -rDx *(pTEdge->dPsi + pTEdge->dCBand + pBEdge->dPsi + pBEdge->dCBand); - epx = -rDx *(pTEdge->dPsi - pTEdge->dVBand + pBEdge->dPsi - pBEdge->dVBand); - eny = -rDy *(pLEdge->dPsi + pLEdge->dCBand + pREdge->dPsi + pREdge->dCBand); - epy = -rDy *(pLEdge->dPsi - pLEdge->dVBand + pREdge->dPsi - pREdge->dVBand); - - /* Calculate weighted carrier driving force at element center */ - wnx = rDx * (pTEdge->wdfn + pBEdge->wdfn); - wpx = rDx * (pTEdge->wdfp + pBEdge->wdfp); - wny = rDy * (pLEdge->wdfn + pREdge->wdfn); - wpy = rDy * (pLEdge->wdfp + pREdge->wdfp); - - /* compute the mobility for the element */ - /* Average concentrations at the four corners */ - concav = 0.25 * ( pElem->pTLNode->totalConc + pElem->pTRNode->totalConc + - pElem->pBLNode->totalConc + pElem->pBRNode->totalConc ); - MOBsurfElec(pElem->matlInfo, pElem, enx, eny, eSurf, wnx, wny, concav); - MOBsurfHole(pElem->matlInfo, pElem, epx, epy, eSurf, wpx, wpy, concav); - return; -} - -void -TWONmobility(TWOelem *pElem, double eSurf) -{ - - TWOedge *pTEdge, *pBEdge, *pLEdge, *pREdge; - double dx, dy, rDx, rDy; - double enx, eny, wnx, wny, concav; - - /* Initialize various quantities */ - dx = pElem->dx; - dy = pElem->dy; - rDx = 0.5 / dx; /* Includes averaging factor of 0.5 */ - rDy = 0.5 / dy; /* Includes averaging factor of 0.5 */ - - /* Get pointers to element's edges */ - pTEdge = pElem->pTopEdge; - pBEdge = pElem->pBotEdge; - pLEdge = pElem->pLeftEdge; - pREdge = pElem->pRightEdge; - - /* Calculate electric field at element center */ - enx = -rDx *(pTEdge->dPsi + pTEdge->dCBand + pBEdge->dPsi + pBEdge->dCBand); - eny = -rDy *(pLEdge->dPsi + pLEdge->dCBand + pREdge->dPsi + pREdge->dCBand); - - /* Calculate weighted carrier driving force at element center */ - wnx = rDx * (pTEdge->wdfn + pBEdge->wdfn); - wny = rDy * (pLEdge->wdfn + pREdge->wdfn); - - /* compute the mobility for the element */ - /* Average concentrations at the four corners */ - concav = 0.25 * ( pElem->pTLNode->totalConc + pElem->pTRNode->totalConc + - pElem->pBLNode->totalConc + pElem->pBRNode->totalConc ); - MOBsurfElec(pElem->matlInfo, pElem, enx, eny, eSurf, wnx, wny, concav); - - return; -} - -void -TWOPmobility(TWOelem *pElem, double eSurf) -{ - - TWOedge *pTEdge, *pBEdge, *pLEdge, *pREdge; - double dx, dy, rDx, rDy; - double epx, epy, wpx, wpy, concav; - - /* Initialize various quantities */ - dx = pElem->dx; - dy = pElem->dy; - rDx = 0.5 / dx; /* Includes averaging factor of 0.5 */ - rDy = 0.5 / dy; /* Includes averaging factor of 0.5 */ - - /* Get pointers to element's edges */ - pTEdge = pElem->pTopEdge; - pBEdge = pElem->pBotEdge; - pLEdge = pElem->pLeftEdge; - pREdge = pElem->pRightEdge; - - /* Calculate electric field at element center */ - epx = -rDx *(pTEdge->dPsi - pTEdge->dVBand + pBEdge->dPsi - pBEdge->dVBand); - epy = -rDy *(pLEdge->dPsi - pLEdge->dVBand + pREdge->dPsi - pREdge->dVBand); - - /* Calculate weighted carrier driving force at element center */ - wpx = rDx * (pTEdge->wdfp + pBEdge->wdfp); - wpy = rDy * (pLEdge->wdfp + pREdge->wdfp); - - /* compute the mobility for the element */ - /* Average concentrations at the four corners */ - concav = 0.25 * ( pElem->pTLNode->totalConc + pElem->pTRNode->totalConc + - pElem->pBLNode->totalConc + pElem->pBRNode->totalConc ); - MOBsurfHole(pElem->matlInfo, pElem, epx, epy, eSurf, wpx, wpy, concav); - - return; -} diff --git a/src/ciderlib/twod/twoncont.c b/src/ciderlib/twod/twoncont.c deleted file mode 100644 index d491e99cc..000000000 --- a/src/ciderlib/twod/twoncont.c +++ /dev/null @@ -1,888 +0,0 @@ -/********** -Copyright 1991 Regents of the University of California. All rights reserved. -Author: 1987 Kartikeya Mayaram, U. C. Berkeley CAD Group -Author: 1991 David A. Gates, U. C. Berkeley CAD Group -**********/ - -#include "ngspice/ngspice.h" -#include "ngspice/numglobs.h" -#include "ngspice/numenum.h" -#include "ngspice/twomesh.h" -#include "ngspice/twodev.h" -#include "ngspice/bool.h" -#include "ngspice/spmatrix.h" -#include "twoddefs.h" -#include "twodext.h" -#include "ngspice/cidersupt.h" -#include "../../maths/misc/bernoull.h" - - -/* - * Functions to setup and solve the continuity equations. - * Both continuity equations are solved. - * Separate functions are used for one continuity equation. - */ - - -/* - * Setup matrix pointers to Jacobian entries and - * store direct pointers with the nodes. - */ - -void - TWONjacBuild(TWOdevice *pDevice) -{ - SMPmatrix *matrix = pDevice->matrix; - TWOelem *pElem; - TWOnode *pNode; - TWOchannel *pCh; - int eIndex, nIndex; - int nextIndex; /* index of node to find next element */ - int psiEqn, nEqn; /* scratch for deref'd eqn numbers */ - int psiEqnTL = 0, nEqnTL = 0; - int psiEqnTR = 0, nEqnTR = 0; - int psiEqnBR = 0, nEqnBR = 0; - int psiEqnBL = 0, nEqnBL = 0; - int psiEqnInM = 0, psiEqnInP = 0; /* scratch for deref'd surface eqns */ - int psiEqnOxM = 0, psiEqnOxP = 0; /* M= more negative, P= more positive */ - - for ( eIndex = 1; eIndex <= pDevice->numElems; eIndex++ ) { - pElem = pDevice->elements[ eIndex ]; - - /* first the self terms */ - for ( nIndex = 0; nIndex <= 3; nIndex++ ) { - pNode = pElem->pNodes[ nIndex ]; - /* get poisson-only pointer */ - psiEqn = pNode->psiEqn; - pNode->fPsiPsi = spGetElement( matrix, psiEqn, psiEqn ); - - if ( pElem->elemType == SEMICON ) { - /* get continuity-coupling terms */ - nEqn = pNode->nEqn; - pNode->pEqn = 0; /* Throw pEqn number into garbage. */ - /* pointers for additional terms */ - pNode->fPsiN = spGetElement( matrix, psiEqn, nEqn ); - pNode->fNPsi = spGetElement( matrix, nEqn, psiEqn ); - pNode->fNN = spGetElement( matrix, nEqn, nEqn ); - } else { - nEqn = 0; - } - /* save equation indices */ - switch ( nIndex ) { - case 0: /* TL Node */ - psiEqnTL = psiEqn; - nEqnTL = nEqn; - break; - case 1: /* TR Node */ - psiEqnTR = psiEqn; - nEqnTR = nEqn; - break; - case 2: /* BR Node */ - psiEqnBR = psiEqn; - nEqnBR = nEqn; - break; - case 3: /* BL Node */ - psiEqnBL = psiEqn; - nEqnBL = nEqn; - break; - default: - break; - } - } - - /* now terms to couple to adjacent nodes */ - pNode = pElem->pTLNode; - pNode->fPsiPsiiP1 = spGetElement(matrix, psiEqnTL, psiEqnTR ); - pNode->fPsiPsijP1 = spGetElement(matrix, psiEqnTL, psiEqnBL ); - if ( pElem->elemType == SEMICON ) { - /* continuity equation pointers */ - pNode->fNPsiiP1 = spGetElement( matrix, nEqnTL, psiEqnTR ); - pNode->fNNiP1 = spGetElement( matrix, nEqnTL, nEqnTR ); - pNode->fNPsijP1 = spGetElement( matrix, nEqnTL, psiEqnBL ); - pNode->fNNjP1 = spGetElement( matrix, nEqnTL, nEqnBL ); - /* Surface Mobility Model depends on diagonal node values */ - if ( MobDeriv && SurfaceMobility && pElem->channel ) { - pNode->fNPsiiP1jP1 = spGetElement( matrix, nEqnTL, psiEqnBR ); - pNode->fNNiP1jP1 = spGetElement( matrix, nEqnTL, nEqnBR ); - } - } - - pNode = pElem->pTRNode; - pNode->fPsiPsiiM1 = spGetElement(matrix, psiEqnTR, psiEqnTL ); - pNode->fPsiPsijP1 = spGetElement(matrix, psiEqnTR, psiEqnBR ); - if ( pElem->elemType == SEMICON ) { - /* continuity equation pointers */ - pNode->fNPsiiM1 = spGetElement( matrix, nEqnTR, psiEqnTL ); - pNode->fNNiM1 = spGetElement( matrix, nEqnTR, nEqnTL ); - pNode->fNPsijP1 = spGetElement( matrix, nEqnTR, psiEqnBR ); - pNode->fNNjP1 = spGetElement( matrix, nEqnTR, nEqnBR ); - /* Surface Mobility Model depends on diagonal node values */ - if ( MobDeriv && SurfaceMobility && pElem->channel ) { - pNode->fNPsiiM1jP1 = spGetElement( matrix, nEqnTR, psiEqnBL ); - pNode->fNNiM1jP1 = spGetElement( matrix, nEqnTR, nEqnBL ); - } - } - - pNode = pElem->pBRNode; - pNode->fPsiPsiiM1 = spGetElement(matrix, psiEqnBR, psiEqnBL ); - pNode->fPsiPsijM1 = spGetElement(matrix, psiEqnBR, psiEqnTR ); - if ( pElem->elemType == SEMICON ) { - /* continuity equation pointers */ - pNode->fNPsiiM1 = spGetElement( matrix, nEqnBR, psiEqnBL ); - pNode->fNNiM1 = spGetElement( matrix, nEqnBR, nEqnBL ); - pNode->fNPsijM1 = spGetElement( matrix, nEqnBR, psiEqnTR ); - pNode->fNNjM1 = spGetElement( matrix, nEqnBR, nEqnTR ); - /* Surface Mobility Model depends on diagonal node values */ - if ( MobDeriv && SurfaceMobility && pElem->channel ) { - pNode->fNPsiiM1jM1 = spGetElement( matrix, nEqnBR, psiEqnTL ); - pNode->fNNiM1jM1 = spGetElement( matrix, nEqnBR, nEqnTL ); - } - } - - pNode = pElem->pBLNode; - pNode->fPsiPsiiP1 = spGetElement(matrix, psiEqnBL, psiEqnBR ); - pNode->fPsiPsijM1 = spGetElement(matrix, psiEqnBL, psiEqnTL ); - if ( pElem->elemType == SEMICON ) { - /* continuity equation pointers */ - pNode->fNPsiiP1 = spGetElement( matrix, nEqnBL, psiEqnBR ); - pNode->fNNiP1 = spGetElement( matrix, nEqnBL, nEqnBR ); - pNode->fNPsijM1 = spGetElement( matrix, nEqnBL, psiEqnTL ); - pNode->fNNjM1 = spGetElement( matrix, nEqnBL, nEqnTL ); - /* Surface Mobility Model depends on diagonal node values */ - if ( MobDeriv && SurfaceMobility && pElem->channel ) { - pNode->fNPsiiP1jM1 = spGetElement( matrix, nEqnBL, psiEqnTR ); - pNode->fNNiP1jM1 = spGetElement( matrix, nEqnBL, nEqnTR ); - } - } - } - /* - * Add terms for surface-field of inversion-layer mobility model. - * Elements MUST be made from silicon for this to work. - * No empty elements are allowed. - * Don't need these pointers if SurfaceMobility isn't set. - */ - if ( MobDeriv && SurfaceMobility ) { - for ( pCh = pDevice->pChannel; pCh != NULL; - pCh = pCh->next ) { - pElem = pCh->pNElem; - switch (pCh->type) { - case 0: - psiEqnInM = pElem->pBLNode->psiEqn; - psiEqnInP = pElem->pBRNode->psiEqn; - psiEqnOxM = pElem->pTLNode->psiEqn; - psiEqnOxP = pElem->pTRNode->psiEqn; - break; - case 1: - psiEqnInM = pElem->pTLNode->psiEqn; - psiEqnInP = pElem->pBLNode->psiEqn; - psiEqnOxM = pElem->pTRNode->psiEqn; - psiEqnOxP = pElem->pBRNode->psiEqn; - break; - case 2: - psiEqnInM = pElem->pTLNode->psiEqn; - psiEqnInP = pElem->pTRNode->psiEqn; - psiEqnOxM = pElem->pBLNode->psiEqn; - psiEqnOxP = pElem->pBRNode->psiEqn; - break; - case 3: - psiEqnInM = pElem->pTRNode->psiEqn; - psiEqnInP = pElem->pBRNode->psiEqn; - psiEqnOxM = pElem->pTLNode->psiEqn; - psiEqnOxP = pElem->pBLNode->psiEqn; - break; - } - pElem = pCh->pSeed; - nextIndex = (pCh->type + 2)%4; - while (pElem && pElem->channel == pCh->id) { - for ( nIndex = 0; nIndex <= 3; nIndex++ ) { - pNode = pElem->pNodes[ nIndex ]; - psiEqn = pNode->psiEqn; - nEqn = pNode->nEqn; - if ( pCh->type % 2 == 0 ) { /* Vertical Slice */ - if ( nIndex == 0 || nIndex == 3 ) { /* Left Side */ - pNode->fNPsiIn = spGetElement( matrix, nEqn, psiEqnInM ); - pNode->fNPsiInP1 = spGetElement( matrix, nEqn, psiEqnInP ); - pNode->fNPsiOx = spGetElement( matrix, nEqn, psiEqnOxM ); - pNode->fNPsiOxP1 = spGetElement( matrix, nEqn, psiEqnOxP ); - } else { /* Right Side */ - pNode->fNPsiInM1 = spGetElement( matrix, nEqn, psiEqnInM ); - pNode->fNPsiIn = spGetElement( matrix, nEqn, psiEqnInP ); - pNode->fNPsiOxM1 = spGetElement( matrix, nEqn, psiEqnOxM ); - pNode->fNPsiOx = spGetElement( matrix, nEqn, psiEqnOxP ); - } - } else { /* Horizontal Slice */ - if ( nIndex == 0 || nIndex == 3 ) { /* Left (Top?) Side : bug 483 */ - pNode->fNPsiIn = spGetElement( matrix, nEqn, psiEqnInM ); - pNode->fNPsiInP1 = spGetElement( matrix, nEqn, psiEqnInP ); - pNode->fNPsiOx = spGetElement( matrix, nEqn, psiEqnOxM ); - pNode->fNPsiOxP1 = spGetElement( matrix, nEqn, psiEqnOxP ); - } else { /* Bottom Side */ - pNode->fNPsiInM1 = spGetElement( matrix, nEqn, psiEqnInM ); - pNode->fNPsiIn = spGetElement( matrix, nEqn, psiEqnInP ); - pNode->fNPsiOxM1 = spGetElement( matrix, nEqn, psiEqnOxM ); - pNode->fNPsiOx = spGetElement( matrix, nEqn, psiEqnOxP ); - } - } - } /* endfor nIndex */ - pElem = pElem->pElems[ nextIndex ]; - } /* endwhile pElem */ - } /* endfor pCh */ - } /* endif SurfaceMobility */ -} - - -/* - * The Jacobian and Rhs are loaded by the following function. - * Inputs are the transient analysis flag and the transient - * information structure - */ - -void - TWONsysLoad(TWOdevice *pDevice, BOOLEAN tranAnalysis, TWOtranInfo *info) -{ - TWOelem *pElem; - TWOnode *pNode; - TWOedge *pHEdge, *pVEdge; - TWOedge *pTEdge, *pBEdge, *pLEdge, *pREdge; - TWOchannel *pCh; - int index, eIndex; - int nextIndex; /* index of node to find next element */ - double *pRhs = pDevice->rhs; - double dx, dy, dxdy, dyOverDx, dxOverDy; - double ds; - double dPsiT, dPsiB, dPsiL, dPsiR; - double rhsN; - double nConc, pConc; - double perTime = 0.0; - - /* first compute the currents and derivatives */ - TWONcommonTerms( pDevice, FALSE, tranAnalysis, info ); - - /* find reciprocal timestep */ - if ( tranAnalysis ) { - perTime = info->intCoeff[0]; - } - - /* zero the rhs vector */ - for ( index = 1 ; index <= pDevice->numEqns ; index++ ) { - pRhs[ index ] = 0.0; - } - - /* zero the matrix */ - spClear( pDevice->matrix ); - - for ( eIndex = 1; eIndex <= pDevice->numElems; eIndex++ ) { - pElem = pDevice->elements[ eIndex ]; - - dx = 0.5 * pElem->dx; - dy = 0.5 * pElem->dy; - dxdy = dx * dy; - dxOverDy = 0.5 * pElem->epsRel * pElem->dxOverDy; - dyOverDx = 0.5 * pElem->epsRel * pElem->dyOverDx; - - pTEdge = pElem->pTopEdge; - pBEdge = pElem->pBotEdge; - pLEdge = pElem->pLeftEdge; - pREdge = pElem->pRightEdge; - dPsiT = pTEdge->dPsi; - dPsiB = pBEdge->dPsi; - dPsiL = pLEdge->dPsi; - dPsiR = pREdge->dPsi; - - /* load for all i,j */ - for ( index = 0; index <= 3; index++ ) { - pNode = pElem->pNodes[ index ]; - if ( pNode->nodeType != CONTACT ) { - *(pNode->fPsiPsi) += dyOverDx + dxOverDy; - if ( index <= 1 ) { - pHEdge = pTEdge; - } else { - pHEdge = pBEdge; - } - if ( index == 0 || index == 3 ) { - pVEdge = pLEdge; - } else { - pVEdge = pREdge; - } - /* Add surface state charges. */ - pRhs[ pNode->psiEqn ] += dx * pHEdge->qf; - pRhs[ pNode->psiEqn ] += dy * pVEdge->qf; - if ( pElem->elemType == SEMICON ) { - nConc = pDevice->devState0 [pNode->nodeN]; - pConc = pDevice->devState0 [pNode->nodeP]; - - *(pNode->fPsiN) += dxdy; - *(pNode->fPsiPsi) += dxdy * pConc; - *(pNode->fNPsi) -= dy * pHEdge->dJnDpsiP1 + dx * pVEdge->dJnDpsiP1; - pRhs[ pNode->psiEqn ] += dxdy * (pNode->netConc + pConc - nConc); - - /* Handle generation terms */ - *(pNode->fNN) -= dxdy * pNode->dUdN; - *(pNode->fNPsi) += dxdy * pNode->dUdP * pConc; - rhsN = - dxdy * pNode->uNet; - pRhs[ pNode->nEqn ] -= rhsN; - - /* Handle dXdT continuity terms */ - if ( tranAnalysis ) { - *(pNode->fNN) -= dxdy * perTime; - pRhs[ pNode->nEqn ] += dxdy * pNode->dNdT; - } - } - } - } - - /* Handle neighbor and edge dependent terms */ - pNode = pElem->pTLNode; - if ( pNode->nodeType != CONTACT ) { - pRhs[ pNode->psiEqn ] -= -dyOverDx * dPsiT - dxOverDy * dPsiL; - *(pNode->fPsiPsiiP1) -= dyOverDx; - *(pNode->fPsiPsijP1) -= dxOverDy; - if ( pElem->elemType == SEMICON ) { - pRhs[ pNode->nEqn ] -= dy * pTEdge->jn + dx * pLEdge->jn; - *(pNode->fNN) += dy * pTEdge->dJnDn + dx * pLEdge->dJnDn; - *(pNode->fNPsiiP1) += dy * pTEdge->dJnDpsiP1; - *(pNode->fNNiP1) += dy * pTEdge->dJnDnP1; - *(pNode->fNPsijP1) += dx * pLEdge->dJnDpsiP1; - *(pNode->fNNjP1) += dx * pLEdge->dJnDnP1; - } - } - pNode = pElem->pTRNode; - if ( pNode->nodeType != CONTACT ) { - pRhs[ pNode->psiEqn ] -= dyOverDx * dPsiT - dxOverDy * dPsiR; - *(pNode->fPsiPsiiM1) -= dyOverDx; - *(pNode->fPsiPsijP1) -= dxOverDy; - if ( pElem->elemType == SEMICON ) { - pRhs[ pNode->nEqn ] -= -dy * pTEdge->jn + dx * pREdge->jn; - *(pNode->fNN) += -dy * pTEdge->dJnDnP1 + dx * pREdge->dJnDn; - *(pNode->fNPsiiM1) += dy * pTEdge->dJnDpsiP1; - *(pNode->fNNiM1) -= dy * pTEdge->dJnDn; - *(pNode->fNPsijP1) += dx * pREdge->dJnDpsiP1; - *(pNode->fNNjP1) += dx * pREdge->dJnDnP1; - } - } - pNode = pElem->pBRNode; - if ( pNode->nodeType != CONTACT ) { - pRhs[ pNode->psiEqn ] -= dyOverDx * dPsiB + dxOverDy * dPsiR; - *(pNode->fPsiPsiiM1) -= dyOverDx; - *(pNode->fPsiPsijM1) -= dxOverDy; - if ( pElem->elemType == SEMICON ) { - pRhs[ pNode->nEqn ] -= -dy * pBEdge->jn - dx * pREdge->jn; - *(pNode->fNN) += -dy * pBEdge->dJnDnP1 - dx * pREdge->dJnDnP1; - *(pNode->fNPsiiM1) += dy * pBEdge->dJnDpsiP1; - *(pNode->fNNiM1) -= dy * pBEdge->dJnDn; - *(pNode->fNPsijM1) += dx * pREdge->dJnDpsiP1; - *(pNode->fNNjM1) -= dx * pREdge->dJnDn; - } - } - pNode = pElem->pBLNode; - if ( pNode->nodeType != CONTACT ) { - pRhs[ pNode->psiEqn ] -= -dyOverDx * dPsiB + dxOverDy * dPsiL; - *(pNode->fPsiPsiiP1) -= dyOverDx; - *(pNode->fPsiPsijM1) -= dxOverDy; - if ( pElem->elemType == SEMICON ) { - pRhs[ pNode->nEqn ] -= dy * pBEdge->jn - dx * pLEdge->jn; - *(pNode->fNN) += dy * pBEdge->dJnDn - dx * pLEdge->dJnDnP1; - *(pNode->fNPsiiP1) += dy * pBEdge->dJnDpsiP1; - *(pNode->fNNiP1) += dy * pBEdge->dJnDnP1; - *(pNode->fNPsijM1) += dx * pLEdge->dJnDpsiP1; - *(pNode->fNNjM1) -= dx * pLEdge->dJnDn; - } - } - } - - /* Calculate the Inversion-Layer Mobility Dependent Terms in Jac. */ - if ( MobDeriv && SurfaceMobility ) { - for ( pCh = pDevice->pChannel; pCh != NULL; - pCh = pCh->next ) { - /* Find effective height of oxide element at interface. */ - if ( pCh->type%2 == 0 ) { /* Vertical slice */ - ds = pCh->pNElem->dy / pCh->pNElem->epsRel; - } else { /* Horizontal slice */ - ds = pCh->pNElem->dx / pCh->pNElem->epsRel; - } - pElem = pCh->pSeed; - nextIndex = (pCh->type + 2)%4; - while (pElem && pElem->channel == pCh->id) { - TWONmobDeriv( pElem, pCh->type, ds ); - pElem = pElem->pElems[ nextIndex ]; - } - } /* endfor pCh != NULL */ - } /* endif MobDeriv and SurfaceMobility */ -} - - -/* - * This function used only for direct method ac analysis. - * Used to load only the dc Jacobian matrix. Rhs is unaffected - */ - -void - TWONjacLoad(TWOdevice *pDevice) -{ - TWOelem *pElem; - TWOnode *pNode; - TWOedge *pHEdge, *pVEdge; - TWOedge *pTEdge, *pBEdge, *pLEdge, *pREdge; - TWOchannel *pCh; - int index, eIndex; - int nextIndex; /* index of node to find next element */ - double dx, dy, dxdy, dyOverDx, dxOverDy; - double ds; - double pConc; - - /* first compute the currents and derivatives */ - TWONcommonTerms( pDevice, FALSE, FALSE, NULL ); - - /* zero the matrix */ - spClear( pDevice->matrix ); - - for ( eIndex = 1; eIndex <= pDevice->numElems; eIndex++ ) { - pElem = pDevice->elements[ eIndex ]; - dx = 0.5 * pElem->dx; - dy = 0.5 * pElem->dy; - dxdy = dx * dy; - dxOverDy = 0.5 * pElem->epsRel * pElem->dxOverDy; - dyOverDx = 0.5 * pElem->epsRel * pElem->dyOverDx; - - pTEdge = pElem->pTopEdge; - pBEdge = pElem->pBotEdge; - pLEdge = pElem->pLeftEdge; - pREdge = pElem->pRightEdge; - - /* load for all i,j */ - for ( index = 0; index <= 3; index++ ) { - pNode = pElem->pNodes[ index ]; - if ( pNode->nodeType != CONTACT ) { - *(pNode->fPsiPsi) += dyOverDx + dxOverDy; - if ( pElem->elemType == SEMICON ) { - if ( index <= 1 ) { - pHEdge = pTEdge; - } else { - pHEdge = pBEdge; - } - if ( index == 0 || index == 3 ) { - pVEdge = pLEdge; - } else { - pVEdge = pREdge; - } - pConc = pDevice->devState0 [pNode->nodeP]; - *(pNode->fPsiN) += dxdy; - *(pNode->fPsiPsi) += dxdy * pConc; - *(pNode->fNPsi) -= dy * pHEdge->dJnDpsiP1 + dx * pVEdge->dJnDpsiP1; - - /* Handle generation terms */ - *(pNode->fNN) -= dxdy * pNode->dUdN; - *(pNode->fNPsi) += dxdy * pNode->dUdP * pConc; - } - } - } - - /* Handle neighbor and edge dependent terms */ - pNode = pElem->pTLNode; - if ( pNode->nodeType != CONTACT ) { - *(pNode->fPsiPsiiP1) -= dyOverDx; - *(pNode->fPsiPsijP1) -= dxOverDy; - if ( pElem->elemType == SEMICON ) { - *(pNode->fNN) += dy * pTEdge->dJnDn + dx * pLEdge->dJnDn; - *(pNode->fNPsiiP1) += dy * pTEdge->dJnDpsiP1; - *(pNode->fNNiP1) += dy * pTEdge->dJnDnP1; - *(pNode->fNPsijP1) += dx * pLEdge->dJnDpsiP1; - *(pNode->fNNjP1) += dx * pLEdge->dJnDnP1; - } - } - pNode = pElem->pTRNode; - if ( pNode->nodeType != CONTACT ) { - *(pNode->fPsiPsiiM1) -= dyOverDx; - *(pNode->fPsiPsijP1) -= dxOverDy; - if ( pElem->elemType == SEMICON ) { - *(pNode->fNN) += -dy * pTEdge->dJnDnP1 + dx * pREdge->dJnDn; - *(pNode->fNPsiiM1) += dy * pTEdge->dJnDpsiP1; - *(pNode->fNNiM1) -= dy * pTEdge->dJnDn; - *(pNode->fNPsijP1) += dx * pREdge->dJnDpsiP1; - *(pNode->fNNjP1) += dx * pREdge->dJnDnP1; - } - } - pNode = pElem->pBRNode; - if ( pNode->nodeType != CONTACT ) { - *(pNode->fPsiPsiiM1) -= dyOverDx; - *(pNode->fPsiPsijM1) -= dxOverDy; - if ( pElem->elemType == SEMICON ) { - *(pNode->fNN) += -dy * pBEdge->dJnDnP1 - dx * pREdge->dJnDnP1; - *(pNode->fNPsiiM1) += dy * pBEdge->dJnDpsiP1; - *(pNode->fNNiM1) -= dy * pBEdge->dJnDn; - *(pNode->fNPsijM1) += dx * pREdge->dJnDpsiP1; - *(pNode->fNNjM1) -= dx * pREdge->dJnDn; - } - } - pNode = pElem->pBLNode; - if ( pNode->nodeType != CONTACT ) { - *(pNode->fPsiPsiiP1) -= dyOverDx; - *(pNode->fPsiPsijM1) -= dxOverDy; - if ( pElem->elemType == SEMICON ) { - *(pNode->fNN) += dy * pBEdge->dJnDn - dx * pLEdge->dJnDnP1; - *(pNode->fNPsiiP1) += dy * pBEdge->dJnDpsiP1; - *(pNode->fNNiP1) += dy * pBEdge->dJnDnP1; - *(pNode->fNPsijM1) += dx * pLEdge->dJnDpsiP1; - *(pNode->fNNjM1) -= dx * pLEdge->dJnDn; - } - } - } - - /* Calculate the Inversion-Layer Mobility Dependent Terms in Jac. */ - if ( MobDeriv && SurfaceMobility ) { - for ( pCh = pDevice->pChannel; pCh != NULL; - pCh = pCh->next ) { - /* Find effective height of oxide element at interface. */ - if ( pCh->type%2 == 0 ) { /* Vertical slice */ - ds = pCh->pNElem->dy / pCh->pNElem->epsRel; - } else { /* Horizontal slice */ - ds = pCh->pNElem->dx / pCh->pNElem->epsRel; - } - pElem = pCh->pSeed; - nextIndex = (pCh->type + 2)%4; - while (pElem && pElem->channel == pCh->id) { - TWONmobDeriv( pElem, pCh->type, ds ); - pElem = pElem->pElems[ nextIndex ]; - } - } /* endfor pCh != NULL */ - } /* endif MobDeriv and SurfaceMobility */ -} - -/* load only the Rhs vector */ -void - TWONrhsLoad(TWOdevice *pDevice, BOOLEAN tranAnalysis, TWOtranInfo *info) -{ - TWOelem *pElem; - TWOnode *pNode; - TWOedge *pHEdge, *pVEdge; - TWOedge *pTEdge, *pBEdge, *pLEdge, *pREdge; - int index, eIndex; - double *pRhs = pDevice->rhs; - double dx, dy, dxdy, dyOverDx, dxOverDy; - double dPsiT, dPsiB, dPsiL, dPsiR; - double rhsN; - double nConc, pConc; - double perTime; - - /* first compute the currents */ - TWONcommonTerms( pDevice, TRUE, tranAnalysis, info ); - - /* find reciprocal timestep */ - if ( tranAnalysis ) { - perTime = info->intCoeff[0]; - } - - /* zero the rhs vector */ - for ( index = 1 ; index <= pDevice->numEqns ; index++ ) { - pRhs[ index ] = 0.0; - } - - for ( eIndex = 1; eIndex <= pDevice->numElems; eIndex++ ) { - pElem = pDevice->elements[ eIndex ]; - - dx = 0.5 * pElem->dx; - dy = 0.5 * pElem->dy; - dxdy = dx * dy; - dxOverDy = 0.5 * pElem->epsRel * pElem->dxOverDy; - dyOverDx = 0.5 * pElem->epsRel * pElem->dyOverDx; - - pTEdge = pElem->pTopEdge; - pBEdge = pElem->pBotEdge; - pLEdge = pElem->pLeftEdge; - pREdge = pElem->pRightEdge; - dPsiT = pTEdge->dPsi; - dPsiB = pBEdge->dPsi; - dPsiL = pLEdge->dPsi; - dPsiR = pREdge->dPsi; - - /* load for all i,j */ - for ( index = 0; index <= 3; index++ ) { - pNode = pElem->pNodes[ index ]; - if ( pNode->nodeType != CONTACT ) { - if ( index <= 1 ) { - pHEdge = pTEdge; - } else { - pHEdge = pBEdge; - } - if ( index == 0 || index == 3 ) { - pVEdge = pLEdge; - } else { - pVEdge = pREdge; - } - /* Add surface state charges. */ - pRhs[ pNode->psiEqn ] += dx * pHEdge->qf; - pRhs[ pNode->psiEqn ] += dy * pVEdge->qf; - if ( pElem->elemType == SEMICON ) { - nConc = pDevice->devState0 [pNode->nodeN]; - pConc = pDevice->devState0 [pNode->nodeP]; - pRhs[ pNode->psiEqn ] += dxdy * (pNode->netConc + pConc - nConc); - - /* Handle generation terms */ - rhsN = - dxdy * pNode->uNet; - pRhs[ pNode->nEqn ] -= rhsN; - - /* Handle dXdT continuity terms */ - if ( tranAnalysis ) { - pRhs[ pNode->nEqn ] += dxdy * pNode->dNdT; - } - } - } - } - - /* Handle neighbor and edge dependent terms */ - pNode = pElem->pTLNode; - if ( pNode->nodeType != CONTACT ) { - pRhs[ pNode->psiEqn ] -= -dyOverDx * dPsiT - dxOverDy * dPsiL; - if ( pElem->elemType == SEMICON ) { - pRhs[ pNode->nEqn ] -= dy * pTEdge->jn + dx * pLEdge->jn; - } - } - pNode = pElem->pTRNode; - if ( pNode->nodeType != CONTACT ) { - pRhs[ pNode->psiEqn ] -= dyOverDx * dPsiT - dxOverDy * dPsiR; - if ( pElem->elemType == SEMICON ) { - pRhs[ pNode->nEqn ] -= -dy * pTEdge->jn + dx * pREdge->jn; - } - } - pNode = pElem->pBRNode; - if ( pNode->nodeType != CONTACT ) { - pRhs[ pNode->psiEqn ] -= dyOverDx * dPsiB + dxOverDy * dPsiR; - if ( pElem->elemType == SEMICON ) { - pRhs[ pNode->nEqn ] -= -dy * pBEdge->jn - dx * pREdge->jn; - } - } - pNode = pElem->pBLNode; - if ( pNode->nodeType != CONTACT ) { - pRhs[ pNode->psiEqn ] -= -dyOverDx * dPsiB + dxOverDy * dPsiL; - if ( pElem->elemType == SEMICON ) { - pRhs[ pNode->nEqn ] -= dy * pBEdge->jn - dx * pLEdge->jn; - } - } - } -} - -/* - * computation of current densities, recombination rates, - * mobilities and their derivatives - */ -void - TWONcommonTerms(TWOdevice *pDevice, BOOLEAN currentOnly, - BOOLEAN tranAnalysis, TWOtranInfo *info) -{ - TWOelem *pElem; - TWOedge *pEdge; - TWOnode *pNode; - int index, eIndex; - int nextIndex; /* index of node to find next element */ - double psi1, psi2, refPsi, nC, nP1; - double dPsiN; - double bPsiN, dbPsiN, bMPsiN, dbMPsiN; - double muN, dMuN, rDx, rDy; - double psi, nConc = 0.0, pConc = 0.0; - double cnAug, cpAug; - double eSurf = 0.0; /* For channel mobilities */ - double qInt = 0.0; - TWOchannel *pCh; - - /* evaluate all node (including recombination) and edge quantities */ - for ( eIndex = 1; eIndex <= pDevice->numElems; eIndex++ ) { - pElem = pDevice->elements[ eIndex ]; - refPsi = pElem->matlInfo->refPsi; - cnAug = pElem->matlInfo->cAug[ELEC]; - cpAug = pElem->matlInfo->cAug[HOLE]; - for ( index = 0; index <= 3; index++ ) { - if ( pElem->evalNodes[ index ] ) { - pNode = pElem->pNodes[ index ]; - if ( pNode->nodeType != CONTACT ) { - psi = pDevice->dcSolution[ pNode->psiEqn ]; - if ( pElem->elemType == SEMICON ) { - nConc = pDevice->dcSolution[ pNode->nEqn ]; - pConc = pNode->nie * exp( - psi + refPsi ); - if ( Srh ) { - recomb(nConc, pConc, - pNode->tn, pNode->tp, cnAug, cpAug, pNode->nie, - &pNode->uNet, &pNode->dUdN, &pNode->dUdP); - } else { - pNode->uNet = 0.0; - pNode->dUdN = 0.0; - pNode->dUdP = 0.0; - } - } - } else { - /* a contact node */ - psi = pNode->psi; - if ( pElem->elemType == SEMICON ) { - nConc = pNode->nConc; - pConc = pNode->pConc; - } - } - - /* store info in the state tables */ - pDevice->devState0 [pNode->nodePsi] = psi; - if ( pElem->elemType == SEMICON ) { - pDevice->devState0 [pNode->nodeN] = nConc; - pDevice->devState0 [pNode->nodeP] = pConc; - if ( tranAnalysis && pNode->nodeType != CONTACT ) { - pNode->dNdT = integrate( pDevice->devStates, info, pNode->nodeN ); - } - } - } - } - for ( index = 0; index <= 3; index++ ) { - if ( pElem->evalEdges[ index ] ) { - pEdge = pElem->pEdges[ index ]; - pNode = pElem->pNodes[ index ]; - if ( pNode->nodeType != CONTACT ) { - psi1 = pDevice->dcSolution[pNode->psiEqn]; - } else { - psi1 = pNode->psi; - } - pNode = pElem->pNodes[ (index + 1) % 4 ]; - if ( pNode->nodeType != CONTACT ) { - psi2 = pDevice->dcSolution[pNode->psiEqn]; - } else { - psi2 = pNode->psi; - } - if ( index <= 1 ) { - pEdge->dPsi = psi2 - psi1; - } else { - pEdge->dPsi = psi1 - psi2; - } - pDevice->devState0 [pEdge->edgeDpsi] = pEdge->dPsi; - - if ( pElem->elemType == SEMICON ) { - /* Calculate weighted driving forces - wdfn & wdfp for the edge */ - dPsiN = pEdge->dPsi + pEdge->dCBand; - bernoulli( dPsiN, &bPsiN, &dbPsiN, - &bMPsiN, &dbMPsiN, !currentOnly ); - if ( index <= 1 ) { - nC = *(pDevice->devState0 + pElem->pNodes[ index ]->nodeN); - nP1 = *(pDevice->devState0 + pElem->pNodes[ index+1 ]->nodeN); - } else { - nC = *(pDevice->devState0 + pElem->pNodes[(index+1)%4]->nodeN); - nP1 = *(pDevice->devState0 + pElem->pNodes[ index ]->nodeN); - } - pEdge->wdfn = bPsiN * nP1 - bMPsiN * nC; - pEdge->jn = 0.0; - if ( !currentOnly ) { - pEdge->dWnDpsiP1 = dbPsiN * nP1 - dbMPsiN * nC; - pEdge->dWnDn = - bMPsiN; - pEdge->dWnDnP1 = bPsiN; - pEdge->dJnDpsiP1 = 0.0; - pEdge->dJnDn = 0.0; - pEdge->dJnDnP1 = 0.0; - } - } - } - } - } - - /* DAG: calculate mobilities for channel elems */ - if ( SurfaceMobility ) { - for ( pCh = pDevice->pChannel; - pCh != NULL; pCh = pCh->next ) { - pElem = pCh->pNElem; - switch (pCh->type) { - case 0: - eSurf = - 0.5 * (pElem->pLeftEdge->dPsi + pElem->pRightEdge->dPsi ) - * pElem->epsRel / pElem->dy; - qInt = 0.5 * pElem->pBotEdge->qf; - break; - case 1: - eSurf = - 0.5 * (pElem->pTopEdge->dPsi + pElem->pBotEdge->dPsi ) - * pElem->epsRel / pElem->dx; - qInt = 0.5 * pElem->pLeftEdge->qf; - break; - case 2: - eSurf = - 0.5 * (pElem->pLeftEdge->dPsi + pElem->pRightEdge->dPsi ) - * pElem->epsRel / pElem->dy; - qInt = 0.5 * pElem->pTopEdge->qf; - break; - case 3: - eSurf = - 0.5 * (pElem->pTopEdge->dPsi + pElem->pBotEdge->dPsi ) - * pElem->epsRel / pElem->dx; - qInt = 0.5 * pElem->pRightEdge->qf; - break; - } - eSurf += qInt; - pElem = pCh->pSeed; - nextIndex = (pCh->type + 2)%4; - while (pElem && pElem->channel == pCh->id) { - TWONmobility( pElem, eSurf ); - pElem = pElem->pElems[ nextIndex ]; - } - } /* endfor pCH != NULL */ - } /* endif SurfaceMobility */ - - /* calculate the current densities assuming mobility value depend on Ex,Ey*/ - for ( eIndex = 1; eIndex <= pDevice->numElems; eIndex++ ) { - pElem = pDevice->elements[ eIndex ]; - - rDx = 1.0 / pElem->dx; - rDy = 1.0 / pElem->dy; - for ( index = 0; index <= 3; index++ ) { - pEdge = pElem->pEdges[ index ]; - /* calculate conductive currents */ - if ( pElem->elemType == SEMICON ) { - /* get mobility for this edge */ - if ( !pElem->channel ) { - /* Calculate mobility for non-channel elements */ - muN = pElem->mun0; - dMuN = 0.0; - dPsiN = pEdge->dPsi + pEdge->dCBand; - if ( index%2 == 0 ) { - MOBfieldDep( pElem->matlInfo, ELEC, - dPsiN * rDx, &muN, &dMuN ); - } else { - MOBfieldDep( pElem->matlInfo, ELEC, - dPsiN * rDy, &muN, &dMuN ); - } - } else { - /* Retrieve previously calculated value. */ - muN = pElem->mun; - dMuN = 0.0; - } - switch ( index ) { - case 0: - muN *= pEdge->kPos * rDx; - dMuN *= pEdge->kPos * rDx * rDx; - break; - case 1: - muN *= pEdge->kNeg * rDy; - dMuN *= pEdge->kNeg * rDy * rDy; - break; - case 2: - muN *= pEdge->kNeg * rDx; - dMuN *= pEdge->kNeg * rDx * rDx; - break; - case 3: - muN *= pEdge->kPos * rDy; - dMuN *= pEdge->kPos * rDy * rDy; - break; - } - /* Now that the mobility for this edge is known, do current */ - pEdge->jn += muN * pEdge->wdfn; - if ( !currentOnly ) { - pEdge->dJnDpsiP1 += muN * pEdge->dWnDpsiP1; - pEdge->dJnDn += muN * pEdge->dWnDn; - pEdge->dJnDnP1 += muN * pEdge->dWnDnP1; - if ( MobDeriv && (!pElem->channel) ) { - pEdge->dJnDpsiP1 -= dMuN * pEdge->wdfn; - } - } - } - /* calculate displacement current only once */ - if ( pElem->evalEdges[ index ] ) { - if ( tranAnalysis ) { - if ( index == 0 || index == 2 ) { - /* horizontal edges */ - pEdge->jd = -integrate(pDevice->devStates, info, - pEdge->edgeDpsi) * rDx; - } else { - /* vertical edges */ - pEdge->jd = -integrate(pDevice->devStates, info, - pEdge->edgeDpsi) * rDy; - } - } - } - } - } -} diff --git a/src/ciderlib/twod/twopcont.c b/src/ciderlib/twod/twopcont.c deleted file mode 100644 index 6b2b81feb..000000000 --- a/src/ciderlib/twod/twopcont.c +++ /dev/null @@ -1,887 +0,0 @@ -/********** -Copyright 1991 Regents of the University of California. All rights reserved. -Author: 1987 Kartikeya Mayaram, U. C. Berkeley CAD Group -Author: 1991 David A. Gates, U. C. Berkeley CAD Group -**********/ - -#include "ngspice/ngspice.h" -#include "ngspice/numglobs.h" -#include "ngspice/numenum.h" -#include "ngspice/twomesh.h" -#include "ngspice/twodev.h" -#include "ngspice/bool.h" -#include "ngspice/spmatrix.h" -#include "twoddefs.h" -#include "twodext.h" -#include "ngspice/cidersupt.h" -#include "../../maths/misc/bernoull.h" - -/* - * Functions to setup and solve the continuity equations. - * Both continuity equations are solved. - * Separate functions are used for one continuity equation. - */ - - -/* - * setup matrix pointers to Jacobian values and - * store direct pointers with the nodes - */ - -void - TWOPjacBuild(TWOdevice *pDevice) -{ - SMPmatrix *matrix = pDevice->matrix; - TWOelem *pElem; - TWOnode *pNode; - TWOchannel *pCh; - int eIndex, nIndex; - int nextIndex; /* index of node to find next element */ - int psiEqn, pEqn; /* scratch for deref'd eqn numbers */ - int psiEqnTL = 0, pEqnTL = 0; - int psiEqnTR = 0, pEqnTR = 0; - int psiEqnBR = 0, pEqnBR = 0; - int psiEqnBL = 0, pEqnBL = 0; - int psiEqnInM = 0, psiEqnInP = 0; /* scratch for deref'd surface eqns */ - int psiEqnOxM = 0, psiEqnOxP = 0; /* M= more negative, P= more positive */ - - for ( eIndex = 1; eIndex <= pDevice->numElems; eIndex++ ) { - pElem = pDevice->elements[ eIndex ]; - - /* first the self terms */ - for ( nIndex = 0; nIndex <= 3; nIndex++ ) { - pNode = pElem->pNodes[ nIndex ]; - /* get poisson-only pointer */ - psiEqn = pNode->psiEqn; - pNode->fPsiPsi = spGetElement( matrix, psiEqn, psiEqn ); - - if ( pElem->elemType == SEMICON ) { - /* get continuity-coupling terms */ - pEqn = pNode->pEqn; - pNode->nEqn = 0; - /* pointers for additional terms */ - pNode->fPsiP = spGetElement( matrix, psiEqn, pEqn ); - pNode->fPPsi = spGetElement( matrix, pEqn, psiEqn ); - pNode->fPP = spGetElement( matrix, pEqn, pEqn ); - } else { - pEqn = 0; - } - /* save equation indices */ - switch ( nIndex ) { - case 0: /* TL Node */ - psiEqnTL = psiEqn; - pEqnTL = pEqn; - break; - case 1: /* TR Node */ - psiEqnTR = psiEqn; - pEqnTR = pEqn; - break; - case 2: /* BR Node */ - psiEqnBR = psiEqn; - pEqnBR = pEqn; - break; - case 3: /* BL Node */ - psiEqnBL = psiEqn; - pEqnBL = pEqn; - break; - default: - break; - } - } - - /* now terms to couple to adjacent nodes */ - pNode = pElem->pTLNode; - pNode->fPsiPsiiP1 = spGetElement(matrix, psiEqnTL, psiEqnTR ); - pNode->fPsiPsijP1 = spGetElement(matrix, psiEqnTL, psiEqnBL ); - if ( pElem->elemType == SEMICON ) { - /* continuity equation pointers */ - pNode->fPPsiiP1 = spGetElement( matrix, pEqnTL, psiEqnTR ); - pNode->fPPiP1 = spGetElement( matrix, pEqnTL, pEqnTR ); - pNode->fPPsijP1 = spGetElement( matrix, pEqnTL, psiEqnBL ); - pNode->fPPjP1 = spGetElement( matrix, pEqnTL, pEqnBL ); - /* Surface Mobility Model depends on diagonal node values */ - if ( MobDeriv && SurfaceMobility && pElem->channel ) { - pNode->fPPsiiP1jP1 = spGetElement( matrix, pEqnTL, psiEqnBR ); - pNode->fPPiP1jP1 = spGetElement( matrix, pEqnTL, pEqnBR ); - } - } - - pNode = pElem->pTRNode; - pNode->fPsiPsiiM1 = spGetElement(matrix, psiEqnTR, psiEqnTL ); - pNode->fPsiPsijP1 = spGetElement(matrix, psiEqnTR, psiEqnBR ); - if ( pElem->elemType == SEMICON ) { - /* continuity equation pointers */ - pNode->fPPsiiM1 = spGetElement( matrix, pEqnTR, psiEqnTL ); - pNode->fPPiM1 = spGetElement( matrix, pEqnTR, pEqnTL ); - pNode->fPPsijP1 = spGetElement( matrix, pEqnTR, psiEqnBR ); - pNode->fPPjP1 = spGetElement( matrix, pEqnTR, pEqnBR ); - /* Surface Mobility Model depends on diagonal node values */ - if ( MobDeriv && SurfaceMobility && pElem->channel ) { - pNode->fPPsiiM1jP1 = spGetElement( matrix, pEqnTR, psiEqnBL ); - pNode->fPPiM1jP1 = spGetElement( matrix, pEqnTR, pEqnBL ); - } - } - - pNode = pElem->pBRNode; - pNode->fPsiPsiiM1 = spGetElement(matrix, psiEqnBR, psiEqnBL ); - pNode->fPsiPsijM1 = spGetElement(matrix, psiEqnBR, psiEqnTR ); - if ( pElem->elemType == SEMICON ) { - /* continuity equation pointers */ - pNode->fPPsiiM1 = spGetElement( matrix, pEqnBR, psiEqnBL ); - pNode->fPPiM1 = spGetElement( matrix, pEqnBR, pEqnBL ); - pNode->fPPsijM1 = spGetElement( matrix, pEqnBR, psiEqnTR ); - pNode->fPPjM1 = spGetElement( matrix, pEqnBR, pEqnTR ); - /* Surface Mobility Model depends on diagonal node values */ - if ( MobDeriv && SurfaceMobility && pElem->channel ) { - pNode->fPPsiiM1jM1 = spGetElement( matrix, pEqnBR, psiEqnTL ); - pNode->fPPiM1jM1 = spGetElement( matrix, pEqnBR, pEqnTL ); - } - } - - pNode = pElem->pBLNode; - pNode->fPsiPsiiP1 = spGetElement(matrix, psiEqnBL, psiEqnBR ); - pNode->fPsiPsijM1 = spGetElement(matrix, psiEqnBL, psiEqnTL ); - if ( pElem->elemType == SEMICON ) { - /* continuity equation pointers */ - pNode->fPPsiiP1 = spGetElement( matrix, pEqnBL, psiEqnBR ); - pNode->fPPiP1 = spGetElement( matrix, pEqnBL, pEqnBR ); - pNode->fPPsijM1 = spGetElement( matrix, pEqnBL, psiEqnTL ); - pNode->fPPjM1 = spGetElement( matrix, pEqnBL, pEqnTL ); - /* Surface Mobility Model depends on diagonal node values */ - if ( MobDeriv && SurfaceMobility && pElem->channel ) { - pNode->fPPsiiP1jM1 = spGetElement( matrix, pEqnBL, psiEqnTR ); - pNode->fPPiP1jM1 = spGetElement( matrix, pEqnBL, pEqnTR ); - } - } - } - /* - * Add terms for surface-field of inversion-layer mobility model. - * Elements MUST be made from silicon for this to work. - * No empty elements are allowed. - * Don't need these pointers if SurfaceMobility isn't set. - */ - if ( MobDeriv && SurfaceMobility ) { - for ( pCh = pDevice->pChannel; pCh != NULL; - pCh = pCh->next ) { - pElem = pCh->pNElem; - switch (pCh->type) { - case 0: - psiEqnInM = pElem->pBLNode->psiEqn; - psiEqnInP = pElem->pBRNode->psiEqn; - psiEqnOxM = pElem->pTLNode->psiEqn; - psiEqnOxP = pElem->pTRNode->psiEqn; - break; - case 1: - psiEqnInM = pElem->pTLNode->psiEqn; - psiEqnInP = pElem->pBLNode->psiEqn; - psiEqnOxM = pElem->pTRNode->psiEqn; - psiEqnOxP = pElem->pBRNode->psiEqn; - break; - case 2: - psiEqnInM = pElem->pTLNode->psiEqn; - psiEqnInP = pElem->pTRNode->psiEqn; - psiEqnOxM = pElem->pBLNode->psiEqn; - psiEqnOxP = pElem->pBRNode->psiEqn; - break; - case 3: - psiEqnInM = pElem->pTRNode->psiEqn; - psiEqnInP = pElem->pBRNode->psiEqn; - psiEqnOxM = pElem->pTLNode->psiEqn; - psiEqnOxP = pElem->pBLNode->psiEqn; - break; - } - pElem = pCh->pSeed; - nextIndex = (pCh->type + 2)%4; - while (pElem && pElem->channel == pCh->id) { - for ( nIndex = 0; nIndex <= 3; nIndex++ ) { - pNode = pElem->pNodes[ nIndex ]; - psiEqn = pNode->psiEqn; - pEqn = pNode->pEqn; - if ( pCh->type % 2 == 0 ) { /* Vertical Slice */ - if ( nIndex == 0 || nIndex == 3 ) { /* Left Side */ - pNode->fPPsiIn = spGetElement( matrix, pEqn, psiEqnInM ); - pNode->fPPsiInP1 = spGetElement( matrix, pEqn, psiEqnInP ); - pNode->fPPsiOx = spGetElement( matrix, pEqn, psiEqnOxM ); - pNode->fPPsiOxP1 = spGetElement( matrix, pEqn, psiEqnOxP ); - } else { /* Right Side */ - pNode->fPPsiInM1 = spGetElement( matrix, pEqn, psiEqnInM ); - pNode->fPPsiIn = spGetElement( matrix, pEqn, psiEqnInP ); - pNode->fPPsiOxM1 = spGetElement( matrix, pEqn, psiEqnOxM ); - pNode->fPPsiOx = spGetElement( matrix, pEqn, psiEqnOxP ); - } - } else { /* Horizontal Slice */ - if ( nIndex == 0 || nIndex == 3 ) { /* Left (Top?) Side : bug 483 */ - pNode->fPPsiIn = spGetElement( matrix, pEqn, psiEqnInM ); - pNode->fPPsiInP1 = spGetElement( matrix, pEqn, psiEqnInP ); - pNode->fPPsiOx = spGetElement( matrix, pEqn, psiEqnOxM ); - pNode->fPPsiOxP1 = spGetElement( matrix, pEqn, psiEqnOxP ); - } else { /* Bottom Side */ - pNode->fPPsiInM1 = spGetElement( matrix, pEqn, psiEqnInM ); - pNode->fPPsiIn = spGetElement( matrix, pEqn, psiEqnInP ); - pNode->fPPsiOxM1 = spGetElement( matrix, pEqn, psiEqnOxM ); - pNode->fPPsiOx = spGetElement( matrix, pEqn, psiEqnOxP ); - } - } - } /* endfor nIndex */ - pElem = pElem->pElems[ nextIndex ]; - } /* endwhile pElem */ - } /* endfor pCh */ - } /* endif SurfaceMobility */ -} - - -/* - * The Jacobian and Rhs are loaded by the following function. - * Inputs are the transient analysis flag and the transient - * information structure - */ - -void - TWOPsysLoad(TWOdevice *pDevice, BOOLEAN tranAnalysis, TWOtranInfo *info) -{ - TWOelem *pElem; - TWOnode *pNode; - TWOedge *pHEdge, *pVEdge; - TWOedge *pTEdge, *pBEdge, *pLEdge, *pREdge; - TWOchannel *pCh; - int index, eIndex; - int nextIndex; /* index of node to find next element */ - double *pRhs = pDevice->rhs; - double dx, dy, dxdy, dyOverDx, dxOverDy; - double ds; - double dPsiT, dPsiB, dPsiL, dPsiR; - double rhsP; - double nConc, pConc; - double perTime = 0.0; - - /* first compute the currents and derivatives */ - TWOPcommonTerms( pDevice, FALSE, tranAnalysis, info ); - - /* find reciprocal timestep */ - if ( tranAnalysis ) { - perTime = info->intCoeff[0]; - } - - /* zero the rhs vector */ - for ( index = 1 ; index <= pDevice->numEqns ; index++ ) { - pRhs[ index ] = 0.0; - } - - /* zero the matrix */ - spClear( pDevice->matrix ); - - for ( eIndex = 1; eIndex <= pDevice->numElems; eIndex++ ) { - pElem = pDevice->elements[ eIndex ]; - - dx = 0.5 * pElem->dx; - dy = 0.5 * pElem->dy; - dxdy = dx * dy; - dxOverDy = 0.5 * pElem->epsRel * pElem->dxOverDy; - dyOverDx = 0.5 * pElem->epsRel * pElem->dyOverDx; - - pTEdge = pElem->pTopEdge; - pBEdge = pElem->pBotEdge; - pLEdge = pElem->pLeftEdge; - pREdge = pElem->pRightEdge; - dPsiT = pTEdge->dPsi; - dPsiB = pBEdge->dPsi; - dPsiL = pLEdge->dPsi; - dPsiR = pREdge->dPsi; - - /* load for all i,j */ - for ( index = 0; index <= 3; index++ ) { - pNode = pElem->pNodes[ index ]; - if ( pNode->nodeType != CONTACT ) { - if ( index <= 1 ) { - pHEdge = pTEdge; - } else { - pHEdge = pBEdge; - } - if ( index == 0 || index == 3 ) { - pVEdge = pLEdge; - } else { - pVEdge = pREdge; - } - /* Add surface state charges. */ - pRhs[ pNode->psiEqn ] += dx * pHEdge->qf; - pRhs[ pNode->psiEqn ] += dy * pVEdge->qf; - *(pNode->fPsiPsi) += dyOverDx + dxOverDy; - if ( pElem->elemType == SEMICON ) { - nConc = pDevice->devState0 [pNode->nodeN]; - pConc = pDevice->devState0 [pNode->nodeP]; - - *(pNode->fPsiPsi) += dxdy * nConc; - *(pNode->fPsiP) -= dxdy; - *(pNode->fPPsi) -= dy * pHEdge->dJpDpsiP1 + dx * pVEdge->dJpDpsiP1; - pRhs[ pNode->psiEqn ] += dxdy * (pNode->netConc + pConc - nConc); - - /* Handle generation terms */ - *(pNode->fPP) += dxdy * pNode->dUdP; - *(pNode->fPPsi) += dxdy * pNode->dUdN * nConc; - rhsP = dxdy * pNode->uNet; - pRhs[ pNode->pEqn ] -= rhsP; - - /* Handle dXdT continuity terms */ - if ( tranAnalysis ) { - *(pNode->fPP) += dxdy * perTime; - pRhs[ pNode->pEqn ] -= dxdy * pNode->dPdT; - } - } - } - } - - /* Handle neighbor and edge dependent terms */ - pNode = pElem->pTLNode; - if ( pNode->nodeType != CONTACT ) { - pRhs[ pNode->psiEqn ] -= -dyOverDx * dPsiT - dxOverDy * dPsiL; - *(pNode->fPsiPsiiP1) -= dyOverDx; - *(pNode->fPsiPsijP1) -= dxOverDy; - if ( pElem->elemType == SEMICON ) { - pRhs[ pNode->pEqn ] -= dy * pTEdge->jp + dx * pLEdge->jp; - *(pNode->fPP) += dy * pTEdge->dJpDp + dx * pLEdge->dJpDp; - *(pNode->fPPsiiP1) += dy * pTEdge->dJpDpsiP1; - *(pNode->fPPiP1) += dy * pTEdge->dJpDpP1; - *(pNode->fPPsijP1) += dx * pLEdge->dJpDpsiP1; - *(pNode->fPPjP1) += dx * pLEdge->dJpDpP1; - } - } - pNode = pElem->pTRNode; - if ( pNode->nodeType != CONTACT ) { - pRhs[ pNode->psiEqn ] -= dyOverDx * dPsiT - dxOverDy * dPsiR; - *(pNode->fPsiPsiiM1) -= dyOverDx; - *(pNode->fPsiPsijP1) -= dxOverDy; - if ( pElem->elemType == SEMICON ) { - pRhs[ pNode->pEqn ] -= -dy * pTEdge->jp + dx * pREdge->jp; - *(pNode->fPP) += -dy * pTEdge->dJpDpP1 + dx * pREdge->dJpDp; - *(pNode->fPPsiiM1) += dy * pTEdge->dJpDpsiP1; - *(pNode->fPPiM1) -= dy * pTEdge->dJpDp; - *(pNode->fPPsijP1) += dx * pREdge->dJpDpsiP1; - *(pNode->fPPjP1) += dx * pREdge->dJpDpP1; - } - } - pNode = pElem->pBRNode; - if ( pNode->nodeType != CONTACT ) { - pRhs[ pNode->psiEqn ] -= dyOverDx * dPsiB + dxOverDy * dPsiR; - *(pNode->fPsiPsiiM1) -= dyOverDx; - *(pNode->fPsiPsijM1) -= dxOverDy; - if ( pElem->elemType == SEMICON ) { - pRhs[ pNode->pEqn ] -= -dy * pBEdge->jp - dx * pREdge->jp; - *(pNode->fPP) += -dy * pBEdge->dJpDpP1 - dx * pREdge->dJpDpP1; - *(pNode->fPPsiiM1) += dy * pBEdge->dJpDpsiP1; - *(pNode->fPPiM1) -= dy * pBEdge->dJpDp; - *(pNode->fPPsijM1) += dx * pREdge->dJpDpsiP1; - *(pNode->fPPjM1) -= dx * pREdge->dJpDp; - } - } - pNode = pElem->pBLNode; - if ( pNode->nodeType != CONTACT ) { - pRhs[ pNode->psiEqn ] -= -dyOverDx * dPsiB + dxOverDy * dPsiL; - *(pNode->fPsiPsiiP1) -= dyOverDx; - *(pNode->fPsiPsijM1) -= dxOverDy; - if ( pElem->elemType == SEMICON ) { - pRhs[ pNode->pEqn ] -= dy * pBEdge->jp - dx * pLEdge->jp; - *(pNode->fPP) += dy * pBEdge->dJpDp - dx * pLEdge->dJpDpP1; - *(pNode->fPPsiiP1) += dy * pBEdge->dJpDpsiP1; - *(pNode->fPPiP1) += dy * pBEdge->dJpDpP1; - *(pNode->fPPsijM1) += dx * pLEdge->dJpDpsiP1; - *(pNode->fPPjM1) -= dx * pLEdge->dJpDp; - } - } - } - - /* Calculate the Inversion-Layer Mobility Dependent Terms in Jac. */ - if ( MobDeriv && SurfaceMobility ) { - for ( pCh = pDevice->pChannel; pCh != NULL; - pCh = pCh->next ) { - /* Find effective height of oxide element at interface. */ - if ( pCh->type%2 == 0 ) { /* Vertical slice */ - ds = pCh->pNElem->dy / pCh->pNElem->epsRel; - } else { /* Horizontal slice */ - ds = pCh->pNElem->dx / pCh->pNElem->epsRel; - } - pElem = pCh->pSeed; - nextIndex = (pCh->type + 2)%4; - while (pElem && pElem->channel == pCh->id) { - TWOPmobDeriv( pElem, pCh->type, ds ); - pElem = pElem->pElems[ nextIndex ]; - } - } /* endfor pCh != NULL */ - } /* endif MobDeriv and SurfaceMobility */ -} - - -/* this function used only for direct method ac analysis - Used to load only the dc Jacobian matrix. Rhs is unaffected - */ - -void - TWOPjacLoad(TWOdevice *pDevice) -{ - TWOelem *pElem; - TWOnode *pNode; - TWOedge *pHEdge, *pVEdge; - TWOedge *pTEdge, *pBEdge, *pLEdge, *pREdge; - TWOchannel *pCh; - int index, eIndex; - int nextIndex; /* index of node to find next element */ - double dx, dy, dxdy, dyOverDx, dxOverDy; - double ds; - double nConc; - - /* first compute the currents and derivatives */ - TWOPcommonTerms( pDevice, FALSE, FALSE, NULL ); - - /* zero the matrix */ - spClear( pDevice->matrix ); - - for ( eIndex = 1; eIndex <= pDevice->numElems; eIndex++ ) { - pElem = pDevice->elements[ eIndex ]; - dx = 0.5 * pElem->dx; - dy = 0.5 * pElem->dy; - dxdy = dx * dy; - dxOverDy = 0.5 * pElem->epsRel * pElem->dxOverDy; - dyOverDx = 0.5 * pElem->epsRel * pElem->dyOverDx; - - pTEdge = pElem->pTopEdge; - pBEdge = pElem->pBotEdge; - pLEdge = pElem->pLeftEdge; - pREdge = pElem->pRightEdge; - - /* load for all i,j */ - for ( index = 0; index <= 3; index++ ) { - pNode = pElem->pNodes[ index ]; - if ( pNode->nodeType != CONTACT ) { - *(pNode->fPsiPsi) += dyOverDx + dxOverDy; - if ( pElem->elemType == SEMICON ) { - if ( index <= 1 ) { - pHEdge = pTEdge; - } else { - pHEdge = pBEdge; - } - if ( index == 0 || index == 3 ) { - pVEdge = pLEdge; - } else { - pVEdge = pREdge; - } - nConc = pDevice->devState0 [pNode->nodeN]; - *(pNode->fPsiPsi) += dxdy * nConc; - *(pNode->fPsiP) -= dxdy; - *(pNode->fPPsi) -= dy * pHEdge->dJpDpsiP1 + dx * pVEdge->dJpDpsiP1; - - /* Handle generation terms */ - *(pNode->fPP) += dxdy * pNode->dUdP; - *(pNode->fPPsi) += dxdy * pNode->dUdN * nConc; - } - } - } - - /* Handle neighbor and edge dependent terms */ - pNode = pElem->pTLNode; - if ( pNode->nodeType != CONTACT ) { - *(pNode->fPsiPsiiP1) -= dyOverDx; - *(pNode->fPsiPsijP1) -= dxOverDy; - if ( pElem->elemType == SEMICON ) { - *(pNode->fPP) += dy * pTEdge->dJpDp + dx * pLEdge->dJpDp; - *(pNode->fPPsiiP1) += dy * pTEdge->dJpDpsiP1; - *(pNode->fPPiP1) += dy * pTEdge->dJpDpP1; - *(pNode->fPPsijP1) += dx * pLEdge->dJpDpsiP1; - *(pNode->fPPjP1) += dx * pLEdge->dJpDpP1; - } - } - pNode = pElem->pTRNode; - if ( pNode->nodeType != CONTACT ) { - *(pNode->fPsiPsiiM1) -= dyOverDx; - *(pNode->fPsiPsijP1) -= dxOverDy; - if ( pElem->elemType == SEMICON ) { - *(pNode->fPP) += -dy * pTEdge->dJpDpP1 + dx * pREdge->dJpDp; - *(pNode->fPPsiiM1) += dy * pTEdge->dJpDpsiP1; - *(pNode->fPPiM1) -= dy * pTEdge->dJpDp; - *(pNode->fPPsijP1) += dx * pREdge->dJpDpsiP1; - *(pNode->fPPjP1) += dx * pREdge->dJpDpP1; - } - } - pNode = pElem->pBRNode; - if ( pNode->nodeType != CONTACT ) { - *(pNode->fPsiPsiiM1) -= dyOverDx; - *(pNode->fPsiPsijM1) -= dxOverDy; - if ( pElem->elemType == SEMICON ) { - *(pNode->fPP) += -dy * pBEdge->dJpDpP1 - dx * pREdge->dJpDpP1; - *(pNode->fPPsiiM1) += dy * pBEdge->dJpDpsiP1; - *(pNode->fPPiM1) -= dy * pBEdge->dJpDp; - *(pNode->fPPsijM1) += dx * pREdge->dJpDpsiP1; - *(pNode->fPPjM1) -= dx * pREdge->dJpDp; - } - } - pNode = pElem->pBLNode; - if ( pNode->nodeType != CONTACT ) { - *(pNode->fPsiPsiiP1) -= dyOverDx; - *(pNode->fPsiPsijM1) -= dxOverDy; - if ( pElem->elemType == SEMICON ) { - *(pNode->fPP) += dy * pBEdge->dJpDp - dx * pLEdge->dJpDpP1; - *(pNode->fPPsiiP1) += dy * pBEdge->dJpDpsiP1; - *(pNode->fPPiP1) += dy * pBEdge->dJpDpP1; - *(pNode->fPPsijM1) += dx * pLEdge->dJpDpsiP1; - *(pNode->fPPjM1) -= dx * pLEdge->dJpDp; - } - } - } - - /* Calculate the Inversion-Layer Mobility Dependent Terms in Jac. */ - if ( MobDeriv && SurfaceMobility ) { - for ( pCh = pDevice->pChannel; pCh != NULL; - pCh = pCh->next ) { - /* Find effective height of oxide element at interface. */ - if ( pCh->type%2 == 0 ) { /* Vertical slice */ - ds = pCh->pNElem->dy / pCh->pNElem->epsRel; - } else { /* Horizontal slice */ - ds = pCh->pNElem->dx / pCh->pNElem->epsRel; - } - pElem = pCh->pSeed; - nextIndex = (pCh->type + 2)%4; - while (pElem && pElem->channel == pCh->id) { - TWOPmobDeriv( pElem, pCh->type, ds ); - pElem = pElem->pElems[ nextIndex ]; - } - } /* endfor pCh != NULL */ - } /* endif MobDeriv and SurfaceMobility */ -} - -/* load only the Rhs vector */ -void - TWOPrhsLoad(TWOdevice *pDevice, BOOLEAN tranAnalysis, TWOtranInfo *info) -{ - TWOelem *pElem; - TWOnode *pNode; - TWOedge *pHEdge, *pVEdge; - TWOedge *pTEdge, *pBEdge, *pLEdge, *pREdge; - int index, eIndex; - double *pRhs = pDevice->rhs; - double dx, dy, dxdy, dyOverDx, dxOverDy; - double dPsiT, dPsiB, dPsiL, dPsiR; - double rhsP; - double nConc, pConc; - double perTime; - - /* first compute the currents */ - TWOPcommonTerms( pDevice, TRUE, tranAnalysis, info ); - - /* find reciprocal timestep */ - if ( tranAnalysis ) { - perTime = info->intCoeff[0]; - } - - /* zero the rhs vector */ - for ( index = 1 ; index <= pDevice->numEqns ; index++ ) { - pRhs[ index ] = 0.0; - } - - for ( eIndex = 1; eIndex <= pDevice->numElems; eIndex++ ) { - pElem = pDevice->elements[ eIndex ]; - - dx = 0.5 * pElem->dx; - dy = 0.5 * pElem->dy; - dxdy = dx * dy; - dxOverDy = 0.5 * pElem->epsRel * pElem->dxOverDy; - dyOverDx = 0.5 * pElem->epsRel * pElem->dyOverDx; - - pTEdge = pElem->pTopEdge; - pBEdge = pElem->pBotEdge; - pLEdge = pElem->pLeftEdge; - pREdge = pElem->pRightEdge; - dPsiT = pTEdge->dPsi; - dPsiB = pBEdge->dPsi; - dPsiL = pLEdge->dPsi; - dPsiR = pREdge->dPsi; - - /* load for all i,j */ - for ( index = 0; index <= 3; index++ ) { - pNode = pElem->pNodes[ index ]; - if ( pNode->nodeType != CONTACT ) { - if ( index <= 1 ) { - pHEdge = pTEdge; - } else { - pHEdge = pBEdge; - } - if ( index == 0 || index == 3 ) { - pVEdge = pLEdge; - } else { - pVEdge = pREdge; - } - /* Add surface state charges. */ - pRhs[ pNode->psiEqn ] += dx * pHEdge->qf; - pRhs[ pNode->psiEqn ] += dy * pVEdge->qf; - if ( pElem->elemType == SEMICON ) { - nConc = pDevice->devState0 [pNode->nodeN]; - pConc = pDevice->devState0 [pNode->nodeP]; - pRhs[ pNode->psiEqn ] += dxdy * (pNode->netConc + pConc - nConc); - - /* Handle generation terms */ - rhsP = dxdy * pNode->uNet; - pRhs[ pNode->pEqn ] -= rhsP; - - /* Handle dXdT continuity terms */ - if ( tranAnalysis ) { - pRhs[ pNode->pEqn ] -= dxdy * pNode->dPdT; - } - } - } - } - - /* Handle neighbor and edge dependent terms */ - pNode = pElem->pTLNode; - if ( pNode->nodeType != CONTACT ) { - pRhs[ pNode->psiEqn ] -= -dyOverDx * dPsiT - dxOverDy * dPsiL; - if ( pElem->elemType == SEMICON ) { - pRhs[ pNode->pEqn ] -= dy * pTEdge->jp + dx * pLEdge->jp; - } - } - pNode = pElem->pTRNode; - if ( pNode->nodeType != CONTACT ) { - pRhs[ pNode->psiEqn ] -= dyOverDx * dPsiT - dxOverDy * dPsiR; - if ( pElem->elemType == SEMICON ) { - pRhs[ pNode->pEqn ] -= -dy * pTEdge->jp + dx * pREdge->jp; - } - } - pNode = pElem->pBRNode; - if ( pNode->nodeType != CONTACT ) { - pRhs[ pNode->psiEqn ] -= dyOverDx * dPsiB + dxOverDy * dPsiR; - if ( pElem->elemType == SEMICON ) { - pRhs[ pNode->pEqn ] -= -dy * pBEdge->jp - dx * pREdge->jp; - } - } - pNode = pElem->pBLNode; - if ( pNode->nodeType != CONTACT ) { - pRhs[ pNode->psiEqn ] -= -dyOverDx * dPsiB + dxOverDy * dPsiL; - if ( pElem->elemType == SEMICON ) { - pRhs[ pNode->pEqn ] -= dy * pBEdge->jp - dx * pLEdge->jp; - } - } - } -} - -/* - * computation of current densities, recombination rates, - * mobilities and their derivatives - */ -void - TWOPcommonTerms(TWOdevice *pDevice, BOOLEAN currentOnly, - BOOLEAN tranAnalysis, TWOtranInfo *info) -{ - TWOelem *pElem; - TWOedge *pEdge; - TWOnode *pNode; - int index, eIndex; - int nextIndex; /* index of node to find next element */ - double psi1, psi2, refPsi, pC, pP1; - double dPsiP; - double bPsiP, dbPsiP, bMPsiP, dbMPsiP; - double muP, dMuP, rDx, rDy; - double psi, nConc = 0.0, pConc = 0.0; - double cnAug, cpAug; - double eSurf = 0.0; /* For channel mobilities */ - double qInt = 0.0; - TWOchannel *pCh; - - /* evaluate all node (including recombination) and edge quantities */ - for ( eIndex = 1; eIndex <= pDevice->numElems; eIndex++ ) { - pElem = pDevice->elements[ eIndex ]; - refPsi = pElem->matlInfo->refPsi; - cnAug = pElem->matlInfo->cAug[ELEC]; - cpAug = pElem->matlInfo->cAug[HOLE]; - for ( index = 0; index <= 3; index++ ) { - if ( pElem->evalNodes[ index ] ) { - pNode = pElem->pNodes[ index ]; - if ( pNode->nodeType != CONTACT ) { - psi = pDevice->dcSolution[ pNode->psiEqn ]; - if ( pElem->elemType == SEMICON ) { - nConc = pNode->nie * exp( psi - refPsi ); - pConc = pDevice->dcSolution[ pNode->pEqn ]; - if ( Srh ) { - recomb(nConc, pConc, - pNode->tn, pNode->tp, cnAug, cpAug, pNode->nie, - &pNode->uNet, &pNode->dUdN, &pNode->dUdP); - } else { - pNode->uNet = 0.0; - pNode->dUdN = 0.0; - pNode->dUdP = 0.0; - } - } - } else { - /* a contact node */ - psi = pNode->psi; - if ( pElem->elemType == SEMICON ) { - nConc = pNode->nConc; - pConc = pNode->pConc; - } - } - - /* store info in the state tables */ - pDevice->devState0 [pNode->nodePsi] = psi; - if ( pElem->elemType == SEMICON ) { - pDevice->devState0 [pNode->nodeN] = nConc; - pDevice->devState0 [pNode->nodeP] = pConc; - if ( tranAnalysis && pNode->nodeType != CONTACT ) { - pNode->dNdT = integrate( pDevice->devStates, info, pNode->nodeN ); - pNode->dPdT = integrate( pDevice->devStates, info, pNode->nodeP ); - } - } - } - } - for ( index = 0; index <= 3; index++ ) { - if ( pElem->evalEdges[ index ] ) { - pEdge = pElem->pEdges[ index ]; - pNode = pElem->pNodes[ index ]; - if ( pNode->nodeType != CONTACT ) { - psi1 = pDevice->dcSolution[pNode->psiEqn]; - } else { - psi1 = pNode->psi; - } - pNode = pElem->pNodes[ (index + 1) % 4 ]; - if ( pNode->nodeType != CONTACT ) { - psi2 = pDevice->dcSolution[pNode->psiEqn]; - } else { - psi2 = pNode->psi; - } - if ( index <= 1 ) { - pEdge->dPsi = psi2 - psi1; - } else { - pEdge->dPsi = psi1 - psi2; - } - pDevice->devState0 [pEdge->edgeDpsi] = pEdge->dPsi; - - if ( pElem->elemType == SEMICON ) { - /* Calculate weighted driving forces - wdfn & wdfp for the edge */ - dPsiP = pEdge->dPsi - pEdge->dVBand; - bernoulli( dPsiP, &bPsiP, &dbPsiP, - &bMPsiP, &dbMPsiP, !currentOnly); - if ( index <= 1 ) { - pC = *(pDevice->devState0 + pElem->pNodes[ index ]->nodeP); - pP1 = *(pDevice->devState0 + pElem->pNodes[ index+1 ]->nodeP); - } else { - pC = *(pDevice->devState0 + pElem->pNodes[(index+1)%4]->nodeP); - pP1 = *(pDevice->devState0 + pElem->pNodes[ index ]->nodeP); - } - pEdge->wdfp = bPsiP * pC - bMPsiP * pP1; - pEdge->jp = 0.0; - if ( !currentOnly ) { - pEdge->dWpDpsiP1 = dbPsiP * pC - dbMPsiP * pP1; - pEdge->dWpDp = bPsiP; - pEdge->dWpDpP1 = - bMPsiP; - pEdge->dJpDpsiP1 = 0.0; - pEdge->dJpDp = 0.0; - pEdge->dJpDpP1 = 0.0; - } - } - } - } - } - - /* DAG: calculate mobilities for channel elems */ - if ( SurfaceMobility ) { - for ( pCh = pDevice->pChannel; - pCh != NULL; pCh = pCh->next ) { - pElem = pCh->pNElem; - switch (pCh->type) { - case 0: - eSurf = - 0.5 * (pElem->pLeftEdge->dPsi + pElem->pRightEdge->dPsi ) - * pElem->epsRel / pElem->dy; - qInt = 0.5 * pElem->pBotEdge->qf; - break; - case 1: - eSurf = - 0.5 * (pElem->pTopEdge->dPsi + pElem->pBotEdge->dPsi ) - * pElem->epsRel / pElem->dx; - qInt = 0.5 * pElem->pLeftEdge->qf; - break; - case 2: - eSurf = - 0.5 * (pElem->pLeftEdge->dPsi + pElem->pRightEdge->dPsi ) - * pElem->epsRel / pElem->dy; - qInt = 0.5 * pElem->pTopEdge->qf; - break; - case 3: - eSurf = - 0.5 * (pElem->pTopEdge->dPsi + pElem->pBotEdge->dPsi ) - * pElem->epsRel / pElem->dx; - qInt = 0.5 * pElem->pRightEdge->qf; - break; - } - eSurf += qInt; - pElem = pCh->pSeed; - nextIndex = (pCh->type + 2)%4; - while (pElem && pElem->channel == pCh->id) { - TWOPmobility( pElem, eSurf ); - pElem = pElem->pElems[ nextIndex ]; - } - } /* endfor pCH != NULL */ - } /* endif SurfaceMobility */ - - /* calculate the current densities assuming mobility value depend on Ex,Ey*/ - for ( eIndex = 1; eIndex <= pDevice->numElems; eIndex++ ) { - pElem = pDevice->elements[ eIndex ]; - - rDx = 1.0 / pElem->dx; - rDy = 1.0 / pElem->dy; - for ( index = 0; index <= 3; index++ ) { - pEdge = pElem->pEdges[ index ]; - /* calculate conductive currents */ - if ( pElem->elemType == SEMICON ) { - /* get mobility for this edge */ - if ( !pElem->channel ) { - /* Calculate mobility for non-channel elements */ - muP = pElem->mup0; - dMuP = 0.0; - dPsiP = pEdge->dPsi - pEdge->dVBand; - if ( index%2 == 0 ) { - MOBfieldDep( pElem->matlInfo, HOLE, - dPsiP * rDx, &muP, &dMuP ); - } else { - MOBfieldDep( pElem->matlInfo, HOLE, - dPsiP * rDy, &muP, &dMuP ); - } - } else { - /* Retrieve previously calculated value. */ - muP = pElem->mup; - dMuP = 0.0; - } - switch ( index ) { - case 0: - muP *= pEdge->kPos * rDx; - dMuP *= pEdge->kPos * rDx * rDx; - break; - case 1: - muP *= pEdge->kNeg * rDy; - dMuP *= pEdge->kNeg * rDy * rDy; - break; - case 2: - muP *= pEdge->kNeg * rDx; - dMuP *= pEdge->kNeg * rDx * rDx; - break; - case 3: - muP *= pEdge->kPos * rDy; - dMuP *= pEdge->kPos * rDy * rDy; - break; - } - /* Now that the mobility for this edge is known, do current */ - pEdge->jp += muP * pEdge->wdfp; - if ( !currentOnly ) { - pEdge->dJpDpsiP1 += muP * pEdge->dWpDpsiP1; - pEdge->dJpDp += muP * pEdge->dWpDp; - pEdge->dJpDpP1 += muP * pEdge->dWpDpP1; - if ( MobDeriv && (!pElem->channel) ) { - pEdge->dJpDpsiP1 -= dMuP * pEdge->wdfp; - } - } - } - /* calculate displacement current only once */ - if ( pElem->evalEdges[ index ] ) { - if ( tranAnalysis ) { - if ( index == 0 || index == 2 ) { - /* horizontal edges */ - pEdge->jd = -integrate(pDevice->devStates, info, - pEdge->edgeDpsi) * rDx; - } else { - /* vertical edges */ - pEdge->jd = -integrate(pDevice->devStates, info, - pEdge->edgeDpsi) * rDy; - } - } - } - } - } -} diff --git a/src/ciderlib/twod/twopoiss.c b/src/ciderlib/twod/twopoiss.c deleted file mode 100644 index 55c3d3c9b..000000000 --- a/src/ciderlib/twod/twopoiss.c +++ /dev/null @@ -1,283 +0,0 @@ -/********** -Copyright 1991 Regents of the University of California. All rights reserved. -Author: 1987 Kartikeya Mayaram, U. C. Berkeley CAD Group -Author: 1991 David A. Gates, U. C. Berkeley CAD Group -**********/ - -#include "ngspice/ngspice.h" -#include "ngspice/numglobs.h" -#include "ngspice/numenum.h" -#include "ngspice/twomesh.h" -#include "ngspice/twodev.h" -#include "ngspice/spmatrix.h" -#include "twoddefs.h" -#include "twodext.h" - - -/* functions to setup and solve the 2D poisson equation */ - -void -TWOQjacBuild(TWOdevice *pDevice) -{ - SMPmatrix *matrix = pDevice->matrix; - TWOelem *pElem; - TWOnode *pNode, *pNode1; - int eIndex, nIndex; - - /* set up matrix pointers */ - /* establish main diagonal first */ - for ( eIndex = 1; eIndex <= pDevice->numElems; eIndex++ ) { - pElem = pDevice->elements[ eIndex ]; - for ( nIndex = 0; nIndex <= 3; nIndex++ ) { - if ( pElem->evalNodes[ nIndex ] ) { - pNode = pElem->pNodes[ nIndex ]; - pNode->fPsiPsi = spGetElement( matrix, pNode->poiEqn, pNode->poiEqn ); - } - } - } - for ( eIndex = 1; eIndex <= pDevice->numElems; eIndex++ ) { - pElem = pDevice->elements[ eIndex ]; - - pNode = pElem->pTLNode; - pNode1 = pElem->pTRNode; - pNode->fPsiPsiiP1 = spGetElement(matrix, pNode->poiEqn, pNode1->poiEqn ); - pNode1 = pElem->pBLNode; - pNode->fPsiPsijP1 = spGetElement(matrix, pNode->poiEqn, pNode1->poiEqn ); - pNode = pElem->pTRNode; - pNode1 = pElem->pTLNode; - pNode->fPsiPsiiM1 = spGetElement(matrix, pNode->poiEqn, pNode1->poiEqn ); - pNode1 = pElem->pBRNode; - pNode->fPsiPsijP1 = spGetElement(matrix, pNode->poiEqn, pNode1->poiEqn ); - pNode = pElem->pBRNode; - pNode1 = pElem->pBLNode; - pNode->fPsiPsiiM1 = spGetElement(matrix, pNode->poiEqn, pNode1->poiEqn ); - pNode1 = pElem->pTRNode; - pNode->fPsiPsijM1 = spGetElement(matrix, pNode->poiEqn, pNode1->poiEqn ); - pNode = pElem->pBLNode; - pNode1 = pElem->pBRNode; - pNode->fPsiPsiiP1 = spGetElement(matrix, pNode->poiEqn, pNode1->poiEqn ); - pNode1 = pElem->pTLNode; - pNode->fPsiPsijM1 = spGetElement(matrix, pNode->poiEqn, pNode1->poiEqn ); - } - /* - for ( eIndex = 1; eIndex <= pDevice->numElems; eIndex++ ) { - pElem = pDevice->elements[ eIndex ]; - - pNode = pElem->pTLNode; - pNode->fPsiPsi = spGetElement( matrix, pNode->poiEqn, pNode->poiEqn ); - pNode1 = pElem->pTRNode; - pNode->fPsiPsiiP1 = spGetElement(matrix, pNode->poiEqn, pNode1->poiEqn ); - pNode1 = pElem->pBLNode; - pNode->fPsiPsijP1 = spGetElement(matrix, pNode->poiEqn, pNode1->poiEqn ); - pNode = pElem->pTRNode; - pNode->fPsiPsi = spGetElement( matrix, pNode->poiEqn, pNode->poiEqn ); - pNode1 = pElem->pTLNode; - pNode->fPsiPsiiM1 = spGetElement(matrix, pNode->poiEqn, pNode1->poiEqn ); - pNode1 = pElem->pBRNode; - pNode->fPsiPsijP1 = spGetElement(matrix, pNode->poiEqn, pNode1->poiEqn ); - pNode = pElem->pBRNode; - pNode->fPsiPsi = spGetElement( matrix, pNode->poiEqn, pNode->poiEqn ); - pNode1 = pElem->pBLNode; - pNode->fPsiPsiiM1 = spGetElement(matrix, pNode->poiEqn, pNode1->poiEqn ); - pNode1 = pElem->pTRNode; - pNode->fPsiPsijM1 = spGetElement(matrix, pNode->poiEqn, pNode1->poiEqn ); - pNode = pElem->pBLNode; - pNode->fPsiPsi = spGetElement( matrix, pNode->poiEqn, pNode->poiEqn ); - pNode1 = pElem->pBRNode; - pNode->fPsiPsiiP1 = spGetElement(matrix, pNode->poiEqn, pNode1->poiEqn ); - pNode1 = pElem->pTLNode; - pNode->fPsiPsijM1 = spGetElement(matrix, pNode->poiEqn, pNode1->poiEqn ); - } - */ -} - -void -TWOQsysLoad(TWOdevice *pDevice) -{ - TWOelem *pElem; - TWOnode *pNode; - TWOedge *pHEdge, *pVEdge; - int index, eIndex; - double *pRhs = pDevice->rhs; - double dyOverDx, dxOverDy, dPsiT, dPsiB, dPsiL, dPsiR; - - TWOQcommonTerms( pDevice ); - - /* zero the rhs vector */ - for ( index = 1 ; index <= pDevice->numEqns ; index++ ) { - pRhs[ index ] = 0.0; - } - - /* zero the matrix */ - spClear( pDevice->matrix ); - - for ( eIndex = 1; eIndex <= pDevice->numElems; eIndex++ ) { - pElem = pDevice->elements[ eIndex ]; - - dxOverDy = 0.5 * pElem->epsRel * pElem->dxOverDy; - dyOverDx = 0.5 * pElem->epsRel * pElem->dyOverDx; - dPsiT = pElem->pTopEdge->dPsi; - dPsiB = pElem->pBotEdge->dPsi; - dPsiL = pElem->pLeftEdge->dPsi; - dPsiR = pElem->pRightEdge->dPsi; - - /* load for all i,j */ - for ( index = 0; index <= 3; index++ ) { - pNode = pElem->pNodes[ index ]; - if ( pNode->nodeType != CONTACT ) { - *(pNode->fPsiPsi) += dyOverDx + dxOverDy; - if ( index <= 1 ) { - pHEdge = pElem->pTopEdge; - } else { - pHEdge = pElem->pBotEdge; - } - if ( index == 0 || index == 3 ) { - pVEdge = pElem->pLeftEdge; - } else { - pVEdge = pElem->pRightEdge; - } - /* add surface state charges */ - pRhs[ pNode->poiEqn ] += 0.5 * pElem->dx * pHEdge->qf; - pRhs[ pNode->poiEqn ] += 0.5 * pElem->dy * pVEdge->qf; - if ( pElem->elemType == SEMICON ) { - *(pNode->fPsiPsi) += 0.25 * pElem->dx * pElem->dy * - (pNode->nConc + pNode->pConc); - pRhs[ pNode->poiEqn ] += 0.25 * pElem->dx * pElem->dy * - (pNode->netConc + pNode->pConc - pNode->nConc); - } - } - } - - pNode = pElem->pTLNode; - pRhs[ pNode->poiEqn ] -= -dyOverDx * dPsiT - dxOverDy * dPsiL; - *(pNode->fPsiPsiiP1) -= dyOverDx; - *(pNode->fPsiPsijP1) -= dxOverDy; - - pNode = pElem->pTRNode; - pRhs[ pNode->poiEqn ] -= dyOverDx * dPsiT - dxOverDy * dPsiR; - *(pNode->fPsiPsiiM1) -= dyOverDx; - *(pNode->fPsiPsijP1) -= dxOverDy; - - pNode = pElem->pBRNode; - pRhs[ pNode->poiEqn ] -= dyOverDx * dPsiB + dxOverDy * dPsiR; - *(pNode->fPsiPsiiM1) -= dyOverDx; - *(pNode->fPsiPsijM1) -= dxOverDy; - - pNode = pElem->pBLNode; - pRhs[ pNode->poiEqn ] -= -dyOverDx * dPsiB + dxOverDy * dPsiL; - *(pNode->fPsiPsiiP1) -= dyOverDx; - *(pNode->fPsiPsijM1) -= dxOverDy; - } -} - - -void -TWOQrhsLoad(TWOdevice *pDevice) -{ - TWOelem *pElem; - TWOnode *pNode; - TWOedge *pHEdge, *pVEdge; - int index, eIndex; - double *pRhs = pDevice->rhs; - double dyOverDx, dxOverDy, dPsiT, dPsiB, dPsiL, dPsiR; - - TWOQcommonTerms( pDevice ); - - /* zero the rhs vector */ - for ( index = 1 ; index <= pDevice->numEqns ; index++ ) { - pRhs[ index ] = 0.0; - } - - for ( eIndex = 1; eIndex <= pDevice->numElems; eIndex++ ) { - pElem = pDevice->elements[ eIndex ]; - - dxOverDy = 0.5 * pElem->epsRel * pElem->dxOverDy; - dyOverDx = 0.5 * pElem->epsRel * pElem->dyOverDx; - dPsiT = pElem->pTopEdge->dPsi; - dPsiB = pElem->pBotEdge->dPsi; - dPsiL = pElem->pLeftEdge->dPsi; - dPsiR = pElem->pRightEdge->dPsi; - - /* load nodal terms */ - for ( index = 0; index <= 3; index++ ) { - pNode = pElem->pNodes[ index ]; - if ( (pNode->nodeType != CONTACT) && (pElem->elemType == SEMICON) ) { - pRhs[ pNode->poiEqn ] += 0.25 * pElem->dx * pElem->dy * - (pNode->netConc + pNode->pConc - pNode->nConc); - } - if ( index <= 1 ) { - pHEdge = pElem->pTopEdge; - } else { - pHEdge = pElem->pBotEdge; - } - if ( index == 0 || index == 3 ) { - pVEdge = pElem->pLeftEdge; - } else { - pVEdge = pElem->pRightEdge; - } - /* add surface state charges */ - pRhs[ pNode->poiEqn ] += 0.5 * pElem->dx * pHEdge->qf; - pRhs[ pNode->poiEqn ] += 0.5 * pElem->dy * pVEdge->qf; - } - - /* load edge terms */ - pNode = pElem->pTLNode; - pRhs[ pNode->poiEqn ] -= -dyOverDx * dPsiT - dxOverDy * dPsiL; - - pNode = pElem->pTRNode; - pRhs[ pNode->poiEqn ] -= dyOverDx * dPsiT - dxOverDy * dPsiR; - - pNode = pElem->pBRNode; - pRhs[ pNode->poiEqn ] -= dyOverDx * dPsiB + dxOverDy * dPsiR; - - pNode = pElem->pBLNode; - pRhs[ pNode->poiEqn ] -= -dyOverDx * dPsiB + dxOverDy * dPsiL; - } -} - -void -TWOQcommonTerms(TWOdevice *pDevice) -{ - TWOelem *pElem; - TWOedge *pEdge; - TWOnode *pNode; - int index, eIndex; - double psi1, psi2, refPsi; - - for ( eIndex = 1; eIndex <= pDevice->numElems; eIndex++ ) { - pElem = pDevice->elements[ eIndex ]; - refPsi = pElem->matlInfo->refPsi; - for ( index = 0; index <= 3; index++ ) { - if ( pElem->evalNodes[ index ] ) { - pNode = pElem->pNodes[ index ]; - if ( pNode->nodeType != CONTACT ) { - pNode->psi = pDevice->dcSolution[ pNode->poiEqn ]; - if ( pElem->elemType == SEMICON ) { - pNode->nConc = pNode->nie * exp( pNode->psi - refPsi ); - pNode->pConc = pNode->nie * exp( - pNode->psi + refPsi ); - } - } - } - if ( pElem->evalEdges[ index ] ) { - pEdge = pElem->pEdges[ index ]; - pNode = pElem->pNodes[ index ]; - if ( pNode->nodeType != CONTACT ) { - psi1 = pDevice->dcSolution[pNode->poiEqn]; - } else { - psi1 = pNode->psi; - } - pNode = pElem->pNodes[ (index + 1) % 4 ]; - if ( pNode->nodeType != CONTACT ) { - psi2 = pDevice->dcSolution[pNode->poiEqn]; - } else { - psi2 = pNode->psi; - } - if ( index <= 1 ) { - pEdge->dPsi = psi2 - psi1; - } else { - pEdge->dPsi = psi1 - psi2; - } - } - } - } -} diff --git a/src/ciderlib/twod/twoprint.c b/src/ciderlib/twod/twoprint.c deleted file mode 100644 index 9b0f9a2dd..000000000 --- a/src/ciderlib/twod/twoprint.c +++ /dev/null @@ -1,595 +0,0 @@ -/********** -Copyright 1992 Regents of the University of California. All rights reserved. -Author: 1987 Kartikeya Mayaram, U. C. Berkeley CAD Group -Author: 1992 David A. Gates, U. C. Berkeley CAD Group -**********/ - -#include "ngspice/ngspice.h" -#include "ngspice/numglobs.h" -#include "ngspice/numconst.h" -#include "ngspice/numenum.h" -#include "ngspice/twomesh.h" -#include "ngspice/twodev.h" -#include "ngspice/carddefs.h" -#include "ngspice/spmatrix.h" -#include "ngspice/bool.h" -#include "twoddefs.h" -#include "twodext.h" - -#include - - -void -TWOprnSolution(FILE *file, TWOdevice *pDevice, OUTPcard *output, BOOLEAN asciiSave, char *extra) -{ - int index, xIndex, yIndex; - int numVars = 0; - TWOnode ***nodeArray = NULL; - TWOnode *pNode; - TWOmaterial *info; - double data[50]; - double ex, ey, refPsi = 0.0, eGap, dGap; - double mun, mup; - double jcx, jdx, jnx, jpx, jtx; - double jcy, jdy, jny, jpy, jty; - double *xScale = pDevice->xScale; - double *yScale = pDevice->yScale; - int ii; - int point_number = 0; - - if (output->OUTPnumVars == -1) { - /* First pass. Need to count number of variables in output. */ - numVars += 2; /* For the X & Y scales */ - if (output->OUTPdoping) { - numVars++; - } - if (output->OUTPpsi) { - numVars++; - } - if (output->OUTPequPsi) { - numVars++; - } - if (output->OUTPvacPsi) { - numVars++; - } - if (output->OUTPnConc) { - numVars++; - } - if (output->OUTPpConc) { - numVars++; - } - if (output->OUTPphin) { - numVars++; - } - if (output->OUTPphip) { - numVars++; - } - if (output->OUTPphic) { - numVars++; - } - if (output->OUTPphiv) { - numVars++; - } - if (output->OUTPeField) { - numVars += 2; - } - if (output->OUTPjc) { - numVars += 2; - } - if (output->OUTPjd) { - numVars += 2; - } - if (output->OUTPjn) { - numVars += 2; - } - if (output->OUTPjp) { - numVars += 2; - } - if (output->OUTPjt) { - numVars += 2; - } - if (output->OUTPuNet) { - numVars++; - } - if (output->OUTPmun) { - numVars++; - } - if (output->OUTPmup) { - numVars++; - } - output->OUTPnumVars = numVars; - } - /* generate the work array for printing node info */ - XCALLOC(nodeArray, TWOnode **, 1 + pDevice->numXNodes); - for (xIndex = 1; xIndex <= pDevice->numXNodes; xIndex++) { - XCALLOC(nodeArray[xIndex], TWOnode *, 1 + pDevice->numYNodes); - } - - /* store the nodes in this work array and print out later */ - for (xIndex = 1; xIndex < pDevice->numXNodes; xIndex++) { - for (yIndex = 1; yIndex < pDevice->numYNodes; yIndex++) { - TWOelem *pElem = pDevice->elemArray[xIndex][yIndex]; - if (pElem != NULL) { - if (refPsi == 0.0 && pElem->matlInfo->type == SEMICON) { - refPsi = pElem->matlInfo->refPsi; - } - for (index = 0; index < 4; index++) { - if (pElem->evalNodes[index]) { - pNode = pElem->pNodes[index]; - nodeArray[pNode->nodeI][pNode->nodeJ] = pNode; - } - } - } - } - } - - /* Initialize rawfile */ - numVars = output->OUTPnumVars; - if (extra != NULL) { - fprintf(file, "Title: Device %s (%s) internal state\n", pDevice->name, extra); - } else { - fprintf(file, "Title: Device %s internal state\n", pDevice->name); - } - fprintf(file, "Plotname: Device Cross Section\n"); - fprintf(file, "Flags: real\n"); - fprintf(file, "Command: deftype p xs cross\n"); - fprintf(file, "Command: deftype v distance m\n"); - fprintf(file, "Command: deftype v concentration cm^-3\n"); - fprintf(file, "Command: deftype v electric_field V/cm\n"); - fprintf(file, "Command: deftype v current_density A/cm^2\n"); - fprintf(file, "Command: deftype v concentration/time cm^-3/s\n"); - fprintf(file, "Command: deftype v mobility cm^2/Vs\n"); - fprintf(file, "No. Variables: %d\n", numVars); - fprintf(file, "No. Points: %d\n", - pDevice->numXNodes * pDevice->numYNodes); - fprintf(file, "Dimensions: %d,%d\n", - pDevice->numXNodes, pDevice->numYNodes); - numVars = 0; - fprintf(file, "Variables:\n"); - fprintf(file, "\t%d y distance\n", numVars++); - fprintf(file, "\t%d x distance\n", numVars++); - if (output->OUTPpsi) { - fprintf(file, "\t%d psi voltage\n", numVars++); - } - if (output->OUTPequPsi) { - fprintf(file, "\t%d equ.psi voltage\n", numVars++); - } - if (output->OUTPvacPsi) { - fprintf(file, "\t%d vac.psi voltage\n", numVars++); - } - if (output->OUTPphin) { - fprintf(file, "\t%d phin voltage\n", numVars++); - } - if (output->OUTPphip) { - fprintf(file, "\t%d phip voltage\n", numVars++); - } - if (output->OUTPphic) { - fprintf(file, "\t%d phic voltage\n", numVars++); - } - if (output->OUTPphiv) { - fprintf(file, "\t%d phiv voltage\n", numVars++); - } - if (output->OUTPdoping) { - fprintf(file, "\t%d dop concentration\n", numVars++); - } - if (output->OUTPnConc) { - fprintf(file, "\t%d n concentration\n", numVars++); - } - if (output->OUTPpConc) { - fprintf(file, "\t%d p concentration\n", numVars++); - } - if (output->OUTPeField) { - fprintf(file, "\t%d ex electric_field\n", numVars++); - fprintf(file, "\t%d ey electric_field\n", numVars++); - } - if (output->OUTPjc) { - fprintf(file, "\t%d jcx current_density\n", numVars++); - fprintf(file, "\t%d jcy current_density\n", numVars++); - } - if (output->OUTPjd) { - fprintf(file, "\t%d jdx current_density\n", numVars++); - fprintf(file, "\t%d jdy current_density\n", numVars++); - } - if (output->OUTPjn) { - fprintf(file, "\t%d jnx current_density\n", numVars++); - fprintf(file, "\t%d jny current_density\n", numVars++); - } - if (output->OUTPjp) { - fprintf(file, "\t%d jpx current_density\n", numVars++); - fprintf(file, "\t%d jpy current_density\n", numVars++); - } - if (output->OUTPjt) { - fprintf(file, "\t%d jtx current_density\n", numVars++); - fprintf(file, "\t%d jty current_density\n", numVars++); - } - if (output->OUTPuNet) { - fprintf(file, "\t%d unet concentration/time\n", numVars++); - } - if (output->OUTPmun) { - fprintf(file, "\t%d mun mobility\n", numVars++); - } - if (output->OUTPmup) { - fprintf(file, "\t%d mup mobility\n", numVars++); - } - if (asciiSave) { - fprintf(file, "Values:\n"); - } else { - fprintf(file, "Binary:\n"); - } - - for (xIndex = 1; xIndex <= pDevice->numXNodes; xIndex++) { - for (yIndex = 1; yIndex <= pDevice->numYNodes; yIndex++) { - pNode = nodeArray[xIndex][yIndex]; - if (pNode != NULL) { - TWOelem *pElem = NULL; - /* Find the element to which this node belongs. */ - for (index = 0; index < 4; index++) { - pElem = pNode->pElems[index]; - if (pElem != NULL && pElem->evalNodes[(index + 2) % 4]) { - break; - } - } - nodeFields(pElem, pNode, &ex, &ey); - nodeCurrents(pElem, pNode, &mun, &mup, - &jnx, &jny, &jpx, &jpy, &jdx, &jdy); - jcx = jnx + jpx; - jcy = jny + jpy; - jtx = jcx + jdx; - jty = jcy + jdy; - - info = pElem->matlInfo; - eGap = pNode->eg * VNorm; - dGap = 0.5 * (info->eg0 - eGap); - - /* Now fill in the data array */ - numVars = 0; - data[numVars++] = yScale[yIndex] * 1e-2; - data[numVars++] = xScale[xIndex] * 1e-2; - if (output->OUTPpsi) { - data[numVars++] = (pNode->psi - refPsi) * VNorm; - } - if (output->OUTPequPsi) { - data[numVars++] = (pNode->psi0 - refPsi) * VNorm; - } - if (output->OUTPvacPsi) { - data[numVars++] = pNode->psi * VNorm; - } - if (output->OUTPphin) { - if (info->type != INSULATOR) { - data[numVars++] = (pNode->psi - refPsi - - log(pNode->nConc / pNode->nie)) * VNorm; - } else { - data[numVars++] = 0.0; - } - } - if (output->OUTPphip) { - if (info->type != INSULATOR) { - data[numVars++] = (pNode->psi - refPsi - + log(pNode->pConc / pNode->nie)) * VNorm; - } else { - data[numVars++] = 0.0; - } - } - if (output->OUTPphic) { - data[numVars++] = (pNode->psi + pNode->eaff) * VNorm + dGap; - } - if (output->OUTPphiv) { - data[numVars++] = (pNode->psi + pNode->eaff) * VNorm + dGap + eGap; - } - if (output->OUTPdoping) { - data[numVars++] = pNode->netConc * NNorm; - } - if (output->OUTPnConc) { - data[numVars++] = pNode->nConc * NNorm; - } - if (output->OUTPpConc) { - data[numVars++] = pNode->pConc * NNorm; - } - if (output->OUTPeField) { - data[numVars++] = ex * ENorm; - data[numVars++] = ey * ENorm; - } - if (output->OUTPjc) { - data[numVars++] = jcx * JNorm; - data[numVars++] = jcy * JNorm; - } - if (output->OUTPjd) { - data[numVars++] = jdx * JNorm; - data[numVars++] = jdy * JNorm; - } - if (output->OUTPjn) { - data[numVars++] = jnx * JNorm; - data[numVars++] = jny * JNorm; - } - if (output->OUTPjp) { - data[numVars++] = jpx * JNorm; - data[numVars++] = jpy * JNorm; - } - if (output->OUTPjt) { - data[numVars++] = jtx * JNorm; - data[numVars++] = jty * JNorm; - } - if (output->OUTPuNet) { - data[numVars++] = pNode->uNet * NNorm / TNorm; - } - if (output->OUTPmun) { - data[numVars++] = mun; - } - if (output->OUTPmup) { - data[numVars++] = mup; - } - if (asciiSave) { - for (ii = 0; ii < numVars; ii++) { - if (ii == 0) { - fprintf(file, "%d", point_number); - point_number++; - } - fprintf(file, "\t%e\n", data[ii]); - } - } else { - fwrite(data, sizeof(double), (size_t) numVars, file); - } - } else { - for (index = 0; index < output->OUTPnumVars; index++) { - data[index] = 0.0; - } - data[0] = yScale[yIndex] * 1e-2; - data[1] = xScale[xIndex] * 1e-2; - if (asciiSave) { - for (ii = 0; ii < numVars; ii++) { - if (ii == 0) { - fprintf(file, "%d", point_number); - point_number++; - } - fprintf(file, "\t%e\n", data[ii]); - } - } else { - fwrite(data, sizeof(double), (size_t) numVars, file); - } - } - } - } - /* Delete work array. */ - for (xIndex = 1; xIndex <= pDevice->numXNodes; xIndex++) { - FREE(nodeArray[xIndex]); - } - FREE(nodeArray); -} - -/* XXX This is what the SPARSE element structure looks like. - * We can't take it from its definition because the include - * file redefines all sorts of things. Note that we are - * violating data encapsulation to find out the size of this - * thing. - */ -struct MatrixElement -{ spREAL Real; - spREAL Imag; - int Row; - int Col; - struct MatrixElement *NextInRow; - struct MatrixElement *NextInCol; -}; - -void -TWOmemStats(FILE *file, TWOdevice *pDevice) -{ - const char memFormat[] = "%-20s" "%10d" "%10" PRIuPTR "\n"; -/* static const char sumFormat[] = "%20s %-10d\n"; */ - int size; - size_t memory; - TWOmaterial *pMaterial; - TWOcontact *pContact; - TWOchannel *pChannel; - int numContactNodes; - - if (!pDevice) { return; } - fprintf(file, "----------------------------------------\n"); - fprintf(file, "Device %s Memory Usage:\n", pDevice->name ); - fprintf(file, "Item Count Bytes\n"); - fprintf(file, "----------------------------------------\n"); - - size = 1; - memory = (size_t) size * sizeof(TWOdevice); - fprintf( file, memFormat, "Device", size, memory ); - size = pDevice->numElems; - memory = (size_t) size * sizeof(TWOelem); - fprintf( file, memFormat, "Elements", size, memory ); - size = pDevice->numNodes; - memory = (size_t) size * sizeof(TWOnode); - fprintf( file, memFormat, "Nodes", size, memory ); - size = pDevice->numEdges; - memory = (size_t) size * sizeof(TWOedge); - fprintf( file, memFormat, "Edges", size, memory ); - - size = pDevice->numXNodes; - memory = (size_t) size * sizeof(TWOelem **); - size = (pDevice->numXNodes-1) * pDevice->numYNodes; - memory += (size_t) size * sizeof(TWOelem *); - size = pDevice->numElems + 1; - memory += (size_t) size * sizeof(TWOelem *); - size = pDevice->numXNodes + pDevice->numYNodes; - memory += (size_t) size * sizeof(double); - size = 0; - for (pMaterial = pDevice->pMaterials; pMaterial; pMaterial = pMaterial->next) - size++; - memory += (size_t) size * sizeof(TWOmaterial); - size = numContactNodes = 0; - for (pContact = pDevice->pFirstContact; pContact; pContact = pContact->next) { - numContactNodes += pContact->numNodes; - size++; - } - memory += (size_t) size * sizeof(TWOcontact); - size = numContactNodes; - memory += (size_t) size * sizeof(TWOnode *); - size = 0; - for (pChannel = pDevice->pChannel; pChannel; pChannel = pChannel->next) - size++; - memory += (size_t) size * sizeof(TWOchannel); - fprintf(file, "%-20s%10s%10" PRIuPTR "\n", "Misc Mesh", "n/a", memory); - - size = pDevice->numOrigEquil; - memory = (size_t) size * sizeof(struct MatrixElement); - fprintf( file, memFormat, "Equil Orig NZ", size, memory ); - size = pDevice->numFillEquil; - memory = (size_t) size * sizeof(struct MatrixElement); - fprintf( file, memFormat, "Equil Fill NZ", size, memory ); - size = pDevice->numOrigEquil + pDevice->numFillEquil; - memory = (size_t) size * sizeof(struct MatrixElement); - fprintf( file, memFormat, "Equil Tot NZ", size, memory ); - size = pDevice->dimEquil; - memory = (size_t) size * 4 * sizeof(double); - fprintf( file, memFormat, "Equil Vectors", size, memory ); - - size = pDevice->numOrigBias; - memory = (size_t) size * sizeof(struct MatrixElement); - fprintf( file, memFormat, "Bias Orig NZ", size, memory ); - size = pDevice->numFillBias; - memory = (size_t) size * sizeof(struct MatrixElement); - fprintf( file, memFormat, "Bias Fill NZ", size, memory ); - size = pDevice->numOrigBias + pDevice->numFillBias; - memory = (size_t) size * sizeof(struct MatrixElement); - fprintf( file, memFormat, "Bias Tot NZ", size, memory ); - size = pDevice->dimBias; - memory = (size_t) size * 5 * sizeof(double); - fprintf( file, memFormat, "Bias Vectors", size, memory ); - - size = pDevice->numEdges * TWOnumEdgeStates + - pDevice->numNodes * TWOnumNodeStates; - memory = (size_t) size * sizeof(double); - fprintf( file, memFormat, "State Vector", size, memory ); -} - -void -TWOcpuStats(FILE *file, TWOdevice *pDevice) -{ - static const char cpuFormat[] = "%-20s%10g%10g%10g%10g%10g\n"; - TWOstats *pStats = NULL; - double total; - int iTotal; - - if (!pDevice) { return; } - pStats = pDevice->pStats; - fprintf(file, - "----------------------------------------------------------------------\n"); - fprintf(file, - "Device %s Time Usage:\n", pDevice->name); - fprintf(file, - "Item SETUP DC TRAN AC TOTAL\n"); - fprintf(file, - "----------------------------------------------------------------------\n"); - - total = pStats->setupTime[STAT_SETUP] + - pStats->setupTime[STAT_DC] + - pStats->setupTime[STAT_TRAN] + - pStats->setupTime[STAT_AC]; - fprintf(file, cpuFormat, "Setup Time", - pStats->setupTime[STAT_SETUP], - pStats->setupTime[STAT_DC], - pStats->setupTime[STAT_TRAN], - pStats->setupTime[STAT_AC], - total); - - total = pStats->loadTime[STAT_SETUP] + - pStats->loadTime[STAT_DC] + - pStats->loadTime[STAT_TRAN] + - pStats->loadTime[STAT_AC]; - fprintf(file, cpuFormat, "Load Time", - pStats->loadTime[STAT_SETUP], - pStats->loadTime[STAT_DC], - pStats->loadTime[STAT_TRAN], - pStats->loadTime[STAT_AC], - total); - - total = pStats->orderTime[STAT_SETUP] + - pStats->orderTime[STAT_DC] + - pStats->orderTime[STAT_TRAN] + - pStats->orderTime[STAT_AC]; - fprintf(file, cpuFormat, "Order Time", - pStats->orderTime[STAT_SETUP], - pStats->orderTime[STAT_DC], - pStats->orderTime[STAT_TRAN], - pStats->orderTime[STAT_AC], - total); - - total = pStats->factorTime[STAT_SETUP] + - pStats->factorTime[STAT_DC] + - pStats->factorTime[STAT_TRAN] + - pStats->factorTime[STAT_AC]; - fprintf(file, cpuFormat, "Factor Time", - pStats->factorTime[STAT_SETUP], - pStats->factorTime[STAT_DC], - pStats->factorTime[STAT_TRAN], - pStats->factorTime[STAT_AC], - total); - - total = pStats->solveTime[STAT_SETUP] + - pStats->solveTime[STAT_DC] + - pStats->solveTime[STAT_TRAN] + - pStats->solveTime[STAT_AC]; - fprintf(file, cpuFormat, "Solve Time", - pStats->solveTime[STAT_SETUP], - pStats->solveTime[STAT_DC], - pStats->solveTime[STAT_TRAN], - pStats->solveTime[STAT_AC], - total); - - total = pStats->updateTime[STAT_SETUP] + - pStats->updateTime[STAT_DC] + - pStats->updateTime[STAT_TRAN] + - pStats->updateTime[STAT_AC]; - fprintf(file, cpuFormat, "Update Time", - pStats->updateTime[STAT_SETUP], - pStats->updateTime[STAT_DC], - pStats->updateTime[STAT_TRAN], - pStats->updateTime[STAT_AC], - total); - - total = pStats->checkTime[STAT_SETUP] + - pStats->checkTime[STAT_DC] + - pStats->checkTime[STAT_TRAN] + - pStats->checkTime[STAT_AC]; - fprintf(file, cpuFormat, "Check Time", - pStats->checkTime[STAT_SETUP], - pStats->checkTime[STAT_DC], - pStats->checkTime[STAT_TRAN], - pStats->checkTime[STAT_AC], - total); - - total = pStats->setupTime[STAT_SETUP] + - pStats->setupTime[STAT_DC] + - pStats->setupTime[STAT_TRAN] + - pStats->setupTime[STAT_AC]; - fprintf(file, cpuFormat, "Misc Time", - pStats->miscTime[STAT_SETUP], - pStats->miscTime[STAT_DC], - pStats->miscTime[STAT_TRAN], - pStats->miscTime[STAT_AC], - total); - - fprintf(file, "%-40s%10g%10s%10g\n", "LTE Time", - pStats->lteTime, - "", pStats->lteTime); - - total = pStats->totalTime[STAT_SETUP] + - pStats->totalTime[STAT_DC] + - pStats->totalTime[STAT_TRAN] + - pStats->totalTime[STAT_AC]; - fprintf(file, cpuFormat, "Total Time", - pStats->totalTime[STAT_SETUP], - pStats->totalTime[STAT_DC], - pStats->totalTime[STAT_TRAN], - pStats->totalTime[STAT_AC], - total); - - iTotal = pStats->numIters[STAT_SETUP] + - pStats->numIters[STAT_DC] + - pStats->numIters[STAT_TRAN] + - pStats->numIters[STAT_AC]; - fprintf(file, "%-20s%10d%10d%10d%10d%10d\n", "Iterations", - pStats->numIters[STAT_SETUP], - pStats->numIters[STAT_DC], - pStats->numIters[STAT_TRAN], - pStats->numIters[STAT_AC], - iTotal); -} diff --git a/src/ciderlib/twod/twoproj.c b/src/ciderlib/twod/twoproj.c deleted file mode 100644 index a2a9c7c1a..000000000 --- a/src/ciderlib/twod/twoproj.c +++ /dev/null @@ -1,679 +0,0 @@ -/********** -Copyright 1991 Regents of the University of California. All rights reserved. -Author: 1987 Kartikeya Mayaram, U. C. Berkeley CAD Group -Author: 1991 David A. Gates, U. C. Berkeley CAD Group -**********/ - -/* - * Functions for projecting the next solution point for use with the modified - * two-level Newton scheme - */ - -#include "ngspice/ngspice.h" -#include "ngspice/numglobs.h" -#include "ngspice/numenum.h" -#include "ngspice/twomesh.h" -#include "ngspice/twodev.h" -#include "ngspice/bool.h" -#include "ngspice/spmatrix.h" -#include "twoddefs.h" -#include "twodext.h" -#include "ngspice/cidersupt.h" - - -/* Forward Declarations */ - - -void NUMD2project(TWOdevice *pDevice, double delV) -{ - TWOnode *pNode; - TWOelem *pElem; - int index, eIndex, numContactNodes; - TWOcontact *pContact = pDevice->pLastContact; - double *incVpn, *solution = pDevice->dcSolution; - double delPsi, delN, delP, newN, newP; - - delV = -delV / VNorm; - /* update the boundary condition for the last contact */ - numContactNodes = pContact->numNodes; - for ( index = 0; index < numContactNodes; index++ ) { - pNode = pContact->pNodes[ index ]; - pNode->psi += delV; - } - - /* - * store the new rhs for computing the incremental quantities - * with the second to last node. solve the system of equations - */ - - if ( ABS(delV) < MIN_DELV ) { - TWOstoreInitialGuess( pDevice ); - return; - } - incVpn = pDevice->dcDeltaSolution; - storeNewRhs( pDevice, pContact ); - spSolve( pDevice->matrix, pDevice->rhs, incVpn, NULL, NULL ); - - for ( eIndex = 1; eIndex <= pDevice->numElems; eIndex++ ) { - pElem = pDevice->elements[ eIndex ]; - for ( index = 0; index <= 3; index++ ) { - if ( pElem->evalNodes[ index ] ) { - pNode = pElem->pNodes[ index ]; - if ( pNode->nodeType != CONTACT ) { - delPsi = incVpn[ pNode->psiEqn ] * delV; - solution[ pNode->psiEqn ] = pNode->psi + delPsi; - if ( pElem->elemType == SEMICON - && (!OneCarrier || (OneCarrier == N_TYPE)) ) { - delN = incVpn[ pNode->nEqn ] * delV; - newN = pNode->nConc + delN; - if ( newN <= 0.0 ) { - solution[ pNode->nEqn ] = guessNewConc( pNode->nConc, delN ); - } - else { - solution[ pNode->nEqn ] = newN; - } - } - if ( pElem->elemType == SEMICON - && (!OneCarrier || (OneCarrier == P_TYPE)) ) { - delP = incVpn[ pNode->pEqn ] * delV; - newP = pNode->pConc + delP; - if ( newP <= 0.0 ) { - solution[ pNode->pEqn ] = guessNewConc( pNode->pConc, delP ); - } - else { - solution[ pNode->pEqn ] = newP; - } - } - } - } - } - } -} - - -void NBJT2project(TWOdevice *pDevice, double delVce, double delVbe) -{ - TWOnode *pNode; - TWOelem *pElem; - int index, eIndex, numContactNodes; - TWOcontact *pColContact = pDevice->pFirstContact; - TWOcontact *pBaseContact = pDevice->pFirstContact->next; - double *incVce, *incVbe, *solution = pDevice->dcSolution; - double delPsi, delN, delP, newN, newP; - double nConc, pConc; - - /* Normalize the voltages for calculations. */ - if ( delVce != 0.0 ) { - delVce = delVce / VNorm; - numContactNodes = pColContact->numNodes; - for ( index = 0; index < numContactNodes; index++ ) { - pNode = pColContact->pNodes[ index ]; - pNode->psi += delVce; - } - } - if ( delVbe != 0.0 ) { - delVbe = delVbe / VNorm; - numContactNodes = pBaseContact->numNodes; - for ( index = 0; index < numContactNodes; index++ ) { - pNode = pBaseContact->pNodes[ index ]; - pNode->psi += delVbe; - } - } - - /* - * store the new rhs for computing the incremental quantities - * incVce (dcDeltaSolution) and incVbe (copiedSolution) are used to - * store the incremental quantities associated with Vce and Vbe - */ - - /* set incVce = dcDeltaSolution; incVbe = copiedSolution */ - - if ( ABS( delVce ) > MIN_DELV ) { - incVce = pDevice->dcDeltaSolution; - storeNewRhs( pDevice, pColContact ); - spSolve( pDevice->matrix, pDevice->rhs, incVce, NULL, NULL); - - for ( eIndex = 1; eIndex <= pDevice->numElems; eIndex++ ) { - pElem = pDevice->elements[ eIndex ]; - for ( index = 0; index <= 3; index++ ) { - if ( pElem->evalNodes[ index ] ) { - pNode = pElem->pNodes[ index ]; - if ( pNode->nodeType != CONTACT ) { - delPsi = incVce[ pNode->psiEqn ] * delVce; - solution[ pNode->psiEqn ] = pNode->psi + delPsi; - if ( pElem->elemType == SEMICON - && (!OneCarrier || (OneCarrier == N_TYPE)) ) { - delN = incVce[ pNode->nEqn ] * delVce; - newN = pNode->nConc + delN; - if ( newN <= 0.0 ) { - solution[ pNode->nEqn ] = guessNewConc( pNode->nConc, delN ); - } - else { - solution[ pNode->nEqn ] = newN; - } - } - if ( pElem->elemType == SEMICON - && (!OneCarrier | (OneCarrier == P_TYPE)) ) { - delP = incVce[ pNode->pEqn ] * delVce; - newP = pNode->pConc + delP; - if ( newP <= 0.0 ) { - solution[ pNode->pEqn ] = guessNewConc( pNode->pConc, delP ); - } - else { - solution[ pNode->pEqn ] = newP; - } - } - } - } - } - } - } - else { - TWOstoreInitialGuess( pDevice ); - } - - if ( ABS( delVbe ) > MIN_DELV ) { - incVbe = pDevice->copiedSolution; - storeNewRhs( pDevice, pBaseContact ); - spSolve( pDevice->matrix, pDevice->rhs, incVbe, NULL, NULL); - - for ( eIndex = 1; eIndex <= pDevice->numElems; eIndex++ ) { - pElem = pDevice->elements[ eIndex ]; - for ( index = 0; index <= 3; index++ ) { - if ( pElem->evalNodes[ index ] ) { - pNode = pElem->pNodes[ index ]; - if ( pNode->nodeType != CONTACT ) { - delPsi = incVbe[ pNode->psiEqn ] * delVbe; - solution[ pNode->psiEqn ] += delPsi; - if ( pElem->elemType == SEMICON - && (!OneCarrier || (OneCarrier == N_TYPE)) ) { - delN = incVbe[ pNode->nEqn ] * delVbe; - nConc = solution[ pNode->nEqn ]; - newN = nConc + delN; - if ( newN <= 0.0 ) { - solution[ pNode->nEqn ] = guessNewConc( nConc, delN ); - } - else { - solution[ pNode->nEqn ] = newN; - } - } - if ( pElem->elemType == SEMICON - && (!OneCarrier || (OneCarrier == P_TYPE)) ) { - delP = incVbe[ pNode->pEqn ] * delVbe; - pConc = solution[ pNode->pEqn ]; - newP = pConc + delP; - if ( newP <= 0.0 ) { - solution[ pNode->pEqn ] = guessNewConc( pConc, delP ); - } - else { - solution[ pNode->pEqn ] = newP; - } - } - } - } - } - } - } -} - - -void NUMOSproject(TWOdevice *pDevice, double delVdb, double delVsb, - double delVgb) -{ - TWOnode *pNode; - TWOelem *pElem; - int index, eIndex, numContactNodes; - TWOcontact *pDContact = pDevice->pFirstContact; - TWOcontact *pGContact = pDevice->pFirstContact->next; - TWOcontact *pSContact = pDevice->pFirstContact->next->next; - double *incVdb, *incVsb, *incVgb, *solution = pDevice->dcSolution; - double delPsi, delN, delP, newN, newP; - double nConc, pConc; - - /* normalize the voltages for calculations */ - if ( delVdb != 0.0 ) { - delVdb = delVdb / VNorm; - numContactNodes = pDContact->numNodes; - for ( index = 0; index < numContactNodes; index++ ) { - pNode = pDContact->pNodes[ index ]; - pNode->psi += delVdb; - } - } - if ( delVsb != 0.0 ) { - delVsb = delVsb / VNorm; - numContactNodes = pSContact->numNodes; - for ( index = 0; index < numContactNodes; index++ ) { - pNode = pSContact->pNodes[ index ]; - pNode->psi += delVsb; - } - } - if ( delVgb != 0.0 ) { - delVgb = delVgb / VNorm; - numContactNodes = pGContact->numNodes; - for ( index = 0; index < numContactNodes; index++ ) { - pNode = pGContact->pNodes[ index ]; - pNode->psi += delVgb; - } - } - - /* - * store the new rhs for computing the incremental quantities - * incVdb (dcDeltaSolution), incVsb, incVgb - */ - - if ( ABS( delVdb ) > MIN_DELV ) { - - incVdb = pDevice->dcDeltaSolution; - storeNewRhs( pDevice, pDContact ); - spSolve( pDevice->matrix, pDevice->rhs, incVdb, NULL, NULL); - - for ( eIndex = 1; eIndex <= pDevice->numElems; eIndex++ ) { - pElem = pDevice->elements[ eIndex ]; - for ( index = 0; index <= 3; index++ ) { - if ( pElem->evalNodes[ index ] ) { - pNode = pElem->pNodes[ index ]; - if ( pNode->nodeType != CONTACT ) { - delPsi = incVdb[ pNode->psiEqn ] * delVdb; - solution[ pNode->psiEqn ] = pNode->psi + delPsi; - if ( pElem->elemType == SEMICON - && (!OneCarrier || (OneCarrier == N_TYPE)) ) { - delN = incVdb[ pNode->nEqn ] * delVdb; - newN = pNode->nConc + delN; - if ( newN <= 0.0 ) { - solution[ pNode->nEqn ] = guessNewConc( pNode->nConc, delN ); - } - else { - solution[ pNode->nEqn ] = newN; - } - } - if ( pElem->elemType == SEMICON - && (!OneCarrier || (OneCarrier == P_TYPE)) ) { - delP = incVdb[ pNode->pEqn ] * delVdb; - newP = pNode->pConc + delP; - if ( newP <= 0.0 ) { - solution[ pNode->pEqn ] = guessNewConc( pNode->pConc, delP ); - } - else { - solution[ pNode->pEqn ] = newP; - } - } - } - } - } - } - } - else { - TWOstoreInitialGuess( pDevice ); - } - - if ( ABS( delVsb ) > MIN_DELV ) { - - incVsb = pDevice->dcDeltaSolution; - storeNewRhs( pDevice, pSContact ); - spSolve( pDevice->matrix, pDevice->rhs, incVsb, NULL, NULL); - - for ( eIndex = 1; eIndex <= pDevice->numElems; eIndex++ ) { - pElem = pDevice->elements[ eIndex ]; - for ( index = 0; index <= 3; index++ ) { - if ( pElem->evalNodes[ index ] ) { - pNode = pElem->pNodes[ index ]; - if ( pNode->nodeType != CONTACT ) { - delPsi = incVsb[ pNode->psiEqn ] * delVsb; - solution[ pNode->psiEqn ] += delPsi; - if ( pElem->elemType == SEMICON - && (!OneCarrier || (OneCarrier == N_TYPE)) ) { - delN = incVsb[ pNode->nEqn ] * delVsb; - nConc = solution[ pNode->nEqn ]; - newN = nConc + delN; - if ( newN <= 0.0 ) { - solution[ pNode->nEqn ] = guessNewConc( nConc, delN ); - } - else { - solution[ pNode->nEqn ] = newN; - } - } - if ( pElem->elemType == SEMICON - && (!OneCarrier || (OneCarrier == P_TYPE)) ) { - delP = incVsb[ pNode->pEqn ] * delVsb; - pConc = solution[ pNode->pEqn ]; - newP = pConc + delP; - if ( newP <= 0.0 ) { - solution[ pNode->pEqn ] = guessNewConc( pConc, delP ); - } - else { - solution[ pNode->pEqn ] = newP; - } - } - } - } - } - } - } - - if ( ABS( delVgb ) > MIN_DELV ) { - - incVgb = pDevice->dcDeltaSolution; - storeNewRhs( pDevice, pGContact ); - spSolve( pDevice->matrix, pDevice->rhs, incVgb, NULL, NULL); - - for ( eIndex = 1; eIndex <= pDevice->numElems; eIndex++ ) { - pElem = pDevice->elements[ eIndex ]; - for ( index = 0; index <= 3; index++ ) { - if ( pElem->evalNodes[ index ] ) { - pNode = pElem->pNodes[ index ]; - if ( pNode->nodeType != CONTACT ) { - delPsi = incVgb[ pNode->psiEqn ] * delVgb; - solution[ pNode->psiEqn ] += delPsi; - if ( pElem->elemType == SEMICON - && (!OneCarrier || (OneCarrier == N_TYPE)) ) { - delN = incVgb[ pNode->nEqn ] * delVgb; - nConc = solution[ pNode->nEqn ]; - newN = nConc + delN; - if ( newN <= 0.0 ) { - solution[ pNode->nEqn ] = guessNewConc( nConc, delN ); - } - else { - solution[ pNode->nEqn ] = newN; - } - } - if ( pElem->elemType == SEMICON - && (!OneCarrier || (OneCarrier == P_TYPE)) ) { - delP = incVgb[ pNode->pEqn ] * delVgb; - pConc = solution[ pNode->pEqn ]; - newP = pConc + delP; - if ( newP <= 0.0 ) { - solution[ pNode->pEqn ] = guessNewConc( pConc, delP ); - } - else { - solution[ pNode->pEqn ] = newP; - } - } - } - } - } - } - } -} - -/* functions to update the solution for the full-LU and - modified two-level Newton methods - */ - -void NUMD2update(TWOdevice *pDevice, double delV, BOOLEAN updateBoundary) -{ - TWOnode *pNode; - TWOelem *pElem; - int index, eIndex, numContactNodes; - TWOcontact *pContact = pDevice->pLastContact; - double delPsi, delN, delP, *incVpn, *solution = pDevice->dcSolution; - - delV = -delV / VNorm; - if ( updateBoundary ) { - /* update the boundary condition for the last contact */ - numContactNodes = pContact->numNodes; - for ( index = 0; index < numContactNodes; index++ ) { - pNode = pContact->pNodes[ index ]; - pNode->psi += delV; - } - } - - /* the equations have been solved while computing the conductances */ - /* solution is in dcDeltaSolution, so use it */ - - incVpn = pDevice->dcDeltaSolution; - for ( eIndex = 1; eIndex <= pDevice->numElems; eIndex++ ) { - pElem = pDevice->elements[ eIndex ]; - for ( index = 0; index <= 3; index++ ) { - if ( pElem->evalNodes[ index ] ) { - pNode = pElem->pNodes[ index ]; - if ( pNode->nodeType != CONTACT ) { - delPsi = incVpn[ pNode->psiEqn ] * delV; - solution[ pNode->psiEqn ] = pNode->psi + delPsi; - if ( pElem->elemType == SEMICON - && (!OneCarrier || (OneCarrier == N_TYPE)) ) { - delN = incVpn[ pNode->nEqn ] * delV; - solution[ pNode->nEqn ] = pNode->nConc + delN; - } - if ( pElem->elemType == SEMICON - && (!OneCarrier || (OneCarrier == P_TYPE)) ) { - delP = incVpn[ pNode->pEqn ] * delV; - solution[ pNode->pEqn ] = pNode->pConc + delP; - } - } - } - } - } -} - - -void NBJT2update(TWOdevice *pDevice, double delVce, double delVbe, - BOOLEAN updateBoundary) -{ - TWOnode *pNode; - TWOelem *pElem; - int index, eIndex, numContactNodes; - TWOcontact *pColContact = pDevice->pFirstContact; - TWOcontact *pBaseContact = pDevice->pFirstContact->next; - double delPsi, delN, delP, *incVce, *incVbe, *solution = pDevice->dcSolution; - - /* normalize the voltages for calculations */ - - if ( delVce != 0.0 ) { - delVce = delVce / VNorm; - if ( updateBoundary ) { - numContactNodes = pColContact->numNodes; - for ( index = 0; index < numContactNodes; index++ ) { - pNode = pColContact->pNodes[ index ]; - pNode->psi += delVce; - } - } - } - if ( delVbe != 0.0 ) { - delVbe = delVbe / VNorm; - if ( updateBoundary ) { - numContactNodes = pBaseContact->numNodes; - for ( index = 0; index < numContactNodes; index++ ) { - pNode = pBaseContact->pNodes[ index ]; - pNode->psi += delVbe; - } - } - } - - /* use solution from computeConductance to do update */ - /* set incVce = dcDeltaSolution; incVbe = copiedSolution */ - - incVce = pDevice->dcDeltaSolution; - incVbe = pDevice->copiedSolution; - for ( eIndex = 1; eIndex <= pDevice->numElems; eIndex++ ) { - pElem = pDevice->elements[ eIndex ]; - for ( index = 0; index <= 3; index++ ) { - if ( pElem->evalNodes[ index ] ) { - pNode = pElem->pNodes[ index ]; - if ( pNode->nodeType != CONTACT ) { - delPsi = (incVce[ pNode->psiEqn ] * delVce - + incVbe[ pNode->psiEqn ] * delVbe); - solution[ pNode->psiEqn ] = pNode->psi + delPsi; - if ( pElem->elemType == SEMICON - && (!OneCarrier || (OneCarrier == N_TYPE)) ) { - delN = (incVce[ pNode->nEqn ] * delVce - + incVbe[ pNode->nEqn ] * delVbe); - solution[ pNode->nEqn ] = pNode->nConc + delN; - } - if ( pElem->elemType == SEMICON - && (!OneCarrier || (OneCarrier == P_TYPE)) ) { - delP = (incVce[ pNode->pEqn ] * delVce - + incVbe[ pNode->pEqn ] * delVbe); - solution[ pNode->pEqn ] = pNode->pConc + delP; - } - } - } - } - } -} - - -void NUMOSupdate(TWOdevice *pDevice, double delVdb, double delVsb, - double delVgb, BOOLEAN updateBoundary) -{ - TWOnode *pNode; - TWOelem *pElem; - int index, eIndex, numContactNodes; - TWOcontact *pDContact = pDevice->pFirstContact; - TWOcontact *pGContact = pDevice->pFirstContact->next; - TWOcontact *pSContact = pDevice->pFirstContact->next->next; - double delPsi, delN, delP; - double *incVdb, *incVsb, *incVgb, *solution = pDevice->dcSolution; - - /* normalize the voltages for calculations */ - if ( delVdb != 0.0 ) { - delVdb = delVdb / VNorm; - if ( updateBoundary ) { - numContactNodes = pDContact->numNodes; - for ( index = 0; index < numContactNodes; index++ ) { - pNode = pDContact->pNodes[ index ]; - pNode->psi += delVdb; - } - } - } - if ( delVsb != 0.0 ) { - delVsb = delVsb / VNorm; - if ( updateBoundary ) { - numContactNodes = pSContact->numNodes; - for ( index = 0; index < numContactNodes; index++ ) { - pNode = pSContact->pNodes[ index ]; - pNode->psi += delVsb; - } - } - } - if ( delVgb != 0.0 ) { - delVgb = delVgb / VNorm; - if ( updateBoundary ) { - numContactNodes = pGContact->numNodes; - for ( index = 0; index < numContactNodes; index++ ) { - pNode = pGContact->pNodes[ index ]; - pNode->psi += delVgb; - } - } - } - - /* use solution from computeConductance to do update */ - - incVdb = pDevice->dcDeltaSolution; - incVsb = pDevice->copiedSolution; - incVgb = pDevice->rhsImag; - for ( eIndex = 1; eIndex <= pDevice->numElems; eIndex++ ) { - pElem = pDevice->elements[ eIndex ]; - for ( index = 0; index <= 3; index++ ) { - if ( pElem->evalNodes[ index ] ) { - pNode = pElem->pNodes[ index ]; - if ( pNode->nodeType != CONTACT ) { - delPsi = (incVdb[ pNode->psiEqn ] * delVdb - + incVsb[ pNode->psiEqn ] * delVsb - + incVgb[ pNode->psiEqn ] * delVgb); - solution[ pNode->psiEqn ] = pNode->psi + delPsi; - if ( pElem->elemType == SEMICON - && (!OneCarrier || (OneCarrier == N_TYPE)) ) { - delN = (incVdb[ pNode->nEqn ] * delVdb - + incVsb[ pNode->nEqn ] * delVsb - + incVgb[ pNode->nEqn ] * delVgb); - solution[ pNode->nEqn ] = pNode->nConc + delN; - } - if ( pElem->elemType == SEMICON - && (!OneCarrier || (OneCarrier == P_TYPE)) ) { - delP = (incVdb[ pNode->pEqn ] * delVdb - + incVsb[ pNode->pEqn ] * delVsb - + incVgb[ pNode->pEqn ] * delVgb); - solution[ pNode->pEqn ] = pNode->pConc + delP; - } - } - } - } - } -} - - -void storeNewRhs(TWOdevice *pDevice, TWOcontact *pContact) -{ - int index, i, numContactNodes; - TWOelem *pElem; - TWOnode *pNode, *pHNode = NULL, *pVNode = NULL; - TWOedge *pHEdge = NULL, *pVEdge = NULL; - double *rhs = pDevice->rhs; - - /* zero the rhs before loading in the new rhs */ - for ( index = 1; index <= pDevice->numEqns ; index++ ) { - rhs[ index ] = 0.0; - } - - numContactNodes = pContact->numNodes; - for ( index = 0; index < numContactNodes; index++ ) { - pNode = pContact->pNodes[ index ]; - for ( i = 0; i <= 3; i++ ) { - pElem = pNode->pElems[ i ]; - if ( pElem != NULL) { - /* found an element to which this node belongs */ - switch ( i ) { - case 0: - /* the TL element of this node */ - pHNode = pElem->pBLNode; - pVNode = pElem->pTRNode; - pHEdge = pElem->pBotEdge; - pVEdge = pElem->pRightEdge; - break; - case 1: - /* the TR element */ - pHNode = pElem->pBRNode; - pVNode = pElem->pTLNode; - pHEdge = pElem->pBotEdge; - pVEdge = pElem->pLeftEdge; - break; - case 2: - /* the BR element */ - pHNode = pElem->pTRNode; - pVNode = pElem->pBLNode; - pHEdge = pElem->pTopEdge; - pVEdge = pElem->pLeftEdge; - break; - case 3: - /* the BL element */ - pHNode = pElem->pTLNode; - pVNode = pElem->pBRNode; - pHEdge = pElem->pTopEdge; - pVEdge = pElem->pRightEdge; - break; - default: - printf( "storeNewRhs: shouldn't be here\n"); - break; - } - if ( pHNode->nodeType != CONTACT ) { - /* contribution to the x nodes */ - rhs[ pHNode->psiEqn ] += pElem->epsRel * 0.5 * pElem->dyOverDx; - if ( pElem->elemType == SEMICON ) { - if ( !OneCarrier ) { - rhs[ pHNode->nEqn ] -= 0.5 * pElem->dy * pHEdge->dJnDpsiP1; - rhs[ pHNode->pEqn ] -= 0.5 * pElem->dy * pHEdge->dJpDpsiP1; - } else if ( OneCarrier == N_TYPE ) { - rhs[ pHNode->nEqn ] -= 0.5 * pElem->dy * pHEdge->dJnDpsiP1; - } else if ( OneCarrier == P_TYPE ) { - rhs[ pHNode->pEqn ] -= 0.5 * pElem->dy * pHEdge->dJpDpsiP1; - } - } - } - if ( pVNode->nodeType != CONTACT ) { - /* contribution to the y nodes */ - rhs[ pVNode->psiEqn ] += pElem->epsRel * 0.5 * pElem->dxOverDy; - if ( pElem->elemType == SEMICON ) { - if ( !OneCarrier ) { - rhs[ pVNode->nEqn ] -= 0.5 * pElem->dx * pVEdge->dJnDpsiP1; - rhs[ pVNode->pEqn ] -= 0.5 * pElem->dx * pVEdge->dJpDpsiP1; - } else if ( OneCarrier == N_TYPE ) { - rhs[ pVNode->nEqn ] -= 0.5 * pElem->dx * pVEdge->dJnDpsiP1; - } else if ( OneCarrier == P_TYPE ) { - rhs[ pVNode->pEqn ] -= 0.5 * pElem->dx * pVEdge->dJpDpsiP1; - } - } - } - } - } - } -} diff --git a/src/ciderlib/twod/tworead.c b/src/ciderlib/twod/tworead.c deleted file mode 100644 index 6590e3a04..000000000 --- a/src/ciderlib/twod/tworead.c +++ /dev/null @@ -1,115 +0,0 @@ -/********** -Copyright 1992 Regents of the University of California. All rights reserved. -Author: 1992 David A. Gates, U. C. Berkeley CAD Group -**********/ - -/* - * Functions needed to read solutions for 2D devices. - */ - -#include "ngspice/ngspice.h" -#include "ngspice/plot.h" -#include "ngspice/numglobs.h" -#include "ngspice/numenum.h" -#include "ngspice/twodev.h" -#include "ngspice/twomesh.h" -#include "twoddefs.h" -#include "twodext.h" -#include "ngspice/cidersupt.h" - - -int -TWOreadState(TWOdevice *pDevice, char *fileName, int numVolts, double *pV1, - double *pV2, double *pV3) - /* char *fileName: File containing raw data */ - /* int numVolts: Number of voltage differences */ - /* double *pV1, *pV2, *pV3: Pointer to return them in */ -{ - int dataLength; - int i, index, xIndex, yIndex; - TWOnode ***nodeArray = NULL; - TWOnode *pNode; - TWOelem *pElem; - double refPsi = 0.0; - double *psiData, *nData, *pData; - double *vData[3]; - struct plot *stateDB; - struct plot *voltsDB; - char voltName[80]; - - stateDB = DBread( fileName ); - if (stateDB == NULL) return (-1); - voltsDB = stateDB->pl_next; - if (voltsDB == NULL) return (-1); - - for (i=0; i < numVolts; i++ ) { - sprintf( voltName, "v%d%d", i+1, numVolts+1 ); - vData[i] = DBgetData( voltsDB, voltName, 1 ); - if (vData[i] == NULL) return (-1); - } - dataLength = pDevice->numXNodes * pDevice->numYNodes; - psiData = DBgetData( stateDB, "psi", dataLength ); - nData = DBgetData( stateDB, "n", dataLength ); - pData = DBgetData( stateDB, "p", dataLength ); - if (psiData == NULL || nData == NULL || pData == NULL) return (-1); - - if (pV1 != NULL) { - *pV1 = vData[0][0]; - FREE( vData[0] ); - } - if (pV2 != NULL) { - *pV2 = vData[1][0]; - FREE( vData[1] ); - } - if (pV3 != NULL) { - *pV3 = vData[2][0]; - FREE( vData[2] ); - } - - /* generate the work array for copying node info */ - XCALLOC(nodeArray, TWOnode **, 1 + pDevice->numXNodes); - for (xIndex = 1; xIndex <= pDevice->numXNodes; xIndex++) { - XCALLOC(nodeArray[xIndex], TWOnode *, 1 + pDevice->numYNodes); - } - - /* store the nodes in this work array and use later */ - for (xIndex = 1; xIndex < pDevice->numXNodes; xIndex++) { - for (yIndex = 1; yIndex < pDevice->numYNodes; yIndex++) { - pElem = pDevice->elemArray[xIndex][yIndex]; - if (pElem != NULL) { - if (refPsi == 0.0 && pElem->matlInfo->type == SEMICON) { - refPsi = pElem->matlInfo->refPsi; - } - for (index = 0; index <= 3; index++) { - if (pElem->evalNodes[index]) { - pNode = pElem->pNodes[index]; - nodeArray[pNode->nodeI][pNode->nodeJ] = pNode; - } - } - } - } - } - index = 0; - for (xIndex = 1; xIndex <= pDevice->numXNodes; xIndex++) { - for (yIndex = 1; yIndex <= pDevice->numYNodes; yIndex++) { - pNode = nodeArray[xIndex][yIndex]; - index++; - if (pNode != NULL) { - pNode->psi = psiData[index-1]/VNorm + refPsi; - pNode->nConc = nData[index-1]/NNorm; - pNode->pConc = pData[index-1]/NNorm; - } - } - } - /* Delete work array. */ - for (xIndex = 1; xIndex <= pDevice->numXNodes; xIndex++) { - FREE(nodeArray[xIndex]); - } - FREE(nodeArray); - - FREE(psiData); - FREE(nData); - FREE(pData); - - return (0); -} diff --git a/src/ciderlib/twod/twosetbc.c b/src/ciderlib/twod/twosetbc.c deleted file mode 100644 index 5be7e95ca..000000000 --- a/src/ciderlib/twod/twosetbc.c +++ /dev/null @@ -1,94 +0,0 @@ -/********** -Copyright 1991 Regents of the University of California. All rights reserved. -Author: 1987 Kartikeya Mayaram, U. C. Berkeley CAD Group -**********/ - -#include "ngspice/ngspice.h" -#include "ngspice/numglobs.h" -#include "ngspice/numenum.h" -#include "ngspice/twomesh.h" -#include "ngspice/twodev.h" -#include "twoddefs.h" -#include "twodext.h" - -/* Forward declarations */ -static void setDirichlet(TWOcontact *, double); - - -void NUMD2setBCs(TWOdevice *pDevice, double vd) -{ - TWOcontact *pContact = pDevice->pLastContact; - - setDirichlet( pContact, - vd ); -} - -void NBJT2setBCs(TWOdevice *pDevice, double vce, double vbe) -{ - TWOcontact *pCollContact = pDevice->pFirstContact; - TWOcontact *pBaseContact = pDevice->pFirstContact->next; - - setDirichlet( pCollContact, vce ); - setDirichlet( pBaseContact, vbe ); -} - -void NUMOSsetBCs(TWOdevice *pDevice, double vdb, double vsb, double vgb) -{ - TWOcontact *pDContact = pDevice->pFirstContact; - TWOcontact *pGContact = pDevice->pFirstContact->next; - TWOcontact *pSContact = pDevice->pFirstContact->next->next; - - setDirichlet( pDContact, vdb ); - setDirichlet( pSContact, vsb ); - setDirichlet( pGContact, vgb ); -} - -static void - setDirichlet(TWOcontact *pContact, double voltage) -{ - int index, numContactNodes, i; - TWOelem *pElem = NULL; - TWOnode *pNode; - double psi, ni, pi, nie; - double conc, sign, absConc; - - voltage /= VNorm; - - numContactNodes = pContact->numNodes; - for ( index = 0; index < numContactNodes; index++ ) { - pNode = pContact->pNodes[ index ]; - - /* Find this node's owner element. */ - for ( i = 0; i <= 3; i++ ) { - pElem = pNode->pElems[ i ]; - if ( pElem != NULL && pElem->evalNodes[ (i+2)%4 ] ) { - break; /* got it */ - } - } - - if (pElem->elemType == INSULATOR) { - pNode->psi = RefPsi - pNode->eaff; - pNode->nConc = 0.0; - pNode->pConc = 0.0; - } - else if (pElem->elemType == SEMICON) { - nie = pNode->nie; - conc = pNode->netConc / nie; - sign = SGN( conc ); - absConc = ABS( conc ); - if ( conc != 0.0 ) { - psi = sign * log( 0.5 * absConc + sqrt( 1.0 + 0.25*absConc*absConc )); - ni = nie * exp( psi ); - pi = nie * exp( - psi ); - } - else { - psi = 0.0; - ni = nie; - pi = nie; - } - pNode->psi = pElem->matlInfo->refPsi + psi; - pNode->nConc = ni; - pNode->pConc = pi; - } - pNode->psi += voltage; - } -} diff --git a/src/ciderlib/twod/twosetup.c b/src/ciderlib/twod/twosetup.c deleted file mode 100644 index 9fe64f1c5..000000000 --- a/src/ciderlib/twod/twosetup.c +++ /dev/null @@ -1,313 +0,0 @@ -/********** -Copyright 1991 Regents of the University of California. All rights reserved. -Author: 1987 Kartikeya Mayaram, U. C. Berkeley CAD Group -Author: 1991 David A. Gates, U. C. Berkeley CAD Group -**********/ - -/********** -Two-Dimensional Numerical Device Setup Routines -**********/ - -#include "ngspice/ngspice.h" -#include "ngspice/numglobs.h" -#include "ngspice/numconst.h" -#include "ngspice/numenum.h" -#include "ngspice/twomesh.h" -#include "ngspice/twodev.h" -#include "ngspice/carddefs.h" /* XXX Not really modular if we need this. */ -#include "twoddefs.h" -#include "twodext.h" -#include "ngspice/cidersupt.h" - - -/* compute node parameters */ -void TWOsetup(TWOdevice *pDevice) -{ - double temp1, deltaEg, avgConc, totalConc, absNetConc; - double ncv0, dBand, dNie, psiBand[4]; - double *xScale = pDevice->xScale; - double *yScale = pDevice->yScale; - int index, eIndex; - int numContactNodes; - TWOnode *pNode; - TWOelem *pElem; - TWOedge *pEdge; - TWOcontact *pC; - TWOmaterial *info; - - for ( eIndex = 1; eIndex <= pDevice->numElems; eIndex++ ) { - pElem = pDevice->elements[ eIndex ]; - info = pElem->matlInfo; - - pElem->dx = xScale[ pElem->pTRNode->nodeI ]-xScale[ pElem->pTLNode->nodeI ]; - pElem->dy = yScale[ pElem->pBLNode->nodeJ ]-yScale[ pElem->pTLNode->nodeJ ]; - pElem->epsRel = info->eps; - - if ( pElem->elemType == INSULATOR ) { - for ( index = 0; index <= 3; index++ ) { - if ( pElem->evalNodes[ index ] ) { - pNode = pElem->pNodes[ index ]; - if (pNode->nodeType == CONTACT) { - pNode->eaff = PHI_METAL; - pNode->eg = 0.0; - } else { - pNode->eaff = info->affin; - pNode->eg = info->eg0; - } - } - } - } else if ( pElem->elemType == SEMICON ) { - ncv0 = sqrt( info->nc0 ) * sqrt( info->nv0 ); - for ( index = 0; index <= 3; index++ ) { - if ( pElem->evalNodes[ index ] ) { - pNode = pElem->pNodes[ index ]; - - /* Narrowing of Energy-Band Gap */ - if (BandGapNarrowing) { - absNetConc = ABS( pNode->netConc ); - if ( pNode->netConc > 0.0 ) { - temp1 = log( absNetConc / info->nrefBGN[ELEC] ); - deltaEg = - info->dEgDn[ELEC] * (temp1 + sqrt(temp1*temp1 + 0.5)); - pNode->eg = info->eg0 + deltaEg; - } else if ( pNode->netConc < 0.0 ) { - temp1 = log( absNetConc / info->nrefBGN[HOLE] ); - deltaEg = - info->dEgDn[HOLE] * (temp1 + sqrt(temp1*temp1 + 0.5)); - pNode->eg = info->eg0 + deltaEg; - } else { - pNode->eg = info->eg0; - } - } else { - pNode->eg = info->eg0; - } - pNode->nie = ncv0 * exp ( -0.5 * pNode->eg / Vt ); - pNode->eaff = info->affin; - /* Save band structure parameter. */ - psiBand[ index ] = - info->refPsi; - - /* Ionized-Impurity-Scattering Reduction of Carrier Lifetime */ - if (ConcDepLifetime) { - totalConc = pNode->totalConc; - temp1 = 1.0 / ( 1.0 + totalConc / info->nrefSRH[ELEC] ); - pNode->tn = info->tau0[ELEC] * temp1; - temp1 = 1.0 / ( 1.0 + totalConc / info->nrefSRH[HOLE] ); - pNode->tp = info->tau0[HOLE] * temp1; - } else { - pNode->tn = info->tau0[ELEC]; - pNode->tp = info->tau0[HOLE]; - } - } - } - - for ( index = 0; index <= 3; index++ ) { - if ( pElem->evalEdges[ index ] ) { - pEdge = pElem->pEdges[ index ]; - - /* Fixed Interface Charge */ - pEdge->qf = 0.0; - - /* Variable Band Built-In Potential */ - if ( index <= 1 ) { - dBand = psiBand[index+1] - psiBand[index]; - dNie = log( pElem->pNodes[index+1]->nie / - pElem->pNodes[index]->nie ); - pEdge->dCBand = dBand + dNie; - pEdge->dVBand = - dBand + dNie; - } else { - dBand = psiBand[index] - psiBand[(index+1)%4]; - dNie = log( pElem->pNodes[index]->nie / - pElem->pNodes[(index+1)%4]->nie ); - pEdge->dCBand = dBand + dNie; - pEdge->dVBand = - dBand + dNie; - } - } - } - - /* Evaluate conc.-dep. mobility. */ - /* Average conc of all four nodes. */ - avgConc = 0.25*(pElem->pTLNode->totalConc + pElem->pTRNode->totalConc + - pElem->pBRNode->totalConc + pElem->pBLNode->totalConc); - MOBconcDep( info, avgConc, &pElem->mun0, &pElem->mup0 ); - } - } - - for ( pC = pDevice->pFirstContact; pC != NULL; pC = pC->next ) { - numContactNodes = pC->numNodes; - for ( index = 0; index < numContactNodes; index++ ) { - pNode = pC->pNodes[ index ]; - pNode->eaff = pC->workf; /* Affinity aka work function */ - } - } -} - -/* Transfer BC info from card to nodes and edges. */ -static void -TWOcopyBCinfo(TWOdevice *pDevice, TWOelem *pElem, BDRYcard *card, int index ) -{ - TWOnode *pNode; - TWOelem *pNElem; - TWOedge *pEdge; - TWOmaterial *info; - TWOchannel *newChannel; - int eIndex, nIndex; - int direction = index%2; - double length, area, width, layerWidth; - double dop, na = 0.0, nd = 0.0; - - /* First add fixed charge. */ - pEdge = pElem->pEdges[index]; - pEdge->qf += card->BDRYqf; - - /* Now add surface recombination. */ - if ( direction == 0 ) { /* Horizontal Edge */ - length = 0.5 * pElem->dx; - } else { - length = 0.5 * pElem->dy; - } - for (nIndex = 0; nIndex <= 1; nIndex++) { - pNode = pElem->pNodes[ (index+nIndex)%4 ]; - /* Compute semiconductor area around this node. */ - area = 0.0; - for (eIndex = 0; eIndex <= 3; eIndex++) { - pNElem = pNode->pElems[eIndex]; - if (pNElem != NULL && pElem->elemType == SEMICON) { - area += 0.25 * pElem->dx * pElem->dy; - } - } - if (card->BDRYsnGiven) { - pNode->tn = pNode->tn / - (1.0 + ((card->BDRYsn * TNorm)*length*pNode->tn) / area); - } - if (card->BDRYspGiven) { - pNode->tp = pNode->tp / - (1.0 + ((card->BDRYsp * TNorm)*length*pNode->tp) / area); - } - /* Compute doping just in case we need it later. */ - na += 0.5 * pNode->na; - nd += 0.5 * pNode->nd; - } - - /* Finally do surface layer. */ - pNElem = pElem->pElems[index]; - if (card->BDRYlayerGiven && SurfaceMobility && pElem->elemType == SEMICON - && pElem->channel == 0 && pNElem && pNElem->elemType == INSULATOR - && pElem->pNodes[index]->nodeType != CONTACT && - pElem->pNodes[(index+1)%4]->nodeType != CONTACT ) { - /* Find the layer width. */ - layerWidth = card->BDRYlayer; - if (card->BDRYlayer <= 0.0) { /* Need to compute extrinsic Debye length */ - info = pElem->matlInfo; - dop = MAX(MAX(na,nd),info->ni0); - layerWidth = sqrt((Vt * info->eps) / (CHARGE * dop)); - } - - /* Add a channel to the list of channels. */ - XCALLOC( newChannel, TWOchannel, 1); - newChannel->pSeed = pElem; - newChannel->pNElem = pNElem; - newChannel->type = index; - if (pDevice->pChannel != NULL) { - newChannel->id = pDevice->pChannel->id + 1; - newChannel->next = pDevice->pChannel; - } else { - newChannel->id = 1; - newChannel->next = NULL; - } - pDevice->pChannel = newChannel; - - /* Now add elements to channel until we're more than layerWidth away - * from the interface. If we encounter a missing element or an - * element that's already part of a different channel, quit. - * The seed element is at the surface. - */ - width = 0.0; - eIndex = (index+2)%4; - pElem->surface = TRUE; - while (width < layerWidth && pElem && pElem->channel == 0) { - pElem->channel = newChannel->id; - pElem->direction = direction; - /* - * Surface mobility is normally concentration-independent in - * the default model. Overwrite concentration-dependent value - * calculated earlier unless matching of low-field surface - * and bulk mobilities is requested. - */ - if (!MatchingMobility) { - pElem->mun0 = pElem->matlInfo->mus[ELEC]; - pElem->mup0 = pElem->matlInfo->mus[HOLE]; - } - if ( direction == 0 ) { - width += pElem->dy; - } else { - width += pElem->dx; - } - pElem = pElem->pElems[ eIndex ]; - } - } -} - -/* Compute boundary condition parameters. */ -void TWOsetBCparams(TWOdevice *pDevice, BDRYcard *cardList) -{ - int index, xIndex, yIndex; /* Need to access in X/Y order. */ - TWOelem *pElem, *pNElem; - BDRYcard *card; - - for ( card = cardList; card != NULL; card = card->BDRYnextCard ) { - for (xIndex = card->BDRYixLow; xIndex < card->BDRYixHigh; xIndex++) { - for (yIndex = card->BDRYiyLow; yIndex < card->BDRYiyHigh; yIndex++) { - pElem = pDevice->elemArray[ xIndex ][ yIndex ]; - if (pElem != NULL) { - if (pElem->domain == card->BDRYdomain) { - for (index = 0; index <= 3; index++) { - if (pElem->evalEdges[index]) { - pNElem = pElem->pElems[index]; - if (card->BDRYneighborGiven) { - if (pNElem && pNElem->domain == card->BDRYneighbor) { - /* Found an interface edge. */ - TWOcopyBCinfo( pDevice, pElem, card, index ); - } - } else { - if (!pNElem || pNElem->domain != pElem->domain) { - /* Found a boundary edge. */ - TWOcopyBCinfo( pDevice, pElem, card, index ); - } - } - } - } - } - } - } - } - } -} - -void TWOnormalize(TWOdevice *pDevice) -{ - int index, eIndex; - TWOelem *pElem; - TWOnode *pNode; - TWOedge *pEdge; - - for ( eIndex = 1; eIndex <= pDevice->numElems; eIndex++ ) { - pElem = pDevice->elements[ eIndex ]; - - pElem->dx /= LNorm; - pElem->dy /= LNorm; - pElem->epsRel /= EpsNorm; - for ( index = 0; index <= 3; index++ ) { - if ( pElem->evalNodes[ index ] ) { - pNode = pElem->pNodes[ index ]; - pNode->netConc /= NNorm; - pNode->nd /= NNorm; - pNode->na /= NNorm; - pNode->nie /= NNorm; - pNode->eg /= VNorm; - pNode->eaff /= VNorm; - } - if ( pElem->evalEdges[ index ] ) { - pEdge = pElem->pEdges[ index ]; - pEdge->qf /= NNorm*LNorm; - } - } - } -} diff --git a/src/ciderlib/twod/twosolve.c b/src/ciderlib/twod/twosolve.c deleted file mode 100644 index 7be06a1fe..000000000 --- a/src/ciderlib/twod/twosolve.c +++ /dev/null @@ -1,1222 +0,0 @@ -/********** -Copyright 1991 Regents of the University of California. All rights reserved. -Author: 1987 Kartikeya Mayaram, U. C. Berkeley CAD Group -Author: 1991 David A. Gates, U. C. Berkeley CAD Group -**********/ - -#include "../../maths/misc/norm.h" -#include "ngspice/bool.h" -#include "ngspice/cidersupt.h" -#include "ngspice/cpextern.h" -#include "ngspice/ifsim.h" -#include "ngspice/macros.h" -#include "ngspice/ngspice.h" -#include "ngspice/numenum.h" -#include "ngspice/numglobs.h" -#include "ngspice/spmatrix.h" -#include "ngspice/twodev.h" -#include "ngspice/twomesh.h" -#include "twoddefs.h" -#include "twodext.h" -extern IFfrontEnd *SPfrontEnd; - - -/* functions to calculate the 2D solutions */ - - -/* the iteration driving loop and convergence check */ -void -TWOdcSolve(TWOdevice *pDevice, int iterationLimit, BOOLEAN newSolver, - BOOLEAN tranAnalysis, TWOtranInfo *info) -{ - TWOnode *pNode; - TWOelem *pElem; - int size = pDevice->numEqns; - int index, eIndex, error; - int timesConverged = 0; - BOOLEAN quitLoop; - BOOLEAN debug; - BOOLEAN negConc = FALSE; - double *rhs = pDevice->rhs; - double *solution = pDevice->dcSolution; - double *delta = pDevice->dcDeltaSolution; - double poissNorm, contNorm; - double startTime, totalStartTime; - double totalTime, loadTime, factorTime, solveTime, updateTime, checkTime; - double orderTime = 0.0; - - totalTime = loadTime = factorTime = solveTime = updateTime = checkTime = 0.0; - totalStartTime = SPfrontEnd->IFseconds(); - - quitLoop = FALSE; - debug = (!tranAnalysis && TWOdcDebug) || (tranAnalysis && TWOtranDebug); - pDevice->iterationNumber = 0; - pDevice->converged = FALSE; - - if (debug) { - if (pDevice->poissonOnly) { - fprintf(stdout, "Equilibrium Solution:\n"); - } else { - fprintf(stdout, "Bias Solution:\n"); - } - fprintf(stdout, "Iteration RHS Norm\n"); - } - while (!(pDevice->converged || (pDevice->iterationNumber > iterationLimit) - || quitLoop)) { - pDevice->iterationNumber++; - - if ((!pDevice->poissonOnly) && (iterationLimit > 0) - &&(!tranAnalysis)) { - TWOjacCheck(pDevice, tranAnalysis, info); - } - - /* LOAD */ - startTime = SPfrontEnd->IFseconds(); - if (pDevice->poissonOnly) { - TWOQsysLoad(pDevice); - } else if (!OneCarrier) { - TWO_sysLoad(pDevice, tranAnalysis, info); - } else if (OneCarrier == N_TYPE) { - TWONsysLoad(pDevice, tranAnalysis, info); - } else if (OneCarrier == P_TYPE) { - TWOPsysLoad(pDevice, tranAnalysis, info); - } - pDevice->rhsNorm = maxNorm(rhs, size); - loadTime += SPfrontEnd->IFseconds() - startTime; - if (debug) { - fprintf(stdout, "%7d %11.4e%s\n", - pDevice->iterationNumber - 1, pDevice->rhsNorm, - negConc ? " negative conc encountered" : ""); - negConc = FALSE; - } - - /* FACTOR */ - startTime = SPfrontEnd->IFseconds(); - error = spFactor(pDevice->matrix); - factorTime += SPfrontEnd->IFseconds() - startTime; - if (newSolver) { - if (pDevice->iterationNumber == 1) { - orderTime = factorTime; - } - else if (pDevice->iterationNumber == 2) { - orderTime -= factorTime - orderTime; - factorTime -= orderTime; - if (pDevice->poissonOnly) { - pDevice->pStats->orderTime[STAT_SETUP] += orderTime; - } - else { - pDevice->pStats->orderTime[STAT_DC] += orderTime; - } - /* After first two iterations, no special handling for a - * new solver */ - newSolver = FALSE; - } /* end of case of iteratin 2 */ - } /* end of special processing for a new solver */ - - if (foundError(error)) { - if (error == spSINGULAR) { - int badRow, badCol; - spWhereSingular(pDevice->matrix, &badRow, &badCol); - printf("***** singular at (%d,%d)\n", badRow, badCol); - } - pDevice->converged = FALSE; - quitLoop = TRUE; - continue; - } - - /* SOLVE */ - startTime = SPfrontEnd->IFseconds(); - spSolve(pDevice->matrix, rhs, delta, NULL, NULL); - solveTime += SPfrontEnd->IFseconds() - startTime; - - /* UPDATE */ - startTime = SPfrontEnd->IFseconds(); - /* Use norm reducing Newton method for DC bias solutions only. */ - if ((!pDevice->poissonOnly) && (iterationLimit > 0) - && (!tranAnalysis) && (pDevice->rhsNorm > 1e-1)) { - error = TWOnewDelta(pDevice, tranAnalysis, info); - if (error) { - pDevice->converged = FALSE; - quitLoop = TRUE; - updateTime += SPfrontEnd->IFseconds() - startTime; - continue; - } - } - for (index = 1; index <= size; index++) { - solution[index] += delta[index]; - } - updateTime += SPfrontEnd->IFseconds() - startTime; - - /* CHECK CONVERGENCE */ - startTime = SPfrontEnd->IFseconds(); - /* Check if updates have gotten sufficiently small. */ - if (pDevice->iterationNumber != 1) { - pDevice->converged = TWOdeltaConverged(pDevice); - } - /* Check if the residual is smaller than abstol. */ - if (pDevice->converged && (!pDevice->poissonOnly) - && (!tranAnalysis)) { - if (!OneCarrier) { - TWO_rhsLoad(pDevice, tranAnalysis, info); - } else if (OneCarrier == N_TYPE) { - TWONrhsLoad(pDevice, tranAnalysis, info); - } else if (OneCarrier == P_TYPE) { - TWOPrhsLoad(pDevice, tranAnalysis, info); - } - pDevice->rhsNorm = maxNorm(rhs, size); - if (pDevice->rhsNorm > pDevice->abstol) { - pDevice->converged = FALSE; - } - if ((++timesConverged >= 2) - && (pDevice->rhsNorm < 1e3 * pDevice->abstol)) { - pDevice->converged = TRUE; - } else if (timesConverged >= 5) { - pDevice->converged = FALSE; - quitLoop = TRUE; - continue; - } - } else if (pDevice->converged && pDevice->poissonOnly) { - TWOQrhsLoad(pDevice); - pDevice->rhsNorm = maxNorm(rhs, size); - if (pDevice->rhsNorm > pDevice->abstol) { - pDevice->converged = FALSE; - } - if (++timesConverged >= 5) { - pDevice->converged = TRUE; - } - } - /* Check if the carrier concentrations are negative. */ - if (pDevice->converged && (!pDevice->poissonOnly)) { - /* Clear garbage entry since carrier-free elements reference it. */ - solution[0] = 0.0; - for (eIndex = 1; eIndex <= pDevice->numElems; eIndex++) { - pElem = pDevice->elements[eIndex]; - for (index = 0; index <= 3; index++) { - if (pElem->evalNodes[index]) { - pNode = pElem->pNodes[index]; - if (solution[pNode->nEqn] < 0.0) { - pDevice->converged = FALSE; - negConc = TRUE; - if (tranAnalysis) { - quitLoop = TRUE; - } else { - solution[pNode->nEqn] = 0.0; - } - } - if (solution[pNode->pEqn] < 0.0) { - pDevice->converged = FALSE; - negConc = TRUE; - if (tranAnalysis) { - quitLoop = TRUE; - } else { - solution[pNode->pEqn] = 0.0; - } - } - } - } - } - if (!pDevice->converged) { - if (!OneCarrier) { - TWO_rhsLoad(pDevice, tranAnalysis, info); - } else if (OneCarrier == N_TYPE) { - TWONrhsLoad(pDevice, tranAnalysis, info); - } else if (OneCarrier == P_TYPE) { - TWOPrhsLoad(pDevice, tranAnalysis, info); - } - pDevice->rhsNorm = maxNorm(rhs, size); - } - } - checkTime += SPfrontEnd->IFseconds() - startTime; - } - totalTime += SPfrontEnd->IFseconds() - totalStartTime; - - if (tranAnalysis) { - pDevice->pStats->loadTime[STAT_TRAN] += loadTime; - pDevice->pStats->factorTime[STAT_TRAN] += factorTime; - pDevice->pStats->solveTime[STAT_TRAN] += solveTime; - pDevice->pStats->updateTime[STAT_TRAN] += updateTime; - pDevice->pStats->checkTime[STAT_TRAN] += checkTime; - pDevice->pStats->numIters[STAT_TRAN] += pDevice->iterationNumber; - } else if (pDevice->poissonOnly) { - pDevice->pStats->loadTime[STAT_SETUP] += loadTime; - pDevice->pStats->factorTime[STAT_SETUP] += factorTime; - pDevice->pStats->solveTime[STAT_SETUP] += solveTime; - pDevice->pStats->updateTime[STAT_SETUP] += updateTime; - pDevice->pStats->checkTime[STAT_SETUP] += checkTime; - pDevice->pStats->numIters[STAT_SETUP] += pDevice->iterationNumber; - } else { - pDevice->pStats->loadTime[STAT_DC] += loadTime; - pDevice->pStats->factorTime[STAT_DC] += factorTime; - pDevice->pStats->solveTime[STAT_DC] += solveTime; - pDevice->pStats->updateTime[STAT_DC] += updateTime; - pDevice->pStats->checkTime[STAT_DC] += checkTime; - pDevice->pStats->numIters[STAT_DC] += pDevice->iterationNumber; - } - - if (debug) { - if (!tranAnalysis) { - pDevice->rhsNorm = maxNorm(rhs, size); - fprintf(stdout, "%7d %11.4e%s\n", - pDevice->iterationNumber, pDevice->rhsNorm, - negConc ? " negative conc in solution" : ""); - } - if (pDevice->converged) { - if (!pDevice->poissonOnly) { - poissNorm = contNorm = 0.0; - rhs[0] = 0.0; /* Make sure garbage entry is clear. */ - for (eIndex = 1; eIndex <= pDevice->numElems; eIndex++) { - pElem = pDevice->elements[eIndex]; - for (index = 0; index <= 3; index++) { - if (pElem->evalNodes[index]) { - pNode = pElem->pNodes[index]; - poissNorm = MAX(poissNorm,ABS(rhs[pNode->psiEqn])); - contNorm = MAX(contNorm,ABS(rhs[pNode->nEqn])); - contNorm = MAX(contNorm,ABS(rhs[pNode->pEqn])); - } - } - } - fprintf(stdout, - "Residual: %11.4e C/um poisson, %11.4e A/um continuity\n", - poissNorm * EpsNorm * VNorm * 1e-4, - contNorm * JNorm * LNorm * 1e-4); - } else { - fprintf(stdout, "Residual: %11.4e C/um poisson\n", - pDevice->rhsNorm * EpsNorm * VNorm * 1e-4); - } - } - } -} - -BOOLEAN -TWOdeltaConverged(TWOdevice *pDevice) -{ - /* This function returns a TRUE if converged else a FALSE. */ - int index; - BOOLEAN converged = TRUE; - double xOld, xNew, tol; - - for (index = 1; index <= pDevice->numEqns; index++) { - xOld = pDevice->dcSolution[index]; - xNew = xOld + pDevice->dcDeltaSolution[index]; - tol = pDevice->abstol + pDevice->reltol * MAX(ABS(xOld), ABS(xNew)); - if (ABS(xOld - xNew) > tol) { - converged = FALSE; - break; - } - } - return (converged); -} - -BOOLEAN -TWOdeviceConverged(TWOdevice *pDevice) -{ - int index, eIndex; - BOOLEAN converged = TRUE; - double *solution = pDevice->dcSolution; - TWOnode *pNode; - TWOelem *pElem; - double startTime; - - /* If the update is sufficiently small, and the carrier concentrations - * are all positive, then return TRUE, else return FALSE. - */ - - /* CHECK CONVERGENCE */ - startTime = SPfrontEnd->IFseconds(); - if ((converged = TWOdeltaConverged(pDevice)) == TRUE) { - for (eIndex = 1; eIndex <= pDevice->numElems; eIndex++) { - pElem = pDevice->elements[eIndex]; - for (index = 0; index <= 3; index++) { - if (pElem->evalNodes[index]) { - pNode = pElem->pNodes[index]; - if (pNode->nEqn != 0 && solution[pNode->nEqn] < 0.0) { - converged = FALSE; - solution[pNode->nEqn] = pNode->nConc = 0.0; - } - if (pNode->pEqn != 0 && solution[pNode->pEqn] < 0.0) { - converged = FALSE; - solution[pNode->pEqn] = pNode->pConc = 0.0; - } - } - } - } - } - pDevice->pStats->checkTime[STAT_TRAN] += SPfrontEnd->IFseconds() - startTime; - - return (converged); -} - -void -TWOresetJacobian(TWOdevice *pDevice) -{ - int error; - - - if (!OneCarrier) { - TWO_jacLoad(pDevice); - } else if (OneCarrier == N_TYPE) { - TWONjacLoad(pDevice); - } else if (OneCarrier == P_TYPE) { - TWOPjacLoad(pDevice); - } else { - printf("TWOresetJacobian: unknown carrier type\n"); - exit(-1); - } - error = spFactor(pDevice->matrix); - if (foundError(error)) { - exit(-1); - } -} - -/* - * Compute the device state assuming charge neutrality exists everywhere in - * the device. In insulators, where there is no charge, assign the potential - * at half the insulator band gap (refPsi). - */ -void -TWOstoreNeutralGuess(TWOdevice *pDevice) -{ - int nIndex, eIndex; - TWOelem *pElem; - TWOnode *pNode; - double nie, conc, absConc, refPsi, psi, ni, pi, sign; - - /* assign the initial guess for Poisson's equation */ - for (eIndex = 1; eIndex <= pDevice->numElems; eIndex++) { - pElem = pDevice->elements[eIndex]; - refPsi = pElem->matlInfo->refPsi; - if (pElem->elemType == INSULATOR) { - for (nIndex = 0; nIndex <= 3; nIndex++) { - if (pElem->evalNodes[nIndex]) { - pNode = pElem->pNodes[nIndex]; - if (pNode->nodeType == CONTACT) { - /* - * a metal contact to insulator domain so use work function - * difference as the value of psi - */ - pNode->psi = RefPsi - pNode->eaff; - } else { - pNode->psi = refPsi; - } - } - } - } - if (pElem->elemType == SEMICON) { - for (nIndex = 0; nIndex <= 3; nIndex++) { - if (pElem->evalNodes[nIndex]) { - pNode = pElem->pNodes[nIndex]; - /* silicon nodes */ - nie = pNode->nie; - conc = pNode->netConc / pNode->nie; - psi = 0.0; - ni = nie; - pi = nie; - sign = SGN(conc); - absConc = ABS(conc); - if (conc != 0.0) { - psi = sign * log(0.5 * absConc - + sqrt(1.0 + 0.25 * absConc * absConc)); - ni = nie * exp(psi); - pi = nie * exp(-psi); - } - pNode->psi = refPsi + psi; - pNode->nConc = ni; - pNode->pConc = pi; - /* store the initial guess in the dc solution vector */ - if (pNode->nodeType != CONTACT) { - pDevice->dcSolution[pNode->poiEqn] = pNode->psi; - } - } - } - } - } -} - -/* computing the equilibrium solution; solution of Poisson's eqn */ -/* the solution is used as an initial starting point for bias conditions */ -int TWOequilSolve(TWOdevice *pDevice) -{ - BOOLEAN newSolver = FALSE; - int error; - int nIndex, eIndex; - TWOelem *pElem; - TWOnode *pNode; - double startTime, setupTime, miscTime; - - setupTime = miscTime = 0.0; - - /* SETUP */ - startTime = SPfrontEnd->IFseconds(); - - /* Set up pDevice to compute the equilibrium solution. If the solver - * is for bias, the arrays must be freed and allocated to the correct - * sizes for an equilibrium solution; if it is a new solver, they are - * only allocated; and if already an equilibrium solve, nothing - * needs to be done */ - /* FALLTHROUGH added to suppress GCC warning due to - * -Wimplicit-fallthrough flag */ - switch (pDevice->solverType) { - case SLV_SMSIG: - case SLV_BIAS: - /* Free memory allocated for the bias solution */ - FREE(pDevice->dcSolution); - FREE(pDevice->dcDeltaSolution); - FREE(pDevice->copiedSolution); - FREE(pDevice->rhs); - FREE(pDevice->rhsImag); - spDestroy(pDevice->matrix); - /* FALLTHROUGH */ - case SLV_NONE: { - /* Allocate memory needed for an equilibrium solution */ - const int n_dim = pDevice->dimEquil; - const int n_eqn = n_dim - 1; - pDevice->poissonOnly = TRUE; - pDevice->numEqns = n_eqn; - XCALLOC(pDevice->dcSolution, double, n_dim); - XCALLOC(pDevice->dcDeltaSolution, double, n_dim); - XCALLOC(pDevice->copiedSolution, double, n_dim); - XCALLOC(pDevice->rhs, double, n_dim); - pDevice->matrix = spCreate(n_eqn, 0, &error); - if (error == spNO_MEMORY) { - (void) fprintf(cp_err, "TWOequilSolve: Out of Memory\n"); - return E_NOMEM; - } - newSolver = TRUE; - spSetReal(pDevice->matrix); /* set to a real matrix */ - TWOQjacBuild(pDevice); - pDevice->numOrigEquil = spElementCount(pDevice->matrix); - pDevice->numFillEquil = 0; - pDevice->solverType = SLV_EQUIL; - break; - } - case SLV_EQUIL: /* Nothing to do if already equilibrium solver */ - break; - default: /* Invalid data */ - fprintf(stderr, "Panic: Unknown solver type in equil solution.\n"); - return E_PANIC; - } /* end of switch over solve type */ - TWOstoreNeutralGuess(pDevice); - setupTime += SPfrontEnd->IFseconds() - startTime; - - /* SOLVE */ - TWOdcSolve(pDevice, MaxIterations, newSolver, FALSE, NULL); - - /* MISCELLANEOUS */ - startTime = SPfrontEnd->IFseconds(); - if (newSolver) { - pDevice->numFillEquil = spFillinCount(pDevice->matrix); - } - if (pDevice->converged) { - TWOQcommonTerms(pDevice); - - /* save equilibrium potential */ - for (eIndex = 1; eIndex <= pDevice->numElems; eIndex++) { - pElem = pDevice->elements[eIndex]; - for (nIndex = 0; nIndex <= 3; nIndex++) { - if (pElem->evalNodes[nIndex]) { - pNode = pElem->pNodes[nIndex]; - pNode->psi0 = pNode->psi; - } - } - } - } else { - printf("TWOequilSolve: No Convergence\n"); - } - miscTime += SPfrontEnd->IFseconds() - startTime; - pDevice->pStats->setupTime[STAT_SETUP] += setupTime; - pDevice->pStats->miscTime[STAT_SETUP] += miscTime; - - return 0; -} - -/* compute the solution under an applied bias */ -/* the equilibrium solution is taken as an initial guess */ -void -TWObiasSolve(TWOdevice *pDevice, int iterationLimit, BOOLEAN tranAnalysis, - TWOtranInfo *info) -{ - BOOLEAN newSolver = FALSE; - int error; - int index, eIndex; - TWOelem *pElem; - TWOnode *pNode; - double refPsi; - double startTime, setupTime, miscTime; - - setupTime = miscTime = 0.0; - - /* SETUP */ - startTime = SPfrontEnd->IFseconds(); - /* Set up for solving for bias */ - /* FALLTHROUGH added to suppress GCC warning due to - * -Wimplicit-fallthrough flag */ - switch (pDevice->solverType) { - case SLV_EQUIL: - /* free up the vectors allocated in the equilibrium solution */ - FREE(pDevice->dcSolution); - FREE(pDevice->dcDeltaSolution); - FREE(pDevice->copiedSolution); - FREE(pDevice->rhs); - spDestroy(pDevice->matrix); - /* FALLTHROUGH */ - case SLV_NONE: - /* Set up for bias */ - pDevice->poissonOnly = FALSE; - pDevice->numEqns = pDevice->dimBias - 1; - XCALLOC(pDevice->dcSolution, double, pDevice->dimBias); - XCALLOC(pDevice->dcDeltaSolution, double, pDevice->dimBias); - XCALLOC(pDevice->copiedSolution, double, pDevice->dimBias); - XCALLOC(pDevice->rhs, double, pDevice->dimBias); - XCALLOC(pDevice->rhsImag, double, pDevice->dimBias); - pDevice->matrix = spCreate(pDevice->numEqns, 1, &error); - if (error == spNO_MEMORY) { - printf("TWObiasSolve: Out of Memory\n"); - exit(-1); - } - newSolver = TRUE; - if (!OneCarrier) { - TWO_jacBuild(pDevice); - } else if (OneCarrier == N_TYPE) { - TWONjacBuild(pDevice); - } else if (OneCarrier == P_TYPE) { - TWOPjacBuild(pDevice); - } - pDevice->numOrigBias = spElementCount(pDevice->matrix); - pDevice->numFillBias = 0; - TWOstoreInitialGuess(pDevice); - /* FALLTHROUGH */ - case SLV_SMSIG: - spSetReal(pDevice->matrix); - pDevice->solverType = SLV_BIAS; - break; - case SLV_BIAS: - break; - default: - fprintf(stderr, "Panic: Unknown solver type in bias solution.\n"); - exit(-1); - break; - } - setupTime += SPfrontEnd->IFseconds() - startTime; - - /* SOLVE */ - TWOdcSolve(pDevice, iterationLimit, newSolver, tranAnalysis, info); - - /* MISCELLANEOUS */ - startTime = SPfrontEnd->IFseconds(); - if (newSolver) { - pDevice->numFillBias = spFillinCount(pDevice->matrix); - } - if ((!pDevice->converged) && iterationLimit > 1) { - printf("TWObiasSolve: No Convergence\n"); - } else if (pDevice->converged) { - /* update the nodal quantities */ - for (eIndex = 1; eIndex <= pDevice->numElems; eIndex++) { - pElem = pDevice->elements[eIndex]; - refPsi = pElem->matlInfo->refPsi; - for (index = 0; index <= 3; index++) { - if (pElem->evalNodes[index]) { - pNode = pElem->pNodes[index]; - if (pNode->nodeType != CONTACT) { - pNode->psi = pDevice->dcSolution[pNode->psiEqn]; - if (pElem->elemType == SEMICON) { - if (!OneCarrier) { - pNode->nConc = pDevice->dcSolution[pNode->nEqn]; - pNode->pConc = pDevice->dcSolution[pNode->pEqn]; - } else if (OneCarrier == N_TYPE) { - pNode->nConc = pDevice->dcSolution[pNode->nEqn]; - pNode->pConc = pNode->nie * exp(-pNode->psi + refPsi); - } else if (OneCarrier == P_TYPE) { - pNode->pConc = pDevice->dcSolution[pNode->pEqn]; - pNode->nConc = pNode->nie * exp(pNode->psi - refPsi); - } - } - } - } - } - } - - /* update the current terms */ - if (!OneCarrier) { - TWO_commonTerms(pDevice, FALSE, tranAnalysis, info); - } else if (OneCarrier == N_TYPE) { - TWONcommonTerms(pDevice, FALSE, tranAnalysis, info); - } else if (OneCarrier == P_TYPE) { - TWOPcommonTerms(pDevice, FALSE, tranAnalysis, info); - } - } else if (iterationLimit <= 1) { - for (eIndex = 1; eIndex <= pDevice->numElems; eIndex++) { - pElem = pDevice->elements[eIndex]; - refPsi = pElem->matlInfo->refPsi; - for (index = 0; index <= 3; index++) { - if (pElem->evalNodes[index]) { - pNode = pElem->pNodes[index]; - if (pNode->nodeType != CONTACT) { - pNode->psi = pDevice->dcSolution[pNode->psiEqn]; - pDevice->devState0 [pNode->nodePsi] = pNode->psi; - if (pElem->elemType == SEMICON) { - if (!OneCarrier) { - pNode->nConc = pDevice->dcSolution[pNode->nEqn]; - pNode->pConc = pDevice->dcSolution[pNode->pEqn]; - } else if (OneCarrier == N_TYPE) { - pNode->nConc = pDevice->dcSolution[pNode->nEqn]; - pNode->pConc = pNode->nie * exp(-pNode->psi + refPsi); - } else if (OneCarrier == P_TYPE) { - pNode->pConc = pDevice->dcSolution[pNode->pEqn]; - pNode->nConc = pNode->nie * exp(pNode->psi - refPsi); - } - pDevice->devState0 [pNode->nodeN] = pNode->nConc; - pDevice->devState0 [pNode->nodeP] = pNode->pConc; - } - } - } - } - } - } - miscTime += SPfrontEnd->IFseconds() - startTime; - if (tranAnalysis) { - pDevice->pStats->setupTime[STAT_TRAN] += setupTime; - pDevice->pStats->miscTime[STAT_TRAN] += miscTime; - } else { - pDevice->pStats->setupTime[STAT_DC] += setupTime; - pDevice->pStats->miscTime[STAT_DC] += miscTime; - } -} - -/* Copy the device's equilibrium state into the solution vector. */ -void -TWOstoreEquilibGuess(TWOdevice *pDevice) -{ - int nIndex, eIndex; - double *solution = pDevice->dcSolution; - double refPsi; - TWOelem *pElem; - TWOnode *pNode; - - for (eIndex = 1; eIndex <= pDevice->numElems; eIndex++) { - pElem = pDevice->elements[eIndex]; - refPsi = pElem->matlInfo->refPsi; - for (nIndex = 0; nIndex <= 3; nIndex++) { - if (pElem->evalNodes[nIndex]) { - pNode = pElem->pNodes[nIndex]; - if (pNode->nodeType != CONTACT) { - pDevice->dcSolution[pNode->psiEqn] = pNode->psi0; - if (pElem->elemType == SEMICON) { - if (!OneCarrier) { - solution[pNode->nEqn] = pNode->nie * exp(pNode->psi0 - refPsi); - solution[pNode->pEqn] = pNode->nie * exp(-pNode->psi0 + refPsi); - } else if (OneCarrier == N_TYPE) { - solution[pNode->nEqn] = pNode->nie * exp(pNode->psi0 - refPsi); - } else if (OneCarrier == P_TYPE) { - solution[pNode->pEqn] = pNode->nie * exp(-pNode->psi0 + refPsi); - } - } - } - } - } - } -} - -/* Copy the device's internal state into the solution vector. */ -void -TWOstoreInitialGuess(TWOdevice *pDevice) -{ - int nIndex, eIndex; - double *solution = pDevice->dcSolution; - TWOelem *pElem; - TWOnode *pNode; - - for (eIndex = 1; eIndex <= pDevice->numElems; eIndex++) { - pElem = pDevice->elements[eIndex]; - for (nIndex = 0; nIndex <= 3; nIndex++) { - if (pElem->evalNodes[nIndex]) { - pNode = pElem->pNodes[nIndex]; - if (pNode->nodeType != CONTACT) { - solution[pNode->psiEqn] = pNode->psi; - if (pElem->elemType == SEMICON) { - if (!OneCarrier) { - solution[pNode->nEqn] = pNode->nConc; - solution[pNode->pEqn] = pNode->pConc; - } else if (OneCarrier == N_TYPE) { - solution[pNode->nEqn] = pNode->nConc; - } else if (OneCarrier == P_TYPE) { - solution[pNode->pEqn] = pNode->pConc; - } - } - } - } - } - } -} - - -/* - * function computeNewDelta computes an acceptable delta - */ - -void -oldTWOnewDelta(TWOdevice *pDevice, BOOLEAN tranAnalysis, TWOtranInfo *info) -{ - int index; - double newNorm, fib, lambda, fibn, fibp; - BOOLEAN acceptable = FALSE; - lambda = 1.0; - fibn = 1.0; - fibp = 1.0; - - /* - * copy the contents of dcSolution into copiedSolution and modify - * dcSolution by adding the deltaSolution - */ - - for (index = 1; index <= pDevice->numEqns; ++index) { - pDevice->copiedSolution[index] = pDevice->dcSolution[index]; - pDevice->dcSolution[index] += pDevice->dcDeltaSolution[index]; - } - - /* compute L2 norm of the deltaX vector */ - pDevice->rhsNorm = l2Norm(pDevice->dcDeltaSolution, pDevice->numEqns); - - if (pDevice->poissonOnly) { - TWOQrhsLoad(pDevice); - } else if (!OneCarrier) { - TWO_rhsLoad(pDevice, tranAnalysis, info); - } else if (OneCarrier == N_TYPE) { - TWONrhsLoad(pDevice, tranAnalysis, info); - } else if (OneCarrier == P_TYPE) { - TWOPrhsLoad(pDevice, tranAnalysis, info); - } - newNorm = TWOnuNorm(pDevice); - if (newNorm <= pDevice->rhsNorm) { - acceptable = TRUE; - } else { - /* chop the step size so that deltax is acceptable */ - for (; !acceptable;) { - fib = fibp; - fibp = fibn; - fibn += fib; - lambda *= (fibp / fibn); - - for (index = 1; index <= pDevice->numEqns; index++) { - pDevice->dcSolution[index] = pDevice->copiedSolution[index] - + lambda * pDevice->dcDeltaSolution[index]; - } - if (pDevice->poissonOnly) { - TWOQrhsLoad(pDevice); - } else if (!OneCarrier) { - TWO_rhsLoad(pDevice, tranAnalysis, info); - } else if (OneCarrier == N_TYPE) { - TWONrhsLoad(pDevice, tranAnalysis, info); - } else if (OneCarrier == P_TYPE) { - TWOPrhsLoad(pDevice, tranAnalysis, info); - } - newNorm = TWOnuNorm(pDevice); - if (newNorm <= pDevice->rhsNorm) { - acceptable = TRUE; - } - } - } - /* restore the previous dcSolution and the new deltaSolution */ - pDevice->rhsNorm = newNorm; - for (index = 1; index <= pDevice->numEqns; index++) { - pDevice->dcSolution[index] = pDevice->copiedSolution[index]; - pDevice->dcDeltaSolution[index] *= lambda; - } -} - - - -int -TWOnewDelta(TWOdevice *pDevice, BOOLEAN tranAnalysis, TWOtranInfo *info) -{ - int index, iterNum = 0; - double newNorm; - double fib, lambda, fibn, fibp; - BOOLEAN acceptable = FALSE, error = FALSE; - - lambda = 1.0; - fibn = 1.0; - fibp = 1.0; - - /* - * copy the contents of dcSolution into copiedSolution and modify - * dcSolution by adding the deltaSolution - */ - - for (index = 1; index <= pDevice->numEqns; ++index) { - pDevice->copiedSolution[index] = pDevice->dcSolution[index]; - pDevice->dcSolution[index] += pDevice->dcDeltaSolution[index]; - } - - if (pDevice->poissonOnly) { - TWOQrhsLoad(pDevice); - } else if (!OneCarrier) { - TWO_rhsLoad(pDevice, tranAnalysis, info); - } else if (OneCarrier == N_TYPE) { - TWONrhsLoad(pDevice, tranAnalysis, info); - } else if (OneCarrier == P_TYPE) { - TWOPrhsLoad(pDevice, tranAnalysis, info); - } - newNorm = maxNorm(pDevice->rhs, pDevice->numEqns); - if (pDevice->rhsNorm <= pDevice->abstol) { - lambda = 0.0; - newNorm = pDevice->rhsNorm; - } else if (newNorm < pDevice->rhsNorm) { - acceptable = TRUE; - } else { - /* chop the step size so that deltax is acceptable */ - if (TWOdcDebug) { - fprintf(stdout, " %11.4e %11.4e\n", - newNorm, lambda); - } - while (!acceptable) { - iterNum++; - - if (iterNum > NORM_RED_MAXITERS) { - error = TRUE; - lambda = 0.0; - /* Don't break out until after we've reset the device. */ - } - fib = fibp; - fibp = fibn; - fibn += fib; - lambda *= (fibp / fibn); - - for (index = 1; index <= pDevice->numEqns; index++) { - pDevice->dcSolution[index] = pDevice->copiedSolution[index] - + lambda * pDevice->dcDeltaSolution[index]; - } - if (pDevice->poissonOnly) { - TWOQrhsLoad(pDevice); - } else if (!OneCarrier) { - TWO_rhsLoad(pDevice, tranAnalysis, info); - } else if (OneCarrier == N_TYPE) { - TWONrhsLoad(pDevice, tranAnalysis, info); - } else if (OneCarrier == P_TYPE) { - TWOPrhsLoad(pDevice, tranAnalysis, info); - } - newNorm = maxNorm(pDevice->rhs, pDevice->numEqns); - if (error) { - break; - } - if (newNorm <= pDevice->rhsNorm) { - acceptable = TRUE; - } - if (TWOdcDebug) { - fprintf(stdout, " %11.4e %11.4e\n", - newNorm, lambda); - } - } - } - /* restore the previous dcSolution and the new deltaSolution */ - pDevice->rhsNorm = newNorm; - for (index = 1; index <= pDevice->numEqns; index++) { - pDevice->dcSolution[index] = pDevice->copiedSolution[index]; - pDevice->dcDeltaSolution[index] *= lambda; - } - return (error); -} - - -/* Predict the values of the internal variables at the next timepoint. */ -/* Needed for Predictor-Corrector LTE estimation */ -void -TWOpredict(TWOdevice *pDevice, TWOtranInfo *info) -{ - int nIndex, eIndex; - TWOnode *pNode; - TWOelem *pElem; - double startTime, miscTime = 0.0; - - /* TRANSIENT MISC */ - startTime = SPfrontEnd->IFseconds(); - for (eIndex = 1; eIndex <= pDevice->numElems; eIndex++) { - pElem = pDevice->elements[eIndex]; - for (nIndex = 0; nIndex <= 3; nIndex++) { - if (pElem->evalNodes[nIndex]) { - pNode = pElem->pNodes[nIndex]; - pNode->psi = pDevice->devState1 [pNode->nodePsi]; - if ((pElem->elemType == SEMICON) && (pNode->nodeType != CONTACT)) { - if (!OneCarrier) { - pNode->nPred = predict(pDevice->devStates, info, pNode->nodeN); - pNode->pPred = predict(pDevice->devStates, info, pNode->nodeP); - } else if (OneCarrier == N_TYPE) { - pNode->nPred = predict(pDevice->devStates, info, pNode->nodeN); - pNode->pPred = pDevice->devState1 [pNode->nodeP]; - } else if (OneCarrier == P_TYPE) { - pNode->pPred = predict(pDevice->devStates, info, pNode->nodeP); - pNode->nPred = pDevice->devState1 [pNode->nodeN]; - } - pNode->nConc = pNode->nPred; - pNode->pConc = pNode->pPred; - } - } - } - } - miscTime += SPfrontEnd->IFseconds() - startTime; - pDevice->pStats->miscTime[STAT_TRAN] += miscTime; -} - - -/* Estimate the device's overall truncation error. */ -double -TWOtrunc(TWOdevice *pDevice, TWOtranInfo *info, double delta) -{ - int nIndex, eIndex; - TWOelem *pElem; - TWOnode *pNode; - double tolN, tolP, lte, relError, temp; - double lteCoeff = info->lteCoeff; - double mult = 10.0; - double reltol; - double startTime, lteTime = 0.0; - - /* TRANSIENT LTE */ - startTime = SPfrontEnd->IFseconds(); - - relError = 0.0; - reltol = pDevice->reltol * mult; - - /* need to get the predictor for the current order */ - /* the scheme currently used is very dumb. need to fix later */ - computePredCoeff(info->method, info->order, info->predCoeff, info->delta); - - for (eIndex = 1; eIndex <= pDevice->numElems; eIndex++) { - pElem = pDevice->elements[eIndex]; - for (nIndex = 0; nIndex <= 3; nIndex++) { - if (pElem->evalNodes[nIndex]) { - pNode = pElem->pNodes[nIndex]; - if ((pElem->elemType == SEMICON) && (pNode->nodeType != CONTACT)) { - if (!OneCarrier) { - tolN = pDevice->abstol + reltol * ABS(pNode->nConc); - tolP = pDevice->abstol + reltol * ABS(pNode->pConc); - pNode->nPred = predict(pDevice->devStates, info, pNode->nodeN); - pNode->pPred = predict(pDevice->devStates, info, pNode->nodeP); - lte = lteCoeff * (pNode->nConc - pNode->nPred); - temp = lte / tolN; - relError += temp * temp; - lte = lteCoeff * (pNode->pConc - pNode->pPred); - temp = lte / tolP; - relError += temp * temp; - } else if (OneCarrier == N_TYPE) { - tolN = pDevice->abstol + reltol * ABS(pNode->nConc); - pNode->nPred = predict(pDevice->devStates, info, pNode->nodeN); - lte = lteCoeff * (pNode->nConc - pNode->nPred); - temp = lte / tolN; - relError += temp * temp; - } else if (OneCarrier == P_TYPE) { - tolP = pDevice->abstol + reltol * ABS(pNode->pConc); - pNode->pPred = predict(pDevice->devStates, info, pNode->nodeP); - lte = lteCoeff * (pNode->pConc - pNode->pPred); - temp = lte / tolP; - relError += temp * temp; - } - } - } - } - } - - relError = MAX(pDevice->abstol, relError); /* make sure it is non zero */ - - /* the total relative error has been calculated norm-2 squared */ - relError = sqrt(relError / pDevice->numEqns); - - /* depending on the order of the integration method compute new delta */ - temp = delta / pow(relError, 1.0 / (info->order + 1)); - - lteTime += SPfrontEnd->IFseconds() - startTime; - pDevice->pStats->lteTime += lteTime; - - /* return the new delta (stored as temp) */ - return (temp); -} - -/* Save info from state table into the internal state. */ -void -TWOsaveState(TWOdevice *pDevice) -{ - int nIndex, eIndex; - TWOnode *pNode; - TWOelem *pElem; - - for (eIndex = 1; eIndex <= pDevice->numElems; eIndex++) { - pElem = pDevice->elements[eIndex]; - for (nIndex = 0; nIndex <= 3; nIndex++) { - if (pElem->evalNodes[nIndex]) { - pNode = pElem->pNodes[nIndex]; - pNode->psi = pDevice->devState1 [pNode->nodePsi]; - if ((pElem->elemType == SEMICON) && (pNode->nodeType != CONTACT)) { - pNode->nConc = pDevice->devState1 [pNode->nodeN]; - pNode->pConc = pDevice->devState1 [pNode->nodeP]; - } - } - } - } -} - -/* - * A function that checks convergence based on the convergence of the quasi - * Fermi levels. This should be better since we are looking at potentials in - * all (psi, phin, phip) - */ -BOOLEAN -TWOpsiDeltaConverged(TWOdevice *pDevice) -{ - int index, nIndex, eIndex; - TWOnode *pNode; - TWOelem *pElem; - double xOld, xNew, xDelta, tol; - double psi, newPsi, nConc, pConc, newN, newP; - double phiN, phiP, newPhiN, newPhiP; - BOOLEAN converged = TRUE; - - /* equilibrium solution */ - if (pDevice->poissonOnly) { - for (index = 1; index <= pDevice->numEqns; index++) { - xOld = pDevice->dcSolution[index]; - xDelta = pDevice->dcDeltaSolution[index]; - xNew = xOld + xDelta; - tol = pDevice->abstol + pDevice->reltol * MAX(ABS(xOld), ABS(xNew)); - if (ABS(xDelta) > tol) { - converged = FALSE; - goto done; - } - } - return (converged); - } - /* bias solution. check convergence on psi, phin, phip */ - for (eIndex = 1; eIndex <= pDevice->numElems; eIndex++) { - pElem = pDevice->elements[eIndex]; - for (nIndex = 0; nIndex <= 3; nIndex++) { - if (pElem->evalNodes[nIndex]) { - pNode = pElem->pNodes[nIndex]; - if (pNode->nodeType != CONTACT) { - /* check convergence on psi */ - xOld = pDevice->dcSolution[pNode->psiEqn]; - xDelta = pDevice->dcDeltaSolution[pNode->psiEqn]; - xNew = xOld + xDelta; - tol = pDevice->abstol + - pDevice->reltol * MAX(ABS(xOld), ABS(xNew)); - if (ABS(xDelta) > tol) { - converged = FALSE; - goto done; - } - } - /* check convergence on phin and phip */ - if ((pElem->elemType == SEMICON) && (pNode->nodeType != CONTACT)) { - psi = pDevice->dcSolution[pNode->psiEqn]; - nConc = pDevice->dcSolution[pNode->nEqn]; - pConc = pDevice->dcSolution[pNode->pEqn]; - newPsi = psi + pDevice->dcDeltaSolution[pNode->psiEqn]; - newN = nConc + pDevice->dcDeltaSolution[pNode->nEqn]; - newP = pConc + pDevice->dcDeltaSolution[pNode->pEqn]; - phiN = psi - log(nConc / pNode->nie); - phiP = psi + log(pConc / pNode->nie); - newPhiN = newPsi - log(newN / pNode->nie); - newPhiP = newPsi + log(newP / pNode->nie); - tol = pDevice->abstol + pDevice->reltol * MAX(ABS(phiN), ABS(newPhiN)); - if (ABS(newPhiN - phiN) > tol) { - converged = FALSE; - goto done; - } - tol = pDevice->abstol + pDevice->reltol * MAX(ABS(phiP), ABS(newPhiP)); - if (ABS(newPhiP - phiP) > tol) { - converged = FALSE; - goto done; - } - } - } - } - } -done: - return (converged); -} - - -/* Function to compute Nu norm of the rhs vector. */ -/* nu-Norm calculation based upon work done at Stanford. */ -double -TWOnuNorm(TWOdevice *pDevice) -{ - double norm = 0.0; - double temp; - int index; - - /* the LU Decomposed matrix is available. use it to calculate x */ - - spSolve(pDevice->matrix, pDevice->rhs, pDevice->rhsImag, - NULL, NULL); - - /* the solution is in the rhsImag vector */ - /* compute L2-norm of the rhsImag vector */ - - for (index = 1; index <= pDevice->numEqns; index++) { - temp = pDevice->rhsImag[index]; - norm += temp * temp; - } - norm = sqrt(norm); - return (norm); -} - -/* - * Check for numerical errors in the Jacobian. Useful debugging aid when new - * models are being incorporated. - */ -void -TWOjacCheck(TWOdevice *pDevice, BOOLEAN tranAnalysis, TWOtranInfo *info) -{ - int index, rIndex; - double del, diff, tol, *dptr; - - if (TWOjacDebug) { - if (!OneCarrier) { - TWO_sysLoad(pDevice, tranAnalysis, info); - } else if (OneCarrier == N_TYPE) { - TWONsysLoad(pDevice, tranAnalysis, info); - } else if (OneCarrier == P_TYPE) { - TWOPsysLoad(pDevice, tranAnalysis, info); - } - /* - * spPrint( pDevice->matrix, 0, 1, 1 ); - */ - pDevice->rhsNorm = maxNorm(pDevice->rhs, pDevice->numEqns); - for (index = 1; index <= pDevice->numEqns; index++) { - if (1e3 * ABS(pDevice->rhs[index]) > pDevice->rhsNorm) { - fprintf(stderr, "eqn %d: res %11.4e, norm %11.4e\n", - index, pDevice->rhs[index], pDevice->rhsNorm); - } - } - for (index = 1; index <= pDevice->numEqns; index++) { - pDevice->rhsImag[index] = pDevice->rhs[index]; - } - for (index = 1; index <= pDevice->numEqns; index++) { - pDevice->copiedSolution[index] = pDevice->dcSolution[index]; - del = 1e-4 * pDevice->abstol + 1e-6 * ABS(pDevice->dcSolution[index]); - pDevice->dcSolution[index] += del; - if (!OneCarrier) { - TWO_rhsLoad(pDevice, tranAnalysis, info); - } else if (OneCarrier == N_TYPE) { - TWONrhsLoad(pDevice, tranAnalysis, info); - } else if (OneCarrier == P_TYPE) { - TWOPrhsLoad(pDevice, tranAnalysis, info); - } - pDevice->dcSolution[index] = pDevice->copiedSolution[index]; - for (rIndex = 1; rIndex <= pDevice->numEqns; rIndex++) { - diff = (pDevice->rhsImag[rIndex] - pDevice->rhs[rIndex]) / del; - dptr = spFindElement(pDevice->matrix, rIndex, index); - if (dptr != NULL) { - tol = (1e-4 * pDevice->abstol) + (1e-2 * MAX(ABS(diff), ABS(*dptr))); - if ((diff != 0.0) && (ABS(diff - *dptr) > tol)) { - fprintf(stderr, "Mismatch[%d][%d]: FD = %11.4e, AJ = %11.4e\n\t FD-AJ = %11.4e vs. %11.4e\n", - rIndex, index, diff, *dptr, - ABS(diff - *dptr), tol); - } - } else { - if (diff != 0.0) { - fprintf(stderr, "Missing [%d][%d]: FD = %11.4e, AJ = 0.0\n", - rIndex, index, diff); - } - } - } - } - } -} diff --git a/src/conf.c b/src/conf.c index aad7dc6c6..7c79114f3 100644 --- a/src/conf.c +++ b/src/conf.c @@ -12,7 +12,7 @@ #endif char Spice_Version[] = PACKAGE_VERSION; -char Spice_Notice[] = "Please file your bug-reports at " BUG_ADDRESS; +char Spice_Notice[] = "This build contains only: BJT, MOS1, Ind, Cap, Res, Current & voltage sources!"; #ifndef _MSC_VER char Spice_Build_Date[] = NGSPICEBUILDDATE; #else diff --git a/src/ngspice.c b/src/ngspice.c index f4ae3445f..e1baef183 100644 --- a/src/ngspice.c +++ b/src/ngspice.c @@ -28,7 +28,7 @@ static IFparm nodeParms[] = { IFsimulator SIMinfo = { "ngspice", /* my name */ - "Circuit level simulation program", /* more about me */ + "Circuit level simulation program, minimal version", /* more about me */ Spice_Version, /* my version */ CKTinit, /* newCircuit function */ diff --git a/src/spicelib/devices/Makefile.am b/src/spicelib/devices/Makefile.am index bc6674611..87782d76c 100644 --- a/src/spicelib/devices/Makefile.am +++ b/src/spicelib/devices/Makefile.am @@ -1,125 +1,26 @@ ## Process this file with automake to produce Makefile.in SUBDIRS = \ - asrc \ bjt \ - bsim1 \ - bsim2 \ - bsim3 \ - bsimsoi \ - bsim4 \ - bsim4v5 \ - bsim4v6 \ - bsim4v7 \ - bsim3v0 \ - bsim3v1 \ - bsim3v32 \ - bsim3soi_pd \ - bsim3soi_fd \ - bsim3soi_dd \ cap \ - cccs \ - ccvs \ - cpl \ - csw \ dio \ ind \ isrc \ - hfet1 \ - hfet2 \ - hicum2 \ - hisim2 \ - hisimhv1 \ - hisimhv2 \ - jfet \ - jfet2 \ - ltra \ - mes \ - mesa \ mos1 \ - mos2 \ - mos3 \ - mos6 \ - mos9 \ res \ - soi3 \ - sw \ - tra \ - txl \ - urc \ - vbic \ - vccs \ - vcvs \ - vdmos \ vsrc \ @VLADEVDIR@ -if NDEV_WANTED -SUBDIRS += ndev -endif - -if NUMDEV_WANTED -SUBDIRS += nbjt nbjt2 numd numd2 numos -endif - DIST_SUBDIRS = \ - asrc \ bjt \ - bsim1 \ - bsim2 \ - bsim3 \ - bsimsoi \ - bsim4 \ - bsim4v5 \ - bsim4v6 \ - bsim4v7 \ - bsim3v0 \ - bsim3v1 \ - bsim3v32 \ - bsim3soi_pd \ - bsim3soi_fd \ - bsim3soi_dd \ cap \ - cccs \ - ccvs \ - cpl \ - csw \ dio \ ind \ isrc \ - hfet1 \ - hfet2 \ - hicum2 \ - hisim2 \ - hisimhv1 \ - hisimhv2 \ - jfet \ - jfet2 \ - ltra \ - mes \ - mesa \ mos1 \ - mos2 \ - mos3 \ - mos6 \ - mos9 \ - ndev \ res \ - soi3 \ - sw \ - tra \ - txl \ - urc \ - vbic \ - vccs \ - vcvs \ - vdmos \ - vsrc \ - nbjt \ - nbjt2 \ - numd \ - numd2 \ - numos + vsrc + noinst_LTLIBRARIES = libdev.la diff --git a/src/spicelib/devices/adms/admst/COPYING b/src/spicelib/devices/adms/admst/COPYING deleted file mode 100644 index 12f7f3f21..000000000 --- a/src/spicelib/devices/adms/admst/COPYING +++ /dev/null @@ -1,674 +0,0 @@ - GNU GENERAL PUBLIC LICENSE - Version 3, 29 June 2007 - - Copyright (C) 2007 Free Software Foundation, Inc. - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - Preamble - - The GNU General Public License is a free, copyleft license for -software and other kinds of works. - - The licenses for most software and other practical works are designed -to take away your freedom to share and change the works. By contrast, -the GNU General Public License is intended to guarantee your freedom to -share and change all versions of a program--to make sure it remains free -software for all its users. We, the Free Software Foundation, use the -GNU General Public License for most of our software; it applies also to -any other work released this way by its authors. You can apply it to -your programs, too. - - When we speak of free software, we are referring to freedom, not -price. Our General Public Licenses are designed to make sure that you -have the freedom to distribute copies of free software (and charge for -them if you wish), that you receive source code or can get it if you -want it, that you can change the software or use pieces of it in new -free programs, and that you know you can do these things. - - To protect your rights, we need to prevent others from denying you -these rights or asking you to surrender the rights. Therefore, you have -certain responsibilities if you distribute copies of the software, or if -you modify it: responsibilities to respect the freedom of others. - - For example, if you distribute copies of such a program, whether -gratis or for a fee, you must pass on to the recipients the same -freedoms that you received. You must make sure that they, too, receive -or can get the source code. And you must show them these terms so they -know their rights. - - Developers that use the GNU GPL protect your rights with two steps: -(1) assert copyright on the software, and (2) offer you this License -giving you legal permission to copy, distribute and/or modify it. - - For the developers' and authors' protection, the GPL clearly explains -that there is no warranty for this free software. For both users' and -authors' sake, the GPL requires that modified versions be marked as -changed, so that their problems will not be attributed erroneously to -authors of previous versions. - - Some devices are designed to deny users access to install or run -modified versions of the software inside them, although the manufacturer -can do so. This is fundamentally incompatible with the aim of -protecting users' freedom to change the software. The systematic -pattern of such abuse occurs in the area of products for individuals to -use, which is precisely where it is most unacceptable. Therefore, we -have designed this version of the GPL to prohibit the practice for those -products. If such problems arise substantially in other domains, we -stand ready to extend this provision to those domains in future versions -of the GPL, as needed to protect the freedom of users. - - Finally, every program is threatened constantly by software patents. -States should not allow patents to restrict development and use of -software on general-purpose computers, but in those that do, we wish to -avoid the special danger that patents applied to a free program could -make it effectively proprietary. To prevent this, the GPL assures that -patents cannot be used to render the program non-free. - - The precise terms and conditions for copying, distribution and -modification follow. - - TERMS AND CONDITIONS - - 0. Definitions. - - "This License" refers to version 3 of the GNU General Public License. - - "Copyright" also means copyright-like laws that apply to other kinds of -works, such as semiconductor masks. - - "The Program" refers to any copyrightable work licensed under this -License. Each licensee is addressed as "you". "Licensees" and -"recipients" may be individuals or organizations. - - To "modify" a work means to copy from or adapt all or part of the work -in a fashion requiring copyright permission, other than the making of an -exact copy. The resulting work is called a "modified version" of the -earlier work or a work "based on" the earlier work. - - A "covered work" means either the unmodified Program or a work based -on the Program. - - To "propagate" a work means to do anything with it that, without -permission, would make you directly or secondarily liable for -infringement under applicable copyright law, except executing it on a -computer or modifying a private copy. Propagation includes copying, -distribution (with or without modification), making available to the -public, and in some countries other activities as well. - - To "convey" a work means any kind of propagation that enables other -parties to make or receive copies. Mere interaction with a user through -a computer network, with no transfer of a copy, is not conveying. - - An interactive user interface displays "Appropriate Legal Notices" -to the extent that it includes a convenient and prominently visible -feature that (1) displays an appropriate copyright notice, and (2) -tells the user that there is no warranty for the work (except to the -extent that warranties are provided), that licensees may convey the -work under this License, and how to view a copy of this License. If -the interface presents a list of user commands or options, such as a -menu, a prominent item in the list meets this criterion. - - 1. Source Code. - - The "source code" for a work means the preferred form of the work -for making modifications to it. "Object code" means any non-source -form of a work. - - A "Standard Interface" means an interface that either is an official -standard defined by a recognized standards body, or, in the case of -interfaces specified for a particular programming language, one that -is widely used among developers working in that language. - - The "System Libraries" of an executable work include anything, other -than the work as a whole, that (a) is included in the normal form of -packaging a Major Component, but which is not part of that Major -Component, and (b) serves only to enable use of the work with that -Major Component, or to implement a Standard Interface for which an -implementation is available to the public in source code form. A -"Major Component", in this context, means a major essential component -(kernel, window system, and so on) of the specific operating system -(if any) on which the executable work runs, or a compiler used to -produce the work, or an object code interpreter used to run it. - - The "Corresponding Source" for a work in object code form means all -the source code needed to generate, install, and (for an executable -work) run the object code and to modify the work, including scripts to -control those activities. However, it does not include the work's -System Libraries, or general-purpose tools or generally available free -programs which are used unmodified in performing those activities but -which are not part of the work. For example, Corresponding Source -includes interface definition files associated with source files for -the work, and the source code for shared libraries and dynamically -linked subprograms that the work is specifically designed to require, -such as by intimate data communication or control flow between those -subprograms and other parts of the work. - - The Corresponding Source need not include anything that users -can regenerate automatically from other parts of the Corresponding -Source. - - The Corresponding Source for a work in source code form is that -same work. - - 2. Basic Permissions. - - All rights granted under this License are granted for the term of -copyright on the Program, and are irrevocable provided the stated -conditions are met. This License explicitly affirms your unlimited -permission to run the unmodified Program. The output from running a -covered work is covered by this License only if the output, given its -content, constitutes a covered work. This License acknowledges your -rights of fair use or other equivalent, as provided by copyright law. - - You may make, run and propagate covered works that you do not -convey, without conditions so long as your license otherwise remains -in force. You may convey covered works to others for the sole purpose -of having them make modifications exclusively for you, or provide you -with facilities for running those works, provided that you comply with -the terms of this License in conveying all material for which you do -not control copyright. Those thus making or running the covered works -for you must do so exclusively on your behalf, under your direction -and control, on terms that prohibit them from making any copies of -your copyrighted material outside their relationship with you. - - Conveying under any other circumstances is permitted solely under -the conditions stated below. Sublicensing is not allowed; section 10 -makes it unnecessary. - - 3. Protecting Users' Legal Rights From Anti-Circumvention Law. - - No covered work shall be deemed part of an effective technological -measure under any applicable law fulfilling obligations under article -11 of the WIPO copyright treaty adopted on 20 December 1996, or -similar laws prohibiting or restricting circumvention of such -measures. - - When you convey a covered work, you waive any legal power to forbid -circumvention of technological measures to the extent such circumvention -is effected by exercising rights under this License with respect to -the covered work, and you disclaim any intention to limit operation or -modification of the work as a means of enforcing, against the work's -users, your or third parties' legal rights to forbid circumvention of -technological measures. - - 4. Conveying Verbatim Copies. - - You may convey verbatim copies of the Program's source code as you -receive it, in any medium, provided that you conspicuously and -appropriately publish on each copy an appropriate copyright notice; -keep intact all notices stating that this License and any -non-permissive terms added in accord with section 7 apply to the code; -keep intact all notices of the absence of any warranty; and give all -recipients a copy of this License along with the Program. - - You may charge any price or no price for each copy that you convey, -and you may offer support or warranty protection for a fee. - - 5. Conveying Modified Source Versions. - - You may convey a work based on the Program, or the modifications to -produce it from the Program, in the form of source code under the -terms of section 4, provided that you also meet all of these conditions: - - a) The work must carry prominent notices stating that you modified - it, and giving a relevant date. - - b) The work must carry prominent notices stating that it is - released under this License and any conditions added under section - 7. This requirement modifies the requirement in section 4 to - "keep intact all notices". - - c) You must license the entire work, as a whole, under this - License to anyone who comes into possession of a copy. This - License will therefore apply, along with any applicable section 7 - additional terms, to the whole of the work, and all its parts, - regardless of how they are packaged. This License gives no - permission to license the work in any other way, but it does not - invalidate such permission if you have separately received it. - - d) If the work has interactive user interfaces, each must display - Appropriate Legal Notices; however, if the Program has interactive - interfaces that do not display Appropriate Legal Notices, your - work need not make them do so. - - A compilation of a covered work with other separate and independent -works, which are not by their nature extensions of the covered work, -and which are not combined with it such as to form a larger program, -in or on a volume of a storage or distribution medium, is called an -"aggregate" if the compilation and its resulting copyright are not -used to limit the access or legal rights of the compilation's users -beyond what the individual works permit. Inclusion of a covered work -in an aggregate does not cause this License to apply to the other -parts of the aggregate. - - 6. Conveying Non-Source Forms. - - You may convey a covered work in object code form under the terms -of sections 4 and 5, provided that you also convey the -machine-readable Corresponding Source under the terms of this License, -in one of these ways: - - a) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by the - Corresponding Source fixed on a durable physical medium - customarily used for software interchange. - - b) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by a - written offer, valid for at least three years and valid for as - long as you offer spare parts or customer support for that product - model, to give anyone who possesses the object code either (1) a - copy of the Corresponding Source for all the software in the - product that is covered by this License, on a durable physical - medium customarily used for software interchange, for a price no - more than your reasonable cost of physically performing this - conveying of source, or (2) access to copy the - Corresponding Source from a network server at no charge. - - c) Convey individual copies of the object code with a copy of the - written offer to provide the Corresponding Source. This - alternative is allowed only occasionally and noncommercially, and - only if you received the object code with such an offer, in accord - with subsection 6b. - - d) Convey the object code by offering access from a designated - place (gratis or for a charge), and offer equivalent access to the - Corresponding Source in the same way through the same place at no - further charge. You need not require recipients to copy the - Corresponding Source along with the object code. If the place to - copy the object code is a network server, the Corresponding Source - may be on a different server (operated by you or a third party) - that supports equivalent copying facilities, provided you maintain - clear directions next to the object code saying where to find the - Corresponding Source. Regardless of what server hosts the - Corresponding Source, you remain obligated to ensure that it is - available for as long as needed to satisfy these requirements. - - e) Convey the object code using peer-to-peer transmission, provided - you inform other peers where the object code and Corresponding - Source of the work are being offered to the general public at no - charge under subsection 6d. - - A separable portion of the object code, whose source code is excluded -from the Corresponding Source as a System Library, need not be -included in conveying the object code work. - - A "User Product" is either (1) a "consumer product", which means any -tangible personal property which is normally used for personal, family, -or household purposes, or (2) anything designed or sold for incorporation -into a dwelling. In determining whether a product is a consumer product, -doubtful cases shall be resolved in favor of coverage. For a particular -product received by a particular user, "normally used" refers to a -typical or common use of that class of product, regardless of the status -of the particular user or of the way in which the particular user -actually uses, or expects or is expected to use, the product. A product -is a consumer product regardless of whether the product has substantial -commercial, industrial or non-consumer uses, unless such uses represent -the only significant mode of use of the product. - - "Installation Information" for a User Product means any methods, -procedures, authorization keys, or other information required to install -and execute modified versions of a covered work in that User Product from -a modified version of its Corresponding Source. The information must -suffice to ensure that the continued functioning of the modified object -code is in no case prevented or interfered with solely because -modification has been made. - - If you convey an object code work under this section in, or with, or -specifically for use in, a User Product, and the conveying occurs as -part of a transaction in which the right of possession and use of the -User Product is transferred to the recipient in perpetuity or for a -fixed term (regardless of how the transaction is characterized), the -Corresponding Source conveyed under this section must be accompanied -by the Installation Information. But this requirement does not apply -if neither you nor any third party retains the ability to install -modified object code on the User Product (for example, the work has -been installed in ROM). - - The requirement to provide Installation Information does not include a -requirement to continue to provide support service, warranty, or updates -for a work that has been modified or installed by the recipient, or for -the User Product in which it has been modified or installed. Access to a -network may be denied when the modification itself materially and -adversely affects the operation of the network or violates the rules and -protocols for communication across the network. - - Corresponding Source conveyed, and Installation Information provided, -in accord with this section must be in a format that is publicly -documented (and with an implementation available to the public in -source code form), and must require no special password or key for -unpacking, reading or copying. - - 7. Additional Terms. - - "Additional permissions" are terms that supplement the terms of this -License by making exceptions from one or more of its conditions. -Additional permissions that are applicable to the entire Program shall -be treated as though they were included in this License, to the extent -that they are valid under applicable law. If additional permissions -apply only to part of the Program, that part may be used separately -under those permissions, but the entire Program remains governed by -this License without regard to the additional permissions. - - When you convey a copy of a covered work, you may at your option -remove any additional permissions from that copy, or from any part of -it. (Additional permissions may be written to require their own -removal in certain cases when you modify the work.) You may place -additional permissions on material, added by you to a covered work, -for which you have or can give appropriate copyright permission. - - Notwithstanding any other provision of this License, for material you -add to a covered work, you may (if authorized by the copyright holders of -that material) supplement the terms of this License with terms: - - a) Disclaiming warranty or limiting liability differently from the - terms of sections 15 and 16 of this License; or - - b) Requiring preservation of specified reasonable legal notices or - author attributions in that material or in the Appropriate Legal - Notices displayed by works containing it; or - - c) Prohibiting misrepresentation of the origin of that material, or - requiring that modified versions of such material be marked in - reasonable ways as different from the original version; or - - d) Limiting the use for publicity purposes of names of licensors or - authors of the material; or - - e) Declining to grant rights under trademark law for use of some - trade names, trademarks, or service marks; or - - f) Requiring indemnification of licensors and authors of that - material by anyone who conveys the material (or modified versions of - it) with contractual assumptions of liability to the recipient, for - any liability that these contractual assumptions directly impose on - those licensors and authors. - - All other non-permissive additional terms are considered "further -restrictions" within the meaning of section 10. If the Program as you -received it, or any part of it, contains a notice stating that it is -governed by this License along with a term that is a further -restriction, you may remove that term. If a license document contains -a further restriction but permits relicensing or conveying under this -License, you may add to a covered work material governed by the terms -of that license document, provided that the further restriction does -not survive such relicensing or conveying. - - If you add terms to a covered work in accord with this section, you -must place, in the relevant source files, a statement of the -additional terms that apply to those files, or a notice indicating -where to find the applicable terms. - - Additional terms, permissive or non-permissive, may be stated in the -form of a separately written license, or stated as exceptions; -the above requirements apply either way. - - 8. Termination. - - You may not propagate or modify a covered work except as expressly -provided under this License. Any attempt otherwise to propagate or -modify it is void, and will automatically terminate your rights under -this License (including any patent licenses granted under the third -paragraph of section 11). - - However, if you cease all violation of this License, then your -license from a particular copyright holder is reinstated (a) -provisionally, unless and until the copyright holder explicitly and -finally terminates your license, and (b) permanently, if the copyright -holder fails to notify you of the violation by some reasonable means -prior to 60 days after the cessation. - - Moreover, your license from a particular copyright holder is -reinstated permanently if the copyright holder notifies you of the -violation by some reasonable means, this is the first time you have -received notice of violation of this License (for any work) from that -copyright holder, and you cure the violation prior to 30 days after -your receipt of the notice. - - Termination of your rights under this section does not terminate the -licenses of parties who have received copies or rights from you under -this License. If your rights have been terminated and not permanently -reinstated, you do not qualify to receive new licenses for the same -material under section 10. - - 9. Acceptance Not Required for Having Copies. - - You are not required to accept this License in order to receive or -run a copy of the Program. Ancillary propagation of a covered work -occurring solely as a consequence of using peer-to-peer transmission -to receive a copy likewise does not require acceptance. However, -nothing other than this License grants you permission to propagate or -modify any covered work. These actions infringe copyright if you do -not accept this License. Therefore, by modifying or propagating a -covered work, you indicate your acceptance of this License to do so. - - 10. Automatic Licensing of Downstream Recipients. - - Each time you convey a covered work, the recipient automatically -receives a license from the original licensors, to run, modify and -propagate that work, subject to this License. You are not responsible -for enforcing compliance by third parties with this License. - - An "entity transaction" is a transaction transferring control of an -organization, or substantially all assets of one, or subdividing an -organization, or merging organizations. If propagation of a covered -work results from an entity transaction, each party to that -transaction who receives a copy of the work also receives whatever -licenses to the work the party's predecessor in interest had or could -give under the previous paragraph, plus a right to possession of the -Corresponding Source of the work from the predecessor in interest, if -the predecessor has it or can get it with reasonable efforts. - - You may not impose any further restrictions on the exercise of the -rights granted or affirmed under this License. For example, you may -not impose a license fee, royalty, or other charge for exercise of -rights granted under this License, and you may not initiate litigation -(including a cross-claim or counterclaim in a lawsuit) alleging that -any patent claim is infringed by making, using, selling, offering for -sale, or importing the Program or any portion of it. - - 11. Patents. - - A "contributor" is a copyright holder who authorizes use under this -License of the Program or a work on which the Program is based. The -work thus licensed is called the contributor's "contributor version". - - A contributor's "essential patent claims" are all patent claims -owned or controlled by the contributor, whether already acquired or -hereafter acquired, that would be infringed by some manner, permitted -by this License, of making, using, or selling its contributor version, -but do not include claims that would be infringed only as a -consequence of further modification of the contributor version. For -purposes of this definition, "control" includes the right to grant -patent sublicenses in a manner consistent with the requirements of -this License. - - Each contributor grants you a non-exclusive, worldwide, royalty-free -patent license under the contributor's essential patent claims, to -make, use, sell, offer for sale, import and otherwise run, modify and -propagate the contents of its contributor version. - - In the following three paragraphs, a "patent license" is any express -agreement or commitment, however denominated, not to enforce a patent -(such as an express permission to practice a patent or covenant not to -sue for patent infringement). To "grant" such a patent license to a -party means to make such an agreement or commitment not to enforce a -patent against the party. - - If you convey a covered work, knowingly relying on a patent license, -and the Corresponding Source of the work is not available for anyone -to copy, free of charge and under the terms of this License, through a -publicly available network server or other readily accessible means, -then you must either (1) cause the Corresponding Source to be so -available, or (2) arrange to deprive yourself of the benefit of the -patent license for this particular work, or (3) arrange, in a manner -consistent with the requirements of this License, to extend the patent -license to downstream recipients. "Knowingly relying" means you have -actual knowledge that, but for the patent license, your conveying the -covered work in a country, or your recipient's use of the covered work -in a country, would infringe one or more identifiable patents in that -country that you have reason to believe are valid. - - If, pursuant to or in connection with a single transaction or -arrangement, you convey, or propagate by procuring conveyance of, a -covered work, and grant a patent license to some of the parties -receiving the covered work authorizing them to use, propagate, modify -or convey a specific copy of the covered work, then the patent license -you grant is automatically extended to all recipients of the covered -work and works based on it. - - A patent license is "discriminatory" if it does not include within -the scope of its coverage, prohibits the exercise of, or is -conditioned on the non-exercise of one or more of the rights that are -specifically granted under this License. You may not convey a covered -work if you are a party to an arrangement with a third party that is -in the business of distributing software, under which you make payment -to the third party based on the extent of your activity of conveying -the work, and under which the third party grants, to any of the -parties who would receive the covered work from you, a discriminatory -patent license (a) in connection with copies of the covered work -conveyed by you (or copies made from those copies), or (b) primarily -for and in connection with specific products or compilations that -contain the covered work, unless you entered into that arrangement, -or that patent license was granted, prior to 28 March 2007. - - Nothing in this License shall be construed as excluding or limiting -any implied license or other defenses to infringement that may -otherwise be available to you under applicable patent law. - - 12. No Surrender of Others' Freedom. - - If conditions are imposed on you (whether by court order, agreement or -otherwise) that contradict the conditions of this License, they do not -excuse you from the conditions of this License. If you cannot convey a -covered work so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you may -not convey it at all. For example, if you agree to terms that obligate you -to collect a royalty for further conveying from those to whom you convey -the Program, the only way you could satisfy both those terms and this -License would be to refrain entirely from conveying the Program. - - 13. Use with the GNU Affero General Public License. - - Notwithstanding any other provision of this License, you have -permission to link or combine any covered work with a work licensed -under version 3 of the GNU Affero General Public License into a single -combined work, and to convey the resulting work. The terms of this -License will continue to apply to the part which is the covered work, -but the special requirements of the GNU Affero General Public License, -section 13, concerning interaction through a network will apply to the -combination as such. - - 14. Revised Versions of this License. - - The Free Software Foundation may publish revised and/or new versions of -the GNU General Public License from time to time. Such new versions will -be similar in spirit to the present version, but may differ in detail to -address new problems or concerns. - - Each version is given a distinguishing version number. If the -Program specifies that a certain numbered version of the GNU General -Public License "or any later version" applies to it, you have the -option of following the terms and conditions either of that numbered -version or of any later version published by the Free Software -Foundation. If the Program does not specify a version number of the -GNU General Public License, you may choose any version ever published -by the Free Software Foundation. - - If the Program specifies that a proxy can decide which future -versions of the GNU General Public License can be used, that proxy's -public statement of acceptance of a version permanently authorizes you -to choose that version for the Program. - - Later license versions may give you additional or different -permissions. However, no additional obligations are imposed on any -author or copyright holder as a result of your choosing to follow a -later version. - - 15. Disclaimer of Warranty. - - THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY -APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT -HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY -OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, -THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR -PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM -IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF -ALL NECESSARY SERVICING, REPAIR OR CORRECTION. - - 16. Limitation of Liability. - - IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS -THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY -GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE -USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF -DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD -PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), -EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF -SUCH DAMAGES. - - 17. Interpretation of Sections 15 and 16. - - If the disclaimer of warranty and limitation of liability provided -above cannot be given local legal effect according to their terms, -reviewing courts shall apply local law that most closely approximates -an absolute waiver of all civil liability in connection with the -Program, unless a warranty or assumption of liability accompanies a -copy of the Program in return for a fee. - - END OF TERMS AND CONDITIONS - - How to Apply These Terms to Your New Programs - - If you develop a new program, and you want it to be of the greatest -possible use to the public, the best way to achieve this is to make it -free software which everyone can redistribute and change under these terms. - - To do so, attach the following notices to the program. It is safest -to attach them to the start of each source file to most effectively -state the exclusion of warranty; and each file should have at least -the "copyright" line and a pointer to where the full notice is found. - - - Copyright (C) - - This program is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . - -Also add information on how to contact you by electronic and paper mail. - - If the program does terminal interaction, make it output a short -notice like this when it starts in an interactive mode: - - Copyright (C) - This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. - This is free software, and you are welcome to redistribute it - under certain conditions; type `show c' for details. - -The hypothetical commands `show w' and `show c' should show the appropriate -parts of the General Public License. Of course, your program's commands -might be different; for a GUI interface, you would use an "about box". - - You should also get your employer (if you work as a programmer) or school, -if any, to sign a "copyright disclaimer" for the program, if necessary. -For more information on this, and how to apply and follow the GNU GPL, see -. - - The GNU General Public License does not permit incorporating your program -into proprietary programs. If your program is a subroutine library, you -may consider it more useful to permit linking proprietary applications with -the library. If this is what you want to do, use the GNU Lesser General -Public License instead of this License. But first, please read -. \ No newline at end of file diff --git a/src/spicelib/devices/adms/admst/adms.implicit.xml b/src/spicelib/devices/adms/admst/adms.implicit.xml deleted file mode 100644 index b2a95ccc5..000000000 --- a/src/spicelib/devices/adms/admst/adms.implicit.xml +++ /dev/null @@ -1,803 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/src/spicelib/devices/adms/admst/analogfunction.xml b/src/spicelib/devices/adms/admst/analogfunction.xml deleted file mode 100644 index e991ee0cc..000000000 --- a/src/spicelib/devices/adms/admst/analogfunction.xml +++ /dev/null @@ -1,1144 +0,0 @@ - - - - - - - - - - - - - - -/* math functions and appropriate derivatives */ -static inline double _fn_cos(double arg) { return cos(arg); } -static inline double _d0_cos(double arg) { return (-sin(arg)); } -static inline double _fn_sin(double arg) { return sin(arg); } -static inline double _d0_sin(double arg) { return (cos(arg)); } -static inline double _fn_tan(double arg) { return tan(arg); } -static inline double _d0_tan(double arg) { return (1.0/cos(arg)/cos(arg)); } -static inline double _fn_cosh(double arg) { return cosh(arg); } -static inline double _d0_cosh(double arg) { return (sinh(arg)); } -static inline double _fn_sinh(double arg) { return sinh(arg); } -static inline double _d0_sinh(double arg) { return (cosh(arg)); } -static inline double _fn_tanh(double arg) { return tanh(arg); } -static inline double _d0_tanh(double arg) { return (1.0/cosh(arg)/cosh(arg)); } -static inline double _fn_acos(double arg) { return acos(arg); } -static inline double _d0_acos(double arg) { return (-1.0/sqrt(1-arg*arg)); } -static inline double _fn_asin(double arg) { return asin(arg); } -static inline double _d0_asin(double arg) { return (+1.0/sqrt(1-arg*arg)); } -static inline double _fn_atan(double arg) { return atan(arg); } -static inline double _d0_atan(double arg) { return (+1.0/(1+arg*arg)); } -static inline double _fn_acosh(double arg) { return acosh(arg); } -static inline double _d0_acosh(double arg) { return (1.0/(sqrt(arg-1)*sqrt(arg+1))); } -static inline double _fn_asinh(double arg) { return asinh(arg); } -static inline double _d0_asinh(double arg) { return (1.0/(sqrt(arg*arg+1))); } -static inline double _fn_atanh(double arg) { return atanh(arg); } -static inline double _d0_atanh(double arg) { return (+1.0/(1-arg*arg)); } - -static inline double _fn_logE(double arg) { return log(arg); } -static inline double _d0_logE(double arg) { return (1.0/arg); } -static inline double _fn_log10(double arg) { return log10(arg); } -static inline double _d0_log10(double arg) { return (1.0/arg/log(10.0)); } -static inline double _fn_exp(double arg) { return exp(arg); } -static inline double _d0_exp(double arg) { return exp(arg); } -static inline double _fn_sqrt(double arg) { return sqrt(arg); } -static inline double _d0_sqrt(double arg) { return (1.0/sqrt(arg)/2.0); } - -static inline double _fn_abs(double arg) { return fabs(arg); } -static inline double _d0_abs(double arg) { return (((arg)>=0)?(+1.0):(-1.0)); } - -static inline double _fn_floor(double arg) { return floor(arg); } -static inline double _d0_floor(double arg) { (void) arg; return 0.0; } - -static inline double _fn_ceil(double arg) { return ceil(arg); } -static inline double _d0_ceil(double arg) { (void) arg; return 0.0; } - -static inline double _fn_hypot(double x,double y) { return sqrt((x)*(x)+(y)*(y)); } -static inline double _d0_hypot(double x,double y) { return (x)/sqrt((x)*(x)+(y)*(y)); } -static inline double _d1_hypot(double x,double y) { return (y)/sqrt((x)*(x)+(y)*(y)); } - -static inline double _fn_atan2(double x,double y) { return atan2(x,y); } -static inline double _d0_atan2(double x,double y) { return -y / (x*x + y*y); } -static inline double _d1_atan2(double x,double y) { return x / (x*x + y*y); } - -static inline double _fn_max(double x,double y) { return ((x)>(y))?(x):(y); } -static inline double _d0_max(double x,double y) { return ((x)>(y))?1.0:0.0; } -static inline double _d1_max(double x,double y) { return ((x)>(y))?0.0:1.0; } - -static inline double _fn_min(double x,double y) { return ((x)<(y))?(x):(y); } -static inline double _d0_min(double x,double y) { return ((x)<(y))?1.0:0.0; } -static inline double _d1_min(double x,double y) { return ((x)<(y))?0.0:1.0; } - -static inline double _fn_pow(double x,double y) { return pow(x,y); } -static inline double _d0_pow(double x,double y) { return (x==0.0)?0.0:((y/x)*pow(x,y)); } -static inline double _d1_pow(double x,double y) { return (x==0.0)?0.0:((log(x)/exp(0.0))*pow(x,y)); } - -static inline double _fn_limexp(double arg) { return ((arg)<(80))?(exp(arg)):(exp(80.0)*(1.0+(arg-80))); } -static inline double _d0_limexp(double arg) { return ((arg)<(80))?(exp(arg)):(exp(80.0)); } - -static inline double _fn_vt(double arg) { return (1.3806503e-23 / 1.602176462e-19) * arg; } -static inline double _d0_vt(double arg) { (void) arg; return (1.3806503e-23 / 1.602176462e-19); } - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - $(module)_$function ( - - - ) - - - - - - - =0 - =0.0 - - - - - - - - =0 - =0.0 - - - - - - - -double $(module)_d_$(function) ( - - - , - - - ) - - - - - - - - =0 - =0.0 - - - - - - - =0 - =0.0 - - - - - - - - - - =0 - =0.0 - - - - - - - =0 - =0.0 - - - - - - - - - - - - - - - - - - - - - - /* - * %(attribute[name='ngspicename']/value).analogfunction.h - analog function header - * - * This is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2, or (at your option) - * any later version. - * - */ - -#ifndef __$(module)_ANALOGFUNCTION_H__ -#define __$(module)_ANALOGFUNCTION_H__ - - - -#endif /* __$(module)_ANALOGFUNCTION_H__ */ - - - - - /* - * %(attribute[name='ngspicename']/value).analogfunction.c - analog function implementations - * - * This is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2, or (at your option) - * any later version. - * - */ - -// #if HAVE_CONFIG_H -// # include <config.h> -// #endif - -#include <stdio.h> -#include "%(attribute[name='ngspicename']/value).analogfunction.h" -#include <math.h> - - - - - - - - - diff --git a/src/spicelib/devices/adms/admst/ngspiceMODULE.c.xml b/src/spicelib/devices/adms/admst/ngspiceMODULE.c.xml deleted file mode 100644 index 6ea922da0..000000000 --- a/src/spicelib/devices/adms/admst/ngspiceMODULE.c.xml +++ /dev/null @@ -1,124 +0,0 @@ - - - - - - - - - - - - -#include "ngspice/ngspice.h" -#include "ngspice/devdefs.h" -#include "$(module)defs.h" -#include "ngspice/suffix.h" - -IFparm $(module)pTable[] = { - - - - IOP("%(lower-case(name))",$(module)_instance_%(name),IF_REAL,"%(name)"), - - - IOP("%(lower-case(name))",$(module)_instance_%(name),IF_INTEGER,"%(name)"), - - - - - - - - - - - - - OP("%(lower-case(name))",$(module)_ask_%(name),IF_REAL,"%(attribute[name='desc']/value)"), - - - - - - - - -}; - - - - - - - - - - - - - - - - - - - - - - - -char *$(module)names[] = { - - - - - - - - - - - - - -}; - -int $(module)nSize = NUMELEMS($(module)names); -int $(module)pTSize = NUMELEMS($(module)pTable); -int $(module)mPTSize = NUMELEMS($(module)mPTable); -int $(module)iSize = sizeof($(module)instance); -int $(module)mSize = sizeof($(module)model); - - - - - - - - - - - - - - - diff --git a/src/spicelib/devices/adms/admst/ngspiceMODULE.hxx.xml b/src/spicelib/devices/adms/admst/ngspiceMODULE.hxx.xml deleted file mode 100644 index 59b3d6f5f..000000000 --- a/src/spicelib/devices/adms/admst/ngspiceMODULE.hxx.xml +++ /dev/null @@ -1,2901 +0,0 @@ - - - - - - - - - - - - - -#define ELECTRON_CHARGE 1.602191770e-19 /* C */ -#define BOLTZMANN 1.38062259e-23 /* J/oK */ - -/* arithmetics */ -#define EXP90 1.220403294317841e+039 -#define m00_hypot(v00,x,y) v00 = sqrt((x)*(x)+(y)*(y)); -#define m10_hypot(v10,v00,x,y) v10 = (x)/(v00); -#define m11_hypot(v11,v00,x,y) v11 = (y)/(v00); -#define m00_max(v00,x,y) v00 = ((x)>(y))?(x):(y); -#define m10_max(v10,v00,x,y) v10 = ((x)>(y))?1.0:0.0; -#define m11_max(v11,v00,x,y) v11 = ((x)>(y))?0.0:1.0; -#define m00_min(v00,x,y) v00 = ((x)<(y))?(x):(y); -#define m10_min(v10,v00,x,y) v10 = ((x)<(y))?1.0:0.0; -#define m11_min(v11,v00,x,y) v11 = ((x)<(y))?0.0:1.0; -#define m00_pow(v00,x,y) v00 = pow(x,y); -#define m10_pow(v10,v00,x,y) v10 = (x==0.0)?0.0:(v00)*(y)/(x); -#define m11_pow(v11,v00,x,y) v11 = (x==0.0)?0.0:(log(x)*(v00)); -#define m00_div(v00,v10,x,y) double v10=1/(y); double v00=(x)*v10; -#define m10_div(v10,v00,vv,x,y) -#define m11_div(v11,v00,vv,x,y) double v11 = -v00*vv; -#define m00_mult(v00,v10,v11,x,y) double v10=(x); double v11=(y); double v00=v10*v11; -#define m00_add(v00,x,y) double v00=(x)+(y); -#define m00_cos(v00,x) v00 = cos(x); -#define m10_cos(v10,v00,x) v10 = (-sin(x)); -#define m00_sin(v00,x) v00 = sin(x); -#define m10_sin(v10,v00,x) v10 = (cos(x)); -#define m00_tan(v00,x) v00 = tan(x); -#define m10_tan(v10,v00,x) v10 = (1.0/cos(x)/cos(x)); -#define m00_cosh(v00,x) v00 = cosh(x); -#define m10_cosh(v10,v00,x) v10 = (sinh(x)); -#define m00_sinh(v00,x) v00 = sinh(x); -#define m10_sinh(v10,v00,x) v10 = (cosh(x)); -#define m00_tanh(v00,x) v00 = tanh(x); -#define m10_tanh(v10,v00,x) v10 = (1.0/cosh(x)/cosh(x)); -#define m00_acos(v00,x) v00 = acos(x); -#define m10_acos(v10,v00,x) v10 = (-1.0/sqrt(1-x*x)); -#define m00_asin(v00,x) v00 = asin(x); -#define m10_asin(v10,v00,x) v10 = (+1.0/sqrt(1-x*x)); -#define m00_atan(v00,x) v00 = atan(x); -#define m10_atan(v10,v00,x) v10 = (+1.0/(1+x*x)); -#define m00_logE(v00,x) v00 = log(x); -#define m10_logE(v10,v00,x) v10 = (1.0/x); -#define m00_log10(v00,x) v00 = log10(x); -#define m10_log10(v10,v00,x) v10 = (1.0/x/log(10)); -#define m00_sqrt(v00,x) v00 = sqrt(x); -#define m10_sqrt(v10,v00,x) v10 = (0.5/v00); -#define m00_fabs(v00,x) v00 = fabs(x); -#define m10_fabs(v10,v00,x) v10 = (((x)>=0)?(+1.0):(-1.0)); -#define m00_exp(v00,x) v00 = exp(x); -#define m10_exp(v10,v00,x) v10 = v00; -#define m00_abs(v00) ((v00)<(0)?(-(v00)):(v00)) -#define m00_floor(v00,x) v00 = floor(x); -#define m00_ceil(v00,x) v00 = ceil(x); -#define m00_limexp(v00,x) v00 = ((x)<90.0?exp(x):EXP90*(x-89.0)); -#define m10_limexp(v10,v00,x) v10 = ((x)<90.0?(v00):EXP90); -#define m00_atan2(v00,x,y) v00 = atan2(x,y); -#define m10_atan2(v10,x,y) v10 = (-(y)/((x)*(x)+(y)*(y))); -#define m11_atan2(v11,x,y) v11 = ((x)/((x)*(x)+(y)*(y))); -#define m00_acosh(v00,x) v00 = acosh(x); -#define m10_acosh(v10,v00,x) v10 = (1.0/(sqrt(x-1)*sqrt(x+1))); -#define m00_asinh(v00,x) v00 = asinh(x); -#define m10_asinh(v10,v00,x) v10 = (1.0/(sqrt(x*x+1))); -#define m00_atanh(v00,x) v00 = atanh(x); -#define m10_atanh(v10,v00,x) v10 = (1.0/(1-x*x)); - -#define m20_logE(v00) (-1.0/v00/v00) -#define m20_exp(v00) exp(v00) -#define m20_limexp(v00) ((v00)<90.0?exp(v00):0.0) -#define m20_sqrt(v00) (-0.25/(v00)/sqrt(v00)) -#define m20_fabs(v00) 0.0 - - - - -/*wrapper*/ -#define pModel model -#define pInst here -#define mint_get_circuit_tempK() _circuit_temp -#define voltages(n) NP(n) -#define _DDT(q) q -#define _DDX -#define _DERIVATEFORDDX - -#define _DERIVATE2 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - int - double - char* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - fabs - shrinkl - shrinka - log10 - logE - limexp - limexp - %(name) - - - - - $e - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/src/spicelib/devices/adms/admst/ngspiceMODULEacld.c.xml b/src/spicelib/devices/adms/admst/ngspiceMODULEacld.c.xml deleted file mode 100644 index 2e9206c1a..000000000 --- a/src/spicelib/devices/adms/admst/ngspiceMODULEacld.c.xml +++ /dev/null @@ -1,95 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - -#include "ngspice/ngspice.h" -#include "ngspice/cktdefs.h" -#include "$(module)defs.h" -#include "ngspice/sperror.h" -#include "ngspice/suffix.h" - -int $(module)acLoad(GENmodel *inModel, CKTcircuit *ckt) -{ - $(module)model *model = ($(module)model*)inModel; - $(module)instance *here; - for ( ; model != NULL; model = $(module)nextModel(model) ) - { - /* loop through all the instances of the model */ - for (here = $(module)instances(model); here != NULL ; here = $(module)nextInstance(here)) - { - - - - - - - - - - - - - - - - - - - } /* End of MOSFET Instance */ - } /* End of Model Instance */ - return(OK); -} - - - - - - - - - - - - - - - diff --git a/src/spicelib/devices/adms/admst/ngspiceMODULEask.c.xml b/src/spicelib/devices/adms/admst/ngspiceMODULEask.c.xml deleted file mode 100644 index 008f97bd5..000000000 --- a/src/spicelib/devices/adms/admst/ngspiceMODULEask.c.xml +++ /dev/null @@ -1,101 +0,0 @@ - - - - - - - - - - - - -#include "ngspice/ngspice.h" -#include "ngspice/const.h" -#include "ngspice/cktdefs.h" -#include "$(module)defs.h" -#include "ngspice/ifsim.h" -#include "ngspice/sperror.h" -#include "ngspice/suffix.h" - -int $(module)ask(CKTcircuit *ckt, GENinstance *inst, int which, IFvalue *value, IFvalue *select) -{ - $(module)instance *instance = ($(module)instance*)inst; - NG_IGNOREABLE(ckt); - NG_IGNOREABLE(value); - NG_IGNOREABLE(select); - NG_IGNOREABLE(instance); - switch (which) { - - - - - - - - - - - - - - - - - - - - - - - - case $(module)_ask_%(name) : - value->rValue = ckt->CKTstate0[inst->GENstate + hide_%(name)]; - return OK; - - - - - - - - - - default: - return(-1); - } - return(-1); -} - - - - - - - - - - - - - - - diff --git a/src/spicelib/devices/adms/admst/ngspiceMODULEdefs.h.xml b/src/spicelib/devices/adms/admst/ngspiceMODULEdefs.h.xml deleted file mode 100644 index 2364a9953..000000000 --- a/src/spicelib/devices/adms/admst/ngspiceMODULEdefs.h.xml +++ /dev/null @@ -1,386 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - -#ifndef $(module) -#define $(module) - -#include "ngspice/cktdefs.h" -#include "ngspice/ifsim.h" -#include "ngspice/gendefs.h" -#include "ngspice/complex.h" -#include "ngspice/noisedef.h" - - - - -#ifdef $(variable) - #warning conflict: $(variable) is declared as a variable of module '$(module)'. - #warning conflict: However in the API of ngspice '$(variable)' is also defined as a pragma. - #warning conflict: Pragma '$(variable)' will be undefined. - #warning conflict: You can solve the confict by renaming variable '$(variable)' in module '$(module)'. - #undef $(variable) -#endif - - - - -#ifdef $(variable) - #warning conflict: $(node) is declared as a node of module '$(module)'. - #warning conflict: However in the API of ngspice '$(node)' is also defined as a pragma. - #warning conflict: Pragma '$(node)' will be undefined. - #warning conflict: You can solve the confict by renaming variable '$(node)' in module '$(module)'. - #undef $(variable) -#endif - - -#ifdef NGSPICE_DEBUG_OK -#define NGSPICE_DEBUG \\ -{ \\ - if(getenv("ngspice_debug")) \\ - $(module)debug(ckt,model,here); \\ - else \\ - { \\ - printf(" To get more info run your simulation after setting shell variable ngspice_debug to 1\\n"); \\ - printf(" For example in sh shell just type: export ngspice_debug=1\\n"); \\ - } \\ -} -#else -#define NGSPICE_DEBUG -#endif - -#define EXIT_IF_ISNAN(var) \\ -{ \\ -} - -static inline double max(double x,double y) { return ((x)>(y))?(x):(y); } -static inline double min(double x,double y) { return ((x)<(y))?(x):(y); } - -/* ngspice \$simparam variables - gdev (1/Ohms): Additional conductance to be added to nonlinear branches for conductance homotopy convergence algorithm. - gmin (1/Ohms): Minimum conductance placed in parallel with nonlinear branches. - imax (Amps) : Branch current threshold above which the constitutive relation of a nonlinear branch should be linearized. - imelt (Amps) : Branch current threshold indicating device failure. - iteration : Iteration number of the analog solver. - scale : Scale factor for device instance geometry parameters. - shrink : Optical linear shrink factor. - simulatorSubversion : The simulator sub-version. - simulatorVersion : The simulator version. - sourceScaleFactor : Multiplicative factor for independent sources for source stepping homotopy convergence algorithm. - tnom degrees (Celsius): Default value of temperature at which model parameters were extracted. -*/ - -#define _circuit_gdev ckt->CKTgmin -#define _circuit_gmin ((ckt->CKTgmin)>(ckt->CKTdiagGmin))?(ckt->CKTgmin):(ckt->CKTdiagGmin) -#define _circuit_imax 1.0 -#define _circuit_imelt 1.0 -#define _circuit_iteration 1.0 -#define _circuit_scale 1.0 -#define _circuit_shrink 1.0 -#define _circuit_simulatorSubversion 0 -#define _circuit_simulatorVersion 3.5 -#define _circuit_sourceScaleFactor 1.0 -#define _circuit_tnom ckt->CKTnomTemp - -#define _circuit_temp ckt->CKTtemp -#define _scale 1.0 - -#define _f_cos(val,arg) val = cos(arg); -#define _d_cos(val,dval,arg) val = cos(arg); dval = (-sin(arg)); -#define _f_sin(val,arg) val = sin(arg); -#define _d_sin(val,dval,arg) val = sin(arg); dval = (cos(arg)); -#define _f_tan(val,arg) val = tan(arg); -#define _d_tan(val,dval,arg) val = tan(arg); dval = (1.0/cos(arg)/cos(arg)); -#define _f_asinh(val,arg) val = asinh(arg); -#define _d_asinh(val,dval,arg) val = asinh(arg); dval = (1.0/sqrt(arg*arg + 1)); -#define _f_hypot(xy,x,y) xy = sqrt((x)*(x)+(y)*(y)); -#define _dx_hypot(dx,xy,x,y) dx = (x)/(xy); -#define _dy_hypot(dy,xy,x,y) dy = (y)/(xy); -#define _f_max(xy,x,y) xy = ((x)>(y))?(x):(y); -#define _dx_max(dx,xy,x,y) dx = ((x)>(y))?1.0:0.0; -#define _dy_max(dy,xy,x,y) dy = ((x)>(y))?0.0:1.0; -#define _f_min(xy,x,y) xy = ((x)<(y))?(x):(y); -#define _dx_min(dx,xy,x,y) dx = ((x)<(y))?1.0:0.0; -#define _dy_min(dy,xy,x,y) dy = ((x)<(y))?0.0:1.0; -#define _f_cosh(val,arg) val = cosh(arg); -#define _d_cosh(val,dval,arg) val = cosh(arg); dval = (sinh(arg)); -#define _f_sinh(val,arg) val = sinh(arg); -#define _d_sinh(val,dval,arg) val = sinh(arg); dval = (cosh(arg)); -#define _f_tanh(val,arg) val = tanh(arg); -#define _d_tanh(val,dval,arg) val = tanh(arg); dval = (1.0/cosh(arg)/cosh(arg)); -#define _f_acos(val,arg) val = acos(arg); -#define _d_acos(val,dval,arg) val = acos(arg); dval = (-1.0/sqrt(1-arg*arg)); -#define _f_asin(val,arg) val = asin(arg); -#define _d_asin(val,dval,arg) val = asin(arg); dval = (+1.0/sqrt(1-arg*arg)); -#define _f_atan(val,arg) val = atan(arg); -#define _d_atan(val,dval,arg) val = atan(arg); dval = (+1.0/(1+arg*arg)); -#define _f_logE(val,arg) val = log(arg); -#define _d_logE(val,dval,arg) val = log(arg); dval = (1.0/arg); -#define _f_log10(val,arg) val = log10(arg); -#define _d_log10(val,dval,arg) val = log10(arg); dval = (1.0/arg/log(10)); -#define _f_exp(val,arg) val = exp(arg); -#define _d_exp(val,dval,arg) val = exp(arg); dval = val; -#define _f_sqrt(val,arg) val = sqrt(arg); -#define _d_sqrt(val,dval,arg) val = sqrt(arg); dval = (1.0/val/2.0); -#define _f_pow(xy,x,y) xy = pow(x,y); -#define _dx_pow(dx,xy,x,y) dx = (x==0.0)?0.0:((y/x)*xy); -#define _dy_pow(dy,xy,x,y) dy = (x==0.0)?0.0:((log(x)/exp(0.0))*xy); - -#define _f_atan2(xy,x,y) xy = atan2(x,y); -#define _dx_atan2(dx,x,y) dx = -(y)/((x)*(x)+(y)*(y)); -#define _dy_atan2(dy,x,y) dy = (x)/((x)*(x)+(y)*(y)); - -#define _f_div1(x,y) ((x)/(y)) -#define _f_div0(xy,x,y) xy=(x)/(y); -#define _f_div(xy,dx,x,y) dx=1/(y); xy=(x)*dx; -#define _dx_div(dx,xy,x,y) -#define _dy_div(dy,dx,xy,x,y) dy = -xy*dx; - -#define _f_limexp(val,arg) val = ((arg)<(90)) ? (exp(arg)) : (exp(90)*(1.0+(arg-90))); -#define _d_limexp(val,dval,arg) val = ((arg)<(90)) ? (exp(arg)) : (exp(90)*(1.0+(arg-90))); dval = val; -#define _f_fabs(val,arg) val = fabs(arg); -#define _d_fabs(val,dval,arg) val = fabs(arg); dval = (((val)>=0)?(+1.0):(-1.0)); -#define _f_abs(val) ((val)<(0) ? (-(val)):(val)) -#define _f_floor(val,arg) val = floor(arg); -#define _f_ceil(val,arg) val = ceil(arg); - -/* declarations for $(module) MOSFETs */ - -/* information needed for each instance */ -typedef struct s$(module)instance { - - struct GENinstance gen; - -#define $(module)modPtr(inst) (($(module)model *)((inst)->gen.GENmodPtr)) -#define $(module)nextInstance(inst) (($(module)instance *)((inst)->gen.GENnextInstance)) -#define $(module)name gen.GENname -#define $(module)states gen.GENstate - - /* node */ - - - - - - - - - - - - - - - - - - - - - /* instance parameters */ - - - - - - - - - - - - - - - - - - - - - // noise\n - - - - - /* variables */ - - - - - - - - - - /* states */ - - - - - - /* pointer to sparse matrix (+ values)*/ - - - - - - - - - - - - - - - - - - - - - -} $(module)instance ; - -enum { - - - - hide_%(name), -#define %(name) ((struct hides *)hide_%(name)) - - - - $(module)numStates -}; - -/* per model data */ - -typedef struct s$(module)model { /* model structure */ - struct GENmodel gen; - -#define $(module)modType gen.GENmodType -#define $(module)nextModel(inst) (($(module)model*)((inst)->gen.GENnextModel)) -#define $(module)instances(inst) (($(module)instance*)((inst)->gen.GENinstances)) -#define $(module)modName gen.GENmodName - - /* model parameters */ - - - - - - - - - - - - - - - - - - - - /* variable */ - - - - - - - - - - -} $(module)model; - - - - - - - - - - - - - - - - - - $(module)_ask_%(name), - - - - - - - - - -#include "$(module)ext.h" - -#include "$(module).analogfunction.h" - - -#endif /*$(module)*/ - - - - - - - - - - - - - - - diff --git a/src/spicelib/devices/adms/admst/ngspiceMODULEdel.c.xml b/src/spicelib/devices/adms/admst/ngspiceMODULEdel.c.xml deleted file mode 100644 index 00a7aa96f..000000000 --- a/src/spicelib/devices/adms/admst/ngspiceMODULEdel.c.xml +++ /dev/null @@ -1,67 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - -#include "ngspice/ngspice.h" -#include "$(module)defs.h" -#include "ngspice/sperror.h" -#include "ngspice/suffix.h" - -int -$(module)delete(GENinstance *gen_inst) -{ - NG_IGNORE(gen_inst); - return OK; -} - - - - - - - - - - - - - - diff --git a/src/spicelib/devices/adms/admst/ngspiceMODULEdest.c.xml b/src/spicelib/devices/adms/admst/ngspiceMODULEdest.c.xml deleted file mode 100644 index eadee1a98..000000000 --- a/src/spicelib/devices/adms/admst/ngspiceMODULEdest.c.xml +++ /dev/null @@ -1,64 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - -#include "ngspice/ngspice.h" -#include "$(module)defs.h" -#include "ngspice/suffix.h" - -void -$(module)destroy(void) -{ -} - - - - - - - - - - - - - - diff --git a/src/spicelib/devices/adms/admst/ngspiceMODULEext.h.xml b/src/spicelib/devices/adms/admst/ngspiceMODULEext.h.xml deleted file mode 100644 index 1217fc866..000000000 --- a/src/spicelib/devices/adms/admst/ngspiceMODULEext.h.xml +++ /dev/null @@ -1,72 +0,0 @@ - - - - - - - - - - -#ifndef __$(module)EXT_H -#define __$(module)EXT_H - - - - -#include "$(module)defs.h" - -extern int $(module)par(int,IFvalue*,GENinstance*,IFvalue*); -extern int $(module)mParam(int,IFvalue*,GENmodel*); -extern int $(module)load(GENmodel*,CKTcircuit*); -extern int $(module)setup(SMPmatrix*,GENmodel*,CKTcircuit*,int*); -extern int $(module)guesstopology(SMPmatrix *, CKTcircuit *, $(module)model *, $(module)instance *); -extern int $(module)temp(GENmodel*,CKTcircuit*); -extern int $(module)ask(CKTcircuit *,GENinstance*,int,IFvalue*,IFvalue*); -extern int $(module)mAsk(CKTcircuit*,GENmodel *,int, IFvalue*); -extern int $(module)acLoad(GENmodel *,CKTcircuit*); -extern int $(module)convTest(GENmodel *,CKTcircuit*); -extern int $(module)delete(GENinstance*); -extern int $(module)getic(GENmodel*,CKTcircuit*); -extern int $(module)mDelete(GENmodel*); -extern int $(module)noise(int,int,GENmodel*,CKTcircuit*,Ndata*,double*); -extern int $(module)pzLoad(GENmodel*,CKTcircuit*,SPcomplex*); -extern int $(module)trunc(GENmodel*,CKTcircuit*,double*); -extern int $(module)unsetup(GENmodel*,CKTcircuit*); -extern void $(module)destroy(void); - -#endif - - - - - - - - - - - - - - - - diff --git a/src/spicelib/devices/adms/admst/ngspiceMODULEguesstopology.c.xml b/src/spicelib/devices/adms/admst/ngspiceMODULEguesstopology.c.xml deleted file mode 100644 index 603b11db7..000000000 --- a/src/spicelib/devices/adms/admst/ngspiceMODULEguesstopology.c.xml +++ /dev/null @@ -1,363 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -#include "ngspice/ngspice.h" -#include "ngspice/cktdefs.h" -#include "ngspice/smpdefs.h" -#include "$(module)defs.h" -#include "ngspice/const.h" -#include "ngspice/sperror.h" -#include "ngspice/ifsim.h" -#include "ngspice/suffix.h" - -#define ELECTRON_CHARGE 1.602191770e-19 /* C */ -#define BOLTZMANN 1.38062259e-23 /* J/oK */ - -#define jacobian(a,b) here->PTR_J_##a##_##b##_required=1; -#define static_jacobian4(p,q,r,s) jacobian(p,r) jacobian(p,s) jacobian(q,r) jacobian(q,s) -#define static_jacobian2s(p,q,r) jacobian(p,r) jacobian(q,r) -#define static_jacobian2p(p,r,s) jacobian(p,r) jacobian(p,s) -#define static_jacobian1(p,r) jacobian(p,r) -#define dynamic_jacobian4(p,q,r,s) jacobian(p,r) jacobian(p,s) jacobian(q,r) jacobian(q,s) -#define dynamic_jacobian2s(p,q,r) jacobian(p,r) jacobian(q,r) -#define dynamic_jacobian2p(p,r,s) jacobian(p,r) jacobian(p,s) -#define dynamic_jacobian1(p,r) jacobian(p,r) -#define whitenoise_jacobian4(p,q,r,s) -#define whitenoise_jacobian2s(p,q,r) -#define whitenoise_jacobian2p(p,r,s) -#define whitenoise_jacobian1(p) -#define flickernoise_jacobian4(p,q,r,s) -#define flickernoise_jacobian2s(p,q,r) -#define flickernoise_jacobian2p(p,r,s) -#define flickernoise_jacobian1(p) - - -int $(module)guesstopology (SMPmatrix *matrix, CKTcircuit *ckt, $(module)model *model, $(module)instance *here) - /* guess topology */ -{ - NG_IGNOREABLE(matrix); - NG_IGNOREABLE(ckt); - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - int %(name);\n - double %(name)=0.0/0.0;\n - char* %(name);\n - - - - - - - return(OK); -} - - - - - - - - - - - - - - - - diff --git a/src/spicelib/devices/adms/admst/ngspiceMODULEinit.c.xml b/src/spicelib/devices/adms/admst/ngspiceMODULEinit.c.xml deleted file mode 100644 index 83bde7ad1..000000000 --- a/src/spicelib/devices/adms/admst/ngspiceMODULEinit.c.xml +++ /dev/null @@ -1,118 +0,0 @@ - - - - - - - -#include "ngspice/config.h" - -#include "ngspice/devdefs.h" - - - - -#include "$(module)itf.h" -#include "$(module)ext.h" -#include "$(module)init.h" - -SPICEdev $(module)info = { - .DEVpublic = { - .name = "$module", - .description = "$module created by adms", - .terms = &$(module)nSize, - .numNames = &$(module)nSize, - .termNames = $(module)names, - .numInstanceParms = &$(module)pTSize, - .instanceParms = $(module)pTable, - .numModelParms = &$(module)mPTSize, - .modelParms = $(module)mPTable, - .flags = DEV_DEFAULT, - -#ifdef XSPICE - .cm_func = NULL, - .num_conn = 0, - .conn = NULL, - .num_param = 0, - .param = NULL, - .num_inst_var = 0, - .inst_var = NULL, -#endif - }, - - .DEVparam = $(module)par, - .DEVmodParam = $(module)mParam, - .DEVload = $(module)load, - .DEVsetup = $(module)setup, - .DEVunsetup = $(module)unsetup, - .DEVpzSetup = $(module)setup, - .DEVtemperature = $(module)temp, - .DEVtrunc = $(module)trunc, - .DEVfindBranch = NULL, - .DEVacLoad = $(module)acLoad, - .DEVaccept = NULL, - .DEVdestroy = $(module)destroy, - .DEVmodDelete = $(module)mDelete, - .DEVdelete = $(module)delete, - .DEVsetic = NULL, - .DEVask = $(module)ask, - .DEVmodAsk = $(module)mAsk, - .DEVpzLoad = $(module)pzLoad, - .DEVconvTest = NULL, - .DEVsenSetup = NULL, - .DEVsenLoad = NULL, - .DEVsenUpdate = NULL, - .DEVsenAcLoad = NULL, - .DEVsenPrint = NULL, - .DEVsenTrunc = NULL, - .DEVdisto = NULL, - .DEVnoise = NULL, - .DEVsoaCheck = NULL, - .DEVinstSize = &$(module)iSize, - .DEVmodSize = &$(module)mSize, - -#ifdef CIDER - .DEVdump = NULL, - .DEVacct = NULL, -#endif -}; - - -SPICEdev * -get_$(module)_info(void) -{ - return &$(module)info; -} - - - - - - - - - - - - - - - diff --git a/src/spicelib/devices/adms/admst/ngspiceMODULEinit.h.xml b/src/spicelib/devices/adms/admst/ngspiceMODULEinit.h.xml deleted file mode 100644 index 78d732bdc..000000000 --- a/src/spicelib/devices/adms/admst/ngspiceMODULEinit.h.xml +++ /dev/null @@ -1,57 +0,0 @@ - - - - - - - - - - -#ifndef _$(module)INIT_H -#define _$(module)INIT_H - -extern IFparm $(module)pTable[ ]; -extern IFparm $(module)mPTable[ ]; -extern char *$(module)names[ ]; -extern int $(module)pTSize; -extern int $(module)mPTSize; -extern int $(module)nSize; -extern int $(module)iSize; -extern int $(module)mSize; - -#endif - - - - - - - - - - - - - - - - diff --git a/src/spicelib/devices/adms/admst/ngspiceMODULEitf.h.xml b/src/spicelib/devices/adms/admst/ngspiceMODULEitf.h.xml deleted file mode 100644 index 7a5c9c9f0..000000000 --- a/src/spicelib/devices/adms/admst/ngspiceMODULEitf.h.xml +++ /dev/null @@ -1,50 +0,0 @@ - - - - - - - - - - -#ifndef DEV_$(module) -#define DEV_$(module) - -extern SPICEdev *get_$(module)_info(void); - -#endif - - - - - - - - - - - - - - - - diff --git a/src/spicelib/devices/adms/admst/ngspiceMODULEload.c.xml b/src/spicelib/devices/adms/admst/ngspiceMODULEload.c.xml deleted file mode 100644 index c673fbd64..000000000 --- a/src/spicelib/devices/adms/admst/ngspiceMODULEload.c.xml +++ /dev/null @@ -1,332 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - -#define NGSPICE_DEBUG_OK - - - - -#include "ngspice/ngspice.h" -#include "ngspice/cktdefs.h" -#include "$(module)defs.h" -#include "ngspice/const.h" -#include "ngspice/trandefs.h" -#include "ngspice/sperror.h" -#include "ngspice/devdefs.h" -#include "ngspice/suffix.h" - -/*fixme: noise not implemented in ngspice*/ -#define ngspice_flickernoise(p,n,mag,freq,info)\\ -{\\ -} -#define ngspice_whitenoise(p,n,mag,info)\\ -{\\ -} - -#define NP(p) *(ckt->CKTrhsOld+here->p ## Node) -#define BP(p,n) (NP(p)-NP(n)) -#define DBGNODE(p) printf(#p "=%i - v=%e\\n",here->p ## Node,NP(p)); - - - -#define _STATIC -#define _DYNAMIC -#define _DERIVATE - -#define _load_static_residual2(p,n,v)\\ - *(ckt->CKTrhs+here->p ## Node)-=v;\\ - *(ckt->CKTrhs+here->n ## Node)+=v; -#define _load_static_residual1(p,v)\\ - *(ckt->CKTrhs+here->p ## Node)-=v; - -#define _load_static_jacobian4(Sp,Sn,Pp,Pn,v)\\ - _load_static_residual2(Sp,Sn,-v*BP(Pp,Pn))\\ - *(here->PTR_J_ ## Sp ## _ ## Pp)+=v;\\ - *(here->PTR_J_ ## Sn ## _ ## Pn)+=v;\\ - *(here->PTR_J_ ## Sp ## _ ## Pn)-=v;\\ - *(here->PTR_J_ ## Sn ## _ ## Pp)-=v;\\ - (here->JSVAL_ ## Sp ## _ ## Pp)+=v;\\ - (here->JSVAL_ ## Sn ## _ ## Pn)+=v;\\ - (here->JSVAL_ ## Sp ## _ ## Pn)-=v;\\ - (here->JSVAL_ ## Sn ## _ ## Pp)-=v; -#define _load_static_jacobian2s(Sp,Sn,Pp,v)\\ - _load_static_residual2(Sp,Sn,-v*NP(Pp))\\ - *(here->PTR_J_ ## Sp ## _ ## Pp)+=v;\\ - *(here->PTR_J_ ## Sn ## _ ## Pp)-=v;\\ - (here->JSVAL_ ## Sp ## _ ## Pp)+=v;\\ - (here->JSVAL_ ## Sn ## _ ## Pp)-=v; -#define _load_static_jacobian2p(Sp,Pp,Pn,v)\\ - _load_static_residual1(Sp,-v*BP(Pp,Pn))\\ - *(here->PTR_J_ ## Sp ## _ ## Pp)+=v;\\ - *(here->PTR_J_ ## Sp ## _ ## Pn)-=v;\\ - (here->JSVAL_ ## Sp ## _ ## Pp)+=v;\\ - (here->JSVAL_ ## Sp ## _ ## Pn)-=v; -#define _load_static_jacobian1(Sp,Pp,v)\\ - _load_static_residual1(Sp,-v*NP(Pp))\\ - *(here->PTR_J_ ## Sp ## _ ## Pp)+=v;\\ - (here->JSVAL_ ## Sp ## _ ## Pp)+=v; - -#define _load_dynamic_residual2(p,n,v)\\ -if(ChargeComputationNeeded)\\ -{\\ - int error;\\ - double unused;\\ - *(ckt->CKTstate0+here->state_##p##_##n)=v;\\ - if(ckt->CKTmode & MODEINITTRAN)\\ - *(ckt->CKTstate1+here->state_##p##_##n)=*(ckt->CKTstate0+here->state_##p##_##n);\\ - error = NIintegrate(ckt,&unused,&unused,0.0,here->state_##p##_##n);\\ - if(error) return(error);\\ - if(ckt->CKTmode & MODEINITTRAN)\\ - *(ckt->CKTstate1+here->state_##p##_##n+1) = *(ckt->CKTstate0+here->state_##p##_##n+1);\\ - *(ckt->CKTrhs+here->p##Node)-=*(ckt->CKTstate0+here->state_##p##_##n+1);\\ - *(ckt->CKTrhs+here->n##Node)+=*(ckt->CKTstate0+here->state_##p##_##n+1);\\ -} -#define _load_dynamic_residual1(p,v)\\ -if(ChargeComputationNeeded)\\ -{\\ - int error;\\ - double unused;\\ - *(ckt->CKTstate0+here->state_##p##_GND)=v;\\ - if(ckt->CKTmode & MODEINITTRAN)\\ - *(ckt->CKTstate1+here->state_##p##_GND)=*(ckt->CKTstate0+here->state_##p##_GND);\\ - error = NIintegrate(ckt,&unused,&unused,0.0,here->state_##p##_GND);\\ - if(error) return(error);\\ - if(ckt->CKTmode & MODEINITTRAN)\\ - *(ckt->CKTstate1+here->state_##p##_GND+1) = *(ckt->CKTstate0+here->state_##p##_GND+1);\\ - *(ckt->CKTrhs+here->p##Node)-=*(ckt->CKTstate0+here->state_##p##_GND+1);\\ -} - -#define _load_dynamic_jacobian4(Sp,Sn,Pp,Pn,v)\\ -if(ChargeComputationNeeded)\\ -{\\ - double geq=(v)*ckt->CKTag[0];\\ - double ceq=geq*BP(Pp,Pn);\\ - *(ckt->CKTrhs+here->Sp##Node)+=ceq;\\ - *(ckt->CKTrhs+here->Sn##Node)-=ceq;\\ - *(here->PTR_J_ ## Sp ## _ ## Pp)+=geq;\\ - *(here->PTR_J_ ## Sn ## _ ## Pn)+=geq;\\ - *(here->PTR_J_ ## Sp ## _ ## Pn)-=geq;\\ - *(here->PTR_J_ ## Sn ## _ ## Pp)-=geq;\\ -}\\ - (here->JDVAL_ ## Sp ## _ ## Pp)+=v;\\ - (here->JDVAL_ ## Sn ## _ ## Pn)+=v;\\ - (here->JDVAL_ ## Sp ## _ ## Pn)-=v;\\ - (here->JDVAL_ ## Sn ## _ ## Pp)-=v; -#define _load_dynamic_jacobian2s(Sp,Sn,Pp,v)\\ -if(ChargeComputationNeeded)\\ -{\\ - double geq=(v)*ckt->CKTag[0];\\ - double ceq=geq*NP(Pp);\\ - *(ckt->CKTrhs+here->Sp##Node)+=ceq;\\ - *(ckt->CKTrhs+here->Sn##Node)-=ceq;\\ - *(here->PTR_J_ ## Sp ## _ ## Pp)+=geq;\\ - *(here->PTR_J_ ## Sn ## _ ## Pp)-=geq;\\ -}\\ - (here->JDVAL_ ## Sp ## _ ## Pp)+=v;\\ - (here->JDVAL_ ## Sn ## _ ## Pp)-=v; -#define _load_dynamic_jacobian2p(Sp,Pp,Pn,v)\\ -if(ChargeComputationNeeded)\\ -{\\ - double geq=(v)*ckt->CKTag[0];\\ - double ceq=geq*BP(Pp,Pn);\\ - *(ckt->CKTrhs+here->Sp##Node)+=ceq;\\ - *(here->PTR_J_ ## Sp ## _ ## Pp)+=geq;\\ - *(here->PTR_J_ ## Sp ## _ ## Pn)-=geq;\\ -}\\ - (here->JDVAL_ ## Sp ## _ ## Pp)+=v;\\ - (here->JDVAL_ ## Sp ## _ ## Pn)-=v; -#define _load_dynamic_jacobian1(Sp,Pp,v)\\ -if(ChargeComputationNeeded)\\ -{\\ - double geq=(v)*ckt->CKTag[0];\\ - double ceq=geq*NP(Pp);\\ - *(ckt->CKTrhs+here->Sp##Node)+=ceq;\\ - *(here->PTR_J_ ## Sp ## _ ## Pp)+=geq;\\ -}\\ -(here->JDVAL_ ## Sp ## _ ## Pp)+=v; - -int $(module)load(GENmodel *inModel, CKTcircuit *ckt) - /* actually load the current value into the - * sparse matrix previously provided - */ -{ - $(module)model *model = ($(module)model*)inModel; - $(module)instance *here; - int ChargeComputationNeeded = - ((ckt->CKTmode & (MODEAC | MODETRAN | MODEINITSMSIG)) || - ((ckt->CKTmode & MODETRANOP) && (ckt->CKTmode & MODEUIC))) - ? 1 : 0; - - for ( ; model != NULL; model = $(module)nextModel(model) ) - { - /* loop through all the instances of the model */ - for (here = $(module)instances(model); here != NULL ; here = $(module)nextInstance(here)) - { -{ - - - - - - - - - - -} -{ -#include "$module.hxx" -} - } /* End of Instance */ - } /* End of Model */ - return(OK); -} - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/src/spicelib/devices/adms/admst/ngspiceMODULEmask.c.xml b/src/spicelib/devices/adms/admst/ngspiceMODULEmask.c.xml deleted file mode 100644 index 1c519b3f3..000000000 --- a/src/spicelib/devices/adms/admst/ngspiceMODULEmask.c.xml +++ /dev/null @@ -1,82 +0,0 @@ - - - - - - - - - - - - -#include "ngspice/ngspice.h" -#include "ngspice/const.h" -#include "ngspice/ifsim.h" -#include "ngspice/cktdefs.h" -#include "ngspice/devdefs.h" -#include "$(module)defs.h" -#include "ngspice/sperror.h" -#include "ngspice/suffix.h" - -int $(module)mAsk(CKTcircuit *ckt, GENmodel *inst, int which, IFvalue *value) -{ - $(module)model *model = ($(module)model *)inst; - NG_IGNOREABLE(ckt); - switch (which) { - - - - - - - - - - - - - - - - - - - default: - return(-1); - } - return(-1); -} - - - - - - - - - - - - - - - diff --git a/src/spicelib/devices/adms/admst/ngspiceMODULEmdel.c.xml b/src/spicelib/devices/adms/admst/ngspiceMODULEmdel.c.xml deleted file mode 100644 index 55267306f..000000000 --- a/src/spicelib/devices/adms/admst/ngspiceMODULEmdel.c.xml +++ /dev/null @@ -1,67 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - -#include "ngspice/ngspice.h" -#include "$(module)defs.h" -#include "ngspice/sperror.h" -#include "ngspice/suffix.h" - -int -$(module)mDelete(GENmodel *gen_model) -{ - NG_IGNORE(gen_model); - return OK; -} - - - - - - - - - - - - - - diff --git a/src/spicelib/devices/adms/admst/ngspiceMODULEmpar.c.xml b/src/spicelib/devices/adms/admst/ngspiceMODULEmpar.c.xml deleted file mode 100644 index 2b5170f93..000000000 --- a/src/spicelib/devices/adms/admst/ngspiceMODULEmpar.c.xml +++ /dev/null @@ -1,82 +0,0 @@ - - - - - - - - - - - - -#include "ngspice/ngspice.h" -#include "ngspice/const.h" -#include "ngspice/ifsim.h" -#include "$(module)defs.h" -#include "ngspice/sperror.h" -#include "ngspice/suffix.h" - -int $(module)mParam(int param, IFvalue *value, GENmodel *inMod) -{ - $(module)model *mod = ($(module)model*)inMod; - switch (param) { - - - - - - - - - - - - - - - - - - - - - - default: - return(-1); - } - return(OK); -} - - - - - - - - - - - - - - - diff --git a/src/spicelib/devices/adms/admst/ngspiceMODULEnoise.c.xml b/src/spicelib/devices/adms/admst/ngspiceMODULEnoise.c.xml deleted file mode 100644 index eb71f4823..000000000 --- a/src/spicelib/devices/adms/admst/ngspiceMODULEnoise.c.xml +++ /dev/null @@ -1,87 +0,0 @@ - - - - - - - - - - -#include "ngspice/ngspice.h" -#include "$(module)defs.h" -#include "ngspice/cktdefs.h" -#include "ngspice/iferrmsg.h" -#include "ngspice/noisedef.h" -#include "ngspice/suffix.h" - -extern void NevalSrc(); -extern double Nintegrate(); - -static char* $(module)nNames []= { - - - -}; - -int -$(module)noise (int mode, int operation, GENmodel *genmodel, CKTcircuit *ckt, Ndata *data, double *OnDens) -{ - $(module)model *firstModel = ($(module)model *) genmodel; - $(module)model *model; - $(module)instance *inst; - for (model=firstModel; model != NULL; model=$(module)nextModel(model)) - { - for (inst=$(module)instances(model); inst != NULL; inst=$(module)nextInstance(inst)) - { - switch (operation) - { - case N_OPEN: - break; - case N_CALC: - switch (mode) - { - case N_DENS: - break; - case INT_NOIZ: - break; - } - break; - case N_CLOSE: - return (OK); - break; - } - } - } - return(OK); -} - - - - - - - - - - - - diff --git a/src/spicelib/devices/adms/admst/ngspiceMODULEpar.c.xml b/src/spicelib/devices/adms/admst/ngspiceMODULEpar.c.xml deleted file mode 100644 index e05987c36..000000000 --- a/src/spicelib/devices/adms/admst/ngspiceMODULEpar.c.xml +++ /dev/null @@ -1,83 +0,0 @@ - - - - - - - - - - - -#include "ngspice/ngspice.h" -#include "ngspice/const.h" -#include "ngspice/ifsim.h" -#include "$(module)defs.h" -#include "ngspice/sperror.h" -#include "ngspice/suffix.h" - -int $(module)par(int param, IFvalue *value, GENinstance *inst, IFvalue *select) -{ - $(module)instance *myinstance = ($(module)instance*)inst; - NG_IGNOREABLE(value); - NG_IGNOREABLE(select); - NG_IGNOREABLE(myinstance); - switch (param) { - - - - - - - - - - - - - - - - - - - - - default: - return(-1); - } - return(OK); -} - - - - - - - - - - - - - - - diff --git a/src/spicelib/devices/adms/admst/ngspiceMODULEpzld.c.xml b/src/spicelib/devices/adms/admst/ngspiceMODULEpzld.c.xml deleted file mode 100644 index d43dec4b2..000000000 --- a/src/spicelib/devices/adms/admst/ngspiceMODULEpzld.c.xml +++ /dev/null @@ -1,106 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - -#include "ngspice/ngspice.h" -#include "ngspice/cktdefs.h" -#include "ngspice/complex.h" -#include "$(module)defs.h" -#include "ngspice/sperror.h" -#include "ngspice/suffix.h" - -int $(module)pzLoad(GENmodel *inModel, CKTcircuit *ckt, SPcomplex *s) -{ - $(module)model *model = ($(module)model*)inModel; - $(module)instance *here; - NG_IGNOREABLE(ckt); - for ( ; model != NULL; model = $(module)nextModel(model) ) - { - /* loop through all the instances of the model */ - for (here = $(module)instances(model); here != NULL ; here = $(module)nextInstance(here)) - { - - - - - - - - - - - - - - - - - - - - - - - - - - - - } /* End of MOSFET Instance */ - } /* End of Model Instance */ - return(OK); -} - - - - - - - - - - - - - - - diff --git a/src/spicelib/devices/adms/admst/ngspiceMODULEsetup.c.xml b/src/spicelib/devices/adms/admst/ngspiceMODULEsetup.c.xml deleted file mode 100644 index 5fd893635..000000000 --- a/src/spicelib/devices/adms/admst/ngspiceMODULEsetup.c.xml +++ /dev/null @@ -1,221 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - -#include "ngspice/ngspice.h" -#include "ngspice/cktdefs.h" -#include "ngspice/smpdefs.h" -#include "$(module)defs.h" -#include "ngspice/const.h" -#include "ngspice/sperror.h" -#include "ngspice/ifsim.h" -#include "ngspice/suffix.h" - -int $(module)setup (SMPmatrix *matrix, GENmodel *inModel, CKTcircuit *ckt, int *states) - /* load the $(module) device structure with those pointers needed later - * for fast matrix loading - */ -{ - $(module)model *model = ($(module)model*)inModel; - $(module)instance *here; - - /* loop through all the $(module) device models */ - for ( ;model != NULL ;model = $(module)nextModel(model) ) - { - - - - - - - - - - - - - - if(model->%s_Given == FALSE) model->%s=%s; - - - - - for ( here = $(module)instances(model) ;here != NULL ; here = $(module)nextInstance(here) ) - { - - - - - - - - - - - - - - if(here->%s_Given == FALSE) here->%s=%s; - - - - - /* External Nodes, connected ? */ - - here->%(name)Node_connected = (here->%(name)Node >= 0); - - - /* Internal Nodes */ - { - - - - - - - - here->%sNode = -1; - here->%(name)Node_mine = 0; - - } - - ((GENinstance*)here)->GENstate = *states; - *states += $(module)numStates; - /* set states */ - - - - here->state_%s_%s = *states; *states += 2; - - /* set Sparse Matrix Pointers */ - - - - here->PTR_J_%s_%s_required=0; - - - $(module)guesstopology(matrix,ckt,model,here); - - /* Internal Nodes */ - { - int error; - CKTnode *tmp; - - - - - - - if(here->%(name)Node == -1) - { - error=CKTmkVolt(ckt,&tmp,here->$(module)name,"X%(name)X"); - if(error) return(error); - here->%(name)Node = tmp->number; - here->%(name)Node_mine = 1; - } - - } - - - - if(here->PTR_J_%s_%s_required==1) - { - - - - - here->PTR_J_%s_%s=SMPmakeElt(matrix,here->%sNode,here->%sNode); - } - - - } - } - return(OK); -} - - -int -$(module)unsetup(GENmodel *inModel, CKTcircuit *ckt) -{ - $(module)model *model = ($(module)model*)inModel; - $(module)instance *here; - - /* loop through all the $(module) device models */ - for ( ;model != NULL ;model = $(module)nextModel(model) ) - { - for ( here = $(module)instances(model) ;here != NULL ; here = $(module)nextInstance(here) ) - { - - if (here->%(name)Node_mine) { - if (here->%(name)Node > 0) - CKTdltNNum(ckt, here->%(name)Node); - here->%(name)Node_mine = 0; - } - if (!here->%(name)Node_connected) - here->%(name)Node = -1; - - - if (here->%(name)Node_mine) - if (here->%(name)Node > 0) - CKTdltNNum(ckt, here->%(name)Node); - here->%(name)Node = -1; - here->%(name)Node_mine = 0; - - } - } - return OK; -} - - - - - - - - - - - - - - - diff --git a/src/spicelib/devices/adms/admst/ngspiceMODULEtemp.c.xml b/src/spicelib/devices/adms/admst/ngspiceMODULEtemp.c.xml deleted file mode 100644 index b40c18aa1..000000000 --- a/src/spicelib/devices/adms/admst/ngspiceMODULEtemp.c.xml +++ /dev/null @@ -1,88 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - -#include "ngspice/ngspice.h" -#include "ngspice/cktdefs.h" -#include "ngspice/smpdefs.h" -#include "$(module)defs.h" -#include "ngspice/const.h" -#include "ngspice/sperror.h" -#include "ngspice/ifsim.h" -#include "ngspice/suffix.h" - -#define _STATIC -#define _DYNAMIC - -int $(module)temp(GENmodel *inModel, CKTcircuit *ckt) -{ - $(module)model *model = ($(module)model*)inModel; - $(module)instance *here; - NG_IGNOREABLE(ckt); - for ( ; model != NULL; model = $(module)nextModel(model) ) - { - - - /* loop through all the instances of the model */ - for (here = $(module)instances(model); here != NULL ; here = $(module)nextInstance(here)) - { - - - } /* End of MOSFET Instance */ - } /* End of Model Instance */ - return(OK); -} - - - - - - - - - - - - - - - diff --git a/src/spicelib/devices/adms/admst/ngspiceMODULEtrunc.c.xml b/src/spicelib/devices/adms/admst/ngspiceMODULEtrunc.c.xml deleted file mode 100644 index 4b5152c8f..000000000 --- a/src/spicelib/devices/adms/admst/ngspiceMODULEtrunc.c.xml +++ /dev/null @@ -1,100 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - -#include "ngspice/ngspice.h" -#include "ngspice/cktdefs.h" -#include "$(module)defs.h" -#include "ngspice/sperror.h" -#include "ngspice/suffix.h" - -int $(module)trunc(GENmodel *inModel, CKTcircuit *ckt, double *timeStep) -{ - $(module)model *model = ($(module)model*)inModel; - $(module)instance *here; - -#ifdef STEPDEBUG - double debugtemp; -#endif /* STEPDEBUG */ - - for ( ; model != NULL; model = $(module)nextModel(model) ) - { - /* loop through all the instances of the model */ - for (here = $(module)instances(model); here != NULL ; here = $(module)nextInstance(here)) - { -#ifdef STEPDEBUG - debugtemp = *timeStep; -#endif /* STEPDEBUG */ - - - - - CKTterr(here->state_%s_%s, ckt, timeStep); - - - -#ifdef STEPDEBUG - if(debugtemp != *timeStep) - { printf("device %%s reduces step from %%g to %%g\\n", - here->$(module)name,debugtemp,*timeStep); - } -#endif /* STEPDEBUG */ - - } /* End of Instance */ - } /* End of Model */ - return(OK); -} - - - - - - - - - - - - - - - diff --git a/src/spicelib/devices/adms/admst/ngspiceMakefile.am.xml b/src/spicelib/devices/adms/admst/ngspiceMakefile.am.xml deleted file mode 100644 index b799f115a..000000000 --- a/src/spicelib/devices/adms/admst/ngspiceMakefile.am.xml +++ /dev/null @@ -1,156 +0,0 @@ - - - - - - - - - - - -## Process this file with automake to produce Makefile.in - -ADMSXMLINTERFACE=\$(srcdir)/../admst - -noinst_LTLIBRARIES = lib$(module).la - -BUILT_SOURCES = \\ - $(module).c \\ - $(module).hxx \\ - $(module)acld.c \\ - $(module).analogfunction.c \\ - $(module)ask.c \\ - $(module)defs.h \\ - $(module)del.c \\ - $(module)dest.c \\ - $(module)ext.h \\ - $(module)guesstopology.c \\ - $(module)init.c \\ - $(module)init.h \\ - $(module)itf.h \\ - $(module)load.c \\ - $(module)mask.c \\ - $(module)mdel.c \\ - $(module)mpar.c \\ - $(module)par.c \\ - $(module)pzld.c \\ - $(module)setup.c \\ - $(module)temp.c \\ - $(module)trunc.c - -lib$(module)_la_SOURCES = \\ - \$(BUILT_SOURCES) - -CLEANFILES = \\ - \$(BUILT_SOURCES) \\ - $(module)noise.c \\ - .$(module).va.adms \\ - .adms.implicit.xml \\ - .interface.xml \\ - constants.vams \\ - disciplines.vams \\ - *.h \\ - *.xml - -#TODO (not implemented) \\ - $(module)conv.c \\ - $(module)getic.c - -AM_CPPFLAGS = @AM_CPPFLAGS@ -I\$(top_srcdir)/src/include -AM_CFLAGS = \$(STATIC) - -MAINTAINERCLEANFILES = Makefile.in \\ - Makefile.am - -DISTCLEANFILES = Makefile.am \\ - Makefile.in - -\%.c \%.hxx \\ - \%acld.c \%.analogfunction.c \%ask.c \%defs.h \%del.c \%dest.c \%ext.h \%guesstopology.c \\ - \%init.c \%init.h \%itf.h \%load.c \%mask.c \%mdel.c \%mpar.c \%par.c \\ - \%pzld.c \%setup.c \%temp.c \%trunc.c \\ - : \$(srcdir)/admsva/\%.va \\ - \$(ADMSXMLINTERFACE)/adms.implicit.xml \\ - \$(ADMSXMLINTERFACE)/ngspiceVersion.xml \\ - \$(ADMSXMLINTERFACE)/analogfunction.xml \\ - \$(ADMSXMLINTERFACE)/ngspiceMODULEitf.h.xml \\ - \$(ADMSXMLINTERFACE)/ngspiceMODULEinit.c.xml \\ - \$(ADMSXMLINTERFACE)/ngspiceMODULEinit.h.xml \\ - \$(ADMSXMLINTERFACE)/ngspiceMODULEext.h.xml \\ - \$(ADMSXMLINTERFACE)/ngspiceMODULEdefs.h.xml \\ - \$(ADMSXMLINTERFACE)/ngspiceMODULEask.c.xml \\ - \$(ADMSXMLINTERFACE)/ngspiceMODULEmask.c.xml \\ - \$(ADMSXMLINTERFACE)/ngspiceMODULEpar.c.xml \\ - \$(ADMSXMLINTERFACE)/ngspiceMODULEmpar.c.xml \\ - \$(ADMSXMLINTERFACE)/ngspiceMODULEload.c.xml \\ - \$(ADMSXMLINTERFACE)/ngspiceMODULEacld.c.xml \\ - \$(ADMSXMLINTERFACE)/ngspiceMODULEpzld.c.xml \\ - \$(ADMSXMLINTERFACE)/ngspiceMODULEtemp.c.xml \\ - \$(ADMSXMLINTERFACE)/ngspiceMODULEtrunc.c.xml \\ - \$(ADMSXMLINTERFACE)/ngspiceMODULEsetup.c.xml \\ - \$(ADMSXMLINTERFACE)/ngspiceMODULEdel.c.xml \\ - \$(ADMSXMLINTERFACE)/ngspiceMODULEmdel.c.xml \\ - \$(ADMSXMLINTERFACE)/ngspiceMODULEdest.c.xml \\ - \$(ADMSXMLINTERFACE)/ngspiceMODULEnoise.c.xml \\ - \$(ADMSXMLINTERFACE)/ngspiceMODULEguesstopology.c.xml \\ - \$(ADMSXMLINTERFACE)/ngspiceMODULE.hxx.xml \\ - \$(ADMSXMLINTERFACE)/ngspiceMODULE.c.xml - \$(ADMSXML) -I\$(srcdir) -I\$(srcdir)/admsva \$< \\ - -x \\ - -e \$(ADMSXMLINTERFACE)/adms.implicit.xml \\ - -e \$(ADMSXMLINTERFACE)/ngspiceVersion.xml \\ - -e \$(ADMSXMLINTERFACE)/analogfunction.xml \\ - -e \$(ADMSXMLINTERFACE)/ngspiceMODULEitf.h.xml \\ - -e \$(ADMSXMLINTERFACE)/ngspiceMODULEinit.c.xml \\ - -e \$(ADMSXMLINTERFACE)/ngspiceMODULEinit.h.xml \\ - -e \$(ADMSXMLINTERFACE)/ngspiceMODULEext.h.xml \\ - -e \$(ADMSXMLINTERFACE)/ngspiceMODULEdefs.h.xml \\ - -e \$(ADMSXMLINTERFACE)/ngspiceMODULEask.c.xml \\ - -e \$(ADMSXMLINTERFACE)/ngspiceMODULEmask.c.xml \\ - -e \$(ADMSXMLINTERFACE)/ngspiceMODULEpar.c.xml \\ - -e \$(ADMSXMLINTERFACE)/ngspiceMODULEmpar.c.xml \\ - -e \$(ADMSXMLINTERFACE)/ngspiceMODULEload.c.xml \\ - -e \$(ADMSXMLINTERFACE)/ngspiceMODULEacld.c.xml \\ - -e \$(ADMSXMLINTERFACE)/ngspiceMODULEpzld.c.xml \\ - -e \$(ADMSXMLINTERFACE)/ngspiceMODULEtemp.c.xml \\ - -e \$(ADMSXMLINTERFACE)/ngspiceMODULEtrunc.c.xml \\ - -e \$(ADMSXMLINTERFACE)/ngspiceMODULEsetup.c.xml \\ - -e \$(ADMSXMLINTERFACE)/ngspiceMODULEdel.c.xml \\ - -e \$(ADMSXMLINTERFACE)/ngspiceMODULEmdel.c.xml \\ - -e \$(ADMSXMLINTERFACE)/ngspiceMODULEdest.c.xml \\ - -e \$(ADMSXMLINTERFACE)/ngspiceMODULEnoise.c.xml \\ - -e \$(ADMSXMLINTERFACE)/ngspiceMODULEguesstopology.c.xml \\ - -e \$(ADMSXMLINTERFACE)/ngspiceMODULE.hxx.xml \\ - -e \$(ADMSXMLINTERFACE)/ngspiceMODULE.c.xml - - - - - - - - - - - - - diff --git a/src/spicelib/devices/adms/admst/ngspiceVersion.xml b/src/spicelib/devices/adms/admst/ngspiceVersion.xml deleted file mode 100644 index 413b0c358..000000000 --- a/src/spicelib/devices/adms/admst/ngspiceVersion.xml +++ /dev/null @@ -1,2299 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - #if defined(_DYNAMIC)\n - - int %s;\n - double %s=0.0/0.0;\n - char* %s;\n - - - - - - - - - - - - - - #endif /*_DYNAMIC*/\n - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - int %(name);\n - double %(name);\n - char* %(name);\n - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - %s - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/src/spicelib/devices/adms/bsimbulk/admsva/bsimbulk.va b/src/spicelib/devices/adms/bsimbulk/admsva/bsimbulk.va deleted file mode 100644 index 11c13895f..000000000 --- a/src/spicelib/devices/adms/bsimbulk/admsva/bsimbulk.va +++ /dev/null @@ -1,4399 +0,0 @@ -// **************************************************************************** -// * BSIM-BULK 106.2.0 released by Chetan Gupta on 6/30/2017 * -// * BSIM Bulk MOSFET Model Equations (Verilog-A) * -// **************************************************************************** - -// **************************************************************************** -// * Copyright 2017 Regents of the University of California * -// * All rights reserved. * -// * * -// * Project director: Prof. Chenming Hu * -// * * -// * Current developers: Chetan Gupta (Ph.D. student, IIT Kanpur) * -// * Prof. Yogesh Chauhan (IIT Kanpur) * -// * Dr. Harshit Agarwal (Postdoc, UC Berkeley) * -// * Dr. Huan-Lin Chang (Postdoc, UC Berkeley) * -// * Dr. Pragya Kushwaha (Postdoc, UC Berkeley) * -// * Juan Duarte (Ph.D. student, UC Berkeley) * -// * Yen-Kai Lin (Ph.D. student, UC Berkeley) * -// **************************************************************************** - -// **************************************************************************** -// * Software is distributed as is, completely without warranty or service * -// * support. The University of California and its employees are not liable * -// * for the condition or performance of the software. * -// * * -// * The University of California owns the copyright and grants users a * -// * perpetual, irrevocable, worldwide, non-exclusive, royalty-free license * -// * with respect to the software as set forth below. * -// * * -// * The University of California hereby disclaims all implied warranties. * -// * * -// * The University of California grants the users the right to modify, * -// * copy, and redistribute the software and documentation, both within * -// * the user's organization and externally, subject to the following * -// * restrictions: * -// * * -// * 1. The users agree not to charge for the University of California code * -// * itself but may charge for additions, extensions, or support. * -// * * -// * 2. In any product based on the software, the users agree to * -// * acknowledge the University of California that developed the * -// * software. This acknowledgment shall appear in the product * -// * documentation. * -// * * -// * 3. Redistributions to others of source code and documentation must * -// * retain the copyright notice, disclaimer, and list of conditions. * -// * * -// * 4. Redistributions to others in binary form must reproduce the * -// * copyright notice, disclaimer, and list of conditions in the * -// * documentation and/or other materials provided with the * -// * distribution. * -// * * -// * Agreed to on _________Jun. 30, 2017__________ * -// * * -// * By: ____University of California, Berkeley___ * -// * ____Chenming Hu__________________________ * -// * ____Professor in Graduate School ________ * -// **************************************************************************** - -`include "constants.vams" -`include "disciplines.vams" - -// Disable strobe for improved performance speed -// To Use DISABLE_STROBE, Activate it here. Used Only at GEOMOD and RGEOMOD -// `define DISABLE_STROBE -`ifdef DISABLE_STROBE - `define STROBE(X) - `define STROBE2(X,Y) -`else - `define STROBE(X) $strobe(X) - `define STROBE2(X,Y) $strobe(X,Y) -`endif - -// Junction capacitance macro between S/D and bulk -`define JunCap(Czbx, Vbx_jct, PBX_t, MJX, czbx_p1, czbx_p2, Qbxj) \ - if (Czbx > 0.0) begin \ - T1 = Vbx_jct / PBX_t; \ - if (T1 < 0.9) begin \ - arg = 1.0 - T1; \ - if (MJX == 0.5) begin \ - sarg = 1.0 / sqrt(arg); \ - end else begin \ - sarg = lexp(-MJX * lln(arg)); \ - end \ - Qbxj = PBX_t * Czbx * (1.0 - arg * sarg) / (1.0 - MJX); \ - end else begin \ - T2 = czbx_p1 * (T1 - 1.0) * (5.0 * MJX * (T1 - 1.0) + (1.0 + MJX)); \ - Qbxj = PBX_t * Czbx * (T2 + czbx_p2); \ - end \ - end else begin \ - Qbxj = 0.0; \ - end \ - -// Normalized pinch-off voltage including PD -`define PO_psip(vg_vfb, gamma, DPD, phif, psip) \ - T1 = 1.0 + DPD; \ - vgfbPD = vg_vfb / T1; \ - gammaPD = gamma / T1; \ - T1 = 0.5 * vgfbPD - 3.0 * (1.0 + gammaPD / `M_SQRT2); \ - T2 = T1 + sqrt(T1 * T1 + 6.0 * vgfbPD); \ - if (vgfbPD < 0.0) begin \ - T3 = (vgfbPD - T2) / gammaPD; \ - psip = -lln(1.0 - T2 + T3 * T3); \ - end else begin \ - T3 = lexp(-T2); \ - T1 = 0.5 * gammaPD; \ - T2 = sqrt(vgfbPD - 1.0 + T3 + T1 * T1) - T1; \ - psip = T2 * T2 + 1.0 - T3; \ - end \ - -// Normalized charge-voltage relationship -`define BSIM_q(psip, phib, vch, gam, q) \ - T8 = 0.5 * (psip + 1.0 + sqrt((psip - 1.0) * (psip - 1.0) + 0.25 * 2.0 * 2.0)); \ - sqrtpsip = sqrt(T8); \ - T9 = 1.0 + gam / (2.0 * sqrtpsip); \ - T0 = (1.0 + (gam / (2.0 * sqrtpsip))) / gam; \ - T1 = psip - 2.0 * phib - vch; \ - T2 = T1 - lln(4.0 * T0 * sqrtpsip); \ - T8 = 0.5 * (T2 - 0.201491 - sqrt(T2 * (T2 + 0.402982) + 2.446562)); \ - sqrtpsisa = sqrtpsip; \ - if (T8 <= -68.0) begin \ - T4 = -100.0; \ - T5 = 20.0; \ - if (T8 < T4 - 0.5 * T5) \ - T3 = lexp(T4); \ - else begin \ - if (T8 > T4 + 0.5 * T5) \ - T3 = lexp(T8); \ - else begin \ - T2 = (T8 - T4) / T5; \ - T6 = T2 * T2; \ - T3 = lexp(T4 + T5 * ((5.0 / 64.0) + 0.5 * T2 + T6 * ((15.0 / 16.0) - T6 * (1.25 - T6)))); \ - end \ - end \ - q = T3 * (1.0 + T1 - T8 - lln(2.0 * T0 * (T3 * 2.0 * T0 + 2.0 * sqrtpsisa))); \ - end else begin \ - T3 = lexp(T8); \ - sqrtpsisainv = 1.0 / sqrtpsisa; \ - T4 = 2.0 * T3 + lln(T3 * 2.0 * T0 * (T3 * 2.0 * T0 + 2.0 * sqrtpsisa)) - T1; \ - T5 = 2.0 + (1.0 / T3) + (T0 + sqrtpsisainv) / (T0 * T3 + sqrtpsisa); \ - T3 = T3 - T4 / T5; \ - T4 = 2.0 * T3 + lln(T3 * 2.0 * T0 * (T3 * 2.0 * T0 + 2.0 * sqrtpsisa)) - T1; \ - T5 = 2.0 + (1.0 / T3) + (T0 + sqrtpsisainv) / (T0 * T3 + sqrtpsisa); \ - T6 = ((T0 + sqrtpsisainv) / (T0 * T3 + sqrtpsisa)) * ((T0 + sqrtpsisainv) / (T0 * T3 + sqrtpsisa)); \ - T7 = -((1.0 / T3) * (1.0 / T3)) - (1.0 / (sqrtpsisa * sqrtpsisa * sqrtpsisa * (T0 * T3 + sqrtpsisa))) - T6; \ - q = T3 - (T4 / T5) * (1.0 + T4 * T7 / (2.0 * T5 * T5)); \ - end \ - -// Smoothing function for (max of x, x0 with deltax) -`define Smooth(x, x0, deltax, xsmooth) \ - xsmooth = 0.5 * (x + x0 + sqrt((x - x0) * (x - x0) + 0.25 * deltax * deltax)); \ - -// Smoothing function for (max of x, x0 with deltax) -`define Smooth1(x, x0, deltax, xsmooth) \ - xsmooth = 0.5 * (x + x0 + sqrt((x - x0) * (x - x0) + 0.25 * deltax * deltax)) - 0.25 * deltax; \ - -// Smoothing function for (min of x, x0 with deltax) -`define Smooth2(x, x0, deltax, xsmooth) \ - xsmooth = 0.5 * (x + x0 - sqrt((x - x0) * (x - x0) + 0.25 * deltax * deltax)) + 0.25 * deltax; \ - -// Smoothing function for (min of x, x0 with deltax) -`define Min1(x, x0, deltax, xsmooth) \ - xsmooth = 0.5 * (x + x0 - sqrt((x - x0) * (x - x0) + 0.25 * deltax * deltax)); \ - - // These macros represent the subroutines to process the geometry dependent - // parasitics for BSIM-BULK, which calculates Ps, Pd, As, Ad, and Rs and Rd - // for multi-fingers and various GEO and RGEO options. - -// Define GEOMOD and RGEOMOD in the modelcard -`define BSIMBULKNumFingerDiff(nf, minSD, nuIntD, nuEndD, nuIntS, nuEndS) \ - if ((nf % 2) != 0) begin \ - nuEndD = 1.0; \ - nuEndS = 1.0; \ - nuIntD = 2.0 * max((nf - 1.0) / 2.0, 0.0); \ - nuIntS = nuIntD; \ - end else begin \ - if (minSD == 1) begin \ - nuEndD = 2.0; \ - nuIntD = 2.0 * max((nf / 2.0 - 1.0), 0.0); \ - nuEndS = 0.0; \ - nuIntS = nf; \ - end else begin \ - nuEndD = 0.0; \ - nuIntD = nf; \ - nuEndS = 2.0; \ - nuIntS = 2.0 * max((nf / 2.0 - 1.0), 0.0); \ - end \ - end - -`define BSIMBULKRdsEndIso(Weffcj, Rsh, DMCG, DMCI, DMDG, nuEnd, rgeo, SRCFLAG, Rend) \ - if (SRCFLAG == 1) begin \ - case (rgeo) \ - 1, 2, 5: begin \ - if (nuEnd == 0.0) begin \ - Rend = 0.0; \ - end else begin \ - Rend = Rsh * DMCG / (Weffcj * nuEnd); \ - end \ - end \ - 3, 4, 6: begin \ - if ((DMCG + DMCI) == 0.0) begin \ - `STROBE("(DMCG + DMCI) can not be equal to zero"); \ - end \ - if (nuEnd == 0.0) begin \ - Rend = 0.0; \ - end else begin \ - Rend = Rsh * Weffcj / (3.0 * nuEnd * (DMCG + DMCI)); \ - end \ - end \ - default: begin \ - `STROBE2("Warning: (instance BSIMBULK) Specified RGEO = %d not matched (BSIMBULKRdsEndIso), Rend is set to zero.", rgeo); \ - Rend = 0.0; \ - end \ - endcase \ - end else begin \ - case (rgeo) \ - 1, 3, 7: begin \ - if (nuEnd == 0.0) begin \ - Rend = 0.0; \ - end else begin \ - Rend = Rsh * DMCG / (Weffcj * nuEnd); \ - end \ - end \ - 2, 4, 8: begin \ - if ((DMCG + DMCI) == 0.0) begin \ - `STROBE("(DMCG + DMCI) can not be equal to zero"); \ - end \ - if (nuEnd == 0.0) begin \ - Rend = 0.0; \ - end \ - else begin \ - Rend = Rsh * Weffcj / (3.0 * nuEnd * (DMCG + DMCI)); \ - end \ - end \ - default: begin \ - `STROBE2("Warning: (instance BSIMBULK) Specified RGEO=%d not matched (BSIMBULKRdsEndIso type 2), Rend is set to zero.", rgeo); \ - Rend = 0.0; \ - end \ - endcase \ - end - -`define BSIMBULKRdsEndSha(Weffcj, Rsh, DMCG, DMCI, DMDG, nuEnd, rgeo, SRCFLAG, Rend) \ - begin \ - if (SRCFLAG == 1) begin \ - case (rgeo) \ - 1, 2, 5: begin \ - if (nuEnd == 0.0) begin \ - Rend = 0.0; \ - end else begin \ - Rend = Rsh * DMCG / (Weffcj * nuEnd); \ - end \ - end \ - 3, 4, 6: begin \ - if (DMCG == 0.0) begin \ - `STROBE("DMCG can not be equal to zero"); \ - end \ - if (nuEnd == 0.0) begin \ - Rend = 0.0; \ - end \ - else begin \ - Rend = Rsh * Weffcj / (6.0 * nuEnd * DMCG); \ - end \ - end \ - default: begin \ - `STROBE2("Warning: (instance BSIMBULK) Specified RGEO = %d not matched (BSIMBULKRdsEndSha), Rend is set to zero.", rgeo); \ - Rend = 0.0; \ - end \ - endcase \ - end else begin \ - case (rgeo) \ - 1, 3, 7: begin \ - if (nuEnd == 0.0) begin \ - Rend = 0.0; \ - end else begin \ - Rend = Rsh * DMCG / (Weffcj * nuEnd); \ - end \ - end \ - 2, 4, 8: begin \ - if (DMCG == 0.0) begin \ - `STROBE("DMCG can not be equal to zero"); \ - end \ - if (nuEnd == 0.0) begin \ - Rend = 0.0; \ - end \ - else begin \ - Rend = Rsh * Weffcj / (6.0 * nuEnd * DMCG); \ - end \ - end \ - default: begin \ - `STROBE2("Warning: (instance BSIMBULK) Specified RGEO=%d not matched (BSIMBULKRdsEndSha \ - type 2), Rend is set to zero.", rgeo); \ - Rend = 0.0; \ - end \ - endcase \ - end \ - end - -`define BSIMBULKRdseffGeo(nf, geo, rgeo, minSD, Weffcj, Rsh, DMCG, DMCI, DMDG, SRCFLAG, Rtot) \ - begin \ - if (geo < 9) begin \ - `BSIMBULKNumFingerDiff(nf, minSD, nuIntD, nuEndD, nuIntS, nuEndS) \ - if (SRCFLAG == 1) begin \ - if (nuIntS == 0.0) begin \ - Rint = 0.0; \ - end else begin \ - Rint = Rsh * DMCG / ( Weffcj * nuIntS); \ - end \ - end \ - else begin \ - if (nuIntD == 0.0) begin \ - Rint = 0.0; \ - end else begin \ - Rint = Rsh * DMCG / ( Weffcj * nuIntD); \ - end \ - end \ - end \ - case (geo) \ - 0: begin \ - if (SRCFLAG == 1) begin \ - `BSIMBULKRdsEndIso(Weffcj, Rsh, DMCG, DMCI, DMDG, nuEndS, \ - rgeo, 1, Rend) \ - end else begin \ - `BSIMBULKRdsEndIso(Weffcj, Rsh, DMCG, DMCI, DMDG, nuEndD, \ - rgeo, 0, Rend) \ - end \ - end \ - 1: begin \ - if (SRCFLAG == 1) begin \ - `BSIMBULKRdsEndIso(Weffcj, Rsh, DMCG, DMCI, DMDG, nuEndS, \ - rgeo, 1, Rend) \ - end else begin \ - `BSIMBULKRdsEndSha(Weffcj, Rsh, DMCG, DMCI, DMDG, nuEndD, \ - rgeo, 0, Rend) \ - end \ - end \ - 2: begin \ - if (SRCFLAG == 1) begin \ - `BSIMBULKRdsEndSha(Weffcj, Rsh, DMCG, DMCI, DMDG, nuEndS, \ - rgeo, 1, Rend) \ - end else begin \ - `BSIMBULKRdsEndIso(Weffcj, Rsh, DMCG, DMCI, DMDG, nuEndD, \ - rgeo, 0, Rend) \ - end \ - end \ - 3: begin \ - if (SRCFLAG == 1) begin \ - `BSIMBULKRdsEndSha(Weffcj, Rsh, DMCG, DMCI, DMDG, nuEndS, \ - rgeo, 1, Rend) \ - end else begin \ - `BSIMBULKRdsEndSha(Weffcj, Rsh, DMCG, DMCI, DMDG, nuEndD, \ - rgeo, 0, Rend) \ - end \ - end \ - 4: begin \ - if (SRCFLAG == 1) begin \ - `BSIMBULKRdsEndIso(Weffcj, Rsh, DMCG, DMCI, DMDG, nuEndS, \ - rgeo, 1, Rend) \ - end else begin \ - Rend = Rsh * DMDG / Weffcj; \ - end \ - end \ - 5: begin \ - if (SRCFLAG == 1) begin \ - `BSIMBULKRdsEndSha(Weffcj, Rsh, DMCG, DMCI, DMDG, nuEndS, \ - rgeo, 1, Rend) \ - end else begin \ - if (nuEndD==0) begin\ - Rend = 0;\ - end else begin \ - Rend = Rsh * DMDG / (Weffcj * nuEndD); \ - end \ - end\ - end \ - 6: begin \ - if (SRCFLAG == 1) begin \ - Rend = Rsh * DMDG / Weffcj; \ - end else begin \ - `BSIMBULKRdsEndIso(Weffcj, Rsh, DMCG, DMCI, DMDG, nuEndD, \ - rgeo, 0, Rend) \ - end \ - end \ - 7:begin \ - if (SRCFLAG == 1) begin \ - if (nuEndS == 0) begin \ - Rend = 0; \ - end else begin \ - Rend = Rsh * DMDG / (Weffcj * nuEndS); \ - end \ - end else \ - `BSIMBULKRdsEndSha(Weffcj, Rsh, DMCG, DMCI, DMDG, nuEndD, \ - rgeo, 0, Rend) \ - end \ - 8: begin \ - Rend = Rsh * DMDG / Weffcj; \ - end \ - 9: begin /* all wide contacts assumed for geo = 9 and 10 */\ - if (SRCFLAG == 1) begin \ - Rend = 0.5 * Rsh * DMCG / Weffcj; \ - if (nf == 2.0) begin \ - Rint = 0.0; \ - end else begin \ - Rint = Rsh * DMCG / (Weffcj * (nf - 2.0)); \ - end \ - end \ - else begin \ - Rend = 0.0; \ - Rint = Rsh * DMCG / (Weffcj * nf); \ - end \ - end \ - 10: begin \ - if (SRCFLAG == 1) begin \ - Rend = 0.0; \ - Rint = Rsh * DMCG / (Weffcj * nf); \ - end \ - else begin \ - Rend = 0.5 * Rsh * DMCG / Weffcj; \ - if (nf == 2.0) begin \ - Rint = 0.0; \ - end else begin \ - Rint = Rsh * DMCG / (Weffcj * (nf - 2.0)); \ - end \ - end \ - end \ - default: begin \ - `STROBE2("Warning: (instance BSIMBULK) Specified GEO=%d not matched (BSIMBULKRdseffGeo), Rint is set to zero.", geo); \ - Rint = 0.0; \ - end \ - endcase \ - if (Rint <= 0.0) begin \ - Rtot = Rend; \ - end else if (Rend <= 0.0) begin \ - Rtot = Rint; \ - end else begin \ - Rtot = Rint * Rend / (Rint + Rend); \ - end \ - if (Rtot==0.0) begin \ - `STROBE("Warning: (instance BSIMBULK) Zero resistance returned from RdseffGeo"); \ - end \ - end - -// Effective PS, PD, AS, AD calculation, Ref: BSIM4 -`define BSIMBULKPAeffGeo(nf, geo, minSD,Weffcj, DMCG, DMCI, DMDG, Ps, Pd, As, Ad) \ - begin if (geo < 9) \ - `BSIMBULKNumFingerDiff(nf, minSD, nuIntD, nuEndD, nuIntS, nuEndS) \ - T0 = DMCG + DMCI;\ - T1 = DMCG + DMCG;\ - T2y = DMDG + DMDG;\ - PSiso = T0 + T0 + Weffcj;\ - PDiso = T0 + T0 + Weffcj;\ - PSsha = T1;\ - PDsha = T1;\ - PSmer = T2y;\ - PDmer = T2y;\ - ASiso = T0 * Weffcj;\ - ADiso = T0 * Weffcj;\ - ASsha = DMCG * Weffcj;\ - ADsha = DMCG * Weffcj;\ - ASmer = DMDG * Weffcj; \ - ADmer = DMDG * Weffcj; \ - case (geo) \ - 0: begin \ - Ps = nuEndS * PSiso + nuIntS * PSsha;\ - Pd = nuEndD * PDiso + nuIntD * PDsha;\ - As = nuEndS * ASiso + nuIntS * ASsha;\ - Ad = nuEndD * ADiso + nuIntD * ADsha;\ - end \ - 1: begin \ - Ps = nuEndS * PSiso + nuIntS * PSsha;\ - Pd = (nuEndD + nuIntD) * PDsha;\ - As = nuEndS * ASiso + nuIntS * ASsha;\ - Ad = (nuEndD + nuIntD) * ADsha;\ - end \ - 2: begin \ - Ps = (nuEndS + nuIntS) * PSsha;\ - Pd = nuEndD * PDiso + nuIntD * PDsha;\ - As = (nuEndS + nuIntS) * ASsha;\ - Ad = nuEndD * ADiso + nuIntD * ADsha;\ - end \ - 3: begin \ - Ps = (nuEndS + nuIntS) * PSsha;\ - Pd = (nuEndD + nuIntD) * PDsha;\ - As = (nuEndS + nuIntS) * ASsha;\ - Ad = (nuEndD + nuIntD) * ADsha;\ - end \ - 4: begin \ - Ps = nuEndS * PSiso + nuIntS * PSsha;\ - Pd = nuEndD * PDmer + nuIntD * PDsha;\ - As = nuEndS * ASiso + nuIntS * ASsha;\ - Ad = nuEndD * ADmer + nuIntD * ADsha;\ - end \ - 5: begin \ - Ps = (nuEndS + nuIntS) * PSsha;\ - Pd = nuEndD * PDmer + nuIntD * PDsha;\ - As = (nuEndS + nuIntS) * ASsha;\ - Ad = nuEndD * ADmer + nuIntD * ADsha;\ - end \ - 6: begin \ - Ps = nuEndS * PSmer + nuIntS * PSsha;\ - Pd = nuEndD * PDiso + nuIntD * PDsha;\ - As = nuEndS * ASmer + nuIntS * ASsha;\ - Ad = nuEndD * ADiso + nuIntD * ADsha;\ - end \ - 7: begin \ - Ps = nuEndS * PSmer + nuIntS * PSsha;\ - Pd = (nuEndD + nuIntD) * PDsha;\ - As = nuEndS * ASmer + nuIntS * ASsha;\ - Ad = (nuEndD + nuIntD) * ADsha;\ - end \ - 8: begin \ - Ps = nuEndS * PSmer + nuIntS * PSsha;\ - Pd = nuEndD * PDmer + nuIntD * PDsha;\ - As = nuEndS * ASmer + nuIntS * ASsha;\ - Ad = nuEndD * ADmer + nuIntD * ADsha;\ - end \ - 9: begin \ - Ps = PSiso + (nf - 1.0) * PSsha;\ - Pd = nf * PDsha;\ - As = ASiso + (nf - 1.0) * ASsha;\ - Ad = nf * ADsha;\ - end \ - 10: begin \ - Ps = nf * PSsha;\ - Pd = PDiso + (nf - 1.0) * PDsha;\ - As = nf * ASsha;\ - Ad = ADiso + (nf - 1.0) * ADsha;\ - end \ - default: begin \ - `STROBE2("Warning: (instance BSIMBULK) Specified GEO=%d not matched (BSIMBULKPAeffGeo \ - ), PS,PD,AS,AD set to zero.", geo); \ - Ps = 0;\ - Pd = 0;\ - As = 0;\ - Ad = 0;\ - end \ - endcase \ - end \ - -// Numerical Constants -`define EXPL_THRESHOLD 80.0 -`define MAX_EXPL 5.540622384e34 -`define MIN_EXPL 1.804851387e-35 -`define N_MINLOG 1.0e-38 -`define DELTA_1 0.02 -`define Oneby3 0.33333333333333333 -`define REFTEMP 300.15 // 27 degrees C - -// Physical Constants -`define ntype 1 -`define ptype -1 -`define q 1.60219e-19 -`define EPS0 8.85418e-12 -`define KboQ 8.617087e-5 // Joule/degree - -// Macros for the model/instance parameters -// -// MPRxx model parameter real -// MPIxx model parameter integer -// IPRxx instance parameter real -// IPIxx instance parameter integer -// || -// cc closed lower bound, closed upper bound -// oo open lower bound, open upper bound -// co closed lower bound, open upper bound -// oc open lower bound, closed upper bound -// cz closed lower bound=0, open upper bound=inf -// oz open lower bound=0, open upper bound=inf -// nb no bounds -// ex no bounds with exclude -// sw switch(integer only, values 0=false and 1=true) -// ty switch(integer only, values -1=p-type and +1=n-type) -// -// IPM instance parameter mFactor(multiplicity, implicit for LRM 2.2) -// OPP operating point parameter, includes units and description for printing - -`define OPP(nam,uni,des) (* units=uni, desc=des *) real nam; -`define OPM(nam,uni,des) (* units=uni, desc=des, multiplicity="multiply" *) real nam; -`define OPD(nam,uni,des) (* units=uni, desc=des, multiplicity="divide" *) real nam; - -`define MPRnb(nam,def,uni, des) (* units=uni, desc=des *) parameter real nam=def; -`define MPRex(nam,def,uni,exc, des) (* units=uni, desc=des *) parameter real nam=def exclude exc; -`define MPRcc(nam,def,uni,lwr,upr,des) (* units=uni, desc=des *) parameter real nam=def from[lwr:upr]; -`define MPRoo(nam,def,uni,lwr,upr,des) (* units=uni, desc=des *) parameter real nam=def from(lwr:upr); -`define MPRco(nam,def,uni,lwr,upr,des) (* units=uni, desc=des *) parameter real nam=def from[lwr:upr); -`define MPRoc(nam,def,uni,lwr,upr,des) (* units=uni, desc=des *) parameter real nam=def from(lwr:upr]; -`define MPRcz(nam,def,uni, des) (* units=uni, desc=des *) parameter real nam=def from[ 0:inf); -`define MPRoz(nam,def,uni, des) (* units=uni, desc=des *) parameter real nam=def from( 0:inf); - -`define MPInb(nam,def,uni, des) (* units=uni, desc=des *) parameter integer nam=def; -`define MPIex(nam,def,uni,exc, des) (* units=uni, desc=des *) parameter integer nam=def exclude exc; -`define MPIcc(nam,def,uni,lwr,upr,des) (* units=uni, desc=des *) parameter integer nam=def from[lwr:upr]; -`define MPIoo(nam,def,uni,lwr,upr,des) (* units=uni, desc=des *) parameter integer nam=def from(lwr:upr); -`define MPIco(nam,def,uni,lwr,upr,des) (* units=uni, desc=des *) parameter integer nam=def from[lwr:upr); -`define MPIoc(nam,def,uni,lwr,upr,des) (* units=uni, desc=des *) parameter integer nam=def from(lwr:upr]; -`define MPIcz(nam,def,uni, des) (* units=uni, desc=des *) parameter integer nam=def from[ 0:inf); -`define MPIoz(nam,def,uni, des) (* units=uni, desc=des *) parameter integer nam=def from( 0:inf); -`define MPIsw(nam,def,uni, des) (* units=uni, desc=des *) parameter integer nam=def from[ 0: 1]; -`define MPIty(nam,def,uni, des) (* units=uni, desc=des *) parameter integer nam=def from[ -1: 1] exclude 0; -`define IPRnb(nam,def,uni, des) (* units=uni, type = "instance", desc=des *) parameter real nam=def; -`define IPRex(nam,def,uni,exc, des) (* units=uni, type = "instance", desc=des *) parameter real nam=def exclude exc; -`define IPRcc(nam,def,uni,lwr,upr,des) (* units=uni, type = "instance", desc=des *) parameter real nam=def from[lwr:upr]; -`define IPRoo(nam,def,uni,lwr,upr,des) (* units=uni, type = "instance", desc=des *) parameter real nam=def from(lwr:upr); -`define IPRco(nam,def,uni,lwr,upr,des) (* units=uni, type = "instance", desc=des *) parameter real nam=def from[lwr:upr); -`define IPRoc(nam,def,uni,lwr,upr,des) (* units=uni, type = "instance", desc=des *) parameter real nam=def from(lwr:upr]; -`define IPRcz(nam,def,uni, des) (* units=uni, type = "instance", desc=des *) parameter real nam=def from[ 0:inf); -`define IPRoz(nam,def,uni, des) (* units=uni, type = "instance", desc=des *) parameter real nam=def from( 0:inf); -`define IPInb(nam,def,uni, des) (* units=uni, type = "instance", desc=des *) parameter integer nam=def; -`define IPIex(nam,def,uni,exc, des) (* units=uni, type = "instance", desc=des *) parameter integer nam=def exclude exc; -`define IPIcc(nam,def,uni,lwr,upr,des) (* units=uni, type = "instance", desc=des *) parameter integer nam=def from[lwr:upr]; -`define IPIoo(nam,def,uni,lwr,upr,des) (* units=uni, type = "instance", desc=des *) parameter integer nam=def from(lwr:upr); -`define IPIco(nam,def,uni,lwr,upr,des) (* units=uni, type = "instance", desc=des *) parameter integer nam=def from[lwr:upr); -`define IPIoc(nam,def,uni,lwr,upr,des) (* units=uni, type = "instance", desc=des *) parameter integer nam=def from(lwr:upr]; -`define IPIcz(nam,def,uni, des) (* units=uni, type = "instance", desc=des *) parameter integer nam=def from[ 0:inf); -`define IPIoz(nam,def,uni, des) (* units=uni, type = "instance", desc=des *) parameter integer nam=def from( 0:inf); -`define BPRco(nam, def, uni, lwr, upr, des) (* units = uni, type = "instance", desc = des *) parameter real nam = def from[lwr : upr); -`define BPRoz(nam, def, uni, des) (* units = uni, type = "instance", desc = des *) parameter real nam = def from(0.0 : inf); -`define BPRcz(nam, def, uni, des) (* units = uni, type = "instance", desc = des *) parameter real nam = def from[0.0 : inf); -`define BPIcc(nam, def, uni, lwr, upr, des) (* units = uni, type = "instance", desc = des *) parameter integer nam = def from[lwr : upr]; -`define BPInb(nam,def,uni, des) (* units=uni, type = "instance", desc=des *) parameter integer nam=def; -`define BPRnb(nam,def,uni, des) (* units=uni, type = "instance", desc=des *) parameter real nam=def; - - -module bsimbulk(d, g, s, b, t); -inout d, g, s, b, t; -electrical d, g, s, b, di, si, gi, gm, bi, sbulk, dbulk; -thermal t; - -// Extra internal nodes and branches (TNOIMOD=1) for correlated drain and gate noise -electrical N1, N2; -branch (N1) NI; -branch (N1) NR; -branch (N1) NC; - -// Clamped exponential function -analog function real lexp; - input x; - real x; - begin - if (x > `EXPL_THRESHOLD) begin - lexp = `MAX_EXPL * (1.0 + x - `EXPL_THRESHOLD); - end else if (x < -`EXPL_THRESHOLD) begin - lexp = `MIN_EXPL; - end else begin - lexp = exp(x); - end - end -endfunction - -// Clamped log function -analog function real lln; - input x; - real x; - begin - lln = ln(max(x, `N_MINLOG)); - end -endfunction - -// Hyperbolic smoothing function -analog function real hypsmooth; - input x, c; - real x, c; - begin - hypsmooth = 0.5 * (x + sqrt(x * x + 4.0 * c * c)); - end -endfunction - -// Pure instance parameters -`IPRoz( L ,1.0e-5 ,"m" ,"Length" ) -`IPRoz( W ,1.0e-5 ,"m" ,"Total width including fingers" ) -`IPIco( NF ,1 ,"" ,1 ,inf ,"Number of fingers" ) -`IPRcz( NRS ,1.0 ,"" ,"Number of squares in source" ) -`IPRcz( NRD ,1.0 ,"" ,"Number of squares in drain" ) -`IPRnb( VFBSDOFF ,0.0 ,"V" ,"Flat-band Voltage Offset Parameter" ) -`IPIcc( MINZ ,0 ,"" ,0 ,1 ,"Minimize either D or S" ) -`IPRnb( XGW ,0.0 ,"m" ,"Distance from gate contact centre to dev edge" ) -`IPIcc( NGCON ,1 ,"" ,1 ,2 ,"Number of gate contacts" ) -`IPIcc( RGATEMOD ,0 ,"" ,0 ,3 ,"Gate resistance model selector" ) -`IPIcc( RBODYMOD ,0 ,"" ,0 ,2 ,"Distributed body R model" ) -`IPIcc( GEOMOD ,0 ,"" ,0 ,10 ,"Geometry-dependent parasitics model" ) -`IPIcc( RGEOMOD ,0 ,"" ,0 ,8 ,"Geometry-dependent source/drain resistance, 0: RSH-based, 1: Holistic" ) -`IPIcc( EDGEFET ,0 ,"" ,0 ,1 ,"0: Edge FET Model Off, 1: Edge FET Model ON" ) -`IPIcc( SSLMOD ,0 ,"" ,0 ,1 ,"Sub-Surface Leakage Drain Current, 0: Turn off 1: Turn on" ) -`IPRcz( RBPB ,50.0 ,"ohm" ,"Resistance between bNodePrime and bNode" ) -`IPRcz( RBPD ,50.0 ,"ohm" ,"Resistance between bNodePrime and bNode " ) -`IPRcz( RBPS ,50.0 ,"ohm" ,"Resistance between bNodePrime and sbNode " ) -`IPRcz( RBDB ,50.0 ,"ohm" ,"Resistance between bNode and dbNode " ) -`IPRcz( RBSB ,50.0 ,"ohm" ,"Resistance between bNode and sbNode" ) -`IPRnb( SA ,0.0 ,"m" ,"Distance between OD edge from Poly from one side" ) -`IPRnb( SB ,0.0 ,"m" ,"Distance between OD edge from Poly from other side" ) -`IPRnb( SD ,0.0 ,"m" ,"Distance between neighbouring fingers" ) -`IPRoo( SCA ,0.0 ,"" ,-inf ,inf ,"Integral of the first distribution function for scattered well dopant" ) -`IPRoo( SCB ,0.0 ,"" ,-inf ,inf ,"Integral of second distribution function for scattered well dopant" ) -`IPRoo( SCC ,0.0 ,"" ,-inf ,inf ,"Integral of third distribution function for scattered well dopant" ) -`IPRoo( SC ,0.0 ,"m" ,-inf ,inf ,"Distance to a single well edge if <=0.0, turn off WPE" ) -`IPRcz( AS ,0.0 ,"m^2" ,"Source to Substrate Junction Area" ) -`IPRcz( AD ,0.0 ,"m^2" ,"Drain to Substrate Junction Area" ) -`IPRcz( PS ,0.0 ,"m" ,"Source to Substrate Junction Perimeter" ) -`IPRcz( PD ,0.0 ,"m" ,"Drain to Substrate Junction Perimeter" ) - -// Both model and instance parameters -`BPRnb( DTEMP ,0.0 ,"K" ,"Offset of Device Temperature" ) -`BPRnb( MULU0 ,1.0 ,"m^2/(V*s)" ,"Multiplication factor for low field mobility" ) -`BPRnb( DELVTO ,0.0 ,"V" ,"Zero bias threshold voltage variation" ) -`BPRcz( IDS0MULT ,1.0 ,"" ,"Variability in drain current for miscellaneous reasons" ) - -// Pure model parameters -`MPIty( TYPE ,`ntype ,"" ,"ntype=1, ptype=-1" ) -`MPIcc( CVMOD ,0 ,"" ,0 ,1 ,"0: Consistent IV-CV, 1: Different IV-CV" ) -`MPIcc( COVMOD ,0 ,"" ,0 ,1 ,"0: Use Bias-independent Overlap Capacitances, 1: Use Bias-dependent Overlap Capacitances" ) -`MPIcc( RDSMOD ,0 ,"" ,0 ,2 ,"0: Internal bias dependent and external bias independent s/d resistance model, 1: External s/d resistance model, 2: Internal s/d resistance model" ) -`MPIcc( WPEMOD ,0 ,"" ,0 ,1 ,"Model flag" ) -`MPIcc( ASYMMOD ,0 ,"" ,0 ,1 ,"0: Asymmetry Model turned off - forward mode parameters used, 1: Asymmetry Model turned on" ) -`MPIcc( GIDLMOD ,0 ,"" ,0 ,1 ,"0: Turn off GIDL Current, 1: Turn on GIDL Current" ) -`MPIcc( IGCMOD ,0 ,"" ,0 ,1 ,"0: Turn off Igc, Igs and Igd, 1: Turn on Igc, Igs and Igd" ) -`MPIcc( IGBMOD ,0 ,"" ,0 ,1 ,"0: Turn off Igb, 1: Turn on Igb" ) -`MPIcc( TNOIMOD ,0 ,"" ,0 ,1 ,"Thermal noise model selector" ) -`MPIcc( SHMOD ,0 ,"" ,0 ,1 ,"0 : Self heating model OFF, 1 : Self heating model ON" ) -`MPIcc( MOBSCALE ,0 ,"" ,0 ,1 ,"Mobility scaling model, 0: Old Model, 1: New Model" ) - -// Device parameters -`MPRoz( LLONG ,10u ,"m" ,"L of extracted Long channel device" ) -`MPRoz( LMLT ,1.0 ,"" ,"Length Shrinking Parameter" ) -`MPRoz( WMLT ,1.0 ,"" ,"Width Shrinking Parameter" ) -`MPRnb( XL ,0.0 ,"m" ,"L offset for channel length due to mask/etch effect" ) -`MPRoz( WWIDE ,10u ,"m" ,"W of extracted Wide channel device" ) -`MPRnb( XW ,0.0 ,"m" ,"W offset for channel width due to mask/etch effect" ) -`MPRnb( LINT ,0.0 ,"m" ,"Delta L for IV" ) -`MPRnb( LL ,0.0 ,"m^(1+LLN)" ,"Length reduction parameter" ) -`MPRnb( LW ,0.0 ,"m^(1+LWN)" ,"Length reduction parameter" ) -`MPRnb( LWL ,0.0 ,"m^(1+LLN+LWN)" ,"Length reduction parameter" ) -`MPRnb( LLN ,1.0 ,"" ,"Length reduction parameter" ) -`MPRnb( LWN ,1.0 ,"" ,"Length reduction parameter" ) -`MPRnb( WINT ,0.0 ,"m" ,"Delta W for IV" ) -`MPRnb( WL ,0.0 ,"m^(1+WLN)" ,"Width reduction parameter" ) -`MPRnb( WW ,0.0 ,"m^(1+WWN)" ,"Width reduction parameter" ) -`MPRnb( WWL ,0.0 ,"m^(1+WWN+WLN)" ,"Width reduction parameter" ) -`MPRnb( WLN ,1.0 ,"" ,"Width reduction parameter" ) -`MPRnb( WWN ,1.0 ,"" ,"Width reduction parameter" ) -`MPRnb( DLC ,0.0 ,"m" ,"Delta L for CV" ) -`MPRnb( LLC ,0.0 ,"m^(1+LLN)" ,"Length reduction parameter" ) -`MPRnb( LWC ,0.0 ,"m^(1+LWN)" ,"Length reduction parameter" ) -`MPRnb( LWLC ,0.0 ,"m^(1+LWN+LLN)" ,"Length reduction parameter" ) -`MPRnb( DWC ,0.0 ,"m" ,"Delta W for CV" ) -`MPRnb( WLC ,0.0 ,"m^(1+WLN)" ,"Width reduction parameter" ) -`MPRnb( WWC ,0.0 ,"m^(1+WWN)" ,"Width reduction parameter" ) -`MPRnb( WWLC ,0.0 ,"m^(1+WWN+WLN)" ,"Width reduction parameter" ) -`MPRoo( TOXE ,3.0e-9 ,"m" ,0 ,inf ,"Effective gate dielectric thickness relative to SiO2" ) -`MPRoo( TOXP ,TOXE ,"m" ,0 ,inf ,"Physical gate dielectric thickness. If not given, TOXP is calculated from TOXE and DTOX" ) -`MPRnb( DTOX ,0.0 ,"m" ,"Difference between effective dielectric thickness" ) -`MPRnb( NDEP ,1e24 ,"1/m^3" ,"Channel Doping Concentration for IV" ) -`MPRnb( NDEPL1 ,0.0 ,"m" ,"Length dependence coefficient of NDEP" ) -`MPRoz( NDEPLEXP1 ,1.0 ,"" ,"Length dependence exponent coefficient of NDEP" ) -`MPRnb( NDEPL2 ,0.0 ,"m" ,"Length dependence of NDEP - For Short Channel Devices" ) -`MPRoz( NDEPLEXP2 ,2.0 ,"" ,"Length dependence exponent coefficient of NDEP" ) -`MPRnb( NDEPW ,0.0 ,"m" ,"Width dependence coefficient of NDEP" ) -`MPRoz( NDEPWEXP ,1.0 ,"" ,"Width dependence exponent coefficient of NDEP" ) -`MPRnb( NDEPWL ,0.0 ,"m^2" ,"Width-Length dependence coefficient of NDEP" ) -`MPRoz( NDEPWLEXP ,1.0 ,"" ,"Width-Length dependence exponent coefficient of NDEP" ) -`MPRnb( LNDEP ,0.0 ,"1/m^2" ,"Length dependence of NDEP" ) -`MPRnb( WNDEP ,0.0 ,"1/m^2" ,"Width dependence of NDEP" ) -`MPRnb( PNDEP ,0.0 ,"1/m" ,"Area dependence of NDEP " ) -`MPRnb( NDEPCV ,NDEP ,"1/m^3" ,"Channel Doping Concentration for CV" ) -`MPRnb( NDEPCVL1 ,NDEPL1 ,"m" ,"Length dependence coefficient of NDEPCV" ) -`MPRoz( NDEPCVLEXP1 ,NDEPLEXP1 ,"" ,"Length dependence exponent coefficient of NDEPCV" ) -`MPRnb( NDEPCVL2 ,NDEPL2 ,"m" ,"Length dependence coefficient of NDEPCV - For Short Channel Devices" ) -`MPRoz( NDEPCVLEXP2 ,NDEPLEXP2 ,"" ,"Length dependence exponent coefficient of NDEPCV" ) -`MPRnb( NDEPCVW ,NDEPW ,"m" ,"Width dependence coefficient of NDEPCV" ) -`MPRoz( NDEPCVWEXP ,NDEPWEXP ,"" ,"Width dependence exponent coefficient of NDEPCV" ) -`MPRnb( NDEPCVWL ,NDEPWL ,"m^2" ,"Width-Length dependence coefficient of NDEPCV" ) -`MPRoz( NDEPCVWLEXP ,NDEPWLEXP ,"" ,"Width-Length dependence exponent coefficient of NDEPCV" ) -`MPRnb( LNDEPCV ,LNDEP ,"1/m^2" ,"Length dependence of NDEP for CV" ) -`MPRnb( WNDEPCV ,WNDEP ,"1/m^2" ,"Width dependence of NDEP for CV" ) -`MPRnb( PNDEPCV ,PNDEP ,"1/m" ,"Area dependence of NDEP for CV" ) -`MPRnb( NGATE ,5e25 ,"1/m^3" ,"Gate Doping Concentration" ) -`MPRnb( LNGATE ,0.0 ,"1/m^2" ,"Length dependence of NGATE" ) -`MPRnb( WNGATE ,0.0 ,"1/m^2" ,"Width dependence of NGATE" ) -`MPRnb( PNGATE ,0.0 ,"1/m" ,"Area dependence of NGATE" ) -`MPRnb( EASUB ,4.05 ,"eV" ,"Electron affinity of substrate" ) -`MPRoz( NI0SUB ,1.1e16 ,"1/m^3" ,"Intrinsic carrier concentration of the substrate at 300.15K" ) -`MPRoo( BG0SUB ,1.17 ,"eV" ,0 ,inf ,"Band gap of substrate at 300.15K" ) -`MPRoo( EPSRSUB ,11.9 ,"" ,0 ,inf ,"Relative dielectric constant of the channel material" ) -`MPRoo( EPSROX ,3.9 ,"" ,0 ,inf ,"Relative dielectric constant of the gate dielectric" ) -`MPRnb( XJ ,1.5e-7 ,"m" ,"S/D junction depth" ) -`MPRnb( LXJ ,0.0 ,"m^2" ,"Length dependence of XJ " ) -`MPRnb( WXJ ,0.0 ,"m^2" ,"Width dependence of XJ" ) -`MPRnb( PXJ ,0.0 ,"m^3" ,"Area dependence of XJ" ) -`MPRnb( VFB ,-0.5 ,"V" ,"Flat band voltage " ) -`MPRnb( LVFB ,0.0 ,"V*m" ,"Length dependence of VFB" ) -`MPRnb( WVFB ,0.0 ,"V*m" ,"Width dependence of VFB" ) -`MPRnb( PVFB ,0.0 ,"V*m^2" ,"Area dependence of VFB" ) -`MPRnb( VFBCV ,VFB ,"V" ,"Flat band voltage for CV" ) -`MPRnb( LVFBCV ,LVFB ,"V*m" ,"Length dependence of VFBCV" ) -`MPRnb( WVFBCV ,WVFB ,"V*m" ,"Width dependence of VFBCV" ) -`MPRnb( PVFBCV ,PVFB ,"V*m^2" ,"Area dependence of VFBCV" ) -`MPRnb( VFBCVL ,0.0 ,"m" ,"Length dependence coefficient of VFBCV" ) -`MPRoz( VFBCVLEXP ,1.0 ,"" ,"Length dependence exponent coefficient of VFBCV" ) -`MPRnb( VFBCVW ,0.0 ,"m" ,"Width dependence coefficient of VFBCV" ) -`MPRoz( VFBCVWEXP ,1.0 ,"" ,"Width dependence exponent coefficient of VFBCV" ) -`MPRnb( VFBCVWL ,0.0 ,"m^2" ,"Width-Length dependence coefficient of VFBCV" ) -`MPRoz( VFBCVWLEXP ,1.0 ,"" ,"Width-Length dependence coefficient of VFBCV" ) - -// Diode parameters -`MPIcc( PERMOD ,1 ,"" ,0 ,1 ,"Whether PS/PD (when given) include gate-edge perimeter" ) -`MPRnb( DWJ ,DWC ,"m" ,"delta W for S/D junctions" ) - -// Short channel effects -`MPRnb( NSD ,1e26 ,"1/m^3" ,"S/D Doping Concentration" ) -`MPRnb( LNSD ,0.0 ,"1/m^2" ,"Length dependence of NSD" ) -`MPRnb( WNSD ,0.0 ,"1/m^2" ,"Width dependence of NSD" ) -`MPRnb( PNSD ,0.0 ,"1/m" ,"Area dependence of NSD" ) -`MPRnb( DVTP0 ,0.0 ,"m" ,"DITS" ) -`MPRnb( LDVTP0 ,0 ,"m^2" ,"Length dependence of DVTP0" ) -`MPRnb( WDVTP0 ,0 ,"m^2" ,"Width dependence of DVTP0" ) -`MPRnb( PDVTP0 ,0 ,"m^3" ,"Area dependence of DVTP0" ) -`MPRnb( DVTP1 ,0.0 ,"1/V" ,"DITS" ) -`MPRnb( LDVTP1 ,0 ,"m/V" ,"Length dependence of DVTP1" ) -`MPRnb( WDVTP1 ,0 ,"m/V" ,"Width dependence of DVTP1" ) -`MPRnb( PDVTP1 ,0 ,"m^2/V" ,"Area dependence of DVTP1" ) -`MPRnb( DVTP2 ,0.0 ,"m*V" ,"DITS" ) -`MPRnb( LDVTP2 ,0 ,"m^2/V" ,"Length dependence of DVTP2" ) -`MPRnb( WDVTP2 ,0 ,"m^2/V" ,"Width dependence of DVTP2" ) -`MPRnb( PDVTP2 ,0 ,"m^3/V" ,"Area dependence of DVTP2" ) -`MPRnb( DVTP3 ,0.0 ,"" ,"DITS" ) -`MPRnb( LDVTP3 ,0 ,"m" ,"Length dependence of DVTP3" ) -`MPRnb( WDVTP3 ,0 ,"m" ,"Width dependence of DVTP3" ) -`MPRnb( PDVTP3 ,0 ,"m^2" ,"Area dependence of DVTP3" ) -`MPRnb( DVTP4 ,0.0 ,"1/V" ,"DITS" ) -`MPRnb( LDVTP4 ,0 ,"m/V" ,"Length dependence of DVTP4" ) -`MPRnb( WDVTP4 ,0 ,"m/V" ,"Width dependence of DVTP4" ) -`MPRnb( PDVTP4 ,0 ,"m^2/V" ,"Area dependence of DVTP4" ) -`MPRnb( DVTP5 ,0.0 ,"V" ,"DITS" ) -`MPRnb( LDVTP5 ,0 ,"m*V" ,"Length dependence of DVTP5" ) -`MPRnb( WDVTP5 ,0 ,"m*V" ,"Width dependence of DVTP5" ) -`MPRnb( PDVTP5 ,0 ,"m^2*V" ,"Area dependence of DVTP5" ) -`MPRnb( PHIN ,0.045 ,"V" ,"Non-uniform vertical doping effect on surface potential" ) -`MPRnb( LPHIN ,0.0 ,"m*V" ,"Length dependence of PHIN" ) -`MPRnb( WPHIN ,0.0 ,"m*V" ,"Width dependence of PHIN" ) -`MPRnb( PPHIN ,0.0 ,"m^2*V" ,"Area dependence of PHIN" ) -`MPRnb( ETA0 ,0.08 ,"" ,"DIBL coefficient" ) -`MPRnb( LETA0 ,0.0 ,"m" ,"Length dependence of ETA0" ) -`MPRnb( WETA0 ,0.0 ,"m" ,"Width dependence of ETA0" ) -`MPRnb( PETA0 ,0.0 ,"m^2" ,"Area dependence of ETA0" ) -`MPRnb( ETA0R ,ETA0 ,"" ,"DIBL coefficient" ) -`MPRnb( LETA0R ,LETA0 ,"m" ,"Length dependence of ETA0R" ) -`MPRnb( WETA0R ,WETA0 ,"m" ,"Width dependence of ETA0R" ) -`MPRnb( PETA0R ,PETA0 ,"m^2" ,"Area dependence of ETA0R" ) -`MPRnb( DSUB ,1.0 ,"" ,"Length scaling exponent for DIBL" ) -`MPRnb( ETAB ,-0.07 ,"1/V" ,"Body bias coefficient for sub-threshold DIBL effect" ) -`MPRoz( ETABEXP ,1.0 ,"" ,"Exponent coefficient of ETAB" ) -`MPRnb( LETAB ,0.0 ,"m/V" ,"Length dependence of ETAB" ) -`MPRnb( WETAB ,0.0 ,"m/V" ,"Width dependence of ETAB" ) -`MPRnb( PETAB ,0.0 ,"m^2/V" ,"Area dependence of ETAB" ) -`MPRnb( K1 ,0.0 ,"V^0.5" ,"First-order body-bias Vth shift due to Vertical Non-uniform doping" ) -`MPRnb( K1L ,0.0 ,"" ,"length dependence coefficient of K1" ) -`MPRoz( K1LEXP ,1.0 ,"" ,"Length dependence exponent coefficient of K1" ) -`MPRnb( K1W ,0.0 ,"" ,"Width dependence coefficient of K1" ) -`MPRoz( K1WEXP ,1.0 ,"" ,"Width dependence exponent coefficient of K1" ) -`MPRnb( K1WL ,0.0 ,"" ,"Width-Length dependence coefficient of K1" ) -`MPRoz( K1WLEXP ,1.0 ,"" ,"Width-Length dependence exponent coefficient of K1" ) -`MPRnb( LK1 ,0.0 ,"m*V^0.5" ,"Length dependence of K1" ) -`MPRnb( WK1 ,0.0 ,"m*V^0.5" ,"Width dependence of K1" ) -`MPRnb( PK1 ,0.0 ,"m^2*V^0.5" ,"Area dependence of K1" ) -`MPRnb( K2 ,0.0 ,"V" ,"Vth shift due to Vertical Non-uniform doping" ) -`MPRnb( K2L ,0.0 ,"m^K2LEXP" ,"Length dependence coefficient of K2" ) -`MPRoz( K2LEXP ,1.0 ,"" ,"Length dependence exponent coefficient of K2" ) -`MPRnb( K2W ,0.0 ,"m^K2WEXP" ,"Width dependence coefficient of K2" ) -`MPRoz( K2WEXP ,1.0 ,"" ,"Width dependence exponent coefficient of K2" ) -`MPRnb( K2WL ,0.0 ,"m^(2*K2WLEXP)" ,"Width-Length dependence coefficient of K2" ) -`MPRoz( K2WLEXP ,1.0 ,"" ,"Width-Length dependence exponent coefficient of K2" ) -`MPRnb( LK2 ,0.0 ,"m" ,"Length dependence of K2" ) -`MPRnb( WK2 ,0.0 ,"m" ,"Width dependence of K2" ) -`MPRnb( PK2 ,0.0 ,"m^2" ,"Area dependence of K2" ) - -// Quantum mechanical effects -`MPRcz( ADOS ,0.0 ,"" ,"Quantum mechanical effect pre-factor cum switch in inversion" ) -`MPRcz( BDOS ,1.0 ,"" ,"Charge centroid parameter - slope of CV curve under QME in inversion" ) -`MPRoz( QM0 ,1.0e-3 ,"" ,"Charge centroid parameter - starting point for QME in inversion" ) -`MPRcz( ETAQM ,0.54 ,"" ,"Bulk charge coefficient for charge centroid in inversion" ) - -// Sub-threshold swing factor -`MPRnb( CIT ,0.0 ,"F/m^2" ,"Parameter for interface trap" ) -`MPRnb( LCIT ,0.0 ,"F/m" ,"Length dependence of CIT" ) -`MPRnb( WCIT ,0.0 ,"F/m" ,"Width dependence of CIT" ) -`MPRnb( PCIT ,0.0 ,"F" ,"Area dependence of CIT" ) -`MPRnb( NFACTOR ,0.0 ,"" ,"Sub-threshold slope factor" ) -`MPRnb( NFACTORL ,0.0 ,"m^NFACTORLEXP" ,"Length dependence coefficient of NFACTOR" ) -`MPRoz( NFACTORLEXP ,1.0 ,"" ,"Length dependence exponent coefficient of NFACTOR" ) -`MPRnb( NFACTORW ,0.0 ,"m^NFACTORWEXP" ,"Width dependence coefficient of NFACTOR" ) -`MPRoz( NFACTORWEXP ,1.0 ,"" ,"Width dependence exponent coefficient of NFACTOR" ) -`MPRnb( NFACTORWL ,0.0 ,"m^(2*NFACTORWLEXP)" ,"Width-Length dependence coefficient of NFACTOR" ) -`MPRoz( NFACTORWLEXP ,1.0 ,"" ,"Width-Length dependence exponent coefficient of NFACTOR" ) -`MPRnb( LNFACTOR ,0.0 ,"m" ,"Length dependence of NFACTOR" ) -`MPRnb( WNFACTOR ,0.0 ,"m" ,"Width dependence of NFACTOR" ) -`MPRnb( PNFACTOR ,0.0 ,"m^2" ,"Area dependence of NFACTOR" ) -`MPRnb( CDSCD ,1e-9 ,"F/m^2/V" ,"Drain-bias sensitivity of sub-threshold slope" ) -`MPRnb( CDSCDL ,0.0 ,"m^CDSCDLEXP" ,"Length dependence coefficient of CDSCD" ) -`MPRoz( CDSCDLEXP ,1.0 ,"" ,"Length dependence exponent coefficient of CDSCD" ) -`MPRnb( LCDSCD ,0.0 ,"F/m/V" ,"Length dependence of CDSCD" ) -`MPRnb( WCDSCD ,0.0 ,"F/m/V" ,"Width dependence of CDSCD" ) -`MPRnb( PCDSCD ,0.0 ,"F/V" ,"Area dependence of CDSCD" ) -`MPRnb( CDSCDR ,CDSCD ,"F/m^2/V" ,"Drain-bias sensitivity of sub-threshold slope" ) -`MPRnb( CDSCDLR ,CDSCDL ,"m^CDSCDLEXP" ,"Length dependence coefficient of CDSCD" ) -`MPRnb( LCDSCDR ,LCDSCD ,"F/m/V" ,"Length dependence of CDSCDR" ) -`MPRnb( WCDSCDR ,WCDSCD ,"F/m/V" ,"Width dependence of CDSCDR" ) -`MPRnb( PCDSCDR ,PCDSCD ,"F/V" ,"Area dependence of CDSCDR" ) -`MPRnb( CDSCB ,0.0 ,"F/m^2/V" ,"Body-bias sensitivity of sub-threshold slope" ) -`MPRnb( CDSCBL ,0.0 ,"m^CDSCBLEXP" ,"Length dependence coefficient of CDSCB" ) -`MPRoz( CDSCBLEXP ,1.0 ,"" ,"Length dependence exponent coefficient of CDSCB" ) -`MPRnb( LCDSCB ,0.0 ,"F/m/V" ,"Length dependence of CDSCB" ) -`MPRnb( WCDSCB ,0.0 ,"F/m/V" ,"Width dependence of CDSCB" ) -`MPRnb( PCDSCB ,0.0 ,"F/V" ,"Area dependence of CDSCB" ) - -// Drain saturation voltage -`MPRnb( VSAT ,1e5 ,"m/s" ,"Saturation Velocity" ) -`MPRnb( LVSAT ,0.0 ,"m^2/s" ,"Length dependence of VSAT" ) -`MPRnb( WVSAT ,0.0 ,"m^2/s" ,"Width dependence of VSAT" ) -`MPRnb( PVSAT ,0.0 ,"m^3/s" ,"Area dependence of VSAT" ) -`MPRnb( VSATL ,0.0 ,"m^VSATLEXP" ,"Length dependence coefficient of of VSAT" ) -`MPRoz( VSATLEXP ,1.0 ,"" ,"Length dependence exponent coefficient of VSAT" ) -`MPRnb( VSATW ,0.0 ,"m^VSATWEXP" ,"Width dependence coefficient of of VSAT" ) -`MPRoz( VSATWEXP ,1.0 ,"" ,"Width dependence exponent coefficient of of VSAT" ) -`MPRnb( VSATWL ,0.0 ,"m^(2*VSATWLEXP)" ,"Width-Length dependence coefficient of of VSAT" ) -`MPRoz( VSATWLEXP ,1.0 ,"" ,"Width-Length dependence exponent coefficient of of VSAT" ) -`MPRnb( VSATR ,VSAT ,"m/s" ,"Saturation Velocity" ) -`MPRnb( LVSATR ,LVSAT ,"m^2/s" ,"Length dependence of VSATR" ) -`MPRnb( WVSATR ,WVSAT ,"m^2/s" ,"Width dependence of VSATR" ) -`MPRnb( PVSATR ,PVSAT ,"m^3/s" ,"Area dependence of VSATR" ) -`MPRnb( DELTA ,0.125 ,"" ,"Smoothing function factor for Vdsat" ) -`MPRnb( LDELTA ,0.0 ,"m" ,"Length dependence of DELTA" ) -`MPRnb( WDELTA ,0.0 ,"m" ,"Width dependence of DELTA" ) -`MPRnb( PDELTA ,0.0 ,"m^2" ,"Area dependence of DELTA" ) -`MPRnb( DELTAL ,0.0 ,"m^DELTALEXP" ,"Length dependence coefficient of DELTA" ) -`MPRoz( DELTALEXP ,1.0 ,"" ,"Length dependence exponent coefficient of DELTA" ) -`MPRnb( VSATCV ,VSAT ,"m/s" ,"VSAT parameter for CV" ) -`MPRnb( LVSATCV ,LVSAT ,"m^2/s" ,"Length dependence of VSATCV" ) -`MPRnb( WVSATCV ,WVSAT ,"m^2/s" ,"Width dependence of VSATCV" ) -`MPRnb( PVSATCV ,PVSAT ,"m^3/s" ,"Area dependence of VSATCV" ) -`MPRnb( VSATCVL ,VSATL ,"m^VSATCVLEXP" ,"Length dependence coefficient of VSATCV" ) -`MPRoz( VSATCVLEXP ,VSATLEXP ,"" ,"Length dependence exponent coefficient of VSATCV" ) -`MPRnb( VSATCVW ,VSATW ,"m^VSATCVWEXP" ,"Width dependence coefficient of VSATCV" ) -`MPRoz( VSATCVWEXP ,VSATWEXP ,"" ,"Width dependence exponent coefficient of VSATCV" ) -`MPRnb( VSATCVWL ,VSATWL ,"m^(2*VSATCVWLEXP)" ,"Width-Length dependence coefficient of VSATCV" ) -`MPRoz( VSATCVWLEXP ,VSATWLEXP ,"" ,"Width-Length dependence exponent coefficient of VSATCV" ) - -// Mobility degradation -`MPRoo( UP1 ,0.0 ,"" ,-inf ,inf ,"Mobility channel length coefficient" ) -`MPRex( LP1 ,1.0e-8 ,"m" ,0.0 ,"Mobility channel length exponential coefficient" ) -`MPRoo( UP2 ,0.0 ,"" ,-inf ,inf ,"Mobility channel length coefficient" ) -`MPRex( LP2 ,1.0e-8 ,"m" ,0.0 ,"Mobility channel length exponential coefficient" ) -`MPRnb( U0 ,67.0e-3 ,"m^2/V/s" ,"Low Field mobility." ) -`MPRnb( U0L ,0.0 ,"m^U0LEXP" ,"Length dependence coefficient of U0L" ) -`MPRoz( U0LEXP ,1.0 ,"" ,"Length dependence exponent coefficient of U0L" ) -`MPRnb( LU0 ,0.0 ,"m^3/V/s" ,"Length dependence of U0" ) -`MPRnb( WU0 ,0.0 ,"m^3/V/s" ,"Width dependence of U0" ) -`MPRnb( PU0 ,0.0 ,"m^4/V/s" ,"Area dependence of U0" ) -`MPRnb( U0R ,U0 ,"m2/V/s" ,"Reverse-mode Low Field mobility." ) -`MPRnb( LU0R ,LU0 ,"m^3/V/s" ,"Length dependence of U0R" ) -`MPRnb( WU0R ,WU0 ,"m^3/V/s" ,"Width dependence of U0R" ) -`MPRnb( PU0R ,PU0 ,"m^4/V/s" ,"Area dependence of U0R" ) -`MPRnb( ETAMOB ,1.0 ,"" ,"Effective field parameter (should be kept close to 1)" ) -`MPRnb( UA ,0.001 ,"(m/V)^EU" ,"Mobility reduction coefficient" ) -`MPRnb( UAL ,0.0 ,"m^UALEXP" ,"Length dependence coefficient of UA" ) -`MPRoz( UALEXP ,1.0 ,"" ,"Length dependence exponent coefficient of UA" ) -`MPRnb( UAW ,0.0 ,"m^UAWEXP" ,"Width dependence coefficient of UA" ) -`MPRoz( UAWEXP ,1.0 ,"" ,"Width dependence exponent coefficient of UA" ) -`MPRnb( UAWL ,0.0 ,"m^UAWLEXP" ,"Width-Length dependence coefficient of UA" ) -`MPRoz( UAWLEXP ,1.0 ,"" ,"Width-Length dependence coefficient of UA" ) -`MPRnb( LUA ,0.0 ,"m*(m/V)^EU" ,"Length dependence of UA" ) -`MPRnb( WUA ,0.0 ,"m*(m/V)^EU" ,"Width dependence of UA" ) -`MPRnb( PUA ,0.0 ,"m^2*(m/V)^EU" ,"Area dependence of UA" ) -`MPRnb( UAR ,UA ,"(m/V)^EU" ,"Reverse-mode Mobility reduction coefficient" ) -`MPRnb( LUAR ,LUA ,"m*(m/V)^EU" ,"Length dependence of UAR" ) -`MPRnb( WUAR ,WUA ,"m*(m/V)^EU" ,"Width dependence of UAR" ) -`MPRnb( PUAR ,PUA ,"m^2*(m/V)^EU" ,"Area dependence of UAR" ) -`MPRnb( EU ,1.5 ,"" ,"Mobility reduction exponent" ) -`MPRnb( LEU ,0.0 ,"m" ,"Length dependence of EU" ) -`MPRnb( WEU ,0.0 ,"m" ,"Width dependence of EU" ) -`MPRnb( PEU ,0.0 ,"m^2" ,"Area dependence of EU" ) -`MPRnb( EUL ,0.0 ,"m^EULEXP" ,"Length dependence coefficient of EU" ) -`MPRoz( EULEXP ,1.0 ,"" ,"Length dependence exponent coefficient of EU" ) -`MPRnb( EUW ,0.0 ,"m^EUWEXP" ,"Width dependence coefficient of EU" ) -`MPRoz( EUWEXP ,1.0 ,"" ,"Width dependence exponent coefficient of EU" ) -`MPRnb( EUWL ,0.0 ,"m^EUWLEXP" ,"Width-Length dependence coefficient of EU" ) -`MPRoz( EUWLEXP ,1.0 ,"" ,"Width-Length dependence coefficient of EU" ) -`MPRnb( UD ,0.001 ,"" ,"Coulomb scattering parameter" ) -`MPRnb( UDL ,0.0 ,"m^UDLEXP" ,"Length dependence coefficient of UD" ) -`MPRoz( UDLEXP ,1.0 ,"" ,"Length dependence exponent coefficient of UD" ) -`MPRnb( LUD ,0.0 ,"m" ,"Length dependence of UD" ) -`MPRnb( WUD ,0.0 ,"m" ,"Width dependence of UD" ) -`MPRnb( PUD ,0.0 ,"m^2" ,"Area dependence of UD" ) -`MPRnb( UDR ,UD ,"" ,"Reverse-mode Coulomb scattering parameter" ) -`MPRnb( LUDR ,LUD ,"m" ,"Length dependence of UDR" ) -`MPRnb( WUDR ,WUD ,"m" ,"Width dependence of UDR" ) -`MPRnb( PUDR ,PUD ,"m^2" ,"Area dependence of UDR" ) -`MPRnb( UCS ,2.0 ,"" ,"Coulomb scattering parameter" ) -`MPRnb( LUCS ,0.0 ,"m" ,"Length dependence of UCS" ) -`MPRnb( WUCS ,0.0 ,"m" ,"Width dependence of UCS" ) -`MPRnb( PUCS ,0.0 ,"m^2" ,"Area dependence of UCS" ) -`MPRnb( UCSR ,UCS ,"" ,"Reverse-mode Coulomb scattering parameter" ) -`MPRnb( LUCSR ,LUCS ,"m" ,"Length dependence of UCSR" ) -`MPRnb( WUCSR ,WUCS ,"m" ,"Width dependence of UCSR" ) -`MPRnb( PUCSR ,PUCS ,"m^2" ,"Area dependence of UCSR" ) -`MPRnb( UC ,0.0 ,"(m/V)^EU/V" ,"Mobility reduction with body bias" ) -`MPRnb( UCL ,0.0 ,"m^UCLEXP" ,"Length dependence coefficient of UC" ) -`MPRoz( UCLEXP ,1.0 ,"" ,"Length dependence exponent coefficient of UC" ) -`MPRnb( UCW ,0.0 ,"m^UCWEXP" ,"Width dependence coefficient of UC" ) -`MPRoz( UCWEXP ,1.0 ,"" ,"Width dependence exponent coefficient of UC" ) -`MPRnb( UCWL ,0.0 ,"m^(2*UCWLEXP)" ,"Width-Length dependence coefficient of UC" ) -`MPRoz( UCWLEXP ,1.0 ,"" ,"Width-Length dependence exponent coefficient of UC" ) -`MPRnb( LUC ,0.0 ,"m*(m/V)^EU/V" ,"Length dependence of UC" ) -`MPRnb( WUC ,0.0 ,"m*(m/V)^EU/V" ,"Width dependence of UC" ) -`MPRnb( PUC ,0.0 ,"m^2*(m/V)^EU/V" ,"Area dependence of UC" ) -`MPRnb( UCR ,UC ,"(m/V)^EU/V" ,"Reverse-mode Mobility reduction with body bias" ) -`MPRnb( LUCR ,LUC ,"m*(m/V)^EU/V" ,"Length dependence of UCR" ) -`MPRnb( WUCR ,WUC ,"m*(m/V)^EU/V" ,"Width dependence of UCR" ) -`MPRnb( PUCR ,PUC ,"m^2*(m/V)^EU/V" ,"Area dependence of UCR" ) - -// Channel length modulation -`MPRnb( PCLM ,0.0 ,"" ,"CLM pre-factor" ) -`MPRnb( PCLML ,0.0 ,"m^PCLMLEXP" ,"Length dependence coefficient of PCLM" ) -`MPRoz( PCLMLEXP ,1.0 ,"" ,"Length dependence exponent coefficient of PCLM" ) -`MPRnb( LPCLM ,0.0 ,"m" ,"Length dependence of PCLM" ) -`MPRnb( WPCLM ,0.0 ,"m" ,"Width dependence of PCLM" ) -`MPRnb( PPCLM ,0.0 ,"m^2" ,"Area dependence of PCLM" ) -`MPRnb( PCLMR ,PCLM ,"" ,"Reverse-mode CLM pre-factor" ) -`MPRnb( LPCLMR ,LPCLM ,"m" ,"Length dependence of PCLMR" ) -`MPRnb( WPCLMR ,WPCLM ,"m" ,"Width dependence of PCLMR" ) -`MPRnb( PPCLMR ,PPCLM ,"m^2" ,"Area dependence of PCLMR" ) -`MPRnb( PCLMG ,0.0 ,"V" ,"CLM pre-factor gate voltage dependence" ) -`MPRnb( PCLMCV ,PCLM ,"" ,"CLM parameter for CV" ) -`MPRnb( PCLMCVL ,PCLML ,"m^PCLMLEXP" ,"Length dependence coefficient of PCLMCV" ) -`MPRoz( PCLMCVLEXP ,PCLMLEXP ,"" ,"Length dependence exponent coefficient of PCLMCV" ) -`MPRnb( LPCLMCV ,LPCLM ,"m" ,"Length dependence of PCLMCV" ) -`MPRnb( WPCLMCV ,WPCLM ,"m" ,"Width dependence of PCLMCV" ) -`MPRnb( PPCLMCV ,PPCLM ,"m^2" ,"Area dependence of PCLMCV" ) -`MPRnb( PSCBE1 ,4.24e8 ,"V/m" ,"Substrate current body-effect coefficient" ) -`MPRnb( LPSCBE1 ,0.0 ,"V" ,"Length dependence of PSCBE1" ) -`MPRnb( WPSCBE1 ,0.0 ,"V" ,"Width dependence of PSCBE1" ) -`MPRnb( PPSCBE1 ,0.0 ,"V*m" ,"Area dependence of PSCBE1" ) -`MPRnb( PSCBE2 ,1.0e-8 ,"m/V" ,"Substrate current body-effect coefficient" ) -`MPRnb( LPSCBE2 ,0.0 ,"m^2/V" ,"Length dependence of PSCBE2" ) -`MPRnb( WPSCBE2 ,0.0 ,"m^2/V" ,"Width dependence of PSCBE2" ) -`MPRnb( PPSCBE2 ,0.0 ,"m^3/V" ,"Area dependence of PSCBE2" ) -`MPRnb( PDITS ,0.0 ,"1/V" ,"Coefficient for drain-induced Vth shift" ) -`MPRnb( LPDITS ,0.0 ,"m/V" ,"Length dependence of PDITS" ) -`MPRnb( WPDITS ,0.0 ,"m/V" ,"Width dependence of PDITS" ) -`MPRnb( PPDITS ,0.0 ,"m^2/V" ,"Area dependence of PDITS" ) -`MPRcz( PDITSL ,0.0 ,"1/m" ,"L dependence of drain-induced Vth shift" ) -`MPRnb( PDITSD ,0.0 ,"1/V" ,"Vds dependence of drain-induced Vth shift" ) -`MPRnb( LPDITSD ,0.0 ,"m/V" ,"Length dependence of PDITSD" ) -`MPRnb( WPDITSD ,0.0 ,"m/V" ,"Width dependence of PDITSD" ) -`MPRnb( PPDITSD ,0.0 ,"m^2/V" ,"Area dependence of PDITSD" ) - -// S/D series resistance -`MPRcz( RSH ,0.0 ,"ohm/square" ,"Source-drain sheet resistance" ) -`MPRnb( PRWG ,1.0 ,"1/V" ,"Gate bias dependence of S/D extension resistance" ) -`MPRnb( LPRWG ,0.0 ,"m/V" ,"Length dependence of PRWG" ) -`MPRnb( WPRWG ,0.0 ,"m/V" ,"Width dependence of PRWG" ) -`MPRnb( PPRWG ,0.0 ,"m^2/V" ,"Area dependence of PRWG" ) -`MPRnb( PRWB ,0.0 ,"1/V" ,"Body bias dependence of resistance" ) -`MPRnb( LPRWB ,0.0 ,"m/V" ,"Length dependence of PRWB" ) -`MPRnb( WPRWB ,0.0 ,"m/V" ,"Width dependence of PRWB" ) -`MPRnb( PPRWB ,0.0 ,"m^2/V" ,"Area dependence of PRWB" ) -`MPRnb( PRWBL ,0.0 ,"m^PRWBLEXP" ,"Length dependence coefficient of PPRWB" ) -`MPRoz( PRWBLEXP ,1.0 ,"" ,"Length dependence exponent coefficient of PPRWB" ) -`MPRnb( WR ,1.0 ,"" ,"W dependence parameter of S/D extension resistance" ) -`MPRnb( LWR ,0.0 ,"m" ,"Length dependence of WR" ) -`MPRnb( WWR ,0.0 ,"m" ,"Width dependence of WR" ) -`MPRnb( PWR ,0.0 ,"m^2" ,"Area dependence of WR" ) -`MPRnb( RSWMIN ,0.0 ,"ohm*m^WR" ,"Source Resistance per unit width at high Vgs (RDSMOD=1)" ) -`MPRnb( LRSWMIN ,0.0 ,"ohm*m^(2*WR)" ,"Length dependence of RSWMIN" ) -`MPRnb( WRSWMIN ,0.0 ,"ohm*m^(2*WR)" ,"Width dependence of RSWMIN" ) -`MPRnb( PRSWMIN ,0.0 ,"ohm*m^(3*WR)" ,"Area dependence of RSWMIN" ) -`MPRnb( RSW ,10.0 ,"ohm*m^WR" ,"Zero bias Source Resistance (RDSMOD=1)" ) -`MPRnb( LRSW ,0.0 ,"ohm*m^(2*WR)" ,"Length dependence of RSW" ) -`MPRnb( WRSW ,0.0 ,"ohm*m^(2*WR)" ,"Width dependence of RSW" ) -`MPRnb( PRSW ,0.0 ,"ohm*m^(3*WR)" ,"Area dependence of RSW" ) -`MPRnb( RSWL ,0.0 ,"m^RSWLEXP" ,"Geometrical scaling of RSW (RDSMOD=1)" ) -`MPRoz( RSWLEXP ,1.0 ,"" ,"Geometrical scaling of RSW (RDSMOD=1)" ) -`MPRnb( RDWMIN ,RSWMIN ,"ohm*m^WR" ,"Drain Resistance per unit width at high Vgs (RDSMOD=1)" ) -`MPRnb( LRDWMIN ,LRSWMIN ,"ohm*m^(2*WR)" ,"Length dependence of RDWMIN" ) -`MPRnb( WRDWMIN ,WRSWMIN ,"ohm*m^(2*WR)" ,"Width dependence of RDWMIN" ) -`MPRnb( PRDWMIN ,PRSWMIN ,"ohm*m^(3*WR)" ,"Area dependence of RDWMIN" ) -`MPRnb( RDW ,RSW ,"ohm*m^WR" ,"zero bias Drain Resistance (RDSMOD=1)" ) -`MPRnb( LRDW ,LRSW ,"ohm*m^(2*WR)" ,"Length dependence of RDW" ) -`MPRnb( WRDW ,WRSW ,"ohm*m^(2*WR)" ,"Width dependence of RDW" ) -`MPRnb( PRDW ,PRSW ,"ohm*m^(3*WR)" ,"Area dependence of RDW" ) -`MPRnb( RDWL ,RSWL ,"m^RDWLEXP" ,"Geometrical scaling of RDW (RDSMOD=1)" ) -`MPRoz( RDWLEXP ,RSWLEXP ,"" ,"Geometrical scaling of RDW (RDSMOD=1)" ) -`MPRnb( RDSWMIN ,0.0 ,"ohm*m^WR" ,"S/D Resistance per unit width at high Vgs (RDSMOD=0 and RDSMOD=2)" ) -`MPRnb( LRDSWMIN ,0.0 ,"ohm*m^(2*WR)" ,"Length dependence of RDSWMIN " ) -`MPRnb( WRDSWMIN ,0.0 ,"ohm*m^(2*WR)" ,"Width dependence of RDSWMIN " ) -`MPRnb( PRDSWMIN ,0.0 ,"ohm*m^(3*WR)" ,"Area dependence of RDSWMIN " ) -`MPRnb( RDSW ,20.0 ,"ohm*um^WR" ,"Zero bias Resistance (RDSMOD=0 and RDSMOD=2)" ) -`MPRnb( RDSWL ,0.0 ,"m^RDSWLEXP" ,"Geometrical scaling of RDSW (RDSMOD=0 and RDSMOD=2)" ) -`MPRoz( RDSWLEXP ,1.0 ,"" ,"Geometrical scaling of RDSW (RDSMOD=0 and RDSMOD=2)" ) -`MPRnb( LRDSW ,0.0 ,"ohm*m^(2*WR)" ,"Length dependence of RDSW" ) -`MPRnb( WRDSW ,0.0 ,"ohm*m^(2*WR)" ,"Width dependence of RDSW" ) -`MPRnb( PRDSW ,0.0 ,"ohm*m^(3*WR)" ,"Area dependence of RDSW " ) - -// Velocity saturation -`MPRnb( PSAT ,1.0 ,"" ,"Gmsat variation with gate bias" ) -`MPRnb( LPSAT ,0.0 ,"m" ,"Length dependence of PSAT" ) -`MPRnb( WPSAT ,0.0 ,"m" ,"Width dependence of PSAT" ) -`MPRnb( PPSAT ,0.0 ,"m^2" ,"Area dependence of PSAT" ) -`MPRnb( PSATL ,0.0 ,"m^PSATLEXP" ,"Length dependence coefficient of PSATL" ) -`MPRoz( PSATLEXP ,1.0 ,"" ,"Length dependence exponent coefficient of PSATLEXP" ) -`MPRnb( PSATB ,0.0 ,"1/V" ,"Body bias effect on Idsat" ) -`MPRnb( PSATR ,PSAT ,"" ,"Reverse-mode Gmsat variation with gate bias" ) -`MPRnb( LPSATR ,LPSAT ,"m" ,"Length dependence of PSATR" ) -`MPRnb( WPSATR ,WPSAT ,"m" ,"Width dependence of PSATR" ) -`MPRnb( PPSATR ,PPSAT ,"m^2" ,"Area dependence of PSATR" ) -`MPRnb( LPSATB ,0.0 ,"m/V" ,"Length dependence of PSATB" ) -`MPRnb( WPSATB ,0.0 ,"m/V" ,"Width dependence of PSATB" ) -`MPRnb( PPSATB ,0.0 ,"m^2/V" ,"Area dependence of PSATB" ) -`MPRoz( PSATX ,1.0 ,"" ,"Fine tuning of PTWG effect" ) -`MPRnb( PTWG ,0.0 ,"" ,"Idsat variation with gate bias" ) -`MPRnb( LPTWG ,0.0 ,"m" ,"Length dependence of PTWG" ) -`MPRnb( WPTWG ,0.0 ,"m" ,"Width dependence of PTWG" ) -`MPRnb( PPTWG ,0.0 ,"m^2" ,"Area dependence of PTWG" ) -`MPRnb( PTWGL ,0.0 ,"m^PTWGLEXP" ,"Length dependence coefficient of PTWG" ) -`MPRoz( PTWGLEXP ,1.0 ,"" ,"Length dependence exponent coefficient of PTWG" ) -`MPRnb( PTWGR ,PTWG ,"" ,"Reverse-mode Idsat variation with gate bias" ) -`MPRnb( LPTWGR ,LPTWG ,"m" ,"Length dependence of PTWGR" ) -`MPRnb( WPTWGR ,WPTWG ,"m" ,"Width dependence of PTWGR" ) -`MPRnb( PPTWGR ,PPTWG ,"m^2" ,"Area dependence of PTWGR" ) -`MPRnb( PTWGLR ,PTWGL ,"m^PTWGLEXPR" ,"Length dependence coefficient of PTWG" ) -`MPRoz( PTWGLEXPR ,PTWGLEXP ,"" ,"Length dependence exponent coefficient of PTWG" ) - -// Velocity non-saturation effect -`MPRnb( A1 ,0.0 ,"1/V^2" ,"Non-saturation effect parameter for strong inversion region" ) -`MPRnb( LA1 ,0.0 ,"m/V^2" ,"Length dependence of A1" ) -`MPRnb( WA1 ,0.0 ,"m/V^2" ,"Width dependence of A1" ) -`MPRnb( PA1 ,0.0 ,"m^2/V^2" ,"Area dependence of A1" ) -`MPRnb( A11 ,0.0 ,"" ,"Temperature dependence of A1" ) -`MPRnb( LA11 ,0.0 ,"m" ,"Length dependence of A11" ) -`MPRnb( WA11 ,0.0 ,"m" ,"Width dependence of A11" ) -`MPRnb( PA11 ,0.0 ,"m^2" ,"Area dependence of A11" ) -`MPRnb( A2 ,0.0 ,"1/V" ,"Non-saturation effect parameter for moderate inversion region" ) -`MPRnb( LA2 ,0.0 ,"m/V" ,"Length dependence of A2" ) -`MPRnb( WA2 ,0.0 ,"m/V" ,"Width dependence of A2" ) -`MPRnb( PA2 ,0.0 ,"m^2/V" ,"Area dependence of A2" ) -`MPRnb( A21 ,0.0 ,"" ,"Temperature dependence of A2" ) -`MPRnb( LA21 ,0.0 ,"m" ,"Length dependence of A21" ) -`MPRnb( WA21 ,0.0 ,"m" ,"Width dependence of A21" ) -`MPRnb( PA21 ,0.0 ,"m^2" ,"Area dependence of A21" ) - -// Output conductance -`MPRnb( PDIBLC ,0.0 ,"" ,"Parameter for DIBL effect on Rout" ) -`MPRnb( PDIBLCL ,0.0 ,"m^PDIBLCLEXP" ,"Length dependence coefficient of PDIBLC" ) -`MPRoz( PDIBLCLEXP ,1.0 ,"" ,"Length dependence exponent coefficient of PDIBLC" ) -`MPRnb( LPDIBLC ,0.0 ,"m" ,"Length dependence of PDIBLC" ) -`MPRnb( WPDIBLC ,0.0 ,"m" ,"Width dependence of PDIBLC" ) -`MPRnb( PPDIBLC ,0.0 ,"m^2" ,"Area dependence of PDIBLC" ) -`MPRnb( PDIBLCR ,PDIBLC ,"" ,"Reverse-mode Parameter for DIBL effect on Rout" ) -`MPRnb( PDIBLCLR ,PDIBLCL ,"m^PDIBLCLEXPR" ,"Length dependence coefficient of PDIBLC" ) -`MPRoz( PDIBLCLEXPR ,PDIBLCLEXP ,"" ,"Length dependence exponent coefficient of PDIBLC" ) -`MPRnb( LPDIBLCR ,LPDIBLC ,"m" ,"Length dependence of PDIBLCR" ) -`MPRnb( WPDIBLCR ,WPDIBLC ,"m" ,"Width dependence of PDIBLCR" ) -`MPRnb( PPDIBLCR ,PPDIBLC ,"m^2" ,"Area dependence of PDIBLCR" ) -`MPRnb( PDIBLCB ,0.0 ,"1/V" ,"Parameter for DIBL effect on Rout" ) -`MPRnb( LPDIBLCB ,0.0 ,"m/V" ,"Length dependence of PDIBLCB" ) -`MPRnb( WPDIBLCB ,0.0 ,"m/V" ,"Width dependence of PDIBLCB" ) -`MPRnb( PPDIBLCB ,0.0 ,"m^2/V" ,"Area dependence of PDIBLCB" ) -`MPRnb( PVAG ,1.0 ,"" ,"Vg dependence of early voltage" ) -`MPRnb( LPVAG ,0.0 ,"m" ,"Length dependence of PVAG" ) -`MPRnb( WPVAG ,0.0 ,"m" ,"Width dependence of PVAG" ) -`MPRnb( PPVAG ,0.0 ,"m^2" ,"Area dependence of PVAG" ) -`MPRnb( FPROUT ,0.0 ,"V/m^0.5" ,"gds degradation factor due to pocket implant." ) -`MPRnb( FPROUTL ,0.0 ,"m^FPROUTLEXP" ,"Length dependence coefficient of FPROUT" ) -`MPRoz( FPROUTLEXP ,1.0 ,"" ,"Length dependence exponent coefficient of FPROUT" ) -`MPRnb( LFPROUT ,0.0 ,"V*m^0.5" ,"Length dependence of FPROUT" ) -`MPRnb( WFPROUT ,0.0 ,"V*m^0.5" ,"Width dependence of FPROUT" ) -`MPRnb( PFPROUT ,0.0 ,"V*m^1.5" ,"Area dependence of FPROUT" ) - -// Impact ionization current -`MPRnb( ALPHA0 ,0.0 ,"m/V" ,"First parameter of Iii" ) -`MPRnb( ALPHA0L ,0.0 ,"m^ALPHA0LEXP" ,"Length dependence coefficient of ALPHA0" ) -`MPRoz( ALPHA0LEXP ,1.0 ,"" ,"Length dependence exponent coefficient of ALPHA0" ) -`MPRnb( LALPHA0 ,0.0 ,"m^2/V" ,"Length dependence of ALPHA0" ) -`MPRnb( WALPHA0 ,0.0 ,"m^2/V" ,"Width dependence of ALPHA0" ) -`MPRnb( PALPHA0 ,0.0 ,"m^3/V" ,"Area dependence of ALPHA0" ) -`MPRnb( BETA0 ,0.0 ,"1/V" ,"Vds dependent parameter of Iii" ) -`MPRnb( LBETA0 ,0.0 ,"m/V" ,"Length dependence of BETA0" ) -`MPRnb( WBETA0 ,0.0 ,"m/V" ,"Width dependence of BETA0" ) -`MPRnb( PBETA0 ,0.0 ,"m^2/V" ,"Area dependence of BETA0" ) - -// Gate dielectric tunnelling current model parameters -`MPRnb( AIGBACC ,1.36e-2 ,"(F*s^2/g)^0.5/m" ,"Parameter for Igb" ) -`MPRnb( BIGBACC ,1.71e-3 ,"(F*s^2/g)^0.5/m/V" ,"Parameter for Igb" ) -`MPRnb( CIGBACC ,0.075 ,"1/V" ,"Parameter for Igb" ) -`MPRnb( NIGBACC ,1.0 ,"" ,"Parameter for Igbacc slope" ) -`MPRnb( AIGBINV ,1.11e-2 ,"(F*s^2/g)^0.5/m" ,"Parameter for Igb" ) -`MPRnb( BIGBINV ,9.49e-4 ,"(F*s^2/g)^0.5/m/V" ,"Parameter for Igb" ) -`MPRnb( CIGBINV ,0.006 ,"1/V" ,"Parameter for Igb" ) -`MPRnb( EIGBINV ,1.1 ,"V" ,"Parameter for the Si band-gap for Igbinv" ) -`MPRnb( NIGBINV ,3.0 ,"" ,"Parameter for Igbinv slope" ) -`MPRnb( AIGC ,((TYPE == `ntype) ? 1.36e-2 : 9.8e-3) ,"(F*s^2/g)^0.5/m" ,"Parameter for Igc" ) -`MPRnb( BIGC ,((TYPE == `ntype) ? 1.71e-3 : 7.59e-4) ,"(F*s^2/g)^0.5/m/V" ,"Parameter for Igc" ) -`MPRnb( CIGC ,((TYPE == `ntype) ? 0.075 : 0.03) ,"1/V" ,"Parameter for Igc" ) -`MPRnb( AIGS ,((TYPE == `ntype) ? 1.36e-2 : 9.8e-3) ,"(F*s^2/g)^0.5/m" ,"Parameter for Igs d" ) -`MPRnb( BIGS ,((TYPE == `ntype) ? 1.71e-3 : 7.59e-4) ,"(F*s^2/g)^0.5/m/V" ,"Parameter for Igs d" ) -`MPRnb( CIGS ,((TYPE == `ntype) ? 0.075 : 0.03) ,"1/V" ,"Parameter for Igs d" ) -`MPRnb( AIGD ,((TYPE == `ntype) ? 1.36e-2 : 9.8e-3) ,"(F*s^2/g)^0.5/m" ,"Parameter for Igs d" ) -`MPRnb( BIGD ,((TYPE == `ntype) ? 1.71e-3 : 7.59e-4) ,"(F*s^2/g)^0.5/m/V" ,"Parameter for Igs d" ) -`MPRnb( CIGD ,((TYPE == `ntype) ? 0.075 : 0.03) ,"1/V" ,"Parameter for Igs d" ) -`MPRnb( DLCIG ,LINT ,"m" ,"Delta L for Ig model" ) -`MPRnb( DLCIGD ,DLCIG ,"m" ,"Delta L for Ig model" ) -`MPRnb( POXEDGE ,1.0 ,"" ,"Factor for the gate edge Tox" ) -`MPRnb( NTOX ,1.0 ,"" ,"Exponent for Tox ratio" ) -`MPRoz( TOXREF ,3.0e-9 ,"m" ,"Target tox value" ) -`MPRcc( PIGCD ,1.0 ,"" ,-50 ,50 ,"Igc, S/D partition parameter" ) -`MPRnb( AIGCL ,0.0 ,"m" ,"Length dependence coefficient of AIGC" ) -`MPRnb( AIGCW ,0.0 ,"m" ,"Width dependence coefficient of AIGC" ) -`MPRnb( AIGSL ,0.0 ,"m" ,"Length dependence coefficient of AIGS" ) -`MPRnb( AIGSW ,0.0 ,"m" ,"Width dependence coefficient of AIGS" ) -`MPRnb( AIGDL ,0.0 ,"m" ,"Length dependence coefficient of AIGD" ) -`MPRnb( AIGDW ,0.0 ,"m" ,"Width dependence coefficient of AIGD" ) -`MPRnb( PIGCDL ,0.0 ,"m" ,"Length dependence coefficient of PIGCD" ) -`MPRnb( LAIGBINV ,0.0 ,"(F*s^2/g)^0.5" ,"Length dependence of AIGBINV" ) -`MPRnb( WAIGBINV ,0.0 ,"(F*s^2/g)^0.5" ,"Width dependence of AIGBINV" ) -`MPRnb( PAIGBINV ,0.0 ,"m*(F*s^2/g)^0.5" ,"Area dependence of AIGBINV" ) -`MPRnb( LBIGBINV ,0.0 ,"(F*s^2/g)^0.5/V" ,"Length dependence of BIGBINV" ) -`MPRnb( WBIGBINV ,0.0 ,"(F*s^2/g)^0.5/V" ,"Width dependence of BIGBINV" ) -`MPRnb( PBIGBINV ,0.0 ,"m*(F*s^2/g)^0.5/V" ,"Area dependence of BIGBINV" ) -`MPRnb( LCIGBINV ,0.0 ,"m/V" ,"Length dependence of CIGBINV" ) -`MPRnb( WCIGBINV ,0.0 ,"m/V" ,"Width dependence of CIGBINV" ) -`MPRnb( PCIGBINV ,0.0 ,"m^2/V" ,"Area dependence of CIGBINV" ) -`MPRnb( LEIGBINV ,0.0 ,"m*V" ,"Length dependence of EIGBINV" ) -`MPRnb( WEIGBINV ,0.0 ,"m*V" ,"Width dependence of EIGBINV" ) -`MPRnb( PEIGBINV ,0.0 ,"m^2*V" ,"Area dependence of EIGBINV" ) -`MPRnb( LNIGBINV ,0.0 ,"m" ,"Length dependence of NIGBINV" ) -`MPRnb( WNIGBINV ,0.0 ,"m" ,"Width dependence of NIGBINV" ) -`MPRnb( PNIGBINV ,0.0 ,"m^2" ,"Area dependence of NIGBINV" ) -`MPRnb( LAIGBACC ,0.0 ,"(F*s^2/g)^0.5" ,"Length dependence of AIGBACC" ) -`MPRnb( WAIGBACC ,0.0 ,"(F*s^2/g)^0.5" ,"Width dependence of AIGBACC" ) -`MPRnb( PAIGBACC ,0.0 ,"m*(F*s^2/g)^0.5" ,"Area dependence of AIGBACC" ) -`MPRnb( LBIGBACC ,0.0 ,"(F*s^2/g)^0.5/V" ,"Length dependence of BIGBACC" ) -`MPRnb( WBIGBACC ,0.0 ,"(F*s^2/g)^0.5/V" ,"Width dependence of BIGBACC" ) -`MPRnb( PBIGBACC ,0.0 ,"m*(F*s^2/g)^0.5/V" ,"Area dependence of BIGBACC" ) -`MPRnb( LCIGBACC ,0.0 ,"m/V" ,"Length dependence of CIGBACC" ) -`MPRnb( WCIGBACC ,0.0 ,"m/V" ,"Width dependence of CIGBACC" ) -`MPRnb( PCIGBACC ,0.0 ,"m^2/V" ,"Area dependence of CIGBACC" ) -`MPRnb( LNIGBACC ,0.0 ,"m" ,"Length dependence of NIGBACC" ) -`MPRnb( WNIGBACC ,0.0 ,"m" ,"Width dependence of NIGBACC" ) -`MPRnb( PNIGBACC ,0.0 ,"m^2" ,"Area dependence of NIGBACC" ) -`MPRnb( LAIGC ,0.0 ,"(F*s^2/g)^0.5" ,"Length dependence of AIGC" ) -`MPRnb( WAIGC ,0.0 ,"(F*s^2/g)^0.5" ,"Width dependence of AIGC" ) -`MPRnb( PAIGC ,0.0 ,"m*(F*s^2/g)^0.5" ,"Area dependence of AIGC" ) -`MPRnb( LBIGC ,0.0 ,"(F*s^2/g)^0.5/V" ,"Length dependence of BIGC" ) -`MPRnb( WBIGC ,0.0 ,"(F*s^2/g)^0.5/V" ,"Width dependence of BIGC" ) -`MPRnb( PBIGC ,0.0 ,"m*(F*s^2/g)^0.5/V" ,"Area dependence of BIGC" ) -`MPRnb( LCIGC ,0.0 ,"m/V" ,"Length dependence of CIGC" ) -`MPRnb( WCIGC ,0.0 ,"m/V" ,"Width dependence of CIGC" ) -`MPRnb( PCIGC ,0.0 ,"m^2/V" ,"Area dependence of CIGC" ) -`MPRnb( LAIGS ,0.0 ,"(F*s^2/g)^0.5" ,"Length dependence of AIGS" ) -`MPRnb( WAIGS ,0.0 ,"(F*s^2/g)^0.5" ,"Width dependence of AIGS" ) -`MPRnb( PAIGS ,0.0 ,"m*(F*s^2/g)^0.5" ,"Area dependence of AIGS" ) -`MPRnb( LBIGS ,0.0 ,"(F*s^2/g)^0.5/V" ,"Length dependence of BIGS" ) -`MPRnb( WBIGS ,0.0 ,"(F*s^2/g)^0.5/V" ,"Width dependence of BIGS" ) -`MPRnb( PBIGS ,0.0 ,"m*(F*s^2/g)^0.5/V" ,"Area dependence of BIGS" ) -`MPRnb( LCIGS ,0.0 ,"m/V" ,"Length dependence of CIGS" ) -`MPRnb( WCIGS ,0.0 ,"m/V" ,"Width dependence of CIGS" ) -`MPRnb( PCIGS ,0.0 ,"m^2/V" ,"Area dependence of CIGS" ) -`MPRnb( LAIGD ,0.0 ,"(F*s^2/g)^0.5" ,"Length dependence of AIGD" ) -`MPRnb( WAIGD ,0.0 ,"(F*s^2/g)^0.5" ,"Width dependence of AIGD" ) -`MPRnb( PAIGD ,0.0 ,"m*(F*s^2/g)^0.5" ,"Area dependence of AIGD" ) -`MPRnb( LBIGD ,0.0 ,"(F*s^2/g)^0.5/V" ,"Length dependence of BIGD" ) -`MPRnb( WBIGD ,0.0 ,"(F*s^2/g)^0.5/V" ,"Width dependence of BIGD" ) -`MPRnb( PBIGD ,0.0 ,"m*(F*s^2/g)^0.5/V" ,"Area dependence of BIGD" ) -`MPRnb( LCIGD ,0.0 ,"m/V" ,"Length dependence of CIGD" ) -`MPRnb( WCIGD ,0.0 ,"m/V" ,"Width dependence of CIGD" ) -`MPRnb( PCIGD ,0.0 ,"m^2/V" ,"Area dependence of CIGD" ) -`MPRnb( LPOXEDGE ,0.0 ,"m" ,"Length dependence of POXEDGE" ) -`MPRnb( WPOXEDGE ,0.0 ,"m" ,"Width dependence of POXEDGE" ) -`MPRnb( PPOXEDGE ,0.0 ,"m^2" ,"Area dependence of POXEDGE" ) -`MPRnb( LDLCIG ,0.0 ,"m^2" ,"Length dependence of DLCIG" ) -`MPRnb( WDLCIG ,0.0 ,"m^2" ,"Width dependence of DLCIG" ) -`MPRnb( PDLCIG ,0.0 ,"m^3" ,"Area dependence of DLCIG" ) -`MPRnb( LDLCIGD ,0.0 ,"m^2" ,"Length dependence of DLCIGD" ) -`MPRnb( WDLCIGD ,0.0 ,"m^2" ,"Width dependence of DLCIGD" ) -`MPRnb( PDLCIGD ,0.0 ,"m^3" ,"Area dependence of DLCIGD" ) -`MPRnb( LNTOX ,0.0 ,"m" ,"Length dependence of NTOX" ) -`MPRnb( WNTOX ,0.0 ,"m" ,"Width dependence of NTOX" ) -`MPRnb( PNTOX ,0.0 ,"m^2" ,"Area dependence of NTOX" ) - -// GIDL and GISL currents -`MPRnb( AGIDL ,0.0 ,"V/m" ,"Pre-exponential coefficient for GIDL" ) -`MPRnb( AGIDLL ,0.0 ,"m" ,"Length dependence coefficient of AGIDL" ) -`MPRnb( AGIDLW ,0.0 ,"m" ,"Width dependence coefficient of AGIDL" ) -`MPRnb( LAGIDL ,0.0 ,"m^2" ,"Length dependence of AGIDL" ) -`MPRnb( WAGIDL ,0.0 ,"m^2" ,"Width dependence of AGIDL" ) -`MPRnb( PAGIDL ,0.0 ,"m^3" ,"Area dependence of AGIDL" ) -`MPRnb( BGIDL ,2.3e9 ,"V/m" ,"Exponential coefficient for GIDL" ) -`MPRnb( LBGIDL ,0.0 ,"V" ,"Length dependence of BGIDL" ) -`MPRnb( WBGIDL ,0.0 ,"V" ,"Width dependence of BGIDL" ) -`MPRnb( PBGIDL ,0.0 ,"V*m" ,"Area dependence of BGIDL" ) -`MPRnb( CGIDL ,0.5 ,"V/m" ,"Exponential coefficient for GIDL" ) -`MPRnb( LCGIDL ,0.0 ,"V" ,"Length dependence of CGIDL" ) -`MPRnb( WCGIDL ,0.0 ,"V" ,"Width dependence of CGIDL" ) -`MPRnb( PCGIDL ,0.0 ,"V*m" ,"Area dependence of CGIDL" ) -`MPRnb( EGIDL ,0.8 ,"V" ,"Band bending parameter for GIDL" ) -`MPRnb( LEGIDL ,0.0 ,"V*m" ,"Length dependence of EGIDL" ) -`MPRnb( WEGIDL ,0.0 ,"V*m" ,"Width dependence of EGIDL" ) -`MPRnb( PEGIDL ,0.0 ,"V*m^2" ,"Area dependence of EGIDL" ) -`MPRnb( AGISL ,AGIDL ,"V/m" ,"Pre-exponential coefficient for GISL" ) -`MPRnb( AGISLL ,AGIDLL ,"m" ,"Length dependence coefficient of AGISL" ) -`MPRnb( AGISLW ,AGIDLW ,"m" ,"Width dependence coefficient of AGISL" ) -`MPRnb( LAGISL ,LAGIDL ,"m^2" ,"Length dependence of AGISL" ) -`MPRnb( WAGISL ,WAGIDL ,"m^2" ,"Width dependence of AGISL" ) -`MPRnb( PAGISL ,PAGIDL ,"m^3" ,"Area dependence of AGISL" ) -`MPRnb( BGISL ,BGIDL ,"V/m" ,"Exponential coefficient for GISL" ) -`MPRnb( LBGISL ,LBGIDL ,"V" ,"Length dependence of BGISL" ) -`MPRnb( WBGISL ,WBGIDL ,"V" ,"Width dependence of BGISL" ) -`MPRnb( PBGISL ,PBGIDL ,"V*m" ,"Area dependence of BGISL" ) -`MPRnb( CGISL ,CGIDL ,"V/m" ,"Exponential coefficient for GISL" ) -`MPRnb( LCGISL ,LCGIDL ,"V" ,"Length dependence of CGISL" ) -`MPRnb( WCGISL ,WCGIDL ,"V" ,"Width dependence of CGISL" ) -`MPRnb( PCGISL ,PCGIDL ,"V*m" ,"Area dependence of CGISL" ) -`MPRnb( EGISL ,EGIDL ,"V" ,"Band bending parameter for GISL" ) -`MPRnb( LEGISL ,LEGIDL ,"V*m" ,"Length dependence of EGISL" ) -`MPRnb( WEGISL ,WEGIDL ,"V*m" ,"Width dependence of EGISL" ) -`MPRnb( PEGISL ,PEGIDL ,"V*m^2" ,"Area dependence of EGISL" ) - -// Overlap capacitance and fringing capacitance -`MPRnb( CF ,0.0 ,"F/m" ,"Outer Fringe capacitance" ) -`MPRnb( LCF ,0.0 ,"F" ,"Length dependence of CF" ) -`MPRnb( WCF ,0.0 ,"F" ,"Width dependence of CF" ) -`MPRnb( PCF ,0.0 ,"F*m" ,"Area dependence of CF" ) -`MPRco( CFRCOEFF ,1.0 ,"F/m" ,1.0 ,inf ,"Coefficient for Outer Fringe capacitance" ) -`MPRnb( CGSO ,0.0 ,"F/m" ,"Gate - Source overlap capacitance" ) -`MPRnb( CGDO ,0.0 ,"F/m" ,"Gate - Drain overlap capacitance" ) -`MPRnb( CGBO ,0.0 ,"F/m" ,"Gate - Body overlap capacitance" ) -`MPRnb( CGSL ,0.0 ,"F/m" ,"Overlap capacitance between gate and lightly-doped source region" ) -`MPRnb( LCGSL ,0.0 ,"" ,"Length dependence of CGSL" ) -`MPRnb( WCGSL ,0.0 ,"" ,"Width dependence of CGSL" ) -`MPRnb( PCGSL ,0.0 ,"" ,"Area dependence of CGSL" ) -`MPRnb( CGDL ,0.0 ,"F/m" ,"Overlap capacitance between gate and lightly-doped drain region" ) -`MPRnb( LCGDL ,0.0 ,"F" ,"Length dependence of CGDL" ) -`MPRnb( WCGDL ,0.0 ,"F" ,"Width dependence of CGDL" ) -`MPRnb( PCGDL ,0.0 ,"F*m" ,"Area dependence of CGDL" ) -`MPRnb( CKAPPAS ,0.6 ,"V" ,"Coefficient of bias-dependent overlap capacitance for the source side" ) -`MPRnb( LCKAPPAS ,0.0 ,"m*V" ,"Length dependence of CKAPPAS" ) -`MPRnb( WCKAPPAS ,0.0 ,"m*V" ,"Width dependence of CKAPPAS" ) -`MPRnb( PCKAPPAS ,0.0 ,"m^2*V" ,"Area dependence of CKAPPAS" ) -`MPRnb( CKAPPAD ,0.6 ,"V" ,"Coefficient of bias-dependent overlap capacitance for the drain side" ) -`MPRnb( LCKAPPAD ,0.0 ,"m*V" ,"Length dependence of CKAPPAD" ) -`MPRnb( WCKAPPAD ,0.0 ,"m*V" ,"Width dependence of CKAPPAD" ) -`MPRnb( PCKAPPAD ,0.0 ,"m^2*V" ,"Area dependence of CKAPPAD" ) - -// Layout-dependent parasitics model parameters (resistance only) -`MPRnb( DMCG ,0.0 ,"m" ,"Distance of Mid-Contact to Gate edge" ) -`MPRnb( DMCI ,DMCG ,"m" ,"Distance of Mid-Contact to Isolation" ) -`MPRnb( DMDG ,0.0 ,"m" ,"Distance of Mid-Diffusion to Gate edge" ) -`MPRnb( DMCGT ,0.0 ,"m" ,"Distance of Mid-Contact to Gate edge in Test" ) -`MPRoo( XGL ,0.0 ,"m" ,-inf ,L*LMLT+XL ,"Variation in Ldrawn" ) -`MPRcz( RSHG ,0.1 ,"ohm" ,"Gate sheet resistance" ) - -// Junction capacitance -`MPRnb( CJS ,5.0e-4 ,"F/m^2" ,"Unit area source-side junction capacitance at zero bias" ) -`MPRnb( CJD ,CJS ,"F/m^2" ,"Unit area drain-side junction capacitance at zero bias" ) -`MPRnb( CJSWS ,5.0e-10 ,"F/m" ,"Unit length source-side side-wall junction capacitance at zero bias" ) -`MPRnb( CJSWD ,CJSWS ,"F/m" ,"Unit length drain-side side-wall junction capacitance at zero bias" ) -`MPRnb( CJSWGS ,0.0 ,"F/m" ,"Unit length source-side gate side-wall junction capacitance at zero bias" ) -`MPRnb( CJSWGD ,CJSWGS ,"F/m" ,"Unit length drain-side gate side-wall junction capacitance at zero bias" ) -`MPRnb( PBS ,1.0 ,"V" ,"Source-side bulk junction built-in potential" ) -`MPRnb( PBD ,PBS ,"V" ,"Drain-side bulk junction built-in potential" ) -`MPRnb( PBSWS ,1.0 ,"V" ,"Built-in potential for Source-side side-wall junction capacitance" ) -`MPRnb( PBSWD ,PBSWS ,"V" ,"Built-in potential for Drain-side side-wall junction capacitance" ) -`MPRnb( PBSWGS ,PBSWS ,"V" ,"Built-in potential for Source-side gate side-wall junction capacitance" ) -`MPRnb( PBSWGD ,PBSWGS ,"V" ,"Built-in potential for Drain-side gate side-wall junction capacitance" ) -`MPRnb( MJS ,0.5 ,"" ,"Source bottom junction capacitance grading coefficient" ) -`MPRnb( MJD ,MJS ,"" ,"Drain bottom junction capacitance grading coefficient" ) -`MPRnb( MJSWS ,0.33 ,"" ,"Source side-wall junction capacitance grading coefficient" ) -`MPRnb( MJSWD ,MJSWS ,"" ,"Drain side-wall junction capacitance grading coefficient" ) -`MPRnb( MJSWGS ,MJSWS ,"" ,"Source-side gate side-wall junction capacitance grading coefficient" ) -`MPRnb( MJSWGD ,MJSWGS ,"" ,"Drain-side gate side-wall junction capacitance grading coefficient" ) - -// Junction current -`MPRnb( JSS ,1.0e-4 ,"A/m^2" ,"Bottom source junction reverse saturation current density" ) -`MPRnb( JSD ,JSS ,"A/m^2" ,"Bottom drain junction reverse saturation current density" ) -`MPRnb( JSWS ,0.0 ,"A/m" ,"Unit length reverse saturation current for side-wall source junction" ) -`MPRnb( JSWD ,JSWS ,"A/m" ,"Unit length reverse saturation current for side-wall drain junction" ) -`MPRnb( JSWGS ,0.0 ,"A/m" ,"Unit length reverse saturation current for gate-edge side-wall source junction" ) -`MPRnb( JSWGD ,JSWGS ,"A/m" ,"Unit length reverse saturation current for gate-edge side-wall drain junction" ) -`MPRoz( NJS ,1.0 ,"" ,"Source junction emission coefficient" ) -`MPRoz( NJD ,NJS ,"" ,"Drain junction emission coefficient" ) -`MPRnb( IJTHSFWD ,0.1 ,"A" ,"Forward source diode breakdown limiting current" ) -`MPRnb( IJTHDFWD ,IJTHSFWD ,"A" ,"Forward drain diode breakdown limiting current" ) -`MPRnb( IJTHSREV ,0.1 ,"A" ,"Reverse source diode breakdown limiting current" ) -`MPRnb( IJTHDREV ,IJTHSREV ,"A" ,"Reverse drain diode breakdown limiting current" ) -`MPRnb( BVS ,10.0 ,"V" ,"Source diode breakdown voltage" ) -`MPRnb( BVD ,BVS ,"V" ,"Drain diode breakdown voltage" ) -`MPRoz( XJBVS ,1.0 ,"" ,"Fitting parameter for source diode breakdown current" ) -`MPRoz( XJBVD ,XJBVS ,"" ,"Fitting parameter for drain diode breakdown current" ) - -// Tunneling component of junction current -`MPRnb( JTSS ,0.0 ,"A/m" ,"Bottom source junction trap-assisted saturation current density" ) -`MPRnb( JTSD ,JTSS ,"A/m" ,"Bottom drain junction trap-assisted saturation current density" ) -`MPRnb( JTSSWS ,0.0 ,"A/m^2" ,"Unit length trap-assisted saturation current for side-wall source junction" ) -`MPRnb( JTSSWD ,JTSSWS ,"A/m^2" ,"Unit length trap-assisted saturation current for side-wall drain junction" ) -`MPRnb( JTSSWGS ,0.0 ,"A/m" ,"Unit length trap-assisted saturation current for gate-edge side-wall source junction" ) -`MPRnb( JTSSWGD ,JTSSWGS ,"A/m" ,"Unit length trap-assisted saturation current for gate-edge side-wall drain junction" ) -`MPRcz( JTWEFF ,0.0 ,"" ,"Trap assisted tunnelling current width dependence" ) -`MPRnb( NJTS ,20.0 ,"" ,"Non-ideality factor for JTSS" ) -`MPRnb( NJTSD ,NJTS ,"" ,"Non-ideality factor for JTSD" ) -`MPRnb( NJTSSW ,20.0 ,"" ,"Non-ideality factor for JTSSWS" ) -`MPRnb( NJTSSWD ,NJTSSW ,"" ,"Non-ideality factor for JTSSWD" ) -`MPRnb( NJTSSWG ,20.0 ,"" ,"Non-ideality factor for JTSSWGS" ) -`MPRnb( NJTSSWGD ,NJTSSWG ,"" ,"Non-ideality factor for JTSSWGD" ) -`MPRnb( VTSS ,10.0 ,"V" ,"Bottom source junction trap-assisted current voltage dependent parameter" ) -`MPRnb( VTSD ,VTSS ,"V" ,"Bottom drain junction trap-assisted current voltage dependent parameter" ) -`MPRnb( VTSSWS ,10.0 ,"V" ,"Unit length trap-assisted current voltage dependent parameter for side-wall source junction" ) -`MPRnb( VTSSWD ,VTSSWS ,"V" ,"Unit length trap-assisted current voltage dependent parameter for side-wall drain junction" ) -`MPRnb( VTSSWGS ,10.0 ,"V" ,"Unit length trap-assisted current voltage dependent parameter for gate-edge side-wall source junction" ) -`MPRnb( VTSSWGD ,VTSSWGS ,"V" ,"Unit length trap-assisted current voltage dependent parameter for gate-edge side-wall drain junction" ) - -// High-speed/RF model parameters -`MPRnb( XRCRG1 ,12.0 ,"" ,"1st fitting parameter the bias-dependent Rg " ) -`MPRnb( XRCRG2 ,1.0 ,"" ,"2nd fitting parameter the bias-dependent Rg " ) -`MPRcz( GBMIN ,1.0e-12 ,"mho" ,"Minimum body conductance" ) -`MPRoz( RBPS0 ,50.0 ,"ohm" ,"Scaling pre-factor for RBPS" ) -`MPRcz( RBPSL ,0.0 ,"" ,"Length Scaling parameter for RBPS" ) -`MPRcz( RBPSW ,0.0 ,"" ,"Width Scaling parameter for RBPS" ) -`MPRcz( RBPSNF ,0.0 ,"" ,"Number of fingers Scaling parameter for RBPS" ) -`MPRoz( RBPD0 ,50.0 ,"ohm" ,"Scaling pre-factor for RBPD" ) -`MPRcz( RBPDL ,0.0 ,"" ,"Length Scaling parameter for RBPD" ) -`MPRcz( RBPDW ,0.0 ,"" ,"Width Scaling parameter for RBPD" ) -`MPRcz( RBPDNF ,0.0 ,"" ,"Number of fingers Scaling parameter for RBPD" ) -`MPRoz( RBPBX0 ,100.0 ,"ohm" ,"Scaling pre-factor for RBPBX" ) -`MPRcz( RBPBXL ,0.0 ,"" ,"Length Scaling parameter for RBPBX" ) -`MPRcz( RBPBXW ,0.0 ,"" ,"Width Scaling parameter for RBPBX" ) -`MPRcz( RBPBXNF ,0.0 ,"" ,"Number of fingers Scaling parameter for RBPBX" ) -`MPRoz( RBPBY0 ,100.0 ,"ohm" ,"Scaling pre-factor for RBPBY" ) -`MPRcz( RBPBYL ,0.0 ,"" ,"Length Scaling parameter for RBPBY" ) -`MPRcz( RBPBYW ,0.0 ,"" ,"Width Scaling parameter for RBPBY" ) -`MPRcz( RBPBYNF ,0.0 ,"" ,"Number of fingers Scaling parameter for RBPBY" ) -`MPRoz( RBSBX0 ,100.0 ,"ohm" ,"Scaling pre-factor for RBSBX" ) -`MPRoz( RBSBY0 ,100.0 ,"ohm" ,"Scaling pre-factor for RBSBY" ) -`MPRoz( RBDBX0 ,100.0 ,"ohm" ,"Scaling pre-factor for RBDBX" ) -`MPRoz( RBDBY0 ,100.0 ,"ohm" ,"Scaling pre-factor for RBDBY" ) -`MPRcz( RBSDBXL ,0.0 ,"" ,"Length Scaling parameter for RBSBX and RBDBX" ) -`MPRcz( RBSDBXW ,0.0 ,"" ,"Width Scaling parameter for RBSBX and RBDBX" ) -`MPRcz( RBSDBXNF ,0.0 ,"" ,"Number of fingers Scaling parameter for RBSBX and RBDBX" ) -`MPRcz( RBSDBYL ,0.0 ,"" ,"Length Scaling parameter for RBSBY and RBDBY" ) -`MPRcz( RBSDBYW ,0.0 ,"" ,"Width Scaling parameter for RBSBY and RBDBY" ) -`MPRcz( RBSDBYNF ,0.0 ,"" ,"Number of fingers Scaling parameter for RBSBY and RBDBY" ) - -// Flicker noise -`MPRoc( EF ,1.0 ,"" ,0 ,2 ,"Flicker Noise frequency exponent" ) -`MPRnb( EM ,4.1e7 ,"V/m" ,"Saturation Field" ) -`MPRnb( NOIA ,6.250e+40 ,"s^(1-EF)/(eV)^1/m^3" ,"Flicker noise parameter A" ) -`MPRnb( NOIB ,3.125e+25 ,"s^(1-EF)/(eV)^1/m" ,"Flicker noise parameter B" ) -`MPRnb( NOIC ,8.750e+8 ,"s^(1-EF)*m/(eV)^1" ,"Flicker noise parameter C" ) -`MPRnb( LINTNOI ,0.0 ,"m" ,"Length Reduction Parameter Offset" ) - -// Thermal noise -`MPRcz( NTNOI ,1.0 ,"" ,"Noise factor for short-channel devices for TNOIMOD=0 only" ) -`MPRnb( RNOIA ,0.577 ,"" ,"TNOIMOD = 1" ) -`MPRnb( RNOIB ,0.5164 ,"" ,"TNOIMOD = 1" ) -`MPRnb( RNOIC ,0.395 ,"" ,"TNOIMOD = 1" ) -`MPRoo( TNOIA ,0.0 ,"" ,-inf ,inf ,"TNOIMOD = 1" ) -`MPRoo( TNOIB ,0.0 ,"" ,-inf ,inf ,"TNOIMOD = 1" ) -`MPRoo( TNOIC ,0.0 ,"" ,-inf ,inf ,"Correlation coefficient" ) - -// Binning parameters -`MPIcc( BINUNIT ,1 ,"" ,0 ,1 ,"Unit of L and W for Binning, 1 : micro-meter, 0 : default" ) -`MPRnb( DLBIN ,0.0 ,"" ,"Length reduction parameter for binning" ) -`MPRnb( DWBIN ,0.0 ,"" ,"Width reduction parameter for binning" ) - -// Temperature dependence parameters -`MPRnb( TNOM ,27.0 ,"degC" ,"Temperature at which the model was extracted" ) -`MPRnb( TBGASUB ,4.73e-4 ,"eV/K" ,"Band-gap Temperature Coefficient" ) -`MPRnb( TBGBSUB ,636.0 ,"K" ,"Band-gap Temperature Coefficient" ) -`MPRnb( TNFACTOR ,0.0 ,"" ,"Temperature exponent for NFACTOR" ) -`MPRnb( UTE ,-1.5 ,"" ,"Mobility temperature exponent" ) -`MPRnb( LUTE ,0.0 ,"m" ,"Length dependence of UTE" ) -`MPRnb( WUTE ,0.0 ,"m" ,"Width dependence of UTE" ) -`MPRnb( PUTE ,0.0 ,"m^2" ,"Area dependence of UTE" ) -`MPRnb( UTEL ,0.0 ,"m" ,"Length Scaling parameter for UTE" ) -`MPRnb( UA1 ,1.0e-3 ,"m/V" ,"Temperature coefficient for UA" ) -`MPRnb( LUA1 ,0.0 ,"m^2/V" ,"Length dependence of UA1" ) -`MPRnb( WUA1 ,0.0 ,"m^2/V" ,"Width dependence of UA1" ) -`MPRnb( PUA1 ,0.0 ,"m^3/V" ,"Area dependence of UA1" ) -`MPRnb( UA1L ,0.0 ,"m" ,"Length Scaling parameter for UA1" ) -`MPRnb( UC1 ,0.056e-9 ,"1/K" ,"Temperature coefficient for UC" ) -`MPRnb( LUC1 ,0.0 ,"m/K" ,"Length dependence of UC1" ) -`MPRnb( WUC1 ,0.0 ,"m/K" ,"Width dependence of UC1" ) -`MPRnb( PUC1 ,0.0 ,"m^2/K" ,"Area dependence of UC1" ) -`MPRnb( UD1 ,0.0 ,"1/m^2" ,"Temperature coefficient for UD" ) -`MPRnb( LUD1 ,0.0 ,"1/m" ,"Length dependence of UD1" ) -`MPRnb( WUD1 ,0.0 ,"1/m" ,"Width dependence of UD1" ) -`MPRnb( PUD1 ,0.0 ,"" ,"Area dependence of UD1" ) -`MPRnb( UD1L ,0.0 ,"m" ,"Length Scaling parameter for UD1" ) -`MPRnb( UCSTE ,-4.775e-3 ,"" ,"Temperature coefficient for UCS" ) -`MPRnb( LUCSTE ,0.0 ,"m" ,"Length dependence of UCSTE" ) -`MPRnb( WUCSTE ,0.0 ,"m" ,"Width dependence of UCSTE" ) -`MPRnb( PUCSTE ,0.0 ,"m^2" ,"Area dependence of UCSTE" ) -`MPRnb( TETA0 ,0.0 ,"" ,"Temperature coefficient for ETA0" ) -`MPRnb( PRT ,0.0 ,"" ,"Temperature coefficient for resistance" ) -`MPRnb( LPRT ,0.0 ,"m" ,"Length dependence of PRT" ) -`MPRnb( WPRT ,0.0 ,"m" ,"Width dependence of PRT" ) -`MPRnb( PPRT ,0.0 ,"m^2" ,"Area dependence of PRT" ) -`MPRnb( AT ,-1.56e-3 ,"m/s" ,"Temperature coefficient for saturation velocity" ) -`MPRnb( LAT ,0.0 ,"m^2/s" ,"Length dependence of AT" ) -`MPRnb( WAT ,0.0 ,"m^2/s" ,"Width dependence of AT" ) -`MPRnb( PAT ,0.0 ,"m^3/s" ,"Area dependence of AT" ) -`MPRnb( ATL ,0.0 ,"m" ,"Length Scaling parameter for AT" ) -`MPRnb( TDELTA ,0.0 ,"1/K" ,"Temperature coefficient for DELTA" ) -`MPRnb( PTWGT ,0.0 ,"1/K" ,"Temperature coefficient for PTWG" ) -`MPRnb( LPTWGT ,0.0 ,"m/K" ,"Length dependence of PTWGT" ) -`MPRnb( WPTWGT ,0.0 ,"m/K" ,"Width dependence of PTWGT" ) -`MPRnb( PPTWGT ,0.0 ,"m^2/K" ,"Area dependence of PTWGT" ) -`MPRnb( PTWGTL ,0.0 ,"m" ,"Length Scaling parameter for PTWGT" ) -`MPRnb( KT1 ,-0.11 ,"V" ,"Temperature coefficient for Vth" ) -`MPRoz( KT1EXP ,1.0 ,"" ,"Temperature coefficient for Vth" ) -`MPRnb( KT1L ,0.0 ,"V*m" ,"Temperature coefficient for Vth" ) -`MPRnb( LKT1 ,0.0 ,"V*m" ,"Length dependence of KT1" ) -`MPRnb( WKT1 ,0.0 ,"V*m" ,"Width dependence of KT1" ) -`MPRnb( PKT1 ,0.0 ,"V*m^2" ,"Area dependence of KT1" ) -`MPRnb( KT2 ,0.022 ,"" ,"Temperature coefficient for Vth" ) -`MPRnb( LKT2 ,0.0 ,"m" ,"Length dependence of KT2" ) -`MPRnb( WKT2 ,0.0 ,"m" ,"Width dependence of KT2" ) -`MPRnb( PKT2 ,0.0 ,"m^2" ,"Area dependence of KT2" ) -`MPRnb( IIT ,0.0 ,"" ,"Temperature coefficient for BETA0" ) -`MPRnb( LIIT ,0.0 ,"m" ,"Length dependence of IIT" ) -`MPRnb( WIIT ,0.0 ,"m" ,"Width dependence of IIT" ) -`MPRnb( PIIT ,0.0 ,"m^2" ,"Area dependence of IIT" ) -`MPRnb( IGT ,2.5 ,"" ,"Gate Current Temperature Dependence" ) -`MPRnb( LIGT ,0.0 ,"m" ,"Length dependence of IGT" ) -`MPRnb( WIGT ,0.0 ,"m" ,"Width dependence of IGT" ) -`MPRnb( PIGT ,0.0 ,"m^2" ,"Area dependence of IGT" ) -`MPRnb( TGIDL ,0.0 ,"1/K" ,"Temperature coefficient for GIDL/GISL" ) -`MPRnb( LTGIDL ,0.0 ,"m/K" ,"Length dependence of TGIDL" ) -`MPRnb( WTGIDL ,0.0 ,"m/K" ,"Width dependence of TGIDL" ) -`MPRnb( PTGIDL ,0.0 ,"m^2/K" ,"Area dependence of TGIDL" ) -`MPRnb( TCJ ,0.0 ,"1/K" ,"Temperature coefficient for CJS/CJD" ) -`MPRnb( TCJSW ,0.0 ,"1/K" ,"Temperature coefficient for CJSWS/CJSWD" ) -`MPRnb( TCJSWG ,0.0 ,"1/K" ,"Temperature coefficient for CJSWGS/CJSWGD" ) -`MPRnb( TPB ,0.0 ,"V/K" ,"Temperature coefficient for PBS/PBD" ) -`MPRnb( TPBSW ,0.0 ,"V/K" ,"Temperature coefficient for PBSWS/PBSWD" ) -`MPRnb( TPBSWG ,0.0 ,"V/K" ,"Temperature coefficient for PBSWGS/PBSWGD" ) -`MPRnb( XTIS ,3.0 ,"" ,"Source junction current temperature exponent" ) -`MPRnb( XTID ,XTIS ,"" ,"Drain junction current temperature exponent" ) -`MPRnb( XTSS ,0.02 ,"" ,"Power dependence of JTSS on temperature" ) -`MPRnb( XTSD ,XTSS ,"" ,"Power dependence of JTSD on temperature" ) -`MPRnb( XTSSWS ,0.02 ,"" ,"Power dependence of JTSSWS on temperature" ) -`MPRnb( XTSSWD ,XTSSWS ,"" ,"Power dependence of JTSSWD on temperature" ) -`MPRnb( XTSSWGS ,0.02 ,"" ,"Power dependence of JTSSWGS on temperature" ) -`MPRnb( XTSSWGD ,XTSSWGS ,"" ,"Power dependence of JTSSWGD on temperature" ) -`MPRnb( TNJTS ,0.0 ,"" ,"Temperature coefficient for NJTS" ) -`MPRnb( TNJTSD ,TNJTS ,"" ,"Temperature coefficient for NJTSD" ) -`MPRnb( TNJTSSW ,0.0 ,"" ,"Temperature coefficient for NJTSSW" ) -`MPRnb( TNJTSSWD ,TNJTSSW ,"" ,"Temperature coefficient for NJTSSWD" ) -`MPRnb( TNJTSSWG ,0.0 ,"" ,"Temperature coefficient for NJTSSWG" ) -`MPRnb( TNJTSSWGD ,TNJTSSWG ,"" ,"Temperature coefficient for NJTSSWGD" ) - -// Self heating parameters -`MPRco( RTH0 ,0.0 ,"m*K/W" ,0 ,inf ,"Thermal resistance" ) -`MPRco( CTH0 ,1.0E-05 ,"s*W/(m*K)" ,0 ,inf ,"Thermal capacitance" ) -`MPRnb( WTH0 ,0.0 ,"m" ,"Width dependence coefficient for Rth and Cth" ) - -// Stress related parameters -`MPRoz( SAREF ,1.0e-6 ,"m" ,"Reference distance between OD edge from Poly from one side" ) -`MPRoz( SBREF ,1.0e-6 ,"m" ,"Reference distance between OD edge from Poly from other side" ) -`MPRcz( WLOD ,0.0 ,"m" ,"Width Parameter for Stress Effect" ) -`MPRnb( KU0 ,0.0 ,"m" ,"Mobility degradation/enhancement Parameter for Stress Effect" ) -`MPRnb( KVSAT ,0.0 ,"m" ,"Saturation Velocity degradation/enhancement Parameter for Stress Effect" ) -`MPRnb( TKU0 ,0.0 ,"" ,"Temperature Coefficient for KU0" ) -`MPRnb( LKU0 ,0.0 ,"m^LLODKU0" ,"Length Dependence of KU0" ) -`MPRnb( WKU0 ,0.0 ,"m^WLODKU0" ,"Width Dependence of KU0" ) -`MPRnb( PKU0 ,0.0 ,"m^(LLODKU0+WLODKU0)" ,"Cross Term Dependence of KU0" ) -`MPRnb( LLODKU0 ,0.0 ,"" ,"Length Parameter for U0 stress effect" ) -`MPRnb( WLODKU0 ,0.0 ,"" ,"Width Parameter for U0 stress effect" ) -`MPRnb( KVTH0 ,0.0 ,"V*m" ,"Threshold Shift parameter for stress effect" ) -`MPRnb( LKVTH0 ,0.0 ,"m^LLODKU0" ,"Length dependence of KVTH0" ) -`MPRnb( WKVTH0 ,0.0 ,"m^WLODKU0" ,"Width dependence of KVTH0" ) -`MPRnb( PKVTH0 ,0.0 ,"m^(LLODKU0+WLODKU0)" ,"Cross-term dependence of KVTH0" ) -`MPRnb( LLODVTH ,0.0 ,"" ,"Length Parameter for Vth stress effect" ) -`MPRnb( WLODVTH ,0.0 ,"" ,"Width Parameter for Vth stress effect" ) -`MPRnb( STK2 ,0.0 ,"m" ,"K2 shift factor related to Vth change" ) -`MPRnb( LODK2 ,0.0 ,"" ,"K2 shift modification factor for stress effect" ) -`MPRnb( STETA0 ,0.0 ,"m" ,"ETA0 shift related to Vth0 change" ) -`MPRnb( LODETA0 ,0.0 ,"" ,"ETA0 modification factor for stress effect" ) - -// Well proximity parameters -`MPRnb( WEB ,0.0 ,"" ,"Coefficient for SCB (>0.0)" ) -`MPRnb( WEC ,0.0 ,"" ,"Coefficient for SCC (>0.0)" ) -`MPRnb( KVTH0WE ,0.0 ,"" ,"Threshold shift factor for well proximity effect" ) -`MPRnb( LKVTH0WE ,0.0 ,"m" ,"Length dependence of KVTH0WE" ) -`MPRnb( WKVTH0WE ,0.0 ,"m" ,"Width dependence of KVTH0WE" ) -`MPRnb( PKVTH0WE ,0.0 ,"m^2" ,"Area dependence of KVTH0WE" ) -`MPRnb( K2WE ,0.0 ,"" ,"K2 shift factor for well proximity effect" ) -`MPRnb( LK2WE ,0.0 ,"m" ,"Length dependence of K2WE" ) -`MPRnb( WK2WE ,0.0 ,"m" ,"Width dependence of K2WE" ) -`MPRnb( PK2WE ,0.0 ,"m^2" ,"Area dependence of K2WE" ) -`MPRnb( KU0WE ,0.0 ,"" ,"Mobility degradation factor for well proximity effect" ) -`MPRnb( LKU0WE ,0.0 ,"m" ,"Length dependence of KU0WE" ) -`MPRnb( WKU0WE ,0.0 ,"m" ,"Width dependence of KU0WE" ) -`MPRnb( PKU0WE ,0.0 ,"m^2" ,"Area dependence of KU0WE" ) -`MPRoo( SCREF ,1.0e-6 ,"m" ,0 ,inf ,"Reference distance to calculate SCA,SCB and SCC (<0)" ) - -// Sub-surface leakage drain current -`MPRnb( SSL0 ,4.0e2 ,"A/m" ,"Temperature- and doping-independent parameter for sub-surface leakage drain current") -`MPRnb( SSL1 ,3.36e8 ,"1/m" ,"Temperature- and doping-independent parameter for gate length for sub-surface leakage drain current") -`MPRnb( SSL2 ,0.185 ,"" ,"Fitting parameter for sub-surface leakage drain current: barrier height") -`MPRnb( SSL3 ,0.3 ,"V" ,"Fitting parameter for sub-surface leakage drain current: gate voltage effect") -`MPRnb( SSL4 ,1.4 ,"1/V" ,"Fitting parameter for sub-surface leakage drain current: gate voltage effect") -`MPRnb( SSLEXP1 ,0.490 ,"" ,"Fitting exponent for ssl doping effect") -`MPRnb( SSLEXP2 ,1.42 ,"" ,"Fitting exponent for ssl temperature") - -// Vdsx smoothing -`MPRco( AVDSX ,20 ,"" ,5 ,100 ,"Smoothing parameter in Vdsx in Vbsx" ) - -// STI edge FET device parameters -`MPRco( WEDGE ,10.0e-9 ,"m" ,1.0e-9 ,inf ,"Edge FET Width" ) -`MPRoo( DGAMMAEDGE ,0.0 ,"" ,-inf ,inf ,"Different in body-bias coefficient between Edge-FET and Main-FET" ) -`MPRoo( DGAMMAEDGEL ,0.0 ,"" ,-inf ,inf ,"L dependence parameter for DGAMMA" ) -`MPRoo( DGAMMAEDGELEXP ,1.0 ,"" ,-inf ,inf ,"Exponent of L dependence parameter for DGAMMA" ) -`MPRoo( DVTEDGE ,0.0 ,"" ,-inf ,inf ,"Vth shift for Edge FET" ) -`MPRnb( NFACTOREDGE ,NFACTOR ,"" ,"NFACTOR for Edge FET" ) -`MPRnb( LNFACTOREDGE ,LNFACTOR ,"m" ,"Length dependence of NFACTOREDGE" ) -`MPRnb( WNFACTOREDGE ,WNFACTOR ,"m" ,"Width dependence of NFACTOREDGE" ) -`MPRnb( PNFACTOREDGE ,PNFACTOR ,"m^2" ,"Area dependence of NFACTOREDGE" ) -`MPRnb( CITEDGE ,CIT ,"F/m^2" ,"CIT for Edge FET" ) -`MPRnb( LCITEDGE ,LCIT ,"F/m" ,"Length dependence of CITEDGE" ) -`MPRnb( WCITEDGE ,WCIT ,"F/m" ,"Width dependence of CITEDGE" ) -`MPRnb( PCITEDGE ,PCIT ,"F" ,"Area dependence of CITEDGE" ) -`MPRnb( CDSCDEDGE ,CDSCD ,"F/m^2/V" ,"CDSCD for edge FET" ) -`MPRnb( LCDSCDEDGE ,LCDSCD ,"F/m/V" ,"Length dependence of CDSCDEDGE" ) -`MPRnb( WCDSCDEDGE ,WCDSCD ,"F/m/V" ,"Width dependence of CDSCDEDGE" ) -`MPRnb( PCDSCDEDGE ,PCDSCD ,"F/V" ,"Area dependence of CDSCDEDGE" ) -`MPRnb( CDSCBEDGE ,CDSCB ,"F/m^2/V" ,"CDSCB for edge FET" ) -`MPRnb( LCDSCBEDGE ,LCDSCB ,"F/m/V" ,"Length dependence of CDSCBEDGE" ) -`MPRnb( WCDSCBEDGE ,WCDSCB ,"F/m/V" ,"Width dependence of CDSCBEDGE" ) -`MPRnb( PCDSCBEDGE ,PCDSCB ,"F/V" ,"Area dependence of CDSCBEDGE" ) -`MPRnb( ETA0EDGE ,ETA0 ,"" ,"DIBL parameter for edge FET" ) -`MPRnb( LETA0EDGE ,LETA0 ,"m" ,"Length dependence of ETA0EDGE" ) -`MPRnb( WETA0EDGE ,WETA0 ,"m" ,"Width dependence of ETA0EDGE" ) -`MPRnb( PETA0EDGE ,PETA0 ,"m^2" ,"Area dependence of ETA0EDGE" ) -`MPRnb( ETABEDGE ,ETAB ,"1/V" ,"ETAB for edge FET" ) -`MPRnb( LETABEDGE ,LETAB ,"m/V" ,"Length dependence of ETABEDGE" ) -`MPRnb( WETABEDGE ,WETAB ,"m/V" ,"Width dependence of ETABEDGE" ) -`MPRnb( PETABEDGE ,PETAB ,"m^2/V" ,"Area dependence of ETABEDGE" ) -`MPRnb( KT1EDGE ,KT1 ,"V" ,"Temperature dependence parameter of threshold voltage for edge FET" ) -`MPRnb( LKT1EDGE ,LKT1 ,"V*m" ,"Length dependence of KT1EDGE" ) -`MPRnb( WKT1EDGE ,WKT1 ,"V*m" ,"Width dependence of KT1EDGE" ) -`MPRnb( PKT1EDGE ,PKT1 ,"V*m^2" ,"Area dependence of KT1EDGE" ) -`MPRnb( KT1LEDGE ,KT1L ,"V*m" ,"Temperature dependence parameter of threshold voltage for edge FET" ) -`MPRnb( LKT1LEDGE ,0.0 ,"V*m^2" ,"Length dependence of KT1LEDGE" ) -`MPRnb( WKT1LEDGE ,0.0 ,"V*m^2" ,"Width dependence of KT1LEDGE" ) -`MPRnb( PKT1LEDGE ,0.0 ,"V*m^3" ,"Area dependence of KT1LEDGE" ) -`MPRnb( KT2EDGE ,KT2 ,"" ,"Temperature dependence parameter of threshold voltage for edge FET" ) -`MPRnb( LKT2EDGE ,LKT2 ,"m" ,"Length dependence of KT2EDGE" ) -`MPRnb( WKT2EDGE ,WKT2 ,"m" ,"Width dependence of KT2EDGE" ) -`MPRnb( PKT2EDGE ,PKT2 ,"m^2" ,"Area dependence of KT2EDGE" ) -`MPRnb( KT1EXPEDGE ,KT1EXP ,"" ,"Temperature dependence parameter of threshold voltage for edge device" ) -`MPRnb( LKT1EXPEDGE ,0.0 ,"m" ,"Length dependence of KT1EXPEDGE" ) -`MPRnb( WKT1EXPEDGE ,0.0 ,"m" ,"Width dependence of KT1EXPEDGE" ) -`MPRnb( PKT1EXPEDGE ,0.0 ,"m^2" ,"Area dependence of KT1EXPEDGE" ) -`MPRnb( TNFACTOREDGE ,TNFACTOR ,"" ,"Temperature dependence parameter of sub-threshold slope factor for edge" ) -`MPRnb( LTNFACTOREDGE ,0.0 ,"m" ,"Length dependence of TNFACTOREDGE" ) -`MPRnb( WTNFACTOREDGE ,0.0 ,"m" ,"Width dependence of TNFACTOREDGE" ) -`MPRnb( PTNFACTOREDGE ,0.0 ,"m^2" ,"Area dependence of TNFACTOREDGE" ) -`MPRnb( TETA0EDGE ,TETA0 ,"" ,"Temperature dependence parameter of DIBL parameter for edge FET" ) -`MPRnb( LTETA0EDGE ,0.0 ,"m" ,"Length dependence of TETA0EDGE" ) -`MPRnb( WTETA0EDGE ,0.0 ,"m" ,"Width dependence of TETA0EDGE" ) -`MPRnb( PTETA0EDGE ,0.0 ,"m^2" ,"Area dependence of TETA0EDGE" ) -`MPRnb( DVT0EDGE ,2.2 ,"" ,"First coefficient of SCE effect on Vth for Edge FET" ) -`MPRnb( DVT1EDGE ,0.53 ,"" ,"Second coefficient of SCE effect on Vth for Edge FET" ) -`MPRnb( DVT2EDGE ,0.0 ,"1/V" ,"Body-bias coefficient for SCE effect for Edge FET" ) -`MPRnb( K2EDGE ,K2 ,"V" ,"Vth shift due to Vertical Non-uniform doping" ) -`MPRnb( LK2EDGE ,LK2 ,"m" ,"Length dependence of K2EDGE" ) -`MPRnb( WK2EDGE ,WK2 ,"m" ,"Width dependence of K2EDGE" ) -`MPRnb( PK2EDGE ,PK2 ,"m^2" ,"Area dependence of K2EDGE" ) -`MPRnb( KVTH0EDGE ,KVTH0 ,"V*m" ,"Threshold Shift parameter for stress effect" ) -`MPRnb( LKVTH0EDGE ,LKVTH0 ,"m^LLODKU0" ,"Length dependence of KVTH0EDGE" ) -`MPRnb( WKVTH0EDGE ,WKVTH0 ,"m^WLODKU0" ,"Width dependence of KVTH0EDGE" ) -`MPRnb( PKVTH0EDGE ,PKVTH0 ,"m^(LLODKU0+WLODKU0)" ,"Area dependence of KVTH0EDGE" ) -`MPRnb( STK2EDGE ,STK2 ,"m" ,"K2 shift factor related to Vth change" ) -`MPRnb( LSTK2EDGE ,0.0 ,"m^2" ,"Length dependence of STK2EDGE" ) -`MPRnb( WSTK2EDGE ,0.0 ,"m^2" ,"Width dependence of STK2EDGE" ) -`MPRnb( PSTK2EDGE ,0.0 ,"m^3" ,"Area dependence of STK2EDGE" ) -`MPRnb( STETA0EDGE ,STETA0 ,"m" ,"ETA0 shift related to Vth0 change" ) -`MPRnb( LSTETA0EDGE ,0.0 ,"m^2" ,"Length dependence of STETA0EDGE" ) -`MPRnb( WSTETA0EDGE ,0.0 ,"m^2" ,"Width dependence of STETA0EDGE" ) -`MPRnb( PSTETA0EDGE ,0.0 ,"m^3" ,"Area dependence of STETA0EDGE" ) -`MPIcc( IGCLAMP ,1 ,"" ,0 ,1 ,"Model flag" ) -`MPRoz( LP ,10u ,"m" ,"Length scaling parameter for thermal noise" ) -`MPRnb( RNOIK ,0.0 ,"" ,"Exponential coefficient for enhanced correlated thermal noise" ) -`MPRoo( TNOIK ,0.0 ,"1/m" ,-inf ,inf ,"Empirical parameter for Leff trend of Sid at low Ids" ) -`MPRcz( TNOIK2 ,0.1 ,"1/m" ,"Empirical parameter for sensitivity of RNOIK" ) -`MPRnb( K0 ,0.0 ,"" ,"Non-saturation effect parameter for strong inversion region" ) -`MPRnb( LK0 ,0.0 ,"m" ,"Length dependence of " ) -`MPRnb( WK0 ,0.0 ,"m" ,"Width dependence of " ) -`MPRnb( PK0 ,0.0 ,"m^2" ,"Area dependence of " ) -`MPRnb( K01 ,0.0 ,"1/K" ,"Temperature coefficient for K0" ) -`MPRnb( LK01 ,0.0 ,"m/K" ,"Length dependence of K0" ) -`MPRnb( WK01 ,0.0 ,"m/K" ,"Width dependence of K0" ) -`MPRnb( PK01 ,0.0 ,"m^2/K" ,"Area dependence of K0" ) -`MPRnb( M0 ,1.0 ,"" ,"offset of non-saturation effect parameter for strong inversion region" ) -`MPRnb( LM0 ,0.0 ,"m" ,"Length dependence of " ) -`MPRnb( WM0 ,0.0 ,"m" ,"Width dependence of " ) -`MPRnb( PM0 ,0.0 ,"m^2" ,"Area dependence of " ) -`MPRnb( M01 ,0.0 ,"1/K" ,"Temperature coefficient for M0" ) -`MPRnb( LM01 ,0.0 ,"m/K" ,"Length dependence of M0" ) -`MPRnb( WM01 ,0.0 ,"m/K" ,"Width dependence of M0" ) -`MPRnb( PM01 ,0.0 ,"m^2/K" ,"Area dependence of M0" ) -`MPIcc( FNOIMOD ,0 ,"" ,0 ,1 ,"Flicker noise model selector" ) -`MPRoo( LH ,30n ,"m" ,0 ,L ,"Length of Halo transistor" ) -`MPRnb( NOIA2 ,NOIA ,"s^(1-EF)/(eV)^1/m^3" ,"Flicker noise parameter A for Halo" ) -`MPRoz( HNDEP ,NDEP ,"1/m^3" ,"Halo Doping Concentration for IV" ) - -// Common variables -real PSiso, PDiso, PSsha, PDsha, PSmer, PDmer, ASiso, ADiso, ASsha, ADsha, ASmer, ADmer; -real T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12; -real T0y, T1y, T2y, T3y; -real Tb; -real epssi, epsox, ni, Weff, Leff, Weff1, Leff1, Wact, Lact, Weffcj, Eg, Eg0, Weff_SH; -real dLIV, dWIV, dLB, dWB, dLCV, dWCV, dWJ, Cox, epsratio; -real Vdb_noswap, Vsb_noswap, Vgs_noswap, Vgd_noswap, Vds_noswap; -real sigvds, vfb, vgfb, vgfbCV, Vbsx, Vfbsdr; -real Vg, vg, Vd, Vs, vs, Vds, Vdsx, Vgs_eff, Vgd_eff; -real Vth_shift; -real qia, qba, qiaCV, qbaCV, qbs, qbd, qb, dps, phib, phib_n; -real nq, psip, psiavg, psipclamp, sqrtpsisa, sqrtpsisainv, sqrtpsip; -real Cdep, Lnew, L_mult, Wnew, W_mult; -real wf, wr; - -// Short channel effects -real n, Fp, nVt, inv_nVt, Vt, inv_Vt; -real PhistVbs, sqrtPhistVbs, Xdep, cdsc; -real T1DEP; -real dVth_ldop, DVTP0_i, DVTP1_i, DVTP2_i, DVTP3_i, DVTP4_i, DVTP5_i; -real dVth_VNUD, dVth_dibl, dvth_temp; -real gam, inv_gam, Phist, sqrtPhist, litl; - -// Drain saturation voltage -real qis, qdsat, Eeffs, Dmobs, Esat, EsatL, Vdsat, LambdaC_by2, LambdaC; -real Vdseff, Vdssat, VdssatCV, vdeff, vdsat, qdeff, vdsatcv, VdsatCV; -real ln_T1_T2; -real A1_i, A11_i, A1_t, A2_i, A21_i, A2_t, Nsat; - -// Mobility degradation -real EeffFactor, Eeffm, ueff, eta_mu, Dmob, Dtot; - -// Velocity saturation -real zsat, Dvsat, Dptwg, PSAT_i, PSATR_i, PSAT_a; - -// Output conductance -real diffVds, VaDITS, VaSCBE, Vasat; -real DIBLfactor, PVAGfactor, VaDIBL, Vgst2Vtm, Moc, MdL, Mscbe; - -// Impact ionization and GIDL -real Iii, igidl, igisl; - -// I-V variables -integer devsign; -real ids; - -// C-V variables -real Qb, Qs, Qd1, Qd2, Qd, Qi, QBi, QSi, QDi, QGi, WLCOXVtinv; -real qs, qbeff, dqgeff; -real DPD, vgfbPD, gammaPD, gamg2; -real MdL_2, inv_MdL, inv_MdL_2, MdL_less_1; -real sis, sid, vgpqm, Temps, Tempd, DQSD, DQSD2, invgamg2; -real Vgsov, Vgdov, Qovb, Qovg, Qovs, Qovd, Cgsof, Cgdof; -real XDCinv, Coxeffinv, BSIMBULKTOXP; -real Vgd_ov_noswap, Vgs_ov_noswap; - -// S/D series resistance -real WeffWRFactor, DMCGeff, DMDGeff, DMCIeff; -real RSourceGeo, RDrainGeo, Rsource, Rdrain, Rdss, Rdsi, Dr; - -// S/D junction area and perimeter -real temp_ASeff, temp_ADeff, temp_PSeff, temp_PDeff; -real ASeff, ADeff; - -// Gate resistances -real Grgeltd, Gcrg, idsovvds; - -// Body resistance -real Lnl, Lnw, Lnnf, Bodymode, Rbpbx, Rbpby, Rbsbx, Rbsby, Rbdbx, Rbdby; -real Rbdb, Rbsb, Rbpb, Rbps, Rbpd; -real Grbsb, Grbdb, Grbpb, Grbps, Grbpd; - -// Gate current -real Voxm, Voxminv, Voxmacc, Vdseffx; -real Vaux_Igbinv, Vaux_Igbacc, igbinv, igbacc, igb; -real igcs, igcd, igc0, T1_exp; -real igs, igd, igs_mult, igd_mult; -real Aechvb, Bechvb, AechvbEdge, BechvbEdge, ToxRatio, ToxRatioEdge; - -// Junction current and capacitance -real PSeff, PDeff; -real Ibs, Ibd, Vbs_jct, Vbd_jct, arg, sarg; -real Czbs, czbs_p1, czbs_p2, Czbssw, czbssw_p1, czbssw_p2, Czbsswg, czbsswg_p1, czbsswg_p2; -real Czbd, czbd_p1, czbd_p2, Czbdsw, czbdsw_p1, czbdsw_p2, Czbdswg, czbdswg_p1, czbdswg_p2; -real Qbsj, Qbsj1, Qbsj2, Qbsj3; -real Qbdj, Qbdj1, Qbdj2, Qbdj3; -real Isbs, Isbd, Nvtms, Nvtmd; -real SslpRev, IVjsmRev, VjsmRev, SslpFwd, IVjsmFwd, VjsmFwd, XExpBVS; -real DslpRev, IVjdmRev, VjdmRev, DslpFwd, IVjdmFwd, VjdmFwd, XExpBVD; - -// Flicker noise -real LINTNOI_i; -real Esatnoi, Leffnoi, Leffnoisq, DelClm; -real N0, Nl, Nstar, Ssi, Swi, FNPowerAt1Hz; - -// Thermal noise -real gspr, gdpr; -real Gtnoi, sidn, Nt; -real mig, migid, mid, Lvsat, Vtn; -real cm_igid, sqid, sqig, ctnoi, betanoisq, thetanoisq, betaLowId; - -// Temperature effects -real delTemp1; -real DevTemp, Tnom, Vtm, Vtm0; -real TRatio, delTemp; -real U0_t, U0R_t, UA_t, UAR_t, UC_t, UCR_t, UD_t, UDR_t, UCS_t, UCSR_t, rdstemp, VSAT_t, VSATR_t, VSATCV_t; -real DELTA_t, PTWG_t, PTWGR_t, BETA0_t, BGIDL_t, BGISL_t; -real igtemp; -real ETA0_t, ETA0R_t, NFACTOR_t; - -//Diode temperature effects -real CJS_t, CJSWS_t, CJSWGD_t, CJD_t, CJSWD_t, CJSWGS_t; -real PBS_t, PBSWS_t, PBSWGS_t, PBD_t, PBSWD_t, PBSWGD_t; -real JSS_t, JSWS_t, JSWGS_t, JSD_t, JSWD_t, JSWGD_t; -real JTSS_t, JTSD_t, JTSSWS_t, JTSSWD_t, JTSSWGS_t, JTSSWGD_t; -real NJTS_t, NJTSD_t, NJTSSW_t, NJTSSWD_t, NJTSSWG_t, NJTSSWGD_t; - -// Binning -real PSATB_i; -real KT1_i, KT2_i; -real W_by_NF; -real L_LLN, W_LWN, LW_LLN_LWN, L_LLN1, W_LWN1, LW_LLN_LWN1; -real L_WLN, W_WWN, LW_WLN_WWN, L_WLN1, W_WWN1, LW_WLN_WWN1; -real Inv_L, Inv_W, Inv_WL, Inv_Lact, Inv_Wact, Inv_Llong, Inv_Wwide; -real BIN_L, BIN_W, BIN_WL; -real NGATE_i, NSD_i, NDEP_i, VFB_i; -real CIT_i, CDSCD_i, CDSCDR_i, CDSCD_a, CDSCB_i, NFACTOR_i; -real PHIN_i, ETA0_i, ETA0R_i, ETA0_a, ETAB_i, K2_i, K1_i; -real DELTA_i; -real U0_i, U0R_i, U0_a, VSAT_i, VSATR_i, VSAT_a, VSATCV_i, UA_i, UAR_i, UA_a, EU_i, UD_i, UDR_i, UD_a, UCS_i, UCSR_i, UCS_a, UC_i, UCR_i, UC_a; -real PDIBLC_i, PDIBLCR_i, PDIBLC_a, PDIBLCB_i, PSCBE1_i, PSCBE2_i, PDITS_i, PDITSD_i, FPROUT_i; -real PRWG_i, WR_i, RDWMIN_i, RSWMIN_i, RDW_i, RSW_i, RDSW_i, RDSWMIN_i; -real PTWG_i, PTWGR_i, PTWG_a, PVAG_i, XJ_i; -real PCLM_i, PCLMR_i, PCLM_a, PCLMCV_i, PRWB_i; -real CF_i, CGSL_i, CGDL_i, CKAPPAS_i, CKAPPAD_i; -real VFBCV_i, NDEPCV_i; -real ALPHA0_i, BETA0_i; -real AGIDL_i, BGIDL_i, CGIDL_i, EGIDL_i; -real AGISL_i, BGISL_i, CGISL_i, EGISL_i; -real UTE_i, UA1_i, UC1_i, UD1_i, UCSTE_i, PRT_i, AT_i, PTWGT_i, IIT_i, TGIDL_i; -real KVTH0WE_i, K2WE_i, KU0WE_i; -real AIGBINV_i, BIGBINV_i, CIGBINV_i, EIGBINV_i, NIGBINV_i; -real AIGBACC_i, BIGBACC_i, CIGBACC_i, NIGBACC_i; -real AIGC_i, BIGC_i, CIGC_i; -real AIGS_i, BIGS_i, CIGS_i, AIGD_i, BIGD_i, CIGD_i, POXEDGE_i, PIGCD_i; -real DLCIG_i, DLCIGD_i, NTOX_i; -real IGT_i; -real K0_i, M0_i; -real K01_i, M01_i; -real K0_t, M0_t; -real Mnud; -real NFACTOREDGE_i, CITEDGE_i, CDSCDEDGE_i, CDSCBEDGE_i, ETA0EDGE_i, ETABEDGE_i, KT1EDGE_i, KT1LEDGE_i, KT2EDGE_i, KT1EXPEDGE_i, TNFACTOREDGE_i, TETA0EDGE_i, K2EDGE_i, KVTH0EDGE_i, STK2EDGE_i, STETA0EDGE_i; - -// Stress effect -real W_tmp_stress, tmp1_stress, kstress_u0, tmp1_stress_vth, kstress_vth0, ku0_temp; -real Inv_sa, Inv_sb, Inv_saref, Inv_sbref, Inv_odref, rho_ref, Inv_od,rho; -real mu0_mult, vsat_mult, vth0_stress, k2_stress, eta_stress; -integer i; - -// Well Proximity effect -real vth0_well, k2_well, mu_well, Wdrn, local_sca, local_scb, local_scc; - -// Edge FET Model Variables -real ids_edge, ETA0EDGE_t, NFACTOREDGE_t, Vbi, theta_sce_edge, dvth_dibl, dvth_sce, litl_edge, DGAMMAEDGE_i, vdsatedge, Vdsatedge, Vdssate; -real vth0_stress_EDGE, k2_stress_EDGE, eta_stress_EDGE, K2_EDGE,ETA0_EDGE; - -// The following are used by the macro definitions (GEOMOD and RGEOMOD) -real nuIntD, nuEndD, nuIntS, nuEndS; -real Rint, Rend; - -// Sub-surface punchthrough -real Issl, SSL0_NT, SSL1_NT, PHIB_SSL; - -// VTH variables -real q_vth, psip_th; - -// 1/f Noise model for Halo -real vgfbh, gam_h, phib_h, psiph, qsh, nq_h, U0_i_h, i1, qdh, i2, qsch; -real Np2, beta_ch, beta_h, gds_h, gds_ch, gm_ch, R_ch, R_h, Ssi_ch; -real Swi_ch, FNPowerAt1Hz_ch, FNPowerAt1Hz_h; -real T0a, T0b, T0c, T0d, T0e, Swi_h, t_tot, CF_ch, CF_h, LeffnoiH; - -// Self Heating -real gth, cth; - -real Ggate, Gnoise; - - -// OPERATING POINT VARIABLES -`OPM( QBI, "C", "Intrinsic body charge") -`OPM( QSI, "C", "Intrinsic source charge") -`OPM( QDI, "C", "Intrinsic drain charge") -`OPM( QGI, "C", "Intrinsic gate charge") -`OPM( CGGI, "F", "Intrinsic g-g MOSFET capacitance") -`OPM( CGBI, "F", "Intrinsic g-b MOSFET capacitance") -`OPM( CGSI, "F", "Intrinsic g-s MOSFET capacitance") -`OPM( CGDI, "F", "Intrinsic g-d MOSFET capacitance") -`OPM( CSGI, "F", "Intrinsic s-g MOSFET capacitance") -`OPM( CSBI, "F", "Intrinsic s-b MOSFET capacitance") -`OPM( CSSI, "F", "Intrinsic s-s MOSFET capacitance") -`OPM( CSDI, "F", "Intrinsic s-d MOSFET capacitance") -`OPM( CDGI, "F", "Intrinsic d-g MOSFET capacitance") -`OPM( CDBI, "F", "Intrinsic d-b MOSFET capacitance") -`OPM( CDSI, "F", "Intrinsic d-s MOSFET capacitance") -`OPM( CDDI, "F", "Intrinsic d-d MOSFET capacitance") -`OPM( CBGI, "F", "Intrinsic b-g MOSFET capacitance") -`OPM( CBBI, "F", "Intrinsic b-b MOSFET capacitance") -`OPM( CBSI, "F", "Intrinsic b-s MOSFET capacitance") -`OPM( CBDI, "F", "Intrinsic b-d MOSFET capacitance") -`OPM( QB, "C", "Body charge") -`OPM( QS, "C", "Source charge") -`OPM( QD, "C", "Drain charge") -`OPM( QG, "C", "Gate charge") -`OPM( CGG, "F", "g-g MOSFET capacitance") -`OPM( CGB, "F", "g-b MOSFET capacitance") -`OPM( CGS, "F", "g-s MOSFET capacitance") -`OPM( CGD, "F", "g-d MOSFET capacitance") -`OPM( CSG, "F", "s-g MOSFET capacitance") -`OPM( CSB, "F", "s-b MOSFET capacitance") -`OPM( CSS, "F", "s-s MOSFET capacitance") -`OPM( CSD, "F", "s-d MOSFET capacitance") -`OPM( CDG, "F", "d-g MOSFET capacitance") -`OPM( CDB, "F", "d-b MOSFET capacitance") -`OPM( CDS, "F", "d-s MOSFET capacitance") -`OPM( CDD, "F", "d-d MOSFET capacitance") -`OPM( CBG, "F", "b-g MOSFET capacitance") -`OPM( CBB, "F", "b-b MOSFET capacitance") -`OPM( CBS, "F", "b-s MOSFET capacitance") -`OPM( CBD, "F", "b-d MOSFET capacitance") -`OPM( ISUB, "A", "Substrate current") -`OPM( IGIDL, "A", "") -`OPM( IGISL, "A", "") -`OPM( IGS, "A", "") -`OPM( IGD, "A", "") -`OPM( IGCS, "A", "") -`OPM( IGCD, "A", "") -`OPM( IGB, "A", "") -`OPM( CGSEXT, "F", "") -`OPM( CGDEXT, "F", "") -`OPM( CGBOV, "F", "Front gate charge") -`OPM( CAPBS, "F", "") -`OPM( CAPBD, "F", "") -`OPP( WEFF, "m", "") -`OPP( LEFF, "m", "") -`OPP( WEFFCV, "m", "") -`OPP( LEFFCV, "m", "") -`OPM( IDS, "A", "Drain-source current") -`OPM( IDEFF, "A", "Effective drain current") -`OPM( ISEFF, "A", "Effective source current") -`OPM( IGEFF, "A", "Effective gate current") -`OPM( IBS, "A", "") -`OPM( IBD, "A", "") -`OPP( VDS, "V", "Drain to source voltage") -`OPP( VGS, "V", "Gate to source voltage") -`OPP( VBS, "V", "Body to source voltage") -`OPP( VDSAT, "V", "") -`OPM( GM, "mho", "") -`OPM( GMBS, "mho", "") -`OPM( GDS, "mho", "") -`OPP( T_TOTAL_K, "K", "") -`OPP( T_TOTAL_C, "degC", "") -`OPP( T_DELTA_SH, "K", "") -`OPP( VTH, "V", "Threshold voltage") - -analog begin - // Variable initialization to prevent hidden states - CDSCDR_i = 0.0; ETA0R_i = 0.0; ETA0R_t = 0.0; L_LLN1 = 0.0; - L_WLN1 = 0.0; PCLMR_i = 0.0; PDIBLCR_i = 0.0; PSATR_i = 0.0; - PTWGR_i = 0.0; PTWGR_t = 0.0; U0R_i = 0.0; U0R_t = 0.0; - UAR_i = 0.0; UAR_t = 0.0; UCR_i = 0.0; UCR_t = 0.0; - UCSR_i = 0.0; UCSR_t = 0.0; UDR_i = 0.0; UDR_t = 0.0; - UD_a = 0.0; VSATR_i = 0.0; VSATR_t = 0.0; W_LWN1 = 0.0; - W_WWN1 = 0.0; local_sca = 0.0; local_scb = 0.0; local_scc = 0.0; - Inv_sa = 0.0; Inv_sb = 0.0; vth0_stress_EDGE = 0.0; k2_stress_EDGE = 0.0; - eta_stress = 0.0; K2_EDGE = 0.0; ETA0_EDGE = 0.0; eta_stress_EDGE = 0.0; - local_sca = 0.0; local_scb = 0.0; local_scc = 0.0; K0_i = 0.0; - M0_i = 0.0; K01_i = 0.0; M01_i = 0.0; K0_t = 0.0; - M0_t = 0.0; CITEDGE_i = 0.0; CDSCDEDGE_i = 0.0; CDSCBEDGE_i = 0.0; - ETA0EDGE_i = 0.0; ETABEDGE_i = 0.0; KT1EDGE_i = 0.0; KT1LEDGE_i = 0.0; - KT2EDGE_i = 0.0; KT1EXPEDGE_i = 0.0; TNFACTOREDGE_i = 0.0; TETA0EDGE_i = 0.0; - K2EDGE_i = 0.0; KVTH0EDGE_i = 0.0; STK2EDGE_i = 0.0; STETA0EDGE_i = 0.0; - - // Bias independent calculations - if (TYPE == `ntype) begin - devsign = 1; - end else begin - devsign = -1; - end - - // Constants - epssi = EPSRSUB * `EPS0; - epsox = EPSROX * `EPS0; - Cox = EPSROX * `EPS0 / TOXE; - epsratio = EPSRSUB / EPSROX; - - // Physical Oxide Thickness - if (!$param_given(TOXP)) begin - BSIMBULKTOXP = (TOXE * EPSROX / 3.9) - DTOX; - end else begin - BSIMBULKTOXP = TOXP; - end - L_mult = L * LMLT; - W_mult = W * WMLT; - Lnew = L_mult + XL; - if (Lnew <= 0.0) begin - $strobe("Fatal: Ldrawn * LMLT + XL = %e for BSIMBULK is non-positive", Lnew); - $finish(0); - end - W_by_NF = W_mult / NF; - Wnew = W_by_NF + XW; - if (Wnew <= 0.0) begin - $strobe("Fatal: W / NF * WMLT + XW = %e for BSIMBULK is non-positive", Wnew); - $finish(0); - end - - // Leff and Weff for I-V - L_LLN = pow(Lnew, -LLN); - W_LWN = pow(Wnew, -LWN); - LW_LLN_LWN = L_LLN * W_LWN; - dLIV = LINT + LL * L_LLN + LW * W_LWN + LWL * LW_LLN_LWN; - L_WLN = pow(Lnew, -WLN); - W_WWN = pow(Wnew, -WWN); - LW_WLN_WWN = L_WLN * W_WWN; - dWIV = WINT + WL * L_WLN + WW * W_WWN + WWL * LW_WLN_WWN; - Leff = Lnew - 2.0 * dLIV; - if (Leff <= 0.0) begin - $strobe("Fatal: Effective channel length = %e for BSIMBULK is non-positive", Leff); - $finish(0); - end else if (Leff <= 1.0e-9) begin - $strobe("Warning: Effective channel length = %e for BSIMBULK is <= 1.0e-9. Recommended Leff >= 1e-8", Leff); - end - Weff = Wnew - 2.0 * dWIV; - if (Weff <= 0.0) begin - $strobe("Fatal: Effective channel Width = %e for BSIMBULK is non-positive", Weff); - $finish(0); - end else if (Weff <= 1.0e-9) begin - $strobe("Warning: Effective channel width = %e for BSIMBULK is <= 1.0e-9. Recommended Weff >= 1e-8", Weff); - end - - // Leff and Weff for C-V - dLCV = DLC + LLC * L_LLN + LWC * W_LWN + LWLC * LW_LLN_LWN; - dWCV = DWC + WLC * L_WLN + WWC * W_WWN + WWLC * LW_WLN_WWN; - Lact = Lnew - 2.0 * dLCV; - if (Lact <= 0.0) begin - $strobe("Fatal: Effective channel length for CV = %e for BSIMBULK is non-positive", Lact); - $finish(0); - end else if (Lact <= 1.0e-9) begin - $strobe("Warning: Effective channel length for CV = %e for BSIMBULK is <= 1.0e-9. Recommended Lact >= 1e-8", Lact); - end - Wact = Wnew - 2.0 * dWCV; - if (Wact <= 0.0) begin - $strobe("Fatal: Effective channel width for CV = %e for BSIMBULK is non-positive", Wact); - $finish(0); - end else if (Wact <= 1.0e-9) begin - $strobe("Warning: Effective channel width for CV = %e for BSIMBULK is <= 1.0e-9. Recommended Wact >= 1e-8", Wact); - end - - // Weffcj for Diode, GIDL etc. - dWJ = DWJ + WLC / pow(Lnew, WLN) + WWC / pow(Wnew, WWN) + WWLC / pow(Lnew, WLN) / pow(Wnew, WWN); - Weffcj = Wnew - 2.0 * dWJ; - if (Weffcj <= 0.0) begin - $strobe("Fatal: Effective channel width for S/D junctions = %e for BSIMBULK is non-positive", Weffcj); - $finish(0); - end - Inv_L = 1.0e-6 / Leff; - Inv_W = 1.0e-6 / Weff; - Inv_Lact = 1.0e-6 / Lact; - Inv_Wact = 1.0e-6 / Wact; - Inv_Llong = 1.0e-6 / LLONG; - Inv_Wwide = 1.0e-6 / WWIDE; - Inv_WL = Inv_L * Inv_W; - - // Effective length and width for binning - L_LLN1 = L_LLN; - L_WLN1 = L_WLN; - if (DLBIN != 0.0) begin - if (DLBIN <= -Lnew) begin - $strobe("Fatal: DLBIN for BSIMBULK = %e is <= -Ldrawn * LMLT", DLBIN); - $finish(0); - end else begin - L_LLN1 = pow(Lnew + DLBIN, -LLN); - L_WLN1 = pow(Lnew + DLBIN, -WLN); - end - end - W_LWN1 = W_LWN; - W_WWN1 = W_WWN; - if (DWBIN != 0.0) begin - if (DWBIN <= -Wnew) begin - $strobe("Fatal: DWBIN for BSIMBULK = %e is <= -Wdrawn * WMLT", DWBIN); - $finish(0); - end else begin - W_LWN1 = pow(Wnew + DWBIN, -LWN); - W_WWN1 = pow(Wnew + DWBIN, -WWN); - end - end - LW_LLN_LWN1 = L_LLN1 * W_LWN1; - dLB = LINT + LL * L_LLN1 + LW * W_LWN1 + LWL * LW_LLN_LWN1; - LW_WLN_WWN1 = L_WLN1 * W_WWN1; - dWB = WINT + WL * L_WLN1 + WW * W_WWN1 + WWL * LW_WLN_WWN1; - Leff1 = Lnew - 2.0 * dLB + DLBIN; - if (Leff1 <= 0.0) begin - $strobe("Fatal: Effective channel length for binning = %e for BSIMBULK is non-positive", Leff1); - $finish(0); - end - Weff1 = Wnew - 2.0 * dWB + DWBIN; - if (Weff1 <= 0.0) begin - $strobe("Fatal: Effective channel width for binning = %e for BSIMBULK is non-positive", Weff1); - $finish(0); - end - if (BINUNIT == 1) begin - BIN_L = 1.0e-6 / Leff1; - BIN_W = 1.0e-6 / Weff1; - end else begin - BIN_L = 1.0 / Leff1; - BIN_W = 1.0 / Weff1; - end - BIN_WL = BIN_L * BIN_W; - VFB_i = VFB + BIN_L * LVFB + BIN_W * WVFB + BIN_WL * PVFB; - VFBCV_i = VFBCV + BIN_L * LVFBCV + BIN_W * WVFBCV + BIN_WL * PVFBCV; - NSD_i = NSD + BIN_L * LNSD + BIN_W * WNSD + BIN_WL * PNSD; - NDEP_i = NDEP + BIN_L * LNDEP + BIN_W * WNDEP + BIN_WL * PNDEP; - NDEPCV_i = NDEPCV + BIN_L * LNDEPCV + BIN_W * WNDEPCV + BIN_WL * PNDEPCV; - NGATE_i = NGATE + BIN_L * LNGATE + BIN_W * WNGATE + BIN_WL * PNGATE; - CIT_i = CIT + BIN_L * LCIT + BIN_W * WCIT + BIN_WL * PCIT; - NFACTOR_i = NFACTOR + BIN_L * LNFACTOR + BIN_W * WNFACTOR + BIN_WL * PNFACTOR; - CDSCD_i = CDSCD + BIN_L * LCDSCD + BIN_W * WCDSCD + BIN_WL * PCDSCD; - CDSCB_i = CDSCB + BIN_L * LCDSCB + BIN_W * WCDSCB + BIN_WL * PCDSCB; - DVTP0_i = DVTP0 + BIN_L * LDVTP0 + BIN_W * WDVTP0 + BIN_WL * PDVTP0; - DVTP1_i = DVTP1 + BIN_L * LDVTP1 + BIN_W * WDVTP1 + BIN_WL * PDVTP1; - DVTP2_i = DVTP2 + BIN_L * LDVTP2 + BIN_W * WDVTP2 + BIN_WL * PDVTP2; - DVTP3_i = DVTP3 + BIN_L * LDVTP3 + BIN_W * WDVTP3 + BIN_WL * PDVTP3; - DVTP4_i = DVTP4 + BIN_L * LDVTP4 + BIN_W * WDVTP4 + BIN_WL * PDVTP4; - DVTP5_i = DVTP5 + BIN_L * LDVTP5 + BIN_W * WDVTP5 + BIN_WL * PDVTP5; - K2_i = K2 + BIN_L * LK2 + BIN_W * WK2 + BIN_WL * PK2; - K1_i = K1 + BIN_L * LK1 + BIN_W * WK1 + BIN_WL * PK1; - XJ_i = XJ + BIN_L * LXJ + BIN_W * WXJ + BIN_WL * PXJ; - PHIN_i = PHIN + BIN_L * LPHIN + BIN_W * WPHIN + BIN_WL * PPHIN; - ETA0_i = ETA0 + BIN_L * LETA0 + BIN_W * WETA0 + BIN_WL * PETA0; - ETAB_i = ETAB + BIN_L * LETAB + BIN_W * WETAB + BIN_WL * PETAB; - DELTA_i = DELTA + BIN_L * LDELTA + BIN_W * WDELTA + BIN_WL * PDELTA; - U0_i = U0 + BIN_L * LU0 + BIN_W * WU0 + BIN_WL * PU0; - UA_i = UA + BIN_L * LUA + BIN_W * WUA + BIN_WL * PUA; - UD_i = UD + BIN_L * LUD + BIN_W * WUD + BIN_WL * PUD; - EU_i = EU + BIN_L * LEU + BIN_W * WEU + BIN_WL * PEU; - UCS_i = UCS + BIN_L * LUCS + BIN_W * WUCS + BIN_WL * PUCS; - UC_i = UC + BIN_L * LUC + BIN_W * WUC + BIN_WL * PUC; - PCLM_i = PCLM + BIN_L * LPCLM + BIN_W * WPCLM + BIN_WL * PPCLM; - PCLMCV_i = PCLMCV + BIN_L * LPCLMCV + BIN_W * WPCLMCV + BIN_WL * PPCLMCV; - RSW_i = RSW + BIN_L * LRSW + BIN_W * WRSW + BIN_WL * PRSW; - RDW_i = RDW + BIN_L * LRDW + BIN_W * WRDW + BIN_WL * PRDW; - PRWG_i = PRWG + BIN_L * LPRWG + BIN_W * WPRWG + BIN_WL * PPRWG; - PRWB_i = PRWB + BIN_L * LPRWB + BIN_W * WPRWB + BIN_WL * PPRWB; - WR_i = WR + BIN_L * LWR + BIN_W * WWR + BIN_WL * PWR; - RSWMIN_i = RSWMIN + BIN_L * LRSWMIN + BIN_W * WRSWMIN + BIN_WL * PRSWMIN; - RDWMIN_i = RDWMIN + BIN_L * LRDWMIN + BIN_W * WRDWMIN + BIN_WL * PRDWMIN; - RDSW_i = RDSW + BIN_L * LRDSW + BIN_W * WRDSW + BIN_WL * PRDSW; - RDSWMIN_i = RDSWMIN + BIN_L * LRDSWMIN + BIN_W * WRDSWMIN + BIN_WL * PRDSWMIN; - PTWG_i = PTWG + BIN_L * LPTWG + BIN_W * WPTWG + BIN_WL * PPTWG; - PDIBLC_i = PDIBLC + BIN_L * LPDIBLC + BIN_W * WPDIBLC + BIN_WL * PPDIBLC; - PDIBLCB_i = PDIBLCB + BIN_L * LPDIBLCB + BIN_W * WPDIBLCB + BIN_WL * PPDIBLCB; - PSCBE1_i = PSCBE1 + BIN_L * LPSCBE1 + BIN_W * WPSCBE1 + BIN_WL * PPSCBE1; - PSCBE2_i = PSCBE2 + BIN_L * LPSCBE2 + BIN_W * WPSCBE2 + BIN_WL * PPSCBE2; - PDITS_i = PDITS + BIN_L * LPDITS + BIN_W * WPDITS + BIN_WL * PPDITS; - PDITSD_i = PDITSD + BIN_L * LPDITSD + BIN_W * WPDITSD + BIN_WL * PPDITSD; - FPROUT_i = FPROUT + BIN_L * LFPROUT + BIN_W * WFPROUT + BIN_WL * PFPROUT; - PVAG_i = PVAG + BIN_L * LPVAG + BIN_W * WPVAG + BIN_WL * PPVAG; - VSAT_i = VSAT + BIN_L * LVSAT + BIN_W * WVSAT + BIN_WL * PVSAT; - PSAT_i = PSAT + BIN_L * LPSAT + BIN_W * WPSAT + BIN_WL * PPSAT; - VSATCV_i = VSATCV + BIN_L * LVSATCV + BIN_W * WVSATCV + BIN_WL * PVSATCV; - CF_i = CF + BIN_L * LCF + BIN_W * WCF + BIN_WL * PCF; - CGSL_i = CGSL + BIN_L * LCGSL + BIN_W * WCGSL + BIN_WL * PCGSL; - CGDL_i = CGDL + BIN_L * LCGDL + BIN_W * WCGDL + BIN_WL * PCGDL; - CKAPPAS_i = CKAPPAS + BIN_L * LCKAPPAS + BIN_W * WCKAPPAS + BIN_WL * PCKAPPAS; - CKAPPAD_i = CKAPPAD + BIN_L * LCKAPPAD + BIN_W * WCKAPPAD + BIN_WL * PCKAPPAD; - ALPHA0_i = ALPHA0 + BIN_L * LALPHA0 + BIN_W * WALPHA0 + BIN_WL * PALPHA0; - BETA0_i = BETA0 + BIN_L * LBETA0 + BIN_W * WBETA0 + BIN_WL * PBETA0; - KVTH0WE_i = KVTH0WE + BIN_L * LKVTH0WE + BIN_W * WKVTH0WE + BIN_WL * PKVTH0WE; - K2WE_i = K2WE + BIN_L * LK2WE + BIN_W * WK2WE + BIN_WL * PK2WE; - KU0WE_i = KU0WE + BIN_L * LKU0WE + BIN_W * WKU0WE + BIN_WL * PKU0WE; - AGIDL_i = AGIDL + BIN_L * LAGIDL + BIN_W * WAGIDL + BIN_WL * PAGIDL; - BGIDL_i = BGIDL + BIN_L * LBGIDL + BIN_W * WBGIDL + BIN_WL * PBGIDL; - CGIDL_i = CGIDL + BIN_L * LCGIDL + BIN_W * WCGIDL + BIN_WL * PCGIDL; - EGIDL_i = EGIDL + BIN_L * LEGIDL + BIN_W * WEGIDL + BIN_WL * PEGIDL; - AGISL_i = AGISL + BIN_L * LAGISL + BIN_W * WAGISL + BIN_WL * PAGISL; - BGISL_i = BGISL + BIN_L * LBGISL + BIN_W * WBGISL + BIN_WL * PBGISL; - CGISL_i = CGISL + BIN_L * LCGISL + BIN_W * WCGISL + BIN_WL * PCGISL; - EGISL_i = EGISL + BIN_L * LEGISL + BIN_W * WEGISL + BIN_WL * PEGISL; - UTE_i = UTE + BIN_L * LUTE + BIN_W * WUTE + BIN_WL * PUTE; - UA1_i = UA1 + BIN_L * LUA1 + BIN_W * WUA1 + BIN_WL * PUA1; - UC1_i = UC1 + BIN_L * LUC1 + BIN_W * WUC1 + BIN_WL * PUC1; - UD1_i = UD1 + BIN_L * LUD1 + BIN_W * WUD1 + BIN_WL * PUD1; - UCSTE_i = UCSTE + BIN_L * LUCSTE + BIN_W * WUCSTE + BIN_WL * PUCSTE; - PRT_i = PRT + BIN_L * LPRT + BIN_W * WPRT + BIN_WL * PPRT; - AT_i = AT + BIN_L * LAT + BIN_W * WAT + BIN_WL * PAT; - PTWGT_i = PTWGT + BIN_L * LPTWGT + BIN_W * WPTWGT + BIN_WL * PPTWGT; - IIT_i = IIT + BIN_L * LIIT + BIN_W * WIIT + BIN_WL * PIIT; - TGIDL_i = TGIDL + BIN_L * LTGIDL + BIN_W * WTGIDL + BIN_WL * PTGIDL; - IGT_i = IGT + BIN_L * LIGT + BIN_W * WIGT + BIN_WL * PIGT; - AIGBINV_i = AIGBINV + BIN_L * LAIGBINV + BIN_W * WAIGBINV + BIN_WL * PAIGBINV; - BIGBINV_i = BIGBINV + BIN_L * LBIGBINV + BIN_W * WBIGBINV + BIN_WL * PBIGBINV; - CIGBINV_i = CIGBINV + BIN_L * LCIGBINV + BIN_W * WCIGBINV + BIN_WL * PCIGBINV; - EIGBINV_i = EIGBINV + BIN_L * LEIGBINV + BIN_W * WEIGBINV + BIN_WL * PEIGBINV; - NIGBINV_i = NIGBINV + BIN_L * LNIGBINV + BIN_W * WNIGBINV + BIN_WL * PNIGBINV; - AIGBACC_i = AIGBACC + BIN_L * LAIGBACC + BIN_W * WAIGBACC + BIN_WL * PAIGBACC; - BIGBACC_i = BIGBACC + BIN_L * LBIGBACC + BIN_W * WBIGBACC + BIN_WL * PBIGBACC; - CIGBACC_i = CIGBACC + BIN_L * LCIGBACC + BIN_W * WCIGBACC + BIN_WL * PCIGBACC; - NIGBACC_i = NIGBACC + BIN_L * LNIGBACC + BIN_W * WNIGBACC + BIN_WL * PNIGBACC; - AIGC_i = AIGC + BIN_L * LAIGC + BIN_W * WAIGC + BIN_WL * PAIGC; - BIGC_i = BIGC + BIN_L * LBIGC + BIN_W * WBIGC + BIN_WL * PBIGC; - CIGC_i = CIGC + BIN_L * LCIGC + BIN_W * WCIGC + BIN_WL * PCIGC; - AIGS_i = AIGS + BIN_L * LAIGS + BIN_W * WAIGS + BIN_WL * PAIGS; - BIGS_i = BIGS + BIN_L * LBIGS + BIN_W * WBIGS + BIN_WL * PBIGS; - CIGS_i = CIGS + BIN_L * LCIGS + BIN_W * WCIGS + BIN_WL * PCIGS; - AIGD_i = AIGD + BIN_L * LAIGD + BIN_W * WAIGD + BIN_WL * PAIGD; - BIGD_i = BIGD + BIN_L * LBIGD + BIN_W * WBIGD + BIN_WL * PBIGD; - CIGD_i = CIGD + BIN_L * LCIGD + BIN_W * WCIGD + BIN_WL * PCIGD; - POXEDGE_i = POXEDGE + BIN_L * LPOXEDGE + BIN_W * WPOXEDGE + BIN_WL * PPOXEDGE; - DLCIG_i = DLCIG + BIN_L * LDLCIG + BIN_W * WDLCIG + BIN_WL * PDLCIG; - DLCIGD_i = DLCIGD + BIN_L * LDLCIGD + BIN_W * WDLCIGD + BIN_WL * PDLCIGD; - NTOX_i = NTOX + BIN_L * LNTOX + BIN_W * WNTOX + BIN_WL * PNTOX; - KT1_i = KT1 + BIN_L * LKT1 + BIN_W * WKT1 + BIN_WL * PKT1; - KT2_i = KT2 + BIN_L * LKT2 + BIN_W * WKT2 + BIN_WL * PKT2; - PSATB_i = PSATB + BIN_L * LPSATB + BIN_W * WPSATB + BIN_WL * PPSATB; - A1_i = A1 + BIN_L * LA1 + BIN_W * WA1 + BIN_WL * PA1; - A11_i = A11 + BIN_L * LA11 + BIN_W * WA11 + BIN_WL * PA11; - A2_i = A2 + BIN_L * LA2 + BIN_W * WA2 + BIN_WL * PA2; - A21_i = A21 + BIN_L * LA21 + BIN_W * WA21 + BIN_WL * PA21; - K0_i = K0 + BIN_L * LK0 + BIN_W * WK0 + BIN_WL * PK0; - M0_i = M0 + BIN_L * LM0 + BIN_W * WM0 + BIN_WL * PM0; - K01_i = K01 + BIN_L * LK01 + BIN_W * WK01 + BIN_WL * PK01; - M01_i = M01 + BIN_L * LM01 + BIN_W * WM01 + BIN_WL * PM01; - NFACTOREDGE_i = NFACTOREDGE + BIN_L * LNFACTOREDGE + BIN_W * WNFACTOREDGE + BIN_WL * PNFACTOREDGE; - CITEDGE_i = CITEDGE + BIN_L * LCITEDGE + BIN_W * WCITEDGE + BIN_WL * PCITEDGE; - CDSCDEDGE_i = CDSCDEDGE + BIN_L * LCDSCDEDGE + BIN_W * WCDSCDEDGE + BIN_WL * PCDSCDEDGE; - CDSCBEDGE_i = CDSCBEDGE + BIN_L * LCDSCBEDGE + BIN_W * WCDSCBEDGE + BIN_WL * PCDSCBEDGE; - ETA0EDGE_i = ETA0EDGE + BIN_L * LETA0EDGE + BIN_W * WETA0EDGE + BIN_WL * PETA0EDGE; - ETABEDGE_i = ETABEDGE + BIN_L * LETABEDGE + BIN_W * WETABEDGE + BIN_WL * PETABEDGE; - KT1EDGE_i = KT1EDGE + BIN_L * LKT1EDGE + BIN_W * WKT1EDGE + BIN_WL * PKT1EDGE; - KT1LEDGE_i = KT1LEDGE + BIN_L * LKT1LEDGE + BIN_W * WKT1LEDGE + BIN_WL * PKT1LEDGE; - KT2EDGE_i = KT2EDGE + BIN_L * LKT2EDGE + BIN_W * WKT2EDGE + BIN_WL * PKT2EDGE; - KT1EXPEDGE_i = KT1EXPEDGE + BIN_L * LKT1EXPEDGE + BIN_W * WKT1EXPEDGE + BIN_WL * PKT1EXPEDGE; - TNFACTOREDGE_i = TNFACTOREDGE + BIN_L * LTNFACTOREDGE + BIN_W * WTNFACTOREDGE + BIN_WL * PTNFACTOREDGE; - TETA0EDGE_i = TETA0EDGE + BIN_L * LTETA0EDGE + BIN_W * WTETA0EDGE + BIN_WL * PTETA0EDGE; - K2EDGE_i = K2EDGE + BIN_L * LK2EDGE + BIN_W * WK2EDGE + BIN_WL * PK2EDGE; - KVTH0EDGE_i = KVTH0EDGE + BIN_L * LKVTH0EDGE + BIN_W * WKVTH0EDGE + BIN_WL * PKVTH0EDGE; - STK2EDGE_i = STK2EDGE + BIN_L * LSTK2EDGE + BIN_W * WSTK2EDGE + BIN_WL * PSTK2EDGE; - STETA0EDGE_i = STETA0EDGE + BIN_L * LSTETA0EDGE + BIN_W * WSTETA0EDGE + BIN_WL * PSTETA0EDGE; - - if (ASYMMOD != 0) begin - CDSCDR_i = CDSCDR + BIN_L * LCDSCDR + BIN_W * WCDSCDR + BIN_WL * PCDSCDR; - ETA0R_i = ETA0R + BIN_L * LETA0R + BIN_W * WETA0R + BIN_WL * PETA0R; - U0R_i = U0R + BIN_L * LU0R + BIN_W * WU0R + BIN_WL * PU0R; - UAR_i = UAR + BIN_L * LUAR + BIN_W * WUAR + BIN_WL * PUAR; - UDR_i = UDR + BIN_L * LUDR + BIN_W * WUDR + BIN_WL * PUDR; - UCSR_i = UCSR + BIN_L * LUCSR + BIN_W * WUCSR + BIN_WL * PUCSR; - UCR_i = UCR + BIN_L * LUCR + BIN_W * WUCR + BIN_WL * PUCR; - PCLMR_i = PCLMR + BIN_L * LPCLMR + BIN_W * WPCLMR + BIN_WL * PPCLMR; - PDIBLCR_i = PDIBLCR + BIN_L * LPDIBLCR + BIN_W * WPDIBLCR + BIN_WL * PPDIBLCR; - VSATR_i = VSATR + BIN_L * LVSATR + BIN_W * WVSATR + BIN_WL * PVSATR; - PSATR_i = PSATR + BIN_L * LPSATR + BIN_W * WPSATR + BIN_WL * PPSATR; - PTWGR_i = PTWGR + BIN_L * LPTWGR + BIN_W * WPTWGR + BIN_WL * PPTWGR; - end - - // Geometrical scaling - T0y = NDEPL1 * max(pow(Inv_L, NDEPLEXP1) - pow(Inv_Llong, NDEPLEXP1), 0.0) + NDEPL2 * max(pow(Inv_L, NDEPLEXP2) - pow(Inv_Llong, NDEPLEXP2), 0.0); - T1y = NDEPW * max(pow(Inv_W, NDEPWEXP) - pow(Inv_Wwide, NDEPWEXP), 0.0) + NDEPWL * pow(Inv_W * Inv_L, NDEPWLEXP); - NDEP_i = NDEP_i * (1.0 + T0y + T1y); - T0y = NFACTORL * max( pow(Inv_L, NFACTORLEXP) - pow(Inv_Llong, NFACTORLEXP), 0.0); - T1y = NFACTORW * max( pow(Inv_W, NFACTORWEXP) - pow(Inv_Wwide, NFACTORWEXP), 0.0) + NFACTORWL * pow(Inv_WL, NFACTORWLEXP); - NFACTOR_i = NFACTOR_i * (1.0 + T0y + T1y); - T0y = (1.0 + CDSCDL * max(pow(Inv_L, CDSCDLEXP) - pow(Inv_Llong, CDSCDLEXP), 0.0)); - CDSCD_i = CDSCD_i * T0y; - if (ASYMMOD != 0) begin - CDSCDR_i = CDSCDR_i * T0y; - end - CDSCB_i = CDSCB_i * (1.0 + CDSCBL * max(pow(Inv_L, CDSCBLEXP) - pow(Inv_Llong, CDSCBLEXP), 0.0)); - U0_i = MULU0 * U0_i; - if (MOBSCALE != 1) begin - if (U0LEXP > 0.0) begin - U0_i = U0_i * (1.0 - U0L * max(pow(Inv_L, U0LEXP) - pow(Inv_Llong, U0LEXP), 0.0)); - if (ASYMMOD != 0) begin - U0R_i = U0R_i * (1.0 - U0L * max(pow(Inv_L, U0LEXP) - pow(Inv_Llong, U0LEXP), 0.0)); - end - end else begin - U0_i = U0_i * (1.0 - U0L); - if (ASYMMOD != 0) begin - U0R_i = U0R_i * (1.0 - U0L); - end - end - end else begin - U0_i = U0_i * (1.0 - (UP1 * lexp(-Leff / LP1)) - (UP2 * lexp(-Leff / LP2))); - if (ASYMMOD != 0) begin - U0R_i = U0R_i * (1.0 - (UP1 * lexp(-Leff / LP1)) - (UP2 * lexp(-Leff / LP2))); - end - end - T0y = UAL * max(pow(Inv_L, UALEXP) - pow(Inv_Llong, UALEXP), 0.0); - T1y = UAW * max(pow(Inv_W, UAWEXP) - pow(Inv_Wwide, UAWEXP), 0.0) + UAWL * pow(Inv_WL, UAWLEXP); - UA_i = UA_i * (1.0 + T0y + T1y); - if (ASYMMOD != 0) begin - UAR_i = UAR_i * (1.0 + T0y + T1y); - end - T0y = EUL * max(pow(Inv_L, EULEXP) - pow(Inv_Llong, EULEXP), 0.0); - T1y = EUW * max(pow(Inv_W, EUWEXP) - pow(Inv_Wwide, EUWEXP), 0.0) + EUWL * pow(Inv_WL, EUWLEXP); - EU_i = EU_i * (1.0 + T0y + T1y); - T0y = 1.0 + UDL * max(pow(Inv_L, UDLEXP) - pow(Inv_Llong, UDLEXP), 0.0); - UD_i = UD_i * T0y; - if (ASYMMOD != 0) begin - UDR_i = UDR_i * T0y; - end - T0y = UCL * max(pow(Inv_L, UCLEXP) - pow(Inv_Llong, UCLEXP), 0.0); - T1y = UCW * max(pow(Inv_W, UCWEXP) - pow(Inv_Wwide, UCWEXP), 0.0) + UCWL * pow(Inv_WL, UCWLEXP); - UC_i = UC_i * (1.0 + T0y + T1y); - if (ASYMMOD != 0) begin - UCR_i = UCR_i * (1.0 + T0y + T1y); - end - T0y = max(pow(Inv_L, DSUB) - pow(Inv_Llong, DSUB), 0.0); - ETA0_i = ETA0_i * T0y; - if (ASYMMOD != 0) begin - ETA0R_i = ETA0R_i * T0y; - end - ETAB_i = ETAB_i * max(pow(Inv_L, ETABEXP) - pow(Inv_Llong, ETABEXP), 0.0); - T0y = 1.0 + PDIBLCL * max(pow(Inv_L, PDIBLCLEXP) - pow(Inv_Llong, PDIBLCLEXP), 0.0); - PDIBLC_i = PDIBLC_i * T0y; - if (ASYMMOD != 0) begin - PDIBLCR_i = PDIBLCR_i * T0y; - end - T0y = DELTA_i * (1.0 + DELTAL * max(pow(Inv_L, DELTALEXP) - pow(Inv_Llong, DELTALEXP), 0.0)); - DELTA_i = min(T0y, 0.5); - FPROUT_i = FPROUT_i * (1.0 + FPROUTL * max(pow(Inv_L, FPROUTLEXP) - pow(Inv_Llong, FPROUTLEXP), 0.0)); - T0y = (1.0 + PCLML * max(pow(Inv_L, PCLMLEXP) - pow(Inv_Llong, PCLMLEXP), 0.0)); - PCLM_i = PCLM_i * T0y; - PCLM_i = max(PCLM_i, 0.0); - if (ASYMMOD != 0) begin - PCLMR_i = PCLMR_i * T0y; - PCLMR_i = max(PCLMR_i, 0.0); - end - T0y = VSATL * max(pow(Inv_L, VSATLEXP) - pow(Inv_Llong, VSATLEXP), 0.0); - T1y = VSATW * max(pow(Inv_W, VSATWEXP) - pow(Inv_Wwide, VSATWEXP), 0.0) + VSATWL * pow(Inv_WL, VSATWLEXP); - VSAT_i = VSAT_i * (1.0 + T0y + T1y); - if (ASYMMOD != 0) begin - VSATR_i = VSATR_i * (1.0 + T0y + T1y); - end - PSAT_i = max(PSAT_i * (1.0 + PSATL * max(pow(Inv_L, PSATLEXP) - pow(Inv_Llong, PSATLEXP), 0.0)), 0.25); - if (ASYMMOD != 0) begin - PSATR_i = max(PSATR_i * (1.0 + PSATL * max(pow(Inv_L, PSATLEXP) - pow(Inv_Llong, PSATLEXP), 0.0)), 0.25); - end - T0y = (1.0 + PTWGL * max(pow(Inv_L, PTWGLEXP) - pow(Inv_Llong, PTWGLEXP), 0.0)); - PTWG_i = PTWG_i * T0y; - if (ASYMMOD != 0) begin - PTWGR_i = PTWGR_i * T0y; - end - ALPHA0_i = ALPHA0_i * (1.0 + ALPHA0L * max(pow(Inv_L, ALPHA0LEXP) - pow(Inv_Llong, ALPHA0LEXP), 0.0)); - AGIDL_i = AGIDL_i * (1.0 + AGIDLL * Inv_L + AGIDLW * Inv_W); - AGISL_i = AGISL_i * (1.0 + AGISLL * Inv_L + AGISLW * Inv_W); - AIGC_i = AIGC_i * (1.0 + AIGCL * Inv_L + AIGCW * Inv_W); - AIGS_i = AIGS_i * (1.0 + AIGSL * Inv_L + AIGSW * Inv_W); - AIGD_i = AIGD_i * (1.0 + AIGDL * Inv_L + AIGDW * Inv_W); - PIGCD_i = PIGCD * (1.0 + PIGCDL * Inv_L); - T0y = NDEPCVL1 * max(pow(Inv_Lact, NDEPCVLEXP1) - pow(Inv_Llong, NDEPCVLEXP1), 0.0) + NDEPCVL2 * max( pow(Inv_Lact, NDEPCVLEXP2) - pow(Inv_Llong, NDEPCVLEXP2), 0.0); - T1y = NDEPCVW * max(pow(Inv_Wact, NDEPCVWEXP) - pow(Inv_Wwide, NDEPCVWEXP), 0.0) + NDEPCVWL * pow(Inv_Wact * Inv_Lact, NDEPCVWLEXP); - NDEPCV_i = NDEPCV_i * (1.0 + T0y + T1y); - T0y = VFBCVL * max(pow(Inv_Lact, VFBCVLEXP) - pow(Inv_Llong, VFBCVLEXP), 0.0); - T1y = VFBCVW * max(pow(Inv_Wact, VFBCVWEXP) - pow(Inv_Wwide, VFBCVWEXP), 0.0) + VFBCVWL * pow(Inv_WL, VFBCVWLEXP); - VFBCV_i = VFBCV_i * (1.0 + T0y + T1y); - T0y = VSATCVL * max(pow(Inv_Lact, VSATCVLEXP) - pow(Inv_Llong, VSATCVLEXP), 0.0); - T1y = VSATCVW * max(pow(Inv_W, VSATCVWEXP) - pow(Inv_Wwide, VSATCVWEXP), 0.0) + VSATCVWL * pow(Inv_WL, VSATCVWLEXP); - VSATCV_i = VSATCV_i * (1.0 + T0y + T1y); - PCLMCV_i = PCLMCV_i * (1.0 + PCLMCVL * max(pow(Inv_Lact, PCLMCVLEXP) - pow(Inv_Llong, PCLMCVLEXP), 0.0)); - PCLMCV_i = max(PCLMCV_i, 0.0); - T0y = K1L * max(pow(Inv_L, K1LEXP) - pow(Inv_Llong, K1LEXP), 0.0); - T1y = K1W * max(pow(Inv_W, K1WEXP) - pow(Inv_Wwide, K1WEXP), 0.0) + K1WL * pow(Inv_WL, K1WLEXP); - K1_i = K1_i * (1.0 + T0y + T1y); - T0y = K2L * max(pow(Inv_L, K2LEXP) - pow(Inv_Llong, K2LEXP), 0.0); - T1y = K2W * max(pow(Inv_W, K2WEXP) - pow(Inv_Wwide, K2WEXP), 0.0) + K2WL * pow(Inv_WL, K2WLEXP); - K2_i = K2_i * (1.0 + T0y + T1y); - PRWB_i = PRWB_i * (1.0 + PRWBL * max( pow(Inv_L, PRWBLEXP) - pow(Inv_Llong, PRWBLEXP), 0)); - - // Global scaling parameters for temperature - UTE_i = UTE_i * (1.0 + Inv_L * UTEL); - UA1_i = UA1_i * (1.0 + Inv_L * UA1L); - UD1_i = UD1_i * (1.0 + Inv_L * UD1L); - AT_i = AT_i * (1.0 + Inv_L * ATL); - PTWGT_i = PTWGT_i * (1.0 + Inv_L * PTWGTL); - if ($port_connected(t) == 0) begin - if (SHMOD == 0 || RTH0 == 0.0) begin - Temp(t) <+ 0.0; - end else begin - $strobe("5 terminal Module, while 't' node is not connected, SH is activated."); - end - end - if (RDSMOD == 1) begin - RSW_i = RSW_i * (1.0 + RSWL * max(pow(Inv_L, RSWLEXP) - pow(Inv_Llong, RSWLEXP), 0.0)); - RDW_i = RDW_i * (1.0 + RDWL * max(pow(Inv_L, RDWLEXP) - pow(Inv_Llong, RDWLEXP), 0.0)); - end else begin - RDSW_i = RDSW_i * (1.0 + RDSWL * max(pow(Inv_L, RDSWLEXP) - pow(Inv_Llong, RDSWLEXP), 0.0)); - end - - // Parameter checking - if (UCS_i < 1.0) begin - UCS_i = 1.0; - end else if (UCS_i > 2.0) begin - UCS_i = 2.0; - end - if (ASYMMOD != 0) begin - if (UCSR_i < 1.0) begin - UCSR_i = 1.0; - end else if (UCSR_i > 2.0) begin - UCSR_i = 2.0; - end - end - if (CGIDL_i < 0.0) begin - $strobe("Fatal: CGIDL_i = %e is negative.", CGIDL_i); - $finish(0); - end - if (CGISL_i < 0.0) begin - $strobe("Fatal: CGISL_i = %e is negative.", CGISL_i); - $finish(0); - end - if (CKAPPAD_i <= 0.0) begin - $strobe("Fatal: CKAPPAD_i = %e is non-positive.", CKAPPAD_i); - $finish(0); - end - if (CKAPPAS_i <= 0.0) begin - $strobe("Fatal: CKAPPAS_i = %e is non-positive.", CKAPPAS_i); - $finish(0); - end - if (PDITS_i < 0.0) begin - $strobe("Fatal: PDITS_i = %e is negative.", PDITS_i); - $finish(0); - end - if (CIT_i < 0.0) begin - $strobe("Fatal: CIT_i = %e is negative.", CIT_i); - $finish(0); - end - if (NFACTOR_i < 0.0) begin - $strobe("Fatal: NFACTOR_i = %e is negative.", NFACTOR_i); - $finish(0); - end - if (K1_i < 0.0) begin - $strobe("Fatal: K1_i = %e is negative.", K1_i); - $finish(0); - end - - if (NSD_i <= 0.0) begin - $strobe("Fatal: NSD_i = %e is non-positive.", NSD_i); - $finish(0); - end - if (NDEP_i <= 0.0) begin - $strobe("Fatal: NDEP_i = %e is non-positive.", NDEP_i); - $finish(0); - end - if (NDEPCV_i <= 0.0) begin - $strobe("Fatal: NDEPCV_i = %e is non-positive.", NDEPCV_i); - $finish(0); - end - if (IGBMOD != 0) begin - if (NIGBINV_i <= 0.0) begin - $strobe("Fatal: NIGBINV_i = %e is non-positive.", NIGBINV_i); - $finish(0); - end - if (NIGBACC_i <= 0.0) begin - $strobe("Fatal: NIGBACC_i = %e is non-positive.", NIGBACC_i); - $finish(0); - end - end - if (IGCMOD != 0) begin - if (POXEDGE_i <= 0.0) begin - $strobe("Fatal: POXEDGE_i = %e is non-positive.", POXEDGE_i); - $finish(0); - end - end - if (CDSCD_i < 0.0) begin - $strobe("Fatal: CDSCD_i = %e is negative.", CDSCD_i); - $finish(0); - end - if (ASYMMOD != 0) begin - if (CDSCDR_i < 0.0) begin - $strobe("Fatal: CDSCDR_i = %e is negative.", CDSCDR_i); - $finish(0); - end - end - if (DLCIG_i < 0.0) begin - $strobe("Warning: DLCIG = %e is negative, setting it to 0.", DLCIG_i); - DLCIG_i = 0.0; - end - if (DLCIGD_i < 0.0) begin - $strobe("Warning: DLCIGD = %e is negative, setting it to 0.", DLCIGD_i); - DLCIGD_i = 0.0; - end - if (M0_i < 0.0) begin - $strobe("Warning: M0_i = %e is negative, setting it to 0.", M0_i); - M0_i = 0.0; - end - - // Initialize variables used in geometry macros - nuEndD = 0.0; nuEndS = 0.0; nuIntD = 0.0; nuIntS = 0.0; Rend = 0.0; Rint = 0.0; - - // Process drain series resistance - DMCGeff = DMCG - DMCGT; - DMCIeff = DMCI; - DMDGeff = DMDG - DMCGT; - - // Processing S/D resistance and conductance below - if($param_given(NRS)) begin - RSourceGeo = RSH * NRS; - end else if (RGEOMOD > 0 && RSH > 0.0) begin - `BSIMBULKRdseffGeo(NF, GEOMOD, RGEOMOD, MINZ, Weff, RSH, DMCGeff, DMCIeff, DMDGeff, 1, RSourceGeo) - end else begin - RSourceGeo = 0.0; - end - - if ($param_given(NRD)) begin - RDrainGeo = RSH * NRD; - end else if (RGEOMOD > 0 && RSH > 0.0) begin - `BSIMBULKRdseffGeo(NF, GEOMOD, RGEOMOD, MINZ, Weff, RSH, DMCGeff, DMCIeff, DMDGeff, 0, RDrainGeo) - end else begin - RDrainGeo = 0.0; - end - - // Clamping of source/drain resistances - if (RSourceGeo <= 1.0e-3) begin - RSourceGeo = 1.0e-3; - end - if (RDrainGeo <= 1.0e-3) begin - RDrainGeo = 1.0e-3; - end - - if (RDSMOD == 1) begin - if (RSWMIN_i <= 0.0) begin - RSWMIN_i = 0.0; - end - if (RDWMIN_i <= 0.0) begin - RDWMIN_i = 0.0; - end - if (RSW_i <= 0.0) begin - RSW_i = 0.0; - end - if (RDW_i <= 0.0) begin - RDW_i = 0.0; - end - end else begin - if (RDSWMIN_i <= 0.0) begin - RDSWMIN_i = 0.0; - end - if (RDSW_i <= 0.0) begin - RDSW_i = 0.0; - end - end - - // Body resistance network - Grbsb = 0.0; - Grbdb = 0.0; - Grbpb = 0.0; - Grbps = 0.0; - Grbpd = 0.0; - if (RBODYMOD != 0) begin - Lnl = lln(Leff * 1.0e6); - Lnw = lln(Weff * 1.0e6); - Lnnf = lln(NF); - Bodymode = 5; - Rbpb = RBPB; - Rbpd = RBPD; - Rbps = RBPS; - Rbdb = RBDB; - Rbsb = RBSB; - if (!$param_given(RBPS0) || !$param_given(RBPD0)) begin - Bodymode = 1; - end - else if (!$param_given(RBSBX0) && !$param_given(RBSBY0) || !$param_given(RBDBX0) && !$param_given(RBDBY0)) begin - Bodymode = 3; - end - if (RBODYMOD == 2) begin - if (Bodymode == 5) begin - Rbsbx = RBSBX0 * lexp(RBSDBXL * Lnl + RBSDBXW * Lnw + RBSDBXNF * Lnnf); - Rbsby = RBSBY0 * lexp(RBSDBYL * Lnl + RBSDBYW * Lnw + RBSDBYNF * Lnnf); - Rbsb = Rbsbx * Rbsby / (Rbsbx + Rbsby); - Rbdbx = RBDBX0 * lexp(RBSDBXL * Lnl + RBSDBXW * Lnw + RBSDBXNF * Lnnf); - Rbdby = RBDBY0 * lexp(RBSDBYL * Lnl + RBSDBYW * Lnw + RBSDBYNF * Lnnf); - Rbdb = Rbdbx * Rbdby / (Rbdbx + Rbdby); - end - if (Bodymode == 3 || Bodymode == 5) begin - Rbps = RBPS0 * lexp(RBPSL * Lnl + RBPSW * Lnw + RBPSNF * Lnnf); - Rbpd = RBPD0 * lexp(RBPDL * Lnl + RBPDW * Lnw + RBPDNF * Lnnf); - end - Rbpbx = RBPBX0 * lexp(RBPBXL * Lnl + RBPBXW * Lnw + RBPBXNF * Lnnf); - Rbpby = RBPBY0 * lexp(RBPBYL * Lnl + RBPBYW * Lnw + RBPBYNF * Lnnf); - Rbpb = Rbpbx * Rbpby / (Rbpbx + Rbpby); - end - if (RBODYMOD == 1 || (RBODYMOD == 2 && Bodymode == 5)) begin - if (Rbdb < 1.0e-3) begin - Grbdb = 1.0e3; // in mho - end else begin - Grbdb = GBMIN + 1.0 / Rbdb; - end - if (Rbpb < 1.0e-3) begin - Grbpb = 1.0e3; - end else begin - Grbpb = GBMIN + 1.0 / Rbpb; - end - if (Rbps < 1.0e-3) begin - Grbps = 1.0e3; - end else begin - Grbps = GBMIN + 1.0 / Rbps; - end - if (Rbsb < 1.0e-3) begin - Grbsb = 1.0e3; - end else begin - Grbsb = GBMIN + 1.0 / Rbsb; - end - if (Rbpd < 1.0e-3) begin - Grbpd = 1.0e3; - end else begin - Grbpd = GBMIN + 1.0 / Rbpd; - end - end else if (RBODYMOD == 2 && Bodymode == 3) begin - Grbdb = GBMIN; - Grbsb = GBMIN; - if (Rbpb < 1.0e-3) begin - Grbpb = 1.0e3; - end else begin - Grbpb = GBMIN + 1.0 / Rbpb; - end - if (Rbps < 1.0e-3) begin - Grbps = 1.0e3; - end else begin - Grbps = GBMIN + 1.0 / Rbps; - end - if (Rbpd < 1.0e-3) begin - Grbpd = 1.0e3; - end else begin - Grbpd = GBMIN + 1.0 / Rbpd; - end - end else if (RBODYMOD == 2 && Bodymode == 1) begin - Grbdb = GBMIN; - Grbsb = GBMIN; - Grbps = 1.0e3; - Grbpd = 1.0e3; - if (Rbpb < 1.0e-3) begin - Grbpb = 1.0e3; - end else begin - Grbpb = GBMIN + 1.0 / Rbpb; - end - end - end - - // Gate process resistance - Grgeltd = RSHG * (XGW + Weffcj / 3.0 / NGCON) / (NGCON * NF * (Lnew - XGL)); - if (Grgeltd > 0.0) begin - Grgeltd = 1.0 / Grgeltd; - end else begin - Grgeltd = 1.0e3; - if (RGATEMOD != 0) begin - `STROBE("Warning: (instance BSIMBULK) The gate conductance reset to 1.0e3 mho."); - end - end - T0y = TOXE * TOXE; - T1y = TOXE * POXEDGE_i; - T2y = T1y * T1y; - ToxRatio = lexp(NTOX_i * lln(TOXREF / TOXE)) / T0y; - ToxRatioEdge = lexp(NTOX_i * lln(TOXREF / T1y)) / T2y; - Aechvb = (TYPE == `ntype) ? 4.97232e-7 : 3.42537e-7; - Bechvb = (TYPE == `ntype) ? 7.45669e11 : 1.16645e12; - AechvbEdge = Aechvb * Weff * ToxRatioEdge; - BechvbEdge = -Bechvb * TOXE * POXEDGE_i; - Aechvb = Aechvb * (Weff * Leff * ToxRatio); - Bechvb = -Bechvb * TOXE; - Weff_SH = WTH0 + Weff; - - // Parameters for self-heating - if((SHMOD != 0) && (RTH0 > 0.0) && (Weff_SH > 0.0)) begin - gth = Weff_SH * NF / RTH0; - cth = CTH0 * Weff_SH * NF; - end else begin - // set gth to some value to prevent a singular G matrix - gth = 1.0; - cth = 0.0; - end - - // Temperature Dependent Calculations Begin Here - if (TNOM <= -`P_CELSIUS0) begin - T0 = `REFTEMP - `P_CELSIUS0; - $strobe("Warning: TNOM = %e C <= %e C. Setting TNOM to %e C.", TNOM, -`P_CELSIUS0, T0); - Tnom = `REFTEMP; - end else begin - Tnom = TNOM + `P_CELSIUS0; - end - DevTemp = $temperature + DTEMP; - - // Calculate temperature dependent values for self-heating effect - if ((SHMOD != 0) && (RTH0 > 0.0) && (Weff_SH > 0.0)) begin - delTemp1 = Temp(t); - end else begin - delTemp1 = 0.0; - end - DevTemp = delTemp1 + DevTemp; - T_DELTA_SH = Temp(t); - T_TOTAL_K = DevTemp; - T_TOTAL_C = DevTemp - `P_CELSIUS0; - Vt = `KboQ * DevTemp; - inv_Vt = 1.0 / Vt; - TRatio = DevTemp / Tnom; - delTemp = DevTemp - Tnom; - Vtm = `KboQ * DevTemp; - Vtm0 = `KboQ * Tnom; - Eg = BG0SUB - TBGASUB * DevTemp * DevTemp / (DevTemp + TBGBSUB); - Eg0 = BG0SUB - TBGASUB * Tnom * Tnom / (Tnom + TBGBSUB); - T1 = (DevTemp / Tnom) * sqrt(DevTemp / Tnom); - ni = NI0SUB * T1 * lexp(Eg / (2.0 * Vtm0) - Eg / (2.0 * Vtm)); - if ((SHMOD != 0) && (RTH0 > 0.0) && (Weff_SH > 0.0)) begin - T0 = lln(NDEP_i / ni); - phib = sqrt(T0 * T0 + 1.0e-6); - end else begin - phib = lln(NDEP_i / ni); - end - if ((SHMOD != 0) && (RTH0 > 0.0) && (Weff_SH > 0.0)) begin - T0 = lln(NDEP_i * NSD_i / (ni * ni)); - Vbi = sqrt(T0 * T0 + 1.0e-6); - end else begin - Vbi = lln(NDEP_i * NSD_i / (ni * ni)); - end - if (NGATE_i > 0.0) begin - Vfbsdr = -devsign * Vt * lln(NGATE_i / NSD_i) + VFBSDOFF; - end else begin - Vfbsdr = 0.0; - end - - // Short channel effects - Phist = max(0.4 + Vt * phib + PHIN_i, 0.4); - sqrtPhist = sqrt(Phist); - T1DEP = sqrt(2.0 * epssi / (`q * NDEP_i)); - litl = sqrt((epssi / epsox) * TOXE * XJ_i); - NFACTOR_t = NFACTOR_i * hypsmooth((1.0 + TNFACTOR * (TRatio - 1.0)), 1e-3); - ETA0_t = ETA0_i * (1.0 + TETA0 * (TRatio - 1.0)); - if (ASYMMOD != 0) begin - ETA0R_t = ETA0R_i * (1.0 + TETA0 * (TRatio - 1.0)); - end - - // Mobility degradation - eta_mu = (TYPE != `ntype) ? (`Oneby3 * ETAMOB) : (0.5 * ETAMOB); - U0_t = U0_i * pow(TRatio, UTE_i); - UA_t = UA_i * hypsmooth(1.0 + UA1_i * delTemp - 1.0e-6, 1.0e-3); - UC_t = UC_i * hypsmooth(1.0 + UC1_i * delTemp - 1.0e-6, 1.0e-3); - UD_t = UD_i * pow(TRatio, UD1_i); - UCS_t = UCS_i * pow(TRatio, UCSTE_i); - if (ASYMMOD != 0) begin - U0R_t = U0R_i * pow(TRatio, UTE_i); - UAR_t = UAR_i * hypsmooth(1.0 + UA1_i * delTemp - 1.0e-6, 1.0e-3); - UCR_t = UCR_i * hypsmooth(1.0 + UC1_i * delTemp - 1.0e-6, 1.0e-3); - UDR_t = UDR_i * pow(TRatio, UD1_i); - UCSR_t = UCSR_i * pow(TRatio, UCSTE_i); - end - rdstemp = pow(TRatio, PRT_i); - VSAT_t = VSAT_i * pow(TRatio, -AT_i); - if (VSAT_t < 100.0) begin - $strobe("Warning: VSAT(%f) = %e is less than 100, setting it to 100.", DevTemp, VSAT_t); - VSAT_t = 100.0; - end - if (ASYMMOD != 0) begin - VSATR_t = VSATR_i * pow(TRatio, -AT_i); - if (VSATR_t < 100.0) begin - $strobe("Warning: VSATR(%f) = %e is less than 100, setting it to 100.", DevTemp, VSATR_t); - VSATR_t = 100.0; - end - end - VSATCV_t = VSATCV_i * pow(TRatio, -AT_i); - if (VSATCV_t < 100.0) begin - $strobe("Warning: VSATCV(%f) = %e is less than 100, setting it to 100.", DevTemp, VSATCV_t); - VSATCV_t = 100.0; - end - DELTA_t = 1.0 / ( hypsmooth((1.0 / DELTA_i) * (1.0 + TDELTA * delTemp) - 2.0 , 1.0e-3) + 2.0); - PTWG_t = PTWG_i * hypsmooth(1.0 - PTWGT_i * delTemp - 1.0e-6, 1.0e-3); - if (ASYMMOD != 0) begin - PTWGR_t = PTWGR_i * hypsmooth(1.0 - PTWGT_i * delTemp - 1.0e-6, 1.0e-3); - end - A1_t = A1_i * hypsmooth(1.0 + A11_i * delTemp - 1.0e-6, 1.0e-3); - A2_t = A2_i * hypsmooth(1.0 + A21_i * delTemp - 1.0e-6, 1.0e-3); - BETA0_t = BETA0_i * pow(TRatio, IIT_i); - BGIDL_t = BGIDL_i * hypsmooth(1.0 + TGIDL_i * delTemp - 1.0e-6, 1.0e-3); - BGISL_t = BGISL_i * hypsmooth(1.0 + TGIDL_i * delTemp - 1.0e-6, 1.0e-3); - igtemp = lexp(IGT_i * lln(TRatio)); - K0_t = K0_i * hypsmooth(1.0 + K01_i * delTemp - 1.0e-6, 1.0e-3); - M0_t = M0_i * hypsmooth(1.0 + M01_i * delTemp - 1.0e-6, 1.0e-3); - - // Diode Model temperature Code Start - CJS_t = CJS * hypsmooth(1.0 + TCJ * delTemp - 1.0e-6, 1.0e-3); - CJD_t = CJD * hypsmooth(1.0 + TCJ * delTemp - 1.0e-6, 1.0e-3); - CJSWS_t = CJSWS * hypsmooth(1.0 + TCJSW * delTemp - 1.0e-6, 1.0e-3); - CJSWD_t = CJSWD * hypsmooth(1.0 + TCJSW * delTemp - 1.0e-6, 1.0e-3); - CJSWGS_t = CJSWGS * hypsmooth(1.0 + TCJSWG * delTemp - 1.0e-6, 1.0e-3); - CJSWGD_t = CJSWGD * hypsmooth(1.0 + TCJSWG * delTemp - 1.0e-6, 1.0e-3); - PBS_t = hypsmooth(PBS - TPB * delTemp - 0.01, 1.0e-3) + 0.01; - PBD_t = hypsmooth(PBD - TPB * delTemp - 0.01, 1.0e-3) + 0.01; - PBSWS_t = hypsmooth(PBSWS - TPBSW * delTemp - 0.01, 1.0e-3) + 0.01; - PBSWD_t = hypsmooth(PBSWD - TPBSW * delTemp - 0.01, 1.0e-3) + 0.01; - PBSWGS_t = hypsmooth(PBSWGS - TPBSWG * delTemp - 0.01, 1.0e-3) + 0.01; - PBSWGD_t = hypsmooth(PBSWGD - TPBSWG * delTemp - 0.01, 1.0e-3) + 0.01; - T0 = Eg0 / Vtm0 - Eg / Vtm; - T1 = lln(TRatio); - T3 = lexp((T0 + XTIS * T1) / NJS); - JSS_t = JSS * T3; - JSWS_t = JSWS * T3; - JSWGS_t = JSWGS * T3; - T3 = lexp((T0 + XTID * T1) / NJD); - JSD_t = JSD * T3; - JSWD_t = JSWD * T3; - JSWGD_t = JSWGD * T3; - JTSS_t = JTSS * lexp(Eg0 * XTSS * (TRatio - 1.0) / Vtm); - JTSSWS_t = JTSSWS * lexp(Eg0 * XTSSWS * (TRatio - 1.0) / Vtm); - JTSSWGS_t = JTSSWGS * (sqrt(JTWEFF / Weffcj) + 1.0) * lexp(Eg0 * XTSSWGS * (TRatio - 1) / Vtm); - JTSD_t = JTSD * lexp(Eg0 * XTSD * (TRatio - 1.0) / Vtm); - JTSSWD_t = JTSSWD * lexp(Eg0 * XTSSWD * (TRatio - 1.0) / Vtm); - JTSSWGD_t = JTSSWGD * (sqrt(JTWEFF / Weffcj) + 1.0) * lexp(Eg0 * XTSSWGD * (TRatio - 1) / Vtm); - - // All NJT*'s smoothed to 0.01 to prevent divide by zero / negative values - NJTS_t = hypsmooth(NJTS * (1.0 + TNJTS * (TRatio - 1.0)) - 0.01, 1.0e-3) + 0.01; - NJTSSW_t = hypsmooth(NJTSSW * (1.0 + TNJTSSW * (TRatio - 1.0)) - 0.01, 1.0e-3) + 0.01; - NJTSSWG_t = hypsmooth(NJTSSWG * (1.0 + TNJTSSWG * (TRatio - 1.0)) - 0.01, 1.0e-3) + 0.01; - NJTSD_t = hypsmooth(NJTSD * (1.0 + TNJTSD * (TRatio - 1.0)) - 0.01, 1.0e-3) + 0.01; - NJTSSWD_t = hypsmooth(NJTSSWD * (1.0 + TNJTSSWD * (TRatio - 1.0)) - 0.01, 1.0e-3) + 0.01; - NJTSSWGD_t = hypsmooth(NJTSSWGD * (1.0 + TNJTSSWGD * (TRatio - 1.0)) - 0.01, 1.0e-3) + 0.01; - - // Effective Source/Drain junction area and perimeter - `BSIMBULKPAeffGeo(NF, GEOMOD, MINZ, Weffcj, DMCGeff, DMCIeff, DMDGeff, temp_PSeff, temp_PDeff, temp_ASeff, temp_ADeff) - if ($param_given(AS)) begin - ASeff = AS * WMLT * LMLT; - end else begin - ASeff = temp_ASeff; - end - if (ASeff < 0.0) begin - $strobe("Warning: (instance BSIMBULK) ASeff = %e is negative, set to zero.", ASeff); - ASeff = 0.0; - end - if ($param_given(AD)) begin - ADeff = AD * WMLT * LMLT; - end else begin - ADeff = temp_ADeff; - end - if (ADeff < 0.0) begin - $strobe("Warning: (instance BSIMBULK) ADeff = %e is negative, set to zero.", ADeff); - ADeff = 0.0; - end - if ($param_given(PS)) begin - if (PERMOD == 0) begin - // PS does not include gate-edge perimeter - PSeff = PS * WMLT; - end else begin - // PS includes gate-edge perimeter - PSeff = max(PS * WMLT - Weffcj * NF, 0.0); - end - end else begin - PSeff = temp_PSeff; - if (PSeff < 0.0) begin - $strobe("Warning: (instance BSIMBULK) PSeff = %e is negative.Set to 0.0", PSeff); - PSeff = 0.0; - end - end - if ($param_given(PD)) begin - if (PERMOD == 0) begin - // PD does not include gate-edge perimeter - PDeff = PD * WMLT; - end else begin - // PD includes gate-edge perimeter - PDeff = max(PD * WMLT - Weffcj * NF, 0.0); - end - end else begin - PDeff = temp_PDeff; - if (PDeff < 0.0) begin - $strobe("Warning: (instance BSIMBULK) PDeff = %e is negative.Set to 0.0", PDeff); - PDeff = 0.0; - end - end - Isbs = ASeff * JSS_t + PSeff * JSWS_t + Weffcj * NF * JSWGS_t; - if (Isbs > 0.0) begin - Nvtms = Vtm * NJS; - XExpBVS = lexp(-BVS / Nvtms) * XJBVS; - T2 = max(IJTHSFWD / Isbs, 10.0); - Tb = 1.0 + T2 - XExpBVS; - VjsmFwd = Nvtms * lln(0.5 * (Tb + sqrt(Tb * Tb + 4.0 * XExpBVS))); - T0 = lexp(VjsmFwd / Nvtms); - IVjsmFwd = Isbs * (T0 - XExpBVS / T0 + XExpBVS - 1.0); - SslpFwd = Isbs * (T0 + XExpBVS / T0) / Nvtms; - T2 = hypsmooth(IJTHSREV / Isbs - 10.0, 1.0e-3) + 10.0; - VjsmRev = -BVS - Nvtms * lln((T2 - 1.0) / XJBVS); - T1 = XJBVS * lexp(-(BVS + VjsmRev) / Nvtms); - IVjsmRev = Isbs * (1.0 + T1); - SslpRev = -Isbs * T1 / Nvtms; - end else begin - Nvtms = 0.0; - XExpBVS = 0.0; - VjsmFwd = 0.0; - IVjsmFwd = 0.0; - SslpFwd = 0.0; - VjsmRev = 0.0; - IVjsmRev = 0.0; - SslpRev = 0.0; - end - - // Drain-side junction current - Isbd = ADeff * JSD_t + PDeff * JSWD_t + Weffcj * NF * JSWGD_t; - if (Isbd > 0.0) begin - Nvtmd = Vtm * NJD; - XExpBVD = lexp(-BVD / Nvtmd) * XJBVD; - T2 = max(IJTHDFWD / Isbd, 10.0); - Tb = 1.0 + T2 - XExpBVD; - VjdmFwd = Nvtmd * lln(0.5 * (Tb + sqrt(Tb * Tb + 4.0 * XExpBVD))); - T0 = lexp(VjdmFwd / Nvtmd); - IVjdmFwd = Isbd * (T0 - XExpBVD / T0 + XExpBVD - 1.0); - DslpFwd = Isbd * (T0 + XExpBVD / T0) / Nvtmd; - T2 = hypsmooth(IJTHDREV / Isbd - 10.0, 1.0e-3) + 10.0; - VjdmRev = -BVD - Nvtmd * lln((T2 - 1.0) / XJBVD); - T1 = XJBVD * lexp(-(BVD + VjdmRev) / Nvtmd); - IVjdmRev = Isbd * (1.0 + T1); - DslpRev = -Isbd * T1 / Nvtmd; - end else begin - Nvtmd = 0.0; - XExpBVD = 0.0; - VjdmFwd = 0.0; - IVjdmFwd = 0.0; - DslpFwd = 0.0; - VjdmRev = 0.0; - IVjdmRev = 0.0; - DslpRev = 0.0; - end - - // STI stress equations - if((SA > 0.0) && (SB > 0.0) && ((NF == 1.0) || ((NF > 1.0) && (SD > 0.0)))) begin - T0 = pow(Lnew, LLODKU0); - W_tmp_stress = Wnew + WLOD; - T1 = pow(W_tmp_stress, WLODKU0); - tmp1_stress = LKU0 / T0 + WKU0 / T1 + PKU0 / (T0 * T1); - kstress_u0 = 1.0 + tmp1_stress; - T0 = pow(Lnew, LLODVTH); - T1 = pow(W_tmp_stress, WLODVTH); - tmp1_stress_vth = LKVTH0 / T0 + WKVTH0 / T1 + PKVTH0 / (T0 * T1); - kstress_vth0 = 1.0 + tmp1_stress_vth; - T0 = TRatio - 1.0; - ku0_temp = kstress_u0 * (1.0 + TKU0 * T0) + 1.0e-9; - i = 0; - while (i < NF) begin - T0 = 1.0 / NF / (SA + 0.5 * L_mult + i * (SD + L_mult)); - T1 = 1.0 / NF / (SB + 0.5 * L_mult + i * (SD + L_mult)); - Inv_sa = Inv_sa + T0; - Inv_sb = Inv_sb + T1; - i = i + 1; - end - Inv_saref = 1.0 / (SAREF + 0.5 * L_mult); - Inv_sbref = 1.0 / (SBREF + 0.5 * L_mult); - Inv_odref = Inv_saref + Inv_sbref; - rho_ref = (KU0 / ku0_temp) * Inv_odref; - Inv_od = Inv_sa + Inv_sb; - rho = (KU0 / ku0_temp) * Inv_od; - mu0_mult = (1.0 + rho) / (1.0 + rho_ref); - vsat_mult = (1.0 + rho * KVSAT) / (1.0 + rho_ref * KVSAT); - vth0_stress = (KVTH0 / kstress_vth0) * (Inv_od - Inv_odref); - k2_stress = (STK2 / pow(kstress_vth0, LODK2)) * (Inv_od - Inv_odref); - eta_stress = (STETA0 / pow(kstress_vth0, LODETA0)) * (Inv_od - Inv_odref); - U0_t = U0_t * mu0_mult; - VSAT_t = VSAT_t * vsat_mult; - K2_i = K2_i + k2_stress; - ETA0_t = ETA0_t + eta_stress; - if (EDGEFET == 1) begin - vth0_stress_EDGE = (KVTH0EDGE_i / kstress_vth0) * (Inv_od - Inv_odref); - k2_stress_EDGE = (STK2EDGE_i / pow(kstress_vth0, LODK2)) * (Inv_od - Inv_odref); - eta_stress_EDGE = (STETA0EDGE_i / pow(kstress_vth0, LODETA0)) * (Inv_od - Inv_odref); - end - K2_EDGE = K2EDGE_i + k2_stress_EDGE; - ETA0_EDGE = ETA0EDGE_i + eta_stress_EDGE; - end else begin - vth0_stress = 0.0; - vth0_stress_EDGE = 0.0; - end - - // Well proximity effect - if (WPEMOD == 1) begin - Wdrn = W / NF; - local_sca = SCA; - local_scb = SCB; - local_scc = SCC; - if (!$param_given(SCA) && !$param_given(SCB) && !$param_given(SCC)) begin - if($param_given(SC) && SC > 0.0) begin - T1 = SC + Wdrn; - T2 = 1.0 / SCREF; - local_sca = SCREF * SCREF / (SC * T1); - local_scb = ((0.1 * SC + 0.01 * SCREF) * lexp(-10.0 * SC * T2) - (0.1 * T1 + 0.01 * SCREF) * - lexp(-10.0 * T1 * T2)) / Wdrn; - local_scc = ((0.05 * SC + 0.0025 * SCREF) * lexp(-20.0 * SC * T2) - (0.05 * T1 + 0.0025 * SCREF) * - lexp(-20.0 * T1 * T2)) / Wdrn; - end else begin - `STROBE("Warning: (Instance BSIMBULK) No WPE as none of SCA, SCB, SCC, SC is given and/or SC not positive."); - end - end - end - vth0_well = KVTH0WE_i * (local_sca + WEB * local_scb + WEC * local_scc); - k2_well = K2WE_i * (local_sca + WEB * local_scb + WEC * local_scc); - mu_well = 1.0 + KU0WE_i * (local_sca + WEB * local_scb + WEC * local_scc); - U0_t = U0_t * mu_well; - K2_i = K2_i + k2_well; - - // Load Terminal Voltages - Vg = devsign * V(gi, bi); - Vd = devsign * V(di, bi); - Vs = devsign * V(si, bi); - Vds = Vd - Vs; - Vds_noswap = Vds; - Vsb_noswap = Vs; - Vdb_noswap = Vd; - Vbs_jct = devsign * V(sbulk, si); - Vbd_jct = devsign * V(dbulk, di); - Vgd_noswap = Vg - Vd; - Vgs_noswap = Vg - Vs; - Vgd_ov_noswap = devsign * V(gm, di); - Vgs_ov_noswap = devsign * V(gm, si); - - // Terminal voltage conditioning - // Source-drain interchange - sigvds = 1.0; - if (Vds < 0.0) begin - sigvds = -1.0; - Vd = devsign * V(si, bi); - Vs = devsign * V(di, bi); - end - Vds = Vd - Vs; - T0 = AVDSX * Vds; - if (T0 > `EXPL_THRESHOLD) begin - T1 = T0; - end else begin - T1 = ln(1.0 + exp(T0)); - end - Vdsx = ((2.0/AVDSX) * T1) - Vds - ((2.0/AVDSX) * ln(2.0)); - Vbsx = -(Vs + 0.5 * (Vds - Vdsx)); - - // Asymmetry model - T0 = tanh(0.6 * Vds_noswap / Vtm); - wf = 0.5 + 0.5 * T0; - wr = 1.0 - wf; - if (ASYMMOD != 0) begin - CDSCD_a = CDSCDR_i * wr + CDSCD_i * wf; - ETA0_a = ETA0R_t * wr + ETA0_t * wf; - PDIBLC_a = PDIBLCR_i * wr + PDIBLC_i * wf; - PCLM_a = PCLMR_i * wr + PCLM_i * wf; - PSAT_a = PSATR_i * wr + PSAT_i * wf; - VSAT_a = VSATR_t * wr + VSAT_t * wf; - PTWG_a = PTWGR_t * wr + PTWG_t * wf; - U0_a = U0R_t * wr + U0_t * wf; - UA_a = UAR_t * wr + UA_t * wf; - UC_a = UCR_t * wr + UC_t * wf; - UD_a = UDR_t * wr + UD_t * wf; - UCS_a = UCSR_t * wr + UCS_t * wf; - end else begin - CDSCD_a = CDSCD_i; - ETA0_a = ETA0_t; - PDIBLC_a = PDIBLC_i; - PCLM_a = PCLM_i; - PSAT_a = PSAT_i; - VSAT_a = VSAT_t; - PTWG_a = PTWG_t; - U0_a = U0_t; - UA_a = UA_t; - UC_a = UC_t; - UD_a = UD_t; - UCS_a = UCS_t; - end - - // SCE, DIBL, SS degradation effects, Ref: BSIM4 Model - `Smooth(Phist - Vbsx, 0.05, 0.1, PhistVbs) - sqrtPhistVbs = sqrt(PhistVbs); - Xdep = T1DEP * sqrtPhistVbs; - Cdep = epssi / Xdep; - cdsc = CIT_i + NFACTOR_t + CDSCD_a * Vdsx - CDSCB_i * Vbsx; - T1 = 1.0 + cdsc/Cox; - `Smooth(T1, 1, 0.05, n) - nVt = n * Vt; - inv_nVt = 1.0 / nVt; - - // Vth Shift for DIBL - dVth_dibl = -(ETA0_a + ETAB_i * Vbsx) * Vdsx; - - // Vth shift with temperature - dvth_temp = (KT1_i + KT1L / Leff + KT2_i * Vbsx) * (pow(TRatio, KT1EXP) - 1.0); - `Smooth2(dVth_dibl, 0.0, 5.0e-5, dVth_dibl) - - // Vth Correction for Pocket Implant - if (DVTP0_i > 0.0) begin - T0 = -DVTP1_i * Vdsx; - if (T0 < -`EXPL_THRESHOLD) begin - T2 = `MIN_EXPL; - end else begin - T2 = lexp(T0); - end - T3 = Leff + DVTP0_i * (1.0 + T2); - dVth_ldop = -nVt * lln(Leff / T3); - end else begin - dVth_ldop = 0.0; - end - T4 = DVTP5_i + DVTP2_i / pow(Leff, DVTP3_i); - dVth_ldop = dVth_ldop - T4 * tanh(DVTP4_i * Vdsx); - - // Normalization of terminal and flatband voltage by nVt - VFB_i = VFB_i + DELVTO; - vg = Vg * inv_nVt; - vs = Vs * inv_nVt; - vfb = VFB_i * inv_nVt; - - // Compute dVth_VNUD with "first-order" and "second-order" body-bias effect - dVth_VNUD = K1_i * (sqrtPhistVbs - sqrtPhist) - K2_i * Vbsx; - Vth_shift = dVth_dibl + dVth_ldop + dVth_VNUD - dvth_temp + vth0_stress + vth0_well; - vgfb = vg - vfb - Vth_shift * inv_nVt; - - // Threshold voltage for operating point information - gam = sqrt(2.0 * `q * epssi * NDEP_i * inv_Vt) / Cox; - q_vth = 0.5; - T0 = hypsmooth((2.0 * phib + Vs * inv_Vt), 1.0e-3); - nq = 1.0 + gam / (2.0 * sqrt(T0)); - psip_th = hypsmooth((Vs * inv_Vt + 2.0 * phib + lln(q_vth) + 2.0 * q_vth + lln(2.0 * nq / gam * (2.0 * q_vth * nq / gam + 2.0 * sqrt(T0)))), 1.0e-3); - VTH = devsign * (VFB_i + (psip_th - Vs * inv_Vt) * Vt + Vt * gam * sqrt(psip_th) + Vth_shift); - - // Normalized body factor - gam = sqrt(2.0 * `q * epssi * NDEP_i * inv_nVt) / Cox; - inv_gam = 1.0 / gam; - - // psip: pinch-off voltage - phib_n = phib / n; - `PO_psip(vgfb, gam, 0, phib_n, psip) - - // normalized inversion charge at source end of channel - `BSIM_q(psip, phib_n, vs, gam, qs) - - // average charge-surf. pot. slope, Ref: Charge-based MOS Transistor Modeling by C. Enz & E. Vittoz - `Smooth(psip, 1.0, 2.0, psipclamp) - sqrtpsip = sqrt(psipclamp); - - // source side surf pot. - psiavg = psip - 2.0 * qs; - `Smooth(psiavg, 1.0, 2.0, T0) - nq = 1.0 + gam / (sqrtpsip + sqrt(T0)); - - // Drain Saturation Voltage - EeffFactor = 1.0e-8 / (epsratio * TOXE); - T0 = nVt * (vgfb - psip - 2.0 * qs * (nq - 1.0)); - `Smooth(T0, 0, 0.1, qbs) - - // Source side qi and qb for Vdsat- normalized to Cox - qis = 2.0 * nq * nVt * qs; - Eeffs = EeffFactor * (qbs + eta_mu * qis); - - // Ref: BSIM4 Model mobility model - T2 = pow(0.5 * (1.0 + (qis / qbs)), UCS_a); - T3 = (UA_a + UC_a * Vbsx) * pow(Eeffs, EU_i) + UD_a / T2; - T4 = 1.0 + T3; - `Smooth(T4, 1.0, 0.0015, Dmobs) - WeffWRFactor = 1.0 / (pow(Weff * 1.0e6, WR_i) * NF); - - if (RDSMOD == 1) begin - Rdss = 0.0; - end else begin - T0 = 1.0 + PRWG_i * qis; - T1 = PRWB_i * (sqrtPhistVbs - sqrtPhist); - T2 = 1.0 / T0 + T1; - T3 = T2 + sqrt(T2 * T2 + 0.01); - Rdss = (RDSWMIN_i + RDSW_i * T3) * WeffWRFactor * NF * rdstemp; - if (RDSMOD == 2) begin - Rdss = (RSourceGeo + (RDSWMIN_i + RDSW_i * T3) * WeffWRFactor * NF + RDrainGeo) * rdstemp; - end - end - T0 = pow(Dmobs, 1.0 / PSAT_a); - if (PSATB_i < 0.0) begin - T1 = 1.0 / (1.0 + PSATB_i * Vbsx); - end else begin - T1 = 1.0 - PSATB_i * Vbsx; - end - T2 = 10.0 * PSATX * qs * T1 / (10.0 * PSATX + qs * T1); - if (PTWG_a < 0.0) begin - LambdaC = 2.0 * ((U0_a / T0) * nVt / (VSAT_a * Leff)) * (1.0 / (1.0 - PTWG_a * T2)); - end else begin - LambdaC = 2.0 * ((U0_a / T0) * nVt / (VSAT_a * Leff)) * (1.0 + PTWG_a * T2); - end - - // qdsat for external Rds - if (Rdss == 0) begin - // Accurate qdsat derived from consistent I-V - T0 = 0.5 * LambdaC * (qs * qs + qs) / (1.0 + 0.5 * LambdaC * (1.0 + qs)); - T1 = 2.0 * LambdaC * (qs - T0); - T2 = sqrt(1.0 + T1 * T1); - ln_T1_T2 = asinh(T1); - if (T1 != 0.0) begin - T3 = T2 + (1.0 / T1) * ln_T1_T2; - end else begin - T3 = T2 + (1.0 / T2); - end - T4 = T0 * T3 - LambdaC * ((qs * qs + qs) - (T0 * T0 + T0)); - if (T1 != 0.0) begin - T5 = -2.0 * LambdaC * (T1 * T2 - ln_T1_T2) / (T1 * T1); - end else begin - T5 = -2.0 * LambdaC * (T1/T2) * (T1/T2) *(T1/T2); - end - T6 = T0 * T5 + T3 + LambdaC * (2.0 * T0 + 1.0); - T0 = T0 - (T4 / T6); - T1 = 2.0 * LambdaC * (qs - T0); - T2 = sqrt(1.0 + T1 * T1); - ln_T1_T2 = asinh(T1); - if (T1 != 0.0) begin - T3 = T2 + (1.0 / T1) * ln_T1_T2; - end else begin - T3 = T2 + (1.0 / T2); - end - T4 = T0 * T3 - LambdaC * ((qs * qs + qs) - (T0 * T0 + T0)); - if (T1 != 0.0) begin - T5 = -2.0 * LambdaC * (T1 * T2 - ln_T1_T2) / (T1 * T1); - end else begin - T5 = (T1 / T2) * (T1 / T2) * (T1 / T2); - end - T6 = T0 * T5 + T3 + LambdaC * (2.0 * T0 + 1.0); - qdsat = T0 - (T4/T6); - // qdsat for internal Rds, Ref: BSIM4 Model - end else begin - // Accurate qdsat derived from consistent I-V - T11 = Weff * 2.0 * nq * Cox * nVt * VSAT_a; - T12 = T11 * LambdaC * Rdss / (2.0 * nVt); - T0 = 0.5 * LambdaC * (qs * qs + qs) / (1.0 + 0.5 * LambdaC * (1.0 + qs)); - T1 = 2.0 * LambdaC * (qs - T0); - T2 = sqrt(1.0 + T1 * T1); - ln_T1_T2 = asinh(T1); - if (T1 != 0.0) begin - T3 = T2 + (1.0 / T1) * ln_T1_T2; - end else begin - T3 = T2 + (1.0 / T2); - end - T4 = T0 * T3 + T12 * T0 * (qs + T0 + 1.0) - LambdaC * ((qs * qs + qs) - (T0 * T0 + T0)); - if (T1 != 0.0) begin - T5 = -2.0 * LambdaC * (T1 * T2 - ln_T1_T2) / (T1 * T1); - end else begin - T5 = -2.0 * LambdaC * (T1 / T2) * (T1 / T2) * (T1 / T2); - end - T6 = T0 * T5 + T3 + T12 * (qs + 2.0 * T0 + 1.0) + LambdaC * (2.0 * T0 + 1.0); - T0 = T0 - T4 / T6; - T1 = 2.0 * LambdaC * (qs - T0); - T2 = sqrt(1.0 + T1 * T1); - ln_T1_T2 = asinh(T1); - if (T1 != 0) begin - T3 = T2 + (1.0 / T1) * ln_T1_T2; - end else begin - T3 = T2 + (1.0 / T2); - end - T4 = T0 * T3 + T12 * T0 * (qs + T0 + 1.0) - LambdaC * ((qs * qs + qs) - (T0 * T0 + T0)); - if (T1 != 0.0) begin - T5 = -2.0 * LambdaC * (T1 * T2 - ln_T1_T2) / (T1 * T1); - end else begin - T5 = -2.0 * LambdaC * (T1 / T2) * (T1 / T2) * (T1 / T2); - end - T6 = T0 * T5 + T3 + T12 * (qs + 2.0 * T0 + 1.0) + LambdaC * (2.0 * T0 + 1.0); - qdsat = T0 - T4 / T6; - end - vdsat = psip - 2.0 * phib_n - (2.0 * qdsat + lln((qdsat * 2.0 * nq * inv_gam) * ((qdsat * 2.0 * nq * inv_gam) + (gam / (nq - 1.0))))); - Vdsat = vdsat * nVt; - - // normalized charge qdeff at drain end of channel - // Vdssat clamped to avoid negative values during transient simulation - `Smooth(Vdsat - Vs, 0.0, 1.0e-3, Vdssat) - T7 = pow(Vds / Vdssat , 1.0 / DELTA_t); - T8 = pow(1.0 + T7, -DELTA_t); - Vdseff = Vds * T8; - vdeff = (Vdseff + Vs) * inv_nVt; - `BSIM_q(psip, phib_n, vdeff, gam, qdeff) - - // Reevaluation of nq to include qdeff - psiavg = psip - qs - qdeff -1.0; - `Smooth(psiavg, 1.0, 2.0, T0) - T2 = sqrt(T0); - nq = 1.0 + gam / (sqrtpsip + T2); - - // Inversion and bulk charge - DQSD2 = (qs - qdeff) * (qs - qdeff); - T0 = 1.0 / (1.0 + qs + qdeff); - T1 = DQSD2 * T0; - Qb = vgfb - psip - (nq - 1.0) * (qs + qdeff + `Oneby3 * T1); - T2 = `Oneby3 * nq; - T3 = T1 * T0; - Qs = T2 * (2.0 * qs + qdeff + 0.5 * (1.0 + 0.8 * qs + 1.2 * qdeff) * T3); - Qd = T2 * (qs + 2.0 * qdeff + 0.5 * (1.0 + 1.2 * qs + 0.8 * qdeff) * T3); - - // Mobility degradation, Ref: BSIM4 - // Average charges (qba and qia) - normalized to Cox - `Smooth(nVt * Qb, 0, 0.1, qba) - qia = nVt * (Qs + Qd); - - Eeffm = EeffFactor * (qba + eta_mu * qia); - T2 = pow(0.5 * (1.0 + (qia / qba)), UCS_a); - T3 = (UA_a + UC_a * Vbsx) * pow(Eeffm, EU_i) + UD_a / T2; - T4 = 1.0 + T3; - `Smooth(T4, 1.0, 0.0015, Dmob) - - // Output conductance - Esat = 2.0 * VSAT_a / (U0_a / Dmob); - EsatL = Esat * Leff; - if (PVAG_i > 0.0) begin - PVAGfactor = 1.0 + PVAG_i * qia / EsatL; - end else begin - PVAGfactor = 1.0 / (1.0 - PVAG_i * qia / EsatL); - end - - // Output conductance due to DIBL, Ref: BSIM4 - DIBLfactor = PDIBLC_a; - diffVds = Vds - Vdseff; - Vgst2Vtm = qia + 2.0 * nVt; - if (DIBLfactor > 0.0) begin - T3 = Vgst2Vtm / (Vdssat + Vgst2Vtm); - T4 = hypsmooth((1.0 + PDIBLCB_i * Vbsx), 1.0e-3); - T5 = 1.0 / T4; - VaDIBL = Vgst2Vtm / DIBLfactor * T3 * PVAGfactor * T5; - Moc = 1.0 + diffVds / VaDIBL; - end else begin - Moc = 1.0; - end - - // Degradation factor due to pocket implant, Ref: BSIM4 Model - if (FPROUT_i <= 0.0) begin - Fp = 1.0; - end else begin - T9 = FPROUT_i * sqrt(Leff) / Vgst2Vtm; - Fp = 1.0 / (1.0 + T9); - end - - // Channel length modulation, Ref: BSIM4 Model - Vasat = Vdssat + EsatL; - if (PCLM_a != 0.0) begin - if (PCLMG < 0.0) begin - T1 = PCLM_a / (1.0 - PCLMG * qia / EsatL) / Fp; - end else begin - T1 = PCLM_a * (1.0 + PCLMG * qia / EsatL) / Fp; - end - MdL = 1.0 + T1 * lln(1.0 + diffVds / T1 / Vasat); - end else begin - MdL = 1.0; - end - Moc = Moc * MdL; - - // Calculate Va_DITS, Ref: BSIM4 - T1 = lexp(PDITSD_i * Vds); - if (PDITS_i > 0.0) begin - T2 = 1.0 + PDITSL * Leff; - VaDITS = (1.0 + T2 * T1) / PDITS_i; - VaDITS = VaDITS * Fp; - end else begin - VaDITS = `MAX_EXPL; - end - T4 = diffVds / VaDITS; - T0 = 1.0 + T4; - Moc = Moc * T0; - - // Calculate Vascbe, Ref: BSIM4 Model - if (PSCBE2_i > 0.0) begin - if (diffVds > PSCBE1_i * litl / `EXPL_THRESHOLD) begin - T0 = PSCBE1_i * litl / diffVds; - VaSCBE = Leff * lexp(T0) / PSCBE2_i; - end else begin - VaSCBE = `MAX_EXPL * Leff/PSCBE2_i; - end - end else begin - VaSCBE = `MAX_EXPL; - end - Mscbe = 1.0 + (diffVds / VaSCBE); - Moc = Moc * Mscbe; - - // Velocity saturation - T0 = pow(Dmob, 1.0 / PSAT_a); - if (PSATB_i < 0.0) begin - T1 = 1.0 / (1.0 + PSATB_i * Vbsx); - end else begin - T1 = 1.0 - PSATB_i * Vbsx; - end - T2 = 10.0 * PSATX * qia * T1 / (10.0 * PSATX + qia * T1); - if (PTWG_a < 0.0) begin - LambdaC = 2.0 * ((U0_a / T0) * nVt / (VSAT_a * Leff)) * (1.0 / (1.0 - PTWG_a * T2)); - end else begin - LambdaC = 2.0 * ((U0_a / T0) * nVt / (VSAT_a * Leff)) * (1.0 + PTWG_a * T2); - end - T1 = 2.0 * LambdaC * (qs - qdeff); - T2 = sqrt(1.0 + T1 * T1); - if (T1 != 0.0) begin - Dvsat = 0.5 * (T2 + (1.0 / T1) * asinh(T1)); - end else begin - Dvsat = 0.5 * (T2 + (1.0 / T2)); - end - Dptwg = Dvsat; - - // S/D Series Resistance, Ref: BSIM4 - Rsource = 0.0; - Rdrain = 0.0; - if (RDSMOD == 1) begin - Rdsi = 0.0; - Dr = 1.0; - // Rs (Source side resistance for all fingers) - T2 = Vgs_noswap - Vfbsdr; - T3 = sqrt(T2 * T2 + 0.01); - Vgs_eff = 0.5 * (T2 + T3); - T5 = 1.0 + PRWG_i * Vgs_eff; - T6 = (1.0 / T5) + PRWB_i * Vsb_noswap; - T4 = 0.5 * (T6 + sqrt(T6 * T6 + 0.01)); - Rsource = rdstemp * (RSourceGeo + (RSWMIN_i + RSW_i * T4) * WeffWRFactor); - // Rd (Drain side resistance for all fingers) - T2 = Vgd_noswap - Vfbsdr; - T3 = sqrt(T2 * T2 + 0.01); - Vgd_eff = 0.5 * (T2 + T3); - T5 = 1.0 + PRWG_i * Vgd_eff; - T6 = (1.0 / T5) + PRWB_i * Vdb_noswap; - T4 = 0.5 * (T6 + sqrt(T6 * T6 + 0.01)); - Rdrain = rdstemp * (RDrainGeo + (RDWMIN_i + RDW_i * T4) * WeffWRFactor); - end else begin - // Ref: (1) BSIM4 Model (2) "Operation and Modeling of the MOS Transistor" by Yannis Tsividis - T0 = 1.0 + PRWG_i * qia; - T1 = PRWB_i * (sqrtPhistVbs - sqrtPhist); - T2 = 1.0 / T0 + T1; - T3 = 0.5 * (T2 + sqrt(T2 * T2 + 0.01)); - Rdsi = rdstemp * (RDSWMIN_i + RDSW_i * T3) * WeffWRFactor * NF; - Rdrain = RDrainGeo; - Rsource = RSourceGeo; - Dr = 1.0 + U0_a /(Dvsat * Dmob) * Cox * Weff / Leff * qia * Rdsi; - if (RDSMOD == 2) begin - Rdsi = rdstemp * (RSourceGeo + (RDSWMIN_i + RDSW_i * T3) * WeffWRFactor * NF + RDrainGeo); - Rdrain = 0.0; - Rsource = 0.0; - Dr = 1.0 + U0_a /(Dvsat * Dmob) * Cox * Weff / Leff * qia * Rdsi; - end - end - - // Non-saturation effect - T0 = A1_t + A2_t / (qia + 2.0 * n * Vtm); - DQSD = qs - qdeff; - T1 = T0 * DQSD * DQSD; - T2 = T1 + 1.0 - 0.001; - T3 = -1.0 + 0.5 * (T2 + sqrt(T2 * T2 + 0.004)); - Nsat = 0.5 * (1.0 + sqrt(1.0 + T3)); - - // MNUD model to enhance Id-Vd fitting flexibility - T0 = (qs + qdeff); - T1 = (qs - qdeff); - T2 = T1 / (T0 + M0_t); - T3 = K0_t * T2 * T2; - Mnud = 1.0 + T3; - Dtot = Dmob * Dvsat * Dr; - - // Effective mobility including mobility degradation - ueff = U0_a / Dtot; - - // I-V - ids = 2.0 * NF * nq * ueff * Weff / Leff * Cox * nVt * nVt * ((qs - qdeff) * (1.0 + qs + qdeff)) * Moc / Nsat * Mnud; - ids = ids * IDS0MULT; - Gcrg = 0.0; - if (RGATEMOD > 1) begin - idsovvds = ueff * Weff / Leff * Cox * qia; - T9 = XRCRG2 * Vt; - T0 = T9 * ueff * Weff / Leff * Cox; - Gcrg = XRCRG1 * NF * (T0 + idsovvds); - if (RGATEMOD == 2) begin - T11 = Grgeltd + Gcrg; - Gcrg = Grgeltd * Gcrg / T11; - end - end - - // Impact ionization current, Ref: BSIM4 - if ((ALPHA0_i <= 0.0) || (BETA0_t <= 0.0)) begin - Iii = 0.0; - end else if (diffVds > BETA0_t / `EXPL_THRESHOLD) begin - T1 = -BETA0_t / diffVds; - Iii = ALPHA0_i * diffVds * ids * lexp(T1) / Mscbe; - end else begin - Iii = ALPHA0_i * diffVds * ids * `MIN_EXPL / Mscbe; - end - ISUB = Iii * devsign; - - // Gate Current, Ref: BSIM4 Model - igbinv = 0.0; - igbacc = 0.0; - igb = 0.0; - igcs = 0.0; - igcd = 0.0; - igs = 0.0; - igd = 0.0; - if ((IGCMOD != 0) || (IGBMOD != 0)) begin - Voxm = nVt * (vgfb - psip + qs + qdeff); - T1 = sqrt(Voxm * Voxm + 1.0e-4); - Voxmacc = 0.5 * (-Voxm + T1); - Voxminv = 0.5 * (Voxm + T1); - // Igbinv - if (IGBMOD != 0) begin - T1 = Voxmacc / NIGBACC_i / Vt; - Vaux_Igbacc = NIGBACC_i * Vt * lln(1.0 + lexp(-T1)); - T2 = AIGBACC_i - BIGBACC_i * Voxmacc; - T3 = 1.0 + CIGBACC_i * Voxmacc; - T4 = -7.45669e11 * TOXE * T2 * T3; - T5 = lexp(T4); - T6 = 4.97232e-7; - igbacc = NF * Weff * Leff * T6 * ToxRatio * Vg * Vaux_Igbacc * T5; - igbacc = igbacc * igtemp; - T1 = (Voxminv - EIGBINV_i) / NIGBINV_i / Vt; - Vaux_Igbinv = NIGBINV_i * Vt * lln(1.0 + lexp(T1)); - T2 = AIGBINV_i - BIGBINV_i * Voxminv; - T3 = 1.0 + CIGBINV_i * Voxminv; - T4 = -9.82222e11 * TOXE * T2 * T3; - T5 = lexp (T4); - T6 = 3.75956e-7; - igbinv = NF * Weff * Leff * T6 * ToxRatio * Vg * Vaux_Igbinv * T5; - igbinv = igbinv * igtemp; - igb = igbacc + igbinv; - end - - if (IGCMOD != 0) begin - // Igcinv - T1 = AIGC_i - BIGC_i * Voxminv; - T2 = 1.0 + CIGC_i * Voxminv; - T3 = Bechvb * T1 * T2; - T4 = nq * nVt * (qs + qdeff) * lexp(T3); - igc0 = NF * Aechvb * T4 * (Vg + 0.5 * Vdsx - 0.5 * (Vs + Vd)) * igtemp; - // Gate-current partitioning - Vdseffx = sqrt(Vdseff * Vdseff + 0.01) - 0.1; - T1 = PIGCD_i * Vdseffx; - T1_exp = lexp(-T1); - T3 = T1 + T1_exp -1.0 + 1.0e-4; - T4 = 1.0 - (T1 + 1.0) * T1_exp + 1.0e-4; - T5 = T1 * T1 + 2.0e-4; - if (sigvds > 0) begin - igcd = igc0 * T4 / T5; - igcs = igc0 * T3 / T5; - end else begin - igcs = igc0 * T4 / T5; - igcd = igc0 * T3 / T5; - end - // Igs - T2 = Vgs_noswap - Vfbsdr; - Vgs_eff = sqrt(T2 * T2 + 1.0e-4); - if (IGCLAMP == 1) begin - T1 = hypsmooth((AIGS_i - BIGS_i * Vgs_eff), 1.0e-6); - if (CIGS_i < 0.01) begin - CIGS_i = 0.01; - end - end else begin - T1 = AIGS_i - BIGS_i * Vgs_eff; - end - T2 = 1.0 + CIGS_i * Vgs_eff; - T3 = BechvbEdge * T1 * T2; - T4 = lexp(T3); - igs_mult = igtemp * NF * AechvbEdge * DLCIG_i; - igs = igs_mult * Vgs_noswap * Vgs_eff * T4; - // Igd - T2 = Vgd_noswap - Vfbsdr; - Vgd_eff = sqrt(T2 * T2 + 1.0e-4); - if (IGCLAMP == 1) begin - T1 = hypsmooth((AIGD_i - BIGD_i * Vgd_eff), 1.0e-6); - if (CIGD_i < 0.01) begin - CIGD_i = 0.01; - end - end else begin - T1 = AIGD_i - BIGD_i * Vgd_eff; - end - T2 = 1.0 + CIGD_i * Vgd_eff; - T3 = BechvbEdge * T1 * T2; - T4 = lexp(T3); - igd_mult = igtemp * NF * AechvbEdge * DLCIGD_i; - igd = igd_mult * Vgd_noswap * Vgd_eff * T4; - end - end - IGS = devsign * igs; - IGD = devsign * igd; - IGB = devsign * igb; - IGCS = devsign * igcs; - IGCD = devsign * igcd; - - // GIDL and GISL Currents , Ref: BSIM4 Model - igisl = 0.0; - igidl = 0.0; - if (GIDLMOD != 0) begin - T0 = epsratio * TOXE; - // GIDL - if ((AGIDL_i <= 0.0) || (BGIDL_t <= 0.0) || (CGIDL_i < 0.0)) begin - T6 = 0.0; - end else begin - T1 = (-Vgd_noswap - EGIDL_i + Vfbsdr) / T0; - T1 = hypsmooth(T1, 1.0e-2); - T2 = BGIDL_t / (T1 + 1.0e-3); - if (CGIDL_i != 0.0) begin - T3 = Vdb_noswap * Vdb_noswap * Vdb_noswap; - T4 = CGIDL_i + abs(T3) + 1.0e-4; - T5 = hypsmooth(T3 / T4, 1.0e-6) - 1.0e-6; - end else begin - T5 = 1.0; - end - T6 = AGIDL_i * Weff * T1 * lexp(-T2) * T5; - end - igidl = T6; - // GISL - if ((AGISL_i <= 0.0) || (BGISL_t <= 0.0) || (CGISL_i < 0.0)) begin - T6 = 0.0; - end else begin - T1 = (-Vgs_noswap - EGISL_i + Vfbsdr) / T0; - T1 = hypsmooth(T1, 1.0e-2); - T2 = BGISL_t / (T1 + 1.0e-3); - if (CGISL_i != 0.0) begin - T3 = Vsb_noswap * Vsb_noswap * Vsb_noswap; - T4 = CGISL_i + abs(T3) + 1.0e-4; - T5 = hypsmooth(T3 / T4, 1.0e-6) - 1.0e-6; - end else begin - T5 = 1.0; - end - T6 = AGISL_i * Weff * T1 * lexp(-T2) * T5; - end - igisl = T6; - end - IGIDL = devsign * NF * igidl; - IGISL = devsign * NF * igisl; - - // Junction current and capacitances - // Source-side junction current - if (Isbs > 0.0) begin - if (Vbs_jct < VjsmRev) begin - T0 = Vbs_jct / Nvtms; - T1 = lexp(T0) - 1.0; - T2 = IVjsmRev + SslpRev * (Vbs_jct - VjsmRev); - Ibs = T1 * T2; - end else if (Vbs_jct <= VjsmFwd) begin - T0 = Vbs_jct / Nvtms; - T1 = (BVS + Vbs_jct) / Nvtms; - T2 = lexp(-T1); - Ibs = Isbs * (lexp(T0) + XExpBVS - 1.0 - XJBVS * T2); - end else begin - Ibs = IVjsmFwd + SslpFwd * (Vbs_jct - VjsmFwd); - end - end else begin - Ibs = 0.0; - end - - //Source-side junction tunneling current - if (JTSS_t > 0.0) begin - if ((VTSS - Vbs_jct) < (VTSS * 1.0e-3)) begin - T0 = -Vbs_jct / Vtm0 / NJTS_t; - T1 = lexp(T0 * 1.0e3) - 1.0; - Ibs = Ibs - ASeff * JTSS_t * T1; - end else begin - T0 = -Vbs_jct / Vtm0 / NJTS_t; - T1 = lexp(T0 * VTSS / (VTSS - Vbs_jct)) - 1.0; - Ibs = Ibs - ASeff * JTSS_t * T1; - end - end - if (JTSSWS_t > 0.0) begin - if ((VTSSWS - Vbs_jct) < (VTSSWS * 1.0e-3)) begin - T0 = -Vbs_jct / Vtm0 / NJTSSW_t; - T1 = lexp(T0 * 1.0e3) - 1.0; - Ibs = Ibs - PSeff * JTSSWS_t * T1; - end else begin - T0 = -Vbs_jct / Vtm0 / NJTSSW_t; - T1 = lexp(T0 * VTSSWS / (VTSSWS - Vbs_jct)) - 1.0; - Ibs = Ibs - PSeff * JTSSWS_t * T1; - end - end - if (JTSSWGS_t > 0.0) begin - if((VTSSWGS - Vbs_jct) < (VTSSWGS * 1.0e-3)) begin - T0 = -Vbs_jct / Vtm0 / NJTSSWG_t; - T1 = lexp(T0 * 1.0e3) - 1.0; - Ibs = Ibs - Weffcj * NF * JTSSWGS_t * T1; - end else begin - T0 = -Vbs_jct / Vtm0 / NJTSSWG_t; - T1 = lexp(T0 * VTSSWGS / (VTSSWGS - Vbs_jct)) - 1.0; - Ibs = Ibs - Weffcj * NF * JTSSWGS_t * T1; - end - end - - // Drain-side Junction Current - if (Isbd > 0.0) begin - if (Vbd_jct < VjdmRev) begin - T0 = Vbd_jct / Nvtmd; - T1 = lexp(T0) - 1.0; - T2 = IVjdmRev + DslpRev * (Vbd_jct - VjdmRev); - Ibd = T1 * T2; - end else if (Vbd_jct <= VjdmFwd) begin - T0 = Vbd_jct / Nvtmd; - T1 = (BVD + Vbd_jct) / Nvtmd; - T2 = lexp(-T1); - Ibd = Isbd * (lexp(T0) + XExpBVD - 1.0 - XJBVD * T2); - end else begin - Ibd = IVjdmFwd + DslpFwd * (Vbd_jct - VjdmFwd); - end - end else begin - Ibd = 0.0; - end - - // Drain-side junction tunneling current - if (JTSD_t > 0.0) begin - if ((VTSD - Vbd_jct) < (VTSD * 1.0e-3)) begin - T0 = -Vbd_jct / Vtm0 / NJTSD_t; - T1 = lexp(T0 * 1.0e3) - 1.0; - Ibd = Ibd - ADeff * JTSD_t * T1; - end else begin - T0 = -Vbd_jct / Vtm0 / NJTSD_t; - T1 = lexp(T0 * VTSD/ (VTSD - Vbd_jct)) - 1.0; - Ibd = Ibd - ADeff * JTSD_t * T1; - end - end - if (JTSSWD_t > 0.0) begin - if ((VTSSWD - Vbd_jct) < (VTSSWD * 1.0e-3)) begin - T0 = -Vbd_jct / Vtm0 / NJTSSWD_t; - T1 = lexp(T0 * 1.0e3) - 1.0; - Ibd = Ibd - PDeff * JTSSWD_t * T1; - end else begin - T0 = -Vbd_jct / Vtm0 / NJTSSWD_t; - T1 = lexp(T0 * VTSSWD / (VTSSWD - Vbd_jct)) - 1.0; - Ibd = Ibd - PDeff * JTSSWD_t * T1; - end - end - if (JTSSWGD_t > 0.0) begin - if ((VTSSWGD - Vbd_jct) < (VTSSWGD * 1.0e-3)) begin - T0 = -Vbd_jct / Vtm0 / NJTSSWGD_t; - T1 = lexp(T0 * 1.0e3) - 1.0; - Ibd = Ibd - Weffcj * NF * JTSSWGD_t * T1; - end else begin - T0 = -Vbd_jct / Vtm0 / NJTSSWGD_t; - T1 = lexp(T0 * VTSSWGD / (VTSSWGD - Vbd_jct)) - 1.0; - Ibd = Ibd - Weffcj * NF * JTSSWGD_t * T1; - end - end - - // Junction capacitance (no swapping) - // Source Bulk Junction - Czbs = CJS_t * ASeff; - Czbssw = CJSWS_t * PSeff; - Czbsswg = CJSWGS_t * Weffcj * NF; - czbs_p1 = pow(0.1, -MJS); - czbs_p2 = 1.0 / (1.0 - MJS) * (1.0 - 0.05 * MJS * (1.0 + MJS) * czbs_p1); - czbssw_p1 = pow(0.1, -MJSWS); - czbssw_p2 = 1.0 / (1.0 - MJSWS) * (1.0 - 0.05 * MJSWS * (1.0 + MJSWS) * czbssw_p1); - czbsswg_p1 = pow(0.1, -MJSWGS); - czbsswg_p2 = 1.0 / (1.0 - MJSWGS) * (1.0 - 0.05 * MJSWGS * (1.0 + MJSWGS) * czbsswg_p1); - `JunCap(Czbs, Vbs_jct, PBS_t, MJS, czbs_p1, czbs_p2, Qbsj1) - `JunCap(Czbssw, Vbs_jct, PBSWS_t, MJSWS, czbssw_p1, czbssw_p2, Qbsj2) - `JunCap(Czbsswg, Vbs_jct, PBSWGS_t, MJSWGS, czbsswg_p1, czbsswg_p2, Qbsj3) - Qbsj = Qbsj1 + Qbsj2 + Qbsj3; - - // Drain Bulk Junction - Czbd = CJD_t * ADeff; - Czbdsw = CJSWD_t * PDeff; - Czbdswg = CJSWGD_t * Weffcj * NF; - czbd_p1 = pow(0.1, -MJD); - czbd_p2 = 1.0 / (1.0 - MJD) * (1.0 - 0.05 * MJD * (1.0 + MJD) * czbd_p1); - czbdsw_p1 = pow(0.1, -MJSWD); - czbdsw_p2 = 1.0 / (1.0 - MJSWD) * (1.0 - 0.05 * MJSWD * (1.0 + MJSWD) * czbdsw_p1); - czbdswg_p1 = pow(0.1, -MJSWGD); - czbdswg_p2 = 1.0 / (1.0 - MJSWGD) * (1.0 - 0.05 * MJSWGD * (1.0 + MJSWGD) * czbdswg_p1); - `JunCap(Czbd, Vbd_jct, PBD_t, MJD, czbd_p1, czbd_p2, Qbdj1) - `JunCap(Czbdsw, Vbd_jct, PBSWD_t, MJSWD, czbdsw_p1, czbdsw_p2, Qbdj2) - `JunCap(Czbdswg, Vbd_jct, PBSWGD_t, MJSWGD, czbdswg_p1, czbdswg_p2, Qbdj3) - Qbdj = Qbdj1 + Qbdj2 + Qbdj3; - - // Sub-Surface Leakage Drain Current - if (SSLMOD != 0) begin - T1 = pow(NDEP_i / 1.0e23, SSLEXP1); - T2 = pow(300.0 / DevTemp, SSLEXP2); - SSL0_NT = SSL0 * lexp(-T1 * T2); - SSL1_NT = SSL1 * T2 * T1; - PHIB_SSL = SSL3 * tanh(lexp(devsign * SSL4 * (V(g, b) - VTH))); - Issl = sigvds * NF * Weff * SSL0_NT * lexp(-SSL1_NT * Leff) * lexp(PHIB_SSL / Vt) * (lexp(SSL2 * Vdsx / Vt) - 1.0); - I(di, si) <+ Issl; - end - - // Harshit's New Flicker Noise Model, Ref : H. Agarwal et. al., IEEE JEDS,Vol. 3, Issue 4, April 2015. - Nt = 4.0 * Vt * `q; - Esatnoi = 2.0 * VSAT_a / ueff; - if (EM <= 0.0) begin - DelClm = 0.0; - end else begin - T0 = (diffVds / litl + EM) / Esatnoi; - DelClm = litl * lln(T0); - if (DelClm < 0.0) begin - DelClm = 0.0; - end - end - Nstar = Vt / `q * (Cox + Cdep + CIT_i); - Nl = 2.0 * nq * Cox * Vt * qdeff / `q; - T0a = `q * `q * `q * Vt * abs(ids) * ueff; - T0b = `q * Vt * ids * ids; - T0c = NOIA + NOIB * Nl + NOIC * Nl * Nl; - T0d = (Nl + Nstar) * (Nl + Nstar); - T0e = NOIA * `q * Vt; - if (FNOIMOD == 1) begin - if (LINTNOI >= (Leff - LH) / 2.0) begin - $strobe("Warning: LINTNOI = %e is too large - Leff for noise is negative. Re-setting LINTNOI = 0.", LINTNOI); - LINTNOI_i = 0.0; - end else begin - LINTNOI_i = LINTNOI; - end - LeffnoiH = Leff; - if (Leff < LH) begin - LeffnoiH = LH; - end - vgfbh = (Vg - VFB_i) / Vt; - gam_h = sqrt(2.0 * `q * epssi * HNDEP / Vt) / Cox; - phib_h = ln(HNDEP / ni); - - // Pinch-Off potential for halo region - `PO_psip(vgfbh, gam_h, 0, phib_h, psiph) - - // normalized inversion charge at source end of halo MOSFET - `BSIM_q(psiph, phib_h, vs, gam_h, qsh) - nq_h = 1.0 + gam_h / (2.0 * sqrt(psiph)); - - // Setting mobility of Halo region equal to the mobility of the channel. In general, U0H 0.0) begin - FNPowerAt1Hz_ch = (Ssi_ch * Swi_ch) / T7; - end else begin - FNPowerAt1Hz_ch = 0.0; - end - end else begin - FNPowerAt1Hz_ch = 0.0; - end - - // Halo transistor LNS - T8 = NOIA2 * `q * Vt; - T9 = Weff * NF * LH * 1.0e10 * Nstar * Nstar; - Swi_h = T8 / T9 * ids * ids; - T10 = Swi_h; - if (T10 > 0.0) begin - FNPowerAt1Hz_h = Swi_h; - end else begin - FNPowerAt1Hz_h = 0.0; - end - - // Overall noise - FNPowerAt1Hz = FNPowerAt1Hz_ch * CF_ch + FNPowerAt1Hz_h * CF_h; - I(di, si) <+ flicker_noise(FNPowerAt1Hz, EF, "1overf"); - end else begin - //Parameter checking - if (LINTNOI >= Leff/2.0) begin - $strobe("Warning: LINTNOI = %e is too large - Leff for noise is negative. Re-setting LINTNOI = 0.", LINTNOI); - LINTNOI_i = 0.0; - end else begin - LINTNOI_i = LINTNOI; - end - if (NOIA > 0 || NOIB > 0 || NOIC > 0) begin - Leffnoi = Leff - 2.0 * LINTNOI_i; - Leffnoisq = Leffnoi * Leffnoi; - T0 = 1.0e10 * Cox * Leffnoisq; - N0 = 2.0 * nq * Cox * Vt * qs / `q; - T1 = NOIA * lln((N0 + Nstar) / (Nl + Nstar)); - T2 = NOIB * (N0 - Nl); - T3 = 0.5 * NOIC * (N0 * N0 - Nl * Nl); - T4 = 1.0e10 * Leffnoisq * Weff * NF; - Ssi = T0a / T0 * (T1 + T2 + T3) + T0b / T4 * DelClm * T0c / T0d; - T5 = Weff * NF * Leffnoi * 1.0e10 * Nstar * Nstar; - Swi = T0e / T5 * ids * ids; - T6 = Swi + Ssi; - if (T6 > 0.0) begin - FNPowerAt1Hz = (Ssi * Swi) / T6; - end else begin - FNPowerAt1Hz = 0.0; - end - end else begin - FNPowerAt1Hz = 0.0; - end - I(di, si) <+ flicker_noise(FNPowerAt1Hz, EF, "1overf"); - end - T0 = qia / Esatnoi / Leff; - T1 = T0 * T0; - T3 = RNOIA * (1.0 + TNOIA * Leff * T1); - T4 = RNOIB * (1.0 + TNOIB * Leff * T1); - T5 = RNOIK * (1.0 + TNOIK * Leff * T1); - ctnoi = RNOIC * (1.0 + TNOIC * Leff * T1); - betanoisq = 3.0 * T3 * T3; - betanoisq = (betanoisq - 1.0) * exp(-Leff / LP) + 1.0; - betaLowId = T5 * T5; - thetanoisq = T4 * T4; - cm_igid = 0.0; - case (TNOIMOD) - 0: begin - QSi = -NF * Weff * Leff * Cox * Vt * Qs; - QDi = -NF * Weff * Leff * Cox * Vt * Qd; - T0 = ueff * abs(QSi + QDi); - T1 = T0 * Rdsi + Leff * Leff; - Gtnoi = (T0 / T1) * NTNOI; - sidn = Nt * Gtnoi; - I(di, si) <+ white_noise(sidn, "id"); - V(N1) <+ 0.0; - end - 1: begin - Vtn = 2.0 * nq * nVt; - T0 = ueff * Dptwg * Moc * Cox * Vtn; - T1 = 0.5 * (qs + qdeff); - T3 = T1 + 0.5; - T4 = T3 * T3; - T5 = T4 * T3; - T6 = qs - qdeff; - T7 = T6 * T6; - T8 = T7 * T6; - T9 = (6.0 * T1 + 0.5) * T7; - Lvsat = Leff * Dptwg; - T10 = Lvsat / Leff; - T12 = 1.0 + (betaLowId * (Vdseff / Vdssat) / (TNOIK2 + qia)); - T12 = ((T12 - 1.0) * exp(-Leff / LP)) + 1.0; - `Smooth(T12, 0, 1.0e-1, T12) - mid = T0 * NF * Weff / Lvsat * (T1 * T12 + T7 * betanoisq / (12.0 * T3)); - mig = Lvsat * T10 * T10 * (T1 / T4 - T9 / (60.0 * T4 * T4) + T7 * T7 / (144.0 * T4 * T5)) * 15.0 / 4.0 * thetanoisq / (NF * Weff * 12.0 * T0); - migid = T10 * (T6 / (12.0 * T3) - T8 / (144.0 * T5)) * ctnoi / 0.395; - sqid = sqrt(Nt * mid); - if (mig == 0.0) begin - sqig = 0.0; - cm_igid = 0.0; - end else begin - sqig = sqrt(Nt / mig); - if (sqid == 0.0) begin - cm_igid = 0.0; - end else begin - cm_igid = migid * sqig / sqid; - end - end - I(N2) <+ white_noise(cm_igid, "corl"); - I(NI) <+ white_noise(sqig * sqig * (1.0 - cm_igid), "corl"); - I(NI) <+ -sqig * V(N2); - I(NC) <+ ddt(mig * Cox * Weff * NF * Leff * V(NC)); - I(di, si) <+ white_noise(sqid * sqid * (1.0 - cm_igid), "id"); - I(di, si) <+ sqid * V(N2); - I(gi, si) <+ ddt(0.5 * ((1.0 + sigvds) * mig * Cox * Weff * NF * Leff * V(NC))); - I(gi, di) <+ ddt(0.5 * ((1.0 - sigvds) * mig * Cox * Weff * NF * Leff * V(NC))); - end - endcase - I(N2) <+ V(N2); - I(NR) <+ V(NR); - - // Gate current shot noise - if (IGCMOD != 0) begin - I(gi, si) <+ white_noise(2.0 * `q * abs(igcs + igs), "igs"); - I(gi, di) <+ white_noise(2.0 * `q * abs(igcd + igd), "igd"); - end - if (IGBMOD != 0) begin - I(gi, bi) <+ white_noise(2.0 * `q * abs(igb), "igb"); - end - - // C-V model - vgfbCV = vgfb; - gamg2 = (2.0 * `q * epssi * NGATE_i) / (Cox * Cox * Vt); - invgamg2 = (NGATE_i > 0.0) ? (1.0 / gamg2) : 0.0; - if (CVMOD == 1) begin - VFBCV_i = VFBCV_i + DELVTO; - vg = Vg * inv_Vt; - vs = Vs * inv_Vt; - vfb = VFBCV_i * inv_Vt; - vgfbCV = vg - vfb; - phib = lln(NDEPCV_i / ni); - // Normalized body factor - gam = sqrt(2.0 * `q * epssi * NDEPCV_i * inv_Vt) / Cox; - inv_gam = 1.0 / gam; - gamg2 = (2.0 * `q * epssi * NGATE_i) / (Cox * Cox * Vt); - invgamg2 = (NGATE_i > 0.0) ? (1.0 / gamg2) : 0.0; - DPD = (NGATE_i > 0.0) ? (NDEPCV_i / NGATE_i) : 0.0; - - // psip: pinch-off voltage - `PO_psip(vgfbCV, gam, DPD, phib, psip) - - // normalized inversion charge at source end of channel - `BSIM_q(psip, phib, vs, gam, qs) - `Smooth(psip, 1.0, 2.0, psipclamp) - sqrtpsip = sqrt(psipclamp); - - // source side surf pot. - psiavg = psip - 2.0 * qs; - `Smooth(psiavg, 1.0, 2.0, T0) - nq = 1.0 + gam / (sqrtpsip + sqrt(T0)); - - // Drain Saturation Voltage - T0 = Vt * (vgfbCV - psip - 2.0 * qs * (nq - 1.0)); - `Smooth(T0, 0, 0.1, qbs) - - // Source side qi and qb for Vdsat- normalized to Cox - qis = 2.0 * nq * Vt * qs; - Eeffs = EeffFactor * (qbs + eta_mu * qis); // in the unit of MV/cm - - // Ref: BSIM4 Model mobility model - T3 = (UA_a + UC_a * Vbsx) * pow(Eeffs, EU_i); - T4 = 1.0 + T3; - `Smooth(T4, 1.0, 0.0015, Dmobs) - LambdaC_by2 = (U0_a / Dmobs) * Vt / (VSATCV_t * Lact); - qdsat = LambdaC_by2 * (qs * qs + qs) / (1.0 + LambdaC_by2 * (1.0 + qs)); - vdsatcv = psip - 2.0 * phib - (2.0 * qdsat + lln((qdsat * 2.0 * nq * inv_gam) * ((qdsat * 2.0 * nq * inv_gam) + (gam / (nq - 1.0))))); - VdsatCV = vdsatcv * Vt; - - // Normalized charge qdeff at drain end of channel - `Smooth(VdsatCV - Vs, 0.0, 1e-3, VdssatCV) - T7 = pow(Vds / VdssatCV , 1.0 / DELTA_t); - T8 = pow(1.0 + T7, -DELTA_t); - Vdseff = Vds * T8; - vdeff = (Vdseff + Vs) * inv_Vt; - `BSIM_q(psip, phib, vdeff, gam, qdeff) - - // Reevaluation of nq to include qdeff needed for gummel symmetry - psiavg = psip - qs - qdeff - 1.0; - `Smooth(psiavg, 1.0, 2.0, T0) - T2 = sqrt(T0); - T3 = 1.0 + DPD + gam / (sqrtpsip + T2); - T4 = 0.5 + DPD * T2 * inv_gam; - T5 = sqrt(T4 * T4 + T3 * (qs + qdeff) * invgamg2); - nq = T3 / (T4 + T5); - - // CV Expressions including Velocity Saturation and CLM - // Velocity Saturation for CV - T0 = Vt * (vgfbCV - psip - 2.0 * qs * (nq - 1.0)); - `Smooth(T0, 0, 0.1, qbs) - T1 = Vt * (vgfbCV - psip - 2.0 * qdeff * (nq - 1.0)); - `Smooth(T1, 0, 0.1, qbd) - qb = 0.5 * (qbs + qbd); - qia = nq * Vt * (qs + qdeff); - Eeffm = EeffFactor * (qb + eta_mu * qia); - T3 = (UA_a + UC_a * Vbsx) * pow(Eeffm, EU_i); - T4 = 1.0 + T3; - `Smooth(T4, 1.0, 0.0015, Dmob) - LambdaC = 2.0 * (U0_a / Dmob) * Vt / (VSATCV_t * Lact); - dps = qs - qdeff; - T1 = 2.0 * (LambdaC * dps) * (LambdaC * dps); - zsat = sqrt(1.0 + T1); - Dvsat = 0.5 * (1.0 + zsat); - // CLM for CV - Esat = 2.0 * VSATCV_t / (U0_a / Dmob); - EsatL = Esat * Lact; - Vasat = VdssatCV + EsatL; - diffVds = Vds - Vdseff; - end - if (PCLMCV_i != 0.0) begin - MdL = 1.0 + PCLMCV_i * lln(1.0 + diffVds / PCLMCV_i / Vasat); - end else begin - MdL = 1.0; - end - MdL_2 = MdL * MdL; - inv_MdL = 1.0 / MdL; - inv_MdL_2 = 1.0 / MdL_2; - MdL_less_1 = MdL - 1.0; - vgpqm = vgfbCV - psip; - DQSD = (qs - qdeff); - DQSD2 = (qs - qdeff) * (qs - qdeff); - sis = vgpqm + 2.0 * qs; - sid = vgpqm + 2.0 * qdeff; - `Smooth(sis, 0.0, 0.5, T1) - `Smooth(sid, 0.0, 0.5, T2) - Temps = sqrt(0.25 + T1 * invgamg2); - Tempd = sqrt(0.25 + T2 * invgamg2); - T1 = sis / (1.0 + 2.0 * Temps); - T2 = sid / (1.0 + 2.0 * Tempd); - T3 = Temps + Tempd; - T4 = `Oneby3 * (DQSD2 / (T3 * T3 * T3)); - T5 = (Dvsat * inv_MdL) / (1.0 + qs + qdeff); - T6 = 0.8 * (T3 * T3 + Temps * Tempd) * T5; - T7 = T6 + (2.0 * invgamg2); - T8 = `Oneby3 * DQSD2 * T5; - dqgeff = sid * (2.0 * Tempd - 1.0) / (2.0 * Tempd + 1.0); - qbeff = vgpqm - 2.0 * (nq - 1.0) * qdeff + dqgeff; - Qb = inv_MdL * (T1 + T2 + (T4 * T7 - nq * (qs + qdeff + T8))) + MdL_less_1 * qbeff; - T9 = qs + qdeff; - T10 = DQSD2 * T5 * T5; - Qi = nq * inv_MdL * (T9 + `Oneby3 * DQSD2 * T5) + 2.0 * nq * MdL_less_1 * qdeff; - Qd1 = nq * inv_MdL_2 * (0.5 * T9 - (DQSD / 6.0) * (1.0 - DQSD * T5 - 0.2 * T10)); - Qd2 = nq * (MdL - inv_MdL) * qdeff; - Qd = Qd1 + Qd2; - Qs = Qi - Qd; - - // Quantum Mechanical Effect - `Smooth(Vt*Qb, 0, 0.1, qbaCV) - qiaCV = Vt *( Qs + Qd); - T0 = (qiaCV + ETAQM * qbaCV) / QM0; - T1 = 1.0 + pow(T0, 0.7 * BDOS); - XDCinv = ADOS * 1.9e-9 / T1; - Coxeffinv = 3.9 * `EPS0 / (BSIMBULKTOXP * 3.9 / EPSROX + XDCinv / epsratio); - QBi = -NF * Wact * Lact * (`EPS0 * EPSROX / BSIMBULKTOXP) * Vt * Qb; - WLCOXVtinv = NF * Wact * Lact * Coxeffinv * Vt; - QSi = -WLCOXVtinv * Qs; - QDi = -WLCOXVtinv * Qd; - QGi = -(QBi + QSi + QDi); - - // Outer fringing capacitance - if (!$param_given(CF)) begin - CF_i = 2.0 * EPSROX * `EPS0 / `M_PI * lln(CFRCOEFF * (1.0 + 0.4e-6 / TOXE)); - end - Cgsof = CGSO + CF_i; - Cgdof = CGDO + CF_i; - - // Overlap capacitance - if (COVMOD == 0) begin - Qovs = -Wact * NF * Cgsof * Vgs_ov_noswap; - Qovd = -Wact * NF * Cgdof * Vgd_ov_noswap; - end else begin - T0 = sqrt((Vgs_ov_noswap - Vfbsdr + `DELTA_1) * (Vgs_ov_noswap -Vfbsdr + `DELTA_1) + 4.0 * `DELTA_1); - Vgsov = 0.5 * (Vgs_ov_noswap - Vfbsdr + `DELTA_1 - T0); - T1 = sqrt(1.0 - 4.0 * Vgsov / CKAPPAS_i); - Qovs = -Wact * NF * (Cgsof * Vgs_ov_noswap + CGSL_i * (Vgs_ov_noswap -Vfbsdr - Vgsov - 0.5 * CKAPPAS_i * (-1.0 + T1))); - T0 = sqrt((Vgd_ov_noswap - Vfbsdr + `DELTA_1) * (Vgd_ov_noswap - Vfbsdr + `DELTA_1) + 4.0 * `DELTA_1); - Vgdov = 0.5 * (Vgd_ov_noswap - Vfbsdr + `DELTA_1 - T0); - T2 = sqrt(1.0 - 4.0 * Vgdov / CKAPPAD_i); - Qovd = -Wact * NF * (Cgdof * Vgd_ov_noswap + CGDL_i * (Vgd_ov_noswap - Vfbsdr - Vgdov - 0.5 * CKAPPAD_i * (-1.0 + T2))); - end - Qovb = -devsign * NF * Lact * CGBO * V(gm, bi); - Qovg = -(Qovs + Qovd + Qovb); - - // Edge FET model - if (EDGEFET == 1) begin - NFACTOREDGE_t = NFACTOREDGE_i * hypsmooth((1.0 + TNFACTOREDGE_i * (TRatio - 1.0)), 1e-3); - ETA0EDGE_t = ETA0_EDGE * (1.0 + TETA0EDGE_i * (TRatio - 1.0)); - cdsc = CITEDGE_i + NFACTOREDGE_t + CDSCDEDGE_i * Vdsx - CDSCBEDGE_i * Vbsx; - T1 = 1.0 + cdsc/Cox; - `Smooth(T1, 1.0, 0.05, n) - nVt = n * Vt; - inv_nVt = 1.0 / nVt; - vg = Vg * inv_nVt; - vs = Vs * inv_nVt; - vfb = VFB_i * inv_nVt; - dvth_dibl = -(ETA0EDGE_t + ETABEDGE_i * Vbsx) * Vdsx; - dvth_temp = (KT1EDGE_i + KT1LEDGE_i / Leff + KT2EDGE_i * Vbsx) * (pow(TRatio, KT1EXPEDGE_i) - 1.0); - litl_edge = litl * (1.0 + DVT2EDGE * Vbsx); - T0 = DVT1EDGE * Leff / litl_edge; - if (T0 < 40.0) begin - theta_sce_edge = 0.5 * DVT0EDGE / (cosh(T0) - 1.0); - end else begin - theta_sce_edge = DVT0EDGE * lexp(-T0); - end - dvth_sce = theta_sce_edge * (Vbi - Phist); - Vth_shift = dvth_dibl - dvth_temp + dvth_sce + DVTEDGE + vth0_stress_EDGE - K2_EDGE * Vbsx; - vgfb = vg - vfb - Vth_shift * inv_nVt; - - // Normalized body factor - DGAMMAEDGE_i = DGAMMAEDGE * (1.0 + DGAMMAEDGEL * pow(Leff, -DGAMMAEDGELEXP)); - gam = sqrt(2.0 * `q * epssi * NDEP_i * inv_nVt) / Cox; - gam = gam * (1.0 + DGAMMAEDGE_i); - inv_gam = 1.0 / gam; - phib_n = phib / n; - `PO_psip(vgfb, gam, 0, phib_n, psip) - `BSIM_q(psip, phib_n, vs, gam, qs) - - // Approximate Pinch Off voltage - vdsatedge = 2.0 * nVt * qs + 2.0 * nVt; - Vdsatedge = vdsatedge; - Vdsatedge = Vdsatedge + Vs; - - // Vdssat clamped to avoid negative values during transient simulation - `Smooth(Vdsatedge - Vs, 0.0, 1.0e-3, Vdssate) - T7 = pow(Vds / Vdssate , 1.0 / DELTA_t); - T8 = pow(1.0 + T7, -DELTA_t); - Vdseff = Vds * T8; - vdeff = (Vdseff + Vs) * inv_nVt; - `BSIM_q(psip, phib_n, vdeff, gam, qdeff) - - // Nq calculation for Edge FET - `Smooth(psip, 1.0, 2.0, psipclamp) - sqrtpsip = sqrt(psipclamp); - psiavg = psip - qs - qdeff -1.0; - `Smooth(psiavg, 1.0, 2.0, T0) - T2 = sqrt(T0); - nq = 1.0 + gam / (sqrtpsip + T2); - ids_edge = 2.0 * NF * nq * ueff * WEDGE / Leff * Cox * nVt * nVt *((qs - qdeff)*(1.0 + qs + qdeff)) *Moc; - ids = ids_edge + ids; - end - - // Edge FET Parasitic Device Drain Current Model Ends - // Charge expressions including fringing and overlap capacitance - QB = devsign * (QBi + Qovb + Qbsj + Qbdj); - if (sigvds > 0) begin - QSI = devsign * QSi; - QDI = devsign * QDi; - QS = devsign * (QSi + Qovs - Qbsj); - QD = devsign * (QDi + Qovd - Qbdj); - end else begin - QSI = devsign * QDi; - QDI = devsign * QSi; - QS = devsign * (QDi + Qovs - Qbsj); - QD = devsign * (QSi + Qovd - Qbdj); - end - QG = devsign * (QGi + Qovg); - - // Output - // Intrinsic Charges - QBI = devsign * QBi; - QGI = devsign * QGi; - - // QSI and QDI are defined above - // Intrinsic Capacitances - CGSI = -ddx(QGI,V(si)); - CGDI = -ddx(QGI,V(di)); - CGBI = -ddx(QGI,V(bi)); - CGGI = ddx(QGI,V(gi)); - CSSI = ddx(QSI,V(si)); - CSDI = -ddx(QSI,V(di)); - CSBI = -ddx(QSI,V(bi)); - CSGI = -ddx(QSI,V(gi)); - CDSI = -ddx(QDI,V(si)); - CDDI = ddx(QDI,V(di)); - CDBI = -ddx(QDI,V(bi)); - CDGI = -ddx(QDI,V(gi)); - CBSI = -ddx(QBI,V(si)); - CBDI = -ddx(QBI,V(di)); - CBBI = ddx(QBI,V(bi)); - CBGI = -ddx(QBI,V(gi)); - - // Total Capacitances - CGS = -ddx(QG, V(si)); - CGD = -ddx(QG, V(di)); - CGB = -ddx(QG, V(bi)); - CGG = CGGI + ddx(devsign * Qovg, V(gm)); - CSS = ddx(QS, V(si)); - CSD = -ddx(QS, V(di)); - CSB = CSBI - ddx((QS - QSI), V(sbulk)); - CSG = CSGI - ddx((QS - QSI), V(gm)); - CDS = -ddx(QD, V(si)); - CDD = ddx(QD, V(di)); - CDB = CDBI - ddx((QD - QDI), V(dbulk)); - CDG = CDGI - ddx((QD - QDI), V(gm)); - CBS = -ddx(QB, V(si)); - CBD = -ddx(QB, V(di)); - CBB = CBBI + ddx(QB, V(sbulk)) + ddx(QB, V(dbulk)) + ddx((devsign * Qovb), V(bi)); - CBG = -ddx(QB, V(gi)) - ddx((devsign * Qovb), V(gm)); - - // Total extrinsic capacitance - CGSEXT = -devsign * ddx(Qovg, V(si)); // Gate-Source Overlap + outer fringing - CGDEXT = -devsign * ddx(Qovg, V(di)); // Gate-Drain Overlap + outer fringing - CGBOV = -devsign * ddx(Qovg, V(bi)); // Gate-Body Overlap - - // Total Source/Drain Junction Capacitances - CAPBS = -devsign * ddx(Qbsj, V(si)); - CAPBD = -devsign * ddx(Qbdj, V(di)); - - // W & L - WEFF = Weff; // Effective width for IV - LEFF = Leff; // Effective length for IV - WEFFCV = Wact; // Effective width for CV - LEFFCV = Lact; // Effective length for CV - - // Currents and derivatives - if (sigvds > 0) begin - IDS = devsign * ids; // Intrinsic drain to source current - IDEFF = IDS - (IGD + IGCD) + ISUB + IGIDL; // Total drain current - ISEFF = -IDS - (IGS + IGCS) + IGISL; // Total source current - end else begin - IDS = -devsign * ids; // Intrinsic drain to source current - IDEFF = IDS - (IGD + IGCD) + IGIDL; // Total drain current - ISEFF = -IDS - (IGS + IGCS) + ISUB + IGISL; // Total source current - end - IGEFF = IGB + IGS + IGCS + IGD + IGCD;//Total gate tunneling current - IBS = -devsign * Ibs; // Source junction current - IBD = -devsign * Ibd; // Source junction current - VDS = V(di, si); // Drain-Source Voltage - VGS = V(gi, si); - VBS = -V(si, bi); // Source-body Voltage - VDSAT = Vdssat; // Drain-Source saturation Voltage - GM = ddx(IDS, V(gi)); // Transconductance - GMBS = ddx(IDS, V(bi)); // Body transconductance - GDS = ddx(IDS, V(di)); // Output conductance - - // Loading variables - I(gi, bi) <+ ddt(QGI); - I(si, bi) <+ ddt(QSI); - I(di, bi) <+ ddt(QDI); - I(gm, si) <+ ddt(-devsign * Qovs); - I(gm, di) <+ ddt(-devsign * Qovd); - I(gm, bi) <+ ddt(-devsign * Qovb); - - // Drain to source current - I(di, si) <+ devsign * sigvds * ids; - - if (IGBMOD != 0) begin - I(gi, bi) <+ IGB; - end - if (IGCMOD != 0) begin - I(gi, si) <+ (IGS + IGCS); - I(gi, di) <+ (IGD + IGCD); - end - if (sigvds > 0) begin - I(di, bi) <+ ISUB + IGIDL; - I(si, bi) <+ IGISL; - end else begin - I(di, bi) <+ IGIDL; - I(si, bi) <+ ISUB + IGISL; - end - - // External S/D Resistance - if (RDSMOD != 2) begin - gdpr = 1.0 / Rdrain; // Note: gdpr considers all fingers - gspr = 1.0 / Rsource; // Note: gspr considers all fingers - I(d, di) <+ V(d, di) * gdpr; - I(s, si) <+ V(s, si) * gspr; - I(d, di) <+ white_noise(Nt * gdpr, "rd"); - I(s, si) <+ white_noise(Nt * gspr, "rs"); - end else begin - V(d, di) <+ 0.0; - V(s, si) <+ 0.0; - end - if (RGATEMOD == 0) begin - V(g, gm) <+ 0.0; - end else begin: rgate - if (RGATEMOD == 2) begin - Ggate = Gcrg; - Gnoise = Gcrg * Gcrg / Grgeltd; - end else begin - Ggate = Grgeltd; - Gnoise = Grgeltd; - end - I(g, gm) <+ V(g, gm) * Ggate; - I(g, gm) <+ white_noise(Nt * Gnoise, "rg"); - end - if (RGATEMOD == 3) begin - I(gm, gi) <+ V(gm, gi) * Gcrg; - end else begin - V(gm, gi) <+ 0; - end - if ((SHMOD != 0) && (RTH0 > 0.0)) begin - if (RDSMOD != 2) begin - Pwr(t) <+ -(devsign * sigvds * ids * V(di, si) + V(d,di) * V(d,di) / Rdrain + V(s,si) * V(s,si) / Rsource) + delTemp1 * gth; - end else begin - Pwr(t) <+ -(devsign * sigvds * ids * V(di, si)) + delTemp1 * gth; - end - Pwr(t) <+ ddt(delTemp1 * cth); - end else begin - Temp(t) <+ 0.0; - end - if (RBODYMOD != 0) begin - I(bi, sbulk) <+ V(bi, sbulk) * Grbps; - I(b, sbulk) <+ V(b, sbulk) * Grbsb; - I(b, bi) <+ V(b, bi) * Grbpb; - I(b, dbulk) <+ V(b, dbulk) * Grbdb; - I(bi, dbulk) <+ V(bi, dbulk) * Grbpd; - I(sbulk, bi) <+ white_noise(Nt * Grbps, "rbps"); - I(sbulk, b) <+ white_noise(Nt * Grbsb, "rbsb"); - I(b, bi) <+ white_noise(Nt * Grbpb, "rbpb"); - I(dbulk, bi) <+ white_noise(Nt * Grbpd, "rbpd"); - I(dbulk, b) <+ white_noise(Nt * Grbdb, "rbdb"); - end else begin - V(b, sbulk) <+ 0.0; - V(b, bi) <+ 0.0; - V(b, dbulk) <+ 0.0; - end - - // Diode Current and Capacitance - if (RBODYMOD != 0) begin - I(sbulk, si) <+ devsign * Ibs; - I(dbulk, di) <+ devsign * Ibd; - I(sbulk, si) <+ devsign * ddt(Qbsj); - I(dbulk, di) <+ devsign * ddt(Qbdj); - end else begin - I(bi, si) <+ devsign * Ibs; - I(bi, di) <+ devsign * Ibd; - I(bi, si) <+ devsign * ddt(Qbsj); - I(bi, di) <+ devsign * ddt(Qbdj); - end -end -endmodule diff --git a/src/spicelib/devices/adms/bsimcmg/admsva/bsimcmg.va b/src/spicelib/devices/adms/bsimcmg/admsva/bsimcmg.va deleted file mode 100644 index 42ef83a14..000000000 --- a/src/spicelib/devices/adms/bsimcmg/admsva/bsimcmg.va +++ /dev/null @@ -1,117 +0,0 @@ -// ******************************************************** -// **** BSIM-CMG 110.0.0 released by Sourabh Khandelwal on 01/01/2016 *****/ -// * BSIM Common Multi-Gate Model Equations (Verilog-A) -// ******************************************************** -// -// ******************************************************** -// * Copyright 2016 Regents of the University of California. -// * All rights reserved. -// * -// * Project Director: Prof. Chenming Hu. -// * Authors: Sriramkumar V., Navid Paydavosi, Juan Duarte, Darsen Lu, Sourabh Khandelwal -// * Chung-Hsun Lin, Mohan Dunga, Shijing Yao, -// * Ali Niknejad, Chenming Hu -// ******************************************************** -// ******************************************************** -// * NONDISCLOSURE STATEMENT -// Software is distributed as is, completely without warranty or service -// support. The University of California and its employees are not liable -// for the condition or performance of the software. -// The University of California owns the copyright and grants users a perpetual, -// irrevocable, worldwide, non-exclusive, royalty-free license with -// respect to the software as set forth below. -// The University of California hereby disclaims all implied warranties. -// The University of California grants the users the right to modify, copy, -// and redistribute the software and documentation, both within the user's -// organization and externally, subject to the following restrictions -// 1. The users agree not to charge for the University of California code -// itself but may charge for additions, extensions, or support. -// 2. In any product based on the software, the users agree to acknowledge -// the University of California that developed the software. This -// acknowledgment shall appear in the product documentation. -// 3. The users agree to obey all U.S. Government restrictions governing -// redistribution or export of the software. -// 4. The users agree to reproduce any copyright notice which appears on -// the software on any copy or modification of such made available -// to others -// Agreed to on __Jan 01, 2016__________________ -// By: ___University of California, Berkeley____ -// ___Chenming Hu_____________________ -// ___Professor in Graduate School _______ -// ******************************************************** - - -`include "constants.vams" -`include "disciplines.vams" - -/**************************************************************/ -/* SHMOD is a model parameter */ -/* SHMOD = 1 : Self-heating turned on */ -/* SHMOD = 0 : Self-heating turned off */ -/* */ -/* RDSMOD is a model parameter */ -/* RDSMOD = 1 : External source/drain resistance model */ -/* RDSMOD = 0 : Internal source/drain resistance model */ -/* RDSMOD = 2 : Internal Bias Dependent and Bias Independent part of source/drain resistance */ -/* */ -/* NQSMOD is a model parameter */ -/* NQSMOD = 1 : NQS Resistance / gi node turned on */ -/* NQSMOD = 0 : NQS Resistance / gi node turned off */ -/* */ -/* RGATEMOD is a model parameter */ -/* RGATEMOD = 1 : Gate Resistance / ge node turned on */ -/* RGATEMOD = 0 : Gate Resistance / ge node turned off */ -/**************************************************************/ -// -// In Verilog-A the number of internal nodes cannot be controlled by -// a model parameter. Therefore we use `define statements -// to control it. Comment the following lines whenever -// possible for best computational efficiency. -`define __OPINFO__ -`define __DEBUG__ -`define __SHMOD__ -`define __RDSMOD__ -//`define __NQSMOD1__ -//`define __NQSMOD2__ -`define __RGATEMOD__ -`define __TNOIMOD1__ //Correlated Thermal Noise Switch - -`include "common_defs.include" -`include "bsimcmg_cfringe.include" - - -module bsimcmg(d, g, s, e, t); - inout g, d, s, e, t; - electrical g, d, s, e; - electrical si, di; - -`ifdef __NQSMOD1__ - electrical gi; -`endif - -`ifdef __NQSMOD2__ - electrical q; -`endif - -`ifdef __RGATEMOD__ - electrical ge; -`endif - -`ifdef __SHMOD__ - thermal t; - branch (t) rth_branch; - branch (t) ith_branch; -`else - thermal t; -`endif - - // Internal node controlled by Correlated Thermal Noise Switch -`ifdef __TNOIMOD1__ - electrical N; -`endif - -`include "bsimcmg_body.include" - - -endmodule - diff --git a/src/spicelib/devices/adms/bsimcmg/admsva/bsimcmg_binning_parameters.include b/src/spicelib/devices/adms/bsimcmg/admsva/bsimcmg_binning_parameters.include deleted file mode 100644 index c620ceb04..000000000 --- a/src/spicelib/devices/adms/bsimcmg/admsva/bsimcmg_binning_parameters.include +++ /dev/null @@ -1,756 +0,0 @@ -// ******************************************************** -// **** BSIM-CMG 110.0.0 released by Sourabh Khandelwal on 01/01/2016 ****/ -// * BSIM Common Multi-Gate Model Equations (Verilog-A) -// ******************************************************** -// -// ******************************************************** -// * Copyright 2016 Regents of the University of California. -// * All rights reserved. -// * -// * Project Director: Prof. Chenming Hu. -// * Authors: Sriramkumar V., Navid Paydavosi, Juan Duarte, Darsen Lu, Sourabh Khandelwal -// * Chung-Hsun Lin, Mohan Dunga, Shijing Yao, -// * Ali Niknejad, Chenming Hu -// ******************************************************** -// ******************************************************** -// * NONDISCLOSURE STATEMENT -// Software is distributed as is, completely without warranty or service -// support. The University of California and its employees are not liable -// for the condition or performance of the software. -// The University of California owns the copyright and grants users a perpetual, -// irrevocable, worldwide, non-exclusive, royalty-free license with -// respect to the software as set forth below. -// The University of California hereby disclaims all implied warranties. -// The University of California grants the users the right to modify, copy, -// and redistribute the software and documentation, both within the user's -// organization and externally, subject to the following restrictions -// 1. The users agree not to charge for the University of California code -// itself but may charge for additions, extensions, or support. -// 2. In any product based on the software, the users agree to acknowledge -// the University of California that developed the software. This -// acknowledgment shall appear in the product documentation. -// 3. The users agree to obey all U.S. Government restrictions governing -// redistribution or export of the software. -// 4. The users agree to reproduce any copyright notice which appears on -// the software on any copy or modification of such made available -// to others -// Agreed to on __Jan 01, 2016_________________ -// By: ___University of California, Berkeley____ -// ___Chenming Hu_____________________ -// ___Professor in Graduate School _______ -// ******************************************************** -`MPRnb( LNBODY ,0.0 ,"m^-2" ,"" ) -`MPRnb( NNBODY ,0.0 ,"m^-2" ,"" ) -`MPRnb( PNBODY ,0.0 ,"m^-1" ,"" ) - -`MPRnb( LPHIG ,0.0 ,"m*eV" ,"" ) -`MPRnb( NPHIG ,0.0 ,"m*eV" ,"" ) -`MPRnb( PPHIG ,0.0 ,"(m^2)*eV" ,"" ) - -`MPRnb( LNGATE ,0.0 ,"m^-2" ,"" ) -`MPRnb( NNGATE ,0.0 ,"m^-2" ,"" ) -`MPRnb( PNGATE ,0.0 ,"m^-1" ,"" ) - -`MPRnb( LCIT ,0.0 ,"F/m" ,"" ) -`MPRnb( NCIT ,0.0 ,"F/m" ,"" ) -`MPRnb( PCIT ,0.0 ,"F" ,"" ) - -`MPRnb( LCITR ,LCIT ,"" ,"" ) -`MPRnb( NCITR ,NCIT ,"" ,"" ) -`MPRnb( PCITR ,PCIT ,"" ,"" ) - -`MPRnb( LCDSC ,0.0 ,"F/m" ,"" ) -`MPRnb( NCDSC ,0.0 ,"F/m" ,"" ) -`MPRnb( PCDSC ,0.0 ,"F" ,"" ) - -`MPRnb( LCDSCD ,0.0 ,"F/m" ,"" ) -`MPRnb( NCDSCD ,0.0 ,"F/m" ,"" ) -`MPRnb( PCDSCD ,0.0 ,"F" ,"" ) - -`MPRnb( LCDSCDR ,LCDSCD ,"F/m" ,"" ) -`MPRnb( NCDSCDR ,NCDSCD ,"F/m" ,"" ) -`MPRnb( PCDSCDR ,PCDSCD ,"F" ,"" ) - -`MPRnb( LDVT0 ,0.0 ,"" ,"" ) -`MPRnb( NDVT0 ,0.0 ,"" ,"" ) -`MPRnb( PDVT0 ,0.0 ,"" ,"" ) - -`MPRnb( LDVT1 ,0.0 ,"" ,"" ) -`MPRnb( NDVT1 ,0.0 ,"" ,"" ) -`MPRnb( PDVT1 ,0.0 ,"" ,"" ) - -`MPRnb( LDVT1SS ,LDVT1 ,"" ,"" ) -`MPRnb( NDVT1SS ,NDVT1 ,"" ,"" ) -`MPRnb( PDVT1SS ,PDVT1 ,"" ,"" ) - -`MPRnb( LPHIN ,0.0 ,"m*V" ,"" ) -`MPRnb( NPHIN ,0.0 ,"m*V" ,"" ) -`MPRnb( PPHIN ,0.0 ,"(m^2)*V" ,"" ) - -`MPRnb( LETA0 ,0.0 ,"" ,"" ) -`MPRnb( NETA0 ,0.0 ,"" ,"" ) -`MPRnb( PETA0 ,0.0 ,"" ,"" ) - -`MPRnb( LETA0R ,LETA0 ,"" ,"" ) -`MPRnb( NETA0R ,NETA0 ,"" ,"" ) -`MPRnb( PETA0R ,PETA0 ,"" ,"" ) - -`MPRnb( LDSUB ,0.0 ,"" ,"" ) -`MPRnb( NDSUB ,0.0 ,"" ,"" ) -`MPRnb( PDSUB ,0.0 ,"" ,"" ) - -`MPRnb( LK1RSCE ,0.0 ,"m*V^(1/2)" ,"" ) -`MPRnb( NK1RSCE ,0.0 ,"m*V^(1/2)" ,"" ) -`MPRnb( PK1RSCE ,0.0 ,"(m^2)*V^(1/2)" ,"" ) - -`MPRnb( LLPE0 ,0.0 ,"m^2" ,"" ) -`MPRnb( NLPE0 ,0.0 ,"m^2" ,"" ) -`MPRnb( PLPE0 ,0.0 ,"m^3" ,"" ) - -`MPRnb( LDVTSHIFT ,0.0 ,"m*V" ,"" ) -`MPRnb( NDVTSHIFT ,0.0 ,"m*V" ,"" ) -`MPRnb( PDVTSHIFT ,0.0 ,"(m^2)*V" ,"" ) - -`MPRnb( LDVTSHIFTR ,LDVTSHIFT ,"" ,"" ) -`MPRnb( NDVTSHIFTR ,NDVTSHIFT ,"" ,"" ) -`MPRnb( PDVTSHIFTR ,PDVTSHIFT ,"" ,"" ) - -`MPRnb( LPHIBE ,0.0 ,"m*V" ,"" ) -`MPRnb( NPHIBE ,0.0 ,"m*V" ,"" ) -`MPRnb( PPHIBE ,0.0 ,"(m^2)*V" ,"" ) - -`MPRnb( LK0 ,0.0 ,"m*V" ,"" ) -`MPRnb( NK0 ,0.0 ,"m*V" ,"" ) -`MPRnb( PK0 ,0.0 ,"(m^2)*V" ,"" ) - -`MPRnb( LK01 ,0.0 ,"(m*V)/K" ,"" ) -`MPRnb( NK01 ,0.0 ,"(m*V)/K" ,"" ) -`MPRnb( PK01 ,0.0 ,"(m^2*V)/K" ,"" ) - -`MPRnb( LK0SI ,0.0 ,"" ,"" ) -`MPRnb( NK0SI ,0.0 ,"" ,"" ) -`MPRnb( PK0SI ,0.0 ,"" ,"" ) - -`MPRnb( LK0SI1 ,0.0 ,"m/K" ,"" ) -`MPRnb( NK0SI1 ,0.0 ,"m/K" ,"" ) -`MPRnb( PK0SI1 ,0.0 ,"(m^2)/K" ,"" ) - -`MPRnb( LK1 ,0.0 ,"m*V^(1/2)" ,"" ) -`MPRnb( NK1 ,0.0 ,"m*V^(1/2)" ,"" ) -`MPRnb( PK1 ,0.0 ,"(m^2)*V^(1/2)" ,"" ) - -`MPRnb( LK11 ,0.0 ,"(m*V^(-1/2))/K" ,"" ) -`MPRnb( NK11 ,0.0 ,"(m*V^(-1/2))/K" ,"" ) -`MPRnb( PK11 ,0.0 ,"(m^2*V^(-1/2))/K" ,"" ) - -`MPRnb( LK2SI ,LK0SI ,"" ,"" ) -`MPRnb( NK2SI ,NK0SI ,"" ,"" ) -`MPRnb( PK2SI ,PK0SI ,"" ,"" ) - -`MPRnb( LK2SI1 ,LK0SI1 ,"" ,"" ) -`MPRnb( NK2SI1 ,NK0SI1 ,"" ,"" ) -`MPRnb( PK2SI1 ,PK0SI1 ,"" ,"" ) - -`MPRnb( LK0SISAT ,0.0 ,"" ,"" ) -`MPRnb( NK0SISAT ,0.0 ,"" ,"" ) -`MPRnb( PK0SISAT ,0.0 ,"" ,"" ) - -`MPRnb( LK0SISAT1 ,0.0 ,"" ,"" ) -`MPRnb( NK0SISAT1 ,0.0 ,"" ,"" ) -`MPRnb( PK0SISAT1 ,0.0 ,"" ,"" ) - -`MPRnb( LK2SISAT ,LK0SISAT ,"" ,"" ) -`MPRnb( NK2SISAT ,NK0SISAT ,"" ,"" ) -`MPRnb( PK2SISAT ,PK0SISAT ,"" ,"" ) - -`MPRnb( LK2SISAT1 ,LK0SISAT1 ,"" ,"" ) -`MPRnb( NK2SISAT1 ,NK0SISAT1 ,"" ,"" ) -`MPRnb( PK2SISAT1 ,PK0SISAT1 ,"" ,"" ) - -`MPRnb( LK2SAT ,0.0 ,"" ,"" ) -`MPRnb( NK2SAT ,0.0 ,"" ,"" ) -`MPRnb( PK2SAT ,0.0 ,"" ,"" ) - -`MPRnb( LK2SAT1 ,0.0 ,"" ,"" ) -`MPRnb( NK2SAT1 ,0.0 ,"" ,"" ) -`MPRnb( PK2SAT1 ,0.0 ,"" ,"" ) - -`MPRnb( LK2 ,0.0 ,"" ,"" ) -`MPRnb( NK2 ,0.0 ,"" ,"" ) -`MPRnb( PK2 ,0.0 ,"" ,"" ) - -`MPRnb( LK21 ,0.0 ,"" ,"" ) -`MPRnb( NK21 ,0.0 ,"" ,"" ) -`MPRnb( PK21 ,0.0 ,"" ,"" ) - -`MPRnb( LDVTB ,0.0 ,"" ,"" ) -`MPRnb( NDVTB ,0.0 ,"" ,"" ) -`MPRnb( PDVTB ,0.0 ,"" ,"" ) - -`MPRnb( LLPEB ,0.0 ,"" ,"" ) -`MPRnb( NLPEB ,0.0 ,"" ,"" ) -`MPRnb( PLPEB ,0.0 ,"" ,"" ) - -`MPRnb( LQMFACTOR ,0.0 ,"" ,"" ) -`MPRnb( NQMFACTOR ,0.0 ,"" ,"" ) -`MPRnb( PQMFACTOR ,0.0 ,"" ,"" ) - -`MPRnb( LQMTCENCV ,0.0 ,"" ,"" ) -`MPRnb( NQMTCENCV ,0.0 ,"" ,"" ) -`MPRnb( PQMTCENCV ,0.0 ,"" ,"" ) - -`MPRnb( LQMTCENCVA ,0.0 ,"" ,"" ) -`MPRnb( NQMTCENCVA ,0.0 ,"" ,"" ) -`MPRnb( PQMTCENCVA ,0.0 ,"" ,"" ) - -`MPRnb( LVSAT ,0.0 ,"(m^2)/s" ,"" ) -`MPRnb( NVSAT ,0.0 ,"(m^2)/s" ,"" ) -`MPRnb( PVSAT ,0.0 ,"(m^3)/s" ,"" ) - -`MPRnb( LVSATR ,LVSAT ,"" ,"" ) -`MPRnb( NVSATR ,NVSAT ,"" ,"" ) -`MPRnb( PVSATR ,PVSAT ,"" ,"" ) - -`MPRnb( LVSAT1 ,LVSAT ,"" ,"" ) -`MPRnb( NVSAT1 ,NVSAT ,"" ,"" ) -`MPRnb( PVSAT1 ,PVSAT ,"" ,"" ) - -`MPRnb( LVSAT1R ,LVSAT1 ,"(m^2)/s" ,"" ) -`MPRnb( NVSAT1R ,NVSAT1 ,"(m^2)/s" ,"" ) -`MPRnb( PVSAT1R ,PVSAT1 ,"(m^3)/s" ,"" ) - -`MPRnb( LPSAT ,0.0 ,"" ,"" ) -`MPRnb( NPSAT ,0.0 ,"" ,"" ) -`MPRnb( PPSAT ,0.0 ,"" ,"" ) - -`MPRnb( LDELTAVSAT ,0.0 ,"" ,"" ) -`MPRnb( NDELTAVSAT ,0.0 ,"" ,"" ) -`MPRnb( PDELTAVSAT ,0.0 ,"" ,"" ) - -`MPRnb( LKSATIV ,0.0 ,"" ,"" ) -`MPRnb( NKSATIV ,0.0 ,"" ,"" ) -`MPRnb( PKSATIV ,0.0 ,"" ,"" ) - -`MPRnb( LKSATIVR ,LKSATIV ,"" ,"" ) -`MPRnb( NKSATIVR ,NKSATIV ,"" ,"" ) -`MPRnb( PKSATIVR ,PKSATIV ,"" ,"" ) - -`MPRnb( LVSATCV ,0.0 ,"(m^2)/s" ,"" ) -`MPRnb( NVSATCV ,0.0 ,"(m^2)/s" ,"" ) -`MPRnb( PVSATCV ,0.0 ,"(m^3)/s" ,"" ) - -`MPRnb( LPSATCV ,0.0 ,"" ,"" ) -`MPRnb( NPSATCV ,0.0 ,"" ,"" ) -`MPRnb( PPSATCV ,0.0 ,"" ,"" ) - -`MPRnb( LDELTAVSATCV ,0.0 ,"" ,"" ) -`MPRnb( NDELTAVSATCV ,0.0 ,"" ,"" ) -`MPRnb( PDELTAVSATCV ,0.0 ,"" ,"" ) - -`MPRnb( LMEXP ,0.0 ,"" ,"" ) -`MPRnb( NMEXP ,0.0 ,"" ,"" ) -`MPRnb( PMEXP ,0.0 ,"" ,"" ) - -`MPRnb( LMEXPR ,LMEXP ,"" ,"" ) -`MPRnb( NMEXPR ,NMEXP ,"" ,"" ) -`MPRnb( PMEXPR ,PMEXP ,"" ,"" ) - -`MPRnb( LPTWG ,0.0 ,"m*(V^-2)" ,"" ) -`MPRnb( NPTWG ,0.0 ,"m*(V^-2)" ,"" ) -`MPRnb( PPTWG ,0.0 ,"m^2*(V^-2)" ,"" ) - -`MPRnb( LPTWGR ,LPTWG ,"m*(V^-2)" ,"" ) -`MPRnb( NPTWGR ,NPTWG ,"m*(V^-2)" ,"" ) -`MPRnb( PPTWGR ,PPTWG ,"m^2*(V^-2)" ,"" ) - -`MPRnb( LU0 ,0.0 ,"(m^3)/V*s" ,"" ) -`MPRnb( NU0 ,0.0 ,"(m^3)/V*s" ,"" ) -`MPRnb( PU0 ,0.0 ,"(m^4)/V*s" ,"" ) - -`MPRnb( LU0R ,LU0 ,"" ,"" ) -`MPRnb( NU0R ,NU0 ,"" ,"" ) -`MPRnb( PU0R ,PU0 ,"" ,"" ) - -`MPRnb( LETAMOB ,0.0 ,"" ,"" ) -`MPRnb( NETAMOB ,0.0 ,"" ,"" ) -`MPRnb( PETAMOB ,0.0 ,"" ,"" ) - -`MPRnb( LUP ,0.0 ,"m*(um^LPA)" ,"" ) -`MPRnb( NUP ,0.0 ,"m*(um^LPA)" ,"" ) -`MPRnb( PUP ,0.0 ,"m^2*(um^LPA)" ,"" ) - -`MPRnb( LUPR ,LUP ,"" ,"" ) -`MPRnb( NUPR ,NUP ,"" ,"" ) -`MPRnb( PUPR ,PUP ,"" ,"" ) - -`MPRnb( LUA ,0.0 ,"m*((cm/MV)^EU)" ,"" ) -`MPRnb( NUA ,0.0 ,"m*((cm/MV)^EU)" ,"" ) -`MPRnb( PUA ,0.0 ,"m^2*((cm/MV)^EU)" ,"" ) - -`MPRnb( LUAR ,LUA ,"" ,"" ) -`MPRnb( NUAR ,NUA ,"" ,"" ) -`MPRnb( PUAR ,PUA ,"" ,"" ) - -`MPRnb( LUC ,0.0 ,"" ,"" ) -`MPRnb( NUC ,0.0 ,"" ,"" ) -`MPRnb( PUC ,0.0 ,"" ,"" ) - -`MPRnb( LUCR ,LUC ,"" ,"" ) -`MPRnb( NUCR ,NUC ,"" ,"" ) -`MPRnb( PUCR ,PUC ,"" ,"" ) - -`MPRnb( LEU ,0.0 ,"m*(cm/MV)" ,"" ) -`MPRnb( NEU ,0.0 ,"m*(cm/MV)" ,"" ) -`MPRnb( PEU ,0.0 ,"m^2*(cm/MV)" ,"" ) - -`MPRnb( LEUR ,LEU ,"" ,"" ) -`MPRnb( NEUR ,NEU ,"" ,"" ) -`MPRnb( PEUR ,PEU ,"" ,"" ) - -`MPRnb( LUD ,0.0 ,"m*(cm/MV)" ,"" ) -`MPRnb( NUD ,0.0 ,"m*(cm/MV)" ,"" ) -`MPRnb( PUD ,0.0 ,"m^2*(cm/MV)" ,"" ) - -`MPRnb( LUDR ,LUD ,"" ,"" ) -`MPRnb( NUDR ,NUD ,"" ,"" ) -`MPRnb( PUDR ,PUD ,"" ,"" ) - -`MPRnb( LUCS ,0.0 ,"" ,"" ) -`MPRnb( NUCS ,0.0 ,"" ,"" ) -`MPRnb( PUCS ,0.0 ,"" ,"" ) - -`MPRnb( LPCLM ,0.0 ,"" ,"" ) -`MPRnb( NPCLM ,0.0 ,"" ,"" ) -`MPRnb( PPCLM ,0.0 ,"" ,"" ) - -`MPRnb( LPCLMR ,LPCLM ,"" ,"" ) -`MPRnb( NPCLMR ,NPCLM ,"" ,"" ) -`MPRnb( PPCLMR ,PPCLM ,"" ,"" ) - -`MPRnb( LPCLMG ,0.0 ,"" ,"" ) -`MPRnb( NPCLMG ,0.0 ,"" ,"" ) -`MPRnb( PPCLMG ,0.0 ,"" ,"" ) - -`MPRnb( LPCLMCV ,LPCLM ,"" ,"" ) -`MPRnb( NPCLMCV ,NPCLM ,"" ,"" ) -`MPRnb( PPCLMCV ,PPCLM ,"" ,"" ) - -`MPRnb( LA1 ,0.0 ,"m*(V^-2)" ,"" ) -`MPRnb( NA1 ,0.0 ,"m*(V^-2)" ,"" ) -`MPRnb( PA1 ,0.0 ,"m^2*(V^-2)" ,"" ) - -`MPRnb( LA11 ,0.0 ,"m*(V^-2/K)" ,"" ) -`MPRnb( NA11 ,0.0 ,"m*(V^-2/K)" ,"" ) -`MPRnb( PA11 ,0.0 ,"m^2*(V^-2/K)" ,"" ) - -`MPRnb( LA2 ,0.0 ,"m*(V^-1)" ,"" ) -`MPRnb( NA2 ,0.0 ,"m*(V^-1)" ,"" ) -`MPRnb( PA2 ,0.0 ,"m^2*(V^-1)" ,"" ) - -`MPRnb( LA21 ,0.0 ,"m*(V^-1/K)" ,"" ) -`MPRnb( NA21 ,0.0 ,"m*(V^-1/K)" ,"" ) -`MPRnb( PA21 ,0.0 ,"m^2*(V^-1/K)" ,"" ) - -`MPRnb( LRDSW ,0.0 ,"m*(ohm-um^WR)" ,"" ) -`MPRnb( NRDSW ,0.0 ,"m*(ohm-um^WR)" ,"" ) -`MPRnb( PRDSW ,0.0 ,"(m^2)*(ohm-um^WR)" ,"" ) - -`MPRnb( LRSW ,0.0 ,"m*(ohm-um^WR)" ,"" ) -`MPRnb( NRSW ,0.0 ,"m*(ohm-um^WR)" ,"" ) -`MPRnb( PRSW ,0.0 ,"(m^2)*(ohm-um^WR)" ,"" ) - -`MPRnb( LRDW ,0.0 ,"m*(ohm-um^WR)" ,"" ) -`MPRnb( NRDW ,0.0 ,"m*(ohm-um^WR)" ,"" ) -`MPRnb( PRDW ,0.0 ,"(m^2)*(ohm-um^WR)" ,"" ) - -`MPRnb( LPRWGS ,0.0 ,"m/V" ,"" ) -`MPRnb( NPRWGS ,0.0 ,"m/V" ,"" ) -`MPRnb( PPRWGS ,0.0 ,"(m^2)/V" ,"" ) - -`MPRnb( LPRWGD ,0.0 ,"m/V" ,"" ) -`MPRnb( NPRWGD ,0.0 ,"m/V" ,"" ) -`MPRnb( PPRWGD ,0.0 ,"(m^2)/V" ,"" ) - -`MPRnb( LWR ,0.0 ,"" ,"" ) -`MPRnb( NWR ,0.0 ,"" ,"" ) -`MPRnb( PWR ,0.0 ,"" ,"" ) - -`MPRnb( LPDIBL1 ,0.0 ,"" ,"" ) -`MPRnb( NPDIBL1 ,0.0 ,"" ,"" ) -`MPRnb( PPDIBL1 ,0.0 ,"" ,"" ) - -`MPRnb( LPDIBL1R ,LPDIBL1 ,"" ,"" ) -`MPRnb( NPDIBL1R ,NPDIBL1 ,"" ,"" ) -`MPRnb( PPDIBL1R ,PPDIBL1 ,"" ,"" ) - -`MPRnb( LPDIBL2 ,0.0 ,"" ,"" ) -`MPRnb( NPDIBL2 ,0.0 ,"" ,"" ) -`MPRnb( PPDIBL2 ,0.0 ,"" ,"" ) - -`MPRnb( LPDIBL2R ,LPDIBL2 ,"" ,"" ) -`MPRnb( NPDIBL2R ,NPDIBL2 ,"" ,"" ) -`MPRnb( PPDIBL2R ,PPDIBL2 ,"" ,"" ) - -`MPRnb( LDROUT ,0.0 ,"" ,"" ) -`MPRnb( NDROUT ,0.0 ,"" ,"" ) -`MPRnb( PDROUT ,0.0 ,"" ,"" ) - -`MPRnb( LPVAG ,0.0 ,"" ,"" ) -`MPRnb( NPVAG ,0.0 ,"" ,"" ) -`MPRnb( PPVAG ,0.0 ,"" ,"" ) - -`MPRnb( LAIGBINV ,0.0 ,"(F*s^2/g)^0.5" ,"" ) -`MPRnb( NAIGBINV ,0.0 ,"(F*s^2/g)^0.5" ,"" ) -`MPRnb( PAIGBINV ,0.0 ,"((F*s^2/g)^0.5)*m" ,"" ) - -`MPRnb( LAIGBINV1 ,0.0 ,"((F*s^2/g)^0.5)/K" ,"" ) -`MPRnb( NAIGBINV1 ,0.0 ,"((F*s^2/g)^0.5)/K" ,"" ) -`MPRnb( PAIGBINV1 ,0.0 ,"((F*s^2/g)^0.5)*(m/K)" ,"" ) - -`MPRnb( LBIGBINV ,0.0 ,"((F*s^2/g)^0.5)/V" ,"" ) -`MPRnb( NBIGBINV ,0.0 ,"((F*s^2/g)^0.5)/V" ,"" ) -`MPRnb( PBIGBINV ,0.0 ,"((F*s^2/g)^0.5)*(m/V)" ,"" ) - -`MPRnb( LCIGBINV ,0.0 ,"m/V" ,"" ) -`MPRnb( NCIGBINV ,0.0 ,"m/V" ,"" ) -`MPRnb( PCIGBINV ,0.0 ,"(m^2)/V" ,"" ) - -`MPRnb( LEIGBINV ,0.0 ,"m*V" ,"" ) -`MPRnb( NEIGBINV ,0.0 ,"m*V" ,"" ) -`MPRnb( PEIGBINV ,0.0 ,"(m^2)*V" ,"" ) - -`MPRnb( LNIGBINV ,0.0 ,"" ,"" ) -`MPRnb( NNIGBINV ,0.0 ,"" ,"" ) -`MPRnb( PNIGBINV ,0.0 ,"" ,"" ) - -`MPRnb( LAIGBACC ,0.0 ,"(F*s^2/g)^0.5" ,"" ) -`MPRnb( NAIGBACC ,0.0 ,"(F*s^2/g)^0.5" ,"" ) -`MPRnb( PAIGBACC ,0.0 ,"((F*s^2/g)^0.5)*m" ,"" ) - -`MPRnb( LAIGBACC1 ,0.0 ,"((F*s^2/g)^0.5)/K" ,"" ) -`MPRnb( NAIGBACC1 ,0.0 ,"((F*s^2/g)^0.5)/K" ,"" ) -`MPRnb( PAIGBACC1 ,0.0 ,"((F*s^2/g)^0.5)*(m/K)" ,"" ) - -`MPRnb( LBIGBACC ,0.0 ,"((F*s^2/g)^0.5)/V" ,"" ) -`MPRnb( NBIGBACC ,0.0 ,"((F*s^2/g)^0.5)/V" ,"" ) -`MPRnb( PBIGBACC ,0.0 ,"((F*s^2/g)^0.5)*(m/V)" ,"" ) - -`MPRnb( LCIGBACC ,0.0 ,"m/V" ,"" ) -`MPRnb( NCIGBACC ,0.0 ,"m/V" ,"" ) -`MPRnb( PCIGBACC ,0.0 ,"(m^2)/V" ,"" ) - -`MPRnb( LNIGBACC ,0.0 ,"" ,"" ) -`MPRnb( NNIGBACC ,0.0 ,"" ,"" ) -`MPRnb( PNIGBACC ,0.0 ,"" ,"" ) - -`MPRnb( LAIGC ,0.0 ,"(F*s^2/g)^0.5" ,"" ) -`MPRnb( NAIGC ,0.0 ,"(F*s^2/g)^0.5" ,"" ) -`MPRnb( PAIGC ,0.0 ,"((F*s^2/g)^0.5)*m" ,"" ) - -`MPRnb( LAIGC1 ,0.0 ,"((F*s^2/g)^0.5)/K" ,"" ) -`MPRnb( NAIGC1 ,0.0 ,"((F*s^2/g)^0.5)/K" ,"" ) -`MPRnb( PAIGC1 ,0.0 ,"((F*s^2/g)^0.5)*(m/K)" ,"" ) - -`MPRnb( LBIGC ,0.0 ,"((F*s^2/g)^0.5)/V" ,"" ) -`MPRnb( NBIGC ,0.0 ,"((F*s^2/g)^0.5)/V" ,"" ) -`MPRnb( PBIGC ,0.0 ,"((F*s^2/g)^0.5)*(m/V)" ,"" ) - -`MPRnb( LCIGC ,0.0 ,"m/V" ,"" ) -`MPRnb( NCIGC ,0.0 ,"m/V" ,"" ) -`MPRnb( PCIGC ,0.0 ,"(m^2)/V" ,"" ) - -`MPRnb( LPIGCD ,0.0 ,"" ,"" ) -`MPRnb( NPIGCD ,0.0 ,"" ,"" ) -`MPRnb( PPIGCD ,0.0 ,"" ,"" ) - -`MPRnb( LAIGS ,0.0 ,"(F*s^2/g)^0.5" ,"" ) -`MPRnb( NAIGS ,0.0 ,"(F*s^2/g)^0.5" ,"" ) -`MPRnb( PAIGS ,0.0 ,"((F*s^2/g)^0.5)*m" ,"" ) - -`MPRnb( LAIGS1 ,0.0 ,"((F*s^2/g)^0.5)/K" ,"" ) -`MPRnb( NAIGS1 ,0.0 ,"((F*s^2/g)^0.5)/K" ,"" ) -`MPRnb( PAIGS1 ,0.0 ,"((F*s^2/g)^0.5)*(m/K)" ,"" ) - -`MPRnb( LBIGS ,0.0 ,"((F*s^2/g)^0.5)/V" ,"" ) -`MPRnb( NBIGS ,0.0 ,"((F*s^2/g)^0.5)/V" ,"" ) -`MPRnb( PBIGS ,0.0 ,"((F*s^2/g)^0.5)*(m/V)" ,"" ) - -`MPRnb( LCIGS ,0.0 ,"m/V" ,"" ) -`MPRnb( NCIGS ,0.0 ,"m/V" ,"" ) -`MPRnb( PCIGS ,0.0 ,"(m^2)/V" ,"" ) - -`MPRnb( LAIGD ,LAIGS ,"(F*s^2/g)^0.5" ,"" ) -`MPRnb( NAIGD ,NAIGS ,"(F*s^2/g)^0.5" ,"" ) -`MPRnb( PAIGD ,PAIGS ,"((F*s^2/g)^0.5)*m" ,"" ) - -`MPRnb( LAIGD1 ,LAIGS1 ,"((F*s^2/g)^0.5)/K" ,"" ) -`MPRnb( NAIGD1 ,NAIGS1 ,"((F*s^2/g)^0.5)/K" ,"" ) -`MPRnb( PAIGD1 ,PAIGS1 ,"((F*s^2/g)^0.5)*(m/K)" ,"" ) - -`MPRnb( LBIGD ,LBIGS ,"((F*s^2/g)^0.5)/V" ,"" ) -`MPRnb( NBIGD ,NBIGS ,"((F*s^2/g)^0.5)/V" ,"" ) -`MPRnb( PBIGD ,PBIGS ,"((F*s^2/g)^0.5)*(m/V)" ,"" ) - -`MPRnb( LCIGD ,LCIGS ,"m/V" ,"" ) -`MPRnb( NCIGD ,NCIGS ,"m/V" ,"" ) -`MPRnb( PCIGD ,PCIGS ,"(m^2)/V" ,"" ) - -`MPRnb( LNTOX ,0.0 ,"" ,"" ) -`MPRnb( NNTOX ,0.0 ,"" ,"" ) -`MPRnb( PNTOX ,0.0 ,"" ,"" ) - -`MPRnb( LPOXEDGE ,0.0 ,"" ,"" ) -`MPRnb( NPOXEDGE ,0.0 ,"" ,"" ) -`MPRnb( PPOXEDGE ,0.0 ,"" ,"" ) - -`MPRnb( LAGISL ,0.0 ,"m/ohm" ,"" ) -`MPRnb( NAGISL ,0.0 ,"m/ohm" ,"" ) -`MPRnb( PAGISL ,0.0 ,"(m^2)/ohm" ,"" ) - -`MPRnb( LBGISL ,0.0 ,"V" ,"" ) -`MPRnb( NBGISL ,0.0 ,"V" ,"" ) -`MPRnb( PBGISL ,0.0 ,"m*V" ,"" ) - -`MPRnb( LCGISL ,0.0 ,"m*(V^3)" ,"" ) -`MPRnb( NCGISL ,0.0 ,"m*(V^3)" ,"" ) -`MPRnb( PCGISL ,0.0 ,"(m^2)*(V^3)" ,"" ) - -`MPRnb( LEGISL ,0.0 ,"m*V" ,"" ) -`MPRnb( NEGISL ,0.0 ,"m*V" ,"" ) -`MPRnb( PEGISL ,0.0 ,"(m^2)*V" ,"" ) - -`MPRnb( LPGISL ,0.0 ,"" ,"" ) -`MPRnb( NPGISL ,0.0 ,"" ,"" ) -`MPRnb( PPGISL ,0.0 ,"" ,"" ) - -`MPRnb( LAGIDL ,LAGISL ,"m/ohm" ,"" ) -`MPRnb( NAGIDL ,NAGISL ,"m/ohm" ,"" ) -`MPRnb( PAGIDL ,PAGISL ,"(m^2)/ohm" ,"" ) - -`MPRnb( LBGIDL ,LBGISL ,"V" ,"" ) -`MPRnb( NBGIDL ,NBGISL ,"V" ,"" ) -`MPRnb( PBGIDL ,PBGISL ,"m*V" ,"" ) - -`MPRnb( LCGIDL ,LCGISL ,"m*(V^3)" ,"" ) -`MPRnb( NCGIDL ,NCGISL ,"m*(V^3)" ,"" ) -`MPRnb( PCGIDL ,PCGISL ,"(m^2)*(V^3)" ,"" ) - -`MPRnb( LEGIDL ,LEGISL ,"m*V" ,"" ) -`MPRnb( NEGIDL ,NEGISL ,"m*V" ,"" ) -`MPRnb( PEGIDL ,PEGISL ,"(m^2)*V" ,"" ) - -`MPRnb( LPGIDL ,LPGISL ,"" ,"" ) -`MPRnb( NPGIDL ,NPGISL ,"" ,"" ) -`MPRnb( PPGIDL ,PPGISL ,"" ,"" ) - -`MPRnb( LALPHA0 ,0.0 ,"(m^2)/V" ,"" ) -`MPRnb( NALPHA0 ,0.0 ,"(m^2)/V" ,"" ) -`MPRnb( PALPHA0 ,0.0 ,"(m^3)/V" ,"" ) - -`MPRnb( LALPHA1 ,0.0 ,"m/V" ,"" ) -`MPRnb( NALPHA1 ,0.0 ,"m/V" ,"" ) -`MPRnb( PALPHA1 ,0.0 ,"(m^2)/V" ,"" ) - -`MPRnb( LALPHAII0 ,0.0 ,"(m^2)/V" ,"" ) -`MPRnb( NALPHAII0 ,0.0 ,"(m^2)/V" ,"" ) -`MPRnb( PALPHAII0 ,0.0 ,"(m^3)/V" ,"" ) - -`MPRnb( LALPHAII1 ,0.0 ,"m/V" ,"" ) -`MPRnb( NALPHAII1 ,0.0 ,"m/V" ,"" ) -`MPRnb( PALPHAII1 ,0.0 ,"(m^2)/V" ,"" ) - -`MPRnb( LBETA0 ,0.0 ,"m/V" ,"" ) -`MPRnb( NBETA0 ,0.0 ,"m/V" ,"" ) -`MPRnb( PBETA0 ,0.0 ,"(m^2)/V" ,"" ) - -`MPRnb( LBETAII0 ,0.0 ,"m/V" ,"" ) -`MPRnb( NBETAII0 ,0.0 ,"m/V" ,"" ) -`MPRnb( PBETAII0 ,0.0 ,"(m^2)/V" ,"" ) - -`MPRnb( LBETAII1 ,0.0 ,"" ,"" ) -`MPRnb( NBETAII1 ,0.0 ,"" ,"" ) -`MPRnb( PBETAII1 ,0.0 ,"" ,"" ) - -`MPRnb( LBETAII2 ,0.0 ,"m*V" ,"" ) -`MPRnb( NBETAII2 ,0.0 ,"m*V" ,"" ) -`MPRnb( PBETAII2 ,0.0 ,"(m^2)*V" ,"" ) - -`MPRnb( LESATII ,0.0 ,"V" ,"" ) -`MPRnb( NESATII ,0.0 ,"V" ,"" ) -`MPRnb( PESATII ,0.0 ,"m*V" ,"" ) - -`MPRnb( LLII ,0.0 ,"(m^2)*V" ,"" ) -`MPRnb( NLII ,0.0 ,"(m^2)*V" ,"" ) -`MPRnb( PLII ,0.0 ,"(m^3)*V" ,"" ) - -`MPRnb( LSII0 ,0.0 ,"m/V" ,"" ) -`MPRnb( NSII0 ,0.0 ,"m/V" ,"" ) -`MPRnb( PSII0 ,0.0 ,"(m^2)/V" ,"" ) - -`MPRnb( LSII1 ,0.0 ,"" ,"" ) -`MPRnb( NSII1 ,0.0 ,"" ,"" ) -`MPRnb( PSII1 ,0.0 ,"" ,"" ) - -`MPRnb( LSII2 ,0.0 ,"m*V" ,"" ) -`MPRnb( NSII2 ,0.0 ,"m*V" ,"" ) -`MPRnb( PSII2 ,0.0 ,"(m^2)*V" ,"" ) - -`MPRnb( LSIID ,0.0 ,"m*V" ,"" ) -`MPRnb( NSIID ,0.0 ,"m*V" ,"" ) -`MPRnb( PSIID ,0.0 ,"(m^2)*V" ,"" ) - -`MPRnb( LCFS ,0.0 ,"F" ,"" ) -`MPRnb( NCFS ,0.0 ,"F" ,"" ) -`MPRnb( PCFS ,0.0 ,"F*m" ,"" ) - -`MPRnb( LCFD ,LCFS ,"F" ,"" ) -`MPRnb( NCFD ,NCFS ,"F" ,"" ) -`MPRnb( PCFD ,PCFS ,"F*m" ,"" ) - -`MPRnb( LCOVS ,0.0 ,"F" ,"" ) -`MPRnb( NCOVS ,0.0 ,"F" ,"" ) -`MPRnb( PCOVS ,0.0 ,"F*m" ,"" ) - -`MPRnb( LCOVD ,LCOVS ,"F" ,"" ) -`MPRnb( NCOVD ,NCOVS ,"F" ,"" ) -`MPRnb( PCOVD ,PCOVS ,"F*m" ,"" ) - -`MPRnb( LCGSL ,0.0 ,"F" ,"" ) -`MPRnb( NCGSL ,0.0 ,"F" ,"" ) -`MPRnb( PCGSL ,0.0 ,"F*m" ,"" ) - -`MPRnb( LCGDL ,LCGSL ,"F" ,"" ) -`MPRnb( NCGDL ,NCGSL ,"F" ,"" ) -`MPRnb( PCGDL ,PCGSL ,"F*m" ,"" ) - -`MPRnb( LCKAPPAS ,0.0 ,"m*V" ,"" ) -`MPRnb( NCKAPPAS ,0.0 ,"m*V" ,"" ) -`MPRnb( PCKAPPAS ,0.0 ,"(m^2)*V" ,"" ) - -`MPRnb( LCKAPPAD ,LCKAPPAS ,"m*V" ,"" ) -`MPRnb( NCKAPPAD ,NCKAPPAS ,"m*V" ,"" ) -`MPRnb( PCKAPPAD ,PCKAPPAS ,"(m^2)*V" ,"" ) - -`MPRnb( LCGBL ,0.0 ,"F" ,"" ) -`MPRnb( NCGBL ,0.0 ,"F" ,"" ) -`MPRnb( PCGBL ,0.0 ,"F*m" ,"" ) - -`MPRnb( LCKAPPAB ,0.0 ,"m*V" ,"" ) -`MPRnb( NCKAPPAB ,0.0 ,"m*V" ,"" ) -`MPRnb( PCKAPPAB ,0.0 ,"(m^2)*V" ,"" ) - -`MPRnb( LNTGEN ,0.0 ,"" ,"" ) -`MPRnb( NNTGEN ,0.0 ,"" ,"" ) -`MPRnb( PNTGEN ,0.0 ,"" ,"" ) - -`MPRnb( LAIGEN ,0.0 ,"(m^-2)*(V^-1)" ,"" ) -`MPRnb( NAIGEN ,0.0 ,"(m^-2)*(V^-1)" ,"" ) -`MPRnb( PAIGEN ,0.0 ,"(m^-1)*(V^-1)" ,"" ) - -`MPRnb( LBIGEN ,0.0 ,"(m^-2)*(V^-3)" ,"" ) -`MPRnb( NBIGEN ,0.0 ,"(m^-2)*(V^-3)" ,"" ) -`MPRnb( PBIGEN ,0.0 ,"(m^-1)*(V^-3)" ,"" ) - -`MPRnb( LXRCRG1 ,0.0 ,"" ,"" ) -`MPRnb( NXRCRG1 ,0.0 ,"" ,"" ) -`MPRnb( PXRCRG1 ,0.0 ,"" ,"" ) - -`MPRnb( LXRCRG2 ,0.0 ,"" ,"" ) -`MPRnb( NXRCRG2 ,0.0 ,"" ,"" ) -`MPRnb( PXRCRG2 ,0.0 ,"" ,"" ) - -`MPRnb( LUTE ,0.0 ,"" ,"" ) -`MPRnb( NUTE ,0.0 ,"" ,"" ) -`MPRnb( PUTE ,0.0 ,"" ,"" ) - -`MPRnb( LUTER ,LUTE ,"" ,"" ) -`MPRnb( NUTER ,NUTE ,"" ,"" ) -`MPRnb( PUTER ,PUTE ,"" ,"" ) - -`MPRnb( LUTL ,0.0 ,"" ,"" ) -`MPRnb( NUTL ,0.0 ,"" ,"" ) -`MPRnb( PUTL ,0.0 ,"" ,"" ) - -`MPRnb( LUTLR ,LUTL ,"" ,"" ) -`MPRnb( NUTLR ,NUTL ,"" ,"" ) -`MPRnb( PUTLR ,PUTL ,"" ,"" ) - -`MPRnb( LEMOBT ,0.0 ,"" ,"" ) -`MPRnb( NEMOBT ,0.0 ,"" ,"" ) -`MPRnb( PEMOBT ,0.0 ,"" ,"" ) - -`MPRnb( LUA1 ,0.0 ,"" ,"" ) -`MPRnb( NUA1 ,0.0 ,"" ,"" ) -`MPRnb( PUA1 ,0.0 ,"" ,"" ) - -`MPRnb( LUA1R ,LUA1 ,"" ,"" ) -`MPRnb( NUA1R ,NUA1 ,"" ,"" ) -`MPRnb( PUA1R ,PUA1 ,"" ,"" ) - -`MPRnb( LUC1 ,0.0 ,"" ,"" ) -`MPRnb( NUC1 ,0.0 ,"" ,"" ) -`MPRnb( PUC1 ,0.0 ,"" ,"" ) - -`MPRnb( LUC1R ,LUC1 ,"" ,"" ) -`MPRnb( NUC1R ,NUC1 ,"" ,"" ) -`MPRnb( PUC1R ,PUC1 ,"" ,"" ) - -`MPRnb( LUD1 ,0.0 ,"" ,"" ) -`MPRnb( NUD1 ,0.0 ,"" ,"" ) -`MPRnb( PUD1 ,0.0 ,"" ,"" ) - -`MPRnb( LUD1R ,LUD1 ,"" ,"" ) -`MPRnb( NUD1R ,NUD1 ,"" ,"" ) -`MPRnb( PUD1R ,PUD1 ,"" ,"" ) - -`MPRnb( LUCSTE ,0.0 ,"" ,"" ) -`MPRnb( NUCSTE ,0.0 ,"" ,"" ) -`MPRnb( PUCSTE ,0.0 ,"" ,"" ) - -`MPRnb( LPTWGT ,0.0 ,"m/K" ,"" ) -`MPRnb( NPTWGT ,0.0 ,"m/K" ,"" ) -`MPRnb( PPTWGT ,0.0 ,"(m^2)/K" ,"" ) - -`MPRnb( LAT ,0.0 ,"m/K" ,"" ) -`MPRnb( NAT ,0.0 ,"m/K" ,"" ) -`MPRnb( PAT ,0.0 ,"(m^2)/K" ,"" ) - -`MPRnb( LATR ,LAT ,"" ,"" ) -`MPRnb( NATR ,NAT ,"" ,"" ) -`MPRnb( PATR ,PAT ,"" ,"" ) - -`MPRnb( LATCV ,0.0 ,"m/K" ,"" ) -`MPRnb( NATCV ,0.0 ,"m/K" ,"" ) -`MPRnb( PATCV ,0.0 ,"(m^2)/K" ,"" ) - -`MPRnb( LSTTHETASAT ,0.0 ,"" ,"" ) -`MPRnb( NSTTHETASAT ,0.0 ,"" ,"" ) -`MPRnb( PSTTHETASAT ,0.0 ,"" ,"" ) - -`MPRnb( LPRT ,0.0 ,"m/K" ,"" ) -`MPRnb( NPRT ,0.0 ,"m/K" ,"" ) -`MPRnb( PPRT ,0.0 ,"(m^2)/K" ,"" ) - -`MPRnb( LKT1 ,0.0 ,"m*V" ,"" ) -`MPRnb( NKT1 ,0.0 ,"m*V" ,"" ) -`MPRnb( PKT1 ,0.0 ,"(m^2)*V" ,"" ) - -`MPRnb( LTSS ,0.0 ,"" ,"" ) -`MPRnb( NTSS ,0.0 ,"" ,"" ) -`MPRnb( PTSS ,0.0 ,"" ,"" ) - -`MPRnb( LIIT ,0.0 ,"" ,"" ) -`MPRnb( NIIT ,0.0 ,"" ,"" ) -`MPRnb( PIIT ,0.0 ,"" ,"" ) - -`MPRnb( LTII ,0.0 ,"" ,"" ) -`MPRnb( NTII ,0.0 ,"" ,"" ) -`MPRnb( PTII ,0.0 ,"" ,"" ) - -`MPRnb( LTGIDL ,0.0 ,"m/K" ,"" ) -`MPRnb( NTGIDL ,0.0 ,"m/K" ,"" ) -`MPRnb( PTGIDL ,0.0 ,"(m^2)/K" ,"" ) - -`MPRnb( LIGT ,0.0 ,"" ,"" ) -`MPRnb( NIGT ,0.0 ,"" ,"" ) -`MPRnb( PIGT ,0.0 ,"" ,"" ) diff --git a/src/spicelib/devices/adms/bsimcmg/admsva/bsimcmg_body.include b/src/spicelib/devices/adms/bsimcmg/admsva/bsimcmg_body.include deleted file mode 100644 index fdb851974..000000000 --- a/src/spicelib/devices/adms/bsimcmg/admsva/bsimcmg_body.include +++ /dev/null @@ -1,4145 +0,0 @@ -// ******************************************************** -// ******************************************************** -// *** BSIM-CMG 110.0.0 released by Sourabh Khandelwal on 01/01/2016 ****/ -// * BSIM Common Multi-Gate Model Equations (Verilog-A) -// ******************************************************** -// -// ******************************************************** -// * Copyright 2016 Regents of the University of California. -// * All rights reserved. -// * -// * Project Director: Prof. Chenming Hu. -// * Authors: Sriramkumar V., Navid Paydavosi, Juan Duarte, Sourabh Khandelwal, Darsen Lu, -// * Chung-Hsun Lin, Mohan Dunga, Shijing Yao, -// * Ali Niknejad, Chenming Hu -// ******************************************************** -// ******************************************************** -// * NONDISCLOSURE STATEMENT -// Software is distributed as is, completely without warranty or service -// support. The University of California and its employees are not liable -// for the condition or performance of the software. -// The University of California owns the copyright and grants users a perpetual, -// irrevocable, worldwide, non-exclusive, royalty-free license with -// respect to the software as set forth below. -// The University of California hereby disclaims all implied warranties. -// The University of California grants the users the right to modify, copy, -// and redistribute the software and documentation, both within the user's -// organization and externally, subject to the following restrictions -// 1. The users agree not to charge for the University of California code -// itself but may charge for additions, extensions, or support. -// 2. In any product based on the software, the users agree to acknowledge -// the University of California that developed the software. This -// acknowledgment shall appear in the product documentation. -// 3. The users agree to obey all U.S. Government restrictions governing -// redistribution or export of the software. -// 4. The users agree to reproduce any copyright notice which appears on -// the software on any copy or modification of such made available -// to others -// Agreed to on __Jan 01, 2016__________________ -// By: ___University of California, Berkeley____ -// ___Chenming Hu_____________________ -// ___Professor in Graduate School _______ -// ******************************************************** - -// Clamped Exponential Function -analog function real lexp; - input x; - real x; - - begin - if (x > `EXPL_THRESHOLD) begin - lexp = `MAX_EXPL * (1.0 + x - `EXPL_THRESHOLD); - end else if (x < -`EXPL_THRESHOLD) begin - lexp = `MIN_EXPL; - end else begin - lexp = exp(x); - end - end -endfunction - -// Clamped log Function -analog function real lln; - input x; - real x; - - begin - lln = ln(max(x, `N_MINLOG)); - end -endfunction - -// Hyperbolic Smoothing Function -analog function real hypsmooth; - input x, c; - real x, c; - - begin - hypsmooth = 0.5 * (x + sqrt(x * x + 4.0 * c * c)); - end -endfunction - -// Hyperbolic Smoothing max Function -analog function real hypmax; - input x, xmin, c; - real x, xmin, c; - - begin - hypmax = xmin + 0.5 * (x - xmin - c + sqrt((x - xmin - c) * (x - xmin - c) - 4.0 * xmin * c)); - end -endfunction - -// Temperature Dependence Type -analog function real Tempdep; - input PARAML, PARAMT, DELTEMP, TEMPMOD; - real PARAML, PARAMT, DELTEMP, TEMPMOD; - - begin - if (TEMPMOD != 0) begin - Tempdep = PARAML + hypmax(PARAMT * DELTEMP, -PARAML, 1.0e-6); - end else begin - Tempdep = PARAML * hypsmooth(1.0 + PARAMT * DELTEMP - 1.0e-6, 1.0e-3); - end - end -endfunction - -// Node Definitions -`ifdef __RGATEMOD__ - `define GateEdgeNode ge -`else - `define GateEdgeNode g -`endif -`ifdef __NQSMOD1__ - `define IntrinsicGate gi -`else - `define IntrinsicGate `GateEdgeNode -`endif - -// *************************** -// * Instance Parameters * -// *************************** - -// Note: Some instance parameters are also model parameters. Please refer to the technical note for details. -`IPRco( L ,3.0e-8 ,"m" ,1.0e-9 ,inf ,"Designed gate length" ) -`IPRco( D ,4.0e-8 ,"m" ,1.0e-9 ,inf ,"Diameter of the cylinder (GEOMOD=3)" ) -`IPRco( TFIN ,1.5e-8 ,"m" ,1.0e-9 ,inf ,"Body (fin) thickness" ) -`IPRco( FPITCH ,8.0e-8 ,"m" ,TFIN ,inf ,"Fin pitch" ) -`IPIco( NF ,1 ,"" ,1 ,inf ,"Number of fingers" ) -`IPRoz( NFIN ,1.0 ,"" ,"Number of fins per finger (real number enables optimization)" ) -`IPIcc( NGCON ,1 ,"" ,1 ,2 ,"Number of gate contact (1 or 2 sided)" ) -`IPRcz( ASEO ,0.0 ,"m^2" ,"Source-to-substrate overlap area through oxide" ) -`IPRcz( ADEO ,0.0 ,"m^2" ,"Drain-to-substrate overlap area through oxide" ) -`IPRcz( PSEO ,0.0 ,"m" ,"Perimeter of source-to-substrate overlap region through oxide" ) -`IPRcz( PDEO ,0.0 ,"m" ,"Perimeter of drain-to-substrate overlap region through oxide" ) -`IPRcz( ASEJ ,0.0 ,"m^2" ,"Source junction area (BULKMOD=1 or 2)" ) -`IPRcz( ADEJ ,0.0 ,"m^2" ,"Drain junction area (BULKMOD=1 or 2)" ) -`IPRcz( PSEJ ,0.0 ,"m" ,"Source-to-substrate PN junction perimeter (BULKMOD=1 or 2)" ) -`IPRcz( PDEJ ,0.0 ,"m" ,"Drain-to-substrate PN junction perimeter (BULKMOD=1 or 2)" ) -`IPRcz( COVS ,0.0 ,"F/m" ,"Constant gate-to-source overlap capacitance (CGEOMOD=1)" ) -`IPRcz( COVD ,COVS ,"F/m" ,"Constant gate-to-drain overlap capacitance (CGEOMOD=1)" ) -`IPRcz( CGSP ,0.0 ,"F/m" ,"Constant gate-to-source fringe capacitance (CGEOMOD=1)" ) -`IPRcz( CGDP ,0.0 ,"F/m" ,"Constant gate-to-drain fringe capacitance (CGEOMOD=1)" ) -`IPRcz( CDSP ,0.0 ,"F" ,"Constant drain-to-source fringe capacitance (all CGEOMOD)" ) -`IPRcz( NRS ,0.0 ,"" ,"Number of source diffusion squares" ) -`IPRcz( NRD ,0.0 ,"" ,"Number of source diffusion squares" ) -`IPRoz( LRSD ,L ,"m" ,"Length of the source/drain" ) -`IPRoz( NFINNOM ,1.0 ,"" ,"Nominal number of fins per finger" ) - -// Variability Handles -`MPRnb( XL ,0.0 ,"m" ,"L offset for channel length due to mask/etch effect" ) -`MPRnb( DTEMP ,0.0 ,"Celsius" ,"Variability in device temperature" ) -`MPRnb( DELVTRAND ,0.0 ,"V" ,"Variability in Vth" ) -`MPRcz( U0MULT ,1.0 ,"" ,"Variability in carrier mobility" ) -`MPRcz( IDS0MULT ,1.0 ,"" ,"Variability in drain current for miscellaneous reasons" ) - -// ************************ -// * Model Parameters * -// ************************ -`MPIcc( DEVTYPE ,`ntype ,"" ,`ptype ,`ntype ,"0: PMOS; 1: NMOS" ) -`MPIcc( TYPE ,DEVTYPE ,"" ,`ptype ,`ntype ,"0: PMOS; 1: NMOS" ) -`MPIcc( BULKMOD ,0 ,"" ,0 ,2 ,"0: SOI multi-gate; 1: Bulk multi-gate; 2: for decoupled bulk multi-gate" ) -`MPIcc( GEOMOD ,0 ,"" ,0 ,4 ,"0: Double gate; 1: Triple gate; 2: Quadruple gate; 3: Cylindrical gate; 4: Unified fin Shape" ) -`MPIcc( CGEO1SW ,0 ,"" ,0 ,1 ,"For CGEOMOD=1 only, this switch enables the parameters COVS, COVD, CGSP, and CGDP to be in F per fin, per gate-finger, per unit channel width" ) -`MPIcc( RDSMOD ,0 ,"" ,0 ,2 ,"0: Internal S/D resistance model; 1: External S/D resistance model; 2: Both bias dependent and independent part of S/D resistance internal" ) -`MPIcc( ASYMMOD ,0 ,"" ,0 ,1 ,"0: Turn off asymmetry model - forward mode parameters used; 1: Turn on asymmetry model" ) -`MPIcc( IGCMOD ,0 ,"" ,0 ,1 ,"0: Turn off Igc, Igs and Igd; 1: Turn on Igc, Igs and Igd" ) -`MPIcc( IGBMOD ,0 ,"" ,0 ,1 ,"0: Turn off Igb; 1: Turn on Igb" ) -`MPIcc( GIDLMOD ,0 ,"" ,0 ,1 ,"0: Turn off GIDL/GISL current; 1: Turn on GIDL/GISL current" ) -`MPIcc( IIMOD ,0 ,"" ,0 ,2 ,"0: Turn off impact ionization current; 1: BSIM4-based model; 2: BSIMSOI-based model" ) -`MPIcc( TNOIMOD ,0 ,"" ,0 ,1 ,"0: Charge-based, 1: Correlated thermal noise model" ) -`MPIcc( NQSMOD ,0 ,"" ,0 ,2 ,"0: Turn off NQS model; 1: NQS gate resistance (with gi node); 2: NQS charge deficit model from BSIM4 (with q node)" ) -`MPIcc( SHMOD ,0 ,"" ,0 ,1 ,"0: Turn off self-heating; 1: Turn on self-heating" ) -`MPIcc( TEMPMOD ,0 ,"" ,0 ,1 ,"1: Change temperature dependence of specific parameters" ) -`MPIcc( RGATEMOD ,0 ,"" ,0 ,1 ,"0: Turn off gate electrode resistance (without ge node); 1: Turn on gate electrode resistance (with ge node)" ) -`MPIcc( RGEOMOD ,0 ,"" ,0 ,1 ,"Geometry-dependent source/drain resistance; 0: RSH-based; 1: Holistic" ) -`MPIcc( CGEOMOD ,0 ,"" ,0 ,2 ,"Geometry-dependent parasitic capacitance model selector" ) -`MPIcc( SH_WARN ,0 ,"" ,0 ,1 ,"0: Disable self-heating warnings; 1: Enable self-heating warnings" ) -`MPIcc( IGCLAMP ,1 ,"" ,0 ,1 ,"0: Disable gate current clamps; 1: Enable gate current clamps" ) -`MPRnb( LINT ,0.0 ,"m" ,"Length reduction parameter (dopant diffusion effect)" ) -`MPRnb( LL ,0.0 ,"m^(LLN+1)" ,"Length reduction parameter (dopant diffusion effect)" ) -`MPRnb( LLN ,1.0 ,"" ,"Length reduction parameter (dopant diffusion effect)" ) -`MPRnb( DLC ,0.0 ,"m" ,"Delta L for C-V model" ) -`MPRnb( DLCACC ,0.0 ,"m" ,"Delta L for C-V model in accumulation region (BULKMOD=1 or 2)" ) -`MPRnb( DLBIN ,0.0 ,"m" ,"Delta L for binning" ) -`MPRnb( LLC ,0.0 ,"m^(LLN+1)" ,"Length reduction parameter (dopant diffusion effect)" ) -`MPRco( EOT ,1.0e-9 ,"m" ,1.0e-10 ,inf ,"Equivalent oxide thickness" ) -`MPRco( TOXP ,1.2e-9 ,"m" ,1.0e-10 ,inf ,"Physical oxide thickness" ) -`MPRco( EOTBOX ,1.4e-7 ,"m" ,1.0e-9 ,inf ,"Equivalent oxide thickness of the buried oxide (SOI FinFET)" ) -`MPRco( HFIN ,3.0e-8 ,"m" ,1.0e-9 ,inf ,"Fin height" ) -`MPRcz( FECH ,1.0 ,"" ,"End-channel factor for different orientation/shape" ) -`MPRnb( DELTAW ,0.0 ,"m" ,"Change of effective width due to shape of fin/cylinder" ) -`MPRcz( FECHCV ,1.0 ,"" ,"CV end-channel factor for different orientation/shape" ) -`MPRnb( DELTAWCV ,0.0 ,"m" ,"CV change of effective width due to shape of fin/cylinder" ) -`MPRnb( NBODY ,1.0e22 ,"/m^3" ,"Channel (body) doping" ) -`MPRnb( NBODYN1 ,0.0 ,"" ,"NFIN dependence of channel (body) doping" ) -`MPRex( NBODYN2 ,1.0e5 ,"" ,0.0 ,"NFIN dependence of channel (body) doping" ) -`MPRcc( NSD ,2.0e26 ,"/m^3" ,2.0e25 ,1.0e27 ,"Source/drain active doping concentration" ) -`MPRcz( PHIG ,4.61 ,"eV" ,"Gate workfunction" ) -`MPRnb( PHIGL ,0.0 ,"eV/m" ,"Length dependence of gate workfunction" ) -`MPRnb( PHIGLT ,0.0 ,"/m" ,"Coupled NFIN and length dependence of gate workfunction" ) -`MPRnb( PHIGN1 ,0.0 ,"" ,"NFIN dependence of gate workfunction" ) -`MPRex( PHIGN2 ,1.0e5 ,"" ,0.0 ,"NFIN dependence of gate workfunction" ) -`MPRco( EPSROX ,3.9 ,"" ,1.0 ,inf ,"Relative dielectric constant of the gate dielectric" ) -`MPRco( EPSRSUB ,11.9 ,"" ,1.0 ,inf ,"Relative dielectric constant of the channel material" ) -`MPRcz( EASUB ,4.05 ,"eV" ,"Electron affinity of substrate" ) -`MPRnb( NI0SUB ,1.1e16 ,"/m^3" ,"Intrinsic carrier constant at 300.15K" ) -`MPRnb( BG0SUB ,1.12 ,"eV" ,"Bandgap of substrate at 300.15K" ) -`MPRnb( NC0SUB ,2.86e25 ,"/m^3" ,"Conduction band density of states" ) -`MPRnb( NGATE ,0.0 ,"/m^3" ,"Parameter for poly gate doping. For metal gate please set NGATE = 0" ) -`MPRnb( Imin ,1.0e-15 ,"A/m^2" ,"Parameter for Vgs clamping for inversion region calculation in accumulation" ) - -// Short Channel Effects -`MPRnb( CIT ,0.0 ,"F/m^2" ,"Parameter for interface trap" ) -`MPRnb( CITR ,CIT ,"" ,"Parameter for interface trap in reverse mode for asymmetric model" ) -`MPRnb( CDSC ,7.0e-3 ,"F/m^2" ,"Coupling capacitance between S/D and channel" ) -`MPRnb( CDSCN1 ,0.0 ,"" ,"NFIN dependence of CDSC" ) -`MPRnb( CDSCN2 ,1.0e5 ,"" ,"NFIN dependence of CDSC" ) -`MPRnb( CDSCD ,7.0e-3 ,"F/m^2" ,"Drain-bias sensitivity of CDSC" ) -`MPRnb( CDSCDN1 ,0.0 ,"" ,"NFIN dependence of CDSCD" ) -`MPRex( CDSCDN2 ,1.0e5 ,"" ,0.0 ,"NFIN dependence of CDSCD" ) -`MPRnb( CDSCDR ,CDSCD ,"F/m^2" ,"Reverse-mode drain-bias sensitivity of CDSC" ) -`MPRnb( CDSCDRN1 ,CDSCDN1 ,"" ,"NFIN dependence of CDSCD" ) -`MPRex( CDSCDRN2 ,CDSCDN2 ,"" ,0.0 ,"NFIN dependence of CDSCD" ) -`MPRnb( DVT0 ,0.0 ,"" ,"SCE coefficient" ) -`MPRnb( DVT1 ,0.6 ,"" ,"SCE exponent coefficient. After binning it should be within (0:inf)" ) -`MPRnb( DVT1SS ,DVT1 ,"" ,"Subthreshold swing exponent coefficient. After binning it should be within (0:inf)" ) -`MPRnb( PHIN ,0.05 ,"V" ,"Nonuniform vertical doping effect on surface potential" ) -`MPRnb( ETA0 ,0.6 ,"" ,"DIBL coefficient" ) -`MPRnb( ETA0N1 ,0.0 ,"" ,"NFIN dependence of ETA0" ) -`MPRco( ETA0N2 ,1.0e5 ,"" ,1.0e-5 ,inf ,"NFIN dependence of ETA0" ) -`MPRnb( ETA0LT ,0.0 ,"/m" ,"Coupled NFIN and length dependence of ETA0" ) -`MPRnb( TETA0 ,0.0 ,"/K" ,"Temperature dependence of DIBL coefficient" ) -`MPRnb( ETA0R ,ETA0 ,"" ,"Reverse-mode DIBL coefficient" ) -`MPRnb( TETA0R ,TETA0 ,"/K" ,"Temperature dependence of reverse-mode DIBL coefficient" ) -`MPRnb( DSUB ,1.06 ,"" ,"DIBL exponent coefficient" ) -`MPRnb( DVTP0 ,0.0 ,"" ,"Coefficient for drain-induced Vth shift (DITS)" ) -`MPRnb( DVTP1 ,0.0 ,"" ,"DITS exponent coefficient" ) -`MPRnb( ADVTP0 ,0.0 ,"" ,"Pre-exponential coefficient for DITS" ) -`MPRex( BDVTP0 ,1.0e-7 ,"" ,0.0 ,"Exponential coefficient for DITS" ) -`MPRnb( ADVTP1 ,0.0 ,"" ,"Pre-exponential coefficient for DVTP1" ) -`MPRex( BDVTP1 ,1.0e-7 ,"" ,0.0 ,"Exponential coefficient for DVTP1" ) -`MPRnb( DVTP2 ,0.0 ,"" ,"DITS model parameter" ) -`MPRnb( K1RSCE ,0.0 ,"/V^(0.5)" ,"K1 for reverse short channel effect calculation" ) -`MPRnb( LPE0 ,5.0e-9 ,"m" ,"Equivalent length of pocket region at zero bias" ) -`MPRnb( DVTSHIFT ,0.0 ,"V" ,"Vth shift handle" ) -`MPRnb( DVTSHIFTR ,DVTSHIFT ,"" ,"Vth shift handle for asymmetric mode" ) -`MPRnb( THETASCE ,0.0 ,"" ,"Vth roll-off length dependence. If defined by user, it will overwrite Theta_SCE in the code") -`MPRnb( THETADIBL ,0.0 ,"" ,"DIBL length dependence. If defined by user, will overwrite Theta_DIBL in the code" ) -`MPRnb( THETASW ,0.0 ,"" ,"Subthreshold swing length dependence. If defined by user, it will overwrite Theta_SW in the code" ) -`MPRnb( NVTM ,0.0 ,"V" ,"Subthreshold swing factor multiplied by Vtm. If defined by user, it will overwrite nVtm in the code" ) - -// Lateral non-uniform doping effect (IV-CV Vth shift) -`MPRnb( K0 ,0.0 ,"V" ,"Lateral NUD voltage parameter" ) -`MPRnb( K01 ,0.0 ,"V/K" ,"Temperature dependence of lateral NUD voltage parameter" ) -`MPRnb( K0SI ,1.0 ,"" ,"Correction factor for strong inversion used in Mnud. After binning it should be within (0:inf)" ) -`MPRnb( K0SI1 ,0.0 ,"/K" ,"Temperature dependence of K0SI" ) -`MPRnb( K2SI ,K0SI ,"" ,"Correction factor for strong inversion used in Mob" ) -`MPRnb( K2SI1 ,K0SI1 ,"" ,"Temperature dependence of K2SI" ) -`MPRnb( K0SISAT ,0.0 ,"" ,"Correction factor for strong inversion used in Mnud" ) -`MPRnb( K0SISAT1 ,0.0 ,"" ,"Temperature dependence of K0SISAT" ) -`MPRnb( K2SISAT ,K0SISAT ,"" ,"Correction factor for strong inversion used in Mob" ) -`MPRnb( K2SISAT1 ,K0SISAT1 ,"" ,"Temperature dependence of K2SISAT" ) - -// Body Effect for MG Devices on Bulk Substrate (ex: FinFETs on BULK) -`MPRnb( PHIBE ,0.7 ,"V" ,"Body effect voltage parameter. After binning it should be within [0.2:1.2]" ) -`MPRco( K1 ,1.0e-6 ,"V^(0.5)" ,1.0e-6 ,inf ,"Body effect coefficient for subthreshold region" ) -`MPRnb( K11 ,0.0 ,"V^(0.5)/K" ,"Temperature dependence of K1" ) -`MPRnb( K2SAT ,0.0 ,"" ,"Correction factor for K2 in saturation (high Vds)" ) -`MPRnb( K2SAT1 ,0.0 ,"" ,"Temperature dependence of K2SAT" ) -`MPRnb( K2 ,0.0 ,"" ,"Body effect coefficient for BULKMOD==2" ) -`MPRnb( K21 ,0.0 ,"" ,"Temperature dependence of K2" ) - -// Quantum Mechanical Effect -`MPRnb( QMFACTOR ,0.0 ,"" ,"Prefactor + switch for QM Vth correction" ) -`MPRnb( QMTCENCV ,0.0 ,"" ,"Prefactor + switch for QM Width and Toxeff correction for CV" ) -`MPRnb( QMTCENCVA ,0.0 ,"" ,"Prefactor + switch for QM Width and Toxeff correction for CV (accumulation region)" ) -`MPRnb( AQMTCEN ,0.0 ,"" ,"Parameter for geometric dependence of Tcen on R/TFIN/HFIN" ) -`MPRex( BQMTCEN ,1.2e-8 ,"" ,0.0 ,"Parameter for geometric dependence of Tcen on R/TFIN/HFIN" ) -`MPRnb( ETAQM ,0.54 ,"" ,"Bulk charge coefficient for Tcen" ) -`MPRnb( QM0 ,1.0e-3 ,"V" ,"Knee-point for Tcen in inversion (Charge normalized to Cox)" ) -`MPRnb( PQM ,0.66 ,"" ,"Slope of normalized Tcen in inversion" ) -`MPRnb( QM0ACC ,1.0e-3 ,"V" ,"Knee-point for Tcen in accumulation (Charge normalized to Cox)" ) -`MPRnb( PQMACC ,0.66 ,"" ,"Slope of normalized Tcen in accumulation" ) - -// Velocity Saturation Model -`MPRnb( VSAT ,8.5e4 ,"m/s" ,"Saturation velocity for the saturation region" ) -`MPRnb( VSATR ,VSAT ,"m/s" ,"Saturation velocity for the saturation region in the reverse mode" ) -`MPRnb( VSATN1 ,0.0 ,"" ,"NFIN dependence of VSAT" ) -`MPRex( VSATN2 ,1.0e5 ,"" ,0.0 ,"NFIN dependence of VSAT" ) -`MPRnb( VSATRN1 ,VSATN1 ,"" ,"NFIN dependence of VSATR" ) -`MPRex( VSATRN2 ,VSATN2 ,"" ,0.0 ,"NFIN dependence of VSATR" ) -`MPRnb( AVSAT ,0.0 ,"" ,"Pre-exponential coefficient for VSAT" ) -`MPRex( BVSAT ,1.0e-7 ,"" ,0.0 ,"Exponential coefficient for VSAT" ) -`MPRnb( VSAT1 ,VSAT ,"m/s" ,"Velocity saturation parameter for Ion degradation - forward mode" ) -`MPRnb( VSAT1N1 ,VSATN1 ,"" ,"NFIN dependence of VSAT1" ) -`MPRex( VSAT1N2 ,VSATN2 ,"" ,0.0 ,"NFIN dependence of VSAT1" ) -`MPRnb( VSAT1R ,VSAT1 ,"m/s" ,"Velocity saturation parameter for Ion degradation - reverse mode" ) -`MPRnb( VSAT1RN1 ,VSAT1N1 ,"" ,"NFIN dependence of VSAT1R" ) -`MPRex( VSAT1RN2 ,VSAT1N2 ,"" ,0.0 ,"NFIN dependence of VSAT1R" ) -`MPRnb( AVSAT1 ,AVSAT ,"" ,"Pre-exponential coefficient for VSAT1" ) -`MPRex( BVSAT1 ,BVSAT ,"" ,0.0 ,"Exponential coefficient for VSAT1" ) -`MPRnb( DELTAVSAT ,1.0 ,"" ,"velocity saturation parameter in the linear region" ) -`MPRnb( PSAT ,2.0 ,"" ,"Velocity saturation exponent, after binnig should be from [2.0:inf)" ) -`MPRnb( APSAT ,0.0 ,"" ,"Pre-exponential coefficient for PSAT" ) -`MPRex( BPSAT ,1.0 ,"" ,0.0 ,"Exponential coefficient for PSAT" ) -`MPRnb( KSATIV ,1.0 ,"" ,"Parameter for long channel Vdsat" ) -`MPRnb( KSATIVR ,KSATIV ,"" ,"KSATIV in asymmetric mode" ) -`MPRnb( VSATCV ,VSAT ,"m/s" ,"Velocity saturation parameter for CV" ) -`MPRnb( AVSATCV ,AVSAT ,"" ,"Pre-exponential coefficient for VSATCV" ) -`MPRex( BVSATCV ,BVSAT ,"" ,0.0 ,"Exponential coefficient for VSATCV" ) -`MPRnb( DELTAVSATCV ,DELTAVSAT ,"" ,"Velocity saturation parameter in the linear region for the capacitance model" ) -`MPRnb( PSATCV ,PSAT ,"" ,"Velocity saturation exponent for C-V" ) -`MPRnb( APSATCV ,APSAT ,"" ,"Pre-exponential coefficient for PSATCV" ) -`MPRex( BPSATCV ,BPSAT ,"" ,0.0 ,"Exponential coefficient for PSATCV" ) -`MPRnb( MEXP ,4.0 ,"" ,"Smoothing function factor for Vdsat" ) -`MPRnb( AMEXP ,0.0 ,"" ,"Pre-exponential coefficient for MEXP" ) -`MPRnb( BMEXP ,1.0 ,"" ,"Exponential coefficient for MEXP" ) -`MPRnb( MEXPR ,MEXP ,"" ,"Reverse-mode smoothing function factor for Vdsat" ) -`MPRnb( AMEXPR ,AMEXP ,"" ,"Pre-exponential coefficient for MEXPR" ) -`MPRnb( BMEXPR ,BMEXP ,"" ,"Exponential coefficient for MEXPR" ) -`MPRnb( PTWG ,0.0 ,"/V^2" ,"Gmsat degradation parameter - forward mode" ) -`MPRnb( PTWGR ,PTWG ,"/V^2" ,"Gmsat degradation parameter - reverse mode" ) -`MPRnb( APTWG ,0.0 ,"" ,"Pre-exponential coefficient for PTWG" ) -`MPRex( BPTWG ,1.0e-7 ,"" ,0.0 ,"Exponential coefficient for PTWG" ) -`MPRnb( AT ,-1.56e-3 ,"/K" ,"Saturation velocity temperature coefficient" ) -`MPRnb( ATR ,AT ,"" ,"Reverse-mode saturation velocity temperature coefficient" ) -`MPRnb( ATCV ,AT ,"/K" ,"Saturation velocity temperature coefficient for CV" ) -`MPRnb( TMEXP ,0.0 ,"/K" ,"Temperature coefficient for Vdseff smoothing" ) -`MPRnb( TMEXPR ,TMEXP ,"/K" ,"Reverse-mode temperature coefficient for Vdseff smoothing" ) -`MPRnb( PTWGT ,4.0e-3 ,"/K" ,"PTWG temperature coefficient" ) - -// Mobility Model -`MPRnb( U0 ,3.0e-2 ,"m^2/(V*s)" ,"Low-field mobility" ) -`MPRnb( U0R ,U0 ,"m^2/(V*s)" ,"Reverse-mode low-field mobility" ) -`MPRnb( U0N1 ,0.0 ,"" ,"NFIN dependence of U0" ) -`MPRnb( U0N1R ,U0N1 ,"" ,"Reverse-mode NFIN dependence of U0" ) -`MPRex( U0N2 ,1.0e5 ,"" ,0.0 ,"NFIN dependence of U0" ) -`MPRex( U0N2R ,U0N2 ,"" ,0.0 ,"Reverse-mode NFIN dependence of U0" ) -`MPRnb( U0LT ,0.0 ,"/m" ,"Coupled NFIN and length dependence of U0" ) -`MPRnb( ETAMOB ,2.0 ,"" ,"Effective field parameter" ) -`MPRnb( UP ,0.0 ,"um^LPA" ,"Mobility L coefficient" ) -`MPRnb( LPA ,1.0 ,"" ,"Mobility L power coefficient" ) -`MPRnb( UPR ,UP ,"um^LPA" ,"Reverse-mode mobility L coefficient" ) -`MPRnb( LPAR ,LPA ,"" ,"Reverse-mode mobility L power coefficient" ) -`MPRnb( UA ,0.3 ,"(cm/MV)^EU" ,"Phonon/surface roughness scattering parameter" ) -`MPRnb( UAR ,UA ,"(cm/MV)^EU" ,"Reverse-mode phonon/surface roughness scattering parameter" ) -`MPRnb( AUA ,0.0 ,"" ,"Pre-exponential coefficient for UA" ) -`MPRnb( AUAR ,AUA ,"" ,"Reverse-mode pre-exponential coefficient for UA" ) -`MPRex( BUA ,1.0e-7 ,"" ,0.0 ,"Exponential coefficient for UA" ) -`MPRex( BUAR ,BUA ,"" ,0.0 ,"Reverse-mode exponential coefficient for UAR" ) -`MPRnb( UC ,0.0 ,"(1e-6*cm/MV^2)^EU" ,"Body effect for mobility degradation parameter - BULKMOD=1 or 2" ) -`MPRnb( UCR ,UC ,"" ,"Reverse-mode body effect for mobility degradation parameter - BULKMOD=1 or 2" ) -`MPRnb( EU ,2.5 ,"cm/MV" ,"Phonon/surface roughness scattering parameter" ) -`MPRnb( EUR ,EU ,"cm/MV" ,"Reverse-mode phonon/surface roughness scattering parameter" ) -`MPRnb( AEU ,0.0 ,"" ,"Pre-exponential coefficient for EU" ) -`MPRnb( AEUR ,AEU ,"" ,"Reverse-mode pre-exponential coefficient for EU" ) -`MPRex( BEU ,1.0e-7 ,"" ,0.0 ,"Exponential coefficient for EU" ) -`MPRex( BEUR ,BEU ,"" ,0.0 ,"Reverse-mode exponential coefficient for EU" ) -`MPRnb( UD ,0.0 ,"cm/MV" ,"Columbic scattering parameter" ) -`MPRnb( UDR ,UD ,"cm/MV" ,"Reverse-mode columbic scattering parameter" ) -`MPRnb( AUD ,0.0 ,"" ,"Pre-exponential coefficient for UD" ) -`MPRnb( AUDR ,AUD ,"" ,"Reverse-mode pre-exponential coefficient for UD" ) -`MPRex( BUD ,5.0e-8 ,"" ,0.0 ,"Exponential coefficient for UD" ) -`MPRex( BUDR ,BUD ,"" ,0.0 ,"Reverse-mode exponential coefficient for UD" ) -`MPRnb( UCS ,1.0 ,"" ,"Columbic scattering parameter" ) -`MPRnb( UTE ,0.0 ,"" ,"Mobility temperature coefficient" ) -`MPRnb( UTER ,UTE ,"" ,"Reverse-mode for mobility temperature coefficient" ) -`MPRnb( UTL ,-1.5e-3 ,"" ,"Mobility temperature coefficient" ) -`MPRnb( UTLR ,UTL ,"" ,"Reverse-mode for mobility temperature coefficient" ) -`MPRnb( EMOBT ,0.0 ,"" ,"Temperature coefficient of ETAMOB" ) -`MPRnb( UA1 ,1.032e-3 ,"" ,"Mobility temperature coefficient for UA" ) -`MPRnb( UA1R ,UA1 ,"" ,"Reverse-mode mobility temperature coefficient for UA" ) -`MPRnb( UC1 ,5.6e-11 ,"" ,"Mobility temperature coefficient for UC" ) -`MPRnb( UC1R ,UC1 ,"" ,"Reverse-mode mobility temperature coefficient for UC" ) -`MPRnb( UD1 ,0.0 ,"" ,"Mobility temperature coefficient for UC" ) -`MPRnb( UD1R ,UD1 ,"" ,"Reverse-mode mobility temperature coefficient for UD" ) -`MPRnb( UCSTE ,-4.775e-3 ,"" ,"Mobility temperature coefficient" ) -`MPRcc( CHARGEWF ,0.0 ,"" ,-1.0 ,1.0 ,"Average channel charge weighting factor, +1: source-side, 0: middle, -1: drain-side" ) - -// Access Resistance Model -`MPRnb( RDSWMIN ,0.0 ,"ohm*(um^(WR))" ,"RDSMOD = 0 S/D extension resistance per unit width at high Vgs" ) -`MPRnb( RDSW ,1.0e2 ,"ohm*(um^(WR))" ,"RDSMOD = 0 zero bias S/D extension resistance per unit width" ) -`MPRnb( ARDSW ,0.0 ,"" ,"Pre-exponential coefficient for RDSW" ) -`MPRex( BRDSW ,1.0e-7 ,"" ,0.0 ,"exponential coefficient for RDSW" ) -`MPRnb( RSWMIN ,0.0 ,"ohm*(um^(WR))" ,"RDSMOD = 1 source extension resistance per unit width at high Vgs" ) -`MPRnb( RSW ,5.0e1 ,"ohm*(um^(WR))" ,"RDSMOD = 1 zero bias source extension resistance per unit width" ) -`MPRnb( ARSW ,0.0 ,"" ,"Pre-exponential coefficient for RSW" ) -`MPRex( BRSW ,1.0e-7 ,"" ,0.0 ,"Exponential coefficient for RSW" ) -`MPRnb( RDWMIN ,0.0 ,"ohm*(um^(WR))" ,"RDSMOD = 1 drain extension resistance per unit width at high Vgs" ) -`MPRnb( RDW ,5.0e1 ,"" ,"RDSMOD = 1 zero bias drain extension resistance per unit width" ) -`MPRnb( ARDW ,0.0 ,"" ,"Pre-exponential coefficient for RDW" ) -`MPRex( BRDW ,1.0e-7 ,"" ,0.0 ,"Exponential coefficient for RDW" ) -`MPRcz( RSDR ,0.0 ,"V^(-PRSDR)" ,"Source-side drift resistance parameter - forward mode" ) -`MPRcz( RSDRR ,RSDR ,"V^(-PRSDR)" ,"Source-side drift resistance parameter - reverse mode" ) -`MPRcz( RDDR ,RSDR ,"V^(-PRDDR)" ,"Drain-side drift resistance parameter - forward mode" ) -`MPRcz( RDDRR ,RDDR ,"V^(-PRDDR)" ,"Drain-side drift resistance parameter - reverse mode" ) -`MPRnb( PRSDR ,1.0 ,"" ,"Source-side quasi-saturation parameter" ) -`MPRnb( PRDDR ,PRSDR ,"" ,"Drain-side quasi-saturation parameter" ) -`MPRnb( PRWGS ,0.0 ,"/V" ,"Gate bias dependence of source extension resistance" ) -`MPRnb( PRWGD ,PRWGS ,"/V" ,"Gate bias dependence of drain extension resistance" ) -`MPRnb( WR ,1.0 ,"" ,"W dependence parameter of S/D extension resistance" ) -`MPRnb( PRT ,1.0e-3 ,"/K" ,"Series resistance temperature coefficient" ) -`MPRnb( TRSDR ,0.0 ,"/K" ,"Source-side drift resistance temperature coefficient" ) -`MPRnb( TRDDR ,TRSDR ,"/K" ,"Drain-side drift resistance temperature coefficient" ) - -// DIBL Model -`MPRnb( PDIBL1 ,1.3 ,"" ,"DIBL output conductance parameter - forward mode" ) -`MPRnb( PDIBL1R ,PDIBL1 ,"" ,"DIBL output conductance parameter - reverse mode" ) -`MPRnb( PDIBL2 ,2.0e-4 ,"" ,"DIBL output conductance parameter" ) -`MPRnb( PDIBL2R ,PDIBL2 ,"" ,"DIBL output conductance parameter - reverse mode" ) -`MPRnb( DROUT ,1.06 ,"" ,"L dependence of DIBL effect on Rout" ) -`MPRnb( PVAG ,1.0 ,"" ,"Vgs dependence on early voltage" ) - -// Channel Length Modulation Effect -`MPRnb( PCLM ,1.3e-2 ,"" ,"Channel length modulation (CLM) parameter" ) -`MPRnb( PCLMR ,PCLM ,"" ,"Reverse model PCLM parameter" ) -`MPRnb( APCLM ,0.0 ,"" ,"Pre-exponential coefficient for PCLM" ) -`MPRnb( APCLMR ,APCLM ,"" ,"Reverse-mode pre-exponential coefficient for PCLM" ) -`MPRex( BPCLM ,1.0e-7 ,"" ,0.0 ,"Exponential coefficient for PCLM" ) -`MPRex( BPCLMR ,BPCLM ,"" ,0.0 ,"Reverse-mode exponential coefficient for PCLM" ) -`MPRnb( PCLMG ,0.0 ,"" ,"Gate bias dependence parameter for CLM" ) -`MPRnb( PCLMCV ,PCLM ,"" ,"CLM parameter for short-channel CV" ) - -// Non-Saturation Effect -`MPRnb( A1 ,0.0 ,"" ,"Non-saturation effect parameter for strong inversion Region" ) -`MPRnb( A11 ,0.0 ,"(V^-2)/K" ,"Temperature dependence of A1" ) -`MPRnb( A2 ,0.0 ,"" ,"Non-saturation effect parameter for moderate Inversion Region" ) -`MPRnb( A21 ,0.0 ,"(V^-1)/K" ,"Temperature dependence of A2" ) - -// Gate Electrode Resistance -`MPRcz( RGEXT ,0.0 ,"ohm" ,"Effective gate electrode external resistance" ) -`MPRco( RGFIN ,1.0e-3 ,"ohm" ,1.0e-3 ,inf ,"Effective gate electrode per finger per fin resistance" ) - -// Geometry Dependent Source/Drain Resistance of RGEOMOD = 0 -`MPRnb( RSHS ,0.0 ,"ohm" ,"Source-side sheet resistance" ) -`MPRnb( RSHD ,RSHS ,"ohm" ,"Drain-side sheet resistance" ) - -// Geometry Dependent Source/Drain Resistance of RGEOMOD = 1 for variability modeling -// These parameters are shared with CGEOMOD = 2 -`MPRnb( HEPI ,1.0e-8 ,"m" ,"Height of the raised source/drain on top of the fin" ) -`MPRnb( TSILI ,1.0e-8 ,"m" ,"Thickness of the silicide on top of the raised source/drain" ) -`MPRcc( RHOC ,1.0e-12 ,"ohm*(m^2)" ,1.0e-18 ,1.0e-9 ,"Contact resistivity at the silicon/silicide interface" ) -`MPRoz( RHORSD ,1.0 ,"ohm*(m)" ,"Average resistivity of silicon in the raised source/drain region" ) -`MPRcc( CRATIO ,0.5 ,"" ,0.0 ,1.0 ,"Ratio of the corner area filled with silicon to the total corner area" ) -`MPRoo( DELTAPRSD ,0.0 ,"m" ,-FPITCH ,inf ,"Change in silicon/silicide interface length due to non-rectangular epi" ) -`MPIcc( SDTERM ,0 ,"" ,0 ,1 ,"Indicator of whether the source/drain are terminated with silicide" ) -`MPRnb( LSP ,-1 ,"m" ,"Thickness of the gate sidewall spacer" ) -`MPRco( EPSRSP ,3.9 ,"" ,1.0 ,inf ,"Relative dielectric constant of the spacer" ) -`MPRoz( TGATE ,3.0e-8 ,"m" ,"Gate height on top of the hard mask" ) -`MPRcz( TMASK ,3.0e-8 ,"m" ,"Height of hard mask on top of the fin" ) -`MPRcz( ASILIEND ,0.0 ,"m^2" ,"Extra silicide cross sectional area at the two ends of the FinFET" ) -`MPRcz( ARSDEND ,0.0 ,"m^2" ,"Extra raised source/drain cross sectional areaat the two ends of the FinFET" ) -`MPRcz( PRSDEND ,0.0 ,"m" ,"Extra silicon/silicide interface perimeter at the two ends of the FinFET" ) -`MPRcc( NSDE ,2.0e25 ,"/(m^3)" ,1.0e25 ,1.0e26 ,"Source/drain active doping concentration at Leff edge" ) -`MPRnb( RGEOA ,1.0 ,"" ,"Fitting parameter for RGEOMOD=1" ) -`MPRnb( RGEOB ,0.0 ,"/m" ,"Fitting parameter for RGEOMOD=1" ) -`MPRnb( RGEOC ,0.0 ,"/m" ,"Fitting parameter for RGEOMOD=1" ) -`MPRnb( RGEOD ,0.0 ,"/m" ,"Fitting parameter for RGEOMOD=1" ) -`MPRnb( RGEOE ,0.0 ,"/m" ,"Fitting parameter for RGEOMOD=1" ) -`MPRnb( CGEOA ,1.0 ,"" ,"Fitting parameter for CGEOMOD=2" ) -`MPRnb( CGEOB ,0.0 ,"/m" ,"Fitting parameter for CGEOMOD=2" ) -`MPRnb( CGEOC ,0.0 ,"/m" ,"Fitting parameter for CGEOMOD=2" ) -`MPRnb( CGEOD ,0.0 ,"/m" ,"Fitting parameter for CGEOMOD=2" ) -`MPRcz( CGEOE ,1.0 ,"" ,"Fitting parameter for CGEOMOD=2" ) - -// Gate Current -`MPRnb( AIGBINV ,1.11e-2 ,"((F*s^2/g)^0.5)*m^-1" ,"Parameter for Igb in inversion" ) -`MPRnb( AIGBINV1 ,0.0 ,"((F*s^2/g)^0.5)*m^-1/K" ,"Parameter for Igb in inversion" ) -`MPRnb( BIGBINV ,9.49e-4 ,"((F*s^2/g)^0.5)*(m*V)^-1" ,"Parameter for Igb in inversion" ) -`MPRnb( CIGBINV ,6.0e-3 ,"/V" ,"Parameter for Igb in inversion" ) -`MPRnb( EIGBINV ,1.1 ,"V" ,"Parameter for Igb in inversion" ) -`MPRnb( NIGBINV ,3.0 ,"" ,"Parameter for Igb in inversion" ) -`MPRnb( AIGBACC ,1.36e-2 ,"((F*s^2/g)^0.5)*m^-1" ,"Parameter for Igb in accumulation" ) -`MPRnb( AIGBACC1 ,0.0 ,"((F*s^2/g)^0.5)*m^-1/K" ,"Parameter for Igb in accumulation" ) -`MPRnb( BIGBACC ,1.71e-3 ,"((F*s^2/g)^0.5)*(m*V)^-1" ,"Parameter for Igb in accumulation" ) -`MPRnb( CIGBACC ,7.5e-2 ,"/V" ,"Parameter for Igb in accumulation" ) -`MPRnb( NIGBACC ,1.0 ,"" ,"Parameter for Igb in accumulation" ) -`MPRnb( AIGC ,1.36e-2 ,"((F*s^2/g)^0.5)*m^-1" ,"Parameter for Igc in inversion" ) -`MPRnb( AIGC1 ,0.0 ,"((F*s^2/g)^0.5)*m^-1/K" ,"Parameter for Igc in inversion" ) -`MPRnb( BIGC ,1.71e-3 ,"((F*s^2/g)^0.5)*(m*V)^-1" ,"Parameter for Igc in inversion" ) -`MPRnb( CIGC ,7.5e-2 ,"/V" ,"Parameter for Igc in inversion" ) -`MPRnb( PIGCD ,1.0 ,"" ,"Parameter for Igc partition" ) -`MPRnb( DLCIGS ,0.0 ,"m" ,"Delta L for Igs model" ) -`MPRnb( AIGS ,1.36e-2 ,"((F*s^2/g)^0.5)*m^-1" ,"Parameter for Igs in inversion" ) -`MPRnb( AIGS1 ,0.0 ,"((F*s^2/g)^0.5)*m^-1/K" ,"Parameter for Igs in inversion" ) -`MPRnb( BIGS ,1.71e-3 ,"((F*s^2/g)^0.5)*(m*V)^-1" ,"Parameter for Igs in inversion" ) -`MPRnb( CIGS ,7.5e-2 ,"/V" ,"Parameter for Igs in inversion" ) -`MPRnb( DLCIGD ,DLCIGS ,"m" ,"Delta L for Igd model" ) -`MPRnb( AIGD ,AIGS ,"((F*s^2/g)^0.5)*m^-1" ,"Parameter for Igd in inversion" ) -`MPRnb( AIGD1 ,AIGS1 ,"((F*s^2/g)^0.5)*m^-1/K" ,"Parameter for Igd in inversion" ) -`MPRnb( BIGD ,BIGS ,"((F*s^2/g)^0.5)*(m*V)^-1" ,"Parameter for Igd in inversion" ) -`MPRnb( CIGD ,CIGS ,"/V" ,"Parameter for Igd in inversion" ) -`MPRnb( VFBSD ,0.0 ,"V" ,"Flatband voltage for S/D region" ) -`MPRnb( VFBSDCV ,VFBSD ,"V" ,"Flatband voltage for S/D region for C-V calculations" ) -`MPRoz( TOXREF ,1.2e-9 ,"m" ,"Target tox value" ) -`MPRnb( TOXG ,TOXP ,"m" ,"Oxide thickness for gate current model" ) -`MPRnb( NTOX ,1.0 ,"" ,"Exponent for Tox ratio" ) -`MPRnb( POXEDGE ,1.0 ,"" ,"Factor for the gate edge Tox" ) - -// GIDL/GISL Current -`MPRnb( AGISL ,6.055e-12 ,"mho" ,"Pre-exponential coefficient for GISL" ) -`MPRnb( BGISL ,3.0e8 ,"V/m" ,"Exponential coefficient for GISL" ) -`MPRnb( CGISL ,0.5 ,"V^3" ,"Parameter for body-effect of GISL" ) -`MPRnb( EGISL ,0.2 ,"V" ,"Band bending parameter for GISL" ) -`MPRnb( PGISL ,1.0 ,"" ,"Parameter for body-bias effect on GISL" ) -`MPRnb( AGIDL ,AGISL ,"mho" ,"Pre-exponential coefficient for GIDL" ) -`MPRnb( BGIDL ,BGISL ,"V/m" ,"Exponential coefficient for GIDL" ) -`MPRnb( CGIDL ,CGISL ,"V^3" ,"Parameter for body-effect of GIDL" ) -`MPRnb( EGIDL ,EGISL ,"V" ,"Band bending parameter for GIDL" ) -`MPRnb( PGIDL ,PGISL ,"" ,"Parameter for body-bias effect on GIDL" ) - -// Impact Ionization Current -// IIMOD = 1 -`MPRnb( ALPHA0 ,0.0 ,"m/V" ,"First parameter of Iii" ) -`MPRnb( ALPHA01 ,0.0 ,"m/V/K" ,"Temperature dependence of ALPHA0" ) -`MPRnb( ALPHA1 ,0.0 ,"/V" ,"L scaling parameter of Iii" ) -`MPRnb( ALPHA11 ,0.0 ,"/V/K" ,"Temperature dependence ALPHA1" ) -`MPRnb( BETA0 ,0.0 ,"/V" ,"Vds dependence parameter of Iii" ) - -// IIMOD = 2 -`MPRnb( ALPHAII0 ,0.0 ,"m/V" ,"First parameter of Iii for IIMOD=2" ) -`MPRnb( ALPHAII01 ,0.0 ,"m/V/K" ,"Temperature dependence of ALPHAII0" ) -`MPRnb( ALPHAII1 ,0.0 ,"/V" ,"L scaling parameter of Iii for IIMOD=2" ) -`MPRnb( ALPHAII11 ,0.0 ,"m/V/K" ,"Temperature dependence of ALPHAII1" ) -`MPRnb( BETAII0 ,0.0 ,"/V" ,"Vds dependence parameter of Iii" ) -`MPRnb( BETAII1 ,0.0 ,"" ,"Vds dependence parameter of Iii" ) -`MPRnb( BETAII2 ,0.1 ,"V" ,"Vds dependence parameter of Iii" ) -`MPRnb( ESATII ,1.0e7 ,"V/m" ,"Saturation channel E-field for Iii" ) -`MPRnb( LII ,0.5e-9 ,"V*m" ,"Channel length dependence parameter of Iii" ) -`MPRnb( SII0 ,0.5 ,"/V" ,"Vgs dependence parameter of Iii" ) -`MPRnb( SII1 ,0.1 ,"" ,"1st Vgs dependence parameter of Iii" ) -`MPRnb( SII2 ,0.0 ,"V" ,"2nd Vgs dependence parameter of Iii" ) -`MPRnb( SIID ,0.0 ,"V" ,"3rd Vds dependence parameter of Iii" ) -`MPRoo( IIMOD2CLAMP1 ,0.1 ,"V" ,0.0 ,inf ,"Clamp1 of SII1*Vg term in IIMOD=2 model" ) -`MPRoo( IIMOD2CLAMP2 ,0.1 ,"V" ,0.0 ,inf ,"Clamp2 of SII0*Vg term in IIMOD=2 model" ) -`MPRoo( IIMOD2CLAMP3 ,0.1 ,"V" ,0.0 ,inf ,"Clamp3 of Ratio term in IIMOD=2 model" ) - -// Accumulation Capacitance -`MPRco( EOTACC ,EOT ,"m" ,1.0e-10 ,inf ,"Equivalent oxide thickness for accumulation region" ) -`MPRnb( DELVFBACC ,0.0 ,"V" ,"Change in flatband voltage: Vfb_accumulation - Vfb_inversion" ) - -// Fringe Capacitance -// CGEOMOD=0 -`MPRcz( CFS ,2.5e-11 ,"F/m" ,"Outer fringe capacitance at source side" ) -`MPRcz( CFD ,CFS ,"F/m" ,"Outer fringe capacitance at drain side" ) - -// Overlap Capacitance for CGEOMOD = 0 and 2 -`MPRcz( CGSO ,0.0 ,"F/m" ,"Non LDD region source-gate overlap capacitance per unit channel width" ) -`MPRcz( CGDO ,CGSO ,"F/m" ,"Non LDD region drain-gate overlap capacitance per unit channel width" ) -`MPRcz( CGSL ,0.0 ,"F/m" ,"Overlap capacitance between gate and lightly-doped source region (for CGEOMOD = 0, 2)" ) -`MPRcz( CGDL ,CGSL ,"F/m" ,"Overlap capacitance between gate and lightly-doped drain region (for CGEOMOD = 0, 2)" ) -`MPRco( CKAPPAS ,0.6 ,"V" ,2.0e-2 ,inf ,"Coefficient of bias-dependent overlap capacitance for the source side (for CGEOMOD = 0, 2)" ) -`MPRco( CKAPPAD ,CKAPPAS ,"V" ,2.0e-2 ,inf ,"Coefficient of bias-dependent overlap capacitance for the drain side (for CGEOMOD = 0, 2)" ) -`MPRcz( CGBO ,0.0 ,"F/m" ,"Gate-to-substrate overlap capacitance per unit channel length per finger per NGCON" ) -`MPRcz( CGBN ,0.0 ,"F/m" ,"Gate-to-substrate overlap capacitance per unit channel length per fin per finger" ) -`MPRcz( CGBL ,0.0 ,"F/m" ,"Bias dependent component of gate-to-substrate overlap capacitance per unit channel length per fin per finger" ) -`MPRco( CKAPPAB ,0.6 ,"" ,2.0e-2 ,inf ,"Bias dependent gate-to-substrate parasitic capacitance" ) - -// Source/Drain-to-Substrate Sidewall Capacitance -`MPRcz( CSDESW ,0.0 ,"F/m" ,"Coefficient for source/drain-to-substrate sidewall capacitance" ) - -// Junction Current and Capacitance -// Junction Capacitance -`MPRnb( CJS ,5.0e-4 ,"F/m^2" ,"Unit area source-side junction capacitance at zero bias" ) -`MPRnb( CJD ,CJS ,"F/m^2" ,"Unit area drain-side junction capacitance at zero bias" ) -`MPRnb( CJSWS ,5.0e-10 ,"F/m" ,"Unit length source-side sidewall junction capacitance at zero bias" ) -`MPRnb( CJSWD ,CJSWS ,"F/m" ,"Unit length drain-side sidewall junction capacitance at zero bias" ) -`MPRnb( CJSWGS ,0.0 ,"F/m" ,"Unit length source-side gate sidewall junction capacitance at zero bias" ) -`MPRnb( CJSWGD ,CJSWGS ,"F/m" ,"Unit length drain-side gate sidewall junction capacitance at zero bias" ) -`MPRnb( PBS ,1.0 ,"V" ,"Source-side bulk junction built-in potential" ) -`MPRnb( PBD ,PBS ,"V" ,"Drain-side bulk junction built-in potential" ) -`MPRnb( PBSWS ,1.0 ,"V" ,"Built-in potential for Source-side sidewall junction capacitance" ) -`MPRnb( PBSWD ,PBSWS ,"V" ,"Built-in potential for Drain-side sidewall junction capacitance" ) -`MPRnb( PBSWGS ,PBSWS ,"V" ,"Built-in potential for Source-side gate sidewall junction capacitance" ) -`MPRnb( PBSWGD ,PBSWGS ,"V" ,"Built-in potential for Drain-side gate sidewall junction capacitance" ) -`MPRnb( MJS ,0.5 ,"" ,"Source bottom junction capacitance grading coefficient" ) -`MPRnb( MJD ,MJS ,"" ,"Drain bottom junction capacitance grading coefficient" ) -`MPRnb( MJSWS ,0.33 ,"" ,"Source sidewall junction capacitance grading coefficient" ) -`MPRnb( MJSWD ,MJSWS ,"" ,"Drain sidewall junction capacitance grading coefficient" ) -`MPRnb( MJSWGS ,MJSWS ,"" ,"Source-side gate sidewall junction capacitance grading coefficient" ) -`MPRnb( MJSWGD ,MJSWGS ,"" ,"Drain-side gate sidewall junction capacitance grading coefficient" ) - -// Second Junction for Two-Step Junction Capacitance -`MPRcz( SJS ,0.0 ,"" ,"Constant for source-side two-step second junction" ) -`MPRcz( SJD ,SJS ,"" ,"Constant for drain-side two-step second junction" ) -`MPRcz( SJSWS ,0.0 ,"" ,"Constant for source-side sidewall two-step second junction" ) -`MPRcz( SJSWD ,SJSWS ,"" ,"Constant for drain-side sidewall two-step second junction" ) -`MPRcz( SJSWGS ,0.0 ,"" ,"Constant for source-side gate sidewall two-step second junction" ) -`MPRcz( SJSWGD ,SJSWGS ,"" ,"Constant for source-side gate sidewall two-step second junction" ) -`MPRnb( MJS2 ,1.25e-1 ,"" ,"Source bottom two-step second junction capacitance grading coefficient" ) -`MPRnb( MJD2 ,MJS2 ,"" ,"Drain bottom two-step second junction capacitance grading coefficient" ) -`MPRnb( MJSWS2 ,8.3e-2 ,"" ,"Source sidewall two-step second junction capacitance grading coefficient" ) -`MPRnb( MJSWD2 ,MJSWS2 ,"" ,"Drain sidewall two-step second junction capacitance grading coefficient" ) -`MPRnb( MJSWGS2 ,MJSWS2 ,"" ,"Source-side gate sidewall two-step second junction capacitance grading coefficient" ) -`MPRnb( MJSWGD2 ,MJSWGS2 ,"" ,"Drain-side gate sidewall two-step second junction capacitance grading coefficient" ) - -// Junction Current -`MPRnb( JSS ,1.0e-4 ,"A/m^2" ,"Bottom source junction reverse saturation current density" ) -`MPRnb( JSD ,JSS ,"A/m^2" ,"Bottom drain junction reverse saturation current density" ) -`MPRnb( JSWS ,0.0 ,"A/m" ,"Unit length reverse saturation current for sidewall source junction" ) -`MPRnb( JSWD ,JSWS ,"A/m" ,"Unit length reverse saturation current for sidewall drain junction" ) -`MPRnb( JSWGS ,0.0 ,"A/m" ,"Unit length reverse saturation current for gate-edge sidewall source junction" ) -`MPRnb( JSWGD ,JSWGS ,"A/m" ,"Unit length reverse saturation current for gate-edge sidewall drain junction" ) -`MPRex( NJS ,1.0 ,"" ,0.0 ,"Source junction emission coefficient" ) -`MPRex( NJD ,NJS ,"" ,0.0 ,"Drain junction emission coefficient" ) -`MPRnb( IJTHSFWD ,0.1 ,"A" ,"Forward source diode breakdown limiting current" ) -`MPRnb( IJTHDFWD ,IJTHSFWD ,"A" ,"Forward drain diode breakdown limiting current" ) -`MPRnb( IJTHSREV ,0.1 ,"A" ,"Reverse source diode breakdown limiting current" ) -`MPRnb( IJTHDREV ,IJTHSREV ,"A" ,"Reverse drain diode breakdown limiting current" ) -`MPRnb( BVS ,1.0e1 ,"V" ,"Source diode breakdown voltage" ) -`MPRnb( BVD ,BVS ,"V" ,"Drain diode breakdown voltage" ) -`MPRnb( XJBVS ,1.0 ,"" ,"Fitting parameter for source diode breakdown current" ) -`MPRnb( XJBVD ,XJBVS ,"" ,"Fitting parameter for drain diode breakdown current" ) - -// Tunneling Component of Junction Current -`MPRnb( JTSS ,0.0 ,"A/m^2" ,"Bottom source junction trap-assisted saturation current density" ) -`MPRnb( JTSD ,JTSS ,"A/m^2" ,"Bottom drain junction trap-assisted saturation current density" ) -`MPRnb( JTSSWS ,0.0 ,"A/m" ,"Unit length trap-assisted saturation current for sidewall source junction" ) -`MPRnb( JTSSWD ,JTSSWS ,"A/m" ,"Unit length trap-assisted saturation current for sidewall drain junction" ) -`MPRnb( JTSSWGS ,0.0 ,"A/m" ,"Unit length trap-assisted saturation current for gate-edge sidewall source junction" ) -`MPRnb( JTSSWGD ,JTSSWGS ,"A/m" ,"Unit length trap-assisted saturation current for gate-edge sidewall drain junction" ) -`MPRnb( JTWEFF ,0.0 ,"m" ,"Trap-assisted tunneling current width dependence" ) -`MPRnb( NJTS ,2.0e1 ,"" ,"Non-ideality factor for JTSS" ) -`MPRnb( NJTSD ,NJTS ,"" ,"Non-ideality factor for JTSD" ) -`MPRnb( NJTSSW ,2.0e1 ,"" ,"Non-ideality factor for JTSSWS" ) -`MPRnb( NJTSSWD ,NJTSSW ,"" ,"Non-ideality factor for JTSSWD" ) -`MPRnb( NJTSSWG ,2.0e1 ,"" ,"Non-ideality factor for JTSSWGS" ) -`MPRnb( NJTSSWGD ,NJTSSWG ,"" ,"Non-ideality factor for JTSSWGD" ) -`MPRnb( VTSS ,1.0e1 ,"V" ,"Bottom source junction trap-assisted current voltage dependent parameter" ) -`MPRnb( VTSD ,VTSS ,"V" ,"Bottom drain junction trap-assisted current voltage dependent parameter" ) -`MPRnb( VTSSWS ,1.0e1 ,"V" ,"Unit length trap-assisted current voltage dependent parameter for sidewall source junction" ) -`MPRnb( VTSSWD ,VTSSWS ,"V" ,"Unit length trap-assisted current voltage dependent parameter for sidewall drain junction" ) -`MPRnb( VTSSWGS ,1.0e1 ,"V" ,"Unit length trap-assisted current voltage dependent parameter for gate-edge sidewall source junction" ) -`MPRnb( VTSSWGD ,VTSSWGS ,"V" ,"Unit length trap-assisted current voltage dependent parameter for gate-edge sidewall drain junction" ) - -// Recombination-Generation Current -`MPRnb( LINTIGEN ,0.0 ,"m" ,"Lint for thermal generation current" ) -`MPRnb( NTGEN ,1.0 ,"" ,"Thermal generation current parameter" ) -`MPRnb( AIGEN ,0.0 ,"(m^-3)*(V^-1)" ,"Thermal generation current parameter" ) -`MPRnb( BIGEN ,0.0 ,"(m^-3)*(V^-3)" ,"Thermal generation current parameter" ) - -// NQS Gate Resistance Model & NQS Charge Deficit Model -// For NQSMOD=1, Set XRCRG1=0 to turn off NQS gate resistance -`MPRnb( XRCRG1 ,1.2e1 ,"" ,"Parameter for non-quasistatic gate resistance (NQSMOD = 1) and NQSMOD = 2" ) -`MPRnb( XRCRG2 ,1.0 ,"" ,"Parameter for non-quasistatic gate resistance (NQSMOD = 1) and NQSMOD = 2" ) - -// NQS Charge Segmentation Model -`MPIcc( NSEG ,4 ,"" ,4 ,10 ,"Number of segments for NQSMOD=3 (3, 5 & 10 supported)" ) - -// Flicker Noise -`MPRnb( EF ,1.0 ,"" ,"Flicker noise frequency exponent" ) -`MPRnb( EM ,4.1e7 ,"V/m" ,"Flicker noise parameter" ) -`MPRnb( NOIA ,6.25e39 ,"(eV^-1)*(s^(1-EF))*(m^-3)" ,"Flicker noise parameter" ) -`MPRnb( NOIB ,3.125e24 ,"(eV^-1)*(s^(1-EF))*(m^-1)" ,"Flicker noise parameter" ) -`MPRnb( NOIC ,8.75e7 ,"(eV^-1)*(s^(1-EF))*(m)" ,"Flicker noise parameter" ) -`MPRnb( LINTNOI ,0.0 ,"m^2" ,"L offset for flicker noise calculation" ) - -// Thermal Noise -`MPRcz( NTNOI ,1.0 ,"" ,"Thermal noise parameter" ) -`MPRnb( TNOIA ,1.5 ,"/m" ,"Thermal noise parameter" ) -`MPRnb( TNOIB ,3.5 ,"/m" ,"Thermal noise parameter" ) -`MPRnb( RNOIA ,5.77e-1 ,"" ,"Thermal noise coefficient" ) -`MPRnb( RNOIB ,3.7e-1 ,"" ,"Thermal noise coefficient" ) - -// Parameters Controlled by Correlated Thermal Noise Switch -`ifdef __TNOIMOD1__ - `MPRnb( TNOIC ,3.5 ,"" ,"Thermal noise parameter for TNOIMOD=1" ) - `MPRnb( RNOIC ,3.95e-1 ,"" ,"Thermal noise coefficient for TNOIMOD=1" ) - `MPRex( SCALEN ,1.0e5 ,"" ,0.0 ,"Noise scaling parameter for TNOIMOD=1" ) -`endif - -// Temperature Effects -`MPRco( TNOM ,27.0 ,"Celsius" ,-`P_CELSIUS0,inf ,"Temperature at which the model is extracted" ) -`MPRnb( TBGASUB ,7.02e-4 ,"eV/K" ,"Bandgap temperature coefficient" ) -`MPRnb( TBGBSUB ,1.108e3 ,"K" ,"Bandgap temperature coefficient" ) -`MPRnb( KT1 ,0.0 ,"V" ,"Vth temperature coefficient" ) -`MPRnb( KT1L ,0.0 ,"V*m" ,"Vth temperature L coefficient" ) -`MPRnb( TSS ,0.0 ,"/K" ,"Swing temperature coefficient" ) -`MPRnb( IIT ,-0.5 ,"" ,"Impact ionization temperature dependence for IIMOD = 1" ) -`MPRnb( TII ,0.0 ,"" ,"Impact ionization temperature dependence for IIMOD = 2" ) -`MPRnb( TGIDL ,-3.0e-3 ,"/K" ,"GIDL/GISL temperature dependence" ) -`MPRnb( IGT ,2.5 ,"" ,"Gate current temperature dependence" ) -`MPRnb( TCJ ,0.0 ,"/K" ,"Temperature coefficient for CJS/CJD" ) -`MPRnb( TCJSW ,0.0 ,"/K" ,"Temperature coefficient for CJSWS/CJSWD" ) -`MPRnb( TCJSWG ,0.0 ,"/K" ,"Temperature coefficient for CJSWGS/CJSWGD" ) -`MPRnb( TPB ,0.0 ,"/K" ,"Temperature coefficient for PBS/PBD" ) -`MPRnb( TPBSW ,0.0 ,"/K" ,"Temperature coefficient for PBSWS/PBSWD" ) -`MPRnb( TPBSWG ,0.0 ,"/K" ,"Temperature coefficient for PBSWGS/PBSWGD" ) -`MPRnb( XTIS ,3.0 ,"" ,"Source junction current temperature exponent" ) -`MPRnb( XTID ,XTIS ,"" ,"Drain junction current temperature exponent" ) -`MPRnb( XTSS ,2.0e-2 ,"" ,"Power dependence of JTSS on temperature" ) -`MPRnb( XTSD ,XTSS ,"" ,"Power dependence of JTSD on temperature" ) -`MPRnb( XTSSWS ,2.0e-2 ,"" ,"Power dependence of JTSSWS on temperature" ) -`MPRnb( XTSSWD ,XTSSWS ,"" ,"Power dependence of JTSSWD on temperature" ) -`MPRnb( XTSSWGS ,2.0e-2 ,"" ,"Power dependence of JTSSWGS on temperature" ) -`MPRnb( XTSSWGD ,XTSSWGS ,"" ,"Power dependence of JTSSWGD on temperature" ) -`MPRnb( TNJTS ,0.0 ,"" ,"Temperature coefficient for NJTS" ) -`MPRnb( TNJTSD ,TNJTS ,"" ,"Temperature coefficient for NJTSD" ) -`MPRnb( TNJTSSW ,0.0 ,"" ,"Temperature coefficient for NJTSSW" ) -`MPRnb( TNJTSSWD ,TNJTSSW ,"" ,"Temperature coefficient for NJTSSWD" ) -`MPRnb( TNJTSSWG ,0.0 ,"" ,"Temperature coefficient for NJTSSWG" ) -`MPRnb( TNJTSSWGD ,TNJTSSWG ,"" ,"Temperature coefficient for NJTSSWGD" ) - -// Self Heating -`MPRcz( RTH0 ,1.0e-2 ,"ohm*m*K/W" ,"Thermal resistance" ) -`MPRcz( CTH0 ,1.0e-5 ,"W*s/m/K" ,"Thermal capacitance" ) -`MPRcz( WTH0 ,0.0 ,"m" ,"Width dependence coefficient for Rth and Cth" ) -`MPRcz( ASHEXP ,1.0 ,"" ,"Exponent to tune RTH dependence of NFINTOTAL" ) -`MPRcz( BSHEXP ,1.0 ,"" ,"Exponent to tune RTH dependence of NF" ) - -// Unified Model -`MPRoz( ACH_UFCM ,1.0 ,"m^2" ,"Area of the channel for the unified Model" ) -`MPRoz( CINS_UFCM ,1.0 ,"F/m" ,"Insulator capacitance for the unified Model" ) -`MPRoz( W_UFCM ,1.0 ,"m" ,"Effective channel width for the unified Model" ) -`MPRcz( TFIN_TOP ,1.5e-8 ,"m" ,"Top body (fin) thickness for trapezoidal triple gate" ) -`MPRco( TFIN_BASE ,1.5e-8 ,"m" ,1.0e-9 ,inf ,"Base body (fin) thickness for trapezoidal triple gate" ) -`MPRcz( QMFACTORCV ,0.0 ,"" ,"Charge dependence taking QM effects into account" ) -`MPRcz( ALPHA_UFCM ,0.5556 ,"" ,"Mobile charge scaling term taking QM effects into account" ) - -// Binning Parameters -`include "bsimcmg_binning_parameters.include" - -// Output Variables -`ifdef __OPINFO__ - (* desc= "WEFF" *) real WEFF; - (* desc= "LEFF" *) real LEFF; - (* desc= "WEFFCV" *) real WEFFCV; - (* desc= "LEFFCV" *) real LEFFCV; - (* desc= "IDS" *) real IDS; - (* desc= "IDEFF" *) real IDEFF; - (* desc= "ISEFF" *) real ISEFF; - (* desc= "IGTOT" *) real IGTOT; - (* desc= "IDSGEN" *) real IDSGEN; - (* desc= "III" *) real III; - (* desc= "IGS" *) real IGS; - (* desc= "IGD" *) real IGD; - (* desc= "IGCS" *) real IGCS; - (* desc= "IGCD" *) real IGCD; - (* desc= "IGBS" *) real IGBS; - (* desc= "IGBD" *) real IGBD; - (* desc= "IGIDL" *) real IGIDL; - (* desc= "IGISL" *) real IGISL; - (* desc= "IJSB" *) real IJSB; - (* desc= "IJDB" *) real IJDB; - (* desc= "ISUB" *) real ISUB; - (* desc= "BETA" *) real BETA; - (* desc= "VTH" *) real VTH; - (* desc= "VDSSAT" *) real VDSSAT; - (* desc= "VFB" *) real VFB; - (* desc= "GM" *) real GM; - (* desc= "GDS" *) real GDS; - (* desc= "GMBS" *) real GMBS; - (* desc= "QGI" *) real QGI; - (* desc= "QDI" *) real QDI; - (* desc= "QSI" *) real QSI; - (* desc= "QBI" *) real QBI; - (* desc= "QG" *) real QG; - (* desc= "QD" *) real QD; - (* desc= "QS" *) real QS; - (* desc= "QB" *) real QB; - (* desc= "CGGI" *) real CGGI; - (* desc= "CGSI" *) real CGSI; - (* desc= "CGDI" *) real CGDI; - (* desc= "CGEI" *) real CGEI; - (* desc= "CDGI" *) real CDGI; - (* desc= "CDDI" *) real CDDI; - (* desc= "CDSI" *) real CDSI; - (* desc= "CDEI" *) real CDEI; - (* desc= "CSGI" *) real CSGI; - (* desc= "CSDI" *) real CSDI; - (* desc= "CSSI" *) real CSSI; - (* desc= "CSEI" *) real CSEI; - (* desc= "CEGI" *) real CEGI; - (* desc= "CEDI" *) real CEDI; - (* desc= "CESI" *) real CESI; - (* desc= "CEEI" *) real CEEI; - (* desc= "CGG" *) real CGG; - (* desc= "CGS" *) real CGS; - (* desc= "CGD" *) real CGD; - (* desc= "CGE" *) real CGE; - (* desc= "CDG" *) real CDG; - (* desc= "CDD" *) real CDD; - (* desc= "CDS" *) real CDS; - (* desc= "CDE" *) real CDE; - (* desc= "CSG" *) real CSG; - (* desc= "CSD" *) real CSD; - (* desc= "CSS" *) real CSS; - (* desc= "CSE" *) real CSE; - (* desc= "CEG" *) real CEG; - (* desc= "CED" *) real CED; - (* desc= "CES" *) real CES; - (* desc= "CEE" *) real CEE; - (* desc= "CGSEXT" *) real CGSEXT; - (* desc= "CGDEXT" *) real CGDEXT; - (* desc= "CGBOV" *) real CGBOV; - (* desc= "CJST" *) real CJST; - (* desc= "CJDT" *) real CJDT; - (* desc= "RSGEO" *) real RSGEO; - (* desc= "RDGEO" *) real RDGEO; - (* desc= "CFGEO" *) real CFGEO; - (* desc= "T_TOTAL_K" *) real T_TOTAL_K; - (* desc= "T_TOTAL_C" *) real T_TOTAL_C; - (* desc= "T_DELTA_SH" *) real T_DELTA_SH; - - `ifdef __DEBUG__ - (* desc= "IGBACC" *) real IGBACC; - (* desc= "IGBINV" *) real IGBINV; - (* desc= "DIDSDVG" *) real DIDSDVG; - (* desc= "DIDSDVS" *) real DIDSDVS; - (* desc= "DIDSDVD" *) real DIDSDVD; - (* desc= "DIGSDVG" *) real DIGSDVG; - (* desc= "DIGSDVS" *) real DIGSDVS; - (* desc= "DIGSDVD" *) real DIGSDVD; - (* desc= "DIGDDVG" *) real DIGDDVG; - (* desc= "DIGDDVS" *) real DIGDDVS; - (* desc= "DIGDDVD" *) real DIGDDVD; - (* desc= "DIIIDVG" *) real DIIIDVG; - (* desc= "DIIIDVS" *) real DIIIDVS; - (* desc= "DIIIDVD" *) real DIIIDVD; - (* desc= "DIGIDLDVG" *) real DIGIDLDVG; - (* desc= "DIGIDLDVS" *) real DIGIDLDVS; - (* desc= "DIGIDLDVD" *) real DIGIDLDVD; - (* desc= "DIGISLDVG" *) real DIGISLDVG; - (* desc= "DIGISLDVS" *) real DIGISLDVS; - (* desc= "DIGISLDVD" *) real DIGISLDVD; - - `ifdef __SHMOD__ - (* desc= "CGT" *) real CGT; - (* desc= "CST" *) real CST; - (* desc= "CDT" *) real CDT; - (* desc= "DIDSDVTH" *) real DIDSDVTH; - (* desc= "DIGSDVTH" *) real DIGSDVTH; - (* desc= "DIGDDVTH" *) real DIGDDVTH; - (* desc= "DIIIDVTH" *) real DIIIDVTH; - (* desc= "DIGIDLDVTH" *) real DIGIDLDVTH; - (* desc= "DIGISLDVTH" *) real DIGISLDVTH; - (* desc= "DITHDVTH" *) real DITHDVTH; - `endif - - (* desc= "ITH" *) real ITH; - (* desc= "DITHDVG" *) real DITHDVG; - (* desc= "DITHDVS" *) real DITHDVS; - (* desc= "DITHDVD" *) real DITHDVD; - `endif -`endif - -// Variables Inside the Model -integer devsign; - -real NFINtotal; -real DevTemp; -real ids0, ids0_ov_dqi, ids, vgs, vds, vdsx, sigvds, vch, etaiv; -real vgs_noswap, vds_noswap, vgd_noswap; -real qd, qg, qs, qb; -real ni, epssub, epssp, epsratio, Eg, Eg0, Nc; -real Lg, deltaL, deltaL1, deltaLCV, Leff, Leff1, LeffCV, LeffCV_acc, Weff0, WeffCV0; -real cox, cdsc, cbox; -real nbody, phib, deltaPhi; -real T0, T0y, T1, T1y, T2, T2y, T3, T3y, T4, T4a, T5, T6, T7, T8, T9; -real Vtm, Vtm0, nVtm; -real beta, beta0 ; -real wf, wr; - -// Temperature Effects -real Tnom, TRatio, dvth_temp, delTemp, ThetaSS; -real K0_t, K0SI_t, K2SI_t, K1_t, K2SAT_t, A1_t, A2_t; -real AIGBINV_t, AIGBACC_t, AIGC_t, AIGS_t, AIGD_t; -real BETA0_t, SII0_t, BGISL_t, BGIDL_t, igtemp, PTWG_t, PTWGR_t; -real ALPHA0_t, ALPHA1_t, ALPHAII0_t, ALPHAII1_t; -real CJS_t, CJSWS_t, CJSWGD_t, CJD_t, CJSWD_t, CJSWGS_t; -real PBS_t, PBSWS_t, PBSWGS_t, PBD_t, PBSWD_t, PBSWGD_t; -real JSS_t, JSWS_t, JSWGS_t, JSD_t, JSWD_t, JSWGD_t; -real JTSS_t, JTSD_t, JTSSWS_t, JTSSWD_t, JTSSWGS_t, JTSSWGD_t; -real NJTS_t, NJTSD_t, NJTSSW_t, NJTSSWD_t, NJTSSWG_t, NJTSSWGD_t; -real K2_t; -real K0SISAT_t, K2SISAT_t; - -// Variables for analytical surface potential -real q0; -real T10, T11, T12; -real e0, e1, e2; - -// Accumulation Model -real vgsfb, vgsfbeff; - -// Short Channel Effect -real ETA0_t, ETA0R_t; -real scl, vbi, phist, dvth_vtroll, dvth_dibl, dvth_rsce, dvth_all; -real tmp, Theta_SCE, Theta_SW, Theta_DIBL, Theta_RSCE, Theta_DITS; - -// Lateral Non-uniform Doping Effect -real Mnud; - -// Body Effect for BULKMOD=1 -real ves, vesx, vesmax, veseff; -real Mob; - -// Quantum mechanical correction [units are MKS] -real coxeff, Tcen0, Tcen, dvch_qm, MTcen; -real E0, E0prime, E1, E1prime, mx, mxprime, md, mdprime; -real gprime, gfactor, gam0, gam1, kT; - -// Drain Saturation Voltage -real Vdseff, qis, qid, qbs, Dmobs; - -// Midpoint Potential and Charge -real qia, qia2, qba, dqi; -real qb0; -real eta_mu, eta_mu_cv, Eeffm, Eeffm_cv, Dmob, Dmob_cv, u0, ueff, u0_a, u0r; -real UA_t, UAR_t, UC_t, UCR_t, UCS_t, UD_t, UDR_t, U0_t, U0R_t, ETAMOB_t, Eeffs, EeffFactor; - -real Dr, WeffWRFactor; -real RSourceGeo, RDrainGeo; -real RDSWMIN_i, RDWMIN_i, RSWMIN_i; -real Rdrain, Rsource; - -real rdstemp, Rdsi, Rdss; -real RSDR_t, RSDRR_t, RDDR_t, RDDRR_t; - -real DIBLfactor, PVAGfactor, diffVds, VaDIBL, Vgst2Vtm, Moc, Mclm; -real MclmCV, inv_MclmCV; - -real Dvsat, Vdsat, inv_MEXP, DvsatCV, Nsat; -real VSAT_t, VSAT1_t, VSAT1R_t, VSATCV_t, MEXP_t, MEXPR_t, Esat, EsatL, Esat1, Esat1L, EsatCV, EsatCVL; -real WVCox, Ta, Tb, Tc; - -// Asymmetry Model -real VSAT1_a, MEXP_a, PTWG_a, RSDR_a, RDDR_a, PDIBL1_a, VSAT_a; - -// Geometry dependent Source/Drain Resistance -real mu_max, mu_rsd, rhorsd, afin, thetarsp; -real Rsp, lt, arsd_total, prsd_total, alpha; -real eta, RrsdTML, Rrsdside, Rrsd; -real Rdsgeo, Arsd, Prsd; - -// Geometry dependent fringing capacitance -real Hg, Wg, Trsd, Hrsd, Cgg_top, Cgg_side, Cfr_geo, Acorner, Ccorner; - -// Gate Electrode Resistance -`ifdef __RGATEMOD__ - real ggeltd, Rgeltd; -`endif - -// Gate Current -real Vaux_Igbinv, igbinv, igsd_mult, igsd_mult0, igbs, igbd; -real Voxacc, Vaux_Igbacc, vfbzb, igbacc; -real igcs, igcd, igc0, Vdseffx, T1_exp; -real igisl, igidl, vfbsd, igs, igd, vgs_eff, vgd_eff; -real Aechvb, Bechvb, Toxratio, Toxratioedge; - -// Impact Ionization current -real Iii, Vdiff, Vdsatii, VgsStep, Ratio, ALPHAII; - -// Accumulation Capacitance -real cox_acc; -real qg_acc, qb_acc; -real vge; - -// Parasitic Capacitance -real qgs_ov, qgd_ov, qgs_fr, qgd_fr, qds_fr; -real qgs_parasitic, qgd_parasitic, Qes, Qed, Qeg; -real vgs_overlap, vgd_overlap, vge_overlap; -real cgsp, cgdp, csbox, cdbox, cgbox, vfbsdcv; - -// Junction Current and Capacitance -real Ies, Ied, ves_jct, ved_jct, vec; -real Czbs, Czbssw, Czbsswg, Czbd, Czbdsw, Czbdswg; -real pb2, arg, sarg, Qec; -real Qesj, Qesj1, Qesj2, Qesj3, Qedj, Qedj1, Qedj2, Qedj3; -real Isbs, Isbd, Nvtms, Nvtmd; -real SslpRev, IVjsmRev, VjsmRev, SslpFwd, IVjsmFwd, VjsmFwd, XExpBVS; -real DslpRev, IVjdmRev, VjdmRev, DslpFwd, IVjdmFwd, VjdmFwd, XExpBVD; -real igentemp, idsgen, LINTIGEN_i; - -// NQS Gate Resistance -`ifdef __NQSMOD1__ - real gcrg, XRCRG1_i, XRCRG2_i; - real IdovVds; -`endif - -// NQS Charge Deficit Model -`ifdef __NQSMOD2__ - real xdpart, gtau, gcrg, XRCRG1_i, XRCRG2_i; - real IdovVds; -`endif - -// Flicker Noise -real LINTNOI_i; -real litl, Esatnoi, Leffnoi, Leffnoisq, DelClm; -real N0, Nl, Nstar, Ssi, Swi, FNPowerAt1Hz; - -// Thermal Noise -real NTNOI_i, qinv; -real Gtnoi, sid; -real gspr, gdpr; - -// Variables Controlled by Correlated Thermal Noise Switch -`ifdef __TNOIMOD1__ - real Abulk, etaa, gamma, delta, epsilon, gche; - real npart_beta, npart_theta, ctnoi, npart_c; - real noiGd0, GammaGd0, C0, sf; -`endif - -// Self Heating -`ifdef __SHMOD__ - real gth, cth; -`endif - -// Binning -real Inv_L, Inv_NFIN, Inv_LNFIN; -real NBODY_i, PHIG_i, CFD_i, CFS_i, COVS_i, COVD_i, CGSO_i, CGDO_i; -real CGSL_i, CGDL_i, CGBL_i, CKAPPAS_i, CKAPPAD_i, CKAPPAB_i; -real QMFACTOR_i, QMTCENCV_i, QMTCENCVA_i, KSATIV_i, KSATIVR_i, KSATIV_a; -real CDSC_i, CDSCD_i, CDSCD_a, CDSCDR_i, CIT_i, DVT0_i, CITR_i, CIT_a; -real DVT1_i, DVT1SS_i, PHIN_i, ETA0_i, ETA0_a, ETA0R_i, DSUB_i, VSAT_i, VSATR_i, VSATR_t; -real DVTP0_i, DVTP1_i ; -real K0_i, K01_i, K0SI_i, K0SI1_i, K2SI_i, K2SI1_i, PHIBE_i, K1_i, K11_i, K2SAT_i, K2SAT1_i; -real DELTAVSAT_i, PSAT_i, DELTAVSATCV_i, PSATCV_i, VSAT1_i, VSAT1R_i, PTWG_i, PTWGR_i, VSATCV_i; -real UP_i, U0_i, U0R_i, ETAMOB_i, NGATE_i, RDSW_i, UPR_i; -real PRWGS_i, PRWGD_i, WR_i, PDIBL1_i, PDIBL1R_i, PDIBL2_i,PDIBL2R_i, PDIBL2_a ; -real DROUT_i, PVAG_i; -real AIGBINV_i, AIGBINV1_i, BIGBINV_i, CIGBINV_i, EIGBINV_i, NIGBINV_i; -real AIGBACC_i, AIGBACC1_i, BIGBACC_i, CIGBACC_i, NIGBACC_i; -real AIGC_i, AIGC1_i, BIGC_i, CIGC_i, PIGCD_i; -real AIGS_i, AIGS1_i, BIGS_i, CIGS_i, NTOX_i, POXEDGE_i; -real AIGD_i, AIGD1_i, BIGD_i, CIGD_i; -real AGIDL_i, BGIDL_i, CGIDL_i, EGIDL_i, PGIDL_i; -real AGISL_i, BGISL_i, CGISL_i, EGISL_i, PGISL_i; -real ALPHA0_i, ALPHA1_i, ALPHAII0_i, ALPHAII1_i, BETA0_i; -real BETAII0_i, BETAII1_i, BETAII2_i, ESATII_i; -real LII_i, SII0_i, SII1_i, SII2_i, SIID_i, TII_i; -real MEXP_i, MEXPR_i; -real PCLM_i, PCLMG_i, PCLMCV_i, PCLM_a, PCLMR_i; -real A1_i, A2_i, A11_i, A21_i; -real K1RSCE_i, LPE0_i, DVTSHIFT_i, DVTSHIFT_a, DVTSHIFTR_i ; -real UA_i, UC_i, EU_i, UD_i, UCS_i, UAR_i, EUR_i, UCR_i, UDR_i, UA_a, UD_a, UC_a, EU_a; -real UA1_i, UA1R_i, UC1_i, UD1_i, UCSTE_i, UTE_i, UTL_i, EMOBT_i, UC1R_i, UD1R_i, UTER_i, UTLR_i; -real PTWGT_i; -real AT_i, ATCV_i, ATR_i; -real RDW_i, RSW_i; -real PRT_i, KT1_i, TSS_i, IIT_i, IGT_i, TGIDL_i; -real NTGEN_i, AIGEN_i, BIGEN_i; -real K0SISAT_i, K0SISAT1_i; -real K2SISAT_i, K2SISAT1_i; -real K2_i, K21_i; - -// Variables of Unified Finfet Compact Model -real Cins, Ach, Weff_UFCM, qdep,rc, vth_fixed_factor_Sub, vth_fixed_factor_SI, qm, Qdep_ov_Cins, qi_acc_for_QM; -real fieldnormalizationfactor, auxQMfact, QMFACTORCVfinal; -real psipclamp, sqrtpsip, nq, F0; - -real LSP_i; - -`Cfringe_2d_vars(); - -//=================================================== -// analog block begins -//=================================================== -analog begin - - // ************************************************ - // * Geometry dependent calculations * - // ************************************************ - begin : CMGBiasIndepCalc - - // Variable Initialization to Prevent Hidden States - qid = 0.0; - qis = 0.0; - qba = 0.0; - T11 = 0.0; - T12 = 0.0; - ids = 0.0; - sigvds = 0.0; - Iii = 0.0; - qd = 0.0; - qg = 0.0; - qs = 0.0; - qb = 0.0; - Weff0 = 0.0; - WeffCV0 = 0.0; - CJS_t = 0.0; - CJSWS_t = 0.0; - CJSWGS_t = 0.0; - CJD_t = 0.0; - CJSWD_t = 0.0; - CJSWGD_t = 0.0; - PBS_t = 0.0; - PBSWS_t = 0.0; - PBSWGS_t = 0.0; - PBD_t = 0.0; - PBSWD_t = 0.0; - PBSWGD_t = 0.0; - JSS_t = 0.0; - JSWS_t = 0.0; - JSWGS_t = 0.0; - JSD_t = 0.0; - JSWD_t = 0.0; - JSWGD_t = 0.0; - JTSS_t = 0.0; - JTSSWS_t = 0.0; - JTSSWGS_t = 0.0; - JTSD_t = 0.0; - JTSSWD_t = 0.0; - JTSSWGD_t = 0.0; - NJTS_t = 0.0; - NJTSSW_t = 0.0; - NJTSSWG_t = 0.0; - NJTSD_t = 0.0; - NJTSSWD_t = 0.0; - NJTSSWGD_t = 0.0; - Ies = 0.0; - Ied = 0.0; - Czbs = 0.0; - Czbssw = 0.0; - Czbsswg = 0.0; - Czbd = 0.0; - Czbdsw = 0.0; - Czbdswg = 0.0; - Qes = 0.0; - Qed = 0.0; - Qeg = 0.0; - Isbs = 0.0; - Isbd = 0.0; - Nvtms = 0.0; - Nvtmd = 0.0; - SslpRev = 0.0; - IVjsmRev = 0.0; - VjsmRev = 0.0; - SslpFwd = 0.0; - IVjsmFwd = 0.0; - VjsmFwd = 0.0; - DslpRev = 0.0; - IVjdmRev = 0.0; - VjdmRev = 0.0; - DslpFwd = 0.0; - IVjdmFwd = 0.0; - VjdmFwd = 0.0; - XExpBVS = 0.0; - XExpBVD = 0.0; - idsgen = 0.0; - q0 = 0.0; - Tcen = 0.0; - MTcen = 0.0; - Rdrain = 0.0; - Rsource = 0.0; - Cfr_geo = 0.0; - igbinv = 0.0; - igbs = 0.0; - igbd = 0.0; - igbacc = 0.0; - igcs = 0.0; - igcd = 0.0; - igidl = 0.0; - igisl = 0.0; - igs = 0.0; - igd = 0.0; - cox_acc = 0.0; - CGSO_i = 0.0; - CGDO_i = 0.0; - qb_acc = 0.0; - qg_acc = 0.0; - qgs_fr = 0.0; - qgd_fr = 0.0; - qds_fr = 0.0; - qgs_parasitic = 0.0; - qgd_parasitic = 0.0; - FNPowerAt1Hz = 0.0; - Gtnoi = 0.0; - gspr = 0.0; - gdpr = 0.0; - Dr = 1.0; - CDSCDR_i = 0.0; - ETA0R_i = 0.0; - VSAT1R_i = 0.0; - VSAT1R_t = 0.0; - MEXPR_i = 0.0; - MEXPR_t = 0.0; - PTWGR_i = 0.0; - PTWGR_t = 0.0; - PDIBL1R_i = 0.0; - PDIBL2R_i = 0.0; - PHIBE_i = 0.0; - K1_i = 0.0; - K11_i = 0.0; - K2SAT_i = 0.0; - K2SAT1_i = 0.0; - KSATIVR_i = 0.0; - K2_i = 0.0; - K21_i = 0.0; - UC_i = 0.0; - UC1_i = 0.0; - UC_t = 0.0; - U0R_i = 0.0; - UPR_i = 0.0; - EUR_i = 0.0; - ATR_i = 0.0; - CITR_i = 0.0; - ETA0R_i = 0.0; - DVTP0_i = 0.0; - DVTP1_i = 0.0; - PDIBL2R_i = 0.0; - PCLMR_i = 0.0; - LeffCV_acc = 0.0; - RDDRR_t = 0.0; - RSDRR_t = 0.0; - Rdsi = 0.0; - T3y = 0.0; - Tcen0 = 0.0; - veseff = 0.0; - U0R_t = 0.0; - UAR_t = 0.0; - UCR_t = 0.0; - UDR_t = 0.0; - VSAT_a = 0.0; - DVTSHIFTR_i = 0.0; - UA1R_i = 0.0; - UAR_i = 0.0; - UC1R_i = 0.0; - UCR_i = 0.0; - UD1R_i = 0.0; - UDR_i = 0.0; - UTER_i = 0.0; - UTLR_i = 0.0; - VSATR_i = 0.0; - VSATR_t = 0.0; - u0r = 0.0; - - // Thermal Noise - sid = 0.0; - - `ifdef __TNOIMOD1__ - ctnoi = 0.0; - sf = 0.0; - C0 = 0.0; - gamma = 0.0; - delta = 0.0; - `endif - - `ifdef __RGATEMOD__ - ggeltd = 0.0; - `endif - - // Unified FinFET Model - qm = 1.0; - Cins = 1.0; - Ach = 1.0; - Weff_UFCM = 1.0; - qdep = -1.0; - rc = 1.0; - vth_fixed_factor_Sub = 1.0; - vth_fixed_factor_SI = 1.0; - qi_acc_for_QM = 0.0; - fieldnormalizationfactor = 0.0; - auxQMfact = 0.0; - QMFACTORCVfinal = 0.0; - psipclamp = 1.0; - sqrtpsip = 1.0; - nq = 1.0; - F0 = 0.0; - e0 = 0.0; - e1 = 0.0; - e2 = 0.0; - Qdep_ov_Cins = 0.0; - - // Constants - if ( TYPE == `ntype ) begin - devsign = 1; - end else begin - devsign = -1; - end - - epssub = EPSRSUB * `EPS0; - epssp = EPSRSP * `EPS0; - cbox = EPSROX * `EPS0 / EOTBOX; - epsratio = EPSRSUB / EPSROX; - - if ($port_connected(t) == 1) begin - `ifdef __SHMOD__ - if (SHMOD == 0) begin - if (SH_WARN == 1) begin - $strobe("The optional 5th terminal is present but not active because SHMOD=0."); - end - end - `else - Temp(t) <+ 0.0; - if (SH_WARN == 1) begin - $strobe("The optional 5th terminal is present but not active because the model was not compiled with self-heating enabled (__SHMOD__ was not activated)."); - end - `endif - end - - // Constants for Quantum Mechanical Effects - mx = 0.916 * `MEL; - mxprime = 0.190 * `MEL; - md = 0.190 * `MEL; - mdprime = 0.417 * `MEL; - gprime = 4.0; - gfactor = 2.0; - - // Effective Channel Length for I-V / C-V - Lg = L + XL; - deltaL = LINT + LL * pow(Lg, -LLN); - deltaL1 = LINT + LL * pow(Lg+DLBIN, -LLN); - deltaLCV = DLC + LLC * pow(Lg, -LLN); - Leff = Lg - 2.0 * deltaL; - Leff1 = Lg + DLBIN - 2.0 * deltaL1; //Used in the binning equations only - LeffCV = Lg - 2.0 * deltaLCV; - if (BULKMOD != 0) LeffCV_acc = LeffCV - DLCACC; - - // Total Fins - NFINtotal = NFIN * NF; - - // Range Checking on Leff and Leff1 - if (Leff <= 0.0) begin - $strobe("Fatal: Leff = %e is not positive.", Leff); - $finish(0); - end else if (Leff <= 1.0e-9) begin - $strobe("Warning: Leff = %e <= 1.0e-9.", Leff); - end - - if (Leff1 <= 0.0) begin - $strobe("Fatal: Leff1 = %e is not positive.", Leff1); - $finish(0); - end else if (Leff1 <= 1.0e-9) begin - $strobe("Warning: Leff1 = %e <= 1.0e-9.", Leff1); - end - - // Binning - Inv_L = 1.0e-6 / (Leff1); - Inv_NFIN = 1.0 / NFIN; - Inv_LNFIN = 1.0e-6 / (Leff1 * NFIN); - - // Nbody Binning Equation for UFCM Parameters - NBODY_i = NBODY + Inv_L * LNBODY + Inv_NFIN * NNBODY + Inv_LNFIN * PNBODY; - - if (NBODYN1 != 0.0) begin - NBODY_i = NBODY_i * (1.0 + NBODYN1/NFIN * lln(1.0 + NFIN/NBODYN2)); - end - - // Model Parameters for Unified FinFET Compact Model by Juan Duarte 10/2013 - case (GEOMOD) - 0: begin // Double Gate - if (!$param_given(TFIN_TOP) || !$param_given(TFIN_BASE)) begin - Weff_UFCM = 2.0 * HFIN; - Cins = Weff_UFCM * EPSROX * `EPS0 / EOT; - Ach = HFIN * TFIN; - rc = (2.0 * Cins / (Weff_UFCM * Weff_UFCM * epssub / Ach)); - Qdep_ov_Cins = -`q * NBODY_i * Ach / Cins; - end else begin - Weff_UFCM = 2.0 * sqrt( HFIN * HFIN + (TFIN_TOP - TFIN_BASE) * (TFIN_TOP - TFIN_BASE) / 4.0); - Cins = Weff_UFCM * EPSROX * `EPS0 / EOT; - Ach = HFIN * (TFIN_TOP + TFIN_BASE) / 2.0; - rc = (2.0 * Cins / (Weff_UFCM * Weff_UFCM * epssub / Ach)); - Qdep_ov_Cins = -`q * NBODY_i * Ach / Cins; - end - end - 1: begin // Triple Gate - if (!$param_given(TFIN_TOP) || !$param_given(TFIN_BASE)) begin - Weff_UFCM = 2.0 * HFIN + TFIN; - Cins = Weff_UFCM * EPSROX * `EPS0 / EOT; - Ach = HFIN * TFIN; - rc = (2.0 * Cins / (Weff_UFCM * Weff_UFCM * epssub / Ach)); - Qdep_ov_Cins = -`q * NBODY_i * Ach / Cins; - end else begin - Weff_UFCM = 2.0 * sqrt(HFIN * HFIN + (TFIN_TOP - TFIN_BASE) * (TFIN_TOP - TFIN_BASE) / 4.0) + TFIN_TOP; - Cins = Weff_UFCM * EPSROX * `EPS0 / EOT; - Ach = HFIN * (TFIN_TOP + TFIN_BASE) / 2.0; - rc = (2.0 * Cins /(Weff_UFCM * Weff_UFCM * epssub / Ach)); - Qdep_ov_Cins = -`q * NBODY_i * Ach / Cins; - end - end - 2: begin // Quadruple Gate - if (!$param_given(TFIN_TOP) || !$param_given(TFIN_BASE)) begin - Weff_UFCM = 2.0 * HFIN + 2.0 * TFIN; - Cins = Weff_UFCM * EPSROX * `EPS0 / EOT; - Ach = HFIN * TFIN; - rc = (2.0 * Cins / (Weff_UFCM * Weff_UFCM * epssub / Ach)); - Qdep_ov_Cins = -`q * NBODY_i * Ach / Cins; - end else begin - Weff_UFCM = 2.0 * sqrt(HFIN * HFIN + (TFIN_TOP - TFIN_BASE) * (TFIN_TOP - TFIN_BASE) / 4.0) + TFIN_TOP + TFIN_BASE; - Cins = Weff_UFCM * EPSROX * `EPS0 / EOT; - Ach = HFIN * (TFIN_TOP + TFIN_BASE) / 2.0; - rc = (2.0 * Cins / (Weff_UFCM * Weff_UFCM * epssub / Ach)); - Qdep_ov_Cins = -`q * NBODY_i * Ach / Cins; - end - end - 3: begin // Cylindrical Gate - Weff_UFCM = `M_PI * D; - Cins = 2.0 * `M_PI * EPSROX * `EPS0 / ln(1.0 + 2.0 * EOT / D); - Ach = `M_PI * D * D / 4.0; - rc = (2.0 * Cins / (Weff_UFCM * Weff_UFCM * epssub / Ach)); - Qdep_ov_Cins = -`q * NBODY_i * Ach / Cins; - end - 4: begin // Unified Model - Weff_UFCM = W_UFCM; - Cins = CINS_UFCM; - Ach = ACH_UFCM; - rc = (2.0 * Cins / (Weff_UFCM * Weff_UFCM * epssub / Ach)); - Qdep_ov_Cins = -`q * NBODY_i * Ach / Cins; - end - endcase - - // Cox Definition - cox = Cins / Weff_UFCM; - if (BULKMOD != 0) begin - cox_acc = cox * EOT / EOTACC; - end - - // Effective Width Calculation - Weff0 = Weff_UFCM - DELTAW; - WeffCV0 = Weff_UFCM - DELTAWCV; - - // SCE Scaling Length - scl = sqrt((epssub * Ach / Cins) * (1.0 + Ach * Cins / (2.0 * epssub * Weff_UFCM * Weff_UFCM))); - - // Binning Equations (Process Parameters) - PHIG_i = PHIG + Inv_L * LPHIG + Inv_NFIN * NPHIG + Inv_LNFIN * PPHIG; - NGATE_i = NGATE + Inv_L * LNGATE + Inv_NFIN * NNGATE + Inv_LNFIN * PNGATE; - - // Binning Equations (Model Parameters) - CIT_i = CIT + Inv_L * LCIT + Inv_NFIN * NCIT + Inv_LNFIN * PCIT; - CDSC_i = CDSC + Inv_L * LCDSC + Inv_NFIN * NCDSC + Inv_LNFIN * PCDSC; - CDSCD_i = CDSCD + Inv_L * LCDSCD + Inv_NFIN * NCDSCD + Inv_LNFIN * PCDSCD; - DVT0_i = DVT0 + Inv_L * LDVT0 + Inv_NFIN * NDVT0 + Inv_LNFIN * PDVT0; - DVT1_i = DVT1 + Inv_L * LDVT1 + Inv_NFIN * NDVT1 + Inv_LNFIN * PDVT1; - DVT1SS_i = DVT1SS + Inv_L * LDVT1SS + Inv_NFIN * NDVT1SS + Inv_LNFIN * PDVT1SS; - PHIN_i = PHIN + Inv_L * LPHIN + Inv_NFIN * NPHIN + Inv_LNFIN * PPHIN; - ETA0_i = ETA0 + Inv_L * LETA0 + Inv_NFIN * NETA0 + Inv_LNFIN * PETA0; - DSUB_i = DSUB + Inv_L * LDSUB + Inv_NFIN * NDSUB + Inv_LNFIN * PDSUB; - K1RSCE_i = K1RSCE + Inv_L * LK1RSCE + Inv_NFIN * NK1RSCE + Inv_LNFIN * PK1RSCE; - LPE0_i = LPE0 + Inv_L * LLPE0 + Inv_NFIN * NLPE0 + Inv_LNFIN * PLPE0; - DVTSHIFT_i = DVTSHIFT + Inv_L * LDVTSHIFT + Inv_NFIN * NDVTSHIFT + Inv_LNFIN * PDVTSHIFT; - K0_i = K0 + Inv_L * LK0 + Inv_NFIN * NK0 + Inv_LNFIN * PK0; - K01_i = K01 + Inv_L * LK01 + Inv_NFIN * NK01 + Inv_LNFIN * PK01; - K0SI_i = K0SI + Inv_L * LK0SI + Inv_NFIN * NK0SI + Inv_LNFIN * PK0SI; - K0SI1_i = K0SI1 + Inv_L * LK0SI1 + Inv_NFIN * NK0SI1 + Inv_LNFIN * PK0SI1; - K2SI_i = K2SI + Inv_L * LK2SI + Inv_NFIN * NK2SI + Inv_LNFIN * PK2SI; - K2SI1_i = K2SI1 + Inv_L * LK2SI1 + Inv_NFIN * NK2SI1 + Inv_LNFIN * PK2SI1; - K0SISAT_i = K0SISAT + Inv_L * LK0SISAT + Inv_NFIN * NK0SISAT + Inv_LNFIN * PK0SISAT; - K0SISAT1_i = K0SISAT1 + Inv_L * LK0SISAT1 + Inv_NFIN * NK0SISAT1 + Inv_LNFIN * PK0SISAT1; - K2SISAT_i = K2SISAT + Inv_L * LK2SISAT + Inv_NFIN * NK2SISAT + Inv_LNFIN * PK2SISAT; - K2SISAT1_i = K2SISAT1 + Inv_L * LK2SISAT1 + Inv_NFIN * NK2SISAT1 + Inv_LNFIN * PK2SISAT1; - - if (BULKMOD != 0) begin - if (BULKMOD == 2) begin - K2_i = K2 + Inv_L * LK2 + Inv_NFIN * NK2 + Inv_LNFIN * PK2; - K21_i = K21 + Inv_L * LK21 + Inv_NFIN * NK21 + Inv_LNFIN * PK21; - K2SAT_i = K2SAT + Inv_L * LK2SAT + Inv_NFIN * NK2SAT + Inv_LNFIN * PK2SAT; - K2SAT1_i = K2SAT1 + Inv_L * LK2SAT1 + Inv_NFIN * NK2SAT1 + Inv_LNFIN * PK2SAT1; - end - PHIBE_i = PHIBE + Inv_L * LPHIBE + Inv_NFIN * NPHIBE + Inv_LNFIN * PPHIBE; - K1_i = K1 + Inv_L * LK1 + Inv_NFIN * NK1 + Inv_LNFIN * PK1; - K11_i = K11 + Inv_L * LK11 + Inv_NFIN * NK11 + Inv_LNFIN * PK11; - end - QMFACTOR_i = QMFACTOR + Inv_L * LQMFACTOR + Inv_NFIN * NQMFACTOR + Inv_LNFIN * PQMFACTOR; - QMTCENCV_i = QMTCENCV + Inv_L * LQMTCENCV + Inv_NFIN * NQMTCENCV + Inv_LNFIN * PQMTCENCV; - QMTCENCVA_i = QMTCENCVA + Inv_L * LQMTCENCVA + Inv_NFIN * NQMTCENCVA + Inv_LNFIN * PQMTCENCVA; - VSAT_i = VSAT + Inv_L * LVSAT + Inv_NFIN * NVSAT + Inv_LNFIN * PVSAT; - VSAT1_i = VSAT1 + Inv_L * LVSAT1 + Inv_NFIN * NVSAT1 + Inv_LNFIN * PVSAT1; - VSATCV_i = VSATCV + Inv_L * LVSATCV + Inv_NFIN * NVSATCV + Inv_LNFIN * PVSATCV; - DELTAVSAT_i = DELTAVSAT + Inv_L * LDELTAVSAT + Inv_NFIN * NDELTAVSAT + Inv_LNFIN * PDELTAVSAT; - PSAT_i = PSAT + Inv_L * LPSAT + Inv_NFIN * NPSAT + Inv_LNFIN * PPSAT; - DELTAVSATCV_i = DELTAVSATCV + Inv_L * LDELTAVSATCV + Inv_NFIN * NDELTAVSATCV + Inv_LNFIN * PDELTAVSATCV; - PSATCV_i = PSATCV + Inv_L * LPSATCV + Inv_NFIN * NPSATCV + Inv_LNFIN * PPSATCV; - KSATIV_i = KSATIV + Inv_L * LKSATIV + Inv_NFIN * NKSATIV + Inv_LNFIN * PKSATIV; - MEXP_i = MEXP + Inv_L * LMEXP + Inv_NFIN * NMEXP + Inv_LNFIN * PMEXP; - PTWG_i = PTWG + Inv_L * LPTWG + Inv_NFIN * NPTWG + Inv_LNFIN * PPTWG; - U0_i = U0 + Inv_L * LU0 + Inv_NFIN * NU0 + Inv_LNFIN * PU0; - ETAMOB_i = ETAMOB + Inv_L * LETAMOB + Inv_NFIN * NETAMOB + Inv_LNFIN * PETAMOB; - UP_i = UP + Inv_L * LUP + Inv_NFIN * NUP + Inv_LNFIN * PUP; - UA_i = UA + Inv_L * LUA + Inv_NFIN * NUA + Inv_LNFIN * PUA; - if (BULKMOD != 0) begin - UC_i = UC + Inv_L * LUC + Inv_NFIN * NUC + Inv_LNFIN * PUC; - end - EU_i = EU + Inv_L * LEU + Inv_NFIN * NEU + Inv_LNFIN * PEU; - UD_i = UD + Inv_L * LUD + Inv_NFIN * NUD + Inv_LNFIN * PUD; - UCS_i = UCS + Inv_L * LUCS + Inv_NFIN * NUCS + Inv_LNFIN * PUCS; - PCLM_i = PCLM + Inv_L * LPCLM + Inv_NFIN * NPCLM + Inv_LNFIN * PPCLM; - PCLMG_i = PCLMG + Inv_L * LPCLMG + Inv_NFIN * NPCLMG + Inv_LNFIN * PPCLMG; - PCLMCV_i = PCLMCV + Inv_L * LPCLMCV + Inv_NFIN * NPCLMCV + Inv_LNFIN * PPCLMCV; - A1_i = A1 + Inv_L * LA1 + Inv_NFIN * NA1 + Inv_LNFIN * PA1; - A11_i = A11 + Inv_L * LA11 + Inv_NFIN * NA11 + Inv_LNFIN * PA11; - A2_i = A2 + Inv_L * LA2 + Inv_NFIN * NA2 + Inv_LNFIN * PA2; - A21_i = A21 + Inv_L * LA21 + Inv_NFIN * NA21 + Inv_LNFIN * PA21; - RDSW_i = RDSW + Inv_L * LRDSW + Inv_NFIN * NRDSW + Inv_LNFIN * PRDSW; - RSW_i = RSW + Inv_L * LRSW + Inv_NFIN * NRSW + Inv_LNFIN * PRSW; - RDW_i = RDW + Inv_L * LRDW + Inv_NFIN * NRDW + Inv_LNFIN * PRDW; - PRWGD_i = PRWGD + Inv_L * LPRWGD + Inv_NFIN * NPRWGD + Inv_LNFIN * PPRWGD; - PRWGS_i = PRWGS + Inv_L * LPRWGS + Inv_NFIN * NPRWGS + Inv_LNFIN * PPRWGS; - WR_i = WR + Inv_L * LWR + Inv_NFIN * NWR + Inv_LNFIN * PWR; - PDIBL1_i = PDIBL1 + Inv_L * LPDIBL1 + Inv_NFIN * NPDIBL1 + Inv_LNFIN * PPDIBL1; - PDIBL2_i = PDIBL2 + Inv_L * LPDIBL2 + Inv_NFIN * NPDIBL2 + Inv_LNFIN * PPDIBL2; - DROUT_i = DROUT + Inv_L * LDROUT + Inv_NFIN * NDROUT + Inv_LNFIN * PDROUT; - PVAG_i = PVAG + Inv_L * LPVAG + Inv_NFIN * NPVAG + Inv_LNFIN * PPVAG; - AIGBINV_i = AIGBINV + Inv_L * LAIGBINV + Inv_NFIN * NAIGBINV + Inv_LNFIN * PAIGBINV; - AIGBINV1_i = AIGBINV1 + Inv_L * LAIGBINV1 + Inv_NFIN * NAIGBINV1 + Inv_LNFIN * PAIGBINV1; - BIGBINV_i = BIGBINV + Inv_L * LBIGBINV + Inv_NFIN * NBIGBINV + Inv_LNFIN * PBIGBINV; - CIGBINV_i = CIGBINV + Inv_L * LCIGBINV + Inv_NFIN * NCIGBINV + Inv_LNFIN * PCIGBINV; - EIGBINV_i = EIGBINV + Inv_L * LEIGBINV + Inv_NFIN * NEIGBINV + Inv_LNFIN * PEIGBINV; - NIGBINV_i = NIGBINV + Inv_L * LNIGBINV + Inv_NFIN * NNIGBINV + Inv_LNFIN * PNIGBINV; - AIGBACC_i = AIGBACC + Inv_L * LAIGBACC + Inv_NFIN * NAIGBACC + Inv_LNFIN * PAIGBACC; - AIGBACC1_i = AIGBACC1 + Inv_L * LAIGBACC1 + Inv_NFIN * NAIGBACC1 + Inv_LNFIN * PAIGBACC1; - BIGBACC_i = BIGBACC + Inv_L * LBIGBACC + Inv_NFIN * NBIGBACC + Inv_LNFIN * PBIGBACC; - CIGBACC_i = CIGBACC + Inv_L * LCIGBACC + Inv_NFIN * NCIGBACC + Inv_LNFIN * PCIGBACC; - NIGBACC_i = NIGBACC + Inv_L * LNIGBACC + Inv_NFIN * NNIGBACC + Inv_LNFIN * PNIGBACC; - AIGC_i = AIGC + Inv_L * LAIGC + Inv_NFIN * NAIGC + Inv_LNFIN * PAIGC; - AIGC1_i = AIGC1 + Inv_L * LAIGC1 + Inv_NFIN * NAIGC1 + Inv_LNFIN * PAIGC1; - BIGC_i = BIGC + Inv_L * LBIGC + Inv_NFIN * NBIGC + Inv_LNFIN * PBIGC; - CIGC_i = CIGC + Inv_L * LCIGC + Inv_NFIN * NCIGC + Inv_LNFIN * PCIGC; - PIGCD_i = PIGCD + Inv_L * LPIGCD + Inv_NFIN * NPIGCD + Inv_LNFIN * PPIGCD; - AIGS_i = AIGS + Inv_L * LAIGS + Inv_NFIN * NAIGS + Inv_LNFIN * PAIGS; - AIGS1_i = AIGS1 + Inv_L * LAIGS1 + Inv_NFIN * NAIGS1 + Inv_LNFIN * PAIGS1; - BIGS_i = BIGS + Inv_L * LBIGS + Inv_NFIN * NBIGS + Inv_LNFIN * PBIGS; - CIGS_i = CIGS + Inv_L * LCIGS + Inv_NFIN * NCIGS + Inv_LNFIN * PCIGS; - AIGD_i = AIGD + Inv_L * LAIGD + Inv_NFIN * NAIGD + Inv_LNFIN * PAIGD; - AIGD1_i = AIGD1 + Inv_L * LAIGD1 + Inv_NFIN * NAIGD1 + Inv_LNFIN * PAIGD1; - BIGD_i = BIGD + Inv_L * LBIGD + Inv_NFIN * NBIGD + Inv_LNFIN * PBIGD; - CIGD_i = CIGD + Inv_L * LCIGD + Inv_NFIN * NCIGD + Inv_LNFIN * PCIGD; - NTOX_i = NTOX + Inv_L * LNTOX + Inv_NFIN * NNTOX + Inv_LNFIN * PNTOX; - POXEDGE_i = POXEDGE + Inv_L * LPOXEDGE + Inv_NFIN * NPOXEDGE + Inv_LNFIN * PPOXEDGE; - AGIDL_i = AGIDL + Inv_L * LAGIDL + Inv_NFIN * NAGIDL + Inv_LNFIN * PAGIDL; - BGIDL_i = BGIDL + Inv_L * LBGIDL + Inv_NFIN * NBGIDL + Inv_LNFIN * PBGIDL; - CGIDL_i = CGIDL + Inv_L * LCGIDL + Inv_NFIN * NCGIDL + Inv_LNFIN * PCGIDL; - EGIDL_i = EGIDL + Inv_L * LEGIDL + Inv_NFIN * NEGIDL + Inv_LNFIN * PEGIDL; - PGIDL_i = PGIDL + Inv_L * LPGIDL + Inv_NFIN * NPGIDL + Inv_LNFIN * PPGIDL; - AGISL_i = AGISL + Inv_L * LAGISL + Inv_NFIN * NAGISL + Inv_LNFIN * PAGISL; - BGISL_i = BGISL + Inv_L * LBGISL + Inv_NFIN * NBGISL + Inv_LNFIN * PBGISL; - CGISL_i = CGISL + Inv_L * LCGISL + Inv_NFIN * NCGISL + Inv_LNFIN * PCGISL; - EGISL_i = EGISL + Inv_L * LEGISL + Inv_NFIN * NEGISL + Inv_LNFIN * PEGISL; - PGISL_i = PGISL + Inv_L * LPGISL + Inv_NFIN * NPGISL + Inv_LNFIN * PPGISL; - ALPHA0_i = ALPHA0 + Inv_L * LALPHA0 + Inv_NFIN * NALPHA0 + Inv_LNFIN * PALPHA0; - ALPHA1_i = ALPHA1 + Inv_L * LALPHA1 + Inv_NFIN * NALPHA1 + Inv_LNFIN * PALPHA1; - ALPHAII0_i = ALPHAII0 + Inv_L * LALPHAII0 + Inv_NFIN * NALPHAII0 + Inv_LNFIN * PALPHAII0; - ALPHAII1_i = ALPHAII1 + Inv_L * LALPHAII1 + Inv_NFIN * NALPHAII1 + Inv_LNFIN * PALPHAII1; - BETA0_i = BETA0 + Inv_L * LBETA0 + Inv_NFIN * NBETA0 + Inv_LNFIN * PBETA0; - BETAII0_i = BETAII0 + Inv_L * LBETAII0 + Inv_NFIN * NBETAII0 + Inv_LNFIN * PBETAII0; - BETAII1_i = BETAII1 + Inv_L * LBETAII1 + Inv_NFIN * NBETAII1 + Inv_LNFIN * PBETAII1; - BETAII2_i = BETAII2 + Inv_L * LBETAII2 + Inv_NFIN * NBETAII2 + Inv_LNFIN * PBETAII2; - ESATII_i = ESATII + Inv_L * LESATII + Inv_NFIN * NESATII + Inv_LNFIN * PESATII; - LII_i = LII + Inv_L * LLII + Inv_NFIN * NLII + Inv_LNFIN * PLII; - SII0_i = SII0 + Inv_L * LSII0 + Inv_NFIN * NSII0 + Inv_LNFIN * PSII0; - SII1_i = SII1 + Inv_L * LSII1 + Inv_NFIN * NSII1 + Inv_LNFIN * PSII1; - SII2_i = SII2 + Inv_L * LSII2 + Inv_NFIN * NSII2 + Inv_LNFIN * PSII2; - SIID_i = SIID + Inv_L * LSIID + Inv_NFIN * NSIID + Inv_LNFIN * PSIID; - TII_i = TII + Inv_L * LTII + Inv_NFIN * NTII + Inv_LNFIN * PTII; - CFS_i = CFS + Inv_L * LCFS + Inv_NFIN * NCFS + Inv_LNFIN * PCFS; - CFD_i = CFD + Inv_L * LCFD + Inv_NFIN * NCFD + Inv_LNFIN * PCFD; - COVS_i = COVS + Inv_L * LCOVS + Inv_NFIN * NCOVS + Inv_LNFIN * PCOVS; - COVD_i = COVD + Inv_L * LCOVD + Inv_NFIN * NCOVD + Inv_LNFIN * PCOVD; - CGSL_i = CGSL + Inv_L * LCGSL + Inv_NFIN * NCGSL + Inv_LNFIN * PCGSL; - CGDL_i = CGDL + Inv_L * LCGDL + Inv_NFIN * NCGDL + Inv_LNFIN * PCGDL; - CGBL_i = CGBL + Inv_L * LCGBL + Inv_NFIN * NCGBL + Inv_LNFIN * PCGBL; - CKAPPAS_i = CKAPPAS + Inv_L * LCKAPPAS + Inv_NFIN * NCKAPPAS + Inv_LNFIN * PCKAPPAS; - CKAPPAD_i = CKAPPAD + Inv_L * LCKAPPAD + Inv_NFIN * NCKAPPAD + Inv_LNFIN * PCKAPPAD; - CKAPPAB_i = CKAPPAB + Inv_L * LCKAPPAB + Inv_NFIN * NCKAPPAB + Inv_LNFIN * PCKAPPAB; - NTGEN_i = NTGEN + Inv_L * LNTGEN + Inv_NFIN * NNTGEN + Inv_LNFIN * PNTGEN; - AIGEN_i = AIGEN + Inv_L * LAIGEN + Inv_NFIN * NAIGEN + Inv_LNFIN * PAIGEN; - BIGEN_i = BIGEN + Inv_L * LBIGEN + Inv_NFIN * NBIGEN + Inv_LNFIN * PBIGEN; - - if (ASYMMOD != 0) begin - CDSCDR_i = CDSCDR + Inv_L * LCDSCDR + Inv_NFIN * NCDSCDR + Inv_LNFIN * PCDSCDR; - CITR_i = CITR + Inv_L * LCITR + Inv_NFIN * NCITR + Inv_LNFIN * PCITR; - ETA0R_i = ETA0R + Inv_L * LETA0R + Inv_NFIN * NETA0R + Inv_LNFIN * PETA0R; - VSAT1R_i = VSAT1R + Inv_L * LVSAT1R + Inv_NFIN * NVSAT1R + Inv_LNFIN * PVSAT1R; - MEXPR_i = MEXPR + Inv_L * LMEXPR + Inv_NFIN * NMEXPR + Inv_LNFIN * PMEXPR; - PTWGR_i = PTWGR + Inv_L * LPTWGR + Inv_NFIN * NPTWGR + Inv_LNFIN * PPTWGR; - PDIBL1R_i = PDIBL1R + Inv_L * LPDIBL1R + Inv_NFIN * NPDIBL1R + Inv_LNFIN * PPDIBL1R; - PDIBL2R_i = PDIBL2R + Inv_L * LPDIBL2R + Inv_NFIN * NPDIBL2R + Inv_LNFIN * PPDIBL2R; - PCLMR_i = PCLMR + Inv_L * LPCLMR + Inv_NFIN * NPCLMR + Inv_LNFIN * PPCLMR; - DVTSHIFTR_i = DVTSHIFTR + Inv_L * LDVTSHIFTR + Inv_NFIN * NDVTSHIFTR + Inv_LNFIN * PDVTSHIFTR; - VSATR_i = VSATR + Inv_L * LVSATR + Inv_NFIN * NVSATR + Inv_LNFIN * PVSATR; - KSATIVR_i = KSATIVR + Inv_L * LKSATIVR + Inv_NFIN * NKSATIVR + Inv_LNFIN * PKSATIVR; - U0R_i = U0R + Inv_L * LU0R + Inv_NFIN * NU0R + Inv_LNFIN * PU0R; - UAR_i = UAR + Inv_L * LUAR + Inv_NFIN * NUAR + Inv_LNFIN * PUAR; - UPR_i = UPR + Inv_L * LUPR + Inv_NFIN * NUPR + Inv_LNFIN * PUPR; - if (BULKMOD != 0) begin - UCR_i = UCR + Inv_L * LUCR + Inv_NFIN * NUCR + Inv_LNFIN * PUCR; - end - EUR_i = EUR + Inv_L * LEUR + Inv_NFIN * NEUR + Inv_LNFIN * PEUR; - UDR_i = UDR + Inv_L * LUDR + Inv_NFIN * NUDR + Inv_LNFIN * PUDR; - end - - `ifdef __NQSMOD1__ - if (NQSMOD == 1 && XRCRG1 != 0.0) begin - XRCRG1_i = XRCRG1 + Inv_L * LXRCRG1 + Inv_NFIN * NXRCRG1 + Inv_LNFIN * PXRCRG1; - XRCRG2_i = XRCRG2 + Inv_L * LXRCRG2 + Inv_NFIN * NXRCRG2 + Inv_LNFIN * PXRCRG2; - end else begin - XRCRG1_i = 0.0; - XRCRG2_i = 0.0; - end - `else - if (NQSMOD == 1) begin - $strobe(" Although the model selector NQSMOD is set to 1, the NQS gate resistance model is not activated in the Verilog-A code. Please uncomment \"`define __NQSMOD1__\" in bsimcmg.va to activate it."); - end - `endif - - `ifdef __NQSMOD2__ - if (NQSMOD == 2 && XRCRG1 != 0.0) begin - XRCRG1_i = XRCRG1 + Inv_L * LXRCRG1 + Inv_NFIN * NXRCRG1 + Inv_LNFIN * PXRCRG1; - XRCRG2_i = XRCRG2 + Inv_L * LXRCRG2 + Inv_NFIN * NXRCRG2 + Inv_LNFIN * PXRCRG2; - end else begin - XRCRG1_i = 0.0; - XRCRG2_i = 0.0; - end - `else - if (NQSMOD == 2) begin - $strobe(" Although the model selector NQSMOD is set to 2, the NQS gate resistance model is not activated in the Verilog-A code. Please uncomment \"`define __NQSMOD2__\" in bsimcmg.va to activate it."); - end - `endif - - UTE_i = UTE + Inv_L * LUTE + Inv_NFIN * NUTE + Inv_LNFIN * PUTE; - UTL_i = UTL + Inv_L * LUTL + Inv_NFIN * NUTL + Inv_LNFIN * PUTL; - EMOBT_i = EMOBT + Inv_L * LEMOBT + Inv_NFIN * NEMOBT + Inv_LNFIN * PEMOBT; - UA1_i = UA1 + Inv_L * LUA1 + Inv_NFIN * NUA1 + Inv_LNFIN * PUA1; - - if (BULKMOD != 0) begin - UC1_i = UC1 + Inv_L * LUC1 + Inv_NFIN * NUC1 + Inv_LNFIN * PUC1; - end - UD1_i = UD1 + Inv_L * LUD1 + Inv_NFIN * NUD1 + Inv_LNFIN * PUD1; - UCSTE_i = UCSTE + Inv_L * LUCSTE + Inv_NFIN * NUCSTE + Inv_LNFIN * PUCSTE; - PTWGT_i = PTWGT + Inv_L * LPTWGT + Inv_NFIN * NPTWGT + Inv_LNFIN * PPTWGT; - AT_i = AT + Inv_L * LAT + Inv_NFIN * NAT + Inv_LNFIN * PAT; - ATCV_i = ATCV + Inv_L * LATCV + Inv_NFIN * NATCV + Inv_LNFIN * PATCV; - PRT_i = PRT + Inv_L * LPRT + Inv_NFIN * NPRT + Inv_LNFIN * PPRT; - KT1_i = KT1 + Inv_L * LKT1 + Inv_NFIN * NKT1 + Inv_LNFIN * PKT1; - TSS_i = TSS + Inv_L * LTSS + Inv_NFIN * NTSS + Inv_LNFIN * PTSS; - IIT_i = IIT + Inv_L * LIIT + Inv_NFIN * NIIT + Inv_LNFIN * PIIT; - TGIDL_i = TGIDL + Inv_L * LTGIDL + Inv_NFIN * NTGIDL + Inv_LNFIN * PTGIDL; - IGT_i = IGT + Inv_L * LIGT + Inv_NFIN * NIGT + Inv_LNFIN * PIGT; - - if (ASYMMOD != 0) begin - UTER_i = UTER + Inv_L * LUTER + Inv_NFIN * NUTER + Inv_LNFIN * PUTER; - UTLR_i = UTLR + Inv_L * LUTLR + Inv_NFIN * NUTLR + Inv_LNFIN * PUTLR; - UA1R_i = UA1R + Inv_L * LUA1R + Inv_NFIN * NUA1R + Inv_LNFIN * PUA1R; - UD1R_i = UD1R + Inv_L * LUD1R + Inv_NFIN * NUD1R + Inv_LNFIN * PUD1R; - ATR_i = ATR + Inv_L * LATR + Inv_NFIN * NATR + Inv_LNFIN * PATR; - if (BULKMOD != 0) begin - UC1R_i = UC1R + Inv_L * LUC1R + Inv_NFIN * NUC1R + Inv_LNFIN * PUC1R; - end - end - - // Geometrical Scaling - // NFIN Scaling - if (PHIGN1 != 0.0) begin - PHIG_i = PHIG_i * (1.0 + PHIGN1 / NFIN * lln(1.0 + NFIN / PHIGN2)); - end - - if (ETA0N1 != 0.0) begin - ETA0_i = ETA0_i * (1.0 + ETA0N1 / NFIN * lln(1.0 + NFIN / ETA0N2)); - end - - if (CDSCN1 != 0.0) begin - CDSC_i = CDSC_i * (1.0 + CDSCN1 / NFIN * lln(1.0 + NFIN / CDSCN2)); - end - - if (CDSCDN1 != 0.0) begin - CDSCD_i = CDSCD_i * (1.0 + CDSCDN1 / NFIN * lln(1.0 + NFIN / CDSCDN2)); - end - - if (CDSCDRN1 != 0.0) begin - CDSCDR_i = CDSCDR_i * (1.0 + CDSCDRN1 / NFIN * lln(1.0 + NFIN / CDSCDRN2)); - end - - if (VSATN1 != 0.0) begin - VSAT_i = VSAT_i * (1.0 + VSATN1 / NFIN * lln(1.0 + NFIN / VSATN2)); - end - - if (VSAT1N1 != 0.0) begin - VSAT1_i = VSAT1_i * (1.0 + VSAT1N1 / NFIN * lln(1.0 + NFIN / VSAT1N2)); - end - - if (VSAT1RN1 != 0.0) begin - VSAT1R_i = VSAT1R_i * (1.0 + VSAT1RN1 / NFIN * lln(1.0 + NFIN / VSAT1RN2)); - end - - if (U0N1 != 0.0) begin - U0_i = U0_i * (1.0 + U0N1 / NFIN * lln(1.0 + NFIN / U0N2)); - end - - if ($param_given(NFINNOM)) begin - PHIG_i = PHIG_i * (1.0 + (NFIN - NFINNOM) * PHIGLT * Leff) ; - ETA0_i = ETA0_i * (1.0 + (NFIN - NFINNOM) * ETA0LT * Leff); - U0_i = U0_i * (1.0 + (NFIN - NFINNOM) * U0LT * Leff); - end - - if (U0N1R != 0.0) begin - U0R_i = U0R_i * (1.0 + U0N1R / NFIN * lln(1.0 + NFIN / U0N2R)); - end - - // Length Scaling - PHIG_i = PHIG_i + PHIGL * Leff; - if (LPA > 0.0) begin - U0_i = U0_i * (1.0 - UP_i * pow(Leff, -LPA)); - end else begin - U0_i = U0_i * (1.0 - UP_i); - end - UA_i = UA_i + AUA * lexp(-Leff / BUA); - UD_i = UD_i + AUD * lexp(-Leff / BUD); - EU_i = EU_i + AEU * lexp(-Leff / BEU); - - if (ASYMMOD != 0) begin - if (LPAR > 0.0) begin - U0R_i = U0R_i * (1.0 - UPR_i * pow(Leff, -LPAR)); - end else begin - U0R_i = U0R_i * (1.0 - UPR_i); - end - UAR_i = UAR_i + AUAR * lexp(-Leff / BUAR); - UDR_i = UDR_i + AUDR * lexp(-Leff / BUDR); - EUR_i = EUR_i + AEUR * lexp(-Leff / BEUR); - end - - if (RDSMOD == 1) begin - RSW_i = RSW_i + ARSW * lexp(-Leff / BRSW); - RDW_i = RDW_i + ARDW * lexp(-Leff / BRDW); - end else begin - RDSW_i = RDSW_i + ARDSW * lexp(-Leff / BRDSW); - end - - PCLM_i = PCLM_i + APCLM * lexp(-Leff / BPCLM); - if (ASYMMOD != 0) begin - PCLMR_i = PCLMR_i + APCLMR * pow(Leff, -BPCLMR); - end - - MEXP_i = MEXP_i + AMEXP * pow(Leff, -BMEXP); - if (ASYMMOD != 0) begin - MEXPR_i = MEXPR_i + AMEXPR * pow(Leff, -BMEXPR); - end - - PTWG_i = PTWG_i + APTWG * lexp(-Leff / BPTWG); - if (ASYMMOD != 0) begin - PTWGR_i = PTWGR_i + APTWG * lexp(-Leff / BPTWG); - end - - VSAT_i = VSAT_i + AVSAT * lexp(-Leff / BVSAT); - VSAT1_i = VSAT1_i + AVSAT1 * lexp(-Leff / BVSAT1); - if (ASYMMOD != 0) begin - VSAT1R_i = VSAT1R_i + AVSAT1 * lexp(-Leff / BVSAT1); - end - - PSAT_i = PSAT_i + APSAT * lexp(-Leff / BPSAT); - PSATCV_i = PSATCV_i + APSATCV * lexp(-Leff / BPSATCV); - VSATCV_i = VSATCV_i + AVSATCV * lexp(-LeffCV / BVSATCV); - - // Scaling for DITS Parameters - DVTP0_i = DVTP0 + ADVTP0 * lexp(-Leff / BDVTP0); - DVTP1_i = DVTP1 + ADVTP1 * lexp(-Leff / BDVTP1); - - // Geometrical Scaling for Toxeff / Charge Centroid Tcen - if (QMTCENCV_i > 0.0 || QMTCENCVA_i > 0.0) begin - MTcen = 1.0 + AQMTCEN * lexp(- (2.0 * Ach / Weff_UFCM) / BQMTCEN); - Tcen0 = (2.0 * Ach / Weff_UFCM ) * MTcen; - end - - // ************************************** - // * Parameter Checking * - // ************************************** - - if (LeffCV <= 1.0e-9) begin - $strobe("Warning: LeffCV = %e <= 1.0e-9.", LeffCV); - end - - if (BULKMOD != 0) begin - if (LeffCV_acc <= 1.0e-9) begin - $strobe("Warning: LeffCV_acc = %e <= 1.0e-9.", LeffCV_acc); - end - end - - if (Weff0 <= 1.0e-9) begin - $strobe("Warning: Weff0 = %e <= 1.0e-9.", Weff0); - end - - if (WeffCV0 <= 1.0e-9) begin - $strobe("Warning: WeffCV0 = %e <= 1.0e-9.", WeffCV0); - end - - if (NBODY_i <= 0.0) begin - $strobe("Fatal: NBODY_i = %e is not positive.", NBODY_i); - $finish(0); - end else if (NBODY_i <= 1.0e18) begin - $strobe("Warning: NBODY_i = %e m^-3 may be too small.", NBODY_i); - end - - if (NGATE_i < 0.0) begin - $strobe("Fatal: NGATE_i = %e is negative.", NGATE_i); - $finish(0); - end else if (NGATE_i != 0.0 && NGATE_i <= 1.0e24) begin - $strobe("Warning: NGATE_i = %e may be too small.", NGATE_i); - end else if (NGATE_i > 1.0e31) begin - $strobe("Fatal: NGATE_i = %e is too high.", NGATE_i); - $finish(0); - end - - if (DVT0_i < 0.0) begin - $strobe("Warning: DVT0_i = %e is negative.", DVT0_i); - end - - if (PHIG_i <= 0.0) begin - $strobe("Fatal: PHIG_i = %e is not positive.", PHIG_i); - $finish(0); - end - - if (VSAT_i <= 0.0) begin - $strobe("Fatal: VSAT_i = %e is not positive.", VSAT_i); - $finish(0); - end - - if (VSAT1_i <= 0.0) begin - $strobe("Fatal: VSAT1_i = %e is not positive.", VSAT1_i); - $finish(0); - end - - if (ASYMMOD != 0 && VSAT1R_i <= 0.0) begin - $strobe("Fatal: VSAT1R_i = %e is not positive.", VSAT1R_i); - $finish(0); - end - - if (DVT1_i <= 0.0) begin - $strobe("Fatal: DVT1_i = %e is not positive.", DVT1_i); - $finish(0); - end - - if (DVT1SS_i <= 0.0) begin - $strobe("Fatal: DVT1SS_i = %e is not positive.", DVT1SS_i); - $finish(0); - end - - if (CDSC_i < 0.0) begin - $strobe("Warning: CDSC_i = %e is negative.", CDSC_i); - end - - if (CDSCD_i < 0.0) begin - $strobe("Warning: CDSCD_i = %e is negative.", CDSCD_i); - end - - if (ASYMMOD != 0 && CDSCDR_i < 0.0) begin - $strobe("Warning: CDSCDR_i = %e is negative.", CDSCDR_i); - end - - if (DSUB_i <= 0.0) begin - $strobe("Fatal: DSUB_i = %e is not positive.", DSUB_i); - $finish(0); - end - - if (ETA0_i < 0.0) begin - $strobe("Warning: ETA0_i = %e is negative, setting it to 0", ETA0_i); - ETA0_i = 0.0; - end - - if (ETA0R_i < 0.0) begin - $strobe("Warning: ETA0R_i = %e is negative, setting it to 0", ETA0R_i); - ETA0R_i = 0.0; - end - - if (LPE0_i < -Leff) begin - $strobe("Warning: LPE0_i = %e is less than -Leff. Clipping LPE0_i to 0", LPE0_i); - LPE0_i = 0.0; - end - - if (K0SI_i <= 0.0) begin - $strobe("Warning: K0SI_i = %e is not positive, setting it to 0.", K0SI_i); - K0SI_i = 0.0; - end - - if (K2SI_i <= 0.0) begin - $strobe("Warning: K2SI_i = %e is not positive, setting it to 0.", K2SI_i); - K2SI_i = 0.0; - end - - if (PHIBE_i < 0.2 && BULKMOD != 0) begin - $strobe("Warning: PHIBE_i = %e is less than 0.2, setting it to 0.2.", PHIBE_i); - PHIBE_i = 0.2; - end - - if (PHIBE_i > 1.2 && BULKMOD != 0) begin - $strobe("Warning: PHIBE_i = %e is larger than 1.2, setting it to 1.2.", PHIBE_i); - PHIBE_i = 1.2; - end - - if (PSAT_i < 2.0) begin - $strobe("Warning: PSAT_i = %e is less than 2.0, setting it to 2.0.", PSAT_i); - PSAT_i = 2.0; - end - - if (PSATCV_i < 2.0) begin - $strobe("Warning: PSATCV_i = %e is less than 2.0, setting it to 2.0.", PSATCV_i); - PSATCV_i = 2.0; - end - - if (U0_i < 0.0) begin - $strobe("Warning: U0_i = %e is negative, setting it to the default value.", U0_i); - U0_i = 0.03; - end - - if (UA_i < 0.0) begin - $strobe("Warning: UA_i = %e is negative, setting it to 0.", UA_i); - UA_i = 0.0; - end - - if (EU_i < 0.0) begin - $strobe("Warning: EU_i = %e is negative, setting it to 0.", EU_i); - EU_i = 0.0; - end - - if (UD_i < 0.0) begin - $strobe("Warning: UD_i = %e is negative, setting it to 0.", UD_i); - UD_i = 0.0; - end - - if (UCS_i < 0.0) begin - $strobe("Warning: UCS_i = %e is negative, setting it to 0.", UCS_i); - UCS_i = 0.0; - end - - if (ETAMOB_i < 0.0) begin - $strobe("Warning: ETAMOB_i = %e is negative, setting it to 0", ETAMOB_i); - ETAMOB_i = 0.0; - end - - RDSWMIN_i = RDSWMIN; - if (RDSWMIN_i < 0.0) begin - $strobe("Warning: RDSWMIN = %e is negative. Set to zero", RDSWMIN_i); - RDSWMIN_i = 0.0; - end - - if (RDSW_i < 0.0) begin - $strobe("Warning: RDSW_i = %e is negative. Set to zero", RDSW_i); - RDSW_i = 0.0; - end - - RSWMIN_i = RSWMIN; - if (RSWMIN_i < 0.0) begin - $strobe("Warning: RSWMIN = %e is negative. Set to zero", RSWMIN_i); - RSWMIN_i = 0.0; - end - - if (RSW_i < 0.0) begin - $strobe("Warning: RSW_i = %e is negative. Set to zero", RSW_i); - RSW_i = 0.0; - end - - RDWMIN_i = RDWMIN; - if (RDWMIN_i < 0.0) begin - $strobe("Warning: RDWMIN = %e is negative. Set to zero", RDWMIN_i); - RDWMIN_i = 0.0; - end - - if (RDW_i < 0) begin - $strobe("Warning: RDW_i = %e is negative. Set to zero", RDW_i); - RDW_i = 0.0; - end - - if (PRWGD_i < 0.0) begin - $strobe("Warning: PRWGD_i = %e is negative. Set to zero", PRWGD_i); - PRWGD_i = 0.0; - end - - if (PRWGS_i < 0.0) begin - $strobe("Warning: PRWGS_i = %e is negative. Set to zero", PRWGS_i); - PRWGS_i = 0.0; - end - - if (PCLM_i < 0) begin - $strobe("Warning: PCLM_i = %e is negative.", PCLM_i); - end - - if (PDIBL1_i < 0.0) begin - $strobe("Warning: PDIBL1_i = %e is negative.", PDIBL1_i); - end - - if (ASYMMOD != 0) begin - if (PDIBL1R_i < 0.0) begin - $strobe("Warning: PDIBL1R_i = %e is negative.", PDIBL1R_i); - end - if (PDIBL2R_i < 0.0) begin - $strobe("Warning: PDIBL2R_i = %e is negative.", PDIBL2R_i); - end - if (U0R_i < 0) begin - $strobe("Warning: U0R_i = %e is negative, setting it to 0.", U0R_i); - U0R_i = 0.0; - end - if (UAR_i < 0.0) begin - $strobe("Warning: UAR_i = %e is negative, setting it to 0.", UAR_i); - UAR_i = 0.0; - end - if (EUR_i < 0.0) begin - $strobe("Warning: EUR_i = %e is negative, setting it to 0.", EUR_i); - EUR_i = 0.0; - end - if (UDR_i < 0.0) begin - $strobe("Warning: UDR_i = %e is negative, setting it to 0.", UDR_i); - UDR_i = 0.0; - end - end - - if (PDIBL2_i < 0.0) begin - $strobe("Warning: PDIBL2_i = %e is negative.", PDIBL2_i); - end - - if (DROUT_i <= 0.0) begin - $strobe("Fatal: DROUT_i = %e is non-positive.", DROUT_i); - $finish(0); - end - - if (MEXP_i < 2.0) begin - $strobe("Warning: MEXP_i = %e < 2. Setting MEXP_i = 2.", MEXP_i); - MEXP_i = 2.0; - end - - if (ASYMMOD != 0) begin - if (MEXPR_i < 2.0) begin - $strobe("Warning: MEXPR_i = %e < 2. Setting MEXPR_i = 2.", MEXPR_i); - MEXPR_i = 2.0; - end - end - - if (PTWG_i < 0) begin - $strobe("Warning: PTWG_i = %e is negative, setting it to 0.", PTWG_i ); - PTWG_i = 0.0; - end - - if (QMTCENCV_i > 0.0) begin - if (QM0 <= 0.0) begin - $strobe("Fatal: QM0 = %e is non-positive.", QM0); - $finish(0); - end - end - - if (BULKMOD != 0 && QMTCENCVA_i > 0.0) begin - if (QM0ACC <= 0.0) begin - $strobe("Fatal: QM0ACC = %e is non-positive.", QM0ACC); - $finish(0); - end - end - - if (CGIDL_i < 0.0) begin - $strobe("Warning: CGIDL_i = %e < 0. Setting CGIDL_i = 0.", CGIDL_i); - CGIDL_i = 0.0; - end - - if (CGISL_i < 0.0) begin - $strobe("Warning: CGISL_i = %e < 0. Setting CGISL_i = 0.", CGISL_i); - CGISL_i = 0.0; - end - - if (IGBMOD != 0) begin - if (NIGBINV_i <= 0.0) begin - $strobe("Fatal: NIGBINV_i = %e is non-positive.", NIGBINV_i); - $finish(0); - end - if (NIGBACC_i <= 0.0) begin - $strobe("Fatal: NIGBACC_i = %e is non-positive.", NIGBACC_i); - $finish(0); - end - end - - if (IGCMOD != 0) begin - if (POXEDGE_i <= 0.0) begin - $strobe("Fatal: POXEDGE_i = %e is non-positive.", POXEDGE_i); - $finish(0); - end - if (PIGCD_i <= 0.0) begin - $strobe("Fatal: PIGCD_i = %e is non-positive.", PIGCD_i); - $finish(0); - end - end - - if (IGCMOD != 0 || IGBMOD != 0) begin - if (TOXREF <= 0) begin - $strobe("Fatal: TOXREF = %e is non-positive.", TOXREF); - $finish(0); - end - end - - if (LINTIGEN >= (Leff / 2.0)) begin - $strobe("Warning: LINTIGEN = %e is too large - Leff for r/g current is negative. Re-setting LINTIGEN = 0.", LINTIGEN); - LINTIGEN_i = 0.0; - end else begin - LINTIGEN_i = LINTIGEN; - end - - if (NTGEN_i <= 0.0) begin - $strobe("Fatal: NTGEN_i = %e is non-positive.", NTGEN_i); - $finish(0); - end - - `ifdef __NQSMOD1__ - if (NQSMOD == 1 && XRCRG1_i != 0.0 && XRCRG1_i < 1.0e-3) begin - $strobe("Warning: XRCRG1_i = %e. Gate resistance may be too large. Disabling NQS Gate Resistance.", XRCRG1_i); - XRCRG1_i = 0.0; - end - `endif - - if (IIMOD == 2) begin - if (BETAII0_i < 0.0) begin - $strobe("Warning: BETAII0_i = %e is negative.",BETAII0_i); - end - if (BETAII1_i < 0.0) begin - $strobe("Warning: BETAII1_i = %e is negative.", BETAII1_i); - end - if (BETAII2_i < 0.0) begin - $strobe("Warning: BETAII2_i = %e is negative.", BETAII2_i); - end - if (ESATII_i < 0.0) begin - $strobe("Warning: ESATII_i = %e is negative.", ESATII_i); - end - if (LII_i < 0.0) begin - $strobe("Warning: LII_i = %e is negative.", LII_i); - end - if (SII1_i < 0.0) begin - $strobe("Warning: SII1_i = %e is negative.", SII1); - end - if (SII2_i < 0.0) begin - $strobe("Warning: SII2_i = %e is negative.", SII2_i); - end - if (SIID_i < 0.0) begin - $strobe("Warning: SIID_i = %e is negative.", SIID_i); - end - end - - if (EF <= 0.0) begin - $strobe("Fatal: EF = %e is non-positive.", EF); - $finish(0); - end else if (EF > 2.0) begin - $strobe("Fatal: EF = %e > 2.0.", EF); - $finish(0); - end - - if (LINTNOI >= (Leff / 2.0)) begin - $strobe("Warning: LINTNOI = %e is too large - Leff for noise is negative. Re-setting LINTNOI = 0.", LINTNOI); - LINTNOI_i = 0.0; - end else begin - LINTNOI_i = LINTNOI; - end - - if (NTNOI < 0) begin - $strobe("Warning: NTNOI = %e is negative. Set to zero.", NTNOI); - NTNOI_i = 0.0; - end else begin - NTNOI_i = NTNOI; - end - - // Self-Heating - `ifdef __SHMOD__ - if (SHMOD != 0 && RTH0 > 0.0) begin - T1y = WTH0; - if (BSHEXP != 0.0) begin - T1y = WTH0 * pow(NF, BSHEXP); - end - T2y = FPITCH; - if (ASHEXP != 0.0) begin - T2y = FPITCH * pow(NFINtotal, ASHEXP); - end - gth = (T1y + T2y)/ RTH0; - cth = CTH0 * (T1y + T2y); - end else begin - gth = 1.0; - cth = 0.0; - end - `else - if (SHMOD != 0) begin - $strobe("Although the model selector SHMOD is set to 1, the self heating model is not activated in the Verilog-A code. Please uncomment \"`define __SHMOD__\" in bsimcmg.va to activate it."); - end - `endif - - // Gate Electrode Resistance - `ifdef __RGATEMOD__ - if (RGATEMOD != 0) begin - Rgeltd = (RGEXT / NGCON + (RGFIN * NFIN) / (NGCON == 2 ? 12.0 : 3.0)) / NF; - ggeltd = 1.0 / max(1.0e-3, Rgeltd); - end - `else - if (RGATEMOD != 0) - $strobe("Although the model selector RGATEMOD is set to 1, the gate electrode resistance model is not activated in the Verilog-A code. Please uncomment \"`define __RGATEMOD__\" in bsimcmg.va to activate it."); - `endif - - // Geometry-Dependent Source/Drain Resistance - if (RGEOMOD == 0) begin - RSourceGeo = RSHS * NRS; - RDrainGeo = RSHD * NRD; - end else begin - // Area and perimeter calculation - if (HEPI > 0.0) begin - Arsd = FPITCH * HFIN + (TFIN + (FPITCH - TFIN) * CRATIO) * HEPI; - end else begin - Arsd = FPITCH * max(1.0e-9, HFIN + HEPI); - end - Prsd = FPITCH + DELTAPRSD; - - // Resistivity Calculation - if ($param_given(RHORSD)) begin - rhorsd = RHORSD; - end else begin - mu_max = (TYPE == `ntype) ? 1417.0 : 470.5; - if (TYPE == `ntype) begin - mu_rsd = (52.2 + (mu_max - 52.2) / (1.0 + pow(NSD / 9.68e22, 0.680)) - 43.4 / (1.0 + pow(3.43e26 / NSD, 2.0))) * 1.0e-4; - end else begin - mu_rsd = (44.9 + (mu_max - 44.9) / (1.0 + pow(NSD / 2.23e22, 0.719)) - 29.0 / (1.0 + pow(6.10e26 / NSD, 2.0))) * 1.0e-4; - end - rhorsd = 1.0 / (`q * NSD * mu_rsd); - end - - // Component: Spreading Resistance (extension -> hdd) - thetarsp = 55.0 * `M_PI / 180.0; - afin = min(Arsd, max(1.0e-18, TFIN * (HFIN + min(0.0, HEPI)))); - T1y = `COT(thetarsp); - Rsp = rhorsd * T1y / (sqrt(`M_PI) * NFIN) * (1.0 / sqrt(afin) - 2.0 / sqrt(Arsd) + sqrt(afin / (Arsd*Arsd))); - - // Component: Contact Resistance - arsd_total = Arsd * NFIN + ARSDEND; - prsd_total = Prsd * NFIN + PRSDEND; - lt = sqrt(RHOC * arsd_total / (rhorsd * prsd_total)); - alpha = LRSD / lt; - T0y = lexp(alpha + alpha); - - if (SDTERM == 1.0) begin - eta = rhorsd * lt / RHOC; - T1y = T0y * (1.0 + eta); - T2y = T1y + 1.0 - eta; - T3y = T1y - 1.0 + eta; - end else begin - T2y = T0y + 1.0; - T3y = T0y - 1.0; - end - RrsdTML = rhorsd * lt * T2y / (arsd_total * T3y); - - if (HEPI < -1.0e-10) begin - Rrsdside = RHOC / (-HEPI * TFIN * NFIN); - Rrsd = (RrsdTML + Rsp) * Rrsdside / ((RrsdTML + Rsp) + Rrsdside); - end else begin - Rrsd = RrsdTML + Rsp; - end - - Rdsgeo = Rrsd / NF * max(0.0, RGEOA + RGEOB * TFIN + RGEOC * FPITCH + RGEOD * LRSD + RGEOE * HEPI); - RSourceGeo = Rdsgeo; - RDrainGeo = Rdsgeo; - end - - // Clamping of Source/Drain Resistances - if (RSourceGeo <= 1.0e-3) begin - RSourceGeo = 1.0e-3; - end - - if (RDrainGeo <= 1.0e-3) begin - RDrainGeo = 1.0e-3; - end - - if (RDSMOD == 1) begin - if (RSWMIN_i <= 0.0) begin - RSWMIN_i = 0.0; - end - if (RDWMIN_i <= 0.0) begin - RDWMIN_i = 0.0; - end - if (RSW_i <= 0.0) begin - RSW_i = 0.0; - end - if (RDW_i <= 0.0) begin - RDW_i = 0.0; - end - end else begin - if (RDSWMIN_i <= 0.0) begin - RDSWMIN_i = 0.0; - end - if (RDSW_i <= 0.0) begin - RDSW_i = 0.0; - end - end // End of Clamping of Source/Drain Resistances - - if (CGEOMOD != 1) begin - if ($param_given(CGSO)) begin - CGSO_i = CGSO; - end else begin - if ($param_given(DLC) && DLC > 0.0) begin - CGSO_i = max(0.0, DLC * cox - CGSL_i); - end else begin - CGSO_i = 0.3 * TFIN * cox; - end - end - if ($param_given(CGDO)) begin - CGDO_i = CGDO; - end else begin - if ($param_given(DLC) && DLC > 0.0) begin - CGDO_i = max(0.0, DLC * cox - CGDL_i); - end else begin - CGDO_i = 0.3 * TFIN * cox; - end - end - end - - // Parasitic Source/Drain to Gate Fringe Capacitance Model - if (CGEOMOD == 2) begin - if ($param_given(LSP)) - LSP_i = LSP; - else - LSP_i = 0.2*(L + XL); - Hg = TGATE + TMASK; - Trsd = 0.5 * (FPITCH - TFIN); - Wg = max(0.0, Trsd - TOXP); - Hrsd = max(0.0, HEPI + TSILI); - - // Top Component - if (TMASK > 0.0) begin - // Capacitance Model by Chung-Hsun Lin (IBM) - T0y = 3.467e-11 * lln(1.0e-7 * EPSRSP / (3.9 * LSP_i)); - T1y = 0.942 * Hrsd * epssp / LSP_i; - Cgg_top = (T0y + T1y) * (TFIN + (FPITCH - TFIN) * CRATIO); - end else begin - `Cfringe_2d(cfr_top_trigate, Hg, Hrsd, LSP_i, TFIN, LRSD, Lg, TOXP, 0.85, Cgg_top) - end - - // Side Component - if (TMASK > 0) begin - `Cfringe_2d(cfr_side_dblgate, Wg, Trsd, LSP_i, HFIN, LRSD, Lg, TOXP, 0.70, Cgg_side) - end else begin - `Cfringe_2d(cfr_side_trigate, Wg, Trsd, LSP_i, HFIN, LRSD, Lg, TOXP, 0.85, Cgg_side) - end - - // Corner Component - if (TMASK > 0.0) begin - Acorner = 0.0; - end else begin - if (HEPI > 0.0) begin - Acorner = (FPITCH - TFIN) * (HEPI * CRATIO + TSILI); - end else begin - Acorner = (FPITCH - TFIN) * Hrsd; - end - end - Ccorner = (NFIN * Acorner + ARSDEND + ASILIEND) * epssp / LSP_i; - Cfr_geo = (Ccorner + Cgg_top * NFIN + CGEOE * Cgg_side * NFIN * 2.0) * NF; - Cfr_geo = Cfr_geo * max(0.0, CGEOA + CGEOB * TFIN + CGEOC * FPITCH + CGEOD * LRSD); - end - - // Source/Gate/Drain-to-Substrate Parasitic Capacitances - T0y = CSDESW * lln(1.0 + HFIN / EOTBOX); - csbox = cbox * ASEO + T0y * max(0.0, PSEO - FPITCH * NFINtotal); - cdbox = cbox * ADEO + T0y * max(0.0, PDEO - FPITCH * NFINtotal); - cgbox = (CGBO * NF * NGCON + CGBN * NFINtotal) * Lg; - - // Mobility Degradation - EeffFactor = 1.0e-8 / (epsratio * (EOT)); - WeffWRFactor = 1.0 / (pow((Weff0) * 1.0e6, WR_i) * NFINtotal); - litl = sqrt(epsratio * EOT * 0.5 * TFIN); - - if (!$param_given(THETASCE)) begin - tmp = DVT1_i * Leff / scl + 1.0e-6; - if (tmp < 40.0) begin - Theta_SCE = 0.5 / (cosh(tmp) - 1.0); - end else begin - Theta_SCE = exp(-tmp); - end - end else begin - Theta_SCE = THETASCE; - end - - if (!$param_given(THETASW)) begin - tmp = DVT1SS_i * Leff / scl + 1.0e-6; - if (tmp < 40.0) begin - Theta_SW = 0.5 / (cosh(tmp) - 1.0); - end else begin - Theta_SW = exp(-tmp); - end - end else begin - Theta_SW = THETASW; - end - - if (!$param_given(THETADIBL)) begin - tmp = DSUB_i * Leff / scl + 1.0e-6; - if (tmp < 40.0) begin - Theta_DIBL = 0.5 / (cosh(tmp) - 1.0); - end else begin - Theta_DIBL = exp(-tmp); - end - end else begin - Theta_DIBL = THETADIBL; - end - - Theta_RSCE = sqrt(1.0 + LPE0_i / Leff) - 1.0; - - tmp = DSUB_i * Leff / scl + 1.0e-6; - if (tmp < 40.0) begin - T0y = 1.0 / max((1.0 + DVTP2 * (cosh(tmp) - 2.0)), 1.0e-6); - end else begin - T0y = exp(-tmp) / max((exp(-tmp) + DVTP2), 1.0e-6); - end - - Theta_DITS = T0y; - nbody = NBODY_i; - qbs = `q * nbody * Ach / Cins; - - // Gate Current - if (TYPE == `ntype) begin - Aechvb = 4.97232e-7; // NMOS - Bechvb = 7.45669e11; // NMOS - end else begin - Aechvb = 3.42537e-7; // PMOS - Bechvb = 1.16645e12; // PMOS - end - - T0y = TOXG * TOXG; - T1y = TOXG * POXEDGE_i; - T2y = T1y * T1y; - Toxratio = lexp(NTOX_i * lln(TOXREF / TOXG)) / T0y; - Toxratioedge = lexp(NTOX_i * lln(TOXREF / T1y)) / T2y; - igsd_mult0 = Weff0 * Aechvb * Toxratioedge; - - if (TNOM < -`P_CELSIUS0) begin - $strobe("Warning: (TNOM=%e) < -`P_CELSIUS0. Set to 27 C.", TNOM); - Tnom = `REFTEMP; - end else begin - Tnom = TNOM + `CONSTCtoK; - end - end // initial_step - - // ************************************************ - // * Temperature Dependence Calculations * - // ************************************************ - `ifdef __SHMOD__ - if (SHMOD != 0 && RTH0 > 0.0) begin - DevTemp = $temperature + Temp(rth_branch) + DTEMP; - end else begin - `endif - DevTemp = $temperature + DTEMP; - `ifdef __SHMOD__ - end - `endif - - begin : CMGTempDepCalc - TRatio = DevTemp / Tnom; - delTemp = DevTemp - Tnom; - Vtm = `KboQ * DevTemp; - Vtm0 = `KboQ * Tnom; - Eg = BG0SUB - TBGASUB * DevTemp * DevTemp / (DevTemp + TBGBSUB); - Eg0 = BG0SUB - TBGASUB * Tnom * Tnom / (Tnom + TBGBSUB); - T1 = (DevTemp / 300.15) * sqrt(DevTemp / 300.15); - ni = NI0SUB * T1 * lexp(BG0SUB / (2.0 * `KboQ * 300.15) - Eg / (2.0 * Vtm)); - Nc = NC0SUB * T1; - ThetaSS = hypsmooth(1.0 + TSS_i * delTemp - 1.0e-6, 1.0e-3); - - // Quantum Mechanical Vth Correction (Ref: Trivedi et al., EDL 2005) - kT = Vtm * `q; - T0y = `HBAR * `M_PI / (2*Ach/Weff_UFCM ); - E0 = T0y * T0y / (2.0 * mx); - E0prime = T0y * T0y / (2.0 * mxprime); - E1 = 4.0 * E0; - E1prime = 4.0 * E0prime; - T1 = gprime * mdprime / (gfactor * md); - gam0 = 1.0 + T1 * lexp((E0 - E0prime) / kT); - gam1 = gam0 + lexp((E0 - E1) / kT) + T1 * lexp((E0 - E1prime) / kT); - T2 = -Vtm * lln(gfactor * md / (`M_PI * `HBAR * `HBAR * Nc) * kT / (2.0 * Ach / Weff_UFCM) * gam1); - dvch_qm = QMFACTOR_i * (E0 / `q + T2); - - // Temperature Dependence - ETA0_t = Tempdep(ETA0_i, TETA0, delTemp, TEMPMOD); - ETA0R_t = Tempdep(ETA0R_i, TETA0R, delTemp, TEMPMOD); - T1 = U0_i * pow(TRatio, UTE_i); - U0_t = T1 + hypmax(UTL_i * delTemp, -0.9 * T1, 1.0e-4); - u0 = U0_t; - if (ASYMMOD == 1) begin - T1 = U0R_i * pow(TRatio, UTER_i); - U0R_t = T1 + hypmax(UTLR_i * delTemp, -0.9 * T1, 1.0e-4); - u0r = U0R_t; - end - - ETAMOB_t = Tempdep(ETAMOB_i, EMOBT_i, delTemp, TEMPMOD); - UA_t = UA_i + hypmax(UA1_i*delTemp, -UA_i, 1.0e-6); - if (ASYMMOD != 0) begin - UAR_t = UAR_i + hypmax(UA1R_i * delTemp, -UAR_i, 1.0e-6); - end - - if (BULKMOD != 0) begin - if (TEMPMOD == 0) begin - UC_t = Tempdep(UC_i, UC1_i, delTemp, 0); - if (ASYMMOD != 0) begin - UCR_t = Tempdep(UCR_i, UC1R_i, delTemp, 0); - end - end else begin - UC_t = UC_i + UC1_i * delTemp; - if (ASYMMOD != 0) begin - UCR_t = UCR_i + UC1R_i * delTemp; - end - end - end - - UD_t = UD_i * pow(TRatio, UD1_i); - if (ASYMMOD != 0) begin - UDR_t = UDR_i * pow(TRatio, UD1R_i); - end - - UCS_t = UCS_i * pow(TRatio, UCSTE_i); - - rdstemp = hypsmooth(1.0 + PRT_i * delTemp - 1.0e-6, 1.0e-3); - RSDR_t = Tempdep(RSDR, TRSDR, delTemp, TEMPMOD); - if (ASYMMOD != 0) begin - RSDRR_t = Tempdep(RSDRR, TRSDR, delTemp, TEMPMOD); - end - - RDDR_t = Tempdep(RDDR, TRDDR, delTemp, TEMPMOD); - if (ASYMMOD != 0) begin - RDDRR_t = Tempdep(RDDRR, TRDDR, delTemp, TEMPMOD); - end - - VSAT_t = Tempdep(VSAT_i, -AT_i, delTemp, TEMPMOD); - if (VSAT_t < 1000) begin - $strobe("Warning: VSAT(%f) = %e is less than 1K, setting it to 1K.", DevTemp, VSAT_t); - VSAT_t = 1000; - end - - if (ASYMMOD != 0) begin - VSATR_t = Tempdep(VSATR_i, -ATR_i, delTemp, TEMPMOD); - if (VSATR_t < 1000) begin - $strobe("Warning: VSATR(%f) = %e is less than 1K, setting it to 1K.", DevTemp, VSATR_t); - VSATR_t = 1000; - end - end - - VSAT1_t = Tempdep(VSAT1_i, -AT_i, delTemp, TEMPMOD); - if (VSAT1_t < 1000) begin - $strobe("Warning: VSAT1(%f) = %e is less than 1K, setting it to 1K.", DevTemp, VSAT1_t); - VSAT1_t = 1000; - end - - if (ASYMMOD != 0) begin - VSAT1R_t = Tempdep(VSAT1R_i, -AT_i, delTemp, TEMPMOD); - if (VSAT1R_t < 1000) begin - $strobe("Warning: VSAT1R(%f) = %e is less than 1K, setting it to 1K.", DevTemp, VSAT1R_t); - VSAT1R_t = 1000; - end - end - - VSATCV_t = Tempdep(VSATCV_i, -ATCV_i, delTemp, TEMPMOD); - if (VSATCV_t < 1000) begin - $strobe("Warning: VSATCV(%f) = %e is less than 1K, setting it to 1K.", DevTemp, VSATCV_t); - VSATCV_t = 1000; - end - - MEXP_t = hypsmooth(MEXP_i * (1.0 + TMEXP * delTemp) - 2.0, 1.0e-3) + 2.0; - if (ASYMMOD != 0) begin - MEXPR_t = hypsmooth(MEXPR_i * (1.0 + TMEXPR * delTemp) - 2.0, 1.0e-3) + 2.0; - end - - PTWG_t = Tempdep(PTWG_i, -PTWGT_i, delTemp, TEMPMOD); - if (ASYMMOD != 0) begin - PTWGR_t = Tempdep(PTWGR_i, -PTWGT_i, delTemp, TEMPMOD); - end - - dvth_temp = (KT1_i + KT1L / Leff) * (TRatio - 1.0); - BETA0_t = BETA0_i * pow(TRatio, IIT_i); - SII0_t = SII0_i * (hypsmooth(1.0 + TII_i * (TRatio - 1.0) - 0.01, 1.0e-3) + 0.01); - - K0_t = K0_i + K01_i * delTemp; - K0SI_t = K0SI_i + hypmax(K0SI1_i * delTemp, -K0SI_i, 1.0e-6); - K2SI_t = K2SI_i + hypmax(K2SI1_i * delTemp, -K2SI_i, 1.0e-6); - K1_t = K1_i + hypmax(K11_i * delTemp, -K1_i, 1.0e-6); - K2SAT_t = K2SAT_i + K2SAT1_i * delTemp; - A1_t = A1_i + A11_i * delTemp; - A2_t = A2_i + A21_i * delTemp; - K2_t = K2_i + hypmax(K21_i * delTemp, -K2_i, 1.0e-6); - K0SISAT_t = K0SISAT_i + K0SISAT1_i * delTemp; - K2SISAT_t = K2SISAT_i + K2SISAT1_i * delTemp; - AIGBINV_t = AIGBINV_i + hypmax(AIGBINV1_i * delTemp, -AIGBINV_i, 1.0e-6); - AIGBACC_t = AIGBACC_i + hypmax(AIGBACC1_i * delTemp, -AIGBACC_i, 1.0e-6); - AIGC_t = AIGC_i + hypmax(AIGC1_i * delTemp, -AIGC_i, 1.0e-6); - AIGS_t = AIGS_i + hypmax(AIGS1_i * delTemp, -AIGS_i, 1.0e-6); - AIGD_t = AIGD_i + hypmax(AIGD1_i * delTemp, -AIGD_i, 1.0e-6); - BGIDL_t = BGIDL_i * hypsmooth(1.0 + TGIDL_i * delTemp - 1.0e-6, 1.0e-3); - BGISL_t = BGISL_i * hypsmooth(1.0 + TGIDL_i * delTemp - 1.0e-6, 1.0e-3); - ALPHA0_t = ALPHA0_i + hypmax(ALPHA01 * delTemp, -ALPHA0_i, 1.0e-6); - ALPHA1_t = ALPHA1_i + hypmax(ALPHA11 * delTemp, -ALPHA1_i, 1.0e-6); - ALPHAII0_t = ALPHAII0_i + hypmax(ALPHAII01 * delTemp, -ALPHAII0_i, 1.0e-25); - ALPHAII1_t = ALPHAII1_i + hypmax(ALPHAII11 * delTemp, -ALPHAII1_i, 1.0e-20); - igtemp = lexp(IGT_i * lln(TRatio)); - igsd_mult = igsd_mult0 * igtemp; - - if (BULKMOD != 0) begin - CJS_t = Tempdep(CJS, TCJ, delTemp, TEMPMOD); - CJD_t = Tempdep(CJD, TCJ, delTemp, TEMPMOD); - CJSWS_t = Tempdep(CJSWS, TCJSW, delTemp, TEMPMOD); - CJSWD_t = Tempdep(CJSWD, TCJSW, delTemp, TEMPMOD); - CJSWGS_t = Tempdep(CJSWGS, TCJSWG, delTemp, TEMPMOD); - CJSWGD_t = Tempdep(CJSWGD, TCJSWG, delTemp, TEMPMOD); - - PBS_t = hypsmooth(PBS - TPB * delTemp - 0.01, 1.0e-3) + 0.01; - PBD_t = hypsmooth(PBD - TPB * delTemp - 0.01, 1.0e-3) + 0.01; - PBSWS_t = hypsmooth(PBSWS - TPBSW * delTemp - 0.01, 1.0e-3) + 0.01; - PBSWD_t = hypsmooth(PBSWD - TPBSW * delTemp - 0.01, 1.0e-3) + 0.01; - PBSWGS_t = hypsmooth(PBSWGS - TPBSWG * delTemp - 0.01, 1.0e-3) + 0.01; - PBSWGD_t = hypsmooth(PBSWGD - TPBSWG * delTemp - 0.01, 1.0e-3) + 0.01; - - T0 = Eg0 / Vtm0 - Eg / Vtm; - T1 = lln(TRatio); - T3 = lexp((T0 + XTIS * T1) / NJS); - JSS_t = JSS * T3; - JSWS_t = JSWS * T3; - JSWGS_t = JSWGS * T3; - - T3 = lexp((T0 + XTID * T1) / NJD); - JSD_t = JSD * T3; - JSWD_t = JSWD * T3; - JSWGD_t = JSWGD * T3; - - JTSS_t = JTSS * lexp(Eg0 * XTSS * (TRatio - 1.0) / Vtm); - JTSD_t = JTSD * lexp(Eg0 * XTSD * (TRatio - 1.0) / Vtm); - JTSSWS_t = JTSSWS * lexp(Eg0 * XTSSWS * (TRatio - 1.0) / Vtm); - JTSSWD_t = JTSSWD * lexp(Eg0 * XTSSWD * (TRatio - 1.0) / Vtm); - JTSSWGS_t = JTSSWGS * (sqrt(JTWEFF / Weff0) + 1.0) * lexp(Eg0 * XTSSWGS * (TRatio - 1.0) / Vtm); - JTSSWGD_t = JTSSWGD * (sqrt(JTWEFF / Weff0) + 1.0) * lexp(Eg0 * XTSSWGD * (TRatio - 1.0) / Vtm); - - // All NJT's Smoothed to 0.01 to Prevent Divide-by-zero / Negative Values - NJTS_t = hypsmooth(NJTS * (1.0 + TNJTS * (TRatio-1.0)) - 0.01, 1.0e-3) + 0.01; - NJTSD_t = hypsmooth(NJTSD * (1.0 + TNJTSD * (TRatio-1.0)) - 0.01, 1.0e-3) + 0.01; - NJTSSW_t = hypsmooth(NJTSSW * (1.0 + TNJTSSW * (TRatio-1.0)) - 0.01, 1.0e-3) + 0.01; - NJTSSWD_t = hypsmooth(NJTSSWD * (1.0 + TNJTSSWD * (TRatio-1.0)) - 0.01, 1.0e-3) + 0.01; - NJTSSWG_t = hypsmooth(NJTSSWG * (1.0 + TNJTSSWG * (TRatio-1.0)) - 0.01, 1.0e-3) + 0.01; - NJTSSWGD_t = hypsmooth(NJTSSWGD * (1.0 + TNJTSSWGD * (TRatio-1.0)) - 0.01, 1.0e-3) + 0.01; - end - - if (!$param_given(VFBSD)) begin - if (NGATE > 0.0) begin - vfbsd = devsign * (hypsmooth(0.5 * Eg - Vtm * lln(NGATE / ni), 1.0e-4) - (0.5 * Eg - devsign * (0.5 * Eg - hypsmooth(0.5 * Eg - Vtm * lln(NSD / ni), 1.0e-4)))); - end else begin - vfbsd = devsign * (PHIG_i - (EASUB + 0.5 * Eg - devsign * (0.5 * Eg - hypsmooth(0.5 * Eg - Vtm * lln(NSD / ni), 1.0e-4)))); - end - end else begin - vfbsd = VFBSD; - end - - if (!$param_given(VFBSDCV)) begin - vfbsdcv = vfbsd; - end else begin - vfbsdcv = VFBSDCV; - end - - `ifdef __SHMOD__ - if (SHMOD != 0 && RTH0 > 0.0) begin - T0 = Vtm * lln(nbody / ni); - phib = sqrt(T0 * T0 + 1.0e-6); - end else begin - phib = Vtm * lln(nbody / ni); - end - `else - phib = Vtm * lln(nbody/ni); - `endif - - `ifdef __SHMOD__ - if (SHMOD != 0 && RTH0 > 0.0) begin - T0 = Vtm * lln(nbody * NSD / (ni * ni)); - vbi = sqrt(T0 * T0 + 1.0e-6); - end else begin - vbi = Vtm * lln(nbody * NSD / (ni * ni)); - end - `else - vbi = Vtm * lln(nbody * NSD / (ni * ni)); - `endif - - // deltaPhi definition and Polysilicon Depletion - // deltaPhi: workfunction difference between the gate and the n+ source. - deltaPhi = devsign*(PHIG_i - (EASUB + (TYPE == `ntype ? 0 : Eg))); - - // Mobility Degradation - eta_mu = 0.5 * ETAMOB_t; - eta_mu_cv = 0.5; - if ( TYPE != `ntype ) begin - eta_mu = 1.0 / 3.0 * ETAMOB_t; - eta_mu_cv = 1.0 / 3.0; - end - - // Junction Current and Capacitance - if (BULKMOD != 0) begin - // Source-Side Junction Current - Isbs = ASEJ * JSS_t + PSEJ * JSWS_t + TFIN * NFINtotal * JSWGS_t; - if (Isbs > 0.0) begin - Nvtms = Vtm * NJS; - XExpBVS = lexp(-BVS / Nvtms) * XJBVS; - T2 = max(IJTHSFWD / Isbs, 10.0); - Tb = 1.0 + T2 - XExpBVS; - VjsmFwd = Nvtms * lln(0.5 * (Tb + sqrt(Tb * Tb + 4.0 * XExpBVS))); - T0 = lexp(VjsmFwd / Nvtms); - IVjsmFwd = Isbs * (T0 - XExpBVS / T0 + XExpBVS - 1.0); - SslpFwd = Isbs * (T0 + XExpBVS / T0) / Nvtms; - T2 = hypsmooth(IJTHSREV / Isbs - 10.0, 1.0e-3) + 10.0; - VjsmRev = -BVS - Nvtms * lln((T2 - 1.0) / XJBVS); - T1 = XJBVS * lexp(-(BVS + VjsmRev) / Nvtms); - IVjsmRev = Isbs * (1.0 + T1); - SslpRev = -Isbs * T1 / Nvtms; - end - - // Drain-Side Junction Current - Isbd = ADEJ * JSD_t + PDEJ * JSWD_t + TFIN * NFINtotal * JSWGD_t; - if (Isbd > 0.0) begin - Nvtmd = Vtm * NJD; - XExpBVD = lexp(-BVD / Nvtmd) * XJBVD; - T2 = max(IJTHDFWD / Isbd, 10.0); - Tb = 1.0 + T2 - XExpBVD; - VjdmFwd = Nvtmd * lln(0.5 * (Tb + sqrt(Tb * Tb + 4.0 * XExpBVD))); - T0 = lexp(VjdmFwd / Nvtmd); - IVjdmFwd = Isbd * (T0 - XExpBVD / T0 + XExpBVD - 1.0); - DslpFwd = Isbd * (T0 + XExpBVD / T0) / Nvtmd; - T2 = hypsmooth(IJTHDREV / Isbd - 10.0, 1.0e-3) + 10.0; - VjdmRev = -BVD - Nvtmd * lln((T2 - 1.0) / XJBVD); - T1 = XJBVD * lexp(-(BVD + VjdmRev) / Nvtmd); - IVjdmRev = Isbd * (1.0 + T1); - DslpRev = -Isbd * T1 / Nvtmd; - end - - // Junction Capacitance - Czbs = CJS_t * ASEJ; - Czbssw = CJSWS_t * PSEJ; - Czbsswg = CJSWGS_t * Weff0 * NFINtotal; - Czbd = CJD_t * ADEJ; - Czbdsw = CJSWD_t * PDEJ; - Czbdswg = CJSWGD_t * Weff0 * NFINtotal; - end - - // Generation-Recombination Current - T0 = Eg / Vtm * (TRatio - 1.0); - T1 = T0 / NTGEN_i; - igentemp = lexp(T1); - - end // End of temperature dependent calculations - - // ************************************************ - // * Bias dependent calculations follow * - // ************************************************ - - // Load Terminal Voltages - vgs_noswap = devsign * V(`IntrinsicGate, si); - vds_noswap = devsign * V(di, si); - vgd_noswap = devsign * V(`IntrinsicGate, di); - ves_jct = devsign * V(e, si); - ved_jct = devsign * V(e, di); - vge = devsign * V(`IntrinsicGate, e); - - // Source-Drain Interchange - sigvds = 1.0; - if (vds_noswap < 0.0) begin - sigvds = -1.0; - vgs = vgs_noswap - vds_noswap; - vds = -1.0 * vds_noswap; - ves = ved_jct; - end else begin - vgs = vgs_noswap; - vds = vds_noswap; - ves = ves_jct; - end - vgsfb = vgs - deltaPhi; - - // Initialize Certain Variables to Zero to Prevent Unnecessary Update - etaiv = 0.0; - Qes = 0.0; - Qesj = 0.0; - Qeg = 0.0; - Qed = 0.0; - Qedj = 0.0; - - // Vds Smoothing - vdsx = sqrt (vds * vds + 0.01) - 0.1; - - // Ves Smoothing - if (BULKMOD != 0) begin - vesx = ves - 0.5 * (vds - vdsx); - vesmax = 0.95 * PHIBE_i; - T2 = vesmax - vesx - 1.0e-3; - veseff = vesmax - 0.5 * (T2 + sqrt(T2 * T2 + 0.004 * vesmax)); - end - - // Asymmetry Model - T0 = tanh(0.6 * vds_noswap / Vtm); - wf = 0.5 + 0.5 * T0; - wr = 1.0 - wf; - if (ASYMMOD != 0) begin - CDSCD_a = CDSCDR_i * wr + CDSCD_i * wf; - ETA0_a = ETA0R_t * wr + ETA0_t * wf; - PDIBL1_a = PDIBL1R_i * wr + PDIBL1_i * wf; - PDIBL2_a = PDIBL2R_i * wr + PDIBL2_i * wf; - MEXP_a = MEXPR_t * wr + MEXP_t * wf; - PTWG_a = PTWGR_t * wr + PTWG_t * wf; - VSAT1_a = VSAT1R_t * wr + VSAT1_t * wf; - RSDR_a = RSDRR_t * wr + RSDR_t * wf; - RDDR_a = RDDRR_t * wr + RDDR_t * wf; - PCLM_a = PCLMR_i * wr + PCLM_i * wf; - VSAT_a = VSATR_t * wr + VSAT_t * wf; - KSATIV_a = KSATIVR_i * wr + KSATIV_i * wf; - DVTSHIFT_a = DVTSHIFTR_i * wr + DVTSHIFT_i * wf; - CIT_a = CITR_i * wr + CIT_i * wf; - u0_a = u0r * wr + u0 * wf; - UA_a = UAR_t*wr + UA_t * wf; - UD_a = UDR_t * wr + UD_t * wf; - UC_a = UCR_t * wr + UC_t * wf; - EU_a = EUR_i * wr + EU_i * wf; - end else begin - CDSCD_a = CDSCD_i; - ETA0_a = ETA0_t; - PDIBL1_a = PDIBL1_i; - PDIBL2_a = PDIBL2_i; - MEXP_a = MEXP_t; - PTWG_a = PTWG_t; - VSAT1_a = VSAT1_t; - RSDR_a = RSDR_t; - RDDR_a = RDDR_t; - PCLM_a = PCLM_i; - VSAT_a = VSAT_t; - KSATIV_a = KSATIV_i; - DVTSHIFT_a = DVTSHIFT_i; - CIT_a = CIT_i; - u0_a = u0; - UA_a = UA_t; - UD_a = UD_t; - UC_a = UC_t; - EU_a = EU_i; - end - - // Drain Saturation Voltage - inv_MEXP = 1.0 / MEXP_a; - - // SCE, DIBL, SS Degradation Effects (Ref: BSIM4 Model) - phist = 0.4 + phib + PHIN_i; - T1 = 2.0 * (Cins / Weff_UFCM) / (rc + 2.0); - cdsc = Theta_SW * (CDSC_i + CDSCD_a * vdsx); - - if (!$param_given(NVTM)) - nVtm = Vtm * ThetaSS * (1.0 + (CIT_a + cdsc) / T1); - else nVtm = NVTM; - - // temp deped UFCM - qdep = Qdep_ov_Cins / nVtm; - vth_fixed_factor_SI = ln(Cins * nVtm/(`q * Nc * 2.0 * Ach)); - vth_fixed_factor_Sub = ln((qdep * rc) * (qdep * rc) / ((exp(qdep * rc) - qdep * rc - 1.0))) + vth_fixed_factor_SI; - q0 = 10.0 * nVtm / rc + 2.0 * qbs; - - // New QM parameter calculation: fieldnormalizationfactor, auxQMfact, QMFACTORCVfinal - fieldnormalizationfactor = Vtm * Cins / (Weff_UFCM * epssub); - auxQMfact = pow(((3.0 / 4.0) * 3.0 * `HBAR * 2.0 * `M_PI * `q / (4.0 * sqrt(2.0 * mx))), 2.0 / 3.0); - QMFACTORCVfinal = QMFACTORCV * auxQMfact * pow(fieldnormalizationfactor, 2.0 / 3.0) * (1/(`q * Vtm)); - - dvth_vtroll = -DVT0_i * Theta_SCE * (vbi - phist); - dvth_dibl = -ETA0_a * Theta_DIBL * vdsx + (DVTP0_i * Theta_DITS * pow(vdsx, DVTP1_i)); - dvth_rsce = K1RSCE_i * Theta_RSCE * sqrt(phist); - dvth_all = dvth_vtroll + dvth_dibl + dvth_rsce + dvth_temp + DVTSHIFT_a; - vgsfb = vgsfb - dvth_all; - - // Vgs Clamping for Inversion Region Calculation in Accumulation - beta0 = u0_a * cox * Weff0 / Leff; - T0 = -(dvch_qm + nVtm * lln(2.0 * cox * Imin / (beta0 * nVtm * `q * Nc * TFIN))); - T1 = vgsfb + T0 + DELVTRAND; - vgsfbeff = hypsmooth(T1 , 1.0e-4) - T0; - - // Core Model Calculation at Source Side - vch = 0.0 + dvch_qm; - - if (BULKMOD != 0) begin - T1 = hypsmooth(2.0 * phib + vch - ves, 0.1); - T3 = (-K1_t / (2.0 * nVtm)) * (sqrt(T1) - sqrt(2.0 * phib)); - T0 = -qdep - T3 + vth_fixed_factor_Sub + QMFACTORCVfinal * pow(-qdep, 2.0/3.0); - T1 = -qdep - T3 + vth_fixed_factor_SI; - end else begin - T0 = -qdep + vth_fixed_factor_Sub + QMFACTORCVfinal * pow(-qdep, 2.0/3.0); - T1 = -qdep + vth_fixed_factor_SI; - end - T2 = (vgsfbeff - vch) / nVtm; - F0 = -T2 + T1; - T3 = 0.5 * (T2 - T0); - qm = exp(T3); - if (qm > 1.0e-7) begin - T7 = ln(1.0 + qm); - qm = 2.0 * (1.0 - sqrt(1.0 + T7 * T7)); - T8 = (qm * ALPHA_UFCM + qdep) * rc; - T4 = T8 / (exp(T8) - T8 - 1.0); - T5 = T8 * T4; - e0 = F0 - qm + ln(-qm) + ln(T5) + QMFACTORCVfinal * pow(-(qm + qdep), 2.0 / 3.0); - e1 = -1.0 + 1.0 / qm + (2.0 / T8 - T4 - 1.0) * rc - (2.0 / 3.0) * QMFACTORCVfinal * pow(-(qm + qdep), -1.0 / 3.0); - e2 = -1.0 / (qm * qm) - (2.0 / 9.0) * QMFACTORCVfinal * pow(-(qm + qdep), -4.0/3.0); - qm = qm - (e0 / e1) * (1.0 + (e0 * e2) / (2.0 * e1 * e1)); - T8 = (qm * ALPHA_UFCM + qdep) * rc; - T4 = T8 / (exp(T8) - T8 - 1.0); - T5 = T8 * T4; - e0 = F0 - qm + ln(-qm) + ln(T5) + QMFACTORCVfinal * pow(-(qm + qdep), 2.0 / 3.0); - e1 = -1.0 + 1.0 / qm + (2.0 / T8 - T4 - 1.0) * rc - (2.0 / 3.0) * QMFACTORCVfinal * pow(-(qm + qdep), -1.0/3.0); - e2 = -1.0 / (qm * qm) - (2.0 / 9.0) * QMFACTORCVfinal * pow(-(qm + qdep), -4.0/3.0); - qm = qm - (e0 / e1) * (1.0 + (e0 * e2) / (2.0 * e1 * e1)); - end else begin - qm = -qm * qm; - end - qis = -qm * nVtm; - - // Drain Saturation Voltage - Eeffs = EeffFactor * (qbs + eta_mu * qis); - qb0 = 1.0e-2 / cox; - T2 = pow(0.5 * (1.0 + abs((qis) / qb0)), UCS_t); - if (BULKMOD != 0) begin - T3 = (UA_a + UC_a * veseff) * pow(abs(Eeffs), EU_a) + UD_a / T2; - end else begin - T3 = UA_a * pow(abs(Eeffs), EU_a) + UD_a / T2; - end - Dmobs = 1.0 + T3; - Dmobs = Dmobs / U0MULT; - - if (RDSMOD == 1) begin - Rdss = 0.0; - end else if (RDSMOD == 0) begin - T4 = 1.0 + PRWGS_i * qis; - T1 = 1.0 / T4; - T0 = 0.5 * (T1 + sqrt(T1 * T1 + 0.01)); - Rdss = (RDSWMIN_i + RDSW_i * T0) * WeffWRFactor * NFINtotal * rdstemp; - end else begin - T4 = 1.0 + PRWGS_i * qis; - T1 = 1.0 / T4; - T0 = 0.5 * (T1 + sqrt(T1 * T1 + 0.01)); - Rdss = (RSourceGeo + RDrainGeo + RDSWMIN_i + RDSW_i * T0) * WeffWRFactor * NFINtotal * rdstemp; - end - - Esat = 2.0 * VSAT_a / u0_a * Dmobs; - EsatL = Esat * Leff; - T6 = KSATIV_a * (qis + 2 * Vtm); - - if (Rdss == 0.0) begin - Vdsat = EsatL * T6 / (EsatL + T6); - end else begin - WVCox = Weff0 * VSAT_a * cox; - T0 = WVCox * Rdss; - Ta = 2.0 * T0; - Tb = T6 + EsatL + 3.0 * T6 * T0; - Tc = T6 * (EsatL + 2.0 * T6 * T0); - Vdsat = (Tb - sqrt(Tb * Tb - 2.0 * Ta * Tc)) / Ta; - end - Vdsat = hypsmooth(Vdsat - 1.0e-3, 1.0e-5) + 1.0e-3; - T7 = pow(vds / Vdsat , MEXP_a); - T8 = pow(1.0 + T7, inv_MEXP); - Vdseff = vds / T8; - - if (Vdseff > vds) begin - Vdseff = vds; - end - - // Core Model Calculation at Drain Side - vch = Vdseff + dvch_qm; - - if (BULKMOD != 0) begin - T1 = hypsmooth(2.0 * phib + vch - ves, 0.1); - T3 = (-K1_t / (2.0 * nVtm)) * (sqrt(T1) - sqrt(2.0 * phib)); - T0 = -qdep - T3 + vth_fixed_factor_Sub + QMFACTORCVfinal * pow(-qdep, 2.0 / 3.0); - T1 = -qdep - T3 + vth_fixed_factor_SI; - end else begin - T0 = -qdep + vth_fixed_factor_Sub + QMFACTORCVfinal * pow(-qdep, 2.0 / 3.0); - T1 = -qdep + vth_fixed_factor_SI; - end - T2 = (vgsfbeff - vch) / nVtm; - F0 = -T2 + T1; - T3 = (T2 - T0) * 0.5; - qm = exp(T3); - if (qm > 1.0e-7) begin - T7 = ln(1.0 + qm); - qm = 2.0 * (1.0 - sqrt(1.0 + T7 * T7)); - T8 = (qm * ALPHA_UFCM + qdep) * rc; - T4 = T8 / (exp(T8) - T8 - 1.0); - T5 = T8 * T4; - e0 = F0 - qm + ln(-qm) + ln(T5) + QMFACTORCVfinal * pow(-(qm + qdep), 2.0 / 3.0); - e1 = -1.0 + (1.0 / qm) + (2.0 / T8 - T4 - 1.0) * rc - (2.0 / 3.0) * QMFACTORCVfinal * pow(-(qm + qdep), -1.0 / 3.0); - e2 = -1.0 / (qm * qm) - (2.0 / 9.0) * QMFACTORCVfinal * pow(-(qm + qdep), -4.0 / 3.0); - qm = qm - (e0 / e1)*(1.0 + (e0 * e2) / (2.0 * e1 * e1)); - T8 = (qm * ALPHA_UFCM + qdep) * rc; - T4 = T8 / (exp(T8) - T8 - 1.0); - T5 = T8 * T4; - e0 = F0 - qm + ln(-qm) + ln(T5) + QMFACTORCVfinal * pow(-(qm + qdep), 2.0/3.0); - e1 = -1.0 + (1.0 / qm) + (2.0 / T8 - T4 - 1.0) * rc - (2.0 / 3.0) * QMFACTORCVfinal * pow(-(qm + qdep), -1.0 / 3.0); - e2 = -1.0 / (qm * qm) - (2.0 / 9.0) * QMFACTORCVfinal * pow(-(qm + qdep), -4.0 / 3.0); - qm = qm - (e0 / e1) * (1.0 + (e0 * e2) / (2.0 * e1 * e1)); - end else begin - qm = -qm * qm; - end - qid = -qm * nVtm; - - if (BULKMOD != 0) begin - T9 = (K1_t / (2.0 * nVtm)) * sqrt(Vtm); - T0 = T9 / 2.0; - T2 = (vge - (deltaPhi - Eg - Vtm * ln(NBODY / Nc) + DELVFBACC)) / Vtm; - if ((T2 * Vtm) > phib + T9 * sqrt(phib * Vtm)) begin - T1 = sqrt(T2 - 1.0 + T0 * T0) - T0; - T10 = 1.0 + T1 * T1; - end else begin - T3 = T2 * 0.5 - 3.0 * (1.0 + T9 / sqrt(2.0)); - T10 = T3 + sqrt(T3 * T3 + 6.0 * T2); - if (T2 < 0.0) begin - T4 = (T2 - T10) / T9; - T10 = -ln(1.0 - T10 + T4 * T4 ); - end else begin - T11 = exp(-T10); - T4 = sqrt(T2 - 1.0 + T11 + T0 * T0) - T0; - T10 = 1.0 - T11 + T4 * T4; - end - end - T6 = exp(-T10) - 1.0; - T7 = sqrt(T6 + T10); - if (T10 > 1.0e-15) begin - e0 = -(T2 - T10) + T9 * T7; - e1 = 1.0 - T9 * 0.5 * T6 / T7; - T8 = T10 - (e0 / e1); - T11 = exp(-T8) - 1.0; - T12 = sqrt(T11 + T8); - qba = -T9 * T12 * Vtm; - end else begin - if (T10 < -1.0e-15) begin - e0 = -(T2 - T10) - T9 * T7; - e1 = 1.0 + T9 * 0.5 * T6 / T7; - T8 = T10 - e0 / e1; - T12 = T9 * sqrt(exp(-T8) + T8 - 1.0); - end else begin - T12 = 0.0; - T8 = 0.0; - end - qba = T12 * Vtm; - end - qi_acc_for_QM = T9 * exp(-T8 / 2.0) * Vtm; - - psipclamp = 0.5 * (T8 + 1.0 + sqrt((T8 - 1.0) * (T8 - 1.0) + 0.25 * 2.0 * 2.0)); - sqrtpsip = sqrt(psipclamp); - nq = 1.0 + T9 / sqrtpsip; - end - - // Drain Side and Average Potential / Charge - qia = 0.5 * (qis + qid); - dqi = qis - qid; - - T0 = pow(Vdseff, 2.0) / 6.25e-4; // pow(Vdseff,2.0) / pow(25e-3, 2.0) - if (CHARGEWF != 0.0) - qia2 = 0.5 * (qis + qid) + CHARGEWF * (1.0 - lexp(-T0)) * 0.5 * dqi; - else - qia2 = 0.5 * (qis + qid); - - `ifdef __DEBUG__ - if (qis < 0.0) $strobe("Warning: negative source-side inversion carrier density. Vgs=%f Vds=%f Vbs=%f qis=%e", V(g, s), V(d, s), V(e, s), qis); - if (qid < 0.0) $strobe("Warning: negative drain-side inversion carrier density. Vgs=%f Vds=%f Vbs=%f qid=%e", V(g, s), V(d, s), V(e, s), qid); - `endif - - // Toxeff model for quantum mechanical effects - // Normal operation (Vgs > Vfb) - if (QMTCENCV_i > 0.0) begin - T4 = qia / QM0; - T5 = 1.0 + pow(T4, PQM); - Tcen = Tcen0 / T5; - coxeff = 1.0 / (1.0 / (cox * EOT / TOXP) + Tcen * QMTCENCV_i / epssub); - end else begin - coxeff = cox; - end - - // Quantum Mechanical Effect Correction for Accumulation Side Cap (Vgs < Vfb) - if (BULKMOD != 0 && QMTCENCVA_i != 0.0) begin - T6 = 1.0 + pow(qi_acc_for_QM / QM0ACC, PQMACC); - Tcen = Tcen0 / T6; - cox_acc = 1.0 / (1.0 / cox_acc + Tcen * QMTCENCVA_i / epssub); - end - - // Multiplication Factor for I-V - beta = u0_a * cox * Weff0 / Leff; - - // Mobility Degradation - Eeffm = EeffFactor * (qba + eta_mu * qia2); - T2 = pow(0.5 * (1.0 + abs((qia2) / qb0)), UCS_t); - if (BULKMOD != 0) begin - T3 = (UA_a + UC_a * veseff) * pow(abs(Eeffm), EU_a) + UD_a / T2; - end else begin - T3 = UA_a * pow(abs(Eeffm), EU_a) + UD_a / T2; - end - Dmob = 1.0 + T3; - Dmob = Dmob / U0MULT; - ueff = u0_a / Dmob; - - // Mobility Degradation for C-V - Eeffm_cv = EeffFactor * (qba + eta_mu_cv * qia2); - T3 = UA_a * pow(abs(Eeffm_cv), EU_a) + UD_a / T2; - Dmob_cv = 1.0 + T3; - Dmob_cv = Dmob_cv / U0MULT; - - // Calculate current and capacitance enhancement factors due to CLM and DIBL - tmp = DROUT_i * Leff / scl + 1.0e-6; - - if (tmp < 40.0) begin - DIBLfactor = 0.5 * PDIBL1_a / (cosh(tmp) - 1.0) + PDIBL2_a; - end else begin - DIBLfactor = PDIBL1_a * exp(-tmp) + PDIBL2_a; - end - - if (PVAG_i > 0.0) begin - PVAGfactor = 1.0 + PVAG_i * qia / EsatL; - end else begin - PVAGfactor = 1.0 / (1.0 - PVAG_i * qia / EsatL); - end - - if (Vdseff > vds) begin - Vdseff = vds; - end - diffVds = vds - Vdseff; - Vgst2Vtm = qia + 2.0 * Vtm; - if (DIBLfactor > 0) begin - T1 = Vgst2Vtm; - T3 = T1 / (Vdsat + T1); - VaDIBL = T1 / DIBLfactor * T3 * PVAGfactor; - Moc = 1.0 + diffVds / VaDIBL; - end else begin - Moc = 1.0; - end - - if (PCLM_a > 0.0) begin - if (PCLMG_i < 0.0) begin - T1 = 1.0 / (1.0 / PCLM_a - PCLMG_i * qia); - end else begin - T1 = PCLM_a + PCLMG_i * qia; - end - Mclm = 1.0 + T1 * lln(1.0 + (vds - Vdseff) / T1 / (Vdsat + EsatL)); - end else begin - Mclm = 1.0; - end - - Moc = Moc * Mclm; - - // Current Degradation Factor Due to Velocity Saturation - Esat1 = 2.0 * VSAT1_a / ueff; - Esat1L = Esat1 * Leff; - T0 = lexp(PSAT_i * lln(dqi / Esat1L)); - Ta = (1.0 + lexp(1.0 / PSAT_i * lln(DELTAVSAT_i))); - Dvsat = (1.0 + lexp(1.0 / PSAT_i * lln(DELTAVSAT_i + T0))) / Ta; - Dvsat = Dvsat + 0.5 * PTWG_a * qia * dqi * dqi; - - // Non-Saturation Effect - T0 = A1_t + A2_t / (qia + 2.0 * nVtm); - T1 = T0 * dqi * dqi; - T2 = T1 + 1.0 - 0.001; - T3 = -1.0 + 0.5 * (T2 + sqrt(T2 * T2 + 0.004)); // max(T1, -1.0) - Nsat = 0.5 * (1.0 + sqrt(1.0 + T3)); - Dvsat = Dvsat * Nsat; - - // Lateral Non-uniform doping effect (IV-CV Vth shift) factor - if (K0_t != 0) begin - T1 = K0_t / (max(0, K0SI_t + K0SISAT_t * dqi * dqi) * qia + 2.0 * nVtm); - Mnud = lexp(-T1); - end else begin - Mnud = 1.0; - end - - // Body-Effect Factor for BULKMOD = 2 - if (BULKMOD == 2) begin - T0 = hypsmooth((K2_t + K2SAT_t * vdsx), 1.0e-6); - T1 = T0 / (max(0, K2SI_t + K2SISAT_t * dqi * dqi) * qia + 2.0 * nVtm); - T3 = sqrt(PHIBE_i - veseff) - sqrt(PHIBE_i); - Mob = lexp(- T1 * T3); - end else - Mob = 1.0; - - // Velocity Saturation Factor for C-V - EsatCV = 2.0 * VSATCV_t * Dmob_cv / u0_a; - EsatCVL = EsatCV * LeffCV; - T0 = lexp(PSATCV_i * lln(dqi / EsatCVL)); - Ta = (1.0 + lexp(1.0 / PSATCV_i * lln(DELTAVSATCV_i))); - DvsatCV = (1.0 + lexp(1.0 / PSATCV_i * lln(DELTAVSATCV_i + T0))) / Ta; - - // Channel Length Modulation factor for C-V - if (PCLMCV_i != 0) begin - MclmCV = 1.0 + PCLMCV_i * lln(1.0 + (vds - Vdseff) / PCLMCV_i / (Vdsat + EsatCVL)); - end else begin - MclmCV = 1.0; - end - - // Calculating fixed body charge qb with sign (Here to avoid multiple calculation in NQSMOD=3 case) - qb = -`q * nbody * Ach * LeffCV; - - // ************************************************ - // * Current and Charges Calculations * - // ************************************************ - // Quasi Static I-V Model - T1 = qia; - etaiv = q0 / (q0 + qia); - T2 = (2.0 - etaiv) * nVtm; - ids0_ov_dqi = T1 + T2; - ids0 = ids0_ov_dqi * dqi; - - // S/D Series Resistance - `include "bsimcmg_rdsmod.include" - - ids = NFINtotal * beta * ids0 * Moc * Mnud * Mob / (Dmob * Dvsat * Dr); - ids = ids * IDS0MULT; - - // Quasi Static C-V Model - `include "bsimcmg_quasi_static_cv.include" - - // Parasitic Capacitances - // Bias-dependent overlap capacitances (CGEOMOD = 0 and 2) - qgs_ov = 0.0; - qgd_ov = 0.0; - if (CGEOMOD != 1) begin - T1 = NFINtotal * WeffCV0 * devsign; - T2 = devsign * V(`GateEdgeNode, si); - T0 = T2 - vfbsdcv + `DELTA_1; - vgs_overlap = 0.5 * (T0 - sqrt(T0 * T0 + 4.0 * `DELTA_1)); - qgs_ov = T1 * (CGSL_i * (T2 - vfbsdcv - vgs_overlap - 0.5 * CKAPPAS_i * (sqrt(1.0 - 4.0 * vgs_overlap / CKAPPAS_i) - 1.0)) + CGSO_i * T2); - T2 = devsign * V(`GateEdgeNode, di); - T0 = T2 - vfbsdcv + `DELTA_1; - vgd_overlap = 0.5 * (T0 - sqrt(T0 * T0 + 4.0 * `DELTA_1)); - qgd_ov = T1 * (CGDL_i * (T2 - vfbsdcv - vgd_overlap - 0.5 * CKAPPAD_i * (sqrt(1.0 - 4.0 * vgd_overlap / CKAPPAD_i) - 1.0)) + CGDO_i * T2); - end - - if (CGEOMOD == 0) begin - T1 = NFINtotal * WeffCV0; // Fringe caps dont see QM effects - qgs_fr = T1 * CFS_i * V(`GateEdgeNode, si); - qgd_fr = T1 * CFD_i * V(`GateEdgeNode, di); - qgs_parasitic = qgs_ov + qgs_fr; - qgd_parasitic = qgd_ov + qgd_fr; - end else if (CGEOMOD == 1) begin // CGEO1SW=1 enables parameters to be in F per fin, per gate-finger, per unit channel width - if (CGEO1SW == 1) begin - T0 = NFINtotal * WeffCV0; - COVS_i = T0 * COVS_i; - COVD_i = T0 * COVD_i; - cgsp = T0 * CGSP; - cgdp = T0 * CGDP; - end else begin - cgsp = CGSP; - cgdp = CGDP; - end - qgs_ov = COVS_i * V(`GateEdgeNode, si); - qgd_ov = COVD_i * V(`GateEdgeNode, di); - qgs_parasitic = qgs_ov; - qgd_parasitic = qgd_ov; - qgs_fr = cgsp * V(`GateEdgeNode, s); - qgd_fr = cgdp * V(`GateEdgeNode, d); - end else begin - qgs_fr = Cfr_geo * V(`GateEdgeNode, si); - qgd_fr = Cfr_geo * V(`GateEdgeNode, di); - qgs_parasitic = qgs_ov + qgs_fr; - qgd_parasitic = qgd_ov + qgd_fr; - end - - // Drain-to-Source Fringe Capacitance Available for all CGEOMOD - qds_fr = CDSP * V(d, s); - - // Impact Ionization Current (Ref: IIMOD = 1 from BSIM4 Model, IIMOD = 2 from BSIMSOI Model) - Iii = 0.0; - if (IIMOD == 1) begin - T0 = (ALPHA0_t + ALPHA1_t * Leff) / Leff; - if ((T0 <= 0.0) || (BETA0_t <= 0.0)) - Iii = 0.0; - else begin - T1 = -BETA0_t / (diffVds + 1.0e-30); - Iii = T0 * diffVds * ids * lexp(T1); - end - end else if (IIMOD == 2) begin //End of IIMOD=1 - ALPHAII = (ALPHAII0_t + ALPHAII1_t * Leff) / Leff; - if (ALPHAII <= 0.0) begin - Iii = 0.0; - end else begin - T0 = ESATII_i * Leff; - T1 = SII0_t * T0 / (1.0 + T0); - T0 = 1.0 / (1.0 + hypsmooth(SII1_i * vgsfbeff, IIMOD2CLAMP1)); // T0 = 1 / (1 + SII1_i * vgsfbeff) - T3 = T0 + SII2_i; - T2 = hypsmooth(vgsfbeff * T3, IIMOD2CLAMP2); // T2 = vgsfbeff * T3 - T3 = 1.0 / (1.0 + SIID_i * vds); - VgsStep = T1 * T2 * T3; - Vdsatii = VgsStep * (1.0 - LII_i / Leff); - Vdiff = vds - Vdsatii; - T0 = BETAII2_i + BETAII1_i * Vdiff + BETAII0_i * Vdiff * Vdiff; - T1 = sqrt(T0 * T0 + 1.0e-10); - Ratio = -hypmax( -ALPHAII * lexp(Vdiff / T1), -10.0, IIMOD2CLAMP3); - Iii = Ratio * ids; - end - end // End of IIMOD=2 - - // Gate Current (Ref: BSIM4 Model) - igbinv = 0.0; - igbacc = 0.0; - igcs = 0.0; - igcd = 0.0; - igs = 0.0; - igd = 0.0; - - // Igb - if (IGBMOD != 0) begin - // Igbinv - T1 = (qia - EIGBINV_i) / NIGBINV_i / Vtm; - Vaux_Igbinv = NIGBINV_i * Vtm * lln(1.0 + lexp(T1)); - T2 = AIGBINV_t - BIGBINV_i * qia; - T3 = 1.0 + CIGBINV_i * qia; - T4 = -9.82222e11 * TOXG * T2 * T3; - T5 = lexp(T4); - T6 = 3.75956e-7; - igbinv = Weff0 * Leff * T6 * Toxratio * vge * Vaux_Igbinv * T5; - igbinv = igbinv * igtemp; - - // Igbacc - vfbzb = deltaPhi - (Eg / 2.0) - phib; - T0 = vfbzb - vge; - T1 = T0 / NIGBACC_i / Vtm; - Vaux_Igbacc = NIGBACC_i * Vtm * lln(1.0 + lexp(T1)); - if (BULKMOD != 0) begin - Voxacc = qi_acc_for_QM; - end else begin - if (vfbzb <= 0) - Voxacc = 0.5 * (T0 - 0.02 + sqrt((T0 - 0.02) * (T0 - 0.02) - 0.08 * vfbzb)); - else - Voxacc = 0.5 * (T0 - 0.02 + sqrt((T0 - 0.02) * (T0 - 0.02) + 0.08 * vfbzb)); - end - T2 = AIGBACC_t - BIGBACC_i * Voxacc; - T3 = 1.0 + CIGBACC_i * Voxacc; - T4 = -7.45669e11 * TOXG * T2 * T3; - T5 = lexp(T4); - T6 = 4.97232e-7; - igbacc = Weff0 * Leff * T6 * Toxratio * vge * Vaux_Igbacc * T5; - igbacc = igbacc * igtemp; - - end - - if (IGCMOD != 0) begin - // Igcinv - T1 = AIGC_t - BIGC_i * qia; - T2 = 1.0 + CIGC_i * qia; - T3 = -Bechvb * TOXG * T1 * T2; - T4 = qia * lexp(T3); - T5 = (vge + 0.5 * vdsx + 0.5 * (ves_jct + ved_jct)); - igc0 = Weff0 * Leff * Aechvb * Toxratio * T4 * T5 * igtemp; - - // Gate-Current Partitioning - Vdseffx = sqrt(Vdseff * Vdseff + 0.01) - 0.1; - T1 = PIGCD_i * Vdseffx; - T1_exp = lexp(-T1); - T3 = T1 + T1_exp - 1.0 + 1.0e-4; - T4 = 1.0 - (T1 + 1.0) * T1_exp + 1.0e-4; - T5 = T1 * T1 + 2.0e-4; - igcd = igc0 * T4 / T5; - igcs = igc0 * T3 / T5; - - // Igs - T0 = vgs_noswap - vfbsd; - vgs_eff = sqrt(T0 * T0 + 1.0e-4); - if (IGCLAMP == 1) begin - T1 = hypsmooth((AIGS_t - BIGS_i * vgs_eff), 1.0e-6); - if (CIGS_i < 0.01) begin - CIGS_i = 0.01; - end - end else begin - T1 = AIGS_t - BIGS_i * vgs_eff; - end - T2 = 1.0 + CIGS_i * vgs_eff; - T3 = -Bechvb * TOXG * POXEDGE_i * T1 * T2; - T4 = lexp(T3); - if (sigvds > 0.0) begin - igs = igsd_mult * DLCIGS * vgs_noswap * vgs_eff * T4; - end else begin - igd = igsd_mult * DLCIGS * vgs_noswap * vgs_eff * T4; - end - - // Igd - T0 = vgd_noswap - vfbsd; - vgd_eff = sqrt(T0 * T0 + 1.0e-4); - if (IGCLAMP == 1) begin - T1 = hypsmooth((AIGD_t - BIGD_i * vgd_eff), 1.0e-6); - if (CIGD_i < 0.01) begin - CIGD_i = 0.01; - end - end else begin - T1 = AIGD_t - BIGD_i * vgd_eff; - end - T2 = 1.0 + CIGD_i * vgd_eff; - T3 = -Bechvb * TOXG * POXEDGE_i * T1 * T2; - T4 = lexp(T3); - - if (sigvds > 0.0) begin - igd = igsd_mult * DLCIGD * vgd_noswap * vgd_eff * T4; - end else begin - igs = igsd_mult * DLCIGD * vgd_noswap * vgd_eff * T4; - end - end - - // GIDL/GISL Current (Ref: BSIM4 Model) - igisl = 0.0; - igidl = 0.0; - - if (GIDLMOD != 0) begin - T0 = epsratio * EOT; - // GIDL - if ((AGIDL_i <= 0.0) || (BGIDL_t <= 0.0)) begin - T6 = 0.0; - end else begin - T1 = (-vgd_noswap - EGIDL_i + vfbsd) / T0; - T1 = hypsmooth(T1, 1.0e-2); - T2 = BGIDL_t / (T1 + 1.0e-3); - T3 = lexp(PGIDL_i * lln(T1)); - if (BULKMOD != 0) begin - T4 = -ved_jct*ved_jct*ved_jct; - T4a = CGIDL_i + abs(T4) + 1.0e-5; - T5 = hypsmooth(T4/T4a, 1.0e-6) - 1.0e-6; - T6 = AGIDL_i * Weff0 * T3 * lexp(-T2) * T5; - end else begin - T6 = AGIDL_i * Weff0 * T3 * lexp(-T2) * vds_noswap; - end - end - - if (sigvds > 0.0) begin - igidl = T6; - end else begin - igisl = T6; - end - - // GISL - if ((AGISL_i <= 0.0) || (BGISL_t <= 0.0)) begin - T6 = 0.0; - end else begin - T1 = (-vgs_noswap - EGISL_i + vfbsd) / T0; - T1 = hypsmooth(T1, 1.0e-2); - T2 = BGISL_t / (T1 + 1.0e-3); - T3 = lexp(PGISL_i * lln(T1)); - if (BULKMOD != 0) begin - T4 = -ves_jct * ves_jct * ves_jct; - T4a = CGISL_i + abs(T4) + 1.0e-5; - T5 = hypsmooth(T4/T4a, 1.0e-6) - 1.0e-6; - T6 = AGISL_i * Weff0 * T3 * lexp(-T2) * T5; - end else - T6 = AGISL_i * Weff0 * T3 * lexp(-T2) * (-vds_noswap); - end - - if (sigvds > 0.0) begin - igisl = T6; - end else begin - igidl = T6; - end - - end // End of GIDLMOD - - // Junction Current - if (BULKMOD != 0) begin - // Source-Side Junction Current - if (Isbs > 0.0) begin - if (ves_jct < VjsmRev) begin - T0 = ves_jct / Nvtms; - T1 = lexp(T0) - 1.0; - T2 = IVjsmRev + SslpRev * (ves_jct - VjsmRev); - Ies = T1 * T2; - end else if (ves_jct <= VjsmFwd) begin - T0 = ves_jct / Nvtms; - T1 = (BVS + ves_jct) / Nvtms; - T2 = lexp(-T1); - Ies = Isbs * (lexp(T0) + XExpBVS - 1.0 - XJBVS * T2); - end else begin - Ies = IVjsmFwd + SslpFwd * (ves_jct - VjsmFwd); - end - end else begin - Ies = 0.0; - end - - // Source-Side Junction Tunneling Current - if (JTSS_t > 0.0) begin - if ((VTSS - ves_jct) < (VTSS * 1.0e-3)) begin - T0 = -ves_jct / Vtm0 / NJTS_t; - T1 = lexp(T0 * 1.0e3) - 1.0; - Ies = Ies - ASEJ * JTSS_t * T1; - end else begin - T0 = -ves_jct / Vtm0 / NJTS_t; - T1 = lexp(T0 * VTSS / (VTSS - ves_jct)) - 1.0; - Ies = Ies - ASEJ * JTSS_t * T1; - end - end - - if (JTSSWS_t > 0.0) begin - if ((VTSSWS - ves_jct) < (VTSSWS * 1.0e-3)) begin - T0 = -ves_jct / Vtm0 / NJTSSW_t; - T1 = lexp(T0 * 1.0e3) - 1.0; - Ies = Ies - PSEJ * JTSSWS_t * T1; - end else begin - T0 = -ves_jct / Vtm0 / NJTSSW_t; - T1 = lexp(T0 * VTSSWS / (VTSSWS - ves_jct)) - 1.0; - Ies = Ies - PSEJ * JTSSWS_t * T1; - end - end - - if (JTSSWGS_t > 0.0) begin - if ((VTSSWGS - ves_jct) < (VTSSWGS * 1.0e-3)) begin - T0 = -ves_jct / Vtm0 / NJTSSWG_t; - T1 = lexp(T0 * 1.0e3) - 1.0; - Ies = Ies - Weff0 * NFINtotal * JTSSWGS_t * T1; - end else begin - T0 = -ves_jct / Vtm0 / NJTSSWG_t; - T1 = lexp(T0 * VTSSWGS / (VTSSWGS - ves_jct)) - 1.0; - Ies = Ies - Weff0 * NFINtotal * JTSSWGS_t * T1; - end - end - - // Drain-Side Junction Current - if (Isbd > 0.0) begin - if (ved_jct < VjdmRev) begin - T0 = ved_jct / Nvtmd; - T1 = lexp(T0) - 1.0; - T2 = IVjdmRev + DslpRev * (ved_jct - VjdmRev); - Ied = T1 * T2; - end else if (ved_jct <= VjdmFwd) begin - T0 = ved_jct / Nvtmd; - T1 = (BVD + ved_jct) / Nvtmd; - T2 = lexp(-T1); - Ied = Isbd * (lexp(T0) + XExpBVD - 1.0 - XJBVD * T2); - end else - Ied = IVjdmFwd + DslpFwd * (ved_jct - VjdmFwd); - end else - Ied = 0.0; - - // Drain-Side Junction Tunneling Current - if (JTSD_t > 0.0) begin - if ((VTSD - ved_jct) < (VTSD * 1.0e-3)) begin - T0 = -ved_jct / Vtm0 / NJTSD_t; - T1 = lexp(T0 * 1.0e3) - 1.0; - Ied = Ied - ADEJ * JTSD_t * T1; - end else begin - T0 = -ved_jct / Vtm0 / NJTSD_t; - T1 = lexp(T0 * VTSD/ (VTSD - ved_jct)) - 1.0; - Ied = Ied - ADEJ * JTSD_t * T1; - end - end - if (JTSSWD_t > 0.0) begin - if ((VTSSWD - ved_jct) < (VTSSWD * 1.0e-3)) begin - T0 = -ved_jct / Vtm0 / NJTSSWD_t; - T1 = lexp(T0 * 1.0e3) - 1.0; - Ied = Ied - PDEJ * JTSSWD_t * T1; - end else begin - T0 = -ved_jct / Vtm0 / NJTSSWD_t; - T1 = lexp(T0 * VTSSWD / (VTSSWD - ved_jct)) - 1.0; - Ied = Ied - PDEJ * JTSSWD_t * T1; - end - end - if (JTSSWGD_t > 0.0) begin - if ((VTSSWGD - ved_jct) < (VTSSWGD * 1.0e-3)) begin - T0 = -ved_jct / Vtm0 / NJTSSWGD_t; - T1 = lexp(T0 * 1.0e3) - 1.0; - Ied = Ied - Weff0 * NFINtotal * JTSSWGD_t * T1; - end else begin - T0 = -ved_jct / Vtm0 / NJTSSWGD_t; - T1 = lexp(T0 * VTSSWGD / (VTSSWGD - ved_jct)) - 1.0; - Ied = Ied - Weff0 * NFINtotal * JTSSWGD_t * T1; - end - end - - // Junction Capacitance (No Swapping) - // Source-Substrate Junction - `BSIM6JunctnCap(ves_jct, Czbs, PBS_t, SJS, MJS, MJS2, Qesj1) - `BSIM6JunctnCap(ves_jct, Czbssw, PBSWS_t, SJSWS, MJSWS, MJSWS2, Qesj2) - `BSIM6JunctnCap(ves_jct, Czbsswg, PBSWGS_t, SJSWGS, MJSWGS, MJSWGS2, Qesj3) - Qesj = Qesj1 + Qesj2 + Qesj3; - - // Drain-Substrate Junction - `BSIM6JunctnCap(ved_jct, Czbd, PBD_t, SJD, MJD, MJD2, Qedj1) - `BSIM6JunctnCap(ved_jct, Czbdsw, PBSWD_t, SJSWD, MJSWD, MJSWD2, Qedj2) - `BSIM6JunctnCap(ved_jct, Czbdswg, PBSWGD_t, SJSWGD, MJSWGD, MJSWGD2, Qedj3) - Qedj = Qedj1 + Qedj2 + Qedj3; - - end // BULKMOD=0 - - Qes = Qesj + csbox * ves_jct; - Qed = Qedj + cdbox * ved_jct; - - // Gate-to-Substrate Parasitic Capacitance - // Bias Independent Component - Qeg = cgbox * devsign * V(e, `GateEdgeNode); - if (BULKMOD != 0) begin - // Bias Dependent Component - T2 = devsign * V(`GateEdgeNode, e); - T3 = T2 - deltaPhi + Eg / 2.0 + phib - DELVFBACC; - T0 = T3 + `DELTA_1; - vge_overlap = 0.5 * (T0 + sqrt(T0 * T0 + 4.0 * `DELTA_1)); - Qeg = Qeg - NFINtotal * LeffCV * (CGBL_i * (T3 - vge_overlap + 0.5 * CKAPPAB_i * ( sqrt(1.0 + 4.0 * vge_overlap / CKAPPAB_i) - 1.0 ))); - end - - // Generation-Recombination Component - T0 = vds; - T1 = T0 * (AIGEN_i + BIGEN_i * T0 * T0); - idsgen = HFIN * TFIN * (Leff - 2.0 * LINTIGEN_i) * igentemp * T1; - - // NQS Gate Resistance (Ref: BSIM4 Model) - T0 = ueff * coxeff * Weff0 / Leff; - - `ifdef __NQSMOD1__ - if (NQSMOD == 1 && XRCRG1_i != 0) begin - IdovVds = beta * ids0_ov_dqi * Moc / (Dmob * Dvsat * Dr); - gcrg = NFINtotal * XRCRG1_i * (IdovVds + XRCRG2_i * Vtm * T0); - end - `endif - - `ifdef __NQSMOD2__ - if (NQSMOD == 2) begin - IdovVds = beta * ids0_ov_dqi * Moc / (Dmob * Dvsat * Dr); - gcrg = NFINtotal * XRCRG1_i * (IdovVds + XRCRG2_i * Vtm * T0); - gtau = gcrg / (cox * Weff0 * Leff); - end - `endif - - // *** Multiply all current and charge components by NFINtotal *** - // Note: Do not multiply ids, qg, qs, qd, qb, Ies, Ied, Qbs, Qbd with NFINtotal - // since it is already considered. - - igidl = NFINtotal * igidl; - igisl = NFINtotal * igisl; - igcd = NFINtotal * igcd; - igcs = NFINtotal * igcs; - igs = NFINtotal * igs; - igd = NFINtotal * igd; - igbinv = NFINtotal * igbinv; - igbacc = NFINtotal * igbacc; - idsgen = NFINtotal * idsgen; - - // Gate to Body Tunneling Current Empirical Partition for BULKMOD = 0 - igbs = 0.0; - igbd = 0.0; - if (BULKMOD == 0) begin - igbs = (igbinv + igbacc) * wf; - igbd = (igbinv + igbacc) * wr; - end - - // Noise Models - Esatnoi = 2.0 * VSAT_a / ueff; // Thermal noise and flicker noise - - // Flicker Noise (Ref: BSIM4 Model from K. K. Hung et al. TED 1990) - if (NOIA > 0.0 || NOIB > 0.0 || NOIC > 0.0) begin - Leffnoi = Leff - 2.0 * LINTNOI_i; - Leffnoisq = Leffnoi * Leffnoi; - if (EM <= 0.0) begin - DelClm = 0.0; - end else begin - T0 = (diffVds / litl + EM) / Esatnoi; - DelClm = litl * lln(T0); - if (DelClm < 0.0) begin - DelClm = 0.0; - end - end - T1 = `q * `q * `q * Vtm * abs(ids) * ueff; - T2 = 1.0e10 * coxeff * Leffnoisq; - N0 = coxeff * qis / `q; - Nl = coxeff * qid / `q; - Nstar = Vtm / `q * (coxeff + CIT_a); - T3 = NOIA * lln((N0 + Nstar) / (Nl + Nstar)); - T4 = NOIB * (N0 - Nl); - T5 = 0.5 * NOIC * (N0 * N0 - Nl * Nl); - T6 = `q * Vtm * ids * ids; - T7 = 1.0e10 * Leffnoisq * Weff0 * NFINtotal; - T8 = NOIA + NOIB * Nl + NOIC * Nl * Nl; - T9 = (Nl + Nstar) * (Nl + Nstar); - Ssi = T1 / T2 * (T3 + T4 + T5) + T6 / T7 * DelClm * T8 / T9; - T10 = NOIA * `q * Vtm; - T11 = Weff0 * NFINtotal * Leffnoi * 1.0e10 * Nstar * Nstar; - Swi = T10 / T11 * ids * ids; - T1 = Swi + Ssi; - if (T1 > 0.0) begin - FNPowerAt1Hz = (Ssi * Swi) / T1; - end else begin - FNPowerAt1Hz = 0.0; - end - end else begin - FNPowerAt1Hz = 0.0; - end - - // Thermal Noise - case (TNOIMOD) - 0 : begin // Charge-based model (BSIM4 - TNOIMOD=0) - T0 = ueff * qinv; - T1 = T0 * Rdsi + Leff * Leff; - Gtnoi = (T0 / T1) * NTNOI_i; - sid = 4.0 * Vtm * `q * Gtnoi; - end - 1: begin // Correlated Thermal Noise by Navid, November 2013, Reference BSIMSOI4.5.0 - `ifdef __TNOIMOD1__ - Abulk = 1.0; - Vgst2Vtm = KSATIV_a * (qis + 2.0 * Vtm); - etaa = 1.0 - Vdseff * Abulk / Vgst2Vtm ; - T0 = 1.0 - etaa; - T1 = 1.0 + etaa; - T2 = T1 + 2.0 * Abulk * Vtm / (qia + 1.0e-10); - T3 = T2 * T2; - T4 = T0 * T0; - T5 = T3 * T3; - T6 = 1.0 / (1.0 + Vdseff / EsatL) ; - gamma = T6 * (0.5 * T1 + T0 * T0 / (6.0 * T2)); - delta = ((T1 / T3) - (5.0 * T1 + T2) * T4 / (15.0 * T5) + T4 * T4 / (9.0 * T5 * T2)) / (6.0 * T6 * T6 * T6); - T7 = T0 / T2; - epsilon = (T7 + T7 * T7 * T7 / 3.0) / (6.0 * T6); - T8 = qia / EsatL; - T8 = T8 * T8; - npart_c = RNOIC * (1.0 + T8 * TNOIC * Leff); - T9 = gamma * delta ; - if (T9 > 0.0) begin - ctnoi = epsilon / sqrt( gamma * delta) * (2.5316 * npart_c); - end else begin - ctnoi = 1.0; - end - if (ctnoi > 1) begin - ctnoi = 1.0; - end - if (ctnoi < 0) begin - ctnoi = 0.0; - end - npart_beta = RNOIA * (1.0 + T8 * TNOIA * Leff); - npart_theta = RNOIB * (1.0 + T8 * TNOIB * Leff); - gamma = gamma * (3.0 * npart_beta * npart_beta); - delta = delta * (3.75 * npart_theta * npart_theta); - T9 = qia * 0.5 * T1; - gche = beta * T9 * T6; - noiGd0 = NFINtotal * beta * qia / (1.0 + gche * Rdsi); - GammaGd0 = gamma * noiGd0; - sid = 4.0 * Vtm * `q * GammaGd0; - C0 = NFINtotal * coxeff * WeffCV0 * LeffCV; - if (gamma > 0.0 && delta > 0.0) begin - sf = (noiGd0 + 1.0e-15) / sqrt(delta / gamma); - end else begin - sf = 0.0; - end - `else - $strobe("[Warning!] Although the model selector TNOIMOD is set to 1, the new correlated thermal noise model is not activated. Please uncomment \"`define __TNOIMOD1__\" in the bsimcmg.va."); - `endif - end - endcase - - // Source and Drain Conductance for Thermal Noise Contribution - if (RDSMOD != 2) begin - gspr = 1.0 / Rsource; // Note: gspr considers all fins - gdpr = 1.0 / Rdrain; // Note: gdpr considers all fins - end - - // Loading Ids, Gate and Drain charges - `ifdef __NQSMOD2__ - if (sigvds > 0.0) begin - I(di, si) <+ devsign * ids; - end else begin - I(si, di) <+ devsign * ids; - end - - if (NQSMOD == 2) begin - I(`IntrinsicGate, si) <+ devsign * gtau * -V(q); - I(di, si) <+ devsign * xdpart * gtau * V(q); - end else begin // Quasi-static Stamping (Normal case) - I(di, si) <+ devsign * ddt(qd); - I(`IntrinsicGate, si) <+ devsign * ddt(qg); - end - `else - if (sigvds > 0.0) begin - I(di, si) <+ devsign * ids; - end else begin - I(si, di) <+ devsign * ids; - end - I(di, si) <+ devsign * ddt(qd); - I(`IntrinsicGate, si) <+ devsign * ddt(qg); - `endif - - // Loading Other Currents - if (sigvds > 0.0) begin - I(di, si) <+ devsign * idsgen; - I(`IntrinsicGate, si) <+ devsign * (igcs + igs); - I(`IntrinsicGate, di) <+ devsign * (igcd + igd); - if (BULKMOD != 0) begin - I(di, e) <+ devsign * (igidl + Iii); - I(si, e) <+ devsign * igisl; - I(`IntrinsicGate, e) <+ devsign * (igbinv + igbacc); - end else begin - I(di, si) <+ devsign * (igidl + Iii); - I(si, di) <+ devsign * igisl; - end - end else begin - I(si, di) <+ devsign * idsgen; - I(`IntrinsicGate, di) <+ devsign * (igcs + igs); - I(`IntrinsicGate, si) <+ devsign * (igcd + igd); - if (BULKMOD != 0) begin - I(si, e) <+ devsign * (igidl + Iii); - I(di, e) <+ devsign * igisl; - I(`IntrinsicGate, e) <+ devsign * (igbinv + igbacc); - end else begin - I(si, di) <+ devsign * (igidl + Iii); - I(di, si) <+ devsign * igisl; - end - end - if (BULKMOD == 0) begin - I(`IntrinsicGate, si) <+ devsign * igbs; - I(`IntrinsicGate, di) <+ devsign * igbd; - end - - if (BULKMOD != 0) begin - I(e, si) <+ devsign * Ies; - I(e, di) <+ devsign * Ied; - end - I(e, si) <+ devsign * ddt(Qes); - I(e, di) <+ devsign * ddt(Qed); - I(e, `GateEdgeNode) <+ devsign * ddt(Qeg); - - // Loading other charges - I(`GateEdgeNode, si) <+ ddt(qgs_parasitic); - I(`GateEdgeNode, di) <+ ddt(qgd_parasitic); - I(d, s) <+ ddt(qds_fr); - if (CGEOMOD == 1) begin - I(`GateEdgeNode, s) <+ ddt(qgs_fr); - I(`GateEdgeNode, d) <+ ddt(qgd_fr); - end - - // Accumulation Charge for Bulk FET - if (BULKMOD != 0) begin - I(`IntrinsicGate, si) <+ devsign * ddt(qg_acc); - I(e, si) <+ devsign * ddt(qb_acc); - end - - // External S/D Resistance - if (RDSMOD == 2) begin - V(d, di) <+ 0.0; - V(s, si) <+ 0.0; - end else begin - I(d, di) <+ V(d, di) / Rdrain; - I(s, si) <+ V(s, si) / Rsource; - end - - // NQSMOD1 Gate Resistance Model - `ifdef __NQSMOD1__ - if (NQSMOD == 1 && XRCRG1_i != 0) - I(`GateEdgeNode, gi) <+ V(`GateEdgeNode, gi) * gcrg; - else - V(`GateEdgeNode, gi) <+ 0.0; - `endif - - // NQSMOD2 BSIM4 Charge Deficit Model - `ifdef __NQSMOD2__ - if (NQSMOD ==2) begin - I(q) <+ ddt(qg - qb); - I(q) <+ V(q) * gtau; - I(q) <+ ddt(V(q)); - end else - V(q) <+ 0.0; - `endif - - // Gate Electrode Resistance - `ifdef __RGATEMOD__ - if (RGATEMOD != 0) - I(g, ge) <+ V(g, ge) * ggeltd; - else - V(g, ge) <+ 0.0; - `endif - - // Flicker Noise - I(di,si) <+ flicker_noise(FNPowerAt1Hz, EF, "flicker"); - - // Thermal noise for parasitics - if (RDSMOD != 2) begin - I(d, di) <+ white_noise(4.0 * Vtm * `q * gdpr, "thermal"); - I(s, si) <+ white_noise(4.0 * Vtm * `q * gspr, "thermal"); - end - - `ifdef __RGATEMOD__ - if (RGATEMOD != 0) - I(g, ge) <+ white_noise(4.0 * Vtm * `q * ggeltd, "thermal"); - `endif - - // Channel thermal noise and induced gate noise stamping - // Implementation of correlated noise follows C. C. McAndrew, WCM 2005 - if (TNOIMOD == 0) begin - I(di, si) <+ white_noise(sid, "thermal"); - `ifdef __TNOIMOD1__ - V(N) <+ 0.0; - `endif - end else begin - `ifdef __TNOIMOD1__ - I(di,si) <+ white_noise(sid * abs(1.0 - ctnoi * ctnoi), "thermal"); - I(di,si) <+ ctnoi * V(N) * sf * SCALEN ; - if (gamma > 0 && delta > 0) begin - I(N) <+ V(N) * sf * SCALEN; - I(N) <+ white_noise(sid/(sf*sf*SCALEN*SCALEN)); - end else begin - I(N) <+ V(N) ; - end - I(`IntrinsicGate,si) <+ ddt(0.5 * C0 * SCALEN * V(N)); - I(`IntrinsicGate,di) <+ ddt(0.5 * C0 * SCALEN * V(N)); - `else - $strobe("[Warning!] Although the model selector TNOIMOD is set to 1, the new correlated thermal noise model is not activated. Please uncomment \"`define __TNOIMOD1__\" in the bsimcmg.va."); - `endif - end - - // Gate Current Shot Noise - if (IGCMOD != 0) begin - if (sigvds > 0) begin - I(`IntrinsicGate, si) <+ white_noise(2.0 * `q * abs(igcs + igs), "shot"); - I(`IntrinsicGate, di) <+ white_noise(2.0 * `q * abs(igcd + igd), "shot"); - end else begin - I(`IntrinsicGate, di) <+ white_noise(2.0 * `q * abs(igcs + igs), "shot"); - I(`IntrinsicGate, si) <+ white_noise(2.0 * `q * abs(igcd + igd), "shot"); - end - end - - if (IGBMOD != 0) begin - if (BULKMOD != 0) begin - I(`IntrinsicGate, e) <+ white_noise(2.0 * `q * abs(igbinv + igbacc), "shot"); - end else begin - I(`IntrinsicGate, si) <+ white_noise(2.0 * `q * abs(igbs), "shot"); - I(`IntrinsicGate, di) <+ white_noise(2.0 * `q * abs(igbd), "shot"); - end - end - - // Self Heating - `ifdef __SHMOD__ - if (SHMOD != 0 && RTH0 > 0) begin - if (RDSMOD != 2) begin - Pwr(ith_branch) <+ -(devsign * sigvds * V(di,si) * ids + V(d,di) * V(d,di) / Rdrain + V(s,si) * V(s,si) / Rsource); - end else begin - Pwr(ith_branch) <+ -(devsign * sigvds * V(di,si) * ids ); - end - end - Pwr(rth_branch) <+ Temp(rth_branch) * gth; - Pwr(rth_branch) <+ ddt(Temp(rth_branch) * cth); - `endif - - // Operating-Point information - `ifdef __OPINFO__ - // W & L - WEFF = Weff0; // Effective width for IV - LEFF = Leff; // Effective length for IV - WEFFCV = WeffCV0; // Effective width for CV - LEFFCV = LeffCV; // Effective length for CV - - // Currents - IDS = devsign * ids; // Intrinsic Drain Current (Electrical) - if (sigvds > 0) begin // Total Source/Drain Currents (Physical) - if (BULKMOD != 0) begin - IDEFF = IDS + devsign * idsgen - devsign * (igd + igcd) + devsign * (Iii + igidl) - devsign * Ied; - ISEFF = -IDS - devsign * idsgen - devsign * (igs + igcs) + devsign * (igisl) - devsign * Ies; - end else begin - IDEFF = IDS + devsign * idsgen - devsign * (igd + igcd + igbd) + devsign * (Iii + igidl - igisl); - ISEFF = -IDS - devsign * idsgen - devsign * (igs + igcs + igbs) + devsign* (igisl - igidl); - end - end else begin - if (BULKMOD != 0) begin - IDEFF = -IDS - devsign * idsgen - devsign * (igs + igcs) + devsign * (igisl) - devsign * Ied; - ISEFF = IDS + devsign * idsgen - devsign * (igd + igcd) + devsign * (Iii + igidl) - devsign * Ies; - end else begin - IDEFF = -IDS - devsign * idsgen - devsign * (igs + igcs + igbd) + devsign * (igisl - igidl); - ISEFF = IDS + devsign * idsgen - devsign * (igd + igcd + igbs) + devsign * (Iii + igidl - igisl); - end - end - - if (BULKMOD == 0) begin // Total Gate Current - IGTOT = devsign * (igs + igd + igcs + igcd + igbs + igbd); - end else begin - IGTOT = devsign * (igs + igd + igcs + igcd + igbacc + igbinv); - end - - IDSGEN = sigvds * devsign * idsgen; // Generation-Recombination Current (Physical) - III = devsign * Iii; // Impact Ionization Current - if (sigvds > 0) begin - IGIDL = devsign * igidl; // GIDL Current (Physical) - IGISL = devsign * igisl; // GISL Current (Physical) - end else begin - IGIDL = devsign * igisl; // GIDL Current (Physical) - IGISL = devsign * igidl; // GISL Current (Physical) - end - - if (BULKMOD != 0) begin - IJSB = -devsign * Ies; // Source-Body Junction Current (Physical) - IJDB = -devsign * Ied; // Drain-Body Junction Current (Physical) - end else begin - IJSB = 0.0; - IJDB = 0.0; - end - - if (BULKMOD != 0) begin - ISUB = -III - IGIDL - IGISL - IJSB - IJDB - devsign * (igbinv + igbacc); // Substrate Current - end else begin - ISUB = 0.0; - end - - // Misc Variables - BETA = beta; // Drain Current prefactor per fin per finger - VDSSAT = Vdsat; // Drain-Source saturation Voltage - if (NGATE_i > 0) // Flatband Voltage - VFB = -devsign * (phib + Vtm * lln(NGATE_i / ni)); - else - VFB = PHIG_i - (EASUB + 0.5 * Eg + devsign * phib); - - // Threshold Voltage Calculation - q0 = 10.0 * Vtm / rc + 2.0 * qbs; - T1 = Vtm * (Vtm + q0); - T2 = cox * cox * T1; - T3 = 2.0 * `q * ni * epssub * Vtm; - VTH = VFB + devsign * (Vtm * lln(T2 / T3) + dvch_qm + phib + qbs + Vtm + dvth_all - DELVTRAND); - - // Conductances - GM = ddx(devsign * ids,V(`IntrinsicGate)); // Transconductance - GDS = ddx(devsign * ids,V(di)); // Output Conductance - if (BULKMOD != 0) - GMBS = ddx(devsign * ids,V(e)); // Body Transconductance - else - GMBS = 0.0; - - // Intrinsic Charges (Physical) (Sriram: Not accurate for NQSMOD= 2 and 3) - QGI = devsign * qg + devsign * qg_acc; - QDI = devsign * qd; - QSI = devsign * qs; - QBI = devsign * (qb + qb_acc); - - // Total Charges (Sriram: Not accurate for NQSMOD= 2 and 3) - QG = devsign * qg + qgs_parasitic + qgd_parasitic + (CGEOMOD == 1 ? qgs_fr + qgd_fr : 0) + devsign * qg_acc - devsign * Qeg; - QD = devsign * qd - qgd_parasitic - (CGEOMOD == 1 ? qgd_fr : 0) - devsign * Qed; - QS = devsign * qs - qgs_parasitic - (CGEOMOD == 1 ? qgs_fr : 0) - devsign * Qes; - QB = devsign * (qb + qb_acc) + devsign * (Qeg + Qes + Qed); - - // Intrinsic Capacitances (Physical) - CGGI = ddx(QGI, V(`IntrinsicGate)); - CGSI = ddx(-QGI, V(si)); - CGDI = ddx(-QGI, V(di)); - CGEI = ddx(-QGI, V(e)); - - CSGI = ddx(-QSI, V(`IntrinsicGate)); - CSDI = ddx(-QSI, V(di)); - CSSI = ddx(QSI, V(si)); - CSEI = ddx(-QSI, V(e)); // Should be zero everywhere - - CDGI = ddx(-QDI, V(`IntrinsicGate)); - CDDI = ddx(QDI, V(di)); - CDSI = ddx(-QDI, V(si)); - CDEI = ddx(-QDI, V(e)); - - CEGI = ddx(-QBI, V(`IntrinsicGate)); - CEDI = ddx(-QBI, V(di)); // Should be zero everywhere - CESI = ddx(-QBI, V(si)); // Should be zero everywhere - CEEI = ddx(QBI, V(e)); - - // Total Capacitances - CGG = ddx(QG, V(`IntrinsicGate)); - CGS = ddx(-QG, V(si)); - CGD = ddx(-QG, V(di)); - CGE = ddx(-QG, V(e)); - - CSG = ddx(-QS, V(`IntrinsicGate)); - CSD = ddx(-QS, V(di)); - CSS = ddx(QS, V(si)); - CSE = ddx(-QS, V(e)); - - CDG = ddx(-QD, V(`IntrinsicGate)); - CDD = ddx(QD, V(di)); - CDS = ddx(-QD, V(si)); - CDE = ddx(-QD, V(e)); - - CEG = ddx(-QB, V(`IntrinsicGate)); - CED = ddx(-QB, V(di)); - CES = ddx(-QB, V(si)); - CEE = ddx(QB, V(e)); - - // Total extrinsic capacitance - CGSEXT = ddx(-(qgs_parasitic + (CGEOMOD == 1 ? qgs_fr : 0)),V(si)); // Gate-Source Overlap + outer fringing - CGDEXT = ddx(-(qgd_parasitic + (CGEOMOD == 1 ? qgd_fr : 0)),V(di)); // Gate-Drain Overlap + outer fringing - CGBOV = ddx(Qeg,V(e)); // Gate-Body Overlap - CGBOV = -devsign * CGBOV; - - // Total of Junction Capacitance and Source/Drain-Body Overlap Capacitance - CJST = ddx(Qes, V(si)); - CJST = -devsign * CJST; - CJDT = ddx(Qed, V(di)); - CJDT = -devsign * CJDT; - - RSGEO = RSourceGeo; // External bias independent Source Resistance - RDGEO = RDrainGeo; // External bias independent Drain Resistance - CFGEO = Cfr_geo; // Geometric Parasitic Cap for CGEOMOD=1 - - // Output for Self-Heating Temperature - T_TOTAL_K = DevTemp; - T_TOTAL_C = DevTemp - `P_CELSIUS0; - T_DELTA_SH = Temp(t); - - `ifdef __DEBUG__ - // Individual Gate Current Components - IGS = devsign * igs; - IGD = devsign * igd; - IGCS = devsign * igcs; - IGCD = devsign * igcd; - if (BULKMOD == 0) begin - IGBS = devsign * igbs; - IGBD = devsign * igbd; - end else begin - IGBINV = devsign * igbinv; - IGBACC = devsign * igbacc; - end - - DIDSDVG = ddx(ids, V(`IntrinsicGate)); - DIDSDVG = devsign * sigvds * DIDSDVG; - DIDSDVS = ddx(ids, V(si)); - DIDSDVS = devsign * sigvds * DIDSDVS; - DIDSDVD = ddx(ids, V(di)); - DIDSDVD = devsign * sigvds * DIDSDVD; - `ifdef __SHMOD__ - DIDSDVTH = ddx(ids, Temp(t)); - DIDSDVTH = devsign * sigvds * DIDSDVTH; - `endif - DIGSDVG = ddx(igs + igcs, V(`IntrinsicGate)); - DIGSDVG = devsign * DIGSDVG; - DIGSDVS = ddx(igs + igcs, V(si)); - DIGSDVS = devsign * DIGSDVS; - DIGSDVD = ddx(igs + igcs, V(di)); - DIGSDVD = devsign * DIGSDVD; - `ifdef __SHMOD__ - DIGSDVTH = ddx(igs + igcs, Temp(t)); - DIGSDVTH = devsign * DIGSDVTH; - `endif - DIGDDVG = ddx(igd + igcd, V(`IntrinsicGate)); - DIGDDVG = devsign * DIGDDVG; - DIGDDVS = ddx(igd + igcd, V(si)); - DIGDDVS = devsign * DIGDDVS; - DIGDDVD = ddx(igd + igcd, V(di)); - DIGDDVD = devsign * DIGDDVD; - `ifdef __SHMOD__ - DIGDDVTH = ddx(igd + igcd, Temp(t)); - DIGDDVTH = devsign * DIGDDVTH; - `endif - DIIIDVG = ddx(Iii, V(`IntrinsicGate)); - DIIIDVG = devsign * DIIIDVG; - DIIIDVS = ddx(Iii, V(si)); - DIIIDVS = devsign * DIIIDVS; - DIIIDVD = ddx(Iii, V(di)); - DIIIDVD = devsign * DIIIDVD; - `ifdef __SHMOD__ - DIIIDVTH = ddx(Iii, Temp(t)); - DIIIDVTH = devsign * DIIIDVTH; - `endif - DIGIDLDVG = ddx(igidl, V(`IntrinsicGate)); - DIGIDLDVG = devsign * DIGIDLDVG; - DIGIDLDVS = ddx(igidl, V(si)); - DIGIDLDVS = devsign * DIGIDLDVS; - DIGIDLDVD = ddx(igidl, V(di)); - DIGIDLDVD = devsign * DIGIDLDVD; - `ifdef __SHMOD__ - DIGIDLDVTH = ddx(igidl, Temp(t)); - DIGIDLDVTH = devsign * DIGIDLDVTH; - `endif - DIGISLDVG = ddx(igisl, V(`IntrinsicGate)); - DIGISLDVG = devsign * DIGISLDVG; - DIGISLDVS = ddx(igisl, V(si)); - DIGISLDVS = devsign * DIGISLDVS; - DIGISLDVD = ddx(igisl, V(di)); - DIGISLDVD = devsign * DIGISLDVD; - `ifdef __SHMOD__ - DIGISLDVTH = ddx(igisl, Temp(t)); - DIGISLDVTH = devsign * DIGISLDVTH; - `endif - - `ifdef __SHMOD__ - CGT = ddx(QG, Temp(t)); - CST = ddx(QS, Temp(t)); - CDT = ddx(QD, Temp(t)); - `endif - ITH = ids * vds; - `ifdef __SHMOD__ - DITHDVTH = ddx(ITH, Temp(t)); - `endif - DITHDVG = ddx(ITH, V(`IntrinsicGate)); - DITHDVS = ddx(ITH, V(si)); - DITHDVD = ddx(ITH, V(di)); - `endif // __DEBUG__ - `endif // __OPINFO__ -end // analog block ends -//================================================ diff --git a/src/spicelib/devices/adms/bsimcmg/admsva/bsimcmg_cfringe.include b/src/spicelib/devices/adms/bsimcmg/admsva/bsimcmg_cfringe.include deleted file mode 100644 index 04d206f22..000000000 --- a/src/spicelib/devices/adms/bsimcmg/admsva/bsimcmg_cfringe.include +++ /dev/null @@ -1,117 +0,0 @@ -// ******************************************************** -// **** BSIM-CMG 110.0.0 released by Sourabh Khandelwal on 01/01/2016****/ -// * BSIM Common Multi-Gate Model Equations (Verilog-A) -// ******************************************************** -// -// ******************************************************** -// * Copyright 2016 Regents of the University of California. -// * All rights reserved. -// * -// * Project Director: Prof. Chenming Hu. -// * Authors: Sriramkumar V., Navid Paydavosi, Juan Duarte, Darsen Lu, Sourabh Khandelwal, -// * Chung-Hsun Lin, Mohan Dunga, Shijing Yao, -// * Ali Niknejad, Chenming Hu -// ******************************************************** -// ******************************************************** -// * NONDISCLOSURE STATEMENT -// Software is distributed as is, completely without warranty or service -// support. The University of California and its employees are not liable -// for the condition or performance of the software. -// The University of California owns the copyright and grants users a perpetual, -// irrevocable, worldwide, non-exclusive, royalty-free license with -// respect to the software as set forth below. -// The University of California hereby disclaims all implied warranties. -// The University of California grants the users the right to modify, copy, -// and redistribute the software and documentation, both within the user's -// organization and externally, subject to the following restrictions -// 1. The users agree not to charge for the University of California code -// itself but may charge for additions, extensions, or support. -// 2. In any product based on the software, the users agree to acknowledge -// the University of California that developed the software. This -// acknowledgment shall appear in the product documentation. -// 3. The users agree to obey all U.S. Government restrictions governing -// redistribution or export of the software. -// 4. The users agree to reproduce any copyright notice which appears on -// the software on any copy or modification of such made available -// to others -// Agreed to on __Jan 01, 2016__________________ -// By: ___University of California, Berkeley____ -// ___Chenming Hu_____________________ -// ___Professor in Graduate School _______ -// ******************************************************** - -// ******************************************************** -// Macro for the geometry-dependent fringing capacitance -// model -// ******************************************************** - -/* - (while (re-search-forward - (rx bow - (or "Hr" "Lr" "Hgdelta" "Lmax" "y" "x" - "CcgSat" "Cnon" "TT1" "Ccg1" "r1cf" "Rcf" "Ccg2" - "Ccg" "C1" "C2" "C3" "Cfglog" "dcf" "TT0" - "TT2" "Cfgsat" "delta" "xCfg") - eow) - nil t) - (replace-match "x42_\\&" t)) -*/ - -`define Cfringe_2d_vars() \ - real x42_Hr, x42_Lr, x42_Hgdelta, x42_Lmax, x42_y, x42_x; \ - real x42_CcgSat, x42_Cnon, x42_TT1, x42_Ccg1, x42_r1cf, x42_Rcf, x42_Ccg2; \ - real x42_Ccg, x42_C1, x42_C2, x42_C3, x42_Cfglog, x42_dcf, x42_TT0; \ - real x42_TT2, x42_Cfgsat, x42_delta, Cfg; - -`define Cfringe_2d(block_name, Hg, Hc, Lext, Wfin, Lc, Lg, Tox, Cf1, Cgg) \ - begin : block_name \ - x42_Hr = 2.3 + 0.2 * ((Hg) + (Tox)) / (Hc); \ - x42_Lr = 1.05; \ - x42_Hgdelta = abs((Hg) + (Tox) - (Hc)); \ - x42_Lmax = (Lext) * x42_Lr; \ - \ - x42_y = min((Hc), (Hg) + (Tox)); \ - x42_x = (Lext) / (x42_Hr + 1.0); \ - x42_Cnon = 1.7e12; \ - x42_CcgSat = epssp * (x42_y - x42_x) / (Lext); \ - x42_TT1 = x42_Cnon * x42_CcgSat; \ - if (x42_TT1 > `EXPL_THRESHOLD) \ - x42_Ccg1 = x42_CcgSat; \ - else \ - x42_Ccg1 = 1.0 / x42_Cnon * ln(1.0 + lexp(x42_TT1)); \ - \ - x42_r1cf = 0.5 * \ - min((Hc) / ((Hg) + (Tox)), ((Hg) + (Tox)) / (Hc)); \ - x42_Rcf = x42_Hgdelta * x42_r1cf; \ - x42_Ccg2 = epssp * 2 / `M_PI * \ - ln(((Lext) + 0.5 * `M_PI * x42_Rcf) / (Lext)); \ - \ - x42_Ccg = (Wfin) * (x42_Ccg1 + x42_Ccg2); \ - \ - x42_x = x42_Lmax / (Hg); \ - x42_C1 = 4.0 / (sqrt(2.0 * (x42_x + 1)) * `M_PI); \ - x42_C2 = sqrt((Tox) * (Tox) + 2.0 * (Hg) * (Tox) + \ - (Hg) * (Hg) * (x42_x + 1)) * sqrt(x42_x + 1) + (Tox) + \ - (Hg) * x42_x + (Hg); \ - x42_C3 = (Tox) * sqrt((x42_x + 1) * (x42_x + 4)) + Tox * (x42_x + 2); \ - x42_Cfglog = epssp * (x42_C1 * ln(x42_C2 / x42_C3) + 12.27); \ - \ - x42_dcf = x42_Hr * x42_Lr; \ - x42_TT0 = sqrt(x42_dcf * x42_dcf + 1.0); \ - x42_TT1 = sqrt((x42_dcf * x42_dcf + 1) * ((x42_dcf * (Tox)) * (x42_dcf * (Tox)) + \ - 2 * x42_dcf * x42_Lmax * (Tox) + (x42_dcf * x42_dcf + 1) * x42_Lmax * x42_Lmax)) \ - + x42_dcf * (Tox) + x42_dcf * x42_dcf * x42_Lmax + x42_Lmax; \ - x42_TT2 = (x42_TT0 + 1.0) * (x42_dcf * (Tox)); \ - x42_Cfgsat = 2.0 * epssp * sqrt(2) / `M_PI * (Cf1) * x42_dcf \ - / x42_TT0 * ln(x42_TT1 / x42_TT2); \ - \ - x42_delta = 1.2e-12; \ - x42_TT1 = x42_Cfgsat - x42_Cfglog - x42_delta; \ - Cfg = (Wfin) * (x42_Cfgsat - 0.5 * (x42_TT1 + \ - sqrt(x42_TT1 * x42_TT1 + 4 * x42_delta * x42_Cfgsat))); \ - Cgg = x42_Ccg + Cfg; \ - end - - - - diff --git a/src/spicelib/devices/adms/bsimcmg/admsva/bsimcmg_quasi_static_cv.include b/src/spicelib/devices/adms/bsimcmg/admsva/bsimcmg_quasi_static_cv.include deleted file mode 100644 index a0210a4f9..000000000 --- a/src/spicelib/devices/adms/bsimcmg/admsva/bsimcmg_quasi_static_cv.include +++ /dev/null @@ -1,89 +0,0 @@ -// ******************************************************** -// **** BSIM-CMG 110.0.0 released by Sourabh Khandelwal on 01/01/2016 ****/ -// * BSIM Common Multi-Gate Model Equations (Verilog-A) -// ******************************************************** -// -// ******************************************************** -// * Copyright 2016 Regents of the University of California. -// * All rights reserved. -// * -// * Project Director: Prof. Chenming Hu. -// * Authors: Sriramkumar V., Navid Paydavosi, Juan Duarte, Darsen Lu, -// * Chung-Hsun Lin, Mohan Dunga, Shijing Yao, -// * Ali Niknejad, Chenming Hu -// ******************************************************** -// ******************************************************** -// * NONDISCLOSURE STATEMENT -// Software is distributed as is, completely without warranty or service -// support. The University of California and its employees are not liable -// for the condition or performance of the software. -// The University of California owns the copyright and grants users a perpetual, -// irrevocable, worldwide, non-exclusive, royalty-free license with -// respect to the software as set forth below. -// The University of California hereby disclaims all implied warranties. -// The University of California grants the users the right to modify, copy, -// and redistribute the software and documentation, both within the user's -// organization and externally, subject to the following restrictions -// 1. The users agree not to charge for the University of California code -// itself but may charge for additions, extensions, or support. -// 2. In any product based on the software, the users agree to acknowledge -// the University of California that developed the software. This -// acknowledgment shall appear in the product documentation. -// 3. The users agree to obey all U.S. Government restrictions governing -// redistribution or export of the software. -// 4. The users agree to reproduce any copyright notice which appears on -// the software on any copy or modification of such made available -// to others -// Agreed to on __Jan 01, 2016_________________ -// By: ___University of California, Berkeley____ -// ___Chenming Hu_____________________ -// ___Professor in Graduate School _______ -// ******************************************************** -// *** Quasi Static CV Model *** - - T11 = (2.0*qia+nVtm)/DvsatCV;//G - qg = qia+dqi*dqi/(6.0*T11);//qc - qd = -0.5*(qia-(dqi/(6.0))*(1.0-(dqi/T11)*(1+dqi/(5.0*T11))));//qd - // Including CLM in qg and qd - inv_MclmCV = 1.0 / MclmCV; - qg = inv_MclmCV * qg + (MclmCV - 1.0) * qid; - qd = inv_MclmCV * inv_MclmCV * qd + 0.5 * (MclmCV - inv_MclmCV) * qid; - -//Calculating partition for NQSMOD2 -`ifdef __NQSMOD2__ - if(NQSMOD == 2) xdpart = qd / qg; - else xdpart = 0; -`endif - - qs = -qg-qd; //from charge conservation qs = -qg-qd; - T6 = NFINtotal*WeffCV0 * LeffCV * coxeff; - - qg = T6*qg; - qd = T6*qd; - qs = T6*qs; - qinv = qg ; - if(BULKMOD != 0) begin - T1 = NFINtotal * WeffCV0 * LeffCV_acc * cox_acc; - T7 = qi_acc_for_QM;//qbulk - T10 = T7 * T1; - qg_acc = - T10; - qb_acc = T10; - T1 = NFINtotal * WeffCV0 * LeffCV * cox; - T2 = qba - qi_acc_for_QM; - T10 = T1*T2; - qg_acc = qg_acc - T10; - qb_acc = qb_acc + T10; - T1 = NFINtotal * WeffCV0 * LeffCV * cox; - T2 = (nq-1.0)*0.5*(qia+(dqi*dqi/(6.0*T11))); - T10 = T1*T2; - qg_acc = qg_acc - T10; - qb_acc = qb_acc + T10; - end - -// if vds is negative, physical charge on qd is qs - if (sigvds < 0) begin - T1 = qd; - qd = qs; - qs = T1; - end - diff --git a/src/spicelib/devices/adms/bsimcmg/admsva/bsimcmg_rdsmod.include b/src/spicelib/devices/adms/bsimcmg/admsva/bsimcmg_rdsmod.include deleted file mode 100644 index 892a126cc..000000000 --- a/src/spicelib/devices/adms/bsimcmg/admsva/bsimcmg_rdsmod.include +++ /dev/null @@ -1,84 +0,0 @@ -// ******************************************************* -// **** BSIM-CMG 110.0.0 released by Sourabh Khandelwal on 01/01/2016 ****/ -// * BSIM Common Multi-Gate Model Equations (Verilog-A) -// ******************************************************** -// -// ******************************************************** -// * Copyright 2016 Regents of the University of California. -// * All rights reserved. -// * -// * Project Director: Prof. Chenming Hu. -// * Authors: Sriramkumar V., Navid Paydavosi, Juan Duarte, Darsen Lu, Sourabh Khandelwal -// * Chung-Hsun Lin, Mohan Dunga, Shijing Yao, -// * Ali Niknejad, Chenming Hu -// ******************************************************** -// ******************************************************** -// * NONDISCLOSURE STATEMENT -// Software is distributed as is, completely without warranty or service -// support. The University of California and its employees are not liable -// for the condition or performance of the software. -// The University of California owns the copyright and grants users a perpetual, -// irrevocable, worldwide, non-exclusive, royalty-free license with -// respect to the software as set forth below. -// The University of California hereby disclaims all implied warranties. -// The University of California grants the users the right to modify, copy, -// and redistribute the software and documentation, both within the user's -// organization and externally, subject to the following restrictions -// 1. The users agree not to charge for the University of California code -// itself but may charge for additions, extensions, or support. -// 2. In any product based on the software, the users agree to acknowledge -// the University of California that developed the software. This -// acknowledgment shall appear in the product documentation. -// 3. The users agree to obey all U.S. Government restrictions governing -// redistribution or export of the software. -// 4. The users agree to reproduce any copyright notice which appears on -// the software on any copy or modification of such made available -// to others -// Agreed to on __Jan 01, 2016_________________ -// By: ___University of California, Berkeley____ -// ___Chenming Hu_____________________ -// ___Professor in Graduate School _______ -// ******************************************************** -// Source-Drain Resistance Model -case(RDSMOD) - 1: begin - Rdsi = 0.0; - Dr = 1.0; - - T2 = vgs_noswap - vfbsd; - T3 = sqrt(T2 * T2 + 1.0e-1); - vgs_eff = 0.5 * (T2 + T3); - T4 = 1.0 + PRWGS_i * vgs_eff; - T1 = 1.0 / T4; - T0 = 0.5 * (T1 + sqrt(T1 * T1 + 0.01)); - T5 = RSW_i * (1.0 + RSDR_a * lexp(0.5 * PRSDR * lln(V(si,s) * V(si,s) + 1.0E-6))); - Rsource = rdstemp * (RSourceGeo + (RSWMIN_i + T5 * T0) * WeffWRFactor); - - T2 = vgd_noswap - vfbsd; - T3 = sqrt(T2 * T2 + 1.0e-1); - vgd_eff = 0.5 * (T2 + T3); - T4 = 1.0 + PRWGD_i * vgd_eff; - T1 = 1.0 / T4; - T0 = 0.5 * (T1 + sqrt(T1 * T1 + 0.01)); - T5 = RDW_i * (1.0 + RDDR_a * lexp(0.5 * PRDDR * lln(V(di,d) * V(di,d) + 1.0E-6))); - Rdrain = rdstemp * (RDrainGeo + (RDWMIN_i + T5 * T0) * WeffWRFactor); - end - 0: begin - Rsource = RSourceGeo; - Rdrain = RDrainGeo; - T4 = 1.0 + PRWGS_i * qia; - T1 = 1.0 / T4; - T0 = 0.5 * (T1 + sqrt(T1 * T1 + 0.01)); - Rdsi = rdstemp * (RDSWMIN_i + RDSW_i * T0) * WeffWRFactor; - Dr = 1.0 + (NFINtotal) * beta * ids0_ov_dqi / (Dmob * Dvsat) * Rdsi; - end - 2: begin - T4 = 1.0 + PRWGS_i * qia; - T1 = 1.0 / T4; - T0 = 0.5 * (T1 + sqrt(T1 * T1 + 0.01)); - Rdsi = rdstemp * (RSourceGeo + RDrainGeo + RDSWMIN_i + RDSW_i * T0) * WeffWRFactor; - Dr = 1.0 + (NFINtotal) * beta * ids0_ov_dqi / (Dmob * Dvsat) * Rdsi; - Rsource = 0.0; - Rdrain = 0.0; - end -endcase diff --git a/src/spicelib/devices/adms/bsimcmg/admsva/common_defs.include b/src/spicelib/devices/adms/bsimcmg/admsva/common_defs.include deleted file mode 100644 index d93f94733..000000000 --- a/src/spicelib/devices/adms/bsimcmg/admsva/common_defs.include +++ /dev/null @@ -1,185 +0,0 @@ -// ******************************************************** -// **** BSIM-CMG 110.0.0 released by Sourabh Khandelwal on 01/01/2016 ****/ -// * BSIM Common Multi-Gate Model Equations (Verilog-A) -// ******************************************************** -// -// ******************************************************** -// * Copyright 2016 Regents of the University of California. -// * All rights reserved. -// * -// * Project Director: Prof. Chenming Hu. -// * Authors: Sriramkumar V., Navid Paydavosi, Juan Duarte, Darsen Lu, Sourabh Khandelwal -// * Chung-Hsun Lin, Mohan Dunga, Shijing Yao, -// * Ali Niknejad, Chenming Hu -// ******************************************************** -// ******************************************************** -// * NONDISCLOSURE STATEMENT -// Software is distributed as is, completely without warranty or service -// support. The University of California and its employees are not liable -// for the condition or performance of the software. -// The University of California owns the copyright and grants users a perpetual, -// irrevocable, worldwide, non-exclusive, royalty-free license with -// respect to the software as set forth below. -// The University of California hereby disclaims all implied warranties. -// The University of California grants the users the right to modify, copy, -// and redistribute the software and documentation, both within the user's -// organization and externally, subject to the following restrictions -// 1. The users agree not to charge for the University of California code -// itself but may charge for additions, extensions, or support. -// 2. In any product based on the software, the users agree to acknowledge -// the University of California that developed the software. This -// acknowledgment shall appear in the product documentation. -// 3. The users agree to obey all U.S. Government restrictions governing -// redistribution or export of the software. -// 4. The users agree to reproduce any copyright notice which appears on -// the software on any copy or modification of such made available -// to others -// Agreed to on __Jan 01, 2016__________________ -// By: ___University of California, Berkeley____ -// ___Chenming Hu_____________________ -// ___Professor in Graduate School _______ -// ******************************************************** - -// Numerical Constants -`define EXPL_THRESHOLD 80.0 -`define MAX_EXPL 5.540622384e34 -`define MIN_EXPL 1.804851387e-35 -`define N_MINLOG 1.0e-38 -`define MEXPQM 4 -`define DELTA_1 0.02 -`define DELTA_ASYMM 0.04 -`define CONSTCtoK (273.15) -`define REFTEMP (300.15) /* 27 degrees C */ - - -// Model type definitions -`define ntype 1 -`define ptype 0 - -// Physical Constants -`define q 1.60219e-19 // Coul -`define EPS0 8.8542e-12 // F/m -`define HBAR 1.05457e-34 // Joule-sec -`define MEL 9.11e-31 // kg -`define KboQ 8.617087e-5 // Joule / degree - -// Mathematical functions -//`define SINH(x) (0.5 * (lexp(x) - lexp(-(x)))) -`define COSH(x) (0.5 * (lexp(x) + lexp(-(x)))) -//`define TANH(x) ((lexp(x) - lexp(-(x))) / (lexp(x) + lexp(-(x)))) -`define COT(x) ((x)>=`M_PI/2 ? 0 : ((x)<=-`M_PI/2 ? 0 : 1.0/tan(x))) - -// Junction capacitance -//ex:(ves_jct, Czbs, PBS_t, SBS, MJS, MJS2, Qes1) -`define BSIM6JunctnCap(vex, Cz, PB, SJ, MJ, MJ2, Qej) \ - begin \ - if (Cz > 0.0) begin \ - T1 = vex / PB; \ - if (T1 < 0.9) begin \ - if (SJ > 0.0) begin /*second-step junction*/ \ - vec = PB * (1.0 - lexp((1.0 / MJ) * lln(1.0/SJ))); /*Switch over voltage*/\ - pb2 = PB * SJ * MJ2 / MJ / lexp(- (1.0 + MJ) * lln(1.0 - vec / PB)); /*PB for second doping region*/\ - if (vex > vec) begin \ - arg = 1.0 - T1; \ - if (MJ == 0.5) sarg = 1.0 / sqrt(arg); \ - else sarg = lexp(-MJ * lln(arg)); \ - Qej = PB * Cz * (1.0 - arg * sarg) / (1.0 - MJ); \ - end else begin /*vex < vec*/ \ - arg = 1.0 - vec / PB; \ - if (MJ == 0.5) sarg = 1.0 / sqrt(arg); \ - else sarg = lexp(-MJ * lln(arg)); \ - Qec = PB * Cz * (1.0 - arg * sarg) / (1.0 - MJ); \ - arg = 1.0 - (vex - vec) / pb2; \ - if (MJ2 == 0.5) sarg = 1.0 / sqrt(arg); \ - else sarg = lexp(-MJ2 * lln(arg)); \ - Qej = Qec + SJ * pb2 * Cz * (1.0 - arg * sarg) / (1.0 - MJ2); \ - end \ - end else begin /*single junction*/ \ - arg = 1.0 - T1; \ - if (MJ == 0.5) sarg = 1.0 / sqrt(arg); \ - else sarg = lexp(-MJ * lln(arg)); \ - Qej = PB * Cz * (1.0 - arg * sarg) / (1.0 - MJ); \ - end \ - end else begin /*vex/PB>=0.9*/ \ - T2 = lexp(-MJ * lln(0.1)); \ - T3 = 1.0 / (1.0-MJ); \ - T4 = T2 * (T1 - 1.0) * (5.0 * MJ * (T1-1.0) + (1.0 + MJ) ); \ - T5 = T3 * (1.0 - 0.05 * MJ * (1.0 + MJ) * T2 ); \ - Qej = PB * Cz * (T4 + T5); /*Quadratic equation for Qej when vex/PB>=0.9*/\ - end \ - end else begin \ - Qej = 0.0; \ - end \ - end - -// -// Macros for the model/instance parameters -// -// MPRxx model parameter real -// MPIxx model parameter integer -// IPRxx instance parameter real -// IPIxx instance parameter integer -// || -// cc closed lower bound, closed upper bound -// oo open lower bound, open upper bound -// co closed lower bound, open upper bound -// oc open lower bound, closed upper bound -// cz closed lower bound=0, open upper bound=inf -// oz open lower bound=0, open upper bound=inf -// nb no bounds -// ex no bounds with exclude -// sw switch(integer only, values 0=false and 1=true) -// ty switch(integer only, values -1=p-type and +1=n-type) -// -// IPM instance parameter mFactor(multiplicity, implicit for LRM2.2) -// OPP operating point parameter, includes units and description for printing -// -`define ALIAS(alias,paramName) aliasparam alias = paramName ; -`define OPP(nam,uni,des) (*units=uni, desc=des*) real nam ; - -`define MPRnb(nam,def,uni, des) (*units=uni, desc=des*) parameter real nam=def ; -`define MPRex(nam,def,uni,exc, des) (*units=uni, desc=des*) parameter real nam=def exclude exc ; -`define MPRcc(nam,def,uni,lwr,upr,des) (*units=uni, desc=des*) parameter real nam=def from[lwr:upr] ; -`define MPRoo(nam,def,uni,lwr,upr,des) (*units=uni, desc=des*) parameter real nam=def from(lwr:upr) ; -`define MPRco(nam,def,uni,lwr,upr,des) (*units=uni, desc=des*) parameter real nam=def from[lwr:upr) ; -`define MPRoc(nam,def,uni,lwr,upr,des) (*units=uni, desc=des*) parameter real nam=def from(lwr:upr] ; -`define MPRcz(nam,def,uni, des) (*units=uni, desc=des*) parameter real nam=def from[ 0:inf); -`define MPRoz(nam,def,uni, des) (*units=uni, desc=des*) parameter real nam=def from( 0:inf); - -`define MPInb(nam,def,uni, des) (*units=uni, desc=des*) parameter integer nam=def ; -`define MPIex(nam,def,uni,exc, des) (*units=uni, desc=des*) parameter integer nam=def exclude exc ; -`define MPIcc(nam,def,uni,lwr,upr,des) (*units=uni, desc=des*) parameter integer nam=def from[lwr:upr] ; -`define MPIoo(nam,def,uni,lwr,upr,des) (*units=uni, desc=des*) parameter integer nam=def from(lwr:upr) ; -`define MPIco(nam,def,uni,lwr,upr,des) (*units=uni, desc=des*) parameter integer nam=def from[lwr:upr) ; -`define MPIoc(nam,def,uni,lwr,upr,des) (*units=uni, desc=des*) parameter integer nam=def from(lwr:upr] ; -`define MPIcz(nam,def,uni, des) (*units=uni, desc=des*) parameter integer nam=def from[ 0:inf); -`define MPIoz(nam,def,uni, des) (*units=uni, desc=des*) parameter integer nam=def from( 0:inf); - -`define MPIsw(nam,def,uni, des) (*units=uni, desc=des*) parameter integer nam=def from[ 0: 1] ; -`define MPIty(nam,def,uni, des) (*units=uni, desc=des*) parameter integer nam=def from[ -1: 1] exclude 0 ; - -`define IPRnb(nam,def,uni, des) (*units=uni, type="instance", desc=des*) parameter real nam=def ; -`define IPRex(nam,def,uni,exc, des) (*units=uni, type="instance", desc=des*) parameter real nam=def exclude exc ; -`define IPRcc(nam,def,uni,lwr,upr,des) (*units=uni, type="instance", desc=des*) parameter real nam=def from[lwr:upr] ; -`define IPRoo(nam,def,uni,lwr,upr,des) (*units=uni, type="instance", desc=des*) parameter real nam=def from(lwr:upr) ; -`define IPRco(nam,def,uni,lwr,upr,des) (*units=uni, type="instance", desc=des*) parameter real nam=def from[lwr:upr) ; -`define IPRoc(nam,def,uni,lwr,upr,des) (*units=uni, type="instance", desc=des*) parameter real nam=def from(lwr:upr] ; -`define IPRcz(nam,def,uni, des) (*units=uni, type="instance", desc=des*) parameter real nam=def from[ 0:inf); -`define IPRoz(nam,def,uni, des) (*units=uni, type="instance", desc=des*) parameter real nam=def from( 0:inf); - -`define IPInb(nam,def,uni, des) (*units=uni, type="instance", desc=des*) parameter integer nam=def ; -`define IPIex(nam,def,uni,exc, des) (*units=uni, type="instance", desc=des*) parameter integer nam=def exclude exc ; -`define IPIcc(nam,def,uni,lwr,upr,des) (*units=uni, type="instance", desc=des*) parameter integer nam=def from[lwr:upr] ; -`define IPIoo(nam,def,uni,lwr,upr,des) (*units=uni, type="instance", desc=des*) parameter integer nam=def from(lwr:upr) ; -`define IPIco(nam,def,uni,lwr,upr,des) (*units=uni, type="instance", desc=des*) parameter integer nam=def from[lwr:upr) ; -`define IPIoc(nam,def,uni,lwr,upr,des) (*units=uni, type="instance", desc=des*) parameter integer nam=def from(lwr:upr] ; -`define IPIcz(nam,def,uni, des) (*units=uni, type="instance", desc=des*) parameter integer nam=def from[ 0:inf); -`define IPIoz(nam,def,uni, des) (*units=uni, type="instance", desc=des*) parameter integer nam=def from( 0:inf); - -`ifdef EXPLICIT_MFACTOR - `define IPM (*units="" , type="instance", desc="multiplicity factor"*) parameter real m=1.0 from(0.0:inf) ; - `define MFACTOR_USE m -`else // - `define IPM - `define MFACTOR_USE 1.0 -`endif diff --git a/src/spicelib/devices/adms/ekv/admsva/ekv.va b/src/spicelib/devices/adms/ekv/admsva/ekv.va deleted file mode 100644 index a75bcfdd8..000000000 --- a/src/spicelib/devices/adms/ekv/admsva/ekv.va +++ /dev/null @@ -1,621 +0,0 @@ -// EPFL-EKV version 2.6: A Verilog-A description. -// The intrinsic device is coded according to the official manual -// (revision II) available at http://legwww.epfl.ch/ekv. -// contribution of Ivan Riis Nielsen 11/2006, modified by Dietmar Warning 01/2009 - -`define P(txt) (*txt*) -`define PGIVEN(p) $param_given(p) -`ifdef insideADMS - `define INITIAL_MODEL @(initial_model) - `define INSTANCE @(initial_instance) - `define NOISE @(noise) -`else - `define INITIAL_MODEL - `define INSTANCE - `define NOISE -`endif - -`include "constants.h" -`include "discipline.h" - -`define NMOS 1 -`define PMOS -1 - -`define EPSSI `P_EPS0*11.7 -`define EPSOX `P_EPS0*3.9 -`define TREF 300.15 -`define MIN_R 0.001 -`define VEXLIM 200.0 - -`define SQR(x) ((x)*(x)) - -`define VT(temp) (`P_K*temp/`P_Q) -`define EG(temp) (1.16-0.000702*`SQR(temp)/(temp+1108)) -`define NI(temp) (1.45e16*(temp/`TREF)*exp(`EG(`TREF)/(2*`VT(`TREF))-`EG(temp)/(2*`VT(temp)))) - -`define y_fv(fv,y)\ - if (fv > -0.35) begin \ - z0 = 2.0/(1.3 + fv - ln(fv+1.6));\ - z1 = (2.0 + z0) / (1.0 + fv + ln(z0));\ - y = (1.0 + fv + ln(z1)) / (2.0 + z1);\ - end \ - else if (fv > -15) begin \ - tmp = exp(-fv);\ - z0 = 1.55 + tmp;\ - z1 = (2.0 + z0) / (1.0 + fv + ln(z0));\ - y = (1.0 + fv + ln(z1)) / (2.0 + z1);\ - end \ - else if (fv > -23.0) begin \ - tmp = exp(-fv);\ - y = 1.0 / (2.0 + tmp);\ - end \ - else begin \ - tmp = exp(fv);\ - y = tmp + 1.0e-64;\ - end - -`define expLin(result, x)\ - if (x < `VEXLIM)\ - result = exp(x);\ - else begin\ - result = exp(`VEXLIM) * (1.0 + (x - `VEXLIM));\ - end - -module ekv (d,g,s,b); - - // Node definitions - - inout d,g,s,b; // external nodes - electrical d,g,s,b; // external nodes - electrical dp,sp; // internal nodes - - branch (dp,sp) dpsp; - branch (dp,b) dpb; - branch (sp,b) spb; - branch (g,dp) gpdp; - branch (g,sp) gpsp; - branch (g,b) gb; - branch (d,dp) ddp; - branch (s,sp) ssp; - - // Instance parameters - - // - intrinsic model - parameter real l=10e-6 from [0:inf) `P(type="instance" desc="Drawn length [m]" units="m"); - parameter real w=10e-6 from [0:inf) `P(type="instance" desc="Drawn width [m]" units="m"); - parameter real m=1.0 from [1:inf) `P(type="instance" desc="Parallel multiplier" units="m"); - parameter real ns=1.0 from [1:inf) `P(type="instance" desc="Series multiplier" units="m"); - parameter real dtemp = 0.0 from (-inf:inf) `P(type="instance" desc="Difference sim. temp and device temp" units="C"); - - // - external parasitics - parameter real ad=0.0 from [0:inf) `P(type="instance" desc="Drain area" units="m^2"); - parameter real as=0.0 from [0:inf) `P(type="instance" desc="Source area" units="m^2"); - parameter real pd=0.0 from [0:inf) `P(type="instance" desc="Drain perimeter" units="m"); - parameter real ps=0.0 from [0:inf) `P(type="instance" desc="Source perimeter" units="m"); - parameter real nrd=0.0 from [0:inf) `P(type="instance" desc="Drain no. squares"); - parameter real nrs=0.0 from [0:inf) `P(type="instance" desc="Source no. squares"); - - // Model parameters - - parameter integer nmos=1 from [0:1] `P(desc="MOS channel type"); - parameter integer pmos=1 from [0:1] `P(desc="MOS channel type"); - parameter integer type=1 from [-1:1] exclude 0; - parameter real tnom=27.0 from [-273.15:inf) `P(desc="Nominal temperature" units="C"); - parameter real imax=1.0 from [0:inf) `P(desc="Maximum forward junction current before linearization" units="A"); - - // - intrinsic model (optional, section 4.2.1) - parameter real tox=0.0 from [0:inf) `P(desc="Oxide thickness" units="m"); - parameter real nsub=0.0 from [0:inf) `P(desc="Channel doping" units="cm^-3"); - parameter real vfb=-1.0 from (-inf:inf) `P(desc="Flat-band voltage" units="V"); - - parameter real uo=0.0 from [0:inf) `P(desc="Low-field mobility" units="cm^2/Vs"); - parameter real vmax=0.0 from [0:inf) `P(desc="Saturation velocity" units="m/s"); - parameter real theta=0.0 from [0:inf) `P(desc="Mobility reduction coefficient" units="V^-1"); - - // - intrinsic model (process related, section 4.1) - parameter real cox=0.7e-3 from [1e-6:inf) `P(desc="Oxide capacitance" units="F/m^2"); - parameter real xj=0.1e-6 from [1n:inf) `P(desc="Junction depth" units="m"); - parameter real dl=0.0 from (-inf:inf) `P(desc="Length correction" units="m"); - parameter real dw=0.0 from (-inf:inf) `P(desc="Width correction" units="m"); - - // - intrinsic model (basic, section 4.2) - parameter real gamma=0.7 from [0:inf) `P(desc="Body effect parameter" units="V^0.5"); - parameter real phi=0.5 from [0.1:inf) `P(desc="Bulk Fermi potential (*2)" units="V"); - parameter real vto=0.5 from (-inf:inf) `P(desc="Long-channel threshold voltage" units="V"); - parameter real kp=20e-6 from [0.0:inf) `P(desc="Transconductance parameter" units="A/V^2"); - parameter real ucrit=1.0e+6 from [100e+3:inf) `P(desc="Longitudinal critical field" units="V/m"); - parameter real e0=1.0e-9 from [1e-12:inf) `P(desc="Mobility reduction coefficient" units="V/m"); - - // - intrinsic model (channel length modulation and charge sharing, section 4.3) - parameter real lambda=0.5 from [0:inf) `P(desc="Depletion length coefficient (CLM)"); - parameter real weta=0.25 from (-inf:inf) `P(desc="Narrow-channel effect coefficient"); - parameter real leta=0.1 from (-inf:inf) `P(desc="Short-channel effect coefficient"); - - // - intrinsic model (reverse short channel effect, section 4.4) - parameter real q0=0.0 from (-inf:inf) `P(desc="RSCE peak charge density" units="C/m^2"); - parameter real lk=0.29e-6 from [10n:inf) `P(desc="RSCE characteristic length" units="m"); - - // - intrinsic model (impact ionization, section 4.5) - parameter real iba=0.0 from (-inf:inf) `P(desc="First impact ionization coefficient" units="m^-1"); - parameter real ibb=3e8 from [1e8:inf) `P(desc="Second impact ionization coefficient" units="V/m"); - parameter real ibn=1.0 from [0.1:inf) `P(desc="Saturation voltage factor for impact ionization"); - - // - intrinsic model (temperature, section 4.6) - parameter real tcv=1e-3 from (-inf:inf) `P(desc="Threshold voltage TC" units="V/deg"); - parameter real bex=-1.5 from (-inf:inf) `P(desc="Mobility temperature exponent"); - parameter real ucex=0.8 from (-inf:inf) `P(desc="Longitudinal critical field temperature exponent"); - parameter real ibbt=9e-4 from (-inf:inf) `P(desc="Temperature coefficient for ibb" units="K^-1"); - - // - intrinsic model (matching, section 4.7) - parameter real avto=0.0 from (-inf:inf) `P(desc="Area related vto mismatch parameter" units="Vm"); - parameter real akp=0.0 from (-inf:inf) `P(desc="Area related kp mismatch parameter" units="m"); - parameter real agamma=0.0 from (-inf:inf) `P(desc="Area related gamma mismatch parameter" units="V^0.5*m"); - - // - intrinsic model (flicker noise, section 4.8) - parameter real kf=0.0 from [0:inf) `P(desc="Flicker noise coefficient"); - parameter real af=1.0 from (-inf:inf) `P(desc="Flicker noise exponent"); - - // - external parasitic parameters - parameter real hdif=0.0 from [0:inf) `P(desc="S/D diffusion length (/2)" units="m"); - parameter real rsh=0.0 from [0:inf) `P(desc="S/D sheet resistance" units="Ohm"); - parameter real js=0.0 from [0:inf) `P(desc="S/D junction saturation current density" units="A/m^2"); - parameter real jsw=0.0 from [0:inf) `P(desc="S/D junction sidewall saturation current density" units="A/m"); - parameter real xti=0.0 from [0:inf) `P(desc="S/D diode saturation current temperature exponent"); - parameter real n=1 from [0.5:10] `P(desc="S/D diode emission coefficient"); - parameter real cj=0.0 from [0:inf) `P(desc="S/D zero-bias junction capacitance per area" units="F/m^2"); - parameter real cjsw=0.0 from [0:inf) `P(desc="S/D zero-bias junction capacitance per perimeter" units="F/m"); - parameter real pb=0.8 from (0:inf) `P(desc="S/D bottom junction builtin potential" units="V"); - parameter real pbsw=pb from (0:inf) `P(desc="S/D sidewall junction builtin potential" units="V"); - parameter real mj=0.5 from (0:inf) `P(desc="S/D bottom junction grading coefficient"); - parameter real mjsw=0.333 from (0:inf) `P(desc="S/D sidewall junction grading coefficient"); - parameter real fc=0.5 from (0:inf) `P(desc="S/D bottom junction forward-bias threshold"); - parameter real fcsw=fc from (0:inf) `P(desc="S/D sidewall junction forward-bias threshold"); - parameter real cgso=1.5e-10 from [0:inf) `P(desc="Gate-source overlap capacitance per width" units="F/m"); - parameter real cgdo=1.5e-10 from [0:inf) `P(desc="Gate-drain overlap capacitance per width" units="F/m"); - parameter real cgbo=4.0e-10 from [0:inf) `P(desc="Gate-bulk overlap capacitance per length" units="F/m"); - - // Declaration of variables - integer mode, MOStype; - real lc,isat_s,vexp_s,gexp_s,isat_d,vexp_d,gexp_d,fact, - weff,leff,lmin,RDeff,RSeff,ceps,ca,xsi,dvrsce, - TempK,Vt,sqrt_A,vto_a,kp_a,gamma_a,ucrit_a,phi_a,ibb_a,vc,qb0, - vg,vd,vs,tmp,vgprime,vp0,vsprime,vdprime,gamma0,gammaprime,vp,nslope,ifwd, - vdss,vdssprime,dv,vds,vip,dl_a,lprime,leq,irprime,irev,beta0,nau, - nq,xf,xr,qd,qs,qi,qb,qg,beta0prime,beta,vpprime,is,ids,vib, - idb,ibdj,ibsj,coxt,qdt,qst,qdtx,qstx,qgt,qjs,qjd, - cbs0,cbs0sw,cbs,cbd0,cbd0sw,cbd,v_bp_dp, v_bp_sp, - fv,z0,z1,y; - - real ADeff, ASeff, PDeff, PSeff; - real cgso_s,cgdo_s,cgbo_s; - real gmin, TnomK; - real cox_p, gamma_p, phi_p, kp_p, vto_p, ucrit_p; - - analog begin - - MOStype = 1; - - gmin = $simparam("gmin"); - - `INITIAL_MODEL // Model Initialization - begin - if (`PGIVEN(nmos)) begin - MOStype = `NMOS; - end else if (`PGIVEN(pmos)) begin - MOStype = `PMOS; - end else begin - MOStype = (`PGIVEN(type)) ? type : `NMOS; - end - //$strobe("MOStype %d", MOStype); - - if (`PGIVEN(cox)) begin - cox_p = cox; - end else begin - cox_p = (tox>0) ? (`EPSOX/tox) : 0.7e-3; - end - - if (`PGIVEN(gamma)) begin - gamma_p = gamma; - end else begin - gamma_p = (nsub>0) ? (sqrt(2*`P_Q*`EPSSI*nsub*1e+6)/cox_p) : 0.7; - end - - if (`PGIVEN(phi)) begin - phi_p = phi; - end else begin - phi_p = (nsub>0) ? (2*`VT(tnom+273.15)*ln(nsub*1e+6/`NI(tnom+273.15))) : 0.5; - end - - if (`PGIVEN(kp)) begin - kp_p = kp; - end else begin - kp_p = (uo>0) ? (uo*1e-4*cox_p) : 20e-6; - end - - if (`PGIVEN(vto)) begin - vto_p = vto; - end else begin - vto_p = (`PGIVEN(vfb)) ? (vfb+phi_p+gamma_p*sqrt(phi_p)) : 0.5; - end - - if (`PGIVEN(ucrit)) begin - ucrit_p = ucrit; - end else begin - ucrit_p = (vmax>0 && uo>0) ? (vmax/(uo*1e-4)) : 100e+3; - end - - lc = sqrt(`EPSSI/cox_p*xj); - - end // INITIAL_MODEL - - `INSTANCE // temperature independent device initialization - begin - weff = w+dw; - leff = l+dl; - - // eq. 54 - lmin = 0.1*ns*leff; - - if (hdif > 0) begin - RSeff = ns/m*rsh*hdif/weff; - RDeff = ns/m*rsh*hdif/weff; - ADeff = 2*hdif*weff; - ASeff = 2*hdif*weff; - PDeff = 4*hdif+2*weff; - PSeff = 4*hdif+2*weff; - end else begin - RSeff = ns/m*rsh*nrs; - RDeff = ns/m*rsh*nrd; - ADeff = ad; - ASeff = as; - PDeff = pd; - PSeff = ps; - end - if (RDeff < `MIN_R) begin - RDeff = `MIN_R; - end - if (RSeff < `MIN_R) begin - RSeff = `MIN_R; - end - - ceps = 4*22e-3*22e-3; - ca = 0.028; - xsi = ca*(10*leff/lk-1); - dvrsce = 2*q0/cox_p/`SQR(1+0.5*(xsi+sqrt(xsi*xsi+ceps))); - - coxt = m*ns*cox_p*weff*leff; - - cbs0 = m*ns*cj*ASeff; - cbd0 = m*ns*cj*ADeff; - cbs0sw = m*ns*cjsw*PSeff; - cbd0sw = m*ns*cjsw*PDeff; - - cgso_s = m*ns*cgso*weff; - cgdo_s = m*ns*cgdo*weff; - cgbo_s = m*ns*cgbo*leff; - - end // temperature independent - - `INSTANCE // temperature dependent device initialization - begin - if (dtemp > 0.0) begin - TempK = $temperature + dtemp; - end else begin - TempK = $temperature; - end - - TnomK = tnom + 273.15; - - Vt = `VT(TempK); - - sqrt_A = sqrt(m*weff*ns*leff); - - vto_a = MOStype*(vto_p+tcv*(TempK-TnomK))+avto/sqrt_A; - kp_a = m*kp_p*pow(TempK/TnomK,bex)*(1+akp/sqrt_A); - gamma_a = gamma_p+agamma/sqrt_A; - ucrit_a = ucrit_p*pow(TempK/TnomK,ucex); - phi_a = phi_p*TempK/TnomK-3*Vt*ln(TempK/TnomK)-`EG(TnomK)*TempK/TnomK+`EG(TempK); - ibb_a = ibb*(1+ibbt*(TempK-TnomK)); - - vc = ucrit_a*ns*leff; - - // eq. 60 - qb0 = gamma_a*sqrt(phi_a); - - fact = (`EG(TnomK)/`VT(TnomK)-`EG(TempK)/Vt) * pow(TempK/TnomK,xti); - `expLin(tmp,fact) - isat_s = m*ns*(js*ASeff+jsw*PSeff)*tmp; - isat_d = m*ns*(js*ADeff+jsw*PDeff)*tmp; - - if (isat_s>0) begin - vexp_s = Vt*ln(imax/isat_s+1); - gexp_s = (imax+isat_s)/Vt; - end else begin - vexp_s = -1e9; - gexp_s = 0; - end - - if (isat_d>0) begin - vexp_d = Vt*ln(imax/isat_d+1); - gexp_d = (imax+isat_d)/Vt; - end else begin - vexp_d = -1e9; - gexp_d = 0; - end - - end // temperature dependent - - - begin //Bias-dependent model evaluation - - vg = MOStype*V(gb); - vd = MOStype*V(dpb); - vs = MOStype*V(spb); - // $strobe("MOStype %d vg=%e vd=%e vs=%e",MOStype,vg,vd,vs); - - if (vd>=vs) - mode = 1; - else begin - mode = -1; - tmp = vs; - vs = vd; - vd = tmp; - end - - // eq. 33 - vgprime = vg-vto_a-dvrsce+phi_a+gamma_a*sqrt(phi_a); - // eq. 35 - vsprime = 0.5*(vs+phi_a+sqrt(`SQR(vs+phi_a)+16*`SQR(Vt))); - vdprime = 0.5*(vd+phi_a+sqrt(`SQR(vd+phi_a)+16*`SQR(Vt))); - // $strobe("vgprime=%e vdprime=%e vsprime=%e",vgprime,vdprime,vsprime); - // eq. 34 - if (vgprime>=0) begin - vp0 = vgprime-phi_a-gamma_a*(sqrt(vgprime+0.25*`SQR(gamma_a))-0.5*gamma_a); - // eq. 36 - gamma0 = gamma_a-`EPSSI/cox_p*(leta/leff*(sqrt(vsprime)+sqrt(vdprime))-3*weta/weff*sqrt(vp0+phi_a)); - end else begin - vp0 = -phi_a; - // eq. 36 - skipped sqrt(vp0+phi_a) here, it produces inf on derivative - gamma0 = gamma_a-`EPSSI/cox_p*(leta/leff*(sqrt(vsprime)+sqrt(vdprime)) ); - end - // eq. 37 - gammaprime = 0.5*(gamma0+sqrt(`SQR(gamma0)+0.1*Vt)); - // eq. 38 - if (vgprime>=0) begin - vp = vgprime-phi_a-gammaprime*(sqrt(vgprime+0.25*`SQR(gammaprime))-0.5*gammaprime); - end else begin - vp = -phi_a; - end - // $strobe("vp0=%e vp=%e gamma0=%e gammaprime=%e",vp0,vp,gamma0,gammaprime); - // eq. 39 - nslope = 1+gamma_a*0.5/sqrt(vp+phi_a+4*Vt); - - // Forward current (43-44) - fv=(vp-vs)/Vt; - - `y_fv(fv,y) - - ifwd = y*(1.0 + y); - - // eq. 46 - vdss = vc*(sqrt(0.25+Vt/vc*sqrt(ifwd))-0.5); - // eq. 47 - vdssprime = vc*(sqrt(0.25+Vt/vc*(sqrt(ifwd)-0.75*ln(ifwd)))-0.5)+Vt*(ln(0.5*vc/Vt)-0.6); - // $strobe("ifwd=%e vdss=%e vdssprime=%e",ifwd,vdss,vdssprime); - // eq. 48 - dv = 4*Vt*sqrt(lambda*(sqrt(ifwd)-vdss/Vt)+1.0/64); - // eq. 49 - vds = 0.5*(vd-vs); - // eq. 50 - vip = sqrt(`SQR(vdss)+`SQR(dv))-sqrt(`SQR(vds-vdss)+`SQR(dv)); - // eq. 52 - dl_a = lambda*lc*ln(1+(vds-vip)/(lc*ucrit_a)); - - // eq. 53 - lprime = ns*leff-dl_a+(vds+vip)/ucrit_a; - // eq. 55 - leq = 0.5*(lprime+sqrt(`SQR(lprime)+`SQR(lmin))); - - // eq. 56 - fv=(vp-vds-vs-sqrt(`SQR(vdssprime)+`SQR(dv))+sqrt(`SQR(vds-vdssprime)+`SQR(dv)))/Vt; - - `y_fv(fv,y) - - irprime = y*(1.0 + y); - - // eq. 57 - fv=(vp-vd)/Vt; - - `y_fv(fv,y) - - irev = y*(1.0 + y); - - // eq. 58 - beta0 = kp_a*weff/leq; - // eq. 59 - nau = (5+MOStype)/12.0; - - // eq. 69 - nq = 1+0.5*gamma_a/sqrt(vp+phi_a+1e-6); - - // eq. 70 - xf = sqrt(0.25+ifwd); - // eq. 71 - xr = sqrt(0.25+irev); - // eq. 72 - qd = -nq*(4.0/15*(3*`SQR(xr)*(xr+2*xf)+2*`SQR(xf)*(xf+2*xr))/`SQR(xf+xr)-0.5); - // eq. 73 - qs = -nq*(4.0/15*(3*`SQR(xf)*(xf+2*xr)+2*`SQR(xr)*(xr+2*xf))/`SQR(xf+xr)-0.5); - // eq. 74 - qi = qs+qd; - // eq. 75 - if (vgprime>=0) begin - qb = (-gamma_a*sqrt(vp+phi_a+1e-6))/Vt-(nq-1)/nq*qi; - end else begin - qb = -vgprime/Vt; - end - // eq. 76 (qox removed since it is assumed to be zero) - qg = -qi-qb; - - if (e0!=0) begin - // eq. 61 - beta0prime = beta0*(1+cox_p/(e0*`EPSSI)*qb0); - // eq. 62 - beta = beta0prime/(1+cox_p/(e0*`EPSSI)*Vt*abs(qb+nau*qi)); - end else begin - // eq. 63 - vpprime = 0.5*(vp+sqrt(`SQR(vp)+2*`SQR(Vt))); - // eq. 64 - beta = beta0/(1+theta*vpprime); - end // else: !if(e0!=0) - // eq. 65 - is = 2*nslope*beta*`SQR(Vt); - // $strobe("beta0=%e beta0prime=%e beta=%e e0=%e qb0=%e qb=%e qi=%e",beta0,beta0prime,beta,e0,qb0,qb,qi); - // eq. 66 - ids = is*(ifwd-irprime); - // eq. 67 - vib = vd-vs-ibn*2*vdss; - // eq. 68 - if (vib>0) begin - `expLin(tmp,(-ibb_a*lc)/vib) - idb = ids*iba/ibb_a*vib*tmp; - end else - idb = 0; - // $strobe("ids=%e idb=%e",ids,idb); - - if (mode>1) begin - if (isat_s>0) begin - if (-vs>vexp_s) - ibsj = imax+gexp_s*(-vs-vexp_s); - else begin - `expLin(tmp,-vs/(n*Vt)) - ibsj = isat_s*(tmp-1); - end - end else - ibsj = 0; - - if (isat_d>0) begin - if (-vd>vexp_d) - ibdj = imax+gexp_d*(-vd-vexp_d); - else begin - `expLin(tmp,-vd/(n*Vt)) - ibdj = isat_d*(tmp-1); - end - end else - ibdj = 0; - - end else begin // if (mode>1) - if (isat_s>0) begin - if (-vd>vexp_s) - ibsj = imax+gexp_s*(-vd-vexp_s); - else begin - `expLin(tmp,-vd/(n*Vt)) - ibsj = isat_s*(tmp-1); - end - end else - ibsj = 0; - - if (isat_d>0) begin - if (-vs>vexp_d) - ibdj = imax+gexp_d*(-vs-vexp_d); - else begin - `expLin(tmp,-vs/(n*Vt)) - ibdj = isat_d*(tmp-1); - end - end else - ibdj = 0; - - end // else: !if(mode>1) - - qdt = coxt*Vt*qd; - qst = coxt*Vt*qs; - qgt = coxt*Vt*qg; -// qbt = coxt*Vt*qb; - - cbs = 0; - cbd = 0; - v_bp_dp = MOStype*V(b,dp); - v_bp_sp = MOStype*V(b,sp); - if (cbs0>0) begin - if (v_bp_sp>fc*pb) begin - cbs = cbs+cbs0/pow(1-fc,mj)*(1+mj*(v_bp_sp-pb*fc))/(pb*(1-fc)); - end else begin - cbs = cbs+cbs0/pow(1-v_bp_sp,mj); - end - end - if (cbd0>0) begin - if (v_bp_dp>fc*pb) begin - cbd = cbd+cbd0/pow(1-fc,mj)*(1+mj*(v_bp_dp-pb*fc))/(pb*(1-fc)); - end else begin - cbd = cbd+cbd0/pow(1-v_bp_dp,mj); - end - end - if (cbs0sw>0) begin - if (v_bp_sp>fcsw*pbsw) begin - cbs = cbs+cbs0sw/pow(1-fcsw,mjsw)*(1+mjsw*(v_bp_sp-pbsw*fcsw))/(pbsw*(1-fcsw)); - end else begin - cbs = cbs+cbs0sw/pow(1-v_bp_sp,mjsw); - end - end - if (cbd0sw>0) begin - if (v_bp_dp>fcsw*pbsw) begin - cbd = cbd+cbd0sw/pow(1-fcsw,mjsw)*(1+mjsw*(v_bp_dp-pbsw*fcsw))/(pbsw*(1-fcsw)); - end else begin - cbd = cbd+cbd0sw/pow(1-v_bp_dp,mjsw); - end - end - - end //Bias-dependent model evaluation - - begin //Define branch sources - - I(dpsp) <+ MOStype*mode*ids; - I(dpsp) <+ gmin*V(dpsp); - - if (mode>0) begin - I(dpb) <+ MOStype*idb; - I(dpb) <+ gmin*V(dpb); - - qdtx = qdt; - qstx = qst; - - end else begin - I(spb) <+ MOStype*idb; - I(spb) <+ gmin*V(spb); - - qdtx = qst; - qstx = qdt; - - end // else: !if(mode>0) - - I(dpb) <+ MOStype*ddt(qdtx); - I(spb) <+ MOStype*ddt(qstx); - I(gb) <+ MOStype*ddt(qgt); - //$strobe("V(dpb): %e qdtx=%e V(spb): %e qstx=%e V(gb): %e qgt: %e" ,V(dpb),qdtx,V(spb),qstx,V(gb),qgt); - - I(b,sp) <+ MOStype*ibsj; - I(b,dp) <+ MOStype*ibdj; - - qjs = cbs * v_bp_sp; - qjd = cbd * v_bp_dp; - I(b,sp) <+ MOStype*ddt(qjs); - I(b,dp) <+ MOStype*ddt(qjd); - //$strobe("v_bp_sp: %e cbs=%e v_bp_dp: %e cbd=%e" ,v_bp_sp,cbs,v_bp_dp,cbd); - - I(gpsp) <+ ddt(cgso_s*V(gpsp)); - I(gpdp) <+ ddt(cgdo_s*V(gpdp)); - I(gb) <+ ddt(cgbo_s*V(gb)) + gmin*V(dpsp); - //$strobe("V(gpsp): %e cgso_s=%e V(gpdp): %e cgdo_s=%e V(gb): %e cgbo_s: %e" ,V(gpsp),cgso_s,V(gpdp),cgdo_s,V(gb),cgbo_s); - - I(ddp) <+ V(ddp)/RDeff; - I(ssp) <+ V(ssp)/RSeff; - - end // begin - -// `NOISE begin //Define noise sources -// -// end // noise - - end //analog - -endmodule diff --git a/src/spicelib/devices/adms/hicum0/admsva/hicum0.va b/src/spicelib/devices/adms/hicum0/admsva/hicum0.va deleted file mode 100644 index 96b45368a..000000000 --- a/src/spicelib/devices/adms/hicum0/admsva/hicum0.va +++ /dev/null @@ -1,1259 +0,0 @@ -/* ****************************************************************************** - **************** COPYRIGHT NOTICE(Originator: Michael Schroter)*************** - ****************************************************************************** - -The terms under which the HICUM/L0 software is provided are as follows: - -Software is distributed as is, completely without warranty or service -support. Michael Schroter and his team members are not liable for the -condition or performance of the software. - -Michael Schroter owns the copyright and grants users a perpetual, -irrevocable, worldwide, non-exclusive, royalty-free license with respect -to the software as set forth below. - -Michael Schroter hereby disclaims all implied warranties. - -Michael Schroter grants the users the right to modify, copy, and -redistribute the software and documentation, both within the user's -organization and externally, subject to the following restrictions. - -1. The users agree not to charge for the model owner's code itself but may - charge for additions, extensions, or support. - -2. In any product based on the software, the users agree to acknowledge - Michael Schroter who developed the model and software. This - acknowledgment shall appear in the product documentation. - -3. Redistributions to others of source code and documentation must retain - the copyright notice, disclaimer, and list of conditions. - -4. Redistributions to others in binary form must reproduce the copyright - notice, disclaimer, and list of conditions in the documentation - and/or other materials provided with the distribution -*/ - -// HICUM Level_0 Version_1.32: A Verilog-A description -// (A simplified version of HICUM Level2 model for BJT) -// ## It is modified after the first version of HICUM/L0 code ## - -// Minor code related changes -// 01/11: Corrected SPICE name for AHQ and ZETAIQF. Implemented a gmin between nodes CI and EI. -// qj is now limited to positive values to improve convergence a negative bias. -// Resolved a convergence issue for cc at calculation of voltage dependence of t0. -// 01/09: Introduction of temporary dc capacitance variable CJE_DC to call the procedure with -// the AC and DC parameter set and assign an AC and DC result to its output variables -// 01/09: Ranges of ZE & ZEDC have been modified to a new range (0:1) from the old range (0:1] -// 12/08: gmin declaration by L. Lemaitre. -// 12/08: rth has been used instead of rth_t (dynamic variable) in the corresponding if statement -// 12/08: Macro `QJMODF has been used to compute AC as well as DC charge with corresponding AC and DC variables respectively -// 11/08: Conditional statement for calculating normalized minority charge to avoid overflow at TFH=0 -// 11/08: Range of AHQ has been modified to a new range [-0.9:10] from the old range [0:10] -// 03/08: Quick Fix: Default value of TFH has been changed from infinity to zero and modification has been done to -// the default value limits to [0, inf) to include zero -// 12/06: Upper limit of FGEO is changed to infinity -// 06/06: Thermal node "tnode" set as external -// Flag FLSH introduced for controlling Self-heating calculation -// all if-else blocks marked with begin-end -// all series resistors and RTH are allowed to have a minimum value MIN_R -// 07/06: QCJMOD deleted, QJMODF introduced along with with HICJQ -// ddx() operator used with QJMOD and QJMODF wherever needed -// aj is kept at 2.4 except BE depletion charge -// Substrate transistor transfer current added. -// Gmin added to (bi,ei) and (bi,ci) branches. -// hyperbolic smoothing used in rbi computation to avoid devide-by-zero. - -// ********************************************************************************* -// 06/06: Comment on NODE COLLAPSING: -// Presently this verilog code permits a minimum of 1 milli-Ohm resistance for any -// series resistance as well as for thermal resistance RTH. If any of the resistance -// values drops below this minimum value, the corresponding nodes are shorted with -// zero voltage contribution. We want the model compilers/simulators deal this -// situation in such a manner that the corresponding node is COLLAPSED. -// We expect that the simulators should permit current contribution statement -// for any branch with resistance value more than (or equal to) 1 milli-Ohm without -// any convergence problem. In fact, we wish NOT to have to use a voltage contribution -// statement in our Verilog code, except as an indication for the model compiler/simulator -// to interprete a zero branch voltage as NODE-COLLAPSING action. -// ********************************************************************************** - -//***************************************************** -//***************************************************** -// 08/04:(Modification by Cornelia Thiele) -// New expression for the normalized hole charge qpt and the model parameter AHQ is inserted -// The reverse Early-Effect VER is reintroduced -// A temperature dependent modeling of IQF using the model parameter ZETAIQF is included - -//***************************************************** -//***************************************************** -// 11/08: Modification done at TUD -// 3 more parameters VDEDC, ZEDC, AJEDC have been introduced for DC depletion charge -// Flag FIQF has been introduced to introduce voltage dependence in the base related critical current -// ZETARTH has been introduced for temperature dependent thermal resistance -//***************************************************** - -//***************************************************** -//***************************************************** -// 01/2011: Modification done at TUD -// Third order polynomial is solved for transfer current. Can be turned on by IT_MOD=1. -// Added voltage dependent Reverse Early voltage. Parameter aver describes voltage dependence. -// Parameters ZETAVER, ZETAVGBE, VGBE describes temperature dependence of VER and IQF. -// Added temperature dependence for IQFH and TFH, ALIQFH and KIQFH is used to model a second order temperature model. -// Parameter TEF_TEMP=0 turns temperature dependence for TEF0 off. -//***************************************************** - - -//***************************************************** -//***************************************************** -// 11/2012: Modification done at TUD -// This code contains a Verilog-A implementation of Vertical Non-Quasi-Static(NQS) -// Effects using adjunct gyrator networks. To turn on this effect please set FLNQS=1. -// -// This code contains Operating Point Information to turn-on this section please use the compiler flag CALC_OP. -//***************************************************** - - -/* ***************************************************** -******************************************************** -12/2015: Modification done at TUD and released as version 1.32 -* Removal of some unrequired variables. -* Changed the type selection (npn or pnp) accordingly to HICUM/L2 - - supply a single type parameter (+1 -> npn, -1 -> pnp) - - remove the npn and pnp parameter -* Parasitic PNP transistor now also takes the device type into account -* Usage of rth instead of rth_t for power calculation - - compatible with node collapsing statement -******************************************************** */ - -//Default simulator: Spectre - -`define PGIVEN(p) $param_given(p) -`ifdef insideADMS - `define P(p) (*p*) - `define INITIAL_MODEL @(initial_model) -`else - `define P(p) - `define INITIAL_MODEL -`endif - -//Spectre -`include "constants.h" -`include "discipline.h" - -// Comment this line, if calculation of operating point values should be omitted -`define CALC_OP - -// Comment this line, if calculation of noise analysis should be omitted -//`define CALC_NOISE - -`define NPN +1 -`define PNP -1 - -`define VPT_thresh 1.0e2 -`define EXPLIM 80.0 -`define INF 1.0e6 -`define TMAX 326.85 -`define TMIN -100.00 -`define MIN_R 0.001 -//`define GMIN 1.0e-12 -//`define GMIN $simparam("gmin") //suggested by L.L -`define GMIN $simparam("gmin",1e-12) //suggested by L.L - -`define QCMODF(vj,cj0,vd,z,aj,cjf)\ - if (cj0 > 0.0) begin\ - vf = vd*(1.0-exp(-ln(aj)/z));\ - xvf = (vf-vj)/VT;\ - xvf2 = sqrt(xvf*xvf+1.921812);\ - v_j = vf-VT*(xvf+xvf2)*0.5;\ - dvj = 0.5*(xvf+xvf2)/xvf2;\ - cjf = cj0*exp(-z*ln(1-v_j/vd))*dvj+aj*cj0*(1-dvj);\ - end else begin\ - cjf = 0.0;\ - end - -// DEPLETION CHARGE CALCULATION -// Hyperbolic smoothing used; no punch-through -`define QJMODF(vj,cj0,vd,z,aj,qjf)\ - if (cj0 > 0.0) begin\ - vf = vd*(1.0-exp(-ln(aj)/z));\ - xvf = (vf-vj)/VT;\ - xvf2 = sqrt(xvf*xvf+1.921812);\ - v_j = vf-VT*(xvf+xvf2)*0.5;\ - x = 1.0-z;\ - y = 1.0-exp(x*ln(1.0-v_j/vd));\ - qjf = cj0*vd*y/x+aj*cj0*(vj-v_j);\ - end else begin\ - qjf = 0.00;\ - end - -// Depletion Charge : with punch through -`define QJMOD(vj,cj0,vd,z,vpt,aj,qjf)\ - if (cj0 > 0.0) begin\ - zr = z/4.0;\ - vp = vpt-vd;\ - vf = vd*(1.0-exp(-ln(aj)/z));\ - cmax = aj*cj0;\ - cr = cj0*exp((z-zr)*ln(vd/vpt));\ - a = VT;\ - ve = (vf-vj)/a;\ - if (ve <= `EXPLIM) begin\ - ex1 = exp(ve);\ - ee1 = 1.0+ex1;\ - vj1 = vf-a*ln(ee1);\ - end else begin\ - vj1 = vj;\ - end\ - a = 0.1*vp+4.0*VT;\ - vr = (vp+vj1)/a;\ - if (vr <= `EXPLIM) begin\ - ex1 = exp(vr);\ - ee1 = 1.0+ex1;\ - vj2 = -vp+a*ln(ee1);\ - end else begin\ - vj2 = vj1;\ - end\ - vj4 = vj-vj1;\ - ez = 1.0-z;\ - ezr = 1.0-zr;\ - vdj1 = ln(1.0-vj1/vd);\ - vdj2 = ln(1.0-vj2/vd);\ - qj1 = cj0*(1.0-exp(vdj2*ez))/ez;\ - qj2 = cr*(1.0-exp(vdj1*ezr))/ezr;\ - qj3 = cr*(1.0-exp(vdj2*ezr))/ezr;\ - qjf = (qj1+qj2-qj3)*vd+cmax*vj4;\ - end else begin\ - qjf = 0.0;\ - end - -// DEPLETION CHARGE CALCULATION SELECTOR: -// Dependent on junction punch-through voltage -// Important for collector related junctions -`define HICJQ(vj,cj0,vd,z,vpt,qjf)\ - if (vpt < `VPT_thresh) begin\ - `QJMOD(vj,cj0,vd,z,vpt,2.4,qjf)\ - end else begin\ - `QJMODF(vj,cj0,vd,z,2.4,qjf)\ - end - -//Temperature dependence of depletion capacitance parameters -`define TMPHICJ(cj0,vd,z,vg,cj0_t,vd_t)\ - arg = 0.5*vd/vt0;\ - vdj0 = 2*vt0*ln(exp(arg)-exp(-arg));\ - vdjt = vdj0*qtt0+vg*(1-qtt0)-mg*VT*ln_qtt0;\ - vd_t = vdjt+2*VT*ln(0.5*(1+sqrt(1+4*exp(-vdjt/VT))));\ - cj0_t = cj0*exp(z*ln(vd/vd_t)); - -//Limiting exponential -`define LIN_EXP(le, arg)\ - if (arg > 80) begin\ - le = (1 + ((arg) - 80));\ - arg = 80;\ - end else begin\ - le=1;\ - end\ - le = le*limexp(arg); - -// conductance not calculated -// INPUT: -// IS, IST : saturation currents (model parameter related) -// UM1 : ideality factor -// U : branch voltage -// IMPLICIT INPUT: -// VT : thermal voltage -// OUTPUT: -// Iz : diode current -`define HICDIO(IS,IST,UM1,U,Iz)\ - DIOY = U/(UM1*VT);\ - if (IS > 0.0) begin\ - if (DIOY > 80) begin\ - le = (1 + ((DIOY) - 80));\ - DIOY = 80;\ - end else begin\ - le = 1;\ - end\ - le = le*limexp(DIOY);\ - Iz = IST*(le-1.0);\ - if (DIOY <= -14.0) begin\ - Iz = -IST;\ - end\ - end else begin\ - Iz = 0.0;\ - end - -`define qpt_mod(qpt_mod,qlow)\ - o3 = 1.0/3;\ - p2_a = -2*qj_2;\ - if (iqf == `INF && iqfh == `INF) begin\ - p2_b = 0;\ - end else begin\ - p2_b = -(qlow);\ - end\ - p2_c = -itfi*itfi/ick*tfh_t/iqfh_t;\ - tmp = p2_a*p2_a;\ - p2_p = p2_b-tmp*o3;\ - p2_q = 2*p2_a*tmp/27-p2_a*p2_b*o3+p2_c;\ - p2_D = p2_q*p2_q*0.25+p2_p*p2_p*p2_p/27;\ - if (abs(p2_D) < 1e-10) begin\ - q_p3 = 3*p2_q/p2_p-p2_a*o3;\ - end else if (p2_D > 0) begin\ - tmp2 = -p2_q*0.5;\ - tmp3 = sqrt(p2_D);\ - tmp = tmp2+tmp3;\ - if (tmp > 0) begin\ - p2_u = exp(o3*ln(tmp));\ - end else begin\ - p2_u = -exp(o3*ln(-tmp));\ - end\ - tmp = tmp2-tmp3;\ - if (tmp > 0) begin\ - p2_v = exp(o3*ln(tmp));\ - end else begin\ - p2_v = -exp(o3*ln(-tmp));\ - end\ - q_p3 = (p2_u+p2_v)-p2_a*o3;\ - end else begin\ - tmp = -p2_q*0.5*sqrt(-27.0/(p2_p*p2_p*p2_p));\ - tmp2 = tmp*tmp;\ - if (tmp >= 0) begin\ - tmp = `M_PI/2-atan(sqrt(tmp2/(1-tmp2)));\ - end else begin\ - tmp = `M_PI/2+atan(sqrt(tmp2/(1-tmp2)));\ - end\ - tmp = sqrt(-4*p2_p*o3)*cos(o3*tmp)-p2_a*o3;\ - q_p3 = tmp;\ - end\ - qpt_mod = q_p3; - -module hic0_full (c,b,e,s,tnode); - - -//Node definitions - - inout c,b,e,s,tnode; - electrical c `P(info="external collector node"); - electrical b `P(info="external base node"); - electrical e `P(info="external emitter node"); - electrical s `P(info="external substrate node"); - electrical ci `P(info="internal collector node"); - electrical bi `P(info="internal base node"); - electrical ei `P(info="internal emitter node"); - electrical tnode `P(info="local temperature rise node"); - - electrical xf1,xf2; - electrical xf; //RC nw - - - //Branch definitions - branch (ci,c) br_cic_i; - branch (ci,c) br_cic_v; - branch (ei,e) br_eie_i; - branch (ei,e) br_eie_v; - branch (bi,ei) br_biei; - branch (bi,ci) br_bici; - branch (ci,ei) br_ciei; - branch (b,bi) br_bbi_i; - branch (b,bi) br_bbi_v; - branch (b,e) br_be; - branch (b,ci) br_bci; - branch (b,s) br_bs; - branch (s,ci) br_sci; - branch (tnode ) br_sht; - - //Phase network for ITF - branch (xf1 ) br_bxf1; - branch (xf1 ) br_cxf1; - branch (xf2 ) br_bxf2; - branch (xf2 ) br_cxf2; - - //Phase network for QF - - branch (xf ) br_bxf; //for RC nw - branch (xf ) br_cxf; //for RC nw - -// -// Parameter initialization with default values - -// Collector current - parameter real is = 1.0e-16 from [0:1] `P(spice:name="is" info="(Modified) saturation current" m:factor="yes" unit="A"); - parameter integer it_mod = 0 from [0:1] `P(spice:name="it_mod" info="Flag for using third order solution for transfer current"); - parameter real mcf = 1.00 from (0:10] `P(spice:name="mcf" info="Non-ideality coefficient of forward collector current"); - parameter real mcr = 1.00 from (0:10] `P(spice:name="mcr" info="Non-ideality coefficient of reverse collector current"); - parameter real vef = `INF from (0:inf) `P(spice:name="vef" info="forward Early voltage (normalization volt.)" unit="V" default:value="infinity"); - parameter real ver = `INF from (0:inf) `P(spice:name="ver" info="reverse Early voltage (normalization volt.)" unit="V" default:value="infinity"); - parameter real aver = 0.0 from [0:100] `P(spice:name="aver" info="bias dependence for reverse Early voltage"); - parameter real iqf = `INF from (0:inf) `P(spice:name="iqf" info="forward d.c. high-injection toll-off current" unit="A" m:factor="yes" default:value="infinity"); - - parameter real fiqf = 0.0 from [0:1] `P(spice:name="fiqf" info="flag for turning on base related critical current" default:value="zero"); - - parameter real iqr = `INF from (0:inf) `P(spice:name="iqr" info="inverse d.c. high-injection roll-off current" unit="A" m:factor="yes" default:value="infinity"); - parameter real iqfh = `INF from (0:inf) `P(spice:name="iqfh" info="high-injection correction current" unit="A" m:factor="yes"); - parameter real tfh = 0.0 from [0:inf) `P(spice:name="tfh" info="high-injection correction factor" test:value="2e-9" m:factor="yes"); - parameter real ahq = 0.0 from [-0.9:inf) `P(spice:name="ahq" info="Smoothing factor for the d.c. injection width"); - - // Base current - parameter real ibes = 1e-18 from [0:1] `P(spice:name="ibes" info="BE saturation current" unit="A" m:factor="yes"); - parameter real mbe = 1.0 from (0:10] `P(spice:name="mbe" info="BE non-ideality factor"); - parameter real ires = 0.0 from [0:1] `P(spice:name="ires" info="BE recombination saturation current" test:value="1e-16" unit="A" m:factor="yes"); - parameter real mre = 2.0 from (0:10] `P(spice:name="mre" info="BE recombination non-ideality factor"); - parameter real ibcs = 0.0 from [0:1] `P(spice:name="ibcs" info="BC saturation current" test:value="1e-16" unit="A" m:factor="yes"); - parameter real mbc = 1.0 from (0:10] `P(spice:name="mbc" info="BC non-ideality factor"); - - // BE depletion cap - parameter real cje0 = 1.0e-20 from (0:inf) `P(spice:name="cje0" info="Zero-bias BE depletion capacitance" unit="F" test:value="2e-14" m:factor="yes"); - parameter real vde = 0.9 from (0:10] `P(spice:name="vde" info="BE built-in voltage" unit="V"); - parameter real ze = 0.5 from (0:1) `P(spice:name="ze" info="BE exponent factor"); - parameter real aje = 2.5 from [1:inf) `P(spice:name="aje" info="Ratio of maximum to zero-bias value"); - parameter real vdedc = 0.9 from (0:10] `P(spice:name="vdedc" info="BE charge built-in voltage for d.c. transfer current" unit="V"); - parameter real zedc = 0.5 from (0:2) `P(spice:name="zedc" info="charge BE exponent factor for d.c. transfer current"); - parameter real ajedc = 2.5 from [1:inf) `P(spice:name="ajedc" info="BE capacitance ratio Ratio maximum to zero-bias value for d.c. transfer current"); - - // Transit time - parameter real t0 = 0.0 from [0:inf) `P(spice:name="t0" info="low current transit time at Vbici=0" test:value="5e-12" unit="s"); - parameter real dt0h = 0.0; // from [0:inf) `P(spice:name="dt0h" info="Base width modulation contribution" test:value="2e-12" unit="s"); - parameter real tbvl = 0.0 from [0:inf) `P(spice:name="tbvl" info="SCR width modulation contribution" test:value="4e-12" unit="s"); - parameter real tef0 = 0.0 from [0:inf) `P(spice:name="tef0" info="Storage time in neutral emitter" test:value="1e-12" unit="s"); - parameter real gte = 1.0 from (0:20] `P(spice:name="gte" info="Exponent factor for emmiter transit time"); - parameter real thcs = 0.0 from [0:inf) `P(spice:name="thcs" info="Saturation time at high current densities" test:value="3e-11" unit="s"); - parameter real ahc = 0.1 from (0:10] `P(spice:name="ahc" info="Smoothing facor for current dependence"); - parameter real tr = 0.0 from [0:inf) `P(spice:name="tr" info="Storage time at inverse operation" unit="s"); - - // Critical current - parameter real rci0 = 150 from (0:inf) `P(spice:name="rci0" info="Low-field collector resistance under emitter" test:value="50" unit="Ohm" m:inverse_factor="yes"); - parameter real vlim = 0.5 from (0:10] `P(spice:name="vlim" info="Voltage dividing ohmic and satur.region" unit="V"); - parameter real vpt = 100 from (0:100] `P(spice:name="vpt" info="Punch-through voltage" test:value="10" unit="V" default="infinity"); - parameter real vces = 0.1 from [0:1] `P(spice:name="vces" info="Saturation voltage" unit="V"); - - // BC depletion cap intern - parameter real cjci0 = 1.0e-20 from (0:inf) `P(spice:name="cjci0" info="Total zero-bias BC depletion capacitance" test:value="1e-15" unit="F" m:factor="yes"); - parameter real vdci = 0.7 from (0:10] `P(spice:name="vdci" info="BC built-in voltage" test:value="0.7" unit="V"); - parameter real zci = 0.333 from (0:1] `P(spice:name="zci" info="BC exponent factor" test:value="0.4"); - parameter real vptci = 100 from (0:100] `P(spice:name="vptci" info="Punch-through voltage of BC junction" test:value="50" unit="V"); - - // BC depletion cap extern - parameter real cjcx0 = 1.0e-20 from [0:inf) `P(spice:name="cjcx0" info="Zero-bias external BC depletion capacitance" unit="F" test:value="1e-15" m:factor="yes"); - parameter real vdcx = 0.7 from (0:10] `P(spice:name="vdcx" info="External BC built-in voltage" unit="V"); - parameter real zcx = 0.333 from (0:1] `P(spice:name="zcx" info="External BC exponent factor"); - parameter real vptcx = 100 from (0:100] `P(spice:name="vptcx" info="Punch-through voltage" unit="V" test:value="5.0" default="infinity"); - parameter real fbc = 1.0 from [0:1] `P(spice:name="fbc" info="Split factor = Cjci0/Cjc0" test:value="0.5"); - - // Base resistance - parameter real rbi0 = 0.0 from [0:inf) `P(spice:name="rbi0" info="Internal base resistance at zero-bias" test:value="100" unit="Ohm" m:inverse_factor="yes"); - parameter real vr0e = 2.5 from (0:inf) `P(spice:name="vr0e" info="forward Early voltage (normalization volt.)" unit="V"); - parameter real vr0c = `INF from (0:inf) `P(spice:name="vr0c" info="forward Early voltage (normalization volt.)" unit="V" default="infinity" test:value="25.0"); - parameter real fgeo = 0.656 from [0:inf) `P(spice:name="fgeo" info="Geometry factor" test:value="0.73"); - - // Series resistances - parameter real rbx = 0.0 from [0:inf) `P(spice:name="rbx" info="External base series resistance" test:value="8.8" unit="Ohm" m:inverse_factor="yes"); - parameter real rcx = 0.0 from [0:inf) `P(spice:name="rcx" info="Emitter series resistance" test:value="12.5" unit="Ohm" m:inverse_factor="yes"); - parameter real re = 0.0 from [0:inf) `P(spice:name="re" info="External collector series resistance" test:value="9.16" unit="Ohm" m:inverse_factor="yes"); - - // Substrate transfer current, diode current and cap - parameter real itss = 0.0 from [0:1.0] `P(spice:name="itss" info="Substrate transistor transfer saturation current" unit="A" test:value="1e-17" m:factor="yes"); - parameter real msf = 1.0 from (0:10] `P(spice:name="msf" info="Substrate transistor transfer current non-ideality factor"); - parameter real iscs = 0.0 from [0:1.0] `P(spice:name="iscs" info="SC saturation current" unit="A" test:value="1e-17" m:factor="yes"); - parameter real msc = 1.0 from (0:10] `P(spice:name="msc" info="SC non-ideality factor"); - parameter real cjs0 = 1.0e-20 from [0:inf) `P(spice:name="cjs0" info="Zero-bias SC depletion capacitance" unit="F" test:value="1e-15" m:factor="yes"); - parameter real vds = 0.3 from (0:10] `P(spice:name="vds" info="SC built-in voltage" unit="V"); - parameter real zs = 0.3 from (0:1] `P(spice:name="zs" info="External SC exponent factor"); - parameter real vpts = 100 from (0:100] `P(spice:name="vpts" info="SC punch-through voltage" unit="V" test:value="5.0" default="infinity"); - - // Parasitic caps - parameter real cbcpar = 0.0 from [0:inf) `P(spice:name="cbcpar" info="Collector-base isolation (overlap) capacitance" unit="F" m:factor="yes" test:value="1e-15"); - parameter real cbepar = 0.0 from [0:inf) `P(spice:name="cbepar" info="Emitter-base oxide capacitance" unit="F" m:factor="yes" test:value="2e-15"); - - // BC avalanche current - parameter real eavl = 0.0 from [0:inf) `P(spice:name="eavl" info="Exponent factor" test:value="1e-14"); - parameter real kavl = 0.0 from [0:inf) `P(spice:name="kavl" info="Prefactor" test:value="1.19"); - - // Flicker noise - parameter real kf = 0.0 from [0:inf) `P(spice:name="kf" info="flicker noise coefficient" unit="M^(1-AF)"); - parameter real af = 2.0 from (0:10] `P(spice:name="af" info="flicker noise exponent factor"); - - //Non-quasi-static Effect - parameter real alqf = 0.167 from (0:1] `P(spice:name="alqf" info="Factor for additional delay time of minority charge"); - parameter real alit = 0.333 from (0:1] `P(spice:name="alit" info="Factor for additional delay time of transfer current"); - parameter integer flnqs = 0 from [0:1] `P(spice:name="flnqs" info="Flag for turning on and off of vertical NQS effect"); - - - // Temperature dependance - parameter real vgb = 1.2 from (0:10] `P(spice:name="vgb" info="Bandgap-voltage" unit="V" test:value="1.17"); - parameter real vge = 1.17 from (0:10] `P(spice:name="vge" info="Effective emitter bandgap-voltage" unit="V" test:value="1.07"); - parameter real vgc = 1.17 from (0:10] `P(spice:name="vgc" info="Effective collector bandgap-voltage" unit="V" test:value="1.14"); - parameter real vgs = 1.17 from (0:10] `P(spice:name="vgs" info="Effective substrate bandgap-voltage" unit="V" test:value="1.17"); - parameter real f1vg =-1.02377e-4 `P(spice:name="f1vg" info="Coefficient K1 in T-dependent bandgap equation" unit="V/K"); - parameter real f2vg = 4.3215e-4 `P(spice:name="f2vg" info="Coefficient K2 in T-dependent bandgap equation" unit="V/K"); - parameter real alt0 = 0.0 `P(spice:name="alt0" info="Frist-order TC of tf0" unit="1/K"); - parameter real kt0 = 0.0 `P(spice:name="kt0" info="Second-order TC of tf0" unit="1/K^2"); - parameter real zetact = 3.0 `P(spice:name="zetact" info="Exponent coefficient in transfer current temperature dependence" test:value="3.5"); - parameter real zetabet = 3.5 `P(spice:name="zetabet" info="Exponent coefficient in BE junction current temperature dependence" test:value="4.0"); - parameter real zetaci = 0.0 `P(spice:name="zetaci" info="TC of epi-collector diffusivity" test:value="1.6"); - parameter real alvs = 0.0 `P(spice:name="alvs" info="Relative TC of satur.drift velocity" unit="1/K" test:value="1e-3"); - parameter real alces = 0.0 `P(spice:name="alces" info="Relative TC of vces" unit="1/K" test:value="4e-4"); - parameter real zetarbi = 0.0 `P(spice:name="zetarbi" info="TC of internal base resistance" test:value="0.6"); - parameter real zetarbx = 0.0 `P(spice:name="zetarbx" info="TC of external base resistance" test:value="0.2"); - parameter real zetarcx = 0.0 `P(spice:name="zetarcx" info="TC of external collector resistance" test:value="0.2"); - parameter real zetare = 0.0 `P(spice:name="zetare" info="TC of emitter resistances"); - parameter real zetaiqf = 0.0 `P(spice:name="zetaiqf" info="TC of iqf"); - parameter real alkav = 0.0 `P(spice:name="alkav" info="TC of avalanche prefactor" unit="1/K"); - parameter real aleav = 0.0 `P(spice:name="aleav" info="TC of avalanche exponential factor" unit="1/K"); - - parameter real zetarth = 0.0 `P(spice:name="zetarth" info="Exponent factor for temperature dependent thermal resistance" test:value="0.0"); - - parameter integer tef_temp = 1 `P(spice:name="tef_temp" info="Flag for turning temperature dependence of tef0 on and off"); - parameter real zetaver = -1.0 `P(spice:name="zetaver" info="TC of Reverse Early voltage"); - parameter real zetavgbe = 1.0 `P(spice:name="zetavgbe" info="TC of AVER"); - parameter real dvgbe = 0.0 `P(spice:name="dvgbe" info="Bandgap difference between base and BE-junction"); - parameter real aliqfh = 0.0 `P(spice:name="aliqfh" info="Frist-order TC of iqfh" unit="1/K"); - parameter real kiqfh = 0.0 `P(spice:name="kiqfh" info="Second-order TC of iqfh" unit="1/K^2"); - - // Self-heating - parameter integer flsh = 0 from [0:2] `P(spice:name="flsh" info="Flag for self-heating calculation" test:value="2"); - parameter real rth = 0.0 from [0:inf) `P(spice:name="rth" info="Thermal resistance" test:value="200.0" unit="K/W" m:inverse_factor="yes"); - parameter real cth = 0.0 from [0:inf) `P(spice:name="cth" info="Thermal capacitance" test:value="0.1" unit="Ws/K" m:factor="yes"); - - // Transistor type - - parameter integer npn = 1 from [0:1] `P(spice:isflag="yes" info="model type flag for npn" ); - parameter integer pnp = 1 from [0:1] `P(info="model type flag for pnp" ); - parameter integer type=(npn==0 ? (pnp==0 ? 0 : 1) : (pnp==0 ? -1 : 0)); - - //Circuit simulator specific parameters - parameter real tnom = 27.0 `P(spice:name="tnom" info="Temperature for which parameters are valid" unit="C"); - parameter real dtemp = 0.0 `P(spice:name="dtemp" type="instance" info="Temperature change for particular transistor" unit="K"); - -// Declaration of the variables: begin - - integer HICUMtype; - - // QCJMOD - real zr,vp; - real cmax,cr,ve; - real ee1,ez,ezr,vdj1,vdj2,ex1,vr,vj1,vj2,vj4; - real qj1,qj2,qj3; - - //cjtfun *** tnom,VT,mg,vt0, removed: BA - real vdj0,vdjt; - - // temperature and drift - real VT,Tamb,Tdev,TnomK,dT,qtt0,ln_qtt0; - real vde_t,vdci_t,vdcx_t,vds_t,vdedc_t; - real is_t,ires_t,ibes_t,ibcs_t,iqf_t; - real itss_t,iscs_t,cje0_t,cjci0_t,cjcx0_t, cje0_dc_t, cje0_dc; - real cjs0_t,rci0_t,vlim_t; - real vces_t,thcs_t,tef0_t,rbi0_t; - real rbx_t,rcx_t,re_t,t0_t,eavl_t,kavl_t; - real aje_t,ajedc_t; - - // bc charge and cap - real qjci `P(ask="yes" info="B-C internal junction charge" unit="C"); - real qjcx,qjcii,cjcii,qjcxi,qjci_int; //cjcx - real cjci0_t_ii,cjcx0_t_ii,cjcx0_t_i,v_j; - - // be junction - real qjei `P(ask="yes" info="B-E internal junction charge" unit="C"); - real vf,x,y; - - // transfer and internal base current - real cc,qj_2,qj; - real tf0,ickf,ickr,itfi,itri,qm, qml, qmh; - real qpt,itf,itr, qpt_l, qpt_h, denom_iqf; - real b_q; - - real it `P(ask="yes" info="Transfer Current" unit="A"); - real it_wop; - real ibe,ire,ibi; - - - // be diffusion charge - real qf,qf0,dqfh,dqef; - real dtef,dtfh,tf,ick; - real vc,vceff,s3,w,wdc,a,tww, aa, a1, a2; - - // bc diffusion charge - real qr; - - // avalanche current source - real v_bord,a_iavl,lncc; - - // base resistance - real rb,eta,rbi,qje,Qz_nom,fQz; - - // substrate transistor, diode and cap - real qjs,HSa,HSb,HSI_Tsu,HSUM; - - // self heating - real pterm; - real rth_t; - - // new for temperature dependence - real mg,zetabci,zetasct,zetatef,avs; - real vgbe,vgbc,vgsc,dvg; - real xvf,xvf2,dvj,uvc,vt0; - - // noise - real flicker_Pwr,fourkt,twoq; - - // LIN_EXP - real le,arg,le1,arg1,le2,arg2; - - //HICDIO - real DIOY; - - // branch voltages - real Vbci,Vbici,Vbiei,Vciei,Vsci,Veie,Vbbi,Vcic,Vbe,Vrth; - - //Output to be seen - real ijbc `P(ask="yes" info="Base-collector diode current" unit="A"); - real iavl `P(ask="yes" info="Avalanche current" unit="A"); - real ijsc `P(ask="yes" info="Substrate-collector diode current" unit="A"); - real Ibici `P(ask="yes" info="Base-collector diode current minus the avalanche current" unit="A"); - real ijbe `P(ask="yes" info="Base-emitter diode current" unit="A"); - - real Qbci,Qbe,Qbici,Qbiei; - real aver_t,vjh,vj_z,h_vbe,ver_t,iqfh_t,tfh_t,ahq_t; - real p2_a,p2_b,p2_c,p2_p,p2_q,p2_D,p2_u,p2_v,q_p3; - real tmp,tmp2,tmp3,o3,diff_q; - - //NQS - real Ixf1,Ixf2,Qxf1,Qxf2,Vxf1,Vxf2,Itxf,Qdeix; - real Vxf, Ixf, Qxf,fact; - - real gmin; - -// For .OP pt calculation -`ifdef CALC_OP - (* desc="Base terminal current", units="A" multiplicity="multiply" *) real IB; - (* desc="Collector terminal current", units="A" multiplicity="multiply" *) real IC; - (* desc="Substrate current", units="A" multiplicity="multiply" *) real ISUB; - (* desc="Avalanche current", units="A" multiplicity="multiply" *) real IAVL; - (* desc="External BE voltage", units="V" multiplicity="divide" *) real VBE; - (* desc="External BC voltage", units="V" multiplicity="divide" *) real VBC; - (* desc="External CE voltage", units="V" multiplicity="divide" *) real VCE; - (* desc="External SC voltage", units="V" multiplicity="divide" *) real VSC; - (* desc="Common emitter forward current gain" multiplicity="none" *) real BETADC; - (* desc="Internal transconductance", units="S" multiplicity="multiply" *) real GMi; - (* desc="Internal input resistance", units="Ohm" multiplicity="divide" *) real RPIi; - (* desc="Internal feedback resistance", units="Ohm" multiplicity="divide" *) real RMUi; - (* desc="Internal Output resistance", units="Ohm" multiplicity="divide" *) real ROi; - (* desc="Total BE capacitance", units="F" multiplicity="multiply" *) real CPIi; - (* desc="Total internal BC capacitance", units="F" multiplicity="multiply" *) real CMUi; - (* desc="Total external BC capacitance", units="F" multiplicity="multiply" *) real CBCX; - (* desc="CS junction capacitance", units="F" multiplicity="multiply" *) real CCS; - (* desc="Internal base resistance", units="Ohm" multiplicity="divide" *) real RBi; - (* desc="Total base resistance", units="Ohm" multiplicity="divide" *) real RB; - (* desc="External (saturated) collector series resistance", units="Ohm" multiplicity="divide" *) real RCXop; - (* desc="Emitter series resistance", units="Ohm" multiplicity="divide" *) real REop; - (* desc="Small signal current gain" multiplicity="none" *) real BETAAC; - (* desc="Total forward transit time", units="s" multiplicity="none" *) real TF; - (* desc="Transit frequency", units="Hz" multiplicity="none" *) real FT; -`endif - - -//Declaration of the variables: end - - -// -//======================== calculation of the transistor =================== -// - - analog begin - - gmin = `GMIN; - - `INITIAL_MODEL // Model Initialization - begin - - if (`PGIVEN(npn)) begin - HICUMtype = `NPN; - end else if (`PGIVEN(pnp)) begin - HICUMtype = `PNP; - end else begin - HICUMtype = (`PGIVEN(type)) ? type : `NPN; - end - - end - -// assign voltages with regard to transistor type - - Vbci = HICUMtype*V(br_bci); - Vbici = HICUMtype*V(br_bici); - Vbiei = HICUMtype*V(br_biei); - Vciei = HICUMtype*V(br_ciei); - Vsci = HICUMtype*V(br_sci); - Veie = V(br_eie_v); - Vcic = V(br_cic_v); - Vbbi = V(br_bbi_v); - Vbe = HICUMtype*V(br_be); - Vrth = V(br_sht); - -// -// temperature and resulting parameter drift -// - - TnomK = tnom+273.15; - Tamb = $temperature; - Tdev = Tamb+dtemp+Vrth; - -// Limit temperature to avoid FPE's in equations - if (Tdev < `TMIN + 273.15) begin - Tdev = `TMIN + 273.15; - end else begin - if (Tdev > `TMAX + 273.15) begin - Tdev = `TMAX + 273.15; - end - end - - vt0 = `P_K*TnomK /`P_Q; - VT = `P_K*Tdev /`P_Q; - dT = Tdev-TnomK; - qtt0 = Tdev/TnomK; - ln_qtt0 = ln(qtt0); - avs = alvs*TnomK; - vgbe = (vgb+vge)/2; - vgbc = (vgb+vgc)/2; - vgsc = (vgs+vgc)/2; - mg = 3-`P_Q*f1vg/`P_K; - zetabci = mg+1-zetaci; - zetasct = mg-1.5; //+1-m_upS with m_upS=2.5 - is_t = is*exp(zetact*ln_qtt0+vgb/VT*(qtt0-1)); - ibes_t = ibes*exp(zetabet*ln_qtt0+vge/VT*(qtt0-1)); - ires_t = ires*exp(0.5*mg*ln_qtt0+0.5*vgbe/VT*(qtt0-1)); - ibcs_t = ibcs*exp(zetabci*ln_qtt0+vgc/VT*(qtt0-1)); - itss_t = itss*exp(zetasct*ln_qtt0+vgc/VT*(qtt0-1)); - iscs_t = iscs*exp(zetasct*ln_qtt0+vgs/VT*(qtt0-1)); - - `TMPHICJ(cje0,vde,ze,vgbe,cje0_t,vde_t) - - // `TMPHICJ(cje0,vde,zedc,vgbe,cje0_t,vdedc_t) - - cje0_dc = cje0; - - `TMPHICJ(cje0_dc,vdedc,zedc,vgbe,cje0_dc_t,vdedc_t) //introducing DC capacitance - - - aje_t = aje*vde_t/vde; - - ajedc_t = ajedc*vdedc_t/vdedc; - - `TMPHICJ(cjci0,vdci,zci,vgbc,cjci0_t,vdci_t) - `TMPHICJ(cjcx0,vdcx,zcx,vgbc,cjcx0_t,vdcx_t) - `TMPHICJ(cjs0,vds,zs,vgsc,cjs0_t,vds_t) - iqf_t = iqf*exp(zetaiqf*ln_qtt0-dvgbe/VT*(qtt0-1)); - rci0_t = rci0*exp(zetaci*ln_qtt0); - vlim_t = vlim*exp((zetaci-avs)*ln_qtt0); - vces_t = vces*(1+alces*dT); - t0_t = t0*(1+alt0*dT+kt0*dT*dT); - thcs_t = thcs*exp((zetaci-1)*ln_qtt0); - zetatef = zetabet-zetact-0.5; - dvg = vgb-vge; - if (tef_temp == 1) begin - tef0_t = tef0*exp(zetatef*ln_qtt0-dvg/VT*(qtt0-1)); - end else begin - tef0_t = tef0; - end - rbx_t = rbx*exp(zetarbx*ln_qtt0); - rcx_t = rcx*exp(zetarcx*ln_qtt0); - rbi0_t = rbi0*exp(zetarbi*ln_qtt0); - re_t = re*exp(zetare*ln_qtt0); - eavl_t = eavl*exp(aleav*dT); - kavl_t = kavl*exp(alkav*dT); - - - //Temperature dependence of Thermal resistance - if (zetarth!=0) begin - rth_t = rth*exp(zetarth*ln(Tdev/TnomK)); - end else begin - rth_t=rth; - end - - aver_t = aver*exp(zetaver*ln_qtt0); - ver_t = ver/exp(dvgbe/VT*(exp(zetavgbe*ln_qtt0)-1)); - iqfh_t = iqfh*(1+aliqfh*dT+kiqfh*dT*dT); - tfh_t = tfh*(1+aliqfh*dT+kiqfh*dT*dT)*exp((vgb-vge)/VT*(qtt0-1)); - ahq_t = ahq; - -// -// Calculation of intrinsic transistor elements -// - -// BC charge and cap (internal and external) - -// The cjcx0 value is used to switch between one (cjcx0=0) and two bc parameter sets -// 1. For one parameter set only the internal bc set is partitioned by fbc -// 2. For two independent sets only the external set is partitioned by fbc - - if (cjcx0_t > 0.0) begin - cjci0_t_ii = cjci0_t; // zero bias internal portion - cjcx0_t_ii = cjcx0_t*fbc; - `HICJQ(Vbici,cjcx0_t_ii,vdcx_t,zcx,vptcx,qjcxi) - cjcx0_t_i = cjcx0_t*(1-fbc); // zero bias external portion - `HICJQ(Vbci,cjcx0_t_i,vdcx_t,zcx,vptcx,qjcx) - end else begin - cjci0_t_ii = cjci0_t*fbc; // zero bias internal portion - qjcxi = 0; - cjcx0_t_i = cjci0_t*(1-fbc); // zero bias external portion - `HICJQ(Vbci,cjcx0_t_i,vdci_t,zci,vptci,qjcx) - end - `HICJQ(Vbici,cjci0_t_ii,vdci_t,zci,vptci,qjci) - qjci_int = qjci; // int BC charge without normalization - qjcii = qjci+qjcxi; - -//Internal bc cap without punch through for cc - - //`HICJQ(Vbici,cjci0_t_ii,vdci_t,zci,100,qjciii) - `QCMODF(Vbici,cjci0_t_ii,vdci_t,zci,2.4,cjcii) - //cjcii = ddx(qjciii,V(bi)); - -//Internal be cap and charge - -// `QJMODF(Vbiei,cje0_dc_t,vde_t,ze,aje_t,qjei) -// cjei = ddx(qjei,V(bi)); - -// Critical current: ick - vc = Vciei-vces_t; - uvc = vc/VT-1; - vceff = VT*(1+0.5*(uvc+sqrt(uvc*uvc+1.921812))); - x = (vceff-vlim_t)/vpt; - ick = vceff*(1+0.5*(x+sqrt(x*x+1e-3)))/rci0_t/sqrt(1+vceff*vceff/vlim_t/vlim_t); - - -// Normalized BC cap and charge - - if (cjcii > 0.0 && cjci0_t_ii > 0.0) begin - - cc = cjci0_t_ii/cjcii; - qjci = qjci/cjci0_t_ii; - - end else begin - - cc = 1.0; - qjci = 0; - - end - - //cc = cjci0_t_ii/cjcii; - //qjci = qjci/cjci0_t_ii; - - `QJMODF(Vbiei,cje0_dc_t,vdedc_t,zedc,ajedc_t,qjei) - - if (aver == 0.0) begin - h_vbe = 1; - end else begin - vjh = (vdedc_t-Vbiei)/(2.0*VT); - vjh = vdedc_t-2.0*VT*(vjh+sqrt(vjh*vjh+1.921812))*0.5; - vjh = (vjh-VT)/VT; - vjh = VT*(1.0+(vjh+sqrt(vjh*vjh+1.921812))*0.5); - vj_z = (1.0-exp(zedc*ln(1.0-vjh/vdedc_t)))*aver_t; - h_vbe = (exp(vj_z)-1.0)/vj_z; - end - - qje = h_vbe*qjei/cje0_dc_t; - qj = (1+qjci/vef+qje/ver_t); - - b_q = 20*qj-1; - qj_2=0.025*(1+(b_q +sqrt(b_q*b_q+1.921812))/2); - -// Minority charge transit time - tf0 = t0_t+dt0h*(cc-1)+tbvl*(1/cc-1); - - //Determination of base realted critical current - - if (fiqf==1)begin - denom_iqf = fiqf*((tf0/t0_t)-1); - ickf = iqf_t/(1+denom_iqf); - end else begin - ickf = iqf_t; - end - - ickr = iqr; - -// Ideal transfer currents - arg1 = Vbiei/(mcf*VT); - `LIN_EXP(le1,arg1) - itfi=is_t*le1; - - arg2 = Vbici/(mcr*VT); - `LIN_EXP(le2,arg2) - itri=is_t*le2; -// Normalized minority charge at low currents (w=0) and high currents (w=1) - - if (tfh!=0)begin - qml = itfi/ickf+itri/ickr+exp((0.6666)*ln(itfi*(itfi/ick)*((tfh_t)/iqfh_t))); - qmh = itfi/ickf+itri/ickr+itfi/iqfh_t+exp((0.6666)*ln(itfi*(itfi/ick)*((tfh_t)/iqfh_t))); - end else begin - qml = itfi/ickf+itri/ickr; - qmh = itfi/ickf+itri/ickr+itfi/iqfh_t; - end - qpt_l= qj_2+sqrt((qj_2)*(qj_2)+qml); - qpt_h= qj_2+sqrt((qj_2)*(qj_2)+qmh); - -// Calculation of the injection width - diff_q = qmh-qml; - if (abs(diff_q)>1e-8) begin - a1= 1-ick/(1+ahq_t)/itfi*qpt_l; - a2= 1+ick/(1+ahq_t)/itfi*(qpt_h-qpt_l); - aa= a1/a2; - - wdc= (sqrt(aa*aa+0.01)+aa)/(1+sqrt(1+0.01)); - end else begin - wdc = 0; - end - -// Normalized minority charge - - if (it_mod == 0) begin - if (tfh!=0) begin - qm = itfi/ickf+itri/ickr+itfi/iqfh_t*wdc*wdc+exp((0.6666)*ln(itfi*(itfi/ick)*((tfh_t)/iqfh_t))); - end else begin - qm = itfi/ickf+itri/ickr+itfi/iqfh_t*wdc*wdc; - end - // Normalized total hole charge - qpt = qj_2+sqrt((qj_2)*(qj_2)+qm); - end else begin - `qpt_mod(qpt,itfi/ickf+itri/ickr+itfi/iqfh_t*wdc*wdc) - end - if (qpt<=1e-20) begin - qpt=1e-20; - end - - itf = itfi/qpt; - itr = itri/qpt; - - // Transfer current - - if (itf<=1e-20) begin - itf = 1e-20; - end - it = itf-itr; - -// BE diffusion charge - -// Calculation of low-current portion - qf0 = tf0*itf; - -// Current dependent component - a = 1-ick/itf; - s3 = sqrt(a*a+ahc); - w = (a+s3)/(1+sqrt(1+ahc)); - tww = thcs_t*w*w; - dqfh = tww*itf; - dtfh = tww*(1+2*ick/itf/s3); - -// Emitter component - dtef = tef0_t*exp(gte*ln(itf/ick)); - dqef = dtef*itf/(gte+1.0); - -// Total minority charge and transit time - qf = qf0+dqef+dqfh; - tf = tf0+dtfh+dtef; - -// BC diffusion charge - qr = tr*itr; - -// Internal base current - -// BE diode - `HICDIO(ibes,ibes_t,mbe,Vbiei,ibe) - `HICDIO(ires,ires_t,mre,Vbiei,ire) - ijbe = ibe+ire; - -// BC diode - `HICDIO(ibcs,ibcs_t,mbc,Vbici,ijbc) - -// Total base current - ibi = ijbe+ijbc; - -// Avalanche current - - if (Vbici < 0) begin : HICAVL - v_bord = eavl_t*vdci_t; - if (vdci_t-Vbici>v_bord) begin - a_iavl = kavl_t/vdci_t*exp(-cc); - iavl = itf*a_iavl*(v_bord+(1+cc)*(vdci_t-Vbici-v_bord)); - end else begin - lncc = ln(1/cc); - iavl = kavl_t*itf*exp(-1/zci*lncc-eavl_t*exp((1/zci-1)*lncc)); - end - end else begin - iavl = 0; - end - -// -// Additional elements for external transistor -// - `QJMODF(Vbiei,cje0_t,vde_t,ze,aje_t,qjei) // Computation of AC charge for base resistance calculation - qje = qjei/cje0_t; - -// Base resistance - if (rbi0_t > 0.0) begin : HICRBI - // Conductivity modulation with hyperbolic smoothing - - Qz_nom = 1+qje/vr0e+qjci/vr0c+itf/ickf+itr/ickr; - fQz = 0.5*(Qz_nom+sqrt(Qz_nom*Qz_nom+0.01)); - rbi = rbi0_t/fQz; - - //rbi= rbi0_t*(1+0.2)/(0.2+qpt); - // Emitter current crowding - if (ibi > 0.0) begin - eta = fgeo*rbi*ibi/VT; - if (eta < 1e-6) begin - rbi = rbi*(1-0.5*eta); - end else begin - rbi = rbi*ln(eta+1)/eta; - end - end - end else begin - rbi = 0.0; - end - // Total base resistance - //rbi= rbi0_t; - rb = rbi+rbx_t; - -// Parasitic substrate transistor transfer current - if (itss > 0.0) begin : Sub_Transfer - HSUM = msf*VT; - HSa = limexp(Vbci/HSUM); - HSb = limexp(Vsci/HSUM); - HSI_Tsu = itss_t*(HSa-HSb); - end else begin - HSI_Tsu = 0.0; - end - -// Substrate diode and cap and charge - - `HICDIO(iscs,iscs_t,msc,Vsci,ijsc) - - `HICJQ(Vsci,cjs0_t,vds_t,zs,vpts,qjs) - -// Self heating - - pterm = 0; - - if (flsh == 1 && rth >= `MIN_R) begin - pterm = it*Vciei+iavl*(vdci_t-Vbici); - end else if (flsh == 2 && rth >= `MIN_R) begin - pterm = Vciei*it + (vdci_t-Vbici)*iavl + ijbe*Vbiei + ijbc*Vbici + ijsc*Vsci; - if (rb >= `MIN_R) begin - pterm = pterm + Vbbi*Vbbi/rb; - end - if (re >= `MIN_R) begin - pterm = pterm + Veie*Veie/re_t; - end - if (rcx >= `MIN_R) begin - pterm = pterm + Vcic*Vcic/rcx_t; - end - end - - Itxf = itf; - Qdeix = qf; - // Excess Phase calculation - - if (flnqs != 0 && tf != 0) begin - Vxf1 = V(br_bxf1); - Vxf2 = V(br_bxf2); - - Ixf1 = (Vxf2-itf)/tf*t0; - Ixf2 = (Vxf2-Vxf1)/tf*t0; - Qxf1 = alit*Vxf1*t0; - Qxf2 = alit*Vxf2/3*t0; - Itxf = Vxf2; - - Vxf = V(br_bxf); - fact = t0/tf; - Ixf = (Vxf - qf)*fact; - Qxf = alqf*Vxf*t0; - Qdeix = Vxf; - end else begin - Ixf1 = V(br_bxf1); - Ixf2 = V(br_bxf2); - Qxf1 = 0; - Qxf2 = 0; - - Ixf = V(br_bxf); - Qxf = 0; - end - - -// -// Compute branch sources -// - - Ibici = ijbc - iavl; - - Qbci = cbcpar*Vbci; - Qbe = cbepar*Vbe; - Qbici = qjcii+qr; - //Qbiei = qjei+qf; - Qbiei = qjei+Qdeix; - - ijsc = HICUMtype*ijsc; - qjs = HICUMtype*qjs; - qjcx = HICUMtype*qjcx; - Qbci = HICUMtype*Qbci; - Qbe = HICUMtype*Qbe; - - Ibici = HICUMtype*Ibici; - Qbici = HICUMtype*Qbici; - ijbe = HICUMtype*ijbe; - Qbiei = HICUMtype*Qbiei; - it_wop = HICUMtype*it; // 'it' without excess phase - it = HICUMtype*(Itxf-itr); // 'it' with excess phase - iavl = HICUMtype*iavl; -// -// Define branch sources -// - I(br_biei) <+ gmin*V(br_biei); - I(br_bici) <+ gmin*V(br_bici); - I(br_ciei) <+ gmin*V(br_ciei); - - I(br_bs) <+ HICUMtype*HSI_Tsu; - I(br_sci) <+ ijsc + gmin*V(br_sci);//`P(spectre:gmin="add" spectre:pwl_passive="1e10"); - I(br_sci) <+ ddt(qjs); - I(br_bci) <+ ddt(qjcx); - I(br_bci) <+ ddt(Qbci); - I(br_be) <+ ddt(Qbe); - if (re >= `MIN_R) begin - I(br_eie_i) <+ Veie/re_t; //`P(spectre:gmin="add"); - end else begin - I(br_eie_i) <+ Veie/`MIN_R; //`P(spectre:gmin="add"); - end - if (rcx >= `MIN_R) begin - I(br_cic_i) <+ Vcic/rcx_t; //`P(spectre:gmin="add"); - end else begin - I(br_cic_i) <+ Vcic/`MIN_R; //`P(spectre:gmin="add"); - end - if (rbi0 >= `MIN_R || rbx >= `MIN_R) begin - I(br_bbi_i) <+ Vbbi/rb + gmin*Vbbi; //`P(spectre:gmin="add"); - end else begin - I(br_bbi_i) <+ Vbbi/`MIN_R; //`P(spectre:gmin="add"); - end - I(br_bici) <+ Ibici; //`P(spectre:gmin="add" spectre:pwl_sat_current="IMAX" spectre:pwl_sat_cond="imax/0.025" spectre:pwl_rev_current="imax" spectre:pwl_rev_cond="IMAX/0.025"); - I(br_bici) <+ ddt(Qbici); - I(br_biei) <+ ijbe; //`P(spectre:gmin="add" spectre:pwl_fwd_current="IBEIS*exp(25.0)" spectre:pwl_fwd_node="bi" spectre:pwl_fwd_cond="IBEIS*exp(25.0)/0.025" spectre:pwl_sat_current="IMAX" spectre:pwl_sat_cond="IMAX/0.025" spectre:pwl_passive="1e10"); - I(br_biei) <+ ddt(Qbiei); - I(br_ciei) <+ it; //`P(spectre:pwl_fwd_current="IS*exp(25.0)" spectre:pwl_fwd_node="bi" spectre:pwl_fwd_cond="IS*exp(25.0)/0.025" spectre:pwl_rev_current="IMAX" spectre:pwl_rev_cond="IMAX/0.025" spectre:pwl_passive="1e10"); - //I(br_ciei) <+ Itxf; - - // Following code is an intermediate solution: - // ****************************************** - if (flsh == 0 || rth < `MIN_R) begin - I(br_sht) <+ Vrth/`MIN_R; - end else begin - I(br_sht) <+ Vrth/rth_t-pterm; //`P(spectre:gmin="add"); - I(br_sht) <+ ddt(cth*Vrth); - end - // ****************************************** - // For simulators having no problem with V(br_sht) <+ 0.0 - // with external thermal node, follwing code may be used. - // This external thermal node should remain accessible. - // ******************************************** - //if (flsh == 0 || rth < `MIN_R) begin - // V(br_sht) <+ 0.0; - //end else begin - // I(br_sht) <+ Vrth/rth_t-pterm ; //`P(spectre:gmin="add"); - // I(br_sht) <+ ddt(cth*Vrth); - // - //end - // ******************************************** - - // NQS effect - I(br_bxf1) <+ Ixf1; - I(br_cxf1) <+ ddt(Qxf1); - I(br_bxf2) <+ Ixf2; - I(br_cxf2) <+ ddt(Qxf2); - - I(br_bxf) <+ Ixf; - I(br_cxf) <+ ddt(Qxf); - - -`ifdef CALC_NOISE -// Noise sources -// Thermal noise - fourkt = 4.0 * `P_K * Tdev; - if (rbx >= `MIN_R || rbi0 >= `MIN_R) begin - I(br_bbi_i) <+ white_noise(fourkt/rb, "rb thermal"); - end - if (rcx >= `MIN_R) begin - I(br_cic_i) <+ white_noise(fourkt/rcx_t, "rcx thermal"); - end - if (re >= `MIN_R) begin - I(br_eie_i) <+ white_noise(fourkt/re_t, "re thermal"); - end - -// Shot noise - twoq = 2.0 * `P_Q; - I(br_biei) <+ white_noise(twoq*ijbe, "ijbe shot"); - I(br_ciei) <+ white_noise(twoq*it, "it shot"); - -// Flicker noise - flicker_Pwr = kf*pow(ijbe,af); - I(br_biei) <+ flicker_noise(flicker_Pwr,1.0, "ib flicker"); -`endif - - -`ifdef CALC_OP -// if (analysis("static")) begin : OP_calculation - begin : OP_calculation - real oRPIi, oRMUi, oROi, gAVL; - real Cdei, Cdci, Cjei, Cjci, Cjcx, CBC; - real R_tot; - -// IB = I(); -// IC = I(); -// ISUB = I(); - IB = ibe; - IC = it; - ISUB = ijsc; - IAVL = iavl; - - VBE = V(b,e); - VBC = V(b,c); - VCE = V(c,e); - VSC = V(s,c); - -// GMi = ddx(it_wop,V(bi)); - GMi = ddx(it,V(bi)); - - oRPIi = ddx(ijbe,V(bi)); - RPIi = 1.0/(oRPIi+1e-12); - - oRMUi = -1*ddx(Ibici,V(ci)); - RMUi = 1.0/(oRMUi+1e-12); - - gAVL = HICUMtype*ddx(iavl,V(ci)); - oROi = ddx(it_wop,V(ci)); - ROi = 1.0/(oROi+gAVL+1e-12); - - Cdei = -1*HICUMtype*ddx(qf,V(ei)); - Cjei = ddx(qjei,V(bi)); - CPIi = Cjei + Cdei + cbepar; - - Cdci = -1*HICUMtype*ddx(qr,V(ci)); - Cjci = ddx(qjci_int,V(bi)); - CMUi = Cjci + Cdci; - - Cjcx = -1*ddx(qjcxi,V(ci)); - CBCX = Cjcx + cbcpar ; - - CCS = ddx(qjs,V(s)); - - RBi = rbi; - RB = rb; - RCXop = rcx_t; - REop = re_t; - - BETADC = IC/IB; - BETAAC = GMi*RPIi; - - R_tot = RCXop + REop + ((RB+REop)/BETAAC); - - TF = tf; - - CBC = CMUi+CBCX; - FT = GMi/(2*`M_PI*(CPIi+CBC+(R_tot*CBC*GMi))); - end -`endif - - - end // analog -endmodule diff --git a/src/spicelib/devices/adms/mextram/admsva/IP_NOTICE_DISCLAIMER_LICENSE b/src/spicelib/devices/adms/mextram/admsva/IP_NOTICE_DISCLAIMER_LICENSE deleted file mode 100644 index 60ba5752b..000000000 --- a/src/spicelib/devices/adms/mextram/admsva/IP_NOTICE_DISCLAIMER_LICENSE +++ /dev/null @@ -1,48 +0,0 @@ -// Copyright (c) 2000-2007, NXP Semiconductors -// Copyright (c) 2007-2014, Delft University of Technology -// Copyright (c) 2015, Auburn University - -INTELLECTUAL PROPERTY NOTICE, DISCLAIMER AND LICENSE - -The Mextram model and documentation presented at this website, -denoted as the Model, -has been developed by NXP Semiconductors until 2007, -Delft University of Technology from 2007 to 2014, -and Auburn University since April 2015. - -The Model is distributed as is, completely without any expressed -or implied warranty or service support. -NXP Semiconductors, Delft University of Technology, -Auburn University and their employees are not liable for -the condition or performance of the Model. - -NXP Semiconductors, Delft University of Technology, -Auburn University own -the copyright and grant users a perpetual, -irrevocable, worldwide, non-exclusive, royalty-free -license with respect to the Model as set forth below. - -NXP Semiconductors, Delft University of Technology, Auburn University -hereby disclaim all implied warranties. - -NXP Semiconductors, Delft University of Technology, Auburn University -grant the users the right to modify, copy, and -redistribute the Model and documentation, -both within the user's organization and externally, -subject to the following restrictions - -1. The users agree not to charge for the code -itself but may charge for additions, extensions, or support. - -2. In any product based on the Model, the users agree to acknowledge -NXP Semiconductors, Delft University of Technology, Auburn University -that developed the Model. This acknowledgment -shall appear in the product documentation. - -3. The users agree to obey all restrictions governing redistribution -or export of the Model. - -4. The users agree to reproduce any copyright notice which appears -on the Model on any copy or modification of such made available -to others. - diff --git a/src/spicelib/devices/adms/mextram/admsva/bjt504t.va b/src/spicelib/devices/adms/mextram/admsva/bjt504t.va deleted file mode 100644 index d5d1c36b7..000000000 --- a/src/spicelib/devices/adms/mextram/admsva/bjt504t.va +++ /dev/null @@ -1,47 +0,0 @@ -// Copyright (c) 2000-2007, NXP Semiconductor -// Copyright (c) 2007-2014, Delft University of Technology -// Copyright (c) 2015, Auburn University -// All rights reserved, see IP_NOTICE_DISCLAIMER_LICENSE for further information. - -`include "frontdef.inc" -`define SELFHEATING -`define SUBSTRATE - -module bjt504tva (c, b, e, s, dt); - -// External ports -inout c, b, e, s, dt; - -electrical c `P(desc="external collector node"); -electrical b `P(desc="external base node"); -electrical e `P(desc="external emitter node"); -electrical s `P(desc="external substrate node"); -electrical dt `P(desc="external thermal node"); - -// Internal nodes -electrical c1 `P(desc="internal collector node 1"); -electrical e1 `P(desc="internal emitter node"); -electrical b1 `P(desc="internal base node 1"); -electrical b2 `P(desc="internal base node 2"); -electrical c2 `P(desc="internal collector node 2"); -electrical c3 `P(desc="internal collector node 3"); -electrical c4 `P(desc="internal collector node 4"); -// For correlated noise implementation -electrical noi `P(desc="internal noise node"); - -`include "parameters.inc" -`include "variables.inc" -`include "opvars.inc" - -analog begin -`include "initialize.inc" -`include "tscaling.inc" -`include "evaluate.inc" -`include "noise.inc" -`include "opinfo.inc" - -// The following can be used to print OP-info to std out: -// `include "op_print.inc" - -end // analog -endmodule diff --git a/src/spicelib/devices/adms/mextram/admsva/evaluate.inc b/src/spicelib/devices/adms/mextram/admsva/evaluate.inc deleted file mode 100644 index 95f9ebd05..000000000 --- a/src/spicelib/devices/adms/mextram/admsva/evaluate.inc +++ /dev/null @@ -1,636 +0,0 @@ -// Copyright (c) 2000-2007, NXP Semiconductor -// Copyright (c) 2007-2014, Delft University of Technology -// Copyright (c) 2015, Auburn University -// All rights reserved, see IP_NOTICE_DISCLAIMER_LICENSE for further information. - -// Evaluate model equations - -begin // Currents and charges - // Nodal biases - - Vb2c1 = TYPE * V(b2, c1); - Vb2c2 = TYPE * V(b2, c2); - Vb2e1 = TYPE * V(b2, e1); - Vb1e1 = TYPE * V(b1, e1); - Vb1b2 = TYPE * V(b1, b2); -`ifdef SUBSTRATE - Vsc1 = TYPE * V(s, c1); -`endif - Vc1c2 = TYPE * V(c1, c2); - Vee1 = TYPE * V(e, e1); - Vbb1 = TYPE * V(b, b1); - Vbe = TYPE * V(b, e); - Vbc = TYPE * V(b, c); - - /* RvdT, 03-12-2007, voltage differences - associated with distributed parasitic collector. - Evaluated taking values of resistances into account: - in case of vanishing resistance corresponding node - is not addressed: */ - - if (RCBLX > 0.0) - begin - if (RCBLI > 0.0) - begin - Vc4c1 = TYPE * V(c4, c1); - Vc3c4 = TYPE * V(c3, c4); - end - else - begin - Vc4c1 = 0 ; - Vc3c4 = TYPE * V(c3, c1); - end - end - else - begin - if (RCBLI > 0.0) - begin - Vc4c1 = TYPE * V(c4, c1); - Vc3c4 = 0 ; - end - else - begin - Vc4c1 = 0 ; - Vc3c4 = 0 ; - end - end - - Vb1c4 = Vb1b2 + Vb2c2 - Vc1c2 - Vc4c1 ; - Vcc3 = - Vbc + Vbb1 + Vb1c4 - Vc3c4 ; - Vbc3 = Vbc + Vcc3 ; - -`ifdef SUBSTRATE - Vsc4 = Vsc1 - Vc4c1 ; - Vsc3 = Vsc4 - Vc3c4 ; -`endif - - - // Exponential bias terms - - `expLin(eVb2c2,Vb2c2 * VtINV) - `expLin(eVb2e1,Vb2e1 * VtINV) - `expLin(eVb1e1,Vb1e1 * VtINV) - `expLin(eVb1c4,Vb1c4 * VtINV) - `expLin(eVb1b2,Vb1b2 * VtINV) - `expLin(eVbc3,Vbc3 * VtINV) -`ifdef SUBSTRATE - `expLin(eVsc1,Vsc1 * VtINV) - // RvdT MXT504.10, new: eVsc3, eVsc4 - `expLin(eVsc3,Vsc3 * VtINV) - `expLin(eVsc4,Vsc4 * VtINV) -`endif - - `expLin(eVbc3VDC,(Vbc3 - VDC_T) * VtINV) - `expLin(eVb1c4VDC,(Vb1c4 - VDC_T) * VtINV) - `expLin(eVb2c2VDC,(Vb2c2 - VDC_T) * VtINV) - `expLin(eVb2c1VDC,(Vb2c1 - VDC_T) * VtINV) - - // Governing equations - - // Epilayer model - - K0 = sqrt(1.0 + 4.0 * eVb2c2VDC); - Kw = sqrt(1.0 + 4.0 * eVb2c1VDC); - pW = 2.0 * eVb2c1VDC / (1.0 + Kw); - // if (pW < `TEN_M40) pW = 0; - Ec = Vt * (K0 - Kw - ln((K0 + 1.0) / (Kw + 1.0)) ); - Ic1c2 = (Ec + Vc1c2) / RCV_TM; - - if (Ic1c2 > 0.0) begin - - `linLog(tmpV,Vb2c1,100.0); - Vqs_th = VDC_T + 2.0 * Vt * - ln(0.5 * Ic1c2 * RCV_TM * VtINV + 1.0) - tmpV; - eps_VDC = 0.2 * VDC_T; - `max_hyp0(Vqs, Vqs_th, eps_VDC); - Iqs = Vqs * (Vqs + IHC_M * SCRCV_M) / (SCRCV_M * (Vqs + IHC_M * RCV_TM)); - - Ic1c2_Iqs = Ic1c2 / Iqs; - `max_logexp(alpha1, Ic1c2_Iqs, 1.0, AXI); - alpha = alpha1 / (1.0 + AXI * ln(1.0 + exp(-1.0 / AXI))); - vyi = Vqs / (IHC_M * SCRCV_M); - yi = (1.0 + sqrt(1.0 + 4.0 * alpha * vyi * (1.0 + vyi))) / - (2.0 * alpha * (1.0 + vyi)); - - //xi_w = 1.0 - yi / (1.0 + pW * yi); - // Niu 5/23/2015, fixes numerical discontinuity at forward/reverse transition, see "Epi layer model improvement of smoothness at I=0" - xi_w = (1.0 - yi + pW * yi) / (1.0 + pW * yi); - gp0 = 0.5 * Ic1c2 * RCV_TM * xi_w * VtINV; - - gp0_help = 2.0 * gp0 + pW * (pW + gp0 + 1.0); - gp02 = 0.5 * (gp0 - 1.0); - sqr_arg = gp02 * gp02 + gp0_help; - if (gp0 >= 1.0) - p0star = gp02 + sqrt(sqr_arg); - else - p0star = gp0_help / (sqrt(sqr_arg) - gp02); - // if (p0star < `TEN_M40) p0star = 0.0; - - - eVb2c2star = p0star * (p0star + 1.0) * exp(VDC_T * VtINV); - B1 = 0.5 * SCRCV_M * (Ic1c2 - IHC_M); - B2 = SCRCV_M * RCV_TM * IHC_M * Ic1c2; - Vxi0 = B1 + sqrt(B1 * B1 + B2); - Vch = VDC_T * (0.1 + 2.0 * Ic1c2 / (Ic1c2 + Iqs)); - Icap = IHC_M * Ic1c2 / (IHC_M + Ic1c2); - Icap_IHC = IHC_M / (IHC_M + Ic1c2); - - end else begin - - Iqs = 0.0 ; - p0star = 2.0 * eVb2c2VDC / (1.0 + K0); - eVb2c2star = eVb2c2; - if ((abs(Vc1c2) < 1.0e-5 * Vt) || - (abs(Ec) < `TEN_M40 * Vt * (K0 + Kw))) - begin - pav = 0.5 * (p0star + pW); - xi_w = pav / (pav + 1.0); - end - else - begin - xi_w = Ec / (Ec + Vb2c2 - Vb2c1); - end - - Vxi0 = Vc1c2; - Vch = 0.1 * VDC_T; - Icap = Ic1c2; - Icap_IHC = 1.0 - Icap / IHC_M; - - end - - // Effective emitter junction capacitance bias - - Vfe = VDE_T * (1.0 - pow(`AJE , -1.0 / PE)); - a_VDE = 0.1 * VDE_T; - `min_logexp(Vje, Vb2e1, Vfe, a_VDE); - - // RvdT, November 2008, E0BE to be re-used in EB- Zener tunnel model: - E0BE = pow(1.0 - Vje * inv_VDE_T, 1.0 - PE) ; - Vte = VDE_T / (1.0 - PE) * (1.0 - E0BE) + - `AJE * (Vb2e1 - Vje); - - // Effective collector junction capacitance bias - - Vjunc = Vb2c1 + Vxi0; - bjc = (`AJC - XP_T) / (1.0 - XP_T); - Vfc = VDC_T * (1.0 - pow(bjc, -1.0 / PC)); - `min_logexp(Vjc, Vjunc, Vfc, Vch); - fI = pow(Icap_IHC, MC); - Vcv = VDC_T / (1.0 - PC) * (1.0 - fI * pow(1.0 - Vjc / VDC_T, 1.0 - PC)) + - fI * bjc * (Vjunc - Vjc); - Vtc = (1.0 - XP_T) * Vcv + XP_T * Vb2c1; - - // Transfer current - - If0 = 4.0 * IS_TM / IK_TM; - f1 = If0 * eVb2e1; - n0 = f1 / (1.0 + sqrt(1.0 + f1)); - f2 = If0 * eVb2c2star; - nB = f2 / (1.0 + sqrt(1.0 + f2)); - - if (DEG == 0.0) - q0I = 1.0 + Vte / VER_T + Vtc / VEF_T; - else - begin - termE = (Vte / VER_T + 1.0) * DEG_T * VtINV; - termC = -Vtc / VEF_T * DEG_T * VtINV; - q0I = (exp(termE) - exp(termC)) / - (exp(DEG_T * VtINV) - 1.0); - end - - `max_hyp0(q1I, q0I, 0.1); - qBI = q1I * (1.0 + 0.5 * (n0 + nB)); - - Ir = IS_TM * eVb2c2star; - If = IS_TM * eVb2e1; - In = (If - Ir) / qBI; - - // Base and substrate current(s) - - Ibf0 = IS_TM / BF_T; - if (XREC == 0.0) - Ib1 = (1.0 - XIBI) * Ibf0 * (eVb2e1 - 1.0); - else - Ib1 = (1.0 - XIBI) * Ibf0 * ((1.0 - XREC) * (eVb2e1 - 1.0) + - XREC * (eVb2e1 + eVb2c2star - 2.0) * (1.0 + Vtc / VEF_T)); - - Ib1_s = XIBI * Ibf0 * (eVb1e1 - 1.0); - `expLin(tmpExp,Vb2e1 * VtINV / MLF) - Ib2 = IBF_TM * (tmpExp - 1.0) + my_gmin * Vb2e1; - `expLin(tmpExp,0.5 * Vb1c4 * VtINV) - Ib3 = IBR_TM * (eVb1c4 - 1.0) / - (tmpExp + exp(0.5 * VLR * VtINV)) + - my_gmin * Vb1c4; - - // begin RvdT, November 2008, MXT504.8_alpha - - // Base-emitter tunneling current - // max E-field E0BE calculated in BE depletion charge model: - - if (IZEB > 0.0 && NZEB > 0.0 && Vb2e1 < 0) - begin - `expLin(eZEB, nZEB_T * (1 - (pow2_2mPE/(2.0*E0BE)))) - // Force all derivatives at Vb2e1=0 to zero by using in DZEB a - // modified dE0BE expression for E0BE: - x = Vb2e1 * inv_VDE_T ; - dE0BE = pow(- x, -2.0-PE)*(PE*(1-PE*PE-3*x*(PE-1))-6*x*x*(PE-1+x)) * `one_sixth ; - `expLin(edZEB, Vb2e1 * pow2_2mPE * nZEB_T / (VGZEB_T * dE0BE )) - DZEB = - Vb2e1 - VGZEB_T * dE0BE * (1 - edZEB) / (pow2_2mPE * nZEB_T) ; - Izteb = 2.0 * IZEB_TM * DZEB * E0BE * eZEB * inv_VDE_T * pow2_PEm2 ; - end - else - begin - DZEB = 0 ; - Izteb = 0 ; - end - - // end RvdT, November 2008, MXT504.8_alpha - - // Iex, Isub (XIex, XIsub) - g1 = If0 * eVb1c4; - g2 = 4.0 * eVb1c4VDC; - - // nBex until and including MXT 504.9: - // nBex = g1 / (1.0 + sqrt(1.0 + g1)); - // nBex since MXT 504.10.1: Ackn. Jos Peters, Geoffrey Coram - nBex = (g1 - If0) / (1.0 + sqrt(1.0 + g1)); - pWex = g2 / (1.0 + sqrt(1.0 + g2)); - /* Iex until and including MXT 504.9: - Iex = (1.0 / BRI_T) * (0.5 * IK_TM * nBex - IS_TM); -*/ - // Iex since MXT 504.10: RvdT@TUDelft Q1, 2011: - Iex = IK_TM * nBex / (2.0 * BRI_T) ; - -`ifdef SUBSTRATE - // RvdT MXT504.10, new term: eVsc4 - if (EXSUB == 1.0) - Isub = 2.0 * ISS_TM * (eVb1c4 - eVsc4) / - (1.0 + sqrt(1.0 + 4.0 * (IS_TM / IKS_TM) * eVb1c4)); - else - Isub = 2.0 * ISS_TM * (eVb1c4 - 1.0) / - (1.0 + sqrt(1.0 + 4.0 * (IS_TM / IKS_TM) * eVb1c4)); - - // until504.8: Isf = ISS_TM * (eVsc1 - 1.0); - // New 504.9: - - if (ICSS < 0.0) - // this clause is to implement backwards compatibility - begin - Isf = ISS_TM * (eVsc1 - 1.0); - end - else - begin - Isf = ICSS_TM * (eVsc1 - 1.0); - end - - // End: New 504.9. - -`endif - - XIex =0.0; - -`ifdef SUBSTRATE - XIsub = 0.0; -`endif - - /* begin: RvdT, Q4 2012, Mextram 504.11: added EXMOD=2 option: */ - if (EXMOD == 1 || EXMOD == 2) - begin - - Iex = Iex * Xext1; - -`ifdef SUBSTRATE - Isub = Isub * Xext1; -`endif - - Xg1 = If0 * eVbc3; - // XnBex until and including MXT 504.9: - // XnBex = Xg1 / (1.0 + sqrt(1.0 + Xg1)); - // XnBex in MXT 504.10.1: Ackn. Jos Peters, Geoffrey Coram: - XnBex = (Xg1 - If0) / (1.0 + sqrt(1.0 + Xg1)); - /* XIMex until and including MXT 504.9: - XIMex = XEXT * (0.5 * IK_TM * XnBex - IS_TM) / BRI_T; -*/ - // XIMex in MXT 504.10: RvdT@TUDelft Q1, 2011: - XIMex = XEXT * 0.5 * IK_TM * XnBex / BRI_T; - -`ifdef SUBSTRATE - // RvdT MXT504.10, new term: eVsc3 - if (EXSUB == 1.0) - XIMsub = XEXT * 2.0 * ISS_TM * (eVbc3 - eVsc3) / - (1.0 + sqrt(1.0 + 4.0 * IS_T / IKS_T * eVbc3)); - else - XIMsub = XEXT * 2.0 * ISS_TM * (eVbc3 - 1.0) / - (1.0 + sqrt(1.0 + 4.0 * IS_T / IKS_T * eVbc3)); -`else - XIMsub = 0.0; -`endif - - if (EXMOD == 1) - begin -`ifdef SUBSTRATE - Vex_bias = XEXT * (IS_TM / BRI_T + ISS_TM) * RCCxx_TM; -`else - Vex_bias = XEXT * (IS_TM / BRI_T) * RCCxx_TM; -`endif - Vex = Vt * (2.0 - ln( Vex_bias * VtINV)); - vdif = Vbc3 - Vex; - `max_hyp0(VBex, vdif, 0.11); - Fex = VBex /(Vex_bias + (XIMex + XIMsub) * RCCxx_TM + VBex); - end - else - begin - Vex = 0.0 ; - vdif = 0.0 ; - VBex = 0.0 ; - Fex = 1.0 ; - end - - /* end: RvdT, Q4, 2012, Mextram 504.11: added EXMOD=2 option: */ - - XIex = Fex * XIMex; - -`ifdef SUBSTRATE - XIsub = Fex * XIMsub; -`endif - end - else - begin - Fex = 0; - XnBex = 0 ; - end - - // Variable base resistance - - q0Q = 1.0 + Vte / VER_T + Vtc / VEF_T; - `max_hyp0(q1Q, q0Q, 0.1); - qBQ = q1Q * (1.0 + 0.5 * (n0 + nB)); - - Rb2 = 3.0 * RBV_TM / qBQ; - Ib1b2 = (2.0 * Vt * (eVb1b2 - 1.0) + Vb1b2) / Rb2; - - // Weak-avalanche current - - Iavl = 0.0; - Gem = 0.0; - if ((Ic1c2 > 0.0) && (Vb2c1 < VDC_T)) begin - - dEdx0 = 2.0 * VAVL / (WAVL * WAVL); - sqr_arg = (VDC_T - Vb2c1) / Icap_IHC; - xd = sqrt(2.0 * sqr_arg / dEdx0); - if (EXAVL == 0.0) - Weff = WAVL; - else - begin - xi_w1 = 1.0 - 0.5 * xi_w; - Weff = WAVL * xi_w1 * xi_w1; - end - Wd = xd * Weff / sqrt(xd * xd + Weff * Weff); - Eav = (VDC_T - Vb2c1) / Wd; - E0 = Eav + 0.5 * Wd * dEdx0 * Icap_IHC; - - if (EXAVL == 0) - Em = E0; - else - begin - SHw = 1.0 + 2.0 * SFH * (1.0 + 2.0 * xi_w); - Efi = (1.0 + SFH) / (1.0 + 2.0 * SFH); - Ew = Eav - 0.5 * Wd * dEdx0 * (Efi - Ic1c2 / (IHC_M * SHw)); - sqr_arg = (Ew - E0) * (Ew - E0) + 0.1 * Eav * Eav * Icap / IHC_M; - Em = 0.5 * (Ew + E0 + sqrt(sqr_arg)); - end - - EmEav_Em = (Em - Eav) / Em; - if (abs(EmEav_Em) > `TEN_M07) - begin - lambda = 0.5 * Wd / EmEav_Em; - Gem = An / BnT * Em * lambda * - (exp(-BnT / Em) - exp(-BnT / Em * (1.0 + Weff / lambda)) ); - end - else - Gem = An * Weff * exp(-BnT / Em); - - Gmax = Vt / (Ic1c2 * (RBC_TM + Rb2)) + qBI / BF_T + - RE_TM / (RBC_TM + Rb2); - Iavl = Ic1c2 * Gem / (Gem +Gem / Gmax + 1.0); - end - - if (eVb2c2star > 0.0) - Vb2c2star = Vt * ln(eVb2c2star); - else - Vb2c2star = Vb2c2; - -`ifdef SELFHEATING - // Power dissipation - - // RvdT 03-12-2007, modified power equation due to distribution collector resistance - - power_dis = In * (Vb2e1 - Vb2c2star) + - Ic1c2 * (Vb2c2star - Vb2c1) - - Iavl * Vb2c2star + - Vee1 * Vee1 / RE_TM + - Vcc3 * Vcc3 * GCCxx_TM + - Vc3c4 * Vc3c4 * GCCex_TM + - Vc4c1 * Vc4c1 * GCCin_TM + - Vbb1 * Vbb1 / RBC_TM + - Ib1b2 * Vb1b2 + - // 504.8: Nov. 2008, RvdT, TU_Delft: Zener current contribution added: - // Izteb > 0 for Vb2e1 < 0, hence the minus sign: - (Ib1 + Ib2 - Izteb) * Vb2e1 + - Ib1_s * Vb1e1 + -`ifdef SUBSTRATE - (Iex + Ib3) * Vb1c4 + XIex * Vbc3 + - Isub * (Vb1c4 - Vsc4) + - XIsub * (Vbc3 - Vsc3) + - Isf * Vsc1; -`else - (Iex + Ib3) * Vb1c4 + XIex * Vbc3; -`endif - -`endif - - - // Charges - - Qte = (1.0 - XCJE) * CJE_TM * Vte; - `min_logexp(Vje_s, Vb1e1, Vfe, a_VDE); - Qte_s = XCJE * CJE_TM * (VDE_T / (1.0 - PE) * - (1.0 - pow(1.0 - Vje_s * inv_VDE_T, 1.0 - PE)) + - `AJE * (Vb1e1 - Vje_s)); - - Qtc = XCJC * CJC_TM * Vtc; - Qb0 = TAUB_T * IK_TM; - Qbe_qs = 0.5 * Qb0 * n0 * q1Q; - Qbc_qs = 0.5 * Qb0 * nB * q1Q; - - a_VDC = 0.1 * VDC_T; - `min_logexp(Vjcex, Vb1c4, Vfc, a_VDC); - Vtexv = VDC_T / (1.0 - PC) * (1.0 - pow(1.0 - Vjcex / VDC_T, 1.0 - PC)) + - bjc * (Vb1c4 - Vjcex); - Qtex = CJC_TM * ((1.0 - XP_T) * Vtexv + XP_T * Vb1c4) * - (1.0 - XCJC) * (1.0 - XEXT); - - `min_logexp(XVjcex, Vbc3, Vfc, a_VDC); - XVtexv = VDC_T / (1.0 - PC) * (1.0 - pow(1.0 - XVjcex / VDC_T, 1.0 - PC)) + - bjc * (Vbc3 - XVjcex); - XQtex = CJC_TM * ((1.0 - XP_T) * XVtexv + XP_T * Vbc3) * - (1.0 - XCJC) * XEXT; - -`ifdef SUBSTRATE - a_VDS = 0.1 * VDS_T; - Vfs = VDS_T * (1.0 - pow(`AJS , -1.0 / PS)); - `min_logexp(Vjs, Vsc1, Vfs, a_VDS); - Qts = CJS_TM * (VDS_T / (1.0 - PS) * - (1.0 - pow(1.0 - Vjs / VDS_T, 1.0 - PS)) + `AJS * (Vsc1 - Vjs)); -`endif - - Qe0 = TAUE_T * IK_TM * pow(IS_TM / IK_TM, 1.0 / MTAU); - `expLin(tmpExp,Vb2e1 / (MTAU * Vt)) - - // Niu Q2, 2016, for fixing reverse VBE noise when KE=1, KC=1, - // Previous Qe_qs causes unphysically large noise correlation time constant tau_n - Qe_qs = Qe0 * tmpExp; - - Qepi0 = 4.0 * TEPI_T * Vt / RCV_TM; - Qepi = 0.5 * Qepi0 * xi_w * (p0star + pW + 2.0); - - Qex = TAUR_T * 0.5 * (Qb0 * nBex + Qepi0 * pWex) / (TAUB_T + TEPI_T); - XQex = 0.0; - - if (EXMOD == 1) begin - - Qex = Qex * (1.0 - XEXT); - Xg2 = 4.0 * eVbc3VDC; - XpWex = Xg2 / (1.0 + sqrt(1.0 + Xg2)); - XQex = 0.5 * Fex * XEXT * TAUR_T * - (Qb0 * XnBex + Qepi0 * XpWex) / (TAUB_T + TEPI_T); - - end - - Qb1b2 = 0.0; - if (EXPHI == 1) - begin - dVteVje = pow(1.0 - Vje * inv_VDE_T, -PE) - `AJE; - Vb2e1Vfe = (Vb2e1 - Vfe) / a_VDE; - if (Vb2e1Vfe < 0.0) - dVjeVb2e1 = 1.0 / (1.0 + exp(Vb2e1Vfe)); - else - dVjeVb2e1 = exp(- Vb2e1Vfe) / (1.0 + exp(- Vb2e1Vfe)); - - dVteVb2e1 = dVteVje * dVjeVb2e1 + `AJE; - dQteVb2e1 = (1.0 - XCJE) * CJE_TM * dVteVb2e1; - - dn0Vb2e1 = If0 * eVb2e1 * VtINV * (0.5 / sqrt(1.0 + f1)); - dQbeVb2e1 = 0.5 * Qb0 * q1Q * dn0Vb2e1; - - // Niu, Q2 2016. Modified to fix reverse VBE noise problem. - dQeVb2e1 = Qe_qs / (MTAU * Vt); - - Qb1b2 = 0.2 * Vb1b2 * (dQteVb2e1 + dQbeVb2e1 + dQeVb2e1); - - Qe = (1 - KE) * Qe_qs; - Qbe_qs_eff = Qbe_qs + KE * Qe_qs; - Qbc = XQB * Qbe_qs_eff + Qbc_qs; - Qbe = (1 - XQB) * Qbe_qs_eff; - - end - else - begin - Qbe = Qbe_qs; - Qbc = Qbc_qs; - Qe = Qe_qs; - end - - - // Add branch current contributions - - // Static currents - I(c1, c2) <+ TYPE * Ic1c2; - I(c2, e1) <+ TYPE * In; - I(b1, e1) <+ TYPE * Ib1_s; - // begin RvdT, 28-10-2008, MXT504.8_alpha - // contribution tunnel current added - I(b2, e1) <+ TYPE * (Ib1 + Ib2 - Izteb); - -`ifdef SUBSTRATE - I(b1, s) <+ TYPE * Isub; - I(b, s) <+ TYPE * XIsub; - I(s, c1) <+ TYPE * Isf; -`endif - I(b1, b2) <+ TYPE * Ib1b2; - I(b2, c2) <+ TYPE * (-1.0 * Iavl); - I(e, e1) <+ TYPE * Vee1 / RE_TM; - I(b, b1) <+ TYPE * Vbb1 / RBC_TM; - -`ifdef SELFHEATING - // Electrical equivalent for the thermal network - I(dt) <+ V(dt) / RTH_Tamb_M; - I(dt) <+ ddt(CTH_M * V(dt)); - I(dt) <+ -1.0 * power_dis; -`endif - - - // Dynamic currents - I(b2, e1) <+ ddt(TYPE * (Qte + Qbe + Qe)); - I(b1, e1) <+ ddt(TYPE * (Qte_s)); - I(b2, c2) <+ ddt(TYPE * (Qtc + Qbc + Qepi)); -`ifdef SUBSTRATE - I(s, c1) <+ ddt(TYPE * Qts); -`endif - I(b1, b2) <+ ddt(TYPE * Qb1b2); - I(b, e) <+ ddt(TYPE * CBEO_M * Vbe); - I(b, c) <+ ddt(TYPE * CBCO_M * Vbc); - - end // Currents and charges - - - /* RvdT, Delft Univ. Tech. 03-12-2007. -Distribution of parasitic collector resistance. -This construct supports the case -RCBLI = 0.0 and or RCBLX = 0.0 . -It is up to the compiler to adjust the circuit topology -and perform a node-collapse in such cases. */ - if (RCBLX > 0.0) - begin - I(b, c3) <+ TYPE * XIex; - I(c, c3) <+ TYPE * Vcc3 * GCCxx_TM ; - I(b, c3) <+ ddt(TYPE * (XQtex + XQex)); - if (RCBLI > 0.0) - begin - I(c4, c1) <+ TYPE * Vc4c1 * GCCin_TM; - I(b1, c4) <+ TYPE * (Ib3 + Iex); - I(c3, c4) <+ TYPE * Vc3c4 * GCCex_TM ; - I(b1, c4) <+ ddt(TYPE * (Qtex + Qex)); - end - else - begin - V(c4, c1) <+ 0.0 ; - I(b1, c1) <+ TYPE * (Ib3 + Iex); - I(b1, c1) <+ ddt(TYPE * (Qtex + Qex)); - I(c3, c1) <+ TYPE * Vc3c4 * GCCex_TM ; - end - end - else - begin - V(c3, c4) <+ 0 ; - if (RCBLI > 0.0) - begin - I(b, c4) <+ TYPE * XIex; - I(c, c4) <+ TYPE * Vcc3 * GCCxx_TM ; - I(c4, c1) <+ TYPE * Vc4c1 * GCCin_TM; - I(b1, c4) <+ TYPE * (Ib3 + Iex); - I(b1, c4) <+ ddt(TYPE * (Qtex + Qex)); - I(b, c4) <+ ddt(TYPE * (XQtex + XQex)); - end - else - begin - I(b, c1) <+ TYPE * XIex; - I(c, c1) <+ TYPE * Vcc3 * GCCxx_TM ; - V(c4, c1) <+ 0.0 ; - I(b1, c1) <+ TYPE * (Ib3 + Iex); - I(b1, c1) <+ ddt(TYPE * (Qtex + Qex)); - I(b, c1) <+ ddt(TYPE * (XQtex + XQex)); - I(c3, c1) <+ TYPE * Vc3c4 * GCCex_TM ; - end - end - diff --git a/src/spicelib/devices/adms/mextram/admsva/frontdef.inc b/src/spicelib/devices/adms/mextram/admsva/frontdef.inc deleted file mode 100644 index ebe911458..000000000 --- a/src/spicelib/devices/adms/mextram/admsva/frontdef.inc +++ /dev/null @@ -1,133 +0,0 @@ -// Copyright (c) 2000-2007, NXP Semiconductor -// Copyright (c) 2007-2014, Delft University of Technology -// Copyright (c) 2015, Auburn University -// All rights reserved, see IP_NOTICE_DISCLAIMER_LICENSE for further information. - -// Front definitions - -`include "discipline.h" - -// Numerical, physical and model constants -`define TEN_M40 1.0e-40 -`define TEN_M07 1.0e-7 -`define C2K 273.15 -`define KB 1.3806226e-23 -`define QQ 1.6021918e-19 -`define KBdivQQ 8.61708691805812512584e-5 -`define one_third 0.33333333333333333333 -`define one_sixth 0.16666666666666666667 -`define VDLOW 0.05 -`define AJE 3.0 -`define AJC 2.0 -`define AJS 2.0 -`define VEXLIM 400.0 -`define PI 3.1415926 - -`define NGSPICE_ADMS - -// Desriptions and units -//`ifdef __VAMS_COMPACT_MODELING__ -`ifdef NGSPICE_ADMS - `define OPP(nam,uni,des) (* desc="des", units="uni" *) real nam; - `define PAR(des,uni) (* desc="des", units="uni" *) parameter real - `define PAI(des,uni) (* desc="des", units="uni" *) parameter integer -`else - `define OPP(nam,uni,des) - `define PAR(des,uni) parameter real - `define PAI(des,uni) parameter integer -`endif - -`define PGIVEN $param_given - -// ADMS specific definitions -`ifdef insideADMS - `define P(p) (*p*) - `define MODEL @(initial_model) - `define INSTANCE @(initial_instance) - `define NOISE @(noise) -`else - `define P(p) - `define MODEL - `define INSTANCE - `define NOISE -`endif - -// Smooth limitting functions -`define max_hyp0(result, x, epsilon)\ - eps2 = epsilon * epsilon;\ - x2 = x * x;\ - if (x < 0.0)\ - result = 0.5 * eps2 / (sqrt(x2 + eps2) - x);\ - else\ - result = 0.5 * (sqrt(x2 + eps2) + x);\ - result=result - -`define min_logexp(result, x, x0, a)\ - dxa = (x - x0) / (a);\ - if (x < x0)\ - result = x - a * ln(1.0 + exp(dxa));\ - else\ - result = x0 - a * ln(1.0 + exp(-dxa));\ - result=result - -`define max_logexp(result, x, x0, a)\ - dxa = (x - x0) / (a);\ - if (x < x0)\ - result = x0 + a * ln(1.0 + exp(dxa));\ - else\ - result = x + a * ln(1.0 + exp(-dxa));\ - result=result - -`define expLin(result, x)\ - if (x < `VEXLIM) begin\ - result = exp(x);\ - end else begin\ - expl = exp(`VEXLIM);\ - result = expl * (1.0 + (x - `VEXLIM));\ - end - -`define linLog(result, x, vlim)\ - if (x < vlim)\ - result = x;\ - else\ - result = vlim + ln(1.0 + (x - vlim));\ - result=result - -// Macros for the model/instance parameters -// -// MPRxx model parameter real -// MPIxx model parameter integer -// || -// cc closed lower bound, closed upper bound -// oo open lower bound, open upper bound -// co closed lower bound, open upper bound -// oc open lower bound, closed upper bound -// cz closed lower bound=0, open upper bound=inf -// oz open lower bound=0, open upper bound=inf -// nb no bounds -// ex no bounds with exclude -// sw switch(integer only, values 0=false and 1=true) -// ty switch(integer only, values -1=p-type and +1=n-type) -// -// -`define MPRnb(nam,def,uni, des) (*units=uni, desc=des*) parameter real nam=def ; -`define MPRex(nam,def,uni,exc, des) (*units=uni, desc=des*) parameter real nam=def exclude exc ; -`define MPRcc(nam,def,uni,lwr,upr,des) (*units=uni, desc=des*) parameter real nam=def from[lwr:upr] ; -`define MPRoo(nam,def,uni,lwr,upr,des) (*units=uni, desc=des*) parameter real nam=def from(lwr:upr) ; -`define MPRco(nam,def,uni,lwr,upr,des) (*units=uni, desc=des*) parameter real nam=def from[lwr:upr) ; -`define MPRoc(nam,def,uni,lwr,upr,des) (*units=uni, desc=des*) parameter real nam=def from(lwr:upr] ; -`define MPRcz(nam,def,uni, des) (*units=uni, desc=des*) parameter real nam=def from[ 0:inf); -`define MPRoz(nam,def,uni, des) (*units=uni, desc=des*) parameter real nam=def from( 0:inf); - -`define MPInb(nam,def,uni, des) (*units=uni, desc=des*) parameter integer nam=def ; -`define MPIex(nam,def,uni,exc, des) (*units=uni, desc=des*) parameter integer nam=def exclude exc ; -`define MPIcc(nam,def,uni,lwr,upr,des) (*units=uni, desc=des*) parameter integer nam=def from[lwr:upr] ; -`define MPIoo(nam,def,uni,lwr,upr,des) (*units=uni, desc=des*) parameter integer nam=def from(lwr:upr) ; -`define MPIco(nam,def,uni,lwr,upr,des) (*units=uni, desc=des*) parameter integer nam=def from[lwr:upr) ; -`define MPIoc(nam,def,uni,lwr,upr,des) (*units=uni, desc=des*) parameter integer nam=def from(lwr:upr] ; -`define MPIcz(nam,def,uni, des) (*units=uni, desc=des*) parameter integer nam=def from[ 0:inf); -`define MPIoz(nam,def,uni, des) (*units=uni, desc=des*) parameter integer nam=def from( 0:inf); - -`define MPIsw(nam,def,uni, des) (*units=uni, desc=des*) parameter integer nam=def from[ 0: 1] ; -`define MPIty(nam,def,uni, des) (*units=uni, desc=des*) parameter integer nam=def from[ -1: 1] exclude 0 ; - diff --git a/src/spicelib/devices/adms/mextram/admsva/initialize.inc b/src/spicelib/devices/adms/mextram/admsva/initialize.inc deleted file mode 100644 index c515a9f0c..000000000 --- a/src/spicelib/devices/adms/mextram/admsva/initialize.inc +++ /dev/null @@ -1,89 +0,0 @@ -// Copyright (c) 2000-2007, NXP Semiconductor -// Copyright (c) 2007-2014, Delft University of Technology -// Copyright (c) 2015, Auburn University -// All rights reserved, see IP_NOTICE_DISCLAIMER_LICENSE for further information. - -if (`PGIVEN(GMIN)) - my_gmin = GMIN; -else - my_gmin = $simparam("gmin"); - -// Initialize model constants -`INITIAL_INSTANCE -begin - // Impact ionization constants (NPN - PNP) - - if (TYPE == 1) begin - - An = 7.03e7; - Bn = 1.23e8; - - end else begin - - An = 1.58e8; - Bn = 2.04e8; - - end - - Xext1 = 1.0 - XEXT; - - // Temperature independent MULT scaling - -`ifdef SELFHEATING - CTH_M = CTH * MULT; -`endif - - CBEO_M = CBEO * MULT; - CBCO_M = CBCO * MULT; - - invMULT = 1.0 / MULT; - SCRCV_M = SCRCV * invMULT; - - KF_M = KF * pow(MULT, 1.0 - AF); - KFN_M = KFN * pow(MULT, 1.0 - (2.0 * (MLF - 1.0) + AF * (2.0 - MLF))); - - // begin: RvdT, November 2008; Zener tunneling current model - - pow2_2mPE = pow(2.0, 2.0 - PE); - pow2_PEm2 = 1.0 / pow2_2mPE; - - // Reference Temperature expressed in Kelvin: - Trk = TREF + `C2K; - // Ambient Temperature expressed in Kelvin: - Tamb = $temperature + DTA; - - - // begin: RvdT, November 2008; Zener tunneling current model - // - // Comment added March 2009: this assumes VGZEBOK as a model parameter. - // - // Bandgap for Zener tunnel current model at reference temperature in eV: - // VGZEB_Tr = VGZEBOK - AVGEB*Trk*Trk / (Trk + TVGEB); - // `max_logexp(VGZEB_Tr, VGZEBOK - AVGEB*Trk*Trk / (Trk + TVGEB), 0.05, 0.1); - // end: RvdT, November 2008 - - // begin: RvdT March 2009: - // to decrease parameter interdependency, - // use VGZEB as a parameter, instead of VGZEBOK: - // VGZEB : bandgap for Zener tunneling at T = Tref, - // VGZEBOK : bandgap for Zener tunneling at T = 0 K. - //`max_logexp(VGZEBOK, VGZEB + AVGEB*Trk*Trk / (Trk + TVGEB), 0.05, 0.1); - //dw admsXml can't expand the macro `max_logexp here - using the code - _x = VGZEB + AVGEB*Trk*Trk / (Trk + TVGEB); - _x0 = 0.05; - _a = 0.1; - _dxa = (_x - _x0) / (_a); - if (_x < _x0) - VGZEBOK = _x0 + _a * ln(1.0 + exp(_dxa)); - else - VGZEBOK = _x + _a * ln(1.0 + exp(-_dxa)); - - VGZEB_Tr = VGZEB; - // end: RvdT March 2009: use VGZEB as a parameter, instead of VGZEBOK: - - inv_VGZEB_Tr = 1.0 / VGZEB_Tr; - - inv_VDE = 1.0 / VDE; - - // end: RvdT, November 2008; Zener tunneling current model -end diff --git a/src/spicelib/devices/adms/mextram/admsva/noise.inc b/src/spicelib/devices/adms/mextram/admsva/noise.inc deleted file mode 100644 index f07ce223a..000000000 --- a/src/spicelib/devices/adms/mextram/admsva/noise.inc +++ /dev/null @@ -1,145 +0,0 @@ -// Copyright (c) 2000-2007, NXP Semiconductor -// Copyright (c) 2007-2014, Delft University of Technology -// Copyright (c) 2015, Auburn University -// All rights reserved, see IP_NOTICE_DISCLAIMER_LICENSE for further information. - -// Noise sources - -`NOISE begin - -// Thermal noise -common = 4.0 * `KB * Tk; -powerREC = common / RE_TM; // Emitter resistance -powerRBC = common / RBC_TM; // Base resistance -powerRCCxx = common * GCCxx_TM; // Collector resistance -powerRCCex = common * GCCex_TM; // Collector resistance -powerRCCin = common * GCCin_TM; // Collector resistance -powerRBV = common / Rb2 * (4.0 * eVb1b2 + 5.0) * `one_third ; // Variable base resistance - -// Main current shot noise -In_N = (If + Ir) / qBI; -powerCCS = 2.0 * `QQ * abs(In_N); - -// Weak-avalanche current shot noise -if (KAVL > 0) begin - Gem_N = abs(Iavl / In_N); -end else begin - Gem_N = 0.0; -end - -powerIIS = 2.0 * `QQ * Iavl * (Gem_N + 1); - -// Transit time for noise -if (In_N > 0.0) begin - Taub_N = (Qbe + Qbc) / In_N; -end else begin - Taub_N = TAUB_T * q1Q * qBI; -end - -// RF correlation noise model switch -if (KC == 1) begin - // use charge partition for noise transit time - taun = XQB * Taub_N; -end else if (KC == 2) begin - // use fraction of transit time for noise transit time - taun = FTAUN * Taub_N; -end else begin // KC == 0 - // no correlation noise - taun = 0; -end - -// Forward base current shot noise and 1/f noise -powerFBCS = 2.0 * `QQ * (abs(Ib1) + abs(Ib2) + abs(Izteb)); -powerFBC1fB1 = (1.0 - XIBI) * pow((abs(Ib1) / (1 - XIBI)), AF) * KF_M; -exponentFBC1fB2 = (2.0 * (MLF - 1.0)) + (AF * (2.0 - MLF)); -powerFBC1fB2 = KFN_M * pow(abs(Ib2), exponentFBC1fB2); - -// Emitter-base sidewall current shot and 1/f noise -powerEBSCS = 2.0 * `QQ * abs(Ib1_s); -if (XIBI == 0) - powerEBSC1f = 0.0; -else - powerEBSC1f = KF_M * XIBI * pow((abs(Ib1_s / XIBI)), AF); - -// Reverse base current shot noise and 1/f noise -powerRBCS = 2.0 * `QQ * abs(Ib3); -powerRBC1f = KF_M * pow(abs(Ib3), AF); - -// Extrinsic current shot noise and 1/f noise -powerExCS = 2.0 * `QQ * abs(Iex); -powerExC1f = KF_M * (1 - (EXMOD * XEXT)) * - pow((abs(Iex) / (1 - (EXMOD * XEXT))), AF); -powerExCSMOD = 2.0 * `QQ * abs(XIex) * EXMOD; -if (XEXT == 0.0) - powerExC1fMOD = 0.0; -else - powerExC1fMOD = KF_M * EXMOD * XEXT * pow((abs(XIex) / XEXT), AF); - -`ifdef SUBSTRATE -// Substrate current shot noise (between nodes B1 and S, resp. B and S) - powerSubsCS_B1S = 2.0 * `QQ * abs(Isub); - powerSubsCS_BS = 2.0 * `QQ * abs(XIsub); -`endif - -// Reference un-correlated current shot noise sources -I(noi) <+ white_noise(powerCCS, "un-correlated current shot noise"); -I(noi) <+ V(noi); - -// Implementing correlated noise sources -I(b2, e1) <+ taun * ddt(V(noi)); -I(c2, b2) <+ Gem_N * V(noi); -I(c2, e1) <+ V(noi); - -// Implementing un-correlated noise sources -I(c2, b2) <+ white_noise(powerIIS, "un-correlated noise"); -I(b2, e1) <+ white_noise(powerFBCS, "un-correlated noise"); - -// Add noise sources -I(e, e1) <+ white_noise(powerREC, "emitter resistance"); -I(b, b1) <+ white_noise(powerRBC, "base resistance"); -I(b1, b2) <+ white_noise(powerRBV, "variable base resistance"); -I(b2, e1) <+ flicker_noise(powerFBC1fB1, 1, "bas_emi_forw"); -I(b2, e1) <+ flicker_noise(powerFBC1fB2, 1, "bas_emi_forw"); -I(e1, b1) <+ white_noise(powerEBSCS, "emi_bas_side"); -I(e1, b1) <+ flicker_noise(powerEBSC1f, 1, "emi_bas_side"); -I(b1, c4) <+ white_noise(powerRBCS, "bas_col_reve"); -I(b1, c4) <+ flicker_noise(powerRBC1f, 1, "bas_col_reve"); -I(b1, c4) <+ white_noise(powerExCS, "Ext_bas_col"); -I(b1, c4) <+ flicker_noise(powerExC1f, 1, "Ext_bas_col"); -I(b, c3) <+ white_noise(powerExCSMOD, "Ext_bas_col"); -I(b, c3) <+ flicker_noise(powerExC1fMOD, 1, "Ext_bas_col"); - -`ifdef SUBSTRATE - I(b1, s) <+ white_noise(powerSubsCS_B1S, "bas_sub_current"); - I(b, s) <+ white_noise(powerSubsCS_BS, "bas_sub_current"); -`endif - -if (RCBLX > 0.0) -begin - if (RCBLI > 0.0) - begin /* all branches exist */ - I(c, c3) <+ white_noise(powerRCCxx, "collector plug resistance"); - I(c3, c4) <+ white_noise(powerRCCex, "extrinsic collector BL resistance"); - I(c4, c1) <+ white_noise(powerRCCin, "intrinsic collector BL resistance"); - end - else - begin /* only Rcblx exists */ - I(c, c3) <+ white_noise(powerRCCxx, "collector plug resistance"); - I(c3, c1) <+ white_noise(powerRCCex, "extrinsic collector BL resistance"); - end -end -else -begin - if (RCBLI > 0.0) - begin /* only Rcbli exists */ - I(c, c4) <+ white_noise(powerRCCxx, "collector plug resistance"); - I(c4, c1) <+ white_noise(powerRCCin, "intrinsic collector BL resistance"); - end - else - begin /* neither Rcblx nor Rcbli exists */ - I(c, c1) <+ white_noise(powerRCCxx, "collector plug resistance"); - end -end - -end // Noise - diff --git a/src/spicelib/devices/adms/mextram/admsva/opinfo.inc b/src/spicelib/devices/adms/mextram/admsva/opinfo.inc deleted file mode 100644 index 7b916a43e..000000000 --- a/src/spicelib/devices/adms/mextram/admsva/opinfo.inc +++ /dev/null @@ -1,250 +0,0 @@ -// Copyright (c) 2000-2007, NXP Semiconductor -// Copyright (c) 2007-2014, Delft University of Technology -// Copyright (c) 2015, Auburn University -// All rights reserved, see IP_NOTICE_DISCLAIMER_LICENSE for further information. - -// Evaluate the operating point (output) variables -begin - - //`ifdef __VAMS_COMPACT_MODELING__ -`ifdef NGSPICE_ADMS - - // The external currents and the current gain - //OP_ic = I(); // External DC collector current - OP_ic = TYPE*Ic1c2; // External DC collector current - //OP_ib = I(); // External DC base Current - OP_ib = TYPE*Ib1b2; // External DC base Current - - if (OP_ib == 0) - begin - OP_betadc = 0.0 ; - end - else - begin - OP_betadc = OP_ic / OP_ib; // External DC Current gain - end - - // begin added in MXT 504.9: - //OP_ie = I(); // External DC emitter current - OP_ie = TYPE*(In+Ib1_s); // External DC emitter current - OP_vbe = V(b, e); // External base-emitter bias - OP_vce = V(c, e); // External collector-emitter bias - OP_vbc = V(b, c); // External base-collector bias - -`ifdef SUBSTRATE - //OP_is = I(); // External DC emitter current - OP_is = TYPE*Isub; // External DC emitter current - OP_vse = V(s, e); // External substrate-emitter bias - OP_vbs = V(b, s); // External base-substrate bias - OP_vsc = V(s, c); // External substrate-collector bias -`endif - - // end added in MXT 504.9: - - // The internal voltage differences - OP_vb2e1 = Vb2e1; // Internal base-emiter bias - OP_vb2c2 = Vb2c2; // Internal base-emiter bias - OP_vb2c1 = Vb2c1; // Internal base-collector bias including epilayer - - OP_vb1c1 = Vb1b2 + Vb2c1; // External base-collector bias without contact resistances - - OP_vc4c1 = Vc4c1; // Bias over intrinsic buried layer - OP_vc3c4 = Vc3c4; // Bias over extrinsic buried layer - - OP_ve1e = - Vee1; // Bias over emiter resistance - - // The branch currents - OP_in = In; // Main current - OP_ic1c2 = Ic1c2; // Epilayer current - OP_ib1b2 = Ib1b2; // Pinched-base current - OP_ib1 = Ib1; // Ideal forward base current - OP_sib1 = Ib1_s; // Ideal side-wall base current - // - // 504.8, RvdT, TU-Delft April. 2009: - // - OP_izteb = Izteb ; // Zener tunneling current - // - OP_ib2 = Ib2; // Non-ideal forward base current - OP_ib3 = Ib3; // Non-ideal reverse base current - OP_iavl = Iavl; // Avalanche current - OP_iex = Iex; // Extrinsic reverse base current - OP_xiex = XIex; // Extrinsic reverse base current -`ifdef SUBSTRATE - OP_isub = Isub; // Substrate current - OP_xisub = XIsub; // Substrate current - OP_isf = Isf; // Substrate-collector current -`endif - OP_ire = - Vee1 / RE_TM; // Current through emiter resistance - OP_irbc = Vbb1 / RBC_TM; // Current through constant base resistance - - OP_ircc = Vcc3 * GCCxx_TM; // Current through collector contact resistance - OP_ircblx = Vc3c4 * GCCex_TM; // Current through extrinsic buried layer resistance - OP_ircbli = Vc4c1 * GCCin_TM; // Current through extrinsic buried layer resistance - - // The branch charges - OP_qe = Qe; // Emitter charge or emitter neutral charge - OP_qte = Qte; // Base-emiter depletion charge - OP_sqte = Qte_s; // Sidewall base-emiter depletion charge - OP_qbe = Qbe; // Base-emiter diffusion charge - OP_qbc = Qbc; // Base-collector diffusion charge - OP_qtc = Qtc; // Base-colector depletion charge - OP_qepi = Qepi; // Epilayer diffusion charge - OP_qb1b2 = Qb1b2; // AC current crowding charge - OP_qtex = Qtex; // Extrinsic base-collector depletion charge - OP_xqtex = XQtex; // Extrinsic base-collector depletion charge - OP_qex = Qex; // Extrinsic base-collector diffusion charge - OP_xqex = XQex; // Extrinsic base-collector diffusion charge -`ifdef SUBSTRATE - OP_qts = Qts; // Collector substrate depletion charge -`endif - - // Small signal equivalent circuit conductances and resistances - - OP_gx = - ddx(In, V(e1)); // Forward transconductance - OP_gy = - ddx(In, V(c2)); // Reverse transconductance - - OP_gz = - ddx(In, V(c1)); // Reverse transconductance - - OP_sgpi = - - ddx(Ib1_s, V(e1)); // Conductance sidewal b-e junction - OP_gpix = - ddx(Ib1+Ib2, V(e1)); // Conductance floor b-e junction - - OP_gpiy = - ddx(Ib1, V(c2)); // Early effect on recombination base current - OP_gpiz = - ddx(Ib1, V(c1)); // Early effect on recombination base current - - OP_gmux = ddx( Iavl, V(e1)); // Early effect on avalanche current limitting - OP_gmuy = ddx( Iavl, V(c2)); // Conductance of avalanche current - OP_gmuz = ddx( Iavl, V(c1)); // Conductance of avalanche current - - // Conductance extrinsic b-c current : - OP_gmuex = - + ddx(Iex+Ib3, V(b1)) - + ddx(Iex+Ib3, V(b2)) - + ddx(Iex+Ib3, V(e1)) - + ddx(Iex+Ib3, V(c2)); - - OP_xgmuex = ddx(XIex, V(b)) ; // Conductance extrinsic b-c current - - OP_grcvy = - ddx(Ic1c2, V(c2)); // Conductance of epilayer current - OP_grcvz = - ddx(Ic1c2, V(c1)); // Conductance of epilayer current - -// OP_rbv = 1.0 / (- ddx(Ib1b2, V(b2)) - ddx(Ib1b2, V(c2))); // Base resistance - OP_rbv = Rb2; // FIXME: Base resistance - very, very raw - - OP_grbvx = - ddx(Ib1b2, V(e1)); // Early effect on base resistance - OP_grbvy = - ddx(Ib1b2, V(c2)); // Early effect on base resistance - - OP_grbvz = - ddx(Ib1b2, V(c1)); // Early effect on base resistance - - OP_re = RE_TM; // Emiter resistance - OP_rbc = RBC_TM; // Constant base resistance - OP_rcc = RCCxx_TM; // Collector Contact resistance - OP_rcblx = RCCex_TM; // Extrinsic buried layer resistance - OP_rcbli = RCCin_TM; // Extrinsic buried layer resistance - - -`ifdef SUBSTRATE - OP_gs = ddx(Isub, V(b1)); // Conductance parasitic PNP transitor - OP_xgs = ddx(XIsub, V(b)) ; // Conductance parasitic PNP transistor - OP_gsf = ddx(Isf, V(s)) ; // Conductance substrate-collector current -`endif - - - - // Small signal equivalent circuit capacitances - OP_scbe = - ddx(Qte_s, V(e1)); // Capacitance sidewall b-e junction - - OP_cbex = - ddx(Qte + Qbe + Qe, V(e1)) ; // Capacitance floor b-e junction - - OP_cbey = - ddx(Qbe, V(c2)); // Early effect on b-e diffusion junction - - OP_cbez = - ddx(Qbe, V(c1)); // Early effect on b-e diffusion junction - - OP_cbcx = - ddx(Qbc, V(e1)); // Early effect on b-c diffusion junction - - - OP_cbcy = - ddx(Qtc + Qbc + Qepi, V(c2)); // Capacitance floor b-c junction - OP_cbcz = - ddx(Qtc + Qbc + Qepi, V(c1)); // Capacitance floor b-c junction - - // Capacitance extrinsic b-c junction : - OP_cbcex = - + ddx(Qtex + Qex,V(b1 )) - + ddx(Qtex + Qex,V(b2)) - + ddx(Qtex + Qex,V(e1)) - + ddx(Qtex + Qex,V(c2)) ; - - // Capacitance extrinsic b-c junction : - OP_xcbcex = ddx(XQtex + XQex, V(b)) ; - - OP_cb1b2 = - ddx(Qb1b2, V(b2)) - ddx(Qb1b2, V(c2)); // Capacitance AC current crowding - - OP_cb1b2x = - ddx(Qb1b2, V(e1)); // Cross-capacitance AC current crowding - OP_cb1b2y = - ddx(Qb1b2, V(c2)); // Cross-capacitance AC current crowding - OP_cb1b2z = - ddx(Qb1b2, V(c1)) ; // Cross-capacitance AC current crowding - -`ifdef SUBSTRATE - OP_cts = ddx(Qts, V(s)) ; // Capacitance s-c junction -`endif - - // Approximate small signal equivalent circuit - dydx = (OP_gx - OP_gmux) / (OP_grcvy + OP_gmuy - OP_gy); - dydz = (OP_gz - OP_grcvz - OP_gmuz) / (OP_grcvy + OP_gmuy - OP_gy); - gpi = OP_sgpi + OP_gpix + OP_gmux + OP_gpiz + OP_gmuz + - (OP_gpiy + OP_gmuy) * (dydx + dydz); - OP_gm = (OP_grcvy * (OP_gx - OP_gmux + // Transconductance - OP_gz - OP_gmuz) - OP_grcvz * - (OP_gy - OP_gmuy)) / (OP_grcvy + OP_gmuy - OP_gy); - OP_beta = OP_gm / gpi; // Current amplification - OP_gout = ((OP_gy - OP_gmuy) * OP_grcvz - // Output conductance - (OP_gz - OP_gmuz) * OP_grcvy) / - (OP_grcvy + OP_gmuy - OP_gy); - OP_gmu = OP_gpiz + OP_gmuz + (OP_gpiy + OP_gmuy) * dydz + // Feedback transconductance - OP_gmuex + OP_xgmuex; - OP_rb = RBC_TM + OP_rbv; // Base resistance - OP_rc = OP_rcc + OP_rcblx + OP_rcbli; // Collector resistance - OP_cbe = OP_cbex + OP_scbe + OP_cbcx + // Base-emitter capacitance - (OP_cbey + OP_cbcy) * dydx + CBEO_M; - OP_cbc = (OP_cbey + OP_cbcy) * dydz + OP_cbcz + // Base-collector capacitance - OP_cbcex + OP_xcbcex + CBCO_M; - - - // Quantities to describe internal state of the model - gammax = (OP_gpix + OP_gmux - OP_grbvx) * OP_rbv; - gammay = (OP_gpiy + OP_gmuy - OP_grbvy) * OP_rbv; - gammaz = (OP_gpiz + OP_gmuz - OP_grbvz) * OP_rbv; - gbfx = OP_gpix + OP_sgpi * (1.0 + gammax); - gbfy = OP_gpiy + OP_sgpi * gammay; - gbfz = OP_gpiz + OP_sgpi * gammaz; - - // RvdT March 2008: - alpha_ft = (1.0 + (OP_grcvy * dydx * OP_rc) + - (OP_gx + gbfx + (OP_gy + gbfy) * dydx) * RE_TM)/ - (1.0 - (OP_grcvz + OP_grcvy * dydz) * OP_rc - - (OP_gz + gbfz + (OP_gy + gbfy) * dydz) * RE_TM); - - rx = pow((OP_grcvy * dydx + alpha_ft * (OP_grcvz + OP_grcvy * dydz)), -1); - rz = alpha_ft * rx; - ry = (1.0 - OP_grcvz * rz) / OP_grcvy; - rb1b2 = gammax * rx + gammay * ry + gammaz * rz; - rex = rz + rb1b2 - OP_rcbli; - xrex = rz + rb1b2 + RBC_TM * ((gbfx + OP_gmux) * rx + (gbfy + OP_gmuy) * ry + - (gbfz + OP_gmuz) * rz) - OP_rcbli - OP_rcblx; - - taut = OP_scbe * (rx + rb1b2) + (OP_cbex + OP_cbcx) * rx + (OP_cbey + OP_cbcy) * - ry + (OP_cbez + OP_cbcz) * rz + OP_cbcex * rex + OP_xcbcex * xrex + - (CBEO_M + CBCO_M) * (xrex - RCCxx_TM); - - OP_ft = 1.0 / (2.0 * `PI * taut); // Good approximation for cut-off frequency - OP_iqs = Iqs; // Current at onset of quasi-saturation - OP_xiwepi = xi_w; // Thickness of injection layer - OP_vb2c2star = Vb2c2star; // Physical value of internal base-collector bias - - //self-heating -`ifdef SELFHEATING - OP_pdiss = power_dis; // Dissipation -`endif - - OP_tk = Tk; // Actual temperature - -`endif - end diff --git a/src/spicelib/devices/adms/mextram/admsva/opvars.inc b/src/spicelib/devices/adms/mextram/admsva/opvars.inc deleted file mode 100644 index e892da1d6..000000000 --- a/src/spicelib/devices/adms/mextram/admsva/opvars.inc +++ /dev/null @@ -1,156 +0,0 @@ -// Copyright (c) 2000-2007, NXP Semiconductor -// Copyright (c) 2007-2014, Delft University of Technology -// Copyright (c) 2015, Auburn University -// All rights reserved, see IP_NOTICE_DISCLAIMER_LICENSE for further information. - -// -// Operation point (output) variables -// - -// The external currents and current gain -`OPP(OP_ic, A, External DC collector current) -`OPP(OP_ib, A, External DC base current) -`OPP(OP_betadc, , External DC current gain Ic/Ib) - -// begin added in MXT 504.9: -`OPP(OP_ie, A, External DC emitter current) - -// The external biases -`OPP(OP_vbe, V, External base-emitter bias) -`OPP(OP_vce, V, External collector-emitter bias) -`OPP(OP_vbc, V, External base-collector bias) - -`ifdef SUBSTRATE -`OPP(OP_is, A, External DC substrate current) -`OPP(OP_vse, V, External substrate-emitter bias) -`OPP(OP_vbs, V, External base-substrate bias) -`OPP(OP_vsc, V, External substrate-collector bias) -`endif - -// end added in MXT 504.9 -// The internal biases -`OPP(OP_vb2e1, V, Internal base-emitter bias) -`OPP(OP_vb2c2, V, Internal base-collector bias) -`OPP(OP_vb2c1, V, Internal base-collector bias including epilayer) -`OPP(OP_vb1c1, V, External base-collector bias without contact resistances) -`OPP(OP_vc4c1, V, Bias over intrinsic buried layer) -`OPP(OP_vc3c4, V, Bias over extrinsic buried layer) -`OPP(OP_ve1e, V, Bias over emitter resistance) - -// The actual currents -`OPP(OP_in, A, Main current) -`OPP(OP_ic1c2, A, Epilayer current) -`OPP(OP_ib1b2, A, Pinched-base current) -`OPP(OP_ib1, A, Ideal forward base current) -`OPP(OP_sib1, A, Ideal side-wall base current) -// -// 504.8, RvdT, TU-Delft April. 2009, Zener tunneling current: -// -`OPP(OP_izteb, A, Zener tunneling current in the emitter base junction) -// -`OPP(OP_ib2, A, Non-ideal forward base current) -`OPP(OP_ib3, A, Non-ideal reverse base current) -`OPP(OP_iavl, A, Avalanche current) -`OPP(OP_iex, A, Extrinsic reverse base current) - -`OPP(OP_xiex, A, Extrinsic reverse base current) -`ifdef SUBSTRATE -`OPP(OP_isub, A, Substrate current) -`OPP(OP_xisub, A, Substrate current) -`OPP(OP_isf, A, Substrate failure current) -`endif -`OPP(OP_ire, A, Current through emitter resistance) -`OPP(OP_irbc, A, Current through constant base resistance) -`OPP(OP_ircblx, A, Current through extrinsic buried layer resistance) -`OPP(OP_ircbli, A, Current through intrinsic buried layer resistance) -`OPP(OP_ircc, A, Current through collector contact resistance) - -//The actual charges -`OPP(OP_qe, C, Emitter charge or emitter neutral charge) -`OPP(OP_qte, C, Base-emitter depletion charge) -`OPP(OP_sqte, C, Sidewall base-emitter depletion charge) -`OPP(OP_qbe, C, Base-emitter diffusion charge) -`OPP(OP_qbc, C, Base_collector diffusion charge) -`OPP(OP_qtc, C, Base-collector depletion charge) -`OPP(OP_qepi, C, Epilayer diffusion charge) -`OPP(OP_qb1b2, C, AC current crowding charge) -`OPP(OP_qtex, C, Extrinsic base-collector depletion charge) -`OPP(OP_xqtex, C, Extrinsic base-collector depletion charge) -`OPP(OP_qex, C, Extrinsic base-collector diffusion charge) -`OPP(OP_xqex, C, Extrinsic base-collector diffusion charge) -`ifdef SUBSTRATE -`OPP(OP_qts, C, Collector-substrate depletion charge) -`endif - -//Small signal equivalent circuit conductances and resistances -`OPP(OP_gx, S, Forward transconductance) -`OPP(OP_gy, S, Reverse transconductance) -`OPP(OP_gz, S, Reverse transconductance) -`OPP(OP_sgpi, S, Conductance sidewall b-e junction) -`OPP(OP_gpix, S, Conductance floor b-e junction) -`OPP(OP_gpiy, S, Early effect on recombination base current) -`OPP(OP_gpiz, S, Early effect on recombination base current) -`OPP(OP_gmux, S, Early effect on avalanche current limiting) -`OPP(OP_gmuy, S, Conductance of avalanche current) -`OPP(OP_gmuz, S, Conductance of avalanche current) -`OPP(OP_gmuex, S, Conductance of extrinsic b-c junction) -`OPP(OP_xgmuex, S, Conductance of extrinsic b-c junction) -`OPP(OP_grcvy, S, Conductance of epilayer current) -`OPP(OP_grcvz, S, Conductance of epilayer current) -`OPP(OP_rbv, Ohm, Base resistance) -`OPP(OP_grbvx, S, Early effect on base resistance) -`OPP(OP_grbvy, S, Early effect on base resistance) -`OPP(OP_grbvz, S, Early effect on base resistance) -`OPP(OP_re, Ohm, Emitter resistance) -`OPP(OP_rbc, Ohm, Constant base resistance) -`OPP(OP_rcc, Ohm, Collector contact resistance) -`OPP(OP_rcblx, Ohm, Extrinsic buried layer resistance) -`OPP(OP_rcbli, Ohm, Intrinsic buried layer resistance) -`ifdef SUBSTRATE -`OPP(OP_gs, S, Conductance parasitic PNP transistor) -`OPP(OP_xgs, S, Conductance parasitic PNP transistor) -`OPP(OP_gsf, S, Conductance substrate failure current) -`endif -//Small signal equivalent circuit capacitances -`OPP(OP_scbe, F, Capacitance sidewall b-e junction) -`OPP(OP_cbex, F, Capacitance floor b-e junction) -`OPP(OP_cbey, F, Early effect on b-e diffusion charge) -`OPP(OP_cbez, F, Early effect on b-e diffusion charge) -`OPP(OP_cbcx, F, Early effect on b-c diffusion charge) -`OPP(OP_cbcy, F, Capacitance floor b-c junction) -`OPP(OP_cbcz, F, Capacitance floor b-c junction) -`OPP(OP_cbcex, F, Capacitance extrinsic b-c junction) -`OPP(OP_xcbcex, F, Capacitance extrinsic b-c junction) -`OPP(OP_cb1b2, F, Capacitance AC current crowding) -`OPP(OP_cb1b2x, F, Cross-capacitance AC current crowding) -`OPP(OP_cb1b2y, F, Cross-capacitance AC current crowding) -`OPP(OP_cb1b2z, F, Cross-capacitance AC current crowding) -`ifdef SUBSTRATE -`OPP(OP_cts, F, Capacitance s-c junction) -`endif -//Approximate small signal equivalent circuit -`OPP(OP_gm, S,transconductance) -`OPP(OP_beta, , Current amplification) -`OPP(OP_gout, S, Output conductance) -`OPP(OP_gmu, S, Feedback transconductance) -`OPP(OP_rb, Ohm, Base resistance) -`OPP(OP_rc, Ohm, Collector resistance) -`OPP(OP_cbe, C, Base-emitter capacitance) -`OPP(OP_cbc, C, Base-collector capacitance) - -//quantities to describe internal state of the model -`OPP(OP_ft, , Good approximation for cut-off frequency) -`OPP(OP_iqs, A, Current at onset of quasi-saturation) -`OPP(OP_xiwepi, m, Thickness of injection layer) -`OPP(OP_vb2c2star, V, Physical value of internal base-collector bias) - -//self-heating -`ifdef SELFHEATING -`OPP(OP_pdiss, W, Dissipation) -`endif -`OPP(OP_tk, K, Actual temperature) - -//help variables -real dydx, dydz, gpi; -real gammax, gammay, gammaz, gbfx, gbfy, gbfz, alpha_ft; -real rx, ry, rz, rb1b2, rex, xrex, taut; diff --git a/src/spicelib/devices/adms/mextram/admsva/parameters.inc b/src/spicelib/devices/adms/mextram/admsva/parameters.inc deleted file mode 100644 index f6660f46b..000000000 --- a/src/spicelib/devices/adms/mextram/admsva/parameters.inc +++ /dev/null @@ -1,115 +0,0 @@ -// Copyright (c) 2000-2007, NXP Semiconductor -// Copyright (c) 2007-2014, Delft University of Technology -// Copyright (c) 2015, Auburn University -// All rights reserved, see IP_NOTICE_DISCLAIMER_LICENSE for further information. - -// Mextram parameters -`MPIco( LEVEL ,504 ,"" ,504 ,505 ,"Model level" ) -`MPRco( TREF ,25.0 ,"" ,-273.0 ,inf ,"Reference temperature" ) -`MPRnb( DTA ,0.0 ,"" ,"Difference between the local and global ambient temperatures" ) -`MPIcc( EXMOD ,1 ,"" ,0 ,2 ,"Flag for extended modeling of the reverse current gain" ) -`MPIcc( EXPHI ,1 ,"" ,0 ,1 ,"Flag for the distributed high-frequency effects in transient" ) -`MPIcc( EXAVL ,0 ,"" ,0 ,1 ,"Flag for extended modeling of avalanche currents" ) - -`ifdef SUBSTRATE -`MPIcc( EXSUB ,0 ,"" ,0 ,1 ,"Flag for extended modelling of substrate currents" ) -`endif - -`MPRoo( IS ,22.0a ,"" ,0.0 ,inf ,"Collector-emitter saturation current" ) -`MPRco( IK ,0.1 ,"" ,1.0p ,inf ,"Collector-emitter high injection knee current" ) -`MPRco( VER ,2.5 ,"" ,0.01 ,inf ,"Reverse Early voltage" ) -`MPRco( VEF ,44.0 ,"" ,0.01 ,inf ,"Forward Early voltage" ) -`MPRco( BF ,215.0 ,"" ,0.1m ,inf ,"Ideal forward current gain" ) -`MPRco( IBF ,2.7f ,"" ,0.0 ,inf ,"Saturation current of the non-ideal forward base current" ) -`MPRco( MLF ,2.0 ,"" ,0.1 ,inf ,"Non-ideality factor of the non-ideal forward base current" ) -`MPRcc( XIBI ,0.0 ,"" ,0.0 ,1.0 ,"Part of ideal base current that belongs to the sidewall" ) -`MPRco( IZEB ,0.0 ,"" ,0.0 ,inf ,"Pre-factor of emitter-base Zener tunneling current" ) -`MPRco( NZEB ,22.0 ,"" ,0.0 ,inf ,"Coefficient of emitter-base Zener tunneling current" ) -`MPRco( BRI ,7.0 ,"" ,1.0e-4 ,inf ,"Ideal reverse current gain" ) -`MPRco( IBR ,1.0f ,"" ,0.0 ,inf ,"Saturation current of the non-ideal reverse base current" ) -`MPRnb( VLR ,0.2 ,"" ,"Cross-over voltage of the non-ideal reverse base current" ) -`MPRcc( XEXT ,0.63 ,"" ,0.0 ,1.0 ,"Part of currents and charges that belong to extrinsic region" ) -`MPRco( WAVL ,1.1u ,"" ,1.0n ,inf ,"Epilayer thickness used in weak-avalanche model" ) -`MPRco( VAVL ,3.0 ,"" ,0.01 ,inf ,"Voltage determining curvature of avalanche current" ) -`MPRco( SFH ,0.3 ,"" ,0.0 ,inf ,"Current spreading factor of avalanche model when EXAVL=1" ) -`MPRco( RE ,5.0 ,"" ,1.0m ,inf ,"Emitter resistance" ) -`MPRco( RBC ,23.0 ,"" ,1.0m ,inf ,"Constant part of the base resistance" ) -`MPRco( RBV ,18.0 ,"" ,1.0m ,inf ,"Zero-bias value of the variable part of the base resistance" ) -`MPRco( RCC ,12.0 ,"" ,1.0m ,inf ,"Constant part of the collector resistance" ) -`MPRco( RCV ,150.0 ,"" ,1.0m ,inf ,"Resistance of the un-modulated epilayer" ) -`MPRco( SCRCV ,1250.0 ,"" ,1.0m ,inf ,"Space charge resistance of the epilayer" ) -`MPRco( IHC ,4.0m ,"" ,1.0p ,inf ,"Critical current for velocity saturation in the epilayer" ) -`MPRco( AXI ,0.3 ,"" ,0.02 ,inf ,"Smoothness parameter for the onset of quasi-saturation" ) -`MPRco( CJE ,73.0f ,"" ,0.0 ,inf ,"Zero-bias emitter-base depletion capacitance" ) -`MPRco( VDE ,0.95 ,"" ,0.05 ,inf ,"Emitter-base diffusion voltage" ) -`MPRco( PE ,0.4 ,"" ,0.01 ,0.99 ,"Emitter-base grading coefficient" ) -`MPRcc( XCJE ,0.4 ,"" ,0.0 ,1.0 ,"Sidewall fraction of the emitter-base depletion capacitance" ) -`MPRco( CBEO ,0.0 ,"" ,0.0 ,inf ,"Emitter-base overlap capacitance" ) -`MPRco( CJC ,78.0f ,"" ,0.0 ,inf ,"Zero-bias collector-base depletion capacitance" ) -`MPRco( VDC ,0.68 ,"" ,0.05 ,inf ,"Collector-base diffusion voltage" ) -`MPRco( PC ,0.5 ,"" ,0.01 ,0.99 ,"Collector-base grading coefficient" ) -`MPRco( XP ,0.35 ,"" ,0.0 ,0.99 ,"Constant part of Cjc" ) -`MPRco( MC ,0.5 ,"" ,0.0 ,1.0 ,"Coefficient for current modulation of CB depletion capacitance" ) -`MPRcc( XCJC ,32.0m ,"" ,0.0 ,1.0 ,"Fraction of CB depletion capacitance under the emitter" ) -`MPRco( RCBLX ,0.001 ,"" ,0.001 ,inf ,"Resistance Collector Buried Layer eXtrinsic" ) -`MPRco( RCBLI ,0.001 ,"" ,0.001 ,inf ,"Resistance Collector Buried Layer Intrinsic" ) -`MPRco( CBCO ,0.0 ,"" ,0.0 ,inf ,"Collector-base overlap capacitance" ) -`MPRco( MTAU ,1.0 ,"" ,0.1 ,inf ,"Non-ideality factor of the emitter stored charge" ) -`MPRco( TAUE ,2.0p ,"" ,0.0 ,inf ,"Minimum transit time of stored emitter charge" ) -`MPRoo( TAUB ,4.2p ,"" ,0.0 ,inf ,"Transit time of stored base charge" ) -`MPRco( TEPI ,41.0p ,"" ,0.0 ,inf ,"Transit time of stored epilayer charge" ) -`MPRco( TAUR ,520.0p ,"" ,0.0 ,inf ,"Transit time of reverse extrinsic stored base charge" ) -`MPRnb( DEG ,0.0 ,"" ,"Bandgap difference over the base" ) -`MPRco( XREC ,0.0 ,"" ,0.0 ,inf ,"Pre-factor of the recombination part of Ib1" ) -`MPRcc( XQB ,`one_third ,"" ,0.0 ,1.0 ,"Emitter-fraction of base diffusion charge" ) -`MPRnb( AQBO ,0.3 ,"" ,"Temperature coefficient of the zero-bias base charge" ) -`MPRnb( AE ,0.0 ,"" ,"Temperature coefficient of the resistivity of the emitter" ) -`MPRnb( AB ,1.0 ,"" ,"Temperature coefficient of the resistivity of the base" ) -`MPRnb( AEPI ,2.5 ,"" ,"Temperature coefficient of the resistivity of the epilayer" ) -`MPRnb( AEX ,0.62 ,"" ,"Temperature coefficient of the resistivity of the extrinsic base" ) -`MPRnb( AC ,2.0 ,"" ,"Temperature coefficient of the resistivity of the collector contact" ) -`MPRco( ACBL ,2.0 ,"" ,0.0 ,inf ,"Temperature coefficient of the resistivity of the collector buried layer" ) -`MPRnb( DVGBF ,50.0m ,"" ,"Band-gap voltage difference of the forward current gain" ) -`MPRnb( DVGBR ,45.0m ,"" ,"Band-gap voltage difference of the reverse current gain" ) -`MPRco( VGB ,1.17 ,"" ,0.1 ,inf ,"Band-gap voltage of the base" ) -`MPRco( VGC ,1.18 ,"" ,0.1 ,inf ,"Band-gap voltage of the collector" ) -`MPRco( VGJ ,1.15 ,"" ,0.1 ,inf ,"Band-gap voltage recombination emitter-base junction" ) -`MPRco( VGZEB ,1.15 ,"" ,0.1 ,inf ,"Band-gap voltage at Tref of Zener effect emitter-base junction" ) -`MPRoo( AVGEB ,4.73e-4 ,"" ,-inf ,inf ,"Temperature coefficient band-gap voltage for Zener effect emitter-base junction" ) -`MPRco( TVGEB ,636.0 ,"" ,0.0 ,inf ,"Temperature coefficient band-gap voltage for Zener effect emitter-base junction" ) -`MPRnb( DVGTE ,0.05 ,"" ,"Band-gap voltage difference of emitter stored charge" ) -`MPRnb( DAIS ,0.0 ,"" ,"Fine tuning of temperature dependence of C-E saturation current" ) -`MPRco( AF ,2.0 ,"" ,0.01 ,inf ,"Exponent of the Flicker-noise" ) -`MPRco( KF ,20.0p ,"" ,0.0 ,inf ,"Flicker-noise coefficient of the ideal base current" ) -`MPRco( KFN ,20.0p ,"" ,0.0 ,inf ,"Flicker-noise coefficient of the non-ideal base current" ) -`MPIcc( KAVL ,0 ,"" ,0 ,1 ,"Switch for white noise contribution due to avalanche" ) -`MPIcc( KC ,0 ,"" ,0 ,2 ,"Switch for RF correlation noise model selection" ) -`MPRcc( KE ,0.0 ,"" ,0.0 ,1.0 ,"Fraction of QE in excess phase shift" ) -`MPRcc( FTAUN ,0.0 ,"" ,0.0 ,1.0 ,"Fraction of noise transit time to total transit time" ) - -`ifdef SUBSTRATE -`MPRco( ISS ,48.0a ,"" ,0.0 ,inf ,"Base-substrate saturation current" ) -`MPRoo( ICSS ,-1.0 ,"" ,-inf ,inf ,"Collector-substrate ideal saturation current" ) -`MPRco( IKS ,250.0u ,"" ,1.0p ,inf ,"Base-substrate high injection knee current" ) -`MPRco( CJS ,315.0f ,"" ,0.0 ,inf ,"Zero-bias collector-substrate depletion capacitance" ) -`MPRoo( VDS ,0.62 ,"" ,0.05 ,inf ,"Collector-substrate diffusion voltage" ) -`MPRoo( PS ,0.34 ,"" ,0.01 ,0.99 ,"Collector-substrate grading coefficient" ) -`MPRco( VGS ,1.20 ,"" ,0.1 ,inf ,"Band-gap voltage of the substrate" ) -`MPRnb( AS ,1.58 ,"" ,"Substrate temperature coefficient" ) -`MPRnb( ASUB ,2.0 ,"" ,"Temperature coefficient for mobility of minorities in the substrate" ) -`endif - -`ifdef SELFHEATING -`MPRoo( RTH ,300.0 ,"" ,0.0 ,inf ,"Thermal resistance" ) -`MPRco( CTH ,3.0n ,"" ,0.0 ,inf ,"Thermal capacitance" ) -`MPRnb( ATH ,0.0 ,"" ,"Temperature coefficient of the thermal resistance" ) -`endif - -`MPRoo( MULT ,1.0 ,"" ,0.0 ,inf ,"Multiplication factor" ) -`MPIty( TYPE ,1 ,"" ,"Flag for NPN (1) or PNP (-1) transistor type" ) -`MPRoc( GMIN ,1.0e-13 ,"" ,0.0 ,1e-10 ,"Minimum conductance" ) - - - - - diff --git a/src/spicelib/devices/adms/mextram/admsva/tscaling.inc b/src/spicelib/devices/adms/mextram/admsva/tscaling.inc deleted file mode 100644 index 53c1d0b94..000000000 --- a/src/spicelib/devices/adms/mextram/admsva/tscaling.inc +++ /dev/null @@ -1,237 +0,0 @@ -// Copyright (c) 2000-2007, NXP Semiconductor -// Copyright (c) 2007-2014, Delft University of Technology -// Copyright (c) 2015, Auburn University -// All rights reserved, see IP_NOTICE_DISCLAIMER_LICENSE for further information. - -// Temperature scaling of parameters - -// The excess transistor temperature due to the self-heating -`ifdef SELFHEATING - Tki = V(dt); - // *** Convergence related smoothing *** - if (Tki < 0.0) begin - Tki = - ln(1.0 - Tki); - end - `linLog(Vdt, Tki, 200.0); - // `min_logexp(Vdt, Tki, 200.0, 10.0); -`else - Vdt = 0.0; -`endif - -// Temperature variables -Tk = Tamb + Vdt; - -tN = Tk / Trk; -Vt = `KBdivQQ * Tk; -Vtr = `KBdivQQ * Trk; -VtINV = 1.0 / Vt; -VtrINV = 1.0 / Vtr; -VdtINV = VtINV - VtrINV; - -lntN = ln(tN) ; - -// begin: RvdT, November 2008, "Zener tunneling model" -// VGZEB_T = VGZEBOK - AVGEB*Tk*Tk / (Tk + TVGEB) ; -`max_logexp(VGZEB_T, VGZEBOK - AVGEB*Tk*Tk / (Tk + TVGEB), 0.05, 0.1) ; - -// end: RvdT, November 2008, "Zener tunneling model" - -// Depletion capacitances - -UdeT = -3.0 * Vt * ln(tN) + VDE * tN + (1.0 - tN) * VGB; -`max_logexp(VDE_T, `VDLOW, UdeT, Vt); - -UdcT = -3.0 * Vt * ln(tN) + VDC * tN + (1.0 - tN) * VGC; -`max_logexp(VDC_T, `VDLOW, UdcT, Vt); - -`ifdef SUBSTRATE - UdsT = -3.0 * Vt * ln(tN) + VDS * tN + (1.0 - tN) * VGS; - `max_logexp(VDS_T, `VDLOW, UdsT, Vt); -`endif -inv_VDE_T = 1.0 / VDE_T ; -CJE_T_div_CJE = pow(VDE * inv_VDE_T, PE); -CJE_T = CJE * CJE_T_div_CJE ; - -`ifdef SUBSTRATE - CJS_T = CJS * pow(VDS / VDS_T, PS); -`endif - -CJCscale = ((1.0 - XP) * pow(VDC / VDC_T, PC) + XP); -CJCscaleINV = 1.0 / CJCscale; - -CJC_T = CJC * CJCscale; -XP_T = XP * CJCscaleINV; - -// Resistances - -// RvdT, November 2008: -// Instead of the following definition -// RE_T = RE * pow(tN, AE); -// we use, here, and in all following powers of tN, -// the following computationally cheaper implementation: -RE_T = RE * exp(lntN * AE); -// This is based on the observation that exp() is faster than pow(). -// Acknowledgement due to Geoffrey Coram. - -RBV_T = RBV * exp(lntN * (AB - AQBO)); -RBC_T = RBC * exp(lntN * AEX); - -// RvdT, 30-11-2007: new collector resistances RCCxx_T, RCCex_T, RCCin_T -RCCxx_T = RCC * exp(lntN * AC); -RCCex_T = RCBLX * exp(lntN * ACBL); -RCCin_T = RCBLI * exp(lntN * ACBL); - -RCV_T = RCV * exp(lntN * AEPI); - -// Current gains - -BF_T = BF * exp(lntN * (AE - AB - AQBO)) * exp(-DVGBF * VdtINV); -BRI_T = BRI * exp(-DVGBR * VdtINV); - -// Currents and voltages - -IS_T = IS * exp(lntN * (4.0 - AB - AQBO + DAIS)) * exp(-VGB * VdtINV); -IK_T = IK * exp(lntN * (1.0 - AB)); -IBF_T = IBF * exp(lntN * (6.0 - 2.0 * MLF)) * exp(-VGJ * VdtINV / MLF); -IBR_T = IBR * tN * tN * exp(-VGC * VdtINV / 2.0); - -// begin RvdT, November 2008, MXT504.8_alpha -// T-scaling BE tunneling: -// -x = pow(VGZEB_T * inv_VGZEB_Tr, -0.5) ; -// y = pow(VDE_T * inv_VDE, PE) ; -// more efficient, because we need both y and 1.0 / y: -y = 1.0 / CJE_T_div_CJE ; -// definition: -// nZEB_T = NZEB* pow(VGZEB_T/VGZEB_Tr, 1.5) * pow(VDE_T / VDE, PE-1) ; -// more efficient implementation: -// nZEB_T = NZEB* VGZEB_T * VGZEB_T * x * y * VDE /(VDE_T*VGZEB_Tr*VGZEB_Tr) ; -nZEB_T = NZEB* VGZEB_T * VGZEB_T * x * y * VDE * inv_VDE_T*inv_VGZEB_Tr*inv_VGZEB_Tr ; - -// definition: -// IZEB_T = IZEB* pow(VGZEB_T/VGZEB_Tr, -0.5) * pow(VDE_T / VDE, 2-PE) * exp(NZEB-nZEB_T); -// more efficient implementation: -IZEB_T = IZEB* x * VDE_T * VDE_T * inv_VDE * inv_VDE * CJE_T_div_CJE * exp(NZEB-nZEB_T) ; -// -// end RvdT, November 2008, MXT504.8_alpha - -x = exp(lntN * AQBO) ; -VEF_T = VEF * x * CJCscaleINV; -// VER_T = VER * x * pow(VDE / VDE_T, -PE); -VER_T = VER * x * y; - -`ifdef SUBSTRATE - ISS_T = ISS * exp(lntN * (4.0 - AS)) * exp(-VGS * VdtINV); - // New 504.9: - ICSS_T = ICSS * exp(lntN * (3.5 - 0.5 * ASUB)) * exp(-VGS * VdtINV); - // End New 504.9. - - if ((ISS_T > 0.0)) - IKS_T = IKS * exp(lntN * (1.0 - AS)) * (IS_T / IS) * (ISS / ISS_T); - else - IKS_T = IKS * exp(lntN * (1.0 - AS)); -`endif - -// Transit times - -TAUE_T = TAUE * exp(lntN * (AB - 2.0)) * exp(-DVGTE * VdtINV); -TAUB_T = TAUB * exp(lntN * (AQBO + AB - 1.0)); -TEPI_T = TEPI * exp(lntN * (AEPI - 1.0)); -TAUR_T = TAUR * (TAUB_T + TEPI_T) / (TAUB + TEPI); - -// Avalanche constant - -Tk300 = Tk - 300.0; -// RvdT, 15-02-2008: prevent division by zero and overflow at high temperatures: -if (Tk < 525.0) -begin - BnT = Bn * (1.0 + 7.2e-4 * Tk300 - 1.6e-6 * Tk300 * Tk300) ; -end -else -begin - BnT = Bn * 1.081 ; -end - -// Heterojunction features - -DEG_T = DEG * exp(lntN * AQBO); - -`ifdef SELFHEATING - // Temperature scaling of the thermal resistance - - RTH_Tamb = RTH * pow(Tamb / Trk, ATH); -`endif - -// MULT - scaling - -IS_TM = IS_T * MULT; -IK_TM = IK_T * MULT; -IBF_TM = IBF_T * MULT; -IBR_TM = IBR_T * MULT; -// RvdT: November 2008, Zener tunneling parameters -IZEB_TM = IZEB_T * MULT ; - -// end Zener tunneling parameters - - -IHC_M = IHC * MULT; -`ifdef SUBSTRATE - ISS_TM = ISS_T * MULT; - // New: 504.9 - ICSS_TM = ICSS_T * MULT; - IKS_TM = IKS_T * MULT; -`endif -CJE_TM = CJE_T * MULT; -CJC_TM = CJC_T * MULT; - -// begin RvdT, 28-10-2008, MXT504.8_alpha -// Base-emitter tunneling current Mult scaling: -// BTJE_TM = BTJE_T * MULT; -// end RvdT, 28-10-2008, MXT504.8_alpha - - -`ifdef SUBSTRATE - CJS_TM = CJS_T * MULT; -`endif - -RE_TM = RE_T * invMULT; -RBC_TM = RBC_T * invMULT; -RBV_TM = RBV_T * invMULT; -// RvdT, 30-01-2007: new collector resistances: -RCCxx_TM = RCCxx_T * invMULT; -RCCex_TM = RCCex_T * invMULT; -RCCin_TM = RCCin_T * invMULT; -RCV_TM = RCV_T * invMULT; - - -// RvdT, 03-12-2007: new collector conductances -if (RCC > 0.0) -begin - GCCxx_TM = 1.0 / RCCxx_TM ; -end -else -begin - GCCxx_TM = 0 ; -end - -if (RCBLX > 0.0) -begin - GCCex_TM = 1.0 / RCCex_TM ; -end -else -begin - GCCex_TM = 0 ; -end - -if (RCBLI > 0.0) -begin - GCCin_TM = 1.0 / RCCin_TM ; -end -else -begin - GCCin_TM = 0 ; -end - -`ifdef SELFHEATING - RTH_Tamb_M = RTH_Tamb * invMULT; -`endif diff --git a/src/spicelib/devices/adms/mextram/admsva/variables.inc b/src/spicelib/devices/adms/mextram/admsva/variables.inc deleted file mode 100644 index 2298390e2..000000000 --- a/src/spicelib/devices/adms/mextram/admsva/variables.inc +++ /dev/null @@ -1,201 +0,0 @@ -// Copyright (c) 2000-2007, NXP Semiconductor -// Copyright (c) 2007-2014, Delft University of Technology -// Copyright (c) 2015, Auburn University -// All rights reserved, see IP_NOTICE_DISCLAIMER_LICENSE for further information. - -// Declaration of variables - -real _x, _x0, _a, _dxa; - -// Model constants - -real An, Bn; - -// Temperature scaling variables - -real Tk, Trk, tN, Tamb; -real Vt, Vtr, VtINV, VtrINV, VdtINV; -real Vdt; - -real UdeT, VDE_T, UdcT, VDC_T; -real CJE_T, CJC_T, XP_T; -real CJCscale, CJCscaleINV; - -real RE_T, RBV_T, RBC_T, RCV_T; -// RvdT: 30-01-2007, new collector resistances: -real RCCxx_T, RCCex_T, RCCin_T; - -real BF_T, BRI_T; - -real IS_T, IK_T, IBF_T, IBR_T, VEF_T, VER_T; - -// RvdT: November 2008, Zener tunneling parameters and variables: -real Izteb, IZEB_T, E0BE, dE0BE,nZEB_T, pow2_2mPE, pow2_PEm2, inv_VDE, inv_VDE_T; -real eZEB, edZEB, DZEB, VGZEB_T, VGZEB_Tr, inv_VGZEB_Tr, CJE_T_div_CJE ; - -// RvdT: March 2009, Zener tunneling parameters and variables: -real VGZEBOK; - -// end Zener tunneling parameters - -real TAUE_T, TAUB_T, TEPI_T, TAUR_T; -real BnT, DEG_T, Tk300; - -`ifdef SELFHEATING -real RTH_Tamb; -`endif - -`ifdef SUBSTRATE -real UdsT, VDS_T, CJS_T, ISS_T, ICSS_T, IKS_T; -`endif - -// MULT - scaling variables - -real invMULT; -real IS_TM, IK_TM, IBF_TM, IBR_TM, IHC_M; -// RvdT: November 2008, Zener tunneling parameters -real IZEB_TM ; - -// end Zener tunneling parameters - - - - -real CJE_TM, CJC_TM; - -real RE_TM, RBC_TM, RBV_TM, RCV_TM, SCRCV_M; -// RvdT: 30-01-2007, new collector resistances: -real RCCxx_TM, RCCex_TM, RCCin_TM; -// RvdT: 03-12-2007, new collector conductances: -real GCCxx_TM, GCCex_TM, GCCin_TM; - - -real KF_M, KFN_M; - -`ifdef SELFHEATING -real RTH_Tamb_M, CTH_M; -`endif - -`ifdef SUBSTRATE -real ISS_TM, ICSS_TM, IKS_TM, CJS_TM; -`endif - - -// Epilayer model variables - -real K0, Kw, pW, Ec, Ic1c2; -real Vqs_th, Vqs, Iqs; -real alpha, vyi, yi, xi_w, xi_w1; -real gp0, gp02, p0star, Vb2c2star, eVb2c2star; -real B1, B2, Vxi0, Vch, Icap, pav; - -// Effective emitter and collector junction bias variables - -real Vfe, Vje, Vte; -real Vjunc, bjc, Vfc, Vjc, fI, Vcv, Vtc; - -// Transfer current variables - -real If0, f1, f2, n0, nB; -real q0I, q1I, qBI, Ir, If, In; - -// Base and substrate current(s) variables - -real Xext1; -real Ib1, Ib1_s, Ib2, Ib3; -real Ibf0, Iex; -real g1, g2, pWex, nBex; -real Xg1, XnBex, XIMex, XIMsub, Vex, VBex, Fex, XIex; - -`ifdef SUBSTRATE -real Isub, XIsub, Isf; -`endif - -// Distributed base effects variables - -real q0Q, q1Q, qBQ, Rb2, Ib1b2; -real dVteVb2e1, dVteVje, dVjeVb2e1; -real dQteVb2e1, dQbeVb2e1, dQeVb2e1; -real dn0Vb2e1; - -// Weak-avalanche current variables - -real dEdx0, xd, Weff, Wd, Eav, E0, Em, SHw, Efi, Ew; -real lambda, Gem, Gmax, Iavl; -real Icap_IHC; - -`ifdef SELFHEATING -real Tki, power_dis; -`endif - -// Charges and capacitances variables - -real Qte, Vje_s, Qte_s; -real Qtc; -real Qb0, Qbe, Qbc, Qb1b2; -real Qbe_qs, Qbc_qs; -real Vjcex, Vtexv, Qtex, XVjcex, XVtexv, XQtex; - -`ifdef SUBSTRATE -real Vfs, Vjs, Qts; -`endif - -real Qe0, Qe; -real Qe_qs; -real Qepi0, Qepi, Xg2, XpWex, XQex; -real Qex; -real CBEO_M, CBCO_M; - -// Biases and exponential terms variables - -real Vb2c1, Vb2c2, Vb2e1, Vb1e1, Vb1b2, Vb1c4, Vc1c2; -real Vc3c4, Vc4c1; -`ifdef SUBSTRATE -real Vsc1, Vsc3, Vsc4, eVsc1, eVsc3, eVsc4; -`endif -real Vee1, Vbb1, Vbc3, Vcc3, Vbe, Vbc; -real eVb2c2, eVb2e1, eVb1e1, eVb1b2, eVb1c4, eVbc3; -real eVb1c4VDC, eVb2c2VDC, eVbc3VDC, eVb2c1VDC; - -// Help variables - -// RvdT, November 2008, lntN introduced to speed up T-scaling: -// Acknowledgements due to Geoffrey Coram -real lntN ; - -// RvdT, November 2008 variables for local use; may be re-used globally: -real x, y ; - -real dxa, sqr_arg; -real eps2, x2; -real alpha1, vdif, Ic1c2_Iqs, gp0_help; -real EmEav_Em, Vb2e1Vfe, termE, termC; -real Vex_bias; -real eps_VDC, a_VDE, a_VDC; - -real expl, tmpExp, tmpV; - - -`ifdef SUBSTRATE -real a_VDS; -`endif - -// Noise variables -real common; -real powerREC, powerRBC, powerRCCxx, powerRCCex, powerRCCin, powerRBV; -real powerCCS; -real powerFBCS, powerFBC1fB1, exponentFBC1fB2, powerFBC1fB2; -real powerEBSCS, powerEBSC1f; -real powerRBCS, powerRBC1f; -real powerExCS, powerExCSMOD, powerExC1f, powerExC1fMOD; -real powerIIS; - -`ifdef SUBSTRATE -real powerSubsCS_B1S, powerSubsCS_BS; -`endif - -// noise correlation help variables -real In_N, Gem_N, Taub_N, taun, Qbe_qs_eff; - -real my_gmin; - diff --git a/src/spicelib/devices/adms/psp102/admsva/Common102_macrodefs.include b/src/spicelib/devices/adms/psp102/admsva/Common102_macrodefs.include deleted file mode 100644 index 6f1ae5040..000000000 --- a/src/spicelib/devices/adms/psp102/admsva/Common102_macrodefs.include +++ /dev/null @@ -1,135 +0,0 @@ -//====================================================================================== -//====================================================================================== -// Filename: Common102_macrodefs.include -//====================================================================================== -//====================================================================================== -// -// (c) Copyright notice -// -// Since 2012 until today, PSP has been co-developed by NXP Semiconductors and -// Delft University of Technology. For this part of the model, each claim undivided -// ownership and copyrights -// Until and including 2011, PSP has been co-developed by NXP Semiconductors and -// Arizona State University. For this part of the model, NXP Semiconductors claims -// undivided ownership and copyrights. -// -// -// Version: 102.5.0 (PSP), 200.4.0 (JUNCAP), December 2013 -// -//====================================================================================== -//====================================================================================== -// -// Further information can be found in the file releasenotesPSP102.txt -// - -////////////////////////////////////////////////////////////// -// -// General macros and constants for compact va-models -// -////////////////////////////////////////////////////////////// - -`define VERS "0.0" -`define VREV "0.0" -`define VERSreal 0.0 -`define VREVreal 0.0 - -`define CLIP_LOW(val,min) ((val)>(min)?(val):(min)) -`define CLIP_HIGH(val,max) ((val)<(max)?(val):(max)) -`define CLIP_BOTH(val,min,max) ((val)>(min)?((val)<(max)?(val):(max)):(min)) - -`define PGIVEN(p) $param_given(p) -// Note 1: In this va-code, the `P-macro is defined such that its argument -// is ignored during compilation; in this source code it acts as -// a comment -// Note 2: In this va-code, the "from" keyword in the parameter -// list is not used. Silent clipping is used instead. One could enable -// the Verilog-A range checking by redefining the `from-macro below. -`ifdef insideADMS - `define P(txt) (*txt*) - `define INITIAL_MODEL @(initial_model) - `define INITIAL_INSTANCE @(initial_instance) - `define from(lower,upper) from [lower:upper] -`else - `define P(txt) - `define INITIAL_MODEL - `define INITIAL_INSTANCE - `define from(lower,upper) -`endif - -// Some functions -`define MAX(x,y) ((x)>(y)?(x):(y)) -`define MIN(x,y) ((x)<(y)?(x):(y)) - -// Mathematical constants -`define PI 3.1415926535897931 -`define SQRTPI 1.77245385090551603 - -// Physical constants -`define KELVINCONVERSION 273.15 -`define KBOL 1.3806505E-23 -`define QELE 1.6021918E-19 -`define HBAR 1.05457168E-34 -`define MELE 9.1093826E-31 -`define EPSO 8.8541878176E-12 -`define EPSRSI 11.8 - -// Other constants -`define oneThird 3.3333333333333333e-01 -`define twoThirds 6.6666666666666667e-01 - -// Constants needed in safe exponential function (called "expl") -`define se 4.6051701859880916e+02 -`define se05 2.3025850929940458e+02 -`define ke 1.0e-200 -`define ke05 1.0e-100 -`define keinv 1.0e200 -`define ke05inv 1.0e100 - -///////////////////////////////////////////////////////////////////////////// -// -// Macro definitions. -// -// Note that because variables in macros are not locally scoped, -// the intermediate variables used in the macros below must be -// explicitly declared in the main code. -// -///////////////////////////////////////////////////////////////////////////// - - -// P3 3rd order polynomial expansion of exp() -`define P3(u) (1.0 + (u) * (1.0 + 0.5 * ((u) * (1.0 + (u) * `oneThird)))) - - -// expl exp() with 3rd order polynomial extrapolation -// for very low values (exp_low), very high -// values (exp_high), or both (expl), to avoid overflows -// and underflows and retain C-3 continuity -`define expl(x, res) \ - if (abs(x) < `se05) begin\ - res = exp(x); \ - end else begin \ - if ((x) < -`se05) begin\ - res = `ke05 / `P3(-`se05 - (x)); \ - end else begin\ - res = `ke05inv * `P3((x) - `se05); \ - end \ - end - -`define expl_low(x, res) \ - if ((x) > -`se05) begin\ - res = exp(x); \ - end else begin\ - res = `ke05 / `P3(-`se05 - (x)); \ - end - -`define expl_high(x, res) \ - if ((x) < `se05) begin\ - res = exp(x); \ - end else begin \ - res = `ke05inv * `P3((x) - `se05); \ - end - -`define swap(a, b) \ - temp = a; \ - a = b; \ - b = temp; diff --git a/src/spicelib/devices/adms/psp102/admsva/IP_ACKNOWLEDGMENT b/src/spicelib/devices/adms/psp102/admsva/IP_ACKNOWLEDGMENT deleted file mode 100644 index b6c9b96d6..000000000 --- a/src/spicelib/devices/adms/psp102/admsva/IP_ACKNOWLEDGMENT +++ /dev/null @@ -1,12 +0,0 @@ -PSP Acknowledgement and Copyright Notice -======================================== - -Copyrights of PSP are with NXP Semiconductors, Delft University of -Technology (since 2012) and Arizona State University (until and -including 2011). - -Since 2012 until today PSP has been co-developed by NXP Semiconductors -and Delft University of Technology. Until and including 2011 PSP has -been co-developed by NXP Semiconductors and Arizona State University. - -See also: http://psp.ewi.tudelft.nl/page_Copyright_Disclaimer.php diff --git a/src/spicelib/devices/adms/psp102/admsva/IP_NOTICE_DISCLAIMER_LICENSE b/src/spicelib/devices/adms/psp102/admsva/IP_NOTICE_DISCLAIMER_LICENSE deleted file mode 100644 index 093caf280..000000000 --- a/src/spicelib/devices/adms/psp102/admsva/IP_NOTICE_DISCLAIMER_LICENSE +++ /dev/null @@ -1,62 +0,0 @@ -INTELLECTUAL PROPERTY NOTICE, DISCLAIMER AND LICENSE - -The compact model software and documentation presented at this website -form a whole that will henceforth be denoted as the "Model". - -The Model presented at this website has been co-developed by NXP -Semiconductors and Arizona State University until and including 2011. -For this part of the Model, NXP Semiconductors claims undivided -ownership and copyrights. - -Since 2012 until today the Model has been co-developed by -NXP Semiconductors and Delft University of Technology and -for this part each claim undivided ownership and copyrights. - - -DISCLAIMER - -The owners are fully free to further develop, adapt and extend the -Model as they judge necessary or desirable. - -The Model is distributed as is, completely without any express or -implied warranty, or service support. The owners and their employees -are not liable in any way for the condition or performance of the -Model. The owners hereby disclaim all implied warranties. - - -LICENSE - - -NXP Semiconductors and Delft University of Technology hereby grant -users a perpetual, irrevocable, worldwide, non-exclusive, royalty-free -license with respect to Versions of the Model which have been released -through this website http://psp.ewi.tudelft.nl. - -NXP Semiconductors and Delft University of Technology grant the users -the right to modify, copy and redistribute the Model, both within the -user's organization and externally, subject to the following -restrictions. - - -RESTRICTIONS - -1. The users agree not to charge for the Model itself but may -charge for additions, extensions, or support. - -2. In any product based on the Model, the users agree to acknowledge -the owners as developers of the Model. This acknowledgment shall -appear in the product documentation. - -3. The users agree to only use the name of CMC standard models to -identify implementations of the CMC standard models which produce the -same outputs as Standard code for the same inputs passing all CMC QA -tests. - -4. The users agree to obey all government restrictions governing -redistribution or export of the software. - -5. The users agree to reproduce any copyright notice which appears on -the software and documentation on any copy or modification of such -made available to others. - - diff --git a/src/spicelib/devices/adms/psp102/admsva/JUNCAP200_InitModel.include b/src/spicelib/devices/adms/psp102/admsva/JUNCAP200_InitModel.include deleted file mode 100644 index af095a22b..000000000 --- a/src/spicelib/devices/adms/psp102/admsva/JUNCAP200_InitModel.include +++ /dev/null @@ -1,404 +0,0 @@ -//====================================================================================== -//====================================================================================== -// Filename: JUNCAP200_InitModel.include -//====================================================================================== -//====================================================================================== -// -// (c) Copyright notice -// -// Since 2012 until today, PSP has been co-developed by NXP Semiconductors and -// Delft University of Technology. For this part of the model, each claim undivided -// ownership and copyrights -// Until and including 2011, PSP has been co-developed by NXP Semiconductors and -// Arizona State University. For this part of the model, NXP Semiconductors claims -// undivided ownership and copyrights. -// -// -// Version: 102.5.0 (PSP), 200.4.0 (JUNCAP), December 2013 -// -//====================================================================================== -//====================================================================================== -// -// Further information can be found in the file releasenotesPSP102.txt -// - -////////////////////////////////////////////////////////////// -// -// Calculation of internal parameters which are independent -// on instance parameters -// -////////////////////////////////////////////////////////////// - -TRJ_i = `CLIP_LOW( TRJ , `TRJ_cliplow); -IMAX_i = `CLIP_LOW( IMAX , `IMAX_cliplow); - -CJORBOT_i = `CLIP_LOW( CJORBOT , `CJORBOT_cliplow); -CJORSTI_i = `CLIP_LOW( CJORSTI , `CJORSTI_cliplow); -CJORGAT_i = `CLIP_LOW( CJORGAT , `CJORGAT_cliplow); -VBIRBOT_i = `CLIP_LOW( VBIRBOT , `VBIR_cliplow); -VBIRSTI_i = `CLIP_LOW( VBIRSTI , `VBIR_cliplow); -VBIRGAT_i = `CLIP_LOW( VBIRGAT , `VBIR_cliplow); -PBOT_i = `CLIP_BOTH(PBOT , `P_cliplow,`P_cliphigh); -PSTI_i = `CLIP_BOTH(PSTI , `P_cliplow,`P_cliphigh); -PGAT_i = `CLIP_BOTH(PGAT , `P_cliplow,`P_cliphigh); -PHIGBOT_i = PHIGBOT; -PHIGSTI_i = PHIGSTI; -PHIGGAT_i = PHIGGAT; -IDSATRBOT_i = `CLIP_LOW( IDSATRBOT , `IDSATR_cliplow); -IDSATRSTI_i = `CLIP_LOW( IDSATRSTI , `IDSATR_cliplow); -IDSATRGAT_i = `CLIP_LOW( IDSATRGAT , `IDSATR_cliplow); -CSRHBOT_i = `CLIP_LOW( CSRHBOT , `CSRH_cliplow); -CSRHSTI_i = `CLIP_LOW( CSRHSTI , `CSRH_cliplow); -CSRHGAT_i = `CLIP_LOW( CSRHGAT , `CSRH_cliplow); -XJUNSTI_i = `CLIP_LOW( XJUNSTI , `XJUN_cliplow); -XJUNGAT_i = `CLIP_LOW( XJUNGAT , `XJUN_cliplow); -CTATBOT_i = `CLIP_LOW( CTATBOT , `CTAT_cliplow); -CTATSTI_i = `CLIP_LOW( CTATSTI , `CTAT_cliplow); -CTATGAT_i = `CLIP_LOW( CTATGAT , `CTAT_cliplow); -MEFFTATBOT_i = `CLIP_LOW( MEFFTATBOT , `MEFFTAT_cliplow); -MEFFTATSTI_i = `CLIP_LOW( MEFFTATSTI , `MEFFTAT_cliplow); -MEFFTATGAT_i = `CLIP_LOW( MEFFTATGAT , `MEFFTAT_cliplow); -CBBTBOT_i = `CLIP_LOW( CBBTBOT , `CBBT_cliplow); -CBBTSTI_i = `CLIP_LOW( CBBTSTI , `CBBT_cliplow); -CBBTGAT_i = `CLIP_LOW( CBBTGAT , `CBBT_cliplow); -FBBTRBOT_i = FBBTRBOT; -FBBTRSTI_i = FBBTRSTI; -FBBTRGAT_i = FBBTRGAT; -STFBBTBOT_i = STFBBTBOT; -STFBBTSTI_i = STFBBTSTI; -STFBBTGAT_i = STFBBTGAT; -VBRBOT_i = `CLIP_LOW( VBRBOT , `VBR_cliplow); -VBRSTI_i = `CLIP_LOW( VBRSTI , `VBR_cliplow); -VBRGAT_i = `CLIP_LOW( VBRGAT , `VBR_cliplow); -PBRBOT_i = `CLIP_LOW( PBRBOT , `PBR_cliplow); -PBRSTI_i = `CLIP_LOW( PBRSTI , `PBR_cliplow); -PBRGAT_i = `CLIP_LOW( PBRGAT , `PBR_cliplow); - -SWJUNEXP_i = 0.0; -if (SWJUNEXP > 0.5) begin - SWJUNEXP_i = 1.0; -end else begin - SWJUNEXP_i = 0.0; -end - -VJUNREF_i = `CLIP_LOW( VJUNREF , `VJUNREF_cliplow); -FJUNQ_i = `CLIP_LOW( FJUNQ , `FJUNQ_cliplow); - -`ifdef JUNCAP_StandAlone - // do nothing -`else // JUNCAP_StandAlone - if (SWJUNASYM == 0.0) begin - CJORBOTD_i = CJORBOT_i; - CJORSTID_i = CJORSTI_i; - CJORGATD_i = CJORGAT_i; - VBIRBOTD_i = VBIRBOT_i; - VBIRSTID_i = VBIRSTI_i; - VBIRGATD_i = VBIRGAT_i; - PBOTD_i = PBOT_i; - PSTID_i = PSTI_i; - PGATD_i = PGAT_i; - PHIGBOTD_i = PHIGBOT_i; - PHIGSTID_i = PHIGSTI_i; - PHIGGATD_i = PHIGGAT_i; - IDSATRBOTD_i = IDSATRBOT_i; - IDSATRSTID_i = IDSATRSTI_i; - IDSATRGATD_i = IDSATRGAT_i; - CSRHBOTD_i = CSRHBOT_i; - CSRHSTID_i = CSRHSTI_i; - CSRHGATD_i = CSRHGAT_i; - XJUNSTID_i = XJUNSTI_i; - XJUNGATD_i = XJUNGAT_i; - CTATBOTD_i = CTATBOT_i; - CTATSTID_i = CTATSTI_i; - CTATGATD_i = CTATGAT_i; - MEFFTATBOTD_i = MEFFTATBOT_i; - MEFFTATSTID_i = MEFFTATSTI_i; - MEFFTATGATD_i = MEFFTATGAT_i; - CBBTBOTD_i = CBBTBOT_i; - CBBTSTID_i = CBBTSTI_i; - CBBTGATD_i = CBBTGAT_i; - FBBTRBOTD_i = FBBTRBOT_i; - FBBTRSTID_i = FBBTRSTI_i; - FBBTRGATD_i = FBBTRGAT_i; - STFBBTBOTD_i = STFBBTBOT_i; - STFBBTSTID_i = STFBBTSTI_i; - STFBBTGATD_i = STFBBTGAT_i; - VBRBOTD_i = VBRBOT_i; - VBRSTID_i = VBRSTI_i; - VBRGATD_i = VBRGAT_i; - PBRBOTD_i = PBRBOT_i; - PBRSTID_i = PBRSTI_i; - PBRGATD_i = PBRGAT_i; - VJUNREFD_i = VJUNREF_i; - FJUNQD_i = FJUNQ_i; - end else begin - CJORBOTD_i = `CLIP_LOW( CJORBOTD , `CJORBOT_cliplow); - CJORSTID_i = `CLIP_LOW( CJORSTID , `CJORSTI_cliplow); - CJORGATD_i = `CLIP_LOW( CJORGATD , `CJORGAT_cliplow); - VBIRBOTD_i = `CLIP_LOW( VBIRBOTD , `VBIR_cliplow); - VBIRSTID_i = `CLIP_LOW( VBIRSTID , `VBIR_cliplow); - VBIRGATD_i = `CLIP_LOW( VBIRGATD , `VBIR_cliplow); - PBOTD_i = `CLIP_BOTH(PBOTD , `P_cliplow,`P_cliphigh); - PSTID_i = `CLIP_BOTH(PSTID , `P_cliplow,`P_cliphigh); - PGATD_i = `CLIP_BOTH(PGATD , `P_cliplow,`P_cliphigh); - PHIGBOTD_i = PHIGBOTD; - PHIGSTID_i = PHIGSTID; - PHIGGATD_i = PHIGGATD; - IDSATRBOTD_i = `CLIP_LOW( IDSATRBOTD , `IDSATR_cliplow); - IDSATRSTID_i = `CLIP_LOW( IDSATRSTID , `IDSATR_cliplow); - IDSATRGATD_i = `CLIP_LOW( IDSATRGATD , `IDSATR_cliplow); - CSRHBOTD_i = `CLIP_LOW( CSRHBOTD , `CSRH_cliplow); - CSRHSTID_i = `CLIP_LOW( CSRHSTID , `CSRH_cliplow); - CSRHGATD_i = `CLIP_LOW( CSRHGATD , `CSRH_cliplow); - XJUNSTID_i = `CLIP_LOW( XJUNSTID , `XJUN_cliplow); - XJUNGATD_i = `CLIP_LOW( XJUNGATD , `XJUN_cliplow); - CTATBOTD_i = `CLIP_LOW( CTATBOTD , `CTAT_cliplow); - CTATSTID_i = `CLIP_LOW( CTATSTID , `CTAT_cliplow); - CTATGATD_i = `CLIP_LOW( CTATGATD , `CTAT_cliplow); - MEFFTATBOTD_i = `CLIP_LOW( MEFFTATBOTD, `MEFFTAT_cliplow); - MEFFTATSTID_i = `CLIP_LOW( MEFFTATSTID, `MEFFTAT_cliplow); - MEFFTATGATD_i = `CLIP_LOW( MEFFTATGATD, `MEFFTAT_cliplow); - CBBTBOTD_i = `CLIP_LOW( CBBTBOTD , `CBBT_cliplow); - CBBTSTID_i = `CLIP_LOW( CBBTSTID , `CBBT_cliplow); - CBBTGATD_i = `CLIP_LOW( CBBTGATD , `CBBT_cliplow); - FBBTRBOTD_i = FBBTRBOTD; - FBBTRSTID_i = FBBTRSTID; - FBBTRGATD_i = FBBTRGATD; - STFBBTBOTD_i = STFBBTBOTD; - STFBBTSTID_i = STFBBTSTID; - STFBBTGATD_i = STFBBTGATD; - VBRBOTD_i = `CLIP_LOW( VBRBOTD , `VBR_cliplow); - VBRSTID_i = `CLIP_LOW( VBRSTID , `VBR_cliplow); - VBRGATD_i = `CLIP_LOW( VBRGATD , `VBR_cliplow); - PBRBOTD_i = `CLIP_LOW( PBRBOTD , `PBR_cliplow); - PBRSTID_i = `CLIP_LOW( PBRSTID , `PBR_cliplow); - PBRGATD_i = `CLIP_LOW( PBRGATD , `PBR_cliplow); - VJUNREFD_i = `CLIP_LOW( VJUNREFD , `VJUNREF_cliplow); - FJUNQD_i = `CLIP_LOW( FJUNQD , `FJUNQ_cliplow); - end -`endif // JUNCAP_StandAlone - -tkr = `KELVINCONVERSION + TRJ_i; -tkd = max($temperature + DTA, `KELVINCONVERSION + `MINTEMP); -auxt = tkd / tkr; -KBOL_over_QELE = `KBOL / `QELE; -phitr = KBOL_over_QELE * tkr; -phitrinv = 1.0 / phitr; -phitd = KBOL_over_QELE * tkd; -phitdinv = 1.0 / phitd; - -// bandgap voltages at reference temperature -deltaphigr = -(7.02e-4 * tkr * tkr) / (1108.0 + tkr); -phigrbot = PHIGBOT_i + deltaphigr; -phigrsti = PHIGSTI_i + deltaphigr; -phigrgat = PHIGGAT_i + deltaphigr; - -// bandgap voltages at device temperature -deltaphigd = -(7.02e-4 * tkd * tkd) / (1108.0 + tkd); -phigdbot = PHIGBOT_i + deltaphigd; -phigdsti = PHIGSTI_i + deltaphigd; -phigdgat = PHIGGAT_i + deltaphigd; - -// factors ftd for ideal-current model -ftdbot = (pow(auxt, 1.5)) * exp(0.5 * ((phigrbot * phitrinv) - (phigdbot * phitdinv))); -ftdsti = (pow(auxt, 1.5)) * exp(0.5 * ((phigrsti * phitrinv) - (phigdsti * phitdinv))); -ftdgat = (pow(auxt, 1.5)) * exp(0.5 * ((phigrgat * phitrinv) - (phigdgat * phitdinv))); - -// temperature-scaled saturation current for ideal-current model -idsatbot = IDSATRBOT_i * ftdbot * ftdbot; -idsatsti = IDSATRSTI_i * ftdsti * ftdsti; -idsatgat = IDSATRGAT_i * ftdgat * ftdgat; - -// built-in voltages before limiting -ubibot = VBIRBOT_i * auxt - 2 * phitd * ln(ftdbot); -ubisti = VBIRSTI_i * auxt - 2 * phitd * ln(ftdsti); -ubigat = VBIRGAT_i * auxt - 2 * phitd * ln(ftdgat); - -// built-in voltages limited to phitd -vbibot = ubibot + phitd * ln(1 + exp((`vbilow - ubibot) * phitdinv)); -vbisti = ubisti + phitd * ln(1 + exp((`vbilow - ubisti) * phitdinv)); -vbigat = ubigat + phitd * ln(1 + exp((`vbilow - ubigat) * phitdinv)); - -// inverse values of built-in voltages -vbiinvbot = 1.0 / vbibot; -vbiinvsti = 1.0 / vbisti; -vbiinvgat = 1.0 / vbigat; - -// one minus the grading coefficient -one_minus_PBOT = 1 - PBOT_i; -one_minus_PSTI = 1 - PSTI_i; -one_minus_PGAT = 1 - PGAT_i; - -// one over "one minus the grading coefficient" -one_over_one_minus_PBOT = 1 / one_minus_PBOT; -one_over_one_minus_PSTI = 1 / one_minus_PSTI; -one_over_one_minus_PGAT = 1 / one_minus_PGAT; - -// temperature-scaled zero-bias capacitance -cjobot = CJORBOT_i * pow((VBIRBOT_i * vbiinvbot), PBOT_i); -cjosti = CJORSTI_i * pow((VBIRSTI_i * vbiinvsti), PSTI_i); -cjogat = CJORGAT_i * pow((VBIRGAT_i * vbiinvgat), PGAT_i); - -// prefactor in physical part of charge model -qprefbot = cjobot * vbibot * one_over_one_minus_PBOT; -qprefsti = cjosti * vbisti * one_over_one_minus_PSTI; -qprefgat = cjogat * vbigat * one_over_one_minus_PGAT; - -// prefactor in mathematical extension of charge model -qpref2bot = `a * cjobot; -qpref2sti = `a * cjosti; -qpref2gat = `a * cjogat; - -// zero-bias depletion widths at reference temperature, needed in SRH and TAT model -wdepnulrbot = EPSSI / CJORBOT_i; -wdepnulrsti = XJUNSTI_i * EPSSI / CJORSTI_i; -wdepnulrgat = XJUNGAT_i * EPSSI / CJORGAT_i; - -// inverse values of "wdepnulr", used in BBT model -wdepnulrinvbot = 1 / wdepnulrbot; -wdepnulrinvsti = 1 / wdepnulrsti; -wdepnulrinvgat = 1 / wdepnulrgat; - -// inverse values of built-in voltages at reference temperature, needed in SRH and BBT model -VBIRBOTinv = 1 / VBIRBOT_i; -VBIRSTIinv = 1 / VBIRSTI_i; -VBIRGATinv = 1 / VBIRGAT_i; - -// some constants needed in erfc-approximation, needed in TAT model -perfc = (`SQRTPI * `aerfc); -berfc = ((-5 * (`aerfc) + 6 - pow((perfc), -2)) / 3.0); -cerfc = (1.0 - (`aerfc) - (berfc)); - -// half the bandgap energy, limited to values > phitd, needed in TAT model -deltaEbot = max(0.5 * phigdbot, phitd); -deltaEsti = max(0.5 * phigdsti, phitd); -deltaEgat = max(0.5 * phigdgat, phitd); - -// values of atat, needed in TAT model -atatbot = deltaEbot * phitdinv; -atatsti = deltaEsti * phitdinv; -atatgat = deltaEgat * phitdinv; - -// values of btatpart, needed in TAT model -btatpartbot = sqrt(32 * MEFFTATBOT_i * `MELE * `QELE * (deltaEbot * deltaEbot * deltaEbot)) / (3 * `HBAR); -btatpartsti = sqrt(32 * MEFFTATSTI_i * `MELE * `QELE * (deltaEsti * deltaEsti * deltaEsti)) / (3 * `HBAR); -btatpartgat = sqrt(32 * MEFFTATGAT_i * `MELE * `QELE * (deltaEgat * deltaEgat * deltaEgat)) / (3 * `HBAR); - -// temperature-scaled values of FBBT, needed in BBT model -fbbtbot = FBBTRBOT_i * (1 + STFBBTBOT_i * (tkd - tkr)); -fbbtsti = FBBTRSTI_i * (1 + STFBBTSTI_i * (tkd - tkr)); -fbbtgat = FBBTRGAT_i * (1 + STFBBTGAT_i * (tkd - tkr)); -fbbtbot = `CLIP_LOW(fbbtbot, 0); -fbbtsti = `CLIP_LOW(fbbtsti, 0); -fbbtgat = `CLIP_LOW(fbbtgat, 0); - -// values of fstop, needed in avalanche/breakdown model -fstopbot = 1 / (1 - pow(`alphaav, PBRBOT_i)); -fstopsti = 1 / (1 - pow(`alphaav, PBRSTI_i)); -fstopgat = 1 / (1 - pow(`alphaav, PBRGAT_i)); - -// inverse values of breakdown voltages, needed in avalanche/breakdown model -VBRinvbot = 1 / VBRBOT_i; -VBRinvsti = 1 / VBRSTI_i; -VBRinvgat = 1 / VBRGAT_i; - -// slopes for linear extrapolation close to and beyond breakdown, needed in avalanche/breakdown model -slopebot = -(fstopbot * fstopbot * pow(`alphaav, (PBRBOT_i - 1))) * PBRBOT_i * VBRinvbot; -slopesti = -(fstopsti * fstopsti * pow(`alphaav, (PBRSTI_i - 1))) * PBRSTI_i * VBRinvsti; -slopegat = -(fstopgat * fstopgat * pow(`alphaav, (PBRGAT_i - 1))) * PBRGAT_i * VBRinvgat; - - -`ifdef JUNCAP_StandAlone - // do nothing -`else // JUNCAP_StandAlone - phigrbot_d = PHIGBOTD_i + deltaphigr; - phigrsti_d = PHIGSTID_i + deltaphigr; - phigrgat_d = PHIGGATD_i + deltaphigr; - - phigdbot_d = PHIGBOTD_i + deltaphigd; - phigdsti_d = PHIGSTID_i + deltaphigd; - phigdgat_d = PHIGGATD_i + deltaphigd; - - ftdbot_d = (pow(auxt, 1.5)) * exp(0.5 * ((phigrbot_d * phitrinv) - (phigdbot_d * phitdinv))); - ftdsti_d = (pow(auxt, 1.5)) * exp(0.5 * ((phigrsti_d * phitrinv) - (phigdsti_d * phitdinv))); - ftdgat_d = (pow(auxt, 1.5)) * exp(0.5 * ((phigrgat_d * phitrinv) - (phigdgat_d * phitdinv))); - - idsatbot_d = IDSATRBOTD_i * ftdbot_d * ftdbot_d; - idsatsti_d = IDSATRSTID_i * ftdsti_d * ftdsti_d; - idsatgat_d = IDSATRGATD_i * ftdgat_d * ftdgat_d; - - ubibot_d = VBIRBOTD_i * auxt - 2 * phitd * ln(ftdbot_d); - ubisti_d = VBIRSTID_i * auxt - 2 * phitd * ln(ftdsti_d); - ubigat_d = VBIRGATD_i * auxt - 2 * phitd * ln(ftdgat_d); - - vbibot_d = ubibot_d + phitd * ln(1 + exp((`vbilow - ubibot_d) * phitdinv)); - vbisti_d = ubisti_d + phitd * ln(1 + exp((`vbilow - ubisti_d) * phitdinv)); - vbigat_d = ubigat_d + phitd * ln(1 + exp((`vbilow - ubigat_d) * phitdinv)); - - vbiinvbot_d = 1.0 / vbibot_d; - vbiinvsti_d = 1.0 / vbisti_d; - vbiinvgat_d = 1.0 / vbigat_d; - - one_minus_PBOT_d = 1 - PBOTD_i; - one_minus_PSTI_d = 1 - PSTID_i; - one_minus_PGAT_d = 1 - PGATD_i; - - one_over_one_minus_PBOT_d = 1 / one_minus_PBOT_d; - one_over_one_minus_PSTI_d = 1 / one_minus_PSTI_d; - one_over_one_minus_PGAT_d = 1 / one_minus_PGAT_d; - - cjobot_d = CJORBOTD_i * pow((VBIRBOTD_i * vbiinvbot_d), PBOTD_i); - cjosti_d = CJORSTID_i * pow((VBIRSTID_i * vbiinvsti_d), PSTID_i); - cjogat_d = CJORGATD_i * pow((VBIRGATD_i * vbiinvgat_d), PGATD_i); - - qprefbot_d = cjobot_d * vbibot_d * one_over_one_minus_PBOT_d; - qprefsti_d = cjosti_d * vbisti_d * one_over_one_minus_PSTI_d; - qprefgat_d = cjogat_d * vbigat_d * one_over_one_minus_PGAT_d; - - qpref2bot_d = `a * cjobot_d; - qpref2sti_d = `a * cjosti_d; - qpref2gat_d = `a * cjogat_d; - - wdepnulrbot_d= EPSSI / CJORBOTD_i; - wdepnulrsti_d= XJUNSTID_i * EPSSI / CJORSTID_i; - wdepnulrgat_d= XJUNGATD_i * EPSSI / CJORGATD_i; - - wdepnulrinvbot_d = 1 / wdepnulrbot_d; - wdepnulrinvsti_d = 1 / wdepnulrsti_d; - wdepnulrinvgat_d = 1 / wdepnulrgat_d; - - VBIRBOTinv_d = 1 / VBIRBOTD_i; - VBIRSTIinv_d = 1 / VBIRSTID_i; - VBIRGATinv_d = 1 / VBIRGATD_i; - - deltaEbot_d = max(0.5 * phigdbot_d, phitd); - deltaEsti_d = max(0.5 * phigdsti_d, phitd); - deltaEgat_d = max(0.5 * phigdgat_d, phitd); - - atatbot_d = deltaEbot_d * phitdinv; - atatsti_d = deltaEsti_d * phitdinv; - atatgat_d = deltaEgat_d * phitdinv; - - btatpartbot_d= sqrt(32 * MEFFTATBOTD_i * `MELE * `QELE * (deltaEbot_d * deltaEbot_d * deltaEbot_d)) / (3 * `HBAR); - btatpartsti_d= sqrt(32 * MEFFTATSTID_i * `MELE * `QELE * (deltaEsti_d * deltaEsti_d * deltaEsti_d)) / (3 * `HBAR); - btatpartgat_d= sqrt(32 * MEFFTATGATD_i * `MELE * `QELE * (deltaEgat_d * deltaEgat_d * deltaEgat_d)) / (3 * `HBAR); - - fbbtbot_d = FBBTRBOTD_i * (1 + STFBBTBOTD_i * (tkd - tkr)); - fbbtsti_d = FBBTRSTID_i * (1 + STFBBTSTID_i * (tkd - tkr)); - fbbtgat_d = FBBTRGATD_i * (1 + STFBBTGATD_i * (tkd - tkr)); - fbbtbot_d = `CLIP_LOW(fbbtbot_d, 0); - fbbtsti_d = `CLIP_LOW(fbbtsti_d, 0); - fbbtgat_d = `CLIP_LOW(fbbtgat_d, 0); - - fstopbot_d = 1 / (1 - pow(`alphaav, PBRBOTD_i)); - fstopsti_d = 1 / (1 - pow(`alphaav, PBRSTID_i)); - fstopgat_d = 1 / (1 - pow(`alphaav, PBRGATD_i)); - - VBRinvbot_d = 1 / VBRBOTD_i; - VBRinvsti_d = 1 / VBRSTID_i; - VBRinvgat_d = 1 / VBRGATD_i; - - slopebot_d = -(fstopbot_d * fstopbot_d * pow(`alphaav, (PBRBOTD_i - 1))) * PBRBOTD_i * VBRinvbot_d; - slopesti_d = -(fstopsti_d * fstopsti_d * pow(`alphaav, (PBRSTID_i - 1))) * PBRSTID_i * VBRinvsti_d; - slopegat_d = -(fstopgat_d * fstopgat_d * pow(`alphaav, (PBRGATD_i - 1))) * PBRGATD_i * VBRinvgat_d; -`endif // JUNCAP_StandAlone diff --git a/src/spicelib/devices/adms/psp102/admsva/JUNCAP200_macrodefs.include b/src/spicelib/devices/adms/psp102/admsva/JUNCAP200_macrodefs.include deleted file mode 100644 index e26f0a821..000000000 --- a/src/spicelib/devices/adms/psp102/admsva/JUNCAP200_macrodefs.include +++ /dev/null @@ -1,476 +0,0 @@ -//====================================================================================== -//====================================================================================== -// Filename: JUNCAP200_macrodefs.include -//====================================================================================== -//====================================================================================== -// -// (c) Copyright notice -// -// Since 2012 until today, PSP has been co-developed by NXP Semiconductors and -// Delft University of Technology. For this part of the model, each claim undivided -// ownership and copyrights -// Until and including 2011, PSP has been co-developed by NXP Semiconductors and -// Arizona State University. For this part of the model, NXP Semiconductors claims -// undivided ownership and copyrights. -// -// -// Version: 102.5.0 (PSP), 200.4.0 (JUNCAP), December 2013 -// -//====================================================================================== -//====================================================================================== -// -// Further information can be found in the file releasenotesPSP102.txt -// - -/////////////////////////////////////////// -// -// Macros and constants used in JUNCAP2 -// -/////////////////////////////////////////// - -// Other constants -`define MINTEMP -250 -`define vbilow 0.050 -`define a 2 -`define epsch 0.1 -`define dvbi 0.050 -`define epsav 1E-6 -`define vbrmax 1000 -`define alphaav 0.999 -`define vmaxlarge 1E8 -`define aerfc 0.29214664 -`define twothirds 0.666666666666667 - -// Clipping values -`define levelnumber 200 -`define AB_cliplow 0 -`define LS_cliplow 0 -`define LG_cliplow 0 -`define MULT_cliplow 0 -`define TRJ_cliplow `MINTEMP -`define IMAX_cliplow 1E-12 -`define CJORBOT_cliplow 1E-12 -`define CJORSTI_cliplow 1E-18 -`define CJORGAT_cliplow 1E-18 -`define VBIR_cliplow `vbilow -`define P_cliplow 0.05 -`define P_cliphigh 0.95 -`define IDSATR_cliplow 0 -`define CSRH_cliplow 0 -`define XJUN_cliplow 1E-9 -`define CTAT_cliplow 0 -`define MEFFTAT_cliplow 0.01 -`define CBBT_cliplow 0 -`define VBR_cliplow 0.1 -`define PBR_cliplow 0.1 -`define VJUNREF_cliplow 0.5 -`define FJUNQ_cliplow 0.0 - - -///////////////////////////////////////////////////////////////////////////// -// -// Macro definitions. -// -// Note that because at present locally scoped variables -// can only be in named blocks, the intermediate variables -// used in the macros below must be explicitly declared -// as variables. -// -///////////////////////////////////////////////////////////////////////////// - -// Variable declarations of variables that need to be *local* in juncap-express initialization - -`define LocalGlobalVars \ - /* declaration of variables needed in macro "calcerfcexpmtat" */ \ - real ysq, terfc, erfcpos; \ - \ - /* declaration of variables needed in hypfunction 5 */ \ - real h1, h2, h2d, h3, h4, h5; \ - \ - /* declaration of variables calculated outside macro "juncapfunction", voltage-dependent part */ \ - real idmult, vj, z, zinv, two_psistar, vjlim, vjsrh, vbbt, vav; \ - \ - /* declaration of variables used within macro "juncapfunction" */ \ - real tmp, id; \ - real isrh, vbi_minus_vjsrh, wsrhstep, dwsrh, wsrh, wdep, asrh; \ - real itat, btat, twoatatoverthreebtat, umaxbeforelimiting, umax, sqrtumax, umaxpoweronepointfive; \ - real wgamma, wtat, ktat, ltat, mtat, xerfc, erfctimesexpmtat, gammamax; \ - real ibbt, Fmaxr; \ - real fbreakdown; - - -// Instance parameter dependent initialization - -`define JuncapInitInstance(AB_i, LS_i, LG_i, idsatbot, idsatsti, idsatgat, vbibot, vbisti, vbigat, PBOT_i, PSTI_i, PGAT_i, VBIRBOT_i, VBIRSTI_i, VBIRGAT_i, VMAX, exp_VMAX_over_phitd, vbimin, vch, vfmin, vbbtlim) \ - if (idsatbot * AB_i > 0) begin \ - vmaxbot = phitd * ln(IMAX_i / (idsatbot * AB_i) + 1); \ - end else begin \ - vmaxbot = `vmaxlarge; \ - end \ - if (idsatsti * LS_i > 0) begin \ - vmaxsti = phitd * ln(IMAX_i / (idsatsti * LS_i) + 1); \ - end else begin \ - vmaxsti = `vmaxlarge; \ - end \ - if (idsatgat * LG_i > 0) begin \ - vmaxgat = phitd * ln(IMAX_i / (idsatgat * LG_i) + 1); \ - end else begin \ - vmaxgat = `vmaxlarge; \ - end \ - VMAX = min(min(vmaxbot, vmaxsti), vmaxgat); \ - `expl(VMAX * phitdinv, exp_VMAX_over_phitd) \ - \ - /* determination of minimum value of the relevant built-in voltages */ \ - /* and determination of limiting value of conditioned voltage for BBT calculation */ \ - vbibot2 = vbibot; \ - vbisti2 = vbisti; \ - vbigat2 = vbigat; \ - pbot2 = PBOT_i; \ - psti2 = PSTI_i; \ - pgat2 = PGAT_i; \ - vbibot2r = VBIRBOT_i; \ - vbisti2r = VBIRSTI_i; \ - vbigat2r = VBIRGAT_i; \ - if (AB_i == 0) begin \ - vbibot2 = vbisti + vbigat; \ - pbot2 = 0.9 * min(PSTI_i, PGAT_i); \ - vbibot2r = VBIRSTI_i + VBIRGAT_i; \ - end \ - if (LS_i == 0) begin \ - vbisti2 = vbibot + vbigat; \ - psti2 = 0.9 * min(PBOT_i, PGAT_i); \ - vbisti2r = VBIRBOT_i + VBIRGAT_i; \ - end \ - if (LG_i == 0) begin \ - vbigat2 = vbibot + vbisti; \ - pgat2 = 0.9 * min(PBOT_i, PSTI_i); \ - vbigat2r = VBIRBOT_i + VBIRSTI_i; \ - end \ - vbimin = min(min(vbibot2, vbisti2), vbigat2); \ - vch = vbimin * `epsch; \ - pmax = max(max(pbot2, psti2), pgat2); \ - vfmin = vbimin * (1 - (pow(`a, (-1.0 / (pmax))))); \ - vbbtlim = min(min(vbibot2r, vbisti2r), vbigat2r) - `dvbi; - - -// Special power-functions - -`define mypower(x,power,result) \ - if (power == 0.5) begin \ - result = sqrt(x); \ - end else begin \ - result = pow(x, power); \ - end - -`define mypower2(x,power,result) \ - if (power == -1) begin \ - result = 1 / (x); \ - end else begin \ - result = pow(x, power); \ - end - -`define mypower3(x,power,result) \ - if (power == 4) begin \ - result = (x) * (x) * (x) * (x); \ - end else begin \ - result = pow(x, power); \ - end - - -// Smoothing functions - -`define hypfunction2(x,x0,eps,hyp2) \ - hyp2 = 0.5 * ((x) + (x0) - sqrt(((x) - (x0)) * ((x) - (x0)) + 4 * (eps) * (eps))); - -`define hypfunction5(x,x0,eps,hyp5) \ - h1 = 4.0 * (eps) * (eps); \ - h2 = (eps) / (x0); \ - h2d = (x) + (eps) * h2; \ - h3 = (x0) + h2d; \ - h4 = (x0) - h2d; \ - h5 = sqrt(h4 * h4 + h1); \ - hyp5 = 2.0 * ((x) * (x0) / (h3 + h5)); - - -// A special function used to calculate TAT-currents, -// including an approximation of the erfc-function - -`define calcerfcexpmtat(y,m,result) \ - ysq = y * y; \ - if (y > 0) begin \ - terfc = 1 / (1 + perfc * y); \ - end else begin \ - terfc = 1 / (1 - perfc * y); \ - end \ - `expl_low(-ysq + m, tmp) \ - erfcpos = (`aerfc * terfc + berfc * (terfc * terfc) + cerfc * (terfc * terfc * terfc)) * tmp; \ - if (y > 0) begin \ - result = erfcpos; \ - end else begin\ - `expl_low(m, tmp) \ - result = 2 * tmp - erfcpos; \ - end - - -// This is the main function of the JUNCAP2-model. It returns the current and charge -// for a single diode - -`define juncapfunction(VAK,qpref,qpref2,vbiinv,one_minus_P,idsat,CSRH,CTAT,vbi,wdepnulr,VBIRinv,P,ftd,btatpart,atat,one_over_one_minus_P,CBBT,VBIR,wdepnulrinv,fbbt,VBR,VBRinv,PBR,fstop,slope,Ijprime,Qjprime) \ - `mypower((1 - vj * vbiinv), one_minus_P, tmp) \ - Qjprime = qpref * (1 - tmp) + qpref2 * (VAK - vj); \ - id = idsat * idmult; \ - if ((CSRH == 0) && (CTAT == 0)) begin \ - isrh = 0; \ - end else begin \ - vbi_minus_vjsrh = vbi-vjsrh; \ - wsrhstep = 1 - sqrt(1 - two_psistar / vbi_minus_vjsrh); \ - if (P == 0.5) begin \ - dwsrh = 0; \ - end else begin \ - dwsrh = ((wsrhstep * wsrhstep * ln(wsrhstep) / (1 - wsrhstep)) + wsrhstep) * (1 - 2 * P); \ - end \ - wsrh = wsrhstep + dwsrh; \ - `mypower(vbi_minus_vjsrh * VBIRinv, P, tmp) \ - wdep = wdepnulr * tmp; \ - asrh = ftd * ((zinv - 1) * wdep); \ - isrh = CSRH * (asrh * wsrh); \ - end \ - if (CTAT == 0) begin \ - itat = 0; \ - end else begin \ - btat = btatpart * ((wdep * one_minus_P) / vbi_minus_vjsrh); \ - twoatatoverthreebtat = (`twothirds * atat) / btat; \ - umaxbeforelimiting = twoatatoverthreebtat * twoatatoverthreebtat; \ - umax = sqrt(umaxbeforelimiting * umaxbeforelimiting / (umaxbeforelimiting * umaxbeforelimiting + 1)); \ - sqrtumax = sqrt(abs(umax)); \ - umaxpoweronepointfive = umax * sqrtumax; \ - `mypower2((1 + btat * umaxpoweronepointfive), (-P * one_over_one_minus_P), wgamma) \ - wtat = wsrh * wgamma / (wsrh + wgamma); \ - ktat = sqrt(0.375 * (btat / sqrtumax)); \ - ltat = 2 * (twoatatoverthreebtat * sqrtumax) - umax; \ - mtat = atat * twoatatoverthreebtat * sqrtumax - atat * umax + 0.5 * (btat * umaxpoweronepointfive); \ - xerfc = (ltat - 1) * ktat; \ - `calcerfcexpmtat(xerfc, mtat, erfctimesexpmtat) \ - gammamax = `SQRTPI * 0.5 * (atat * erfctimesexpmtat / ktat); \ - itat = CTAT * (asrh * gammamax * wtat); \ - end \ - if (CBBT == 0) begin \ - ibbt = 0; \ - end else begin \ - `mypower(((VBIR - vbbt) * VBIRinv), P, tmp) \ - Fmaxr = one_over_one_minus_P * ((VBIR - vbbt) * wdepnulrinv / tmp); \ - `expl(-fbbt / Fmaxr, tmp) \ - ibbt = CBBT * (VAK * Fmaxr * Fmaxr * tmp); \ - end \ - if (VBR > `vbrmax) begin \ - fbreakdown = 1; \ - end else begin \ - if (vav > -`alphaav * VBR) begin \ - `mypower3(abs(vav * VBRinv), PBR, tmp) \ - fbreakdown = 1 / (1 - tmp); \ - end else begin \ - fbreakdown = fstop + (vav + `alphaav * VBR) * slope; \ - end \ - end \ - Ijprime = (id + isrh + itat + ibbt) * fbreakdown; - - -// The following code is written as a macro because the naming of the instance parameters is -// different for JUNCAP2 stand-alone and JUNCAP2-in-PSP: AB, LS, LG for JUNCAP2 stand-alone, -// ABSOURCE, LSSOURCE, LGSOURCE for source junction in PSP and ABDRAIN, LSDRAIN, LGDRAIN for -// drain junction in PSP - -`define juncapcommon(V, AB_i, LS_i, LG_i, qprefbot, qpref2bot, vbiinvbot, one_minus_PBOT, idsatbot, CSRHBOT_i, CTATBOT_i, vbibot, wdepnulrbot, VBIRBOTinv, PBOT_i, ftdbot, btatpartbot, atatbot, one_over_one_minus_PBOT, CBBTBOT_i, VBIRBOT_i, wdepnulrinvbot, fbbtbot, VBRBOT_i, VBRinvbot, PBRBOT_i, fstopbot, slopebot, qprefsti, qpref2sti, vbiinvsti, one_minus_PSTI, idsatsti, CSRHSTI_i, CTATSTI_i, vbisti, wdepnulrsti, VBIRSTIinv, PSTI_i, ftdsti, btatpartsti, atatsti, one_over_one_minus_PSTI, CBBTSTI_i, VBIRSTI_i, wdepnulrinvsti, fbbtsti, VBRSTI_i, VBRinvsti, PBRSTI_i, fstopsti, slopesti, qprefgat, qpref2gat, vbiinvgat, one_minus_PGAT, idsatgat, CSRHGAT_i, CTATGAT_i, vbigat, wdepnulrgat, VBIRGATinv, PGAT_i, ftdgat, btatpartgat, atatgat, one_over_one_minus_PGAT, CBBTGAT_i, VBIRGAT_i, wdepnulrinvgat, fbbtgat, VBRGAT_i, VBRinvgat, PBRGAT_i, fstopgat, slopegat, VMAX, exp_VMAX_over_phitd, vbimin, vch, vfmin, vbbtlim, ijunbot, qjunbot, ijunsti, qjunsti, ijungat, qjungat) \ - vbbt = 0.0; \ - two_psistar = 0.0; \ - if ( !( ((AB_i) == 0) && ((LS_i) == 0) && ((LG_i) == 0) ) ) begin \ - `hypfunction5(V, vfmin, vch, vj) \ - if (V < VMAX) begin \ - `expl(0.5 * (V * phitdinv), zinv) \ - idmult = zinv * zinv; \ - end else begin \ - idmult = (1 + (V - VMAX) * phitdinv) * exp_VMAX_over_phitd; \ - zinv = sqrt(idmult); \ - end \ - idmult = idmult - 1.0; \ - z = 1 / zinv; \ - if (V > 0) begin \ - two_psistar = 2.0 * (phitd * ln(2.0 + z + sqrt((z + 1.0) * (z + 3.0)))); \ - end else begin \ - two_psistar = -V + 2.0 * (phitd * ln(2 * zinv + 1 + sqrt((1 + zinv) * (1 + 3 * zinv)))); \ - end \ - vjlim = vbimin - two_psistar; \ - `hypfunction2(V, vjlim, phitd, vjsrh) \ - `hypfunction2(V, vbbtlim, phitr, vbbt) \ - `hypfunction2(V, 0, `epsav, vav) \ - end \ - if ((AB_i) == 0) begin \ - ijunbot = 0; \ - qjunbot = 0; \ - end else begin \ - `juncapfunction(V, qprefbot, qpref2bot, vbiinvbot, one_minus_PBOT, idsatbot, CSRHBOT_i, CTATBOT_i, vbibot, wdepnulrbot, VBIRBOTinv, PBOT_i, ftdbot, btatpartbot, atatbot, one_over_one_minus_PBOT, CBBTBOT_i, VBIRBOT_i, wdepnulrinvbot, fbbtbot, VBRBOT_i, VBRinvbot, PBRBOT_i, fstopbot, slopebot, ijunbot, qjunbot) \ - end \ - if ((LS_i) == 0) begin \ - ijunsti = 0; \ - qjunsti = 0; \ - end else begin \ - `juncapfunction(V, qprefsti, qpref2sti, vbiinvsti, one_minus_PSTI, idsatsti, CSRHSTI_i, CTATSTI_i, vbisti, wdepnulrsti, VBIRSTIinv, PSTI_i, ftdsti, btatpartsti, atatsti, one_over_one_minus_PSTI, CBBTSTI_i, VBIRSTI_i, wdepnulrinvsti, fbbtsti, VBRSTI_i, VBRinvsti, PBRSTI_i, fstopsti, slopesti, ijunsti, qjunsti) \ - end \ - if ((LG_i) == 0) begin \ - ijungat = 0; \ - qjungat = 0; \ - end else begin \ - `juncapfunction(V, qprefgat, qpref2gat, vbiinvgat, one_minus_PGAT, idsatgat, CSRHGAT_i, CTATGAT_i, vbigat, wdepnulrgat, VBIRGATinv, PGAT_i, ftdgat, btatpartgat, atatgat, one_over_one_minus_PGAT, CBBTGAT_i, VBIRGAT_i, wdepnulrinvgat, fbbtgat, VBRGAT_i, VBRinvgat, PBRGAT_i, fstopgat, slopegat, ijungat, qjungat) \ - end - - -//============================================================================================================ -// JUNCAP-express -// -// The macros below are used in the express-version of JUNCAP2 -//============================================================================================================ - -`define relerr 0.001 - -`define P1(x) ((x) + 1) - -`define expll(x, xlow, expxlow, xhigh, expxhigh) \ - ((x) < (xlow)) ? (expxlow) / `P1((xlow) - (x)) : (((x) > (xhigh)) ? (expxhigh) * `P1((x) - (xhigh)) : exp(x)) - - -// The "JuncapExpressInit"-macro below is split into three parts, as some verilog-A compilers cannot handle -// macros beyond a certain size. Moreover, it is useful to limit the list of input and output variables. - -// Part 1 -`define JuncapExpressInit1(AB_i, LS_i, LG_i, VJUNREF_i, qprefbot, qpref2bot, vbiinvbot, one_minus_PBOT, idsatbot, CSRHBOT_i, CTATBOT_i, vbibot, wdepnulrbot, VBIRBOTinv, PBOT_i, ftdbot, btatpartbot, atatbot, one_over_one_minus_PBOT, CBBTBOT_i, VBIRBOT_i, wdepnulrinvbot, fbbtbot, VBRBOT_i, VBRinvbot, PBRBOT_i, fstopbot, slopebot, qprefsti, qpref2sti, vbiinvsti, one_minus_PSTI, idsatsti, CSRHSTI_i, CTATSTI_i, vbisti, wdepnulrsti, VBIRSTIinv, PSTI_i, ftdsti, btatpartsti, atatsti, one_over_one_minus_PSTI, CBBTSTI_i, VBIRSTI_i, wdepnulrinvsti, fbbtsti, VBRSTI_i, VBRinvsti, PBRSTI_i, fstopsti, slopesti, qprefgat, qpref2gat, vbiinvgat, one_minus_PGAT, idsatgat, CSRHGAT_i, CTATGAT_i, vbigat, wdepnulrgat, VBIRGATinv, PGAT_i, ftdgat, btatpartgat, atatgat, one_over_one_minus_PGAT, CBBTGAT_i, VBIRGAT_i, wdepnulrinvgat, fbbtgat, VBRGAT_i, VBRinvgat, PBRGAT_i, fstopgat, slopegat, VMAX, exp_VMAX_over_phitd, vbimin, vch, vfmin, vbbtlim) \ - FRACNA = 0.4; \ - FRACNB = 0.65; \ - FRACI = 0.8; \ - /* Sample voltages */ \ - V1 = -FRACNA * VJUNREF_i; \ - V2 = -FRACNB * VJUNREF_i; \ - V3 = -FRACI * VJUNREF_i; \ - V4 = 0.1; \ - V5 = 0.2; \ - /* evaluate full JUNCAP-model at five voltages */ \ - `juncapcommon(V1, AB_i, LS_i, LG_i, qprefbot, qpref2bot, vbiinvbot, one_minus_PBOT, idsatbot, CSRHBOT_i, CTATBOT_i, vbibot, wdepnulrbot, VBIRBOTinv, PBOT_i, ftdbot, btatpartbot, atatbot, one_over_one_minus_PBOT, CBBTBOT_i, VBIRBOT_i, wdepnulrinvbot, fbbtbot, VBRBOT_i, VBRinvbot, PBRBOT_i, fstopbot, slopebot, qprefsti, qpref2sti, vbiinvsti, one_minus_PSTI, idsatsti, CSRHSTI_i, CTATSTI_i, vbisti, wdepnulrsti, VBIRSTIinv, PSTI_i, ftdsti, btatpartsti, atatsti, one_over_one_minus_PSTI, CBBTSTI_i, VBIRSTI_i, wdepnulrinvsti, fbbtsti, VBRSTI_i, VBRinvsti, PBRSTI_i, fstopsti, slopesti, qprefgat, qpref2gat, vbiinvgat, one_minus_PGAT, idsatgat, CSRHGAT_i, CTATGAT_i, vbigat, wdepnulrgat, VBIRGATinv, PGAT_i, ftdgat, btatpartgat, atatgat, one_over_one_minus_PGAT, CBBTGAT_i, VBIRGAT_i, wdepnulrinvgat, fbbtgat, VBRGAT_i, VBRinvgat, PBRGAT_i, fstopgat, slopegat, VMAX, exp_VMAX_over_phitd, vbimin, vch, vfmin, vbbtlim, ijunbot, qjunbot, ijunsti, qjunsti, ijungat, qjungat) \ - I1 = AB_i * ijunbot + LS_i * ijunsti + LG_i * ijungat; \ - `juncapcommon(V2, AB_i, LS_i, LG_i, qprefbot, qpref2bot, vbiinvbot, one_minus_PBOT, idsatbot, CSRHBOT_i, CTATBOT_i, vbibot, wdepnulrbot, VBIRBOTinv, PBOT_i, ftdbot, btatpartbot, atatbot, one_over_one_minus_PBOT, CBBTBOT_i, VBIRBOT_i, wdepnulrinvbot, fbbtbot, VBRBOT_i, VBRinvbot, PBRBOT_i, fstopbot, slopebot, qprefsti, qpref2sti, vbiinvsti, one_minus_PSTI, idsatsti, CSRHSTI_i, CTATSTI_i, vbisti, wdepnulrsti, VBIRSTIinv, PSTI_i, ftdsti, btatpartsti, atatsti, one_over_one_minus_PSTI, CBBTSTI_i, VBIRSTI_i, wdepnulrinvsti, fbbtsti, VBRSTI_i, VBRinvsti, PBRSTI_i, fstopsti, slopesti, qprefgat, qpref2gat, vbiinvgat, one_minus_PGAT, idsatgat, CSRHGAT_i, CTATGAT_i, vbigat, wdepnulrgat, VBIRGATinv, PGAT_i, ftdgat, btatpartgat, atatgat, one_over_one_minus_PGAT, CBBTGAT_i, VBIRGAT_i, wdepnulrinvgat, fbbtgat, VBRGAT_i, VBRinvgat, PBRGAT_i, fstopgat, slopegat, VMAX, exp_VMAX_over_phitd, vbimin, vch, vfmin, vbbtlim, ijunbot, qjunbot, ijunsti, qjunsti, ijungat, qjungat) \ - I2 = AB_i * ijunbot + LS_i * ijunsti + LG_i * ijungat; \ - `juncapcommon(V3, AB_i, LS_i, LG_i, qprefbot, qpref2bot, vbiinvbot, one_minus_PBOT, idsatbot, CSRHBOT_i, CTATBOT_i, vbibot, wdepnulrbot, VBIRBOTinv, PBOT_i, ftdbot, btatpartbot, atatbot, one_over_one_minus_PBOT, CBBTBOT_i, VBIRBOT_i, wdepnulrinvbot, fbbtbot, VBRBOT_i, VBRinvbot, PBRBOT_i, fstopbot, slopebot, qprefsti, qpref2sti, vbiinvsti, one_minus_PSTI, idsatsti, CSRHSTI_i, CTATSTI_i, vbisti, wdepnulrsti, VBIRSTIinv, PSTI_i, ftdsti, btatpartsti, atatsti, one_over_one_minus_PSTI, CBBTSTI_i, VBIRSTI_i, wdepnulrinvsti, fbbtsti, VBRSTI_i, VBRinvsti, PBRSTI_i, fstopsti, slopesti, qprefgat, qpref2gat, vbiinvgat, one_minus_PGAT, idsatgat, CSRHGAT_i, CTATGAT_i, vbigat, wdepnulrgat, VBIRGATinv, PGAT_i, ftdgat, btatpartgat, atatgat, one_over_one_minus_PGAT, CBBTGAT_i, VBIRGAT_i, wdepnulrinvgat, fbbtgat, VBRGAT_i, VBRinvgat, PBRGAT_i, fstopgat, slopegat, VMAX, exp_VMAX_over_phitd, vbimin, vch, vfmin, vbbtlim, ijunbot, qjunbot, ijunsti, qjunsti, ijungat, qjungat) \ - I3 = AB_i * ijunbot + LS_i * ijunsti + LG_i * ijungat; - -// Part 2 -`define JuncapExpressInit2(AB_i, LS_i, LG_i, qprefbot, qpref2bot, vbiinvbot, one_minus_PBOT, idsatbot, CSRHBOT_i, CTATBOT_i, vbibot, wdepnulrbot, VBIRBOTinv, PBOT_i, ftdbot, btatpartbot, atatbot, one_over_one_minus_PBOT, CBBTBOT_i, VBIRBOT_i, wdepnulrinvbot, fbbtbot, VBRBOT_i, VBRinvbot, PBRBOT_i, fstopbot, slopebot, qprefsti, qpref2sti, vbiinvsti, one_minus_PSTI, idsatsti, CSRHSTI_i, CTATSTI_i, vbisti, wdepnulrsti, VBIRSTIinv, PSTI_i, ftdsti, btatpartsti, atatsti, one_over_one_minus_PSTI, CBBTSTI_i, VBIRSTI_i, wdepnulrinvsti, fbbtsti, VBRSTI_i, VBRinvsti, PBRSTI_i, fstopsti, slopesti, qprefgat, qpref2gat, vbiinvgat, one_minus_PGAT, idsatgat, CSRHGAT_i, CTATGAT_i, vbigat, wdepnulrgat, VBIRGATinv, PGAT_i, ftdgat, btatpartgat, atatgat, one_over_one_minus_PGAT, CBBTGAT_i, VBIRGAT_i, wdepnulrinvgat, fbbtgat, VBRGAT_i, VBRinvgat, PBRGAT_i, fstopgat, slopegat, VMAX, exp_VMAX_over_phitd, vbimin, vch, vfmin, vbbtlim) \ - /* forward currents */ \ - `juncapcommon(V4, AB_i, LS_i, LG_i, qprefbot, qpref2bot, vbiinvbot, one_minus_PBOT, idsatbot, CSRHBOT_i, CTATBOT_i, vbibot, wdepnulrbot, VBIRBOTinv, PBOT_i, ftdbot, btatpartbot, atatbot, one_over_one_minus_PBOT, CBBTBOT_i, VBIRBOT_i, wdepnulrinvbot, fbbtbot, VBRBOT_i, VBRinvbot, PBRBOT_i, fstopbot, slopebot, qprefsti, qpref2sti, vbiinvsti, one_minus_PSTI, idsatsti, CSRHSTI_i, CTATSTI_i, vbisti, wdepnulrsti, VBIRSTIinv, PSTI_i, ftdsti, btatpartsti, atatsti, one_over_one_minus_PSTI, CBBTSTI_i, VBIRSTI_i, wdepnulrinvsti, fbbtsti, VBRSTI_i, VBRinvsti, PBRSTI_i, fstopsti, slopesti, qprefgat, qpref2gat, vbiinvgat, one_minus_PGAT, idsatgat, CSRHGAT_i, CTATGAT_i, vbigat, wdepnulrgat, VBIRGATinv, PGAT_i, ftdgat, btatpartgat, atatgat, one_over_one_minus_PGAT, CBBTGAT_i, VBIRGAT_i, wdepnulrinvgat, fbbtgat, VBRGAT_i, VBRinvgat, PBRGAT_i, fstopgat, slopegat, VMAX, exp_VMAX_over_phitd, vbimin, vch, vfmin, vbbtlim, ijunbot, qjunbot, ijunsti, qjunsti, ijungat, qjungat) \ - I4 = AB_i * ijunbot + LS_i * ijunsti + LG_i * ijungat; \ - `juncapcommon(V5, AB_i, LS_i, LG_i, qprefbot, qpref2bot, vbiinvbot, one_minus_PBOT, idsatbot, CSRHBOT_i, CTATBOT_i, vbibot, wdepnulrbot, VBIRBOTinv, PBOT_i, ftdbot, btatpartbot, atatbot, one_over_one_minus_PBOT, CBBTBOT_i, VBIRBOT_i, wdepnulrinvbot, fbbtbot, VBRBOT_i, VBRinvbot, PBRBOT_i, fstopbot, slopebot, qprefsti, qpref2sti, vbiinvsti, one_minus_PSTI, idsatsti, CSRHSTI_i, CTATSTI_i, vbisti, wdepnulrsti, VBIRSTIinv, PSTI_i, ftdsti, btatpartsti, atatsti, one_over_one_minus_PSTI, CBBTSTI_i, VBIRSTI_i, wdepnulrinvsti, fbbtsti, VBRSTI_i, VBRinvsti, PBRSTI_i, fstopsti, slopesti, qprefgat, qpref2gat, vbiinvgat, one_minus_PGAT, idsatgat, CSRHGAT_i, CTATGAT_i, vbigat, wdepnulrgat, VBIRGATinv, PGAT_i, ftdgat, btatpartgat, atatgat, one_over_one_minus_PGAT, CBBTGAT_i, VBIRGAT_i, wdepnulrinvgat, fbbtgat, VBRGAT_i, VBRinvgat, PBRGAT_i, fstopgat, slopegat, VMAX, exp_VMAX_over_phitd, vbimin, vch, vfmin, vbbtlim, ijunbot, qjunbot, ijunsti, qjunsti, ijungat, qjungat) \ - I5 = AB_i * ijunbot + LS_i * ijunsti + LG_i * ijungat; - -// Part 3 -`define JuncapExpressInit3(AB_i, LS_i, LG_i, idsatbot, idsatsti, idsatgat, ISATFOR1, MFOR1, ISATFOR2, MFOR2, ISATREV, MREV, m0flag) \ - /* compute internal parameters from these five (I,V)-values */ \ - ISATFOR1 = AB_i * idsatbot + LS_i * idsatsti + LG_i * idsatgat; \ - I4_cor = I4 - ISATFOR1 * (exp(V4 * phitdinv * MFOR1) - 1.0); \ - I5_cor = I5 - ISATFOR1 * (exp(V5 * phitdinv * MFOR1) - 1.0); \ - if ( !( ((AB_i) == 0) && ((LS_i) == 0) && ((LG_i) == 0) ) ) begin \ - if ((I4 > 0) && (I5 > 0)) begin \ - if ((((I4_cor / I4) > `relerr) || ((I5_cor / I5) > `relerr)) && (I4_cor > 0) && (I5_cor > 0)) begin \ - alphaje = I4_cor / I5_cor; \ - MFOR2 = phitd * ln(alphaje) / (V4 - V5); \ - ISATFOR2 = I4_cor / (exp(V4 * phitdinv * MFOR2) - 1); \ - end \ - end \ - I1_cor = I1 - ISATFOR1 * (exp(V1 * phitdinv * MFOR1) - 1.0) - ISATFOR2 * (exp(V1 * phitdinv * MFOR2) - 1.0); \ - I2_cor = I2 - ISATFOR1 * (exp(V2 * phitdinv * MFOR1) - 1.0) - ISATFOR2 * (exp(V2 * phitdinv * MFOR2) - 1.0); \ - I3_cor = I3 - ISATFOR1 * (exp(V3 * phitdinv * MFOR1) - 1.0) - ISATFOR2 * (exp(V3 * phitdinv * MFOR2) - 1.0); \ - if ((I1 < 0) && (I2 < 0) && (I3 < 0)) begin \ - if ((((I1_cor / I1) > `relerr) || ((I2_cor / I2) > `relerr) || ((I3_cor / I3) > `relerr)) \ - && (I1_cor < 0) && (I2_cor < 0) && (I3_cor < 0)) begin \ - alphaje = I1_cor / I2_cor; \ - m0_rev = -phitd * ln(alphaje) / (V1 - V2); /* zeroth order approximation */ \ - tt0 = V2 / (V2 - V1); \ - tt1 = phitd * (alphaje - 1) * (pow(alphaje, tt0) - 1); \ - tt0 = V1 / (V1 - V2); \ - tt2 = pow(alphaje, tt0) * (V2 - V1) + alphaje * V1 - V2; \ - mcor_rev = tt1 / tt2; /* first order Newton correction */ \ - MREV = m0_rev + mcor_rev; \ - if (abs(V3 * phitdinv * MREV) < 1e-6) begin \ - /* Taylor approximation needed */ \ - /* Note: ISATREV and MREV have different meaning in this situation!! */ \ - m0flag = 1.0; \ - ISATREV = I3_cor * (1 / V3 + 0.5 * phitdinv * MREV); \ - MREV = -0.5 * I3_cor * MREV * phitdinv / V3; \ - end else begin \ - m0flag = 0.0; \ - ISATREV = -I3_cor / (exp(-V3 * phitdinv * MREV) - 1); \ - end \ - end \ - end \ - end - -// Part 4 -`define JuncapExpressInit4(AB_i, LS_i, LG_i, FJUNQ_i, cjobot, cjosti, cjogat, zflagbot, zflagsti, zflaggat) \ - /* charge model initialization */ \ - zfrac = FJUNQ_i * (AB_i * cjobot + LS_i * cjosti + LG_i * cjogat); \ - if ((AB_i * cjobot) <= zfrac) begin \ - zflagbot = 0.0; \ - end \ - if ((LS_i * cjosti) <= zfrac) begin \ - zflagsti = 0.0; \ - end \ - if ((LG_i * cjogat) <= zfrac) begin \ - zflaggat = 0.0; \ - end - -// Part 5 -`define JuncapExpressInit5(AB_i, LS_i, LG_i, ISATFOR1, ISATFOR2, ISATREV, xhighf1, expxhf1, xhighf2, expxhf2, xhighr, expxhr) \ - /* calculate limits beyond which exponentials are linearly extrapolated */ \ - if ( !( ((AB_i) == 0) && ((LS_i) == 0) && ((LG_i) == 0) ) ) begin \ - xhighf1 = ln(0.5 * IMAX_i / (ISATFOR1 + 1e-21)); \ - xhighf2 = ln(0.5 * IMAX_i / (ISATFOR2 + 1e-21)); \ - xhighr = ln(0.5 * IMAX_i / (abs(ISATREV) + 1e-21)); \ - end \ - xhighf1 = min(xhighf1, `se05); \ - expxhf1 = exp(xhighf1); \ - xhighf2 = min(xhighf2, `se05); \ - expxhf2 = exp(xhighf2); \ - xhighr = min(xhighr, `se05); \ - expxhr = exp(xhighr); - -`define JuncapExpressCurrent(V, MFOR1, ISATFOR1, MFOR2, ISATFOR2, MREV, ISATREV, m0flag, xhighf1, expxhf1, xhighf2, expxhf2, xhighr, expxhr, ijun) \ - tm0 = V * phitdinv * MFOR1; \ - tm1 = `expll(tm0, -`se05, `ke05, xhighf1, expxhf1); \ - ijunfor1 = ISATFOR1 * (tm1 - 1.0); \ - tm0 = V * phitdinv * MFOR2; \ - tm1 = `expll(tm0, -`se05, `ke05, xhighf2, expxhf2); \ - ijunfor2 = ISATFOR2 * (tm1 - 1.0); \ - ijunrev = 0.0; \ - if (m0flag > 0) begin \ - ijunrev = V * (ISATREV + V * MREV); \ - end else begin \ - tm0 = -V * phitdinv * MREV; \ - tm1 = `expll(tm0, -`se05, `ke05, xhighr, expxhr); \ - ijunrev = -ISATREV * (tm1 - 1.0); \ - end \ - ijun = ijunfor1 + ijunfor2 + ijunrev; - - -`define JuncapExpressCharge(V, AB_i, LS_i, LG_i, qprefbot, qprefsti, qprefgat, qpref2bot, qpref2sti, qpref2gat, vbiinvbot, vbiinvsti, vbiinvgat, one_minus_PBOT, one_minus_PSTI, one_minus_PGAT, vfmin, vch, zflagbot, zflagsti, zflaggat, qjunbot, qjunsti, qjungat) \ - tmpv = 0.0; \ - vjv = 0.0; \ - `hypfunction5(V, vfmin, vch, vjv) \ - if (zflagbot > 0.5) begin \ - `mypower((1 - vjv * vbiinvbot), one_minus_PBOT, tmpv) \ - qjunbot = qprefbot * (1 - tmpv) + qpref2bot * (V - vjv); \ - end \ - if (zflagsti > 0.5) begin \ - `mypower((1 - vjv * vbiinvsti), one_minus_PSTI, tmpv) \ - qjunsti = qprefsti * (1 - tmpv) + qpref2sti * (V - vjv); \ - end \ - if (zflaggat > 0.5) begin \ - `mypower((1 - vjv * vbiinvgat), one_minus_PGAT, tmpv) \ - qjungat = qprefgat * (1 - tmpv) + qpref2gat * (V - vjv); \ - end - diff --git a/src/spicelib/devices/adms/psp102/admsva/JUNCAP200_parlist.include b/src/spicelib/devices/adms/psp102/admsva/JUNCAP200_parlist.include deleted file mode 100644 index c9f2f685b..000000000 --- a/src/spicelib/devices/adms/psp102/admsva/JUNCAP200_parlist.include +++ /dev/null @@ -1,178 +0,0 @@ -//====================================================================================== -//====================================================================================== -// Filename: JUNCAP200_parlist.include -//====================================================================================== -//====================================================================================== -// -// (c) Copyright notice -// -// Since 2012 until today, PSP has been co-developed by NXP Semiconductors and -// Delft University of Technology. For this part of the model, each claim undivided -// ownership and copyrights -// Until and including 2011, PSP has been co-developed by NXP Semiconductors and -// Arizona State University. For this part of the model, NXP Semiconductors claims -// undivided ownership and copyrights. -// -// -// Version: 102.5.0 (PSP), 200.4.0 (JUNCAP), December 2013 -// -//====================================================================================== -//====================================================================================== -// -// Further information can be found in the file releasenotesPSP102.txt -// - -////////////////////////////////////////// -// -// JUNCAP2 - Reduced parameterlist -// -////////////////////////////////////////// - -parameter real IMAX = 1000 `from(`IMAX_cliplow ,inf ) `P(info="Maximum current up to which forward current behaves exponentially" unit="A"); -parameter real TRJ = 21 `from(`TRJ_cliplow ,inf ) `P(info="reference temperature" unit="C"); - -// Parameters for source-bulk junction -`ifdef JUNCAP_StandAlone - parameter real CJORBOT = 1E-3 `from(`CJORBOT_cliplow ,inf ) `P(info="Zero-bias capacitance per unit-of-area of bottom component" unit="Fm^-2"); - parameter real CJORSTI = 1E-9 `from(`CJORSTI_cliplow ,inf ) `P(info="Zero-bias capacitance per unit-of-length of STI-edge component" unit="Fm^-1"); - parameter real CJORGAT = 1E-9 `from(`CJORGAT_cliplow ,inf ) `P(info="Zero-bias capacitance per unit-of-length of gate-edge component" unit="Fm^-1"); - parameter real VBIRBOT = 1 `from(`VBIR_cliplow ,inf ) `P(info="Built-in voltage at the reference temperature of bottom component" unit="V"); - parameter real VBIRSTI = 1 `from(`VBIR_cliplow ,inf ) `P(info="Built-in voltage at the reference temperature of STI-edge component" unit="V"); - parameter real VBIRGAT = 1 `from(`VBIR_cliplow ,inf ) `P(info="Built-in voltage at the reference temperature of gate-edge component" unit="V"); - parameter real PBOT = 0.5 `from(`P_cliplow ,`P_cliphigh ) `P(info="Grading coefficient of bottom component" unit=""); - parameter real PSTI = 0.5 `from(`P_cliplow ,`P_cliphigh ) `P(info="Grading coefficient of STI-edge component" unit=""); - parameter real PGAT = 0.5 `from(`P_cliplow ,`P_cliphigh ) `P(info="Grading coefficient of gate-edge component" unit=""); - parameter real PHIGBOT = 1.16 `P(info="Zero-temperature bandgap voltage of bottom component" unit="V"); - parameter real PHIGSTI = 1.16 `P(info="Zero-temperature bandgap voltage of STI-edge component" unit="V"); - parameter real PHIGGAT = 1.16 `P(info="Zero-temperature bandgap voltage of gate-edge component" unit="V"); - parameter real IDSATRBOT = 1E-12 `from(`IDSATR_cliplow ,inf ) `P(info="Saturation current density at the reference temperature of bottom component" unit="Am^-2"); - parameter real IDSATRSTI = 1E-18 `from(`IDSATR_cliplow ,inf ) `P(info="Saturation current density at the reference temperature of STI-edge component" unit="Am^-1"); - parameter real IDSATRGAT = 1E-18 `from(`IDSATR_cliplow ,inf ) `P(info="Saturation current density at the reference temperature of gate-edge component" unit="Am^-1"); - parameter real CSRHBOT = 1E2 `from(`CSRH_cliplow ,inf ) `P(info="Shockley-Read-Hall prefactor of bottom component" unit="Am^-3"); - parameter real CSRHSTI = 1E-4 `from(`CSRH_cliplow ,inf ) `P(info="Shockley-Read-Hall prefactor of STI-edge component" unit="Am^-2"); - parameter real CSRHGAT = 1E-4 `from(`CSRH_cliplow ,inf ) `P(info="Shockley-Read-Hall prefactor of gate-edge component" unit="Am^-2"); - parameter real XJUNSTI = 100E-9 `from(`XJUN_cliplow ,inf ) `P(info="Junction depth of STI-edge component" unit="m"); - parameter real XJUNGAT = 100E-9 `from(`XJUN_cliplow ,inf ) `P(info="Junction depth of gate-edge component" unit="m"); - parameter real CTATBOT = 1E2 `from(`CTAT_cliplow ,inf ) `P(info="Trap-assisted tunneling prefactor of bottom component" unit="Am^-3"); - parameter real CTATSTI = 1E-4 `from(`CTAT_cliplow ,inf ) `P(info="Trap-assisted tunneling prefactor of STI-edge component" unit="Am^-2"); - parameter real CTATGAT = 1E-4 `from(`CTAT_cliplow ,inf ) `P(info="Trap-assisted tunneling prefactor of gate-edge component" unit="Am^-2"); - parameter real MEFFTATBOT = 0.25 `from(`MEFFTAT_cliplow ,inf ) `P(info="Effective mass (in units of m0) for trap-assisted tunneling of bottom component" unit=""); - parameter real MEFFTATSTI = 0.25 `from(`MEFFTAT_cliplow ,inf ) `P(info="Effective mass (in units of m0) for trap-assisted tunneling of STI-edge component" unit=""); - parameter real MEFFTATGAT = 0.25 `from(`MEFFTAT_cliplow ,inf ) `P(info="Effective mass (in units of m0) for trap-assisted tunneling of gate-edge component" unit=""); - parameter real CBBTBOT = 1E-12 `from(`CBBT_cliplow ,inf ) `P(info="Band-to-band tunneling prefactor of bottom component" unit="AV^-3"); - parameter real CBBTSTI = 1E-18 `from(`CBBT_cliplow ,inf ) `P(info="Band-to-band tunneling prefactor of STI-edge component" unit="AV^-3m"); - parameter real CBBTGAT = 1E-18 `from(`CBBT_cliplow ,inf ) `P(info="Band-to-band tunneling prefactor of gate-edge component" unit="AV^-3m"); - parameter real FBBTRBOT = 1E9 `P(info="Normalization field at the reference temperature for band-to-band tunneling of bottom component" unit="Vm^-1"); - parameter real FBBTRSTI = 1E9 `P(info="Normalization field at the reference temperature for band-to-band tunneling of STI-edge component" unit="Vm^-1"); - parameter real FBBTRGAT = 1E9 `P(info="Normalization field at the reference temperature for band-to-band tunneling of gate-edge component" unit="Vm^-1"); - parameter real STFBBTBOT = -1E-3 `P(info="Temperature scaling parameter for band-to-band tunneling of bottom component" unit="K^-1"); - parameter real STFBBTSTI = -1E-3 `P(info="Temperature scaling parameter for band-to-band tunneling of STI-edge component" unit="K^-1"); - parameter real STFBBTGAT = -1E-3 `P(info="Temperature scaling parameter for band-to-band tunneling of gate-edge component" unit="K^-1"); - parameter real VBRBOT = 10 `from(`VBR_cliplow ,inf ) `P(info="Breakdown voltage of bottom component" unit="V"); - parameter real VBRSTI = 10 `from(`VBR_cliplow ,inf ) `P(info="Breakdown voltage of STI-edge component" unit="V"); - parameter real VBRGAT = 10 `from(`VBR_cliplow ,inf ) `P(info="Breakdown voltage of gate-edge component" unit="V"); - parameter real PBRBOT = 4 `from(`PBR_cliplow ,inf ) `P(info="Breakdown onset tuning parameter of bottom component" unit="V"); - parameter real PBRSTI = 4 `from(`PBR_cliplow ,inf ) `P(info="Breakdown onset tuning parameter of STI-edge component" unit="V"); - parameter real PBRGAT = 4 `from(`PBR_cliplow ,inf ) `P(info="Breakdown onset tuning parameter of gate-edge component" unit="V"); -`else // JUNCAP_StandAlone - parameter real CJORBOT = 1E-3 `from(`CJORBOT_cliplow ,inf ) `P(info="Zero-bias capacitance per unit-of-area of bottom component for source-bulk junction" unit="Fm^-2"); - parameter real CJORSTI = 1E-9 `from(`CJORSTI_cliplow ,inf ) `P(info="Zero-bias capacitance per unit-of-length of STI-edge component for source-bulk junction" unit="Fm^-1"); - parameter real CJORGAT = 1E-9 `from(`CJORGAT_cliplow ,inf ) `P(info="Zero-bias capacitance per unit-of-length of gate-edge component for source-bulk junction" unit="Fm^-1"); - parameter real VBIRBOT = 1 `from(`VBIR_cliplow ,inf ) `P(info="Built-in voltage at the reference temperature of bottom component for source-bulk junction" unit="V"); - parameter real VBIRSTI = 1 `from(`VBIR_cliplow ,inf ) `P(info="Built-in voltage at the reference temperature of STI-edge component for source-bulk junction" unit="V"); - parameter real VBIRGAT = 1 `from(`VBIR_cliplow ,inf ) `P(info="Built-in voltage at the reference temperature of gate-edge component for source-bulk junction" unit="V"); - parameter real PBOT = 0.5 `from(`P_cliplow ,`P_cliphigh ) `P(info="Grading coefficient of bottom component for source-bulk junction" unit=""); - parameter real PSTI = 0.5 `from(`P_cliplow ,`P_cliphigh ) `P(info="Grading coefficient of STI-edge component for source-bulk junction" unit=""); - parameter real PGAT = 0.5 `from(`P_cliplow ,`P_cliphigh ) `P(info="Grading coefficient of gate-edge component for source-bulk junction" unit=""); - parameter real PHIGBOT = 1.16 `P(info="Zero-temperature bandgap voltage of bottom component for source-bulk junction" unit="V"); - parameter real PHIGSTI = 1.16 `P(info="Zero-temperature bandgap voltage of STI-edge component for source-bulk junction" unit="V"); - parameter real PHIGGAT = 1.16 `P(info="Zero-temperature bandgap voltage of gate-edge component for source-bulk junction" unit="V"); - parameter real IDSATRBOT = 1E-12 `from(`IDSATR_cliplow ,inf ) `P(info="Saturation current density at the reference temperature of bottom component for source-bulk junction" unit="Am^-2"); - parameter real IDSATRSTI = 1E-18 `from(`IDSATR_cliplow ,inf ) `P(info="Saturation current density at the reference temperature of STI-edge component for source-bulk junction" unit="Am^-1"); - parameter real IDSATRGAT = 1E-18 `from(`IDSATR_cliplow ,inf ) `P(info="Saturation current density at the reference temperature of gate-edge component for source-bulk junction" unit="Am^-1"); - parameter real CSRHBOT = 1E2 `from(`CSRH_cliplow ,inf ) `P(info="Shockley-Read-Hall prefactor of bottom component for source-bulk junction" unit="Am^-3"); - parameter real CSRHSTI = 1E-4 `from(`CSRH_cliplow ,inf ) `P(info="Shockley-Read-Hall prefactor of STI-edge component for source-bulk junction" unit="Am^-2"); - parameter real CSRHGAT = 1E-4 `from(`CSRH_cliplow ,inf ) `P(info="Shockley-Read-Hall prefactor of gate-edge component for source-bulk junction" unit="Am^-2"); - parameter real XJUNSTI = 100E-9 `from(`XJUN_cliplow ,inf ) `P(info="Junction depth of STI-edge component for source-bulk junction" unit="m"); - parameter real XJUNGAT = 100E-9 `from(`XJUN_cliplow ,inf ) `P(info="Junction depth of gate-edge component for source-bulk junction" unit="m"); - parameter real CTATBOT = 1E2 `from(`CTAT_cliplow ,inf ) `P(info="Trap-assisted tunneling prefactor of bottom component for source-bulk junction" unit="Am^-3"); - parameter real CTATSTI = 1E-4 `from(`CTAT_cliplow ,inf ) `P(info="Trap-assisted tunneling prefactor of STI-edge component for source-bulk junction" unit="Am^-2"); - parameter real CTATGAT = 1E-4 `from(`CTAT_cliplow ,inf ) `P(info="Trap-assisted tunneling prefactor of gate-edge component for source-bulk junction" unit="Am^-2"); - parameter real MEFFTATBOT = 0.25 `from(`MEFFTAT_cliplow ,inf ) `P(info="Effective mass (in units of m0) for trap-assisted tunneling of bottom component for source-bulk junction" unit=""); - parameter real MEFFTATSTI = 0.25 `from(`MEFFTAT_cliplow ,inf ) `P(info="Effective mass (in units of m0) for trap-assisted tunneling of STI-edge component for source-bulk junction" unit=""); - parameter real MEFFTATGAT = 0.25 `from(`MEFFTAT_cliplow ,inf ) `P(info="Effective mass (in units of m0) for trap-assisted tunneling of gate-edge component for source-bulk junction" unit=""); - parameter real CBBTBOT = 1E-12 `from(`CBBT_cliplow ,inf ) `P(info="Band-to-band tunneling prefactor of bottom component for source-bulk junction" unit="AV^-3"); - parameter real CBBTSTI = 1E-18 `from(`CBBT_cliplow ,inf ) `P(info="Band-to-band tunneling prefactor of STI-edge component for source-bulk junction" unit="AV^-3m"); - parameter real CBBTGAT = 1E-18 `from(`CBBT_cliplow ,inf ) `P(info="Band-to-band tunneling prefactor of gate-edge component for source-bulk junction" unit="AV^-3m"); - parameter real FBBTRBOT = 1E9 `P(info="Normalization field at the reference temperature for band-to-band tunneling of bottom component for source-bulk junction" unit="Vm^-1"); - parameter real FBBTRSTI = 1E9 `P(info="Normalization field at the reference temperature for band-to-band tunneling of STI-edge component for source-bulk junction" unit="Vm^-1"); - parameter real FBBTRGAT = 1E9 `P(info="Normalization field at the reference temperature for band-to-band tunneling of gate-edge component for source-bulk junction" unit="Vm^-1"); - parameter real STFBBTBOT = -1E-3 `P(info="Temperature scaling parameter for band-to-band tunneling of bottom component for source-bulk junction" unit="K^-1"); - parameter real STFBBTSTI = -1E-3 `P(info="Temperature scaling parameter for band-to-band tunneling of STI-edge component for source-bulk junction" unit="K^-1"); - parameter real STFBBTGAT = -1E-3 `P(info="Temperature scaling parameter for band-to-band tunneling of gate-edge component for source-bulk junction" unit="K^-1"); - parameter real VBRBOT = 10 `from(`VBR_cliplow ,inf ) `P(info="Breakdown voltage of bottom component for source-bulk junction" unit="V"); - parameter real VBRSTI = 10 `from(`VBR_cliplow ,inf ) `P(info="Breakdown voltage of STI-edge component for source-bulk junction" unit="V"); - parameter real VBRGAT = 10 `from(`VBR_cliplow ,inf ) `P(info="Breakdown voltage of gate-edge component for source-bulk junction" unit="V"); - parameter real PBRBOT = 4 `from(`PBR_cliplow ,inf ) `P(info="Breakdown onset tuning parameter of bottom component for source-bulk junction" unit="V"); - parameter real PBRSTI = 4 `from(`PBR_cliplow ,inf ) `P(info="Breakdown onset tuning parameter of STI-edge component for source-bulk junction" unit="V"); - parameter real PBRGAT = 4 `from(`PBR_cliplow ,inf ) `P(info="Breakdown onset tuning parameter of gate-edge component for source-bulk junction" unit="V"); -`endif - -`ifdef JUNCAP_StandAlone - // do nothing -`else // JUNCAP_StandAlone - // Parameters for drain-bulk junction - parameter real CJORBOTD = 1E-3 `from(`CJORBOT_cliplow ,inf ) `P(info="Zero-bias capacitance per unit-of-area of bottom component for drain-bulk junction" unit="Fm^-2"); - parameter real CJORSTID = 1E-9 `from(`CJORSTI_cliplow ,inf ) `P(info="Zero-bias capacitance per unit-of-length of STI-edge component for drain-bulk junction" unit="Fm^-1"); - parameter real CJORGATD = 1E-9 `from(`CJORGAT_cliplow ,inf ) `P(info="Zero-bias capacitance per unit-of-length of gate-edge component for drain-bulk junction" unit="Fm^-1"); - parameter real VBIRBOTD = 1 `from(`VBIR_cliplow ,inf ) `P(info="Built-in voltage at the reference temperature of bottom component for drain-bulk junction" unit="V"); - parameter real VBIRSTID = 1 `from(`VBIR_cliplow ,inf ) `P(info="Built-in voltage at the reference temperature of STI-edge component for drain-bulk junction" unit="V"); - parameter real VBIRGATD = 1 `from(`VBIR_cliplow ,inf ) `P(info="Built-in voltage at the reference temperature of gate-edge component for drain-bulk junction" unit="V"); - parameter real PBOTD = 0.5 `from(`P_cliplow ,`P_cliphigh ) `P(info="Grading coefficient of bottom component for drain-bulk junction" unit=""); - parameter real PSTID = 0.5 `from(`P_cliplow ,`P_cliphigh ) `P(info="Grading coefficient of STI-edge component for drain-bulk junction" unit=""); - parameter real PGATD = 0.5 `from(`P_cliplow ,`P_cliphigh ) `P(info="Grading coefficient of gate-edge component for drain-bulk junction" unit=""); - parameter real PHIGBOTD = 1.16 `P(info="Zero-temperature bandgap voltage of bottom component for drain-bulk junction" unit="V"); - parameter real PHIGSTID = 1.16 `P(info="Zero-temperature bandgap voltage of STI-edge component for drain-bulk junction" unit="V"); - parameter real PHIGGATD = 1.16 `P(info="Zero-temperature bandgap voltage of gate-edge component for drain-bulk junction" unit="V"); - parameter real IDSATRBOTD = 1E-12 `from(`IDSATR_cliplow ,inf ) `P(info="Saturation current density at the reference temperature of bottom component for drain-bulk junction" unit="Am^-2"); - parameter real IDSATRSTID = 1E-18 `from(`IDSATR_cliplow ,inf ) `P(info="Saturation current density at the reference temperature of STI-edge component for drain-bulk junction" unit="Am^-1"); - parameter real IDSATRGATD = 1E-18 `from(`IDSATR_cliplow ,inf ) `P(info="Saturation current density at the reference temperature of gate-edge component for drain-bulk junction" unit="Am^-1"); - parameter real CSRHBOTD = 1E2 `from(`CSRH_cliplow ,inf ) `P(info="Shockley-Read-Hall prefactor of bottom component for drain-bulk junction" unit="Am^-3"); - parameter real CSRHSTID = 1E-4 `from(`CSRH_cliplow ,inf ) `P(info="Shockley-Read-Hall prefactor of STI-edge component for drain-bulk junction" unit="Am^-2"); - parameter real CSRHGATD = 1E-4 `from(`CSRH_cliplow ,inf ) `P(info="Shockley-Read-Hall prefactor of gate-edge component for drain-bulk junction" unit="Am^-2"); - parameter real XJUNSTID = 100E-9 `from(`XJUN_cliplow ,inf ) `P(info="Junction depth of STI-edge component for drain-bulk junction" unit="m"); - parameter real XJUNGATD = 100E-9 `from(`XJUN_cliplow ,inf ) `P(info="Junction depth of gate-edge component for drain-bulk junction" unit="m"); - parameter real CTATBOTD = 1E2 `from(`CTAT_cliplow ,inf ) `P(info="Trap-assisted tunneling prefactor of bottom component for drain-bulk junction" unit="Am^-3"); - parameter real CTATSTID = 1E-4 `from(`CTAT_cliplow ,inf ) `P(info="Trap-assisted tunneling prefactor of STI-edge component for drain-bulk junction" unit="Am^-2"); - parameter real CTATGATD = 1E-4 `from(`CTAT_cliplow ,inf ) `P(info="Trap-assisted tunneling prefactor of gate-edge component for drain-bulk junction" unit="Am^-2"); - parameter real MEFFTATBOTD= 0.25 `from(`MEFFTAT_cliplow ,inf ) `P(info="Effective mass (in units of m0) for trap-assisted tunneling of bottom component for drain-bulk junction" unit=""); - parameter real MEFFTATSTID= 0.25 `from(`MEFFTAT_cliplow ,inf ) `P(info="Effective mass (in units of m0) for trap-assisted tunneling of STI-edge component for drain-bulk junction" unit=""); - parameter real MEFFTATGATD= 0.25 `from(`MEFFTAT_cliplow ,inf ) `P(info="Effective mass (in units of m0) for trap-assisted tunneling of gate-edge component for drain-bulk junction" unit=""); - parameter real CBBTBOTD = 1E-12 `from(`CBBT_cliplow ,inf ) `P(info="Band-to-band tunneling prefactor of bottom component for drain-bulk junction" unit="AV^-3"); - parameter real CBBTSTID = 1E-18 `from(`CBBT_cliplow ,inf ) `P(info="Band-to-band tunneling prefactor of STI-edge component for drain-bulk junction" unit="AV^-3m"); - parameter real CBBTGATD = 1E-18 `from(`CBBT_cliplow ,inf ) `P(info="Band-to-band tunneling prefactor of gate-edge component for drain-bulk junction" unit="AV^-3m"); - parameter real FBBTRBOTD = 1E9 `P(info="Normalization field at the reference temperature for band-to-band tunneling of bottom component for drain-bulk junction" unit="Vm^-1"); - parameter real FBBTRSTID = 1E9 `P(info="Normalization field at the reference temperature for band-to-band tunneling of STI-edge component for drain-bulk junction" unit="Vm^-1"); - parameter real FBBTRGATD = 1E9 `P(info="Normalization field at the reference temperature for band-to-band tunneling of gate-edge component for drain-bulk junction" unit="Vm^-1"); - parameter real STFBBTBOTD = -1E-3 `P(info="Temperature scaling parameter for band-to-band tunneling of bottom component for drain-bulk junction" unit="K^-1"); - parameter real STFBBTSTID = -1E-3 `P(info="Temperature scaling parameter for band-to-band tunneling of STI-edge component for drain-bulk junction" unit="K^-1"); - parameter real STFBBTGATD = -1E-3 `P(info="Temperature scaling parameter for band-to-band tunneling of gate-edge component for drain-bulk junction" unit="K^-1"); - parameter real VBRBOTD = 10 `from(`VBR_cliplow ,inf ) `P(info="Breakdown voltage of bottom component for drain-bulk junction" unit="V"); - parameter real VBRSTID = 10 `from(`VBR_cliplow ,inf ) `P(info="Breakdown voltage of STI-edge component for drain-bulk junction" unit="V"); - parameter real VBRGATD = 10 `from(`VBR_cliplow ,inf ) `P(info="Breakdown voltage of gate-edge component for drain-bulk junction" unit="V"); - parameter real PBRBOTD = 4 `from(`PBR_cliplow ,inf ) `P(info="Breakdown onset tuning parameter of bottom component for drain-bulk junction" unit="V"); - parameter real PBRSTID = 4 `from(`PBR_cliplow ,inf ) `P(info="Breakdown onset tuning parameter of STI-edge component for drain-bulk junction" unit="V"); - parameter real PBRGATD = 4 `from(`PBR_cliplow ,inf ) `P(info="Breakdown onset tuning parameter of gate-edge component for drain-bulk junction" unit="V"); -`endif // JUNCAP_StandAlone - -// JUNCAP2-express parameters -parameter real SWJUNEXP = 0.0 `from( 0.0,1.0 ) `P(info="Flag for JUNCAP-express; 0=full model, 1=express model" unit=""); -`ifdef JUNCAP_StandAlone - parameter real VJUNREF = 2.5 `from(`VJUNREF_cliplow ,inf ) `P(info="Typical maximum junction voltage; usually about 2*VSUP" unit=""); - parameter real FJUNQ = 0.03 `from(`FJUNQ_cliplow ,inf ) `P(info="Fraction below which junction capacitance components are considered negligible" unit=""); -`else // JUNCAP_StandAlone - parameter real VJUNREF = 2.5 `from(`VJUNREF_cliplow ,inf ) `P(info="Typical maximum source-bulk junction voltage; usually about 2*VSUP" unit=""); - parameter real FJUNQ = 0.03 `from(`FJUNQ_cliplow ,inf ) `P(info="Fraction below which source-bulk junction capacitance components are considered negligible" unit=""); - parameter real VJUNREFD = 2.5 `from(`VJUNREF_cliplow ,inf ) `P(info="Typical maximum drain-bulk junction voltage; usually about 2*VSUP" unit=""); - parameter real FJUNQD = 0.03 `from(`FJUNQ_cliplow ,inf ) `P(info="Fraction below which drain-bulk junction capacitance components are considered negligible" unit=""); -`endif // JUNCAP_StandAlone diff --git a/src/spicelib/devices/adms/psp102/admsva/JUNCAP200_varlist1.include b/src/spicelib/devices/adms/psp102/admsva/JUNCAP200_varlist1.include deleted file mode 100644 index 481e12bbc..000000000 --- a/src/spicelib/devices/adms/psp102/admsva/JUNCAP200_varlist1.include +++ /dev/null @@ -1,102 +0,0 @@ -//====================================================================================== -//====================================================================================== -// Filename: JUNCAP200_varlist1.include -//====================================================================================== -//====================================================================================== -// -// (c) Copyright notice -// -// Since 2012 until today, PSP has been co-developed by NXP Semiconductors and -// Delft University of Technology. For this part of the model, each claim undivided -// ownership and copyrights -// Until and including 2011, PSP has been co-developed by NXP Semiconductors and -// Arizona State University. For this part of the model, NXP Semiconductors claims -// undivided ownership and copyrights. -// -// -// Version: 102.5.0 (PSP), 200.4.0 (JUNCAP), December 2013 -// -//====================================================================================== -//====================================================================================== -// -// Further information can be found in the file releasenotesPSP102.txt -// - -// declaration of clipped parameters -real TRJ_i, IMAX_i; -real CJORBOT_i, CJORSTI_i, CJORGAT_i, VBIRBOT_i, VBIRSTI_i, VBIRGAT_i; -real PBOT_i, PSTI_i, PGAT_i, PHIGBOT_i, PHIGSTI_i, PHIGGAT_i; -real IDSATRBOT_i, IDSATRSTI_i, IDSATRGAT_i, XJUNSTI_i, XJUNGAT_i; -real CSRHBOT_i, CSRHSTI_i, CSRHGAT_i, CTATBOT_i, CTATSTI_i, CTATGAT_i; -real MEFFTATBOT_i, MEFFTATSTI_i, MEFFTATGAT_i; -real CBBTBOT_i, CBBTSTI_i, CBBTGAT_i, FBBTRBOT_i, FBBTRSTI_i, FBBTRGAT_i; -real STFBBTBOT_i, STFBBTSTI_i, STFBBTGAT_i; -real VBRBOT_i, VBRSTI_i, VBRGAT_i, PBRBOT_i, PBRSTI_i, PBRGAT_i; - -real SWJUNEXP_i, VJUNREF_i, FJUNQ_i; - -// declaration of variables calculated outside macro "juncapfunction", voltage-independent part -real tkr, tkd, auxt, KBOL_over_QELE, phitr, phitrinv, phitd, phitdinv; -real perfc, berfc, cerfc; -real deltaphigr, deltaphigd, pmax; - -real phigrbot, phigrsti, phigrgat, phigdbot, phigdsti, phigdgat; -real ftdbot, ftdsti, ftdgat, idsatbot, idsatsti, idsatgat; -real ubibot, ubisti, ubigat, vbibot, vbisti, vbigat; -real vbibot2, vbisti2, vbigat2, pbot2, psti2, pgat2, vbibot2r, vbisti2r, vbigat2r; -real vbiinvbot, vbiinvsti, vbiinvgat; -real one_minus_PBOT, one_minus_PSTI, one_minus_PGAT; -real one_over_one_minus_PBOT, one_over_one_minus_PSTI, one_over_one_minus_PGAT; -real cjobot, cjosti, cjogat; -real qprefbot, qprefsti, qprefgat, qpref2bot, qpref2sti, qpref2gat; -real wdepnulrbot, wdepnulrsti, wdepnulrgat, wdepnulrinvbot, wdepnulrinvsti, wdepnulrinvgat; -real VBIRBOTinv, VBIRSTIinv, VBIRGATinv; -real deltaEbot, deltaEsti, deltaEgat, atatbot, atatsti, atatgat; -real btatpartbot, btatpartsti, btatpartgat; -real fbbtbot, fbbtsti, fbbtgat; -real fstopbot, fstopsti, fstopgat, VBRinvbot, VBRinvsti, VBRinvgat; -real slopebot, slopesti, slopegat; -real vmaxbot, vmaxsti, vmaxgat; - -// JUNCAP-Express variables -real I1, I2, I3, I4, I5; -real I1_cor, I2_cor, I3_cor, I4_cor, I5_cor; -real V1, V2, V3, V4, V5; -real alphaje, m0_rev, mcor_rev; -real tt0, tt1, tt2, tm0, tm1; -real FRACNA, FRACNB, FRACI; -real zfrac; -real ijunfor1, ijunfor2, ijunrev; - -`ifdef JUNCAP_StandAlone - // do nothing -`else // JUNCAP_StandAlone - real CJORBOTD_i, CJORSTID_i, CJORGATD_i, VBIRBOTD_i, VBIRSTID_i, VBIRGATD_i; - real PBOTD_i, PSTID_i, PGATD_i, PHIGBOTD_i, PHIGSTID_i, PHIGGATD_i; - real IDSATRBOTD_i, IDSATRSTID_i, IDSATRGATD_i, XJUNSTID_i, XJUNGATD_i; - real CSRHBOTD_i, CSRHSTID_i, CSRHGATD_i, CTATBOTD_i, CTATSTID_i, CTATGATD_i; - real MEFFTATBOTD_i, MEFFTATSTID_i, MEFFTATGATD_i; - real CBBTBOTD_i, CBBTSTID_i, CBBTGATD_i, FBBTRBOTD_i, FBBTRSTID_i, FBBTRGATD_i; - real STFBBTBOTD_i, STFBBTSTID_i, STFBBTGATD_i; - real VBRBOTD_i, VBRSTID_i, VBRGATD_i, PBRBOTD_i, PBRSTID_i, PBRGATD_i; - - real VJUNREFD_i, FJUNQD_i; - - real phigrbot_d, phigrsti_d, phigrgat_d, phigdbot_d, phigdsti_d, phigdgat_d; - real ftdbot_d, ftdsti_d, ftdgat_d, idsatbot_d, idsatsti_d, idsatgat_d; - real ubibot_d, ubisti_d, ubigat_d, vbibot_d, vbisti_d, vbigat_d; - real vbiinvbot_d, vbiinvsti_d, vbiinvgat_d; - real one_minus_PBOT_d, one_minus_PSTI_d, one_minus_PGAT_d; - real one_over_one_minus_PBOT_d, one_over_one_minus_PSTI_d, one_over_one_minus_PGAT_d; - real cjobot_d, cjosti_d, cjogat_d; - real qprefbot_d, qprefsti_d, qprefgat_d, qpref2bot_d, qpref2sti_d, qpref2gat_d; - real wdepnulrbot_d, wdepnulrsti_d, wdepnulrgat_d, wdepnulrinvbot_d, wdepnulrinvsti_d, wdepnulrinvgat_d; - real VBIRBOTinv_d, VBIRSTIinv_d, VBIRGATinv_d; - real deltaEbot_d, deltaEsti_d, deltaEgat_d, atatbot_d, atatsti_d, atatgat_d; - real btatpartbot_d, btatpartsti_d, btatpartgat_d; - real fbbtbot_d, fbbtsti_d, fbbtgat_d; - real fstopbot_d, fstopsti_d, fstopgat_d, VBRinvbot_d, VBRinvsti_d, VBRinvgat_d; - real slopebot_d, slopesti_d, slopegat_d; -`endif - -`LocalGlobalVars diff --git a/src/spicelib/devices/adms/psp102/admsva/JUNCAP200_varlist2.include b/src/spicelib/devices/adms/psp102/admsva/JUNCAP200_varlist2.include deleted file mode 100644 index ff1ec8a15..000000000 --- a/src/spicelib/devices/adms/psp102/admsva/JUNCAP200_varlist2.include +++ /dev/null @@ -1,59 +0,0 @@ -//====================================================================================== -//====================================================================================== -// Filename: JUNCAP200_varlist2.include -//====================================================================================== -//====================================================================================== -// -// (c) Copyright notice -// -// Since 2012 until today, PSP has been co-developed by NXP Semiconductors and -// Delft University of Technology. For this part of the model, each claim undivided -// ownership and copyrights -// Until and including 2011, PSP has been co-developed by NXP Semiconductors and -// Arizona State University. For this part of the model, NXP Semiconductors claims -// undivided ownership and copyrights. -// -// -// Version: 102.5.0 (PSP), 200.4.0 (JUNCAP), December 2013 -// -//====================================================================================== -//====================================================================================== -// -// Further information can be found in the file releasenotesPSP102.txt -// -//================================================================ -// Variables that are different for source and drain side junction -// and have a scope larger than a single macro-call -//================================================================ - -`ifdef JUNCAP_StandAlone - real AB_i, LS_i, LG_i; - real zflagbot, zflagsti, zflaggat; - real VMAX, exp_VMAX_over_phitd, vbimin, vch, vfmin, vbbtlim; - - // JUNCAP-express variables - real xhighf1, expxhf1, xhighf2, expxhf2, xhighr, expxhr; - - // JUNCAP2-express intermediate parameters - real ISATFOR1, MFOR1, ISATFOR2, MFOR2, ISATREV, MREV, m0flag; -`else // JUNCAP_StandAlone - real ABSOURCE_i, LSSOURCE_i, LGSOURCE_i, AS_i, PS_i; - real zflagbot_s, zflagsti_s, zflaggat_s; - real VMAX_s, exp_VMAX_over_phitd_s, vbimin_s, vch_s, vfmin_s, vbbtlim_s; - - // JUNCAP-express variables - real xhighf1_s, expxhf1_s, xhighf2_s, expxhf2_s, xhighr_s, expxhr_s, m0flag_s; - - // JUNCAP2-express intermediate parameters - real ISATFOR1_s, MFOR1_s, ISATFOR2_s, MFOR2_s, ISATREV_s, MREV_s; - - real ABDRAIN_i, LSDRAIN_i, LGDRAIN_i, AD_i, PD_i; - real zflagbot_d, zflagsti_d, zflaggat_d; - real VMAX_d, exp_VMAX_over_phitd_d, vbimin_d, vch_d, vfmin_d, vbbtlim_d; - - // JUNCAP-express variables - real xhighf1_d, expxhf1_d, xhighf2_d, expxhf2_d, xhighr_d, expxhr_d, m0flag_d; - - // JUNCAP2-express intermediate parameters - real ISATFOR1_d, MFOR1_d, ISATFOR2_d, MFOR2_d, ISATREV_d, MREV_d; -`endif // JUNCAP_StandAlone diff --git a/src/spicelib/devices/adms/psp102/admsva/PSP102_ChargesNQS.include b/src/spicelib/devices/adms/psp102/admsva/PSP102_ChargesNQS.include deleted file mode 100644 index c74c94f47..000000000 --- a/src/spicelib/devices/adms/psp102/admsva/PSP102_ChargesNQS.include +++ /dev/null @@ -1,309 +0,0 @@ -//====================================================================================== -//====================================================================================== -// Filename: PSP102_ChargesNQS.include -//====================================================================================== -//====================================================================================== -// -// (c) Copyright notice -// -// Since 2012 until today, PSP has been co-developed by NXP Semiconductors and -// Delft University of Technology. For this part of the model, each claim undivided -// ownership and copyrights -// Until and including 2011, PSP has been co-developed by NXP Semiconductors and -// Arizona State University. For this part of the model, NXP Semiconductors claims -// undivided ownership and copyrights. -// -// -// Version: 102.5.0, December 2013 -// -//====================================================================================== -//====================================================================================== -// -// Further information can be found in the file releasenotesPSP102.txt -// - -/////////////////////////////////////////////// -// -// Calculate NQS-charge contributions -// -/////////////////////////////////////////////// - -Qp1 = vnorm * V(SPLINE1); -Qp2 = vnorm * V(SPLINE2); -Qp3 = vnorm * V(SPLINE3); -Qp4 = vnorm * V(SPLINE4); -Qp5 = vnorm * V(SPLINE5); -Qp6 = vnorm * V(SPLINE6); -Qp7 = vnorm * V(SPLINE7); -Qp8 = vnorm * V(SPLINE8); -Qp9 = vnorm * V(SPLINE9); - -Tnorm = 0.0; - -if (SWNQS_i != 0) begin - // Dimension and mobility information is included in Tnorm - Tnorm = MUNQS_i * phit1 * BET_i / (COX_qm * Gmob_dL); - thesat2 = thesat1 * thesat1 * phit1 * phit1; - - if (SWNQS_i == 1) begin - dQy = QpN - Qp0; - d2Qy = 6.0 * (Qp0 + QpN) - 12.0 * Qp1; - end else if (SWNQS_i == 2) begin - dQy = (-7.0 * Qp0 - 3.0 * Qp1 + 12.0 * Qp2 - 2.0 * QpN) / 5.0; - d2Qy = -18.0 / 5.0 * (-4.0 * Qp0 + 9.0 * Qp1 - 6.0 * Qp2 + QpN); - end else if (SWNQS_i == 3) begin - dQy = (-13.0 * Qp0 - 6.0 * Qp1 + 24.0 * Qp2 - 6.0 * Qp3 + QpN) / 7.0; - d2Qy = (180.0 * Qp0 - 408.0 * Qp1 + 288.0 * Qp2 - 72.0 * Qp3 + 12.0 * QpN) / 7.0; - end else if (SWNQS_i == 5) begin - dQy = (-181.0 * Qp0 - 84.0 * Qp1 + 24.0 * Qp4 - 6.0 * Qp5 - 90.0 * Qp3 + QpN - + 336.0 * Qp2) / 65.0; - d2Qy = (432.0 * Qp4 - 108.0 * Qp5 - 1620.0 * Qp3 + 18.0 * QpN + 3762.0 * Qp0 - - 8532.0 * Qp1 + 6048.0 * Qp2) / 65.0; - end else if (SWNQS_i == 9) begin - dQy = (1680.0 * Qp6 + 23400.0 * Qp4 + 5.0 * QpN - 87330.0 * Qp3 + 120.0 * Qp8 - - 450.0 * Qp7 - 81480.0 * Qp1 + 325920.0 * Qp2 - -175565.0 * Qp0 - 30.0 * Qp9) / 37829.0 - 30.0 / 181.0 * Qp5; - d2Qy = (-13500.0 * Qp7 + 702000.0 * Qp4 - 2619900 * Qp3 - 13793100.0 * Qp1 - + 9777600.0 * Qp2 + 6081750.0 * Qp0 + 150.0 * QpN + 3600.0 * Qp8 - - 900.0 * Qp9 + 50400 * Qp6) / 37829.0 - 900.0 / 181.0 * Qp5; - end else begin - dQy = 0; - d2Qy = 0; - end - `fq(Qp1, xg, dQy, d2Qy, fk1) -end - -if (SWNQS_i >= 2) begin - if (SWNQS_i == 2) begin - dQy = (2.0 * Qp0 - 12.0 * Qp1 + 3.0 * Qp2 + 7.0 * QpN) / 5.0; - d2Qy = -18.0 / 5.0 * (-4.0 * QpN + 9.0 * Qp2 - 6.0 * Qp1 + Qp0); - end else if (SWNQS_i == 3) begin - dQy = 0.5 * Qp0 - 3.0 * Qp1 + 3.0 * Qp3 - 0.5 * QpN; - d2Qy = (-48.0 * Qp0 + 288.0 * Qp1 - 480.0 * Qp2 + 288.0 * Qp3 - 48.0 * QpN) / 7.0; - end else if (SWNQS_i == 5) begin - dQy = (-291.0 * Qp1 - 6.0 * Qp2 - 84.0 * Qp4 + 21.0 * Qp5) / 65.0 - + (630.0 * Qp3 - 7.0 * QpN + 97.0 * Qp0) / 130.0; - d2Qy = (-1728.0 * Qp4 + 432.0 * Qp5 + 6480.0 * Qp3 - 72.0 * QpN - 1008 * Qp0 - + 6048 * Qp1 - 10152 * Qp2) / 65.0; - end else if (SWNQS_i == 9) begin - dQy = (-5880.0 * Qp6 - 81900.0 * Qp4 + 305655.0 * Qp3 - 420.0 * Qp8 - + 105.0 * Qp9 - 282255.0 * Qp1 + 1575.0 * Qp7 - 5850.0 * Qp2) / 37829.0 - + 105.0 / 181.0 * Qp5 + (94085.0 * Qp0 - 35.0 * QpN) / 75658.0; - d2Qy = (9777600.0 * Qp1 + 54000.0 * Qp7 - 2808000.0 * Qp4 + 10479600.0 * Qp3 - - 16413000.0 * Qp2 - 1629600.0 * Qp0 - 600.0 * QpN - 14400.0 * Qp8 - + 3600.0 * Qp9 - 201600.0 * Qp6) / 37829.0 + 3600.0 * Qp5 / 181.0; - end else begin - dQy = 0; - d2Qy = 0; - end - `fq(Qp2, xg, dQy, d2Qy, fk2) -end - -if (SWNQS_i >= 3) begin - if (SWNQS_i == 3) begin - dQy = (13.0 * QpN + 6.0 * Qp3 - 24.0 * Qp2 + 6.0 * Qp1 - Qp0) / 7.0; - d2Qy = (180.0 * QpN - 408.0 * Qp3 + 288.0 * Qp2 - 72.0 * Qp1 + 12.0 * Qp0) / 7.0; - end else if (SWNQS_i == 5) begin - dQy = (QpN - 6.0 * Qp5 + 24.0 * Qp4 - 24.0 * Qp2 + 6.0 * Qp1 - Qp0) / 5.0; - d2Qy = (1296.0 * (Qp4 + Qp2) - 324.0 * (Qp5 + Qp1) - 2052.0 * Qp3 - + 54.0 * (QpN + Qp0)) / 13.0; - end else if (SWNQS_i == 9) begin - dQy = (21840.0 * Qp6 + 304200.0 * Qp4 + 65.0 * QpN - 420.0 * Qp3 + 1560.0 * Qp8 - - 12605.0 * Qp0-390.0 * Qp9 + 75630.0 * Qp1 - 5850.0 * Qp7 - - 302520.0 * Qp2) / 37829.0 - 390.0 / 181.0 * Qp5; - d2Qy = (-2619900.0 * Qp1 - 202500.0 * Qp7 + 10530000.0 * Qp4 - 16601100.0 * Qp3 - + 10479600.0 * Qp2 + 436650.0 * Qp0 + 2250.0 * QpN + 54000.0 * Qp8 - - 13500.0 * Qp9 + 756000.0 * Qp6) / 37829.0 - 13500.0 * Qp5 / 181.0; - end else begin - dQy = 0; - d2Qy = 0; - end - `fq(Qp3, xg, dQy, d2Qy, fk3) -end - -if (SWNQS_i >= 4) begin - if (SWNQS_i == 5) begin - dQy = (-630.0 * Qp3 + 12.0 * Qp4 + 582.0 * Qp5 - 97.0 * QpN + 7.0 * Qp0 - - 42.0 * Qp1 + 168.0 * Qp2)/130.0; - d2Qy = (-10152.0 * Qp4 + 6048.0 * Qp5 + 6480.0 * Qp3 - 1008.0 * QpN - - 72.0 * Qp0 + 432.0 * Qp1 - 1728.0 * Qp2) / 65.0; - end - else if (SWNQS_i == 9) begin - dQy = (-81480.0 * Qp6 - 30.0 * Qp4 - 303975.0 * Qp3 - 5820.0 * Qp8 - + 1455.0 * Qp9 - 20265.0 * Qp1 + 21825.0 * Qp7 + 81060.0 * Qp2) / 37829.0 - - 485.0 / 75658.0 * QpN + 1455.0 * Qp5 / 181.0 + 6755.0 * Qp0 / 75658.0; - d2Qy = (702000.0 * Qp1 + 756000.0 * Qp7 - 16614600.0 * Qp4 + 10530000.0 * Qp3 - - 2808000.0 * Qp2 - 117000.0 * Qp0 - 8400.0 * QpN - 201600.0 * Qp8 - + 50400.0 * Qp9 - 2822400.0 * Qp6) / 37829.0 + 50400.0 * Qp5 / 181.0; - end else begin - dQy = 0; - d2Qy = 0; - end - `fq(Qp4, xg, dQy, d2Qy, fk4) -end - -if (SWNQS_i >= 5) begin - if (SWNQS_i == 5) begin - dQy = (-336.0 * Qp4 + 84.0 * Qp5 + 90.0 * Qp3 + 181.0 * QpN - Qp0 + 6.0 * Qp1 - - 24.0 * Qp2) / 65.0; - d2Qy = (18.0 * Qp0 + 3762.0 * QpN + 6048.0 * Qp4 + 432.0 * Qp2 - 1620.0 * Qp3 - - 108.0 * Qp1 - 8532.0 * Qp5) / 65.0; - end else if (SWNQS_i == 9) begin - dQy = (1680.0 * (Qp6 - Qp4) + 5.0 * (QpN - Qp0) + 450.0 * (Qp3 - Qp7) - + 120.0 * (Qp8 - Qp2) - 30.0 * (Qp9 - Qp1)) / 209.0; - d2Qy = (-900.0 * (Qp1 + Qp9) - 13500.0 * (Qp7 + Qp3) - 79500.0 * Qp5 - + 50400.0 * (Qp4 + Qp6) + 3600.0 * (Qp2 + Qp8) + 150.0 * (Qp0 + QpN)) / 181.0; - end else begin - dQy = 0; - d2Qy = 0; - end - `fq(Qp5, xg, dQy, d2Qy, fk5) -end - -if (SWNQS_i >= 6) begin - if (SWNQS_i == 9) begin - dQy = (30.0 * Qp6 + 81480.0 * Qp4 - 21825.0 * Qp3 - 81060.0 * Qp8 + 20265.0 * Qp9 - - 1455.0 * Qp1 + 303975.0 * Qp7 + 5820.0 * Qp2) / 37829.0 - -(6755.0 * QpN - 485.0 * Qp0) / 75658.0 - 1455.0 / 181.0 * Qp5; - d2Qy = (50400.0 * Qp1 + 10530000.0 * Qp7 - 2822400.0 * Qp4 + 756000.0 * Qp3 - - 201600.0 * Qp2 - 8400.0 * Qp0 - 117000.0 * QpN - 2808000.0 * Qp8 - + 702000.0 * Qp9 - 16614600.0 * Qp6) / 37829.0 + 50400.0 * Qp5 / 181.0; - end else begin - dQy = 0; - d2Qy = 0; - end - `fq(Qp6, xg, dQy, d2Qy, fk6) -end - -if (SWNQS_i >= 7) begin - if (SWNQS_i == 9) begin - dQy = (-304200.0 * Qp6 - 21840.0 * Qp4 + 12605.0 * QpN + 5850.0 * Qp3 - + 302520.0 * Qp8 - 65.0 * Qp0 - 75630.0 * Qp9 + 390.0 * Qp1 + 420.0 * Qp7 - - 1560.0 * Qp2) / 37829.0 + 390.0 / 181.0 * Qp5; - d2Qy = (-13500.0 * Qp1 - 16601100.0 * Qp7 + 756000.0 * Qp4 - 202500.0 * Qp3 - + 54000.0 * Qp2 + 2250.0 * Qp0 + 436650.0 * QpN + 10479600.0 * Qp8 - - 2619900.0 * Qp9 + 10530000.0 * Qp6) / 37829.0 - 13500.0 * Qp5 / 181.0; - end else begin - dQy = 0; - d2Qy = 0; - end - `fq(Qp7, xg, dQy, d2Qy, fk7) -end - -if (SWNQS_i >= 8) begin - if (SWNQS_i == 9) begin - dQy = (81900.0 * Qp6 + 5880.0 * Qp4 - 1575.0 * Qp3 + 5850.0 * Qp8 + 282255.0 * Qp9 - - 105.0 * Qp1 - 305655.0 * Qp7 + 420.0 * Qp2) / 37829.0 + (35.0 * Qp0 - - 94085.0 * QpN) / 75658.0 - 105.0 / 181.0 * Qp5; - d2Qy = (3600.0 * Qp1 + 10479600.0 * Qp7 - 201600.0 * Qp4 + 54000.0 * Qp3 - - 14400.0 * Qp2 - 600.0 * Qp0 - 1629600.0 * QpN - 16413000.0 * Qp8 - + 9777600.0 * Qp9 - 2808000.0 * Qp6) / 37829.0 + 3600.0 * Qp5 / 181.0; - end else begin - dQy = 0; - d2Qy = 0; - end - `fq(Qp8, xg, dQy, d2Qy, fk8) -end - -if (SWNQS_i >= 9) begin - if (SWNQS_i == 9) begin - dQy = (-23400.0 * Qp6 - 1680.0 * Qp4 + 175565.0 * QpN + 450.0 * Qp3 - - 325920.0 * Qp8 - 5.0 * Qp0 + 81480.0 * Qp9 + 30.0 * Qp1 - + 87330.0 * Qp7 - 120.0 * Qp2) / 37829.0 + 30.0 * Qp5 / 181.0; - d2Qy = (-900.0 * Qp1 - 2619900.0 * Qp7 + 50400.0 * Qp4 - 13500.0 * Qp3 - + 3600.0 * Qp2 + 150.0 * Qp0 + 6081750.0 * QpN + 9777600.0 * Qp8 - - 13793100.0 * Qp9 + 702000.0 * Qp6) / 37829.0 - 900.0 * Qp5 / 181.0; - end else begin - dQy = 0; - d2Qy = 0; - end - `fq(Qp9, xg, dQy, d2Qy, fk9) -end - -//-------------------------------------------------------------------- - -// Terminal charges for NQS -if (SWNQS_i != 0) begin - if (SWNQS_i == 1) begin - QS_NQS = (17.0 * Qp0 + 30.0 * Qp1 + QpN) / 96.0; - QD_NQS = (Qp0 + 30.0 * Qp1 + 17.0 * QpN) / 96.0; - `QiToPhi(Qp1,xg, temp1) - QG_NQS = xg - (x_sp + 4.0 * temp1 + x_dp) * `oneSixth; - end else if (SWNQS_i == 2) begin - QS_NQS = (11.0 * Qp0 + 24.0 * Qp1 + 9.0 * Qp2 + QpN) / 90.0; - QD_NQS = (11.0 * QpN + 24.0 * Qp2 + 9.0 * Qp1 + Qp0) / 90.0; - `QiToPhi(Qp1, xg, temp1) - `QiToPhi(Qp2, xg, temp2) - QG_NQS = xg - (x_sp + 3.0 * (temp1 + temp2) + x_dp) * 0.125; - end else if (SWNQS_i == 3) begin - QS_NQS = (251.0 * Qp0 + 594.0 * Qp1 + 312.0 * Qp2 + 174.0 * Qp3 + 13.0 * QpN) / 2688.0; - QD_NQS = (251.0 * QpN + 594.0 * Qp3 + 312.0 * Qp2 + 174.0 * Qp1 + 13.0 * Qp0) / 2688.0; - `QiToPhi(Qp1, xg, temp1) - `QiToPhi(Qp2, xg, temp2) - `QiToPhi(Qp3, xg, temp3) - QG_NQS = xg - (x_sp + 4.0 * temp1 + 2.0 * temp2 + 4.0 * temp3 + x_dp) / 12.0; - end else if (SWNQS_i == 5) begin - QS_NQS = (1187.0 * Qp0 + 43.0 * QpN) / 18720.0 + (503.0 * Qp1 + 172.0 * Qp4 - + 87.0 * Qp5 + 265.0 * Qp3 + 328.0 * Qp2) / 3120.0; - QD_NQS = (1187.0 * QpN + 43.0 * Qp0) / 18720.0 + (503.0 * Qp5 + 172.0 * Qp2 - + 87.0 * Qp1 + 265.0 * Qp3 + 328.0 * Qp4) / 3120.0; - `QiToPhi(Qp1, xg, temp1) - `QiToPhi(Qp2, xg, temp2) - `QiToPhi(Qp3, xg, temp3) - `QiToPhi(Qp4, xg, temp4) - `QiToPhi(Qp5, xg, temp5) - QG_NQS = xg - (x_sp + 4.0 * (temp1 + temp3 + temp5) + 2.0 * (temp2 + temp4) + x_dp) / 18.0; - end else if (SWNQS_i == 9) begin - QS_NQS = (75653.0 * Qp8 + 225999.0 * Qp4) / 3782900.0 + (151321.0 * Qp9 - + 454023.0 * Qp7 + 1073767.0 * Qp3 + 1564569.0 * Qp1) / 15131600.0 - + 75623.0 * Qp6 / 1891450.0 + 145.0 * Qp5 / 2896.0 + 72263.0 * Qp2 / 945725.0 - + (3504517.0 * Qp0 + 75653.0 * QpN) / 90789600.0; - QD_NQS = (75653.0 * Qp2 + 225999.0 * Qp6) / 3782900.0 + (151321.0 * Qp1 - + 454023.0 * Qp3 + 1073767.0 * Qp7 + 1564569.0 * Qp9) / 15131600.0 - + 75623.0 * Qp4 / 1891450.0 + 145.0 * Qp5 / 2896.0 + 72263.0 * Qp8 / 945725.0 - + (3504517.0 * QpN + 75653.0 * Qp0) / 90789600.0; - `QiToPhi(Qp1, xg, temp1) - `QiToPhi(Qp2, xg, temp2) - `QiToPhi(Qp3, xg, temp3) - `QiToPhi(Qp4, xg, temp4) - `QiToPhi(Qp5, xg, temp5) - `QiToPhi(Qp6, xg, temp6) - `QiToPhi(Qp7, xg, temp7) - `QiToPhi(Qp8, xg, temp8) - `QiToPhi(Qp9, xg, temp9) - QG_NQS = xg - (x_sp + 4.0 * (temp1 + temp3 + temp5 + temp7 + temp9) - + 2.0 * (temp2 + temp4 + temp6 + temp8) + x_dp) / 30.0; - end - QG_NQS = pd * QG_NQS; - - if (sigVds > 0) begin - Qs = COX_qm * phit1 * QS_NQS; - Qd = COX_qm * phit1 * QD_NQS; - end else begin - Qs = COX_qm * phit1 * QD_NQS; - Qd = COX_qm * phit1 * QS_NQS; - end - Qg = COX_qm * phit1 * QG_NQS; - Qb = -Qg - Qs - Qd; -end - -// Update internal nodes -V(RES1) <+ vnorm_inv * I(RES1) * r_nqs; -V(SPLINE1) <+ vnorm_inv * idt(-Tnorm * fk1, Qp1_0); -V(RES2) <+ vnorm_inv * I(RES2) * r_nqs; -V(SPLINE2) <+ vnorm_inv * idt(-Tnorm * fk2, Qp2_0); -V(RES3) <+ vnorm_inv * I(RES3) * r_nqs; -V(SPLINE3) <+ vnorm_inv * idt(-Tnorm * fk3, Qp3_0); -V(RES4) <+ vnorm_inv * I(RES4) * r_nqs; -V(SPLINE4) <+ vnorm_inv * idt(-Tnorm * fk4, Qp4_0); -V(RES5) <+ vnorm_inv * I(RES5) * r_nqs; -V(SPLINE5) <+ vnorm_inv * idt(-Tnorm * fk5, Qp5_0); -V(RES6) <+ vnorm_inv * I(RES6) * r_nqs; -V(SPLINE6) <+ vnorm_inv * idt(-Tnorm * fk6, Qp6_0); -V(RES7) <+ vnorm_inv * I(RES7) * r_nqs; -V(SPLINE7) <+ vnorm_inv * idt(-Tnorm * fk7, Qp7_0); -V(RES8) <+ vnorm_inv * I(RES8) * r_nqs; -V(SPLINE8) <+ vnorm_inv * idt(-Tnorm * fk8, Qp8_0); -V(RES9) <+ vnorm_inv * I(RES9) * r_nqs; -V(SPLINE9) <+ vnorm_inv * idt(-Tnorm * fk9, Qp9_0); - diff --git a/src/spicelib/devices/adms/psp102/admsva/PSP102_InitNQS.include b/src/spicelib/devices/adms/psp102/admsva/PSP102_InitNQS.include deleted file mode 100644 index 3bdd3c858..000000000 --- a/src/spicelib/devices/adms/psp102/admsva/PSP102_InitNQS.include +++ /dev/null @@ -1,197 +0,0 @@ -//====================================================================================== -//====================================================================================== -// Filename: PSP102_InitNQS.include -//====================================================================================== -//====================================================================================== -// -// (c) Copyright notice -// -// Since 2012 until today, PSP has been co-developed by NXP Semiconductors and -// Delft University of Technology. For this part of the model, each claim undivided -// ownership and copyrights -// Until and including 2011, PSP has been co-developed by NXP Semiconductors and -// Arizona State University. For this part of the model, NXP Semiconductors claims -// undivided ownership and copyrights. -// -// -// Version: 102.5.0, December 2013 -// -//====================================================================================== -//====================================================================================== -// -// Further information can be found in the file releasenotesPSP102.txt -// - -///////////////////////////////////////////////////////////////////////////// -// -// Computing initial (dc) values for internal nodes. -// This code is independent of internal-node voltages -// -///////////////////////////////////////////////////////////////////////////// - -Qp1_0 = 0.0; -Qp2_0 = 0.0; -Qp3_0 = 0.0; -Qp4_0 = 0.0; -Qp5_0 = 0.0; -Qp6_0 = 0.0; -Qp7_0 = 0.0; -Qp8_0 = 0.0; -Qp9_0 = 0.0; -fk1 = 0.0; -fk2 = 0.0; -fk3 = 0.0; -fk4 = 0.0; -fk5 = 0.0; -fk6 = 0.0; -fk7 = 0.0; -fk8 = 0.0; -fk9 = 0.0; -if (SWNQS_i != 0) begin - dQis = 0.0; - dQy = 0.0; - dfQi = 0.0; - fQi = 0.0; - d2Qy = 0.0; - - Qp1 = 0.0; - Qp2 = 0.0; - Qp3 = 0.0; - Qp4 = 0.0; - Qp5 = 0.0; - Qp6 = 0.0; - Qp7 = 0.0; - Qp8 = 0.0; - Qp9 = 0.0; - - phi_p1 = 0.0; - phi_p2 = 0.0; - phi_p3 = 0.0; - phi_p4 = 0.0; - phi_p5 = 0.0; - phi_p6 = 0.0; - phi_p7 = 0.0; - phi_p8 = 0.0; - phi_p9 = 0.0; - - // Setting initial values for charge along the channel - // from interpolated DC-solution - if (xg > 0) begin - if (SWNQS_i == 1) begin - phi_p1 = `Phiy(0.5); - `PhiToQb(phi_p1,Qb_tmp) - Qp1_0 = -pd * (xg - phi_p1) - Qb_tmp; - end else if (SWNQS_i == 2) begin - phi_p1 = `Phiy(`oneThird); - `PhiToQb(phi_p1,Qb_tmp) - Qp1_0 = -pd * (xg - phi_p1) - Qb_tmp; - - phi_p2 = `Phiy(`twoThirds); - `PhiToQb(phi_p2,Qb_tmp) - Qp2_0 = -pd * (xg - phi_p2) - Qb_tmp; - if (sigVds < 0) begin - `swap(Qp1_0, Qp2_0) - end - end else if (SWNQS_i == 3) begin - phi_p1 = `Phiy(0.25); - `PhiToQb(phi_p1,Qb_tmp) - Qp1_0 = -pd * (xg - phi_p1) - Qb_tmp; - - phi_p2 = `Phiy(0.5); - `PhiToQb(phi_p2,Qb_tmp) - Qp2_0 = -pd * (xg - phi_p2) - Qb_tmp; - - phi_p3 = `Phiy(0.75); - `PhiToQb(phi_p3,Qb_tmp) - Qp3_0 = -pd * (xg - phi_p3) - Qb_tmp; - if (sigVds < 0) begin - `swap(Qp1_0, Qp3_0) - end - end else if (SWNQS_i == 5) begin - phi_p1 = `Phiy(`oneSixth); - `PhiToQb(phi_p1,Qb_tmp) - Qp1_0 = -pd * (xg - phi_p1) - Qb_tmp; - - phi_p2 = `Phiy(`oneThird); - `PhiToQb(phi_p2,Qb_tmp) - Qp2_0 = -pd * (xg - phi_p2) - Qb_tmp; - - phi_p3 = `Phiy(0.5); - `PhiToQb(phi_p3,Qb_tmp) - Qp3_0 = -pd * (xg - phi_p3) - Qb_tmp; - - phi_p4 = `Phiy(`twoThirds); - `PhiToQb(phi_p4,Qb_tmp) - Qp4_0 = -pd * (xg - phi_p4) - Qb_tmp; - - phi_p5 = `Phiy(0.8333333333333333); - `PhiToQb(phi_p5,Qb_tmp) - Qp5_0 = -pd * (xg - phi_p5) - Qb_tmp; - if (sigVds < 0) begin - `swap(Qp1_0, Qp5_0) - `swap(Qp2_0, Qp4_0) - end - end else if (SWNQS_i == 9) begin - phi_p1 = `Phiy(0.1); - `PhiToQb(phi_p1,Qb_tmp) - Qp1_0 = -pd * (xg - phi_p1) - Qb_tmp; - - phi_p2 = `Phiy(0.2); - `PhiToQb(phi_p2,Qb_tmp) - Qp2_0 = -pd * (xg - phi_p2) - Qb_tmp; - - phi_p3 = `Phiy(0.3); - `PhiToQb(phi_p3,Qb_tmp) - Qp3_0 = -pd * (xg - phi_p3) - Qb_tmp; - - phi_p4 = `Phiy(0.4); - `PhiToQb(phi_p4,Qb_tmp) - Qp4_0 = -pd * (xg - phi_p4) - Qb_tmp; - - phi_p5 = `Phiy(0.5); - `PhiToQb(phi_p5,Qb_tmp) - Qp5_0 = -pd * (xg - phi_p5) - Qb_tmp; - - phi_p6 = `Phiy(0.6); - `PhiToQb(phi_p6,Qb_tmp) - Qp6_0 = -pd * (xg - phi_p6) - Qb_tmp; - - phi_p7 = `Phiy(0.7); - `PhiToQb(phi_p7,Qb_tmp) - Qp7_0 = -pd * (xg - phi_p7) - Qb_tmp; - - phi_p8 = `Phiy(0.8); - `PhiToQb(phi_p8,Qb_tmp) - Qp8_0 = -pd * (xg - phi_p8) - Qb_tmp; - - phi_p9 = `Phiy(0.9); - `PhiToQb(phi_p9,Qb_tmp) - Qp9_0 = -pd * (xg - phi_p9) - Qb_tmp; - if (sigVds < 0) begin - `swap(Qp1_0, Qp9_0) - `swap(Qp2_0, Qp8_0) - `swap(Qp3_0, Qp7_0) - `swap(Qp4_0, Qp6_0) - end - end - end // (x_g >0) -end // (SWNQS_i != 0) - -x_sp = 0.0; -x_dp = 0.0; -Qp0 = 0.0; -QpN = 0.0; -if (SWNQS_i != 0.0) begin - x_sp = x_m - sigVds * 0.5 * dps * inv_phit1; - x_dp = x_m + sigVds * 0.5 * dps * inv_phit1; - Qp0 = 0.0; - QpN = 0.0; - if (x_sp > 0) begin - `PhiToQb(x_sp, QbSIGN) - Qp0 = -pd * (xg - x_sp) - QbSIGN; - end - if (x_dp > 0) begin - `PhiToQb(x_dp, QbSIGN) - QpN = -pd * (xg - x_dp) - QbSIGN; - end -end diff --git a/src/spicelib/devices/adms/psp102/admsva/PSP102_binning.include b/src/spicelib/devices/adms/psp102/admsva/PSP102_binning.include deleted file mode 100644 index 65c95e896..000000000 --- a/src/spicelib/devices/adms/psp102/admsva/PSP102_binning.include +++ /dev/null @@ -1,152 +0,0 @@ -//====================================================================================== -//====================================================================================== -// Filename: PSP102_binning.include -//====================================================================================== -//====================================================================================== -// -// (c) Copyright notice -// -// Since 2012 until today, PSP has been co-developed by NXP Semiconductors and -// Delft University of Technology. For this part of the model, each claim undivided -// ownership and copyrights -// Until and including 2011, PSP has been co-developed by NXP Semiconductors and -// Arizona State University. For this part of the model, NXP Semiconductors claims -// undivided ownership and copyrights. -// -// -// Version: 102.5.0, December 2013 -// -//====================================================================================== -//====================================================================================== -// -// Further information can be found in the file releasenotesPSP102.txt -// - -// auxiliary variables -iLEWE = iLE * iWE; -iiLE = LE / LEN; -iiWE = WE / WEN; -iiLEWE = iiLE * iiWE; -iiiLEWE = iiWE / iiLE; - -// auxiliary variables for COX only -iiLEcv = LEcv / LEN; -iiWEcv = WEcv / WEN; -iiLEWEcv = iiLEcv * iiWEcv; - -// auxiliary variables for CGOV only -iLEcv = LEN / LEcv; -iiiLEWEcv = iiWEcv / iiLEcv; - -// auxiliary variables for CGBOV only -iiLcv = Lcv / LEN; -iiWcv = Wcv / WEN; -iiLWcv = iiLcv * iiWcv; - -// auxiliary variables for CFR only -iLcv = LEN / Lcv; -iiiLWcv = iiWcv / iiLcv; - -// Process parameters -VFB = POVFB + iLE * PLVFB + iWE * PWVFB + iLEWE * PLWVFB; -STVFB = POSTVFB + iLE * PLSTVFB + iWE * PWSTVFB + iLEWE * PLWSTVFB; -TOX = POTOX; -EPSROX = POEPSROX; -NEFF = PONEFF + iLE * PLNEFF + iWE * PWNEFF + iLEWE * PLWNEFF; -VNSUB = POVNSUB; -NSLP = PONSLP; -DNSUB = PODNSUB; -DPHIB = PODPHIB + iLE * PLDPHIB + iWE * PWDPHIB + iLEWE * PLWDPHIB; -NP = PONP + iLE * PLNP + iWE * PWNP + iLEWE * PLWNP; -CT = POCT + iLE * PLCT + iWE * PWCT + iLEWE * PLWCT; -TOXOV = POTOXOV; -TOXOVD = POTOXOVD; -NOV = PONOV + iLE * PLNOV + iWE * PWNOV + iLEWE * PLWNOV; -NOVD = PONOVD + iLE * PLNOVD + iWE * PWNOVD + iLEWE * PLWNOVD; - -// DIBL parameters -CF = POCF + iLE * PLCF + iWE * PWCF + iLEWE * PLWCF; -CFB = POCFB; - -// Mobility parameters -BETN = POBETN + iLE * PLBETN + iiWE * PWBETN + iiiLEWE * PLWBETN; - - -STBET = POSTBET + iLE * PLSTBET + iWE * PWSTBET + iLEWE * PLWSTBET; -MUE = POMUE + iLE * PLMUE + iWE * PWMUE + iLEWE * PLWMUE; -STMUE = POSTMUE; -THEMU = POTHEMU; -STTHEMU = POSTTHEMU; -CS = POCS + iLE * PLCS + iWE * PWCS + iLEWE * PLWCS; -STCS = POSTCS; -XCOR = POXCOR + iLE * PLXCOR + iWE * PWXCOR + iLEWE * PLWXCOR; -STXCOR = POSTXCOR; -FETA = POFETA; - -// Series resistance parameters -RS = PORS + iLE * PLRS + iWE * PWRS + iLEWE * PLWRS; -STRS = POSTRS; -RSB = PORSB; -RSG = PORSG; - -// Velocity saturation parameters -THESAT = POTHESAT + iLE * PLTHESAT + iWE * PWTHESAT + iLEWE * PLWTHESAT; -STTHESAT = POSTTHESAT + iLE * PLSTTHESAT + iWE * PWSTTHESAT + iLEWE * PLWSTTHESAT; -THESATB = POTHESATB + iLE * PLTHESATB + iWE * PWTHESATB + iLEWE * PLWTHESATB; -THESATG = POTHESATG + iLE * PLTHESATG + iWE * PWTHESATG + iLEWE * PLWTHESATG; - -// Saturation voltage parameters -AX = POAX + iLE * PLAX + iWE * PWAX + iLEWE * PLWAX; - -// Channel length modulation (CLM) parameters -ALP = POALP + iLE * PLALP + iWE * PWALP + iLEWE * PLWALP; -ALP1 = POALP1 + iLE * PLALP1 + iWE * PWALP1 + iLEWE * PLWALP1; -ALP2 = POALP2 + iLE * PLALP2 + iWE * PWALP2 + iLEWE * PLWALP2; -VP = POVP; - -// Impact ionization parameters -A1 = POA1 + iLE * PLA1 + iWE * PWA1 + iLEWE * PLWA1; -A2 = POA2; -STA2 = POSTA2; -A3 = POA3 + iLE * PLA3 + iWE * PWA3 + iLEWE * PLWA3; -A4 = POA4 + iLE * PLA4 + iWE * PWA4 + iLEWE * PLWA4; -GCO = POGCO; - -// Gate current parameters -IGINV = POIGINV + iiLE * PLIGINV + iiWE * PWIGINV + iiLEWE * PLWIGINV; -IGOV = POIGOV + iLE * PLIGOV + iiWE * PWIGOV + iiiLEWE * PLWIGOV; -IGOVD = POIGOVD + iLE * PLIGOVD + iiWE * PWIGOVD + iiiLEWE * PLWIGOVD; -STIG = POSTIG; -GC2 = POGC2; -GC3 = POGC3; -CHIB = POCHIB; - -// Gate-induced drain leakage (GIDL) parameters -AGIDL = POAGIDL + iLE * PLAGIDL + iiWE * PWAGIDL + iiiLEWE * PLWAGIDL; -AGIDLD = POAGIDLD + iLE * PLAGIDLD + iiWE * PWAGIDLD + iiiLEWE * PLWAGIDLD; -BGIDL = POBGIDL; -BGIDLD = POBGIDLD; -STBGIDL = POSTBGIDL; -STBGIDLD = POSTBGIDLD; -CGIDL = POCGIDL; -CGIDLD = POCGIDLD; - -// Charge model parameters -COX = POCOX + iiLEcv * PLCOX + iiWEcv * PWCOX + iiLEWEcv * PLWCOX; -CGOV = POCGOV + iLEcv * PLCGOV + iiWEcv * PWCGOV + iiiLEWEcv * PLWCGOV; -CGOVD = POCGOVD + iLEcv * PLCGOVD + iiWEcv * PWCGOVD + iiiLEWEcv * PLWCGOVD; -CGBOV = POCGBOV + iiLcv * PLCGBOV + iiWcv * PWCGBOV + iiLWcv * PLWCGBOV; -CFR = POCFR + iLcv * PLCFR + iiWcv * PWCFR + iiiLWcv * PLWCFR; -CFRD = POCFRD + iLcv * PLCFRD + iiWcv * PWCFRD + iiiLWcv * PLWCFRD; - -// Noise model parameters -FNT = POFNT; -FNTEXC = iLE * iLE * (POFNTEXC + iLE * PLFNTEXC + iWE * PWFNTEXC + iLEWE * PLWFNTEXC); -NFA = PONFA + iLE * PLNFA + iWE * PWNFA + iLEWE * PLWNFA; -NFB = PONFB + iLE * PLNFB + iWE * PWNFB + iLEWE * PLWNFB; -NFC = PONFC + iLE * PLNFC + iWE * PWNFC + iLEWE * PLWNFC; -EF = POEF; - -// Well proximity effect parameters -KVTHOWE = POKVTHOWE + iLE * PLKVTHOWE + iWE * PWKVTHOWE + iLEWE * PLWKVTHOWE; -KUOWE = POKUOWE + iLE * PLKUOWE + iWE * PWKUOWE + iLEWE * PLWKUOWE; diff --git a/src/spicelib/devices/adms/psp102/admsva/PSP102_binpars.include b/src/spicelib/devices/adms/psp102/admsva/PSP102_binpars.include deleted file mode 100644 index a02b837f3..000000000 --- a/src/spicelib/devices/adms/psp102/admsva/PSP102_binpars.include +++ /dev/null @@ -1,287 +0,0 @@ -//====================================================================================== -//====================================================================================== -// Filename: PSP102_binpars.include -//====================================================================================== -//====================================================================================== -// -// (c) Copyright notice -// -// Since 2012 until today, PSP has been co-developed by NXP Semiconductors and -// Delft University of Technology. For this part of the model, each claim undivided -// ownership and copyrights -// Until and including 2011, PSP has been co-developed by NXP Semiconductors and -// Arizona State University. For this part of the model, NXP Semiconductors claims -// undivided ownership and copyrights. -// -// -// Version: 102.5.0, December 2013 -// -//====================================================================================== -//====================================================================================== -// -// Further information can be found in the file releasenotesPSP102.txt -// - -/////////////////////////////////////////////////// -// PSP global model parameters (binning) -/////////////////////////////////////////////////// - -parameter real LEVEL = 1021 `P(info="Model level" unit=""); -parameter real TYPE = 1 `from( -1.0,1.0 ) `P(info="Channel type parameter, +1=NMOS -1=PMOS" unit=""); -parameter real TR = 21 `from( -273.0,inf ) `P(info="nominal (reference) temperature" unit="C"); - -// Switch parameters -parameter real SWIGATE = 0 `from( 0.0,1.0 ) `P(info="Flag for gate current, 0=turn off IG" unit=""); -parameter real SWIMPACT = 0 `from( 0.0,1.0 ) `P(info="Flag for impact ionization current, 0=turn off II" unit=""); -parameter real SWGIDL = 0 `from( 0.0,1.0 ) `P(info="Flag for GIDL current, 0=turn off IGIDL" unit=""); -parameter real SWJUNCAP = 0 `from( 0.0,3.0 ) `P(info="Flag for juncap, 0=turn off juncap" unit=""); -parameter real SWJUNASYM = 0 `P(info="Flag for asymmetric junctions; 0=symmetric, 1=asymmetric" unit=""); -parameter real QMC = 1 `from( 0.0,inf ) `P(info="Quantum-mechanical correction factor" unit=""); - -// Process parameters -parameter real LVARO = 0 `P(info="Geometry independent difference between actual and programmed poly-silicon gate length" unit="m"); -parameter real LVARL = 0 `P(info="Length dependence of difference between actual and programmed poly-silicon gate length" unit=""); -parameter real LAP = 0 `P(info="Effective channel length reduction per side due to lateral diffusion of source/drain dopant ions" unit="m"); -parameter real WVARO = 0 `P(info="Geometry independent difference between actual and programmed field-oxide opening" unit="m"); -parameter real WVARW = 0 `P(info="Width dependence of difference between actual and programmed field-oxide opening" unit=""); -parameter real WOT = 0 `P(info="Effective reduction of channel width per side due to lateral diffusion of channel-stop dopant ions" unit="m"); -parameter real DLQ = 0 `P(info="Effective channel length reduction for CV" unit="m"); -parameter real DWQ = 0 `P(info="Effective channel width reduction for CV" unit="m"); -parameter real POVFB = -1 `P(info="Coefficient for the geometry independent part of VFB" unit="V"); -parameter real PLVFB = 0.0 `P(info="Coefficient for the length dependence of VFB" unit="V"); -parameter real PWVFB = 0.0 `P(info="Coefficient for the width dependence of VFB" unit="V"); -parameter real PLWVFB = 0.0 `P(info="Coefficient for the length times width dependence of VFB" unit="V"); -parameter real POSTVFB = 0.0005 `P(info="Coefficient for the geometry independent part of STVFB" unit="V/K"); -parameter real PLSTVFB = 0.0 `P(info="Coefficient for the length dependence of STVFB" unit="V/K"); -parameter real PWSTVFB = 0.0 `P(info="Coefficient for the width dependence of STVFB" unit="V/K"); -parameter real PLWSTVFB = 0.0 `P(info="Coefficient for the length times width dependence of STVFB" unit="V/K"); -parameter real POTOX = 2E-09 `P(info="Coefficient for the geometry independent part of TOX" unit="m"); -parameter real POEPSROX = 3.9 `P(info="Coefficient for the geometry independent part of EPSOX" unit=""); -parameter real PONEFF = 5E+23 `P(info="Coefficient for the geometry independent part of NEFF" unit="m^-3"); -parameter real PLNEFF = 0.0 `P(info="Coefficient for the length dependence of NEFF" unit="m^-3"); -parameter real PWNEFF = 0.0 `P(info="Coefficient for the width dependence of NEFF" unit="m^-3"); -parameter real PLWNEFF = 0.0 `P(info="Coefficient for the length times width dependence of NEFF" unit="m^-3"); -parameter real POVNSUB = 0 `P(info="Coefficient for the geometry independent part of VNSUB" unit="V"); -parameter real PONSLP = 0.05 `P(info="Coefficient for the geometry independent part of NSLP" unit="V"); -parameter real PODNSUB = 0 `P(info="Coefficient for the geometry independent part of DNSUB" unit="V^-1"); -parameter real PODPHIB = 0 `P(info="Coefficient for the geometry independent part of DPHIB" unit="V"); -parameter real PLDPHIB = 0.0 `P(info="Coefficient for the length dependence of DPHIB" unit="V"); -parameter real PWDPHIB = 0.0 `P(info="Coefficient for the width dependence of DPHIB" unit="V"); -parameter real PLWDPHIB = 0.0 `P(info="Coefficient for the length times width dependence of DPHIB" unit="V"); -parameter real PONP = 1E+26 `P(info="Coefficient for the geometry independent part of NP" unit="m^-3"); -parameter real PLNP = 0.0 `P(info="Coefficient for the length dependence of NP" unit="m^-3"); -parameter real PWNP = 0.0 `P(info="Coefficient for the width dependence of NP" unit="m^-3"); -parameter real PLWNP = 0.0 `P(info="Coefficient for the length times width dependence of NP" unit="m^-3"); -parameter real POCT = 0 `P(info="Coefficient for the geometry independent part of CT" unit=""); -parameter real PLCT = 0.0 `P(info="Coefficient for the length dependence of CT" unit=""); -parameter real PWCT = 0.0 `P(info="Coefficient for the width dependence of CT" unit=""); -parameter real PLWCT = 0.0 `P(info="Coefficient for the length times width dependence of CT" unit=""); -parameter real POTOXOV = 2E-09 `P(info="Coefficient for the geometry independent part of TOXOV" unit="m"); -parameter real POTOXOVD = 2E-09 `P(info="Coefficient for the geometry independent part of TOXOV for drain side" unit="m"); -parameter real PONOV = 5E+25 `P(info="Coefficient for the geometry independent part of NOV" unit="m^-3"); -parameter real PLNOV = 0.0 `P(info="Coefficient for the length dependence of NOV" unit="m^-3"); -parameter real PWNOV = 0.0 `P(info="Coefficient for the width dependence of NOV" unit="m^-3"); -parameter real PLWNOV = 0.0 `P(info="Coefficient for the length times width dependence of NOV" unit="m^-3"); -parameter real PONOVD = 5E+25 `P(info="Coefficient for the geometry independent part of NOV for drain side" unit="m^-3"); -parameter real PLNOVD = 0.0 `P(info="Coefficient for the length dependence of NOV for drain side" unit="m^-3"); -parameter real PWNOVD = 0.0 `P(info="Coefficient for the width dependence of NOV for drain side" unit="m^-3"); -parameter real PLWNOVD = 0.0 `P(info="Coefficient for the length times width dependence of NOV for drain side" unit="m^-3"); - -// DIBL parameters -parameter real POCF = 0 `P(info="Coefficient for the geometry independent part of CF" unit=""); -parameter real PLCF = 0.0 `P(info="Coefficient for the length dependence of CF" unit=""); -parameter real PWCF = 0.0 `P(info="Coefficient for the width dependence of CF" unit=""); -parameter real PLWCF = 0.0 `P(info="Coefficient for the length times width dependence of CF" unit=""); -parameter real POCFB = 0 `P(info="Coefficient for the geometry independent part of CFB" unit="V^-1"); - -// Mobility parameters -parameter real POBETN = 0.07 `P(info="Coefficient for the geometry independent part of BETN" unit="m^2/V/s"); -parameter real PLBETN = 0.0 `P(info="Coefficient for the length dependence of BETN" unit="m^2/V/s"); -parameter real PWBETN = 0.0 `P(info="Coefficient for the width dependence of BETN" unit="m^2/V/s"); -parameter real PLWBETN = 0.0 `P(info="Coefficient for the length times width dependence of BETN" unit="m^2/V/s"); -parameter real POSTBET = 1 `P(info="Coefficient for the geometry independent part of STBET" unit=""); -parameter real PLSTBET = 0.0 `P(info="Coefficient for the length dependence of STBET" unit=""); -parameter real PWSTBET = 0.0 `P(info="Coefficient for the width dependence of STBET" unit=""); -parameter real PLWSTBET = 0.0 `P(info="Coefficient for the length times width dependence of STBET" unit=""); -parameter real POMUE = 0.5 `P(info="Coefficient for the geometry independent part of MUE" unit="m/V"); -parameter real PLMUE = 0.0 `P(info="Coefficient for the length dependence of MUE" unit="m/V"); -parameter real PWMUE = 0.0 `P(info="Coefficient for the width dependence of MUE" unit="m/V"); -parameter real PLWMUE = 0.0 `P(info="Coefficient for the length times width dependence of MUE" unit="m/V"); -parameter real POSTMUE = 0 `P(info="Coefficient for the geometry independent part of STMUE" unit=""); -parameter real POTHEMU = 1.5 `P(info="Coefficient for the geometry independent part of THEMU" unit=""); -parameter real POSTTHEMU = 1.5 `P(info="Coefficient for the geometry independent part of STTHEMU" unit=""); -parameter real POCS = 0 `P(info="Coefficient for the geometry independent part of CS" unit=""); -parameter real PLCS = 0.0 `P(info="Coefficient for the length dependence of CS" unit=""); -parameter real PWCS = 0.0 `P(info="Coefficient for the width dependence of CS" unit=""); -parameter real PLWCS = 0.0 `P(info="Coefficient for the length times width dependence of CS" unit=""); -parameter real POSTCS = 0 `P(info="Coefficient for the geometry independent part of STCS" unit=""); -parameter real POXCOR = 0 `P(info="Coefficient for the geometry independent part of XCOR" unit="V^-1"); -parameter real PLXCOR = 0.0 `P(info="Coefficient for the length dependence of XCOR" unit="V^-1"); -parameter real PWXCOR = 0.0 `P(info="Coefficient for the width dependence of XCOR" unit="V^-1"); -parameter real PLWXCOR = 0.0 `P(info="Coefficient for the length times width dependence of XCOR" unit="V^-1"); -parameter real POSTXCOR = 0 `P(info="Coefficient for the geometry independent part of STXCOR" unit=""); -parameter real POFETA = 1 `P(info="Coefficient for the geometry independent part of FETA" unit=""); - -// Series resistance parameters -parameter real PORS = 30 `P(info="Coefficient for the geometry independent part of RS" unit="Ohm"); -parameter real PLRS = 0.0 `P(info="Coefficient for the length dependence of RS" unit="Ohm"); -parameter real PWRS = 0.0 `P(info="Coefficient for the width dependence of RS" unit="Ohm"); -parameter real PLWRS = 0.0 `P(info="Coefficient for the length times width dependence of RS" unit="Ohm"); -parameter real POSTRS = 1 `P(info="Coefficient for the geometry independent part of STRS" unit=""); -parameter real PORSB = 0 `P(info="Coefficient for the geometry independent part of RSB" unit="V^-1"); -parameter real PORSG = 0 `P(info="Coefficient for the geometry independent part of RSG" unit="V^-1"); - -// Velocity saturation parameters -parameter real POTHESAT = 1 `P(info="Coefficient for the geometry independent part of THESAT" unit="V^-1"); -parameter real PLTHESAT = 0.0 `P(info="Coefficient for the length dependence of THESAT" unit="V^-1"); -parameter real PWTHESAT = 0.0 `P(info="Coefficient for the width dependence of THESAT" unit="V^-1"); -parameter real PLWTHESAT = 0.0 `P(info="Coefficient for the length times width dependence of THESAT" unit="V^-1"); -parameter real POSTTHESAT = 1 `P(info="Coefficient for the geometry independent part of STTHESAT" unit=""); -parameter real PLSTTHESAT = 0.0 `P(info="Coefficient for the length dependence of STTHESAT" unit=""); -parameter real PWSTTHESAT = 0.0 `P(info="Coefficient for the width dependence of STTHESAT" unit=""); -parameter real PLWSTTHESAT = 0.0 `P(info="Coefficient for the length times width dependence of STTHESAT" unit=""); -parameter real POTHESATB = 0 `P(info="Coefficient for the geometry independent part of THESATB" unit="V^-1"); -parameter real PLTHESATB = 0.0 `P(info="Coefficient for the length dependence of THESATB" unit="V^-1"); -parameter real PWTHESATB = 0.0 `P(info="Coefficient for the width dependence of THESATB" unit="V^-1"); -parameter real PLWTHESATB = 0.0 `P(info="Coefficient for the length times width dependence of THESATB" unit="V^-1"); -parameter real POTHESATG = 0 `P(info="Coefficient for the geometry independent part of THESATG" unit="V^-1"); -parameter real PLTHESATG = 0.0 `P(info="Coefficient for the length dependence of THESATG" unit="V^-1"); -parameter real PWTHESATG = 0.0 `P(info="Coefficient for the width dependence of THESATG" unit="V^-1"); -parameter real PLWTHESATG = 0.0 `P(info="Coefficient for the length times width dependence of THESATG" unit="V^-1"); - -// Saturation voltage parameters -parameter real POAX = 3 `P(info="Coefficient for the geometry independent part of AX" unit=""); -parameter real PLAX = 0.0 `P(info="Coefficient for the length dependence of AX" unit=""); -parameter real PWAX = 0.0 `P(info="Coefficient for the width dependence of AX" unit=""); -parameter real PLWAX = 0.0 `P(info="Coefficient for the length times width dependence of AX" unit=""); - -// Channel length modulation (CLM) parameters -parameter real POALP = 0.01 `P(info="Coefficient for the geometry independent part of ALP" unit=""); -parameter real PLALP = 0.0 `P(info="Coefficient for the length dependence of ALP" unit=""); -parameter real PWALP = 0.0 `P(info="Coefficient for the width dependence of ALP" unit=""); -parameter real PLWALP = 0.0 `P(info="Coefficient for the length times width dependence of ALP" unit=""); -parameter real POALP1 = 0 `P(info="Coefficient for the geometry independent part of ALP1" unit="V"); -parameter real PLALP1 = 0.0 `P(info="Coefficient for the length dependence of ALP1" unit="V"); -parameter real PWALP1 = 0.0 `P(info="Coefficient for the width dependence of ALP1" unit="V"); -parameter real PLWALP1 = 0.0 `P(info="Coefficient for the length times width dependence of ALP1" unit="V"); -parameter real POALP2 = 0 `P(info="Coefficient for the geometry independent part of ALP2" unit="V^-1"); -parameter real PLALP2 = 0.0 `P(info="Coefficient for the length dependence of ALP2" unit="V^-1"); -parameter real PWALP2 = 0.0 `P(info="Coefficient for the width dependence of ALP2" unit="V^-1"); -parameter real PLWALP2 = 0.0 `P(info="Coefficient for the length times width dependence of ALP2" unit="V^-1"); -parameter real POVP = 0.05 `P(info="Coefficient for the geometry independent part of VP" unit="V"); - -// Impact ionization parameters -parameter real POA1 = 1 `P(info="Coefficient for the geometry independent part of A1" unit=""); -parameter real PLA1 = 0.0 `P(info="Coefficient for the length dependence of A1" unit=""); -parameter real PWA1 = 0.0 `P(info="Coefficient for the width dependence of A1" unit=""); -parameter real PLWA1 = 0.0 `P(info="Coefficient for the length times width dependence of A1" unit=""); -parameter real POA2 = 10 `P(info="Coefficient for the geometry independent part of A2" unit="V"); -parameter real POSTA2 = 0 `P(info="Coefficient for the geometry independent part of STA2" unit="V"); -parameter real POA3 = 1 `P(info="Coefficient for the geometry independent part of A3" unit=""); -parameter real PLA3 = 0.0 `P(info="Coefficient for the length dependence of A3" unit=""); -parameter real PWA3 = 0.0 `P(info="Coefficient for the width dependence of A3" unit=""); -parameter real PLWA3 = 0.0 `P(info="Coefficient for the length times width dependence of A3" unit=""); -parameter real POA4 = 0 `P(info="Coefficient for the geometry independent part of A4" unit="V^-0.5"); -parameter real PLA4 = 0.0 `P(info="Coefficient for the length dependence of A4" unit="V^-0.5"); -parameter real PWA4 = 0.0 `P(info="Coefficient for the width dependence of A4" unit="V^-0.5"); -parameter real PLWA4 = 0.0 `P(info="Coefficient for the length times width dependence of A4" unit="V^-0.5"); -parameter real POGCO = 0 `P(info="Coefficient for the geometry independent part of GCO" unit=""); - -// Gate current parameters -parameter real POIGINV = 0 `P(info="Coefficient for the geometry independent part of IGINV" unit="A"); -parameter real PLIGINV = 0.0 `P(info="Coefficient for the length dependence of IGINV" unit="A"); -parameter real PWIGINV = 0.0 `P(info="Coefficient for the width dependence of IGINV" unit="A"); -parameter real PLWIGINV = 0.0 `P(info="Coefficient for the length times width dependence of IGINV" unit="A"); -parameter real POIGOV = 0 `P(info="Coefficient for the geometry independent part of IGOV" unit="A"); -parameter real PLIGOV = 0.0 `P(info="Coefficient for the length dependence of IGOV" unit="A"); -parameter real PWIGOV = 0.0 `P(info="Coefficient for the width dependence of IGOV" unit="A"); -parameter real PLWIGOV = 0.0 `P(info="Coefficient for the length times width dependence of IGOV" unit="A"); -parameter real POIGOVD = 0 `P(info="Coefficient for the geometry independent part of IGOV for drain side" unit="A"); -parameter real PLIGOVD = 0.0 `P(info="Coefficient for the length dependence of IGOV for drain side" unit="A"); -parameter real PWIGOVD = 0.0 `P(info="Coefficient for the width dependence of IGOV for drain side" unit="A"); -parameter real PLWIGOVD = 0.0 `P(info="Coefficient for the length times width dependence of IGOV for drain side" unit="A"); -parameter real POSTIG = 2 `P(info="Coefficient for the geometry independent part of STIG" unit=""); -parameter real POGC2 = 0.375 `P(info="Coefficient for the geometry independent part of GC2" unit=""); -parameter real POGC3 = 0.063 `P(info="Coefficient for the geometry independent part of GC3" unit=""); -parameter real POCHIB = 3.1 `P(info="Coefficient for the geometry independent part of CHIB" unit="V"); - -// Gate-induced drain leakage (GIDL) parameters -parameter real POAGIDL = 0 `P(info="Coefficient for the geometry independent part of AGIDL" unit="A/V^3"); -parameter real PLAGIDL = 0.0 `P(info="Coefficient for the length dependence of AGIDL" unit="A/V^3"); -parameter real PWAGIDL = 0.0 `P(info="Coefficient for the width dependence of AGIDL" unit="A/V^3"); -parameter real PLWAGIDL = 0.0 `P(info="Coefficient for the length times width dependence of AGIDL" unit="A/V^3"); -parameter real POAGIDLD = 0 `P(info="Coefficient for the geometry independent part of AGIDL for drain side" unit="A/V^3"); -parameter real PLAGIDLD = 0.0 `P(info="Coefficient for the length dependence of AGIDL for drain side" unit="A/V^3"); -parameter real PWAGIDLD = 0.0 `P(info="Coefficient for the width dependence of AGIDL for drain side" unit="A/V^3"); -parameter real PLWAGIDLD = 0.0 `P(info="Coefficient for the length times width dependence of AGIDL for drain side" unit="A/V^3"); -parameter real POBGIDL = 41 `P(info="Coefficient for the geometry independent part of BGIDL" unit="V"); -parameter real POBGIDLD = 41 `P(info="Coefficient for the geometry independent part of BGIDL for drain side" unit="V"); -parameter real POSTBGIDL = 0 `P(info="Coefficient for the geometry independent part of STBGIDL" unit="V/K"); -parameter real POSTBGIDLD = 0 `P(info="Coefficient for the geometry independent part of STBGIDL for drain side" unit="V/K"); -parameter real POCGIDL = 0 `P(info="Coefficient for the geometry independent part of CGIDL" unit=""); -parameter real POCGIDLD = 0 `P(info="Coefficient for the geometry independent part of CGIDL for drain side" unit=""); - -// Charge model parameters -parameter real POCOX = 1E-14 `P(info="Coefficient for the geometry independent part of COX" unit="F"); -parameter real PLCOX = 0.0 `P(info="Coefficient for the length dependence of COX" unit="F"); -parameter real PWCOX = 0.0 `P(info="Coefficient for the width dependence of COX" unit="F"); -parameter real PLWCOX = 0.0 `P(info="Coefficient for the length times width dependence of COX" unit="F"); -parameter real POCGOV = 1E-15 `P(info="Coefficient for the geometry independent part of CGOV" unit="F"); -parameter real PLCGOV = 0.0 `P(info="Coefficient for the length dependence of CGOV" unit="F"); -parameter real PWCGOV = 0.0 `P(info="Coefficient for the width dependence of CGOV" unit="F"); -parameter real PLWCGOV = 0.0 `P(info="Coefficient for the length times width dependence of CGOV" unit="F"); -parameter real POCGOVD = 1E-15 `P(info="Coefficient for the geometry independent part of CGOV for drain side" unit="F"); -parameter real PLCGOVD = 0.0 `P(info="Coefficient for the length dependence of CGOV for drain side" unit="F"); -parameter real PWCGOVD = 0.0 `P(info="Coefficient for the width dependence of CGOV for drain side" unit="F"); -parameter real PLWCGOVD = 0.0 `P(info="Coefficient for the length times width dependence of CGOV for drain side" unit="F"); -parameter real POCGBOV = 0 `P(info="Coefficient for the geometry independent part of CGBOV" unit="F"); -parameter real PLCGBOV = 0.0 `P(info="Coefficient for the length dependence of CGBOV" unit="F"); -parameter real PWCGBOV = 0.0 `P(info="Coefficient for the width dependence of CGBOV" unit="F"); -parameter real PLWCGBOV = 0.0 `P(info="Coefficient for the length times width dependence of CGBOV" unit="F"); -parameter real POCFR = 0 `P(info="Coefficient for the geometry independent part of CFR" unit="F"); -parameter real PLCFR = 0.0 `P(info="Coefficient for the length dependence of CFR" unit="F"); -parameter real PWCFR = 0.0 `P(info="Coefficient for the width dependence of CFR" unit="F"); -parameter real PLWCFR = 0.0 `P(info="Coefficient for the length times width dependence of CFR" unit="F"); -parameter real POCFRD = 0 `P(info="Coefficient for the geometry independent part of CFR for drain side" unit="F"); -parameter real PLCFRD = 0.0 `P(info="Coefficient for the length dependence of CFR for drain side" unit="F"); -parameter real PWCFRD = 0.0 `P(info="Coefficient for the width dependence of CFR for drain side" unit="F"); -parameter real PLWCFRD = 0.0 `P(info="Coefficient for the length times width dependence of CFR for drain side" unit="F"); - -// Noise model parameters -parameter real POFNT = 1 `P(info="Coefficient for the geometry independent part of FNT" unit=""); -parameter real POFNTEXC = 0.0 `P(info="Coefficient for the geometry independent part of FNTEXC" unit=""); -parameter real PLFNTEXC = 0.0 `P(info="Coefficient for the length dependence of FNTEXC" unit=""); -parameter real PWFNTEXC = 0.0 `P(info="Coefficient for the width dependence of FNTEXC" unit=""); -parameter real PLWFNTEXC = 0.0 `P(info="Coefficient for the length times width dependence of FNTEXC" unit=""); -parameter real PONFA = 8E+22 `P(info="Coefficient for the geometry independent part of NFA" unit="V^-1/m^4"); -parameter real PLNFA = 0.0 `P(info="Coefficient for the length dependence of NFA" unit="V^-1/m^4"); -parameter real PWNFA = 0.0 `P(info="Coefficient for the width dependence of NFA" unit="V^-1/m^4"); -parameter real PLWNFA = 0.0 `P(info="Coefficient for the length times width dependence of NFA" unit="V^-1/m^4"); -parameter real PONFB = 3E+07 `P(info="Coefficient for the geometry independent part of NFB" unit="V^-1/m^2"); -parameter real PLNFB = 0.0 `P(info="Coefficient for the length dependence of NFB" unit="V^-1/m^2"); -parameter real PWNFB = 0.0 `P(info="Coefficient for the width dependence of NFB" unit="V^-1/m^2"); -parameter real PLWNFB = 0.0 `P(info="Coefficient for the length times width dependence of NFB" unit="V^-1/m^2"); -parameter real PONFC = 0 `P(info="Coefficient for the geometry independent part of NFC" unit="V^-1"); -parameter real PLNFC = 0.0 `P(info="Coefficient for the length dependence of NFC" unit="V^-1"); -parameter real PWNFC = 0.0 `P(info="Coefficient for the width dependence of NFC" unit="V^-1"); -parameter real PLWNFC = 0.0 `P(info="Coefficient for the length times width dependence of NFC" unit="V^-1"); -parameter real POEF = 1.0 `P(info="Coefficient for the flicker noise frequency exponent" unit=""); - -// Other parameters -parameter real DTA = 0 `P(info="Temperature offset w.r.t. ambient temperature" unit="K"); - -// Well proximity effect parameters -parameter real POKVTHOWE = 0 `P(info="Coefficient for the geometry independent part of KVTHOWE" unit=""); -parameter real PLKVTHOWE = 0 `P(info="Coefficient for the length dependence part of KVTHOWE" unit=""); -parameter real PWKVTHOWE = 0 `P(info="Coefficient for the width dependence part of KVTHOWE" unit=""); -parameter real PLWKVTHOWE = 0 `P(info="Coefficient for the length times width dependence part of KVTHOWE" unit=""); -parameter real POKUOWE = 0 `P(info="Coefficient for the geometry independent part of KUOWE" unit=""); -parameter real PLKUOWE = 0 `P(info="Coefficient for the length dependence part of KUOWE" unit=""); -parameter real PWKUOWE = 0 `P(info="Coefficient for the width dependence part of KUOWE" unit=""); -parameter real PLWKUOWE = 0 `P(info="Coefficient for the length times width dependence part of KUOWE" unit=""); - -// `Dummy' parameters for binning-set labeling -parameter real LMIN = 0 `P(info="Dummy parameter to label binning set" unit="m"); -parameter real LMAX = 1.0 `P(info="Dummy parameter to label binning set" unit="m"); -parameter real WMIN = 0 `P(info="Dummy parameter to label binning set" unit="m"); -parameter real WMAX = 1.0 `P(info="Dummy parameter to label binning set" unit="m"); diff --git a/src/spicelib/devices/adms/psp102/admsva/PSP102_macrodefs.include b/src/spicelib/devices/adms/psp102/admsva/PSP102_macrodefs.include deleted file mode 100644 index 0c7800e39..000000000 --- a/src/spicelib/devices/adms/psp102/admsva/PSP102_macrodefs.include +++ /dev/null @@ -1,274 +0,0 @@ -//====================================================================================== -//====================================================================================== -// Filename: PSP102_macrodefs.include -//====================================================================================== -//====================================================================================== -// -// (c) Copyright notice -// -// Since 2012 until today, PSP has been co-developed by NXP Semiconductors and -// Delft University of Technology. For this part of the model, each claim undivided -// ownership and copyrights -// Until and including 2011, PSP has been co-developed by NXP Semiconductors and -// Arizona State University. For this part of the model, NXP Semiconductors claims -// undivided ownership and copyrights. -// -// -// Version: 102.5.0, December 2013 -// -//====================================================================================== -//====================================================================================== -// -// Further information can be found in the file releasenotesPSP102.txt -// - -///////////////////////////////////////////// -// -// Macros and constants used in PSP -// -///////////////////////////////////////////// - -// Explicit Gmin -`define GMIN $simparam("gmin") - -`define PMOS -1 -`define NMOS +1 - -// Some functions -`define MINA(x,y,a) 0.5*((x)+(y)-sqrt(((x)-(y))*((x)-(y))+(a))) -`define MAXA(x,y,a) 0.5*((x)+(y)+sqrt(((x)-(y))*((x)-(y))+(a))) - -// Physical constants -`define QMN 5.951993 -`define QMP 7.448711 - -// Other constants (PSP-mos) -`define DELTA1 0.02 -`define invSqrt2 7.0710678118654746e-01 -`define oneSixth 1.6666666666666667e-01 - - -`define OPdef(OPvarname, OPdesc, OPunit) (*desc=OPdesc*) real OPvarname; - - -///////////////////////////////////////////////////////////////////////////// -// -// Macro definitions. -// -// Note that because at present locally scoped variables -// can only be in named blocks, the intermediate variables -// used in the macros below must be explicitly declared -// as variables in the main code. -// -///////////////////////////////////////////////////////////////////////////// - - -// sigma function used in surface potential and other calculations -// (one call uses expressions for arguments so parentheses -// around the arguments in the expressions are necessary) -`define sigma(a,c,tau,eta,y) \ - nu = (a) + (c); \ - mutau = nu * nu + (tau) * (0.5 * ((c) * (c)) - (a)); \ - y = (eta) + (a) * nu * (tau) / (mutau + (nu / mutau) * (tau) * (tau) * (c) * ((c) * (c) * `oneThird - (a))); - -// modified version of sigma, which takes 4 arguments -`define sigma2(a,b,c,tau,eta,y) \ - nu = (a) + (c); \ - mutau = (nu) * (nu) + (tau) * (0.5 * ((c) * (c)) - (a) * (b)); \ - y = (eta) + (a) * nu * (tau) / (mutau + (nu / mutau) * (tau) * (tau) * (c) * ((c) * (c) * `oneThird - (a) * (b))); - -// -// sp_s surface potential calculation -// -`define sp_s(sp,xg,xn,delta) \ - if (abs(xg) <= margin) begin \ - SP_S_temp1 = inv_xi * inv_xi * `oneSixth * `invSqrt2; \ - sp = xg * inv_xi * (1.0 + xg * (1.0 - (delta)) * Gf * SP_S_temp1); \ - end else begin \ - if (xg < -margin) begin \ - SP_S_yg = -xg; \ - SP_S_ysub = 1.25 * (SP_S_yg * inv_xi); \ - SP_S_eta = 0.5 * (SP_S_ysub + 10 - sqrt((SP_S_ysub - 6.0) * (SP_S_ysub - 6.0) + 64.0)); \ - SP_S_temp = SP_S_yg - SP_S_eta; \ - SP_S_a = SP_S_temp * SP_S_temp + Gf2*(SP_S_eta + 1.0);\ - SP_S_c = 2.0 * SP_S_temp - Gf2; \ - SP_S_tau = -SP_S_eta + ln(SP_S_a * inv_Gf2); \ - `sigma(SP_S_a, SP_S_c, SP_S_tau, SP_S_eta, SP_S_y0) \ - `expl_high(SP_S_y0, SP_S_delta0) \ - SP_S_delta1 = 1.0 / SP_S_delta0; \ - SP_S_temp = 1.0 / (2.0 + SP_S_y0 * SP_S_y0); \ - SP_S_xi0 = SP_S_y0 * SP_S_y0 * SP_S_temp; \ - SP_S_xi1 = 4.0 * (SP_S_y0 * SP_S_temp * SP_S_temp); \ - SP_S_xi2 = (8.0 * SP_S_temp - 12.0 * SP_S_xi0) * SP_S_temp * SP_S_temp; \ - SP_S_temp = SP_S_yg - SP_S_y0; \ - SP_S_temp1 = (delta) * SP_S_delta1; \ - SP_S_pC = 2.0 * SP_S_temp + Gf2 * (SP_S_delta0 - 1.0 - SP_S_temp1 + (delta) * (1.0 - SP_S_xi1)); \ - SP_S_qC = SP_S_temp * SP_S_temp - Gf2 * (SP_S_delta0 - SP_S_y0 - 1.0 + SP_S_temp1 + (delta) * (SP_S_y0 - 1.0 - SP_S_xi0)); \ - SP_S_temp = 2.0 - Gf2 * (SP_S_delta0 + SP_S_temp1 - (delta) * SP_S_xi2); \ - SP_S_temp = SP_S_pC * SP_S_pC - 2.0 * (SP_S_qC * SP_S_temp); \ - sp = -SP_S_y0 - 2.0 * (SP_S_qC / (SP_S_pC + sqrt(SP_S_temp))); \ - end else begin \ - SP_xg1 = 1.0 / (x1 + Gf * 7.324648775608221e-001); \ - SP_S_A_fac= (xi * x1 * SP_xg1 - 1.0) * SP_xg1; \ - SP_S_xbar = xg * inv_xi * (1.0 + SP_S_A_fac * xg); \ - `expl_low(-SP_S_xbar, SP_S_temp) \ - SP_S_w = 1.0 - SP_S_temp; \ - SP_S_x1 = xg + Gf2 * 0.5 - Gf * sqrt(xg + Gf2 * 0.25 - SP_S_w); \ - SP_S_bx = (xn) + 3.0; \ - SP_S_eta = `MINA(SP_S_x1, SP_S_bx, 5.0) - 0.5 * (SP_S_bx - sqrt(SP_S_bx * SP_S_bx + 5.0)); \ - SP_S_temp = xg - SP_S_eta; \ - SP_S_temp1= exp(-SP_S_eta); \ - SP_S_temp2= 1.0 / (2.0 + SP_S_eta * SP_S_eta); \ - SP_S_xi0 = SP_S_eta * SP_S_eta * SP_S_temp2; \ - SP_S_xi1 = 4.0 * (SP_S_eta * SP_S_temp2 * SP_S_temp2); \ - SP_S_xi2 = (8.0 * SP_S_temp2 - 12.0 * SP_S_xi0) * SP_S_temp2 * SP_S_temp2; \ - SP_S_a = max(1.0e-40, SP_S_temp * SP_S_temp - Gf2 * (SP_S_temp1 + SP_S_eta - 1.0 - (delta) * (SP_S_eta + 1.0 + SP_S_xi0))); \ - SP_S_b = 1.0 - 0.5 * (Gf2 * (SP_S_temp1 - (delta) * SP_S_xi2)); \ - SP_S_c = 2.0 * SP_S_temp + Gf2 * (1.0 - SP_S_temp1 - (delta) * (1.0 + SP_S_xi1)); \ - SP_S_tau = (xn) - SP_S_eta + ln(SP_S_a / Gf2); \ - `sigma2(SP_S_a, SP_S_b, SP_S_c, SP_S_tau, SP_S_eta, SP_S_x0) \ - if (SP_S_x0 < `se05) begin \ - SP_S_delta0 = exp(SP_S_x0); \ - SP_S_delta1 = 1.0 / SP_S_delta0; \ - SP_S_delta0 = (delta) * SP_S_delta0; \ - end else begin \ - if (SP_S_x0 > (xn) - `se05) begin \ - SP_S_delta0 = exp(SP_S_x0 - (xn)); \ - SP_S_delta1 = (delta) / SP_S_delta0; \ - end else begin \ - SP_S_delta0 = `ke05 / `P3((xn) - SP_S_x0 - `se05); \ - SP_S_delta1 = `ke05 / `P3(SP_S_x0 - `se05); \ - end \ - end \ - SP_S_temp = 1.0 / (2.0 + SP_S_x0 * SP_S_x0); \ - SP_S_xi0 = SP_S_x0 * SP_S_x0 * SP_S_temp; \ - SP_S_xi1 = 4.0 * (SP_S_x0 * SP_S_temp * SP_S_temp); \ - SP_S_xi2 = (8.0 * SP_S_temp - 12.0 * SP_S_xi0) * SP_S_temp * SP_S_temp; \ - SP_S_temp = xg - SP_S_x0; \ - SP_S_pC = 2.0 * SP_S_temp + Gf2 * (1.0 - SP_S_delta1 + SP_S_delta0 - (delta) * (1.0 + SP_S_xi1)); \ - SP_S_qC = SP_S_temp * SP_S_temp - Gf2 * (SP_S_delta1 + SP_S_x0 - 1.0 + SP_S_delta0 - (delta) * (SP_S_x0 + 1.0 + SP_S_xi0)); \ - SP_S_temp = 2.0 - Gf2 * (SP_S_delta1 + SP_S_delta0 - (delta) * SP_S_xi2); \ - SP_S_temp = SP_S_pC * SP_S_pC - 2.0 * (SP_S_qC * SP_S_temp); \ - sp = SP_S_x0 + 2.0 * (SP_S_qC / (SP_S_pC + sqrt(SP_S_temp))); \ - end \ - end - -// -// sp_s_d surface potential calculation at drain (subset of function sp_s) -// -`define sp_s_d(sp,xg,xn,delta) \ - if (abs(xg) <= margin) begin \ - SP_S_temp1 = inv_xi * inv_xi * `oneSixth * `invSqrt2; \ - sp = xg * inv_xi * (1.0 + xg * (1.0 - (delta)) * Gf * SP_S_temp1); \ - end else begin \ - SP_S_bx = (xn) + 3; \ - SP_S_eta = `MINA(SP_S_x1, SP_S_bx, 5.0) - 0.5 * (SP_S_bx - sqrt(SP_S_bx * SP_S_bx + 5.0)); \ - SP_S_temp = xg - SP_S_eta; \ - SP_S_temp1= exp(-SP_S_eta); \ - SP_S_temp2= 1.0 / (2.0 + SP_S_eta * SP_S_eta); \ - SP_S_xi0 = SP_S_eta * SP_S_eta * SP_S_temp2; \ - SP_S_xi1 = 4.0 * (SP_S_eta * SP_S_temp2 * SP_S_temp2); \ - SP_S_xi2 = (8.0 * SP_S_temp2 - 12.0 * SP_S_xi0) * SP_S_temp2 * SP_S_temp2; \ - SP_S_a = max(1.0e-40, SP_S_temp * SP_S_temp - Gf2 * (SP_S_temp1 + SP_S_eta - 1.0 - (delta) * (SP_S_eta + 1.0 + SP_S_xi0))); \ - SP_S_b = 1.0 - 0.5 * (Gf2 * (SP_S_temp1 - (delta) * SP_S_xi2)); \ - SP_S_c = 2.0 * SP_S_temp + Gf2 * (1.0 - SP_S_temp1 - (delta) * (1.0 + SP_S_xi1)); \ - SP_S_tau = (xn) - SP_S_eta + ln(SP_S_a / Gf2); \ - `sigma2(SP_S_a, SP_S_b, SP_S_c, SP_S_tau, SP_S_eta, SP_S_x0) \ - if (SP_S_x0 < `se05) begin \ - SP_S_delta0 = exp(SP_S_x0); \ - SP_S_delta1 = 1.0 / SP_S_delta0; \ - SP_S_delta0 = (delta) * SP_S_delta0; \ - end else begin \ - if (SP_S_x0 > (xn) - `se05) begin \ - SP_S_delta0 = exp(SP_S_x0 - (xn)); \ - SP_S_delta1 = (delta) / SP_S_delta0; \ - end else begin \ - SP_S_delta0 = `ke05 / `P3((xn) - SP_S_x0 - `se05); \ - SP_S_delta1 = `ke05 / `P3(SP_S_x0 - `se05); \ - end \ - end \ - SP_S_temp = 1.0 / (2.0 + SP_S_x0 * SP_S_x0); \ - SP_S_xi0 = SP_S_x0 * SP_S_x0 * SP_S_temp; \ - SP_S_xi1 = 4.0 * (SP_S_x0 * SP_S_temp * SP_S_temp); \ - SP_S_xi2 = (8.0 * SP_S_temp-12.0 * SP_S_xi0) * SP_S_temp * SP_S_temp; \ - SP_S_temp = xg - SP_S_x0; \ - SP_S_pC = 2.0 * SP_S_temp + Gf2 * (1.0 - SP_S_delta1 + SP_S_delta0 - (delta) * (1.0 + SP_S_xi1)); \ - SP_S_qC = SP_S_temp * SP_S_temp - Gf2 * (SP_S_delta1 + SP_S_x0 - 1.0 + SP_S_delta0 - (delta) * (SP_S_x0 + 1.0 + SP_S_xi0)); \ - SP_S_temp = 2.0 - Gf2*(SP_S_delta1+SP_S_delta0-(delta)*SP_S_xi2); \ - SP_S_temp = SP_S_pC * SP_S_pC - 2.0 * (SP_S_qC * SP_S_temp); \ - sp = SP_S_x0 + 2.0 * (SP_S_qC / (SP_S_pC + sqrt(SP_S_temp)));\ - end - -// -// sp_ov surface potential calculation for the overlap regions -// -`define sp_ov(sp,xg) \ - if (abs(xg) <= x_mrg_ov) begin \ - sp = (-(xg) * inv_xi_ov); \ - end else begin \ - if (xg < -x_mrg_ov) begin \ - SP_OV_yg = -xg; \ - SP_OV_z = x1 * SP_OV_yg * inv_xi_ov; \ - SP_OV_eta = 0.5 * (SP_OV_z + 10.0 - sqrt((SP_OV_z - 6.0) * (SP_OV_z - 6.0) + 64.0)); \ - SP_OV_a = (SP_OV_yg - SP_OV_eta) * (SP_OV_yg - SP_OV_eta) + GOV2 * (SP_OV_eta + 1.0); \ - SP_OV_c = 2.0 * (SP_OV_yg - SP_OV_eta) - GOV2; \ - SP_OV_tau = ln(SP_OV_a / GOV2) - SP_OV_eta; \ - `sigma(SP_OV_a, SP_OV_c, SP_OV_tau, SP_OV_eta, SP_OV_y0) \ - SP_OV_D0 = exp(SP_OV_y0); \ - SP_OV_temp = SP_OV_yg - SP_OV_y0; \ - SP_OV_p = 2.0 * SP_OV_temp + GOV2 * (SP_OV_D0 - 1.0); \ - SP_OV_q = SP_OV_temp * SP_OV_temp + GOV2 * (SP_OV_y0 + 1.0 - SP_OV_D0); \ - SP_OV_xi = 1.0 - GOV2 * 0.5 * SP_OV_D0; \ - SP_OV_temp = SP_OV_p * SP_OV_p - 4.0 * (SP_OV_xi * SP_OV_q); \ - SP_OV_w = 2.0 * (SP_OV_q / (SP_OV_p + sqrt(SP_OV_temp))); \ - sp = -(SP_OV_y0 + SP_OV_w); \ - end else begin \ - SP_OV_Afac = (xi_ov * x1 * inv_xg1 - 1.0) * inv_xg1; \ - SP_OV_xbar = xg * inv_xi_ov * (1.0 + SP_OV_Afac * xg); \ - `expl_low(-SP_OV_xbar, SP_OV_temp) \ - SP_OV_w = 1.0 - SP_OV_temp; \ - SP_OV_x0 = xg + GOV2 * 0.5 - GOV * sqrt(xg + GOV2 * 0.25 - SP_OV_w); \ - `expl_low(-SP_OV_x0, SP_OV_D0) \ - SP_OV_p = 2.0 * (xg - SP_OV_x0) + GOV2 * (1 - SP_OV_D0); \ - SP_OV_q = (xg - SP_OV_x0) * (xg - SP_OV_x0) - GOV2 * (SP_OV_x0 - 1.0 + SP_OV_D0); \ - SP_OV_xi = 1.0 - GOV2 * 0.5 * SP_OV_D0; \ - SP_OV_temp = SP_OV_p * SP_OV_p - 4.0 * (SP_OV_xi * SP_OV_q); \ - SP_OV_u = 2.0 * (SP_OV_q / (SP_OV_p + sqrt(SP_OV_temp))); \ - sp = SP_OV_x0 + SP_OV_u; \ - end \ - sp = -sp; \ - end - -// This construct is used for parasitic resistances. -// If R=0, the Verilog-A compiler should recognize -// that the corresponding nodes can be collapsed -`define CollapsableR(G, R, SN, N1, N2) \ - if ((R) > 0.0) begin \ - I(N1, N2) <+ MULT_i * (G) * V(N1, N2); \ - I(N1, N2) <+ white_noise(MULT_i * SN); \ - end else begin \ - V(N1, N2) <+ 0.0; \ - end - -`define NonCollapsableR(G, R, SN, N1, N2) \ - I(N1, N2) <+ MULT_i * (G) * V(N1, N2); \ - I(N1, N2) <+ white_noise(MULT_i * SN, "thermal noise"); - -// This macro is used for asymmetric overlap regions. -// The following variables are changed to those for source/drain side. -`define ChangeToSource \ - GOV = GOV_s; \ - GOV2 = GOV2_s; \ - xi_ov = xi_ov_s; \ - inv_xi_ov = inv_xi_ov_s; \ - x_mrg_ov = x_mrg_ov_s; \ - inv_xg1 = inv_xg1_s; - - -`define ChangeToDrain \ - GOV = GOV_d; \ - GOV2 = GOV2_d; \ - xi_ov = xi_ov_d; \ - inv_xi_ov = inv_xi_ov_d; \ - x_mrg_ov = x_mrg_ov_d; \ - inv_xg1 = inv_xg1_d; diff --git a/src/spicelib/devices/adms/psp102/admsva/PSP102_module.include b/src/spicelib/devices/adms/psp102/admsva/PSP102_module.include deleted file mode 100644 index 4b1e716d9..000000000 --- a/src/spicelib/devices/adms/psp102/admsva/PSP102_module.include +++ /dev/null @@ -1,3097 +0,0 @@ -//====================================================================================== -//====================================================================================== -// Filename: PSP102_module.include -//====================================================================================== -//====================================================================================== -// -// (c) Copyright notice -// -// Since 2012 until today, PSP has been co-developed by NXP Semiconductors and -// Delft University of Technology. For this part of the model, each claim undivided -// ownership and copyrights -// Until and including 2011, PSP has been co-developed by NXP Semiconductors and -// Arizona State University. For this part of the model, NXP Semiconductors claims -// undivided ownership and copyrights. -// -// -// Version: 102.5.0, December 2013 -// -//====================================================================================== -//====================================================================================== -// -// Further information can be found in the file releasenotesPSP102.txt -// - -// Node definitions -inout D, G, S, B; -electrical D; -electrical G; -electrical S; -electrical B; - -// Extra internal nodes for correlated drain and gate noise -electrical NOI; -electrical NOI2; - -// Extra branches for correlated drain and gate noise -branch (NOI) NOII; -branch (NOI) NOIR; -branch (NOI) NOIC; - -// Internal nodes for gate and bulk resistors -electrical GP; -electrical BP; -electrical BI; -electrical BS; -electrical BD; - -`ifdef NQSmodel - - // Internal nodes for spline collocation - electrical INT1; - electrical INT2; - electrical INT3; - electrical INT4; - electrical INT5; - electrical INT6; - electrical INT7; - electrical INT8; - electrical INT9; - - branch(INT1) SPLINE1; - branch(INT2) SPLINE2; - branch(INT3) SPLINE3; - branch(INT4) SPLINE4; - branch(INT5) SPLINE5; - branch(INT6) SPLINE6; - branch(INT7) SPLINE7; - branch(INT8) SPLINE8; - branch(INT9) SPLINE9; - - branch(INT1) RES1; - branch(INT2) RES2; - branch(INT3) RES3; - branch(INT4) RES4; - branch(INT5) RES5; - branch(INT6) RES6; - branch(INT7) RES7; - branch(INT8) RES8; - branch(INT9) RES9; - -`endif // NQSmodel - -////////////////////////// -// -// Model parameters -// -////////////////////////// - -`ifdef LocalModel - /////////////////////////////////////////////////// - // PSP local model parameters - /////////////////////////////////////////////////// - - // Special model parameters, some are also simulator global variables - parameter real LEVEL = 102 `P(info="Model level" unit=""); - - parameter integer TYPE = 1 `from( -1 ,1 ) `P(info="Channel type parameter, +1=NMOS -1=PMOS" unit=""); - parameter integer nmos = 1 `from( 0, 1 ) `P(desc="MOS channel type"); - parameter integer pmos = 1 `from( 0, 1 ) `P(desc="MOS channel type"); - parameter real TR = 21.0 `from( -273.0,inf ) `P(info="nominal (reference) temperature" unit="C"); - - // Switch parameters that turn models or effects on or off - parameter real SWIGATE = 0.0 `from( 0.0,1.0 ) `P(info="Flag for gate current, 0=turn off IG" unit=""); - parameter real SWIMPACT = 0.0 `from( 0.0,1.0 ) `P(info="Flag for impact ionization current, 0=turn off II" unit=""); - parameter real SWGIDL = 0.0 `from( 0.0,1.0 ) `P(info="Flag for GIDL current, 0=turn off IGIDL" unit=""); - parameter real SWJUNCAP = 0.0 `from( 0.0,3.0 ) `P(info="Flag for juncap, 0=turn off juncap" unit=""); - parameter real SWJUNASYM= 0.0 `P(info="Flag for asymmetric junctions; 0=symmetric, 1=asymmetric" unit=""); - parameter real QMC = 1.0 `from( 0.0,inf ) `P(info="Quantum-mechanical correction factor" unit=""); - - // Process parameters - parameter real VFB = -1.0 `P(info="Flatband voltage at TR" unit="V"); - parameter real STVFB = 5.0e-4 `P(info="Temperature dependence of VFB" unit="V/K"); - parameter real TOX = 2.0e-09 `from( 1e-10,inf ) `P(info="Gate oxide thickness" unit="m"); - parameter real EPSROX = 3.9 `from( 1.0,inf ) `P(info="Relative permittivity of gate dielectric" unit=""); - parameter real NEFF = 5.0e+23 `from( 1e20,1e26 ) `P(info="Effective substrate doping" unit="m^-3"); - parameter real VNSUB = 0.0 `P(info="Effective doping bias-dependence parameter" unit="V"); - parameter real NSLP = 0.05 `from( 1e-3,inf ) `P(info="Effective doping bias-dependence parameter" unit="V"); - parameter real DNSUB = 0.0 `from( 0.0,1.0 ) `P(info="Effective doping bias-dependence parameter" unit="V^-1"); - parameter real DPHIB = 0.0 `P(info="Offset parameter for PHIB" unit="V"); - parameter real NP = 1.0e+26 `from( 0.0,inf ) `P(info="Gate poly-silicon doping" unit="m^-3"); - parameter real CT = 0.0 `from( 0.0,inf ) `P(info="Interface states factor" unit=""); - parameter real TOXOV = 2.0e-09 `from( 1e-10,inf ) `P(info="Overlap oxide thickness" unit="m"); - parameter real TOXOVD = 2.0e-09 `from( 1e-10,inf ) `P(info="Overlap oxide thickness for drain side" unit="m"); - parameter real NOV = 5.0e+25 `from( 1e20,1e27 ) `P(info="Effective doping of overlap region" unit="m^-3"); - parameter real NOVD = 5.0e+25 `from( 1e20,1e27 ) `P(info="Effective doping of overlap region for drain side" unit="m^-3"); - - // DIBL parameters - parameter real CF = 0.0 `from( 0.0,inf ) `P(info="DIBL-parameter" unit=""); - parameter real CFB = 0.0 `from( 0.0,1.0 ) `P(info="Back bias dependence of CF" unit="V^-1"); - - // Mobility parameters - parameter real BETN = 7e-2 `from( 0.0,inf ) `P(info="Channel aspect ratio times zero-field mobility" unit="m^2/V/s"); - parameter real STBET = 1.0 `P(info="Temperature dependence of BETN" unit=""); - parameter real MUE = 0.5 `from( 0.0,inf ) `P(info="Mobility reduction coefficient at TR" unit="m/V"); - parameter real STMUE = 0.0 `P(info="Temperature dependence of MUE" unit=""); - parameter real THEMU = 1.5 `from( 0.0,inf ) `P(info="Mobility reduction exponent at TR" unit=""); - parameter real STTHEMU = 1.5 `P(info="Temperature dependence of THEMU" unit=""); - parameter real CS = 0.0 `from( 0.0,inf ) `P(info="Coulomb scattering parameter at TR" unit=""); - parameter real STCS = 0.0 `P(info="Temperature dependence of CS" unit=""); - parameter real XCOR = 0.0 `from( 0.0,inf ) `P(info="Non-universality factor" unit="V^-1"); - parameter real STXCOR = 0.0 `P(info="Temperature dependence of XCOR" unit=""); - parameter real FETA = 1.0 `from( 0.0,inf ) `P(info="Effective field parameter" unit=""); - - // Series-resistance parameters (for resistance modeling as part of intrinsic mobility reduction) - parameter real RS = 30 `from( 0.0,inf ) `P(info="Series resistance at TR" unit="Ohm"); - parameter real STRS = 1.0 `P(info="Temperature dependence of RS" unit=""); - parameter real RSB = 0.0 `from( -0.5,1.0 ) `P(info="Back-bias dependence of series resistance" unit="V^-1"); - parameter real RSG = 0.0 `from( -0.5,inf ) `P(info="Gate-bias dependence of series resistance" unit="V^-1"); - - // Velocity saturation parameters - parameter real THESAT = 1.0 `from( 0.0,inf ) `P(info="Velocity saturation parameter at TR" unit="V^-1"); - parameter real STTHESAT = 1.0 `P(info="Temperature dependence of THESAT" unit=""); - parameter real THESATB = 0.0 `from( -0.5,1.0 ) `P(info="Back-bias dependence of velocity saturation" unit="V^-1"); - parameter real THESATG = 0.0 `from( -0.5,inf ) `P(info="Gate-bias dependence of velocity saturation" unit="V^-1"); - - // Saturation voltage parameters - parameter real AX = 3.0 `from( 2.0,inf ) `P(info="Linear/saturation transition factor" unit=""); - - // Channel length modulation (CLM) parameters - parameter real ALP = 0.01 `from( 0.0,inf ) `P(info="CLM pre-factor" unit=""); - parameter real ALP1 = 0.00 `from( 0.0,inf ) `P(info="CLM enhancement factor above threshold" unit="V"); - parameter real ALP2 = 0.00 `from( 0.0,inf ) `P(info="CLM enhancement factor below threshold" unit="V^-1"); - parameter real VP = 0.05 `from( 1e-10,inf ) `P(info="CLM logarithm dependence factor" unit="V"); - - // Impact ionization (II) parameters - parameter real A1 = 1.0 `from( 0.0,inf ) `P(info="Impact-ionization pre-factor" unit=""); - parameter real A2 = 10.0 `from( 0.0,inf ) `P(info="Impact-ionization exponent at TR" unit="V"); - parameter real STA2 = 0.0 `P(info="Temperature dependence of A2" unit="V"); - parameter real A3 = 1.0 `from( 0.0,inf ) `P(info="Saturation-voltage dependence of impact-ionization" unit=""); - parameter real A4 = 0.0 `from( 0.0,inf ) `P(info="Back-bias dependence of impact-ionization" unit="V^-0.5"); - - // Gate current parameters - parameter real GCO = 0.0 `from( -10.0,10.0 ) `P(info="Gate tunnelling energy adjustment" unit=""); - parameter real IGINV = 0.0 `from( 0.0,inf ) `P(info="Gate channel current pre-factor" unit="A"); - parameter real IGOV = 0.0 `from( 0.0,inf ) `P(info="Gate overlap current pre-factor" unit="A"); - parameter real IGOVD = 0.0 `from( 0.0,inf ) `P(info="Gate overlap current pre-factor for drain side" unit="A"); - parameter real STIG = 2.0 `P(info="Temperature dependence of IGINV and IGOV" unit=""); - parameter real GC2 = 0.375 `from( 0.0,10.0 ) `P(info="Gate current slope factor" unit=""); - parameter real GC3 = 0.063 `from( -2.0,2.0 ) `P(info="Gate current curvature factor" unit=""); - parameter real CHIB = 3.1 `from( 1.0,inf ) `P(info="Tunnelling barrier height" unit="V"); - - // Gate Induced Drain/Source Leakage (GIDL) parameters - parameter real AGIDL = 0.0 `from( 0.0,inf ) `P(info="GIDL pre-factor" unit="A/V^3"); - parameter real AGIDLD = 0.0 `from( 0.0,inf ) `P(info="GIDL pre-factor for drain side" unit="A/V^3"); - parameter real BGIDL = 41.0 `from( 0.0,inf ) `P(info="GIDL probability factor at TR" unit="V"); - parameter real BGIDLD = 41.0 `from( 0.0,inf ) `P(info="GIDL probability factor at TR for drain side" unit="V"); - parameter real STBGIDL = 0.0 `P(info="Temperature dependence of BGIDL" unit="V/K"); - parameter real STBGIDLD = 0.0 `P(info="Temperature dependence of BGIDL for drain side" unit="V/K"); - parameter real CGIDL = 0.0 `P(info="Back-bias dependence of GIDL" unit=""); - parameter real CGIDLD = 0.0 `P(info="Back-bias dependence of GIDL for drain side" unit=""); - - // Charge model parameters - parameter real COX = 1.0e-14 `from( 0.0,inf ) `P(info="Oxide capacitance for intrinsic channel" unit="F"); - parameter real CGOV = 1.0e-15 `from( 0.0,inf ) `P(info="Oxide capacitance for gate-drain/source overlap" unit="F"); - parameter real CGOVD = 1.0e-15 `from( 0.0,inf ) `P(info="Oxide capacitance for gate-drain overlap" unit="F"); - parameter real CGBOV = 0.0 `from( 0.0,inf ) `P(info="Oxide capacitance for gate-bulk overlap" unit="F"); - parameter real CFR = 0.0 `from( 0.0,inf ) `P(info="Outer fringe capacitance" unit="F"); - parameter real CFRD = 0.0 `from( 0.0,inf ) `P(info="Outer fringe capacitance for drain side" unit="F"); - - // Noise parameters - parameter real FNT = 1.0 `from( 0.0,inf ) `P(info="Thermal noise coefficient" unit=""); - parameter real FNTEXC = 0.0 `from( 0.0,inf ) `P(info="Excess noise coefficient" unit=""); - parameter real NFA = 8.0e+22 `from( 0.0,inf ) `P(info="First coefficient of flicker noise" unit="V^-1/m^4"); - parameter real NFB = 3.0e+07 `from( 0.0,inf ) `P(info="Second coefficient of flicker noise" unit="V^-1/m^2"); - parameter real NFC = 0.0 `from( 0.0,inf ) `P(info="Third coefficient of flicker noise" unit="V^-1"); - parameter real EF = 1.0 `from( 0.0,inf ) `P(info="Flicker noise frequency exponent" unit=""); - -`ifdef NQSmodel - // NQS parameters - parameter real SWNQS = 0.0 `from( 0.0,9.0 ) `P(info="Flag for NQS, 0=off, 1, 2, 3, 5, or 9=number of collocation points" unit=""); - parameter real MUNQS = 1.0 `from( 0.0,inf ) `P(info="Relative mobility for NQS modelling"); -`endif // NQSmodel - - // Parasitic resistance parameters - parameter real RG = 0.0 `from( 0.0,inf ) `P(info="Gate resistance" unit="Ohm"); - parameter real RBULK = 0.0 `from( 0.0,inf ) `P(info="Bulk resistance between node BP and BI" unit="Ohm"); - parameter real RWELL = 0.0 `from( 0.0,inf ) `P(info="Well resistance between node BI and B" unit="Ohm"); - parameter real RJUNS = 0.0 `from( 0.0,inf ) `P(info="Source-side bulk resistance between node BI and BS" unit="Ohm"); - parameter real RJUND = 0.0 `from( 0.0,inf ) `P(info="Drain-side bulk resistance between node BI and BD" unit="Ohm"); - - // JUNCAP Parameters - `include "JUNCAP200_parlist.include" - - // Other parameters - parameter real DTA = 0.0 `P(info="Temperature offset w.r.t. ambient temperature" unit="K"); - - // Instance parameters - parameter real DELVTO = 0.0 `P(type="instance" info="Threshold voltage shift parameter" unit="V"); - parameter real FACTUO = 1.0 `from( 0.0,inf ) `P(type="instance" info="Zero-field mobility pre-factor" unit=""); - parameter real ABSOURCE = 1e-12 `from(`AB_cliplow,inf) `P(type="instance" info="Bottom area of source junction" unit="m^2"); - parameter real LSSOURCE = 1e-6 `from(`LS_cliplow,inf) `P(type="instance" info="STI-edge length of source junction" unit="m"); - parameter real LGSOURCE = 1e-6 `from(`LG_cliplow,inf) `P(type="instance" info="Gate-edge length of source junction" unit="m"); - parameter real ABDRAIN = 1e-12 `from(`AB_cliplow,inf) `P(type="instance" info="Bottom area of drain junction" unit="m^2"); - parameter real LSDRAIN = 1e-6 `from(`LS_cliplow,inf) `P(type="instance" info="STI-edge length of drain junction" unit="m"); - parameter real LGDRAIN = 1e-6 `from(`LG_cliplow,inf) `P(type="instance" info="Gate-edge length of drain junction" unit="m"); - parameter real AS = 1E-12 `from(`AB_cliplow,inf) `P(type="instance" info="Bottom area of source junction" unit="m^2"); - parameter real PS = 1E-6 `from(`LS_cliplow,inf) `P(type="instance" info="Perimeter of source junction" unit="m"); - parameter real AD = 1E-12 `from(`AB_cliplow,inf) `P(type="instance" info="Bottom area of drain junction" unit="m^2"); - parameter real PD = 1E-6 `from(`LS_cliplow,inf) `P(type="instance" info="Perimeter of drain junction" unit="m"); - parameter real JW = 1E-6 `from(`LG_cliplow,inf) `P(type="instance" info="Gate-edge length of source/drain junction" unit="m"); - parameter real MULT = 1.0 `from( 0.0,inf ) `P(type="instance" info="Number of devices in parallel" unit=""); -`else // LocalModel -`ifdef Binning - - `include "PSP102_binpars.include" - -`else // Binning - /////////////////////////////////////////////////// - // PSP global model parameters - /////////////////////////////////////////////////// - - // Special model parameters - parameter real LEVEL = 1020 `P(info="Model level" unit=""); - - parameter integer TYPE = 1 `from( -1, 1 ) `P(info="Channel type parameter, +1=NMOS -1=PMOS" unit=""); - parameter integer nmos = 1 `from( 0, 1 ) `P(desc="MOS channel type"); - parameter integer pmos = 1 `from( 0, 1 ) `P(desc="MOS channel type"); - - // Reference Temperature - parameter real TR = 21.0 `from( -273.0,inf ) `P(info="nominal (reference) temperature" unit="C"); - - // Switch parameters that turn models or effects on or off - parameter real SWIGATE = 0.0 `from( 0.0,1.0 ) `P(info="Flag for gate current, 0=turn off IG" unit=""); - parameter real SWIMPACT = 0.0 `from( 0.0,1.0 ) `P(info="Flag for impact ionization current, 0=turn off II" unit=""); - parameter real SWGIDL = 0.0 `from( 0.0,1.0 ) `P(info="Flag for GIDL current, 0=turn off IGIDL" unit=""); - parameter real SWJUNCAP = 0.0 `from( 0.0,3.0 ) `P(info="Flag for juncap, 0=turn off juncap" unit=""); - parameter real SWJUNASYM= 0.0 `P(info="Flag for asymmetric junctions; 0=symmetric, 1=asymmetric" unit=""); - parameter real QMC = 1.0 `from( 0.0,inf ) `P(info="Quantum-mechanical correction factor" unit=""); - - // Process Parameters - parameter real LVARO = 0.0 `P(info="Geom. independent difference between actual and programmed gate length" unit="m"); - parameter real LVARL = 0.0 `P(info="Length dependence of LVAR" unit=""); - parameter real LVARW = 0.0 `P(info="Width dependence of LVAR" unit=""); - parameter real LAP = 0.0 `P(info="Effective channel length reduction per side" unit="m"); - parameter real WVARO = 0.0 `P(info="Geom. independent difference between actual and programmed field-oxide opening" unit="m"); - parameter real WVARL = 0.0 `P(info="Length dependence of WVAR" unit=""); - parameter real WVARW = 0.0 `P(info="Width dependence of WVAR" unit=""); - parameter real WOT = 0.0 `P(info="Effective channel width reduction per side" unit="m"); - parameter real DLQ = 0.0 `P(info="Effective channel length reduction for CV" unit="m"); - parameter real DWQ = 0.0 `P(info="Effective channel width reduction for CV" unit="m"); - parameter real VFBO = -1.0 `P(info="Geometry-independent flat-band voltage at TR" unit="V"); - parameter real VFBL = 0.0 `P(info="Length dependence of flat-band voltage" unit=""); - parameter real VFBW = 0.0 `P(info="Width dependence of flat-band voltage" unit=""); - parameter real VFBLW = 0.0 `P(info="Area dependence of flat-band voltage" unit=""); - parameter real STVFBO = 5e-4 `P(info="Geometry-independent temperature dependence of VFB" unit="V/K"); - parameter real STVFBL = 0.0 `P(info="Length dependence of temperature dependence of VFB" unit=""); - parameter real STVFBW = 0.0 `P(info="Width dependence of temperature dependence of VFB" unit=""); - parameter real STVFBLW = 0.0 `P(info="Area dependence of temperature dependence of VFB" unit=""); - parameter real TOXO = 2e-9 `from( 1e-10,inf ) `P(info="Gate oxide thickness" unit="m"); - parameter real EPSROXO = 3.9 `from( 1.0,inf ) `P(info="Relative permittivity of gate dielectric" unit=""); - parameter real NSUBO = 3e23 `from( 1e20,inf ) `P(info="Geometry independent substrate doping" unit="m^-3"); - parameter real NSUBW = 0.0 `P(info="Width dependence of background doping NSUBO due to segregation" unit=""); - parameter real WSEG = 1e-8 `from( 1e-10,inf ) `P(info="Char. length of segregation of background doping NSUBO" unit="m"); - parameter real NPCK = 1e24 `from( 0.0,inf ) `P(info="Pocket doping level" unit="m^-3"); - parameter real NPCKW = 0.0 `P(info="Width dependence of pocket doping NPCK due to segregation" unit=""); - parameter real WSEGP = 1e-8 `from( 1e-10,inf ) `P(info="Char. length of segregation of pocket doping NPCK" unit="m"); - parameter real LPCK = 1e-8 `from( 1e-10,inf ) `P(info="Char. length of lateral doping profile" unit="m"); - parameter real LPCKW = 0.0 `P(info="Width dependence of char. length of lateral doping profile" unit=""); - parameter real FOL1 = 0.0 `P(info="First length dependence coefficient for short channel body effect" unit=""); - parameter real FOL2 = 0.0 `P(info="Second length dependence coefficient for short channel body effect" unit=""); - parameter real VNSUBO = 0.0 `P(info="Effective doping bias-dependence parameter" unit="V"); - parameter real NSLPO = 0.05 `P(info="Effective doping bias-dependence parameter" unit="V"); - parameter real DNSUBO = 0.0 `P(info="Effective doping bias-dependence parameter" unit="V^-1"); - parameter real DPHIBO = 0.0 `P(info="Geometry independent offset of PHIB" unit="V"); - parameter real DPHIBL = 0.0 `P(info="Length dependence offset of PHIB" unit="V"); - parameter real DPHIBLEXP= 1.0 `P(info="Exponent for length dependence of offset of PHIB" unit=""); - parameter real DPHIBW = 0.0 `P(info="Width dependence of offset of PHIB" unit=""); - parameter real DPHIBLW = 0.0 `P(info="Area dependence of offset of PHIB" unit=""); - parameter real NPO = 1e26 `P(info="Geometry-independent gate poly-silicon doping" unit="m^-3"); - parameter real NPL = 0.0 `P(info="Length dependence of gate poly-silicon doping" unit=""); - parameter real CTO = 0.0 `P(info="Geometry-independent interface states factor" unit=""); - parameter real CTL = 0.0 `P(info="Length dependence of interface states factor" unit=""); - parameter real CTLEXP = 1.0 `P(info="Exponent for length dependence of interface states factor" unit=""); - parameter real CTW = 0.0 `P(info="Width dependence of interface states factor" unit=""); - parameter real CTLW = 0.0 `P(info="Area dependence of interface states factor" unit=""); - parameter real TOXOVO = 2e-9 `from( 1e-10,inf ) `P(info="Overlap oxide thickness" unit="m"); - parameter real TOXOVDO = 2e-9 `from( 1e-10,inf ) `P(info="Overlap oxide thickness for drain side" unit="m"); - parameter real LOV = 0 `from( 0.0,inf ) `P(info="Overlap length for gate/drain and gate/source overlap capacitance" unit="m"); - parameter real LOVD = 0 `from( 0.0,inf ) `P(info="Overlap length for gate/drain overlap capacitance" unit="m"); - parameter real NOVO = 5e25 `P(info="Effective doping of overlap region" unit="m^-3"); - parameter real NOVDO = 5e25 `P(info="Effective doping of overlap region for drain side" unit="m^-3"); - - // DIBL Parameters - parameter real CFL = 0.0 `P(info="Length dependence of DIBL-parameter" unit=""); - parameter real CFLEXP = 2.0 `P(info="Exponent for length dependence of CF" unit=""); - parameter real CFW = 0.0 `P(info="Width dependence of CF" unit=""); - parameter real CFBO = 0.0 `P(info="Back-bias dependence of CF" unit="V^-1"); - - // Mobility Parameters - parameter real UO = 5e-2 `P(info="Zero-field mobility at TR" unit="m^2/V/s"); - parameter real FBET1 = 0.0 `P(info="Relative mobility decrease due to first lateral profile" unit=""); - parameter real FBET1W = 0.0 `P(info="Width dependence of relative mobility decrease due to first lateral profile" unit=""); - parameter real LP1 = 1e-8 `from( 1e-10,inf ) `P(info="Mobility-related characteristic length of first lateral profile" unit="m"); - parameter real LP1W = 0.0 `P(info="Width dependence of mobility-related characteristic length of first lateral profile" unit=""); - parameter real FBET2 = 0.0 `P(info="Relative mobility decrease due to second lateral profile" unit=""); - parameter real LP2 = 1e-8 `from( 1e-10,inf ) `P(info="Mobility-related characteristic length of second lateral profile" unit="m"); - parameter real BETW1 = 0.0 `P(info="First higher-order width scaling coefficient of BETN" unit=""); - parameter real BETW2 = 0.0 `P(info="Second higher-order width scaling coefficient of BETN" unit=""); - parameter real WBET = 1e-9 `from( 1e-10,inf ) `P(info="Characteristic width for width scaling of BETN" unit="m"); - parameter real STBETO = 1.0 `P(info="Geometry independent temperature dependence of BETN" unit=""); - parameter real STBETL = 0.0 `P(info="Length dependence of temperature dependence of BETN" unit=""); - parameter real STBETW = 0.0 `P(info="Width dependence of temperature dependence of BETN" unit=""); - parameter real STBETLW = 0.0 `P(info="Area dependence of temperature dependence of BETN" unit=""); - parameter real MUEO = 0.5 `P(info="Geometry independent mobility reduction coefficient at TR" unit="m/V"); - parameter real MUEW = 0.0 `P(info="Width dependence of mobility reduction coefficient at TR" unit=""); - parameter real STMUEO = 0.0 `P(info="Temperature dependence of MUE" unit=""); - parameter real THEMUO = 1.5 `P(info="Mobility reduction exponent at TR" unit=""); - parameter real STTHEMUO = 1.5 `P(info="Temperature dependence of THEMU" unit=""); - parameter real CSO = 0.0 `P(info="Geometry independent coulomb scattering parameter at TR" unit=""); - parameter real CSL = 0.0 `P(info="Length dependence of CS" unit=""); - parameter real CSLEXP = 0.0 `P(info="Exponent for length dependence of CS" unit=""); - parameter real CSW = 0.0 `P(info="Width dependence of CS" unit=""); - parameter real CSLW = 0.0 `P(info="Area dependence of CS" unit=""); - parameter real STCSO = 0.0 `P(info="Temperature dependence of CS" unit=""); - parameter real XCORO = 0.0 `P(info="Geometry independent non-universality parameter" unit="V^-1"); - parameter real XCORL = 0.0 `P(info="Length dependence of non-universality parameter" unit=""); - parameter real XCORW = 0.0 `P(info="Width dependence of non-universality parameter" unit=""); - parameter real XCORLW = 0.0 `P(info="Area dependence of non-universality parameter" unit=""); - parameter real STXCORO = 0.0 `P(info="Temperature dependence of XCOR" unit=""); - parameter real FETAO = 1.0 `P(info="Effective field parameter" unit=""); - - // Series Resistance - parameter real RSW1 = 2.5e3 `P(info="Source/drain series resistance for 1 um wide channel at TR" unit="Ohm"); - parameter real RSW2 = 0.0 `P(info="Higher-order width scaling of RS" unit=""); - parameter real STRSO = 1.0 `P(info="Temperature dependence of RS" unit=""); - parameter real RSBO = 0.0 `P(info="Back-bias dependence of series resistance" unit="V^-1"); - parameter real RSGO = 0.0 `P(info="Gate-bias dependence of series resistance" unit="V^-1"); - - // Velocity Saturation - parameter real THESATO = 0.0 `P(info="Geometry independent velocity saturation parameter at TR" unit="V^-1"); - parameter real THESATL = 0.05 `P(info="Length dependence of THESAT" unit="V^-1"); - parameter real THESATLEXP= 1.0 `P(info="Exponent for length dependence of THESAT" unit=""); - parameter real THESATW = 0.0 `P(info="Width dependence of velocity saturation parameter" unit=""); - parameter real THESATLW = 0.0 `P(info="Area dependence of velocity saturation parameter" unit=""); - parameter real STTHESATO= 1.0 `P(info="Geometry independent temperature dependence of THESAT" unit=""); - parameter real STTHESATL= 0.0 `P(info="Length dependence of temperature dependence of THESAT" unit=""); - parameter real STTHESATW= 0.0 `P(info="Width dependence of temperature dependence of THESAT" unit=""); - parameter real STTHESATLW= 0.0 `P(info="Area dependence of temperature dependence of THESAT" unit=""); - parameter real THESATBO = 0.0 `P(info="Back-bias dependence of velocity saturation" unit="V^-1"); - parameter real THESATGO = 0.0 `P(info="Gate-bias dependence of velocity saturation" unit="V^-1"); - - // Saturation Voltage - parameter real AXO = 18 `P(info="Geometry independent linear/saturation transition factor" unit=""); - parameter real AXL = 0.4 `from( 0.0,inf ) `P(info="Length dependence of AX" unit=""); - - // Channel Length Modulation - parameter real ALPL = 5e-4 `P(info="Length dependence of ALP" unit=""); - parameter real ALPLEXP = 1.0 `P(info="Exponent for length dependence of ALP" unit=""); - parameter real ALPW = 0.0 `P(info="Width dependence of ALP" unit=""); - parameter real ALP1L1 = 0.0 `P(info="Length dependence of CLM enhancement factor above threshold" unit="V"); - parameter real ALP1LEXP = 0.5 `P(info="Exponent for length dependence of ALP1" unit=""); - parameter real ALP1L2 = 0.0 `from( 0.0,inf ) `P(info="Second_order length dependence of ALP1" unit=""); - parameter real ALP1W = 0.0 `P(info="Width dependence of ALP1" unit=""); - parameter real ALP2L1 = 0.0 `P(info="Length dependence of CLM enhancement factor below threshold" unit="V^-1"); - parameter real ALP2LEXP = 0.5 `P(info="Exponent for length dependence of ALP2" unit=""); - parameter real ALP2L2 = 0.0 `from( 0.0,inf ) `P(info="Second_order length dependence of ALP2" unit=""); - parameter real ALP2W = 0.0 `P(info="Width dependence of ALP2" unit=""); - parameter real VPO = 0.05 `P(info="CLM logarithmic dependence parameter" unit="V"); - - // Weak-avalanche parameters - parameter real A1O = 1.0 `P(info="Geometry independent impact-ionization pre-factor" unit=""); - parameter real A1L = 0.0 `P(info="Length dependence of A1" unit=""); - parameter real A1W = 0.0 `P(info="Width dependence of A1" unit=""); - parameter real A2O = 10 `P(info="Impact-ionization exponent at TR" unit="V"); - parameter real STA2O = 0.0 `P(info="Temperature dependence of A2" unit="V"); - parameter real A3O = 1.0 `P(info="Geometry independent saturation-voltage dependence of II" unit=""); - parameter real A3L = 0.0 `P(info="Length dependence of A3" unit=""); - parameter real A3W = 0.0 `P(info="Width dependence of A3" unit=""); - parameter real A4O = 0.0 `P(info="Geometry independent back-bias dependence of II" unit="V^-0.5"); - parameter real A4L = 0.0 `P(info="Length dependence of A4" unit=""); - parameter real A4W = 0.0 `P(info="Width dependence of A4" unit=""); - - // Gate current parameters - parameter real GCOO = 0.0 `P(info="Gate tunnelling energy adjustment" unit=""); - parameter real IGINVLW = 0.0 `P(info="Gate channel current pre-factor for 1 um^2 channel area" unit="A"); - parameter real IGOVW = 0.0 `P(info="Gate overlap current pre-factor for 1 um wide channel" unit="A"); - parameter real IGOVDW = 0.0 `P(info="Gate overlap current pre-factor for 1 um wide channel for drain side" unit="A"); - parameter real STIGO = 2.0 `P(info="Temperature dependence of IGINV and IGOV" unit=""); - parameter real GC2O = 0.375 `P(info="Gate current slope factor" unit=""); - parameter real GC3O = 0.063 `P(info="Gate current curvature factor" unit=""); - parameter real CHIBO = 3.1 `P(info="Tunnelling barrier height" unit="V"); - - // Gate-induced drain leakage parameters - parameter real AGIDLW = 0.0 `P(info="Width dependence of GIDL pre-factor" unit="A/V^3"); - parameter real AGIDLDW = 0.0 `P(info="Width dependence of GIDL pre-factor for drain side" unit="A/V^3"); - parameter real BGIDLO = 41 `P(info="GIDL probability factor at TR" unit="V"); - parameter real BGIDLDO = 41 `P(info="GIDL probability factor at TR for drain side" unit="V"); - parameter real STBGIDLO = 0.0 `P(info="Temperature dependence of BGIDL" unit="V/K"); - parameter real STBGIDLDO= 0.0 `P(info="Temperature dependence of BGIDL for drain side" unit="V/K"); - parameter real CGIDLO = 0.0 `P(info="Back-bias dependence of GIDL" unit=""); - parameter real CGIDLDO = 0.0 `P(info="Back-bias dependence of GIDL for drain side" unit=""); - - // Charge Model Parameters - parameter real CGBOVL = 0.0 `P(info="Oxide capacitance for gate-bulk overlap for 1 um long channel" unit="F"); - parameter real CFRW = 0.0 `P(info="Outer fringe capacitance for 1 um wide channel" unit="F"); - parameter real CFRDW = 0.0 `P(info="Outer fringe capacitance for 1 um wide channel for drain side" unit="F"); - - // Noise Model Parameters - parameter real FNTO = 1.0 `P(info="Thermal noise coefficient" unit=""); - parameter real FNTEXCL = 0.0 `from( 0.0,inf ) `P(info="Length dependence coefficient of excess noise" unit=""); - parameter real NFALW = 8e22 `P(info="First coefficient of flicker noise for 1 um^2 channel area" unit="V^-1/m^4"); - parameter real NFBLW = 3e7 `P(info="Second coefficient of flicker noise for 1 um^2 channel area" unit="V^-1/m^2"); - parameter real NFCLW = 0.0 `P(info="Third coefficient of flicker noise for 1 um^2 channel area" unit="V^-1"); - parameter real EFO = 1.0 `P(info="Flicker noise frequency exponent" unit=""); - parameter real LINTNOI = 0.0 `P(info="Length offset for flicker noise" unit="m"); - parameter real ALPNOI = 2.0 `P(info="Exponent for length offset for flicker noise" unit=""); - - // Other Parameters - parameter real DTA = 0 `P(info="Temperature offset w.r.t. ambient circuit temperature" unit="K"); - - // Well proximity effect Parameters - parameter real KVTHOWEO = 0 `P(info="Geometrical independent threshold shift parameter" unit=""); - parameter real KVTHOWEL = 0 `P(info="Length dependent threshold shift parameter" unit=""); - parameter real KVTHOWEW = 0 `P(info="Width dependent threshold shift parameter" unit=""); - parameter real KVTHOWELW= 0 `P(info="Area dependent threshold shift parameter" unit=""); - parameter real KUOWEO = 0 `P(info="Geometrical independent mobility degradation factor" unit=""); - parameter real KUOWEL = 0 `P(info="Length dependent mobility degradation factor" unit=""); - parameter real KUOWEW = 0 `P(info="Width dependent mobility degradation factor" unit=""); - parameter real KUOWELW = 0 `P(info="Area dependent mobility degradation factor" unit=""); -`endif // Binning -`ifdef NQSmodel - parameter real SWNQS = 0.0 `from( 0.0,9.0 ) `P(info="Flag for NQS, 0=off, 1, 2, 3, 5, or 9=number of collocation points" unit=""); - parameter real MUNQSO = 1.0 `P(info="Relative mobility for NQS modelling"); -`endif // NQSmodel - - // Parasitic resistance parameters - parameter real RGO = 0.0 `P(info="Gate resistance" unit="Ohm"); - parameter real RBULKO = 0.0 `P(info="Bulk resistance between node BP and BI" unit="Ohm"); - parameter real RWELLO = 0.0 `P(info="Well resistance between node BI and B" unit="Ohm"); - parameter real RJUNSO = 0.0 `P(info="Source-side bulk resistance between node BI and BS" unit="Ohm"); - parameter real RJUNDO = 0.0 `P(info="Drain-side bulk resistance between node BI and BD" unit="Ohm"); - parameter real RINT = 0.0 `from( 0.0,inf ) `P(info="Contact resistance between silicide and ploy" unit="Ohm/Sqr"); - parameter real RVPOLY = 0.0 `from( 0.0,inf ) `P(info="Vertical poly resistance" unit="Ohm/Sqr"); - parameter real RSHG = 0.0 `from( 0.0,inf ) `P(info="Gate electrode diffusion sheet resistance" unit="Ohm/Sqr"); - parameter real DLSIL = 0.0 `P(info="Silicide extension over the physical gate length" unit="m"); - - // Stress Model Parameters - parameter real SAREF = 1.0e-6 `from( 1e-9,inf ) `P(info="Reference distance between OD-edge and poly from one side" unit="m"); - parameter real SBREF = 1.0e-6 `from( 1e-9,inf ) `P(info="Reference distance between OD-edge and poly from other side" unit="m"); - parameter real WLOD = 0 `P(info="Width parameter" unit="m"); - parameter real KUO = 0 `P(info="Mobility degradation/enhancement coefficient" unit="m"); - parameter real KVSAT = 0 `from( -1.0,1.0 ) `P(info="Saturation velocity degradation/enhancement coefficient" unit="m"); - parameter real TKUO = 0 `P(info="Temperature dependence of KUO" unit=""); - parameter real LKUO = 0 `P(info="Length dependence of KUO" unit="m^LLODKUO"); - parameter real WKUO = 0 `P(info="Width dependence of KUO" unit="m^WLODKUO"); - parameter real PKUO = 0 `P(info="Cross-term dependence of KUO" unit="m^(LLODKUO+WLODKUO)"); - parameter real LLODKUO = 0 `from( 0.0,inf ) `P(info="Length parameter for UO stress effect" unit=""); - parameter real WLODKUO = 0 `from( 0.0,inf ) `P(info="Width parameter for UO stress effect" unit=""); - parameter real KVTHO = 0 `P(info="Threshold shift parameter" unit="Vm"); - parameter real LKVTHO = 0 `P(info="Length dependence of KVTHO" unit="m^LLODVTH"); - parameter real WKVTHO = 0 `P(info="Width dependence of KVTHO" unit="m^WLODVTH"); - parameter real PKVTHO = 0 `P(info="Cross-term dependence of KVTHO" unit="m^(LLODVTH+WLODVTH)"); - parameter real LLODVTH = 0 `from( 0.0,inf ) `P(info="Length parameter for VTH-stress effect" unit=""); - parameter real WLODVTH = 0 `from( 0.0,inf ) `P(info="Width parameter for VTH-stress effect" unit=""); - parameter real STETAO = 0 `P(info="eta0 shift factor related to VTHO change" unit="m"); - parameter real LODETAO = 1.0 `from( 0.0,inf ) `P(info="eta0 shift modification factor for stress effect" unit=""); - - // Well proximity effect Parameters - parameter real SCREF = 1e-6 `from( 0.0,inf ) `P(info="Distance between OD-edge and well edge of a reference device" unit="m"); - parameter real WEB = 0 `P(info="Coefficient for SCB" unit=""); - parameter real WEC = 0 `P(info="Coefficient for SCC" unit=""); - - // JUNCAP Parameters - `include "JUNCAP200_parlist.include" - - // Instance parameters - parameter real L = 10e-6 `from( 1e-9,inf ) `P(type="instance" info="Design length" unit="m"); - parameter real W = 10e-6 `from( 1e-9,inf ) `P(type="instance" info="Design width" unit="m"); - parameter real SA = 0.0 `P(type="instance" info="Distance between OD-edge and poly from one side" unit="m"); - parameter real SB = 0.0 `P(type="instance" info="Distance between OD-edge and poly from other side" unit="m"); - parameter real SD = 0.0 `P(type="instance" info="Distance between neighbouring fingers" unit="m"); - parameter real SCA = 0.0 `from( 0.0,inf ) `P(type="instance" info="Integral of the first distribution function for scattered well dopants" unit=""); - parameter real SCB = 0.0 `from( 0.0,inf ) `P(type="instance" info="Integral of the second distribution function for scattered well dopants" unit=""); - parameter real SCC = 0.0 `from( 0.0,inf ) `P(type="instance" info="Integral of the third distribution function for scattered well dopants" unit=""); - parameter real SC = 0.0 `P(type="instance" info="Distance between OD-edge and nearest well edge" unit="m"); - parameter real DELVTO = 0.0 `P(type="instance" info="Threshold voltage shift parameter" unit="V"); - parameter real FACTUO = 1.0 `from( 0.0,inf ) `P(type="instance" info="Zero-field mobility pre-factor" unit=""); - parameter real ABSOURCE = 1E-12 `from(`AB_cliplow,inf) `P(type="instance" info="Bottom area of source junction" unit="m^2"); - parameter real LSSOURCE = 1E-6 `from(`LS_cliplow,inf) `P(type="instance" info="STI-edge length of source junction" unit="m"); - parameter real LGSOURCE = 1E-6 `from(`LG_cliplow,inf) `P(type="instance" info="Gate-edge length of source junction" unit="m"); - parameter real ABDRAIN = 1E-12 `from(`AB_cliplow,inf) `P(type="instance" info="Bottom area of drain junction" unit="m^2"); - parameter real LSDRAIN = 1E-6 `from(`LS_cliplow,inf) `P(type="instance" info="STI-edge length of drain junction" unit="m"); - parameter real LGDRAIN = 1E-6 `from(`LG_cliplow,inf) `P(type="instance" info="Gate-edge length of drain junction" unit="m"); - parameter real AS = 1E-12 `from(`AB_cliplow,inf) `P(type="instance" info="Bottom area of source junction" unit="m^2"); - parameter real PS = 1E-6 `from(`LS_cliplow,inf) `P(type="instance" info="Perimeter of source junction" unit="m"); - parameter real AD = 1E-12 `from(`AB_cliplow,inf) `P(type="instance" info="Bottom area of drain junction" unit="m^2"); - parameter real PD = 1E-6 `from(`LS_cliplow,inf) `P(type="instance" info="Perimeter of drain junction" unit="m"); - parameter real MULT = 1.0 `from( 0.0,inf ) `P(type="instance" info="Number of devices in parallel" unit=""); - parameter real NF = 1.0 `from( 1.0,inf ) `P(type="instance" info="Number of fingers" unit=""); - parameter real NGCON = 1.0 `from( 1.0,2.0 ) `P(type="instance" info="Number of gate contacts" unit=""); - parameter real XGW = 1.0E-7 `P(type="instance" info="Distance from the gate contact to the channel edge" unit="m"); - - ////////////////////////// - // - // Variables - // - ////////////////////////// - - // Variables for geometrical scaling rules - real L_i, W_i, L_f, L_slif, W_f, SA_i, SB_i, SD_i, SC_i; - real LEN, WEN, iL, iW, delLPS, delWOD, LE, WE, iLE, iWE, Lcv, Wcv, LEcv, WEcv; - -`ifdef Binning - // Auxiliary variables for binning-rules - real iLEWE, iiLE, iiWE, iiLEWE, iiiLEWE; - real iLEcv, iiLEcv, iiWEcv, iiLEWEcv, iiiLEWEcv; - real iLcv, iiLcv, iiWcv, iiLWcv, iiiLWcv; -`else // Binning - // Intermediate variables used for geometry-scaling - real NSUBO_i, WSEG_i, NPCK_i, WSEGP_i, LPCK_i, LOV_i, LOVD_i; - real LP1_i, LP2_i, WBET_i, AXL_i, ALP1L2_i, ALP2L2_i; - real NSUB, AA, BB, NSUB0e, NPCKe, LPCKe; - real FBET1e, LP1e, GPE, GWE, tmpx; - real Lnoi, Lred; -`endif // Binning - - // List of local parameters - real VFB, STVFB, TOX, EPSROX, NEFF, VNSUB, NSLP, DNSUB, DPHIB, NP, CT; - real TOXOV, TOXOVD, NOV, NOVD, CF, CFB; - real BETN, STBET, MUE, STMUE, THEMU, STTHEMU, CS, STCS, XCOR, STXCOR, FETA; - real RS, STRS, RSB, RSG; - real THESAT, STTHESAT, THESATB, THESATG; - real AX; - real ALP, ALP1, ALP2, VP; - real A1, A2, STA2, A3, A4; - real GCO, IGINV, IGOV, IGOVD, STIG, GC2, GC3, CHIB; - real AGIDL, BGIDL, STBGIDL, CGIDL; - real AGIDLD, BGIDLD, CGIDLD, STBGIDLD; - real COX, CGOV, CGBOV, CGOVD, CFR, CFRD; - real FNT, NFA, NFB, NFC, EF; - real FNTEXC; -`ifdef NQSmodel - real MUNQS; -`endif // NQSmodel - real RG, RBULK, RWELL, RJUNS, RJUND; - - real NF_i, invNF; - real RINT_i, RVPOLY_i, RSHG_i, NGCON_i, XGW_i, XGWE; - - // Variables for stress-model - real SAREF_i, SBREF_i, KVSAT_i, LLODKUO_i, WLODKUO_i, LLODVTH_i, WLODVTH_i, LODETAO_i; - real Invsa, Invsb, Invsaref, Invsbref, Kstressu0, rhobeta, rhobetaref, Kstressvth0; - real temp0, temp00, templ, tempw, Lx, Wx; - real loop, tmpa, tmpb; - - // Variables for well proximity effect model - real SCA_i, SCB_i, SCC_i, SCREF_i, WEB_i, WEC_i, KVTHOWE, KUOWE; -`endif // LocalModel - -real ABS_i, LSS_i, LGS_i, ABD_i, LSD_i, LGD_i; - -// Variables used in electrical equations -real FACTUO_i, DELVTO_i, VFB_i, STVFB_i, TOX_i, EPSROX_i, NEFF_i, VNSUB_i, NSLP_i, DNSUB_i, NP_i, QMC_i, CT_i, TOXOV_i, TOXOVD_i, NOV_i, NOVD_i; -real CF_i, CFB_i, DPHIB_i; -real BETN_i, STBET_i, MUE_i, STMUE_i, THEMU_i, STTHEMU_i, CS_i, STCS_i, XCOR_i, STXCOR_i, FETA_i; -real RS_i, THER_i, STRS_i, RSB_i, RSG_i; -real THESAT_i, STTHESAT_i, THESATB_i, THESATG_i; -real AX_i, ALP_i, ALP1_i, ALP2_i, VP_i; -real A1_i, A2_i, STA2_i, A3_i, A4_i; -real GCO_i, IGINV_i, IGOV_i, IGOVD_i, STIG_i, GC2_i, GC3_i, CHIB_i; -real AGIDL_i, BGIDL_i, STBGIDL_i, CGIDL_i; -real AGIDLD_i, BGIDLD_i, STBGIDLD_i, CGIDLD_i; -real COX_i, CGOV_i, CGOVD_i, CGBOV_i, CFR_i, CFRD_i; -real FNT_i, NFA_i, NFB_i, NFC_i, EF_i; -real FNTEXC_i; -real TR_i, MULT_i; -real vth_i, vts_i; - -real temp, temp1, temp2, tempM; -real help; -real jwcorr; - -real TKR, TKD, TKD_sq, dT, rT, rTn; -real EPSOX, EPSSI; -real BET_i, phit, inv_phit, Eg, phibFac, CoxPrime, tox_sq; -real delVg, CoxovPrime, GOV, GOV2; -real np, kp, qq, qb0, dphibq, qlim2; -real E_eff0, eta_mu, BCH, BOV, inv_CHIB, GCQ, Dch, Dov; -real tf_bet, tf_mue, tf_cs, tf_xcor, tf_ther, tf_thesat, tf_ig; -real xi_ov, inv_xi_ov, x_mrg_ov, x1, inv_xg1, Vdsat_lim; -real nt, Cox_over_q; - -real CoxovPrime_d, GOV_s, GOV_d, GOV2_s, GOV2_d; -real BOV_d, xi_ov_s, xi_ov_d, inv_xi_ov_s, inv_xi_ov_d, x_mrg_ov_s, x_mrg_ov_d, inv_xg1_s, inv_xg1_d; -real AGIDLs, AGIDLDs, BGIDLs, BGIDLDs, BGIDL_T, BGIDLD_T; - -real phib, sqrt_phib, phix, aphi, bphi, phix1, phix2, G_0, phit1, inv_phit1, alpha_b; -real inv_VP, inv_AX, Sfl_prefac; - -real Vgs, Vds, Vsb, Vsbstar; -real Vgb, Vgb1, Vgbstar, Vdb, Vdsx, Vsbx; - -real VgsPrime, VgdPrime, VsbPrime, VdbPrime; - -real Dnsub; -real Igidl, Igisl, Vtovd, Vtovs; -real x_s, sqm, alpha1, phi_inf, za, rhob; -real thesat1, wsat, ysat, zsat, r1, r2, dL, GdL, dL1, GR, QCLM; -real xgm, Voxm, qim1_1, xgs_ov, xgd_ov; -real Ux; -real mutau, nu, xn_s, delta_ns; -real Gf, Gf2, inv_Gf2, xi, inv_xi, margin; -real qeff; - -real SP_xg1, SP_S_temp,SP_S_temp1,SP_S_temp2; -real SP_S_yg, SP_S_ysub, SP_S_y0, SP_S_a, SP_S_b, SP_S_c; -real SP_S_bx, SP_S_tau, SP_S_eta, SP_S_delta0, SP_S_delta1; -real SP_S_pC, SP_S_qC, SP_S_A_fac; -real SP_S_x1, SP_S_w, SP_S_xbar, SP_S_x0; -real SP_S_xi0, SP_S_xi1, SP_S_xi2; -real SP_OV_yg, SP_OV_z, SP_OV_eta, SP_OV_a, SP_OV_c; -real SP_OV_tau, SP_OV_D0, SP_OV_y0, SP_OV_xi, SP_OV_temp; -real SP_OV_p, SP_OV_q, SP_OV_w, SP_OV_Afac, SP_OV_xbar; -real SP_OV_x0, SP_OV_u; - -real x_d, x_m, x_ds, Rxcor, delta_1s, xi0s, xi1s, xi2s, xi0d; -real Es, Em, Ed, Ds, Dm, Dd, Ps, xgs, qis, qbs, qbm, Eeffm, Vm; -real Phi_0, Phi_2, asat, Phi_0_2, Phi0_Phi2; -real Vdsat, xn_d, k_ds, Udse; -real Mutmp, Phi_sat, delta_nd; -real pC, qC, Pm; -real d0, D_bar, km, x_pm, xi_pd, p_pd, u_pd, q_pd; -real xs_ov, xd_ov, Vovs, Vovd, psi_t; -real zg, delVsat, TP, Dsi, Dgate, u0, u0_div_H, x, xsq, inv_x, ex, inv_ex, Ag, Bg, Sg; -real Fj, Fj2; -real N1, Nm1, Delta_N1, Sfl; -real t1, t2, sqt2, r, lc, lcinv2, g_ideal, CGeff, mid, mig, migid, c_igid, sqid, sqig; -real H0; - -// excess noise variables -real fac_exc, temp2_exc, wsat_exc, temp_exc, thesat1_exc, zsat_exc, Gvsat_exc, gfac, Sidexc; - -real shot_igs, shot_igd, shot_iavl; -real shot_igcsx, shot_igcdx, shot_igsov, shot_igdov; - -real Igc0, igc, igcd_h; -real Igc, Igb; -real QI, QD, QB, QG, Qg, Qd, Qb, Qs, Qgs_ov, Qgd_ov; -real Qfgs, Qfgd, Qgb_ov; - -real arg1, arg2max, arg2mina; - -real RG_i, RBULK_i, RWELL_i, RJUNS_i, RJUND_i; -real ggate, gbulk, gwell, gjund, gjuns, nt0; -real rgatenoise, rbulknoise, rwellnoise, rjundnoise, rjunsnoise; - -integer CHNL_TYPE; - -`ifdef NQSmodel - // Variables used in NQS-calculations - real SWNQS_i, MUNQS_i; - real Qp1_0, Qp2_0, Qp3_0, Qp4_0, Qp5_0, Qp6_0, Qp7_0, Qp8_0, Qp9_0; - real fk1, fk2, fk3, fk4, fk5, fk6, fk7, fk8, fk9; - - real phi_p1, phi_p2, phi_p3; - real phi_p4, phi_p5, phi_p6; - real phi_p7, phi_p8, phi_p9; - - real Qp1, Qp2, Qp3; - real Qp4, Qp5, Qp6; - real Qp7, Qp8, Qp9; - real Qp0, QpN; - - real QG_NQS, QS_NQS, QD_NQS; - real pd, Gp, Gp2, a_factrp, marginp, x_sp, x_dp; - - real dfQi, fQi, dQis, dQis_1, d2Qis, dQbs, dQy, d2Qy, dpsy2; - real ym, inorm, Tnorm, Qb_tmp, QbSIGN; - real r_nqs, vnorm, vnorm_inv; - real NQS_xg1, NQS_yg, NQS_z, NQS_eta, NQS_a, NQS_c, NQS_tau, NQS_D0, NQS_xi, NQS_p; - real NQS_q, NQS_temp, NQS_A_fac, NQS_xbar, NQS_w, NQS_x0, NQS_u, NQS_y0; - real xphi, fk0, thesat2, Fvsat; - real temp3, temp4, temp5, temp6, temp7, temp8, temp9; -`endif // NQSmodel - -// JUNCAP2 variables -`include "JUNCAP200_varlist1.include" -`include "JUNCAP200_varlist2.include" -real jnoisex_s, jnoisex_d; -real Vjun_s, Vjun_d; -`ifdef LocalModel - real JW_i; -`endif // LocalModel - -real ijunbot, ijunsti, ijungat, qjunbot, qjunsti, qjungat; -real alpha, eta_p, xitsb, FdL, Gmob, Gmob_dL, Gvsat, Gvsatinv, dps, qim, qim1; -real H, Iimpact, mavl, Ids, Vdse, Igsov, Igdov, Igcs, Igcd, xg, sigVds; -real COX_qm; -real ijun_s, ijunbot_s, ijunsti_s, ijungat_s; -real ijun_d, ijunbot_d, ijunsti_d, ijungat_d; -real qjun_s, qjunbot_s, qjunsti_s, qjungat_s; -real qjun_d, qjunbot_d, qjunsti_d, qjungat_d; -real jnoise_s, jnoise_d; -real tmpv, vjv; -real sf; - -///////////////////////////////////////////////////////////////////////////// -// -// Variables for operating point info -// -///////////////////////////////////////////////////////////////////////////// - -real id_op, is, ig, ib, P_D, facvsb, facvsb0, sig1k; - -`OPdef(ctype ,"Flag for channel type" ,"") -`OPdef(sdint ,"Flag for source-drain interchange" ,"") - -`OPdef(ise ,"Total source current" ,"A") -`OPdef(ige ,"Total gate current" ,"A") -`OPdef(ide ,"Total drain current" ,"A") -`OPdef(ibe ,"Total bulk current" ,"A") -`OPdef(ids ,"Drain current, excl. avalanche, tunnel, GISL, GIDL, and junction currents" ,"A") -`OPdef(idb ,"Drain to bulk current" ,"A") -`OPdef(isb ,"Source to bulk current" ,"A") -`OPdef(igs ,"Gate-source tunneling current" ,"A") -`OPdef(igd ,"Gate-drain tunneling current" ,"A") -`OPdef(igb ,"Gate-bulk tunneling current" ,"A") -`OPdef(igcs ,"Gate-channel tunneling current (source component)" ,"A") -`OPdef(igcd ,"Gate-channel tunneling current (drain component)" ,"A") -`OPdef(iavl ,"Substrate current due to weak avelanche" ,"A") -`OPdef(igisl ,"Gate-induced source leakage current" ,"A") -`OPdef(igidl ,"Gate-induced drain leakage current" ,"A") - -`OPdef(ijs ,"Total source junction current" ,"A") -`OPdef(ijsbot ,"Source junction current (bottom component)" ,"A") -`OPdef(ijsgat ,"Source junction current (gate-edge component)" ,"A") -`OPdef(ijssti ,"Source junction current (STI-edge component)" ,"A") -`OPdef(ijd ,"Total drain junction current" ,"A") -`OPdef(ijdbot ,"Drain junction current (bottom component)" ,"A") -`OPdef(ijdgat ,"Drain junction current (gate-edge component)" ,"A") -`OPdef(ijdsti ,"Drain junction current (STI-edge component)" ,"A") - -`OPdef(vds ,"Drain-source voltage" ,"V") -`OPdef(vgs ,"Gate-source voltage" ,"V") -`OPdef(vsb ,"Source-bulk voltage" ,"V") -`OPdef(vto ,"Zero-bias threshold voltage" ,"V") -`OPdef(vts ,"Threshold voltage including back bias effects" ,"V") -`OPdef(vth ,"Threshold voltage including back bias and drain bias effects" ,"V") -`OPdef(vgt ,"Effective gate drive voltage including back bias and drain bias effects" ,"V") -`OPdef(vdss ,"Drain saturation voltage at actual bias" ,"V") -`OPdef(vsat ,"Saturation limit" ,"V") - -`OPdef(gm ,"Transconductance" ,"1/Ohm") -`OPdef(gmb ,"Substrate transconductance" ,"1/Ohm") -`OPdef(gds ,"Output conductance" ,"1/Ohm") -`OPdef(gjs ,"Source junction conductance" ,"1/Ohm") -`OPdef(gjd ,"Drain junction conductance" ,"1/Ohm") - -`OPdef(cdd ,"Drain capacitance" ,"F") -`OPdef(cdg ,"Drain-gate capacitance" ,"F") -`OPdef(cds ,"Drain-source capacitance" ,"F") -`OPdef(cdb ,"Drain-bulk capacitance" ,"F") -`OPdef(cgd ,"Gate-drain capacitance" ,"F") -`OPdef(cgg ,"Gate capacitance" ,"F") -`OPdef(cgs ,"Gate-source capacitance" ,"F") -`OPdef(cgb ,"Gate-bulk capacitance" ,"F") -`OPdef(csd ,"Source-drain capacitance" ,"F") -`OPdef(csg ,"Source-gate capacitance" ,"F") -`OPdef(css ,"Source capacitance" ,"F") -`OPdef(csb ,"Source-bulk capacitance" ,"F") -`OPdef(cbd ,"Bulk-drain capacitance" ,"F") -`OPdef(cbg ,"Bulk-gate capacitance" ,"F") -`OPdef(cbs ,"Bulk-source capacitance" ,"F") -`OPdef(cbb ,"Bulk capacitance" ,"F") -`OPdef(cgsol ,"Total gate-source overlap capacitance" ,"F") -`OPdef(cgdol ,"Total gate-drain overlap capacitance" ,"F") - -`OPdef(cjs ,"Total source junction capacitance" ,"F") -`OPdef(cjsbot ,"Source junction capacitance (bottom component)" ,"F") -`OPdef(cjsgat ,"Source junction capacitance (gate-edge component)" ,"F") -`OPdef(cjssti ,"Source junction capacitance (STI-edge component)" ,"F") -`OPdef(cjd ,"Total drain junction capacitance" ,"F") -`OPdef(cjdbot ,"Drain junction capacitance (bottom component)" ,"F") -`OPdef(cjdgat ,"Drain junction capacitance (gate-edge component)" ,"F") -`OPdef(cjdsti ,"Drain junction capacitance (STI-edge component)" ,"F") - -`OPdef(weff ,"Effective channel width for geometrical models" ,"m") -`OPdef(leff ,"Effective channel length for geometrical models" ,"m") -`OPdef(u ,"Transistor gain" ,"") -`OPdef(rout ,"Small-signal output resistance" ,"Ohm") -`OPdef(vearly ,"Equivalent Early voltage" ,"V") -`OPdef(beff ,"Gain factor" ,"A/V^2") -`OPdef(fug ,"Unity gain frequency at actual bias" ,"Hz") -`OPdef(rg_op ,"Gate resistance" ,"Ohm") - -`OPdef(sfl ,"Flicker noise current spectral density at 1 Hz" ,"A^2/Hz") -`OPdef(sqrtsff ,"Input-referred RMS white noise voltage spectral density at 1 kHz" ,"V/sqrt(Hz)") -`OPdef(sqrtsfw ,"Input-referred RMS white noise voltage spectral density" ,"V/sqrt(Hz)") -`OPdef(sid ,"White noise current spectral density" ,"A^2/Hz") -`OPdef(sig ,"Induced gate noise current spectral density at 1 Hz" ,"A^2/Hz") -`OPdef(cigid ,"Imaginary part of correlation coefficient between Sig and Sid" ,"") -`OPdef(fknee ,"Cross-over frequency above which white noise is dominant" ,"Hz") -`OPdef(sigs ,"Gate-source current noise spectral density" ,"A^2/Hz") -`OPdef(sigd ,"Gate-drain current noise spectral density" ,"A^2/Hz") -`OPdef(siavl ,"Impact ionization current noise spectral density" ,"A^2/Hz") -`OPdef(ssi ,"Total source junction current noise spectral density" ,"A^2/Hz") -`OPdef(sdi ,"Total drain junction current noise spectral density" ,"A^2/Hz") - -// local parameters after scaling, T-scaling, and clipping -`OPdef(lp_vfb , "Local parameter VFB after T-scaling and clipping", "V") -`OPdef(lp_stvfb , "Local parameter STVFB after clipping", "V/K") -`OPdef(lp_tox , "Local parameter TOX after clipping", "m") -`OPdef(lp_epsrox , "Local parameter EPSROX after clipping", "") -`OPdef(lp_neff , "Local parameter NEFF after clipping", "m^-3") -`OPdef(lp_vnsub , "Local parameter VNSUB after clipping", "V") -`OPdef(lp_nslp , "Local parameter NSLP after clipping", "V") -`OPdef(lp_dnsub , "Local parameter DNSUB after clipping", "V^-1") -`OPdef(lp_dphib , "Local parameter DPHIB after clipping", "V") -`OPdef(lp_np , "Local parameter NP after clipping", "m^-3") -`OPdef(lp_ct , "Local parameter CT after clipping", "") -`OPdef(lp_toxov , "Local parameter TOXOV after clipping", "m") -`OPdef(lp_toxovd , "Local parameter TOXOVD after clipping", "m") -`OPdef(lp_nov , "Local parameter NOV after clipping", "m^-3") -`OPdef(lp_novd , "Local parameter NOVD after clipping", "m^-3") -`OPdef(lp_cf , "Local parameter CF after clipping", "") -`OPdef(lp_cfb , "Local parameter CFB after clipping", "V^-1") -`OPdef(lp_betn , "Local parameter BETN after T-scaling and clipping", "m^2/(V s)") -`OPdef(lp_stbet , "Local parameter STBET after clipping", "") -`OPdef(lp_mue , "Local parameter MUE after T-scaling and clipping", "m/V") -`OPdef(lp_stmue , "Local parameter STMUE after clipping", "") -`OPdef(lp_themu , "Local parameter THEMU after T-scaling and clipping", "") -`OPdef(lp_stthemu , "Local parameter STTHEMU after clipping", "") -`OPdef(lp_cs , "Local parameter CS after T-scaling and clipping", "") -`OPdef(lp_stcs , "Local parameter STCS after clipping", "") -`OPdef(lp_xcor , "Local parameter XCOR after T-scaling and clipping", "V^-1") -`OPdef(lp_stxcor , "Local parameter STXCOR after clipping", "") -`OPdef(lp_feta , "Local parameter FETA after clipping", "") -`OPdef(lp_rs , "Local parameter RS after T-scaling and clipping", "Ohm") -`OPdef(lp_strs , "Local parameter STRS after clipping", "") -`OPdef(lp_rsb , "Local parameter RSB after clipping", "V^-1") -`OPdef(lp_rsg , "Local parameter RSG after clipping", "V^-1") -`OPdef(lp_thesat , "Local parameter THESAT after T-scaling and clipping", "V^-1") -`OPdef(lp_stthesat , "Local parameter STTHESAT after clipping", "") -`OPdef(lp_thesatb , "Local parameter THESATB after clipping", "V^-1") -`OPdef(lp_thesatg , "Local parameter THESATG after clipping", "V^-1") -`OPdef(lp_ax , "Local parameter AX after clipping", "") -`OPdef(lp_alp , "Local parameter ALP after clipping", "") -`OPdef(lp_alp1 , "Local parameter ALP1 after clipping", "V") -`OPdef(lp_alp2 , "Local parameter ALP2 after clipping", "V^-1") -`OPdef(lp_vp , "Local parameter VP after clipping", "V") -`OPdef(lp_a1 , "Local parameter A1 after clipping", "") -`OPdef(lp_a2 , "Local parameter A2 after T-scaling and clipping", "V") -`OPdef(lp_sta2 , "Local parameter STA2 after clipping", "") -`OPdef(lp_a3 , "Local parameter A3 after clipping", "") -`OPdef(lp_a4 , "Local parameter A4 after clipping", "1/sqrt(V)") -`OPdef(lp_gco , "Local parameter GCO after clipping", "") -`OPdef(lp_iginv , "Local parameter IGINV after T-scaling and clipping", "A") -`OPdef(lp_igov , "Local parameter IGOV after T-scaling and clipping", "A") -`OPdef(lp_igovd , "Local parameter IGOVD after T-scaling and clipping", "A") -`OPdef(lp_stig , "Local parameter STIG after clipping", "") -`OPdef(lp_gc2 , "Local parameter GC2 after clipping", "") -`OPdef(lp_gc3 , "Local parameter GC3 after clipping", "") -`OPdef(lp_chib , "Local parameter CHIB after clipping", "V") -`OPdef(lp_agidl , "Local parameter AGIDL after clipping", "A/V^3") -`OPdef(lp_agidld , "Local parameter AGIDLD after clipping", "A/V^3") -`OPdef(lp_bgidl , "Local parameter BGIDL after T-scaling and clipping", "V") -`OPdef(lp_bgidld , "Local parameter BGIDLD after T-scaling and clipping", "V") -`OPdef(lp_stbgidl , "Local parameter STBGIDL after clipping", "V/K") -`OPdef(lp_stbgidld , "Local parameter STBGIDLD after clipping", "V/K") -`OPdef(lp_cgidl , "Local parameter CGIDL after clipping", "") -`OPdef(lp_cgidld , "Local parameter CGIDLD after clipping", "") -`OPdef(lp_cox , "Local parameter COX after clipping", "F") -`OPdef(lp_cgov , "Local parameter CGOV after clipping", "F") -`OPdef(lp_cgovd , "Local parameter CGOVD after clipping", "F") -`OPdef(lp_cgbov , "Local parameter CGBOV after clipping", "F") -`OPdef(lp_cfr , "Local parameter CFR after clipping", "F") -`OPdef(lp_cfrd , "Local parameter CFRD after clipping", "F") -`OPdef(lp_fnt , "Local parameter FNT after clipping", "") -`OPdef(lp_fntexc , "Local parameter FNTEXC after clipping", "") -`OPdef(lp_nfa , "Local parameter NFA after clipping", "1/(V m^4)") -`OPdef(lp_nfb , "Local parameter NFB after clipping", "1/(V m^2)") -`OPdef(lp_nfc , "Local parameter NFC after clipping", "V^-1") -`OPdef(lp_ef , "Local parameter EF after clipping", "") -`OPdef(lp_rg , "Local parameter RG after clipping", "Ohm") -`OPdef(lp_rbulk , "Local parameter RBULK after clipping", "Ohm") -`OPdef(lp_rwell , "Local parameter RWELL after clipping", "Ohm") -`OPdef(lp_rjuns , "Local parameter RJUNS after clipping", "Ohm") -`OPdef(lp_rjund , "Local parameter RJUND after clipping", "Ohm") -`OPdef(tk , "Device Temperature", "K") -`OPdef(cjosbot , "Bottom component of total zero-bias source junction capacitance at device temperature", "F") -`OPdef(cjossti , "STI-edge component of total zero-bias source junction capacitance at device temperature", "F") -`OPdef(cjosgat , "Gate-edge component of total zero-bias source junction capacitance at device temperature", "F") -`OPdef(vbisbot , "Built-in voltage of source-side bottom junction at device temperature", "V") -`OPdef(vbissti , "Built-in voltage of source-side STI-edge junction at device temperature", "V") -`OPdef(vbisgat , "Built-in voltage of source-side gate-edge junction at device temperature", "V") -`OPdef(idsatsbot , "Total source-side bottom junction saturation current", "A") -`OPdef(idsatssti , "Total source-side STI-edge junction saturation current", "A") -`OPdef(idsatsgat , "Total source-side gate-edge junction saturation current", "A") -`OPdef(cjosbotd , "Bottom component of total zero-bias drain junction capacitance at device temperature", "F") -`OPdef(cjosstid , "STI-edge component of total zero-bias drain junction capacitance at device temperature", "F") -`OPdef(cjosgatd , "Gate-edge component of total zero-bias drain junction capacitance at device temperature", "F") -`OPdef(vbisbotd , "Built-in voltage of drain-side bottom junction at device temperature", "V") -`OPdef(vbisstid , "Built-in voltage of drain-side STI-edge junction at device temperature", "V") -`OPdef(vbisgatd , "Built-in voltage of drain-side gate-edge junction at device temperature", "V") -`OPdef(idsatsbotd , "Total drain-side bottom junction saturation current", "A") -`OPdef(idsatsstid , "Total drain-side STI-edge junction saturation current", "A") -`OPdef(idsatsgatd , "Total drain-side gate-edge junction saturation current", "A") -`ifdef NQSmodel - `OPdef(lp_munqs , "Local parameter MUNQS after clipping", "") -`endif // NQSmodel - -///////////////////////////////////////////////////////////////////////////// -// -// Analog block with all calculations and contribs -// -///////////////////////////////////////////////////////////////////////////// - -analog begin - - `INITIAL_MODEL - begin : initial_model - // Code independent of bias or instance parameters - // This block needs to be evaluated only once - -`ifdef LocalModel - // Do nothing -`else // LocalModel -`ifdef Binning - // There are no binning parameters that need clipping -`else // Binning - // Clipping of global model parameters - TOX_i = `CLIP_LOW(TOXO, 1e-10); - TOXOVD_i = `CLIP_LOW(TOXOVDO, 1e-10); - EPSROX_i = `CLIP_LOW(EPSROXO, 1.0); - NSUBO_i = `CLIP_LOW(NSUBO, 1e20); - WSEG_i = `CLIP_LOW(WSEG, 1e-10); - NPCK_i = `CLIP_LOW(NPCK, 0.0); - WSEGP_i = `CLIP_LOW(WSEGP, 1e-10); - LPCK_i = `CLIP_LOW(LPCK, 1e-10); - TOXOV_i = `CLIP_LOW(TOXOVO, 1e-10); - LOV_i = `CLIP_LOW(LOV, 0.0); - LOVD_i = `CLIP_LOW(LOVD, 0.0); - LP1_i = `CLIP_LOW(LP1, 1e-10); - LP2_i = `CLIP_LOW(LP2, 1e-10); - WBET_i = `CLIP_LOW(WBET, 1e-10); - AXL_i = `CLIP_LOW(AXL, 0.0); - ALP1L2_i = `CLIP_LOW(ALP1L2, 0.0); - ALP2L2_i = `CLIP_LOW(ALP2L2, 0.0); -`endif // Binning - - SAREF_i = `CLIP_LOW(SAREF, 1e-9); - SBREF_i = `CLIP_LOW(SBREF, 1e-9); - KVSAT_i = `CLIP_BOTH(KVSAT, -1.0, 1.0); - LLODKUO_i = `CLIP_LOW(LLODKUO, 0.0); - WLODKUO_i = `CLIP_LOW(WLODKUO, 0.0); - LLODVTH_i = `CLIP_LOW(LLODVTH, 0.0); - WLODVTH_i = `CLIP_LOW(WLODVTH, 0.0); - LODETAO_i = `CLIP_LOW(LODETAO, 0.0); - SCREF_i = `CLIP_LOW(SCREF, 0.0); - WEB_i = WEB; - WEC_i = WEC; - RINT_i = `CLIP_LOW(RINT, 0.0); - RVPOLY_i = `CLIP_LOW(RVPOLY, 0.0); -`endif // LocalModel - - // 4.1 Internal parameters (including temperature scaling) - // (only internal parameters independent on instance parameters - // are calculated in this section) - if (`PGIVEN(nmos)) begin - CHNL_TYPE = `NMOS; - end else if (`PGIVEN(pmos)) begin - CHNL_TYPE = `PMOS; - end else begin - CHNL_TYPE = (`PGIVEN(TYPE)) ? TYPE : `NMOS; - end - //$strobe("CHNL_TYPE %d", CHNL_TYPE); - - // Transistor temperature - TR_i = `CLIP_LOW(TR, -273); - TKR = `KELVINCONVERSION + TR_i; - TKD = $temperature + DTA; - TKD_sq = TKD * TKD; - dT = TKD - TKR; - rT = TKD / TKR; - rTn = TKR / TKD; - phit = TKD * `KBOL / `QELE; - inv_phit = 1.0 / phit; - - // Local process parameters - Eg = 1.179 - 9.025e-5 * TKD - 3.05e-7 * TKD_sq; - phibFac = (1.045 + 4.5e-4 * TKD) * (0.523 + 1.4e-3 * TKD - 1.48e-6 * TKD_sq) * TKD_sq / 9.0E4; - phibFac = `MAX(phibFac, 1.0E-3); - EPSSI = `EPSO * `EPSRSI; - -`ifdef NQSmodel - // Round SWNQS to nearest allowed value - if (SWNQS < 0.5) begin - SWNQS_i = 0.0; - end else begin - if (SWNQS < 1.5) begin - SWNQS_i = 1.0; - end else begin - if (SWNQS < 2.5) begin - SWNQS_i = 2.0; - end else begin - if (SWNQS < 4.0) begin - SWNQS_i = 3.0; - end else begin - if (SWNQS < 7.0) begin - SWNQS_i = 5.0; - end else begin - SWNQS_i = 9.0; - end - end - end - end - end - inorm = 1.0e-12; - r_nqs = 1.0e+3; - vnorm = 10.0; - vnorm_inv = 1.0 / vnorm; - -`endif // NQSmodel - - nt0 = 4 * `KBOL * TKD; // parameter for white noise of parasitic resistances - - // JUNCAP2 - `include "JUNCAP200_InitModel.include" - - end // initial_model - - `INITIAL_INSTANCE - begin : initial_instance - // Code independent of bias, but dependent on instance parameters, - // (including code dependent on parameters which could IN PRINCIPLE be scaled) - // This block needs to be evaluated only once for each instance - - - ABSOURCE_i = ABSOURCE; - LSSOURCE_i = LSSOURCE; - LGSOURCE_i = LGSOURCE; - ABDRAIN_i = ABDRAIN; - LSDRAIN_i = LSDRAIN; - LGDRAIN_i = LGDRAIN; - AS_i = AS; - PS_i = PS; - AD_i = AD; - PD_i = PD; - - -`ifdef LocalModel - JW_i = JW; -`else // LocalModel - - L_i = L; - W_i = W; - SA_i = SA; - SB_i = SB; - SD_i = SD; - SC_i = SC; - XGW_i = XGW; - - // Clipping of the instance parameters - NF_i = `CLIP_LOW(NF, 1.0); - NF_i = floor(NF_i + 0.5); // round to nearest integer - invNF = 1.0 / NF_i; - L_i = `CLIP_LOW(L_i, 1e-9); - W_i = `CLIP_LOW(W_i * invNF, 1e-9); - SCA_i = `CLIP_LOW(SCA, 0.0); - SCB_i = `CLIP_LOW(SCB, 0.0); - SCC_i = `CLIP_LOW(SCC, 0.0); - RSHG_i = `CLIP_LOW(RSHG, 0.0); - NGCON_i = (NGCON < 1.5) ? 1.0 : 2.0; - - /////////////////////////////////////////// - // GEOMETRICAL PARAMETERSCALING - /////////////////////////////////////////// - - // 3.2 Transistor geometry - LEN = 1e-6; - WEN = 1e-6; - iL = LEN / L_i; - iW = WEN / W_i; -`ifdef Binning - delLPS = LVARO * (1.0 + LVARL * iL); - delWOD = WVARO * (1.0 + WVARW * iW); -`else // Binning - delLPS = LVARO * (1.0 + LVARL * iL) * (1.0 + LVARW * iW); - delWOD = WVARO * (1.0 + WVARL * iL) * (1.0 + WVARW * iW); -`endif // Binning - LE = `CLIP_LOW(L_i + delLPS - 2.0 * LAP, 1e-9); - WE = `CLIP_LOW(W_i + delWOD - 2.0 * WOT, 1e-9); - LEcv = `CLIP_LOW(L_i + delLPS - 2.0 * LAP + DLQ, 1e-9); - WEcv = `CLIP_LOW(W_i + delWOD - 2.0 * WOT + DWQ, 1e-9); - Lcv = `CLIP_LOW(L_i + delLPS + DLQ, 1e-9); - Wcv = `CLIP_LOW(W_i + delWOD + DWQ, 1e-9); - iLE = LEN / LE; - iWE = WEN / WE; - jwcorr = 0.0; - ABS_i = 0.0; - LSS_i = 0.0; - LGS_i = 0.0; - ABD_i = 0.0; - LSD_i = 0.0; - LGD_i = 0.0; - if (SWJUNCAP == 3.0) begin - jwcorr = WE; - end - if ((SWJUNCAP == 2.0) || (SWJUNCAP == 3.0)) begin - ABS_i = AS_i * invNF; - LSS_i = PS_i * invNF - jwcorr; - LGS_i = WE; - ABD_i = AD_i * invNF; - LSD_i = PD_i * invNF - jwcorr; - LGD_i = WE; - end else begin - ABS_i = ABSOURCE_i * invNF; - LSS_i = LSSOURCE_i * invNF; - LGS_i = LGSOURCE_i * invNF; - ABD_i = ABDRAIN_i * invNF; - LSD_i = LSDRAIN_i * invNF; - LGD_i = LGDRAIN_i * invNF; - end - - // Geometry for multi-finger devices - L_f = `CLIP_LOW(L_i + delLPS, 1e-9); - L_slif = `CLIP_LOW(L_f + DLSIL, 1e-9); - W_f = `CLIP_LOW(W_i + delWOD, 1e-9); - XGWE = `CLIP_LOW(XGW_i - 0.5 * delWOD, 1e-9); - -`ifdef Binning - // 3.3 Geometry scaling with binning scaling rules - `include "PSP102_binning.include" - -`else // Binning - // 3.2 Geometry scaling with physical scaling rules - - // Process parameters - VFB = VFBO * (1.0 + VFBL * iLE) * (1.0 + VFBW * iWE) * (1.0 + VFBLW * iLE * iWE); - STVFB = STVFBO * (1.0 + STVFBL * iLE) * (1.0 + STVFBW * iWE) * (1.0 + STVFBLW * iLE * iWE); - TOX = TOXO; - EPSROX = EPSROXO; - NSUB0e = NSUBO_i * `MAX(( 1.0 + NSUBW * iWE * ln( 1.0 + WE / WSEG_i )), 1.0E-03); - NPCKe = NPCK_i * `MAX(( 1.0 + NPCKW * iWE * ln( 1.0 + WE / WSEGP_i )), 1.0E-03); - LPCKe = LPCK_i * `MAX(( 1.0 + LPCKW * iWE * ln( 1.0 + WE / WSEGP_i )), 1.0E-03); - if (LE > (2 * LPCKe)) begin - AA = 7.5e10; - BB = sqrt(NSUB0e + 0.5 * NPCKe) - sqrt(NSUB0e); - NSUB = sqrt(NSUB0e) + AA * ln(1 + 2 * LPCKe / LE * (exp(BB / AA) - 1)); - NSUB = NSUB * NSUB; - end else begin - if (LE >= LPCKe) begin - NSUB = NSUB0e + NPCKe * LPCKe / LE; - end else begin // LE < LPCK - NSUB = NSUB0e + NPCKe * (2 - LE / LPCKe); - end - end - NEFF = NSUB * (1 - FOL1 * iLE - FOL2 * iLE * iLE); - VNSUB = VNSUBO; - NSLP = NSLPO; - DNSUB = DNSUBO; - DPHIB = (DPHIBO + DPHIBL * pow(iLE, DPHIBLEXP)) * (1.0 + DPHIBW * iWE) * (1.0 + DPHIBLW * iLE * iWE); - NP = NPO * `MAX(1e-6, (1.0 + NPL * iLE)); - CT = (CTO + CTL * pow(iLE, CTLEXP)) * (1.0 + CTW * iWE) * (1.0 + CTLW * iLE * iWE); - TOXOV = TOXOVO; - TOXOVD = TOXOVDO; - NOV = NOVO; - NOVD = NOVDO; - - // DIBL parameters - CF = CFL * pow(iLE, CFLEXP) * (1.0 + CFW * iWE); - CFB = CFBO; - - // Mobility parameters - FBET1e = FBET1 * (1.0 + FBET1W * iWE); - LP1e = LP1_i * `MAX(1.0 + LP1W * iWE, 1.0E-03); - GPE = 1.0 + FBET1e * LP1e / LE * (1.0 - exp(-LE / LP1e)) + FBET2 * LP2_i / LE * (1.0 - exp(-LE / LP2_i)); - GPE = `MAX(GPE, 1e-15); - GWE = 1.0 + BETW1 * iWE + BETW2 * iWE * ln(1.0 + WE / WBET_i); - BETN = UO * WE / (GPE * LE) * GWE; - STBET = STBETO * (1.0 + STBETL * iLE) * (1.0 + STBETW * iWE) * (1.0 + STBETLW * iLE * iWE); - MUE = MUEO * (1.0 + MUEW * iWE); - STMUE = STMUEO; - THEMU = THEMUO; - STTHEMU = STTHEMUO; - CS = (CSO + CSL * pow(iLE, CSLEXP)) * (1.0 + CSW * iWE) * (1.0 + CSLW * iLE * iWE); - STCS = STCSO; - XCOR = XCORO * (1.0 + XCORL * iLE) * (1.0 + XCORW * iWE) * (1.0 + XCORLW * iLE * iWE); - STXCOR = STXCORO; - FETA = FETAO; - - // Series resistance - RS = RSW1 * iWE * (1.0 + RSW2 * iWE); - STRS = STRSO; - RSB = RSBO; - RSG = RSGO; - - // Velocity saturation - THESAT = (THESATO + THESATL* GWE / GPE * pow(iLE, THESATLEXP)) * (1.0 + THESATW * iWE) * (1.0 + THESATLW * iLE * iWE); - STTHESAT = STTHESATO * (1.0 + STTHESATL * iLE) * (1.0 + STTHESATW * iWE) * (1.0 + STTHESATLW * iLE * iWE); - THESATB = THESATBO; - THESATG = THESATGO; - - // Saturation voltage - AX = AXO / (1.0 + AXL_i * iLE); - - // Channel length modulation - ALP = ALPL * pow(iLE, ALPLEXP) * (1.0 + ALPW * iWE); - tmpx = pow(iLE, ALP1LEXP); - ALP1 = ALP1L1 * tmpx * (1.0 + ALP1W * iWE) / (1.0 + ALP1L2_i * iLE * tmpx); - tmpx = pow(iLE, ALP2LEXP); - ALP2 = ALP2L1 * tmpx * (1.0 + ALP2W * iWE) / (1.0 + ALP2L2_i * iLE * tmpx); - VP = VPO; - - // Impact ionization - A1 = A1O * (1.0 + A1L * iLE) * (1.0 + A1W * iWE); - A2 = A2O; - STA2 = STA2O; - A3 = A3O * (1.0 + A3L * iLE) * (1.0 + A3W * iWE); - A4 = A4O * (1.0 + A4L * iLE) * (1.0 + A4W * iWE); - - // Gate current - GCO = GCOO; - IGINV = IGINVLW / (iWE * iLE); - IGOV = IGOVW * LOV_i / (LEN * iWE); - IGOVD = IGOVDW * LOVD_i / (LEN * iWE); - STIG = STIGO; - GC2 = GC2O; - GC3 = GC3O; - CHIB = CHIBO; - - // GIDL - AGIDL = AGIDLW * LOV_i / (LEN * iWE); - AGIDLD = AGIDLDW * LOVD_i / (LEN * iWE); - BGIDL = BGIDLO; - BGIDLD = BGIDLDO; - STBGIDL = STBGIDLO; - STBGIDLD = STBGIDLDO; - CGIDL = CGIDLO; - CGIDLD = CGIDLDO; - - // Charge model parameters - COX = `EPSO * EPSROX_i * WEcv * LEcv / TOX_i; - CGOV = `EPSO * EPSROX_i * WEcv * LOV_i / TOXOV_i; - CGOVD = `EPSO * EPSROX_i * WEcv * LOVD_i / TOXOVD_i; - CGBOV = CGBOVL * Lcv / LEN; - CFR = CFRW * Wcv / WEN; - CFRD = CFRDW * Wcv / WEN; - - // Noise model parameters - temp0 = 1.0 - 2.0 * LINTNOI * iLE / LEN; - Lnoi = `MAX(temp0, 1.0e-3); - Lred = 1.0 / pow(Lnoi, ALPNOI); - - FNT = FNTO; - FNTEXC = FNTEXCL * BETN * BETN * iWE * iWE; - NFA = Lred * iWE * iLE * NFALW; - NFB = Lred * iWE * iLE * NFBLW; - NFC = Lred * iWE * iLE * NFCLW; - EF = EFO; - - // Well proximity effect parameters - KVTHOWE = KVTHOWEO + KVTHOWEL * iLE + KVTHOWEW * iWE + KVTHOWELW * iLE * iWE; - KUOWE = KUOWEO + KUOWEL * iLE + KUOWEW * iWE + KUOWELW * iLE * iWE; -`endif // Binning - - // Parasitic resistance parameters - RG = RSHG_i * (`oneThird * W_f / NGCON_i + XGWE) / (NGCON_i * L_slif) - + (RINT_i + RVPOLY_i) / (W_f * L_f) + NF_i * RGO; - RWELL = NF_i * RWELLO; - RBULK = NF_i * RBULKO; - RJUNS = NF_i * RJUNSO; - RJUND = NF_i * RJUNDO; - -`ifdef NQSmodel - MUNQS = MUNQSO; -`endif // NQSModel - - /////////////////////////////////////////// - // STRESSMODEL - /////////////////////////////////////////// - - // 3.4 Stress equations - tmpa = 0.0; - tmpb = 0.0; - loop = 0.0; - if ((SA_i > 0.0) && (SB_i > 0.0) && ((NF_i == 1.0) || ((NF_i > 1.0) && (SD_i > 0.0)))) begin - // Auxiliary variables - - // Note: some verilog-A compilers will (unnecesarily) cause the while-loop - // below to be executed at every bias step; this has a negative impact on - // the simulation speed of PSP. - while (loop < (NF_i - 0.5)) begin - tmpa = tmpa + 1.0 / (SA_i + 0.5 * L_i + loop * (SD_i + L_i)); - tmpb = tmpb + 1.0 / (SB_i + 0.5 * L_i + loop * (SD_i + L_i)); - loop = loop + 1.0; - end - Invsa = tmpa * invNF; - Invsb = tmpb * invNF; - Invsaref = 1.0 / (SAREF_i + 0.5 * L_i); - Invsbref = 1.0 / (SBREF_i + 0.5 * L_i); - Lx = `MAX(L_i + delLPS, 1e-9); - Wx = `MAX(W_i + delWOD + WLOD, 1e-9); - templ = 1.0 / pow(Lx, LLODKUO_i); - tempw = 1.0 / pow(Wx, WLODKUO_i); - Kstressu0 = (1.0 + LKUO * templ + WKUO * tempw + PKUO * templ * tempw) * (1.0 + TKUO * (rT - 1.0)); - rhobeta = KUO * (Invsa + Invsb) / Kstressu0; - rhobetaref = KUO * (Invsaref + Invsbref) / Kstressu0; - templ = 1.0 / pow(Lx, LLODVTH_i); - tempw = 1.0 / pow(Wx, WLODVTH_i); - Kstressvth0= 1.0 + LKVTHO * templ + WKVTHO * tempw + PKVTHO * templ * tempw; - temp0 = Invsa + Invsb - Invsaref - Invsbref; - - // Parameter adaptations - BETN = BETN * (1.0 + rhobeta) / (1.0 + rhobetaref); - THESAT = THESAT * (1.0 + rhobeta) * (1.0 + KVSAT_i * rhobetaref) / ((1.0 + rhobetaref) * (1.0 + KVSAT_i * rhobeta)); - VFB = VFB + KVTHO * temp0 / Kstressvth0; - CF = CF + STETAO * temp0 / pow(Kstressvth0, LODETAO_i); - end - - /////////////////////////////////////////// - // WELL PROXIMITY EFFECT MODEL - /////////////////////////////////////////// - - // 3.5 Well proximity effect equations - if ((SCA_i > 0.0) || (SCB_i > 0.0) || (SCC_i > 0.0) || (SC_i > 0.0)) begin - if ((SCA_i == 0.0) && (SCB_i == 0.0) && (SCC_i == 0.0)) begin - temp0 = SC_i + W_i; - temp00 = 1.0 / SCREF_i; - SCA_i = SCREF_i * SCREF_i / (SC_i * temp0); - SCB_i = ((0.1 * SC_i + 0.01 * SCREF_i) * exp(-10.0 * SC_i * temp00) - - (0.1 * temp0 + 0.01 * SCREF_i) * exp(-10.0 * temp0 * temp00)) / W_i; - SCC_i = ((0.05 * SC_i + 0.0025 * SCREF_i) * exp(-20.0 * SC_i * temp00) - - (0.05 * temp0 + 0.0025 * SCREF_i) * exp(-20.0 * temp0 * temp00)) / W_i; - end - - // Parameter adaptations - temp0 = SCA_i + WEB_i * SCB_i + WEC_i * SCC_i; - VFB = VFB + KVTHOWE * temp0; - BETN = BETN * (1.0 + KUOWE * temp0); - end - - ///////////////////////////////////////////// - // END OF SCALINGRULES AND STRESS/WPE MODELS - ///////////////////////////////////////////// - -`endif // LocalModel - // 4.1 Internal parameters (including temperature scaling) - - // Clipping of the local model parameters - VFB_i = VFB; - STVFB_i = STVFB; - TOX_i = `CLIP_LOW(TOX, 1e-10); - EPSROX_i = `CLIP_LOW(EPSROX, 1.0); - NEFF_i = `CLIP_BOTH(NEFF, 1e20, 1e26); - VNSUB_i = VNSUB; - NSLP_i = `CLIP_LOW(NSLP, 1e-3); - DNSUB_i = `CLIP_BOTH(DNSUB, 0.0, 1.0); - DPHIB_i = DPHIB; - NP_i = `CLIP_LOW(NP, 0.0); - QMC_i = `CLIP_LOW(QMC, 0.0); - CT_i = `CLIP_LOW(CT, 0.0); - TOXOV_i = `CLIP_LOW(TOXOV, 1e-10); - TOXOVD_i = `CLIP_LOW(TOXOVD, 1e-10); - NOV_i = `CLIP_BOTH(NOV, 1e20, 1e27); - NOVD_i = `CLIP_BOTH(NOVD, 1e20, 1e27); - CF_i = `CLIP_LOW(CF, 0.0); - CFB_i = `CLIP_BOTH(CFB, 0.0, 1.0); - BETN_i = `CLIP_LOW(BETN, 0.0); - STBET_i = STBET; - MUE_i = `CLIP_LOW(MUE, 0.0); - STMUE_i = STMUE; - THEMU_i = `CLIP_LOW(THEMU, 0.0); - STTHEMU_i = STTHEMU; - CS_i = `CLIP_LOW(CS, 0.0); - STCS_i = STCS; - XCOR_i = `CLIP_LOW(XCOR, 0.0); - STXCOR_i = STXCOR; - FETA_i = `CLIP_LOW(FETA, 0.0); - RS_i = `CLIP_LOW(RS, 0.0); - STRS_i = STRS; - RSB_i = `CLIP_BOTH(RSB, -0.5, 1.0); - RSG_i = `CLIP_LOW(RSG, -0.5); - THESAT_i = `CLIP_LOW(THESAT, 0.0); - STTHESAT_i = STTHESAT; - THESATB_i = `CLIP_BOTH(THESATB, -0.5, 1.0); - THESATG_i = `CLIP_LOW(THESATG, -0.5); - AX_i = `CLIP_LOW(AX, 2.0); - ALP_i = `CLIP_LOW(ALP, 0.0); - ALP1_i = `CLIP_LOW(ALP1, 0.0); - ALP2_i = `CLIP_LOW(ALP2, 0.0); - VP_i = `CLIP_LOW(VP, 1.0e-10); - A1_i = `CLIP_LOW(A1, 0.0); - A2_i = `CLIP_LOW(A2, 0.0); - STA2_i = STA2; - A3_i = `CLIP_LOW(A3, 0.0); - A4_i = `CLIP_LOW(A4, 0.0); - GCO_i = `CLIP_BOTH(GCO, -10.0, 10.0); - IGINV_i = `CLIP_LOW(IGINV, 0.0); - IGOV_i = `CLIP_LOW(IGOV, 0.0); - IGOVD_i = `CLIP_LOW(IGOVD, 0.0); - STIG_i = STIG; - GC2_i = `CLIP_BOTH(GC2, 0.0, 10.0); - GC3_i = `CLIP_BOTH(GC3, -10.0, 10.0); - CHIB_i = `CLIP_LOW(CHIB, 1.0); - AGIDL_i = `CLIP_LOW(AGIDL, 0.0); - AGIDLD_i = `CLIP_LOW(AGIDLD, 0.0); - BGIDL_i = `CLIP_LOW(BGIDL, 0.0); - BGIDLD_i = `CLIP_LOW(BGIDLD, 0.0); - STBGIDL_i = STBGIDL; - STBGIDLD_i = STBGIDLD; - CGIDL_i = CGIDL; - CGIDLD_i = CGIDLD; - COX_i = `CLIP_LOW(COX, 0.0); - CGOV_i = `CLIP_LOW(CGOV, 0.0); - CGOVD_i = `CLIP_LOW(CGOVD, 0.0); - CGBOV_i = `CLIP_LOW(CGBOV, 0.0); - CFR_i = `CLIP_LOW(CFR, 0.0); - CFRD_i = `CLIP_LOW(CFRD, 0.0); - FNT_i = `CLIP_LOW(FNT, 0.0); - FNTEXC_i = `CLIP_LOW(FNTEXC, 0.0); - NFA_i = `CLIP_LOW(NFA, 0.0); - NFB_i = `CLIP_LOW(NFB, 0.0); - NFC_i = `CLIP_LOW(NFC, 0.0); - EF_i = `CLIP_LOW(EF, 0.0); - FACTUO_i = `CLIP_LOW(FACTUO, 0.0); - DELVTO_i = DELVTO; - // Parasitic resistances - RG_i = `CLIP_LOW(RG, 1.0e-3); - RBULK_i = `CLIP_LOW(RBULK, 1.0e-3); - RJUNS_i = `CLIP_LOW(RJUNS, 1.0e-3); - RJUND_i = `CLIP_LOW(RJUND, 1.0e-3); - RWELL_i = `CLIP_LOW(RWELL, 1.0e-3); -`ifdef LocalModel - MULT_i = `CLIP_LOW(MULT, 0.0); -`else // LocalModel - MULT_i = `CLIP_LOW(MULT * NF_i, 0.0); -`endif // LocalModel -`ifdef NQSmodel - MUNQS_i = `CLIP_LOW(MUNQS, 0.0); -`endif // NQSmodel - - // ignore drain-side values in case of symmetric junctions - if (SWJUNASYM == 0.0) begin - TOXOVD_i = TOXOV_i; - NOVD_i = NOV_i; - AGIDLD_i = AGIDL_i; - BGIDLD_i = BGIDL_i; - STBGIDLD_i = STBGIDL_i; - CGIDLD_i = CGIDL_i; - IGOVD_i = IGOV_i; - CGOVD_i = CGOV_i; - CFRD_i = CFR_i; - end - -`ifdef LocalModel - // JUNCAP instance parameters (local model) - jwcorr = 0.0; - ABS_i = 0.0; - LSS_i = 0.0; - LGS_i = 0.0; - ABD_i = 0.0; - LSD_i = 0.0; - LGD_i = 0.0; - if (SWJUNCAP == 3.0) begin - jwcorr = JW_i; - end - if ((SWJUNCAP == 2.0) || (SWJUNCAP == 3.0)) begin - ABS_i = AS_i; - LSS_i = PS_i - jwcorr; - LGS_i = JW_i; - ABD_i = AD_i; - LSD_i = PD_i - jwcorr; - LGD_i = JW_i; - end else begin - ABS_i = ABSOURCE_i; - LSS_i = LSSOURCE_i; - LGS_i = LGSOURCE_i; - ABD_i = ABDRAIN_i; - LSD_i = LSDRAIN_i; - LGD_i = LGDRAIN_i; - end -`endif // LocalModel - if ((SWJUNCAP == 1.0) || (SWJUNCAP == 2.0) || (SWJUNCAP == 3.0)) begin - ABSOURCE_i = `CLIP_LOW(ABS_i, `AB_cliplow); - LSSOURCE_i = `CLIP_LOW(LSS_i, `LS_cliplow); - LGSOURCE_i = `CLIP_LOW(LGS_i, `LG_cliplow); - ABDRAIN_i = `CLIP_LOW(ABD_i, `AB_cliplow); - LSDRAIN_i = `CLIP_LOW(LSD_i, `LS_cliplow); - LGDRAIN_i = `CLIP_LOW(LGD_i, `LG_cliplow); - end else begin - ABSOURCE_i = 0.0; - LSSOURCE_i = 0.0; - LGSOURCE_i = 0.0; - ABDRAIN_i = 0.0; - LSDRAIN_i = 0.0; - LGDRAIN_i = 0.0; - end - - // Local process parameters - EPSOX = `EPSO * EPSROX_i; - phit1 = phit * (1.0 + CT_i * rTn); - inv_phit1 = 1.0 / phit1; - - VFB_i = VFB_i + STVFB_i * dT + DELVTO_i; - phib = Eg + DPHIB_i + 2.0 * phit * ln(NEFF_i * pow(phibFac, -0.75) * 4.0e-26); - phib = `MAX(phib, 5.0E-2); - CoxPrime = EPSOX / TOX_i; - tox_sq = TOX_i * TOX_i; - G_0 = sqrt(2.0 * `QELE * NEFF_i * EPSSI * inv_phit) / CoxPrime; - - // Poly-silicon depletion - kp = 0.0; - if (NP_i > 0.0) begin - arg2max = 8.0e7 / tox_sq; - np = `MAX(NP_i, arg2max); - np = `MAX(5.0e24, np); - kp = 2.0 * CoxPrime * CoxPrime * phit / (`QELE * np * EPSSI); - end - - // QM corrections - qlim2 = 100.0 * phit * phit; - qq = 0.0; - if (QMC_i > 0.0) begin - qq = 0.4 * `QMN * QMC_i * pow(CoxPrime, `twoThirds); - if (CHNL_TYPE==`PMOS) begin - qq = `QMP / `QMN * qq; - end - qb0 = sqrt(phit * G_0 * G_0 * phib); - dphibq = 0.75 * qq * pow(qb0, `twoThirds); - phib = phib + dphibq; - G_0 = G_0 * (1.0 + 2.0 * `twoThirds * dphibq / qb0); - end - sqrt_phib = sqrt(phib); - phix = 0.95 * phib; - aphi = 0.0025 * phib * phib; - bphi = aphi; - phix2 = 0.5 * sqrt(bphi); - phix1 = `MINA(phix - phix2, 0, aphi); - - // Gate overlap - CoxovPrime = EPSOX / TOXOV_i; - CoxovPrime_d = EPSOX / TOXOVD_i; - GOV_s = sqrt(2.0 * `QELE * NOV_i * EPSSI * inv_phit) / CoxovPrime; - GOV_d = sqrt(2.0 * `QELE * NOVD_i * EPSSI * inv_phit) / CoxovPrime_d; - GOV2_s = GOV_s * GOV_s; - GOV2_d = GOV_d * GOV_d; - xi_ov_s = 1.0 + GOV_s * `invSqrt2; - xi_ov_d = 1.0 + GOV_d * `invSqrt2; - inv_xi_ov_s = 1.0 / xi_ov_s; - inv_xi_ov_d = 1.0 / xi_ov_d; - x_mrg_ov_s = 1.0e-5 * xi_ov_s; - x_mrg_ov_d = 1.0e-5 * xi_ov_d; - - // Mobility parameters - tf_bet = pow(rTn, STBET_i); - BET_i = FACTUO_i * BETN_i * CoxPrime * tf_bet; - BETN_i = BETN_i * tf_bet; - THEMU_i = THEMU_i * pow(rTn, STTHEMU_i); - tf_mue = pow(rTn, STMUE_i); - MUE_i = MUE_i * tf_mue; - tf_cs = pow(rTn, STCS_i); - CS_i = CS_i * tf_cs; - tf_xcor = pow(rTn, STXCOR_i); - XCOR_i = XCOR_i * tf_xcor; - E_eff0 = 1.0e-8 * CoxPrime / EPSSI; - eta_mu = 0.5 * FETA_i; - if (CHNL_TYPE == `PMOS) begin - eta_mu = `oneThird * FETA_i; - end - - // Series resistance - tf_ther = pow(rTn, STRS_i); - RS_i = RS_i * tf_ther; - THER_i = 2 * BET_i * RS_i; - - // Velocity saturation - tf_thesat = pow(rTn, STTHESAT_i); - THESAT_i = THESAT_i * tf_thesat; - Vdsat_lim = 3.912023005 * phit1; - - inv_AX = 1.0 / AX_i; - inv_VP = 1.0 / VP_i; - - // Impact ionization - A2_i = A2_i * pow(rT, STA2_i); - - // Gate current - tf_ig = pow(rT, STIG_i); - IGINV_i = IGINV_i * tf_ig; - IGOV_i = IGOV_i * tf_ig; - IGOVD_i = IGOVD_i * tf_ig; - inv_CHIB = 1.0 / CHIB_i; - tempM = 4.0 * `oneThird * sqrt(2 * `QELE * `MELE * CHIB_i) / `HBAR; - BCH = tempM * TOX_i; - BOV = tempM * TOXOV_i; - BOV_d = tempM * TOXOVD_i; - GCQ = 0; - if (GC3_i < 0) begin - GCQ = -0.495 * GC2_i / GC3_i; - end - alpha_b = 0.5 * (phib + Eg); - Dch = GCO_i * phit1; - Dov = GCO_i * phit; - - // GIDL - AGIDLs = AGIDL_i * 4e-18 / (TOXOV_i * TOXOV_i); - AGIDLDs = AGIDLD_i * 4e-18 / (TOXOVD_i * TOXOVD_i); - tempM = `MAX(1.0 + STBGIDL_i * dT, 0); - BGIDL_T = BGIDL_i * tempM; - BGIDLs = BGIDL_T * TOXOV_i * 5e8; - tempM = `MAX(1.0 + STBGIDLD_i * dT, 0); - BGIDLD_T = BGIDLD_i * tempM; - BGIDLDs = BGIDLD_T * TOXOVD_i * 5e8; - - // Noise - nt = FNT_i * 4 * `KBOL * TKD; - Cox_over_q = CoxPrime / `QELE; - Sfl_prefac = phit * phit * BET_i / Cox_over_q; - fac_exc = `MELE * 1e9 * FNTEXC_i; - - // Additional internal parameters - x1 = 1.25; - inv_xg1_s = 1.0 / (x1 + GOV_s * 7.324648775608221e-1); // = 1.0/(x1+GOV*sqrt(exp(-x1)+x1-1)); - inv_xg1_d = 1.0 / (x1 + GOV_d * 7.324648775608221e-1); - - // Conductance of parasitic resistance - if (RG_i > 0.0) begin - ggate = 1.0 / RG_i; - end else begin - ggate = 0.0; - end - if (RBULK_i > 0.0) begin - gbulk = 1.0 / RBULK_i; - end else begin - gbulk = 0.0; - end - if (RJUNS_i > 0.0) begin - gjuns = 1.0 / RJUNS_i; - end else begin - gjuns = 0.0; - end - if (RJUND_i > 0.0) begin - gjund = 1.0 / RJUND_i; - end else begin - gjund = 0.0; - end - if (RWELL_i > 0.0) begin - gwell = 1.0 / RWELL_i; - end else begin - gwell = 0.0; - end - - - // JUNCAP2 - - // Initialization of JUNCAP (global) variables; required for some verilog-A compilers - vbimin_s = 0.0; - vbimin_d = 0.0; - vfmin_s = 0.0; - vfmin_d = 0.0; - vch_s = 0.0; - vch_d = 0.0; - vbbtlim_s = 0.0; - vbbtlim_d = 0.0; - VMAX_s = 0.0; - VMAX_d = 0.0; - exp_VMAX_over_phitd_s = 0.0; - exp_VMAX_over_phitd_d = 0.0; - ISATFOR1_s = 0.0; - ISATFOR1_d = 0.0; - MFOR1_s = 1.0; - MFOR1_d = 1.0; - ISATFOR2_s = 0.0; - ISATFOR2_d = 0.0; - MFOR2_s = 1.0; - MFOR2_d = 1.0; - ISATREV_s = 0.0; - ISATREV_d = 0.0; - MREV_s = 1.0; - MREV_d = 1.0; - m0flag_s = 0.0; - m0flag_d = 0.0; - xhighf1_s = 0.0; - xhighf1_d = 0.0; - expxhf1_s = 0.0; - expxhf1_d = 0.0; - xhighf2_s = 0.0; - xhighf2_d = 0.0; - expxhf2_s = 0.0; - expxhf2_d = 0.0; - xhighr_s = 0.0; - xhighr_d = 0.0; - expxhr_s = 0.0; - expxhr_d = 0.0; - zflagbot_s = 1.0; - zflagbot_d = 1.0; - zflagsti_s = 1.0; - zflagsti_d = 1.0; - zflaggat_s = 1.0; - zflaggat_d = 1.0; - - m0_rev = 0.0; - mcor_rev = 0.0; - I1_cor = 0.0; - I2_cor = 0.0; - I3_cor = 0.0; - I4_cor = 0.0; - I5_cor = 0.0; - tt0 = 0.0; - tt1 = 0.0; - tt2 = 0.0; - zfrac = 0.0; - alphaje = 0.0; - - if (SWJUNCAP > 0) begin - `JuncapInitInstance(ABSOURCE_i, LSSOURCE_i, LGSOURCE_i, idsatbot, idsatsti, idsatgat, vbibot, vbisti, vbigat, PBOT_i, PSTI_i, PGAT_i, VBIRBOT_i, VBIRSTI_i, VBIRGAT_i, VMAX_s, exp_VMAX_over_phitd_s, vbimin_s, vch_s, vfmin_s, vbbtlim_s) - `JuncapInitInstance(ABDRAIN_i, LSDRAIN_i, LGDRAIN_i, idsatbot_d, idsatsti_d, idsatgat_d, vbibot_d, vbisti_d, vbigat_d, PBOTD_i, PSTID_i, PGATD_i, VBIRBOTD_i, VBIRSTID_i, VBIRGATD_i, VMAX_d, exp_VMAX_over_phitd_d, vbimin_d, vch_d, vfmin_d, vbbtlim_d) - - if (SWJUNEXP_i == 1.0) begin : JUNCAPexpressInit - // The variables in the macro below are (re-)declared LOCALLY, to keep - // them separated from their globally declared counterparts. This trick - // allows one to use the "juncapcommon" macro both in the JUNCAP-express - // initialization and in the full-JUNCAP evaluation, while in the former - // the verilog-A compiler can still consider the variables as - // voltage-INdependent. This is essential to avoid recomputation of the - // JUNCAP-express initialization at each bias-step. -// `LocalGlobalVars - // results computed here are not used elsewhere -// real ijunbot, ijunsti, ijungat, qjunbot, qjunsti, qjungat; - - // Initialization of (local) variables; required for some verilog-A compilers - ysq = 0.0; - terfc = 0.0; - erfcpos = 0.0; - h1 = 0.0; - h2 = 0.0; - h2d = 0.0; - h3 = 0.0; - h4 = 0.0; - h5 = 0.0; - idmult = 0.0; - vj = 0.0; - z = 0.0; - zinv = 0.0; - two_psistar = 0.0; - vjlim = 0.0; - vjsrh = 0.0; - vbbt = 0.0; - vav = 0.0; - tmp = 0.0; - id = 0.0; - isrh = 0.0; - vbi_minus_vjsrh = 0.0; - wsrhstep = 0.0; - dwsrh = 0.0; - wsrh = 0.0; - wdep = 0.0; - asrh = 0.0; - itat = 0.0; - btat = 0.0; - twoatatoverthreebtat = 0.0; - umaxbeforelimiting = 0.0; - umax = 0.0; - sqrtumax = 0.0; - umaxpoweronepointfive = 0.0; - wgamma = 0.0; - wtat = 0.0; - ktat = 0.0; - ltat = 0.0; - mtat = 0.0; - xerfc = 0.0; - erfctimesexpmtat = 0.0; - gammamax = 0.0; - ibbt = 0.0; - Fmaxr = 0.0; - fbreakdown = 0.0; - qjunbot = 0.0; - qjunsti = 0.0; - qjungat = 0.0; - - // Computation of JUNCAP-express internal parameters - `JuncapExpressInit1(ABSOURCE_i, LSSOURCE_i, LGSOURCE_i, VJUNREF_i, qprefbot, qpref2bot, vbiinvbot, one_minus_PBOT, idsatbot, CSRHBOT_i, CTATBOT_i, vbibot, wdepnulrbot, VBIRBOTinv, PBOT_i, ftdbot, btatpartbot, atatbot, one_over_one_minus_PBOT, CBBTBOT_i, VBIRBOT_i, wdepnulrinvbot, fbbtbot, VBRBOT_i, VBRinvbot, PBRBOT_i, fstopbot, slopebot, qprefsti, qpref2sti, vbiinvsti, one_minus_PSTI, idsatsti, CSRHSTI_i, CTATSTI_i, vbisti, wdepnulrsti, VBIRSTIinv, PSTI_i, ftdsti, btatpartsti, atatsti, one_over_one_minus_PSTI, CBBTSTI_i, VBIRSTI_i, wdepnulrinvsti, fbbtsti, VBRSTI_i, VBRinvsti, PBRSTI_i, fstopsti, slopesti, qprefgat, qpref2gat, vbiinvgat, one_minus_PGAT, idsatgat, CSRHGAT_i, CTATGAT_i, vbigat, wdepnulrgat, VBIRGATinv, PGAT_i, ftdgat, btatpartgat, atatgat, one_over_one_minus_PGAT, CBBTGAT_i, VBIRGAT_i, wdepnulrinvgat, fbbtgat, VBRGAT_i, VBRinvgat, PBRGAT_i, fstopgat, slopegat, VMAX_s, exp_VMAX_over_phitd_s, vbimin_s, vch_s, vfmin_s, vbbtlim_s) - `JuncapExpressInit2(ABSOURCE_i, LSSOURCE_i, LGSOURCE_i, qprefbot, qpref2bot, vbiinvbot, one_minus_PBOT, idsatbot, CSRHBOT_i, CTATBOT_i, vbibot, wdepnulrbot, VBIRBOTinv, PBOT_i, ftdbot, btatpartbot, atatbot, one_over_one_minus_PBOT, CBBTBOT_i, VBIRBOT_i, wdepnulrinvbot, fbbtbot, VBRBOT_i, VBRinvbot, PBRBOT_i, fstopbot, slopebot, qprefsti, qpref2sti, vbiinvsti, one_minus_PSTI, idsatsti, CSRHSTI_i, CTATSTI_i, vbisti, wdepnulrsti, VBIRSTIinv, PSTI_i, ftdsti, btatpartsti, atatsti, one_over_one_minus_PSTI, CBBTSTI_i, VBIRSTI_i, wdepnulrinvsti, fbbtsti, VBRSTI_i, VBRinvsti, PBRSTI_i, fstopsti, slopesti, qprefgat, qpref2gat, vbiinvgat, one_minus_PGAT, idsatgat, CSRHGAT_i, CTATGAT_i, vbigat, wdepnulrgat, VBIRGATinv, PGAT_i, ftdgat, btatpartgat, atatgat, one_over_one_minus_PGAT, CBBTGAT_i, VBIRGAT_i, wdepnulrinvgat, fbbtgat, VBRGAT_i, VBRinvgat, PBRGAT_i, fstopgat, slopegat, VMAX_s, exp_VMAX_over_phitd_s, vbimin_s, vch_s, vfmin_s, vbbtlim_s) - `JuncapExpressInit3(ABSOURCE_i, LSSOURCE_i, LGSOURCE_i, idsatbot, idsatsti, idsatgat, ISATFOR1_s, MFOR1_s, ISATFOR2_s, MFOR2_s, ISATREV_s, MREV_s, m0flag_s) - `JuncapExpressInit4(ABSOURCE_i, LSSOURCE_i, LGSOURCE_i, FJUNQ_i, cjobot, cjosti, cjogat, zflagbot_s, zflagsti_s, zflaggat_s) - `JuncapExpressInit5(ABSOURCE_i, LSSOURCE_i, LGSOURCE_i, ISATFOR1_s, ISATFOR2_s, ISATREV_s, xhighf1_s, expxhf1_s, xhighf2_s, expxhf2_s, xhighr_s, expxhr_s) - - `JuncapExpressInit1(ABDRAIN_i, LSDRAIN_i, LGDRAIN_i, VJUNREFD_i, qprefbot_d, qpref2bot_d, vbiinvbot_d, one_minus_PBOT_d, idsatbot_d, CSRHBOTD_i, CTATBOTD_i, vbibot_d, wdepnulrbot_d, VBIRBOTinv_d, PBOTD_i, ftdbot_d, btatpartbot_d, atatbot_d, one_over_one_minus_PBOT_d, CBBTBOTD_i, VBIRBOTD_i, wdepnulrinvbot_d, fbbtbot_d, VBRBOTD_i, VBRinvbot_d, PBRBOTD_i, fstopbot_d, slopebot_d, qprefsti_d, qpref2sti_d, vbiinvsti_d, one_minus_PSTI_d, idsatsti_d, CSRHSTID_i, CTATSTID_i, vbisti_d, wdepnulrsti_d, VBIRSTIinv_d, PSTID_i, ftdsti_d, btatpartsti_d, atatsti_d, one_over_one_minus_PSTI_d, CBBTSTID_i, VBIRSTID_i, wdepnulrinvsti_d, fbbtsti_d, VBRSTID_i, VBRinvsti_d, PBRSTID_i, fstopsti_d, slopesti_d, qprefgat_d, qpref2gat_d, vbiinvgat_d, one_minus_PGAT_d, idsatgat_d, CSRHGATD_i, CTATGATD_i, vbigat_d, wdepnulrgat_d, VBIRGATinv_d, PGATD_i, ftdgat_d, btatpartgat_d, atatgat_d, one_over_one_minus_PGAT_d, CBBTGATD_i, VBIRGATD_i, wdepnulrinvgat_d, fbbtgat_d, VBRGATD_i, VBRinvgat_d, PBRGATD_i, fstopgat_d, slopegat_d, VMAX_d, exp_VMAX_over_phitd_d, vbimin_d, vch_d, vfmin_d, vbbtlim_d) - `JuncapExpressInit2(ABDRAIN_i, LSDRAIN_i, LGDRAIN_i, qprefbot_d, qpref2bot_d, vbiinvbot_d, one_minus_PBOT_d, idsatbot_d, CSRHBOTD_i, CTATBOTD_i, vbibot_d, wdepnulrbot_d, VBIRBOTinv_d, PBOTD_i, ftdbot_d, btatpartbot_d, atatbot_d, one_over_one_minus_PBOT_d, CBBTBOTD_i, VBIRBOTD_i, wdepnulrinvbot_d, fbbtbot_d, VBRBOTD_i, VBRinvbot_d, PBRBOTD_i, fstopbot_d, slopebot_d, qprefsti_d, qpref2sti_d, vbiinvsti_d, one_minus_PSTI_d, idsatsti_d, CSRHSTID_i, CTATSTID_i, vbisti_d, wdepnulrsti_d, VBIRSTIinv_d, PSTID_i, ftdsti_d, btatpartsti_d, atatsti_d, one_over_one_minus_PSTI_d, CBBTSTID_i, VBIRSTID_i, wdepnulrinvsti_d, fbbtsti_d, VBRSTID_i, VBRinvsti_d, PBRSTID_i, fstopsti_d, slopesti_d, qprefgat_d, qpref2gat_d, vbiinvgat_d, one_minus_PGAT_d, idsatgat_d, CSRHGATD_i, CTATGATD_i, vbigat_d, wdepnulrgat_d, VBIRGATinv_d, PGATD_i, ftdgat_d, btatpartgat_d, atatgat_d, one_over_one_minus_PGAT_d, CBBTGATD_i, VBIRGATD_i, wdepnulrinvgat_d, fbbtgat_d, VBRGATD_i, VBRinvgat_d, PBRGATD_i, fstopgat_d, slopegat_d, VMAX_d, exp_VMAX_over_phitd_d, vbimin_d, vch_d, vfmin_d, vbbtlim_d) - `JuncapExpressInit3(ABDRAIN_i, LSDRAIN_i, LGDRAIN_i, idsatbot_d, idsatsti_d, idsatgat_d, ISATFOR1_d, MFOR1_d, ISATFOR2_d, MFOR2_d, ISATREV_d, MREV_d, m0flag_d) - `JuncapExpressInit4(ABDRAIN_i, LSDRAIN_i, LGDRAIN_i, FJUNQD_i, cjobot_d, cjosti_d, cjogat_d, zflagbot_d, zflagsti_d, zflaggat_d) - `JuncapExpressInit5(ABDRAIN_i, LSDRAIN_i, LGDRAIN_i, ISATFOR1_d, ISATFOR2_d, ISATREV_d, xhighf1_d, expxhf1_d, xhighf2_d, expxhf2_d, xhighr_d, expxhr_d) - end // JUNCAPexpressInit - - end - - - end // initial_instance - - ///////////////////////////////////////////////////////////////////////////// - // - // DC bias dependent quantities (calculations for current contribs) - // - ///////////////////////////////////////////////////////////////////////////// - - begin : evaluateblock -// real alpha, eta_p, xitsb, FdL, Gmob, Gmob_dL, Gvsat, Gvsatinv, dps, qim, qim1; -// real H, Iimpact, mavl, Ids, Vdse, Igsov, Igdov, Igcs, Igcd, xg, sigVds; -// real COX_qm; -// real ijun_s, ijunbot_s, ijunsti_s, ijungat_s; -// real ijun_d, ijunbot_d, ijunsti_d, ijungat_d; -// real qjun_s, qjunbot_s, qjunsti_s, qjungat_s; -// real qjun_d, qjunbot_d, qjunsti_d, qjungat_d; -// real jnoise_s, jnoise_d; - - begin : evaluateStatic - - // Initialisation of some variables - SP_S_x1 = 0.0; - x_s = 0.0; - sqm = 0.0; - alpha = 0.0; - eta_p = 1.0; - xitsb = 0.0; - rhob = 0.0; - GdL = 1.0; - FdL = 1.0; - Gmob = 1.0; - Gmob_dL = 1.0; - Udse = 0.0; - QCLM = 0.0; - thesat1 = 0.0; - Gvsat = 1.0; - Gvsatinv = 1.0; - xgm = 0.0; - dps = 0.0; - qim = 0.0; - qim1 = 0.0; - H = 1.0; - xs_ov = 0.0; - xd_ov = 0.0; - Vovs = 0.0; - Vovd = 0.0; - Iimpact = 0.0; - mavl = 0.0; -`ifdef NQSmodel - // Initialization of variables for NQS model - pd = 1.0; - ym = 0.0; -`endif // NQSmodel - - if (CHNL_TYPE == `NMOS) begin - Vgs = V(GP, S); - Vds = V(D, S); - Vsb = V(S, BP); - Vjun_s = -V(S, BS); - Vjun_d = -V(D, BD); - end else begin - Vgs = -V(GP, S); - Vds = -V(D, S); - Vsb = -V(S, BP); - Vjun_s = V(S, BS); - Vjun_d = V(D, BD); - end - - // Voltages NOT subject to S/D-interchange - VgsPrime = Vgs; - VsbPrime = Vsb; - VdbPrime = Vds + Vsb; - VgdPrime = Vgs - Vds; - xgs_ov = -VgsPrime * inv_phit; - xgd_ov = -VgdPrime * inv_phit; - - // Source-drain interchange - sigVds = 1.0; - if (Vds < 0.0) begin - sigVds = -1.0; - Vgs = Vgs - Vds; - Vsb = Vsb + Vds; - Vds = -Vds; - end - - Vdb = Vds + Vsb; - - // 4.2.1 Conditioning of terminal voltages - temp = `MINA(Vdb, Vsb, bphi) + phix; - Vsbstar = Vsb - `MINA(temp, 0, aphi) + phix1; - Vgbstar = Vgs + Vsbstar; - Vgb1 = Vgbstar - VFB_i; - Vdsx = sqrt(Vds * Vds + 0.01) - 0.1; - Vsbx = Vsbstar + 0.5 * (Vds - Vdsx); - delVg = CF_i * (Vdsx * (1 + CFB_i * Vsbx)); // DIBL - Vgb1 = Vgb1 + delVg; - xg = Vgb1 * inv_phit1; - - - // 4.2.2 Bias dependent body factor - if (DNSUB_i > 0.0) begin - Dnsub = DNSUB_i * `MAXA(0, Vgs + Vsb - VNSUB_i, NSLP_i); - Gf = G_0 * sqrt(1.0 + Dnsub); - end else begin - Gf = G_0; - end - - // 4.2.3 Surface potential at source side - Gf2 = Gf * Gf; - inv_Gf2 = 1.0 / Gf2; - xi = 1.0 + Gf * `invSqrt2; - inv_xi = 1.0 / xi; - Ux = Vsbstar * inv_phit1; - xn_s = phib * inv_phit1 + Ux; - if (xn_s < `se) - delta_ns = exp(-xn_s); - else - delta_ns = `ke / `P3(xn_s - `se); - margin = 1e-5 * xi; - - `sp_s(x_s, xg, xn_s, delta_ns) - x_d = x_s; - x_m = x_s; - x_ds = 0.0; - - // - // Core PSP current calculation - // - if (xg <= 0.0) begin - qis = 0.0; - Ids = 0.0; - xgm = xg - x_s; - Voxm = xgm * phit1; - qeff = Voxm; - Vdsat = Vdsat_lim; - Vdse = Vds; - end else begin // (xg > 0) - delta_1s = 0.0; - temp = 1.0 / (2.0 + x_s * x_s); - xi0s = x_s * x_s * temp; - xi1s = 4.0 * (x_s * temp * temp); - xi2s = (8.0 * temp - 12.0 * xi0s) * temp * temp; - if (x_s < `se05) begin - delta_1s = exp(x_s); - Es = 1.0 / delta_1s; - delta_1s = delta_ns * delta_1s; - end else if (x_s > (xn_s - `se05)) begin - delta_1s = exp(x_s - xn_s); - Es = delta_ns / delta_1s; - end else begin - delta_1s = `ke05 / `P3(xn_s - x_s - `se05); - Es = `ke05 / `P3(x_s - `se05); - end - Ds = delta_1s - delta_ns * (x_s + 1.0 + xi0s); - if (x_s < 1.0e-5) begin - Ps = 0.5 * (x_s * x_s * (1.0 - `oneThird * (x_s * (1.0 - 0.25 * x_s)))); - Ds = `oneSixth * (delta_ns * x_s * x_s * x_s * (1.0 + 1.75 * x_s)); - temp = sqrt(1.0 - `oneThird * (x_s * (1.0 - 0.25 * x_s))); - sqm = `invSqrt2 * (x_s * temp); - alpha = 1.0 + Gf * `invSqrt2 * (1.0 - 0.5 * x_s + `oneSixth * (x_s * x_s)) / temp; - end else begin - Ps = x_s - 1.0 + Es; - sqm = sqrt(Ps); - alpha = 1.0 + 0.5 * (Gf * (1.0 - Es) / sqm); - end - Em = Es; - Ed = Em; - Dm = Ds; - Dd = Dm; - - // 4.2.4 Drain saturation voltage - Rxcor = (1.0 + 0.2 * XCOR_i * Vsbx) / (1.0 + XCOR_i * Vsbx); - if ( Ds > `ke05) begin - xgs = Gf * sqrt(Ps + Ds); - qis = Gf2 * Ds * phit1 / (xgs + Gf * sqm); - qbs = sqm * Gf * phit1; - if (RSB_i < 0) begin - rhob = 1.0 / (1.0 - RSB_i * Vsbx); - end else begin - rhob = 1.0 + RSB_i * Vsbx; - end - if (RSG_i < 0) begin - temp = 1.0 - RSG_i * qis; - end else begin - temp = 1.0 / (1.0 + RSG_i * qis); - end - GR = THER_i * (rhob * temp * qis); - Eeffm = E_eff0 * (qbs + eta_mu * qis); - Mutmp = pow(Eeffm * MUE_i, THEMU_i) + CS_i * (Ps / (Ps + Ds + 1.0e-14)); - Gmob = (1.0 + Mutmp + GR) * Rxcor; - if (THESATB_i < 0) begin - xitsb = 1.0 / (1.0 - THESATB_i * Vsbx); - end else begin - xitsb = 1.0 + THESATB_i * Vsbx; - end - temp2 = qis * xitsb; - wsat = 100.0 * (temp2 / (100.0 + temp2)); - if (THESATG_i < 0) begin - temp = 1 / (1 - THESATG_i * wsat); - end else begin - temp = 1 + THESATG_i * wsat; - end - thesat1 = THESAT_i * (temp / Gmob); - phi_inf = qis / alpha + phit1; - ysat = thesat1 * phi_inf * `invSqrt2; - if (CHNL_TYPE==`PMOS) begin - ysat = ysat / sqrt(1.0 + ysat); - end - za = 2.0 / (1.0 + sqrt(1.0 + 4.0 * ysat)); - temp1 = za * ysat; - Phi_0 = phi_inf * za * (1.0 + 0.86 * (temp1 * (1.0 - temp1 * za) / (1.0 + 4.0 * (temp1 * temp1 * za)))); - asat = xgs + 0.5 * Gf2; - Phi_2 = 0.98 * (Gf2 * Ds * phit1 / (asat + sqrt(asat * asat - Gf2 * Ds * 0.98))); - Phi_0_2 = Phi_0 + Phi_2; - Phi0_Phi2 = 2.0 * (Phi_0 * Phi_2); - Phi_sat = Phi0_Phi2 / (Phi_0_2 + sqrt(Phi_0_2 * Phi_0_2 - 1.98 * Phi0_Phi2)); - Vdsat = Phi_sat - phit1 * ln(1.0 + Phi_sat * (Phi_sat - 2.0 * asat * phit1) * inv_Gf2 / (phit1 * phit1 * Ds)); - end else begin - Vdsat = Vdsat_lim; - end - temp = pow(Vds / Vdsat, AX_i); - Vdse = Vds * pow(1.0 + temp, -inv_AX); - - // 4.2.5 Surface potential at drain side - Udse = Vdse * inv_phit1; - xn_d = xn_s + Udse; - if (Udse < `se) begin - k_ds = exp(-Udse); - end else begin - k_ds = `ke / `P3(Udse - `se); - end - delta_nd = delta_ns * k_ds; - - `sp_s_d(x_d, xg, xn_d, delta_nd) - x_ds = x_d - x_s; - - // - // Approximations for extremely small x_ds: capacitance calulation - // - if (x_ds < 1.0E-10) begin - pC = 2.0 * (xg - x_s) + Gf2 * (1.0 - Es + delta_1s * k_ds - delta_nd * (1.0 + xi1s)); - qC = Gf2 * (1.0 - k_ds) * Ds; - temp = 2.0 - Gf2 * (Es + delta_1s * k_ds - delta_nd * xi2s); - temp = pC * pC - 2.0 * (temp * qC); - x_ds = 2.0 * (qC / (pC + sqrt(temp))); - x_d = x_s + x_ds; - end - dps = x_ds * phit1; // deltaPsi - - xi0d = x_d * x_d / (2.0 + x_d * x_d); - if (x_d < `se05) begin - Ed = exp(-x_d); - if (x_d < 1.0e-5) begin - Dd = `oneSixth * delta_nd * x_d * x_d * x_d * (1.0 + 1.75 * x_d); - end else begin - Dd = delta_nd * (1.0 / Ed - x_d - 1.0 - xi0d); - end - end else begin - if (x_d > (xn_d - `se05)) begin - temp = exp(x_d - xn_d); - Ed = delta_nd / temp; - Dd = temp - delta_nd * (x_d + 1.0 + xi0d); - end else begin - Ed = `ke05 / `P3(x_d - `se05); - temp = `ke05 / `P3(xn_d - x_d - `se05); - Dd = temp - delta_nd * (x_d + 1.0 + xi0d); - end - end - - // 4.2.6 Mid-point surface potential - x_m = 0.5 * (x_s + x_d); - Em = 0.0; - temp = Ed * Es; - if (temp > 0.0) begin - Em = sqrt(temp); - end - D_bar = 0.5 * (Ds + Dd); - Dm = D_bar + 0.125 * (x_ds * x_ds * (Em - 2.0 * inv_Gf2)); - - if (x_m < 1.0e-5) begin - Pm = 0.5 * (x_m * x_m * (1.0 - `oneThird * (x_m * (1.0 - 0.25 * x_m)))); - xgm = Gf * sqrt(Dm + Pm); - - // 4.2.7 Polysilicon depletion - if (kp > 0.0) begin - eta_p = 1.0 / sqrt(1.0 + kp * xgm); - end // (kp > 0.0) - temp = sqrt(1.0 - `oneThird * (x_m * (1.0 - 0.25 * x_m))); - sqm = `invSqrt2 * (x_m * temp); - alpha = eta_p + `invSqrt2 * (Gf * (1.0 - 0.5 * x_m + `oneSixth * (x_m * x_m)) / temp); - end else begin - Pm = x_m - 1.0 + Em; - xgm = Gf * sqrt(Dm + Pm); - - // 4.2.7 Polysilicon depletion - if (kp > 0.0) begin - d0 = 1.0 - Em + 2.0 * (xgm * inv_Gf2); - eta_p = 1.0 / sqrt(1.0 + kp * xgm); - temp = eta_p / (eta_p + 1.0); - x_pm = kp * (temp * temp * Gf2 * Dm); - p_pd = 2.0 * (xgm - x_pm) + Gf2 * (1.0 - Em + Dm); - q_pd = x_pm * (x_pm - 2.0 * xgm); - xi_pd = 1.0 - 0.5 * (Gf2 * (Em + Dm)); - u_pd = q_pd * p_pd / (p_pd * p_pd - xi_pd * q_pd); - x_m = x_m + u_pd; - km = exp(u_pd); - Em = Em / km; - Dm = Dm * km; - Pm = x_m - 1.0 + Em; - xgm = Gf * sqrt(Dm + Pm); - help = 1.0 - Em + 2.0 * (xgm * eta_p * inv_Gf2); - x_ds = x_ds * km * (d0 + D_bar) / (help + km * D_bar); - dps = x_ds * phit1; - end // (kp > 0.0) - sqm = sqrt(Pm); - alpha = eta_p + 0.5 * (Gf * (1.0 - Em) / sqm); - end - - // 4.2.8 Potential midpoint inversion charge - qim = phit1 * (Gf2 * Dm / (xgm + Gf * sqm)); - - // 4.2.8 Potential midpoint inversion charge (continued) - qim1 = qim + phit1 * alpha; - qim1_1 = 1.0 / qim1; - qbm = sqm * Gf * phit1; - // Series resistance - if (RSG_i < 0) begin - temp = 1.0 - RSG_i * qim; - end else begin - temp = 1.0 / (1.0 + RSG_i * qim); - end - GR = THER_i * (rhob * temp * qim); - // Mobility reduction - qeff = qbm + eta_mu * qim; - Eeffm = E_eff0 * qeff; - Mutmp = pow(Eeffm * MUE_i, THEMU_i) + CS_i * (Pm / (Pm + Dm + 1.0e-14)); - Gmob = (1.0 + Mutmp + GR) * Rxcor; - - // 4.2.9 Drain-source channel current - // Channel length modulation - r1 = qim * qim1_1; - r2 = phit1 * (alpha * qim1_1); - temp = ln((1.0 + (Vds - dps) * inv_VP) / (1.0 + (Vdse - dps) * inv_VP)); - temp1 = ln(1.0 + Vdsx * inv_VP); - dL = ALP_i * temp; - GdL = 1.0 / (1.0 + dL + dL * dL); - dL1 = dL + ALP1_i * (qim1_1 * r1 * temp) + ALP2_i * (qbm * r2 * r2 * temp1); - FdL = (1.0 + dL1 + dL1 * dL1) * GdL; - // Velocity saturation - temp2 = qim * xitsb; - wsat = 100.0 * (temp2 / (100.0 + temp2)); - Gmob_dL = Gmob * GdL; - if (THESATG_i < 0) begin - temp = 1 / (1 - THESATG_i * wsat); - end else begin - temp = 1 + THESATG_i * wsat; - end - thesat1 = THESAT_i * (temp / Gmob_dL); - zsat = thesat1 * thesat1 * dps * dps; - if (CHNL_TYPE == `PMOS) begin - zsat = zsat / (1.0 + thesat1 * dps); - end - Gvsat = 0.5 * (Gmob_dL * (1.0 + sqrt(1.0 + 2.0 * zsat))); - Gvsatinv = 1.0 / Gvsat; - // Drain-source current - Ids = BET_i * (FdL * qim1 * dps * Gvsatinv); - - // 4.2.10 Variables for calculation of intrinsic charges and gate current - Voxm = xgm * phit1; - temp = Gmob_dL * Gvsatinv; - alpha1 = alpha * (1.0 + 0.5 * (zsat * temp * temp)); - H = temp * qim1 / alpha1; - - // 4.2.11 Impact-Ionization - if (SWIMPACT != 0) begin - delVsat = Vds - A3_i * dps; - if (delVsat > 0) begin - temp2 = A2_i * ((1.0 + A4_i * (sqrt(phib + Vsbstar) - sqrt_phib)) / (delVsat + 1e-30)); - `expl(-temp2, temp) - mavl = A1_i * (delVsat * temp); - Iimpact = Ids * mavl; - end - end - end // (xg > 0) - - // 4.2.12 Surface potential in gate overlap regions - if (((SWIGATE != 0) && ((IGOV_i > 0) || (IGOVD_i > 0))) || ((SWGIDL != 0) && ((AGIDL_i > 0) || (AGIDLD_i > 0))) || (CGOV_i > 0) || (CGOVD_i > 0)) begin - `ChangeToSource - `sp_ov(xs_ov, xgs_ov) - `ChangeToDrain - `sp_ov(xd_ov, xgd_ov) - Vovs = -phit * (xgs_ov + xs_ov); - Vovd = -phit * (xgd_ov + xd_ov); - end - - // 4.2.13 Gate current - Igsov = 0.0; - Igdov = 0.0; - Igc = 0.0; - Igb = 0.0; - Igcs = 0.0; - Igcd = 0.0; - if (SWIGATE != 0) begin - if (IGOV_i > 0) begin - - // Gate-source overlap component of gate current - arg2mina = Vovs + Dov; - psi_t = `MINA(0.0, arg2mina, 0.01); - zg = sqrt(Vovs * Vovs + 1.0e-6) * inv_CHIB; - if (GC3_i < 0) begin - zg = `MINA(zg, GCQ, 1.0e-6); - end - arg1 = (3.0 + xs_ov + psi_t * inv_phit); - `expl(arg1, Dsi) - arg1 = -VgsPrime * inv_phit; - `expl(arg1, temp) - Dgate = Dsi * temp; - temp = BOV * (-1.5 + zg * (GC2_i + GC3_i * zg)); - if (temp > 0) begin - TP = `P3(temp); - end else begin - `expl_low(temp, TP) - end - Igsov = IGOV_i * (TP * ln((1.0 + Dsi) / (1.0 + Dgate))); - end - - if (IGOVD_i > 0) begin - - // Gate-drain overlap component of gate current - arg2mina = Vovd + Dov; - psi_t = `MINA(0.0, arg2mina, 0.01); - zg = sqrt(Vovd * Vovd + 1.0e-6) * inv_CHIB; - if (GC3_i < 0) begin - zg = `MINA(zg, GCQ, 1.0e-6); - end - arg1 = (3.0 + xd_ov + psi_t * inv_phit); - `expl(arg1, Dsi) - arg1 = -VgdPrime * inv_phit; - `expl(arg1, temp) - Dgate = Dsi * temp; - temp = BOV_d * (-1.5 + zg * (GC2_i + GC3_i * zg)); - if (temp > 0) begin - TP = `P3(temp); - end else begin - `expl_low(temp, TP) - end - Igdov = IGOVD_i * (TP * ln((1.0 + Dsi) / (1.0 + Dgate))); - end - - // Gate-channel component of gate current - if (IGINV_i > 0) begin - if (xg <= 0.0) begin - temp = pow(Vds / Vdsat_lim, AX_i); - Udse = Vds * pow(1.0 + temp, -inv_AX) * inv_phit1; - end - `expl_low(x_ds-Udse, temp) - Vm = Vsbstar + phit1 * (0.5 * x_ds - ln(0.5 * (1.0 + temp))); - - arg2mina = Voxm + Dch; - psi_t = `MINA(0.0, arg2mina, 0.01); - zg = sqrt(Voxm * Voxm + 1.0e-6) * inv_CHIB; - if (GC3_i < 0) begin - zg = `MINA(zg, GCQ, 1.0e-06); - end - arg1 = (x_m + (psi_t - alpha_b - Vm) * inv_phit1); - `expl(arg1,Dsi) - arg1 = -(Vgs + Vsbstar - Vm) * inv_phit1; - `expl(arg1,temp) - Dgate = Dsi * temp; - temp = BCH * (-1.5 + zg * (GC2_i + GC3_i * zg)); - if (temp > 0) begin - TP = `P3(temp); - end else begin - `expl_low(temp, TP) - end - Igc0 = IGINV_i * (TP * ln((1.0 + Dsi) / (1.0 + Dgate))); - - // Source/drain partitioning of gate-channel current - if ((xg <= 0) || ((GC2_i == 0) && (GC3_i == 0))) begin - igc = 1.0; - igcd_h = 0.5; - end else begin - temp = GC2_i + 2.0 * GC3_i * zg; - u0 = CHIB_i / (temp * BCH); - x = 0.5 * (dps / u0); - u0_div_H = u0 / H; - Bg = u0_div_H * (1.0 - u0_div_H) * 0.5; - Ag = 0.5 - 3.0 * Bg; - if (x < 1.0e-3) begin - xsq = x * x; - igc = 1.0 + xsq * (`oneSixth + u0_div_H * `oneThird + `oneSixth * (xsq * (0.05 + 0.2 * u0_div_H))); - igcd_h = 0.5 * igc - `oneSixth * (x * (1.0 + xsq * (0.4 * (Bg + 0.25) + 0.0285714285714 * (xsq * (0.125 + Bg))))); - end else begin - inv_x = 1.0 / x; - `expl(x, ex) - inv_ex = 1.0 / ex; - temp = ex - inv_ex; - temp2 = ex + inv_ex; - igc = 0.5 * ((1.0 - u0_div_H) * temp * inv_x + u0_div_H * temp2); - igcd_h = 0.5 * (igc - temp * (Bg - Ag * inv_x * inv_x) - Ag * temp2 * inv_x); - end - end - Sg = 0.5 * (1.0 + xg / sqrt(xg * xg + 1.0e-6)); - Igc = Igc0 * igc * Sg; - Igcd = Igc0 * igcd_h * Sg; - Igcs = Igc - Igcd; - Igb = Igc0 * igc * (1.0 - Sg); - end // (IGINV >0) - end // (SWIGATE != 0) - - // 4.2.14 GIDL/GISL current - Igidl = 0.0; - Igisl = 0.0; - if (SWGIDL != 0) begin - - // GIDL current computation - if ((AGIDLD_i > 0) && (Vovd < 0)) begin - Vtovd = sqrt(Vovd * Vovd + CGIDLD_i * CGIDLD_i * (VdbPrime * VdbPrime) + 1.0e-6); - temp = -BGIDLDs / Vtovd; - `expl_low(temp, temp2) - Igidl = -AGIDLDs * (VdbPrime * Vovd * Vtovd * temp2); - end - - // GISL current computation - if ((AGIDL_i > 0) && (Vovs < 0)) begin - Vtovs = sqrt(Vovs * Vovs + CGIDL_i * CGIDL_i * (VsbPrime * VsbPrime) + 1.0e-6); - temp = -BGIDLs / Vtovs; - `expl_low(temp, temp2) - Igisl = -AGIDLs * (VsbPrime * Vovs * Vtovs * temp2); - end - end // (SWGIDL != 0) - - P_D = 1 + 0.25 * (Gf * kp); - facvsb0 = phib + 2 * phit1; - facvsb = Vsbstar + facvsb0; - vts_i = VFB_i + P_D * facvsb - Vsbstar + Gf * sqrt(phit1 * facvsb ); - vth_i = vts_i - delVg; - end // evaluateStatic - - - ///////////////////////////////////////////////////////////////////////////// - // - // AC bias dependent quantities (calculations for charge contribs) - // - ///////////////////////////////////////////////////////////////////////////// - - - - begin : evaluateDynamic - - // 4.2.16 Quantum mechanical corrections - Vgb = Vgs + Vsb; - COX_qm = COX_i; - if (qq > 0.0) begin - COX_qm = COX_i / (1.0 + qq * pow(qeff * qeff + qlim2, -1.0 * `oneSixth)); - end - - // 4.2.17 Intrinsic charge model - if (xg <= 0.0) begin - QG = Voxm; - QI = 0.0; - QD = 0.0; - QB = QG; - end else begin - Fj = 0.5 * (dps / H); - Fj2 = Fj * Fj; - QCLM = (1.0 - GdL) * (qim - 0.5 * (alpha * dps)); - QG = Voxm + 0.5 * (eta_p * dps * (Fj * GdL * `oneThird - 1.0 + GdL)); - temp = alpha * dps * `oneSixth; - QI = GdL * (qim + temp * Fj) + QCLM; - QD = 0.5 * (GdL * GdL * (qim - temp * (1.0 - Fj - 0.2 * Fj2)) + QCLM * (1.0 + GdL)); - QB = QG - QI; - end - Qg = QG * COX_qm; - Qd = -QD * COX_qm; - Qb = -QB * COX_qm; - - // 4.2.18 Extrinsic charge model - Qgs_ov = CGOV_i * Vovs; - Qgd_ov = CGOVD_i * Vovd; - Qgb_ov = CGBOV_i * Vgb; - - // Outer fringe charge - Qfgs = CFR_i * VgsPrime; - Qfgd = CFRD_i * VgdPrime; - -`ifdef NQSmodel - // Variables for NQS model - Gp = 0.0; - Gp2 = 0.0; - a_factrp = 0.0; - marginp = 0.0; - if (SWNQS_i != 0) begin - if (xg <= 0.0) begin - ym = 0.5; - pd = 1.0; - Gp = Gf; - end else begin - ym = 0.5 * ( 1.0 + 0.25 * (dps / H)); - pd = xgm / (xg - x_m); - Gp = Gf / pd; - end - Gp2 = Gp * Gp; - a_factrp = 1.0 + Gp * `invSqrt2; - marginp = 1e-5 * a_factrp; - end -`endif // NQSmodel - - end // evaluateDynamic - - - ///////////////////////////////////////////////////////////////////////////// - // - // JUNCAP2 contribs - // - ///////////////////////////////////////////////////////////////////////////// - - - ijun_s = 0.0; - ijunbot_s = 0.0; - ijunsti_s = 0.0; - ijungat_s = 0.0; - - ijun_d = 0.0; - ijunbot_d = 0.0; - ijunsti_d = 0.0; - ijungat_d = 0.0; - - qjun_s = 0.0; - qjunbot_s = 0.0; - qjunsti_s = 0.0; - qjungat_s = 0.0; - - qjun_d = 0.0; - qjunbot_d = 0.0; - qjunsti_d = 0.0; - qjungat_d = 0.0; - - begin : evaluateStaticDynamic - - if (SWJUNCAP > 0.0) begin - if (SWJUNEXP_i == 1.0) begin - `JuncapExpressCurrent(Vjun_s, MFOR1_s, ISATFOR1_s, MFOR2_s, ISATFOR2_s, MREV_s, ISATREV_s, m0flag_s, xhighf1_s, expxhf1_s, xhighf2_s, expxhf2_s, xhighr_s, expxhr_s, ijun_s) - `JuncapExpressCurrent(Vjun_d, MFOR1_d, ISATFOR1_d, MFOR2_d, ISATFOR2_d, MREV_d, ISATREV_d, m0flag_d, xhighf1_d, expxhf1_d, xhighf2_d, expxhf2_d, xhighr_d, expxhr_d, ijun_d) - begin : evaluateDynamic -// real tmpv, vjv; - `JuncapExpressCharge(Vjun_s, ABSOURCE_i, LSSOURCE_i, LGSOURCE_i, qprefbot, qprefsti, qprefgat, qpref2bot, qpref2sti, qpref2gat, vbiinvbot, vbiinvsti, vbiinvgat, one_minus_PBOT, one_minus_PSTI, one_minus_PGAT, vfmin_s, vch_s, zflagbot_s, zflagsti_s, zflaggat_s, qjunbot_s, qjunsti_s, qjungat_s) - `JuncapExpressCharge(Vjun_d, ABDRAIN_i, LSDRAIN_i, LGDRAIN_i, qprefbot_d, qprefsti_d, qprefgat_d, qpref2bot_d, qpref2sti_d, qpref2gat_d, vbiinvbot_d, vbiinvsti_d, vbiinvgat_d, one_minus_PBOT_d, one_minus_PSTI_d, one_minus_PGAT_d, vfmin_d, vch_d, zflagbot_d, zflagsti_d, zflaggat_d, qjunbot_d, qjunsti_d, qjungat_d) - end - end else begin - `juncapcommon(Vjun_s, ABSOURCE_i, LSSOURCE_i, LGSOURCE_i, qprefbot, qpref2bot, vbiinvbot, one_minus_PBOT, idsatbot, CSRHBOT_i, CTATBOT_i, vbibot, wdepnulrbot, VBIRBOTinv, PBOT_i, ftdbot, btatpartbot, atatbot, one_over_one_minus_PBOT, CBBTBOT_i, VBIRBOT_i, wdepnulrinvbot, fbbtbot, VBRBOT_i, VBRinvbot, PBRBOT_i, fstopbot, slopebot, qprefsti, qpref2sti, vbiinvsti, one_minus_PSTI, idsatsti, CSRHSTI_i, CTATSTI_i, vbisti, wdepnulrsti, VBIRSTIinv, PSTI_i, ftdsti, btatpartsti, atatsti, one_over_one_minus_PSTI, CBBTSTI_i, VBIRSTI_i, wdepnulrinvsti, fbbtsti, VBRSTI_i, VBRinvsti, PBRSTI_i, fstopsti, slopesti, qprefgat, qpref2gat, vbiinvgat, one_minus_PGAT, idsatgat, CSRHGAT_i, CTATGAT_i, vbigat, wdepnulrgat, VBIRGATinv, PGAT_i, ftdgat, btatpartgat, atatgat, one_over_one_minus_PGAT, CBBTGAT_i, VBIRGAT_i, wdepnulrinvgat, fbbtgat, VBRGAT_i, VBRinvgat, PBRGAT_i, fstopgat, slopegat, VMAX_s, exp_VMAX_over_phitd_s, vbimin_s, vch_s, vfmin_s, vbbtlim_s, ijunbot_s, qjunbot_s, ijunsti_s, qjunsti_s, ijungat_s, qjungat_s) - ijun_s = ABSOURCE_i * ijunbot_s + LSSOURCE_i * ijunsti_s + LGSOURCE_i * ijungat_s; - `juncapcommon(Vjun_d, ABDRAIN_i, LSDRAIN_i, LGDRAIN_i, qprefbot_d, qpref2bot_d, vbiinvbot_d, one_minus_PBOT_d, idsatbot_d, CSRHBOTD_i, CTATBOTD_i, vbibot_d, wdepnulrbot_d, VBIRBOTinv_d, PBOTD_i, ftdbot_d, btatpartbot_d, atatbot_d, one_over_one_minus_PBOT_d, CBBTBOTD_i, VBIRBOTD_i, wdepnulrinvbot_d, fbbtbot_d, VBRBOTD_i, VBRinvbot_d, PBRBOTD_i, fstopbot_d, slopebot_d, qprefsti_d, qpref2sti_d, vbiinvsti_d, one_minus_PSTI_d, idsatsti_d, CSRHSTID_i, CTATSTID_i, vbisti_d, wdepnulrsti_d, VBIRSTIinv_d, PSTID_i, ftdsti_d, btatpartsti_d, atatsti_d, one_over_one_minus_PSTI_d, CBBTSTID_i, VBIRSTID_i, wdepnulrinvsti_d, fbbtsti_d, VBRSTID_i, VBRinvsti_d, PBRSTID_i, fstopsti_d, slopesti_d, qprefgat_d, qpref2gat_d, vbiinvgat_d, one_minus_PGAT_d, idsatgat_d, CSRHGATD_i, CTATGATD_i, vbigat_d, wdepnulrgat_d, VBIRGATinv_d, PGATD_i, ftdgat_d, btatpartgat_d, atatgat_d, one_over_one_minus_PGAT_d, CBBTGATD_i, VBIRGATD_i, wdepnulrinvgat_d, fbbtgat_d, VBRGATD_i, VBRinvgat_d, PBRGATD_i, fstopgat_d, slopegat_d, VMAX_d, exp_VMAX_over_phitd_d, vbimin_d, vch_d, vfmin_d, vbbtlim_d, ijunbot_d, qjunbot_d, ijunsti_d, qjunsti_d, ijungat_d, qjungat_d) - ijun_d = ABDRAIN_i * ijunbot_d + LSDRAIN_i * ijunsti_d + LGDRAIN_i * ijungat_d; - end - end - -`ifdef NQSmodel - // Set initial conditions for NQS model - `include "PSP102_InitNQS.include" - -`endif // NQSmodel - // Parasitic resistances (including noise) - rgatenoise = nt0 * ggate; - rbulknoise = nt0 * gbulk; - rjunsnoise = nt0 * gjuns; - rjundnoise = nt0 * gjund; - rwellnoise = nt0 * gwell; - end // evaluateStaticDynamic - - - ///////////////////////////////////////////////////////////////////////////// - // - // Current contribs - // - ///////////////////////////////////////////////////////////////////////////// - - begin : loadStatic - - // 4.2.15 Total terminal currents - - // Convert back for NMOS-PMOS and Source-Drain interchange - if (sigVds > 0) begin - I(D, BP) <+ CHNL_TYPE * MULT_i * Iimpact; - I(D, S) <+ CHNL_TYPE * MULT_i * Ids; - I(GP, S) <+ CHNL_TYPE * MULT_i * Igcs; - I(GP, D) <+ CHNL_TYPE * MULT_i * Igcd; - end else begin - I(S, BP) <+ CHNL_TYPE * MULT_i * Iimpact; - I(S, D) <+ CHNL_TYPE * MULT_i * Ids; - I(GP, D) <+ CHNL_TYPE * MULT_i * Igcs; - I(GP, S) <+ CHNL_TYPE * MULT_i * Igcd; - end - I(GP, BP) <+ CHNL_TYPE * MULT_i * Igb; - I(GP, S) <+ CHNL_TYPE * MULT_i * Igsov; - I(GP, D) <+ CHNL_TYPE * MULT_i * Igdov; - I(S, BP) <+ CHNL_TYPE * MULT_i * Igisl; - I(D, BP) <+ CHNL_TYPE * MULT_i * Igidl; - I(BS, S) <+ CHNL_TYPE * MULT_i * ijun_s; - I(BD, D) <+ CHNL_TYPE * MULT_i * ijun_d; - - `NonCollapsableR(ggate, RG_i, rgatenoise, G, GP) - `NonCollapsableR(gbulk, RBULK_i, rbulknoise, BP, BI) - `NonCollapsableR(gjuns, RJUNS_i, rjunsnoise, BS, BI) - `NonCollapsableR(gjund, RJUND_i, rjundnoise, BD, BI) - `NonCollapsableR(gwell, RWELL_i, rwellnoise, B, BI) - - I(D, S) <+ `GMIN * V(D, S); - - end // loadStatic - - ///////////////////////////////////////////////////////////////////////////// - // - // ddt() contribs from charges (Note: MULT is handled explicitly) - // - ///////////////////////////////////////////////////////////////////////////// - -`ifdef NQSmodel - begin : loadStaticDynamic - // Calculate NQS charge contributions - `include "PSP102_ChargesNQS.include" - end -`endif // NQSmodel - - begin : loadDynamic - - // 4.2.19 Total terminal charges - - // Intrinsic MOSFET charges - Qs = -(Qg + Qb + Qd); - - // Total outerFringe + overlap for - // gate-source and gate-drain. - Qfgs = Qfgs + Qgs_ov; - Qfgd = Qfgd + Qgd_ov; - - // JUNCAP2 - qjun_s = ABSOURCE_i * qjunbot_s + LSSOURCE_i * qjunsti_s + LGSOURCE_i * qjungat_s; - qjun_d = ABDRAIN_i * qjunbot_d + LSDRAIN_i * qjunsti_d + LGDRAIN_i * qjungat_d; - - // Convert back (undo S-D interchange) - if (sigVds < 0) begin - temp = Qd; // Qd <--> Qs - Qd = Qs; - Qs = temp; - end - - I(GP, S) <+ ddt(CHNL_TYPE * MULT_i * Qg); - I(BP, S) <+ ddt(CHNL_TYPE * MULT_i * Qb); - I(D, S) <+ ddt(CHNL_TYPE * MULT_i * Qd); - I(GP, S) <+ ddt(CHNL_TYPE * MULT_i * Qfgs); - I(GP, D) <+ ddt(CHNL_TYPE * MULT_i * Qfgd); - I(GP, BP) <+ ddt(CHNL_TYPE * MULT_i * Qgb_ov); - I(BS, S) <+ ddt(CHNL_TYPE * MULT_i * qjun_s); - I(BD, D) <+ ddt(CHNL_TYPE * MULT_i * qjun_d); - - end // loadDynamic - - - ///////////////////////////////////////////////////////////////////////////// - // - // Noise - // - ///////////////////////////////////////////////////////////////////////////// - - begin : noise -// real sf; - - // 4.2.20 Noise variable calculation - Sfl = 0.0; - mid = 0.0; - mig = 0.0; - migid = 0.0; - c_igid = 0.0; - CGeff = COX_qm * eta_p; - sqid = 0.0; - sqig = 0.0; - if ((xg > 0.0) && (MULT_i > 0.0) && (BET_i > 0.0)) begin - N1 = Cox_over_q * alpha * phit; - Nm1 = Cox_over_q * qim1; - Delta_N1 = Cox_over_q * (alpha * dps); - Sfl = (NFA_i - NFB_i * N1 + NFC_i * (N1 * N1)) * ln((Nm1 + 0.5 * Delta_N1) / (Nm1 - 0.5 * Delta_N1)); - Sfl = Sfl + (NFB_i + NFC_i * (Nm1 - 2.0 * N1)) * Delta_N1; - Sfl = Sfl_prefac * Ids * Gvsatinv * Sfl / N1; - Sfl = `CLIP_LOW(Sfl, 0.0); - - H0 = qim1 / alpha; - t1 = qim / qim1; - sqt2 = 0.5 * `oneSixth * (dps / H0); - t2 = sqt2 * sqt2; - r = H0 / H - 1.0; - lc = `CLIP_LOW(1.0 - 12 * (r * t2), 1e-20); - lcinv2 = 1 / (lc * lc); - g_ideal = BET_i * (FdL * qim1 * Gvsatinv); - CGeff = Gvsat * Gvsat * COX_qm * eta_p / (Gmob_dL * Gmob_dL); - mid = t1 + 12 * t2 - 24 * ((1.0 + t1) * t2 * r); - mid = `CLIP_LOW(mid, 1e-40); - mid = g_ideal * lcinv2 * mid; - mig = t1 / 12.0 - t2 * (t1 + 0.2 - 12 * t2) - 1.6 * (t2 * (t1 + 1.0 - 12 * t2) * r); - mig = `CLIP_LOW(mig, 1e-40); - mig = lcinv2 / g_ideal * mig; - migid = lcinv2 * sqt2 * (1.0 - 12 * t2 - (t1 + 19.2 * t2 - 12 * (t1 * t2)) * r); - - // excess noise calculation - if (FNTEXC_i > 0) begin - // recalculate Gvsat, excluding Gmob-effect - temp2_exc = qim * xitsb; - wsat_exc = 100.0 * (temp2_exc / (100.0 + temp2_exc)); - if (THESATG_i < 0) begin - temp_exc = 1 / (1 - THESATG_i * wsat_exc); - end else begin - temp_exc = 1 + THESATG_i * wsat_exc; - end - thesat1_exc= THESAT_i * (temp_exc / Gmob); - zsat_exc = thesat1_exc * thesat1_exc * dps * dps; - if (CHNL_TYPE == `PMOS) begin - zsat_exc = zsat_exc / (1.0 + thesat1_exc * dps); - end - Gvsat_exc = 0.5 * (Gmob * (1.0 + sqrt(1.0 + 2.0 * zsat_exc))); - - gfac = Gmob / (Gvsat_exc * lc); - Sidexc = fac_exc * Ids * Vdse * gfac * gfac; - - // add excess noise to conventional thermal noise - mid = mid + Sidexc / nt0; - mig = mig + Sidexc * (1 + 12 * t2) / (12 * g_ideal * g_ideal * nt0); - migid = migid - Sidexc * sqt2 * (1 + r) / (g_ideal * nt0); - end - sqid = sqrt(nt * mid); - sqig = sqrt(nt / mig); - if (sqid == 0) begin - c_igid = 0.0; - end else begin - c_igid = migid * sqig / sqid; // = migid / sqrt(mig * mid); - end - c_igid = `CLIP_BOTH(c_igid, 0.0, 1.0); - end - shot_igcsx = 2.0 * `QELE * abs(Igcs); - shot_igcdx = 2.0 * `QELE * abs(Igcd); - shot_igsov = 2.0 * `QELE * abs(Igsov); - shot_igdov = 2.0 * `QELE * abs(Igdov); - shot_iavl = 2.0 * `QELE * ((mavl + 1) * abs(Iimpact)); - // JUNCAP2 - jnoisex_s = 2.0 * `QELE * abs(ijun_s); - jnoisex_d = 2.0 * `QELE * abs(ijun_d); - if (sigVds > 0) begin - shot_igs = shot_igcsx + shot_igsov; - shot_igd = shot_igcdx + shot_igdov; - jnoise_s = jnoisex_s; - jnoise_d = jnoisex_d + shot_iavl; - end else begin - shot_igs = shot_igcdx + shot_igsov; - shot_igd = shot_igcsx + shot_igdov; - jnoise_s = jnoisex_s + shot_iavl; - jnoise_d = jnoisex_d; - end - - sf = 1e6 * CGeff * mig; // scale-factor to keep noise at NOI2 at reasonable level - - // Important note: - // In Verilog-A, correlated noise sources can only be implemented by using two additional - // internal nodes (NOI and NOI2). When implementing PSP in a circuit simlutor, it is - // generally not necessary to retain these internal nodes and therefore (for execution - // speed reasons) should be avoided. - - // Noise contribs - I(NOI2) <+ V(NOI2); - I(NOI2) <+ white_noise(sqig * sqig * sf * sf, "igig"); - I(NOII) <+ -V(NOI2) / sf; - I(NOIR) <+ V(NOIR) / mig; - I(NOIC) <+ ddt(CGeff * V(NOIC)); - I(D,S) <+ flicker_noise(MULT_i * Sfl, EF_i, "flicker"); - I(D,S) <+ white_noise(MULT_i * sqid * sqid * (1.0 - c_igid * c_igid), "idid"); -// I(D,S) <+ sigVds * sqrt(MULT_i) * migid * V(NOI2) / sf; -// I(GP,S) <+ ddt(sqrt(MULT_i) * 0.5 * CGeff * V(NOIC)); -// I(GP,D) <+ ddt(sqrt(MULT_i) * 0.5 * CGeff * V(NOIC)); - I(GP,S) <+ white_noise(MULT_i * shot_igs, "igs"); - I(GP,D) <+ white_noise(MULT_i * shot_igd, "igd"); - // JUNCAP2 - I(BS,S) <+ white_noise(MULT_i * jnoise_s, "ibs"); - I(BD,D) <+ white_noise(MULT_i * jnoise_d, "ibd"); - end // noise - - - ///////////////////////////////////////////////////////////////////////////// - // - // Operating point info - // - ///////////////////////////////////////////////////////////////////////////// - - begin : OPinfo -// real temp; - - // Auxiliary variables - id_op = Ids + Iimpact - Igcd; - is = -Ids - Igcs; - ig = Igcs + Igcd + Igsov + Igdov + Igb; - ib = -Iimpact - Igb - Igidl - Igisl; - - sig1k = 2 * `PI * 1000 * CGeff; - sig1k = sig1k * sig1k * mig; - - - //////////////////////////////////////////////////////////////////////////////////// - // - // Actual operation point output variables - // - //////////////////////////////////////////////////////////////////////////////////// - - // Note: In this section (and ONLY in this section) `drain' always refers to - // the highest-potential end of the channel. Therefore, care has to be - // taken for derivatives w.r.t. terminal voltages when sigVds == -1. - - sdint = sigVds; - - ctype = CHNL_TYPE; - - if (sigVds < 0) begin - // All variables in the actual model refering to junctions are - // not subject to SD-interchange. In the OP-output variables, - // SD-interchange is also done for the junctions, so that's - // what is happening here. Similar precautions have to be taken - // for those variables that are derivatives w.r.t. voltage branches - ise = MULT_i * (is - Igdov + Igidl - ijun_d); - ige = MULT_i * ig; - ide = MULT_i * (id_op - Igsov + Igisl - ijun_s); - ibe = MULT_i * (ib + ijun_s + ijun_d); - ids = MULT_i * Ids; - idb = MULT_i * (Iimpact + Igisl - ijun_s); - isb = MULT_i * (Igidl - ijun_d); - igs = MULT_i * (Igcs + Igdov); - igd = MULT_i * (Igcd + Igsov); - igb = MULT_i * Igb; - igcs = MULT_i * Igcs; - igcd = MULT_i * Igcd; - iavl = MULT_i * Iimpact; - igisl = MULT_i * Igidl; - igidl = MULT_i * Igisl; - if (SWJUNEXP_i == 1) begin - ijsbot = 0.0; - ijsgat = 0.0; - ijssti = 0.0; - ijdbot = 0.0; - ijdgat = 0.0; - ijdsti = 0.0; - idsatsbot = 0.0; - idsatssti = 0.0; - idsatsgat = 0.0; - idsatsbotd = 0.0; - idsatsstid = 0.0; - idsatsgatd = 0.0; - end else begin - ijsbot = MULT_i * ABDRAIN_i * ijunbot_d; - ijsgat = MULT_i * LGDRAIN_i * ijungat_d; - ijssti = MULT_i * LSDRAIN_i * ijunsti_d; - ijdbot = MULT_i * ABSOURCE_i * ijunbot_s; - ijdgat = MULT_i * LGSOURCE_i * ijungat_s; - ijdsti = MULT_i * LSSOURCE_i * ijunsti_s; - idsatsbot = MULT_i * ABSOURCE_i * idsatbot; - idsatssti = MULT_i * LSSOURCE_i * idsatsti; - idsatsgat = MULT_i * LGSOURCE_i * idsatgat; - idsatsbotd = MULT_i * ABDRAIN_i * idsatbot_d; - idsatsstid = MULT_i * LSDRAIN_i * idsatsti_d; - idsatsgatd = MULT_i * LGDRAIN_i * idsatgat_d; - end - ijs = MULT_i * ijun_d; - ijd = MULT_i * ijun_s; - - vds = Vds; - vgs = Vgs; - vsb = Vsb; - vto = VFB_i + P_D * facvsb0 + Gf * sqrt(phit1 * facvsb0); - vts = vts_i; - vth = vth_i; - vgt = vgs - vth; - vdss = Vdsat; - vsat = Vds - vdss; - - temp = Ids + Iimpact + Igisl - Igcd - Igsov - ijun_s; // Total drain-current -`ifdef OPderiv - gm = CHNL_TYPE * MULT_i * ddx(temp, V(GP)); - gmb = CHNL_TYPE * MULT_i * ddx(temp, V(BP)); - gds = CHNL_TYPE * MULT_i * ddx(temp, V(S)); - - gjs = MULT_i * ddx(ijun_d, V(BD)); - gjd = MULT_i * ddx(ijun_s, V(BS)); - - css = CHNL_TYPE * MULT_i * ddx(Qd, V(D)); - csg = -CHNL_TYPE * MULT_i * ddx(Qd, V(GP)); - csb = -CHNL_TYPE * MULT_i * ddx(Qd, V(BP)); - csd = css - csg - csb; - cgs = -CHNL_TYPE * MULT_i * ddx(Qg, V(D)); - cgg = CHNL_TYPE * MULT_i * ddx(Qg, V(GP)); - cgb = -CHNL_TYPE * MULT_i * ddx(Qg, V(BP)); - cgd = cgg - cgs - cgb; - cds = -CHNL_TYPE * MULT_i * ddx(Qs, V(D)); - cdg = -CHNL_TYPE * MULT_i * ddx(Qs, V(GP)); - cdb = -CHNL_TYPE * MULT_i * ddx(Qs, V(BP)); - cdd = cdg + cds + cdb; - cbs = -CHNL_TYPE * MULT_i * ddx(Qb, V(D)); - cbg = -CHNL_TYPE * MULT_i * ddx(Qb, V(GP)); - cbb = CHNL_TYPE * MULT_i * ddx(Qb, V(BP)); - cbd = cbb - cbs - cbg; - cgsol = CHNL_TYPE * MULT_i * ddx(Qfgd, V(GP)); - cgdol = CHNL_TYPE * MULT_i * ddx(Qfgs, V(GP)); - - cjsbot = -MULT_i * CHNL_TYPE * ABDRAIN_i * ddx(qjunbot_d, V(D)); - cjsgat = -MULT_i * CHNL_TYPE * LGDRAIN_i * ddx(qjungat_d, V(D)); - cjssti = -MULT_i * CHNL_TYPE * LSDRAIN_i * ddx(qjunsti_d, V(D)); - cjs = cjsbot + cjsgat + cjssti; - cjdbot = -MULT_i * CHNL_TYPE * ABSOURCE_i * ddx(qjunbot_s, V(S)); - cjdgat = -MULT_i * CHNL_TYPE * LGSOURCE_i * ddx(qjungat_s, V(S)); - cjdsti = -MULT_i * CHNL_TYPE * LSSOURCE_i * ddx(qjunsti_s, V(S)); - cjd = cjdbot + cjdgat + cjdsti; -`endif // OPderiv - end else begin - ise = MULT_i * (is - Igsov + Igisl - ijun_s); - ige = MULT_i * ig; - ide = MULT_i * (id_op - Igdov + Igidl - ijun_d); - ibe = MULT_i * (ib + ijun_s + ijun_d); - ids = MULT_i * Ids; - idb = MULT_i * (Iimpact + Igidl - ijun_d); - isb = MULT_i * (Igisl - ijun_s); - igs = MULT_i * (Igcs + Igsov); - igd = MULT_i * (Igcd + Igdov); - igb = MULT_i * Igb; - igcs = MULT_i * Igcs; - igcd = MULT_i * Igcd; - iavl = MULT_i * Iimpact; - igisl = MULT_i * Igisl; - igidl = MULT_i * Igidl; - if (SWJUNEXP_i == 1) begin - ijsbot = 0.0; - ijsgat = 0.0; - ijssti = 0.0; - ijdbot = 0.0; - ijdgat = 0.0; - ijdsti = 0.0; - idsatsbot = 0.0; - idsatssti = 0.0; - idsatsgat = 0.0; - idsatsbotd = 0.0; - idsatsstid = 0.0; - idsatsgatd = 0.0; - end else begin - ijsbot = MULT_i * ABSOURCE_i * ijunbot_s; - ijsgat = MULT_i * LGSOURCE_i * ijungat_s; - ijssti = MULT_i * LSSOURCE_i * ijunsti_s; - ijdbot = MULT_i * ABDRAIN_i * ijunbot_d; - ijdgat = MULT_i * LGDRAIN_i * ijungat_d; - ijdsti = MULT_i * LSDRAIN_i * ijunsti_d; - idsatsbot = MULT_i * ABSOURCE_i * idsatbot; - idsatssti = MULT_i * LSSOURCE_i * idsatsti; - idsatsgat = MULT_i * LGSOURCE_i * idsatgat; - idsatsbotd = MULT_i * ABDRAIN_i * idsatbot_d; - idsatsstid = MULT_i * LSDRAIN_i * idsatsti_d; - idsatsgatd = MULT_i * LGDRAIN_i * idsatgat_d; - end - ijs = MULT_i * ijun_s; - ijd = MULT_i * ijun_d; - - vds = Vds; - vgs = Vgs; - vsb = Vsb; - vto = VFB_i + P_D * facvsb0 + Gf * sqrt(phit1 * facvsb0); - vts = vts_i; - vth = vth_i; - vgt = vgs - vth; - vdss = Vdsat; - vsat = Vds - vdss; - - temp = Ids + Iimpact + Igidl - Igcd - Igdov - ijun_d; -`ifdef OPderiv - gm = CHNL_TYPE * MULT_i * ddx(temp, V(GP)); - gmb = CHNL_TYPE * MULT_i * ddx(temp, V(BP)); - gds = CHNL_TYPE * MULT_i * ddx(temp, V(D)); - - gjs = -MULT_i * ddx(ijun_s, V(S)); - gjd = -MULT_i * ddx(ijun_d, V(D)); - - cdd = CHNL_TYPE * MULT_i * ddx(Qd, V(D)); - cdg = -CHNL_TYPE * MULT_i * ddx(Qd, V(GP)); - cdb = -CHNL_TYPE * MULT_i * ddx(Qd, V(BP)); - cds = cdd - cdg - cdb; - cgd = -CHNL_TYPE * MULT_i * ddx(Qg, V(D)); - cgg = CHNL_TYPE * MULT_i * ddx(Qg, V(GP)); - cgb = -CHNL_TYPE * MULT_i * ddx(Qg, V(BP)); - cgs = cgg - cgd - cgb; - csd = -CHNL_TYPE * MULT_i * ddx(Qs, V(D)); - csg = -CHNL_TYPE * MULT_i * ddx(Qs, V(GP)); - csb = -CHNL_TYPE * MULT_i * ddx(Qs, V(BP)); - css = csg + csd + csb; - cbd = -CHNL_TYPE * MULT_i * ddx(Qb, V(D)); - cbg = -CHNL_TYPE * MULT_i * ddx(Qb, V(GP)); - cbb = CHNL_TYPE * MULT_i * ddx(Qb, V(BP)); - cbs = cbb - cbd - cbg; - cgsol = CHNL_TYPE * MULT_i * ddx(Qfgs, V(GP)); - cgdol = CHNL_TYPE * MULT_i * ddx(Qfgd, V(GP)); - - cjsbot = -MULT_i * CHNL_TYPE * ABSOURCE_i * ddx(qjunbot_s, V(S)); - cjsgat = -MULT_i * CHNL_TYPE * LGSOURCE_i * ddx(qjungat_s, V(S)); - cjssti = -MULT_i * CHNL_TYPE * LSSOURCE_i * ddx(qjunsti_s, V(S)); - cjs = cjsbot + cjsgat + cjssti; - cjdbot = -MULT_i * CHNL_TYPE * ABDRAIN_i * ddx(qjunbot_d, V(D)); - cjdgat = -MULT_i * CHNL_TYPE * LGDRAIN_i * ddx(qjungat_d, V(D)); - cjdsti = -MULT_i * CHNL_TYPE * LSDRAIN_i * ddx(qjunsti_d, V(D)); - cjd = cjdbot + cjdgat + cjdsti; -`endif // OPderiv - end -`ifdef LocalModel - weff = 0; - leff = 0; -`else // LocalModel - weff = WE; - leff = LE; -`endif // LocalModel - -`ifdef OPderiv - if (abs(gds) < 1e-18) begin - u = 0; - rout = 0; - vearly = 0; - end else begin - u = gm / gds; - rout = 1.0 / gds; - vearly = ide / gds; - end - if (abs(vgt) < 1e-12) begin - beff = 0; - end else begin - beff = 2 * abs(ide) / (vgt * vgt); - end - if (abs(cgg + cgsol + cgdol) < 1e-30) begin - fug = 0.0; - end else begin - fug = gm / (2 * `PI * (cgg + cgsol + cgdol)); - end - rg_op = RG_i / MULT_i; - - sfl = MULT_i * Sfl; - if (abs(gm) < 1e-18) begin - sqrtsff = 0; - sqrtsfw = 0; - end else begin - sqrtsff = sqrt(MULT_i * Sfl / 1000.0) / gm; - sqrtsfw = sqrt(MULT_i) * sqid / gm; - end - sid = MULT_i * sqid * sqid; - sig = MULT_i * nt * sig1k / (1 + sig1k * mig); - cigid = c_igid; - if (sid == 0) begin - fknee = 0; - end else begin - fknee = sfl / sid; - end - siavl = MULT_i * shot_iavl; - if (sigVds < 0) begin - sigs = MULT_i * (shot_igcsx + shot_igdov); - sigd = MULT_i * (shot_igcdx + shot_igsov); - ssi = MULT_i * jnoisex_d; - sdi = MULT_i * jnoisex_s; - end else begin - sigs = MULT_i * (shot_igcsx + shot_igsov); - sigd = MULT_i * (shot_igcdx + shot_igdov); - ssi = MULT_i * jnoisex_s; - sdi = MULT_i * jnoisex_d; - end -`endif // OPderiv - - lp_vfb = VFB_i; - lp_stvfb = STVFB_i; - lp_tox = TOX_i; - lp_epsrox = EPSROX_i; - lp_neff = NEFF_i; - lp_vnsub = VNSUB_i; - lp_nslp = NSLP_i; - lp_dnsub = DNSUB_i; - lp_dphib = DPHIB_i; - lp_np = NP_i; - lp_ct = CT_i; - lp_toxov = TOXOV_i; - lp_toxovd = TOXOVD_i; - lp_nov = NOV_i; - lp_novd = NOVD_i; - lp_cf = CF_i; - lp_cfb = CFB_i; - lp_betn = BETN_i; - lp_stbet = STBET_i; - lp_mue = MUE_i; - lp_stmue = STMUE_i; - lp_themu = THEMU_i; - lp_stthemu = STTHEMU_i; - lp_cs = CS_i; - lp_stcs = STCS_i; - lp_xcor = XCOR_i; - lp_stxcor = STXCOR_i; - lp_feta = FETA_i; - lp_rs = RS_i; - lp_strs = STRS_i; - lp_rsb = RSB_i; - lp_rsg = RSG_i; - lp_thesat = THESAT_i; - lp_stthesat = STTHESAT_i; - lp_thesatb = THESATB_i; - lp_thesatg = THESATG_i; - lp_ax = AX_i; - lp_alp = ALP_i; - lp_alp1 = ALP1_i; - lp_alp2 = ALP2_i; - lp_vp = VP_i; - lp_a1 = A1_i; - lp_a2 = A2_i; - lp_sta2 = STA2_i; - lp_a3 = A3_i; - lp_a4 = A4_i; - lp_gco = GCO_i; - lp_iginv = IGINV_i; - lp_igov = IGOV_i; - lp_igovd = IGOVD_i; - lp_stig = STIG_i; - lp_gc2 = GC2_i; - lp_gc3 = GC3_i; - lp_chib = CHIB_i; - lp_agidl = AGIDL_i; - lp_agidld = AGIDLD_i; - lp_bgidl = BGIDL_T; - lp_bgidld = BGIDLD_T; - lp_stbgidl = STBGIDL_i; - lp_stbgidld = STBGIDLD_i; - lp_cgidl = CGIDL_i; - lp_cgidld = CGIDLD_i; - lp_cox = COX_i; - lp_cgov = CGOV_i; - lp_cgovd = CGOVD_i; - lp_cgbov = CGBOV_i; - lp_cfr = CFR_i; - lp_cfrd = CFRD_i; - lp_fnt = FNT_i; - lp_fntexc = FNTEXC_i; - lp_nfa = NFA_i; - lp_nfb = NFB_i; - lp_nfc = NFC_i; - lp_ef = EF_i; - lp_rg = RG_i; - lp_rbulk = RBULK_i; - lp_rwell = RWELL_i; - lp_rjuns = RJUNS_i; - lp_rjund = RJUND_i; - tk = TKD; - cjosbot = MULT_i * ABSOURCE_i * cjobot; - cjossti = MULT_i * LSSOURCE_i * cjosti; - cjosgat = MULT_i * LGSOURCE_i * cjogat; - vbisbot = vbibot; - vbissti = vbisti; - vbisgat = vbigat; - cjosbotd = MULT_i * ABDRAIN_i * cjobot_d; - cjosstid = MULT_i * LSDRAIN_i * cjosti_d; - cjosgatd = MULT_i * LGDRAIN_i * cjogat_d; - vbisbotd = vbibot_d; - vbisstid = vbisti_d; - vbisgatd = vbigat_d; -`ifdef NQSmodel - lp_munqs = MUNQS_i; -`endif // NQSmodel - end // OPinfo - - end // evaluateblock - -end // analogBlock diff --git a/src/spicelib/devices/adms/psp102/admsva/PSP102_nqs_macrodefs.include b/src/spicelib/devices/adms/psp102/admsva/PSP102_nqs_macrodefs.include deleted file mode 100644 index ac83f4e6d..000000000 --- a/src/spicelib/devices/adms/psp102/admsva/PSP102_nqs_macrodefs.include +++ /dev/null @@ -1,121 +0,0 @@ -//====================================================================================== -//====================================================================================== -// Filename: PSP102_nqs_macrodefs.include -//====================================================================================== -//====================================================================================== -// -// (c) Copyright notice -// -// Since 2012 until today, PSP has been co-developed by NXP Semiconductors and -// Delft University of Technology. For this part of the model, each claim undivided -// ownership and copyrights -// Until and including 2011, PSP has been co-developed by NXP Semiconductors and -// Arizona State University. For this part of the model, NXP Semiconductors claims -// undivided ownership and copyrights. -// -// -// Version: 102.5.0, December 2013 -// -//====================================================================================== -//====================================================================================== -// -// Further information can be found in the file releasenotesPSP102.txt -// - -////////////////////////////////////////// -// -// Macros used in PSP-NQS -// -////////////////////////////////////////// - -// Function to calculate bulk charge from surface potential -`define PhiToQb(phi,Qb_tmp) \ - if (abs(phi) <= margin) \ - Qb_tmp = -0.70710678 * phi * Gf * (1.0 - `oneSixth * phi * (1.0 - `oneSixth * phi)); \ - else begin \ - `expl((-phi), temp) \ - Qb_tmp = Gf * sqrt(temp + phi - 1.0); \ - if (phi > margin) \ - Qb_tmp = -Qb_tmp; \ - end - -// Function used in fq-macro -`define PhiTod2Qis(xphi,d2Qis) \ - if (abs(xphi) <= margin) begin \ - Qb_tmp = -0.70710678 * xphi * Gf * (1.0 - `oneSixth * xphi * (1.0 - `oneSixth * xphi)); \ - dQbs = -0.70710678 * Gf * (1.0 - `oneThird * xphi * (1.0 - 0.25 * xphi)); \ - d2Qis = -0.235702 * Gf * (1.0 - 0.5 * xphi); \ - end else begin \ - `expl((-xphi),temp) \ - Qb_tmp = Gf * sqrt(temp + xphi - 1.0); \ - if (xphi > margin) \ - Qb_tmp = -Qb_tmp; \ - dQbs = 0.5 * Gf2 * (1.0 - temp) / Qb_tmp; \ - d2Qis = (dQbs * dQbs - 0.5 * Gf * Gf) / Qb_tmp + dQbs; \ - end - - -// Function used in QiToPhi -`define sps(sp, xg) \ - if (abs(xg) <= marginp) begin \ - sp = xg / a_factrp; \ - end else begin \ - if (xg < -marginp) begin \ - NQS_yg = -xg; \ - NQS_z = 1.25 * NQS_yg / a_factrp; \ - NQS_eta = (NQS_z + 10.0 - sqrt((NQS_z - 6.0) * (NQS_z - 6.0) + 64.0)) * 0.5; \ - NQS_a = (NQS_yg - NQS_eta) * (NQS_yg - NQS_eta) + Gp2 * (NQS_eta + 1.0); \ - NQS_c = 2.0 * (NQS_yg - NQS_eta) - Gp2; \ - NQS_tau = ln(NQS_a / Gp2) - NQS_eta; \ - `sigma(NQS_a, NQS_c, NQS_tau, NQS_eta, NQS_y0) \ - `expl(NQS_y0, NQS_D0) \ - NQS_xi = 1.0 - Gp2 * NQS_D0 * 0.5; \ - NQS_p = 2.0 * (NQS_yg - NQS_y0) + Gp2 * (NQS_D0 - 1.0); \ - NQS_q = (NQS_yg - NQS_y0) * (NQS_yg - NQS_y0) + Gp2 * (NQS_y0 + 1.0 - NQS_D0); \ - NQS_temp = NQS_p * NQS_p - 4.0 * NQS_xi * NQS_q; \ - NQS_w = 2.0 * NQS_q / (NQS_p + sqrt(NQS_temp)); \ - sp = -(NQS_y0 + NQS_w); \ - end else begin \ - NQS_xg1 = 1.0 / ( 1.25 + 7.32464877560822e-01 * Gp); \ - NQS_A_fac = (1.25 * a_factrp * NQS_xg1 - 1.0) * NQS_xg1; \ - NQS_xbar = xg / a_factrp * (1.0 + NQS_A_fac * xg); \ - `expl(-NQS_xbar, NQS_temp) \ - NQS_w = 1.0 - NQS_temp; \ - NQS_x0 = xg + Gp2 * 0.5 - Gp * sqrt(xg + Gp2 * 0.25 - NQS_w); \ - `expl((-NQS_x0), NQS_D0) \ - NQS_xi = 1.0 - Gp2 * 0.5 * NQS_D0; \ - NQS_p = 2.0 * (xg - NQS_x0) + Gp2 * (1.0 - NQS_D0); \ - NQS_q = (xg - NQS_x0) * (xg - NQS_x0) - Gp2 * (NQS_x0 - 1.0 + NQS_D0); \ - NQS_temp = NQS_p * NQS_p - 4.0 * NQS_xi * NQS_q; \ - NQS_u = 2.0 * NQS_q / (NQS_p + sqrt(NQS_temp)); \ - sp = NQS_x0 + NQS_u; \ - end \ - end - - -// Function to calculate surface potential from inversion charge -`define QiToPhi(Qi,xg,xphi) \ - temp = Qi / pd + xg; \ - `sps(xphi,temp) - -// Calculation of fk -`define fq(Qi,xg,dQy,d2Qy,fk) \ - `QiToPhi(Qi, xg, xphi) \ - `PhiTod2Qis(xphi, d2Qis) \ - dQis = pd - dQbs; \ - dQis_1 = 1.0 / dQis; \ - fQi = Qi * dQis_1 - 1.0; \ - dfQi = (1.0 - Qi * d2Qis * dQis_1 * dQis_1) * dQis_1; \ - fk0 = dfQi * dQy * dQy + fQi * d2Qy; \ - dpsy2 = dQy * dQy * dQis_1 * dQis_1; \ - zsat = thesat2 * dpsy2; \ - if (CHNL_TYPE == `PMOS) \ - zsat = zsat / (1.0 + thesat1 * dps); \ - temp = sqrt(1.0 + 2.0 * zsat); \ - Fvsat = 2.0 / (1.0 + temp); \ - temp1 = d2Qy - dpsy2 * d2Qis; \ - fk = Fvsat * (fk0 - zsat * fQi * temp1 * Fvsat / temp); - -// Interpolation of surface potential along channel -`define Phiy(y) \ - x_m + H * (1.0 - sqrt(1.0 - 2.0 * dps / H * ((y) - ym))) * inv_phit1 diff --git a/src/spicelib/devices/adms/psp102/admsva/psp102.va b/src/spicelib/devices/adms/psp102/admsva/psp102.va deleted file mode 100644 index ab4fb88b4..000000000 --- a/src/spicelib/devices/adms/psp102/admsva/psp102.va +++ /dev/null @@ -1,53 +0,0 @@ -//====================================================================================== -//====================================================================================== -// Filename: psp102.va -//====================================================================================== -//====================================================================================== -// -// (c) Copyright notice -// -// Since 2012 until today, PSP has been co-developed by NXP Semiconductors and -// Delft University of Technology. For this part of the model, each claim undivided -// ownership and copyrights -// Until and including 2011, PSP has been co-developed by NXP Semiconductors and -// Arizona State University. For this part of the model, NXP Semiconductors claims -// undivided ownership and copyrights. -// -// -// Version: 102.5.0, December 2013 -// -//====================================================================================== -//====================================================================================== -// -// Further information can be found in the file releasenotesPSP102.txt -// - -`include "discipline.h" - -`include "Common102_macrodefs.include" - -`include "JUNCAP200_macrodefs.include" - -`include "PSP102_macrodefs.include" - -//`define Binning true -//`define LocalModel true -//`define NQSmodel true - -// Note: some verilog-A compilers have problems handling the ddx-operator, -// which occurs in definition of OP-output variables. If the line below is -// commented out, all OP-output variables using the ddx-operator are skipped. -`define OPderiv - -///////////////////////////////////////////////////////////////////////////// -// -// PSP global model code -// -///////////////////////////////////////////////////////////////////////////// - - -module PSP102VA(D, G, S, B); - -`include "PSP102_module.include" - -endmodule diff --git a/src/spicelib/devices/adms/psp102/admsva/releasenotesPSP102.txt b/src/spicelib/devices/adms/psp102/admsva/releasenotesPSP102.txt deleted file mode 100644 index e2dbbc93a..000000000 --- a/src/spicelib/devices/adms/psp102/admsva/releasenotesPSP102.txt +++ /dev/null @@ -1,102 +0,0 @@ -====================================================================================== -====================================================================================== - - --------------------------- - Verilog-A definition of PSP - --------------------------- - - - (c) Copyright notice - - Since 2012 until today, PSP has been co-developed by NXP Semiconductors and - Delft University of Technology. For this part of the model, each claim undivided - ownership and copyrights - Until and including 2011, PSP has been co-developed by NXP Semiconductors and - Arizona State University. For this part of the model, NXP Semiconductors claims - undivided ownership and copyrights. - - - Version: PSP 102.5.0 (including JUNCAP2 200.4.0), December 2013 - - This version of PSP is contained in SiMKit 4.2 - -====================================================================================== -====================================================================================== - - Authors: G.D.J. Smit, A.J. Scholten, and D.B.M. Klaassen (NXP Semiconductors) - R. van der Toorn (Delft University of Technology) - - Former contributers: - G. Gildenblat, W. Yao, Z. Zhu, X. Li and W. Wu (Arizona State University) - R. van Langevelde (Philips Research) - - The most recent version of the model code, the documentation, and contact - information can be found on: - - http://psp.ewi.tudelft.nl/ - -====================================================================================== -====================================================================================== - -This package consists of the following files: - - - releasenotesPSP102.txt This file - - - psp102.va Main file for global ("geometrical") model - - psp102b.va Main file for global binning model - - psp102e.va Main file for local ("electrical") model - - psp102_nqs.va Main file for global ("geometrical") model with NQS-effects - - psp102b_nqs.va Main file for global binning model with NQS-effects - - psp102e_nqs.va Main file for local ("electrical") model with NQS-effects - - - Common102_macrodefs.include Common macro definitions - - PSP102_macrodefs.include Macro definitions for PSP - - PSP102_module.include Actual model code for intrinsic MOS model - - PSP102_binning.include Geometry scaling equation for binning - - PSP102_binpars.include Parameterlist for global PSP binning model - - PSP102_nqs_macrodefs.include Macro definitions for PSP-NQS - - PSP102_InitNQS.include PSP-NQS initialization code - - PSP102_ChargesNQS.include Calculation of NQS-charge contributions - - JUNCAP200_macrodefs.include Macro definitions for JUNCAP2 model - - JUNCAP200_parlist.include JUNCAP2 parameter list - - JUNCAP200_varlist1.include JUNCAP2 variable declarations - - JUNCAP200_varlist2.include JUNCAP2 variable declarations - - JUNCAP200_InitModel.include JUNCAP2 model initialization code - -====================================================================================== -====================================================================================== - -Usage ------ - -Depending which model one wants to use, one should compile one of the seven .va-files -(psp102.va, psp102b.va, psp102e.va, psp102_nqs.va, psp102b_nqs.va, and psp102e_nqs.va). -The module names are "PSP102VA" and "PSPNQS102VA" for the global PSP-model (QS and -NQS, respectively), and similarly "PSP102BVA" and "PSPNQS102BVA" for the binning -PSP-model, "PSP102EVA" and "PSPNQS102EVA" for the local PSP-model. - -For the stand-alone version of JUNCAP2, version 200.4.0, please refer to the distribution -of PSP103. - -====================================================================================== -====================================================================================== - -Release notes vA-code of PSP 102.5.0 (December 2013) ----------------------------------------------------- - -Changes: - -- Added excess noise model. -- Solved minor numerical issue in avalanche current calculation (occurring when A4 is - large and the body is forward biased). -- Fixed missing T-scaling in OP-output variables lp_bgidl and lp_bgidld. - -PSP 102.5.0 is backwards compatible with the previous version, PSP 102.4.0. - -====================================================================================== -====================================================================================== - -The authors want to thank Laurent Lemaitre and Colin McAndrew (Freescale) -for their help with ADMS and the implementation of the model code. Geoffrey -Coram (Analog Devices) is acknowledged for input concerning the Verilog-A -implementation of the model. diff --git a/src/spicelib/devices/adms/psp103/admsva/Common103_macrodefs.include b/src/spicelib/devices/adms/psp103/admsva/Common103_macrodefs.include deleted file mode 100644 index 9f86b8c8d..000000000 --- a/src/spicelib/devices/adms/psp103/admsva/Common103_macrodefs.include +++ /dev/null @@ -1,176 +0,0 @@ -//====================================================================================== -//====================================================================================== -// Filename: Common103_macrodefs.include -//====================================================================================== -//====================================================================================== -// -// (c) Copyright notice -// -// Since 2015 until today, PSP has been co-developed by NXP Semiconductors and -// CEA-Leti. For this part of the model, each claim undivided ownership and copyrights -// Since 2012 until 2015, PSP has been co-developed by NXP Semiconductors and -// Delft University of Technology. For this part of the model, each claim undivided -// ownership and copyrights -// Until and including 2011, PSP has been co-developed by NXP Semiconductors and -// Arizona State University. For this part of the model, NXP Semiconductors claims -// undivided ownership and copyrights. -// -// -// Version: 103.7.0 (PSP), 200.6.0 (JUNCAP), April 2019 -// -//====================================================================================== -//====================================================================================== -// -// Further information can be found in the file releasenotesPSP103.txt -// - -////////////////////////////////////////////////////////////// -// -// General macros and constants for compact va-models -// -////////////////////////////////////////////////////////////// - -// Clipping functions -`define CLIP_LOW(val,min) ((val)>(min)?(val):(min)) -`define CLIP_HIGH(val,max) ((val)<(max)?(val):(max)) -`define CLIP_BOTH(val,min,max) ((val)>(min)?((val)<(max)?(val):(max)):(min)) - -`ifdef insideADMS - `define INITIAL_MODEL @(initial_model) - `define INITIAL_INSTANCE @(initial_instance) - `define from(lower,upper) from [lower:upper] -`else - `define INITIAL_MODEL - `define INITIAL_INSTANCE - `define from(lower,upper) -`endif - -// Min/Max functions -`define MAX(x,y) ((x)>(y)?(x):(y)) -`define MIN(x,y) ((x)<(y)?(x):(y)) - -// Mathematical constants -`define PI 3.1415926535897931 -`define SQRTPI 1.77245385090551603 - -// Physical constants -`define KELVINCONVERSION 273.15 -`define KBOL 1.3806505E-23 -`define QELE 1.6021918E-19 -`define HBAR 1.05457168E-34 -`define MELE 9.1093826E-31 -`define EPSO 8.8541878176E-12 -`define EPSRSI 11.8 - -// Other constants -`define oneThird 3.3333333333333333e-01 -`define twoThirds 6.6666666666666667e-01 - -// Constants needed in safe exponential function (called "expl") -`define se 4.6051701859880916e+02 -`define se05 2.3025850929940458e+02 -`define ke 1.0e-200 -`define ke05 1.0e-100 -`define keinv 1.0e200 -`define ke05inv 1.0e100 - -// P3 3rd order polynomial expansion of exp() -`define P3(u) (1.0 + (u) * (1.0 + 0.5 * ((u) * (1.0 + (u) * `oneThird)))) - -// expl exp() with 3rd order polynomial extrapolation for very low values (exp_low), -// very high values (exp_high), or both (expl) -`define expl(x, res) \ - if (abs(x) < `se05) begin\ - res = exp(x); \ - end else begin \ - if ((x) < 0.0) begin\ - res = `ke05 / `P3(-`se05 - (x)); \ - end else begin\ - res = `ke05inv * `P3((x) - `se05); \ - end \ - end - -`define expl_low(x, res) \ - if ((x) > -`se05) begin\ - res = exp(x); \ - end else begin\ - res = `ke05 / `P3(-`se05 - (x)); \ - end - -`define expl_high(x, res) \ - if ((x) < `se05) begin\ - res = exp(x); \ - end else begin \ - res = `ke05inv * `P3((x) - `se05); \ - end - -// Exchange function -`define swap(a, b) \ - temp = a; \ - a = b; \ - b = temp; - -// Parameter definition macros: "des" description argument is intended to -// be a short description, the "inf" information argument is intended to be -// a detailed description (e.g. for display as part of on-line help). -// -// MPR model parameter real -// MPI model parameter integer -// IPR instance parameter real -// IPI instance parameter integer -// OPP operating point parameter, includes units and description for printing -// OPM operating point parameter, scales with $mfactor -// OPD operating point parameter, scales with 1/$mfactor -// -// Instance parameters have the attribute *type="instance"* and note that -// compilers treat these as both instance and model parameters, with a -// specified instance value taking precedence over a specified model card value. -// -// There are some issues with passing range directives with some compilers, -// so for each parameter declaration there are multiple versions: -// cc closed lower bound, closed upper bound -// co closed lower bound, open upper bound -// cz closed lower bound of zero (no upper bound) -// oc open lower bound, closed upper bound -// oo open lower bound, open upper bound -// oz open lower bound of zero (no upper bound) -// nb no bounds -// sw switch (integer only, values 0=false and >0=true) -// ty switch (integer only, values -1=n-type and +1=p-type) -// - -`define ALIAS(alias,paramName) aliasparam alias = paramName; -`define OPP(nam,uni,des) (*units=uni, desc=des*) real nam; -`define OPM(nam,uni,des) (*units=uni, multiplicity="multiply", desc=des*) real nam; -`define OPD(nam,uni,des) (*units=uni, multiplicity="divide", desc=des*) real nam; -`define MPRcc(nam,def,uni,lwr,upr,des) (*units=uni , desc=des*) parameter real nam=def from[lwr:upr]; -`define MPRco(nam,def,uni,lwr,upr,des) (*units=uni , desc=des*) parameter real nam=def from[lwr:upr); -`define MPRcz(nam,def,uni, des) (*units=uni , desc=des*) parameter real nam=def from[ 0:inf); -`define MPRoc(nam,def,uni,lwr,upr,des) (*units=uni , desc=des*) parameter real nam=def from(lwr:upr]; -`define MPRoo(nam,def,uni,lwr,upr,des) (*units=uni , desc=des*) parameter real nam=def from(lwr:upr); -`define MPRoz(nam,def,uni, des) (*units=uni , desc=des*) parameter real nam=def from( 0:inf); -`define MPRnb(nam,def,uni, des) (*units=uni , desc=des*) parameter real nam=def; -`define MPIcc(nam,def,uni,lwr,upr,des) (*units=uni , desc=des*) parameter integer nam=def from[lwr:upr]; -`define MPIco(nam,def,uni,lwr,upr,des) (*units=uni , desc=des*) parameter integer nam=def from[lwr:upr); -`define MPIcz(nam,def,uni, des) (*units=uni , desc=des*) parameter integer nam=def from[ 0:inf); -`define MPIoc(nam,def,uni,lwr,upr,des) (*units=uni , desc=des*) parameter integer nam=def from(lwr:upr]; -`define MPIoo(nam,def,uni,lwr,upr,des) (*units=uni , desc=des*) parameter integer nam=def from(lwr:upr); -`define MPIoz(nam,def,uni, des) (*units=uni , desc=des*) parameter integer nam=def from( 0:inf); -`define MPInb(nam,def,uni, des) (*units=uni , desc=des*) parameter integer nam=def; -`define MPIsw(nam,def,uni, des) (*units=uni , desc=des*) parameter integer nam=def from[ 0:inf); -`define MPIty(nam,def,uni, des) (*units=uni , desc=des*) parameter integer nam=def from[ -1: 1] exclude 0; -`define IPRcc(nam,def,uni,lwr,upr,des) (*units=uni, type="instance", desc=des*) parameter real nam=def from[lwr:upr]; -`define IPRco(nam,def,uni,lwr,upr,des) (*units=uni, type="instance", desc=des*) parameter real nam=def from[lwr:upr); -`define IPRcz(nam,def,uni, des) (*units=uni, type="instance", desc=des*) parameter real nam=def from[ 0:inf); -`define IPRoc(nam,def,uni,lwr,upr,des) (*units=uni, type="instance", desc=des*) parameter real nam=def from(lwr:upr]; -`define IPRoo(nam,def,uni,lwr,upr,des) (*units=uni, type="instance", desc=des*) parameter real nam=def from(lwr:upr); -`define IPRoz(nam,def,uni, des) (*units=uni, type="instance", desc=des*) parameter real nam=def from( 0:inf); -`define IPRnb(nam,def,uni, des) (*units=uni, type="instance", desc=des*) parameter real nam=def; -`define IPIcc(nam,def,uni,lwr,upr,des) (*units=uni, type="instance", desc=des*) parameter integer nam=def from[lwr:upr]; -`define IPIco(nam,def,uni,lwr,upr,des) (*units=uni, type="instance", desc=des*) parameter integer nam=def from[lwr:upr); -`define IPIcz(nam,def,uni, des) (*units=uni, type="instance", desc=des*) parameter integer nam=def from[ 0:inf); -`define IPIoc(nam,def,uni,lwr,upr,des) (*units=uni, type="instance", desc=des*) parameter integer nam=def from(lwr:upr]; -`define IPIoo(nam,def,uni,lwr,upr,des) (*units=uni, type="instance", desc=des*) parameter integer nam=def from(lwr:upr); -`define IPIoz(nam,def,uni, des) (*units=uni, type="instance", desc=des*) parameter integer nam=def from( 0:inf); -`define IPInb(nam,def,uni, des) (*units=uni, type="instance", desc=des*) parameter integer nam=def; -`define IPIsw(nam,def,uni, des) (*units=uni, type="instance", desc=des*) parameter integer nam=def from[ 0:inf); diff --git a/src/spicelib/devices/adms/psp103/admsva/JUNCAP200_InitModel.include b/src/spicelib/devices/adms/psp103/admsva/JUNCAP200_InitModel.include deleted file mode 100644 index 3326002f5..000000000 --- a/src/spicelib/devices/adms/psp103/admsva/JUNCAP200_InitModel.include +++ /dev/null @@ -1,406 +0,0 @@ -//====================================================================================== -//====================================================================================== -// Filename: JUNCAP200_InitModel.include -//====================================================================================== -//====================================================================================== -// -// (c) Copyright notice -// -// Since 2015 until today, PSP has been co-developed by NXP Semiconductors and -// CEA-Leti. For this part of the model, each claim undivided ownership and copyrights -// Since 2012 until 2015, PSP has been co-developed by NXP Semiconductors and -// Delft University of Technology. For this part of the model, each claim undivided -// ownership and copyrights -// Until and including 2011, PSP has been co-developed by NXP Semiconductors and -// Arizona State University. For this part of the model, NXP Semiconductors claims -// undivided ownership and copyrights. -// -// -// Version: 200.6.0, April 2019 -// -//====================================================================================== -//====================================================================================== -// -// Further information can be found in the file releasenotesPSP103.txt -// - -// -------------------------------------------------------------------------------------------------------------- -// Calculation of internal parameters which are independent on instance parameters -// -------------------------------------------------------------------------------------------------------------- - -TRJ_i = `CLIP_LOW( TRJ ,`TRJ_cliplow); -IMAX_i = `CLIP_LOW( IMAX ,`IMAX_cliplow); -FREV_i = `CLIP_BOTH(FREV ,`FREV_cliplow,`FREV_cliphigh); -//IFACTOR_i = `CLIP_LOW( IFACTOR ,`IFACTOR_cliplow); -//CFACTOR_i = `CLIP_LOW( CFACTOR ,`CFACTOR_cliplow); - -CJORBOT_i = `CLIP_LOW( CJORBOT ,`CJORBOT_cliplow); -CJORSTI_i = `CLIP_LOW( CJORSTI ,`CJORSTI_cliplow); -CJORGAT_i = `CLIP_LOW( CJORGAT ,`CJORGAT_cliplow); -VBIRBOT_i = `CLIP_LOW( VBIRBOT ,`VBIR_cliplow); -VBIRSTI_i = `CLIP_LOW( VBIRSTI ,`VBIR_cliplow); -VBIRGAT_i = `CLIP_LOW( VBIRGAT ,`VBIR_cliplow); -PBOT_i = `CLIP_BOTH(PBOT ,`P_cliplow,`P_cliphigh); -PSTI_i = `CLIP_BOTH(PSTI ,`P_cliplow,`P_cliphigh); -PGAT_i = `CLIP_BOTH(PGAT ,`P_cliplow,`P_cliphigh); -PHIGBOT_i = PHIGBOT; -PHIGSTI_i = PHIGSTI; -PHIGGAT_i = PHIGGAT; -IDSATRBOT_i = `CLIP_LOW( IDSATRBOT ,`IDSATR_cliplow); -IDSATRSTI_i = `CLIP_LOW( IDSATRSTI ,`IDSATR_cliplow); -IDSATRGAT_i = `CLIP_LOW( IDSATRGAT ,`IDSATR_cliplow); -CSRHBOT_i = `CLIP_LOW( CSRHBOT ,`CSRH_cliplow); -CSRHSTI_i = `CLIP_LOW( CSRHSTI ,`CSRH_cliplow); -CSRHGAT_i = `CLIP_LOW( CSRHGAT ,`CSRH_cliplow); -XJUNSTI_i = `CLIP_LOW( XJUNSTI ,`XJUN_cliplow); -XJUNGAT_i = `CLIP_LOW( XJUNGAT ,`XJUN_cliplow); -CTATBOT_i = `CLIP_LOW( CTATBOT ,`CTAT_cliplow); -CTATSTI_i = `CLIP_LOW( CTATSTI ,`CTAT_cliplow); -CTATGAT_i = `CLIP_LOW( CTATGAT ,`CTAT_cliplow); -MEFFTATBOT_i = `CLIP_LOW( MEFFTATBOT ,`MEFFTAT_cliplow); -MEFFTATSTI_i = `CLIP_LOW( MEFFTATSTI ,`MEFFTAT_cliplow); -MEFFTATGAT_i = `CLIP_LOW( MEFFTATGAT ,`MEFFTAT_cliplow); -CBBTBOT_i = `CLIP_LOW( CBBTBOT ,`CBBT_cliplow); -CBBTSTI_i = `CLIP_LOW( CBBTSTI ,`CBBT_cliplow); -CBBTGAT_i = `CLIP_LOW( CBBTGAT ,`CBBT_cliplow); -FBBTRBOT_i = FBBTRBOT; -FBBTRSTI_i = FBBTRSTI; -FBBTRGAT_i = FBBTRGAT; -STFBBTBOT_i = STFBBTBOT; -STFBBTSTI_i = STFBBTSTI; -STFBBTGAT_i = STFBBTGAT; -VBRBOT_i = `CLIP_LOW( VBRBOT ,`VBR_cliplow); -VBRSTI_i = `CLIP_LOW( VBRSTI ,`VBR_cliplow); -VBRGAT_i = `CLIP_LOW( VBRGAT ,`VBR_cliplow); -PBRBOT_i = `CLIP_LOW( PBRBOT ,`PBR_cliplow); -PBRSTI_i = `CLIP_LOW( PBRSTI ,`PBR_cliplow); -PBRGAT_i = `CLIP_LOW( PBRGAT ,`PBR_cliplow); - -SWJUNEXP_i = 0.0; -if (SWJUNEXP > 0.5) begin - SWJUNEXP_i = 1.0; -end else begin - SWJUNEXP_i = 0.0; -end - -VJUNREF_i = `CLIP_LOW( VJUNREF ,`VJUNREF_cliplow); -FJUNQ_i = `CLIP_LOW( FJUNQ ,`FJUNQ_cliplow); - -`ifdef JUNCAP_StandAlone - // do nothing -`else // JUNCAP_StandAlone - if (SWJUNASYM == 0.0) begin - CJORBOTD_i = CJORBOT_i; - CJORSTID_i = CJORSTI_i; - CJORGATD_i = CJORGAT_i; - VBIRBOTD_i = VBIRBOT_i; - VBIRSTID_i = VBIRSTI_i; - VBIRGATD_i = VBIRGAT_i; - PBOTD_i = PBOT_i; - PSTID_i = PSTI_i; - PGATD_i = PGAT_i; - PHIGBOTD_i = PHIGBOT_i; - PHIGSTID_i = PHIGSTI_i; - PHIGGATD_i = PHIGGAT_i; - IDSATRBOTD_i = IDSATRBOT_i; - IDSATRSTID_i = IDSATRSTI_i; - IDSATRGATD_i = IDSATRGAT_i; - CSRHBOTD_i = CSRHBOT_i; - CSRHSTID_i = CSRHSTI_i; - CSRHGATD_i = CSRHGAT_i; - XJUNSTID_i = XJUNSTI_i; - XJUNGATD_i = XJUNGAT_i; - CTATBOTD_i = CTATBOT_i; - CTATSTID_i = CTATSTI_i; - CTATGATD_i = CTATGAT_i; - MEFFTATBOTD_i = MEFFTATBOT_i; - MEFFTATSTID_i = MEFFTATSTI_i; - MEFFTATGATD_i = MEFFTATGAT_i; - CBBTBOTD_i = CBBTBOT_i; - CBBTSTID_i = CBBTSTI_i; - CBBTGATD_i = CBBTGAT_i; - FBBTRBOTD_i = FBBTRBOT_i; - FBBTRSTID_i = FBBTRSTI_i; - FBBTRGATD_i = FBBTRGAT_i; - STFBBTBOTD_i = STFBBTBOT_i; - STFBBTSTID_i = STFBBTSTI_i; - STFBBTGATD_i = STFBBTGAT_i; - VBRBOTD_i = VBRBOT_i; - VBRSTID_i = VBRSTI_i; - VBRGATD_i = VBRGAT_i; - PBRBOTD_i = PBRBOT_i; - PBRSTID_i = PBRSTI_i; - PBRGATD_i = PBRGAT_i; - VJUNREFD_i = VJUNREF_i; - FJUNQD_i = FJUNQ_i; - end else begin - CJORBOTD_i = `CLIP_LOW( CJORBOTD ,`CJORBOT_cliplow); - CJORSTID_i = `CLIP_LOW( CJORSTID ,`CJORSTI_cliplow); - CJORGATD_i = `CLIP_LOW( CJORGATD ,`CJORGAT_cliplow); - VBIRBOTD_i = `CLIP_LOW( VBIRBOTD ,`VBIR_cliplow); - VBIRSTID_i = `CLIP_LOW( VBIRSTID ,`VBIR_cliplow); - VBIRGATD_i = `CLIP_LOW( VBIRGATD ,`VBIR_cliplow); - PBOTD_i = `CLIP_BOTH(PBOTD ,`P_cliplow,`P_cliphigh); - PSTID_i = `CLIP_BOTH(PSTID ,`P_cliplow,`P_cliphigh); - PGATD_i = `CLIP_BOTH(PGATD ,`P_cliplow,`P_cliphigh); - PHIGBOTD_i = PHIGBOTD; - PHIGSTID_i = PHIGSTID; - PHIGGATD_i = PHIGGATD; - IDSATRBOTD_i = `CLIP_LOW( IDSATRBOTD ,`IDSATR_cliplow); - IDSATRSTID_i = `CLIP_LOW( IDSATRSTID ,`IDSATR_cliplow); - IDSATRGATD_i = `CLIP_LOW( IDSATRGATD ,`IDSATR_cliplow); - CSRHBOTD_i = `CLIP_LOW( CSRHBOTD ,`CSRH_cliplow); - CSRHSTID_i = `CLIP_LOW( CSRHSTID ,`CSRH_cliplow); - CSRHGATD_i = `CLIP_LOW( CSRHGATD ,`CSRH_cliplow); - XJUNSTID_i = `CLIP_LOW( XJUNSTID ,`XJUN_cliplow); - XJUNGATD_i = `CLIP_LOW( XJUNGATD ,`XJUN_cliplow); - CTATBOTD_i = `CLIP_LOW( CTATBOTD ,`CTAT_cliplow); - CTATSTID_i = `CLIP_LOW( CTATSTID ,`CTAT_cliplow); - CTATGATD_i = `CLIP_LOW( CTATGATD ,`CTAT_cliplow); - MEFFTATBOTD_i = `CLIP_LOW( MEFFTATBOTD,`MEFFTAT_cliplow); - MEFFTATSTID_i = `CLIP_LOW( MEFFTATSTID,`MEFFTAT_cliplow); - MEFFTATGATD_i = `CLIP_LOW( MEFFTATGATD,`MEFFTAT_cliplow); - CBBTBOTD_i = `CLIP_LOW( CBBTBOTD ,`CBBT_cliplow); - CBBTSTID_i = `CLIP_LOW( CBBTSTID ,`CBBT_cliplow); - CBBTGATD_i = `CLIP_LOW( CBBTGATD ,`CBBT_cliplow); - FBBTRBOTD_i = FBBTRBOTD; - FBBTRSTID_i = FBBTRSTID; - FBBTRGATD_i = FBBTRGATD; - STFBBTBOTD_i = STFBBTBOTD; - STFBBTSTID_i = STFBBTSTID; - STFBBTGATD_i = STFBBTGATD; - VBRBOTD_i = `CLIP_LOW( VBRBOTD ,`VBR_cliplow); - VBRSTID_i = `CLIP_LOW( VBRSTID ,`VBR_cliplow); - VBRGATD_i = `CLIP_LOW( VBRGATD ,`VBR_cliplow); - PBRBOTD_i = `CLIP_LOW( PBRBOTD ,`PBR_cliplow); - PBRSTID_i = `CLIP_LOW( PBRSTID ,`PBR_cliplow); - PBRGATD_i = `CLIP_LOW( PBRGATD ,`PBR_cliplow); - VJUNREFD_i = `CLIP_LOW( VJUNREFD ,`VJUNREF_cliplow); - FJUNQD_i = `CLIP_LOW( FJUNQD ,`FJUNQ_cliplow); - end -`endif // JUNCAP_StandAlone - -tkr = `KELVINCONVERSION + TRJ_i; -tkd = max($temperature + DTA, `KELVINCONVERSION + `MINTEMP); -auxt = tkd / tkr; -KBOL_over_QELE = `KBOL / `QELE; -phitr = KBOL_over_QELE * tkr; -phitrinv = 1.0 / phitr; -phitd = KBOL_over_QELE * tkd; -phitdinv = 1.0 / phitd; - -// bandgap voltages at reference temperature -deltaphigr = -(7.02e-4 * tkr * tkr) / (1108.0 + tkr); -phigrbot = PHIGBOT_i + deltaphigr; -phigrsti = PHIGSTI_i + deltaphigr; -phigrgat = PHIGGAT_i + deltaphigr; - -// bandgap voltages at device temperature -deltaphigd = -(7.02e-4 * tkd * tkd) / (1108.0 + tkd); -phigdbot = PHIGBOT_i + deltaphigd; -phigdsti = PHIGSTI_i + deltaphigd; -phigdgat = PHIGGAT_i + deltaphigd; - -// factors ftd for ideal-current model -ftdbot = (pow(auxt, 1.5)) * exp(0.5 * ((phigrbot * phitrinv) - (phigdbot * phitdinv))); -ftdsti = (pow(auxt, 1.5)) * exp(0.5 * ((phigrsti * phitrinv) - (phigdsti * phitdinv))); -ftdgat = (pow(auxt, 1.5)) * exp(0.5 * ((phigrgat * phitrinv) - (phigdgat * phitdinv))); - -// temperature-scaled saturation current for ideal-current model -idsatbot = IDSATRBOT_i * ftdbot * ftdbot; -idsatsti = IDSATRSTI_i * ftdsti * ftdsti; -idsatgat = IDSATRGAT_i * ftdgat * ftdgat; - -// built-in voltages before limiting -ubibot = VBIRBOT_i * auxt - 2.0 * phitd * ln(ftdbot); -ubisti = VBIRSTI_i * auxt - 2.0 * phitd * ln(ftdsti); -ubigat = VBIRGAT_i * auxt - 2.0 * phitd * ln(ftdgat); - -// built-in voltages limited to phitd -vbibot = ubibot + phitd * ln(1 + exp((`vbilow - ubibot) * phitdinv)); -vbisti = ubisti + phitd * ln(1 + exp((`vbilow - ubisti) * phitdinv)); -vbigat = ubigat + phitd * ln(1 + exp((`vbilow - ubigat) * phitdinv)); - -// inverse values of built-in voltages -vbiinvbot = 1.0 / vbibot; -vbiinvsti = 1.0 / vbisti; -vbiinvgat = 1.0 / vbigat; - -// one minus the grading coefficient -one_minus_PBOT = 1.0 - PBOT_i; -one_minus_PSTI = 1.0 - PSTI_i; -one_minus_PGAT = 1.0 - PGAT_i; - -// one over "one minus the grading coefficient" -one_over_one_minus_PBOT = 1.0 / one_minus_PBOT; -one_over_one_minus_PSTI = 1.0 / one_minus_PSTI; -one_over_one_minus_PGAT = 1.0 / one_minus_PGAT; - -// temperature-scaled zero-bias capacitance -cjobot = CJORBOT_i * pow((VBIRBOT_i * vbiinvbot), PBOT_i); -cjosti = CJORSTI_i * pow((VBIRSTI_i * vbiinvsti), PSTI_i); -cjogat = CJORGAT_i * pow((VBIRGAT_i * vbiinvgat), PGAT_i); - -// prefactor in physical part of charge model -qprefbot = cjobot * vbibot * one_over_one_minus_PBOT; -qprefsti = cjosti * vbisti * one_over_one_minus_PSTI; -qprefgat = cjogat * vbigat * one_over_one_minus_PGAT; - -// prefactor in mathematical extension of charge model -qpref2bot = `a * cjobot; -qpref2sti = `a * cjosti; -qpref2gat = `a * cjogat; - -// zero-bias depletion widths at reference temperature, needed in SRH and TAT model -wdepnulrbot = EPSSI / CJORBOT_i; -wdepnulrsti = XJUNSTI_i * EPSSI / CJORSTI_i; -wdepnulrgat = XJUNGAT_i * EPSSI / CJORGAT_i; - -// inverse values of "wdepnulr", used in BBT model -wdepnulrinvbot = 1.0 / wdepnulrbot; -wdepnulrinvsti = 1.0 / wdepnulrsti; -wdepnulrinvgat = 1.0 / wdepnulrgat; - -// inverse values of built-in voltages at reference temperature, needed in SRH and BBT model -VBIRBOTinv = 1.0 / VBIRBOT_i; -VBIRSTIinv = 1.0 / VBIRSTI_i; -VBIRGATinv = 1.0 / VBIRGAT_i; - -// some constants needed in erfc-approximation, needed in TAT model -perfc = (`SQRTPI * `aerfc); -berfc = ((-5.0 * (`aerfc) + 6.0 - pow((perfc), -2.0)) / 3.0); -cerfc = (1.0 - (`aerfc) - (berfc)); - -// half the bandgap energy, limited to values > phitd, needed in TAT model -deltaEbot = max(0.5 * phigdbot, phitd); -deltaEsti = max(0.5 * phigdsti, phitd); -deltaEgat = max(0.5 * phigdgat, phitd); - -// values of atat, needed in TAT model -atatbot = deltaEbot * phitdinv; -atatsti = deltaEsti * phitdinv; -atatgat = deltaEgat * phitdinv; - -// values of btatpart, needed in TAT model -btatpartbot = sqrt(32.0 * MEFFTATBOT_i * `MELE * `QELE * (deltaEbot * deltaEbot * deltaEbot)) / (3.0 * `HBAR); -btatpartsti = sqrt(32.0 * MEFFTATSTI_i * `MELE * `QELE * (deltaEsti * deltaEsti * deltaEsti)) / (3.0 * `HBAR); -btatpartgat = sqrt(32.0 * MEFFTATGAT_i * `MELE * `QELE * (deltaEgat * deltaEgat * deltaEgat)) / (3.0 * `HBAR); - -// temperature-scaled values of FBBT, needed in BBT model -fbbtbot = FBBTRBOT_i * (1.0 + STFBBTBOT_i * (tkd - tkr)); -fbbtsti = FBBTRSTI_i * (1.0 + STFBBTSTI_i * (tkd - tkr)); -fbbtgat = FBBTRGAT_i * (1.0 + STFBBTGAT_i * (tkd - tkr)); -fbbtbot = `CLIP_LOW(fbbtbot, 0.0); -fbbtsti = `CLIP_LOW(fbbtsti, 0.0); -fbbtgat = `CLIP_LOW(fbbtgat, 0.0); - -// values of fstop, needed in avalanche/breakdown model -alphaav = 1.0 - 1.0 / FREV_i; -fstopbot = 1.0 / (1.0 - pow(alphaav, PBRBOT_i)); -fstopsti = 1.0 / (1.0 - pow(alphaav, PBRSTI_i)); -fstopgat = 1.0 / (1.0 - pow(alphaav, PBRGAT_i)); - -// inverse values of breakdown voltages, needed in avalanche/breakdown model -VBRinvbot = 1.0 / VBRBOT_i; -VBRinvsti = 1.0 / VBRSTI_i; -VBRinvgat = 1.0 / VBRGAT_i; - -// slopes for linear extrapolation close to and beyond breakdown, needed in avalanche/breakdown model -slopebot = -(fstopbot * fstopbot * pow(alphaav, (PBRBOT_i - 1.0))) * PBRBOT_i * VBRinvbot; -slopesti = -(fstopsti * fstopsti * pow(alphaav, (PBRSTI_i - 1.0))) * PBRSTI_i * VBRinvsti; -slopegat = -(fstopgat * fstopgat * pow(alphaav, (PBRGAT_i - 1.0))) * PBRGAT_i * VBRinvgat; - -`ifdef JUNCAP_StandAlone - // do nothing -`else // JUNCAP_StandAlone - phigrbot_d = PHIGBOTD_i + deltaphigr; - phigrsti_d = PHIGSTID_i + deltaphigr; - phigrgat_d = PHIGGATD_i + deltaphigr; - - phigdbot_d = PHIGBOTD_i + deltaphigd; - phigdsti_d = PHIGSTID_i + deltaphigd; - phigdgat_d = PHIGGATD_i + deltaphigd; - - ftdbot_d = (pow(auxt, 1.5)) * exp(0.5 * ((phigrbot_d * phitrinv) - (phigdbot_d * phitdinv))); - ftdsti_d = (pow(auxt, 1.5)) * exp(0.5 * ((phigrsti_d * phitrinv) - (phigdsti_d * phitdinv))); - ftdgat_d = (pow(auxt, 1.5)) * exp(0.5 * ((phigrgat_d * phitrinv) - (phigdgat_d * phitdinv))); - - idsatbot_d = IDSATRBOTD_i * ftdbot_d * ftdbot_d; - idsatsti_d = IDSATRSTID_i * ftdsti_d * ftdsti_d; - idsatgat_d = IDSATRGATD_i * ftdgat_d * ftdgat_d; - - ubibot_d = VBIRBOTD_i * auxt - 2.0 * phitd * ln(ftdbot_d); - ubisti_d = VBIRSTID_i * auxt - 2.0 * phitd * ln(ftdsti_d); - ubigat_d = VBIRGATD_i * auxt - 2.0 * phitd * ln(ftdgat_d); - - vbibot_d = ubibot_d + phitd * ln(1.0 + exp((`vbilow - ubibot_d) * phitdinv)); - vbisti_d = ubisti_d + phitd * ln(1.0 + exp((`vbilow - ubisti_d) * phitdinv)); - vbigat_d = ubigat_d + phitd * ln(1.0 + exp((`vbilow - ubigat_d) * phitdinv)); - - vbiinvbot_d = 1.0 / vbibot_d; - vbiinvsti_d = 1.0 / vbisti_d; - vbiinvgat_d = 1.0 / vbigat_d; - - one_minus_PBOT_d = 1.0 - PBOTD_i; - one_minus_PSTI_d = 1.0 - PSTID_i; - one_minus_PGAT_d = 1.0 - PGATD_i; - - one_over_one_minus_PBOT_d = 1.0 / one_minus_PBOT_d; - one_over_one_minus_PSTI_d = 1.0 / one_minus_PSTI_d; - one_over_one_minus_PGAT_d = 1.0 / one_minus_PGAT_d; - - cjobot_d = CJORBOTD_i * pow((VBIRBOTD_i * vbiinvbot_d), PBOTD_i); - cjosti_d = CJORSTID_i * pow((VBIRSTID_i * vbiinvsti_d), PSTID_i); - cjogat_d = CJORGATD_i * pow((VBIRGATD_i * vbiinvgat_d), PGATD_i); - - qprefbot_d = cjobot_d * vbibot_d * one_over_one_minus_PBOT_d; - qprefsti_d = cjosti_d * vbisti_d * one_over_one_minus_PSTI_d; - qprefgat_d = cjogat_d * vbigat_d * one_over_one_minus_PGAT_d; - - qpref2bot_d = `a * cjobot_d; - qpref2sti_d = `a * cjosti_d; - qpref2gat_d = `a * cjogat_d; - - wdepnulrbot_d = EPSSI / CJORBOTD_i; - wdepnulrsti_d = XJUNSTID_i * EPSSI / CJORSTID_i; - wdepnulrgat_d = XJUNGATD_i * EPSSI / CJORGATD_i; - - wdepnulrinvbot_d = 1.0 / wdepnulrbot_d; - wdepnulrinvsti_d = 1.0 / wdepnulrsti_d; - wdepnulrinvgat_d = 1.0 / wdepnulrgat_d; - - VBIRBOTinv_d = 1.0 / VBIRBOTD_i; - VBIRSTIinv_d = 1.0 / VBIRSTID_i; - VBIRGATinv_d = 1.0 / VBIRGATD_i; - - deltaEbot_d = max(0.5 * phigdbot_d, phitd); - deltaEsti_d = max(0.5 * phigdsti_d, phitd); - deltaEgat_d = max(0.5 * phigdgat_d, phitd); - - atatbot_d = deltaEbot_d * phitdinv; - atatsti_d = deltaEsti_d * phitdinv; - atatgat_d = deltaEgat_d * phitdinv; - - btatpartbot_d = sqrt(32.0 * MEFFTATBOTD_i * `MELE * `QELE * (deltaEbot_d * deltaEbot_d * deltaEbot_d)) / (3.0 * `HBAR); - btatpartsti_d = sqrt(32.0 * MEFFTATSTID_i * `MELE * `QELE * (deltaEsti_d * deltaEsti_d * deltaEsti_d)) / (3.0 * `HBAR); - btatpartgat_d = sqrt(32.0 * MEFFTATGATD_i * `MELE * `QELE * (deltaEgat_d * deltaEgat_d * deltaEgat_d)) / (3.0 * `HBAR); - - fbbtbot_d = FBBTRBOTD_i * (1.0 + STFBBTBOTD_i * (tkd - tkr)); - fbbtsti_d = FBBTRSTID_i * (1.0 + STFBBTSTID_i * (tkd - tkr)); - fbbtgat_d = FBBTRGATD_i * (1.0 + STFBBTGATD_i * (tkd - tkr)); - fbbtbot_d = `CLIP_LOW(fbbtbot_d, 0.0); - fbbtsti_d = `CLIP_LOW(fbbtsti_d, 0.0); - fbbtgat_d = `CLIP_LOW(fbbtgat_d, 0.0); - - fstopbot_d = 1.0 / (1.0 - pow(alphaav, PBRBOTD_i)); - fstopsti_d = 1.0 / (1.0 - pow(alphaav, PBRSTID_i)); - fstopgat_d = 1.0 / (1.0 - pow(alphaav, PBRGATD_i)); - - VBRinvbot_d = 1.0 / VBRBOTD_i; - VBRinvsti_d = 1.0 / VBRSTID_i; - VBRinvgat_d = 1.0 / VBRGATD_i; - - slopebot_d = -(fstopbot_d * fstopbot_d * pow(alphaav, (PBRBOTD_i - 1.0))) * PBRBOTD_i * VBRinvbot_d; - slopesti_d = -(fstopsti_d * fstopsti_d * pow(alphaav, (PBRSTID_i - 1.0))) * PBRSTID_i * VBRinvsti_d; - slopegat_d = -(fstopgat_d * fstopgat_d * pow(alphaav, (PBRGATD_i - 1.0))) * PBRGATD_i * VBRinvgat_d; -`endif // JUNCAP_StandAlone diff --git a/src/spicelib/devices/adms/psp103/admsva/JUNCAP200_macrodefs.include b/src/spicelib/devices/adms/psp103/admsva/JUNCAP200_macrodefs.include deleted file mode 100644 index 037edf40a..000000000 --- a/src/spicelib/devices/adms/psp103/admsva/JUNCAP200_macrodefs.include +++ /dev/null @@ -1,471 +0,0 @@ -//====================================================================================== -//====================================================================================== -// Filename: JUNCAP200_macrodefs.include -//====================================================================================== -//====================================================================================== -// -// (c) Copyright notice -// -// Since 2015 until today, PSP has been co-developed by NXP Semiconductors and -// CEA-Leti. For this part of the model, each claim undivided ownership and copyrights -// Since 2012 until 2015, PSP has been co-developed by NXP Semiconductors and -// Delft University of Technology. For this part of the model, each claim undivided -// ownership and copyrights -// Until and including 2011, PSP has been co-developed by NXP Semiconductors and -// Arizona State University. For this part of the model, NXP Semiconductors claims -// undivided ownership and copyrights. -// -// -// Version: 200.6.0, April 2019 -// -//====================================================================================== -//====================================================================================== -// -// Further information can be found in the file releasenotesPSP103.txt -// - -/////////////////////////////////////////// -// -// Macros and constants used in JUNCAP2 -// -/////////////////////////////////////////// - -// Other constants -`define MINTEMP -2.5e2 -`define vbilow 5.0e-2 -`define a 2.0 -`define epsch 0.1 -`define dvbi 5.0e-2 -`define epsav 1.0e-6 -`define vbrmax 1.0e3 -`define vmaxlarge 1.0e8 -`define aerfc 0.29214664 -`define twothirds 0.666666666666667 - -// Clipping values -`define levelnumber 2.0e2 -`define AB_cliplow 0.0 -`define LS_cliplow 0.0 -`define LG_cliplow 0.0 -`define MULT_cliplow 0.0 -`define TRJ_cliplow `MINTEMP -`define IMAX_cliplow 1.0e-12 -`define FREV_cliplow 1.0e1 -`define FREV_cliphigh 1.0e10 -`define IFACTOR_cliplow 0.0 -`define CFACTOR_cliplow 0.0 -`define CJORBOT_cliplow 1.0e-12 -`define CJORSTI_cliplow 1.0e-18 -`define CJORGAT_cliplow 1.0e-18 -`define VBIR_cliplow `vbilow -`define P_cliplow 5.0e-2 -`define P_cliphigh 0.95 -`define IDSATR_cliplow 0.0 -`define CSRH_cliplow 0.0 -`define XJUN_cliplow 1.0e-9 -`define CTAT_cliplow 0.0 -`define MEFFTAT_cliplow 1.0e-2 -`define CBBT_cliplow 0.0 -`define VBR_cliplow 0.1 -`define PBR_cliplow 0.1 -`define VJUNREF_cliplow 0.5 -`define FJUNQ_cliplow 0.0 - - -///////////////////////////////////////////////////////////////////////////// -// -// Macro definitions. -// -// Note that because at present locally scoped variables -// can only be in named blocks, the intermediate variables -// used in the macros below must be explicitly declared -// as variables. -// -///////////////////////////////////////////////////////////////////////////// - -// Variable declarations of variables that need to be *local* in juncap-express initialization - -//`define LocalGlobalVars \ -// /* declaration of variables needed in macro "calcerfcexpmtat" */ \ -// real ysq, terfc, erfcpos; \ -// \ -// /* declaration of variables needed in hypfunction 5 */ \ -// real h1, h2, h2d, h3, h4, h5; \ -// \ -// /* declaration of variables calculated outside macro "juncapfunction", voltage-dependent part */ \ -// real idmult, vj, z, zinv, two_psistar, vjlim, vjsrh, vbbt, vav; \ -// \ -// /* declaration of variables used within macro "juncapfunction" */ \ -// real tmp, id; \ -// real isrh, vbi_minus_vjsrh, wsrhstep, dwsrh, wsrh, wdep, asrh; \ -// real itat, btat, twoatatoverthreebtat, umaxbeforelimiting, umax, sqrtumax, umaxpoweronepointfive; \ -// real wgamma, wtat, ktat, ltat, mtat, xerfc, erfctimesexpmtat, gammamax; \ -// real ibbt, Fmaxr; \ -// real fbreakdown; - -// Instance parameter dependent initialization -`define JuncapInitInstance(AB_i, LS_i, LG_i, idsatbot, idsatsti, idsatgat, vbibot, vbisti, vbigat, PBOT_i, PSTI_i, PGAT_i, VBIRBOT_i, VBIRSTI_i, VBIRGAT_i, VMAX, exp_VMAX_over_phitd, vbimin, vch, vfmin, vbbtlim) \ - if (idsatbot * AB_i > 0.0) begin \ - vmaxbot = phitd * ln(IMAX_i / (idsatbot * AB_i) + 1.0); \ - end else begin \ - vmaxbot = `vmaxlarge; \ - end \ - if (idsatsti * LS_i > 0.0) begin \ - vmaxsti = phitd * ln(IMAX_i / (idsatsti * LS_i) + 1.0); \ - end else begin \ - vmaxsti = `vmaxlarge; \ - end \ - if (idsatgat * LG_i > 0.0) begin \ - vmaxgat = phitd * ln(IMAX_i / (idsatgat * LG_i) + 1.0); \ - end else begin \ - vmaxgat = `vmaxlarge; \ - end \ - VMAX = min(min(vmaxbot, vmaxsti), vmaxgat); \ - `expl(VMAX * phitdinv, exp_VMAX_over_phitd) \ - \ - /* determination of minimum value of the relevant built-in voltages */ \ - /* and determination of limiting value of conditioned voltage for BBT calculation */ \ - vbibot2 = vbibot; \ - vbisti2 = vbisti; \ - vbigat2 = vbigat; \ - pbot2 = PBOT_i; \ - psti2 = PSTI_i; \ - pgat2 = PGAT_i; \ - vbibot2r = VBIRBOT_i; \ - vbisti2r = VBIRSTI_i; \ - vbigat2r = VBIRGAT_i; \ - if (AB_i == 0.0) begin \ - vbibot2 = vbisti + vbigat; \ - pbot2 = 0.9 * min(PSTI_i, PGAT_i); \ - vbibot2r = VBIRSTI_i + VBIRGAT_i; \ - end \ - if (LS_i == 0.0) begin \ - vbisti2 = vbibot + vbigat; \ - psti2 = 0.9 * min(PBOT_i, PGAT_i); \ - vbisti2r = VBIRBOT_i + VBIRGAT_i; \ - end \ - if (LG_i == 0.0) begin \ - vbigat2 = vbibot + vbisti; \ - pgat2 = 0.9 * min(PBOT_i, PSTI_i); \ - vbigat2r = VBIRBOT_i + VBIRSTI_i; \ - end \ - vbimin = min(min(vbibot2, vbisti2), vbigat2); \ - vch = vbimin * `epsch; \ - pmax = max(max(pbot2, psti2), pgat2); \ - vfmin = vbimin * (1.0 - (pow(`a, (-1.0 / (pmax))))); \ - vbbtlim = min(min(vbibot2r, vbisti2r), vbigat2r) - `dvbi; - - -// Special power-functions - -`define mypower(x,power,result) \ - if (power == 0.5) begin \ - result = sqrt(x); \ - end else begin \ - result = pow(x, power); \ - end - -`define mypower2(x,power,result) \ - if (power == -1.0) begin \ - result = 1.0 / (x); \ - end else begin \ - result = pow(x, power); \ - end - -`define mypower3(x,power,result) \ - if (power == 4.0) begin \ - result = (x) * (x) * (x) * (x); \ - end else begin \ - result = pow(abs(x), power); \ - end - -// Smoothing functions -`define hypfunction2(x,x0,eps,hyp2) \ - hyp2 = 0.5 * ((x) + (x0) - sqrt(((x) - (x0)) * ((x) - (x0)) + 4.0 * (eps) * (eps))); - -`define hypfunction5(x,x0,eps,hyp5) \ - h1 = 4.0 * (eps) * (eps); \ - h2 = (eps) / (x0); \ - h2d = (x) + (eps) * h2; \ - h3 = (x0) + h2d; \ - h4 = (x0) - h2d; \ - h5 = sqrt(h4 * h4 + h1); \ - hyp5 = 2.0 * ((x) * (x0) / (h3 + h5)); - - -// A special function used to calculate TAT-currents, -// including an approximation of the erfc-function - -`define calcerfcexpmtat(y,m,result) \ - ysq = y * y; \ - if (y > 0.0) begin \ - terfc = 1.0 / (1.0 + perfc * y); \ - end else begin \ - terfc = 1.0 / (1.0 - perfc * y); \ - end \ - `expl_low(-ysq + m, tmp) \ - erfcpos = (`aerfc * terfc + berfc * (terfc * terfc) + cerfc * (terfc * terfc * terfc)) * tmp; \ - if (y > 0.0) begin \ - result = erfcpos; \ - end else begin\ - `expl_low(m, tmp) \ - result = 2.0 * tmp - erfcpos; \ - end - -// This is the main function of the JUNCAP2-model. It returns the current and charge -// for a single diode -`define juncapfunction(VAK,qpref,qpref2,vbiinv,one_minus_P,idsat,CSRH,CTAT,vbi,wdepnulr,VBIRinv,P,ftd,btatpart,atat,one_over_one_minus_P,CBBT,VBIR,wdepnulrinv,fbbt,VBR,VBRinv,PBR,fstop,slope,Ijprime,Qjprime) \ - `mypower((1.0 - vj * vbiinv), one_minus_P, tmp) \ - Qjprime = CFACTOR_i * (qpref * (1.0 - tmp) + qpref2 * (VAK - vj)); \ - id = idsat * idmult; \ - if ((CSRH == 0.0) && (CTAT == 0.0)) begin \ - isrh = 0.0; \ - end else begin \ - vbi_minus_vjsrh = vbi-vjsrh; \ - wsrhstep = 1.0 - sqrt(1.0 - two_psistar / vbi_minus_vjsrh); \ - if (P == 0.5) begin \ - dwsrh = 0.0; \ - end else begin \ - dwsrh = ((wsrhstep * wsrhstep * ln(wsrhstep) / (1.0 - wsrhstep)) + wsrhstep) * (1.0 - 2.0 * P); \ - end \ - wsrh = wsrhstep + dwsrh; \ - `mypower(vbi_minus_vjsrh * VBIRinv, P, tmp) \ - wdep = wdepnulr * tmp; \ - asrh = ftd * ((zinv - 1.0) * wdep); \ - isrh = CSRH * (asrh * wsrh); \ - end \ - if (CTAT == 0.0) begin \ - itat = 0.0; \ - end else begin \ - btat = btatpart * ((wdep * one_minus_P) / vbi_minus_vjsrh); \ - twoatatoverthreebtat = (`twothirds * atat) / btat; \ - umaxbeforelimiting = twoatatoverthreebtat * twoatatoverthreebtat; \ - umax = sqrt(umaxbeforelimiting * umaxbeforelimiting / (umaxbeforelimiting * umaxbeforelimiting + 1.0)); \ - sqrtumax = sqrt(abs(umax)); \ - umaxpoweronepointfive = umax * sqrtumax; \ - `mypower2((1.0 + btat * umaxpoweronepointfive), (-P * one_over_one_minus_P), wgamma) \ - wtat = wsrh * wgamma / (wsrh + wgamma); \ - ktat = sqrt(0.375 * (btat / sqrtumax)); \ - ltat = 2.0 * (twoatatoverthreebtat * sqrtumax) - umax; \ - mtat = atat * twoatatoverthreebtat * sqrtumax - atat * umax + 0.5 * (btat * umaxpoweronepointfive); \ - xerfc = (ltat - 1.0) * ktat; \ - `calcerfcexpmtat(xerfc, mtat, erfctimesexpmtat) \ - gammamax = `SQRTPI * 0.5 * (atat * erfctimesexpmtat / ktat); \ - itat = CTAT * (asrh * gammamax * wtat); \ - end \ - if (CBBT == 0.0) begin \ - ibbt = 0.0; \ - end else begin \ - `mypower(((VBIR - vbbt) * VBIRinv), P, tmp) \ - Fmaxr = one_over_one_minus_P * ((VBIR - vbbt) * wdepnulrinv / tmp); \ - `expl(-fbbt / Fmaxr, tmp) \ - ibbt = CBBT * (VAK * Fmaxr * Fmaxr * tmp); \ - end \ - if (VBR > `vbrmax) begin \ - fbreakdown = 1.0; \ - end else begin \ - if (vav > -alphaav * VBR) begin \ - `mypower3(vav * VBRinv, PBR, tmp) \ - fbreakdown = 1.0 / (1.0 - tmp); \ - end else begin \ - fbreakdown = fstop + (vav + alphaav * VBR) * slope; \ - end \ - end \ - Ijprime = IFACTOR_i * (id + isrh + itat + ibbt) * fbreakdown; - - -// The following code is written as a macro because the naming of the instance parameters is -// different for JUNCAP2 stand-alone and JUNCAP2-in-PSP: AB, LS, LG for JUNCAP2 stand-alone, -// ABSOURCE, LSSOURCE, LGSOURCE for source junction in PSP and ABDRAIN, LSDRAIN, LGDRAIN for -// drain junction in PSP -`define juncapcommon(V, AB_i, LS_i, LG_i, qprefbot, qpref2bot, vbiinvbot, one_minus_PBOT, idsatbot, CSRHBOT_i, CTATBOT_i, vbibot, wdepnulrbot, VBIRBOTinv, PBOT_i, ftdbot, btatpartbot, atatbot, one_over_one_minus_PBOT, CBBTBOT_i, VBIRBOT_i, wdepnulrinvbot, fbbtbot, VBRBOT_i, VBRinvbot, PBRBOT_i, fstopbot, slopebot, qprefsti, qpref2sti, vbiinvsti, one_minus_PSTI, idsatsti, CSRHSTI_i, CTATSTI_i, vbisti, wdepnulrsti, VBIRSTIinv, PSTI_i, ftdsti, btatpartsti, atatsti, one_over_one_minus_PSTI, CBBTSTI_i, VBIRSTI_i, wdepnulrinvsti, fbbtsti, VBRSTI_i, VBRinvsti, PBRSTI_i, fstopsti, slopesti, qprefgat, qpref2gat, vbiinvgat, one_minus_PGAT, idsatgat, CSRHGAT_i, CTATGAT_i, vbigat, wdepnulrgat, VBIRGATinv, PGAT_i, ftdgat, btatpartgat, atatgat, one_over_one_minus_PGAT, CBBTGAT_i, VBIRGAT_i, wdepnulrinvgat, fbbtgat, VBRGAT_i, VBRinvgat, PBRGAT_i, fstopgat, slopegat, VMAX, exp_VMAX_over_phitd, vbimin, vch, vfmin, vbbtlim, ijunbot, qjunbot, ijunsti, qjunsti, ijungat, qjungat) \ - vbbt = 0.0; \ - two_psistar = 0.0; \ - if ( !( ((AB_i) == 0.0) && ((LS_i) == 0.0) && ((LG_i) == 0.0) ) ) begin \ - `hypfunction5(V, vfmin, vch, vj) \ - if (V < VMAX) begin \ - `expl(0.5 * (V * phitdinv), zinv) \ - idmult = zinv * zinv; \ - end else begin \ - idmult = (1.0 + (V - VMAX) * phitdinv) * exp_VMAX_over_phitd; \ - zinv = sqrt(idmult); \ - end \ - idmult = idmult - 1.0; \ - z = 1.0 / zinv; \ - if (V > 0.0) begin \ - two_psistar = 2.0 * (phitd * ln(2.0 + z + sqrt((z + 1.0) * (z + 3.0)))); \ - end else begin \ - two_psistar = -V + 2.0 * (phitd * ln(2.0 * zinv + 1.0 + sqrt((1.0 + zinv) * (1.0 + 3.0 * zinv)))); \ - end \ - vjlim = vbimin - two_psistar; \ - `hypfunction2(V, vjlim, phitd, vjsrh) \ - `hypfunction2(V, vbbtlim, phitr, vbbt) \ - `hypfunction2(V, 0.0, `epsav, vav) \ - end \ - if ((AB_i) == 0.0) begin \ - ijunbot = 0.0; \ - qjunbot = 0.0; \ - end else begin \ - `juncapfunction(V, qprefbot, qpref2bot, vbiinvbot, one_minus_PBOT, idsatbot, CSRHBOT_i, CTATBOT_i, vbibot, wdepnulrbot, VBIRBOTinv, PBOT_i, ftdbot, btatpartbot, atatbot, one_over_one_minus_PBOT, CBBTBOT_i, VBIRBOT_i, wdepnulrinvbot, fbbtbot, VBRBOT_i, VBRinvbot, PBRBOT_i, fstopbot, slopebot, ijunbot, qjunbot) \ - end \ - if ((LS_i) == 0.0) begin \ - ijunsti = 0.0; \ - qjunsti = 0.0; \ - end else begin \ - `juncapfunction(V, qprefsti, qpref2sti, vbiinvsti, one_minus_PSTI, idsatsti, CSRHSTI_i, CTATSTI_i, vbisti, wdepnulrsti, VBIRSTIinv, PSTI_i, ftdsti, btatpartsti, atatsti, one_over_one_minus_PSTI, CBBTSTI_i, VBIRSTI_i, wdepnulrinvsti, fbbtsti, VBRSTI_i, VBRinvsti, PBRSTI_i, fstopsti, slopesti, ijunsti, qjunsti) \ - end \ - if ((LG_i) == 0.0) begin \ - ijungat = 0.0; \ - qjungat = 0.0; \ - end else begin \ - `juncapfunction(V, qprefgat, qpref2gat, vbiinvgat, one_minus_PGAT, idsatgat, CSRHGAT_i, CTATGAT_i, vbigat, wdepnulrgat, VBIRGATinv, PGAT_i, ftdgat, btatpartgat, atatgat, one_over_one_minus_PGAT, CBBTGAT_i, VBIRGAT_i, wdepnulrinvgat, fbbtgat, VBRGAT_i, VBRinvgat, PBRGAT_i, fstopgat, slopegat, ijungat, qjungat) \ - end - -//============================================================================================================ -// JUNCAP-express -// -// The macros below are used in the express-version of JUNCAP2 -//============================================================================================================ - -`define relerr 1.0e-3 -`define P1(x) ((x) + 1.0) - -`define expll(x, xlow, expxlow, xhigh, expxhigh) \ - ((x) < (xlow)) ? (expxlow) / `P1((xlow) - (x)) : (((x) > (xhigh)) ? (expxhigh) * `P1((x) - (xhigh)) : exp(x)) - - -// The "JuncapExpressInit"-macro below is split into three parts, as some verilog-A compilers cannot handle -// macros beyond a certain size. Moreover, it is useful to limit the list of input and output variables. - -// Part 1 -`define JuncapExpressInit1(AB_i, LS_i, LG_i, VJUNREF_i, qprefbot, qpref2bot, vbiinvbot, one_minus_PBOT, idsatbot, CSRHBOT_i, CTATBOT_i, vbibot, wdepnulrbot, VBIRBOTinv, PBOT_i, ftdbot, btatpartbot, atatbot, one_over_one_minus_PBOT, CBBTBOT_i, VBIRBOT_i, wdepnulrinvbot, fbbtbot, VBRBOT_i, VBRinvbot, PBRBOT_i, fstopbot, slopebot, qprefsti, qpref2sti, vbiinvsti, one_minus_PSTI, idsatsti, CSRHSTI_i, CTATSTI_i, vbisti, wdepnulrsti, VBIRSTIinv, PSTI_i, ftdsti, btatpartsti, atatsti, one_over_one_minus_PSTI, CBBTSTI_i, VBIRSTI_i, wdepnulrinvsti, fbbtsti, VBRSTI_i, VBRinvsti, PBRSTI_i, fstopsti, slopesti, qprefgat, qpref2gat, vbiinvgat, one_minus_PGAT, idsatgat, CSRHGAT_i, CTATGAT_i, vbigat, wdepnulrgat, VBIRGATinv, PGAT_i, ftdgat, btatpartgat, atatgat, one_over_one_minus_PGAT, CBBTGAT_i, VBIRGAT_i, wdepnulrinvgat, fbbtgat, VBRGAT_i, VBRinvgat, PBRGAT_i, fstopgat, slopegat, VMAX, exp_VMAX_over_phitd, vbimin, vch, vfmin, vbbtlim) \ - FRACNA = 0.4; \ - FRACNB = 0.65; \ - FRACI = 0.8; \ - /* Sample voltages */ \ - V1 = -FRACNA * VJUNREF_i; \ - V2 = -FRACNB * VJUNREF_i; \ - V3 = -FRACI * VJUNREF_i; \ - V4 = 0.1; \ - V5 = 0.2; \ - /* evaluate full JUNCAP-model at five voltages */ \ - `juncapcommon(V1, AB_i, LS_i, LG_i, qprefbot, qpref2bot, vbiinvbot, one_minus_PBOT, idsatbot, CSRHBOT_i, CTATBOT_i, vbibot, wdepnulrbot, VBIRBOTinv, PBOT_i, ftdbot, btatpartbot, atatbot, one_over_one_minus_PBOT, CBBTBOT_i, VBIRBOT_i, wdepnulrinvbot, fbbtbot, VBRBOT_i, VBRinvbot, PBRBOT_i, fstopbot, slopebot, qprefsti, qpref2sti, vbiinvsti, one_minus_PSTI, idsatsti, CSRHSTI_i, CTATSTI_i, vbisti, wdepnulrsti, VBIRSTIinv, PSTI_i, ftdsti, btatpartsti, atatsti, one_over_one_minus_PSTI, CBBTSTI_i, VBIRSTI_i, wdepnulrinvsti, fbbtsti, VBRSTI_i, VBRinvsti, PBRSTI_i, fstopsti, slopesti, qprefgat, qpref2gat, vbiinvgat, one_minus_PGAT, idsatgat, CSRHGAT_i, CTATGAT_i, vbigat, wdepnulrgat, VBIRGATinv, PGAT_i, ftdgat, btatpartgat, atatgat, one_over_one_minus_PGAT, CBBTGAT_i, VBIRGAT_i, wdepnulrinvgat, fbbtgat, VBRGAT_i, VBRinvgat, PBRGAT_i, fstopgat, slopegat, VMAX, exp_VMAX_over_phitd, vbimin, vch, vfmin, vbbtlim, ijunbot, qjunbot, ijunsti, qjunsti, ijungat, qjungat) \ - I1 = AB_i * ijunbot + LS_i * ijunsti + LG_i * ijungat; \ - `juncapcommon(V2, AB_i, LS_i, LG_i, qprefbot, qpref2bot, vbiinvbot, one_minus_PBOT, idsatbot, CSRHBOT_i, CTATBOT_i, vbibot, wdepnulrbot, VBIRBOTinv, PBOT_i, ftdbot, btatpartbot, atatbot, one_over_one_minus_PBOT, CBBTBOT_i, VBIRBOT_i, wdepnulrinvbot, fbbtbot, VBRBOT_i, VBRinvbot, PBRBOT_i, fstopbot, slopebot, qprefsti, qpref2sti, vbiinvsti, one_minus_PSTI, idsatsti, CSRHSTI_i, CTATSTI_i, vbisti, wdepnulrsti, VBIRSTIinv, PSTI_i, ftdsti, btatpartsti, atatsti, one_over_one_minus_PSTI, CBBTSTI_i, VBIRSTI_i, wdepnulrinvsti, fbbtsti, VBRSTI_i, VBRinvsti, PBRSTI_i, fstopsti, slopesti, qprefgat, qpref2gat, vbiinvgat, one_minus_PGAT, idsatgat, CSRHGAT_i, CTATGAT_i, vbigat, wdepnulrgat, VBIRGATinv, PGAT_i, ftdgat, btatpartgat, atatgat, one_over_one_minus_PGAT, CBBTGAT_i, VBIRGAT_i, wdepnulrinvgat, fbbtgat, VBRGAT_i, VBRinvgat, PBRGAT_i, fstopgat, slopegat, VMAX, exp_VMAX_over_phitd, vbimin, vch, vfmin, vbbtlim, ijunbot, qjunbot, ijunsti, qjunsti, ijungat, qjungat) \ - I2 = AB_i * ijunbot + LS_i * ijunsti + LG_i * ijungat; \ - `juncapcommon(V3, AB_i, LS_i, LG_i, qprefbot, qpref2bot, vbiinvbot, one_minus_PBOT, idsatbot, CSRHBOT_i, CTATBOT_i, vbibot, wdepnulrbot, VBIRBOTinv, PBOT_i, ftdbot, btatpartbot, atatbot, one_over_one_minus_PBOT, CBBTBOT_i, VBIRBOT_i, wdepnulrinvbot, fbbtbot, VBRBOT_i, VBRinvbot, PBRBOT_i, fstopbot, slopebot, qprefsti, qpref2sti, vbiinvsti, one_minus_PSTI, idsatsti, CSRHSTI_i, CTATSTI_i, vbisti, wdepnulrsti, VBIRSTIinv, PSTI_i, ftdsti, btatpartsti, atatsti, one_over_one_minus_PSTI, CBBTSTI_i, VBIRSTI_i, wdepnulrinvsti, fbbtsti, VBRSTI_i, VBRinvsti, PBRSTI_i, fstopsti, slopesti, qprefgat, qpref2gat, vbiinvgat, one_minus_PGAT, idsatgat, CSRHGAT_i, CTATGAT_i, vbigat, wdepnulrgat, VBIRGATinv, PGAT_i, ftdgat, btatpartgat, atatgat, one_over_one_minus_PGAT, CBBTGAT_i, VBIRGAT_i, wdepnulrinvgat, fbbtgat, VBRGAT_i, VBRinvgat, PBRGAT_i, fstopgat, slopegat, VMAX, exp_VMAX_over_phitd, vbimin, vch, vfmin, vbbtlim, ijunbot, qjunbot, ijunsti, qjunsti, ijungat, qjungat) \ - I3 = AB_i * ijunbot + LS_i * ijunsti + LG_i * ijungat; - -// Part 2 -`define JuncapExpressInit2(AB_i, LS_i, LG_i, qprefbot, qpref2bot, vbiinvbot, one_minus_PBOT, idsatbot, CSRHBOT_i, CTATBOT_i, vbibot, wdepnulrbot, VBIRBOTinv, PBOT_i, ftdbot, btatpartbot, atatbot, one_over_one_minus_PBOT, CBBTBOT_i, VBIRBOT_i, wdepnulrinvbot, fbbtbot, VBRBOT_i, VBRinvbot, PBRBOT_i, fstopbot, slopebot, qprefsti, qpref2sti, vbiinvsti, one_minus_PSTI, idsatsti, CSRHSTI_i, CTATSTI_i, vbisti, wdepnulrsti, VBIRSTIinv, PSTI_i, ftdsti, btatpartsti, atatsti, one_over_one_minus_PSTI, CBBTSTI_i, VBIRSTI_i, wdepnulrinvsti, fbbtsti, VBRSTI_i, VBRinvsti, PBRSTI_i, fstopsti, slopesti, qprefgat, qpref2gat, vbiinvgat, one_minus_PGAT, idsatgat, CSRHGAT_i, CTATGAT_i, vbigat, wdepnulrgat, VBIRGATinv, PGAT_i, ftdgat, btatpartgat, atatgat, one_over_one_minus_PGAT, CBBTGAT_i, VBIRGAT_i, wdepnulrinvgat, fbbtgat, VBRGAT_i, VBRinvgat, PBRGAT_i, fstopgat, slopegat, VMAX, exp_VMAX_over_phitd, vbimin, vch, vfmin, vbbtlim) \ - /* forward currents */ \ - `juncapcommon(V4, AB_i, LS_i, LG_i, qprefbot, qpref2bot, vbiinvbot, one_minus_PBOT, idsatbot, CSRHBOT_i, CTATBOT_i, vbibot, wdepnulrbot, VBIRBOTinv, PBOT_i, ftdbot, btatpartbot, atatbot, one_over_one_minus_PBOT, CBBTBOT_i, VBIRBOT_i, wdepnulrinvbot, fbbtbot, VBRBOT_i, VBRinvbot, PBRBOT_i, fstopbot, slopebot, qprefsti, qpref2sti, vbiinvsti, one_minus_PSTI, idsatsti, CSRHSTI_i, CTATSTI_i, vbisti, wdepnulrsti, VBIRSTIinv, PSTI_i, ftdsti, btatpartsti, atatsti, one_over_one_minus_PSTI, CBBTSTI_i, VBIRSTI_i, wdepnulrinvsti, fbbtsti, VBRSTI_i, VBRinvsti, PBRSTI_i, fstopsti, slopesti, qprefgat, qpref2gat, vbiinvgat, one_minus_PGAT, idsatgat, CSRHGAT_i, CTATGAT_i, vbigat, wdepnulrgat, VBIRGATinv, PGAT_i, ftdgat, btatpartgat, atatgat, one_over_one_minus_PGAT, CBBTGAT_i, VBIRGAT_i, wdepnulrinvgat, fbbtgat, VBRGAT_i, VBRinvgat, PBRGAT_i, fstopgat, slopegat, VMAX, exp_VMAX_over_phitd, vbimin, vch, vfmin, vbbtlim, ijunbot, qjunbot, ijunsti, qjunsti, ijungat, qjungat) \ - I4 = AB_i * ijunbot + LS_i * ijunsti + LG_i * ijungat; \ - `juncapcommon(V5, AB_i, LS_i, LG_i, qprefbot, qpref2bot, vbiinvbot, one_minus_PBOT, idsatbot, CSRHBOT_i, CTATBOT_i, vbibot, wdepnulrbot, VBIRBOTinv, PBOT_i, ftdbot, btatpartbot, atatbot, one_over_one_minus_PBOT, CBBTBOT_i, VBIRBOT_i, wdepnulrinvbot, fbbtbot, VBRBOT_i, VBRinvbot, PBRBOT_i, fstopbot, slopebot, qprefsti, qpref2sti, vbiinvsti, one_minus_PSTI, idsatsti, CSRHSTI_i, CTATSTI_i, vbisti, wdepnulrsti, VBIRSTIinv, PSTI_i, ftdsti, btatpartsti, atatsti, one_over_one_minus_PSTI, CBBTSTI_i, VBIRSTI_i, wdepnulrinvsti, fbbtsti, VBRSTI_i, VBRinvsti, PBRSTI_i, fstopsti, slopesti, qprefgat, qpref2gat, vbiinvgat, one_minus_PGAT, idsatgat, CSRHGAT_i, CTATGAT_i, vbigat, wdepnulrgat, VBIRGATinv, PGAT_i, ftdgat, btatpartgat, atatgat, one_over_one_minus_PGAT, CBBTGAT_i, VBIRGAT_i, wdepnulrinvgat, fbbtgat, VBRGAT_i, VBRinvgat, PBRGAT_i, fstopgat, slopegat, VMAX, exp_VMAX_over_phitd, vbimin, vch, vfmin, vbbtlim, ijunbot, qjunbot, ijunsti, qjunsti, ijungat, qjungat) \ - I5 = AB_i * ijunbot + LS_i * ijunsti + LG_i * ijungat; - -// Part 3 -`define JuncapExpressInit3(AB_i, LS_i, LG_i, idsatbot, idsatsti, idsatgat, ISATFOR1, MFOR1, ISATFOR2, MFOR2, ISATREV, MREV, m0flag) \ - /* compute internal parameters from these five (I,V)-values */ \ - ISATFOR1 = AB_i * idsatbot + LS_i * idsatsti + LG_i * idsatgat; \ - I4_cor = I4 - ISATFOR1 * (exp(V4 * phitdinv * MFOR1) - 1.0); \ - I5_cor = I5 - ISATFOR1 * (exp(V5 * phitdinv * MFOR1) - 1.0); \ - if ( !( ((AB_i) == 0.0) && ((LS_i) == 0.0) && ((LG_i) == 0.0) ) ) begin \ - if ((I4 > 0.0) && (I5 > 0.0)) begin \ - if ((((I4_cor / I4) > `relerr) || ((I5_cor / I5) > `relerr)) && (I4_cor > 0.0) && (I5_cor > 0.0) && (I5_cor > I4_cor)) begin \ - alphaje = I4_cor / I5_cor; \ - MFOR2 = phitd * ln(alphaje) / (V4 - V5); \ - ISATFOR2 = I4_cor / (exp(V4 * phitdinv * MFOR2) - 1.0); \ - end \ - end \ - I1_cor = I1 - ISATFOR1 * (exp(V1 * phitdinv * MFOR1) - 1.0) - ISATFOR2 * (exp(V1 * phitdinv * MFOR2) - 1.0); \ - I2_cor = I2 - ISATFOR1 * (exp(V2 * phitdinv * MFOR1) - 1.0) - ISATFOR2 * (exp(V2 * phitdinv * MFOR2) - 1.0); \ - I3_cor = I3 - ISATFOR1 * (exp(V3 * phitdinv * MFOR1) - 1.0) - ISATFOR2 * (exp(V3 * phitdinv * MFOR2) - 1.0); \ - if ((I1 < 0.0) && (I2 < 0.0) && (I3 < 0.0)) begin \ - if ((((I1_cor / I1) > `relerr) || ((I2_cor / I2) > `relerr) || ((I3_cor / I3) > `relerr)) \ - && (I1_cor < 0.0) && (I2_cor < 0.0) && (I3_cor < 0.0)) begin \ - alphaje = I1_cor / I2_cor; \ - m0_rev = -phitd * ln(alphaje) / (V1 - V2); /* zeroth order approximation */ \ - tt0 = V2 / (V2 - V1); \ - tt1 = phitd * (alphaje - 1.0) * (pow(alphaje, tt0) - 1.0); \ - tt0 = V1 / (V1 - V2); \ - tt2 = pow(alphaje, tt0) * (V2 - V1) + alphaje * V1 - V2; \ - mcor_rev = tt1 / tt2; /* first order Newton correction */ \ - MREV = m0_rev + mcor_rev; \ - if (abs(V3 * phitdinv * MREV) < 1.0e-6) begin \ - /* Taylor approximation needed */ \ - /* Note: ISATREV and MREV have different meaning in this situation!! */ \ - m0flag = 1.0; \ - ISATREV = I3_cor * (1.0 / V3 + 0.5 * phitdinv * MREV); \ - MREV = -0.5 * I3_cor * MREV * phitdinv / V3; \ - end else begin \ - m0flag = 0.0; \ - ISATREV = -I3_cor / (exp(-V3 * phitdinv * MREV) - 1.0); \ - end \ - end \ - end \ - end - -// Part 4 -`define JuncapExpressInit4(AB_i, LS_i, LG_i, FJUNQ_i, cjobot, cjosti, cjogat, zflagbot, zflagsti, zflaggat) \ - /* charge model initialization */ \ - zfrac = FJUNQ_i * (AB_i * cjobot + LS_i * cjosti + LG_i * cjogat); \ - if ((AB_i * cjobot) <= zfrac) begin \ - zflagbot = 0.0; \ - end \ - if ((LS_i * cjosti) <= zfrac) begin \ - zflagsti = 0.0; \ - end \ - if ((LG_i * cjogat) <= zfrac) begin \ - zflaggat = 0.0; \ - end - -// Part 5 -`define JuncapExpressInit5(AB_i, LS_i, LG_i, ISATFOR1, ISATFOR2, ISATREV, xhighf1, expxhf1, xhighf2, expxhf2, xhighr, expxhr) \ - /* calculate limits beyond which exponentials are linearly extrapolated */ \ - if ( !( ((AB_i) == 0.0) && ((LS_i) == 0.0) && ((LG_i) == 0.0) ) ) begin \ - xhighf1 = ln(0.5 * IMAX_i / (ISATFOR1 + 1.0e-21)); \ - xhighf2 = ln(0.5 * IMAX_i / (ISATFOR2 + 1.0e-21)); \ - xhighr = ln(0.5 * IMAX_i / (abs(ISATREV) + 1.0e-21)); \ - end \ - xhighf1 = min(xhighf1, `se05); \ - expxhf1 = exp(xhighf1); \ - xhighf2 = min(xhighf2, `se05); \ - expxhf2 = exp(xhighf2); \ - xhighr = min(xhighr, `se05); \ - expxhr = exp(xhighr); - -`define JuncapExpressCurrent(V, MFOR1, ISATFOR1, MFOR2, ISATFOR2, MREV, ISATREV, m0flag, xhighf1, expxhf1, xhighf2, expxhf2, xhighr, expxhr, ijun) \ - tm0 = V * phitdinv * MFOR1; \ - tm1 = `expll(tm0, -`se05, `ke05, xhighf1, expxhf1); \ - ijunfor1 = ISATFOR1 * (tm1 - 1.0); \ - tm0 = V * phitdinv * MFOR2; \ - tm1 = `expll(tm0, -`se05, `ke05, xhighf2, expxhf2); \ - ijunfor2 = ISATFOR2 * (tm1 - 1.0); \ - ijunrev = 0.0; \ - if (m0flag > 0.0) begin \ - ijunrev = V * (ISATREV + V * MREV); \ - end else begin \ - tm0 = -V * phitdinv * MREV; \ - tm1 = `expll(tm0, -`se05, `ke05, xhighr, expxhr); \ - ijunrev = -ISATREV * (tm1 - 1.0); \ - end \ - ijun = ijunfor1 + ijunfor2 + ijunrev; - -`define JuncapExpressCharge(V, AB_i, LS_i, LG_i, qprefbot, qprefsti, qprefgat, qpref2bot, qpref2sti, qpref2gat, vbiinvbot, vbiinvsti, vbiinvgat, one_minus_PBOT, one_minus_PSTI, one_minus_PGAT, vfmin, vch, zflagbot, zflagsti, zflaggat, qjunbot, qjunsti, qjungat) \ - tmpv = 0.0; \ - vjv = 0.0; \ - `hypfunction5(V, vfmin, vch, vjv) \ - if (zflagbot > 0.5) begin \ - `mypower((1.0 - vjv * vbiinvbot), one_minus_PBOT, tmpv) \ - qjunbot = qprefbot * (1.0 - tmpv) + qpref2bot * (V - vjv); \ - end \ - if (zflagsti > 0.5) begin \ - `mypower((1.0 - vjv * vbiinvsti), one_minus_PSTI, tmpv) \ - qjunsti = qprefsti * (1.0 - tmpv) + qpref2sti * (V - vjv); \ - end \ - if (zflaggat > 0.5) begin \ - `mypower((1.0 - vjv * vbiinvgat), one_minus_PGAT, tmpv) \ - qjungat = qprefgat * (1.0 - tmpv) + qpref2gat * (V - vjv); \ - end - diff --git a/src/spicelib/devices/adms/psp103/admsva/JUNCAP200_parlist.include b/src/spicelib/devices/adms/psp103/admsva/JUNCAP200_parlist.include deleted file mode 100644 index d953fd91c..000000000 --- a/src/spicelib/devices/adms/psp103/admsva/JUNCAP200_parlist.include +++ /dev/null @@ -1,181 +0,0 @@ -//====================================================================================== -//====================================================================================== -// Filename: JUNCAP200_parlist.include -//====================================================================================== -//====================================================================================== -// -// (c) Copyright notice -// -// Since 2015 until today, PSP has been co-developed by NXP Semiconductors and -// CEA-Leti. For this part of the model, each claim undivided ownership and copyrights -// Since 2012 until 2015, PSP has been co-developed by NXP Semiconductors and -// Delft University of Technology. For this part of the model, each claim undivided -// ownership and copyrights -// Until and including 2011, PSP has been co-developed by NXP Semiconductors and -// Arizona State University. For this part of the model, NXP Semiconductors claims -// undivided ownership and copyrights. -// -// -// Version: 200.6.0, April 2019 -// -//====================================================================================== -//====================================================================================== -// -// Further information can be found in the file releasenotesPSP103.txt -// - -// -------------------------------------------------------------------------------------------------------------- -// JUNCAP2 - Reduced parameter list -// -------------------------------------------------------------------------------------------------------------- - -`MPRco(IMAX ,1000.0 ,"A" ,`IMAX_cliplow ,inf ,"Maximum current up to which forward current behaves exponentially") -`MPRco(TRJ ,21.0 ,"degC" ,`TRJ_cliplow ,inf ,"Reference temperature") -`MPRcc(FREV ,1.0e3 ,"" ,`FREV_cliplow ,`FREV_cliphigh ,"Coefficient for reverse breakdown current limitation") -`IPRcz(IFACTOR ,1.0 ,"" ,"Multiplier for current") -`IPRcz(CFACTOR ,1.0 ,"" ,"Multiplier for depletion capacitance") - -// Parameters for source-bulk junction -`ifdef JUNCAP_StandAlone - `MPRco(CJORBOT ,1.0e-3 ,"Fm^-2" ,`CJORBOT_cliplow ,inf ,"Zero-bias capacitance per unit-of-area of bottom component") - `MPRco(CJORSTI ,1.0e-9 ,"Fm^-1" ,`CJORSTI_cliplow ,inf ,"Zero-bias capacitance per unit-of-length of STI-edge component") - `MPRco(CJORGAT ,1.0e-9 ,"Fm^-1" ,`CJORGAT_cliplow ,inf ,"Zero-bias capacitance per unit-of-length of gate-edge component") - `MPRco(VBIRBOT ,1.0 ,"V" ,`VBIR_cliplow ,inf ,"Built-in voltage at the reference temperature of bottom component") - `MPRco(VBIRSTI ,1.0 ,"V" ,`VBIR_cliplow ,inf ,"Built-in voltage at the reference temperature of STI-edge component") - `MPRco(VBIRGAT ,1.0 ,"V" ,`VBIR_cliplow ,inf ,"Built-in voltage at the reference temperature of gate-edge component") - `MPRcc(PBOT ,0.5 ,"" ,`P_cliplow ,`P_cliphigh ,"Grading coefficient of bottom component") - `MPRcc(PSTI ,0.5 ,"" ,`P_cliplow ,`P_cliphigh ,"Grading coefficient of STI-edge component") - `MPRcc(PGAT ,0.5 ,"" ,`P_cliplow ,`P_cliphigh ,"Grading coefficient of gate-edge component") - `MPRnb(PHIGBOT ,1.16 ,"V" ,"Zero-temperature bandgap voltage of bottom component") - `MPRnb(PHIGSTI ,1.16 ,"V" ,"Zero-temperature bandgap voltage of STI-edge component") - `MPRnb(PHIGGAT ,1.16 ,"V" ,"Zero-temperature bandgap voltage of gate-edge component") - `MPRco(IDSATRBOT ,1.0e-12 ,"Am^-2" ,`IDSATR_cliplow ,inf ,"Saturation current density at the reference temperature of bottom component") - `MPRco(IDSATRSTI ,1.0e-18 ,"Am^-1" ,`IDSATR_cliplow ,inf ,"Saturation current density at the reference temperature of STI-edge component") - `MPRco(IDSATRGAT ,1.0e-18 ,"Am^-1" ,`IDSATR_cliplow ,inf ,"Saturation current density at the reference temperature of gate-edge component") - `MPRco(CSRHBOT ,1.0e2 ,"Am^-3" ,`CSRH_cliplow ,inf ,"Shockley-Read-Hall prefactor of bottom component") - `MPRco(CSRHSTI ,1.0e-4 ,"Am^-2" ,`CSRH_cliplow ,inf ,"Shockley-Read-Hall prefactor of STI-edge component") - `MPRco(CSRHGAT ,1.0e-4 ,"Am^-2" ,`CSRH_cliplow ,inf ,"Shockley-Read-Hall prefactor of gate-edge component") - `MPRco(XJUNSTI ,1.0e-7 ,"m" ,`XJUN_cliplow ,inf ,"Junction depth of STI-edge component") - `MPRco(XJUNGAT ,1.0e-7 ,"m" ,`XJUN_cliplow ,inf ,"Junction depth of gate-edge component") - `MPRco(CTATBOT ,1.0e2 ,"Am^-3" ,`CTAT_cliplow ,inf ,"Trap-assisted tunneling prefactor of bottom component") - `MPRco(CTATSTI ,1.0e-4 ,"Am^-2" ,`CTAT_cliplow ,inf ,"Trap-assisted tunneling prefactor of STI-edge component") - `MPRco(CTATGAT ,1.0e-4 ,"Am^-2" ,`CTAT_cliplow ,inf ,"Trap-assisted tunneling prefactor of gate-edge component") - `MPRco(MEFFTATBOT ,0.25 ,"" ,`MEFFTAT_cliplow ,inf ,"Effective mass (in units of m0) for trap-assisted tunneling of bottom component") - `MPRco(MEFFTATSTI ,0.25 ,"" ,`MEFFTAT_cliplow ,inf ,"Effective mass (in units of m0) for trap-assisted tunneling of STI-edge component") - `MPRco(MEFFTATGAT ,0.25 ,"" ,`MEFFTAT_cliplow ,inf ,"Effective mass (in units of m0) for trap-assisted tunneling of gate-edge component") - `MPRco(CBBTBOT ,1.0e-12 ,"AV^-3" ,`CBBT_cliplow ,inf ,"Band-to-band tunneling prefactor of bottom component") - `MPRco(CBBTSTI ,1.0e-18 ,"AV^-3m" ,`CBBT_cliplow ,inf ,"Band-to-band tunneling prefactor of STI-edge component") - `MPRco(CBBTGAT ,1.0e-18 ,"AV^-3m" ,`CBBT_cliplow ,inf ,"Band-to-band tunneling prefactor of gate-edge component") - `MPRnb(FBBTRBOT ,1.0e9 ,"Vm^-1" ,"Normalization field at the reference temperature for band-to-band tunneling of bottom component") - `MPRnb(FBBTRSTI ,1.0e9 ,"Vm^-1" ,"Normalization field at the reference temperature for band-to-band tunneling of STI-edge component") - `MPRnb(FBBTRGAT ,1.0e9 ,"Vm^-1" ,"Normalization field at the reference temperature for band-to-band tunneling of gate-edge component") - `MPRnb(STFBBTBOT ,-1.0e-3 ,"K^-1" ,"Temperature scaling parameter for band-to-band tunneling of bottom component") - `MPRnb(STFBBTSTI ,-1.0e-3 ,"K^-1" ,"Temperature scaling parameter for band-to-band tunneling of STI-edge component") - `MPRnb(STFBBTGAT ,-1.0e-3 ,"K^-1" ,"Temperature scaling parameter for band-to-band tunneling of gate-edge component") - `MPRco(VBRBOT ,10.0 ,"V" ,`VBR_cliplow ,inf ,"Breakdown voltage of bottom component") - `MPRco(VBRSTI ,10.0 ,"V" ,`VBR_cliplow ,inf ,"Breakdown voltage of STI-edge component") - `MPRco(VBRGAT ,10.0 ,"V" ,`VBR_cliplow ,inf ,"Breakdown voltage of gate-edge component") - `MPRco(PBRBOT ,4.0 ,"V" ,`PBR_cliplow ,inf ,"Breakdown onset tuning parameter of bottom component") - `MPRco(PBRSTI ,4.0 ,"V" ,`PBR_cliplow ,inf ,"Breakdown onset tuning parameter of STI-edge component") - `MPRco(PBRGAT ,4.0 ,"V" ,`PBR_cliplow ,inf ,"Breakdown onset tuning parameter of gate-edge component") -`else // JUNCAP_StandAlone - `MPRco(CJORBOT ,1.0e-3 ,"Fm^-2" ,`CJORBOT_cliplow ,inf ,"Zero-bias capacitance per unit-of-area of bottom component for source-bulk junction") - `MPRco(CJORSTI ,1.0e-9 ,"Fm^-1" ,`CJORSTI_cliplow ,inf ,"Zero-bias capacitance per unit-of-length of STI-edge component for source-bulk junction") - `MPRco(CJORGAT ,1.0e-9 ,"Fm^-1" ,`CJORGAT_cliplow ,inf ,"Zero-bias capacitance per unit-of-length of gate-edge component for source-bulk junction") - `MPRco(VBIRBOT ,1.0 ,"V" ,`VBIR_cliplow ,inf ,"Built-in voltage at the reference temperature of bottom component for source-bulk junction") - `MPRco(VBIRSTI ,1.0 ,"V" ,`VBIR_cliplow ,inf ,"Built-in voltage at the reference temperature of STI-edge component for source-bulk junction") - `MPRco(VBIRGAT ,1.0 ,"V" ,`VBIR_cliplow ,inf ,"Built-in voltage at the reference temperature of gate-edge component for source-bulk junction") - `MPRcc(PBOT ,0.5 ,"" ,`P_cliplow ,`P_cliphigh ,"Grading coefficient of bottom component for source-bulk junction") - `MPRcc(PSTI ,0.5 ,"" ,`P_cliplow ,`P_cliphigh ,"Grading coefficient of STI-edge component for source-bulk junction") - `MPRcc(PGAT ,0.5 ,"" ,`P_cliplow ,`P_cliphigh ,"Grading coefficient of gate-edge component for source-bulk junction") - `MPRnb(PHIGBOT ,1.16 ,"V" ,"Zero-temperature bandgap voltage of bottom component for source-bulk junction") - `MPRnb(PHIGSTI ,1.16 ,"V" ,"Zero-temperature bandgap voltage of STI-edge component for source-bulk junction") - `MPRnb(PHIGGAT ,1.16 ,"V" ,"Zero-temperature bandgap voltage of gate-edge component for source-bulk junction") - `MPRco(IDSATRBOT ,1.0e-12 ,"Am^-2" ,`IDSATR_cliplow ,inf ,"Saturation current density at the reference temperature of bottom component for source-bulk junction") - `MPRco(IDSATRSTI ,1.0e-18 ,"Am^-1" ,`IDSATR_cliplow ,inf ,"Saturation current density at the reference temperature of STI-edge component for source-bulk junction") - `MPRco(IDSATRGAT ,1.0e-18 ,"Am^-1" ,`IDSATR_cliplow ,inf ,"Saturation current density at the reference temperature of gate-edge component for source-bulk junction") - `MPRco(CSRHBOT ,1.0e2 ,"Am^-3" ,`CSRH_cliplow ,inf ,"Shockley-Read-Hall prefactor of bottom component for source-bulk junction") - `MPRco(CSRHSTI ,1.0e-4 ,"Am^-2" ,`CSRH_cliplow ,inf ,"Shockley-Read-Hall prefactor of STI-edge component for source-bulk junction") - `MPRco(CSRHGAT ,1.0e-4 ,"Am^-2" ,`CSRH_cliplow ,inf ,"Shockley-Read-Hall prefactor of gate-edge component for source-bulk junction") - `MPRco(XJUNSTI ,1.0e-7 ,"m" ,`XJUN_cliplow ,inf ,"Junction depth of STI-edge component for source-bulk junction") - `MPRco(XJUNGAT ,1.0e-7 ,"m" ,`XJUN_cliplow ,inf ,"Junction depth of gate-edge component for source-bulk junction") - `MPRco(CTATBOT ,1.0e2 ,"Am^-3" ,`CTAT_cliplow ,inf ,"Trap-assisted tunneling prefactor of bottom component for source-bulk junction") - `MPRco(CTATSTI ,1.0e-4 ,"Am^-2" ,`CTAT_cliplow ,inf ,"Trap-assisted tunneling prefactor of STI-edge component for source-bulk junction") - `MPRco(CTATGAT ,1.0e-4 ,"Am^-2" ,`CTAT_cliplow ,inf ,"Trap-assisted tunneling prefactor of gate-edge component for source-bulk junction") - `MPRco(MEFFTATBOT ,0.25 ,"" ,`MEFFTAT_cliplow ,inf ,"Effective mass (in units of m0) for trap-assisted tunneling of bottom component for source-bulk junction") - `MPRco(MEFFTATSTI ,0.25 ,"" ,`MEFFTAT_cliplow ,inf ,"Effective mass (in units of m0) for trap-assisted tunneling of STI-edge component for source-bulk junction") - `MPRco(MEFFTATGAT ,0.25 ,"" ,`MEFFTAT_cliplow ,inf ,"Effective mass (in units of m0) for trap-assisted tunneling of gate-edge component for source-bulk junction") - `MPRco(CBBTBOT ,1.0e-12 ,"AV^-3" ,`CBBT_cliplow ,inf ,"Band-to-band tunneling prefactor of bottom component for source-bulk junction") - `MPRco(CBBTSTI ,1.0e-18 ,"AV^-3m" ,`CBBT_cliplow ,inf ,"Band-to-band tunneling prefactor of STI-edge component for source-bulk junction") - `MPRco(CBBTGAT ,1.0e-18 ,"AV^-3m" ,`CBBT_cliplow ,inf ,"Band-to-band tunneling prefactor of gate-edge component for source-bulk junction") - `MPRnb(FBBTRBOT ,1.0e9 ,"Vm^-1" ,"Normalization field at the reference temperature for band-to-band tunneling of bottom component for source-bulk junction") - `MPRnb(FBBTRSTI ,1.0e9 ,"Vm^-1" ,"Normalization field at the reference temperature for band-to-band tunneling of STI-edge component for source-bulk junction") - `MPRnb(FBBTRGAT ,1.0e9 ,"Vm^-1" ,"Normalization field at the reference temperature for band-to-band tunneling of gate-edge component for source-bulk junction") - `MPRnb(STFBBTBOT ,-1.0e-3 ,"K^-1" ,"Temperature scaling parameter for band-to-band tunneling of bottom component for source-bulk junction") - `MPRnb(STFBBTSTI ,-1.0e-3 ,"K^-1" ,"Temperature scaling parameter for band-to-band tunneling of STI-edge component for source-bulk junction") - `MPRnb(STFBBTGAT ,-1.0e-3 ,"K^-1" ,"Temperature scaling parameter for band-to-band tunneling of gate-edge component for source-bulk junction") - `MPRco(VBRBOT ,10.0 ,"V" ,`VBR_cliplow ,inf ,"Breakdown voltage of bottom component for source-bulk junction") - `MPRco(VBRSTI ,10.0 ,"V" ,`VBR_cliplow ,inf ,"Breakdown voltage of STI-edge component for source-bulk junction") - `MPRco(VBRGAT ,10.0 ,"V" ,`VBR_cliplow ,inf ,"Breakdown voltage of gate-edge component for source-bulk junction") - `MPRco(PBRBOT ,4.0 ,"V" ,`PBR_cliplow ,inf ,"Breakdown onset tuning parameter of bottom component for source-bulk junction") - `MPRco(PBRSTI ,4.0 ,"V" ,`PBR_cliplow ,inf ,"Breakdown onset tuning parameter of STI-edge component for source-bulk junction") - `MPRco(PBRGAT ,4.0 ,"V" ,`PBR_cliplow ,inf ,"Breakdown onset tuning parameter of gate-edge component for source-bulk junction") -`endif // JUNCAP_StandAlone - -// Parameters for drain-bulk junction -`ifdef JUNCAP_StandAlone - // do nothing -`else // JUNCAP_StandAlone - `MPRco(CJORBOTD ,1.0e-3 ,"Fm^-2" ,`CJORBOT_cliplow ,inf ,"Zero-bias capacitance per unit-of-area of bottom component for drain-bulk junction") - `MPRco(CJORSTID ,1.0e-9 ,"Fm^-1" ,`CJORSTI_cliplow ,inf ,"Zero-bias capacitance per unit-of-length of STI-edge component for drain-bulk junction") - `MPRco(CJORGATD ,1.0e-9 ,"Fm^-1" ,`CJORGAT_cliplow ,inf ,"Zero-bias capacitance per unit-of-length of gate-edge component for drain-bulk junction") - `MPRco(VBIRBOTD ,1.0 ,"V" ,`VBIR_cliplow ,inf ,"Built-in voltage at the reference temperature of bottom component for drain-bulk junction") - `MPRco(VBIRSTID ,1.0 ,"V" ,`VBIR_cliplow ,inf ,"Built-in voltage at the reference temperature of STI-edge component for drain-bulk junction") - `MPRco(VBIRGATD ,1.0 ,"V" ,`VBIR_cliplow ,inf ,"Built-in voltage at the reference temperature of gate-edge component for drain-bulk junction") - `MPRcc(PBOTD ,0.5 ,"" ,`P_cliplow ,`P_cliphigh ,"Grading coefficient of bottom component for drain-bulk junction") - `MPRcc(PSTID ,0.5 ,"" ,`P_cliplow ,`P_cliphigh ,"Grading coefficient of STI-edge component for drain-bulk junction") - `MPRcc(PGATD ,0.5 ,"" ,`P_cliplow ,`P_cliphigh ,"Grading coefficient of gate-edge component for drain-bulk junction") - `MPRnb(PHIGBOTD ,1.16 ,"V" ,"Zero-temperature bandgap voltage of bottom component for drain-bulk junction") - `MPRnb(PHIGSTID ,1.16 ,"V" ,"Zero-temperature bandgap voltage of STI-edge component for drain-bulk junction") - `MPRnb(PHIGGATD ,1.16 ,"V" ,"Zero-temperature bandgap voltage of gate-edge component for drain-bulk junction") - `MPRco(IDSATRBOTD ,1.0e-12 ,"Am^-2" ,`IDSATR_cliplow ,inf ,"Saturation current density at the reference temperature of bottom component for drain-bulk junction") - `MPRco(IDSATRSTID ,1.0e-18 ,"Am^-1" ,`IDSATR_cliplow ,inf ,"Saturation current density at the reference temperature of STI-edge component for drain-bulk junction") - `MPRco(IDSATRGATD ,1.0e-18 ,"Am^-1" ,`IDSATR_cliplow ,inf ,"Saturation current density at the reference temperature of gate-edge component for drain-bulk junction") - `MPRco(CSRHBOTD ,1.0e2 ,"Am^-3" ,`CSRH_cliplow ,inf ,"Shockley-Read-Hall prefactor of bottom component for drain-bulk junction") - `MPRco(CSRHSTID ,1.0e-4 ,"Am^-2" ,`CSRH_cliplow ,inf ,"Shockley-Read-Hall prefactor of STI-edge component for drain-bulk junction") - `MPRco(CSRHGATD ,1.0e-4 ,"Am^-2" ,`CSRH_cliplow ,inf ,"Shockley-Read-Hall prefactor of gate-edge component for drain-bulk junction") - `MPRco(XJUNSTID ,1.0e-7 ,"m" ,`XJUN_cliplow ,inf ,"Junction depth of STI-edge component for drain-bulk junction") - `MPRco(XJUNGATD ,1.0e-7 ,"m" ,`XJUN_cliplow ,inf ,"Junction depth of gate-edge component for drain-bulk junction") - `MPRco(CTATBOTD ,1.0e2 ,"Am^-3" ,`CTAT_cliplow ,inf ,"Trap-assisted tunneling prefactor of bottom component for drain-bulk junction") - `MPRco(CTATSTID ,1.0e-4 ,"Am^-2" ,`CTAT_cliplow ,inf ,"Trap-assisted tunneling prefactor of STI-edge component for drain-bulk junction") - `MPRco(CTATGATD ,1.0e-4 ,"Am^-2" ,`CTAT_cliplow ,inf ,"Trap-assisted tunneling prefactor of gate-edge component for drain-bulk junction") - `MPRco(MEFFTATBOTD ,0.25 ,"" ,`MEFFTAT_cliplow ,inf ,"Effective mass (in units of m0) for trap-assisted tunneling of bottom component for drain-bulk junction") - `MPRco(MEFFTATSTID ,0.25 ,"" ,`MEFFTAT_cliplow ,inf ,"Effective mass (in units of m0) for trap-assisted tunneling of STI-edge component for drain-bulk junction") - `MPRco(MEFFTATGATD ,0.25 ,"" ,`MEFFTAT_cliplow ,inf ,"Effective mass (in units of m0) for trap-assisted tunneling of gate-edge component for drain-bulk junction") - `MPRco(CBBTBOTD ,1.0e-12 ,"AV^-3" ,`CBBT_cliplow ,inf ,"Band-to-band tunneling prefactor of bottom component for drain-bulk junction") - `MPRco(CBBTSTID ,1.0e-18 ,"AV^-3m" ,`CBBT_cliplow ,inf ,"Band-to-band tunneling prefactor of STI-edge component for drain-bulk junction") - `MPRco(CBBTGATD ,1.0e-18 ,"AV^-3m" ,`CBBT_cliplow ,inf ,"Band-to-band tunneling prefactor of gate-edge component for drain-bulk junction") - `MPRnb(FBBTRBOTD ,1.0e9 ,"Vm^-1" ,"Normalization field at the reference temperature for band-to-band tunneling of bottom component for drain-bulk junction") - `MPRnb(FBBTRSTID ,1.0e9 ,"Vm^-1" ,"Normalization field at the reference temperature for band-to-band tunneling of STI-edge component for drain-bulk junction") - `MPRnb(FBBTRGATD ,1.0e9 ,"Vm^-1" ,"Normalization field at the reference temperature for band-to-band tunneling of gate-edge component for drain-bulk junction") - `MPRnb(STFBBTBOTD ,-1.0e-3 ,"K^-1" ,"Temperature scaling parameter for band-to-band tunneling of bottom component for drain-bulk junction") - `MPRnb(STFBBTSTID ,-1.0e-3 ,"K^-1" ,"Temperature scaling parameter for band-to-band tunneling of STI-edge component for drain-bulk junction") - `MPRnb(STFBBTGATD ,-1.0e-3 ,"K^-1" ,"Temperature scaling parameter for band-to-band tunneling of gate-edge component for drain-bulk junction") - `MPRco(VBRBOTD ,10.0 ,"V" ,`VBR_cliplow ,inf ,"Breakdown voltage of bottom component for drain-bulk junction") - `MPRco(VBRSTID ,10.0 ,"V" ,`VBR_cliplow ,inf ,"Breakdown voltage of STI-edge component for drain-bulk junction") - `MPRco(VBRGATD ,10.0 ,"V" ,`VBR_cliplow ,inf ,"Breakdown voltage of gate-edge component for drain-bulk junction") - `MPRco(PBRBOTD ,4.0 ,"V" ,`PBR_cliplow ,inf ,"Breakdown onset tuning parameter of bottom component for drain-bulk junction") - `MPRco(PBRSTID ,4.0 ,"V" ,`PBR_cliplow ,inf ,"Breakdown onset tuning parameter of STI-edge component for drain-bulk junction") - `MPRco(PBRGATD ,4.0 ,"V" ,`PBR_cliplow ,inf ,"Breakdown onset tuning parameter of gate-edge component for drain-bulk junction") -`endif // JUNCAP_StandAlone - -// JUNCAP2-express parameters -`MPRcc(SWJUNEXP ,0.0 ,"" ,0.0 ,1.0 ,"Flag for JUNCAP-express; 0=full model, 1=express model") -`ifdef JUNCAP_StandAlone - `MPRco(VJUNREF ,2.5 ,"V" ,`VJUNREF_cliplow ,inf ,"Typical maximum junction voltage; usually about 2*VSUP") - `MPRco(FJUNQ ,0.03 ,"" ,`FJUNQ_cliplow ,inf ,"Fraction below which junction capacitance components are considered negligible") -`else // JUNCAP_StandAlone - `MPRco(VJUNREF ,2.5 ,"V" ,`VJUNREF_cliplow ,inf ,"Typical maximum source-bulk junction voltage; usually about 2*VSUP") - `MPRco(FJUNQ ,0.03 ,"" ,`FJUNQ_cliplow ,inf ,"Fraction below which source-bulk junction capacitance components are considered negligible") - `MPRco(VJUNREFD ,2.5 ,"V" ,`VJUNREF_cliplow ,inf ,"Typical maximum drain-bulk junction voltage; usually about 2*VSUP") - `MPRco(FJUNQD ,0.03 ,"" ,`FJUNQ_cliplow ,inf ,"Fraction below which drain-bulk junction capacitance components are considered negligible") -`endif // JUNCAP_StandAlone diff --git a/src/spicelib/devices/adms/psp103/admsva/JUNCAP200_varlist.include b/src/spicelib/devices/adms/psp103/admsva/JUNCAP200_varlist.include deleted file mode 100644 index ddb410eac..000000000 --- a/src/spicelib/devices/adms/psp103/admsva/JUNCAP200_varlist.include +++ /dev/null @@ -1,141 +0,0 @@ -//====================================================================================== -//====================================================================================== -// Filename: JUNCAP200_varlist.include -//====================================================================================== -//====================================================================================== -// -// (c) Copyright notice -// -// Since 2015 until today, PSP has been co-developed by NXP Semiconductors and -// CEA-Leti. For this part of the model, each claim undivided ownership and copyrights -// Since 2012 until 2015, PSP has been co-developed by NXP Semiconductors and -// Delft University of Technology. For this part of the model, each claim undivided -// ownership and copyrights -// Until and including 2011, PSP has been co-developed by NXP Semiconductors and -// Arizona State University. For this part of the model, NXP Semiconductors claims -// undivided ownership and copyrights. -// -// -// Version: 200.6.0, April 2019 -// -//====================================================================================== -//====================================================================================== -// -// Further information can be found in the file releasenotesPSP103.txt -// - -// declaration of clipped parameters -real TRJ_i, IMAX_i, FREV_i, IFACTOR_i, CFACTOR_i; -real CJORBOT_i, CJORSTI_i, CJORGAT_i, VBIRBOT_i, VBIRSTI_i, VBIRGAT_i; -real PBOT_i, PSTI_i, PGAT_i, PHIGBOT_i, PHIGSTI_i, PHIGGAT_i; -real IDSATRBOT_i, IDSATRSTI_i, IDSATRGAT_i, XJUNSTI_i, XJUNGAT_i; -real CSRHBOT_i, CSRHSTI_i, CSRHGAT_i, CTATBOT_i, CTATSTI_i, CTATGAT_i; -real MEFFTATBOT_i, MEFFTATSTI_i, MEFFTATGAT_i; -real CBBTBOT_i, CBBTSTI_i, CBBTGAT_i, FBBTRBOT_i, FBBTRSTI_i, FBBTRGAT_i; -real STFBBTBOT_i, STFBBTSTI_i, STFBBTGAT_i; -real VBRBOT_i, VBRSTI_i, VBRGAT_i, PBRBOT_i, PBRSTI_i, PBRGAT_i; - -real SWJUNEXP_i, VJUNREF_i, FJUNQ_i; - -// declaration of variables calculated outside macro "juncapfunction", voltage-independent part -real tkr, tkd, auxt, KBOL_over_QELE, phitr, phitrinv, phitd, phitdinv; -real perfc, berfc, cerfc; -real deltaphigr, deltaphigd, pmax; - -real phigrbot, phigrsti, phigrgat, phigdbot, phigdsti, phigdgat; -real ftdbot, ftdsti, ftdgat, idsatbot, idsatsti, idsatgat; -real ubibot, ubisti, ubigat, vbibot, vbisti, vbigat; -real vbibot2, vbisti2, vbigat2, pbot2, psti2, pgat2, vbibot2r, vbisti2r, vbigat2r; -real vbiinvbot, vbiinvsti, vbiinvgat; -real one_minus_PBOT, one_minus_PSTI, one_minus_PGAT; -real one_over_one_minus_PBOT, one_over_one_minus_PSTI, one_over_one_minus_PGAT; -real cjobot, cjosti, cjogat; -real qprefbot, qprefsti, qprefgat, qpref2bot, qpref2sti, qpref2gat; -real wdepnulrbot, wdepnulrsti, wdepnulrgat, wdepnulrinvbot, wdepnulrinvsti, wdepnulrinvgat; -real VBIRBOTinv, VBIRSTIinv, VBIRGATinv; -real deltaEbot, deltaEsti, deltaEgat, atatbot, atatsti, atatgat; -real btatpartbot, btatpartsti, btatpartgat; -real fbbtbot, fbbtsti, fbbtgat; -real alphaav, fstopbot, fstopsti, fstopgat, VBRinvbot, VBRinvsti, VBRinvgat; -real slopebot, slopesti, slopegat; -real vmaxbot, vmaxsti, vmaxgat; - -// JUNCAP-Express variables -real I1, I2, I3, I4, I5; -real I1_cor, I2_cor, I3_cor, I4_cor, I5_cor; -real V1, V2, V3, V4, V5; -real alphaje, m0_rev, mcor_rev; -real tt0, tt1, tt2, tm0, tm1; -real FRACNA, FRACNB, FRACI; -real zfrac; -real ijunfor1, ijunfor2, ijunrev; - -`ifdef JUNCAP_StandAlone - // do nothing -`else // JUNCAP_StandAlone - real CJORBOTD_i, CJORSTID_i, CJORGATD_i, VBIRBOTD_i, VBIRSTID_i, VBIRGATD_i; - real PBOTD_i, PSTID_i, PGATD_i, PHIGBOTD_i, PHIGSTID_i, PHIGGATD_i; - real IDSATRBOTD_i, IDSATRSTID_i, IDSATRGATD_i, XJUNSTID_i, XJUNGATD_i; - real CSRHBOTD_i, CSRHSTID_i, CSRHGATD_i, CTATBOTD_i, CTATSTID_i, CTATGATD_i; - real MEFFTATBOTD_i, MEFFTATSTID_i, MEFFTATGATD_i; - real CBBTBOTD_i, CBBTSTID_i, CBBTGATD_i, FBBTRBOTD_i, FBBTRSTID_i, FBBTRGATD_i; - real STFBBTBOTD_i, STFBBTSTID_i, STFBBTGATD_i; - real VBRBOTD_i, VBRSTID_i, VBRGATD_i, PBRBOTD_i, PBRSTID_i, PBRGATD_i; - - real VJUNREFD_i, FJUNQD_i; - - real phigrbot_d, phigrsti_d, phigrgat_d, phigdbot_d, phigdsti_d, phigdgat_d; - real ftdbot_d, ftdsti_d, ftdgat_d, idsatbot_d, idsatsti_d, idsatgat_d; - real ubibot_d, ubisti_d, ubigat_d, vbibot_d, vbisti_d, vbigat_d; - real vbiinvbot_d, vbiinvsti_d, vbiinvgat_d; - real one_minus_PBOT_d, one_minus_PSTI_d, one_minus_PGAT_d; - real one_over_one_minus_PBOT_d, one_over_one_minus_PSTI_d, one_over_one_minus_PGAT_d; - real cjobot_d, cjosti_d, cjogat_d; - real qprefbot_d, qprefsti_d, qprefgat_d, qpref2bot_d, qpref2sti_d, qpref2gat_d; - real wdepnulrbot_d, wdepnulrsti_d, wdepnulrgat_d, wdepnulrinvbot_d, wdepnulrinvsti_d, wdepnulrinvgat_d; - real VBIRBOTinv_d, VBIRSTIinv_d, VBIRGATinv_d; - real deltaEbot_d, deltaEsti_d, deltaEgat_d, atatbot_d, atatsti_d, atatgat_d; - real btatpartbot_d, btatpartsti_d, btatpartgat_d; - real fbbtbot_d, fbbtsti_d, fbbtgat_d; - real fstopbot_d, fstopsti_d, fstopgat_d, VBRinvbot_d, VBRinvsti_d, VBRinvgat_d; - real slopebot_d, slopesti_d, slopegat_d; -`endif // JUNCAP_StandAlone - -//`LocalGlobalVars - -//================================================================ -// Variables that are different for source and drain side junction -// and have a scope larger than a single macro-call -//================================================================ - -`ifdef JUNCAP_StandAlone - real AB_i, LS_i, LG_i; - real zflagbot, zflagsti, zflaggat; - real VMAX, exp_VMAX_over_phitd, vbimin, vch, vfmin, vbbtlim; - - // JUNCAP-express variables - real xhighf1, expxhf1, xhighf2, expxhf2, xhighr, expxhr; - - // JUNCAP2-express intermediate parameters - real ISATFOR1, MFOR1, ISATFOR2, MFOR2, ISATREV, MREV, m0flag; -`else // JUNCAP_StandAlone - real ABSOURCE_i, LSSOURCE_i, LGSOURCE_i, AS_i, PS_i; - real zflagbot_s, zflagsti_s, zflaggat_s; - real VMAX_s, exp_VMAX_over_phitd_s, vbimin_s, vch_s, vfmin_s, vbbtlim_s; - - // JUNCAP-express variables - real xhighf1_s, expxhf1_s, xhighf2_s, expxhf2_s, xhighr_s, expxhr_s, m0flag_s; - - // JUNCAP2-express intermediate parameters - real ISATFOR1_s, MFOR1_s, ISATFOR2_s, MFOR2_s, ISATREV_s, MREV_s; - - real ABDRAIN_i, LSDRAIN_i, LGDRAIN_i, AD_i, PD_i; - real zflagbot_d, zflagsti_d, zflaggat_d; - real VMAX_d, exp_VMAX_over_phitd_d, vbimin_d, vch_d, vfmin_d, vbbtlim_d; - - // JUNCAP-express variables - real xhighf1_d, expxhf1_d, xhighf2_d, expxhf2_d, xhighr_d, expxhr_d, m0flag_d; - - // JUNCAP2-express intermediate parameters - real ISATFOR1_d, MFOR1_d, ISATFOR2_d, MFOR2_d, ISATREV_d, MREV_d; -`endif // JUNCAP_StandAlone diff --git a/src/spicelib/devices/adms/psp103/admsva/PSP103_ChargesNQS.include b/src/spicelib/devices/adms/psp103/admsva/PSP103_ChargesNQS.include deleted file mode 100644 index c992f3591..000000000 --- a/src/spicelib/devices/adms/psp103/admsva/PSP103_ChargesNQS.include +++ /dev/null @@ -1,314 +0,0 @@ -//====================================================================================== -//====================================================================================== -// Filename: PSP103_ChargesNQS.include -//====================================================================================== -//====================================================================================== -// -// (c) Copyright notice -// -// Since 2015 until today, PSP has been co-developed by NXP Semiconductors and -// CEA-Leti. For this part of the model, each claim undivided ownership and copyrights -// Since 2012 until 2015, PSP has been co-developed by NXP Semiconductors and -// Delft University of Technology. For this part of the model, each claim undivided -// ownership and copyrights -// Until and including 2011, PSP has been co-developed by NXP Semiconductors and -// Arizona State University. For this part of the model, NXP Semiconductors claims -// undivided ownership and copyrights. -// -// -// Version: 103.7.0 (PSP), 200.6.0 (JUNCAP), April 2019 -// -//====================================================================================== -//====================================================================================== -// -// Further information can be found in the file releasenotesPSP103.txt -// - -// -------------------------------------------------------------------------------------------------------------- -// Calculate NQS-charge contributions -// -------------------------------------------------------------------------------------------------------------- - -Qp1 = vnorm * V(SPLINE1); -Qp2 = vnorm * V(SPLINE2); -Qp3 = vnorm * V(SPLINE3); -Qp4 = vnorm * V(SPLINE4); -Qp5 = vnorm * V(SPLINE5); -Qp6 = vnorm * V(SPLINE6); -Qp7 = vnorm * V(SPLINE7); -Qp8 = vnorm * V(SPLINE8); -Qp9 = vnorm * V(SPLINE9); - -Tnorm = 0.0; - -if (SWNQS_i != 0) begin - // Dimension and mobility information is included in Tnorm - Tnorm = MUNQS_i * phit1 * BET_i / (COX_qm * Gmob_dL_ac); - thesat2 = thesat1_ac * thesat1_ac * phit1 * phit1; - - if (SWNQS_i == 1) begin - dQy = QpN - Qp0; - d2Qy = 6.0 * (Qp0 + QpN) - 12.0 * Qp1; - end else if (SWNQS_i == 2) begin - dQy = (-7.0 * Qp0 - 3.0 * Qp1 + 12.0 * Qp2 - 2.0 * QpN) / 5.0; - d2Qy = -18.0 / 5.0 * (-4.0 * Qp0 + 9.0 * Qp1 - 6.0 * Qp2 + QpN); - end else if (SWNQS_i == 3) begin - dQy = (-13.0 * Qp0 - 6.0 * Qp1 + 24.0 * Qp2 - 6.0 * Qp3 + QpN) / 7.0; - d2Qy = (180.0 * Qp0 - 408.0 * Qp1 + 288.0 * Qp2 - 72.0 * Qp3 + 12.0 * QpN) / 7.0; - end else if (SWNQS_i == 5) begin - dQy = (-181.0 * Qp0 - 84.0 * Qp1 + 24.0 * Qp4 - 6.0 * Qp5 - 90.0 * Qp3 + QpN - + 336.0 * Qp2) / 65.0; - d2Qy = (432.0 * Qp4 - 108.0 * Qp5 - 1620.0 * Qp3 + 18.0 * QpN + 3762.0 * Qp0 - - 8532.0 * Qp1 + 6048.0 * Qp2) / 65.0; - end else if (SWNQS_i == 9) begin - dQy = (1680.0 * Qp6 + 23400.0 * Qp4 + 5.0 * QpN - 87330.0 * Qp3 + 120.0 * Qp8 - - 450.0 * Qp7 - 81480.0 * Qp1 + 325920.0 * Qp2 - -175565.0 * Qp0 - 30.0 * Qp9) / 37829.0 - 30.0 / 181.0 * Qp5; - d2Qy = (-13500.0 * Qp7 + 702000.0 * Qp4 - 2619900 * Qp3 - 13793100.0 * Qp1 - + 9777600.0 * Qp2 + 6081750.0 * Qp0 + 150.0 * QpN + 3600.0 * Qp8 - - 900.0 * Qp9 + 50400.0 * Qp6) / 37829.0 - 900.0 / 181.0 * Qp5; - end else begin - dQy = 0.0; - d2Qy = 0.0; - end - `fq(Qp1, xg_ac, dQy, d2Qy, fk1) -end else begin - thesat2 = 0.0; -end - -if (SWNQS_i >= 2) begin - if (SWNQS_i == 2) begin - dQy = (2.0 * Qp0 - 12.0 * Qp1 + 3.0 * Qp2 + 7.0 * QpN) / 5.0; - d2Qy = -18.0 / 5.0 * (-4.0 * QpN + 9.0 * Qp2 - 6.0 * Qp1 + Qp0); - end else if (SWNQS_i == 3) begin - dQy = 0.5 * Qp0 - 3.0 * Qp1 + 3.0 * Qp3 - 0.5 * QpN; - d2Qy = (-48.0 * Qp0 + 288.0 * Qp1 - 480.0 * Qp2 + 288.0 * Qp3 - 48.0 * QpN) / 7.0; - end else if (SWNQS_i == 5) begin - dQy = (-291.0 * Qp1 - 6.0 * Qp2 - 84.0 * Qp4 + 21.0 * Qp5) / 65.0 - + (630.0 * Qp3 - 7.0 * QpN + 97.0 * Qp0) / 130.0; - d2Qy = (-1728.0 * Qp4 + 432.0 * Qp5 + 6480.0 * Qp3 - 72.0 * QpN - 1008.0 * Qp0 - + 6048.0 * Qp1 - 10152.0 * Qp2) / 65.0; - end else if (SWNQS_i == 9) begin - dQy = (-5880.0 * Qp6 - 81900.0 * Qp4 + 305655.0 * Qp3 - 420.0 * Qp8 - + 105.0 * Qp9 - 282255.0 * Qp1 + 1575.0 * Qp7 - 5850.0 * Qp2) / 37829.0 - + 105.0 / 181.0 * Qp5 + (94085.0 * Qp0 - 35.0 * QpN) / 75658.0; - d2Qy = (9777600.0 * Qp1 + 54000.0 * Qp7 - 2808000.0 * Qp4 + 10479600.0 * Qp3 - - 16413000.0 * Qp2 - 1629600.0 * Qp0 - 600.0 * QpN - 14400.0 * Qp8 - + 3600.0 * Qp9 - 201600.0 * Qp6) / 37829.0 + 3600.0 * Qp5 / 181.0; - end else begin - dQy = 0.0; - d2Qy = 0.0; - end - `fq(Qp2, xg_ac, dQy, d2Qy, fk2) -end - -if (SWNQS_i >= 3) begin - if (SWNQS_i == 3) begin - dQy = (13.0 * QpN + 6.0 * Qp3 - 24.0 * Qp2 + 6.0 * Qp1 - Qp0) / 7.0; - d2Qy = (180.0 * QpN - 408.0 * Qp3 + 288.0 * Qp2 - 72.0 * Qp1 + 12.0 * Qp0) / 7.0; - end else if (SWNQS_i == 5) begin - dQy = (QpN - 6.0 * Qp5 + 24.0 * Qp4 - 24.0 * Qp2 + 6.0 * Qp1 - Qp0) / 5.0; - d2Qy = (1296.0 * (Qp4 + Qp2) - 324.0 * (Qp5 + Qp1) - 2052.0 * Qp3 - + 54.0 * (QpN + Qp0)) / 13.0; - end else if (SWNQS_i == 9) begin - dQy = (21840.0 * Qp6 + 304200.0 * Qp4 + 65.0 * QpN - 420.0 * Qp3 + 1560.0 * Qp8 - - 12605.0 * Qp0 - 390.0 * Qp9 + 75630.0 * Qp1 - 5850.0 * Qp7 - - 302520.0 * Qp2) / 37829.0 - 390.0 / 181.0 * Qp5; - d2Qy = (-2619900.0 * Qp1 - 202500.0 * Qp7 + 10530000.0 * Qp4 - 16601100.0 * Qp3 - + 10479600.0 * Qp2 + 436650.0 * Qp0 + 2250.0 * QpN + 54000.0 * Qp8 - - 13500.0 * Qp9 + 756000.0 * Qp6) / 37829.0 - 13500.0 * Qp5 / 181.0; - end else begin - dQy = 0.0; - d2Qy = 0.0; - end - `fq(Qp3, xg_ac, dQy, d2Qy, fk3) -end - -if (SWNQS_i >= 4) begin - if (SWNQS_i == 5) begin - dQy = (-630.0 * Qp3 + 12.0 * Qp4 + 582.0 * Qp5 - 97.0 * QpN + 7.0 * Qp0 - - 42.0 * Qp1 + 168.0 * Qp2) / 130.0; - d2Qy = (-10152.0 * Qp4 + 6048.0 * Qp5 + 6480.0 * Qp3 - 1008.0 * QpN - - 72.0 * Qp0 + 432.0 * Qp1 - 1728.0 * Qp2) / 65.0; - end - else if (SWNQS_i == 9) begin - dQy = (-81480.0 * Qp6 - 30.0 * Qp4 - 303975.0 * Qp3 - 5820.0 * Qp8 - + 1455.0 * Qp9 - 20265.0 * Qp1 + 21825.0 * Qp7 + 81060.0 * Qp2) / 37829.0 - - 485.0 / 75658.0 * QpN + 1455.0 * Qp5 / 181.0 + 6755.0 * Qp0 / 75658.0; - d2Qy = (702000.0 * Qp1 + 756000.0 * Qp7 - 16614600.0 * Qp4 + 10530000.0 * Qp3 - - 2808000.0 * Qp2 - 117000.0 * Qp0 - 8400.0 * QpN - 201600.0 * Qp8 - + 50400.0 * Qp9 - 2822400.0 * Qp6) / 37829.0 + 50400.0 * Qp5 / 181.0; - end else begin - dQy = 0.0; - d2Qy = 0.0; - end - `fq(Qp4, xg_ac, dQy, d2Qy, fk4) -end - -if (SWNQS_i >= 5) begin - if (SWNQS_i == 5) begin - dQy = (-336.0 * Qp4 + 84.0 * Qp5 + 90.0 * Qp3 + 181.0 * QpN - Qp0 + 6.0 * Qp1 - - 24.0 * Qp2) / 65.0; - d2Qy = (18.0 * Qp0 + 3762.0 * QpN + 6048.0 * Qp4 + 432.0 * Qp2 - 1620.0 * Qp3 - - 108.0 * Qp1 - 8532.0 * Qp5) / 65.0; - end else if (SWNQS_i == 9) begin - dQy = (1680.0 * (Qp6 - Qp4) + 5.0 * (QpN - Qp0) + 450.0 * (Qp3 - Qp7) - + 120.0 * (Qp8 - Qp2) - 30.0 * (Qp9 - Qp1)) / 209.0; - d2Qy = (-900.0 * (Qp1 + Qp9) - 13500.0 * (Qp7 + Qp3) - 79500.0 * Qp5 - + 50400.0 * (Qp4 + Qp6) + 3600.0 * (Qp2 + Qp8) + 150.0 * (Qp0 + QpN)) / 181.0; - end else begin - dQy = 0.0; - d2Qy = 0.0; - end - `fq(Qp5, xg_ac, dQy, d2Qy, fk5) -end - -if (SWNQS_i >= 6) begin - if (SWNQS_i == 9) begin - dQy = (30.0 * Qp6 + 81480.0 * Qp4 - 21825.0 * Qp3 - 81060.0 * Qp8 + 20265.0 * Qp9 - - 1455.0 * Qp1 + 303975.0 * Qp7 + 5820.0 * Qp2) / 37829.0 - -(6755.0 * QpN - 485.0 * Qp0) / 75658.0 - 1455.0 / 181.0 * Qp5; - d2Qy = (50400.0 * Qp1 + 10530000.0 * Qp7 - 2822400.0 * Qp4 + 756000.0 * Qp3 - - 201600.0 * Qp2 - 8400.0 * Qp0 - 117000.0 * QpN - 2808000.0 * Qp8 - + 702000.0 * Qp9 - 16614600.0 * Qp6) / 37829.0 + 50400.0 * Qp5 / 181.0; - end else begin - dQy = 0.0; - d2Qy = 0.0; - end - `fq(Qp6, xg_ac, dQy, d2Qy, fk6) -end - -if (SWNQS_i >= 7) begin - if (SWNQS_i == 9) begin - dQy = (-304200.0 * Qp6 - 21840.0 * Qp4 + 12605.0 * QpN + 5850.0 * Qp3 - + 302520.0 * Qp8 - 65.0 * Qp0 - 75630.0 * Qp9 + 390.0 * Qp1 + 420.0 * Qp7 - - 1560.0 * Qp2) / 37829.0 + 390.0 / 181.0 * Qp5; - d2Qy = (-13500.0 * Qp1 - 16601100.0 * Qp7 + 756000.0 * Qp4 - 202500.0 * Qp3 - + 54000.0 * Qp2 + 2250.0 * Qp0 + 436650.0 * QpN + 10479600.0 * Qp8 - - 2619900.0 * Qp9 + 10530000.0 * Qp6) / 37829.0 - 13500.0 * Qp5 / 181.0; - end else begin - dQy = 0.0; - d2Qy = 0.0; - end - `fq(Qp7, xg_ac, dQy, d2Qy, fk7) -end - -if (SWNQS_i >= 8) begin - if (SWNQS_i == 9) begin - dQy = (81900.0 * Qp6 + 5880.0 * Qp4 - 1575.0 * Qp3 + 5850.0 * Qp8 + 282255.0 * Qp9 - - 105.0 * Qp1 - 305655.0 * Qp7 + 420.0 * Qp2) / 37829.0 + (35.0 * Qp0 - - 94085.0 * QpN) / 75658.0 - 105.0 / 181.0 * Qp5; - d2Qy = (3600.0 * Qp1 + 10479600.0 * Qp7 - 201600.0 * Qp4 + 54000.0 * Qp3 - - 14400.0 * Qp2 - 600.0 * Qp0 - 1629600.0 * QpN - 16413000.0 * Qp8 - + 9777600.0 * Qp9 - 2808000.0 * Qp6) / 37829.0 + 3600.0 * Qp5 / 181.0; - end else begin - dQy = 0.0; - d2Qy = 0.0; - end - `fq(Qp8, xg_ac, dQy, d2Qy, fk8) -end - -if (SWNQS_i >= 9) begin - if (SWNQS_i == 9) begin - dQy = (-23400.0 * Qp6 - 1680.0 * Qp4 + 175565.0 * QpN + 450.0 * Qp3 - - 325920.0 * Qp8 - 5.0 * Qp0 + 81480.0 * Qp9 + 30.0 * Qp1 - + 87330.0 * Qp7 - 120.0 * Qp2) / 37829.0 + 30.0 * Qp5 / 181.0; - d2Qy = (-900.0 * Qp1 - 2619900.0 * Qp7 + 50400.0 * Qp4 - 13500.0 * Qp3 - + 3600.0 * Qp2 + 150.0 * Qp0 + 6081750.0 * QpN + 9777600.0 * Qp8 - - 13793100.0 * Qp9 + 702000.0 * Qp6) / 37829.0 - 900.0 * Qp5 / 181.0; - end else begin - dQy = 0.0; - d2Qy = 0.0; - end - `fq(Qp9, xg_ac, dQy, d2Qy, fk9) -end - -//-------------------------------------------------------------------- - -// Terminal charges for NQS -QS_NQS = 0.0; -QD_NQS = 0.0; -QG_NQS = 0.0; -if (SWNQS_i != 0) begin - if (SWNQS_i == 1) begin - QS_NQS = (17.0 * Qp0 + 30.0 * Qp1 + QpN) / 96.0; - QD_NQS = (Qp0 + 30.0 * Qp1 + 17.0 * QpN) / 96.0; - `QiToPhi(Qp1,xg_ac, temp1) - QG_NQS = xg_ac - (x_sp + 4.0 * temp1 + x_dp) * `oneSixth; - end else if (SWNQS_i == 2) begin - QS_NQS = (11.0 * Qp0 + 24.0 * Qp1 + 9.0 * Qp2 + QpN) / 90.0; - QD_NQS = (11.0 * QpN + 24.0 * Qp2 + 9.0 * Qp1 + Qp0) / 90.0; - `QiToPhi(Qp1, xg_ac, temp1) - `QiToPhi(Qp2, xg_ac, temp2) - QG_NQS = xg_ac - (x_sp + 3.0 * (temp1 + temp2) + x_dp) * 0.125; - end else if (SWNQS_i == 3) begin - QS_NQS = (251.0 * Qp0 + 594.0 * Qp1 + 312.0 * Qp2 + 174.0 * Qp3 + 13.0 * QpN) / 2688.0; - QD_NQS = (251.0 * QpN + 594.0 * Qp3 + 312.0 * Qp2 + 174.0 * Qp1 + 13.0 * Qp0) / 2688.0; - `QiToPhi(Qp1, xg_ac, temp1) - `QiToPhi(Qp2, xg_ac, temp2) - `QiToPhi(Qp3, xg_ac, temp3) - QG_NQS = xg_ac - (x_sp + 4.0 * temp1 + 2.0 * temp2 + 4.0 * temp3 + x_dp) / 12.0; - end else if (SWNQS_i == 5) begin - QS_NQS = (1187.0 * Qp0 + 43.0 * QpN) / 18720.0 + (503.0 * Qp1 + 172.0 * Qp4 - + 87.0 * Qp5 + 265.0 * Qp3 + 328.0 * Qp2) / 3120.0; - QD_NQS = (1187.0 * QpN + 43.0 * Qp0) / 18720.0 + (503.0 * Qp5 + 172.0 * Qp2 - + 87.0 * Qp1 + 265.0 * Qp3 + 328.0 * Qp4) / 3120.0; - `QiToPhi(Qp1, xg_ac, temp1) - `QiToPhi(Qp2, xg_ac, temp2) - `QiToPhi(Qp3, xg_ac, temp3) - `QiToPhi(Qp4, xg_ac, temp4) - `QiToPhi(Qp5, xg_ac, temp5) - QG_NQS = xg_ac - (x_sp + 4.0 * (temp1 + temp3 + temp5) + 2.0 * (temp2 + temp4) + x_dp) / 18.0; - end else if (SWNQS_i == 9) begin - QS_NQS = (75653.0 * Qp8 + 225999.0 * Qp4) / 3782900.0 + (151321.0 * Qp9 - + 454023.0 * Qp7 + 1073767.0 * Qp3 + 1564569.0 * Qp1) / 15131600.0 - + 75623.0 * Qp6 / 1891450.0 + 145.0 * Qp5 / 2896.0 + 72263.0 * Qp2 / 945725.0 - + (3504517.0 * Qp0 + 75653.0 * QpN) / 90789600.0; - QD_NQS = (75653.0 * Qp2 + 225999.0 * Qp6) / 3782900.0 + (151321.0 * Qp1 - + 454023.0 * Qp3 + 1073767.0 * Qp7 + 1564569.0 * Qp9) / 15131600.0 - + 75623.0 * Qp4 / 1891450.0 + 145.0 * Qp5 / 2896.0 + 72263.0 * Qp8 / 945725.0 - + (3504517.0 * QpN + 75653.0 * Qp0) / 90789600.0; - `QiToPhi(Qp1, xg_ac, temp1) - `QiToPhi(Qp2, xg_ac, temp2) - `QiToPhi(Qp3, xg_ac, temp3) - `QiToPhi(Qp4, xg_ac, temp4) - `QiToPhi(Qp5, xg_ac, temp5) - `QiToPhi(Qp6, xg_ac, temp6) - `QiToPhi(Qp7, xg_ac, temp7) - `QiToPhi(Qp8, xg_ac, temp8) - `QiToPhi(Qp9, xg_ac, temp9) - QG_NQS = xg_ac - (x_sp + 4.0 * (temp1 + temp3 + temp5 + temp7 + temp9) - + 2.0 * (temp2 + temp4 + temp6 + temp8) + x_dp) / 30.0; - end - QG_NQS = pd * QG_NQS; - - if (sigVds > 0) begin - Qs = COX_qm * phit1 * QS_NQS; - Qd = COX_qm * phit1 * QD_NQS; - end else begin - Qs = COX_qm * phit1 * QD_NQS; - Qd = COX_qm * phit1 * QS_NQS; - end - Qg = COX_qm * phit1 * QG_NQS; - Qb = -Qg - Qs - Qd; -end - -// Update internal nodes -V(RES1) <+ vnorm_inv * I(RES1) * r_nqs; -V(SPLINE1) <+ vnorm_inv * idt(-Tnorm * fk1, Qp1_0); -V(RES2) <+ vnorm_inv * I(RES2) * r_nqs; -V(SPLINE2) <+ vnorm_inv * idt(-Tnorm * fk2, Qp2_0); -V(RES3) <+ vnorm_inv * I(RES3) * r_nqs; -V(SPLINE3) <+ vnorm_inv * idt(-Tnorm * fk3, Qp3_0); -V(RES4) <+ vnorm_inv * I(RES4) * r_nqs; -V(SPLINE4) <+ vnorm_inv * idt(-Tnorm * fk4, Qp4_0); -V(RES5) <+ vnorm_inv * I(RES5) * r_nqs; -V(SPLINE5) <+ vnorm_inv * idt(-Tnorm * fk5, Qp5_0); -V(RES6) <+ vnorm_inv * I(RES6) * r_nqs; -V(SPLINE6) <+ vnorm_inv * idt(-Tnorm * fk6, Qp6_0); -V(RES7) <+ vnorm_inv * I(RES7) * r_nqs; -V(SPLINE7) <+ vnorm_inv * idt(-Tnorm * fk7, Qp7_0); -V(RES8) <+ vnorm_inv * I(RES8) * r_nqs; -V(SPLINE8) <+ vnorm_inv * idt(-Tnorm * fk8, Qp8_0); -V(RES9) <+ vnorm_inv * I(RES9) * r_nqs; -V(SPLINE9) <+ vnorm_inv * idt(-Tnorm * fk9, Qp9_0); - diff --git a/src/spicelib/devices/adms/psp103/admsva/PSP103_InitNQS.include b/src/spicelib/devices/adms/psp103/admsva/PSP103_InitNQS.include deleted file mode 100644 index afa95af47..000000000 --- a/src/spicelib/devices/adms/psp103/admsva/PSP103_InitNQS.include +++ /dev/null @@ -1,205 +0,0 @@ -//====================================================================================== -//====================================================================================== -// Filename: PSP103_InitNQS.include -//====================================================================================== -//====================================================================================== -// -// (c) Copyright notice -// -// Since 2015 until today, PSP has been co-developed by NXP Semiconductors and -// CEA-Leti. For this part of the model, each claim undivided ownership and copyrights -// Since 2012 until 2015, PSP has been co-developed by NXP Semiconductors and -// Delft University of Technology. For this part of the model, each claim undivided -// ownership and copyrights -// Until and including 2011, PSP has been co-developed by NXP Semiconductors and -// Arizona State University. For this part of the model, NXP Semiconductors claims -// undivided ownership and copyrights. -// -// -// Version: 103.7.0 (PSP), 200.6.0 (JUNCAP), April 2019 -// -//====================================================================================== -//====================================================================================== -// -// Further information can be found in the file releasenotesPSP103.txt -// - -///////////////////////////////////////////////////////////////////////////// -// -// Computing initial (dc) values for internal nodes. -// This code is independent of internal-node voltages -// -///////////////////////////////////////////////////////////////////////////// - -Qp1_0 = 0.0; -Qp2_0 = 0.0; -Qp3_0 = 0.0; -Qp4_0 = 0.0; -Qp5_0 = 0.0; -Qp6_0 = 0.0; -Qp7_0 = 0.0; -Qp8_0 = 0.0; -Qp9_0 = 0.0; -fk1 = 0.0; -fk2 = 0.0; -fk3 = 0.0; -fk4 = 0.0; -fk5 = 0.0; -fk6 = 0.0; -fk7 = 0.0; -fk8 = 0.0; -fk9 = 0.0; -if (SWNQS_i != 0) begin - dQis = 0.0; - dQy = 0.0; - dfQi = 0.0; - fQi = 0.0; - d2Qy = 0.0; - - Qp1 = 0.0; - Qp2 = 0.0; - Qp3 = 0.0; - Qp4 = 0.0; - Qp5 = 0.0; - Qp6 = 0.0; - Qp7 = 0.0; - Qp8 = 0.0; - Qp9 = 0.0; - - phi_p1 = 0.0; - phi_p2 = 0.0; - phi_p3 = 0.0; - phi_p4 = 0.0; - phi_p5 = 0.0; - phi_p6 = 0.0; - phi_p7 = 0.0; - phi_p8 = 0.0; - phi_p9 = 0.0; - - // Setting initial values for charge along the channel - // from interpolated DC-solution - if (xg_ac > 0) begin - if (SWNQS_i == 1) begin - - phi_p1 = `Phiy(0.5); - `PhiToQb(phi_p1,Qb_tmp) - Qp1_0 = -pd * (xg_ac - phi_p1) - Qb_tmp; - - end else if (SWNQS_i == 2) begin - phi_p1 = `Phiy(`oneThird); - `PhiToQb(phi_p1,Qb_tmp) - Qp1_0 = -pd * (xg_ac - phi_p1) - Qb_tmp; - - phi_p2 = `Phiy(`twoThirds); - `PhiToQb(phi_p2,Qb_tmp) - Qp2_0 = -pd * (xg_ac - phi_p2) - Qb_tmp; - - if (sigVds < 0) begin - `swap(Qp1_0, Qp2_0) - end - end else if (SWNQS_i == 3) begin - phi_p1 = `Phiy(0.25); - `PhiToQb(phi_p1,Qb_tmp) - Qp1_0 = -pd * (xg_ac - phi_p1) - Qb_tmp; - - phi_p2 = `Phiy(0.5); - `PhiToQb(phi_p2,Qb_tmp) - Qp2_0 = -pd * (xg_ac - phi_p2) - Qb_tmp; - - phi_p3 = `Phiy(0.75); - `PhiToQb(phi_p3,Qb_tmp) - Qp3_0 = -pd * (xg_ac - phi_p3) - Qb_tmp; - - if (sigVds < 0) begin - `swap(Qp1_0, Qp3_0) - end - end else if (SWNQS_i == 5) begin - phi_p1 = `Phiy(`oneSixth); - `PhiToQb(phi_p1,Qb_tmp) - Qp1_0 = -pd * (xg_ac - phi_p1) - Qb_tmp; - - phi_p2 = `Phiy(`oneThird); - `PhiToQb(phi_p2,Qb_tmp) - Qp2_0 = -pd * (xg_ac - phi_p2) - Qb_tmp; - - phi_p3 = `Phiy(0.5); - `PhiToQb(phi_p3,Qb_tmp) - Qp3_0 = -pd * (xg_ac - phi_p3) - Qb_tmp; - - phi_p4 = `Phiy(`twoThirds); - `PhiToQb(phi_p4,Qb_tmp) - Qp4_0 = -pd * (xg_ac - phi_p4) - Qb_tmp; - - phi_p5 = `Phiy(0.8333333333333333); - `PhiToQb(phi_p5,Qb_tmp) - Qp5_0 = -pd * (xg_ac - phi_p5) - Qb_tmp; - - if (sigVds < 0) begin - `swap(Qp1_0, Qp5_0) - `swap(Qp2_0, Qp4_0) - end - end else if (SWNQS_i == 9) begin - phi_p1 = `Phiy(0.1); - `PhiToQb(phi_p1,Qb_tmp) - Qp1_0 = -pd * (xg_ac - phi_p1) - Qb_tmp; - - phi_p2 = `Phiy(0.2); - `PhiToQb(phi_p2,Qb_tmp) - Qp2_0 = -pd * (xg_ac - phi_p2) - Qb_tmp; - - phi_p3 = `Phiy(0.3); - `PhiToQb(phi_p3,Qb_tmp) - Qp3_0 = -pd * (xg_ac - phi_p3) - Qb_tmp; - - phi_p4 = `Phiy(0.4); - `PhiToQb(phi_p4,Qb_tmp) - Qp4_0 = -pd * (xg_ac - phi_p4) - Qb_tmp; - - phi_p5 = `Phiy(0.5); - `PhiToQb(phi_p5,Qb_tmp) - Qp5_0 = -pd * (xg_ac - phi_p5) - Qb_tmp; - - phi_p6 = `Phiy(0.6); - `PhiToQb(phi_p6,Qb_tmp) - Qp6_0 = -pd * (xg_ac - phi_p6) - Qb_tmp; - - phi_p7 = `Phiy(0.7); - `PhiToQb(phi_p7,Qb_tmp) - Qp7_0 = -pd * (xg_ac - phi_p7) - Qb_tmp; - - phi_p8 = `Phiy(0.8); - `PhiToQb(phi_p8,Qb_tmp) - Qp8_0 = -pd * (xg_ac - phi_p8) - Qb_tmp; - - phi_p9 = `Phiy(0.9); - `PhiToQb(phi_p9,Qb_tmp) - Qp9_0 = -pd * (xg_ac - phi_p9) - Qb_tmp; - - if (sigVds < 0) begin - `swap(Qp1_0, Qp9_0) - `swap(Qp2_0, Qp8_0) - `swap(Qp3_0, Qp7_0) - `swap(Qp4_0, Qp6_0) - end - end - end // (x_g >0) -end // (SWNQS_i != 0) - -x_sp = 0.0; -x_dp = 0.0; -Qp0 = 0.0; -QpN = 0.0; -if (SWNQS_i != 0.0) begin - x_sp = x_m_ac - sigVds * 0.5 * dps_ac * inv_phit1; - x_dp = x_m_ac + sigVds * 0.5 * dps_ac * inv_phit1; - Qp0 = 0.0; - QpN = 0.0; - if (x_sp > 0) begin - `PhiToQb(x_sp, QbSIGN) - Qp0 = -pd * (xg_ac - x_sp) - QbSIGN; - end - if (x_dp > 0) begin - `PhiToQb(x_dp, QbSIGN) - QpN = -pd * (xg_ac - x_dp) - QbSIGN; - end -end diff --git a/src/spicelib/devices/adms/psp103/admsva/PSP103_macrodefs.include b/src/spicelib/devices/adms/psp103/admsva/PSP103_macrodefs.include deleted file mode 100644 index 0f8ee5c7d..000000000 --- a/src/spicelib/devices/adms/psp103/admsva/PSP103_macrodefs.include +++ /dev/null @@ -1,763 +0,0 @@ -//====================================================================================== -//====================================================================================== -// Filename: PSP103_macrodefs.include -//====================================================================================== -//====================================================================================== -// -// (c) Copyright notice -// -// Since 2015 until today, PSP has been co-developed by NXP Semiconductors and -// CEA-Leti. For this part of the model, each claim undivided ownership and copyrights -// Since 2012 until 2015, PSP has been co-developed by NXP Semiconductors and -// Delft University of Technology. For this part of the model, each claim undivided -// ownership and copyrights -// Until and including 2011, PSP has been co-developed by NXP Semiconductors and -// Arizona State University. For this part of the model, NXP Semiconductors claims -// undivided ownership and copyrights. -// -// -// Version: 103.7.0 (PSP), 200.6.0 (JUNCAP), April 2019 -// -//====================================================================================== -//====================================================================================== -// -// Further information can be found in the file releasenotesPSP103.txt -// - -///////////////////////////////////////////// -// -// Macros and constants used in PSP -// -///////////////////////////////////////////// - -// Explicit Gmin -`define GMIN $simparam("gmin",1e-15) -`define PGIVEN(p) $param_given(p) - -`define PMOS -1 -`define NMOS +1 - -// Some functions -`define MINA(x,y,a) 0.5*((x)+(y)-sqrt(((x)-(y))*((x)-(y))+(a))) -`define MAXA(x,y,a) 0.5*((x)+(y)+sqrt(((x)-(y))*((x)-(y))+(a))) - -`define MNE(x,y,a,mne) \ - tme1 = 4.0 - (a); \ - tme2 = (x) + (y); \ - mne = 2.0 / tme1 * (tme2 - sqrt(tme2 * tme2 - tme1 * (x) * (y))); - -`define MXE(x,y,a,mxe) \ - tme1 = 4.0 - (a); \ - tme2 = (x) + (y); \ - mxe = 2.0 / tme1 * (tme2 + sqrt(tme2 * tme2 - tme1 * (x) * (y))); - -// Physical constants -`define QMN 5.951993 -`define QMP 7.448711 - -// Other constants (PSP-mos) -`define DELTA1 0.02 -`define invSqrt2 7.0710678118654746e-01 -`define oneSixth 1.6666666666666667e-01 -`define LEN 1.0e-6 -`define WEN 1.0e-6 - - -///////////////////////////////////////////////////////////////////////////// -// -// Macro definitions. -// -// Note that because at present locally scoped variables -// can only be in named blocks, the intermediate variables -// used in the macros below must be explicitly declared -// as variables in the main code. -// -///////////////////////////////////////////////////////////////////////////// - -// Function for parameter definition in the case of separate calculation of charge model in saturation -// -------------------------------------------------------------------------------------------------------------- -`define DefACparam(param_i,param_dc,param_ac) \ - param_i = (param_dc); \ - if ($param_given(param_ac) == 1) \ - param_i = (param_ac); - -// sigma function used in surface potential and other calculations -// -------------------------------------------------------------------------------------------------------------- -// Note: one call uses expressions for arguments so parentheses around the arguments in the expressions are necessary -`define sigma(a,c,tau,eta,y) \ - nu = (a) + (c); \ - mutau = nu * nu + (tau) * (0.5 * ((c) * (c)) - (a)); \ - y = (eta) + (a) * nu * (tau) / (mutau + (nu / mutau) * (tau) * (tau) * (c) * ((c) * (c) * `oneThird - (a))); - -// modified version of sigma function, which takes 4 arguments -// -------------------------------------------------------------------------------------------------------------- -`define sigma2(a,b,c,tau,eta,y) \ - nu = (a) + (c); \ - mutau = (nu) * (nu) + (tau) * (0.5 * ((c) * (c)) - (a) * (b)); \ - y = (eta) + (a) * nu * (tau) / (mutau + (nu / mutau) * (tau) * (tau) * (c) * ((c) * (c) * `oneThird - (a) * (b))); - -// sp_s function: surface potential calculation -// -------------------------------------------------------------------------------------------------------------- -`define sp_s(sp,xg,xn,delta) \ - if (abs(xg) <= margin) begin \ - SP_S_temp1 = inv_xi * inv_xi * `oneSixth * `invSqrt2; \ - sp = xg * inv_xi * (1.0 + xg * (1.0 - (delta)) * Gf * SP_S_temp1); \ - end else begin \ - if (xg < -margin) begin \ - SP_S_yg = -xg; \ - SP_S_ysub = 1.25 * (SP_S_yg * inv_xi); \ - SP_S_eta = 0.5 * (SP_S_ysub + 10 - sqrt((SP_S_ysub - 6.0) * (SP_S_ysub - 6.0) + 64.0)); \ - SP_S_temp = SP_S_yg - SP_S_eta; \ - SP_S_a = SP_S_temp * SP_S_temp + Gf2*(SP_S_eta + 1.0);\ - SP_S_c = 2.0 * SP_S_temp - Gf2; \ - SP_S_tau = -SP_S_eta + ln(SP_S_a * inv_Gf2); \ - `sigma(SP_S_a, SP_S_c, SP_S_tau, SP_S_eta, SP_S_y0) \ - `expl_high(SP_S_y0, SP_S_delta0) \ - SP_S_delta1 = 1.0 / SP_S_delta0; \ - SP_S_temp = 1.0 / (2.0 + SP_S_y0 * SP_S_y0); \ - SP_S_xi0 = SP_S_y0 * SP_S_y0 * SP_S_temp; \ - SP_S_xi1 = 4.0 * (SP_S_y0 * SP_S_temp * SP_S_temp); \ - SP_S_xi2 = (8.0 * SP_S_temp - 12.0 * SP_S_xi0) * SP_S_temp * SP_S_temp; \ - SP_S_temp = SP_S_yg - SP_S_y0; \ - SP_S_temp1 = (delta) * SP_S_delta1; \ - SP_S_pC = 2.0 * SP_S_temp + Gf2 * (SP_S_delta0 - 1.0 - SP_S_temp1 + (delta) * (1.0 - SP_S_xi1)); \ - SP_S_qC = SP_S_temp * SP_S_temp - Gf2 * (SP_S_delta0 - SP_S_y0 - 1.0 + SP_S_temp1 + (delta) * (SP_S_y0 - 1.0 - SP_S_xi0)); \ - SP_S_temp = 2.0 - Gf2 * (SP_S_delta0 + SP_S_temp1 - (delta) * SP_S_xi2); \ - SP_S_temp = SP_S_pC * SP_S_pC - 2.0 * (SP_S_qC * SP_S_temp); \ - sp = -SP_S_y0 - 2.0 * (SP_S_qC / (SP_S_pC + sqrt(SP_S_temp))); \ - end else begin \ - SP_xg1 = 1.0 / (1.25 + Gf * 7.324648775608221e-001); \ - SP_S_A_fac= (xi * 1.25 * SP_xg1 - 1.0) * SP_xg1; \ - SP_S_xbar = xg * inv_xi * (1.0 + SP_S_A_fac * xg); \ - `expl_low(-SP_S_xbar, SP_S_temp) \ - SP_S_w = 1.0 - SP_S_temp; \ - SP_S_x1 = xg + Gf2 * 0.5 - Gf * sqrt(xg + Gf2 * 0.25 - SP_S_w); \ - SP_S_bx = (xn) + 3.0; \ - SP_S_eta = `MINA(SP_S_x1, SP_S_bx, 5.0) - 0.5 * (SP_S_bx - sqrt(SP_S_bx * SP_S_bx + 5.0)); \ - SP_S_temp = xg - SP_S_eta; \ - SP_S_temp1= exp(-SP_S_eta); \ - SP_S_temp2= 1.0 / (2.0 + SP_S_eta * SP_S_eta); \ - SP_S_xi0 = SP_S_eta * SP_S_eta * SP_S_temp2; \ - SP_S_xi1 = 4.0 * (SP_S_eta * SP_S_temp2 * SP_S_temp2); \ - SP_S_xi2 = (8.0 * SP_S_temp2 - 12.0 * SP_S_xi0) * SP_S_temp2 * SP_S_temp2; \ - SP_S_a = max(1.0e-40, SP_S_temp * SP_S_temp - Gf2 * (SP_S_temp1 + SP_S_eta - 1.0 - (delta) * (SP_S_eta + 1.0 + SP_S_xi0))); \ - SP_S_b = 1.0 - 0.5 * (Gf2 * (SP_S_temp1 - (delta) * SP_S_xi2)); \ - SP_S_c = 2.0 * SP_S_temp + Gf2 * (1.0 - SP_S_temp1 - (delta) * (1.0 + SP_S_xi1)); \ - SP_S_tau = (xn) - SP_S_eta + ln(SP_S_a / Gf2); \ - `sigma2(SP_S_a, SP_S_b, SP_S_c, SP_S_tau, SP_S_eta, SP_S_x0) \ - if (SP_S_x0 < `se05) begin \ - SP_S_delta0 = exp(SP_S_x0); \ - SP_S_delta1 = 1.0 / SP_S_delta0; \ - SP_S_delta0 = (delta) * SP_S_delta0; \ - end else begin \ - if (SP_S_x0 > (xn) - `se05) begin \ - SP_S_delta0 = exp(SP_S_x0 - (xn)); \ - SP_S_delta1 = (delta) / SP_S_delta0; \ - end else begin \ - SP_S_delta0 = `ke05 / `P3((xn) - SP_S_x0 - `se05); \ - SP_S_delta1 = `ke05 / `P3(SP_S_x0 - `se05); \ - end \ - end \ - SP_S_temp = 1.0 / (2.0 + SP_S_x0 * SP_S_x0); \ - SP_S_xi0 = SP_S_x0 * SP_S_x0 * SP_S_temp; \ - SP_S_xi1 = 4.0 * (SP_S_x0 * SP_S_temp * SP_S_temp); \ - SP_S_xi2 = (8.0 * SP_S_temp - 12.0 * SP_S_xi0) * SP_S_temp * SP_S_temp; \ - SP_S_temp = xg - SP_S_x0; \ - SP_S_pC = 2.0 * SP_S_temp + Gf2 * (1.0 - SP_S_delta1 + SP_S_delta0 - (delta) * (1.0 + SP_S_xi1)); \ - SP_S_qC = SP_S_temp * SP_S_temp - Gf2 * (SP_S_delta1 + SP_S_x0 - 1.0 + SP_S_delta0 - (delta) * (SP_S_x0 + 1.0 + SP_S_xi0)); \ - SP_S_temp = 2.0 - Gf2 * (SP_S_delta1 + SP_S_delta0 - (delta) * SP_S_xi2); \ - SP_S_temp = SP_S_pC * SP_S_pC - 2.0 * (SP_S_qC * SP_S_temp); \ - sp = SP_S_x0 + 2.0 * (SP_S_qC / (SP_S_pC + sqrt(SP_S_temp))); \ - end \ - end - -// sp_s_d function: surface potential calculation at drain (subset of function sp_s) -// -------------------------------------------------------------------------------------------------------------- -`define sp_s_d(sp,xg,xn,delta) \ - if (abs(xg) <= margin) begin \ - SP_S_temp1 = inv_xi * inv_xi * `oneSixth * `invSqrt2; \ - sp = xg * inv_xi * (1.0 + xg * (1.0 - (delta)) * Gf * SP_S_temp1); \ - end else begin \ - SP_S_bx = (xn) + 3; \ - SP_S_eta = `MINA(SP_S_x1, SP_S_bx, 5.0) - 0.5 * (SP_S_bx - sqrt(SP_S_bx * SP_S_bx + 5.0)); \ - SP_S_temp = xg - SP_S_eta; \ - SP_S_temp1= exp(-SP_S_eta); \ - SP_S_temp2= 1.0 / (2.0 + SP_S_eta * SP_S_eta); \ - SP_S_xi0 = SP_S_eta * SP_S_eta * SP_S_temp2; \ - SP_S_xi1 = 4.0 * (SP_S_eta * SP_S_temp2 * SP_S_temp2); \ - SP_S_xi2 = (8.0 * SP_S_temp2 - 12.0 * SP_S_xi0) * SP_S_temp2 * SP_S_temp2; \ - SP_S_a = max(1.0e-40, SP_S_temp * SP_S_temp - Gf2 * (SP_S_temp1 + SP_S_eta - 1.0 - (delta) * (SP_S_eta + 1.0 + SP_S_xi0))); \ - SP_S_b = 1.0 - 0.5 * (Gf2 * (SP_S_temp1 - (delta) * SP_S_xi2)); \ - SP_S_c = 2.0 * SP_S_temp + Gf2 * (1.0 - SP_S_temp1 - (delta) * (1.0 + SP_S_xi1)); \ - SP_S_tau = (xn) - SP_S_eta + ln(SP_S_a / Gf2); \ - `sigma2(SP_S_a, SP_S_b, SP_S_c, SP_S_tau, SP_S_eta, SP_S_x0) \ - if (SP_S_x0 < `se05) begin \ - SP_S_delta0 = exp(SP_S_x0); \ - SP_S_delta1 = 1.0 / SP_S_delta0; \ - SP_S_delta0 = (delta) * SP_S_delta0; \ - end else begin \ - if (SP_S_x0 > (xn) - `se05) begin \ - SP_S_delta0 = exp(SP_S_x0 - (xn)); \ - SP_S_delta1 = (delta) / SP_S_delta0; \ - end else begin \ - SP_S_delta0 = `ke05 / `P3((xn) - SP_S_x0 - `se05); \ - SP_S_delta1 = `ke05 / `P3(SP_S_x0 - `se05); \ - end \ - end \ - SP_S_temp = 1.0 / (2.0 + SP_S_x0 * SP_S_x0); \ - SP_S_xi0 = SP_S_x0 * SP_S_x0 * SP_S_temp; \ - SP_S_xi1 = 4.0 * (SP_S_x0 * SP_S_temp * SP_S_temp); \ - SP_S_xi2 = (8.0 * SP_S_temp-12.0 * SP_S_xi0) * SP_S_temp * SP_S_temp; \ - SP_S_temp = xg - SP_S_x0; \ - SP_S_pC = 2.0 * SP_S_temp + Gf2 * (1.0 - SP_S_delta1 + SP_S_delta0 - (delta) * (1.0 + SP_S_xi1)); \ - SP_S_qC = SP_S_temp * SP_S_temp - Gf2 * (SP_S_delta1 + SP_S_x0 - 1.0 + SP_S_delta0 - (delta) * (SP_S_x0 + 1.0 + SP_S_xi0)); \ - SP_S_temp = 2.0 - Gf2*(SP_S_delta1+SP_S_delta0-(delta)*SP_S_xi2); \ - SP_S_temp = SP_S_pC * SP_S_pC - 2.0 * (SP_S_qC * SP_S_temp); \ - sp = SP_S_x0 + 2.0 * (SP_S_qC / (SP_S_pC + sqrt(SP_S_temp)));\ - end - -// sp_ovInit function: surface potential calculation for the overlap regions initialization -// -------------------------------------------------------------------------------------------------------------- -`define sp_ovInit(GOV, GOV2, SP_OV_eps2, SP_OV_a, SP_OV_delta1) \ - inv_GOV = 1.0 / GOV; \ - SP_OV_eps = 3.1 * GOV + 8.5; \ - SP_OV_eps2 = SP_OV_eps * SP_OV_eps; \ - SP_OV_delta = 0.5 * SP_OV_eps; \ - if (inv_GOV < 0.06) begin \ - SP_OV_a = 64.0 * inv_GOV; \ - end else begin \ - if (inv_GOV <= 0.45) begin \ - SP_OV_a = 22.0 * inv_GOV + 3.0; \ - end else begin \ - if (inv_GOV <= 1.6) begin \ - SP_OV_a = -7.2 * inv_GOV + 15.5; \ - end else begin \ - SP_OV_a = GOV; \ - end \ - end \ - end \ - SP_OV_delta1 = SP_OV_delta + GOV2 * 0.5 - GOV * sqrt(SP_OV_delta + GOV2 * 0.25 + SP_OV_a); - -// qi_edge charge calculation for the edge transistor -// -------------------------------------------------------------------------------------------------------------- -`define qi_edge(qieff_edge,xg_edge,xn_edge) \ - Q_EDGE_xsth = xbedge + xn_edge; \ - Q_EDGE_xth0 = Q_EDGE_xsth + Gfedge * sqrt(Q_EDGE_xsth); \ - Q_EDGE_xth = Q_EDGE_xth0 + dxthedge; \ - Q_EDGE_n = 1.0 + Gfedge / (2.0 * sqrt(Q_EDGE_xsth)); \ - Q_EDGE_n_inv = 1.0 / Q_EDGE_n; \ - Q_EDGE_xgt = xg_edge - Q_EDGE_xth; \ - if (Q_EDGE_xgt > -12.0) begin \ - Q_EDGE_xgt0 = Q_EDGE_xgt + lnGfedge2 - 1.0; \ - Q_EDGE_xgt0e = 0.5 * (Q_EDGE_xgt0 + sqrt(Q_EDGE_xgt0 * Q_EDGE_xgt0 + 10.0)); \ - Q_EDGE_qi0si = Q_EDGE_xgt - Q_EDGE_n * ln(Q_EDGE_xgt0e) + lnGfedge2; \ - Q_EDGE_qi0 = 0.5 * (Q_EDGE_qi0si + sqrt(Q_EDGE_qi0si * Q_EDGE_qi0si + 2.0)); \ - `expl_high((Q_EDGE_xgt - Q_EDGE_qi0), Q_EDGE_exp_x) \ - Q_EDGE_d0 = Gfedge2 * Q_EDGE_exp_x; \ - Q_EDGE_d0p = pow(Q_EDGE_d0, Q_EDGE_n_inv); \ - Q_EDGE_sqerr = Q_EDGE_n * Q_EDGE_n + (2.0 * (Q_EDGE_qi0 + Q_EDGE_n) - Q_EDGE_d0p) * Q_EDGE_d0p; \ - Q_EDGE_errq = Q_EDGE_n * ((sqrt(Q_EDGE_sqerr) - Q_EDGE_n) / Q_EDGE_d0p - 1.0); \ - qieff_edge = Q_EDGE_qi0 - Q_EDGE_errq; \ - end else begin \ - `expl_low((Q_EDGE_n_inv * (Q_EDGE_xgt + lnGfedge2)), qieff_edge) \ - end - -// CollapsableR macro: used for parasitic resistances -// -------------------------------------------------------------------------------------------------------------- -// Note: if R=0, the Verilog-A compiler should recognize that the corresponding nodes can be collapsed -`define CollapsableR(G, R, SN, N1, N2, Rname) \ - if ((R) > 0.0) begin \ - I(N1, N2) <+ MULT_i * (G) * V(N1, N2); \ - /* line below can be removed if compiler issue occurs */ \ - I(N1, N2) <+ white_noise(MULT_i * SN, Rname); \ - end else begin \ - V(N1, N2) <+ 0.0; \ - end - -//ngspice-adms: can't node collapse -`define NonCollapsableR(G, R, SN, N1, N2, Rname) \ - I(N1, N2) <+ MULT_i * (G) * V(N1, N2); \ - I(N1, N2) <+ white_noise(MULT_i * SN, Rname); - -// Local variable declaration (used in SPcalc_dc/SPcalc_ac sections, PSP103_SPCalculation.include and SP macro) -// -------------------------------------------------------------------------------------------------------------- -//`define SPcalcLocalVarDecl \ -// real phib, G_0, Vsbstar, cfloc, thesatloc, axloc, alploc; \ -// real Vsbx, xg, Dnsub, Gf, Gf2, inv_Gf2, xi, inv_xi, Ux, xn_s, delta_ns, margin, x_s, delta_1s, xi0s, xi1s; \ -// real xi2s, Es, Ds, Ps, Rxcor, xgs, qis, qbs, rhob, GR, Eeffm, Mutmp, Gmob, xitsb, wsat, thesat1, phi_inf; \ -// real ysat, za, Phi_0, asat, Phi_2, Phi_0_2, Phi0_Phi2, Phi_sat, Vdse, Udse, xn_d, k_ds, delta_nd, x_d, x_ds; \ -// real pC, qC, dps, xi0d, Ed, Dd, x_m, Em, D_bar, Dm, Pm, xgm, eta_p, sqm, alpha, d0, x_pm, p_pd, q_pd, xi_pd; \ -// real u_pd, km, km0, qim, qim1, qbm, qeff, qeff1, s1, dL, GdL, Gmob_dL, zsat, Gvsat, Gvsatinv, Voxm, alpha1, H; \ -// real SP_S_temp, SP_S_temp1, SP_S_temp2; \ -// real SP_S_yg, SP_S_ysub, SP_S_eta, SP_S_a, SP_S_c, SP_S_tau, SP_S_y0, SP_S_delta0, SP_S_delta1, SP_S_xi0; \ -// real SP_S_xi1, SP_S_xi2, SP_S_pC, SP_S_qC, SP_xg1, SP_S_A_fac, SP_S_xbar, SP_S_w, SP_S_x1, SP_S_bx, SP_S_b; \ -// real SP_S_x0; - -// TempInitialize macro: initialize the temperature dependent variables -// -------------------------------------------------------------------------------------------------------------- -`define TempInitialize \ - TKD_sq = TKD * TKD; \ - delT = TKD - TKR; \ - rTn = TKR / TKD; \ - ln_rTn = ln(rTn); \ - phit = TKD * `KBOL / `QELE; \ - inv_phit = 1.0 / phit; \ - Eg = 1.179 - 9.025e-5 * TKD - 3.05e-7 * TKD_sq; \ - phibFac = (1.045 + 4.5e-4 * TKD) * (0.523 + 1.4e-3 * TKD - 1.48e-6 * TKD_sq) * TKD_sq / 9.0E4; \ - phibFac = `MAX(phibFac, 1.0E-3); \ - \ - /* parameter for white noise of parasitic resistances */ \ - nt0 = 4.0 * `KBOL * TKD; - -// TempScaling macro: calculation of temperature dependent variables -// -------------------------------------------------------------------------------------------------------------- -`define TempScaling \ - phib_dc = Eg + DPHIB_i + 2.0 * phit * ln(NEFF_i * pow(phibFac, -0.75) * 4.0e-26); \ - phib_dc = `MAX(phib_dc, 5.0E-2); \ - G_0_dc = sqrt(2.0 * `QELE * NEFF_i * EPSSI * inv_phit) / CoxPrime; \ - \ - /* Poly-silicon depletion */ \ - kp = 0.0; \ - np = 0.0; \ - if (NP_i > 0.0) begin \ - arg2max = 8.0e7 / tox_sq; \ - np = `MAX(NP_i, arg2max); \ - np = `MAX(5.0e24, np); \ - kp = 2.0 * CoxPrime * CoxPrime * phit / (`QELE * np * EPSSI); \ - end \ - \ - /* QM corrections */ \ - qlim2 = 100.0 * phit * phit; \ - if (QMC_i > 0.0) begin \ - qb0 = sqrt(phit * G_0_dc * G_0_dc * phib_dc); \ - dphibq = 0.75 * qq * pow(qb0, `twoThirds); \ - phib_dc = phib_dc + dphibq; \ - G_0_dc = G_0_dc * (1.0 + 2.0 * `twoThirds * dphibq / qb0); \ - end \ - sqrt_phib_dc = sqrt(phib_dc); \ - phix_dc = 0.95 * phib_dc; \ - aphi_dc = 0.0025 * phib_dc * phib_dc; \ - bphi_dc = aphi_dc; \ - phix2 = 0.5 * sqrt(bphi_dc); \ - phix1_dc = `MINA(phix_dc - phix2, 0.0, aphi_dc); \ - alpha_b = 0.5 * (phib_dc + Eg); \ - us1 = sqrt(VSBNUD_i + phib_dc) - sqrt_phib_dc; \ - us21 = sqrt(VSBNUD_i + DVSBNUD_i + phib_dc) - sqrt_phib_dc - us1; \ - \ - /* Additional variables for separate surface potential calculation for CV */ \ - phib_ac = Eg + DPHIB_i + DELVTAC_i + 2.0 * phit * ln(NEFFAC_i * pow(phibFac, -0.75) * 4.0e-26); \ - phib_ac = `MAX(phib_ac, 5.0E-2); \ - G_0_ac = sqrt(2.0 * `QELE * NEFFAC_i * EPSSI * inv_phit) / CoxPrime; \ - \ - if (QMC_i > 0.0) begin \ - qb0 = sqrt(phit * G_0_ac * G_0_ac * phib_ac); \ - dphibq = 0.75 * qq * pow(qb0, `twoThirds); \ - phib_ac = phib_ac + dphibq; \ - G_0_ac = G_0_ac * (1.0 + 2.0 * `twoThirds * dphibq / qb0); \ - end \ - \ - phix_ac = 0.95 * phib_ac; \ - aphi_ac = 0.0025 * phib_ac * phib_ac; \ - bphi_ac = aphi_ac; \ - phix2 = 0.5 * sqrt(bphi_ac); \ - phix1_ac = `MINA(phix_ac - phix2, 0.0, aphi_ac); \ - \ - /* Temperature scaling of parameters*/ \ - VFB_T = VFB_i + STVFB_i * delT * (1.0 + ST2VFB_i * delT)+ DELVTO_i; \ - \ - /* Interface states parameters*/ \ - tf_ct = exp(STCT_i * ln_rTn); \ - CT_T = CT_i * tf_ct; \ - CTG_T = CTG_i / rTn; \ - \ - /* Mobility parameters */ \ - tf_bet = exp(STBET_i * ln_rTn); \ - BETN_T = BETN_i * tf_bet; \ - BET_i = FACTUO_i * BETN_T * CoxPrime; \ - THEMU_T = THEMU_i * exp(STTHEMU_i * ln_rTn); \ - tf_mue = exp(STMUE_i * ln_rTn); \ - MUE_T = MUE_i * tf_mue; \ - THECS_T = THECS_i * exp(STTHECS_i * ln_rTn); \ - tf_cs = exp(STCS_i * ln_rTn); \ - CS_T = CS_i * tf_cs; \ - tf_xcor = exp(STXCOR_i * ln_rTn); \ - XCOR_T = XCOR_i * tf_xcor; \ - \ - /* Series resistance */ \ - tf_ther = exp(STRS_i * ln_rTn); \ - RS_T = RS_i * tf_ther; \ - THER_i = 2.0 * BET_i * RS_T; \ - \ - /* Velocity saturation */ \ - tf_thesat = exp(STTHESAT_i * ln_rTn); \ - THESAT_T = THESAT_i * tf_thesat; \ - THESATAC_T = THESATAC_i * tf_thesat; \ - \ - /* Impact ionization */ \ - A2_T = A2_i * exp(-STA2_i * ln_rTn); \ - \ - /* Noise */ \ - nt = FNT_i * 4.0 * `KBOL * TKD; \ - Sfl_prefac = phit * phit * BET_i / Cox_over_q; \ - \ - /* Edge transistor */ \ - if ((SWEDGE_i != 0.0) && (BETNEDGE_i > 0.0)) begin \ - VFBEDGE_T = VFBEDGE_i + STVFBEDGE_i * delT + DELVTOEDGE_i; \ - tf_betedge = exp(STBETEDGE_i * ln_rTn); \ - BETNEDGE_T = BETNEDGE_i * tf_betedge; \ - BETEDGE_i = FACTUOEDGE_i * BETNEDGE_T * CoxPrime; \ - phit0edge = phit * (1.0 + CTEDGE_i * rTn); \ - phibedge = Eg + DPHIBEDGE_i + 2.0 * phit0edge * ln(NEFFEDGE_i * pow(phibFac, -0.75) * 4.0e-26); \ - phibedge = `MAX(phibedge, 5.0E-2); \ - Gfedge = sqrt(2.0 * `QELE * NEFFEDGE_i * EPSSI * inv_phit) / CoxPrime; \ - Gfedge2 = Gfedge * Gfedge; \ - lnGfedge2 = ln(Gfedge2); \ - phixedge = 0.95 * phibedge; \ - aphiedge = 0.0025 * phibedge * phibedge; \ - bphiedge = aphiedge; \ - phix2edge = 0.5 * sqrt(bphiedge); \ - phix1edge = `MINA(phixedge - phix2edge, 0.0, aphiedge); \ - Sfl_prefac_edge = phit * phit * BETEDGE_i / Cox_over_q; \ - ntedge = FNTEDGE_i * 4.0 * `KBOL * TKD; \ - end else begin \ - VFBEDGE_T = 0.0; \ - tf_betedge = 1.0; \ - BETNEDGE_T = 0.0; \ - BETEDGE_i = 0.0; \ - phit0edge = phit; \ - phibedge = 0.0; \ - Gfedge = 1.0; \ - Gfedge2 = 1.0; \ - lnGfedge2 = 0.0; \ - phixedge = 0.0; \ - aphiedge = 0.0; \ - bphiedge = 0.0; \ - phix2edge = 0.0; \ - phix1edge = 0.0; \ - Sfl_prefac_edge = 0.0; \ - ntedge = 1.0; \ - end - -// Model's core for currents and charges calculation (initially into PSP103_SPCalculation.include) -// -------------------------------------------------------------------------------------------------------------- -`define SPCalculation \ - \ - /* Initialisation of some variables */ \ - alpha = 0.0; \ - GdL = 1.0; \ - dL = 0.0; \ - qbm = 0.0; \ - dps = 0.0; \ - qim = 0.0; \ - qim1 = 0.0; \ - H = 1.0; \ - s1 = 0.0; \ - eta_p = 1.0; \ - Gvsat = 1.0; \ - Gvsatinv = 1.0; \ - SP_S_x1 = 0.0; \ - x_s = 0.0; \ - sqm = 0.0; \ - xitsb = 0.0; \ - rhob = 0.0; \ - Gmob = 1.0; \ - Gmob_dL = 1.0; \ - Udse = 0.0; \ - thesat1 = 0.0; \ - xgm = 0.0; \ - \ - /* Bias definition */ \ - Vgb1 = Vgs + Vsbstar - VFB_T; \ - Vsbx = Vsbstar + 0.5 * (Vds - Vdsx); \ - Vdsp = 2.0 * Vdsx / (1.0 + sqrt(1.0 + CFD_i * Vdsx)); \ - delVg = cfloc * Vdsp * (1.0 + CFB_i * Vsbx); \ - dphit1 = PSCE_i * (1.0 + PSCED_i * Vdsx) * (1.0 + PSCEB_i * Vsbx); \ - Vgb1 = Vgb1 + delVg; \ - \ - /* Bias dependent body factor */ \ - if (DNSUB_i > 0.0) begin \ - Dnsub = DNSUB_i * `MAXA(0.0, Vgs + Vsb - VNSUB_i, NSLP_i); \ - Gf = G_0 * sqrt(1.0 + Dnsub); \ - end else begin \ - Gf = G_0; \ - end \ - Gf2 = Gf * Gf; \ - inv_Gf2 = 1.0 / Gf2; \ - \ - /* Bias dependence of interface states */ \ - dCTG = 1.0; \ - if (CTG_i > 0.0) begin \ - xgct = 2.0 * Vgb1 * inv_phit; \ - temp1 = Gf2 + xgct; \ - temp2 = `MAXA((temp1 + xgct), 0.0, 5.0); \ - xsct0 = 0.5 * (temp1 - Gf * sqrt(temp2)); \ - xbct = phib * inv_phit; \ - xsbstar = Vsbx * inv_phit; \ - temp1 = xbct + xsbstar + 2.0; \ - xsct = `MINA(xsct0, temp1, 5.0); \ - temp2 = CTG_T * (xsct - (1.0 + CTB_i) * (0.5 * xbct + xsbstar)); \ - `expl_low(temp2, dCTG) \ - end \ - ct_fact = 1.0 + CT_T * dCTG; \ - phit1 = phit * ct_fact * (1.0 + dphit1); \ - inv_phit1 = 1.0 / phit1; \ - xg = Vgb1 * inv_phit1; \ - \ - /* Surface potential at source side */ \ - xi = 1.0 + Gf * `invSqrt2; \ - inv_xi = 1.0 / xi; \ - Ux = Vsbstar * inv_phit1; \ - xn_s = phib * inv_phit1 + Ux; \ - if (xn_s < `se) \ - delta_ns = exp(-xn_s); \ - else \ - delta_ns = `ke / `P3(xn_s - `se); \ - margin = 1.0e-5 * xi; \ - \ - `sp_s(x_s, xg, xn_s, delta_ns) \ - x_d = x_s; \ - x_m = x_s; \ - x_ds = 0.0; \ - \ - /* Core PSP current calculation */ \ - Vdsat_lim = 3.912023005 * phit1; \ - if (xg <= 0.0) begin \ - qis = 0.0; \ - xgm = xg - x_s; \ - Voxm = xgm * phit1; \ - qeff1 = Voxm; \ - Vdsat = Vdsat_lim; \ - Vdse = Vds; \ - end else begin /* (xg > 0) */ \ - delta_1s = 0.0; \ - temp = 1.0 / (2.0 + x_s * x_s); \ - xi0s = x_s * x_s * temp; \ - xi1s = 4.0 * (x_s * temp * temp); \ - xi2s = (8.0 * temp - 12.0 * xi0s) * temp * temp; \ - if (x_s < `se05) begin \ - delta_1s = exp(x_s); \ - Es = 1.0 / delta_1s; \ - delta_1s = delta_ns * delta_1s; \ - end else if (x_s > (xn_s - `se05)) begin \ - delta_1s = exp(x_s - xn_s); \ - Es = delta_ns / delta_1s; \ - end else begin \ - delta_1s = `ke05 / `P3(xn_s - x_s - `se05); \ - Es = `ke05 / `P3(x_s - `se05); \ - end \ - Ds = delta_1s - delta_ns * (x_s + 1.0 + xi0s); \ - if (x_s < 1.0e-5) begin \ - Ps = 0.5 * (x_s * x_s * (1.0 - `oneThird * (x_s * (1.0 - 0.25 * x_s)))); \ - Ds = `oneSixth * (delta_ns * x_s * x_s * x_s * (1.0 + 1.75 * x_s)); \ - temp = sqrt(1.0 - `oneThird * (x_s * (1.0 - 0.25 * x_s))); \ - sqm = `invSqrt2 * (x_s * temp); \ - alpha = 1.0 + Gf * `invSqrt2 * (1.0 - 0.5 * x_s + `oneSixth * (x_s * x_s)) / temp; \ - end else begin \ - Ps = x_s - 1.0 + Es; \ - sqm = sqrt(Ps); \ - alpha = 1.0 + 0.5 * (Gf * (1.0 - Es) / sqm); \ - end \ - Em = Es; \ - Ed = Em; \ - Dm = Ds; \ - Dd = Dm; \ - \ - /* Drain saturation voltage */ \ - Rxcor = (1.0 + 0.2 * XCOR_T * Vsbx) / (1.0 + XCOR_T * Vsbx); \ - if (Ds > `ke05) begin \ - xgs = Gf * sqrt(Ps + Ds); \ - qis = Gf2 * Ds * phit1 / (xgs + Gf * sqm); \ - qbs = sqm * Gf * phit1; \ - if (RSB_i < 0.0) begin \ - rhob = 1.0 / (1.0 - RSB_i * Vsbx); \ - end else begin \ - rhob = 1.0 + RSB_i * Vsbx; \ - end \ - if (RSG_i < 0.0) begin \ - temp = 1.0 - RSG_i * qis; \ - end else begin \ - temp = 1.0 / (1.0 + RSG_i * qis); \ - end \ - GR = THER_i * (rhob * temp * qis); \ - Eeffm = E_eff0 * (qbs + eta_mu * qis); \ - temp1 = ln(Ps / (Ps + Ds + 1.0e-14)); \ - Mutmp = pow(Eeffm * MUE_T, THEMU_T) + CS_T * exp(0.5 * THECS_T * temp1); \ - Gmob = (1.0 + Mutmp + GR) * Rxcor; \ - if (THESATB_i < 0.0) begin \ - xitsb = 1.0 / (1.0 - THESATB_i * Vsbx); \ - end else begin \ - xitsb = 1.0 + THESATB_i * Vsbx; \ - end \ - temp2 = qis * xitsb; \ - wsat = 100.0 * (temp2 / (100.0 + temp2)); \ - if (THESATG_i < 0.0) begin \ - temp = 1.0 / (1.0 - THESATG_i * wsat); \ - end else begin \ - temp = 1.0 + THESATG_i * wsat; \ - end \ - thesat1 = thesatloc * (temp / Gmob); \ - phi_inf = qis / alpha + phit1; \ - ysat = thesat1 * phi_inf * `invSqrt2; \ - if (CHNL_TYPE==`PMOS) begin \ - ysat = ysat / sqrt(1.0 + ysat); \ - end \ - za = 2.0 / (1.0 + sqrt(1.0 + 4.0 * ysat)); \ - temp1 = za * ysat; \ - Phi_0 = phi_inf * za * (1.0 + 0.86 * (temp1 * (1.0 - temp1 * za) / (1.0 + 4.0 * (temp1 * temp1 * za)))); \ - asat = xgs + 0.5 * Gf2; \ - Phi_2 = 0.98 * (Gf2 * Ds * phit1 / (asat + sqrt(asat * asat - Gf2 * Ds * 0.98))); \ - Phi_0_2 = Phi_0 + Phi_2; \ - Phi0_Phi2 = 2.0 * (Phi_0 * Phi_2); \ - Phi_sat = Phi0_Phi2 / (Phi_0_2 + sqrt(Phi_0_2 * Phi_0_2 - 1.98 * Phi0_Phi2)); \ - Vdsat = Phi_sat - phit1 * ln(1.0 + Phi_sat * (Phi_sat - 2.0 * asat * phit1) * inv_Gf2 / (phit1 * phit1 * Ds)); \ - end else begin \ - Vdsat = Vdsat_lim; \ - end \ - temp = pow(Vds / Vdsat, axloc); \ - temp1 = -1.0 / axloc; \ - Vdse = Vds * pow(1.0 + temp, temp1); \ - \ - /* Surface potential at drain side */ \ - Udse = Vdse * inv_phit1; \ - xn_d = xn_s + Udse; \ - if (Udse < `se) begin \ - k_ds = exp(-Udse); \ - end else begin \ - k_ds = `ke / `P3(Udse - `se); \ - end \ - delta_nd = delta_ns * k_ds; \ - \ - `sp_s_d(x_d, xg, xn_d, delta_nd) \ - x_ds = x_d - x_s; \ - \ - /* Approximations for extremely small x_ds: capacitance calculation */ \ - if (x_ds < 1.0e-10) begin \ - pC = 2.0 * (xg - x_s) + Gf2 * (1.0 - Es + delta_1s * k_ds - delta_nd * (1.0 + xi1s)); \ - qC = Gf2 * (1.0 - k_ds) * Ds; \ - temp = 2.0 - Gf2 * (Es + delta_1s * k_ds - delta_nd * xi2s); \ - temp = pC * pC - 2.0 * (temp * qC); \ - x_ds = 2.0 * (qC / (pC + sqrt(temp))); \ - x_d = x_s + x_ds; \ - end \ - dps = x_ds * phit1; \ - \ - xi0d = x_d * x_d / (2.0 + x_d * x_d); \ - if (x_d < `se05) begin \ - Ed = exp(-x_d); \ - if (x_d < 1.0e-5) begin \ - Dd = `oneSixth * delta_nd * x_d * x_d * x_d * (1.0 + 1.75 * x_d); \ - end else begin \ - Dd = delta_nd * (1.0 / Ed - x_d - 1.0 - xi0d); \ - end \ - end else begin \ - if (x_d > (xn_d - `se05)) begin \ - temp = exp(x_d - xn_d); \ - Ed = delta_nd / temp; \ - Dd = temp - delta_nd * (x_d + 1.0 + xi0d); \ - end else begin \ - Ed = `ke05 / `P3(x_d - `se05); \ - temp = `ke05 / `P3(xn_d - x_d - `se05); \ - Dd = temp - delta_nd * (x_d + 1.0 + xi0d); \ - end \ - end \ - \ - /* Mid-point surface potential */ \ - x_m = 0.5 * (x_s + x_d); \ - Em = 0.0; \ - temp = Ed * Es; \ - if (temp > 0.0) begin \ - Em = sqrt(temp); \ - end \ - D_bar = 0.5 * (Ds + Dd); \ - Dm = D_bar + 0.125 * (x_ds * x_ds * (Em - 2.0 * inv_Gf2)); \ - \ - if (x_m < 1.0e-5) begin \ - Pm = 0.5 * (x_m * x_m * (1.0 - `oneThird * (x_m * (1.0 - 0.25 * x_m)))); \ - xgm = Gf * sqrt(Dm + Pm); \ - \ - /* Polysilicon depletion */ \ - if (kp > 0.0) begin \ - eta_p = 1.0 / sqrt(1.0 + kp * xgm); \ - end /* (kp > 0.0) */ \ - temp = sqrt(1.0 - `oneThird * (x_m * (1.0 - 0.25 * x_m))); \ - sqm = `invSqrt2 * (x_m * temp); \ - alpha = eta_p + `invSqrt2 * (Gf * (1.0 - 0.5 * x_m + `oneSixth * (x_m * x_m)) / temp); \ - end else begin \ - Pm = x_m - 1.0 + Em; \ - xgm = Gf * sqrt(Dm + Pm); \ - \ - /* Polysilicon depletion */ \ - if (kp > 0.0) begin \ - d0 = 1.0 - Em + 2.0 * (xgm * inv_Gf2); \ - eta_p = 1.0 / sqrt(1.0 + kp * xgm); \ - temp = eta_p / (eta_p + 1.0); \ - x_pm = kp * (temp * temp * Gf2 * Dm); \ - p_pd = 2.0 * (xgm - x_pm) + Gf2 * (1.0 - Em + Dm); \ - q_pd = x_pm * (x_pm - 2.0 * xgm); \ - xi_pd = 1.0 - 0.5 * (Gf2 * (Em + Dm)); \ - u_pd = q_pd * p_pd / (p_pd * p_pd - xi_pd * q_pd); \ - x_m = x_m + u_pd; \ - km = exp(u_pd); \ - Em = Em / km; \ - Dm = Dm * km; \ - Pm = x_m - 1.0 + Em; \ - xgm = Gf * sqrt(Dm + Pm); \ - km0 = 1.0 - Em + 2.0 * (xgm * eta_p * inv_Gf2); \ - x_ds = x_ds * km * (d0 + D_bar) / (km0 + km * D_bar); \ - dps = x_ds * phit1; \ - end /* (kp > 0.0) */ \ - sqm = sqrt(Pm); \ - alpha = eta_p + 0.5 * (Gf * (1.0 - Em) / sqm); \ - end \ - \ - /* Potential midpoint inversion charge */ \ - qim = phit1 * (Gf2 * Dm / (xgm + Gf * sqm)); \ - qim1 = qim + phit1 * alpha; \ - qbm = sqm * Gf * phit1; \ - \ - /* Series resistance */ \ - if (RSG_i < 0.0) begin \ - temp = 1.0 - RSG_i * qim; \ - end else begin \ - temp = 1.0 / (1.0 + RSG_i * qim); \ - end \ - GR = THER_i * (rhob * temp * qim); \ - \ - /* Mobility reduction */ \ - qeff = qbm + eta_mu * qim; \ - qeff1 = qbm + eta_mu1 * qim; \ - Eeffm = E_eff0 * qeff; \ - temp1 = ln(Pm / (Pm + Dm + 1.0e-14)); \ - Mutmp = pow(Eeffm * MUE_T, THEMU_T) + CS_T * exp(0.5 * THECS_T * temp1); \ - Gmob = (1.0 + Mutmp + GR) * Rxcor; \ - \ - /* Channel length modulation */ \ - s1 = ln((1.0 + (Vds - dps) * inv_VP) / (1.0 + (Vdse - dps) * inv_VP)); \ - dL = alploc * s1; \ - GdL = 1.0 / (1.0 + dL + dL * dL); \ - \ - /* Velocity saturation */ \ - temp2 = qim * xitsb; \ - wsat = 100.0 * (temp2 / (100.0 + temp2)); \ - Gmob_dL = Gmob * GdL; \ - if (THESATG_i < 0.0) begin \ - temp = 1.0 / (1.0 - THESATG_i * wsat); \ - end else begin \ - temp = 1.0 + THESATG_i * wsat; \ - end \ - thesat1 = thesatloc * (temp / Gmob_dL); \ - zsat = thesat1 * thesat1 * dps * dps; \ - if (CHNL_TYPE == `PMOS) begin \ - zsat = zsat / (1.0 + thesat1 * dps); \ - end \ - Gvsat = 0.5 * (Gmob_dL * (1.0 + sqrt(1.0 + 2.0 * zsat))); \ - Gvsatinv = 1.0 / Gvsat; \ - \ - /* Variables for calculation of intrinsic charges and gate current */ \ - Voxm = xgm * phit1; \ - temp = Gmob_dL * Gvsatinv; \ - alpha1 = alpha * (1.0 + 0.5 * (zsat * temp * temp)); \ - H = temp * qim1 / alpha1; \ - \ - end /* (xg > 0) */ - diff --git a/src/spicelib/devices/adms/psp103/admsva/PSP103_module.include b/src/spicelib/devices/adms/psp103/admsva/PSP103_module.include deleted file mode 100644 index c4da68a2e..000000000 --- a/src/spicelib/devices/adms/psp103/admsva/PSP103_module.include +++ /dev/null @@ -1,2322 +0,0 @@ -//====================================================================================== -//====================================================================================== -// Filename: PSP103_module.include -//====================================================================================== -//====================================================================================== -// -// (c) Copyright notice -// -// Since 2015 until today, PSP has been co-developed by NXP Semiconductors and -// CEA-Leti. For this part of the model, each claim undivided ownership and copyrights -// Since 2012 until 2015, PSP has been co-developed by NXP Semiconductors and -// Delft University of Technology. For this part of the model, each claim undivided -// ownership and copyrights -// Until and including 2011, PSP has been co-developed by NXP Semiconductors and -// Arizona State University. For this part of the model, NXP Semiconductors claims -// undivided ownership and copyrights. -// -// -// Version: 103.7.0 (PSP), 200.6.0 (JUNCAP), April 2019 -// -//====================================================================================== -//====================================================================================== -// -// Further information can be found in the file releasenotesPSP103.txt -// -// -------------------------------------------------------------------------------------------------------------- -// Node definitions -// -------------------------------------------------------------------------------------------------------------- - -`ifdef SelfHeating - inout D, G, S, B, DT; -`else // SelfHeating - inout D, G, S, B; -`endif // SelfHeating -electrical D; -electrical G; -electrical S; -electrical B; -`ifdef SelfHeating - thermal DT; - branch (DT) br_rth, br_ith; -`endif // SelfHeating - -// Internal nodes and branches for correlated drain and gate noise -electrical NOI; -branch (NOI) NOII; -branch (NOI) NOIR; -branch (NOI) NOIC; - -// Internal nodes for gate and bulk resistors -electrical GP; -electrical SI; -electrical DI; -electrical BP; -electrical BI; -electrical BS; -electrical BD; - -// Internal nodes and branches for spline collocation (NQS) -`ifdef NQSmodel - electrical INT1; - electrical INT2; - electrical INT3; - electrical INT4; - electrical INT5; - electrical INT6; - electrical INT7; - electrical INT8; - electrical INT9; - branch(INT1) SPLINE1; - branch(INT2) SPLINE2; - branch(INT3) SPLINE3; - branch(INT4) SPLINE4; - branch(INT5) SPLINE5; - branch(INT6) SPLINE6; - branch(INT7) SPLINE7; - branch(INT8) SPLINE8; - branch(INT9) SPLINE9; - branch(INT1) RES1; - branch(INT2) RES2; - branch(INT3) RES3; - branch(INT4) RES4; - branch(INT5) RES5; - branch(INT6) RES6; - branch(INT7) RES7; - branch(INT8) RES8; - branch(INT9) RES9; -`endif // NQSmodel - - - -// -------------------------------------------------------------------------------------------------------------- -// Instance parameters -// -------------------------------------------------------------------------------------------------------------- - -// Instance parameters for global and binning models only -`IPRco(L ,1.0e-5 ,"m" ,1.0e-9 ,inf ,"Design length") -`IPRco(W ,1.0e-5 ,"m" ,1.0e-9 ,inf ,"Design width") -`IPRnb(SA ,0.0 ,"m" ,"Distance between OD-edge and poly from one side") -`IPRnb(SB ,0.0 ,"m" ,"Distance between OD-edge and poly from other side") -`IPRnb(SD ,0.0 ,"m" ,"Distance between neighbouring fingers") -`IPRcz(SCA ,0.0 ,"" ,"Integral of the first distribution function for scattered well dopants") -`IPRcz(SCB ,0.0 ,"" ,"Integral of the second distribution function for scattered well dopants") -`IPRcz(SCC ,0.0 ,"" ,"Integral of the third distribution function for scattered well dopants") -`IPRnb(SC ,0.0 ,"m" ,"Distance between OD-edge and nearest well edge") -`IPRco(NF ,1.0 ,"" ,1.0 ,inf ,"Number of fingers") -`IPRcc(NGCON ,1.0 ,"" ,1.0 ,2.0 ,"Number of gate contacts") -`IPRnb(XGW ,1.0e-7 ,"m" ,"Distance from the gate contact to the channel edge") -`IPRnb(NRS ,0.0 ,"" ,"Number of squares of source diffusion") -`IPRnb(NRD ,0.0 ,"" ,"Number of squares of drain diffusion") - -// Instance parameters for local model only -`IPRco(JW ,1.0e-6 ,"m" ,`LG_cliplow ,inf ,"Gate-edge length of source/drain junction") - -// Instance parameters for global, binning, and local models -`IPRnb(DELVTO ,0.0 ,"V" ,"Threshold voltage shift parameter") -`IPRcz(FACTUO ,1.0 ,"" ,"Zero-field mobility pre-factor") -`IPRnb(DELVTOEDGE ,0.0 ,"V" ,"Threshold voltage shift parameter of edge transistor") -`IPRcz(FACTUOEDGE ,1.0 ,"" ,"Zero-field mobility pre-factor of edge transistor") -`IPRco(ABSOURCE ,1.0e-12 ,"m^2" ,`AB_cliplow ,inf ,"Bottom area of source junction") -`IPRco(LSSOURCE ,1.0e-6 ,"m" ,`LS_cliplow ,inf ,"STI-edge length of source junction") -`IPRco(LGSOURCE ,1.0e-6 ,"m" ,`LG_cliplow ,inf ,"Gate-edge length of source junction") -`IPRco(ABDRAIN ,1.0e-12 ,"m^2" ,`AB_cliplow ,inf ,"Bottom area of drain junction") -`IPRco(LSDRAIN ,1.0e-6 ,"m" ,`LS_cliplow ,inf ,"STI-edge length of drain junction") -`IPRco(LGDRAIN ,1.0e-6 ,"m" ,`LG_cliplow ,inf ,"Gate-edge length of drain junction") -`IPRco(AS ,1.0e-12 ,"m^2" ,`AB_cliplow ,inf ,"Bottom area of source junction") -`IPRco(PS ,1.0e-6 ,"m" ,`LS_cliplow ,inf ,"Perimeter of source junction") -`IPRco(AD ,1.0e-12 ,"m^2" ,`AB_cliplow ,inf ,"Bottom area of drain junction") -`IPRco(PD ,1.0e-6 ,"m" ,`LS_cliplow ,inf ,"Perimeter of drain junction") -`IPRco(MULT ,1.0 ,"" ,0.0 ,inf ,"Number of devices in parallel") - -// -------------------------------------------------------------------------------------------------------------- -// PSP Model Parameters -// -------------------------------------------------------------------------------------------------------------- -`include "PSP103_parlist.include" - -// -------------------------------------------------------------------------------------------------------------- -// JUNCAP Model Parameters -// -------------------------------------------------------------------------------------------------------------- -`include "JUNCAP200_parlist.include" - -// -------------------------------------------------------------------------------------------------------------- -// Variables -// -------------------------------------------------------------------------------------------------------------- - -// Variables for switch (initial_model parts) -integer CHNL_TYPE, SWGEO_i, SWIGATE_i, SWIMPACT_i, SWGIDL_i, SWJUNCAP_i, SWJUNASYM_i, SWNUD_i, SWEDGE_i, SWDELVTAC_i; -integer SWQSAT_i, SWQPART_i, SWIGN_i; - -// Instance local variables -real NF_i, invNF, L_i, W_i, SA_i, SB_i, SD_i, SC_i, XGW_i, JW_i, SCA_i, SCB_i, SCC_i, NGCON_i, MULT_i, FACTUO_i, DELVTO_i; -real FACTUOEDGE_i, DELVTOEDGE_i; - -// Instance local variables for juncap -real ABS_i, LSS_i, LGS_i, ABD_i, LSD_i, LGD_i, jwcorr, jww; - -// Variables of clipped global model parameters -real TOXO_i, EPSROXO_i, NSUBO_i, WSEG_i, NPCK_i, WSEGP_i, LPCK_i, TOXOVO_i, TOXOVDO_i, LOV_i, LOVD_i, LP1_i, LP2_i, WBET_i; -real AXL_i, ALP1L2_i, ALP2L2_i, SAREF_i, SBREF_i, KVSAT_i, LLODKUO_i, WLODKUO_i, LLODVTH_i, WLODVTH_i, LODETAO_i, SCREF_i; -real WEB_i, WEC_i, RSHG_i, RSH_i, RSHD_i, RINT_i, RVPOLY_i, NSUBEDGEO_i, LPEDGE_i; - -// Variables of internal global-binning parameters of charge model -real CFACL_i, CFACW_i, CFACLEXP_i, THESATACO_i, THESATACL_i, THESATACLEXP_i, THESATACW_i, THESATACLW_i, AXACO_i, AXACL_i, ALPACL_i; -real ALPACLEXP_i, ALPACW_i, POCFAC_i, PLCFAC_i, PWCFAC_i, PLWCFAC_i, POTHESATAC_i, PLTHESATAC_i, PWTHESATAC_i, PLWTHESATAC_i; -real POAXAC_i, PLAXAC_i, PWAXAC_i, PLWAXAC_i, POALPAC_i, PLALPAC_i, PWALPAC_i, PLWALPAC_i, KVSATAC_i; - -// Variables of local model parameters -real VFB_p, STVFB_p, ST2VFB_p, TOX_p, EPSROX_p, NEFF_p, FACNEFFAC_p, GFACNUD_p, VSBNUD_p, DVSBNUD_p, VNSUB_p, NSLP_p, DNSUB_p; -real DPHIB_p, DELVTAC_p, NP_p, CT_p, CTG_p, CTB_p, STCT_p, TOXOV_p, TOXOVD_p, NOV_p, NOVD_p, PSCE_p, PSCED_p, PSCEB_p, CF_p, CFAC_p; -real CFD_p, CFB_p, BETN_p, STBET_p, MUE_p, STMUE_p, THEMU_p, STTHEMU_p, CS_p, STCS_p, THECS_p, STTHECS_p, XCOR_p, STXCOR_p; -real FETA_p, RS_p, STRS_p, RSB_p, RSG_p, THESAT_p, THESATAC_p, STTHESAT_p, THESATB_p, THESATG_p, AX_p, AXAC_p, ALP_p, ALPAC_p; -real ALP1_p, ALP2_p, VP_p, A1_p, A2_p, STA2_p, A3_p, A4_p, GCO_p, IGINV_p, IGOV_p, IGOVD_p, STIG_p, GC2_p, GC3_p, GC2OV_p, GC3OV_p; -real CHIB_p, AGIDL_p, AGIDLD_p, BGIDL_p, BGIDLD_p, STBGIDL_p, STBGIDLD_p, CGIDL_p, CGIDLD_p, COX_p, CGOV_p, CGOVD_p, CGBOV_p, CFR_p; -real CFRD_p, FNT_p, FNTEXC_p, NFA_p, NFB_p, NFC_p, EF_p, VFBEDGE_p, STVFBEDGE_p, DPHIBEDGE_p, NEFFEDGE_p, CTEDGE_p, BETNEDGE_p; -real STBETEDGE_p, PSCEEDGE_p, PSCEBEDGE_p, PSCEDEDGE_p, CFEDGE_p, CFDEDGE_p, CFBEDGE_p, FNTEDGE_p, NFAEDGE_p, NFBEDGE_p, NFCEDGE_p; -real EFEDGE_p, RG_p, RSE_p, RDE_p, RWELL_p, RBULK_p, RJUNS_p, RJUND_p; -`ifdef SelfHeating - real RTH_p, CTH_p, STRTH_p; -`endif // SelfHeating -`ifdef NQSmodel - real MUNQS_p; -`endif // NQSmodel - -// Variables of clipped local model parameters -real TR_i, QMC_i, VFB_i, STVFB_i, ST2VFB_i, STCT_i, TOX_i, EPSROX_i, NEFF_i, FACNEFFAC_i, GFACNUD_i, VSBNUD_i, DVSBNUD_i, VNSUB_i, NSLP_i; -real DNSUB_i, DPHIB_i, DELVTAC_i, NP_i, CT_i, CTG_i, CTB_i, TOXOV_i, TOXOVD_i, NOV_i, NOVD_i, CF_i, CFAC_i, CFD_i, CFB_i, PSCE_i, PSCEB_i; -real PSCED_i, BETN_i, STBET_i, MUE_i, STMUE_i, THEMU_i, STTHEMU_i, CS_i, STCS_i, THECS_i, STTHECS_i, XCOR_i, STXCOR_i, FETA_i, RS_i, STRS_i; -real RSB_i, RSG_i, THESAT_i, THESATAC_i, STTHESAT_i, THESATB_i, THESATG_i, AX_i, AXAC_i, ALP_i, ALPAC_i, ALP1_i, ALP2_i, VP_i, A1_i, A2_i; -real STA2_i, A3_i, A4_i, GCO_i, IGINV_i, IGOV_i, IGOVD_i, STIG_i, GC2_i, GC3_i, GC2OV_i, GC3OV_i, CHIB_i, AGIDL_i, AGIDLD_i, BGIDL_i; -real BGIDLD_i, STBGIDL_i, STBGIDLD_i, CGIDL_i, CGIDLD_i, COX_i, CGOV_i, CGOVD_i, CGBOV_i, CFR_i, CFRD_i, FNT_i, FNTEXC_i, NFA_i, NFB_i; -real NFC_i, EF_i, VFBEDGE_i, STVFBEDGE_i, DPHIBEDGE_i, NEFFEDGE_i, CTEDGE_i, BETNEDGE_i, STBETEDGE_i, PSCEEDGE_i, PSCEBEDGE_i, PSCEDEDGE_i; -real CFEDGE_i, CFDEDGE_i, CFBEDGE_i, FNTEDGE_i, NFAEDGE_i, NFBEDGE_i, NFCEDGE_i, EFEDGE_i, RG_i, RSE_i, RDE_i, RBULK_i, RJUNS_i, RJUND_i; -real RWELL_i; -`ifdef SelfHeating - real RTH_i, CTH_i, STRTH_i; -`endif // SelfHeating -`ifdef NQSmodel - real MUNQS_i; -`endif // NQSmodel - -// Variables for scaling rules -real iL, iW, delLPS, delWOD, LE, WE, LEcv, WEcv, Lcv, Wcv, iLE, iWE, L_f, L_slif, W_f, XGWE, NSUB0e, NPCKe, LPCKe, AA, BB, NSUB; -real FBET1e, LP1e, GPE, GWE, tmpx, Lnoi, Lred, WE_edge, iWE_edge, GPE_edge, KVTHOWE, KUOWE; -`ifdef SelfHeating - real deltaRth; -`endif // SelfHeating - -// Variables for binning-rules -real iLEWE, iiLE, iiWE, iiLEWE, iiiLEWE, iLEcv, iiLEcv, iiWEcv, iiLEWEcv, iiiLEWEcv, iLcv, iiLcv, iiWcv, iiLWcv, iiiLWcv; - -// Variables for general temperature scaling -real TKR, TKA, rTa, delTa, phita, inv_phita, TKD, TKD_sq, delT, rTn, ln_rTn, inv_phit, Eg, phibFac; - -// JUNCAP2 variables -`include "JUNCAP200_varlist.include" - -// Local parameters after temperature scaling and variables used in self heating effect -real VFB_T, CT_T, CTG_T, BETN_T, MUE_T, THEMU_T, CS_T, THECS_T, XCOR_T, RS_T, BGIDL_T, BGIDLD_T, A2_T, VFBEDGE_T, BETNEDGE_T; -`ifdef SelfHeating - real RTH_T; -`else // SelfHeating - // in the self heating model, these variables are declared locally in the evaluate block - real phit, BET_i, BETEDGE_i, nt0, nt, THESAT_T, THESATAC_T, Sfl_prefac, phit0edge, Gfedge2, lnGfedge2, Sfl_prefac_edge; - real ntedge; -`endif // SelfHeating - -// Variables for channel temperature scaling (including self heating effect) -real phib_dc, G_0_dc, kp, np, arg2max, qlim2, qb0, dphibq, sqrt_phib_dc, phix_dc, aphi_dc, bphi_dc, phix2, phix1_dc, alpha_b; -real us1, us21, phib_ac, G_0_ac, phix_ac, aphi_ac, bphi_ac, phix1_ac, tf_ct, tf_bet, tf_mue, tf_cs, tf_xcor, tf_ther, THER_i, tf_thesat; -real tf_betedge, phibedge, Gfedge, phixedge, aphiedge, bphiedge, phix2edge, phix1edge; - -// Variables used in instance initializing -real EPSSI, EPSOX, CoxPrime, tox_sq, Cox_over_q, NEFFAC_i, qq, E_eff0, eta_mu, eta_mu1, inv_AX, inv_VP, CoxovPrime, CoxovPrime_d, GOV_s; -real GOV_d, GOV2_s, GOV2_d, SP_OV_eps2_s, SP_OV_a_s, SP_OV_delta1_s, SP_OV_eps2_d, SP_OV_a_d, SP_OV_delta1_d, inv_CHIB, B_fact, BCH; -real BOV, BOV_d, GCQ, GCQOV, tf_ig, AGIDLs, AGIDLDs, BGIDLs, BGIDLDs, fac_exc, ggate, gsource, gdrain, gbulk, gjuns, gjund, gwell; - -// Variables for bias affectation -real Vgs, Vds, Vsb, Vdb, Vgb, Vjun_s, Vjun_d, VgsPrime, VsbPrime, VdbPrime, VgdPrime; -real Vdsx; - -// Global variables used in PSP103_SPCalculation.include -real Vgb1, Vdsp, delVg, Vdsat_lim, Vdsat; - -// Global variables used in current and charge calculations -real xgs_ov, xgd_ov, Vsbstar_dc, Vsbstar_dc_tmp, Vmb, us, usnew, Vmbnew, qeff1_dc, Voxm_dc, GdL_dc, eta_p_dc, Gvsat_dc, Gmob_dL_dc, x_ds_dc; -real x_m_dc, Gf_dc, Vdsat_dc, Udse_dc, SP_OV_xg, xs_ov, xd_ov, Vovs, Vovd, zg, TP, Fs1, Fs2, Fs3, Fs, Vm, Dch, arg2mina, psi_t, arg1; -real Dsi, Dgate, Igc0, igc, igcd_h, u0, x, u0_div_H, Bg, Ag, xsq, inv_x, ex, inv_ex, Sg, Igc, Igb, Vtovd, Igidl, Vtovs, Igisl; -real delVsat, Vsbstar_ac, xg_ac, qeff1_ac, Voxm_ac, alpha_ac, dps_ac, qim_ac, GdL_ac, H_ac, QG, QI, QD, QB, Fj, Fj2; -real QCLM, Qg, Qd, Qb, Qs, Qgs_ov, Qgd_ov, Qgb_ov, Qfgs, Qfgd, rgatenoise, rsourcenoise, rdrainnoise, rbulknoise, rwellnoise, rjundnoise; -real rjunsnoise; - -// Global variables used in macros -real tme1, tme2; -real inv_GOV, SP_OV_eps, SP_OV_delta, mutau, nu; -real Q_EDGE_xsth, Q_EDGE_xth0, Q_EDGE_xth, Q_EDGE_n, Q_EDGE_n_inv, Q_EDGE_xgt, Q_EDGE_xgt0, Q_EDGE_xgt0e, Q_EDGE_qi0si, Q_EDGE_qi0; -real Q_EDGE_exp_x, Q_EDGE_d0, Q_EDGE_d0p, Q_EDGE_sqerr, Q_EDGE_errq; - -// Global variables used in noise section -real N1, Nm1, Delta_N1, Sfl, t1, sqt2, t2, r, lc, lcinv2, g_ideal, mid, temp2_exc, wsat_exc, temp_exc, thesat1_exc, zsat_exc, Gvsat_exc; -real gfac, Sidexc, sqid, mig, migid0, migid, CGeff, sqig, c_igid, shot_igcsx, shot_igcdx, shot_igsov, shot_igdov, shot_iavl, jnoisex_s, jnoisex_d; -real shot_igs, shot_igd, anoisedge, N1edge, Nm1edge, Delta_N1edge, H0edge, t1edge, sqt2edge, t2edge, redge, lcedge, lcinv2edge; -real g_idealedge; - -// Variables used in NQS-calculations -`ifdef NQSmodel - integer SWNQS_i; - real Gf_ac, xgm_dc, thesat1_dc, xgm_ac, x_m_ac, thesat1_ac, margin_dc, margin_ac; - real Qp1_0, Qp2_0, Qp3_0, Qp4_0, Qp5_0, Qp6_0, Qp7_0, Qp8_0, Qp9_0, fk1, fk2, fk3, fk4, fk5, fk6, fk7, fk8, fk9, phi_p1, phi_p2, phi_p3; - real phi_p4, phi_p5, phi_p6, phi_p7, phi_p8, phi_p9, Qp1, Qp2, Qp3, Qp4, Qp5, Qp6, Qp7, Qp8, Qp9, Qp0, QpN, QG_NQS, QS_NQS, QD_NQS, pd; - real Gp, Gp2, a_factrp, marginp, x_sp, x_dp, zsat_nqs, dfQi, fQi, dQis, dQis_1, d2Qis, dQbs, dQy, d2Qy, dpsy2, ym, inorm, Tnorm, Qb_tmp; - real QbSIGN, r_nqs, vnorm, vnorm_inv, NQS_xg1, NQS_yg, NQS_z, NQS_eta, NQS_a, NQS_c, NQS_tau, NQS_D0, NQS_xi, NQS_p, NQS_q, NQS_temp; - real NQS_A_fac, NQS_xbar, NQS_w, NQS_x0, NQS_u, NQS_y0, xphi, fk0, thesat2, Fvsat, temp3, temp4, temp5, temp6, temp7, temp8, temp9; -`endif // NQSmodel - -//ngspice-adms: move local variables here -real Invsa, Invsb, Invsaref, Invsbref, Kstressu0, rhobeta, rhobetaref, Kstressvth0; -real temp0, temp00, templ, tempw, Lx, Wx, loop, tmpa, tmpb; - -real ijunbot, ijunsti, ijungat, qjunbot, qjunsti, qjungat; - -real sigVds, dphit1, xgct, xsct0, xbct, xsbstar, xsct, dCTG, ct_fact, phit1, inv_phit1, xg_dc, alpha_dc, dps_dc, qim_dc; -real qim1_dc, H_dc, FdL_dc, Gvsatinv_dc, Ids, Iimpact, mavl, Igdov, Igsov, Igcd, Igcs, eta_p_ac, Gvsat_ac, Gmob_dL_ac, H0; -real COX_qm, ijun_s, ijunbot_s, ijunsti_s, ijungat_s, ijun_d, ijunbot_d, ijunsti_d, ijungat_d, qjun_s, qjunbot_s, qjunsti_s; -real qjungat_s, qjun_d, qjunbot_d, qjunsti_d, qjungat_d, jnoise_s, jnoise_d, Gmob_dc, xitsb_dc, Vdse_dc, Vsbstaredge, Vsbxedge; -real dphit1edge, phit1edge, inv_phit1edge, Vdspedge, delVgedge, xgedge, xbedge, dxthedge, xnedge_s, qseffedge, xnedge_d; -real qdseffedge, qdeffedge, qmeffedge, dsqredge, alphabmedge, Idsedge, Sfledge, midedge, sqidedge; -`ifdef SelfHeating - real Pdiss, phit, BET_i, BETEDGE_i, nt0, nt, THESAT_T, THESATAC_T, Sfl_prefac, phit0edge, Gfedge2, lnGfedge2, Sfl_prefac_edge; - real ntedge; -`endif // SelfHeating -real temp, temp1, temp2; - -real FdL, qim1_1, r1, r2, s2, dL1; - -real tmpv, vjv; - -real Pdiss_s, Pdiss_d; - -//`define SPcalcLocalVarDecl -real phib, G_0, Vsbstar, cfloc, thesatloc, axloc, alploc; -real Vsbx, xg, Dnsub, Gf, Gf2, inv_Gf2, xi, inv_xi, Ux, xn_s, delta_ns, margin, x_s, delta_1s, xi0s, xi1s; -real xi2s, Es, Ds, Ps, Rxcor, xgs, qis, qbs, rhob, GR, Eeffm, Mutmp, Gmob, xitsb, wsat, thesat1, phi_inf; -real ysat, za, Phi_0, asat, Phi_2, Phi_0_2, Phi0_Phi2, Phi_sat, Vdse, Udse, xn_d, k_ds, delta_nd, x_d, x_ds; -real pC, qC, dps, xi0d, Ed, Dd, x_m, Em, D_bar, Dm, Pm, xgm, eta_p, sqm, alpha, d0, x_pm, p_pd, q_pd, xi_pd; -real u_pd, km, km0, qim, qim1, qbm, qeff, qeff1, s1, dL, GdL, Gmob_dL, zsat, Gvsat, Gvsatinv, Voxm, alpha1, H; -real SP_S_temp, SP_S_temp1, SP_S_temp2; -real SP_S_yg, SP_S_ysub, SP_S_eta, SP_S_a, SP_S_c, SP_S_tau, SP_S_y0, SP_S_delta0, SP_S_delta1, SP_S_xi0; -real SP_S_xi1, SP_S_xi2, SP_S_pC, SP_S_qC, SP_xg1, SP_S_A_fac, SP_S_xbar, SP_S_w, SP_S_x1, SP_S_bx, SP_S_b; -real SP_S_x0; - -/* declaration of variables needed in macro "calcerfcexpmtat" */ -real ysq, terfc, erfcpos; - -/* declaration of variables needed in hypfunction 5 */ -real h1, h2, h2d, h3, h4, h5; - -/* declaration of variables calculated outside macro "juncapfunction", voltage-dependent part */ -real idmult, vj, z, zinv, two_psistar, vjlim, vjsrh, vbbt, vav; - -/* declaration of variables used within macro "juncapfunction" */ -real tmp, id; -real isrh, vbi_minus_vjsrh, wsrhstep, dwsrh, wsrh, wdep, asrh; -real itat, btat, twoatatoverthreebtat, umaxbeforelimiting, umax, sqrtumax, umaxpoweronepointfive; -real wgamma, wtat, ktat, ltat, mtat, xerfc, erfctimesexpmtat, gammamax; -real ibbt, Fmaxr; -real fbreakdown; - -// -------------------------------------------------------------------------------------------------------------- -// Variables for operating point info -// -------------------------------------------------------------------------------------------------------------- -real id_op, is, ig, ib, P_D, facvsb, facvsb0, sig1k, vth_i, vts_i, ids_i; -`OPP(ctype ,"" ,"Flag for channel type") -`OPP(sdint ,"" ,"Flag for source-drain interchange") -`OPP(ise ,"A" ,"Total source current") -`OPP(ige ,"A" ,"Total gate current") -`OPP(ide ,"A" ,"Total drain current") -`OPP(ibe ,"A" ,"Total bulk current") -`OPP(ids ,"A" ,"Drain current, excl. edge transistor currents, avalanche, tunnel, GISL, GIDL, and junction currents") -`OPP(idb ,"A" ,"Drain to bulk current") -`OPP(isb ,"A" ,"Source to bulk current") -`OPP(igs ,"A" ,"Gate-source tunneling current") -`OPP(igd ,"A" ,"Gate-drain tunneling current") -`OPP(igb ,"A" ,"Gate-bulk tunneling current") -`OPP(idedge ,"A" ,"Drain current of edge transistors") -`OPP(igcs ,"A" ,"Gate-channel tunneling current (source component)") -`OPP(igcd ,"A" ,"Gate-channel tunneling current (drain component)") -`OPP(iavl ,"A" ,"Substrate current due to weak avelanche") -`OPP(igisl ,"A" ,"Gate-induced source leakage current") -`OPP(igidl ,"A" ,"Gate-induced drain leakage current") -`OPP(ijs ,"A" ,"Total source junction current") -`OPP(ijsbot ,"A" ,"Source junction current (bottom component)") -`OPP(ijsgat ,"A" ,"Source junction current (gate-edge component)") -`OPP(ijssti ,"A" ,"Source junction current (STI-edge component)") -`OPP(ijd ,"A" ,"Total drain junction current") -`OPP(ijdbot ,"A" ,"Drain junction current (bottom component)") -`OPP(ijdgat ,"A" ,"Drain junction current (gate-edge component)") -`OPP(ijdsti ,"A" ,"Drain junction current (STI-edge component)") -`OPP(vds ,"V" ,"Drain-source voltage") -`OPP(vgs ,"V" ,"Gate-source voltage") -`OPP(vsb ,"V" ,"Source-bulk voltage") -`OPP(vto ,"V" ,"Zero-bias threshold voltage") -`OPP(vts ,"V" ,"Threshold voltage including back bias effects") -`OPP(vth ,"V" ,"Threshold voltage including back bias and drain bias effects") -`OPP(vgt ,"V" ,"Effective gate drive voltage including back bias and drain bias effects") -`OPP(vdss ,"V" ,"Drain saturation voltage at actual bias") -`OPP(vsat ,"" ,"Saturation limit") -`ifdef OPderiv - `OPP(gm ,"1/Ohm" ,"Transconductance") - `OPP(gmb ,"1/Ohm" ,"Substrate transconductance") - `OPP(gds ,"1/Ohm" ,"Output conductance") - `OPP(gjs ,"1/Ohm" ,"Source junction conductance") - `OPP(gjd ,"1/Ohm" ,"Drain junction conductance") - `OPP(cdd ,"F" ,"Drain capacitance") - `OPP(cdg ,"F" ,"Drain-gate capacitance") - `OPP(cds ,"F" ,"Drain-source capacitance") - `OPP(cdb ,"F" ,"Drain-bulk capacitance") - `OPP(cgd ,"F" ,"Gate-drain capacitance") - `OPP(cgg ,"F" ,"Gate capacitance") - `OPP(cgs ,"F" ,"Gate-source capacitance") - `OPP(cgb ,"F" ,"Gate-bulk capacitance") - `OPP(csd ,"F" ,"Source-drain capacitance") - `OPP(csg ,"F" ,"Source-gate capacitance") - `OPP(css ,"F" ,"Source capacitance") - `OPP(csb ,"F" ,"Source-bulk capacitance") - `OPP(cbd ,"F" ,"Bulk-drain capacitance") - `OPP(cbg ,"F" ,"Bulk-gate capacitance") - `OPP(cbs ,"F" ,"Bulk-source capacitance") - `OPP(cbb ,"F" ,"Bulk capacitance") - `OPP(cgsol ,"F" ,"Total gate-source overlap capacitance") - `OPP(cgdol ,"F" ,"Total gate-drain overlap capacitance") - `OPP(cjs ,"F" ,"Total source junction capacitance") - `OPP(cjsbot ,"F" ,"Source junction capacitance (bottom component)") - `OPP(cjsgat ,"F" ,"Source junction capacitance (gate-edge component)") - `OPP(cjssti ,"F" ,"Source junction capacitance (STI-edge component)") - `OPP(cjd ,"F" ,"Total drain junction capacitance") - `OPP(cjdbot ,"F" ,"Drain junction capacitance (bottom component)") - `OPP(cjdgat ,"F" ,"Drain junction capacitance (gate-edge component)") - `OPP(cjdsti ,"F" ,"Drain junction capacitance (STI-edge component)") -`endif // OPderiv -`OPP(weff ,"m" ,"Effective channel width for geometrical models") -`OPP(leff ,"m" ,"Effective channel length for geometrical models") -`ifdef OPderiv - `OPP(u ,"" ,"Transistor gain") - `OPP(rout ,"Ohm" ,"Small-signal output resistance") - `OPP(vearly ,"V" ,"Equivalent Early voltage") - `OPP(beff ,"A/V^2" ,"Gain factor") - `OPP(fug ,"Hz" ,"Unity gain frequency at actual bias") - `OPP(rg_op ,"Ohm" ,"Gate resistance") - `OPP(sfl ,"A^2/Hz" ,"Flicker noise current spectral density at 1 Hz") - `OPP(sqrtsff ,"V/sqrt(Hz)" ,"Input-referred RMS white noise voltage spectral density at 1 kHz") - `OPP(sqrtsfw ,"V/sqrt(Hz)" ,"Input-referred RMS white noise voltage spectral density") - `OPP(sid ,"A^2/Hz" ,"White noise current spectral density") - `OPP(sig ,"A^2/Hz" ,"Induced gate noise current spectral density at 1 Hz") - `OPP(cigid ,"" ,"Imaginary part of correlation coefficient between Sig and Sid") - `OPP(fknee ,"Hz" ,"Cross-over frequency above which white noise is dominant") - `OPP(sigs ,"A^2/Hz" ,"Gate-source current noise spectral density") - `OPP(sigd ,"A^2/Hz" ,"Gate-drain current noise spectral density") - `OPP(siavl ,"A^2/Hz" ,"Impact ionization current noise spectral density") - `OPP(ssi ,"A^2/Hz" ,"Total source junction current noise spectral density") - `OPP(sdi ,"A^2/Hz" ,"Total drain junction current noise spectral density") - `OPP(sfledge ,"A^2/Hz" ,"Flicker noise current spectral density at 1 Hz of edge transistors") - `OPP(sidedge ,"A^2/Hz" ,"White noise current spectral density of edge transistors") -`endif // OPderiv -// local parameters after scaling, T-scaling, and clipping -`OPP(lp_vfb ,"V" ,"Local parameter VFB after T-scaling and clipping") -`OPP(lp_stvfb ,"V/K" ,"Local parameter STVFB after clipping") -`OPP(lp_st2vfb ,"K^-1" ,"Local parameter ST2VFB after clipping") -`OPP(lp_tox ,"m" ,"Local parameter TOX after clipping") -`OPP(lp_epsrox ,"" ,"Local parameter EPSROX after clipping") -`OPP(lp_neff ,"m^-3" ,"Local parameter NEFF after clipping") -`OPP(lp_facneffac ,"" ,"Local parameter FACNEFFAC after clipping") -`OPP(lp_gfacnud ,"" ,"Local parameter GFACNUD after clipping") -`OPP(lp_vsbnud ,"V" ,"Local parameter VSBNUD after clipping") -`OPP(lp_dvsbnud ,"V" ,"Local parameter DVSBNUD after clipping") -`OPP(lp_vnsub ,"V" ,"Local parameter VNSUB after clipping") -`OPP(lp_nslp ,"V" ,"Local parameter NSLP after clipping") -`OPP(lp_dnsub ,"V^-1" ,"Local parameter DNSUB after clipping") -`OPP(lp_dphib ,"V" ,"Local parameter DPHIB after clipping") -`OPP(lp_delvtac ,"V" ,"Local parameter DELVTAC after clipping") -`OPP(lp_np ,"m^-3" ,"Local parameter NP after clipping") -`OPP(lp_toxov ,"m" ,"Local parameter TOXOV after clipping") -`OPP(lp_toxovd ,"m" ,"Local parameter TOXOVD after clipping") -`OPP(lp_nov ,"m^-3" ,"Local parameter NOV after clipping") -`OPP(lp_novd ,"m^-3" ,"Local parameter NOVD after clipping") -`OPP(lp_ct ,"" ,"Local parameter CT after clipping") -`OPP(lp_ctg ,"" ,"Local parameter CTG after clipping") -`OPP(lp_ctb ,"" ,"Local parameter CTB after clipping") -`OPP(lp_stct ,"" ,"Local parameter STCT after clipping") -`OPP(lp_cf ,"" ,"Local parameter CF after clipping") -`OPP(lp_cfac ,"" ,"Local parameter CFAC after clipping") -`OPP(lp_cfd ,"V^-1" ,"Local parameter CFD after clipping") -`OPP(lp_cfb ,"V^-1" ,"Local parameter CFB after clipping") -`OPP(lp_psce ,"" ,"Local parameter PSCE after clipping") -`OPP(lp_psceb ,"V^-1" ,"Local parameter PSCEB after clipping") -`OPP(lp_psced ,"V^-1" ,"Local parameter PSCED after clipping") -`OPP(lp_betn ,"m^2/(V s)" ,"Local parameter BETN after T-scaling and clipping") -`OPP(lp_stbet ,"" ,"Local parameter STBET after clipping") -`OPP(lp_mue ,"m/V" ,"Local parameter MUE after T-scaling and clipping") -`OPP(lp_stmue ,"" ,"Local parameter STMUE after clipping") -`OPP(lp_themu ,"" ,"Local parameter THEMU after T-scaling and clipping") -`OPP(lp_stthemu ,"" ,"Local parameter STTHEMU after clipping") -`OPP(lp_cs ,"" ,"Local parameter CS after T-scaling and clipping") -`OPP(lp_stcs ,"" ,"Local parameter STCS after clipping") -`OPP(lp_thecs ,"" ,"Local parameter THECS after T-scaling and clipping") -`OPP(lp_stthecs ,"" ,"Local parameter STTHECS after clipping") -`OPP(lp_xcor ,"V^-1" ,"Local parameter XCOR after T-scaling and clipping") -`OPP(lp_stxcor ,"" ,"Local parameter STXCOR after clipping") -`OPP(lp_feta ,"" ,"Local parameter FETA after clipping") -`OPP(lp_rs ,"Ohm" ,"Local parameter RS after T-scaling and clipping") -`OPP(lp_strs ,"" ,"Local parameter STRS after clipping") -`OPP(lp_rsb ,"V^-1" ,"Local parameter RSB after clipping") -`OPP(lp_rsg ,"V^-1" ,"Local parameter RSG after clipping") -`OPP(lp_thesat ,"V^-1" ,"Local parameter THESAT after T-scaling and clipping") -`OPP(lp_thesatac ,"V^-1" ,"Local parameter THESATAC after T-scaling and clipping") -`OPP(lp_stthesat ,"" ,"Local parameter STTHESAT after clipping") -`OPP(lp_thesatb ,"V^-1" ,"Local parameter THESATB after clipping") -`OPP(lp_thesatg ,"V^-1" ,"Local parameter THESATG after clipping") -`OPP(lp_ax ,"" ,"Local parameter AX after clipping") -`OPP(lp_axac ,"" ,"Local parameter AXAC after clipping") -`OPP(lp_alp ,"" ,"Local parameter ALP after clipping") -`OPP(lp_alpac ,"" ,"Local parameter ALPAC after clipping") -`OPP(lp_alp1 ,"V" ,"Local parameter ALP1 after clipping") -`OPP(lp_alp2 ,"V^-1" ,"Local parameter ALP2 after clipping") -`OPP(lp_vp ,"V" ,"Local parameter VP after clipping") -`OPP(lp_a1 ,"" ,"Local parameter A1 after clipping") -`OPP(lp_a2 ,"V" ,"Local parameter A2 after T-scaling and clipping") -`OPP(lp_sta2 ,"" ,"Local parameter STA2 after clipping") -`OPP(lp_a3 ,"" ,"Local parameter A3 after clipping") -`OPP(lp_a4 ,"1/sqrt(V)" ,"Local parameter A4 after clipping") -`OPP(lp_gco ,"" ,"Local parameter GCO after clipping") -`OPP(lp_iginv ,"A" ,"Local parameter IGINV after T-scaling and clipping") -`OPP(lp_igov ,"A" ,"Local parameter IGOV after T-scaling and clipping") -`OPP(lp_igovd ,"A" ,"Local parameter IGOVD after T-scaling and clipping") -`OPP(lp_stig ,"" ,"Local parameter STIG after clipping") -`OPP(lp_gc2 ,"" ,"Local parameter GC2 after clipping") -`OPP(lp_gc3 ,"" ,"Local parameter GC3 after clipping") -`OPP(lp_gc2ov ,"" ,"Local parameter GC2OV after clipping") -`OPP(lp_gc3ov ,"" ,"Local parameter GC3OV after clipping") -`OPP(lp_chib ,"V" ,"Local parameter CHIB after clipping") -`OPP(lp_agidl ,"A/V^3" ,"Local parameter AGIDL after clipping") -`OPP(lp_agidld ,"A/V^3" ,"Local parameter AGIDLD after clipping") -`OPP(lp_bgidl ,"V" ,"Local parameter BGIDL after T-scaling and clipping") -`OPP(lp_bgidld ,"V" ,"Local parameter BGIDLD after T-scaling and clipping") -`OPP(lp_stbgidl ,"V/K" ,"Local parameter STBGIDL after clipping") -`OPP(lp_stbgidld ,"V/K" ,"Local parameter STBGIDLD after clipping") -`OPP(lp_cgidl ,"" ,"Local parameter CGIDL after clipping") -`OPP(lp_cgidld ,"" ,"Local parameter CGIDLD after clipping") -`OPP(lp_cox ,"F" ,"Local parameter COX after clipping") -`OPP(lp_cgov ,"F" ,"Local parameter CGOV after clipping") -`OPP(lp_cgovd ,"F" ,"Local parameter CGOVD after clipping") -`OPP(lp_cgbov ,"F" ,"Local parameter CGBOV after clipping") -`OPP(lp_cfr ,"F" ,"Local parameter CFR after clipping") -`OPP(lp_cfrd ,"F" ,"Local parameter CFRD after clipping") -`OPP(lp_fnt ,"" ,"Local parameter FNT after clipping") -`OPP(lp_fntexc ,"" ,"Local parameter FNTEXC after clipping") -`OPP(lp_nfa ,"1/(V m^4)" ,"Local parameter NFA after clipping") -`OPP(lp_nfb ,"1/(V m^4)" ,"Local parameter NFB after clipping") -`OPP(lp_nfc ,"V^-1" ,"Local parameter NFC after clipping") -`OPP(lp_ef ,"" ,"Local parameter EF after clipping") -`OPP(lp_vfbedge ,"V" ,"Local parameter VFBEDGE after T-scaling and clipping") -`OPP(lp_stvfbedge ,"V/K" ,"Local parameter STVFBEDGE after clipping") -`OPP(lp_dphibedge ,"V" ,"Local parameter DPHIBEDGE after clipping") -`OPP(lp_neffedge ,"m^-3" ,"Local parameter NEFFEDGE after clipping") -`OPP(lp_ctedge ,"" ,"Local parameter CTEDGE after clipping") -`OPP(lp_betnedge ,"m^2/V/s" ,"Local parameter BETNEDGE after T-scaling and clipping") -`OPP(lp_stbetedge ,"" ,"Local parameter STBETEDGE after clipping") -`OPP(lp_psceedge ,"" ,"Local parameter PSCEEDGE after clipping") -`OPP(lp_pscebedge ,"V^-1" ,"Local parameter PSCEBEDGE after clipping") -`OPP(lp_pscededge ,"V^-1" ,"Local parameter PSCEDEDGE after clipping") -`OPP(lp_cfedge ,"V" ,"Local parameter CFEDGE after clipping") -`OPP(lp_cfdedge ,"V^-1" ,"Local parameter CFDEDGE after clipping") -`OPP(lp_cfbedge ,"V^-1" ,"Local parameter CFBEDGE after clipping") -`OPP(lp_fntedge ,"" ,"Local parameter FNTEDGE after clipping") -`OPP(lp_nfaedge ,"1/(V m^4)" ,"Local parameter NFAEDGE after clipping") -`OPP(lp_nfbedge ,"1/(V m^4)" ,"Local parameter NFBEDGE after clipping") -`OPP(lp_nfcedge ,"V^-1" ,"Local parameter NFCEDGE after clipping") -`OPP(lp_efedge ,"" ,"Local parameter EFEDGE after clipping") -`OPP(lp_rg ,"Ohm" ,"Local parameter RG after clipping") -`OPP(lp_rse ,"Ohm" ,"Local parameter RSE after clipping") -`OPP(lp_rde ,"Ohm" ,"Local parameter RDE after clipping") -`OPP(lp_rbulk ,"Ohm" ,"Local parameter RBULK after clipping") -`OPP(lp_rwell ,"Ohm" ,"Local parameter RWELL after clipping") -`OPP(lp_rjuns ,"Ohm" ,"Local parameter RJUNS after clipping") -`OPP(lp_rjund ,"Ohm" ,"Local parameter RJUND after clipping") -`ifdef SelfHeating - `OPP(lp_rth ,"K/W" ,"Local parameter RTH after T-scaling and clipping") - `OPP(lp_cth ,"J/K" ,"Local parameter CTH after clipping") - `OPP(lp_strth ,"" ,"Local parameter STRTH after clipping") - `OPP(pdiss ,"W" ,"Power dissipation") - `OPP(dtsh ,"K" ,"Temperature rise due to self heating") -`endif // SelfHeating -`OPP(tk ,"K" ,"Device Temperature") -`OPP(cjosbot ,"F" ,"Bottom component of total zero-bias source junction capacitance at device temperature") -`OPP(cjossti ,"F" ,"STI-edge component of total zero-bias source junction capacitance at device temperature") -`OPP(cjosgat ,"F" ,"Gate-edge component of total zero-bias source junction capacitance at device temperature") -`OPP(vbisbot ,"V" ,"Built-in voltage of source-side bottom junction at device temperature") -`OPP(vbissti ,"V" ,"Built-in voltage of source-side STI-edge junction at device temperature") -`OPP(vbisgat ,"V" ,"Built-in voltage of source-side gate-edge junction at device temperature") -`OPP(idsatsbot ,"A" ,"Total source-side bottom junction saturation current") -`OPP(idsatssti ,"A" ,"Total source-side STI-edge junction saturation current") -`OPP(idsatsgat ,"A" ,"Total source-side gate-edge junction saturation current") -`OPP(cjosbotd ,"F" ,"Bottom component of total zero-bias drain junction capacitance at device temperature") -`OPP(cjosstid ,"F" ,"STI-edge component of total zero-bias drain junction capacitance at device temperature") -`OPP(cjosgatd ,"F" ,"Gate-edge component of total zero-bias drain junction capacitance at device temperature") -`OPP(vbisbotd ,"V" ,"Built-in voltage of drain-side bottom junction at device temperature") -`OPP(vbisstid ,"V" ,"Built-in voltage of drain-side STI-edge junction at device temperature") -`OPP(vbisgatd ,"V" ,"Built-in voltage of drain-side gate-edge junction at device temperature") -`OPP(idsatsbotd ,"A" ,"Total drain-side bottom junction saturation current") -`OPP(idsatsstid ,"A" ,"Total drain-side STI-edge junction saturation current") -`OPP(idsatsgatd ,"A" ,"Total drain-side gate-edge junction saturation current") -`ifdef NQSmodel - `OPP(lp_munqs ,"" ,"Local parameter MUNQS after clipping") -`endif // NQSmodel - -// -------------------------------------------------------------------------------------------------------------- -// Analog block with all calculations and contribs -// -------------------------------------------------------------------------------------------------------------- -analog begin - - // -------------------------------------------------------------------------------------------------------------- - // Definition of bias/instance independent model variables - // -------------------------------------------------------------------------------------------------------------- - `INITIAL_MODEL - begin : initial_model - - // Clipping and rounding of switch parameters - if (`PGIVEN(nmos)) begin - CHNL_TYPE = `NMOS; - end else if (`PGIVEN(pmos)) begin - CHNL_TYPE = `PMOS; - end else begin - CHNL_TYPE = (`PGIVEN(TYPE)) ? TYPE : `NMOS; - end - //$strobe("CHNL_TYPE %d", CHNL_TYPE); - EPSSI = `EPSO * `EPSRSI; - SWGEO_i = floor(`CLIP_BOTH(SWGEO, 0.0, 2.0) + 0.5); - SWIGATE_i = floor(`CLIP_BOTH(SWIGATE, 0.0, 2.0) + 0.5); - SWIMPACT_i = floor(`CLIP_BOTH(SWIMPACT, 0.0, 1.0) + 0.5); - SWGIDL_i = floor(`CLIP_BOTH(SWGIDL, 0.0, 1.0) + 0.5); - SWJUNCAP_i = floor(`CLIP_BOTH(SWJUNCAP, 0.0, 3.0) + 0.5); - SWJUNASYM_i = floor(`CLIP_BOTH(SWJUNASYM, 0.0, 1.0) + 0.5); - SWNUD_i = floor(`CLIP_BOTH(SWNUD, 0.0, 2.0) + 0.5); - SWEDGE_i = floor(`CLIP_BOTH(SWEDGE, 0.0, 1.0) + 0.5); - SWDELVTAC_i = floor(`CLIP_BOTH(SWDELVTAC, 0.0, 1.0) + 0.5); - SWQSAT_i = floor(`CLIP_BOTH(SWQSAT, 0.0, 1.0) + 0.5); - SWQPART_i = floor(`CLIP_BOTH(SWQPART, 0.0, 1.0) + 0.5); - SWIGN_i = floor(`CLIP_BOTH(SWIGN, 0.0, 1.0) + 0.5); - QMC_i = `CLIP_LOW(QMC, 0.0); - `ifdef NQSmodel - if (SWNQS < 0.5) begin - SWNQS_i = 0; - end else begin - if (SWNQS < 1.5) begin - SWNQS_i = 1; - end else begin - if (SWNQS < 2.5) begin - SWNQS_i = 2; - end else begin - if (SWNQS < 4.0) begin - SWNQS_i = 3; - end else begin - if (SWNQS < 7.0) begin - SWNQS_i = 5; - end else begin - SWNQS_i = 9; - end - end - end - end - end - inorm = 1.0e-12; - r_nqs = 1.0e3; - vnorm = 10.0; - vnorm_inv = 1.0 / vnorm; - `endif // NQSmodel - - // Clipping of global model parameters - TOXO_i = `CLIP_LOW(TOXO, 1.0e-10); - EPSROXO_i = `CLIP_LOW(EPSROXO, 1.0); - NSUBO_i = `CLIP_LOW(NSUBO, 1.0e20); - WSEG_i = `CLIP_LOW(WSEG, 1.0e-10); - NPCK_i = `CLIP_LOW(NPCK, 0.0); - WSEGP_i = `CLIP_LOW(WSEGP, 1.0e-10); - LPCK_i = `CLIP_LOW(LPCK, 1.0e-10); - TOXOVO_i = `CLIP_LOW(TOXOVO, 1.0e-10); - TOXOVDO_i = `CLIP_LOW(TOXOVDO, 1.0e-10); - LOV_i = `CLIP_LOW(LOV, 0.0); - LOVD_i = `CLIP_LOW(LOVD, 0.0); - LP1_i = `CLIP_LOW(LP1, 1.0e-10); - LP2_i = `CLIP_LOW(LP2, 1.0e-10); - WBET_i = `CLIP_LOW(WBET, 1.0e-10); - AXL_i = `CLIP_LOW(AXL, 0.0); - ALP1L2_i = `CLIP_LOW(ALP1L2, 0.0); - ALP2L2_i = `CLIP_LOW(ALP2L2, 0.0); - SAREF_i = `CLIP_LOW(SAREF, 1.0e-9); - SBREF_i = `CLIP_LOW(SBREF, 1.0e-9); - KVSAT_i = `CLIP_BOTH(KVSAT, -1.0, 1.0); - LLODKUO_i = `CLIP_LOW(LLODKUO, 0.0); - WLODKUO_i = `CLIP_LOW(WLODKUO, 0.0); - LLODVTH_i = `CLIP_LOW(LLODVTH, 0.0); - WLODVTH_i = `CLIP_LOW(WLODVTH, 0.0); - LODETAO_i = `CLIP_LOW(LODETAO, 0.0); - SCREF_i = `CLIP_LOW(SCREF, 0.0); - WEB_i = WEB; - WEC_i = WEC; - RSHG_i = `CLIP_LOW(RSHG, 0.0); - RSH_i = `CLIP_LOW(RSH, 0.0); - RSHD_i = `CLIP_LOW(RSHD, 0.0); - RINT_i = `CLIP_LOW(RINT, 0.0); - RVPOLY_i = `CLIP_LOW(RVPOLY, 0.0); - NSUBEDGEO_i = `CLIP_LOW(NSUBEDGEO, 1.0e20); - LPEDGE_i = `CLIP_LOW(LPEDGE, 1.0e-10); - - // Definition of global-binning parameters for the charge model in the case of separate calculation in saturation - `DefACparam(CFACL_i, CFL, CFACL) - `DefACparam(CFACLEXP_i, CFLEXP, CFACLEXP) - `DefACparam(CFACW_i, CFW, CFACW) - `DefACparam(THESATACO_i, THESATO, THESATACO) - `DefACparam(THESATACL_i, THESATL, THESATACL) - `DefACparam(THESATACLEXP_i, THESATLEXP, THESATACLEXP) - `DefACparam(THESATACW_i, THESATW, THESATACW) - `DefACparam(THESATACLW_i, THESATLW, THESATACLW) - `DefACparam(AXACO_i, AXO, AXACO) - `DefACparam(AXACL_i, AXL_i, AXACL) - AXACL_i = `CLIP_LOW(AXACL_i, 0.0); - `DefACparam(ALPACL_i, ALPL, ALPACL) - `DefACparam(ALPACLEXP_i, ALPLEXP, ALPACLEXP) - `DefACparam(ALPACW_i, ALPW, ALPACW) - `DefACparam(POCFAC_i, POCF, POCFAC) - `DefACparam(PLCFAC_i, PLCF, PLCFAC) - `DefACparam(PWCFAC_i, PWCF, PWCFAC) - `DefACparam(PLWCFAC_i, PLWCF, PLWCFAC) - `DefACparam(POTHESATAC_i, POTHESAT, POTHESATAC) - `DefACparam(PLTHESATAC_i, PLTHESAT, PLTHESATAC) - `DefACparam(PWTHESATAC_i, PWTHESAT, PWTHESATAC) - `DefACparam(PLWTHESATAC_i, PLWTHESAT, PLWTHESATAC) - `DefACparam(POAXAC_i, POAX, POAXAC) - `DefACparam(PLAXAC_i, PLAX, PLAXAC) - `DefACparam(PWAXAC_i, PWAX, PWAXAC) - `DefACparam(PLWAXAC_i, PLWAX, PLWAXAC) - `DefACparam(POALPAC_i, POALP, POALPAC) - `DefACparam(PLALPAC_i, PLALP, PLALPAC) - `DefACparam(PWALPAC_i, PWALP, PWALPAC) - `DefACparam(PLWALPAC_i, PLWALP, PLWALPAC) - `DefACparam(KVSATAC_i, KVSAT, KVSATAC) - KVSATAC_i = `CLIP_BOTH(KVSATAC_i, -1.0, 1.0); - - // Transistor temperature - TR_i = `CLIP_LOW(TR, -273.0); - TKR = `KELVINCONVERSION + TR_i; - TKA = $temperature + DTA; - rTa = TKA / TKR; - delTa = TKA - TKR; - phita = TKA * `KBOL / `QELE; - inv_phita = 1.0 / phita; - `ifdef SelfHeating - // do nothing - `else // SelfHeating - TKD = TKA; - `TempInitialize - `endif // SelfHeating - - // JUNCAP2 - `include "JUNCAP200_InitModel.include" - - end // initial_model - - // -------------------------------------------------------------------------------------------------------------- - // Definition of instance dependent and bias independent variables - // -------------------------------------------------------------------------------------------------------------- - `INITIAL_INSTANCE - begin : initial_instance - - //ngspice-adms: JUNCAP2 Instance parameter handling - IFACTOR_i = `CLIP_LOW( IFACTOR ,`IFACTOR_cliplow); - CFACTOR_i = `CLIP_LOW( CFACTOR ,`CFACTOR_cliplow); - - // Declaration of local variables -// real Invsa, Invsb, Invsaref, Invsbref, Kstressu0, rhobeta, rhobetaref, Kstressvth0; -// real temp0, temp00, templ, tempw, Lx, Wx, loop, tmpa, tmpb; - - // Instance variables - NF_i = 1.0; - invNF = 1.0; - LE = 0.0; - WE = 0.0; - L_i = L; - W_i = W; - SA_i = SA; - SB_i = SB; - SD_i = SD; - SC_i = SC; - XGW_i = XGW; - ABSOURCE_i = ABSOURCE; - LSSOURCE_i = LSSOURCE; - LGSOURCE_i = LGSOURCE; - ABDRAIN_i = ABDRAIN; - LSDRAIN_i = LSDRAIN; - LGDRAIN_i = LGDRAIN; - AS_i = AS; - PS_i = PS; - AD_i = AD; - PD_i = PD; - JW_i = JW; - - // Clipping of the instance parameters - if ((SWGEO_i == 1) || (SWGEO_i == 2)) begin - NF_i = `CLIP_LOW(NF, 1.0); - NF_i = floor(NF_i + 0.5); // round to nearest integer - invNF = 1.0 / NF_i; - end - L_i = `CLIP_LOW(L_i, 1.0e-9); - W_i = `CLIP_LOW(W_i * invNF, 1.0e-9); - SCA_i = `CLIP_LOW(SCA, 0.0); - SCB_i = `CLIP_LOW(SCB, 0.0); - SCC_i = `CLIP_LOW(SCC, 0.0); - NGCON_i = (NGCON < 1.5) ? 1.0 : 2.0; - - // Internal local parameters - `include "PSP103_scaling.include" - - // Local process parameters - EPSOX = `EPSO * EPSROX_i; - CoxPrime = EPSOX / TOX_i; - tox_sq = TOX_i * TOX_i; - Cox_over_q = CoxPrime / `QELE; - NEFFAC_i = FACNEFFAC_i * NEFF_i; - NEFFAC_i = `CLIP_BOTH(NEFFAC_i, 1.0e20, 1.0e26); - - // QM corrections: initially calculated in PSP103_macrodefs.include (PSP103.3) - qq = 0.0; - if (QMC_i > 0.0) begin - qq = 0.4 * `QMN * QMC_i * pow(CoxPrime, `twoThirds); - if (CHNL_TYPE==`PMOS) begin - qq = `QMP / `QMN * qq; - end - end - - // Electrical field parameters - E_eff0 = 1.0e-8 * CoxPrime / EPSSI; - eta_mu = 0.5 * FETA_i; - eta_mu1 = 0.5; - if (CHNL_TYPE == `PMOS) begin - eta_mu = `oneThird * FETA_i; - eta_mu1 = `oneThird; - end - - // Linear-saturation transition parameter - inv_AX = 1.0 / AX_i; - - // CLM parameter - inv_VP = 1.0 / VP_i; - - // Gate overlap - CoxovPrime = EPSOX / TOXOV_i; - CoxovPrime_d = EPSOX / TOXOVD_i; - GOV_s = sqrt(2.0 * `QELE * NOV_i * EPSSI * inv_phita) / CoxovPrime; - GOV_d = sqrt(2.0 * `QELE * NOVD_i * EPSSI * inv_phita) / CoxovPrime_d; - GOV2_s = GOV_s * GOV_s; - GOV2_d = GOV_d * GOV_d; - `sp_ovInit(GOV_s, GOV2_s, SP_OV_eps2_s, SP_OV_a_s, SP_OV_delta1_s) - `sp_ovInit(GOV_d, GOV2_d, SP_OV_eps2_d, SP_OV_a_d, SP_OV_delta1_d) - - // Temperature scaling variables - `ifdef SelfHeating - // do nothing - `else // SelfHeating - // Initialize variables of edge transistor - `TempScaling - `endif // SelfHeating - - // Gate to channel leakage parameters - inv_CHIB = 1.0 / CHIB_i; - B_fact = 4.0 * `oneThird * sqrt(2.0 * `QELE * `MELE * CHIB_i) / `HBAR; - BCH = B_fact * TOX_i; - BOV = B_fact * TOXOV_i; - BOV_d = B_fact * TOXOVD_i; - GCQ = 0.0; - if (GC3_i < 0) begin - GCQ = -0.495 * GC2_i / GC3_i; - end - GCQOV = GCQ; - if (SWIGATE_i == 2) begin - GCQOV = 0.0; - if (GC3OV_i < 0.0) begin - GCQOV = -0.495 * GC2OV_i / GC3OV_i; - end - end - tf_ig = pow(rTa, STIG_i); - IGINV_i = IGINV_i * tf_ig; - IGOV_i = IGOV_i * tf_ig; - IGOVD_i = IGOVD_i * tf_ig; - - // GIDL parameters - AGIDLs = AGIDL_i * 4.0e-18 / (TOXOV_i * TOXOV_i); - AGIDLDs = AGIDLD_i * 4.0e-18 / (TOXOVD_i * TOXOVD_i); - B_fact = `MAX(1.0 + STBGIDL_i * delTa, 0.0); - BGIDL_T = BGIDL_i * B_fact; - BGIDLs = BGIDL_T * TOXOV_i * 5.0e8; - B_fact = `MAX(1.0 + STBGIDLD_i * delTa, 0.0); - BGIDLD_T = BGIDLD_i * B_fact; - BGIDLDs = BGIDLD_T * TOXOVD_i * 5.0e8; - - // Self Heating parameters - `ifdef SelfHeating - RTH_T = RTH_i * pow(rTa, STRTH_i); - `endif // SelfHeating - - // Noise model parameters - fac_exc = `MELE * 1.0e9 * FNTEXC_i; - - //ngspice-adms: Parasitic resistances - no node collapse - RG_i = `CLIP_LOW(RG, 1.0e-3); - RSE_i = `CLIP_LOW(RSE, 1.0e-3); - RDE_i = `CLIP_LOW(RDE, 1.0e-3); - RBULK_i = `CLIP_LOW(RBULK, 1.0e-3); - RJUNS_i = `CLIP_LOW(RJUNS, 1.0e-3); - RJUND_i = `CLIP_LOW(RJUND, 1.0e-3); - RWELL_i = `CLIP_LOW(RWELL, 1.0e-3); - - // Conductance of parasitic resistance - if (RG_i > 0.0) begin - ggate = 1.0 / RG_i; - end else begin - ggate = 0.0; - end - if (RSE_i > 0.0) begin - gsource = 1.0 / RSE_i; - end else begin - gsource = 0.0; - end - if (RDE_i > 0.0) begin - gdrain = 1.0 / RDE_i; - end else begin - gdrain = 0.0; - end - if (RBULK_i > 0.0) begin - gbulk = 1.0 / RBULK_i; - end else begin - gbulk = 0.0; - end - if (RJUNS_i > 0.0) begin - gjuns = 1.0 / RJUNS_i; - end else begin - gjuns = 0.0; - end - if (RJUND_i > 0.0) begin - gjund = 1.0 / RJUND_i; - end else begin - gjund = 0.0; - end - if (RWELL_i > 0.0) begin - gwell = 1.0 / RWELL_i; - end else begin - gwell = 0.0; - end - - // JUNCAP instance parameters - ABS_i = 0.0; - LSS_i = 0.0; - LGS_i = 0.0; - ABD_i = 0.0; - LSD_i = 0.0; - LGD_i = 0.0; - jwcorr = 0.0; - jww = WE; - if (SWGEO_i == 0) begin - jww = `CLIP_LOW(JW_i, `LG_cliplow); - end - if (SWJUNCAP_i == 3) begin - jwcorr = 1.0; - end - ABS_i = ABSOURCE_i * invNF; - LSS_i = LSSOURCE_i * invNF; - LGS_i = LGSOURCE_i * invNF; - ABD_i = ABDRAIN_i * invNF; - LSD_i = LSDRAIN_i * invNF; - LGD_i = LGDRAIN_i * invNF; - if ((SWJUNCAP_i == 2) || (SWJUNCAP_i == 3)) begin - ABS_i = AS_i * invNF; - LSS_i = PS_i * invNF - jwcorr * jww; - LGS_i = jww; - ABD_i = AD_i * invNF; - LSD_i = PD_i * invNF - jwcorr * jww; - LGD_i = jww; - end - if ((SWJUNCAP_i == 1) || (SWJUNCAP_i == 2) || (SWJUNCAP_i == 3)) begin - ABSOURCE_i = `CLIP_LOW(ABS_i, `AB_cliplow); - LSSOURCE_i = `CLIP_LOW(LSS_i, `LS_cliplow); - LGSOURCE_i = `CLIP_LOW(LGS_i, `LG_cliplow); - ABDRAIN_i = `CLIP_LOW(ABD_i, `AB_cliplow); - LSDRAIN_i = `CLIP_LOW(LSD_i, `LS_cliplow); - LGDRAIN_i = `CLIP_LOW(LGD_i, `LG_cliplow); - end else begin - ABSOURCE_i = 0.0; - LSSOURCE_i = 0.0; - LGSOURCE_i = 0.0; - ABDRAIN_i = 0.0; - LSDRAIN_i = 0.0; - LGDRAIN_i = 0.0; - end - - // Initialization of JUNCAP (global) variables; required for some verilog-A compilers - vbimin_s = 0.0; - vbimin_d = 0.0; - vfmin_s = 0.0; - vfmin_d = 0.0; - vch_s = 0.0; - vch_d = 0.0; - vbbtlim_s = 0.0; - vbbtlim_d = 0.0; - VMAX_s = 0.0; - VMAX_d = 0.0; - exp_VMAX_over_phitd_s = 0.0; - exp_VMAX_over_phitd_d = 0.0; - ISATFOR1_s = 0.0; - ISATFOR1_d = 0.0; - MFOR1_s = 1.0; - MFOR1_d = 1.0; - ISATFOR2_s = 0.0; - ISATFOR2_d = 0.0; - MFOR2_s = 1.0; - MFOR2_d = 1.0; - ISATREV_s = 0.0; - ISATREV_d = 0.0; - MREV_s = 1.0; - MREV_d = 1.0; - m0flag_s = 0.0; - m0flag_d = 0.0; - xhighf1_s = 0.0; - xhighf1_d = 0.0; - expxhf1_s = 0.0; - expxhf1_d = 0.0; - xhighf2_s = 0.0; - xhighf2_d = 0.0; - expxhf2_s = 0.0; - expxhf2_d = 0.0; - xhighr_s = 0.0; - xhighr_d = 0.0; - expxhr_s = 0.0; - expxhr_d = 0.0; - zflagbot_s = 1.0; - zflagbot_d = 1.0; - zflagsti_s = 1.0; - zflagsti_d = 1.0; - zflaggat_s = 1.0; - zflaggat_d = 1.0; - m0_rev = 0.0; - mcor_rev = 0.0; - I1_cor = 0.0; - I2_cor = 0.0; - I3_cor = 0.0; - I4_cor = 0.0; - I5_cor = 0.0; - tt0 = 0.0; - tt1 = 0.0; - tt2 = 0.0; - zfrac = 0.0; - alphaje = 0.0; - - if (SWJUNCAP_i > 0) begin - `JuncapInitInstance(ABSOURCE_i, LSSOURCE_i, LGSOURCE_i, idsatbot, idsatsti, idsatgat, vbibot, vbisti, vbigat, PBOT_i, PSTI_i, PGAT_i, VBIRBOT_i, VBIRSTI_i, VBIRGAT_i, VMAX_s, exp_VMAX_over_phitd_s, vbimin_s, vch_s, vfmin_s, vbbtlim_s) - `JuncapInitInstance(ABDRAIN_i, LSDRAIN_i, LGDRAIN_i, idsatbot_d, idsatsti_d, idsatgat_d, vbibot_d, vbisti_d, vbigat_d, PBOTD_i, PSTID_i, PGATD_i, VBIRBOTD_i, VBIRSTID_i, VBIRGATD_i, VMAX_d, exp_VMAX_over_phitd_d, vbimin_d, vch_d, vfmin_d, vbbtlim_d) - - if (SWJUNEXP_i == 1) begin : JUNCAPexpressInit - // Local variable declaration -// `LocalGlobalVars - - // results computed here are not used elsewhere -// real ijunbot, ijunsti, ijungat, qjunbot, qjunsti, qjungat; - - // Initialization of (local) variables; required for some verilog-A compilers - ysq = 0.0; - terfc = 0.0; - erfcpos = 0.0; - h1 = 0.0; - h2 = 0.0; - h2d = 0.0; - h3 = 0.0; - h4 = 0.0; - h5 = 0.0; - idmult = 0.0; - vj = 0.0; - z = 0.0; - zinv = 0.0; - two_psistar = 0.0; - vjlim = 0.0; - vjsrh = 0.0; - vbbt = 0.0; - vav = 0.0; - tmp = 0.0; - id = 0.0; - isrh = 0.0; - vbi_minus_vjsrh = 0.0; - wsrhstep = 0.0; - dwsrh = 0.0; - wsrh = 0.0; - wdep = 0.0; - asrh = 0.0; - itat = 0.0; - btat = 0.0; - twoatatoverthreebtat = 0.0; - umaxbeforelimiting = 0.0; - umax = 0.0; - sqrtumax = 0.0; - umaxpoweronepointfive = 0.0; - wgamma = 0.0; - wtat = 0.0; - ktat = 0.0; - ltat = 0.0; - mtat = 0.0; - xerfc = 0.0; - erfctimesexpmtat = 0.0; - gammamax = 0.0; - ibbt = 0.0; - Fmaxr = 0.0; - fbreakdown = 0.0; - qjunbot = 0.0; - qjunsti = 0.0; - qjungat = 0.0; - - // Computation of JUNCAP-express internal parameters - `JuncapExpressInit1(ABSOURCE_i, LSSOURCE_i, LGSOURCE_i, VJUNREF_i, qprefbot, qpref2bot, vbiinvbot, one_minus_PBOT, idsatbot, CSRHBOT_i, CTATBOT_i, vbibot, wdepnulrbot, VBIRBOTinv, PBOT_i, ftdbot, btatpartbot, atatbot, one_over_one_minus_PBOT, CBBTBOT_i, VBIRBOT_i, wdepnulrinvbot, fbbtbot, VBRBOT_i, VBRinvbot, PBRBOT_i, fstopbot, slopebot, qprefsti, qpref2sti, vbiinvsti, one_minus_PSTI, idsatsti, CSRHSTI_i, CTATSTI_i, vbisti, wdepnulrsti, VBIRSTIinv, PSTI_i, ftdsti, btatpartsti, atatsti, one_over_one_minus_PSTI, CBBTSTI_i, VBIRSTI_i, wdepnulrinvsti, fbbtsti, VBRSTI_i, VBRinvsti, PBRSTI_i, fstopsti, slopesti, qprefgat, qpref2gat, vbiinvgat, one_minus_PGAT, idsatgat, CSRHGAT_i, CTATGAT_i, vbigat, wdepnulrgat, VBIRGATinv, PGAT_i, ftdgat, btatpartgat, atatgat, one_over_one_minus_PGAT, CBBTGAT_i, VBIRGAT_i, wdepnulrinvgat, fbbtgat, VBRGAT_i, VBRinvgat, PBRGAT_i, fstopgat, slopegat, VMAX_s, exp_VMAX_over_phitd_s, vbimin_s, vch_s, vfmin_s, vbbtlim_s) - `JuncapExpressInit2(ABSOURCE_i, LSSOURCE_i, LGSOURCE_i, qprefbot, qpref2bot, vbiinvbot, one_minus_PBOT, idsatbot, CSRHBOT_i, CTATBOT_i, vbibot, wdepnulrbot, VBIRBOTinv, PBOT_i, ftdbot, btatpartbot, atatbot, one_over_one_minus_PBOT, CBBTBOT_i, VBIRBOT_i, wdepnulrinvbot, fbbtbot, VBRBOT_i, VBRinvbot, PBRBOT_i, fstopbot, slopebot, qprefsti, qpref2sti, vbiinvsti, one_minus_PSTI, idsatsti, CSRHSTI_i, CTATSTI_i, vbisti, wdepnulrsti, VBIRSTIinv, PSTI_i, ftdsti, btatpartsti, atatsti, one_over_one_minus_PSTI, CBBTSTI_i, VBIRSTI_i, wdepnulrinvsti, fbbtsti, VBRSTI_i, VBRinvsti, PBRSTI_i, fstopsti, slopesti, qprefgat, qpref2gat, vbiinvgat, one_minus_PGAT, idsatgat, CSRHGAT_i, CTATGAT_i, vbigat, wdepnulrgat, VBIRGATinv, PGAT_i, ftdgat, btatpartgat, atatgat, one_over_one_minus_PGAT, CBBTGAT_i, VBIRGAT_i, wdepnulrinvgat, fbbtgat, VBRGAT_i, VBRinvgat, PBRGAT_i, fstopgat, slopegat, VMAX_s, exp_VMAX_over_phitd_s, vbimin_s, vch_s, vfmin_s, vbbtlim_s) - `JuncapExpressInit3(ABSOURCE_i, LSSOURCE_i, LGSOURCE_i, idsatbot, idsatsti, idsatgat, ISATFOR1_s, MFOR1_s, ISATFOR2_s, MFOR2_s, ISATREV_s, MREV_s, m0flag_s) - `JuncapExpressInit4(ABSOURCE_i, LSSOURCE_i, LGSOURCE_i, FJUNQ_i, cjobot, cjosti, cjogat, zflagbot_s, zflagsti_s, zflaggat_s) - `JuncapExpressInit5(ABSOURCE_i, LSSOURCE_i, LGSOURCE_i, ISATFOR1_s, ISATFOR2_s, ISATREV_s, xhighf1_s, expxhf1_s, xhighf2_s, expxhf2_s, xhighr_s, expxhr_s) - - `JuncapExpressInit1(ABDRAIN_i, LSDRAIN_i, LGDRAIN_i, VJUNREFD_i, qprefbot_d, qpref2bot_d, vbiinvbot_d, one_minus_PBOT_d, idsatbot_d, CSRHBOTD_i, CTATBOTD_i, vbibot_d, wdepnulrbot_d, VBIRBOTinv_d, PBOTD_i, ftdbot_d, btatpartbot_d, atatbot_d, one_over_one_minus_PBOT_d, CBBTBOTD_i, VBIRBOTD_i, wdepnulrinvbot_d, fbbtbot_d, VBRBOTD_i, VBRinvbot_d, PBRBOTD_i, fstopbot_d, slopebot_d, qprefsti_d, qpref2sti_d, vbiinvsti_d, one_minus_PSTI_d, idsatsti_d, CSRHSTID_i, CTATSTID_i, vbisti_d, wdepnulrsti_d, VBIRSTIinv_d, PSTID_i, ftdsti_d, btatpartsti_d, atatsti_d, one_over_one_minus_PSTI_d, CBBTSTID_i, VBIRSTID_i, wdepnulrinvsti_d, fbbtsti_d, VBRSTID_i, VBRinvsti_d, PBRSTID_i, fstopsti_d, slopesti_d, qprefgat_d, qpref2gat_d, vbiinvgat_d, one_minus_PGAT_d, idsatgat_d, CSRHGATD_i, CTATGATD_i, vbigat_d, wdepnulrgat_d, VBIRGATinv_d, PGATD_i, ftdgat_d, btatpartgat_d, atatgat_d, one_over_one_minus_PGAT_d, CBBTGATD_i, VBIRGATD_i, wdepnulrinvgat_d, fbbtgat_d, VBRGATD_i, VBRinvgat_d, PBRGATD_i, fstopgat_d, slopegat_d, VMAX_d, exp_VMAX_over_phitd_d, vbimin_d, vch_d, vfmin_d, vbbtlim_d) - `JuncapExpressInit2(ABDRAIN_i, LSDRAIN_i, LGDRAIN_i, qprefbot_d, qpref2bot_d, vbiinvbot_d, one_minus_PBOT_d, idsatbot_d, CSRHBOTD_i, CTATBOTD_i, vbibot_d, wdepnulrbot_d, VBIRBOTinv_d, PBOTD_i, ftdbot_d, btatpartbot_d, atatbot_d, one_over_one_minus_PBOT_d, CBBTBOTD_i, VBIRBOTD_i, wdepnulrinvbot_d, fbbtbot_d, VBRBOTD_i, VBRinvbot_d, PBRBOTD_i, fstopbot_d, slopebot_d, qprefsti_d, qpref2sti_d, vbiinvsti_d, one_minus_PSTI_d, idsatsti_d, CSRHSTID_i, CTATSTID_i, vbisti_d, wdepnulrsti_d, VBIRSTIinv_d, PSTID_i, ftdsti_d, btatpartsti_d, atatsti_d, one_over_one_minus_PSTI_d, CBBTSTID_i, VBIRSTID_i, wdepnulrinvsti_d, fbbtsti_d, VBRSTID_i, VBRinvsti_d, PBRSTID_i, fstopsti_d, slopesti_d, qprefgat_d, qpref2gat_d, vbiinvgat_d, one_minus_PGAT_d, idsatgat_d, CSRHGATD_i, CTATGATD_i, vbigat_d, wdepnulrgat_d, VBIRGATinv_d, PGATD_i, ftdgat_d, btatpartgat_d, atatgat_d, one_over_one_minus_PGAT_d, CBBTGATD_i, VBIRGATD_i, wdepnulrinvgat_d, fbbtgat_d, VBRGATD_i, VBRinvgat_d, PBRGATD_i, fstopgat_d, slopegat_d, VMAX_d, exp_VMAX_over_phitd_d, vbimin_d, vch_d, vfmin_d, vbbtlim_d) - `JuncapExpressInit3(ABDRAIN_i, LSDRAIN_i, LGDRAIN_i, idsatbot_d, idsatsti_d, idsatgat_d, ISATFOR1_d, MFOR1_d, ISATFOR2_d, MFOR2_d, ISATREV_d, MREV_d, m0flag_d) - `JuncapExpressInit4(ABDRAIN_i, LSDRAIN_i, LGDRAIN_i, FJUNQD_i, cjobot_d, cjosti_d, cjogat_d, zflagbot_d, zflagsti_d, zflaggat_d) - `JuncapExpressInit5(ABDRAIN_i, LSDRAIN_i, LGDRAIN_i, ISATFOR1_d, ISATFOR2_d, ISATREV_d, xhighf1_d, expxhf1_d, xhighf2_d, expxhf2_d, xhighr_d, expxhr_d) - end // JUNCAPexpressInit - - end - - end // initial_instance - - begin : evaluateblock - -// real sigVds, dphit1, xgct, xsct0, xbct, xsbstar, xsct, dCTG, ct_fact, phit1, inv_phit1, xg_dc, alpha_dc, dps_dc, qim_dc; -// real qim1_dc, H_dc, FdL_dc, Gvsatinv_dc, Ids, Iimpact, mavl, Igdov, Igsov, Igcd, Igcs, eta_p_ac, Gvsat_ac, Gmob_dL_ac, H0; -// real COX_qm, ijun_s, ijunbot_s, ijunsti_s, ijungat_s, ijun_d, ijunbot_d, ijunsti_d, ijungat_d, qjun_s, qjunbot_s, qjunsti_s; -// real qjungat_s, qjun_d, qjunbot_d, qjunsti_d, qjungat_d, jnoise_s, jnoise_d, Gmob_dc, xitsb_dc, Vdse_dc, Vsbstaredge, Vsbxedge; -// real dphit1edge, phit1edge, inv_phit1edge, Vdspedge, delVgedge, xgedge, xbedge, dxthedge, xnedge_s, qseffedge, xnedge_d; -// real qdseffedge, qdeffedge, qmeffedge, dsqredge, alphabmedge, Idsedge, Sfledge, midedge, sqidedge; -// `ifdef SelfHeating -// real Pdiss, phit, BET_i, BETEDGE_i, nt0, nt, THESAT_T, THESATAC_T, Sfl_prefac, phit0edge, Gfedge2, lnGfedge2, Sfl_prefac_edge; -// real ntedge; -// `endif // SelfHeating -// real temp, temp1, temp2; - - // -------------------------------------------------------------------------------------------------------------- - // DC bias dependent quantities (calculations for current contribs) - // -------------------------------------------------------------------------------------------------------------- - begin : evaluateStatic - - // Initialize temporary variables - temp = 0.0; - temp1 = 0.0; - temp2 = 0.0; - - // Initialization of variables for SHE effect - `ifdef SelfHeating - TKD = TKA + Temp(br_rth); - `TempInitialize - `TempScaling - `endif // SelfHeating - QCLM = 0.0; - xs_ov = 0.0; - xd_ov = 0.0; - Vovs = 0.0; - Vovd = 0.0; - Iimpact = 0.0; - mavl = 0.0; - - // Initialization of variables for NQS model - `ifdef NQSmodel - pd = 1.0; - ym = 0.0; - `endif // NQSmodel - - // Voltage affectations - if (CHNL_TYPE == `NMOS) begin - Vgs = V(GP, SI); - Vds = V(DI, SI); - Vsb = V(SI, BP); - Vjun_s = -V(SI, BS); - Vjun_d = -V(DI, BD); - end else begin - Vgs = -V(GP, SI); - Vds = -V(DI, SI); - Vsb = -V(SI, BP); - Vjun_s = V(SI, BS); - Vjun_d = V(DI, BD); - end - Vgb = Vgs + Vsb; - - // Voltages NOT subject to S/D-interchange - VgsPrime = Vgs; - VsbPrime = Vsb; - VdbPrime = Vds + Vsb; - VgdPrime = Vgs - Vds; - xgs_ov = -VgsPrime * inv_phita; - xgd_ov = -VgdPrime * inv_phita; - - // Source-drain interchange - sigVds = 1.0; - if (Vds < 0.0) begin - sigVds = -1.0; - Vgs = Vgs - Vds; - Vsb = Vsb + Vds; - Vds = -Vds; - end - Vdb = Vds + Vsb; - Vdsx = Vds * Vds / (sqrt(Vds * Vds + 0.01) + 0.1); - - // Core's model calculation for DC - begin : SPcalc_dc - - // Local variable declaration -// `SPcalcLocalVarDecl -// real FdL, qim1_1, r1, r2, s2, dL1; - - // Conditioning of terminal voltages - temp = `MINA(Vdb, Vsb, bphi_dc) + phix_dc; - Vsbstar_dc = Vsb - `MINA(temp, 0, aphi_dc) + phix1_dc; - Vsbstar_dc_tmp = Vsbstar_dc; - - // Adapt Vsb for NUD-effect - if ((SWNUD_i != 0) && (GFACNUD_i != 1.0)) begin - Vmb = Vsbstar_dc + 0.5 * (Vds - Vdsx); - us = sqrt(Vmb + phib_dc) - sqrt_phib_dc; - temp = 2.0 * (us - us1) / us21 - 1.0; - usnew = us - 0.25 * (1.0 - GFACNUD_i) * us21 * (temp + sqrt(temp * temp + 0.4804530139182)); - Vmbnew = usnew * usnew + (2.0 * sqrt_phib_dc) * usnew; - Vsbstar_dc = Vmbnew - 0.5 * (Vds - Vdsx); - end - - // Set variables needed in PSP_core macro - phib = phib_dc; - G_0 = G_0_dc; - Vsbstar = Vsbstar_dc; - cfloc = CF_i; - thesatloc = THESAT_T; - axloc = AX_i; - alploc = ALP_i; - FdL = 1.0; - - // Calculation of PSP model's core - `SPCalculation - - if (xg > 0.0) begin - qim1_1 = 1.0 / qim1; - r1 = qim * qim1_1; - r2 = phit1 * (alpha * qim1_1); - s2 = ln(1.0 + Vdsx * inv_VP); - dL1 = dL + ALP1_i * (qim1_1 * r1 * s1) + ALP2_i * (qbm * r2 * r2 * s2); - FdL = (1.0 + dL1 + dL1 * dL1) * GdL; - end - - xg_dc = xg; - qeff1_dc = qeff1; - Voxm_dc = Voxm; - alpha_dc = alpha; - dps_dc = dps; - qim_dc = qim; - qim1_dc = qim1; - GdL_dc = GdL; - FdL_dc = FdL; - H_dc = H; - eta_p_dc = eta_p; - Gvsat_dc = Gvsat; - Gvsatinv_dc = Gvsatinv; - Gmob_dL_dc = Gmob_dL; - x_ds_dc = x_ds; - x_m_dc = x_m; - Gf_dc = Gf; - Vdsat_dc = Vdsat; - Udse_dc = Udse; - Gmob_dc = Gmob; - xitsb_dc = xitsb; - Vdse_dc = Vdse; - `ifdef NQSmodel - xgm_dc = xgm; - thesat1_dc = thesat1; - margin_dc = margin; - `endif // NQSmodel - end // SPcalc_dc - - if (xg_dc <= 0) begin - Ids = 0.0; - end else begin - // Drain-source current - Ids = BET_i * (FdL_dc * qim1_dc * dps_dc * Gvsatinv_dc); - end - - // Surface potential in gate overlap regions - if (((SWIGATE_i != 0) && ((IGOV_i > 0.0) || (IGOVD_i > 0.0))) || ((SWGIDL_i != 0) && ((AGIDL_i > 0.0) || (AGIDLD_i > 0.0))) || (CGOV_i > 0.0) || (CGOVD_i > 0.0)) begin - SP_OV_xg = 0.5 * (xgs_ov + sqrt(xgs_ov * xgs_ov + SP_OV_eps2_s)); - xs_ov = -SP_OV_xg - GOV2_s * 0.5 + GOV_s * sqrt(SP_OV_xg + GOV2_s * 0.25 + SP_OV_a_s) + SP_OV_delta1_s; - SP_OV_xg = 0.5 * (xgd_ov + sqrt(xgd_ov * xgd_ov + SP_OV_eps2_d)); - xd_ov = -SP_OV_xg - GOV2_d * 0.5 + GOV_d * sqrt(SP_OV_xg + GOV2_d * 0.25 + SP_OV_a_d) + SP_OV_delta1_d; - Vovs = -phita * (xgs_ov + xs_ov); - Vovd = -phita * (xgd_ov + xd_ov); - end - - // Gate current - Igsov = 0.0; - Igdov = 0.0; - Igc = 0.0; - Igb = 0.0; - Igcs = 0.0; - Igcd = 0.0; - if (SWIGATE_i != 0) begin - if (IGOV_i > 0.0) begin - // Gate-source overlap component of gate current - zg = sqrt(Vovs * Vovs + 1.0e-6) * inv_CHIB; - if (GC3OV_i < 0.0) begin - zg = `MINA(zg, GCQOV, 1.0e-6); - end - temp = BOV * (-1.5 + zg * (GC2OV_i + GC3OV_i * zg)); - if (temp > 0.0) begin - TP = `P3(temp); - end else begin - `expl_low(temp, TP) - end - Fs1 = 3.0 + xs_ov; - Fs2 = -3.0 - GCO_i; - Fs3 = 30.0 * VgsPrime; - `MNE(Fs1, Fs3, 0.9, temp) - `MXE(Fs2, temp, 0.3, Fs) - Igsov = IGOV_i * (TP * Fs); - end - - if (IGOVD_i > 0.0) begin - // Gate-drain overlap component of gate current - zg = sqrt(Vovd * Vovd + 1.0e-6) * inv_CHIB; - if (GC3OV_i < 0.0) begin - zg = `MINA(zg, GCQOV, 1.0e-6); - end - temp = BOV_d * (-1.5 + zg * (GC2OV_i + GC3OV_i * zg)); - if (temp > 0.0) begin - TP = `P3(temp); - end else begin - `expl_low(temp, TP) - end - Fs1 = 3.0 + xd_ov; - Fs2 = -3.0 - GCO_i; - Fs3 = 30.0 * VgdPrime; - `MNE(Fs1, Fs3, 0.9, temp) - `MXE(Fs2, temp, 0.3, Fs) - Igdov = IGOVD_i * (TP * Fs); - end - - // Gate-channel component of gate current - if (IGINV_i > 0.0) begin - if (xg_dc <= 0.0) begin - temp = pow(Vds / Vdsat_lim, AX_i); - Udse_dc = Vds * pow(1.0 + temp, -inv_AX) * inv_phit1; - end - `expl_low(x_ds_dc-Udse_dc, temp) - Vm = Vsbstar_dc + phit1 * (0.5 * x_ds_dc - ln(0.5 * (1.0 + temp))); - Dch = GCO_i * phit1; - arg2mina = Voxm_dc + Dch; - psi_t = `MINA(0.0, arg2mina, 0.01); - zg = sqrt(Voxm_dc * Voxm_dc + 1.0e-6) * inv_CHIB; - if (GC3_i < 0.0) begin - zg = `MINA(zg, GCQ, 1.0e-06); - end - arg1 = (x_m_dc + (psi_t - alpha_b - Vm) * inv_phit1); - `expl(arg1,Dsi) - arg1 = -(Vgs + Vsbstar_dc - Vm) * inv_phit1; - `expl(arg1,temp) - Dgate = Dsi * temp; - temp = BCH * (-1.5 + zg * (GC2_i + GC3_i * zg)); - if (temp > 0) begin - TP = `P3(temp); - end else begin - `expl_low(temp, TP) - end - Igc0 = IGINV_i * (TP * ln((1.0 + Dsi) / (1.0 + Dgate))); - - // Source/drain partitioning of gate-channel current - if ((xg_dc <= 0.0) || ((GC2_i == 0.0) && (GC3_i == 0.0))) begin - igc = 1.0; - igcd_h = 0.5; - end else begin - temp = GC2_i + 2.0 * GC3_i * zg; - u0 = CHIB_i / (temp * BCH); - x = 0.5 * (dps_dc / u0); - u0_div_H = u0 / H_dc; - Bg = u0_div_H * (1.0 - u0_div_H) * 0.5; - Ag = 0.5 - 3.0 * Bg; - if (x < 1.0e-3) begin - xsq = x * x; - igc = 1.0 + xsq * (`oneSixth + u0_div_H * `oneThird + `oneSixth * (xsq * (0.05 + 0.2 * u0_div_H))); - igcd_h = 0.5 * igc - `oneSixth * (x * (1.0 + xsq * (0.4 * (Bg + 0.25) + 0.0285714285714 * (xsq * (0.125 + Bg))))); - end else begin - inv_x = 1.0 / x; - `expl(x, ex) - inv_ex = 1.0 / ex; - temp = ex - inv_ex; - temp2 = ex + inv_ex; - igc = 0.5 * ((1.0 - u0_div_H) * temp * inv_x + u0_div_H * temp2); - igcd_h = 0.5 * (igc - temp * (Bg - Ag * inv_x * inv_x) - Ag * temp2 * inv_x); - end - end - Sg = 0.5 * (1.0 + xg_dc / sqrt(xg_dc * xg_dc + 1.0e-6)); - Igc = Igc0 * igc * Sg; - Igcd = Igc0 * igcd_h * Sg; - Igcs = Igc - Igcd; - Igb = Igc0 * igc * (1.0 - Sg); - end // (IGINV >0) - end // (SWIGATE != 0) - - // GIDL/GISL current - Igidl = 0.0; - Igisl = 0.0; - if (SWGIDL_i != 0) begin - // GIDL current computation - if ((AGIDLD_i > 0) && (Vovd < 0)) begin - Vtovd = sqrt(Vovd * Vovd + CGIDLD_i * CGIDLD_i * (VdbPrime * VdbPrime) + 1.0e-6); - temp = -BGIDLDs / Vtovd; - `expl_low(temp, temp2) - Igidl = -AGIDLDs * (VdbPrime * Vovd * Vtovd * temp2); - end - - // GISL current computation - if ((AGIDL_i > 0) && (Vovs < 0)) begin - Vtovs = sqrt(Vovs * Vovs + CGIDL_i * CGIDL_i * (VsbPrime * VsbPrime) + 1.0e-6); - temp = -BGIDLs / Vtovs; - `expl_low(temp, temp2) - Igisl = -AGIDLs * (VsbPrime * Vovs * Vtovs * temp2); - end - end // (SWGIDL != 0) - - // Drain current of edge transistors: PSP 103.4 - xgedge = 0.0; - qdseffedge = 0.0; - qmeffedge = 0.0; - dsqredge = 1.0e-40; - alphabmedge = 1.0; - Idsedge = 0.0; - if ((SWEDGE_i != 0.0) && (BETNEDGE_i > 0)) begin - temp = `MINA(Vdb, Vsb, bphiedge) + phixedge; - Vsbstaredge = Vsb - `MINA(temp, 0, aphiedge) + phix1edge; - Vsbxedge = Vsbstaredge + 0.5 * (Vds - Vdsx); - dphit1edge = PSCEEDGE_i * (1 + PSCEDEDGE_i * Vdsx)* (1.0 + PSCEBEDGE_i * Vsbxedge); // SCE on subthreshold slope - phit1edge = phit0edge * (1.0 + dphit1edge); - inv_phit1edge = 1.0 / phit1edge; - Vdspedge = 2.0 * Vdsx / (1.0 + sqrt(1.0 + CFDEDGE_i * Vdsx)); - delVgedge = CFEDGE_i * Vdspedge * (1 + CFBEDGE_i * Vsbxedge); // DIBL effect - xgedge = inv_phit1edge * (Vgs + Vsbstaredge + delVgedge - VFBEDGE_T); - xbedge = inv_phit1edge * phibedge; - dxthedge = 2.0 * ln(xbedge / Gfedge + sqrt(xbedge)); - xnedge_s = inv_phit1edge * Vsbstaredge; - `qi_edge(qseffedge,xgedge,xnedge_s) - xnedge_d = inv_phit1edge * (Vdse_dc + Vsbstaredge); - if ((qseffedge < 1.0e-3) && (Vdse_dc < 1.0e-6)) begin - `expl_low((-xnedge_d + xnedge_s), temp) - qdseffedge = qseffedge * (temp - 1.0); - qdeffedge = qdseffedge + qseffedge; - end else begin - `qi_edge(qdeffedge,xgedge,xnedge_d) - qdseffedge = qdeffedge - qseffedge; - end - qmeffedge = 0.5 * (qdeffedge + qseffedge); - dsqredge = max(xgedge - qmeffedge, 1.0e-40); - alphabmedge = 1.0 - 0.5 * Gfedge / sqrt(dsqredge + 0.25 * Gfedge2); - Idsedge = -BETEDGE_i * phit1edge * phit1edge * (alphabmedge * qmeffedge + 1.0) * qdseffedge / Gmob_dc; - end - - // Impact-Ionization - if ((xg_dc > 0) && (SWIMPACT_i != 0)) begin - delVsat = Vds - A3_i * dps_dc; - if (delVsat > 0) begin - temp2 = A2_T * ((1.0 + A4_i * (sqrt(phib_dc + Vsbstar_dc) - sqrt_phib_dc)) / (delVsat + 1.0e-30)); - `expl(-temp2, temp) - mavl = A1_i * (delVsat * temp); - Iimpact = mavl * (Ids + Idsedge); - end - end - - // Threshold voltage calculation for .OP - P_D = 1.0 + 0.25 * (Gf_dc * kp); - facvsb0 = phib_dc + 2.0 * phit1; - facvsb = Vsbstar_dc + facvsb0; - vts_i = VFB_T + P_D * facvsb - Vsbstar_dc + Gf_dc * sqrt(phit1 * facvsb ); - vth_i = vts_i - delVg; - - end // evaluateStatic - - // -------------------------------------------------------------------------------------------------------------- - // AC bias dependent quantities (calculations for charge contribs) - // -------------------------------------------------------------------------------------------------------------- - begin : evaluateDynamic - - // Core's model calculation for AC - begin : SPcalc_ac - - // Local variable declaration -// `SPcalcLocalVarDecl - - // SP calculations - if ((SWNUD_i == 1) || (SWDELVTAC_i != 0) || (SWQSAT_i == 1)) begin - - Vsbstar = Vsbstar_dc_tmp; - phib = phib_dc; - G_0 = G_0_dc; - cfloc = CF_i; - thesatloc = THESAT_T; - axloc = AX_i; - alploc = ALP_i; - - if (SWDELVTAC_i != 0) begin - // Conditioning of terminal voltages - temp = `MINA(Vdb, Vsb, bphi_ac) + phix_ac; - Vsbstar_ac = Vsb - `MINA(temp, 0.0, aphi_ac) + phix1_ac; - Vsbstar = Vsbstar_ac; - phib = phib_ac; - G_0 = G_0_ac; - end - - if (SWQSAT_i != 0) begin - cfloc = CFAC_i; - thesatloc = THESATAC_T; - axloc = AXAC_i; - alploc = ALPAC_i; - end - - // Calculation of PSP model's core - `SPCalculation - - xg_ac = xg; - qeff1_ac = qeff1; - Voxm_ac = Voxm; - alpha_ac = alpha; - dps_ac = dps; - qim_ac = qim; - GdL_ac = GdL; - H_ac = H; - eta_p_ac = eta_p; - Gvsat_ac = Gvsat; - Gmob_dL_ac = Gmob_dL; - `ifdef NQSmodel - Gf_ac = Gf; - x_m_ac = x_m; - xgm_ac = xgm; - thesat1_ac = thesat1; - margin_ac = margin; - `endif // NQSmodel - end else begin - xg_ac = xg_dc; - qeff1_ac = qeff1_dc; - Voxm_ac = Voxm_dc; - alpha_ac = alpha_dc; - dps_ac = dps_dc; - qim_ac = qim_dc; - GdL_ac = GdL_dc; - H_ac = H_dc; - eta_p_ac = eta_p_dc; - Gvsat_ac = Gvsat_dc; - Gmob_dL_ac = Gmob_dL_dc; - `ifdef NQSmodel - Gf_ac = Gf_dc; - x_m_ac = x_m_dc; - xgm_ac = xgm_dc; - thesat1_ac = thesat1_dc; - margin_ac = margin_dc; - `endif // NQSmodel - end - end // SPcalc_ac - - // Quantum mechanical corrections - COX_qm = COX_i; - if (qq > 0.0) begin - COX_qm = COX_i / (1.0 + qq * pow(qeff1_ac * qeff1_ac + qlim2, -1.0 * `oneSixth)); - end - - // Intrinsic charge model - if (xg_ac <= 0.0) begin - QG = Voxm_ac; - QI = 0.0; - QD = 0.0; - QB = QG; - end else begin - Fj = 0.5 * (dps_ac / H_ac); - Fj2 = Fj * Fj; - QG = Voxm_ac + 0.5 * (eta_p_ac * dps_ac * (Fj * GdL_ac * `oneThird - 1.0 + GdL_ac)); - temp = alpha_ac * dps_ac * `oneSixth; - if (SWQPART_i == 1) begin - QCLM = 0.0; - QD = 0.5 * GdL_ac * GdL_ac * (qim_ac - 3.0 * temp * (2.0 - Fj)); - end else begin - QCLM = (1.0 - GdL_ac) * (qim_ac - 0.5 * (alpha_ac * dps_ac)); - QD = 0.5 * (GdL_ac * GdL_ac * (qim_ac - temp * (1.0 - Fj - 0.2 * Fj2)) + QCLM * (1.0 + GdL_ac)); - end - QI = GdL_ac * (qim_ac + temp * Fj) + QCLM; - QB = QG - QI; - end - Qg = QG * COX_qm; - Qd = -QD * COX_qm; - Qb = -QB * COX_qm; - - // Extrinsic charge model - Qgs_ov = CGOV_i * Vovs; - Qgd_ov = CGOVD_i * Vovd; - Qgb_ov = CGBOV_i * Vgb; - - // Outer fringe charge - Qfgs = CFR_i * VgsPrime; - Qfgd = CFRD_i * VgdPrime; - - // Variables for NQS model - `ifdef NQSmodel - Gp = 0.0; - Gp2 = 0.0; - a_factrp = 0.0; - marginp = 0.0; - if (SWNQS_i != 0) begin - if (xg_ac <= 0.0) begin - ym = 0.5; - pd = 1.0; - Gp = Gf_ac; - end else begin - ym = 0.5 * ( 1.0 + 0.25 * (dps_ac / H_ac)); - pd = xgm_ac / (xg_ac - x_m_ac); - Gp = Gf_ac / pd; - end - Gp2 = Gp * Gp; - a_factrp = 1.0 + Gp * `invSqrt2; - marginp = 1.0e-5 * a_factrp; - end - `endif // NQSmodel - - end // evaluateDynamic - - // -------------------------------------------------------------------------------------------------------------- - // JUNCAP2 contribs - // -------------------------------------------------------------------------------------------------------------- - begin : evaluateStaticDynamic - ijun_s = 0.0; - ijunbot_s = 0.0; - ijunsti_s = 0.0; - ijungat_s = 0.0; - ijun_d = 0.0; - ijunbot_d = 0.0; - ijunsti_d = 0.0; - ijungat_d = 0.0; - qjun_s = 0.0; - qjunbot_s = 0.0; - qjunsti_s = 0.0; - qjungat_s = 0.0; - qjun_d = 0.0; - qjunbot_d = 0.0; - qjunsti_d = 0.0; - qjungat_d = 0.0; - if (SWJUNCAP_i > 0) begin - if (SWJUNEXP_i == 1) begin - `JuncapExpressCurrent(Vjun_s, MFOR1_s, ISATFOR1_s, MFOR2_s, ISATFOR2_s, MREV_s, ISATREV_s, m0flag_s, xhighf1_s, expxhf1_s, xhighf2_s, expxhf2_s, xhighr_s, expxhr_s, ijun_s) - `JuncapExpressCurrent(Vjun_d, MFOR1_d, ISATFOR1_d, MFOR2_d, ISATFOR2_d, MREV_d, ISATREV_d, m0flag_d, xhighf1_d, expxhf1_d, xhighf2_d, expxhf2_d, xhighr_d, expxhr_d, ijun_d) - begin : evaluateDynamic -// real tmpv, vjv; - `JuncapExpressCharge(Vjun_s, ABSOURCE_i, LSSOURCE_i, LGSOURCE_i, qprefbot, qprefsti, qprefgat, qpref2bot, qpref2sti, qpref2gat, vbiinvbot, vbiinvsti, vbiinvgat, one_minus_PBOT, one_minus_PSTI, one_minus_PGAT, vfmin_s, vch_s, zflagbot_s, zflagsti_s, zflaggat_s, qjunbot_s, qjunsti_s, qjungat_s) - `JuncapExpressCharge(Vjun_d, ABDRAIN_i, LSDRAIN_i, LGDRAIN_i, qprefbot_d, qprefsti_d, qprefgat_d, qpref2bot_d, qpref2sti_d, qpref2gat_d, vbiinvbot_d, vbiinvsti_d, vbiinvgat_d, one_minus_PBOT_d, one_minus_PSTI_d, one_minus_PGAT_d, vfmin_d, vch_d, zflagbot_d, zflagsti_d, zflaggat_d, qjunbot_d, qjunsti_d, qjungat_d) - end - end else begin - `juncapcommon(Vjun_s, ABSOURCE_i, LSSOURCE_i, LGSOURCE_i, qprefbot, qpref2bot, vbiinvbot, one_minus_PBOT, idsatbot, CSRHBOT_i, CTATBOT_i, vbibot, wdepnulrbot, VBIRBOTinv, PBOT_i, ftdbot, btatpartbot, atatbot, one_over_one_minus_PBOT, CBBTBOT_i, VBIRBOT_i, wdepnulrinvbot, fbbtbot, VBRBOT_i, VBRinvbot, PBRBOT_i, fstopbot, slopebot, qprefsti, qpref2sti, vbiinvsti, one_minus_PSTI, idsatsti, CSRHSTI_i, CTATSTI_i, vbisti, wdepnulrsti, VBIRSTIinv, PSTI_i, ftdsti, btatpartsti, atatsti, one_over_one_minus_PSTI, CBBTSTI_i, VBIRSTI_i, wdepnulrinvsti, fbbtsti, VBRSTI_i, VBRinvsti, PBRSTI_i, fstopsti, slopesti, qprefgat, qpref2gat, vbiinvgat, one_minus_PGAT, idsatgat, CSRHGAT_i, CTATGAT_i, vbigat, wdepnulrgat, VBIRGATinv, PGAT_i, ftdgat, btatpartgat, atatgat, one_over_one_minus_PGAT, CBBTGAT_i, VBIRGAT_i, wdepnulrinvgat, fbbtgat, VBRGAT_i, VBRinvgat, PBRGAT_i, fstopgat, slopegat, VMAX_s, exp_VMAX_over_phitd_s, vbimin_s, vch_s, vfmin_s, vbbtlim_s, ijunbot_s, qjunbot_s, ijunsti_s, qjunsti_s, ijungat_s, qjungat_s) - ijun_s = ABSOURCE_i * ijunbot_s + LSSOURCE_i * ijunsti_s + LGSOURCE_i * ijungat_s; - `juncapcommon(Vjun_d, ABDRAIN_i, LSDRAIN_i, LGDRAIN_i, qprefbot_d, qpref2bot_d, vbiinvbot_d, one_minus_PBOT_d, idsatbot_d, CSRHBOTD_i, CTATBOTD_i, vbibot_d, wdepnulrbot_d, VBIRBOTinv_d, PBOTD_i, ftdbot_d, btatpartbot_d, atatbot_d, one_over_one_minus_PBOT_d, CBBTBOTD_i, VBIRBOTD_i, wdepnulrinvbot_d, fbbtbot_d, VBRBOTD_i, VBRinvbot_d, PBRBOTD_i, fstopbot_d, slopebot_d, qprefsti_d, qpref2sti_d, vbiinvsti_d, one_minus_PSTI_d, idsatsti_d, CSRHSTID_i, CTATSTID_i, vbisti_d, wdepnulrsti_d, VBIRSTIinv_d, PSTID_i, ftdsti_d, btatpartsti_d, atatsti_d, one_over_one_minus_PSTI_d, CBBTSTID_i, VBIRSTID_i, wdepnulrinvsti_d, fbbtsti_d, VBRSTID_i, VBRinvsti_d, PBRSTID_i, fstopsti_d, slopesti_d, qprefgat_d, qpref2gat_d, vbiinvgat_d, one_minus_PGAT_d, idsatgat_d, CSRHGATD_i, CTATGATD_i, vbigat_d, wdepnulrgat_d, VBIRGATinv_d, PGATD_i, ftdgat_d, btatpartgat_d, atatgat_d, one_over_one_minus_PGAT_d, CBBTGATD_i, VBIRGATD_i, wdepnulrinvgat_d, fbbtgat_d, VBRGATD_i, VBRinvgat_d, PBRGATD_i, fstopgat_d, slopegat_d, VMAX_d, exp_VMAX_over_phitd_d, vbimin_d, vch_d, vfmin_d, vbbtlim_d, ijunbot_d, qjunbot_d, ijunsti_d, qjunsti_d, ijungat_d, qjungat_d) - ijun_d = ABDRAIN_i * ijunbot_d + LSDRAIN_i * ijunsti_d + LGDRAIN_i * ijungat_d; - end - end - - // -------------------------------------------------------------------------------------------------------------- - // NQS and parasitic resistance contribs - // -------------------------------------------------------------------------------------------------------------- - - // Set initial conditions for NQS model - `ifdef NQSmodel - `include "PSP103_InitNQS.include" - `endif // NQSmodel - - // Parasitic resistances (including noise) - rgatenoise = nt0 * ggate; - rsourcenoise = nt0 * gsource; - rdrainnoise = nt0 * gdrain; - rbulknoise = nt0 * gbulk; - rjunsnoise = nt0 * gjuns; - rjundnoise = nt0 * gjund; - rwellnoise = nt0 * gwell; - - end // evaluateStaticDynamic - - // -------------------------------------------------------------------------------------------------------------- - // Current contribs - // -------------------------------------------------------------------------------------------------------------- - begin : loadStatic - - // Convert back for NMOS-PMOS and Source-Drain interchange - if (sigVds > 0.0) begin - I(DI, BP) <+ CHNL_TYPE * MULT_i * Iimpact; - I(DI, SI) <+ CHNL_TYPE * MULT_i * (Ids + Idsedge); - I(GP, SI) <+ CHNL_TYPE * MULT_i * Igcs; - I(GP, DI) <+ CHNL_TYPE * MULT_i * Igcd; - end else begin - I(SI, BP) <+ CHNL_TYPE * MULT_i * Iimpact; - I(SI, DI) <+ CHNL_TYPE * MULT_i * (Ids + Idsedge); - I(GP, DI) <+ CHNL_TYPE * MULT_i * Igcs; - I(GP, SI) <+ CHNL_TYPE * MULT_i * Igcd; - end - I(GP, BP) <+ CHNL_TYPE * MULT_i * Igb; - I(GP, SI) <+ CHNL_TYPE * MULT_i * Igsov; - I(GP, DI) <+ CHNL_TYPE * MULT_i * Igdov; - I(SI, BP) <+ CHNL_TYPE * MULT_i * Igisl; - I(DI, BP) <+ CHNL_TYPE * MULT_i * Igidl; - I(BS, SI) <+ CHNL_TYPE * MULT_i * ijun_s; - I(BD, DI) <+ CHNL_TYPE * MULT_i * ijun_d; - - //ngspice-adms: Parasitic resistances - no node collapse - `NonCollapsableR(ggate, RG_i, rgatenoise, G, GP, "rgate") - `NonCollapsableR(gsource, RSE_i, rsourcenoise, S, SI, "rsource") - `NonCollapsableR(gdrain, RDE_i, rdrainnoise, D, DI, "rdrain") - `NonCollapsableR(gbulk, RBULK_i, rbulknoise, BP, BI, "rbulk") - `NonCollapsableR(gjuns, RJUNS_i, rjunsnoise, BS, BI, "rjuns") - `NonCollapsableR(gjund, RJUND_i, rjundnoise, BD, BI, "rjund") - `NonCollapsableR(gwell, RWELL_i, rwellnoise, B, BI, "rwell") - - I(DI, SI) <+ `GMIN * V(DI, SI); - - end // loadStatic - - // -------------------------------------------------------------------------------------------------------------- - // ddt() contribs from charges (Note: MULT is handled explicitly) - // -------------------------------------------------------------------------------------------------------------- - begin : loadStaticDynamic - - // Implementation of NQS charges - `ifdef NQSmodel - `include "PSP103_ChargesNQS.include" - `endif // NQSmodel - - // Implementation of Self heating effect - `ifdef SelfHeating - begin : self_heating -// real Pdiss_s, Pdiss_d; - Pdiss = 0.0; - Pdiss_s = 0.0; - Pdiss_d = 0.0; - if (RSE_i > 0.0) begin - Pdiss_s = gsource * V(S, SI) * V(S, SI); - end - if (RDE_i > 0.0) begin - Pdiss_d = gdrain * V(D, DI) * V(D, DI); - end - if (RTH_p > 1.0e-3) begin - Pdiss = ((Ids + Idsedge) * Vds + Iimpact * (Vds + Vsb) + Pdiss_s + Pdiss_d); - end - Pwr(br_ith) <+ -MULT_i * Pdiss; - Pwr(br_rth) <+ ddt(MULT_i * CTH_i * Temp(br_rth)); - Pwr(br_rth) <+ MULT_i * Temp(br_rth) / RTH_T; - end // self_heating - `endif // SelfHeating - - end // loadStaticDynamic - - begin : loadDynamic - - // Local variable -// real temp; - - // Intrinsic MOSFET charges - Qs = -(Qg + Qb + Qd); - - // Total outerFringe + overlap for gate-source and gate-drain. - Qfgs = Qfgs + Qgs_ov; - Qfgd = Qfgd + Qgd_ov; - - // JUNCAP2 - qjun_s = ABSOURCE_i * qjunbot_s + LSSOURCE_i * qjunsti_s + LGSOURCE_i * qjungat_s; - qjun_d = ABDRAIN_i * qjunbot_d + LSDRAIN_i * qjunsti_d + LGDRAIN_i * qjungat_d; - - // Convert back (undo S-D interchange) - if (sigVds < 0.0) begin - temp = Qd; // Qd <--> Qs - Qd = Qs; - Qs = temp; - end - - I(GP, SI) <+ ddt(CHNL_TYPE * MULT_i * Qg); - I(BP, SI) <+ ddt(CHNL_TYPE * MULT_i * Qb); - I(DI, SI) <+ ddt(CHNL_TYPE * MULT_i * Qd); - I(GP, SI) <+ ddt(CHNL_TYPE * MULT_i * Qfgs); - I(GP, DI) <+ ddt(CHNL_TYPE * MULT_i * Qfgd); - I(GP, BP) <+ ddt(CHNL_TYPE * MULT_i * Qgb_ov); - I(BS, SI) <+ ddt(CHNL_TYPE * MULT_i * qjun_s); - I(BD, DI) <+ ddt(CHNL_TYPE * MULT_i * qjun_d); - - end // loadDynamic - - // -------------------------------------------------------------------------------------------------------------- - // Noise - // -------------------------------------------------------------------------------------------------------------- - begin : noise - - // Noise variable calculation - Sfl = 0.0; - Sidexc = 0.0; - mid = 0.0; - mig = 1.0e-40; - migid = 0.0; - c_igid = 0.0; - CGeff = COX_qm * eta_p_ac; - sqid = 0.0; - sqig = 0.0; - Sfledge = 0.0; - midedge = 0.0; - sqidedge = 0.0; - - // Channel noise contributions - if ((xg_dc > 0.0) && (MULT_i > 0.0) && (BET_i > 0.0)) begin - // Flicker noise - N1 = Cox_over_q * alpha_dc * phit; - Nm1 = Cox_over_q * qim1_dc; - Delta_N1 = Cox_over_q * alpha_dc * dps_dc; - Sfl = (NFA_i - NFB_i * N1 + NFC_i * (N1 * N1)) * ln((Nm1 + 0.5 * Delta_N1) / (Nm1 - 0.5 * Delta_N1)); - Sfl = Sfl + (NFB_i + NFC_i * (Nm1 - 2.0 * N1)) * Delta_N1; - Sfl = Sfl_prefac * Ids * Gvsatinv_dc * Sfl / N1; - Sfl = `CLIP_LOW(Sfl, 0.0); - - // Thermal channel noise - H0 = qim1_dc / alpha_dc; - t1 = qim_dc / qim1_dc; - sqt2 = 0.5 * `oneSixth * (dps_dc / H0); - t2 = sqt2 * sqt2; - r = H0 / H_dc - 1.0; - lc = `CLIP_LOW(1.0 - 12.0 * (r * t2), 1.0e-20); - lcinv2 = 1.0 / (lc * lc); - g_ideal = BET_i * (FdL_dc * qim1_dc * Gvsatinv_dc); - mid = t1 + 12.0 * t2 - 24.0 * ((1.0 + t1) * t2 * r); - mid = `CLIP_LOW(mid, 1.0e-40); - mid = g_ideal * lcinv2 * mid; - if (FNTEXC_i > 0.0) begin - // recalculate Gvsat, excluding Gmob-effect - temp2_exc = qim_dc * xitsb_dc; - wsat_exc = 100.0 * (temp2_exc / (100.0 + temp2_exc)); - if (THESATG_i < 0) begin - temp_exc = 1.0 / (1.0 - THESATG_i * wsat_exc); - end else begin - temp_exc = 1.0 + THESATG_i * wsat_exc; - end - thesat1_exc = THESAT_T * (temp_exc / Gmob_dc); - zsat_exc = thesat1_exc * thesat1_exc * dps_dc * dps_dc; - if (CHNL_TYPE == `PMOS) begin - zsat_exc = zsat_exc / (1.0 + thesat1_exc * dps_dc); - end - Gvsat_exc = 0.5 * (Gmob_dc * (1.0 + sqrt(1.0 + 2.0 * zsat_exc))); - gfac = Gmob_dc / (Gvsat_exc * lc); - Sidexc = fac_exc * Ids * Vdse_dc * gfac * gfac; - mid = mid + Sidexc / nt0; - end - sqid = sqrt(nt * mid); - - // Induced gate noise - if ((SWIGN_i == 1) && (nt > 0.0)) begin - mig = t1 / 12.0 - t2 * (t1 + 0.2 - 12.0 * t2) - 1.6 * (t2 * (t1 + 1.0 - 12.0 * t2) * r); - mig = `CLIP_LOW(mig, 1.0e-40); - mig = lcinv2 / g_ideal * mig; - migid0 = lcinv2 * sqt2 * (1.0 - 12.0 * t2 - (t1 + 19.2 * t2 - 12.0 * (t1 * t2)) * r); - CGeff = Gvsat_ac * Gvsat_ac * COX_qm * eta_p_ac / (Gmob_dL_ac * Gmob_dL_ac); - if (FNTEXC_i > 0.0) begin - mig = mig + Sidexc * (1.0 + 12.0 * t2) / (12.0 * g_ideal * g_ideal * nt0); - migid0 = migid0 - Sidexc * sqt2 * (1.0 + r) / (g_ideal * nt0); - end - sqig = sqrt(nt / mig); - if (sqid == 0) begin - c_igid = 0.0; - end else begin - c_igid = migid0 * sqig / sqid; // = migid0 / sqrt(mig * mid); - end - c_igid = `CLIP_BOTH(c_igid, 0.0, 1.0); - migid = c_igid * sqid / sqig; - end - end - - // Noise of gate leakage currents - shot_igcsx = 2.0 * `QELE * abs(Igcs); - shot_igcdx = 2.0 * `QELE * abs(Igcd); - shot_igsov = 2.0 * `QELE * abs(Igsov); - shot_igdov = 2.0 * `QELE * abs(Igdov); - - // Noise of impact ionization currents - shot_iavl = 2.0 * `QELE * ((mavl + 1) * abs(Iimpact)); - - // Noise of junctions (JUNCAP2) - jnoisex_s = 2.0 * `QELE * abs(ijun_s); - jnoisex_d = 2.0 * `QELE * abs(ijun_d); - if (sigVds > 0.0) begin - shot_igs = shot_igcsx + shot_igsov; - shot_igd = shot_igcdx + shot_igdov; - jnoise_s = jnoisex_s; - jnoise_d = jnoisex_d + shot_iavl; - end else begin - shot_igs = shot_igcdx + shot_igsov; - shot_igd = shot_igcsx + shot_igdov; - jnoise_s = jnoisex_s + shot_iavl; - jnoise_d = jnoisex_d; - end - - // Noise of edge transistors: PSP 103.4 - if ((SWEDGE_i != 0.0) && (BETNEDGE_i > 0) && (xgedge > 0)) begin - // Flicker noise of edge transistor - temp1 = 4.0 * dsqredge / Gfedge2; - anoisedge = sqrt(temp1 + 1.0) / (sqrt(temp1 + 1.1) - 1.0); - temp1 = Cox_over_q * phit; - N1edge = temp1 * anoisedge; - Nm1edge = temp1 * (qmeffedge + anoisedge); - Delta_N1edge = -temp1 * anoisedge * alphabmedge * qdseffedge; - Sfledge = (NFAEDGE_i - (NFBEDGE_i - NFCEDGE_i * N1edge) * N1edge) * ln((Nm1edge + 0.5 * Delta_N1edge) / (Nm1edge - 0.5 * Delta_N1edge)); - Sfledge = Sfledge + (NFBEDGE_i + NFCEDGE_i * (Nm1edge - 2.0 * N1edge)) * Delta_N1edge; - Sfledge = Sfl_prefac_edge * Idsedge * Gvsatinv_dc * Sfledge / N1edge; - Sfledge = `CLIP_LOW(Sfledge, 0.0); - - // Thermal channel noise of edge transistor - H0edge = phit * (qmeffedge + anoisedge) / anoisedge; - t1edge = phit1 / phit * qmeffedge / (qmeffedge + anoisedge); - sqt2edge = -0.5 * `oneSixth * phit * alphabmedge * qdseffedge / H0edge; - t2edge = sqt2edge * sqt2edge; - redge = 0.0; - temp1 = alpha_dc * H_dc; - if (temp1 > 1.0e-10) begin - redge = anoisedge * H0edge / temp1 - 1.0; - end - lcedge = `CLIP_LOW(1.0 - 12.0 * (redge * t2edge), 1.0e-20); - lcinv2edge = 1.0 / (lcedge * lcedge); - g_idealedge = BETEDGE_i * phit * (qmeffedge + anoisedge) * FdL_dc * Gvsatinv_dc; - midedge = t1edge + 12.0 * t2edge - 24.0 * ((1.0 + t1edge) * t2edge * redge); - midedge = `CLIP_LOW(midedge, 1.0e-40); - midedge = g_idealedge * lcinv2edge * midedge; - sqidedge = sqrt(ntedge * midedge); - end - - // Noise contributions - I(NOII) <+ white_noise((nt / mig), "igig"); - I(NOIR) <+ V(NOIR) / mig; - I(NOIC) <+ ddt(CGeff * V(NOIC)); -//ngspice-adms: can't handle specific noise contributions -// I(GP,SI) <+ -ddt(sqrt(MULT_i) * 0.5 * CGeff * V(NOIC)); -// I(GP,DI) <+ -ddt(sqrt(MULT_i) * 0.5 * CGeff * V(NOIC)); -// I(DI,SI) <+ sigVds * sqrt(MULT_i) * migid * I(NOII); - I(DI,SI) <+ white_noise(MULT_i * sqid * sqid * (1.0 - c_igid * c_igid), "idid"); - I(DI,SI) <+ flicker_noise(MULT_i * Sfl, EF_i, "flicker"); - I(GP,SI) <+ white_noise(MULT_i * shot_igs, "igs"); - I(GP,DI) <+ white_noise(MULT_i * shot_igd, "igd"); - I(BS,SI) <+ white_noise(MULT_i * jnoise_s, "ibs"); - I(BD,DI) <+ white_noise(MULT_i * jnoise_d, "ibd"); - I(DI,SI) <+ flicker_noise(MULT_i * Sfledge, EFEDGE_i, "flicker"); - I(DI,SI) <+ white_noise(MULT_i * sqidedge * sqidedge, "ididedge"); - - end // noise - - // -------------------------------------------------------------------------------------------------------------- - // Operating point info - // -------------------------------------------------------------------------------------------------------------- - begin : OPinfo - - // Auxiliary variables - id_op = Ids + Idsedge + Iimpact - Igcd; - is = -Ids - Idsedge - Igcs; - ig = Igcs + Igcd + Igsov + Igdov + Igb; - ib = -Iimpact - Igb - Igidl - Igisl; - sig1k = 2.0e3 * `PI * CGeff; - sig1k = sig1k * sig1k * mig; - - // Actual operation point output variables - sdint = sigVds; - ctype = CHNL_TYPE; - if (sigVds < 0.0) begin - ise = MULT_i * (is - Igdov + Igidl - ijun_d); - ige = MULT_i * ig; - ide = MULT_i * (id_op - Igsov + Igisl - ijun_s); - ibe = MULT_i * (ib + ijun_s + ijun_d); - ids = MULT_i * Ids; - idb = MULT_i * (Iimpact + Igisl - ijun_s); - isb = MULT_i * (Igidl - ijun_d); - igs = MULT_i * (Igcs + Igdov); - igd = MULT_i * (Igcd + Igsov); - igb = MULT_i * Igb; - idedge = MULT_i * Idsedge; - igcs = MULT_i * Igcs; - igcd = MULT_i * Igcd; - iavl = MULT_i * Iimpact; - igisl = MULT_i * Igidl; - igidl = MULT_i * Igisl; - if (SWJUNEXP_i == 1) begin - ijsbot = 0.0; - ijsgat = 0.0; - ijssti = 0.0; - ijdbot = 0.0; - ijdgat = 0.0; - ijdsti = 0.0; - idsatsbot = 0.0; - idsatssti = 0.0; - idsatsgat = 0.0; - idsatsbotd = 0.0; - idsatsstid = 0.0; - idsatsgatd = 0.0; - end else begin - ijsbot = MULT_i * ABDRAIN_i * ijunbot_d; - ijsgat = MULT_i * LGDRAIN_i * ijungat_d; - ijssti = MULT_i * LSDRAIN_i * ijunsti_d; - ijdbot = MULT_i * ABSOURCE_i * ijunbot_s; - ijdgat = MULT_i * LGSOURCE_i * ijungat_s; - ijdsti = MULT_i * LSSOURCE_i * ijunsti_s; - idsatsbot = MULT_i * ABSOURCE_i * idsatbot; - idsatssti = MULT_i * LSSOURCE_i * idsatsti; - idsatsgat = MULT_i * LGSOURCE_i * idsatgat; - idsatsbotd = MULT_i * ABDRAIN_i * idsatbot_d; - idsatsstid = MULT_i * LSDRAIN_i * idsatsti_d; - idsatsgatd = MULT_i * LGDRAIN_i * idsatgat_d; - end - ijs = MULT_i * ijun_d; - ijd = MULT_i * ijun_s; - vds = Vds; - vgs = Vgs; - vsb = Vsb; - vto = VFB_T + P_D * facvsb0 + Gf_dc * sqrt(phit1 * facvsb0); - vts = vts_i; - vth = vth_i; - vgt = vgs - vth; - vdss = Vdsat_dc; - vsat = Vds - vdss; - ids_i = Ids + Idsedge + Iimpact + Igisl - Igcd - Igsov - ijun_s; // Total drain-current - `ifdef OPderiv - gm = CHNL_TYPE * MULT_i * ddx(ids_i, V(GP)); - gmb = CHNL_TYPE * MULT_i * ddx(ids_i, V(BP)); - gds = CHNL_TYPE * MULT_i * ddx(ids_i, V(SI)); - gjs = MULT_i * ddx(ijun_d, V(BD)); - gjd = MULT_i * ddx(ijun_s, V(BS)); - css = CHNL_TYPE * MULT_i * ddx(Qd, V(DI)); - csg = -CHNL_TYPE * MULT_i * ddx(Qd, V(GP)); - csb = -CHNL_TYPE * MULT_i * ddx(Qd, V(BP)); - csd = css - csg - csb; - cgs = -CHNL_TYPE * MULT_i * ddx(Qg, V(DI)); - cgg = CHNL_TYPE * MULT_i * ddx(Qg, V(GP)); - cgb = -CHNL_TYPE * MULT_i * ddx(Qg, V(BP)); - cgd = cgg - cgs - cgb; - cds = -CHNL_TYPE * MULT_i * ddx(Qs, V(DI)); - cdg = -CHNL_TYPE * MULT_i * ddx(Qs, V(GP)); - cdb = -CHNL_TYPE * MULT_i * ddx(Qs, V(BP)); - cdd = cdg + cds + cdb; - cbs = -CHNL_TYPE * MULT_i * ddx(Qb, V(DI)); - cbg = -CHNL_TYPE * MULT_i * ddx(Qb, V(GP)); - cbb = CHNL_TYPE * MULT_i * ddx(Qb, V(BP)); - cbd = cbb - cbs - cbg; - cgsol = CHNL_TYPE * MULT_i * ddx(Qfgd, V(GP)); - cgdol = CHNL_TYPE * MULT_i * ddx(Qfgs, V(GP)); - cjsbot = -MULT_i * CHNL_TYPE * ABDRAIN_i * ddx(qjunbot_d, V(DI)); - cjsgat = -MULT_i * CHNL_TYPE * LGDRAIN_i * ddx(qjungat_d, V(DI)); - cjssti = -MULT_i * CHNL_TYPE * LSDRAIN_i * ddx(qjunsti_d, V(DI)); - cjs = cjsbot + cjsgat + cjssti; - cjdbot = -MULT_i * CHNL_TYPE * ABSOURCE_i * ddx(qjunbot_s, V(SI)); - cjdgat = -MULT_i * CHNL_TYPE * LGSOURCE_i * ddx(qjungat_s, V(SI)); - cjdsti = -MULT_i * CHNL_TYPE * LSSOURCE_i * ddx(qjunsti_s, V(SI)); - cjd = cjdbot + cjdgat + cjdsti; - `endif // OPderiv - end else begin - ise = MULT_i * (is - Igsov + Igisl - ijun_s); - ige = MULT_i * ig; - ide = MULT_i * (id_op - Igdov + Igidl - ijun_d); - ibe = MULT_i * (ib + ijun_s + ijun_d); - ids = MULT_i * Ids; - idb = MULT_i * (Iimpact + Igidl - ijun_d); - isb = MULT_i * (Igisl - ijun_s); - igs = MULT_i * (Igcs + Igsov); - igd = MULT_i * (Igcd + Igdov); - igb = MULT_i * Igb; - idedge = MULT_i * Idsedge; - igcs = MULT_i * Igcs; - igcd = MULT_i * Igcd; - iavl = MULT_i * Iimpact; - igisl = MULT_i * Igisl; - igidl = MULT_i * Igidl; - if (SWJUNEXP_i == 1) begin - ijsbot = 0.0; - ijsgat = 0.0; - ijssti = 0.0; - ijdbot = 0.0; - ijdgat = 0.0; - ijdsti = 0.0; - idsatsbot = 0.0; - idsatssti = 0.0; - idsatsgat = 0.0; - idsatsbotd = 0.0; - idsatsstid = 0.0; - idsatsgatd = 0.0; - end else begin - ijsbot = MULT_i * ABSOURCE_i * ijunbot_s; - ijsgat = MULT_i * LGSOURCE_i * ijungat_s; - ijssti = MULT_i * LSSOURCE_i * ijunsti_s; - ijdbot = MULT_i * ABDRAIN_i * ijunbot_d; - ijdgat = MULT_i * LGDRAIN_i * ijungat_d; - ijdsti = MULT_i * LSDRAIN_i * ijunsti_d; - idsatsbot = MULT_i * ABSOURCE_i * idsatbot; - idsatssti = MULT_i * LSSOURCE_i * idsatsti; - idsatsgat = MULT_i * LGSOURCE_i * idsatgat; - idsatsbotd = MULT_i * ABDRAIN_i * idsatbot_d; - idsatsstid = MULT_i * LSDRAIN_i * idsatsti_d; - idsatsgatd = MULT_i * LGDRAIN_i * idsatgat_d; - end - ijs = MULT_i * ijun_s; - ijd = MULT_i * ijun_d; - vds = Vds; - vgs = Vgs; - vsb = Vsb; - vto = VFB_T + P_D * facvsb0 + Gf_dc * sqrt(phit1 * facvsb0); - vts = vts_i; - vth = vth_i; - vgt = vgs - vth; - vdss = Vdsat_dc; - vsat = Vds - vdss; - ids_i = Ids + Idsedge + Iimpact + Igidl - Igcd - Igdov - ijun_d; // Total drain-current - `ifdef OPderiv - gm = CHNL_TYPE * MULT_i * ddx(ids_i, V(GP)); - gmb = CHNL_TYPE * MULT_i * ddx(ids_i, V(BP)); - gds = CHNL_TYPE * MULT_i * ddx(ids_i, V(DI)); - gjs = -MULT_i * ddx(ijun_s, V(SI)); - gjd = -MULT_i * ddx(ijun_d, V(DI)); - cdd = CHNL_TYPE * MULT_i * ddx(Qd, V(DI)); - cdg = -CHNL_TYPE * MULT_i * ddx(Qd, V(GP)); - cdb = -CHNL_TYPE * MULT_i * ddx(Qd, V(BP)); - cds = cdd - cdg - cdb; - cgd = -CHNL_TYPE * MULT_i * ddx(Qg, V(DI)); - cgg = CHNL_TYPE * MULT_i * ddx(Qg, V(GP)); - cgb = -CHNL_TYPE * MULT_i * ddx(Qg, V(BP)); - cgs = cgg - cgd - cgb; - csd = -CHNL_TYPE * MULT_i * ddx(Qs, V(DI)); - csg = -CHNL_TYPE * MULT_i * ddx(Qs, V(GP)); - csb = -CHNL_TYPE * MULT_i * ddx(Qs, V(BP)); - css = csg + csd + csb; - cbd = -CHNL_TYPE * MULT_i * ddx(Qb, V(DI)); - cbg = -CHNL_TYPE * MULT_i * ddx(Qb, V(GP)); - cbb = CHNL_TYPE * MULT_i * ddx(Qb, V(BP)); - cbs = cbb - cbd - cbg; - cgsol = CHNL_TYPE * MULT_i * ddx(Qfgs, V(GP)); - cgdol = CHNL_TYPE * MULT_i * ddx(Qfgd, V(GP)); - cjsbot = -MULT_i * CHNL_TYPE * ABSOURCE_i * ddx(qjunbot_s, V(SI)); - cjsgat = -MULT_i * CHNL_TYPE * LGSOURCE_i * ddx(qjungat_s, V(SI)); - cjssti = -MULT_i * CHNL_TYPE * LSSOURCE_i * ddx(qjunsti_s, V(SI)); - cjs = cjsbot + cjsgat + cjssti; - cjdbot = -MULT_i * CHNL_TYPE * ABDRAIN_i * ddx(qjunbot_d, V(DI)); - cjdgat = -MULT_i * CHNL_TYPE * LGDRAIN_i * ddx(qjungat_d, V(DI)); - cjdsti = -MULT_i * CHNL_TYPE * LSDRAIN_i * ddx(qjunsti_d, V(DI)); - cjd = cjdbot + cjdgat + cjdsti; - `endif // OPderiv - end - weff = WE; - leff = LE; - `ifdef OPderiv - if (abs(gds) < 1.0e-18) begin - u = 0.0; - rout = 0.0; - vearly = 0.0; - end else begin - u = gm / gds; - rout = 1.0 / gds; - vearly = ide / gds; - end - if (abs(vgt) < 1.0e-12) begin - beff = 0.0; - end else begin - beff = 2.0 * abs(ide) / (vgt * vgt); - end - if (abs(cgg + cgsol + cgdol) < 1.0e-30) begin - fug = 0.0; - end else begin - fug = gm / (2.0 * `PI * (cgg + cgsol + cgdol)); - end - rg_op = RG_i / MULT_i; - sfl = MULT_i * Sfl; - if (abs(gm) < 1.0e-18) begin - sqrtsff = 0.0; - sqrtsfw = 0.0; - end else begin - sqrtsff = sqrt(MULT_i * Sfl / 1000.0) / gm; - sqrtsfw = sqrt(MULT_i) * sqid / gm; - end - sid = MULT_i * sqid * sqid; - sig = MULT_i * nt * sig1k / (1.0 + sig1k * mig); - cigid = c_igid; - if (sid == 0.0) begin - fknee = 0.0; - end else begin - fknee = sfl / sid; - end - siavl = MULT_i * shot_iavl; - if (sigVds < 0.0) begin - sigs = MULT_i * (shot_igcsx + shot_igdov); - sigd = MULT_i * (shot_igcdx + shot_igsov); - ssi = MULT_i * jnoisex_d; - sdi = MULT_i * jnoisex_s; - end else begin - sigs = MULT_i * (shot_igcsx + shot_igsov); - sigd = MULT_i * (shot_igcdx + shot_igdov); - ssi = MULT_i * jnoisex_s; - sdi = MULT_i * jnoisex_d; - end - sfledge = MULT_i * Sfledge; - sidedge = MULT_i * sqidedge; - `endif // OPderiv - - lp_vfb = VFB_T; - lp_stvfb = STVFB_i; - lp_st2vfb = ST2VFB_i; - lp_tox = TOX_i; - lp_epsrox = EPSROX_i; - lp_neff = NEFF_i; - lp_facneffac = FACNEFFAC_i; - lp_gfacnud = GFACNUD_i; - lp_vsbnud = VSBNUD_i; - lp_dvsbnud = DVSBNUD_i; - lp_vnsub = VNSUB_i; - lp_nslp = NSLP_i; - lp_dnsub = DNSUB_i; - lp_dphib = DPHIB_i; - lp_delvtac = DELVTAC_i; - lp_np = NP_i; - lp_toxov = TOXOV_i; - lp_toxovd = TOXOVD_i; - lp_nov = NOV_i; - lp_novd = NOVD_i; - lp_ct = CT_T; - lp_ctg = CTG_T; - lp_ctb = CTB_i; - lp_stct = STCT_i; - lp_cf = CF_i; - lp_cfac = CFAC_i; - lp_cfd = CFD_i; - lp_cfb = CFB_i; - lp_psce = PSCE_i; - lp_psceb = PSCEB_i; - lp_psced = PSCED_i; - lp_betn = BETN_T; - lp_stbet = STBET_i; - lp_mue = MUE_T; - lp_stmue = STMUE_i; - lp_themu = THEMU_T; - lp_stthemu = STTHEMU_i; - lp_cs = CS_T; - lp_stcs = STCS_i; - lp_thecs = THECS_T; - lp_stthecs = STTHECS_i; - lp_xcor = XCOR_T; - lp_stxcor = STXCOR_i; - lp_feta = FETA_i; - lp_rs = RS_T; - lp_strs = STRS_i; - lp_rsb = RSB_i; - lp_rsg = RSG_i; - lp_thesat = THESAT_T; - lp_thesatac = THESATAC_T; - lp_stthesat = STTHESAT_i; - lp_thesatb = THESATB_i; - lp_thesatg = THESATG_i; - lp_ax = AX_i; - lp_axac = AXAC_i; - lp_alp = ALP_i; - lp_alpac = ALPAC_i; - lp_alp1 = ALP1_i; - lp_alp2 = ALP2_i; - lp_vp = VP_i; - lp_a1 = A1_i; - lp_a2 = A2_T; - lp_sta2 = STA2_i; - lp_a3 = A3_i; - lp_a4 = A4_i; - lp_gco = GCO_i; - lp_iginv = IGINV_i; - lp_igov = IGOV_i; - lp_igovd = IGOVD_i; - lp_stig = STIG_i; - lp_gc2 = GC2_i; - lp_gc3 = GC3_i; - lp_gc2ov = GC2OV_i; - lp_gc3ov = GC3OV_i; - lp_chib = CHIB_i; - lp_agidl = AGIDL_i; - lp_agidld = AGIDLD_i; - lp_bgidl = BGIDL_T; - lp_bgidld = BGIDLD_T; - lp_stbgidl = STBGIDL_i; - lp_stbgidld = STBGIDLD_i; - lp_cgidl = CGIDL_i; - lp_cgidld = CGIDLD_i; - lp_cox = COX_i; - lp_cgov = CGOV_i; - lp_cgovd = CGOVD_i; - lp_cgbov = CGBOV_i; - lp_cfr = CFR_i; - lp_cfrd = CFRD_i; - lp_fnt = FNT_i; - lp_fntexc = FNTEXC_i; - lp_nfa = NFA_i; - lp_nfb = NFB_i; - lp_nfc = NFC_i; - lp_ef = EF_i; - lp_vfbedge = VFBEDGE_T; - lp_stvfbedge = STVFBEDGE_i; - lp_dphibedge = DPHIBEDGE_i; - lp_neffedge = NEFFEDGE_i; - lp_ctedge = CTEDGE_i; - lp_betnedge = BETNEDGE_T; - lp_stbetedge = STBETEDGE_i; - lp_psceedge = PSCEEDGE_i; - lp_pscebedge = PSCEBEDGE_i; - lp_pscededge = PSCEDEDGE_i; - lp_cfedge = CFEDGE_i; - lp_cfdedge = CFDEDGE_i; - lp_cfbedge = CFBEDGE_i; - lp_fntedge = FNTEDGE_i; - lp_nfaedge = NFAEDGE_i; - lp_nfbedge = NFBEDGE_i; - lp_nfcedge = NFCEDGE_i; - lp_efedge = EFEDGE_i; - lp_rg = RG_i; - lp_rse = RSE_i; - lp_rde = RDE_i; - lp_rbulk = RBULK_i; - lp_rwell = RWELL_i; - lp_rjuns = RJUNS_i; - lp_rjund = RJUND_i; - `ifdef SelfHeating - lp_rth = RTH_i; - lp_cth = CTH_i; - lp_strth = STRTH_i; - pdiss = MULT_i * Pdiss; - dtsh = TKD - TKA; - `endif // SelfHeating - tk = TKD; - cjosbot = MULT_i * ABSOURCE_i * cjobot; - cjossti = MULT_i * LSSOURCE_i * cjosti; - cjosgat = MULT_i * LGSOURCE_i * cjogat; - vbisbot = vbibot; - vbissti = vbisti; - vbisgat = vbigat; - cjosbotd = MULT_i * ABDRAIN_i * cjobot_d; - cjosstid = MULT_i * LSDRAIN_i * cjosti_d; - cjosgatd = MULT_i * LGDRAIN_i * cjogat_d; - vbisbotd = vbibot_d; - vbisstid = vbisti_d; - vbisgatd = vbigat_d; - `ifdef NQSmodel - lp_munqs = MUNQS_i; - `endif // NQSmodel - - end // OPinfo - - end // evaluateblock - -end // analogBlock diff --git a/src/spicelib/devices/adms/psp103/admsva/PSP103_nqs_macrodefs.include b/src/spicelib/devices/adms/psp103/admsva/PSP103_nqs_macrodefs.include deleted file mode 100644 index ddf9d2d81..000000000 --- a/src/spicelib/devices/adms/psp103/admsva/PSP103_nqs_macrodefs.include +++ /dev/null @@ -1,123 +0,0 @@ -//====================================================================================== -//====================================================================================== -// Filename: PSP103_nqs_macrodefs.include -//====================================================================================== -//====================================================================================== -// -// (c) Copyright notice -// -// Since 2015 until today, PSP has been co-developed by NXP Semiconductors and -// CEA-Leti. For this part of the model, each claim undivided ownership and copyrights -// Since 2012 until 2015, PSP has been co-developed by NXP Semiconductors and -// Delft University of Technology. For this part of the model, each claim undivided -// ownership and copyrights -// Until and including 2011, PSP has been co-developed by NXP Semiconductors and -// Arizona State University. For this part of the model, NXP Semiconductors claims -// undivided ownership and copyrights. -// -// -// Version: 103.7.0 (PSP), 200.6.0 (JUNCAP), April 2019 -// -//====================================================================================== -//====================================================================================== -// -// Further information can be found in the file releasenotesPSP103.txt -// - -////////////////////////////////////////// -// -// Macros used in PSP-NQS -// -////////////////////////////////////////// - -// Function to calculate bulk charge from surface potential -`define PhiToQb(phi,Qb_tmp) \ - if (abs(phi) <= margin_ac) \ - Qb_tmp = -0.70710678 * phi * Gf_ac * (1.0 - `oneSixth * phi * (1.0 - `oneSixth * phi)); \ - else begin \ - `expl((-phi), temp) \ - Qb_tmp = Gf_ac * sqrt(temp + phi - 1.0); \ - if (phi > margin_ac) \ - Qb_tmp = -Qb_tmp; \ - end - -// Function used in fq-macro -`define PhiTod2Qis(xphi,d2Qis) \ - if (abs(xphi) <= margin_ac) begin \ - Qb_tmp = -0.70710678 * xphi * Gf_ac * (1.0 - `oneSixth * xphi * (1.0 - `oneSixth * xphi)); \ - dQbs = -0.70710678 * Gf_ac * (1.0 - `oneThird * xphi * (1.0 - 0.25 * xphi)); \ - d2Qis = -0.235702 * Gf_ac * (1.0 - 0.5 * xphi); \ - end else begin \ - `expl((-xphi),temp) \ - Qb_tmp = Gf_ac * sqrt(temp + xphi - 1.0); \ - if (xphi > margin_ac) \ - Qb_tmp = -Qb_tmp; \ - dQbs = 0.5 * Gf_ac * Gf_ac * (1.0 - temp) / Qb_tmp; \ - d2Qis = (dQbs * dQbs - 0.5 * Gf_ac * Gf_ac) / Qb_tmp + dQbs; \ - end - - -// Function used in QiToPhi -`define sps(sp, xg) \ - if (abs(xg) <= marginp) begin \ - sp = xg / a_factrp; \ - end else begin \ - if (xg < -marginp) begin \ - NQS_yg = -xg; \ - NQS_z = 1.25 * NQS_yg / a_factrp; \ - NQS_eta = (NQS_z + 10.0 - sqrt((NQS_z - 6.0) * (NQS_z - 6.0) + 64.0)) * 0.5; \ - NQS_a = (NQS_yg - NQS_eta) * (NQS_yg - NQS_eta) + Gp2 * (NQS_eta + 1.0); \ - NQS_c = 2.0 * (NQS_yg - NQS_eta) - Gp2; \ - NQS_tau = ln(NQS_a / Gp2) - NQS_eta; \ - `sigma(NQS_a, NQS_c, NQS_tau, NQS_eta, NQS_y0) \ - `expl(NQS_y0, NQS_D0) \ - NQS_xi = 1.0 - Gp2 * NQS_D0 * 0.5; \ - NQS_p = 2.0 * (NQS_yg - NQS_y0) + Gp2 * (NQS_D0 - 1.0); \ - NQS_q = (NQS_yg - NQS_y0) * (NQS_yg - NQS_y0) + Gp2 * (NQS_y0 + 1.0 - NQS_D0); \ - NQS_temp = NQS_p * NQS_p - 4.0 * NQS_xi * NQS_q; \ - NQS_w = 2.0 * NQS_q / (NQS_p + sqrt(NQS_temp)); \ - sp = -(NQS_y0 + NQS_w); \ - end else begin \ - NQS_xg1 = 1.0 / ( 1.25 + 7.32464877560822e-01 * Gp); \ - NQS_A_fac = (1.25 * a_factrp * NQS_xg1 - 1.0) * NQS_xg1; \ - NQS_xbar = xg / a_factrp * (1.0 + NQS_A_fac * xg); \ - `expl(-NQS_xbar, NQS_temp) \ - NQS_w = 1.0 - NQS_temp; \ - NQS_x0 = xg + Gp2 * 0.5 - Gp * sqrt(xg + Gp2 * 0.25 - NQS_w); \ - `expl((-NQS_x0), NQS_D0) \ - NQS_xi = 1.0 - Gp2 * 0.5 * NQS_D0; \ - NQS_p = 2.0 * (xg - NQS_x0) + Gp2 * (1.0 - NQS_D0); \ - NQS_q = (xg - NQS_x0) * (xg - NQS_x0) - Gp2 * (NQS_x0 - 1.0 + NQS_D0); \ - NQS_temp = NQS_p * NQS_p - 4.0 * NQS_xi * NQS_q; \ - NQS_u = 2.0 * NQS_q / (NQS_p + sqrt(NQS_temp)); \ - sp = NQS_x0 + NQS_u; \ - end \ - end - - -// Function to calculate surface potential from inversion charge -`define QiToPhi(Qi,xg,xphi) \ - temp = Qi / pd + xg; \ - `sps(xphi,temp) - -// Calculation of fk -`define fq(Qi,xg,dQy,d2Qy,fk) \ - `QiToPhi(Qi, xg, xphi) \ - `PhiTod2Qis(xphi, d2Qis) \ - dQis = pd - dQbs; \ - dQis_1 = 1.0 / dQis; \ - fQi = Qi * dQis_1 - 1.0; \ - dfQi = (1.0 - Qi * d2Qis * dQis_1 * dQis_1) * dQis_1; \ - fk0 = dfQi * dQy * dQy + fQi * d2Qy; \ - dpsy2 = dQy * dQy * dQis_1 * dQis_1; \ - zsat_nqs = thesat2 * dpsy2; \ - if (CHNL_TYPE == `PMOS) \ - zsat_nqs = zsat_nqs / (1.0 + thesat1_ac * dps_ac); \ - temp = sqrt(1.0 + 2.0 * zsat_nqs); \ - Fvsat = 2.0 / (1.0 + temp); \ - temp1 = d2Qy - dpsy2 * d2Qis; \ - fk = Fvsat * (fk0 - zsat_nqs * fQi * temp1 * Fvsat / temp); - -// Interpolation of surface potential along channel -`define Phiy(y) \ - x_m_ac + H_ac * (1.0 - sqrt(1.0 - 2.0 * dps_ac / H_ac * ((y) - ym))) * inv_phit1 diff --git a/src/spicelib/devices/adms/psp103/admsva/PSP103_parlist.include b/src/spicelib/devices/adms/psp103/admsva/PSP103_parlist.include deleted file mode 100644 index 9f275723f..000000000 --- a/src/spicelib/devices/adms/psp103/admsva/PSP103_parlist.include +++ /dev/null @@ -1,916 +0,0 @@ -//====================================================================================== -//====================================================================================== -// Filename: PSP103_parlist.include -//====================================================================================== -//====================================================================================== -// -// (c) Copyright notice -// -// Since 2015 until today, PSP has been co-developed by NXP Semiconductors and -// CEA-Leti. For this part of the model, each claim undivided ownership and copyrights -// Since 2012 until 2015, PSP has been co-developed by NXP Semiconductors and -// Delft University of Technology. For this part of the model, each claim undivided -// ownership and copyrights -// Until and including 2011, PSP has been co-developed by NXP Semiconductors and -// Arizona State University. For this part of the model, NXP Semiconductors claims -// undivided ownership and copyrights. -// -// -// Version: 103.7.0 (PSP), 200.6.0 (JUNCAP), April 2019 -// -//====================================================================================== -//====================================================================================== -// -// Further information can be found in the file releasenotesPSP103.txt -// -// -------------------------------------------------------------------------------------------------------------- -// Special model parameters and switch parameters -// -------------------------------------------------------------------------------------------------------------- - -// Special model parameters, some are also simulator global variables -`MPInb(LEVEL ,103 ,"" ,"Model level") -`MPIty(TYPE ,1 ,"" ,"Channel type parameter, +1=NMOS -1=PMOS") - -`MPIty(nmos ,1 ,"" ,"MOS channel type") -`MPIty(pmos ,1 ,"" ,"MOS channel type") -`MPRco(TR ,21.0 ,"degC" ,-273.0 ,inf ,"nominal (reference) temperature") - -// Switch parameters that turn models or effects on or off -`MPIcc(SWGEO ,1 ,"" ,0 ,2 ,"Flag for geometrical model, 0=local, 1=global, 2=binning") -`MPIcc(SWIGATE ,0 ,"" ,0 ,2 ,"Flag for gate current: 0=off, 1=on, 2=on+overlaps-parameters") -`MPIcc(SWIMPACT ,0 ,"" ,0 ,1 ,"Flag for impact ionization current, 0=turn off II") -`MPIcc(SWGIDL ,0 ,"" ,0 ,1 ,"Flag for GIDL current, 0=turn off IGIDL") -`MPIcc(SWJUNCAP ,0 ,"" ,0 ,3 ,"Flag for juncap, 0=turn off juncap") -`MPIcc(SWJUNASYM ,0 ,"" ,0 ,1 ,"Flag for asymmetric junctions; 0=symmetric, 1=asymmetric") -`MPIcc(SWNUD ,0 ,"" ,0 ,2 ,"Flag for NUD-effect; 0=off, 1=on, 2=on+CV-correction") -`MPIcc(SWEDGE ,0 ,"" ,0 ,1 ,"Flag for drain current of edge transistors; 0=off, 1=on") -`MPIcc(SWDELVTAC ,0 ,"" ,0 ,1 ,"Flag for separate capacitance calculation; 0=off, 1=on") -`MPIcc(SWQSAT ,0 ,"" ,0 ,1 ,"Flag for separate capacitance calculation in saturation only: 0=off, 1=on") -`MPIcc(SWQPART ,0 ,"" ,0 ,1 ,"Flag for drain/source charge partitioning; 0=linear distribution, 1=source") -`MPIcc(SWIGN ,1 ,"" ,0 ,1 ,"Flag for induced gate noise; 0=off, 1=on") -`ifdef NQSmodel - `MPIcc(SWNQS ,0 ,"" ,0 ,9 ,"Flag for NQS, 0=off, 1, 2, 3, 5, or 9=number of collocation points") -`endif // NQSmodel -`MPRcz(QMC ,1.0 ,"" ,"Quantum-mechanical correction factor") - -// -------------------------------------------------------------------------------------------------------------- -// PSP local model parameters -// -------------------------------------------------------------------------------------------------------------- - -// Process parameters -`MPRnb(VFB ,-1.0 ,"V" ,"Flat band voltage at TR") -`MPRnb(STVFB ,5.0e-4 ,"V/K" ,"Temperature dependence of VFB") -`MPRnb(ST2VFB ,0.0 ,"K^-1" ,"Quadratic temperature dependence of VFB") -`MPRco(TOX ,2.0e-09 ,"m" ,1.0e-10 ,inf ,"Gate oxide thickness") -`MPRco(EPSROX ,3.9 ,"" ,1.0 ,inf ,"Relative permittivity of gate dielectric") -`MPRcc(NEFF ,5.0e23 ,"m^-3" ,1.0e20 ,1.0e26 ,"Effective substrate doping") -`MPRcz(FACNEFFAC ,1.0 ,"" ,"Pre-factor for effective substrate doping in separate charge calculation") -`MPRco(GFACNUD ,1.0 ,"" ,0.01 ,inf ,"Body-factor change due to NUD-effect") -`MPRcz(VSBNUD ,0.0 ,"V" ,"Lower Vsb value for NUD-effect") -`MPRco(DVSBNUD ,1.0 ,"V" ,0.1 ,inf ,"Vsb-range for NUD-effect") -`MPRnb(VNSUB ,0.0 ,"V" ,"Effective doping bias-dependence parameter") -`MPRco(NSLP ,0.05 ,"V" ,1.0e-3 ,inf ,"Effective doping bias-dependence parameter") -`MPRcc(DNSUB ,0.0 ,"V^-1" ,0.0 ,1.0 ,"Effective doping bias-dependence parameter") -`MPRnb(DPHIB ,0.0 ,"V" ,"Offset parameter for PHIB") -`MPRnb(DELVTAC ,0.0 ,"V" ,"Offset parameter for PHIB in separate charge calculation") -`MPRcz(NP ,1.0e26 ,"m^-3" ,"Gate poly-silicon doping") -`MPRco(TOXOV ,2.0e-09 ,"m" ,1.0e-10 ,inf ,"Overlap oxide thickness") -`MPRco(TOXOVD ,2.0e-09 ,"m" ,1.0e-10 ,inf ,"Overlap oxide thickness for drain side") -`MPRcc(NOV ,5.0e25 ,"m^-3" ,1.0e23 ,1.0e27 ,"Effective doping of overlap region") -`MPRcc(NOVD ,5.0e25 ,"m^-3" ,1.0e23 ,1.0e27 ,"Effective doping of overlap region for drain side") - -// Interface states parameters: PSP 103.6 -`MPRcz(CT ,0.0 ,"" ,"Interface states factor") -`MPRcz(CTG ,0.0 ,"" ,"Gate voltage dependence of interface states factor") -`MPRnb(CTB ,0.0 ,"" ,"Bulk voltage dependence of interface states factor") -`MPRnb(STCT ,1.0 ,"" ,"Geometry-independent temperature dependence of CT") - -// DIBL parameters -`MPRcz(CF ,0.0 ,"" ,"DIBL-parameter") -`MPRcz(CFAC ,0.0 ,"" ,"DIBL-parameter of charge model when SWQSAT=1") -`MPRcz(CFD ,0.0 ,"V^-1" ,"Drain voltage dependence of CF") -`MPRcc(CFB ,0.0 ,"V^-1" ,0.0 ,1.0 ,"Back bias dependence of CF") - -// Subthreshold slope parameters of short channel transistor -`MPRcz(PSCE ,0.0 ,"" ,"Subthreshold slope coefficient for short channel transistor") -`MPRcc(PSCEB ,0.0 ,"V^-1" ,0.0 ,1.0 ,"Bulk voltage dependence parameter of subthreshold slope coefficient for short channel transistor") -`MPRcz(PSCED ,0.0 ,"V^-1" ,"Drain voltage dependence parameter of subthreshold slope coefficient for short channel transistor") - -// Mobility parameters -`MPRcz(BETN ,7.0e-2 ,"m^2/V/s" ,"Channel aspect ratio times zero-field mobility") -`MPRnb(STBET ,1.0 ,"" ,"Temperature dependence of BETN") -`MPRcz(MUE ,0.5 ,"m/V" ,"Mobility reduction coefficient at TR") -`MPRnb(STMUE ,0.0 ,"" ,"Temperature dependence of MUE") -`MPRcz(THEMU ,1.5 ,"" ,"Mobility reduction exponent at TR") -`MPRnb(STTHEMU ,1.5 ,"" ,"Temperature dependence of THEMU") -`MPRcz(CS ,0.0 ,"" ,"Coulomb scattering parameter at TR") -`MPRnb(STCS ,0.0 ,"" ,"Temperature dependence of CS") -`MPRcz(THECS ,2.0 ,"" ,"Coulomb scattering exponent at TR") -`MPRnb(STTHECS ,0.0 ,"" ,"Temperature dependence of THECS") -`MPRcz(XCOR ,0.0 ,"V^-1" ,"Non-universality factor") -`MPRnb(STXCOR ,0.0 ,"" ,"Temperature dependence of XCOR") -`MPRcz(FETA ,1.0 ,"" ,"Effective field parameter") - -// Series-resistance parameters (for resistance modeling as part of intrinsic mobility reduction) -`MPRcz(RS ,30.0 ,"Ohm" ,"Series resistance at TR") -`MPRnb(STRS ,1.0 ,"" ,"Temperature dependence of RS") -`MPRcc(RSB ,0.0 ,"V^-1" ,-0.5 ,1.0 ,"Back-bias dependence of series resistance") -`MPRco(RSG ,0.0 ,"V^-1" ,-0.5 ,inf ,"Gate-bias dependence of series resistance") - -// Velocity saturation parameters -`MPRcz(THESAT ,1.0 ,"V^-1" ,"Velocity saturation parameter at TR") -`MPRcz(THESATAC ,1.0 ,"V^-1" ,"Velocity saturation parameter at TR of charge model when SWQSAT=1") -`MPRnb(STTHESAT ,1.0 ,"" ,"Temperature dependence of THESAT") -`MPRcc(THESATB ,0.0 ,"V^-1" ,-0.5 ,1.0 ,"Back-bias dependence of velocity saturation") -`MPRco(THESATG ,0.0 ,"V^-1" ,-0.5 ,inf ,"Gate-bias dependence of velocity saturation") - -// Saturation voltage parameters -`MPRco(AX ,3.0 ,"" ,2.0 ,inf ,"Linear/saturation transition factor") -`MPRco(AXAC ,3.0 ,"" ,2.0 ,inf ,"Linear/saturation transition factor of charge model when SWQSAT=1") - -// Channel length modulation (CLM) parameters -`MPRcz(ALP ,0.01 ,"" ,"CLM pre-factor") -`MPRcz(ALPAC ,0.01 ,"" ,"CLM pre-factor of charge model when SWQSAT=1") -`MPRcz(ALP1 ,0.0 ,"V" ,"CLM enhancement factor above threshold") -`MPRcz(ALP2 ,0.0 ,"V^-1" ,"CLM enhancement factor below threshold") -`MPRco(VP ,0.05 ,"V" ,1.0e-10 ,inf ,"CLM logarithm dependence factor") - -// Impact ionization (II) parameters -`MPRcz(A1 ,1.0 ,"" ,"Impact-ionization pre-factor") -`MPRcz(A2 ,10.0 ,"V" ,"Impact-ionization exponent at TR") -`MPRnb(STA2 ,0.0 ,"V" ,"Temperature dependence of A2") -`MPRcz(A3 ,1.0 ,"" ,"Saturation-voltage dependence of impact-ionization") -`MPRcz(A4 ,0.0 ,"V^-0.5" ,"Back-bias dependence of impact-ionization") - -// Gate current parameters -`MPRcc(GCO ,0.0 ,"" ,-10.0 ,10.0 ,"Gate tunnelling energy adjustment") -`MPRcz(IGINV ,0.0 ,"A" ,"Gate channel current pre-factor") -`MPRcz(IGOV ,0.0 ,"A" ,"Gate overlap current pre-factor") -`MPRcz(IGOVD ,0.0 ,"A" ,"Gate overlap current pre-factor for drain side") -`MPRnb(STIG ,2.0 ,"" ,"Temperature dependence of IGINV and IGOV") -`MPRcc(GC2 ,0.375 ,"" ,0.0 ,10.0 ,"Gate current slope factor") -`MPRcc(GC3 ,0.063 ,"" ,-2.0 ,2.0 ,"Gate current curvature factor") -`MPRcc(GC2OV ,0.375 ,"" ,0.0 ,10.0 ,"Gate overlap current slope factor, used only when SWIGATE=2") -`MPRcc(GC3OV ,0.063 ,"" ,-2.0 ,2.0 ,"Gate overlap current curvature factor, used only when SWIGATE=2") -`MPRco(CHIB ,3.1 ,"V" ,1.0 ,inf ,"Tunnelling barrier height") - -// Gate Induced Drain/Source Leakage (GIDL) parameters -`MPRcz(AGIDL ,0.0 ,"A/V^3" ,"GIDL pre-factor") -`MPRcz(AGIDLD ,0.0 ,"A/V^3" ,"GIDL pre-factor for drain side") -`MPRcz(BGIDL ,41.0 ,"V" ,"GIDL probability factor at TR") -`MPRcz(BGIDLD ,41.0 ,"V" ,"GIDL probability factor at TR for drain side") -`MPRnb(STBGIDL ,0.0 ,"V/K" ,"Temperature dependence of BGIDL") -`MPRnb(STBGIDLD ,0.0 ,"V/K" ,"Temperature dependence of BGIDL for drain side") -`MPRnb(CGIDL ,0.0 ,"" ,"Back-bias dependence of GIDL") -`MPRnb(CGIDLD ,0.0 ,"" ,"Back-bias dependence of GIDL for drain side") - -// Charge model parameters -`MPRcz(COX ,1.0e-14 ,"F" ,"Oxide capacitance for intrinsic channel") -`MPRcz(CGOV ,1.0e-15 ,"F" ,"Oxide capacitance for gate-drain/source overlap") -`MPRcz(CGOVD ,1.0e-15 ,"F" ,"Oxide capacitance for gate-drain overlap") -`MPRcz(CGBOV ,0.0 ,"F" ,"Oxide capacitance for gate-bulk overlap") -`MPRcz(CFR ,0.0 ,"F" ,"Outer fringe capacitance") -`MPRcz(CFRD ,0.0 ,"F" ,"Outer fringe capacitance for drain side") - -// Noise parameters -`MPRcz(FNT ,1.0 ,"" ,"Thermal noise coefficient") -`MPRcz(FNTEXC ,0.0 ,"" ,"Excess noise coefficient") -`MPRcz(NFA ,8.0e22 ,"V^-1/m^4" ,"First coefficient of flicker noise") -`MPRcz(NFB ,3.0e07 ,"V^-1/m^2" ,"Second coefficient of flicker noise") -`MPRcz(NFC ,0.0 ,"V^-1" ,"Third coefficient of flicker noise") -`MPRcz(EF ,1.0 ,"" ,"Flicker noise frequency exponent") - -// Edge transistor parameters: PSP 103.4 -`MPRnb(VFBEDGE ,-1.0 ,"V" ,"Flat band voltage of edge transistors at TR") -`MPRnb(STVFBEDGE ,5.0e-4 ,"V/K" ,"Temperature dependence of VFBEDGE") -`MPRnb(DPHIBEDGE ,0.0 ,"V" ,"Offset parameter for PHIB of edge transistors") -`MPRcc(NEFFEDGE ,5.0e23 ,"m^-3" ,1.0e20 ,1.0e26 ,"Effective substrate doping of edge transistors") -`MPRcz(CTEDGE ,0.0 ,"" ,"Interface states factor of edge transistors") -`MPRcz(BETNEDGE ,5.0e-4 ,"m^2/V/s" ,"Channel aspect ratio times zero-field mobility of edge transistor") -`MPRnb(STBETEDGE ,1.0 ,"" ,"Temperature dependence of BETNEDGE") -`MPRcz(PSCEEDGE ,0.0 ,"" ,"Subthreshold slope coefficient for short channel edge transistors") -`MPRcc(PSCEBEDGE ,0.0 ,"V^-1" ,0.0 ,1.0 ,"Bulk voltage dependence parameter of subthreshold slope coefficient for short channel edge transistors") -`MPRcz(PSCEDEDGE ,0.0 ,"V^-1" ,"Drain voltage dependence parameter of subthreshold slope coefficient for short channel edge transistors") -`MPRcz(CFEDGE ,0.0 ,"" ,"DIBL parameter of edge transistors") -`MPRcz(CFDEDGE ,0.0 ,"V^-1" ,"Drain voltage dependence parameter of DIBL-parameter of edge transistors") -`MPRcc(CFBEDGE ,0.0 ,"V^-1" ,0.0 ,1.0 ,"Bulk voltage dependence parameter of DIBL-parameter of edge transistors") -`MPRcz(FNTEDGE ,1.0 ,"" ,"Thermal noise coefficient of edge transistors") -`MPRcz(NFAEDGE ,8.0e22 ,"V^-1/m^4" ,"First coefficient of flicker noise of edge transistors") -`MPRcz(NFBEDGE ,3.0e07 ,"V^-1/m^2" ,"Second coefficient of flicker noise of edge transistors") -`MPRcz(NFCEDGE ,0.0 ,"V^-1" ,"Third coefficient of flicker noise of edge transistors") -`MPRcz(EFEDGE ,1.0 ,"" ,"Flicker noise frequency exponent of edge transistors") - -// NQS parameters -`ifdef NQSmodel - `MPRcz(MUNQS ,1.0 ,"" ,"Relative mobility for NQS modelling") -`endif // NQSmodel - -// Parasitic resistance parameters -`MPRcz(RG ,0.0 ,"Ohm" ,"Gate resistance") -`MPRcz(RSE ,0.0 ,"Ohm" ,"External source resistance") -`MPRcz(RDE ,0.0 ,"Ohm" ,"External drain resistance") -`MPRcz(RBULK ,0.0 ,"Ohm" ,"Bulk resistance between node BP and BI") -`MPRcz(RWELL ,0.0 ,"Ohm" ,"Well resistance between node BI and B") -`MPRcz(RJUNS ,0.0 ,"Ohm" ,"Source-side bulk resistance between node BI and BS") -`MPRcz(RJUND ,0.0 ,"Ohm" ,"Drain-side bulk resistance between node BI and BD") - -// Self heating effect parameters -`ifdef SelfHeating - `MPRcz(RTH ,0.0 ,"K/W" ,"Thermal resistance") - `MPRcz(CTH ,0.0 ,"J/K" ,"Thermal capacitance") - `MPRnb(STRTH ,0.0 ,"" ,"Temperature sensitivity of RTH") -`endif // SelfHeating - -// -------------------------------------------------------------------------------------------------------------- -// PSP global model parameters -// -------------------------------------------------------------------------------------------------------------- - -// Process Parameters -`MPRnb(LVARO ,0.0 ,"m" ,"Geom. independent difference between actual and programmed gate length") -`MPRnb(LVARL ,0.0 ,"" ,"Length dependence of LVAR") -`MPRnb(LVARW ,0.0 ,"" ,"Width dependence of LVAR") -`MPRnb(LAP ,0.0 ,"m" ,"Effective channel length reduction per side") -`MPRnb(WVARO ,0.0 ,"m" ,"Geom. independent difference between actual and programmed field-oxide opening") -`MPRnb(WVARL ,0.0 ,"" ,"Length dependence of WVAR") -`MPRnb(WVARW ,0.0 ,"" ,"Width dependence of WVAR") -`MPRnb(WOT ,0.0 ,"m" ,"Effective channel width reduction per side") -`MPRnb(DLQ ,0.0 ,"m" ,"Effective channel length reduction for CV") -`MPRnb(DWQ ,0.0 ,"m" ,"Effective channel width reduction for CV") -`MPRnb(VFBO ,-1.0 ,"V" ,"Geometry-independent flat-band voltage at TR") -`MPRnb(VFBL ,0.0 ,"V" ,"Length dependence of flat-band voltage") -`MPRnb(VFBW ,0.0 ,"V" ,"Width dependence of flat-band voltage") -`MPRnb(VFBLW ,0.0 ,"V" ,"Area dependence of flat-band voltage") -`MPRnb(STVFBO ,5.0e-4 ,"V/K" ,"Geometry-independent temperature dependence of VFB") -`MPRnb(STVFBL ,0.0 ,"V/K" ,"Length dependence of temperature dependence of VFB") -`MPRnb(STVFBW ,0.0 ,"V/K" ,"Width dependence of temperature dependence of VFB") -`MPRnb(STVFBLW ,0.0 ,"V/K" ,"Area dependence of temperature dependence of VFB") -`MPRnb(ST2VFBO ,0.0 ,"K^-1" ,"Quadratic temperature dependence of VFB") -`MPRco(TOXO ,2.0e-9 ,"m" ,1.0e-10 ,inf ,"Gate oxide thickness") -`MPRco(EPSROXO ,3.9 ,"" ,1.0 ,inf ,"Relative permittivity of gate dielectric") -`MPRco(NSUBO ,3.0e23 ,"m^-3" ,1.0e20 ,inf ,"Geometry independent substrate doping") -`MPRnb(NSUBW ,0.0 ,"" ,"Width dependence of background doping NSUBO due to segregation") -`MPRco(WSEG ,1.0e-8 ,"m" ,1.0e-10 ,inf ,"Char. length of segregation of background doping NSUBO") -`MPRcz(NPCK ,1.0e24 ,"m^-3" ,"Pocket doping level") -`MPRnb(NPCKW ,0.0 ,"" ,"Width dependence of pocket doping NPCK due to segregation") -`MPRco(WSEGP ,1.0e-8 ,"m" ,1.0e-10 ,inf ,"Char. length of segregation of pocket doping NPCK") -`MPRco(LPCK ,1.0e-8 ,"m" ,1.0e-10 ,inf ,"Char. length of lateral doping profile") -`MPRnb(LPCKW ,0.0 ,"" ,"Width dependence of char. length of lateral doping profile") -`MPRnb(FOL1 ,0.0 ,"" ,"First length dependence coefficient for short channel body effect") -`MPRnb(FOL2 ,0.0 ,"" ,"Second length dependence coefficient for short channel body effect") -`MPRnb(FACNEFFACO ,1.0 ,"" ,"Geom. independent pre-factor for effective substrate doping in separate charge calculation") -`MPRnb(FACNEFFACL ,0.0 ,"" ,"Length dependence of FACNEFFAC") -`MPRnb(FACNEFFACW ,0.0 ,"" ,"Width dependence of FACNEFFAC") -`MPRnb(FACNEFFACLW ,0.0 ,"" ,"Area dependence of FACNEFFAC") -`MPRnb(GFACNUDO ,1.0 ,"" ,"Geom. independent body-factor change due to NUD-effect") -`MPRnb(GFACNUDL ,0.0 ,"" ,"Length dependence of GFACNUD") -`MPRnb(GFACNUDLEXP ,1.0 ,"" ,"Exponent for length dependence of GFACNUD") -`MPRnb(GFACNUDW ,0.0 ,"" ,"Width dependence of GFACNUD") -`MPRnb(GFACNUDLW ,0.0 ,"" ,"Area dependence of GFACNUD") -`MPRnb(VSBNUDO ,0.0 ,"V" ,"Lower Vsb value for NUD-effect") -`MPRnb(DVSBNUDO ,1.0 ,"V" ,"Vsb range for NUD-effect") -`MPRnb(VNSUBO ,0.0 ,"V" ,"Effective doping bias-dependence parameter") -`MPRnb(NSLPO ,0.05 ,"V" ,"Effective doping bias-dependence parameter") -`MPRnb(DNSUBO ,0.0 ,"V^-1" ,"Effective doping bias-dependence parameter") -`MPRnb(DPHIBO ,0.0 ,"V" ,"Geometry independent offset of PHIB") -`MPRnb(DPHIBL ,0.0 ,"V" ,"Length dependence offset of PHIB") -`MPRnb(DPHIBLEXP ,1.0 ,"" ,"Exponent for length dependence of offset of PHIB") -`MPRnb(DPHIBW ,0.0 ,"V" ,"Width dependence of offset of PHIB") -`MPRnb(DPHIBLW ,0.0 ,"V" ,"Area dependence of offset of PHIB") -`MPRnb(DELVTACO ,0.0 ,"V" ,"Geom. independent offset parameter for PHIB in separate charge calculation") -`MPRnb(DELVTACL ,0.0 ,"V" ,"Length dependence of DELVTAC") -`MPRnb(DELVTACLEXP ,1.0 ,"" ,"Exponent for length dependence of offset of DELVTAC") -`MPRnb(DELVTACW ,0.0 ,"V" ,"Width dependence of DELVTAC") -`MPRnb(DELVTACLW ,0.0 ,"V" ,"Area dependence of DELVTAC") -`MPRnb(NPO ,1.0e26 ,"m^-3" ,"Geometry-independent gate poly-silicon doping") -`MPRnb(NPL ,0.0 ,"" ,"Length dependence of gate poly-silicon doping") -`MPRco(TOXOVO ,2.0e-9 ,"m" ,1.0e-10 ,inf ,"Overlap oxide thickness") -`MPRco(TOXOVDO ,2.0e-9 ,"m" ,1.0e-10 ,inf ,"Overlap oxide thickness for drain side") -`MPRcz(LOV ,0.0 ,"m" ,"Overlap length for gate/drain and gate/source overlap capacitance") -`MPRcz(LOVD ,0.0 ,"m" ,"Overlap length for gate/drain overlap capacitance") -`MPRnb(NOVO ,5.0e25 ,"m^-3" ,"Effective doping of overlap region") -`MPRnb(NOVDO ,5.0e25 ,"m^-3" ,"Effective doping of overlap region for drain side") - -// Interface states parameters: PSP 103.6 -`MPRnb(CTO ,0.0 ,"" ,"Geometry-independent interface states factor") -`MPRnb(CTL ,0.0 ,"" ,"Length dependence of interface states factor") -`MPRnb(CTLEXP ,1.0 ,"" ,"Exponent for length dependence of interface states factor") -`MPRnb(CTW ,0.0 ,"" ,"Width dependence of interface states factor") -`MPRnb(CTLW ,0.0 ,"" ,"Area dependence of interface states factor") -`MPRcz(CTGO ,0.0 ,"" ,"Gate voltage dependence of interface states factor") -`MPRnb(CTBO ,0.0 ,"" ,"Bulk voltage dependence of interface states factor") -`MPRnb(STCTO ,1.0 ,"" ,"Geometry-independent temperature dependence of CT") - -// DIBL Parameters -`MPRnb(CFL ,0.0 ,"" ,"Length dependence of DIBL-parameter") -`MPRnb(CFLEXP ,2.0 ,"" ,"Exponent for length dependence of CF") -`MPRnb(CFW ,0.0 ,"" ,"Width dependence of CF") -`MPRnb(CFACL ,0.0 ,"" ,"Length dependence of DIBL-parameter of charge model when SWQSAT=1") -`MPRnb(CFACLEXP ,2.0 ,"" ,"Exponent for length dependence of CF") -`MPRnb(CFACW ,0.0 ,"" ,"Width dependence of CF") -`MPRcz(CFDO ,0.0 ,"V^-1" ,"Drain voltage dependence of CF") -`MPRnb(CFBO ,0.0 ,"V^-1" ,"Back-bias dependence of CF") - -// Subthreshold slope parameters of short channel transistor -`MPRnb(PSCEL ,0.0 ,"" ,"Length dependence of subthreshold slope coefficient for short channel transistor") -`MPRnb(PSCELEXP ,2.0 ,"" ,"Exponent for length dependence of subthreshold slope coefficient for short channel transistor") -`MPRnb(PSCEW ,0.0 ,"" ,"Exponent for length dependence of subthreshold slope coefficient for short channel transistor") -`MPRcc(PSCEBO ,0.0 ,"V^-1" ,0.0 ,1.0 ,"Bulk voltage dependence parameter of subthreshold slope coefficient for short channel transistor") -`MPRcz(PSCEDO ,0.0 ,"V^-1" ,"Drain voltage dependence parameter of subthreshold slope coefficient for short channel transistor") - -// Mobility Parameters -`MPRcz(UO ,5.0e-2 ,"m^2/V/s" ,"Zero-field mobility at TR") -`MPRnb(FBET1 ,0.0 ,"" ,"Relative mobility decrease due to first lateral profile") -`MPRnb(FBET1W ,0.0 ,"" ,"Width dependence of relative mobility decrease due to first lateral profile") -`MPRco(LP1 ,1.0e-8 ,"m" ,1.0e-10 ,inf ,"Mobility-related characteristic length of first lateral profile") -`MPRnb(LP1W ,0.0 ,"" ,"Width dependence of mobility-related characteristic length of first lateral profile") -`MPRnb(FBET2 ,0.0 ,"" ,"Relative mobility decrease due to second lateral profile") -`MPRco(LP2 ,1.0e-8 ,"m" ,1.0e-10 ,inf ,"Mobility-related characteristic length of second lateral profile") -`MPRnb(BETW1 ,0.0 ,"" ,"First higher-order width scaling coefficient of BETN") -`MPRnb(BETW2 ,0.0 ,"" ,"Second higher-order width scaling coefficient of BETN") -`MPRco(WBET ,1.0e-9 ,"m" ,1.0e-10 ,inf ,"Characteristic width for width scaling of BETN") -`MPRnb(STBETO ,1.0 ,"" ,"Geometry independent temperature dependence of BETN") -`MPRnb(STBETL ,0.0 ,"" ,"Length dependence of temperature dependence of BETN") -`MPRnb(STBETW ,0.0 ,"" ,"Width dependence of temperature dependence of BETN") -`MPRnb(STBETLW ,0.0 ,"" ,"Area dependence of temperature dependence of BETN") -`MPRnb(MUEO ,0.5 ,"m/V" ,"Geometry independent mobility reduction coefficient at TR") -`MPRnb(MUEW ,0.0 ,"" ,"Width dependence of mobility reduction coefficient at TR") -`MPRnb(STMUEO ,0.0 ,"" ,"Temperature dependence of MUE") -`MPRnb(THEMUO ,1.5 ,"" ,"Mobility reduction exponent at TR") -`MPRnb(STTHEMUO ,1.5 ,"" ,"Temperature dependence of THEMU") -`MPRnb(CSO ,0.0 ,"" ,"Geometry independent coulomb scattering parameter at TR") -`MPRnb(CSL ,0.0 ,"" ,"Length dependence of CS") -`MPRnb(CSLEXP ,1.0 ,"" ,"Exponent for length dependence of CS") -`MPRnb(CSW ,0.0 ,"" ,"Width dependence of CS") -`MPRnb(CSLW ,0.0 ,"" ,"Area dependence of CS") -`MPRnb(STCSO ,0.0 ,"" ,"Temperature dependence of CS") -`MPRcz(THECSO ,2.0 ,"" ,"Coulomb scattering exponent at TR") -`MPRnb(STTHECSO ,0.0 ,"" ,"Temperature dependence of THECS") -`MPRnb(XCORO ,0.0 ,"V^-1" ,"Geometry independent non-universality parameter") -`MPRnb(XCORL ,0.0 ,"" ,"Length dependence of non-universality parameter") -`MPRnb(XCORW ,0.0 ,"" ,"Width dependence of non-universality parameter") -`MPRnb(XCORLW ,0.0 ,"" ,"Area dependence of non-universality parameter") -`MPRnb(STXCORO ,0.0 ,"" ,"Temperature dependence of XCOR") -`MPRnb(FETAO ,1.0 ,"" ,"Effective field parameter") - -// Series Resistance -`MPRnb(RSW1 ,50.0 ,"Ohm" ,"Source/drain series resistance for 1 um wide channel at TR") -`MPRnb(RSW2 ,0.0 ,"" ,"Higher-order width scaling of RS") -`MPRnb(STRSO ,1.0 ,"" ,"Temperature dependence of RS") -`MPRnb(RSBO ,0.0 ,"V^-1" ,"Back-bias dependence of series resistance") -`MPRnb(RSGO ,0.0 ,"V^-1" ,"Gate-bias dependence of series resistance") - -// Velocity Saturation -`MPRnb(THESATO ,0.0 ,"V^-1" ,"Geometry independent velocity saturation parameter at TR") -`MPRnb(THESATL ,0.05 ,"V^-1" ,"Length dependence of THESAT") -`MPRnb(THESATLEXP ,1.0 ,"" ,"Exponent for length dependence of THESAT") -`MPRnb(THESATW ,0.0 ,"" ,"Width dependence of THESAT") -`MPRnb(THESATLW ,0.0 ,"" ,"Area dependence of THESAT") -`MPRnb(THESATACO ,0.0 ,"V^-1" ,"Geometry independent velocity saturation parameter at TR of charge model when SWQSAT=1") -`MPRnb(THESATACL ,0.05 ,"V^-1" ,"Length dependence of THESATAC") -`MPRnb(THESATACLEXP ,1.0 ,"" ,"Exponent for length dependence of THESATAC") -`MPRnb(THESATACW ,0.0 ,"" ,"Width dependence of THESATAC") -`MPRnb(THESATACLW ,0.0 ,"" ,"Area dependence of THESATAC") -`MPRnb(STTHESATO ,1.0 ,"" ,"Geometry independent temperature dependence of THESAT") -`MPRnb(STTHESATL ,0.0 ,"" ,"Length dependence of temperature dependence of THESAT") -`MPRnb(STTHESATW ,0.0 ,"" ,"Width dependence of temperature dependence of THESAT") -`MPRnb(STTHESATLW ,0.0 ,"" ,"Area dependence of temperature dependence of THESAT") -`MPRnb(THESATBO ,0.0 ,"V^-1" ,"Back-bias dependence of velocity saturation") -`MPRnb(THESATGO ,0.0 ,"V^-1" ,"Gate-bias dependence of velocity saturation") - -// Saturation Voltage -`MPRnb(AXO ,18.0 ,"" ,"Geometry independent linear/saturation transition factor") -`MPRcz(AXL ,0.4 ,"" ,"Length dependence of AX") -`MPRnb(AXACO ,18.0 ,"" ,"Geometry independent linear/saturation transition factor of charge model when SWQSAT=1") -`MPRcz(AXACL ,0.4 ,"" ,"Length dependence of AXAC") - -// Channel Length Modulation -`MPRnb(ALPL ,5.0e-4 ,"" ,"Length dependence of ALP") -`MPRnb(ALPLEXP ,1.0 ,"" ,"Exponent for length dependence of ALP") -`MPRnb(ALPW ,0.0 ,"" ,"Width dependence of ALP") -`MPRnb(ALPACL ,5.0e-4 ,"" ,"Length dependence of ALPAC") -`MPRnb(ALPACLEXP ,1.0 ,"" ,"Exponent for length dependence of ALPAC") -`MPRnb(ALPACW ,0.0 ,"" ,"Width dependence of ALPAC") -`MPRnb(ALP1L1 ,0.0 ,"V" ,"Length dependence of CLM enhancement factor above threshold") -`MPRnb(ALP1LEXP ,0.5 ,"" ,"Exponent for length dependence of ALP1") -`MPRcz(ALP1L2 ,0.0 ,"" ,"Second_order length dependence of ALP1") -`MPRnb(ALP1W ,0.0 ,"" ,"Width dependence of ALP1") -`MPRnb(ALP2L1 ,0.0 ,"V^-1" ,"Length dependence of CLM enhancement factor below threshold") -`MPRnb(ALP2LEXP ,0.5 ,"" ,"Exponent for length dependence of ALP2") -`MPRcz(ALP2L2 ,0.0 ,"" ,"Second_order length dependence of ALP2") -`MPRnb(ALP2W ,0.0 ,"" ,"Width dependence of ALP2") -`MPRnb(VPO ,0.05 ,"V" ,"CLM logarithmic dependence parameter") - -// Weak-avalanche parameters -`MPRnb(A1O ,1.0 ,"" ,"Geometry independent impact-ionization pre-factor") -`MPRnb(A1L ,0.0 ,"" ,"Length dependence of A1") -`MPRnb(A1W ,0.0 ,"" ,"Width dependence of A1") -`MPRnb(A2O ,10.0 ,"V" ,"Impact-ionization exponent at TR") -`MPRnb(STA2O ,0.0 ,"V" ,"Temperature dependence of A2") -`MPRnb(A3O ,1.0 ,"" ,"Geometry independent saturation-voltage dependence of II") -`MPRnb(A3L ,0.0 ,"" ,"Length dependence of A3") -`MPRnb(A3W ,0.0 ,"" ,"Width dependence of A3") -`MPRnb(A4O ,0.0 ,"V^-0.5" ,"Geometry independent back-bias dependence of II") -`MPRnb(A4L ,0.0 ,"" ,"Length dependence of A4") -`MPRnb(A4W ,0.0 ,"" ,"Width dependence of A4") - -// Gate current parameters -`MPRnb(GCOO ,0.0 ,"" ,"Gate tunnelling energy adjustment") -`MPRnb(IGINVLW ,0.0 ,"A" ,"Gate channel current pre-factor for 1 um^2 channel area") -`MPRnb(IGOVW ,0.0 ,"A" ,"Gate overlap current pre-factor for 1 um wide channel") -`MPRnb(IGOVDW ,0.0 ,"A" ,"Gate overlap current pre-factor for 1 um wide channel for drain side") -`MPRnb(STIGO ,2.0 ,"" ,"Temperature dependence of IGINV and IGOV") -`MPRnb(GC2O ,0.375 ,"" ,"Gate current slope factor") -`MPRnb(GC3O ,0.063 ,"" ,"Gate current curvature factor") -`MPRnb(GC2OVO ,0.375 ,"" ,"Gate overlap current slope factor, used only when SWIGATE=2") -`MPRnb(GC3OVO ,0.063 ,"" ,"Gate overlap current curvature factor, used only when SWIGATE=2") -`MPRnb(CHIBO ,3.1 ,"V" ,"Tunnelling barrier height") - -// Gate-induced drain leakage parameters -`MPRnb(AGIDLW ,0.0 ,"A/V^3" ,"Width dependence of GIDL pre-factor") -`MPRnb(AGIDLDW ,0.0 ,"A/V^3" ,"Width dependence of GIDL pre-factor for drain side") -`MPRnb(BGIDLO ,41.0 ,"V" ,"GIDL probability factor at TR") -`MPRnb(BGIDLDO ,41.0 ,"V" ,"GIDL probability factor at TR for drain side") -`MPRnb(STBGIDLO ,0.0 ,"V/K" ,"Temperature dependence of BGIDL") -`MPRnb(STBGIDLDO ,0.0 ,"V/K" ,"Temperature dependence of BGIDL for drain side") -`MPRnb(CGIDLO ,0.0 ,"" ,"Back-bias dependence of GIDL") -`MPRnb(CGIDLDO ,0.0 ,"" ,"Back-bias dependence of GIDL for drain side") - -// Charge Model Parameters -`MPRnb(CGBOVL ,0.0 ,"F" ,"Oxide capacitance for gate-bulk overlap for 1 um long channel") -`MPRnb(CFRW ,0.0 ,"F" ,"Outer fringe capacitance for 1 um wide channel") -`MPRnb(CFRDW ,0.0 ,"F" ,"Outer fringe capacitance for 1 um wide channel for drain side") - -// Noise Model Parameters -`MPRnb(FNTO ,1.0 ,"" ,"Thermal noise coefficient") -`MPRcz(FNTEXCL ,0.0 ,"" ,"Length dependence coefficient of excess noise") -`MPRnb(NFALW ,8.0e22 ,"V^-1/m^4" ,"First coefficient of flicker noise for 1 um^2 channel area") -`MPRnb(NFBLW ,3.0e7 ,"V^-1/m^2" ,"Second coefficient of flicker noise for 1 um^2 channel area") -`MPRnb(NFCLW ,0.0 ,"V^-1" ,"Third coefficient of flicker noise for 1 um^2 channel area") -`MPRnb(EFO ,1.0 ,"" ,"Flicker noise frequency exponent") -`MPRnb(LINTNOI ,0.0 ,"m" ,"Length offset for flicker noise") -`MPRnb(ALPNOI ,2.0 ,"" ,"Exponent for length offset for flicker noise") - -// Edge transistor parameters: PSP 103.4 -`MPRcz(WEDGE ,1.0e-8 ,"m" ,"Electrical width of edge transistor per side") -`MPRcz(WEDGEW ,0.0 ,"" ,"Width dependence of edge WEDGE") -`MPRnb(VFBEDGEO ,-1.0 ,"V" ,"Geometry-independent flat-band voltage of edge transistors at TR") -`MPRnb(STVFBEDGEO ,5.0e-4 ,"V/K" ,"Geometry-independent temperature dependence of VFBEDGE") -`MPRnb(STVFBEDGEL ,0.0 ,"V/K" ,"Length dependence of temperature dependence of VFBEDGE") -`MPRnb(STVFBEDGEW ,0.0 ,"V/K" ,"Width dependence of temperature dependence of VFBEDGE") -`MPRnb(STVFBEDGELW ,0.0 ,"V/K" ,"Area dependence of temperature dependence of VFBEDGE") -`MPRnb(DPHIBEDGEO ,0.0 ,"V" ,"Geometry independent of edge transistor PHIB offset") -`MPRnb(DPHIBEDGEL ,0.0 ,"V" ,"Length dependence of edge transistor PHIB offset") -`MPRnb(DPHIBEDGELEXP ,1.0 ,"" ,"Exponent for length dependence of edge transistor PHIB offset") -`MPRnb(DPHIBEDGEW ,0.0 ,"V" ,"Width dependence of edge transistor PHIB offset") -`MPRnb(DPHIBEDGELW ,0.0 ,"V" ,"Area dependence of edge transistor PHIB offset") -`MPRco(NSUBEDGEO ,5.0e23 ,"m^-3" ,1.0e20 ,inf ,"Geometry independent substrate doping of edge transistors") -`MPRnb(NSUBEDGEL ,0.0 ,"" ,"Length dependence of edge transistor substrate doping") -`MPRnb(NSUBEDGELEXP ,1.0 ,"" ,"Exponent for length dependence of edge transistor substrate doping") -`MPRnb(NSUBEDGEW ,0.0 ,"" ,"Width dependence of edge transistor substrate doping") -`MPRnb(NSUBEDGELW ,0.0 ,"" ,"Area dependence of edge transistor substrate doping") -`MPRnb(CTEDGEO ,0.0 ,"" ,"Geometry-independent interface states factor of edge transistors") -`MPRnb(CTEDGEL ,0.0 ,"" ,"Length dependence of interface states factor of edge transistors") -`MPRnb(CTEDGELEXP ,1.0 ,"" ,"Exponent for length dependence of interface states factor of edge transistors") -`MPRnb(FBETEDGE ,0.0 ,"" ,"Length dependence of edge transistor mobility") -`MPRco(LPEDGE ,1.0e-8 ,"m" ,1.0e-10 ,inf ,"Exponent for length dependence of edge transistor mobility") -`MPRnb(BETEDGEW ,0.0 ,"" ,"Width scaling coefficient of edge transistor mobility") -`MPRnb(STBETEDGEO ,1.0 ,"" ,"Geometry independent temperature dependence of BETNEDGE") -`MPRnb(STBETEDGEL ,0.0 ,"" ,"Length dependence of temperature dependence of BETNEDGE") -`MPRnb(STBETEDGEW ,0.0 ,"" ,"Width dependence of temperature dependence of BETNEDGE") -`MPRnb(STBETEDGELW ,0.0 ,"" ,"Area dependence of temperature dependence of BETNEDGE") -`MPRnb(PSCEEDGEL ,0.0 ,"" ,"Length dependence of subthreshold slope coefficient for short channel edge transistors") -`MPRnb(PSCEEDGELEXP ,2.0 ,"" ,"Exponent for length dependence of subthreshold slope coefficient for short channel edge transistors") -`MPRnb(PSCEEDGEW ,0.0 ,"" ,"Exponent for length dependence of subthreshold slope coefficient for short channel edge transistor") -`MPRcc(PSCEBEDGEO ,0.0 ,"V^-1" ,0.0 ,1.0 ,"Bulk voltage dependence parameter of subthreshold slope coefficient for short channel edge transistors") -`MPRcz(PSCEDEDGEO ,0.0 ,"V^-1" ,"Drain voltage dependence parameter of subthreshold slope coefficient for short channel edge transistors") -`MPRnb(CFEDGEL ,0.0 ,"" ,"Length dependence of DIBL-parameter of edge transistors") -`MPRnb(CFEDGELEXP ,2.0 ,"" ,"Exponent for length dependence of DIBL-parameter of edge transistors") -`MPRnb(CFEDGEW ,0.0 ,"" ,"Width dependence of DIBL-parameter of edge transistors") -`MPRcz(CFDEDGEO ,0.0 ,"V^-1" ,"Drain voltage dependence parameter of DIBL-parameter of edge transistors") -`MPRcc(CFBEDGEO ,0.0 ,"V^-1" ,0.0 ,1.0 ,"Bulk voltage dependence parameter of DIBL-parameter of edge transistors") -`MPRnb(FNTEDGEO ,1.0 ,"" ,"Thermal noise coefficient") -`MPRnb(NFAEDGELW ,8.0e22 ,"V^-1/m^4" ,"First coefficient of flicker noise for 1 um^2 channel area") -`MPRnb(NFBEDGELW ,3.0e7 ,"V^-1/m^2" ,"Second coefficient of flicker noise for 1 um^2 channel area") -`MPRnb(NFCEDGELW ,0.0 ,"V^-1" ,"Third coefficient of flicker noise for 1 um^2 channel area") -`MPRnb(EFEDGEO ,1.0 ,"" ,"Flicker noise frequency exponent") - -// Well proximity effect Parameters -`MPRnb(KVTHOWEO ,0.0 ,"" ,"Geometrical independent threshold shift parameter") -`MPRnb(KVTHOWEL ,0.0 ,"" ,"Length dependent threshold shift parameter") -`MPRnb(KVTHOWEW ,0.0 ,"" ,"Width dependent threshold shift parameter") -`MPRnb(KVTHOWELW ,0.0 ,"" ,"Area dependent threshold shift parameter") -`MPRnb(KUOWEO ,0.0 ,"" ,"Geometrical independent mobility degradation factor") -`MPRnb(KUOWEL ,0.0 ,"" ,"Length dependent mobility degradation factor") -`MPRnb(KUOWEW ,0.0 ,"" ,"Width dependent mobility degradation factor") -`MPRnb(KUOWELW ,0.0 ,"" ,"Area dependent mobility degradation factor") - -// -------------------------------------------------------------------------------------------------------------- -// PSP global model parameters (binning) -// -------------------------------------------------------------------------------------------------------------- - -// Process parameters -`MPRnb(POVFB ,-1.0 ,"V" ,"Coefficient for the geometry independent part of VFB") -`MPRnb(PLVFB ,0.0 ,"V" ,"Coefficient for the length dependence of VFB") -`MPRnb(PWVFB ,0.0 ,"V" ,"Coefficient for the width dependence of VFB") -`MPRnb(PLWVFB ,0.0 ,"V" ,"Coefficient for the length times width dependence of VFB") -`MPRnb(POSTVFB ,5.0e-4 ,"V/K" ,"Coefficient for the geometry independent part of STVFB") -`MPRnb(PLSTVFB ,0.0 ,"V/K" ,"Coefficient for the length dependence of STVFB") -`MPRnb(PWSTVFB ,0.0 ,"V/K" ,"Coefficient for the width dependence of STVFB") -`MPRnb(PLWSTVFB ,0.0 ,"V/K" ,"Coefficient for the length times width dependence of STVFB") -`MPRnb(POST2VFB ,0.0 ,"K^-1" ,"Coefficient for the geometry independent part of ST2VFB") -`MPRnb(POTOX ,2.0e-9 ,"m" ,"Coefficient for the geometry independent part of TOX") -`MPRnb(POEPSROX ,3.9 ,"" ,"Coefficient for the geometry independent part of EPSOX") -`MPRnb(PONEFF ,5.0e23 ,"m^-3" ,"Coefficient for the geometry independent part of NEFF") -`MPRnb(PLNEFF ,0.0 ,"m^-3" ,"Coefficient for the length dependence of NEFF") -`MPRnb(PWNEFF ,0.0 ,"m^-3" ,"Coefficient for the width dependence of NEFF") -`MPRnb(PLWNEFF ,0.0 ,"m^-3" ,"Coefficient for the length times width dependence of NEFF") -`MPRnb(POFACNEFFAC ,1.0 ,"" ,"Coefficient for the geometry independent part of FACNEFFAC") -`MPRnb(PLFACNEFFAC ,0.0 ,"" ,"Coefficient for the length dependence of FACNEFFAC") -`MPRnb(PWFACNEFFAC ,0.0 ,"" ,"Coefficient for the width dependence of FACNEFFAC") -`MPRnb(PLWFACNEFFAC ,0.0 ,"" ,"Coefficient for the length times width dependence of FACNEFFAC") -`MPRnb(POGFACNUD ,1.0 ,"" ,"Coefficient for the geometry independent part of GFACNUD") -`MPRnb(PLGFACNUD ,0.0 ,"" ,"Coefficient for the length dependence of GFACNUD") -`MPRnb(PWGFACNUD ,0.0 ,"" ,"Coefficient for the width dependence of GFACNUD") -`MPRnb(PLWGFACNUD ,0.0 ,"" ,"Coefficient for the length times width dependence of GFACNUD") -`MPRnb(POVSBNUD ,0.0 ,"V" ,"Coefficient for the geometry independent part of VSBNUD") -`MPRnb(PODVSBNUD ,1.0 ,"V" ,"Coefficient for the geometry independent part of DVSBNUD") -`MPRnb(POVNSUB ,0.0 ,"V" ,"Coefficient for the geometry independent part of VNSUB") -`MPRnb(PONSLP ,0.05 ,"V" ,"Coefficient for the geometry independent part of NSLP") -`MPRnb(PODNSUB ,0.0 ,"V^-1" ,"Coefficient for the geometry independent part of DNSUB") -`MPRnb(PODPHIB ,0.0 ,"V" ,"Coefficient for the geometry independent part of DPHIB") -`MPRnb(PLDPHIB ,0.0 ,"V" ,"Coefficient for the length dependence of DPHIB") -`MPRnb(PWDPHIB ,0.0 ,"V" ,"Coefficient for the width dependence of DPHIB") -`MPRnb(PLWDPHIB ,0.0 ,"V" ,"Coefficient for the length times width dependence of DPHIB") -`MPRnb(PODELVTAC ,0.0 ,"V" ,"Coefficient for the geometry independent part of DELVTAC") -`MPRnb(PLDELVTAC ,0.0 ,"V" ,"Coefficient for the length dependence of DELVTAC") -`MPRnb(PWDELVTAC ,0.0 ,"V" ,"Coefficient for the width dependence of DELVTAC") -`MPRnb(PLWDELVTAC ,0.0 ,"V" ,"Coefficient for the length times width dependence of DELVTAC") -`MPRnb(PONP ,1.0e26 ,"m^-3" ,"Coefficient for the geometry independent part of NP") -`MPRnb(PLNP ,0.0 ,"m^-3" ,"Coefficient for the length dependence of NP") -`MPRnb(PWNP ,0.0 ,"m^-3" ,"Coefficient for the width dependence of NP") -`MPRnb(PLWNP ,0.0 ,"m^-3" ,"Coefficient for the length times width dependence of NP") -`MPRnb(POTOXOV ,2.0e-09 ,"m" ,"Coefficient for the geometry independent part of TOXOV") -`MPRnb(POTOXOVD ,2.0e-09 ,"m" ,"Coefficient for the geometry independent part of TOXOV for drain side") -`MPRnb(PONOV ,5.0e25 ,"m^-3" ,"Coefficient for the geometry independent part of NOV") -`MPRnb(PLNOV ,0.0 ,"m^-3" ,"Coefficient for the length dependence of NOV") -`MPRnb(PWNOV ,0.0 ,"m^-3" ,"Coefficient for the width dependence of NOV") -`MPRnb(PLWNOV ,0.0 ,"m^-3" ,"Coefficient for the length times width dependence of NOV") -`MPRnb(PONOVD ,5.0e25 ,"m^-3" ,"Coefficient for the geometry independent part of NOV for drain side") -`MPRnb(PLNOVD ,0.0 ,"m^-3" ,"Coefficient for the length dependence of NOV for drain side") -`MPRnb(PWNOVD ,0.0 ,"m^-3" ,"Coefficient for the width dependence of NOV for drain side") -`MPRnb(PLWNOVD ,0.0 ,"m^-3" ,"Coefficient for the length times width dependence of NOV for drain side") - -// Interface states parameters -`MPRnb(POCT ,0.0 ,"" ,"Coefficient for the geometry independent part of CT") -`MPRnb(PLCT ,0.0 ,"" ,"Coefficient for the length dependence of CT") -`MPRnb(PWCT ,0.0 ,"" ,"Coefficient for the width dependence of CT") -`MPRnb(PLWCT ,0.0 ,"" ,"Coefficient for the length times width dependence of CT") -`MPRnb(POCTG ,0.0 ,"" ,"Coefficient for the geometry independent part of CTG") -`MPRnb(POCTB ,0.0 ,"" ,"Coefficient for the geometry independent part of CTB") -`MPRnb(POSTCT ,1.0 ,"" ,"Coefficient for the geometry independent part of STCT") - -// DIBL parameters -`MPRnb(POCF ,0.0 ,"" ,"Coefficient for the geometry independent part of CF") -`MPRnb(PLCF ,0.0 ,"" ,"Coefficient for the length dependence of CF") -`MPRnb(PWCF ,0.0 ,"" ,"Coefficient for the width dependence of CF") -`MPRnb(PLWCF ,0.0 ,"" ,"Coefficient for the length times width dependence of CF") -`MPRnb(POCFAC ,0.0 ,"" ,"Coefficient for the geometry independent part of CFAC") -`MPRnb(PLCFAC ,0.0 ,"" ,"Coefficient for the length dependence of CFAC") -`MPRnb(PWCFAC ,0.0 ,"" ,"Coefficient for the width dependence of CFAC") -`MPRnb(PLWCFAC ,0.0 ,"" ,"Coefficient for the length times width dependence of CFAC") -`MPRnb(POCFD ,0.0 ,"V^-1" ,"Coefficient for the geometry independent part of CFD") -`MPRnb(POCFB ,0.0 ,"V^-1" ,"Coefficient for the geometry independent part of CFB") - -// Subthreshold slope parameters of short channel transistor -`MPRnb(POPSCE ,0.0 ,"" ,"Coefficient for the geometry independent part of PSCE") -`MPRnb(PLPSCE ,0.0 ,"" ,"Coefficient for the length dependence of PSCE") -`MPRnb(PWPSCE ,0.0 ,"" ,"Coefficient for the width dependence of PSCE") -`MPRnb(PLWPSCE ,0.0 ,"" ,"Coefficient for the length times width dependence of PSCE") -`MPRnb(POPSCEB ,0.0 ,"V^-1" ,"Coefficient for the geometry independent part of PSCEB") -`MPRnb(POPSCED ,0.0 ,"V^-1" ,"Coefficient for the geometry independent part of PSCED") - -// Mobility parameters -`MPRnb(POBETN ,7.0e-2 ,"m^2/V/s" ,"Coefficient for the geometry independent part of BETN") -`MPRnb(PLBETN ,0.0 ,"m^2/V/s" ,"Coefficient for the length dependence of BETN") -`MPRnb(PWBETN ,0.0 ,"m^2/V/s" ,"Coefficient for the width dependence of BETN") -`MPRnb(PLWBETN ,0.0 ,"m^2/V/s" ,"Coefficient for the length times width dependence of BETN") -`MPRnb(POSTBET ,1.0 ,"" ,"Coefficient for the geometry independent part of STBET") -`MPRnb(PLSTBET ,0.0 ,"" ,"Coefficient for the length dependence of STBET") -`MPRnb(PWSTBET ,0.0 ,"" ,"Coefficient for the width dependence of STBET") -`MPRnb(PLWSTBET ,0.0 ,"" ,"Coefficient for the length times width dependence of STBET") -`MPRnb(POMUE ,0.5 ,"m/V" ,"Coefficient for the geometry independent part of MUE") -`MPRnb(PLMUE ,0.0 ,"m/V" ,"Coefficient for the length dependence of MUE") -`MPRnb(PWMUE ,0.0 ,"m/V" ,"Coefficient for the width dependence of MUE") -`MPRnb(PLWMUE ,0.0 ,"m/V" ,"Coefficient for the length times width dependence of MUE") -`MPRnb(POSTMUE ,0.0 ,"" ,"Coefficient for the geometry independent part of STMUE") -`MPRnb(POTHEMU ,1.5 ,"" ,"Coefficient for the geometry independent part of THEMU") -`MPRnb(POSTTHEMU ,1.5 ,"" ,"Coefficient for the geometry independent part of STTHEMU") -`MPRnb(POCS ,0.0 ,"" ,"Coefficient for the geometry independent part of CS") -`MPRnb(PLCS ,0.0 ,"" ,"Coefficient for the length dependence of CS") -`MPRnb(PWCS ,0.0 ,"" ,"Coefficient for the width dependence of CS") -`MPRnb(PLWCS ,0.0 ,"" ,"Coefficient for the length times width dependence of CS") -`MPRnb(POSTCS ,0.0 ,"" ,"Coefficient for the geometry independent part of STCS") -`MPRnb(POTHECS ,2.0 ,"" ,"Coefficient for the geometry independent part of THECS") -`MPRnb(POSTTHECS ,0.0 ,"" ,"Coefficient for the geometry independent part of STHTECS") -`MPRnb(POXCOR ,0.0 ,"V^-1" ,"Coefficient for the geometry independent part of XCOR") -`MPRnb(PLXCOR ,0.0 ,"V^-1" ,"Coefficient for the length dependence of XCOR") -`MPRnb(PWXCOR ,0.0 ,"V^-1" ,"Coefficient for the width dependence of XCOR") -`MPRnb(PLWXCOR ,0.0 ,"V^-1" ,"Coefficient for the length times width dependence of XCOR") -`MPRnb(POSTXCOR ,0.0 ,"" ,"Coefficient for the geometry independent part of STXCOR") -`MPRnb(POFETA ,1.0 ,"" ,"Coefficient for the geometry independent part of FETA") - -// Series resistance parameters -`MPRnb(PORS ,30.0 ,"Ohm" ,"Coefficient for the geometry independent part of RS") -`MPRnb(PLRS ,0.0 ,"Ohm" ,"Coefficient for the length dependence of RS") -`MPRnb(PWRS ,0.0 ,"Ohm" ,"Coefficient for the width dependence of RS") -`MPRnb(PLWRS ,0.0 ,"Ohm" ,"Coefficient for the length times width dependence of RS") -`MPRnb(POSTRS ,1.0 ,"" ,"Coefficient for the geometry independent part of STRS") -`MPRnb(PORSB ,0.0 ,"V^-1" ,"Coefficient for the geometry independent part of RSB") -`MPRnb(PORSG ,0.0 ,"V^-1" ,"Coefficient for the geometry independent part of RSG") - -// Velocity saturation parameters -`MPRnb(POTHESAT ,1.0 ,"V^-1" ,"Coefficient for the geometry independent part of THESAT") -`MPRnb(PLTHESAT ,0.0 ,"V^-1" ,"Coefficient for the length dependence of THESAT") -`MPRnb(PWTHESAT ,0.0 ,"V^-1" ,"Coefficient for the width dependence of THESAT") -`MPRnb(PLWTHESAT ,0.0 ,"V^-1" ,"Coefficient for the length times width dependence of THESAT") -`MPRnb(POTHESATAC ,1.0 ,"V^-1" ,"Coefficient for the geometry independent part of THESATAC") -`MPRnb(PLTHESATAC ,0.0 ,"V^-1" ,"Coefficient for the length dependence of THESATAC") -`MPRnb(PWTHESATAC ,0.0 ,"V^-1" ,"Coefficient for the width dependence of THESATAC") -`MPRnb(PLWTHESATAC ,0.0 ,"V^-1" ,"Coefficient for the length times width dependence of THESATAC") -`MPRnb(POSTTHESAT ,1.0 ,"" ,"Coefficient for the geometry independent part of STTHESAT") -`MPRnb(PLSTTHESAT ,0.0 ,"" ,"Coefficient for the length dependence of STTHESAT") -`MPRnb(PWSTTHESAT ,0.0 ,"" ,"Coefficient for the width dependence of STTHESAT") -`MPRnb(PLWSTTHESAT ,0.0 ,"" ,"Coefficient for the length times width dependence of STTHESAT") -`MPRnb(POTHESATB ,0.0 ,"V^-1" ,"Coefficient for the geometry independent part of THESATB") -`MPRnb(PLTHESATB ,0.0 ,"V^-1" ,"Coefficient for the length dependence of THESATB") -`MPRnb(PWTHESATB ,0.0 ,"V^-1" ,"Coefficient for the width dependence of THESATB") -`MPRnb(PLWTHESATB ,0.0 ,"V^-1" ,"Coefficient for the length times width dependence of THESATB") -`MPRnb(POTHESATG ,0.0 ,"V^-1" ,"Coefficient for the geometry independent part of THESATG") -`MPRnb(PLTHESATG ,0.0 ,"V^-1" ,"Coefficient for the length dependence of THESATG") -`MPRnb(PWTHESATG ,0.0 ,"V^-1" ,"Coefficient for the width dependence of THESATG") -`MPRnb(PLWTHESATG ,0.0 ,"V^-1" ,"Coefficient for the length times width dependence of THESATG") - -// Saturation voltage parameters -`MPRnb(POAX ,3.0 ,"" ,"Coefficient for the geometry independent part of AX") -`MPRnb(PLAX ,0.0 ,"" ,"Coefficient for the length dependence of AX") -`MPRnb(PWAX ,0.0 ,"" ,"Coefficient for the width dependence of AX") -`MPRnb(PLWAX ,0.0 ,"" ,"Coefficient for the length times width dependence of AX") -`MPRnb(POAXAC ,3.0 ,"" ,"Coefficient for the geometry independent part of AXAC") -`MPRnb(PLAXAC ,0.0 ,"" ,"Coefficient for the length dependence of AXAC") -`MPRnb(PWAXAC ,0.0 ,"" ,"Coefficient for the width dependence of AXAC") -`MPRnb(PLWAXAC ,0.0 ,"" ,"Coefficient for the length times width dependence of AXAC") - -// Channel length modulation (CLM) parameters -`MPRnb(POALP ,1.0e-2 ,"" ,"Coefficient for the geometry independent part of ALP") -`MPRnb(PLALP ,0.0 ,"" ,"Coefficient for the length dependence of ALP") -`MPRnb(PWALP ,0.0 ,"" ,"Coefficient for the width dependence of ALP") -`MPRnb(PLWALP ,0.0 ,"" ,"Coefficient for the length times width dependence of ALP") -`MPRnb(POALPAC ,1.0e-2 ,"" ,"Coefficient for the geometry independent part of ALPAC") -`MPRnb(PLALPAC ,0.0 ,"" ,"Coefficient for the length dependence of ALPAC") -`MPRnb(PWALPAC ,0.0 ,"" ,"Coefficient for the width dependence of ALPAC") -`MPRnb(PLWALPAC ,0.0 ,"" ,"Coefficient for the length times width dependence of ALPAC") -`MPRnb(POALP1 ,0.0 ,"V" ,"Coefficient for the geometry independent part of ALP1") -`MPRnb(PLALP1 ,0.0 ,"V" ,"Coefficient for the length dependence of ALP1") -`MPRnb(PWALP1 ,0.0 ,"V" ,"Coefficient for the width dependence of ALP1") -`MPRnb(PLWALP1 ,0.0 ,"V" ,"Coefficient for the length times width dependence of ALP1") -`MPRnb(POALP2 ,0.0 ,"V^-1" ,"Coefficient for the geometry independent part of ALP2") -`MPRnb(PLALP2 ,0.0 ,"V^-1" ,"Coefficient for the length dependence of ALP2") -`MPRnb(PWALP2 ,0.0 ,"V^-1" ,"Coefficient for the width dependence of ALP2") -`MPRnb(PLWALP2 ,0.0 ,"V^-1" ,"Coefficient for the length times width dependence of ALP2") -`MPRnb(POVP ,0.05 ,"V" ,"Coefficient for the geometry independent part of VP") - -// Impact ionization parameters -`MPRnb(POA1 ,1.0 ,"" ,"Coefficient for the geometry independent part of A1") -`MPRnb(PLA1 ,0.0 ,"" ,"Coefficient for the length dependence of A1") -`MPRnb(PWA1 ,0.0 ,"" ,"Coefficient for the width dependence of A1") -`MPRnb(PLWA1 ,0.0 ,"" ,"Coefficient for the length times width dependence of A1") -`MPRnb(POA2 ,10.0 ,"V" ,"Coefficient for the geometry independent part of A2") -`MPRnb(POSTA2 ,0.0 ,"V" ,"Coefficient for the geometry independent part of STA2") -`MPRnb(POA3 ,1.0 ,"" ,"Coefficient for the geometry independent part of A3") -`MPRnb(PLA3 ,0.0 ,"" ,"Coefficient for the length dependence of A3") -`MPRnb(PWA3 ,0.0 ,"" ,"Coefficient for the width dependence of A3") -`MPRnb(PLWA3 ,0.0 ,"" ,"Coefficient for the length times width dependence of A3") -`MPRnb(POA4 ,0.0 ,"V^-0.5" ,"Coefficient for the geometry independent part of A4") -`MPRnb(PLA4 ,0.0 ,"V^-0.5" ,"Coefficient for the length dependence of A4") -`MPRnb(PWA4 ,0.0 ,"V^-0.5" ,"Coefficient for the width dependence of A4") -`MPRnb(PLWA4 ,0.0 ,"V^-0.5" ,"Coefficient for the length times width dependence of A4") -`MPRnb(POGCO ,0.0 ,"" ,"Coefficient for the geometry independent part of GCO") - -// Gate current parameters -`MPRnb(POIGINV ,0.0 ,"A" ,"Coefficient for the geometry independent part of IGINV") -`MPRnb(PLIGINV ,0.0 ,"A" ,"Coefficient for the length dependence of IGINV") -`MPRnb(PWIGINV ,0.0 ,"A" ,"Coefficient for the width dependence of IGINV") -`MPRnb(PLWIGINV ,0.0 ,"A" ,"Coefficient for the length times width dependence of IGINV") -`MPRnb(POIGOV ,0.0 ,"A" ,"Coefficient for the geometry independent part of IGOV") -`MPRnb(PLIGOV ,0.0 ,"A" ,"Coefficient for the length dependence of IGOV") -`MPRnb(PWIGOV ,0.0 ,"A" ,"Coefficient for the width dependence of IGOV") -`MPRnb(PLWIGOV ,0.0 ,"A" ,"Coefficient for the length times width dependence of IGOV") -`MPRnb(POIGOVD ,0.0 ,"A" ,"Coefficient for the geometry independent part of IGOV for drain side") -`MPRnb(PLIGOVD ,0.0 ,"A" ,"Coefficient for the length dependence of IGOV for drain side") -`MPRnb(PWIGOVD ,0.0 ,"A" ,"Coefficient for the width dependence of IGOV for drain side") -`MPRnb(PLWIGOVD ,0.0 ,"A" ,"Coefficient for the length times width dependence of IGOV for drain side") -`MPRnb(POSTIG ,2.0 ,"" ,"Coefficient for the geometry independent part of STIG") -`MPRnb(POGC2 ,0.375 ,"" ,"Coefficient for the geometry independent part of GC2") -`MPRnb(POGC3 ,0.063 ,"" ,"Coefficient for the geometry independent part of GC3") -`MPRnb(POGC2OV ,0.375 ,"" ,"Coefficient for the geometry independent part of GC2OV, used only when SWIGATE=2") -`MPRnb(POGC3OV ,0.063 ,"" ,"Coefficient for the geometry independent part of GC3OV, used only when SWIGATE=2") -`MPRnb(POCHIB ,3.1 ,"V" ,"Coefficient for the geometry independent part of CHIB") - -// Gate-induced drain leakage (GIDL) parameters -`MPRnb(POAGIDL ,0.0 ,"A/V^3" ,"Coefficient for the geometry independent part of AGIDL") -`MPRnb(PLAGIDL ,0.0 ,"A/V^3" ,"Coefficient for the length dependence of AGIDL") -`MPRnb(PWAGIDL ,0.0 ,"A/V^3" ,"Coefficient for the width dependence of AGIDL") -`MPRnb(PLWAGIDL ,0.0 ,"A/V^3" ,"Coefficient for the length times width dependence of AGIDL") -`MPRnb(POAGIDLD ,0.0 ,"A/V^3" ,"Coefficient for the geometry independent part of AGIDL for drain side") -`MPRnb(PLAGIDLD ,0.0 ,"A/V^3" ,"Coefficient for the length dependence of AGIDL for drain side") -`MPRnb(PWAGIDLD ,0.0 ,"A/V^3" ,"Coefficient for the width dependence of AGIDL for drain side") -`MPRnb(PLWAGIDLD ,0.0 ,"A/V^3" ,"Coefficient for the length times width dependence of AGIDL for drain side") -`MPRnb(POBGIDL ,41.0 ,"V" ,"Coefficient for the geometry independent part of BGIDL") -`MPRnb(POBGIDLD ,41.0 ,"V" ,"Coefficient for the geometry independent part of BGIDL for drain side") -`MPRnb(POSTBGIDL ,0.0 ,"V/K" ,"Coefficient for the geometry independent part of STBGIDL") -`MPRnb(POSTBGIDLD ,0.0 ,"V/K" ,"Coefficient for the geometry independent part of STBGIDL for drain side") -`MPRnb(POCGIDL ,0.0 ,"" ,"Coefficient for the geometry independent part of CGIDL") -`MPRnb(POCGIDLD ,0.0 ,"" ,"Coefficient for the geometry independent part of CGIDL for drain side") - -// Charge model parameters -`MPRnb(POCOX ,1.0e-14 ,"F" ,"Coefficient for the geometry independent part of COX") -`MPRnb(PLCOX ,0.0 ,"F" ,"Coefficient for the length dependence of COX") -`MPRnb(PWCOX ,0.0 ,"F" ,"Coefficient for the width dependence of COX") -`MPRnb(PLWCOX ,0.0 ,"F" ,"Coefficient for the length times width dependence of COX") -`MPRnb(POCGOV ,1.0e-15 ,"F" ,"Coefficient for the geometry independent part of CGOV") -`MPRnb(PLCGOV ,0.0 ,"F" ,"Coefficient for the length dependence of CGOV") -`MPRnb(PWCGOV ,0.0 ,"F" ,"Coefficient for the width dependence of CGOV") -`MPRnb(PLWCGOV ,0.0 ,"F" ,"Coefficient for the length times width dependence of CGOV") -`MPRnb(POCGOVD ,1.0e-15 ,"F" ,"Coefficient for the geometry independent part of CGOV for drain side") -`MPRnb(PLCGOVD ,0.0 ,"F" ,"Coefficient for the length dependence of CGOV for drain side") -`MPRnb(PWCGOVD ,0.0 ,"F" ,"Coefficient for the width dependence of CGOV for drain side") -`MPRnb(PLWCGOVD ,0.0 ,"F" ,"Coefficient for the length times width dependence of CGOV for drain side") -`MPRnb(POCGBOV ,0.0 ,"F" ,"Coefficient for the geometry independent part of CGBOV") -`MPRnb(PLCGBOV ,0.0 ,"F" ,"Coefficient for the length dependence of CGBOV") -`MPRnb(PWCGBOV ,0.0 ,"F" ,"Coefficient for the width dependence of CGBOV") -`MPRnb(PLWCGBOV ,0.0 ,"F" ,"Coefficient for the length times width dependence of CGBOV") -`MPRnb(POCFR ,0.0 ,"F" ,"Coefficient for the geometry independent part of CFR") -`MPRnb(PLCFR ,0.0 ,"F" ,"Coefficient for the length dependence of CFR") -`MPRnb(PWCFR ,0.0 ,"F" ,"Coefficient for the width dependence of CFR") -`MPRnb(PLWCFR ,0.0 ,"F" ,"Coefficient for the length times width dependence of CFR") -`MPRnb(POCFRD ,0.0 ,"F" ,"Coefficient for the geometry independent part of CFR for drain side") -`MPRnb(PLCFRD ,0.0 ,"F" ,"Coefficient for the length dependence of CFR for drain side") -`MPRnb(PWCFRD ,0.0 ,"F" ,"Coefficient for the width dependence of CFR for drain side") -`MPRnb(PLWCFRD ,0.0 ,"F" ,"Coefficient for the length times width dependence of CFR for drain side") - -// Noise model parameters -`MPRnb(POFNT ,1.0 ,"" ,"Coefficient for the geometry independent part of FNT") -`MPRnb(POFNTEXC ,0.0 ,"" ,"Coefficient for the geometry independent part of FNTEXC") -`MPRnb(PLFNTEXC ,0.0 ,"" ,"Coefficient for the length dependence of FNTEXC") -`MPRnb(PWFNTEXC ,0.0 ,"" ,"Coefficient for the width dependence of FNTEXC") -`MPRnb(PLWFNTEXC ,0.0 ,"" ,"Coefficient for the length times width dependence of FNTEXC") -`MPRnb(PONFA ,8.0e22 ,"V^-1/m^4" ,"Coefficient for the geometry independent part of NFA") -`MPRnb(PLNFA ,0.0 ,"V^-1/m^4" ,"Coefficient for the length dependence of NFA") -`MPRnb(PWNFA ,0.0 ,"V^-1/m^4" ,"Coefficient for the width dependence of NFA") -`MPRnb(PLWNFA ,0.0 ,"V^-1/m^4" ,"Coefficient for the length times width dependence of NFA") -`MPRnb(PONFB ,3.0e7 ,"V^-1/m^2" ,"Coefficient for the geometry independent part of NFB") -`MPRnb(PLNFB ,0.0 ,"V^-1/m^2" ,"Coefficient for the length dependence of NFB") -`MPRnb(PWNFB ,0.0 ,"V^-1/m^2" ,"Coefficient for the width dependence of NFB") -`MPRnb(PLWNFB ,0.0 ,"V^-1/m^2" ,"Coefficient for the length times width dependence of NFB") -`MPRnb(PONFC ,0.0 ,"V^-1" ,"Coefficient for the geometry independent part of NFC") -`MPRnb(PLNFC ,0.0 ,"V^-1" ,"Coefficient for the length dependence of NFC") -`MPRnb(PWNFC ,0.0 ,"V^-1" ,"Coefficient for the width dependence of NFC") -`MPRnb(PLWNFC ,0.0 ,"V^-1" ,"Coefficient for the length times width dependence of NFC") -`MPRnb(POEF ,1.0 ,"" ,"Coefficient for the flicker noise frequency exponent") - -// Edge transistor parameters: PSP 103.4 -`MPRnb(POVFBEDGE ,-1.0 ,"V" ,"Coefficient for the geometry independent part of VFBEDGE") -`MPRnb(POSTVFBEDGE ,0.0 ,"V/K" ,"Coefficient for the geometry independent part of STVFBEDGE") -`MPRnb(PLSTVFBEDGE ,0.0 ,"V/K" ,"Coefficient for the length dependence of STVFBEDGE") -`MPRnb(PWSTVFBEDGE ,0.0 ,"V/K" ,"Coefficient for the width dependence of STVFBEDGE") -`MPRnb(PLWSTVFBEDGE ,0.0 ,"V/K" ,"Coefficient for the length times width dependence of STVFBEDGE") -`MPRnb(PODPHIBEDGE ,0.0 ,"V" ,"Coefficient for the geometry independent part of DPHIBEDGE") -`MPRnb(PLDPHIBEDGE ,0.0 ,"V" ,"Coefficient for the length dependence of DPHIBEDGE") -`MPRnb(PWDPHIBEDGE ,0.0 ,"V" ,"Coefficient for the width dependence of DPHIBEDGE") -`MPRnb(PLWDPHIBEDGE ,0.0 ,"V" ,"Coefficient for the length times width dependence of DPHIBEDGE") -`MPRnb(PONEFFEDGE ,5.0e23 ,"m^-3" ,"Coefficient for the geometry independent part of NEFFEDGE") -`MPRnb(PLNEFFEDGE ,0.0 ,"m^-3" ,"Coefficient for the length dependence of NEFFEDGE") -`MPRnb(PWNEFFEDGE ,0.0 ,"m^-3" ,"Coefficient for the width dependence of NEFFEDGE") -`MPRnb(PLWNEFFEDGE ,0.0 ,"m^-3" ,"Coefficient for the length times width dependence of NEFFEDGE") -`MPRnb(POCTEDGE ,0.0 ,"" ,"Coefficient for the geometry independent part of CTEDGE") -`MPRnb(PLCTEDGE ,0.0 ,"" ,"Coefficient for the length dependence of CTEDGE") -`MPRnb(PWCTEDGE ,0.0 ,"" ,"Coefficient for the width dependence of CTEDGE") -`MPRnb(PLWCTEDGE ,0.0 ,"" ,"Coefficient for the length times width dependence of CTEDGE") -`MPRnb(POBETNEDGE ,5.0e-4 ,"m^2/V/s" ,"Coefficient for the geometry independent part of BETNEDGE") -`MPRnb(PLBETNEDGE ,0.0 ,"m^2/V/s" ,"Coefficient for the length dependence of BETNEDGE") -`MPRnb(PWBETNEDGE ,0.0 ,"m^2/V/s" ,"Coefficient for the width dependence of BETNEDGE") -`MPRnb(PLWBETNEDGE ,0.0 ,"m^2/V/s" ,"Coefficient for the length times width dependence of BETNEDGE") -`MPRnb(POSTBETEDGE ,1.0 ,"" ,"Coefficient for the geometry independent part of STBETEDGE") -`MPRnb(PLSTBETEDGE ,0.0 ,"" ,"Coefficient for the length dependence of STBETEDGE") -`MPRnb(PWSTBETEDGE ,0.0 ,"" ,"Coefficient for the width dependence of STBETEDGE") -`MPRnb(PLWSTBETEDGE ,0.0 ,"" ,"Coefficient for the length times width dependence of STBETEDGE") -`MPRnb(POPSCEEDGE ,0.0 ,"" ,"Coefficient for the geometry independent part of PSCEEDGE") -`MPRnb(PLPSCEEDGE ,0.0 ,"" ,"Coefficient for the length dependence of PSCEEDGE") -`MPRnb(PWPSCEEDGE ,0.0 ,"" ,"Coefficient for the width dependence of PSCEEDGE") -`MPRnb(PLWPSCEEDGE ,0.0 ,"" ,"Coefficient for the length times width dependence of PSCEEDGE") -`MPRnb(POPSCEBEDGE ,0.0 ,"V^-1" ,"Coefficient for the geometry independent part of PSCEBEDGE") -`MPRnb(POPSCEDEDGE ,0.0 ,"V^-1" ,"Coefficient for the geometry independent part of PSCEDEDGE") -`MPRnb(POCFEDGE ,0.0 ,"" ,"Coefficient for the geometry independent part of CFEDGE") -`MPRnb(PLCFEDGE ,0.0 ,"" ,"Coefficient for the length dependence of CFEDGE") -`MPRnb(PWCFEDGE ,0.0 ,"" ,"Coefficient for the width dependence of CFEDGE") -`MPRnb(PLWCFEDGE ,0.0 ,"" ,"Coefficient for the length times width dependence of CFEDGE") -`MPRnb(POCFDEDGE ,0.0 ,"V^-1" ,"Coefficient for the geometry independent part of CFDEDGE") -`MPRnb(POCFBEDGE ,0.0 ,"V^-1" ,"Coefficient for the geometry independent part of CFBEDGE") -`MPRnb(POFNTEDGE ,1.0 ,"" ,"Coefficient for the geometry independent part of FNTEDGE") -`MPRnb(PONFAEDGE ,8.0e22 ,"V^-1/m^4" ,"Coefficient for the geometry independent part of NFAEDGE") -`MPRnb(PLNFAEDGE ,0.0 ,"V^-1/m^4" ,"Coefficient for the length dependence of NFAEDGE") -`MPRnb(PWNFAEDGE ,0.0 ,"V^-1/m^4" ,"Coefficient for the width dependence of NFAEDGE") -`MPRnb(PLWNFAEDGE ,0.0 ,"V^-1/m^4" ,"Coefficient for the length times width dependence of NFAEDGE") -`MPRnb(PONFBEDGE ,3.0e7 ,"V^-1/m^2" ,"Coefficient for the geometry independent part of NFBEDGE") -`MPRnb(PLNFBEDGE ,0.0 ,"V^-1/m^2" ,"Coefficient for the length dependence of NFBEDGE") -`MPRnb(PWNFBEDGE ,0.0 ,"V^-1/m^2" ,"Coefficient for the width dependence of NFBEDGE") -`MPRnb(PLWNFBEDGE ,0.0 ,"V^-1/m^2" ,"Coefficient for the length times width dependence of NFBEDGE") -`MPRnb(PONFCEDGE ,0.0 ,"V^-1" ,"Coefficient for the geometry independent part of NFCEDGE") -`MPRnb(PLNFCEDGE ,0.0 ,"V^-1" ,"Coefficient for the length dependence of NFCEDGE") -`MPRnb(PWNFCEDGE ,0.0 ,"V^-1" ,"Coefficient for the width dependence of NFCEDGE") -`MPRnb(PLWNFCEDGE ,0.0 ,"V^-1" ,"Coefficient for the length times width dependence of NFCEDGE") -`MPRnb(POEFEDGE ,1.0 ,"" ,"Coefficient for the geometry independent part of EFEDGE") - -// Well proximity effect parameters -`MPRnb(POKVTHOWE ,0.0 ,"" ,"Coefficient for the geometry independent part of KVTHOWE") -`MPRnb(PLKVTHOWE ,0.0 ,"" ,"Coefficient for the length dependence part of KVTHOWE") -`MPRnb(PWKVTHOWE ,0.0 ,"" ,"Coefficient for the width dependence part of KVTHOWE") -`MPRnb(PLWKVTHOWE ,0.0 ,"" ,"Coefficient for the length times width dependence part of KVTHOWE") -`MPRnb(POKUOWE ,0.0 ,"" ,"Coefficient for the geometry independent part of KUOWE") -`MPRnb(PLKUOWE ,0.0 ,"" ,"Coefficient for the length dependence part of KUOWE") -`MPRnb(PWKUOWE ,0.0 ,"" ,"Coefficient for the width dependence part of KUOWE") -`MPRnb(PLWKUOWE ,0.0 ,"" ,"Coefficient for the length times width dependence part of KUOWE") - -// `Dummy' parameters for binning-set labeling -`MPRnb(LMIN ,0 ,"m" ,"Dummy parameter to label binning set") -`MPRnb(LMAX ,1.0 ,"m" ,"Dummy parameter to label binning set") -`MPRnb(WMIN ,0.0 ,"m" ,"Dummy parameter to label binning set") -`MPRnb(WMAX ,1.0 ,"m" ,"Dummy parameter to label binning set") - -// -------------------------------------------------------------------------------------------------------------- -// Parameters that occur in both global and binning model -// -------------------------------------------------------------------------------------------------------------- - -// NQS parameters -`ifdef NQSmodel - `MPRnb(MUNQSO ,1.0 ,"" ,"Relative mobility for NQS modelling") -`endif // NQSmodel - -// Parasitic resistance parameters -`MPRnb(RGO ,0.0 ,"Ohm" ,"Gate resistance") -`MPRcz(RINT ,0.0 ,"Ohm m^2" ,"Contact resistance between silicide and ploy") -`MPRcz(RVPOLY ,0.0 ,"Ohm m^2" ,"Vertical poly resistance") -`MPRcz(RSHG ,0.0 ,"Ohm/sq" ,"Gate electrode diffusion sheet resistance") -`MPRnb(DLSIL ,0.0 ,"m" ,"Silicide extension over the physical gate length") -`MPRnb(RSH ,0.0 ,"Ohm/sq" ,"Sheet resistance of source diffusion") -`MPRnb(RSHD ,0.0 ,"Ohm/sq" ,"Sheet resistance of drain diffusion") -`MPRnb(RBULKO ,0.0 ,"Ohm" ,"Bulk resistance between node BP and BI") -`MPRnb(RWELLO ,0.0 ,"Ohm" ,"Well resistance between node BI and B") -`MPRnb(RJUNSO ,0.0 ,"Ohm" ,"Source-side bulk resistance between node BI and BS") -`MPRnb(RJUNDO ,0.0 ,"Ohm" ,"Drain-side bulk resistance between node BI and BD") - -// Self heating effect parameters -`ifdef SelfHeating - `MPRnb(RTHO ,0.0 ,"K/W" ,"Geometry independent part of thermal resistance") - `MPRnb(RTHW1 ,0.0 ,"K/W" ,"Width dependence of thermal resistance") - `MPRnb(RTHW2 ,0.0 ,"" ,"Offset in width dependence of thermal resistance") - `MPRnb(RTHLW ,0.0 ,"" ,"Length-correction to width dependence of thermal resistance") - `MPRnb(CTHO ,0.0 ,"J/K" ,"Geometry independent part of thermal capacitance") - `MPRnb(CTHW1 ,0.0 ,"J/K" ,"Width dependence of thermal capacitance") - `MPRnb(CTHW2 ,0.0 ,"" ,"Offset in width dependence of thermal capacitance") - `MPRnb(CTHLW ,0.0 ,"" ,"Length-correction to width dependence of thermal capacitance") - `MPRnb(STRTHO ,0.0 ,"" ,"Temperature sensitivity of RTH") -`endif // SelfHeating - -// Stress Model Parameters -`MPRcc(SAREF ,1.0e-6 ,"m" ,1.0e-9 ,inf ,"Reference distance between OD-edge and poly from one side") -`MPRcc(SBREF ,1.0e-6 ,"m" ,1.0e-9 ,inf ,"Reference distance between OD-edge and poly from other side") -`MPRnb(WLOD ,0.0 ,"m" ,"Width parameter") -`MPRnb(KUO ,0.0 ,"m" ,"Mobility degradation/enhancement coefficient") -`MPRcc(KVSAT ,0.0 ,"m" ,-1.0 ,1.0 ,"Saturation velocity degradation/enhancement coefficient") -`MPRcc(KVSATAC ,0.0 ,"m" ,-1.0 ,1.0 ,"Saturation velocity degradation/enhancement coefficient of charge model when SWQSAT=1") -`MPRnb(TKUO ,0.0 ,"" ,"Temperature dependence of KUO") -`MPRnb(LKUO ,0.0 ,"m^LLODKUO" ,"Length dependence of KUO") -`MPRnb(WKUO ,0.0 ,"m^WLODKUO" ,"Width dependence of KUO") -`MPRnb(PKUO ,0.0 ,"m^(LLODKUO+WLODKUO)" ,"Cross-term dependence of KUO") -`MPRcz(LLODKUO ,0.0 ,"" ,"Length parameter for UO stress effect") -`MPRcz(WLODKUO ,0.0 ,"" ,"Width parameter for UO stress effect") -`MPRnb(KVTHO ,0.0 ,"Vm" ,"Threshold shift parameter") -`MPRnb(LKVTHO ,0.0 ,"m^LLODVTH" ,"Length dependence of KVTHO") -`MPRnb(WKVTHO ,0.0 ,"m^WLODVTH" ,"Width dependence of KVTHO") -`MPRnb(PKVTHO ,0.0 ,"m^(LLODVTH+WLODVTH)" ,"Cross-term dependence of KVTHO") -`MPRcz(LLODVTH ,0.0 ,"" ,"Length parameter for VTH-stress effect") -`MPRcz(WLODVTH ,0.0 ,"" ,"Width parameter for VTH-stress effect") -`MPRnb(STETAO ,0.0 ,"m" ,"Eta0 shift factor related to VTHO change") -`MPRcz(LODETAO ,1.0 ,"" ,"Eta0 shift modification factor for stress effect") - -// Well proximity effect Parameters -`MPRcz(SCREF ,1.0e-6 ,"m" ,"Distance between OD-edge and well edge of a reference device") -`MPRnb(WEB ,0.0 ,"" ,"Coefficient for SCB") -`MPRnb(WEC ,0.0 ,"" ,"Coefficient for SCC") - -// -------------------------------------------------------------------------------------------------------------- -// Other Parameters -// -------------------------------------------------------------------------------------------------------------- -`MPRnb(DTA ,0.0 ,"K" ,"Temperature offset w.r.t. ambient temperature") - diff --git a/src/spicelib/devices/adms/psp103/admsva/PSP103_scaling.include b/src/spicelib/devices/adms/psp103/admsva/PSP103_scaling.include deleted file mode 100644 index b588dfe43..000000000 --- a/src/spicelib/devices/adms/psp103/admsva/PSP103_scaling.include +++ /dev/null @@ -1,773 +0,0 @@ -//====================================================================================== -//====================================================================================== -// Filename: PSP103_scaling.include -//====================================================================================== -//====================================================================================== -// -// (c) Copyright notice -// -// Since 2015 until today, PSP has been co-developed by NXP Semiconductors and -// CEA-Leti. For this part of the model, each claim undivided ownership and copyrights -// Since 2012 until 2015, PSP has been co-developed by NXP Semiconductors and -// Delft University of Technology. For this part of the model, each claim undivided -// ownership and copyrights -// Until and including 2011, PSP has been co-developed by NXP Semiconductors and -// Arizona State University. For this part of the model, NXP Semiconductors claims -// undivided ownership and copyrights. -// -// -// Version: 103.7.0 (PSP), 200.6.0 (JUNCAP), April 2019 -// -//====================================================================================== -//====================================================================================== -// -// Further information can be found in the file releasenotesPSP103.txt -// - -// Transistor geometry -iL = `LEN / L_i; -iW = `WEN / W_i; -delLPS = LVARO * (1.0 + LVARL * iL) * (1.0 + LVARW * iW); -delWOD = WVARO * (1.0 + WVARL * iL) * (1.0 + WVARW * iW); -if (SWGEO_i == 2) begin - delLPS = LVARO * (1.0 + LVARL * iL); - delWOD = WVARO * (1.0 + WVARW * iW); -end -LE = `CLIP_LOW(L_i + delLPS - 2.0 * LAP, 1.0e-9); -WE = `CLIP_LOW(W_i + delWOD - 2.0 * WOT, 1.0e-9); -LEcv = `CLIP_LOW(L_i + delLPS - 2.0 * LAP + DLQ, 1.0e-9); -WEcv = `CLIP_LOW(W_i + delWOD - 2.0 * WOT + DWQ, 1.0e-9); -Lcv = `CLIP_LOW(L_i + delLPS + DLQ, 1.0e-9); -Wcv = `CLIP_LOW(W_i + delWOD + DWQ, 1.0e-9); -iLE = `LEN / LE; -iWE = `WEN / WE; - -// Geometry for multi-finger devices -L_f = `CLIP_LOW(L_i + delLPS, 1.0e-9); -L_slif = `CLIP_LOW(L_f + DLSIL, 1.0e-9); -W_f = `CLIP_LOW(W_i + delWOD, 1.0e-9); -XGWE = `CLIP_LOW(XGW_i - 0.5 * delWOD, 1.0e-9); - -// Local model parameters -VFB_p = VFB; -STVFB_p = STVFB; -ST2VFB_p = ST2VFB; -TOX_p = TOX; -EPSROX_p = EPSROX; -NEFF_p = NEFF; -FACNEFFAC_p = FACNEFFAC; -GFACNUD_p = GFACNUD; -VSBNUD_p = VSBNUD; -DVSBNUD_p = DVSBNUD; -VNSUB_p = VNSUB; -NSLP_p = NSLP; -DNSUB_p = DNSUB; -DPHIB_p = DPHIB; -DELVTAC_p = DELVTAC; -NP_p = NP; -TOXOV_p = TOXOV; -TOXOVD_p = TOXOVD; -NOV_p = NOV; -NOVD_p = NOVD; -CT_p = CT; -CTG_p = CTG; -CTB_p = CTB; -STCT_p = STCT; -PSCE_p = PSCE; -PSCED_p = PSCED; -PSCEB_p = PSCEB; -CF_p = CF; -`DefACparam(CFAC_p, CF, CFAC) -CFD_p = CFD; -CFB_p = CFB; -BETN_p = BETN; -STBET_p = STBET; -MUE_p = MUE; -STMUE_p = STMUE; -THEMU_p = THEMU; -STTHEMU_p = STTHEMU; -CS_p = CS; -STCS_p = STCS; -THECS_p = THECS; -STTHECS_p = STTHECS; -XCOR_p = XCOR; -STXCOR_p = STXCOR; -FETA_p = FETA; -RS_p = RS; -STRS_p = STRS; -RSB_p = RSB; -RSG_p = RSG; -THESAT_p = THESAT; -`DefACparam(THESATAC_p, THESAT, THESATAC) -STTHESAT_p = STTHESAT; -THESATB_p = THESATB; -THESATG_p = THESATG; -AX_p = AX; -`DefACparam(AXAC_p, AX, AXAC) -ALP_p = ALP; -`DefACparam(ALPAC_p, ALP, ALPAC) -ALP1_p = ALP1; -ALP2_p = ALP2; -VP_p = VP; -A1_p = A1; -A2_p = A2; -STA2_p = STA2; -A3_p = A3; -A4_p = A4; -GCO_p = GCO; -IGINV_p = IGINV; -IGOV_p = IGOV; -IGOVD_p = IGOVD; -STIG_p = STIG; -GC2_p = GC2; -GC3_p = GC3; -GC2OV_p = GC2OV; -GC3OV_p = GC3OV; -CHIB_p = CHIB; -AGIDL_p = AGIDL; -AGIDLD_p = AGIDLD; -BGIDL_p = BGIDL; -BGIDLD_p = BGIDLD; -STBGIDL_p = STBGIDL; -STBGIDLD_p = STBGIDLD; -CGIDL_p = CGIDL; -CGIDLD_p = CGIDLD; -COX_p = COX; -CGOV_p = CGOV; -CGOVD_p = CGOVD; -CGBOV_p = CGBOV; -CFR_p = CFR; -CFRD_p = CFRD; -FNT_p = FNT; -FNTEXC_p = FNTEXC; -NFA_p = NFA; -NFB_p = NFB; -NFC_p = NFC; -EF_p = EF; -VFBEDGE_p = VFBEDGE; -STVFBEDGE_p = STVFBEDGE; -DPHIBEDGE_p = DPHIBEDGE; -NEFFEDGE_p = NEFFEDGE; -CTEDGE_p = CTEDGE; -BETNEDGE_p = BETNEDGE; -STBETEDGE_p = STBETEDGE; -PSCEEDGE_p = PSCEEDGE; -PSCEBEDGE_p = PSCEBEDGE; -PSCEDEDGE_p = PSCEDEDGE; -CFEDGE_p = CFEDGE; -CFDEDGE_p = CFDEDGE; -CFBEDGE_p = CFBEDGE; -FNTEDGE_p = FNTEDGE; -NFAEDGE_p = NFAEDGE; -NFBEDGE_p = NFBEDGE; -NFCEDGE_p = NFCEDGE; -EFEDGE_p = EFEDGE; -RG_p = RG; -RSE_p = RSE; -RDE_p = RDE; -RWELL_p = RWELL; -RBULK_p = RBULK; -RJUNS_p = RJUNS; -RJUND_p = RJUND; -`ifdef SelfHeating - RTH_p = RTH; - CTH_p = CTH; - STRTH_p = STRTH; -`endif // SelfHeating -`ifdef NQSmodel - MUNQS_p = MUNQS; -`endif // NQSmodel - -// Geometry scaling with physical scaling rules -if (SWGEO_i == 1) begin - // Process parameters - VFB_p = VFBO + VFBL * iLE + VFBW * iWE + VFBLW * iLE * iWE; - STVFB_p = STVFBO + STVFBL * iLE + STVFBW * iWE + STVFBLW * iLE * iWE; - ST2VFB_p = ST2VFBO; - TOX_p = TOXO; - EPSROX_p = EPSROXO; - NSUB0e = NSUBO_i * `MAX(( 1.0 + NSUBW * iWE * ln( 1.0 + WE / WSEG_i )), 1.0e-03); - NPCKe = NPCK_i * `MAX(( 1.0 + NPCKW * iWE * ln( 1.0 + WE / WSEGP_i )), 1.0e-03); - LPCKe = LPCK_i * `MAX(( 1.0 + LPCKW * iWE * ln( 1.0 + WE / WSEGP_i )), 1.0e-03); - if (LE > (2.0 * LPCKe)) begin - AA = 7.5e10; - BB = sqrt(NSUB0e + 0.5 * NPCKe) - sqrt(NSUB0e); - NSUB = sqrt(NSUB0e) + AA * ln(1.0 + 2.0 * LPCKe / LE * (exp(BB / AA) - 1.0)); - NSUB = NSUB * NSUB; - end else begin - if (LE >= LPCKe) begin - NSUB = NSUB0e + NPCKe * LPCKe / LE; - end else begin // LE < LPCK - NSUB = NSUB0e + NPCKe * (2.0 - LE / LPCKe); - end - end - NEFF_p = NSUB * (1.0 - FOL1 * iLE - FOL2 * iLE * iLE); - FACNEFFAC_p = FACNEFFACO + FACNEFFACL * iLE + FACNEFFACW * iWE + FACNEFFACLW * iLE * iWE; - GFACNUD_p = GFACNUDO + GFACNUDL * pow(iLE, GFACNUDLEXP) + GFACNUDW * iWE + GFACNUDLW * iLE * iWE; - VSBNUD_p = VSBNUDO; - DVSBNUD_p = DVSBNUDO; - VNSUB_p = VNSUBO; - NSLP_p = NSLPO; - DNSUB_p = DNSUBO; - DPHIB_p = DPHIBO + DPHIBL * pow(iLE, DPHIBLEXP) + DPHIBW * iWE + DPHIBLW * iLE * iWE; - DELVTAC_p = DELVTACO + DELVTACL * pow(iLE, DELVTACLEXP) + DELVTACW * iWE + DELVTACLW * iLE * iWE; - NP_p = NPO * `MAX(1.0e-6, (1.0 + NPL * iLE)); - TOXOV_p = TOXOVO; - TOXOVD_p = TOXOVDO; - NOV_p = NOVO; - NOVD_p = NOVDO; - - // Interface states parameters - CT_p = (CTO + CTL * pow(iLE, CTLEXP)) * (1.0 + CTW * iWE) * (1.0 + CTLW * iLE * iWE); - CTG_p = CTGO; - CTB_p = CTBO; - STCT_p = STCTO; - - // DIBL parameters - CF_p = CFL * pow(iLE, CFLEXP) * (1.0 + CFW * iWE); - CFAC_p = CFACL_i * pow(iLE, CFACLEXP_i) * (1.0 + CFACW_i * iWE); - CFD_p = CFDO; - CFB_p = CFBO; - - // Subthreshold slope parameters of short channel transistor - PSCE_p = PSCEL * pow(iLE, PSCELEXP) * (1.0 + PSCEW * iWE); - PSCED_p = PSCEDO; - PSCEB_p = PSCEBO; - - // Mobility parameters - FBET1e = FBET1 * (1.0 + FBET1W * iWE); - LP1e = LP1_i * `MAX(1.0 + LP1W * iWE, 1.0e-03); - GPE = 1.0 + FBET1e * LP1e / LE * (1.0 - exp(-LE / LP1e)) + FBET2 * LP2_i / LE * (1.0 - exp(-LE / LP2_i)); - GPE = `MAX(GPE, 1.0e-15); - GWE = 1.0 + BETW1 * iWE + BETW2 * iWE * ln(1.0 + WE / WBET_i); - BETN_p = UO * WE / (GPE * LE) * GWE; - STBET_p = STBETO + STBETL * iLE + STBETW * iWE + STBETLW * iLE * iWE; - MUE_p = MUEO * (1.0 + MUEW * iWE); - STMUE_p = STMUEO; - THEMU_p = THEMUO; - STTHEMU_p = STTHEMUO; - CS_p = (CSO + CSL * pow(iLE, CSLEXP)) * (1.0 + CSW * iWE) * (1.0 + CSLW * iLE * iWE); - STCS_p = STCSO; - THECS_p = THECSO; - STTHECS_p = STTHECSO; - XCOR_p = XCORO * (1.0 + XCORL * iLE) * (1.0 + XCORW * iWE) * (1.0 + XCORLW * iLE * iWE); - STXCOR_p = STXCORO; - FETA_p = FETAO; - - // Series resistance - RS_p = RSW1 * iWE * (1.0 + RSW2 * iWE); - STRS_p = STRSO; - RSB_p = RSBO; - RSG_p = RSGO; - - // Velocity saturation - THESAT_p = (THESATO + THESATL * GWE / GPE * pow(iLE, THESATLEXP)) * (1.0 + THESATW * iWE) * (1.0 + THESATLW * iLE * iWE); - THESATAC_p = (THESATACO_i + THESATACL_i * GWE / GPE * pow(iLE, THESATACLEXP_i)) * (1.0 + THESATACW_i * iWE) * (1.0 + THESATACLW_i * iLE * iWE); - STTHESAT_p = STTHESATO + STTHESATL * iLE + STTHESATW * iWE + STTHESATLW * iLE * iWE; - THESATB_p = THESATBO; - THESATG_p = THESATGO; - - // Saturation voltage - AX_p = AXO / (1.0 + AXL_i * iLE); - AXAC_p = AXACO_i / (1.0 + AXACL_i * iLE); - - // Channel length modulation - ALP_p = ALPL * pow(iLE, ALPLEXP) * (1.0 + ALPW * iWE); - ALPAC_p = ALPACL_i * pow(iLE, ALPACLEXP_i) * (1.0 + ALPACW_i * iWE); - tmpx = pow(iLE, ALP1LEXP); - ALP1_p = ALP1L1 * tmpx * (1.0 + ALP1W * iWE) / (1.0 + ALP1L2_i * iLE * tmpx); - tmpx = pow(iLE, ALP2LEXP); - ALP2_p = ALP2L1 * tmpx * (1.0 + ALP2W * iWE) / (1.0 + ALP2L2_i * iLE * tmpx); - VP_p = VPO; - - // Impact ionization - A1_p = A1O * (1.0 + A1L * iLE) * (1.0 + A1W * iWE); - A2_p = A2O; - STA2_p = STA2O; - A3_p = A3O * (1.0 + A3L * iLE) * (1.0 + A3W * iWE); - A4_p = A4O * (1.0 + A4L * iLE) * (1.0 + A4W * iWE); - - // Gate current - GCO_p = GCOO; - IGINV_p = IGINVLW / (iWE * iLE); - IGOV_p = IGOVW * LOV_i / (`LEN * iWE); - IGOVD_p = IGOVDW * LOVD_i / (`LEN * iWE); - STIG_p = STIGO; - GC2_p = GC2O; - GC3_p = GC3O; - GC2OV_p = GC2OVO; - GC3OV_p = GC3OVO; - CHIB_p = CHIBO; - - // GIDL - AGIDL_p = AGIDLW * LOV_i / (`LEN * iWE); - AGIDLD_p = AGIDLDW * LOVD_i / (`LEN * iWE); - BGIDL_p = BGIDLO; - BGIDLD_p = BGIDLDO; - STBGIDL_p = STBGIDLO; - STBGIDLD_p = STBGIDLDO; - CGIDL_p = CGIDLO; - CGIDLD_p = CGIDLDO; - - // Charge model parameters - COX_p = `EPSO * EPSROXO_i * WEcv * LEcv / TOXO_i; - CGOV_p = `EPSO * EPSROXO_i * WEcv * LOV_i / TOXOVO_i; - CGOVD_p = `EPSO * EPSROXO_i * WEcv * LOVD_i / TOXOVDO_i; - CGBOV_p = CGBOVL * Lcv / `LEN; - CFR_p = CFRW * Wcv / `WEN; - CFRD_p = CFRDW * Wcv / `WEN; - - // Noise model parameters - temp0 = 1.0 - 2.0 * LINTNOI * iLE / `LEN; - Lnoi = `MAX(temp0, 1.0e-3); - Lred = 1.0 / pow(Lnoi, ALPNOI); - FNT_p = FNTO; - FNTEXC_p = FNTEXCL * BETN_p * BETN_p * iWE * iWE; - NFA_p = Lred * iWE * iLE * NFALW; - NFB_p = Lred * iWE * iLE * NFBLW; - NFC_p = Lred * iWE * iLE * NFCLW; - EF_p = EFO; - - // Edge transistors: PSP 103.4 - WE_edge = 2.0 * WEDGE + WEDGEW * WE; - iWE_edge = `WEN / WE_edge; - VFBEDGE_p = VFBEDGEO; - STVFBEDGE_p = STVFBEDGEO + STVFBEDGEL * iLE + STVFBEDGEW * iWE + STVFBEDGELW * iLE * iWE; - DPHIBEDGE_p = DPHIBEDGEO + DPHIBEDGEL * pow(iLE, DPHIBEDGELEXP) + DPHIBEDGEW * iWE + DPHIBEDGELW * iLE * iWE; - NEFFEDGE_p = NSUBEDGEO_i * (1.0 + NSUBEDGEL * pow(iLE, NSUBEDGELEXP)) * ( 1.0 + NSUBEDGEW * iWE) * ( 1.0 + NSUBEDGELW * iLE * iWE); - CTEDGE_p = CTEDGEO + CTEDGEL * pow(iLE, CTEDGELEXP); - GPE_edge = 1.0 + FBETEDGE * LPEDGE_i / LE * (1.0 - exp(-LE / LPEDGE_i)); - GPE_edge = `MAX(GPE_edge, 1.0e-15); - BETNEDGE_p = UO * WE_edge / (GPE_edge * LE) * (1.0 + BETEDGEW * iWE); - STBETEDGE_p = STBETEDGEO + STBETEDGEL * iLE + STBETEDGEW * iWE + STBETEDGELW * iLE * iWE; - PSCEEDGE_p = PSCEEDGEL * pow(iLE, PSCEEDGELEXP) * (1.0 + PSCEEDGEW * iWE); - PSCEBEDGE_p = PSCEBEDGEO; - PSCEDEDGE_p = PSCEDEDGEO; - CFEDGE_p = CFEDGEL * pow(iLE, CFEDGELEXP) * (1.0 + CFEDGEW * iWE); - CFDEDGE_p = CFDEDGEO; - CFBEDGE_p = CFBEDGEO; - FNTEDGE_p = FNTEDGEO; - NFAEDGE_p = iWE_edge * iLE * NFAEDGELW; - NFBEDGE_p = iWE_edge * iLE * NFBEDGELW; - NFCEDGE_p = iWE_edge * iLE * NFCEDGELW; - EFEDGE_p = EFEDGEO; -end - -// Well proximity effect parameters -KVTHOWE = KVTHOWEO + KVTHOWEL * iLE + KVTHOWEW * iWE + KVTHOWELW * iLE * iWE; -KUOWE = KUOWEO + KUOWEL * iLE + KUOWEW * iWE + KUOWELW * iLE * iWE; - -// Geometry scaling with binning scaling rules -if (SWGEO_i == 2) begin - - // auxiliary variables - iLEWE = iLE * iWE; - iiLE = LE / `LEN; - iiWE = WE / `WEN; - iiLEWE = iiLE * iiWE; - iiiLEWE = iiWE / iiLE; - - // auxiliary variables for COX only - iiLEcv = LEcv / `LEN; - iiWEcv = WEcv / `WEN; - iiLEWEcv = iiLEcv * iiWEcv; - - // auxiliary variables for CGOV only - iLEcv = `LEN / LEcv; - iiiLEWEcv = iiWEcv / iiLEcv; - - // auxiliary variables for CGBOV only - iiLcv = Lcv / `LEN; - iiWcv = Wcv / `WEN; - iiLWcv = iiLcv * iiWcv; - - // auxiliary variables for CFR only - iLcv = `LEN / Lcv; - iiiLWcv = iiWcv / iiLcv; - - // Process parameters - VFB_p = POVFB + iLE * PLVFB + iWE * PWVFB + iLEWE * PLWVFB; - STVFB_p = POSTVFB + iLE * PLSTVFB + iWE * PWSTVFB + iLEWE * PLWSTVFB; - ST2VFB_p = POST2VFB; - TOX_p = POTOX; - EPSROX_p = POEPSROX; - NEFF_p = PONEFF + iLE * PLNEFF + iWE * PWNEFF + iLEWE * PLWNEFF; - FACNEFFAC_p = POFACNEFFAC + iLE * PLFACNEFFAC + iWE * PWFACNEFFAC + iLEWE * PLWFACNEFFAC; - GFACNUD_p = POGFACNUD + PLGFACNUD * iLE + PWGFACNUD * iWE + PLWGFACNUD * iLE * iWE; - VSBNUD_p = POVSBNUD; - DVSBNUD_p = PODVSBNUD; - VNSUB_p = POVNSUB; - NSLP_p = PONSLP; - DNSUB_p = PODNSUB; - DPHIB_p = PODPHIB + iLE * PLDPHIB + iWE * PWDPHIB + iLEWE * PLWDPHIB; - DELVTAC_p = PODELVTAC + iLE * PLDELVTAC + iWE * PWDELVTAC + iLEWE * PLWDELVTAC; - NP_p = PONP + iLE * PLNP + iWE * PWNP + iLEWE * PLWNP; - TOXOV_p = POTOXOV; - TOXOVD_p = POTOXOVD; - NOV_p = PONOV + iLE * PLNOV + iWE * PWNOV + iLEWE * PLWNOV; - NOVD_p = PONOVD + iLE * PLNOVD + iWE * PWNOVD + iLEWE * PLWNOVD; - - // Interface states parameters - CT_p = POCT + iLE * PLCT + iWE * PWCT + iLEWE * PLWCT; - CTG_p = POCTG; - CTB_p = POCTB; - STCT_p = POSTCT; - - // DIBL parameters - CF_p = POCF + iLE * PLCF + iWE * PWCF + iLEWE * PLWCF; - CFAC_p = POCFAC_i + iLE * PLCFAC_i + iWE * PWCFAC_i + iLEWE * PLWCFAC_i; - CFD_p = POCFD; - CFB_p = POCFB; - - // Subthreshold slope parameters of short channel transistor - PSCE_p = POPSCE + iLE * PLPSCE + iWE * PWPSCE + iLEWE * PLWPSCE; - PSCEB_p = POPSCEB; - PSCED_p = POPSCED; - - // Mobility parameters - BETN_p = iiWE * iLE * (POBETN + iLE * PLBETN + iWE * PWBETN + iLEWE * PLWBETN); - STBET_p = POSTBET + iLE * PLSTBET + iWE * PWSTBET + iLEWE * PLWSTBET; - MUE_p = POMUE + iLE * PLMUE + iWE * PWMUE + iLEWE * PLWMUE; - STMUE_p = POSTMUE; - THEMU_p = POTHEMU; - STTHEMU_p = POSTTHEMU; - CS_p = POCS + iLE * PLCS + iWE * PWCS + iLEWE * PLWCS; - STCS_p = POSTCS; - THECS_p = POTHECS; - STTHECS_p = POSTTHECS; - XCOR_p = POXCOR + iLE * PLXCOR + iWE * PWXCOR + iLEWE * PLWXCOR; - STXCOR_p = POSTXCOR; - FETA_p = POFETA; - - // Series resistance parameters - RS_p = PORS + iLE * PLRS + iWE * PWRS + iLEWE * PLWRS; - STRS_p = POSTRS; - RSB_p = PORSB; - RSG_p = PORSG; - - // Velocity saturation parameters - THESAT_p = POTHESAT + iLE * PLTHESAT + iWE * PWTHESAT + iLEWE * PLWTHESAT; - THESATAC_p = POTHESATAC_i + iLE * PLTHESATAC_i + iWE * PWTHESATAC_i + iLEWE * PLWTHESATAC_i; - STTHESAT_p = POSTTHESAT + iLE * PLSTTHESAT + iWE * PWSTTHESAT + iLEWE * PLWSTTHESAT; - THESATB_p = POTHESATB + iLE * PLTHESATB + iWE * PWTHESATB + iLEWE * PLWTHESATB; - THESATG_p = POTHESATG + iLE * PLTHESATG + iWE * PWTHESATG + iLEWE * PLWTHESATG; - - // Saturation voltage parameters - AX_p = POAX + iLE * PLAX + iWE * PWAX + iLEWE * PLWAX; - AXAC_p = POAXAC_i + iLE * PLAXAC_i + iWE * PWAXAC_i + iLEWE * PLWAXAC_i; - - // Channel length modulation (CLM) parameters - ALP_p = POALP + iLE * PLALP + iWE * PWALP + iLEWE * PLWALP; - ALPAC_p = POALPAC_i + iLE * PLALPAC_i + iWE * PWALPAC_i + iLEWE * PLWALPAC_i; - ALP1_p = POALP1 + iLE * PLALP1 + iWE * PWALP1 + iLEWE * PLWALP1; - ALP2_p = POALP2 + iLE * PLALP2 + iWE * PWALP2 + iLEWE * PLWALP2; - VP_p = POVP; - - // Impact ionization parameters - A1_p = POA1 + iLE * PLA1 + iWE * PWA1 + iLEWE * PLWA1; - A2_p = POA2; - STA2_p = POSTA2; - A3_p = POA3 + iLE * PLA3 + iWE * PWA3 + iLEWE * PLWA3; - A4_p = POA4 + iLE * PLA4 + iWE * PWA4 + iLEWE * PLWA4; - GCO_p = POGCO; - - // Gate current parameters - IGINV_p = POIGINV + iiLE * PLIGINV + iiWE * PWIGINV + iiLEWE * PLWIGINV; - IGOV_p = POIGOV + iLE * PLIGOV + iiWE * PWIGOV + iiiLEWE * PLWIGOV; - IGOVD_p = POIGOVD + iLE * PLIGOVD + iiWE * PWIGOVD + iiiLEWE * PLWIGOVD; - STIG_p = POSTIG; - GC2_p = POGC2; - GC3_p = POGC3; - GC2OV_p = POGC2OV; - GC3OV_p = POGC3OV; - CHIB_p = POCHIB; - - // Gate-induced drain leakage (GIDL) parameters - AGIDL_p = POAGIDL + iLE * PLAGIDL + iiWE * PWAGIDL + iiiLEWE * PLWAGIDL; - AGIDLD_p = POAGIDLD + iLE * PLAGIDLD + iiWE * PWAGIDLD + iiiLEWE * PLWAGIDLD; - BGIDL_p = POBGIDL; - BGIDLD_p = POBGIDLD; - STBGIDL_p = POSTBGIDL; - STBGIDLD_p = POSTBGIDLD; - CGIDL_p = POCGIDL; - CGIDLD_p = POCGIDLD; - - // Charge model parameters - COX_p = POCOX + iiLEcv * PLCOX + iiWEcv * PWCOX + iiLEWEcv * PLWCOX; - CGOV_p = POCGOV + iLEcv * PLCGOV + iiWEcv * PWCGOV + iiiLEWEcv * PLWCGOV; - CGOVD_p = POCGOVD + iLEcv * PLCGOVD + iiWEcv * PWCGOVD + iiiLEWEcv * PLWCGOVD; - CGBOV_p = POCGBOV + iiLcv * PLCGBOV + iiWcv * PWCGBOV + iiLWcv * PLWCGBOV; - CFR_p = POCFR + iLcv * PLCFR + iiWcv * PWCFR + iiiLWcv * PLWCFR; - CFRD_p = POCFRD + iLcv * PLCFRD + iiWcv * PWCFRD + iiiLWcv * PLWCFRD; - - // Noise model parameters - FNT_p = POFNT; - FNTEXC_p = iLE * iLE * (POFNTEXC + iLE * PLFNTEXC + iWE * PWFNTEXC + iLEWE * PLWFNTEXC); - NFA_p = PONFA + iLE * PLNFA + iWE * PWNFA + iLEWE * PLWNFA; - NFB_p = PONFB + iLE * PLNFB + iWE * PWNFB + iLEWE * PLWNFB; - NFC_p = PONFC + iLE * PLNFC + iWE * PWNFC + iLEWE * PLWNFC; - EF_p = POEF; - - // Edge transistor: PSP 103.4 - VFBEDGE_p = POVFBEDGE; - STVFBEDGE_p = POSTVFBEDGE + iLE * PLSTVFBEDGE + iWE * PWSTVFBEDGE + iLEWE * PLWSTVFBEDGE; - DPHIBEDGE_p = PODPHIBEDGE + iLE * PLDPHIBEDGE + iWE * PWDPHIBEDGE + iLEWE * PLWDPHIBEDGE; - NEFFEDGE_p = PONEFFEDGE + iLE * PLNEFFEDGE + iWE * PWNEFFEDGE + iLEWE * PLWNEFFEDGE; - CTEDGE_p = POCTEDGE + iLE * PLCTEDGE + iWE * PWCTEDGE + iLEWE * PLWCTEDGE; - BETNEDGE_p = iLE * (POBETNEDGE + iLE * PLBETNEDGE + iWE * PWBETNEDGE + iLEWE * PLWBETNEDGE); - STBETEDGE_p = POSTBETEDGE + iLE * PLSTBETEDGE + iWE * PWSTBETEDGE + iLEWE * PLWSTBETEDGE; - PSCEEDGE_p = POPSCEEDGE + iLE * PLPSCEEDGE + iWE * PWPSCEEDGE + iLEWE * PLWPSCEEDGE; - PSCEBEDGE_p = POPSCEBEDGE; - PSCEDEDGE_p = POPSCEDEDGE; - CFEDGE_p = POCFEDGE + iLE * PLCFEDGE + iWE * PWCFEDGE + iLEWE * PLWCFEDGE; - CFDEDGE_p = POCFDEDGE; - CFBEDGE_p = POCFBEDGE; - FNTEDGE_p = POFNTEDGE; - NFAEDGE_p = PONFAEDGE + iLE * PLNFAEDGE + iWE * PWNFAEDGE + iLEWE * PLWNFAEDGE; - NFBEDGE_p = PONFBEDGE + iLE * PLNFBEDGE + iWE * PWNFBEDGE + iLEWE * PLWNFBEDGE; - NFCEDGE_p = PONFCEDGE + iLE * PLNFCEDGE + iWE * PWNFCEDGE + iLEWE * PLWNFCEDGE; - EFEDGE_p = POEFEDGE; - - // Well proximity effect parameters - KVTHOWE = POKVTHOWE + iLE * PLKVTHOWE + iWE * PWKVTHOWE + iLEWE * PLWKVTHOWE; - KUOWE = POKUOWE + iLE * PLKUOWE + iWE * PWKUOWE + iLEWE * PLWKUOWE; - -end - -// Parasitic resistance parameters -if ((SWGEO_i == 1) || (SWGEO_i == 2)) begin - RG_p = RSHG_i * (`oneThird * W_f / NGCON_i + XGWE) / (NGCON_i * L_slif) + (RINT_i + RVPOLY_i) / (W_f * L_f) + NF_i * RGO; - if (SWJUNASYM == 0) begin - RSHD_i = RSH_i; - end - RSE_p = NRS * RSH_i; - RDE_p = NRD * RSHD_i; - RWELL_p = NF_i * RWELLO; - RBULK_p = NF_i * RBULKO; - RJUNS_p = NF_i * RJUNSO; - RJUND_p = NF_i * RJUNDO; - - // Self heating effect parameters - `ifdef SelfHeating - deltaRth = RTHW2 + WE / `WEN * (1.0 + RTHLW * LE / `LEN); - deltaRth = `MAX(deltaRth, 1.0e-6); - RTH_p = RTHO + RTHW1 / deltaRth; - CTH_p = CTHO + CTHW1 * (CTHW2 + WE / `WEN * (1.0 + CTHLW * LE / `LEN)); - STRTH_p = STRTHO; - `endif // SelfHeating - - // NQS parameters - `ifdef NQSmodel - MUNQS_p = MUNQSO; - `endif // NQSmodel - - // Mechanical stress model - tmpa = 0.0; - tmpb = 0.0; - loop = 0.0; - if ((SA_i > 0.0) && (SB_i > 0.0) && ((NF_i == 1.0) || ((NF_i > 1.0) && (SD_i > 0.0)))) begin - while (loop < (NF_i - 0.5)) begin - tmpa = tmpa + 1.0 / (SA_i + 0.5 * L_i + loop * (SD_i + L_i)); - tmpb = tmpb + 1.0 / (SB_i + 0.5 * L_i + loop * (SD_i + L_i)); - loop = loop + 1.0; - end - Invsa = tmpa * invNF; - Invsb = tmpb * invNF; - Invsaref = 1.0 / (SAREF_i + 0.5 * L_i); - Invsbref = 1.0 / (SBREF_i + 0.5 * L_i); - Lx = `MAX(L_i + delLPS, 1.0e-9); - Wx = `MAX(W_i + delWOD + WLOD, 1.0e-9); - templ = 1.0 / pow(Lx, LLODKUO_i); - tempw = 1.0 / pow(Wx, WLODKUO_i); - Kstressu0 = (1.0 + LKUO * templ + WKUO * tempw + PKUO * templ * tempw) * (1.0 + TKUO * (rTa - 1.0)); - rhobeta = KUO * (Invsa + Invsb) / Kstressu0; - rhobetaref = KUO * (Invsaref + Invsbref) / Kstressu0; - templ = 1.0 / pow(Lx, LLODVTH_i); - tempw = 1.0 / pow(Wx, WLODVTH_i); - Kstressvth0 = 1.0 + LKVTHO * templ + WKVTHO * tempw + PKVTHO * templ * tempw; - temp0 = Invsa + Invsb - Invsaref - Invsbref; - // Parameter adaptations - temp00 = (1.0 + rhobeta) / (1.0 + rhobetaref); - BETN_p = BETN_p * temp00; - THESAT_p = THESAT_p * temp00 * (1.0 + KVSAT_i * rhobetaref) / (1.0 + KVSAT_i * rhobeta); - THESATAC_p = THESATAC_p * temp00 * (1.0 + KVSATAC_i * rhobetaref) / (1.0 + KVSATAC_i * rhobeta); - BETNEDGE_p = BETNEDGE_p * temp00; - temp00 = KVTHO * temp0 / Kstressvth0; - VFB_p = VFB_p + temp00; - VFBEDGE_p = VFBEDGE_p + temp00; - temp00 = STETAO * temp0 / pow(Kstressvth0, LODETAO_i); - CF_p = CF_p + temp00; - CFAC_p = CFAC_p + temp00; - CFEDGE_p = CFEDGE_p + temp00; - end - - // Well proximity effect equations - if ((SCA_i > 0.0) || (SCB_i > 0.0) || (SCC_i > 0.0) || (SC_i > 0.0)) begin - if ((SCA_i == 0.0) && (SCB_i == 0.0) && (SCC_i == 0.0)) begin - temp0 = SC_i + W_i; - temp00 = 1.0 / SCREF_i; - SCA_i = SCREF_i * SCREF_i / (SC_i * temp0); - SCB_i = ((0.1 * SC_i + 0.01 * SCREF_i) * exp(-10.0 * SC_i * temp00) - (0.1 * temp0 + 0.01 * SCREF_i) * exp(-10.0 * temp0 * temp00)) / W_i; - SCC_i = ((0.05 * SC_i + 0.0025 * SCREF_i) * exp(-20.0 * SC_i * temp00) - (0.05 * temp0 + 0.0025 * SCREF_i) * exp(-20.0 * temp0 * temp00)) / W_i; - end - // Parameter adaptations - temp0 = SCA_i + WEB_i * SCB_i + WEC_i * SCC_i; - VFB_p = VFB_p + KVTHOWE * temp0; - BETN_p = BETN_p * (1.0 + KUOWE * temp0); - VFBEDGE_p = VFBEDGE_p + KVTHOWE * temp0; - BETNEDGE_p = BETNEDGE_p * (1.0 + KUOWE * temp0); - end -end - -// Internal parameters (including temperature scaling) -// Clipping of the local model parameters -VFB_i = VFB_p; -STVFB_i = STVFB_p; -ST2VFB_i = ST2VFB_p; -TOX_i = `CLIP_LOW(TOX_p, 1.0e-10); -EPSROX_i = `CLIP_LOW(EPSROX_p, 1.0); -NEFF_i = `CLIP_BOTH(NEFF_p, 1.0e20, 1.0e26); -FACNEFFAC_i = `CLIP_LOW(FACNEFFAC_p, 0.0); -GFACNUD_i = `CLIP_LOW(GFACNUD_p, 0.01); -VSBNUD_i = `CLIP_LOW(VSBNUD_p, 0.0); -DVSBNUD_i = `CLIP_LOW(DVSBNUD_p, 0.1); -VNSUB_i = VNSUB_p; -NSLP_i = `CLIP_LOW(NSLP_p, 1.0e-3); -DNSUB_i = `CLIP_BOTH(DNSUB_p, 0.0, 1.0); -DPHIB_i = DPHIB_p; -DELVTAC_i = DELVTAC_p; -NP_i = `CLIP_LOW(NP_p, 0.0); -TOXOV_i = `CLIP_LOW(TOXOV_p, 1.0e-10); -TOXOVD_i = `CLIP_LOW(TOXOVD_p, 1.0e-10); -NOV_i = `CLIP_BOTH(NOV_p, 1.0e23, 1.0e27); -NOVD_i = `CLIP_BOTH(NOVD_p, 1.0e23, 1.0e27); -CT_i = `CLIP_LOW(CT_p, 0.0); -CTG_i = `CLIP_LOW(CTG_p, 0.0); -CTB_i = CTB_p; -STCT_i = STCT_p; -CF_i = `CLIP_LOW(CF_p, 0.0); -CFAC_i = `CLIP_LOW(CFAC_p, 0.0); -CFD_i = `CLIP_LOW(CFD_p, 0.0); -CFB_i = `CLIP_BOTH(CFB_p, 0.0, 1.0); -PSCE_i = `CLIP_LOW(PSCE_p, 0.0); -PSCEB_i = `CLIP_BOTH(PSCEB_p, 0.0, 1.0); -PSCED_i = `CLIP_LOW(PSCED_p, 0.0); -BETN_i = `CLIP_LOW(BETN_p, 0.0); -STBET_i = STBET_p; -MUE_i = `CLIP_LOW(MUE_p, 0.0); -STMUE_i = STMUE_p; -THEMU_i = `CLIP_LOW(THEMU_p, 0.0); -STTHEMU_i = STTHEMU_p; -CS_i = `CLIP_LOW(CS_p, 0.0); -STCS_i = STCS_p; -THECS_i = `CLIP_LOW(THECS_p, 0.0); -STTHECS_i = STTHECS_p; -XCOR_i = `CLIP_LOW(XCOR_p, 0.0); -STXCOR_i = STXCOR_p; -FETA_i = `CLIP_LOW(FETA_p, 0.0); -RS_i = `CLIP_LOW(RS_p, 0.0); -STRS_i = STRS_p; -RSB_i = `CLIP_BOTH(RSB_p, -0.5, 1.0); -RSG_i = `CLIP_LOW(RSG_p, -0.5); -THESAT_i = `CLIP_LOW(THESAT_p, 0.0); -THESATAC_i = `CLIP_LOW(THESATAC_p, 0.0); -STTHESAT_i = STTHESAT_p; -THESATB_i = `CLIP_BOTH(THESATB_p, -0.5, 1.0); -THESATG_i = `CLIP_LOW(THESATG_p, -0.5); -AX_i = `CLIP_LOW(AX_p, 2.0); -AXAC_i = `CLIP_LOW(AXAC_p, 2.0); -ALP_i = `CLIP_LOW(ALP_p, 0.0); -ALPAC_i = `CLIP_LOW(ALPAC_p, 0.0); -ALP1_i = `CLIP_LOW(ALP1_p, 0.0); -ALP2_i = `CLIP_LOW(ALP2_p, 0.0); -VP_i = `CLIP_LOW(VP_p, 1.0e-10); -A1_i = `CLIP_LOW(A1_p, 0.0); -A2_i = `CLIP_LOW(A2_p, 0.0); -STA2_i = STA2_p; -A3_i = `CLIP_LOW(A3_p, 0.0); -A4_i = `CLIP_LOW(A4_p, 0.0); -GCO_i = `CLIP_BOTH(GCO_p, -10.0, 10.0); -IGINV_i = `CLIP_LOW(IGINV_p, 0.0); -IGOV_i = `CLIP_LOW(IGOV_p, 0.0); -IGOVD_i = `CLIP_LOW(IGOVD_p, 0.0); -STIG_i = STIG_p; -GC2_i = `CLIP_BOTH(GC2_p, 0.0, 10.0); -GC3_i = `CLIP_BOTH(GC3_p, -10.0, 10.0); -GC2OV_i = GC2_i; -GC3OV_i = GC3_i; -if (SWIGATE_i == 2) begin - GC2OV_i = `CLIP_BOTH(GC2OV_p, 0.0, 10.0); - GC3OV_i = `CLIP_BOTH(GC3OV_p, -10.0, 10.0); -end -CHIB_i = `CLIP_LOW(CHIB_p, 1.0); -AGIDL_i = `CLIP_LOW(AGIDL_p, 0.0); -AGIDLD_i = `CLIP_LOW(AGIDLD_p, 0.0); -BGIDL_i = `CLIP_LOW(BGIDL_p, 0.0); -BGIDLD_i = `CLIP_LOW(BGIDLD_p, 0.0); -STBGIDL_i = STBGIDL_p; -STBGIDLD_i = STBGIDLD_p; -CGIDL_i = CGIDL_p; -CGIDLD_i = CGIDLD_p; -COX_i = `CLIP_LOW(COX_p, 0.0); -CGOV_i = `CLIP_LOW(CGOV_p, 0.0); -CGOVD_i = `CLIP_LOW(CGOVD_p, 0.0); -CGBOV_i = `CLIP_LOW(CGBOV_p, 0.0); -CFR_i = `CLIP_LOW(CFR_p, 0.0); -CFRD_i = `CLIP_LOW(CFRD_p, 0.0); -FNT_i = `CLIP_LOW(FNT_p, 0.0); -FNTEXC_i = `CLIP_LOW(FNTEXC_p, 0.0); -NFA_i = `CLIP_LOW(NFA_p, 0.0); -NFB_i = `CLIP_LOW(NFB_p, 0.0); -NFC_i = `CLIP_LOW(NFC_p, 0.0); -EF_i = `CLIP_LOW(EF_p, 0.0); -VFBEDGE_i = VFBEDGE_p; -STVFBEDGE_i = STVFBEDGE_p; -DPHIBEDGE_i = DPHIBEDGE_p; -NEFFEDGE_i = `CLIP_BOTH(NEFFEDGE_p, 1.0e20, 1.0e26); -CTEDGE_i = `CLIP_LOW(CTEDGE_p, 0.0); -BETNEDGE_i = `CLIP_LOW(BETNEDGE_p, 0.0); -STBETEDGE_i = STBETEDGE_p; -PSCEEDGE_i = `CLIP_LOW(PSCEEDGE_p, 0.0); -PSCEBEDGE_i = `CLIP_BOTH(PSCEBEDGE_p, 0.0, 1.0); -PSCEDEDGE_i = `CLIP_LOW(PSCEDEDGE_p, 0.0); -CFEDGE_i = `CLIP_LOW(CFEDGE_p, 0.0); -CFDEDGE_i = `CLIP_LOW(CFDEDGE_p, 0.0); -CFBEDGE_i = `CLIP_BOTH(CFBEDGE_p, 0.0, 1.0); -FNTEDGE_i = `CLIP_LOW(FNTEDGE_p, 0.0); -NFAEDGE_i = `CLIP_LOW(NFAEDGE_p, 0.0); -NFBEDGE_i = `CLIP_LOW(NFBEDGE_p, 0.0); -NFCEDGE_i = `CLIP_LOW(NFCEDGE_p, 0.0); -EFEDGE_i = `CLIP_LOW(EFEDGE_p, 0.0); -RG_i = `CLIP_LOW(RG_p, 0.0); -RSE_i = `CLIP_LOW(RSE_p, 0.0); -RDE_i = `CLIP_LOW(RDE_p, 0.0); -RBULK_i = `CLIP_LOW(RBULK_p, 0.0); -RJUNS_i = `CLIP_LOW(RJUNS_p, 0.0); -RJUND_i = `CLIP_LOW(RJUND_p, 0.0); -RWELL_i = `CLIP_LOW(RWELL_p, 0.0); -`ifdef SelfHeating - RTH_i = `CLIP_LOW(RTH_p, 1.0e-4); - CTH_i = `CLIP_LOW(CTH_p, 0.0); - STRTH_i = STRTH_p; -`endif // SelfHeating -MULT_i = `CLIP_LOW(MULT * NF_i, 0.0); // Note: NF_i is set to 1 for local model -FACTUO_i = `CLIP_LOW(FACTUO, 0.0); -DELVTO_i = DELVTO; -FACTUOEDGE_i = `CLIP_LOW(FACTUOEDGE, 0.0); -DELVTOEDGE_i = DELVTOEDGE; -`ifdef NQSmodel - MUNQS_i = `CLIP_LOW(MUNQS_p, 0.0); -`endif // NQSmodel - -// Ignore drain-side values in case of symmetric junctions -if (SWJUNASYM_i == 0) begin - TOXOVD_i = TOXOV_i; - NOVD_i = NOV_i; - AGIDLD_i = AGIDL_i; - BGIDLD_i = BGIDL_i; - STBGIDLD_i = STBGIDL_i; - CGIDLD_i = CGIDL_i; - IGOVD_i = IGOV_i; - CGOVD_i = CGOV_i; - CFRD_i = CFR_i; -end diff --git a/src/spicelib/devices/adms/psp103/admsva/psp103.va b/src/spicelib/devices/adms/psp103/admsva/psp103.va deleted file mode 100644 index d66a1aca2..000000000 --- a/src/spicelib/devices/adms/psp103/admsva/psp103.va +++ /dev/null @@ -1,54 +0,0 @@ -//====================================================================================== -//====================================================================================== -// Filename: psp103.va -//====================================================================================== -//====================================================================================== -// -// (c) Copyright notice -// -// Since 2015 until today, PSP has been co-developed by NXP Semiconductors and -// CEA-Leti. For this part of the model, each claim undivided ownership and copyrights -// Since 2012 until 2015, PSP has been co-developed by NXP Semiconductors and -// Delft University of Technology. For this part of the model, each claim undivided -// ownership and copyrights -// Until and including 2011, PSP has been co-developed by NXP Semiconductors and -// Arizona State University. For this part of the model, NXP Semiconductors claims -// undivided ownership and copyrights. -// -// -// Version: 103.7.0 (PSP), 200.6.0 (JUNCAP), April 2019 -// -//====================================================================================== -//====================================================================================== -// -// Further information can be found in the file releasenotesPSP103.txt -// - -`include "discipline.h" - -//`define NQSmodel true - -//`define SelfHeating true - -`include "Common103_macrodefs.include" - -`include "JUNCAP200_macrodefs.include" - -`include "PSP103_macrodefs.include" - -// Note: some verilog-A compilers have problems handling the ddx-operator, -// which occurs in definition of OP-output variables. If the line below is -// commented out, all OP-output variables using the ddx-operator are skipped. -`define OPderiv - -///////////////////////////////////////////////////////////////////////////// -// -// PSP global model code -// -///////////////////////////////////////////////////////////////////////////// - -module PSP103VA(D, G, S, B); - -`include "PSP103_module.include" - -endmodule diff --git a/src/spicelib/devices/adms/psp103/admsva/releasenotesPSP103p7.txt b/src/spicelib/devices/adms/psp103/admsva/releasenotesPSP103p7.txt deleted file mode 100644 index 2ea7fb9bd..000000000 --- a/src/spicelib/devices/adms/psp103/admsva/releasenotesPSP103p7.txt +++ /dev/null @@ -1,206 +0,0 @@ - -====================================================================================== -====================================================================================== - Silicon Integration Initiative (Si2) - Compact Model Coalition In-Code Statement - - Software is distributed as is, completely without warranty or service support. The - Commissariat a l'energie atomique et aux energies alternatives (CEA), NXP - Semiconductors, and Delft University of Technology, along with their employees are - not liable for the condition or performance of the software. - - NXP Semiconductors, Delft University of Technology, and CEA own the copyright and - grant users a perpetual, irrevocable, worldwide, non-exclusive, royalty-free license - with respect to the software as set forth below. - - NXP Semiconductors, Delft University of Technology, and CEA hereby disclaim all - implied warranties. - - NXP Semiconductors, Delft University of Technology, and CEA grant the users the right - to modify, copy, and redistribute the software and documentation, both within the - user's organization and externally, subject to the following restrictions: - - 1. The users agree not to charge for the NXP Semiconductors, Delft University of - Technology, and CEA-developed code itself but may charge for additions, - extensions, or support. - - 2. In any product based on the software, the users agree to acknowledge NXP - Semiconductors, Delft University of Technology, and CEA that developed the - software. This acknowledgement shall appear in the product documentation. - - 3. Redistributions to others of source code and documentation must retain the - copyright notice, disclaimer, and list of conditions. - - 4. Redistributions to others in binary form must reproduce the copyright notice, - disclaimer, and list of conditions in the documentation and/or other materials - provided with the distribution. - - CMC In-Code Statement Revision: 103.7.0 (PSP), 04/29/2019 - 200.6.0 (JUNCAP),04/29/2019 - -====================================================================================== -====================================================================================== - - Authors: G.D.J. Smit, A.J. Scholten, and D.B.M. Klaassen (NXP Semiconductors) - O. Rozeau, S. Martinie, T. Poiroux, J.C. Barbé (CEA-Leti) - - Former contributers: - G. Gildenblat, W. Yao, Z. Zhu, X. Li and W. Wu (Arizona State University) - R. van Langevelde (Philips Research) - R. van der Toorn (Delft University of Technology) - - The most recent version of the model code, the documentation, and contact - information can be found on: - - http://www.cea.fr/cea-tech/leti/pspsupport - -====================================================================================== -====================================================================================== - -This package consists of the following files: - - - releasenotesPSP103.txt This file - - - psp103.va Main file for PSP model - - psp103t.va Main file for PSP model with self heating - - psp103_nqs.va Main file for PSP model with NQS-effects - - juncap200.va Main file for JUNCAP2 stand-alone model - - - Common103_macrodefs.include Common macro definitions - - PSP103_macrodefs.include Macro definitions for PSP - - PSP103_module.include Actual model code for intrinsic MOS model - - PSP103_parlist.include Model parameter list for PSP model - - PSP103_scaling.include Geometry scaling equations for PSP model - - PSP103_nqs_macrodefs.include Macro definitions for PSP-NQS - - PSP103_InitNQS.include PSP-NQS initialization code - - PSP103_ChargesNQS.include Calculation of NQS-charge contributions - - JUNCAP200_macrodefs.include Macro definitions for JUNCAP2 model - - JUNCAP200_parlist.include JUNCAP2 parameter list - - JUNCAP200_varlist.include JUNCAP2 variable declarations - - JUNCAP200_InitModel.include JUNCAP2 model initialization code - -====================================================================================== -====================================================================================== - -Usage ------ - -Depending which model one wants to use, one should compile one of the four .va-files -(psp103.va, psp103t.va, psp103_nqs.va, and juncap200.va). The module names are -"PSP103VA", "PSP103TVA", and "PSPNQS103VA" (for QS, self heating, and NQS, -respectively), and "JUNCAP200" for the JUNCAP2-model. - - -====================================================================================== -====================================================================================== - -Release notes vA-code of PSP 103.7.0 (April 2019) ---------------------------------------------------------- - -Changes include - - More efficient calculations of Vdsp and Vdspedge - - Additional parameters for overlaps gate leakage currents - - Charge partitioning: new switch parameter SWQPART to modify the charge - partitioning between the drain and the source - - Additional parameters for charge model decoupling to improve CV description - - Minor modification on code files organization - -- PSP103_macrodefs.include: - - Addition of variable declarations in SPcalcLocalVarDecl macro: line 280 - - Calculation of THESATAC_T: line 390 - - Includes SPCalculation.include file as a new macro called "SPCalculation" - -- PSP103_parlist.include: - - New file including PSP103_binpars.include and model parameter declaration from - PSP103_module.include - - Addition of new parameters SWQSAT, SWQPART, CFAC, THESATAC, AXAC, ALPAC, GC2OV, - GC3OV, CFACL, CFACLEXP, CFACW, THESATACO, THESATACL, THESATACLEXP, THESATACW, - THESATACLW, AXACO, AXACL, ALPACL, ALPACLEXP, ALPACW, GC2OVO, GC3OVO, POCFAC, - PLCFAC, PWCFAC, PLWCFAC, POTHESATAC, PLTHESATAC, PWTHESATAC, PLWTHESATAC, - POAXAC, PLAXAC, PWAXAC, PLWAXAC, POGC2OV, POGC3OV, KVSATAC - -- PSP103_scaling.include: - - New file including PSP103_binning.include and geometry scaling equations from - PSP103_module.include - - Addition of new internal local parameters, associated scaling rules and clipped - variables: CFAC_p, THESATAC_p, AXAC_p, ALPAC_p, GC2OV_p, GC3OV_p, CFAC_i, - THESATAC_i, AXAC_i, ALPAC_i, GC2OV_i, GC3OV_i - - Introduction of mechanical stress effect on THESATAC_p and CFAC_p. Minor - modifications of the stress model using the internal variable temp00. - -- PSP103_module.include: - - New OP-output variables: lp_cfac, lp_thesatac, lp_axac, lp_alpac, lp_gc2ov, - lp_gc3ov: lines 399, 423, 428, 430, 446, 447, 2128, 2152, 2157, 2159, 2175, 2176. - - New max clipping value of SWIGATE_i: line 542 - - New variables SWQSAT_i, SWQPART_i: lines 150, 550 and 551 - - Calculation of internal global-binning parameters for the charge model: lines 619 - to 651 - - Calculation of GCQOV variable for overlap gate leakage currents: lines 237, 782 - to 788 - - New variable declaration for charge model THESATAC_T: lines 225 and 1040 - - Vgb is now calculated in line 1089 - - Modifications for overlaps leakage currents GC2_i, GC3_i and GCQ are replaced by - GC2OV_i, GC3OV_i and GCQOV: lines 1209 to 1246 - - New calculation of Vdspedge: line 1344 - - Calculation of cfloc, thesatloc, axloc and alploc: lines 1136 to 1139, lines 1403 to - 1406 and lines 1418 to 1421 - - Modification of the condition "SWDELVTAC_i != 0" ("else" case was cancelled): lines - 1408 to 1415 - - Addition of the condition "SWQSAT_i != 0" for Q-model decoupling in saturation: lines - 1417 to 1422 - - Addition of the condition "SWQPART_i == 1.0" for charge partitioning and calculation - of the new charge partitioning: lines 1484 to 1490 - -- PSP103_SPCalculation.include: cancelled file - -- PSP103_binpars.include: cancelled file - -- PSP103_binning.include: cancelled file - -PSP 103.7.0 is backwards compatible with the previous version, PSP 103.6.0 - - -====================================================================================== -====================================================================================== - -Release notes vA-code of JUNCAP 200.6.0 (April 2019) ---------------------------------------------------------- - -Change includes: - - Bug fix on juncap express model (induced by negative values of MFOR2 and - ISATFOR2 variables) - - Addition of 2 multiplier factors for current IFACTOR and charge CFACTOR - -- JUNCAP200_parlist.include: - - Declaration of 2 new model parameters IFACTOR and CFACTOR: lines 36 and 37 - -- JUNCAP200_varlist1.include: cancelled file - -- JUNCAP200_varlist2.include: cancelled file - -- JUNCAP200_varlist.include: - - New file including JUNCAP200_varlist1.include and JUNCAP200_varlist2.include - -- JUNCAP200_macrodefs.include: - - Definition of 2 new constants IFACTOR_cliplow and CFACTOR_cliplow: lines 57 - and 58 - - Addition of CFACTOR in the calculation of Qjprime: line 221 - - Addition of IFACTOR in the calculation of Ijprime: line 276 - - Modification of condition for calculation of MFOR2 and ISATFOR2 variables - to avoid a bug on juncap express model. - -- JUNCAP200_InitModel.include: - - Addition of cliiped variables IFACTOR_i and CFACTOR_i: lines 36 and 37 - -- juncap200.va: - - Included new file for variable declarations: line 81 - -JUNCAP 200.6.0 is backwards compatible with the previous version, JUNCAP 200.5.0 - - -===================================================================================== -====================================================================================== -The authors want to thank Laurent Lemaitre and Colin McAndrew (Freescale) -for their help with ADMS and the implementation of the model code. Geoffrey -Coram (Analog Devices) is acknowledged for input concerning the Verilog-A -implementation of the model. diff --git a/src/spicelib/devices/adms/r2_cmc/admsva/cmcModels.inc b/src/spicelib/devices/adms/r2_cmc/admsva/cmcModels.inc deleted file mode 100644 index 9993f0576..000000000 --- a/src/spicelib/devices/adms/r2_cmc/admsva/cmcModels.inc +++ /dev/null @@ -1,250 +0,0 @@ - -// -// This file is the top-level declaration for the following CMC Verilog-A models: -// -// r2_cmc CMC 2-terminal resistor model -// r2_et_cmc CMC 2-terminal resistor model with self-heating -// - -// -// Physical constants and other generally useful numbers -// - -`include "discipline.h" -`define TABS_NIST2004 2.73150000e+02 // (NIST2004) 0C in K -`define QQ_NIST2004 1.60217653e-19 // (NIST2004) mag. of electronic charge (C) -`define KB_NIST2004 1.38065050e-23 // (NIST2004) Boltzmann constant (J/K) -`define oneThird 3.3333333333333333e-01 - -// -// Clipping macros, these smoothly limit to lower, upper, or both lower and upper -// limits. Rather than using a sqrt or log-exp form, which affects values -// everywhere, these use a conditional form that is continuous in function -// and derivative. If a value is not clipped then no exp() evaluation occurs. -// Smooth limiting is preferable to hard limiting (although latter can still -// be useful for enforcing parameter limits) for bias dependent quantities -// as derivatives do not become zero or have discontinuities. -// - -`define CLIPL0p1(XCLIP,X,LOWER) \ - if (X<(LOWER+0.1)) \ - XCLIP = LOWER+0.1*exp(10.0*(X-LOWER)-1.0); \ - else \ - XCLIP = X; -`define CLIPU0p1(XCLIP,X,UPPER) \ - if (X>(UPPER-0.1)) \ - XCLIP = UPPER-0.1*exp(10.0*(UPPER-X)-1.0); \ - else \ - XCLIP = X; -`define CLIPB0p1(XCLIP,X,LOWER,UPPER) \ - if (X<(LOWER+0.1)) \ - XCLIP = LOWER+0.1*exp(10.0*(X-LOWER)-1.0); \ - else if (X>(UPPER-0.1)) \ - XCLIP = UPPER-0.1*exp(10.0*(UPPER-X)-1.0); \ - else \ - XCLIP = X; - -`define CLIPL1p0(XCLIP,X,LOWER) \ - if (X<(LOWER+1.0)) \ - XCLIP = LOWER+exp(X-LOWER-1.0); \ - else \ - XCLIP = X; -`define CLIPU1p0(XCLIP,X,UPPER) \ - if (X>(UPPER-1.0)) \ - XCLIP = UPPER-exp(UPPER-X-1.0); \ - else \ - XCLIP = X; -`define CLIPB1p0(XCLIP,X,LOWER,UPPER) \ - if (X<(LOWER+1.0)) \ - XCLIP = LOWER+exp(X-LOWER-1.0); \ - else if (X>(UPPER-1.0)) \ - XCLIP = UPPER-exp(UPPER-X-1.0); \ - else \ - XCLIP = X; - -`ifdef insideADMS - `ifdef notInsideADMS - `undef notInsideADMS - `endif -`else - `define notInsideADMS -`endif -`ifdef __VAMS_COMPACT_MODELING__ - `ifdef not__VAMS_COMPACT_MODELING__ - `undef not__VAMS_COMPACT_MODELING__ - `endif -`else - `define not__VAMS_COMPACT_MODELING__ -`endif - -// -// Conditional definitions of macros so that the code will work with -// Verilog-A 2.1 and 2.2, and ADMS. The "des" description argument is intended to -// be a short description, the "inf" information argument is intended to be -// a detailed description (e.g. for display as part of on-line help). -// -// MPR model parameter real -// MPI model parameter integer -// IPR instance parameter real -// IPI instance parameter integer -// IPM instance parameter mFactor (multiplicity, implicit for LRM2.2) -// OPP operating point parameter, includes units and description for printing -// -// There are some issues with passing range directives with some compilers, -// so for each parameter declaration there are 5 versions: -// cc closed lower bound, closed upper bound -// co closed lower bound, open upper bound -// oc open lower bound, closed upper bound -// oo open lower bound, open upper bound -// nb no bounds -// - -//`ifdef __VAMS_COMPACT_MODELING__ - `define ALIAS(alias,parameter) aliasparam alias = parameter; - `define ERROR(str) \ - begin \ - $strobe(str); \ - $finish(1); \ - end - `define WARNING(str) $strobe(str); - `define OPP(nam,uni,des) (*units=uni desc=des*) real nam; - `define MPRcc(nam,def,uni,lwr,upr,des) (*units=uni, desc=des*) parameter real nam=def from[lwr:upr]; - `define MPRco(nam,def,uni,lwr,upr,des) (*units=uni, desc=des*) parameter real nam=def from[lwr:upr); - `define MPRoc(nam,def,uni,lwr,upr,des) (*units=uni, desc=des*) parameter real nam=def from(lwr:upr]; - `define MPRoo(nam,def,uni,lwr,upr,des) (*units=uni, desc=des*) parameter real nam=def from(lwr:upr); - `define MPRnb(nam,def,uni, des) (*units=uni, desc=des*) parameter real nam=def; - `define MPIcc(nam,def,uni,lwr,upr,des) (*units=uni, desc=des*) parameter integer nam=def from[lwr:upr]; - `define MPIco(nam,def,uni,lwr,upr,des) (*units=uni, desc=des*) parameter integer nam=def from[lwr:upr); - `define MPIoc(nam,def,uni,lwr,upr,des) (*units=uni, desc=des*) parameter integer nam=def from(lwr:upr]; - `define MPIoo(nam,def,uni,lwr,upr,des) (*units=uni, desc=des*) parameter integer nam=def from(lwr:upr); - `define MPInb(nam,def,uni, des) (*units=uni, desc=des*) parameter integer nam=def; - `define IPRcc(nam,def,uni,lwr,upr,des) (*units=uni, type="instance", desc=des*) parameter real nam=def from[lwr:upr]; - `define IPRco(nam,def,uni,lwr,upr,des) (*units=uni, type="instance", desc=des*) parameter real nam=def from[lwr:upr); - `define IPRoc(nam,def,uni,lwr,upr,des) (*units=uni, type="instance", desc=des*) parameter real nam=def from(lwr:upr]; - `define IPRoo(nam,def,uni,lwr,upr,des) (*units=uni, type="instance", desc=des*) parameter real nam=def from(lwr:upr); - `define IPRnb(nam,def,uni, des) (*units=uni, type="instance", desc=des*) parameter real nam=def; - `define IPIcc(nam,def,uni,lwr,upr,des) (*units=uni, type="instance", desc=des*) parameter integer nam=def from[lwr:upr]; - `define IPIco(nam,def,uni,lwr,upr,des) (*units=uni, type="instance", desc=des*) parameter integer nam=def from[lwr:upr); - `define IPIoc(nam,def,uni,lwr,upr,des) (*units=uni, type="instance", desc=des*) parameter integer nam=def from(lwr:upr]; - `define IPIoo(nam,def,uni,lwr,upr,des) (*units=uni, type="instance", desc=des*) parameter integer nam=def from(lwr:upr); - `define IPInb(nam,def,uni, des) (*units=uni, type="instance", desc=des*) parameter integer nam=def; - `define IPM parameter real m=1 from(0:inf); - `define TESTGIVEN(parameter) $param_given(parameter) - `define GIVEN(parameter,variable,true,false) \ - begin \ - if ($param_given(parameter)) \ - variable = true; \ - else \ - variable = false; \ - end -// `define SCALE \ -// begin \ -// if ($param_given(scale)) \ -// scaleFac = scale; \ -// else \ -// scaleFac = $simparam("scale",1.0); \ -// end -// `define SHRINKL \ -// begin \ -// if ($param_given(shrink)) \ -// shrinkL = 1.0-0.01*shrink; \ -// else \ -// shrinkL = 1.0-0.01*$simparam("shrink",0.0); \ -// end -// `define RTHRESH \ -// begin \ -// if ($param_given(rthresh)) \ -// rthrR2 = rthresh; \ -// else \ -// rthrR2 = $simparam("rthresh",1.0e-03); \ -// end -//`else // not__VAMS_COMPACT_MODELING__ -// `define ALIAS(alias,parameter) -// `ifdef insideADMS -// `define ERROR(str) \ -// begin \ -// $strobe(str); \ -// $finish(1); \ -// end -// `define WARNING(str) $strobe(str); -// `define OPP(nam,uni,des) real nam (*units=uni desc=des ask="yes"*); -// `define MPRcc(nam,def,uni,lwr,upr,des) parameter real nam=def from[lwr:upr] (*units=uni ask="yes" info=des*); -// `define MPRco(nam,def,uni,lwr,upr,des) parameter real nam=def from[lwr:upr) (*units=uni ask="yes" info=des*); -// `define MPRoc(nam,def,uni,lwr,upr,des) parameter real nam=def from(lwr:upr] (*units=uni ask="yes" info=des*); -// `define MPRoo(nam,def,uni,lwr,upr,des) parameter real nam=def from(lwr:upr) (*units=uni ask="yes" info=des*); -// `define MPRnb(nam,def,uni, des) parameter real nam=def (*units=uni ask="yes" info=des*); -// `define MPIcc(nam,def,uni,lwr,upr,des) parameter integer nam=def from[lwr:upr] (*units=uni ask="yes" info=des*); -// `define MPIco(nam,def,uni,lwr,upr,des) parameter integer nam=def from[lwr:upr) (*units=uni ask="yes" info=des*); -// `define MPIoc(nam,def,uni,lwr,upr,des) parameter integer nam=def from(lwr:upr] (*units=uni ask="yes" info=des*); -// `define MPIoo(nam,def,uni,lwr,upr,des) parameter integer nam=def from(lwr:upr) (*units=uni ask="yes" info=des*); -// `define MPInb(nam,def,uni, des) parameter integer nam=def (*units=uni ask="yes" info=des*); -// `define IPRcc(nam,def,uni,lwr,upr,des) parameter real nam=def from[lwr:upr] (*units=uni type="instance" ask="yes" info=des*); -// `define IPRco(nam,def,uni,lwr,upr,des) parameter real nam=def from[lwr:upr) (*units=uni type="instance" ask="yes" info=des*); -// `define IPRoc(nam,def,uni,lwr,upr,des) parameter real nam=def from(lwr:upr] (*units=uni type="instance" ask="yes" info=des*); -// `define IPRoo(nam,def,uni,lwr,upr,des) parameter real nam=def from(lwr:upr) (*units=uni type="instance" ask="yes" info=des*); -// `define IPRnb(nam,def,uni, des) parameter real nam=def (*units=uni type="instance" ask="yes" info=des*); -// `define IPIcc(nam,def,uni,lwr,upr,des) parameter integer nam=def from[lwr:upr] (*units=uni type="instance" ask="yes" info=des*); -// `define IPIco(nam,def,uni,lwr,upr,des) parameter integer nam=def from[lwr:upr) (*units=uni type="instance" ask="yes" info=des*); -// `define IPIoc(nam,def,uni,lwr,upr,des) parameter integer nam=def from(lwr:upr] (*units=uni type="instance" ask="yes" info=des*); -// `define IPIoo(nam,def,uni,lwr,upr,des) parameter integer nam=def from(lwr:upr) (*units=uni type="instance" ask="yes" info=des*); -// `define IPInb(nam,def,uni, des) parameter integer nam=def (*units=uni type="instance" ask="yes" info=des*); -// `define IPM parameter real m=1 from(0:inf) (*units="" type="instance" ask="yes" info="multiplicity factor"*); -// `define TESTGIVEN(parameter) $given(parameter) -// `define GIVEN(parameter,variable,true,false) \ -// begin \ -// if ($given(parameter)) \ -// variable = true; \ -// else \ -// variable = false; \ -// end -// `define SCALE \ -// begin \ -// if ($given(scale)) \ -// scaleFac = scale; \ -// else \ -// scaleFac = $scale; \ -// end -// `define SHRINKL \ -// begin \ -// if ($given(shrink)) \ -// shrinkL = 1.0-0.01*shrink; \ -// else \ -// shrinkL = $shrinkl("m"); \ -// end -// `define RTHRESH rthrR2 = rthresh; -// `else // notInsideADMS -// `define ERROR(str) \ -// begin \ -// $strobe(str); \ -// $finish(1); \ -// end -// `define WARNING(str) $strobe(str); -// `define OPP(nam,uni,des) real nam; -// `define MPRcc(nam,def,uni,lwr,upr,des) parameter real nam=def from[lwr:upr]; -// `define MPRco(nam,def,uni,lwr,upr,des) parameter real nam=def from[lwr:upr); -// `define MPRoc(nam,def,uni,lwr,upr,des) parameter real nam=def from(lwr:upr]; -// `define MPRoo(nam,def,uni,lwr,upr,des) parameter real nam=def from(lwr:upr); -// `define MPRnb(nam,def,uni, des) parameter real nam=def; -// `define MPIcc(nam,def,uni,lwr,upr,des) parameter integer nam=def from[lwr:upr]; -// `define MPIco(nam,def,uni,lwr,upr,des) parameter integer nam=def from[lwr:upr); -// `define MPIoc(nam,def,uni,lwr,upr,des) parameter integer nam=def from(lwr:upr]; -// `define MPIoo(nam,def,uni,lwr,upr,des) parameter integer nam=def from(lwr:upr); -// `define MPInb(nam,def,uni, des) parameter integer nam=def; -// `define IPRcc(nam,def,uni,lwr,upr,des) parameter real nam=def from[lwr:upr]; -// `define IPRco(nam,def,uni,lwr,upr,des) parameter real nam=def from[lwr:upr); -// `define IPRoc(nam,def,uni,lwr,upr,des) parameter real nam=def from(lwr:upr]; -// `define IPRoo(nam,def,uni,lwr,upr,des) parameter real nam=def from(lwr:upr); -// `define IPRnb(nam,def,uni, des) parameter real nam=def; -// `define IPIcc(nam,def,uni,lwr,upr,des) parameter integer nam=def from[lwr:upr]; -// `define IPIco(nam,def,uni,lwr,upr,des) parameter integer nam=def from[lwr:upr); -// `define IPIoc(nam,def,uni,lwr,upr,des) parameter integer nam=def from(lwr:upr]; -// `define IPIoo(nam,def,uni,lwr,upr,des) parameter integer nam=def from(lwr:upr); -// `define IPInb(nam,def,uni, des) parameter integer nam=def; -// `define IPM parameter real m=1 from(0:inf); -// `define TESTGIVEN(parameter) 1 -// `define GIVEN(parameter,variable,true,false) variable = true; - `define SCALE scaleFac = scale; - `define SHRINKL shrinkL = 1.0-0.01*shrink; - `define RTHRESH rthrR2 = rthresh; -// `endif -//`endif diff --git a/src/spicelib/devices/adms/r2_cmc/admsva/r2_cmc.va b/src/spicelib/devices/adms/r2_cmc/admsva/r2_cmc.va deleted file mode 100644 index c225268ec..000000000 --- a/src/spicelib/devices/adms/r2_cmc/admsva/r2_cmc.va +++ /dev/null @@ -1,898 +0,0 @@ -`include "cmcModels.inc" - -// -// Set up two versions of the model (which is defined in the -// file r2_cmc_core.va), an isothermal model and an electrothermal model. -// - -//`define electroThermal - -`define LEVEL 1002 -`define GFORM // if GFORM is defined an I=V*g formulation is used, else a V=I*r formulation is used -`define VERSION 1.0 -`define REVISION 0.0 - -// -// r2[_et]_cmc: Compact Model Council (CMC) 2-terminal Resistor Model -// -// This is the 2-terminal resistor model developed by the resistor -// subcommittee of the CMC. The goal was to have a standard 2-terminal -// resistor model with standard parameter names and a standard, -// numerically well behaved nonlinearity model. -// -// The nonlinearity model is that proposed by Agere Systems -// (from Kausar Banoo, Kumud Singhal, and Hermann Gummel). -// -// A self-heating (electro-thermal) version is included via conditionals. -// It is anticipated that this will be provided as a separate -// form of the model (r2_et_cmc where "et" means electro-thermal) -// and the local temperature rise terminal will be made available -// optionally, this has been requested for resistors in power -// technologies. The non-self-heating form, r2_cmc, is expected to -// be available as a new level model (the level number assigned -// depending on what level models are already available within -// a simulator, the value of 2 used here is an example). -// - -// -// Version 1.0 -// Revision 0.0 -// Date 2005 Nov 12 -// Comments Model as approved at Oct 2005 CMC meeting -// - notes from Agere systems added to documentation -// -// Version 1.0 -// Revision 0.0_preview3 -// Date 2005 Oct 08 -// Comments Updates based on second round of comments -// - electrothermal model name changed to r2_et_cmc so the -// _cmc tag would be at the end -// - top-level calling structure changed to make addition -// of other models more structured, and have all information -// directly relevant to r2[_et]_cmc in this file -// - LEVEL and other parameters moved to this file rather than -// the top-level file for the same reason, and LEVEL was -// set to the value 1002 -// - single line if statements have begin ... end added for safety -// and consistency of style -// - linear TC added for flicker noise coefficient -// - notes and documentation added that -// tc1, tc2, c1, c2, isnoisy -// should be both instance and model parameters -// - tc1e and tc2e (the effective temperature coefficients of resistance) -// were updated to include a width dependence and to -// have a length dependence that varies with c1 and c2 -// - added an instance parameter switch sw_et to enable the self-heating -// model to be turned off -// - added min and max parameters for length and width, and if -// a drawn geometry is outside these limits then a warning is issued -// - handling of tmin and tmax changed: -// specific clipping limits added (used for self-heating) -// warnings added if ambient temperature is outside the limits -// clipping of temperature to limits changed to be smooth -// - temperature coefficient of resistance clamped smoothly -// rather than having a hard limit -// -// Version 1.0 -// Revision 0.0_preview2 -// Date 2005 Sep 02 -// Comments Updates based on first round of comments -// - changed name to r2_cmc from cmc_r2 -// - fixed up improperly defined variables -// - modified some names for consistency with documentation -// - set up a top-level file that up both -// isoThermal and electroThermal versions are defined -// - set switch to resistance form to be done based on -// resistance at tnom, so the form does not change -// during a temperature sweep -// - fixed errors in LRM2.2 code -// -// Version 1.0 -// Revision 0.0_preview1 -// Date 2005 Jul 01 -// Comments Initial code for review by CMC resistor subcommittee -// - -// -// Instance parameters are: -// m multiplicity factor (number in parallel, implicit for LRM2.2) -// w design width of resistor body -// l design length of resistor body -// r resistance (per segment, total resistance is r/m) -// c1 contact at terminal 1: 0=no 1=yes -// c2 contact at terminal 2: 0=no 1=yes -// trise local temperature delta to ambient (before self-heating) -// isnoisy switch for noise: 0=no 1=yes -// - -// -// The c1 and c2 parameters control the addition of "end" effects -// to the model. If these are both zero ("no contact") then no end -// effects are added. If only one is non-zero 1/2 the end effects are -// added. If both are non-zero full end effects are added. This -// is to facilitate the implementation of multi-section models in a -// subckt. c1=c2=0 for all internal sections, c1=0,c2=1 for the -// "left" end segment, c1=1,c2=0 for the "right" end segment. -// -// The basic nonlinearity is: -// -// R=R0*(1-p2-p3+p2*sqrt(1+(q2*E)**2)+p3*cbrt(1+(q3*abs(E))**3)) -// -// where cbrt() is the cube root operation. The use -// of abs(E) leads to a singularity in higher order derivatives, -// but because of the power of the term it does not show up -// until the 4th derivative of the current. -// -// For q3*abs(E) somewhat greater than 1, the p3,q3 term -// leads a resistance factor of (1+p3*(q3*abs(E)-1)) so p3*q3 -// is in essence a first order field coefficient of -// resistance. -// For q2*E somewhat less than 1, the p2,q2 term leads to a -// resistance factor (1+0.5*p2*(q2*E)**2) so 0.5*p2*q2**2 is in essence -// a second order field coefficient of resistance. -// The bias dependent nonlinearity is done via field rather than voltage, -// to get reasonable scaling with length. -// -// There is no explicit handling of end resistances, they are assumed -// to be accounted for by xl. If there is a difference between the TC's -// of the end resistance compared to the body resistance, it can be shown that -// TC_overall=TC_body+Rend*(TC_end-TC_body)/(rsh*(L+xl)) -// therefore a 1/length term is included for the TCs to allow this effect -// to be modeled. -// -// Some Verilog-A compilers have difficulties handling the contrib type -// switch based on resistance value. Conditional switches have been -// put in this code to handle this for now. Comment out the `define GFORM -// line at the top to switch to the resistance form. -// - -// -// Usage with model: -// instanceId (n1 n2) modelName l=L w=W [trise=TRISE] [m] -// model modelName r[esistor] -// + level=assignedLevelForR2_CmcModel -// + param=value -// OR (for simulators that use model names rather than levels) -// model modelName r2_cmc -// + param=value -// (NOTE: specify any two of w,l,r and the other will be calculated). -// -// Usage without model: -// instanceId (n1 n2) r[esistor] r=value [trise=TRISE] [m] -// -// If this model is used with only r specified, then the geometry is taken -// to be w/l=1um/1um and these values are used for 1/f noise calculation. -// Note that this then means the 1/f noise is not geometry dependent, -// which is incorrect. For proper modeling of 1/f noise you -// should use the form where two of w,l,r are specified as instance parameters. -// -// The following parameters should be treated as model or instance parameters, -// with instance parameter specification over-riding model parameter specification: -// tc1 -// tc2 -// c1 -// c2 -// isnoisy -// There is no construct in Verilog-A for denoting this, but this should be -// implemented as such within a simulator. -// - -// -// Verilog-A Notes: -// -// 1. It is expected that, to be able to handle small- and zero-value resistances, -// the model implementation will transform from an I=G*V form for higher resistance -// values to a V=I*R form for lower resistance values. The switch should be based -// on zero-bias resistance, not voltage (and, for the self-heating version temperature) -// dependent resistance, to avoid changing the model formulation during simulation. -// The "G" or "R" formulation should be determined once at set-up and kept from then on. -// The current and voltage calculations are separated from noise calculations, -// to partition code for implementation efficiency. This causes errors with some -// Verilog-A compilers, as they think the contribution type can switch between -// various parts of the code. Therefore the switch is done using the macro `GFORM, -// and commented equivalent Verilog-A code is included, to indicate the intent. -// -// 2. There is no way to implement the LRM2.2 $param_given() function in -// LRM2.1 code, the concept is not part of the language. Therefore the -// model ONLY works with w,l specified as instance parameters when run -// in an LRM2.1 compliant compiler. Also, although the "m" parameter is -// known for LRM2.2, it apparently still needs to be declared explicity -// as a model parameter. -// -// 3. When testing with the R form of the model, there are some differences in -// simulation results w.r.t. the G form of the model, which was used to generate -// the reference test results. These appear to be from slight differences in convergence. -// -// Apologies for the nested conditionals. It makes the code hard to read, but is -// needed as there are different possible forms (isothermal, electrothermal; -// conductance form, resistance form) as well as different syntax for different -// language versions. -// -// There is no `ifndef XXX in Verilog-A, the "notXXX" macros are defined for convenience. -// - -`ifdef electroThermal - `ifdef notElectroThermal - `undef notElectroThermal - `endif -`else - `define notElectroThermal -`endif - -`ifdef electroThermal - module r2_et_cmc(n1,n2); -`else - module r2_cmc(n1,n2); -`endif -//`ifdef insideADMS -// (* -// info="r2_cmc two-terminal resistor model" -// version="`VERSION" -// revision="`REVISION" -// spice:prefix="r" -// spice:level="`LEVEL" -// *) -//`endif -//; - -// -// Node definitions (if the self-heating modeling is selected, the -// local temperature rise node is internal, and not external) -// - -inout n1,n2; -electrical n1; -electrical n2; -`ifdef electroThermal - electrical dt; -`endif - -// -// Branch definitions -// - -branch (n1,n2) b_r; // resistance -branch (n1,n2) b_n; // separate definition for noise, which is always a current contribution -`ifdef electroThermal - branch (dt) b_rth; // thermal resistance - branch (dt) b_ith; // thermal generation, 2nd definition is to fool floating node detection in some compilers -`endif - -// -// Instance parameters -// - -`IPM -`IPRco( w , 1.0e-06,"m" , 0.0, inf, "design width of resistor body") -`IPRco( l , 1.0e-06,"m" , 0.0, inf, "design length of resistor body") -`IPRco( r , 100.0 ,"Ohm" , 0.0, inf, "resistance (per segment, total resistance is r/m)") -`IPIcc( c1 , 1 ,"" , 0, 1, "contact at terminal 1: 0=no 1=yes") -`IPIcc( c2 , 1 ,"" , 0, 1, "contact at terminal 2: 0=no 1=yes") -`IPRnb( trise , 0.0 ,"degC" , "local temperature delta to ambient (before self-heating)") -`IPIcc( isnoisy , 1 ,"" , 0, 1, "switch for noise: 0=no and 1=yes") -`ifdef electroThermal - `IPIcc( sw_et , 1 ,"" , 0, 1, "switch for turning off self-heating: 0=exclude and 1=include") -`endif - -// -// Special model parameters, some may be simulator global parameters -// - -`MPRnb( version , `VERSION ,"" , "model version") -`MPRnb( revision, `REVISION,"" , "model revision (subversion)") -`MPRoc( scale , 1.0 ,"" , 0.0, 1.0, "scale factor for instance geometries") -`MPRco( shrink , 0.0 ,"%" , 0.0, 100.0, "shrink percentage for instance geometries") -`MPRcc( tmin ,-100.0 ,"degC" ,-250.0, 27.0, "minimum ambient temperature") -`MPRcc( tmax , 500.0 ,"degC" , 27.0,1000.0, "maximum ambient temperature") -`MPRoo( rthresh , 1.0e-03,"Ohm" , 0.0, inf, "threshold to switch to resistance form") - -// -// Model parameters -// - -`MPRnb( level , `LEVEL ,"" , "model level") -`MPRcc( tnom , 27.0 ,"degC" ,-250.0,1000.0, "nominal (reference) temperature") -`MPRoo( rsh , 100.0 ,"Ohm/sq" , 0.0, inf, "sheet resistance") -`MPRco( lmin , 0.0 ,"um" , 0.0, inf, "minimum allowed drawn length") -`MPRoo( lmax , 9.9e09 ,"um" , 0.0, inf, "maximum allowed drawn length") -`MPRco( wmin , 0.0 ,"um" , 0.0, inf, "minimum allowed drawn width") -`MPRoo( wmax , 9.9e09 ,"um" , 0.0, inf, "maximum allowed drawn width") -`MPRnb( xw , 0.0 ,"um" , "width offset (total)") -`MPRnb( xl , 0.0 ,"um" , "length offset (total)") -`MPRnb( dxle , 0.0 ,"um" , "length delta for field calculation") -`MPIcc( sw_efgeo, 0 ,"" , 0, 1, "switch for electric field geometry calculation: 0=design and 1=effective") -`MPRco( q3 , 0.0 ,"um/V" , 0.0, inf, "1/field at which the linear field coefficient activates") -`MPRco( p3 , 0.0 ,"" , 0.0, 1.0, "linear field coefficient factor: EC1=p3*q3") -`MPRco( q2 , 0.0 ,"um/V" , 0.0, inf, "1/field at which the quadratic field coefficient activates") -`MPRco( p2 , 0.0 ,"" , 0.0,1.0-p3, "quadratic field coefficient factor: EC2=0.5*p2*q2^2") -`MPRco( kfn , 0.0 ,"" , 0.0, inf, "flicker noise coefficient (unit depends on afn)") -`MPRoo( afn , 2.0 ,"" , 0.0, inf, "flicker noise current exponent") -`MPRoo( bfn , 1.0 ,"" , 0.0, inf, "flicker noise 1/f exponent") -`MPIcc( sw_fngeo, 0 ,"" , 0, 1, "switch for flicker noise geometry calculation: 0=design and 1=effective") -`MPRoo( jmax , 100.0 ,"A/um" , 0.0, inf, "maximum current density") -`MPRcc( tminclip,-100.0 ,"degC" ,-250.0, 27.0, "clip minimum temperature") -`MPRcc( tmaxclip, 500.0 ,"degC" , 27.0,1000.0, "clip maximum temperature") -`MPRnb( tc1 , 0.0 ,"/K" , "resistance linear TC") -`MPRnb( tc2 , 0.0 ,"/K^2" , "resistance quadratic TC") -`MPRnb( tc1l , 0.0 ,"um/K" , "resistance linear TC length coefficient") -`MPRnb( tc2l , 0.0 ,"um/K^2" , "resistance quadratic TC length coefficient") -`MPRnb( tc1w , 0.0 ,"um/K" , "resistance linear TC width coefficient") -`MPRnb( tc2w , 0.0 ,"um/K^2" , "resistance quadratic TC width coefficient") -`MPRnb( tc1kfn , 0.0 ,"" , "flicker noise coefficient linear TC") -`ifdef electroThermal - `MPRoo( gth0 , 1.0e+06,"W/K" , 0.0, inf, "thermal conductance fixed component") - `MPRco( gthp , 0.0 ,"W/K/um" , 0.0, inf, "thermal conductance perimeter component") - `MPRco( gtha , 0.0 ,"W/K/um^2" , 0.0, inf, "thermal conductance area component") - `MPRco( cth0 , 0.0 ,"s*W/K" , 0.0, inf, "thermal capacitance fixed component") - `MPRco( cthp , 0.0 ,"s*W/K/um" , 0.0, inf, "thermal capacitance perimeter component") - `MPRco( ctha , 0.0 ,"s*W/K/um^2", 0.0, inf, "thermal capacitance area component") -`endif - -// -// Supported aliases for parameters -// - -`ALIAS(dtemp,trise) -`ALIAS(dta,trise) - -// -// These variables will be displayed as part of operating point information. -// - -`OPP( v_OP ,"V" ,"voltage across resistor") -`OPP( i_OP ,"A" ,"current through resistor") -`OPP( power_OP ,"W" ,"dissipated power") -`OPP( leff ,"um" ,"effective electrical length in um") -`OPP( weff ,"um" ,"effective electrical width in um") -`OPP( r0_OP ,"Ohm" ,"zero-bias resistance (per segment)") -`OPP( r_dc_OP ,"Ohm" ,"DC resistance (including bias dependence and m)") -`OPP( r_ac_OP ,"Ohm" ,"AC resistance (including bias dependence and m)") -`ifdef electroThermal - `OPP( rth ,"K/W" ,"thermal resistance") - `OPP( cth ,"s*W/K","thermal capacitance") - `OPP( dt_et ,"K" ,"self-heating temperature rise") -`endif - -`ifdef notInsideADMS - analog begin : analogBlock -`endif - - real i, v, power, r0, weff_um, leff_um, r_dc, r_ac; - - real tiniK,tdevK,scaleFac,shrinkL,delt,tcr,xleff; - real lFactor,l_um,w_um,l_umForE,g0,r0_t,g0_t,kfn_t; - real sqrf,cbrf,tdevC,wn,fn,rthrR2; - real rFactor,vin,E,q2E,q3E,tc1e,tc2e; - integer GFORM; - `ifdef __VAMS_COMPACT_MODELING__ - `ifdef GFORM - real g_ac; - `else - real drfdv; - `endif - `else - real drfdv,g_ac; - `endif - `ifdef electroThermal - real gth,Vrth,Ith,Irth,Qcth,p_um,a_um2,dg0dt,tmp1; - `endif - - // - // Code independent of bias or instance parameters - // - -`ifdef insideADMS - analog begin - @(initial_instance) begin -`else - begin : initializeModel -`endif - if (level!=`LEVEL) begin - `ERROR("ERROR: r2 model called with incorrect level parameter") - end - `SCALE - `SHRINKL - `RTHRESH - lFactor = shrinkL*scaleFac*1.0e6; // conversion factor from instance l to um - tiniK = `TABS_NIST2004+tnom; - tdevC = $temperature+trise-`TABS_NIST2004; // device temperature - if (tdevCtmax) begin - `WARNING("WARNING: ambient temperature is higher than allowed maximum"); - end - `ifdef notElectroThermal - `CLIPB1p0(tdevC,tdevC,tminclip,tmaxclip); - tdevK = tdevC+`TABS_NIST2004; - delt = tdevK-tiniK; // temperature w.r.t. tnom - kfn_t = (1+delt*tc1kfn)*kfn; - if (kfn_t<0.0) begin - kfn_t = 0.0; - end - `endif -// end // initializeModel - - // - // Code independent of bias but dependent on instance parameters - // - -//`ifdef insideADMS -// @(initial_instance) begin -//`else -// begin : initializeInstance -//`endif - if (c1&&c2) begin - xleff = xl; // contacted at both ends, use full xl - end else if (c1||c2) begin - xleff = xl*0.5; // contacted at one end, include 1/2 of xl effect - end else begin - xleff = 0.0; // not contacted - end - - // - // For geometric processing, the order of importance is taken to be - // w,l,r. The evaluation of whether a V contrib should be used, for - // low resistance, rather than the usual I contrib, is based on - // calculations at nominal temperature and zero bias, and so will - // not cause a formulation switch with bias. The cases where - // conductance or resistance are zero is handled. - // - - if (`TESTGIVEN(l)&&`TESTGIVEN(r)&&!`TESTGIVEN(w)) begin - - // - // If l and r are specified, but w is not, then calculate w - // (if w is also specified, this over-rides the specified r) - // - - if (r==0.0||l==0.0) begin - l_um = 0.0; - leff_um = 0.0; - w_um = w*lFactor; - weff_um = w_um+xw; // this could be negative, but has no effect so is not flagged as `ERROR - r0 = 0.0; - g0 = 1.0e99; // cannot set to inf - end else begin - l_um = l*lFactor; - leff_um = l_um+xleff; - if (leff_um<0.0) begin - `ERROR("ERROR: calculated effective r2_cmc resistor length is < 0.0") - end - if (leff_um>0.0) begin - weff_um = (rsh/r)*leff_um; - w_um = weff_um-xw; - if (w_um<=0.0) begin - `ERROR("ERROR: calculated design r2_cmc resistor width is <= 0.0") - end - r0 = r; - g0 = 1.0/r0; - end else begin - w_um = w*lFactor; - weff_um = w_um+xw; // this could be negative, but has no effect so is not flagged as `ERROR - r0 = 0.0; - g0 = 1.0e99; // cannot set to inf - end - end - end else if (`TESTGIVEN(r)&&!`TESTGIVEN(l)) begin - - // - // If r is specified, but l is not, calculate l based on either - // a specified or the default w (it does not matter which), - // this also handles the case of usage without a .model card - // - - if (r==0.0) begin - l_um = 0.0; - leff_um = 0.0; - w_um = w*lFactor; - weff_um = w_um+xw; // this could be negative, but has no effect so is not flagged as `ERROR - r0 = 0.0; - g0 = 1.0e99; // cannot set to inf - end else if (w==0.0) begin - w_um = 0.0; - weff_um = 0.0; - l_um = l*lFactor; - leff_um = l_um+xleff; // this could be negative, but has no effect so is not flagged as `ERROR - r0 = 1.0e99; // cannot set to inf - g0 = 0.0; - end else begin - w_um = w*lFactor; - weff_um = w_um+xw; - if (weff_um<0.0) begin - `ERROR("ERROR: calculated effective r2_cmc resistor width is < 0.0") - end - if (weff_um>0.0) begin - leff_um = (r/rsh)*weff_um; - l_um = leff_um-xleff; - if (l_um<=0.0) begin - `ERROR("ERROR: calculated design r2_cmc resistor length is <= 0.0") - end - r0 = r; - g0 = 1.0/r0; - end else begin - l_um = l*lFactor; - leff_um = l_um+xleff; // this could be negative, but has no effect so is not flagged as `ERROR - r0 = 1.0e99; // cannot set to inf - g0 = 0.0; - end - end - end else begin - - // - // For all other cases, r is calculated as a function of - // geometry, either specified or default. Either l and w - // are both specified, in which case they over-ride - // specification of r, or else r is not specified. - // - - if (w==0.0) begin - w_um = 0.0; - weff_um = 0.0; - l_um = l*lFactor; - leff_um = l_um+xleff; // this could be negative, but has no effect so is not flagged as `ERROR - r0 = 1.0e99; // cannot set to inf - g0 = 0.0; - end else if (l==0.0) begin - l_um = 0.0; - leff_um = 0.0; - w_um = w*lFactor; - weff_um = w_um+xw; // this could be negative, but has no effect so is not flagged as `ERROR - r0 = 0.0; - g0 = 1.0e99; // cannot set to inf - end else begin - w_um = w*lFactor; - weff_um = w_um+xw; - if (weff_um<0.0) begin - `ERROR("ERROR: calculated effective r2_cmc resistor width is < 0.0") - end - l_um = l*lFactor; - leff_um = l_um+xleff; - if (weff_um>0.0) begin - if (leff_um<0.0) begin - `ERROR("ERROR: calculated effective r2_cmc resistor length is < 0.0") - end - if (leff_um>0.0) begin - r0 = rsh*(leff_um/weff_um); - g0 = 1.0/r0; - end else begin - r0 = 0.0; - g0 = 1.0e99; // cannot set to inf - end - end else begin - r0 = 1.0e99; // cannot set to inf, also don't need to check if(leff_um>0.0) for this case - g0 = 0.0; - end - end - end - if (l_umlmax) begin - `WARNING("WARNING: drawn length is greater than allowed maximum"); - end - if (w_umwmax) begin - `WARNING("WARNING: drawn width is greater than allowed maximum"); - end - if (sw_efgeo) begin - l_umForE = leff_um+dxle; - end else begin - l_umForE = l_um+dxle; - end - if (l_umForE<=0.0&&r0>0.0&&(p2>0.0||p3>0.0)) begin - `ERROR("ERROR: calculated effective r2_cmc resistor length for E calculation is < 0.0") - end - tc1e = tc1; - tc2e = tc2; - if (leff_um>0.0) begin - if (c1&&c2) begin - tc1e = tc1e+tc1l/leff_um; - tc2e = tc2e+tc2l/leff_um; - end else if (c1||c2) begin - tc1e = tc1e+0.5*tc1l/leff_um; - tc2e = tc2e+0.5*tc2l/leff_um; - end - end - if (weff_um>0.0) begin - tc1e = tc1e+tc1w/weff_um; - tc2e = tc2e+tc2w/weff_um; - end - `ifdef __VAMS_COMPACT_MODELING__ - if (r0>(rthrR2/$mfactor)) begin - `else - if (r0>(rthrR2/m)) begin - `endif - GFORM = 1; - end else begin - GFORM = 0; - end - `ifdef electroThermal - if (c1&&c2) begin - p_um = 2.0*(l_um+w_um); - end else if (c1||c2) begin - p_um = 2.0*l_um+w_um; - end else begin - p_um = 2.0*l_um; - end - a_um2 = l_um*w_um; - gth = gth0+gthp*p_um+gtha*a_um2; - cth = cth0+cthp*p_um+ctha*a_um2; - `else // notElectroThermal - tcr = (1+delt*(tc1e+delt*tc2e)); - `CLIPL0p1(tcr,tcr,0.01) - r0_t = r0*tcr; - g0_t = g0/tcr; - `endif - end // initialInstance - - // - // DC bias dependent quantities - // - // Note that for the resistance form the expression for v(i) - // is implicit in v because of the voltage dependence of conductance. - // For efficiency the nonlinearity is not computed if the - // field coefficients are zero. - // - - begin : evaluateStatic - `ifdef electroThermal - Vrth = sw_et*V(b_rth); - tdevC = tdevC+Vrth; - `CLIPB1p0(tdevC,tdevC,tminclip,tmaxclip); - tdevK = tdevC+`TABS_NIST2004; - delt = tdevK-tiniK; // temperature w.r.t. tnom - tcr = (1+delt*(tc1e+delt*tc2e)); - `CLIPL0p1(tcr,tcr,0.01) - r0_t = r0*tcr; - g0_t = g0/tcr; - kfn_t = (1+delt*tc1kfn)*kfn; - if (kfn_t<0.0) begin - kfn_t = 0.0; - end - `endif - vin = V(b_r); - if (r0>0.0&&(p2>0.0||p3>0.0)) begin - E = vin/l_umForE; - q2E = q2*E; - sqrf = sqrt(1.0+q2E*q2E); - q3E = q3*abs(E); - cbrf = pow((1.0+q3E*q3E*q3E),`oneThird); - rFactor = 1.0-p2-p3+p2*sqrf+p3*cbrf; - end else - rFactor = 1.0; - r_dc = r0_t*rFactor; - `ifdef GFORM // if (GFORM) begin - v = vin; - i = v/r_dc; - `else // end else begin // RFORM - `ifdef __VAMS_COMPACT_MODELING__ - i = I(b_r); - `else - i = I(b_r)/m; // need per-segment value - `endif - v = i*r_dc; - `endif // end - `ifdef electroThermal - Ith = -v*i; // power generation, negative as it flows from dt to 0 - Irth = Vrth*gth; - `endif - if (weff_um>0.0) begin - if (abs(i/weff_um)>jmax) begin - `WARNING("WARNING: current density is greater than specified by jmax"); - end - end - end // evaluateStatic - - begin : evaluateDynamic - `ifdef electroThermal - Qcth = Vrth*cth; - `endif - end // evaluateDynamic - - begin : loadStatic - `ifdef GFORM // if (GFORM) begin - `ifdef __VAMS_COMPACT_MODELING__ - I(b_r) <+ i; - `else - I(b_r) <+ i*m; - `endif - `else // end else begin // RFORM - V(b_r) <+ v; - `endif // end - `ifdef electroThermal - `ifdef __VAMS_COMPACT_MODELING__ - I(b_rth) <+ Irth; - I(b_ith) <+ Ith; - `else - I(b_rth) <+ Irth*m; - I(b_ith) <+ Ith*m; - `endif - `endif - end // loadStatic - - begin : loadDynamic - `ifdef electroThermal - `ifdef __VAMS_COMPACT_MODELING__ - I(b_rth) <+ ddt(Qcth); - `else - I(b_rth) <+ ddt(Qcth*m); - `endif - `endif - end // loadDynamic - - // - // Noise contributions - // - - `ifdef insideADMS - @(noise) begin - `else - begin : noise - `endif - if (isnoisy&&r0>0.0&&g0>0.0) begin - wn = 4.0*`KB_NIST2004*tdevK*g0_t/rFactor; - if (sw_fngeo&&leff_um>0.0&&weff_um>0.0) begin - fn = kfn_t*pow(abs(i/weff_um),afn)*weff_um/leff_um; - end else if (l_um>0.0&&w_um>0.0) begin - fn = kfn_t*pow(abs(i/w_um),afn)*w_um/l_um; - end else begin - fn = 0.0; - end - end else begin - wn = 0.0; - fn = 0.0; - end - `ifdef not__VAMS_COMPACT_MODELING__ - wn = wn*m; - fn = fn*m; - `endif - I(b_n) <+ white_noise(wn,"white noise"); - I(b_n) <+ flicker_noise(fn,bfn,"1/f noise"); - end // noise - - // - // Useful quantities to display for OP and other purposes - // - // LRM2.2 allows use of ddx() which means explicit, hand-coded - // calculation of derivatives is not required. However for the - // electroThermal model the derivatives need to be calculated - // as the total derivative is required for display, not just - // the partial with respect to terminal voltages or branch - // currents (which is all that is available from ddx()). - // - // For: i=v*g0_t/rf(v) (where rf is a short-hand for rFactor) - // g_ac=di_dv=g0_t/rf-g0_t*v*drf_dv/rf^2=(g0_t-i*drf_dv)/rf - // - // For: v=i*r0_t*rf(v) - // r_ac=dv_di=r0_t*rf+i*r0_t*drf_dv*dv_di=ddx(v,I(b_r))+(v*drf_dv/rf)*r_ac - // therefore - // r_ac=ddx(v,I(b_r))/(1-v*drf_dv/rf) - // - // For the electroThermal conductance form model: - // i=v*g0(t)/rf(v) - // g0(t)=g0/tcr=g0/(1+delt*(tc1e+delt*tc2e)) - // delt=i*v/gth - // therefore - // ddelt_dv=i/gth+(v/gth)*di_dv - // dg0_dt=ddx(g0_t,V(dt))=g0(t)*(tc1e+2*delt*tc2e)/tcr - // di_dv=ddx(i,V(n1))+(v/rf)*dg0_dt*di_dv - // g_ac=(ddx(i,V(n1))+i*v*dg0_dt/(gth*rf))/(1-v*v*dg0_dt/(gth*rf)) - // which is what is implemented below. - // - // For the electroThermal resistance form model: - // v=i*r0(t)*rf(v) - // r0(t)=r0*tcr=r0*(1+delt*(tc1e+delt*tc2e)) - // delt=i*v/gth - // therefore - // ddelt_i=v/gth+(i/gth)*dv_di - // dr0_dt=ddx(r0_t,V(dt))=r0*(tc1e+2*delt*tc2e) - // dv_di=ddx(v,I(b_r))+i*r0*drf_dv*dv_di+i*rf*dr0_dt*ddelt_di - // r_ac=(ddx(v,I(b_r))+v*i*rf*dr0_dt/gth)/(1-v*drf_dv/rf-i*i*rf*dr0_dt/gth) - // which is what is implemented below. - // - - begin : postProcess - power = i*v; - if (r0>0.0&&g0>0.0) begin - r_dc = r0_t*rFactor; - `ifdef __VAMS_COMPACT_MODELING__ - `ifdef GFORM // if (GFORM) begin - g_ac = ddx(i,V(n1)); - `ifdef electroThermal - dg0dt = ddx(g0_t,V(dt)); - tmp1 = v*dg0dt/(gth*rFactor); - if ((1.0-v*tmp1)!=0.0) begin - g_ac = (g_ac+i*tmp1)/(1.0-v*tmp1); // denominator is zero in thermal runaway, cannot happen if tcr>0 - end else begin - g_ac = 1.0e99; - end - `endif - if (g_ac!=0.0) begin - r_ac = 1.0/g_ac; - end else begin - r_ac = 1.0e99; - end - `else // end else begin // RFORM - drfdv = ddx(rFactor,V(n1)); - `ifdef electroThermal - dg0dt = 1.0/ddx(r0_t,V(dt)); - tmp1 = i*rFactor/(dg0dt*gth); - if ((1.0-v*drfdv/rFactor-i*tmp1)!=0.0) begin - r_ac = (ddx(v,I(b_r))+v*tmp1)/(1.0-v*drfdv/rFactor-i*tmp1); - end else begin - r_ac = 1.0e99; - end - `else // notElectroThermal - r_ac = ddx(v,I(b_r))/(1.0-v*drfdv/rFactor); - `endif - `endif // end - `else // not__VAMS_COMPACT_MODELING__ - if ((p2>0.0||p3>0.0)) begin - if (vin>=0.0) - drfdv = (p2*q2*q2E/sqrf+p3*q3*q3E*q3E/(cbrf*cbrf))/l_umForE; - else - drfdv = (p2*q2*q2E/sqrf-p3*q3*q3E*q3E/(cbrf*cbrf))/l_umForE; - g_ac = (g0_t-i*drfdv)/rFactor; - end else - g_ac = 1.0/r_dc; - `ifdef electroThermal - dg0dt = -g0_t*(tc1e+2.0*delt*tc2e)/tcr; - tmp1 = v*dg0dt/(gth*rFactor); - if ((1.0-v*tmp1)!=0.0) begin - g_ac = (g_ac+i*tmp1)/(1.0-v*tmp1); // denominator is zero in thermal runaway, cannot happen if tcr>0 - end else begin - g_ac = 1.0e99; - end - `endif - if (g_ac!=0.0) begin - r_ac = 1.0/g_ac; - end else begin - r_ac = 1.0e99; - end - `endif - end else begin - r_dc = r0; // this is 1.0e99 if g0==0.0, cannot set to inf - r_ac = r0; // this is 1.0e99 if g0==0.0, cannot set to inf - end - `ifdef __VAMS_COMPACT_MODELING__ - // i = $mfactor*i; - // power = $mfactor*power; - // r_dc = r_dc/$mfactor; - // r_ac = r_ac/$mfactor; - i = 1*i; - power = 1*power; - r_dc = r_dc/1; - r_ac = r_ac/1; - `else // not__VAMS_COMPACT_MODELING__ - i = m*i; - power = m*power; - r_dc = r_dc/m; - r_ac = r_ac/m; - `endif - `ifdef electroThermal - dt_et = Vrth; - `ifdef __VAMS_COMPACT_MODELING__ - // rth = 1.0/(gth*$mfactor); - // cth = cth*$mfactor; - rth = 1.0/(gth*1); - cth = cth*1; - `else // not__VAMS_COMPACT_MODELING__ - rth = 1.0/(gth*m); - cth = cth*m; - `endif - `endif - power_OP = power; - v_OP = v; - i_OP = i; - r0_OP = r0; - weff = weff_um; - leff = leff_um; - r_dc_OP = r_dc; - r_ac_OP = r_ac; - end // postProcess - - end // analog -endmodule diff --git a/src/spicelib/devices/asrc/Makefile.am b/src/spicelib/devices/asrc/Makefile.am deleted file mode 100644 index 11b2b2701..000000000 --- a/src/spicelib/devices/asrc/Makefile.am +++ /dev/null @@ -1,27 +0,0 @@ -## Process this file with automake to produce Makefile.in - -noinst_LTLIBRARIES = libasrc.la - -libasrc_la_SOURCES = \ - asrc.c \ - asrcacld.c \ - asrcask.c \ - asrcconv.c \ - asrcdefs.h \ - asrcdel.c \ - asrcdest.c \ - asrcext.h \ - asrcfbr.c \ - asrcitf.h \ - asrcinit.c \ - asrcinit.h \ - asrcload.c \ - asrcpar.c \ - asrcpzld.c \ - asrcset.c \ - asrctemp.c - - -AM_CPPFLAGS = @AM_CPPFLAGS@ -I$(top_srcdir)/src/include -AM_CFLAGS = $(STATIC) -MAINTAINERCLEANFILES = Makefile.in diff --git a/src/spicelib/devices/asrc/asrc.c b/src/spicelib/devices/asrc/asrc.c deleted file mode 100644 index 0d949d2cd..000000000 --- a/src/spicelib/devices/asrc/asrc.c +++ /dev/null @@ -1,41 +0,0 @@ -/********** -Copyright 1990 Regents of the University of California. All rights reserved. -Author: 1987 Kanwar Jit Singh -**********/ - -#include "ngspice/ngspice.h" -#include "ngspice/ifsim.h" -#include "ngspice/devdefs.h" -#include "asrcdefs.h" -#include "ngspice/suffix.h" - - -/* Arbitrary source */ -IFparm ASRCpTable[] = { /* parameters */ - IP("i", ASRC_CURRENT, IF_PARSETREE, "Current source"), - IP("v", ASRC_VOLTAGE, IF_PARSETREE, "Voltage source"), - IOPZU("temp", ASRC_TEMP, IF_REAL, "Instance operating temperature"), - IOPZ("dtemp", ASRC_DTEMP, IF_REAL, "Instance temperature difference with the rest of the circuit"), - IOPU("tc1", ASRC_TC1, IF_REAL, "First order temp. coefficient"), - IOPU("tc2", ASRC_TC2, IF_REAL, "Second order temp. coefficient"), - IOPU("reciproctc", ASRC_RTC, IF_INTEGER, "Flag to calculate reciprocal temperature behaviour"), - IOPU("m", ASRC_M, IF_REAL, "Multiplier"), - IOPU("reciprocm", ASRC_RM, IF_INTEGER, "Flag to calculate reciprocal multiplier behaviour"), - OP("i", ASRC_OUTPUTCURRENT, IF_REAL, "Current through source"), - OP("v", ASRC_OUTPUTVOLTAGE, IF_REAL, "Voltage across source"), - OP("pos_node", ASRC_POS_NODE, IF_INTEGER, "Positive Node"), - OP("neg_node", ASRC_NEG_NODE, IF_INTEGER, "Negative Node") -}; - - -char *ASRCnames[] = { - "src+", - "src-" -}; - - -int ASRCnSize = NUMELEMS(ASRCnames); -int ASRCpTSize = NUMELEMS(ASRCpTable); -int ASRCmPTSize = 0; -int ASRCiSize = sizeof(ASRCinstance); -int ASRCmSize = sizeof(ASRCmodel); diff --git a/src/spicelib/devices/asrc/asrcacld.c b/src/spicelib/devices/asrc/asrcacld.c deleted file mode 100644 index b019dfcd5..000000000 --- a/src/spicelib/devices/asrc/asrcacld.c +++ /dev/null @@ -1,79 +0,0 @@ -/********** -Copyright 1990 Regents of the University of California. All rights reserved. -Author: 1988 Kanwar Jit Singh -**********/ - -#include "ngspice/ngspice.h" -#include "ngspice/cktdefs.h" -#include "asrcdefs.h" -#include "ngspice/sperror.h" -#include "ngspice/suffix.h" - - -/* - * Actually load the current voltage value into the - * sparse matrix previously provided. The values have - * been precomputed and stored with the instance model. - */ - -int -ASRCacLoad(GENmodel *inModel, CKTcircuit *ckt) -{ - ASRCmodel *model = (ASRCmodel*) inModel; - ASRCinstance *here; - int i, j; - double *derivs; - double difference; - double factor; - - NG_IGNORE(ckt); - - for (; model; model = ASRCnextModel(model)) { - for (here = ASRCinstances(model); here; here = ASRCnextInstance(here)) { - - difference = (here->ASRCtemp + here->ASRCdtemp) - 300.15; - factor = 1.0 - + here->ASRCtc1 * difference - + here->ASRCtc2 * difference * difference; - - if (here->ASRCreciproctc == 1) - factor = 1 / factor; - - if (here->ASRCreciprocm == 1) - factor = factor / here->ASRCm; - else - factor = factor * here->ASRCm; - - /* - * Get the function and its derivatives from the - * field in the instance structure. The field is - * an array of doubles holding the rhs, and the - * entries of the jacobian. - */ - - j = 0; - derivs = here->ASRCacValues; - - if (here->ASRCtype == ASRC_VOLTAGE) { - - *(here->ASRCposPtr[j++]) += 1.0; - *(here->ASRCposPtr[j++]) -= 1.0; - *(here->ASRCposPtr[j++]) -= 1.0; - *(here->ASRCposPtr[j++]) += 1.0; - - for (i = 0; i < here->ASRCtree->numVars; i++) - *(here->ASRCposPtr[j++]) -= derivs[i] * factor; - - } else { - - for (i = 0; i < here->ASRCtree->numVars; i++) { - *(here->ASRCposPtr[j++]) += derivs[i] * factor; - *(here->ASRCposPtr[j++]) -= derivs[i] * factor; - } - - } - } - } - - return(OK); -} diff --git a/src/spicelib/devices/asrc/asrcask.c b/src/spicelib/devices/asrc/asrcask.c deleted file mode 100644 index 7fd19e152..000000000 --- a/src/spicelib/devices/asrc/asrcask.c +++ /dev/null @@ -1,71 +0,0 @@ -/********** -Copyright 1990 Regents of the University of California. All rights reserved. -Author: 1987 Kanwar Jit Singh -**********/ - -#include "ngspice/ngspice.h" -#include "ngspice/cktdefs.h" -#include "ngspice/devdefs.h" -#include "ngspice/ifsim.h" -#include "asrcdefs.h" -#include "ngspice/sperror.h" -#include "ngspice/suffix.h" - - -/* - * This routine gives access to the internal device parameters - * of Current Controlled Voltage Source - */ - -int -ASRCask(CKTcircuit *ckt, GENinstance *instPtr, int which, IFvalue *value, IFvalue *select) -{ - ASRCinstance *here = (ASRCinstance*) instPtr; - - NG_IGNORE(select); - - switch(which) { - case ASRC_TEMP: - value->rValue = here->ASRCtemp - CONSTCtoK; - return(OK); - case ASRC_DTEMP: - value->rValue = here->ASRCdtemp; - return(OK); - case ASRC_TC1: - value->rValue = here->ASRCtc1; - return(OK); - case ASRC_TC2: - value->rValue = here->ASRCtc2; - return(OK); - case ASRC_M: - value->rValue = here->ASRCm; - return(OK); - case ASRC_CURRENT: - value->tValue = - (here->ASRCtype == ASRC_CURRENT) ? here->ASRCtree : NULL; - return(OK); - case ASRC_VOLTAGE: - value->tValue = - (here->ASRCtype == ASRC_VOLTAGE) ? here->ASRCtree : NULL; - return(OK); - case ASRC_POS_NODE: - value->iValue = here->ASRCposNode; - return(OK); - case ASRC_NEG_NODE: - value->iValue = here->ASRCnegNode; - return(OK); - case ASRC_OUTPUTCURRENT: - if (here->ASRCtype == ASRC_VOLTAGE) - value->rValue = ckt->CKTrhsOld[here->ASRCbranch]; - else - value->rValue = here->ASRCprev_value; - return(OK); - case ASRC_OUTPUTVOLTAGE: - value->rValue = - ckt->CKTrhsOld[here->ASRCposNode] - - ckt->CKTrhsOld[here->ASRCnegNode]; - return(OK); - default: - return(E_BADPARM); - } -} diff --git a/src/spicelib/devices/asrc/asrcconv.c b/src/spicelib/devices/asrc/asrcconv.c deleted file mode 100644 index 4fa584a74..000000000 --- a/src/spicelib/devices/asrc/asrcconv.c +++ /dev/null @@ -1,60 +0,0 @@ -/********** -Copyright 1990 Regents of the University of California. All rights reserved. -Author: 1988 Kanwar Jit Singh -**********/ - -#include "ngspice/ngspice.h" -#include "ngspice/cktdefs.h" -#include "asrcdefs.h" -#include "ngspice/sperror.h" -#include "ngspice/suffix.h" - - -int -ASRCconvTest(GENmodel *inModel, CKTcircuit *ckt) -{ - ASRCmodel *model = (ASRCmodel *) inModel; - ASRCinstance *here; - int i; - double diff; - double prev; - double tol; - double rhs; - - for (; model; model = ASRCnextModel(model)) { - for (here = ASRCinstances(model); here; here = ASRCnextInstance(here)) { - - i = here->ASRCtree->numVars; - if (asrc_nvals < i) { - asrc_nvals = i; - asrc_vals = TREALLOC(double, asrc_vals, i); - asrc_derivs = TREALLOC(double, asrc_derivs, i); - } - - for (i = 0; i < here->ASRCtree->numVars; i++) - asrc_vals[i] = ckt->CKTrhsOld[here->ASRCvars[i]]; - - if (here->ASRCtree->IFeval(here->ASRCtree, ckt->CKTgmin, &rhs, - asrc_vals, asrc_derivs) != OK) - return(E_BADPARM); - - prev = here->ASRCprev_value; - diff = fabs(prev - rhs); - - if (here->ASRCtype == ASRC_VOLTAGE) - tol = ckt->CKTreltol * MAX(fabs(rhs), fabs(prev)) - + ckt->CKTvoltTol; - else - tol = ckt->CKTreltol * MAX(fabs(rhs), fabs(prev)) - + ckt->CKTabstol; - - if (diff > tol) { - ckt->CKTnoncon++; - ckt->CKTtroubleElt = (GENinstance *) here; - return(OK); - } - } - } - - return(OK); -} diff --git a/src/spicelib/devices/asrc/asrcdefs.h b/src/spicelib/devices/asrc/asrcdefs.h deleted file mode 100644 index ddf17cc63..000000000 --- a/src/spicelib/devices/asrc/asrcdefs.h +++ /dev/null @@ -1,108 +0,0 @@ -/********** -Copyright 1990 Regents of the University of California. All rights reserved. -Author: 1985 Thomas L. Quarles -**********/ - -#ifndef ASRC -#define ASRC - -#include "ngspice/cktdefs.h" -#include "ngspice/ifsim.h" -#include "ngspice/complex.h" - - -/* - * structures to describe Arbitrary sources - */ - -/* information to describe a single instance */ - -typedef struct sASRCinstance { - - struct GENinstance gen; - -#define ASRCmodPtr(inst) ((struct sASRCmodel *)((inst)->gen.GENmodPtr)) -#define ASRCnextInstance(inst) ((struct sASRCinstance *)((inst)->gen.GENnextInstance)) -#define ASRCname gen.GENname -#define ASRCstates gen.GENstate - - const int ASRCposNode; /* number of positive node of source */ - const int ASRCnegNode; /* number of negative node of source */ - - int ASRCtype; /* Whether source is voltage or current */ - int ASRCbranch; /* number of branch equation added for v source */ - IFparseTree *ASRCtree; /* The parse tree */ - int *ASRCvars; /* indices of the controlling nodes/branches */ - - double ASRCtemp; /* temperature at which this resistor operates */ - double ASRCdtemp; /* delta-temperature of a particular instance */ - double ASRCtc1; /* first temperature coefficient of resistors */ - double ASRCtc2; /* second temperature coefficient of resistors */ - double ASRCm; /* Output multiplier */ - int ASRCreciproctc; /* Flag to calculate reciprocal temperature behaviour */ - int ASRCreciprocm; /* Flag to calculate reciprocal multiplier behaviour */ - double **ASRCposPtr; /* pointer to pointers of the elements - * in the sparce matrix */ - double ASRCprev_value; /* Previous value for the convergence test */ - double *ASRCacValues; /* Store rhs and derivatives for ac anal */ - - unsigned ASRCtempGiven : 1; /* indicates temperature specified */ - unsigned ASRCdtempGiven : 1; /* indicates delta-temp specified */ - unsigned ASRCtc1Given : 1; /* indicates tc1 parameter specified */ - unsigned ASRCtc2Given : 1; /* indicates tc2 parameter specified */ - unsigned ASRCmGiven : 1; /* indicates tc2 parameter specified */ - unsigned ASRCreciproctcGiven : 1; /* indicates reciproctc flag parameter specified */ - unsigned ASRCreciprocmGiven : 1; /* indicates reciprocm flag parameter specified */ - -} ASRCinstance; - - -#define ASRCvOld ASRCstates -#define ASRCcontVOld ASRCstates + 1 - -/* per model data */ - -typedef struct sASRCmodel { /* model structure for a source */ - - struct GENmodel gen; - -#define ASRCmodType gen.GENmodType -#define ASRCnextModel(inst) ((struct sASRCmodel *)((inst)->gen.GENnextModel)) -#define ASRCinstances(inst) ((ASRCinstance *)((inst)->gen.GENinstances)) -#define ASRCmodName gen.GENmodName - -} ASRCmodel; - - -/* device parameters */ -enum { - ASRC_VOLTAGE = 1, - ASRC_CURRENT, - ASRC_POS_NODE, - ASRC_NEG_NODE, - ASRC_PARSE_TREE, - ASRC_OUTPUTVOLTAGE, - ASRC_OUTPUTCURRENT, - ASRC_TEMP, - ASRC_DTEMP, - ASRC_TC1, - ASRC_TC2, - ASRC_RTC, - ASRC_M, - ASRC_RM, -}; - -/* module-wide variables */ - -extern double *asrc_vals, *asrc_derivs; -extern int asrc_nvals; - -/* model parameters */ - -/* device questions */ - -/* model questions */ - -#include "asrcext.h" - -#endif /*ASRC*/ diff --git a/src/spicelib/devices/asrc/asrcdel.c b/src/spicelib/devices/asrc/asrcdel.c deleted file mode 100644 index f99be7186..000000000 --- a/src/spicelib/devices/asrc/asrcdel.c +++ /dev/null @@ -1,23 +0,0 @@ -/********** -Copyright 1990 Regents of the University of California. All rights reserved. -Author: 1987 Kanwar Jit Singh -**********/ - -#include "ngspice/ngspice.h" -#include "asrcdefs.h" -#include "ngspice/sperror.h" -#include "ngspice/inpdefs.h" -#include "ngspice/suffix.h" - - -int -ASRCdelete(GENinstance *gen_inst) -{ - ASRCinstance *inst = (ASRCinstance *) gen_inst; - - INPfreeTree(inst->ASRCtree); - FREE(inst->ASRCacValues); - FREE(inst->ASRCposPtr); - FREE(inst->ASRCvars); - return OK; -} diff --git a/src/spicelib/devices/asrc/asrcdest.c b/src/spicelib/devices/asrc/asrcdest.c deleted file mode 100644 index 9e4a09d3b..000000000 --- a/src/spicelib/devices/asrc/asrcdest.c +++ /dev/null @@ -1,17 +0,0 @@ -/********** -Copyright 1990 Regents of the University of California. All rights reserved. -Author: 1987 Kanwar Jit Singh -**********/ - -#include "ngspice/ngspice.h" -#include "asrcdefs.h" -#include "ngspice/suffix.h" - - -void -ASRCdestroy(void) -{ - FREE(asrc_vals); - FREE(asrc_derivs); - asrc_nvals = 0; -} diff --git a/src/spicelib/devices/asrc/asrcext.h b/src/spicelib/devices/asrc/asrcext.h deleted file mode 100644 index 70e430b4c..000000000 --- a/src/spicelib/devices/asrc/asrcext.h +++ /dev/null @@ -1,17 +0,0 @@ -/********** -Copyright 1990 Regents of the University of California. All rights reserved. -Author: 1985 Thomas L. Quarles -**********/ - -extern int ASRCask(CKTcircuit *, GENinstance *, int, IFvalue *, IFvalue*); -extern int ASRCconvTest(GENmodel *, CKTcircuit *); -extern int ASRCdelete(GENinstance *); -extern void ASRCdestroy(void); -extern int ASRCfindBr(CKTcircuit *, GENmodel *, IFuid); -extern int ASRCload(GENmodel *, CKTcircuit *); -extern int ASRCparam(int, IFvalue *, GENinstance *, IFvalue *); -extern int ASRCpzLoad(GENmodel *, CKTcircuit *, SPcomplex *); -extern int ASRCacLoad(GENmodel *, CKTcircuit *); -extern int ASRCsetup(SMPmatrix *, GENmodel *, CKTcircuit *, int *); -extern int ASRCunsetup(GENmodel *, CKTcircuit *); -extern int ASRCtemp(GENmodel *, CKTcircuit *); diff --git a/src/spicelib/devices/asrc/asrcfbr.c b/src/spicelib/devices/asrc/asrcfbr.c deleted file mode 100644 index acbf9c9fa..000000000 --- a/src/spicelib/devices/asrc/asrcfbr.c +++ /dev/null @@ -1,35 +0,0 @@ -/********** -Copyright 1990 Regents of the University of California. All rights reserved. -Author: 1987 Kanwar Jit Singh -**********/ - -#include "ngspice/ngspice.h" -#include "ngspice/cktdefs.h" -#include "ngspice/ifsim.h" -#include "asrcdefs.h" -#include "ngspice/sperror.h" -#include "ngspice/suffix.h" - - -int -ASRCfindBr(CKTcircuit *ckt, GENmodel *inputModel, IFuid name) -{ - ASRCmodel *model = (ASRCmodel*) inputModel; - ASRCinstance *here; - int error; - CKTnode *tmp; - - for (; model; model = ASRCnextModel(model)) - for (here = ASRCinstances(model); here; here = ASRCnextInstance(here)) - if (here->ASRCname == name) { - if (here->ASRCbranch == 0) { - error = CKTmkCur(ckt, &tmp, here->ASRCname, "branch"); - if (error) - return(error); - here->ASRCbranch = tmp->number; - } - return(here->ASRCbranch); - } - - return(0); -} diff --git a/src/spicelib/devices/asrc/asrcinit.c b/src/spicelib/devices/asrc/asrcinit.c deleted file mode 100644 index 7455c3784..000000000 --- a/src/spicelib/devices/asrc/asrcinit.c +++ /dev/null @@ -1,78 +0,0 @@ -#include "ngspice/config.h" - -#include "ngspice/devdefs.h" - -#include "asrcitf.h" -#include "asrcext.h" -#include "asrcinit.h" - - -SPICEdev ASRCinfo = { - .DEVpublic = { - .name = "ASRC", - .description = "Arbitrary Source ", - .terms = &ASRCnSize, - .numNames = &ASRCnSize, - .termNames = ASRCnames, - .numInstanceParms = &ASRCpTSize, - .instanceParms = ASRCpTable, - .numModelParms = NULL, - .modelParms = NULL, - .flags = DEV_DEFAULT, - -#ifdef XSPICE - .cm_func = NULL, - .num_conn = 0, - .conn = NULL, - .num_param = 0, - .param = NULL, - .num_inst_var = 0, - .inst_var = NULL, -#endif - }, - - .DEVparam = ASRCparam, - .DEVmodParam = NULL, - .DEVload = ASRCload, - .DEVsetup = (int (*)(SMPmatrix *matrix, GENmodel *inModel, - CKTcircuit *ckt, int *states)) ASRCsetup, - .DEVunsetup = ASRCunsetup, - .DEVpzSetup = (int (*)(SMPmatrix *matrix, GENmodel *inModel, - CKTcircuit *ckt, int *states)) ASRCsetup, - .DEVtemperature = ASRCtemp, - .DEVtrunc = NULL, - .DEVfindBranch = ASRCfindBr, - .DEVacLoad = ASRCacLoad, - .DEVaccept = NULL, - .DEVdestroy = ASRCdestroy, - .DEVmodDelete = NULL, - .DEVdelete = ASRCdelete, - .DEVsetic = NULL, - .DEVask = ASRCask, - .DEVmodAsk = NULL, - .DEVpzLoad = ASRCpzLoad, - .DEVconvTest = ASRCconvTest, - .DEVsenSetup = NULL, - .DEVsenLoad = NULL, - .DEVsenUpdate = NULL, - .DEVsenAcLoad = NULL, - .DEVsenPrint = NULL, - .DEVsenTrunc = NULL, - .DEVdisto = NULL, - .DEVnoise = NULL, - .DEVsoaCheck = NULL, - .DEVinstSize = &ASRCiSize, - .DEVmodSize = &ASRCmSize, - -#ifdef CIDER - .DEVdump = NULL, - .DEVacct = NULL, -#endif -}; - - -SPICEdev * -get_asrc_info(void) -{ - return &ASRCinfo; -} diff --git a/src/spicelib/devices/asrc/asrcinit.h b/src/spicelib/devices/asrc/asrcinit.h deleted file mode 100644 index 6e5ea2dab..000000000 --- a/src/spicelib/devices/asrc/asrcinit.h +++ /dev/null @@ -1,11 +0,0 @@ -#ifndef _ASRCINIT_H -#define _ASRCINIT_H - -extern IFparm ASRCpTable[]; -extern char *ASRCnames[]; -extern int ASRCpTSize; -extern int ASRCnSize; -extern int ASRCiSize; -extern int ASRCmSize; - -#endif diff --git a/src/spicelib/devices/asrc/asrcitf.h b/src/spicelib/devices/asrc/asrcitf.h deleted file mode 100644 index ffdef35a5..000000000 --- a/src/spicelib/devices/asrc/asrcitf.h +++ /dev/null @@ -1,10 +0,0 @@ -/********** -Copyright 1990 Regents of the University of California. All rights reserved. -**********/ - -#ifndef DEV_ASRC -#define DEV_ASRC - -extern SPICEdev *get_asrc_info(void); - -#endif diff --git a/src/spicelib/devices/asrc/asrcload.c b/src/spicelib/devices/asrc/asrcload.c deleted file mode 100644 index 0c4f89395..000000000 --- a/src/spicelib/devices/asrc/asrcload.c +++ /dev/null @@ -1,128 +0,0 @@ -/********** -Copyright 1990 Regents of the University of California. All rights reserved. -Author: 1987 Kanwar Jit Singh -**********/ - -#include "ngspice/ngspice.h" -#include "ngspice/cktdefs.h" -#include "asrcdefs.h" -#include "ngspice/sperror.h" -#include "ngspice/suffix.h" - - -int asrc_nvals = 0; -double *asrc_vals = NULL; -double *asrc_derivs = NULL; - - -/* actually load the current voltage value into the - * sparse matrix previously provided - - * Evaluate the B-source parse tree (example: exp function): - * ASRCload asrcload.c - * IFeval ifeval.c - * PTeval ifeval.c - * PTexp ptfuncs.c -*/ - -int -ASRCload(GENmodel *inModel, CKTcircuit *ckt) -{ - ASRCmodel *model = (ASRCmodel*) inModel; - ASRCinstance *here; - int i, j; - double rhs; - double difference; - double factor; - - for (; model; model = ASRCnextModel(model)) { - for (here = ASRCinstances(model); here; here=ASRCnextInstance(here)) { - - difference = (here->ASRCtemp + here->ASRCdtemp) - 300.15; /* FIXME: tnmom instead of 300.15 */ - factor = 1.0 - + here->ASRCtc1 * difference - + here->ASRCtc2 * difference * difference; - - if (here->ASRCreciproctc == 1) - factor = 1 / factor; - - if (here->ASRCreciprocm == 1) - factor = factor / here->ASRCm; - else - factor = factor * here->ASRCm; - -#ifdef XSPICE_EXP - value *= ckt->CKTsrcFact; - value *= cm_analog_ramp_factor(); -#else - if (ckt->CKTmode & MODETRANOP) - factor *= ckt->CKTsrcFact; -#endif - - /* - * Get the function and its derivatives evaluated - */ - i = here->ASRCtree->numVars; - if (asrc_nvals < i) { - asrc_nvals = i; - asrc_vals = TREALLOC(double, asrc_vals, i); - asrc_derivs = TREALLOC(double, asrc_derivs, i); - } - - j = 0; - - /* - * Fill the vector of values from the previous solution - */ - for (i = 0; i < here->ASRCtree->numVars; i++) - asrc_vals[i] = ckt->CKTrhsOld[here->ASRCvars[i]]; - - if (here->ASRCtree->IFeval(here->ASRCtree, ckt->CKTgmin, &rhs, asrc_vals, asrc_derivs) != OK) { - fprintf(stderr, " in line %s\n\n", here->gen.GENname); - return(E_BADPARM); - } - - /* The convergence test */ - here->ASRCprev_value = rhs; - - /* The ac load precomputation and storage */ - if (ckt->CKTmode & MODEINITSMSIG) - for (i = 0; i < here->ASRCtree->numVars; i++) - here->ASRCacValues[i] = asrc_derivs[i]; - - if (here->ASRCtype == ASRC_VOLTAGE) { - - *(here->ASRCposPtr[j++]) += 1.0; - *(here->ASRCposPtr[j++]) -= 1.0; - *(here->ASRCposPtr[j++]) -= 1.0; - *(here->ASRCposPtr[j++]) += 1.0; - - for (i = 0; i < here->ASRCtree->numVars; i++) { - rhs -= (asrc_vals[i] * asrc_derivs[i]); - - *(here->ASRCposPtr[j++]) -= asrc_derivs[i] * factor; - } - - ckt->CKTrhs[here->ASRCbranch] += factor * rhs; - - } else { - - for (i = 0; i < here->ASRCtree->numVars; i++) { - rhs -= (asrc_vals[i] * asrc_derivs[i]); - - *(here->ASRCposPtr[j++]) += asrc_derivs[i] * factor; - *(here->ASRCposPtr[j++]) -= asrc_derivs[i] * factor; - } - - ckt->CKTrhs[here->ASRCposNode] -= factor * rhs; - ckt->CKTrhs[here->ASRCnegNode] += factor * rhs; - } - - /* Store the rhs for small signal analysis */ - if (ckt->CKTmode & MODEINITSMSIG) - here->ASRCacValues[here->ASRCtree->numVars] = factor * rhs; - } - } - - return(OK); -} diff --git a/src/spicelib/devices/asrc/asrcpar.c b/src/spicelib/devices/asrc/asrcpar.c deleted file mode 100644 index 8db5ecff4..000000000 --- a/src/spicelib/devices/asrc/asrcpar.c +++ /dev/null @@ -1,62 +0,0 @@ -/********** -Copyright 1990 Regents of the University of California. All rights reserved. -Author: 1987 Kanwar Jit Singh -**********/ - -#include "ngspice/ngspice.h" -#include "ngspice/ifsim.h" -#include "asrcdefs.h" -#include "ngspice/sperror.h" -#include "ngspice/suffix.h" - - -int -ASRCparam(int param, IFvalue *value, GENinstance *fast, IFvalue *select) -{ - ASRCinstance *here = (ASRCinstance*) fast; - - NG_IGNORE(select); - - switch (param) { - case ASRC_VOLTAGE: - here->ASRCtype = ASRC_VOLTAGE; - here->ASRCtree = value->tValue; - break; - case ASRC_CURRENT: - here->ASRCtype = ASRC_CURRENT; - here->ASRCtree = value->tValue; - break; - case ASRC_TC1: - here->ASRCtc1 = value->rValue; - here->ASRCtc1Given = TRUE; - break; - case ASRC_TC2: - here->ASRCtc2 = value->rValue; - here->ASRCtc2Given = TRUE; - break; - case ASRC_M: - here->ASRCm = value->rValue; - here->ASRCmGiven = TRUE; - break; - case ASRC_RTC: - here->ASRCreciproctc = value->iValue; - here->ASRCreciproctcGiven = TRUE; - break; - case ASRC_RM: - here->ASRCreciprocm = value->iValue; - here->ASRCreciprocmGiven = TRUE; - break; - case ASRC_TEMP: - here->ASRCtemp = value->rValue + CONSTCtoK; - here->ASRCtempGiven = TRUE; - break; - case ASRC_DTEMP: - here->ASRCdtemp = value->rValue; - here->ASRCdtempGiven = TRUE; - break; - default: - return(E_BADPARM); - } - - return(OK); -} diff --git a/src/spicelib/devices/asrc/asrcpzld.c b/src/spicelib/devices/asrc/asrcpzld.c deleted file mode 100644 index fd3739b31..000000000 --- a/src/spicelib/devices/asrc/asrcpzld.c +++ /dev/null @@ -1,91 +0,0 @@ -/********** -Copyright 1990 Regents of the University of California. All rights reserved. -Author: 1987 Kanwar Jit Singh -**********/ - -#include "ngspice/ngspice.h" -#include "ngspice/cktdefs.h" -#include "asrcdefs.h" -#include "ngspice/sperror.h" -#include "ngspice/suffix.h" -#include "ngspice/complex.h" - - -/* actually load the current voltage value into the - * sparse matrix previously provided - */ - -int -ASRCpzLoad(GENmodel *inModel, CKTcircuit *ckt, SPcomplex *s) -{ - ASRCmodel *model = (ASRCmodel*) inModel; - ASRCinstance *here; - double value; - int i, j; - double difference; - double factor; - - NG_IGNORE(s); - - for (; model; model = ASRCnextModel(model)) { - for (here = ASRCinstances(model); here; here = ASRCnextInstance(here)) { - - difference = (here->ASRCtemp + here->ASRCdtemp) - 300.15; - factor = 1.0 - + here->ASRCtc1 * difference - + here->ASRCtc2 * difference * difference; - - if (here->ASRCreciproctc == 1) - factor = 1 / factor; - - if (here->ASRCreciprocm == 1) - factor = factor / here->ASRCm; - else - factor = factor * here->ASRCm; - - j = 0; - - /* Get the function evaluated and the derivatives too */ - i = here->ASRCtree->numVars; - if (asrc_nvals < i) { - asrc_nvals = i; - asrc_vals = TREALLOC(double, asrc_vals, i); - asrc_derivs = TREALLOC(double, asrc_derivs, i); - } - - /* Fill the vector of values from the previous solution */ - for (i = 0; i < here->ASRCtree->numVars; i++) - if (here->ASRCtree->varTypes[i] == IF_INSTANCE) { - int branch = CKTfndBranch(ckt, here->ASRCtree->vars[i].uValue); - asrc_vals[i] = *(ckt->CKTrhsOld + branch); - } else { - int node_num = (here->ASRCtree->vars[i].nValue) -> number; - asrc_vals[i] = *(ckt->CKTrhsOld + node_num); - } - - if (here->ASRCtree->IFeval(here->ASRCtree, ckt->CKTgmin, &value, asrc_vals, asrc_derivs) != OK) - return(E_BADPARM); - - if (here->ASRCtype == ASRC_VOLTAGE) { - - *(here->ASRCposPtr[j++]) += 1.0; - *(here->ASRCposPtr[j++]) -= 1.0; - *(here->ASRCposPtr[j++]) -= 1.0; - *(here->ASRCposPtr[j++]) += 1.0; - - for (i = 0; i < here->ASRCtree->numVars; i++) - *(here->ASRCposPtr[j++]) -= asrc_derivs[i] / factor; - - } else { - - for (i = 0; i < here->ASRCtree->numVars; i++) { - *(here->ASRCposPtr[j++]) += asrc_derivs[i] / factor; - *(here->ASRCposPtr[j++]) -= asrc_derivs[i] / factor; - } - - } - } - } - - return(OK); -} diff --git a/src/spicelib/devices/asrc/asrcset.c b/src/spicelib/devices/asrc/asrcset.c deleted file mode 100644 index 3873129ea..000000000 --- a/src/spicelib/devices/asrc/asrcset.c +++ /dev/null @@ -1,145 +0,0 @@ -/********** -Copyright 1990 Regents of the University of California. All rights reserved. -Author: 1987 Kanwar Jit Singh -**********/ - -#include "ngspice/ngspice.h" -#include "ngspice/cktdefs.h" -#include "asrcdefs.h" -#include "ngspice/sperror.h" -#include "ngspice/suffix.h" - - -#define TSTALLOC(ptr, first, second) \ - do { \ - if ((here->ptr = SMPmakeElt(matrix, first, second)) == NULL) \ - return(E_NOMEM); \ - } while(0) - - -/* load the voltage source structure with those - * pointers needed later for fast matrix loading - */ - -int ASRCsetup(SMPmatrix *matrix, GENmodel *inModel, CKTcircuit *ckt, - int *states) -{ - ASRCinstance *here; - ASRCmodel *model = (ASRCmodel*) inModel; - int error, i, j; - CKTnode *tmp; - - NG_IGNORE(states); - - for (; model; model = ASRCnextModel(model)) { - for (here = ASRCinstances(model); here; here=ASRCnextInstance(here)) { - - if (!here->ASRCtree) - return E_PARMVAL; - - if (here->ASRCtype == ASRC_VOLTAGE) - if (here->ASRCposNode == here->ASRCnegNode) { - SPfrontEnd->IFerrorf(ERR_FATAL, "instance %s is a shorted ASRC", here->ASRCname); - return(E_UNSUPP); - } - - if (!here->ASRCtc1Given) - here->ASRCtc1 = 0.0; - if (!here->ASRCtc2Given) - here->ASRCtc2 = 0.0; - if (!here->ASRCreciproctcGiven) - here->ASRCreciproctc = 0; - if (!here->ASRCreciprocmGiven) - here->ASRCreciprocm = 0; - if (!here->ASRCmGiven) - here->ASRCm = 1.0; - - switch (here->ASRCtype) { - case ASRC_VOLTAGE: - j = 4 + here->ASRCtree->numVars; - break; - case ASRC_CURRENT: - j = 2 * here->ASRCtree->numVars; - break; - default: - return (E_BADPARM); - } - - here->ASRCposPtr = TMALLOC(double *, j); - here->ASRCvars = TMALLOC(int, here->ASRCtree->numVars); - here->ASRCacValues = TMALLOC(double, here->ASRCtree->numVars + 1); - - /* For each controlling variable set the entries - in the vector of the positions of the SMP */ - - j = 0; - - if (here->ASRCtype == ASRC_VOLTAGE) { - - if (here->ASRCbranch == 0) { - error = CKTmkCur(ckt, &tmp, here->ASRCname, "branch"); - if (error) - return(error); - here->ASRCbranch = tmp->number; - } - - TSTALLOC(ASRCposPtr[j++], here->ASRCposNode, here->ASRCbranch); - TSTALLOC(ASRCposPtr[j++], here->ASRCnegNode, here->ASRCbranch); - TSTALLOC(ASRCposPtr[j++], here->ASRCbranch, here->ASRCnegNode); - TSTALLOC(ASRCposPtr[j++], here->ASRCbranch, here->ASRCposNode); - } - - for (i = 0; i < here->ASRCtree->numVars; i++) { - int column; - - switch (here->ASRCtree->varTypes[i]) { - case IF_INSTANCE: - column = CKTfndBranch(ckt, here->ASRCtree->vars[i].uValue); - if (column == 0) { - SPfrontEnd->IFerrorf(ERR_FATAL, "%s: unknown controlling source %s", - here->ASRCname, here->ASRCtree->vars[i].uValue); - return(E_BADPARM); - } - break; - case IF_NODE: - column = here->ASRCtree->vars[i].nValue->number; - break; - default: - return (E_BADPARM); - } - - here->ASRCvars[i] = column; - - if (here->ASRCtype == ASRC_VOLTAGE) { - TSTALLOC(ASRCposPtr[j++], here->ASRCbranch, column); - } else { - TSTALLOC(ASRCposPtr[j++], here->ASRCposNode, column); - TSTALLOC(ASRCposPtr[j++], here->ASRCnegNode, column); - } - } - } - } - - return(OK); -} - - -int -ASRCunsetup(GENmodel *inModel, CKTcircuit *ckt) -{ - ASRCmodel *model = (ASRCmodel *) inModel; - ASRCinstance *here; - - for (; model; model = ASRCnextModel(model)) - for (here = ASRCinstances(model); here; here = ASRCnextInstance(here)) { - if (here->ASRCbranch > 0) - CKTdltNNum(ckt, here->ASRCbranch); - here->ASRCbranch = 0; - - FREE(here->ASRCposPtr); - FREE(here->ASRCvars); - FREE(here->ASRCacValues); - } - - return OK; -} diff --git a/src/spicelib/devices/asrc/asrctemp.c b/src/spicelib/devices/asrc/asrctemp.c deleted file mode 100644 index 5e316b903..000000000 --- a/src/spicelib/devices/asrc/asrctemp.c +++ /dev/null @@ -1,37 +0,0 @@ -/********** -Copyright 1990 Regents of the University of California. All rights reserved. -Author: 1985 Thomas L. Quarles -**********/ - -#include "ngspice/ngspice.h" -#include "ngspice/cktdefs.h" -#include "asrcdefs.h" -#include "ngspice/sperror.h" - - -int -ASRCtemp(GENmodel *inModel, CKTcircuit *ckt) -{ - ASRCmodel *model = (ASRCmodel *) inModel; - ASRCinstance *here; - - for (; model; model = ASRCnextModel(model)) { - for (here = ASRCinstances(model); here; here = ASRCnextInstance(here)) { - - /* Default Value Processing for Source Instance */ - - if (!here->ASRCtempGiven) { - here->ASRCtemp = ckt->CKTtemp; - if (!here->ASRCdtempGiven) - here->ASRCdtemp = 0.0; - } else { - here->ASRCdtemp = 0.0; - if (here->ASRCdtempGiven) - printf("%s: Instance temperature specified, dtemp ignored\n", here->ASRCname); - } - - } - } - - return(OK); -} diff --git a/src/spicelib/devices/bsim1/ChangeLog b/src/spicelib/devices/bsim1/ChangeLog deleted file mode 100644 index 76bf4f2be..000000000 --- a/src/spicelib/devices/bsim1/ChangeLog +++ /dev/null @@ -1 +0,0 @@ -22/11/1990 Modified b1mpar.c substituting iValue to rValue as discovered by Al Davis. diff --git a/src/spicelib/devices/bsim1/Makefile.am b/src/spicelib/devices/bsim1/Makefile.am deleted file mode 100644 index 59c023395..000000000 --- a/src/spicelib/devices/bsim1/Makefile.am +++ /dev/null @@ -1,34 +0,0 @@ -## Process this file with automake to produce Makefile.in - -noinst_LTLIBRARIES = libbsim1.la - -libbsim1_la_SOURCES = \ - b1.c \ - b1acld.c \ - b1ask.c \ - b1cvtest.c \ - b1disto.c \ - b1dset.c \ - b1eval.c \ - b1getic.c \ - b1ld.c \ - b1mask.c \ - b1moscap.c \ - b1mpar.c \ - b1par.c \ - b1noi.c \ - b1pzld.c \ - b1set.c \ - b1temp.c \ - b1trunc.c \ - bsim1def.h \ - bsim1ext.h \ - bsim1init.c \ - bsim1init.h \ - bsim1itf.h - - - -AM_CPPFLAGS = @AM_CPPFLAGS@ -I$(top_srcdir)/src/include -AM_CFLAGS = $(STATIC) -MAINTAINERCLEANFILES = Makefile.in diff --git a/src/spicelib/devices/bsim1/b1.c b/src/spicelib/devices/bsim1/b1.c deleted file mode 100644 index 0e6b50595..000000000 --- a/src/spicelib/devices/bsim1/b1.c +++ /dev/null @@ -1,144 +0,0 @@ -/********** -Copyright 1990 Regents of the University of California. All rights reserved. -Author: 1985 Hong J. Park, Thomas L. Quarles -**********/ - -#include "ngspice/ngspice.h" -#include "ngspice/devdefs.h" -#include "bsim1def.h" -#include "ngspice/suffix.h" - -IFparm B1pTable[] = { /* parameters */ - IOP( "l", BSIM1_L, IF_REAL , "Length"), - IOP( "w", BSIM1_W, IF_REAL , "Width"), - IOP( "m", BSIM1_M, IF_REAL , "Parallel Multiplier"), - IOP( "ad", BSIM1_AD, IF_REAL , "Drain area"), - IOP( "as", BSIM1_AS, IF_REAL , "Source area"), - IOP( "pd", BSIM1_PD, IF_REAL , "Drain perimeter"), - IOP( "ps", BSIM1_PS, IF_REAL , "Source perimeter"), - IOP( "nrd", BSIM1_NRD, IF_REAL , "Number of squares in drain"), - IOP( "nrs", BSIM1_NRS, IF_REAL , "Number of squares in source"), - IOP( "off", BSIM1_OFF, IF_FLAG , "Device is initially off"), - IOP( "vds", BSIM1_IC_VDS, IF_REAL , "Initial D-S voltage"), - IOP( "vgs", BSIM1_IC_VGS, IF_REAL , "Initial G-S voltage"), - IOP( "vbs", BSIM1_IC_VBS, IF_REAL , "Initial B-S voltage"), - IP( "ic", BSIM1_IC, IF_VECTOR , "Vector of DS,GS,BS initial voltages") -}; - -IFparm B1mPTable[] = { /* model parameters */ - IOP( "vfb", BSIM1_MOD_VFB0, IF_REAL,"Flat band voltage"), - IOP( "lvfb", BSIM1_MOD_VFBL, IF_REAL, "Length dependence of vfb"), - IOP( "wvfb", BSIM1_MOD_VFBW, IF_REAL, "Width dependence of vfb"), - IOP( "phi", BSIM1_MOD_PHI0, IF_REAL, - "Strong inversion surface potential "), - IOP( "lphi", BSIM1_MOD_PHIL, IF_REAL, "Length dependence of phi"), - IOP( "wphi", BSIM1_MOD_PHIW, IF_REAL, "Width dependence of phi"), - IOP( "k1", BSIM1_MOD_K10, IF_REAL, "Bulk effect coefficient 1"), - IOP( "lk1", BSIM1_MOD_K1L, IF_REAL, "Length dependence of k1"), - IOP( "wk1", BSIM1_MOD_K1W, IF_REAL, "Width dependence of k1"), - IOP( "k2", BSIM1_MOD_K20, IF_REAL, "Bulk effect coefficient 2"), - IOP( "lk2", BSIM1_MOD_K2L, IF_REAL, "Length dependence of k2"), - IOP( "wk2", BSIM1_MOD_K2W, IF_REAL, "Width dependence of k2"), - IOP( "eta", BSIM1_MOD_ETA0, IF_REAL, - "VDS dependence of threshold voltage"), - IOP( "leta", BSIM1_MOD_ETAL, IF_REAL, "Length dependence of eta"), - IOP( "weta", BSIM1_MOD_ETAW, IF_REAL, "Width dependence of eta"), - IOP( "x2e", BSIM1_MOD_ETAB0, IF_REAL, "VBS dependence of eta"), - IOP( "lx2e", BSIM1_MOD_ETABL, IF_REAL, "Length dependence of x2e"), - IOP( "wx2e", BSIM1_MOD_ETABW, IF_REAL, "Width dependence of x2e"), - IOP( "x3e", BSIM1_MOD_ETAD0, IF_REAL, "VDS dependence of eta"), - IOP( "lx3e", BSIM1_MOD_ETADL, IF_REAL, "Length dependence of x3e"), - IOP( "wx3e", BSIM1_MOD_ETADW, IF_REAL, "Width dependence of x3e"), - IOP( "dl", BSIM1_MOD_DELTAL, IF_REAL, "Channel length reduction in um"), - IOP( "dw", BSIM1_MOD_DELTAW, IF_REAL, "Channel width reduction in um"), - IOP( "muz", BSIM1_MOD_MOBZERO, IF_REAL, - "Zero field mobility at VDS=0 VGS=VTH"), - IOP( "x2mz", BSIM1_MOD_MOBZEROB0, IF_REAL, "VBS dependence of muz"), - IOP( "lx2mz", BSIM1_MOD_MOBZEROBL, IF_REAL, "Length dependence of x2mz"), - IOP( "wx2mz", BSIM1_MOD_MOBZEROBW, IF_REAL, "Width dependence of x2mz"), - IOP( "mus", BSIM1_MOD_MOBVDD0, IF_REAL, - "Mobility at VDS=VDD VGS=VTH, channel length modulation"), - IOP( "lmus", BSIM1_MOD_MOBVDDL, IF_REAL, "Length dependence of mus"), - IOP( "wmus", BSIM1_MOD_MOBVDDW, IF_REAL, "Width dependence of mus"), - IOP( "x2ms", BSIM1_MOD_MOBVDDB0, IF_REAL, "VBS dependence of mus"), - IOP( "lx2ms", BSIM1_MOD_MOBVDDBL, IF_REAL, "Length dependence of x2ms"), - IOP( "wx2ms", BSIM1_MOD_MOBVDDBW, IF_REAL, "Width dependence of x2ms"), - IOP( "x3ms", BSIM1_MOD_MOBVDDD0, IF_REAL, "VDS dependence of mus"), - IOP( "lx3ms", BSIM1_MOD_MOBVDDDL, IF_REAL, "Length dependence of x3ms"), - IOP( "wx3ms", BSIM1_MOD_MOBVDDDW, IF_REAL, "Width dependence of x3ms"), - IOP( "u0", BSIM1_MOD_UGS0, IF_REAL, "VGS dependence of mobility"), - IOP( "lu0", BSIM1_MOD_UGSL, IF_REAL, "Length dependence of u0"), - IOP( "wu0", BSIM1_MOD_UGSW, IF_REAL, "Width dependence of u0"), - IOP( "x2u0", BSIM1_MOD_UGSB0, IF_REAL, "VBS dependence of u0"), - IOP( "lx2u0", BSIM1_MOD_UGSBL, IF_REAL, "Length dependence of x2u0"), - IOP( "wx2u0", BSIM1_MOD_UGSBW, IF_REAL, "Width dependence of x2u0"), - IOP( "u1", BSIM1_MOD_UDS0, IF_REAL, - "VDS depence of mobility, velocity saturation"), - IOP( "lu1", BSIM1_MOD_UDSL, IF_REAL, "Length dependence of u1"), - IOP( "wu1", BSIM1_MOD_UDSW, IF_REAL, "Width dependence of u1"), - IOP( "x2u1", BSIM1_MOD_UDSB0, IF_REAL, "VBS depence of u1"), - IOP( "lx2u1", BSIM1_MOD_UDSBL, IF_REAL, "Length depence of x2u1"), - IOP( "wx2u1", BSIM1_MOD_UDSBW, IF_REAL, "Width depence of x2u1"), - IOP( "x3u1", BSIM1_MOD_UDSD0, IF_REAL, "VDS depence of u1"), - IOP( "lx3u1", BSIM1_MOD_UDSDL, IF_REAL, "Length dependence of x3u1"), - IOP( "wx3u1", BSIM1_MOD_UDSDW, IF_REAL, "Width depence of x3u1"), - IOP( "n0", BSIM1_MOD_N00, IF_REAL, "Subthreshold slope"), - IOP( "ln0", BSIM1_MOD_N0L, IF_REAL, "Length dependence of n0"), - IOP( "wn0", BSIM1_MOD_N0W, IF_REAL, "Width dependence of n0"), - IOP( "nb", BSIM1_MOD_NB0, IF_REAL, - "VBS dependence of subthreshold slope"), - IOP( "lnb", BSIM1_MOD_NBL, IF_REAL, "Length dependence of nb"), - IOP( "wnb", BSIM1_MOD_NBW, IF_REAL, "Width dependence of nb"), - IOP( "nd", BSIM1_MOD_ND0, IF_REAL, - "VDS dependence of subthreshold slope"), - IOP( "lnd", BSIM1_MOD_NDL, IF_REAL, "Length dependence of nd"), - IOP( "wnd", BSIM1_MOD_NDW, IF_REAL, "Width dependence of nd"), - IOP( "tox", BSIM1_MOD_TOX, IF_REAL, "Gate oxide thickness in um"), - IOP( "temp", BSIM1_MOD_TEMP, IF_REAL, "Temperature in degree Celcius"), - IOP( "vdd", BSIM1_MOD_VDD, IF_REAL, "Supply voltage to specify mus"), - IOPA( "cgso", BSIM1_MOD_CGSO, IF_REAL, - "Gate source overlap capacitance per unit channel width(m)"), - IOPA( "cgdo", BSIM1_MOD_CGDO, IF_REAL, - "Gate drain overlap capacitance per unit channel width(m)"), - IOPA( "cgbo", BSIM1_MOD_CGBO, IF_REAL, - "Gate bulk overlap capacitance per unit channel length(m)"), - IOP( "xpart", BSIM1_MOD_XPART, IF_FLAG, - "Flag for channel charge partitioning"), - IOP( "rsh", BSIM1_MOD_RSH, IF_REAL, - "Source drain diffusion sheet resistance in ohm per square"), - IOP( "js", BSIM1_MOD_JS, IF_REAL, - "Source drain junction saturation current per unit area"), - IOP( "pb", BSIM1_MOD_PB, IF_REAL, - "Source drain junction built in potential"), - IOPA( "mj", BSIM1_MOD_MJ, IF_REAL, - "Source drain bottom junction capacitance grading coefficient"), - IOPA( "pbsw", BSIM1_MOD_PBSW, IF_REAL, - "Source drain side junction capacitance built in potential"), - IOPA( "mjsw", BSIM1_MOD_MJSW, IF_REAL, - "Source drain side junction capacitance grading coefficient"), - IOPA( "cj", BSIM1_MOD_CJ, IF_REAL, - "Source drain bottom junction capacitance per unit area"), - IOPA( "cjsw", BSIM1_MOD_CJSW, IF_REAL, - "Source drain side junction capacitance per unit area"), - IOP( "wdf", BSIM1_MOD_DEFWIDTH, IF_REAL, - "Default width of source drain diffusion in um"), - IOP( "dell", BSIM1_MOD_DELLENGTH, IF_REAL, - "Length reduction of source drain diffusion"), - IOP("kf", BSIM1_MOD_KF, IF_REAL ,"Flicker noise coefficient"), - IOP("af", BSIM1_MOD_AF, IF_REAL ,"Flicker noise exponent"), - IP( "nmos", BSIM1_MOD_NMOS, IF_FLAG, "Flag to indicate NMOS"), - IP( "pmos", BSIM1_MOD_PMOS, IF_FLAG, "Flag to indicate PMOS"), -}; - -char *B1names[] = { - "Drain", - "Gate", - "Source", - "Bulk" -}; - -int B1nSize = NUMELEMS(B1names); -int B1pTSize = NUMELEMS(B1pTable); -int B1mPTSize = NUMELEMS(B1mPTable); -int B1iSize = sizeof(B1instance); -int B1mSize = sizeof(B1model); diff --git a/src/spicelib/devices/bsim1/b1acld.c b/src/spicelib/devices/bsim1/b1acld.c deleted file mode 100644 index f4fb90638..000000000 --- a/src/spicelib/devices/bsim1/b1acld.c +++ /dev/null @@ -1,147 +0,0 @@ -/********** -Copyright 1990 Regents of the University of California. All rights reserved. -Author: 1985 Hong J. Park, Thomas L. Quarles -**********/ -/* - */ - -#include "ngspice/ngspice.h" -#include "ngspice/cktdefs.h" -#include "bsim1def.h" -#include "ngspice/sperror.h" -#include "ngspice/suffix.h" - - -int -B1acLoad(GENmodel *inModel, CKTcircuit *ckt) -{ - B1model *model = (B1model*)inModel; - B1instance *here; - int xnrm; - int xrev; - double gdpr; - double gspr; - double gm; - double gds; - double gmbs; - double gbd; - double gbs; - double capbd; - double capbs; - double xcggb; - double xcgdb; - double xcgsb; - double xcbgb; - double xcbdb; - double xcbsb; - double xcddb; - double xcssb; - double xcdgb; - double xcsgb; - double xcdsb; - double xcsdb; - double cggb; - double cgdb; - double cgsb; - double cbgb; - double cbdb; - double cbsb; - double cddb; - double cdgb; - double cdsb; - double omega; /* angular fequency of the signal */ - double m; /* parallel multiplier */ - - omega = ckt->CKTomega; - for( ; model != NULL; model = B1nextModel(model)) { - for(here = B1instances(model); here!= NULL; - here = B1nextInstance(here)) { - - if (here->B1mode >= 0) { - xnrm=1; - xrev=0; - } else { - xnrm=0; - xrev=1; - } - gdpr=here->B1drainConductance; - gspr=here->B1sourceConductance; - gm= *(ckt->CKTstate0 + here->B1gm); - gds= *(ckt->CKTstate0 + here->B1gds); - gmbs= *(ckt->CKTstate0 + here->B1gmbs); - gbd= *(ckt->CKTstate0 + here->B1gbd); - gbs= *(ckt->CKTstate0 + here->B1gbs); - capbd= *(ckt->CKTstate0 + here->B1capbd); - capbs= *(ckt->CKTstate0 + here->B1capbs); - /* - * charge oriented model parameters - */ - - cggb = *(ckt->CKTstate0 + here->B1cggb); - cgsb = *(ckt->CKTstate0 + here->B1cgsb); - cgdb = *(ckt->CKTstate0 + here->B1cgdb); - - cbgb = *(ckt->CKTstate0 + here->B1cbgb); - cbsb = *(ckt->CKTstate0 + here->B1cbsb); - cbdb = *(ckt->CKTstate0 + here->B1cbdb); - - cdgb = *(ckt->CKTstate0 + here->B1cdgb); - cdsb = *(ckt->CKTstate0 + here->B1cdsb); - cddb = *(ckt->CKTstate0 + here->B1cddb); - - xcdgb = (cdgb - here->B1GDoverlapCap) * omega; - xcddb = (cddb + capbd + here->B1GDoverlapCap) * omega; - xcdsb = cdsb * omega; - xcsgb = -(cggb + cbgb + cdgb + here->B1GSoverlapCap ) * omega; - xcsdb = -(cgdb + cbdb + cddb) * omega; - xcssb = (capbs + here->B1GSoverlapCap - (cgsb+cbsb+cdsb)) * omega; - xcggb = (cggb + here->B1GDoverlapCap + here->B1GSoverlapCap + - here->B1GBoverlapCap) * omega; - xcgdb = (cgdb - here->B1GDoverlapCap ) * omega; - xcgsb = (cgsb - here->B1GSoverlapCap) * omega; - xcbgb = (cbgb - here->B1GBoverlapCap) * omega; - xcbdb = (cbdb - capbd ) * omega; - xcbsb = (cbsb - capbs ) * omega; - - m = here->B1m; - - *(here->B1GgPtr +1) += m * xcggb; - *(here->B1BbPtr +1) += m * (-xcbgb-xcbdb-xcbsb); - *(here->B1DPdpPtr +1) += m * xcddb; - *(here->B1SPspPtr +1) += m * xcssb; - *(here->B1GbPtr +1) += m * (-xcggb-xcgdb-xcgsb); - *(here->B1GdpPtr +1) += m * xcgdb; - *(here->B1GspPtr +1) += m * xcgsb; - *(here->B1BgPtr +1) += m * xcbgb; - *(here->B1BdpPtr +1) += m * xcbdb; - *(here->B1BspPtr +1) += m * xcbsb; - *(here->B1DPgPtr +1) += m * xcdgb; - *(here->B1DPbPtr +1) += m * (-xcdgb-xcddb-xcdsb); - *(here->B1DPspPtr +1) += m * xcdsb; - *(here->B1SPgPtr +1) += m * xcsgb; - *(here->B1SPbPtr +1) += m * (-xcsgb-xcsdb-xcssb); - *(here->B1SPdpPtr +1) += m * xcsdb; - *(here->B1DdPtr) += m * gdpr; - *(here->B1SsPtr) += m * gspr; - *(here->B1BbPtr) += m * (gbd+gbs); - *(here->B1DPdpPtr) += m * (gdpr+gds+gbd+xrev*(gm+gmbs)); - *(here->B1SPspPtr) += m * (gspr+gds+gbs+xnrm*(gm+gmbs)); - *(here->B1DdpPtr) -= m * gdpr; - *(here->B1SspPtr) -= m * gspr; - *(here->B1BdpPtr) -= m * gbd; - *(here->B1BspPtr) -= m * gbs; - *(here->B1DPdPtr) -= m * gdpr; - *(here->B1DPgPtr) += m * (xnrm-xrev)*gm; - *(here->B1DPbPtr) += m * (-gbd+(xnrm-xrev)*gmbs); - *(here->B1DPspPtr) += m * (-gds-xnrm*(gm+gmbs)); - *(here->B1SPgPtr) += m * (-(xnrm-xrev)*gm); - *(here->B1SPsPtr) -= m * gspr; - *(here->B1SPbPtr) += m * (-gbs-(xnrm-xrev)*gmbs); - *(here->B1SPdpPtr) += m * (-gds-xrev*(gm+gmbs)); - - } - } -return(OK); -} - - diff --git a/src/spicelib/devices/bsim1/b1ask.c b/src/spicelib/devices/bsim1/b1ask.c deleted file mode 100644 index 7e0ab9b08..000000000 --- a/src/spicelib/devices/bsim1/b1ask.c +++ /dev/null @@ -1,224 +0,0 @@ -/********** -Copyright 1990 Regents of the University of California. All rights reserved. -Author: 1988 Hong J. Park -**********/ - -#include "ngspice/ngspice.h" -#include "ngspice/ifsim.h" -#include "ngspice/cktdefs.h" -#include "ngspice/devdefs.h" -#include "bsim1def.h" -#include "ngspice/sperror.h" -#include "ngspice/suffix.h" - -/*ARGSUSED*/ -int -B1ask(CKTcircuit *ckt, GENinstance *inst, int which, - IFvalue *value, IFvalue *select) -{ - B1instance *here = (B1instance*)inst; - - NG_IGNORE(select); - - switch(which) { - case BSIM1_L: - value->rValue = here->B1l; - return(OK); - case BSIM1_W: - value->rValue = here->B1w; - value->rValue *= here->B1m; - return(OK); - case BSIM1_M: - value->rValue = here->B1m; - return(OK); - case BSIM1_AS: - value->rValue = here->B1sourceArea; - value->rValue *= here->B1m; - return(OK); - case BSIM1_AD: - value->rValue = here->B1drainArea; - value->rValue *= here->B1m; - return(OK); - case BSIM1_PS: - value->rValue = here->B1sourcePerimeter; - value->rValue *= here->B1m; - return(OK); - case BSIM1_PD: - value->rValue = here->B1drainPerimeter; - value->rValue *= here->B1m; - return(OK); - case BSIM1_NRS: - value->rValue = here->B1sourceSquares; - value->rValue *= here->B1m; - return(OK); - case BSIM1_NRD: - value->rValue = here->B1drainSquares; - value->rValue *= here->B1m; - return(OK); - case BSIM1_OFF: - value->rValue = here->B1off; - return(OK); - case BSIM1_IC_VBS: - value->rValue = here->B1icVBS; - return(OK); - case BSIM1_IC_VDS: - value->rValue = here->B1icVDS; - return(OK); - case BSIM1_IC_VGS: - value->rValue = here->B1icVGS; - return(OK); - case BSIM1_DNODE: - value->iValue = here->B1dNode; - return(OK); - case BSIM1_GNODE: - value->iValue = here->B1gNode; - return(OK); - case BSIM1_SNODE: - value->iValue = here->B1sNode; - return(OK); - case BSIM1_BNODE: - value->iValue = here->B1bNode; - return(OK); - case BSIM1_DNODEPRIME: - value->iValue = here->B1dNodePrime; - return(OK); - case BSIM1_SNODEPRIME: - value->iValue = here->B1sNodePrime; - return(OK); - case BSIM1_SOURCECONDUCT: - value->rValue = here->B1sourceConductance; - value->rValue *= here->B1m; - return(OK); - case BSIM1_DRAINCONDUCT: - value->rValue = here->B1drainConductance; - value->rValue *= here->B1m; - return(OK); - case BSIM1_VBD: - value->rValue = *(ckt->CKTstate0 + here->B1vbd); - return(OK); - case BSIM1_VBS: - value->rValue = *(ckt->CKTstate0 + here->B1vbs); - return(OK); - case BSIM1_VGS: - value->rValue = *(ckt->CKTstate0 + here->B1vgs); - return(OK); - case BSIM1_VDS: - value->rValue = *(ckt->CKTstate0 + here->B1vds); - return(OK); - case BSIM1_CD: - value->rValue = *(ckt->CKTstate0 + here->B1cd); - value->rValue *= here->B1m; - return(OK); - case BSIM1_CBS: - value->rValue = *(ckt->CKTstate0 + here->B1cbs); - value->rValue *= here->B1m; - return(OK); - case BSIM1_CBD: - value->rValue = *(ckt->CKTstate0 + here->B1cbd); - value->rValue *= here->B1m; - return(OK); - case BSIM1_GM: - value->rValue = *(ckt->CKTstate0 + here->B1gm); - value->rValue *= here->B1m; - return(OK); - case BSIM1_GDS: - value->rValue = *(ckt->CKTstate0 + here->B1gds); - value->rValue *= here->B1m; - return(OK); - case BSIM1_GMBS: - value->rValue = *(ckt->CKTstate0 + here->B1gmbs); - value->rValue *= here->B1m; - return(OK); - case BSIM1_GBD: - value->rValue = *(ckt->CKTstate0 + here->B1gbd); - value->rValue *= here->B1m; - return(OK); - case BSIM1_GBS: - value->rValue = *(ckt->CKTstate0 + here->B1gbs); - value->rValue *= here->B1m; - return(OK); - case BSIM1_QB: - value->rValue = *(ckt->CKTstate0 + here->B1qb); - value->rValue *= here->B1m; - return(OK); - case BSIM1_CQB: - value->rValue = *(ckt->CKTstate0 + here->B1cqb); - value->rValue *= here->B1m; - return(OK); - case BSIM1_QG: - value->rValue = *(ckt->CKTstate0 + here->B1qg); - value->rValue *= here->B1m; - return(OK); - case BSIM1_CQG: - value->rValue = *(ckt->CKTstate0 + here->B1cqg); - value->rValue *= here->B1m; - return(OK); - case BSIM1_QD: - value->rValue = *(ckt->CKTstate0 + here->B1qd); - value->rValue *= here->B1m; - return(OK); - case BSIM1_CQD: - value->rValue = *(ckt->CKTstate0 + here->B1cqd); - value->rValue *= here->B1m; - return(OK); - case BSIM1_CGG: - value->rValue = *(ckt->CKTstate0 + here->B1cggb); - value->rValue *= here->B1m; - return(OK); - case BSIM1_CGD: - value->rValue = *(ckt->CKTstate0 + here->B1cgdb); - value->rValue *= here->B1m; - return(OK); - case BSIM1_CGS: - value->rValue = *(ckt->CKTstate0 + here->B1cgsb); - value->rValue *= here->B1m; - return(OK); - case BSIM1_CBG: - value->rValue = *(ckt->CKTstate0 + here->B1cbgb); - value->rValue *= here->B1m; - return(OK); - case BSIM1_CAPBD: - value->rValue = *(ckt->CKTstate0 + here->B1capbd); - value->rValue *= here->B1m; - return(OK); - case BSIM1_CQBD: - value->rValue = *(ckt->CKTstate0 + here->B1cqbd); - value->rValue *= here->B1m; - return(OK); - case BSIM1_CAPBS: - value->rValue = *(ckt->CKTstate0 + here->B1capbs); - value->rValue *= here->B1m; - return(OK); - case BSIM1_CQBS: - value->rValue = *(ckt->CKTstate0 + here->B1cqbs); - value->rValue *= here->B1m; - return(OK); - case BSIM1_CDG: - value->rValue = *(ckt->CKTstate0 + here->B1cdgb); - value->rValue *= here->B1m; - return(OK); - case BSIM1_CDD: - value->rValue = *(ckt->CKTstate0 + here->B1cddb); - value->rValue *= here->B1m; - return(OK); - case BSIM1_CDS: - value->rValue = *(ckt->CKTstate0 + here->B1cdsb); - value->rValue *= here->B1m; - return(OK); - case BSIM1_VON: - value->rValue = *(ckt->CKTstate0 + here->B1vono); - return(OK); - case BSIM1_QBS: - value->rValue = *(ckt->CKTstate0 + here->B1qbs); - value->rValue *= here->B1m; - return(OK); - case BSIM1_QBD: - value->rValue = *(ckt->CKTstate0 + here->B1qbd); - value->rValue *= here->B1m; - return(OK); - default: - return(E_BADPARM); - } - /* NOTREACHED */ -} - diff --git a/src/spicelib/devices/bsim1/b1cvtest.c b/src/spicelib/devices/bsim1/b1cvtest.c deleted file mode 100644 index df0b0be60..000000000 --- a/src/spicelib/devices/bsim1/b1cvtest.c +++ /dev/null @@ -1,115 +0,0 @@ -/********** -Copyright 1990 Regents of the University of California. All rights reserved. -Author: 1985 Hong J. Park, Thomas L. Quarles -**********/ - -#include "ngspice/ngspice.h" -#include "ngspice/cktdefs.h" -#include "bsim1def.h" -#include "ngspice/trandefs.h" -#include "ngspice/const.h" -#include "ngspice/devdefs.h" -#include "ngspice/sperror.h" -#include "ngspice/suffix.h" - -int -B1convTest(GENmodel *inModel, CKTcircuit *ckt) - - /* actually load the current value into the - * sparse matrix previously provided - */ -{ - B1model *model = (B1model*)inModel; - B1instance *here; - double cbd; - double cbhat; - double cbs; - double cd; - double cdhat; - double delvbd; - double delvbs; - double delvds; - double delvgd; - double delvgs; - double tol; - double vbd; - double vbs; - double vds; - double vgd; - double vgdo; - double vgs; - - - /* loop through all the B1 device models */ - for( ; model != NULL; model = B1nextModel(model)) { - - /* loop through all the instances of the model */ - for (here = B1instances(model); here != NULL ; - here=B1nextInstance(here)) { - - vbs = model->B1type * ( - *(ckt->CKTrhsOld+here->B1bNode) - - *(ckt->CKTrhsOld+here->B1sNodePrime)); - vgs = model->B1type * ( - *(ckt->CKTrhsOld+here->B1gNode) - - *(ckt->CKTrhsOld+here->B1sNodePrime)); - vds = model->B1type * ( - *(ckt->CKTrhsOld+here->B1dNodePrime) - - *(ckt->CKTrhsOld+here->B1sNodePrime)); - vbd=vbs-vds; - vgd=vgs-vds; - vgdo = *(ckt->CKTstate0 + here->B1vgs) - - *(ckt->CKTstate0 + here->B1vds); - delvbs = vbs - *(ckt->CKTstate0 + here->B1vbs); - delvbd = vbd - *(ckt->CKTstate0 + here->B1vbd); - delvgs = vgs - *(ckt->CKTstate0 + here->B1vgs); - delvds = vds - *(ckt->CKTstate0 + here->B1vds); - delvgd = vgd-vgdo; - - if (here->B1mode >= 0) { - cdhat= - *(ckt->CKTstate0 + here->B1cd) - - *(ckt->CKTstate0 + here->B1gbd) * delvbd + - *(ckt->CKTstate0 + here->B1gmbs) * delvbs + - *(ckt->CKTstate0 + here->B1gm) * delvgs + - *(ckt->CKTstate0 + here->B1gds) * delvds ; - } else { - cdhat= - *(ckt->CKTstate0 + here->B1cd) - - ( *(ckt->CKTstate0 + here->B1gbd) - - *(ckt->CKTstate0 + here->B1gmbs)) * delvbd - - *(ckt->CKTstate0 + here->B1gm) * delvgd + - *(ckt->CKTstate0 + here->B1gds) * delvds; - } - cbhat= - *(ckt->CKTstate0 + here->B1cbs) + - *(ckt->CKTstate0 + here->B1cbd) + - *(ckt->CKTstate0 + here->B1gbd) * delvbd + - *(ckt->CKTstate0 + here->B1gbs) * delvbs ; - - cd = *(ckt->CKTstate0 + here->B1cd); - cbs = *(ckt->CKTstate0 + here->B1cbs); - cbd = *(ckt->CKTstate0 + here->B1cbd); - /* - * check convergence - */ - if ( (here->B1off == 0) || (!(ckt->CKTmode & MODEINITFIX)) ){ - tol=ckt->CKTreltol*MAX(fabs(cdhat),fabs(cd))+ckt->CKTabstol; - if (fabs(cdhat-cd) >= tol) { - ckt->CKTnoncon++; - ckt->CKTtroubleElt = (GENinstance *) here; - return(OK); - } - tol=ckt->CKTreltol*MAX(fabs(cbhat),fabs(cbs+cbd))+ - ckt->CKTabstol; - if (fabs(cbhat-(cbs+cbd)) > tol) { - ckt->CKTnoncon++; - ckt->CKTtroubleElt = (GENinstance *) here; - return(OK); - } - } - } - } - return(OK); -} - diff --git a/src/spicelib/devices/bsim1/b1disto.c b/src/spicelib/devices/bsim1/b1disto.c deleted file mode 100644 index f53302afd..000000000 --- a/src/spicelib/devices/bsim1/b1disto.c +++ /dev/null @@ -1,1730 +0,0 @@ -/********** -Copyright 1990 Regents of the University of California. All rights reserved. -Author: 1988 Jaijeet S Roychowdhury -Modified: AlansFixes -**********/ - -#include "ngspice/ngspice.h" -#include "ngspice/cktdefs.h" -#include "bsim1def.h" -#include "ngspice/sperror.h" -#include "ngspice/distodef.h" -#include "ngspice/suffix.h" - -int -B1disto(int mode, GENmodel *genmodel, CKTcircuit *ckt) -/* assuming here that ckt->CKTomega has been initialised to - * the correct value - */ -{ - B1model *model = (B1model *) genmodel; - DISTOAN* job = (DISTOAN*) ckt->CKTcurJob; - DpassStr pass; - double r1h1x,i1h1x; - double r1h1y,i1h1y; - double r1h1z, i1h1z; - double r1h2x, i1h2x; - double r1h2y, i1h2y; - double r1h2z, i1h2z; - double r1hm2x,i1hm2x; - double r1hm2y,i1hm2y; - double r1hm2z, i1hm2z; - double r2h11x,i2h11x; - double r2h11y,i2h11y; - double r2h11z, i2h11z; - double r2h1m2x,i2h1m2x; - double r2h1m2y,i2h1m2y; - double r2h1m2z, i2h1m2z; - double temp, itemp; - B1instance *here; - -if (mode == D_SETUP) - return(B1dSetup((GENmodel *)model,ckt)); - -if ((mode == D_TWOF1) || (mode == D_THRF1) || - (mode == D_F1PF2) || (mode == D_F1MF2) || - (mode == D_2F1MF2)) { - - /* loop through all the B1 models */ -for( ; model != NULL; model = B1nextModel(model)) { - - /* loop through all the instances of the model */ - for (here = B1instances(model); here != NULL ; - here=B1nextInstance(here)) { - - /* loading starts here */ - - switch (mode) { - case D_TWOF1: - /* from now on, in the 3-var case, x=vgs,y=vbs,z=vds */ - - { - /* draincurrent term */ - r1h1x = *(job->r1H1ptr + here->B1gNode) - - *(job->r1H1ptr + here->B1sNodePrime); - i1h1x = *(job->i1H1ptr + here->B1gNode) - - *(job->i1H1ptr + here->B1sNodePrime); - - r1h1y = *(job->r1H1ptr + here->B1bNode) - - *(job->r1H1ptr + here->B1sNodePrime); - i1h1y = *(job->i1H1ptr + here->B1bNode) - - *(job->i1H1ptr + here->B1sNodePrime); - - r1h1z = *(job->r1H1ptr + here->B1dNodePrime) - - *(job->r1H1ptr + here->B1sNodePrime); - - i1h1z = *(job->i1H1ptr + here->B1dNodePrime) - - *(job->i1H1ptr + here->B1sNodePrime); - - /* draincurrent is a function of vgs,vbs,and vds; - * have got their linear kernels; now to call - * load functions - */ - - temp = DFn2F1(here->DrC_x2, - here->DrC_y2, - here->DrC_z2, - here->DrC_xy, - here->DrC_yz, - here->DrC_xz, - r1h1x, - i1h1x, - r1h1y, - i1h1y, - r1h1z, - i1h1z); - - itemp = DFi2F1(here->DrC_x2, - here->DrC_y2, - here->DrC_z2, - here->DrC_xy, - here->DrC_yz, - here->DrC_xz, - r1h1x, - i1h1x, - r1h1y, - i1h1y, - r1h1z, - i1h1z); - - *(ckt->CKTrhs + here->B1dNodePrime) -= temp; - *(ckt->CKTirhs + here->B1dNodePrime) -= itemp; - - *(ckt->CKTrhs + here->B1sNodePrime) += temp; - *(ckt->CKTirhs + here->B1sNodePrime) += itemp; - - /* draincurrent term loading over */ - - - - /* loading qg term */ - - /* kernels for vgs,vbs and vds already set up */ - - temp = -ckt->CKTomega * DFi2F1(here->qg_x2, - here->qg_y2, - here->qg_z2, - here->qg_xy, - here->qg_yz, - here->qg_xz, - r1h1x, - i1h1x, - r1h1y, - i1h1y, - r1h1z, - i1h1z); - - itemp = ckt->CKTomega * DFn2F1(here->qg_x2, - here->qg_y2, - here->qg_z2, - here->qg_xy, - here->qg_yz, - here->qg_xz, - r1h1x, - i1h1x, - r1h1y, - i1h1y, - r1h1z, - i1h1z); - - *(ckt->CKTrhs + here->B1gNode) -= temp; - *(ckt->CKTirhs + here->B1gNode) -= itemp; - - *(ckt->CKTrhs + here->B1sNodePrime) += temp; - *(ckt->CKTirhs + here->B1sNodePrime) += itemp; - - /* qg term over */ - - /* loading qb term */ - - /* kernels for vgs,vbs and vds already set up */ - - temp = -ckt->CKTomega * DFi2F1(here->qb_x2, - here->qb_y2, - here->qb_z2, - here->qb_xy, - here->qb_yz, - here->qb_xz, - r1h1x, - i1h1x, - r1h1y, - i1h1y, - r1h1z, - i1h1z); - - itemp = ckt->CKTomega * DFn2F1(here->qb_x2, - here->qb_y2, - here->qb_z2, - here->qb_xy, - here->qb_yz, - here->qb_xz, - r1h1x, - i1h1x, - r1h1y, - i1h1y, - r1h1z, - i1h1z); - - *(ckt->CKTrhs + here->B1bNode) -= temp; - *(ckt->CKTirhs + here->B1bNode) -= itemp; - - *(ckt->CKTrhs + here->B1sNodePrime) += temp; - *(ckt->CKTirhs + here->B1sNodePrime) += itemp; - - /* qb term over */ - - /* loading qd term */ - - /* kernels for vgs,vbs and vds already set up */ - - temp = -ckt->CKTomega * DFi2F1(here->qd_x2, - here->qd_y2, - here->qd_z2, - here->qd_xy, - here->qd_yz, - here->qd_xz, - r1h1x, - i1h1x, - r1h1y, - i1h1y, - r1h1z, - i1h1z); - - itemp = ckt->CKTomega * DFn2F1(here->qd_x2, - here->qd_y2, - here->qd_z2, - here->qd_xy, - here->qd_yz, - here->qd_xz, - r1h1x, - i1h1x, - r1h1y, - i1h1y, - r1h1z, - i1h1z); - - *(ckt->CKTrhs + here->B1dNodePrime) -= temp; - *(ckt->CKTirhs + here->B1dNodePrime) -= itemp; - - *(ckt->CKTrhs + here->B1sNodePrime) += temp; - *(ckt->CKTirhs + here->B1sNodePrime) += itemp; - - /* qd term over */ - - /* loading here->B1gbs term */ - - r1h1x = *(job->r1H1ptr + here->B1bNode) - - *(job->r1H1ptr + here->B1sNodePrime); - i1h1x = *(job->i1H1ptr + here->B1bNode) - - *(job->i1H1ptr + here->B1sNodePrime); - - /* now r1h1x = vbs */ - - temp = D1n2F1(here->gbs2, - r1h1x, - i1h1x); - - itemp = D1i2F1(here->gbs2, - r1h1x, - i1h1x); - - *(ckt->CKTrhs + here->B1bNode) -= temp; - *(ckt->CKTirhs + here->B1bNode) -= itemp; - - *(ckt->CKTrhs + here->B1sNodePrime) += temp; - *(ckt->CKTirhs + here->B1sNodePrime) += itemp; - - /* here->B1gbs term over */ - - /* loading here->B1gbd term */ - - r1h1x = *(job->r1H1ptr + here->B1bNode) - - *(job->r1H1ptr + here->B1dNodePrime); - i1h1x = *(job->i1H1ptr + here->B1bNode) - - *(job->i1H1ptr + here->B1dNodePrime); - - /* now r1h1x = vbd */ - - temp = D1n2F1(here->gbd2, - r1h1x, - i1h1x); - - itemp = D1i2F1(here->gbd2, - r1h1x, - i1h1x); - - *(ckt->CKTrhs + here->B1gNode) -= temp; - *(ckt->CKTirhs + here->B1gNode) -= itemp; - - *(ckt->CKTrhs + here->B1dNodePrime) += temp; - *(ckt->CKTirhs + here->B1dNodePrime) += itemp; - - /* here->B1gbd term over */ - - /* all done */ - } - - break; - - case D_THRF1: - /* from now on, in the 3-var case, x=vgs,y=vbs,z=vds */ - - { - /* draincurrent term */ - r1h1x = *(job->r1H1ptr + here->B1gNode) - - *(job->r1H1ptr + here->B1sNodePrime); - i1h1x = *(job->i1H1ptr + here->B1gNode) - - *(job->i1H1ptr + here->B1sNodePrime); - - r1h1y = *(job->r1H1ptr + here->B1bNode) - - *(job->r1H1ptr + here->B1sNodePrime); - i1h1y = *(job->i1H1ptr + here->B1bNode) - - *(job->i1H1ptr + here->B1sNodePrime); - - r1h1z = *(job->r1H1ptr + here->B1dNodePrime) - - *(job->r1H1ptr + here->B1sNodePrime); - - i1h1z = *(job->i1H1ptr + here->B1dNodePrime) - - *(job->i1H1ptr + here->B1sNodePrime); - - r2h11x = *(job->r2H11ptr + here->B1gNode) - - *(job->r2H11ptr + here->B1sNodePrime); - i2h11x = *(job->i2H11ptr + here->B1gNode) - - *(job->i2H11ptr + here->B1sNodePrime); - - r2h11y = *(job->r2H11ptr + here->B1bNode) - - *(job->r2H11ptr + here->B1sNodePrime); - i2h11y = *(job->i2H11ptr + here->B1bNode) - - *(job->i2H11ptr + here->B1sNodePrime); - - r2h11z = *(job->r2H11ptr + here->B1dNodePrime) - - *(job->r2H11ptr + here->B1sNodePrime); - - i2h11z = *(job->i2H11ptr + here->B1dNodePrime) - - *(job->i2H11ptr + here->B1sNodePrime); - - /* draincurrent is a function of vgs,vbs,and vds; - * have got their linear kernels; now to call - * load functions - */ - - temp = DFn3F1(here->DrC_x2, - here->DrC_y2, - here->DrC_z2, - here->DrC_xy, - here->DrC_yz, - here->DrC_xz, - here->DrC_x3, - here->DrC_y3, - here->DrC_z3, - here->DrC_x2y, - here->DrC_x2z, - here->DrC_xy2, - here->DrC_y2z, - here->DrC_xz2, - here->DrC_yz2, - here->DrC_xyz, - r1h1x, - i1h1x, - r1h1y, - i1h1y, - r1h1z, - i1h1z, - r2h11x, - i2h11x, - r2h11y, - i2h11y, - r2h11z, - i2h11z); - - itemp = DFi3F1(here->DrC_x2, - here->DrC_y2, - here->DrC_z2, - here->DrC_xy, - here->DrC_yz, - here->DrC_xz, - here->DrC_x3, - here->DrC_y3, - here->DrC_z3, - here->DrC_x2y, - here->DrC_x2z, - here->DrC_xy2, - here->DrC_y2z, - here->DrC_xz2, - here->DrC_yz2, - here->DrC_xyz, - r1h1x, - i1h1x, - r1h1y, - i1h1y, - r1h1z, - i1h1z, - r2h11x, - i2h11x, - r2h11y, - i2h11y, - r2h11z, - i2h11z); - - *(ckt->CKTrhs + here->B1dNodePrime) -= temp; - *(ckt->CKTirhs + here->B1dNodePrime) -= itemp; - - *(ckt->CKTrhs + here->B1sNodePrime) += temp; - *(ckt->CKTirhs + here->B1sNodePrime) += itemp; - - /* draincurrent term loading over */ - - - - /* loading qg term */ - - /* kernels for vgs,vbs and vds already set up */ - - temp = -ckt->CKTomega * DFi3F1(here->qg_x2, - here->qg_y2, - here->qg_z2, - here->qg_xy, - here->qg_yz, - here->qg_xz, - here->qg_x3, - here->qg_y3, - here->qg_z3, - here->qg_x2y, - here->qg_x2z, - here->qg_xy2, - here->qg_y2z, - here->qg_xz2, - here->qg_yz2, - here->qg_xyz, - r1h1x, - i1h1x, - r1h1y, - i1h1y, - r1h1z, - i1h1z, - r2h11x, - i2h11x, - r2h11y, - i2h11y, - r2h11z, - i2h11z); - - itemp = ckt->CKTomega * DFn3F1(here->qg_x2, - here->qg_y2, - here->qg_z2, - here->qg_xy, - here->qg_yz, - here->qg_xz, - here->qg_x3, - here->qg_y3, - here->qg_z3, - here->qg_x2y, - here->qg_x2z, - here->qg_xy2, - here->qg_y2z, - here->qg_xz2, - here->qg_yz2, - here->qg_xyz, - r1h1x, - i1h1x, - r1h1y, - i1h1y, - r1h1z, - i1h1z, - r2h11x, - i2h11x, - r2h11y, - i2h11y, - r2h11z, - i2h11z); - - *(ckt->CKTrhs + here->B1gNode) -= temp; - *(ckt->CKTirhs + here->B1gNode) -= itemp; - - *(ckt->CKTrhs + here->B1sNodePrime) += temp; - *(ckt->CKTirhs + here->B1sNodePrime) += itemp; - - /* qg term over */ - - /* loading qb term */ - - /* kernels for vgs,vbs and vds already set up */ - - temp = -ckt->CKTomega * DFi3F1(here->qb_x2, - here->qb_y2, - here->qb_z2, - here->qb_xy, - here->qb_yz, - here->qb_xz, - here->qb_x3, - here->qb_y3, - here->qb_z3, - here->qb_x2y, - here->qb_x2z, - here->qb_xy2, - here->qb_y2z, - here->qb_xz2, - here->qb_yz2, - here->qb_xyz, - r1h1x, - i1h1x, - r1h1y, - i1h1y, - r1h1z, - i1h1z, - r2h11x, - i2h11x, - r2h11y, - i2h11y, - r2h11z, - i2h11z); - - itemp = ckt->CKTomega * DFn3F1(here->qb_x2, - here->qb_y2, - here->qb_z2, - here->qb_xy, - here->qb_yz, - here->qb_xz, - here->qb_x3, - here->qb_y3, - here->qb_z3, - here->qb_x2y, - here->qb_x2z, - here->qb_xy2, - here->qb_y2z, - here->qb_xz2, - here->qb_yz2, - here->qb_xyz, - r1h1x, - i1h1x, - r1h1y, - i1h1y, - r1h1z, - i1h1z, - r2h11x, - i2h11x, - r2h11y, - i2h11y, - r2h11z, - i2h11z); - - *(ckt->CKTrhs + here->B1bNode) -= temp; - *(ckt->CKTirhs + here->B1bNode) -= itemp; - - *(ckt->CKTrhs + here->B1sNodePrime) += temp; - *(ckt->CKTirhs + here->B1sNodePrime) += itemp; - - /* qb term over */ - - /* loading qd term */ - - /* kernels for vgs,vbs and vds already set up */ - - temp = -ckt->CKTomega * DFi3F1(here->qd_x2, - here->qd_y2, - here->qd_z2, - here->qd_xy, - here->qd_yz, - here->qd_xz, - here->qd_x3, - here->qd_y3, - here->qd_z3, - here->qd_x2y, - here->qd_x2z, - here->qd_xy2, - here->qd_y2z, - here->qd_xz2, - here->qd_yz2, - here->qd_xyz, - r1h1x, - i1h1x, - r1h1y, - i1h1y, - r1h1z, - i1h1z, - r2h11x, - i2h11x, - r2h11y, - i2h11y, - r2h11z, - i2h11z); - - itemp = ckt->CKTomega * DFn3F1(here->qd_x2, - here->qd_y2, - here->qd_z2, - here->qd_xy, - here->qd_yz, - here->qd_xz, - here->qd_x3, - here->qd_y3, - here->qd_z3, - here->qd_x2y, - here->qd_x2z, - here->qd_xy2, - here->qd_y2z, - here->qd_xz2, - here->qd_yz2, - here->qd_xyz, - r1h1x, - i1h1x, - r1h1y, - i1h1y, - r1h1z, - i1h1z, - r2h11x, - i2h11x, - r2h11y, - i2h11y, - r2h11z, - i2h11z); - - *(ckt->CKTrhs + here->B1dNodePrime) -= temp; - *(ckt->CKTirhs + here->B1dNodePrime) -= itemp; - - *(ckt->CKTrhs + here->B1sNodePrime) += temp; - *(ckt->CKTirhs + here->B1sNodePrime) += itemp; - - /* qd term over */ - - /* loading here->B1gbs term */ - - r1h1x = *(job->r1H1ptr + here->B1bNode) - - *(job->r1H1ptr + here->B1sNodePrime); - i1h1x = *(job->i1H1ptr + here->B1bNode) - - *(job->i1H1ptr + here->B1sNodePrime); - - r2h11x = *(job->r2H11ptr + here->B1bNode) - - *(job->r2H11ptr + here->B1sNodePrime); - i2h11x = *(job->i2H11ptr + here->B1bNode) - - *(job->i2H11ptr + here->B1sNodePrime); - - /* now r1h1x = vbs */ - - temp = D1n3F1(here->gbs2, - here->gbs3, - r1h1x, - i1h1x, - r2h11x, - i2h11x); - - itemp = D1i3F1(here->gbs2, - here->gbs3, - r1h1x, - i1h1x, - r2h11x, - i2h11x); - - - *(ckt->CKTrhs + here->B1bNode) -= temp; - *(ckt->CKTirhs + here->B1bNode) -= itemp; - - *(ckt->CKTrhs + here->B1sNodePrime) += temp; - *(ckt->CKTirhs + here->B1sNodePrime) += itemp; - - /* here->B1gbs term over */ - - /* loading here->B1gbd term */ - - r1h1x = *(job->r1H1ptr + here->B1bNode) - - *(job->r1H1ptr + here->B1dNodePrime); - i1h1x = *(job->i1H1ptr + here->B1bNode) - - *(job->i1H1ptr + here->B1dNodePrime); - - r2h11x = *(job->r2H11ptr + here->B1bNode) - - *(job->r2H11ptr + here->B1dNodePrime); - i2h11x = *(job->i2H11ptr + here->B1bNode) - - *(job->i2H11ptr + here->B1dNodePrime); - - /* now r1h1x = vbd */ - - temp = D1n3F1(here->gbd2, - here->gbd3, - r1h1x, - i1h1x, - r2h11x, - i2h11x); - - itemp = D1i3F1(here->gbd2, - here->gbd3, - r1h1x, - i1h1x, - r2h11x, - i2h11x); - - - *(ckt->CKTrhs + here->B1bNode) -= temp; - *(ckt->CKTirhs + here->B1bNode) -= itemp; - - *(ckt->CKTrhs + here->B1dNodePrime) += temp; - *(ckt->CKTirhs + here->B1dNodePrime) += itemp; - - /* here->B1gbd term over */ - - /* all done */ - } - - break; - case D_F1PF2: - /* from now on, in the 3-var case, x=vgs,y=vbs,z=vds */ - - { - /* draincurrent term */ - r1h1x = *(job->r1H1ptr + here->B1gNode) - - *(job->r1H1ptr + here->B1sNodePrime); - i1h1x = *(job->i1H1ptr + here->B1gNode) - - *(job->i1H1ptr + here->B1sNodePrime); - - r1h1y = *(job->r1H1ptr + here->B1bNode) - - *(job->r1H1ptr + here->B1sNodePrime); - i1h1y = *(job->i1H1ptr + here->B1bNode) - - *(job->i1H1ptr + here->B1sNodePrime); - - r1h1z = *(job->r1H1ptr + here->B1dNodePrime) - - *(job->r1H1ptr + here->B1sNodePrime); - - i1h1z = *(job->i1H1ptr + here->B1dNodePrime) - - *(job->i1H1ptr + here->B1sNodePrime); - - r1h2x = *(job->r1H2ptr + here->B1gNode) - - *(job->r1H2ptr + here->B1sNodePrime); - i1h2x = (*(job->i1H2ptr + here->B1gNode) - - *(job->i1H2ptr + here->B1sNodePrime)); - - r1h2y = *(job->r1H2ptr + here->B1bNode) - - *(job->r1H2ptr + here->B1sNodePrime); - i1h2y = (*(job->i1H2ptr + here->B1bNode) - - *(job->i1H2ptr + here->B1sNodePrime)); - - r1h2z = *(job->r1H2ptr + here->B1dNodePrime) - - *(job->r1H2ptr + here->B1sNodePrime); - - i1h2z = (*(job->i1H2ptr + here->B1dNodePrime) - - *(job->i1H2ptr + here->B1sNodePrime)); - - /* draincurrent is a function of vgs,vbs,and vds; - * have got their linear kernels; now to call - * load functions - */ - - temp = DFnF12(here->DrC_x2, - here->DrC_y2, - here->DrC_z2, - here->DrC_xy, - here->DrC_yz, - here->DrC_xz, - r1h1x, - i1h1x, - r1h1y, - i1h1y, - r1h1z, - i1h1z, - r1h2x, - i1h2x, - r1h2y, - i1h2y, - r1h2z, - i1h2z); - - itemp = DFiF12(here->DrC_x2, - here->DrC_y2, - here->DrC_z2, - here->DrC_xy, - here->DrC_yz, - here->DrC_xz, - r1h1x, - i1h1x, - r1h1y, - i1h1y, - r1h1z, - i1h1z, - r1h2x, - i1h2x, - r1h2y, - i1h2y, - r1h2z, - i1h2z); - - *(ckt->CKTrhs + here->B1dNodePrime) -= temp; - *(ckt->CKTirhs + here->B1dNodePrime) -= itemp; - - *(ckt->CKTrhs + here->B1sNodePrime) += temp; - *(ckt->CKTirhs + here->B1sNodePrime) += itemp; - - /* draincurrent term loading over */ - - - - /* loading qg term */ - - /* kernels for vgs,vbs and vds already set up */ - - temp = -ckt->CKTomega * DFiF12(here->qg_x2, - here->qg_y2, - here->qg_z2, - here->qg_xy, - here->qg_yz, - here->qg_xz, - r1h1x, - i1h1x, - r1h1y, - i1h1y, - r1h1z, - i1h1z, - r1h2x, - i1h2x, - r1h2y, - i1h2y, - r1h2z, - i1h2z); - - itemp = ckt->CKTomega * DFnF12(here->qg_x2, - here->qg_y2, - here->qg_z2, - here->qg_xy, - here->qg_yz, - here->qg_xz, - r1h1x, - i1h1x, - r1h1y, - i1h1y, - r1h1z, - i1h1z, - r1h2x, - i1h2x, - r1h2y, - i1h2y, - r1h2z, - i1h2z); - - *(ckt->CKTrhs + here->B1gNode) -= temp; - *(ckt->CKTirhs + here->B1gNode) -= itemp; - - *(ckt->CKTrhs + here->B1sNodePrime) += temp; - *(ckt->CKTirhs + here->B1sNodePrime) += itemp; - - /* qg term over */ - - /* loading qb term */ - - /* kernels for vgs,vbs and vds already set up */ - - temp = -ckt->CKTomega * DFiF12(here->qb_x2, - here->qb_y2, /* XXX Bug fixed: fewer arguments passed than declared */ - here->qb_z2, - here->qb_xy, - here->qb_yz, - here->qb_xz, - r1h1x, - i1h1x, - r1h1y, - i1h1y, - r1h1z, - i1h1z, - r1h2x, - i1h2x, - r1h2y, - i1h2y, - r1h2z, - i1h2z); - - itemp = ckt->CKTomega * DFnF12(here->qb_x2, - here->qb_y2, - here->qb_z2, - here->qb_xy, - here->qb_yz, - here->qb_xz, - r1h1x, - i1h1x, - r1h1y, - i1h1y, - r1h1z, - i1h1z, - r1h2x, - i1h2x, - r1h2y, - i1h2y, - r1h2z, - i1h2z); - - *(ckt->CKTrhs + here->B1bNode) -= temp; - *(ckt->CKTirhs + here->B1bNode) -= itemp; - - *(ckt->CKTrhs + here->B1sNodePrime) += temp; - *(ckt->CKTirhs + here->B1sNodePrime) += itemp; - - /* qb term over */ - - /* loading qd term */ - - /* kernels for vgs,vbs and vds already set up */ - - temp = -ckt->CKTomega * DFiF12(here->qd_x2, - here->qd_y2, - here->qd_z2, - here->qd_xy, - here->qd_yz, - here->qd_xz, - r1h1x, - i1h1x, - r1h1y, - i1h1y, - r1h1z, - i1h1z, - r1h2x, - i1h2x, - r1h2y, - i1h2y, - r1h2z, - i1h2z); - - itemp = ckt->CKTomega * DFnF12(here->qd_x2, - here->qd_y2, - here->qd_z2, - here->qd_xy, - here->qd_yz, - here->qd_xz, - r1h1x, - i1h1x, - r1h1y, - i1h1y, - r1h1z, - i1h1z, - r1h2x, - i1h2x, - r1h2y, - i1h2y, - r1h2z, - i1h2z); - - *(ckt->CKTrhs + here->B1dNodePrime) -= temp; - *(ckt->CKTirhs + here->B1dNodePrime) -= itemp; - - *(ckt->CKTrhs + here->B1sNodePrime) += temp; - *(ckt->CKTirhs + here->B1sNodePrime) += itemp; - - /* qd term over */ - - /* loading here->B1gbs term */ - - r1h1x = *(job->r1H1ptr + here->B1bNode) - - *(job->r1H1ptr + here->B1sNodePrime); - i1h1x = *(job->i1H1ptr + here->B1bNode) - - *(job->i1H1ptr + here->B1sNodePrime); - - r1h2x = *(job->r1H2ptr + here->B1bNode) - - *(job->r1H2ptr + here->B1sNodePrime); - i1h2x = *(job->i1H2ptr + here->B1bNode) - - *(job->i1H2ptr + here->B1sNodePrime); - - /* now r1h1x = vbs */ - - temp = D1nF12(here->gbs2, - r1h1x, - i1h1x, - r1h2x, - i1h2x); - - itemp = D1iF12(here->gbs2, - r1h1x, - i1h1x, - r1h2x, - i1h2x); - - *(ckt->CKTrhs + here->B1bNode) -= temp; - *(ckt->CKTirhs + here->B1bNode) -= itemp; - - *(ckt->CKTrhs + here->B1sNodePrime) += temp; - *(ckt->CKTirhs + here->B1sNodePrime) += itemp; - - /* here->B1gbs term over */ - - /* loading here->B1gbd term */ - - r1h1x = *(job->r1H1ptr + here->B1bNode) - - *(job->r1H1ptr + here->B1dNodePrime); - i1h1x = *(job->i1H1ptr + here->B1bNode) - - *(job->i1H1ptr + here->B1dNodePrime); - - r1h2x = *(job->r1H2ptr + here->B1bNode) - - *(job->r1H2ptr + here->B1dNodePrime); - i1h2x = *(job->i1H2ptr + here->B1bNode) - - *(job->i1H2ptr + here->B1dNodePrime); - - /* now r1h1x = vbd */ - - temp = D1nF12(here->gbd2, - r1h1x, - i1h1x, - r1h2x, - i1h2x); - - itemp = D1iF12(here->gbd2, - r1h1x, - i1h1x, - r1h2x, - i1h2x); - - *(ckt->CKTrhs + here->B1gNode) -= temp; - *(ckt->CKTirhs + here->B1gNode) -= itemp; - - *(ckt->CKTrhs + here->B1dNodePrime) += temp; - *(ckt->CKTirhs + here->B1dNodePrime) += itemp; - - /* here->B1gbd term over */ - - /* all done */ - } - - break; - case D_F1MF2: - /* from now on, in the 3-var case, x=vgs,y=vbs,z=vds */ - - { - /* draincurrent term */ - r1h1x = *(job->r1H1ptr + here->B1gNode) - - *(job->r1H1ptr + here->B1sNodePrime); - i1h1x = *(job->i1H1ptr + here->B1gNode) - - *(job->i1H1ptr + here->B1sNodePrime); - - r1h1y = *(job->r1H1ptr + here->B1bNode) - - *(job->r1H1ptr + here->B1sNodePrime); - i1h1y = *(job->i1H1ptr + here->B1bNode) - - *(job->i1H1ptr + here->B1sNodePrime); - - r1h1z = *(job->r1H1ptr + here->B1dNodePrime) - - *(job->r1H1ptr + here->B1sNodePrime); - - i1h1z = *(job->i1H1ptr + here->B1dNodePrime) - - *(job->i1H1ptr + here->B1sNodePrime); - - r1hm2x = *(job->r1H2ptr + here->B1gNode) - - *(job->r1H2ptr + here->B1sNodePrime); - i1hm2x = -(*(job->i1H2ptr + here->B1gNode) - - *(job->i1H2ptr + here->B1sNodePrime)); - - r1hm2y = *(job->r1H2ptr + here->B1bNode) - - *(job->r1H2ptr + here->B1sNodePrime); - i1hm2y = -(*(job->i1H2ptr + here->B1bNode) - - *(job->i1H2ptr + here->B1sNodePrime)); - - r1hm2z = *(job->r1H2ptr + here->B1dNodePrime) - - *(job->r1H2ptr + here->B1sNodePrime); - - i1hm2z = -(*(job->i1H2ptr + here->B1dNodePrime) - - *(job->i1H2ptr + here->B1sNodePrime)); - - /* draincurrent is a function of vgs,vbs,and vds; - * have got their linear kernels; now to call - * load functions - */ - - temp = DFnF12(here->DrC_x2, - here->DrC_y2, - here->DrC_z2, - here->DrC_xy, - here->DrC_yz, - here->DrC_xz, - r1h1x, - i1h1x, - r1h1y, - i1h1y, - r1h1z, - i1h1z, - r1hm2x, - i1hm2x, - r1hm2y, - i1hm2y, - r1hm2z, - i1hm2z); - - itemp = DFiF12(here->DrC_x2, - here->DrC_y2, - here->DrC_z2, - here->DrC_xy, - here->DrC_yz, - here->DrC_xz, - r1h1x, - i1h1x, - r1h1y, - i1h1y, - r1h1z, - i1h1z, - r1hm2x, - i1hm2x, - r1hm2y, - i1hm2y, - r1hm2z, - i1hm2z); - - *(ckt->CKTrhs + here->B1dNodePrime) -= temp; - *(ckt->CKTirhs + here->B1dNodePrime) -= itemp; - - *(ckt->CKTrhs + here->B1sNodePrime) += temp; - *(ckt->CKTirhs + here->B1sNodePrime) += itemp; - - /* draincurrent term loading over */ - - - - /* loading qg term */ - - /* kernels for vgs,vbs and vds already set up */ - - temp = -ckt->CKTomega * DFiF12(here->qg_x2, - here->qg_y2, - here->qg_z2, - here->qg_xy, - here->qg_yz, - here->qg_xz, - r1h1x, - i1h1x, - r1h1y, - i1h1y, - r1h1z, - i1h1z, - r1hm2x, - i1hm2x, - r1hm2y, - i1hm2y, - r1hm2z, - i1hm2z); - - itemp = ckt->CKTomega * DFnF12(here->qg_x2, - here->qg_y2, - here->qg_z2, - here->qg_xy, - here->qg_yz, - here->qg_xz, - r1h1x, - i1h1x, - r1h1y, - i1h1y, - r1h1z, - i1h1z, - r1hm2x, - i1hm2x, - r1hm2y, - i1hm2y, - r1hm2z, - i1hm2z); - - *(ckt->CKTrhs + here->B1gNode) -= temp; - *(ckt->CKTirhs + here->B1gNode) -= itemp; - - *(ckt->CKTrhs + here->B1sNodePrime) += temp; - *(ckt->CKTirhs + here->B1sNodePrime) += itemp; - - /* qg term over */ - - /* loading qb term */ - - /* kernels for vgs,vbs and vds already set up */ - - temp = -ckt->CKTomega * DFiF12(here->qb_x2, - here->qb_y2, /* XXX Bug fixed: fewer arguments passed than declared */ - here->qb_z2, - here->qb_xy, - here->qb_yz, - here->qb_xz, - r1h1x, - i1h1x, - r1h1y, - i1h1y, - r1h1z, - i1h1z, - r1hm2x, - i1hm2x, - r1hm2y, - i1hm2y, - r1hm2z, - i1hm2z); - - itemp = ckt->CKTomega * DFnF12(here->qb_x2, - here->qb_y2, - here->qb_z2, - here->qb_xy, - here->qb_yz, - here->qb_xz, - r1h1x, - i1h1x, - r1h1y, - i1h1y, - r1h1z, - i1h1z, - r1hm2x, - i1hm2x, - r1hm2y, - i1hm2y, - r1hm2z, - i1hm2z); - - *(ckt->CKTrhs + here->B1bNode) -= temp; - *(ckt->CKTirhs + here->B1bNode) -= itemp; - - *(ckt->CKTrhs + here->B1sNodePrime) += temp; - *(ckt->CKTirhs + here->B1sNodePrime) += itemp; - - /* qb term over */ - - /* loading qd term */ - - /* kernels for vgs,vbs and vds already set up */ - - temp = -ckt->CKTomega * DFiF12(here->qd_x2, - here->qd_y2, - here->qd_z2, - here->qd_xy, - here->qd_yz, - here->qd_xz, - r1h1x, - i1h1x, - r1h1y, - i1h1y, - r1h1z, - i1h1z, - r1hm2x, - i1hm2x, - r1hm2y, - i1hm2y, - r1hm2z, - i1hm2z); - - itemp = ckt->CKTomega * DFnF12(here->qd_x2, - here->qd_y2, - here->qd_z2, - here->qd_xy, - here->qd_yz, - here->qd_xz, - r1h1x, - i1h1x, - r1h1y, - i1h1y, - r1h1z, - i1h1z, - r1hm2x, - i1hm2x, - r1hm2y, - i1hm2y, - r1hm2z, - i1hm2z); - - *(ckt->CKTrhs + here->B1dNodePrime) -= temp; - *(ckt->CKTirhs + here->B1dNodePrime) -= itemp; - - *(ckt->CKTrhs + here->B1sNodePrime) += temp; - *(ckt->CKTirhs + here->B1sNodePrime) += itemp; - - /* qd term over */ - - /* loading here->B1gbs term */ - - r1h1x = *(job->r1H1ptr + here->B1bNode) - - *(job->r1H1ptr + here->B1sNodePrime); - i1h1x = *(job->i1H1ptr + here->B1bNode) - - *(job->i1H1ptr + here->B1sNodePrime); - - r1hm2x = *(job->r1H2ptr + here->B1bNode) - - *(job->r1H2ptr + here->B1sNodePrime); - i1hm2x = -(*(job->i1H2ptr + here->B1bNode) - - *(job->i1H2ptr + here->B1sNodePrime)); - - /* now r1h1x = vbs */ - - temp = D1nF12(here->gbs2, - r1h1x, - i1h1x, - r1hm2x, - i1hm2x); - - itemp = D1iF12(here->gbs2, - r1h1x, - i1h1x, - r1hm2x, - i1hm2x); - - *(ckt->CKTrhs + here->B1bNode) -= temp; - *(ckt->CKTirhs + here->B1bNode) -= itemp; - - *(ckt->CKTrhs + here->B1sNodePrime) += temp; - *(ckt->CKTirhs + here->B1sNodePrime) += itemp; - - /* here->B1gbs term over */ - - /* loading here->B1gbd term */ - - r1h1x = *(job->r1H1ptr + here->B1bNode) - - *(job->r1H1ptr + here->B1dNodePrime); - i1h1x = *(job->i1H1ptr + here->B1bNode) - - *(job->i1H1ptr + here->B1dNodePrime); - - r1hm2x = *(job->r1H2ptr + here->B1bNode) - - *(job->r1H2ptr + here->B1dNodePrime); - i1hm2x = -(*(job->i1H2ptr + here->B1bNode) - - *(job->i1H2ptr + here->B1dNodePrime)); - - /* now r1h1x = vbd */ - - temp = D1nF12(here->gbd2, - r1h1x, - i1h1x, - r1hm2x, - i1hm2x); - - itemp = D1iF12(here->gbd2, - r1h1x, - i1h1x, - r1hm2x, - i1hm2x); - - *(ckt->CKTrhs + here->B1gNode) -= temp; - *(ckt->CKTirhs + here->B1gNode) -= itemp; - - *(ckt->CKTrhs + here->B1dNodePrime) += temp; - *(ckt->CKTirhs + here->B1dNodePrime) += itemp; - - /* here->B1gbd term over */ - - /* all done */ - } - - break; - case D_2F1MF2: - /* from now on, in the 3-var case, x=vgs,y=vbs,z=vds */ - - { - /* draincurrent term */ - r1h1x = *(job->r1H1ptr + here->B1gNode) - - *(job->r1H1ptr + here->B1sNodePrime); - i1h1x = *(job->i1H1ptr + here->B1gNode) - - *(job->i1H1ptr + here->B1sNodePrime); - - r1h1y = *(job->r1H1ptr + here->B1bNode) - - *(job->r1H1ptr + here->B1sNodePrime); - i1h1y = *(job->i1H1ptr + here->B1bNode) - - *(job->i1H1ptr + here->B1sNodePrime); - - r1h1z = *(job->r1H1ptr + here->B1dNodePrime) - - *(job->r1H1ptr + here->B1sNodePrime); - - i1h1z = *(job->i1H1ptr + here->B1dNodePrime) - - *(job->i1H1ptr + here->B1sNodePrime); - - r1hm2x = *(job->r1H2ptr + here->B1gNode) - - *(job->r1H2ptr + here->B1sNodePrime); - i1hm2x = -(*(job->i1H2ptr + here->B1gNode) - - *(job->i1H2ptr + here->B1sNodePrime)); - - r1hm2y = *(job->r1H2ptr + here->B1bNode) - - *(job->r1H2ptr + here->B1sNodePrime); - i1hm2y = -(*(job->i1H2ptr + here->B1bNode) - - *(job->i1H2ptr + here->B1sNodePrime)); - - r1hm2z = *(job->r1H2ptr + here->B1dNodePrime) - - *(job->r1H2ptr + here->B1sNodePrime); - - i1hm2z = -(*(job->i1H2ptr + here->B1dNodePrime) - - *(job->i1H2ptr + here->B1sNodePrime)); - - r2h11x = *(job->r2H11ptr + here->B1gNode) - - *(job->r2H11ptr + here->B1sNodePrime); - i2h11x = *(job->i2H11ptr + here->B1gNode) - - *(job->i2H11ptr + here->B1sNodePrime); - - r2h11y = *(job->r2H11ptr + here->B1bNode) - - *(job->r2H11ptr + here->B1sNodePrime); - i2h11y = *(job->i2H11ptr + here->B1bNode) - - *(job->i2H11ptr + here->B1sNodePrime); - - r2h11z = *(job->r2H11ptr + here->B1dNodePrime) - - *(job->r2H11ptr + here->B1sNodePrime); - - i2h11z = *(job->i2H11ptr + here->B1dNodePrime) - - *(job->i2H11ptr + here->B1sNodePrime); - - r2h1m2x = *(job->r2H1m2ptr + here->B1gNode) - - *(job->r2H1m2ptr + here->B1sNodePrime); - i2h1m2x = *(job->i2H1m2ptr + here->B1gNode) - - *(job->i2H1m2ptr + here->B1sNodePrime); - - r2h1m2y = *(job->r2H1m2ptr + here->B1bNode) - - *(job->r2H1m2ptr + here->B1sNodePrime); - i2h1m2y = *(job->i2H1m2ptr + here->B1bNode) - - *(job->i2H1m2ptr + here->B1sNodePrime); - - r2h1m2z = *(job->r2H1m2ptr + here->B1dNodePrime) - - *(job->r2H1m2ptr + here->B1sNodePrime); - - i2h1m2z = *(job->i2H1m2ptr + here->B1dNodePrime) - - *(job->i2H1m2ptr + here->B1sNodePrime); - - /* draincurrent is a function of vgs,vbs,and vds; - * have got their linear kernels; now to call - * load functions - */ - - pass.cxx = here->DrC_x2; - pass.cyy = here->DrC_y2; - pass.czz = here->DrC_z2; - pass.cxy = here->DrC_xy; - pass.cyz = here->DrC_yz; - pass.cxz = here->DrC_xz; - pass.cxxx = here->DrC_x3; - pass.cyyy = here->DrC_y3; - pass.czzz = here->DrC_z3; - pass.cxxy = here->DrC_x2y; - pass.cxxz = here->DrC_x2z; - pass.cxyy = here->DrC_xy2; - pass.cyyz = here->DrC_y2z; - pass.cxzz = here->DrC_xz2; - pass.cyzz = here->DrC_yz2; - pass.cxyz = here->DrC_xyz; - pass.r1h1x = r1h1x; - pass.i1h1x = i1h1x; - pass.r1h1y = r1h1y; - pass.i1h1y = i1h1y; - pass.r1h1z = r1h1z; - pass.i1h1z = i1h1z; - pass.r1h2x = r1hm2x; - pass.i1h2x = i1hm2x; - pass.r1h2y = r1hm2y; - pass.i1h2y = i1hm2y; - pass.r1h2z = r1hm2z; - pass.i1h2z = i1hm2z; - pass.r2h11x = r2h11x; - pass.i2h11x = i2h11x; - pass.r2h11y = r2h11y; - pass.i2h11y = i2h11y; - pass.r2h11z = r2h11z; - pass.i2h11z = i2h11z; - pass.h2f1f2x = r2h1m2x; - pass.ih2f1f2x = i2h1m2x; - pass.h2f1f2y = r2h1m2y; - pass.ih2f1f2y = i2h1m2y; - pass.h2f1f2z = r2h1m2z; - pass.ih2f1f2z = i2h1m2z; - temp = DFn2F12(&pass); - itemp = DFi2F12(&pass); - - *(ckt->CKTrhs + here->B1dNodePrime) -= temp; - *(ckt->CKTirhs + here->B1dNodePrime) -= itemp; - - *(ckt->CKTrhs + here->B1sNodePrime) += temp; - *(ckt->CKTirhs + here->B1sNodePrime) += itemp; - - /* draincurrent term loading over */ - - - - /* loading qg term */ - - /* kernels for vgs,vbs and vds already set up */ - - pass.cxx = here->qg_x2; - pass.cyy = here->qg_y2; - pass.czz = here->qg_z2; - pass.cxy = here->qg_xy; - pass.cyz = here->qg_yz; - pass.cxz = here->qg_xz; - pass.cxxx = here->qg_x3; - pass.cyyy = here->qg_y3; - pass.czzz = here->qg_z3; - pass.cxxy = here->qg_x2y; - pass.cxxz = here->qg_x2z; - pass.cxyy = here->qg_xy2; - pass.cyyz = here->qg_y2z; - pass.cxzz = here->qg_xz2; - pass.cyzz = here->qg_yz2; - pass.cxyz = here->qg_xyz; - pass.r1h1x = r1h1x; - pass.i1h1x = i1h1x; - pass.r1h1y = r1h1y; - pass.i1h1y = i1h1y; - pass.r1h1z = r1h1z; - pass.i1h1z = i1h1z; - pass.r1h2x = r1hm2x; - pass.i1h2x = i1hm2x; - pass.r1h2y = r1hm2y; - pass.i1h2y = i1hm2y; - pass.r1h2z = r1hm2z; - pass.i1h2z = i1hm2z; - pass.r2h11x = r2h11x; - pass.i2h11x = i2h11x; - pass.r2h11y = r2h11y; - pass.i2h11y = i2h11y; - pass.r2h11z = r2h11z; - pass.i2h11z = i2h11z; - pass.h2f1f2x = r2h1m2x; - pass.ih2f1f2x = i2h1m2x; - pass.h2f1f2y = r2h1m2y; - pass.ih2f1f2y = i2h1m2y; - pass.h2f1f2z = r2h1m2z; - pass.ih2f1f2z = i2h1m2z; - temp = -ckt->CKTomega * DFi2F12(&pass); - - itemp = ckt->CKTomega * DFn2F12(&pass); - - *(ckt->CKTrhs + here->B1gNode) -= temp; - *(ckt->CKTirhs + here->B1gNode) -= itemp; - - *(ckt->CKTrhs + here->B1sNodePrime) += temp; - *(ckt->CKTirhs + here->B1sNodePrime) += itemp; - - /* qg term over */ - - /* loading qb term */ - - /* kernels for vgs,vbs and vds already set up */ - - pass.cxx = here->qb_x2; - pass.cyy = here->qb_y2; - pass.czz = here->qb_z2; - pass.cxy = here->qb_xy; - pass.cyz = here->qb_yz; - pass.cxz = here->qb_xz; - pass.cxxx = here->qb_x3; - pass.cyyy = here->qb_y3; - pass.czzz = here->qb_z3; - pass.cxxy = here->qb_x2y; - pass.cxxz = here->qb_x2z; - pass.cxyy = here->qb_xy2; - pass.cyyz = here->qb_y2z; - pass.cxzz = here->qb_xz2; - pass.cyzz = here->qb_yz2; - pass.cxyz = here->qb_xyz; - pass.r1h1x = r1h1x; - pass.i1h1x = i1h1x; - pass.r1h1y = r1h1y; - pass.i1h1y = i1h1y; - pass.r1h1z = r1h1z; - pass.i1h1z = i1h1z; - pass.r1h2x = r1hm2x; - pass.i1h2x = i1hm2x; - pass.r1h2y = r1hm2y; - pass.i1h2y = i1hm2y; - pass.r1h2z = r1hm2z; - pass.i1h2z = i1hm2z; - pass.r2h11x = r2h11x; - pass.i2h11x = i2h11x; - pass.r2h11y = r2h11y; - pass.i2h11y = i2h11y; - pass.r2h11z = r2h11z; - pass.i2h11z = i2h11z; - pass.h2f1f2x = r2h1m2x; - pass.ih2f1f2x = i2h1m2x; - pass.h2f1f2y = r2h1m2y; - pass.ih2f1f2y = i2h1m2y; - pass.h2f1f2z = r2h1m2z; - pass.ih2f1f2z = i2h1m2z; - temp = -ckt->CKTomega * DFi2F12(&pass); - - itemp = ckt->CKTomega * DFn2F12(&pass); - - *(ckt->CKTrhs + here->B1bNode) -= temp; - *(ckt->CKTirhs + here->B1bNode) -= itemp; - - *(ckt->CKTrhs + here->B1sNodePrime) += temp; - *(ckt->CKTirhs + here->B1sNodePrime) += itemp; - - /* qb term over */ - - /* loading qd term */ - - /* kernels for vgs,vbs and vds already set up */ - - pass.cxx = here->qd_x2; - pass.cyy = here->qd_y2; - pass.czz = here->qd_z2; - pass.cxy = here->qd_xy; - pass.cyz = here->qd_yz; - pass.cxz = here->qd_xz; - pass.cxxx = here->qd_x3; - pass.cyyy = here->qd_y3; - pass.czzz = here->qd_z3; - pass.cxxy = here->qd_x2y; - pass.cxxz = here->qd_x2z; - pass.cxyy = here->qd_xy2; - pass.cyyz = here->qd_y2z; - pass.cxzz = here->qd_xz2; - pass.cyzz = here->qd_yz2; - pass.cxyz = here->qd_xyz; - pass.r1h1x = r1h1x; - pass.i1h1x = i1h1x; - pass.r1h1y = r1h1y; - pass.i1h1y = i1h1y; - pass.r1h1z = r1h1z; - pass.i1h1z = i1h1z; - pass.r1h2x = r1hm2x; - pass.i1h2x = i1hm2x; - pass.r1h2y = r1hm2y; - pass.i1h2y = i1hm2y; - pass.r1h2z = r1hm2z; - pass.i1h2z = i1hm2z; - pass.r2h11x = r2h11x; - pass.i2h11x = i2h11x; - pass.r2h11y = r2h11y; - pass.i2h11y = i2h11y; - pass.r2h11z = r2h11z; - pass.i2h11z = i2h11z; - pass.h2f1f2x = r2h1m2x; - pass.ih2f1f2x = i2h1m2x; - pass.h2f1f2y = r2h1m2y; - pass.ih2f1f2y = i2h1m2y; - pass.h2f1f2z = r2h1m2z; - pass.ih2f1f2z = i2h1m2z; - temp = -ckt->CKTomega * DFi2F12(&pass); - - itemp = ckt->CKTomega * DFn2F12(&pass); - - *(ckt->CKTrhs + here->B1dNodePrime) -= temp; - *(ckt->CKTirhs + here->B1dNodePrime) -= itemp; - - *(ckt->CKTrhs + here->B1sNodePrime) += temp; - *(ckt->CKTirhs + here->B1sNodePrime) += itemp; - - /* qd term over */ - - /* loading here->B1gbs term */ - - r1h1x = *(job->r1H1ptr + here->B1bNode) - - *(job->r1H1ptr + here->B1sNodePrime); - i1h1x = *(job->i1H1ptr + here->B1bNode) - - *(job->i1H1ptr + here->B1sNodePrime); - - r2h11x = *(job->r2H11ptr + here->B1bNode) - - *(job->r2H11ptr + here->B1sNodePrime); - i2h11x = *(job->i2H11ptr + here->B1bNode) - - *(job->i2H11ptr + here->B1sNodePrime); - - r1hm2x = *(job->r1H2ptr + here->B1bNode) - - *(job->r1H2ptr + here->B1sNodePrime); - i1hm2x = -(*(job->i1H2ptr + here->B1bNode) - - *(job->i1H2ptr + here->B1sNodePrime)); - - r2h1m2x = *(job->r2H1m2ptr + here->B1bNode) - - *(job->r2H1m2ptr + here->B1sNodePrime); - i2h1m2x = *(job->i2H1m2ptr + here->B1bNode) - - *(job->i2H1m2ptr + here->B1sNodePrime); - - /* now r1h1x = vbs */ - - temp = D1n2F12(here->gbs2, - here->gbs3, - r1h1x, - i1h1x, - r1hm2x, - i1hm2x, - r2h11x, - i2h11x, - r2h1m2x, - i2h1m2x); - - itemp = D1i2F12(here->gbs2, - here->gbs3, - r1h1x, - i1h1x, - r1hm2x, - i1hm2x, - r2h11x, - i2h11x, - r2h1m2x, - i2h1m2x); - - - *(ckt->CKTrhs + here->B1bNode) -= temp; - *(ckt->CKTirhs + here->B1bNode) -= itemp; - - *(ckt->CKTrhs + here->B1sNodePrime) += temp; - *(ckt->CKTirhs + here->B1sNodePrime) += itemp; - - /* here->B1gbs term over */ - - /* loading here->B1gbd term */ - - r1h1x = *(job->r1H1ptr + here->B1bNode) - - *(job->r1H1ptr + here->B1dNodePrime); - i1h1x = *(job->i1H1ptr + here->B1bNode) - - *(job->i1H1ptr + here->B1dNodePrime); - - r2h11x = *(job->r2H11ptr + here->B1bNode) - - *(job->r2H11ptr + here->B1dNodePrime); - i2h11x = *(job->i2H11ptr + here->B1bNode) - - *(job->i2H11ptr + here->B1dNodePrime); - - r1hm2x = *(job->r1H2ptr + here->B1bNode) - - *(job->r1H2ptr + here->B1dNodePrime); - i1hm2x = -(*(job->i1H2ptr + here->B1bNode) - - *(job->i1H2ptr + here->B1dNodePrime)); - - r2h1m2x = *(job->r2H1m2ptr + here->B1bNode) - - *(job->r2H1m2ptr + here->B1dNodePrime); - i2h1m2x = *(job->i2H1m2ptr + here->B1bNode) - - *(job->i2H1m2ptr + here->B1dNodePrime); - - /* now r1h1x = vbd */ - - temp = D1n2F12(here->gbd2, - here->gbd3, - r1h1x, - i1h1x, - r1hm2x, - i1hm2x, - r2h11x, - i2h11x, - r2h1m2x, - i2h1m2x); - - itemp = D1i2F12(here->gbd2, - here->gbd3, - r1h1x, - i1h1x, - r1hm2x, - i1hm2x, - r2h11x, - i2h11x, - r2h1m2x, - i2h1m2x); - - - *(ckt->CKTrhs + here->B1bNode) -= temp; - *(ckt->CKTirhs + here->B1bNode) -= itemp; - - *(ckt->CKTrhs + here->B1dNodePrime) += temp; - *(ckt->CKTirhs + here->B1dNodePrime) += itemp; - - /* here->B1gbd term over */ - - /* all done */ - } - - break; - default: -; - ; - } - } -} -return(OK); -} -else - return(E_BADPARM); -} diff --git a/src/spicelib/devices/bsim1/b1dset.c b/src/spicelib/devices/bsim1/b1dset.c deleted file mode 100644 index 3f0f010eb..000000000 --- a/src/spicelib/devices/bsim1/b1dset.c +++ /dev/null @@ -1,1357 +0,0 @@ -/********** -Copyright 1990 Regents of the University of California. All rights reserved. -Author: 1985 Hong J. Park, Thomas L. Quarles -**********/ - -#include "ngspice/ngspice.h" -#include "ngspice/cktdefs.h" -#include "bsim1def.h" -#include "ngspice/trandefs.h" -#include "ngspice/distodef.h" -#include "ngspice/const.h" -#include "ngspice/sperror.h" -#include "ngspice/suffix.h" -#include "ngspice/devdefs.h" - -int -B1dSetup(GENmodel *inModel, CKTcircuit *ckt) -{ - B1model* model = (B1model*)inModel; - B1instance *here; - double DrainSatCurrent; - double EffectiveLength; - double GateBulkOverlapCap; - double GateDrainOverlapCap; - double GateSourceOverlapCap; - double SourceSatCurrent; - double DrainArea; - double SourceArea; - double DrainPerimeter; - double SourcePerimeter; - double vt0; - double evbs; - double lgbs1, lgbs2, lgbs3; - double czbd, czbs, czbdsw, czbssw; - double PhiB, MJ, MJSW, PhiBSW; - double arg, argsw, sarg, sargsw; - double capbs1, capbs2, capbs3; - double capbd1, capbd2, capbd3; - double qg; - double qb; - double qd; - double Vfb; - double Phi; - double K1; - double K2; - double Vdd; - double Ugs; - double Uds; - double Leff; - double Eta; - double Vpb; - double SqrtVpb; - double Von; - double Vth; - double DrCur; - double G; - double A; - double Arg; - double Beta; - double Beta_Vds_0; - double BVdd; - double Beta0; - double VddSquare; - double C1; - double C2; - double VdsSat; - double Argl1; - double Argl2; - double Vc; - double Term1; - double K; - double Args1; - double Args2; - double Args3; - double Warg1; - double Vcut; - double N; - double N0; - double NB; - double ND; - double Warg2; - double Wds; - double Wgs; - double Ilimit; - double Iexp; - double Vth0; - double Arg1; - double Arg2; - double Arg3; - double Arg5; - double Ent; - double Vcom; - double Vgb; - double Vgb_Vfb; - double VdsPinchoff; - double EntSquare; - double Argl5; - double Argl6; - double Argl7; - double WLCox; - double Vtsquare; - int ChargeComputationNeeded; - double co4v15; - double VgsVth = 0.0; - double lgbd1, lgbd2, lgbd3, evbd; - double vbd = 0.0; - double vgd = 0.0; - double vgb = 0.0; - double vds = 0.0; - double vgs = 0.0; - double vbs = 0.0; - double dBVdddVds; - Dderivs d_Argl6; - Dderivs d_Vgb, d_Vgb_Vfb, d_EntSquare, d_Argl5, d_Argl7; - Dderivs d_Arg5, d_Ent, d_Vcom, d_VdsPinchoff; - Dderivs d_qb, d_qd, d_Vth0, d_Arg1, d_Arg2, d_Arg3; - Dderivs d_dummy, d_Vth, d_BVdd, d_Warg1, d_qg; - Dderivs d_N, d_Wds, d_Wgs, d_Iexp; - Dderivs d_Argl1, d_Argl2, d_Args1, d_Args2, d_Args3; - Dderivs d_Beta, d_Vc, d_Term1, d_K, d_VdsSat; - Dderivs d_Beta_Vds_0, d_C1, d_C2, d_Beta0; - Dderivs d_VgsVth, d_G, d_A, d_Arg, d_DrCur; - Dderivs d_Ugs, d_Uds, d_Eta, d_Vpb, d_SqrtVpb, d_Von; - Dderivs d_p, d_q, d_r, d_zero; - /* remove compiler warnings */ - d_qg.value = 0.0; - d_qg.d1_p = 0.0; - d_qg.d1_q = 0.0; - d_qg.d1_r = 0.0; - d_qg.d2_p2 = 0.0; - d_qg.d2_q2 = 0.0; - d_qg.d2_r2 = 0.0; - d_qg.d2_pq = 0.0; - d_qg.d2_qr = 0.0; - d_qg.d2_pr = 0.0; - d_qg.d3_p3 = 0.0; - d_qg.d3_q3 = 0.0; - d_qg.d3_r3 = 0.0; - d_qg.d3_p2q = 0.0; - d_qg.d3_p2r = 0.0; - d_qg.d3_pq2 = 0.0; - d_qg.d3_q2r = 0.0; - d_qg.d3_pr2 = 0.0; - d_qg.d3_qr2 = 0.0; - d_qg.d3_pqr = 0.0; - - d_qb.value = 0.0; - d_qb.d1_p = 0.0; - d_qb.d1_q = 0.0; - d_qb.d1_r = 0.0; - d_qb.d2_p2 = 0.0; - d_qb.d2_q2 = 0.0; - d_qb.d2_r2 = 0.0; - d_qb.d2_pq = 0.0; - d_qb.d2_qr = 0.0; - d_qb.d2_pr = 0.0; - d_qb.d3_p3 = 0.0; - d_qb.d3_q3 = 0.0; - d_qb.d3_r3 = 0.0; - d_qb.d3_p2q = 0.0; - d_qb.d3_p2r = 0.0; - d_qb.d3_pq2 = 0.0; - d_qb.d3_q2r = 0.0; - d_qb.d3_pr2 = 0.0; - d_qb.d3_qr2 = 0.0; - d_qb.d3_pqr = 0.0; - - d_qd.value = 0.0; - d_qd.d1_p = 0.0; - d_qd.d1_q = 0.0; - d_qd.d1_r = 0.0; - d_qd.d2_p2 = 0.0; - d_qd.d2_q2 = 0.0; - d_qd.d2_r2 = 0.0; - d_qd.d2_pq = 0.0; - d_qd.d2_qr = 0.0; - d_qd.d2_pr = 0.0; - d_qd.d3_p3 = 0.0; - d_qd.d3_q3 = 0.0; - d_qd.d3_r3 = 0.0; - d_qd.d3_p2q = 0.0; - d_qd.d3_p2r = 0.0; - d_qd.d3_pq2 = 0.0; - d_qd.d3_q2r = 0.0; - d_qd.d3_pr2 = 0.0; - d_qd.d3_qr2 = 0.0; - d_qd.d3_pqr = 0.0; - - /* loop through all the B1 device models */ - for( ; model != NULL; model = B1nextModel(model)) { - - /* loop through all the instances of the model */ - for (here = B1instances(model); here != NULL ; - here=B1nextInstance(here)) { - - EffectiveLength=here->B1l - model->B1deltaL * 1.e-6;/* m */ - DrainArea = here->B1m * here->B1drainArea; - SourceArea = here->B1m * here->B1sourceArea; - DrainPerimeter = here->B1m * here->B1drainPerimeter; - SourcePerimeter = here->B1m * here->B1sourcePerimeter; - if( (DrainSatCurrent=DrainArea*model->B1jctSatCurDensity) - < 1e-15){ - DrainSatCurrent = 1.0e-15; - } - if( (SourceSatCurrent=SourceArea*model->B1jctSatCurDensity) - <1.0e-15){ - SourceSatCurrent = 1.0e-15; - } - GateSourceOverlapCap = model->B1gateSourceOverlapCap * here->B1w * here->B1m; - GateDrainOverlapCap = model->B1gateDrainOverlapCap * here->B1w * here-> B1m; - GateBulkOverlapCap = model->B1gateBulkOverlapCap *EffectiveLength; - vt0 = model->B1type * here->B1vt0; - - vbs = model->B1type * ( - *(ckt->CKTrhsOld+here->B1bNode) - - *(ckt->CKTrhsOld+here->B1sNodePrime)); - vgs = model->B1type * ( - *(ckt->CKTrhsOld+here->B1gNode) - - *(ckt->CKTrhsOld+here->B1sNodePrime)); - vds = model->B1type * ( - *(ckt->CKTrhsOld+here->B1dNodePrime) - - *(ckt->CKTrhsOld+here->B1sNodePrime)); - - if(vds >= 0) { - /* normal mode */ - here->B1mode = 1; - } else { - /* inverse mode */ - here->B1mode = -1; - vds = -vds; - vgs = vgs + vds; /* these are the local(fake) values now */ - vbs = vbs + vds; - } - - vgb = vgs - vbs; - vgd = vgs - vds; - vbd = vbs - vds; - - if(vbs <= 0.0 ) { - lgbs1 = SourceSatCurrent / CONSTvt0 + ckt->CKTgmin; - lgbs2 = lgbs3 = 0.0; - } else { - evbs = exp(vbs/CONSTvt0); - lgbs1 = SourceSatCurrent*evbs/CONSTvt0 + ckt->CKTgmin; - lgbs2 = (lgbs1 - ckt->CKTgmin)/(CONSTvt0*2); - lgbs3 = lgbs2/(CONSTvt0*3); - } - if(vbd <= 0.0) { - lgbd1 = DrainSatCurrent / CONSTvt0 + ckt->CKTgmin; - lgbd2 = lgbd3 = 0.0; - } else { - evbd = exp(vbd/CONSTvt0); - lgbd1 = DrainSatCurrent*evbd/CONSTvt0 + ckt->CKTgmin; - lgbd2 = (lgbd1 - ckt->CKTgmin)/(CONSTvt0*2); - lgbd3 = lgbd2/(CONSTvt0*3); - } - /* line 400 */ - /* call B1evaluate to calculate drain current and its - * derivatives and charge and capacitances related to gate - * drain, and bulk - */ - - /* check quadratic interpolation for beta0 ; line 360 */ - /* - * Copyright (c) 1985 Hong J. Park, Thomas L. Quarles - * modified 1988 Jaijeet Roychowdhury - */ - - /* This routine evaluates the drain current, its derivatives and the - * charges associated with the gate,bulk and drain terminal - * using the B1 (Berkeley Short-Channel IGFET Model) Equations. - */ - /* as usual p=vgs, q=vbs, r=vds */ - { - - ChargeComputationNeeded = 1; - - Vfb = here->B1vfb; - Phi = here->B1phi; - K1 = here->B1K1; - K2 = here->B1K2; - Vdd = model->B1vdd; - d_p.value = 0.0; - d_p.d1_p = 1.0; - d_p.d1_q = 0.0; - d_p.d1_r = 0.0; - d_p.d2_p2 = 0.0; - d_p.d2_q2 = 0.0; - d_p.d2_r2 = 0.0; - d_p.d2_pq = 0.0; - d_p.d2_qr = 0.0; - d_p.d2_pr = 0.0; - d_p.d3_p3 = 0.0; - d_p.d3_q3 = 0.0; - d_p.d3_r3 = 0.0; - d_p.d3_p2r = 0.0; - d_p.d3_p2q = 0.0; - d_p.d3_q2r = 0.0; - d_p.d3_pq2 = 0.0; - d_p.d3_pr2 = 0.0; - d_p.d3_qr2 = 0.0; - d_p.d3_pqr = 0.0; - EqualDeriv(&d_q,&d_p); - EqualDeriv(&d_r,&d_p); - EqualDeriv(&d_zero,&d_p); - d_q.d1_p = d_r.d1_p = d_zero.d1_p = 0.0; - d_q.d1_q = d_r.d1_r = 1.0; - d_p.value = vgs; d_q.value = vbs; d_r.value = vds; - - if((Ugs = here->B1ugs + here->B1ugsB * vbs) <= 0 ) { - Ugs = 0; - EqualDeriv(&d_Ugs,&d_zero); - } else { - EqualDeriv(&d_Ugs,&d_q); - d_Ugs.value = Ugs; - d_Ugs.d1_q = here->B1ugsB; - } - if((Uds = here->B1uds + here->B1udsB * vbs + - here->B1udsD*(vds-Vdd)) <= 0 ) { - Uds = 0.0; - EqualDeriv(&d_Uds,&d_zero); - } else { - Leff = here->B1l * 1.e6 - model->B1deltaL; /* Leff in um */ - /*const*/ - Uds = Uds / Leff; - /* Uds = (here->B1uds + here->B1udsB * vbs here->B1udsD* - (vds-Vdd))/Leff */ - EqualDeriv(&d_Uds,&d_r); - d_Uds.value = Uds; - d_Uds.d1_r = here->B1udsD/Leff; - d_Uds.d1_q = here->B1udsB/Leff; - } - Eta = here->B1eta + here->B1etaB * vbs + here->B1etaD * - (vds - Vdd); - EqualDeriv(&d_Eta,&d_r); - d_Eta.value = Eta; - d_Eta.d1_r = here->B1etaD; - d_Eta.d1_q = here->B1etaB; - - if( Eta <= 0 ) { - Eta = 0; - EqualDeriv(&d_Eta,&d_zero); - } else if ( Eta > 1 ) { - Eta = 1; - EqualDeriv(&d_Eta,&d_zero); - d_Eta.value = 1.0; - } - if( vbs < 0 ) { - Vpb = Phi - vbs; - EqualDeriv(&d_Vpb,&d_q); - d_Vpb.value = Vpb; - d_Vpb.d1_q = -1; - } else { - Vpb = Phi; - EqualDeriv(&d_Vpb,&d_zero); - d_Vpb.value = Phi; - } - SqrtVpb = sqrt( Vpb ); - SqrtDeriv(&d_SqrtVpb,&d_Vpb); - Von = Vfb + Phi + K1 * SqrtVpb - K2 * Vpb - Eta * vds; - EqualDeriv(&d_dummy,&d_r); - d_dummy.value = -Eta*vds; - d_dummy.d1_r = -Eta; - TimesDeriv(&d_Von,&d_Vpb,-K2); - PlusDeriv(&d_Von,&d_Von,&d_dummy); - TimesDeriv(&d_dummy,&d_SqrtVpb,K1); - PlusDeriv(&d_Von,&d_dummy,&d_Von); - d_Von.value = Von; - Vth = Von; - EqualDeriv(&d_Vth,&d_Von); - VgsVth = vgs - Vth; - TimesDeriv(&d_VgsVth,&d_Vth,-1.0); - d_VgsVth.value = VgsVth; - d_VgsVth.d1_p += 1.0; - - G = 1./(1.744+0.8364 * Vpb); - TimesDeriv(&d_G,&d_Vpb,0.8364); - d_G.value += 1.744; - InvDeriv(&d_G,&d_G); - G = 1 - G; - TimesDeriv(&d_G,&d_G,-1.0); - d_G.value += 1.0; - A = G/SqrtVpb; - DivDeriv(&d_A,&d_G,&d_SqrtVpb); - A = 1.0 + 0.5*K1*A; - TimesDeriv(&d_A,&d_A,0.5*K1); - d_A.value += 1.0; - A = MAX( A, 1.0); /* Modified */ - if (A <= 1.0) { - EqualDeriv(&d_A,&d_zero); - d_A.value = 1.0; - } - Arg = MAX(( 1 + Ugs * VgsVth), 1.0); - MultDeriv(&d_dummy,&d_Ugs,&d_VgsVth); - d_dummy.value += 1.0; - if (d_dummy.value <= 1.0) { - EqualDeriv(&d_Arg,&d_zero); - d_Arg.value = 1.0; - } - else - EqualDeriv(&d_Arg,&d_dummy); - - if( VgsVth < 0 ) { - /* cutoff */ - DrCur = 0; - EqualDeriv(&d_DrCur,&d_zero); - goto SubthresholdComputation; - } - - /* Quadratic Interpolation for Beta0 (Beta at vgs = 0, vds=Vds) */ - - Beta_Vds_0 = (here->B1betaZero + here->B1betaZeroB * vbs); - EqualDeriv(&d_Beta_Vds_0,&d_q); - d_Beta_Vds_0.value = Beta_Vds_0; - d_Beta_Vds_0.d1_q = here->B1betaZeroB; - BVdd = (here->B1betaVdd + here->B1betaVddB * vbs); - EqualDeriv(&d_BVdd,&d_q); - d_BVdd.value = BVdd; - d_BVdd.d1_q = here->B1betaVddB; - dBVdddVds = MAX( here->B1betaVddD, 0.0); - - - /* is the above wrong ?!? */ - - - - if( vds > Vdd ) { - Beta0 = BVdd + dBVdddVds * (vds - Vdd); - EqualDeriv(&d_Beta0,&d_r); d_Beta0.value = vds - Vdd; - TimesDeriv(&d_Beta0,&d_Beta0,dBVdddVds); - PlusDeriv(&d_Beta0,&d_Beta0,&d_BVdd); - /* dBVdddVds = const */ - - - /* and this stuff here? */ - - } else { - VddSquare = Vdd * Vdd; /* const */ - C1 = ( -BVdd + Beta_Vds_0 + dBVdddVds * Vdd) / VddSquare; - TimesDeriv(&d_C1,&d_BVdd,-1.0); - PlusDeriv(&d_C1,&d_C1,&d_Beta_Vds_0); - d_C1.value += dBVdddVds * Vdd; - TimesDeriv(&d_C1,&d_C1,1/VddSquare); - - C2 = 2 * (BVdd - Beta_Vds_0) / Vdd - dBVdddVds; - TimesDeriv(&d_C2,&d_Beta_Vds_0,-1.0); - PlusDeriv(&d_C2,&d_C2,&d_BVdd); - TimesDeriv(&d_C2,&d_C2,2/Vdd); - d_C2.value -= dBVdddVds; - Beta0 = (C1 * vds + C2) * vds + Beta_Vds_0; - MultDeriv(&d_Beta0,&d_r,&d_C1); - PlusDeriv(&d_Beta0,&d_Beta0,&d_C2); - MultDeriv(&d_Beta0,&d_Beta0,&d_dummy); - PlusDeriv(&d_Beta0,&d_Beta0,&d_Beta_Vds_0); - - /* - dBeta0dVds = 2*C1*vds + C2; - dBeta0dVbs = dC1dVbs * vds * vds + dC2dVbs * vds + dBeta_Vds_0_dVbs; - maybe we'll need these later */ - } - - /*Beta = Beta0 / ( 1 + Ugs * VgsVth );*/ - - Beta = Beta0 / Arg ; - DivDeriv(&d_Beta,&d_Beta0,&d_Arg); - - /*VdsSat = MAX( VgsVth / ( A + Uds * VgsVth ), 0.0);*/ - - Vc = Uds * VgsVth / A; - DivDeriv(&d_Vc,&d_VgsVth,&d_A); - MultDeriv(&d_Vc,&d_Vc,&d_Uds); - - if(Vc < 0.0 ) { - EqualDeriv(&d_Vc,&d_zero); - Vc=0.0; - } - Term1 = sqrt( 1 + 2 * Vc ); - TimesDeriv(&d_Term1,&d_Vc,2.0); - d_Term1.value += 1.0; - SqrtDeriv(&d_Term1,&d_Term1); - K = 0.5 * ( 1 + Vc + Term1 ); - PlusDeriv(&d_K,&d_Vc,&d_Term1); - d_K.value += 1.0; - TimesDeriv(&d_K,&d_K,0.5); - VdsSat = VgsVth / ( A * sqrt(K)); - if (VdsSat < 0.0) { - EqualDeriv(&d_VdsSat,&d_zero); - VdsSat = 0.0; - } - else - { - SqrtDeriv(&d_VdsSat,&d_K); - MultDeriv(&d_VdsSat,&d_VdsSat,&d_A); - DivDeriv(&d_VdsSat,&d_VgsVth,&d_VdsSat); - } - - if( vds < VdsSat ) { - /* Triode Region */ - /*Argl1 = 1 + Uds * vds;*/ - Argl1 = 1 + Uds * vds; - if (Argl1 < 1.0) { - Argl1 = 1.0; - EqualDeriv(&d_Argl1,&d_zero); - d_Argl1.value = 1.0; - } - else - { - MultDeriv(&d_Argl1,&d_r,&d_Uds); - d_Argl1.value += 1.0; - } - - - Argl2 = VgsVth - 0.5 * A * vds; - MultDeriv(&d_Argl2,&d_r,&d_A); - TimesDeriv(&d_Argl2,&d_Argl2,-0.5); - PlusDeriv(&d_Argl2,&d_Argl2,&d_VgsVth); - DrCur = Beta * Argl2 * vds / Argl1; - DivDeriv(&d_DrCur,&d_r,&d_Argl1); - MultDeriv(&d_DrCur,&d_DrCur,&d_Argl2); - MultDeriv(&d_DrCur,&d_DrCur,&d_Beta); - } else { - /* Pinchoff (Saturation) Region */ - /* history - Args1 = 1.0 + 1. / Term1; - InvDeriv(&d_Args1,&d_Term1); - d_Args1.value += 1.0; - */ - /* dVcdVgs = Uds / A; - dVcdVds = VgsVth * dUdsdVds / A - dVcdVgs * dVthdVds; - dVcdVbs = ( VgsVth * dUdsdVbs - Uds * - (dVthdVbs + VgsVth * dAdVbs / A ))/ A; - dKdVc = 0.5* Args1; - dKdVgs = dKdVc * dVcdVgs; - dKdVds = dKdVc * dVcdVds; - dKdVbs = dKdVc * dVcdVbs; */ - Args2 = VgsVth / A / K; - MultDeriv(&d_Args2,&d_A,&d_K); - DivDeriv(&d_Args2,&d_VgsVth,&d_Args2); - Args3 = Args2 * VgsVth; - MultDeriv(&d_Args3,&d_Args2,&d_VgsVth); - DrCur = 0.5 * Beta * Args3; - MultDeriv(&d_DrCur,&d_Beta,&d_Args3); - TimesDeriv(&d_DrCur,&d_DrCur,0.5); - } - - SubthresholdComputation: - - N0 = here->B1subthSlope;/*const*/ - Vcut = - 40. * N0 * CONSTvt0 ;/*const*/ - if( (N0 >= 200) || (VgsVth < Vcut ) || (VgsVth > (-0.5*Vcut))) { - goto ChargeComputation; - } - - NB = here->B1subthSlopeB;/*const*/ - ND = here->B1subthSlopeD;/*const*/ - N = N0 + NB * vbs + ND * vds; /* subthreshold slope */ - EqualDeriv(&d_N,&d_r); - d_N.value = N; - d_N.d1_q = NB; - d_N.d1_r = ND; - if( N < 0.5 ){ N = 0.5; - d_N.value = 0.5; - d_N.d1_q = d_N.d1_r = 0.0; - } - Warg1 = exp( - vds / CONSTvt0 ); - TimesDeriv(&d_Warg1,&d_r,-1/CONSTvt0); - ExpDeriv(&d_Warg1,&d_Warg1); - Wds = 1 - Warg1; - TimesDeriv(&d_Wds,&d_Warg1,-1.0); - d_Wds.value += 1.0; - Wgs = exp( VgsVth / ( N * CONSTvt0 )); - DivDeriv(&d_Wgs,&d_VgsVth,&d_N); - TimesDeriv(&d_Wgs,&d_Wgs,1/CONSTvt0); - ExpDeriv(&d_Wgs,&d_Wgs); - Vtsquare = CONSTvt0 * CONSTvt0 ;/*const*/ - Warg2 = 6.04965 * Vtsquare * here->B1betaZero;/*const*/ - Ilimit = 4.5 * Vtsquare * here->B1betaZero;/*const*/ - Iexp = Warg2 * Wgs * Wds; - MultDeriv(&d_Iexp,&d_Wgs,&d_Wds); - TimesDeriv(&d_Iexp,&d_Iexp,Warg2); - DrCur = DrCur + Ilimit * Iexp / ( Ilimit + Iexp ); - EqualDeriv(&d_dummy,&d_Iexp); - d_dummy.value += Ilimit; - InvDeriv(&d_dummy,&d_dummy); - MultDeriv(&d_dummy,&d_dummy,&d_Iexp); - TimesDeriv(&d_dummy,&d_dummy,Ilimit); - PlusDeriv(&d_DrCur,&d_DrCur,&d_dummy); - - /* gds term has been modified to prevent blow up at Vds=0 */ - /* gds = gds + Temp3 * ( -Wds / N / CONSTvt0 * (dVthdVds + - VgsVth * ND / N ) + Warg1 / CONSTvt0 ); */ - - ChargeComputation: - - /* Some Limiting of DC Parameters */ - /* if(DrCur < 0.0) DrCur = 0.0; - if(gm < 0.0) gm = 0.0; - if(gds < 0.0) gds = 0.0; - if(gmbs < 0.0) gmbs = 0.0; - */ - - WLCox = model->B1Cox * - (here->B1l - model->B1deltaL * 1.e-6) * - ((here->B1w - model->B1deltaW * 1.e-6) * here->B1m) * 1.e4; /* F */ - - if( ! ChargeComputationNeeded ) { - qg = 0; - qd = 0; - qb = 0; - EqualDeriv(&d_qg,&d_zero); - EqualDeriv(&d_qb,&d_zero); - EqualDeriv(&d_qd,&d_zero); - goto finished; - } - G = 1.0 - 1./(1.744+0.8364 * Vpb); - TimesDeriv(&d_G,&d_Vpb,-0.8364); - d_G.value -= 1.744; - InvDeriv(&d_G,&d_G); - d_G.value += 1.0; - - A = 1.0 + 0.5*K1*G/SqrtVpb; - if (A < 1.0) { - A = 1.0; - EqualDeriv(&d_A,&d_zero); - d_A.value = 1.0; - } - else - { - DivDeriv(&d_A,&d_G,&d_SqrtVpb); - TimesDeriv(&d_A,&d_A,0.5*K1); - d_A.value += 1.0; - } - - /*Arg = 1 + Ugs * VgsVth;*/ - Phi = MAX( 0.1, Phi);/*const*/ - - if( model->B1channelChargePartitionFlag ) { - - /*0/100 partitioning for drain/source chArges at the saturation region*/ - Vth0 = Vfb + Phi + K1 * SqrtVpb; - TimesDeriv(&d_Vth0,&d_SqrtVpb,K1); - d_Vth0.value += Vfb + Phi; - VgsVth = vgs - Vth0; - TimesDeriv(&d_VgsVth,&d_Vth0,-1.0); - PlusDeriv(&d_VgsVth,&d_VgsVth,&d_p); - Arg1 = A * vds; - MultDeriv(&d_Arg1,&d_A,&d_r); - Arg2 = VgsVth - 0.5 * Arg1; - TimesDeriv(&d_Arg2,&d_Arg1,-0.5); - PlusDeriv(&d_Arg2,&d_Arg2,&d_VgsVth); - Arg3 = vds - Arg1; - TimesDeriv(&d_Arg3,&d_Arg1,-1.0); - PlusDeriv(&d_Arg3,&d_Arg3,&d_r); - Arg5 = Arg1 * Arg1; - MultDeriv(&d_Arg5,&d_Arg1,&d_Arg1); - - Ent = MAX(Arg2,1.0e-8); - if (Arg2 < 1.0e-8) { - EqualDeriv(&d_Ent,&d_zero); - d_Ent.value = 1.0e-8; - } - else - { - EqualDeriv(&d_Ent,&d_Arg2); - } - - Vcom = VgsVth * VgsVth / 6.0 - 1.25e-1 * Arg1 * - VgsVth + 2.5e-2 * Arg5; - TimesDeriv(&d_dummy,&d_Arg1,-0.125); - TimesDeriv(&d_Vcom,&d_VgsVth,1/6.0); - PlusDeriv(&d_Vcom,&d_Vcom,&d_dummy); - MultDeriv(&d_Vcom,&d_Vcom,&d_VgsVth); - TimesDeriv(&d_dummy,&d_Arg5,2.5e-2); - PlusDeriv(&d_Vcom,&d_Vcom,&d_dummy); - VdsPinchoff = VgsVth / A; - if (VdsPinchoff < 0.0) { - VdsPinchoff = 0.0; - EqualDeriv(&d_VdsPinchoff,&d_zero); - } - else - { - DivDeriv(&d_VdsPinchoff,&d_VgsVth,&d_A); - } - Vgb = vgs - vbs ; - EqualDeriv(&d_Vgb,&d_p); - d_Vgb.value = Vgb; - d_Vgb.d1_q = -1.0; - Vgb_Vfb = Vgb - Vfb; - EqualDeriv(&d_Vgb_Vfb,&d_Vgb); - d_Vgb_Vfb.value -= Vfb; - - if( Vgb_Vfb < 0){ - /* Accumulation Region */ - qg = WLCox * Vgb_Vfb; - TimesDeriv(&d_qg,&d_Vgb_Vfb,WLCox); - qb = - qg; - TimesDeriv(&d_qb,&d_qg,-1.0); - qd = 0. ; - EqualDeriv(&d_qd,&d_zero); - goto finished; - } else if ( vgs < Vth0 ){ - /* Subthreshold Region */ - qg = 0.5 * WLCox * K1 * K1 * (-1 + - sqrt(1 + 4 * Vgb_Vfb / (K1 * K1))); - TimesDeriv(&d_qg,&d_Vgb_Vfb,4/(K1*K1)); - d_qg.value += 1.0; - SqrtDeriv(&d_qg,&d_qg); - d_qg.value -= 1.0; - TimesDeriv(&d_qg,&d_qg,0.5 * WLCox * K1 * K1); - qb = -qg; - TimesDeriv(&d_qb,&d_qg,-1.0); - qd = 0.; - EqualDeriv(&d_qd,&d_zero); - goto finished; - } else if( vds < VdsPinchoff ){ /* triode region */ - /*VgsVth2 = VgsVth*VgsVth;*/ - EntSquare = Ent * Ent; - MultDeriv(&d_EntSquare,&d_Ent,&d_Ent); - Argl1 = 1.2e1 * EntSquare; - TimesDeriv(&d_Argl1,&d_EntSquare,12.0); - Argl2 = 1.0 - A; - TimesDeriv(&d_Argl2,&d_A,-1.0); - d_Argl2.value += 1.0; - /* - Argl3 = Arg1 * vds; - MultDeriv(&d_Argl3,&d_Arg1,&d_r); - */ - /*Argl4 = Vcom/Ent/EntSquare;*/ - if (Ent > 1.0e-8) { - Argl5 = Arg1 / Ent; - DivDeriv(&d_Argl5,&d_Arg1,&d_Ent); - /*Argl6 = Vcom/EntSquare;*/ - } else { - Argl5 = 2.0; - EqualDeriv(&d_Argl5,&d_zero); - d_Argl5.value = 2.0; - Argl6 = 4.0 / 1.5e1;/*const*/ - } - Argl7 = Argl5 / 1.2e1; - TimesDeriv(&d_Argl7,&d_Argl5,1.0/12.0); - /* - Argl8 = 6.0 * Ent; - TimesDeriv(&d_Argl8,&d_Ent,6.0); - Argl9 = 0.125 * Argl5 * Argl5; - MultDeriv(&d_Argl9,&d_Argl5,&d_Argl5); - TimesDeriv(&d_Argl9,&d_Argl9,0.125); - */ - qg = WLCox * (vgs - Vfb - Phi - 0.5 * vds + vds * Argl7); - EqualDeriv(&d_qg,&d_Argl7); - d_qg.value -= 0.5; - MultDeriv(&d_qg,&d_qg,&d_r); - d_qg.value += vgs - Vfb - Phi; - d_qg.d1_p += 1.0; - TimesDeriv(&d_qg,&d_qg,WLCox); - qb = WLCox * ( - Vth0 + Vfb + Phi + 0.5 * Arg3 - Arg3 * Argl7); - TimesDeriv(&d_qb,&d_Argl7,-1.0); - d_qb.value += 0.5; - MultDeriv(&d_qb,&d_qb,&d_Arg3); - d_qb.value += Vfb + Phi; - TimesDeriv(&d_dummy,&d_Vth0,-1.0); - PlusDeriv(&d_qb,&d_qb,&d_dummy); - TimesDeriv(&d_qb,&d_qb,WLCox); - qd = - WLCox * (0.5 * VgsVth - 0.75 * Arg1 + - 0.125 * Arg1 * Argl5); - TimesDeriv(&d_qd,&d_Argl5,0.125); - d_qd.value -= 0.75; - MultDeriv(&d_qd,&d_qd,&d_Arg1); - TimesDeriv(&d_dummy,&d_VgsVth,0.5); - PlusDeriv(&d_qd,&d_qd,&d_dummy); - TimesDeriv(&d_qd,&d_qd, -WLCox); - goto finished; - } else if( vds >= VdsPinchoff ) { /* saturation region */ - Args1 = 1.0 / (3*A); - TimesDeriv(&d_Args1,&d_A,3.0); - InvDeriv(&d_Args1,&d_Args1); - qg = WLCox * (vgs - Vfb - Phi - VgsVth * Args1); - MultDeriv(&d_qg,&d_VgsVth,&d_Args1); - d_qg.value += Vfb + Phi - vgs; - d_qg.d1_p -= 1.0; - TimesDeriv(&d_qg,&d_qg,-WLCox); - qb = WLCox * (Vfb + Phi - Vth0 + (1.0 - A) * VgsVth * Args1); - TimesDeriv(&d_dummy,&d_A,-1.0); - d_dummy.value += 1.0; - MultDeriv(&d_qb,&d_VgsVth, &d_dummy); - MultDeriv(&d_qb,&d_qb,&d_Args1); - d_qb.value += Vfb + Phi; - TimesDeriv(&d_dummy,&d_Vth0,-1.0); - PlusDeriv(&d_qb,&d_qb,&d_dummy); - TimesDeriv(&d_qb,&d_qb,WLCox); - qd = 0.0; - EqualDeriv(&d_qd,&d_zero); - goto finished; - } - - goto finished; - - } else { - - /*0/100 partitioning for drain/source chArges at the saturation region*/ - co4v15 = 1./15.; - Vth0 = Vfb + Phi + K1 * SqrtVpb; - TimesDeriv(&d_Vth0,&d_SqrtVpb,K1); - d_Vth0.value += Vfb + Phi; - VgsVth = vgs - Vth0; - TimesDeriv(&d_VgsVth,&d_Vth0,-1.0); - d_VgsVth.value += vgs; - d_VgsVth.d1_p += 1.0; - Arg1 = A * vds; - MultDeriv(&d_Arg1,&d_A,&d_r); - Arg2 = VgsVth - 0.5 * Arg1; - TimesDeriv(&d_Arg2,&d_Arg1,-0.5); - PlusDeriv(&d_Arg2,&d_Arg2,&d_VgsVth); - Arg3 = vds - Arg1; - TimesDeriv(&d_Arg3,&d_Arg1,-1.0); - d_Arg3.value = Arg3; - d_Arg3.d1_r += 1.0; - Arg5 = Arg1 * Arg1; - MultDeriv(&d_Arg5,&d_Arg1,&d_Arg1); - Ent = MAX(Arg2,1.0e-8); - if (Arg2 < 1.0e-8) { - EqualDeriv(&d_Ent,&d_zero); - d_Ent.value = Ent; - } - else - { - EqualDeriv(&d_Ent,&d_Arg2); - } - - Vcom = VgsVth * VgsVth / 6.0 - 1.25e-1 * Arg1 * - VgsVth + 2.5e-2 * Arg5; - TimesDeriv(&d_dummy,&d_VgsVth,1/6.0); - TimesDeriv(&d_Vcom,&d_Arg1,-0.125); - PlusDeriv(&d_Vcom,&d_Vcom,&d_dummy); - MultDeriv(&d_Vcom,&d_Vcom,&d_VgsVth); - TimesDeriv(&d_dummy,&d_Arg5,2.5e-2); - PlusDeriv(&d_Vcom,&d_Vcom,&d_dummy); - VdsPinchoff = VgsVth / A; - if (VdsPinchoff < 0.0) { - VdsPinchoff = 0.0; - EqualDeriv(&d_VdsPinchoff,&d_zero); - } - else - { - DivDeriv(&d_VdsPinchoff,&d_VgsVth,&d_A); - } - - Vgb = vgs - vbs ; - EqualDeriv(&d_Vgb,&d_p); - d_Vgb.value = Vgb; - d_Vgb.d1_q = -1.0; - Vgb_Vfb = Vgb - Vfb; - EqualDeriv(&d_Vgb_Vfb,&d_Vgb); - d_Vgb_Vfb.value = Vgb_Vfb; - - if( Vgb_Vfb < 0){ - /* Accumulation Region */ - qg = WLCox * Vgb_Vfb; - TimesDeriv(&d_qg,&d_Vgb_Vfb,WLCox); - qb = - qg; - TimesDeriv(&d_qb,&d_qg,-1.0); - qd = 0. ; - EqualDeriv(&d_qd,&d_zero); - goto finished; - } else if ( vgs < Vth0 ){ - /* Subthreshold Region */ - qg = 0.5 * WLCox * K1 * K1 * (-1 + - sqrt(1 + 4 * Vgb_Vfb / (K1 * K1))); - TimesDeriv(&d_qg,&d_Vgb_Vfb,4/(K1*K1)); - d_qg.value += 1.0; - SqrtDeriv(&d_qg,&d_qg); - d_qg.value -= 1.0; - TimesDeriv(&d_qg,&d_qg,0.5 * WLCox * K1 * K1); - qb = -qg; - TimesDeriv(&d_qb,&d_qg,-1.0); - qd = 0.; - EqualDeriv(&d_qd,&d_zero); - goto finished; - } else if( vds < VdsPinchoff ){ /* triode region */ - /* - VgsVthSquare = VgsVth*VgsVth; - MultDeriv(&d_VgsVthSquare,&d_VgsVth,&d_VgsVth); - */ - EntSquare = Ent * Ent; - MultDeriv(&d_EntSquare,&d_Ent,&d_Ent); - Argl1 = 1.2e1 * EntSquare; - TimesDeriv(&d_Argl1,&d_EntSquare,12.0); - Argl2 = 1.0 - A; - TimesDeriv(&d_Argl2,&d_A,-1.0); - d_Argl2.value += 1.0; - /* - Argl3 = Arg1 * vds; - MultDeriv(&d_Argl3,&d_Arg1,&d_r); - Argl4 = Vcom/Ent/EntSquare; - MultDeriv(&d_Argl4,&d_Ent,&d_EntSquare); - DivDeriv(&d_Argl4,&d_Vcom,&d_Argl4); - */ - if (Ent > 1.0e-8) { - Argl5 = Arg1 / Ent; - DivDeriv(&d_Argl5,&d_Arg1,&d_Ent); - Argl6 = Vcom/EntSquare; - DivDeriv(&d_Argl6,&d_Vcom,&d_EntSquare); - } else { - Argl5 = 2.0; - EqualDeriv(&d_Argl5,&d_zero); - d_Argl5.value = Argl5; - Argl6 = 4.0 / 1.5e1; - EqualDeriv(&d_Argl6,&d_zero); - d_Argl6.value = Argl6; - } - Argl7 = Argl5 / 1.2e1; - TimesDeriv(&d_Argl7,&d_Argl5,1/12.0); - /* - Argl8 = 6.0 * Ent; - TimesDeriv(&d_Argl8,&d_Ent,6.0); - Argl9 = 0.125 * Argl5 * Argl5; - MultDeriv(&d_Argl9,&d_Argl5,&d_Argl5); - TimesDeriv(&d_Argl9,&d_Argl9,0.125); - */ - qg = WLCox * (vgs - Vfb - Phi - 0.5 * vds + vds * Argl7); - EqualDeriv(&d_qg,&d_Argl7); - d_qg.value -= 0.5; - MultDeriv(&d_qg,&d_qg,&d_r); - d_qg.value += vgs - Vfb - Phi; - d_qg.d1_p += 1.0; - TimesDeriv(&d_qg,&d_qg,WLCox); - qb = WLCox * ( - Vth0 + Vfb + Phi + 0.5 * Arg3 - Arg3 * Argl7); - TimesDeriv(&d_qb,&d_Argl7,-1.0); - d_qb.value += 0.5; - MultDeriv(&d_qb,&d_qb,&d_Arg3); - d_qb.value += Vfb + Phi; - TimesDeriv(&d_dummy,&d_Vth0,-1.0); - PlusDeriv(&d_qb,&d_qb,&d_dummy); - TimesDeriv(&d_qb,&d_qb,WLCox); - qd = - WLCox * (0.5 * (VgsVth - Arg1) + - Arg1 * Argl6); - MultDeriv(&d_dummy,&d_Arg1,&d_Argl6); - TimesDeriv(&d_qd,&d_Arg1,-1.0); - PlusDeriv(&d_qd,&d_qd,&d_VgsVth); - TimesDeriv(&d_qd,&d_qd,0.5); - PlusDeriv(&d_qd,&d_qd,&d_dummy); - TimesDeriv(&d_qd,&d_qd,-WLCox); - goto finished; - } else if( vds >= VdsPinchoff ) { /* saturation region */ - Args1 = 1.0 / (3*A); - TimesDeriv(&d_Args1,&d_A,3.0); - InvDeriv(&d_Args1,&d_Args1); - - qg = WLCox * (vgs - Vfb - Phi - VgsVth * Args1); - MultDeriv(&d_qg,&d_VgsVth,&d_Args1); - d_qg.value += Vfb + Phi - vgs; - d_qg.d1_p -= 1.0; - TimesDeriv(&d_qg,&d_qg,-WLCox); - qb = WLCox * (Vfb + Phi - Vth0 + (1.0 - A) * VgsVth * Args1); - TimesDeriv(&d_dummy,&d_A,-1.0); - d_dummy.value += 1.0; - MultDeriv(&d_qb,&d_VgsVth, &d_dummy); - MultDeriv(&d_qb,&d_qb,&d_Args1); - d_qb.value += Vfb + Phi; - TimesDeriv(&d_dummy,&d_Vth0,-1.0); - PlusDeriv(&d_qb,&d_qb,&d_dummy); - TimesDeriv(&d_qb,&d_qb,WLCox); - qd = -co4v15*WLCox*VgsVth; - TimesDeriv(&d_qd,&d_VgsVth,-co4v15*WLCox); - goto finished; - } - - - } - - } - finished: /* returning Values to Calling Routine */ - - - - - /* - * the above has set up (DrCur) and (the node q's) - * and (their derivatives upto third order wrt vgs, vbs, and - * vds) - */ - /* - * - */ - /* - * charge storage elements - * - * bulk-drain and bulk-source depletion capacitances - * czbd : zero bias drain junction capacitance - * czbs : zero bias source junction capacitance - * czbdsw:zero bias drain junction sidewall capacitance - * czbssw:zero bias source junction sidewall capacitance - */ - - czbd = model->B1unitAreaJctCap * DrainArea; - czbs = model->B1unitAreaJctCap * SourceArea; - czbdsw= model->B1unitLengthSidewallJctCap * DrainPerimeter; - czbssw= model->B1unitLengthSidewallJctCap * SourcePerimeter; - PhiB = model->B1bulkJctPotential; - PhiBSW = model->B1sidewallJctPotential; - MJ = model->B1bulkJctBotGradingCoeff; - MJSW = model->B1bulkJctSideGradingCoeff; - - /* Source Bulk Junction */ - if( vbs < 0 ) { - arg = 1 - vbs / PhiB; - argsw = 1 - vbs / PhiBSW; - sarg = exp(-MJ*log(arg)); - sargsw = exp(-MJSW*log(argsw)); - /* *(ckt->CKTstate0 + here->B1qbs) = - PhiB * czbs * (1-arg*sarg)/(1-MJ) + PhiBSW * - czbssw * (1-argsw*sargsw)/(1-MJSW); */ - capbs1 = czbs * sarg + czbssw * sargsw ; - capbs2 = (czbs * MJ * sarg / (PhiB*arg) - + czbssw * MJSW * sargsw /(PhiBSW*argsw))/2.0; - capbs3 = (czbs * (MJ) * (MJ + 1.) * sarg /((PhiB*arg)*(PhiB*arg)) - + czbssw * MJSW * (MJSW + 1.) * sargsw / (PhiBSW*argsw*PhiBSW*argsw))/6.0; - } else { - /* *(ckt->CKTstate0+here->B1qbs) = - vbs*(czbs+czbssw)+ vbs*vbs*(czbs*MJ*0.5/PhiB - + czbssw * MJSW * 0.5/PhiBSW); */ - capbs1 = czbs + czbssw + vbs *(czbs*MJ/PhiB+ - czbssw * MJSW / PhiBSW ); - capbs2 = (czbs*MJ/PhiB+czbssw * MJSW / PhiBSW )*0.5; - capbs3 = 0.0; - } - - /* Drain Bulk Junction */ - if( vbd < 0 ) { - arg = 1 - vbd / PhiB; - argsw = 1 - vbd / PhiBSW; - sarg = exp(-MJ*log(arg)); - sargsw = exp(-MJSW*log(argsw)); - /* *(ckt->CKTstate0 + here->B1qbd) = - PhiB * czbd * (1-arg*sarg)/(1-MJ) + PhiBSW * - czbdsw * (1-argsw*sargsw)/(1-MJSW); */ - capbd1 = czbd * sarg + czbdsw * sargsw ; - capbd2 = (czbd * MJ * sarg / (PhiB*arg) - + czbdsw * MJSW * sargsw /(PhiBSW*argsw))*0.5; - capbd3 = (czbd * (MJ) * (MJ + 1.) * sarg /((PhiB*arg)*(PhiB*arg)) - + czbdsw * MJSW * (MJSW + 1.) * sargsw / (PhiBSW*argsw*PhiBSW*argsw))/6.0; - } else { - /* *(ckt->CKTstate0+here->B1qbd) = - vbd*(czbd+czbdsw)+ vbd*vbd*(czbd*MJ*0.5/PhiB - + czbdsw * MJSW * 0.5/PhiBSW); */ - capbd1 = czbd + czbdsw + vbd *(czbd*MJ/PhiB+ - czbdsw * MJSW / PhiBSW ); - capbd2 = 0.5*(czbs*MJ/PhiB+czbssw * MJSW / PhiBSW ); - capbd3 = 0.0; - } - -#if 0 - qgd = GateDrainOverlapCap * (vgs - vds); - qgs = GateSourceOverlapCap * vgs; - qgb = GateBulkOverlapCap * (vgs -vbs); - *qGatePointer = *qGatePointer + qgd + qgs + qgb; - *qBulkPointer = *qBulkPointer - qgb; - *qDrainPointer = *qDrainPointer - qgd; - *qSourcePointer = -(*qGatePointer + *qBulkPointer + *qDrainPointer); -#endif - - d_qg.d1_p += GateDrainOverlapCap + GateSourceOverlapCap + GateBulkOverlapCap; - d_qg.d1_q += -GateBulkOverlapCap; - d_qg.d1_r += -GateDrainOverlapCap; - d_qb.d1_p += -GateBulkOverlapCap; - d_qb.d1_q += GateBulkOverlapCap + capbs1 + capbd1; - d_qb.d1_r += -capbd1; - d_qd.d1_p += - GateDrainOverlapCap; - d_qd.d1_q += -capbd1; - d_qd.d1_r += GateDrainOverlapCap + capbd1; - /* - d[23]_qg_d[vlgbds23] += 0.0; - d2_qb_dvgs2 += 0.0; - d3_qb_dvgs3 += 0.0 - d[23]_qb_dvgs[dvbds23] += 0.0 - */ - d_qb.d2_q2 += 2* ( capbd2 + capbs2); - d_qb.d3_q3 += 6*(capbd3 + capbs3); - d_qb.d2_qr += -2*capbd2; - d_qb.d3_q2r += -capbd3*6; - d_qb.d3_qr2 += capbd3*6; - d_qb.d2_r2 += 2*capbd2; - d_qb.d3_r3 += -6*capbd3; - /* - d[23]_qd_dp[dvbds23] += 0.0 - */ - d_qd.d2_q2 -= 2*capbd2; - d_qd.d3_q3 -= 6*capbd3; - d_qd.d2_r2 -= 2*capbd2; - d_qd.d3_r3 -= -6*capbd3; - d_qd.d2_qr -= -2*capbd2; - d_qd.d3_q2r -= -6*capbd3; - d_qd.d3_qr2 -= 6*capbd3; - - - /* get all the coefficients and adjust for mode and type */ - if (here->B1mode == 1) - { - /* normal mode - no source-drain interchange */ - here->qg_x = d_qg.d1_p; - here->qg_y = d_qg.d1_q; - here->qg_z = d_qg.d1_r; - here->qg_x2 = d_qg.d2_p2; - here->qg_y2 = d_qg.d2_q2; - here->qg_z2 = d_qg.d2_r2; - here->qg_xy = d_qg.d2_pq; - here->qg_yz = d_qg.d2_qr; - here->qg_xz = d_qg.d2_pr; - here->qg_x3 = d_qg.d3_p3; - here->qg_y3 = d_qg.d3_q3; - here->qg_z3 = d_qg.d3_r3; - here->qg_x2z = d_qg.d3_p2r; - here->qg_x2y = d_qg.d3_p2q; - here->qg_y2z = d_qg.d3_q2r; - here->qg_xy2 = d_qg.d3_pq2; - here->qg_xz2 = d_qg.d3_pr2; - here->qg_yz2 = d_qg.d3_qr2; - here->qg_xyz = d_qg.d3_pqr; - - here->qb_x = d_qb.d1_p; - here->qb_y = d_qb.d1_q; - here->qb_z = d_qb.d1_r; - here->qb_x2 = d_qb.d2_p2; - here->qb_y2 = d_qb.d2_q2; - here->qb_z2 = d_qb.d2_r2; - here->qb_xy = d_qb.d2_pq; - here->qb_yz = d_qb.d2_qr; - here->qb_xz = d_qb.d2_pr; - here->qb_x3 = d_qb.d3_p3; - here->qb_y3 = d_qb.d3_q3; - here->qb_z3 = d_qb.d3_r3; - here->qb_x2z = d_qb.d3_p2r; - here->qb_x2y = d_qb.d3_p2q; - here->qb_y2z = d_qb.d3_q2r; - here->qb_xy2 = d_qb.d3_pq2; - here->qb_xz2 = d_qb.d3_pr2; - here->qb_yz2 = d_qb.d3_qr2; - here->qb_xyz = d_qb.d3_pqr; - - here->qd_x = d_qd.d1_p; - here->qd_y = d_qd.d1_q; - here->qd_z = d_qd.d1_r; - here->qd_x2 = d_qd.d2_p2; - here->qd_y2 = d_qd.d2_q2; - here->qd_z2 = d_qd.d2_r2; - here->qd_xy = d_qd.d2_pq; - here->qd_yz = d_qd.d2_qr; - here->qd_xz = d_qd.d2_pr; - here->qd_x3 = d_qd.d3_p3; - here->qd_y3 = d_qd.d3_q3; - here->qd_z3 = d_qd.d3_r3; - here->qd_x2z = d_qd.d3_p2r; - here->qd_x2y = d_qd.d3_p2q; - here->qd_y2z = d_qd.d3_q2r; - here->qd_xy2 = d_qd.d3_pq2; - here->qd_xz2 = d_qd.d3_pr2; - here->qd_yz2 = d_qd.d3_qr2; - here->qd_xyz = d_qd.d3_pqr; - - here->DrC_x = d_DrCur.d1_p; - here->DrC_y = d_DrCur.d1_q; - here->DrC_z = d_DrCur.d1_r; - here->DrC_x2 = d_DrCur.d2_p2; - here->DrC_y2 = d_DrCur.d2_q2; - here->DrC_z2 = d_DrCur.d2_r2; - here->DrC_xy = d_DrCur.d2_pq; - here->DrC_yz = d_DrCur.d2_qr; - here->DrC_xz = d_DrCur.d2_pr; - here->DrC_x3 = d_DrCur.d3_p3; - here->DrC_y3 = d_DrCur.d3_q3; - here->DrC_z3 = d_DrCur.d3_r3; - here->DrC_x2z = d_DrCur.d3_p2r; - here->DrC_x2y = d_DrCur.d3_p2q; - here->DrC_y2z = d_DrCur.d3_q2r; - here->DrC_xy2 = d_DrCur.d3_pq2; - here->DrC_xz2 = d_DrCur.d3_pr2; - here->DrC_yz2 = d_DrCur.d3_qr2; - here->DrC_xyz = d_DrCur.d3_pqr; - - here->gbs1 = lgbs1; - here->gbs2 = lgbs2; - here->gbs3 = lgbs3; - - here->gbd1 = lgbd1; - here->gbd2 = lgbd2; - here->gbd3 = lgbd3; - - } else { - /* - * inverse mode - source and drain interchanged - * inversion equations for realqg and realqb are the - * same; a minus is added for the - * realDrCur equation; - * realqd = -(realqb + realqg + fakeqd) - */ - - here->qg_x = -(-d_qg.d1_p); - here->qg_y = -(-d_qg.d1_q); - here->qg_z = -(d_qg.d1_p + d_qg.d1_q + d_qg.d1_r); - here->qg_x2 = -(-d_qg.d2_p2); - here->qg_y2 = -(-d_qg.d2_q2); - here->qg_z2 = -(-(d_qg.d2_p2 + d_qg.d2_q2 + d_qg.d2_r2 + 2*(d_qg.d2_pq + d_qg.d2_pr + d_qg.d2_qr))); - here->qg_xy = -(-d_qg.d2_pq); - here->qg_yz = -(d_qg.d2_pq + d_qg.d2_q2 + d_qg.d2_qr); - here->qg_xz = -(d_qg.d2_p2 + d_qg.d2_pq + d_qg.d2_pr); - here->qg_x3 = -(-d_qg.d3_p3); - here->qg_y3 = -(-d_qg.d3_q3); - here->qg_z3 = -(d_qg.d3_p3 + d_qg.d3_q3 + d_qg.d3_r3 + 3*(d_qg.d3_p2q + d_qg.d3_p2r + d_qg.d3_pq2 + d_qg.d3_q2r + d_qg.d3_pr2 + d_qg.d3_qr2) + 6*d_qg.d3_pqr ); - here->qg_x2z = -(d_qg.d3_p3 + d_qg.d3_p2q + d_qg.d3_p2r); - here->qg_x2y = -(-d_qg.d3_p2q); - here->qg_y2z = -(d_qg.d3_pq2 + d_qg.d3_q3 + d_qg.d3_q2r); - here->qg_xy2 = -(-d_qg.d3_pq2); - here->qg_xz2 = -(-(d_qg.d3_p3 + 2*(d_qg.d3_p2q + d_qg.d3_p2r + d_qg.d3_pqr) + d_qg.d3_pq2 + d_qg.d3_pr2)); - here->qg_yz2 = -(-(d_qg.d3_q3 + 2*(d_qg.d3_pq2 + d_qg.d3_q2r + d_qg.d3_pqr) + d_qg.d3_p2q + d_qg.d3_qr2)); - here->qg_xyz = -(d_qg.d3_p2q + d_qg.d3_pq2 + d_qg.d3_pqr); - - here->qb_x = -(-d_qb.d1_p); - here->qb_y = -(-d_qb.d1_q); - here->qb_z = -(d_qb.d1_p + d_qb.d1_q + d_qb.d1_r); - here->qb_x2 = -(-d_qb.d2_p2); - here->qb_y2 = -(-d_qb.d2_q2); - here->qb_z2 = -(-(d_qb.d2_p2 + d_qb.d2_q2 + d_qb.d2_r2 + 2*(d_qb.d2_pq + d_qb.d2_pr + d_qb.d2_qr))); - here->qb_xy = -(-d_qb.d2_pq); - here->qb_yz = -(d_qb.d2_pq + d_qb.d2_q2 + d_qb.d2_qr); - here->qb_xz = -(d_qb.d2_p2 + d_qb.d2_pq + d_qb.d2_pr); - here->qb_x3 = -(-d_qb.d3_p3); - here->qb_y3 = -(-d_qb.d3_q3); - here->qb_z3 = -(d_qb.d3_p3 + d_qb.d3_q3 + d_qb.d3_r3 + 3*(d_qb.d3_p2q + d_qb.d3_p2r + d_qb.d3_pq2 + d_qb.d3_q2r + d_qb.d3_pr2 + d_qb.d3_qr2) + 6*d_qb.d3_pqr ); - here->qb_x2z = -(d_qb.d3_p3 + d_qb.d3_p2q + d_qb.d3_p2r); - here->qb_x2y = -(-d_qb.d3_p2q); - here->qb_y2z = -(d_qb.d3_pq2 + d_qb.d3_q3 + d_qb.d3_q2r); - here->qb_xy2 = -(-d_qb.d3_pq2); - here->qb_xz2 = -(-(d_qb.d3_p3 + 2*(d_qb.d3_p2q + d_qb.d3_p2r + d_qb.d3_pqr) + d_qb.d3_pq2 + d_qb.d3_pr2)); - here->qb_yz2 = -(-(d_qb.d3_q3 + 2*(d_qb.d3_pq2 + d_qb.d3_q2r + d_qb.d3_pqr) + d_qb.d3_p2q + d_qb.d3_qr2)); - here->qb_xyz = -(d_qb.d3_p2q + d_qb.d3_pq2 + d_qb.d3_pqr); - - here->qd_x= -here->qg_x - here->qb_x +(-d_qd.d1_p); - here->qd_y= -here->qg_y - here->qb_y +(-d_qd.d1_q); - here->qd_z= -here->qg_z - here->qb_z +(d_qd.d1_p + d_qd.d1_q + d_qd.d1_r); - here->qd_x2 = -here->qg_x2 - here->qb_x2 +(-d_qd.d2_p2); - here->qd_y2 = -here->qg_y2 - here->qb_y2 +(-d_qd.d2_q2); - here->qd_z2 = -here->qg_z2 - here->qb_z2 +(-(d_qd.d2_p2 + d_qd.d2_q2 + d_qd.d2_r2 + 2*(d_qd.d2_pq + d_qd.d2_pr + d_qd.d2_qr))); - here->qd_xy = -here->qg_xy - here->qb_xy +(-d_qd.d2_pq); - here->qd_yz = -here->qg_yz - here->qb_yz +(d_qd.d2_pq + d_qd.d2_q2 + d_qd.d2_qr); - here->qd_xz = -here->qg_xz - here->qb_xz +(d_qd.d2_p2 + d_qd.d2_pq + d_qd.d2_pr); - here->qd_x3 = -here->qg_x3 - here->qb_x3 +(-d_qd.d3_p3); - here->qd_y3 = -here->qg_y3 - here->qb_y3 +(-d_qd.d3_q3); - here->qd_z3 = -here->qg_z3 - here->qb_z3 +(d_qd.d3_p3 + d_qd.d3_q3 + d_qd.d3_r3 + 3*(d_qd.d3_p2q + d_qd.d3_p2r + d_qd.d3_pq2 + d_qd.d3_q2r + d_qd.d3_pr2 + d_qd.d3_qr2) + 6*d_qd.d3_pqr ); - here->qd_x2z = -here->qg_x2z - here->qb_x2z +(d_qd.d3_p3 + d_qd.d3_p2q + d_qd.d3_p2r); - here->qd_x2y = -here->qg_x2y - here->qb_x2y +(-d_qd.d3_p2q); - here->qd_y2z = -here->qg_y2z - here->qb_y2z +(d_qd.d3_pq2 + d_qd.d3_q3 + d_qd.d3_q2r); - here->qd_xy2 = -here->qg_xy2 - here->qb_xy2 +(-d_qd.d3_pq2); - here->qd_xz2 = -here->qg_xz2 - here->qb_xz2 +(-(d_qd.d3_p3 + 2*(d_qd.d3_p2q + d_qd.d3_p2r + d_qd.d3_pqr) + d_qd.d3_pq2 + d_qd.d3_pr2)); - here->qd_yz2 = -here->qg_yz2 - here->qb_yz2 +(-(d_qd.d3_q3 + 2*(d_qd.d3_pq2 + d_qd.d3_q2r + d_qd.d3_pqr) + d_qd.d3_p2q + d_qd.d3_qr2)); - here->qd_xyz = -here->qg_xyz - here->qb_xyz +(d_qd.d3_p2q + d_qd.d3_pq2 + d_qd.d3_pqr); - - here->DrC_x = -d_DrCur.d1_p; - here->DrC_y = -d_DrCur.d1_q; - here->DrC_z = d_DrCur.d1_p + d_DrCur.d1_q + d_DrCur.d1_r; - here->DrC_x2 = -d_DrCur.d2_p2; - here->DrC_y2 = -d_DrCur.d2_q2; - here->DrC_z2 = -(d_DrCur.d2_p2 + d_DrCur.d2_q2 + d_DrCur.d2_r2 + 2*(d_DrCur.d2_pq + d_DrCur.d2_pr + d_DrCur.d2_qr)); - here->DrC_xy = -d_DrCur.d2_pq; - here->DrC_yz = d_DrCur.d2_pq + d_DrCur.d2_q2 + d_DrCur.d2_qr; - here->DrC_xz = d_DrCur.d2_p2 + d_DrCur.d2_pq + d_DrCur.d2_pr; - here->DrC_x3 = -d_DrCur.d3_p3; - here->DrC_y3 = -d_DrCur.d3_q3; - here->DrC_z3 = d_DrCur.d3_p3 + d_DrCur.d3_q3 + d_DrCur.d3_r3 + 3*(d_DrCur.d3_p2q + d_DrCur.d3_p2r + d_DrCur.d3_pq2 + d_DrCur.d3_q2r + d_DrCur.d3_pr2 + d_DrCur.d3_qr2) + 6*d_DrCur.d3_pqr ; - here->DrC_x2z = d_DrCur.d3_p3 + d_DrCur.d3_p2q + d_DrCur.d3_p2r; - here->DrC_x2y = -d_DrCur.d3_p2q; - here->DrC_y2z = d_DrCur.d3_pq2 + d_DrCur.d3_q3 + d_DrCur.d3_q2r; - here->DrC_xy2 = -d_DrCur.d3_pq2; - here->DrC_xz2 = -(d_DrCur.d3_p3 + 2*(d_DrCur.d3_p2q + d_DrCur.d3_p2r + d_DrCur.d3_pqr) + d_DrCur.d3_pq2 + d_DrCur.d3_pr2); - here->DrC_yz2 = -(d_DrCur.d3_q3 + 2*(d_DrCur.d3_pq2 + d_DrCur.d3_q2r + d_DrCur.d3_pqr) + d_DrCur.d3_p2q + d_DrCur.d3_qr2); - here->DrC_xyz = d_DrCur.d3_p2q + d_DrCur.d3_pq2 + d_DrCur.d3_pqr; - - here->gbs1 = lgbd1; - here->gbs2 = lgbd2; - here->gbs3 = lgbd3; - - here->gbd1 = lgbs1; - here->gbd2 = lgbs2; - here->gbd3 = lgbs3; - } - - /* now to adjust for type and multiply by factors to convert to Taylor coeffs. */ - - here->qg_x2 = 0.5*model->B1type*here->qg_x2; - here->qg_y2 = 0.5*model->B1type*here->qg_y2; - here->qg_z2 = 0.5*model->B1type*here->qg_z2; - here->qg_xy = model->B1type*here->qg_xy; - here->qg_yz = model->B1type*here->qg_yz; - here->qg_xz = model->B1type*here->qg_xz; - here->qg_x3 = here->qg_x3/6.; - here->qg_y3 = here->qg_y3/6.; - here->qg_z3 = here->qg_z3/6.; - here->qg_x2z = 0.5*here->qg_x2z; - here->qg_x2y = 0.5*here->qg_x2y; - here->qg_y2z = 0.5*here->qg_y2z; - here->qg_xy2 = 0.5*here->qg_xy2; - here->qg_xz2 = 0.5*here->qg_xz2; - here->qg_yz2 = 0.5*here->qg_yz2; - - here->qb_x2 = 0.5*model->B1type*here->qb_x2; - here->qb_y2 = 0.5*model->B1type*here->qb_y2; - here->qb_z2 = 0.5*model->B1type*here->qb_z2; - here->qb_xy = model->B1type*here->qb_xy; - here->qb_yz = model->B1type*here->qb_yz; - here->qb_xz = model->B1type*here->qb_xz; - here->qb_x3 = here->qb_x3/6.; - here->qb_y3 = here->qb_y3/6.; - here->qb_z3 = here->qb_z3/6.; - here->qb_x2z = 0.5*here->qb_x2z; - here->qb_x2y = 0.5*here->qb_x2y; - here->qb_y2z = 0.5*here->qb_y2z; - here->qb_xy2 = 0.5*here->qb_xy2; - here->qb_xz2 = 0.5*here->qb_xz2; - here->qb_yz2 = 0.5*here->qb_yz2; - - here->qd_x2 = 0.5*model->B1type*here->qd_x2; - here->qd_y2 = 0.5*model->B1type*here->qd_y2; - here->qd_z2 = 0.5*model->B1type*here->qd_z2; - here->qd_xy = model->B1type*here->qd_xy; - here->qd_yz = model->B1type*here->qd_yz; - here->qd_xz = model->B1type*here->qd_xz; - here->qd_x3 = here->qd_x3/6.; - here->qd_y3 = here->qd_y3/6.; - here->qd_z3 = here->qd_z3/6.; - here->qd_x2z = 0.5*here->qd_x2z; - here->qd_x2y = 0.5*here->qd_x2y; - here->qd_y2z = 0.5*here->qd_y2z; - here->qd_xy2 = 0.5*here->qd_xy2; - here->qd_xz2 = 0.5*here->qd_xz2; - here->qd_yz2 = 0.5*here->qd_yz2; - - here->DrC_x2 = 0.5*model->B1type*here->DrC_x2; - here->DrC_y2 = 0.5*model->B1type*here->DrC_y2; - here->DrC_z2 = 0.5*model->B1type*here->DrC_z2; - here->DrC_xy = model->B1type*here->DrC_xy; - here->DrC_yz = model->B1type*here->DrC_yz; - here->DrC_xz = model->B1type*here->DrC_xz; - here->DrC_x3 = here->DrC_x3/6.; - here->DrC_y3 = here->DrC_y3/6.; - here->DrC_z3 = here->DrC_z3/6.; - here->DrC_x2z = 0.5*here->DrC_x2z; - here->DrC_x2y = 0.5*here->DrC_x2y; - here->DrC_y2z = 0.5*here->DrC_y2z; - here->DrC_xy2 = 0.5*here->DrC_xy2; - here->DrC_xz2 = 0.5*here->DrC_xz2; - here->DrC_yz2 = 0.5*here->DrC_yz2; - - here->gbs2 = model->B1type*here->gbs2; - here->gbd2 = model->B1type*here->gbd2; - } /* End of Mosfet Instance */ - - } /* End of Model Instance */ - return(OK); -} diff --git a/src/spicelib/devices/bsim1/b1eval.c b/src/spicelib/devices/bsim1/b1eval.c deleted file mode 100644 index 873d51e3f..000000000 --- a/src/spicelib/devices/bsim1/b1eval.c +++ /dev/null @@ -1,600 +0,0 @@ -/********** -Copyright 1990 Regents of the University of California. All rights reserved. -Author: 1985 Hong J. Park, Thomas L. Quarles -**********/ - -#include "ngspice/ngspice.h" -#include "ngspice/cktdefs.h" -#include "bsim1def.h" -#include "ngspice/trandefs.h" -#include "ngspice/const.h" -#include "ngspice/suffix.h" - -/* This routine evaluates the drain current, its derivatives and the - * charges associated with the gate,bulk and drain terminal - * using the B1 (Berkeley Short-Channel IGFET Model) Equations. - */ -void -B1evaluate(double vds, double vbs, double vgs, B1instance *here, B1model *model, - double *gmPointer, double *gdsPointer, double *gmbsPointer, - double *qgPointer, double *qbPointer, double *qdPointer, - double *cggbPointer, double *cgdbPointer, double *cgsbPointer, - double *cbgbPointer, double *cbdbPointer, double *cbsbPointer, - double *cdgbPointer, double *cddbPointer, double *cdsbPointer, - double *cdrainPointer, double *vonPointer, double *vdsatPointer, - CKTcircuit *ckt) - { - double gm; - double gds; - double gmbs; - double qg = 0.0; - double qb = 0.0; - double qd = 0.0; - double cggb = 0.0; - double cgdb = 0.0; - double cgsb = 0.0; - double cbgb = 0.0; - double cbdb = 0.0; - double cbsb = 0.0; - double cdgb = 0.0; - double cddb = 0.0; - double cdsb = 0.0; - double Vfb; - double Phi; - double K1; - double K2; - double Vdd; - double Ugs; - double Uds; - double dUgsdVbs; - double Leff; - double dUdsdVbs; - double dUdsdVds; - double Eta; - double dEtadVds; - double dEtadVbs; - double Vpb; - double SqrtVpb; - double Von; - double Vth; - double dVthdVbs; - double dVthdVds; - double Vgs_Vth; - double DrainCurrent; - double G; - double A; - double Arg; - double dGdVbs; - double dAdVbs; - double Beta; - double Beta_Vds_0; - double BetaVdd; - double dBetaVdd_dVds; - double Beta0; - double dBeta0dVds; - double dBeta0dVbs; - double VddSquare; - double C1; - double C2; - double dBetaVdd_dVbs; - double dBeta_Vds_0_dVbs; - double dC1dVbs; - double dC2dVbs; - double dBetadVgs; - double dBetadVds; - double dBetadVbs; - double VdsSat = 0.0; - double Argl1; - double Argl2; - double Vc; - double Term1; - double K; - double Args1; - double dVcdVgs; - double dVcdVds; - double dVcdVbs; - double dKdVc; - double dKdVgs; - double dKdVds; - double dKdVbs; - double Args2; - double Args3; - double Warg1; - double Vcut; - double N; - double N0; - double NB; - double ND; - double Warg2; - double Wds; - double Wgs; - double Ilimit; - double Iexp; - double Temp1; - double Vth0; - double Arg1; - double Arg2; - double Arg3; - double Arg5; - double Ent; - double Vcom; - double Vgb; - double Vgb_Vfb; - double VdsPinchoff; - double EntSquare; - double Vgs_VthSquare; - double Argl3; - double Argl4; - double Argl5; - double Argl6; - double Argl7; - double Argl8; - double Argl9; - double dEntdVds; - double dEntdVbs; - double cgbb; - double cdbb; - double cbbb; - double WLCox; - double Vtsquare; - double Temp3; - int ChargeComputationNeeded; - double co4v15; - - if (ckt->CKTmode & (MODEAC | MODETRAN)) { - ChargeComputationNeeded = 1; - } else if (ckt->CKTmode & MODEINITSMSIG) { - ChargeComputationNeeded = 1; - } else if ((ckt->CKTmode & MODETRANOP) && (ckt->CKTmode & MODEUIC)) { - ChargeComputationNeeded = 1; - } else { - ChargeComputationNeeded = 0; - } - - Vfb = here->B1vfb; - Phi = here->B1phi; - K1 = here->B1K1; - K2 = here->B1K2; - Vdd = model->B1vdd; - if((Ugs = here->B1ugs + here->B1ugsB * vbs) <= 0 ) { - Ugs = 0; - dUgsdVbs = 0.0; - } else { - dUgsdVbs = here->B1ugsB; - } - if((Uds = here->B1uds + here->B1udsB * vbs + - here->B1udsD*(vds-Vdd)) <= 0 ) { - Uds = 0.0; - dUdsdVbs = dUdsdVds = 0.0; - } else { - Leff = here->B1l * 1.e6 - model->B1deltaL; /* Leff in um */ - Uds = Uds / Leff; - dUdsdVbs = here->B1udsB / Leff; - dUdsdVds = here->B1udsD / Leff; - } - Eta = here->B1eta + here->B1etaB * vbs + here->B1etaD * - (vds - Vdd); - if( Eta <= 0 ) { - Eta = 0; - dEtadVds = dEtadVbs = 0.0 ; - } else if ( Eta > 1 ) { - Eta = 1; - dEtadVds = dEtadVbs = 0; - } else { - dEtadVds = here->B1etaD; - dEtadVbs = here->B1etaB; - } - if( vbs < 0 ) { - Vpb = Phi - vbs; - } else { - Vpb = Phi; - } - SqrtVpb = sqrt( Vpb ); - Von = Vfb + Phi + K1 * SqrtVpb - K2 * Vpb - Eta * vds; - Vth = Von; - dVthdVds = - Eta - dEtadVds * vds; - dVthdVbs = K2 - 0.5 * K1 / SqrtVpb - dEtadVbs * vds; - Vgs_Vth = vgs - Vth; - - G = 1. - 1./(1.744+0.8364 * Vpb); - A = 1. + 0.5*G*K1/SqrtVpb; - A = MAX( A, 1.0); /* Modified */ - Arg = MAX(( 1 + Ugs * Vgs_Vth), 1.0); - dGdVbs = -0.8364 * (1-G) * (1-G); - dAdVbs = 0.25 * K1 / SqrtVpb *(2*dGdVbs + G/Vpb); - - if( Vgs_Vth < 0 ) { - /* cutoff */ - DrainCurrent = 0; - gm = 0; - gds = 0; - gmbs = 0; - goto SubthresholdComputation; - } - - /* Quadratic Interpolation for Beta0 (Beta at vgs = 0, vds=Vds) */ - - Beta_Vds_0 = (here->B1betaZero + here->B1betaZeroB * vbs); - BetaVdd = (here->B1betaVdd + here->B1betaVddB * vbs); - dBetaVdd_dVds = MAX( here->B1betaVddD, 0.0); /* Modified */ - if( vds > Vdd ) { - Beta0 = BetaVdd + dBetaVdd_dVds * (vds - Vdd); - dBeta0dVds = dBetaVdd_dVds; - dBeta0dVbs = here->B1betaVddB; - } else { - VddSquare = Vdd * Vdd; - C1 = ( -BetaVdd + Beta_Vds_0 + dBetaVdd_dVds * Vdd) / VddSquare; - C2 = 2 * (BetaVdd - Beta_Vds_0) / Vdd - dBetaVdd_dVds; - dBeta_Vds_0_dVbs = here->B1betaZeroB; - dBetaVdd_dVbs = here->B1betaVddB; - dC1dVbs = (dBeta_Vds_0_dVbs - dBetaVdd_dVbs) / VddSquare; - dC2dVbs = dC1dVbs * (-2) * Vdd; - Beta0 = (C1 * vds + C2) * vds + Beta_Vds_0; - dBeta0dVds = 2*C1*vds + C2; - dBeta0dVbs = dC1dVbs * vds * vds + dC2dVbs * vds + dBeta_Vds_0_dVbs; - } - - /*Beta = Beta0 / ( 1 + Ugs * Vgs_Vth );*/ - - Beta = Beta0 / Arg ; - dBetadVgs = - Beta * Ugs / Arg; - dBetadVds = dBeta0dVds / Arg - dBetadVgs * dVthdVds ; - dBetadVbs = dBeta0dVbs / Arg + Beta * Ugs * dVthdVbs / Arg - - Beta * Vgs_Vth * dUgsdVbs / Arg; - - /*VdsSat = MAX( Vgs_Vth / ( A + Uds * Vgs_Vth ), 0.0);*/ - - if((Vc = Uds * Vgs_Vth / A) < 0.0 ) Vc=0.0; - Term1 = sqrt( 1 + 2 * Vc ); - K = 0.5 * ( 1 + Vc + Term1 ); - VdsSat = MAX( Vgs_Vth / ( A * sqrt(K) ) , 0.0 ); - - if( vds < VdsSat ) { - /* Triode Region */ - /*Argl1 = 1 + Uds * vds;*/ - Argl1 = MAX( (1 + Uds * vds), 1.); - Argl2 = Vgs_Vth - 0.5 * A * vds; - DrainCurrent = Beta * Argl2 * vds / Argl1; - gm = (dBetadVgs * Argl2 * vds + Beta * vds) / Argl1; - gds = (dBetadVds * Argl2 * vds + Beta * - (Vgs_Vth - vds * dVthdVds - A * vds) - - DrainCurrent * (vds * dUdsdVds + Uds )) / Argl1; - gmbs = (dBetadVbs * Argl2 * vds + Beta * vds * - (- dVthdVbs - 0.5 * vds * dAdVbs ) - - DrainCurrent * vds * dUdsdVbs ) / Argl1; - } else { - /* Pinchoff (Saturation) Region */ - Args1 = 1. + 1. / Term1; - dVcdVgs = Uds / A; - dVcdVds = Vgs_Vth * dUdsdVds / A - dVcdVgs * dVthdVds; - dVcdVbs = ( Vgs_Vth * dUdsdVbs - Uds * - (dVthdVbs + Vgs_Vth * dAdVbs / A ))/ A; - dKdVc = 0.5* Args1; - dKdVgs = dKdVc * dVcdVgs; - dKdVds = dKdVc * dVcdVds; - dKdVbs = dKdVc * dVcdVbs; - Args2 = Vgs_Vth / A / K; - Args3 = Args2 * Vgs_Vth; - DrainCurrent = 0.5 * Beta * Args3; - gm = 0.5 * Args3 * dBetadVgs + Beta * Args2 - - DrainCurrent * dKdVgs / K; - gds = 0.5 * Args3 * dBetadVds - Beta * Args2 * dVthdVds - - DrainCurrent * dKdVds / K; - gmbs = 0.5 * dBetadVbs * Args3 - Beta * Args2 *dVthdVbs - - DrainCurrent * (dAdVbs / A + dKdVbs / K ); - } - -SubthresholdComputation: - - N0 = here->B1subthSlope; - Vcut = - 40. * N0 * CONSTvt0 ; - -/* The following 'if' statement has been modified so that subthreshold * - * current computation is always executed unless N0 >= 200. This should * - * get rid of the Ids kink seen on Ids-Vgs plots at low Vds. * - * Peter M. Lee * - * 6/8/90 * - * Old 'if' statement: * - * if( (N0 >= 200) || (Vgs_Vth < Vcut ) || (Vgs_Vth > (-0.5*Vcut))) */ - - if (N0 >= 200) { - goto ChargeComputation; - } - - NB = here->B1subthSlopeB; - ND = here->B1subthSlopeD; - N = N0 + NB * vbs + ND * vds; /* subthreshold slope */ - if( N < 0.5 ) N = 0.5; - Warg1 = exp( - vds / CONSTvt0 ); - Wds = 1 - Warg1; - Wgs = exp( Vgs_Vth / ( N * CONSTvt0 )); - Vtsquare = CONSTvt0 * CONSTvt0 ; - Warg2 = 6.04965 * Vtsquare * here->B1betaZero; - Ilimit = 4.5 * Vtsquare * here->B1betaZero; - Iexp = Warg2 * Wgs * Wds; - DrainCurrent = DrainCurrent + Ilimit * Iexp / ( Ilimit + Iexp ); - Temp1 = Ilimit / ( Ilimit + Iexp ); - Temp1 = Temp1 * Temp1; - Temp3 = Ilimit / ( Ilimit + Wgs * Warg2 ); - Temp3=Temp3 * Temp3 * Warg2 * Wgs; -/* if ( Temp3 > Ilimit ) Temp3=Ilimit;*/ - gm = gm + Temp1 * Iexp / ( N * CONSTvt0 ); - /* gds term has been modified to prevent blow up at Vds=0 */ - gds = gds + Temp3 * ( -Wds / N / CONSTvt0 * (dVthdVds + - Vgs_Vth * ND / N ) + Warg1 / CONSTvt0 ); - gmbs = gmbs - Temp1 * Iexp * (dVthdVbs + Vgs_Vth * NB / N ) / - ( N * CONSTvt0 ); - -ChargeComputation: - - /* Some Limiting of DC Parameters */ - if(DrainCurrent < 0.0) DrainCurrent = 0.0; - if(gm < 0.0) gm = 0.0; - if(gds < 0.0) gds = 0.0; - if(gmbs < 0.0) gmbs = 0.0; - - WLCox = model->B1Cox * - (here->B1l - model->B1deltaL * 1.e-6) * - (here->B1w - model->B1deltaW * 1.e-6) * 1.e4; /* F */ - - if( ! ChargeComputationNeeded ) { - qg = 0; - qd = 0; - qb = 0; - cggb = 0; - cgsb = 0; - cgdb = 0; - cdgb = 0; - cdsb = 0; - cddb = 0; - cbgb = 0; - cbsb = 0; - cbdb = 0; - goto finished; - } - G = 1. - 1./(1.744+0.8364 * Vpb); - A = 1. + 0.5*G*K1/SqrtVpb; - A = MAX( A, 1.0); /* Modified */ - /*Arg = 1 + Ugs * Vgs_Vth;*/ - dGdVbs = -0.8364 * (1-G) * (1-G); - dAdVbs = 0.25 * K1 / SqrtVpb *(2*dGdVbs + G/Vpb); - Phi = MAX( 0.1, Phi); - - if( model->B1channelChargePartitionFlag ) { - -/*0/100 partitioning for drain/source chArges at the saturation region*/ - Vth0 = Vfb + Phi + K1 * SqrtVpb; - Vgs_Vth = vgs - Vth0; - Arg1 = A * vds; - Arg2 = Vgs_Vth - 0.5 * Arg1; - Arg3 = vds - Arg1; - Arg5 = Arg1 * Arg1; - dVthdVbs = - 0.5 * K1 / SqrtVpb; - dAdVbs = 0.5 * K1 * (0.5 * G / Vpb - 0.8364 * (1 -G) * (1 - G) ) / - SqrtVpb ; - Ent = MAX(Arg2,1.0e-8); - dEntdVds = - 0.5 * A; - dEntdVbs = - dVthdVbs - 0.5 * vds * dAdVbs; - Vcom = Vgs_Vth * Vgs_Vth / 6.0 - 1.25e-1 * Arg1 * - Vgs_Vth + 2.5e-2 * Arg5; - VdsPinchoff = MAX( Vgs_Vth / A, 0.0); - Vgb = vgs - vbs ; - Vgb_Vfb = Vgb - Vfb; - - if( Vgb_Vfb < 0){ - /* Accumulation Region */ - qg = WLCox * Vgb_Vfb; - qb = - qg; - qd = 0. ; - cggb = WLCox; - cgdb = 0.; - cgsb = 0.; - cbgb = -WLCox; - cbdb = 0.; - cbsb = 0.; - cdgb = 0.; - cddb = 0.; - cdsb = 0.; - goto finished; - } else if ( vgs < Vth0 ){ - /* Subthreshold Region */ - qg = 0.5 * WLCox * K1 * K1 * (-1 + - sqrt(1 + 4 * Vgb_Vfb / (K1 * K1))); - qb = -qg; - qd = 0.; - cggb = WLCox / sqrt(1 + 4 * Vgb_Vfb / (K1 * K1)); - cgdb = cgsb = 0.; - cbgb = -cggb; - cbdb = cbsb = cdgb = cddb = cdsb = 0.0; - goto finished; - } else if( vds < VdsPinchoff ){ /* triode region */ - /*Vgs_Vth2 = Vgs_Vth*Vgs_Vth;*/ - EntSquare = Ent * Ent; - Argl1 = 1.2e1 * EntSquare; - Argl2 = 1.0 - A; - Argl3 = Arg1 * vds; - /*Argl4 = Vcom/Ent/EntSquare;*/ - if (Ent > 1.0e-8) { - Argl5 = Arg1 / Ent; - /*Argl6 = Vcom/EntSquare;*/ - } else { - Argl5 = 2.0; - Argl6 = 4.0 / 1.5e1; - } - Argl7 = Argl5 / 1.2e1; - Argl8 = 6.0 * Ent; - Argl9 = 0.125 * Argl5 * Argl5; - qg = WLCox * (vgs - Vfb - Phi - 0.5 * vds + vds * Argl7); - qb = WLCox * ( - Vth0 + Vfb + Phi + 0.5 * Arg3 - Arg3 * Argl7); - qd = - WLCox * (0.5 * Vgs_Vth - 0.75 * Arg1 + - 0.125 * Arg1 * Argl5); - cggb = WLCox * (1.0 - Argl3 / Argl1); - cgdb = WLCox * ( - 0.5 + Arg1 / Argl8 - Argl3 * dEntdVds / - Argl1); - cgbb = WLCox * (vds * vds * dAdVbs * Ent - Argl3 * dEntdVbs) / - Argl1; - cgsb = - (cggb + cgdb + cgbb); - cbgb = WLCox * Argl3 * Argl2 / Argl1; - cbdb = WLCox * Argl2 * (0.5 - Arg1 / Argl8 + Argl3 * dEntdVds / - Argl1); - cbbb = - WLCox * (dVthdVbs + 0.5 * vds * dAdVbs + vds * - vds * ((1.0 - 2.0 * A) * dAdVbs * Ent - Argl2 * - A * dEntdVbs) / Argl1); - cbsb = - (cbgb + cbdb + cbbb); - cdgb = - WLCox * (0.5 - Argl9); - cddb = WLCox * (0.75 * A - 0.25 * A * Arg1 / Ent + - Argl9 * dEntdVds); - cdbb = WLCox * (0.5 * dVthdVbs + vds * dAdVbs * - (0.75 - 0.25 * Argl5 ) + Argl9 * dEntdVbs); - cdsb = - (cdgb + cddb + cdbb); - goto finished; - } else if( vds >= VdsPinchoff ) { /* saturation region */ - Args1 = 1.0 / (3.0 * A); - qg = WLCox * (vgs - Vfb - Phi - Vgs_Vth * Args1); - qb = WLCox * (Vfb + Phi - Vth0 + (1.0 - A) * Vgs_Vth * Args1); - qd = 0.0; - cggb = WLCox * (1.0 - Args1); - cgdb = 0.0; - cgbb = WLCox * Args1 * (dVthdVbs + Vgs_Vth * dAdVbs / A); - cgsb = - (cggb + cgdb + cgbb); - cbgb = WLCox * (Args1 - 1.0 / 3.0); - cbdb = 0.0; - cbbb = - WLCox * ((2.0 / 3.0 + Args1) * dVthdVbs + - Vgs_Vth * Args1 * dAdVbs / A); /* Modified */ - cbsb = - (cbgb + cbdb + cbbb); - cdgb = 0.0; - cddb = 0.0; - cdsb = 0.0; - goto finished; - } - - goto finished; - - } else { - /* ChannelChargePartionFlag < = 0 */ - -/*40/60 partitioning for drain/source chArges at the saturation region*/ - co4v15 = 4./15.; - Vth0 = Vfb+Phi+K1*SqrtVpb; - Vgs_Vth = vgs-Vth0; - Arg1 = A*vds; - Arg2 = Vgs_Vth-0.5*Arg1; - Arg3 = vds-Arg1; - Arg5 = Arg1*Arg1; - dVthdVbs = -0.5*K1/SqrtVpb; - dAdVbs = 0.5*K1*(0.5*G/Vpb-0.8364*(1-G)*(1-G))/SqrtVpb; - Ent = MAX(Arg2,1.0e-8); - dEntdVds = -0.5*A; - dEntdVbs = -dVthdVbs-0.5*vds*dAdVbs; - Vcom = Vgs_Vth*Vgs_Vth/6.0-1.25e-1*Arg1*Vgs_Vth+2.5e-2*Arg5; - VdsPinchoff = MAX( Vgs_Vth/A, 0.0); - Vgb = vgs - vbs ; - Vgb_Vfb = Vgb - Vfb; - - if( Vgb_Vfb < 0) { /* Accumulation Region */ - qg = WLCox * Vgb_Vfb; - qb = - qg; - qd = 0. ; - cggb = WLCox; - cgdb = 0.; - cgsb = 0.; - cbgb = -WLCox; - cbdb = 0.; - cbsb = 0.; - cdgb = 0.; - cddb = 0.; - cdsb = 0.; - goto finished; - } else if ( vgs < Vth0 ) { /* Subthreshold Region */ - qg = 0.5 * WLCox * K1 * K1 * (-1+sqrt(1+4*Vgb_Vfb/(K1*K1))); - qb = -qg; - qd = 0.; - cggb = WLCox/sqrt(1+4*Vgb_Vfb/(K1*K1)); - cgdb = cgsb = 0.; - cbgb = -cggb; - cbdb = cbsb = cdgb = cddb = cdsb = 0.0; - goto finished; - } else if ( vds < VdsPinchoff ) { /* triode region */ - - Vgs_VthSquare = Vgs_Vth*Vgs_Vth; - EntSquare = Ent*Ent; - Argl1 = 1.2e1*EntSquare; - Argl2 = 1.0-A; - Argl3 = Arg1*vds; - Argl4 = Vcom/Ent/EntSquare; - if (Ent > 1.0e-8) { - Argl5 = Arg1/Ent; - Argl6 = Vcom/EntSquare; - } else { - Argl5 = 2.0; - Argl6 = 4.0/1.5e1; - } - Argl7 = Argl5/1.2e1; - Argl8 = 6.0*Ent; - qg = WLCox*(vgs-Vfb-Phi-0.5*vds+vds*Argl7); - qb = WLCox*(-Vth0+Vfb+Phi+0.5*Arg3-Arg3*Argl7); - qd = -WLCox*(0.5*(Vgs_Vth-Arg1)+Arg1*Argl6); - cggb = WLCox*(1.0-Argl3/Argl1); - cgdb = WLCox*(-0.5+Arg1/Argl8-Argl3*dEntdVds/Argl1); - cgbb = WLCox*(vds*vds*dAdVbs*Ent-Argl3*dEntdVbs)/Argl1; - cgsb = -(cggb+cgdb+cgbb); - cbgb = WLCox*Argl3*Argl2/Argl1; - cbdb = WLCox*Argl2*(0.5-Arg1/Argl8+Argl3*dEntdVds/Argl1); - cbbb = -WLCox*(dVthdVbs+0.5*vds*dAdVbs+vds*vds*((1.0-2.0*A) - *dAdVbs*Ent-Argl2*A*dEntdVbs)/Argl1); - cbsb = -(cbgb+cbdb+cbbb); - cdgb = -WLCox*(0.5+Arg1*(4.0*Vgs_Vth-1.5*Arg1)/Argl1- - 2.0*Arg1*Argl4); - cddb = WLCox*(0.5*A+2.0*Arg1*dEntdVds*Argl4-A*(2.0*Vgs_VthSquare - -3.0*Arg1*Vgs_Vth+0.9*Arg5)/Argl1); - cdbb = WLCox*(0.5*dVthdVbs+0.5*vds*dAdVbs+2.0*Arg1*dEntdVbs - *Argl4-vds*(2.0*Vgs_VthSquare*dAdVbs-4.0*A*Vgs_Vth*dVthdVbs-3.0 - *Arg1*Vgs_Vth*dAdVbs+1.5*A*Arg1*dVthdVbs+0.9*Arg5*dAdVbs) - /Argl1); - cdsb = -(cdgb+cddb+cdbb); - goto finished; - } else if( vds >= VdsPinchoff ) { /* saturation region */ - - Args1 = 1.0/(3.0*A); - qg = WLCox*(vgs-Vfb-Phi-Vgs_Vth*Args1); - qb = WLCox*(Vfb+Phi-Vth0+(1.0-A)*Vgs_Vth*Args1); - qd = -co4v15*WLCox*Vgs_Vth; - cggb = WLCox*(1.0-Args1); - cgdb = 0.0; - cgbb = WLCox*Args1*(dVthdVbs+Vgs_Vth*dAdVbs/A); - cgsb = -(cggb+cgdb+cgbb); - cbgb = WLCox*(Args1-1.0/3.0); - cbdb = 0.0; - cbbb = -WLCox*((2.0/3.0+Args1)*dVthdVbs+Vgs_Vth*Args1*dAdVbs/A); - cbsb = -(cbgb+cbdb+cbbb); - cdgb = -co4v15*WLCox; - cddb = 0.0; - cdbb = co4v15*WLCox*dVthdVbs; - cdsb = -(cdgb+cddb+cdbb); - goto finished; - } - } - -finished: /* returning Values to Calling Routine */ - - *gmPointer = MAX(gm,0.0); - *gdsPointer = MAX( gds, 0.0); - *gmbsPointer = MAX(gmbs,0.0); - *qgPointer = qg; - *qbPointer = qb; - *qdPointer = qd; - *cggbPointer = cggb; - *cgdbPointer = cgdb; - *cgsbPointer = cgsb; - *cbgbPointer = cbgb; - *cbdbPointer = cbdb; - *cbsbPointer = cbsb; - *cdgbPointer = cdgb; - *cddbPointer = cddb; - *cdsbPointer = cdsb; - *cdrainPointer = MAX(DrainCurrent,0.0); - *vonPointer = Von; - *vdsatPointer = VdsSat; - -} - diff --git a/src/spicelib/devices/bsim1/b1getic.c b/src/spicelib/devices/bsim1/b1getic.c deleted file mode 100644 index 0c27248f9..000000000 --- a/src/spicelib/devices/bsim1/b1getic.c +++ /dev/null @@ -1,47 +0,0 @@ -/********** -Copyright 1990 Regents of the University of California. All rights reserved. -Author: 1985 Hong J. Park, Thomas L. Quarles -**********/ -/* - */ - -#include "ngspice/ngspice.h" -#include "ngspice/cktdefs.h" -#include "bsim1def.h" -#include "ngspice/sperror.h" -#include "ngspice/suffix.h" - - -int -B1getic(GENmodel *inModel, CKTcircuit *ckt) -{ - - B1model *model = (B1model*)inModel; - B1instance *here; - /* - * grab initial conditions out of rhs array. User specified, so use - * external nodes to get values - */ - - for( ; model ; model = B1nextModel(model)) { - for(here = B1instances(model); here ; here = B1nextInstance(here)) { - - if(!here->B1icVBSGiven) { - here->B1icVBS = - *(ckt->CKTrhs + here->B1bNode) - - *(ckt->CKTrhs + here->B1sNode); - } - if(!here->B1icVDSGiven) { - here->B1icVDS = - *(ckt->CKTrhs + here->B1dNode) - - *(ckt->CKTrhs + here->B1sNode); - } - if(!here->B1icVGSGiven) { - here->B1icVGS = - *(ckt->CKTrhs + here->B1gNode) - - *(ckt->CKTrhs + here->B1sNode); - } - } - } - return(OK); -} diff --git a/src/spicelib/devices/bsim1/b1ld.c b/src/spicelib/devices/bsim1/b1ld.c deleted file mode 100644 index bc8633b6c..000000000 --- a/src/spicelib/devices/bsim1/b1ld.c +++ /dev/null @@ -1,729 +0,0 @@ -/********** -Copyright 1990 Regents of the University of California. All rights reserved. -Author: 1985 Hong J. Park, Thomas L. Quarles -**********/ - -#include "ngspice/ngspice.h" -#include "ngspice/cktdefs.h" -#include "bsim1def.h" -#include "ngspice/trandefs.h" -#include "ngspice/const.h" -#include "ngspice/sperror.h" -#include "ngspice/devdefs.h" -#include "ngspice/suffix.h" - -int -B1load(GENmodel *inModel, CKTcircuit *ckt) - - /* actually load the current value into the - * sparse matrix previously provided - */ -{ - B1model *model = (B1model*)inModel; - B1instance *here; - double DrainSatCurrent = 0.0; - double EffectiveLength = 0.0; - double GateBulkOverlapCap = 0.0; - double GateDrainOverlapCap = 0.0; - double GateSourceOverlapCap = 0.0; - double SourceSatCurrent = 0.0; - double DrainArea = 0.0; - double SourceArea = 0.0; - double DrainPerimeter = 0.0; - double SourcePerimeter = 0.0; - double arg = 0.0; - double capbd = 0.0; - double capbs = 0.0; - double cbd = 0.0; - double cbhat = 0.0; - double cbs = 0.0; - double cd = 0.0; - double cdrain = 0.0; - double cdhat = 0.0; - double cdreq = 0.0; - double ceq = 0.0; - double ceqbd = 0.0; - double ceqbs = 0.0; - double ceqqb = 0.0; - double ceqqd = 0.0; - double ceqqg = 0.0; - double czbd = 0.0; - double czbdsw = 0.0; - double czbs = 0.0; - double czbssw = 0.0; - double delvbd = 0.0; - double delvbs = 0.0; - double delvds = 0.0; - double delvgd = 0.0; - double delvgs = 0.0; - double evbd = 0.0; - double evbs = 0.0; - double gbd = 0.0; - double gbs = 0.0; - double gcbdb = 0.0; - double gcbgb = 0.0; - double gcbsb = 0.0; - double gcddb = 0.0; - double gcdgb = 0.0; - double gcdsb = 0.0; - double gcgdb = 0.0; - double gcggb = 0.0; - double gcgsb = 0.0; - double gcsdb = 0.0; - double gcsgb = 0.0; - double gcssb = 0.0; - double gds = 0.0; - double geq = 0.0; - double gm = 0.0; - double gmbs = 0.0; - double sarg = 0.0; - double sargsw = 0.0; - double vbd = 0.0; - double vbs = 0.0; - double vcrit = 0.0; - double vds = 0.0; - double vdsat = 0.0; - double vgb = 0.0; - double vgd = 0.0; - double vgdo = 0.0; - double vgs = 0.0; - double von = 0.0; -#ifndef PREDICTOR - double xfact = 0.0; -#endif - double xnrm = 0.0; - double xrev = 0.0; - int Check = 0; - double cgdb = 0.0; - double cgsb = 0.0; - double cbdb = 0.0; - double cdgb = 0.0; - double cddb = 0.0; - double cdsb = 0.0; - double cggb = 0.0; - double cbgb = 0.0; - double cbsb = 0.0; - double csgb = 0.0; - double cssb = 0.0; - double csdb = 0.0; - double PhiB = 0.0; - double PhiBSW = 0.0; - double MJ = 0.0; - double MJSW = 0.0; - double argsw = 0.0; - double qgate = 0.0; - double qbulk = 0.0; - double qdrn = 0.0; - double qsrc = 0.0; - double cqgate = 0.0; - double cqbulk = 0.0; - double cqdrn = 0.0; - double vt0 = 0.0; - double args[8]; - int ByPass = 0; -#ifndef NOBYPASS - double tempv = 0.0; -#endif /*NOBYPASS*/ - int error = 0; - - double m; /* parallel multiplier */ - - /* loop through all the B1 device models */ - for( ; model != NULL; model = B1nextModel(model)) { - - /* loop through all the instances of the model */ - for (here = B1instances(model); here != NULL ; - here=B1nextInstance(here)) { - - EffectiveLength=here->B1l - model->B1deltaL * 1.e-6;/* m */ - DrainArea = here->B1drainArea; - SourceArea = here->B1sourceArea; - DrainPerimeter = here->B1drainPerimeter; - SourcePerimeter = here->B1sourcePerimeter; - if( (DrainSatCurrent=DrainArea*model->B1jctSatCurDensity) - < 1e-15){ - DrainSatCurrent = 1.0e-15; - } - if( (SourceSatCurrent=SourceArea*model->B1jctSatCurDensity) - <1.0e-15){ - SourceSatCurrent = 1.0e-15; - } - GateSourceOverlapCap = model->B1gateSourceOverlapCap *here->B1w; - GateDrainOverlapCap = model->B1gateDrainOverlapCap * here->B1w; - GateBulkOverlapCap = model->B1gateBulkOverlapCap *EffectiveLength; - von = model->B1type * here->B1von; - vdsat = model->B1type * here->B1vdsat; - vt0 = model->B1type * here->B1vt0; - - Check=1; - ByPass = 0; - if((ckt->CKTmode & MODEINITSMSIG)) { - vbs= *(ckt->CKTstate0 + here->B1vbs); - vgs= *(ckt->CKTstate0 + here->B1vgs); - vds= *(ckt->CKTstate0 + here->B1vds); - } else if ((ckt->CKTmode & MODEINITTRAN)) { - vbs= *(ckt->CKTstate1 + here->B1vbs); - vgs= *(ckt->CKTstate1 + here->B1vgs); - vds= *(ckt->CKTstate1 + here->B1vds); - } else if((ckt->CKTmode & MODEINITJCT) && !here->B1off) { - vds= model->B1type * here->B1icVDS; - vgs= model->B1type * here->B1icVGS; - vbs= model->B1type * here->B1icVBS; - if((vds==0) && (vgs==0) && (vbs==0) && - ((ckt->CKTmode & - (MODETRAN|MODEAC|MODEDCOP|MODEDCTRANCURVE)) || - (!(ckt->CKTmode & MODEUIC)))) { - vbs = -1; - vgs = vt0; - vds = 0; - } - } else if((ckt->CKTmode & (MODEINITJCT | MODEINITFIX) ) && - (here->B1off)) { - vbs=vgs=vds=0; - } else { -#ifndef PREDICTOR - if((ckt->CKTmode & MODEINITPRED)) { - xfact=ckt->CKTdelta/ckt->CKTdeltaOld[1]; - *(ckt->CKTstate0 + here->B1vbs) = - *(ckt->CKTstate1 + here->B1vbs); - vbs = (1+xfact)* (*(ckt->CKTstate1 + here->B1vbs)) - -(xfact * (*(ckt->CKTstate2 + here->B1vbs))); - *(ckt->CKTstate0 + here->B1vgs) = - *(ckt->CKTstate1 + here->B1vgs); - vgs = (1+xfact)* (*(ckt->CKTstate1 + here->B1vgs)) - -(xfact * (*(ckt->CKTstate2 + here->B1vgs))); - *(ckt->CKTstate0 + here->B1vds) = - *(ckt->CKTstate1 + here->B1vds); - vds = (1+xfact)* (*(ckt->CKTstate1 + here->B1vds)) - -(xfact * (*(ckt->CKTstate2 + here->B1vds))); - *(ckt->CKTstate0 + here->B1vbd) = - *(ckt->CKTstate0 + here->B1vbs)- - *(ckt->CKTstate0 + here->B1vds); - *(ckt->CKTstate0 + here->B1cd) = - *(ckt->CKTstate1 + here->B1cd); - *(ckt->CKTstate0 + here->B1cbs) = - *(ckt->CKTstate1 + here->B1cbs); - *(ckt->CKTstate0 + here->B1cbd) = - *(ckt->CKTstate1 + here->B1cbd); - *(ckt->CKTstate0 + here->B1gm) = - *(ckt->CKTstate1 + here->B1gm); - *(ckt->CKTstate0 + here->B1gds) = - *(ckt->CKTstate1 + here->B1gds); - *(ckt->CKTstate0 + here->B1gmbs) = - *(ckt->CKTstate1 + here->B1gmbs); - *(ckt->CKTstate0 + here->B1gbd) = - *(ckt->CKTstate1 + here->B1gbd); - *(ckt->CKTstate0 + here->B1gbs) = - *(ckt->CKTstate1 + here->B1gbs); - *(ckt->CKTstate0 + here->B1cggb) = - *(ckt->CKTstate1 + here->B1cggb); - *(ckt->CKTstate0 + here->B1cbgb) = - *(ckt->CKTstate1 + here->B1cbgb); - *(ckt->CKTstate0 + here->B1cbsb) = - *(ckt->CKTstate1 + here->B1cbsb); - *(ckt->CKTstate0 + here->B1cgdb) = - *(ckt->CKTstate1 + here->B1cgdb); - *(ckt->CKTstate0 + here->B1cgsb) = - *(ckt->CKTstate1 + here->B1cgsb); - *(ckt->CKTstate0 + here->B1cbdb) = - *(ckt->CKTstate1 + here->B1cbdb); - *(ckt->CKTstate0 + here->B1cdgb) = - *(ckt->CKTstate1 + here->B1cdgb); - *(ckt->CKTstate0 + here->B1cddb) = - *(ckt->CKTstate1 + here->B1cddb); - *(ckt->CKTstate0 + here->B1cdsb) = - *(ckt->CKTstate1 + here->B1cdsb); - } else { -#endif /* PREDICTOR */ - vbs = model->B1type * ( - *(ckt->CKTrhsOld+here->B1bNode) - - *(ckt->CKTrhsOld+here->B1sNodePrime)); - vgs = model->B1type * ( - *(ckt->CKTrhsOld+here->B1gNode) - - *(ckt->CKTrhsOld+here->B1sNodePrime)); - vds = model->B1type * ( - *(ckt->CKTrhsOld+here->B1dNodePrime) - - *(ckt->CKTrhsOld+here->B1sNodePrime)); -#ifndef PREDICTOR - } -#endif /* PREDICTOR */ - vbd=vbs-vds; - vgd=vgs-vds; - vgdo = *(ckt->CKTstate0 + here->B1vgs) - - *(ckt->CKTstate0 + here->B1vds); - delvbs = vbs - *(ckt->CKTstate0 + here->B1vbs); - delvbd = vbd - *(ckt->CKTstate0 + here->B1vbd); - delvgs = vgs - *(ckt->CKTstate0 + here->B1vgs); - delvds = vds - *(ckt->CKTstate0 + here->B1vds); - delvgd = vgd-vgdo; - - if (here->B1mode >= 0) { - cdhat= - *(ckt->CKTstate0 + here->B1cd) - - *(ckt->CKTstate0 + here->B1gbd) * delvbd + - *(ckt->CKTstate0 + here->B1gmbs) * delvbs + - *(ckt->CKTstate0 + here->B1gm) * delvgs + - *(ckt->CKTstate0 + here->B1gds) * delvds ; - } else { - cdhat= - *(ckt->CKTstate0 + here->B1cd) - - ( *(ckt->CKTstate0 + here->B1gbd) - - *(ckt->CKTstate0 + here->B1gmbs)) * delvbd - - *(ckt->CKTstate0 + here->B1gm) * delvgd + - *(ckt->CKTstate0 + here->B1gds) * delvds; - } - cbhat= - *(ckt->CKTstate0 + here->B1cbs) + - *(ckt->CKTstate0 + here->B1cbd) + - *(ckt->CKTstate0 + here->B1gbd) * delvbd + - *(ckt->CKTstate0 + here->B1gbs) * delvbs ; - -#ifndef NOBYPASS - /* now lets see if we can bypass (ugh) */ - - /* following should be one big if connected by && all over - * the place, but some C compilers can't handle that, so - * we split it up here to let them digest it in stages - */ - tempv = MAX(fabs(cbhat),fabs(*(ckt->CKTstate0 + here->B1cbs) - + *(ckt->CKTstate0 + here->B1cbd)))+ckt->CKTabstol; - if((!(ckt->CKTmode & MODEINITPRED)) && (ckt->CKTbypass) ) - if( (fabs(delvbs) < (ckt->CKTreltol * MAX(fabs(vbs), - fabs(*(ckt->CKTstate0+here->B1vbs)))+ - ckt->CKTvoltTol)) ) - if ( (fabs(delvbd) < (ckt->CKTreltol * MAX(fabs(vbd), - fabs(*(ckt->CKTstate0+here->B1vbd)))+ - ckt->CKTvoltTol)) ) - if( (fabs(delvgs) < (ckt->CKTreltol * MAX(fabs(vgs), - fabs(*(ckt->CKTstate0+here->B1vgs)))+ - ckt->CKTvoltTol))) - if ( (fabs(delvds) < (ckt->CKTreltol * MAX(fabs(vds), - fabs(*(ckt->CKTstate0+here->B1vds)))+ - ckt->CKTvoltTol)) ) - if( (fabs(cdhat- *(ckt->CKTstate0 + here->B1cd)) < - ckt->CKTreltol * MAX(fabs(cdhat),fabs(*(ckt->CKTstate0 + - here->B1cd))) + ckt->CKTabstol) ) - if ( (fabs(cbhat-(*(ckt->CKTstate0 + here->B1cbs) + - *(ckt->CKTstate0 + here->B1cbd))) < ckt->CKTreltol * - tempv)) { - /* bypass code */ - vbs = *(ckt->CKTstate0 + here->B1vbs); - vbd = *(ckt->CKTstate0 + here->B1vbd); - vgs = *(ckt->CKTstate0 + here->B1vgs); - vds = *(ckt->CKTstate0 + here->B1vds); - vgd = vgs - vds; - vgb = vgs - vbs; - cd = *(ckt->CKTstate0 + here->B1cd); - cbs = *(ckt->CKTstate0 + here->B1cbs); - cbd = *(ckt->CKTstate0 + here->B1cbd); - cdrain = here->B1mode * (cd + cbd); - gm = *(ckt->CKTstate0 + here->B1gm); - gds = *(ckt->CKTstate0 + here->B1gds); - gmbs = *(ckt->CKTstate0 + here->B1gmbs); - gbd = *(ckt->CKTstate0 + here->B1gbd); - gbs = *(ckt->CKTstate0 + here->B1gbs); - if((ckt->CKTmode & (MODETRAN | MODEAC)) || - ((ckt->CKTmode & MODETRANOP) && - (ckt->CKTmode & MODEUIC))) { - cggb = *(ckt->CKTstate0 + here->B1cggb); - cgdb = *(ckt->CKTstate0 + here->B1cgdb); - cgsb = *(ckt->CKTstate0 + here->B1cgsb); - cbgb = *(ckt->CKTstate0 + here->B1cbgb); - cbdb = *(ckt->CKTstate0 + here->B1cbdb); - cbsb = *(ckt->CKTstate0 + here->B1cbsb); - cdgb = *(ckt->CKTstate0 + here->B1cdgb); - cddb = *(ckt->CKTstate0 + here->B1cddb); - cdsb = *(ckt->CKTstate0 + here->B1cdsb); - capbs = *(ckt->CKTstate0 + here->B1capbs); - capbd = *(ckt->CKTstate0 + here->B1capbd); - ByPass = 1; - goto line755; - } else { - goto line850; - } - } -#endif /*NOBYPASS*/ - - von = model->B1type * here->B1von; - if(*(ckt->CKTstate0 + here->B1vds) >=0) { - vgs = DEVfetlim(vgs,*(ckt->CKTstate0 + here->B1vgs) - ,von); - vds = vgs - vgd; - vds = DEVlimvds(vds,*(ckt->CKTstate0 + here->B1vds)); - vgd = vgs - vds; - } else { - vgd = DEVfetlim(vgd,vgdo,von); - vds = vgs - vgd; - vds = -DEVlimvds(-vds,-(*(ckt->CKTstate0 + here->B1vds))); - vgs = vgd + vds; - } - if(vds >= 0) { - vcrit =CONSTvt0*log(CONSTvt0/(CONSTroot2*SourceSatCurrent)); - vbs = DEVpnjlim(vbs,*(ckt->CKTstate0 + here->B1vbs), - CONSTvt0,vcrit,&Check); /* B1 test */ - vbd = vbs-vds; - } else { - vcrit = CONSTvt0*log(CONSTvt0/(CONSTroot2*DrainSatCurrent)); - vbd = DEVpnjlim(vbd,*(ckt->CKTstate0 + here->B1vbd), - CONSTvt0,vcrit,&Check); /* B1 test*/ - vbs = vbd + vds; - } - } - - /* determine DC current and derivatives */ - vbd = vbs - vds; - vgd = vgs - vds; - vgb = vgs - vbs; - - - if(vbs <= 0.0 ) { - gbs = SourceSatCurrent / CONSTvt0 + ckt->CKTgmin; - cbs = gbs * vbs ; - } else { - evbs = exp(vbs/CONSTvt0); - gbs = SourceSatCurrent*evbs/CONSTvt0 + ckt->CKTgmin; - cbs = SourceSatCurrent * (evbs-1) + ckt->CKTgmin * vbs ; - } - if(vbd <= 0.0) { - gbd = DrainSatCurrent / CONSTvt0 + ckt->CKTgmin; - cbd = gbd * vbd ; - } else { - evbd = exp(vbd/CONSTvt0); - gbd = DrainSatCurrent*evbd/CONSTvt0 +ckt->CKTgmin; - cbd = DrainSatCurrent *(evbd-1)+ckt->CKTgmin*vbd; - } - /* line 400 */ - if(vds >= 0) { - /* normal mode */ - here->B1mode = 1; - } else { - /* inverse mode */ - here->B1mode = -1; - } - /* call B1evaluate to calculate drain current and its - * derivatives and charge and capacitances related to gate - * drain, and bulk - */ - if( vds >= 0 ) { - B1evaluate(vds,vbs,vgs,here,model,&gm,&gds,&gmbs,&qgate, - &qbulk,&qdrn,&cggb,&cgdb,&cgsb,&cbgb,&cbdb,&cbsb,&cdgb, - &cddb,&cdsb,&cdrain,&von,&vdsat,ckt); - } else { - B1evaluate(-vds,vbd,vgd,here,model,&gm,&gds,&gmbs,&qgate, - &qbulk,&qsrc,&cggb,&cgsb,&cgdb,&cbgb,&cbsb,&cbdb,&csgb, - &cssb,&csdb,&cdrain,&von,&vdsat,ckt); - } - - here->B1von = model->B1type * von; - here->B1vdsat = model->B1type * vdsat; - - - - /* - * COMPUTE EQUIVALENT DRAIN CURRENT SOURCE - */ - cd=here->B1mode * cdrain - cbd; - if ((ckt->CKTmode & (MODETRAN | MODEAC | MODEINITSMSIG)) || - ((ckt->CKTmode & MODETRANOP ) && - (ckt->CKTmode & MODEUIC))) { - /* - * charge storage elements - * - * bulk-drain and bulk-source depletion capacitances - * czbd : zero bias drain junction capacitance - * czbs : zero bias source junction capacitance - * czbdsw:zero bias drain junction sidewall capacitance - * czbssw:zero bias source junction sidewall capacitance - */ - - czbd = model->B1unitAreaJctCap * DrainArea; - czbs = model->B1unitAreaJctCap * SourceArea; - czbdsw= model->B1unitLengthSidewallJctCap * DrainPerimeter; - czbssw= model->B1unitLengthSidewallJctCap * SourcePerimeter; - PhiB = model->B1bulkJctPotential; - PhiBSW = model->B1sidewallJctPotential; - MJ = model->B1bulkJctBotGradingCoeff; - MJSW = model->B1bulkJctSideGradingCoeff; - - /* Source Bulk Junction */ - if( vbs < 0 ) { - arg = 1 - vbs / PhiB; - argsw = 1 - vbs / PhiBSW; - sarg = exp(-MJ*log(arg)); - sargsw = exp(-MJSW*log(argsw)); - *(ckt->CKTstate0 + here->B1qbs) = - PhiB * czbs * (1-arg*sarg)/(1-MJ) + PhiBSW * - czbssw * (1-argsw*sargsw)/(1-MJSW); - capbs = czbs * sarg + czbssw * sargsw ; - } else { - *(ckt->CKTstate0+here->B1qbs) = - vbs*(czbs+czbssw)+ vbs*vbs*(czbs*MJ*0.5/PhiB - + czbssw * MJSW * 0.5/PhiBSW); - capbs = czbs + czbssw + vbs *(czbs*MJ/PhiB+ - czbssw * MJSW / PhiBSW ); - } - - /* Drain Bulk Junction */ - if( vbd < 0 ) { - arg = 1 - vbd / PhiB; - argsw = 1 - vbd / PhiBSW; - sarg = exp(-MJ*log(arg)); - sargsw = exp(-MJSW*log(argsw)); - *(ckt->CKTstate0 + here->B1qbd) = - PhiB * czbd * (1-arg*sarg)/(1-MJ) + PhiBSW * - czbdsw * (1-argsw*sargsw)/(1-MJSW); - capbd = czbd * sarg + czbdsw * sargsw ; - } else { - *(ckt->CKTstate0+here->B1qbd) = - vbd*(czbd+czbdsw)+ vbd*vbd*(czbd*MJ*0.5/PhiB - + czbdsw * MJSW * 0.5/PhiBSW); - capbd = czbd + czbdsw + vbd *(czbd*MJ/PhiB+ - czbdsw * MJSW / PhiBSW ); - } - - } - - - - - /* - * check convergence - */ - if ( (here->B1off == 0) || (!(ckt->CKTmode & MODEINITFIX)) ){ - if (Check == 1) { - ckt->CKTnoncon++; - ckt->CKTtroubleElt = (GENinstance *) here; - } - } - *(ckt->CKTstate0 + here->B1vbs) = vbs; - *(ckt->CKTstate0 + here->B1vbd) = vbd; - *(ckt->CKTstate0 + here->B1vgs) = vgs; - *(ckt->CKTstate0 + here->B1vds) = vds; - *(ckt->CKTstate0 + here->B1cd) = cd; - *(ckt->CKTstate0 + here->B1cbs) = cbs; - *(ckt->CKTstate0 + here->B1cbd) = cbd; - *(ckt->CKTstate0 + here->B1gm) = gm; - *(ckt->CKTstate0 + here->B1gds) = gds; - *(ckt->CKTstate0 + here->B1gmbs) = gmbs; - *(ckt->CKTstate0 + here->B1gbd) = gbd; - *(ckt->CKTstate0 + here->B1gbs) = gbs; - - *(ckt->CKTstate0 + here->B1cggb) = cggb; - *(ckt->CKTstate0 + here->B1cgdb) = cgdb; - *(ckt->CKTstate0 + here->B1cgsb) = cgsb; - - *(ckt->CKTstate0 + here->B1cbgb) = cbgb; - *(ckt->CKTstate0 + here->B1cbdb) = cbdb; - *(ckt->CKTstate0 + here->B1cbsb) = cbsb; - - *(ckt->CKTstate0 + here->B1cdgb) = cdgb; - *(ckt->CKTstate0 + here->B1cddb) = cddb; - *(ckt->CKTstate0 + here->B1cdsb) = cdsb; - - *(ckt->CKTstate0 + here->B1capbs) = capbs; - *(ckt->CKTstate0 + here->B1capbd) = capbd; - - /* bulk and channel charge plus overlaps */ - - if((!(ckt->CKTmode & (MODETRAN | MODEAC))) && - ((!(ckt->CKTmode & MODETRANOP)) || - (!(ckt->CKTmode & MODEUIC))) && (!(ckt->CKTmode - & MODEINITSMSIG))) goto line850; -#ifndef NOBYPASS -line755: -#endif - if( here->B1mode > 0 ) { - - args[0] = GateDrainOverlapCap; - args[1] = GateSourceOverlapCap; - args[2] = GateBulkOverlapCap; - args[3] = capbd; - args[4] = capbs; - args[5] = cggb; - args[6] = cgdb; - args[7] = cgsb; - - B1mosCap(ckt,vgd,vgs,vgb, - args, - /* - GateDrainOverlapCap, - GateSourceOverlapCap,GateBulkOverlapCap, - capbd,capbs, - cggb,cgdb,cgsb, - */ - cbgb,cbdb,cbsb, - cdgb,cddb,cdsb, - &gcggb,&gcgdb,&gcgsb, - &gcbgb,&gcbdb,&gcbsb, - &gcdgb,&gcddb,&gcdsb,&gcsgb,&gcsdb,&gcssb, - &qgate,&qbulk, - &qdrn,&qsrc); - } else { - - args[0] = GateSourceOverlapCap; - args[1] = GateDrainOverlapCap; - args[2] = GateBulkOverlapCap; - args[3] = capbs; - args[4] = capbd; - args[5] = cggb; - args[6] = cgsb; - args[7] = cgdb; - - B1mosCap(ckt,vgs,vgd,vgb, - args, - /* - GateSourceOverlapCap, - GateDrainOverlapCap,GateBulkOverlapCap, - capbs,capbd, - cggb,cgsb,cgdb, - */ - cbgb,cbsb,cbdb, - csgb,cssb,csdb, - &gcggb,&gcgsb,&gcgdb, - &gcbgb,&gcbsb,&gcbdb, - &gcsgb,&gcssb,&gcsdb,&gcdgb,&gcdsb,&gcddb, - &qgate,&qbulk, - &qsrc,&qdrn); - } - - if(ByPass) goto line860; - *(ckt->CKTstate0 + here->B1qg) = qgate; - *(ckt->CKTstate0 + here->B1qd) = qdrn - - *(ckt->CKTstate0 + here->B1qbd); - *(ckt->CKTstate0 + here->B1qb) = qbulk + - *(ckt->CKTstate0 + here->B1qbd) + - *(ckt->CKTstate0 + here->B1qbs); - - /* store small signal parameters */ - if((!(ckt->CKTmode & (MODEAC | MODETRAN))) && - (ckt->CKTmode & MODETRANOP ) && (ckt->CKTmode & - MODEUIC )) goto line850; - if(ckt->CKTmode & MODEINITSMSIG ) { - *(ckt->CKTstate0+here->B1cggb) = cggb; - *(ckt->CKTstate0+here->B1cgdb) = cgdb; - *(ckt->CKTstate0+here->B1cgsb) = cgsb; - *(ckt->CKTstate0+here->B1cbgb) = cbgb; - *(ckt->CKTstate0+here->B1cbdb) = cbdb; - *(ckt->CKTstate0+here->B1cbsb) = cbsb; - *(ckt->CKTstate0+here->B1cdgb) = cdgb; - *(ckt->CKTstate0+here->B1cddb) = cddb; - *(ckt->CKTstate0+here->B1cdsb) = cdsb; - *(ckt->CKTstate0+here->B1capbd) = capbd; - *(ckt->CKTstate0+here->B1capbs) = capbs; - - goto line1000; - } - - if(ckt->CKTmode & MODEINITTRAN ) { - *(ckt->CKTstate1+here->B1qb) = - *(ckt->CKTstate0+here->B1qb) ; - *(ckt->CKTstate1+here->B1qg) = - *(ckt->CKTstate0+here->B1qg) ; - *(ckt->CKTstate1+here->B1qd) = - *(ckt->CKTstate0+here->B1qd) ; - } - - - error = NIintegrate(ckt,&geq,&ceq,0.0,here->B1qb); - if(error) return(error); - error = NIintegrate(ckt,&geq,&ceq,0.0,here->B1qg); - if(error) return(error); - error = NIintegrate(ckt,&geq,&ceq,0.0,here->B1qd); - if(error) return(error); - - goto line860; - -line850: - /* initialize to zero charge conductance and current */ - ceqqg = ceqqb = ceqqd = 0.0; - gcdgb = gcddb = gcdsb = 0.0; - gcsgb = gcsdb = gcssb = 0.0; - gcggb = gcgdb = gcgsb = 0.0; - gcbgb = gcbdb = gcbsb = 0.0; - goto line900; - -line860: - /* evaluate equivalent charge current */ - cqgate = *(ckt->CKTstate0 + here->B1iqg); - cqbulk = *(ckt->CKTstate0 + here->B1iqb); - cqdrn = *(ckt->CKTstate0 + here->B1iqd); - ceqqg = cqgate - gcggb * vgb + gcgdb * vbd + gcgsb * vbs; - ceqqb = cqbulk - gcbgb * vgb + gcbdb * vbd + gcbsb * vbs; - ceqqd = cqdrn - gcdgb * vgb + gcddb * vbd + gcdsb * vbs; - - if(ckt->CKTmode & MODEINITTRAN ) { - *(ckt->CKTstate1 + here->B1iqb) = - *(ckt->CKTstate0 + here->B1iqb); - *(ckt->CKTstate1 + here->B1iqg) = - *(ckt->CKTstate0 + here->B1iqg); - *(ckt->CKTstate1 + here->B1iqd) = - *(ckt->CKTstate0 + here->B1iqd); - } - - /* - * load current vector - */ -line900: - m = here->B1m; - - ceqbs = model->B1type * (cbs-(gbs-ckt->CKTgmin)*vbs); - ceqbd = model->B1type * (cbd-(gbd-ckt->CKTgmin)*vbd); - - ceqqg = model->B1type * ceqqg; - ceqqb = model->B1type * ceqqb; - ceqqd = model->B1type * ceqqd; - if (here->B1mode >= 0) { - xnrm=1; - xrev=0; - cdreq=model->B1type*(cdrain-gds*vds-gm*vgs-gmbs*vbs); - } else { - xnrm=0; - xrev=1; - cdreq = -(model->B1type)*(cdrain+gds*vds-gm*vgd-gmbs*vbd); - } - - *(ckt->CKTrhs + here->B1gNode) -= m * ceqqg; - *(ckt->CKTrhs + here->B1bNode) -= m * (ceqbs+ceqbd+ceqqb); - *(ckt->CKTrhs + here->B1dNodePrime) += - m * (ceqbd-cdreq-ceqqd); - *(ckt->CKTrhs + here->B1sNodePrime) += - m * (cdreq+ceqbs+ceqqg+ceqqb+ceqqd); - - /* - * load y matrix - */ - - *(here->B1DdPtr) += m * (here->B1drainConductance); - *(here->B1GgPtr) += m * (gcggb); - *(here->B1SsPtr) += m * (here->B1sourceConductance); - *(here->B1BbPtr) += m * (gbd+gbs-gcbgb-gcbdb-gcbsb); - *(here->B1DPdpPtr) += - m * (here->B1drainConductance+gds+gbd+xrev*(gm+gmbs)+gcddb); - *(here->B1SPspPtr) += - m * (here->B1sourceConductance+gds+gbs+xnrm*(gm+gmbs)+gcssb); - *(here->B1DdpPtr) += m * (-here->B1drainConductance); - *(here->B1GbPtr) += m * (-gcggb-gcgdb-gcgsb); - *(here->B1GdpPtr) += m * (gcgdb); - *(here->B1GspPtr) += m * (gcgsb); - *(here->B1SspPtr) += m * (-here->B1sourceConductance); - *(here->B1BgPtr) += m * (gcbgb); - *(here->B1BdpPtr) += m * (-gbd+gcbdb); - *(here->B1BspPtr) += m * (-gbs+gcbsb); - *(here->B1DPdPtr) += m * (-here->B1drainConductance); - *(here->B1DPgPtr) += m * ((xnrm-xrev)*gm+gcdgb); - *(here->B1DPbPtr) += m * (-gbd+(xnrm-xrev)*gmbs-gcdgb-gcddb-gcdsb); - *(here->B1DPspPtr) += m * (-gds-xnrm*(gm+gmbs)+gcdsb); - *(here->B1SPgPtr) += m * (-(xnrm-xrev)*gm+gcsgb); - *(here->B1SPsPtr) += m * (-here->B1sourceConductance); - *(here->B1SPbPtr) += m * (-gbs-(xnrm-xrev)*gmbs-gcsgb-gcsdb-gcssb); - *(here->B1SPdpPtr) += m * (-gds-xrev*(gm+gmbs)+gcsdb); - - -line1000: ; - - } /* End of Mosfet Instance */ - - } /* End of Model Instance */ - return(OK); -} - diff --git a/src/spicelib/devices/bsim1/b1mask.c b/src/spicelib/devices/bsim1/b1mask.c deleted file mode 100644 index f186468fc..000000000 --- a/src/spicelib/devices/bsim1/b1mask.c +++ /dev/null @@ -1,268 +0,0 @@ -/********** -Copyright 1990 Regents of the University of California. All rights reserved. -Author: 1988 Hong J. Park -**********/ -/* - */ - -#include "ngspice/ngspice.h" -#include "ngspice/ifsim.h" -#include "ngspice/cktdefs.h" -#include "ngspice/devdefs.h" -#include "bsim1def.h" -#include "ngspice/sperror.h" -#include "ngspice/suffix.h" - - -/*ARGSUSED*/ -int -B1mAsk(CKTcircuit *ckt, GENmodel *inst, int which, IFvalue *value) -{ - B1model *model = (B1model *)inst; - - NG_IGNORE(ckt); - - switch(which) { - case BSIM1_MOD_VFB0: - value->rValue = model->B1vfb0; - return(OK); - case BSIM1_MOD_VFBL: - value->rValue = model->B1vfbL; - return(OK); - case BSIM1_MOD_VFBW: - value->rValue = model->B1vfbW; - return(OK); - case BSIM1_MOD_PHI0: - value->rValue = model->B1phi0; - return(OK); - case BSIM1_MOD_PHIL: - value->rValue = model->B1phiL; - return(OK); - case BSIM1_MOD_PHIW: - value->rValue = model->B1phiW; - return(OK); - case BSIM1_MOD_K10: - value->rValue = model->B1K10; - return(OK); - case BSIM1_MOD_K1L: - value->rValue = model->B1K1L; - return(OK); - case BSIM1_MOD_K1W: - value->rValue = model->B1K1W; - return(OK); - case BSIM1_MOD_K20: - value->rValue = model->B1K20; - return(OK); - case BSIM1_MOD_K2L: - value->rValue = model->B1K2L; - return(OK); - case BSIM1_MOD_K2W: - value->rValue = model->B1K2W; - return(OK); - case BSIM1_MOD_ETA0: - value->rValue = model->B1eta0; - return(OK); - case BSIM1_MOD_ETAL: - value->rValue = model->B1etaL; - return(OK); - case BSIM1_MOD_ETAW: - value->rValue = model->B1etaW; - return(OK); - case BSIM1_MOD_ETAB0: - value->rValue = model->B1etaB0; - return(OK); - case BSIM1_MOD_ETABL: - value->rValue = model->B1etaBl; - return(OK); - case BSIM1_MOD_ETABW: - value->rValue = model->B1etaBw; - return(OK); - case BSIM1_MOD_ETAD0: - value->rValue = model->B1etaD0; - return(OK); - case BSIM1_MOD_ETADL: - value->rValue = model->B1etaDl; - return(OK); - case BSIM1_MOD_ETADW: - value->rValue = model->B1etaDw; - return(OK); - case BSIM1_MOD_DELTAL: - value->rValue = model->B1deltaL; - return(OK); - case BSIM1_MOD_DELTAW: - value->rValue = model->B1deltaW; - return(OK); - case BSIM1_MOD_MOBZERO: - value->rValue = model->B1mobZero; - return(OK); - case BSIM1_MOD_MOBZEROB0: - value->rValue = model->B1mobZeroB0; - return(OK); - case BSIM1_MOD_MOBZEROBL: - value->rValue = model->B1mobZeroBl; - return(OK); - case BSIM1_MOD_MOBZEROBW: - value->rValue = model->B1mobZeroBw; - return(OK); - case BSIM1_MOD_MOBVDD0: - value->rValue = model->B1mobVdd0; - return(OK); - case BSIM1_MOD_MOBVDDL: - value->rValue = model->B1mobVddl; - return(OK); - case BSIM1_MOD_MOBVDDW: - value->rValue = model->B1mobVddw; - return(OK); - case BSIM1_MOD_MOBVDDB0: - value->rValue = model->B1mobVddB0; - return(OK); - case BSIM1_MOD_MOBVDDBL: - value->rValue = model->B1mobVddBl; - return(OK); - case BSIM1_MOD_MOBVDDBW: - value->rValue = model->B1mobVddBw; - return(OK); - case BSIM1_MOD_MOBVDDD0: - value->rValue = model->B1mobVddD0; - return(OK); - case BSIM1_MOD_MOBVDDDL: - value->rValue = model->B1mobVddDl; - return(OK); - case BSIM1_MOD_MOBVDDDW: - value->rValue = model->B1mobVddDw; - return(OK); - case BSIM1_MOD_UGS0: - value->rValue = model->B1ugs0; - return(OK); - case BSIM1_MOD_UGSL: - value->rValue = model->B1ugsL; - return(OK); - case BSIM1_MOD_UGSW: - value->rValue = model->B1ugsW; - return(OK); - case BSIM1_MOD_UGSB0: - value->rValue = model->B1ugsB0; - return(OK); - case BSIM1_MOD_UGSBL: - value->rValue = model->B1ugsBL; - return(OK); - case BSIM1_MOD_UGSBW: - value->rValue = model->B1ugsBW; - return(OK); - case BSIM1_MOD_UDS0: - value->rValue = model->B1uds0; - return(OK); - case BSIM1_MOD_UDSL: - value->rValue = model->B1udsL; - return(OK); - case BSIM1_MOD_UDSW: - value->rValue = model->B1udsW; - return(OK); - case BSIM1_MOD_UDSB0: - value->rValue = model->B1udsB0; - return(OK); - case BSIM1_MOD_UDSBL: - value->rValue = model->B1udsBL; - return(OK); - case BSIM1_MOD_UDSBW: - value->rValue = model->B1udsBW; - return(OK); - case BSIM1_MOD_UDSD0: - value->rValue = model->B1udsD0; - return(OK); - case BSIM1_MOD_UDSDL: - value->rValue = model->B1udsDL; - return(OK); - case BSIM1_MOD_UDSDW: - value->rValue = model->B1udsDW; - return(OK); - case BSIM1_MOD_N00: - value->rValue = model->B1subthSlope0; - return(OK); - case BSIM1_MOD_N0L: - value->rValue = model->B1subthSlopeL; - return(OK); - case BSIM1_MOD_N0W: - value->rValue = model->B1subthSlopeW; - return(OK); - case BSIM1_MOD_NB0: - value->rValue = model->B1subthSlopeB0; - return(OK); - case BSIM1_MOD_NBL: - value->rValue = model->B1subthSlopeBL; - return(OK); - case BSIM1_MOD_NBW: - value->rValue = model->B1subthSlopeBW; - return(OK); - case BSIM1_MOD_ND0: - value->rValue = model->B1subthSlopeD0; - return(OK); - case BSIM1_MOD_NDL: - value->rValue = model->B1subthSlopeDL; - return(OK); - case BSIM1_MOD_NDW: - value->rValue = model->B1subthSlopeDW; - return(OK); - case BSIM1_MOD_TOX: - value->rValue = model->B1oxideThickness; - return(OK); - case BSIM1_MOD_TEMP: - value->rValue = model->B1temp; - return(OK); - case BSIM1_MOD_VDD: - value->rValue = model->B1vdd; - return(OK); - case BSIM1_MOD_CGSO: - value->rValue = model->B1gateSourceOverlapCap; - return(OK); - case BSIM1_MOD_CGDO: - value->rValue = model->B1gateDrainOverlapCap; - return(OK); - case BSIM1_MOD_CGBO: - value->rValue = model->B1gateBulkOverlapCap; - return(OK); - case BSIM1_MOD_XPART: - value->iValue = model->B1channelChargePartitionFlag; - return(OK); - case BSIM1_MOD_RSH: - value->rValue = model->B1sheetResistance; - return(OK); - case BSIM1_MOD_JS: - value->rValue = model->B1jctSatCurDensity; - return(OK); - case BSIM1_MOD_PB: - value->rValue = model->B1bulkJctPotential; - return(OK); - case BSIM1_MOD_MJ: - value->rValue = model->B1bulkJctBotGradingCoeff; - return(OK); - case BSIM1_MOD_PBSW: - value->rValue = model->B1sidewallJctPotential; - return(OK); - case BSIM1_MOD_MJSW: - value->rValue = model->B1bulkJctSideGradingCoeff; - return(OK); - case BSIM1_MOD_CJ: - value->rValue = model->B1unitAreaJctCap; - return(OK); - case BSIM1_MOD_CJSW: - value->rValue = model->B1unitLengthSidewallJctCap; - return(OK); - case BSIM1_MOD_DEFWIDTH: - value->rValue = model->B1defaultWidth; - return(OK); - case BSIM1_MOD_DELLENGTH: - value->rValue = model->B1deltaLength; - return(OK); - case BSIM1_MOD_AF: - value->rValue = model->B1fNexp; - return(OK); - case BSIM1_MOD_KF: - value->rValue = model->B1fNcoef; - return(OK); - default: - return(E_BADPARM); - } - /* NOTREACHED */ -} - diff --git a/src/spicelib/devices/bsim1/b1moscap.c b/src/spicelib/devices/bsim1/b1moscap.c deleted file mode 100644 index 93cedfbba..000000000 --- a/src/spicelib/devices/bsim1/b1moscap.c +++ /dev/null @@ -1,88 +0,0 @@ -/********** -Copyright 1990 Regents of the University of California. All rights reserved. -Author: 1985 Hong J. Park, Thomas L. Quarles -**********/ - -#include "ngspice/ngspice.h" -#include "ngspice/cktdefs.h" -#include "bsim1def.h" -#include "ngspice/suffix.h" - -/* routine to calculate equivalent conductance and total terminal - * charges - */ - -void -B1mosCap( - CKTcircuit *ckt, - double vgd, - double vgs, - double vgb, - double args[8], - /* - double GateDrainOverlapCap, - double GateSourceOverlapCap, - double GateBulkOverlapCap, - double capbd, - double capbs, - double cggb, - double cgdb, - double cgsb, - */ - double cbgb, - double cbdb, - double cbsb, - double cdgb, - double cddb, - double cdsb, - double *gcggbPointer, - double *gcgdbPointer, - double *gcgsbPointer, - double *gcbgbPointer, - double *gcbdbPointer, - double *gcbsbPointer, - double *gcdgbPointer, - double *gcddbPointer, - double *gcdsbPointer, - double *gcsgbPointer, - double *gcsdbPointer, - double *gcssbPointer, - double *qGatePointer, - double *qBulkPointer, - double *qDrainPointer, - double *qSourcePointer) -{ - double qgd; - double qgs; - double qgb; - double ag0; - - ag0 = ckt->CKTag[0]; - /* compute equivalent conductance */ - *gcdgbPointer = (cdgb - args[0]) * ag0; - *gcddbPointer = (cddb + args[3] + args[0]) * ag0; - *gcdsbPointer = cdsb * ag0; - *gcsgbPointer = -(args[5] + cbgb + cdgb + args[1]) * ag0; - *gcsdbPointer = -(args[6] + cbdb + cddb ) * ag0; - *gcssbPointer = (args[4] + args[1] - - (args[7] + cbsb + cdsb )) * ag0; - *gcggbPointer = (args[5] + args[0] + - args[1] + args[2] ) * ag0; - *gcgdbPointer = (args[6] - args[0]) * ag0; - *gcgsbPointer = (args[7] - args[1]) * ag0; - *gcbgbPointer = (cbgb - args[2]) * ag0; - *gcbdbPointer = (cbdb - args[3]) * ag0; - *gcbsbPointer = (cbsb - args[4]) * ag0; - - /* compute total terminal charge */ - qgd = args[0] * vgd; - qgs = args[1] * vgs; - qgb = args[2] * vgb; - *qGatePointer = *qGatePointer + qgd + qgs + qgb; - *qBulkPointer = *qBulkPointer - qgb; - *qDrainPointer = *qDrainPointer - qgd; - *qSourcePointer = -(*qGatePointer + *qBulkPointer + *qDrainPointer); - -} - - diff --git a/src/spicelib/devices/bsim1/b1mpar.c b/src/spicelib/devices/bsim1/b1mpar.c deleted file mode 100644 index e8a2ab8d9..000000000 --- a/src/spicelib/devices/bsim1/b1mpar.c +++ /dev/null @@ -1,354 +0,0 @@ -/********** -Copyright 1990 Regents of the University of California. All rights reserved. -Author: 1985 Hong J. Park, Thomas L. Quarles -**********/ -/* - */ - -#include "ngspice/ngspice.h" -#include "bsim1def.h" -#include "ngspice/ifsim.h" -#include "ngspice/sperror.h" -#include "ngspice/suffix.h" - - -int -B1mParam(int param, IFvalue *value, GENmodel *inMod) -{ - B1model *mod = (B1model*)inMod; - switch(param) { - case BSIM1_MOD_VFB0 : - mod->B1vfb0 = value->rValue; - mod->B1vfb0Given = TRUE; - break; - case BSIM1_MOD_VFBL : - mod->B1vfbL = value->rValue; - mod->B1vfbLGiven = TRUE; - break; - case BSIM1_MOD_VFBW : - mod->B1vfbW = value->rValue; - mod->B1vfbWGiven = TRUE; - break; - case BSIM1_MOD_PHI0 : - mod->B1phi0 = value->rValue; - mod->B1phi0Given = TRUE; - break; - case BSIM1_MOD_PHIL : - mod->B1phiL = value->rValue; - mod->B1phiLGiven = TRUE; - break; - case BSIM1_MOD_PHIW : - mod->B1phiW = value->rValue; - mod->B1phiWGiven = TRUE; - break; - case BSIM1_MOD_K10 : - mod->B1K10 = value->rValue; - mod->B1K10Given = TRUE; - break; - case BSIM1_MOD_K1L : - mod->B1K1L = value->rValue; - mod->B1K1LGiven = TRUE; - break; - case BSIM1_MOD_K1W : - mod->B1K1W = value->rValue; - mod->B1K1WGiven = TRUE; - break; - case BSIM1_MOD_K20 : - mod->B1K20 = value->rValue; - mod->B1K20Given = TRUE; - break; - case BSIM1_MOD_K2L : - mod->B1K2L = value->rValue; - mod->B1K2LGiven = TRUE; - break; - case BSIM1_MOD_K2W : - mod->B1K2W = value->rValue; - mod->B1K2WGiven = TRUE; - break; - case BSIM1_MOD_ETA0 : - mod->B1eta0 = value->rValue; - mod->B1eta0Given = TRUE; - break; - case BSIM1_MOD_ETAL : - mod->B1etaL = value->rValue; - mod->B1etaLGiven = TRUE; - break; - case BSIM1_MOD_ETAW : - mod->B1etaW = value->rValue; - mod->B1etaWGiven = TRUE; - break; - case BSIM1_MOD_ETAB0 : - mod->B1etaB0 = value->rValue; - mod->B1etaB0Given = TRUE; - break; - case BSIM1_MOD_ETABL : - mod->B1etaBl = value->rValue; - mod->B1etaBlGiven = TRUE; - break; - case BSIM1_MOD_ETABW : - mod->B1etaBw = value->rValue; - mod->B1etaBwGiven = TRUE; - break; - case BSIM1_MOD_ETAD0 : - mod->B1etaD0 = value->rValue; - mod->B1etaD0Given = TRUE; - break; - case BSIM1_MOD_ETADL : - mod->B1etaDl = value->rValue; - mod->B1etaDlGiven = TRUE; - break; - case BSIM1_MOD_ETADW : - mod->B1etaDw = value->rValue; - mod->B1etaDwGiven = TRUE; - break; - case BSIM1_MOD_DELTAL : - mod->B1deltaL = value->rValue; - mod->B1deltaLGiven = TRUE; - break; - case BSIM1_MOD_DELTAW : - mod->B1deltaW = value->rValue; - mod->B1deltaWGiven = TRUE; - break; - case BSIM1_MOD_MOBZERO : - mod->B1mobZero = value->rValue; - mod->B1mobZeroGiven = TRUE; - break; - case BSIM1_MOD_MOBZEROB0 : - mod->B1mobZeroB0 = value->rValue; - mod->B1mobZeroB0Given = TRUE; - break; - case BSIM1_MOD_MOBZEROBL : - mod->B1mobZeroBl = value->rValue; - mod->B1mobZeroBlGiven = TRUE; - break; - case BSIM1_MOD_MOBZEROBW : - mod->B1mobZeroBw = value->rValue; - mod->B1mobZeroBwGiven = TRUE; - break; - case BSIM1_MOD_MOBVDD0 : - mod->B1mobVdd0 = value->rValue; - mod->B1mobVdd0Given = TRUE; - break; - case BSIM1_MOD_MOBVDDL : - mod->B1mobVddl = value->rValue; - mod->B1mobVddlGiven = TRUE; - break; - case BSIM1_MOD_MOBVDDW : - mod->B1mobVddw = value->rValue; - mod->B1mobVddwGiven = TRUE; - break; - case BSIM1_MOD_MOBVDDB0 : - mod->B1mobVddB0 = value->rValue; - mod->B1mobVddB0Given = TRUE; - break; - case BSIM1_MOD_MOBVDDBL : - mod->B1mobVddBl = value->rValue; - mod->B1mobVddBlGiven = TRUE; - break; - case BSIM1_MOD_MOBVDDBW : - mod->B1mobVddBw = value->rValue; - mod->B1mobVddBwGiven = TRUE; - break; - case BSIM1_MOD_MOBVDDD0 : - mod->B1mobVddD0 = value->rValue; - mod->B1mobVddD0Given = TRUE; - break; - case BSIM1_MOD_MOBVDDDL : - mod->B1mobVddDl = value->rValue; - mod->B1mobVddDlGiven = TRUE; - break; - case BSIM1_MOD_MOBVDDDW : - mod->B1mobVddDw = value->rValue; - mod->B1mobVddDwGiven = TRUE; - break; - case BSIM1_MOD_UGS0 : - mod->B1ugs0 = value->rValue; - mod->B1ugs0Given = TRUE; - break; - case BSIM1_MOD_UGSL : - mod->B1ugsL = value->rValue; - mod->B1ugsLGiven = TRUE; - break; - case BSIM1_MOD_UGSW : - mod->B1ugsW = value->rValue; - mod->B1ugsWGiven = TRUE; - break; - case BSIM1_MOD_UGSB0 : - mod->B1ugsB0 = value->rValue; - mod->B1ugsB0Given = TRUE; - break; - case BSIM1_MOD_UGSBL : - mod->B1ugsBL = value->rValue; - mod->B1ugsBLGiven = TRUE; - break; - case BSIM1_MOD_UGSBW : - mod->B1ugsBW = value->rValue; - mod->B1ugsBWGiven = TRUE; - break; - case BSIM1_MOD_UDS0 : - mod->B1uds0 = value->rValue; - mod->B1uds0Given = TRUE; - break; - case BSIM1_MOD_UDSL : - mod->B1udsL = value->rValue; - mod->B1udsLGiven = TRUE; - break; - case BSIM1_MOD_UDSW : - mod->B1udsW = value->rValue; - mod->B1udsWGiven = TRUE; - break; - case BSIM1_MOD_UDSB0 : - mod->B1udsB0 = value->rValue; - mod->B1udsB0Given = TRUE; - break; - case BSIM1_MOD_UDSBL : - mod->B1udsBL = value->rValue; - mod->B1udsBLGiven = TRUE; - break; - case BSIM1_MOD_UDSBW : - mod->B1udsBW = value->rValue; - mod->B1udsBWGiven = TRUE; - break; - case BSIM1_MOD_UDSD0 : - mod->B1udsD0 = value->rValue; - mod->B1udsD0Given = TRUE; - break; - case BSIM1_MOD_UDSDL : - mod->B1udsDL = value->rValue; - mod->B1udsDLGiven = TRUE; - break; - case BSIM1_MOD_UDSDW : - mod->B1udsDW = value->rValue; - mod->B1udsDWGiven = TRUE; - break; - case BSIM1_MOD_N00 : - mod->B1subthSlope0 = value->rValue; - mod->B1subthSlope0Given = TRUE; - break; - case BSIM1_MOD_N0L : - mod->B1subthSlopeL = value->rValue; - mod->B1subthSlopeLGiven = TRUE; - break; - case BSIM1_MOD_N0W : - mod->B1subthSlopeW = value->rValue; - mod->B1subthSlopeWGiven = TRUE; - break; - case BSIM1_MOD_NB0 : - mod->B1subthSlopeB0 = value->rValue; - mod->B1subthSlopeB0Given = TRUE; - break; - case BSIM1_MOD_NBL : - mod->B1subthSlopeBL = value->rValue; - mod->B1subthSlopeBLGiven = TRUE; - break; - case BSIM1_MOD_NBW : - mod->B1subthSlopeBW = value->rValue; - mod->B1subthSlopeBWGiven = TRUE; - break; - case BSIM1_MOD_ND0 : - mod->B1subthSlopeD0 = value->rValue; - mod->B1subthSlopeD0Given = TRUE; - break; - case BSIM1_MOD_NDL : - mod->B1subthSlopeDL = value->rValue; - mod->B1subthSlopeDLGiven = TRUE; - break; - case BSIM1_MOD_NDW : - mod->B1subthSlopeDW = value->rValue; - mod->B1subthSlopeDWGiven = TRUE; - break; - case BSIM1_MOD_TOX : - mod->B1oxideThickness = value->rValue; - mod->B1oxideThicknessGiven = TRUE; - break; - case BSIM1_MOD_TEMP : - mod->B1temp = value->rValue; - mod->B1tempGiven = TRUE; - break; - case BSIM1_MOD_VDD : - mod->B1vdd = value->rValue; - mod->B1vddGiven = TRUE; - break; - case BSIM1_MOD_CGSO : - mod->B1gateSourceOverlapCap = value->rValue; - mod->B1gateSourceOverlapCapGiven = TRUE; - break; - case BSIM1_MOD_CGDO : - mod->B1gateDrainOverlapCap = value->rValue; - mod->B1gateDrainOverlapCapGiven = TRUE; - break; - case BSIM1_MOD_CGBO : - mod->B1gateBulkOverlapCap = value->rValue; - mod->B1gateBulkOverlapCapGiven = TRUE; - break; - case BSIM1_MOD_XPART : - mod->B1channelChargePartitionFlag = value->iValue ? 1 : 0; - mod->B1channelChargePartitionFlagGiven = TRUE; - break; - case BSIM1_MOD_RSH : - mod->B1sheetResistance = value->rValue; - mod->B1sheetResistanceGiven = TRUE; - break; - case BSIM1_MOD_JS : - mod->B1jctSatCurDensity = value->rValue; - mod->B1jctSatCurDensityGiven = TRUE; - break; - case BSIM1_MOD_PB : - mod->B1bulkJctPotential = value->rValue; - mod->B1bulkJctPotentialGiven = TRUE; - break; - case BSIM1_MOD_MJ : - mod->B1bulkJctBotGradingCoeff = value->rValue; - mod->B1bulkJctBotGradingCoeffGiven = TRUE; - break; - case BSIM1_MOD_PBSW : - mod->B1sidewallJctPotential = value->rValue; - mod->B1sidewallJctPotentialGiven = TRUE; - break; - case BSIM1_MOD_MJSW : - mod->B1bulkJctSideGradingCoeff = value->rValue; - mod->B1bulkJctSideGradingCoeffGiven = TRUE; - break; - case BSIM1_MOD_CJ : - mod->B1unitAreaJctCap = value->rValue; - mod->B1unitAreaJctCapGiven = TRUE; - break; - case BSIM1_MOD_CJSW : - mod->B1unitLengthSidewallJctCap = value->rValue; - mod->B1unitLengthSidewallJctCapGiven = TRUE; - break; - case BSIM1_MOD_DEFWIDTH : - mod->B1defaultWidth = value->rValue; - mod->B1defaultWidthGiven = TRUE; - break; - case BSIM1_MOD_DELLENGTH : - mod->B1deltaLength = value->rValue; - mod->B1deltaLengthGiven = TRUE; - break; - case BSIM1_MOD_AF : - mod->B1fNexp = value->rValue; - mod->B1fNexpGiven = TRUE; - break; - case BSIM1_MOD_KF : - mod->B1fNcoef = value->rValue; - mod->B1fNcoefGiven = TRUE; - break; - case BSIM1_MOD_NMOS : - if(value->iValue) { - mod->B1type = 1; - mod->B1typeGiven = TRUE; - } - break; - case BSIM1_MOD_PMOS : - if(value->iValue) { - mod->B1type = - 1; - mod->B1typeGiven = TRUE; - } - break; - default: - return(E_BADPARM); - } - return(OK); -} - - diff --git a/src/spicelib/devices/bsim1/b1noi.c b/src/spicelib/devices/bsim1/b1noi.c deleted file mode 100644 index fac5a6f6d..000000000 --- a/src/spicelib/devices/bsim1/b1noi.c +++ /dev/null @@ -1,179 +0,0 @@ -/********** -Copyright 2003 ??. All rights reserved. -Author: 2003 Paolo Nenzi -**********/ - -#include "ngspice/ngspice.h" -#include "bsim1def.h" -#include "ngspice/cktdefs.h" -#include "ngspice/iferrmsg.h" -#include "ngspice/noisedef.h" -#include "ngspice/suffix.h" - -/* - * B1noise (mode, operation, firstModel, ckt, data, OnDens) - * This routine names and evaluates all of the noise sources - * associated with MOSFET's. It starts with the model *firstModel and - * traverses all of its insts. It then proceeds to any other models - * on the linked list. The total output noise density generated by - * all of the MOSFET's is summed with the variable "OnDens". - */ - - -int -B1noise (int mode, int operation, GENmodel *genmodel, CKTcircuit *ckt, - Ndata *data, double *OnDens) -{ - NOISEAN *job = (NOISEAN *) ckt->CKTcurJob; - - B1model *firstModel = (B1model *) genmodel; - B1model *model; - B1instance *inst; - double tempOnoise; - double tempInoise; - double noizDens[B1NSRCS]; - double lnNdens[B1NSRCS]; - int i; - - /* define the names of the noise sources */ - - static char *B1nNames[B1NSRCS] = { /* Note that we have to keep the order */ - "_rd", /* noise due to rd */ /* consistent with thestrchr definitions */ - "_rs", /* noise due to rs */ /* in bsim1defs.h */ - "_id", /* noise due to id */ - "_1overf", /* flicker (1/f) noise */ - "" /* total transistor noise */ - }; - - for (model=firstModel; model != NULL; model=B1nextModel(model)) { - for (inst=B1instances(model); inst != NULL; inst=B1nextInstance(inst)) { - - switch (operation) { - - case N_OPEN: - - /* see if we have to to produce a summary report */ - /* if so, name all the noise generators */ - - if (job->NStpsSm != 0) { - switch (mode) { - - case N_DENS: - for (i=0; i < B1NSRCS; i++) { - NOISE_ADD_OUTVAR(ckt, data, "onoise_%s%s", inst->B1name, B1nNames[i]); - } - break; - - case INT_NOIZ: - for (i=0; i < B1NSRCS; i++) { - NOISE_ADD_OUTVAR(ckt, data, "onoise_total_%s%s", inst->B1name, B1nNames[i]); - NOISE_ADD_OUTVAR(ckt, data, "inoise_total_%s%s", inst->B1name, B1nNames[i]); - } - break; - } - } - break; - - case N_CALC: - switch (mode) { - - case N_DENS: - NevalSrc(&noizDens[B1RDNOIZ],&lnNdens[B1RDNOIZ], - ckt,THERMNOISE,inst->B1dNodePrime,inst->B1dNode, - inst->B1drainConductance * inst->B1m); - - NevalSrc(&noizDens[B1RSNOIZ],&lnNdens[B1RSNOIZ], - ckt,THERMNOISE,inst->B1sNodePrime,inst->B1sNode, - inst->B1sourceConductance * inst->B1m); - - NevalSrc(&noizDens[B1IDNOIZ],&lnNdens[B1IDNOIZ], - ckt,THERMNOISE,inst->B1dNodePrime,inst->B1sNodePrime, - (2.0/3.0 * fabs(inst->B1gm * inst->B1m))); - - NevalSrc(&noizDens[B1FLNOIZ], NULL, ckt, - N_GAIN,inst->B1dNodePrime, inst->B1sNodePrime, - (double)0.0); - noizDens[B1FLNOIZ] *= model->B1fNcoef * inst->B1m * - exp(model->B1fNexp * - log(MAX(fabs((double)inst->B1cd),N_MINLOG))) / - (data->freq * - (inst->B1w - model->B1deltaW * 1e-6) * - (inst->B1l - model->B1deltaL * 1e-6) * - model->B1Cox * model->B1Cox); - lnNdens[B1FLNOIZ] = - log(MAX(noizDens[B1FLNOIZ],N_MINLOG)); - - noizDens[B1TOTNOIZ] = noizDens[B1RDNOIZ] + - noizDens[B1RSNOIZ] + - noizDens[B1IDNOIZ] + - noizDens[B1FLNOIZ]; - lnNdens[B1TOTNOIZ] = - log(MAX(noizDens[B1TOTNOIZ], N_MINLOG)); - - *OnDens += noizDens[B1TOTNOIZ]; - - if (data->delFreq == 0.0) { - - /* if we haven't done any previous integration, we need to */ - /* initialize our "history" variables */ - - for (i=0; i < B1NSRCS; i++) { - inst->B1nVar[LNLSTDENS][i] = lnNdens[i]; - } - - /* clear out our integration variables if it's the first pass */ - - if (data->freq == job->NstartFreq) { - for (i=0; i < B1NSRCS; i++) { - inst->B1nVar[OUTNOIZ][i] = 0.0; - inst->B1nVar[INNOIZ][i] = 0.0; - } - } - } else { /* data->delFreq != 0.0 (we have to integrate) */ - for (i=0; i < B1NSRCS; i++) { - if (i != B1TOTNOIZ) { - tempOnoise = Nintegrate(noizDens[i], lnNdens[i], - inst->B1nVar[LNLSTDENS][i], data); - tempInoise = Nintegrate(noizDens[i] * data->GainSqInv , - lnNdens[i] + data->lnGainInv, - inst->B1nVar[LNLSTDENS][i] + data->lnGainInv, - data); - inst->B1nVar[LNLSTDENS][i] = lnNdens[i]; - data->outNoiz += tempOnoise; - data->inNoise += tempInoise; - if (job->NStpsSm != 0) { - inst->B1nVar[OUTNOIZ][i] += tempOnoise; - inst->B1nVar[OUTNOIZ][B1TOTNOIZ] += tempOnoise; - inst->B1nVar[INNOIZ][i] += tempInoise; - inst->B1nVar[INNOIZ][B1TOTNOIZ] += tempInoise; - } - } - } - } - if (data->prtSummary) { - for (i=0; i < B1NSRCS; i++) { /* print a summary report */ - data->outpVector[data->outNumber++] = noizDens[i]; - } - } - break; - - case INT_NOIZ: /* already calculated, just output */ - if (job->NStpsSm != 0) { - for (i=0; i < B1NSRCS; i++) { - data->outpVector[data->outNumber++] = inst->B1nVar[OUTNOIZ][i]; - data->outpVector[data->outNumber++] = inst->B1nVar[INNOIZ][i]; - } - } /* if */ - break; - } /* switch (mode) */ - break; - - case N_CLOSE: - return (OK); /* do nothing, the main calling routine will close */ - break; /* the plots */ - } /* switch (operation) */ - } /* for inst */ - } /* for model */ - -return(OK); -} diff --git a/src/spicelib/devices/bsim1/b1par.c b/src/spicelib/devices/bsim1/b1par.c deleted file mode 100644 index 0d64b3bcc..000000000 --- a/src/spicelib/devices/bsim1/b1par.c +++ /dev/null @@ -1,102 +0,0 @@ -/********** -Copyright 1990 Regents of the University of California. All rights reserved. -Author: 1985 Hong J. Park, Thomas L. Quarles -**********/ -/* - */ - -#include "ngspice/ngspice.h" -#include "ngspice/ifsim.h" -#include "bsim1def.h" -#include "ngspice/sperror.h" -#include "ngspice/suffix.h" - - -/* ARGSUSED */ -int -B1param(int param, IFvalue *value, GENinstance *inst, - IFvalue *select) -{ - B1instance *here = (B1instance*)inst; - - NG_IGNORE(select); - - switch (param) { - case BSIM1_W: - here->B1w = value->rValue; - here->B1wGiven = TRUE; - break; - case BSIM1_L: - here->B1l = value->rValue; - here->B1lGiven = TRUE; - break; - case BSIM1_M: - here->B1m = value->rValue; - here->B1mGiven = TRUE; - break; - case BSIM1_AS: - here->B1sourceArea = value->rValue; - here->B1sourceAreaGiven = TRUE; - break; - case BSIM1_AD: - here->B1drainArea = value->rValue; - here->B1drainAreaGiven = TRUE; - break; - case BSIM1_PS: - here->B1sourcePerimeter = value->rValue; - here->B1sourcePerimeterGiven = TRUE; - break; - case BSIM1_PD: - here->B1drainPerimeter = value->rValue; - here->B1drainPerimeterGiven = TRUE; - break; - case BSIM1_NRS: - here->B1sourceSquares = value->rValue; - here->B1sourceSquaresGiven = TRUE; - break; - case BSIM1_NRD: - here->B1drainSquares = value->rValue; - here->B1drainSquaresGiven = TRUE; - break; - case BSIM1_OFF: - here->B1off = value->iValue; - break; - case BSIM1_IC_VBS: - here->B1icVBS = value->rValue; - here->B1icVBSGiven = TRUE; - break; - case BSIM1_IC_VDS: - here->B1icVDS = value->rValue; - here->B1icVDSGiven = TRUE; - break; - case BSIM1_IC_VGS: - here->B1icVGS = value->rValue; - here->B1icVGSGiven = TRUE; - break; - case BSIM1_IC: - /* FALLTHROUGH added to suppress GCC warning due to - * -Wimplicit-fallthrough flag */ - switch (value->v.numValue){ - case 3: - here->B1icVBS = *(value->v.vec.rVec+2); - here->B1icVBSGiven = TRUE; - /* FALLTHROUGH */ - case 2: - here->B1icVGS = *(value->v.vec.rVec+1); - here->B1icVGSGiven = TRUE; - /* FALLTHROUGH */ - case 1: - here->B1icVDS = *(value->v.vec.rVec); - here->B1icVDSGiven = TRUE; - break; - default: - return(E_BADPARM); - } - break; - default: - return(E_BADPARM); - } - return(OK); -} - - diff --git a/src/spicelib/devices/bsim1/b1pzld.c b/src/spicelib/devices/bsim1/b1pzld.c deleted file mode 100644 index 4cf41458d..000000000 --- a/src/spicelib/devices/bsim1/b1pzld.c +++ /dev/null @@ -1,161 +0,0 @@ -/********** -Copyright 1990 Regents of the University of California. All rights reserved. -Author: 1985 Thomas L. Quarles -**********/ -/* - */ - -#include "ngspice/ngspice.h" -#include "ngspice/cktdefs.h" -#include "ngspice/complex.h" -#include "ngspice/sperror.h" -#include "bsim1def.h" -#include "ngspice/suffix.h" - - -int -B1pzLoad(GENmodel *inModel, CKTcircuit *ckt, SPcomplex *s) -{ - B1model *model = (B1model*)inModel; - B1instance *here; - int xnrm; - int xrev; - double gdpr; - double gspr; - double gm; - double gds; - double gmbs; - double gbd; - double gbs; - double capbd; - double capbs; - double xcggb; - double xcgdb; - double xcgsb; - double xcbgb; - double xcbdb; - double xcbsb; - double xcddb; - double xcssb; - double xcdgb; - double xcsgb; - double xcdsb; - double xcsdb; - double cggb; - double cgdb; - double cgsb; - double cbgb; - double cbdb; - double cbsb; - double cddb; - double cdgb; - double cdsb; - - double m; - - for( ; model != NULL; model = B1nextModel(model)) { - for(here = B1instances(model); here!= NULL; - here = B1nextInstance(here)) { - - if (here->B1mode >= 0) { - xnrm=1; - xrev=0; - } else { - xnrm=0; - xrev=1; - } - gdpr=here->B1drainConductance; - gspr=here->B1sourceConductance; - gm= *(ckt->CKTstate0 + here->B1gm); - gds= *(ckt->CKTstate0 + here->B1gds); - gmbs= *(ckt->CKTstate0 + here->B1gmbs); - gbd= *(ckt->CKTstate0 + here->B1gbd); - gbs= *(ckt->CKTstate0 + here->B1gbs); - capbd= *(ckt->CKTstate0 + here->B1capbd); - capbs= *(ckt->CKTstate0 + here->B1capbs); - /* - * charge oriented model parameters - */ - - cggb = *(ckt->CKTstate0 + here->B1cggb); - cgsb = *(ckt->CKTstate0 + here->B1cgsb); - cgdb = *(ckt->CKTstate0 + here->B1cgdb); - - cbgb = *(ckt->CKTstate0 + here->B1cbgb); - cbsb = *(ckt->CKTstate0 + here->B1cbsb); - cbdb = *(ckt->CKTstate0 + here->B1cbdb); - - cdgb = *(ckt->CKTstate0 + here->B1cdgb); - cdsb = *(ckt->CKTstate0 + here->B1cdsb); - cddb = *(ckt->CKTstate0 + here->B1cddb); - - xcdgb = (cdgb - here->B1GDoverlapCap) ; - xcddb = (cddb + capbd + here->B1GDoverlapCap) ; - xcdsb = cdsb ; - xcsgb = -(cggb + cbgb + cdgb + here->B1GSoverlapCap ) ; - xcsdb = -(cgdb + cbdb + cddb) ; - xcssb = (capbs + here->B1GSoverlapCap - (cgsb+cbsb+cdsb)) ; - xcggb = (cggb + here->B1GDoverlapCap + here->B1GSoverlapCap + - here->B1GBoverlapCap) ; - xcgdb = (cgdb - here->B1GDoverlapCap ) ; - xcgsb = (cgsb - here->B1GSoverlapCap) ; - xcbgb = (cbgb - here->B1GBoverlapCap) ; - xcbdb = (cbdb - capbd ) ; - xcbsb = (cbsb - capbs ) ; - - m = here->B1m; - - *(here->B1GgPtr ) += m * (xcggb * s->real); - *(here->B1GgPtr +1) += m * (xcggb * s->imag); - *(here->B1BbPtr ) += m * ((-xcbgb-xcbdb-xcbsb) * s->real); - *(here->B1BbPtr +1) += m * ((-xcbgb-xcbdb-xcbsb) * s->imag); - *(here->B1DPdpPtr ) += m * (xcddb * s->real); - *(here->B1DPdpPtr +1) += m * (xcddb * s->imag); - *(here->B1SPspPtr ) += m * (xcssb * s->real); - *(here->B1SPspPtr +1) += m * (xcssb * s->imag); - *(here->B1GbPtr ) += m * ((-xcggb-xcgdb-xcgsb) * s->real); - *(here->B1GbPtr +1) += m * ((-xcggb-xcgdb-xcgsb) * s->imag); - *(here->B1GdpPtr ) += m * (xcgdb * s->real); - *(here->B1GdpPtr +1) += m * (xcgdb * s->imag); - *(here->B1GspPtr ) += m * (xcgsb * s->real); - *(here->B1GspPtr +1) += m * (xcgsb * s->imag); - *(here->B1BgPtr ) += m * (xcbgb * s->real); - *(here->B1BgPtr +1) += m * (xcbgb * s->imag); - *(here->B1BdpPtr ) += m * (xcbdb * s->real); - *(here->B1BdpPtr +1) += m * (xcbdb * s->imag); - *(here->B1BspPtr ) += m * (xcbsb * s->real); - *(here->B1BspPtr +1) += m * (xcbsb * s->imag); - *(here->B1DPgPtr ) += m * (xcdgb * s->real); - *(here->B1DPgPtr +1) += m * (xcdgb * s->imag); - *(here->B1DPbPtr ) += m * ((-xcdgb-xcddb-xcdsb) * s->real); - *(here->B1DPbPtr +1) += m * ((-xcdgb-xcddb-xcdsb) * s->imag); - *(here->B1DPspPtr ) += m * (xcdsb * s->real); - *(here->B1DPspPtr +1) += m * (xcdsb * s->imag); - *(here->B1SPgPtr ) += m * (xcsgb * s->real); - *(here->B1SPgPtr +1) += m * (xcsgb * s->imag); - *(here->B1SPbPtr ) += m * ((-xcsgb-xcsdb-xcssb) * s->real); - *(here->B1SPbPtr +1) += m * ((-xcsgb-xcsdb-xcssb) * s->imag); - *(here->B1SPdpPtr ) += m * (xcsdb * s->real); - *(here->B1SPdpPtr +1) += m * (xcsdb * s->imag); - *(here->B1DdPtr) += m * (gdpr); - *(here->B1SsPtr) += m * (gspr); - *(here->B1BbPtr) += m * (gbd+gbs); - *(here->B1DPdpPtr) += m * (gdpr+gds+gbd+xrev*(gm+gmbs)); - *(here->B1SPspPtr) += m * (gspr+gds+gbs+xnrm*(gm+gmbs)); - *(here->B1DdpPtr) -= m * (gdpr); - *(here->B1SspPtr) -= m * (gspr); - *(here->B1BdpPtr) -= m * (gbd); - *(here->B1BspPtr) -= m * (gbs); - *(here->B1DPdPtr) -= m * (gdpr); - *(here->B1DPgPtr) += m * ((xnrm-xrev)*gm); - *(here->B1DPbPtr) += m * (-gbd+(xnrm-xrev)*gmbs); - *(here->B1DPspPtr) += m * (-gds-xnrm*(gm+gmbs)); - *(here->B1SPgPtr) += m * (-(xnrm-xrev)*gm); - *(here->B1SPsPtr) -= m * (gspr); - *(here->B1SPbPtr) += m * (-gbs-(xnrm-xrev)*gmbs); - *(here->B1SPdpPtr) += m * (-gds-xrev*(gm+gmbs)); - - } - } - return(OK); -} diff --git a/src/spicelib/devices/bsim1/b1set.c b/src/spicelib/devices/bsim1/b1set.c deleted file mode 100644 index af910fe7b..000000000 --- a/src/spicelib/devices/bsim1/b1set.c +++ /dev/null @@ -1,427 +0,0 @@ -/********** -Copyright 1990 Regents of the University of California. All rights reserved. -Author: 1985 Hong J. Park, Thomas L. Quarles -**********/ - -#include "ngspice/ngspice.h" -#include "ngspice/smpdefs.h" -#include "ngspice/cktdefs.h" -#include "bsim1def.h" -#include "ngspice/const.h" -#include "ngspice/sperror.h" -#include "ngspice/suffix.h" - -int -B1setup(SMPmatrix *matrix, GENmodel *inModel, CKTcircuit *ckt, - int *states) - /* load the B1 device structure with those pointers needed later - * for fast matrix loading - */ - -{ - B1model *model = (B1model*)inModel; - B1instance *here; - int error; - CKTnode *tmp; - - /* loop through all the B1 device models */ - for( ; model != NULL; model = B1nextModel(model)) { - -/* Default value Processing for B1 MOSFET Models */ - if( ! model->B1typeGiven) { - model->B1type = NMOS; /* NMOS */ - } - if( ! model->B1vfb0Given) { - model->B1vfb0 = 0.0; - } - if( ! model->B1vfbLGiven) { - model->B1vfbL = 0.0; - } - if( ! model->B1vfbWGiven) { - model->B1vfbW = 0.0; - } - if( ! model->B1phi0Given) { - model->B1phi0 = 0.0; - } - if( ! model->B1phiLGiven) { - model->B1phiL = 0.0; - } - if( ! model->B1phiWGiven) { - model->B1phiW = 0.0; - } - if( ! model->B1K10Given) { - model->B1K10 = 0.0; - } - if( ! model->B1K1LGiven) { - model->B1K1L = 0.0; - } - if( ! model->B1K1WGiven) { - model->B1K1W = 0.0; - } - if( ! model->B1K20Given) { - model->B1K20 = 0.0; - } - if( ! model->B1K2LGiven) { - model->B1K2L = 0.0; - } - if( ! model->B1K2WGiven) { - model->B1K2W = 0.0; - } - if( ! model->B1eta0Given) { - model->B1eta0 = 0.0; - } - if( ! model->B1etaLGiven) { - model->B1etaL = 0.0; - } - if( ! model->B1etaWGiven) { - model->B1etaW = 0.0; - } - if( ! model->B1mobZeroGiven) { - model->B1mobZero = 0.0; - } - if( ! model->B1deltaLGiven) { - model->B1deltaL = 0.0; - } - if( ! model->B1deltaWGiven) { - model->B1deltaW = 0.0; - } - if( ! model->B1ugs0Given) { - model->B1ugs0 = 0.0; - } - if( ! model->B1ugsLGiven) { - model->B1ugsL = 0.0; - } - if( ! model->B1ugsWGiven) { - model->B1ugsW = 0.0; - } - if( ! model->B1uds0Given) { - model->B1uds0 = 0.0; - } - if( ! model->B1udsLGiven) { - model->B1udsL = 0.0; - } - if( ! model->B1udsWGiven) { - model->B1udsW = 0.0; - } - if( ! model->B1mobZeroB0Given) { - model->B1mobZeroB0 = 0.0; - } - if( ! model->B1mobZeroBlGiven) { - model->B1mobZeroBl = 0.0; - } - if( ! model->B1mobZeroBwGiven) { - model->B1mobZeroBw = 0.0; - } - if( ! model->B1etaB0Given) { - model->B1etaB0 = 0.0; - } - if( ! model->B1etaBlGiven) { - model->B1etaBl = 0.0; - } - if( ! model->B1etaBwGiven) { - model->B1etaBw = 0.0; - } - if( ! model->B1etaD0Given) { - model->B1etaD0 = 0.0; - } - if( ! model->B1etaDlGiven) { - model->B1etaDl = 0.0; - } - if( ! model->B1etaDwGiven) { - model->B1etaDw = 0.0; - } - if( ! model->B1ugsB0Given) { - model->B1ugsB0 = 0.0; - } - if( ! model->B1ugsBLGiven) { - model->B1ugsBL = 0.0; - } - if( ! model->B1ugsBWGiven) { - model->B1ugsBW = 0.0; - } - if( ! model->B1udsB0Given) { - model->B1udsB0 = 0.0; - } - if( ! model->B1udsBLGiven) { - model->B1udsBL = 0.0; - } - if( ! model->B1udsBWGiven) { - model->B1udsBW = 0.0; - } - if( ! model->B1mobVdd0Given) { - model->B1mobVdd0 = 0.0; - } - if( ! model->B1mobVddlGiven) { - model->B1mobVddl = 0.0; - } - if( ! model->B1mobVddwGiven) { - model->B1mobVddw = 0.0; - } - if( ! model->B1mobVddB0Given) { - model->B1mobVddB0 = 0.0; - } - if( ! model->B1mobVddBlGiven) { - model->B1mobVddBl = 0.0; - } - if( ! model->B1mobVddBwGiven) { - model->B1mobVddBw = 0.0; - } - if( ! model->B1mobVddD0Given) { - model->B1mobVddD0 = 0.0; - } - if( ! model->B1mobVddDlGiven) { - model->B1mobVddDl = 0.0; - } - if( ! model->B1mobVddDwGiven) { - model->B1mobVddDw = 0.0; - } - if( ! model->B1udsD0Given) { - model->B1udsD0 = 0.0; - } - if( ! model->B1udsDLGiven) { - model->B1udsDL = 0.0; - } - if( ! model->B1udsDWGiven) { - model->B1udsDW = 0.0; - } - if( ! model->B1oxideThicknessGiven) { - model->B1oxideThickness = 0.0; /* um */ - } - if( ! model->B1tempGiven) { - model->B1temp = 0.0; - } - if( ! model->B1vddGiven) { - model->B1vdd = 0.0; - } - if( ! model->B1gateDrainOverlapCapGiven) { - model->B1gateDrainOverlapCap = 0.0; - } - if( ! model->B1gateSourceOverlapCapGiven) { - model->B1gateSourceOverlapCap = 0.0; - } - if( ! model->B1gateBulkOverlapCapGiven) { - model->B1gateBulkOverlapCap = 0.0; - } - if( ! model->B1channelChargePartitionFlagGiven) { - model->B1channelChargePartitionFlag = 0; - } - if( ! model->B1subthSlope0Given) { - model->B1subthSlope0 = 0.0; - } - if( ! model->B1subthSlopeLGiven) { - model->B1subthSlopeL = 0.0; - } - if( ! model->B1subthSlopeWGiven) { - model->B1subthSlopeW = 0.0; - } - if( ! model->B1subthSlopeB0Given) { - model->B1subthSlopeB0 = 0.0; - } - if( ! model->B1subthSlopeBLGiven) { - model->B1subthSlopeBL = 0.0; - } - if( ! model->B1subthSlopeBWGiven) { - model->B1subthSlopeBW = 0.0; - } - if( ! model->B1subthSlopeD0Given) { - model->B1subthSlopeD0 = 0.0; - } - if( ! model->B1subthSlopeDLGiven) { - model->B1subthSlopeDL = 0.0; - } - if( ! model->B1subthSlopeDWGiven) { - model->B1subthSlopeDW = 0.0; - } - if( ! model->B1sheetResistanceGiven) { - model->B1sheetResistance = 0.0; - } - if( ! model->B1unitAreaJctCapGiven) { - model->B1unitAreaJctCap = 0.0; - } - if( ! model->B1unitLengthSidewallJctCapGiven) { - model->B1unitLengthSidewallJctCap = 0.0; - } - if( ! model->B1jctSatCurDensityGiven) { - model->B1jctSatCurDensity = 0.0; - } - if( ! model->B1bulkJctPotentialGiven) { - model->B1bulkJctPotential = 0.0; - } - if( ! model->B1sidewallJctPotentialGiven) { - model->B1sidewallJctPotential = 0.0; - } - if( ! model->B1bulkJctBotGradingCoeffGiven) { - model->B1bulkJctBotGradingCoeff = 0.0; - } - if( ! model->B1bulkJctSideGradingCoeffGiven) { - model->B1bulkJctSideGradingCoeff = 0.0; - } - if( ! model->B1defaultWidthGiven) { - model->B1defaultWidth = 0.0; - } - if( ! model->B1deltaLengthGiven) { - model->B1deltaLength = 0.0; - } - if( ! model->B1fNcoefGiven) { - model->B1fNcoef = 0.0; - } - if( ! model->B1fNexpGiven) { - model->B1fNexp = 1.0; - } - - /* loop through all the instances of the model */ - for (here = B1instances(model); here != NULL ; - here=B1nextInstance(here)) { - - CKTnode *tmpNode; - IFuid tmpName; - - /* allocate a chunk of the state vector */ - here->B1states = *states; - *states += B1numStates; - - /* perform the parameter defaulting */ - if(!here->B1drainAreaGiven) { - here->B1drainArea = 0; - } - if(!here->B1drainPerimeterGiven) { - here->B1drainPerimeter = 0; - } - if(!here->B1drainSquaresGiven) { - here->B1drainSquares = 1; - } - if(!here->B1icVBSGiven) { - here->B1icVBS = 0; - } - if(!here->B1icVDSGiven) { - here->B1icVDS = 0; - } - if(!here->B1icVGSGiven) { - here->B1icVGS = 0; - } - if(!here->B1lGiven) { - here->B1l = 5e-6; - } - if(!here->B1sourceAreaGiven) { - here->B1sourceArea = 0; - } - if(!here->B1sourcePerimeterGiven) { - here->B1sourcePerimeter = 0; - } - if(!here->B1sourceSquaresGiven) { - here->B1sourceSquares = 1; - } - if(!here->B1vdsatGiven) { - here->B1vdsat = 0; - } - if(!here->B1vonGiven) { - here->B1von = 0; - } - if(!here->B1wGiven) { - here->B1w = 5e-6; - } - if(!here->B1mGiven) { - here->B1m = 1.0; - } - - /* process drain series resistance */ - if( (model->B1sheetResistance != 0) && - (here->B1drainSquares != 0.0 )) - { if(here->B1dNodePrime == 0) { - error = CKTmkVolt(ckt,&tmp,here->B1name,"drain"); - if(error) return(error); - here->B1dNodePrime = tmp->number; - if (ckt->CKTcopyNodesets) { - if (CKTinst2Node(ckt,here,1,&tmpNode,&tmpName)==OK) { - if (tmpNode->nsGiven) { - tmp->nodeset=tmpNode->nodeset; - tmp->nsGiven=tmpNode->nsGiven; - } - } - } - } - } else { - here->B1dNodePrime = here->B1dNode; - } - - /* process source series resistance */ - if( (model->B1sheetResistance != 0) && - (here->B1sourceSquares != 0.0 )) { - if(here->B1sNodePrime == 0) { - error = CKTmkVolt(ckt,&tmp,here->B1name,"source"); - if(error) return(error); - here->B1sNodePrime = tmp->number; - if (ckt->CKTcopyNodesets) { - if (CKTinst2Node(ckt,here,3,&tmpNode,&tmpName)==OK) { - if (tmpNode->nsGiven) { - tmp->nodeset=tmpNode->nodeset; - tmp->nsGiven=tmpNode->nsGiven; - } - } - } - } - } else { - here->B1sNodePrime = here->B1sNode; - } - - /* set Sparse Matrix Pointers */ - -/* macro to make elements with built in test for out of memory */ -#define TSTALLOC(ptr,first,second) \ -do { if((here->ptr = SMPmakeElt(matrix, here->first, here->second)) == NULL){\ - return(E_NOMEM);\ -} } while(0) - - TSTALLOC(B1DdPtr, B1dNode, B1dNode); - TSTALLOC(B1GgPtr, B1gNode, B1gNode); - TSTALLOC(B1SsPtr, B1sNode, B1sNode); - TSTALLOC(B1BbPtr, B1bNode, B1bNode); - TSTALLOC(B1DPdpPtr, B1dNodePrime, B1dNodePrime); - TSTALLOC(B1SPspPtr, B1sNodePrime, B1sNodePrime); - TSTALLOC(B1DdpPtr, B1dNode, B1dNodePrime); - TSTALLOC(B1GbPtr, B1gNode, B1bNode); - TSTALLOC(B1GdpPtr, B1gNode, B1dNodePrime); - TSTALLOC(B1GspPtr, B1gNode, B1sNodePrime); - TSTALLOC(B1SspPtr, B1sNode, B1sNodePrime); - TSTALLOC(B1BdpPtr, B1bNode, B1dNodePrime); - TSTALLOC(B1BspPtr, B1bNode, B1sNodePrime); - TSTALLOC(B1DPspPtr, B1dNodePrime, B1sNodePrime); - TSTALLOC(B1DPdPtr, B1dNodePrime, B1dNode); - TSTALLOC(B1BgPtr, B1bNode, B1gNode); - TSTALLOC(B1DPgPtr, B1dNodePrime, B1gNode); - TSTALLOC(B1SPgPtr, B1sNodePrime, B1gNode); - TSTALLOC(B1SPsPtr, B1sNodePrime, B1sNode); - TSTALLOC(B1DPbPtr, B1dNodePrime, B1bNode); - TSTALLOC(B1SPbPtr, B1sNodePrime, B1bNode); - TSTALLOC(B1SPdpPtr, B1sNodePrime, B1dNodePrime); - - } - } - return(OK); -} - -int -B1unsetup(GENmodel *inModel, CKTcircuit *ckt) -{ - B1model *model; - B1instance *here; - - for (model = (B1model *)inModel; model != NULL; - model = B1nextModel(model)) - { - for (here = B1instances(model); here != NULL; - here=B1nextInstance(here)) - { - if (here->B1sNodePrime > 0 - && here->B1sNodePrime != here->B1sNode) - CKTdltNNum(ckt, here->B1sNodePrime); - here->B1sNodePrime = 0; - - if (here->B1dNodePrime > 0 - && here->B1dNodePrime != here->B1dNode) - CKTdltNNum(ckt, here->B1dNodePrime); - here->B1dNodePrime = 0; - } - } - return OK; -} diff --git a/src/spicelib/devices/bsim1/b1temp.c b/src/spicelib/devices/bsim1/b1temp.c deleted file mode 100644 index 167801ae1..000000000 --- a/src/spicelib/devices/bsim1/b1temp.c +++ /dev/null @@ -1,145 +0,0 @@ -/********** -Copyright 1990 Regents of the University of California. All rights reserved. -Author: 1985 Hong J. Park, Thomas L. Quarles -**********/ - -#include "ngspice/ngspice.h" -#include "ngspice/smpdefs.h" -#include "ngspice/cktdefs.h" -#include "bsim1def.h" -#include "ngspice/const.h" -#include "ngspice/sperror.h" -#include "ngspice/suffix.h" - -/* ARGSUSED */ -int -B1temp(GENmodel *inModel, CKTcircuit *ckt) - /* load the B1 device structure with those pointers needed later - * for fast matrix loading - */ -{ - B1model *model = (B1model*) inModel; - B1instance *here; - double EffChanLength; - double EffChanWidth; - double Cox; - double CoxWoverL ; - double Leff; /* effective channel length im micron */ - double Weff; /* effective channel width in micron */ - - NG_IGNORE(ckt); - - /* loop through all the B1 device models */ - for( ; model != NULL; model = B1nextModel(model)) { - -/* Default value Processing for B1 MOSFET Models */ - /* Some Limiting for Model Parameters */ - if( model->B1bulkJctPotential < 0.1) { - model->B1bulkJctPotential = 0.1; - } - if( model->B1sidewallJctPotential < 0.1) { - model->B1sidewallJctPotential = 0.1; - } - - Cox = 3.453e-13/(model->B1oxideThickness * 1.0e-4);/*in F/cm**2 */ - model->B1Cox = Cox; /* unit: F/cm**2 */ - - /* loop through all the instances of the model */ - for (here = B1instances(model); here != NULL ; - here=B1nextInstance(here)) { - - if( (EffChanLength = here->B1l - model->B1deltaL *1e-6 )<=0) { - SPfrontEnd->IFerrorf (ERR_FATAL, - "B1: mosfet %s, model %s: Effective channel length <=0", - model->B1modName, here->B1name); - return(E_BADPARM); - } - if( (EffChanWidth = here->B1w - model->B1deltaW *1e-6 ) <= 0 ) { - SPfrontEnd->IFerrorf (ERR_FATAL, - "B1: mosfet %s, model %s: Effective channel width <=0", - model->B1modName, here->B1name); - return(E_BADPARM); - } - here->B1GDoverlapCap=EffChanWidth *model->B1gateDrainOverlapCap; - here->B1GSoverlapCap=EffChanWidth*model->B1gateSourceOverlapCap; - here->B1GBoverlapCap=here->B1l * model->B1gateBulkOverlapCap; - - /* process drain series resistance */ - if( (here->B1drainConductance=model->B1sheetResistance * - here->B1drainSquares) != 0.0 ) { - here->B1drainConductance = 1. / here->B1drainConductance ; - } - - /* process source series resistance */ - if( (here->B1sourceConductance=model->B1sheetResistance * - here->B1sourceSquares) != 0.0 ) { - here->B1sourceConductance = 1. / here->B1sourceConductance ; - } - - Leff = EffChanLength * 1.e6; /* convert into micron */ - Weff = EffChanWidth * 1.e6; /* convert into micron */ - CoxWoverL = Cox * Weff / Leff ; /* F/cm**2 */ - - here->B1vfb = model->B1vfb0 + - model->B1vfbL / Leff + model->B1vfbW / Weff; - here->B1phi = model->B1phi0 + - model->B1phiL / Leff + model->B1phiW / Weff; - here->B1K1 = model->B1K10 + - model->B1K1L / Leff + model->B1K1W / Weff; - here->B1K2 = model->B1K20 + - model->B1K2L / Leff + model->B1K2W / Weff; - here->B1eta = model->B1eta0 + - model->B1etaL / Leff + model->B1etaW / Weff; - here->B1etaB = model->B1etaB0 + - model->B1etaBl / Leff + model->B1etaBw / Weff; - here->B1etaD = model->B1etaD0 + - model->B1etaDl / Leff + model->B1etaDw / Weff; - here->B1betaZero = model->B1mobZero; - here->B1betaZeroB = model->B1mobZeroB0 + - model->B1mobZeroBl / Leff + model->B1mobZeroBw / Weff; - here->B1ugs = model->B1ugs0 + - model->B1ugsL / Leff + model->B1ugsW / Weff; - here->B1ugsB = model->B1ugsB0 + - model->B1ugsBL / Leff + model->B1ugsBW / Weff; - here->B1uds = model->B1uds0 + - model->B1udsL / Leff + model->B1udsW / Weff; - here->B1udsB = model->B1udsB0 + - model->B1udsBL / Leff + model->B1udsBW / Weff; - here->B1udsD = model->B1udsD0 + - model->B1udsDL / Leff + model->B1udsDW / Weff; - here->B1betaVdd = model->B1mobVdd0 + - model->B1mobVddl / Leff + model->B1mobVddw / Weff; - here->B1betaVddB = model->B1mobVddB0 + - model->B1mobVddBl / Leff + model->B1mobVddBw / Weff; - here->B1betaVddD = model->B1mobVddD0 + - model->B1mobVddDl / Leff + model->B1mobVddDw / Weff; - here->B1subthSlope = model->B1subthSlope0 + - model->B1subthSlopeL / Leff + model->B1subthSlopeW / Weff; - here->B1subthSlopeB = model->B1subthSlopeB0 + - model->B1subthSlopeBL / Leff + model->B1subthSlopeBW / Weff; - here->B1subthSlopeD = model->B1subthSlopeD0 + - model->B1subthSlopeDL / Leff + model->B1subthSlopeDW / Weff; - - if(here->B1phi < 0.1 ) here->B1phi = 0.1; - if(here->B1K1 < 0.0) here->B1K1 = 0.0; - if(here->B1K2 < 0.0) here->B1K2 = 0.0; - - here->B1vt0 = here->B1vfb + here->B1phi + here->B1K1 * - sqrt(here->B1phi) - here->B1K2 * here->B1phi; - - here->B1von = here->B1vt0; /* added for initialization*/ - - /* process Beta Parameters (unit: A/V**2) */ - - here->B1betaZero = here->B1betaZero * CoxWoverL; - here->B1betaZeroB = here->B1betaZeroB * CoxWoverL; - here->B1betaVdd = here->B1betaVdd * CoxWoverL; - here->B1betaVddB = here->B1betaVddB * CoxWoverL; - here->B1betaVddD = MAX(here->B1betaVddD * CoxWoverL,0.0); - - } - } - return(OK); -} - - diff --git a/src/spicelib/devices/bsim1/b1trunc.c b/src/spicelib/devices/bsim1/b1trunc.c deleted file mode 100644 index 114d6e0c4..000000000 --- a/src/spicelib/devices/bsim1/b1trunc.c +++ /dev/null @@ -1,41 +0,0 @@ -/********** -Copyright 1990 Regents of the University of California. All rights reserved. -Author: 1985 Hong J. Park, Thomas L. Quarles -**********/ - -#include "ngspice/ngspice.h" -#include "ngspice/cktdefs.h" -#include "bsim1def.h" -#include "ngspice/sperror.h" -#include "ngspice/suffix.h" - -int -B1trunc(GENmodel *inModel, CKTcircuit *ckt, double *timeStep) - -{ - B1model *model = (B1model*)inModel; - B1instance *here; -#ifdef STEPDEBUG - double debugtemp; -#endif /* STEPDEBUG */ - - for( ; model != NULL; model = B1nextModel(model)) { - for(here=B1instances(model);here!=NULL;here = B1nextInstance(here)){ - -#ifdef STEPDEBUG - debugtemp = *timeStep; -#endif /* STEPDEBUG */ - CKTterr(here->B1qb,ckt,timeStep); - CKTterr(here->B1qg,ckt,timeStep); - CKTterr(here->B1qd,ckt,timeStep); -#ifdef STEPDEBUG - if(debugtemp != *timeStep) { - printf("device %s reduces step from %g to %g\n", - here->B1name,debugtemp,*timeStep); - } -#endif /* STEPDEBUG */ - } - } - return(OK); -} - diff --git a/src/spicelib/devices/bsim1/bsim1def.h b/src/spicelib/devices/bsim1/bsim1def.h deleted file mode 100644 index 34df9b3e6..000000000 --- a/src/spicelib/devices/bsim1/bsim1def.h +++ /dev/null @@ -1,658 +0,0 @@ -/********** -Copyright 1990 Regents of the University of California. All rights reserved. -Author: 1985 Hong June Park, Thomas L. Quarles -**********/ - -#ifndef BSIM1 -#define BSIM1 - -#include "ngspice/ifsim.h" -#include "ngspice/gendefs.h" -#include "ngspice/cktdefs.h" -#include "ngspice/complex.h" -#include "ngspice/noisedef.h" - - /* declarations for B1 MOSFETs */ - -#define B1numStates 35 -#define B1NDCOEFFS 82 - -/* information needed for each instance */ - -typedef struct sBSIM1instance { - - struct GENinstance gen; - -#define B1modPtr(inst) ((struct sBSIM1model *)((inst)->gen.GENmodPtr)) -#define B1nextInstance(inst) ((struct sBSIM1instance *)((inst)->gen.GENnextInstance)) -#define B1name gen.GENname -#define B1states gen.GENstate - - const int B1dNode; /* number of the gate node of the mosfet */ - const int B1gNode; /* number of the gate node of the mosfet */ - const int B1sNode; /* number of the source node of the mosfet */ - const int B1bNode; /* number of the bulk node of the mosfet */ - int B1dNodePrime; /* number of the internal drain node of the mosfet */ - int B1sNodePrime; /* number of the internal source node of the mosfet */ - - double B1l; /* the length of the channel region */ - double B1w; /* the width of the channel region */ - double B1m; /* the parallel multiplier */ - double B1drainArea; /* the area of the drain diffusion */ - double B1sourceArea; /* the area of the source diffusion */ - double B1drainSquares; /* the length of the drain in squares */ - double B1sourceSquares; /* the length of the source in squares */ - double B1drainPerimeter; - double B1sourcePerimeter; - double B1sourceConductance; /*conductance of source(or 0):set in setup*/ - double B1drainConductance; /*conductance of drain(or 0):set in setup*/ - - double B1icVBS; /* initial condition B-S voltage */ - double B1icVDS; /* initial condition D-S voltage */ - double B1icVGS; /* initial condition G-S voltage */ - double B1von; - double B1vdsat; - int B1off; /* non-zero to indicate device is off for dc analysis*/ - int B1mode; /* device mode : 1 = normal, -1 = inverse */ - - double B1vfb; /* flat band voltage at given L and W */ - double B1phi; /* surface potential at strong inversion */ - double B1K1; /* bulk effect coefficient 1 */ - double B1K2; /* bulk effect coefficient 2 */ - double B1eta; /* drain induced barrier lowering */ - double B1etaB; /* Vbs dependence of Eta */ - double B1etaD; /* Vds dependence of Eta */ - double B1betaZero; /* Beta at vds = 0 and vgs = Vth */ - double B1betaZeroB; /* Vbs dependence of BetaZero */ - double B1betaVdd; /* Beta at vds=Vdd and vgs=Vth */ - double B1betaVddB; /* Vbs dependence of BVdd */ - double B1betaVddD; /* Vds dependence of BVdd */ - double B1ugs; /* Mobility degradation due to gate field*/ - double B1ugsB; /* Vbs dependence of Ugs */ - double B1uds; /* Drift Velocity Saturation due to Vds */ - double B1udsB; /* Vbs dependence of Uds */ - double B1udsD; /* Vds dependence of Uds */ - double B1subthSlope; /* slope of subthreshold current with Vgs*/ - double B1subthSlopeB; /* Vbs dependence of Subthreshold Slope */ - double B1subthSlopeD; /* Vds dependence of Subthreshold Slope */ - double B1GDoverlapCap;/* Gate Drain Overlap Capacitance */ - double B1GSoverlapCap;/* Gate Source Overlap Capacitance */ - double B1GBoverlapCap;/* Gate Bulk Overlap Capacitance */ - double B1vt0; - double B1vdd; /* Supply Voltage */ - double B1temp; - double B1oxideThickness; - unsigned B1channelChargePartitionFlag :1; - unsigned B1lGiven :1; - unsigned B1wGiven :1; - unsigned B1mGiven :1; - unsigned B1drainAreaGiven :1; - unsigned B1sourceAreaGiven :1; - unsigned B1drainSquaresGiven :1; - unsigned B1sourceSquaresGiven :1; - unsigned B1drainPerimeterGiven :1; - unsigned B1sourcePerimeterGiven :1; - unsigned B1dNodePrimeSet :1; - unsigned B1sNodePrimeSet :1; - unsigned B1icVBSGiven :1; - unsigned B1icVDSGiven :1; - unsigned B1icVGSGiven :1; - unsigned B1vonGiven :1; - unsigned B1vdsatGiven :1; - - - double *B1DdPtr; /* pointer to sparse matrix element at - * (Drain node,drain node) */ - double *B1GgPtr; /* pointer to sparse matrix element at - * (gate node,gate node) */ - double *B1SsPtr; /* pointer to sparse matrix element at - * (source node,source node) */ - double *B1BbPtr; /* pointer to sparse matrix element at - * (bulk node,bulk node) */ - double *B1DPdpPtr; /* pointer to sparse matrix element at - * (drain prime node,drain prime node) */ - double *B1SPspPtr; /* pointer to sparse matrix element at - * (source prime node,source prime node) */ - double *B1DdpPtr; /* pointer to sparse matrix element at - * (drain node,drain prime node) */ - double *B1GbPtr; /* pointer to sparse matrix element at - * (gate node,bulk node) */ - double *B1GdpPtr; /* pointer to sparse matrix element at - * (gate node,drain prime node) */ - double *B1GspPtr; /* pointer to sparse matrix element at - * (gate node,source prime node) */ - double *B1SspPtr; /* pointer to sparse matrix element at - * (source node,source prime node) */ - double *B1BdpPtr; /* pointer to sparse matrix element at - * (bulk node,drain prime node) */ - double *B1BspPtr; /* pointer to sparse matrix element at - * (bulk node,source prime node) */ - double *B1DPspPtr; /* pointer to sparse matrix element at - * (drain prime node,source prime node) */ - double *B1DPdPtr; /* pointer to sparse matrix element at - * (drain prime node,drain node) */ - double *B1BgPtr; /* pointer to sparse matrix element at - * (bulk node,gate node) */ - double *B1DPgPtr; /* pointer to sparse matrix element at - * (drain prime node,gate node) */ - - double *B1SPgPtr; /* pointer to sparse matrix element at - * (source prime node,gate node) */ - double *B1SPsPtr; /* pointer to sparse matrix element at - * (source prime node,source node) */ - double *B1DPbPtr; /* pointer to sparse matrix element at - * (drain prime node,bulk node) */ - double *B1SPbPtr; /* pointer to sparse matrix element at - * (source prime node,bulk node) */ - double *B1SPdpPtr; /* pointer to sparse matrix element at - * (source prime node,drain prime node) */ - -#ifndef NODISTO - double B1dCoeffs[B1NDCOEFFS]; -#else /* NODISTO */ - double *B1dCoeffs; -#endif /* NODISTO */ -/* indices to the array of BSIM1 noise sources */ - -#define B1RDNOIZ 0 -#define B1RSNOIZ 1 -#define B1IDNOIZ 2 -#define B1FLNOIZ 3 -#define B1TOTNOIZ 4 - -#define B1NSRCS 5 /* the number of BSIM1 noise sources */ - -#ifndef NONOISE - double B1nVar[NSTATVARS][B1NSRCS]; -#else /* NONOISE */ - double **B1nVar; -#endif /* NONOISE */ - - -} B1instance ; - -#ifndef CONFIG - -#define B1vbd B1states+ 0 -#define B1vbs B1states+ 1 -#define B1vgs B1states+ 2 -#define B1vds B1states+ 3 -#define B1cd B1states+ 4 -#define B1id B1states+ 4 -#define B1cbs B1states+ 5 -#define B1ibs B1states+ 5 -#define B1cbd B1states+ 6 -#define B1ibd B1states+ 6 -#define B1gm B1states+ 7 -#define B1gds B1states+ 8 -#define B1gmbs B1states+ 9 -#define B1gbd B1states+ 10 -#define B1gbs B1states+ 11 -#define B1qb B1states+ 12 -#define B1cqb B1states+ 13 -#define B1iqb B1states+ 13 -#define B1qg B1states+ 14 -#define B1cqg B1states+ 15 -#define B1iqg B1states+ 15 -#define B1qd B1states+ 16 -#define B1cqd B1states+ 17 -#define B1iqd B1states+ 17 -#define B1cggb B1states+ 18 -#define B1cgdb B1states+ 19 -#define B1cgsb B1states+ 20 -#define B1cbgb B1states+ 21 -#define B1cbdb B1states+ 22 -#define B1cbsb B1states+ 23 -#define B1capbd B1states+ 24 -#define B1iqbd B1states+ 25 -#define B1cqbd B1states+ 25 -#define B1capbs B1states+ 26 -#define B1iqbs B1states+ 27 -#define B1cqbs B1states+ 27 -#define B1cdgb B1states+ 28 -#define B1cddb B1states+ 29 -#define B1cdsb B1states+ 30 -#define B1vono B1states+ 31 -#define B1vdsato B1states+ 32 -#define B1qbs B1states+ 33 -#define B1qbd B1states+ 34 - -/* - * the following naming convention is used: - * x = vgs - * y = vbs - * z = vds - * DrC is the DrCur - * therefore qg_xyz stands for the coefficient of the vgs*vbs*vds - * term in the multidimensional Taylor expansion for qg; and DrC_x2y - * for the coeff. of the vgs*vgs*vbs term in the DrC expansion. - */ - -#define qg_x B1dCoeffs[0] -#define qg_y B1dCoeffs[1] -#define qg_z B1dCoeffs[2] -#define qg_x2 B1dCoeffs[3] -#define qg_y2 B1dCoeffs[4] -#define qg_z2 B1dCoeffs[5] -#define qg_xy B1dCoeffs[6] -#define qg_yz B1dCoeffs[7] -#define qg_xz B1dCoeffs[8] -#define qg_x3 B1dCoeffs[9] -#define qg_y3 B1dCoeffs[10] -#define qg_z3 B1dCoeffs[11] -#define qg_x2z B1dCoeffs[12] -#define qg_x2y B1dCoeffs[13] -#define qg_y2z B1dCoeffs[14] -#define qg_xy2 B1dCoeffs[15] -#define qg_xz2 B1dCoeffs[16] -#define qg_yz2 B1dCoeffs[17] -#define qg_xyz B1dCoeffs[18] -#define qb_x B1dCoeffs[19] -#define qb_y B1dCoeffs[20] -#define qb_z B1dCoeffs[21] -#define qb_x2 B1dCoeffs[22] -#define qb_y2 B1dCoeffs[23] -#define qb_z2 B1dCoeffs[24] -#define qb_xy B1dCoeffs[25] -#define qb_yz B1dCoeffs[26] -#define qb_xz B1dCoeffs[27] -#define qb_x3 B1dCoeffs[28] -#define qb_y3 B1dCoeffs[29] -#define qb_z3 B1dCoeffs[30] -#define qb_x2z B1dCoeffs[31] -#define qb_x2y B1dCoeffs[32] -#define qb_y2z B1dCoeffs[33] -#define qb_xy2 B1dCoeffs[34] -#define qb_xz2 B1dCoeffs[35] -#define qb_yz2 B1dCoeffs[36] -#define qb_xyz B1dCoeffs[37] -#define qd_x B1dCoeffs[38] -#define qd_y B1dCoeffs[39] -#define qd_z B1dCoeffs[40] -#define qd_x2 B1dCoeffs[41] -#define qd_y2 B1dCoeffs[42] -#define qd_z2 B1dCoeffs[43] -#define qd_xy B1dCoeffs[44] -#define qd_yz B1dCoeffs[45] -#define qd_xz B1dCoeffs[46] -#define qd_x3 B1dCoeffs[47] -#define qd_y3 B1dCoeffs[48] -#define qd_z3 B1dCoeffs[49] -#define qd_x2z B1dCoeffs[50] -#define qd_x2y B1dCoeffs[51] -#define qd_y2z B1dCoeffs[52] -#define qd_xy2 B1dCoeffs[53] -#define qd_xz2 B1dCoeffs[54] -#define qd_yz2 B1dCoeffs[55] -#define qd_xyz B1dCoeffs[56] -#define DrC_x B1dCoeffs[57] -#define DrC_y B1dCoeffs[58] -#define DrC_z B1dCoeffs[59] -#define DrC_x2 B1dCoeffs[60] -#define DrC_y2 B1dCoeffs[61] -#define DrC_z2 B1dCoeffs[62] -#define DrC_xy B1dCoeffs[63] -#define DrC_yz B1dCoeffs[64] -#define DrC_xz B1dCoeffs[65] -#define DrC_x3 B1dCoeffs[66] -#define DrC_y3 B1dCoeffs[67] -#define DrC_z3 B1dCoeffs[68] -#define DrC_x2z B1dCoeffs[69] -#define DrC_x2y B1dCoeffs[70] -#define DrC_y2z B1dCoeffs[71] -#define DrC_xy2 B1dCoeffs[72] -#define DrC_xz2 B1dCoeffs[73] -#define DrC_yz2 B1dCoeffs[74] -#define DrC_xyz B1dCoeffs[75] -#define gbs1 B1dCoeffs[76] -#define gbs2 B1dCoeffs[77] -#define gbs3 B1dCoeffs[78] -#define gbd1 B1dCoeffs[79] -#define gbd2 B1dCoeffs[80] -#define gbd3 B1dCoeffs[81] - -#endif - - -/* per model data */ - -typedef struct sBSIM1model { /* model structure for a resistor */ - - struct GENmodel gen; - -#define B1modType gen.GENmodType -#define B1nextModel(inst) ((struct sBSIM1model *)((inst)->gen.GENnextModel)) -#define B1instances(inst) ((B1instance *)((inst)->gen.GENinstances)) -#define B1modName gen.GENmodName - - int B1type; /* device type : 1 = nmos, -1 = pmos */ - - double B1vfb0; - double B1vfbL; - double B1vfbW; - double B1phi0; - double B1phiL; - double B1phiW; - double B1K10; - double B1K1L; - double B1K1W; - double B1K20; - double B1K2L; - double B1K2W; - double B1eta0; - double B1etaL; - double B1etaW; - double B1etaB0; - double B1etaBl; - double B1etaBw; - double B1etaD0; - double B1etaDl; - double B1etaDw; - double B1deltaL; - double B1deltaW; - double B1mobZero; - double B1mobZeroB0; - double B1mobZeroBl; - double B1mobZeroBw ; - double B1mobVdd0; - double B1mobVddl; - double B1mobVddw; - double B1mobVddB0; - double B1mobVddBl; - double B1mobVddBw; - double B1mobVddD0; - double B1mobVddDl; - double B1mobVddDw; - double B1ugs0; - double B1ugsL; - double B1ugsW; - double B1ugsB0; - double B1ugsBL; - double B1ugsBW; - double B1uds0; - double B1udsL; - double B1udsW; - double B1udsB0; - double B1udsBL; - double B1udsBW; - double B1udsD0; - double B1udsDL; - double B1udsDW; - double B1subthSlope0; - double B1subthSlopeL; - double B1subthSlopeW; - double B1subthSlopeB0; - double B1subthSlopeBL; - double B1subthSlopeBW; - double B1subthSlopeD0; - double B1subthSlopeDL; - double B1subthSlopeDW; - double B1oxideThickness; /* unit: micron */ - double B1Cox; /* unit: F/cm**2 */ - double B1temp; - double B1vdd; - double B1gateSourceOverlapCap; - double B1gateDrainOverlapCap; - double B1gateBulkOverlapCap; - unsigned B1channelChargePartitionFlag :1; - - double B1sheetResistance; - double B1jctSatCurDensity; - double B1bulkJctPotential; - double B1bulkJctBotGradingCoeff; - double B1bulkJctSideGradingCoeff; - double B1sidewallJctPotential; - double B1unitAreaJctCap; - double B1unitLengthSidewallJctCap; - double B1defaultWidth; - double B1deltaLength; - - double B1fNcoef; - double B1fNexp; - - - - unsigned B1vfb0Given :1; - unsigned B1vfbLGiven :1; - unsigned B1vfbWGiven :1; - unsigned B1phi0Given :1; - unsigned B1phiLGiven :1; - unsigned B1phiWGiven :1; - unsigned B1K10Given :1; - unsigned B1K1LGiven :1; - unsigned B1K1WGiven :1; - unsigned B1K20Given :1; - unsigned B1K2LGiven :1; - unsigned B1K2WGiven :1; - unsigned B1eta0Given :1; - unsigned B1etaLGiven :1; - unsigned B1etaWGiven :1; - unsigned B1etaB0Given :1; - unsigned B1etaBlGiven :1; - unsigned B1etaBwGiven :1; - unsigned B1etaD0Given :1; - unsigned B1etaDlGiven :1; - unsigned B1etaDwGiven :1; - unsigned B1deltaLGiven :1; - unsigned B1deltaWGiven :1; - unsigned B1mobZeroGiven :1; - unsigned B1mobZeroB0Given :1; - unsigned B1mobZeroBlGiven :1; - unsigned B1mobZeroBwGiven :1; - unsigned B1mobVdd0Given :1; - unsigned B1mobVddlGiven :1; - unsigned B1mobVddwGiven :1; - unsigned B1mobVddB0Given :1; - unsigned B1mobVddBlGiven :1; - unsigned B1mobVddBwGiven :1; - unsigned B1mobVddD0Given :1; - unsigned B1mobVddDlGiven :1; - unsigned B1mobVddDwGiven :1; - unsigned B1ugs0Given :1; - unsigned B1ugsLGiven :1; - unsigned B1ugsWGiven :1; - unsigned B1ugsB0Given :1; - unsigned B1ugsBLGiven :1; - unsigned B1ugsBWGiven :1; - unsigned B1uds0Given :1; - unsigned B1udsLGiven :1; - unsigned B1udsWGiven :1; - unsigned B1udsB0Given :1; - unsigned B1udsBLGiven :1; - unsigned B1udsBWGiven :1; - unsigned B1udsD0Given :1; - unsigned B1udsDLGiven :1; - unsigned B1udsDWGiven :1; - unsigned B1subthSlope0Given :1; - unsigned B1subthSlopeLGiven :1; - unsigned B1subthSlopeWGiven :1; - unsigned B1subthSlopeB0Given :1; - unsigned B1subthSlopeBLGiven :1; - unsigned B1subthSlopeBWGiven :1; - unsigned B1subthSlopeD0Given :1; - unsigned B1subthSlopeDLGiven :1; - unsigned B1subthSlopeDWGiven :1; - unsigned B1oxideThicknessGiven :1; - unsigned B1tempGiven :1; - unsigned B1vddGiven :1; - unsigned B1gateSourceOverlapCapGiven :1; - unsigned B1gateDrainOverlapCapGiven :1; - unsigned B1gateBulkOverlapCapGiven :1; - unsigned B1channelChargePartitionFlagGiven :1; - unsigned B1sheetResistanceGiven :1; - unsigned B1jctSatCurDensityGiven :1; - unsigned B1bulkJctPotentialGiven :1; - unsigned B1bulkJctBotGradingCoeffGiven :1; - unsigned B1sidewallJctPotentialGiven :1; - unsigned B1bulkJctSideGradingCoeffGiven :1; - unsigned B1unitAreaJctCapGiven :1; - unsigned B1unitLengthSidewallJctCapGiven :1; - unsigned B1defaultWidthGiven :1; - unsigned B1deltaLengthGiven :1; - - unsigned B1fNcoefGiven :1; - unsigned B1fNexpGiven :1; - - unsigned B1typeGiven :1; - -} B1model; - - -#ifndef NMOS -#define NMOS 1 -#define PMOS -1 -#endif /*NMOS*/ - - -/* device parameters */ -#define BSIM1_W 1 -#define BSIM1_L 2 -#define BSIM1_AS 3 -#define BSIM1_AD 4 -#define BSIM1_PS 5 -#define BSIM1_PD 6 -#define BSIM1_NRS 7 -#define BSIM1_NRD 8 -#define BSIM1_OFF 9 -#define BSIM1_IC_VBS 10 -#define BSIM1_IC_VDS 11 -#define BSIM1_IC_VGS 12 -#define BSIM1_IC 13 -#define BSIM1_M 14 - -/* model parameters */ -#define BSIM1_MOD_VFB0 101 -#define BSIM1_MOD_VFBL 102 -#define BSIM1_MOD_VFBW 103 -#define BSIM1_MOD_PHI0 104 -#define BSIM1_MOD_PHIL 105 -#define BSIM1_MOD_PHIW 106 -#define BSIM1_MOD_K10 107 -#define BSIM1_MOD_K1L 108 -#define BSIM1_MOD_K1W 109 -#define BSIM1_MOD_K20 110 -#define BSIM1_MOD_K2L 111 -#define BSIM1_MOD_K2W 112 -#define BSIM1_MOD_ETA0 113 -#define BSIM1_MOD_ETAL 114 -#define BSIM1_MOD_ETAW 115 -#define BSIM1_MOD_ETAB0 116 -#define BSIM1_MOD_ETABL 117 -#define BSIM1_MOD_ETABW 118 -#define BSIM1_MOD_ETAD0 119 -#define BSIM1_MOD_ETADL 120 -#define BSIM1_MOD_ETADW 121 -#define BSIM1_MOD_DELTAL 122 -#define BSIM1_MOD_DELTAW 123 -#define BSIM1_MOD_MOBZERO 124 -#define BSIM1_MOD_MOBZEROB0 125 -#define BSIM1_MOD_MOBZEROBL 126 -#define BSIM1_MOD_MOBZEROBW 127 -#define BSIM1_MOD_MOBVDD0 128 -#define BSIM1_MOD_MOBVDDL 129 -#define BSIM1_MOD_MOBVDDW 130 -#define BSIM1_MOD_MOBVDDB0 131 -#define BSIM1_MOD_MOBVDDBL 132 -#define BSIM1_MOD_MOBVDDBW 133 -#define BSIM1_MOD_MOBVDDD0 134 -#define BSIM1_MOD_MOBVDDDL 135 -#define BSIM1_MOD_MOBVDDDW 136 -#define BSIM1_MOD_UGS0 137 -#define BSIM1_MOD_UGSL 138 -#define BSIM1_MOD_UGSW 139 -#define BSIM1_MOD_UGSB0 140 -#define BSIM1_MOD_UGSBL 141 -#define BSIM1_MOD_UGSBW 142 -#define BSIM1_MOD_UDS0 143 -#define BSIM1_MOD_UDSL 144 -#define BSIM1_MOD_UDSW 145 -#define BSIM1_MOD_UDSB0 146 -#define BSIM1_MOD_UDSBL 147 -#define BSIM1_MOD_UDSBW 148 -#define BSIM1_MOD_UDSD0 149 -#define BSIM1_MOD_UDSDL 150 -#define BSIM1_MOD_UDSDW 151 -#define BSIM1_MOD_N00 152 -#define BSIM1_MOD_N0L 153 -#define BSIM1_MOD_N0W 154 -#define BSIM1_MOD_NB0 155 -#define BSIM1_MOD_NBL 156 -#define BSIM1_MOD_NBW 157 -#define BSIM1_MOD_ND0 158 -#define BSIM1_MOD_NDL 159 -#define BSIM1_MOD_NDW 160 -#define BSIM1_MOD_TOX 161 -#define BSIM1_MOD_TEMP 162 -#define BSIM1_MOD_VDD 163 -#define BSIM1_MOD_CGSO 164 -#define BSIM1_MOD_CGDO 165 -#define BSIM1_MOD_CGBO 166 -#define BSIM1_MOD_XPART 167 -#define BSIM1_MOD_RSH 168 -#define BSIM1_MOD_JS 169 -#define BSIM1_MOD_PB 170 -#define BSIM1_MOD_MJ 171 -#define BSIM1_MOD_PBSW 172 -#define BSIM1_MOD_MJSW 173 -#define BSIM1_MOD_CJ 174 -#define BSIM1_MOD_CJSW 175 -#define BSIM1_MOD_DEFWIDTH 176 -#define BSIM1_MOD_DELLENGTH 177 -#define BSIM1_MOD_NMOS 178 -#define BSIM1_MOD_PMOS 179 - -#define BSIM1_MOD_KF 180 -#define BSIM1_MOD_AF 181 - -/* device questions */ -#define BSIM1_DNODE 201 -#define BSIM1_GNODE 202 -#define BSIM1_SNODE 203 -#define BSIM1_BNODE 204 -#define BSIM1_DNODEPRIME 205 -#define BSIM1_SNODEPRIME 206 -#define BSIM1_VBD 207 -#define BSIM1_VBS 208 -#define BSIM1_VGS 209 -#define BSIM1_VDS 210 -#define BSIM1_CD 211 -#define BSIM1_CBS 212 -#define BSIM1_CBD 213 -#define BSIM1_GM 214 -#define BSIM1_GDS 215 -#define BSIM1_GMBS 216 -#define BSIM1_GBD 217 -#define BSIM1_GBS 218 -#define BSIM1_QB 219 -#define BSIM1_CQB 220 -#define BSIM1_QG 221 -#define BSIM1_CQG 222 -#define BSIM1_QD 223 -#define BSIM1_CQD 224 -#define BSIM1_CGG 225 -#define BSIM1_CGD 226 -#define BSIM1_CGS 227 -#define BSIM1_CBG 228 -#define BSIM1_CAPBD 231 -#define BSIM1_CQBD 232 -#define BSIM1_CAPBS 233 -#define BSIM1_CQBS 234 -#define BSIM1_CDG 235 -#define BSIM1_CDD 236 -#define BSIM1_CDS 237 -#define BSIM1_VON 238 -#define BSIM1_QBS 239 -#define BSIM1_QBD 240 -#define BSIM1_SOURCECONDUCT 241 -#define BSIM1_DRAINCONDUCT 242 - -/* model questions */ - -#include "bsim1ext.h" - -extern void B1evaluate(double,double,double,B1instance*,B1model*, - double*,double*,double*, double*, double*, double*, double*, - double*, double*, double*, double*, double*, double*, double*, - double*, double*, double*, double*, CKTcircuit*); - -#endif /*B1*/ diff --git a/src/spicelib/devices/bsim1/bsim1ext.h b/src/spicelib/devices/bsim1/bsim1ext.h deleted file mode 100644 index bf13eba8b..000000000 --- a/src/spicelib/devices/bsim1/bsim1ext.h +++ /dev/null @@ -1,28 +0,0 @@ -/********** -Copyright 1990 Regents of the University of California. All rights reserved. -Author: 1985 Hong June Park, Thomas L. Quarles -Modified: 2000 AlansFixes -**********/ - - -extern int B1acLoad(GENmodel *,CKTcircuit*); -extern int B1ask(CKTcircuit *,GENinstance*,int,IFvalue*,IFvalue*); -extern int B1convTest(GENmodel *,CKTcircuit*); -extern int B1getic(GENmodel*,CKTcircuit*); -extern int B1load(GENmodel*,CKTcircuit*); -extern int B1mAsk(CKTcircuit*,GENmodel *,int, IFvalue*); -extern int B1mParam(int,IFvalue*,GENmodel*); -extern void B1mosCap(CKTcircuit*, double, double, double, double*, - double, double, double, double, double, double, - double*, double*, double*, double*, double*, double*, double*, double*, - double*, double*, double*, double*, double*, double*, double*, - double*); -extern int B1noise (int, int, GENmodel *, CKTcircuit *, Ndata *, double *); -extern int B1param(int,IFvalue*,GENinstance*,IFvalue*); -extern int B1pzLoad(GENmodel*,CKTcircuit*,SPcomplex*); -extern int B1setup(SMPmatrix*,GENmodel*,CKTcircuit*,int*); -extern int B1unsetup(GENmodel*,CKTcircuit*); -extern int B1temp(GENmodel*,CKTcircuit*); -extern int B1trunc(GENmodel*,CKTcircuit*,double*); -extern int B1disto(int,GENmodel*,CKTcircuit*); -extern int B1dSetup(GENmodel*, register CKTcircuit*); diff --git a/src/spicelib/devices/bsim1/bsim1init.c b/src/spicelib/devices/bsim1/bsim1init.c deleted file mode 100644 index 2acf4d164..000000000 --- a/src/spicelib/devices/bsim1/bsim1init.c +++ /dev/null @@ -1,76 +0,0 @@ -#include "ngspice/config.h" - -#include "ngspice/devdefs.h" - -#include "bsim1itf.h" -#include "bsim1ext.h" -#include "bsim1init.h" - - -SPICEdev B1info = { - .DEVpublic = { - .name = "BSIM1", - .description = "Berkeley Short Channel IGFET Model", - .terms = &B1nSize, - .numNames = &B1nSize, - .termNames = B1names, - .numInstanceParms = &B1pTSize, - .instanceParms = B1pTable, - .numModelParms = &B1mPTSize, - .modelParms = B1mPTable, - .flags = DEV_DEFAULT, - -#ifdef XSPICE - .cm_func = NULL, - .num_conn = 0, - .conn = NULL, - .num_param = 0, - .param = NULL, - .num_inst_var = 0, - .inst_var = NULL, -#endif - }, - - .DEVparam = B1param, - .DEVmodParam = B1mParam, - .DEVload = B1load, - .DEVsetup = B1setup, - .DEVunsetup = B1unsetup, - .DEVpzSetup = B1setup, - .DEVtemperature = B1temp, - .DEVtrunc = B1trunc, - .DEVfindBranch = NULL, - .DEVacLoad = B1acLoad, - .DEVaccept = NULL, - .DEVdestroy = NULL, - .DEVmodDelete = NULL, - .DEVdelete = NULL, - .DEVsetic = B1getic, - .DEVask = B1ask, - .DEVmodAsk = B1mAsk, - .DEVpzLoad = B1pzLoad, - .DEVconvTest = B1convTest, - .DEVsenSetup = NULL, - .DEVsenLoad = NULL, - .DEVsenUpdate = NULL, - .DEVsenAcLoad = NULL, - .DEVsenPrint = NULL, - .DEVsenTrunc = NULL, - .DEVdisto = B1disto, - .DEVnoise = B1noise, - .DEVsoaCheck = NULL, - .DEVinstSize = &B1iSize, - .DEVmodSize = &B1mSize, - -#ifdef CIDER - .DEVdump = NULL, - .DEVacct = NULL, -#endif -}; - - -SPICEdev * -get_bsim1_info(void) -{ - return &B1info; -} diff --git a/src/spicelib/devices/bsim1/bsim1init.h b/src/spicelib/devices/bsim1/bsim1init.h deleted file mode 100644 index c3a971a3a..000000000 --- a/src/spicelib/devices/bsim1/bsim1init.h +++ /dev/null @@ -1,13 +0,0 @@ -#ifndef _BSIM1INIT_H -#define _BSIM1INIT_H - -extern IFparm B1pTable[ ]; -extern IFparm B1mPTable[ ]; -extern char *B1names[ ]; -extern int B1pTSize; -extern int B1mPTSize; -extern int B1nSize; -extern int B1iSize; -extern int B1mSize; - -#endif diff --git a/src/spicelib/devices/bsim1/bsim1itf.h b/src/spicelib/devices/bsim1/bsim1itf.h deleted file mode 100644 index 9964a7c2a..000000000 --- a/src/spicelib/devices/bsim1/bsim1itf.h +++ /dev/null @@ -1,9 +0,0 @@ -/********** -Copyright 1990 Regents of the University of California. All rights reserved. -**********/ -#ifndef DEV_BSIM1 -#define DEV_BSIM1 - -SPICEdev *get_bsim1_info(void); - -#endif diff --git a/src/spicelib/devices/bsim2/Makefile.am b/src/spicelib/devices/bsim2/Makefile.am deleted file mode 100644 index 7de50ac10..000000000 --- a/src/spicelib/devices/bsim2/Makefile.am +++ /dev/null @@ -1,33 +0,0 @@ -## Process this file with automake to produce Makefile.in - -noinst_LTLIBRARIES = libbsim2.la - -libbsim2_la_SOURCES = \ - b2.c \ - b2acld.c \ - b2ask.c \ - b2cvtest.c \ - b2eval.c \ - b2getic.c \ - b2ld.c \ - b2mask.c \ - b2moscap.c \ - b2mpar.c \ - b2noi.c \ - b2par.c \ - b2pzld.c \ - b2set.c \ - b2temp.c \ - b2trunc.c \ - bsim2def.h \ - bsim2ext.h \ - bsim2init.c \ - bsim2init.h \ - bsim2itf.h - - - -AM_CPPFLAGS = @AM_CPPFLAGS@ -I$(top_srcdir)/src/include -AM_CFLAGS = $(STATIC) - -MAINTAINERCLEANFILES = Makefile.in diff --git a/src/spicelib/devices/bsim2/b2.c b/src/spicelib/devices/bsim2/b2.c deleted file mode 100644 index eadba857a..000000000 --- a/src/spicelib/devices/bsim2/b2.c +++ /dev/null @@ -1,214 +0,0 @@ -/********** -Copyright 1990 Regents of the University of California. All rights reserved. -Author: 1988 Min-Chie Jeng, Hong J. Park, Thomas L. Quarles -**********/ - -#include "ngspice/ngspice.h" -#include "ngspice/devdefs.h" -#include "bsim2def.h" -#include "ngspice/suffix.h" - -IFparm B2pTable[] = { /* parameters */ - IOP( "l", BSIM2_L, IF_REAL , "Length"), - IOP( "w", BSIM2_W, IF_REAL , "Width"), - IOP( "m", BSIM2_M, IF_REAL , "Parallel Multiplier"), - IOP( "ad", BSIM2_AD, IF_REAL , "Drain area"), - IOP( "as", BSIM2_AS, IF_REAL , "Source area"), - IOP( "pd", BSIM2_PD, IF_REAL , "Drain perimeter"), - IOP( "ps", BSIM2_PS, IF_REAL , "Source perimeter"), - IOP( "nrd", BSIM2_NRD, IF_REAL , "Number of squares in drain"), - IOP( "nrs", BSIM2_NRS, IF_REAL , "Number of squares in source"), - IOP( "off", BSIM2_OFF, IF_FLAG , "Device is initially off"), - IOP( "vds", BSIM2_IC_VDS, IF_REAL , "Initial D-S voltage"), - IOP( "vgs", BSIM2_IC_VGS, IF_REAL , "Initial G-S voltage"), - IOP( "vbs", BSIM2_IC_VBS, IF_REAL , "Initial B-S voltage"), - IP( "ic", BSIM2_IC, IF_VECTOR , "Vector of DS,GS,BS initial voltages") -}; - -IFparm B2mPTable[] = { /* model parameters */ - IOP( "vfb", BSIM2_MOD_VFB0, IF_REAL,"Flat band voltage"), - IOP( "lvfb", BSIM2_MOD_VFBL, IF_REAL, "Length dependence of vfb"), - IOP( "wvfb", BSIM2_MOD_VFBW, IF_REAL, "Width dependence of vfb"), - IOP( "phi", BSIM2_MOD_PHI0, IF_REAL, - "Strong inversion surface potential "), - IOP( "lphi", BSIM2_MOD_PHIL, IF_REAL, "Length dependence of phi"), - IOP( "wphi", BSIM2_MOD_PHIW, IF_REAL, "Width dependence of phi"), - IOP( "k1", BSIM2_MOD_K10, IF_REAL, "Bulk effect coefficient 1"), - IOP( "lk1", BSIM2_MOD_K1L, IF_REAL, "Length dependence of k1"), - IOP( "wk1", BSIM2_MOD_K1W, IF_REAL, "Width dependence of k1"), - IOP( "k2", BSIM2_MOD_K20, IF_REAL, "Bulk effect coefficient 2"), - IOP( "lk2", BSIM2_MOD_K2L, IF_REAL, "Length dependence of k2"), - IOP( "wk2", BSIM2_MOD_K2W, IF_REAL, "Width dependence of k2"), - IOP( "eta0", BSIM2_MOD_ETA00, IF_REAL, - "VDS dependence of threshold voltage at VDD=0"), - IOP( "leta0", BSIM2_MOD_ETA0L, IF_REAL, "Length dependence of eta0"), - IOP( "weta0", BSIM2_MOD_ETA0W, IF_REAL, "Width dependence of eta0"), - IOP( "etab", BSIM2_MOD_ETAB0, IF_REAL, "VBS dependence of eta"), - IOP( "letab", BSIM2_MOD_ETABL, IF_REAL, "Length dependence of etab"), - IOP( "wetab", BSIM2_MOD_ETABW, IF_REAL, "Width dependence of etab"), - IOP( "dl", BSIM2_MOD_DELTAL, IF_REAL, "Channel length reduction in um"), - IOP( "dw", BSIM2_MOD_DELTAW, IF_REAL, "Channel width reduction in um"), - IOP( "mu0", BSIM2_MOD_MOB00, IF_REAL, - "Low-field mobility, at VDS=0 VGS=VTH"), - IOP( "mu0b", BSIM2_MOD_MOB0B0, IF_REAL, - "VBS dependence of low-field mobility"), - IOP( "lmu0b", BSIM2_MOD_MOB0BL, IF_REAL, "Length dependence of mu0b"), - IOP( "wmu0b", BSIM2_MOD_MOB0BW, IF_REAL, "Width dependence of mu0b"), - IOP( "mus0", BSIM2_MOD_MOBS00, IF_REAL, "Mobility at VDS=VDD VGS=VTH"), - IOP( "lmus0", BSIM2_MOD_MOBS0L, IF_REAL, "Length dependence of mus0"), - IOP( "wmus0", BSIM2_MOD_MOBS0W, IF_REAL, "Width dependence of mus"), - IOP( "musb", BSIM2_MOD_MOBSB0, IF_REAL, "VBS dependence of mus"), - IOP( "lmusb", BSIM2_MOD_MOBSBL, IF_REAL, "Length dependence of musb"), - IOP( "wmusb", BSIM2_MOD_MOBSBW, IF_REAL, "Width dependence of musb"), - IOP( "mu20", BSIM2_MOD_MOB200, IF_REAL, - "VDS dependence of mu in tanh term"), - IOP( "lmu20", BSIM2_MOD_MOB20L, IF_REAL, "Length dependence of mu20"), - IOP( "wmu20", BSIM2_MOD_MOB20W, IF_REAL, "Width dependence of mu20"), - IOP( "mu2b", BSIM2_MOD_MOB2B0, IF_REAL, "VBS dependence of mu2"), - IOP( "lmu2b", BSIM2_MOD_MOB2BL, IF_REAL, "Length dependence of mu2b"), - IOP( "wmu2b", BSIM2_MOD_MOB2BW, IF_REAL, "Width dependence of mu2b"), - IOP( "mu2g", BSIM2_MOD_MOB2G0, IF_REAL, "VGS dependence of mu2"), - IOP( "lmu2g", BSIM2_MOD_MOB2GL, IF_REAL, "Length dependence of mu2g"), - IOP( "wmu2g", BSIM2_MOD_MOB2GW, IF_REAL, "Width dependence of mu2g"), - IOP( "mu30", BSIM2_MOD_MOB300, IF_REAL, - "VDS dependence of mu in linear term"), - IOP( "lmu30", BSIM2_MOD_MOB30L, IF_REAL, "Length dependence of mu30"), - IOP( "wmu30", BSIM2_MOD_MOB30W, IF_REAL, "Width dependence of mu30"), - IOP( "mu3b", BSIM2_MOD_MOB3B0, IF_REAL, "VBS dependence of mu3"), - IOP( "lmu3b", BSIM2_MOD_MOB3BL, IF_REAL, "Length dependence of mu3b"), - IOP( "wmu3b", BSIM2_MOD_MOB3BW, IF_REAL, "Width dependence of mu3b"), - IOP( "mu3g", BSIM2_MOD_MOB3G0, IF_REAL, "VGS dependence of mu3"), - IOP( "lmu3g", BSIM2_MOD_MOB3GL, IF_REAL, "Length dependence of mu3g"), - IOP( "wmu3g", BSIM2_MOD_MOB3GW, IF_REAL, "Width dependence of mu3g"), - IOP( "mu40", BSIM2_MOD_MOB400, IF_REAL, - "VDS dependence of mu in linear term"), - IOP( "lmu40", BSIM2_MOD_MOB40L, IF_REAL, "Length dependence of mu40"), - IOP( "wmu40", BSIM2_MOD_MOB40W, IF_REAL, "Width dependence of mu40"), - IOP( "mu4b", BSIM2_MOD_MOB4B0, IF_REAL, "VBS dependence of mu4"), - IOP( "lmu4b", BSIM2_MOD_MOB4BL, IF_REAL, "Length dependence of mu4b"), - IOP( "wmu4b", BSIM2_MOD_MOB4BW, IF_REAL, "Width dependence of mu4b"), - IOP( "mu4g", BSIM2_MOD_MOB4G0, IF_REAL, "VGS dependence of mu4"), - IOP( "lmu4g", BSIM2_MOD_MOB4GL, IF_REAL, "Length dependence of mu4g"), - IOP( "wmu4g", BSIM2_MOD_MOB4GW, IF_REAL, "Width dependence of mu4g"), - IOP( "ua0", BSIM2_MOD_UA00, IF_REAL, - "Linear VGS dependence of mobility"), - IOP( "lua0", BSIM2_MOD_UA0L, IF_REAL, "Length dependence of ua0"), - IOP( "wua0", BSIM2_MOD_UA0W, IF_REAL, "Width dependence of ua0"), - IOP( "uab", BSIM2_MOD_UAB0, IF_REAL, "VBS dependence of ua"), - IOP( "luab", BSIM2_MOD_UABL, IF_REAL, "Length dependence of uab"), - IOP( "wuab", BSIM2_MOD_UABW, IF_REAL, "Width dependence of uab"), - IOP( "ub0", BSIM2_MOD_UB00, IF_REAL, - "Quadratic VGS dependence of mobility"), - IOP( "lub0", BSIM2_MOD_UB0L, IF_REAL, "Length dependence of ub0"), - IOP( "wub0", BSIM2_MOD_UB0W, IF_REAL, "Width dependence of ub0"), - IOP( "ubb", BSIM2_MOD_UBB0, IF_REAL, "VBS dependence of ub"), - IOP( "lubb", BSIM2_MOD_UBBL, IF_REAL, "Length dependence of ubb"), - IOP( "wubb", BSIM2_MOD_UBBW, IF_REAL, "Width dependence of ubb"), - IOP( "u10", BSIM2_MOD_U100, IF_REAL, "VDS depence of mobility"), - IOP( "lu10", BSIM2_MOD_U10L, IF_REAL, "Length dependence of u10"), - IOP( "wu10", BSIM2_MOD_U10W, IF_REAL, "Width dependence of u10"), - IOP( "u1b", BSIM2_MOD_U1B0, IF_REAL, "VBS depence of u1"), - IOP( "lu1b", BSIM2_MOD_U1BL, IF_REAL, "Length depence of u1b"), - IOP( "wu1b", BSIM2_MOD_U1BW, IF_REAL, "Width depence of u1b"), - IOP( "u1d", BSIM2_MOD_U1D0, IF_REAL, "VDS depence of u1"), - IOP( "lu1d", BSIM2_MOD_U1DL, IF_REAL, "Length depence of u1d"), - IOP( "wu1d", BSIM2_MOD_U1DW, IF_REAL, "Width depence of u1d"), - IOP( "n0", BSIM2_MOD_N00, IF_REAL, - "Subthreshold slope at VDS=0 VBS=0"), - IOP( "ln0", BSIM2_MOD_N0L, IF_REAL, "Length dependence of n0"), - IOP( "wn0", BSIM2_MOD_N0W, IF_REAL, "Width dependence of n0"), - IOP( "nb", BSIM2_MOD_NB0, IF_REAL, "VBS dependence of n"), - IOP( "lnb", BSIM2_MOD_NBL, IF_REAL, "Length dependence of nb"), - IOP( "wnb", BSIM2_MOD_NBW, IF_REAL, "Width dependence of nb"), - IOP( "nd", BSIM2_MOD_ND0, IF_REAL, "VDS dependence of n"), - IOP( "lnd", BSIM2_MOD_NDL, IF_REAL, "Length dependence of nd"), - IOP( "wnd", BSIM2_MOD_NDW, IF_REAL, "Width dependence of nd"), - IOP( "vof0", BSIM2_MOD_VOF00, IF_REAL, - "Threshold voltage offset AT VDS=0 VBS=0"), - IOP( "lvof0", BSIM2_MOD_VOF0L, IF_REAL, "Length dependence of vof0"), - IOP( "wvof0", BSIM2_MOD_VOF0W, IF_REAL, "Width dependence of vof0"), - IOP( "vofb", BSIM2_MOD_VOFB0, IF_REAL, "VBS dependence of vof"), - IOP( "lvofb", BSIM2_MOD_VOFBL, IF_REAL, "Length dependence of vofb"), - IOP( "wvofb", BSIM2_MOD_VOFBW, IF_REAL, "Width dependence of vofb"), - IOP( "vofd", BSIM2_MOD_VOFD0, IF_REAL, "VDS dependence of vof"), - IOP( "lvofd", BSIM2_MOD_VOFDL, IF_REAL, "Length dependence of vofd"), - IOP( "wvofd", BSIM2_MOD_VOFDW, IF_REAL, "Width dependence of vofd"), - IOP( "ai0", BSIM2_MOD_AI00, IF_REAL, - "Pre-factor of hot-electron effect."), - IOP( "lai0", BSIM2_MOD_AI0L, IF_REAL, "Length dependence of ai0"), - IOP( "wai0", BSIM2_MOD_AI0W, IF_REAL, "Width dependence of ai0"), - IOP( "aib", BSIM2_MOD_AIB0, IF_REAL, "VBS dependence of ai"), - IOP( "laib", BSIM2_MOD_AIBL, IF_REAL, "Length dependence of aib"), - IOP( "waib", BSIM2_MOD_AIBW, IF_REAL, "Width dependence of aib"), - IOP( "bi0", BSIM2_MOD_BI00, IF_REAL, - "Exponential factor of hot-electron effect."), - IOP( "lbi0", BSIM2_MOD_BI0L, IF_REAL, "Length dependence of bi0"), - IOP( "wbi0", BSIM2_MOD_BI0W, IF_REAL, "Width dependence of bi0"), - IOP( "bib", BSIM2_MOD_BIB0, IF_REAL, "VBS dependence of bi"), - IOP( "lbib", BSIM2_MOD_BIBL, IF_REAL, "Length dependence of bib"), - IOP( "wbib", BSIM2_MOD_BIBW, IF_REAL, "Width dependence of bib"), - IOP( "vghigh", BSIM2_MOD_VGHIGH0, IF_REAL, - "Upper bound of the cubic spline function."), - IOP( "lvghigh", BSIM2_MOD_VGHIGHL, IF_REAL, - "Length dependence of vghigh"), - IOP( "wvghigh", BSIM2_MOD_VGHIGHW, IF_REAL, - "Width dependence of vghigh"), - IOP( "vglow", BSIM2_MOD_VGLOW0, IF_REAL, - "Lower bound of the cubic spline function."), - IOP( "lvglow", BSIM2_MOD_VGLOWL, IF_REAL, - "Length dependence of vglow"), - IOP( "wvglow", BSIM2_MOD_VGLOWW, IF_REAL, - "Width dependence of vglow"), - IOP( "tox", BSIM2_MOD_TOX, IF_REAL, "Gate oxide thickness in um"), - IOP( "temp", BSIM2_MOD_TEMP, IF_REAL, "Temperature in degree Celcius"), - IOP( "vdd", BSIM2_MOD_VDD, IF_REAL, "Maximum Vds "), - IOP( "vgg", BSIM2_MOD_VGG, IF_REAL, "Maximum Vgs "), - IOP( "vbb", BSIM2_MOD_VBB, IF_REAL, "Maximum Vbs "), - IOPA( "cgso", BSIM2_MOD_CGSO, IF_REAL, - "Gate source overlap capacitance per unit channel width(m)"), - IOPA( "cgdo", BSIM2_MOD_CGDO, IF_REAL, - "Gate drain overlap capacitance per unit channel width(m)"), - IOPA( "cgbo", BSIM2_MOD_CGBO, IF_REAL, - "Gate bulk overlap capacitance per unit channel length(m)"), - IOP( "xpart", BSIM2_MOD_XPART, IF_REAL, - "Flag for channel charge partitioning"), - IOP( "rsh", BSIM2_MOD_RSH, IF_REAL, - "Source drain diffusion sheet resistance in ohm per square"), - IOP( "js", BSIM2_MOD_JS, IF_REAL, - "Source drain junction saturation current per unit area"), - IOP( "pb", BSIM2_MOD_PB, IF_REAL, - "Source drain junction built in potential"), - IOPA( "mj", BSIM2_MOD_MJ, IF_REAL, - "Source drain bottom junction capacitance grading coefficient"), - IOPA( "pbsw", BSIM2_MOD_PBSW, IF_REAL, - "Source drain side junction capacitance built in potential"), - IOPA( "mjsw", BSIM2_MOD_MJSW, IF_REAL, - "Source drain side junction capacitance grading coefficient"), - IOPA( "cj", BSIM2_MOD_CJ, IF_REAL, - "Source drain bottom junction capacitance per unit area"), - IOPA( "cjsw", BSIM2_MOD_CJSW, IF_REAL, - "Source drain side junction capacitance per unit area"), - IOP( "wdf", BSIM2_MOD_DEFWIDTH, IF_REAL, - "Default width of source drain diffusion in um"), - IOP( "dell", BSIM2_MOD_DELLENGTH, IF_REAL, - "Length reduction of source drain diffusion"), - IOP("kf", BSIM2_MOD_KF, IF_REAL ,"Flicker noise coefficient"), - IOP("af", BSIM2_MOD_AF, IF_REAL ,"Flicker noise exponent"), - IP( "nmos", BSIM2_MOD_NMOS, IF_FLAG, - "Flag to indicate NMOS"), - IP( "pmos", BSIM2_MOD_PMOS, IF_FLAG, - "Flag to indicate PMOS"), -}; - -char *B2names[] = { - "Drain", - "Gate", - "Source", - "Bulk" -}; - -int B2nSize = NUMELEMS(B2names); -int B2pTSize = NUMELEMS(B2pTable); -int B2mPTSize = NUMELEMS(B2mPTable); -int B2iSize = sizeof(B2instance); -int B2mSize = sizeof(B2model); diff --git a/src/spicelib/devices/bsim2/b2acld.c b/src/spicelib/devices/bsim2/b2acld.c deleted file mode 100644 index 5368feece..000000000 --- a/src/spicelib/devices/bsim2/b2acld.c +++ /dev/null @@ -1,152 +0,0 @@ -/********** -Copyright 1990 Regents of the University of California. All rights reserved. -Author: 1985 Hong J. Park, Thomas L. Quarles -**********/ -/* - */ - -#include "ngspice/ngspice.h" -#include "ngspice/cktdefs.h" -#include "bsim2def.h" -#include "ngspice/sperror.h" -#include "ngspice/suffix.h" - - -int -B2acLoad(GENmodel *inModel, CKTcircuit *ckt) -{ - B2model *model = (B2model*)inModel; - B2instance *here; - int xnrm; - int xrev; - double gdpr; - double gspr; - double gm; - double gds; - double gmbs; - double gbd; - double gbs; - double capbd; - double capbs; - double xcggb; - double xcgdb; - double xcgsb; - double xcbgb; - double xcbdb; - double xcbsb; - double xcddb; - double xcssb; - double xcdgb; - double xcsgb; - double xcdsb; - double xcsdb; - double cggb; - double cgdb; - double cgsb; - double cbgb; - double cbdb; - double cbsb; - double cddb; - double cdgb; - double cdsb; - double omega; /* angular fequency of the signal */ - - double m; /* parallel multiplier */ - - omega = ckt->CKTomega; - for( ; model != NULL; model = B2nextModel(model)) { - for(here = B2instances(model); here!= NULL; - here = B2nextInstance(here)) { - - if (here->B2mode >= 0) { - xnrm=1; - xrev=0; - } else { - xnrm=0; - xrev=1; - } - gdpr=here->B2drainConductance; - gspr=here->B2sourceConductance; - gm= *(ckt->CKTstate0 + here->B2gm); - gds= *(ckt->CKTstate0 + here->B2gds); - gmbs= *(ckt->CKTstate0 + here->B2gmbs); - gbd= *(ckt->CKTstate0 + here->B2gbd); - gbs= *(ckt->CKTstate0 + here->B2gbs); - capbd= *(ckt->CKTstate0 + here->B2capbd); - capbs= *(ckt->CKTstate0 + here->B2capbs); - /* - * charge oriented model parameters - */ - - cggb = *(ckt->CKTstate0 + here->B2cggb); - cgsb = *(ckt->CKTstate0 + here->B2cgsb); - cgdb = *(ckt->CKTstate0 + here->B2cgdb); - - cbgb = *(ckt->CKTstate0 + here->B2cbgb); - cbsb = *(ckt->CKTstate0 + here->B2cbsb); - cbdb = *(ckt->CKTstate0 + here->B2cbdb); - - cdgb = *(ckt->CKTstate0 + here->B2cdgb); - cdsb = *(ckt->CKTstate0 + here->B2cdsb); - cddb = *(ckt->CKTstate0 + here->B2cddb); - - xcdgb = (cdgb - here->pParam->B2GDoverlapCap) * omega; - xcddb = (cddb + capbd + here->pParam->B2GDoverlapCap) * omega; - xcdsb = cdsb * omega; - xcsgb = -(cggb + cbgb + cdgb + here->pParam->B2GSoverlapCap) - * omega; - xcsdb = -(cgdb + cbdb + cddb) * omega; - xcssb = (capbs + here->pParam->B2GSoverlapCap - - (cgsb+cbsb+cdsb)) * omega; - xcggb = (cggb + here->pParam->B2GDoverlapCap - + here->pParam->B2GSoverlapCap - + here->pParam->B2GBoverlapCap) * omega; - xcgdb = (cgdb - here->pParam->B2GDoverlapCap ) * omega; - xcgsb = (cgsb - here->pParam->B2GSoverlapCap) * omega; - xcbgb = (cbgb - here->pParam->B2GBoverlapCap) * omega; - xcbdb = (cbdb - capbd ) * omega; - xcbsb = (cbsb - capbs ) * omega; - - m = here->B2m; - - *(here->B2GgPtr +1) += m * (xcggb); - *(here->B2BbPtr +1) += m * (-xcbgb-xcbdb-xcbsb); - *(here->B2DPdpPtr +1) += m * (xcddb); - *(here->B2SPspPtr +1) += m * (xcssb); - *(here->B2GbPtr +1) += m * (-xcggb-xcgdb-xcgsb); - *(here->B2GdpPtr +1) += m * (xcgdb); - *(here->B2GspPtr +1) += m * (xcgsb); - *(here->B2BgPtr +1) += m * (xcbgb); - *(here->B2BdpPtr +1) += m * (xcbdb); - *(here->B2BspPtr +1) += m * (xcbsb); - *(here->B2DPgPtr +1) += m * (xcdgb); - *(here->B2DPbPtr +1) += m * (-xcdgb-xcddb-xcdsb); - *(here->B2DPspPtr +1) += m * (xcdsb); - *(here->B2SPgPtr +1) += m * (xcsgb); - *(here->B2SPbPtr +1) += m * (-xcsgb-xcsdb-xcssb); - *(here->B2SPdpPtr +1) += m * (xcsdb); - *(here->B2DdPtr) += m * (gdpr); - *(here->B2SsPtr) += m * (gspr); - *(here->B2BbPtr) += m * (gbd+gbs); - *(here->B2DPdpPtr) += m * (gdpr+gds+gbd+xrev*(gm+gmbs)); - *(here->B2SPspPtr) += m * (gspr+gds+gbs+xnrm*(gm+gmbs)); - *(here->B2DdpPtr) -= m * (gdpr); - *(here->B2SspPtr) -= m * (gspr); - *(here->B2BdpPtr) -= m * (gbd); - *(here->B2BspPtr) -= m * (gbs); - *(here->B2DPdPtr) -= m * (gdpr); - *(here->B2DPgPtr) += m * ((xnrm-xrev)*gm); - *(here->B2DPbPtr) += m * (-gbd+(xnrm-xrev)*gmbs); - *(here->B2DPspPtr) += m * (-gds-xnrm*(gm+gmbs)); - *(here->B2SPgPtr) += m * (-(xnrm-xrev)*gm); - *(here->B2SPsPtr) -= m * (gspr); - *(here->B2SPbPtr) += m * (-gbs-(xnrm-xrev)*gmbs); - *(here->B2SPdpPtr) += m * (-gds-xrev*(gm+gmbs)); - - } - } -return(OK); -} - - - diff --git a/src/spicelib/devices/bsim2/b2ask.c b/src/spicelib/devices/bsim2/b2ask.c deleted file mode 100644 index debc206d2..000000000 --- a/src/spicelib/devices/bsim2/b2ask.c +++ /dev/null @@ -1,225 +0,0 @@ -/********** -Copyright 1990 Regents of the University of California. All rights reserved. -Author: 1988 Hong J. Park -**********/ - -#include "ngspice/ngspice.h" -#include "ngspice/ifsim.h" -#include "ngspice/cktdefs.h" -#include "ngspice/devdefs.h" -#include "bsim2def.h" -#include "ngspice/sperror.h" -#include "ngspice/suffix.h" - -/*ARGSUSED*/ -int -B2ask(CKTcircuit *ckt, GENinstance *inst, int which, IFvalue *value, - IFvalue *select) -{ - B2instance *here = (B2instance*)inst; - - NG_IGNORE(select); - - switch(which) { - case BSIM2_L: - value->rValue = here->B2l; - return(OK); - case BSIM2_W: - value->rValue = here->B2w; - value->rValue *= here->B2m; - return(OK); - case BSIM2_M: - value->rValue = here->B2m; - return(OK); - case BSIM2_AS: - value->rValue = here->B2sourceArea; - value->rValue *= here->B2m; - return(OK); - case BSIM2_AD: - value->rValue = here->B2drainArea; - value->rValue *= here->B2m; - return(OK); - case BSIM2_PS: - value->rValue = here->B2sourcePerimeter; - value->rValue *= here->B2m; - return(OK); - case BSIM2_PD: - value->rValue = here->B2drainPerimeter; - value->rValue *= here->B2m; - return(OK); - case BSIM2_NRS: - value->rValue = here->B2sourceSquares; - value->rValue *= here->B2m; - return(OK); - case BSIM2_NRD: - value->rValue = here->B2drainSquares; - value->rValue *= here->B2m; - return(OK); - case BSIM2_OFF: - value->rValue = here->B2off; - return(OK); - case BSIM2_IC_VBS: - value->rValue = here->B2icVBS; - return(OK); - case BSIM2_IC_VDS: - value->rValue = here->B2icVDS; - return(OK); - case BSIM2_IC_VGS: - value->rValue = here->B2icVGS; - return(OK); - case BSIM2_DNODE: - value->iValue = here->B2dNode; - return(OK); - case BSIM2_GNODE: - value->iValue = here->B2gNode; - return(OK); - case BSIM2_SNODE: - value->iValue = here->B2sNode; - return(OK); - case BSIM2_BNODE: - value->iValue = here->B2bNode; - return(OK); - case BSIM2_DNODEPRIME: - value->iValue = here->B2dNodePrime; - return(OK); - case BSIM2_SNODEPRIME: - value->iValue = here->B2sNodePrime; - return(OK); - case BSIM2_SOURCECONDUCT: - value->rValue = here->B2sourceConductance; - value->rValue *= here->B2m; - return(OK); - case BSIM2_DRAINCONDUCT: - value->rValue = here->B2drainConductance; - value->rValue *= here->B2m; - return(OK); - case BSIM2_VBD: - value->rValue = *(ckt->CKTstate0 + here->B2vbd); - return(OK); - case BSIM2_VBS: - value->rValue = *(ckt->CKTstate0 + here->B2vbs); - return(OK); - case BSIM2_VGS: - value->rValue = *(ckt->CKTstate0 + here->B2vgs); - return(OK); - case BSIM2_VDS: - value->rValue = *(ckt->CKTstate0 + here->B2vds); - return(OK); - case BSIM2_CD: - value->rValue = *(ckt->CKTstate0 + here->B2cd); - value->rValue *= here->B2m; - return(OK); - case BSIM2_CBS: - value->rValue = *(ckt->CKTstate0 + here->B2cbs); - value->rValue *= here->B2m; - return(OK); - case BSIM2_CBD: - value->rValue = *(ckt->CKTstate0 + here->B2cbd); - value->rValue *= here->B2m; - return(OK); - case BSIM2_GM: - value->rValue = *(ckt->CKTstate0 + here->B2gm); - value->rValue *= here->B2m; - return(OK); - case BSIM2_GDS: - value->rValue = *(ckt->CKTstate0 + here->B2gds); - value->rValue *= here->B2m; - return(OK); - case BSIM2_GMBS: - value->rValue = *(ckt->CKTstate0 + here->B2gmbs); - value->rValue *= here->B2m; - return(OK); - case BSIM2_GBD: - value->rValue = *(ckt->CKTstate0 + here->B2gbd); - value->rValue *= here->B2m; - return(OK); - case BSIM2_GBS: - value->rValue = *(ckt->CKTstate0 + here->B2gbs); - value->rValue *= here->B2m; - return(OK); - case BSIM2_QB: - value->rValue = *(ckt->CKTstate0 + here->B2qb); - value->rValue *= here->B2m; - return(OK); - case BSIM2_CQB: - value->rValue = *(ckt->CKTstate0 + here->B2cqb); - value->rValue *= here->B2m; - return(OK); - case BSIM2_QG: - value->rValue = *(ckt->CKTstate0 + here->B2qg); - value->rValue *= here->B2m; - return(OK); - case BSIM2_CQG: - value->rValue = *(ckt->CKTstate0 + here->B2cqg); - value->rValue *= here->B2m; - return(OK); - case BSIM2_QD: - value->rValue = *(ckt->CKTstate0 + here->B2qd); - value->rValue *= here->B2m; - return(OK); - case BSIM2_CQD: - value->rValue = *(ckt->CKTstate0 + here->B2cqd); - value->rValue *= here->B2m; - return(OK); - case BSIM2_CGG: - value->rValue = *(ckt->CKTstate0 + here->B2cggb); - value->rValue *= here->B2m; - return(OK); - case BSIM2_CGD: - value->rValue = *(ckt->CKTstate0 + here->B2cgdb); - value->rValue *= here->B2m; - return(OK); - case BSIM2_CGS: - value->rValue = *(ckt->CKTstate0 + here->B2cgsb); - value->rValue *= here->B2m; - return(OK); - case BSIM2_CBG: - value->rValue = *(ckt->CKTstate0 + here->B2cbgb); - value->rValue *= here->B2m; - return(OK); - case BSIM2_CAPBD: - value->rValue = *(ckt->CKTstate0 + here->B2capbd); - value->rValue *= here->B2m; - return(OK); - case BSIM2_CQBD: - value->rValue = *(ckt->CKTstate0 + here->B2cqbd); - value->rValue *= here->B2m; - return(OK); - case BSIM2_CAPBS: - value->rValue = *(ckt->CKTstate0 + here->B2capbs); - value->rValue *= here->B2m; - return(OK); - case BSIM2_CQBS: - value->rValue = *(ckt->CKTstate0 + here->B2cqbs); - value->rValue *= here->B2m; - return(OK); - case BSIM2_CDG: - value->rValue = *(ckt->CKTstate0 + here->B2cdgb); - value->rValue *= here->B2m; - return(OK); - case BSIM2_CDD: - value->rValue = *(ckt->CKTstate0 + here->B2cddb); - value->rValue *= here->B2m; - return(OK); - case BSIM2_CDS: - value->rValue = *(ckt->CKTstate0 + here->B2cdsb); - value->rValue *= here->B2m; - return(OK); - case BSIM2_VON: - value->rValue = *(ckt->CKTstate0 + here->B2vono); - return(OK); - case BSIM2_QBS: - value->rValue = *(ckt->CKTstate0 + here->B2qbs); - value->rValue *= here->B2m; - return(OK); - case BSIM2_QBD: - value->rValue = *(ckt->CKTstate0 + here->B2qbd); - value->rValue *= here->B2m; - return(OK); - default: - return(E_BADPARM); - } - /* NOTREACHED */ -} - - diff --git a/src/spicelib/devices/bsim2/b2cvtest.c b/src/spicelib/devices/bsim2/b2cvtest.c deleted file mode 100644 index 5ebb0b2f9..000000000 --- a/src/spicelib/devices/bsim2/b2cvtest.c +++ /dev/null @@ -1,115 +0,0 @@ -/********** -Copyright 1990 Regents of the University of California. All rights reserved. -Author: 1985 Hong J. Park, Thomas L. Quarles -**********/ - -#include "ngspice/ngspice.h" -#include "ngspice/cktdefs.h" -#include "bsim2def.h" -#include "ngspice/trandefs.h" -#include "ngspice/const.h" -#include "ngspice/devdefs.h" -#include "ngspice/sperror.h" -#include "ngspice/suffix.h" - -int -B2convTest(GENmodel *inModel, CKTcircuit *ckt) - - /* actually load the current value into the - * sparse matrix previously provided - */ -{ - B2model *model = (B2model*)inModel; - B2instance *here; - double cbd; - double cbhat; - double cbs; - double cd; - double cdhat; - double delvbd; - double delvbs; - double delvds; - double delvgd; - double delvgs; - double tol; - double vbd; - double vbs; - double vds; - double vgd; - double vgdo; - double vgs; - - - /* loop through all the B2 device models */ - for( ; model != NULL; model = B2nextModel(model)) { - - /* loop through all the instances of the model */ - for (here = B2instances(model); here != NULL ; - here=B2nextInstance(here)) { - - vbs = model->B2type * ( - *(ckt->CKTrhsOld+here->B2bNode) - - *(ckt->CKTrhsOld+here->B2sNodePrime)); - vgs = model->B2type * ( - *(ckt->CKTrhsOld+here->B2gNode) - - *(ckt->CKTrhsOld+here->B2sNodePrime)); - vds = model->B2type * ( - *(ckt->CKTrhsOld+here->B2dNodePrime) - - *(ckt->CKTrhsOld+here->B2sNodePrime)); - vbd=vbs-vds; - vgd=vgs-vds; - vgdo = *(ckt->CKTstate0 + here->B2vgs) - - *(ckt->CKTstate0 + here->B2vds); - delvbs = vbs - *(ckt->CKTstate0 + here->B2vbs); - delvbd = vbd - *(ckt->CKTstate0 + here->B2vbd); - delvgs = vgs - *(ckt->CKTstate0 + here->B2vgs); - delvds = vds - *(ckt->CKTstate0 + here->B2vds); - delvgd = vgd-vgdo; - - if (here->B2mode >= 0) { - cdhat= - *(ckt->CKTstate0 + here->B2cd) - - *(ckt->CKTstate0 + here->B2gbd) * delvbd + - *(ckt->CKTstate0 + here->B2gmbs) * delvbs + - *(ckt->CKTstate0 + here->B2gm) * delvgs + - *(ckt->CKTstate0 + here->B2gds) * delvds ; - } else { - cdhat= - *(ckt->CKTstate0 + here->B2cd) - - ( *(ckt->CKTstate0 + here->B2gbd) - - *(ckt->CKTstate0 + here->B2gmbs)) * delvbd - - *(ckt->CKTstate0 + here->B2gm) * delvgd + - *(ckt->CKTstate0 + here->B2gds) * delvds; - } - cbhat= - *(ckt->CKTstate0 + here->B2cbs) + - *(ckt->CKTstate0 + here->B2cbd) + - *(ckt->CKTstate0 + here->B2gbd) * delvbd + - *(ckt->CKTstate0 + here->B2gbs) * delvbs ; - - cd = *(ckt->CKTstate0 + here->B2cd); - cbs = *(ckt->CKTstate0 + here->B2cbs); - cbd = *(ckt->CKTstate0 + here->B2cbd); - /* - * check convergence - */ - if ( (here->B2off == 0) || (!(ckt->CKTmode & MODEINITFIX)) ){ - tol=ckt->CKTreltol*MAX(fabs(cdhat),fabs(cd))+ckt->CKTabstol; - if (fabs(cdhat-cd) >= tol) { - ckt->CKTnoncon++; - ckt->CKTtroubleElt = (GENinstance *) here; - return(OK); - } - tol=ckt->CKTreltol*MAX(fabs(cbhat),fabs(cbs+cbd))+ - ckt->CKTabstol; - if (fabs(cbhat-(cbs+cbd)) > tol) { - ckt->CKTnoncon++; - ckt->CKTtroubleElt = (GENinstance *) here; - return(OK); - } - } - } - } - return(OK); -} - diff --git a/src/spicelib/devices/bsim2/b2eval.c b/src/spicelib/devices/bsim2/b2eval.c deleted file mode 100644 index 9284665df..000000000 --- a/src/spicelib/devices/bsim2/b2eval.c +++ /dev/null @@ -1,621 +0,0 @@ -/********** -Copyright 1990 Regents of the University of California. All rights reserved. -Author: 1988 Min-Chie Jeng, Hong J. Park, Thomas L. Quarles -**********/ - -#include "ngspice/ngspice.h" -#include "ngspice/cktdefs.h" -#include "bsim2def.h" -#include "ngspice/trandefs.h" -#include "ngspice/const.h" -#include "ngspice/suffix.h" - -/* This routine evaluates the drain current, its derivatives and the - * charges associated with the gate,bulk and drain terminal - * using the B2 (Berkeley Short-Channel IGFET Model) Equations. - */ -void -B2evaluate(double Vds, double Vbs, double Vgs, B2instance *here, B2model *model, - double *gm, double *gds, double *gmb, double *qg, double *qb, double *qd, - double *cgg,double *cgd,double *cgs, double *cbg, double *cbd, double *cbs, - double *cdg, double *cdd, double *cds, double *Ids, double *von, - double *vdsat, CKTcircuit *ckt) - { - double Vth, Vdsat = 0.0; - double Phisb, T1s, Eta, Gg, Aa, Inv_Aa, U1, U1s, Vc, Kk, SqrtKk; - double dPhisb_dVb, dT1s_dVb, dVth_dVb, dVth_dVd, dAa_dVb, dVc_dVd; - double dVc_dVg, dVc_dVb, dKk_dVc; - double dVdsat_dVd = 0.0, dVdsat_dVg = 0.0, dVdsat_dVb = 0.0; - double dUvert_dVg, dUvert_dVd, dUvert_dVb, Inv_Kk; - double dUtot_dVd, dUtot_dVb, dUtot_dVg, Ai, Bi, Vghigh, Vglow, Vgeff, Vof; - double Vbseff, Vgst, Vgdt, Qbulk, Utot; - double T0, T1, T2, T3, T4, T5, Arg1, Arg2, Exp0 = 0.0, Exp1 = 0.0; - double tmp, tmp1, tmp2, tmp3, Uvert, Beta1, Beta2, Beta0, dGg_dVb; - double T6, T7, T8, T9, n = 0.0, ExpArg, ExpArg1; - double Beta, dQbulk_dVb, dVgdt_dVg, dVgdt_dVd; - double dVbseff_dVb, Ua, Ub, dVgdt_dVb, dQbulk_dVd; - double Con1, Con3, Con4, SqrVghigh, SqrVglow, CubVghigh, CubVglow; - double delta, Coeffa, Coeffb, Coeffc, Coeffd, Inv_Uvert, Inv_Utot; - double Inv_Vdsat, tanh, Sqrsech, dBeta1_dVb, dU1_dVd, dU1_dVg, dU1_dVb; - double Betaeff, FR, dFR_dVd, dFR_dVg, dFR_dVb, Betas, Beta3, Beta4; - double dBeta_dVd, dBeta_dVg, dBeta_dVb, dVgeff_dVg, dVgeff_dVd, dVgeff_dVb; - double dCon3_dVd, dCon3_dVb, dCon4_dVd, dCon4_dVb, dCoeffa_dVd, dCoeffa_dVb; - double dCoeffb_dVd, dCoeffb_dVb, dCoeffc_dVd, dCoeffc_dVb; - double dCoeffd_dVd, dCoeffd_dVb; - int ChargeComputationNeeded; - int valuetypeflag; /* added 3/19/90 JSD */ - - if ((ckt->CKTmode & (MODEAC | MODETRAN)) || - ((ckt->CKTmode & MODETRANOP) && (ckt->CKTmode & MODEUIC)) || - (ckt->CKTmode & MODEINITSMSIG) ) - { ChargeComputationNeeded = 1; - } - else - { ChargeComputationNeeded = 0; - } - - if (Vbs < model->B2vbb2) Vbs = model->B2vbb2; - if (Vgs > model->B2vgg2) Vgs = model->B2vgg2; - if (Vds > model->B2vdd2) Vds = model->B2vdd2; - -/* Threshold Voltage. */ - if (Vbs <= 0.0) - { Phisb = here->pParam->B2phi - Vbs; - dPhisb_dVb = -1.0; - T1s = sqrt(Phisb); - dT1s_dVb = -0.5 / T1s; - } - else - { tmp = here->pParam->B2phi / (here->pParam->B2phi + Vbs); - Phisb = here->pParam->B2phi * tmp; - dPhisb_dVb = -tmp * tmp; - T1s = here->pParam->Phis3 / (here->pParam->B2phi + 0.5 * Vbs); - dT1s_dVb = -0.5 * T1s * T1s / here->pParam->Phis3; - } - - Eta = here->pParam->B2eta0 + here->pParam->B2etaB * Vbs; - Ua = here->pParam->B2ua0 + here->pParam->B2uaB * Vbs; - Ub = here->pParam->B2ub0 + here->pParam->B2ubB * Vbs; - U1s = here->pParam->B2u10 + here->pParam->B2u1B * Vbs; - - Vth = here->pParam->B2vfb + here->pParam->B2phi + here->pParam->B2k1 - * T1s - here->pParam->B2k2 * Phisb - Eta * Vds; - dVth_dVd = -Eta; - dVth_dVb = here->pParam->B2k1 * dT1s_dVb + here->pParam->B2k2 - - here->pParam->B2etaB * Vds; - - Vgst = Vgs - Vth; - - tmp = 1.0 / (1.744 + 0.8364 * Phisb); - Gg = 1.0 - tmp; - dGg_dVb = 0.8364 * tmp * tmp * dPhisb_dVb; - T0 = Gg / T1s; - tmp1 = 0.5 * T0 * here->pParam->B2k1; - Aa = 1.0 + tmp1; - dAa_dVb = (Aa - 1.0) * (dGg_dVb / Gg - dT1s_dVb / T1s); - Inv_Aa = 1.0 / Aa; - - Vghigh = here->pParam->B2vghigh; - Vglow = here->pParam->B2vglow; - - if ((Vgst >= Vghigh) || (here->pParam->B2n0 == 0.0)) - { Vgeff = Vgst; - dVgeff_dVg = 1.0; - dVgeff_dVd = -dVth_dVd; - dVgeff_dVb = -dVth_dVb; - } - else - { Vof = here->pParam->B2vof0 + here->pParam->B2vofB * Vbs - + here->pParam->B2vofD * Vds; - n = here->pParam->B2n0 + here->pParam->B2nB / T1s - + here->pParam->B2nD * Vds; - tmp = 0.5 / (n * model->B2Vtm); - - ExpArg1 = -Vds / model->B2Vtm; - ExpArg1 = MAX(ExpArg1, -30.0); - Exp1 = exp(ExpArg1); - tmp1 = 1.0 - Exp1; - tmp1 = MAX(tmp1, 1.0e-18); - tmp2 = 2.0 * Aa * tmp1; - - if (Vgst <= Vglow) - { - ExpArg = Vgst * tmp; - ExpArg = MAX(ExpArg, -30.0); - Exp0 = exp(0.5 * Vof + ExpArg); - Vgeff = sqrt(tmp2) * model->B2Vtm * Exp0; - T0 = n * model->B2Vtm; - dVgeff_dVg = Vgeff * tmp; - dVgeff_dVd = dVgeff_dVg * (n / tmp1 * Exp1 - dVth_dVd - Vgst - * here->pParam->B2nD / n + T0 * here->pParam->B2vofD); - dVgeff_dVb = dVgeff_dVg * (here->pParam->B2vofB * T0 - - dVth_dVb + here->pParam->B2nB * Vgst - / (n * T1s * T1s) * dT1s_dVb + T0 * Inv_Aa * dAa_dVb); - } - else - { - ExpArg = Vglow * tmp; - ExpArg = MAX(ExpArg, -30.0); - Exp0 = exp(0.5 * Vof + ExpArg); - Vgeff = sqrt(2.0 * Aa * (1.0 - Exp1)) * model->B2Vtm * Exp0; - Con1 = Vghigh; - Con3 = Vgeff; - Con4 = Con3 * tmp; - SqrVghigh = Vghigh * Vghigh; - SqrVglow = Vglow * Vglow; - CubVghigh = Vghigh * SqrVghigh; - CubVglow = Vglow * SqrVglow; - T0 = 2.0 * Vghigh; - T1 = 2.0 * Vglow; - T2 = 3.0 * SqrVghigh; - T3 = 3.0 * SqrVglow; - T4 = Vghigh - Vglow; - T5 = SqrVghigh - SqrVglow; - T6 = CubVghigh - CubVglow; - T7 = Con1 - Con3; - delta = (T1 - T0) * T6 + (T2 - T3) * T5 + (T0 * T3 - T1 * T2) * T4; - delta = 1.0 / delta; - Coeffb = (T1 - Con4 * T0) * T6 + (Con4 * T2 - T3) * T5 - + (T0 * T3 - T1 * T2) * T7; - Coeffc = (Con4 - 1.0) * T6 + (T2 - T3) * T7 + (T3 - Con4 * T2) * T4; - Coeffd = (T1 - T0) * T7 + (1.0 - Con4) * T5 + (Con4 * T0 - T1) * T4; - Coeffa = SqrVghigh * (Coeffc + Coeffd * T0); - Vgeff = (Coeffa + Vgst * (Coeffb + Vgst * (Coeffc + Vgst * Coeffd))) - * delta; - dVgeff_dVg = (Coeffb + Vgst * (2.0 * Coeffc + 3.0 * Vgst * Coeffd)) - * delta; - T7 = Con3 * tmp; - T8 = dT1s_dVb * here->pParam->B2nB / (T1s * T1s * n); - T9 = n * model->B2Vtm; - dCon3_dVd = T7 * (n * Exp1 / tmp1 - Vglow * here->pParam->B2nD - / n + T9 * here->pParam->B2vofD); - dCon3_dVb = T7 * (T9 * Inv_Aa * dAa_dVb + Vglow * T8 - + T9 * here->pParam->B2vofB); - dCon4_dVd = tmp * dCon3_dVd - T7 * here->pParam->B2nD / n; - dCon4_dVb = tmp * dCon3_dVb + T7 * T8; - - dCoeffb_dVd = dCon4_dVd * (T2 * T5 - T0 * T6) + dCon3_dVd - * (T1 * T2 - T0 * T3); - dCoeffc_dVd = dCon4_dVd * (T6 - T2 * T4) + dCon3_dVd * (T3 - T2); - dCoeffd_dVd = dCon4_dVd * (T0 * T4 - T5) + dCon3_dVd * (T0 - T1); - dCoeffa_dVd = SqrVghigh * (dCoeffc_dVd + dCoeffd_dVd * T0); - - dVgeff_dVd = -dVgeff_dVg * dVth_dVd + (dCoeffa_dVd + Vgst - * (dCoeffb_dVd + Vgst * (dCoeffc_dVd + Vgst - * dCoeffd_dVd))) * delta; - - dCoeffb_dVb = dCon4_dVb * (T2 * T5 - T0 * T6) + dCon3_dVb - * (T1 * T2 - T0 * T3); - dCoeffc_dVb = dCon4_dVb * (T6 - T2 * T4) + dCon3_dVb * (T3 - T2); - dCoeffd_dVb = dCon4_dVb * (T0 * T4 - T5) + dCon3_dVb * (T0 - T1); - dCoeffa_dVb = SqrVghigh * (dCoeffc_dVb + dCoeffd_dVb * T0); - - dVgeff_dVb = -dVgeff_dVg * dVth_dVb + (dCoeffa_dVb + Vgst - * (dCoeffb_dVb + Vgst * (dCoeffc_dVb + Vgst - * dCoeffd_dVb))) * delta; - } - } - - if (Vgeff > 0.0) - { - Uvert = 1.0 + Vgeff * (Ua + Vgeff * Ub); - Uvert = MAX(Uvert, 0.2); - Inv_Uvert = 1.0 / Uvert; - T8 = Ua + 2.0 * Ub * Vgeff; - dUvert_dVg = T8 * dVgeff_dVg; - dUvert_dVd = T8 * dVgeff_dVd; - dUvert_dVb = T8 * dVgeff_dVb + Vgeff * (here->pParam->B2uaB - + Vgeff * here->pParam->B2ubB); - - T8 = U1s * Inv_Aa * Inv_Uvert; - Vc = T8 * Vgeff; - T9 = Vc * Inv_Uvert; - dVc_dVg = T8 * dVgeff_dVg - T9 * dUvert_dVg; - dVc_dVd = T8 * dVgeff_dVd - T9 * dUvert_dVd; - dVc_dVb = T8 * dVgeff_dVb + here->pParam->B2u1B * Vgeff * Inv_Aa - * Inv_Uvert - Vc * Inv_Aa * dAa_dVb - T9 * dUvert_dVb; - - - tmp2 = sqrt(1.0 + 2.0 * Vc); - Kk = 0.5 * (1.0 + Vc + tmp2); - Inv_Kk = 1.0 / Kk; - dKk_dVc = 0.5 + 0.5 / tmp2; - SqrtKk = sqrt(Kk); - - T8 = Inv_Aa / SqrtKk; - Vdsat = Vgeff * T8; - Vdsat = MAX(Vdsat, 1.0e-18); - Inv_Vdsat = 1.0 / Vdsat; - T9 = 0.5 * Vdsat * Inv_Kk * dKk_dVc; - dVdsat_dVd = T8 * dVgeff_dVd - T9 * dVc_dVd; - dVdsat_dVg = T8 * dVgeff_dVg - T9 * dVc_dVg; - dVdsat_dVb = T8 * dVgeff_dVb - T9 * dVc_dVb - Vdsat* Inv_Aa * dAa_dVb; - - Beta0 = here->pParam->B2beta0 + here->pParam->B2beta0B * Vbs; - Betas = here->pParam->B2betas0 + here->pParam->B2betasB * Vbs; - Beta2 = here->pParam->B2beta20 + here->pParam->B2beta2B * Vbs - + here->pParam->B2beta2G * Vgs; - Beta3 = here->pParam->B2beta30 + here->pParam->B2beta3B * Vbs - + here->pParam->B2beta3G * Vgs; - Beta4 = here->pParam->B2beta40 + here->pParam->B2beta4B * Vbs - + here->pParam->B2beta4G * Vgs; - Beta1 = Betas - (Beta0 + model->B2vdd * (Beta3 - model->B2vdd - * Beta4)); - - T0 = Vds * Beta2 * Inv_Vdsat; - T0 = MIN(T0, 30.0); - T1 = exp(T0); - T2 = T1 * T1; - T3 = T2 + 1.0; - tanh = (T2 - 1.0) / T3; - Sqrsech = 4.0 * T2 / (T3 * T3); - - Beta = Beta0 + Beta1 * tanh + Vds * (Beta3 - Beta4 * Vds); - T4 = Beta1 * Sqrsech * Inv_Vdsat; - T5 = model->B2vdd * tanh; - dBeta_dVd = Beta3 - 2.0 * Beta4 * Vds + T4 * (Beta2 - T0 * dVdsat_dVd); - dBeta_dVg = T4 * (here->pParam->B2beta2G * Vds - T0 * dVdsat_dVg) - + here->pParam->B2beta3G * (Vds - T5) - - here->pParam->B2beta4G * (Vds * Vds - model->B2vdd * T5); - dBeta1_dVb = here->pParam->Arg; - dBeta_dVb = here->pParam->B2beta0B + dBeta1_dVb * tanh + Vds - * (here->pParam->B2beta3B - Vds * here->pParam->B2beta4B) - + T4 * (here->pParam->B2beta2B * Vds - T0 * dVdsat_dVb); - - - if (Vgst > Vglow) - { - if (Vds <= Vdsat) /* triode region */ - { - T3 = Vds * Inv_Vdsat; - T4 = T3 - 1.0; - T2 = 1.0 - here->pParam->B2u1D * T4 * T4; - U1 = U1s * T2; - Utot = Uvert + U1 * Vds; - Utot = MAX(Utot, 0.5); - Inv_Utot = 1.0 / Utot; - T5 = 2.0 * U1s * here->pParam->B2u1D * Inv_Vdsat * T4; - dU1_dVd = T5 * (T3 * dVdsat_dVd - 1.0); - dU1_dVg = T5 * T3 * dVdsat_dVg; - dU1_dVb = T5 * T3 * dVdsat_dVb + here->pParam->B2u1B * T2; - dUtot_dVd = dUvert_dVd + U1 + Vds * dU1_dVd; - dUtot_dVg = dUvert_dVg + Vds * dU1_dVg; - dUtot_dVb = dUvert_dVb + Vds * dU1_dVb; - - tmp1 = (Vgeff - 0.5 * Aa * Vds); - tmp3 = tmp1 * Vds; - Betaeff = Beta * Inv_Utot; - *Ids = Betaeff * tmp3; - T6 = *Ids / Betaeff * Inv_Utot; - *gds = T6 * (dBeta_dVd - Betaeff * dUtot_dVd) + Betaeff * (tmp1 - + (dVgeff_dVd - 0.5 * Aa) * Vds); - *gm = T6 * (dBeta_dVg - Betaeff * dUtot_dVg) + Betaeff * Vds - * dVgeff_dVg; - *gmb = T6 * (dBeta_dVb - Betaeff * dUtot_dVb) + Betaeff * Vds - * (dVgeff_dVb - 0.5 * Vds * dAa_dVb); - } - else /* Saturation */ - { tmp1 = Vgeff * Inv_Aa * Inv_Kk; - tmp3 = 0.5 * Vgeff * tmp1; - Betaeff = Beta * Inv_Uvert; - *Ids = Betaeff * tmp3; - T0 = *Ids / Betaeff * Inv_Uvert; - T1 = Betaeff * Vgeff * Inv_Aa * Inv_Kk; - T2 = *Ids * Inv_Kk * dKk_dVc; - - if (here->pParam->B2ai0 != 0.0) - { - Ai = here->pParam->B2ai0 + here->pParam->B2aiB * Vbs; - Bi = here->pParam->B2bi0 + here->pParam->B2biB * Vbs; - T5 = Bi / (Vds - Vdsat); - T5 = MIN(T5, 30.0); - T6 = exp(-T5); - FR = 1.0 + Ai * T6; - T7 = T5 / (Vds - Vdsat); - T8 = (1.0 - FR) * T7; - dFR_dVd = T8 * (dVdsat_dVd - 1.0); - dFR_dVg = T8 * dVdsat_dVg; - dFR_dVb = T8 * dVdsat_dVb + T6 * (here->pParam->B2aiB - Ai - * here->pParam->B2biB / (Vds - Vdsat)); - - *gds = (T0 * (dBeta_dVd - Betaeff * dUvert_dVd) + T1 - * dVgeff_dVd - T2 * dVc_dVd) * FR + *Ids * dFR_dVd; - *gm = (T0 * (dBeta_dVg - Betaeff * dUvert_dVg) - + T1 * dVgeff_dVg - T2 * dVc_dVg) * FR + *Ids * dFR_dVg; - *gmb = (T0 * (dBeta_dVb - Betaeff * dUvert_dVb) + T1 - * dVgeff_dVb - T2 * dVc_dVb - *Ids * Inv_Aa * dAa_dVb) - * FR + *Ids * dFR_dVb; - *Ids *= FR; - } - else - { *gds = T0 * (dBeta_dVd - Betaeff * dUvert_dVd) + T1 - * dVgeff_dVd - T2 * dVc_dVd; - *gm = T0 * (dBeta_dVg - Betaeff * dUvert_dVg) + T1 * dVgeff_dVg - - T2 * dVc_dVg; - *gmb = T0 * (dBeta_dVb - Betaeff * dUvert_dVb) + T1 - * dVgeff_dVb - T2 * dVc_dVb - *Ids * Inv_Aa * dAa_dVb; - } - } /* end of Saturation */ - } - else - { T0 = Exp0 * Exp0; - T1 = Exp1; - *Ids = Beta * model->B2Vtm * model->B2Vtm * T0 * (1.0 - T1); - T2 = *Ids / Beta; - T4 = n * model->B2Vtm; - T3 = *Ids / T4; - if ((Vds > Vdsat) && here->pParam->B2ai0 != 0.0) - { Ai = here->pParam->B2ai0 + here->pParam->B2aiB * Vbs; - Bi = here->pParam->B2bi0 + here->pParam->B2biB * Vbs; - T5 = Bi / (Vds - Vdsat); - T5 = MIN(T5, 30.0); - T6 = exp(-T5); - FR = 1.0 + Ai * T6; - T7 = T5 / (Vds - Vdsat); - T8 = (1.0 - FR) * T7; - dFR_dVd = T8 * (dVdsat_dVd - 1.0); - dFR_dVg = T8 * dVdsat_dVg; - dFR_dVb = T8 * dVdsat_dVb + T6 * (here->pParam->B2aiB - Ai - * here->pParam->B2biB / (Vds - Vdsat)); - } - else - { FR = 1.0; - dFR_dVd = 0.0; - dFR_dVg = 0.0; - dFR_dVb = 0.0; - } - - *gds = (T2 * dBeta_dVd + T3 * (here->pParam->B2vofD * T4 - dVth_dVd - - here->pParam->B2nD * Vgst / n) + Beta * model->B2Vtm - * T0 * T1) * FR + *Ids * dFR_dVd; - *gm = (T2 * dBeta_dVg + T3) * FR + *Ids * dFR_dVg; - *gmb = (T2 * dBeta_dVb + T3 * (here->pParam->B2vofB * T4 - dVth_dVb - + here->pParam->B2nB * Vgst / (n * T1s * T1s) * dT1s_dVb)) * FR - + *Ids * dFR_dVb; - *Ids *= FR; - } - } - else - { *Ids = 0.0; - *gm = 0.0; - *gds = 0.0; - *gmb = 0.0; - } - - /* Some Limiting of DC Parameters */ - *gds = MAX(*gds,1.0e-20); - - - if ((model->B2channelChargePartitionFlag > 1) - || ((!ChargeComputationNeeded) && - (model->B2channelChargePartitionFlag > -5))) - { - *qg = 0.0; - *qd = 0.0; - *qb = 0.0; - *cgg = 0.0; - *cgs = 0.0; - *cgd = 0.0; - *cdg = 0.0; - *cds = 0.0; - *cdd = 0.0; - *cbg = 0.0; - *cbs = 0.0; - *cbd = 0.0; - goto finished; - } - else - { - if (Vbs < 0.0) - { Vbseff = Vbs; - dVbseff_dVb = 1.0; - } - else - { Vbseff = here->pParam->B2phi - Phisb; - dVbseff_dVb = -dPhisb_dVb; - } - Arg1 = Vgs - Vbseff - here->pParam->B2vfb; - Arg2 = Arg1 - Vgst; - Qbulk = here->pParam->One_Third_CoxWL * Arg2; - dQbulk_dVb = here->pParam->One_Third_CoxWL * (dVth_dVb - dVbseff_dVb); - dQbulk_dVd = here->pParam->One_Third_CoxWL * dVth_dVd; - if (Arg1 <= 0.0) - { - *qg = here->pParam->CoxWL * Arg1; - *qb = -(*qg); - *qd = 0.0; - - *cgg = here->pParam->CoxWL; - *cgd = 0.0; - *cgs = -*cgg * (1.0 - dVbseff_dVb); - - *cdg = 0.0; - *cdd = 0.0; - *cds = 0.0; - - *cbg = -here->pParam->CoxWL; - *cbd = 0.0; - *cbs = -*cgs; - } - else if (Vgst <= 0.0) - { T2 = Arg1 / Arg2; - T3 = T2 * T2 * (here->pParam->CoxWL - here->pParam->Two_Third_CoxWL - * T2); - - *qg = here->pParam->CoxWL * Arg1 * (1.0 - T2 * (1.0 - T2 / 3.0)); - *qb = -(*qg); - *qd = 0.0; - - *cgg = here->pParam->CoxWL * (1.0 - T2 * (2.0 - T2)); - tmp = T3 * dVth_dVb - (*cgg + T3) * dVbseff_dVb; - *cgd = T3 * dVth_dVd; - *cgs = -(*cgg + *cgd + tmp); - - *cdg = 0.0; - *cdd = 0.0; - *cds = 0.0; - - *cbg = -*cgg; - *cbd = -*cgd; - *cbs = -*cgs; - } - else - { if (Vgst < here->pParam->B2vghigh) - { Uvert = 1.0 + Vgst * (Ua + Vgst * Ub); - Uvert = MAX(Uvert, 0.2); - Inv_Uvert = 1.0 / Uvert; - dUvert_dVg = Ua + 2.0 * Ub * Vgst; - dUvert_dVd = -dUvert_dVg * dVth_dVd; - dUvert_dVb = -dUvert_dVg * dVth_dVb + Vgst - * (here->pParam->B2uaB + Vgst * here->pParam->B2ubB); - - T8 = U1s * Inv_Aa * Inv_Uvert; - Vc = T8 * Vgst; - T9 = Vc * Inv_Uvert; - dVc_dVg = T8 - T9 * dUvert_dVg; - dVc_dVd = -T8 * dVth_dVd - T9 * dUvert_dVd; - dVc_dVb = -T8 * dVth_dVb + here->pParam->B2u1B * Vgst * Inv_Aa - * Inv_Uvert - Vc * Inv_Aa * dAa_dVb - T9 * dUvert_dVb; - - tmp2 = sqrt(1.0 + 2.0 * Vc); - Kk = 0.5 * (1.0 + Vc + tmp2); - Inv_Kk = 1.0 / Kk; - dKk_dVc = 0.5 + 0.5 / tmp2; - SqrtKk = sqrt(Kk); - - T8 = Inv_Aa / SqrtKk; - Vdsat = Vgst * T8; - T9 = 0.5 * Vdsat * Inv_Kk * dKk_dVc; - dVdsat_dVd = -T8 * dVth_dVd - T9 * dVc_dVd; - dVdsat_dVg = T8 - T9 * dVc_dVg; - dVdsat_dVb = -T8 * dVth_dVb - T9 * dVc_dVb - - Vdsat* Inv_Aa * dAa_dVb; - } - if (Vds >= Vdsat) - { /* saturation region */ - *cgg = here->pParam->Two_Third_CoxWL; - *cgd = -*cgg * dVth_dVd + dQbulk_dVd; - tmp = -*cgg * dVth_dVb + dQbulk_dVb; - *cgs = -(*cgg + *cgd + tmp); - - *cbg = 0.0; - *cbd = -dQbulk_dVd; - *cbs = dQbulk_dVd + dQbulk_dVb; - - *cdg = -0.4 * *cgg; - tmp = -*cdg * dVth_dVb; - *cdd = -*cdg * dVth_dVd; - *cds = -(*cdg + *cdd + tmp); - - *qb = -Qbulk; - *qg = here->pParam->Two_Third_CoxWL * Vgst + Qbulk; - *qd = *cdg * Vgst; - } - else - { /* linear region */ - T7 = Vds / Vdsat; - T8 = Vgst / Vdsat; - T6 = T7 * T8; - T9 = 1.0 - T7; - Vgdt = Vgst * T9; - T0 = Vgst / (Vgst + Vgdt); - T1 = Vgdt / (Vgst + Vgdt); - T5 = T0 * T1; - T2 = 1.0 - T1 + T5; - T3 = 1.0 - T0 + T5; - - dVgdt_dVg = T9 + T6 * dVdsat_dVg; - dVgdt_dVd = T6 * dVdsat_dVd - T8 -T9 * dVth_dVd; - dVgdt_dVb = T6 * dVdsat_dVb -T9 * dVth_dVb; - - *qg = here->pParam->Two_Third_CoxWL * (Vgst + Vgdt - - Vgdt * T0) + Qbulk; - *qb = -Qbulk; - *qd = -here->pParam->One_Third_CoxWL * (0.2 * Vgdt - + 0.8 * Vgst + Vgdt * T1 - + 0.2 * T5 * (Vgdt - Vgst)); - - *cgg = here->pParam->Two_Third_CoxWL * (T2 + T3 * dVgdt_dVg); - tmp = dQbulk_dVb + here->pParam->Two_Third_CoxWL * (T3 * dVgdt_dVb - - T2 * dVth_dVb); - *cgd = here->pParam->Two_Third_CoxWL * (T3 * dVgdt_dVd - - T2 * dVth_dVd) + dQbulk_dVd; - *cgs = -(*cgg + *cgd + tmp); - - T2 = 0.8 - 0.4 * T1 * (2.0 * T1 + T0 + T0 * (T1 - T0)); - T3 = 0.2 + T1 + T0 * (1.0 - 0.4 * T0 * (T1 + 3.0 * T0)); - *cdg = -here->pParam->One_Third_CoxWL * (T2 + T3 * dVgdt_dVg); - tmp = here->pParam->One_Third_CoxWL * (T2 * dVth_dVb - - T3 * dVgdt_dVb); - *cdd = here->pParam->One_Third_CoxWL * (T2 * dVth_dVd - - T3 * dVgdt_dVd); - *cds = -(*cdg + tmp + *cdd); - - *cbg = 0.0; - *cbd = -dQbulk_dVd; - *cbs = dQbulk_dVd + dQbulk_dVb; - } - } - } - -finished: /* returning Values to Calling Routine */ - valuetypeflag = (int) model->B2channelChargePartitionFlag; - switch (valuetypeflag) - { - case 0: *Ids = MAX(*Ids,1e-50); - break; - case -1: *Ids = MAX(*Ids,1e-50); - break; - case -2: *Ids = *gm; - break; - case -3: *Ids = *gds; - break; - case -4: *Ids = 1.0 / *gds; - break; - case -5: *Ids = *gmb; - break; - case -6: *Ids = *qg / 1.0e-12; - break; - case -7: *Ids = *qb / 1.0e-12; - break; - case -8: *Ids = *qd / 1.0e-12; - break; - case -9: *Ids = -(*qb + *qg + *qd) / 1.0e-12; - break; - case -10: *Ids = *cgg / 1.0e-12; - break; - case -11: *Ids = *cgd / 1.0e-12; - break; - case -12: *Ids = *cgs / 1.0e-12; - break; - case -13: *Ids = -(*cgg + *cgd + *cgs) / 1.0e-12; - break; - case -14: *Ids = *cbg / 1.0e-12; - break; - case -15: *Ids = *cbd / 1.0e-12; - break; - case -16: *Ids = *cbs / 1.0e-12; - break; - case -17: *Ids = -(*cbg + *cbd + *cbs) / 1.0e-12; - break; - case -18: *Ids = *cdg / 1.0e-12; - break; - case -19: *Ids = *cdd / 1.0e-12; - break; - case -20: *Ids = *cds / 1.0e-12; - break; - case -21: *Ids = -(*cdg + *cdd + *cds) / 1.0e-12; - break; - case -22: *Ids = -(*cgg + *cdg + *cbg) / 1.0e-12; - break; - case -23: *Ids = -(*cgd + *cdd + *cbd) / 1.0e-12; - break; - case -24: *Ids = -(*cgs + *cds + *cbs) / 1.0e-12; - break; - default: *Ids = MAX(*Ids, 1.0e-50); - break; - } - *von = Vth; - *vdsat = Vdsat; -} - diff --git a/src/spicelib/devices/bsim2/b2getic.c b/src/spicelib/devices/bsim2/b2getic.c deleted file mode 100644 index 7edf25c6a..000000000 --- a/src/spicelib/devices/bsim2/b2getic.c +++ /dev/null @@ -1,48 +0,0 @@ -/********** -Copyright 1990 Regents of the University of California. All rights reserved. -Author: 1985 Hong J. Park, Thomas L. Quarles -**********/ -/* - */ - -#include "ngspice/ngspice.h" -#include "ngspice/cktdefs.h" -#include "bsim2def.h" -#include "ngspice/sperror.h" -#include "ngspice/suffix.h" - - -int -B2getic(GENmodel *inModel, CKTcircuit *ckt) -{ - - B2model *model = (B2model*)inModel; - B2instance *here; - /* - * grab initial conditions out of rhs array. User specified, so use - * external nodes to get values - */ - - for( ; model ; model = B2nextModel(model)) { - for(here = B2instances(model); here ; here = B2nextInstance(here)) { - - if(!here->B2icVBSGiven) { - here->B2icVBS = - *(ckt->CKTrhs + here->B2bNode) - - *(ckt->CKTrhs + here->B2sNode); - } - if(!here->B2icVDSGiven) { - here->B2icVDS = - *(ckt->CKTrhs + here->B2dNode) - - *(ckt->CKTrhs + here->B2sNode); - } - if(!here->B2icVGSGiven) { - here->B2icVGS = - *(ckt->CKTrhs + here->B2gNode) - - *(ckt->CKTrhs + here->B2sNode); - } - } - } - return(OK); -} - diff --git a/src/spicelib/devices/bsim2/b2ld.c b/src/spicelib/devices/bsim2/b2ld.c deleted file mode 100644 index 84c475a04..000000000 --- a/src/spicelib/devices/bsim2/b2ld.c +++ /dev/null @@ -1,723 +0,0 @@ -/********** -Copyright 1990 Regents of the University of California. All rights reserved. -Author: 1985 Hong J. Park, Thomas L. Quarles -**********/ - -#include "ngspice/ngspice.h" -#include "ngspice/cktdefs.h" -#include "bsim2def.h" -#include "ngspice/trandefs.h" -#include "ngspice/const.h" -#include "ngspice/sperror.h" -#include "ngspice/devdefs.h" -#include "ngspice/suffix.h" - -int -B2load(GENmodel *inModel, CKTcircuit *ckt) - - /* actually load the current value into the - * sparse matrix previously provided - */ -{ - B2model *model = (B2model*)inModel; - B2instance *here; - double DrainSatCurrent; - double EffectiveLength; - double GateBulkOverlapCap; - double GateDrainOverlapCap; - double GateSourceOverlapCap; - double SourceSatCurrent; - double DrainArea; - double SourceArea; - double DrainPerimeter; - double SourcePerimeter; - double arg; - double capbd = 0.0; - double capbs = 0.0; - double cbd; - double cbhat; - double cbs; - double cd; - double cdrain; - double cdhat; - double cdreq; - double ceq; - double ceqbd; - double ceqbs; - double ceqqb; - double ceqqd; - double ceqqg; - double czbd; - double czbdsw; - double czbs; - double czbssw; - double delvbd; - double delvbs; - double delvds; - double delvgd; - double delvgs; - double evbd; - double evbs; - double gbd; - double gbs; - double gcbdb; - double gcbgb; - double gcbsb; - double gcddb; - double gcdgb; - double gcdsb; - double gcgdb; - double gcggb; - double gcgsb; - double gcsdb; - double gcsgb; - double gcssb; - double gds; - double geq; - double gm; - double gmbs; - double sarg; - double sargsw; - double vbd; - double vbs; - double vcrit; - double vds; - double vdsat; - double vgb; - double vgd; - double vgdo; - double vgs; - double von; -#ifndef PREDICTOR - double xfact; -#endif - double xnrm; - double xrev; - int Check; - double cgdb; - double cgsb; - double cbdb; - double cdgb = 0.0; - double cddb = 0.0; - double cdsb = 0.0; - double cggb; - double cbgb; - double cbsb; - double csgb = 0.0; - double cssb = 0.0; - double csdb = 0.0; - double PhiB; - double PhiBSW; - double MJ; - double MJSW; - double argsw; - double qgate; - double qbulk; - double qdrn; - double qsrc; - double cqgate; - double cqbulk; - double cqdrn; - double vt0; - double args[8]; - int ByPass; -#ifndef NOBYPASS - double tempv; -#endif /*NOBYPASS*/ - int error; - - double m; - - - /* loop through all the B2 device models */ - for( ; model != NULL; model = B2nextModel(model)) { - - /* loop through all the instances of the model */ - for (here = B2instances(model); here != NULL ; - here=B2nextInstance(here)) { - - EffectiveLength=here->B2l - model->B2deltaL * 1.e-6;/* m */ - DrainArea = here->B2drainArea; - SourceArea = here->B2sourceArea; - DrainPerimeter = here->B2drainPerimeter; - SourcePerimeter = here->B2sourcePerimeter; - if( (DrainSatCurrent=DrainArea*model->B2jctSatCurDensity) - < 1e-15){ - DrainSatCurrent = 1.0e-15; - } - if( (SourceSatCurrent=SourceArea*model->B2jctSatCurDensity) - <1.0e-15){ - SourceSatCurrent = 1.0e-15; - } - GateSourceOverlapCap = model->B2gateSourceOverlapCap *here->B2w; - GateDrainOverlapCap = model->B2gateDrainOverlapCap * here->B2w; - GateBulkOverlapCap = model->B2gateBulkOverlapCap *EffectiveLength; - von = model->B2type * here->B2von; - vdsat = model->B2type * here->B2vdsat; - vt0 = model->B2type * here->pParam->B2vt0; - - Check=1; - ByPass = 0; - if((ckt->CKTmode & MODEINITSMSIG)) { - vbs= *(ckt->CKTstate0 + here->B2vbs); - vgs= *(ckt->CKTstate0 + here->B2vgs); - vds= *(ckt->CKTstate0 + here->B2vds); - } else if ((ckt->CKTmode & MODEINITTRAN)) { - vbs= *(ckt->CKTstate1 + here->B2vbs); - vgs= *(ckt->CKTstate1 + here->B2vgs); - vds= *(ckt->CKTstate1 + here->B2vds); - } else if((ckt->CKTmode & MODEINITJCT) && !here->B2off) { - vds= model->B2type * here->B2icVDS; - vgs= model->B2type * here->B2icVGS; - vbs= model->B2type * here->B2icVBS; - if((vds==0) && (vgs==0) && (vbs==0) && - ((ckt->CKTmode & - (MODETRAN|MODEAC|MODEDCOP|MODEDCTRANCURVE)) || - (!(ckt->CKTmode & MODEUIC)))) { - vbs = -1; - vgs = vt0; - vds = 0; - } - } else if((ckt->CKTmode & (MODEINITJCT | MODEINITFIX) ) && - (here->B2off)) { - vbs=vgs=vds=0; - } else { -#ifndef PREDICTOR - if((ckt->CKTmode & MODEINITPRED)) { - xfact=ckt->CKTdelta/ckt->CKTdeltaOld[1]; - *(ckt->CKTstate0 + here->B2vbs) = - *(ckt->CKTstate1 + here->B2vbs); - vbs = (1+xfact)* (*(ckt->CKTstate1 + here->B2vbs)) - -(xfact * (*(ckt->CKTstate2 + here->B2vbs))); - *(ckt->CKTstate0 + here->B2vgs) = - *(ckt->CKTstate1 + here->B2vgs); - vgs = (1+xfact)* (*(ckt->CKTstate1 + here->B2vgs)) - -(xfact * (*(ckt->CKTstate2 + here->B2vgs))); - *(ckt->CKTstate0 + here->B2vds) = - *(ckt->CKTstate1 + here->B2vds); - vds = (1+xfact)* (*(ckt->CKTstate1 + here->B2vds)) - -(xfact * (*(ckt->CKTstate2 + here->B2vds))); - *(ckt->CKTstate0 + here->B2vbd) = - *(ckt->CKTstate0 + here->B2vbs)- - *(ckt->CKTstate0 + here->B2vds); - *(ckt->CKTstate0 + here->B2cd) = - *(ckt->CKTstate1 + here->B2cd); - *(ckt->CKTstate0 + here->B2cbs) = - *(ckt->CKTstate1 + here->B2cbs); - *(ckt->CKTstate0 + here->B2cbd) = - *(ckt->CKTstate1 + here->B2cbd); - *(ckt->CKTstate0 + here->B2gm) = - *(ckt->CKTstate1 + here->B2gm); - *(ckt->CKTstate0 + here->B2gds) = - *(ckt->CKTstate1 + here->B2gds); - *(ckt->CKTstate0 + here->B2gmbs) = - *(ckt->CKTstate1 + here->B2gmbs); - *(ckt->CKTstate0 + here->B2gbd) = - *(ckt->CKTstate1 + here->B2gbd); - *(ckt->CKTstate0 + here->B2gbs) = - *(ckt->CKTstate1 + here->B2gbs); - *(ckt->CKTstate0 + here->B2cggb) = - *(ckt->CKTstate1 + here->B2cggb); - *(ckt->CKTstate0 + here->B2cbgb) = - *(ckt->CKTstate1 + here->B2cbgb); - *(ckt->CKTstate0 + here->B2cbsb) = - *(ckt->CKTstate1 + here->B2cbsb); - *(ckt->CKTstate0 + here->B2cgdb) = - *(ckt->CKTstate1 + here->B2cgdb); - *(ckt->CKTstate0 + here->B2cgsb) = - *(ckt->CKTstate1 + here->B2cgsb); - *(ckt->CKTstate0 + here->B2cbdb) = - *(ckt->CKTstate1 + here->B2cbdb); - *(ckt->CKTstate0 + here->B2cdgb) = - *(ckt->CKTstate1 + here->B2cdgb); - *(ckt->CKTstate0 + here->B2cddb) = - *(ckt->CKTstate1 + here->B2cddb); - *(ckt->CKTstate0 + here->B2cdsb) = - *(ckt->CKTstate1 + here->B2cdsb); - } else { -#endif /* PREDICTOR */ - vbs = model->B2type * ( - *(ckt->CKTrhsOld+here->B2bNode) - - *(ckt->CKTrhsOld+here->B2sNodePrime)); - vgs = model->B2type * ( - *(ckt->CKTrhsOld+here->B2gNode) - - *(ckt->CKTrhsOld+here->B2sNodePrime)); - vds = model->B2type * ( - *(ckt->CKTrhsOld+here->B2dNodePrime) - - *(ckt->CKTrhsOld+here->B2sNodePrime)); -#ifndef PREDICTOR - } -#endif /* PREDICTOR */ - vbd=vbs-vds; - vgd=vgs-vds; - vgdo = *(ckt->CKTstate0 + here->B2vgs) - - *(ckt->CKTstate0 + here->B2vds); - delvbs = vbs - *(ckt->CKTstate0 + here->B2vbs); - delvbd = vbd - *(ckt->CKTstate0 + here->B2vbd); - delvgs = vgs - *(ckt->CKTstate0 + here->B2vgs); - delvds = vds - *(ckt->CKTstate0 + here->B2vds); - delvgd = vgd-vgdo; - - if (here->B2mode >= 0) { - cdhat= - *(ckt->CKTstate0 + here->B2cd) - - *(ckt->CKTstate0 + here->B2gbd) * delvbd + - *(ckt->CKTstate0 + here->B2gmbs) * delvbs + - *(ckt->CKTstate0 + here->B2gm) * delvgs + - *(ckt->CKTstate0 + here->B2gds) * delvds ; - } else { - cdhat= - *(ckt->CKTstate0 + here->B2cd) - - ( *(ckt->CKTstate0 + here->B2gbd) - - *(ckt->CKTstate0 + here->B2gmbs)) * delvbd - - *(ckt->CKTstate0 + here->B2gm) * delvgd + - *(ckt->CKTstate0 + here->B2gds) * delvds; - } - cbhat= - *(ckt->CKTstate0 + here->B2cbs) + - *(ckt->CKTstate0 + here->B2cbd) + - *(ckt->CKTstate0 + here->B2gbd) * delvbd + - *(ckt->CKTstate0 + here->B2gbs) * delvbs ; - -#ifndef NOBYPASS - /* now lets see if we can bypass (ugh) */ - - /* following should be one big if connected by && all over - * the place, but some C compilers can't handle that, so - * we split it up here to let them digest it in stages - */ - tempv = MAX(fabs(cbhat),fabs(*(ckt->CKTstate0 + here->B2cbs) - + *(ckt->CKTstate0 + here->B2cbd)))+ckt->CKTabstol; - if((!(ckt->CKTmode & MODEINITPRED)) && (ckt->CKTbypass) ) - if( (fabs(delvbs) < (ckt->CKTreltol * MAX(fabs(vbs), - fabs(*(ckt->CKTstate0+here->B2vbs)))+ - ckt->CKTvoltTol)) ) - if ( (fabs(delvbd) < (ckt->CKTreltol * MAX(fabs(vbd), - fabs(*(ckt->CKTstate0+here->B2vbd)))+ - ckt->CKTvoltTol)) ) - if( (fabs(delvgs) < (ckt->CKTreltol * MAX(fabs(vgs), - fabs(*(ckt->CKTstate0+here->B2vgs)))+ - ckt->CKTvoltTol))) - if ( (fabs(delvds) < (ckt->CKTreltol * MAX(fabs(vds), - fabs(*(ckt->CKTstate0+here->B2vds)))+ - ckt->CKTvoltTol)) ) - if( (fabs(cdhat- *(ckt->CKTstate0 + here->B2cd)) < - ckt->CKTreltol * MAX(fabs(cdhat),fabs(*(ckt->CKTstate0 + - here->B2cd))) + ckt->CKTabstol) ) - if ( (fabs(cbhat-(*(ckt->CKTstate0 + here->B2cbs) + - *(ckt->CKTstate0 + here->B2cbd))) < ckt->CKTreltol * - tempv)) { - /* bypass code */ - vbs = *(ckt->CKTstate0 + here->B2vbs); - vbd = *(ckt->CKTstate0 + here->B2vbd); - vgs = *(ckt->CKTstate0 + here->B2vgs); - vds = *(ckt->CKTstate0 + here->B2vds); - vgd = vgs - vds; - vgb = vgs - vbs; - cd = *(ckt->CKTstate0 + here->B2cd); - cbs = *(ckt->CKTstate0 + here->B2cbs); - cbd = *(ckt->CKTstate0 + here->B2cbd); - cdrain = here->B2mode * (cd + cbd); - gm = *(ckt->CKTstate0 + here->B2gm); - gds = *(ckt->CKTstate0 + here->B2gds); - gmbs = *(ckt->CKTstate0 + here->B2gmbs); - gbd = *(ckt->CKTstate0 + here->B2gbd); - gbs = *(ckt->CKTstate0 + here->B2gbs); - if((ckt->CKTmode & (MODETRAN | MODEAC)) || - ((ckt->CKTmode & MODETRANOP) && - (ckt->CKTmode & MODEUIC))) { - cggb = *(ckt->CKTstate0 + here->B2cggb); - cgdb = *(ckt->CKTstate0 + here->B2cgdb); - cgsb = *(ckt->CKTstate0 + here->B2cgsb); - cbgb = *(ckt->CKTstate0 + here->B2cbgb); - cbdb = *(ckt->CKTstate0 + here->B2cbdb); - cbsb = *(ckt->CKTstate0 + here->B2cbsb); - cdgb = *(ckt->CKTstate0 + here->B2cdgb); - cddb = *(ckt->CKTstate0 + here->B2cddb); - cdsb = *(ckt->CKTstate0 + here->B2cdsb); - capbs = *(ckt->CKTstate0 + here->B2capbs); - capbd = *(ckt->CKTstate0 + here->B2capbd); - ByPass = 1; - goto line755; - } else { - goto line850; - } - } -#endif /*NOBYPASS*/ - - von = model->B2type * here->B2von; - if(*(ckt->CKTstate0 + here->B2vds) >=0) { - vgs = DEVfetlim(vgs,*(ckt->CKTstate0 + here->B2vgs) - ,von); - vds = vgs - vgd; - vds = DEVlimvds(vds,*(ckt->CKTstate0 + here->B2vds)); - vgd = vgs - vds; - } else { - vgd = DEVfetlim(vgd,vgdo,von); - vds = vgs - vgd; - vds = -DEVlimvds(-vds,-(*(ckt->CKTstate0 + - here->B2vds))); - vgs = vgd + vds; - } - if(vds >= 0) { - vcrit = CONSTvt0 *log(CONSTvt0/(CONSTroot2*SourceSatCurrent)); - vbs = DEVpnjlim(vbs,*(ckt->CKTstate0 + here->B2vbs), - CONSTvt0,vcrit,&Check); /* B2 test */ - vbd = vbs-vds; - } else { - vcrit = CONSTvt0 * log(CONSTvt0/(CONSTroot2*DrainSatCurrent)); - vbd = DEVpnjlim(vbd,*(ckt->CKTstate0 + here->B2vbd), - CONSTvt0,vcrit,&Check); /* B2 test*/ - vbs = vbd + vds; - } - } - - /* determine DC current and derivatives */ - vbd = vbs - vds; - vgd = vgs - vds; - vgb = vgs - vbs; - - - if(vbs <= 0.0 ) { - gbs = SourceSatCurrent / CONSTvt0 + ckt->CKTgmin; - cbs = gbs * vbs ; - } else { - evbs = exp(vbs/CONSTvt0); - gbs = SourceSatCurrent*evbs/CONSTvt0 + ckt->CKTgmin; - cbs = SourceSatCurrent * (evbs-1) + ckt->CKTgmin * vbs ; - } - if(vbd <= 0.0) { - gbd = DrainSatCurrent / CONSTvt0 + ckt->CKTgmin; - cbd = gbd * vbd ; - } else { - evbd = exp(vbd/CONSTvt0); - gbd = DrainSatCurrent*evbd/CONSTvt0 +ckt->CKTgmin; - cbd = DrainSatCurrent *(evbd-1)+ckt->CKTgmin*vbd; - } - /* line 400 */ - if(vds >= 0) { - /* normal mode */ - here->B2mode = 1; - } else { - /* inverse mode */ - here->B2mode = -1; - } - /* call B2evaluate to calculate drain current and its - * derivatives and charge and capacitances related to gate - * drain, and bulk - */ - if( vds >= 0 ) { - B2evaluate(vds,vbs,vgs,here,model,&gm,&gds,&gmbs,&qgate, - &qbulk,&qdrn,&cggb,&cgdb,&cgsb,&cbgb,&cbdb,&cbsb,&cdgb, - &cddb,&cdsb,&cdrain,&von,&vdsat,ckt); - } else { - B2evaluate(-vds,vbd,vgd,here,model,&gm,&gds,&gmbs,&qgate, - &qbulk,&qsrc,&cggb,&cgsb,&cgdb,&cbgb,&cbsb,&cbdb,&csgb, - &cssb,&csdb,&cdrain,&von,&vdsat,ckt); - } - - here->B2von = model->B2type * von; - here->B2vdsat = model->B2type * vdsat; - - - - /* - * COMPUTE EQUIVALENT DRAIN CURRENT SOURCE - */ - cd=here->B2mode * cdrain - cbd; - if ((ckt->CKTmode & (MODETRAN | MODEAC | MODEINITSMSIG)) || - ((ckt->CKTmode & MODETRANOP ) && - (ckt->CKTmode & MODEUIC))) { - /* - * charge storage elements - * - * bulk-drain and bulk-source depletion capacitances - * czbd : zero bias drain junction capacitance - * czbs : zero bias source junction capacitance - * czbdsw:zero bias drain junction sidewall capacitance - * czbssw:zero bias source junction sidewall capacitance - */ - - czbd = model->B2unitAreaJctCap * DrainArea; - czbs = model->B2unitAreaJctCap * SourceArea; - czbdsw= model->B2unitLengthSidewallJctCap * DrainPerimeter; - czbssw= model->B2unitLengthSidewallJctCap * SourcePerimeter; - PhiB = model->B2bulkJctPotential; - PhiBSW = model->B2sidewallJctPotential; - MJ = model->B2bulkJctBotGradingCoeff; - MJSW = model->B2bulkJctSideGradingCoeff; - - /* Source Bulk Junction */ - if( vbs < 0 ) { - arg = 1 - vbs / PhiB; - argsw = 1 - vbs / PhiBSW; - sarg = exp(-MJ*log(arg)); - sargsw = exp(-MJSW*log(argsw)); - *(ckt->CKTstate0 + here->B2qbs) = - PhiB * czbs * (1-arg*sarg)/(1-MJ) + PhiBSW * - czbssw * (1-argsw*sargsw)/(1-MJSW); - capbs = czbs * sarg + czbssw * sargsw ; - } else { - *(ckt->CKTstate0+here->B2qbs) = - vbs*(czbs+czbssw)+ vbs*vbs*(czbs*MJ*0.5/PhiB - + czbssw * MJSW * 0.5/PhiBSW); - capbs = czbs + czbssw + vbs *(czbs*MJ/PhiB+ - czbssw * MJSW / PhiBSW ); - } - - /* Drain Bulk Junction */ - if( vbd < 0 ) { - arg = 1 - vbd / PhiB; - argsw = 1 - vbd / PhiBSW; - sarg = exp(-MJ*log(arg)); - sargsw = exp(-MJSW*log(argsw)); - *(ckt->CKTstate0 + here->B2qbd) = - PhiB * czbd * (1-arg*sarg)/(1-MJ) + PhiBSW * - czbdsw * (1-argsw*sargsw)/(1-MJSW); - capbd = czbd * sarg + czbdsw * sargsw ; - } else { - *(ckt->CKTstate0+here->B2qbd) = - vbd*(czbd+czbdsw)+ vbd*vbd*(czbd*MJ*0.5/PhiB - + czbdsw * MJSW * 0.5/PhiBSW); - capbd = czbd + czbdsw + vbd *(czbd*MJ/PhiB+ - czbdsw * MJSW / PhiBSW ); - } - - } - - - - - /* - * check convergence - */ - if ( (here->B2off == 0) || (!(ckt->CKTmode & MODEINITFIX)) ){ - if (Check == 1) { - ckt->CKTnoncon++; - ckt->CKTtroubleElt = (GENinstance *) here; - } - } - *(ckt->CKTstate0 + here->B2vbs) = vbs; - *(ckt->CKTstate0 + here->B2vbd) = vbd; - *(ckt->CKTstate0 + here->B2vgs) = vgs; - *(ckt->CKTstate0 + here->B2vds) = vds; - *(ckt->CKTstate0 + here->B2cd) = cd; - *(ckt->CKTstate0 + here->B2cbs) = cbs; - *(ckt->CKTstate0 + here->B2cbd) = cbd; - *(ckt->CKTstate0 + here->B2gm) = gm; - *(ckt->CKTstate0 + here->B2gds) = gds; - *(ckt->CKTstate0 + here->B2gmbs) = gmbs; - *(ckt->CKTstate0 + here->B2gbd) = gbd; - *(ckt->CKTstate0 + here->B2gbs) = gbs; - - *(ckt->CKTstate0 + here->B2cggb) = cggb; - *(ckt->CKTstate0 + here->B2cgdb) = cgdb; - *(ckt->CKTstate0 + here->B2cgsb) = cgsb; - - *(ckt->CKTstate0 + here->B2cbgb) = cbgb; - *(ckt->CKTstate0 + here->B2cbdb) = cbdb; - *(ckt->CKTstate0 + here->B2cbsb) = cbsb; - - *(ckt->CKTstate0 + here->B2cdgb) = cdgb; - *(ckt->CKTstate0 + here->B2cddb) = cddb; - *(ckt->CKTstate0 + here->B2cdsb) = cdsb; - - *(ckt->CKTstate0 + here->B2capbs) = capbs; - *(ckt->CKTstate0 + here->B2capbd) = capbd; - - /* bulk and channel charge plus overlaps */ - - if((!(ckt->CKTmode & (MODETRAN | MODEAC))) && - ((!(ckt->CKTmode & MODETRANOP)) || - (!(ckt->CKTmode & MODEUIC))) && (!(ckt->CKTmode - & MODEINITSMSIG))) goto line850; -#ifndef NOBYPASS -line755: -#endif - if( here->B2mode > 0 ) { - - args[0] = GateDrainOverlapCap; - args[1] = GateSourceOverlapCap; - args[2] = GateBulkOverlapCap; - args[3] = capbd; - args[4] = capbs; - args[5] = cggb; - args[6] = cgdb; - args[7] = cgsb; - - B2mosCap(ckt,vgd,vgs,vgb, - args, - /* - GateDrainOverlapCap, - GateSourceOverlapCap,GateBulkOverlapCap, - capbd,capbs,cggb,cgdb,cgsb, - */ - cbgb,cbdb,cbsb,cdgb,cddb,cdsb - ,&gcggb,&gcgdb,&gcgsb,&gcbgb,&gcbdb,&gcbsb,&gcdgb - ,&gcddb,&gcdsb,&gcsgb,&gcsdb,&gcssb,&qgate,&qbulk - ,&qdrn,&qsrc); - } else { - - args[0] = GateSourceOverlapCap; - args[1] = GateDrainOverlapCap; - args[2] = GateBulkOverlapCap; - args[3] = capbs; - args[4] = capbd; - args[5] = cggb; - args[6] = cgsb; - args[7] = cgdb; - - B2mosCap(ckt,vgs,vgd,vgb,args, - /* - GateSourceOverlapCap, - GateDrainOverlapCap,GateBulkOverlapCap, - capbs,capbd,cggb,cgsb,cgdb, - */ - cbgb,cbsb,cbdb,csgb,cssb,csdb - ,&gcggb,&gcgsb,&gcgdb,&gcbgb,&gcbsb,&gcbdb,&gcsgb - ,&gcssb,&gcsdb,&gcdgb,&gcdsb,&gcddb,&qgate,&qbulk - ,&qsrc,&qdrn); - } - - if(ByPass) goto line860; - *(ckt->CKTstate0 + here->B2qg) = qgate; - *(ckt->CKTstate0 + here->B2qd) = qdrn - - *(ckt->CKTstate0 + here->B2qbd); - *(ckt->CKTstate0 + here->B2qb) = qbulk + - *(ckt->CKTstate0 + here->B2qbd) + - *(ckt->CKTstate0 + here->B2qbs); - - /* store small signal parameters */ - if((!(ckt->CKTmode & (MODEAC | MODETRAN))) && - (ckt->CKTmode & MODETRANOP ) && (ckt->CKTmode & - MODEUIC )) goto line850; - if(ckt->CKTmode & MODEINITSMSIG ) { - *(ckt->CKTstate0+here->B2cggb) = cggb; - *(ckt->CKTstate0+here->B2cgdb) = cgdb; - *(ckt->CKTstate0+here->B2cgsb) = cgsb; - *(ckt->CKTstate0+here->B2cbgb) = cbgb; - *(ckt->CKTstate0+here->B2cbdb) = cbdb; - *(ckt->CKTstate0+here->B2cbsb) = cbsb; - *(ckt->CKTstate0+here->B2cdgb) = cdgb; - *(ckt->CKTstate0+here->B2cddb) = cddb; - *(ckt->CKTstate0+here->B2cdsb) = cdsb; - *(ckt->CKTstate0+here->B2capbd) = capbd; - *(ckt->CKTstate0+here->B2capbs) = capbs; - - goto line1000; - } - - if(ckt->CKTmode & MODEINITTRAN ) { - *(ckt->CKTstate1+here->B2qb) = - *(ckt->CKTstate0+here->B2qb) ; - *(ckt->CKTstate1+here->B2qg) = - *(ckt->CKTstate0+here->B2qg) ; - *(ckt->CKTstate1+here->B2qd) = - *(ckt->CKTstate0+here->B2qd) ; - } - - - error = NIintegrate(ckt,&geq,&ceq,0.0,here->B2qb); - if(error) return(error); - error = NIintegrate(ckt,&geq,&ceq,0.0,here->B2qg); - if(error) return(error); - error = NIintegrate(ckt,&geq,&ceq,0.0,here->B2qd); - if(error) return(error); - - goto line860; - -line850: - /* initialize to zero charge conductance and current */ - ceqqg = ceqqb = ceqqd = 0.0; - gcdgb = gcddb = gcdsb = 0.0; - gcsgb = gcsdb = gcssb = 0.0; - gcggb = gcgdb = gcgsb = 0.0; - gcbgb = gcbdb = gcbsb = 0.0; - goto line900; - -line860: - /* evaluate equivalent charge current */ - cqgate = *(ckt->CKTstate0 + here->B2iqg); - cqbulk = *(ckt->CKTstate0 + here->B2iqb); - cqdrn = *(ckt->CKTstate0 + here->B2iqd); - ceqqg = cqgate - gcggb * vgb + gcgdb * vbd + gcgsb * vbs; - ceqqb = cqbulk - gcbgb * vgb + gcbdb * vbd + gcbsb * vbs; - ceqqd = cqdrn - gcdgb * vgb + gcddb * vbd + gcdsb * vbs; - - if(ckt->CKTmode & MODEINITTRAN ) { - *(ckt->CKTstate1 + here->B2iqb) = - *(ckt->CKTstate0 + here->B2iqb); - *(ckt->CKTstate1 + here->B2iqg) = - *(ckt->CKTstate0 + here->B2iqg); - *(ckt->CKTstate1 + here->B2iqd) = - *(ckt->CKTstate0 + here->B2iqd); - } - - /* - * load current vector - */ -line900: - - m = here->B2m; - - ceqbs = model->B2type * (cbs-(gbs-ckt->CKTgmin)*vbs); - ceqbd = model->B2type * (cbd-(gbd-ckt->CKTgmin)*vbd); - - ceqqg = model->B2type * ceqqg; - ceqqb = model->B2type * ceqqb; - ceqqd = model->B2type * ceqqd; - if (here->B2mode >= 0) { - xnrm=1; - xrev=0; - cdreq=model->B2type*(cdrain-gds*vds-gm*vgs-gmbs*vbs); - } else { - xnrm=0; - xrev=1; - cdreq = -(model->B2type)*(cdrain+gds*vds-gm*vgd-gmbs*vbd); - } - - *(ckt->CKTrhs + here->B2gNode) -= m * (ceqqg); - *(ckt->CKTrhs + here->B2bNode) -= m * (ceqbs+ceqbd+ceqqb); - *(ckt->CKTrhs + here->B2dNodePrime) += - m * (ceqbd-cdreq-ceqqd); - *(ckt->CKTrhs + here->B2sNodePrime) += - m * (cdreq+ceqbs+ceqqg+ceqqb+ceqqd); - - /* - * load y matrix - */ - - *(here->B2DdPtr) += m * (here->B2drainConductance); - *(here->B2GgPtr) += m * (gcggb); - *(here->B2SsPtr) += m * (here->B2sourceConductance); - *(here->B2BbPtr) += m * (gbd+gbs-gcbgb-gcbdb-gcbsb); - *(here->B2DPdpPtr) += - m * (here->B2drainConductance+gds+gbd+xrev*(gm+gmbs)+gcddb); - *(here->B2SPspPtr) += - m * (here->B2sourceConductance+gds+gbs+xnrm*(gm+gmbs)+gcssb); - *(here->B2DdpPtr) += m * (-here->B2drainConductance); - *(here->B2GbPtr) += m * (-gcggb-gcgdb-gcgsb); - *(here->B2GdpPtr) += m * (gcgdb); - *(here->B2GspPtr) += m * (gcgsb); - *(here->B2SspPtr) += m * (-here->B2sourceConductance); - *(here->B2BgPtr) += m * (gcbgb); - *(here->B2BdpPtr) += m * (-gbd+gcbdb); - *(here->B2BspPtr) += m * (-gbs+gcbsb); - *(here->B2DPdPtr) += m * (-here->B2drainConductance); - *(here->B2DPgPtr) += m * ((xnrm-xrev)*gm+gcdgb); - *(here->B2DPbPtr) += m * (-gbd+(xnrm-xrev)*gmbs-gcdgb-gcddb-gcdsb); - *(here->B2DPspPtr) += m * (-gds-xnrm*(gm+gmbs)+gcdsb); - *(here->B2SPgPtr) += m * (-(xnrm-xrev)*gm+gcsgb); - *(here->B2SPsPtr) += m * (-here->B2sourceConductance); - *(here->B2SPbPtr) += m * (-gbs-(xnrm-xrev)*gmbs-gcsgb-gcsdb-gcssb); - *(here->B2SPdpPtr) += m * (-gds-xrev*(gm+gmbs)+gcsdb); - - -line1000: ; - - } /* End of Mosfet Instance */ - - } /* End of Model Instance */ - return(OK); -} - diff --git a/src/spicelib/devices/bsim2/b2mask.c b/src/spicelib/devices/bsim2/b2mask.c deleted file mode 100644 index 4a4ed4db8..000000000 --- a/src/spicelib/devices/bsim2/b2mask.c +++ /dev/null @@ -1,437 +0,0 @@ -/********** -Copyright 1990 Regents of the University of California. All rights reserved. -Author: 1988 Hong J. Park -**********/ -/* - */ - -#include "ngspice/ngspice.h" -#include "ngspice/ifsim.h" -#include "ngspice/cktdefs.h" -#include "ngspice/devdefs.h" -#include "bsim2def.h" -#include "ngspice/sperror.h" -#include "ngspice/suffix.h" - - -/*ARGSUSED*/ -int -B2mAsk(CKTcircuit *ckt, GENmodel *inst, int which, IFvalue *value) -{ - B2model *model = (B2model *)inst; - - NG_IGNORE(ckt); - - switch(which) { - case BSIM2_MOD_VFB0: - value->rValue = model->B2vfb0; - return(OK); - case BSIM2_MOD_VFBL : - value->rValue = model->B2vfbL; - return(OK); - case BSIM2_MOD_VFBW : - value->rValue = model->B2vfbW; - return(OK); - case BSIM2_MOD_PHI0 : - value->rValue = model->B2phi0; - return(OK); - case BSIM2_MOD_PHIL : - value->rValue = model->B2phiL; - return(OK); - case BSIM2_MOD_PHIW : - value->rValue = model->B2phiW; - return(OK); - case BSIM2_MOD_K10 : - value->rValue = model->B2k10; - return(OK); - case BSIM2_MOD_K1L : - value->rValue = model->B2k1L; - return(OK); - case BSIM2_MOD_K1W : - value->rValue = model->B2k1W; - return(OK); - case BSIM2_MOD_K20 : - value->rValue = model->B2k20; - return(OK); - case BSIM2_MOD_K2L : - value->rValue = model->B2k2L; - return(OK); - case BSIM2_MOD_K2W : - value->rValue = model->B2k2W; - return(OK); - case BSIM2_MOD_ETA00 : - value->rValue = model->B2eta00; - return(OK); - case BSIM2_MOD_ETA0L : - value->rValue = model->B2eta0L; - return(OK); - case BSIM2_MOD_ETA0W : - value->rValue = model->B2eta0W; - return(OK); - case BSIM2_MOD_ETAB0 : - value->rValue = model->B2etaB0; - return(OK); - case BSIM2_MOD_ETABL : - value->rValue = model->B2etaBL; - return(OK); - case BSIM2_MOD_ETABW : - value->rValue = model->B2etaBW; - return(OK); - case BSIM2_MOD_DELTAL : - value->rValue = model->B2deltaL = value->rValue; - return(OK); - case BSIM2_MOD_DELTAW : - value->rValue = model->B2deltaW = value->rValue; - return(OK); - case BSIM2_MOD_MOB00 : - value->rValue = model->B2mob00; - return(OK); - case BSIM2_MOD_MOB0B0 : - value->rValue = model->B2mob0B0; - return(OK); - case BSIM2_MOD_MOB0BL : - value->rValue = model->B2mob0BL; - return(OK); - case BSIM2_MOD_MOB0BW : - value->rValue = model->B2mob0BW; - return(OK); - case BSIM2_MOD_MOBS00 : - value->rValue = model->B2mobs00; - return(OK); - case BSIM2_MOD_MOBS0L : - value->rValue = model->B2mobs0L; - return(OK); - case BSIM2_MOD_MOBS0W : - value->rValue = model->B2mobs0W; - return(OK); - case BSIM2_MOD_MOBSB0 : - value->rValue = model->B2mobsB0; - return(OK); - case BSIM2_MOD_MOBSBL : - value->rValue = model->B2mobsBL; - return(OK); - case BSIM2_MOD_MOBSBW : - value->rValue = model->B2mobsBW; - return(OK); - case BSIM2_MOD_MOB200 : - value->rValue = model->B2mob200; - return(OK); - case BSIM2_MOD_MOB20L : - value->rValue = model->B2mob20L; - return(OK); - case BSIM2_MOD_MOB20W : - value->rValue = model->B2mob20W; - return(OK); - case BSIM2_MOD_MOB2B0 : - value->rValue = model->B2mob2B0; - return(OK); - case BSIM2_MOD_MOB2BL : - value->rValue = model->B2mob2BL; - return(OK); - case BSIM2_MOD_MOB2BW : - value->rValue = model->B2mob2BW; - return(OK); - case BSIM2_MOD_MOB2G0 : - value->rValue = model->B2mob2G0; - return(OK); - case BSIM2_MOD_MOB2GL : - value->rValue = model->B2mob2GL; - return(OK); - case BSIM2_MOD_MOB2GW : - value->rValue = model->B2mob2GW; - return(OK); - case BSIM2_MOD_MOB300 : - value->rValue = model->B2mob300; - return(OK); - case BSIM2_MOD_MOB30L : - value->rValue = model->B2mob30L; - return(OK); - case BSIM2_MOD_MOB30W : - value->rValue = model->B2mob30W; - return(OK); - case BSIM2_MOD_MOB3B0 : - value->rValue = model->B2mob3B0; - return(OK); - case BSIM2_MOD_MOB3BL : - value->rValue = model->B2mob3BL; - return(OK); - case BSIM2_MOD_MOB3BW : - value->rValue = model->B2mob3BW; - return(OK); - case BSIM2_MOD_MOB3G0 : - value->rValue = model->B2mob3G0; - return(OK); - case BSIM2_MOD_MOB3GL : - value->rValue = model->B2mob3GL; - return(OK); - case BSIM2_MOD_MOB3GW : - value->rValue = model->B2mob3GW; - return(OK); - case BSIM2_MOD_MOB400 : - value->rValue = model->B2mob400; - return(OK); - case BSIM2_MOD_MOB40L : - value->rValue = model->B2mob40L; - return(OK); - case BSIM2_MOD_MOB40W : - value->rValue = model->B2mob40W; - return(OK); - case BSIM2_MOD_MOB4B0 : - value->rValue = model->B2mob4B0; - return(OK); - case BSIM2_MOD_MOB4BL : - value->rValue = model->B2mob4BL; - return(OK); - case BSIM2_MOD_MOB4BW : - value->rValue = model->B2mob4BW; - return(OK); - case BSIM2_MOD_MOB4G0 : - value->rValue = model->B2mob4G0; - return(OK); - case BSIM2_MOD_MOB4GL : - value->rValue = model->B2mob4GL; - return(OK); - case BSIM2_MOD_MOB4GW : - value->rValue = model->B2mob4GW; - return(OK); - case BSIM2_MOD_UA00 : - value->rValue = model->B2ua00; - return(OK); - case BSIM2_MOD_UA0L : - value->rValue = model->B2ua0L; - return(OK); - case BSIM2_MOD_UA0W : - value->rValue = model->B2ua0W; - return(OK); - case BSIM2_MOD_UAB0 : - value->rValue = model->B2uaB0; - return(OK); - case BSIM2_MOD_UABL : - value->rValue = model->B2uaBL; - return(OK); - case BSIM2_MOD_UABW : - value->rValue = model->B2uaBW; - return(OK); - case BSIM2_MOD_UB00 : - value->rValue = model->B2ub00; - return(OK); - case BSIM2_MOD_UB0L : - value->rValue = model->B2ub0L; - return(OK); - case BSIM2_MOD_UB0W : - value->rValue = model->B2ub0W; - return(OK); - case BSIM2_MOD_UBB0 : - value->rValue = model->B2ubB0; - return(OK); - case BSIM2_MOD_UBBL : - value->rValue = model->B2ubBL; - return(OK); - case BSIM2_MOD_UBBW : - value->rValue = model->B2ubBW; - return(OK); - case BSIM2_MOD_U100 : - value->rValue = model->B2u100; - return(OK); - case BSIM2_MOD_U10L : - value->rValue = model->B2u10L; - return(OK); - case BSIM2_MOD_U10W : - value->rValue = model->B2u10W; - return(OK); - case BSIM2_MOD_U1B0 : - value->rValue = model->B2u1B0; - return(OK); - case BSIM2_MOD_U1BL : - value->rValue = model->B2u1BL; - return(OK); - case BSIM2_MOD_U1BW : - value->rValue = model->B2u1BW; - return(OK); - case BSIM2_MOD_U1D0 : - value->rValue = model->B2u1D0; - return(OK); - case BSIM2_MOD_U1DL : - value->rValue = model->B2u1DL; - return(OK); - case BSIM2_MOD_U1DW : - value->rValue = model->B2u1DW; - return(OK); - case BSIM2_MOD_N00 : - value->rValue = model->B2n00; - return(OK); - case BSIM2_MOD_N0L : - value->rValue = model->B2n0L; - return(OK); - case BSIM2_MOD_N0W : - value->rValue = model->B2n0W; - return(OK); - case BSIM2_MOD_NB0 : - value->rValue = model->B2nB0; - return(OK); - case BSIM2_MOD_NBL : - value->rValue = model->B2nBL; - return(OK); - case BSIM2_MOD_NBW : - value->rValue = model->B2nBW; - return(OK); - case BSIM2_MOD_ND0 : - value->rValue = model->B2nD0; - return(OK); - case BSIM2_MOD_NDL : - value->rValue = model->B2nDL; - return(OK); - case BSIM2_MOD_NDW : - value->rValue = model->B2nDW; - return(OK); - case BSIM2_MOD_VOF00 : - value->rValue = model->B2vof00; - return(OK); - case BSIM2_MOD_VOF0L : - value->rValue = model->B2vof0L; - return(OK); - case BSIM2_MOD_VOF0W : - value->rValue = model->B2vof0W; - return(OK); - case BSIM2_MOD_VOFB0 : - value->rValue = model->B2vofB0; - return(OK); - case BSIM2_MOD_VOFBL : - value->rValue = model->B2vofBL; - return(OK); - case BSIM2_MOD_VOFBW : - value->rValue = model->B2vofBW; - return(OK); - case BSIM2_MOD_VOFD0 : - value->rValue = model->B2vofD0; - return(OK); - case BSIM2_MOD_VOFDL : - value->rValue = model->B2vofDL; - return(OK); - case BSIM2_MOD_VOFDW : - value->rValue = model->B2vofDW; - return(OK); - case BSIM2_MOD_AI00 : - value->rValue = model->B2ai00; - return(OK); - case BSIM2_MOD_AI0L : - value->rValue = model->B2ai0L; - return(OK); - case BSIM2_MOD_AI0W : - value->rValue = model->B2ai0W; - return(OK); - case BSIM2_MOD_AIB0 : - value->rValue = model->B2aiB0; - return(OK); - case BSIM2_MOD_AIBL : - value->rValue = model->B2aiBL; - return(OK); - case BSIM2_MOD_AIBW : - value->rValue = model->B2aiBW; - return(OK); - case BSIM2_MOD_BI00 : - value->rValue = model->B2bi00; - return(OK); - case BSIM2_MOD_BI0L : - value->rValue = model->B2bi0L; - return(OK); - case BSIM2_MOD_BI0W : - value->rValue = model->B2bi0W; - return(OK); - case BSIM2_MOD_BIB0 : - value->rValue = model->B2biB0; - return(OK); - case BSIM2_MOD_BIBL : - value->rValue = model->B2biBL; - return(OK); - case BSIM2_MOD_BIBW : - value->rValue = model->B2biBW; - return(OK); - case BSIM2_MOD_VGHIGH0 : - value->rValue = model->B2vghigh0; - return(OK); - case BSIM2_MOD_VGHIGHL : - value->rValue = model->B2vghighL; - return(OK); - case BSIM2_MOD_VGHIGHW : - value->rValue = model->B2vghighW; - return(OK); - case BSIM2_MOD_VGLOW0 : - value->rValue = model->B2vglow0; - return(OK); - case BSIM2_MOD_VGLOWL : - value->rValue = model->B2vglowL; - return(OK); - case BSIM2_MOD_VGLOWW : - value->rValue = model->B2vglowW; - return(OK); - case BSIM2_MOD_TOX : - value->rValue = model->B2tox; - return(OK); - case BSIM2_MOD_TEMP : - value->rValue = model->B2temp; - return(OK); - case BSIM2_MOD_VDD : - value->rValue = model->B2vdd; - return(OK); - case BSIM2_MOD_VGG : - value->rValue = model->B2vgg; - return(OK); - case BSIM2_MOD_VBB : - value->rValue = model->B2vbb; - return(OK); - case BSIM2_MOD_CGSO: - value->rValue = model->B2gateSourceOverlapCap; - return(OK); - case BSIM2_MOD_CGDO: - value->rValue = model->B2gateDrainOverlapCap; - return(OK); - case BSIM2_MOD_CGBO: - value->rValue = model->B2gateBulkOverlapCap; - return(OK); - case BSIM2_MOD_XPART: - value->iValue = model->B2channelChargePartitionFlag; - return(OK); - case BSIM2_MOD_RSH: - value->rValue = model->B2sheetResistance; - return(OK); - case BSIM2_MOD_JS: - value->rValue = model->B2jctSatCurDensity; - return(OK); - case BSIM2_MOD_PB: - value->rValue = model->B2bulkJctPotential; - return(OK); - case BSIM2_MOD_MJ: - value->rValue = model->B2bulkJctBotGradingCoeff; - return(OK); - case BSIM2_MOD_PBSW: - value->rValue = model->B2sidewallJctPotential; - return(OK); - case BSIM2_MOD_MJSW: - value->rValue = model->B2bulkJctSideGradingCoeff; - return(OK); - case BSIM2_MOD_CJ: - value->rValue = model->B2unitAreaJctCap; - return(OK); - case BSIM2_MOD_CJSW: - value->rValue = model->B2unitLengthSidewallJctCap; - return(OK); - case BSIM2_MOD_DEFWIDTH: - value->rValue = model->B2defaultWidth; - return(OK); - case BSIM2_MOD_DELLENGTH: - value->rValue = model->B2deltaLength; - return(OK); - case BSIM2_MOD_AF: - value->rValue = model->B2fNexp; - return(OK); - case BSIM2_MOD_KF: - value->rValue = model->B2fNcoef; - return(OK); - default: - return(E_BADPARM); - } - /* NOTREACHED */ -} - - diff --git a/src/spicelib/devices/bsim2/b2moscap.c b/src/spicelib/devices/bsim2/b2moscap.c deleted file mode 100644 index ec38e39ac..000000000 --- a/src/spicelib/devices/bsim2/b2moscap.c +++ /dev/null @@ -1,88 +0,0 @@ -/********** -Copyright 1990 Regents of the University of California. All rights reserved. -Author: 1985 Hong J. Park, Thomas L. Quarles -**********/ - -#include "ngspice/ngspice.h" -#include "ngspice/cktdefs.h" -#include "bsim2def.h" -#include "ngspice/suffix.h" - -/* routine to calculate equivalent conductance and total terminal - * charges - */ - -void -B2mosCap( - CKTcircuit *ckt, - double vgd, - double vgs, - double vgb, - double args[8], - /* - double GateDrainOverlapCap, - double GateSourceOverlapCap, - double GateBulkOverlapCap, - double capbd, - double capbs, - double cggb, - double cgdb, - double cgsb, - */ - double cbgb, - double cbdb, - double cbsb, - double cdgb, - double cddb, - double cdsb, - double *gcggbPointer, - double *gcgdbPointer, - double *gcgsbPointer, - double *gcbgbPointer, - double *gcbdbPointer, - double *gcbsbPointer, - double *gcdgbPointer, - double *gcddbPointer, - double *gcdsbPointer, - double *gcsgbPointer, - double *gcsdbPointer, - double *gcssbPointer, - double *qGatePointer, - double *qBulkPointer, - double *qDrainPointer, - double *qSourcePointer) -{ - double qgd; - double qgs; - double qgb; - double ag0; - - ag0 = ckt->CKTag[0]; - /* compute equivalent conductance */ - *gcdgbPointer = (cdgb - args[0]) * ag0; - *gcddbPointer = (cddb + args[3] + args[0]) * ag0; - *gcdsbPointer = cdsb * ag0; - *gcsgbPointer = -(args[5] + cbgb + cdgb + args[1]) * ag0; - *gcsdbPointer = -(args[6] + cbdb + cddb ) * ag0; - *gcssbPointer = (args[4] + args[1] - - (args[7] + cbsb + cdsb )) * ag0; - *gcggbPointer = (args[5] + args[0] + - args[1] + args[2] ) * ag0; - *gcgdbPointer = (args[6] - args[0]) * ag0; - *gcgsbPointer = (args[7] - args[1]) * ag0; - *gcbgbPointer = (cbgb - args[2]) * ag0; - *gcbdbPointer = (cbdb - args[3]) * ag0; - *gcbsbPointer = (cbsb - args[4]) * ag0; - - /* compute total terminal charge */ - qgd = args[0] * vgd; - qgs = args[1] * vgs; - qgb = args[2] * vgb; - *qGatePointer = *qGatePointer + qgd + qgs + qgb; - *qBulkPointer = *qBulkPointer - qgb; - *qDrainPointer = *qDrainPointer - qgd; - *qSourcePointer = -(*qGatePointer + *qBulkPointer + *qDrainPointer); - -} - - diff --git a/src/spicelib/devices/bsim2/b2mpar.c b/src/spicelib/devices/bsim2/b2mpar.c deleted file mode 100644 index 54389b85b..000000000 --- a/src/spicelib/devices/bsim2/b2mpar.c +++ /dev/null @@ -1,576 +0,0 @@ -/********** -Copyright 1990 Regents of the University of California. All rights reserved. -Author: 1988 Min-Chie Jeng, Hong J. Park, Thomas L. Quarles -**********/ -/* - */ - -#include "ngspice/ngspice.h" -#include "bsim2def.h" -#include "ngspice/ifsim.h" -#include "ngspice/sperror.h" -#include "ngspice/suffix.h" - - -int -B2mParam(int param, IFvalue *value, GENmodel *inMod) -{ - B2model *mod = (B2model*)inMod; - switch(param) { - case BSIM2_MOD_VFB0 : - mod->B2vfb0 = value->rValue; - mod->B2vfb0Given = TRUE; - break; - case BSIM2_MOD_VFBL : - mod->B2vfbL = value->rValue; - mod->B2vfbLGiven = TRUE; - break; - case BSIM2_MOD_VFBW : - mod->B2vfbW = value->rValue; - mod->B2vfbWGiven = TRUE; - break; - case BSIM2_MOD_PHI0 : - mod->B2phi0 = value->rValue; - mod->B2phi0Given = TRUE; - break; - case BSIM2_MOD_PHIL : - mod->B2phiL = value->rValue; - mod->B2phiLGiven = TRUE; - break; - case BSIM2_MOD_PHIW : - mod->B2phiW = value->rValue; - mod->B2phiWGiven = TRUE; - break; - case BSIM2_MOD_K10 : - mod->B2k10 = value->rValue; - mod->B2k10Given = TRUE; - break; - case BSIM2_MOD_K1L : - mod->B2k1L = value->rValue; - mod->B2k1LGiven = TRUE; - break; - case BSIM2_MOD_K1W : - mod->B2k1W = value->rValue; - mod->B2k1WGiven = TRUE; - break; - case BSIM2_MOD_K20 : - mod->B2k20 = value->rValue; - mod->B2k20Given = TRUE; - break; - case BSIM2_MOD_K2L : - mod->B2k2L = value->rValue; - mod->B2k2LGiven = TRUE; - break; - case BSIM2_MOD_K2W : - mod->B2k2W = value->rValue; - mod->B2k2WGiven = TRUE; - break; - case BSIM2_MOD_ETA00 : - mod->B2eta00 = value->rValue; - mod->B2eta00Given = TRUE; - break; - case BSIM2_MOD_ETA0L : - mod->B2eta0L = value->rValue; - mod->B2eta0LGiven = TRUE; - break; - case BSIM2_MOD_ETA0W : - mod->B2eta0W = value->rValue; - mod->B2eta0WGiven = TRUE; - break; - case BSIM2_MOD_ETAB0 : - mod->B2etaB0 = value->rValue; - mod->B2etaB0Given = TRUE; - break; - case BSIM2_MOD_ETABL : - mod->B2etaBL = value->rValue; - mod->B2etaBLGiven = TRUE; - break; - case BSIM2_MOD_ETABW : - mod->B2etaBW = value->rValue; - mod->B2etaBWGiven = TRUE; - break; - case BSIM2_MOD_DELTAL : - mod->B2deltaL = value->rValue; - mod->B2deltaLGiven = TRUE; - break; - case BSIM2_MOD_DELTAW : - mod->B2deltaW = value->rValue; - mod->B2deltaWGiven = TRUE; - break; - case BSIM2_MOD_MOB00 : - mod->B2mob00 = value->rValue; - mod->B2mob00Given = TRUE; - break; - case BSIM2_MOD_MOB0B0 : - mod->B2mob0B0 = value->rValue; - mod->B2mob0B0Given = TRUE; - break; - case BSIM2_MOD_MOB0BL : - mod->B2mob0BL = value->rValue; - mod->B2mob0BLGiven = TRUE; - break; - case BSIM2_MOD_MOB0BW : - mod->B2mob0BW = value->rValue; - mod->B2mob0BWGiven = TRUE; - break; - case BSIM2_MOD_MOBS00 : - mod->B2mobs00 = value->rValue; - mod->B2mobs00Given = TRUE; - break; - case BSIM2_MOD_MOBS0L : - mod->B2mobs0L = value->rValue; - mod->B2mobs0LGiven = TRUE; - break; - case BSIM2_MOD_MOBS0W : - mod->B2mobs0W = value->rValue; - mod->B2mobs0WGiven = TRUE; - break; - case BSIM2_MOD_MOBSB0 : - mod->B2mobsB0 = value->rValue; - mod->B2mobsB0Given = TRUE; - break; - case BSIM2_MOD_MOBSBL : - mod->B2mobsBL = value->rValue; - mod->B2mobsBLGiven = TRUE; - break; - case BSIM2_MOD_MOBSBW : - mod->B2mobsBW = value->rValue; - mod->B2mobsBWGiven = TRUE; - break; - case BSIM2_MOD_MOB200 : - mod->B2mob200 = value->rValue; - mod->B2mob200Given = TRUE; - break; - case BSIM2_MOD_MOB20L : - mod->B2mob20L = value->rValue; - mod->B2mob20LGiven = TRUE; - break; - case BSIM2_MOD_MOB20W : - mod->B2mob20W = value->rValue; - mod->B2mob20WGiven = TRUE; - break; - case BSIM2_MOD_MOB2B0 : - mod->B2mob2B0 = value->rValue; - mod->B2mob2B0Given = TRUE; - break; - case BSIM2_MOD_MOB2BL : - mod->B2mob2BL = value->rValue; - mod->B2mob2BLGiven = TRUE; - break; - case BSIM2_MOD_MOB2BW : - mod->B2mob2BW = value->rValue; - mod->B2mob2BWGiven = TRUE; - break; - case BSIM2_MOD_MOB2G0 : - mod->B2mob2G0 = value->rValue; - mod->B2mob2G0Given = TRUE; - break; - case BSIM2_MOD_MOB2GL : - mod->B2mob2GL = value->rValue; - mod->B2mob2GLGiven = TRUE; - break; - case BSIM2_MOD_MOB2GW : - mod->B2mob2GW = value->rValue; - mod->B2mob2GWGiven = TRUE; - break; - case BSIM2_MOD_MOB300 : - mod->B2mob300 = value->rValue; - mod->B2mob300Given = TRUE; - break; - case BSIM2_MOD_MOB30L : - mod->B2mob30L = value->rValue; - mod->B2mob30LGiven = TRUE; - break; - case BSIM2_MOD_MOB30W : - mod->B2mob30W = value->rValue; - mod->B2mob30WGiven = TRUE; - break; - case BSIM2_MOD_MOB3B0 : - mod->B2mob3B0 = value->rValue; - mod->B2mob3B0Given = TRUE; - break; - case BSIM2_MOD_MOB3BL : - mod->B2mob3BL = value->rValue; - mod->B2mob3BLGiven = TRUE; - break; - case BSIM2_MOD_MOB3BW : - mod->B2mob3BW = value->rValue; - mod->B2mob3BWGiven = TRUE; - break; - case BSIM2_MOD_MOB3G0 : - mod->B2mob3G0 = value->rValue; - mod->B2mob3G0Given = TRUE; - break; - case BSIM2_MOD_MOB3GL : - mod->B2mob3GL = value->rValue; - mod->B2mob3GLGiven = TRUE; - break; - case BSIM2_MOD_MOB3GW : - mod->B2mob3GW = value->rValue; - mod->B2mob3GWGiven = TRUE; - break; - case BSIM2_MOD_MOB400 : - mod->B2mob400 = value->rValue; - mod->B2mob400Given = TRUE; - break; - case BSIM2_MOD_MOB40L : - mod->B2mob40L = value->rValue; - mod->B2mob40LGiven = TRUE; - break; - case BSIM2_MOD_MOB40W : - mod->B2mob40W = value->rValue; - mod->B2mob40WGiven = TRUE; - break; - case BSIM2_MOD_MOB4B0 : - mod->B2mob4B0 = value->rValue; - mod->B2mob4B0Given = TRUE; - break; - case BSIM2_MOD_MOB4BL : - mod->B2mob4BL = value->rValue; - mod->B2mob4BLGiven = TRUE; - break; - case BSIM2_MOD_MOB4BW : - mod->B2mob4BW = value->rValue; - mod->B2mob4BWGiven = TRUE; - break; - case BSIM2_MOD_MOB4G0 : - mod->B2mob4G0 = value->rValue; - mod->B2mob4G0Given = TRUE; - break; - case BSIM2_MOD_MOB4GL : - mod->B2mob4GL = value->rValue; - mod->B2mob4GLGiven = TRUE; - break; - case BSIM2_MOD_MOB4GW : - mod->B2mob4GW = value->rValue; - mod->B2mob4GWGiven = TRUE; - break; - case BSIM2_MOD_UA00 : - mod->B2ua00 = value->rValue; - mod->B2ua00Given = TRUE; - break; - case BSIM2_MOD_UA0L : - mod->B2ua0L = value->rValue; - mod->B2ua0LGiven = TRUE; - break; - case BSIM2_MOD_UA0W : - mod->B2ua0W = value->rValue; - mod->B2ua0WGiven = TRUE; - break; - case BSIM2_MOD_UAB0 : - mod->B2uaB0 = value->rValue; - mod->B2uaB0Given = TRUE; - break; - case BSIM2_MOD_UABL : - mod->B2uaBL = value->rValue; - mod->B2uaBLGiven = TRUE; - break; - case BSIM2_MOD_UABW : - mod->B2uaBW = value->rValue; - mod->B2uaBWGiven = TRUE; - break; - case BSIM2_MOD_UB00 : - mod->B2ub00 = value->rValue; - mod->B2ub00Given = TRUE; - break; - case BSIM2_MOD_UB0L : - mod->B2ub0L = value->rValue; - mod->B2ub0LGiven = TRUE; - break; - case BSIM2_MOD_UB0W : - mod->B2ub0W = value->rValue; - mod->B2ub0WGiven = TRUE; - break; - case BSIM2_MOD_UBB0 : - mod->B2ubB0 = value->rValue; - mod->B2ubB0Given = TRUE; - break; - case BSIM2_MOD_UBBL : - mod->B2ubBL = value->rValue; - mod->B2ubBLGiven = TRUE; - break; - case BSIM2_MOD_UBBW : - mod->B2ubBW = value->rValue; - mod->B2ubBWGiven = TRUE; - break; - case BSIM2_MOD_U100 : - mod->B2u100 = value->rValue; - mod->B2u100Given = TRUE; - break; - case BSIM2_MOD_U10L : - mod->B2u10L = value->rValue; - mod->B2u10LGiven = TRUE; - break; - case BSIM2_MOD_U10W : - mod->B2u10W = value->rValue; - mod->B2u10WGiven = TRUE; - break; - case BSIM2_MOD_U1B0 : - mod->B2u1B0 = value->rValue; - mod->B2u1B0Given = TRUE; - break; - case BSIM2_MOD_U1BL : - mod->B2u1BL = value->rValue; - mod->B2u1BLGiven = TRUE; - break; - case BSIM2_MOD_U1BW : - mod->B2u1BW = value->rValue; - mod->B2u1BWGiven = TRUE; - break; - case BSIM2_MOD_U1D0 : - mod->B2u1D0 = value->rValue; - mod->B2u1D0Given = TRUE; - break; - case BSIM2_MOD_U1DL : - mod->B2u1DL = value->rValue; - mod->B2u1DLGiven = TRUE; - break; - case BSIM2_MOD_U1DW : - mod->B2u1DW = value->rValue; - mod->B2u1DWGiven = TRUE; - break; - case BSIM2_MOD_N00 : - mod->B2n00 = value->rValue; - mod->B2n00Given = TRUE; - break; - case BSIM2_MOD_N0L : - mod->B2n0L = value->rValue; - mod->B2n0LGiven = TRUE; - break; - case BSIM2_MOD_N0W : - mod->B2n0W = value->rValue; - mod->B2n0WGiven = TRUE; - break; - case BSIM2_MOD_NB0 : - mod->B2nB0 = value->rValue; - mod->B2nB0Given = TRUE; - break; - case BSIM2_MOD_NBL : - mod->B2nBL = value->rValue; - mod->B2nBLGiven = TRUE; - break; - case BSIM2_MOD_NBW : - mod->B2nBW = value->rValue; - mod->B2nBWGiven = TRUE; - break; - case BSIM2_MOD_ND0 : - mod->B2nD0 = value->rValue; - mod->B2nD0Given = TRUE; - break; - case BSIM2_MOD_NDL : - mod->B2nDL = value->rValue; - mod->B2nDLGiven = TRUE; - break; - case BSIM2_MOD_NDW : - mod->B2nDW = value->rValue; - mod->B2nDWGiven = TRUE; - break; - case BSIM2_MOD_VOF00 : - mod->B2vof00 = value->rValue; - mod->B2vof00Given = TRUE; - break; - case BSIM2_MOD_VOF0L : - mod->B2vof0L = value->rValue; - mod->B2vof0LGiven = TRUE; - break; - case BSIM2_MOD_VOF0W : - mod->B2vof0W = value->rValue; - mod->B2vof0WGiven = TRUE; - break; - case BSIM2_MOD_VOFB0 : - mod->B2vofB0 = value->rValue; - mod->B2vofB0Given = TRUE; - break; - case BSIM2_MOD_VOFBL : - mod->B2vofBL = value->rValue; - mod->B2vofBLGiven = TRUE; - break; - case BSIM2_MOD_VOFBW : - mod->B2vofBW = value->rValue; - mod->B2vofBWGiven = TRUE; - break; - case BSIM2_MOD_VOFD0 : - mod->B2vofD0 = value->rValue; - mod->B2vofD0Given = TRUE; - break; - case BSIM2_MOD_VOFDL : - mod->B2vofDL = value->rValue; - mod->B2vofDLGiven = TRUE; - break; - case BSIM2_MOD_VOFDW : - mod->B2vofDW = value->rValue; - mod->B2vofDWGiven = TRUE; - break; - case BSIM2_MOD_AI00 : - mod->B2ai00 = value->rValue; - mod->B2ai00Given = TRUE; - break; - case BSIM2_MOD_AI0L : - mod->B2ai0L = value->rValue; - mod->B2ai0LGiven = TRUE; - break; - case BSIM2_MOD_AI0W : - mod->B2ai0W = value->rValue; - mod->B2ai0WGiven = TRUE; - break; - case BSIM2_MOD_AIB0 : - mod->B2aiB0 = value->rValue; - mod->B2aiB0Given = TRUE; - break; - case BSIM2_MOD_AIBL : - mod->B2aiBL = value->rValue; - mod->B2aiBLGiven = TRUE; - break; - case BSIM2_MOD_AIBW : - mod->B2aiBW = value->rValue; - mod->B2aiBWGiven = TRUE; - break; - case BSIM2_MOD_BI00 : - mod->B2bi00 = value->rValue; - mod->B2bi00Given = TRUE; - break; - case BSIM2_MOD_BI0L : - mod->B2bi0L = value->rValue; - mod->B2bi0LGiven = TRUE; - break; - case BSIM2_MOD_BI0W : - mod->B2bi0W = value->rValue; - mod->B2bi0WGiven = TRUE; - break; - case BSIM2_MOD_BIB0 : - mod->B2biB0 = value->rValue; - mod->B2biB0Given = TRUE; - break; - case BSIM2_MOD_BIBL : - mod->B2biBL = value->rValue; - mod->B2biBLGiven = TRUE; - break; - case BSIM2_MOD_BIBW : - mod->B2biBW = value->rValue; - mod->B2biBWGiven = TRUE; - break; - case BSIM2_MOD_VGHIGH0 : - mod->B2vghigh0 = value->rValue; - mod->B2vghigh0Given = TRUE; - break; - case BSIM2_MOD_VGHIGHL : - mod->B2vghighL = value->rValue; - mod->B2vghighLGiven = TRUE; - break; - case BSIM2_MOD_VGHIGHW : - mod->B2vghighW = value->rValue; - mod->B2vghighWGiven = TRUE; - break; - case BSIM2_MOD_VGLOW0 : - mod->B2vglow0 = value->rValue; - mod->B2vglow0Given = TRUE; - break; - case BSIM2_MOD_VGLOWL : - mod->B2vglowL = value->rValue; - mod->B2vglowLGiven = TRUE; - break; - case BSIM2_MOD_VGLOWW : - mod->B2vglowW = value->rValue; - mod->B2vglowWGiven = TRUE; - break; - case BSIM2_MOD_TOX : - mod->B2tox = value->rValue; - mod->B2toxGiven = TRUE; - break; - case BSIM2_MOD_TEMP : - mod->B2temp = value->rValue; - mod->B2tempGiven = TRUE; - break; - case BSIM2_MOD_VDD : - mod->B2vdd = value->rValue; - mod->B2vddGiven = TRUE; - break; - case BSIM2_MOD_VGG : - mod->B2vgg = value->rValue; - mod->B2vggGiven = TRUE; - break; - case BSIM2_MOD_VBB : - mod->B2vbb = value->rValue; - mod->B2vbbGiven = TRUE; - break; - case BSIM2_MOD_CGSO : - mod->B2gateSourceOverlapCap = value->rValue; - mod->B2gateSourceOverlapCapGiven = TRUE; - break; - case BSIM2_MOD_CGDO : - mod->B2gateDrainOverlapCap = value->rValue; - mod->B2gateDrainOverlapCapGiven = TRUE; - break; - case BSIM2_MOD_CGBO : - mod->B2gateBulkOverlapCap = value->rValue; - mod->B2gateBulkOverlapCapGiven = TRUE; - break; - case BSIM2_MOD_XPART : - mod->B2channelChargePartitionFlag = (value->iValue != 0); - mod->B2channelChargePartitionFlagGiven = TRUE; - break; - case BSIM2_MOD_RSH : - mod->B2sheetResistance = value->rValue; - mod->B2sheetResistanceGiven = TRUE; - break; - case BSIM2_MOD_JS : - mod->B2jctSatCurDensity = value->rValue; - mod->B2jctSatCurDensityGiven = TRUE; - break; - case BSIM2_MOD_PB : - mod->B2bulkJctPotential = value->rValue; - mod->B2bulkJctPotentialGiven = TRUE; - break; - case BSIM2_MOD_MJ : - mod->B2bulkJctBotGradingCoeff = value->rValue; - mod->B2bulkJctBotGradingCoeffGiven = TRUE; - break; - case BSIM2_MOD_PBSW : - mod->B2sidewallJctPotential = value->rValue; - mod->B2sidewallJctPotentialGiven = TRUE; - break; - case BSIM2_MOD_MJSW : - mod->B2bulkJctSideGradingCoeff = value->rValue; - mod->B2bulkJctSideGradingCoeffGiven = TRUE; - break; - case BSIM2_MOD_CJ : - mod->B2unitAreaJctCap = value->rValue; - mod->B2unitAreaJctCapGiven = TRUE; - break; - case BSIM2_MOD_CJSW : - mod->B2unitLengthSidewallJctCap = value->rValue; - mod->B2unitLengthSidewallJctCapGiven = TRUE; - break; - case BSIM2_MOD_DEFWIDTH : - mod->B2defaultWidth = value->rValue; - mod->B2defaultWidthGiven = TRUE; - break; - case BSIM2_MOD_DELLENGTH : - mod->B2deltaLength = value->rValue; - mod->B2deltaLengthGiven = TRUE; - break; - case BSIM2_MOD_AF : - mod->B2fNexp = value->rValue; - mod->B2fNexpGiven = TRUE; - break; - case BSIM2_MOD_KF : - mod->B2fNcoef = value->rValue; - mod->B2fNcoefGiven = TRUE; - break; - case BSIM2_MOD_NMOS : - if(value->iValue) { - mod->B2type = 1; - mod->B2typeGiven = TRUE; - } - break; - case BSIM2_MOD_PMOS : - if(value->iValue) { - mod->B2type = - 1; - mod->B2typeGiven = TRUE; - } - break; - default: - return(E_BADPARM); - } - return(OK); -} diff --git a/src/spicelib/devices/bsim2/b2noi.c b/src/spicelib/devices/bsim2/b2noi.c deleted file mode 100644 index ded2750ca..000000000 --- a/src/spicelib/devices/bsim2/b2noi.c +++ /dev/null @@ -1,179 +0,0 @@ -/********** -Copyright 2003 ??. All rights reserved. -Author: 2003 Paolo Nenzi -**********/ - -#include "ngspice/ngspice.h" -#include "bsim2def.h" -#include "ngspice/cktdefs.h" -#include "ngspice/iferrmsg.h" -#include "ngspice/noisedef.h" -#include "ngspice/suffix.h" - -/* - * B2noise (mode, operation, firstModel, ckt, data, OnDens) - * This routine names and evaluates all of the noise sources - * associated with MOSFET's. It starts with the model *firstModel and - * traverses all of its insts. It then proceeds to any other models - * on the linked list. The total output noise density generated by - * all of the MOSFET's is summed with the variable "OnDens". - */ - - -int -B2noise (int mode, int operation, GENmodel *genmodel, CKTcircuit *ckt, - Ndata *data, double *OnDens) -{ - NOISEAN *job = (NOISEAN *) ckt->CKTcurJob; - - B2model *firstModel = (B2model *) genmodel; - B2model *model; - B2instance *inst; - double tempOnoise; - double tempInoise; - double noizDens[B2NSRCS]; - double lnNdens[B2NSRCS]; - int i; - - /* define the names of the noise sources */ - - static char *B2nNames[B2NSRCS] = { /* Note that we have to keep the order */ - "_rd", /* noise due to rd */ /* consistent with thestrchr definitions */ - "_rs", /* noise due to rs */ /* in bsim1defs.h */ - "_id", /* noise due to id */ - "_1overf", /* flicker (1/f) noise */ - "" /* total transistor noise */ - }; - - for (model=firstModel; model != NULL; model=B2nextModel(model)) { - for (inst=B2instances(model); inst != NULL; inst=B2nextInstance(inst)) { - - switch (operation) { - - case N_OPEN: - - /* see if we have to to produce a summary report */ - /* if so, name all the noise generators */ - - if (job->NStpsSm != 0) { - switch (mode) { - - case N_DENS: - for (i=0; i < B2NSRCS; i++) { - NOISE_ADD_OUTVAR(ckt, data, "onoise_%s%s", inst->B2name, B2nNames[i]); - } - break; - - case INT_NOIZ: - for (i=0; i < B2NSRCS; i++) { - NOISE_ADD_OUTVAR(ckt, data, "onoise_total_%s%s", inst->B2name, B2nNames[i]); - NOISE_ADD_OUTVAR(ckt, data, "inoise_total_%s%s", inst->B2name, B2nNames[i]); - } - break; - } - } - break; - - case N_CALC: - switch (mode) { - - case N_DENS: - NevalSrc(&noizDens[B2RDNOIZ],&lnNdens[B2RDNOIZ], - ckt,THERMNOISE,inst->B2dNodePrime,inst->B2dNode, - inst->B2drainConductance * inst->B2m); - - NevalSrc(&noizDens[B2RSNOIZ],&lnNdens[B2RSNOIZ], - ckt,THERMNOISE,inst->B2sNodePrime,inst->B2sNode, - inst->B2sourceConductance * inst->B2m); - - NevalSrc(&noizDens[B2IDNOIZ],&lnNdens[B2IDNOIZ], - ckt,THERMNOISE,inst->B2dNodePrime,inst->B2sNodePrime, - (2.0/3.0 * fabs(inst->B2gm * inst->B2m))); - - NevalSrc(&noizDens[B2FLNOIZ], NULL, ckt, - N_GAIN,inst->B2dNodePrime, inst->B2sNodePrime, - (double)0.0); - noizDens[B2FLNOIZ] *= model->B2fNcoef * inst->B2m * - exp(model->B2fNexp * - log(MAX(fabs((double)inst->B2cd),N_MINLOG))) / - (data->freq * - (inst->B2w - model->B2deltaW * 1e-6) * - (inst->B2l - model->B2deltaL * 1e-6) * - model->B2Cox * model->B2Cox); - lnNdens[B2FLNOIZ] = - log(MAX(noizDens[B2FLNOIZ],N_MINLOG)); - - noizDens[B2TOTNOIZ] = noizDens[B2RDNOIZ] + - noizDens[B2RSNOIZ] + - noizDens[B2IDNOIZ] + - noizDens[B2FLNOIZ]; - lnNdens[B2TOTNOIZ] = - log(MAX(noizDens[B2TOTNOIZ], N_MINLOG)); - - *OnDens += noizDens[B2TOTNOIZ]; - - if (data->delFreq == 0.0) { - - /* if we haven't done any previous integration, we need to */ - /* initialize our "history" variables */ - - for (i=0; i < B2NSRCS; i++) { - inst->B2nVar[LNLSTDENS][i] = lnNdens[i]; - } - - /* clear out our integration variables if it's the first pass */ - - if (data->freq == job->NstartFreq) { - for (i=0; i < B2NSRCS; i++) { - inst->B2nVar[OUTNOIZ][i] = 0.0; - inst->B2nVar[INNOIZ][i] = 0.0; - } - } - } else { /* data->delFreq != 0.0 (we have to integrate) */ - for (i=0; i < B2NSRCS; i++) { - if (i != B2TOTNOIZ) { - tempOnoise = Nintegrate(noizDens[i], lnNdens[i], - inst->B2nVar[LNLSTDENS][i], data); - tempInoise = Nintegrate(noizDens[i] * data->GainSqInv , - lnNdens[i] + data->lnGainInv, - inst->B2nVar[LNLSTDENS][i] + data->lnGainInv, - data); - inst->B2nVar[LNLSTDENS][i] = lnNdens[i]; - data->outNoiz += tempOnoise; - data->inNoise += tempInoise; - if (job->NStpsSm != 0) { - inst->B2nVar[OUTNOIZ][i] += tempOnoise; - inst->B2nVar[OUTNOIZ][B2TOTNOIZ] += tempOnoise; - inst->B2nVar[INNOIZ][i] += tempInoise; - inst->B2nVar[INNOIZ][B2TOTNOIZ] += tempInoise; - } - } - } - } - if (data->prtSummary) { - for (i=0; i < B2NSRCS; i++) { /* print a summary report */ - data->outpVector[data->outNumber++] = noizDens[i]; - } - } - break; - - case INT_NOIZ: /* already calculated, just output */ - if (job->NStpsSm != 0) { - for (i=0; i < B2NSRCS; i++) { - data->outpVector[data->outNumber++] = inst->B2nVar[OUTNOIZ][i]; - data->outpVector[data->outNumber++] = inst->B2nVar[INNOIZ][i]; - } - } /* if */ - break; - } /* switch (mode) */ - break; - - case N_CLOSE: - return (OK); /* do nothing, the main calling routine will close */ - break; /* the plots */ - } /* switch (operation) */ - } /* for inst */ - } /* for model */ - -return(OK); -} diff --git a/src/spicelib/devices/bsim2/b2par.c b/src/spicelib/devices/bsim2/b2par.c deleted file mode 100644 index 07e62eff1..000000000 --- a/src/spicelib/devices/bsim2/b2par.c +++ /dev/null @@ -1,102 +0,0 @@ -/********** -Copyright 1990 Regents of the University of California. All rights reserved. -Author: 1985 Hong J. Park, Thomas L. Quarles -**********/ -/* - */ - -#include "ngspice/ngspice.h" -#include "ngspice/ifsim.h" -#include "bsim2def.h" -#include "ngspice/sperror.h" -#include "ngspice/suffix.h" - - -/* ARGSUSED */ -int -B2param(int param, IFvalue *value, GENinstance *inst, IFvalue *select) -{ - B2instance *here = (B2instance*)inst; - - NG_IGNORE(select); - - switch (param) { - case BSIM2_W: - here->B2w = value->rValue; - here->B2wGiven = TRUE; - break; - case BSIM2_L: - here->B2l = value->rValue; - here->B2lGiven = TRUE; - break; - case BSIM2_M: - here->B2m = value->rValue; - here->B2mGiven = TRUE; - break; - case BSIM2_AS: - here->B2sourceArea = value->rValue; - here->B2sourceAreaGiven = TRUE; - break; - case BSIM2_AD: - here->B2drainArea = value->rValue; - here->B2drainAreaGiven = TRUE; - break; - case BSIM2_PS: - here->B2sourcePerimeter = value->rValue; - here->B2sourcePerimeterGiven = TRUE; - break; - case BSIM2_PD: - here->B2drainPerimeter = value->rValue; - here->B2drainPerimeterGiven = TRUE; - break; - case BSIM2_NRS: - here->B2sourceSquares = value->rValue; - here->B2sourceSquaresGiven = TRUE; - break; - case BSIM2_NRD: - here->B2drainSquares = value->rValue; - here->B2drainSquaresGiven = TRUE; - break; - case BSIM2_OFF: - here->B2off = value->iValue; - break; - case BSIM2_IC_VBS: - here->B2icVBS = value->rValue; - here->B2icVBSGiven = TRUE; - break; - case BSIM2_IC_VDS: - here->B2icVDS = value->rValue; - here->B2icVDSGiven = TRUE; - break; - case BSIM2_IC_VGS: - here->B2icVGS = value->rValue; - here->B2icVGSGiven = TRUE; - break; - case BSIM2_IC: - /* FALLTHROUGH added to suppress GCC warning due to - * -Wimplicit-fallthrough flag */ - switch(value->v.numValue){ - case 3: - here->B2icVBS = *(value->v.vec.rVec+2); - here->B2icVBSGiven = TRUE; - /* FALLTHROUGH */ - case 2: - here->B2icVGS = *(value->v.vec.rVec+1); - here->B2icVGSGiven = TRUE; - /* FALLTHROUGH */ - case 1: - here->B2icVDS = *(value->v.vec.rVec); - here->B2icVDSGiven = TRUE; - break; - default: - return(E_BADPARM); - } - break; - default: - return(E_BADPARM); - } - return(OK); -} - - - diff --git a/src/spicelib/devices/bsim2/b2pzld.c b/src/spicelib/devices/bsim2/b2pzld.c deleted file mode 100644 index e0b75eea5..000000000 --- a/src/spicelib/devices/bsim2/b2pzld.c +++ /dev/null @@ -1,164 +0,0 @@ -/********** -Copyright 1990 Regents of the University of California. All rights reserved. -Author: 1985 Thomas L. Quarles -**********/ -/* - */ - -#include "ngspice/ngspice.h" -#include "ngspice/cktdefs.h" -#include "ngspice/complex.h" -#include "ngspice/sperror.h" -#include "bsim2def.h" -#include "ngspice/suffix.h" - - -int -B2pzLoad(GENmodel *inModel, CKTcircuit *ckt, SPcomplex *s) -{ - B2model *model = (B2model*)inModel; - B2instance *here; - int xnrm; - int xrev; - double gdpr; - double gspr; - double gm; - double gds; - double gmbs; - double gbd; - double gbs; - double capbd; - double capbs; - double xcggb; - double xcgdb; - double xcgsb; - double xcbgb; - double xcbdb; - double xcbsb; - double xcddb; - double xcssb; - double xcdgb; - double xcsgb; - double xcdsb; - double xcsdb; - double cggb; - double cgdb; - double cgsb; - double cbgb; - double cbdb; - double cbsb; - double cddb; - double cdgb; - double cdsb; - - double m; - - for( ; model != NULL; model = B2nextModel(model)) { - for(here = B2instances(model); here!= NULL; - here = B2nextInstance(here)) { - - if (here->B2mode >= 0) { - xnrm=1; - xrev=0; - } else { - xnrm=0; - xrev=1; - } - gdpr=here->B2drainConductance; - gspr=here->B2sourceConductance; - gm= *(ckt->CKTstate0 + here->B2gm); - gds= *(ckt->CKTstate0 + here->B2gds); - gmbs= *(ckt->CKTstate0 + here->B2gmbs); - gbd= *(ckt->CKTstate0 + here->B2gbd); - gbs= *(ckt->CKTstate0 + here->B2gbs); - capbd= *(ckt->CKTstate0 + here->B2capbd); - capbs= *(ckt->CKTstate0 + here->B2capbs); - /* - * charge oriented model parameters - */ - - cggb = *(ckt->CKTstate0 + here->B2cggb); - cgsb = *(ckt->CKTstate0 + here->B2cgsb); - cgdb = *(ckt->CKTstate0 + here->B2cgdb); - - cbgb = *(ckt->CKTstate0 + here->B2cbgb); - cbsb = *(ckt->CKTstate0 + here->B2cbsb); - cbdb = *(ckt->CKTstate0 + here->B2cbdb); - - cdgb = *(ckt->CKTstate0 + here->B2cdgb); - cdsb = *(ckt->CKTstate0 + here->B2cdsb); - cddb = *(ckt->CKTstate0 + here->B2cddb); - - xcdgb = (cdgb - here->pParam->B2GDoverlapCap) ; - xcddb = (cddb + capbd + here->pParam->B2GDoverlapCap) ; - xcdsb = cdsb ; - xcsgb = -(cggb + cbgb + cdgb + here->pParam->B2GSoverlapCap ) ; - xcsdb = -(cgdb + cbdb + cddb) ; - xcssb = (capbs + here->pParam->B2GSoverlapCap - (cgsb+cbsb+cdsb)) ; - xcggb = (cggb + here->pParam->B2GDoverlapCap - + here->pParam->B2GSoverlapCap - + here->pParam->B2GBoverlapCap) ; - xcgdb = (cgdb - here->pParam->B2GDoverlapCap ) ; - xcgsb = (cgsb - here->pParam->B2GSoverlapCap) ; - xcbgb = (cbgb - here->pParam->B2GBoverlapCap) ; - xcbdb = (cbdb - capbd ) ; - xcbsb = (cbsb - capbs ) ; - - - m = here->B2m; - - *(here->B2GgPtr ) += m * (xcggb * s->real); - *(here->B2GgPtr +1) += m * (xcggb * s->imag); - *(here->B2BbPtr ) += m * ((-xcbgb-xcbdb-xcbsb) * s->real); - *(here->B2BbPtr +1) += m * ((-xcbgb-xcbdb-xcbsb) * s->imag); - *(here->B2DPdpPtr ) += m * (xcddb * s->real); - *(here->B2DPdpPtr +1) += m * (xcddb * s->imag); - *(here->B2SPspPtr ) += m * (xcssb * s->real); - *(here->B2SPspPtr +1) += m * (xcssb * s->imag); - *(here->B2GbPtr ) += m * ((-xcggb-xcgdb-xcgsb) * s->real); - *(here->B2GbPtr +1) += m * ((-xcggb-xcgdb-xcgsb) * s->imag); - *(here->B2GdpPtr ) += m * (xcgdb * s->real); - *(here->B2GdpPtr +1) += m * (xcgdb * s->imag); - *(here->B2GspPtr ) += m * (xcgsb * s->real); - *(here->B2GspPtr +1) += m * (xcgsb * s->imag); - *(here->B2BgPtr ) += m * (xcbgb * s->real); - *(here->B2BgPtr +1) += m * (xcbgb * s->imag); - *(here->B2BdpPtr ) += m * (xcbdb * s->real); - *(here->B2BdpPtr +1) += m * (xcbdb * s->imag); - *(here->B2BspPtr ) += m * (xcbsb * s->real); - *(here->B2BspPtr +1) += m * (xcbsb * s->imag); - *(here->B2DPgPtr ) += m * (xcdgb * s->real); - *(here->B2DPgPtr +1) += m * (xcdgb * s->imag); - *(here->B2DPbPtr ) += m * ((-xcdgb-xcddb-xcdsb) * s->real); - *(here->B2DPbPtr +1) += m * ((-xcdgb-xcddb-xcdsb) * s->imag); - *(here->B2DPspPtr ) += m * (xcdsb * s->real); - *(here->B2DPspPtr +1) += m * (xcdsb * s->imag); - *(here->B2SPgPtr ) += m * (xcsgb * s->real); - *(here->B2SPgPtr +1) += m * (xcsgb * s->imag); - *(here->B2SPbPtr ) += m * ((-xcsgb-xcsdb-xcssb) * s->real); - *(here->B2SPbPtr +1) += m * ((-xcsgb-xcsdb-xcssb) * s->imag); - *(here->B2SPdpPtr ) += m * (xcsdb * s->real); - *(here->B2SPdpPtr +1) += m * (xcsdb * s->imag); - *(here->B2DdPtr) += m * (gdpr); - *(here->B2SsPtr) += m * (gspr); - *(here->B2BbPtr) += m * (gbd+gbs); - *(here->B2DPdpPtr) += m * (gdpr+gds+gbd+xrev*(gm+gmbs)); - *(here->B2SPspPtr) += m * (gspr+gds+gbs+xnrm*(gm+gmbs)); - *(here->B2DdpPtr) -= m * (gdpr); - *(here->B2SspPtr) -= m * (gspr); - *(here->B2BdpPtr) -= m * (gbd); - *(here->B2BspPtr) -= m * (gbs); - *(here->B2DPdPtr) -= m * (gdpr); - *(here->B2DPgPtr) += m * ((xnrm-xrev)*gm); - *(here->B2DPbPtr) += m * (-gbd+(xnrm-xrev)*gmbs); - *(here->B2DPspPtr) += m * (-gds-xnrm*(gm+gmbs)); - *(here->B2SPgPtr) += m * (-(xnrm-xrev)*gm); - *(here->B2SPsPtr) -= m * (gspr); - *(here->B2SPbPtr) += m * (-gbs-(xnrm-xrev)*gmbs); - *(here->B2SPdpPtr) += m * (-gds-xrev*(gm+gmbs)); - - } - } - return(OK); -} - diff --git a/src/spicelib/devices/bsim2/b2set.c b/src/spicelib/devices/bsim2/b2set.c deleted file mode 100644 index c868d4811..000000000 --- a/src/spicelib/devices/bsim2/b2set.c +++ /dev/null @@ -1,596 +0,0 @@ -/********** -Copyright 1990 Regents of the University of California. All rights reserved. -Author: 1988 Min-Chie Jeng, Hong J. Park, Thomas L. Quarles -**********/ - -#include "ngspice/ngspice.h" -#include "ngspice/smpdefs.h" -#include "ngspice/cktdefs.h" -#include "bsim2def.h" -#include "ngspice/const.h" -#include "ngspice/sperror.h" -#include "ngspice/suffix.h" - -int -B2setup(SMPmatrix *matrix, GENmodel *inModel, CKTcircuit *ckt, int *states) - /* load the B2 device structure with those pointers needed later - * for fast matrix loading - */ - -{ - B2model *model = (B2model*)inModel; - B2instance *here; - int error; - CKTnode *tmp; - - /* loop through all the B2 device models */ - for( ; model != NULL; model = B2nextModel(model)) { - -/* Default value Processing for B2 MOSFET Models */ - if( ! model->B2typeGiven) { - model->B2type = NMOS; /* NMOS */ - } - if( ! model->B2vfb0Given) { - model->B2vfb0 = -1.0; - } - if( ! model->B2vfbLGiven) { - model->B2vfbL = 0.0; - } - if( ! model->B2vfbWGiven) { - model->B2vfbW = 0.0; - } - if( ! model->B2phi0Given) { - model->B2phi0 = 0.75; - } - if( ! model->B2phiLGiven) { - model->B2phiL = 0.0; - } - if( ! model->B2phiWGiven) { - model->B2phiW = 0.0; - } - if( ! model->B2k10Given) { - model->B2k10 = 0.8; - } - if( ! model->B2k1LGiven) { - model->B2k1L = 0.0; - } - if( ! model->B2k1WGiven) { - model->B2k1W = 0.0; - } - if( ! model->B2k20Given) { - model->B2k20 = 0.0; - } - if( ! model->B2k2LGiven) { - model->B2k2L = 0.0; - } - if( ! model->B2k2WGiven) { - model->B2k2W = 0.0; - } - if( ! model->B2eta00Given) { - model->B2eta00 = 0.0; - } - if( ! model->B2eta0LGiven) { - model->B2eta0L = 0.0; - } - if( ! model->B2eta0WGiven) { - model->B2eta0W = 0.0; - } - if( ! model->B2etaB0Given) { - model->B2etaB0 = 0.0; - } - if( ! model->B2etaBLGiven) { - model->B2etaBL = 0.0; - } - if( ! model->B2etaBWGiven) { - model->B2etaBW = 0.0; - } - if( ! model->B2deltaLGiven) { - model->B2deltaL = 0.0; - } - if( ! model->B2deltaWGiven) { - model->B2deltaW = 0.0; - } - if( ! model->B2ua00Given) { - model->B2ua00 = 0.2; - } - if( ! model->B2ua0LGiven) { - model->B2ua0L = 0.0; - } - if( ! model->B2ua0WGiven) { - model->B2ua0W = 0.0; - } - if( ! model->B2uaB0Given) { - model->B2uaB0 = 0.0; - } - if( ! model->B2uaBLGiven) { - model->B2uaBL = 0.0; - } - if( ! model->B2uaBWGiven) { - model->B2uaBW = 0.0; - } - if( ! model->B2ub00Given) { - model->B2ub00 = 0.0; - } - if( ! model->B2ub0LGiven) { - model->B2ub0L = 0.0; - } - if( ! model->B2ub0WGiven) { - model->B2ub0W = 0.0; - } - if( ! model->B2ubB0Given) { - model->B2ubB0 = 0.0; - } - if( ! model->B2ubBLGiven) { - model->B2ubBL = 0.0; - } - if( ! model->B2ubBWGiven) { - model->B2ubBW = 0.0; - } - if( ! model->B2u100Given) { - model->B2u100 = 0.1; - } - if( ! model->B2u10LGiven) { - model->B2u10L = 0.0; - } - if( ! model->B2u10WGiven) { - model->B2u10W = 0.0; - } - if( ! model->B2u1B0Given) { - model->B2u1B0 = 0.0; - } - if( ! model->B2u1BLGiven) { - model->B2u1BL = 0.0; - } - if( ! model->B2u1BWGiven) { - model->B2u1BW = 0.0; - } - if( ! model->B2u1D0Given) { - model->B2u1D0 = 0.0; - } - if( ! model->B2u1DLGiven) { - model->B2u1DL = 0.0; - } - if( ! model->B2u1DWGiven) { - model->B2u1DW = 0.0; - } - if( ! model->B2mob00Given) { - model->B2mob00 = 400.0; - } - if( ! model->B2mob0B0Given) { - model->B2mob0B0 = 0.0; - } - if( ! model->B2mob0BLGiven) { - model->B2mob0BL = 0.0; - } - if( ! model->B2mob0BWGiven) { - model->B2mob0BW = 0.0; - } - if( ! model->B2mobs00Given) { - model->B2mobs00 = 500.0; - } - if( ! model->B2mobs0LGiven) { - model->B2mobs0L = 0.0; - } - if( ! model->B2mobs0WGiven) { - model->B2mobs0W = 0.0; - } - if( ! model->B2mobsB0Given) { - model->B2mobsB0 = 0.0; - } - if( ! model->B2mobsBLGiven) { - model->B2mobsBL = 0.0; - } - if( ! model->B2mobsBWGiven) { - model->B2mobsBW = 0.0; - } - if( ! model->B2mob200Given) { - model->B2mob200 = 1.5; - } - if( ! model->B2mob20LGiven) { - model->B2mob20L = 0.0; - } - if( ! model->B2mob20WGiven) { - model->B2mob20W = 0.0; - } - if( ! model->B2mob2B0Given) { - model->B2mob2B0 = 0.0; - } - if( ! model->B2mob2BLGiven) { - model->B2mob2BL = 0.0; - } - if( ! model->B2mob2BWGiven) { - model->B2mob2BW = 0.0; - } - if( ! model->B2mob2G0Given) { - model->B2mob2G0 = 0.0; - } - if( ! model->B2mob2GLGiven) { - model->B2mob2GL = 0.0; - } - if( ! model->B2mob2GWGiven) { - model->B2mob2GW = 0.0; - } - if( ! model->B2mob300Given) { - model->B2mob300 = 10; - } - if( ! model->B2mob30LGiven) { - model->B2mob30L = 0.0; - } - if( ! model->B2mob30WGiven) { - model->B2mob30W = 0.0; - } - if( ! model->B2mob3B0Given) { - model->B2mob3B0 = 0.0; - } - if( ! model->B2mob3BLGiven) { - model->B2mob3BL = 0.0; - } - if( ! model->B2mob3BWGiven) { - model->B2mob3BW = 0.0; - } - if( ! model->B2mob3G0Given) { - model->B2mob3G0 = 0.0; - } - if( ! model->B2mob3GLGiven) { - model->B2mob3GL = 0.0; - } - if( ! model->B2mob3GWGiven) { - model->B2mob3GW = 0.0; - } - if( ! model->B2mob400Given) { - model->B2mob400 = 0.0; - } - if( ! model->B2mob40LGiven) { - model->B2mob40L = 0.0; - } - if( ! model->B2mob40WGiven) { - model->B2mob40W = 0.0; - } - if( ! model->B2mob4B0Given) { - model->B2mob4B0 = 0.0; - } - if( ! model->B2mob4BLGiven) { - model->B2mob4BL = 0.0; - } - if( ! model->B2mob4BWGiven) { - model->B2mob4BW = 0.0; - } - if( ! model->B2mob4G0Given) { - model->B2mob4G0 = 0.0; - } - if( ! model->B2mob4GLGiven) { - model->B2mob4GL = 0.0; - } - if( ! model->B2mob4GWGiven) { - model->B2mob4GW = 0.0; - } - if( ! model->B2n00Given) { - model->B2n00 = 1.4; - } - if( ! model->B2n0LGiven) { - model->B2n0L = 0.0; - } - if( ! model->B2n0WGiven) { - model->B2n0W = 0.0; - } - if( ! model->B2nB0Given) { - model->B2nB0 = 0.5; - } - if( ! model->B2nBLGiven) { - model->B2nBL = 0.0; - } - if( ! model->B2nBWGiven) { - model->B2nBW = 0.0; - } - if( ! model->B2nD0Given) { - model->B2nD0 = 0.0; - } - if( ! model->B2nDLGiven) { - model->B2nDL = 0.0; - } - if( ! model->B2nDWGiven) { - model->B2nDW = 0.0; - } - if( ! model->B2vof00Given) { - model->B2vof00 = 1.8; - } - if( ! model->B2vof0LGiven) { - model->B2vof0L = 0.0; - } - if( ! model->B2vof0WGiven) { - model->B2vof0W = 0.0; - } - if( ! model->B2vofB0Given) { - model->B2vofB0 = 0.0; - } - if( ! model->B2vofBLGiven) { - model->B2vofBL = 0.0; - } - if( ! model->B2vofBWGiven) { - model->B2vofBW = 0.0; - } - if( ! model->B2vofD0Given) { - model->B2vofD0 = 0.0; - } - if( ! model->B2vofDLGiven) { - model->B2vofDL = 0.0; - } - if( ! model->B2vofDWGiven) { - model->B2vofDW = 0.0; - } - if( ! model->B2ai00Given) { - model->B2ai00 = 0.0; - } - if( ! model->B2ai0LGiven) { - model->B2ai0L = 0.0; - } - if( ! model->B2ai0WGiven) { - model->B2ai0W = 0.0; - } - if( ! model->B2aiB0Given) { - model->B2aiB0 = 0.0; - } - if( ! model->B2aiBLGiven) { - model->B2aiBL = 0.0; - } - if( ! model->B2aiBWGiven) { - model->B2aiBW = 0.0; - } - if( ! model->B2bi00Given) { - model->B2bi00 = 0.0; - } - if( ! model->B2bi0LGiven) { - model->B2bi0L = 0.0; - } - if( ! model->B2bi0WGiven) { - model->B2bi0W = 0.0; - } - if( ! model->B2biB0Given) { - model->B2biB0 = 0.0; - } - if( ! model->B2biBLGiven) { - model->B2biBL = 0.0; - } - if( ! model->B2biBWGiven) { - model->B2biBW = 0.0; - } - if( ! model->B2vghigh0Given) { - model->B2vghigh0 = 0.2; - } - if( ! model->B2vghighLGiven) { - model->B2vghighL = 0.0; - } - if( ! model->B2vghighWGiven) { - model->B2vghighW = 0.0; - } - if( ! model->B2vglow0Given) { - model->B2vglow0 = -0.15; - } - if( ! model->B2vglowLGiven) { - model->B2vglowL = 0.0; - } - if( ! model->B2vglowWGiven) { - model->B2vglowW = 0.0; - } - if( ! model->B2toxGiven) { - model->B2tox = 0.03; /* um */ - } - if( ! model->B2tempGiven) { - model->B2temp = 27.0; - } - if( ! model->B2vddGiven) { - model->B2vdd = 5.0; - } - if( ! model->B2vggGiven) { - model->B2vgg = 5.0; - } - if( ! model->B2vbbGiven) { - model->B2vbb = 5.0; - } - if( ! model->B2gateDrainOverlapCapGiven) { - model->B2gateDrainOverlapCap = 0.0; - } - if( ! model->B2gateSourceOverlapCapGiven) { - model->B2gateSourceOverlapCap = 0.0; - } - if( ! model->B2gateBulkOverlapCapGiven) { - model->B2gateBulkOverlapCap = 0.0; - } - if( ! model->B2channelChargePartitionFlagGiven) { - model->B2channelChargePartitionFlag = 0; - } - if( ! model->B2sheetResistanceGiven) { - model->B2sheetResistance = 0.0; - } - if( ! model->B2unitAreaJctCapGiven) { - model->B2unitAreaJctCap = 0.0; - } - if( ! model->B2unitLengthSidewallJctCapGiven) { - model->B2unitLengthSidewallJctCap = 0.0; - } - if( ! model->B2jctSatCurDensityGiven) { - model->B2jctSatCurDensity = 0.0; - } - if( ! model->B2bulkJctPotentialGiven) { - model->B2bulkJctPotential = 0.0; - } - if( ! model->B2sidewallJctPotentialGiven) { - model->B2sidewallJctPotential = 0.0; - } - if( ! model->B2bulkJctBotGradingCoeffGiven) { - model->B2bulkJctBotGradingCoeff = 0.0; - } - if( ! model->B2bulkJctSideGradingCoeffGiven) { - model->B2bulkJctSideGradingCoeff = 0.0; - } - if( ! model->B2defaultWidthGiven) { - model->B2defaultWidth = 10.0; - } - if( ! model->B2deltaLengthGiven) { - model->B2deltaLength = 0.0; - } - - /* loop through all the instances of the model */ - for (here = B2instances(model); here != NULL ; - here=B2nextInstance(here)) { - - /* allocate a chunk of the state vector */ - here->B2states = *states; - *states += B2numStates; - - /* perform the parameter defaulting */ - - if(!here->B2drainAreaGiven) { - here->B2drainArea = 0; - } - if(!here->B2drainPerimeterGiven) { - here->B2drainPerimeter = 0; - } - if(!here->B2drainSquaresGiven) { - here->B2drainSquares = 1; - } - if(!here->B2icVBSGiven) { - here->B2icVBS = 0; - } - if(!here->B2icVDSGiven) { - here->B2icVDS = 0; - } - if(!here->B2icVGSGiven) { - here->B2icVGS = 0; - } - if(!here->B2lGiven) { - here->B2l = 5e-6; - } - if(!here->B2sourceAreaGiven) { - here->B2sourceArea = 0; - } - if(!here->B2sourcePerimeterGiven) { - here->B2sourcePerimeter = 0; - } - if(!here->B2sourceSquaresGiven) { - here->B2sourceSquares = 1; - } - if(!here->B2vdsatGiven) { - here->B2vdsat = 0; - } - if(!here->B2vonGiven) { - here->B2von = 0; - } - if(!here->B2wGiven) { - here->B2w = 5e-6; - } - if(!here->B2mGiven) { - here->B2m = 1.0; - } - - /* process drain series resistance */ - if( (model->B2sheetResistance != 0) && - (here->B2drainSquares != 0.0 ) ) { - if (here->B2dNodePrime == 0) { - error = CKTmkVolt(ckt,&tmp,here->B2name,"drain"); - if(error) return(error); - here->B2dNodePrime = tmp->number; - if (ckt->CKTcopyNodesets) { - CKTnode *tmpNode; - IFuid tmpName; - - if (CKTinst2Node(ckt,here,1,&tmpNode,&tmpName)==OK) { - if (tmpNode->nsGiven) { - tmp->nodeset=tmpNode->nodeset; - tmp->nsGiven=tmpNode->nsGiven; - } - } - } - } - } else { - here->B2dNodePrime = here->B2dNode; - } - - /* process source series resistance */ - if( (model->B2sheetResistance != 0) && - (here->B2sourceSquares != 0.0 ) ) { - if(here->B2sNodePrime == 0) { - error = CKTmkVolt(ckt,&tmp,here->B2name,"source"); - if(error) - return(error); - here->B2sNodePrime = tmp->number; - if (ckt->CKTcopyNodesets) { - CKTnode *tmpNode; - IFuid tmpName; - - if (CKTinst2Node(ckt,here,3,&tmpNode,&tmpName)==OK) { - if (tmpNode->nsGiven) { - tmp->nodeset=tmpNode->nodeset; - tmp->nsGiven=tmpNode->nsGiven; - } - } - } - } - } else { - here->B2sNodePrime = here->B2sNode; - } - - - /* set Sparse Matrix Pointers */ - -/* macro to make elements with built in test for out of memory */ -#define TSTALLOC(ptr,first,second) \ -do { if((here->ptr = SMPmakeElt(matrix, here->first, here->second)) == NULL){\ - return(E_NOMEM);\ -} } while(0) - - TSTALLOC(B2DdPtr, B2dNode, B2dNode); - TSTALLOC(B2GgPtr, B2gNode, B2gNode); - TSTALLOC(B2SsPtr, B2sNode, B2sNode); - TSTALLOC(B2BbPtr, B2bNode, B2bNode); - TSTALLOC(B2DPdpPtr, B2dNodePrime, B2dNodePrime); - TSTALLOC(B2SPspPtr, B2sNodePrime, B2sNodePrime); - TSTALLOC(B2DdpPtr, B2dNode, B2dNodePrime); - TSTALLOC(B2GbPtr, B2gNode, B2bNode); - TSTALLOC(B2GdpPtr, B2gNode, B2dNodePrime); - TSTALLOC(B2GspPtr, B2gNode, B2sNodePrime); - TSTALLOC(B2SspPtr, B2sNode, B2sNodePrime); - TSTALLOC(B2BdpPtr, B2bNode, B2dNodePrime); - TSTALLOC(B2BspPtr, B2bNode, B2sNodePrime); - TSTALLOC(B2DPspPtr, B2dNodePrime, B2sNodePrime); - TSTALLOC(B2DPdPtr, B2dNodePrime, B2dNode); - TSTALLOC(B2BgPtr, B2bNode, B2gNode); - TSTALLOC(B2DPgPtr, B2dNodePrime, B2gNode); - TSTALLOC(B2SPgPtr, B2sNodePrime, B2gNode); - TSTALLOC(B2SPsPtr, B2sNodePrime, B2sNode); - TSTALLOC(B2DPbPtr, B2dNodePrime, B2bNode); - TSTALLOC(B2SPbPtr, B2sNodePrime, B2bNode); - TSTALLOC(B2SPdpPtr, B2sNodePrime, B2dNodePrime); - - } - } - return(OK); -} - -int -B2unsetup( - GENmodel *inModel, - CKTcircuit *ckt) -{ - B2model *model; - B2instance *here; - - for (model = (B2model *)inModel; model != NULL; - model = B2nextModel(model)) - { - for (here = B2instances(model); here != NULL; - here=B2nextInstance(here)) - { - if (here->B2sNodePrime > 0 - && here->B2sNodePrime != here->B2sNode) - CKTdltNNum(ckt, here->B2sNodePrime); - here->B2sNodePrime = 0; - - if (here->B2dNodePrime > 0 - && here->B2dNodePrime != here->B2dNode) - CKTdltNNum(ckt, here->B2dNodePrime); - here->B2dNodePrime = 0; - } - } - return OK; -} diff --git a/src/spicelib/devices/bsim2/b2temp.c b/src/spicelib/devices/bsim2/b2temp.c deleted file mode 100644 index 216c81356..000000000 --- a/src/spicelib/devices/bsim2/b2temp.c +++ /dev/null @@ -1,273 +0,0 @@ -/********** -Copyright 1990 Regents of the University of California. All rights reserved. -Author: 1985 Hong J. Park, Thomas L. Quarles -**********/ - -#include "ngspice/ngspice.h" -#include "ngspice/smpdefs.h" -#include "ngspice/cktdefs.h" -#include "bsim2def.h" -#include "ngspice/const.h" -#include "ngspice/sperror.h" -#include "ngspice/suffix.h" - -/* ARGSUSED */ -int -B2temp(GENmodel *inModel, CKTcircuit *ckt) - /* load the B2 device structure with those pointers needed later - * for fast matrix loading - */ - -{ - B2model *model = (B2model*) inModel; - B2instance *here; - struct bsim2SizeDependParam *pSizeDependParamKnot, *pLastKnot; - double EffectiveLength; - double EffectiveWidth; - double CoxWoverL, Inv_L, Inv_W, tmp; - int Size_Not_Found; - - NG_IGNORE(ckt); - - /* loop through all the B2 device models */ - for( ; model != NULL; model = B2nextModel(model)) { - -/* Default value Processing for B2 MOSFET Models */ - /* Some Limiting for Model Parameters */ - if( model->B2bulkJctPotential < 0.1) { - model->B2bulkJctPotential = 0.1; - } - if( model->B2sidewallJctPotential < 0.1) { - model->B2sidewallJctPotential = 0.1; - } - - model->B2Cox = 3.453e-13/(model->B2tox * 1.0e-4);/*in F/cm**2 */ - model->B2vdd2 = 2.0 * model->B2vdd; - model->B2vgg2 = 2.0 * model->B2vgg; - model->B2vbb2 = 2.0 * model->B2vbb; - model->B2Vtm = 8.625e-5 * (model->B2temp + 273.0); - - struct bsim2SizeDependParam *p = model->pSizeDependParamKnot; - while (p) { - struct bsim2SizeDependParam *next_p = p->pNext; - FREE(p); - p = next_p; - } - model->pSizeDependParamKnot = NULL; - pLastKnot = NULL; - - /* loop through all the instances of the model */ - for (here = B2instances(model); here != NULL ; - here=B2nextInstance(here)) { - - pSizeDependParamKnot = model->pSizeDependParamKnot; - Size_Not_Found = 1; - - while ((pSizeDependParamKnot != NULL) && Size_Not_Found) - { if ((here->B2l == pSizeDependParamKnot->Length) - && (here->B2w == pSizeDependParamKnot->Width)) - { Size_Not_Found = 0; - here->pParam = pSizeDependParamKnot; - } - else - { pLastKnot = pSizeDependParamKnot; - pSizeDependParamKnot = pSizeDependParamKnot->pNext; - } - } - - if (Size_Not_Found) - { here->pParam = TMALLOC(struct bsim2SizeDependParam, 1); - if (pLastKnot == NULL) - model->pSizeDependParamKnot = here->pParam; - else - pLastKnot->pNext = here->pParam; - here->pParam->pNext = NULL; - - EffectiveLength = here->B2l - model->B2deltaL * 1.0e-6; - EffectiveWidth = here->B2w - model->B2deltaW * 1.0e-6; - - if(EffectiveLength<=0) - { - SPfrontEnd->IFerrorf (ERR_FATAL, - "B2: mosfet %s, model %s: Effective channel length <=0", - model->B2modName, here->B2name); - return(E_BADPARM); - } - - if(EffectiveWidth <= 0) - { - SPfrontEnd->IFerrorf (ERR_FATAL, - "B2: mosfet %s, model %s: Effective channel width <=0", - model->B2modName, here->B2name); - return(E_BADPARM); - } - - Inv_L = 1.0e-6 / EffectiveLength; - Inv_W = 1.0e-6 / EffectiveWidth; - here->pParam->Width = here->B2w; - here->pParam->Length = here->B2l; - here->pParam->B2vfb = model->B2vfb0 + model->B2vfbW * Inv_W - + model->B2vfbL * Inv_L; - here->pParam->B2phi = model->B2phi0 + model->B2phiW * Inv_W - + model->B2phiL * Inv_L; - here->pParam->B2k1 = model->B2k10 + model->B2k1W * Inv_W - + model->B2k1L * Inv_L; - here->pParam->B2k2 = model->B2k20 + model->B2k2W * Inv_W - + model->B2k2L * Inv_L; - here->pParam->B2eta0 = model->B2eta00 - + model->B2eta0W * Inv_W - + model->B2eta0L * Inv_L; - here->pParam->B2etaB = model->B2etaB0 + model->B2etaBW - * Inv_W + model->B2etaBL * Inv_L; - here->pParam->B2beta0 = model->B2mob00; - here->pParam->B2beta0B = model->B2mob0B0 - + model->B2mob0BW * Inv_W - + model->B2mob0BL * Inv_L; - here->pParam->B2betas0 = model->B2mobs00 - + model->B2mobs0W * Inv_W - + model->B2mobs0L * Inv_L; - if (here->pParam->B2betas0 < 1.01 * here->pParam->B2beta0) - here->pParam->B2betas0 = 1.01 * here->pParam->B2beta0; - here->pParam->B2betasB = model->B2mobsB0 - + model->B2mobsBW * Inv_W - + model->B2mobsBL * Inv_L; - tmp = (here->pParam->B2betas0 - here->pParam->B2beta0 - - here->pParam->B2beta0B * model->B2vbb); - if ((-here->pParam->B2betasB * model->B2vbb) > tmp) - here->pParam->B2betasB = -tmp / model->B2vbb; - here->pParam->B2beta20 = model->B2mob200 - + model->B2mob20W * Inv_W - + model->B2mob20L * Inv_L; - here->pParam->B2beta2B = model->B2mob2B0 - + model->B2mob2BW * Inv_W - + model->B2mob2BL * Inv_L; - here->pParam->B2beta2G = model->B2mob2G0 - + model->B2mob2GW * Inv_W - + model->B2mob2GL * Inv_L; - here->pParam->B2beta30 = model->B2mob300 - + model->B2mob30W * Inv_W - + model->B2mob30L * Inv_L; - here->pParam->B2beta3B = model->B2mob3B0 - + model->B2mob3BW * Inv_W - + model->B2mob3BL * Inv_L; - here->pParam->B2beta3G = model->B2mob3G0 - + model->B2mob3GW * Inv_W - + model->B2mob3GL * Inv_L; - here->pParam->B2beta40 = model->B2mob400 - + model->B2mob40W * Inv_W - + model->B2mob40L * Inv_L; - here->pParam->B2beta4B = model->B2mob4B0 - + model->B2mob4BW * Inv_W - + model->B2mob4BL * Inv_L; - here->pParam->B2beta4G = model->B2mob4G0 - + model->B2mob4GW * Inv_W - + model->B2mob4GL * Inv_L; - - CoxWoverL = model->B2Cox * EffectiveWidth / EffectiveLength; - - here->pParam->B2beta0 *= CoxWoverL; - here->pParam->B2beta0B *= CoxWoverL; - here->pParam->B2betas0 *= CoxWoverL; - here->pParam->B2betasB *= CoxWoverL; - here->pParam->B2beta30 *= CoxWoverL; - here->pParam->B2beta3B *= CoxWoverL; - here->pParam->B2beta3G *= CoxWoverL; - here->pParam->B2beta40 *= CoxWoverL; - here->pParam->B2beta4B *= CoxWoverL; - here->pParam->B2beta4G *= CoxWoverL; - - here->pParam->B2ua0 = model->B2ua00 + model->B2ua0W * Inv_W - + model->B2ua0L * Inv_L; - here->pParam->B2uaB = model->B2uaB0 + model->B2uaBW * Inv_W - + model->B2uaBL * Inv_L; - here->pParam->B2ub0 = model->B2ub00 + model->B2ub0W * Inv_W - + model->B2ub0L * Inv_L; - here->pParam->B2ubB = model->B2ubB0 + model->B2ubBW * Inv_W - + model->B2ubBL * Inv_L; - here->pParam->B2u10 = model->B2u100 + model->B2u10W * Inv_W - + model->B2u10L * Inv_L; - here->pParam->B2u1B = model->B2u1B0 + model->B2u1BW * Inv_W - + model->B2u1BL * Inv_L; - here->pParam->B2u1D = model->B2u1D0 + model->B2u1DW * Inv_W - + model->B2u1DL * Inv_L; - here->pParam->B2n0 = model->B2n00 + model->B2n0W * Inv_W - + model->B2n0L * Inv_L; - here->pParam->B2nB = model->B2nB0 + model->B2nBW * Inv_W - + model->B2nBL * Inv_L; - here->pParam->B2nD = model->B2nD0 + model->B2nDW * Inv_W - + model->B2nDL * Inv_L; - if (here->pParam->B2n0 < 0.0) - here->pParam->B2n0 = 0.0; - - here->pParam->B2vof0 = model->B2vof00 - + model->B2vof0W * Inv_W - + model->B2vof0L * Inv_L; - here->pParam->B2vofB = model->B2vofB0 - + model->B2vofBW * Inv_W - + model->B2vofBL * Inv_L; - here->pParam->B2vofD = model->B2vofD0 - + model->B2vofDW * Inv_W - + model->B2vofDL * Inv_L; - here->pParam->B2ai0 = model->B2ai00 + model->B2ai0W * Inv_W - + model->B2ai0L * Inv_L; - here->pParam->B2aiB = model->B2aiB0 + model->B2aiBW * Inv_W - + model->B2aiBL * Inv_L; - here->pParam->B2bi0 = model->B2bi00 + model->B2bi0W * Inv_W - + model->B2bi0L * Inv_L; - here->pParam->B2biB = model->B2biB0 + model->B2biBW * Inv_W - + model->B2biBL * Inv_L; - here->pParam->B2vghigh = model->B2vghigh0 - + model->B2vghighW * Inv_W - + model->B2vghighL * Inv_L; - here->pParam->B2vglow = model->B2vglow0 - + model->B2vglowW * Inv_W - + model->B2vglowL * Inv_L; - - here->pParam->CoxWL = model->B2Cox * EffectiveLength - * EffectiveWidth * 1.0e4; - here->pParam->One_Third_CoxWL = here->pParam->CoxWL / 3.0; - here->pParam->Two_Third_CoxWL = 2.0 - * here->pParam->One_Third_CoxWL; - here->pParam->B2GSoverlapCap = model->B2gateSourceOverlapCap - * EffectiveWidth; - here->pParam->B2GDoverlapCap = model->B2gateDrainOverlapCap - * EffectiveWidth; - here->pParam->B2GBoverlapCap = model->B2gateBulkOverlapCap - * EffectiveLength; - here->pParam->SqrtPhi = sqrt(here->pParam->B2phi); - here->pParam->Phis3 = here->pParam->SqrtPhi - * here->pParam->B2phi; - here->pParam->Arg = here->pParam->B2betasB - - here->pParam->B2beta0B - model->B2vdd - * (here->pParam->B2beta3B - model->B2vdd - * here->pParam->B2beta4B); - - - } - - - /* process drain series resistance */ - if( (here->B2drainConductance=model->B2sheetResistance * - here->B2drainSquares) != 0.0 ) { - here->B2drainConductance = 1. / here->B2drainConductance ; - } - - /* process source series resistance */ - if( (here->B2sourceConductance=model->B2sheetResistance * - here->B2sourceSquares) != 0.0 ) { - here->B2sourceConductance = 1. / here->B2sourceConductance ; - } - - - here->pParam->B2vt0 = here->pParam->B2vfb - + here->pParam->B2phi - + here->pParam->B2k1 * here->pParam->SqrtPhi - - here->pParam->B2k2 * here->pParam->B2phi; - here->B2von = here->pParam->B2vt0; /* added for initialization*/ - } - } - return(OK); -} - - - diff --git a/src/spicelib/devices/bsim2/b2trunc.c b/src/spicelib/devices/bsim2/b2trunc.c deleted file mode 100644 index 1f25f30e0..000000000 --- a/src/spicelib/devices/bsim2/b2trunc.c +++ /dev/null @@ -1,41 +0,0 @@ -/********** -Copyright 1990 Regents of the University of California. All rights reserved. -Author: 1985 Hong J. Park, Thomas L. Quarles -**********/ - -#include "ngspice/ngspice.h" -#include "ngspice/cktdefs.h" -#include "bsim2def.h" -#include "ngspice/sperror.h" -#include "ngspice/suffix.h" - -int -B2trunc(GENmodel *inModel, CKTcircuit *ckt, double *timeStep) -{ - B2model *model = (B2model*)inModel; - B2instance *here; -#ifdef STEPDEBUG - double debugtemp; -#endif /* STEPDEBUG */ - - for( ; model != NULL; model = B2nextModel(model)) { - for(here=B2instances(model);here!=NULL;here = B2nextInstance(here)){ - -#ifdef STEPDEBUG - debugtemp = *timeStep; -#endif /* STEPDEBUG */ - CKTterr(here->B2qb,ckt,timeStep); - CKTterr(here->B2qg,ckt,timeStep); - CKTterr(here->B2qd,ckt,timeStep); -#ifdef STEPDEBUG - if(debugtemp != *timeStep) { - printf("device %s reduces step from %g to %g\n", - here->B2name,debugtemp,*timeStep); - } -#endif /* STEPDEBUG */ - } - } - return(OK); -} - - diff --git a/src/spicelib/devices/bsim2/bsim2def.h b/src/spicelib/devices/bsim2/bsim2def.h deleted file mode 100644 index 1dbda587a..000000000 --- a/src/spicelib/devices/bsim2/bsim2def.h +++ /dev/null @@ -1,754 +0,0 @@ -/********** -Copyright 1990 Regents of the University of California. All rights reserved. -Author: 1988 Min-Chie Jeng, Hong June Park, Thomas L. Quarles -**********/ - -#ifndef BSIM2 -#define BSIM2 - -#include "ngspice/ifsim.h" -#include "ngspice/gendefs.h" -#include "ngspice/cktdefs.h" -#include "ngspice/complex.h" - - /* declarations for B2 MOSFETs */ - -/* information needed for each instance */ - -typedef struct sBSIM2instance { - - struct GENinstance gen; - -#define B2modPtr(inst) ((struct sBSIM2model *)((inst)->gen.GENmodPtr)) -#define B2nextInstance(inst) ((struct sBSIM2instance *)((inst)->gen.GENnextInstance)) -#define B2name gen.GENname -#define B2states gen.GENstate - - const int B2dNode; /* number of the gate node of the mosfet */ - const int B2gNode; /* number of the gate node of the mosfet */ - const int B2sNode; /* number of the source node of the mosfet */ - const int B2bNode; /* number of the bulk node of the mosfet */ - int B2dNodePrime; /* number of the internal drain node of the mosfet */ - int B2sNodePrime; /* number of the internal source node of the mosfet */ - - double B2l; /* the length of the channel region */ - double B2w; /* the width of the channel region */ - double B2m; /* the parallel multiplier */ - double B2drainArea; /* the area of the drain diffusion */ - double B2sourceArea; /* the area of the source diffusion */ - double B2drainSquares; /* the length of the drain in squares */ - double B2sourceSquares; /* the length of the source in squares */ - double B2drainPerimeter; - double B2sourcePerimeter; - double B2sourceConductance; /* cond. of source (or 0): set in setup */ - double B2drainConductance; /* cond. of drain (or 0): set in setup */ - - double B2icVBS; /* initial condition B-S voltage */ - double B2icVDS; /* initial condition D-S voltage */ - double B2icVGS; /* initial condition G-S voltage */ - double B2von; - double B2vdsat; - int B2off; /* non-zero to indicate device is off for dc analysis*/ - int B2mode; /* device mode : 1 = normal, -1 = inverse */ - - struct bsim2SizeDependParam *pParam; - - - unsigned B2lGiven :1; - unsigned B2wGiven :1; - unsigned B2mGiven :1; - unsigned B2drainAreaGiven :1; - unsigned B2sourceAreaGiven :1; - unsigned B2drainSquaresGiven :1; - unsigned B2sourceSquaresGiven :1; - unsigned B2drainPerimeterGiven :1; - unsigned B2sourcePerimeterGiven :1; - unsigned B2dNodePrimeSet :1; - unsigned B2sNodePrimeSet :1; - unsigned B2icVBSGiven :1; - unsigned B2icVDSGiven :1; - unsigned B2icVGSGiven :1; - unsigned B2vonGiven :1; - unsigned B2vdsatGiven :1; - - - double *B2DdPtr; /* pointer to sparse matrix element at - * (Drain node,drain node) */ - double *B2GgPtr; /* pointer to sparse matrix element at - * (gate node,gate node) */ - double *B2SsPtr; /* pointer to sparse matrix element at - * (source node,source node) */ - double *B2BbPtr; /* pointer to sparse matrix element at - * (bulk node,bulk node) */ - double *B2DPdpPtr; /* pointer to sparse matrix element at - * (drain prime node,drain prime node) */ - double *B2SPspPtr; /* pointer to sparse matrix element at - * (source prime node,source prime node) */ - double *B2DdpPtr; /* pointer to sparse matrix element at - * (drain node,drain prime node) */ - double *B2GbPtr; /* pointer to sparse matrix element at - * (gate node,bulk node) */ - double *B2GdpPtr; /* pointer to sparse matrix element at - * (gate node,drain prime node) */ - double *B2GspPtr; /* pointer to sparse matrix element at - * (gate node,source prime node) */ - double *B2SspPtr; /* pointer to sparse matrix element at - * (source node,source prime node) */ - double *B2BdpPtr; /* pointer to sparse matrix element at - * (bulk node,drain prime node) */ - double *B2BspPtr; /* pointer to sparse matrix element at - * (bulk node,source prime node) */ - double *B2DPspPtr; /* pointer to sparse matrix element at - * (drain prime node,source prime node) */ - double *B2DPdPtr; /* pointer to sparse matrix element at - * (drain prime node,drain node) */ - double *B2BgPtr; /* pointer to sparse matrix element at - * (bulk node,gate node) */ - double *B2DPgPtr; /* pointer to sparse matrix element at - * (drain prime node,gate node) */ - - double *B2SPgPtr; /* pointer to sparse matrix element at - * (source prime node,gate node) */ - double *B2SPsPtr; /* pointer to sparse matrix element at - * (source prime node,source node) */ - double *B2DPbPtr; /* pointer to sparse matrix element at - * (drain prime node,bulk node) */ - double *B2SPbPtr; /* pointer to sparse matrix element at - * (source prime node,bulk node) */ - double *B2SPdpPtr; /* pointer to sparse matrix element at - * (source prime node,drain prime node) */ - -#define B2RDNOIZ 0 -#define B2RSNOIZ 1 -#define B2IDNOIZ 2 -#define B2FLNOIZ 3 -#define B2TOTNOIZ 4 - -#define B2NSRCS 5 /* the number of BSIM2 noise sources */ - -#ifndef NONOISE - double B2nVar[NSTATVARS][B2NSRCS]; -#else /* NONOISE */ - double **B2nVar; -#endif /* NONOISE */ - -#define B2vbd B2states+ 0 -#define B2vbs B2states+ 1 -#define B2vgs B2states+ 2 -#define B2vds B2states+ 3 -#define B2cd B2states+ 4 -#define B2id B2states+ 4 -#define B2cbs B2states+ 5 -#define B2ibs B2states+ 5 -#define B2cbd B2states+ 6 -#define B2ibd B2states+ 6 -#define B2gm B2states+ 7 -#define B2gds B2states+ 8 -#define B2gmbs B2states+ 9 -#define B2gbd B2states+ 10 -#define B2gbs B2states+ 11 -#define B2qb B2states+ 12 -#define B2cqb B2states+ 13 -#define B2iqb B2states+ 13 -#define B2qg B2states+ 14 -#define B2cqg B2states+ 15 -#define B2iqg B2states+ 15 -#define B2qd B2states+ 16 -#define B2cqd B2states+ 17 -#define B2iqd B2states+ 17 -#define B2cggb B2states+ 18 -#define B2cgdb B2states+ 19 -#define B2cgsb B2states+ 20 -#define B2cbgb B2states+ 21 -#define B2cbdb B2states+ 22 -#define B2cbsb B2states+ 23 -#define B2capbd B2states+ 24 -#define B2iqbd B2states+ 25 -#define B2cqbd B2states+ 25 -#define B2capbs B2states+ 26 -#define B2iqbs B2states+ 27 -#define B2cqbs B2states+ 27 -#define B2cdgb B2states+ 28 -#define B2cddb B2states+ 29 -#define B2cdsb B2states+ 30 -#define B2vono B2states+ 31 -#define B2vdsato B2states+ 32 -#define B2qbs B2states+ 33 -#define B2qbd B2states+ 34 - -#define B2numStates 35 - -} B2instance ; - -struct bsim2SizeDependParam -{ - double Width; - double Length; - double B2vfb; /* flat band voltage at given L and W */ - double B2phi; /* surface potential at strong inversion */ - double B2k1; /* bulk effect coefficient 1 */ - double B2k2; /* bulk effect coefficient 2 */ - double B2eta0; /* drain induced barrier lowering */ - double B2etaB; /* Vbs dependence of Eta */ - double B2beta0; /* Beta at Vds = 0 and Vgs = Vth */ - double B2beta0B; /* Vbs dependence of Beta0 */ - double B2betas0; /* Beta at Vds=Vdd and Vgs=Vth */ - double B2betasB; /* Vbs dependence of Betas */ - double B2beta20; /* Vds dependence of Beta in tanh term */ - double B2beta2B; /* Vbs dependence of Beta2 */ - double B2beta2G; /* Vgs dependence of Beta2 */ - double B2beta30; /* Vds dependence of Beta in linear term */ - double B2beta3B; /* Vbs dependence of Beta3 */ - double B2beta3G; /* Vgs dependence of Beta3 */ - double B2beta40; /* Vds dependence of Beta in quadra term */ - double B2beta4B; /* Vbs dependence of Beta4 */ - double B2beta4G; /* Vgs dependence of Beta4 */ - double B2ua0; /* Linear Vgs dependence of Mobility */ - double B2uaB; /* Vbs dependence of Ua */ - double B2ub0; /* Quadratic Vgs dependence of Mobility */ - double B2ubB; /* Vbs dependence of Ub */ - double B2u10; /* Drift Velocity Saturation due to Vds */ - double B2u1B; /* Vbs dependence of U1 */ - double B2u1D; /* Vds dependence of U1 */ - double B2n0; /* Subthreshold slope at Vds=0, Vbs=0 */ - double B2nB; /* Vbs dependence of n */ - double B2nD; /* Vds dependence of n */ - double B2vof0; /* Vth offset at Vds=0, Vbs=0 */ - double B2vofB; /* Vbs dependence of Vof */ - double B2vofD; /* Vds dependence of Vof */ - double B2ai0; /* Pre-factor in hot-electron effects */ - double B2aiB; /* Vbs dependence of Ai */ - double B2bi0; /* Exp-factor in hot-electron effects */ - double B2biB; /* Vbs dependence of Bi */ - double B2vghigh; /* Upper bound of cubic spline function */ - double B2vglow; /* Lower bound of cubic spline function */ - double B2GDoverlapCap;/* Gate Drain Overlap Capacitance */ - double B2GSoverlapCap;/* Gate Source Overlap Capacitance */ - double B2GBoverlapCap;/* Gate Bulk Overlap Capacitance */ - double SqrtPhi; - double Phis3; - double CoxWL; - double One_Third_CoxWL; - double Two_Third_CoxWL; - double Arg; - double B2vt0; - struct bsim2SizeDependParam *pNext; -}; - - -/* per model data */ - -typedef struct sBSIM2model { /* model structure for a resistor */ - - struct GENmodel gen; - -#define B2modType gen.GENmodType -#define B2nextModel(inst) ((struct sBSIM2model *)((inst)->gen.GENnextModel)) -#define B2instances(inst) ((B2instance *)((inst)->gen.GENinstances)) -#define B2modName gen.GENmodName - - int B2type; /* device type: 1 = nmos, -1 = pmos */ - int pad; - - double B2vfb0; - double B2vfbL; - double B2vfbW; - double B2phi0; - double B2phiL; - double B2phiW; - double B2k10; - double B2k1L; - double B2k1W; - double B2k20; - double B2k2L; - double B2k2W; - double B2eta00; - double B2eta0L; - double B2eta0W; - double B2etaB0; - double B2etaBL; - double B2etaBW; - double B2deltaL; - double B2deltaW; - double B2mob00; - double B2mob0B0; - double B2mob0BL; - double B2mob0BW ; - double B2mobs00; - double B2mobs0L; - double B2mobs0W; - double B2mobsB0; - double B2mobsBL; - double B2mobsBW; - double B2mob200; - double B2mob20L; - double B2mob20W; - double B2mob2B0; - double B2mob2BL; - double B2mob2BW; - double B2mob2G0; - double B2mob2GL; - double B2mob2GW; - double B2mob300; - double B2mob30L; - double B2mob30W; - double B2mob3B0; - double B2mob3BL; - double B2mob3BW; - double B2mob3G0; - double B2mob3GL; - double B2mob3GW; - double B2mob400; - double B2mob40L; - double B2mob40W; - double B2mob4B0; - double B2mob4BL; - double B2mob4BW; - double B2mob4G0; - double B2mob4GL; - double B2mob4GW; - double B2ua00; - double B2ua0L; - double B2ua0W; - double B2uaB0; - double B2uaBL; - double B2uaBW; - double B2ub00; - double B2ub0L; - double B2ub0W; - double B2ubB0; - double B2ubBL; - double B2ubBW; - double B2u100; - double B2u10L; - double B2u10W; - double B2u1B0; - double B2u1BL; - double B2u1BW; - double B2u1D0; - double B2u1DL; - double B2u1DW; - double B2n00; - double B2n0L; - double B2n0W; - double B2nB0; - double B2nBL; - double B2nBW; - double B2nD0; - double B2nDL; - double B2nDW; - double B2vof00; - double B2vof0L; - double B2vof0W; - double B2vofB0; - double B2vofBL; - double B2vofBW; - double B2vofD0; - double B2vofDL; - double B2vofDW; - double B2ai00; - double B2ai0L; - double B2ai0W; - double B2aiB0; - double B2aiBL; - double B2aiBW; - double B2bi00; - double B2bi0L; - double B2bi0W; - double B2biB0; - double B2biBL; - double B2biBW; - double B2vghigh0; - double B2vghighL; - double B2vghighW; - double B2vglow0; - double B2vglowL; - double B2vglowW; - double B2tox; /* unit: micron */ - double B2Cox; /* unit: F/cm**2 */ - double B2temp; - double B2vdd; - double B2vdd2; - double B2vgg; - double B2vgg2; - double B2vbb; - double B2vbb2; - double B2gateSourceOverlapCap; - double B2gateDrainOverlapCap; - double B2gateBulkOverlapCap; - double B2Vtm; - - double B2sheetResistance; - double B2jctSatCurDensity; - double B2bulkJctPotential; - double B2bulkJctBotGradingCoeff; - double B2bulkJctSideGradingCoeff; - double B2sidewallJctPotential; - double B2unitAreaJctCap; - double B2unitLengthSidewallJctCap; - double B2defaultWidth; - double B2deltaLength; - double B2fNcoef; - double B2fNexp; - int B2channelChargePartitionFlag; - - - struct bsim2SizeDependParam *pSizeDependParamKnot; - - - unsigned B2vfb0Given :1; - unsigned B2vfbLGiven :1; - unsigned B2vfbWGiven :1; - unsigned B2phi0Given :1; - unsigned B2phiLGiven :1; - unsigned B2phiWGiven :1; - unsigned B2k10Given :1; - unsigned B2k1LGiven :1; - unsigned B2k1WGiven :1; - unsigned B2k20Given :1; - unsigned B2k2LGiven :1; - unsigned B2k2WGiven :1; - unsigned B2eta00Given :1; - unsigned B2eta0LGiven :1; - unsigned B2eta0WGiven :1; - unsigned B2etaB0Given :1; - unsigned B2etaBLGiven :1; - unsigned B2etaBWGiven :1; - unsigned B2deltaLGiven :1; - unsigned B2deltaWGiven :1; - unsigned B2mob00Given :1; - unsigned B2mob0B0Given :1; - unsigned B2mob0BLGiven :1; - unsigned B2mob0BWGiven :1; - unsigned B2mobs00Given :1; - unsigned B2mobs0LGiven :1; - unsigned B2mobs0WGiven :1; - unsigned B2mobsB0Given :1; - unsigned B2mobsBLGiven :1; - unsigned B2mobsBWGiven :1; - unsigned B2mob200Given :1; - unsigned B2mob20LGiven :1; - unsigned B2mob20WGiven :1; - unsigned B2mob2B0Given :1; - unsigned B2mob2BLGiven :1; - unsigned B2mob2BWGiven :1; - unsigned B2mob2G0Given :1; - unsigned B2mob2GLGiven :1; - unsigned B2mob2GWGiven :1; - unsigned B2mob300Given :1; - unsigned B2mob30LGiven :1; - unsigned B2mob30WGiven :1; - unsigned B2mob3B0Given :1; - unsigned B2mob3BLGiven :1; - unsigned B2mob3BWGiven :1; - unsigned B2mob3G0Given :1; - unsigned B2mob3GLGiven :1; - unsigned B2mob3GWGiven :1; - unsigned B2mob400Given :1; - unsigned B2mob40LGiven :1; - unsigned B2mob40WGiven :1; - unsigned B2mob4B0Given :1; - unsigned B2mob4BLGiven :1; - unsigned B2mob4BWGiven :1; - unsigned B2mob4G0Given :1; - unsigned B2mob4GLGiven :1; - unsigned B2mob4GWGiven :1; - unsigned B2ua00Given :1; - unsigned B2ua0LGiven :1; - unsigned B2ua0WGiven :1; - unsigned B2uaB0Given :1; - unsigned B2uaBLGiven :1; - unsigned B2uaBWGiven :1; - unsigned B2ub00Given :1; - unsigned B2ub0LGiven :1; - unsigned B2ub0WGiven :1; - unsigned B2ubB0Given :1; - unsigned B2ubBLGiven :1; - unsigned B2ubBWGiven :1; - unsigned B2u100Given :1; - unsigned B2u10LGiven :1; - unsigned B2u10WGiven :1; - unsigned B2u1B0Given :1; - unsigned B2u1BLGiven :1; - unsigned B2u1BWGiven :1; - unsigned B2u1D0Given :1; - unsigned B2u1DLGiven :1; - unsigned B2u1DWGiven :1; - unsigned B2n00Given :1; - unsigned B2n0LGiven :1; - unsigned B2n0WGiven :1; - unsigned B2nB0Given :1; - unsigned B2nBLGiven :1; - unsigned B2nBWGiven :1; - unsigned B2nD0Given :1; - unsigned B2nDLGiven :1; - unsigned B2nDWGiven :1; - unsigned B2vof00Given :1; - unsigned B2vof0LGiven :1; - unsigned B2vof0WGiven :1; - unsigned B2vofB0Given :1; - unsigned B2vofBLGiven :1; - unsigned B2vofBWGiven :1; - unsigned B2vofD0Given :1; - unsigned B2vofDLGiven :1; - unsigned B2vofDWGiven :1; - unsigned B2ai00Given :1; - unsigned B2ai0LGiven :1; - unsigned B2ai0WGiven :1; - unsigned B2aiB0Given :1; - unsigned B2aiBLGiven :1; - unsigned B2aiBWGiven :1; - unsigned B2bi00Given :1; - unsigned B2bi0LGiven :1; - unsigned B2bi0WGiven :1; - unsigned B2biB0Given :1; - unsigned B2biBLGiven :1; - unsigned B2biBWGiven :1; - unsigned B2vghigh0Given :1; - unsigned B2vghighLGiven :1; - unsigned B2vghighWGiven :1; - unsigned B2vglow0Given :1; - unsigned B2vglowLGiven :1; - unsigned B2vglowWGiven :1; - unsigned B2toxGiven :1; - unsigned B2tempGiven :1; - unsigned B2vddGiven :1; - unsigned B2vggGiven :1; - unsigned B2vbbGiven :1; - unsigned B2gateSourceOverlapCapGiven :1; - unsigned B2gateDrainOverlapCapGiven :1; - unsigned B2gateBulkOverlapCapGiven :1; - unsigned B2channelChargePartitionFlagGiven :1; - unsigned B2sheetResistanceGiven :1; - unsigned B2jctSatCurDensityGiven :1; - unsigned B2bulkJctPotentialGiven :1; - unsigned B2bulkJctBotGradingCoeffGiven :1; - unsigned B2sidewallJctPotentialGiven :1; - unsigned B2bulkJctSideGradingCoeffGiven :1; - unsigned B2unitAreaJctCapGiven :1; - unsigned B2unitLengthSidewallJctCapGiven :1; - unsigned B2defaultWidthGiven :1; - unsigned B2deltaLengthGiven :1; - unsigned B2fNcoefGiven :1; - unsigned B2fNexpGiven :1; - unsigned B2typeGiven :1; - -} B2model; - - -#ifndef NMOS -#define NMOS 1 -#define PMOS -1 -#endif /*NMOS*/ - - -/* device parameters */ -#define BSIM2_W 1 -#define BSIM2_L 2 -#define BSIM2_AS 3 -#define BSIM2_AD 4 -#define BSIM2_PS 5 -#define BSIM2_PD 6 -#define BSIM2_NRS 7 -#define BSIM2_NRD 8 -#define BSIM2_OFF 9 -#define BSIM2_IC_VBS 10 -#define BSIM2_IC_VDS 11 -#define BSIM2_IC_VGS 12 -#define BSIM2_IC 13 -#define BSIM2_M 14 - -/* model parameters */ -#define BSIM2_MOD_VFB0 101 -#define BSIM2_MOD_VFBL 102 -#define BSIM2_MOD_VFBW 103 -#define BSIM2_MOD_PHI0 104 -#define BSIM2_MOD_PHIL 105 -#define BSIM2_MOD_PHIW 106 -#define BSIM2_MOD_K10 107 -#define BSIM2_MOD_K1L 108 -#define BSIM2_MOD_K1W 109 -#define BSIM2_MOD_K20 110 -#define BSIM2_MOD_K2L 111 -#define BSIM2_MOD_K2W 112 -#define BSIM2_MOD_ETA00 113 -#define BSIM2_MOD_ETA0L 114 -#define BSIM2_MOD_ETA0W 115 -#define BSIM2_MOD_ETAB0 116 -#define BSIM2_MOD_ETABL 117 -#define BSIM2_MOD_ETABW 118 -#define BSIM2_MOD_DELTAL 119 -#define BSIM2_MOD_DELTAW 120 -#define BSIM2_MOD_MOB00 121 -#define BSIM2_MOD_MOB0B0 122 -#define BSIM2_MOD_MOB0BL 123 -#define BSIM2_MOD_MOB0BW 124 -#define BSIM2_MOD_MOBS00 125 -#define BSIM2_MOD_MOBS0L 126 -#define BSIM2_MOD_MOBS0W 127 -#define BSIM2_MOD_MOBSB0 128 -#define BSIM2_MOD_MOBSBL 129 -#define BSIM2_MOD_MOBSBW 130 -#define BSIM2_MOD_MOB200 131 -#define BSIM2_MOD_MOB20L 132 -#define BSIM2_MOD_MOB20W 133 -#define BSIM2_MOD_MOB2B0 134 -#define BSIM2_MOD_MOB2BL 135 -#define BSIM2_MOD_MOB2BW 136 -#define BSIM2_MOD_MOB2G0 137 -#define BSIM2_MOD_MOB2GL 138 -#define BSIM2_MOD_MOB2GW 139 -#define BSIM2_MOD_MOB300 140 -#define BSIM2_MOD_MOB30L 141 -#define BSIM2_MOD_MOB30W 142 -#define BSIM2_MOD_MOB3B0 143 -#define BSIM2_MOD_MOB3BL 144 -#define BSIM2_MOD_MOB3BW 145 -#define BSIM2_MOD_MOB3G0 146 -#define BSIM2_MOD_MOB3GL 147 -#define BSIM2_MOD_MOB3GW 148 -#define BSIM2_MOD_MOB400 149 -#define BSIM2_MOD_MOB40L 150 -#define BSIM2_MOD_MOB40W 151 -#define BSIM2_MOD_MOB4B0 152 -#define BSIM2_MOD_MOB4BL 153 -#define BSIM2_MOD_MOB4BW 154 -#define BSIM2_MOD_MOB4G0 155 -#define BSIM2_MOD_MOB4GL 156 -#define BSIM2_MOD_MOB4GW 157 -#define BSIM2_MOD_UA00 158 -#define BSIM2_MOD_UA0L 159 -#define BSIM2_MOD_UA0W 160 -#define BSIM2_MOD_UAB0 161 -#define BSIM2_MOD_UABL 162 -#define BSIM2_MOD_UABW 163 -#define BSIM2_MOD_UB00 164 -#define BSIM2_MOD_UB0L 165 -#define BSIM2_MOD_UB0W 166 -#define BSIM2_MOD_UBB0 167 -#define BSIM2_MOD_UBBL 168 -#define BSIM2_MOD_UBBW 169 -#define BSIM2_MOD_U100 170 -#define BSIM2_MOD_U10L 171 -#define BSIM2_MOD_U10W 172 -#define BSIM2_MOD_U1B0 173 -#define BSIM2_MOD_U1BL 174 -#define BSIM2_MOD_U1BW 175 -#define BSIM2_MOD_U1D0 176 -#define BSIM2_MOD_U1DL 177 -#define BSIM2_MOD_U1DW 178 -#define BSIM2_MOD_N00 179 -#define BSIM2_MOD_N0L 180 -#define BSIM2_MOD_N0W 181 -#define BSIM2_MOD_NB0 182 -#define BSIM2_MOD_NBL 183 -#define BSIM2_MOD_NBW 184 -#define BSIM2_MOD_ND0 185 -#define BSIM2_MOD_NDL 186 -#define BSIM2_MOD_NDW 187 -#define BSIM2_MOD_VOF00 188 -#define BSIM2_MOD_VOF0L 189 -#define BSIM2_MOD_VOF0W 190 -#define BSIM2_MOD_VOFB0 191 -#define BSIM2_MOD_VOFBL 192 -#define BSIM2_MOD_VOFBW 193 -#define BSIM2_MOD_VOFD0 194 -#define BSIM2_MOD_VOFDL 195 -#define BSIM2_MOD_VOFDW 196 -#define BSIM2_MOD_AI00 197 -#define BSIM2_MOD_AI0L 198 -#define BSIM2_MOD_AI0W 199 -#define BSIM2_MOD_AIB0 200 -#define BSIM2_MOD_AIBL 201 -#define BSIM2_MOD_AIBW 202 -#define BSIM2_MOD_BI00 203 -#define BSIM2_MOD_BI0L 204 -#define BSIM2_MOD_BI0W 205 -#define BSIM2_MOD_BIB0 206 -#define BSIM2_MOD_BIBL 207 -#define BSIM2_MOD_BIBW 208 -#define BSIM2_MOD_VGHIGH0 209 -#define BSIM2_MOD_VGHIGHL 210 -#define BSIM2_MOD_VGHIGHW 211 -#define BSIM2_MOD_VGLOW0 212 -#define BSIM2_MOD_VGLOWL 213 -#define BSIM2_MOD_VGLOWW 214 -#define BSIM2_MOD_TOX 215 -#define BSIM2_MOD_TEMP 216 -#define BSIM2_MOD_VDD 217 -#define BSIM2_MOD_VGG 218 -#define BSIM2_MOD_VBB 219 -#define BSIM2_MOD_CGSO 220 -#define BSIM2_MOD_CGDO 221 -#define BSIM2_MOD_CGBO 222 -#define BSIM2_MOD_XPART 223 -#define BSIM2_MOD_RSH 224 -#define BSIM2_MOD_JS 225 -#define BSIM2_MOD_PB 226 -#define BSIM2_MOD_MJ 227 -#define BSIM2_MOD_PBSW 228 -#define BSIM2_MOD_MJSW 229 -#define BSIM2_MOD_CJ 230 -#define BSIM2_MOD_CJSW 231 -#define BSIM2_MOD_DEFWIDTH 232 -#define BSIM2_MOD_DELLENGTH 233 -#define BSIM2_MOD_NMOS 234 -#define BSIM2_MOD_PMOS 235 - -#define BSIM2_MOD_KF 236 -#define BSIM2_MOD_AF 237 - -/* device questions */ -#define BSIM2_DNODE 241 -#define BSIM2_GNODE 242 -#define BSIM2_SNODE 243 -#define BSIM2_BNODE 244 -#define BSIM2_DNODEPRIME 245 -#define BSIM2_SNODEPRIME 246 -#define BSIM2_VBD 247 -#define BSIM2_VBS 248 -#define BSIM2_VGS 249 -#define BSIM2_VDS 250 -#define BSIM2_CD 251 -#define BSIM2_CBS 252 -#define BSIM2_CBD 253 -#define BSIM2_GM 254 -#define BSIM2_GDS 255 -#define BSIM2_GMBS 256 -#define BSIM2_GBD 257 -#define BSIM2_GBS 258 -#define BSIM2_QB 259 -#define BSIM2_CQB 260 -#define BSIM2_QG 261 -#define BSIM2_CQG 262 -#define BSIM2_QD 263 -#define BSIM2_CQD 264 -#define BSIM2_CGG 265 -#define BSIM2_CGD 266 -#define BSIM2_CGS 267 -#define BSIM2_CBG 268 -#define BSIM2_CAPBD 269 -#define BSIM2_CQBD 270 -#define BSIM2_CAPBS 271 -#define BSIM2_CQBS 272 -#define BSIM2_CDG 273 -#define BSIM2_CDD 274 -#define BSIM2_CDS 275 -#define BSIM2_VON 276 -#define BSIM2_QBS 277 -#define BSIM2_QBD 278 -#define BSIM2_SOURCECONDUCT 279 -#define BSIM2_DRAINCONDUCT 280 - -/* model questions */ - -#include "bsim2ext.h" - -extern void B2evaluate(double,double,double,B2instance*,B2model*, - double*,double*,double*, double*, double*, double*, double*, - double*, double*, double*, double*, double*, double*, double*, - double*, double*, double*, double*, CKTcircuit*); - - -#endif /*B2*/ - diff --git a/src/spicelib/devices/bsim2/bsim2ext.h b/src/spicelib/devices/bsim2/bsim2ext.h deleted file mode 100644 index 0787e7507..000000000 --- a/src/spicelib/devices/bsim2/bsim2ext.h +++ /dev/null @@ -1,24 +0,0 @@ -/********** -Copyright 1990 Regents of the University of California. All rights reserved. -Author: 1988 Min-Chie Jeng, Hong June Park, Thomas L. Quarles -**********/ - -extern int B2acLoad(GENmodel *,CKTcircuit*); -extern int B2ask(CKTcircuit *,GENinstance*,int,IFvalue*,IFvalue*); -extern int B2convTest(GENmodel *,CKTcircuit*); -extern int B2getic(GENmodel*,CKTcircuit*); -extern int B2load(GENmodel*,CKTcircuit*); -extern int B2mAsk(CKTcircuit*,GENmodel *,int, IFvalue*); -extern int B2mParam(int,IFvalue*,GENmodel*); -extern void B2mosCap(CKTcircuit*, double, double, double, double*, - double, double, double, double, double, double, - double*, double*, double*, double*, double*, double*, double*, double*, - double*, double*, double*, double*, double*, double*, double*, - double*); -extern int B2noise (int, int, GENmodel *, CKTcircuit *, Ndata *, double *); -extern int B2param(int,IFvalue*,GENinstance*,IFvalue*); -extern int B2pzLoad(GENmodel*,CKTcircuit*,SPcomplex*); -extern int B2setup(SMPmatrix*,GENmodel*,CKTcircuit*,int*); -extern int B2unsetup(GENmodel*,CKTcircuit*); -extern int B2temp(GENmodel*,CKTcircuit*); -extern int B2trunc(GENmodel*,CKTcircuit*,double*); diff --git a/src/spicelib/devices/bsim2/bsim2init.c b/src/spicelib/devices/bsim2/bsim2init.c deleted file mode 100644 index d1922ae84..000000000 --- a/src/spicelib/devices/bsim2/bsim2init.c +++ /dev/null @@ -1,76 +0,0 @@ -#include "ngspice/config.h" - -#include "ngspice/devdefs.h" - -#include "bsim2itf.h" -#include "bsim2ext.h" -#include "bsim2init.h" - - -SPICEdev B2info = { - .DEVpublic = { - .name = "BSIM2", - .description = "Berkeley Short Channel IGFET Model", - .terms = &B2nSize, - .numNames = &B2nSize, - .termNames = B2names, - .numInstanceParms = &B2pTSize, - .instanceParms = B2pTable, - .numModelParms = &B2mPTSize, - .modelParms = B2mPTable, - .flags = DEV_DEFAULT, - -#ifdef XSPICE - .cm_func = NULL, - .num_conn = 0, - .conn = NULL, - .num_param = 0, - .param = NULL, - .num_inst_var = 0, - .inst_var = NULL, -#endif - }, - - .DEVparam = B2param, - .DEVmodParam = B2mParam, - .DEVload = B2load, - .DEVsetup = B2setup, - .DEVunsetup = B2unsetup, - .DEVpzSetup = B2setup, - .DEVtemperature = B2temp, - .DEVtrunc = B2trunc, - .DEVfindBranch = NULL, - .DEVacLoad = B2acLoad, - .DEVaccept = NULL, - .DEVdestroy = NULL, - .DEVmodDelete = NULL, - .DEVdelete = NULL, - .DEVsetic = B2getic, - .DEVask = B2ask, - .DEVmodAsk = B2mAsk, - .DEVpzLoad = B2pzLoad, - .DEVconvTest = B2convTest, - .DEVsenSetup = NULL, - .DEVsenLoad = NULL, - .DEVsenUpdate = NULL, - .DEVsenAcLoad = NULL, - .DEVsenPrint = NULL, - .DEVsenTrunc = NULL, - .DEVdisto = NULL, - .DEVnoise = B2noise, - .DEVsoaCheck = NULL, - .DEVinstSize = &B2iSize, - .DEVmodSize = &B2mSize, - -#ifdef CIDER - .DEVdump = NULL, - .DEVacct = NULL, -#endif -}; - - -SPICEdev * -get_bsim2_info(void) -{ - return &B2info; -} diff --git a/src/spicelib/devices/bsim2/bsim2init.h b/src/spicelib/devices/bsim2/bsim2init.h deleted file mode 100644 index f34e036b6..000000000 --- a/src/spicelib/devices/bsim2/bsim2init.h +++ /dev/null @@ -1,13 +0,0 @@ -#ifndef _BSIM2INIT_H -#define _BSIM2INIT_H - -extern IFparm B2pTable[ ]; -extern IFparm B2mPTable[ ]; -extern char *B2names[ ]; -extern int B2pTSize; -extern int B2mPTSize; -extern int B2nSize; -extern int B2iSize; -extern int B2mSize; - -#endif diff --git a/src/spicelib/devices/bsim2/bsim2itf.h b/src/spicelib/devices/bsim2/bsim2itf.h deleted file mode 100644 index 2f77f903a..000000000 --- a/src/spicelib/devices/bsim2/bsim2itf.h +++ /dev/null @@ -1,9 +0,0 @@ -/********** -Copyright 1990 Regents of the University of California. All rights reserved. -**********/ -#ifndef DEV_BSIM2 -#define DEV_BSIM2 - -SPICEdev *get_bsim2_info(void); - -#endif diff --git a/src/spicelib/devices/bsim3/B3TERMS_OF_USE b/src/spicelib/devices/bsim3/B3TERMS_OF_USE deleted file mode 100644 index bc4a61beb..000000000 --- a/src/spicelib/devices/bsim3/B3TERMS_OF_USE +++ /dev/null @@ -1,30 +0,0 @@ - -The terms under which the software is provided are as the following. - -Software is distributed as is, completely without warranty or service -support. The University of California and its employees are not liable -for the condition or performance of the software. - -The University owns the copyright but shall not be liable for any -infringement of copyright or other proprietary rights brought by third -parties against the users of the software. - -The University of California hereby disclaims all implied warranties. - -The University of California grants the users the right to modify, copy, -and redistribute the software and documentation, both within the user's -organization and externally, subject to the following restrictions: - -1. The users agree not to charge for the University of California code - itself but may charge for additions, extensions, or support. - -2. In any product based on the software, the users agree to acknowledge - the UC Berkeley BSIM Research Group that developed the software. This - acknowledgment shall appear in the product documentation. - -3. The users agree to obey all U.S. Government restrictions governing - redistribution or export of the software. - -4. The users agree to reproduce any copyright notice which appears on - the software on any copy or modification of such made available - to others. diff --git a/src/spicelib/devices/bsim3/ChangeLog b/src/spicelib/devices/bsim3/ChangeLog deleted file mode 100644 index 6d1ab39da..000000000 --- a/src/spicelib/devices/bsim3/ChangeLog +++ /dev/null @@ -1,4 +0,0 @@ -1999-09-06 Arno Peters - - * b3ld.c: Removed unused variable. - diff --git a/src/spicelib/devices/bsim3/Makefile.am b/src/spicelib/devices/bsim3/Makefile.am deleted file mode 100644 index 92f8364c4..000000000 --- a/src/spicelib/devices/bsim3/Makefile.am +++ /dev/null @@ -1,36 +0,0 @@ -## Process this file with automake to produce Makefile.in - -noinst_LTLIBRARIES = libbsim3.la - -libbsim3_la_SOURCES = \ - b3.c \ - b3acld.c \ - b3ask.c \ - b3check.c \ - b3cvtest.c \ - b3getic.c \ - b3ld.c \ - b3mask.c \ - b3mdel.c \ - b3mpar.c \ - b3noi.c \ - b3par.c \ - b3pzld.c \ - b3set.c \ - b3soachk.c \ - b3temp.c \ - b3trunc.c \ - bsim3def.h \ - bsim3ext.h \ - bsim3init.c \ - bsim3init.h \ - bsim3itf.h - - - -AM_CPPFLAGS = @AM_CPPFLAGS@ -I$(top_srcdir)/src/include -AM_CFLAGS = $(STATIC) - -MAINTAINERCLEANFILES = Makefile.in - -EXTRA_DIST = B3TERMS_OF_USE diff --git a/src/spicelib/devices/bsim3/b3.c b/src/spicelib/devices/bsim3/b3.c deleted file mode 100644 index 85bcb15c6..000000000 --- a/src/spicelib/devices/bsim3/b3.c +++ /dev/null @@ -1,531 +0,0 @@ -/**** BSIM3v3.3.0 beta, Released by Xuemei Xi 07/29/2005 ****/ - -/********** - * Copyright 2004 Regents of the University of California. All rights reserved. - * File: b3.c of BSIM3v3.3.0 - * Author: 1995 Min-Chie Jeng and Mansun Chan - * Author: 1997-1999 Weidong Liu. - * Author: 2001 Xuemei Xi - **********/ - -#include "ngspice/ngspice.h" -#include "ngspice/devdefs.h" -#include "bsim3def.h" -#include "ngspice/suffix.h" - -IFparm BSIM3pTable[] = { /* parameters */ -IOP( "l", BSIM3_L, IF_REAL , "Length"), -IOP( "w", BSIM3_W, IF_REAL , "Width"), -IOP( "m", BSIM3_M, IF_REAL , "Parallel multiplier"), -IOP( "ad", BSIM3_AD, IF_REAL , "Drain area"), -IOP( "as", BSIM3_AS, IF_REAL , "Source area"), -IOP( "pd", BSIM3_PD, IF_REAL , "Drain perimeter"), -IOP( "ps", BSIM3_PS, IF_REAL , "Source perimeter"), -IOP( "nrd", BSIM3_NRD, IF_REAL , "Number of squares in drain"), -IOP( "nrs", BSIM3_NRS, IF_REAL , "Number of squares in source"), -IOP( "off", BSIM3_OFF, IF_FLAG , "Device is initially off"), -IOP( "nqsmod", BSIM3_NQSMOD, IF_INTEGER, "Non-quasi-static model selector"), -IOP( "acnqsmod", BSIM3_ACNQSMOD, IF_INTEGER, "AC NQS model selector"), -IOP( "geo", BSIM3_GEO, IF_INTEGER, "ACM model drain/source connection"), -IOP( "delvto", BSIM3_DELVTO, IF_REAL, "Zero bias threshold voltage variation"), -IOP( "mulu0", BSIM3_MULU0, IF_REAL, "Low field mobility multiplier"), -IP( "ic", BSIM3_IC, IF_REALVEC , "Vector of DS,GS,BS initial voltages"), -OP( "gmbs", BSIM3_GMBS, IF_REAL, "Gmb"), -OP( "gm", BSIM3_GM, IF_REAL, "Gm"), -OP( "gds", BSIM3_GDS, IF_REAL, "Gds"), -OP( "vdsat", BSIM3_VDSAT, IF_REAL, "Vdsat"), -OP( "vth", BSIM3_VON, IF_REAL, "Vth"), -OP( "id", BSIM3_CD, IF_REAL, "Ids"), -OP( "vbs", BSIM3_VBS, IF_REAL, "Vbs"), -OP( "vgs", BSIM3_VGS, IF_REAL, "Vgs"), -OP( "vds", BSIM3_VDS, IF_REAL, "Vds"), -OP( "ibd", BSIM3_CBD, IF_REAL, "Ibd"), /* newly added from here */ -OP( "ibs", BSIM3_CBS, IF_REAL, "Ibs"), -OP( "gbd", BSIM3_GBD, IF_REAL, "gbd"), -OP( "gbs", BSIM3_GBS, IF_REAL, "gbs"), -OP( "qb", BSIM3_QB, IF_REAL, "Qbulk"), -OP( "cqb", BSIM3_CQB, IF_REAL, "CQbulk"), -OP( "qg", BSIM3_QG, IF_REAL, "Qgate"), -OP( "cqg", BSIM3_CQG, IF_REAL, "CQgate"), -OP( "qd", BSIM3_QD, IF_REAL, "Qdrain"), -OP( "cqd", BSIM3_CQD, IF_REAL, "CQdrain"), -OP( "cgg", BSIM3_CGG, IF_REAL, "Cggb"), -OP( "cgd", BSIM3_CGD, IF_REAL, "Cgdb"), -OP( "cgs", BSIM3_CGS, IF_REAL, "Cgsb"), -OP( "cdg", BSIM3_CDG, IF_REAL, "Cdgb"), -OP( "cdd", BSIM3_CDD, IF_REAL, "Cddb"), -OP( "cds", BSIM3_CDS, IF_REAL, "Cdsb"), -OP( "cbg", BSIM3_CBG, IF_REAL, "Cbgb"), -OP( "cbd", BSIM3_CBDB, IF_REAL, "Cbdb"), -OP( "cbs", BSIM3_CBSB, IF_REAL, "Cbsb"), -OP( "capbd", BSIM3_CAPBD, IF_REAL, "Capbd"), -OP( "capbs", BSIM3_CAPBS, IF_REAL, "Capbs"), -}; - -IFparm BSIM3mPTable[] = { /* model parameters */ -IOP( "capmod", BSIM3_MOD_CAPMOD, IF_INTEGER, "Capacitance model selector"), -IOP( "mobmod", BSIM3_MOD_MOBMOD, IF_INTEGER, "Mobility model selector"), -IOP( "noimod", BSIM3_MOD_NOIMOD, IF_INTEGER, "Noise model selector"), -IOP( "nqsmod", BSIM3_MOD_NQSMOD, IF_INTEGER, "Non-quasi-static model selector"), -IOP( "acnqsmod", BSIM3_MOD_ACNQSMOD, IF_INTEGER, "AC NQS model selector"), -IOP( "acm", BSIM3_MOD_ACMMOD, IF_INTEGER, "Area calculation method selector"), -IOP( "calcacm", BSIM3_MOD_CALCACM, IF_INTEGER, "Area calculation method ACM=12"), -IOP( "paramchk", BSIM3_MOD_PARAMCHK, IF_INTEGER, "Model parameter checking selector"), -IOP( "binunit", BSIM3_MOD_BINUNIT, IF_INTEGER, "Bin unit selector"), -IOP( "version", BSIM3_MOD_VERSION, IF_STRING, " parameter for model version"), -IOP( "tox", BSIM3_MOD_TOX, IF_REAL, "Gate oxide thickness in meters"), - -IOP( "toxm", BSIM3_MOD_TOXM, IF_REAL, "Gate oxide thickness used in extraction"), -IOP( "cdsc", BSIM3_MOD_CDSC, IF_REAL, "Drain/Source and channel coupling capacitance"), -IOP( "cdscb", BSIM3_MOD_CDSCB, IF_REAL, "Body-bias dependence of cdsc"), -IOP( "cdscd", BSIM3_MOD_CDSCD, IF_REAL, "Drain-bias dependence of cdsc"), -IOP( "cit", BSIM3_MOD_CIT, IF_REAL, "Interface state capacitance"), -IOP( "nfactor", BSIM3_MOD_NFACTOR, IF_REAL, "Subthreshold swing Coefficient"), -IOP( "xj", BSIM3_MOD_XJ, IF_REAL, "Junction depth in meters"), -IOP( "vsat", BSIM3_MOD_VSAT, IF_REAL, "Saturation velocity at tnom"), -IOP( "at", BSIM3_MOD_AT, IF_REAL, "Temperature coefficient of vsat"), -IOP( "a0", BSIM3_MOD_A0, IF_REAL, "Non-uniform depletion width effect coefficient."), -IOP( "ags", BSIM3_MOD_AGS, IF_REAL, "Gate bias coefficient of Abulk."), -IOP( "a1", BSIM3_MOD_A1, IF_REAL, "Non-saturation effect coefficient"), -IOP( "a2", BSIM3_MOD_A2, IF_REAL, "Non-saturation effect coefficient"), -IOP( "keta", BSIM3_MOD_KETA, IF_REAL, "Body-bias coefficient of non-uniform depletion width effect."), -IOP( "nsub", BSIM3_MOD_NSUB, IF_REAL, "Substrate doping concentration"), -IOP( "nch", BSIM3_MOD_NPEAK, IF_REAL, "Channel doping concentration"), -IOP( "ngate", BSIM3_MOD_NGATE, IF_REAL, "Poly-gate doping concentration"), -IOP( "gamma1", BSIM3_MOD_GAMMA1, IF_REAL, "Vth body coefficient"), -IOP( "gamma2", BSIM3_MOD_GAMMA2, IF_REAL, "Vth body coefficient"), -IOP( "vbx", BSIM3_MOD_VBX, IF_REAL, "Vth transition body Voltage"), -IOP( "vbm", BSIM3_MOD_VBM, IF_REAL, "Maximum body voltage"), - -IOP( "xt", BSIM3_MOD_XT, IF_REAL, "Doping depth"), -IOP( "k1", BSIM3_MOD_K1, IF_REAL, "Bulk effect coefficient 1"), -IOP( "kt1", BSIM3_MOD_KT1, IF_REAL, "Temperature coefficient of Vth"), -IOP( "kt1l", BSIM3_MOD_KT1L, IF_REAL, "Temperature coefficient of Vth"), -IOP( "kt2", BSIM3_MOD_KT2, IF_REAL, "Body-coefficient of kt1"), -IOP( "k2", BSIM3_MOD_K2, IF_REAL, "Bulk effect coefficient 2"), -IOP( "k3", BSIM3_MOD_K3, IF_REAL, "Narrow width effect coefficient"), -IOP( "k3b", BSIM3_MOD_K3B, IF_REAL, "Body effect coefficient of k3"), -IOP( "w0", BSIM3_MOD_W0, IF_REAL, "Narrow width effect parameter"), -IOP( "nlx", BSIM3_MOD_NLX, IF_REAL, "Lateral non-uniform doping effect"), -IOP( "dvt0", BSIM3_MOD_DVT0, IF_REAL, "Short channel effect coeff. 0"), -IOP( "dvt1", BSIM3_MOD_DVT1, IF_REAL, "Short channel effect coeff. 1"), -IOP( "dvt2", BSIM3_MOD_DVT2, IF_REAL, "Short channel effect coeff. 2"), -IOP( "dvt0w", BSIM3_MOD_DVT0W, IF_REAL, "Narrow Width coeff. 0"), -IOP( "dvt1w", BSIM3_MOD_DVT1W, IF_REAL, "Narrow Width effect coeff. 1"), -IOP( "dvt2w", BSIM3_MOD_DVT2W, IF_REAL, "Narrow Width effect coeff. 2"), -IOP( "drout", BSIM3_MOD_DROUT, IF_REAL, "DIBL coefficient of output resistance"), -IOP( "dsub", BSIM3_MOD_DSUB, IF_REAL, "DIBL coefficient in the subthreshold region"), -IOP( "vth0", BSIM3_MOD_VTH0, IF_REAL,"Threshold voltage"), -IOPR("vtho", BSIM3_MOD_VTH0, IF_REAL,"Threshold voltage"), -IOP( "ua", BSIM3_MOD_UA, IF_REAL, "Linear gate dependence of mobility"), -IOP( "ua1", BSIM3_MOD_UA1, IF_REAL, "Temperature coefficient of ua"), -IOP( "ub", BSIM3_MOD_UB, IF_REAL, "Quadratic gate dependence of mobility"), -IOP( "ub1", BSIM3_MOD_UB1, IF_REAL, "Temperature coefficient of ub"), -IOP( "uc", BSIM3_MOD_UC, IF_REAL, "Body-bias dependence of mobility"), -IOP( "uc1", BSIM3_MOD_UC1, IF_REAL, "Temperature coefficient of uc"), -IOP( "u0", BSIM3_MOD_U0, IF_REAL, "Low-field mobility at Tnom"), -IOP( "ute", BSIM3_MOD_UTE, IF_REAL, "Temperature coefficient of mobility"), -IOP( "voff", BSIM3_MOD_VOFF, IF_REAL, "Threshold voltage offset"), -IOP( "tnom", BSIM3_MOD_TNOM, IF_REAL, "Parameter measurement temperature"), -IOP( "cgso", BSIM3_MOD_CGSO, IF_REAL, "Gate-source overlap capacitance per width"), -IOP( "cgdo", BSIM3_MOD_CGDO, IF_REAL, "Gate-drain overlap capacitance per width"), -IOP( "cgbo", BSIM3_MOD_CGBO, IF_REAL, "Gate-bulk overlap capacitance per length"), -IOP( "xpart", BSIM3_MOD_XPART, IF_REAL, "Channel charge partitioning"), -IOP( "elm", BSIM3_MOD_ELM, IF_REAL, "Non-quasi-static Elmore Constant Parameter"), -IOP( "delta", BSIM3_MOD_DELTA, IF_REAL, "Effective Vds parameter"), -IOP( "rsh", BSIM3_MOD_RSH, IF_REAL, "Source-drain sheet resistance"), -IOP( "rdsw", BSIM3_MOD_RDSW, IF_REAL, "Source-drain resistance per width"), - -IOP( "prwg", BSIM3_MOD_PRWG, IF_REAL, "Gate-bias effect on parasitic resistance "), -IOP( "prwb", BSIM3_MOD_PRWB, IF_REAL, "Body-effect on parasitic resistance "), - -IOP( "prt", BSIM3_MOD_PRT, IF_REAL, "Temperature coefficient of parasitic resistance "), -IOP( "eta0", BSIM3_MOD_ETA0, IF_REAL, "Subthreshold region DIBL coefficient"), -IOP( "etab", BSIM3_MOD_ETAB, IF_REAL, "Subthreshold region DIBL coefficient"), -IOP( "pclm", BSIM3_MOD_PCLM, IF_REAL, "Channel length modulation Coefficient"), -IOP( "pdiblc1", BSIM3_MOD_PDIBL1, IF_REAL, "Drain-induced barrier lowering coefficient"), -IOP( "pdiblc2", BSIM3_MOD_PDIBL2, IF_REAL, "Drain-induced barrier lowering coefficient"), -IOP( "pdiblcb", BSIM3_MOD_PDIBLB, IF_REAL, "Body-effect on drain-induced barrier lowering"), -IOP( "pscbe1", BSIM3_MOD_PSCBE1, IF_REAL, "Substrate current body-effect coefficient"), -IOP( "pscbe2", BSIM3_MOD_PSCBE2, IF_REAL, "Substrate current body-effect coefficient"), -IOP( "pvag", BSIM3_MOD_PVAG, IF_REAL, "Gate dependence of output resistance parameter"), -IOP( "js", BSIM3_MOD_JS, IF_REAL, "Source/drain junction reverse saturation current density"), -IOP( "jsw", BSIM3_MOD_JSW, IF_REAL, "Sidewall junction reverse saturation current density"), -IOP( "pb", BSIM3_MOD_PB, IF_REAL, "Source/drain junction built-in potential"), -IOP( "nj", BSIM3_MOD_NJ, IF_REAL, "Source/drain junction emission coefficient"), -IOP( "xti", BSIM3_MOD_XTI, IF_REAL, "Junction current temperature exponent"), -IOP( "mj", BSIM3_MOD_MJ, IF_REAL, "Source/drain bottom junction capacitance grading coefficient"), -IOP( "pbsw", BSIM3_MOD_PBSW, IF_REAL, "Source/drain sidewall junction capacitance built in potential"), -IOP( "mjsw", BSIM3_MOD_MJSW, IF_REAL, "Source/drain sidewall junction capacitance grading coefficient"), -IOP( "pbswg", BSIM3_MOD_PBSWG, IF_REAL, "Source/drain (gate side) sidewall junction capacitance built in potential"), -IOP( "mjswg", BSIM3_MOD_MJSWG, IF_REAL, "Source/drain (gate side) sidewall junction capacitance grading coefficient"), -IOP( "cj", BSIM3_MOD_CJ, IF_REAL, "Source/drain bottom junction capacitance per unit area"), -IOP( "vfbcv", BSIM3_MOD_VFBCV, IF_REAL, "Flat Band Voltage parameter for capmod=0 only"), -IOP( "vfb", BSIM3_MOD_VFB, IF_REAL, "Flat Band Voltage"), -IOP( "cjsw", BSIM3_MOD_CJSW, IF_REAL, "Source/drain sidewall junction capacitance per unit periphery"), -IOP( "cjswg", BSIM3_MOD_CJSWG, IF_REAL, "Source/drain (gate side) sidewall junction capacitance per unit width"), -IOP( "tpb", BSIM3_MOD_TPB, IF_REAL, "Temperature coefficient of pb"), -IOP( "tcj", BSIM3_MOD_TCJ, IF_REAL, "Temperature coefficient of cj"), -IOP( "tpbsw", BSIM3_MOD_TPBSW, IF_REAL, "Temperature coefficient of pbsw"), -IOP( "tcjsw", BSIM3_MOD_TCJSW, IF_REAL, "Temperature coefficient of cjsw"), -IOP( "tpbswg", BSIM3_MOD_TPBSWG, IF_REAL, "Temperature coefficient of pbswg"), -IOP( "tcjswg", BSIM3_MOD_TCJSWG, IF_REAL, "Temperature coefficient of cjswg"), -IOP( "acde", BSIM3_MOD_ACDE, IF_REAL, "Exponential coefficient for finite charge thickness"), -IOP( "moin", BSIM3_MOD_MOIN, IF_REAL, "Coefficient for gate-bias dependent surface potential"), -IOP( "noff", BSIM3_MOD_NOFF, IF_REAL, "C-V turn-on/off parameter"), -IOP( "voffcv", BSIM3_MOD_VOFFCV, IF_REAL, "C-V lateral-shift parameter"), -IOP( "lintnoi", BSIM3_MOD_LINTNOI, IF_REAL, "lint offset for noise calculation"), -IOP( "lint", BSIM3_MOD_LINT, IF_REAL, "Length reduction parameter"), -IOP( "ll", BSIM3_MOD_LL, IF_REAL, "Length reduction parameter"), -IOP( "llc", BSIM3_MOD_LLC, IF_REAL, "Length reduction parameter for CV"), -IOP( "lln", BSIM3_MOD_LLN, IF_REAL, "Length reduction parameter"), -IOP( "lw", BSIM3_MOD_LW, IF_REAL, "Length reduction parameter"), -IOP( "lwc", BSIM3_MOD_LWC, IF_REAL, "Length reduction parameter for CV"), -IOP( "lwn", BSIM3_MOD_LWN, IF_REAL, "Length reduction parameter"), -IOP( "lwl", BSIM3_MOD_LWL, IF_REAL, "Length reduction parameter"), -IOP( "lwlc", BSIM3_MOD_LWLC, IF_REAL, "Length reduction parameter for CV"), -IOP( "lmin", BSIM3_MOD_LMIN, IF_REAL, "Minimum length for the model"), -IOP( "lmax", BSIM3_MOD_LMAX, IF_REAL, "Maximum length for the model"), - -IOP( "xl", BSIM3_MOD_XL, IF_REAL, "Length correction parameter"), -IOP( "xw", BSIM3_MOD_XW, IF_REAL, "Width correction parameter"), - -IOP( "wr", BSIM3_MOD_WR, IF_REAL, "Width dependence of rds"), -IOP( "wint", BSIM3_MOD_WINT, IF_REAL, "Width reduction parameter"), -IOP( "dwg", BSIM3_MOD_DWG, IF_REAL, "Width reduction parameter"), -IOP( "dwb", BSIM3_MOD_DWB, IF_REAL, "Width reduction parameter"), - -IOP( "wl", BSIM3_MOD_WL, IF_REAL, "Width reduction parameter"), -IOP( "wlc", BSIM3_MOD_WLC, IF_REAL, "Width reduction parameter for CV"), -IOP( "wln", BSIM3_MOD_WLN, IF_REAL, "Width reduction parameter"), -IOP( "ww", BSIM3_MOD_WW, IF_REAL, "Width reduction parameter"), -IOP( "wwc", BSIM3_MOD_WWC, IF_REAL, "Width reduction parameter for CV"), -IOP( "wwn", BSIM3_MOD_WWN, IF_REAL, "Width reduction parameter"), -IOP( "wwl", BSIM3_MOD_WWL, IF_REAL, "Width reduction parameter"), -IOP( "wwlc", BSIM3_MOD_WWLC, IF_REAL, "Width reduction parameter for CV"), -IOP( "wmin", BSIM3_MOD_WMIN, IF_REAL, "Minimum width for the model"), -IOP( "wmax", BSIM3_MOD_WMAX, IF_REAL, "Maximum width for the model"), - -IOP( "b0", BSIM3_MOD_B0, IF_REAL, "Abulk narrow width parameter"), -IOP( "b1", BSIM3_MOD_B1, IF_REAL, "Abulk narrow width parameter"), - -IOP( "cgsl", BSIM3_MOD_CGSL, IF_REAL, "New C-V model parameter"), -IOP( "cgdl", BSIM3_MOD_CGDL, IF_REAL, "New C-V model parameter"), -IOP( "ckappa", BSIM3_MOD_CKAPPA, IF_REAL, "New C-V model parameter"), -IOP( "cf", BSIM3_MOD_CF, IF_REAL, "Fringe capacitance parameter"), -IOP( "clc", BSIM3_MOD_CLC, IF_REAL, "Vdsat parameter for C-V model"), -IOP( "cle", BSIM3_MOD_CLE, IF_REAL, "Vdsat parameter for C-V model"), -IOP( "dwc", BSIM3_MOD_DWC, IF_REAL, "Delta W for C-V model"), -IOP( "dlc", BSIM3_MOD_DLC, IF_REAL, "Delta L for C-V model"), - -IOP( "hdif", BSIM3_MOD_HDIF, IF_REAL, "ACM Parameter: Distance Gate - contact"), -IOP( "ldif", BSIM3_MOD_LDIF, IF_REAL, "ACM Parameter: Length of LDD Gate-Source/Drain"), -IOP( "ld", BSIM3_MOD_LD, IF_REAL, "ACM Parameter: Length of LDD under Gate"), -IOP( "rd", BSIM3_MOD_RD, IF_REAL, "ACM Parameter: Resistance of LDD drain side"), -IOP( "rs", BSIM3_MOD_RS, IF_REAL, "ACM Parameter: Resistance of LDD source side"), -IOP( "rdc", BSIM3_MOD_RDC, IF_REAL, "ACM Parameter: Resistance contact drain side"), -IOP( "rsc", BSIM3_MOD_RSC, IF_REAL, "ACM Parameter: Resistance contact source side"), -IOP( "wmlt", BSIM3_MOD_WMLT, IF_REAL, "ACM Parameter: Width shrink factor"), - -IOP( "alpha0", BSIM3_MOD_ALPHA0, IF_REAL, "substrate current model parameter"), -IOP( "alpha1", BSIM3_MOD_ALPHA1, IF_REAL, "substrate current model parameter"), -IOP( "beta0", BSIM3_MOD_BETA0, IF_REAL, "substrate current model parameter"), -IOP( "ijth", BSIM3_MOD_IJTH, IF_REAL, "Diode limiting current"), - -IOP( "lcdsc", BSIM3_MOD_LCDSC, IF_REAL, "Length dependence of cdsc"), -IOP( "lcdscb", BSIM3_MOD_LCDSCB, IF_REAL, "Length dependence of cdscb"), -IOP( "lcdscd", BSIM3_MOD_LCDSCD, IF_REAL, "Length dependence of cdscd"), -IOP( "lcit", BSIM3_MOD_LCIT, IF_REAL, "Length dependence of cit"), -IOP( "lnfactor", BSIM3_MOD_LNFACTOR, IF_REAL, "Length dependence of nfactor"), -IOP( "lxj", BSIM3_MOD_LXJ, IF_REAL, "Length dependence of xj"), -IOP( "lvsat", BSIM3_MOD_LVSAT, IF_REAL, "Length dependence of vsat"), -IOP( "lat", BSIM3_MOD_LAT, IF_REAL, "Length dependence of at"), -IOP( "la0", BSIM3_MOD_LA0, IF_REAL, "Length dependence of a0"), -IOP( "lags", BSIM3_MOD_LAGS, IF_REAL, "Length dependence of ags"), -IOP( "la1", BSIM3_MOD_LA1, IF_REAL, "Length dependence of a1"), -IOP( "la2", BSIM3_MOD_LA2, IF_REAL, "Length dependence of a2"), -IOP( "lketa", BSIM3_MOD_LKETA, IF_REAL, "Length dependence of keta"), -IOP( "lnsub", BSIM3_MOD_LNSUB, IF_REAL, "Length dependence of nsub"), -IOP( "lnch", BSIM3_MOD_LNPEAK, IF_REAL, "Length dependence of nch"), -IOP( "lngate", BSIM3_MOD_LNGATE, IF_REAL, "Length dependence of ngate"), -IOP( "lgamma1", BSIM3_MOD_LGAMMA1, IF_REAL, "Length dependence of gamma1"), -IOP( "lgamma2", BSIM3_MOD_LGAMMA2, IF_REAL, "Length dependence of gamma2"), -IOP( "lvbx", BSIM3_MOD_LVBX, IF_REAL, "Length dependence of vbx"), -IOP( "lvbm", BSIM3_MOD_LVBM, IF_REAL, "Length dependence of vbm"), -IOP( "lxt", BSIM3_MOD_LXT, IF_REAL, "Length dependence of xt"), -IOP( "lk1", BSIM3_MOD_LK1, IF_REAL, "Length dependence of k1"), -IOP( "lkt1", BSIM3_MOD_LKT1, IF_REAL, "Length dependence of kt1"), -IOP( "lkt1l", BSIM3_MOD_LKT1L, IF_REAL, "Length dependence of kt1l"), -IOP( "lkt2", BSIM3_MOD_LKT2, IF_REAL, "Length dependence of kt2"), -IOP( "lk2", BSIM3_MOD_LK2, IF_REAL, "Length dependence of k2"), -IOP( "lk3", BSIM3_MOD_LK3, IF_REAL, "Length dependence of k3"), -IOP( "lk3b", BSIM3_MOD_LK3B, IF_REAL, "Length dependence of k3b"), -IOP( "lw0", BSIM3_MOD_LW0, IF_REAL, "Length dependence of w0"), -IOP( "lnlx", BSIM3_MOD_LNLX, IF_REAL, "Length dependence of nlx"), -IOP( "ldvt0", BSIM3_MOD_LDVT0, IF_REAL, "Length dependence of dvt0"), -IOP( "ldvt1", BSIM3_MOD_LDVT1, IF_REAL, "Length dependence of dvt1"), -IOP( "ldvt2", BSIM3_MOD_LDVT2, IF_REAL, "Length dependence of dvt2"), -IOP( "ldvt0w", BSIM3_MOD_LDVT0W, IF_REAL, "Length dependence of dvt0w"), -IOP( "ldvt1w", BSIM3_MOD_LDVT1W, IF_REAL, "Length dependence of dvt1w"), -IOP( "ldvt2w", BSIM3_MOD_LDVT2W, IF_REAL, "Length dependence of dvt2w"), -IOP( "ldrout", BSIM3_MOD_LDROUT, IF_REAL, "Length dependence of drout"), -IOP( "ldsub", BSIM3_MOD_LDSUB, IF_REAL, "Length dependence of dsub"), -IOP( "lvth0", BSIM3_MOD_LVTH0, IF_REAL,"Length dependence of vth0"), -IOPR("lvtho", BSIM3_MOD_LVTH0, IF_REAL,"Length dependence of vtho"), -IOP( "lua", BSIM3_MOD_LUA, IF_REAL, "Length dependence of ua"), -IOP( "lua1", BSIM3_MOD_LUA1, IF_REAL, "Length dependence of ua1"), -IOP( "lub", BSIM3_MOD_LUB, IF_REAL, "Length dependence of ub"), -IOP( "lub1", BSIM3_MOD_LUB1, IF_REAL, "Length dependence of ub1"), -IOP( "luc", BSIM3_MOD_LUC, IF_REAL, "Length dependence of uc"), -IOP( "luc1", BSIM3_MOD_LUC1, IF_REAL, "Length dependence of uc1"), -IOP( "lu0", BSIM3_MOD_LU0, IF_REAL, "Length dependence of u0"), -IOP( "lute", BSIM3_MOD_LUTE, IF_REAL, "Length dependence of ute"), -IOP( "lvoff", BSIM3_MOD_LVOFF, IF_REAL, "Length dependence of voff"), -IOP( "lelm", BSIM3_MOD_LELM, IF_REAL, "Length dependence of elm"), -IOP( "ldelta", BSIM3_MOD_LDELTA, IF_REAL, "Length dependence of delta"), -IOP( "lrdsw", BSIM3_MOD_LRDSW, IF_REAL, "Length dependence of rdsw "), - -IOP( "lprwg", BSIM3_MOD_LPRWG, IF_REAL, "Length dependence of prwg "), -IOP( "lprwb", BSIM3_MOD_LPRWB, IF_REAL, "Length dependence of prwb "), - -IOP( "lprt", BSIM3_MOD_LPRT, IF_REAL, "Length dependence of prt "), -IOP( "leta0", BSIM3_MOD_LETA0, IF_REAL, "Length dependence of eta0"), -IOP( "letab", BSIM3_MOD_LETAB, IF_REAL, "Length dependence of etab"), -IOP( "lpclm", BSIM3_MOD_LPCLM, IF_REAL, "Length dependence of pclm"), -IOP( "lpdiblc1", BSIM3_MOD_LPDIBL1, IF_REAL, "Length dependence of pdiblc1"), -IOP( "lpdiblc2", BSIM3_MOD_LPDIBL2, IF_REAL, "Length dependence of pdiblc2"), -IOP( "lpdiblcb", BSIM3_MOD_LPDIBLB, IF_REAL, "Length dependence of pdiblcb"), -IOP( "lpscbe1", BSIM3_MOD_LPSCBE1, IF_REAL, "Length dependence of pscbe1"), -IOP( "lpscbe2", BSIM3_MOD_LPSCBE2, IF_REAL, "Length dependence of pscbe2"), -IOP( "lpvag", BSIM3_MOD_LPVAG, IF_REAL, "Length dependence of pvag"), -IOP( "lwr", BSIM3_MOD_LWR, IF_REAL, "Length dependence of wr"), -IOP( "ldwg", BSIM3_MOD_LDWG, IF_REAL, "Length dependence of dwg"), -IOP( "ldwb", BSIM3_MOD_LDWB, IF_REAL, "Length dependence of dwb"), -IOP( "lb0", BSIM3_MOD_LB0, IF_REAL, "Length dependence of b0"), -IOP( "lb1", BSIM3_MOD_LB1, IF_REAL, "Length dependence of b1"), -IOP( "lcgsl", BSIM3_MOD_LCGSL, IF_REAL, "Length dependence of cgsl"), -IOP( "lcgdl", BSIM3_MOD_LCGDL, IF_REAL, "Length dependence of cgdl"), -IOP( "lckappa", BSIM3_MOD_LCKAPPA, IF_REAL, "Length dependence of ckappa"), -IOP( "lcf", BSIM3_MOD_LCF, IF_REAL, "Length dependence of cf"), -IOP( "lclc", BSIM3_MOD_LCLC, IF_REAL, "Length dependence of clc"), -IOP( "lcle", BSIM3_MOD_LCLE, IF_REAL, "Length dependence of cle"), -IOP( "lalpha0", BSIM3_MOD_LALPHA0, IF_REAL, "Length dependence of alpha0"), -IOP( "lalpha1", BSIM3_MOD_LALPHA1, IF_REAL, "Length dependence of alpha1"), -IOP( "lbeta0", BSIM3_MOD_LBETA0, IF_REAL, "Length dependence of beta0"), -IOP( "lvfbcv", BSIM3_MOD_LVFBCV, IF_REAL, "Length dependence of vfbcv"), -IOP( "lvfb", BSIM3_MOD_LVFB, IF_REAL, "Length dependence of vfb"), -IOP( "lacde", BSIM3_MOD_LACDE, IF_REAL, "Length dependence of acde"), -IOP( "lmoin", BSIM3_MOD_LMOIN, IF_REAL, "Length dependence of moin"), -IOP( "lnoff", BSIM3_MOD_LNOFF, IF_REAL, "Length dependence of noff"), -IOP( "lvoffcv", BSIM3_MOD_LVOFFCV, IF_REAL, "Length dependence of voffcv"), -IOP( "wcdsc", BSIM3_MOD_WCDSC, IF_REAL, "Width dependence of cdsc"), -IOP( "wcdscb", BSIM3_MOD_WCDSCB, IF_REAL, "Width dependence of cdscb"), -IOP( "wcdscd", BSIM3_MOD_WCDSCD, IF_REAL, "Width dependence of cdscd"), -IOP( "wcit", BSIM3_MOD_WCIT, IF_REAL, "Width dependence of cit"), -IOP( "wnfactor", BSIM3_MOD_WNFACTOR, IF_REAL, "Width dependence of nfactor"), -IOP( "wxj", BSIM3_MOD_WXJ, IF_REAL, "Width dependence of xj"), -IOP( "wvsat", BSIM3_MOD_WVSAT, IF_REAL, "Width dependence of vsat"), -IOP( "wat", BSIM3_MOD_WAT, IF_REAL, "Width dependence of at"), -IOP( "wa0", BSIM3_MOD_WA0, IF_REAL, "Width dependence of a0"), -IOP( "wags", BSIM3_MOD_WAGS, IF_REAL, "Width dependence of ags"), -IOP( "wa1", BSIM3_MOD_WA1, IF_REAL, "Width dependence of a1"), -IOP( "wa2", BSIM3_MOD_WA2, IF_REAL, "Width dependence of a2"), -IOP( "wketa", BSIM3_MOD_WKETA, IF_REAL, "Width dependence of keta"), -IOP( "wnsub", BSIM3_MOD_WNSUB, IF_REAL, "Width dependence of nsub"), -IOP( "wnch", BSIM3_MOD_WNPEAK, IF_REAL, "Width dependence of nch"), -IOP( "wngate", BSIM3_MOD_WNGATE, IF_REAL, "Width dependence of ngate"), -IOP( "wgamma1", BSIM3_MOD_WGAMMA1, IF_REAL, "Width dependence of gamma1"), -IOP( "wgamma2", BSIM3_MOD_WGAMMA2, IF_REAL, "Width dependence of gamma2"), -IOP( "wvbx", BSIM3_MOD_WVBX, IF_REAL, "Width dependence of vbx"), -IOP( "wvbm", BSIM3_MOD_WVBM, IF_REAL, "Width dependence of vbm"), -IOP( "wxt", BSIM3_MOD_WXT, IF_REAL, "Width dependence of xt"), -IOP( "wk1", BSIM3_MOD_WK1, IF_REAL, "Width dependence of k1"), -IOP( "wkt1", BSIM3_MOD_WKT1, IF_REAL, "Width dependence of kt1"), -IOP( "wkt1l", BSIM3_MOD_WKT1L, IF_REAL, "Width dependence of kt1l"), -IOP( "wkt2", BSIM3_MOD_WKT2, IF_REAL, "Width dependence of kt2"), -IOP( "wk2", BSIM3_MOD_WK2, IF_REAL, "Width dependence of k2"), -IOP( "wk3", BSIM3_MOD_WK3, IF_REAL, "Width dependence of k3"), -IOP( "wk3b", BSIM3_MOD_WK3B, IF_REAL, "Width dependence of k3b"), -IOP( "ww0", BSIM3_MOD_WW0, IF_REAL, "Width dependence of w0"), -IOP( "wnlx", BSIM3_MOD_WNLX, IF_REAL, "Width dependence of nlx"), -IOP( "wdvt0", BSIM3_MOD_WDVT0, IF_REAL, "Width dependence of dvt0"), -IOP( "wdvt1", BSIM3_MOD_WDVT1, IF_REAL, "Width dependence of dvt1"), -IOP( "wdvt2", BSIM3_MOD_WDVT2, IF_REAL, "Width dependence of dvt2"), -IOP( "wdvt0w", BSIM3_MOD_WDVT0W, IF_REAL, "Width dependence of dvt0w"), -IOP( "wdvt1w", BSIM3_MOD_WDVT1W, IF_REAL, "Width dependence of dvt1w"), -IOP( "wdvt2w", BSIM3_MOD_WDVT2W, IF_REAL, "Width dependence of dvt2w"), -IOP( "wdrout", BSIM3_MOD_WDROUT, IF_REAL, "Width dependence of drout"), -IOP( "wdsub", BSIM3_MOD_WDSUB, IF_REAL, "Width dependence of dsub"), -IOP( "wvth0", BSIM3_MOD_WVTH0, IF_REAL,"Width dependence of vth0"), -IOPR("wvtho", BSIM3_MOD_WVTH0, IF_REAL,"Width dependence of vtho"), -IOP( "wua", BSIM3_MOD_WUA, IF_REAL, "Width dependence of ua"), -IOP( "wua1", BSIM3_MOD_WUA1, IF_REAL, "Width dependence of ua1"), -IOP( "wub", BSIM3_MOD_WUB, IF_REAL, "Width dependence of ub"), -IOP( "wub1", BSIM3_MOD_WUB1, IF_REAL, "Width dependence of ub1"), -IOP( "wuc", BSIM3_MOD_WUC, IF_REAL, "Width dependence of uc"), -IOP( "wuc1", BSIM3_MOD_WUC1, IF_REAL, "Width dependence of uc1"), -IOP( "wu0", BSIM3_MOD_WU0, IF_REAL, "Width dependence of u0"), -IOP( "wute", BSIM3_MOD_WUTE, IF_REAL, "Width dependence of ute"), -IOP( "wvoff", BSIM3_MOD_WVOFF, IF_REAL, "Width dependence of voff"), -IOP( "welm", BSIM3_MOD_WELM, IF_REAL, "Width dependence of elm"), -IOP( "wdelta", BSIM3_MOD_WDELTA, IF_REAL, "Width dependence of delta"), -IOP( "wrdsw", BSIM3_MOD_WRDSW, IF_REAL, "Width dependence of rdsw "), - -IOP( "wprwg", BSIM3_MOD_WPRWG, IF_REAL, "Width dependence of prwg "), -IOP( "wprwb", BSIM3_MOD_WPRWB, IF_REAL, "Width dependence of prwb "), - -IOP( "wprt", BSIM3_MOD_WPRT, IF_REAL, "Width dependence of prt"), -IOP( "weta0", BSIM3_MOD_WETA0, IF_REAL, "Width dependence of eta0"), -IOP( "wetab", BSIM3_MOD_WETAB, IF_REAL, "Width dependence of etab"), -IOP( "wpclm", BSIM3_MOD_WPCLM, IF_REAL, "Width dependence of pclm"), -IOP( "wpdiblc1", BSIM3_MOD_WPDIBL1, IF_REAL, "Width dependence of pdiblc1"), -IOP( "wpdiblc2", BSIM3_MOD_WPDIBL2, IF_REAL, "Width dependence of pdiblc2"), -IOP( "wpdiblcb", BSIM3_MOD_WPDIBLB, IF_REAL, "Width dependence of pdiblcb"), -IOP( "wpscbe1", BSIM3_MOD_WPSCBE1, IF_REAL, "Width dependence of pscbe1"), -IOP( "wpscbe2", BSIM3_MOD_WPSCBE2, IF_REAL, "Width dependence of pscbe2"), -IOP( "wpvag", BSIM3_MOD_WPVAG, IF_REAL, "Width dependence of pvag"), -IOP( "wwr", BSIM3_MOD_WWR, IF_REAL, "Width dependence of wr"), -IOP( "wdwg", BSIM3_MOD_WDWG, IF_REAL, "Width dependence of dwg"), -IOP( "wdwb", BSIM3_MOD_WDWB, IF_REAL, "Width dependence of dwb"), -IOP( "wb0", BSIM3_MOD_WB0, IF_REAL, "Width dependence of b0"), -IOP( "wb1", BSIM3_MOD_WB1, IF_REAL, "Width dependence of b1"), -IOP( "wcgsl", BSIM3_MOD_WCGSL, IF_REAL, "Width dependence of cgsl"), -IOP( "wcgdl", BSIM3_MOD_WCGDL, IF_REAL, "Width dependence of cgdl"), -IOP( "wckappa", BSIM3_MOD_WCKAPPA, IF_REAL, "Width dependence of ckappa"), -IOP( "wcf", BSIM3_MOD_WCF, IF_REAL, "Width dependence of cf"), -IOP( "wclc", BSIM3_MOD_WCLC, IF_REAL, "Width dependence of clc"), -IOP( "wcle", BSIM3_MOD_WCLE, IF_REAL, "Width dependence of cle"), -IOP( "walpha0", BSIM3_MOD_WALPHA0, IF_REAL, "Width dependence of alpha0"), -IOP( "walpha1", BSIM3_MOD_WALPHA1, IF_REAL, "Width dependence of alpha1"), -IOP( "wbeta0", BSIM3_MOD_WBETA0, IF_REAL, "Width dependence of beta0"), -IOP( "wvfbcv", BSIM3_MOD_WVFBCV, IF_REAL, "Width dependence of vfbcv"), -IOP( "wvfb", BSIM3_MOD_WVFB, IF_REAL, "Width dependence of vfb"), -IOP( "wacde", BSIM3_MOD_WACDE, IF_REAL, "Width dependence of acde"), -IOP( "wmoin", BSIM3_MOD_WMOIN, IF_REAL, "Width dependence of moin"), -IOP( "wnoff", BSIM3_MOD_WNOFF, IF_REAL, "Width dependence of noff"), -IOP( "wvoffcv", BSIM3_MOD_WVOFFCV, IF_REAL, "Width dependence of voffcv"), - -IOP( "pcdsc", BSIM3_MOD_PCDSC, IF_REAL, "Cross-term dependence of cdsc"), -IOP( "pcdscb", BSIM3_MOD_PCDSCB, IF_REAL, "Cross-term dependence of cdscb"), -IOP( "pcdscd", BSIM3_MOD_PCDSCD, IF_REAL, "Cross-term dependence of cdscd"), -IOP( "pcit", BSIM3_MOD_PCIT, IF_REAL, "Cross-term dependence of cit"), -IOP( "pnfactor", BSIM3_MOD_PNFACTOR, IF_REAL, "Cross-term dependence of nfactor"), -IOP( "pxj", BSIM3_MOD_PXJ, IF_REAL, "Cross-term dependence of xj"), -IOP( "pvsat", BSIM3_MOD_PVSAT, IF_REAL, "Cross-term dependence of vsat"), -IOP( "pat", BSIM3_MOD_PAT, IF_REAL, "Cross-term dependence of at"), -IOP( "pa0", BSIM3_MOD_PA0, IF_REAL, "Cross-term dependence of a0"), -IOP( "pags", BSIM3_MOD_PAGS, IF_REAL, "Cross-term dependence of ags"), -IOP( "pa1", BSIM3_MOD_PA1, IF_REAL, "Cross-term dependence of a1"), -IOP( "pa2", BSIM3_MOD_PA2, IF_REAL, "Cross-term dependence of a2"), -IOP( "pketa", BSIM3_MOD_PKETA, IF_REAL, "Cross-term dependence of keta"), -IOP( "pnsub", BSIM3_MOD_PNSUB, IF_REAL, "Cross-term dependence of nsub"), -IOP( "pnch", BSIM3_MOD_PNPEAK, IF_REAL, "Cross-term dependence of nch"), -IOP( "pngate", BSIM3_MOD_PNGATE, IF_REAL, "Cross-term dependence of ngate"), -IOP( "pgamma1", BSIM3_MOD_PGAMMA1, IF_REAL, "Cross-term dependence of gamma1"), -IOP( "pgamma2", BSIM3_MOD_PGAMMA2, IF_REAL, "Cross-term dependence of gamma2"), -IOP( "pvbx", BSIM3_MOD_PVBX, IF_REAL, "Cross-term dependence of vbx"), -IOP( "pvbm", BSIM3_MOD_PVBM, IF_REAL, "Cross-term dependence of vbm"), -IOP( "pxt", BSIM3_MOD_PXT, IF_REAL, "Cross-term dependence of xt"), -IOP( "pk1", BSIM3_MOD_PK1, IF_REAL, "Cross-term dependence of k1"), -IOP( "pkt1", BSIM3_MOD_PKT1, IF_REAL, "Cross-term dependence of kt1"), -IOP( "pkt1l", BSIM3_MOD_PKT1L, IF_REAL, "Cross-term dependence of kt1l"), -IOP( "pkt2", BSIM3_MOD_PKT2, IF_REAL, "Cross-term dependence of kt2"), -IOP( "pk2", BSIM3_MOD_PK2, IF_REAL, "Cross-term dependence of k2"), -IOP( "pk3", BSIM3_MOD_PK3, IF_REAL, "Cross-term dependence of k3"), -IOP( "pk3b", BSIM3_MOD_PK3B, IF_REAL, "Cross-term dependence of k3b"), -IOP( "pw0", BSIM3_MOD_PW0, IF_REAL, "Cross-term dependence of w0"), -IOP( "pnlx", BSIM3_MOD_PNLX, IF_REAL, "Cross-term dependence of nlx"), -IOP( "pdvt0", BSIM3_MOD_PDVT0, IF_REAL, "Cross-term dependence of dvt0"), -IOP( "pdvt1", BSIM3_MOD_PDVT1, IF_REAL, "Cross-term dependence of dvt1"), -IOP( "pdvt2", BSIM3_MOD_PDVT2, IF_REAL, "Cross-term dependence of dvt2"), -IOP( "pdvt0w", BSIM3_MOD_PDVT0W, IF_REAL, "Cross-term dependence of dvt0w"), -IOP( "pdvt1w", BSIM3_MOD_PDVT1W, IF_REAL, "Cross-term dependence of dvt1w"), -IOP( "pdvt2w", BSIM3_MOD_PDVT2W, IF_REAL, "Cross-term dependence of dvt2w"), -IOP( "pdrout", BSIM3_MOD_PDROUT, IF_REAL, "Cross-term dependence of drout"), -IOP( "pdsub", BSIM3_MOD_PDSUB, IF_REAL, "Cross-term dependence of dsub"), -IOP( "pvth0", BSIM3_MOD_PVTH0, IF_REAL,"Cross-term dependence of vth0"), -IOPR("pvtho", BSIM3_MOD_PVTH0, IF_REAL,"Cross-term dependence of vtho"), -IOP( "pua", BSIM3_MOD_PUA, IF_REAL, "Cross-term dependence of ua"), -IOP( "pua1", BSIM3_MOD_PUA1, IF_REAL, "Cross-term dependence of ua1"), -IOP( "pub", BSIM3_MOD_PUB, IF_REAL, "Cross-term dependence of ub"), -IOP( "pub1", BSIM3_MOD_PUB1, IF_REAL, "Cross-term dependence of ub1"), -IOP( "puc", BSIM3_MOD_PUC, IF_REAL, "Cross-term dependence of uc"), -IOP( "puc1", BSIM3_MOD_PUC1, IF_REAL, "Cross-term dependence of uc1"), -IOP( "pu0", BSIM3_MOD_PU0, IF_REAL, "Cross-term dependence of u0"), -IOP( "pute", BSIM3_MOD_PUTE, IF_REAL, "Cross-term dependence of ute"), -IOP( "pvoff", BSIM3_MOD_PVOFF, IF_REAL, "Cross-term dependence of voff"), -IOP( "pelm", BSIM3_MOD_PELM, IF_REAL, "Cross-term dependence of elm"), -IOP( "pdelta", BSIM3_MOD_PDELTA, IF_REAL, "Cross-term dependence of delta"), -IOP( "prdsw", BSIM3_MOD_PRDSW, IF_REAL, "Cross-term dependence of rdsw "), - -IOP( "pprwg", BSIM3_MOD_PPRWG, IF_REAL, "Cross-term dependence of prwg "), -IOP( "pprwb", BSIM3_MOD_PPRWB, IF_REAL, "Cross-term dependence of prwb "), - -IOP( "pprt", BSIM3_MOD_PPRT, IF_REAL, "Cross-term dependence of prt "), -IOP( "peta0", BSIM3_MOD_PETA0, IF_REAL, "Cross-term dependence of eta0"), -IOP( "petab", BSIM3_MOD_PETAB, IF_REAL, "Cross-term dependence of etab"), -IOP( "ppclm", BSIM3_MOD_PPCLM, IF_REAL, "Cross-term dependence of pclm"), -IOP( "ppdiblc1", BSIM3_MOD_PPDIBL1, IF_REAL, "Cross-term dependence of pdiblc1"), -IOP( "ppdiblc2", BSIM3_MOD_PPDIBL2, IF_REAL, "Cross-term dependence of pdiblc2"), -IOP( "ppdiblcb", BSIM3_MOD_PPDIBLB, IF_REAL, "Cross-term dependence of pdiblcb"), -IOP( "ppscbe1", BSIM3_MOD_PPSCBE1, IF_REAL, "Cross-term dependence of pscbe1"), -IOP( "ppscbe2", BSIM3_MOD_PPSCBE2, IF_REAL, "Cross-term dependence of pscbe2"), -IOP( "ppvag", BSIM3_MOD_PPVAG, IF_REAL, "Cross-term dependence of pvag"), -IOP( "pwr", BSIM3_MOD_PWR, IF_REAL, "Cross-term dependence of wr"), -IOP( "pdwg", BSIM3_MOD_PDWG, IF_REAL, "Cross-term dependence of dwg"), -IOP( "pdwb", BSIM3_MOD_PDWB, IF_REAL, "Cross-term dependence of dwb"), -IOP( "pb0", BSIM3_MOD_PB0, IF_REAL, "Cross-term dependence of b0"), -IOP( "pb1", BSIM3_MOD_PB1, IF_REAL, "Cross-term dependence of b1"), -IOP( "pcgsl", BSIM3_MOD_PCGSL, IF_REAL, "Cross-term dependence of cgsl"), -IOP( "pcgdl", BSIM3_MOD_PCGDL, IF_REAL, "Cross-term dependence of cgdl"), -IOP( "pckappa", BSIM3_MOD_PCKAPPA, IF_REAL, "Cross-term dependence of ckappa"), -IOP( "pcf", BSIM3_MOD_PCF, IF_REAL, "Cross-term dependence of cf"), -IOP( "pclc", BSIM3_MOD_PCLC, IF_REAL, "Cross-term dependence of clc"), -IOP( "pcle", BSIM3_MOD_PCLE, IF_REAL, "Cross-term dependence of cle"), -IOP( "palpha0", BSIM3_MOD_PALPHA0, IF_REAL, "Cross-term dependence of alpha0"), -IOP( "palpha1", BSIM3_MOD_PALPHA1, IF_REAL, "Cross-term dependence of alpha1"), -IOP( "pbeta0", BSIM3_MOD_PBETA0, IF_REAL, "Cross-term dependence of beta0"), -IOP( "pvfbcv", BSIM3_MOD_PVFBCV, IF_REAL, "Cross-term dependence of vfbcv"), -IOP( "pvfb", BSIM3_MOD_PVFB, IF_REAL, "Cross-term dependence of vfb"), -IOP( "pacde", BSIM3_MOD_PACDE, IF_REAL, "Cross-term dependence of acde"), -IOP( "pmoin", BSIM3_MOD_PMOIN, IF_REAL, "Cross-term dependence of moin"), -IOP( "pnoff", BSIM3_MOD_PNOFF, IF_REAL, "Cross-term dependence of noff"), -IOP( "pvoffcv", BSIM3_MOD_PVOFFCV, IF_REAL, "Cross-term dependence of voffcv"), - -IOP( "noia", BSIM3_MOD_NOIA, IF_REAL, "Flicker noise parameter"), -IOP( "noib", BSIM3_MOD_NOIB, IF_REAL, "Flicker noise parameter"), -IOP( "noic", BSIM3_MOD_NOIC, IF_REAL, "Flicker noise parameter"), -IOP( "em", BSIM3_MOD_EM, IF_REAL, "Flicker noise parameter"), -IOP( "ef", BSIM3_MOD_EF, IF_REAL, "Flicker noise frequency exponent"), -IOP( "af", BSIM3_MOD_AF, IF_REAL, "Flicker noise exponent"), -IOP( "kf", BSIM3_MOD_KF, IF_REAL, "Flicker noise coefficient"), - -IOP("vgs_max", BSIM3_MOD_VGS_MAX, IF_REAL, "maximum voltage G-S branch"), -IOP("vgd_max", BSIM3_MOD_VGD_MAX, IF_REAL, "maximum voltage G-D branch"), -IOP("vgb_max", BSIM3_MOD_VGB_MAX, IF_REAL, "maximum voltage G-B branch"), -IOP("vds_max", BSIM3_MOD_VDS_MAX, IF_REAL, "maximum voltage D-S branch"), -IOP("vbs_max", BSIM3_MOD_VBS_MAX, IF_REAL, "maximum voltage B-S branch"), -IOP("vbd_max", BSIM3_MOD_VBD_MAX, IF_REAL, "maximum voltage B-D branch"), -IOP("vgsr_max", BSIM3_MOD_VGSR_MAX, IF_REAL, "maximum voltage G-S branch"), -IOP("vgdr_max", BSIM3_MOD_VGDR_MAX, IF_REAL, "maximum voltage G-D branch"), -IOP("vgbr_max", BSIM3_MOD_VGBR_MAX, IF_REAL, "maximum voltage G-B branch"), -IOP("vbsr_max", BSIM3_MOD_VBSR_MAX, IF_REAL, "maximum voltage B-S branch"), -IOP("vbdr_max", BSIM3_MOD_VBDR_MAX, IF_REAL, "maximum voltage B-D branch"), - -IP( "nmos", BSIM3_MOD_NMOS, IF_FLAG, "Flag to indicate NMOS"), -IP( "pmos", BSIM3_MOD_PMOS, IF_FLAG, "Flag to indicate PMOS"), -}; - -char *BSIM3names[] = { - "Drain", - "Gate", - "Source", - "Bulk", - "Charge" -}; - -int BSIM3nSize = NUMELEMS(BSIM3names); -int BSIM3pTSize = NUMELEMS(BSIM3pTable); -int BSIM3mPTSize = NUMELEMS(BSIM3mPTable); -int BSIM3iSize = sizeof(BSIM3instance); -int BSIM3mSize = sizeof(BSIM3model); diff --git a/src/spicelib/devices/bsim3/b3acld.c b/src/spicelib/devices/bsim3/b3acld.c deleted file mode 100644 index 508ea0c60..000000000 --- a/src/spicelib/devices/bsim3/b3acld.c +++ /dev/null @@ -1,460 +0,0 @@ -/**** BSIM3v3.3.0 beta, Released by Xuemei Xi 07/29/2005 ****/ - -/********** - * Copyright 2004 Regents of the University of California. All rights reserved. - * File: b3acld.c of BSIM3v3.3.0 - * Author: 1995 Min-Chie Jeng and Mansun Chan - * Author: 1997-1999 Weidong Liu. - * Author: 2001 Xuemei Xi - **********/ - -#include "ngspice/ngspice.h" -#include "ngspice/cktdefs.h" -#include "bsim3def.h" -#include "ngspice/sperror.h" -#include "ngspice/suffix.h" - - -int -BSIM3acLoad( -GENmodel *inModel, -CKTcircuit *ckt) -{ -BSIM3model *model = (BSIM3model*)inModel; -BSIM3instance *here; -double xcggb, xcgdb, xcgsb, xcbgb, xcbdb, xcbsb, xcddb, xcssb, xcdgb; -double gdpr, gspr, gds, gbd, gbs, capbd, capbs, xcsgb, xcdsb, xcsdb; -double cggb, cgdb, cgsb, cbgb, cbdb, cbsb, cddb, cdgb, cdsb, omega; -double GSoverlapCap, GDoverlapCap, GBoverlapCap, FwdSum, RevSum, Gm, Gmbs; -double dxpart, sxpart, xgtg, xgtd, xgts, xgtb, xcqgb=0.0, xcqdb=0.0, xcqsb=0.0, xcqbb=0.0; -double gbspsp, gbbdp, gbbsp, gbspg, gbspb; -double gbspdp, gbdpdp, gbdpg, gbdpb, gbdpsp; -double ddxpart_dVd, ddxpart_dVg, ddxpart_dVb, ddxpart_dVs; -double dsxpart_dVd, dsxpart_dVg, dsxpart_dVb, dsxpart_dVs; -double T1, CoxWL, qcheq, Cdg, Cdd, Cds, Csg, Csd, Css; -double ScalingFactor = 1.0e-9; -/* For ACNQSMOD */ -double T0, T2, T3, gmr, gmbsr, gmi, gmbsi, gdsi; -double Cddr, Cdgr, Cdsr, Csdr, Csgr, Cssr, Cgdr, Cggr, Cgsr; -double Cddi, Cdgi, Cdsi, Cdbi, Csdi, Csgi, Cssi, Csbi; -double Cgdi, Cggi, Cgsi, Cgbi, Gmi, Gmbsi, FwdSumi, RevSumi; -double xcdgbi, xcsgbi, xcddbi, xcdsbi, xcsdbi, xcssbi, xcdbbi; -double xcsbbi, xcggbi, xcgdbi, xcgsbi, xcgbbi; -double m; - - omega = ckt->CKTomega; - for (; model != NULL; model = BSIM3nextModel(model)) - { for (here = BSIM3instances(model); here!= NULL; - here = BSIM3nextInstance(here)) - { - Csd = -(here->BSIM3cddb + here->BSIM3cgdb + here->BSIM3cbdb); - Csg = -(here->BSIM3cdgb + here->BSIM3cggb + here->BSIM3cbgb); - Css = -(here->BSIM3cdsb + here->BSIM3cgsb + here->BSIM3cbsb); - - if (here->BSIM3acnqsMod) - { T0 = omega * here->BSIM3taunet; - T1 = T0 * T0; - T2 = 1.0 / (1.0 + T1); - T3 = T0 * T2; - - gmr = here->BSIM3gm * T2; - gmbsr = here->BSIM3gmbs * T2; - gds = here->BSIM3gds * T2; - - gmi = -here->BSIM3gm * T3; - gmbsi = -here->BSIM3gmbs * T3; - gdsi = -here->BSIM3gds * T3; - - Cddr = here->BSIM3cddb * T2; - Cdgr = here->BSIM3cdgb * T2; - Cdsr = here->BSIM3cdsb * T2; - - Cddi = here->BSIM3cddb * T3 * omega; - Cdgi = here->BSIM3cdgb * T3 * omega; - Cdsi = here->BSIM3cdsb * T3 * omega; - Cdbi = -(Cddi + Cdgi + Cdsi); - - Csdr = Csd * T2; - Csgr = Csg * T2; - Cssr = Css * T2; - - Csdi = Csd * T3 * omega; - Csgi = Csg * T3 * omega; - Cssi = Css * T3 * omega; - Csbi = -(Csdi + Csgi + Cssi); - - Cgdr = -(Cddr + Csdr + here->BSIM3cbdb); - Cggr = -(Cdgr + Csgr + here->BSIM3cbgb); - Cgsr = -(Cdsr + Cssr + here->BSIM3cbsb); - - Cgdi = -(Cddi + Csdi); - Cggi = -(Cdgi + Csgi); - Cgsi = -(Cdsi + Cssi); - Cgbi = -(Cgdi + Cggi + Cgsi); - } - else /* QS */ - { gmr = here->BSIM3gm; - gmbsr = here->BSIM3gmbs; - gds = here->BSIM3gds; - gmi = gmbsi = gdsi = 0.0; - - Cddr = here->BSIM3cddb; - Cdgr = here->BSIM3cdgb; - Cdsr = here->BSIM3cdsb; - Cddi = Cdgi = Cdsi = Cdbi = 0.0; - - Csdr = Csd; - Csgr = Csg; - Cssr = Css; - Csdi = Csgi = Cssi = Csbi = 0.0; - - Cgdr = here->BSIM3cgdb; - Cggr = here->BSIM3cggb; - Cgsr = here->BSIM3cgsb; - Cgdi = Cggi = Cgsi = Cgbi = 0.0; - } - - if (here->BSIM3mode >= 0) - { Gm = gmr; - Gmbs = gmbsr; - FwdSum = Gm + Gmbs; - RevSum = 0.0; - Gmi = gmi; - Gmbsi = gmbsi; - FwdSumi = Gmi + Gmbsi; - RevSumi = 0.0; - - gbbdp = -here->BSIM3gbds; - gbbsp = here->BSIM3gbds + here->BSIM3gbgs + here->BSIM3gbbs; - - gbdpg = here->BSIM3gbgs; - gbdpb = here->BSIM3gbbs; - gbdpdp = here->BSIM3gbds; - gbdpsp = -(gbdpg + gbdpb + gbdpdp); - - gbspdp = 0.0; - gbspg = 0.0; - gbspb = 0.0; - gbspsp = 0.0; - - if (here->BSIM3nqsMod == 0 || here->BSIM3acnqsMod == 1) - { cggb = Cggr; - cgsb = Cgsr; - cgdb = Cgdr; - - cbgb = here->BSIM3cbgb; - cbsb = here->BSIM3cbsb; - cbdb = here->BSIM3cbdb; - - cdgb = Cdgr; - cdsb = Cdsr; - cddb = Cddr; - - xgtg = xgtd = xgts = xgtb = 0.0; - sxpart = 0.6; - dxpart = 0.4; - ddxpart_dVd = ddxpart_dVg = ddxpart_dVb - = ddxpart_dVs = 0.0; - dsxpart_dVd = dsxpart_dVg = dsxpart_dVb - = dsxpart_dVs = 0.0; - } - else - { cggb = cgdb = cgsb = 0.0; - cbgb = cbdb = cbsb = 0.0; - cdgb = cddb = cdsb = 0.0; - - xgtg = here->BSIM3gtg; - xgtd = here->BSIM3gtd; - xgts = here->BSIM3gts; - xgtb = here->BSIM3gtb; - - xcqgb = here->BSIM3cqgb * omega; - xcqdb = here->BSIM3cqdb * omega; - xcqsb = here->BSIM3cqsb * omega; - xcqbb = here->BSIM3cqbb * omega; - - CoxWL = model->BSIM3cox * here->pParam->BSIM3weffCV - * here->pParam->BSIM3leffCV; - qcheq = -(here->BSIM3qgate + here->BSIM3qbulk); - if (fabs(qcheq) <= 1.0e-5 * CoxWL) - { if (model->BSIM3xpart < 0.5) - { dxpart = 0.4; - } - else if (model->BSIM3xpart > 0.5) - { dxpart = 0.0; - } - else - { dxpart = 0.5; - } - ddxpart_dVd = ddxpart_dVg = ddxpart_dVb - = ddxpart_dVs = 0.0; - } - else - { dxpart = here->BSIM3qdrn / qcheq; - Cdd = here->BSIM3cddb; - Csd = -(here->BSIM3cgdb + here->BSIM3cddb - + here->BSIM3cbdb); - ddxpart_dVd = (Cdd - dxpart * (Cdd + Csd)) / qcheq; - Cdg = here->BSIM3cdgb; - Csg = -(here->BSIM3cggb + here->BSIM3cdgb - + here->BSIM3cbgb); - ddxpart_dVg = (Cdg - dxpart * (Cdg + Csg)) / qcheq; - - Cds = here->BSIM3cdsb; - Css = -(here->BSIM3cgsb + here->BSIM3cdsb - + here->BSIM3cbsb); - ddxpart_dVs = (Cds - dxpart * (Cds + Css)) / qcheq; - - ddxpart_dVb = -(ddxpart_dVd + ddxpart_dVg - + ddxpart_dVs); - } - sxpart = 1.0 - dxpart; - dsxpart_dVd = -ddxpart_dVd; - dsxpart_dVg = -ddxpart_dVg; - dsxpart_dVs = -ddxpart_dVs; - dsxpart_dVb = -(dsxpart_dVd + dsxpart_dVg + dsxpart_dVs); - } - xcdgbi = Cdgi; - xcsgbi = Csgi; - xcddbi = Cddi; - xcdsbi = Cdsi; - xcsdbi = Csdi; - xcssbi = Cssi; - xcdbbi = Cdbi; - xcsbbi = Csbi; - xcggbi = Cggi; - xcgdbi = Cgdi; - xcgsbi = Cgsi; - xcgbbi = Cgbi; - } - else - { Gm = -gmr; - Gmbs = -gmbsr; - FwdSum = 0.0; - RevSum = -(Gm + Gmbs); - Gmi = -gmi; - Gmbsi = -gmbsi; - FwdSumi = 0.0; - RevSumi = -(Gmi + Gmbsi); - - gbbsp = -here->BSIM3gbds; - gbbdp = here->BSIM3gbds + here->BSIM3gbgs + here->BSIM3gbbs; - - gbdpg = 0.0; - gbdpsp = 0.0; - gbdpb = 0.0; - gbdpdp = 0.0; - - gbspg = here->BSIM3gbgs; - gbspsp = here->BSIM3gbds; - gbspb = here->BSIM3gbbs; - gbspdp = -(gbspg + gbspsp + gbspb); - - if (here->BSIM3nqsMod == 0 || here->BSIM3acnqsMod == 1) - { cggb = Cggr; - cgsb = Cgdr; - cgdb = Cgsr; - - cbgb = here->BSIM3cbgb; - cbsb = here->BSIM3cbdb; - cbdb = here->BSIM3cbsb; - - cdgb = -(Cdgr + cggb + cbgb); - cdsb = -(Cddr + cgsb + cbsb); - cddb = -(Cdsr + cgdb + cbdb); - - xgtg = xgtd = xgts = xgtb = 0.0; - sxpart = 0.4; - dxpart = 0.6; - ddxpart_dVd = ddxpart_dVg = ddxpart_dVb - = ddxpart_dVs = 0.0; - dsxpart_dVd = dsxpart_dVg = dsxpart_dVb - = dsxpart_dVs = 0.0; - } - else - { cggb = cgdb = cgsb = 0.0; - cbgb = cbdb = cbsb = 0.0; - cdgb = cddb = cdsb = 0.0; - - xgtg = here->BSIM3gtg; - xgtd = here->BSIM3gts; - xgts = here->BSIM3gtd; - xgtb = here->BSIM3gtb; - - xcqgb = here->BSIM3cqgb * omega; - xcqdb = here->BSIM3cqsb * omega; - xcqsb = here->BSIM3cqdb * omega; - xcqbb = here->BSIM3cqbb * omega; - - CoxWL = model->BSIM3cox * here->pParam->BSIM3weffCV - * here->pParam->BSIM3leffCV; - qcheq = -(here->BSIM3qgate + here->BSIM3qbulk); - if (fabs(qcheq) <= 1.0e-5 * CoxWL) - { if (model->BSIM3xpart < 0.5) - { sxpart = 0.4; - } - else if (model->BSIM3xpart > 0.5) - { sxpart = 0.0; - } - else - { sxpart = 0.5; - } - dsxpart_dVd = dsxpart_dVg = dsxpart_dVb - = dsxpart_dVs = 0.0; - } - else - { sxpart = here->BSIM3qdrn / qcheq; - Css = here->BSIM3cddb; - Cds = -(here->BSIM3cgdb + here->BSIM3cddb - + here->BSIM3cbdb); - dsxpart_dVs = (Css - sxpart * (Css + Cds)) / qcheq; - Csg = here->BSIM3cdgb; - Cdg = -(here->BSIM3cggb + here->BSIM3cdgb - + here->BSIM3cbgb); - dsxpart_dVg = (Csg - sxpart * (Csg + Cdg)) / qcheq; - - Csd = here->BSIM3cdsb; - Cdd = -(here->BSIM3cgsb + here->BSIM3cdsb - + here->BSIM3cbsb); - dsxpart_dVd = (Csd - sxpart * (Csd + Cdd)) / qcheq; - - dsxpart_dVb = -(dsxpart_dVd + dsxpart_dVg - + dsxpart_dVs); - } - dxpart = 1.0 - sxpart; - ddxpart_dVd = -dsxpart_dVd; - ddxpart_dVg = -dsxpart_dVg; - ddxpart_dVs = -dsxpart_dVs; - ddxpart_dVb = -(ddxpart_dVd + ddxpart_dVg + ddxpart_dVs); - } - xcdgbi = Csgi; - xcsgbi = Cdgi; - xcddbi = Cssi; - xcdsbi = Csdi; - xcsdbi = Cdsi; - xcssbi = Cddi; - xcdbbi = Csbi; - xcsbbi = Cdbi; - xcggbi = Cggi; - xcgdbi = Cgsi; - xcgsbi = Cgdi; - xcgbbi = Cgbi; - } - - T1 = *(ckt->CKTstate0 + here->BSIM3qdef) * here->BSIM3gtau; - gdpr = here->BSIM3drainConductance; - gspr = here->BSIM3sourceConductance; - gbd = here->BSIM3gbd; - gbs = here->BSIM3gbs; - capbd = here->BSIM3capbd; - capbs = here->BSIM3capbs; - - GSoverlapCap = here->BSIM3cgso; - GDoverlapCap = here->BSIM3cgdo; - GBoverlapCap = here->pParam->BSIM3cgbo; - - xcdgb = (cdgb - GDoverlapCap) * omega; - xcddb = (cddb + capbd + GDoverlapCap) * omega; - xcdsb = cdsb * omega; - xcsgb = -(cggb + cbgb + cdgb + GSoverlapCap) * omega; - xcsdb = -(cgdb + cbdb + cddb) * omega; - xcssb = (capbs + GSoverlapCap - (cgsb + cbsb + cdsb)) * omega; - xcggb = (cggb + GDoverlapCap + GSoverlapCap + GBoverlapCap) - * omega; - xcgdb = (cgdb - GDoverlapCap ) * omega; - xcgsb = (cgsb - GSoverlapCap) * omega; - xcbgb = (cbgb - GBoverlapCap) * omega; - xcbdb = (cbdb - capbd ) * omega; - xcbsb = (cbsb - capbs ) * omega; - - m = here->BSIM3m; - - *(here->BSIM3GgPtr +1) += m * xcggb; - *(here->BSIM3BbPtr +1) -= m * (xcbgb + xcbdb + xcbsb); - *(here->BSIM3DPdpPtr +1) += m * (xcddb + gdsi + RevSumi); - *(here->BSIM3SPspPtr +1) += m * (xcssb + gdsi + FwdSumi); - *(here->BSIM3GbPtr +1) -= m * (xcggb + xcgdb + xcgsb); - *(here->BSIM3GdpPtr +1) += m * xcgdb; - *(here->BSIM3GspPtr +1) += m * xcgsb; - *(here->BSIM3BgPtr +1) += m * xcbgb; - *(here->BSIM3BdpPtr +1) += m * xcbdb; - *(here->BSIM3BspPtr +1) += m * xcbsb; - *(here->BSIM3DPgPtr +1) += m * (xcdgb + Gmi); - *(here->BSIM3DPbPtr +1) -= m * (xcdgb + xcddb + xcdsb + Gmbsi); - *(here->BSIM3DPspPtr +1) += m * (xcdsb - gdsi - FwdSumi); - *(here->BSIM3SPgPtr +1) += m * (xcsgb - Gmi); - *(here->BSIM3SPbPtr +1) -= m * (xcsgb + xcsdb + xcssb - Gmbsi); - *(here->BSIM3SPdpPtr +1) += m * (xcsdb - gdsi - RevSumi); - - *(here->BSIM3DdPtr) += m * gdpr; - *(here->BSIM3SsPtr) += m * gspr; - *(here->BSIM3BbPtr) += m * (gbd + gbs - here->BSIM3gbbs); - *(here->BSIM3DPdpPtr) += m * (gdpr + gds + gbd + RevSum + xcddbi - + dxpart * xgtd + T1 * ddxpart_dVd + gbdpdp); - *(here->BSIM3SPspPtr) += m * (gspr + gds + gbs + FwdSum + xcssbi - + sxpart * xgts + T1 * dsxpart_dVs + gbspsp); - - *(here->BSIM3DdpPtr) -= m * gdpr; - *(here->BSIM3SspPtr) -= m * gspr; - - *(here->BSIM3BgPtr) -= m * here->BSIM3gbgs; - *(here->BSIM3BdpPtr) -= m * (gbd - gbbdp); - *(here->BSIM3BspPtr) -= m * (gbs - gbbsp); - - *(here->BSIM3DPdPtr) -= m * gdpr; - *(here->BSIM3DPgPtr) += m * (Gm + dxpart * xgtg + T1 * ddxpart_dVg - + gbdpg + xcdgbi); - *(here->BSIM3DPbPtr) -= m * (gbd - Gmbs - dxpart * xgtb - - T1 * ddxpart_dVb - gbdpb - xcdbbi); - *(here->BSIM3DPspPtr) -= m * (gds + FwdSum - dxpart * xgts - - T1 * ddxpart_dVs - gbdpsp - xcdsbi); - - *(here->BSIM3SPgPtr) -= m * (Gm - sxpart * xgtg - T1 * dsxpart_dVg - - gbspg - xcsgbi); - *(here->BSIM3SPsPtr) -= m * gspr; - *(here->BSIM3SPbPtr) -= m * (gbs + Gmbs - sxpart * xgtb - - T1 * dsxpart_dVb - gbspb - xcsbbi); - *(here->BSIM3SPdpPtr) -= m * (gds + RevSum - sxpart * xgtd - - T1 * dsxpart_dVd - gbspdp - xcsdbi); - - *(here->BSIM3GgPtr) -= m * (xgtg - xcggbi); - *(here->BSIM3GbPtr) -= m * (xgtb - xcgbbi); - *(here->BSIM3GdpPtr) -= m * (xgtd - xcgdbi); - *(here->BSIM3GspPtr) -= m * (xgts - xcgsbi); - - if (here->BSIM3nqsMod) - { if (here->BSIM3acnqsMod) - { (*(here->BSIM3QqPtr) += m * 1.0); - (*(here->BSIM3QgPtr) += 0.0); - (*(here->BSIM3QdpPtr) += 0.0); - (*(here->BSIM3QspPtr) += 0.0); - (*(here->BSIM3QbPtr) += 0.0); - - (*(here->BSIM3DPqPtr) += 0.0); - (*(here->BSIM3SPqPtr) += 0.0); - (*(here->BSIM3GqPtr) += 0.0); - - } else { - *(here->BSIM3QqPtr +1) += m * omega * ScalingFactor; - *(here->BSIM3QgPtr +1) -= m * xcqgb; - *(here->BSIM3QdpPtr +1) -= m * xcqdb; - *(here->BSIM3QspPtr +1) -= m * xcqsb; - *(here->BSIM3QbPtr +1) -= m * xcqbb; - - *(here->BSIM3QqPtr) += m * here->BSIM3gtau; - - *(here->BSIM3DPqPtr) += m * dxpart * here->BSIM3gtau; - *(here->BSIM3SPqPtr) += m * sxpart * here->BSIM3gtau; - *(here->BSIM3GqPtr) -= m * here->BSIM3gtau; - - *(here->BSIM3QgPtr) += m * xgtg; - *(here->BSIM3QdpPtr) += m * xgtd; - *(here->BSIM3QspPtr) += m * xgts; - *(here->BSIM3QbPtr) += m * xgtb; - } - } - } - } - return(OK); -} - diff --git a/src/spicelib/devices/bsim3/b3ask.c b/src/spicelib/devices/bsim3/b3ask.c deleted file mode 100644 index 21c1775b6..000000000 --- a/src/spicelib/devices/bsim3/b3ask.c +++ /dev/null @@ -1,243 +0,0 @@ -/**** BSIM3v3.3.0, Released by Xuemei Xi 07/29/2005 ****/ - -/********** - * Copyright 2004 Regents of the University of California. All rights reserved. - * File: b3ask.c of BSIM3v3.3.0 - * Author: 1995 Min-Chie Jeng and Mansun Chan - * Author: 1997-1999 Weidong Liu. - * Author: 2001 Xuemei Xi - **********/ - -#include "ngspice/ngspice.h" -#include "ngspice/ifsim.h" -#include "ngspice/cktdefs.h" -#include "ngspice/devdefs.h" -#include "bsim3def.h" -#include "ngspice/sperror.h" -#include "ngspice/suffix.h" - -int -BSIM3ask( -CKTcircuit *ckt, -GENinstance *inst, -int which, -IFvalue *value, -IFvalue *select) -{ -BSIM3instance *here = (BSIM3instance*)inst; - - NG_IGNORE(select); - - switch(which) - { case BSIM3_L: - value->rValue = here->BSIM3l; - return(OK); - case BSIM3_W: - value->rValue = here->BSIM3w; - return(OK); - case BSIM3_M: - value->rValue = here->BSIM3m; - return(OK); - case BSIM3_AS: - value->rValue = here->BSIM3sourceArea; - return(OK); - case BSIM3_AD: - value->rValue = here->BSIM3drainArea; - return(OK); - case BSIM3_PS: - value->rValue = here->BSIM3sourcePerimeter; - return(OK); - case BSIM3_PD: - value->rValue = here->BSIM3drainPerimeter; - return(OK); - case BSIM3_NRS: - value->rValue = here->BSIM3sourceSquares; - return(OK); - case BSIM3_NRD: - value->rValue = here->BSIM3drainSquares; - return(OK); - case BSIM3_OFF: - value->rValue = here->BSIM3off; - return(OK); - case BSIM3_NQSMOD: - value->iValue = here->BSIM3nqsMod; - return(OK); - case BSIM3_ACNQSMOD: - value->iValue = here->BSIM3acnqsMod; - return(OK); - case BSIM3_GEO: - value->iValue = here->BSIM3geo; - return(OK); - case BSIM3_DELVTO: - value->rValue = here->BSIM3delvto; - return(OK); - case BSIM3_MULU0: - value->rValue = here->BSIM3mulu0; - return(OK); - case BSIM3_IC_VBS: - value->rValue = here->BSIM3icVBS; - return(OK); - case BSIM3_IC_VDS: - value->rValue = here->BSIM3icVDS; - return(OK); - case BSIM3_IC_VGS: - value->rValue = here->BSIM3icVGS; - return(OK); - case BSIM3_DNODE: - value->iValue = here->BSIM3dNode; - return(OK); - case BSIM3_GNODE: - value->iValue = here->BSIM3gNode; - return(OK); - case BSIM3_SNODE: - value->iValue = here->BSIM3sNode; - return(OK); - case BSIM3_BNODE: - value->iValue = here->BSIM3bNode; - return(OK); - case BSIM3_DNODEPRIME: - value->iValue = here->BSIM3dNodePrime; - return(OK); - case BSIM3_SNODEPRIME: - value->iValue = here->BSIM3sNodePrime; - return(OK); - case BSIM3_SOURCECONDUCT: - value->rValue = here->BSIM3sourceConductance; - value->rValue *= here->BSIM3m; - return(OK); - case BSIM3_DRAINCONDUCT: - value->rValue = here->BSIM3drainConductance; - value->rValue *= here->BSIM3m; - return(OK); - case BSIM3_VBD: - value->rValue = *(ckt->CKTstate0 + here->BSIM3vbd); - return(OK); - case BSIM3_VBS: - value->rValue = *(ckt->CKTstate0 + here->BSIM3vbs); - return(OK); - case BSIM3_VGS: - value->rValue = *(ckt->CKTstate0 + here->BSIM3vgs); - return(OK); - case BSIM3_VDS: - value->rValue = *(ckt->CKTstate0 + here->BSIM3vds); - return(OK); - case BSIM3_CD: - value->rValue = here->BSIM3cd; - value->rValue *= here->BSIM3m; - return(OK); - case BSIM3_CBS: - value->rValue = here->BSIM3cbs; - value->rValue *= here->BSIM3m; - return(OK); - case BSIM3_CBD: - value->rValue = here->BSIM3cbd; - value->rValue *= here->BSIM3m; - return(OK); - case BSIM3_GM: - value->rValue = here->BSIM3gm; - value->rValue *= here->BSIM3m; - return(OK); - case BSIM3_GDS: - value->rValue = here->BSIM3gds; - value->rValue *= here->BSIM3m; - return(OK); - case BSIM3_GMBS: - value->rValue = here->BSIM3gmbs; - value->rValue *= here->BSIM3m; - return(OK); - case BSIM3_GBD: - value->rValue = here->BSIM3gbd; - value->rValue *= here->BSIM3m; - return(OK); - case BSIM3_GBS: - value->rValue = here->BSIM3gbs; - value->rValue *= here->BSIM3m; - return(OK); - case BSIM3_QB: - value->rValue = *(ckt->CKTstate0 + here->BSIM3qb); - value->rValue *= here->BSIM3m; - return(OK); - case BSIM3_CQB: - value->rValue = *(ckt->CKTstate0 + here->BSIM3cqb); - value->rValue *= here->BSIM3m; - return(OK); - case BSIM3_QG: - value->rValue = *(ckt->CKTstate0 + here->BSIM3qg); - value->rValue *= here->BSIM3m; - return(OK); - case BSIM3_CQG: - value->rValue = *(ckt->CKTstate0 + here->BSIM3cqg); - value->rValue *= here->BSIM3m; - return(OK); - case BSIM3_QD: - value->rValue = *(ckt->CKTstate0 + here->BSIM3qd); - value->rValue *= here->BSIM3m; - return(OK); - case BSIM3_CQD: - value->rValue = *(ckt->CKTstate0 + here->BSIM3cqd); - value->rValue *= here->BSIM3m; - return(OK); - case BSIM3_CGG: - value->rValue = here->BSIM3cggb; - value->rValue *= here->BSIM3m; - return(OK); - case BSIM3_CGD: - value->rValue = here->BSIM3cgdb; - value->rValue *= here->BSIM3m; - return(OK); - case BSIM3_CGS: - value->rValue = here->BSIM3cgsb; - value->rValue *= here->BSIM3m; - return(OK); - case BSIM3_CDG: - value->rValue = here->BSIM3cdgb; - value->rValue *= here->BSIM3m; - return(OK); - case BSIM3_CDD: - value->rValue = here->BSIM3cddb; - value->rValue *= here->BSIM3m; - return(OK); - case BSIM3_CDS: - value->rValue = here->BSIM3cdsb; - value->rValue *= here->BSIM3m; - return(OK); - case BSIM3_CBG: - value->rValue = here->BSIM3cbgb; - value->rValue *= here->BSIM3m; - return(OK); - case BSIM3_CBDB: - value->rValue = here->BSIM3cbdb; - value->rValue *= here->BSIM3m; - return(OK); - case BSIM3_CBSB: - value->rValue = here->BSIM3cbsb; - value->rValue *= here->BSIM3m; - return(OK); - case BSIM3_CAPBD: - value->rValue = here->BSIM3capbd; - value->rValue *= here->BSIM3m; - return(OK); - case BSIM3_CAPBS: - value->rValue = here->BSIM3capbs; - value->rValue *= here->BSIM3m; - return(OK); - case BSIM3_VON: - value->rValue = here->BSIM3von; - return(OK); - case BSIM3_VDSAT: - value->rValue = here->BSIM3vdsat; - return(OK); - case BSIM3_QBS: - value->rValue = *(ckt->CKTstate0 + here->BSIM3qbs); - value->rValue *= here->BSIM3m; - return(OK); - case BSIM3_QBD: - value->rValue = *(ckt->CKTstate0 + here->BSIM3qbd); - value->rValue *= here->BSIM3m; - return(OK); - default: - return(E_BADPARM); - } - /* NOTREACHED */ -} - diff --git a/src/spicelib/devices/bsim3/b3check.c b/src/spicelib/devices/bsim3/b3check.c deleted file mode 100644 index 2c8e9ced2..000000000 --- a/src/spicelib/devices/bsim3/b3check.c +++ /dev/null @@ -1,396 +0,0 @@ -/**** BSIM3v3.3.0, Released by Xuemei Xi 07/29/2005 ****/ - -/********** - * Copyright 2004 Regents of the University of California. All rights reserved. - * File: b3check.c of BSIM3v3.3.0 - * Author: 1995 Min-Chie Jeng - * Author: 1997-1999 Weidong Liu. - * Author: 2001 Xuemei Xi. - * Modified by Xuemei Xi, 10/05, 12/14, 2001. - * Modified by Xuemei Xi, 07/29/2005. - * Modified by Dietmar Warning, 12/21/2020. - **********/ - -#include "ngspice/ngspice.h" -#include "ngspice/cktdefs.h" -#include "bsim3def.h" -#include "ngspice/trandefs.h" -#include "ngspice/const.h" -#include "ngspice/sperror.h" -#include "ngspice/devdefs.h" -#include "ngspice/suffix.h" -#include "ngspice/wordlist.h" -#include "ngspice/cpextern.h" - -/* Check for correctness of the BSIM3.3 parameters: - If parameter excursions are found, put the warning or error message into a wordlist. - Only then open a file b3v33check.log and print the data into the file. */ - -int -BSIM3checkModel (BSIM3model *model, BSIM3instance *here, CKTcircuit *ckt) -{ - struct bsim3SizeDependParam *pParam; - int Fatal_Flag = 0; - FILE *fplog; - wordlist* wl, *wlstart; - - NG_IGNORE(ckt); - - pParam = here->pParam; - - if (cp_getvar("ng_nomodcheck", CP_BOOL, NULL, 0)) - return(0); - - wl = wlstart = TMALLOC(wordlist, 1); - wl->wl_prev = NULL; - wl->wl_next = NULL; - wl->wl_word = tprintf("\nChecking parameters for BSIM 3.3 model %s\n", model->BSIM3modName); - - if ((strncmp(model->BSIM3version, "3.3.0", 5)) && (strncmp(model->BSIM3version, "3.30", 4)) && (strncmp(model->BSIM3version, "3.3", 3))) - { - printf("Warning: This model is BSIM3v3.3.0; you specified a wrong version number.\n"); - wl_append_word(&wl, &wl, tprintf("Warning: This model is BSIM3v3.3.0; you specified a wrong version number.\n")); - } - - if (pParam->BSIM3nlx < -pParam->BSIM3leff) - { wl_append_word(&wl, &wl, tprintf("Fatal: Nlx = %g is less than -Leff.\n", - pParam->BSIM3nlx)); - Fatal_Flag = 1; - } - - if (model->BSIM3tox <= 0.0) - { wl_append_word(&wl, &wl, tprintf("Fatal: Tox = %g is not positive.\n", - model->BSIM3tox)); - Fatal_Flag = 1; - } - - if (model->BSIM3toxm <= 0.0) - { wl_append_word(&wl, &wl, tprintf("Fatal: Toxm = %g is not positive.\n", - model->BSIM3toxm)); - Fatal_Flag = 1; - } - - if (model->BSIM3lintnoi > pParam->BSIM3leff/2) - { wl_append_word(&wl, &wl, tprintf("Fatal: Lintnoi = %g is too large - Leff for noise is negative.\n", - model->BSIM3lintnoi)); - Fatal_Flag = 1; - } - - if (pParam->BSIM3npeak <= 0.0) - { wl_append_word(&wl, &wl, tprintf("Fatal: Nch = %g is not positive.\n", - pParam->BSIM3npeak)); - Fatal_Flag = 1; - } - if (pParam->BSIM3nsub <= 0.0) - { wl_append_word(&wl, &wl, tprintf("Fatal: Nsub = %g is not positive.\n", - pParam->BSIM3nsub)); - Fatal_Flag = 1; - } - if (pParam->BSIM3ngate < 0.0) - { wl_append_word(&wl, &wl, tprintf("Fatal: Ngate = %g is not positive.\n", - pParam->BSIM3ngate)); - Fatal_Flag = 1; - } - if (pParam->BSIM3ngate > 1.e25) - { wl_append_word(&wl, &wl, tprintf("Fatal: Ngate = %g is too high.\n", - pParam->BSIM3ngate)); - Fatal_Flag = 1; - } - if (pParam->BSIM3xj <= 0.0) - { wl_append_word(&wl, &wl, tprintf("Fatal: Xj = %g is not positive.\n", - pParam->BSIM3xj)); - Fatal_Flag = 1; - } - - if (pParam->BSIM3dvt1 < 0.0) - { wl_append_word(&wl, &wl, tprintf("Fatal: Dvt1 = %g is negative.\n", - pParam->BSIM3dvt1)); - Fatal_Flag = 1; - } - - if (pParam->BSIM3dvt1w < 0.0) - { wl_append_word(&wl, &wl, tprintf("Fatal: Dvt1w = %g is negative.\n", - pParam->BSIM3dvt1w)); - Fatal_Flag = 1; - } - - if (pParam->BSIM3w0 == -pParam->BSIM3weff) - { wl_append_word(&wl, &wl, tprintf("Fatal: (W0 + Weff) = 0 causing divided-by-zero.\n")); - Fatal_Flag = 1; - } - - if (pParam->BSIM3dsub < 0.0) - { wl_append_word(&wl, &wl, tprintf("Fatal: Dsub = %g is negative.\n", pParam->BSIM3dsub)); - Fatal_Flag = 1; - } - if (pParam->BSIM3b1 == -pParam->BSIM3weff) - { wl_append_word(&wl, &wl, tprintf("Fatal: (B1 + Weff) = 0 causing divided-by-zero.\n")); - Fatal_Flag = 1; - } - if (pParam->BSIM3u0temp <= 0.0) - { wl_append_word(&wl, &wl, tprintf("Fatal: u0 at current temperature = %g is not positive.\n", pParam->BSIM3u0temp)); - Fatal_Flag = 1; - } - -/* Check delta parameter */ - if (pParam->BSIM3delta < 0.0) - { wl_append_word(&wl, &wl, tprintf("Fatal: Delta = %g is less than zero.\n", - pParam->BSIM3delta)); - Fatal_Flag = 1; - } - - if (pParam->BSIM3vsattemp <= 0.0) - { wl_append_word(&wl, &wl, tprintf("Fatal: Vsat at current temperature = %g is not positive.\n", pParam->BSIM3vsattemp)); - Fatal_Flag = 1; - } -/* Check Rout parameters */ - if (pParam->BSIM3pclm <= 0.0) - { wl_append_word(&wl, &wl, tprintf("Fatal: Pclm = %g is not positive.\n", pParam->BSIM3pclm)); - Fatal_Flag = 1; - } - - if (pParam->BSIM3drout < 0.0) - { wl_append_word(&wl, &wl, tprintf("Fatal: Drout = %g is negative.\n", pParam->BSIM3drout)); - Fatal_Flag = 1; - } - - if (pParam->BSIM3pscbe2 <= 0.0) - { wl_append_word(&wl, &wl, tprintf("Warning: Pscbe2 = %g is not positive.\n", - pParam->BSIM3pscbe2)); - } - - /* ACM model */ - if (model->BSIM3acmMod == 0) { - if (model->BSIM3unitLengthSidewallJctCap > 0.0 || - model->BSIM3unitLengthGateSidewallJctCap > 0.0) - { - if (here->BSIM3drainPerimeter < pParam->BSIM3weff) - { wl_append_word(&wl, &wl, tprintf("Warning: Pd = %g is less than W.\n", - here->BSIM3drainPerimeter)); - } - if (here->BSIM3sourcePerimeter < pParam->BSIM3weff) - { wl_append_word(&wl, &wl, tprintf("Warning: Ps = %g is less than W.\n", - here->BSIM3sourcePerimeter)); - } - } - } - - if ((model->BSIM3calcacm > 0) && (model->BSIM3acmMod != 12)) - { wl_append_word(&wl, &wl, tprintf("Warning: CALCACM = %d is wrong. Set back to 0.\n", - model->BSIM3calcacm)); - model->BSIM3calcacm = 0; - } - - if (pParam->BSIM3noff < 0.1) - { wl_append_word(&wl, &wl, tprintf("Warning: Noff = %g is too small.\n", - pParam->BSIM3noff)); - } - if (pParam->BSIM3noff > 4.0) - { wl_append_word(&wl, &wl, tprintf("Warning: Noff = %g is too large.\n", - pParam->BSIM3noff)); - } - - if (pParam->BSIM3voffcv < -0.5) - { wl_append_word(&wl, &wl, tprintf("Warning: Voffcv = %g is too small.\n", - pParam->BSIM3voffcv)); - } - if (pParam->BSIM3voffcv > 0.5) - { wl_append_word(&wl, &wl, tprintf("Warning: Voffcv = %g is too large.\n", - pParam->BSIM3voffcv)); - } - - if (model->BSIM3ijth < 0.0) - { wl_append_word(&wl, &wl, tprintf("Fatal: Ijth = %g cannot be negative.\n", - model->BSIM3ijth)); - Fatal_Flag = 1; - } - -/* Check capacitance parameters */ - if (pParam->BSIM3clc < 0.0) - { wl_append_word(&wl, &wl, tprintf("Fatal: Clc = %g is negative.\n", pParam->BSIM3clc)); - Fatal_Flag = 1; - } - - if (pParam->BSIM3moin < 5.0) - { wl_append_word(&wl, &wl, tprintf("Warning: Moin = %g is too small.\n", - pParam->BSIM3moin)); - } - if (pParam->BSIM3moin > 25.0) - { wl_append_word(&wl, &wl, tprintf("Warning: Moin = %g is too large.\n", - pParam->BSIM3moin)); - } - - if(model->BSIM3capMod ==3) { - if (pParam->BSIM3acde < 0.4) - { wl_append_word(&wl, &wl, tprintf("Warning: Acde = %g is too small.\n", - pParam->BSIM3acde)); - } - if (pParam->BSIM3acde > 1.6) - { wl_append_word(&wl, &wl, tprintf("Warning: Acde = %g is too large.\n", - pParam->BSIM3acde)); - } - } - - if (model->BSIM3paramChk ==1) - { - /* Check L and W parameters */ - if (pParam->BSIM3leff <= 5.0e-8) - { wl_append_word(&wl, &wl, tprintf("Warning: Leff = %g may be too small.\n", - pParam->BSIM3leff)); - } - - if (pParam->BSIM3leffCV <= 5.0e-8) - { wl_append_word(&wl, &wl, tprintf("Warning: Leff for CV = %g may be too small.\n", - pParam->BSIM3leffCV)); - } - - if (pParam->BSIM3weff <= 1.0e-7) - { wl_append_word(&wl, &wl, tprintf("Warning: Weff = %g may be too small.\n", - pParam->BSIM3weff)); - } - - if (pParam->BSIM3weffCV <= 1.0e-7) - { wl_append_word(&wl, &wl, tprintf("Warning: Weff for CV = %g may be too small.\n", - pParam->BSIM3weffCV)); - } - - /* Check threshold voltage parameters */ - if (pParam->BSIM3nlx < 0.0) - { wl_append_word(&wl, &wl, tprintf("Warning: Nlx = %g is negative.\n", pParam->BSIM3nlx)); - } - if (model->BSIM3tox < 1.0e-9) - { wl_append_word(&wl, &wl, tprintf("Warning: Tox = %g is less than 10A.\n", - model->BSIM3tox)); - } - - if (pParam->BSIM3npeak <= 1.0e15) - { wl_append_word(&wl, &wl, tprintf("Warning: Nch = %g may be too small.\n", - pParam->BSIM3npeak)); - } - else if (pParam->BSIM3npeak >= 1.0e21) - { wl_append_word(&wl, &wl, tprintf("Warning: Nch = %g may be too large.\n", - pParam->BSIM3npeak)); - } - - if (pParam->BSIM3nsub <= 1.0e14) - { wl_append_word(&wl, &wl, tprintf("Warning: Nsub = %g may be too small.\n", - pParam->BSIM3nsub)); - } - else if (pParam->BSIM3nsub >= 1.0e21) - { wl_append_word(&wl, &wl, tprintf("Warning: Nsub = %g may be too large.\n", - pParam->BSIM3nsub)); - } - - if ((pParam->BSIM3ngate > 0.0) && - (pParam->BSIM3ngate <= 1.e18)) - { wl_append_word(&wl, &wl, tprintf("Warning: Ngate = %g is less than 1.E18cm^-3.\n", - pParam->BSIM3ngate)); - } - - if (pParam->BSIM3dvt0 < 0.0) - { wl_append_word(&wl, &wl, tprintf("Warning: Dvt0 = %g is negative.\n", - pParam->BSIM3dvt0)); - } - - if (fabs(1.0e-6 / (pParam->BSIM3w0 + pParam->BSIM3weff)) > 10.0) - { wl_append_word(&wl, &wl, tprintf("Warning: (W0 + Weff) may be too small.\n")); - } - - /* Check subthreshold parameters */ - if (pParam->BSIM3nfactor < 0.0) - { wl_append_word(&wl, &wl, tprintf("Warning: Nfactor = %g is negative.\n", - pParam->BSIM3nfactor)); - } - if (pParam->BSIM3cdsc < 0.0) - { wl_append_word(&wl, &wl, tprintf("Warning: Cdsc = %g is negative.\n", - pParam->BSIM3cdsc)); - } - if (pParam->BSIM3cdscd < 0.0) - { wl_append_word(&wl, &wl, tprintf("Warning: Cdscd = %g is negative.\n", - pParam->BSIM3cdscd)); - } - /* Check DIBL parameters */ - if (pParam->BSIM3eta0 < 0.0) - { wl_append_word(&wl, &wl, tprintf("Warning: Eta0 = %g is negative.\n", - pParam->BSIM3eta0)); - } - - /* Check Abulk parameters */ - if (fabs(1.0e-6 / (pParam->BSIM3b1 + pParam->BSIM3weff)) > 10.0) - { wl_append_word(&wl, &wl, tprintf("Warning: (B1 + Weff) may be too small.\n")); - } - - /* Check Saturation parameters */ - if (pParam->BSIM3a2 < 0.01) - { wl_append_word(&wl, &wl, tprintf("Warning: A2 = %g is too small. Set to 0.01.\n", pParam->BSIM3a2)); - pParam->BSIM3a2 = 0.01; - } - else if (pParam->BSIM3a2 > 1.0) - { wl_append_word(&wl, &wl, tprintf("Warning: A2 = %g is larger than 1. A2 is set to 1 and A1 is set to 0.\n", - pParam->BSIM3a2)); - pParam->BSIM3a2 = 1.0; - pParam->BSIM3a1 = 0.0; - - } - - if (pParam->BSIM3rdsw < 0.0) - { wl_append_word(&wl, &wl, tprintf("Warning: Rdsw = %g is negative. Set to zero.\n", - pParam->BSIM3rdsw)); - pParam->BSIM3rdsw = 0.0; - pParam->BSIM3rds0 = 0.0; - } - else if ((pParam->BSIM3rds0 > 0.0) && (pParam->BSIM3rds0 < 0.001)) - { wl_append_word(&wl, &wl, tprintf("Warning: Rds at current temperature = %g is less than 0.001 ohm. Set to zero.\n", - pParam->BSIM3rds0)); - pParam->BSIM3rds0 = 0.0; - } - if (pParam->BSIM3vsattemp < 1.0e3) - { wl_append_word(&wl, &wl, tprintf("Warning: Vsat at current temperature = %g may be too small.\n", pParam->BSIM3vsattemp)); - } - - if (pParam->BSIM3pdibl1 < 0.0) - { wl_append_word(&wl, &wl, tprintf("Warning: Pdibl1 = %g is negative.\n", - pParam->BSIM3pdibl1)); - } - if (pParam->BSIM3pdibl2 < 0.0) - { wl_append_word(&wl, &wl, tprintf("Warning: Pdibl2 = %g is negative.\n", - pParam->BSIM3pdibl2)); - } - /* Check overlap capacitance parameters */ - if (model->BSIM3cgdo < 0.0) - { wl_append_word(&wl, &wl, tprintf("Warning: cgdo = %g is negative. Set to zero.\n", model->BSIM3cgdo)); - model->BSIM3cgdo = 0.0; - } - if (model->BSIM3cgso < 0.0) - { wl_append_word(&wl, &wl, tprintf("Warning: cgso = %g is negative. Set to zero.\n", model->BSIM3cgso)); - model->BSIM3cgso = 0.0; - } - if (model->BSIM3cgbo < 0.0) - { wl_append_word(&wl, &wl, tprintf("Warning: cgbo = %g is negative. Set to zero.\n", model->BSIM3cgbo)); - model->BSIM3cgbo = 0.0; - } - - } - - if (wlstart->wl_next) { - if ((fplog = fopen("b3v33check.log", "w")) != NULL) { - while (wlstart) { - fprintf(fplog, "%s", wlstart->wl_word); - fprintf(stderr, "%s", wlstart->wl_word); - wlstart = wlstart->wl_next; - } - fclose(fplog); - } - else { - while (wlstart) { - fprintf(stderr, "%s", wlstart->wl_word); - wlstart = wlstart->wl_next; - } - } - } - - wl_free(wlstart); - - return(Fatal_Flag); -} - diff --git a/src/spicelib/devices/bsim3/b3cvtest.c b/src/spicelib/devices/bsim3/b3cvtest.c deleted file mode 100644 index d8bab342e..000000000 --- a/src/spicelib/devices/bsim3/b3cvtest.c +++ /dev/null @@ -1,107 +0,0 @@ -/**** BSIM3v3.3.0, Released by Xuemei Xi 07/29/2005 ****/ - -/********** - * Copyright 2004 Regents of the University of California. All rights reserved. - * File: b3cvtest.c of BSIM3v3.3.0 - * Author: 1995 Min-Chie Jeng and Mansun Chan - * Author: 1997-1999 Weidong Liu. - * Author: 2001 Xuemei Xi - **********/ - -#include "ngspice/ngspice.h" -#include "ngspice/cktdefs.h" -#include "bsim3def.h" -#include "ngspice/trandefs.h" -#include "ngspice/const.h" -#include "ngspice/devdefs.h" -#include "ngspice/sperror.h" -#include "ngspice/suffix.h" - - -int -BSIM3convTest( -GENmodel *inModel, -CKTcircuit *ckt) -{ -BSIM3model *model = (BSIM3model*)inModel; -BSIM3instance *here; -double delvbd, delvbs, delvds, delvgd, delvgs, vbd, vbs, vds; -double cbd, cbhat, cbs, cd, cdhat, tol, vgd, vgdo, vgs; - - /* loop through all the BSIM3 device models */ - for (; model != NULL; model = BSIM3nextModel(model)) - { /* loop through all the instances of the model */ - for (here = BSIM3instances(model); here != NULL ; - here=BSIM3nextInstance(here)) - { - vbs = model->BSIM3type - * (*(ckt->CKTrhsOld+here->BSIM3bNode) - - *(ckt->CKTrhsOld+here->BSIM3sNodePrime)); - vgs = model->BSIM3type - * (*(ckt->CKTrhsOld+here->BSIM3gNode) - - *(ckt->CKTrhsOld+here->BSIM3sNodePrime)); - vds = model->BSIM3type - * (*(ckt->CKTrhsOld+here->BSIM3dNodePrime) - - *(ckt->CKTrhsOld+here->BSIM3sNodePrime)); - vbd = vbs - vds; - vgd = vgs - vds; - vgdo = *(ckt->CKTstate0 + here->BSIM3vgs) - - *(ckt->CKTstate0 + here->BSIM3vds); - delvbs = vbs - *(ckt->CKTstate0 + here->BSIM3vbs); - delvbd = vbd - *(ckt->CKTstate0 + here->BSIM3vbd); - delvgs = vgs - *(ckt->CKTstate0 + here->BSIM3vgs); - delvds = vds - *(ckt->CKTstate0 + here->BSIM3vds); - delvgd = vgd-vgdo; - - cd = here->BSIM3cd - here->BSIM3cbd; - if (here->BSIM3mode >= 0) - { cd += here->BSIM3csub; - cdhat = cd - here->BSIM3gbd * delvbd - + (here->BSIM3gmbs + here->BSIM3gbbs) * delvbs - + (here->BSIM3gm + here->BSIM3gbgs) * delvgs - + (here->BSIM3gds + here->BSIM3gbds) * delvds; - } - else - { cdhat = cd + (here->BSIM3gmbs - here->BSIM3gbd) * delvbd - + here->BSIM3gm * delvgd - here->BSIM3gds * delvds; - } - - /* - * check convergence - */ - if ((here->BSIM3off == 0) || (!(ckt->CKTmode & MODEINITFIX))) - { tol = ckt->CKTreltol * MAX(fabs(cdhat), fabs(cd)) - + ckt->CKTabstol; - if (fabs(cdhat - cd) >= tol) - { ckt->CKTnoncon++; - return(OK); - } - cbs = here->BSIM3cbs; - cbd = here->BSIM3cbd; - if (here->BSIM3mode >= 0) - { cbhat = cbs + cbd - here->BSIM3csub - + here->BSIM3gbd * delvbd - + (here->BSIM3gbs - here->BSIM3gbbs) * delvbs - - here->BSIM3gbgs * delvgs - - here->BSIM3gbds * delvds; - } - else - { cbhat = cbs + cbd - here->BSIM3csub - + here->BSIM3gbs * delvbs - + (here->BSIM3gbd - here->BSIM3gbbs) * delvbd - - here->BSIM3gbgs * delvgd - + here->BSIM3gbds * delvds; - } - tol = ckt->CKTreltol * MAX(fabs(cbhat), - fabs(cbs + cbd - here->BSIM3csub)) + ckt->CKTabstol; - if (fabs(cbhat - (cbs + cbd - here->BSIM3csub)) > tol) - { ckt->CKTnoncon++; - return(OK); - } - } - } - } - return(OK); -} - - diff --git a/src/spicelib/devices/bsim3/b3getic.c b/src/spicelib/devices/bsim3/b3getic.c deleted file mode 100644 index 00467f176..000000000 --- a/src/spicelib/devices/bsim3/b3getic.c +++ /dev/null @@ -1,44 +0,0 @@ -/**** BSIM3v3.3.0, Released by Xuemei Xi 07/29/2005 ****/ - -/********** - * Copyright 2004 Regents of the University of California. All rights reserved. - * File: b3getic.c of BSIM3v3.3.0 - * Author: 1995 Min-Chie Jeng and Mansun Chan. - * Author: 1997-1999 Weidong Liu. - * Author: 2001 Xuemei Xi - **********/ - -#include "ngspice/ngspice.h" -#include "ngspice/cktdefs.h" -#include "bsim3def.h" -#include "ngspice/sperror.h" -#include "ngspice/suffix.h" - - -int -BSIM3getic( -GENmodel *inModel, -CKTcircuit *ckt) -{ -BSIM3model *model = (BSIM3model*)inModel; -BSIM3instance *here; - - for (; model ; model = BSIM3nextModel(model)) - { for (here = BSIM3instances(model); here; here = BSIM3nextInstance(here)) - { - if (!here->BSIM3icVBSGiven) - { here->BSIM3icVBS = *(ckt->CKTrhs + here->BSIM3bNode) - - *(ckt->CKTrhs + here->BSIM3sNode); - } - if (!here->BSIM3icVDSGiven) - { here->BSIM3icVDS = *(ckt->CKTrhs + here->BSIM3dNode) - - *(ckt->CKTrhs + here->BSIM3sNode); - } - if (!here->BSIM3icVGSGiven) - { here->BSIM3icVGS = *(ckt->CKTrhs + here->BSIM3gNode) - - *(ckt->CKTrhs + here->BSIM3sNode); - } - } - } - return(OK); -} diff --git a/src/spicelib/devices/bsim3/b3ld.c b/src/spicelib/devices/bsim3/b3ld.c deleted file mode 100644 index 6ed5f6ee4..000000000 --- a/src/spicelib/devices/bsim3/b3ld.c +++ /dev/null @@ -1,3191 +0,0 @@ -/**** BSIM3v3.3.0, Released by Xuemei Xi 07/29/2005 ****/ -/**** OpenMP support for ngspice by Holger Vogt 06/28/2010 ****/ - -/********** - * Copyright 2004 Regents of the University of California. All rights reserved. - * File: b3ld.c of BSIM3v3.3.0 - * Author: 1991 JianHui Huang and Min-Chie Jeng. - * Modified by Mansun Chan (1995). - * Author: 1997-1999 Weidong Liu. - * Author: 2001 Xuemei Xi - * Modified by Xuemei Xi, 10/05, 12/21, 2001. - * Modified by Xuemei Xi, 07/29/2005. - **********/ - -#include "ngspice/ngspice.h" -#include "ngspice/cktdefs.h" -#include "bsim3def.h" -#include "ngspice/trandefs.h" -#include "ngspice/const.h" -#include "ngspice/sperror.h" -#include "ngspice/devdefs.h" -#include "ngspice/suffix.h" - -#define MAX_EXP 5.834617425e14 -#define MIN_EXP 1.713908431e-15 -#define EXP_THRESHOLD 34.0 -#define EPSOX 3.453133e-11 -#define EPSSI 1.03594e-10 -#define Charge_q 1.60219e-19 -#define DELTA_1 0.02 -#define DELTA_2 0.02 -#define DELTA_3 0.02 -#define DELTA_4 0.02 - -#ifdef USE_OMP -int BSIM3LoadOMP(BSIM3instance *here, CKTcircuit *ckt); -void BSIM3LoadRhsMat(GENmodel *inModel, CKTcircuit *ckt); -#endif - - -int -BSIM3load( -GENmodel *inModel, -CKTcircuit *ckt) -{ -#ifdef USE_OMP - int idx; - BSIM3model *model = (BSIM3model*)inModel; - int error = 0; - BSIM3instance **InstArray; - InstArray = model->BSIM3InstanceArray; - -#pragma omp parallel for - for (idx = 0; idx < model->BSIM3InstCount; idx++) { - BSIM3instance *here = InstArray[idx]; - int local_error = BSIM3LoadOMP(here, ckt); - if (local_error) - error = local_error; - } - - BSIM3LoadRhsMat(inModel, ckt); - - return error; -} - - -int BSIM3LoadOMP(BSIM3instance *here, CKTcircuit *ckt) { -BSIM3model *model = BSIM3modPtr(here); -#else -BSIM3model *model = (BSIM3model*)inModel; -BSIM3instance *here; -#endif -double SourceSatCurrent, DrainSatCurrent; -double ag0, qgd, qgs, qgb, von, cbhat, VgstNVt, ExpVgst; -double cdrain, cdhat, cdreq, ceqbd, ceqbs, ceqqb, ceqqd, ceqqg, ceq, geq; -double czbd, czbdsw, czbdswg, czbs, czbssw, czbsswg, evbd, evbs, arg, sarg; -double delvbd, delvbs, delvds, delvgd, delvgs; -double Vfbeff, dVfbeff_dVg, dVfbeff_dVb, V3, V4; -double gcbdb, gcbgb, gcbsb, gcddb, gcdgb, gcdsb, gcgdb, gcggb, gcgsb, gcsdb; -#ifndef NEWCONV -double tol; -#endif -double gcsgb, gcssb, MJ, MJSW, MJSWG; -double vbd, vbs, vds, vgb, vgd, vgs, vgdo; -#ifndef PREDICTOR -double xfact; -#endif -double qgate=0.0, qbulk=0.0, qdrn=0.0, qsrc, qinoi, cqgate, cqbulk, cqdrn; -double Vds, Vgs, Vbs, Gmbs, FwdSum, RevSum; -double Vgs_eff, Vfb; -double Phis, dPhis_dVb, sqrtPhis, dsqrtPhis_dVb, Vth, dVth_dVb, dVth_dVd; -double Vgst, dVgst_dVg, dVgst_dVb, dVgs_eff_dVg, Nvtm; -double Vtm; -double n, dn_dVb, dn_dVd, voffcv, noff, dnoff_dVd, dnoff_dVb; -double ExpArg, V0, CoxWLcen, QovCox, LINK; -double DeltaPhi, dDeltaPhi_dVg, VgDP, dVgDP_dVg; -double Cox, Tox, Tcen, dTcen_dVg, dTcen_dVd, dTcen_dVb; -double Ccen, Coxeff, dCoxeff_dVg, dCoxeff_dVd, dCoxeff_dVb; -double Denomi, dDenomi_dVg, dDenomi_dVd, dDenomi_dVb; -double ueff, dueff_dVg, dueff_dVd, dueff_dVb; -double Esat, Vdsat; -double EsatL, dEsatL_dVg, dEsatL_dVd, dEsatL_dVb; - -double dVdsat_dVg, dVdsat_dVb, dVdsat_dVd, Vasat, dAlphaz_dVg, dAlphaz_dVb; -double dVasat_dVg, dVasat_dVb, dVasat_dVd, Va, dVa_dVd, dVa_dVg, dVa_dVb; -double Vbseff, dVbseff_dVb, VbseffCV, dVbseffCV_dVb; -double Arg1, One_Third_CoxWL, Two_Third_CoxWL, Alphaz, CoxWL; - -double T0, dT0_dVg, dT0_dVd, dT0_dVb; -double T1, dT1_dVg, dT1_dVd, dT1_dVb; -double T2, dT2_dVg, dT2_dVd, dT2_dVb; -double T3, dT3_dVg, dT3_dVd, dT3_dVb; -double T4; -double T5; -double T6; -double T7; -double T8; -double T9; -double T10; -double T11, T12; -double tmp, Abulk, dAbulk_dVb, Abulk0, dAbulk0_dVb; - -double VACLM, dVACLM_dVg, dVACLM_dVd, dVACLM_dVb; -double VADIBL, dVADIBL_dVg, dVADIBL_dVd, dVADIBL_dVb; - -double Xdep, dXdep_dVb, lt1, dlt1_dVb, ltw, dltw_dVb, Delt_vth, dDelt_vth_dVb; -double Theta0, dTheta0_dVb; -double TempRatio, tmp1, tmp2, tmp3, tmp4; -double DIBL_Sft, dDIBL_Sft_dVd, Lambda, dLambda_dVg; - -double Idtot, Ibtot; -#ifndef NOBYPASS -double tempv; -#endif -double a1, ScalingFactor; - -double Vgsteff, dVgsteff_dVg, dVgsteff_dVd, dVgsteff_dVb; -double Vdseff, dVdseff_dVg, dVdseff_dVd, dVdseff_dVb; -double VdseffCV, dVdseffCV_dVg, dVdseffCV_dVd, dVdseffCV_dVb; -double diffVds, dAbulk_dVg; -double beta, dbeta_dVg, dbeta_dVd, dbeta_dVb; -double gche, dgche_dVg, dgche_dVd, dgche_dVb; -double fgche1, dfgche1_dVg, dfgche1_dVd, dfgche1_dVb; -double fgche2, dfgche2_dVg, dfgche2_dVd, dfgche2_dVb; -double Idl, dIdl_dVg, dIdl_dVd, dIdl_dVb; -double Idsa, dIdsa_dVg, dIdsa_dVd, dIdsa_dVb; -double Ids, Gm, Gds, Gmb; -double Isub, Gbd, Gbg, Gbb; -double VASCBE, dVASCBE_dVg, dVASCBE_dVd, dVASCBE_dVb; -double CoxWovL; -double Rds, dRds_dVg, dRds_dVb, WVCox, WVCoxRds; -double Vgst2Vtm, VdsatCV, dVdsatCV_dVg, dVdsatCV_dVb; -double Leff, Weff, dWeff_dVg, dWeff_dVb; -double AbulkCV, dAbulkCV_dVb; -double qgdo, qgso, cgdo, cgso; - -double qcheq=0.0, qdef, gqdef=0.0, cqdef, cqcheq, gtau_diff, gtau_drift; -double gcqdb=0.0,gcqsb=0.0,gcqgb=0.0,gcqbb=0.0; -double dxpart, sxpart, ggtg, ggtd, ggts, ggtb; -double ddxpart_dVd, ddxpart_dVg, ddxpart_dVb, ddxpart_dVs; -double dsxpart_dVd, dsxpart_dVg, dsxpart_dVb, dsxpart_dVs; - -double gbspsp, gbbdp, gbbsp, gbspg, gbspb, gbspdp; -double gbdpdp, gbdpg, gbdpb, gbdpsp; -double Cgg, Cgd, Cgb, Cdg, Cdd, Cds; -double Csg, Csd, Css, Csb, Cbg, Cbd, Cbb; -double Cgg1, Cgb1, Cgd1, Cbg1, Cbb1, Cbd1, Qac0, Qsub0; -double dQac0_dVg, dQac0_dVb, dQsub0_dVg, dQsub0_dVd, dQsub0_dVb; - -double m; - -struct bsim3SizeDependParam *pParam; -int ByPass, Check, ChargeComputationNeeded, error; -/* double junk[50]; */ - -ScalingFactor = 1.0e-9; -ChargeComputationNeeded = - ((ckt->CKTmode & (MODEDCTRANCURVE | MODEAC | MODETRAN | MODEINITSMSIG)) || - ((ckt->CKTmode & MODETRANOP) && (ckt->CKTmode & MODEUIC))) - ? 1 : 0; -#ifndef USE_OMP -for (; model != NULL; model = BSIM3nextModel(model)) -{ for (here = BSIM3instances(model); here != NULL; - here = BSIM3nextInstance(here)) - { -#endif - Check = 1; - ByPass = 0; - pParam = here->pParam; - if ((ckt->CKTmode & MODEINITSMSIG)) - { vbs = *(ckt->CKTstate0 + here->BSIM3vbs); - vgs = *(ckt->CKTstate0 + here->BSIM3vgs); - vds = *(ckt->CKTstate0 + here->BSIM3vds); - qdef = *(ckt->CKTstate0 + here->BSIM3qdef); - } - else if ((ckt->CKTmode & MODEINITTRAN)) - { vbs = *(ckt->CKTstate1 + here->BSIM3vbs); - vgs = *(ckt->CKTstate1 + here->BSIM3vgs); - vds = *(ckt->CKTstate1 + here->BSIM3vds); - qdef = *(ckt->CKTstate1 + here->BSIM3qdef); - } - else if ((ckt->CKTmode & MODEINITJCT) && !here->BSIM3off) - { vds = model->BSIM3type * here->BSIM3icVDS; - vgs = model->BSIM3type * here->BSIM3icVGS; - vbs = model->BSIM3type * here->BSIM3icVBS; - qdef = 0.0; - - if ((vds == 0.0) && (vgs == 0.0) && (vbs == 0.0) && - ((ckt->CKTmode & (MODETRAN | MODEAC|MODEDCOP | - MODEDCTRANCURVE)) || (!(ckt->CKTmode & MODEUIC)))) - { vbs = 0.0; - vgs = model->BSIM3type * here->BSIM3vth0 + 0.1; - vds = 0.1; - } - } - else if ((ckt->CKTmode & (MODEINITJCT | MODEINITFIX)) && - (here->BSIM3off)) - { qdef = vbs = vgs = vds = 0.0; - } - else - { -#ifndef PREDICTOR - if ((ckt->CKTmode & MODEINITPRED)) - { xfact = ckt->CKTdelta / ckt->CKTdeltaOld[1]; - *(ckt->CKTstate0 + here->BSIM3vbs) = - *(ckt->CKTstate1 + here->BSIM3vbs); - vbs = (1.0 + xfact)* (*(ckt->CKTstate1 + here->BSIM3vbs)) - - (xfact * (*(ckt->CKTstate2 + here->BSIM3vbs))); - *(ckt->CKTstate0 + here->BSIM3vgs) = - *(ckt->CKTstate1 + here->BSIM3vgs); - vgs = (1.0 + xfact)* (*(ckt->CKTstate1 + here->BSIM3vgs)) - - (xfact * (*(ckt->CKTstate2 + here->BSIM3vgs))); - *(ckt->CKTstate0 + here->BSIM3vds) = - *(ckt->CKTstate1 + here->BSIM3vds); - vds = (1.0 + xfact)* (*(ckt->CKTstate1 + here->BSIM3vds)) - - (xfact * (*(ckt->CKTstate2 + here->BSIM3vds))); - *(ckt->CKTstate0 + here->BSIM3vbd) = - *(ckt->CKTstate0 + here->BSIM3vbs) - - *(ckt->CKTstate0 + here->BSIM3vds); - *(ckt->CKTstate0 + here->BSIM3qdef) = - *(ckt->CKTstate1 + here->BSIM3qdef); - qdef = (1.0 + xfact)* (*(ckt->CKTstate1 + here->BSIM3qdef)) - -(xfact * (*(ckt->CKTstate2 + here->BSIM3qdef))); - } - else - { -#endif /* PREDICTOR */ - vbs = model->BSIM3type - * (*(ckt->CKTrhsOld + here->BSIM3bNode) - - *(ckt->CKTrhsOld + here->BSIM3sNodePrime)); - vgs = model->BSIM3type - * (*(ckt->CKTrhsOld + here->BSIM3gNode) - - *(ckt->CKTrhsOld + here->BSIM3sNodePrime)); - vds = model->BSIM3type - * (*(ckt->CKTrhsOld + here->BSIM3dNodePrime) - - *(ckt->CKTrhsOld + here->BSIM3sNodePrime)); - qdef = model->BSIM3type - * (*(ckt->CKTrhsOld + here->BSIM3qNode)); -#ifndef PREDICTOR - } -#endif /* PREDICTOR */ - - vbd = vbs - vds; - vgd = vgs - vds; - vgdo = *(ckt->CKTstate0 + here->BSIM3vgs) - - *(ckt->CKTstate0 + here->BSIM3vds); - delvbs = vbs - *(ckt->CKTstate0 + here->BSIM3vbs); - delvbd = vbd - *(ckt->CKTstate0 + here->BSIM3vbd); - delvgs = vgs - *(ckt->CKTstate0 + here->BSIM3vgs); - delvds = vds - *(ckt->CKTstate0 + here->BSIM3vds); - delvgd = vgd - vgdo; - - if (here->BSIM3mode >= 0) - { Idtot = here->BSIM3cd + here->BSIM3csub - here->BSIM3cbd; - cdhat = Idtot - here->BSIM3gbd * delvbd - + (here->BSIM3gmbs + here->BSIM3gbbs) * delvbs - + (here->BSIM3gm + here->BSIM3gbgs) * delvgs - + (here->BSIM3gds + here->BSIM3gbds) * delvds; - Ibtot = here->BSIM3cbs + here->BSIM3cbd - here->BSIM3csub; - cbhat = Ibtot + here->BSIM3gbd * delvbd - + (here->BSIM3gbs - here->BSIM3gbbs) * delvbs - - here->BSIM3gbgs * delvgs - - here->BSIM3gbds * delvds; - } - else - { Idtot = here->BSIM3cd - here->BSIM3cbd; - cdhat = Idtot - (here->BSIM3gbd - here->BSIM3gmbs) * delvbd - + here->BSIM3gm * delvgd - - here->BSIM3gds * delvds; - Ibtot = here->BSIM3cbs + here->BSIM3cbd - here->BSIM3csub; - cbhat = Ibtot + here->BSIM3gbs * delvbs - + (here->BSIM3gbd - here->BSIM3gbbs) * delvbd - - here->BSIM3gbgs * delvgd - + here->BSIM3gbds * delvds; - } - -#ifndef NOBYPASS - /* following should be one big if connected by && all over - * the place, but some C compilers can't handle that, so - * we split it up here to let them digest it in stages - */ - - if ((!(ckt->CKTmode & MODEINITPRED)) && (ckt->CKTbypass)) - if ((fabs(delvbs) < (ckt->CKTreltol * MAX(fabs(vbs), - fabs(*(ckt->CKTstate0+here->BSIM3vbs))) + ckt->CKTvoltTol))) - if ((fabs(delvbd) < (ckt->CKTreltol * MAX(fabs(vbd), - fabs(*(ckt->CKTstate0+here->BSIM3vbd))) + ckt->CKTvoltTol))) - if ((fabs(delvgs) < (ckt->CKTreltol * MAX(fabs(vgs), - fabs(*(ckt->CKTstate0+here->BSIM3vgs))) + ckt->CKTvoltTol))) - if ((fabs(delvds) < (ckt->CKTreltol * MAX(fabs(vds), - fabs(*(ckt->CKTstate0+here->BSIM3vds))) + ckt->CKTvoltTol))) - if ((fabs(cdhat - Idtot) < ckt->CKTreltol - * MAX(fabs(cdhat),fabs(Idtot)) + ckt->CKTabstol)) - { tempv = MAX(fabs(cbhat),fabs(Ibtot)) + ckt->CKTabstol; - if ((fabs(cbhat - Ibtot)) < ckt->CKTreltol * tempv) - { /* bypass code */ - vbs = *(ckt->CKTstate0 + here->BSIM3vbs); - vbd = *(ckt->CKTstate0 + here->BSIM3vbd); - vgs = *(ckt->CKTstate0 + here->BSIM3vgs); - vds = *(ckt->CKTstate0 + here->BSIM3vds); - qdef = *(ckt->CKTstate0 + here->BSIM3qdef); - - vgd = vgs - vds; - vgb = vgs - vbs; - - cdrain = here->BSIM3cd; - if ((ckt->CKTmode & (MODETRAN | MODEAC)) || - ((ckt->CKTmode & MODETRANOP) && - (ckt->CKTmode & MODEUIC))) - { ByPass = 1; - qgate = here->BSIM3qgate; - qbulk = here->BSIM3qbulk; - qdrn = here->BSIM3qdrn; - goto line755; - } - else - { goto line850; - } - } - } - -#endif /*NOBYPASS*/ - von = here->BSIM3von; - if (*(ckt->CKTstate0 + here->BSIM3vds) >= 0.0) - { vgs = DEVfetlim(vgs, *(ckt->CKTstate0+here->BSIM3vgs), von); - vds = vgs - vgd; - vds = DEVlimvds(vds, *(ckt->CKTstate0 + here->BSIM3vds)); - vgd = vgs - vds; - - } - else - { vgd = DEVfetlim(vgd, vgdo, von); - vds = vgs - vgd; - vds = -DEVlimvds(-vds, -(*(ckt->CKTstate0+here->BSIM3vds))); - vgs = vgd + vds; - } - - if (vds >= 0.0) - { vbs = DEVpnjlim(vbs, *(ckt->CKTstate0 + here->BSIM3vbs), - CONSTvt0, model->BSIM3vcrit, &Check); - vbd = vbs - vds; - - } - else - { vbd = DEVpnjlim(vbd, *(ckt->CKTstate0 + here->BSIM3vbd), - CONSTvt0, model->BSIM3vcrit, &Check); - vbs = vbd + vds; - } - } - - /* determine DC current and derivatives */ - vbd = vbs - vds; - vgd = vgs - vds; - vgb = vgs - vbs; - - /* Source/drain junction diode DC model begins */ - Nvtm = model->BSIM3vtm * model->BSIM3jctEmissionCoeff; - /* acm model */ - if (model->BSIM3acmMod == 0) - { - if ((here->BSIM3sourceArea <= 0.0) && (here->BSIM3sourcePerimeter <= 0.0)) - { SourceSatCurrent = 1.0e-14; - } - else - { SourceSatCurrent = here->BSIM3sourceArea - * model->BSIM3jctTempSatCurDensity - + here->BSIM3sourcePerimeter - * model->BSIM3jctSidewallTempSatCurDensity; - } - if ((here->BSIM3drainArea <= 0.0) && (here->BSIM3drainPerimeter <= 0.0)) - { DrainSatCurrent = 1.0e-14; - } - else - { DrainSatCurrent = here->BSIM3drainArea - * model->BSIM3jctTempSatCurDensity - + here->BSIM3drainPerimeter - * model->BSIM3jctSidewallTempSatCurDensity; - } - } - else - { - error = ACM_saturationCurrents( - model->BSIM3acmMod, - model->BSIM3calcacm, - here->BSIM3geo, - model->BSIM3hdif, - model->BSIM3wmlt, - here->BSIM3w, - model->BSIM3xw, - model->BSIM3jctTempSatCurDensity, - model->BSIM3jctSidewallTempSatCurDensity, - here->BSIM3drainAreaGiven, - here->BSIM3drainArea, - here->BSIM3drainPerimeterGiven, - here->BSIM3drainPerimeter, - here->BSIM3sourceAreaGiven, - here->BSIM3sourceArea, - here->BSIM3sourcePerimeterGiven, - here->BSIM3sourcePerimeter, - &DrainSatCurrent, - &SourceSatCurrent - ); - if (error) - return(error); - } - - if (SourceSatCurrent <= 0.0) - { here->BSIM3gbs = ckt->CKTgmin; - here->BSIM3cbs = here->BSIM3gbs * vbs; - } - else - { if (model->BSIM3ijth == 0.0) - { evbs = exp(vbs / Nvtm); - here->BSIM3gbs = SourceSatCurrent * evbs / Nvtm + ckt->CKTgmin; - here->BSIM3cbs = SourceSatCurrent * (evbs - 1.0) - + ckt->CKTgmin * vbs; - } - else - { if (vbs < here->BSIM3vjsm) - { evbs = exp(vbs / Nvtm); - here->BSIM3gbs = SourceSatCurrent * evbs / Nvtm + ckt->CKTgmin; - here->BSIM3cbs = SourceSatCurrent * (evbs - 1.0) - + ckt->CKTgmin * vbs; - } - else - { T0 = here->BSIM3IsEvjsm / Nvtm; - here->BSIM3gbs = T0 + ckt->CKTgmin; - here->BSIM3cbs = here->BSIM3IsEvjsm - SourceSatCurrent - + T0 * (vbs - here->BSIM3vjsm) - + ckt->CKTgmin * vbs; - } - } - } - - if (DrainSatCurrent <= 0.0) - { here->BSIM3gbd = ckt->CKTgmin; - here->BSIM3cbd = here->BSIM3gbd * vbd; - } - else - { if (model->BSIM3ijth == 0.0) - { evbd = exp(vbd / Nvtm); - here->BSIM3gbd = DrainSatCurrent * evbd / Nvtm + ckt->CKTgmin; - here->BSIM3cbd = DrainSatCurrent * (evbd - 1.0) - + ckt->CKTgmin * vbd; - } - else - { if (vbd < here->BSIM3vjdm) - { evbd = exp(vbd / Nvtm); - here->BSIM3gbd = DrainSatCurrent * evbd / Nvtm + ckt->CKTgmin; - here->BSIM3cbd = DrainSatCurrent * (evbd - 1.0) - + ckt->CKTgmin * vbd; - } - else - { T0 = here->BSIM3IsEvjdm / Nvtm; - here->BSIM3gbd = T0 + ckt->CKTgmin; - here->BSIM3cbd = here->BSIM3IsEvjdm - DrainSatCurrent - + T0 * (vbd - here->BSIM3vjdm) - + ckt->CKTgmin * vbd; - } - } - } - /* End of diode DC model */ - - if (vds >= 0.0) - { /* normal mode */ - here->BSIM3mode = 1; - Vds = vds; - Vgs = vgs; - Vbs = vbs; - } - else - { /* inverse mode */ - here->BSIM3mode = -1; - Vds = -vds; - Vgs = vgd; - Vbs = vbd; - } - - T0 = Vbs - pParam->BSIM3vbsc - 0.001; - T1 = sqrt(T0 * T0 - 0.004 * pParam->BSIM3vbsc); - Vbseff = pParam->BSIM3vbsc + 0.5 * (T0 + T1); - dVbseff_dVb = 0.5 * (1.0 + T0 / T1); - if (Vbseff < Vbs) - { Vbseff = Vbs; - } - - if (Vbseff > 0.0) - { T0 = pParam->BSIM3phi / (pParam->BSIM3phi + Vbseff); - Phis = pParam->BSIM3phi * T0; - dPhis_dVb = -T0 * T0; - sqrtPhis = pParam->BSIM3phis3 / (pParam->BSIM3phi + 0.5 * Vbseff); - dsqrtPhis_dVb = -0.5 * sqrtPhis * sqrtPhis / pParam->BSIM3phis3; - } - else - { Phis = pParam->BSIM3phi - Vbseff; - dPhis_dVb = -1.0; - sqrtPhis = sqrt(Phis); - dsqrtPhis_dVb = -0.5 / sqrtPhis; - } - Xdep = pParam->BSIM3Xdep0 * sqrtPhis / pParam->BSIM3sqrtPhi; - dXdep_dVb = (pParam->BSIM3Xdep0 / pParam->BSIM3sqrtPhi) - * dsqrtPhis_dVb; - - Leff = pParam->BSIM3leff; - Vtm = model->BSIM3vtm; -/* Vth Calculation */ - T3 = sqrt(Xdep); - V0 = pParam->BSIM3vbi - pParam->BSIM3phi; - - T0 = pParam->BSIM3dvt2 * Vbseff; - if (T0 >= - 0.5) - { T1 = 1.0 + T0; - T2 = pParam->BSIM3dvt2; - } - else /* Added to avoid any discontinuity problems caused by dvt2 */ - { T4 = 1.0 / (3.0 + 8.0 * T0); - T1 = (1.0 + 3.0 * T0) * T4; - T2 = pParam->BSIM3dvt2 * T4 * T4; - } - lt1 = model->BSIM3factor1 * T3 * T1; - dlt1_dVb = model->BSIM3factor1 * (0.5 / T3 * T1 * dXdep_dVb + T3 * T2); - - T0 = pParam->BSIM3dvt2w * Vbseff; - if (T0 >= - 0.5) - { T1 = 1.0 + T0; - T2 = pParam->BSIM3dvt2w; - } - else /* Added to avoid any discontinuity problems caused by dvt2w */ - { T4 = 1.0 / (3.0 + 8.0 * T0); - T1 = (1.0 + 3.0 * T0) * T4; - T2 = pParam->BSIM3dvt2w * T4 * T4; - } - ltw = model->BSIM3factor1 * T3 * T1; - dltw_dVb = model->BSIM3factor1 * (0.5 / T3 * T1 * dXdep_dVb + T3 * T2); - - T0 = -0.5 * pParam->BSIM3dvt1 * Leff / lt1; - if (T0 > -EXP_THRESHOLD) - { T1 = exp(T0); - Theta0 = T1 * (1.0 + 2.0 * T1); - dT1_dVb = -T0 / lt1 * T1 * dlt1_dVb; - dTheta0_dVb = (1.0 + 4.0 * T1) * dT1_dVb; - } - else - { T1 = MIN_EXP; - Theta0 = T1 * (1.0 + 2.0 * T1); - dTheta0_dVb = 0.0; - } - - here->BSIM3thetavth = pParam->BSIM3dvt0 * Theta0; - Delt_vth = here->BSIM3thetavth * V0; - dDelt_vth_dVb = pParam->BSIM3dvt0 * dTheta0_dVb * V0; - - T0 = -0.5 * pParam->BSIM3dvt1w * pParam->BSIM3weff * Leff / ltw; - if (T0 > -EXP_THRESHOLD) - { T1 = exp(T0); - T2 = T1 * (1.0 + 2.0 * T1); - dT1_dVb = -T0 / ltw * T1 * dltw_dVb; - dT2_dVb = (1.0 + 4.0 * T1) * dT1_dVb; - } - else - { T1 = MIN_EXP; - T2 = T1 * (1.0 + 2.0 * T1); - dT2_dVb = 0.0; - } - - T0 = pParam->BSIM3dvt0w * T2; - T2 = T0 * V0; - dT2_dVb = pParam->BSIM3dvt0w * dT2_dVb * V0; - - TempRatio = ckt->CKTtemp / model->BSIM3tnom - 1.0; - T0 = sqrt(1.0 + pParam->BSIM3nlx / Leff); - T1 = pParam->BSIM3k1ox * (T0 - 1.0) * pParam->BSIM3sqrtPhi - + (pParam->BSIM3kt1 + pParam->BSIM3kt1l / Leff - + pParam->BSIM3kt2 * Vbseff) * TempRatio; - tmp2 = model->BSIM3tox * pParam->BSIM3phi - / (pParam->BSIM3weff + pParam->BSIM3w0); - - T3 = pParam->BSIM3eta0 + pParam->BSIM3etab * Vbseff; - if (T3 < 1.0e-4) /* avoid discontinuity problems caused by etab */ - { T9 = 1.0 / (3.0 - 2.0e4 * T3); - T3 = (2.0e-4 - T3) * T9; - T4 = T9 * T9; - } - else - { T4 = 1.0; - } - dDIBL_Sft_dVd = T3 * pParam->BSIM3theta0vb0; - DIBL_Sft = dDIBL_Sft_dVd * Vds; - - Vth = model->BSIM3type * here->BSIM3vth0 - pParam->BSIM3k1 - * pParam->BSIM3sqrtPhi + pParam->BSIM3k1ox * sqrtPhis - - pParam->BSIM3k2ox * Vbseff - Delt_vth - T2 + (pParam->BSIM3k3 - + pParam->BSIM3k3b * Vbseff) * tmp2 + T1 - DIBL_Sft; - - here->BSIM3von = Vth; - - dVth_dVb = pParam->BSIM3k1ox * dsqrtPhis_dVb - pParam->BSIM3k2ox - - dDelt_vth_dVb - dT2_dVb + pParam->BSIM3k3b * tmp2 - - pParam->BSIM3etab * Vds * pParam->BSIM3theta0vb0 * T4 - + pParam->BSIM3kt2 * TempRatio; - dVth_dVd = -dDIBL_Sft_dVd; - -/* Calculate n */ - tmp2 = pParam->BSIM3nfactor * EPSSI / Xdep; - tmp3 = pParam->BSIM3cdsc + pParam->BSIM3cdscb * Vbseff - + pParam->BSIM3cdscd * Vds; - tmp4 = (tmp2 + tmp3 * Theta0 + pParam->BSIM3cit) / model->BSIM3cox; - if (tmp4 >= -0.5) - { n = 1.0 + tmp4; - dn_dVb = (-tmp2 / Xdep * dXdep_dVb + tmp3 * dTheta0_dVb - + pParam->BSIM3cdscb * Theta0) / model->BSIM3cox; - dn_dVd = pParam->BSIM3cdscd * Theta0 / model->BSIM3cox; - } - else - /* avoid discontinuity problems caused by tmp4 */ - { T0 = 1.0 / (3.0 + 8.0 * tmp4); - n = (1.0 + 3.0 * tmp4) * T0; - T0 *= T0; - dn_dVb = (-tmp2 / Xdep * dXdep_dVb + tmp3 * dTheta0_dVb - + pParam->BSIM3cdscb * Theta0) / model->BSIM3cox * T0; - dn_dVd = pParam->BSIM3cdscd * Theta0 / model->BSIM3cox * T0; - } - -/* Poly Gate Si Depletion Effect */ - T0 = here->BSIM3vfb + pParam->BSIM3phi; - if ((pParam->BSIM3ngate > 1.e18) && (pParam->BSIM3ngate < 1.e25) - && (Vgs > T0)) - /* added to avoid the problem caused by ngate */ - { T1 = 1.0e6 * Charge_q * EPSSI * pParam->BSIM3ngate - / (model->BSIM3cox * model->BSIM3cox); - T4 = sqrt(1.0 + 2.0 * (Vgs - T0) / T1); - T2 = T1 * (T4 - 1.0); - T3 = 0.5 * T2 * T2 / T1; /* T3 = Vpoly */ - T7 = 1.12 - T3 - 0.05; - T6 = sqrt(T7 * T7 + 0.224); - T5 = 1.12 - 0.5 * (T7 + T6); - Vgs_eff = Vgs - T5; - dVgs_eff_dVg = 1.0 - (0.5 - 0.5 / T4) * (1.0 + T7 / T6); - } - else - { Vgs_eff = Vgs; - dVgs_eff_dVg = 1.0; - } - Vgst = Vgs_eff - Vth; - -/* Effective Vgst (Vgsteff) Calculation */ - - T10 = 2.0 * n * Vtm; - VgstNVt = Vgst / T10; - ExpArg = (2.0 * pParam->BSIM3voff - Vgst) / T10; - - /* MCJ: Very small Vgst */ - if (VgstNVt > EXP_THRESHOLD) - { Vgsteff = Vgst; - dVgsteff_dVg = dVgs_eff_dVg; - dVgsteff_dVd = -dVth_dVd; - dVgsteff_dVb = -dVth_dVb; - } - else if (ExpArg > EXP_THRESHOLD) - { T0 = (Vgst - pParam->BSIM3voff) / (n * Vtm); - ExpVgst = exp(T0); - Vgsteff = Vtm * pParam->BSIM3cdep0 / model->BSIM3cox * ExpVgst; - dVgsteff_dVg = Vgsteff / (n * Vtm); - dVgsteff_dVd = -dVgsteff_dVg * (dVth_dVd + T0 * Vtm * dn_dVd); - dVgsteff_dVb = -dVgsteff_dVg * (dVth_dVb + T0 * Vtm * dn_dVb); - dVgsteff_dVg *= dVgs_eff_dVg; - } - else - { ExpVgst = exp(VgstNVt); - T1 = T10 * log(1.0 + ExpVgst); - dT1_dVg = ExpVgst / (1.0 + ExpVgst); - dT1_dVb = -dT1_dVg * (dVth_dVb + Vgst / n * dn_dVb) - + T1 / n * dn_dVb; - dT1_dVd = -dT1_dVg * (dVth_dVd + Vgst / n * dn_dVd) - + T1 / n * dn_dVd; - - dT2_dVg = -model->BSIM3cox / (Vtm * pParam->BSIM3cdep0) - * exp(ExpArg); - T2 = 1.0 - T10 * dT2_dVg; - dT2_dVd = -dT2_dVg * (dVth_dVd - 2.0 * Vtm * ExpArg * dn_dVd) - + (T2 - 1.0) / n * dn_dVd; - dT2_dVb = -dT2_dVg * (dVth_dVb - 2.0 * Vtm * ExpArg * dn_dVb) - + (T2 - 1.0) / n * dn_dVb; - - Vgsteff = T1 / T2; - T3 = T2 * T2; - dVgsteff_dVg = (T2 * dT1_dVg - T1 * dT2_dVg) / T3 * dVgs_eff_dVg; - dVgsteff_dVd = (T2 * dT1_dVd - T1 * dT2_dVd) / T3; - dVgsteff_dVb = (T2 * dT1_dVb - T1 * dT2_dVb) / T3; - } - here->BSIM3Vgsteff = Vgsteff; - -/* Calculate Effective Channel Geometry */ - T9 = sqrtPhis - pParam->BSIM3sqrtPhi; - Weff = pParam->BSIM3weff - 2.0 * (pParam->BSIM3dwg * Vgsteff - + pParam->BSIM3dwb * T9); - dWeff_dVg = -2.0 * pParam->BSIM3dwg; - dWeff_dVb = -2.0 * pParam->BSIM3dwb * dsqrtPhis_dVb; - - if (Weff < 2.0e-8) /* to avoid the discontinuity problem due to Weff*/ - { T0 = 1.0 / (6.0e-8 - 2.0 * Weff); - Weff = 2.0e-8 * (4.0e-8 - Weff) * T0; - T0 *= T0 * 4.0e-16; - dWeff_dVg *= T0; - dWeff_dVb *= T0; - } - - T0 = pParam->BSIM3prwg * Vgsteff + pParam->BSIM3prwb * T9; - if (T0 >= -0.9) - { Rds = pParam->BSIM3rds0 * (1.0 + T0); - dRds_dVg = pParam->BSIM3rds0 * pParam->BSIM3prwg; - dRds_dVb = pParam->BSIM3rds0 * pParam->BSIM3prwb * dsqrtPhis_dVb; - } - else - /* to avoid the discontinuity problem due to prwg and prwb*/ - { T1 = 1.0 / (17.0 + 20.0 * T0); - Rds = pParam->BSIM3rds0 * (0.8 + T0) * T1; - T1 *= T1; - dRds_dVg = pParam->BSIM3rds0 * pParam->BSIM3prwg * T1; - dRds_dVb = pParam->BSIM3rds0 * pParam->BSIM3prwb * dsqrtPhis_dVb - * T1; - } - here->BSIM3rds = Rds; /* Noise Bugfix */ - -/* Calculate Abulk */ - T1 = 0.5 * pParam->BSIM3k1ox / sqrtPhis; - dT1_dVb = -T1 / sqrtPhis * dsqrtPhis_dVb; - - T9 = sqrt(pParam->BSIM3xj * Xdep); - tmp1 = Leff + 2.0 * T9; - T5 = Leff / tmp1; - tmp2 = pParam->BSIM3a0 * T5; - tmp3 = pParam->BSIM3weff + pParam->BSIM3b1; - tmp4 = pParam->BSIM3b0 / tmp3; - T2 = tmp2 + tmp4; - dT2_dVb = -T9 / tmp1 / Xdep * dXdep_dVb; - T6 = T5 * T5; - T7 = T5 * T6; - - Abulk0 = 1.0 + T1 * T2; - dAbulk0_dVb = T1 * tmp2 * dT2_dVb + T2 * dT1_dVb; - - T8 = pParam->BSIM3ags * pParam->BSIM3a0 * T7; - dAbulk_dVg = -T1 * T8; - Abulk = Abulk0 + dAbulk_dVg * Vgsteff; - dAbulk_dVb = dAbulk0_dVb - T8 * Vgsteff * (dT1_dVb - + 3.0 * T1 * dT2_dVb); - - if (Abulk0 < 0.1) /* added to avoid the problems caused by Abulk0 */ - { T9 = 1.0 / (3.0 - 20.0 * Abulk0); - Abulk0 = (0.2 - Abulk0) * T9; - dAbulk0_dVb *= T9 * T9; - } - - if (Abulk < 0.1) - /* added to avoid the problems caused by Abulk */ - { T9 = 1.0 / (3.0 - 20.0 * Abulk); - Abulk = (0.2 - Abulk) * T9; - T10 = T9 * T9; - dAbulk_dVb *= T10; - dAbulk_dVg *= T10; - } - here->BSIM3Abulk = Abulk; - - T2 = pParam->BSIM3keta * Vbseff; - if (T2 >= -0.9) - { T0 = 1.0 / (1.0 + T2); - dT0_dVb = -pParam->BSIM3keta * T0 * T0; - } - else - /* added to avoid the problems caused by Keta */ - { T1 = 1.0 / (0.8 + T2); - T0 = (17.0 + 20.0 * T2) * T1; - dT0_dVb = -pParam->BSIM3keta * T1 * T1; - } - dAbulk_dVg *= T0; - dAbulk_dVb = dAbulk_dVb * T0 + Abulk * dT0_dVb; - dAbulk0_dVb = dAbulk0_dVb * T0 + Abulk0 * dT0_dVb; - Abulk *= T0; - Abulk0 *= T0; - - -/* Mobility calculation */ - if (model->BSIM3mobMod == 1) - { T0 = Vgsteff + Vth + Vth; - T2 = pParam->BSIM3ua + pParam->BSIM3uc * Vbseff; - T3 = T0 / model->BSIM3tox; - T5 = T3 * (T2 + pParam->BSIM3ub * T3); - dDenomi_dVg = (T2 + 2.0 * pParam->BSIM3ub * T3) / model->BSIM3tox; - dDenomi_dVd = dDenomi_dVg * 2.0 * dVth_dVd; - dDenomi_dVb = dDenomi_dVg * 2.0 * dVth_dVb + pParam->BSIM3uc * T3; - } - else if (model->BSIM3mobMod == 2) - { T5 = Vgsteff / model->BSIM3tox * (pParam->BSIM3ua - + pParam->BSIM3uc * Vbseff + pParam->BSIM3ub * Vgsteff - / model->BSIM3tox); - dDenomi_dVg = (pParam->BSIM3ua + pParam->BSIM3uc * Vbseff - + 2.0 * pParam->BSIM3ub * Vgsteff / model->BSIM3tox) - / model->BSIM3tox; - dDenomi_dVd = 0.0; - dDenomi_dVb = Vgsteff * pParam->BSIM3uc / model->BSIM3tox; - } - else - { T0 = Vgsteff + Vth + Vth; - T2 = 1.0 + pParam->BSIM3uc * Vbseff; - T3 = T0 / model->BSIM3tox; - T4 = T3 * (pParam->BSIM3ua + pParam->BSIM3ub * T3); - T5 = T4 * T2; - dDenomi_dVg = (pParam->BSIM3ua + 2.0 * pParam->BSIM3ub * T3) * T2 - / model->BSIM3tox; - dDenomi_dVd = dDenomi_dVg * 2.0 * dVth_dVd; - dDenomi_dVb = dDenomi_dVg * 2.0 * dVth_dVb + pParam->BSIM3uc * T4; - } - - if (T5 >= -0.8) - { Denomi = 1.0 + T5; - } - else /* Added to avoid the discontinuity problem caused by ua and ub*/ - { T9 = 1.0 / (7.0 + 10.0 * T5); - Denomi = (0.6 + T5) * T9; - T9 *= T9; - dDenomi_dVg *= T9; - dDenomi_dVd *= T9; - dDenomi_dVb *= T9; - } - - here->BSIM3ueff = ueff = here->BSIM3u0temp / Denomi; - T9 = -ueff / Denomi; - dueff_dVg = T9 * dDenomi_dVg; - dueff_dVd = T9 * dDenomi_dVd; - dueff_dVb = T9 * dDenomi_dVb; - -/* Saturation Drain Voltage Vdsat */ - WVCox = Weff * pParam->BSIM3vsattemp * model->BSIM3cox; - WVCoxRds = WVCox * Rds; - - Esat = 2.0 * pParam->BSIM3vsattemp / ueff; - EsatL = Esat * Leff; - T0 = -EsatL /ueff; - dEsatL_dVg = T0 * dueff_dVg; - dEsatL_dVd = T0 * dueff_dVd; - dEsatL_dVb = T0 * dueff_dVb; - - /* Sqrt() */ - a1 = pParam->BSIM3a1; - if (a1 == 0.0) - { Lambda = pParam->BSIM3a2; - dLambda_dVg = 0.0; - } - else if (a1 > 0.0) -/* Added to avoid the discontinuity problem - caused by a1 and a2 (Lambda) */ - { T0 = 1.0 - pParam->BSIM3a2; - T1 = T0 - pParam->BSIM3a1 * Vgsteff - 0.0001; - T2 = sqrt(T1 * T1 + 0.0004 * T0); - Lambda = pParam->BSIM3a2 + T0 - 0.5 * (T1 + T2); - dLambda_dVg = 0.5 * pParam->BSIM3a1 * (1.0 + T1 / T2); - } - else - { T1 = pParam->BSIM3a2 + pParam->BSIM3a1 * Vgsteff - 0.0001; - T2 = sqrt(T1 * T1 + 0.0004 * pParam->BSIM3a2); - Lambda = 0.5 * (T1 + T2); - dLambda_dVg = 0.5 * pParam->BSIM3a1 * (1.0 + T1 / T2); - } - - Vgst2Vtm = Vgsteff + 2.0 * Vtm; - here->BSIM3AbovVgst2Vtm = Abulk / Vgst2Vtm; - - if (Rds > 0) - { tmp2 = dRds_dVg / Rds + dWeff_dVg / Weff; - tmp3 = dRds_dVb / Rds + dWeff_dVb / Weff; - } - else - { tmp2 = dWeff_dVg / Weff; - tmp3 = dWeff_dVb / Weff; - } - if ((Rds == 0.0) && (Lambda == 1.0)) - { T0 = 1.0 / (Abulk * EsatL + Vgst2Vtm); - tmp1 = 0.0; - T1 = T0 * T0; - T2 = Vgst2Vtm * T0; - T3 = EsatL * Vgst2Vtm; - Vdsat = T3 * T0; - - dT0_dVg = -(Abulk * dEsatL_dVg + EsatL * dAbulk_dVg + 1.0) * T1; - dT0_dVd = -(Abulk * dEsatL_dVd) * T1; - dT0_dVb = -(Abulk * dEsatL_dVb + dAbulk_dVb * EsatL) * T1; - - dVdsat_dVg = T3 * dT0_dVg + T2 * dEsatL_dVg + EsatL * T0; - dVdsat_dVd = T3 * dT0_dVd + T2 * dEsatL_dVd; - dVdsat_dVb = T3 * dT0_dVb + T2 * dEsatL_dVb; - } - else - { tmp1 = dLambda_dVg / (Lambda * Lambda); - T9 = Abulk * WVCoxRds; - T8 = Abulk * T9; - T7 = Vgst2Vtm * T9; - T6 = Vgst2Vtm * WVCoxRds; - T0 = 2.0 * Abulk * (T9 - 1.0 + 1.0 / Lambda); - dT0_dVg = 2.0 * (T8 * tmp2 - Abulk * tmp1 - + (2.0 * T9 + 1.0 / Lambda - 1.0) * dAbulk_dVg); - - dT0_dVb = 2.0 * (T8 * (2.0 / Abulk * dAbulk_dVb + tmp3) - + (1.0 / Lambda - 1.0) * dAbulk_dVb); - dT0_dVd = 0.0; - T1 = Vgst2Vtm * (2.0 / Lambda - 1.0) + Abulk * EsatL + 3.0 * T7; - - dT1_dVg = (2.0 / Lambda - 1.0) - 2.0 * Vgst2Vtm * tmp1 - + Abulk * dEsatL_dVg + EsatL * dAbulk_dVg + 3.0 * (T9 - + T7 * tmp2 + T6 * dAbulk_dVg); - dT1_dVb = Abulk * dEsatL_dVb + EsatL * dAbulk_dVb - + 3.0 * (T6 * dAbulk_dVb + T7 * tmp3); - dT1_dVd = Abulk * dEsatL_dVd; - - T2 = Vgst2Vtm * (EsatL + 2.0 * T6); - dT2_dVg = EsatL + Vgst2Vtm * dEsatL_dVg - + T6 * (4.0 + 2.0 * Vgst2Vtm * tmp2); - dT2_dVb = Vgst2Vtm * (dEsatL_dVb + 2.0 * T6 * tmp3); - dT2_dVd = Vgst2Vtm * dEsatL_dVd; - - T3 = sqrt(T1 * T1 - 2.0 * T0 * T2); - Vdsat = (T1 - T3) / T0; - - dT3_dVg = (T1 * dT1_dVg - 2.0 * (T0 * dT2_dVg + T2 * dT0_dVg)) - / T3; - dT3_dVd = (T1 * dT1_dVd - 2.0 * (T0 * dT2_dVd + T2 * dT0_dVd)) - / T3; - dT3_dVb = (T1 * dT1_dVb - 2.0 * (T0 * dT2_dVb + T2 * dT0_dVb)) - / T3; - - dVdsat_dVg = (dT1_dVg - (T1 * dT1_dVg - dT0_dVg * T2 - - T0 * dT2_dVg) / T3 - Vdsat * dT0_dVg) / T0; - dVdsat_dVb = (dT1_dVb - (T1 * dT1_dVb - dT0_dVb * T2 - - T0 * dT2_dVb) / T3 - Vdsat * dT0_dVb) / T0; - dVdsat_dVd = (dT1_dVd - (T1 * dT1_dVd - T0 * dT2_dVd) / T3) / T0; - } - here->BSIM3vdsat = Vdsat; - -/* Effective Vds (Vdseff) Calculation */ - T1 = Vdsat - Vds - pParam->BSIM3delta; - dT1_dVg = dVdsat_dVg; - dT1_dVd = dVdsat_dVd - 1.0; - dT1_dVb = dVdsat_dVb; - - T2 = sqrt(T1 * T1 + 4.0 * pParam->BSIM3delta * Vdsat); - T0 = T1 / T2; - T3 = 2.0 * pParam->BSIM3delta / T2; - dT2_dVg = T0 * dT1_dVg + T3 * dVdsat_dVg; - dT2_dVd = T0 * dT1_dVd + T3 * dVdsat_dVd; - dT2_dVb = T0 * dT1_dVb + T3 * dVdsat_dVb; - - Vdseff = Vdsat - 0.5 * (T1 + T2); - dVdseff_dVg = dVdsat_dVg - 0.5 * (dT1_dVg + dT2_dVg); - dVdseff_dVd = dVdsat_dVd - 0.5 * (dT1_dVd + dT2_dVd); - dVdseff_dVb = dVdsat_dVb - 0.5 * (dT1_dVb + dT2_dVb); - /* Added to eliminate non-zero Vdseff at Vds=0.0 */ - if (Vds == 0.0) - { Vdseff = 0.0; - dVdseff_dVg = 0.0; - dVdseff_dVb = 0.0; - } - -/* Calculate VAsat */ - tmp4 = 1.0 - 0.5 * Abulk * Vdsat / Vgst2Vtm; - T9 = WVCoxRds * Vgsteff; - T8 = T9 / Vgst2Vtm; - T0 = EsatL + Vdsat + 2.0 * T9 * tmp4; - - T7 = 2.0 * WVCoxRds * tmp4; - dT0_dVg = dEsatL_dVg + dVdsat_dVg + T7 * (1.0 + tmp2 * Vgsteff) - - T8 * (Abulk * dVdsat_dVg - Abulk * Vdsat / Vgst2Vtm - + Vdsat * dAbulk_dVg); - - dT0_dVb = dEsatL_dVb + dVdsat_dVb + T7 * tmp3 * Vgsteff - - T8 * (dAbulk_dVb * Vdsat + Abulk * dVdsat_dVb); - dT0_dVd = dEsatL_dVd + dVdsat_dVd - T8 * Abulk * dVdsat_dVd; - - T9 = WVCoxRds * Abulk; - T1 = 2.0 / Lambda - 1.0 + T9; - dT1_dVg = -2.0 * tmp1 + WVCoxRds * (Abulk * tmp2 + dAbulk_dVg); - dT1_dVb = dAbulk_dVb * WVCoxRds + T9 * tmp3; - - Vasat = T0 / T1; - dVasat_dVg = (dT0_dVg - Vasat * dT1_dVg) / T1; - dVasat_dVb = (dT0_dVb - Vasat * dT1_dVb) / T1; - dVasat_dVd = dT0_dVd / T1; - - if (Vdseff > Vds) - Vdseff = Vds; - diffVds = Vds - Vdseff; - here->BSIM3Vdseff = Vdseff; - -/* Calculate VACLM */ - if ((pParam->BSIM3pclm > 0.0) && (diffVds > 1.0e-10)) - { T0 = 1.0 / (pParam->BSIM3pclm * Abulk * pParam->BSIM3litl); - dT0_dVb = -T0 / Abulk * dAbulk_dVb; - dT0_dVg = -T0 / Abulk * dAbulk_dVg; - - T2 = Vgsteff / EsatL; - T1 = Leff * (Abulk + T2); - dT1_dVg = Leff * ((1.0 - T2 * dEsatL_dVg) / EsatL + dAbulk_dVg); - dT1_dVb = Leff * (dAbulk_dVb - T2 * dEsatL_dVb / EsatL); - dT1_dVd = -T2 * dEsatL_dVd / Esat; - - T9 = T0 * T1; - VACLM = T9 * diffVds; - dVACLM_dVg = T0 * dT1_dVg * diffVds - T9 * dVdseff_dVg - + T1 * diffVds * dT0_dVg; - dVACLM_dVb = (dT0_dVb * T1 + T0 * dT1_dVb) * diffVds - - T9 * dVdseff_dVb; - dVACLM_dVd = T0 * dT1_dVd * diffVds + T9 * (1.0 - dVdseff_dVd); - } - else - { VACLM = MAX_EXP; - dVACLM_dVd = dVACLM_dVg = dVACLM_dVb = 0.0; - } - -/* Calculate VADIBL */ - if (pParam->BSIM3thetaRout > 0.0) - { T8 = Abulk * Vdsat; - T0 = Vgst2Vtm * T8; - dT0_dVg = Vgst2Vtm * Abulk * dVdsat_dVg + T8 - + Vgst2Vtm * Vdsat * dAbulk_dVg; - dT0_dVb = Vgst2Vtm * (dAbulk_dVb * Vdsat + Abulk * dVdsat_dVb); - dT0_dVd = Vgst2Vtm * Abulk * dVdsat_dVd; - - T1 = Vgst2Vtm + T8; - dT1_dVg = 1.0 + Abulk * dVdsat_dVg + Vdsat * dAbulk_dVg; - dT1_dVb = Abulk * dVdsat_dVb + dAbulk_dVb * Vdsat; - dT1_dVd = Abulk * dVdsat_dVd; - - T9 = T1 * T1; - T2 = pParam->BSIM3thetaRout; - VADIBL = (Vgst2Vtm - T0 / T1) / T2; - dVADIBL_dVg = (1.0 - dT0_dVg / T1 + T0 * dT1_dVg / T9) / T2; - dVADIBL_dVb = (-dT0_dVb / T1 + T0 * dT1_dVb / T9) / T2; - dVADIBL_dVd = (-dT0_dVd / T1 + T0 * dT1_dVd / T9) / T2; - - T7 = pParam->BSIM3pdiblb * Vbseff; - if (T7 >= -0.9) - { T3 = 1.0 / (1.0 + T7); - VADIBL *= T3; - dVADIBL_dVg *= T3; - dVADIBL_dVb = (dVADIBL_dVb - VADIBL * pParam->BSIM3pdiblb) - * T3; - dVADIBL_dVd *= T3; - } - else -/* Added to avoid the discontinuity problem caused by pdiblcb */ - { T4 = 1.0 / (0.8 + T7); - T3 = (17.0 + 20.0 * T7) * T4; - dVADIBL_dVg *= T3; - dVADIBL_dVb = dVADIBL_dVb * T3 - - VADIBL * pParam->BSIM3pdiblb * T4 * T4; - dVADIBL_dVd *= T3; - VADIBL *= T3; - } - } - else - { VADIBL = MAX_EXP; - dVADIBL_dVd = dVADIBL_dVg = dVADIBL_dVb = 0.0; - } - -/* Calculate VA */ - - T8 = pParam->BSIM3pvag / EsatL; - T9 = T8 * Vgsteff; - if (T9 > -0.9) - { T0 = 1.0 + T9; - dT0_dVg = T8 * (1.0 - Vgsteff * dEsatL_dVg / EsatL); - dT0_dVb = -T9 * dEsatL_dVb / EsatL; - dT0_dVd = -T9 * dEsatL_dVd / EsatL; - } - else /* Added to avoid the discontinuity problems caused by pvag */ - { T1 = 1.0 / (17.0 + 20.0 * T9); - T0 = (0.8 + T9) * T1; - T1 *= T1; - dT0_dVg = T8 * (1.0 - Vgsteff * dEsatL_dVg / EsatL) * T1; - - T9 *= T1 / EsatL; - dT0_dVb = -T9 * dEsatL_dVb; - dT0_dVd = -T9 * dEsatL_dVd; - } - - tmp1 = VACLM * VACLM; - tmp2 = VADIBL * VADIBL; - tmp3 = VACLM + VADIBL; - - T1 = VACLM * VADIBL / tmp3; - tmp3 *= tmp3; - dT1_dVg = (tmp1 * dVADIBL_dVg + tmp2 * dVACLM_dVg) / tmp3; - dT1_dVd = (tmp1 * dVADIBL_dVd + tmp2 * dVACLM_dVd) / tmp3; - dT1_dVb = (tmp1 * dVADIBL_dVb + tmp2 * dVACLM_dVb) / tmp3; - - Va = Vasat + T0 * T1; - dVa_dVg = dVasat_dVg + T1 * dT0_dVg + T0 * dT1_dVg; - dVa_dVd = dVasat_dVd + T1 * dT0_dVd + T0 * dT1_dVd; - dVa_dVb = dVasat_dVb + T1 * dT0_dVb + T0 * dT1_dVb; - -/* Calculate VASCBE */ - if (pParam->BSIM3pscbe2 > 0.0) - { if (diffVds > pParam->BSIM3pscbe1 * pParam->BSIM3litl - / EXP_THRESHOLD) - { T0 = pParam->BSIM3pscbe1 * pParam->BSIM3litl / diffVds; - VASCBE = Leff * exp(T0) / pParam->BSIM3pscbe2; - T1 = T0 * VASCBE / diffVds; - dVASCBE_dVg = T1 * dVdseff_dVg; - dVASCBE_dVd = -T1 * (1.0 - dVdseff_dVd); - dVASCBE_dVb = T1 * dVdseff_dVb; - } - else - { VASCBE = MAX_EXP * Leff/pParam->BSIM3pscbe2; - dVASCBE_dVg = dVASCBE_dVd = dVASCBE_dVb = 0.0; - } - } - else - { VASCBE = MAX_EXP; - dVASCBE_dVg = dVASCBE_dVd = dVASCBE_dVb = 0.0; - } - -/* Calculate Ids */ - CoxWovL = model->BSIM3cox * Weff / Leff; - beta = ueff * CoxWovL; - dbeta_dVg = CoxWovL * dueff_dVg + beta * dWeff_dVg / Weff; - dbeta_dVd = CoxWovL * dueff_dVd; - dbeta_dVb = CoxWovL * dueff_dVb + beta * dWeff_dVb / Weff; - - T0 = 1.0 - 0.5 * Abulk * Vdseff / Vgst2Vtm; - dT0_dVg = -0.5 * (Abulk * dVdseff_dVg - - Abulk * Vdseff / Vgst2Vtm + Vdseff * dAbulk_dVg) / Vgst2Vtm; - dT0_dVd = -0.5 * Abulk * dVdseff_dVd / Vgst2Vtm; - dT0_dVb = -0.5 * (Abulk * dVdseff_dVb + dAbulk_dVb * Vdseff) - / Vgst2Vtm; - - fgche1 = Vgsteff * T0; - dfgche1_dVg = Vgsteff * dT0_dVg + T0; - dfgche1_dVd = Vgsteff * dT0_dVd; - dfgche1_dVb = Vgsteff * dT0_dVb; - - T9 = Vdseff / EsatL; - fgche2 = 1.0 + T9; - dfgche2_dVg = (dVdseff_dVg - T9 * dEsatL_dVg) / EsatL; - dfgche2_dVd = (dVdseff_dVd - T9 * dEsatL_dVd) / EsatL; - dfgche2_dVb = (dVdseff_dVb - T9 * dEsatL_dVb) / EsatL; - - gche = beta * fgche1 / fgche2; - dgche_dVg = (beta * dfgche1_dVg + fgche1 * dbeta_dVg - - gche * dfgche2_dVg) / fgche2; - dgche_dVd = (beta * dfgche1_dVd + fgche1 * dbeta_dVd - - gche * dfgche2_dVd) / fgche2; - dgche_dVb = (beta * dfgche1_dVb + fgche1 * dbeta_dVb - - gche * dfgche2_dVb) / fgche2; - - T0 = 1.0 + gche * Rds; - T9 = Vdseff / T0; - Idl = gche * T9; - - dIdl_dVg = (gche * dVdseff_dVg + T9 * dgche_dVg) / T0 - - Idl * gche / T0 * dRds_dVg ; - - dIdl_dVd = (gche * dVdseff_dVd + T9 * dgche_dVd) / T0; - dIdl_dVb = (gche * dVdseff_dVb + T9 * dgche_dVb - - Idl * dRds_dVb * gche) / T0; - - T9 = diffVds / Va; - T0 = 1.0 + T9; - Idsa = Idl * T0; - dIdsa_dVg = T0 * dIdl_dVg - Idl * (dVdseff_dVg + T9 * dVa_dVg) / Va; - dIdsa_dVd = T0 * dIdl_dVd + Idl * (1.0 - dVdseff_dVd - - T9 * dVa_dVd) / Va; - dIdsa_dVb = T0 * dIdl_dVb - Idl * (dVdseff_dVb + T9 * dVa_dVb) / Va; - - T9 = diffVds / VASCBE; - T0 = 1.0 + T9; - Ids = Idsa * T0; - - Gm = T0 * dIdsa_dVg - Idsa * (dVdseff_dVg + T9 * dVASCBE_dVg) / VASCBE; - Gds = T0 * dIdsa_dVd + Idsa * (1.0 - dVdseff_dVd - - T9 * dVASCBE_dVd) / VASCBE; - Gmb = T0 * dIdsa_dVb - Idsa * (dVdseff_dVb - + T9 * dVASCBE_dVb) / VASCBE; - - Gds += Gm * dVgsteff_dVd; - Gmb += Gm * dVgsteff_dVb; - Gm *= dVgsteff_dVg; - Gmb *= dVbseff_dVb; - - /* Substrate current begins */ - tmp = pParam->BSIM3alpha0 + pParam->BSIM3alpha1 * Leff; - if ((tmp <= 0.0) || (pParam->BSIM3beta0 <= 0.0)) - { Isub = Gbd = Gbb = Gbg = 0.0; - } - else - { T2 = tmp / Leff; - if (diffVds > pParam->BSIM3beta0 / EXP_THRESHOLD) - { T0 = -pParam->BSIM3beta0 / diffVds; - T1 = T2 * diffVds * exp(T0); - T3 = T1 / diffVds * (T0 - 1.0); - dT1_dVg = T3 * dVdseff_dVg; - dT1_dVd = T3 * (dVdseff_dVd - 1.0); - dT1_dVb = T3 * dVdseff_dVb; - } - else - { T3 = T2 * MIN_EXP; - T1 = T3 * diffVds; - dT1_dVg = -T3 * dVdseff_dVg; - dT1_dVd = T3 * (1.0 - dVdseff_dVd); - dT1_dVb = -T3 * dVdseff_dVb; - } - Isub = T1 * Idsa; - Gbg = T1 * dIdsa_dVg + Idsa * dT1_dVg; - Gbd = T1 * dIdsa_dVd + Idsa * dT1_dVd; - Gbb = T1 * dIdsa_dVb + Idsa * dT1_dVb; - - Gbd += Gbg * dVgsteff_dVd; - Gbb += Gbg * dVgsteff_dVb; - Gbg *= dVgsteff_dVg; - Gbb *= dVbseff_dVb; /* bug fixing */ - } - - cdrain = Ids; - here->BSIM3gds = Gds; - here->BSIM3gm = Gm; - here->BSIM3gmbs = Gmb; - - here->BSIM3gbbs = Gbb; - here->BSIM3gbgs = Gbg; - here->BSIM3gbds = Gbd; - - here->BSIM3csub = Isub; - - /* BSIM3 thermal noise Qinv calculated from all capMod - * 0, 1, 2 & 3 stored in here->BSIM3qinv 1/1998 */ - - if ((model->BSIM3xpart < 0) || (!ChargeComputationNeeded)) - { qgate = qdrn = qsrc = qbulk = 0.0; - here->BSIM3cggb = here->BSIM3cgsb = here->BSIM3cgdb = 0.0; - here->BSIM3cdgb = here->BSIM3cdsb = here->BSIM3cddb = 0.0; - here->BSIM3cbgb = here->BSIM3cbsb = here->BSIM3cbdb = 0.0; - here->BSIM3cqdb = here->BSIM3cqsb = here->BSIM3cqgb - = here->BSIM3cqbb = 0.0; - here->BSIM3gtau = 0.0; - goto finished; - } - else if (model->BSIM3capMod == 0) - { - if (Vbseff < 0.0) - { Vbseff = Vbs; - dVbseff_dVb = 1.0; - } - else - { Vbseff = pParam->BSIM3phi - Phis; - dVbseff_dVb = -dPhis_dVb; - } - - Vfb = pParam->BSIM3vfbcv; - Vth = Vfb + pParam->BSIM3phi + pParam->BSIM3k1ox * sqrtPhis; - Vgst = Vgs_eff - Vth; - dVth_dVb = pParam->BSIM3k1ox * dsqrtPhis_dVb; - dVgst_dVb = -dVth_dVb; - dVgst_dVg = dVgs_eff_dVg; - - CoxWL = model->BSIM3cox * pParam->BSIM3weffCV - * pParam->BSIM3leffCV; - Arg1 = Vgs_eff - Vbseff - Vfb; - - if (Arg1 <= 0.0) - { qgate = CoxWL * Arg1; - qbulk = -qgate; - qdrn = 0.0; - - here->BSIM3cggb = CoxWL * dVgs_eff_dVg; - here->BSIM3cgdb = 0.0; - here->BSIM3cgsb = CoxWL * (dVbseff_dVb - dVgs_eff_dVg); - - here->BSIM3cdgb = 0.0; - here->BSIM3cddb = 0.0; - here->BSIM3cdsb = 0.0; - - here->BSIM3cbgb = -CoxWL * dVgs_eff_dVg; - here->BSIM3cbdb = 0.0; - here->BSIM3cbsb = -here->BSIM3cgsb; - here->BSIM3qinv = 0.0; - } - else if (Vgst <= 0.0) - { T1 = 0.5 * pParam->BSIM3k1ox; - T2 = sqrt(T1 * T1 + Arg1); - qgate = CoxWL * pParam->BSIM3k1ox * (T2 - T1); - qbulk = -qgate; - qdrn = 0.0; - - T0 = CoxWL * T1 / T2; - here->BSIM3cggb = T0 * dVgs_eff_dVg; - here->BSIM3cgdb = 0.0; - here->BSIM3cgsb = T0 * (dVbseff_dVb - dVgs_eff_dVg); - - here->BSIM3cdgb = 0.0; - here->BSIM3cddb = 0.0; - here->BSIM3cdsb = 0.0; - - here->BSIM3cbgb = -here->BSIM3cggb; - here->BSIM3cbdb = 0.0; - here->BSIM3cbsb = -here->BSIM3cgsb; - here->BSIM3qinv = 0.0; - } - else - { One_Third_CoxWL = CoxWL / 3.0; - Two_Third_CoxWL = 2.0 * One_Third_CoxWL; - - AbulkCV = Abulk0 * pParam->BSIM3abulkCVfactor; - dAbulkCV_dVb = pParam->BSIM3abulkCVfactor * dAbulk0_dVb; - Vdsat = Vgst / AbulkCV; - dVdsat_dVg = dVgs_eff_dVg / AbulkCV; - dVdsat_dVb = - (Vdsat * dAbulkCV_dVb + dVth_dVb)/ AbulkCV; - - if (model->BSIM3xpart > 0.5) - { /* 0/100 Charge partition model */ - if (Vdsat <= Vds) - { /* saturation region */ - T1 = Vdsat / 3.0; - qgate = CoxWL * (Vgs_eff - Vfb - - pParam->BSIM3phi - T1); - T2 = -Two_Third_CoxWL * Vgst; - qbulk = -(qgate + T2); - qdrn = 0.0; - - here->BSIM3cggb = One_Third_CoxWL * (3.0 - - dVdsat_dVg) * dVgs_eff_dVg; - T2 = -One_Third_CoxWL * dVdsat_dVb; - here->BSIM3cgsb = -(here->BSIM3cggb + T2); - here->BSIM3cgdb = 0.0; - - here->BSIM3cdgb = 0.0; - here->BSIM3cddb = 0.0; - here->BSIM3cdsb = 0.0; - - here->BSIM3cbgb = -(here->BSIM3cggb - - Two_Third_CoxWL * dVgs_eff_dVg); - T3 = -(T2 + Two_Third_CoxWL * dVth_dVb); - here->BSIM3cbsb = -(here->BSIM3cbgb + T3); - here->BSIM3cbdb = 0.0; - here->BSIM3qinv = -(qgate + qbulk); - } - else - { /* linear region */ - Alphaz = Vgst / Vdsat; - T1 = 2.0 * Vdsat - Vds; - T2 = Vds / (3.0 * T1); - T3 = T2 * Vds; - T9 = 0.25 * CoxWL; - T4 = T9 * Alphaz; - T7 = 2.0 * Vds - T1 - 3.0 * T3; - T8 = T3 - T1 - 2.0 * Vds; - qgate = CoxWL * (Vgs_eff - Vfb - - pParam->BSIM3phi - 0.5 * (Vds - T3)); - T10 = T4 * T8; - qdrn = T4 * T7; - qbulk = -(qgate + qdrn + T10); - - T5 = T3 / T1; - here->BSIM3cggb = CoxWL * (1.0 - T5 * dVdsat_dVg) - * dVgs_eff_dVg; - T11 = -CoxWL * T5 * dVdsat_dVb; - here->BSIM3cgdb = CoxWL * (T2 - 0.5 + 0.5 * T5); - here->BSIM3cgsb = -(here->BSIM3cggb + T11 - + here->BSIM3cgdb); - T6 = 1.0 / Vdsat; - dAlphaz_dVg = T6 * (1.0 - Alphaz * dVdsat_dVg); - dAlphaz_dVb = -T6 * (dVth_dVb + Alphaz * dVdsat_dVb); - T7 = T9 * T7; - T8 = T9 * T8; - T9 = 2.0 * T4 * (1.0 - 3.0 * T5); - here->BSIM3cdgb = (T7 * dAlphaz_dVg - T9 - * dVdsat_dVg) * dVgs_eff_dVg; - T12 = T7 * dAlphaz_dVb - T9 * dVdsat_dVb; - here->BSIM3cddb = T4 * (3.0 - 6.0 * T2 - 3.0 * T5); - here->BSIM3cdsb = -(here->BSIM3cdgb + T12 - + here->BSIM3cddb); - - T9 = 2.0 * T4 * (1.0 + T5); - T10 = (T8 * dAlphaz_dVg - T9 * dVdsat_dVg) - * dVgs_eff_dVg; - T11 = T8 * dAlphaz_dVb - T9 * dVdsat_dVb; - T12 = T4 * (2.0 * T2 + T5 - 1.0); - T0 = -(T10 + T11 + T12); - - here->BSIM3cbgb = -(here->BSIM3cggb - + here->BSIM3cdgb + T10); - here->BSIM3cbdb = -(here->BSIM3cgdb - + here->BSIM3cddb + T12); - here->BSIM3cbsb = -(here->BSIM3cgsb - + here->BSIM3cdsb + T0); - here->BSIM3qinv = -(qgate + qbulk); - } - } - else if (model->BSIM3xpart < 0.5) - { /* 40/60 Charge partition model */ - if (Vds >= Vdsat) - { /* saturation region */ - T1 = Vdsat / 3.0; - qgate = CoxWL * (Vgs_eff - Vfb - - pParam->BSIM3phi - T1); - T2 = -Two_Third_CoxWL * Vgst; - qbulk = -(qgate + T2); - qdrn = 0.4 * T2; - - here->BSIM3cggb = One_Third_CoxWL * (3.0 - - dVdsat_dVg) * dVgs_eff_dVg; - T2 = -One_Third_CoxWL * dVdsat_dVb; - here->BSIM3cgsb = -(here->BSIM3cggb + T2); - here->BSIM3cgdb = 0.0; - - T3 = 0.4 * Two_Third_CoxWL; - here->BSIM3cdgb = -T3 * dVgs_eff_dVg; - here->BSIM3cddb = 0.0; - T4 = T3 * dVth_dVb; - here->BSIM3cdsb = -(T4 + here->BSIM3cdgb); - - here->BSIM3cbgb = -(here->BSIM3cggb - - Two_Third_CoxWL * dVgs_eff_dVg); - T3 = -(T2 + Two_Third_CoxWL * dVth_dVb); - here->BSIM3cbsb = -(here->BSIM3cbgb + T3); - here->BSIM3cbdb = 0.0; - here->BSIM3qinv = -(qgate + qbulk); - } - else - { /* linear region */ - Alphaz = Vgst / Vdsat; - T1 = 2.0 * Vdsat - Vds; - T2 = Vds / (3.0 * T1); - T3 = T2 * Vds; - T9 = 0.25 * CoxWL; - T4 = T9 * Alphaz; - qgate = CoxWL * (Vgs_eff - Vfb - pParam->BSIM3phi - - 0.5 * (Vds - T3)); - - T5 = T3 / T1; - here->BSIM3cggb = CoxWL * (1.0 - T5 * dVdsat_dVg) - * dVgs_eff_dVg; - tmp = -CoxWL * T5 * dVdsat_dVb; - here->BSIM3cgdb = CoxWL * (T2 - 0.5 + 0.5 * T5); - here->BSIM3cgsb = -(here->BSIM3cggb - + here->BSIM3cgdb + tmp); - - T6 = 1.0 / Vdsat; - dAlphaz_dVg = T6 * (1.0 - Alphaz * dVdsat_dVg); - dAlphaz_dVb = -T6 * (dVth_dVb + Alphaz * dVdsat_dVb); - - T6 = 8.0 * Vdsat * Vdsat - 6.0 * Vdsat * Vds - + 1.2 * Vds * Vds; - T8 = T2 / T1; - T7 = Vds - T1 - T8 * T6; - qdrn = T4 * T7; - T7 *= T9; - tmp = T8 / T1; - tmp1 = T4 * (2.0 - 4.0 * tmp * T6 - + T8 * (16.0 * Vdsat - 6.0 * Vds)); - - here->BSIM3cdgb = (T7 * dAlphaz_dVg - tmp1 - * dVdsat_dVg) * dVgs_eff_dVg; - T10 = T7 * dAlphaz_dVb - tmp1 * dVdsat_dVb; - here->BSIM3cddb = T4 * (2.0 - (1.0 / (3.0 * T1 - * T1) + 2.0 * tmp) * T6 + T8 - * (6.0 * Vdsat - 2.4 * Vds)); - here->BSIM3cdsb = -(here->BSIM3cdgb - + T10 + here->BSIM3cddb); - - T7 = 2.0 * (T1 + T3); - qbulk = -(qgate - T4 * T7); - T7 *= T9; - T0 = 4.0 * T4 * (1.0 - T5); - T12 = (-T7 * dAlphaz_dVg - here->BSIM3cdgb - - T0 * dVdsat_dVg) * dVgs_eff_dVg; - T11 = -T7 * dAlphaz_dVb - T10 - T0 * dVdsat_dVb; - T10 = -4.0 * T4 * (T2 - 0.5 + 0.5 * T5) - - here->BSIM3cddb; - tmp = -(T10 + T11 + T12); - - here->BSIM3cbgb = -(here->BSIM3cggb - + here->BSIM3cdgb + T12); - here->BSIM3cbdb = -(here->BSIM3cgdb - + here->BSIM3cddb + T10); /* bug fix */ - here->BSIM3cbsb = -(here->BSIM3cgsb - + here->BSIM3cdsb + tmp); - here->BSIM3qinv = -(qgate + qbulk); - } - } - else - { /* 50/50 partitioning */ - if (Vds >= Vdsat) - { /* saturation region */ - T1 = Vdsat / 3.0; - qgate = CoxWL * (Vgs_eff - Vfb - - pParam->BSIM3phi - T1); - T2 = -Two_Third_CoxWL * Vgst; - qbulk = -(qgate + T2); - qdrn = 0.5 * T2; - - here->BSIM3cggb = One_Third_CoxWL * (3.0 - - dVdsat_dVg) * dVgs_eff_dVg; - T2 = -One_Third_CoxWL * dVdsat_dVb; - here->BSIM3cgsb = -(here->BSIM3cggb + T2); - here->BSIM3cgdb = 0.0; - - here->BSIM3cdgb = -One_Third_CoxWL * dVgs_eff_dVg; - here->BSIM3cddb = 0.0; - T4 = One_Third_CoxWL * dVth_dVb; - here->BSIM3cdsb = -(T4 + here->BSIM3cdgb); - - here->BSIM3cbgb = -(here->BSIM3cggb - - Two_Third_CoxWL * dVgs_eff_dVg); - T3 = -(T2 + Two_Third_CoxWL * dVth_dVb); - here->BSIM3cbsb = -(here->BSIM3cbgb + T3); - here->BSIM3cbdb = 0.0; - here->BSIM3qinv = -(qgate + qbulk); - } - else - { /* linear region */ - Alphaz = Vgst / Vdsat; - T1 = 2.0 * Vdsat - Vds; - T2 = Vds / (3.0 * T1); - T3 = T2 * Vds; - T9 = 0.25 * CoxWL; - T4 = T9 * Alphaz; - qgate = CoxWL * (Vgs_eff - Vfb - pParam->BSIM3phi - - 0.5 * (Vds - T3)); - - T5 = T3 / T1; - here->BSIM3cggb = CoxWL * (1.0 - T5 * dVdsat_dVg) - * dVgs_eff_dVg; - tmp = -CoxWL * T5 * dVdsat_dVb; - here->BSIM3cgdb = CoxWL * (T2 - 0.5 + 0.5 * T5); - here->BSIM3cgsb = -(here->BSIM3cggb - + here->BSIM3cgdb + tmp); - - T6 = 1.0 / Vdsat; - dAlphaz_dVg = T6 * (1.0 - Alphaz * dVdsat_dVg); - dAlphaz_dVb = -T6 * (dVth_dVb + Alphaz * dVdsat_dVb); - - T7 = T1 + T3; - qdrn = -T4 * T7; - qbulk = - (qgate + qdrn + qdrn); - T7 *= T9; - T0 = T4 * (2.0 * T5 - 2.0); - - here->BSIM3cdgb = (T0 * dVdsat_dVg - T7 - * dAlphaz_dVg) * dVgs_eff_dVg; - T12 = T0 * dVdsat_dVb - T7 * dAlphaz_dVb; - here->BSIM3cddb = T4 * (1.0 - 2.0 * T2 - T5); - here->BSIM3cdsb = -(here->BSIM3cdgb + T12 - + here->BSIM3cddb); - - here->BSIM3cbgb = -(here->BSIM3cggb - + 2.0 * here->BSIM3cdgb); - here->BSIM3cbdb = -(here->BSIM3cgdb - + 2.0 * here->BSIM3cddb); - here->BSIM3cbsb = -(here->BSIM3cgsb - + 2.0 * here->BSIM3cdsb); - here->BSIM3qinv = -(qgate + qbulk); - } - } - } - } - else - { if (Vbseff < 0.0) - { VbseffCV = Vbseff; - dVbseffCV_dVb = 1.0; - } - else - { VbseffCV = pParam->BSIM3phi - Phis; - dVbseffCV_dVb = -dPhis_dVb; - } - - CoxWL = model->BSIM3cox * pParam->BSIM3weffCV - * pParam->BSIM3leffCV; - - /* Seperate VgsteffCV with noff and voffcv */ - noff = n * pParam->BSIM3noff; - dnoff_dVd = pParam->BSIM3noff * dn_dVd; - dnoff_dVb = pParam->BSIM3noff * dn_dVb; - T0 = Vtm * noff; - voffcv = pParam->BSIM3voffcv; - VgstNVt = (Vgst - voffcv) / T0; - - if (VgstNVt > EXP_THRESHOLD) - { Vgsteff = Vgst - voffcv; - dVgsteff_dVg = dVgs_eff_dVg; - dVgsteff_dVd = -dVth_dVd; - dVgsteff_dVb = -dVth_dVb; - } - else if (VgstNVt < -EXP_THRESHOLD) - { Vgsteff = T0 * log(1.0 + MIN_EXP); - dVgsteff_dVg = 0.0; - dVgsteff_dVd = Vgsteff / noff; - dVgsteff_dVb = dVgsteff_dVd * dnoff_dVb; - dVgsteff_dVd *= dnoff_dVd; - } - else - { ExpVgst = exp(VgstNVt); - Vgsteff = T0 * log(1.0 + ExpVgst); - dVgsteff_dVg = ExpVgst / (1.0 + ExpVgst); - dVgsteff_dVd = -dVgsteff_dVg * (dVth_dVd + (Vgst - voffcv) - / noff * dnoff_dVd) + Vgsteff / noff * dnoff_dVd; - dVgsteff_dVb = -dVgsteff_dVg * (dVth_dVb + (Vgst - voffcv) - / noff * dnoff_dVb) + Vgsteff / noff * dnoff_dVb; - dVgsteff_dVg *= dVgs_eff_dVg; - } /* End of VgsteffCV */ - - if (model->BSIM3capMod == 1) - { Vfb = here->BSIM3vfbzb; - Arg1 = Vgs_eff - VbseffCV - Vfb - Vgsteff; - - if (Arg1 <= 0.0) - { qgate = CoxWL * Arg1; - Cgg = CoxWL * (dVgs_eff_dVg - dVgsteff_dVg); - Cgd = -CoxWL * dVgsteff_dVd; - Cgb = -CoxWL * (dVbseffCV_dVb + dVgsteff_dVb); - } - else - { T0 = 0.5 * pParam->BSIM3k1ox; - T1 = sqrt(T0 * T0 + Arg1); - T2 = CoxWL * T0 / T1; - - qgate = CoxWL * pParam->BSIM3k1ox * (T1 - T0); - - Cgg = T2 * (dVgs_eff_dVg - dVgsteff_dVg); - Cgd = -T2 * dVgsteff_dVd; - Cgb = -T2 * (dVbseffCV_dVb + dVgsteff_dVb); - } - qbulk = -qgate; - Cbg = -Cgg; - Cbd = -Cgd; - Cbb = -Cgb; - - One_Third_CoxWL = CoxWL / 3.0; - Two_Third_CoxWL = 2.0 * One_Third_CoxWL; - AbulkCV = Abulk0 * pParam->BSIM3abulkCVfactor; - dAbulkCV_dVb = pParam->BSIM3abulkCVfactor * dAbulk0_dVb; - VdsatCV = Vgsteff / AbulkCV; - if (VdsatCV < Vds) - { dVdsatCV_dVg = 1.0 / AbulkCV; - dVdsatCV_dVb = -VdsatCV * dAbulkCV_dVb / AbulkCV; - T0 = Vgsteff - VdsatCV / 3.0; - dT0_dVg = 1.0 - dVdsatCV_dVg / 3.0; - dT0_dVb = -dVdsatCV_dVb / 3.0; - qgate += CoxWL * T0; - Cgg1 = CoxWL * dT0_dVg; - Cgb1 = CoxWL * dT0_dVb + Cgg1 * dVgsteff_dVb; - Cgd1 = Cgg1 * dVgsteff_dVd; - Cgg1 *= dVgsteff_dVg; - Cgg += Cgg1; - Cgb += Cgb1; - Cgd += Cgd1; - - T0 = VdsatCV - Vgsteff; - dT0_dVg = dVdsatCV_dVg - 1.0; - dT0_dVb = dVdsatCV_dVb; - qbulk += One_Third_CoxWL * T0; - Cbg1 = One_Third_CoxWL * dT0_dVg; - Cbb1 = One_Third_CoxWL * dT0_dVb + Cbg1 * dVgsteff_dVb; - Cbd1 = Cbg1 * dVgsteff_dVd; - Cbg1 *= dVgsteff_dVg; - Cbg += Cbg1; - Cbb += Cbb1; - Cbd += Cbd1; - - if (model->BSIM3xpart > 0.5) - T0 = -Two_Third_CoxWL; - else if (model->BSIM3xpart < 0.5) - T0 = -0.4 * CoxWL; - else - T0 = -One_Third_CoxWL; - - qsrc = T0 * Vgsteff; - Csg = T0 * dVgsteff_dVg; - Csb = T0 * dVgsteff_dVb; - Csd = T0 * dVgsteff_dVd; - Cgb *= dVbseff_dVb; - Cbb *= dVbseff_dVb; - Csb *= dVbseff_dVb; - } - else - { T0 = AbulkCV * Vds; - T1 = 12.0 * (Vgsteff - 0.5 * T0 + 1.e-20); - T2 = Vds / T1; - T3 = T0 * T2; - dT3_dVg = -12.0 * T2 * T2 * AbulkCV; - dT3_dVd = 6.0 * T0 * (4.0 * Vgsteff - T0) / T1 / T1 - 0.5; - dT3_dVb = 12.0 * T2 * T2 * dAbulkCV_dVb * Vgsteff; - - qgate += CoxWL * (Vgsteff - 0.5 * Vds + T3); - Cgg1 = CoxWL * (1.0 + dT3_dVg); - Cgb1 = CoxWL * dT3_dVb + Cgg1 * dVgsteff_dVb; - Cgd1 = CoxWL * dT3_dVd + Cgg1 * dVgsteff_dVd; - Cgg1 *= dVgsteff_dVg; - Cgg += Cgg1; - Cgb += Cgb1; - Cgd += Cgd1; - - qbulk += CoxWL * (1.0 - AbulkCV) * (0.5 * Vds - T3); - Cbg1 = -CoxWL * ((1.0 - AbulkCV) * dT3_dVg); - Cbb1 = -CoxWL * ((1.0 - AbulkCV) * dT3_dVb - + (0.5 * Vds - T3) * dAbulkCV_dVb) - + Cbg1 * dVgsteff_dVb; - Cbd1 = -CoxWL * (1.0 - AbulkCV) * dT3_dVd - + Cbg1 * dVgsteff_dVd; - Cbg1 *= dVgsteff_dVg; - Cbg += Cbg1; - Cbb += Cbb1; - Cbd += Cbd1; - - if (model->BSIM3xpart > 0.5) - { /* 0/100 Charge petition model */ - T1 = T1 + T1; - qsrc = -CoxWL * (0.5 * Vgsteff + 0.25 * T0 - - T0 * T0 / T1); - Csg = -CoxWL * (0.5 + 24.0 * T0 * Vds / T1 / T1 - * AbulkCV); - Csb = -CoxWL * (0.25 * Vds * dAbulkCV_dVb - - 12.0 * T0 * Vds / T1 / T1 * (4.0 * Vgsteff - T0) - * dAbulkCV_dVb) + Csg * dVgsteff_dVb; - Csd = -CoxWL * (0.25 * AbulkCV - 12.0 * AbulkCV * T0 - / T1 / T1 * (4.0 * Vgsteff - T0)) - + Csg * dVgsteff_dVd; - Csg *= dVgsteff_dVg; - } - else if (model->BSIM3xpart < 0.5) - { /* 40/60 Charge petition model */ - T1 = T1 / 12.0; - T2 = 0.5 * CoxWL / (T1 * T1); - T3 = Vgsteff * (2.0 * T0 * T0 / 3.0 + Vgsteff - * (Vgsteff - 4.0 * T0 / 3.0)) - - 2.0 * T0 * T0 * T0 / 15.0; - qsrc = -T2 * T3; - T4 = 4.0 / 3.0 * Vgsteff * (Vgsteff - T0) - + 0.4 * T0 * T0; - Csg = -2.0 * qsrc / T1 - T2 * (Vgsteff * (3.0 - * Vgsteff - 8.0 * T0 / 3.0) - + 2.0 * T0 * T0 / 3.0); - Csb = (qsrc / T1 * Vds + T2 * T4 * Vds) * dAbulkCV_dVb - + Csg * dVgsteff_dVb; - Csd = (qsrc / T1 + T2 * T4) * AbulkCV - + Csg * dVgsteff_dVd; - Csg *= dVgsteff_dVg; - } - else - { /* 50/50 Charge petition model */ - qsrc = -0.5 * (qgate + qbulk); - Csg = -0.5 * (Cgg1 + Cbg1); - Csb = -0.5 * (Cgb1 + Cbb1); - Csd = -0.5 * (Cgd1 + Cbd1); - } - Cgb *= dVbseff_dVb; - Cbb *= dVbseff_dVb; - Csb *= dVbseff_dVb; - } - qdrn = -(qgate + qbulk + qsrc); - here->BSIM3cggb = Cgg; - here->BSIM3cgsb = -(Cgg + Cgd + Cgb); - here->BSIM3cgdb = Cgd; - here->BSIM3cdgb = -(Cgg + Cbg + Csg); - here->BSIM3cdsb = (Cgg + Cgd + Cgb + Cbg + Cbd + Cbb - + Csg + Csd + Csb); - here->BSIM3cddb = -(Cgd + Cbd + Csd); - here->BSIM3cbgb = Cbg; - here->BSIM3cbsb = -(Cbg + Cbd + Cbb); - here->BSIM3cbdb = Cbd; - here->BSIM3qinv = -(qgate + qbulk); - } - - else if (model->BSIM3capMod == 2) - { Vfb = here->BSIM3vfbzb; - V3 = Vfb - Vgs_eff + VbseffCV - DELTA_3; - if (Vfb <= 0.0) - { T0 = sqrt(V3 * V3 - 4.0 * DELTA_3 * Vfb); - T2 = -DELTA_3 / T0; - } - else - { T0 = sqrt(V3 * V3 + 4.0 * DELTA_3 * Vfb); - T2 = DELTA_3 / T0; - } - - T1 = 0.5 * (1.0 + V3 / T0); - Vfbeff = Vfb - 0.5 * (V3 + T0); - dVfbeff_dVg = T1 * dVgs_eff_dVg; - dVfbeff_dVb = -T1 * dVbseffCV_dVb; - Qac0 = CoxWL * (Vfbeff - Vfb); - dQac0_dVg = CoxWL * dVfbeff_dVg; - dQac0_dVb = CoxWL * dVfbeff_dVb; - - T0 = 0.5 * pParam->BSIM3k1ox; - T3 = Vgs_eff - Vfbeff - VbseffCV - Vgsteff; - if (pParam->BSIM3k1ox == 0.0) - { T1 = 0.0; - T2 = 0.0; - } - else if (T3 < 0.0) - { T1 = T0 + T3 / pParam->BSIM3k1ox; - T2 = CoxWL; - } - else - { T1 = sqrt(T0 * T0 + T3); - T2 = CoxWL * T0 / T1; - } - - Qsub0 = CoxWL * pParam->BSIM3k1ox * (T1 - T0); - - dQsub0_dVg = T2 * (dVgs_eff_dVg - dVfbeff_dVg - dVgsteff_dVg); - dQsub0_dVd = -T2 * dVgsteff_dVd; - dQsub0_dVb = -T2 * (dVfbeff_dVb + dVbseffCV_dVb - + dVgsteff_dVb); - - AbulkCV = Abulk0 * pParam->BSIM3abulkCVfactor; - dAbulkCV_dVb = pParam->BSIM3abulkCVfactor * dAbulk0_dVb; - VdsatCV = Vgsteff / AbulkCV; - - V4 = VdsatCV - Vds - DELTA_4; - T0 = sqrt(V4 * V4 + 4.0 * DELTA_4 * VdsatCV); - VdseffCV = VdsatCV - 0.5 * (V4 + T0); - T1 = 0.5 * (1.0 + V4 / T0); - T2 = DELTA_4 / T0; - T3 = (1.0 - T1 - T2) / AbulkCV; - dVdseffCV_dVg = T3; - dVdseffCV_dVd = T1; - dVdseffCV_dVb = -T3 * VdsatCV * dAbulkCV_dVb; - /* Added to eliminate non-zero VdseffCV at Vds=0.0 */ - if (Vds == 0.0) - { VdseffCV = 0.0; - dVdseffCV_dVg = 0.0; - dVdseffCV_dVb = 0.0; - } - - T0 = AbulkCV * VdseffCV; - T1 = 12.0 * (Vgsteff - 0.5 * T0 + 1e-20); - T2 = VdseffCV / T1; - T3 = T0 * T2; - - T4 = (1.0 - 12.0 * T2 * T2 * AbulkCV); - T5 = (6.0 * T0 * (4.0 * Vgsteff - T0) / (T1 * T1) - 0.5); - T6 = 12.0 * T2 * T2 * Vgsteff; - - qinoi = -CoxWL * (Vgsteff - 0.5 * T0 + AbulkCV * T3); - qgate = CoxWL * (Vgsteff - 0.5 * VdseffCV + T3); - Cgg1 = CoxWL * (T4 + T5 * dVdseffCV_dVg); - Cgd1 = CoxWL * T5 * dVdseffCV_dVd + Cgg1 * dVgsteff_dVd; - Cgb1 = CoxWL * (T5 * dVdseffCV_dVb + T6 * dAbulkCV_dVb) - + Cgg1 * dVgsteff_dVb; - Cgg1 *= dVgsteff_dVg; - - T7 = 1.0 - AbulkCV; - qbulk = CoxWL * T7 * (0.5 * VdseffCV - T3); - T4 = -T7 * (T4 - 1.0); - T5 = -T7 * T5; - T6 = -(T7 * T6 + (0.5 * VdseffCV - T3)); - Cbg1 = CoxWL * (T4 + T5 * dVdseffCV_dVg); - Cbd1 = CoxWL * T5 * dVdseffCV_dVd + Cbg1 * dVgsteff_dVd; - Cbb1 = CoxWL * (T5 * dVdseffCV_dVb + T6 * dAbulkCV_dVb) - + Cbg1 * dVgsteff_dVb; - Cbg1 *= dVgsteff_dVg; - - if (model->BSIM3xpart > 0.5) - { /* 0/100 Charge petition model */ - T1 = T1 + T1; - qsrc = -CoxWL * (0.5 * Vgsteff + 0.25 * T0 - - T0 * T0 / T1); - T7 = (4.0 * Vgsteff - T0) / (T1 * T1); - T4 = -(0.5 + 24.0 * T0 * T0 / (T1 * T1)); - T5 = -(0.25 * AbulkCV - 12.0 * AbulkCV * T0 * T7); - T6 = -(0.25 * VdseffCV - 12.0 * T0 * VdseffCV * T7); - Csg = CoxWL * (T4 + T5 * dVdseffCV_dVg); - Csd = CoxWL * T5 * dVdseffCV_dVd + Csg * dVgsteff_dVd; - Csb = CoxWL * (T5 * dVdseffCV_dVb + T6 * dAbulkCV_dVb) - + Csg * dVgsteff_dVb; - Csg *= dVgsteff_dVg; - } - else if (model->BSIM3xpart < 0.5) - { /* 40/60 Charge petition model */ - T1 = T1 / 12.0; - T2 = 0.5 * CoxWL / (T1 * T1); - T3 = Vgsteff * (2.0 * T0 * T0 / 3.0 + Vgsteff - * (Vgsteff - 4.0 * T0 / 3.0)) - - 2.0 * T0 * T0 * T0 / 15.0; - qsrc = -T2 * T3; - T7 = 4.0 / 3.0 * Vgsteff * (Vgsteff - T0) - + 0.4 * T0 * T0; - T4 = -2.0 * qsrc / T1 - T2 * (Vgsteff * (3.0 - * Vgsteff - 8.0 * T0 / 3.0) - + 2.0 * T0 * T0 / 3.0); - T5 = (qsrc / T1 + T2 * T7) * AbulkCV; - T6 = (qsrc / T1 * VdseffCV + T2 * T7 * VdseffCV); - Csg = (T4 + T5 * dVdseffCV_dVg); - Csd = T5 * dVdseffCV_dVd + Csg * dVgsteff_dVd; - Csb = (T5 * dVdseffCV_dVb + T6 * dAbulkCV_dVb) - + Csg * dVgsteff_dVb; - Csg *= dVgsteff_dVg; - } - else - { /* 50/50 Charge petition model */ - qsrc = -0.5 * (qgate + qbulk); - Csg = -0.5 * (Cgg1 + Cbg1); - Csb = -0.5 * (Cgb1 + Cbb1); - Csd = -0.5 * (Cgd1 + Cbd1); - } - - qgate += Qac0 + Qsub0; - qbulk -= (Qac0 + Qsub0); - qdrn = -(qgate + qbulk + qsrc); - - Cgg = dQac0_dVg + dQsub0_dVg + Cgg1; - Cgd = dQsub0_dVd + Cgd1; - Cgb = dQac0_dVb + dQsub0_dVb + Cgb1; - - Cbg = Cbg1 - dQac0_dVg - dQsub0_dVg; - Cbd = Cbd1 - dQsub0_dVd; - Cbb = Cbb1 - dQac0_dVb - dQsub0_dVb; - - Cgb *= dVbseff_dVb; - Cbb *= dVbseff_dVb; - Csb *= dVbseff_dVb; - - here->BSIM3cggb = Cgg; - here->BSIM3cgsb = -(Cgg + Cgd + Cgb); - here->BSIM3cgdb = Cgd; - here->BSIM3cdgb = -(Cgg + Cbg + Csg); - here->BSIM3cdsb = (Cgg + Cgd + Cgb + Cbg + Cbd + Cbb - + Csg + Csd + Csb); - here->BSIM3cddb = -(Cgd + Cbd + Csd); - here->BSIM3cbgb = Cbg; - here->BSIM3cbsb = -(Cbg + Cbd + Cbb); - here->BSIM3cbdb = Cbd; - here->BSIM3qinv = qinoi; - } - - /* New Charge-Thickness capMod (CTM) begins */ - else if (model->BSIM3capMod == 3) - { V3 = here->BSIM3vfbzb - Vgs_eff + VbseffCV - DELTA_3; - if (here->BSIM3vfbzb <= 0.0) - { T0 = sqrt(V3 * V3 - 4.0 * DELTA_3 * here->BSIM3vfbzb); - T2 = -DELTA_3 / T0; - } - else - { T0 = sqrt(V3 * V3 + 4.0 * DELTA_3 * here->BSIM3vfbzb); - T2 = DELTA_3 / T0; - } - - T1 = 0.5 * (1.0 + V3 / T0); - Vfbeff = here->BSIM3vfbzb - 0.5 * (V3 + T0); - dVfbeff_dVg = T1 * dVgs_eff_dVg; - dVfbeff_dVb = -T1 * dVbseffCV_dVb; - - Cox = model->BSIM3cox; - Tox = 1.0e8 * model->BSIM3tox; - T0 = (Vgs_eff - VbseffCV - here->BSIM3vfbzb) / Tox; - dT0_dVg = dVgs_eff_dVg / Tox; - dT0_dVb = -dVbseffCV_dVb / Tox; - - tmp = T0 * pParam->BSIM3acde; - if ((-EXP_THRESHOLD < tmp) && (tmp < EXP_THRESHOLD)) - { Tcen = pParam->BSIM3ldeb * exp(tmp); - dTcen_dVg = pParam->BSIM3acde * Tcen; - dTcen_dVb = dTcen_dVg * dT0_dVb; - dTcen_dVg *= dT0_dVg; - } - else if (tmp <= -EXP_THRESHOLD) - { Tcen = pParam->BSIM3ldeb * MIN_EXP; - dTcen_dVg = dTcen_dVb = 0.0; - } - else - { Tcen = pParam->BSIM3ldeb * MAX_EXP; - dTcen_dVg = dTcen_dVb = 0.0; - } - - LINK = 1.0e-3 * model->BSIM3tox; - V3 = pParam->BSIM3ldeb - Tcen - LINK; - V4 = sqrt(V3 * V3 + 4.0 * LINK * pParam->BSIM3ldeb); - Tcen = pParam->BSIM3ldeb - 0.5 * (V3 + V4); - T1 = 0.5 * (1.0 + V3 / V4); - dTcen_dVg *= T1; - dTcen_dVb *= T1; - - Ccen = EPSSI / Tcen; - T2 = Cox / (Cox + Ccen); - Coxeff = T2 * Ccen; - T3 = -Ccen / Tcen; - dCoxeff_dVg = T2 * T2 * T3; - dCoxeff_dVb = dCoxeff_dVg * dTcen_dVb; - dCoxeff_dVg *= dTcen_dVg; - CoxWLcen = CoxWL * Coxeff / Cox; - - Qac0 = CoxWLcen * (Vfbeff - here->BSIM3vfbzb); - QovCox = Qac0 / Coxeff; - dQac0_dVg = CoxWLcen * dVfbeff_dVg - + QovCox * dCoxeff_dVg; - dQac0_dVb = CoxWLcen * dVfbeff_dVb - + QovCox * dCoxeff_dVb; - - T0 = 0.5 * pParam->BSIM3k1ox; - T3 = Vgs_eff - Vfbeff - VbseffCV - Vgsteff; - if (pParam->BSIM3k1ox == 0.0) - { T1 = 0.0; - T2 = 0.0; - } - else if (T3 < 0.0) - { T1 = T0 + T3 / pParam->BSIM3k1ox; - T2 = CoxWLcen; - } - else - { T1 = sqrt(T0 * T0 + T3); - T2 = CoxWLcen * T0 / T1; - } - - Qsub0 = CoxWLcen * pParam->BSIM3k1ox * (T1 - T0); - QovCox = Qsub0 / Coxeff; - dQsub0_dVg = T2 * (dVgs_eff_dVg - dVfbeff_dVg - dVgsteff_dVg) - + QovCox * dCoxeff_dVg; - dQsub0_dVd = -T2 * dVgsteff_dVd; - dQsub0_dVb = -T2 * (dVfbeff_dVb + dVbseffCV_dVb + dVgsteff_dVb) - + QovCox * dCoxeff_dVb; - - /* Gate-bias dependent delta Phis begins */ - if (pParam->BSIM3k1ox <= 0.0) - { Denomi = 0.25 * pParam->BSIM3moin * Vtm; - T0 = 0.5 * pParam->BSIM3sqrtPhi; - } - else - { Denomi = pParam->BSIM3moin * Vtm - * pParam->BSIM3k1ox * pParam->BSIM3k1ox; - T0 = pParam->BSIM3k1ox * pParam->BSIM3sqrtPhi; - } - T1 = 2.0 * T0 + Vgsteff; - - DeltaPhi = Vtm * log(1.0 + T1 * Vgsteff / Denomi); - dDeltaPhi_dVg = 2.0 * Vtm * (T1 -T0) / (Denomi + T1 * Vgsteff); - /* End of delta Phis */ - - /* VgDP = Vgsteff - DeltaPhi */ - T0 = Vgsteff - DeltaPhi - 0.001; - dT0_dVg = 1.0 - dDeltaPhi_dVg; - T1 = sqrt(T0 * T0 + Vgsteff * 0.004); - VgDP = 0.5 * (T0 + T1); - dVgDP_dVg = 0.5 * (dT0_dVg + (T0 * dT0_dVg + 0.002) / T1); - - T3 = 4.0 * (Vth - here->BSIM3vfbzb - pParam->BSIM3phi); - Tox += Tox; - if (T3 >= 0.0) - { T0 = (Vgsteff + T3) / Tox; - dT0_dVd = (dVgsteff_dVd + 4.0 * dVth_dVd) / Tox; - dT0_dVb = (dVgsteff_dVb + 4.0 * dVth_dVb) / Tox; - } - else - { T0 = (Vgsteff + 1.0e-20) / Tox; - dT0_dVd = dVgsteff_dVd / Tox; - dT0_dVb = dVgsteff_dVb / Tox; - } - tmp = exp(0.7 * log(T0)); - T1 = 1.0 + tmp; - T2 = 0.7 * tmp / (T0 * Tox); - Tcen = 1.9e-9 / T1; - dTcen_dVg = -1.9e-9 * T2 / T1 /T1; - dTcen_dVd = Tox * dTcen_dVg; - dTcen_dVb = dTcen_dVd * dT0_dVb; - dTcen_dVd *= dT0_dVd; - dTcen_dVg *= dVgsteff_dVg; - - Ccen = EPSSI / Tcen; - T0 = Cox / (Cox + Ccen); - Coxeff = T0 * Ccen; - T1 = -Ccen / Tcen; - dCoxeff_dVg = T0 * T0 * T1; - dCoxeff_dVd = dCoxeff_dVg * dTcen_dVd; - dCoxeff_dVb = dCoxeff_dVg * dTcen_dVb; - dCoxeff_dVg *= dTcen_dVg; - CoxWLcen = CoxWL * Coxeff / Cox; - - AbulkCV = Abulk0 * pParam->BSIM3abulkCVfactor; - dAbulkCV_dVb = pParam->BSIM3abulkCVfactor * dAbulk0_dVb; - VdsatCV = VgDP / AbulkCV; - T0 = VdsatCV - Vds - DELTA_4; - dT0_dVg = dVgDP_dVg / AbulkCV; - dT0_dVb = -VdsatCV * dAbulkCV_dVb / AbulkCV; - T1 = sqrt(T0 * T0 + 4.0 * DELTA_4 * VdsatCV); - dT1_dVg = (T0 + DELTA_4 + DELTA_4) / T1; - dT1_dVd = -T0 / T1; - dT1_dVb = dT1_dVg * dT0_dVb; - dT1_dVg *= dT0_dVg; - if (T0 >= 0.0) - { VdseffCV = VdsatCV - 0.5 * (T0 + T1); - dVdseffCV_dVg = 0.5 * (dT0_dVg - dT1_dVg); - dVdseffCV_dVd = 0.5 * (1.0 - dT1_dVd); - dVdseffCV_dVb = 0.5 * (dT0_dVb - dT1_dVb); - } - else - { T3 = (DELTA_4 + DELTA_4) / (T1 - T0); - T4 = 1.0 - T3; - T5 = VdsatCV * T3 / (T1 - T0); - VdseffCV = VdsatCV * T4; - dVdseffCV_dVg = dT0_dVg * T4 + T5 * (dT1_dVg - dT0_dVg); - dVdseffCV_dVd = T5 * (dT1_dVd + 1.0); - dVdseffCV_dVb = dT0_dVb * (1.0 - T5) + T5 * dT1_dVb; - } - - /* Added to eliminate non-zero VdseffCV at Vds=0.0 */ - if (Vds == 0.0) - { VdseffCV = 0.0; - dVdseffCV_dVg = 0.0; - dVdseffCV_dVb = 0.0; - } - - T0 = AbulkCV * VdseffCV; - T1 = VgDP; - T2 = 12.0 * (T1 - 0.5 * T0 + 1.0e-20); - T3 = T0 / T2; - T4 = 1.0 - 12.0 * T3 * T3; - T5 = AbulkCV * (6.0 * T0 * (4.0 * T1 - T0) / (T2 * T2) - 0.5); - T6 = T5 * VdseffCV / AbulkCV; - - qgate = qinoi = CoxWLcen * (T1 - T0 * (0.5 - T3)); - QovCox = qgate / Coxeff; - Cgg1 = CoxWLcen * (T4 * dVgDP_dVg - + T5 * dVdseffCV_dVg); - Cgd1 = CoxWLcen * T5 * dVdseffCV_dVd + Cgg1 - * dVgsteff_dVd + QovCox * dCoxeff_dVd; - Cgb1 = CoxWLcen * (T5 * dVdseffCV_dVb + T6 * dAbulkCV_dVb) - + Cgg1 * dVgsteff_dVb + QovCox * dCoxeff_dVb; - Cgg1 = Cgg1 * dVgsteff_dVg + QovCox * dCoxeff_dVg; - - - T7 = 1.0 - AbulkCV; - T8 = T2 * T2; - T9 = 12.0 * T7 * T0 * T0 / (T8 * AbulkCV); - T10 = T9 * dVgDP_dVg; - T11 = -T7 * T5 / AbulkCV; - T12 = -(T9 * T1 / AbulkCV + VdseffCV * (0.5 - T0 / T2)); - - qbulk = CoxWLcen * T7 * (0.5 * VdseffCV - T0 * VdseffCV / T2); - QovCox = qbulk / Coxeff; - Cbg1 = CoxWLcen * (T10 + T11 * dVdseffCV_dVg); - Cbd1 = CoxWLcen * T11 * dVdseffCV_dVd + Cbg1 - * dVgsteff_dVd + QovCox * dCoxeff_dVd; - Cbb1 = CoxWLcen * (T11 * dVdseffCV_dVb + T12 * dAbulkCV_dVb) - + Cbg1 * dVgsteff_dVb + QovCox * dCoxeff_dVb; - Cbg1 = Cbg1 * dVgsteff_dVg + QovCox * dCoxeff_dVg; - - if (model->BSIM3xpart > 0.5) - { /* 0/100 partition */ - qsrc = -CoxWLcen * (T1 / 2.0 + T0 / 4.0 - - 0.5 * T0 * T0 / T2); - QovCox = qsrc / Coxeff; - T2 += T2; - T3 = T2 * T2; - T7 = -(0.25 - 12.0 * T0 * (4.0 * T1 - T0) / T3); - T4 = -(0.5 + 24.0 * T0 * T0 / T3) * dVgDP_dVg; - T5 = T7 * AbulkCV; - T6 = T7 * VdseffCV; - - Csg = CoxWLcen * (T4 + T5 * dVdseffCV_dVg); - Csd = CoxWLcen * T5 * dVdseffCV_dVd + Csg * dVgsteff_dVd - + QovCox * dCoxeff_dVd; - Csb = CoxWLcen * (T5 * dVdseffCV_dVb + T6 * dAbulkCV_dVb) - + Csg * dVgsteff_dVb + QovCox * dCoxeff_dVb; - Csg = Csg * dVgsteff_dVg + QovCox * dCoxeff_dVg; - } - else if (model->BSIM3xpart < 0.5) - { /* 40/60 partition */ - T2 = T2 / 12.0; - T3 = 0.5 * CoxWLcen / (T2 * T2); - T4 = T1 * (2.0 * T0 * T0 / 3.0 + T1 * (T1 - 4.0 - * T0 / 3.0)) - 2.0 * T0 * T0 * T0 / 15.0; - qsrc = -T3 * T4; - QovCox = qsrc / Coxeff; - T8 = 4.0 / 3.0 * T1 * (T1 - T0) + 0.4 * T0 * T0; - T5 = -2.0 * qsrc / T2 - T3 * (T1 * (3.0 * T1 - 8.0 - * T0 / 3.0) + 2.0 * T0 * T0 / 3.0); - T6 = AbulkCV * (qsrc / T2 + T3 * T8); - T7 = T6 * VdseffCV / AbulkCV; - - Csg = T5 * dVgDP_dVg + T6 * dVdseffCV_dVg; - Csd = Csg * dVgsteff_dVd + T6 * dVdseffCV_dVd - + QovCox * dCoxeff_dVd; - Csb = Csg * dVgsteff_dVb + T6 * dVdseffCV_dVb - + T7 * dAbulkCV_dVb + QovCox * dCoxeff_dVb; - Csg = Csg * dVgsteff_dVg + QovCox * dCoxeff_dVg; - } - else - { /* 50/50 partition */ - qsrc = -0.5 * qgate; - Csg = -0.5 * Cgg1; - Csd = -0.5 * Cgd1; - Csb = -0.5 * Cgb1; - } - - qgate += Qac0 + Qsub0 - qbulk; - qbulk -= (Qac0 + Qsub0); - qdrn = -(qgate + qbulk + qsrc); - - Cbg = Cbg1 - dQac0_dVg - dQsub0_dVg; - Cbd = Cbd1 - dQsub0_dVd; - Cbb = Cbb1 - dQac0_dVb - dQsub0_dVb; - - Cgg = Cgg1 - Cbg; - Cgd = Cgd1 - Cbd; - Cgb = Cgb1 - Cbb; - - Cgb *= dVbseff_dVb; - Cbb *= dVbseff_dVb; - Csb *= dVbseff_dVb; - - here->BSIM3cggb = Cgg; - here->BSIM3cgsb = -(Cgg + Cgd + Cgb); - here->BSIM3cgdb = Cgd; - here->BSIM3cdgb = -(Cgg + Cbg + Csg); - here->BSIM3cdsb = (Cgg + Cgd + Cgb + Cbg + Cbd + Cbb - + Csg + Csd + Csb); - here->BSIM3cddb = -(Cgd + Cbd + Csd); - here->BSIM3cbgb = Cbg; - here->BSIM3cbsb = -(Cbg + Cbd + Cbb); - here->BSIM3cbdb = Cbd; - here->BSIM3qinv = -qinoi; - } /* End of CTM */ - } - -finished: - /* Returning Values to Calling Routine */ - /* - * COMPUTE EQUIVALENT DRAIN CURRENT SOURCE - */ - - here->BSIM3qgate = qgate; - here->BSIM3qbulk = qbulk; - here->BSIM3qdrn = qdrn; - here->BSIM3cd = cdrain; - - if (ChargeComputationNeeded) - { /* charge storage elements - * bulk-drain and bulk-source depletion capacitances - * czbd : zero bias drain junction capacitance - * czbs : zero bias source junction capacitance - * czbdsw: zero bias drain junction sidewall capacitance - along field oxide - * czbssw: zero bias source junction sidewall capacitance - along field oxide - * czbdswg: zero bias drain junction sidewall capacitance - along gate side - * czbsswg: zero bias source junction sidewall capacitance - along gate side - */ - - if (model->BSIM3acmMod == 0) - { - czbd = model->BSIM3unitAreaTempJctCap * here->BSIM3drainArea; /*bug fix */ - czbs = model->BSIM3unitAreaTempJctCap * here->BSIM3sourceArea; - if (here->BSIM3drainPerimeter < pParam->BSIM3weff) - { - czbdswg = model->BSIM3unitLengthGateSidewallTempJctCap - * here->BSIM3drainPerimeter; - czbdsw = 0.0; - } - else - { - czbdsw = model->BSIM3unitLengthSidewallTempJctCap - * (here->BSIM3drainPerimeter - pParam->BSIM3weff); - czbdswg = model->BSIM3unitLengthGateSidewallTempJctCap - * pParam->BSIM3weff; - } - if (here->BSIM3sourcePerimeter < pParam->BSIM3weff) - { - czbssw = 0.0; - czbsswg = model->BSIM3unitLengthGateSidewallTempJctCap - * here->BSIM3sourcePerimeter; - } - else - { - czbssw = model->BSIM3unitLengthSidewallTempJctCap - * (here->BSIM3sourcePerimeter - pParam->BSIM3weff); - czbsswg = model->BSIM3unitLengthGateSidewallTempJctCap - * pParam->BSIM3weff; - } - } else { - error = ACM_junctionCapacitances( - model->BSIM3acmMod, - model->BSIM3calcacm, - here->BSIM3geo, - model->BSIM3hdif, - model->BSIM3wmlt, - here->BSIM3w, - model->BSIM3xw, - here->BSIM3drainAreaGiven, - here->BSIM3drainArea, - here->BSIM3drainPerimeterGiven, - here->BSIM3drainPerimeter, - here->BSIM3sourceAreaGiven, - here->BSIM3sourceArea, - here->BSIM3sourcePerimeterGiven, - here->BSIM3sourcePerimeter, - model->BSIM3unitAreaTempJctCap, - model->BSIM3unitLengthSidewallTempJctCap, - model->BSIM3unitLengthGateSidewallJctCap, - &czbd, - &czbdsw, - &czbdswg, - &czbs, - &czbssw, - &czbsswg - ); - if (error) - return(error); - } - - MJ = model->BSIM3bulkJctBotGradingCoeff; - MJSW = model->BSIM3bulkJctSideGradingCoeff; - MJSWG = model->BSIM3bulkJctGateSideGradingCoeff; - - /* Source Bulk Junction */ - if (vbs == 0.0) - { *(ckt->CKTstate0 + here->BSIM3qbs) = 0.0; - here->BSIM3capbs = czbs + czbssw + czbsswg; - } - else if (vbs < 0.0) - { if (czbs > 0.0) - { arg = 1.0 - vbs / model->BSIM3PhiB; - if (MJ == 0.5) - sarg = 1.0 / sqrt(arg); - else - sarg = exp(-MJ * log(arg)); - *(ckt->CKTstate0 + here->BSIM3qbs) = model->BSIM3PhiB * czbs - * (1.0 - arg * sarg) / (1.0 - MJ); - here->BSIM3capbs = czbs * sarg; - } - else - { *(ckt->CKTstate0 + here->BSIM3qbs) = 0.0; - here->BSIM3capbs = 0.0; - } - if (czbssw > 0.0) - { arg = 1.0 - vbs / model->BSIM3PhiBSW; - if (MJSW == 0.5) - sarg = 1.0 / sqrt(arg); - else - sarg = exp(-MJSW * log(arg)); - *(ckt->CKTstate0 + here->BSIM3qbs) += model->BSIM3PhiBSW * czbssw - * (1.0 - arg * sarg) / (1.0 - MJSW); - here->BSIM3capbs += czbssw * sarg; - } - if (czbsswg > 0.0) - { arg = 1.0 - vbs / model->BSIM3PhiBSWG; - if (MJSWG == 0.5) - sarg = 1.0 / sqrt(arg); - else - sarg = exp(-MJSWG * log(arg)); - *(ckt->CKTstate0 + here->BSIM3qbs) += model->BSIM3PhiBSWG * czbsswg - * (1.0 - arg * sarg) / (1.0 - MJSWG); - here->BSIM3capbs += czbsswg * sarg; - } - - } - else - { T0 = czbs + czbssw + czbsswg; - T1 = vbs * (czbs * MJ / model->BSIM3PhiB + czbssw * MJSW - / model->BSIM3PhiBSW + czbsswg * MJSWG / model->BSIM3PhiBSWG); - *(ckt->CKTstate0 + here->BSIM3qbs) = vbs * (T0 + 0.5 * T1); - here->BSIM3capbs = T0 + T1; - } - - /* Drain Bulk Junction */ - if (vbd == 0.0) - { *(ckt->CKTstate0 + here->BSIM3qbd) = 0.0; - here->BSIM3capbd = czbd + czbdsw + czbdswg; - } - else if (vbd < 0.0) - { if (czbd > 0.0) - { arg = 1.0 - vbd / model->BSIM3PhiB; - if (MJ == 0.5) - sarg = 1.0 / sqrt(arg); - else - sarg = exp(-MJ * log(arg)); - *(ckt->CKTstate0 + here->BSIM3qbd) = model->BSIM3PhiB * czbd - * (1.0 - arg * sarg) / (1.0 - MJ); - here->BSIM3capbd = czbd * sarg; - } - else - { *(ckt->CKTstate0 + here->BSIM3qbd) = 0.0; - here->BSIM3capbd = 0.0; - } - if (czbdsw > 0.0) - { arg = 1.0 - vbd / model->BSIM3PhiBSW; - if (MJSW == 0.5) - sarg = 1.0 / sqrt(arg); - else - sarg = exp(-MJSW * log(arg)); - *(ckt->CKTstate0 + here->BSIM3qbd) += model->BSIM3PhiBSW * czbdsw - * (1.0 - arg * sarg) / (1.0 - MJSW); - here->BSIM3capbd += czbdsw * sarg; - } - if (czbdswg > 0.0) - { arg = 1.0 - vbd / model->BSIM3PhiBSWG; - if (MJSWG == 0.5) - sarg = 1.0 / sqrt(arg); - else - sarg = exp(-MJSWG * log(arg)); - *(ckt->CKTstate0 + here->BSIM3qbd) += model->BSIM3PhiBSWG * czbdswg - * (1.0 - arg * sarg) / (1.0 - MJSWG); - here->BSIM3capbd += czbdswg * sarg; - } - } - else - { T0 = czbd + czbdsw + czbdswg; - T1 = vbd * (czbd * MJ / model->BSIM3PhiB + czbdsw * MJSW - / model->BSIM3PhiBSW + czbdswg * MJSWG / model->BSIM3PhiBSWG); - *(ckt->CKTstate0 + here->BSIM3qbd) = vbd * (T0 + 0.5 * T1); - here->BSIM3capbd = T0 + T1; - } - } - - /* - * check convergence - */ - if ((here->BSIM3off == 0) || (!(ckt->CKTmode & MODEINITFIX))) - { if (Check == 1) - { ckt->CKTnoncon++; -#ifndef NEWCONV - } - else - { if (here->BSIM3mode >= 0) - { Idtot = here->BSIM3cd + here->BSIM3csub - here->BSIM3cbd; - } - else - { Idtot = here->BSIM3cd - here->BSIM3cbd; - } - tol = ckt->CKTreltol * MAX(fabs(cdhat), fabs(Idtot)) - + ckt->CKTabstol; - if (fabs(cdhat - Idtot) >= tol) - { ckt->CKTnoncon++; - } - else - { Ibtot = here->BSIM3cbs + here->BSIM3cbd - here->BSIM3csub; - tol = ckt->CKTreltol * MAX(fabs(cbhat), fabs(Ibtot)) - + ckt->CKTabstol; - if (fabs(cbhat - Ibtot) > tol) - { ckt->CKTnoncon++; - } - } -#endif /* NEWCONV */ - } - } - *(ckt->CKTstate0 + here->BSIM3vbs) = vbs; - *(ckt->CKTstate0 + here->BSIM3vbd) = vbd; - *(ckt->CKTstate0 + here->BSIM3vgs) = vgs; - *(ckt->CKTstate0 + here->BSIM3vds) = vds; - *(ckt->CKTstate0 + here->BSIM3qdef) = qdef; - - /* bulk and channel charge plus overlaps */ - - if (!ChargeComputationNeeded) - goto line850; -#ifndef NOBYPASS -line755: -#endif - /* NQS begins */ - if ((here->BSIM3nqsMod) || (here->BSIM3acnqsMod)) - { qcheq = -(qbulk + qgate); - - here->BSIM3cqgb = -(here->BSIM3cggb + here->BSIM3cbgb); - here->BSIM3cqdb = -(here->BSIM3cgdb + here->BSIM3cbdb); - here->BSIM3cqsb = -(here->BSIM3cgsb + here->BSIM3cbsb); - here->BSIM3cqbb = -(here->BSIM3cqgb + here->BSIM3cqdb - + here->BSIM3cqsb); - - gtau_drift = fabs(here->BSIM3tconst * qcheq) * ScalingFactor; - T0 = pParam->BSIM3leffCV * pParam->BSIM3leffCV; - gtau_diff = 16.0 * here->BSIM3u0temp * model->BSIM3vtm / T0 - * ScalingFactor; - here->BSIM3gtau = gtau_drift + gtau_diff; - if (here->BSIM3acnqsMod) - here->BSIM3taunet = ScalingFactor / here->BSIM3gtau; - - } - - if (model->BSIM3capMod == 0) /* code merge -JX */ - { - cgdo = pParam->BSIM3cgdo; - qgdo = pParam->BSIM3cgdo * vgd; - cgso = pParam->BSIM3cgso; - qgso = pParam->BSIM3cgso * vgs; - } - else if (model->BSIM3capMod == 1) - { if (vgd < 0.0) - { T1 = sqrt(1.0 - 4.0 * vgd / pParam->BSIM3ckappa); - cgdo = pParam->BSIM3cgdo + pParam->BSIM3weffCV - * pParam->BSIM3cgdl / T1; - qgdo = pParam->BSIM3cgdo * vgd - pParam->BSIM3weffCV * 0.5 - * pParam->BSIM3cgdl * pParam->BSIM3ckappa * (T1 - 1.0); - } - else - { cgdo = pParam->BSIM3cgdo + pParam->BSIM3weffCV - * pParam->BSIM3cgdl; - qgdo = (pParam->BSIM3weffCV * pParam->BSIM3cgdl - + pParam->BSIM3cgdo) * vgd; - } - - if (vgs < 0.0) - { T1 = sqrt(1.0 - 4.0 * vgs / pParam->BSIM3ckappa); - cgso = pParam->BSIM3cgso + pParam->BSIM3weffCV - * pParam->BSIM3cgsl / T1; - qgso = pParam->BSIM3cgso * vgs - pParam->BSIM3weffCV * 0.5 - * pParam->BSIM3cgsl * pParam->BSIM3ckappa * (T1 - 1.0); - } - else - { cgso = pParam->BSIM3cgso + pParam->BSIM3weffCV - * pParam->BSIM3cgsl; - qgso = (pParam->BSIM3weffCV * pParam->BSIM3cgsl - + pParam->BSIM3cgso) * vgs; - } - } - else - { T0 = vgd + DELTA_1; - T1 = sqrt(T0 * T0 + 4.0 * DELTA_1); - T2 = 0.5 * (T0 - T1); - - T3 = pParam->BSIM3weffCV * pParam->BSIM3cgdl; - T4 = sqrt(1.0 - 4.0 * T2 / pParam->BSIM3ckappa); - cgdo = pParam->BSIM3cgdo + T3 - T3 * (1.0 - 1.0 / T4) - * (0.5 - 0.5 * T0 / T1); - qgdo = (pParam->BSIM3cgdo + T3) * vgd - T3 * (T2 - + 0.5 * pParam->BSIM3ckappa * (T4 - 1.0)); - - T0 = vgs + DELTA_1; - T1 = sqrt(T0 * T0 + 4.0 * DELTA_1); - T2 = 0.5 * (T0 - T1); - T3 = pParam->BSIM3weffCV * pParam->BSIM3cgsl; - T4 = sqrt(1.0 - 4.0 * T2 / pParam->BSIM3ckappa); - cgso = pParam->BSIM3cgso + T3 - T3 * (1.0 - 1.0 / T4) - * (0.5 - 0.5 * T0 / T1); - qgso = (pParam->BSIM3cgso + T3) * vgs - T3 * (T2 - + 0.5 * pParam->BSIM3ckappa * (T4 - 1.0)); - } - - here->BSIM3cgdo = cgdo; - here->BSIM3cgso = cgso; - - ag0 = ckt->CKTag[0]; - if (here->BSIM3mode > 0) - { if (here->BSIM3nqsMod == 0) - { gcggb = (here->BSIM3cggb + cgdo + cgso - + pParam->BSIM3cgbo ) * ag0; - gcgdb = (here->BSIM3cgdb - cgdo) * ag0; - gcgsb = (here->BSIM3cgsb - cgso) * ag0; - - gcdgb = (here->BSIM3cdgb - cgdo) * ag0; - gcddb = (here->BSIM3cddb + here->BSIM3capbd + cgdo) * ag0; - gcdsb = here->BSIM3cdsb * ag0; - - gcsgb = -(here->BSIM3cggb + here->BSIM3cbgb - + here->BSIM3cdgb + cgso) * ag0; - gcsdb = -(here->BSIM3cgdb + here->BSIM3cbdb - + here->BSIM3cddb) * ag0; - gcssb = (here->BSIM3capbs + cgso - (here->BSIM3cgsb - + here->BSIM3cbsb + here->BSIM3cdsb)) * ag0; - - gcbgb = (here->BSIM3cbgb - pParam->BSIM3cgbo) * ag0; - gcbdb = (here->BSIM3cbdb - here->BSIM3capbd) * ag0; - gcbsb = (here->BSIM3cbsb - here->BSIM3capbs) * ag0; - - qgd = qgdo; - qgs = qgso; - qgb = pParam->BSIM3cgbo * vgb; - qgate += qgd + qgs + qgb; - qbulk -= qgb; - qdrn -= qgd; - qsrc = -(qgate + qbulk + qdrn); - - ggtg = ggtd = ggtb = ggts = 0.0; - sxpart = 0.6; - dxpart = 0.4; - ddxpart_dVd = ddxpart_dVg = ddxpart_dVb = ddxpart_dVs = 0.0; - dsxpart_dVd = dsxpart_dVg = dsxpart_dVb = dsxpart_dVs = 0.0; - } - else - { if (qcheq > 0.0) - T0 = here->BSIM3tconst * qdef * ScalingFactor; - else - T0 = -here->BSIM3tconst * qdef * ScalingFactor; - ggtg = here->BSIM3gtg = T0 * here->BSIM3cqgb; - ggtd = here->BSIM3gtd = T0 * here->BSIM3cqdb; - ggts = here->BSIM3gts = T0 * here->BSIM3cqsb; - ggtb = here->BSIM3gtb = T0 * here->BSIM3cqbb; - gqdef = ScalingFactor * ag0; - - gcqgb = here->BSIM3cqgb * ag0; - gcqdb = here->BSIM3cqdb * ag0; - gcqsb = here->BSIM3cqsb * ag0; - gcqbb = here->BSIM3cqbb * ag0; - - gcggb = (cgdo + cgso + pParam->BSIM3cgbo ) * ag0; - gcgdb = -cgdo * ag0; - gcgsb = -cgso * ag0; - - gcdgb = -cgdo * ag0; - gcddb = (here->BSIM3capbd + cgdo) * ag0; - gcdsb = 0.0; - - gcsgb = -cgso * ag0; - gcsdb = 0.0; - gcssb = (here->BSIM3capbs + cgso) * ag0; - - gcbgb = -pParam->BSIM3cgbo * ag0; - gcbdb = -here->BSIM3capbd * ag0; - gcbsb = -here->BSIM3capbs * ag0; - - CoxWL = model->BSIM3cox * pParam->BSIM3weffCV - * pParam->BSIM3leffCV; - if (fabs(qcheq) <= 1.0e-5 * CoxWL) - { if (model->BSIM3xpart < 0.5) - { dxpart = 0.4; - } - else if (model->BSIM3xpart > 0.5) - { dxpart = 0.0; - } - else - { dxpart = 0.5; - } - ddxpart_dVd = ddxpart_dVg = ddxpart_dVb - = ddxpart_dVs = 0.0; - } - else - { dxpart = qdrn / qcheq; - Cdd = here->BSIM3cddb; - Csd = -(here->BSIM3cgdb + here->BSIM3cddb - + here->BSIM3cbdb); - ddxpart_dVd = (Cdd - dxpart * (Cdd + Csd)) / qcheq; - Cdg = here->BSIM3cdgb; - Csg = -(here->BSIM3cggb + here->BSIM3cdgb - + here->BSIM3cbgb); - ddxpart_dVg = (Cdg - dxpart * (Cdg + Csg)) / qcheq; - - Cds = here->BSIM3cdsb; - Css = -(here->BSIM3cgsb + here->BSIM3cdsb - + here->BSIM3cbsb); - ddxpart_dVs = (Cds - dxpart * (Cds + Css)) / qcheq; - - ddxpart_dVb = -(ddxpart_dVd + ddxpart_dVg + ddxpart_dVs); - } - sxpart = 1.0 - dxpart; - dsxpart_dVd = -ddxpart_dVd; - dsxpart_dVg = -ddxpart_dVg; - dsxpart_dVs = -ddxpart_dVs; - dsxpart_dVb = -(dsxpart_dVd + dsxpart_dVg + dsxpart_dVs); - - qgd = qgdo; - qgs = qgso; - qgb = pParam->BSIM3cgbo * vgb; - qgate = qgd + qgs + qgb; - qbulk = -qgb; - qdrn = -qgd; - qsrc = -(qgate + qbulk + qdrn); - } - } - else - { if (here->BSIM3nqsMod == 0) - { gcggb = (here->BSIM3cggb + cgdo + cgso - + pParam->BSIM3cgbo ) * ag0; - gcgdb = (here->BSIM3cgsb - cgdo) * ag0; - gcgsb = (here->BSIM3cgdb - cgso) * ag0; - - gcdgb = -(here->BSIM3cggb + here->BSIM3cbgb - + here->BSIM3cdgb + cgdo) * ag0; - gcddb = (here->BSIM3capbd + cgdo - (here->BSIM3cgsb - + here->BSIM3cbsb + here->BSIM3cdsb)) * ag0; - gcdsb = -(here->BSIM3cgdb + here->BSIM3cbdb - + here->BSIM3cddb) * ag0; - - gcsgb = (here->BSIM3cdgb - cgso) * ag0; - gcsdb = here->BSIM3cdsb * ag0; - gcssb = (here->BSIM3cddb + here->BSIM3capbs + cgso) * ag0; - - gcbgb = (here->BSIM3cbgb - pParam->BSIM3cgbo) * ag0; - gcbdb = (here->BSIM3cbsb - here->BSIM3capbd) * ag0; - gcbsb = (here->BSIM3cbdb - here->BSIM3capbs) * ag0; - - qgd = qgdo; - qgs = qgso; - qgb = pParam->BSIM3cgbo * vgb; - qgate += qgd + qgs + qgb; - qbulk -= qgb; - qsrc = qdrn - qgs; - qdrn = -(qgate + qbulk + qsrc); - - ggtg = ggtd = ggtb = ggts = 0.0; - sxpart = 0.4; - dxpart = 0.6; - ddxpart_dVd = ddxpart_dVg = ddxpart_dVb = ddxpart_dVs = 0.0; - dsxpart_dVd = dsxpart_dVg = dsxpart_dVb = dsxpart_dVs = 0.0; - } - else - { if (qcheq > 0.0) - T0 = here->BSIM3tconst * qdef * ScalingFactor; - else - T0 = -here->BSIM3tconst * qdef * ScalingFactor; - ggtg = here->BSIM3gtg = T0 * here->BSIM3cqgb; - ggts = here->BSIM3gtd = T0 * here->BSIM3cqdb; - ggtd = here->BSIM3gts = T0 * here->BSIM3cqsb; - ggtb = here->BSIM3gtb = T0 * here->BSIM3cqbb; - gqdef = ScalingFactor * ag0; - - gcqgb = here->BSIM3cqgb * ag0; - gcqdb = here->BSIM3cqsb * ag0; - gcqsb = here->BSIM3cqdb * ag0; - gcqbb = here->BSIM3cqbb * ag0; - - gcggb = (cgdo + cgso + pParam->BSIM3cgbo) * ag0; - gcgdb = -cgdo * ag0; - gcgsb = -cgso * ag0; - - gcdgb = -cgdo * ag0; - gcddb = (here->BSIM3capbd + cgdo) * ag0; - gcdsb = 0.0; - - gcsgb = -cgso * ag0; - gcsdb = 0.0; - gcssb = (here->BSIM3capbs + cgso) * ag0; - - gcbgb = -pParam->BSIM3cgbo * ag0; - gcbdb = -here->BSIM3capbd * ag0; - gcbsb = -here->BSIM3capbs * ag0; - - CoxWL = model->BSIM3cox * pParam->BSIM3weffCV - * pParam->BSIM3leffCV; - if (fabs(qcheq) <= 1.0e-5 * CoxWL) - { if (model->BSIM3xpart < 0.5) - { sxpart = 0.4; - } - else if (model->BSIM3xpart > 0.5) - { sxpart = 0.0; - } - else - { sxpart = 0.5; - } - dsxpart_dVd = dsxpart_dVg = dsxpart_dVb - = dsxpart_dVs = 0.0; - } - else - { sxpart = qdrn / qcheq; - Css = here->BSIM3cddb; - Cds = -(here->BSIM3cgdb + here->BSIM3cddb - + here->BSIM3cbdb); - dsxpart_dVs = (Css - sxpart * (Css + Cds)) / qcheq; - Csg = here->BSIM3cdgb; - Cdg = -(here->BSIM3cggb + here->BSIM3cdgb - + here->BSIM3cbgb); - dsxpart_dVg = (Csg - sxpart * (Csg + Cdg)) / qcheq; - - Csd = here->BSIM3cdsb; - Cdd = -(here->BSIM3cgsb + here->BSIM3cdsb - + here->BSIM3cbsb); - dsxpart_dVd = (Csd - sxpart * (Csd + Cdd)) / qcheq; - - dsxpart_dVb = -(dsxpart_dVd + dsxpart_dVg + dsxpart_dVs); - } - dxpart = 1.0 - sxpart; - ddxpart_dVd = -dsxpart_dVd; - ddxpart_dVg = -dsxpart_dVg; - ddxpart_dVs = -dsxpart_dVs; - ddxpart_dVb = -(ddxpart_dVd + ddxpart_dVg + ddxpart_dVs); - - qgd = qgdo; - qgs = qgso; - qgb = pParam->BSIM3cgbo * vgb; - qgate = qgd + qgs + qgb; - qbulk = -qgb; - qsrc = -qgs; - qdrn = -(qgate + qbulk + qsrc); - } - } - - cqdef = cqcheq = 0.0; - if (ByPass) goto line860; - - *(ckt->CKTstate0 + here->BSIM3qg) = qgate; - *(ckt->CKTstate0 + here->BSIM3qd) = qdrn - - *(ckt->CKTstate0 + here->BSIM3qbd); - *(ckt->CKTstate0 + here->BSIM3qb) = qbulk - + *(ckt->CKTstate0 + here->BSIM3qbd) - + *(ckt->CKTstate0 + here->BSIM3qbs); - - if (here->BSIM3nqsMod) - { *(ckt->CKTstate0 + here->BSIM3qcdump) = qdef * ScalingFactor; - *(ckt->CKTstate0 + here->BSIM3qcheq) = qcheq; - } - - /* store small signal parameters */ - if (ckt->CKTmode & MODEINITSMSIG) - { goto line1000; - } - if (!ChargeComputationNeeded) - goto line850; - - /* no integration, if dc sweep, but keep evaluating capacitances */ - if (ckt->CKTmode & MODEDCTRANCURVE) - goto line850; - - if (ckt->CKTmode & MODEINITTRAN) - { *(ckt->CKTstate1 + here->BSIM3qb) = - *(ckt->CKTstate0 + here->BSIM3qb); - *(ckt->CKTstate1 + here->BSIM3qg) = - *(ckt->CKTstate0 + here->BSIM3qg); - *(ckt->CKTstate1 + here->BSIM3qd) = - *(ckt->CKTstate0 + here->BSIM3qd); - if (here->BSIM3nqsMod) - { *(ckt->CKTstate1 + here->BSIM3qcheq) = - *(ckt->CKTstate0 + here->BSIM3qcheq); - *(ckt->CKTstate1 + here->BSIM3qcdump) = - *(ckt->CKTstate0 + here->BSIM3qcdump); - } - } - - error = NIintegrate(ckt, &geq, &ceq, 0.0, here->BSIM3qb); - if (error) - return(error); - error = NIintegrate(ckt, &geq, &ceq, 0.0, here->BSIM3qg); - if (error) - return(error); - error = NIintegrate(ckt, &geq, &ceq, 0.0, here->BSIM3qd); - if (error) - return(error); - if (here->BSIM3nqsMod) - { error = NIintegrate(ckt, &geq, &ceq, 0.0, here->BSIM3qcdump); - if (error) - return(error); - error = NIintegrate(ckt, &geq, &ceq, 0.0, here->BSIM3qcheq); - if (error) - return(error); - } - - goto line860; - -line850: - /* initialize to zero charge conductance and current */ - ceqqg = ceqqb = ceqqd = 0.0; - cqcheq = cqdef = 0.0; - - gcdgb = gcddb = gcdsb = 0.0; - gcsgb = gcsdb = gcssb = 0.0; - gcggb = gcgdb = gcgsb = 0.0; - gcbgb = gcbdb = gcbsb = 0.0; - - gqdef = gcqgb = gcqdb = gcqsb = gcqbb = 0.0; - ggtg = ggtd = ggtb = ggts = 0.0; - sxpart = (1.0 - (dxpart = (here->BSIM3mode > 0) ? 0.4 : 0.6)); - ddxpart_dVd = ddxpart_dVg = ddxpart_dVb = ddxpart_dVs = 0.0; - dsxpart_dVd = dsxpart_dVg = dsxpart_dVb = dsxpart_dVs = 0.0; - - if (here->BSIM3nqsMod) - here->BSIM3gtau = 16.0 * here->BSIM3u0temp * model->BSIM3vtm - / pParam->BSIM3leffCV / pParam->BSIM3leffCV - * ScalingFactor; - else - here->BSIM3gtau = 0.0; - - goto line900; - -line860: - /* evaluate equivalent charge current */ - - cqgate = *(ckt->CKTstate0 + here->BSIM3cqg); - cqbulk = *(ckt->CKTstate0 + here->BSIM3cqb); - cqdrn = *(ckt->CKTstate0 + here->BSIM3cqd); - - ceqqg = cqgate - gcggb * vgb + gcgdb * vbd + gcgsb * vbs; - ceqqb = cqbulk - gcbgb * vgb + gcbdb * vbd + gcbsb * vbs; - ceqqd = cqdrn - gcdgb * vgb + gcddb * vbd + gcdsb * vbs; - - if (here->BSIM3nqsMod) - { T0 = ggtg * vgb - ggtd * vbd - ggts * vbs; - ceqqg += T0; - T1 = qdef * here->BSIM3gtau; - ceqqd -= dxpart * T0 + T1 * (ddxpart_dVg * vgb - ddxpart_dVd - * vbd - ddxpart_dVs * vbs); - cqdef = *(ckt->CKTstate0 + here->BSIM3cqcdump) - gqdef * qdef; - cqcheq = *(ckt->CKTstate0 + here->BSIM3cqcheq) - - (gcqgb * vgb - gcqdb * vbd - gcqsb * vbs) + T0; - } - - if (ckt->CKTmode & MODEINITTRAN) - { *(ckt->CKTstate1 + here->BSIM3cqb) = - *(ckt->CKTstate0 + here->BSIM3cqb); - *(ckt->CKTstate1 + here->BSIM3cqg) = - *(ckt->CKTstate0 + here->BSIM3cqg); - *(ckt->CKTstate1 + here->BSIM3cqd) = - *(ckt->CKTstate0 + here->BSIM3cqd); - - if (here->BSIM3nqsMod) - { *(ckt->CKTstate1 + here->BSIM3cqcheq) = - *(ckt->CKTstate0 + here->BSIM3cqcheq); - *(ckt->CKTstate1 + here->BSIM3cqcdump) = - *(ckt->CKTstate0 + here->BSIM3cqcdump); - } - } - - /* - * load current vector - */ -line900: - - if (here->BSIM3mode >= 0) - { Gm = here->BSIM3gm; - Gmbs = here->BSIM3gmbs; - FwdSum = Gm + Gmbs; - RevSum = 0.0; - cdreq = model->BSIM3type * (cdrain - here->BSIM3gds * vds - - Gm * vgs - Gmbs * vbs); - - ceqbd = -model->BSIM3type * (here->BSIM3csub - - here->BSIM3gbds * vds - here->BSIM3gbgs * vgs - - here->BSIM3gbbs * vbs); - ceqbs = 0.0; - - gbbdp = -here->BSIM3gbds; - gbbsp = (here->BSIM3gbds + here->BSIM3gbgs + here->BSIM3gbbs); - - gbdpg = here->BSIM3gbgs; - gbdpdp = here->BSIM3gbds; - gbdpb = here->BSIM3gbbs; - gbdpsp = -(gbdpg + gbdpdp + gbdpb); - - gbspg = 0.0; - gbspdp = 0.0; - gbspb = 0.0; - gbspsp = 0.0; - } - else - { Gm = -here->BSIM3gm; - Gmbs = -here->BSIM3gmbs; - FwdSum = 0.0; - RevSum = -(Gm + Gmbs); - cdreq = -model->BSIM3type * (cdrain + here->BSIM3gds * vds - + Gm * vgd + Gmbs * vbd); - - ceqbs = -model->BSIM3type * (here->BSIM3csub - + here->BSIM3gbds * vds - here->BSIM3gbgs * vgd - - here->BSIM3gbbs * vbd); - ceqbd = 0.0; - - gbbsp = -here->BSIM3gbds; - gbbdp = (here->BSIM3gbds + here->BSIM3gbgs + here->BSIM3gbbs); - - gbdpg = 0.0; - gbdpsp = 0.0; - gbdpb = 0.0; - gbdpdp = 0.0; - - gbspg = here->BSIM3gbgs; - gbspsp = here->BSIM3gbds; - gbspb = here->BSIM3gbbs; - gbspdp = -(gbspg + gbspsp + gbspb); - } - - if (model->BSIM3type > 0) - { ceqbs += (here->BSIM3cbs - here->BSIM3gbs * vbs); - ceqbd += (here->BSIM3cbd - here->BSIM3gbd * vbd); - /* - ceqqg = ceqqg; - ceqqb = ceqqb; - ceqqd = ceqqd; - cqdef = cqdef; - cqcheq = cqcheq; - */ - } - else - { ceqbs -= (here->BSIM3cbs - here->BSIM3gbs * vbs); - ceqbd -= (here->BSIM3cbd - here->BSIM3gbd * vbd); - ceqqg = -ceqqg; - ceqqb = -ceqqb; - ceqqd = -ceqqd; - cqdef = -cqdef; - cqcheq = -cqcheq; - } - - m = here->BSIM3m; -#ifdef USE_OMP - here->BSIM3rhsG = m * ceqqg; - here->BSIM3rhsB = m * (ceqbs + ceqbd + ceqqb); - here->BSIM3rhsD = m * (ceqbd - cdreq - ceqqd); - here->BSIM3rhsS = m * (cdreq + ceqbs + ceqqg - + ceqqb + ceqqd); - if (here->BSIM3nqsMod) - here->BSIM3rhsQ = m * (cqcheq - cqdef); -#else - (*(ckt->CKTrhs + here->BSIM3gNode) -= m * ceqqg); - (*(ckt->CKTrhs + here->BSIM3bNode) -= m * (ceqbs + ceqbd + ceqqb)); - (*(ckt->CKTrhs + here->BSIM3dNodePrime) += m * (ceqbd - cdreq - ceqqd)); - (*(ckt->CKTrhs + here->BSIM3sNodePrime) += m * (cdreq + ceqbs + ceqqg - + ceqqb + ceqqd)); - if (here->BSIM3nqsMod) - *(ckt->CKTrhs + here->BSIM3qNode) += m * (cqcheq - cqdef); -#endif - /* - * load y matrix - */ - - T1 = qdef * here->BSIM3gtau; -#ifdef USE_OMP - here->BSIM3DdPt = m * here->BSIM3drainConductance; - here->BSIM3GgPt = m * (gcggb - ggtg); - here->BSIM3SsPt = m * here->BSIM3sourceConductance; - here->BSIM3BbPt = m * (here->BSIM3gbd + here->BSIM3gbs - - gcbgb - gcbdb - gcbsb - here->BSIM3gbbs); - here->BSIM3DPdpPt = m * (here->BSIM3drainConductance - + here->BSIM3gds + here->BSIM3gbd - + RevSum + gcddb + dxpart * ggtd - + T1 * ddxpart_dVd + gbdpdp); - here->BSIM3SPspPt = m * (here->BSIM3sourceConductance - + here->BSIM3gds + here->BSIM3gbs - + FwdSum + gcssb + sxpart * ggts - + T1 * dsxpart_dVs + gbspsp); - here->BSIM3DdpPt = m * here->BSIM3drainConductance; - here->BSIM3GbPt = m * (gcggb + gcgdb + gcgsb + ggtb); - here->BSIM3GdpPt = m * (gcgdb - ggtd); - here->BSIM3GspPt = m * (gcgsb - ggts); - here->BSIM3SspPt = m * here->BSIM3sourceConductance; - here->BSIM3BgPt = m * (gcbgb - here->BSIM3gbgs); - here->BSIM3BdpPt = m * (gcbdb - here->BSIM3gbd + gbbdp); - here->BSIM3BspPt = m * (gcbsb - here->BSIM3gbs + gbbsp); - here->BSIM3DPdPt = m * here->BSIM3drainConductance; - here->BSIM3DPgPt = m * (Gm + gcdgb + dxpart * ggtg - + T1 * ddxpart_dVg + gbdpg); - here->BSIM3DPbPt = m * (here->BSIM3gbd - Gmbs + gcdgb + gcddb - + gcdsb - dxpart * ggtb - - T1 * ddxpart_dVb - gbdpb); - here->BSIM3DPspPt = m * (here->BSIM3gds + FwdSum - gcdsb - - dxpart * ggts - T1 * ddxpart_dVs - gbdpsp); - here->BSIM3SPgPt = m * (gcsgb - Gm + sxpart * ggtg - + T1 * dsxpart_dVg + gbspg); - here->BSIM3SPsPt = m * here->BSIM3sourceConductance; - here->BSIM3SPbPt = m * (here->BSIM3gbs + Gmbs + gcsgb + gcsdb - + gcssb - sxpart * ggtb - - T1 * dsxpart_dVb - gbspb); - here->BSIM3SPdpPt = m * (here->BSIM3gds + RevSum - gcsdb - - sxpart * ggtd - T1 * dsxpart_dVd - gbspdp); - - if (here->BSIM3nqsMod) - { here->BSIM3QqPt = m * (gqdef + here->BSIM3gtau); - - here->BSIM3DPqPt = m * (dxpart * here->BSIM3gtau); - here->BSIM3SPqPt = m * (sxpart * here->BSIM3gtau); - here->BSIM3GqPt = m * here->BSIM3gtau; - - here->BSIM3QgPt = m * (ggtg - gcqgb); - here->BSIM3QdpPt = m * (ggtd - gcqdb); - here->BSIM3QspPt = m * (ggts - gcqsb); - here->BSIM3QbPt = m * (ggtb - gcqbb); - } -#else - (*(here->BSIM3DdPtr) += m * here->BSIM3drainConductance); - (*(here->BSIM3GgPtr) += m * (gcggb - ggtg)); - (*(here->BSIM3SsPtr) += m * here->BSIM3sourceConductance); - (*(here->BSIM3BbPtr) += m * (here->BSIM3gbd + here->BSIM3gbs - - gcbgb - gcbdb - gcbsb - here->BSIM3gbbs)); - (*(here->BSIM3DPdpPtr) += m * (here->BSIM3drainConductance - + here->BSIM3gds + here->BSIM3gbd - + RevSum + gcddb + dxpart * ggtd - + T1 * ddxpart_dVd + gbdpdp)); - (*(here->BSIM3SPspPtr) += m * (here->BSIM3sourceConductance - + here->BSIM3gds + here->BSIM3gbs - + FwdSum + gcssb + sxpart * ggts - + T1 * dsxpart_dVs + gbspsp)); - (*(here->BSIM3DdpPtr) -= m * here->BSIM3drainConductance); - (*(here->BSIM3GbPtr) -= m * (gcggb + gcgdb + gcgsb + ggtb)); - (*(here->BSIM3GdpPtr) += m * (gcgdb - ggtd)); - (*(here->BSIM3GspPtr) += m * (gcgsb - ggts)); - (*(here->BSIM3SspPtr) -= m * here->BSIM3sourceConductance); - (*(here->BSIM3BgPtr) += m * (gcbgb - here->BSIM3gbgs)); - (*(here->BSIM3BdpPtr) += m * (gcbdb - here->BSIM3gbd + gbbdp)); - (*(here->BSIM3BspPtr) += m * (gcbsb - here->BSIM3gbs + gbbsp)); - (*(here->BSIM3DPdPtr) -= m * here->BSIM3drainConductance); - (*(here->BSIM3DPgPtr) += m * (Gm + gcdgb + dxpart * ggtg - + T1 * ddxpart_dVg + gbdpg)); - (*(here->BSIM3DPbPtr) -= m * (here->BSIM3gbd - Gmbs + gcdgb + gcddb - + gcdsb - dxpart * ggtb - - T1 * ddxpart_dVb - gbdpb)); - (*(here->BSIM3DPspPtr) -= m * (here->BSIM3gds + FwdSum - gcdsb - - dxpart * ggts - T1 * ddxpart_dVs - gbdpsp)); - (*(here->BSIM3SPgPtr) += m * (gcsgb - Gm + sxpart * ggtg - + T1 * dsxpart_dVg + gbspg)); - (*(here->BSIM3SPsPtr) -= m * here->BSIM3sourceConductance); - (*(here->BSIM3SPbPtr) -= m * (here->BSIM3gbs + Gmbs + gcsgb + gcsdb - + gcssb - sxpart * ggtb - - T1 * dsxpart_dVb - gbspb)); - (*(here->BSIM3SPdpPtr) -= m * (here->BSIM3gds + RevSum - gcsdb - - sxpart * ggtd - T1 * dsxpart_dVd - gbspdp)); - - if (here->BSIM3nqsMod) - { *(here->BSIM3QqPtr) += m * (gqdef + here->BSIM3gtau); - - *(here->BSIM3DPqPtr) += m * (dxpart * here->BSIM3gtau); - *(here->BSIM3SPqPtr) += m * (sxpart * here->BSIM3gtau); - *(here->BSIM3GqPtr) -= m * here->BSIM3gtau; - - *(here->BSIM3QgPtr) += m * (ggtg - gcqgb); - *(here->BSIM3QdpPtr) += m * (ggtd - gcqdb); - *(here->BSIM3QspPtr) += m * (ggts - gcqsb); - *(here->BSIM3QbPtr) += m * (ggtb - gcqbb); - } -#endif -line1000: ; -#ifndef USE_OMP - } /* End of Mosfet Instance */ -} /* End of Model Instance */ -#endif -return(OK); -} - -#ifdef USE_OMP -void BSIM3LoadRhsMat(GENmodel *inModel, CKTcircuit *ckt) -{ - int InstCount, idx; - BSIM3instance **InstArray; - BSIM3instance *here; - BSIM3model *model = (BSIM3model*)inModel; - - InstArray = model->BSIM3InstanceArray; - InstCount = model->BSIM3InstCount; - - for(idx = 0; idx < InstCount; idx++) { - here = InstArray[idx]; - model = BSIM3modPtr(here); - /* Update b for Ax = b */ - (*(ckt->CKTrhs + here->BSIM3gNode) -= here->BSIM3rhsG); - (*(ckt->CKTrhs + here->BSIM3bNode) -= here->BSIM3rhsB); - (*(ckt->CKTrhs + here->BSIM3dNodePrime) += here->BSIM3rhsD); - (*(ckt->CKTrhs + here->BSIM3sNodePrime) += here->BSIM3rhsS); - if (here->BSIM3nqsMod) - (*(ckt->CKTrhs + here->BSIM3qNode) += here->BSIM3rhsQ); - - /* Update A for Ax = b */ - (*(here->BSIM3DdPtr) += here->BSIM3DdPt); - (*(here->BSIM3GgPtr) += here->BSIM3GgPt); - (*(here->BSIM3SsPtr) += here->BSIM3SsPt); - (*(here->BSIM3BbPtr) += here->BSIM3BbPt); - (*(here->BSIM3DPdpPtr) += here->BSIM3DPdpPt); - (*(here->BSIM3SPspPtr) += here->BSIM3SPspPt); - (*(here->BSIM3DdpPtr) -= here->BSIM3DdpPt); - (*(here->BSIM3GbPtr) -= here->BSIM3GbPt); - (*(here->BSIM3GdpPtr) += here->BSIM3GdpPt); - (*(here->BSIM3GspPtr) += here->BSIM3GspPt); - (*(here->BSIM3SspPtr) -= here->BSIM3SspPt); - (*(here->BSIM3BgPtr) += here->BSIM3BgPt); - (*(here->BSIM3BdpPtr) += here->BSIM3BdpPt); - (*(here->BSIM3BspPtr) += here->BSIM3BspPt); - (*(here->BSIM3DPdPtr) -= here->BSIM3DPdPt); - (*(here->BSIM3DPgPtr) += here->BSIM3DPgPt); - (*(here->BSIM3DPbPtr) -= here->BSIM3DPbPt); - (*(here->BSIM3DPspPtr) -= here->BSIM3DPspPt); - (*(here->BSIM3SPgPtr) += here->BSIM3SPgPt); - (*(here->BSIM3SPsPtr) -= here->BSIM3SPsPt); - (*(here->BSIM3SPbPtr) -= here->BSIM3SPbPt); - (*(here->BSIM3SPdpPtr) -= here->BSIM3SPdpPt); - - if (here->BSIM3nqsMod) - { *(here->BSIM3QqPtr) += here->BSIM3QqPt; - - *(here->BSIM3DPqPtr) += here->BSIM3DPqPt; - *(here->BSIM3SPqPtr) += here->BSIM3SPqPt; - *(here->BSIM3GqPtr) -= here->BSIM3GqPt; - - *(here->BSIM3QgPtr) += here->BSIM3QgPt; - *(here->BSIM3QdpPtr) += here->BSIM3QdpPt; - *(here->BSIM3QspPtr) += here->BSIM3QspPt; - *(here->BSIM3QbPtr) += here->BSIM3QbPt; - } - - } -} -#endif diff --git a/src/spicelib/devices/bsim3/b3mask.c b/src/spicelib/devices/bsim3/b3mask.c deleted file mode 100644 index 1c53839cd..000000000 --- a/src/spicelib/devices/bsim3/b3mask.c +++ /dev/null @@ -1,1328 +0,0 @@ -/**** BSIM3v3.3.0, Released by Xuemei Xi 07/29/2005 ****/ - -/********** - * Copyright 2004 Regents of the University of California. All rights reserved. - * File: b3mask.c of BSIM3v3.3.0 - * Author: 1995 Min-Chie Jeng and Mansun Chan. - * Author: 1997-1999 Weidong Liu. - * Author: 2001 Xuemei Xi - **********/ - -#include "ngspice/ngspice.h" -#include "ngspice/ifsim.h" -#include "ngspice/cktdefs.h" -#include "ngspice/devdefs.h" -#include "bsim3def.h" -#include "ngspice/sperror.h" -#include "ngspice/suffix.h" - -int -BSIM3mAsk( -CKTcircuit *ckt, -GENmodel *inst, -int which, -IFvalue *value) -{ - BSIM3model *model = (BSIM3model *)inst; - - NG_IGNORE(ckt); - - switch(which) - { case BSIM3_MOD_MOBMOD: - value->iValue = model->BSIM3mobMod; - return(OK); - case BSIM3_MOD_PARAMCHK: - value->iValue = model->BSIM3paramChk; - return(OK); - case BSIM3_MOD_BINUNIT: - value->iValue = model->BSIM3binUnit; - return(OK); - case BSIM3_MOD_CAPMOD: - value->iValue = model->BSIM3capMod; - return(OK); - case BSIM3_MOD_NOIMOD: - value->iValue = model->BSIM3noiMod; - return(OK); - case BSIM3_MOD_NQSMOD: - value->iValue = model->BSIM3nqsMod; - return(OK); - case BSIM3_MOD_ACNQSMOD: - value->iValue = model->BSIM3acnqsMod; - return(OK); - case BSIM3_MOD_ACMMOD: - value->iValue = model->BSIM3acmMod; - return(OK); - case BSIM3_MOD_CALCACM: - value->iValue = model->BSIM3calcacm; - return(OK); - case BSIM3_MOD_VERSION : - value->sValue = model->BSIM3version; - return(OK); - case BSIM3_MOD_TOX : - value->rValue = model->BSIM3tox; - return(OK); - case BSIM3_MOD_TOXM : - value->rValue = model->BSIM3toxm; - return(OK); - case BSIM3_MOD_CDSC : - value->rValue = model->BSIM3cdsc; - return(OK); - case BSIM3_MOD_CDSCB : - value->rValue = model->BSIM3cdscb; - return(OK); - - case BSIM3_MOD_CDSCD : - value->rValue = model->BSIM3cdscd; - return(OK); - - case BSIM3_MOD_CIT : - value->rValue = model->BSIM3cit; - return(OK); - case BSIM3_MOD_NFACTOR : - value->rValue = model->BSIM3nfactor; - return(OK); - case BSIM3_MOD_XJ: - value->rValue = model->BSIM3xj; - return(OK); - case BSIM3_MOD_VSAT: - value->rValue = model->BSIM3vsat; - return(OK); - case BSIM3_MOD_AT: - value->rValue = model->BSIM3at; - return(OK); - case BSIM3_MOD_A0: - value->rValue = model->BSIM3a0; - return(OK); - - case BSIM3_MOD_AGS: - value->rValue = model->BSIM3ags; - return(OK); - - case BSIM3_MOD_A1: - value->rValue = model->BSIM3a1; - return(OK); - case BSIM3_MOD_A2: - value->rValue = model->BSIM3a2; - return(OK); - case BSIM3_MOD_KETA: - value->rValue = model->BSIM3keta; - return(OK); - case BSIM3_MOD_NSUB: - value->rValue = model->BSIM3nsub; - return(OK); - case BSIM3_MOD_NPEAK: - value->rValue = model->BSIM3npeak; - return(OK); - case BSIM3_MOD_NGATE: - value->rValue = model->BSIM3ngate; - return(OK); - case BSIM3_MOD_GAMMA1: - value->rValue = model->BSIM3gamma1; - return(OK); - case BSIM3_MOD_GAMMA2: - value->rValue = model->BSIM3gamma2; - return(OK); - case BSIM3_MOD_VBX: - value->rValue = model->BSIM3vbx; - return(OK); - case BSIM3_MOD_VBM: - value->rValue = model->BSIM3vbm; - return(OK); - case BSIM3_MOD_XT: - value->rValue = model->BSIM3xt; - return(OK); - case BSIM3_MOD_K1: - value->rValue = model->BSIM3k1; - return(OK); - case BSIM3_MOD_KT1: - value->rValue = model->BSIM3kt1; - return(OK); - case BSIM3_MOD_KT1L: - value->rValue = model->BSIM3kt1l; - return(OK); - case BSIM3_MOD_KT2 : - value->rValue = model->BSIM3kt2; - return(OK); - case BSIM3_MOD_K2 : - value->rValue = model->BSIM3k2; - return(OK); - case BSIM3_MOD_K3: - value->rValue = model->BSIM3k3; - return(OK); - case BSIM3_MOD_K3B: - value->rValue = model->BSIM3k3b; - return(OK); - case BSIM3_MOD_W0: - value->rValue = model->BSIM3w0; - return(OK); - case BSIM3_MOD_NLX: - value->rValue = model->BSIM3nlx; - return(OK); - case BSIM3_MOD_DVT0 : - value->rValue = model->BSIM3dvt0; - return(OK); - case BSIM3_MOD_DVT1 : - value->rValue = model->BSIM3dvt1; - return(OK); - case BSIM3_MOD_DVT2 : - value->rValue = model->BSIM3dvt2; - return(OK); - case BSIM3_MOD_DVT0W : - value->rValue = model->BSIM3dvt0w; - return(OK); - case BSIM3_MOD_DVT1W : - value->rValue = model->BSIM3dvt1w; - return(OK); - case BSIM3_MOD_DVT2W : - value->rValue = model->BSIM3dvt2w; - return(OK); - case BSIM3_MOD_DROUT : - value->rValue = model->BSIM3drout; - return(OK); - case BSIM3_MOD_DSUB : - value->rValue = model->BSIM3dsub; - return(OK); - case BSIM3_MOD_VTH0: - value->rValue = model->BSIM3vth0; - return(OK); - case BSIM3_MOD_UA: - value->rValue = model->BSIM3ua; - return(OK); - case BSIM3_MOD_UA1: - value->rValue = model->BSIM3ua1; - return(OK); - case BSIM3_MOD_UB: - value->rValue = model->BSIM3ub; - return(OK); - case BSIM3_MOD_UB1: - value->rValue = model->BSIM3ub1; - return(OK); - case BSIM3_MOD_UC: - value->rValue = model->BSIM3uc; - return(OK); - case BSIM3_MOD_UC1: - value->rValue = model->BSIM3uc1; - return(OK); - case BSIM3_MOD_U0: - value->rValue = model->BSIM3u0; - return(OK); - case BSIM3_MOD_UTE: - value->rValue = model->BSIM3ute; - return(OK); - case BSIM3_MOD_VOFF: - value->rValue = model->BSIM3voff; - return(OK); - case BSIM3_MOD_DELTA: - value->rValue = model->BSIM3delta; - return(OK); - case BSIM3_MOD_RDSW: - value->rValue = model->BSIM3rdsw; - return(OK); - case BSIM3_MOD_PRWG: - value->rValue = model->BSIM3prwg; - return(OK); - case BSIM3_MOD_PRWB: - value->rValue = model->BSIM3prwb; - return(OK); - case BSIM3_MOD_PRT: - value->rValue = model->BSIM3prt; - return(OK); - case BSIM3_MOD_ETA0: - value->rValue = model->BSIM3eta0; - return(OK); - case BSIM3_MOD_ETAB: - value->rValue = model->BSIM3etab; - return(OK); - case BSIM3_MOD_PCLM: - value->rValue = model->BSIM3pclm; - return(OK); - case BSIM3_MOD_PDIBL1: - value->rValue = model->BSIM3pdibl1; - return(OK); - case BSIM3_MOD_PDIBL2: - value->rValue = model->BSIM3pdibl2; - return(OK); - case BSIM3_MOD_PDIBLB: - value->rValue = model->BSIM3pdiblb; - return(OK); - case BSIM3_MOD_PSCBE1: - value->rValue = model->BSIM3pscbe1; - return(OK); - case BSIM3_MOD_PSCBE2: - value->rValue = model->BSIM3pscbe2; - return(OK); - case BSIM3_MOD_PVAG: - value->rValue = model->BSIM3pvag; - return(OK); - case BSIM3_MOD_WR: - value->rValue = model->BSIM3wr; - return(OK); - case BSIM3_MOD_DWG: - value->rValue = model->BSIM3dwg; - return(OK); - case BSIM3_MOD_DWB: - value->rValue = model->BSIM3dwb; - return(OK); - case BSIM3_MOD_B0: - value->rValue = model->BSIM3b0; - return(OK); - case BSIM3_MOD_B1: - value->rValue = model->BSIM3b1; - return(OK); - case BSIM3_MOD_ALPHA0: - value->rValue = model->BSIM3alpha0; - return(OK); - case BSIM3_MOD_ALPHA1: - value->rValue = model->BSIM3alpha1; - return(OK); - case BSIM3_MOD_BETA0: - value->rValue = model->BSIM3beta0; - return(OK); - case BSIM3_MOD_IJTH: - value->rValue = model->BSIM3ijth; - return(OK); - case BSIM3_MOD_VFB: - value->rValue = model->BSIM3vfb; - return(OK); - - case BSIM3_MOD_ELM: - value->rValue = model->BSIM3elm; - return(OK); - case BSIM3_MOD_CGSL: - value->rValue = model->BSIM3cgsl; - return(OK); - case BSIM3_MOD_CGDL: - value->rValue = model->BSIM3cgdl; - return(OK); - case BSIM3_MOD_CKAPPA: - value->rValue = model->BSIM3ckappa; - return(OK); - case BSIM3_MOD_CF: - value->rValue = model->BSIM3cf; - return(OK); - case BSIM3_MOD_CLC: - value->rValue = model->BSIM3clc; - return(OK); - case BSIM3_MOD_CLE: - value->rValue = model->BSIM3cle; - return(OK); - case BSIM3_MOD_DWC: - value->rValue = model->BSIM3dwc; - return(OK); - case BSIM3_MOD_DLC: - value->rValue = model->BSIM3dlc; - return(OK); - case BSIM3_MOD_VFBCV: - value->rValue = model->BSIM3vfbcv; - return(OK); - case BSIM3_MOD_ACDE: - value->rValue = model->BSIM3acde; - return(OK); - case BSIM3_MOD_MOIN: - value->rValue = model->BSIM3moin; - return(OK); - case BSIM3_MOD_NOFF: - value->rValue = model->BSIM3noff; - return(OK); - case BSIM3_MOD_VOFFCV: - value->rValue = model->BSIM3voffcv; - return(OK); - case BSIM3_MOD_TCJ: - value->rValue = model->BSIM3tcj; - return(OK); - case BSIM3_MOD_TPB: - value->rValue = model->BSIM3tpb; - return(OK); - case BSIM3_MOD_TCJSW: - value->rValue = model->BSIM3tcjsw; - return(OK); - case BSIM3_MOD_TPBSW: - value->rValue = model->BSIM3tpbsw; - return(OK); - case BSIM3_MOD_TCJSWG: - value->rValue = model->BSIM3tcjswg; - return(OK); - case BSIM3_MOD_TPBSWG: - value->rValue = model->BSIM3tpbswg; - return(OK); - - /* ACM model */ - case BSIM3_MOD_HDIF: - value->rValue = model->BSIM3hdif; - return(OK); - case BSIM3_MOD_LDIF: - value->rValue = model->BSIM3ldif; - return(OK); - case BSIM3_MOD_LD: - value->rValue = model->BSIM3ld; - return(OK); - case BSIM3_MOD_RD: - value->rValue = model->BSIM3rd; - return(OK); - case BSIM3_MOD_RS: - value->rValue = model->BSIM3rs; - return(OK); - case BSIM3_MOD_RDC: - value->rValue = model->BSIM3rdc; - return(OK); - case BSIM3_MOD_RSC: - value->rValue = model->BSIM3rsc; - return(OK); - case BSIM3_MOD_WMLT: - value->rValue = model->BSIM3wmlt; - return(OK); - - /* Length dependence */ - case BSIM3_MOD_LCDSC : - value->rValue = model->BSIM3lcdsc; - return(OK); - case BSIM3_MOD_LCDSCB : - value->rValue = model->BSIM3lcdscb; - return(OK); - case BSIM3_MOD_LCDSCD : - value->rValue = model->BSIM3lcdscd; - return(OK); - case BSIM3_MOD_LCIT : - value->rValue = model->BSIM3lcit; - return(OK); - case BSIM3_MOD_LNFACTOR : - value->rValue = model->BSIM3lnfactor; - return(OK); - case BSIM3_MOD_LXJ: - value->rValue = model->BSIM3lxj; - return(OK); - case BSIM3_MOD_LVSAT: - value->rValue = model->BSIM3lvsat; - return(OK); - case BSIM3_MOD_LAT: - value->rValue = model->BSIM3lat; - return(OK); - case BSIM3_MOD_LA0: - value->rValue = model->BSIM3la0; - return(OK); - case BSIM3_MOD_LAGS: - value->rValue = model->BSIM3lags; - return(OK); - case BSIM3_MOD_LA1: - value->rValue = model->BSIM3la1; - return(OK); - case BSIM3_MOD_LA2: - value->rValue = model->BSIM3la2; - return(OK); - case BSIM3_MOD_LKETA: - value->rValue = model->BSIM3lketa; - return(OK); - case BSIM3_MOD_LNSUB: - value->rValue = model->BSIM3lnsub; - return(OK); - case BSIM3_MOD_LNPEAK: - value->rValue = model->BSIM3lnpeak; - return(OK); - case BSIM3_MOD_LNGATE: - value->rValue = model->BSIM3lngate; - return(OK); - case BSIM3_MOD_LGAMMA1: - value->rValue = model->BSIM3lgamma1; - return(OK); - case BSIM3_MOD_LGAMMA2: - value->rValue = model->BSIM3lgamma2; - return(OK); - case BSIM3_MOD_LVBX: - value->rValue = model->BSIM3lvbx; - return(OK); - case BSIM3_MOD_LVBM: - value->rValue = model->BSIM3lvbm; - return(OK); - case BSIM3_MOD_LXT: - value->rValue = model->BSIM3lxt; - return(OK); - case BSIM3_MOD_LK1: - value->rValue = model->BSIM3lk1; - return(OK); - case BSIM3_MOD_LKT1: - value->rValue = model->BSIM3lkt1; - return(OK); - case BSIM3_MOD_LKT1L: - value->rValue = model->BSIM3lkt1l; - return(OK); - case BSIM3_MOD_LKT2 : - value->rValue = model->BSIM3lkt2; - return(OK); - case BSIM3_MOD_LK2 : - value->rValue = model->BSIM3lk2; - return(OK); - case BSIM3_MOD_LK3: - value->rValue = model->BSIM3lk3; - return(OK); - case BSIM3_MOD_LK3B: - value->rValue = model->BSIM3lk3b; - return(OK); - case BSIM3_MOD_LW0: - value->rValue = model->BSIM3lw0; - return(OK); - case BSIM3_MOD_LNLX: - value->rValue = model->BSIM3lnlx; - return(OK); - case BSIM3_MOD_LDVT0: - value->rValue = model->BSIM3ldvt0; - return(OK); - case BSIM3_MOD_LDVT1 : - value->rValue = model->BSIM3ldvt1; - return(OK); - case BSIM3_MOD_LDVT2 : - value->rValue = model->BSIM3ldvt2; - return(OK); - case BSIM3_MOD_LDVT0W : - value->rValue = model->BSIM3ldvt0w; - return(OK); - case BSIM3_MOD_LDVT1W : - value->rValue = model->BSIM3ldvt1w; - return(OK); - case BSIM3_MOD_LDVT2W : - value->rValue = model->BSIM3ldvt2w; - return(OK); - case BSIM3_MOD_LDROUT : - value->rValue = model->BSIM3ldrout; - return(OK); - case BSIM3_MOD_LDSUB : - value->rValue = model->BSIM3ldsub; - return(OK); - case BSIM3_MOD_LVTH0: - value->rValue = model->BSIM3lvth0; - return(OK); - case BSIM3_MOD_LUA: - value->rValue = model->BSIM3lua; - return(OK); - case BSIM3_MOD_LUA1: - value->rValue = model->BSIM3lua1; - return(OK); - case BSIM3_MOD_LUB: - value->rValue = model->BSIM3lub; - return(OK); - case BSIM3_MOD_LUB1: - value->rValue = model->BSIM3lub1; - return(OK); - case BSIM3_MOD_LUC: - value->rValue = model->BSIM3luc; - return(OK); - case BSIM3_MOD_LUC1: - value->rValue = model->BSIM3luc1; - return(OK); - case BSIM3_MOD_LU0: - value->rValue = model->BSIM3lu0; - return(OK); - case BSIM3_MOD_LUTE: - value->rValue = model->BSIM3lute; - return(OK); - case BSIM3_MOD_LVOFF: - value->rValue = model->BSIM3lvoff; - return(OK); - case BSIM3_MOD_LDELTA: - value->rValue = model->BSIM3ldelta; - return(OK); - case BSIM3_MOD_LRDSW: - value->rValue = model->BSIM3lrdsw; - return(OK); - case BSIM3_MOD_LPRWB: - value->rValue = model->BSIM3lprwb; - return(OK); - case BSIM3_MOD_LPRWG: - value->rValue = model->BSIM3lprwg; - return(OK); - case BSIM3_MOD_LPRT: - value->rValue = model->BSIM3lprt; - return(OK); - case BSIM3_MOD_LETA0: - value->rValue = model->BSIM3leta0; - return(OK); - case BSIM3_MOD_LETAB: - value->rValue = model->BSIM3letab; - return(OK); - case BSIM3_MOD_LPCLM: - value->rValue = model->BSIM3lpclm; - return(OK); - case BSIM3_MOD_LPDIBL1: - value->rValue = model->BSIM3lpdibl1; - return(OK); - case BSIM3_MOD_LPDIBL2: - value->rValue = model->BSIM3lpdibl2; - return(OK); - case BSIM3_MOD_LPDIBLB: - value->rValue = model->BSIM3lpdiblb; - return(OK); - case BSIM3_MOD_LPSCBE1: - value->rValue = model->BSIM3lpscbe1; - return(OK); - case BSIM3_MOD_LPSCBE2: - value->rValue = model->BSIM3lpscbe2; - return(OK); - case BSIM3_MOD_LPVAG: - value->rValue = model->BSIM3lpvag; - return(OK); - case BSIM3_MOD_LWR: - value->rValue = model->BSIM3lwr; - return(OK); - case BSIM3_MOD_LDWG: - value->rValue = model->BSIM3ldwg; - return(OK); - case BSIM3_MOD_LDWB: - value->rValue = model->BSIM3ldwb; - return(OK); - case BSIM3_MOD_LB0: - value->rValue = model->BSIM3lb0; - return(OK); - case BSIM3_MOD_LB1: - value->rValue = model->BSIM3lb1; - return(OK); - case BSIM3_MOD_LALPHA0: - value->rValue = model->BSIM3lalpha0; - return(OK); - case BSIM3_MOD_LALPHA1: - value->rValue = model->BSIM3lalpha1; - return(OK); - case BSIM3_MOD_LBETA0: - value->rValue = model->BSIM3lbeta0; - return(OK); - case BSIM3_MOD_LVFB: - value->rValue = model->BSIM3lvfb; - return(OK); - - case BSIM3_MOD_LELM: - value->rValue = model->BSIM3lelm; - return(OK); - case BSIM3_MOD_LCGSL: - value->rValue = model->BSIM3lcgsl; - return(OK); - case BSIM3_MOD_LCGDL: - value->rValue = model->BSIM3lcgdl; - return(OK); - case BSIM3_MOD_LCKAPPA: - value->rValue = model->BSIM3lckappa; - return(OK); - case BSIM3_MOD_LCF: - value->rValue = model->BSIM3lcf; - return(OK); - case BSIM3_MOD_LCLC: - value->rValue = model->BSIM3lclc; - return(OK); - case BSIM3_MOD_LCLE: - value->rValue = model->BSIM3lcle; - return(OK); - case BSIM3_MOD_LVFBCV: - value->rValue = model->BSIM3lvfbcv; - return(OK); - case BSIM3_MOD_LACDE: - value->rValue = model->BSIM3lacde; - return(OK); - case BSIM3_MOD_LMOIN: - value->rValue = model->BSIM3lmoin; - return(OK); - case BSIM3_MOD_LNOFF: - value->rValue = model->BSIM3lnoff; - return(OK); - case BSIM3_MOD_LVOFFCV: - value->rValue = model->BSIM3lvoffcv; - return(OK); - - /* Width dependence */ - case BSIM3_MOD_WCDSC : - value->rValue = model->BSIM3wcdsc; - return(OK); - case BSIM3_MOD_WCDSCB : - value->rValue = model->BSIM3wcdscb; - return(OK); - case BSIM3_MOD_WCDSCD : - value->rValue = model->BSIM3wcdscd; - return(OK); - case BSIM3_MOD_WCIT : - value->rValue = model->BSIM3wcit; - return(OK); - case BSIM3_MOD_WNFACTOR : - value->rValue = model->BSIM3wnfactor; - return(OK); - case BSIM3_MOD_WXJ: - value->rValue = model->BSIM3wxj; - return(OK); - case BSIM3_MOD_WVSAT: - value->rValue = model->BSIM3wvsat; - return(OK); - case BSIM3_MOD_WAT: - value->rValue = model->BSIM3wat; - return(OK); - case BSIM3_MOD_WA0: - value->rValue = model->BSIM3wa0; - return(OK); - case BSIM3_MOD_WAGS: - value->rValue = model->BSIM3wags; - return(OK); - case BSIM3_MOD_WA1: - value->rValue = model->BSIM3wa1; - return(OK); - case BSIM3_MOD_WA2: - value->rValue = model->BSIM3wa2; - return(OK); - case BSIM3_MOD_WKETA: - value->rValue = model->BSIM3wketa; - return(OK); - case BSIM3_MOD_WNSUB: - value->rValue = model->BSIM3wnsub; - return(OK); - case BSIM3_MOD_WNPEAK: - value->rValue = model->BSIM3wnpeak; - return(OK); - case BSIM3_MOD_WNGATE: - value->rValue = model->BSIM3wngate; - return(OK); - case BSIM3_MOD_WGAMMA1: - value->rValue = model->BSIM3wgamma1; - return(OK); - case BSIM3_MOD_WGAMMA2: - value->rValue = model->BSIM3wgamma2; - return(OK); - case BSIM3_MOD_WVBX: - value->rValue = model->BSIM3wvbx; - return(OK); - case BSIM3_MOD_WVBM: - value->rValue = model->BSIM3wvbm; - return(OK); - case BSIM3_MOD_WXT: - value->rValue = model->BSIM3wxt; - return(OK); - case BSIM3_MOD_WK1: - value->rValue = model->BSIM3wk1; - return(OK); - case BSIM3_MOD_WKT1: - value->rValue = model->BSIM3wkt1; - return(OK); - case BSIM3_MOD_WKT1L: - value->rValue = model->BSIM3wkt1l; - return(OK); - case BSIM3_MOD_WKT2 : - value->rValue = model->BSIM3wkt2; - return(OK); - case BSIM3_MOD_WK2 : - value->rValue = model->BSIM3wk2; - return(OK); - case BSIM3_MOD_WK3: - value->rValue = model->BSIM3wk3; - return(OK); - case BSIM3_MOD_WK3B: - value->rValue = model->BSIM3wk3b; - return(OK); - case BSIM3_MOD_WW0: - value->rValue = model->BSIM3ww0; - return(OK); - case BSIM3_MOD_WNLX: - value->rValue = model->BSIM3wnlx; - return(OK); - case BSIM3_MOD_WDVT0: - value->rValue = model->BSIM3wdvt0; - return(OK); - case BSIM3_MOD_WDVT1 : - value->rValue = model->BSIM3wdvt1; - return(OK); - case BSIM3_MOD_WDVT2 : - value->rValue = model->BSIM3wdvt2; - return(OK); - case BSIM3_MOD_WDVT0W : - value->rValue = model->BSIM3wdvt0w; - return(OK); - case BSIM3_MOD_WDVT1W : - value->rValue = model->BSIM3wdvt1w; - return(OK); - case BSIM3_MOD_WDVT2W : - value->rValue = model->BSIM3wdvt2w; - return(OK); - case BSIM3_MOD_WDROUT : - value->rValue = model->BSIM3wdrout; - return(OK); - case BSIM3_MOD_WDSUB : - value->rValue = model->BSIM3wdsub; - return(OK); - case BSIM3_MOD_WVTH0: - value->rValue = model->BSIM3wvth0; - return(OK); - case BSIM3_MOD_WUA: - value->rValue = model->BSIM3wua; - return(OK); - case BSIM3_MOD_WUA1: - value->rValue = model->BSIM3wua1; - return(OK); - case BSIM3_MOD_WUB: - value->rValue = model->BSIM3wub; - return(OK); - case BSIM3_MOD_WUB1: - value->rValue = model->BSIM3wub1; - return(OK); - case BSIM3_MOD_WUC: - value->rValue = model->BSIM3wuc; - return(OK); - case BSIM3_MOD_WUC1: - value->rValue = model->BSIM3wuc1; - return(OK); - case BSIM3_MOD_WU0: - value->rValue = model->BSIM3wu0; - return(OK); - case BSIM3_MOD_WUTE: - value->rValue = model->BSIM3wute; - return(OK); - case BSIM3_MOD_WVOFF: - value->rValue = model->BSIM3wvoff; - return(OK); - case BSIM3_MOD_WDELTA: - value->rValue = model->BSIM3wdelta; - return(OK); - case BSIM3_MOD_WRDSW: - value->rValue = model->BSIM3wrdsw; - return(OK); - case BSIM3_MOD_WPRWB: - value->rValue = model->BSIM3wprwb; - return(OK); - case BSIM3_MOD_WPRWG: - value->rValue = model->BSIM3wprwg; - return(OK); - case BSIM3_MOD_WPRT: - value->rValue = model->BSIM3wprt; - return(OK); - case BSIM3_MOD_WETA0: - value->rValue = model->BSIM3weta0; - return(OK); - case BSIM3_MOD_WETAB: - value->rValue = model->BSIM3wetab; - return(OK); - case BSIM3_MOD_WPCLM: - value->rValue = model->BSIM3wpclm; - return(OK); - case BSIM3_MOD_WPDIBL1: - value->rValue = model->BSIM3wpdibl1; - return(OK); - case BSIM3_MOD_WPDIBL2: - value->rValue = model->BSIM3wpdibl2; - return(OK); - case BSIM3_MOD_WPDIBLB: - value->rValue = model->BSIM3wpdiblb; - return(OK); - case BSIM3_MOD_WPSCBE1: - value->rValue = model->BSIM3wpscbe1; - return(OK); - case BSIM3_MOD_WPSCBE2: - value->rValue = model->BSIM3wpscbe2; - return(OK); - case BSIM3_MOD_WPVAG: - value->rValue = model->BSIM3wpvag; - return(OK); - case BSIM3_MOD_WWR: - value->rValue = model->BSIM3wwr; - return(OK); - case BSIM3_MOD_WDWG: - value->rValue = model->BSIM3wdwg; - return(OK); - case BSIM3_MOD_WDWB: - value->rValue = model->BSIM3wdwb; - return(OK); - case BSIM3_MOD_WB0: - value->rValue = model->BSIM3wb0; - return(OK); - case BSIM3_MOD_WB1: - value->rValue = model->BSIM3wb1; - return(OK); - case BSIM3_MOD_WALPHA0: - value->rValue = model->BSIM3walpha0; - return(OK); - case BSIM3_MOD_WALPHA1: - value->rValue = model->BSIM3walpha1; - return(OK); - case BSIM3_MOD_WBETA0: - value->rValue = model->BSIM3wbeta0; - return(OK); - case BSIM3_MOD_WVFB: - value->rValue = model->BSIM3wvfb; - return(OK); - - case BSIM3_MOD_WELM: - value->rValue = model->BSIM3welm; - return(OK); - case BSIM3_MOD_WCGSL: - value->rValue = model->BSIM3wcgsl; - return(OK); - case BSIM3_MOD_WCGDL: - value->rValue = model->BSIM3wcgdl; - return(OK); - case BSIM3_MOD_WCKAPPA: - value->rValue = model->BSIM3wckappa; - return(OK); - case BSIM3_MOD_WCF: - value->rValue = model->BSIM3wcf; - return(OK); - case BSIM3_MOD_WCLC: - value->rValue = model->BSIM3wclc; - return(OK); - case BSIM3_MOD_WCLE: - value->rValue = model->BSIM3wcle; - return(OK); - case BSIM3_MOD_WVFBCV: - value->rValue = model->BSIM3wvfbcv; - return(OK); - case BSIM3_MOD_WACDE: - value->rValue = model->BSIM3wacde; - return(OK); - case BSIM3_MOD_WMOIN: - value->rValue = model->BSIM3wmoin; - return(OK); - case BSIM3_MOD_WNOFF: - value->rValue = model->BSIM3wnoff; - return(OK); - case BSIM3_MOD_WVOFFCV: - value->rValue = model->BSIM3wvoffcv; - return(OK); - - /* Cross-term dependence */ - case BSIM3_MOD_PCDSC : - value->rValue = model->BSIM3pcdsc; - return(OK); - case BSIM3_MOD_PCDSCB : - value->rValue = model->BSIM3pcdscb; - return(OK); - case BSIM3_MOD_PCDSCD : - value->rValue = model->BSIM3pcdscd; - return(OK); - case BSIM3_MOD_PCIT : - value->rValue = model->BSIM3pcit; - return(OK); - case BSIM3_MOD_PNFACTOR : - value->rValue = model->BSIM3pnfactor; - return(OK); - case BSIM3_MOD_PXJ: - value->rValue = model->BSIM3pxj; - return(OK); - case BSIM3_MOD_PVSAT: - value->rValue = model->BSIM3pvsat; - return(OK); - case BSIM3_MOD_PAT: - value->rValue = model->BSIM3pat; - return(OK); - case BSIM3_MOD_PA0: - value->rValue = model->BSIM3pa0; - return(OK); - case BSIM3_MOD_PAGS: - value->rValue = model->BSIM3pags; - return(OK); - case BSIM3_MOD_PA1: - value->rValue = model->BSIM3pa1; - return(OK); - case BSIM3_MOD_PA2: - value->rValue = model->BSIM3pa2; - return(OK); - case BSIM3_MOD_PKETA: - value->rValue = model->BSIM3pketa; - return(OK); - case BSIM3_MOD_PNSUB: - value->rValue = model->BSIM3pnsub; - return(OK); - case BSIM3_MOD_PNPEAK: - value->rValue = model->BSIM3pnpeak; - return(OK); - case BSIM3_MOD_PNGATE: - value->rValue = model->BSIM3pngate; - return(OK); - case BSIM3_MOD_PGAMMA1: - value->rValue = model->BSIM3pgamma1; - return(OK); - case BSIM3_MOD_PGAMMA2: - value->rValue = model->BSIM3pgamma2; - return(OK); - case BSIM3_MOD_PVBX: - value->rValue = model->BSIM3pvbx; - return(OK); - case BSIM3_MOD_PVBM: - value->rValue = model->BSIM3pvbm; - return(OK); - case BSIM3_MOD_PXT: - value->rValue = model->BSIM3pxt; - return(OK); - case BSIM3_MOD_PK1: - value->rValue = model->BSIM3pk1; - return(OK); - case BSIM3_MOD_PKT1: - value->rValue = model->BSIM3pkt1; - return(OK); - case BSIM3_MOD_PKT1L: - value->rValue = model->BSIM3pkt1l; - return(OK); - case BSIM3_MOD_PKT2 : - value->rValue = model->BSIM3pkt2; - return(OK); - case BSIM3_MOD_PK2 : - value->rValue = model->BSIM3pk2; - return(OK); - case BSIM3_MOD_PK3: - value->rValue = model->BSIM3pk3; - return(OK); - case BSIM3_MOD_PK3B: - value->rValue = model->BSIM3pk3b; - return(OK); - case BSIM3_MOD_PW0: - value->rValue = model->BSIM3pw0; - return(OK); - case BSIM3_MOD_PNLX: - value->rValue = model->BSIM3pnlx; - return(OK); - case BSIM3_MOD_PDVT0 : - value->rValue = model->BSIM3pdvt0; - return(OK); - case BSIM3_MOD_PDVT1 : - value->rValue = model->BSIM3pdvt1; - return(OK); - case BSIM3_MOD_PDVT2 : - value->rValue = model->BSIM3pdvt2; - return(OK); - case BSIM3_MOD_PDVT0W : - value->rValue = model->BSIM3pdvt0w; - return(OK); - case BSIM3_MOD_PDVT1W : - value->rValue = model->BSIM3pdvt1w; - return(OK); - case BSIM3_MOD_PDVT2W : - value->rValue = model->BSIM3pdvt2w; - return(OK); - case BSIM3_MOD_PDROUT : - value->rValue = model->BSIM3pdrout; - return(OK); - case BSIM3_MOD_PDSUB : - value->rValue = model->BSIM3pdsub; - return(OK); - case BSIM3_MOD_PVTH0: - value->rValue = model->BSIM3pvth0; - return(OK); - case BSIM3_MOD_PUA: - value->rValue = model->BSIM3pua; - return(OK); - case BSIM3_MOD_PUA1: - value->rValue = model->BSIM3pua1; - return(OK); - case BSIM3_MOD_PUB: - value->rValue = model->BSIM3pub; - return(OK); - case BSIM3_MOD_PUB1: - value->rValue = model->BSIM3pub1; - return(OK); - case BSIM3_MOD_PUC: - value->rValue = model->BSIM3puc; - return(OK); - case BSIM3_MOD_PUC1: - value->rValue = model->BSIM3puc1; - return(OK); - case BSIM3_MOD_PU0: - value->rValue = model->BSIM3pu0; - return(OK); - case BSIM3_MOD_PUTE: - value->rValue = model->BSIM3pute; - return(OK); - case BSIM3_MOD_PVOFF: - value->rValue = model->BSIM3pvoff; - return(OK); - case BSIM3_MOD_PDELTA: - value->rValue = model->BSIM3pdelta; - return(OK); - case BSIM3_MOD_PRDSW: - value->rValue = model->BSIM3prdsw; - return(OK); - case BSIM3_MOD_PPRWB: - value->rValue = model->BSIM3pprwb; - return(OK); - case BSIM3_MOD_PPRWG: - value->rValue = model->BSIM3pprwg; - return(OK); - case BSIM3_MOD_PPRT: - value->rValue = model->BSIM3pprt; - return(OK); - case BSIM3_MOD_PETA0: - value->rValue = model->BSIM3peta0; - return(OK); - case BSIM3_MOD_PETAB: - value->rValue = model->BSIM3petab; - return(OK); - case BSIM3_MOD_PPCLM: - value->rValue = model->BSIM3ppclm; - return(OK); - case BSIM3_MOD_PPDIBL1: - value->rValue = model->BSIM3ppdibl1; - return(OK); - case BSIM3_MOD_PPDIBL2: - value->rValue = model->BSIM3ppdibl2; - return(OK); - case BSIM3_MOD_PPDIBLB: - value->rValue = model->BSIM3ppdiblb; - return(OK); - case BSIM3_MOD_PPSCBE1: - value->rValue = model->BSIM3ppscbe1; - return(OK); - case BSIM3_MOD_PPSCBE2: - value->rValue = model->BSIM3ppscbe2; - return(OK); - case BSIM3_MOD_PPVAG: - value->rValue = model->BSIM3ppvag; - return(OK); - case BSIM3_MOD_PWR: - value->rValue = model->BSIM3pwr; - return(OK); - case BSIM3_MOD_PDWG: - value->rValue = model->BSIM3pdwg; - return(OK); - case BSIM3_MOD_PDWB: - value->rValue = model->BSIM3pdwb; - return(OK); - case BSIM3_MOD_PB0: - value->rValue = model->BSIM3pb0; - return(OK); - case BSIM3_MOD_PB1: - value->rValue = model->BSIM3pb1; - return(OK); - case BSIM3_MOD_PALPHA0: - value->rValue = model->BSIM3palpha0; - return(OK); - case BSIM3_MOD_PALPHA1: - value->rValue = model->BSIM3palpha1; - return(OK); - case BSIM3_MOD_PBETA0: - value->rValue = model->BSIM3pbeta0; - return(OK); - case BSIM3_MOD_PVFB: - value->rValue = model->BSIM3pvfb; - return(OK); - - case BSIM3_MOD_PELM: - value->rValue = model->BSIM3pelm; - return(OK); - case BSIM3_MOD_PCGSL: - value->rValue = model->BSIM3pcgsl; - return(OK); - case BSIM3_MOD_PCGDL: - value->rValue = model->BSIM3pcgdl; - return(OK); - case BSIM3_MOD_PCKAPPA: - value->rValue = model->BSIM3pckappa; - return(OK); - case BSIM3_MOD_PCF: - value->rValue = model->BSIM3pcf; - return(OK); - case BSIM3_MOD_PCLC: - value->rValue = model->BSIM3pclc; - return(OK); - case BSIM3_MOD_PCLE: - value->rValue = model->BSIM3pcle; - return(OK); - case BSIM3_MOD_PVFBCV: - value->rValue = model->BSIM3pvfbcv; - return(OK); - case BSIM3_MOD_PACDE: - value->rValue = model->BSIM3pacde; - return(OK); - case BSIM3_MOD_PMOIN: - value->rValue = model->BSIM3pmoin; - return(OK); - case BSIM3_MOD_PNOFF: - value->rValue = model->BSIM3pnoff; - return(OK); - case BSIM3_MOD_PVOFFCV: - value->rValue = model->BSIM3pvoffcv; - return(OK); - - case BSIM3_MOD_TNOM : - value->rValue = model->BSIM3tnom; - return(OK); - case BSIM3_MOD_CGSO: - value->rValue = model->BSIM3cgso; - return(OK); - case BSIM3_MOD_CGDO: - value->rValue = model->BSIM3cgdo; - return(OK); - case BSIM3_MOD_CGBO: - value->rValue = model->BSIM3cgbo; - return(OK); - case BSIM3_MOD_XPART: - value->rValue = model->BSIM3xpart; - return(OK); - case BSIM3_MOD_RSH: - value->rValue = model->BSIM3sheetResistance; - return(OK); - case BSIM3_MOD_JS: - value->rValue = model->BSIM3jctSatCurDensity; - return(OK); - case BSIM3_MOD_JSW: - value->rValue = model->BSIM3jctSidewallSatCurDensity; - return(OK); - case BSIM3_MOD_PB: - value->rValue = model->BSIM3bulkJctPotential; - return(OK); - case BSIM3_MOD_MJ: - value->rValue = model->BSIM3bulkJctBotGradingCoeff; - return(OK); - case BSIM3_MOD_PBSW: - value->rValue = model->BSIM3sidewallJctPotential; - return(OK); - case BSIM3_MOD_MJSW: - value->rValue = model->BSIM3bulkJctSideGradingCoeff; - return(OK); - case BSIM3_MOD_CJ: - value->rValue = model->BSIM3unitAreaJctCap; - return(OK); - case BSIM3_MOD_CJSW: - value->rValue = model->BSIM3unitLengthSidewallJctCap; - return(OK); - case BSIM3_MOD_PBSWG: - value->rValue = model->BSIM3GatesidewallJctPotential; - return(OK); - case BSIM3_MOD_MJSWG: - value->rValue = model->BSIM3bulkJctGateSideGradingCoeff; - return(OK); - case BSIM3_MOD_CJSWG: - value->rValue = model->BSIM3unitLengthGateSidewallJctCap; - return(OK); - case BSIM3_MOD_NJ: - value->rValue = model->BSIM3jctEmissionCoeff; - return(OK); - case BSIM3_MOD_XTI: - value->rValue = model->BSIM3jctTempExponent; - return(OK); - case BSIM3_MOD_LINTNOI: - value->rValue = model->BSIM3lintnoi; - return(OK); - case BSIM3_MOD_LINT: - value->rValue = model->BSIM3Lint; - return(OK); - case BSIM3_MOD_LL: - value->rValue = model->BSIM3Ll; - return(OK); - case BSIM3_MOD_LLC: - value->rValue = model->BSIM3Llc; - return(OK); - case BSIM3_MOD_LLN: - value->rValue = model->BSIM3Lln; - return(OK); - case BSIM3_MOD_LW: - value->rValue = model->BSIM3Lw; - return(OK); - case BSIM3_MOD_LWC: - value->rValue = model->BSIM3Lwc; - return(OK); - case BSIM3_MOD_LWN: - value->rValue = model->BSIM3Lwn; - return(OK); - case BSIM3_MOD_LWL: - value->rValue = model->BSIM3Lwl; - return(OK); - case BSIM3_MOD_LWLC: - value->rValue = model->BSIM3Lwlc; - return(OK); - case BSIM3_MOD_LMIN: - value->rValue = model->BSIM3Lmin; - return(OK); - case BSIM3_MOD_LMAX: - value->rValue = model->BSIM3Lmax; - return(OK); - case BSIM3_MOD_WINT: - value->rValue = model->BSIM3Wint; - return(OK); - case BSIM3_MOD_WL: - value->rValue = model->BSIM3Wl; - return(OK); - case BSIM3_MOD_WLC: - value->rValue = model->BSIM3Wlc; - return(OK); - case BSIM3_MOD_WLN: - value->rValue = model->BSIM3Wln; - return(OK); - case BSIM3_MOD_WW: - value->rValue = model->BSIM3Ww; - return(OK); - case BSIM3_MOD_WWC: - value->rValue = model->BSIM3Wwc; - return(OK); - case BSIM3_MOD_WWN: - value->rValue = model->BSIM3Wwn; - return(OK); - case BSIM3_MOD_WWL: - value->rValue = model->BSIM3Wwl; - return(OK); - case BSIM3_MOD_WWLC: - value->rValue = model->BSIM3Wwlc; - return(OK); - case BSIM3_MOD_WMIN: - value->rValue = model->BSIM3Wmin; - return(OK); - case BSIM3_MOD_WMAX: - value->rValue = model->BSIM3Wmax; - return(OK); - - case BSIM3_MOD_XL: - value->rValue = model->BSIM3xl; - return(OK); - case BSIM3_MOD_XW: - value->rValue = model->BSIM3xw; - return(OK); - - case BSIM3_MOD_NOIA: - value->rValue = model->BSIM3oxideTrapDensityA; - return(OK); - case BSIM3_MOD_NOIB: - value->rValue = model->BSIM3oxideTrapDensityB; - return(OK); - case BSIM3_MOD_NOIC: - value->rValue = model->BSIM3oxideTrapDensityC; - return(OK); - case BSIM3_MOD_EM: - value->rValue = model->BSIM3em; - return(OK); - case BSIM3_MOD_EF: - value->rValue = model->BSIM3ef; - return(OK); - case BSIM3_MOD_AF: - value->rValue = model->BSIM3af; - return(OK); - case BSIM3_MOD_KF: - value->rValue = model->BSIM3kf; - return(OK); - - case BSIM3_MOD_VGS_MAX: - value->rValue = model->BSIM3vgsMax; - return(OK); - case BSIM3_MOD_VGD_MAX: - value->rValue = model->BSIM3vgdMax; - return(OK); - case BSIM3_MOD_VGB_MAX: - value->rValue = model->BSIM3vgbMax; - return(OK); - case BSIM3_MOD_VDS_MAX: - value->rValue = model->BSIM3vdsMax; - return(OK); - case BSIM3_MOD_VBS_MAX: - value->rValue = model->BSIM3vbsMax; - return(OK); - case BSIM3_MOD_VBD_MAX: - value->rValue = model->BSIM3vbdMax; - return(OK); - case BSIM3_MOD_VGSR_MAX: - value->rValue = model->BSIM3vgsrMax; - return(OK); - case BSIM3_MOD_VGDR_MAX: - value->rValue = model->BSIM3vgdrMax; - return(OK); - case BSIM3_MOD_VGBR_MAX: - value->rValue = model->BSIM3vgbrMax; - return(OK); - case BSIM3_MOD_VBSR_MAX: - value->rValue = model->BSIM3vbsrMax; - return(OK); - case BSIM3_MOD_VBDR_MAX: - value->rValue = model->BSIM3vbdrMax; - return(OK); - - default: - return(E_BADPARM); - } - /* NOTREACHED */ -} - - - diff --git a/src/spicelib/devices/bsim3/b3mdel.c b/src/spicelib/devices/bsim3/b3mdel.c deleted file mode 100644 index 33d7b7faa..000000000 --- a/src/spicelib/devices/bsim3/b3mdel.c +++ /dev/null @@ -1,37 +0,0 @@ -/**** BSIM3v3.3.0, Released by Xuemei Xi 07/29/2005 ****/ - -/********** - * Copyright 2004 Regents of the University of California. All rights reserved. - * File: b3mdel.c of BSIM3v3.3.0 - * Author: 1995 Min-Chie Jeng and Mansun Chan. - * Author: 1997-1999 Weidong Liu. - * Author: 2001 Xuemei Xi - **********/ - -#include "ngspice/ngspice.h" -#include "bsim3def.h" -#include "ngspice/sperror.h" -#include "ngspice/suffix.h" - - -int -BSIM3mDelete(GENmodel *gen_model) -{ - BSIM3model *model = (BSIM3model*) gen_model; - -#ifdef USE_OMP - FREE(model->BSIM3InstanceArray); -#endif - - struct bsim3SizeDependParam *p = model->pSizeDependParamKnot; - while (p) { - struct bsim3SizeDependParam *next_p = p->pNext; - FREE(p); - p = next_p; - } - - /* model->BSIM3modName to be freed in INPtabEnd() */ - FREE(model->BSIM3version); - - return OK; -} diff --git a/src/spicelib/devices/bsim3/b3mpar.c b/src/spicelib/devices/bsim3/b3mpar.c deleted file mode 100644 index 9965c07be..000000000 --- a/src/spicelib/devices/bsim3/b3mpar.c +++ /dev/null @@ -1,1786 +0,0 @@ -/**** BSIM3v3.3.0, Released by Xuemei Xi 07/29/2005 ****/ - -/********** - * Copyright 2004 Regents of the University of California. All rights reserved. - * File: b3mpar.c of BSIM3v3.3.0 - * Author: 1995 Min-Chie Jeng and Mansun Chan. - * Author: 1997-1999 Weidong Liu. - * Author: 2001 Xuemei Xi - **********/ - -#include "ngspice/ngspice.h" -#include "bsim3def.h" -#include "ngspice/ifsim.h" -#include "ngspice/sperror.h" -#include "ngspice/suffix.h" - - -int -BSIM3mParam( -int param, -IFvalue *value, -GENmodel *inMod) -{ - BSIM3model *mod = (BSIM3model*)inMod; - switch(param) - { case BSIM3_MOD_MOBMOD : - mod->BSIM3mobMod = value->iValue; - mod->BSIM3mobModGiven = TRUE; - break; - case BSIM3_MOD_BINUNIT : - mod->BSIM3binUnit = value->iValue; - mod->BSIM3binUnitGiven = TRUE; - break; - case BSIM3_MOD_PARAMCHK : - mod->BSIM3paramChk = value->iValue; - mod->BSIM3paramChkGiven = TRUE; - break; - case BSIM3_MOD_CAPMOD : - mod->BSIM3capMod = value->iValue; - mod->BSIM3capModGiven = TRUE; - break; - case BSIM3_MOD_ACMMOD: - mod->BSIM3acmMod = value->iValue; - mod->BSIM3acmModGiven = TRUE; - break; - case BSIM3_MOD_CALCACM: - mod->BSIM3calcacm = value->iValue; - mod->BSIM3calcacmGiven = TRUE; - break; - case BSIM3_MOD_NOIMOD : - mod->BSIM3noiMod = value->iValue; - mod->BSIM3noiModGiven = TRUE; - break; - case BSIM3_MOD_NQSMOD : - mod->BSIM3nqsMod = value->iValue; - mod->BSIM3nqsModGiven = TRUE; - break; - case BSIM3_MOD_ACNQSMOD : - mod->BSIM3acnqsMod = value->iValue; - mod->BSIM3acnqsModGiven = TRUE; - break; - case BSIM3_MOD_VERSION : - mod->BSIM3version = value->sValue; - mod->BSIM3versionGiven = TRUE; - break; - case BSIM3_MOD_TOX : - mod->BSIM3tox = value->rValue; - mod->BSIM3toxGiven = TRUE; - break; - case BSIM3_MOD_TOXM : - mod->BSIM3toxm = value->rValue; - mod->BSIM3toxmGiven = TRUE; - break; - - case BSIM3_MOD_CDSC : - mod->BSIM3cdsc = value->rValue; - mod->BSIM3cdscGiven = TRUE; - break; - case BSIM3_MOD_CDSCB : - mod->BSIM3cdscb = value->rValue; - mod->BSIM3cdscbGiven = TRUE; - break; - - case BSIM3_MOD_CDSCD : - mod->BSIM3cdscd = value->rValue; - mod->BSIM3cdscdGiven = TRUE; - break; - - case BSIM3_MOD_CIT : - mod->BSIM3cit = value->rValue; - mod->BSIM3citGiven = TRUE; - break; - case BSIM3_MOD_NFACTOR : - mod->BSIM3nfactor = value->rValue; - mod->BSIM3nfactorGiven = TRUE; - break; - case BSIM3_MOD_XJ: - mod->BSIM3xj = value->rValue; - mod->BSIM3xjGiven = TRUE; - break; - case BSIM3_MOD_VSAT: - mod->BSIM3vsat = value->rValue; - mod->BSIM3vsatGiven = TRUE; - break; - case BSIM3_MOD_A0: - mod->BSIM3a0 = value->rValue; - mod->BSIM3a0Given = TRUE; - break; - - case BSIM3_MOD_AGS: - mod->BSIM3ags= value->rValue; - mod->BSIM3agsGiven = TRUE; - break; - - case BSIM3_MOD_A1: - mod->BSIM3a1 = value->rValue; - mod->BSIM3a1Given = TRUE; - break; - case BSIM3_MOD_A2: - mod->BSIM3a2 = value->rValue; - mod->BSIM3a2Given = TRUE; - break; - case BSIM3_MOD_AT: - mod->BSIM3at = value->rValue; - mod->BSIM3atGiven = TRUE; - break; - case BSIM3_MOD_KETA: - mod->BSIM3keta = value->rValue; - mod->BSIM3ketaGiven = TRUE; - break; - case BSIM3_MOD_NSUB: - mod->BSIM3nsub = value->rValue; - mod->BSIM3nsubGiven = TRUE; - break; - case BSIM3_MOD_NPEAK: - mod->BSIM3npeak = value->rValue; - mod->BSIM3npeakGiven = TRUE; - if (mod->BSIM3npeak > 1.0e20) - mod->BSIM3npeak *= 1.0e-6; - break; - case BSIM3_MOD_NGATE: - mod->BSIM3ngate = value->rValue; - mod->BSIM3ngateGiven = TRUE; - if (mod->BSIM3ngate > 1.000001e24) - mod->BSIM3ngate *= 1.0e-6; - break; - case BSIM3_MOD_GAMMA1: - mod->BSIM3gamma1 = value->rValue; - mod->BSIM3gamma1Given = TRUE; - break; - case BSIM3_MOD_GAMMA2: - mod->BSIM3gamma2 = value->rValue; - mod->BSIM3gamma2Given = TRUE; - break; - case BSIM3_MOD_VBX: - mod->BSIM3vbx = value->rValue; - mod->BSIM3vbxGiven = TRUE; - break; - case BSIM3_MOD_VBM: - mod->BSIM3vbm = value->rValue; - mod->BSIM3vbmGiven = TRUE; - break; - case BSIM3_MOD_XT: - mod->BSIM3xt = value->rValue; - mod->BSIM3xtGiven = TRUE; - break; - case BSIM3_MOD_K1: - mod->BSIM3k1 = value->rValue; - mod->BSIM3k1Given = TRUE; - break; - case BSIM3_MOD_KT1: - mod->BSIM3kt1 = value->rValue; - mod->BSIM3kt1Given = TRUE; - break; - case BSIM3_MOD_KT1L: - mod->BSIM3kt1l = value->rValue; - mod->BSIM3kt1lGiven = TRUE; - break; - case BSIM3_MOD_KT2: - mod->BSIM3kt2 = value->rValue; - mod->BSIM3kt2Given = TRUE; - break; - case BSIM3_MOD_K2: - mod->BSIM3k2 = value->rValue; - mod->BSIM3k2Given = TRUE; - break; - case BSIM3_MOD_K3: - mod->BSIM3k3 = value->rValue; - mod->BSIM3k3Given = TRUE; - break; - case BSIM3_MOD_K3B: - mod->BSIM3k3b = value->rValue; - mod->BSIM3k3bGiven = TRUE; - break; - case BSIM3_MOD_NLX: - mod->BSIM3nlx = value->rValue; - mod->BSIM3nlxGiven = TRUE; - break; - case BSIM3_MOD_W0: - mod->BSIM3w0 = value->rValue; - mod->BSIM3w0Given = TRUE; - break; - case BSIM3_MOD_DVT0: - mod->BSIM3dvt0 = value->rValue; - mod->BSIM3dvt0Given = TRUE; - break; - case BSIM3_MOD_DVT1: - mod->BSIM3dvt1 = value->rValue; - mod->BSIM3dvt1Given = TRUE; - break; - case BSIM3_MOD_DVT2: - mod->BSIM3dvt2 = value->rValue; - mod->BSIM3dvt2Given = TRUE; - break; - case BSIM3_MOD_DVT0W: - mod->BSIM3dvt0w = value->rValue; - mod->BSIM3dvt0wGiven = TRUE; - break; - case BSIM3_MOD_DVT1W: - mod->BSIM3dvt1w = value->rValue; - mod->BSIM3dvt1wGiven = TRUE; - break; - case BSIM3_MOD_DVT2W: - mod->BSIM3dvt2w = value->rValue; - mod->BSIM3dvt2wGiven = TRUE; - break; - case BSIM3_MOD_DROUT: - mod->BSIM3drout = value->rValue; - mod->BSIM3droutGiven = TRUE; - break; - case BSIM3_MOD_DSUB: - mod->BSIM3dsub = value->rValue; - mod->BSIM3dsubGiven = TRUE; - break; - case BSIM3_MOD_VTH0: - mod->BSIM3vth0 = value->rValue; - mod->BSIM3vth0Given = TRUE; - break; - case BSIM3_MOD_UA: - mod->BSIM3ua = value->rValue; - mod->BSIM3uaGiven = TRUE; - break; - case BSIM3_MOD_UA1: - mod->BSIM3ua1 = value->rValue; - mod->BSIM3ua1Given = TRUE; - break; - case BSIM3_MOD_UB: - mod->BSIM3ub = value->rValue; - mod->BSIM3ubGiven = TRUE; - break; - case BSIM3_MOD_UB1: - mod->BSIM3ub1 = value->rValue; - mod->BSIM3ub1Given = TRUE; - break; - case BSIM3_MOD_UC: - mod->BSIM3uc = value->rValue; - mod->BSIM3ucGiven = TRUE; - break; - case BSIM3_MOD_UC1: - mod->BSIM3uc1 = value->rValue; - mod->BSIM3uc1Given = TRUE; - break; - case BSIM3_MOD_U0 : - mod->BSIM3u0 = value->rValue; - mod->BSIM3u0Given = TRUE; - break; - case BSIM3_MOD_UTE : - mod->BSIM3ute = value->rValue; - mod->BSIM3uteGiven = TRUE; - break; - case BSIM3_MOD_VOFF: - mod->BSIM3voff = value->rValue; - mod->BSIM3voffGiven = TRUE; - break; - case BSIM3_MOD_DELTA : - mod->BSIM3delta = value->rValue; - mod->BSIM3deltaGiven = TRUE; - break; - case BSIM3_MOD_RDSW: - mod->BSIM3rdsw = value->rValue; - mod->BSIM3rdswGiven = TRUE; - break; - case BSIM3_MOD_PRWG: - mod->BSIM3prwg = value->rValue; - mod->BSIM3prwgGiven = TRUE; - break; - case BSIM3_MOD_PRWB: - mod->BSIM3prwb = value->rValue; - mod->BSIM3prwbGiven = TRUE; - break; - case BSIM3_MOD_PRT: - mod->BSIM3prt = value->rValue; - mod->BSIM3prtGiven = TRUE; - break; - case BSIM3_MOD_ETA0: - mod->BSIM3eta0 = value->rValue; - mod->BSIM3eta0Given = TRUE; - break; - case BSIM3_MOD_ETAB: - mod->BSIM3etab = value->rValue; - mod->BSIM3etabGiven = TRUE; - break; - case BSIM3_MOD_PCLM: - mod->BSIM3pclm = value->rValue; - mod->BSIM3pclmGiven = TRUE; - break; - case BSIM3_MOD_PDIBL1: - mod->BSIM3pdibl1 = value->rValue; - mod->BSIM3pdibl1Given = TRUE; - break; - case BSIM3_MOD_PDIBL2: - mod->BSIM3pdibl2 = value->rValue; - mod->BSIM3pdibl2Given = TRUE; - break; - case BSIM3_MOD_PDIBLB: - mod->BSIM3pdiblb = value->rValue; - mod->BSIM3pdiblbGiven = TRUE; - break; - case BSIM3_MOD_PSCBE1: - mod->BSIM3pscbe1 = value->rValue; - mod->BSIM3pscbe1Given = TRUE; - break; - case BSIM3_MOD_PSCBE2: - mod->BSIM3pscbe2 = value->rValue; - mod->BSIM3pscbe2Given = TRUE; - break; - case BSIM3_MOD_PVAG: - mod->BSIM3pvag = value->rValue; - mod->BSIM3pvagGiven = TRUE; - break; - case BSIM3_MOD_WR : - mod->BSIM3wr = value->rValue; - mod->BSIM3wrGiven = TRUE; - break; - case BSIM3_MOD_DWG : - mod->BSIM3dwg = value->rValue; - mod->BSIM3dwgGiven = TRUE; - break; - case BSIM3_MOD_DWB : - mod->BSIM3dwb = value->rValue; - mod->BSIM3dwbGiven = TRUE; - break; - case BSIM3_MOD_B0 : - mod->BSIM3b0 = value->rValue; - mod->BSIM3b0Given = TRUE; - break; - case BSIM3_MOD_B1 : - mod->BSIM3b1 = value->rValue; - mod->BSIM3b1Given = TRUE; - break; - case BSIM3_MOD_ALPHA0 : - mod->BSIM3alpha0 = value->rValue; - mod->BSIM3alpha0Given = TRUE; - break; - case BSIM3_MOD_ALPHA1 : - mod->BSIM3alpha1 = value->rValue; - mod->BSIM3alpha1Given = TRUE; - break; - case BSIM3_MOD_BETA0 : - mod->BSIM3beta0 = value->rValue; - mod->BSIM3beta0Given = TRUE; - break; - case BSIM3_MOD_IJTH : - mod->BSIM3ijth = value->rValue; - mod->BSIM3ijthGiven = TRUE; - break; - case BSIM3_MOD_VFB : - mod->BSIM3vfb = value->rValue; - mod->BSIM3vfbGiven = TRUE; - break; - - case BSIM3_MOD_ELM : - mod->BSIM3elm = value->rValue; - mod->BSIM3elmGiven = TRUE; - break; - case BSIM3_MOD_CGSL : - mod->BSIM3cgsl = value->rValue; - mod->BSIM3cgslGiven = TRUE; - break; - case BSIM3_MOD_CGDL : - mod->BSIM3cgdl = value->rValue; - mod->BSIM3cgdlGiven = TRUE; - break; - case BSIM3_MOD_CKAPPA : - mod->BSIM3ckappa = value->rValue; - mod->BSIM3ckappaGiven = TRUE; - break; - case BSIM3_MOD_CF : - mod->BSIM3cf = value->rValue; - mod->BSIM3cfGiven = TRUE; - break; - case BSIM3_MOD_CLC : - mod->BSIM3clc = value->rValue; - mod->BSIM3clcGiven = TRUE; - break; - case BSIM3_MOD_CLE : - mod->BSIM3cle = value->rValue; - mod->BSIM3cleGiven = TRUE; - break; - case BSIM3_MOD_DWC : - mod->BSIM3dwc = value->rValue; - mod->BSIM3dwcGiven = TRUE; - break; - case BSIM3_MOD_DLC : - mod->BSIM3dlc = value->rValue; - mod->BSIM3dlcGiven = TRUE; - break; - case BSIM3_MOD_VFBCV : - mod->BSIM3vfbcv = value->rValue; - mod->BSIM3vfbcvGiven = TRUE; - break; - case BSIM3_MOD_ACDE : - mod->BSIM3acde = value->rValue; - mod->BSIM3acdeGiven = TRUE; - break; - case BSIM3_MOD_MOIN : - mod->BSIM3moin = value->rValue; - mod->BSIM3moinGiven = TRUE; - break; - case BSIM3_MOD_NOFF : - mod->BSIM3noff = value->rValue; - mod->BSIM3noffGiven = TRUE; - break; - case BSIM3_MOD_VOFFCV : - mod->BSIM3voffcv = value->rValue; - mod->BSIM3voffcvGiven = TRUE; - break; - case BSIM3_MOD_TCJ : - mod->BSIM3tcj = value->rValue; - mod->BSIM3tcjGiven = TRUE; - break; - case BSIM3_MOD_TPB : - mod->BSIM3tpb = value->rValue; - mod->BSIM3tpbGiven = TRUE; - break; - case BSIM3_MOD_TCJSW : - mod->BSIM3tcjsw = value->rValue; - mod->BSIM3tcjswGiven = TRUE; - break; - case BSIM3_MOD_TPBSW : - mod->BSIM3tpbsw = value->rValue; - mod->BSIM3tpbswGiven = TRUE; - break; - case BSIM3_MOD_TCJSWG : - mod->BSIM3tcjswg = value->rValue; - mod->BSIM3tcjswgGiven = TRUE; - break; - case BSIM3_MOD_TPBSWG : - mod->BSIM3tpbswg = value->rValue; - mod->BSIM3tpbswgGiven = TRUE; - break; - - /* acm model */ - case BSIM3_MOD_HDIF: - mod->BSIM3hdif = value->rValue; - mod->BSIM3hdifGiven = TRUE; - break; - case BSIM3_MOD_LDIF: - mod->BSIM3ldif = value->rValue; - mod->BSIM3ldifGiven = TRUE; - break; - case BSIM3_MOD_LD: - mod->BSIM3ld = value->rValue; - mod->BSIM3ldGiven = TRUE; - break; - case BSIM3_MOD_RD: - mod->BSIM3rd = value->rValue; - mod->BSIM3rdGiven = TRUE; - break; - case BSIM3_MOD_RS: - mod->BSIM3rs = value->rValue; - mod->BSIM3rsGiven = TRUE; - break; - case BSIM3_MOD_RDC: - mod->BSIM3rdc = value->rValue; - mod->BSIM3rdcGiven = TRUE; - break; - case BSIM3_MOD_RSC: - mod->BSIM3rsc = value->rValue; - mod->BSIM3rscGiven = TRUE; - break; - case BSIM3_MOD_WMLT: - mod->BSIM3wmlt = value->rValue; - mod->BSIM3wmltGiven = TRUE; - break; - - /* Length dependence */ - case BSIM3_MOD_LCDSC : - mod->BSIM3lcdsc = value->rValue; - mod->BSIM3lcdscGiven = TRUE; - break; - - - case BSIM3_MOD_LCDSCB : - mod->BSIM3lcdscb = value->rValue; - mod->BSIM3lcdscbGiven = TRUE; - break; - case BSIM3_MOD_LCDSCD : - mod->BSIM3lcdscd = value->rValue; - mod->BSIM3lcdscdGiven = TRUE; - break; - case BSIM3_MOD_LCIT : - mod->BSIM3lcit = value->rValue; - mod->BSIM3lcitGiven = TRUE; - break; - case BSIM3_MOD_LNFACTOR : - mod->BSIM3lnfactor = value->rValue; - mod->BSIM3lnfactorGiven = TRUE; - break; - case BSIM3_MOD_LXJ: - mod->BSIM3lxj = value->rValue; - mod->BSIM3lxjGiven = TRUE; - break; - case BSIM3_MOD_LVSAT: - mod->BSIM3lvsat = value->rValue; - mod->BSIM3lvsatGiven = TRUE; - break; - - - case BSIM3_MOD_LA0: - mod->BSIM3la0 = value->rValue; - mod->BSIM3la0Given = TRUE; - break; - case BSIM3_MOD_LAGS: - mod->BSIM3lags = value->rValue; - mod->BSIM3lagsGiven = TRUE; - break; - case BSIM3_MOD_LA1: - mod->BSIM3la1 = value->rValue; - mod->BSIM3la1Given = TRUE; - break; - case BSIM3_MOD_LA2: - mod->BSIM3la2 = value->rValue; - mod->BSIM3la2Given = TRUE; - break; - case BSIM3_MOD_LAT: - mod->BSIM3lat = value->rValue; - mod->BSIM3latGiven = TRUE; - break; - case BSIM3_MOD_LKETA: - mod->BSIM3lketa = value->rValue; - mod->BSIM3lketaGiven = TRUE; - break; - case BSIM3_MOD_LNSUB: - mod->BSIM3lnsub = value->rValue; - mod->BSIM3lnsubGiven = TRUE; - break; - case BSIM3_MOD_LNPEAK: - mod->BSIM3lnpeak = value->rValue; - mod->BSIM3lnpeakGiven = TRUE; - if (mod->BSIM3lnpeak > 1.0e20) - mod->BSIM3lnpeak *= 1.0e-6; - break; - case BSIM3_MOD_LNGATE: - mod->BSIM3lngate = value->rValue; - mod->BSIM3lngateGiven = TRUE; - if (mod->BSIM3lngate > 1.0e23) - mod->BSIM3lngate *= 1.0e-6; - break; - case BSIM3_MOD_LGAMMA1: - mod->BSIM3lgamma1 = value->rValue; - mod->BSIM3lgamma1Given = TRUE; - break; - case BSIM3_MOD_LGAMMA2: - mod->BSIM3lgamma2 = value->rValue; - mod->BSIM3lgamma2Given = TRUE; - break; - case BSIM3_MOD_LVBX: - mod->BSIM3lvbx = value->rValue; - mod->BSIM3lvbxGiven = TRUE; - break; - case BSIM3_MOD_LVBM: - mod->BSIM3lvbm = value->rValue; - mod->BSIM3lvbmGiven = TRUE; - break; - case BSIM3_MOD_LXT: - mod->BSIM3lxt = value->rValue; - mod->BSIM3lxtGiven = TRUE; - break; - case BSIM3_MOD_LK1: - mod->BSIM3lk1 = value->rValue; - mod->BSIM3lk1Given = TRUE; - break; - case BSIM3_MOD_LKT1: - mod->BSIM3lkt1 = value->rValue; - mod->BSIM3lkt1Given = TRUE; - break; - case BSIM3_MOD_LKT1L: - mod->BSIM3lkt1l = value->rValue; - mod->BSIM3lkt1lGiven = TRUE; - break; - case BSIM3_MOD_LKT2: - mod->BSIM3lkt2 = value->rValue; - mod->BSIM3lkt2Given = TRUE; - break; - case BSIM3_MOD_LK2: - mod->BSIM3lk2 = value->rValue; - mod->BSIM3lk2Given = TRUE; - break; - case BSIM3_MOD_LK3: - mod->BSIM3lk3 = value->rValue; - mod->BSIM3lk3Given = TRUE; - break; - case BSIM3_MOD_LK3B: - mod->BSIM3lk3b = value->rValue; - mod->BSIM3lk3bGiven = TRUE; - break; - case BSIM3_MOD_LNLX: - mod->BSIM3lnlx = value->rValue; - mod->BSIM3lnlxGiven = TRUE; - break; - case BSIM3_MOD_LW0: - mod->BSIM3lw0 = value->rValue; - mod->BSIM3lw0Given = TRUE; - break; - case BSIM3_MOD_LDVT0: - mod->BSIM3ldvt0 = value->rValue; - mod->BSIM3ldvt0Given = TRUE; - break; - case BSIM3_MOD_LDVT1: - mod->BSIM3ldvt1 = value->rValue; - mod->BSIM3ldvt1Given = TRUE; - break; - case BSIM3_MOD_LDVT2: - mod->BSIM3ldvt2 = value->rValue; - mod->BSIM3ldvt2Given = TRUE; - break; - case BSIM3_MOD_LDVT0W: - mod->BSIM3ldvt0w = value->rValue; - mod->BSIM3ldvt0wGiven = TRUE; - break; - case BSIM3_MOD_LDVT1W: - mod->BSIM3ldvt1w = value->rValue; - mod->BSIM3ldvt1wGiven = TRUE; - break; - case BSIM3_MOD_LDVT2W: - mod->BSIM3ldvt2w = value->rValue; - mod->BSIM3ldvt2wGiven = TRUE; - break; - case BSIM3_MOD_LDROUT: - mod->BSIM3ldrout = value->rValue; - mod->BSIM3ldroutGiven = TRUE; - break; - case BSIM3_MOD_LDSUB: - mod->BSIM3ldsub = value->rValue; - mod->BSIM3ldsubGiven = TRUE; - break; - case BSIM3_MOD_LVTH0: - mod->BSIM3lvth0 = value->rValue; - mod->BSIM3lvth0Given = TRUE; - break; - case BSIM3_MOD_LUA: - mod->BSIM3lua = value->rValue; - mod->BSIM3luaGiven = TRUE; - break; - case BSIM3_MOD_LUA1: - mod->BSIM3lua1 = value->rValue; - mod->BSIM3lua1Given = TRUE; - break; - case BSIM3_MOD_LUB: - mod->BSIM3lub = value->rValue; - mod->BSIM3lubGiven = TRUE; - break; - case BSIM3_MOD_LUB1: - mod->BSIM3lub1 = value->rValue; - mod->BSIM3lub1Given = TRUE; - break; - case BSIM3_MOD_LUC: - mod->BSIM3luc = value->rValue; - mod->BSIM3lucGiven = TRUE; - break; - case BSIM3_MOD_LUC1: - mod->BSIM3luc1 = value->rValue; - mod->BSIM3luc1Given = TRUE; - break; - case BSIM3_MOD_LU0 : - mod->BSIM3lu0 = value->rValue; - mod->BSIM3lu0Given = TRUE; - break; - case BSIM3_MOD_LUTE : - mod->BSIM3lute = value->rValue; - mod->BSIM3luteGiven = TRUE; - break; - case BSIM3_MOD_LVOFF: - mod->BSIM3lvoff = value->rValue; - mod->BSIM3lvoffGiven = TRUE; - break; - case BSIM3_MOD_LDELTA : - mod->BSIM3ldelta = value->rValue; - mod->BSIM3ldeltaGiven = TRUE; - break; - case BSIM3_MOD_LRDSW: - mod->BSIM3lrdsw = value->rValue; - mod->BSIM3lrdswGiven = TRUE; - break; - case BSIM3_MOD_LPRWB: - mod->BSIM3lprwb = value->rValue; - mod->BSIM3lprwbGiven = TRUE; - break; - case BSIM3_MOD_LPRWG: - mod->BSIM3lprwg = value->rValue; - mod->BSIM3lprwgGiven = TRUE; - break; - case BSIM3_MOD_LPRT: - mod->BSIM3lprt = value->rValue; - mod->BSIM3lprtGiven = TRUE; - break; - case BSIM3_MOD_LETA0: - mod->BSIM3leta0 = value->rValue; - mod->BSIM3leta0Given = TRUE; - break; - case BSIM3_MOD_LETAB: - mod->BSIM3letab = value->rValue; - mod->BSIM3letabGiven = TRUE; - break; - case BSIM3_MOD_LPCLM: - mod->BSIM3lpclm = value->rValue; - mod->BSIM3lpclmGiven = TRUE; - break; - case BSIM3_MOD_LPDIBL1: - mod->BSIM3lpdibl1 = value->rValue; - mod->BSIM3lpdibl1Given = TRUE; - break; - case BSIM3_MOD_LPDIBL2: - mod->BSIM3lpdibl2 = value->rValue; - mod->BSIM3lpdibl2Given = TRUE; - break; - case BSIM3_MOD_LPDIBLB: - mod->BSIM3lpdiblb = value->rValue; - mod->BSIM3lpdiblbGiven = TRUE; - break; - case BSIM3_MOD_LPSCBE1: - mod->BSIM3lpscbe1 = value->rValue; - mod->BSIM3lpscbe1Given = TRUE; - break; - case BSIM3_MOD_LPSCBE2: - mod->BSIM3lpscbe2 = value->rValue; - mod->BSIM3lpscbe2Given = TRUE; - break; - case BSIM3_MOD_LPVAG: - mod->BSIM3lpvag = value->rValue; - mod->BSIM3lpvagGiven = TRUE; - break; - case BSIM3_MOD_LWR : - mod->BSIM3lwr = value->rValue; - mod->BSIM3lwrGiven = TRUE; - break; - case BSIM3_MOD_LDWG : - mod->BSIM3ldwg = value->rValue; - mod->BSIM3ldwgGiven = TRUE; - break; - case BSIM3_MOD_LDWB : - mod->BSIM3ldwb = value->rValue; - mod->BSIM3ldwbGiven = TRUE; - break; - case BSIM3_MOD_LB0 : - mod->BSIM3lb0 = value->rValue; - mod->BSIM3lb0Given = TRUE; - break; - case BSIM3_MOD_LB1 : - mod->BSIM3lb1 = value->rValue; - mod->BSIM3lb1Given = TRUE; - break; - case BSIM3_MOD_LALPHA0 : - mod->BSIM3lalpha0 = value->rValue; - mod->BSIM3lalpha0Given = TRUE; - break; - case BSIM3_MOD_LALPHA1 : - mod->BSIM3lalpha1 = value->rValue; - mod->BSIM3lalpha1Given = TRUE; - break; - case BSIM3_MOD_LBETA0 : - mod->BSIM3lbeta0 = value->rValue; - mod->BSIM3lbeta0Given = TRUE; - break; - case BSIM3_MOD_LVFB : - mod->BSIM3lvfb = value->rValue; - mod->BSIM3lvfbGiven = TRUE; - break; - - case BSIM3_MOD_LELM : - mod->BSIM3lelm = value->rValue; - mod->BSIM3lelmGiven = TRUE; - break; - case BSIM3_MOD_LCGSL : - mod->BSIM3lcgsl = value->rValue; - mod->BSIM3lcgslGiven = TRUE; - break; - case BSIM3_MOD_LCGDL : - mod->BSIM3lcgdl = value->rValue; - mod->BSIM3lcgdlGiven = TRUE; - break; - case BSIM3_MOD_LCKAPPA : - mod->BSIM3lckappa = value->rValue; - mod->BSIM3lckappaGiven = TRUE; - break; - case BSIM3_MOD_LCF : - mod->BSIM3lcf = value->rValue; - mod->BSIM3lcfGiven = TRUE; - break; - case BSIM3_MOD_LCLC : - mod->BSIM3lclc = value->rValue; - mod->BSIM3lclcGiven = TRUE; - break; - case BSIM3_MOD_LCLE : - mod->BSIM3lcle = value->rValue; - mod->BSIM3lcleGiven = TRUE; - break; - case BSIM3_MOD_LVFBCV : - mod->BSIM3lvfbcv = value->rValue; - mod->BSIM3lvfbcvGiven = TRUE; - break; - case BSIM3_MOD_LACDE : - mod->BSIM3lacde = value->rValue; - mod->BSIM3lacdeGiven = TRUE; - break; - case BSIM3_MOD_LMOIN : - mod->BSIM3lmoin = value->rValue; - mod->BSIM3lmoinGiven = TRUE; - break; - case BSIM3_MOD_LNOFF : - mod->BSIM3lnoff = value->rValue; - mod->BSIM3lnoffGiven = TRUE; - break; - case BSIM3_MOD_LVOFFCV : - mod->BSIM3lvoffcv = value->rValue; - mod->BSIM3lvoffcvGiven = TRUE; - break; - - /* Width dependence */ - case BSIM3_MOD_WCDSC : - mod->BSIM3wcdsc = value->rValue; - mod->BSIM3wcdscGiven = TRUE; - break; - - - case BSIM3_MOD_WCDSCB : - mod->BSIM3wcdscb = value->rValue; - mod->BSIM3wcdscbGiven = TRUE; - break; - case BSIM3_MOD_WCDSCD : - mod->BSIM3wcdscd = value->rValue; - mod->BSIM3wcdscdGiven = TRUE; - break; - case BSIM3_MOD_WCIT : - mod->BSIM3wcit = value->rValue; - mod->BSIM3wcitGiven = TRUE; - break; - case BSIM3_MOD_WNFACTOR : - mod->BSIM3wnfactor = value->rValue; - mod->BSIM3wnfactorGiven = TRUE; - break; - case BSIM3_MOD_WXJ: - mod->BSIM3wxj = value->rValue; - mod->BSIM3wxjGiven = TRUE; - break; - case BSIM3_MOD_WVSAT: - mod->BSIM3wvsat = value->rValue; - mod->BSIM3wvsatGiven = TRUE; - break; - - - case BSIM3_MOD_WA0: - mod->BSIM3wa0 = value->rValue; - mod->BSIM3wa0Given = TRUE; - break; - case BSIM3_MOD_WAGS: - mod->BSIM3wags = value->rValue; - mod->BSIM3wagsGiven = TRUE; - break; - case BSIM3_MOD_WA1: - mod->BSIM3wa1 = value->rValue; - mod->BSIM3wa1Given = TRUE; - break; - case BSIM3_MOD_WA2: - mod->BSIM3wa2 = value->rValue; - mod->BSIM3wa2Given = TRUE; - break; - case BSIM3_MOD_WAT: - mod->BSIM3wat = value->rValue; - mod->BSIM3watGiven = TRUE; - break; - case BSIM3_MOD_WKETA: - mod->BSIM3wketa = value->rValue; - mod->BSIM3wketaGiven = TRUE; - break; - case BSIM3_MOD_WNSUB: - mod->BSIM3wnsub = value->rValue; - mod->BSIM3wnsubGiven = TRUE; - break; - case BSIM3_MOD_WNPEAK: - mod->BSIM3wnpeak = value->rValue; - mod->BSIM3wnpeakGiven = TRUE; - if (mod->BSIM3wnpeak > 1.0e20) - mod->BSIM3wnpeak *= 1.0e-6; - break; - case BSIM3_MOD_WNGATE: - mod->BSIM3wngate = value->rValue; - mod->BSIM3wngateGiven = TRUE; - if (mod->BSIM3wngate > 1.0e23) - mod->BSIM3wngate *= 1.0e-6; - break; - case BSIM3_MOD_WGAMMA1: - mod->BSIM3wgamma1 = value->rValue; - mod->BSIM3wgamma1Given = TRUE; - break; - case BSIM3_MOD_WGAMMA2: - mod->BSIM3wgamma2 = value->rValue; - mod->BSIM3wgamma2Given = TRUE; - break; - case BSIM3_MOD_WVBX: - mod->BSIM3wvbx = value->rValue; - mod->BSIM3wvbxGiven = TRUE; - break; - case BSIM3_MOD_WVBM: - mod->BSIM3wvbm = value->rValue; - mod->BSIM3wvbmGiven = TRUE; - break; - case BSIM3_MOD_WXT: - mod->BSIM3wxt = value->rValue; - mod->BSIM3wxtGiven = TRUE; - break; - case BSIM3_MOD_WK1: - mod->BSIM3wk1 = value->rValue; - mod->BSIM3wk1Given = TRUE; - break; - case BSIM3_MOD_WKT1: - mod->BSIM3wkt1 = value->rValue; - mod->BSIM3wkt1Given = TRUE; - break; - case BSIM3_MOD_WKT1L: - mod->BSIM3wkt1l = value->rValue; - mod->BSIM3wkt1lGiven = TRUE; - break; - case BSIM3_MOD_WKT2: - mod->BSIM3wkt2 = value->rValue; - mod->BSIM3wkt2Given = TRUE; - break; - case BSIM3_MOD_WK2: - mod->BSIM3wk2 = value->rValue; - mod->BSIM3wk2Given = TRUE; - break; - case BSIM3_MOD_WK3: - mod->BSIM3wk3 = value->rValue; - mod->BSIM3wk3Given = TRUE; - break; - case BSIM3_MOD_WK3B: - mod->BSIM3wk3b = value->rValue; - mod->BSIM3wk3bGiven = TRUE; - break; - case BSIM3_MOD_WNLX: - mod->BSIM3wnlx = value->rValue; - mod->BSIM3wnlxGiven = TRUE; - break; - case BSIM3_MOD_WW0: - mod->BSIM3ww0 = value->rValue; - mod->BSIM3ww0Given = TRUE; - break; - case BSIM3_MOD_WDVT0: - mod->BSIM3wdvt0 = value->rValue; - mod->BSIM3wdvt0Given = TRUE; - break; - case BSIM3_MOD_WDVT1: - mod->BSIM3wdvt1 = value->rValue; - mod->BSIM3wdvt1Given = TRUE; - break; - case BSIM3_MOD_WDVT2: - mod->BSIM3wdvt2 = value->rValue; - mod->BSIM3wdvt2Given = TRUE; - break; - case BSIM3_MOD_WDVT0W: - mod->BSIM3wdvt0w = value->rValue; - mod->BSIM3wdvt0wGiven = TRUE; - break; - case BSIM3_MOD_WDVT1W: - mod->BSIM3wdvt1w = value->rValue; - mod->BSIM3wdvt1wGiven = TRUE; - break; - case BSIM3_MOD_WDVT2W: - mod->BSIM3wdvt2w = value->rValue; - mod->BSIM3wdvt2wGiven = TRUE; - break; - case BSIM3_MOD_WDROUT: - mod->BSIM3wdrout = value->rValue; - mod->BSIM3wdroutGiven = TRUE; - break; - case BSIM3_MOD_WDSUB: - mod->BSIM3wdsub = value->rValue; - mod->BSIM3wdsubGiven = TRUE; - break; - case BSIM3_MOD_WVTH0: - mod->BSIM3wvth0 = value->rValue; - mod->BSIM3wvth0Given = TRUE; - break; - case BSIM3_MOD_WUA: - mod->BSIM3wua = value->rValue; - mod->BSIM3wuaGiven = TRUE; - break; - case BSIM3_MOD_WUA1: - mod->BSIM3wua1 = value->rValue; - mod->BSIM3wua1Given = TRUE; - break; - case BSIM3_MOD_WUB: - mod->BSIM3wub = value->rValue; - mod->BSIM3wubGiven = TRUE; - break; - case BSIM3_MOD_WUB1: - mod->BSIM3wub1 = value->rValue; - mod->BSIM3wub1Given = TRUE; - break; - case BSIM3_MOD_WUC: - mod->BSIM3wuc = value->rValue; - mod->BSIM3wucGiven = TRUE; - break; - case BSIM3_MOD_WUC1: - mod->BSIM3wuc1 = value->rValue; - mod->BSIM3wuc1Given = TRUE; - break; - case BSIM3_MOD_WU0 : - mod->BSIM3wu0 = value->rValue; - mod->BSIM3wu0Given = TRUE; - break; - case BSIM3_MOD_WUTE : - mod->BSIM3wute = value->rValue; - mod->BSIM3wuteGiven = TRUE; - break; - case BSIM3_MOD_WVOFF: - mod->BSIM3wvoff = value->rValue; - mod->BSIM3wvoffGiven = TRUE; - break; - case BSIM3_MOD_WDELTA : - mod->BSIM3wdelta = value->rValue; - mod->BSIM3wdeltaGiven = TRUE; - break; - case BSIM3_MOD_WRDSW: - mod->BSIM3wrdsw = value->rValue; - mod->BSIM3wrdswGiven = TRUE; - break; - case BSIM3_MOD_WPRWB: - mod->BSIM3wprwb = value->rValue; - mod->BSIM3wprwbGiven = TRUE; - break; - case BSIM3_MOD_WPRWG: - mod->BSIM3wprwg = value->rValue; - mod->BSIM3wprwgGiven = TRUE; - break; - case BSIM3_MOD_WPRT: - mod->BSIM3wprt = value->rValue; - mod->BSIM3wprtGiven = TRUE; - break; - case BSIM3_MOD_WETA0: - mod->BSIM3weta0 = value->rValue; - mod->BSIM3weta0Given = TRUE; - break; - case BSIM3_MOD_WETAB: - mod->BSIM3wetab = value->rValue; - mod->BSIM3wetabGiven = TRUE; - break; - case BSIM3_MOD_WPCLM: - mod->BSIM3wpclm = value->rValue; - mod->BSIM3wpclmGiven = TRUE; - break; - case BSIM3_MOD_WPDIBL1: - mod->BSIM3wpdibl1 = value->rValue; - mod->BSIM3wpdibl1Given = TRUE; - break; - case BSIM3_MOD_WPDIBL2: - mod->BSIM3wpdibl2 = value->rValue; - mod->BSIM3wpdibl2Given = TRUE; - break; - case BSIM3_MOD_WPDIBLB: - mod->BSIM3wpdiblb = value->rValue; - mod->BSIM3wpdiblbGiven = TRUE; - break; - case BSIM3_MOD_WPSCBE1: - mod->BSIM3wpscbe1 = value->rValue; - mod->BSIM3wpscbe1Given = TRUE; - break; - case BSIM3_MOD_WPSCBE2: - mod->BSIM3wpscbe2 = value->rValue; - mod->BSIM3wpscbe2Given = TRUE; - break; - case BSIM3_MOD_WPVAG: - mod->BSIM3wpvag = value->rValue; - mod->BSIM3wpvagGiven = TRUE; - break; - case BSIM3_MOD_WWR : - mod->BSIM3wwr = value->rValue; - mod->BSIM3wwrGiven = TRUE; - break; - case BSIM3_MOD_WDWG : - mod->BSIM3wdwg = value->rValue; - mod->BSIM3wdwgGiven = TRUE; - break; - case BSIM3_MOD_WDWB : - mod->BSIM3wdwb = value->rValue; - mod->BSIM3wdwbGiven = TRUE; - break; - case BSIM3_MOD_WB0 : - mod->BSIM3wb0 = value->rValue; - mod->BSIM3wb0Given = TRUE; - break; - case BSIM3_MOD_WB1 : - mod->BSIM3wb1 = value->rValue; - mod->BSIM3wb1Given = TRUE; - break; - case BSIM3_MOD_WALPHA0 : - mod->BSIM3walpha0 = value->rValue; - mod->BSIM3walpha0Given = TRUE; - break; - case BSIM3_MOD_WALPHA1 : - mod->BSIM3walpha1 = value->rValue; - mod->BSIM3walpha1Given = TRUE; - break; - case BSIM3_MOD_WBETA0 : - mod->BSIM3wbeta0 = value->rValue; - mod->BSIM3wbeta0Given = TRUE; - break; - case BSIM3_MOD_WVFB : - mod->BSIM3wvfb = value->rValue; - mod->BSIM3wvfbGiven = TRUE; - break; - - case BSIM3_MOD_WELM : - mod->BSIM3welm = value->rValue; - mod->BSIM3welmGiven = TRUE; - break; - case BSIM3_MOD_WCGSL : - mod->BSIM3wcgsl = value->rValue; - mod->BSIM3wcgslGiven = TRUE; - break; - case BSIM3_MOD_WCGDL : - mod->BSIM3wcgdl = value->rValue; - mod->BSIM3wcgdlGiven = TRUE; - break; - case BSIM3_MOD_WCKAPPA : - mod->BSIM3wckappa = value->rValue; - mod->BSIM3wckappaGiven = TRUE; - break; - case BSIM3_MOD_WCF : - mod->BSIM3wcf = value->rValue; - mod->BSIM3wcfGiven = TRUE; - break; - case BSIM3_MOD_WCLC : - mod->BSIM3wclc = value->rValue; - mod->BSIM3wclcGiven = TRUE; - break; - case BSIM3_MOD_WCLE : - mod->BSIM3wcle = value->rValue; - mod->BSIM3wcleGiven = TRUE; - break; - case BSIM3_MOD_WVFBCV : - mod->BSIM3wvfbcv = value->rValue; - mod->BSIM3wvfbcvGiven = TRUE; - break; - case BSIM3_MOD_WACDE : - mod->BSIM3wacde = value->rValue; - mod->BSIM3wacdeGiven = TRUE; - break; - case BSIM3_MOD_WMOIN : - mod->BSIM3wmoin = value->rValue; - mod->BSIM3wmoinGiven = TRUE; - break; - case BSIM3_MOD_WNOFF : - mod->BSIM3wnoff = value->rValue; - mod->BSIM3wnoffGiven = TRUE; - break; - case BSIM3_MOD_WVOFFCV : - mod->BSIM3wvoffcv = value->rValue; - mod->BSIM3wvoffcvGiven = TRUE; - break; - - /* Cross-term dependence */ - case BSIM3_MOD_PCDSC : - mod->BSIM3pcdsc = value->rValue; - mod->BSIM3pcdscGiven = TRUE; - break; - - - case BSIM3_MOD_PCDSCB : - mod->BSIM3pcdscb = value->rValue; - mod->BSIM3pcdscbGiven = TRUE; - break; - case BSIM3_MOD_PCDSCD : - mod->BSIM3pcdscd = value->rValue; - mod->BSIM3pcdscdGiven = TRUE; - break; - case BSIM3_MOD_PCIT : - mod->BSIM3pcit = value->rValue; - mod->BSIM3pcitGiven = TRUE; - break; - case BSIM3_MOD_PNFACTOR : - mod->BSIM3pnfactor = value->rValue; - mod->BSIM3pnfactorGiven = TRUE; - break; - case BSIM3_MOD_PXJ: - mod->BSIM3pxj = value->rValue; - mod->BSIM3pxjGiven = TRUE; - break; - case BSIM3_MOD_PVSAT: - mod->BSIM3pvsat = value->rValue; - mod->BSIM3pvsatGiven = TRUE; - break; - - - case BSIM3_MOD_PA0: - mod->BSIM3pa0 = value->rValue; - mod->BSIM3pa0Given = TRUE; - break; - case BSIM3_MOD_PAGS: - mod->BSIM3pags = value->rValue; - mod->BSIM3pagsGiven = TRUE; - break; - case BSIM3_MOD_PA1: - mod->BSIM3pa1 = value->rValue; - mod->BSIM3pa1Given = TRUE; - break; - case BSIM3_MOD_PA2: - mod->BSIM3pa2 = value->rValue; - mod->BSIM3pa2Given = TRUE; - break; - case BSIM3_MOD_PAT: - mod->BSIM3pat = value->rValue; - mod->BSIM3patGiven = TRUE; - break; - case BSIM3_MOD_PKETA: - mod->BSIM3pketa = value->rValue; - mod->BSIM3pketaGiven = TRUE; - break; - case BSIM3_MOD_PNSUB: - mod->BSIM3pnsub = value->rValue; - mod->BSIM3pnsubGiven = TRUE; - break; - case BSIM3_MOD_PNPEAK: - mod->BSIM3pnpeak = value->rValue; - mod->BSIM3pnpeakGiven = TRUE; - if (mod->BSIM3pnpeak > 1.0e20) - mod->BSIM3pnpeak *= 1.0e-6; - break; - case BSIM3_MOD_PNGATE: - mod->BSIM3pngate = value->rValue; - mod->BSIM3pngateGiven = TRUE; - if (mod->BSIM3pngate > 1.0e23) - mod->BSIM3pngate *= 1.0e-6; - break; - case BSIM3_MOD_PGAMMA1: - mod->BSIM3pgamma1 = value->rValue; - mod->BSIM3pgamma1Given = TRUE; - break; - case BSIM3_MOD_PGAMMA2: - mod->BSIM3pgamma2 = value->rValue; - mod->BSIM3pgamma2Given = TRUE; - break; - case BSIM3_MOD_PVBX: - mod->BSIM3pvbx = value->rValue; - mod->BSIM3pvbxGiven = TRUE; - break; - case BSIM3_MOD_PVBM: - mod->BSIM3pvbm = value->rValue; - mod->BSIM3pvbmGiven = TRUE; - break; - case BSIM3_MOD_PXT: - mod->BSIM3pxt = value->rValue; - mod->BSIM3pxtGiven = TRUE; - break; - case BSIM3_MOD_PK1: - mod->BSIM3pk1 = value->rValue; - mod->BSIM3pk1Given = TRUE; - break; - case BSIM3_MOD_PKT1: - mod->BSIM3pkt1 = value->rValue; - mod->BSIM3pkt1Given = TRUE; - break; - case BSIM3_MOD_PKT1L: - mod->BSIM3pkt1l = value->rValue; - mod->BSIM3pkt1lGiven = TRUE; - break; - case BSIM3_MOD_PKT2: - mod->BSIM3pkt2 = value->rValue; - mod->BSIM3pkt2Given = TRUE; - break; - case BSIM3_MOD_PK2: - mod->BSIM3pk2 = value->rValue; - mod->BSIM3pk2Given = TRUE; - break; - case BSIM3_MOD_PK3: - mod->BSIM3pk3 = value->rValue; - mod->BSIM3pk3Given = TRUE; - break; - case BSIM3_MOD_PK3B: - mod->BSIM3pk3b = value->rValue; - mod->BSIM3pk3bGiven = TRUE; - break; - case BSIM3_MOD_PNLX: - mod->BSIM3pnlx = value->rValue; - mod->BSIM3pnlxGiven = TRUE; - break; - case BSIM3_MOD_PW0: - mod->BSIM3pw0 = value->rValue; - mod->BSIM3pw0Given = TRUE; - break; - case BSIM3_MOD_PDVT0: - mod->BSIM3pdvt0 = value->rValue; - mod->BSIM3pdvt0Given = TRUE; - break; - case BSIM3_MOD_PDVT1: - mod->BSIM3pdvt1 = value->rValue; - mod->BSIM3pdvt1Given = TRUE; - break; - case BSIM3_MOD_PDVT2: - mod->BSIM3pdvt2 = value->rValue; - mod->BSIM3pdvt2Given = TRUE; - break; - case BSIM3_MOD_PDVT0W: - mod->BSIM3pdvt0w = value->rValue; - mod->BSIM3pdvt0wGiven = TRUE; - break; - case BSIM3_MOD_PDVT1W: - mod->BSIM3pdvt1w = value->rValue; - mod->BSIM3pdvt1wGiven = TRUE; - break; - case BSIM3_MOD_PDVT2W: - mod->BSIM3pdvt2w = value->rValue; - mod->BSIM3pdvt2wGiven = TRUE; - break; - case BSIM3_MOD_PDROUT: - mod->BSIM3pdrout = value->rValue; - mod->BSIM3pdroutGiven = TRUE; - break; - case BSIM3_MOD_PDSUB: - mod->BSIM3pdsub = value->rValue; - mod->BSIM3pdsubGiven = TRUE; - break; - case BSIM3_MOD_PVTH0: - mod->BSIM3pvth0 = value->rValue; - mod->BSIM3pvth0Given = TRUE; - break; - case BSIM3_MOD_PUA: - mod->BSIM3pua = value->rValue; - mod->BSIM3puaGiven = TRUE; - break; - case BSIM3_MOD_PUA1: - mod->BSIM3pua1 = value->rValue; - mod->BSIM3pua1Given = TRUE; - break; - case BSIM3_MOD_PUB: - mod->BSIM3pub = value->rValue; - mod->BSIM3pubGiven = TRUE; - break; - case BSIM3_MOD_PUB1: - mod->BSIM3pub1 = value->rValue; - mod->BSIM3pub1Given = TRUE; - break; - case BSIM3_MOD_PUC: - mod->BSIM3puc = value->rValue; - mod->BSIM3pucGiven = TRUE; - break; - case BSIM3_MOD_PUC1: - mod->BSIM3puc1 = value->rValue; - mod->BSIM3puc1Given = TRUE; - break; - case BSIM3_MOD_PU0 : - mod->BSIM3pu0 = value->rValue; - mod->BSIM3pu0Given = TRUE; - break; - case BSIM3_MOD_PUTE : - mod->BSIM3pute = value->rValue; - mod->BSIM3puteGiven = TRUE; - break; - case BSIM3_MOD_PVOFF: - mod->BSIM3pvoff = value->rValue; - mod->BSIM3pvoffGiven = TRUE; - break; - case BSIM3_MOD_PDELTA : - mod->BSIM3pdelta = value->rValue; - mod->BSIM3pdeltaGiven = TRUE; - break; - case BSIM3_MOD_PRDSW: - mod->BSIM3prdsw = value->rValue; - mod->BSIM3prdswGiven = TRUE; - break; - case BSIM3_MOD_PPRWB: - mod->BSIM3pprwb = value->rValue; - mod->BSIM3pprwbGiven = TRUE; - break; - case BSIM3_MOD_PPRWG: - mod->BSIM3pprwg = value->rValue; - mod->BSIM3pprwgGiven = TRUE; - break; - case BSIM3_MOD_PPRT: - mod->BSIM3pprt = value->rValue; - mod->BSIM3pprtGiven = TRUE; - break; - case BSIM3_MOD_PETA0: - mod->BSIM3peta0 = value->rValue; - mod->BSIM3peta0Given = TRUE; - break; - case BSIM3_MOD_PETAB: - mod->BSIM3petab = value->rValue; - mod->BSIM3petabGiven = TRUE; - break; - case BSIM3_MOD_PPCLM: - mod->BSIM3ppclm = value->rValue; - mod->BSIM3ppclmGiven = TRUE; - break; - case BSIM3_MOD_PPDIBL1: - mod->BSIM3ppdibl1 = value->rValue; - mod->BSIM3ppdibl1Given = TRUE; - break; - case BSIM3_MOD_PPDIBL2: - mod->BSIM3ppdibl2 = value->rValue; - mod->BSIM3ppdibl2Given = TRUE; - break; - case BSIM3_MOD_PPDIBLB: - mod->BSIM3ppdiblb = value->rValue; - mod->BSIM3ppdiblbGiven = TRUE; - break; - case BSIM3_MOD_PPSCBE1: - mod->BSIM3ppscbe1 = value->rValue; - mod->BSIM3ppscbe1Given = TRUE; - break; - case BSIM3_MOD_PPSCBE2: - mod->BSIM3ppscbe2 = value->rValue; - mod->BSIM3ppscbe2Given = TRUE; - break; - case BSIM3_MOD_PPVAG: - mod->BSIM3ppvag = value->rValue; - mod->BSIM3ppvagGiven = TRUE; - break; - case BSIM3_MOD_PWR : - mod->BSIM3pwr = value->rValue; - mod->BSIM3pwrGiven = TRUE; - break; - case BSIM3_MOD_PDWG : - mod->BSIM3pdwg = value->rValue; - mod->BSIM3pdwgGiven = TRUE; - break; - case BSIM3_MOD_PDWB : - mod->BSIM3pdwb = value->rValue; - mod->BSIM3pdwbGiven = TRUE; - break; - case BSIM3_MOD_PB0 : - mod->BSIM3pb0 = value->rValue; - mod->BSIM3pb0Given = TRUE; - break; - case BSIM3_MOD_PB1 : - mod->BSIM3pb1 = value->rValue; - mod->BSIM3pb1Given = TRUE; - break; - case BSIM3_MOD_PALPHA0 : - mod->BSIM3palpha0 = value->rValue; - mod->BSIM3palpha0Given = TRUE; - break; - case BSIM3_MOD_PALPHA1 : - mod->BSIM3palpha1 = value->rValue; - mod->BSIM3palpha1Given = TRUE; - break; - case BSIM3_MOD_PBETA0 : - mod->BSIM3pbeta0 = value->rValue; - mod->BSIM3pbeta0Given = TRUE; - break; - case BSIM3_MOD_PVFB : - mod->BSIM3pvfb = value->rValue; - mod->BSIM3pvfbGiven = TRUE; - break; - - case BSIM3_MOD_PELM : - mod->BSIM3pelm = value->rValue; - mod->BSIM3pelmGiven = TRUE; - break; - case BSIM3_MOD_PCGSL : - mod->BSIM3pcgsl = value->rValue; - mod->BSIM3pcgslGiven = TRUE; - break; - case BSIM3_MOD_PCGDL : - mod->BSIM3pcgdl = value->rValue; - mod->BSIM3pcgdlGiven = TRUE; - break; - case BSIM3_MOD_PCKAPPA : - mod->BSIM3pckappa = value->rValue; - mod->BSIM3pckappaGiven = TRUE; - break; - case BSIM3_MOD_PCF : - mod->BSIM3pcf = value->rValue; - mod->BSIM3pcfGiven = TRUE; - break; - case BSIM3_MOD_PCLC : - mod->BSIM3pclc = value->rValue; - mod->BSIM3pclcGiven = TRUE; - break; - case BSIM3_MOD_PCLE : - mod->BSIM3pcle = value->rValue; - mod->BSIM3pcleGiven = TRUE; - break; - case BSIM3_MOD_PVFBCV : - mod->BSIM3pvfbcv = value->rValue; - mod->BSIM3pvfbcvGiven = TRUE; - break; - case BSIM3_MOD_PACDE : - mod->BSIM3pacde = value->rValue; - mod->BSIM3pacdeGiven = TRUE; - break; - case BSIM3_MOD_PMOIN : - mod->BSIM3pmoin = value->rValue; - mod->BSIM3pmoinGiven = TRUE; - break; - case BSIM3_MOD_PNOFF : - mod->BSIM3pnoff = value->rValue; - mod->BSIM3pnoffGiven = TRUE; - break; - case BSIM3_MOD_PVOFFCV : - mod->BSIM3pvoffcv = value->rValue; - mod->BSIM3pvoffcvGiven = TRUE; - break; - - case BSIM3_MOD_TNOM : - mod->BSIM3tnom = value->rValue + CONSTCtoK; - mod->BSIM3tnomGiven = TRUE; - break; - case BSIM3_MOD_CGSO : - mod->BSIM3cgso = value->rValue; - mod->BSIM3cgsoGiven = TRUE; - break; - case BSIM3_MOD_CGDO : - mod->BSIM3cgdo = value->rValue; - mod->BSIM3cgdoGiven = TRUE; - break; - case BSIM3_MOD_CGBO : - mod->BSIM3cgbo = value->rValue; - mod->BSIM3cgboGiven = TRUE; - break; - case BSIM3_MOD_XPART : - mod->BSIM3xpart = value->rValue; - mod->BSIM3xpartGiven = TRUE; - break; - case BSIM3_MOD_RSH : - mod->BSIM3sheetResistance = value->rValue; - mod->BSIM3sheetResistanceGiven = TRUE; - break; - case BSIM3_MOD_JS : - mod->BSIM3jctSatCurDensity = value->rValue; - mod->BSIM3jctSatCurDensityGiven = TRUE; - break; - case BSIM3_MOD_JSW : - mod->BSIM3jctSidewallSatCurDensity = value->rValue; - mod->BSIM3jctSidewallSatCurDensityGiven = TRUE; - break; - case BSIM3_MOD_PB : - mod->BSIM3bulkJctPotential = value->rValue; - mod->BSIM3bulkJctPotentialGiven = TRUE; - break; - case BSIM3_MOD_MJ : - mod->BSIM3bulkJctBotGradingCoeff = value->rValue; - mod->BSIM3bulkJctBotGradingCoeffGiven = TRUE; - break; - case BSIM3_MOD_PBSW : - mod->BSIM3sidewallJctPotential = value->rValue; - mod->BSIM3sidewallJctPotentialGiven = TRUE; - break; - case BSIM3_MOD_MJSW : - mod->BSIM3bulkJctSideGradingCoeff = value->rValue; - mod->BSIM3bulkJctSideGradingCoeffGiven = TRUE; - break; - case BSIM3_MOD_CJ : - mod->BSIM3unitAreaJctCap = value->rValue; - mod->BSIM3unitAreaJctCapGiven = TRUE; - break; - case BSIM3_MOD_CJSW : - mod->BSIM3unitLengthSidewallJctCap = value->rValue; - mod->BSIM3unitLengthSidewallJctCapGiven = TRUE; - break; - case BSIM3_MOD_NJ : - mod->BSIM3jctEmissionCoeff = value->rValue; - mod->BSIM3jctEmissionCoeffGiven = TRUE; - break; - case BSIM3_MOD_PBSWG : - mod->BSIM3GatesidewallJctPotential = value->rValue; - mod->BSIM3GatesidewallJctPotentialGiven = TRUE; - break; - case BSIM3_MOD_MJSWG : - mod->BSIM3bulkJctGateSideGradingCoeff = value->rValue; - mod->BSIM3bulkJctGateSideGradingCoeffGiven = TRUE; - break; - case BSIM3_MOD_CJSWG : - mod->BSIM3unitLengthGateSidewallJctCap = value->rValue; - mod->BSIM3unitLengthGateSidewallJctCapGiven = TRUE; - break; - case BSIM3_MOD_XTI : - mod->BSIM3jctTempExponent = value->rValue; - mod->BSIM3jctTempExponentGiven = TRUE; - break; - case BSIM3_MOD_LINTNOI: - mod->BSIM3lintnoi = value->rValue; - mod->BSIM3lintnoiGiven = TRUE; - break; - case BSIM3_MOD_LINT : - mod->BSIM3Lint = value->rValue; - mod->BSIM3LintGiven = TRUE; - break; - case BSIM3_MOD_LL : - mod->BSIM3Ll = value->rValue; - mod->BSIM3LlGiven = TRUE; - break; - case BSIM3_MOD_LLC : - mod->BSIM3Llc = value->rValue; - mod->BSIM3LlcGiven = TRUE; - break; - case BSIM3_MOD_LLN : - mod->BSIM3Lln = value->rValue; - mod->BSIM3LlnGiven = TRUE; - break; - case BSIM3_MOD_LW : - mod->BSIM3Lw = value->rValue; - mod->BSIM3LwGiven = TRUE; - break; - case BSIM3_MOD_LWC : - mod->BSIM3Lwc = value->rValue; - mod->BSIM3LwcGiven = TRUE; - break; - case BSIM3_MOD_LWN : - mod->BSIM3Lwn = value->rValue; - mod->BSIM3LwnGiven = TRUE; - break; - case BSIM3_MOD_LWL : - mod->BSIM3Lwl = value->rValue; - mod->BSIM3LwlGiven = TRUE; - break; - case BSIM3_MOD_LWLC : - mod->BSIM3Lwlc = value->rValue; - mod->BSIM3LwlcGiven = TRUE; - break; - case BSIM3_MOD_LMIN : - mod->BSIM3Lmin = value->rValue; - mod->BSIM3LminGiven = TRUE; - break; - case BSIM3_MOD_LMAX : - mod->BSIM3Lmax = value->rValue; - mod->BSIM3LmaxGiven = TRUE; - break; - case BSIM3_MOD_WINT : - mod->BSIM3Wint = value->rValue; - mod->BSIM3WintGiven = TRUE; - break; - case BSIM3_MOD_WL : - mod->BSIM3Wl = value->rValue; - mod->BSIM3WlGiven = TRUE; - break; - case BSIM3_MOD_WLC : - mod->BSIM3Wlc = value->rValue; - mod->BSIM3WlcGiven = TRUE; - break; - case BSIM3_MOD_WLN : - mod->BSIM3Wln = value->rValue; - mod->BSIM3WlnGiven = TRUE; - break; - case BSIM3_MOD_WW : - mod->BSIM3Ww = value->rValue; - mod->BSIM3WwGiven = TRUE; - break; - case BSIM3_MOD_WWC : - mod->BSIM3Wwc = value->rValue; - mod->BSIM3WwcGiven = TRUE; - break; - case BSIM3_MOD_WWN : - mod->BSIM3Wwn = value->rValue; - mod->BSIM3WwnGiven = TRUE; - break; - case BSIM3_MOD_WWL : - mod->BSIM3Wwl = value->rValue; - mod->BSIM3WwlGiven = TRUE; - break; - case BSIM3_MOD_WWLC : - mod->BSIM3Wwlc = value->rValue; - mod->BSIM3WwlcGiven = TRUE; - break; - case BSIM3_MOD_WMIN : - mod->BSIM3Wmin = value->rValue; - mod->BSIM3WminGiven = TRUE; - break; - case BSIM3_MOD_WMAX : - mod->BSIM3Wmax = value->rValue; - mod->BSIM3WmaxGiven = TRUE; - break; - - case BSIM3_MOD_XL: - mod->BSIM3xl = value->rValue; - mod->BSIM3xlGiven = TRUE; - break; - case BSIM3_MOD_XW: - mod->BSIM3xw = value->rValue; - mod->BSIM3xwGiven = TRUE; - break; - - case BSIM3_MOD_NOIA : - mod->BSIM3oxideTrapDensityA = value->rValue; - mod->BSIM3oxideTrapDensityAGiven = TRUE; - break; - case BSIM3_MOD_NOIB : - mod->BSIM3oxideTrapDensityB = value->rValue; - mod->BSIM3oxideTrapDensityBGiven = TRUE; - break; - case BSIM3_MOD_NOIC : - mod->BSIM3oxideTrapDensityC = value->rValue; - mod->BSIM3oxideTrapDensityCGiven = TRUE; - break; - case BSIM3_MOD_EM : - mod->BSIM3em = value->rValue; - mod->BSIM3emGiven = TRUE; - break; - case BSIM3_MOD_EF : - mod->BSIM3ef = value->rValue; - mod->BSIM3efGiven = TRUE; - break; - case BSIM3_MOD_AF : - mod->BSIM3af = value->rValue; - mod->BSIM3afGiven = TRUE; - break; - case BSIM3_MOD_KF : - mod->BSIM3kf = value->rValue; - mod->BSIM3kfGiven = TRUE; - break; - - case BSIM3_MOD_VGS_MAX: - mod->BSIM3vgsMax = value->rValue; - mod->BSIM3vgsMaxGiven = TRUE; - break; - case BSIM3_MOD_VGD_MAX: - mod->BSIM3vgdMax = value->rValue; - mod->BSIM3vgdMaxGiven = TRUE; - break; - case BSIM3_MOD_VGB_MAX: - mod->BSIM3vgbMax = value->rValue; - mod->BSIM3vgbMaxGiven = TRUE; - break; - case BSIM3_MOD_VDS_MAX: - mod->BSIM3vdsMax = value->rValue; - mod->BSIM3vdsMaxGiven = TRUE; - break; - case BSIM3_MOD_VBS_MAX: - mod->BSIM3vbsMax = value->rValue; - mod->BSIM3vbsMaxGiven = TRUE; - break; - case BSIM3_MOD_VBD_MAX: - mod->BSIM3vbdMax = value->rValue; - mod->BSIM3vbdMaxGiven = TRUE; - break; - case BSIM3_MOD_VGSR_MAX: - mod->BSIM3vgsrMax = value->rValue; - mod->BSIM3vgsrMaxGiven = TRUE; - break; - case BSIM3_MOD_VGDR_MAX: - mod->BSIM3vgdrMax = value->rValue; - mod->BSIM3vgdrMaxGiven = TRUE; - break; - case BSIM3_MOD_VGBR_MAX: - mod->BSIM3vgbrMax = value->rValue; - mod->BSIM3vgbrMaxGiven = TRUE; - break; - case BSIM3_MOD_VBSR_MAX: - mod->BSIM3vbsrMax = value->rValue; - mod->BSIM3vbsrMaxGiven = TRUE; - break; - case BSIM3_MOD_VBDR_MAX: - mod->BSIM3vbdrMax = value->rValue; - mod->BSIM3vbdrMaxGiven = TRUE; - break; - - case BSIM3_MOD_NMOS : - if(value->iValue) { - mod->BSIM3type = 1; - mod->BSIM3typeGiven = TRUE; - } - break; - case BSIM3_MOD_PMOS : - if(value->iValue) { - mod->BSIM3type = - 1; - mod->BSIM3typeGiven = TRUE; - } - break; - default: - return(E_BADPARM); - } - return(OK); -} - - diff --git a/src/spicelib/devices/bsim3/b3noi.c b/src/spicelib/devices/bsim3/b3noi.c deleted file mode 100644 index 6d1edfb06..000000000 --- a/src/spicelib/devices/bsim3/b3noi.c +++ /dev/null @@ -1,360 +0,0 @@ -/**** BSIM3v3.3.0, Released by Xuemei Xi 07/29/2005 ****/ - -/********** - * Copyright 2004 Regents of the University of California. All rights reserved. - * File: b3noi.c of BSIM3v3.3.0 - * Author: 1995 Gary W. Ng and Min-Chie Jeng. - * Author: 1997-1999 Weidong Liu. - * Author: 2001 Xuemei Xi - * Modified by Xuemei Xi, 10/05/2001. - **********/ - -#include "ngspice/ngspice.h" -#include "bsim3def.h" -#include "ngspice/cktdefs.h" -#include "ngspice/iferrmsg.h" -#include "ngspice/noisedef.h" -#include "ngspice/suffix.h" -#include "ngspice/const.h" /* jwan */ - -/* - * BSIM3noise (mode, operation, firstModel, ckt, data, OnDens) - * This routine names and evaluates all of the noise sources - * associated with MOSFET's. It starts with the model *firstModel and - * traverses all of its insts. It then proceeds to any other models - * on the linked list. The total output noise density generated by - * all of the MOSFET's is summed with the variable "OnDens". - */ - -/* - Channel thermal and flicker noises are calculated based on the value - of model->BSIM3noiMod. - If model->BSIM3noiMod = 1, - Channel thermal noise = SPICE2 model - Flicker noise = SPICE2 model - If model->BSIM3noiMod = 2, - Channel thermal noise = BSIM3 model - Flicker noise = BSIM3 model - If model->BSIM3noiMod = 3, - Channel thermal noise = SPICE2 model - Flicker noise = BSIM3 model - If model->BSIM3noiMod = 4, - Channel thermal noise = BSIM3 model - Flicker noise = SPICE2 model - If model->BSIM3noiMod = 5, - Channel thermal noise = SPICE2 model with linear/sat fix - Flicker noise = SPICE2 model - If model->BSIM3noiMod = 6, - Channel thermal noise = SPICE2 model with linear/sat fix - Flicker noise = BSIM3 model - */ - - -/* - * JX: 1/f noise model is smoothed out 12/18/01. - */ - - -static double -StrongInversionNoiseEval( -double Vds, -BSIM3model *model, -BSIM3instance *here, -double freq, double temp) -{ -struct bsim3SizeDependParam *pParam; -double cd, esat, DelClm, EffFreq, N0, Nl, Leff, Leffsq; -double T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, Ssi; - - pParam = here->pParam; - cd = fabs(here->BSIM3cd); - Leff = pParam->BSIM3leff - 2.0 * model->BSIM3lintnoi; - Leffsq = Leff * Leff; - esat = 2.0 * pParam->BSIM3vsattemp / here->BSIM3ueff; - if(model->BSIM3em<=0.0) DelClm = 0.0; - else { - T0 = ((((Vds - here->BSIM3Vdseff) / pParam->BSIM3litl) - + model->BSIM3em) / esat); - DelClm = pParam->BSIM3litl * log (MAX(T0, N_MINLOG)); - if (DelClm < 0.0) DelClm = 0.0; /* bugfix */ - } - EffFreq = pow(freq, model->BSIM3ef); - T1 = CHARGE * CHARGE * 8.62e-5 * cd * temp * here->BSIM3ueff; - T2 = 1.0e8 * EffFreq * here->BSIM3Abulk * model->BSIM3cox * Leffsq; - N0 = model->BSIM3cox * here->BSIM3Vgsteff / CHARGE; - Nl = model->BSIM3cox * here->BSIM3Vgsteff - * (1.0 - here->BSIM3AbovVgst2Vtm * here->BSIM3Vdseff) / CHARGE; - - T3 = model->BSIM3oxideTrapDensityA - * log(MAX(((N0 + 2.0e14) / (Nl + 2.0e14)), N_MINLOG)); - T4 = model->BSIM3oxideTrapDensityB * (N0 - Nl); - T5 = model->BSIM3oxideTrapDensityC * 0.5 * (N0 * N0 - Nl * Nl); - - T6 = 8.62e-5 * temp * cd * cd; - T7 = 1.0e8 * EffFreq * Leffsq * pParam->BSIM3weff; - T8 = model->BSIM3oxideTrapDensityA + model->BSIM3oxideTrapDensityB * Nl - + model->BSIM3oxideTrapDensityC * Nl * Nl; - T9 = (Nl + 2.0e14) * (Nl + 2.0e14); - - Ssi = T1 / T2 * (T3 + T4 + T5) + T6 / T7 * DelClm * T8 / T9; - return Ssi; -} - -int -BSIM3noise ( -int mode, int operation, -GENmodel *inModel, -CKTcircuit *ckt, -Ndata *data, -double *OnDens) -{ -NOISEAN *job = (NOISEAN *) ckt->CKTcurJob; - -BSIM3model *model = (BSIM3model *)inModel; -BSIM3instance *here; -struct bsim3SizeDependParam *pParam; -double tempOnoise; -double tempInoise; -double noizDens[BSIM3NSRCS]; -double lnNdens[BSIM3NSRCS]; - -double vds; - -double T1, T10, T11; -double Ssi, Swi; - -double m; - -int i; - - /* define the names of the noise sources */ - static char *BSIM3nNames[BSIM3NSRCS] = - { /* Note that we have to keep the order */ - ".rd", /* noise due to rd */ - /* consistent with the index definitions */ - ".rs", /* noise due to rs */ - /* in BSIM3defs.h */ - ".id", /* noise due to id */ - ".1overf", /* flicker (1/f) noise */ - "" /* total transistor noise */ - }; - - for (; model != NULL; model = BSIM3nextModel(model)) - { for (here = BSIM3instances(model); here != NULL; - here = BSIM3nextInstance(here)) - { pParam = here->pParam; - switch (operation) - { case N_OPEN: - /* see if we have to to produce a summary report */ - /* if so, name all the noise generators */ - - if (job->NStpsSm != 0) - { switch (mode) - { case N_DENS: - for (i = 0; i < BSIM3NSRCS; i++) - { NOISE_ADD_OUTVAR(ckt, data, "onoise.%s%s", here->BSIM3name, BSIM3nNames[i]); - } - break; - case INT_NOIZ: - for (i = 0; i < BSIM3NSRCS; i++) - { NOISE_ADD_OUTVAR(ckt, data, "onoise_total.%s%s", here->BSIM3name, BSIM3nNames[i]); - NOISE_ADD_OUTVAR(ckt, data, "inoise_total.%s%s", here->BSIM3name, BSIM3nNames[i]); - } - break; - } - } - break; - case N_CALC: - m = here->BSIM3m; - switch (mode) - { case N_DENS: - NevalSrc(&noizDens[BSIM3RDNOIZ], - &lnNdens[BSIM3RDNOIZ], ckt, THERMNOISE, - here->BSIM3dNodePrime, here->BSIM3dNode, - here->BSIM3drainConductance * m); - - NevalSrc(&noizDens[BSIM3RSNOIZ], - &lnNdens[BSIM3RSNOIZ], ckt, THERMNOISE, - here->BSIM3sNodePrime, here->BSIM3sNode, - here->BSIM3sourceConductance * m); - - switch( model->BSIM3noiMod ) - { case 1: - case 3: - NevalSrc(&noizDens[BSIM3IDNOIZ], - &lnNdens[BSIM3IDNOIZ], ckt, - THERMNOISE, here->BSIM3dNodePrime, - here->BSIM3sNodePrime, - 2.0 * fabs(here->BSIM3gm - + here->BSIM3gds - + here->BSIM3gmbs) / 3.0 * m); - - break; - case 5: - case 6: - vds = MIN(*(ckt->CKTstates[0] + here->BSIM3vds), here->BSIM3vdsat); - NevalSrc(&noizDens[BSIM3IDNOIZ], - &lnNdens[BSIM3IDNOIZ], ckt, - THERMNOISE, here->BSIM3dNodePrime, - here->BSIM3sNodePrime, - (3.0 - vds / here->BSIM3vdsat) - * fabs(here->BSIM3gm - + here->BSIM3gds - + here->BSIM3gmbs) / 3.0 * m); - - break; - case 2: - case 4: - NevalSrc(&noizDens[BSIM3IDNOIZ], - &lnNdens[BSIM3IDNOIZ], ckt, - THERMNOISE, here->BSIM3dNodePrime, - here->BSIM3sNodePrime, - (m * here->BSIM3ueff - * fabs(here->BSIM3qinv) - / (pParam->BSIM3leff * pParam->BSIM3leff - + here->BSIM3ueff *fabs(here->BSIM3qinv) - * here->BSIM3rds))); /* bugfix */ - break; - } - NevalSrc(&noizDens[BSIM3FLNOIZ], NULL, - ckt, N_GAIN, here->BSIM3dNodePrime, - here->BSIM3sNodePrime, (double) 0.0); - - switch( model->BSIM3noiMod ) - { case 1: - case 4: - case 5: - noizDens[BSIM3FLNOIZ] *= m * model->BSIM3kf - * exp(model->BSIM3af - * log(MAX(fabs(here->BSIM3cd), - N_MINLOG))) - / (pow(data->freq, model->BSIM3ef) - * pParam->BSIM3leff - * pParam->BSIM3leff - * model->BSIM3cox); - break; - case 2: - case 3: - case 6: - vds = *(ckt->CKTstates[0] + here->BSIM3vds); - if (vds < 0.0) - { vds = -vds; - } - Ssi = StrongInversionNoiseEval(vds, model, - here, data->freq, ckt->CKTtemp); - T10 = model->BSIM3oxideTrapDensityA - * 8.62e-5 * ckt->CKTtemp; - T11 = pParam->BSIM3weff - * pParam->BSIM3leff - * pow(data->freq, model->BSIM3ef) - * 4.0e36; - Swi = T10 / T11 * here->BSIM3cd - * here->BSIM3cd; - T1 = Swi + Ssi; - if (T1 > 0.0) - noizDens[BSIM3FLNOIZ] *= m * (Ssi * Swi) / T1; - else - noizDens[BSIM3FLNOIZ] *= 0.0; - break; - } - - lnNdens[BSIM3FLNOIZ] = - log(MAX(noizDens[BSIM3FLNOIZ], N_MINLOG)); - - noizDens[BSIM3TOTNOIZ] = noizDens[BSIM3RDNOIZ] - + noizDens[BSIM3RSNOIZ] - + noizDens[BSIM3IDNOIZ] - + noizDens[BSIM3FLNOIZ]; - lnNdens[BSIM3TOTNOIZ] = - log(MAX(noizDens[BSIM3TOTNOIZ], N_MINLOG)); - - *OnDens += noizDens[BSIM3TOTNOIZ]; - - if (data->delFreq == 0.0) - { /* if we haven't done any previous - integration, we need to initialize our - "history" variables. - */ - - for (i = 0; i < BSIM3NSRCS; i++) - { here->BSIM3nVar[LNLSTDENS][i] = - lnNdens[i]; - } - - /* clear out our integration variables - if it's the first pass - */ - if (data->freq == - job->NstartFreq) - { for (i = 0; i < BSIM3NSRCS; i++) - { here->BSIM3nVar[OUTNOIZ][i] = 0.0; - here->BSIM3nVar[INNOIZ][i] = 0.0; - } - } - } - else - { /* data->delFreq != 0.0, - we have to integrate. - */ - for (i = 0; i < BSIM3NSRCS; i++) - { if (i != BSIM3TOTNOIZ) - { tempOnoise = Nintegrate(noizDens[i], - lnNdens[i], - here->BSIM3nVar[LNLSTDENS][i], - data); - tempInoise = Nintegrate(noizDens[i] - * data->GainSqInv, lnNdens[i] - + data->lnGainInv, - here->BSIM3nVar[LNLSTDENS][i] - + data->lnGainInv, data); - here->BSIM3nVar[LNLSTDENS][i] = - lnNdens[i]; - data->outNoiz += tempOnoise; - data->inNoise += tempInoise; - if (job->NStpsSm != 0) - { here->BSIM3nVar[OUTNOIZ][i] - += tempOnoise; - here->BSIM3nVar[OUTNOIZ][BSIM3TOTNOIZ] - += tempOnoise; - here->BSIM3nVar[INNOIZ][i] - += tempInoise; - here->BSIM3nVar[INNOIZ][BSIM3TOTNOIZ] - += tempInoise; - } - } - } - } - if (data->prtSummary) - { for (i = 0; i < BSIM3NSRCS; i++) - { /* print a summary report */ - data->outpVector[data->outNumber++] - = noizDens[i]; - } - } - break; - case INT_NOIZ: - /* already calculated, just output */ - if (job->NStpsSm != 0) - { for (i = 0; i < BSIM3NSRCS; i++) - { data->outpVector[data->outNumber++] - = here->BSIM3nVar[OUTNOIZ][i]; - data->outpVector[data->outNumber++] - = here->BSIM3nVar[INNOIZ][i]; - } - } - break; - } - break; - case N_CLOSE: - /* do nothing, the main calling routine will close */ - return (OK); - break; /* the plots */ - } /* switch (operation) */ - } /* for here */ - } /* for model */ - - return(OK); -} - - - diff --git a/src/spicelib/devices/bsim3/b3par.c b/src/spicelib/devices/bsim3/b3par.c deleted file mode 100644 index ae961b586..000000000 --- a/src/spicelib/devices/bsim3/b3par.c +++ /dev/null @@ -1,133 +0,0 @@ -/**** BSIM3v3.3.0, Released by Xuemei Xi 07/29/2005 ****/ - -/********** - * Copyright 2004 Regents of the University of California. All rights reserved. - * File: b3par.c of BSIM3v3.3.0 - * Author: 1995 Min-Chie Jeng and Mansun Chan - * Author: 1997-1999 Weidong Liu. - * Author: 2001 Xuemei Xi - **********/ - -#include "ngspice/ngspice.h" -#include "ngspice/ifsim.h" -#include "bsim3def.h" -#include "ngspice/sperror.h" -#include "ngspice/suffix.h" -#include "ngspice/fteext.h" - -int -BSIM3param ( -int param, -IFvalue *value, -GENinstance *inst, -IFvalue *select) -{ - double scale; - - BSIM3instance *here = (BSIM3instance*)inst; - - NG_IGNORE(select); - - if (!cp_getvar("scale", CP_REAL, &scale, 0)) - scale = 1; - - switch (param) { - case BSIM3_W: - here->BSIM3w = value->rValue*scale; - here->BSIM3wGiven = TRUE; - break; - case BSIM3_L: - here->BSIM3l = value->rValue*scale; - here->BSIM3lGiven = TRUE; - break; - case BSIM3_M: - here->BSIM3m = value->rValue; - here->BSIM3mGiven = TRUE; - break; - case BSIM3_AS: - here->BSIM3sourceArea = value->rValue*scale*scale; - here->BSIM3sourceAreaGiven = TRUE; - break; - case BSIM3_AD: - here->BSIM3drainArea = value->rValue*scale*scale; - here->BSIM3drainAreaGiven = TRUE; - break; - case BSIM3_PS: - here->BSIM3sourcePerimeter = value->rValue*scale; - here->BSIM3sourcePerimeterGiven = TRUE; - break; - case BSIM3_PD: - here->BSIM3drainPerimeter = value->rValue*scale; - here->BSIM3drainPerimeterGiven = TRUE; - break; - case BSIM3_NRS: - here->BSIM3sourceSquares = value->rValue; - here->BSIM3sourceSquaresGiven = TRUE; - break; - case BSIM3_NRD: - here->BSIM3drainSquares = value->rValue; - here->BSIM3drainSquaresGiven = TRUE; - break; - case BSIM3_OFF: - here->BSIM3off = value->iValue; - break; - case BSIM3_IC_VBS: - here->BSIM3icVBS = value->rValue; - here->BSIM3icVBSGiven = TRUE; - break; - case BSIM3_IC_VDS: - here->BSIM3icVDS = value->rValue; - here->BSIM3icVDSGiven = TRUE; - break; - case BSIM3_IC_VGS: - here->BSIM3icVGS = value->rValue; - here->BSIM3icVGSGiven = TRUE; - break; - case BSIM3_NQSMOD: - here->BSIM3nqsMod = value->iValue; - here->BSIM3nqsModGiven = TRUE; - break; - case BSIM3_ACNQSMOD: - here->BSIM3acnqsMod = value->iValue; - here->BSIM3acnqsModGiven = TRUE; - break; - case BSIM3_GEO: - here->BSIM3geo = value->iValue; - here->BSIM3geoGiven = TRUE; - break; - case BSIM3_DELVTO: - here->BSIM3delvto = value->rValue; - here->BSIM3delvtoGiven = TRUE; - break; - case BSIM3_MULU0: - here->BSIM3mulu0 = value->rValue; - here->BSIM3mulu0Given = TRUE; - break; - case BSIM3_IC: - /* FALLTHROUGH added to suppress GCC warning due to - * -Wimplicit-fallthrough flag */ - switch (value->v.numValue) { - case 3: - here->BSIM3icVBS = *(value->v.vec.rVec+2); - here->BSIM3icVBSGiven = TRUE; - /* FALLTHROUGH */ - case 2: - here->BSIM3icVGS = *(value->v.vec.rVec+1); - here->BSIM3icVGSGiven = TRUE; - /* FALLTHROUGH */ - case 1: - here->BSIM3icVDS = *(value->v.vec.rVec); - here->BSIM3icVDSGiven = TRUE; - break; - default: - return(E_BADPARM); - } - break; - default: - return(E_BADPARM); - } - return(OK); -} - - - diff --git a/src/spicelib/devices/bsim3/b3pzld.c b/src/spicelib/devices/bsim3/b3pzld.c deleted file mode 100644 index 32343cee7..000000000 --- a/src/spicelib/devices/bsim3/b3pzld.c +++ /dev/null @@ -1,371 +0,0 @@ -/**** BSIM3v3.3.0, Released by Xuemei Xi 07/29/2005 ****/ - -/********** - * Copyright 2004 Regents of the University of California. All rights reserved. - * File: b3pzld.c of BSIM3v3.3.0 - * Author: 1995 Min-Chie Jeng and Mansun Chan. - * Author: 1997-1999 Weidong Liu. - * Author: 2001 Xuemei Xi - **********/ - -#include "ngspice/ngspice.h" -#include "ngspice/cktdefs.h" -#include "ngspice/complex.h" -#include "ngspice/sperror.h" -#include "bsim3def.h" -#include "ngspice/suffix.h" - -int -BSIM3pzLoad( -GENmodel *inModel, -CKTcircuit *ckt, -SPcomplex *s) -{ -BSIM3model *model = (BSIM3model*)inModel; -BSIM3instance *here; -double xcggb, xcgdb, xcgsb, xcgbb, xcbgb, xcbdb, xcbsb, xcbbb; -double xcdgb, xcddb, xcdsb, xcdbb, xcsgb, xcsdb, xcssb, xcsbb; -double gdpr, gspr, gds, gbd, gbs, capbd, capbs, FwdSum, RevSum, Gm, Gmbs; -double cggb, cgdb, cgsb, cbgb, cbdb, cbsb, cddb, cdgb, cdsb; -double GSoverlapCap, GDoverlapCap, GBoverlapCap; -double dxpart, sxpart, xgtg, xgtd, xgts, xgtb, xcqgb=0.0, xcqdb=0.0, xcqsb=0.0, xcqbb=0.0; -double gbspsp, gbbdp, gbbsp, gbspg, gbspb; -double gbspdp, gbdpdp, gbdpg, gbdpb, gbdpsp; -double ddxpart_dVd, ddxpart_dVg, ddxpart_dVb, ddxpart_dVs; -double dsxpart_dVd, dsxpart_dVg, dsxpart_dVb, dsxpart_dVs; -double T1, CoxWL, qcheq, Cdg, Cdd, Cds, Csg, Csd, Css; -double ScalingFactor = 1.0e-9; -double m; - - for (; model != NULL; model = BSIM3nextModel(model)) - { for (here = BSIM3instances(model); here!= NULL; - here = BSIM3nextInstance(here)) - { - if (here->BSIM3mode >= 0) - { Gm = here->BSIM3gm; - Gmbs = here->BSIM3gmbs; - FwdSum = Gm + Gmbs; - RevSum = 0.0; - - gbbdp = -here->BSIM3gbds; - gbbsp = here->BSIM3gbds + here->BSIM3gbgs + here->BSIM3gbbs; - - gbdpg = here->BSIM3gbgs; - gbdpdp = here->BSIM3gbds; - gbdpb = here->BSIM3gbbs; - gbdpsp = -(gbdpg + gbdpdp + gbdpb); - - gbspg = 0.0; - gbspdp = 0.0; - gbspb = 0.0; - gbspsp = 0.0; - - if (here->BSIM3nqsMod == 0 && here->BSIM3acnqsMod == 0) - { cggb = here->BSIM3cggb; - cgsb = here->BSIM3cgsb; - cgdb = here->BSIM3cgdb; - - cbgb = here->BSIM3cbgb; - cbsb = here->BSIM3cbsb; - cbdb = here->BSIM3cbdb; - - cdgb = here->BSIM3cdgb; - cdsb = here->BSIM3cdsb; - cddb = here->BSIM3cddb; - - xgtg = xgtd = xgts = xgtb = 0.0; - sxpart = 0.6; - dxpart = 0.4; - ddxpart_dVd = ddxpart_dVg = ddxpart_dVb - = ddxpart_dVs = 0.0; - dsxpart_dVd = dsxpart_dVg = dsxpart_dVb - = dsxpart_dVs = 0.0; - } - else - { cggb = cgdb = cgsb = 0.0; - cbgb = cbdb = cbsb = 0.0; - cdgb = cddb = cdsb = 0.0; - - xgtg = here->BSIM3gtg; - xgtd = here->BSIM3gtd; - xgts = here->BSIM3gts; - xgtb = here->BSIM3gtb; - - xcqgb = here->BSIM3cqgb; - xcqdb = here->BSIM3cqdb; - xcqsb = here->BSIM3cqsb; - xcqbb = here->BSIM3cqbb; - - CoxWL = model->BSIM3cox * here->pParam->BSIM3weffCV - * here->pParam->BSIM3leffCV; - qcheq = -(here->BSIM3qgate + here->BSIM3qbulk); - if (fabs(qcheq) <= 1.0e-5 * CoxWL) - { if (model->BSIM3xpart < 0.5) - { dxpart = 0.4; - } - else if (model->BSIM3xpart > 0.5) - { dxpart = 0.0; - } - else - { dxpart = 0.5; - } - ddxpart_dVd = ddxpart_dVg = ddxpart_dVb - = ddxpart_dVs = 0.0; - } - else - { dxpart = here->BSIM3qdrn / qcheq; - Cdd = here->BSIM3cddb; - Csd = -(here->BSIM3cgdb + here->BSIM3cddb - + here->BSIM3cbdb); - ddxpart_dVd = (Cdd - dxpart * (Cdd + Csd)) / qcheq; - Cdg = here->BSIM3cdgb; - Csg = -(here->BSIM3cggb + here->BSIM3cdgb - + here->BSIM3cbgb); - ddxpart_dVg = (Cdg - dxpart * (Cdg + Csg)) / qcheq; - - Cds = here->BSIM3cdsb; - Css = -(here->BSIM3cgsb + here->BSIM3cdsb - + here->BSIM3cbsb); - ddxpart_dVs = (Cds - dxpart * (Cds + Css)) / qcheq; - - ddxpart_dVb = -(ddxpart_dVd + ddxpart_dVg - + ddxpart_dVs); - } - sxpart = 1.0 - dxpart; - dsxpart_dVd = -ddxpart_dVd; - dsxpart_dVg = -ddxpart_dVg; - dsxpart_dVs = -ddxpart_dVs; - dsxpart_dVb = -(dsxpart_dVd + dsxpart_dVg + dsxpart_dVs); - } - } - else - { Gm = -here->BSIM3gm; - Gmbs = -here->BSIM3gmbs; - FwdSum = 0.0; - RevSum = -(Gm + Gmbs); - - gbbsp = -here->BSIM3gbds; - gbbdp = here->BSIM3gbds + here->BSIM3gbgs + here->BSIM3gbbs; - - gbdpg = 0.0; - gbdpsp = 0.0; - gbdpb = 0.0; - gbdpdp = 0.0; - - gbspg = here->BSIM3gbgs; - gbspsp = here->BSIM3gbds; - gbspb = here->BSIM3gbbs; - gbspdp = -(gbspg + gbspsp + gbspb); - - if (here->BSIM3nqsMod == 0 && here->BSIM3acnqsMod == 0) - { cggb = here->BSIM3cggb; - cgsb = here->BSIM3cgdb; - cgdb = here->BSIM3cgsb; - - cbgb = here->BSIM3cbgb; - cbsb = here->BSIM3cbdb; - cbdb = here->BSIM3cbsb; - - cdgb = -(here->BSIM3cdgb + cggb + cbgb); - cdsb = -(here->BSIM3cddb + cgsb + cbsb); - cddb = -(here->BSIM3cdsb + cgdb + cbdb); - - xgtg = xgtd = xgts = xgtb = 0.0; - sxpart = 0.4; - dxpart = 0.6; - ddxpart_dVd = ddxpart_dVg = ddxpart_dVb - = ddxpart_dVs = 0.0; - dsxpart_dVd = dsxpart_dVg = dsxpart_dVb - = dsxpart_dVs = 0.0; - } - else - { cggb = cgdb = cgsb = 0.0; - cbgb = cbdb = cbsb = 0.0; - cdgb = cddb = cdsb = 0.0; - - xgtg = here->BSIM3gtg; - xgtd = here->BSIM3gts; - xgts = here->BSIM3gtd; - xgtb = here->BSIM3gtb; - - xcqgb = here->BSIM3cqgb; - xcqdb = here->BSIM3cqsb; - xcqsb = here->BSIM3cqdb; - xcqbb = here->BSIM3cqbb; - - CoxWL = model->BSIM3cox * here->pParam->BSIM3weffCV - * here->pParam->BSIM3leffCV; - qcheq = -(here->BSIM3qgate + here->BSIM3qbulk); - if (fabs(qcheq) <= 1.0e-5 * CoxWL) - { if (model->BSIM3xpart < 0.5) - { sxpart = 0.4; - } - else if (model->BSIM3xpart > 0.5) - { sxpart = 0.0; - } - else - { sxpart = 0.5; - } - dsxpart_dVd = dsxpart_dVg = dsxpart_dVb - = dsxpart_dVs = 0.0; - } - else - { sxpart = here->BSIM3qdrn / qcheq; - Css = here->BSIM3cddb; - Cds = -(here->BSIM3cgdb + here->BSIM3cddb - + here->BSIM3cbdb); - dsxpart_dVs = (Css - sxpart * (Css + Cds)) / qcheq; - Csg = here->BSIM3cdgb; - Cdg = -(here->BSIM3cggb + here->BSIM3cdgb - + here->BSIM3cbgb); - dsxpart_dVg = (Csg - sxpart * (Csg + Cdg)) / qcheq; - - Csd = here->BSIM3cdsb; - Cdd = -(here->BSIM3cgsb + here->BSIM3cdsb - + here->BSIM3cbsb); - dsxpart_dVd = (Csd - sxpart * (Csd + Cdd)) / qcheq; - - dsxpart_dVb = -(dsxpart_dVd + dsxpart_dVg - + dsxpart_dVs); - } - dxpart = 1.0 - sxpart; - ddxpart_dVd = -dsxpart_dVd; - ddxpart_dVg = -dsxpart_dVg; - ddxpart_dVs = -dsxpart_dVs; - ddxpart_dVb = -(ddxpart_dVd + ddxpart_dVg + ddxpart_dVs); - } - } - - - T1 = *(ckt->CKTstate0 + here->BSIM3qdef) * here->BSIM3gtau; - gdpr = here->BSIM3drainConductance; - gspr = here->BSIM3sourceConductance; - gds = here->BSIM3gds; - gbd = here->BSIM3gbd; - gbs = here->BSIM3gbs; - capbd = here->BSIM3capbd; - capbs = here->BSIM3capbs; - - GSoverlapCap = here->BSIM3cgso; - GDoverlapCap = here->BSIM3cgdo; - GBoverlapCap = here->pParam->BSIM3cgbo; - - xcdgb = (cdgb - GDoverlapCap); - xcddb = (cddb + capbd + GDoverlapCap); - xcdsb = cdsb; - xcdbb = -(xcdgb + xcddb + xcdsb); - xcsgb = -(cggb + cbgb + cdgb + GSoverlapCap); - xcsdb = -(cgdb + cbdb + cddb); - xcssb = (capbs + GSoverlapCap - (cgsb + cbsb + cdsb)); - xcsbb = -(xcsgb + xcsdb + xcssb); - xcggb = (cggb + GDoverlapCap + GSoverlapCap + GBoverlapCap); - xcgdb = (cgdb - GDoverlapCap); - xcgsb = (cgsb - GSoverlapCap); - xcgbb = -(xcggb + xcgdb + xcgsb); - xcbgb = (cbgb - GBoverlapCap); - xcbdb = (cbdb - capbd); - xcbsb = (cbsb - capbs); - xcbbb = -(xcbgb + xcbdb + xcbsb); - - m = here->BSIM3m; - - *(here->BSIM3GgPtr ) += m * (xcggb * s->real); - *(here->BSIM3GgPtr +1) += m * (xcggb * s->imag); - *(here->BSIM3BbPtr ) += m * (xcbbb * s->real); - *(here->BSIM3BbPtr +1) += m * (xcbbb * s->imag); - *(here->BSIM3DPdpPtr ) += m * (xcddb * s->real); - *(here->BSIM3DPdpPtr +1) += m * (xcddb * s->imag); - *(here->BSIM3SPspPtr ) += m * (xcssb * s->real); - *(here->BSIM3SPspPtr +1) += m * (xcssb * s->imag); - - *(here->BSIM3GbPtr ) += m * (xcgbb * s->real); - *(here->BSIM3GbPtr +1) += m * (xcgbb * s->imag); - *(here->BSIM3GdpPtr ) += m * (xcgdb * s->real); - *(here->BSIM3GdpPtr +1) += m * (xcgdb * s->imag); - *(here->BSIM3GspPtr ) += m * (xcgsb * s->real); - *(here->BSIM3GspPtr +1) += m * (xcgsb * s->imag); - - *(here->BSIM3BgPtr ) += m * (xcbgb * s->real); - *(here->BSIM3BgPtr +1) += m * (xcbgb * s->imag); - *(here->BSIM3BdpPtr ) += m * (xcbdb * s->real); - *(here->BSIM3BdpPtr +1) += m * (xcbdb * s->imag); - *(here->BSIM3BspPtr ) += m * (xcbsb * s->real); - *(here->BSIM3BspPtr +1) += m * (xcbsb * s->imag); - - *(here->BSIM3DPgPtr ) += m * (xcdgb * s->real); - *(here->BSIM3DPgPtr +1) += m * (xcdgb * s->imag); - *(here->BSIM3DPbPtr ) += m * (xcdbb * s->real); - *(here->BSIM3DPbPtr +1) += m * (xcdbb * s->imag); - *(here->BSIM3DPspPtr ) += m * (xcdsb * s->real); - *(here->BSIM3DPspPtr +1) += m * (xcdsb * s->imag); - - *(here->BSIM3SPgPtr ) += m * (xcsgb * s->real); - *(here->BSIM3SPgPtr +1) += m * (xcsgb * s->imag); - *(here->BSIM3SPbPtr ) += m * (xcsbb * s->real); - *(here->BSIM3SPbPtr +1) += m * (xcsbb * s->imag); - *(here->BSIM3SPdpPtr ) += m * (xcsdb * s->real); - *(here->BSIM3SPdpPtr +1) += m * (xcsdb * s->imag); - - *(here->BSIM3DdPtr) += m * gdpr; - *(here->BSIM3DdpPtr) -= m * gdpr; - *(here->BSIM3DPdPtr) -= m * gdpr; - - *(here->BSIM3SsPtr) += m * gspr; - *(here->BSIM3SspPtr) -= m * gspr; - *(here->BSIM3SPsPtr) -= m * gspr; - - *(here->BSIM3BgPtr) -= m * here->BSIM3gbgs; - *(here->BSIM3BbPtr) += m * (gbd + gbs - here->BSIM3gbbs); - *(here->BSIM3BdpPtr) -= m * (gbd - gbbdp); - *(here->BSIM3BspPtr) -= m * (gbs - gbbsp); - - *(here->BSIM3DPgPtr) += m * (Gm + dxpart * xgtg - + T1 * ddxpart_dVg + gbdpg); - *(here->BSIM3DPdpPtr) += m * (gdpr + gds + gbd + RevSum - + dxpart * xgtd + T1 * ddxpart_dVd + gbdpdp); - *(here->BSIM3DPspPtr) -= m * (gds + FwdSum - dxpart * xgts - - T1 * ddxpart_dVs - gbdpsp); - *(here->BSIM3DPbPtr) -= m * (gbd - Gmbs - dxpart * xgtb - - T1 * ddxpart_dVb - gbdpb); - - *(here->BSIM3SPgPtr) -= m * (Gm - sxpart * xgtg - - T1 * dsxpart_dVg - gbspg); - *(here->BSIM3SPspPtr) += m * (gspr + gds + gbs + FwdSum - + sxpart * xgts + T1 * dsxpart_dVs + gbspsp); - *(here->BSIM3SPbPtr) -= m * (gbs + Gmbs - sxpart * xgtb - - T1 * dsxpart_dVb - gbspb); - *(here->BSIM3SPdpPtr) -= m * (gds + RevSum - sxpart * xgtd - - T1 * dsxpart_dVd - gbspdp); - - *(here->BSIM3GgPtr) -= m * xgtg; - *(here->BSIM3GbPtr) -= m * xgtb; - *(here->BSIM3GdpPtr) -= m * xgtd; - *(here->BSIM3GspPtr) -= m * xgts; - - if (here->BSIM3nqsMod || here->BSIM3acnqsMod) - { *(here->BSIM3QqPtr ) += m * (s->real * ScalingFactor); - *(here->BSIM3QqPtr +1) += m * (s->imag * ScalingFactor); - *(here->BSIM3QgPtr ) -= m * (xcqgb * s->real); - *(here->BSIM3QgPtr +1) -= m * (xcqgb * s->imag); - *(here->BSIM3QdpPtr ) -= m * (xcqdb * s->real); - *(here->BSIM3QdpPtr +1) -= m * (xcqdb * s->imag); - *(here->BSIM3QbPtr ) -= m * (xcqbb * s->real); - *(here->BSIM3QbPtr +1) -= m * (xcqbb * s->imag); - *(here->BSIM3QspPtr ) -= m * (xcqsb * s->real); - *(here->BSIM3QspPtr +1) -= m * (xcqsb * s->imag); - - *(here->BSIM3GqPtr) -= m * (here->BSIM3gtau); - *(here->BSIM3DPqPtr) += m * (dxpart * here->BSIM3gtau); - *(here->BSIM3SPqPtr) += m * (sxpart * here->BSIM3gtau); - - *(here->BSIM3QqPtr) += m * (here->BSIM3gtau); - *(here->BSIM3QgPtr) += m * xgtg; - *(here->BSIM3QdpPtr) += m * xgtd; - *(here->BSIM3QbPtr) += m * xgtb; - *(here->BSIM3QspPtr) += m * xgts; - } - } - } - return(OK); -} - diff --git a/src/spicelib/devices/bsim3/b3set.c b/src/spicelib/devices/bsim3/b3set.c deleted file mode 100644 index 5c2220f4d..000000000 --- a/src/spicelib/devices/bsim3/b3set.c +++ /dev/null @@ -1,1205 +0,0 @@ -/**** BSIM3v3.3.0, Released by Xuemei Xi 07/29/2005 ****/ -/**** OpenMP support for ngspice by Holger Vogt 06/28/2010 ****/ - -/********** - * Copyright 2004 Regents of the University of California. All rights reserved. - * File: b3set.c of BSIM3v3.3.0 - * Author: 1995 Min-Chie Jeng and Mansun Chan. - * Author: 1997-1999 Weidong Liu. - * Author: 2001 Xuemei Xi - **********/ - -#include "ngspice/ngspice.h" -#include "ngspice/smpdefs.h" -#include "ngspice/cktdefs.h" -#include "bsim3def.h" -#include "ngspice/const.h" -#include "ngspice/sperror.h" -#include "ngspice/devdefs.h" -#include "ngspice/suffix.h" - -#define MAX_EXP 5.834617425e14 -#define MIN_EXP 1.713908431e-15 -#define EXP_THRESHOLD 34.0 -#define SMOOTHFACTOR 0.1 -#define EPSOX 3.453133e-11 -#define EPSSI 1.03594e-10 -#define PI 3.141592654 -#define Charge_q 1.60219e-19 -#define Meter2Micron 1.0e6 - -int -BSIM3setup( -SMPmatrix *matrix, -GENmodel *inModel, -CKTcircuit *ckt, -int *states) -{ -BSIM3model *model = (BSIM3model*)inModel; -BSIM3instance *here; -int error; -CKTnode *tmp; -CKTnode *tmpNode; -IFuid tmpName; - -#ifdef USE_OMP -int idx, InstCount; -BSIM3instance **InstArray; -#endif - - - /* loop through all the BSIM3 device models */ - for( ; model != NULL; model = BSIM3nextModel(model)) - { -/* Default value Processing for BSIM3 MOSFET Models */ - if (!model->BSIM3typeGiven) - model->BSIM3type = NMOS; - if (!model->BSIM3mobModGiven) - model->BSIM3mobMod = 1; - if (!model->BSIM3binUnitGiven) - model->BSIM3binUnit = 1; - if (!model->BSIM3paramChkGiven) - model->BSIM3paramChk = 0; - if (!model->BSIM3capModGiven) - model->BSIM3capMod = 3; - if (!model->BSIM3acmModGiven) - model->BSIM3acmMod = 0; - if (!model->BSIM3calcacmGiven) - model->BSIM3calcacm = 0; - if (!model->BSIM3noiModGiven) - model->BSIM3noiMod = 1; - if (!model->BSIM3nqsModGiven) - model->BSIM3nqsMod = 0; - else if ((model->BSIM3nqsMod != 0) && (model->BSIM3nqsMod != 1)) - { model->BSIM3nqsMod = 0; - printf("Warning: nqsMod has been set to its default value: 0.\n"); - } - if (!model->BSIM3acnqsModGiven) - model->BSIM3acnqsMod = 0; - else if ((model->BSIM3acnqsMod != 0) && (model->BSIM3acnqsMod != 1)) - { model->BSIM3acnqsMod = 0; - printf("Warning: acnqsMod has been set to its default value: 0.\n"); - } - if (!model->BSIM3versionGiven) - model->BSIM3version = copy("3.3.0"); - if (!model->BSIM3toxGiven) - model->BSIM3tox = 150.0e-10; - model->BSIM3cox = 3.453133e-11 / model->BSIM3tox; - if (!model->BSIM3toxmGiven) - model->BSIM3toxm = model->BSIM3tox; - - if (!model->BSIM3cdscGiven) - model->BSIM3cdsc = 2.4e-4; /* unit Q/V/m^2 */ - if (!model->BSIM3cdscbGiven) - model->BSIM3cdscb = 0.0; /* unit Q/V/m^2 */ - if (!model->BSIM3cdscdGiven) - model->BSIM3cdscd = 0.0; /* unit Q/V/m^2 */ - if (!model->BSIM3citGiven) - model->BSIM3cit = 0.0; /* unit Q/V/m^2 */ - if (!model->BSIM3nfactorGiven) - model->BSIM3nfactor = 1; - if (!model->BSIM3xjGiven) - model->BSIM3xj = .15e-6; - if (!model->BSIM3vsatGiven) - model->BSIM3vsat = 8.0e4; /* unit m/s */ - if (!model->BSIM3atGiven) - model->BSIM3at = 3.3e4; /* unit m/s */ - if (!model->BSIM3a0Given) - model->BSIM3a0 = 1.0; - if (!model->BSIM3agsGiven) - model->BSIM3ags = 0.0; - if (!model->BSIM3a1Given) - model->BSIM3a1 = 0.0; - if (!model->BSIM3a2Given) - model->BSIM3a2 = 1.0; - if (!model->BSIM3ketaGiven) - model->BSIM3keta = -0.047; /* unit / V */ - if (!model->BSIM3nsubGiven) - model->BSIM3nsub = 6.0e16; /* unit 1/cm3 */ - if (!model->BSIM3npeakGiven) - model->BSIM3npeak = 1.7e17; /* unit 1/cm3 */ - if (!model->BSIM3ngateGiven) - model->BSIM3ngate = 0; /* unit 1/cm3 */ - if (!model->BSIM3vbmGiven) - model->BSIM3vbm = -3.0; - if (!model->BSIM3xtGiven) - model->BSIM3xt = 1.55e-7; - if (!model->BSIM3kt1Given) - model->BSIM3kt1 = -0.11; /* unit V */ - if (!model->BSIM3kt1lGiven) - model->BSIM3kt1l = 0.0; /* unit V*m */ - if (!model->BSIM3kt2Given) - model->BSIM3kt2 = 0.022; /* No unit */ - if (!model->BSIM3k3Given) - model->BSIM3k3 = 80.0; - if (!model->BSIM3k3bGiven) - model->BSIM3k3b = 0.0; - if (!model->BSIM3w0Given) - model->BSIM3w0 = 2.5e-6; - if (!model->BSIM3nlxGiven) - model->BSIM3nlx = 1.74e-7; - if (!model->BSIM3dvt0Given) - model->BSIM3dvt0 = 2.2; - if (!model->BSIM3dvt1Given) - model->BSIM3dvt1 = 0.53; - if (!model->BSIM3dvt2Given) - model->BSIM3dvt2 = -0.032; /* unit 1 / V */ - - if (!model->BSIM3dvt0wGiven) - model->BSIM3dvt0w = 0.0; - if (!model->BSIM3dvt1wGiven) - model->BSIM3dvt1w = 5.3e6; - if (!model->BSIM3dvt2wGiven) - model->BSIM3dvt2w = -0.032; - - if (!model->BSIM3droutGiven) - model->BSIM3drout = 0.56; - if (!model->BSIM3dsubGiven) - model->BSIM3dsub = model->BSIM3drout; - if (!model->BSIM3vth0Given) - model->BSIM3vth0 = (model->BSIM3type == NMOS) ? 0.7 : -0.7; - if (!model->BSIM3uaGiven) - model->BSIM3ua = 2.25e-9; /* unit m/V */ - if (!model->BSIM3ua1Given) - model->BSIM3ua1 = 4.31e-9; /* unit m/V */ - if (!model->BSIM3ubGiven) - model->BSIM3ub = 5.87e-19; /* unit (m/V)**2 */ - if (!model->BSIM3ub1Given) - model->BSIM3ub1 = -7.61e-18; /* unit (m/V)**2 */ - if (!model->BSIM3ucGiven) - model->BSIM3uc = (model->BSIM3mobMod == 3) ? -0.0465 : -0.0465e-9; - if (!model->BSIM3uc1Given) - model->BSIM3uc1 = (model->BSIM3mobMod == 3) ? -0.056 : -0.056e-9; - if (!model->BSIM3u0Given) - model->BSIM3u0 = (model->BSIM3type == NMOS) ? 0.067 : 0.025; - if (!model->BSIM3uteGiven) - model->BSIM3ute = -1.5; - if (!model->BSIM3voffGiven) - model->BSIM3voff = -0.08; - if (!model->BSIM3deltaGiven) - model->BSIM3delta = 0.01; - if (!model->BSIM3rdswGiven) - model->BSIM3rdsw = 0; - if (!model->BSIM3prwgGiven) - model->BSIM3prwg = 0.0; /* unit 1/V */ - if (!model->BSIM3prwbGiven) - model->BSIM3prwb = 0.0; - if (!model->BSIM3prtGiven) - model->BSIM3prt = 0.0; - if (!model->BSIM3eta0Given) - model->BSIM3eta0 = 0.08; /* no unit */ - if (!model->BSIM3etabGiven) - model->BSIM3etab = -0.07; /* unit 1/V */ - if (!model->BSIM3pclmGiven) - model->BSIM3pclm = 1.3; /* no unit */ - if (!model->BSIM3pdibl1Given) - model->BSIM3pdibl1 = .39; /* no unit */ - if (!model->BSIM3pdibl2Given) - model->BSIM3pdibl2 = 0.0086; /* no unit */ - if (!model->BSIM3pdiblbGiven) - model->BSIM3pdiblb = 0.0; /* 1/V */ - if (!model->BSIM3pscbe1Given) - model->BSIM3pscbe1 = 4.24e8; - if (!model->BSIM3pscbe2Given) - model->BSIM3pscbe2 = 1.0e-5; - if (!model->BSIM3pvagGiven) - model->BSIM3pvag = 0.0; - if (!model->BSIM3wrGiven) - model->BSIM3wr = 1.0; - if (!model->BSIM3dwgGiven) - model->BSIM3dwg = 0.0; - if (!model->BSIM3dwbGiven) - model->BSIM3dwb = 0.0; - if (!model->BSIM3b0Given) - model->BSIM3b0 = 0.0; - if (!model->BSIM3b1Given) - model->BSIM3b1 = 0.0; - if (!model->BSIM3alpha0Given) - model->BSIM3alpha0 = 0.0; - if (!model->BSIM3alpha1Given) - model->BSIM3alpha1 = 0.0; - if (!model->BSIM3beta0Given) - model->BSIM3beta0 = 30.0; - if (!model->BSIM3ijthGiven) - model->BSIM3ijth = 0.1; /* unit A */ - - if (!model->BSIM3elmGiven) - model->BSIM3elm = 5.0; - if (!model->BSIM3cgslGiven) - model->BSIM3cgsl = 0.0; - if (!model->BSIM3cgdlGiven) - model->BSIM3cgdl = 0.0; - if (!model->BSIM3ckappaGiven) - model->BSIM3ckappa = 0.6; - if (!model->BSIM3clcGiven) - model->BSIM3clc = 0.1e-6; - if (!model->BSIM3cleGiven) - model->BSIM3cle = 0.6; - if (!model->BSIM3vfbcvGiven) - model->BSIM3vfbcv = -1.0; - if (!model->BSIM3acdeGiven) - model->BSIM3acde = 1.0; - if (!model->BSIM3moinGiven) - model->BSIM3moin = 15.0; - if (!model->BSIM3noffGiven) - model->BSIM3noff = 1.0; - if (!model->BSIM3voffcvGiven) - model->BSIM3voffcv = 0.0; - if (!model->BSIM3tcjGiven) - model->BSIM3tcj = 0.0; - if (!model->BSIM3tpbGiven) - model->BSIM3tpb = 0.0; - if (!model->BSIM3tcjswGiven) - model->BSIM3tcjsw = 0.0; - if (!model->BSIM3tpbswGiven) - model->BSIM3tpbsw = 0.0; - if (!model->BSIM3tcjswgGiven) - model->BSIM3tcjswg = 0.0; - if (!model->BSIM3tpbswgGiven) - model->BSIM3tpbswg = 0.0; - - /* ACM model */ - if (!model->BSIM3hdifGiven) - model->BSIM3hdif = 0.0; - if (!model->BSIM3ldifGiven) - model->BSIM3ldif = 0.0; - if (!model->BSIM3ldGiven) - model->BSIM3ld = 0.0; - if (!model->BSIM3rdGiven) - model->BSIM3rd = 0.0; - if (!model->BSIM3rsGiven) - model->BSIM3rs = 0.0; - if (!model->BSIM3rdcGiven) - model->BSIM3rdc = 0.0; - if (!model->BSIM3rscGiven) - model->BSIM3rsc = 0.0; - if (!model->BSIM3wmltGiven) - model->BSIM3wmlt = 1.0; - - /* Length dependence */ - if (!model->BSIM3lcdscGiven) - model->BSIM3lcdsc = 0.0; - if (!model->BSIM3lcdscbGiven) - model->BSIM3lcdscb = 0.0; - if (!model->BSIM3lcdscdGiven) - model->BSIM3lcdscd = 0.0; - if (!model->BSIM3lcitGiven) - model->BSIM3lcit = 0.0; - if (!model->BSIM3lnfactorGiven) - model->BSIM3lnfactor = 0.0; - if (!model->BSIM3lxjGiven) - model->BSIM3lxj = 0.0; - if (!model->BSIM3lvsatGiven) - model->BSIM3lvsat = 0.0; - if (!model->BSIM3latGiven) - model->BSIM3lat = 0.0; - if (!model->BSIM3la0Given) - model->BSIM3la0 = 0.0; - if (!model->BSIM3lagsGiven) - model->BSIM3lags = 0.0; - if (!model->BSIM3la1Given) - model->BSIM3la1 = 0.0; - if (!model->BSIM3la2Given) - model->BSIM3la2 = 0.0; - if (!model->BSIM3lketaGiven) - model->BSIM3lketa = 0.0; - if (!model->BSIM3lnsubGiven) - model->BSIM3lnsub = 0.0; - if (!model->BSIM3lnpeakGiven) - model->BSIM3lnpeak = 0.0; - if (!model->BSIM3lngateGiven) - model->BSIM3lngate = 0.0; - if (!model->BSIM3lvbmGiven) - model->BSIM3lvbm = 0.0; - if (!model->BSIM3lxtGiven) - model->BSIM3lxt = 0.0; - if (!model->BSIM3lkt1Given) - model->BSIM3lkt1 = 0.0; - if (!model->BSIM3lkt1lGiven) - model->BSIM3lkt1l = 0.0; - if (!model->BSIM3lkt2Given) - model->BSIM3lkt2 = 0.0; - if (!model->BSIM3lk3Given) - model->BSIM3lk3 = 0.0; - if (!model->BSIM3lk3bGiven) - model->BSIM3lk3b = 0.0; - if (!model->BSIM3lw0Given) - model->BSIM3lw0 = 0.0; - if (!model->BSIM3lnlxGiven) - model->BSIM3lnlx = 0.0; - if (!model->BSIM3ldvt0Given) - model->BSIM3ldvt0 = 0.0; - if (!model->BSIM3ldvt1Given) - model->BSIM3ldvt1 = 0.0; - if (!model->BSIM3ldvt2Given) - model->BSIM3ldvt2 = 0.0; - if (!model->BSIM3ldvt0wGiven) - model->BSIM3ldvt0w = 0.0; - if (!model->BSIM3ldvt1wGiven) - model->BSIM3ldvt1w = 0.0; - if (!model->BSIM3ldvt2wGiven) - model->BSIM3ldvt2w = 0.0; - if (!model->BSIM3ldroutGiven) - model->BSIM3ldrout = 0.0; - if (!model->BSIM3ldsubGiven) - model->BSIM3ldsub = 0.0; - if (!model->BSIM3lvth0Given) - model->BSIM3lvth0 = 0.0; - if (!model->BSIM3luaGiven) - model->BSIM3lua = 0.0; - if (!model->BSIM3lua1Given) - model->BSIM3lua1 = 0.0; - if (!model->BSIM3lubGiven) - model->BSIM3lub = 0.0; - if (!model->BSIM3lub1Given) - model->BSIM3lub1 = 0.0; - if (!model->BSIM3lucGiven) - model->BSIM3luc = 0.0; - if (!model->BSIM3luc1Given) - model->BSIM3luc1 = 0.0; - if (!model->BSIM3lu0Given) - model->BSIM3lu0 = 0.0; - if (!model->BSIM3luteGiven) - model->BSIM3lute = 0.0; - if (!model->BSIM3lvoffGiven) - model->BSIM3lvoff = 0.0; - if (!model->BSIM3ldeltaGiven) - model->BSIM3ldelta = 0.0; - if (!model->BSIM3lrdswGiven) - model->BSIM3lrdsw = 0.0; - if (!model->BSIM3lprwbGiven) - model->BSIM3lprwb = 0.0; - if (!model->BSIM3lprwgGiven) - model->BSIM3lprwg = 0.0; - if (!model->BSIM3lprtGiven) - model->BSIM3lprt = 0.0; - if (!model->BSIM3leta0Given) - model->BSIM3leta0 = 0.0; - if (!model->BSIM3letabGiven) - model->BSIM3letab = -0.0; - if (!model->BSIM3lpclmGiven) - model->BSIM3lpclm = 0.0; - if (!model->BSIM3lpdibl1Given) - model->BSIM3lpdibl1 = 0.0; - if (!model->BSIM3lpdibl2Given) - model->BSIM3lpdibl2 = 0.0; - if (!model->BSIM3lpdiblbGiven) - model->BSIM3lpdiblb = 0.0; - if (!model->BSIM3lpscbe1Given) - model->BSIM3lpscbe1 = 0.0; - if (!model->BSIM3lpscbe2Given) - model->BSIM3lpscbe2 = 0.0; - if (!model->BSIM3lpvagGiven) - model->BSIM3lpvag = 0.0; - if (!model->BSIM3lwrGiven) - model->BSIM3lwr = 0.0; - if (!model->BSIM3ldwgGiven) - model->BSIM3ldwg = 0.0; - if (!model->BSIM3ldwbGiven) - model->BSIM3ldwb = 0.0; - if (!model->BSIM3lb0Given) - model->BSIM3lb0 = 0.0; - if (!model->BSIM3lb1Given) - model->BSIM3lb1 = 0.0; - if (!model->BSIM3lalpha0Given) - model->BSIM3lalpha0 = 0.0; - if (!model->BSIM3lalpha1Given) - model->BSIM3lalpha1 = 0.0; - if (!model->BSIM3lbeta0Given) - model->BSIM3lbeta0 = 0.0; - if (!model->BSIM3lvfbGiven) - model->BSIM3lvfb = 0.0; - - if (!model->BSIM3lelmGiven) - model->BSIM3lelm = 0.0; - if (!model->BSIM3lcgslGiven) - model->BSIM3lcgsl = 0.0; - if (!model->BSIM3lcgdlGiven) - model->BSIM3lcgdl = 0.0; - if (!model->BSIM3lckappaGiven) - model->BSIM3lckappa = 0.0; - if (!model->BSIM3lclcGiven) - model->BSIM3lclc = 0.0; - if (!model->BSIM3lcleGiven) - model->BSIM3lcle = 0.0; - if (!model->BSIM3lcfGiven) - model->BSIM3lcf = 0.0; - if (!model->BSIM3lvfbcvGiven) - model->BSIM3lvfbcv = 0.0; - if (!model->BSIM3lacdeGiven) - model->BSIM3lacde = 0.0; - if (!model->BSIM3lmoinGiven) - model->BSIM3lmoin = 0.0; - if (!model->BSIM3lnoffGiven) - model->BSIM3lnoff = 0.0; - if (!model->BSIM3lvoffcvGiven) - model->BSIM3lvoffcv = 0.0; - - /* Width dependence */ - if (!model->BSIM3wcdscGiven) - model->BSIM3wcdsc = 0.0; - if (!model->BSIM3wcdscbGiven) - model->BSIM3wcdscb = 0.0; - if (!model->BSIM3wcdscdGiven) - model->BSIM3wcdscd = 0.0; - if (!model->BSIM3wcitGiven) - model->BSIM3wcit = 0.0; - if (!model->BSIM3wnfactorGiven) - model->BSIM3wnfactor = 0.0; - if (!model->BSIM3wxjGiven) - model->BSIM3wxj = 0.0; - if (!model->BSIM3wvsatGiven) - model->BSIM3wvsat = 0.0; - if (!model->BSIM3watGiven) - model->BSIM3wat = 0.0; - if (!model->BSIM3wa0Given) - model->BSIM3wa0 = 0.0; - if (!model->BSIM3wagsGiven) - model->BSIM3wags = 0.0; - if (!model->BSIM3wa1Given) - model->BSIM3wa1 = 0.0; - if (!model->BSIM3wa2Given) - model->BSIM3wa2 = 0.0; - if (!model->BSIM3wketaGiven) - model->BSIM3wketa = 0.0; - if (!model->BSIM3wnsubGiven) - model->BSIM3wnsub = 0.0; - if (!model->BSIM3wnpeakGiven) - model->BSIM3wnpeak = 0.0; - if (!model->BSIM3wngateGiven) - model->BSIM3wngate = 0.0; - if (!model->BSIM3wvbmGiven) - model->BSIM3wvbm = 0.0; - if (!model->BSIM3wxtGiven) - model->BSIM3wxt = 0.0; - if (!model->BSIM3wkt1Given) - model->BSIM3wkt1 = 0.0; - if (!model->BSIM3wkt1lGiven) - model->BSIM3wkt1l = 0.0; - if (!model->BSIM3wkt2Given) - model->BSIM3wkt2 = 0.0; - if (!model->BSIM3wk3Given) - model->BSIM3wk3 = 0.0; - if (!model->BSIM3wk3bGiven) - model->BSIM3wk3b = 0.0; - if (!model->BSIM3ww0Given) - model->BSIM3ww0 = 0.0; - if (!model->BSIM3wnlxGiven) - model->BSIM3wnlx = 0.0; - if (!model->BSIM3wdvt0Given) - model->BSIM3wdvt0 = 0.0; - if (!model->BSIM3wdvt1Given) - model->BSIM3wdvt1 = 0.0; - if (!model->BSIM3wdvt2Given) - model->BSIM3wdvt2 = 0.0; - if (!model->BSIM3wdvt0wGiven) - model->BSIM3wdvt0w = 0.0; - if (!model->BSIM3wdvt1wGiven) - model->BSIM3wdvt1w = 0.0; - if (!model->BSIM3wdvt2wGiven) - model->BSIM3wdvt2w = 0.0; - if (!model->BSIM3wdroutGiven) - model->BSIM3wdrout = 0.0; - if (!model->BSIM3wdsubGiven) - model->BSIM3wdsub = 0.0; - if (!model->BSIM3wvth0Given) - model->BSIM3wvth0 = 0.0; - if (!model->BSIM3wuaGiven) - model->BSIM3wua = 0.0; - if (!model->BSIM3wua1Given) - model->BSIM3wua1 = 0.0; - if (!model->BSIM3wubGiven) - model->BSIM3wub = 0.0; - if (!model->BSIM3wub1Given) - model->BSIM3wub1 = 0.0; - if (!model->BSIM3wucGiven) - model->BSIM3wuc = 0.0; - if (!model->BSIM3wuc1Given) - model->BSIM3wuc1 = 0.0; - if (!model->BSIM3wu0Given) - model->BSIM3wu0 = 0.0; - if (!model->BSIM3wuteGiven) - model->BSIM3wute = 0.0; - if (!model->BSIM3wvoffGiven) - model->BSIM3wvoff = 0.0; - if (!model->BSIM3wdeltaGiven) - model->BSIM3wdelta = 0.0; - if (!model->BSIM3wrdswGiven) - model->BSIM3wrdsw = 0.0; - if (!model->BSIM3wprwbGiven) - model->BSIM3wprwb = 0.0; - if (!model->BSIM3wprwgGiven) - model->BSIM3wprwg = 0.0; - if (!model->BSIM3wprtGiven) - model->BSIM3wprt = 0.0; - if (!model->BSIM3weta0Given) - model->BSIM3weta0 = 0.0; - if (!model->BSIM3wetabGiven) - model->BSIM3wetab = 0.0; - if (!model->BSIM3wpclmGiven) - model->BSIM3wpclm = 0.0; - if (!model->BSIM3wpdibl1Given) - model->BSIM3wpdibl1 = 0.0; - if (!model->BSIM3wpdibl2Given) - model->BSIM3wpdibl2 = 0.0; - if (!model->BSIM3wpdiblbGiven) - model->BSIM3wpdiblb = 0.0; - if (!model->BSIM3wpscbe1Given) - model->BSIM3wpscbe1 = 0.0; - if (!model->BSIM3wpscbe2Given) - model->BSIM3wpscbe2 = 0.0; - if (!model->BSIM3wpvagGiven) - model->BSIM3wpvag = 0.0; - if (!model->BSIM3wwrGiven) - model->BSIM3wwr = 0.0; - if (!model->BSIM3wdwgGiven) - model->BSIM3wdwg = 0.0; - if (!model->BSIM3wdwbGiven) - model->BSIM3wdwb = 0.0; - if (!model->BSIM3wb0Given) - model->BSIM3wb0 = 0.0; - if (!model->BSIM3wb1Given) - model->BSIM3wb1 = 0.0; - if (!model->BSIM3walpha0Given) - model->BSIM3walpha0 = 0.0; - if (!model->BSIM3walpha1Given) - model->BSIM3walpha1 = 0.0; - if (!model->BSIM3wbeta0Given) - model->BSIM3wbeta0 = 0.0; - if (!model->BSIM3wvfbGiven) - model->BSIM3wvfb = 0.0; - - if (!model->BSIM3welmGiven) - model->BSIM3welm = 0.0; - if (!model->BSIM3wcgslGiven) - model->BSIM3wcgsl = 0.0; - if (!model->BSIM3wcgdlGiven) - model->BSIM3wcgdl = 0.0; - if (!model->BSIM3wckappaGiven) - model->BSIM3wckappa = 0.0; - if (!model->BSIM3wcfGiven) - model->BSIM3wcf = 0.0; - if (!model->BSIM3wclcGiven) - model->BSIM3wclc = 0.0; - if (!model->BSIM3wcleGiven) - model->BSIM3wcle = 0.0; - if (!model->BSIM3wvfbcvGiven) - model->BSIM3wvfbcv = 0.0; - if (!model->BSIM3wacdeGiven) - model->BSIM3wacde = 0.0; - if (!model->BSIM3wmoinGiven) - model->BSIM3wmoin = 0.0; - if (!model->BSIM3wnoffGiven) - model->BSIM3wnoff = 0.0; - if (!model->BSIM3wvoffcvGiven) - model->BSIM3wvoffcv = 0.0; - - /* Cross-term dependence */ - if (!model->BSIM3pcdscGiven) - model->BSIM3pcdsc = 0.0; - if (!model->BSIM3pcdscbGiven) - model->BSIM3pcdscb = 0.0; - if (!model->BSIM3pcdscdGiven) - model->BSIM3pcdscd = 0.0; - if (!model->BSIM3pcitGiven) - model->BSIM3pcit = 0.0; - if (!model->BSIM3pnfactorGiven) - model->BSIM3pnfactor = 0.0; - if (!model->BSIM3pxjGiven) - model->BSIM3pxj = 0.0; - if (!model->BSIM3pvsatGiven) - model->BSIM3pvsat = 0.0; - if (!model->BSIM3patGiven) - model->BSIM3pat = 0.0; - if (!model->BSIM3pa0Given) - model->BSIM3pa0 = 0.0; - - if (!model->BSIM3pagsGiven) - model->BSIM3pags = 0.0; - if (!model->BSIM3pa1Given) - model->BSIM3pa1 = 0.0; - if (!model->BSIM3pa2Given) - model->BSIM3pa2 = 0.0; - if (!model->BSIM3pketaGiven) - model->BSIM3pketa = 0.0; - if (!model->BSIM3pnsubGiven) - model->BSIM3pnsub = 0.0; - if (!model->BSIM3pnpeakGiven) - model->BSIM3pnpeak = 0.0; - if (!model->BSIM3pngateGiven) - model->BSIM3pngate = 0.0; - if (!model->BSIM3pvbmGiven) - model->BSIM3pvbm = 0.0; - if (!model->BSIM3pxtGiven) - model->BSIM3pxt = 0.0; - if (!model->BSIM3pkt1Given) - model->BSIM3pkt1 = 0.0; - if (!model->BSIM3pkt1lGiven) - model->BSIM3pkt1l = 0.0; - if (!model->BSIM3pkt2Given) - model->BSIM3pkt2 = 0.0; - if (!model->BSIM3pk3Given) - model->BSIM3pk3 = 0.0; - if (!model->BSIM3pk3bGiven) - model->BSIM3pk3b = 0.0; - if (!model->BSIM3pw0Given) - model->BSIM3pw0 = 0.0; - if (!model->BSIM3pnlxGiven) - model->BSIM3pnlx = 0.0; - if (!model->BSIM3pdvt0Given) - model->BSIM3pdvt0 = 0.0; - if (!model->BSIM3pdvt1Given) - model->BSIM3pdvt1 = 0.0; - if (!model->BSIM3pdvt2Given) - model->BSIM3pdvt2 = 0.0; - if (!model->BSIM3pdvt0wGiven) - model->BSIM3pdvt0w = 0.0; - if (!model->BSIM3pdvt1wGiven) - model->BSIM3pdvt1w = 0.0; - if (!model->BSIM3pdvt2wGiven) - model->BSIM3pdvt2w = 0.0; - if (!model->BSIM3pdroutGiven) - model->BSIM3pdrout = 0.0; - if (!model->BSIM3pdsubGiven) - model->BSIM3pdsub = 0.0; - if (!model->BSIM3pvth0Given) - model->BSIM3pvth0 = 0.0; - if (!model->BSIM3puaGiven) - model->BSIM3pua = 0.0; - if (!model->BSIM3pua1Given) - model->BSIM3pua1 = 0.0; - if (!model->BSIM3pubGiven) - model->BSIM3pub = 0.0; - if (!model->BSIM3pub1Given) - model->BSIM3pub1 = 0.0; - if (!model->BSIM3pucGiven) - model->BSIM3puc = 0.0; - if (!model->BSIM3puc1Given) - model->BSIM3puc1 = 0.0; - if (!model->BSIM3pu0Given) - model->BSIM3pu0 = 0.0; - if (!model->BSIM3puteGiven) - model->BSIM3pute = 0.0; - if (!model->BSIM3pvoffGiven) - model->BSIM3pvoff = 0.0; - if (!model->BSIM3pdeltaGiven) - model->BSIM3pdelta = 0.0; - if (!model->BSIM3prdswGiven) - model->BSIM3prdsw = 0.0; - if (!model->BSIM3pprwbGiven) - model->BSIM3pprwb = 0.0; - if (!model->BSIM3pprwgGiven) - model->BSIM3pprwg = 0.0; - if (!model->BSIM3pprtGiven) - model->BSIM3pprt = 0.0; - if (!model->BSIM3peta0Given) - model->BSIM3peta0 = 0.0; - if (!model->BSIM3petabGiven) - model->BSIM3petab = 0.0; - if (!model->BSIM3ppclmGiven) - model->BSIM3ppclm = 0.0; - if (!model->BSIM3ppdibl1Given) - model->BSIM3ppdibl1 = 0.0; - if (!model->BSIM3ppdibl2Given) - model->BSIM3ppdibl2 = 0.0; - if (!model->BSIM3ppdiblbGiven) - model->BSIM3ppdiblb = 0.0; - if (!model->BSIM3ppscbe1Given) - model->BSIM3ppscbe1 = 0.0; - if (!model->BSIM3ppscbe2Given) - model->BSIM3ppscbe2 = 0.0; - if (!model->BSIM3ppvagGiven) - model->BSIM3ppvag = 0.0; - if (!model->BSIM3pwrGiven) - model->BSIM3pwr = 0.0; - if (!model->BSIM3pdwgGiven) - model->BSIM3pdwg = 0.0; - if (!model->BSIM3pdwbGiven) - model->BSIM3pdwb = 0.0; - if (!model->BSIM3pb0Given) - model->BSIM3pb0 = 0.0; - if (!model->BSIM3pb1Given) - model->BSIM3pb1 = 0.0; - if (!model->BSIM3palpha0Given) - model->BSIM3palpha0 = 0.0; - if (!model->BSIM3palpha1Given) - model->BSIM3palpha1 = 0.0; - if (!model->BSIM3pbeta0Given) - model->BSIM3pbeta0 = 0.0; - if (!model->BSIM3pvfbGiven) - model->BSIM3pvfb = 0.0; - - if (!model->BSIM3pelmGiven) - model->BSIM3pelm = 0.0; - if (!model->BSIM3pcgslGiven) - model->BSIM3pcgsl = 0.0; - if (!model->BSIM3pcgdlGiven) - model->BSIM3pcgdl = 0.0; - if (!model->BSIM3pckappaGiven) - model->BSIM3pckappa = 0.0; - if (!model->BSIM3pcfGiven) - model->BSIM3pcf = 0.0; - if (!model->BSIM3pclcGiven) - model->BSIM3pclc = 0.0; - if (!model->BSIM3pcleGiven) - model->BSIM3pcle = 0.0; - if (!model->BSIM3pvfbcvGiven) - model->BSIM3pvfbcv = 0.0; - if (!model->BSIM3pacdeGiven) - model->BSIM3pacde = 0.0; - if (!model->BSIM3pmoinGiven) - model->BSIM3pmoin = 0.0; - if (!model->BSIM3pnoffGiven) - model->BSIM3pnoff = 0.0; - if (!model->BSIM3pvoffcvGiven) - model->BSIM3pvoffcv = 0.0; - - /* unit degree celcius */ - if (!model->BSIM3tnomGiven) - model->BSIM3tnom = ckt->CKTnomTemp; -/* else - model->BSIM3tnom = model->BSIM3tnom + 273.15; we make this transform in b3mpar.c in the first run */ - if (!model->BSIM3lintnoiGiven) - model->BSIM3lintnoi = 0.0; /* unit m */ - if (!model->BSIM3LintGiven) - model->BSIM3Lint = 0.0; - if (!model->BSIM3LlGiven) - model->BSIM3Ll = 0.0; - if (!model->BSIM3LlcGiven) - model->BSIM3Llc = model->BSIM3Ll; - if (!model->BSIM3LlnGiven) - model->BSIM3Lln = 1.0; - if (!model->BSIM3LwGiven) - model->BSIM3Lw = 0.0; - if (!model->BSIM3LwcGiven) - model->BSIM3Lwc = model->BSIM3Lw; - if (!model->BSIM3LwnGiven) - model->BSIM3Lwn = 1.0; - if (!model->BSIM3LwlGiven) - model->BSIM3Lwl = 0.0; - if (!model->BSIM3LwlcGiven) - model->BSIM3Lwlc = model->BSIM3Lwl; - if (!model->BSIM3LminGiven) - model->BSIM3Lmin = 0.0; - if (!model->BSIM3LmaxGiven) - model->BSIM3Lmax = 1.0; - if (!model->BSIM3WintGiven) - model->BSIM3Wint = 0.0; - if (!model->BSIM3WlGiven) - model->BSIM3Wl = 0.0; - if (!model->BSIM3WlcGiven) - model->BSIM3Wlc = model->BSIM3Wl; - if (!model->BSIM3WlnGiven) - model->BSIM3Wln = 1.0; - if (!model->BSIM3WwGiven) - model->BSIM3Ww = 0.0; - if (!model->BSIM3WwcGiven) - model->BSIM3Wwc = model->BSIM3Ww; - if (!model->BSIM3WwnGiven) - model->BSIM3Wwn = 1.0; - if (!model->BSIM3WwlGiven) - model->BSIM3Wwl = 0.0; - if (!model->BSIM3WwlcGiven) - model->BSIM3Wwlc = model->BSIM3Wwl; - if (!model->BSIM3WminGiven) - model->BSIM3Wmin = 0.0; - if (!model->BSIM3WmaxGiven) - model->BSIM3Wmax = 1.0; - if (!model->BSIM3dwcGiven) - model->BSIM3dwc = model->BSIM3Wint; - if (!model->BSIM3dlcGiven) - model->BSIM3dlc = model->BSIM3Lint; - - if (!model->BSIM3xlGiven) - model->BSIM3xl = 0.0; - if (!model->BSIM3xwGiven) - model->BSIM3xw = 0.0; - - if (!model->BSIM3cfGiven) - model->BSIM3cf = 2.0 * EPSOX / PI - * log(1.0 + 0.4e-6 / model->BSIM3tox); - if (!model->BSIM3cgdoGiven) - { if (model->BSIM3dlcGiven && (model->BSIM3dlc > 0.0)) - { model->BSIM3cgdo = model->BSIM3dlc * model->BSIM3cox - - model->BSIM3cgdl ; - } - else - model->BSIM3cgdo = 0.6 * model->BSIM3xj * model->BSIM3cox; - } - if (!model->BSIM3cgsoGiven) - { if (model->BSIM3dlcGiven && (model->BSIM3dlc > 0.0)) - { model->BSIM3cgso = model->BSIM3dlc * model->BSIM3cox - - model->BSIM3cgsl ; - } - else - model->BSIM3cgso = 0.6 * model->BSIM3xj * model->BSIM3cox; - } - - if (!model->BSIM3cgboGiven) - { model->BSIM3cgbo = 2.0 * model->BSIM3dwc * model->BSIM3cox; - } - if (!model->BSIM3xpartGiven) - model->BSIM3xpart = 0.0; - if (!model->BSIM3sheetResistanceGiven) - model->BSIM3sheetResistance = 0.0; - if (!model->BSIM3unitAreaJctCapGiven) - model->BSIM3unitAreaJctCap = 5.0E-4; - if (!model->BSIM3unitLengthSidewallJctCapGiven) - model->BSIM3unitLengthSidewallJctCap = 5.0E-10; - if (!model->BSIM3unitLengthGateSidewallJctCapGiven) - model->BSIM3unitLengthGateSidewallJctCap = model->BSIM3unitLengthSidewallJctCap ; - if (!model->BSIM3jctSatCurDensityGiven) - model->BSIM3jctSatCurDensity = 1.0E-4; - if (!model->BSIM3jctSidewallSatCurDensityGiven) - model->BSIM3jctSidewallSatCurDensity = 0.0; - if (!model->BSIM3bulkJctPotentialGiven) - model->BSIM3bulkJctPotential = 1.0; - if (!model->BSIM3sidewallJctPotentialGiven) - model->BSIM3sidewallJctPotential = 1.0; - if (!model->BSIM3GatesidewallJctPotentialGiven) - model->BSIM3GatesidewallJctPotential = model->BSIM3sidewallJctPotential; - if (!model->BSIM3bulkJctBotGradingCoeffGiven) - model->BSIM3bulkJctBotGradingCoeff = 0.5; - if (!model->BSIM3bulkJctSideGradingCoeffGiven) - model->BSIM3bulkJctSideGradingCoeff = 0.33; - if (!model->BSIM3bulkJctGateSideGradingCoeffGiven) - model->BSIM3bulkJctGateSideGradingCoeff = model->BSIM3bulkJctSideGradingCoeff; - if (!model->BSIM3jctEmissionCoeffGiven) - model->BSIM3jctEmissionCoeff = 1.0; - if (!model->BSIM3jctTempExponentGiven) - model->BSIM3jctTempExponent = 3.0; - if (!model->BSIM3oxideTrapDensityAGiven) - { if (model->BSIM3type == NMOS) - model->BSIM3oxideTrapDensityA = 1e20; - else - model->BSIM3oxideTrapDensityA=9.9e18; - } - if (!model->BSIM3oxideTrapDensityBGiven) - { if (model->BSIM3type == NMOS) - model->BSIM3oxideTrapDensityB = 5e4; - else - model->BSIM3oxideTrapDensityB = 2.4e3; - } - if (!model->BSIM3oxideTrapDensityCGiven) - { if (model->BSIM3type == NMOS) - model->BSIM3oxideTrapDensityC = -1.4e-12; - else - model->BSIM3oxideTrapDensityC = 1.4e-12; - - } - if (!model->BSIM3emGiven) - model->BSIM3em = 4.1e7; /* V/m */ - if (!model->BSIM3efGiven) - model->BSIM3ef = 1.0; - if (!model->BSIM3afGiven) - model->BSIM3af = 1.0; - if (!model->BSIM3kfGiven) - model->BSIM3kf = 0.0; - - if (!model->BSIM3vgsMaxGiven) - model->BSIM3vgsMax = 1e99; - if (!model->BSIM3vgdMaxGiven) - model->BSIM3vgdMax = 1e99; - if (!model->BSIM3vgbMaxGiven) - model->BSIM3vgbMax = 1e99; - if (!model->BSIM3vdsMaxGiven) - model->BSIM3vdsMax = 1e99; - if (!model->BSIM3vbsMaxGiven) - model->BSIM3vbsMax = 1e99; - if (!model->BSIM3vbdMaxGiven) - model->BSIM3vbdMax = 1e99; - if (!model->BSIM3vgsrMaxGiven) - model->BSIM3vgsrMax = 1e99; - if (!model->BSIM3vgdrMaxGiven) - model->BSIM3vgdrMax = 1e99; - if (!model->BSIM3vgbrMaxGiven) - model->BSIM3vgbrMax = 1e99; - if (!model->BSIM3vbsrMaxGiven) - model->BSIM3vbsrMax = 1e99; - if (!model->BSIM3vbdrMaxGiven) - model->BSIM3vbdrMax = 1e99; - - /* loop through all the instances of the model */ - for (here = BSIM3instances(model); here != NULL ; - here=BSIM3nextInstance(here)) - { - /* allocate a chunk of the state vector */ - here->BSIM3states = *states; - *states += BSIM3numStates; - - /* perform the parameter defaulting */ - if (!here->BSIM3drainAreaGiven) - here->BSIM3drainArea = 0.0; - if (!here->BSIM3drainPerimeterGiven) - here->BSIM3drainPerimeter = 0.0; - if (!here->BSIM3drainSquaresGiven) - { - if (model->BSIM3acmMod == 0) - here->BSIM3drainSquares = 1.0; - else - here->BSIM3drainSquares = 0.0; - } - if (!here->BSIM3delvtoGiven) - here->BSIM3delvto = 0.0; - if (!here->BSIM3mulu0Given) - here->BSIM3mulu0 = 1.0; - if (!here->BSIM3icVBSGiven) - here->BSIM3icVBS = 0.0; - if (!here->BSIM3icVDSGiven) - here->BSIM3icVDS = 0.0; - if (!here->BSIM3icVGSGiven) - here->BSIM3icVGS = 0.0; - if (!here->BSIM3lGiven) - here->BSIM3l = 5.0e-6; - if (!here->BSIM3sourceAreaGiven) - here->BSIM3sourceArea = 0.0; - if (!here->BSIM3sourcePerimeterGiven) - here->BSIM3sourcePerimeter = 0.0; - if (!here->BSIM3sourceSquaresGiven) - { - if (model->BSIM3acmMod == 0) - here->BSIM3sourceSquares = 1.0; - else - here->BSIM3sourceSquares = 0.0; - } - if (!here->BSIM3wGiven) - here->BSIM3w = 5.0e-6; - if (!here->BSIM3nqsModGiven) - here->BSIM3nqsMod = model->BSIM3nqsMod; - else if ((here->BSIM3nqsMod != 0) && (here->BSIM3nqsMod != 1)) - { here->BSIM3nqsMod = model->BSIM3nqsMod; - printf("Warning: nqsMod has been set to its global value %d.\n", - model->BSIM3nqsMod); - } - if (!here->BSIM3acnqsModGiven) - here->BSIM3acnqsMod = model->BSIM3acnqsMod; - else if ((here->BSIM3acnqsMod != 0) && (here->BSIM3acnqsMod != 1)) - { here->BSIM3acnqsMod = model->BSIM3acnqsMod; - printf("Warning: acnqsMod has been set to its global value %d.\n", - model->BSIM3acnqsMod); - } - - if (!here->BSIM3geoGiven) - here->BSIM3geo = 0; - - if (!here->BSIM3mGiven) - here->BSIM3m = 1; - - /* process source/drain series resistance */ - /* ACM model */ - - double drainResistance, sourceResistance; - - if (model->BSIM3acmMod == 0) - { - drainResistance = model->BSIM3sheetResistance - * here->BSIM3drainSquares; - sourceResistance = model->BSIM3sheetResistance - * here->BSIM3sourceSquares; - } - else /* ACM > 0 */ - { - error = ACM_SourceDrainResistances( - model->BSIM3acmMod, - model->BSIM3ld, - model->BSIM3ldif, - model->BSIM3hdif, - model->BSIM3wmlt, - here->BSIM3w, - model->BSIM3xw, - model->BSIM3sheetResistance, - here->BSIM3drainSquaresGiven, - model->BSIM3rd, - model->BSIM3rdc, - here->BSIM3drainSquares, - here->BSIM3sourceSquaresGiven, - model->BSIM3rs, - model->BSIM3rsc, - here->BSIM3sourceSquares, - &drainResistance, - &sourceResistance - ); - if (error) - return(error); - } - - /* process drain series resistance */ - if (drainResistance != 0.0) - { - if(here->BSIM3dNodePrime == 0) { - error = CKTmkVolt(ckt,&tmp,here->BSIM3name,"drain"); - if(error) return(error); - here->BSIM3dNodePrime = tmp->number; - if (ckt->CKTcopyNodesets) { - if (CKTinst2Node(ckt,here,1,&tmpNode,&tmpName)==OK) { - if (tmpNode->nsGiven) { - tmp->nodeset=tmpNode->nodeset; - tmp->nsGiven=tmpNode->nsGiven; - } - } - } - } - } - else - { here->BSIM3dNodePrime = here->BSIM3dNode; - } - - /* process source series resistance */ - if (sourceResistance != 0.0) - { - if(here->BSIM3sNodePrime == 0) { - error = CKTmkVolt(ckt,&tmp,here->BSIM3name,"source"); - if(error) return(error); - here->BSIM3sNodePrime = tmp->number; - if (ckt->CKTcopyNodesets) { - if (CKTinst2Node(ckt,here,3,&tmpNode,&tmpName)==OK) { - if (tmpNode->nsGiven) { - tmp->nodeset=tmpNode->nodeset; - tmp->nsGiven=tmpNode->nsGiven; - } - } - } - } - } - else - { here->BSIM3sNodePrime = here->BSIM3sNode; - } - - /* internal charge node */ - - if (here->BSIM3nqsMod) - { if (here->BSIM3qNode == 0) - { error = CKTmkVolt(ckt,&tmp,here->BSIM3name,"charge"); - if(error) return(error); - here->BSIM3qNode = tmp->number; - } - } - else - { here->BSIM3qNode = 0; - } - - /* set Sparse Matrix Pointers */ - - -/* macro to make elements with built in test for out of memory */ -#define TSTALLOC(ptr,first,second) \ -do { if((here->ptr = SMPmakeElt(matrix, here->first, here->second)) == NULL){\ - return(E_NOMEM);\ -} } while(0) - - TSTALLOC(BSIM3DdPtr, BSIM3dNode, BSIM3dNode); - TSTALLOC(BSIM3GgPtr, BSIM3gNode, BSIM3gNode); - TSTALLOC(BSIM3SsPtr, BSIM3sNode, BSIM3sNode); - TSTALLOC(BSIM3BbPtr, BSIM3bNode, BSIM3bNode); - TSTALLOC(BSIM3DPdpPtr, BSIM3dNodePrime, BSIM3dNodePrime); - TSTALLOC(BSIM3SPspPtr, BSIM3sNodePrime, BSIM3sNodePrime); - TSTALLOC(BSIM3DdpPtr, BSIM3dNode, BSIM3dNodePrime); - TSTALLOC(BSIM3GbPtr, BSIM3gNode, BSIM3bNode); - TSTALLOC(BSIM3GdpPtr, BSIM3gNode, BSIM3dNodePrime); - TSTALLOC(BSIM3GspPtr, BSIM3gNode, BSIM3sNodePrime); - TSTALLOC(BSIM3SspPtr, BSIM3sNode, BSIM3sNodePrime); - TSTALLOC(BSIM3BdpPtr, BSIM3bNode, BSIM3dNodePrime); - TSTALLOC(BSIM3BspPtr, BSIM3bNode, BSIM3sNodePrime); - TSTALLOC(BSIM3DPspPtr, BSIM3dNodePrime, BSIM3sNodePrime); - TSTALLOC(BSIM3DPdPtr, BSIM3dNodePrime, BSIM3dNode); - TSTALLOC(BSIM3BgPtr, BSIM3bNode, BSIM3gNode); - TSTALLOC(BSIM3DPgPtr, BSIM3dNodePrime, BSIM3gNode); - TSTALLOC(BSIM3SPgPtr, BSIM3sNodePrime, BSIM3gNode); - TSTALLOC(BSIM3SPsPtr, BSIM3sNodePrime, BSIM3sNode); - TSTALLOC(BSIM3DPbPtr, BSIM3dNodePrime, BSIM3bNode); - TSTALLOC(BSIM3SPbPtr, BSIM3sNodePrime, BSIM3bNode); - TSTALLOC(BSIM3SPdpPtr, BSIM3sNodePrime, BSIM3dNodePrime); - - TSTALLOC(BSIM3QqPtr, BSIM3qNode, BSIM3qNode); - - TSTALLOC(BSIM3QdpPtr, BSIM3qNode, BSIM3dNodePrime); - TSTALLOC(BSIM3QspPtr, BSIM3qNode, BSIM3sNodePrime); - TSTALLOC(BSIM3QgPtr, BSIM3qNode, BSIM3gNode); - TSTALLOC(BSIM3QbPtr, BSIM3qNode, BSIM3bNode); - TSTALLOC(BSIM3DPqPtr, BSIM3dNodePrime, BSIM3qNode); - TSTALLOC(BSIM3SPqPtr, BSIM3sNodePrime, BSIM3qNode); - TSTALLOC(BSIM3GqPtr, BSIM3gNode, BSIM3qNode); - TSTALLOC(BSIM3BqPtr, BSIM3bNode, BSIM3qNode); - - } - } -#ifdef USE_OMP - InstCount = 0; - model = (BSIM3model*)inModel; - /* loop through all the BSIM3 device models - to count the number of instances */ - - for( ; model != NULL; model = BSIM3nextModel(model)) - { - /* loop through all the instances of the model */ - for (here = BSIM3instances(model); here != NULL ; - here=BSIM3nextInstance(here)) - { - InstCount++; - } - model->BSIM3InstCount = 0; - model->BSIM3InstanceArray = NULL; - } - InstArray = TMALLOC(BSIM3instance*, InstCount); - model = (BSIM3model*)inModel; - /* store this in the first model only */ - model->BSIM3InstCount = InstCount; - model->BSIM3InstanceArray = InstArray; - idx = 0; - for( ; model != NULL; model = BSIM3nextModel(model)) - { - /* loop through all the instances of the model */ - for (here = BSIM3instances(model); here != NULL ; - here=BSIM3nextInstance(here)) - { - InstArray[idx] = here; - idx++; - } - } - -#endif - return(OK); -} - -int -BSIM3unsetup( - GENmodel *inModel, - CKTcircuit *ckt) -{ - BSIM3model *model; - BSIM3instance *here; - -#ifdef USE_OMP - model = (BSIM3model*)inModel; - tfree(model->BSIM3InstanceArray); -#endif - - for (model = (BSIM3model *)inModel; model != NULL; - model = BSIM3nextModel(model)) - { - for (here = BSIM3instances(model); here != NULL; - here=BSIM3nextInstance(here)) - { - if (here->BSIM3qNode > 0) - CKTdltNNum(ckt, here->BSIM3qNode); - here->BSIM3qNode = 0; - - if (here->BSIM3sNodePrime > 0 - && here->BSIM3sNodePrime != here->BSIM3sNode) - CKTdltNNum(ckt, here->BSIM3sNodePrime); - here->BSIM3sNodePrime = 0; - - if (here->BSIM3dNodePrime > 0 - && here->BSIM3dNodePrime != here->BSIM3dNode) - CKTdltNNum(ckt, here->BSIM3dNodePrime); - here->BSIM3dNodePrime = 0; - } - } - return OK; -} - - - - - - diff --git a/src/spicelib/devices/bsim3/b3soachk.c b/src/spicelib/devices/bsim3/b3soachk.c deleted file mode 100644 index 324715b7d..000000000 --- a/src/spicelib/devices/bsim3/b3soachk.c +++ /dev/null @@ -1,341 +0,0 @@ -/********** -Copyright 2013 Dietmar Warning. All rights reserved. -Author: 2013 Dietmar Warning -**********/ - -#include "ngspice/ngspice.h" -#include "ngspice/cktdefs.h" -#include "bsim3def.h" -#include "ngspice/trandefs.h" -#include "ngspice/sperror.h" -#include "ngspice/suffix.h" -#include "ngspice/cpdefs.h" - - -int -BSIM3soaCheck(CKTcircuit *ckt, GENmodel *inModel) -{ - BSIM3model *model = (BSIM3model *) inModel; - BSIM3instance *here; - double vgs, vgd, vgb, vds, vbs, vbd; /* actual mos voltages */ - int maxwarns; - static int warns_vgs = 0, warns_vgd = 0, warns_vgb = 0, warns_vds = 0, warns_vbs = 0, warns_vbd = 0; - - if (!ckt) { - warns_vgs = 0; - warns_vgd = 0; - warns_vgb = 0; - warns_vds = 0; - warns_vbs = 0; - warns_vbd = 0; - return OK; - } - - maxwarns = ckt->CKTsoaMaxWarns; - - for (; model; model = BSIM3nextModel(model)) { - - for (here = BSIM3instances(model); here; here = BSIM3nextInstance(here)) { - - vgs = ckt->CKTrhsOld [here->BSIM3gNode] - - ckt->CKTrhsOld [here->BSIM3sNodePrime]; - - vgd = ckt->CKTrhsOld [here->BSIM3gNode] - - ckt->CKTrhsOld [here->BSIM3dNodePrime]; - - vgb = ckt->CKTrhsOld [here->BSIM3gNode] - - ckt->CKTrhsOld [here->BSIM3bNode]; - - vds = ckt->CKTrhsOld [here->BSIM3dNodePrime] - - ckt->CKTrhsOld [here->BSIM3sNodePrime]; - - vbs = ckt->CKTrhsOld [here->BSIM3bNode] - - ckt->CKTrhsOld [here->BSIM3sNodePrime]; - - vbd = ckt->CKTrhsOld [here->BSIM3bNode] - - ckt->CKTrhsOld [here->BSIM3dNodePrime]; - - if (!model->BSIM3vgsrMaxGiven) { - if (fabs(vgs) > model->BSIM3vgsMax) - if (warns_vgs < maxwarns) { - soa_printf(ckt, (GENinstance*) here, - "Vgs=%g has exceeded Vgs_max=%g\n", - vgs, model->BSIM3vgsMax); - warns_vgs++; - } - if (!model->BSIM3vgbMaxGiven) { - if (fabs(vgb) > model->BSIM3vgsMax) - if (warns_vgb < maxwarns) { - soa_printf(ckt, (GENinstance*) here, - "Vgb=%g has exceeded Vgs_max=%g\n", - vgb, model->BSIM3vgsMax); - warns_vgb++; - } - } else { - if (fabs(vgb) > model->BSIM3vgbMax) - if (warns_vgb < maxwarns) { - soa_printf(ckt, (GENinstance*) here, - "Vgb=%g has exceeded Vgb_max=%g\n", - vgb, model->BSIM3vgbMax); - warns_vgb++; - } - } - } else { - if (model->BSIM3type > 0) { - if (vgs > model->BSIM3vgsMax) - if (warns_vgs < maxwarns) { - soa_printf(ckt, (GENinstance*) here, - "Vgs=%g has exceeded Vgs_max=%g\n", - vgs, model->BSIM3vgsMax); - warns_vgs++; - } - if (-1*vgs > model->BSIM3vgsrMax) - if (warns_vgs < maxwarns) { - soa_printf(ckt, (GENinstance*) here, - "Vgs=%g has exceeded Vgsr_max=%g\n", - vgs, model->BSIM3vgsrMax); - warns_vgs++; - } - } else { - if (vgs > model->BSIM3vgsrMax) - if (warns_vgs < maxwarns) { - soa_printf(ckt, (GENinstance*) here, - "Vgs=%g has exceeded Vgsr_max=%g\n", - vgs, model->BSIM3vgsrMax); - warns_vgs++; - } - if (-1*vgs > model->BSIM3vgsMax) - if (warns_vgs < maxwarns) { - soa_printf(ckt, (GENinstance*) here, - "Vgs=%g has exceeded Vgs_max=%g\n", - vgs, model->BSIM3vgsMax); - warns_vgs++; - } - } - } - - if (!model->BSIM3vgdrMaxGiven) { - if (fabs(vgd) > model->BSIM3vgdMax) - if (warns_vgd < maxwarns) { - soa_printf(ckt, (GENinstance*) here, - "Vgd=%g has exceeded Vgd_max=%g\n", - vgd, model->BSIM3vgdMax); - warns_vgd++; - } - } else { - if (model->BSIM3type > 0) { - if (vgd > model->BSIM3vgdMax) - if (warns_vgd < maxwarns) { - soa_printf(ckt, (GENinstance*) here, - "Vgd=%g has exceeded Vgd_max=%g\n", - vgd, model->BSIM3vgdMax); - warns_vgd++; - } - if (-1*vgd > model->BSIM3vgdrMax) - if (warns_vgd < maxwarns) { - soa_printf(ckt, (GENinstance*) here, - "Vgd=%g has exceeded Vgdr_max=%g\n", - vgd, model->BSIM3vgdrMax); - warns_vgd++; - } - } else { - if (vgd > model->BSIM3vgdrMax) - if (warns_vgd < maxwarns) { - soa_printf(ckt, (GENinstance*) here, - "Vgd=%g has exceeded Vgdr_max=%g\n", - vgd, model->BSIM3vgdrMax); - warns_vgd++; - } - if (-1*vgd > model->BSIM3vgdMax) - if (warns_vgd < maxwarns) { - soa_printf(ckt, (GENinstance*) here, - "Vgd=%g has exceeded Vgd_max=%g\n", - vgd, model->BSIM3vgdMax); - warns_vgd++; - } - } - } - - if (fabs(vds) > model->BSIM3vdsMax) - if (warns_vds < maxwarns) { - soa_printf(ckt, (GENinstance*) here, - "Vds=%g has exceeded Vds_max=%g\n", - vds, model->BSIM3vdsMax); - warns_vds++; - } - - if (!model->BSIM3vgbrMaxGiven) { - if (fabs(vgb) > model->BSIM3vgbMax) - if (warns_vgb < maxwarns) { - soa_printf(ckt, (GENinstance*) here, - "Vgb=%g has exceeded Vgb_max=%g\n", - vgb, model->BSIM3vgbMax); - warns_vgb++; - } - } else { - if (model->BSIM3type > 0) { - if (vgb > model->BSIM3vgbMax) - if (warns_vgb < maxwarns) { - soa_printf(ckt, (GENinstance*) here, - "Vgb=%g has exceeded Vgb_max=%g\n", - vgb, model->BSIM3vgbMax); - warns_vgb++; - } - if (-1*vgb > model->BSIM3vgbrMax) - if (warns_vgb < maxwarns) { - soa_printf(ckt, (GENinstance*) here, - "Vgb=%g has exceeded Vgbr_max=%g\n", - vgb, model->BSIM3vgbrMax); - warns_vgb++; - } - } else { - if (vgb > model->BSIM3vgbrMax) - if (warns_vgb < maxwarns) { - soa_printf(ckt, (GENinstance*) here, - "Vgb=%g has exceeded Vgbr_max=%g\n", - vgb, model->BSIM3vgbrMax); - warns_vgb++; - } - if (-1*vgb > model->BSIM3vgbMax) - if (warns_vgb < maxwarns) { - soa_printf(ckt, (GENinstance*) here, - "Vgb=%g has exceeded Vgb_max=%g\n", - vgb, model->BSIM3vgbMax); - warns_vgb++; - } - } - } - - if (!model->BSIM3vbsrMaxGiven) { - if (!model->BSIM3vbsMaxGiven) { - if (fabs(vbs) > model->BSIM3vbdMax) - if (warns_vbs < maxwarns) { - soa_printf(ckt, (GENinstance*) here, - "Vbs=%g has exceeded Vbd_max=%g\n", - vbs, model->BSIM3vbdMax); - warns_vbs++; - } - } else { - if (fabs(vbs) > model->BSIM3vbsMax) - if (warns_vbs < maxwarns) { - soa_printf(ckt, (GENinstance*) here, - "Vbs=%g has exceeded Vbs_max=%g\n", - vbs, model->BSIM3vbsMax); - warns_vbs++; - } - } - } else { - if (!model->BSIM3vbsMaxGiven) { - if (model->BSIM3type > 0) { - if (vbs > model->BSIM3vbdMax) - if (warns_vbs < maxwarns) { - soa_printf(ckt, (GENinstance*) here, - "Vbs=%g has exceeded Vbd_max=%g\n", - vbs, model->BSIM3vbdMax); - warns_vbs++; - } - if (-1*vbs > model->BSIM3vbsrMax) - if (warns_vbs < maxwarns) { - soa_printf(ckt, (GENinstance*) here, - "Vbs=%g has exceeded Vbsr_max=%g\n", - vbs, model->BSIM3vbsrMax); - warns_vbs++; - } - } else { - if (vbs > model->BSIM3vbsrMax) - if (warns_vbs < maxwarns) { - soa_printf(ckt, (GENinstance*) here, - "Vbs=%g has exceeded Vbsr_max=%g\n", - vbs, model->BSIM3vbsrMax); - warns_vbs++; - } - if (-1*vbs > model->BSIM3vbdMax) - if (warns_vbs < maxwarns) { - soa_printf(ckt, (GENinstance*) here, - "Vbs=%g has exceeded Vbd_max=%g\n", - vbs, model->BSIM3vbdMax); - warns_vbs++; - } - } - } else { - if (model->BSIM3type > 0) { - if (vbs > model->BSIM3vbsMax) - if (warns_vbs < maxwarns) { - soa_printf(ckt, (GENinstance*) here, - "Vbs=%g has exceeded Vbs_max=%g\n", - vbs, model->BSIM3vbsMax); - warns_vbs++; - } - if (-1*vbs > model->BSIM3vbsrMax) - if (warns_vbs < maxwarns) { - soa_printf(ckt, (GENinstance*) here, - "Vbs=%g has exceeded Vbsr_max=%g\n", - vbs, model->BSIM3vbsrMax); - warns_vbs++; - } - } else { - if (vbs > model->BSIM3vbsrMax) - if (warns_vbs < maxwarns) { - soa_printf(ckt, (GENinstance*) here, - "Vbs=%g has exceeded Vbsr_max=%g\n", - vbs, model->BSIM3vbsrMax); - warns_vbs++; - } - if (-1*vbs > model->BSIM3vbsMax) - if (warns_vbs < maxwarns) { - soa_printf(ckt, (GENinstance*) here, - "Vbs=%g has exceeded Vbs_max=%g\n", - vbs, model->BSIM3vbsMax); - warns_vbs++; - } - } - } - } - - if (!model->BSIM3vbdrMaxGiven) { - if (fabs(vbd) > model->BSIM3vbdMax) - if (warns_vbd < maxwarns) { - soa_printf(ckt, (GENinstance*) here, - "Vbd=%g has exceeded Vbd_max=%g\n", - vbd, model->BSIM3vbdMax); - warns_vbd++; - } - } else { - if (model->BSIM3type > 0) { - if (vbd > model->BSIM3vbdMax) - if (warns_vbd < maxwarns) { - soa_printf(ckt, (GENinstance*) here, - "Vbd=%g has exceeded Vbd_max=%g\n", - vbd, model->BSIM3vbdMax); - warns_vbd++; - } - if (-1*vbd > model->BSIM3vbdrMax) - if (warns_vbd < maxwarns) { - soa_printf(ckt, (GENinstance*) here, - "Vbd=%g has exceeded Vbdr_max=%g\n", - vbd, model->BSIM3vbdrMax); - warns_vbd++; - } - } else { - if (vbd > model->BSIM3vbdrMax) - if (warns_vbd < maxwarns) { - soa_printf(ckt, (GENinstance*) here, - "Vbd=%g has exceeded Vbdr_max=%g\n", - vbd, model->BSIM3vbdrMax); - warns_vbd++; - } - if (-1*vbd > model->BSIM3vbdMax) - if (warns_vbd < maxwarns) { - soa_printf(ckt, (GENinstance*) here, - "Vbd=%g has exceeded Vbd_max=%g\n", - vbd, model->BSIM3vbdMax); - warns_vbd++; - } - } - } - - } - } - - return OK; -} diff --git a/src/spicelib/devices/bsim3/b3temp.c b/src/spicelib/devices/bsim3/b3temp.c deleted file mode 100644 index d8166e0eb..000000000 --- a/src/spicelib/devices/bsim3/b3temp.c +++ /dev/null @@ -1,894 +0,0 @@ -/**** BSIM3v3.3.0, Released by Xuemei Xi 07/29/2005 ****/ - -/********** - * Copyright 2004 Regents of the University of California. All rights reserved. - * File: b3temp.c of BSIM3v3.3.0 - * Author: 1995 Min-Chie Jeng and Mansun Chan. - * Author: 1997-1999 Weidong Liu. - * Author: 2001 Xuemei Xi - **********/ - -/* Lmin, Lmax, Wmin, Wmax */ - -#include "ngspice/ngspice.h" -#include "ngspice/smpdefs.h" -#include "ngspice/cktdefs.h" -#include "bsim3def.h" -#include "ngspice/const.h" -#include "ngspice/sperror.h" -#include "ngspice/devdefs.h" -#include "ngspice/suffix.h" - -#define Kb 1.3806226e-23 -#define KboQ 8.617087e-5 /* Kb / q where q = 1.60219e-19 */ -#define EPSOX 3.453133e-11 -#define EPSSI 1.03594e-10 -#define PI 3.141592654 -#define MAX_EXP 5.834617425e14 -#define MIN_EXP 1.713908431e-15 -#define EXP_THRESHOLD 34.0 -#define Charge_q 1.60219e-19 - -/* ARGSUSED */ -int -BSIM3temp( -GENmodel *inModel, -CKTcircuit *ckt) -{ -BSIM3model *model = (BSIM3model*) inModel; -BSIM3instance *here; -struct bsim3SizeDependParam *pSizeDependParamKnot, *pLastKnot, *pParam=NULL; -double tmp, tmp1, tmp2, tmp3, Eg, Eg0, ni, T0, T1, T2, T3, T4, T5, Ldrn, Wdrn; -double delTemp, Temp, TRatio, Inv_L, Inv_W, Inv_LW, Vtm0, Tnom; -double Nvtm, SourceSatCurrent, DrainSatCurrent; -int Size_Not_Found, error; - -/* loop through all the BSIM3 device models */ - for (; model != NULL; model = BSIM3nextModel(model)) - { Temp = ckt->CKTtemp; - if (model->BSIM3bulkJctPotential < 0.1) - { model->BSIM3bulkJctPotential = 0.1; - fprintf(stderr, "Given pb is less than 0.1. Pb is set to 0.1.\n"); - } - if (model->BSIM3sidewallJctPotential < 0.1) - { model->BSIM3sidewallJctPotential = 0.1; - fprintf(stderr, "Given pbsw is less than 0.1. Pbsw is set to 0.1.\n"); - } - if (model->BSIM3GatesidewallJctPotential < 0.1) - { model->BSIM3GatesidewallJctPotential = 0.1; - fprintf(stderr, "Given pbswg is less than 0.1. Pbswg is set to 0.1.\n"); - } - - struct bsim3SizeDependParam *p = model->pSizeDependParamKnot; - while (p) { - struct bsim3SizeDependParam *next_p = p->pNext; - FREE(p); - p = next_p; - } - model->pSizeDependParamKnot = NULL; - pLastKnot = NULL; - - Tnom = model->BSIM3tnom; - TRatio = Temp / Tnom; - - model->BSIM3vcrit = CONSTvt0 * log(CONSTvt0 / (CONSTroot2 * 1.0e-14)); - model->BSIM3factor1 = sqrt(EPSSI / EPSOX * model->BSIM3tox); - - Vtm0 = KboQ * Tnom; - Eg0 = 1.16 - 7.02e-4 * Tnom * Tnom / (Tnom + 1108.0); - ni = 1.45e10 * (Tnom / 300.15) * sqrt(Tnom / 300.15) - * exp(21.5565981 - Eg0 / (2.0 * Vtm0)); - - model->BSIM3vtm = KboQ * Temp; - Eg = 1.16 - 7.02e-4 * Temp * Temp / (Temp + 1108.0); - if (Temp != Tnom) - { T0 = Eg0 / Vtm0 - Eg / model->BSIM3vtm + model->BSIM3jctTempExponent - * log(Temp / Tnom); - T1 = exp(T0 / model->BSIM3jctEmissionCoeff); - model->BSIM3jctTempSatCurDensity = model->BSIM3jctSatCurDensity - * T1; - model->BSIM3jctSidewallTempSatCurDensity - = model->BSIM3jctSidewallSatCurDensity * T1; - } - else - { model->BSIM3jctTempSatCurDensity = model->BSIM3jctSatCurDensity; - model->BSIM3jctSidewallTempSatCurDensity - = model->BSIM3jctSidewallSatCurDensity; - } - - if (model->BSIM3jctTempSatCurDensity < 0.0) - model->BSIM3jctTempSatCurDensity = 0.0; - if (model->BSIM3jctSidewallTempSatCurDensity < 0.0) - model->BSIM3jctSidewallTempSatCurDensity = 0.0; - - /* Temperature dependence of D/B and S/B diode capacitance begins */ - delTemp = ckt->CKTtemp - model->BSIM3tnom; - T0 = model->BSIM3tcj * delTemp; - if (T0 >= -1.0) - { model->BSIM3unitAreaTempJctCap = model->BSIM3unitAreaJctCap * (1.0 + T0); - } - else if (model->BSIM3unitAreaJctCap > 0.0) - { model->BSIM3unitAreaTempJctCap = 0.0; - fprintf(stderr, "Temperature effect has caused cj to be negative. Cj is clamped to zero.\n"); - } - T0 = model->BSIM3tcjsw * delTemp; - if (T0 >= -1.0) - { model->BSIM3unitLengthSidewallTempJctCap = model->BSIM3unitLengthSidewallJctCap * (1.0 + T0); - } - else if (model->BSIM3unitLengthSidewallJctCap > 0.0) - { model->BSIM3unitLengthSidewallTempJctCap = 0.0; - fprintf(stderr, "Temperature effect has caused cjsw to be negative. Cjsw is clamped to zero.\n"); - } - T0 = model->BSIM3tcjswg * delTemp; - if (T0 >= -1.0) - { model->BSIM3unitLengthGateSidewallTempJctCap = model->BSIM3unitLengthGateSidewallJctCap * (1.0 + T0); - } - else if (model->BSIM3unitLengthGateSidewallJctCap > 0.0) - { model->BSIM3unitLengthGateSidewallTempJctCap = 0.0; - fprintf(stderr, "Temperature effect has caused cjswg to be negative. Cjswg is clamped to zero.\n"); - } - - model->BSIM3PhiB = model->BSIM3bulkJctPotential - - model->BSIM3tpb * delTemp; - if (model->BSIM3PhiB < 0.01) - { model->BSIM3PhiB = 0.01; - fprintf(stderr, "Temperature effect has caused pb to be less than 0.01. Pb is clamped to 0.01.\n"); - } - model->BSIM3PhiBSW = model->BSIM3sidewallJctPotential - - model->BSIM3tpbsw * delTemp; - if (model->BSIM3PhiBSW <= 0.01) - { model->BSIM3PhiBSW = 0.01; - fprintf(stderr, "Temperature effect has caused pbsw to be less than 0.01. Pbsw is clamped to 0.01.\n"); - } - model->BSIM3PhiBSWG = model->BSIM3GatesidewallJctPotential - - model->BSIM3tpbswg * delTemp; - if (model->BSIM3PhiBSWG <= 0.01) - { model->BSIM3PhiBSWG = 0.01; - fprintf(stderr, "Temperature effect has caused pbswg to be less than 0.01. Pbswg is clamped to 0.01.\n"); - } - /* End of junction capacitance */ - - /* loop through all the instances of the model */ - /* MCJ: Length and Width not initialized */ - for (here = BSIM3instances(model); here != NULL; - here = BSIM3nextInstance(here)) - { - pSizeDependParamKnot = model->pSizeDependParamKnot; - Size_Not_Found = 1; - while ((pSizeDependParamKnot != NULL) && Size_Not_Found) - { if ((here->BSIM3l == pSizeDependParamKnot->Length) - && (here->BSIM3w == pSizeDependParamKnot->Width)) - { Size_Not_Found = 0; - here->pParam = pSizeDependParamKnot; - pParam = here->pParam; /*bug-fix */ - } - else - { pLastKnot = pSizeDependParamKnot; - pSizeDependParamKnot = pSizeDependParamKnot->pNext; - } - } - - if (Size_Not_Found) - { pParam = TMALLOC(struct bsim3SizeDependParam, 1); - if (pLastKnot == NULL) - model->pSizeDependParamKnot = pParam; - else - pLastKnot->pNext = pParam; - pParam->pNext = NULL; - here->pParam = pParam; - - Ldrn = here->BSIM3l; - Wdrn = here->BSIM3w; - pParam->Length = Ldrn; - pParam->Width = Wdrn; - - T0 = pow(Ldrn, model->BSIM3Lln); - T1 = pow(Wdrn, model->BSIM3Lwn); - tmp1 = model->BSIM3Ll / T0 + model->BSIM3Lw / T1 - + model->BSIM3Lwl / (T0 * T1); - pParam->BSIM3dl = model->BSIM3Lint + tmp1; - tmp2 = model->BSIM3Llc / T0 + model->BSIM3Lwc / T1 - + model->BSIM3Lwlc / (T0 * T1); - pParam->BSIM3dlc = model->BSIM3dlc + tmp2; - - T2 = pow(Ldrn, model->BSIM3Wln); - T3 = pow(Wdrn, model->BSIM3Wwn); - tmp1 = model->BSIM3Wl / T2 + model->BSIM3Ww / T3 - + model->BSIM3Wwl / (T2 * T3); - pParam->BSIM3dw = model->BSIM3Wint + tmp1; - tmp2 = model->BSIM3Wlc / T2 + model->BSIM3Wwc / T3 - + model->BSIM3Wwlc / (T2 * T3); - pParam->BSIM3dwc = model->BSIM3dwc + tmp2; - - pParam->BSIM3leff = here->BSIM3l + model->BSIM3xl - 2.0 * pParam->BSIM3dl; - if (pParam->BSIM3leff <= 0.0) - { - SPfrontEnd->IFerrorf (ERR_FATAL, - "BSIM3: mosfet %s, model %s: Effective channel length <= 0", - model->BSIM3modName, here->BSIM3name); - return(E_BADPARM); - } - - pParam->BSIM3weff = here->BSIM3w + model->BSIM3xw - 2.0 * pParam->BSIM3dw; - if (pParam->BSIM3weff <= 0.0) - { - SPfrontEnd->IFerrorf (ERR_FATAL, - "BSIM3: mosfet %s, model %s: Effective channel width <= 0", - model->BSIM3modName, here->BSIM3name); - return(E_BADPARM); - } - - pParam->BSIM3leffCV = here->BSIM3l + model->BSIM3xl - 2.0 * pParam->BSIM3dlc; - if (pParam->BSIM3leffCV <= 0.0) - { - SPfrontEnd->IFerrorf (ERR_FATAL, - "BSIM3: mosfet %s, model %s: Effective channel length for C-V <= 0", - model->BSIM3modName, here->BSIM3name); - return(E_BADPARM); - } - - pParam->BSIM3weffCV = here->BSIM3w + model->BSIM3xw - 2.0 * pParam->BSIM3dwc; - if (pParam->BSIM3weffCV <= 0.0) - { - SPfrontEnd->IFerrorf (ERR_FATAL, - "BSIM3: mosfet %s, model %s: Effective channel width for C-V <= 0", - model->BSIM3modName, here->BSIM3name); - return(E_BADPARM); - } - - - if (model->BSIM3binUnit == 1) - { Inv_L = 1.0e-6 / pParam->BSIM3leff; - Inv_W = 1.0e-6 / pParam->BSIM3weff; - Inv_LW = 1.0e-12 / (pParam->BSIM3leff - * pParam->BSIM3weff); - } - else - { Inv_L = 1.0 / pParam->BSIM3leff; - Inv_W = 1.0 / pParam->BSIM3weff; - Inv_LW = 1.0 / (pParam->BSIM3leff - * pParam->BSIM3weff); - } - pParam->BSIM3cdsc = model->BSIM3cdsc - + model->BSIM3lcdsc * Inv_L - + model->BSIM3wcdsc * Inv_W - + model->BSIM3pcdsc * Inv_LW; - pParam->BSIM3cdscb = model->BSIM3cdscb - + model->BSIM3lcdscb * Inv_L - + model->BSIM3wcdscb * Inv_W - + model->BSIM3pcdscb * Inv_LW; - - pParam->BSIM3cdscd = model->BSIM3cdscd - + model->BSIM3lcdscd * Inv_L - + model->BSIM3wcdscd * Inv_W - + model->BSIM3pcdscd * Inv_LW; - - pParam->BSIM3cit = model->BSIM3cit - + model->BSIM3lcit * Inv_L - + model->BSIM3wcit * Inv_W - + model->BSIM3pcit * Inv_LW; - pParam->BSIM3nfactor = model->BSIM3nfactor - + model->BSIM3lnfactor * Inv_L - + model->BSIM3wnfactor * Inv_W - + model->BSIM3pnfactor * Inv_LW; - pParam->BSIM3xj = model->BSIM3xj - + model->BSIM3lxj * Inv_L - + model->BSIM3wxj * Inv_W - + model->BSIM3pxj * Inv_LW; - pParam->BSIM3vsat = model->BSIM3vsat - + model->BSIM3lvsat * Inv_L - + model->BSIM3wvsat * Inv_W - + model->BSIM3pvsat * Inv_LW; - pParam->BSIM3at = model->BSIM3at - + model->BSIM3lat * Inv_L - + model->BSIM3wat * Inv_W - + model->BSIM3pat * Inv_LW; - pParam->BSIM3a0 = model->BSIM3a0 - + model->BSIM3la0 * Inv_L - + model->BSIM3wa0 * Inv_W - + model->BSIM3pa0 * Inv_LW; - - pParam->BSIM3ags = model->BSIM3ags - + model->BSIM3lags * Inv_L - + model->BSIM3wags * Inv_W - + model->BSIM3pags * Inv_LW; - - pParam->BSIM3a1 = model->BSIM3a1 - + model->BSIM3la1 * Inv_L - + model->BSIM3wa1 * Inv_W - + model->BSIM3pa1 * Inv_LW; - pParam->BSIM3a2 = model->BSIM3a2 - + model->BSIM3la2 * Inv_L - + model->BSIM3wa2 * Inv_W - + model->BSIM3pa2 * Inv_LW; - pParam->BSIM3keta = model->BSIM3keta - + model->BSIM3lketa * Inv_L - + model->BSIM3wketa * Inv_W - + model->BSIM3pketa * Inv_LW; - pParam->BSIM3nsub = model->BSIM3nsub - + model->BSIM3lnsub * Inv_L - + model->BSIM3wnsub * Inv_W - + model->BSIM3pnsub * Inv_LW; - pParam->BSIM3npeak = model->BSIM3npeak - + model->BSIM3lnpeak * Inv_L - + model->BSIM3wnpeak * Inv_W - + model->BSIM3pnpeak * Inv_LW; - pParam->BSIM3ngate = model->BSIM3ngate - + model->BSIM3lngate * Inv_L - + model->BSIM3wngate * Inv_W - + model->BSIM3pngate * Inv_LW; - pParam->BSIM3gamma1 = model->BSIM3gamma1 - + model->BSIM3lgamma1 * Inv_L - + model->BSIM3wgamma1 * Inv_W - + model->BSIM3pgamma1 * Inv_LW; - pParam->BSIM3gamma2 = model->BSIM3gamma2 - + model->BSIM3lgamma2 * Inv_L - + model->BSIM3wgamma2 * Inv_W - + model->BSIM3pgamma2 * Inv_LW; - pParam->BSIM3vbx = model->BSIM3vbx - + model->BSIM3lvbx * Inv_L - + model->BSIM3wvbx * Inv_W - + model->BSIM3pvbx * Inv_LW; - pParam->BSIM3vbm = model->BSIM3vbm - + model->BSIM3lvbm * Inv_L - + model->BSIM3wvbm * Inv_W - + model->BSIM3pvbm * Inv_LW; - pParam->BSIM3xt = model->BSIM3xt - + model->BSIM3lxt * Inv_L - + model->BSIM3wxt * Inv_W - + model->BSIM3pxt * Inv_LW; - pParam->BSIM3vfb = model->BSIM3vfb - + model->BSIM3lvfb * Inv_L - + model->BSIM3wvfb * Inv_W - + model->BSIM3pvfb * Inv_LW; - pParam->BSIM3k1 = model->BSIM3k1 - + model->BSIM3lk1 * Inv_L - + model->BSIM3wk1 * Inv_W - + model->BSIM3pk1 * Inv_LW; - pParam->BSIM3kt1 = model->BSIM3kt1 - + model->BSIM3lkt1 * Inv_L - + model->BSIM3wkt1 * Inv_W - + model->BSIM3pkt1 * Inv_LW; - pParam->BSIM3kt1l = model->BSIM3kt1l - + model->BSIM3lkt1l * Inv_L - + model->BSIM3wkt1l * Inv_W - + model->BSIM3pkt1l * Inv_LW; - pParam->BSIM3k2 = model->BSIM3k2 - + model->BSIM3lk2 * Inv_L - + model->BSIM3wk2 * Inv_W - + model->BSIM3pk2 * Inv_LW; - pParam->BSIM3kt2 = model->BSIM3kt2 - + model->BSIM3lkt2 * Inv_L - + model->BSIM3wkt2 * Inv_W - + model->BSIM3pkt2 * Inv_LW; - pParam->BSIM3k3 = model->BSIM3k3 - + model->BSIM3lk3 * Inv_L - + model->BSIM3wk3 * Inv_W - + model->BSIM3pk3 * Inv_LW; - pParam->BSIM3k3b = model->BSIM3k3b - + model->BSIM3lk3b * Inv_L - + model->BSIM3wk3b * Inv_W - + model->BSIM3pk3b * Inv_LW; - pParam->BSIM3w0 = model->BSIM3w0 - + model->BSIM3lw0 * Inv_L - + model->BSIM3ww0 * Inv_W - + model->BSIM3pw0 * Inv_LW; - pParam->BSIM3nlx = model->BSIM3nlx - + model->BSIM3lnlx * Inv_L - + model->BSIM3wnlx * Inv_W - + model->BSIM3pnlx * Inv_LW; - pParam->BSIM3dvt0 = model->BSIM3dvt0 - + model->BSIM3ldvt0 * Inv_L - + model->BSIM3wdvt0 * Inv_W - + model->BSIM3pdvt0 * Inv_LW; - pParam->BSIM3dvt1 = model->BSIM3dvt1 - + model->BSIM3ldvt1 * Inv_L - + model->BSIM3wdvt1 * Inv_W - + model->BSIM3pdvt1 * Inv_LW; - pParam->BSIM3dvt2 = model->BSIM3dvt2 - + model->BSIM3ldvt2 * Inv_L - + model->BSIM3wdvt2 * Inv_W - + model->BSIM3pdvt2 * Inv_LW; - pParam->BSIM3dvt0w = model->BSIM3dvt0w - + model->BSIM3ldvt0w * Inv_L - + model->BSIM3wdvt0w * Inv_W - + model->BSIM3pdvt0w * Inv_LW; - pParam->BSIM3dvt1w = model->BSIM3dvt1w - + model->BSIM3ldvt1w * Inv_L - + model->BSIM3wdvt1w * Inv_W - + model->BSIM3pdvt1w * Inv_LW; - pParam->BSIM3dvt2w = model->BSIM3dvt2w - + model->BSIM3ldvt2w * Inv_L - + model->BSIM3wdvt2w * Inv_W - + model->BSIM3pdvt2w * Inv_LW; - pParam->BSIM3drout = model->BSIM3drout - + model->BSIM3ldrout * Inv_L - + model->BSIM3wdrout * Inv_W - + model->BSIM3pdrout * Inv_LW; - pParam->BSIM3dsub = model->BSIM3dsub - + model->BSIM3ldsub * Inv_L - + model->BSIM3wdsub * Inv_W - + model->BSIM3pdsub * Inv_LW; - pParam->BSIM3vth0 = model->BSIM3vth0 - + model->BSIM3lvth0 * Inv_L - + model->BSIM3wvth0 * Inv_W - + model->BSIM3pvth0 * Inv_LW; - pParam->BSIM3ua = model->BSIM3ua - + model->BSIM3lua * Inv_L - + model->BSIM3wua * Inv_W - + model->BSIM3pua * Inv_LW; - pParam->BSIM3ua1 = model->BSIM3ua1 - + model->BSIM3lua1 * Inv_L - + model->BSIM3wua1 * Inv_W - + model->BSIM3pua1 * Inv_LW; - pParam->BSIM3ub = model->BSIM3ub - + model->BSIM3lub * Inv_L - + model->BSIM3wub * Inv_W - + model->BSIM3pub * Inv_LW; - pParam->BSIM3ub1 = model->BSIM3ub1 - + model->BSIM3lub1 * Inv_L - + model->BSIM3wub1 * Inv_W - + model->BSIM3pub1 * Inv_LW; - pParam->BSIM3uc = model->BSIM3uc - + model->BSIM3luc * Inv_L - + model->BSIM3wuc * Inv_W - + model->BSIM3puc * Inv_LW; - pParam->BSIM3uc1 = model->BSIM3uc1 - + model->BSIM3luc1 * Inv_L - + model->BSIM3wuc1 * Inv_W - + model->BSIM3puc1 * Inv_LW; - pParam->BSIM3u0 = model->BSIM3u0 - + model->BSIM3lu0 * Inv_L - + model->BSIM3wu0 * Inv_W - + model->BSIM3pu0 * Inv_LW; - pParam->BSIM3ute = model->BSIM3ute - + model->BSIM3lute * Inv_L - + model->BSIM3wute * Inv_W - + model->BSIM3pute * Inv_LW; - pParam->BSIM3voff = model->BSIM3voff - + model->BSIM3lvoff * Inv_L - + model->BSIM3wvoff * Inv_W - + model->BSIM3pvoff * Inv_LW; - pParam->BSIM3delta = model->BSIM3delta - + model->BSIM3ldelta * Inv_L - + model->BSIM3wdelta * Inv_W - + model->BSIM3pdelta * Inv_LW; - pParam->BSIM3rdsw = model->BSIM3rdsw - + model->BSIM3lrdsw * Inv_L - + model->BSIM3wrdsw * Inv_W - + model->BSIM3prdsw * Inv_LW; - pParam->BSIM3prwg = model->BSIM3prwg - + model->BSIM3lprwg * Inv_L - + model->BSIM3wprwg * Inv_W - + model->BSIM3pprwg * Inv_LW; - pParam->BSIM3prwb = model->BSIM3prwb - + model->BSIM3lprwb * Inv_L - + model->BSIM3wprwb * Inv_W - + model->BSIM3pprwb * Inv_LW; - pParam->BSIM3prt = model->BSIM3prt - + model->BSIM3lprt * Inv_L - + model->BSIM3wprt * Inv_W - + model->BSIM3pprt * Inv_LW; - pParam->BSIM3eta0 = model->BSIM3eta0 - + model->BSIM3leta0 * Inv_L - + model->BSIM3weta0 * Inv_W - + model->BSIM3peta0 * Inv_LW; - pParam->BSIM3etab = model->BSIM3etab - + model->BSIM3letab * Inv_L - + model->BSIM3wetab * Inv_W - + model->BSIM3petab * Inv_LW; - pParam->BSIM3pclm = model->BSIM3pclm - + model->BSIM3lpclm * Inv_L - + model->BSIM3wpclm * Inv_W - + model->BSIM3ppclm * Inv_LW; - pParam->BSIM3pdibl1 = model->BSIM3pdibl1 - + model->BSIM3lpdibl1 * Inv_L - + model->BSIM3wpdibl1 * Inv_W - + model->BSIM3ppdibl1 * Inv_LW; - pParam->BSIM3pdibl2 = model->BSIM3pdibl2 - + model->BSIM3lpdibl2 * Inv_L - + model->BSIM3wpdibl2 * Inv_W - + model->BSIM3ppdibl2 * Inv_LW; - pParam->BSIM3pdiblb = model->BSIM3pdiblb - + model->BSIM3lpdiblb * Inv_L - + model->BSIM3wpdiblb * Inv_W - + model->BSIM3ppdiblb * Inv_LW; - pParam->BSIM3pscbe1 = model->BSIM3pscbe1 - + model->BSIM3lpscbe1 * Inv_L - + model->BSIM3wpscbe1 * Inv_W - + model->BSIM3ppscbe1 * Inv_LW; - pParam->BSIM3pscbe2 = model->BSIM3pscbe2 - + model->BSIM3lpscbe2 * Inv_L - + model->BSIM3wpscbe2 * Inv_W - + model->BSIM3ppscbe2 * Inv_LW; - pParam->BSIM3pvag = model->BSIM3pvag - + model->BSIM3lpvag * Inv_L - + model->BSIM3wpvag * Inv_W - + model->BSIM3ppvag * Inv_LW; - pParam->BSIM3wr = model->BSIM3wr - + model->BSIM3lwr * Inv_L - + model->BSIM3wwr * Inv_W - + model->BSIM3pwr * Inv_LW; - pParam->BSIM3dwg = model->BSIM3dwg - + model->BSIM3ldwg * Inv_L - + model->BSIM3wdwg * Inv_W - + model->BSIM3pdwg * Inv_LW; - pParam->BSIM3dwb = model->BSIM3dwb - + model->BSIM3ldwb * Inv_L - + model->BSIM3wdwb * Inv_W - + model->BSIM3pdwb * Inv_LW; - pParam->BSIM3b0 = model->BSIM3b0 - + model->BSIM3lb0 * Inv_L - + model->BSIM3wb0 * Inv_W - + model->BSIM3pb0 * Inv_LW; - pParam->BSIM3b1 = model->BSIM3b1 - + model->BSIM3lb1 * Inv_L - + model->BSIM3wb1 * Inv_W - + model->BSIM3pb1 * Inv_LW; - pParam->BSIM3alpha0 = model->BSIM3alpha0 - + model->BSIM3lalpha0 * Inv_L - + model->BSIM3walpha0 * Inv_W - + model->BSIM3palpha0 * Inv_LW; - pParam->BSIM3alpha1 = model->BSIM3alpha1 - + model->BSIM3lalpha1 * Inv_L - + model->BSIM3walpha1 * Inv_W - + model->BSIM3palpha1 * Inv_LW; - pParam->BSIM3beta0 = model->BSIM3beta0 - + model->BSIM3lbeta0 * Inv_L - + model->BSIM3wbeta0 * Inv_W - + model->BSIM3pbeta0 * Inv_LW; - /* CV model */ - pParam->BSIM3elm = model->BSIM3elm - + model->BSIM3lelm * Inv_L - + model->BSIM3welm * Inv_W - + model->BSIM3pelm * Inv_LW; - pParam->BSIM3cgsl = model->BSIM3cgsl - + model->BSIM3lcgsl * Inv_L - + model->BSIM3wcgsl * Inv_W - + model->BSIM3pcgsl * Inv_LW; - pParam->BSIM3cgdl = model->BSIM3cgdl - + model->BSIM3lcgdl * Inv_L - + model->BSIM3wcgdl * Inv_W - + model->BSIM3pcgdl * Inv_LW; - pParam->BSIM3ckappa = model->BSIM3ckappa - + model->BSIM3lckappa * Inv_L - + model->BSIM3wckappa * Inv_W - + model->BSIM3pckappa * Inv_LW; - pParam->BSIM3cf = model->BSIM3cf - + model->BSIM3lcf * Inv_L - + model->BSIM3wcf * Inv_W - + model->BSIM3pcf * Inv_LW; - pParam->BSIM3clc = model->BSIM3clc - + model->BSIM3lclc * Inv_L - + model->BSIM3wclc * Inv_W - + model->BSIM3pclc * Inv_LW; - pParam->BSIM3cle = model->BSIM3cle - + model->BSIM3lcle * Inv_L - + model->BSIM3wcle * Inv_W - + model->BSIM3pcle * Inv_LW; - pParam->BSIM3vfbcv = model->BSIM3vfbcv - + model->BSIM3lvfbcv * Inv_L - + model->BSIM3wvfbcv * Inv_W - + model->BSIM3pvfbcv * Inv_LW; - pParam->BSIM3acde = model->BSIM3acde - + model->BSIM3lacde * Inv_L - + model->BSIM3wacde * Inv_W - + model->BSIM3pacde * Inv_LW; - pParam->BSIM3moin = model->BSIM3moin - + model->BSIM3lmoin * Inv_L - + model->BSIM3wmoin * Inv_W - + model->BSIM3pmoin * Inv_LW; - pParam->BSIM3noff = model->BSIM3noff - + model->BSIM3lnoff * Inv_L - + model->BSIM3wnoff * Inv_W - + model->BSIM3pnoff * Inv_LW; - pParam->BSIM3voffcv = model->BSIM3voffcv - + model->BSIM3lvoffcv * Inv_L - + model->BSIM3wvoffcv * Inv_W - + model->BSIM3pvoffcv * Inv_LW; - - pParam->BSIM3abulkCVfactor = 1.0 + pow((pParam->BSIM3clc - / pParam->BSIM3leffCV), - pParam->BSIM3cle); - - T0 = (TRatio - 1.0); - pParam->BSIM3ua = pParam->BSIM3ua + pParam->BSIM3ua1 * T0; - pParam->BSIM3ub = pParam->BSIM3ub + pParam->BSIM3ub1 * T0; - pParam->BSIM3uc = pParam->BSIM3uc + pParam->BSIM3uc1 * T0; - if (pParam->BSIM3u0 > 1.0) - pParam->BSIM3u0 = pParam->BSIM3u0 / 1.0e4; - - pParam->BSIM3u0temp = pParam->BSIM3u0 - * pow(TRatio, pParam->BSIM3ute); - pParam->BSIM3vsattemp = pParam->BSIM3vsat - pParam->BSIM3at - * T0; - pParam->BSIM3rds0 = (pParam->BSIM3rdsw + pParam->BSIM3prt * T0) - / pow(pParam->BSIM3weff * 1E6, pParam->BSIM3wr); - - if (BSIM3checkModel(model, here, ckt)) - { - SPfrontEnd->IFerrorf (ERR_FATAL, "Fatal error(s) detected during BSIM3V3.3 parameter checking for %s in model %s", model->BSIM3modName, here->BSIM3name); - return(E_BADPARM); - } - - pParam->BSIM3cgdo = (model->BSIM3cgdo + pParam->BSIM3cf) - * pParam->BSIM3weffCV; - pParam->BSIM3cgso = (model->BSIM3cgso + pParam->BSIM3cf) - * pParam->BSIM3weffCV; - pParam->BSIM3cgbo = model->BSIM3cgbo * pParam->BSIM3leffCV; - - T0 = pParam->BSIM3leffCV * pParam->BSIM3leffCV; - pParam->BSIM3tconst = pParam->BSIM3u0temp * pParam->BSIM3elm / (model->BSIM3cox - * pParam->BSIM3weffCV * pParam->BSIM3leffCV * T0); - - if (!model->BSIM3npeakGiven && model->BSIM3gamma1Given) - { T0 = pParam->BSIM3gamma1 * model->BSIM3cox; - pParam->BSIM3npeak = 3.021E22 * T0 * T0; - } - - pParam->BSIM3phi = 2.0 * Vtm0 - * log(pParam->BSIM3npeak / ni); - - pParam->BSIM3sqrtPhi = sqrt(pParam->BSIM3phi); - pParam->BSIM3phis3 = pParam->BSIM3sqrtPhi * pParam->BSIM3phi; - - pParam->BSIM3Xdep0 = sqrt(2.0 * EPSSI / (Charge_q - * pParam->BSIM3npeak * 1.0e6)) - * pParam->BSIM3sqrtPhi; - pParam->BSIM3sqrtXdep0 = sqrt(pParam->BSIM3Xdep0); - pParam->BSIM3litl = sqrt(3.0 * pParam->BSIM3xj - * model->BSIM3tox); - pParam->BSIM3vbi = Vtm0 * log(1.0e20 - * pParam->BSIM3npeak / (ni * ni)); - pParam->BSIM3cdep0 = sqrt(Charge_q * EPSSI - * pParam->BSIM3npeak * 1.0e6 / 2.0 - / pParam->BSIM3phi); - - pParam->BSIM3ldeb = sqrt(EPSSI * Vtm0 / (Charge_q - * pParam->BSIM3npeak * 1.0e6)) / 3.0; - pParam->BSIM3acde *= pow((pParam->BSIM3npeak / 2.0e16), -0.25); - - - if (model->BSIM3k1Given || model->BSIM3k2Given) - { if (!model->BSIM3k1Given) - { - if ((!ckt->CKTcurJob) || (ckt->CKTcurJob->JOBtype < 9)) /* don't print in sensitivity */ - fprintf(stdout, "Warning: k1 should be specified with k2.\n"); - pParam->BSIM3k1 = 0.53; - } - if (!model->BSIM3k2Given) - { - if ((!ckt->CKTcurJob) || (ckt->CKTcurJob->JOBtype < 9)) /* don't print in sensitivity */ - fprintf(stdout, "Warning: k2 should be specified with k1.\n"); - pParam->BSIM3k2 = -0.0186; - } - if ((!ckt->CKTcurJob) || (ckt->CKTcurJob->JOBtype < 9)) { /* don't print in sensitivity */ - if (model->BSIM3nsubGiven) - fprintf(stdout, "Warning: nsub is ignored because k1 or k2 is given.\n"); - if (model->BSIM3xtGiven) - fprintf(stdout, "Warning: xt is ignored because k1 or k2 is given.\n"); - if (model->BSIM3vbxGiven) - fprintf(stdout, "Warning: vbx is ignored because k1 or k2 is given.\n"); - if (model->BSIM3gamma1Given) - fprintf(stdout, "Warning: gamma1 is ignored because k1 or k2 is given.\n"); - if (model->BSIM3gamma2Given) - fprintf(stdout, "Warning: gamma2 is ignored because k1 or k2 is given.\n"); - } - } - else - { if (!model->BSIM3vbxGiven) - pParam->BSIM3vbx = pParam->BSIM3phi - 7.7348e-4 - * pParam->BSIM3npeak - * pParam->BSIM3xt * pParam->BSIM3xt; - if (pParam->BSIM3vbx > 0.0) - pParam->BSIM3vbx = -pParam->BSIM3vbx; - if (pParam->BSIM3vbm > 0.0) - pParam->BSIM3vbm = -pParam->BSIM3vbm; - - if (!model->BSIM3gamma1Given) - pParam->BSIM3gamma1 = 5.753e-12 - * sqrt(pParam->BSIM3npeak) - / model->BSIM3cox; - if (!model->BSIM3gamma2Given) - pParam->BSIM3gamma2 = 5.753e-12 - * sqrt(pParam->BSIM3nsub) - / model->BSIM3cox; - - T0 = pParam->BSIM3gamma1 - pParam->BSIM3gamma2; - T1 = sqrt(pParam->BSIM3phi - pParam->BSIM3vbx) - - pParam->BSIM3sqrtPhi; - T2 = sqrt(pParam->BSIM3phi * (pParam->BSIM3phi - - pParam->BSIM3vbm)) - pParam->BSIM3phi; - pParam->BSIM3k2 = T0 * T1 / (2.0 * T2 + pParam->BSIM3vbm); - pParam->BSIM3k1 = pParam->BSIM3gamma2 - 2.0 - * pParam->BSIM3k2 * sqrt(pParam->BSIM3phi - - pParam->BSIM3vbm); - } - - if (pParam->BSIM3k2 < 0.0) - { T0 = 0.5 * pParam->BSIM3k1 / pParam->BSIM3k2; - pParam->BSIM3vbsc = 0.9 * (pParam->BSIM3phi - T0 * T0); - if (pParam->BSIM3vbsc > -3.0) - pParam->BSIM3vbsc = -3.0; - else if (pParam->BSIM3vbsc < -30.0) - pParam->BSIM3vbsc = -30.0; - } - else - { pParam->BSIM3vbsc = -30.0; - } - if (pParam->BSIM3vbsc > pParam->BSIM3vbm) - pParam->BSIM3vbsc = pParam->BSIM3vbm; - - if (!model->BSIM3vfbGiven) - { if (model->BSIM3vth0Given) - { pParam->BSIM3vfb = model->BSIM3type * pParam->BSIM3vth0 - - pParam->BSIM3phi - pParam->BSIM3k1 - * pParam->BSIM3sqrtPhi; - } - else - { pParam->BSIM3vfb = -1.0; - } - } - if (!model->BSIM3vth0Given) - { pParam->BSIM3vth0 = model->BSIM3type * (pParam->BSIM3vfb - + pParam->BSIM3phi + pParam->BSIM3k1 - * pParam->BSIM3sqrtPhi); - } - - pParam->BSIM3k1ox = pParam->BSIM3k1 * model->BSIM3tox - / model->BSIM3toxm; - pParam->BSIM3k2ox = pParam->BSIM3k2 * model->BSIM3tox - / model->BSIM3toxm; - - T1 = sqrt(EPSSI / EPSOX * model->BSIM3tox - * pParam->BSIM3Xdep0); - T0 = exp(-0.5 * pParam->BSIM3dsub * pParam->BSIM3leff / T1); - pParam->BSIM3theta0vb0 = (T0 + 2.0 * T0 * T0); - - T0 = exp(-0.5 * pParam->BSIM3drout * pParam->BSIM3leff / T1); - T2 = (T0 + 2.0 * T0 * T0); - pParam->BSIM3thetaRout = pParam->BSIM3pdibl1 * T2 - + pParam->BSIM3pdibl2; - - tmp = sqrt(pParam->BSIM3Xdep0); - tmp1 = pParam->BSIM3vbi - pParam->BSIM3phi; - tmp2 = model->BSIM3factor1 * tmp; - - T0 = -0.5 * pParam->BSIM3dvt1w * pParam->BSIM3weff - * pParam->BSIM3leff / tmp2; - if (T0 > -EXP_THRESHOLD) - { T1 = exp(T0); - T2 = T1 * (1.0 + 2.0 * T1); - } - else - { T1 = MIN_EXP; - T2 = T1 * (1.0 + 2.0 * T1); - } - T0 = pParam->BSIM3dvt0w * T2; - T2 = T0 * tmp1; - - T0 = -0.5 * pParam->BSIM3dvt1 * pParam->BSIM3leff / tmp2; - if (T0 > -EXP_THRESHOLD) - { T1 = exp(T0); - T3 = T1 * (1.0 + 2.0 * T1); - } - else - { T1 = MIN_EXP; - T3 = T1 * (1.0 + 2.0 * T1); - } - T3 = pParam->BSIM3dvt0 * T3 * tmp1; - - T4 = model->BSIM3tox * pParam->BSIM3phi - / (pParam->BSIM3weff + pParam->BSIM3w0); - - T0 = sqrt(1.0 + pParam->BSIM3nlx / pParam->BSIM3leff); - T5 = pParam->BSIM3k1ox * (T0 - 1.0) * pParam->BSIM3sqrtPhi - + (pParam->BSIM3kt1 + pParam->BSIM3kt1l / pParam->BSIM3leff) - * (TRatio - 1.0); - - tmp3 = model->BSIM3type * pParam->BSIM3vth0 - - T2 - T3 + pParam->BSIM3k3 * T4 + T5; - pParam->BSIM3vfbzb = tmp3 - pParam->BSIM3phi - pParam->BSIM3k1 - * pParam->BSIM3sqrtPhi; - /* End of vfbzb */ - } - - /* adding delvto */ - here->BSIM3vth0 = pParam->BSIM3vth0 + here->BSIM3delvto; - here->BSIM3vfb = pParam->BSIM3vfb + model->BSIM3type * here->BSIM3delvto; - here->BSIM3vfbzb = pParam->BSIM3vfbzb + model->BSIM3type * here->BSIM3delvto; - - /* low field mobility multiplier */ - here->BSIM3u0temp = pParam->BSIM3u0temp * here->BSIM3mulu0; - here->BSIM3tconst = here->BSIM3u0temp * pParam->BSIM3elm / (model->BSIM3cox - * pParam->BSIM3weffCV * pParam->BSIM3leffCV * T0); - - /* process source/drain series resistance */ - /* ACM model */ - - double drainResistance, sourceResistance; - - if (model->BSIM3acmMod == 0) - { - drainResistance = model->BSIM3sheetResistance - * here->BSIM3drainSquares; - sourceResistance = model->BSIM3sheetResistance - * here->BSIM3sourceSquares; - } - else /* ACM > 0 */ - { - error = ACM_SourceDrainResistances( - model->BSIM3acmMod, - model->BSIM3ld, - model->BSIM3ldif, - model->BSIM3hdif, - model->BSIM3wmlt, - here->BSIM3w, - model->BSIM3xw, - model->BSIM3sheetResistance, - here->BSIM3drainSquaresGiven, - model->BSIM3rd, - model->BSIM3rdc, - here->BSIM3drainSquares, - here->BSIM3sourceSquaresGiven, - model->BSIM3rs, - model->BSIM3rsc, - here->BSIM3sourceSquares, - &drainResistance, - &sourceResistance - ); - if (error) - return(error); - } - if (drainResistance > 0.0) - here->BSIM3drainConductance = 1.0 / drainResistance; - else - here->BSIM3drainConductance = 0.0; - - if (sourceResistance > 0.0) - here->BSIM3sourceConductance = 1.0 / sourceResistance; - else - here->BSIM3sourceConductance = 0.0; - - here->BSIM3cgso = pParam->BSIM3cgso; - here->BSIM3cgdo = pParam->BSIM3cgdo; - - Nvtm = model->BSIM3vtm * model->BSIM3jctEmissionCoeff; - if ((here->BSIM3sourceArea <= 0.0) && - (here->BSIM3sourcePerimeter <= 0.0)) - { SourceSatCurrent = 1.0e-14; - } - else - { SourceSatCurrent = here->BSIM3sourceArea - * model->BSIM3jctTempSatCurDensity - + here->BSIM3sourcePerimeter - * model->BSIM3jctSidewallTempSatCurDensity; - } - if ((SourceSatCurrent > 0.0) && (model->BSIM3ijth > 0.0)) - { here->BSIM3vjsm = Nvtm * log(model->BSIM3ijth - / SourceSatCurrent + 1.0); - here->BSIM3IsEvjsm = SourceSatCurrent * exp(here->BSIM3vjsm - / Nvtm); - } - - if ((here->BSIM3drainArea <= 0.0) && - (here->BSIM3drainPerimeter <= 0.0)) - { DrainSatCurrent = 1.0e-14; - } - else - { DrainSatCurrent = here->BSIM3drainArea - * model->BSIM3jctTempSatCurDensity - + here->BSIM3drainPerimeter - * model->BSIM3jctSidewallTempSatCurDensity; - } - if ((DrainSatCurrent > 0.0) && (model->BSIM3ijth > 0.0)) - { here->BSIM3vjdm = Nvtm * log(model->BSIM3ijth - / DrainSatCurrent + 1.0); - here->BSIM3IsEvjdm = DrainSatCurrent * exp(here->BSIM3vjdm - / Nvtm); - } - } - } - return(OK); -} - diff --git a/src/spicelib/devices/bsim3/b3trunc.c b/src/spicelib/devices/bsim3/b3trunc.c deleted file mode 100644 index 42c539665..000000000 --- a/src/spicelib/devices/bsim3/b3trunc.c +++ /dev/null @@ -1,50 +0,0 @@ -/**** BSIM3v3.3.0, Released by Xuemei Xi 07/29/2005 ****/ - -/********** - * Copyright 2004 Regents of the University of California. All rights reserved. - * File: b3trunc.c of BSIM3v3.3.0 - * Author: 1995 Min-Chie Jeng and Mansun Chan. - * Author: 1997-1999 Weidong Liu. - * Author: 2001 Xuemei Xi - **********/ - -#include "ngspice/ngspice.h" -#include "ngspice/cktdefs.h" -#include "bsim3def.h" -#include "ngspice/sperror.h" -#include "ngspice/suffix.h" - - -int -BSIM3trunc( -GENmodel *inModel, -CKTcircuit *ckt, -double *timeStep) -{ -BSIM3model *model = (BSIM3model*)inModel; -BSIM3instance *here; - -#ifdef STEPDEBUG - double debugtemp; -#endif /* STEPDEBUG */ - - for (; model != NULL; model = BSIM3nextModel(model)) - { for (here = BSIM3instances(model); here != NULL; - here = BSIM3nextInstance(here)) - { -#ifdef STEPDEBUG - debugtemp = *timeStep; -#endif /* STEPDEBUG */ - CKTterr(here->BSIM3qb,ckt,timeStep); - CKTterr(here->BSIM3qg,ckt,timeStep); - CKTterr(here->BSIM3qd,ckt,timeStep); -#ifdef STEPDEBUG - if(debugtemp != *timeStep) - { printf("device %s reduces step from %g to %g\n", - here->BSIM3name,debugtemp,*timeStep); - } -#endif /* STEPDEBUG */ - } - } - return(OK); -} diff --git a/src/spicelib/devices/bsim3/bsim3def.h b/src/spicelib/devices/bsim3/bsim3def.h deleted file mode 100644 index 13c5afc26..000000000 --- a/src/spicelib/devices/bsim3/bsim3def.h +++ /dev/null @@ -1,1921 +0,0 @@ -/********** -Copyright 2004 Regents of the University of California. All rights reserved. -Author: 1995 Min-Chie Jeng and Mansun Chan. -Author: 1997-1999 Weidong Liu. -Author: 2001- Xuemei Xi -**** OpenMP support for ngspice by Holger Vogt 06/28/2010 **** -File: bsim3def.h -**********/ - -#ifndef BSIM3 -#define BSIM3 - -#include "ngspice/ifsim.h" -#include "ngspice/gendefs.h" -#include "ngspice/cktdefs.h" -#include "ngspice/complex.h" -#include "ngspice/noisedef.h" - -typedef struct sBSIM3instance -{ - - struct GENinstance gen; - -#define BSIM3modPtr(inst) ((struct sBSIM3model *)((inst)->gen.GENmodPtr)) -#define BSIM3nextInstance(inst) ((struct sBSIM3instance *)((inst)->gen.GENnextInstance)) -#define BSIM3name gen.GENname -#define BSIM3states gen.GENstate - - const int BSIM3dNode; - const int BSIM3gNode; - const int BSIM3sNode; - const int BSIM3bNode; - int BSIM3dNodePrime; - int BSIM3sNodePrime; - int BSIM3qNode; /* MCJ */ - - /* MCJ */ - double BSIM3ueff; - double BSIM3thetavth; - double BSIM3von; - double BSIM3vdsat; - double BSIM3cgdo; - double BSIM3cgso; - double BSIM3vjsm; - double BSIM3IsEvjsm; - double BSIM3vjdm; - double BSIM3IsEvjdm; - - double BSIM3l; - double BSIM3w; - double BSIM3m; - double BSIM3drainArea; - double BSIM3sourceArea; - double BSIM3drainSquares; - double BSIM3sourceSquares; - double BSIM3drainPerimeter; - double BSIM3sourcePerimeter; - double BSIM3sourceConductance; - double BSIM3drainConductance; - double BSIM3delvto; - double BSIM3mulu0; - double BSIM3vth0; - double BSIM3vfb; - double BSIM3vfbzb; - double BSIM3u0temp; - double BSIM3tconst; - - double BSIM3icVBS; - double BSIM3icVDS; - double BSIM3icVGS; - int BSIM3off; - int BSIM3mode; - int BSIM3nqsMod; - int BSIM3acnqsMod; - int BSIM3geo; - - /* OP point */ - double BSIM3qinv; - double BSIM3cd; - double BSIM3cbs; - double BSIM3cbd; - double BSIM3csub; - double BSIM3gm; - double BSIM3gds; - double BSIM3gmbs; - double BSIM3gbd; - double BSIM3gbs; - - double BSIM3gbbs; - double BSIM3gbgs; - double BSIM3gbds; - - double BSIM3cggb; - double BSIM3cgdb; - double BSIM3cgsb; - double BSIM3cbgb; - double BSIM3cbdb; - double BSIM3cbsb; - double BSIM3cdgb; - double BSIM3cddb; - double BSIM3cdsb; - double BSIM3capbd; - double BSIM3capbs; - - double BSIM3cqgb; - double BSIM3cqdb; - double BSIM3cqsb; - double BSIM3cqbb; - - double BSIM3qgate; - double BSIM3qbulk; - double BSIM3qdrn; - - double BSIM3gtau; - double BSIM3gtg; - double BSIM3gtd; - double BSIM3gts; - double BSIM3gtb; - double BSIM3rds; /* Noise bugfix */ - double BSIM3Vgsteff; - double BSIM3Vdseff; - double BSIM3Abulk; - double BSIM3AbovVgst2Vtm; - double BSIM3taunet; - - struct bsim3SizeDependParam *pParam; - - unsigned BSIM3lGiven :1; - unsigned BSIM3wGiven :1; - unsigned BSIM3mGiven :1; - unsigned BSIM3drainAreaGiven :1; - unsigned BSIM3sourceAreaGiven :1; - unsigned BSIM3drainSquaresGiven :1; - unsigned BSIM3sourceSquaresGiven :1; - unsigned BSIM3drainPerimeterGiven :1; - unsigned BSIM3sourcePerimeterGiven :1; - unsigned BSIM3delvtoGiven :1; - unsigned BSIM3mulu0Given :1; - unsigned BSIM3dNodePrimeSet :1; - unsigned BSIM3sNodePrimeSet :1; - unsigned BSIM3icVBSGiven :1; - unsigned BSIM3icVDSGiven :1; - unsigned BSIM3icVGSGiven :1; - unsigned BSIM3nqsModGiven :1; - unsigned BSIM3acnqsModGiven :1; - unsigned BSIM3geoGiven :1; - - double *BSIM3DdPtr; - double *BSIM3GgPtr; - double *BSIM3SsPtr; - double *BSIM3BbPtr; - double *BSIM3DPdpPtr; - double *BSIM3SPspPtr; - double *BSIM3DdpPtr; - double *BSIM3GbPtr; - double *BSIM3GdpPtr; - double *BSIM3GspPtr; - double *BSIM3SspPtr; - double *BSIM3BdpPtr; - double *BSIM3BspPtr; - double *BSIM3DPspPtr; - double *BSIM3DPdPtr; - double *BSIM3BgPtr; - double *BSIM3DPgPtr; - double *BSIM3SPgPtr; - double *BSIM3SPsPtr; - double *BSIM3DPbPtr; - double *BSIM3SPbPtr; - double *BSIM3SPdpPtr; - - double *BSIM3QqPtr; - double *BSIM3QdpPtr; - double *BSIM3QgPtr; - double *BSIM3QspPtr; - double *BSIM3QbPtr; - double *BSIM3DPqPtr; - double *BSIM3GqPtr; - double *BSIM3SPqPtr; - double *BSIM3BqPtr; - -#ifdef USE_OMP - /* per instance storage of results, to update matrix at a later stge */ - double BSIM3rhsG; - double BSIM3rhsB; - double BSIM3rhsD; - double BSIM3rhsS; - double BSIM3rhsQ; - - double BSIM3DdPt; - double BSIM3GgPt; - double BSIM3SsPt; - double BSIM3BbPt; - double BSIM3DPdpPt; - double BSIM3SPspPt; - double BSIM3DdpPt; - double BSIM3GbPt; - double BSIM3GdpPt; - double BSIM3GspPt; - double BSIM3SspPt; - double BSIM3BdpPt; - double BSIM3BspPt; - double BSIM3DPspPt; - double BSIM3DPdPt; - double BSIM3BgPt; - double BSIM3DPgPt; - double BSIM3SPgPt; - double BSIM3SPsPt; - double BSIM3DPbPt; - double BSIM3SPbPt; - double BSIM3SPdpPt; - - double BSIM3QqPt; - double BSIM3QdpPt; - double BSIM3QgPt; - double BSIM3QspPt; - double BSIM3QbPt; - double BSIM3DPqPt; - double BSIM3GqPt; - double BSIM3SPqPt; - double BSIM3BqPt; -#endif - -#define BSIM3vbd BSIM3states+ 0 -#define BSIM3vbs BSIM3states+ 1 -#define BSIM3vgs BSIM3states+ 2 -#define BSIM3vds BSIM3states+ 3 - -#define BSIM3qb BSIM3states+ 4 -#define BSIM3cqb BSIM3states+ 5 -#define BSIM3qg BSIM3states+ 6 -#define BSIM3cqg BSIM3states+ 7 -#define BSIM3qd BSIM3states+ 8 -#define BSIM3cqd BSIM3states+ 9 - -#define BSIM3qbs BSIM3states+ 10 -#define BSIM3qbd BSIM3states+ 11 - -#define BSIM3qcheq BSIM3states+ 12 -#define BSIM3cqcheq BSIM3states+ 13 -#define BSIM3qcdump BSIM3states+ 14 -#define BSIM3cqcdump BSIM3states+ 15 - -#define BSIM3qdef BSIM3states+ 16 - -#define BSIM3numStates 17 - - -/* indices to the array of BSIM3 NOISE SOURCES */ - -#define BSIM3RDNOIZ 0 -#define BSIM3RSNOIZ 1 -#define BSIM3IDNOIZ 2 -#define BSIM3FLNOIZ 3 -#define BSIM3TOTNOIZ 4 - -#define BSIM3NSRCS 5 /* the number of BSIM3 MOSFET noise sources */ - -#ifndef NONOISE - double BSIM3nVar[NSTATVARS][BSIM3NSRCS]; -#else /* NONOISE */ - double **BSIM3nVar; -#endif /* NONOISE */ - -} BSIM3instance ; - -struct bsim3SizeDependParam -{ - double Width; - double Length; - - double BSIM3cdsc; - double BSIM3cdscb; - double BSIM3cdscd; - double BSIM3cit; - double BSIM3nfactor; - double BSIM3xj; - double BSIM3vsat; - double BSIM3at; - double BSIM3a0; - double BSIM3ags; - double BSIM3a1; - double BSIM3a2; - double BSIM3keta; - double BSIM3nsub; - double BSIM3npeak; - double BSIM3ngate; - double BSIM3gamma1; - double BSIM3gamma2; - double BSIM3vbx; - double BSIM3vbi; - double BSIM3vbm; - double BSIM3vbsc; - double BSIM3xt; - double BSIM3phi; - double BSIM3litl; - double BSIM3k1; - double BSIM3kt1; - double BSIM3kt1l; - double BSIM3kt2; - double BSIM3k2; - double BSIM3k3; - double BSIM3k3b; - double BSIM3w0; - double BSIM3nlx; - double BSIM3dvt0; - double BSIM3dvt1; - double BSIM3dvt2; - double BSIM3dvt0w; - double BSIM3dvt1w; - double BSIM3dvt2w; - double BSIM3drout; - double BSIM3dsub; - double BSIM3vth0; - double BSIM3ua; - double BSIM3ua1; - double BSIM3ub; - double BSIM3ub1; - double BSIM3uc; - double BSIM3uc1; - double BSIM3u0; - double BSIM3ute; - double BSIM3voff; - double BSIM3vfb; - double BSIM3delta; - double BSIM3rdsw; - double BSIM3rds0; - double BSIM3prwg; - double BSIM3prwb; - double BSIM3prt; - double BSIM3eta0; - double BSIM3etab; - double BSIM3pclm; - double BSIM3pdibl1; - double BSIM3pdibl2; - double BSIM3pdiblb; - double BSIM3pscbe1; - double BSIM3pscbe2; - double BSIM3pvag; - double BSIM3wr; - double BSIM3dwg; - double BSIM3dwb; - double BSIM3b0; - double BSIM3b1; - double BSIM3alpha0; - double BSIM3alpha1; - double BSIM3beta0; - - - /* CV model */ - double BSIM3elm; - double BSIM3cgsl; - double BSIM3cgdl; - double BSIM3ckappa; - double BSIM3cf; - double BSIM3clc; - double BSIM3cle; - double BSIM3vfbcv; - double BSIM3noff; - double BSIM3voffcv; - double BSIM3acde; - double BSIM3moin; - - -/* Pre-calculated constants */ - - double BSIM3dw; - double BSIM3dl; - double BSIM3leff; - double BSIM3weff; - - double BSIM3dwc; - double BSIM3dlc; - double BSIM3leffCV; - double BSIM3weffCV; - double BSIM3abulkCVfactor; - double BSIM3cgso; - double BSIM3cgdo; - double BSIM3cgbo; - double BSIM3tconst; - - double BSIM3u0temp; - double BSIM3vsattemp; - double BSIM3sqrtPhi; - double BSIM3phis3; - double BSIM3Xdep0; - double BSIM3sqrtXdep0; - double BSIM3theta0vb0; - double BSIM3thetaRout; - - double BSIM3cof1; - double BSIM3cof2; - double BSIM3cof3; - double BSIM3cof4; - double BSIM3cdep0; - double BSIM3vfbzb; - double BSIM3ldeb; - double BSIM3k1ox; - double BSIM3k2ox; - - struct bsim3SizeDependParam *pNext; -}; - - -typedef struct sBSIM3model -{ - - struct GENmodel gen; - -#define BSIM3modType gen.GENmodType -#define BSIM3nextModel(inst) ((struct sBSIM3model *)((inst)->gen.GENnextModel)) -#define BSIM3instances(inst) ((BSIM3instance *)((inst)->gen.GENinstances)) -#define BSIM3modName gen.GENmodName - - int BSIM3type; - - int BSIM3mobMod; - int BSIM3capMod; - int BSIM3acmMod; - int BSIM3calcacm; - int BSIM3noiMod; - int BSIM3nqsMod; - int BSIM3acnqsMod; - int BSIM3binUnit; - int BSIM3paramChk; - char *BSIM3version; - double BSIM3tox; - double BSIM3toxm; - double BSIM3cdsc; - double BSIM3cdscb; - double BSIM3cdscd; - double BSIM3cit; - double BSIM3nfactor; - double BSIM3xj; - double BSIM3vsat; - double BSIM3at; - double BSIM3a0; - double BSIM3ags; - double BSIM3a1; - double BSIM3a2; - double BSIM3keta; - double BSIM3nsub; - double BSIM3npeak; - double BSIM3ngate; - double BSIM3gamma1; - double BSIM3gamma2; - double BSIM3vbx; - double BSIM3vbm; - double BSIM3xt; - double BSIM3k1; - double BSIM3kt1; - double BSIM3kt1l; - double BSIM3kt2; - double BSIM3k2; - double BSIM3k3; - double BSIM3k3b; - double BSIM3w0; - double BSIM3nlx; - double BSIM3dvt0; - double BSIM3dvt1; - double BSIM3dvt2; - double BSIM3dvt0w; - double BSIM3dvt1w; - double BSIM3dvt2w; - double BSIM3drout; - double BSIM3dsub; - double BSIM3vth0; - double BSIM3ua; - double BSIM3ua1; - double BSIM3ub; - double BSIM3ub1; - double BSIM3uc; - double BSIM3uc1; - double BSIM3u0; - double BSIM3ute; - double BSIM3voff; - double BSIM3delta; - double BSIM3rdsw; - double BSIM3prwg; - double BSIM3prwb; - double BSIM3prt; - double BSIM3eta0; - double BSIM3etab; - double BSIM3pclm; - double BSIM3pdibl1; - double BSIM3pdibl2; - double BSIM3pdiblb; - double BSIM3pscbe1; - double BSIM3pscbe2; - double BSIM3pvag; - double BSIM3wr; - double BSIM3dwg; - double BSIM3dwb; - double BSIM3b0; - double BSIM3b1; - double BSIM3alpha0; - double BSIM3alpha1; - double BSIM3beta0; - double BSIM3ijth; - double BSIM3vfb; - - /* CV model */ - double BSIM3elm; - double BSIM3cgsl; - double BSIM3cgdl; - double BSIM3ckappa; - double BSIM3cf; - double BSIM3vfbcv; - double BSIM3clc; - double BSIM3cle; - double BSIM3dwc; - double BSIM3dlc; - double BSIM3noff; - double BSIM3voffcv; - double BSIM3acde; - double BSIM3moin; - double BSIM3tcj; - double BSIM3tcjsw; - double BSIM3tcjswg; - double BSIM3tpb; - double BSIM3tpbsw; - double BSIM3tpbswg; - - /* ACM model */ - double BSIM3xl; - double BSIM3xw; - double BSIM3hdif; - double BSIM3ldif; - double BSIM3ld; - double BSIM3rd; - double BSIM3rs; - double BSIM3rdc; - double BSIM3rsc; - double BSIM3wmlt; - - /* Length Dependence */ - double BSIM3lcdsc; - double BSIM3lcdscb; - double BSIM3lcdscd; - double BSIM3lcit; - double BSIM3lnfactor; - double BSIM3lxj; - double BSIM3lvsat; - double BSIM3lat; - double BSIM3la0; - double BSIM3lags; - double BSIM3la1; - double BSIM3la2; - double BSIM3lketa; - double BSIM3lnsub; - double BSIM3lnpeak; - double BSIM3lngate; - double BSIM3lgamma1; - double BSIM3lgamma2; - double BSIM3lvbx; - double BSIM3lvbm; - double BSIM3lxt; - double BSIM3lk1; - double BSIM3lkt1; - double BSIM3lkt1l; - double BSIM3lkt2; - double BSIM3lk2; - double BSIM3lk3; - double BSIM3lk3b; - double BSIM3lw0; - double BSIM3lnlx; - double BSIM3ldvt0; - double BSIM3ldvt1; - double BSIM3ldvt2; - double BSIM3ldvt0w; - double BSIM3ldvt1w; - double BSIM3ldvt2w; - double BSIM3ldrout; - double BSIM3ldsub; - double BSIM3lvth0; - double BSIM3lua; - double BSIM3lua1; - double BSIM3lub; - double BSIM3lub1; - double BSIM3luc; - double BSIM3luc1; - double BSIM3lu0; - double BSIM3lute; - double BSIM3lvoff; - double BSIM3ldelta; - double BSIM3lrdsw; - double BSIM3lprwg; - double BSIM3lprwb; - double BSIM3lprt; - double BSIM3leta0; - double BSIM3letab; - double BSIM3lpclm; - double BSIM3lpdibl1; - double BSIM3lpdibl2; - double BSIM3lpdiblb; - double BSIM3lpscbe1; - double BSIM3lpscbe2; - double BSIM3lpvag; - double BSIM3lwr; - double BSIM3ldwg; - double BSIM3ldwb; - double BSIM3lb0; - double BSIM3lb1; - double BSIM3lalpha0; - double BSIM3lalpha1; - double BSIM3lbeta0; - double BSIM3lvfb; - - /* CV model */ - double BSIM3lelm; - double BSIM3lcgsl; - double BSIM3lcgdl; - double BSIM3lckappa; - double BSIM3lcf; - double BSIM3lclc; - double BSIM3lcle; - double BSIM3lvfbcv; - double BSIM3lnoff; - double BSIM3lvoffcv; - double BSIM3lacde; - double BSIM3lmoin; - - /* Width Dependence */ - double BSIM3wcdsc; - double BSIM3wcdscb; - double BSIM3wcdscd; - double BSIM3wcit; - double BSIM3wnfactor; - double BSIM3wxj; - double BSIM3wvsat; - double BSIM3wat; - double BSIM3wa0; - double BSIM3wags; - double BSIM3wa1; - double BSIM3wa2; - double BSIM3wketa; - double BSIM3wnsub; - double BSIM3wnpeak; - double BSIM3wngate; - double BSIM3wgamma1; - double BSIM3wgamma2; - double BSIM3wvbx; - double BSIM3wvbm; - double BSIM3wxt; - double BSIM3wk1; - double BSIM3wkt1; - double BSIM3wkt1l; - double BSIM3wkt2; - double BSIM3wk2; - double BSIM3wk3; - double BSIM3wk3b; - double BSIM3ww0; - double BSIM3wnlx; - double BSIM3wdvt0; - double BSIM3wdvt1; - double BSIM3wdvt2; - double BSIM3wdvt0w; - double BSIM3wdvt1w; - double BSIM3wdvt2w; - double BSIM3wdrout; - double BSIM3wdsub; - double BSIM3wvth0; - double BSIM3wua; - double BSIM3wua1; - double BSIM3wub; - double BSIM3wub1; - double BSIM3wuc; - double BSIM3wuc1; - double BSIM3wu0; - double BSIM3wute; - double BSIM3wvoff; - double BSIM3wdelta; - double BSIM3wrdsw; - double BSIM3wprwg; - double BSIM3wprwb; - double BSIM3wprt; - double BSIM3weta0; - double BSIM3wetab; - double BSIM3wpclm; - double BSIM3wpdibl1; - double BSIM3wpdibl2; - double BSIM3wpdiblb; - double BSIM3wpscbe1; - double BSIM3wpscbe2; - double BSIM3wpvag; - double BSIM3wwr; - double BSIM3wdwg; - double BSIM3wdwb; - double BSIM3wb0; - double BSIM3wb1; - double BSIM3walpha0; - double BSIM3walpha1; - double BSIM3wbeta0; - double BSIM3wvfb; - - /* CV model */ - double BSIM3welm; - double BSIM3wcgsl; - double BSIM3wcgdl; - double BSIM3wckappa; - double BSIM3wcf; - double BSIM3wclc; - double BSIM3wcle; - double BSIM3wvfbcv; - double BSIM3wnoff; - double BSIM3wvoffcv; - double BSIM3wacde; - double BSIM3wmoin; - - /* Cross-term Dependence */ - double BSIM3pcdsc; - double BSIM3pcdscb; - double BSIM3pcdscd; - double BSIM3pcit; - double BSIM3pnfactor; - double BSIM3pxj; - double BSIM3pvsat; - double BSIM3pat; - double BSIM3pa0; - double BSIM3pags; - double BSIM3pa1; - double BSIM3pa2; - double BSIM3pketa; - double BSIM3pnsub; - double BSIM3pnpeak; - double BSIM3pngate; - double BSIM3pgamma1; - double BSIM3pgamma2; - double BSIM3pvbx; - double BSIM3pvbm; - double BSIM3pxt; - double BSIM3pk1; - double BSIM3pkt1; - double BSIM3pkt1l; - double BSIM3pkt2; - double BSIM3pk2; - double BSIM3pk3; - double BSIM3pk3b; - double BSIM3pw0; - double BSIM3pnlx; - double BSIM3pdvt0; - double BSIM3pdvt1; - double BSIM3pdvt2; - double BSIM3pdvt0w; - double BSIM3pdvt1w; - double BSIM3pdvt2w; - double BSIM3pdrout; - double BSIM3pdsub; - double BSIM3pvth0; - double BSIM3pua; - double BSIM3pua1; - double BSIM3pub; - double BSIM3pub1; - double BSIM3puc; - double BSIM3puc1; - double BSIM3pu0; - double BSIM3pute; - double BSIM3pvoff; - double BSIM3pdelta; - double BSIM3prdsw; - double BSIM3pprwg; - double BSIM3pprwb; - double BSIM3pprt; - double BSIM3peta0; - double BSIM3petab; - double BSIM3ppclm; - double BSIM3ppdibl1; - double BSIM3ppdibl2; - double BSIM3ppdiblb; - double BSIM3ppscbe1; - double BSIM3ppscbe2; - double BSIM3ppvag; - double BSIM3pwr; - double BSIM3pdwg; - double BSIM3pdwb; - double BSIM3pb0; - double BSIM3pb1; - double BSIM3palpha0; - double BSIM3palpha1; - double BSIM3pbeta0; - double BSIM3pvfb; - - /* CV model */ - double BSIM3pelm; - double BSIM3pcgsl; - double BSIM3pcgdl; - double BSIM3pckappa; - double BSIM3pcf; - double BSIM3pclc; - double BSIM3pcle; - double BSIM3pvfbcv; - double BSIM3pnoff; - double BSIM3pvoffcv; - double BSIM3pacde; - double BSIM3pmoin; - - double BSIM3tnom; - double BSIM3cgso; - double BSIM3cgdo; - double BSIM3cgbo; - double BSIM3xpart; - double BSIM3cFringOut; - double BSIM3cFringMax; - - double BSIM3sheetResistance; - double BSIM3jctSatCurDensity; - double BSIM3jctSidewallSatCurDensity; - double BSIM3bulkJctPotential; - double BSIM3bulkJctBotGradingCoeff; - double BSIM3bulkJctSideGradingCoeff; - double BSIM3bulkJctGateSideGradingCoeff; - double BSIM3sidewallJctPotential; - double BSIM3GatesidewallJctPotential; - double BSIM3unitAreaJctCap; - double BSIM3unitLengthSidewallJctCap; - double BSIM3unitLengthGateSidewallJctCap; - double BSIM3jctEmissionCoeff; - double BSIM3jctTempExponent; - - double BSIM3Lint; - double BSIM3Ll; - double BSIM3Llc; - double BSIM3Lln; - double BSIM3Lw; - double BSIM3Lwc; - double BSIM3Lwn; - double BSIM3Lwl; - double BSIM3Lwlc; - double BSIM3Lmin; - double BSIM3Lmax; - - double BSIM3Wint; - double BSIM3Wl; - double BSIM3Wlc; - double BSIM3Wln; - double BSIM3Ww; - double BSIM3Wwc; - double BSIM3Wwn; - double BSIM3Wwl; - double BSIM3Wwlc; - double BSIM3Wmin; - double BSIM3Wmax; - - -/* Pre-calculated constants */ - /* MCJ: move to size-dependent param. */ - double BSIM3vtm; - double BSIM3cox; - double BSIM3cof1; - double BSIM3cof2; - double BSIM3cof3; - double BSIM3cof4; - double BSIM3vcrit; - double BSIM3factor1; - double BSIM3PhiB; - double BSIM3PhiBSW; - double BSIM3PhiBSWG; - double BSIM3jctTempSatCurDensity; - double BSIM3jctSidewallTempSatCurDensity; - double BSIM3unitAreaTempJctCap; - double BSIM3unitLengthSidewallTempJctCap; - double BSIM3unitLengthGateSidewallTempJctCap; - - double BSIM3oxideTrapDensityA; - double BSIM3oxideTrapDensityB; - double BSIM3oxideTrapDensityC; - double BSIM3em; - double BSIM3ef; - double BSIM3af; - double BSIM3kf; - double BSIM3lintnoi; /* lint offset for noise calculation */ - - double BSIM3vgsMax; - double BSIM3vgdMax; - double BSIM3vgbMax; - double BSIM3vdsMax; - double BSIM3vbsMax; - double BSIM3vbdMax; - double BSIM3vgsrMax; - double BSIM3vgdrMax; - double BSIM3vgbrMax; - double BSIM3vbsrMax; - double BSIM3vbdrMax; - - struct bsim3SizeDependParam *pSizeDependParamKnot; - - -#ifdef USE_OMP - int BSIM3InstCount; - struct sBSIM3instance **BSIM3InstanceArray; -#endif - - /* Flags */ - unsigned BSIM3mobModGiven :1; - unsigned BSIM3binUnitGiven :1; - unsigned BSIM3capModGiven :1; - unsigned BSIM3acmModGiven :1; - unsigned BSIM3calcacmGiven :1; - unsigned BSIM3paramChkGiven :1; - unsigned BSIM3noiModGiven :1; - unsigned BSIM3nqsModGiven :1; - unsigned BSIM3acnqsModGiven :1; - unsigned BSIM3typeGiven :1; - unsigned BSIM3toxGiven :1; - unsigned BSIM3versionGiven :1; - unsigned BSIM3toxmGiven :1; - unsigned BSIM3cdscGiven :1; - unsigned BSIM3cdscbGiven :1; - unsigned BSIM3cdscdGiven :1; - unsigned BSIM3citGiven :1; - unsigned BSIM3nfactorGiven :1; - unsigned BSIM3xjGiven :1; - unsigned BSIM3vsatGiven :1; - unsigned BSIM3atGiven :1; - unsigned BSIM3a0Given :1; - unsigned BSIM3agsGiven :1; - unsigned BSIM3a1Given :1; - unsigned BSIM3a2Given :1; - unsigned BSIM3ketaGiven :1; - unsigned BSIM3nsubGiven :1; - unsigned BSIM3npeakGiven :1; - unsigned BSIM3ngateGiven :1; - unsigned BSIM3gamma1Given :1; - unsigned BSIM3gamma2Given :1; - unsigned BSIM3vbxGiven :1; - unsigned BSIM3vbmGiven :1; - unsigned BSIM3xtGiven :1; - unsigned BSIM3k1Given :1; - unsigned BSIM3kt1Given :1; - unsigned BSIM3kt1lGiven :1; - unsigned BSIM3kt2Given :1; - unsigned BSIM3k2Given :1; - unsigned BSIM3k3Given :1; - unsigned BSIM3k3bGiven :1; - unsigned BSIM3w0Given :1; - unsigned BSIM3nlxGiven :1; - unsigned BSIM3dvt0Given :1; - unsigned BSIM3dvt1Given :1; - unsigned BSIM3dvt2Given :1; - unsigned BSIM3dvt0wGiven :1; - unsigned BSIM3dvt1wGiven :1; - unsigned BSIM3dvt2wGiven :1; - unsigned BSIM3droutGiven :1; - unsigned BSIM3dsubGiven :1; - unsigned BSIM3vth0Given :1; - unsigned BSIM3uaGiven :1; - unsigned BSIM3ua1Given :1; - unsigned BSIM3ubGiven :1; - unsigned BSIM3ub1Given :1; - unsigned BSIM3ucGiven :1; - unsigned BSIM3uc1Given :1; - unsigned BSIM3u0Given :1; - unsigned BSIM3uteGiven :1; - unsigned BSIM3voffGiven :1; - unsigned BSIM3rdswGiven :1; - unsigned BSIM3prwgGiven :1; - unsigned BSIM3prwbGiven :1; - unsigned BSIM3prtGiven :1; - unsigned BSIM3eta0Given :1; - unsigned BSIM3etabGiven :1; - unsigned BSIM3pclmGiven :1; - unsigned BSIM3pdibl1Given :1; - unsigned BSIM3pdibl2Given :1; - unsigned BSIM3pdiblbGiven :1; - unsigned BSIM3pscbe1Given :1; - unsigned BSIM3pscbe2Given :1; - unsigned BSIM3pvagGiven :1; - unsigned BSIM3deltaGiven :1; - unsigned BSIM3wrGiven :1; - unsigned BSIM3dwgGiven :1; - unsigned BSIM3dwbGiven :1; - unsigned BSIM3b0Given :1; - unsigned BSIM3b1Given :1; - unsigned BSIM3alpha0Given :1; - unsigned BSIM3alpha1Given :1; - unsigned BSIM3beta0Given :1; - unsigned BSIM3ijthGiven :1; - unsigned BSIM3vfbGiven :1; - - /* CV model */ - unsigned BSIM3elmGiven :1; - unsigned BSIM3cgslGiven :1; - unsigned BSIM3cgdlGiven :1; - unsigned BSIM3ckappaGiven :1; - unsigned BSIM3cfGiven :1; - unsigned BSIM3vfbcvGiven :1; - unsigned BSIM3clcGiven :1; - unsigned BSIM3cleGiven :1; - unsigned BSIM3dwcGiven :1; - unsigned BSIM3dlcGiven :1; - unsigned BSIM3noffGiven :1; - unsigned BSIM3voffcvGiven :1; - unsigned BSIM3acdeGiven :1; - unsigned BSIM3moinGiven :1; - unsigned BSIM3tcjGiven :1; - unsigned BSIM3tcjswGiven :1; - unsigned BSIM3tcjswgGiven :1; - unsigned BSIM3tpbGiven :1; - unsigned BSIM3tpbswGiven :1; - unsigned BSIM3tpbswgGiven :1; - - /* ACM model */ - unsigned BSIM3xlGiven :1; - unsigned BSIM3xwGiven :1; - unsigned BSIM3hdifGiven :1; - unsigned BSIM3ldifGiven :1; - unsigned BSIM3ldGiven :1; - unsigned BSIM3rdGiven :1; - unsigned BSIM3rsGiven :1; - unsigned BSIM3rdcGiven :1; - unsigned BSIM3rscGiven :1; - unsigned BSIM3wmltGiven :1; - - /* Length dependence */ - unsigned BSIM3lcdscGiven :1; - unsigned BSIM3lcdscbGiven :1; - unsigned BSIM3lcdscdGiven :1; - unsigned BSIM3lcitGiven :1; - unsigned BSIM3lnfactorGiven :1; - unsigned BSIM3lxjGiven :1; - unsigned BSIM3lvsatGiven :1; - unsigned BSIM3latGiven :1; - unsigned BSIM3la0Given :1; - unsigned BSIM3lagsGiven :1; - unsigned BSIM3la1Given :1; - unsigned BSIM3la2Given :1; - unsigned BSIM3lketaGiven :1; - unsigned BSIM3lnsubGiven :1; - unsigned BSIM3lnpeakGiven :1; - unsigned BSIM3lngateGiven :1; - unsigned BSIM3lgamma1Given :1; - unsigned BSIM3lgamma2Given :1; - unsigned BSIM3lvbxGiven :1; - unsigned BSIM3lvbmGiven :1; - unsigned BSIM3lxtGiven :1; - unsigned BSIM3lk1Given :1; - unsigned BSIM3lkt1Given :1; - unsigned BSIM3lkt1lGiven :1; - unsigned BSIM3lkt2Given :1; - unsigned BSIM3lk2Given :1; - unsigned BSIM3lk3Given :1; - unsigned BSIM3lk3bGiven :1; - unsigned BSIM3lw0Given :1; - unsigned BSIM3lnlxGiven :1; - unsigned BSIM3ldvt0Given :1; - unsigned BSIM3ldvt1Given :1; - unsigned BSIM3ldvt2Given :1; - unsigned BSIM3ldvt0wGiven :1; - unsigned BSIM3ldvt1wGiven :1; - unsigned BSIM3ldvt2wGiven :1; - unsigned BSIM3ldroutGiven :1; - unsigned BSIM3ldsubGiven :1; - unsigned BSIM3lvth0Given :1; - unsigned BSIM3luaGiven :1; - unsigned BSIM3lua1Given :1; - unsigned BSIM3lubGiven :1; - unsigned BSIM3lub1Given :1; - unsigned BSIM3lucGiven :1; - unsigned BSIM3luc1Given :1; - unsigned BSIM3lu0Given :1; - unsigned BSIM3luteGiven :1; - unsigned BSIM3lvoffGiven :1; - unsigned BSIM3lrdswGiven :1; - unsigned BSIM3lprwgGiven :1; - unsigned BSIM3lprwbGiven :1; - unsigned BSIM3lprtGiven :1; - unsigned BSIM3leta0Given :1; - unsigned BSIM3letabGiven :1; - unsigned BSIM3lpclmGiven :1; - unsigned BSIM3lpdibl1Given :1; - unsigned BSIM3lpdibl2Given :1; - unsigned BSIM3lpdiblbGiven :1; - unsigned BSIM3lpscbe1Given :1; - unsigned BSIM3lpscbe2Given :1; - unsigned BSIM3lpvagGiven :1; - unsigned BSIM3ldeltaGiven :1; - unsigned BSIM3lwrGiven :1; - unsigned BSIM3ldwgGiven :1; - unsigned BSIM3ldwbGiven :1; - unsigned BSIM3lb0Given :1; - unsigned BSIM3lb1Given :1; - unsigned BSIM3lalpha0Given :1; - unsigned BSIM3lalpha1Given :1; - unsigned BSIM3lbeta0Given :1; - unsigned BSIM3lvfbGiven :1; - - /* CV model */ - unsigned BSIM3lelmGiven :1; - unsigned BSIM3lcgslGiven :1; - unsigned BSIM3lcgdlGiven :1; - unsigned BSIM3lckappaGiven :1; - unsigned BSIM3lcfGiven :1; - unsigned BSIM3lclcGiven :1; - unsigned BSIM3lcleGiven :1; - unsigned BSIM3lvfbcvGiven :1; - unsigned BSIM3lnoffGiven :1; - unsigned BSIM3lvoffcvGiven :1; - unsigned BSIM3lacdeGiven :1; - unsigned BSIM3lmoinGiven :1; - - /* Width dependence */ - unsigned BSIM3wcdscGiven :1; - unsigned BSIM3wcdscbGiven :1; - unsigned BSIM3wcdscdGiven :1; - unsigned BSIM3wcitGiven :1; - unsigned BSIM3wnfactorGiven :1; - unsigned BSIM3wxjGiven :1; - unsigned BSIM3wvsatGiven :1; - unsigned BSIM3watGiven :1; - unsigned BSIM3wa0Given :1; - unsigned BSIM3wagsGiven :1; - unsigned BSIM3wa1Given :1; - unsigned BSIM3wa2Given :1; - unsigned BSIM3wketaGiven :1; - unsigned BSIM3wnsubGiven :1; - unsigned BSIM3wnpeakGiven :1; - unsigned BSIM3wngateGiven :1; - unsigned BSIM3wgamma1Given :1; - unsigned BSIM3wgamma2Given :1; - unsigned BSIM3wvbxGiven :1; - unsigned BSIM3wvbmGiven :1; - unsigned BSIM3wxtGiven :1; - unsigned BSIM3wk1Given :1; - unsigned BSIM3wkt1Given :1; - unsigned BSIM3wkt1lGiven :1; - unsigned BSIM3wkt2Given :1; - unsigned BSIM3wk2Given :1; - unsigned BSIM3wk3Given :1; - unsigned BSIM3wk3bGiven :1; - unsigned BSIM3ww0Given :1; - unsigned BSIM3wnlxGiven :1; - unsigned BSIM3wdvt0Given :1; - unsigned BSIM3wdvt1Given :1; - unsigned BSIM3wdvt2Given :1; - unsigned BSIM3wdvt0wGiven :1; - unsigned BSIM3wdvt1wGiven :1; - unsigned BSIM3wdvt2wGiven :1; - unsigned BSIM3wdroutGiven :1; - unsigned BSIM3wdsubGiven :1; - unsigned BSIM3wvth0Given :1; - unsigned BSIM3wuaGiven :1; - unsigned BSIM3wua1Given :1; - unsigned BSIM3wubGiven :1; - unsigned BSIM3wub1Given :1; - unsigned BSIM3wucGiven :1; - unsigned BSIM3wuc1Given :1; - unsigned BSIM3wu0Given :1; - unsigned BSIM3wuteGiven :1; - unsigned BSIM3wvoffGiven :1; - unsigned BSIM3wrdswGiven :1; - unsigned BSIM3wprwgGiven :1; - unsigned BSIM3wprwbGiven :1; - unsigned BSIM3wprtGiven :1; - unsigned BSIM3weta0Given :1; - unsigned BSIM3wetabGiven :1; - unsigned BSIM3wpclmGiven :1; - unsigned BSIM3wpdibl1Given :1; - unsigned BSIM3wpdibl2Given :1; - unsigned BSIM3wpdiblbGiven :1; - unsigned BSIM3wpscbe1Given :1; - unsigned BSIM3wpscbe2Given :1; - unsigned BSIM3wpvagGiven :1; - unsigned BSIM3wdeltaGiven :1; - unsigned BSIM3wwrGiven :1; - unsigned BSIM3wdwgGiven :1; - unsigned BSIM3wdwbGiven :1; - unsigned BSIM3wb0Given :1; - unsigned BSIM3wb1Given :1; - unsigned BSIM3walpha0Given :1; - unsigned BSIM3walpha1Given :1; - unsigned BSIM3wbeta0Given :1; - unsigned BSIM3wvfbGiven :1; - - /* CV model */ - unsigned BSIM3welmGiven :1; - unsigned BSIM3wcgslGiven :1; - unsigned BSIM3wcgdlGiven :1; - unsigned BSIM3wckappaGiven :1; - unsigned BSIM3wcfGiven :1; - unsigned BSIM3wclcGiven :1; - unsigned BSIM3wcleGiven :1; - unsigned BSIM3wvfbcvGiven :1; - unsigned BSIM3wnoffGiven :1; - unsigned BSIM3wvoffcvGiven :1; - unsigned BSIM3wacdeGiven :1; - unsigned BSIM3wmoinGiven :1; - - /* Cross-term dependence */ - unsigned BSIM3pcdscGiven :1; - unsigned BSIM3pcdscbGiven :1; - unsigned BSIM3pcdscdGiven :1; - unsigned BSIM3pcitGiven :1; - unsigned BSIM3pnfactorGiven :1; - unsigned BSIM3pxjGiven :1; - unsigned BSIM3pvsatGiven :1; - unsigned BSIM3patGiven :1; - unsigned BSIM3pa0Given :1; - unsigned BSIM3pagsGiven :1; - unsigned BSIM3pa1Given :1; - unsigned BSIM3pa2Given :1; - unsigned BSIM3pketaGiven :1; - unsigned BSIM3pnsubGiven :1; - unsigned BSIM3pnpeakGiven :1; - unsigned BSIM3pngateGiven :1; - unsigned BSIM3pgamma1Given :1; - unsigned BSIM3pgamma2Given :1; - unsigned BSIM3pvbxGiven :1; - unsigned BSIM3pvbmGiven :1; - unsigned BSIM3pxtGiven :1; - unsigned BSIM3pk1Given :1; - unsigned BSIM3pkt1Given :1; - unsigned BSIM3pkt1lGiven :1; - unsigned BSIM3pkt2Given :1; - unsigned BSIM3pk2Given :1; - unsigned BSIM3pk3Given :1; - unsigned BSIM3pk3bGiven :1; - unsigned BSIM3pw0Given :1; - unsigned BSIM3pnlxGiven :1; - unsigned BSIM3pdvt0Given :1; - unsigned BSIM3pdvt1Given :1; - unsigned BSIM3pdvt2Given :1; - unsigned BSIM3pdvt0wGiven :1; - unsigned BSIM3pdvt1wGiven :1; - unsigned BSIM3pdvt2wGiven :1; - unsigned BSIM3pdroutGiven :1; - unsigned BSIM3pdsubGiven :1; - unsigned BSIM3pvth0Given :1; - unsigned BSIM3puaGiven :1; - unsigned BSIM3pua1Given :1; - unsigned BSIM3pubGiven :1; - unsigned BSIM3pub1Given :1; - unsigned BSIM3pucGiven :1; - unsigned BSIM3puc1Given :1; - unsigned BSIM3pu0Given :1; - unsigned BSIM3puteGiven :1; - unsigned BSIM3pvoffGiven :1; - unsigned BSIM3prdswGiven :1; - unsigned BSIM3pprwgGiven :1; - unsigned BSIM3pprwbGiven :1; - unsigned BSIM3pprtGiven :1; - unsigned BSIM3peta0Given :1; - unsigned BSIM3petabGiven :1; - unsigned BSIM3ppclmGiven :1; - unsigned BSIM3ppdibl1Given :1; - unsigned BSIM3ppdibl2Given :1; - unsigned BSIM3ppdiblbGiven :1; - unsigned BSIM3ppscbe1Given :1; - unsigned BSIM3ppscbe2Given :1; - unsigned BSIM3ppvagGiven :1; - unsigned BSIM3pdeltaGiven :1; - unsigned BSIM3pwrGiven :1; - unsigned BSIM3pdwgGiven :1; - unsigned BSIM3pdwbGiven :1; - unsigned BSIM3pb0Given :1; - unsigned BSIM3pb1Given :1; - unsigned BSIM3palpha0Given :1; - unsigned BSIM3palpha1Given :1; - unsigned BSIM3pbeta0Given :1; - unsigned BSIM3pvfbGiven :1; - - /* CV model */ - unsigned BSIM3pelmGiven :1; - unsigned BSIM3pcgslGiven :1; - unsigned BSIM3pcgdlGiven :1; - unsigned BSIM3pckappaGiven :1; - unsigned BSIM3pcfGiven :1; - unsigned BSIM3pclcGiven :1; - unsigned BSIM3pcleGiven :1; - unsigned BSIM3pvfbcvGiven :1; - unsigned BSIM3pnoffGiven :1; - unsigned BSIM3pvoffcvGiven :1; - unsigned BSIM3pacdeGiven :1; - unsigned BSIM3pmoinGiven :1; - - unsigned BSIM3useFringeGiven :1; - - unsigned BSIM3tnomGiven :1; - unsigned BSIM3cgsoGiven :1; - unsigned BSIM3cgdoGiven :1; - unsigned BSIM3cgboGiven :1; - unsigned BSIM3xpartGiven :1; - unsigned BSIM3sheetResistanceGiven :1; - unsigned BSIM3jctSatCurDensityGiven :1; - unsigned BSIM3jctSidewallSatCurDensityGiven :1; - unsigned BSIM3bulkJctPotentialGiven :1; - unsigned BSIM3bulkJctBotGradingCoeffGiven :1; - unsigned BSIM3sidewallJctPotentialGiven :1; - unsigned BSIM3GatesidewallJctPotentialGiven :1; - unsigned BSIM3bulkJctSideGradingCoeffGiven :1; - unsigned BSIM3unitAreaJctCapGiven :1; - unsigned BSIM3unitLengthSidewallJctCapGiven :1; - unsigned BSIM3bulkJctGateSideGradingCoeffGiven :1; - unsigned BSIM3unitLengthGateSidewallJctCapGiven :1; - unsigned BSIM3jctEmissionCoeffGiven :1; - unsigned BSIM3jctTempExponentGiven :1; - - unsigned BSIM3oxideTrapDensityAGiven :1; - unsigned BSIM3oxideTrapDensityBGiven :1; - unsigned BSIM3oxideTrapDensityCGiven :1; - unsigned BSIM3emGiven :1; - unsigned BSIM3efGiven :1; - unsigned BSIM3afGiven :1; - unsigned BSIM3kfGiven :1; - unsigned BSIM3lintnoiGiven :1; - - unsigned BSIM3vgsMaxGiven :1; - unsigned BSIM3vgdMaxGiven :1; - unsigned BSIM3vgbMaxGiven :1; - unsigned BSIM3vdsMaxGiven :1; - unsigned BSIM3vbsMaxGiven :1; - unsigned BSIM3vbdMaxGiven :1; - unsigned BSIM3vgsrMaxGiven :1; - unsigned BSIM3vgdrMaxGiven :1; - unsigned BSIM3vgbrMaxGiven :1; - unsigned BSIM3vbsrMaxGiven :1; - unsigned BSIM3vbdrMaxGiven :1; - - unsigned BSIM3LintGiven :1; - unsigned BSIM3LlGiven :1; - unsigned BSIM3LlcGiven :1; - unsigned BSIM3LlnGiven :1; - unsigned BSIM3LwGiven :1; - unsigned BSIM3LwcGiven :1; - unsigned BSIM3LwnGiven :1; - unsigned BSIM3LwlGiven :1; - unsigned BSIM3LwlcGiven :1; - unsigned BSIM3LminGiven :1; - unsigned BSIM3LmaxGiven :1; - - unsigned BSIM3WintGiven :1; - unsigned BSIM3WlGiven :1; - unsigned BSIM3WlcGiven :1; - unsigned BSIM3WlnGiven :1; - unsigned BSIM3WwGiven :1; - unsigned BSIM3WwcGiven :1; - unsigned BSIM3WwnGiven :1; - unsigned BSIM3WwlGiven :1; - unsigned BSIM3WwlcGiven :1; - unsigned BSIM3WminGiven :1; - unsigned BSIM3WmaxGiven :1; - -} BSIM3model; - - -#ifndef NMOS -#define NMOS 1 -#define PMOS -1 -#endif /*NMOS*/ - - -/* device parameters */ -#define BSIM3_W 1 -#define BSIM3_L 2 -#define BSIM3_AS 3 -#define BSIM3_AD 4 -#define BSIM3_PS 5 -#define BSIM3_PD 6 -#define BSIM3_NRS 7 -#define BSIM3_NRD 8 -#define BSIM3_OFF 9 -#define BSIM3_IC_VBS 10 -#define BSIM3_IC_VDS 11 -#define BSIM3_IC_VGS 12 -#define BSIM3_IC 13 -#define BSIM3_NQSMOD 14 -#define BSIM3_ACNQSMOD 15 -#define BSIM3_M 16 -#define BSIM3_DELVTO 17 -#define BSIM3_MULU0 18 -#define BSIM3_GEO 19 - -/* model parameters */ -#define BSIM3_MOD_CAPMOD 100 -#define BSIM3_MOD_ACMMOD 101 -#define BSIM3_MOD_CALCACM 102 -#define BSIM3_MOD_MOBMOD 103 -#define BSIM3_MOD_NOIMOD 104 - -#define BSIM3_MOD_TOX 105 - -#define BSIM3_MOD_CDSC 106 -#define BSIM3_MOD_CDSCB 107 -#define BSIM3_MOD_CIT 108 -#define BSIM3_MOD_NFACTOR 109 -#define BSIM3_MOD_XJ 110 -#define BSIM3_MOD_VSAT 111 -#define BSIM3_MOD_AT 112 -#define BSIM3_MOD_A0 113 -#define BSIM3_MOD_A1 114 -#define BSIM3_MOD_A2 115 -#define BSIM3_MOD_KETA 116 -#define BSIM3_MOD_NSUB 117 -#define BSIM3_MOD_NPEAK 118 -#define BSIM3_MOD_NGATE 120 -#define BSIM3_MOD_GAMMA1 121 -#define BSIM3_MOD_GAMMA2 122 -#define BSIM3_MOD_VBX 123 -#define BSIM3_MOD_BINUNIT 124 - -#define BSIM3_MOD_VBM 125 - -#define BSIM3_MOD_XT 126 -#define BSIM3_MOD_K1 129 -#define BSIM3_MOD_KT1 130 -#define BSIM3_MOD_KT1L 131 -#define BSIM3_MOD_K2 132 -#define BSIM3_MOD_KT2 133 -#define BSIM3_MOD_K3 134 -#define BSIM3_MOD_K3B 135 -#define BSIM3_MOD_W0 136 -#define BSIM3_MOD_NLX 137 - -#define BSIM3_MOD_DVT0 138 -#define BSIM3_MOD_DVT1 139 -#define BSIM3_MOD_DVT2 140 - -#define BSIM3_MOD_DVT0W 141 -#define BSIM3_MOD_DVT1W 142 -#define BSIM3_MOD_DVT2W 143 - -#define BSIM3_MOD_DROUT 144 -#define BSIM3_MOD_DSUB 145 -#define BSIM3_MOD_VTH0 146 -#define BSIM3_MOD_UA 147 -#define BSIM3_MOD_UA1 148 -#define BSIM3_MOD_UB 149 -#define BSIM3_MOD_UB1 150 -#define BSIM3_MOD_UC 151 -#define BSIM3_MOD_UC1 152 -#define BSIM3_MOD_U0 153 -#define BSIM3_MOD_UTE 154 -#define BSIM3_MOD_VOFF 155 -#define BSIM3_MOD_DELTA 156 -#define BSIM3_MOD_RDSW 157 -#define BSIM3_MOD_PRT 158 -#define BSIM3_MOD_LDD 159 -#define BSIM3_MOD_ETA 160 -#define BSIM3_MOD_ETA0 161 -#define BSIM3_MOD_ETAB 162 -#define BSIM3_MOD_PCLM 163 -#define BSIM3_MOD_PDIBL1 164 -#define BSIM3_MOD_PDIBL2 165 -#define BSIM3_MOD_PSCBE1 166 -#define BSIM3_MOD_PSCBE2 167 -#define BSIM3_MOD_PVAG 168 -#define BSIM3_MOD_WR 169 -#define BSIM3_MOD_DWG 170 -#define BSIM3_MOD_DWB 171 -#define BSIM3_MOD_B0 172 -#define BSIM3_MOD_B1 173 -#define BSIM3_MOD_ALPHA0 174 -#define BSIM3_MOD_BETA0 175 -#define BSIM3_MOD_PDIBLB 178 - -#define BSIM3_MOD_PRWG 179 -#define BSIM3_MOD_PRWB 180 - -#define BSIM3_MOD_CDSCD 181 -#define BSIM3_MOD_AGS 182 - -#define BSIM3_MOD_FRINGE 184 -#define BSIM3_MOD_ELM 185 -#define BSIM3_MOD_CGSL 186 -#define BSIM3_MOD_CGDL 187 -#define BSIM3_MOD_CKAPPA 188 -#define BSIM3_MOD_CF 189 -#define BSIM3_MOD_CLC 190 -#define BSIM3_MOD_CLE 191 -#define BSIM3_MOD_PARAMCHK 192 -#define BSIM3_MOD_VERSION 193 -#define BSIM3_MOD_VFBCV 194 -#define BSIM3_MOD_ACDE 195 -#define BSIM3_MOD_MOIN 196 -#define BSIM3_MOD_NOFF 197 -#define BSIM3_MOD_IJTH 198 -#define BSIM3_MOD_ALPHA1 199 -#define BSIM3_MOD_VFB 200 -#define BSIM3_MOD_TOXM 201 -#define BSIM3_MOD_TCJ 202 -#define BSIM3_MOD_TCJSW 203 -#define BSIM3_MOD_TCJSWG 204 -#define BSIM3_MOD_TPB 205 -#define BSIM3_MOD_TPBSW 206 -#define BSIM3_MOD_TPBSWG 207 -#define BSIM3_MOD_VOFFCV 208 -#define BSIM3_MOD_LINTNOI 209 -#define BSIM3_MOD_NQSMOD 210 -#define BSIM3_MOD_ACNQSMOD 211 - -/* Length dependence */ -#define BSIM3_MOD_LCDSC 251 -#define BSIM3_MOD_LCDSCB 252 -#define BSIM3_MOD_LCIT 253 -#define BSIM3_MOD_LNFACTOR 254 -#define BSIM3_MOD_LXJ 255 -#define BSIM3_MOD_LVSAT 256 -#define BSIM3_MOD_LAT 257 -#define BSIM3_MOD_LA0 258 -#define BSIM3_MOD_LA1 259 -#define BSIM3_MOD_LA2 260 -#define BSIM3_MOD_LKETA 261 -#define BSIM3_MOD_LNSUB 262 -#define BSIM3_MOD_LNPEAK 263 -#define BSIM3_MOD_LNGATE 265 -#define BSIM3_MOD_LGAMMA1 266 -#define BSIM3_MOD_LGAMMA2 267 -#define BSIM3_MOD_LVBX 268 - -#define BSIM3_MOD_LVBM 270 - -#define BSIM3_MOD_LXT 272 -#define BSIM3_MOD_LK1 275 -#define BSIM3_MOD_LKT1 276 -#define BSIM3_MOD_LKT1L 277 -#define BSIM3_MOD_LK2 278 -#define BSIM3_MOD_LKT2 279 -#define BSIM3_MOD_LK3 280 -#define BSIM3_MOD_LK3B 281 -#define BSIM3_MOD_LW0 282 -#define BSIM3_MOD_LNLX 283 - -#define BSIM3_MOD_LDVT0 284 -#define BSIM3_MOD_LDVT1 285 -#define BSIM3_MOD_LDVT2 286 - -#define BSIM3_MOD_LDVT0W 287 -#define BSIM3_MOD_LDVT1W 288 -#define BSIM3_MOD_LDVT2W 289 - -#define BSIM3_MOD_LDROUT 290 -#define BSIM3_MOD_LDSUB 291 -#define BSIM3_MOD_LVTH0 292 -#define BSIM3_MOD_LUA 293 -#define BSIM3_MOD_LUA1 294 -#define BSIM3_MOD_LUB 295 -#define BSIM3_MOD_LUB1 296 -#define BSIM3_MOD_LUC 297 -#define BSIM3_MOD_LUC1 298 -#define BSIM3_MOD_LU0 299 -#define BSIM3_MOD_LUTE 300 -#define BSIM3_MOD_LVOFF 301 -#define BSIM3_MOD_LDELTA 302 -#define BSIM3_MOD_LRDSW 303 -#define BSIM3_MOD_LPRT 304 -#define BSIM3_MOD_LLDD 305 -#define BSIM3_MOD_LETA 306 -#define BSIM3_MOD_LETA0 307 -#define BSIM3_MOD_LETAB 308 -#define BSIM3_MOD_LPCLM 309 -#define BSIM3_MOD_LPDIBL1 310 -#define BSIM3_MOD_LPDIBL2 311 -#define BSIM3_MOD_LPSCBE1 312 -#define BSIM3_MOD_LPSCBE2 313 -#define BSIM3_MOD_LPVAG 314 -#define BSIM3_MOD_LWR 315 -#define BSIM3_MOD_LDWG 316 -#define BSIM3_MOD_LDWB 317 -#define BSIM3_MOD_LB0 318 -#define BSIM3_MOD_LB1 319 -#define BSIM3_MOD_LALPHA0 320 -#define BSIM3_MOD_LBETA0 321 -#define BSIM3_MOD_LPDIBLB 324 - -#define BSIM3_MOD_LPRWG 325 -#define BSIM3_MOD_LPRWB 326 - -#define BSIM3_MOD_LCDSCD 327 -#define BSIM3_MOD_LAGS 328 - - -#define BSIM3_MOD_LFRINGE 331 -#define BSIM3_MOD_LELM 332 -#define BSIM3_MOD_LCGSL 333 -#define BSIM3_MOD_LCGDL 334 -#define BSIM3_MOD_LCKAPPA 335 -#define BSIM3_MOD_LCF 336 -#define BSIM3_MOD_LCLC 337 -#define BSIM3_MOD_LCLE 338 -#define BSIM3_MOD_LVFBCV 339 -#define BSIM3_MOD_LACDE 340 -#define BSIM3_MOD_LMOIN 341 -#define BSIM3_MOD_LNOFF 342 -#define BSIM3_MOD_LALPHA1 344 -#define BSIM3_MOD_LVFB 345 -#define BSIM3_MOD_LVOFFCV 346 - -/* Width dependence */ -#define BSIM3_MOD_WCDSC 381 -#define BSIM3_MOD_WCDSCB 382 -#define BSIM3_MOD_WCIT 383 -#define BSIM3_MOD_WNFACTOR 384 -#define BSIM3_MOD_WXJ 385 -#define BSIM3_MOD_WVSAT 386 -#define BSIM3_MOD_WAT 387 -#define BSIM3_MOD_WA0 388 -#define BSIM3_MOD_WA1 389 -#define BSIM3_MOD_WA2 390 -#define BSIM3_MOD_WKETA 391 -#define BSIM3_MOD_WNSUB 392 -#define BSIM3_MOD_WNPEAK 393 -#define BSIM3_MOD_WNGATE 395 -#define BSIM3_MOD_WGAMMA1 396 -#define BSIM3_MOD_WGAMMA2 397 -#define BSIM3_MOD_WVBX 398 - -#define BSIM3_MOD_WVBM 400 - -#define BSIM3_MOD_WXT 402 -#define BSIM3_MOD_WK1 405 -#define BSIM3_MOD_WKT1 406 -#define BSIM3_MOD_WKT1L 407 -#define BSIM3_MOD_WK2 408 -#define BSIM3_MOD_WKT2 409 -#define BSIM3_MOD_WK3 410 -#define BSIM3_MOD_WK3B 411 -#define BSIM3_MOD_WW0 412 -#define BSIM3_MOD_WNLX 413 - -#define BSIM3_MOD_WDVT0 414 -#define BSIM3_MOD_WDVT1 415 -#define BSIM3_MOD_WDVT2 416 - -#define BSIM3_MOD_WDVT0W 417 -#define BSIM3_MOD_WDVT1W 418 -#define BSIM3_MOD_WDVT2W 419 - -#define BSIM3_MOD_WDROUT 420 -#define BSIM3_MOD_WDSUB 421 -#define BSIM3_MOD_WVTH0 422 -#define BSIM3_MOD_WUA 423 -#define BSIM3_MOD_WUA1 424 -#define BSIM3_MOD_WUB 425 -#define BSIM3_MOD_WUB1 426 -#define BSIM3_MOD_WUC 427 -#define BSIM3_MOD_WUC1 428 -#define BSIM3_MOD_WU0 429 -#define BSIM3_MOD_WUTE 430 -#define BSIM3_MOD_WVOFF 431 -#define BSIM3_MOD_WDELTA 432 -#define BSIM3_MOD_WRDSW 433 -#define BSIM3_MOD_WPRT 434 -#define BSIM3_MOD_WLDD 435 -#define BSIM3_MOD_WETA 436 -#define BSIM3_MOD_WETA0 437 -#define BSIM3_MOD_WETAB 438 -#define BSIM3_MOD_WPCLM 439 -#define BSIM3_MOD_WPDIBL1 440 -#define BSIM3_MOD_WPDIBL2 441 -#define BSIM3_MOD_WPSCBE1 442 -#define BSIM3_MOD_WPSCBE2 443 -#define BSIM3_MOD_WPVAG 444 -#define BSIM3_MOD_WWR 445 -#define BSIM3_MOD_WDWG 446 -#define BSIM3_MOD_WDWB 447 -#define BSIM3_MOD_WB0 448 -#define BSIM3_MOD_WB1 449 -#define BSIM3_MOD_WALPHA0 450 -#define BSIM3_MOD_WBETA0 451 -#define BSIM3_MOD_WPDIBLB 454 - -#define BSIM3_MOD_WPRWG 455 -#define BSIM3_MOD_WPRWB 456 - -#define BSIM3_MOD_WCDSCD 457 -#define BSIM3_MOD_WAGS 458 - - -#define BSIM3_MOD_WFRINGE 461 -#define BSIM3_MOD_WELM 462 -#define BSIM3_MOD_WCGSL 463 -#define BSIM3_MOD_WCGDL 464 -#define BSIM3_MOD_WCKAPPA 465 -#define BSIM3_MOD_WCF 466 -#define BSIM3_MOD_WCLC 467 -#define BSIM3_MOD_WCLE 468 -#define BSIM3_MOD_WVFBCV 469 -#define BSIM3_MOD_WACDE 470 -#define BSIM3_MOD_WMOIN 471 -#define BSIM3_MOD_WNOFF 472 -#define BSIM3_MOD_WALPHA1 474 -#define BSIM3_MOD_WVFB 475 -#define BSIM3_MOD_WVOFFCV 476 - -/* Cross-term dependence */ -#define BSIM3_MOD_PCDSC 511 -#define BSIM3_MOD_PCDSCB 512 -#define BSIM3_MOD_PCIT 513 -#define BSIM3_MOD_PNFACTOR 514 -#define BSIM3_MOD_PXJ 515 -#define BSIM3_MOD_PVSAT 516 -#define BSIM3_MOD_PAT 517 -#define BSIM3_MOD_PA0 518 -#define BSIM3_MOD_PA1 519 -#define BSIM3_MOD_PA2 520 -#define BSIM3_MOD_PKETA 521 -#define BSIM3_MOD_PNSUB 522 -#define BSIM3_MOD_PNPEAK 523 -#define BSIM3_MOD_PNGATE 525 -#define BSIM3_MOD_PGAMMA1 526 -#define BSIM3_MOD_PGAMMA2 527 -#define BSIM3_MOD_PVBX 528 - -#define BSIM3_MOD_PVBM 530 - -#define BSIM3_MOD_PXT 532 -#define BSIM3_MOD_PK1 535 -#define BSIM3_MOD_PKT1 536 -#define BSIM3_MOD_PKT1L 537 -#define BSIM3_MOD_PK2 538 -#define BSIM3_MOD_PKT2 539 -#define BSIM3_MOD_PK3 540 -#define BSIM3_MOD_PK3B 541 -#define BSIM3_MOD_PW0 542 -#define BSIM3_MOD_PNLX 543 - -#define BSIM3_MOD_PDVT0 544 -#define BSIM3_MOD_PDVT1 545 -#define BSIM3_MOD_PDVT2 546 - -#define BSIM3_MOD_PDVT0W 547 -#define BSIM3_MOD_PDVT1W 548 -#define BSIM3_MOD_PDVT2W 549 - -#define BSIM3_MOD_PDROUT 550 -#define BSIM3_MOD_PDSUB 551 -#define BSIM3_MOD_PVTH0 552 -#define BSIM3_MOD_PUA 553 -#define BSIM3_MOD_PUA1 554 -#define BSIM3_MOD_PUB 555 -#define BSIM3_MOD_PUB1 556 -#define BSIM3_MOD_PUC 557 -#define BSIM3_MOD_PUC1 558 -#define BSIM3_MOD_PU0 559 -#define BSIM3_MOD_PUTE 560 -#define BSIM3_MOD_PVOFF 561 -#define BSIM3_MOD_PDELTA 562 -#define BSIM3_MOD_PRDSW 563 -#define BSIM3_MOD_PPRT 564 -#define BSIM3_MOD_PLDD 565 -#define BSIM3_MOD_PETA 566 -#define BSIM3_MOD_PETA0 567 -#define BSIM3_MOD_PETAB 568 -#define BSIM3_MOD_PPCLM 569 -#define BSIM3_MOD_PPDIBL1 570 -#define BSIM3_MOD_PPDIBL2 571 -#define BSIM3_MOD_PPSCBE1 572 -#define BSIM3_MOD_PPSCBE2 573 -#define BSIM3_MOD_PPVAG 574 -#define BSIM3_MOD_PWR 575 -#define BSIM3_MOD_PDWG 576 -#define BSIM3_MOD_PDWB 577 -#define BSIM3_MOD_PB0 578 -#define BSIM3_MOD_PB1 579 -#define BSIM3_MOD_PALPHA0 580 -#define BSIM3_MOD_PBETA0 581 -#define BSIM3_MOD_PPDIBLB 584 - -#define BSIM3_MOD_PPRWG 585 -#define BSIM3_MOD_PPRWB 586 - -#define BSIM3_MOD_PCDSCD 587 -#define BSIM3_MOD_PAGS 588 - -#define BSIM3_MOD_PFRINGE 591 -#define BSIM3_MOD_PELM 592 -#define BSIM3_MOD_PCGSL 593 -#define BSIM3_MOD_PCGDL 594 -#define BSIM3_MOD_PCKAPPA 595 -#define BSIM3_MOD_PCF 596 -#define BSIM3_MOD_PCLC 597 -#define BSIM3_MOD_PCLE 598 -#define BSIM3_MOD_PVFBCV 599 -#define BSIM3_MOD_PACDE 600 -#define BSIM3_MOD_PMOIN 601 -#define BSIM3_MOD_PNOFF 602 -#define BSIM3_MOD_PALPHA1 604 -#define BSIM3_MOD_PVFB 605 -#define BSIM3_MOD_PVOFFCV 606 - -#define BSIM3_MOD_TNOM 651 -#define BSIM3_MOD_CGSO 652 -#define BSIM3_MOD_CGDO 653 -#define BSIM3_MOD_CGBO 654 -#define BSIM3_MOD_XPART 655 - -#define BSIM3_MOD_RSH 656 -#define BSIM3_MOD_JS 657 -#define BSIM3_MOD_PB 658 -#define BSIM3_MOD_MJ 659 -#define BSIM3_MOD_PBSW 660 -#define BSIM3_MOD_MJSW 661 -#define BSIM3_MOD_CJ 662 -#define BSIM3_MOD_CJSW 663 -#define BSIM3_MOD_NMOS 664 -#define BSIM3_MOD_PMOS 665 - -#define BSIM3_MOD_NOIA 666 -#define BSIM3_MOD_NOIB 667 -#define BSIM3_MOD_NOIC 668 - -#define BSIM3_MOD_LINT 669 -#define BSIM3_MOD_LL 670 -#define BSIM3_MOD_LLN 671 -#define BSIM3_MOD_LW 672 -#define BSIM3_MOD_LWN 673 -#define BSIM3_MOD_LWL 674 -#define BSIM3_MOD_LMIN 675 -#define BSIM3_MOD_LMAX 676 - -#define BSIM3_MOD_WINT 677 -#define BSIM3_MOD_WL 678 -#define BSIM3_MOD_WLN 679 -#define BSIM3_MOD_WW 680 -#define BSIM3_MOD_WWN 681 -#define BSIM3_MOD_WWL 682 -#define BSIM3_MOD_WMIN 683 -#define BSIM3_MOD_WMAX 684 - -#define BSIM3_MOD_DWC 685 -#define BSIM3_MOD_DLC 686 - -#define BSIM3_MOD_EM 687 -#define BSIM3_MOD_EF 688 -#define BSIM3_MOD_AF 689 -#define BSIM3_MOD_KF 690 - -#define BSIM3_MOD_NJ 691 -#define BSIM3_MOD_XTI 692 - -#define BSIM3_MOD_PBSWG 693 -#define BSIM3_MOD_MJSWG 694 -#define BSIM3_MOD_CJSWG 695 -#define BSIM3_MOD_JSW 696 - -#define BSIM3_MOD_LLC 697 -#define BSIM3_MOD_LWC 698 -#define BSIM3_MOD_LWLC 699 - -#define BSIM3_MOD_WLC 700 -#define BSIM3_MOD_WWC 701 -#define BSIM3_MOD_WWLC 702 - -/* ACM parameters */ -#define BSIM3_MOD_XL 703 -#define BSIM3_MOD_XW 704 -#define BSIM3_MOD_HDIF 711 -#define BSIM3_MOD_LDIF 712 -#define BSIM3_MOD_LD 713 -#define BSIM3_MOD_RD 714 -#define BSIM3_MOD_RS 715 -#define BSIM3_MOD_RDC 716 -#define BSIM3_MOD_RSC 717 -#define BSIM3_MOD_WMLT 718 - -/* device questions */ -#define BSIM3_DNODE 751 -#define BSIM3_GNODE 752 -#define BSIM3_SNODE 753 -#define BSIM3_BNODE 754 -#define BSIM3_DNODEPRIME 755 -#define BSIM3_SNODEPRIME 756 -#define BSIM3_VBD 757 -#define BSIM3_VBS 758 -#define BSIM3_VGS 759 -#define BSIM3_VDS 760 -#define BSIM3_CD 761 -#define BSIM3_CBS 762 -#define BSIM3_CBD 763 -#define BSIM3_GM 764 -#define BSIM3_GDS 765 -#define BSIM3_GMBS 766 -#define BSIM3_GBD 767 -#define BSIM3_GBS 768 -#define BSIM3_QB 769 -#define BSIM3_CQB 770 -#define BSIM3_QG 771 -#define BSIM3_CQG 772 -#define BSIM3_QD 773 -#define BSIM3_CQD 774 -#define BSIM3_CGG 775 -#define BSIM3_CGD 776 -#define BSIM3_CGS 777 -#define BSIM3_CBG 778 -#define BSIM3_CAPBD 779 -#define BSIM3_CQBD 780 -#define BSIM3_CAPBS 781 -#define BSIM3_CQBS 782 -#define BSIM3_CDG 783 -#define BSIM3_CDD 784 -#define BSIM3_CDS 785 -#define BSIM3_VON 786 -#define BSIM3_VDSAT 787 -#define BSIM3_QBS 788 -#define BSIM3_QBD 789 -#define BSIM3_SOURCECONDUCT 790 -#define BSIM3_DRAINCONDUCT 791 -#define BSIM3_CBDB 792 -#define BSIM3_CBSB 793 - -#define BSIM3_MOD_VGS_MAX 801 -#define BSIM3_MOD_VGD_MAX 802 -#define BSIM3_MOD_VGB_MAX 803 -#define BSIM3_MOD_VDS_MAX 804 -#define BSIM3_MOD_VBS_MAX 805 -#define BSIM3_MOD_VBD_MAX 806 -#define BSIM3_MOD_VGSR_MAX 807 -#define BSIM3_MOD_VGDR_MAX 808 -#define BSIM3_MOD_VGBR_MAX 809 -#define BSIM3_MOD_VBSR_MAX 810 -#define BSIM3_MOD_VBDR_MAX 811 - -#include "bsim3ext.h" - -extern void BSIM3evaluate(double,double,double,BSIM3instance*,BSIM3model*, - double*,double*,double*, double*, double*, double*, double*, - double*, double*, double*, double*, double*, double*, double*, - double*, double*, double*, double*, CKTcircuit*); -extern int BSIM3debug(BSIM3model*, BSIM3instance*, CKTcircuit*, int); -extern int BSIM3checkModel(BSIM3model*, BSIM3instance*, CKTcircuit*); - -#endif /*BSIM3*/ - diff --git a/src/spicelib/devices/bsim3/bsim3ext.h b/src/spicelib/devices/bsim3/bsim3ext.h deleted file mode 100644 index 4bd136d1f..000000000 --- a/src/spicelib/devices/bsim3/bsim3ext.h +++ /dev/null @@ -1,29 +0,0 @@ -/********** -Copyright 1990 Regents of the University of California. All rights reserved. -Author: 1991 JianHui Huang and Min-Chie Jeng. -Modified by Yuhua Cheng to use BSIM3v3 in Spice3f5 (Jan. 1997) -File: bsim3ext.h -**********/ - -extern int BSIM3acLoad(GENmodel *,CKTcircuit*); -extern int BSIM3ask(CKTcircuit *,GENinstance*,int,IFvalue*,IFvalue*); -extern int BSIM3convTest(GENmodel *,CKTcircuit*); -extern int BSIM3getic(GENmodel*,CKTcircuit*); -extern int BSIM3load(GENmodel*,CKTcircuit*); -extern int BSIM3mAsk(CKTcircuit*,GENmodel *,int, IFvalue*); -extern int BSIM3mDelete(GENmodel*); -extern int BSIM3mParam(int,IFvalue*,GENmodel*); -extern void BSIM3mosCap(CKTcircuit*, double, double, double, double, - double, double, double, double, double, double, double, - double, double, double, double, double, double, double*, - double*, double*, double*, double*, double*, double*, double*, - double*, double*, double*, double*, double*, double*, double*, - double*); -extern int BSIM3param(int,IFvalue*,GENinstance*,IFvalue*); -extern int BSIM3pzLoad(GENmodel*,CKTcircuit*,SPcomplex*); -extern int BSIM3setup(SMPmatrix*,GENmodel*,CKTcircuit*,int*); -extern int BSIM3temp(GENmodel*,CKTcircuit*); -extern int BSIM3trunc(GENmodel*,CKTcircuit*,double*); -extern int BSIM3noise(int,int,GENmodel*,CKTcircuit*,Ndata*,double*); -extern int BSIM3unsetup(GENmodel*,CKTcircuit*); -extern int BSIM3soaCheck(CKTcircuit *, GENmodel *); diff --git a/src/spicelib/devices/bsim3/bsim3init.c b/src/spicelib/devices/bsim3/bsim3init.c deleted file mode 100644 index eb848ef83..000000000 --- a/src/spicelib/devices/bsim3/bsim3init.c +++ /dev/null @@ -1,78 +0,0 @@ -#include "ngspice/config.h" - -#include "ngspice/devdefs.h" - -#include "bsim3itf.h" -#include "bsim3ext.h" -#include "bsim3init.h" - - -SPICEdev BSIM3info = { - .DEVpublic = { - .name = "BSIM3", - .description = "Berkeley Short Channel IGFET Model Version-3", - .terms = &BSIM3nSize, - .numNames = &BSIM3nSize, - .termNames = BSIM3names, - .numInstanceParms = &BSIM3pTSize, - .instanceParms = BSIM3pTable, - .numModelParms = &BSIM3mPTSize, - .modelParms = BSIM3mPTable, - .flags = DEV_DEFAULT, - -#ifdef XSPICE - .cm_func = NULL, - .num_conn = 0, - .conn = NULL, - .num_param = 0, - .param = NULL, - .num_inst_var = 0, - .inst_var = NULL, -#endif - }, - - .DEVparam = BSIM3param, - .DEVmodParam = BSIM3mParam, - .DEVload = BSIM3load, - .DEVsetup = BSIM3setup, - .DEVunsetup = BSIM3unsetup, - .DEVpzSetup = BSIM3setup, - .DEVtemperature = BSIM3temp, - .DEVtrunc = BSIM3trunc, - .DEVfindBranch = NULL, - .DEVacLoad = BSIM3acLoad, - .DEVaccept = NULL, - .DEVdestroy = NULL, - .DEVmodDelete = BSIM3mDelete, - .DEVdelete = NULL, - .DEVsetic = BSIM3getic, - .DEVask = BSIM3ask, - .DEVmodAsk = BSIM3mAsk, - .DEVpzLoad = BSIM3pzLoad, - .DEVconvTest = BSIM3convTest, - .DEVsenSetup = NULL, - .DEVsenLoad = NULL, - .DEVsenUpdate = NULL, - .DEVsenAcLoad = NULL, - .DEVsenPrint = NULL, - .DEVsenTrunc = NULL, - .DEVdisto = NULL, - .DEVnoise = BSIM3noise, - .DEVsoaCheck = BSIM3soaCheck, - .DEVinstSize = &BSIM3iSize, - .DEVmodSize = &BSIM3mSize, - -#ifdef CIDER - .DEVdump = NULL, - .DEVacct = NULL, -#endif -}; - - -SPICEdev * -get_bsim3_info(void) -{ - return &BSIM3info; -} - - diff --git a/src/spicelib/devices/bsim3/bsim3init.h b/src/spicelib/devices/bsim3/bsim3init.h deleted file mode 100644 index 09305bdee..000000000 --- a/src/spicelib/devices/bsim3/bsim3init.h +++ /dev/null @@ -1,13 +0,0 @@ -#ifndef _BSIM3INIT_H -#define _BSIM3INIT_H - -extern IFparm BSIM3pTable[ ]; -extern IFparm BSIM3mPTable[ ]; -extern char *BSIM3names[ ]; -extern int BSIM3pTSize; -extern int BSIM3mPTSize; -extern int BSIM3nSize; -extern int BSIM3iSize; -extern int BSIM3mSize; - -#endif diff --git a/src/spicelib/devices/bsim3/bsim3itf.h b/src/spicelib/devices/bsim3/bsim3itf.h deleted file mode 100644 index fb53c25b3..000000000 --- a/src/spicelib/devices/bsim3/bsim3itf.h +++ /dev/null @@ -1,12 +0,0 @@ -/********** -Copyright 1999 Regents of the University of California. All rights reserved. -Author: 1991 JianHui Huang and Min-Chie Jeng. -File: bsim3itf.h -**********/ - -#ifndef DEV_BSIM3 -#define DEV_BSIM3 - -SPICEdev *get_bsim3_info(void); - -#endif diff --git a/src/spicelib/devices/bsim3soi_dd/BsimTerms_use b/src/spicelib/devices/bsim3soi_dd/BsimTerms_use deleted file mode 100644 index 6f8e8e540..000000000 --- a/src/spicelib/devices/bsim3soi_dd/BsimTerms_use +++ /dev/null @@ -1,29 +0,0 @@ -The terms under which the software is provided are as the following. - -Software is distributed as is, completely without warranty or service -support. The University of California and its employees are not liable -for the condition or performance of the software. - -The University owns the copyright but shall not be liable for any -infringement of copyright or other proprietary rights brought by third -parties against the users of the software. - -The University of California hereby disclaims all implied warranties. - -The University of California grants the users the right to modify, copy, -and redistribute the software and documentation, both within the user's -organization and externally, subject to the following restrictions - -1. The users agree not to charge for the University of California code - itself but may charge for additions, extensions, or support. - -2. In any product based on the software, the users agree to acknowledge - the UC Berkeley BSIM Research Group that developed the software. This - acknowledgment shall appear in the product documentation. - -3. The users agree to obey all U.S. Government restrictions governing - redistribution or export of the software. - -4. The users agree to reproduce any copyright notice which appears on - the software on any copy or modification of such made available - to others. diff --git a/src/spicelib/devices/bsim3soi_dd/Makefile.am b/src/spicelib/devices/bsim3soi_dd/Makefile.am deleted file mode 100644 index 5b6e5032a..000000000 --- a/src/spicelib/devices/bsim3soi_dd/Makefile.am +++ /dev/null @@ -1,34 +0,0 @@ -## Process this file with automake to produce Makefile.in - -noinst_LTLIBRARIES = libbsim3soidd.la - -libbsim3soidd_la_SOURCES = \ - b3soidd.c \ - b3soiddacld.c \ - b3soiddask.c \ - b3soiddcheck.c \ - b3soiddcvtest.c \ - b3soiddgetic.c \ - b3soiddld.c \ - b3soiddmask.c \ - b3soiddmpar.c \ - b3soiddnoi.c \ - b3soiddpar.c \ - b3soiddpzld.c \ - b3soiddset.c \ - b3soiddtemp.c \ - b3soiddtrunc.c \ - b3soidddef.h \ - b3soiddext.h \ - b3soiddinit.c \ - b3soiddinit.h \ - b3soidditf.h - - - -AM_CPPFLAGS = @AM_CPPFLAGS@ -I$(top_srcdir)/src/include -AM_CFLAGS = $(STATIC) - -MAINTAINERCLEANFILES = Makefile.in - -EXTRA_DIST = BsimTerms_use diff --git a/src/spicelib/devices/bsim3soi_dd/b3soidd.c b/src/spicelib/devices/bsim3soi_dd/b3soidd.c deleted file mode 100644 index 9ac41c790..000000000 --- a/src/spicelib/devices/bsim3soi_dd/b3soidd.c +++ /dev/null @@ -1,484 +0,0 @@ -/********** -Copyright 1999 Regents of the University of California. All rights reserved. -Author: Weidong Liu and Pin Su Feb 1999 -Author: 1998 Samuel Fung, Dennis Sinitsky and Stephen Tang -File: b3soidd.c 98/5/01 -Modified by Wei Jin 99/9/27 -Modified by Paolo Nenzi 2001 -**********/ - -/* - * Revision 2.1 99/9/27 Pin Su - * BSIMDD2.1 release - */ - -#include "ngspice/ngspice.h" -#include "ngspice/devdefs.h" -#include "b3soidddef.h" -#include "ngspice/suffix.h" - -IFparm B3SOIDDpTable[] = { /* parameters */ -IOP( "l", B3SOIDD_L, IF_REAL , "Length"), -IOP( "w", B3SOIDD_W, IF_REAL , "Width"), -IOP( "m", B3SOIDD_M, IF_REAL , "Parallel Multiplier"), -IOP( "ad", B3SOIDD_AD, IF_REAL , "Drain area"), -IOP( "as", B3SOIDD_AS, IF_REAL , "Source area"), -IOP( "pd", B3SOIDD_PD, IF_REAL , "Drain perimeter"), -IOP( "ps", B3SOIDD_PS, IF_REAL , "Source perimeter"), -IOP( "nrd", B3SOIDD_NRD, IF_REAL , "Number of squares in drain"), -IOP( "nrs", B3SOIDD_NRS, IF_REAL , "Number of squares in source"), -IOP( "off", B3SOIDD_OFF, IF_FLAG , "Device is initially off"), -IP( "ic", B3SOIDD_IC, IF_REALVEC , "Vector of DS,GS,BS initial voltages"), -OP( "gmbs", B3SOIDD_GMBS, IF_REAL, "Gmb"), -OP( "gm", B3SOIDD_GM, IF_REAL, "Gm"), -OP( "gm/ids", B3SOIDD_GMID, IF_REAL, "Gm/Ids"), -OP( "gds", B3SOIDD_GDS, IF_REAL, "Gds"), -OP( "vdsat", B3SOIDD_VDSAT, IF_REAL, "Vdsat"), -OP( "vth", B3SOIDD_VON, IF_REAL, "Vth"), -OP( "ids", B3SOIDD_CD, IF_REAL, "Ids"), -OP( "vbs", B3SOIDD_VBS, IF_REAL, "Vbs"), -OP( "vgs", B3SOIDD_VGS, IF_REAL, "Vgs"), -OP( "vds", B3SOIDD_VDS, IF_REAL, "Vds"), -OP( "ves", B3SOIDD_VES, IF_REAL, "Ves"), -IOP( "bjtoff", B3SOIDD_BJTOFF, IF_INTEGER, "BJT on/off flag"), -IOP( "debug", B3SOIDD_DEBUG, IF_INTEGER, "BJT on/off flag"), -IOP( "rth0", B3SOIDD_RTH0, IF_REAL, "Instance Thermal Resistance"), -IOP( "cth0", B3SOIDD_CTH0, IF_REAL, "Instance Thermal Capacitance"), -IOP( "nrb", B3SOIDD_NRB, IF_REAL, "Number of squares in body"), -}; - -IFparm B3SOIDDmPTable[] = { /* model parameters */ -IOP( "capmod", B3SOIDD_MOD_CAPMOD, IF_INTEGER, "Capacitance model selector"), -IOP( "mobmod", B3SOIDD_MOD_MOBMOD, IF_INTEGER, "Mobility model selector"), -IOP( "noimod", B3SOIDD_MOD_NOIMOD, IF_INTEGER, "Noise model selector"), -IOP( "paramchk", B3SOIDD_MOD_PARAMCHK, IF_INTEGER, "Model parameter checking selector"), -IOP( "binunit", B3SOIDD_MOD_BINUNIT, IF_INTEGER, "Bin unit selector"), -IOP( "version", B3SOIDD_MOD_VERSION, IF_REAL, " parameter for model version"), -IOP( "tox", B3SOIDD_MOD_TOX, IF_REAL, "Gate oxide thickness in meters"), - -IOP( "cdsc", B3SOIDD_MOD_CDSC, IF_REAL, "Drain/Source and channel coupling capacitance"), -IOP( "cdscb", B3SOIDD_MOD_CDSCB, IF_REAL, "Body-bias dependence of cdsc"), -IOP( "cdscd", B3SOIDD_MOD_CDSCD, IF_REAL, "Drain-bias dependence of cdsc"), -IOP( "cit", B3SOIDD_MOD_CIT, IF_REAL, "Interface state capacitance"), -IOP( "nfactor", B3SOIDD_MOD_NFACTOR, IF_REAL, "Subthreshold swing Coefficient"), -IOP( "vsat", B3SOIDD_MOD_VSAT, IF_REAL, "Saturation velocity at tnom"), -IOP( "at", B3SOIDD_MOD_AT, IF_REAL, "Temperature coefficient of vsat"), -IOP( "a0", B3SOIDD_MOD_A0, IF_REAL, "Non-uniform depletion width effect coefficient."), -IOP( "ags", B3SOIDD_MOD_AGS, IF_REAL, "Gate bias coefficient of Abulk."), -IOP( "a1", B3SOIDD_MOD_A1, IF_REAL, "Non-saturation effect coefficient"), -IOP( "a2", B3SOIDD_MOD_A2, IF_REAL, "Non-saturation effect coefficient"), -IOP( "keta", B3SOIDD_MOD_KETA, IF_REAL, "Body-bias coefficient of non-uniform depletion width effect."), -IOP( "nsub", B3SOIDD_MOD_NSUB, IF_REAL, "Substrate doping concentration with polarity"), -IOP( "nch", B3SOIDD_MOD_NPEAK, IF_REAL, "Channel doping concentration"), -IOP( "ngate", B3SOIDD_MOD_NGATE, IF_REAL, "Poly-gate doping concentration"), -IOP( "gamma1", B3SOIDD_MOD_GAMMA1, IF_REAL, "Vth body coefficient"), -IOP( "gamma2", B3SOIDD_MOD_GAMMA2, IF_REAL, "Vth body coefficient"), -IOP( "vbx", B3SOIDD_MOD_VBX, IF_REAL, "Vth transition body Voltage"), -IOP( "vbm", B3SOIDD_MOD_VBM, IF_REAL, "Maximum body voltage"), - -IOP( "xt", B3SOIDD_MOD_XT, IF_REAL, "Doping depth"), -IOP( "k1", B3SOIDD_MOD_K1, IF_REAL, "Bulk effect coefficient 1"), -IOP( "kt1", B3SOIDD_MOD_KT1, IF_REAL, "Temperature coefficient of Vth"), -IOP( "kt1l", B3SOIDD_MOD_KT1L, IF_REAL, "Temperature coefficient of Vth"), -IOP( "kt2", B3SOIDD_MOD_KT2, IF_REAL, "Body-coefficient of kt1"), -IOP( "k2", B3SOIDD_MOD_K2, IF_REAL, "Bulk effect coefficient 2"), -IOP( "k3", B3SOIDD_MOD_K3, IF_REAL, "Narrow width effect coefficient"), -IOP( "k3b", B3SOIDD_MOD_K3B, IF_REAL, "Body effect coefficient of k3"), -IOP( "w0", B3SOIDD_MOD_W0, IF_REAL, "Narrow width effect parameter"), -IOP( "nlx", B3SOIDD_MOD_NLX, IF_REAL, "Lateral non-uniform doping effect"), -IOP( "dvt0", B3SOIDD_MOD_DVT0, IF_REAL, "Short channel effect coeff. 0"), -IOP( "dvt1", B3SOIDD_MOD_DVT1, IF_REAL, "Short channel effect coeff. 1"), -IOP( "dvt2", B3SOIDD_MOD_DVT2, IF_REAL, "Short channel effect coeff. 2"), -IOP( "dvt0w", B3SOIDD_MOD_DVT0W, IF_REAL, "Narrow Width coeff. 0"), -IOP( "dvt1w", B3SOIDD_MOD_DVT1W, IF_REAL, "Narrow Width effect coeff. 1"), -IOP( "dvt2w", B3SOIDD_MOD_DVT2W, IF_REAL, "Narrow Width effect coeff. 2"), -IOP( "drout", B3SOIDD_MOD_DROUT, IF_REAL, "DIBL coefficient of output resistance"), -IOP( "dsub", B3SOIDD_MOD_DSUB, IF_REAL, "DIBL coefficient in the subthreshold region"), -IOP( "vth0", B3SOIDD_MOD_VTH0, IF_REAL,"Threshold voltage"), -IOPR("vtho", B3SOIDD_MOD_VTH0, IF_REAL,"Threshold voltage"), -IOP( "ua", B3SOIDD_MOD_UA, IF_REAL, "Linear gate dependence of mobility"), -IOP( "ua1", B3SOIDD_MOD_UA1, IF_REAL, "Temperature coefficient of ua"), -IOP( "ub", B3SOIDD_MOD_UB, IF_REAL, "Quadratic gate dependence of mobility"), -IOP( "ub1", B3SOIDD_MOD_UB1, IF_REAL, "Temperature coefficient of ub"), -IOP( "uc", B3SOIDD_MOD_UC, IF_REAL, "Body-bias dependence of mobility"), -IOP( "uc1", B3SOIDD_MOD_UC1, IF_REAL, "Temperature coefficient of uc"), -IOP( "u0", B3SOIDD_MOD_U0, IF_REAL, "Low-field mobility at Tnom"), -IOP( "ute", B3SOIDD_MOD_UTE, IF_REAL, "Temperature coefficient of mobility"), -IOP( "voff", B3SOIDD_MOD_VOFF, IF_REAL, "Threshold voltage offset"), -IOP( "tnom", B3SOIDD_MOD_TNOM, IF_REAL, "Parameter measurement temperature"), -IOP( "cgso", B3SOIDD_MOD_CGSO, IF_REAL, "Gate-source overlap capacitance per width"), -IOP( "cgdo", B3SOIDD_MOD_CGDO, IF_REAL, "Gate-drain overlap capacitance per width"), -IOP( "cgeo", B3SOIDD_MOD_CGEO, IF_REAL, "Gate-substrate overlap capacitance"), -IOP( "xpart", B3SOIDD_MOD_XPART, IF_REAL, "Channel charge partitioning"), -IOP( "delta", B3SOIDD_MOD_DELTA, IF_REAL, "Effective Vds parameter"), -IOP( "rsh", B3SOIDD_MOD_RSH, IF_REAL, "Source-drain sheet resistance"), -IOP( "rdsw", B3SOIDD_MOD_RDSW, IF_REAL, "Source-drain resistance per width"), - -IOP( "prwg", B3SOIDD_MOD_PRWG, IF_REAL, "Gate-bias effect on parasitic resistance "), -IOP( "prwb", B3SOIDD_MOD_PRWB, IF_REAL, "Body-effect on parasitic resistance "), - -IOP( "prt", B3SOIDD_MOD_PRT, IF_REAL, "Temperature coefficient of parasitic resistance "), -IOP( "eta0", B3SOIDD_MOD_ETA0, IF_REAL, "Subthreshold region DIBL coefficient"), -IOP( "etab", B3SOIDD_MOD_ETAB, IF_REAL, "Subthreshold region DIBL coefficient"), -IOP( "pclm", B3SOIDD_MOD_PCLM, IF_REAL, "Channel length modulation Coefficient"), -IOP( "pdiblc1", B3SOIDD_MOD_PDIBL1, IF_REAL, "Drain-induced barrier lowering coefficient"), -IOP( "pdiblc2", B3SOIDD_MOD_PDIBL2, IF_REAL, "Drain-induced barrier lowering coefficient"), -IOP( "pdiblcb", B3SOIDD_MOD_PDIBLB, IF_REAL, "Body-effect on drain-induced barrier lowering"), - -IOP( "pvag", B3SOIDD_MOD_PVAG, IF_REAL, "Gate dependence of output resistance parameter"), - -IOP( "shmod", B3SOIDD_MOD_SHMOD, IF_INTEGER, "Self heating mode selector"), -IOP( "tbox", B3SOIDD_MOD_TBOX, IF_REAL, "Back gate oxide thickness in meters"), -IOP( "tsi", B3SOIDD_MOD_TSI, IF_REAL, "Silicon-on-insulator thickness in meters"), -IOP( "xj", B3SOIDD_MOD_XJ, IF_REAL, "Junction Depth"), -IOP( "kb1", B3SOIDD_MOD_KB1, IF_REAL, "Backgate coupling coefficient at strong inversion"), -IOP( "kb3", B3SOIDD_MOD_KB3, IF_REAL, "Backgate coupling coefficient at subthreshold"), -IOP( "dvbd0", B3SOIDD_MOD_DVBD0, IF_REAL, "First coefficient of short-channel effect on Vbs0t"), -IOP( "dvbd1", B3SOIDD_MOD_DVBD1, IF_REAL, "Second coefficient of short-channel effect on Vbs0t"), -IOP( "vbsa", B3SOIDD_MOD_VBSA, IF_REAL, "Vbs0t offset voltage"), -IOP( "delp", B3SOIDD_MOD_DELP, IF_REAL, "Offset constant for limiting Vbseff to Phis"), -IOP( "rbody", B3SOIDD_MOD_RBODY, IF_REAL, "Intrinsic body contact sheet resistance"), -IOP( "rbsh", B3SOIDD_MOD_RBSH, IF_REAL, "Extrinsic body contact sheet resistance"), -IOP( "adice0", B3SOIDD_MOD_ADICE0, IF_REAL, "DICE constant for bulk charge effect"), -IOP( "abp", B3SOIDD_MOD_ABP, IF_REAL, "Gate bias coefficient for Xcsat calculation"), -IOP( "mxc", B3SOIDD_MOD_MXC, IF_REAL, "A smoothing parameter for Xcsat calculation"), -IOP( "rth0", B3SOIDD_MOD_RTH0, IF_REAL, "Self-heating thermal resistance"), -IOP( "cth0", B3SOIDD_MOD_CTH0, IF_REAL, "Self-heating thermal capacitance"), -IOP( "aii", B3SOIDD_MOD_AII, IF_REAL, "1st Vdsatii parameter"), -IOP( "bii", B3SOIDD_MOD_BII, IF_REAL, "2nd Vdsatii parameter"), -IOP( "cii", B3SOIDD_MOD_CII, IF_REAL, "3rd Vdsatii parameter"), -IOP( "dii", B3SOIDD_MOD_DII, IF_REAL, "4th Vdsatii parameter"), -IOP( "ngidl", B3SOIDD_MOD_NGIDL, IF_REAL, "GIDL first parameter"), -IOP( "agidl", B3SOIDD_MOD_AGIDL, IF_REAL, "GIDL second parameter"), -IOP( "bgidl", B3SOIDD_MOD_BGIDL, IF_REAL, "GIDL third parameter"), -IOP( "ndiode", B3SOIDD_MOD_NDIODE, IF_REAL, "Diode non-ideality factor"), -IOP( "ntun", B3SOIDD_MOD_NTUN, IF_REAL, "Reverse tunneling non-ideality factor"), -IOP( "isbjt", B3SOIDD_MOD_ISBJT, IF_REAL, "BJT emitter injection constant"), -IOP( "isdif", B3SOIDD_MOD_ISDIF, IF_REAL, "Body to S/D injection constant"), -IOP( "isrec", B3SOIDD_MOD_ISREC, IF_REAL, "Recombination in depletion constant"), -IOP( "istun", B3SOIDD_MOD_ISTUN, IF_REAL, "Tunneling diode constant"), -IOP( "xbjt", B3SOIDD_MOD_XBJT, IF_REAL, "Temperature coefficient for Isbjt"), -IOPR( "xdif",B3SOIDD_MOD_XBJT, IF_REAL, "Temperature coefficient for Isdif"), -IOP( "xrec", B3SOIDD_MOD_XREC, IF_REAL, "Temperature coefficient for Isrec"), -IOP( "xtun", B3SOIDD_MOD_XTUN, IF_REAL, "Temperature coefficient for Istun"), -IOP( "edl", B3SOIDD_MOD_EDL, IF_REAL, "Electron diffusion length"), -IOP( "kbjt1", B3SOIDD_MOD_KBJT1, IF_REAL, "Vds dependency on BJT base width"), -IOP( "tt", B3SOIDD_MOD_TT, IF_REAL, "Diffusion capacitance transit time coefficient"), -IOP( "vsdth", B3SOIDD_MOD_VSDTH, IF_REAL, "Source/Drain diffusion threshold voltage"), -IOP( "vsdfb", B3SOIDD_MOD_VSDFB, IF_REAL, "Source/Drain diffusion flatband voltage"), -IOP( "csdmin", B3SOIDD_MOD_CSDMIN, IF_REAL, "Source/Drain diffusion bottom minimum capacitance"), -IOP( "asd", B3SOIDD_MOD_ASD, IF_REAL, "Source/Drain diffusion smoothing parameter"), - -IOP( "pbswg", B3SOIDD_MOD_PBSWG, IF_REAL, "Source/drain (gate side) sidewall junction capacitance built in potential"), -IOP( "mjswg", B3SOIDD_MOD_MJSWG, IF_REAL, "Source/drain (gate side) sidewall junction capacitance grading coefficient"), - -IOP( "cjswg", B3SOIDD_MOD_CJSWG, IF_REAL, "Source/drain (gate side) sidewall junction capacitance per unit width"), -IOP( "csdesw", B3SOIDD_MOD_CSDESW, IF_REAL, "Source/drain sidewall fringing constant"), -IOP( "lint", B3SOIDD_MOD_LINT, IF_REAL, "Length reduction parameter"), -IOP( "ll", B3SOIDD_MOD_LL, IF_REAL, "Length reduction parameter"), -IOP( "lln", B3SOIDD_MOD_LLN, IF_REAL, "Length reduction parameter"), -IOP( "lw", B3SOIDD_MOD_LW, IF_REAL, "Length reduction parameter"), -IOP( "lwn", B3SOIDD_MOD_LWN, IF_REAL, "Length reduction parameter"), -IOP( "lwl", B3SOIDD_MOD_LWL, IF_REAL, "Length reduction parameter"), - -IOP( "wr", B3SOIDD_MOD_WR, IF_REAL, "Width dependence of rds"), -IOP( "wint", B3SOIDD_MOD_WINT, IF_REAL, "Width reduction parameter"), -IOP( "dwg", B3SOIDD_MOD_DWG, IF_REAL, "Width reduction parameter"), -IOP( "dwb", B3SOIDD_MOD_DWB, IF_REAL, "Width reduction parameter"), - -IOP( "wl", B3SOIDD_MOD_WL, IF_REAL, "Width reduction parameter"), -IOP( "wln", B3SOIDD_MOD_WLN, IF_REAL, "Width reduction parameter"), -IOP( "ww", B3SOIDD_MOD_WW, IF_REAL, "Width reduction parameter"), -IOP( "wwn", B3SOIDD_MOD_WWN, IF_REAL, "Width reduction parameter"), -IOP( "wwl", B3SOIDD_MOD_WWL, IF_REAL, "Width reduction parameter"), - -IOP( "b0", B3SOIDD_MOD_B0, IF_REAL, "Abulk narrow width parameter"), -IOP( "b1", B3SOIDD_MOD_B1, IF_REAL, "Abulk narrow width parameter"), - -IOP( "cgsl", B3SOIDD_MOD_CGSL, IF_REAL, "New C-V model parameter"), -IOP( "cgdl", B3SOIDD_MOD_CGDL, IF_REAL, "New C-V model parameter"), -IOP( "ckappa", B3SOIDD_MOD_CKAPPA, IF_REAL, "New C-V model parameter"), -IOP( "cf", B3SOIDD_MOD_CF, IF_REAL, "Fringe capacitance parameter"), -IOP( "clc", B3SOIDD_MOD_CLC, IF_REAL, "Vdsat parameter for C-V model"), -IOP( "cle", B3SOIDD_MOD_CLE, IF_REAL, "Vdsat parameter for C-V model"), -IOP( "dwc", B3SOIDD_MOD_DWC, IF_REAL, "Delta W for C-V model"), -IOP( "dlc", B3SOIDD_MOD_DLC, IF_REAL, "Delta L for C-V model"), - -IOP( "alpha0", B3SOIDD_MOD_ALPHA0, IF_REAL, "substrate current model parameter"), -IOP( "alpha1", B3SOIDD_MOD_ALPHA1, IF_REAL, "substrate current model parameter"), -IOP( "beta0", B3SOIDD_MOD_BETA0, IF_REAL, "substrate current model parameter"), - -IOP( "noia", B3SOIDD_MOD_NOIA, IF_REAL, "Flicker noise parameter"), -IOP( "noib", B3SOIDD_MOD_NOIB, IF_REAL, "Flicker noise parameter"), -IOP( "noic", B3SOIDD_MOD_NOIC, IF_REAL, "Flicker noise parameter"), -IOP( "em", B3SOIDD_MOD_EM, IF_REAL, "Flicker noise parameter"), -IOP( "ef", B3SOIDD_MOD_EF, IF_REAL, "Flicker noise frequency exponent"), -IOP( "af", B3SOIDD_MOD_AF, IF_REAL, "Flicker noise exponent"), -IOP( "kf", B3SOIDD_MOD_KF, IF_REAL, "Flicker noise coefficient"), -IOP( "noif", B3SOIDD_MOD_NOIF, IF_REAL, "Floating body excess noise ideality factor"), - -/* Added for binning - START */ -/* Length Dependence */ -IOP( "lnch", B3SOIDD_MOD_LNPEAK, IF_REAL, "Length dependence of nch"), -IOP( "lnsub", B3SOIDD_MOD_LNSUB, IF_REAL, "Length dependence of nsub"), -IOP( "lngate", B3SOIDD_MOD_LNGATE, IF_REAL, "Length dependence of ngate"), -IOP( "lvth0", B3SOIDD_MOD_LVTH0, IF_REAL,"Length dependence of vth0"), -IOP( "lk1", B3SOIDD_MOD_LK1, IF_REAL, "Length dependence of k1"), -IOP( "lk2", B3SOIDD_MOD_LK2, IF_REAL, "Length dependence of k2"), -IOP( "lk3", B3SOIDD_MOD_LK3, IF_REAL, "Length dependence of k3"), -IOP( "lk3b", B3SOIDD_MOD_LK3B, IF_REAL, "Length dependence of k3b"), -IOP( "lvbsa", B3SOIDD_MOD_LVBSA, IF_REAL, "Length dependence of vbsa"), -IOP( "ldelp", B3SOIDD_MOD_LDELP, IF_REAL, "Length dependence of delp"), -IOP( "lkb1", B3SOIDD_MOD_LKB1, IF_REAL, "Length dependence of kb1"), -IOP( "lkb3", B3SOIDD_MOD_LKB3, IF_REAL, "Length dependence of kb3"), -IOP( "ldvbd0", B3SOIDD_MOD_LDVBD0, IF_REAL, "Length dependence of dvbd0"), -IOP( "ldvbd1", B3SOIDD_MOD_LDVBD1, IF_REAL, "Length dependence of dvbd1"), -IOP( "lw0", B3SOIDD_MOD_LW0, IF_REAL, "Length dependence of w0"), -IOP( "lnlx", B3SOIDD_MOD_LNLX, IF_REAL, "Length dependence of nlx"), -IOP( "ldvt0", B3SOIDD_MOD_LDVT0, IF_REAL, "Length dependence of dvt0"), -IOP( "ldvt1", B3SOIDD_MOD_LDVT1, IF_REAL, "Length dependence of dvt1"), -IOP( "ldvt2", B3SOIDD_MOD_LDVT2, IF_REAL, "Length dependence of dvt2"), -IOP( "ldvt0w", B3SOIDD_MOD_LDVT0W, IF_REAL, "Length dependence of dvt0w"), -IOP( "ldvt1w", B3SOIDD_MOD_LDVT1W, IF_REAL, "Length dependence of dvt1w"), -IOP( "ldvt2w", B3SOIDD_MOD_LDVT2W, IF_REAL, "Length dependence of dvt2w"), -IOP( "lu0", B3SOIDD_MOD_LU0, IF_REAL, "Length dependence of u0"), -IOP( "lua", B3SOIDD_MOD_LUA, IF_REAL, "Length dependence of ua"), -IOP( "lub", B3SOIDD_MOD_LUB, IF_REAL, "Length dependence of ub"), -IOP( "luc", B3SOIDD_MOD_LUC, IF_REAL, "Length dependence of uc"), -IOP( "lvsat", B3SOIDD_MOD_LVSAT, IF_REAL, "Length dependence of vsat"), -IOP( "la0", B3SOIDD_MOD_LA0, IF_REAL, "Length dependence of a0"), -IOP( "lags", B3SOIDD_MOD_LAGS, IF_REAL, "Length dependence of ags"), -IOP( "lb0", B3SOIDD_MOD_LB0, IF_REAL, "Length dependence of b0"), -IOP( "lb1", B3SOIDD_MOD_LB1, IF_REAL, "Length dependence of b1"), -IOP( "lketa", B3SOIDD_MOD_LKETA, IF_REAL, "Length dependence of keta"), -IOP( "labp", B3SOIDD_MOD_LABP, IF_REAL, "Length dependence of abp"), -IOP( "lmxc", B3SOIDD_MOD_LMXC, IF_REAL, "Length dependence of mxc"), -IOP( "ladice0", B3SOIDD_MOD_LADICE0, IF_REAL, "Length dependence of adice0"), -IOP( "la1", B3SOIDD_MOD_LA1, IF_REAL, "Length dependence of a1"), -IOP( "la2", B3SOIDD_MOD_LA2, IF_REAL, "Length dependence of a2"), -IOP( "lrdsw", B3SOIDD_MOD_LRDSW, IF_REAL, "Length dependence of rdsw "), -IOP( "lprwb", B3SOIDD_MOD_LPRWB, IF_REAL, "Length dependence of prwb "), -IOP( "lprwg", B3SOIDD_MOD_LPRWG, IF_REAL, "Length dependence of prwg "), -IOP( "lwr", B3SOIDD_MOD_LWR, IF_REAL, "Length dependence of wr"), -IOP( "lnfactor", B3SOIDD_MOD_LNFACTOR, IF_REAL, "Length dependence of nfactor"), -IOP( "ldwg", B3SOIDD_MOD_LDWG, IF_REAL, "Length dependence of dwg"), -IOP( "ldwb", B3SOIDD_MOD_LDWB, IF_REAL, "Length dependence of dwb"), -IOP( "lvoff", B3SOIDD_MOD_LVOFF, IF_REAL, "Length dependence of voff"), -IOP( "leta0", B3SOIDD_MOD_LETA0, IF_REAL, "Length dependence of eta0"), -IOP( "letab", B3SOIDD_MOD_LETAB, IF_REAL, "Length dependence of etab"), -IOP( "ldsub", B3SOIDD_MOD_LDSUB, IF_REAL, "Length dependence of dsub"), -IOP( "lcit", B3SOIDD_MOD_LCIT, IF_REAL, "Length dependence of cit"), -IOP( "lcdsc", B3SOIDD_MOD_LCDSC, IF_REAL, "Length dependence of cdsc"), -IOP( "lcdscb", B3SOIDD_MOD_LCDSCB, IF_REAL, "Length dependence of cdscb"), -IOP( "lcdscd", B3SOIDD_MOD_LCDSCD, IF_REAL, "Length dependence of cdscd"), -IOP( "lpclm", B3SOIDD_MOD_LPCLM, IF_REAL, "Length dependence of pclm"), -IOP( "lpdiblc1", B3SOIDD_MOD_LPDIBL1, IF_REAL, "Length dependence of pdiblc1"), -IOP( "lpdiblc2", B3SOIDD_MOD_LPDIBL2, IF_REAL, "Length dependence of pdiblc2"), -IOP( "lpdiblcb", B3SOIDD_MOD_LPDIBLB, IF_REAL, "Length dependence of pdiblcb"), -IOP( "ldrout", B3SOIDD_MOD_LDROUT, IF_REAL, "Length dependence of drout"), -IOP( "lpvag", B3SOIDD_MOD_LPVAG, IF_REAL, "Length dependence of pvag"), -IOP( "ldelta", B3SOIDD_MOD_LDELTA, IF_REAL, "Length dependence of delta"), -IOP( "laii", B3SOIDD_MOD_LAII, IF_REAL, "Length dependence of aii"), -IOP( "lbii", B3SOIDD_MOD_LBII, IF_REAL, "Length dependence of bii"), -IOP( "lcii", B3SOIDD_MOD_LCII, IF_REAL, "Length dependence of cii"), -IOP( "ldii", B3SOIDD_MOD_LDII, IF_REAL, "Length dependence of dii"), -IOP( "lalpha0", B3SOIDD_MOD_LALPHA0, IF_REAL, "Length dependence of alpha0"), -IOP( "lalpha1", B3SOIDD_MOD_LALPHA1, IF_REAL, "Length dependence of alpha1"), -IOP( "lbeta0", B3SOIDD_MOD_LBETA0, IF_REAL, "Length dependence of beta0"), -IOP( "lagidl", B3SOIDD_MOD_LAGIDL, IF_REAL, "Length dependence of agidl"), -IOP( "lbgidl", B3SOIDD_MOD_LBGIDL, IF_REAL, "Length dependence of bgidl"), -IOP( "lngidl", B3SOIDD_MOD_LNGIDL, IF_REAL, "Length dependence of ngidl"), -IOP( "lntun", B3SOIDD_MOD_LNTUN, IF_REAL, "Length dependence of ntun"), -IOP( "lndiode", B3SOIDD_MOD_LNDIODE, IF_REAL, "Length dependence of ndiode"), -IOP( "lisbjt", B3SOIDD_MOD_LISBJT, IF_REAL, "Length dependence of isbjt"), -IOP( "lisdif", B3SOIDD_MOD_LISDIF, IF_REAL, "Length dependence of isdif"), -IOP( "lisrec", B3SOIDD_MOD_LISREC, IF_REAL, "Length dependence of isrec"), -IOP( "listun", B3SOIDD_MOD_LISTUN, IF_REAL, "Length dependence of istun"), -IOP( "ledl", B3SOIDD_MOD_LEDL, IF_REAL, "Length dependence of edl"), -IOP( "lkbjt1", B3SOIDD_MOD_LKBJT1, IF_REAL, "Length dependence of kbjt1"), -IOP( "lvsdfb", B3SOIDD_MOD_LVSDFB, IF_REAL, "Length dependence of vsdfb"), -IOP( "lvsdth", B3SOIDD_MOD_LVSDTH, IF_REAL, "Length dependence of vsdth"), -/* Width Dependence */ -IOP( "wnch", B3SOIDD_MOD_WNPEAK, IF_REAL, "Width dependence of nch"), -IOP( "wnsub", B3SOIDD_MOD_WNSUB, IF_REAL, "Width dependence of nsub"), -IOP( "wngate", B3SOIDD_MOD_WNGATE, IF_REAL, "Width dependence of ngate"), -IOP( "wvth0", B3SOIDD_MOD_WVTH0, IF_REAL,"Width dependence of vth0"), -IOP( "wk1", B3SOIDD_MOD_WK1, IF_REAL, "Width dependence of k1"), -IOP( "wk2", B3SOIDD_MOD_WK2, IF_REAL, "Width dependence of k2"), -IOP( "wk3", B3SOIDD_MOD_WK3, IF_REAL, "Width dependence of k3"), -IOP( "wk3b", B3SOIDD_MOD_WK3B, IF_REAL, "Width dependence of k3b"), -IOP( "wvbsa", B3SOIDD_MOD_WVBSA, IF_REAL, "Width dependence of vbsa"), -IOP( "wdelp", B3SOIDD_MOD_WDELP, IF_REAL, "Width dependence of delp"), -IOP( "wkb1", B3SOIDD_MOD_WKB1, IF_REAL, "Width dependence of kb1"), -IOP( "wkb3", B3SOIDD_MOD_WKB3, IF_REAL, "Width dependence of kb3"), -IOP( "wdvbd0", B3SOIDD_MOD_WDVBD0, IF_REAL, "Width dependence of dvbd0"), -IOP( "wdvbd1", B3SOIDD_MOD_WDVBD1, IF_REAL, "Width dependence of dvbd1"), -IOP( "ww0", B3SOIDD_MOD_WW0, IF_REAL, "Width dependence of w0"), -IOP( "wnlx", B3SOIDD_MOD_WNLX, IF_REAL, "Width dependence of nlx"), -IOP( "wdvt0", B3SOIDD_MOD_WDVT0, IF_REAL, "Width dependence of dvt0"), -IOP( "wdvt1", B3SOIDD_MOD_WDVT1, IF_REAL, "Width dependence of dvt1"), -IOP( "wdvt2", B3SOIDD_MOD_WDVT2, IF_REAL, "Width dependence of dvt2"), -IOP( "wdvt0w", B3SOIDD_MOD_WDVT0W, IF_REAL, "Width dependence of dvt0w"), -IOP( "wdvt1w", B3SOIDD_MOD_WDVT1W, IF_REAL, "Width dependence of dvt1w"), -IOP( "wdvt2w", B3SOIDD_MOD_WDVT2W, IF_REAL, "Width dependence of dvt2w"), -IOP( "wu0", B3SOIDD_MOD_WU0, IF_REAL, "Width dependence of u0"), -IOP( "wua", B3SOIDD_MOD_WUA, IF_REAL, "Width dependence of ua"), -IOP( "wub", B3SOIDD_MOD_WUB, IF_REAL, "Width dependence of ub"), -IOP( "wuc", B3SOIDD_MOD_WUC, IF_REAL, "Width dependence of uc"), -IOP( "wvsat", B3SOIDD_MOD_WVSAT, IF_REAL, "Width dependence of vsat"), -IOP( "wa0", B3SOIDD_MOD_WA0, IF_REAL, "Width dependence of a0"), -IOP( "wags", B3SOIDD_MOD_WAGS, IF_REAL, "Width dependence of ags"), -IOP( "wb0", B3SOIDD_MOD_WB0, IF_REAL, "Width dependence of b0"), -IOP( "wb1", B3SOIDD_MOD_WB1, IF_REAL, "Width dependence of b1"), -IOP( "wketa", B3SOIDD_MOD_WKETA, IF_REAL, "Width dependence of keta"), -IOP( "wabp", B3SOIDD_MOD_WABP, IF_REAL, "Width dependence of abp"), -IOP( "wmxc", B3SOIDD_MOD_WMXC, IF_REAL, "Width dependence of mxc"), -IOP( "wadice0", B3SOIDD_MOD_WADICE0, IF_REAL, "Width dependence of adice0"), -IOP( "wa1", B3SOIDD_MOD_WA1, IF_REAL, "Width dependence of a1"), -IOP( "wa2", B3SOIDD_MOD_WA2, IF_REAL, "Width dependence of a2"), -IOP( "wrdsw", B3SOIDD_MOD_WRDSW, IF_REAL, "Width dependence of rdsw "), -IOP( "wprwb", B3SOIDD_MOD_WPRWB, IF_REAL, "Width dependence of prwb "), -IOP( "wprwg", B3SOIDD_MOD_WPRWG, IF_REAL, "Width dependence of prwg "), -IOP( "wwr", B3SOIDD_MOD_WWR, IF_REAL, "Width dependence of wr"), -IOP( "wnfactor", B3SOIDD_MOD_WNFACTOR, IF_REAL, "Width dependence of nfactor"), -IOP( "wdwg", B3SOIDD_MOD_WDWG, IF_REAL, "Width dependence of dwg"), -IOP( "wdwb", B3SOIDD_MOD_WDWB, IF_REAL, "Width dependence of dwb"), -IOP( "wvoff", B3SOIDD_MOD_WVOFF, IF_REAL, "Width dependence of voff"), -IOP( "weta0", B3SOIDD_MOD_WETA0, IF_REAL, "Width dependence of eta0"), -IOP( "wetab", B3SOIDD_MOD_WETAB, IF_REAL, "Width dependence of etab"), -IOP( "wdsub", B3SOIDD_MOD_WDSUB, IF_REAL, "Width dependence of dsub"), -IOP( "wcit", B3SOIDD_MOD_WCIT, IF_REAL, "Width dependence of cit"), -IOP( "wcdsc", B3SOIDD_MOD_WCDSC, IF_REAL, "Width dependence of cdsc"), -IOP( "wcdscb", B3SOIDD_MOD_WCDSCB, IF_REAL, "Width dependence of cdscb"), -IOP( "wcdscd", B3SOIDD_MOD_WCDSCD, IF_REAL, "Width dependence of cdscd"), -IOP( "wpclm", B3SOIDD_MOD_WPCLM, IF_REAL, "Width dependence of pclm"), -IOP( "wpdiblc1", B3SOIDD_MOD_WPDIBL1, IF_REAL, "Width dependence of pdiblc1"), -IOP( "wpdiblc2", B3SOIDD_MOD_WPDIBL2, IF_REAL, "Width dependence of pdiblc2"), -IOP( "wpdiblcb", B3SOIDD_MOD_WPDIBLB, IF_REAL, "Width dependence of pdiblcb"), -IOP( "wdrout", B3SOIDD_MOD_WDROUT, IF_REAL, "Width dependence of drout"), -IOP( "wpvag", B3SOIDD_MOD_WPVAG, IF_REAL, "Width dependence of pvag"), -IOP( "wdelta", B3SOIDD_MOD_WDELTA, IF_REAL, "Width dependence of delta"), -IOP( "waii", B3SOIDD_MOD_WAII, IF_REAL, "Width dependence of aii"), -IOP( "wbii", B3SOIDD_MOD_WBII, IF_REAL, "Width dependence of bii"), -IOP( "wcii", B3SOIDD_MOD_WCII, IF_REAL, "Width dependence of cii"), -IOP( "wdii", B3SOIDD_MOD_WDII, IF_REAL, "Width dependence of dii"), -IOP( "walpha0", B3SOIDD_MOD_WALPHA0, IF_REAL, "Width dependence of alpha0"), -IOP( "walpha1", B3SOIDD_MOD_WALPHA1, IF_REAL, "Width dependence of alpha1"), -IOP( "wbeta0", B3SOIDD_MOD_WBETA0, IF_REAL, "Width dependence of beta0"), -IOP( "wagidl", B3SOIDD_MOD_WAGIDL, IF_REAL, "Width dependence of agidl"), -IOP( "wbgidl", B3SOIDD_MOD_WBGIDL, IF_REAL, "Width dependence of bgidl"), -IOP( "wngidl", B3SOIDD_MOD_WNGIDL, IF_REAL, "Width dependence of ngidl"), -IOP( "wntun", B3SOIDD_MOD_WNTUN, IF_REAL, "Width dependence of ntun"), -IOP( "wndiode", B3SOIDD_MOD_WNDIODE, IF_REAL, "Width dependence of ndiode"), -IOP( "wisbjt", B3SOIDD_MOD_WISBJT, IF_REAL, "Width dependence of isbjt"), -IOP( "wisdif", B3SOIDD_MOD_WISDIF, IF_REAL, "Width dependence of isdif"), -IOP( "wisrec", B3SOIDD_MOD_WISREC, IF_REAL, "Width dependence of isrec"), -IOP( "wistun", B3SOIDD_MOD_WISTUN, IF_REAL, "Width dependence of istun"), -IOP( "wedl", B3SOIDD_MOD_WEDL, IF_REAL, "Width dependence of edl"), -IOP( "wkbjt1", B3SOIDD_MOD_WKBJT1, IF_REAL, "Width dependence of kbjt1"), -IOP( "wvsdfb", B3SOIDD_MOD_WVSDFB, IF_REAL, "Width dependence of vsdfb"), -IOP( "wvsdth", B3SOIDD_MOD_WVSDTH, IF_REAL, "Width dependence of vsdth"), -/* Cross-term Dependence */ -IOP( "pnch", B3SOIDD_MOD_PNPEAK, IF_REAL, "Cross-term dependence of nch"), -IOP( "pnsub", B3SOIDD_MOD_PNSUB, IF_REAL, "Cross-term dependence of nsub"), -IOP( "pngate", B3SOIDD_MOD_PNGATE, IF_REAL, "Cross-term dependence of ngate"), -IOP( "pvth0", B3SOIDD_MOD_PVTH0, IF_REAL,"Cross-term dependence of vth0"), -IOP( "pk1", B3SOIDD_MOD_PK1, IF_REAL, "Cross-term dependence of k1"), -IOP( "pk2", B3SOIDD_MOD_PK2, IF_REAL, "Cross-term dependence of k2"), -IOP( "pk3", B3SOIDD_MOD_PK3, IF_REAL, "Cross-term dependence of k3"), -IOP( "pk3b", B3SOIDD_MOD_PK3B, IF_REAL, "Cross-term dependence of k3b"), -IOP( "pvbsa", B3SOIDD_MOD_PVBSA, IF_REAL, "Cross-term dependence of vbsa"), -IOP( "pdelp", B3SOIDD_MOD_PDELP, IF_REAL, "Cross-term dependence of delp"), -IOP( "pkb1", B3SOIDD_MOD_PKB1, IF_REAL, "Cross-term dependence of kb1"), -IOP( "pkb3", B3SOIDD_MOD_PKB3, IF_REAL, "Cross-term dependence of kb3"), -IOP( "pdvbd0", B3SOIDD_MOD_PDVBD0, IF_REAL, "Cross-term dependence of dvbd0"), -IOP( "pdvbd1", B3SOIDD_MOD_PDVBD1, IF_REAL, "Cross-term dependence of dvbd1"), -IOP( "pw0", B3SOIDD_MOD_PW0, IF_REAL, "Cross-term dependence of w0"), -IOP( "pnlx", B3SOIDD_MOD_PNLX, IF_REAL, "Cross-term dependence of nlx"), -IOP( "pdvt0", B3SOIDD_MOD_PDVT0, IF_REAL, "Cross-term dependence of dvt0"), -IOP( "pdvt1", B3SOIDD_MOD_PDVT1, IF_REAL, "Cross-term dependence of dvt1"), -IOP( "pdvt2", B3SOIDD_MOD_PDVT2, IF_REAL, "Cross-term dependence of dvt2"), -IOP( "pdvt0w", B3SOIDD_MOD_PDVT0W, IF_REAL, "Cross-term dependence of dvt0w"), -IOP( "pdvt1w", B3SOIDD_MOD_PDVT1W, IF_REAL, "Cross-term dependence of dvt1w"), -IOP( "pdvt2w", B3SOIDD_MOD_PDVT2W, IF_REAL, "Cross-term dependence of dvt2w"), -IOP( "pu0", B3SOIDD_MOD_PU0, IF_REAL, "Cross-term dependence of u0"), -IOP( "pua", B3SOIDD_MOD_PUA, IF_REAL, "Cross-term dependence of ua"), -IOP( "pub", B3SOIDD_MOD_PUB, IF_REAL, "Cross-term dependence of ub"), -IOP( "puc", B3SOIDD_MOD_PUC, IF_REAL, "Cross-term dependence of uc"), -IOP( "pvsat", B3SOIDD_MOD_PVSAT, IF_REAL, "Cross-term dependence of vsat"), -IOP( "pa0", B3SOIDD_MOD_PA0, IF_REAL, "Cross-term dependence of a0"), -IOP( "pags", B3SOIDD_MOD_PAGS, IF_REAL, "Cross-term dependence of ags"), -IOP( "pb0", B3SOIDD_MOD_PB0, IF_REAL, "Cross-term dependence of b0"), -IOP( "pb1", B3SOIDD_MOD_PB1, IF_REAL, "Cross-term dependence of b1"), -IOP( "pketa", B3SOIDD_MOD_PKETA, IF_REAL, "Cross-term dependence of keta"), -IOP( "pabp", B3SOIDD_MOD_PABP, IF_REAL, "Cross-term dependence of abp"), -IOP( "pmxc", B3SOIDD_MOD_PMXC, IF_REAL, "Cross-term dependence of mxc"), -IOP( "padice0", B3SOIDD_MOD_PADICE0, IF_REAL, "Cross-term dependence of adice0"), -IOP( "pa1", B3SOIDD_MOD_PA1, IF_REAL, "Cross-term dependence of a1"), -IOP( "pa2", B3SOIDD_MOD_PA2, IF_REAL, "Cross-term dependence of a2"), -IOP( "prdsw", B3SOIDD_MOD_PRDSW, IF_REAL, "Cross-term dependence of rdsw "), -IOP( "pprwb", B3SOIDD_MOD_PPRWB, IF_REAL, "Cross-term dependence of prwb "), -IOP( "pprwg", B3SOIDD_MOD_PPRWG, IF_REAL, "Cross-term dependence of prwg "), -IOP( "pwr", B3SOIDD_MOD_PWR, IF_REAL, "Cross-term dependence of wr"), -IOP( "pnfactor", B3SOIDD_MOD_PNFACTOR, IF_REAL, "Cross-term dependence of nfactor"), -IOP( "pdwg", B3SOIDD_MOD_PDWG, IF_REAL, "Cross-term dependence of dwg"), -IOP( "pdwb", B3SOIDD_MOD_PDWB, IF_REAL, "Cross-term dependence of dwb"), -IOP( "pvoff", B3SOIDD_MOD_PVOFF, IF_REAL, "Cross-term dependence of voff"), -IOP( "peta0", B3SOIDD_MOD_PETA0, IF_REAL, "Cross-term dependence of eta0"), -IOP( "petab", B3SOIDD_MOD_PETAB, IF_REAL, "Cross-term dependence of etab"), -IOP( "pdsub", B3SOIDD_MOD_PDSUB, IF_REAL, "Cross-term dependence of dsub"), -IOP( "pcit", B3SOIDD_MOD_PCIT, IF_REAL, "Cross-term dependence of cit"), -IOP( "pcdsc", B3SOIDD_MOD_PCDSC, IF_REAL, "Cross-term dependence of cdsc"), -IOP( "pcdscb", B3SOIDD_MOD_PCDSCB, IF_REAL, "Cross-term dependence of cdscb"), -IOP( "pcdscd", B3SOIDD_MOD_PCDSCD, IF_REAL, "Cross-term dependence of cdscd"), -IOP( "ppclm", B3SOIDD_MOD_PPCLM, IF_REAL, "Cross-term dependence of pclm"), -IOP( "ppdiblc1", B3SOIDD_MOD_PPDIBL1, IF_REAL, "Cross-term dependence of pdiblc1"), -IOP( "ppdiblc2", B3SOIDD_MOD_PPDIBL2, IF_REAL, "Cross-term dependence of pdiblc2"), -IOP( "ppdiblcb", B3SOIDD_MOD_PPDIBLB, IF_REAL, "Cross-term dependence of pdiblcb"), -IOP( "pdrout", B3SOIDD_MOD_PDROUT, IF_REAL, "Cross-term dependence of drout"), -IOP( "ppvag", B3SOIDD_MOD_PPVAG, IF_REAL, "Cross-term dependence of pvag"), -IOP( "pdelta", B3SOIDD_MOD_PDELTA, IF_REAL, "Cross-term dependence of delta"), -IOP( "paii", B3SOIDD_MOD_PAII, IF_REAL, "Cross-term dependence of aii"), -IOP( "pbii", B3SOIDD_MOD_PBII, IF_REAL, "Cross-term dependence of bii"), -IOP( "pcii", B3SOIDD_MOD_PCII, IF_REAL, "Cross-term dependence of cii"), -IOP( "pdii", B3SOIDD_MOD_PDII, IF_REAL, "Cross-term dependence of dii"), -IOP( "palpha0", B3SOIDD_MOD_PALPHA0, IF_REAL, "Cross-term dependence of alpha0"), -IOP( "palpha1", B3SOIDD_MOD_PALPHA1, IF_REAL, "Cross-term dependence of alpha1"), -IOP( "pbeta0", B3SOIDD_MOD_PBETA0, IF_REAL, "Cross-term dependence of beta0"), -IOP( "pagidl", B3SOIDD_MOD_PAGIDL, IF_REAL, "Cross-term dependence of agidl"), -IOP( "pbgidl", B3SOIDD_MOD_PBGIDL, IF_REAL, "Cross-term dependence of bgidl"), -IOP( "pngidl", B3SOIDD_MOD_PNGIDL, IF_REAL, "Cross-term dependence of ngidl"), -IOP( "pntun", B3SOIDD_MOD_PNTUN, IF_REAL, "Cross-term dependence of ntun"), -IOP( "pndiode", B3SOIDD_MOD_PNDIODE, IF_REAL, "Cross-term dependence of ndiode"), -IOP( "pisbjt", B3SOIDD_MOD_PISBJT, IF_REAL, "Cross-term dependence of isbjt"), -IOP( "pisdif", B3SOIDD_MOD_PISDIF, IF_REAL, "Cross-term dependence of isdif"), -IOP( "pisrec", B3SOIDD_MOD_PISREC, IF_REAL, "Cross-term dependence of isrec"), -IOP( "pistun", B3SOIDD_MOD_PISTUN, IF_REAL, "Cross-term dependence of istun"), -IOP( "pedl", B3SOIDD_MOD_PEDL, IF_REAL, "Cross-term dependence of edl"), -IOP( "pkbjt1", B3SOIDD_MOD_PKBJT1, IF_REAL, "Cross-term dependence of kbjt1"), -IOP( "pvsdfb", B3SOIDD_MOD_PVSDFB, IF_REAL, "Cross-term dependence of vsdfb"), -IOP( "pvsdth", B3SOIDD_MOD_PVSDTH, IF_REAL, "Cross-term dependence of vsdth"), -/* Added for binning - END */ - -IP( "nmos", B3SOIDD_MOD_NMOS, IF_FLAG, "Flag to indicate NMOS"), -IP( "pmos", B3SOIDD_MOD_PMOS, IF_FLAG, "Flag to indicate PMOS"), -}; - -char *B3SOIDDnames[] = { - "Drain", - "Gate", - "Source", - "Backgate", - "", - "Body", - "Temp", - "Charge", -}; - -int B3SOIDDnSize = NUMELEMS(B3SOIDDnames); -int B3SOIDDpTSize = NUMELEMS(B3SOIDDpTable); -int B3SOIDDmPTSize = NUMELEMS(B3SOIDDmPTable); -int B3SOIDDiSize = sizeof(B3SOIDDinstance); -int B3SOIDDmSize = sizeof(B3SOIDDmodel); - - diff --git a/src/spicelib/devices/bsim3soi_dd/b3soiddacld.c b/src/spicelib/devices/bsim3soi_dd/b3soiddacld.c deleted file mode 100644 index 91f68efd7..000000000 --- a/src/spicelib/devices/bsim3soi_dd/b3soiddacld.c +++ /dev/null @@ -1,468 +0,0 @@ -/********** -Copyright 1999 Regents of the University of California. All rights reserved. -Author: Weidong Liu and Pin Su Feb 1999 -Author: 1998 Samuel Fung, Dennis Sinitsky and Stephen Tang -File: b3soiddacld.c 98/5/01 -Modified by Paolo Nenzi 2002 -**********/ - -/* - * Revision 2.1 99/9/27 Pin Su - * BSIMDD2.1 release - */ - -#include "ngspice/ngspice.h" -#include "ngspice/cktdefs.h" -#include "b3soidddef.h" -#include "ngspice/sperror.h" -#include "ngspice/suffix.h" - - -int -B3SOIDDacLoad(GENmodel *inModel, CKTcircuit *ckt) -{ -B3SOIDDmodel *model = (B3SOIDDmodel*)inModel; -B3SOIDDinstance *here; -int selfheat; -double xcggb, xcgdb, xcgsb, xcgeb, xcgT; -double xcdgb, xcddb, xcdsb, xcdeb, xcdT; -double xcsgb, xcsdb, xcssb, xcseb, xcsT; -double xcbgb, xcbdb, xcbsb, xcbeb, xcbT; -double xcegb, xcedb, xcesb, xceeb, xceT; -double gdpr, gspr, gds; -double cggb, cgdb, cgsb, cgeb, cgT; -double cdgb, cddb, cdsb, cdeb, cdT; -double cbgb, cbdb, cbsb, cbeb, cbT; -double cegb, cedb, cesb, ceeb, ceT; -double GSoverlapCap, GDoverlapCap, GEoverlapCap, FwdSum, RevSum, Gm, Gmbs, Gme, GmT; -double omega; -double dxpart, sxpart; -double gbbg, gbbdp, gbbb, gbbe, gbbp, gbbsp, gbbT; -double gddpg, gddpdp, gddpsp, gddpb, gddpe, gddpT; -double gsspg, gsspdp, gsspsp, gsspb, gsspe, gsspT; -double gppg, gppdp, gppb, gppe, gppp, gppsp, gppT; -double xcTt, cTt, gTtt, gTtg, gTtb, gTte, gTtdp, gTtsp; - -FILE *fpdebug = NULL; - -double m; - - omega = ckt->CKTomega; - for (; model != NULL; model = B3SOIDDnextModel(model)) - { - - for (here = B3SOIDDinstances(model); here!= NULL; - here = B3SOIDDnextInstance(here)) - { - selfheat = (model->B3SOIDDshMod == 1) && (here->B3SOIDDrth0 != 0.0); - if (here->B3SOIDDdebugMod > 2) - { - fpdebug = fopen("b3soiddac.log", "a"); - fprintf(fpdebug, ".......omega=%.5e\n", omega); - } - if (here->B3SOIDDmode >= 0) - { Gm = here->B3SOIDDgm; - Gmbs = here->B3SOIDDgmbs; - Gme = here->B3SOIDDgme; - GmT = model->B3SOIDDtype * here->B3SOIDDgmT; - FwdSum = Gm + Gmbs + Gme; - RevSum = 0.0; - - cbgb = here->B3SOIDDcbgb; - cbsb = here->B3SOIDDcbsb; - cbdb = here->B3SOIDDcbdb; - cbeb = here->B3SOIDDcbeb; - cbT = model->B3SOIDDtype * here->B3SOIDDcbT; - - cegb = here->B3SOIDDcegb; - cesb = here->B3SOIDDcesb; - cedb = here->B3SOIDDcedb; - ceeb = here->B3SOIDDceeb; - ceT = model->B3SOIDDtype * here->B3SOIDDceT; - - cggb = here->B3SOIDDcggb; - cgsb = here->B3SOIDDcgsb; - cgdb = here->B3SOIDDcgdb; - cgeb = here->B3SOIDDcgeb; - cgT = model->B3SOIDDtype * here->B3SOIDDcgT; - - cdgb = here->B3SOIDDcdgb; - cdsb = here->B3SOIDDcdsb; - cddb = here->B3SOIDDcddb; - cdeb = here->B3SOIDDcdeb; - cdT = model->B3SOIDDtype * here->B3SOIDDcdT; - - cTt = here->pParam->B3SOIDDcth; - - gbbg = -here->B3SOIDDgbgs; - gbbdp = -here->B3SOIDDgbds; - gbbb = -here->B3SOIDDgbbs; - gbbe = -here->B3SOIDDgbes; - gbbp = -here->B3SOIDDgbps; - gbbT = -model->B3SOIDDtype * here->B3SOIDDgbT; - gbbsp = - ( gbbg + gbbdp + gbbb + gbbe + gbbp); - - gddpg = -here->B3SOIDDgjdg; - gddpdp = -here->B3SOIDDgjdd; - gddpb = -here->B3SOIDDgjdb; - gddpe = -here->B3SOIDDgjde; - gddpT = -model->B3SOIDDtype * here->B3SOIDDgjdT; - gddpsp = - ( gddpg + gddpdp + gddpb + gddpe); - - gsspg = -here->B3SOIDDgjsg; - gsspdp = -here->B3SOIDDgjsd; - gsspb = -here->B3SOIDDgjsb; - gsspe = 0.0; - gsspT = -model->B3SOIDDtype * here->B3SOIDDgjsT; - gsspsp = - (gsspg + gsspdp + gsspb + gsspe); - - gppg = -here->B3SOIDDgbpgs; - gppdp = -here->B3SOIDDgbpds; - gppb = -here->B3SOIDDgbpbs; - gppe = -here->B3SOIDDgbpes; - gppp = -here->B3SOIDDgbpps; - gppT = -model->B3SOIDDtype * here->B3SOIDDgbpT; - gppsp = - (gppg + gppdp + gppb + gppe + gppp); - - gTtg = here->B3SOIDDgtempg; - gTtb = here->B3SOIDDgtempb; - gTte = here->B3SOIDDgtempe; - gTtdp = here->B3SOIDDgtempd; - gTtt = here->B3SOIDDgtempT; - gTtsp = - (gTtg + gTtb + gTte + gTtdp); - - sxpart = 0.6; - dxpart = 0.4; - - } - else - { Gm = -here->B3SOIDDgm; - Gmbs = -here->B3SOIDDgmbs; - Gme = -here->B3SOIDDgme; - GmT = -model->B3SOIDDtype * here->B3SOIDDgmT; - FwdSum = 0.0; - RevSum = -Gm - Gmbs - Gme; - - cdgb = - (here->B3SOIDDcdgb + here->B3SOIDDcggb + here->B3SOIDDcbgb - + here->B3SOIDDcegb); - cdsb = - (here->B3SOIDDcddb + here->B3SOIDDcgdb + here->B3SOIDDcbdb - + here->B3SOIDDcedb); - cddb = - (here->B3SOIDDcdsb + here->B3SOIDDcgsb + here->B3SOIDDcbsb - + here->B3SOIDDcesb); - cdeb = - (here->B3SOIDDcdeb + here->B3SOIDDcgeb + here->B3SOIDDcbeb - + here->B3SOIDDceeb); - cdT = - model->B3SOIDDtype * (here->B3SOIDDcgT + here->B3SOIDDcbT - + here->B3SOIDDcdT + here->B3SOIDDceT); - - cegb = here->B3SOIDDcegb; - cesb = here->B3SOIDDcedb; - cedb = here->B3SOIDDcesb; - ceeb = here->B3SOIDDceeb; - ceT = model->B3SOIDDtype * here->B3SOIDDceT; - - cggb = here->B3SOIDDcggb; - cgsb = here->B3SOIDDcgdb; - cgdb = here->B3SOIDDcgsb; - cgeb = here->B3SOIDDcgeb; - cgT = model->B3SOIDDtype * here->B3SOIDDcgT; - - cbgb = here->B3SOIDDcbgb; - cbsb = here->B3SOIDDcbdb; - cbdb = here->B3SOIDDcbsb; - cbeb = here->B3SOIDDcbeb; - cbT = model->B3SOIDDtype * here->B3SOIDDcbT; - - cTt = here->pParam->B3SOIDDcth; - - gbbg = -here->B3SOIDDgbgs; - gbbb = -here->B3SOIDDgbbs; - gbbe = -here->B3SOIDDgbes; - gbbp = -here->B3SOIDDgbps; - gbbsp = -here->B3SOIDDgbds; - gbbT = -model->B3SOIDDtype * here->B3SOIDDgbT; - gbbdp = - ( gbbg + gbbsp + gbbb + gbbe + gbbp); - - gddpg = -here->B3SOIDDgjsg; - gddpsp = -here->B3SOIDDgjsd; - gddpb = -here->B3SOIDDgjsb; - gddpe = 0.0; - gddpT = -model->B3SOIDDtype * here->B3SOIDDgjsT; - gddpdp = - (gddpg + gddpsp + gddpb + gddpe); - - gsspg = -here->B3SOIDDgjdg; - gsspsp = -here->B3SOIDDgjdd; - gsspb = -here->B3SOIDDgjdb; - gsspe = -here->B3SOIDDgjde; - gsspT = -model->B3SOIDDtype * here->B3SOIDDgjdT; - gsspdp = - ( gsspg + gsspsp + gsspb + gsspe); - - gppg = -here->B3SOIDDgbpgs; - gppsp = -here->B3SOIDDgbpds; - gppb = -here->B3SOIDDgbpbs; - gppe = -here->B3SOIDDgbpes; - gppp = -here->B3SOIDDgbpps; - gppT = -model->B3SOIDDtype * here->B3SOIDDgbpT; - gppdp = - (gppg + gppsp + gppb + gppe + gppp); - - gTtt = here->B3SOIDDgtempT; - gTtg = here->B3SOIDDgtempg; - gTtb = here->B3SOIDDgtempb; - gTte = here->B3SOIDDgtempe; - gTtdp = here->B3SOIDDgtempd; - gTtsp = - (gTtt + gTtg + gTtb + gTte + gTtdp); - - gTtg = here->B3SOIDDgtempg; - gTtb = here->B3SOIDDgtempb; - gTte = here->B3SOIDDgtempe; - gTtsp = here->B3SOIDDgtempd; - gTtt = here->B3SOIDDgtempT; - gTtdp = - (gTtg + gTtb + gTte + gTtsp); - - sxpart = 0.6; - sxpart = 0.4; - dxpart = 0.6; - } - - gdpr=here->B3SOIDDdrainConductance; - gspr=here->B3SOIDDsourceConductance; - gds= here->B3SOIDDgds; - - GSoverlapCap = here->B3SOIDDcgso; - GDoverlapCap = here->B3SOIDDcgdo; - GEoverlapCap = here->pParam->B3SOIDDcgeo; - - xcegb = (cegb - GEoverlapCap) * omega; - xcedb = cedb * omega; - xcesb = cesb * omega; - xceeb = (ceeb + GEoverlapCap) * omega; - xceT = ceT * omega; - - xcggb = (cggb + GDoverlapCap + GSoverlapCap + GEoverlapCap) - * omega; - xcgdb = (cgdb - GDoverlapCap ) * omega; - xcgsb = (cgsb - GSoverlapCap) * omega; - xcgeb = (cgeb - GEoverlapCap) * omega; - xcgT = cgT * omega; - - xcdgb = (cdgb - GDoverlapCap) * omega; - xcddb = (cddb + GDoverlapCap) * omega; - xcdsb = cdsb * omega; - xcdeb = cdeb * omega; - xcdT = cdT * omega; - - xcsgb = -(cggb + cbgb + cdgb + cegb + GSoverlapCap) * omega; - xcsdb = -(cgdb + cbdb + cddb + cedb) * omega; - xcssb = (GSoverlapCap - (cgsb + cbsb + cdsb + cesb)) * omega; - xcseb = -(cgeb + cbeb + cdeb + ceeb) * omega; - xcsT = -(cgT + cbT + cdT + ceT) * omega; - - xcbgb = cbgb * omega; - xcbdb = cbdb * omega; - xcbsb = cbsb * omega; - xcbeb = cbeb * omega; - xcbT = cbT * omega; - - xcTt = cTt * omega; - - m = here->B3SOIDDm; - - *(here->B3SOIDDEgPtr +1) += m * xcegb; - *(here->B3SOIDDEdpPtr +1) += m * xcedb; - *(here->B3SOIDDEspPtr +1) += m * xcesb; - *(here->B3SOIDDGePtr +1) += m * xcgeb; - *(here->B3SOIDDDPePtr +1) += m * xcdeb; - *(here->B3SOIDDSPePtr +1) += m * xcseb; - - *(here->B3SOIDDEePtr +1) += m * xceeb; - - *(here->B3SOIDDGgPtr +1) += m * xcggb; - *(here->B3SOIDDGdpPtr +1) += m * xcgdb; - *(here->B3SOIDDGspPtr +1) += m * xcgsb; - - *(here->B3SOIDDDPgPtr +1) += m * xcdgb; - *(here->B3SOIDDDPdpPtr +1) += m * xcddb; - *(here->B3SOIDDDPspPtr +1) += m * xcdsb; - - *(here->B3SOIDDSPgPtr +1) += m * xcsgb; - *(here->B3SOIDDSPdpPtr +1) += m * xcsdb; - *(here->B3SOIDDSPspPtr +1) += m * xcssb; - - *(here->B3SOIDDBePtr +1) += m * xcbeb; - *(here->B3SOIDDBgPtr +1) += m * xcbgb; - *(here->B3SOIDDBdpPtr +1) += m * xcbdb; - *(here->B3SOIDDBspPtr +1) += m * xcbsb; - - *(here->B3SOIDDEbPtr +1) -= m * (xcegb + xcedb + xcesb + xceeb); - *(here->B3SOIDDGbPtr +1) -= m * (xcggb + xcgdb + xcgsb + xcgeb); - *(here->B3SOIDDDPbPtr +1) -= m * (xcdgb + xcddb + xcdsb + xcdeb); - *(here->B3SOIDDSPbPtr +1) -= m * (xcsgb + xcsdb + xcssb + xcseb); - *(here->B3SOIDDBbPtr +1) -= m * (xcbgb + xcbdb + xcbsb + xcbeb); - - if (selfheat) - { - *(here->B3SOIDDTemptempPtr + 1) += m * xcTt; - *(here->B3SOIDDDPtempPtr + 1) += m * xcdT; - *(here->B3SOIDDSPtempPtr + 1) += m * xcsT; - *(here->B3SOIDDBtempPtr + 1) += m * xcbT; - *(here->B3SOIDDEtempPtr + 1) += m * xceT; - *(here->B3SOIDDGtempPtr + 1) += m * xcgT; - } - - -if (here->B3SOIDDdebugMod > 3) -{ -fprintf(fpdebug, "Cbg+Cbs+Cbe = %.5e; Cbd = %.5e;\n", -(xcbgb+xcbsb+xcbeb)/omega, xcbdb/omega); -fprintf(fpdebug, "gbs = %.5e; gbd = %.5e\n", gbbsp, gbbdp); - - - fprintf(fpdebug, "AC condunctance...\n"); - fprintf(fpdebug, "Eg=%.5e; Edp=%.5e; Esp=%.5e;\nEb=%.5e; Ee=%.5e\n", -xcegb, xcedb, xcesb, -(xcegb+xcedb+xcesb+xceeb), xceeb); - fprintf(fpdebug, "Gg=%.5e; Gdp=%.5e; Gsp=%.5e;\nGb=%.5e; Ge=%.5e\n", -xcggb, xcgdb, xcgsb, -(xcggb+xcgdb+xcgsb+xcgeb), xcgeb); - fprintf(fpdebug, "Bg=%.5e; Bdp=%.5e; Bsp=%.5e;\nBb=%.5e; Be=%.5e\n", -xcbgb, xcbdb, xcbsb, -(xcbgb+xcbdb+xcbsb+xcbeb), xcbeb); - fprintf(fpdebug, "DPg=%.5e; DPdp=%.5e; DPsp=%.5e;\nDPb=%.5e; DPe=%.5e\n", -xcdgb, xcddb, xcdsb, -(xcdgb+xcddb+xcdsb+xcdeb), xcdeb); - fprintf(fpdebug, "SPg=%.5e; SPdp=%.5e; SPsp=%.5e;\nSPb=%.5e; SPe=%.5e\n", -xcsgb, xcsdb, xcssb, -(xcsgb+xcsdb+xcssb+xcseb), xcseb); -} - - - - *(here->B3SOIDDEgPtr) += 0.0; - *(here->B3SOIDDEdpPtr) += 0.0; - *(here->B3SOIDDEspPtr) += 0.0; - *(here->B3SOIDDGePtr) -= 0.0; - *(here->B3SOIDDDPePtr) += m * (Gme + gddpe); - *(here->B3SOIDDSPePtr) += m * (gsspe - Gme); - - *(here->B3SOIDDEePtr) += 0.0; - - *(here->B3SOIDDDPgPtr) += m * (Gm + gddpg); - *(here->B3SOIDDDPdpPtr) += m * (gdpr + gds + gddpdp + RevSum); - *(here->B3SOIDDDPspPtr) -= m * (gds + FwdSum - gddpsp); - *(here->B3SOIDDDPdPtr) -= m * gdpr; - - *(here->B3SOIDDSPgPtr) -= m * (Gm - gsspg); - *(here->B3SOIDDSPdpPtr) -= m * (gds + RevSum - gsspdp); - *(here->B3SOIDDSPspPtr) += m * (gspr + gds + FwdSum + gsspsp); - *(here->B3SOIDDSPsPtr) -= m * gspr; - - *(here->B3SOIDDBePtr) += m * gbbe; - *(here->B3SOIDDBgPtr) += m * gbbg; - *(here->B3SOIDDBdpPtr) += m * gbbdp; - *(here->B3SOIDDBspPtr) += m * gbbsp; - *(here->B3SOIDDBbPtr) += m * gbbb; - *(here->B3SOIDDEbPtr) += 0.0; - *(here->B3SOIDDSPbPtr) -= m * (Gmbs - gsspb); - *(here->B3SOIDDDPbPtr) -= m * (-gddpb - Gmbs); - - if (selfheat) - { - *(here->B3SOIDDDPtempPtr) += m * (GmT + gddpT); - *(here->B3SOIDDSPtempPtr) += m * (-GmT + gsspT); - *(here->B3SOIDDBtempPtr) += m * gbbT; - if (here->B3SOIDDbodyMod == 1) { - (*(here->B3SOIDDPtempPtr) += m * gppT); - } - - *(here->B3SOIDDTemptempPtr) += m * (gTtt + 1/here->pParam->B3SOIDDrth); - *(here->B3SOIDDTempgPtr) += m * gTtg; - *(here->B3SOIDDTempbPtr) += m * gTtb; - *(here->B3SOIDDTempePtr) += m * gTte; - *(here->B3SOIDDTempdpPtr) += m * gTtdp; - *(here->B3SOIDDTempspPtr) += m * gTtsp; - } - -if (here->B3SOIDDdebugMod > 3) -{ - fprintf(fpdebug, "Static condunctance...\n"); - fprintf(fpdebug, "Gg=%.5e; Gdp=%.5e; Gsp=%.5e;\nGb=%.5e; Ge=%.5e\n", - *(here->B3SOIDDGgPtr), *(here->B3SOIDDGdpPtr), - *(here->B3SOIDDGspPtr), *(here->B3SOIDDGbPtr), - *(here->B3SOIDDGePtr)); - fprintf(fpdebug, "DPg=%.5e; DPdp=%.5e; DPsp=%.5e;\nDPb=%.5e; DPe=%.5e\n", - *(here->B3SOIDDDPgPtr), *(here->B3SOIDDDPdpPtr), - *(here->B3SOIDDDPspPtr), *(here->B3SOIDDDPbPtr), - *(here->B3SOIDDDPePtr)); - fprintf(fpdebug, "SPg=%.5e; SPdp=%.5e; SPsp=%.5e;\nSPb=%.5e; SPe=%.5e\n", - *(here->B3SOIDDSPgPtr), *(here->B3SOIDDSPdpPtr), - *(here->B3SOIDDSPspPtr), *(here->B3SOIDDSPbPtr), - *(here->B3SOIDDSPePtr)); - fprintf(fpdebug, "Bg=%.5e; Bdp=%.5e; Bsp=%.5e;\nBb=%.5e; Be=%.5e\n", -gbbg, gbbdp, gbbsp, gbbb, gbbe); -} - - *(here->B3SOIDDDdPtr) += m * gdpr; - *(here->B3SOIDDDdpPtr) -= m * gdpr; - *(here->B3SOIDDSsPtr) += m * gspr; - *(here->B3SOIDDSspPtr) -= m * gspr; - - - if (here->B3SOIDDbodyMod == 1) { - (*(here->B3SOIDDBpPtr) -= m * gppp); - (*(here->B3SOIDDPbPtr) += m * gppb); - (*(here->B3SOIDDPpPtr) += m * gppp); - (*(here->B3SOIDDPgPtr) += m * gppg); - (*(here->B3SOIDDPdpPtr) += m * gppdp); - (*(here->B3SOIDDPspPtr) += m * gppsp); - (*(here->B3SOIDDPePtr) += m * gppe); - } - if (here->B3SOIDDdebugMod > 1) - { - *(here->B3SOIDDVbsPtr) += m * 1; - *(here->B3SOIDDIdsPtr) += m * 1; - *(here->B3SOIDDIcPtr) += m * 1; - *(here->B3SOIDDIbsPtr) += m * 1; - *(here->B3SOIDDIbdPtr) += m * 1; - *(here->B3SOIDDIiiPtr) += m * 1; - *(here->B3SOIDDIgidlPtr) += m * 1; - *(here->B3SOIDDItunPtr) += m * 1; - *(here->B3SOIDDIbpPtr) += m * 1; - *(here->B3SOIDDAbeffPtr) += m * 1; - *(here->B3SOIDDVbs0effPtr) += m * 1; - *(here->B3SOIDDVbseffPtr) += 1; - *(here->B3SOIDDXcPtr) += m * 1; - *(here->B3SOIDDCbgPtr) += m * 1; - *(here->B3SOIDDCbbPtr) += m * 1; - *(here->B3SOIDDCbdPtr) += m * 1; - *(here->B3SOIDDqbPtr) += m * 1; - *(here->B3SOIDDQbfPtr) += m * 1; - *(here->B3SOIDDQjsPtr) += m * 1; - *(here->B3SOIDDQjdPtr) += m * 1; - - /* clean up last */ - *(here->B3SOIDDGmPtr) += m * 1; - *(here->B3SOIDDGmbsPtr) += m * 1; - *(here->B3SOIDDGdsPtr) += m * 1; - *(here->B3SOIDDGmePtr) += m * 1; - *(here->B3SOIDDVbs0teffPtr) += m * 1; - *(here->B3SOIDDVgsteffPtr) += m * 1; - *(here->B3SOIDDCbePtr) += m * 1; - *(here->B3SOIDDVthPtr) += m * 1; - *(here->B3SOIDDXcsatPtr) += m * 1; - *(here->B3SOIDDVdscvPtr) += m * 1; - *(here->B3SOIDDVcscvPtr) += m * 1; - *(here->B3SOIDDQaccPtr) += m * 1; - *(here->B3SOIDDQsub0Ptr) += m * 1; - *(here->B3SOIDDQsubs1Ptr) += m * 1; - *(here->B3SOIDDQsubs2Ptr) += m * 1; - *(here->B3SOIDDqgPtr) += m * 1; - *(here->B3SOIDDqdPtr) += m * 1; - *(here->B3SOIDDqePtr) += m * 1; - *(here->B3SOIDDDum1Ptr) += m * 1; - *(here->B3SOIDDDum2Ptr) += m * 1; - *(here->B3SOIDDDum3Ptr) += m * 1; - *(here->B3SOIDDDum4Ptr) += m * 1; - *(here->B3SOIDDDum5Ptr) += m * 1; - } - - if (here->B3SOIDDdebugMod > 2) - fclose(fpdebug); - } - } - return(OK); -} - diff --git a/src/spicelib/devices/bsim3soi_dd/b3soiddask.c b/src/spicelib/devices/bsim3soi_dd/b3soiddask.c deleted file mode 100644 index 5bf2353df..000000000 --- a/src/spicelib/devices/bsim3soi_dd/b3soiddask.c +++ /dev/null @@ -1,245 +0,0 @@ -/********** -Copyright 1999 Regents of the University of California. All rights reserved. -Author: Weidong Liu and Pin Su Feb 1999 -Author: 1998 Samuel Fung, Dennis Sinitsky and Stephen Tang -File: b3soiddask.c 98/5/01 -Modified by Paolo Nenzi 2002 -**********/ - -/* - * Revision 2.1 99/9/27 Pin Su - * BSIMDD2.1 release - */ - -#include "ngspice/ngspice.h" -#include "ngspice/ifsim.h" -#include "ngspice/cktdefs.h" -#include "ngspice/devdefs.h" -#include "b3soidddef.h" -#include "ngspice/sperror.h" -#include "ngspice/suffix.h" - -int -B3SOIDDask(CKTcircuit *ckt, GENinstance *inst, int which, IFvalue *value, - IFvalue *select) -{ -B3SOIDDinstance *here = (B3SOIDDinstance*)inst; - - NG_IGNORE(select); - - switch(which) - { case B3SOIDD_L: - value->rValue = here->B3SOIDDl; - return(OK); - case B3SOIDD_W: - value->rValue = here->B3SOIDDw; - return(OK); - case B3SOIDD_AS: - value->rValue = here->B3SOIDDsourceArea; - return(OK); - case B3SOIDD_AD: - value->rValue = here->B3SOIDDdrainArea; - return(OK); - case B3SOIDD_PS: - value->rValue = here->B3SOIDDsourcePerimeter; - return(OK); - case B3SOIDD_PD: - value->rValue = here->B3SOIDDdrainPerimeter; - return(OK); - case B3SOIDD_NRS: - value->rValue = here->B3SOIDDsourceSquares; - return(OK); - case B3SOIDD_NRD: - value->rValue = here->B3SOIDDdrainSquares; - return(OK); - case B3SOIDD_OFF: - value->rValue = here->B3SOIDDoff; - return(OK); - case B3SOIDD_BJTOFF: - value->iValue = here->B3SOIDDbjtoff; - return(OK); - case B3SOIDD_RTH0: - value->rValue = here->B3SOIDDrth0; - value->rValue /= here->B3SOIDDm; - return(OK); - case B3SOIDD_CTH0: - value->rValue = here->B3SOIDDcth0; - value->rValue *= here->B3SOIDDm; - return(OK); - case B3SOIDD_NRB: - value->rValue = here->B3SOIDDbodySquares; - return(OK); - case B3SOIDD_IC_VBS: - value->rValue = here->B3SOIDDicVBS; - return(OK); - case B3SOIDD_IC_VDS: - value->rValue = here->B3SOIDDicVDS; - return(OK); - case B3SOIDD_IC_VGS: - value->rValue = here->B3SOIDDicVGS; - return(OK); - case B3SOIDD_IC_VES: - value->rValue = here->B3SOIDDicVES; - return(OK); - case B3SOIDD_IC_VPS: - value->rValue = here->B3SOIDDicVPS; - return(OK); - case B3SOIDD_DNODE: - value->iValue = here->B3SOIDDdNode; - return(OK); - case B3SOIDD_GNODE: - value->iValue = here->B3SOIDDgNode; - return(OK); - case B3SOIDD_SNODE: - value->iValue = here->B3SOIDDsNode; - return(OK); - case B3SOIDD_BNODE: - value->iValue = here->B3SOIDDbNode; - return(OK); - case B3SOIDD_ENODE: - value->iValue = here->B3SOIDDeNode; - return(OK); - case B3SOIDD_DNODEPRIME: - value->iValue = here->B3SOIDDdNodePrime; - return(OK); - case B3SOIDD_SNODEPRIME: - value->iValue = here->B3SOIDDsNodePrime; - return(OK); - case B3SOIDD_SOURCECONDUCT: - value->rValue = here->B3SOIDDsourceConductance; - value->rValue *= here->B3SOIDDm; - return(OK); - case B3SOIDD_DRAINCONDUCT: - value->rValue = here->B3SOIDDdrainConductance; - value->rValue *= here->B3SOIDDm; - return(OK); - case B3SOIDD_VBD: - value->rValue = *(ckt->CKTstate0 + here->B3SOIDDvbd); - return(OK); - case B3SOIDD_VBS: - value->rValue = *(ckt->CKTstate0 + here->B3SOIDDvbs); - return(OK); - case B3SOIDD_VGS: - value->rValue = *(ckt->CKTstate0 + here->B3SOIDDvgs); - return(OK); - case B3SOIDD_VES: - value->rValue = *(ckt->CKTstate0 + here->B3SOIDDves); - return(OK); - case B3SOIDD_VDS: - value->rValue = *(ckt->CKTstate0 + here->B3SOIDDvds); - return(OK); - case B3SOIDD_CD: - value->rValue = here->B3SOIDDcd; - value->rValue *= here->B3SOIDDm; - return(OK); - case B3SOIDD_CBS: - value->rValue = here->B3SOIDDcjs; - value->rValue *= here->B3SOIDDm; - return(OK); - case B3SOIDD_CBD: - value->rValue = here->B3SOIDDcjd; - value->rValue *= here->B3SOIDDm; - return(OK); - case B3SOIDD_GM: - value->rValue = here->B3SOIDDgm; - value->rValue *= here->B3SOIDDm; - return(OK); - case B3SOIDD_GMID: - value->rValue = here->B3SOIDDgm/here->B3SOIDDcd; - return(OK); - case B3SOIDD_GDS: - value->rValue = here->B3SOIDDgds; - value->rValue *= here->B3SOIDDm; - return(OK); - case B3SOIDD_GMBS: - value->rValue = here->B3SOIDDgmbs; - value->rValue *= here->B3SOIDDm; - return(OK); - case B3SOIDD_GBD: - value->rValue = here->B3SOIDDgjdb; - value->rValue *= here->B3SOIDDm; - return(OK); - case B3SOIDD_GBS: - value->rValue = here->B3SOIDDgjsb; - value->rValue *= here->B3SOIDDm; - return(OK); - case B3SOIDD_QB: - value->rValue = *(ckt->CKTstate0 + here->B3SOIDDqb); - value->rValue *= here->B3SOIDDm; - return(OK); - case B3SOIDD_CQB: - value->rValue = *(ckt->CKTstate0 + here->B3SOIDDcqb); - value->rValue *= here->B3SOIDDm; - return(OK); - case B3SOIDD_QG: - value->rValue = *(ckt->CKTstate0 + here->B3SOIDDqg); - value->rValue *= here->B3SOIDDm; - return(OK); - case B3SOIDD_CQG: - value->rValue = *(ckt->CKTstate0 + here->B3SOIDDcqg); - value->rValue *= here->B3SOIDDm; - return(OK); - case B3SOIDD_QD: - value->rValue = *(ckt->CKTstate0 + here->B3SOIDDqd); - value->rValue *= here->B3SOIDDm; - return(OK); - case B3SOIDD_CQD: - value->rValue = *(ckt->CKTstate0 + here->B3SOIDDcqd); - value->rValue *= here->B3SOIDDm; - return(OK); - case B3SOIDD_CGG: - value->rValue = here->B3SOIDDcggb; - value->rValue *= here->B3SOIDDm; - return(OK); - case B3SOIDD_CGD: - value->rValue = here->B3SOIDDcgdb; - value->rValue *= here->B3SOIDDm; - return(OK); - case B3SOIDD_CGS: - value->rValue = here->B3SOIDDcgsb; - value->rValue *= here->B3SOIDDm; - return(OK); - case B3SOIDD_CDG: - value->rValue = here->B3SOIDDcdgb; - value->rValue *= here->B3SOIDDm; - return(OK); - case B3SOIDD_CDD: - value->rValue = here->B3SOIDDcddb; - value->rValue *= here->B3SOIDDm; - return(OK); - case B3SOIDD_CDS: - value->rValue = here->B3SOIDDcdsb; - value->rValue *= here->B3SOIDDm; - return(OK); - case B3SOIDD_CBG: - value->rValue = here->B3SOIDDcbgb; - value->rValue *= here->B3SOIDDm; - return(OK); - case B3SOIDD_CBDB: - value->rValue = here->B3SOIDDcbdb; - value->rValue *= here->B3SOIDDm; - return(OK); - case B3SOIDD_CBSB: - value->rValue = here->B3SOIDDcbsb; - value->rValue *= here->B3SOIDDm; - return(OK); - case B3SOIDD_VON: - value->rValue = here->B3SOIDDvon; - return(OK); - case B3SOIDD_VDSAT: - value->rValue = here->B3SOIDDvdsat; - return(OK); - case B3SOIDD_QBS: - value->rValue = *(ckt->CKTstate0 + here->B3SOIDDqbs); - value->rValue *= here->B3SOIDDm; - return(OK); - case B3SOIDD_QBD: - value->rValue = *(ckt->CKTstate0 + here->B3SOIDDqbd); - value->rValue *= here->B3SOIDDm; - return(OK); - default: - return(E_BADPARM); - } - /* NOTREACHED */ -} - diff --git a/src/spicelib/devices/bsim3soi_dd/b3soiddcheck.c b/src/spicelib/devices/bsim3soi_dd/b3soiddcheck.c deleted file mode 100644 index 74e51d240..000000000 --- a/src/spicelib/devices/bsim3soi_dd/b3soiddcheck.c +++ /dev/null @@ -1,507 +0,0 @@ -/********** -Copyright 1999 Regents of the University of California. All rights reserved. -Author: 1998 Samuel Fung, Dennis Sinitsky and Stephen Tang -File: b3soiddcheck.c 98/5/01 -Modified by Paolo Nenzi 2002 -**********/ - -/* - * Revision 2.1 99/9/27 Pin Su - * BSIMDD2.1 release - */ - -#include "ngspice/ngspice.h" -#include "ngspice/cktdefs.h" -#include "b3soidddef.h" -#include "ngspice/trandefs.h" -#include "ngspice/const.h" -#include "ngspice/sperror.h" -#include "ngspice/devdefs.h" -#include "ngspice/suffix.h" - -int -B3SOIDDcheckModel(B3SOIDDmodel *model, B3SOIDDinstance *here, CKTcircuit *ckt) -{ -struct b3soiddSizeDependParam *pParam; -int Fatal_Flag = 0; -FILE *fplog; - - NG_IGNORE(ckt); - - if ((fplog = fopen("b3soiddv2check.log", "w")) != NULL) - { pParam = here->pParam; - fprintf(fplog, "B3SOI(DD)V2.1 Parameter Check\n"); - fprintf(fplog, "Model = %s\n", model->B3SOIDDmodName); - fprintf(fplog, "W = %g, L = %g\n, M = %g\n", here->B3SOIDDw, - here->B3SOIDDl, here->B3SOIDDm); - - - if (pParam->B3SOIDDnlx < -pParam->B3SOIDDleff) - { fprintf(fplog, "Fatal: Nlx = %g is less than -Leff.\n", - pParam->B3SOIDDnlx); - printf("Fatal: Nlx = %g is less than -Leff.\n", - pParam->B3SOIDDnlx); - Fatal_Flag = 1; - } - - if (model->B3SOIDDtox <= 0.0) - { fprintf(fplog, "Fatal: Tox = %g is not positive.\n", - model->B3SOIDDtox); - printf("Fatal: Tox = %g is not positive.\n", model->B3SOIDDtox); - Fatal_Flag = 1; - } - - if (model->B3SOIDDtbox <= 0.0) - { fprintf(fplog, "Fatal: Tbox = %g is not positive.\n", - model->B3SOIDDtbox); - printf("Fatal: Tbox = %g is not positive.\n", model->B3SOIDDtbox); - Fatal_Flag = 1; - } - - if (pParam->B3SOIDDnpeak <= 0.0) - { fprintf(fplog, "Fatal: Nch = %g is not positive.\n", - pParam->B3SOIDDnpeak); - printf("Fatal: Nch = %g is not positive.\n", - pParam->B3SOIDDnpeak); - Fatal_Flag = 1; - } - if (pParam->B3SOIDDngate < 0.0) - { fprintf(fplog, "Fatal: Ngate = %g is not positive.\n", - pParam->B3SOIDDngate); - printf("Fatal: Ngate = %g Ngate is not positive.\n", - pParam->B3SOIDDngate); - Fatal_Flag = 1; - } - if (pParam->B3SOIDDngate > 1.e25) - { fprintf(fplog, "Fatal: Ngate = %g is too high.\n", - pParam->B3SOIDDngate); - printf("Fatal: Ngate = %g Ngate is too high\n", - pParam->B3SOIDDngate); - Fatal_Flag = 1; - } - - if (model->B3SOIDDdvbd1 < 0.0) - { fprintf(fplog, "Fatal: Dvbd1 = %g is negative.\n", - model->B3SOIDDdvbd1); - printf("Fatal: Dvbd1 = %g is negative.\n", model->B3SOIDDdvbd1); - Fatal_Flag = 1; - } - - if (pParam->B3SOIDDdvt1 < 0.0) - { fprintf(fplog, "Fatal: Dvt1 = %g is negative.\n", - pParam->B3SOIDDdvt1); - printf("Fatal: Dvt1 = %g is negative.\n", pParam->B3SOIDDdvt1); - Fatal_Flag = 1; - } - - if (pParam->B3SOIDDdvt1w < 0.0) - { fprintf(fplog, "Fatal: Dvt1w = %g is negative.\n", - pParam->B3SOIDDdvt1w); - printf("Fatal: Dvt1w = %g is negative.\n", pParam->B3SOIDDdvt1w); - Fatal_Flag = 1; - } - - if (pParam->B3SOIDDw0 == -pParam->B3SOIDDweff) - { fprintf(fplog, "Fatal: (W0 + Weff) = 0 cauing divided-by-zero.\n"); - printf("Fatal: (W0 + Weff) = 0 cauing divided-by-zero.\n"); - Fatal_Flag = 1; - } - - if (pParam->B3SOIDDdsub < 0.0) - { fprintf(fplog, "Fatal: Dsub = %g is negative.\n", pParam->B3SOIDDdsub); - printf("Fatal: Dsub = %g is negative.\n", pParam->B3SOIDDdsub); - Fatal_Flag = 1; - } - if (pParam->B3SOIDDb1 == -pParam->B3SOIDDweff) - { fprintf(fplog, "Fatal: (B1 + Weff) = 0 causing divided-by-zero.\n"); - printf("Fatal: (B1 + Weff) = 0 causing divided-by-zero.\n"); - Fatal_Flag = 1; - } - if (pParam->B3SOIDDu0temp <= 0.0) - { fprintf(fplog, "Fatal: u0 at current temperature = %g is not positive.\n", pParam->B3SOIDDu0temp); - printf("Fatal: u0 at current temperature = %g is not positive.\n", - pParam->B3SOIDDu0temp); - Fatal_Flag = 1; - } - -/* Check delta parameter */ - if (pParam->B3SOIDDdelta < 0.0) - { fprintf(fplog, "Fatal: Delta = %g is less than zero.\n", - pParam->B3SOIDDdelta); - printf("Fatal: Delta = %g is less than zero.\n", pParam->B3SOIDDdelta); - Fatal_Flag = 1; - } - - if (pParam->B3SOIDDvsattemp <= 0.0) - { fprintf(fplog, "Fatal: Vsat at current temperature = %g is not positive.\n", pParam->B3SOIDDvsattemp); - printf("Fatal: Vsat at current temperature = %g is not positive.\n", - pParam->B3SOIDDvsattemp); - Fatal_Flag = 1; - } -/* Check Rout parameters */ - if (pParam->B3SOIDDpclm <= 0.0) - { fprintf(fplog, "Fatal: Pclm = %g is not positive.\n", pParam->B3SOIDDpclm); - printf("Fatal: Pclm = %g is not positive.\n", pParam->B3SOIDDpclm); - Fatal_Flag = 1; - } - - if (pParam->B3SOIDDdrout < 0.0) - { fprintf(fplog, "Fatal: Drout = %g is negative.\n", pParam->B3SOIDDdrout); - printf("Fatal: Drout = %g is negative.\n", pParam->B3SOIDDdrout); - Fatal_Flag = 1; - } - if ( model->B3SOIDDunitLengthGateSidewallJctCap > 0.0) - { - if (here->B3SOIDDdrainPerimeter < pParam->B3SOIDDweff) - { fprintf(fplog, "Warning: Pd = %g is less than W.\n", - here->B3SOIDDdrainPerimeter); - printf("Warning: Pd = %g is less than W.\n", - here->B3SOIDDdrainPerimeter); - here->B3SOIDDdrainPerimeter =pParam->B3SOIDDweff; - } - if (here->B3SOIDDsourcePerimeter < pParam->B3SOIDDweff) - { fprintf(fplog, "Warning: Ps = %g is less than W.\n", - here->B3SOIDDsourcePerimeter); - printf("Warning: Ps = %g is less than W.\n", - here->B3SOIDDsourcePerimeter); - here->B3SOIDDsourcePerimeter =pParam->B3SOIDDweff; - } - } -/* Check capacitance parameters */ - if (pParam->B3SOIDDclc < 0.0) - { fprintf(fplog, "Fatal: Clc = %g is negative.\n", pParam->B3SOIDDclc); - printf("Fatal: Clc = %g is negative.\n", pParam->B3SOIDDclc); - Fatal_Flag = 1; - } - if (model->B3SOIDDparamChk ==1) - { -/* Check L and W parameters */ - if (pParam->B3SOIDDleff <= 5.0e-8) - { fprintf(fplog, "Warning: Leff = %g may be too small.\n", - pParam->B3SOIDDleff); - printf("Warning: Leff = %g may be too small.\n", - pParam->B3SOIDDleff); - } - - if (pParam->B3SOIDDleffCV <= 5.0e-8) - { fprintf(fplog, "Warning: Leff for CV = %g may be too small.\n", - pParam->B3SOIDDleffCV); - printf("Warning: Leff for CV = %g may be too small.\n", - pParam->B3SOIDDleffCV); - } - - if (pParam->B3SOIDDweff <= 1.0e-7) - { fprintf(fplog, "Warning: Weff = %g may be too small.\n", - pParam->B3SOIDDweff); - printf("Warning: Weff = %g may be too small.\n", - pParam->B3SOIDDweff); - } - - if (pParam->B3SOIDDweffCV <= 1.0e-7) - { fprintf(fplog, "Warning: Weff for CV = %g may be too small.\n", - pParam->B3SOIDDweffCV); - printf("Warning: Weff for CV = %g may be too small.\n", - pParam->B3SOIDDweffCV); - } - -/* Check threshold voltage parameters */ - if (pParam->B3SOIDDnlx < 0.0) - { fprintf(fplog, "Warning: Nlx = %g is negative.\n", pParam->B3SOIDDnlx); - printf("Warning: Nlx = %g is negative.\n", pParam->B3SOIDDnlx); - } - if (model->B3SOIDDtox < 1.0e-9) - { fprintf(fplog, "Warning: Tox = %g is less than 10A.\n", - model->B3SOIDDtox); - printf("Warning: Tox = %g is less than 10A.\n", model->B3SOIDDtox); - } - - if (pParam->B3SOIDDnpeak <= 1.0e15) - { fprintf(fplog, "Warning: Nch = %g may be too small.\n", - pParam->B3SOIDDnpeak); - printf("Warning: Nch = %g may be too small.\n", - pParam->B3SOIDDnpeak); - } - else if (pParam->B3SOIDDnpeak >= 1.0e21) - { fprintf(fplog, "Warning: Nch = %g may be too large.\n", - pParam->B3SOIDDnpeak); - printf("Warning: Nch = %g may be too large.\n", - pParam->B3SOIDDnpeak); - } - - if (fabs(pParam->B3SOIDDnsub) >= 1.0e21) - { fprintf(fplog, "Warning: Nsub = %g may be too large.\n", - pParam->B3SOIDDnsub); - printf("Warning: Nsub = %g may be too large.\n", - pParam->B3SOIDDnsub); - } - - if ((pParam->B3SOIDDngate > 0.0) && - (pParam->B3SOIDDngate <= 1.e18)) - { fprintf(fplog, "Warning: Ngate = %g is less than 1.E18cm^-3.\n", - pParam->B3SOIDDngate); - printf("Warning: Ngate = %g is less than 1.E18cm^-3.\n", - pParam->B3SOIDDngate); - } - - if (model->B3SOIDDdvbd0 < 0.0) - { fprintf(fplog, "Warning: Dvbd0 = %g is negative.\n", - model->B3SOIDDdvbd0); - printf("Warning: Dvbd0 = %g is negative.\n", model->B3SOIDDdvbd0); - } - - if (pParam->B3SOIDDdvt0 < 0.0) - { fprintf(fplog, "Warning: Dvt0 = %g is negative.\n", - pParam->B3SOIDDdvt0); - printf("Warning: Dvt0 = %g is negative.\n", pParam->B3SOIDDdvt0); - } - - if (fabs(1.0e-6 / (pParam->B3SOIDDw0 + pParam->B3SOIDDweff)) > 10.0) - { fprintf(fplog, "Warning: (W0 + Weff) may be too small.\n"); - printf("Warning: (W0 + Weff) may be too small.\n"); - } - -/* Check subthreshold parameters */ - if (pParam->B3SOIDDnfactor < 0.0) - { fprintf(fplog, "Warning: Nfactor = %g is negative.\n", - pParam->B3SOIDDnfactor); - printf("Warning: Nfactor = %g is negative.\n", pParam->B3SOIDDnfactor); - } - if (model->B3SOIDDkb3 < 0.0) - { fprintf(fplog, "Warning: Kb3 = %g is negative.\n", - model->B3SOIDDkb3); - printf("Warning: Kb3 = %g is negative.\n", model->B3SOIDDkb3); - } - - if (pParam->B3SOIDDcdsc < 0.0) - { fprintf(fplog, "Warning: Cdsc = %g is negative.\n", - pParam->B3SOIDDcdsc); - printf("Warning: Cdsc = %g is negative.\n", pParam->B3SOIDDcdsc); - } - if (pParam->B3SOIDDcdscd < 0.0) - { fprintf(fplog, "Warning: Cdscd = %g is negative.\n", - pParam->B3SOIDDcdscd); - printf("Warning: Cdscd = %g is negative.\n", pParam->B3SOIDDcdscd); - } -/* Check DIBL parameters */ - if (pParam->B3SOIDDeta0 < 0.0) - { fprintf(fplog, "Warning: Eta0 = %g is negative.\n", - pParam->B3SOIDDeta0); - printf("Warning: Eta0 = %g is negative.\n", pParam->B3SOIDDeta0); - } - -/* Check Abulk parameters */ - if (fabs(1.0e-6 / (pParam->B3SOIDDb1 + pParam->B3SOIDDweff)) > 10.0) - { fprintf(fplog, "Warning: (B1 + Weff) may be too small.\n"); - printf("Warning: (B1 + Weff) may be too small.\n"); - } - - if (model->B3SOIDDadice0 > 1.0) - { fprintf(fplog, "Warning: Adice0 = %g should be smaller than 1.\n", - model->B3SOIDDadice0); - printf("Warning: Adice0 = %g should be smaller than 1.\n", model->B3SOIDDadice0); - } - - if (model->B3SOIDDabp < 0.2) - { fprintf(fplog, "Warning: Abp = %g is too small.\n", - model->B3SOIDDabp); - printf("Warning: Abp = %g is too small.\n", model->B3SOIDDabp); - } - - if ((model->B3SOIDDmxc < -1.0) || (model->B3SOIDDmxc > 1.0)) - { fprintf(fplog, "Warning: Mxc = %g should be within (-1, 1).\n", - model->B3SOIDDmxc); - printf("Warning: Mxc = %g should be within (-1, 1).\n", model->B3SOIDDmxc); - } - -/* Check Saturation parameters */ - if (pParam->B3SOIDDa2 < 0.01) - { fprintf(fplog, "Warning: A2 = %g is too small. Set to 0.01.\n", pParam->B3SOIDDa2); - printf("Warning: A2 = %g is too small. Set to 0.01.\n", - pParam->B3SOIDDa2); - pParam->B3SOIDDa2 = 0.01; - } - else if (pParam->B3SOIDDa2 > 1.0) - { fprintf(fplog, "Warning: A2 = %g is larger than 1. A2 is set to 1 and A1 is set to 0.\n", - pParam->B3SOIDDa2); - printf("Warning: A2 = %g is larger than 1. A2 is set to 1 and A1 is set to 0.\n", - pParam->B3SOIDDa2); - pParam->B3SOIDDa2 = 1.0; - pParam->B3SOIDDa1 = 0.0; - - } - - if (pParam->B3SOIDDrdsw < 0.0) - { fprintf(fplog, "Warning: Rdsw = %g is negative. Set to zero.\n", - pParam->B3SOIDDrdsw); - printf("Warning: Rdsw = %g is negative. Set to zero.\n", - pParam->B3SOIDDrdsw); - pParam->B3SOIDDrdsw = 0.0; - pParam->B3SOIDDrds0 = 0.0; - } - else if ((pParam->B3SOIDDrds0 > 0.0) && (pParam->B3SOIDDrds0 < 0.001)) - { fprintf(fplog, "Warning: Rds at current temperature = %g is less than 0.001 ohm. Set to zero.\n", - pParam->B3SOIDDrds0); - printf("Warning: Rds at current temperature = %g is less than 0.001 ohm. Set to zero.\n", - pParam->B3SOIDDrds0); - pParam->B3SOIDDrds0 = 0.0; - } - if (pParam->B3SOIDDvsattemp < 1.0e3) - { fprintf(fplog, "Warning: Vsat at current temperature = %g may be too small.\n", pParam->B3SOIDDvsattemp); - printf("Warning: Vsat at current temperature = %g may be too small.\n", pParam->B3SOIDDvsattemp); - } - - if (pParam->B3SOIDDpdibl1 < 0.0) - { fprintf(fplog, "Warning: Pdibl1 = %g is negative.\n", - pParam->B3SOIDDpdibl1); - printf("Warning: Pdibl1 = %g is negative.\n", pParam->B3SOIDDpdibl1); - } - if (pParam->B3SOIDDpdibl2 < 0.0) - { fprintf(fplog, "Warning: Pdibl2 = %g is negative.\n", - pParam->B3SOIDDpdibl2); - printf("Warning: Pdibl2 = %g is negative.\n", pParam->B3SOIDDpdibl2); - } -/* Check overlap capacitance parameters */ - if (model->B3SOIDDcgdo < 0.0) - { fprintf(fplog, "Warning: cgdo = %g is negative. Set to zero.\n", model->B3SOIDDcgdo); - printf("Warning: cgdo = %g is negative. Set to zero.\n", model->B3SOIDDcgdo); - model->B3SOIDDcgdo = 0.0; - } - if (model->B3SOIDDcgso < 0.0) - { fprintf(fplog, "Warning: cgso = %g is negative. Set to zero.\n", model->B3SOIDDcgso); - printf("Warning: cgso = %g is negative. Set to zero.\n", model->B3SOIDDcgso); - model->B3SOIDDcgso = 0.0; - } - if (model->B3SOIDDcgeo < 0.0) - { fprintf(fplog, "Warning: cgeo = %g is negative. Set to zero.\n", model->B3SOIDDcgeo); - printf("Warning: cgeo = %g is negative. Set to zero.\n", model->B3SOIDDcgeo); - model->B3SOIDDcgeo = 0.0; - } - - if (model->B3SOIDDntun < 0.0) - { fprintf(fplog, "Warning: Ntun = %g is negative.\n", - model->B3SOIDDntun); - printf("Warning: Ntun = %g is negative.\n", model->B3SOIDDntun); - } - - if (model->B3SOIDDndiode < 0.0) - { fprintf(fplog, "Warning: Ndiode = %g is negative.\n", - model->B3SOIDDndiode); - printf("Warning: Ndiode = %g is negative.\n", model->B3SOIDDndiode); - } - - if (model->B3SOIDDisbjt < 0.0) - { fprintf(fplog, "Warning: Isbjt = %g is negative.\n", - model->B3SOIDDisbjt); - printf("Warning: Isbjt = %g is negative.\n", model->B3SOIDDisbjt); - } - - if (model->B3SOIDDisdif < 0.0) - { fprintf(fplog, "Warning: Isdif = %g is negative.\n", - model->B3SOIDDisdif); - printf("Warning: Isdif = %g is negative.\n", model->B3SOIDDisdif); - } - - if (model->B3SOIDDisrec < 0.0) - { fprintf(fplog, "Warning: Isrec = %g is negative.\n", - model->B3SOIDDisrec); - printf("Warning: Isrec = %g is negative.\n", model->B3SOIDDisrec); - } - - if (model->B3SOIDDistun < 0.0) - { fprintf(fplog, "Warning: Istun = %g is negative.\n", - model->B3SOIDDistun); - printf("Warning: Istun = %g is negative.\n", model->B3SOIDDistun); - } - - if (model->B3SOIDDedl < 0.0) - { fprintf(fplog, "Warning: Edl = %g is negative.\n", - model->B3SOIDDedl); - printf("Warning: Edl = %g is negative.\n", model->B3SOIDDedl); - } - - if (model->B3SOIDDkbjt1 < 0.0) - { fprintf(fplog, "Warning: Kbjt1 = %g is negative.\n", - model->B3SOIDDkbjt1); - printf("Warning: kbjt1 = %g is negative.\n", model->B3SOIDDkbjt1); - } - - if (model->B3SOIDDtt < 0.0) - { fprintf(fplog, "Warning: Tt = %g is negative.\n", - model->B3SOIDDtt); - printf("Warning: Tt = %g is negative.\n", model->B3SOIDDtt); - } - - if (model->B3SOIDDcsdmin < 0.0) - { fprintf(fplog, "Warning: Csdmin = %g is negative.\n", - model->B3SOIDDcsdmin); - printf("Warning: Csdmin = %g is negative.\n", model->B3SOIDDcsdmin); - } - - if (model->B3SOIDDcsdesw < 0.0) - { fprintf(fplog, "Warning: Csdesw = %g is negative.\n", - model->B3SOIDDcsdesw); - printf("Warning: Csdesw = %g is negative.\n", model->B3SOIDDcsdesw); - } - - if ((model->B3SOIDDasd < 0.0) || (model->B3SOIDDmxc > 1.0)) - { fprintf(fplog, "Warning: Asd = %g should be within (0, 1).\n", - model->B3SOIDDasd); - printf("Warning: Asd = %g should be within (0, 1).\n", model->B3SOIDDasd); - } - - if (model->B3SOIDDrth0 < 0.0) - { fprintf(fplog, "Warning: Rth0 = %g is negative.\n", - model->B3SOIDDrth0); - printf("Warning: Rth0 = %g is negative.\n", model->B3SOIDDrth0); - } - - if (model->B3SOIDDcth0 < 0.0) - { fprintf(fplog, "Warning: Cth0 = %g is negative.\n", - model->B3SOIDDcth0); - printf("Warning: Cth0 = %g is negative.\n", model->B3SOIDDcth0); - } - - if (model->B3SOIDDrbody < 0.0) - { fprintf(fplog, "Warning: Rbody = %g is negative.\n", - model->B3SOIDDrbody); - printf("Warning: Rbody = %g is negative.\n", model->B3SOIDDrbody); - } - - if (model->B3SOIDDrbsh < 0.0) - { fprintf(fplog, "Warning: Rbsh = %g is negative.\n", - model->B3SOIDDrbsh); - printf("Warning: Rbsh = %g is negative.\n", model->B3SOIDDrbsh); - } - - if (model->B3SOIDDxj > model->B3SOIDDtsi) - { fprintf(fplog, "Warning: Xj = %g is thicker than Tsi = %g.\n", - model->B3SOIDDxj, model->B3SOIDDtsi); - printf("Warning: Xj = %g is thicker than Tsi = %g.\n", - model->B3SOIDDxj, model->B3SOIDDtsi); - } - - if (model->B3SOIDDcapMod < 2) - { fprintf(fplog, "Warning: capMod < 2 is not supported by BSIM3SOI.\n"); - printf("Warning: Warning: capMod < 2 is not supported by BSIM3SOI.\n"); - } - - if (model->B3SOIDDcii > 2.0) - { fprintf(fplog, "Warning: Cii = %g is larger than 2.0.\n", model->B3SOIDDcii); - printf("Warning: Cii = %g is larger than 2.0.\n", model->B3SOIDDcii); - } - - if (model->B3SOIDDdii > 1.5) - { fprintf(fplog, "Warning: Dii = %g is larger than 1.5.\n", model->B3SOIDDcii); - printf("Warning: Dii = %g is too larger than 1.5.\n", model->B3SOIDDcii); - } - - }/* loop for the parameter check for warning messages */ - fclose(fplog); - } - else - { fprintf(stderr, "Warning: Can't open log file. Parameter checking skipped.\n"); - } - - return(Fatal_Flag); -} - diff --git a/src/spicelib/devices/bsim3soi_dd/b3soiddcvtest.c b/src/spicelib/devices/bsim3soi_dd/b3soiddcvtest.c deleted file mode 100644 index 61ca19895..000000000 --- a/src/spicelib/devices/bsim3soi_dd/b3soiddcvtest.c +++ /dev/null @@ -1,92 +0,0 @@ -/********** -Copyright 1999 Regents of the University of California. All rights reserved. -Author: 1998 Samuel Fung, Dennis Sinitsky and Stephen Tang -File: b3soiddcvtest.c 98/5/01 -Modified by Paolo Nenzi 2002 -**********/ - -/* - * Revision 2.1 99/9/27 Pin Su - * BSIMDD2.1 release - */ - -#include "ngspice/ngspice.h" -#include "ngspice/cktdefs.h" -#include "b3soidddef.h" -#include "ngspice/trandefs.h" -#include "ngspice/const.h" -#include "ngspice/devdefs.h" -#include "ngspice/sperror.h" -#include "ngspice/suffix.h" - - -int -B3SOIDDconvTest(GENmodel *inModel, CKTcircuit *ckt) -{ -B3SOIDDmodel *model = (B3SOIDDmodel*)inModel; -B3SOIDDinstance *here; -double delvbd, delvbs, delvds, delvgd, delvgs, vbd, vbs, vds; -double cbd, cbhat, cbs, cd, cdhat, tol, vgd, vgdo, vgs; - - /* loop through all the B3SOIDD device models */ - for (; model != NULL; model = B3SOIDDnextModel(model)) - { /* loop through all the instances of the model */ - for (here = B3SOIDDinstances(model); here != NULL ; - here=B3SOIDDnextInstance(here)) - { - vbs = model->B3SOIDDtype - * (*(ckt->CKTrhsOld+here->B3SOIDDbNode) - - *(ckt->CKTrhsOld+here->B3SOIDDsNodePrime)); - vgs = model->B3SOIDDtype - * (*(ckt->CKTrhsOld+here->B3SOIDDgNode) - - *(ckt->CKTrhsOld+here->B3SOIDDsNodePrime)); - vds = model->B3SOIDDtype - * (*(ckt->CKTrhsOld+here->B3SOIDDdNodePrime) - - *(ckt->CKTrhsOld+here->B3SOIDDsNodePrime)); - vbd = vbs - vds; - vgd = vgs - vds; - vgdo = *(ckt->CKTstate0 + here->B3SOIDDvgs) - - *(ckt->CKTstate0 + here->B3SOIDDvds); - delvbs = vbs - *(ckt->CKTstate0 + here->B3SOIDDvbs); - delvbd = vbd - *(ckt->CKTstate0 + here->B3SOIDDvbd); - delvgs = vgs - *(ckt->CKTstate0 + here->B3SOIDDvgs); - delvds = vds - *(ckt->CKTstate0 + here->B3SOIDDvds); - delvgd = vgd-vgdo; - - cd = here->B3SOIDDcd; - if (here->B3SOIDDmode >= 0) - { cdhat = cd - here->B3SOIDDgjdb * delvbd - + here->B3SOIDDgmbs * delvbs + here->B3SOIDDgm * delvgs - + here->B3SOIDDgds * delvds; - } - else - { cdhat = cd - (here->B3SOIDDgjdb - here->B3SOIDDgmbs) * delvbd - - here->B3SOIDDgm * delvgd + here->B3SOIDDgds * delvds; - } - - /* - * check convergence - */ - if ((here->B3SOIDDoff == 0) || (!(ckt->CKTmode & MODEINITFIX))) - { tol = ckt->CKTreltol * MAX(fabs(cdhat), fabs(cd)) - + ckt->CKTabstol; - if (fabs(cdhat - cd) >= tol) - { ckt->CKTnoncon++; - return(OK); - } - cbs = here->B3SOIDDcjs; - cbd = here->B3SOIDDcjd; - cbhat = cbs + cbd + here->B3SOIDDgjdb * delvbd - + here->B3SOIDDgjsb * delvbs; - tol = ckt->CKTreltol * MAX(fabs(cbhat), fabs(cbs + cbd)) - + ckt->CKTabstol; - if (fabs(cbhat - (cbs + cbd)) > tol) - { ckt->CKTnoncon++; - return(OK); - } - } - } - } - return(OK); -} - diff --git a/src/spicelib/devices/bsim3soi_dd/b3soidddef.h b/src/spicelib/devices/bsim3soi_dd/b3soidddef.h deleted file mode 100644 index 93402cda7..000000000 --- a/src/spicelib/devices/bsim3soi_dd/b3soidddef.h +++ /dev/null @@ -1,1998 +0,0 @@ -/********** -Copyright 1999 Regents of the University of California. All rights reserved. -Author: Weidong Liu and Pin Su Feb 1999 -Author: 1998 Samuel Fung -Modified by Pin Su, Wei Jin 99/9/27 -File: b3soidddef.h -Modified by Paolo Nenzi 2002 -**********/ - -#ifndef B3SOIDD -#define B3SOIDD - -#define SOICODE -/* #define BULKCODE */ - -#include "ngspice/ifsim.h" -#include "ngspice/gendefs.h" -#include "ngspice/cktdefs.h" -#include "ngspice/complex.h" -#include "ngspice/noisedef.h" - -typedef struct sB3SOIDDinstance -{ - - struct GENinstance gen; - -#define B3SOIDDmodPtr(inst) ((struct sB3SOIDDmodel *)((inst)->gen.GENmodPtr)) -#define B3SOIDDnextInstance(inst) ((struct sB3SOIDDinstance *)((inst)->gen.GENnextInstance)) -#define B3SOIDDname gen.GENname -#define B3SOIDDstates gen.GENstate - - const int B3SOIDDdNode; - const int B3SOIDDgNode; - const int B3SOIDDsNode; - const int B3SOIDDeNode; - const int B3SOIDDbNodeExt; - const int B3SOIDDtempNodeExt; - const int B3SOIDDpNodeExt; - int B3SOIDDbNode; - int B3SOIDDtempNode; - int B3SOIDDpNode; - int B3SOIDDdNodePrime; - int B3SOIDDsNodePrime; - - int B3SOIDDvbsNode; - /* for Debug */ - int B3SOIDDidsNode; - int B3SOIDDicNode; - int B3SOIDDibsNode; - int B3SOIDDibdNode; - int B3SOIDDiiiNode; - int B3SOIDDigidlNode; - int B3SOIDDitunNode; - int B3SOIDDibpNode; - int B3SOIDDabeffNode; - int B3SOIDDvbs0effNode; - int B3SOIDDvbseffNode; - int B3SOIDDxcNode; - int B3SOIDDcbbNode; - int B3SOIDDcbdNode; - int B3SOIDDcbeNode; - int B3SOIDDcbgNode; - int B3SOIDDqbNode; - int B3SOIDDqbfNode; - int B3SOIDDqjsNode; - int B3SOIDDqjdNode; - -/* clean up last */ - int B3SOIDDgmNode; - int B3SOIDDgmbsNode; - int B3SOIDDgdsNode; - int B3SOIDDgmeNode; - int B3SOIDDqgNode; - int B3SOIDDqdNode; - int B3SOIDDqeNode; - int B3SOIDDiterations; - int B3SOIDDvbs0teffNode; - int B3SOIDDvthNode; - int B3SOIDDvgsteffNode; - int B3SOIDDxcsatNode; - int B3SOIDDqaccNode; - int B3SOIDDqsub0Node; - int B3SOIDDqsubs1Node; - int B3SOIDDqsubs2Node; - int B3SOIDDvcscvNode; - int B3SOIDDvdscvNode; - int B3SOIDDdum1Node; - int B3SOIDDdum2Node; - int B3SOIDDdum3Node; - int B3SOIDDdum4Node; - int B3SOIDDdum5Node; -/* end clean up last */ - - double B3SOIDDphi; - double B3SOIDDvtm; - double B3SOIDDni; - double B3SOIDDueff; - double B3SOIDDthetavth; - double B3SOIDDvon; - double B3SOIDDvbsdio; - double B3SOIDDvdsat; - double B3SOIDDcgdo; - double B3SOIDDcgso; - double B3SOIDDcgeo; - - double B3SOIDDids; - double B3SOIDDic; - double B3SOIDDibs; - double B3SOIDDibd; - double B3SOIDDiii; - double B3SOIDDigidl; - double B3SOIDDitun; - double B3SOIDDibp; - double B3SOIDDabeff; - double B3SOIDDvbs0eff; - double B3SOIDDvbseff; - double B3SOIDDxc; - double B3SOIDDcbg; - double B3SOIDDcbb; - double B3SOIDDcbd; - double B3SOIDDqb; - double B3SOIDDqbf; - double B3SOIDDqjs; - double B3SOIDDqjd; - double B3SOIDDminIsub; - int B3SOIDDfloat; - -/* clean up last */ - double B3SOIDDdum1; - double B3SOIDDdum2; - double B3SOIDDdum3; - double B3SOIDDdum4; - double B3SOIDDdum5; -/* end clean up last */ - - double B3SOIDDl; - double B3SOIDDw; - double B3SOIDDm; - double B3SOIDDdrainArea; - double B3SOIDDsourceArea; - double B3SOIDDdrainSquares; - double B3SOIDDsourceSquares; - double B3SOIDDdrainPerimeter; - double B3SOIDDsourcePerimeter; - double B3SOIDDsourceConductance; - double B3SOIDDdrainConductance; - - double B3SOIDDicVBS; - double B3SOIDDicVDS; - double B3SOIDDicVGS; - double B3SOIDDicVES; - double B3SOIDDicVPS; - int B3SOIDDbjtoff; - int B3SOIDDbodyMod; - int B3SOIDDdebugMod; - double B3SOIDDrth0; - double B3SOIDDcth0; - double B3SOIDDbodySquares; - double B3SOIDDrbodyext; - - double B3SOIDDcsbox; - double B3SOIDDcdbox; - double B3SOIDDcsmin; - double B3SOIDDcdmin; - double B3SOIDDst4; - double B3SOIDDdt4; - - int B3SOIDDoff; - int B3SOIDDmode; - - /* OP point */ - double B3SOIDDqinv; - double B3SOIDDcd; - double B3SOIDDcjs; - double B3SOIDDcjd; - double B3SOIDDcbody; - double B3SOIDDcbodcon; - double B3SOIDDcth; - double B3SOIDDcsubstrate; - - double B3SOIDDgm; - double B3SOIDDgme; - double B3SOIDDcb; - double B3SOIDDcdrain; - double B3SOIDDgds; - double B3SOIDDgmbs; - double B3SOIDDgmT; - - double B3SOIDDgbbs; - double B3SOIDDgbgs; - double B3SOIDDgbds; - double B3SOIDDgbes; - double B3SOIDDgbps; - double B3SOIDDgbT; - - double B3SOIDDgjsd; - double B3SOIDDgjsb; - double B3SOIDDgjsg; - double B3SOIDDgjsT; - - double B3SOIDDgjdb; - double B3SOIDDgjdd; - double B3SOIDDgjdg; - double B3SOIDDgjde; - double B3SOIDDgjdT; - - double B3SOIDDgbpbs; - double B3SOIDDgbpgs; - double B3SOIDDgbpds; - double B3SOIDDgbpes; - double B3SOIDDgbpps; - double B3SOIDDgbpT; - - double B3SOIDDgtempb; - double B3SOIDDgtempg; - double B3SOIDDgtempd; - double B3SOIDDgtempe; - double B3SOIDDgtempT; - - double B3SOIDDcggb; - double B3SOIDDcgdb; - double B3SOIDDcgsb; - double B3SOIDDcgeb; - double B3SOIDDcgT; - - double B3SOIDDcbgb; - double B3SOIDDcbdb; - double B3SOIDDcbsb; - double B3SOIDDcbeb; - double B3SOIDDcbT; - - double B3SOIDDcdgb; - double B3SOIDDcddb; - double B3SOIDDcdsb; - double B3SOIDDcdeb; - double B3SOIDDcdT; - - double B3SOIDDcegb; - double B3SOIDDcedb; - double B3SOIDDcesb; - double B3SOIDDceeb; - double B3SOIDDceT; - - double B3SOIDDqse; - double B3SOIDDgcse; - double B3SOIDDqde; - double B3SOIDDgcde; - - struct b3soiddSizeDependParam *pParam; - - unsigned B3SOIDDlGiven :1; - unsigned B3SOIDDwGiven :1; - unsigned B3SOIDDmGiven :1; - unsigned B3SOIDDdrainAreaGiven :1; - unsigned B3SOIDDsourceAreaGiven :1; - unsigned B3SOIDDdrainSquaresGiven :1; - unsigned B3SOIDDsourceSquaresGiven :1; - unsigned B3SOIDDdrainPerimeterGiven :1; - unsigned B3SOIDDsourcePerimeterGiven :1; - unsigned B3SOIDDdNodePrimeSet :1; - unsigned B3SOIDDsNodePrimeSet :1; - unsigned B3SOIDDicVBSGiven :1; - unsigned B3SOIDDicVDSGiven :1; - unsigned B3SOIDDicVGSGiven :1; - unsigned B3SOIDDicVESGiven :1; - unsigned B3SOIDDicVPSGiven :1; - unsigned B3SOIDDbjtoffGiven :1; - unsigned B3SOIDDdebugModGiven :1; - unsigned B3SOIDDrth0Given :1; - unsigned B3SOIDDcth0Given :1; - unsigned B3SOIDDbodySquaresGiven :1; - unsigned B3SOIDDoffGiven :1; - - double *B3SOIDDEePtr; - double *B3SOIDDEbPtr; - double *B3SOIDDBePtr; - double *B3SOIDDEgPtr; - double *B3SOIDDEdpPtr; - double *B3SOIDDEspPtr; - double *B3SOIDDTemptempPtr; - double *B3SOIDDTempdpPtr; - double *B3SOIDDTempspPtr; - double *B3SOIDDTempgPtr; - double *B3SOIDDTempbPtr; - double *B3SOIDDTempePtr; - double *B3SOIDDGtempPtr; - double *B3SOIDDDPtempPtr; - double *B3SOIDDSPtempPtr; - double *B3SOIDDEtempPtr; - double *B3SOIDDBtempPtr; - double *B3SOIDDPtempPtr; - double *B3SOIDDBpPtr; - double *B3SOIDDPbPtr; - double *B3SOIDDPpPtr; - double *B3SOIDDPgPtr; - double *B3SOIDDPdpPtr; - double *B3SOIDDPspPtr; - double *B3SOIDDPePtr; - double *B3SOIDDDPePtr; - double *B3SOIDDSPePtr; - double *B3SOIDDGePtr; - double *B3SOIDDDdPtr; - double *B3SOIDDGgPtr; - double *B3SOIDDSsPtr; - double *B3SOIDDBbPtr; - double *B3SOIDDDPdpPtr; - double *B3SOIDDSPspPtr; - double *B3SOIDDDdpPtr; - double *B3SOIDDGbPtr; - double *B3SOIDDGdpPtr; - double *B3SOIDDGspPtr; - double *B3SOIDDSspPtr; - double *B3SOIDDBdpPtr; - double *B3SOIDDBspPtr; - double *B3SOIDDDPspPtr; - double *B3SOIDDDPdPtr; - double *B3SOIDDBgPtr; - double *B3SOIDDDPgPtr; - double *B3SOIDDSPgPtr; - double *B3SOIDDSPsPtr; - double *B3SOIDDDPbPtr; - double *B3SOIDDSPbPtr; - double *B3SOIDDSPdpPtr; - - double *B3SOIDDVbsPtr; - /* Debug */ - double *B3SOIDDIdsPtr; - double *B3SOIDDIcPtr; - double *B3SOIDDIbsPtr; - double *B3SOIDDIbdPtr; - double *B3SOIDDIiiPtr; - double *B3SOIDDIgidlPtr; - double *B3SOIDDItunPtr; - double *B3SOIDDIbpPtr; - double *B3SOIDDAbeffPtr; - double *B3SOIDDVbs0effPtr; - double *B3SOIDDVbseffPtr; - double *B3SOIDDXcPtr; - double *B3SOIDDCbbPtr; - double *B3SOIDDCbdPtr; - double *B3SOIDDCbgPtr; - double *B3SOIDDqbPtr; - double *B3SOIDDQbfPtr; - double *B3SOIDDQjsPtr; - double *B3SOIDDQjdPtr; - - /* clean up last */ - double *B3SOIDDGmPtr; - double *B3SOIDDGmbsPtr; - double *B3SOIDDGdsPtr; - double *B3SOIDDGmePtr; - double *B3SOIDDVbs0teffPtr; - double *B3SOIDDVthPtr; - double *B3SOIDDVgsteffPtr; - double *B3SOIDDXcsatPtr; - double *B3SOIDDQaccPtr; - double *B3SOIDDQsub0Ptr; - double *B3SOIDDQsubs1Ptr; - double *B3SOIDDQsubs2Ptr; - double *B3SOIDDVdscvPtr; - double *B3SOIDDVcscvPtr; - double *B3SOIDDCbePtr; - double *B3SOIDDqgPtr; - double *B3SOIDDqdPtr; - double *B3SOIDDqePtr; - double *B3SOIDDDum1Ptr; - double *B3SOIDDDum2Ptr; - double *B3SOIDDDum3Ptr; - double *B3SOIDDDum4Ptr; - double *B3SOIDDDum5Ptr; - /* End clean up last */ - -#define B3SOIDDvbd B3SOIDDstates+ 0 -#define B3SOIDDvbs B3SOIDDstates+ 1 -#define B3SOIDDvgs B3SOIDDstates+ 2 -#define B3SOIDDvds B3SOIDDstates+ 3 -#define B3SOIDDves B3SOIDDstates+ 4 -#define B3SOIDDvps B3SOIDDstates+ 5 - -#define B3SOIDDvg B3SOIDDstates+ 6 -#define B3SOIDDvd B3SOIDDstates+ 7 -#define B3SOIDDvs B3SOIDDstates+ 8 -#define B3SOIDDvp B3SOIDDstates+ 9 -#define B3SOIDDve B3SOIDDstates+ 10 -#define B3SOIDDdeltemp B3SOIDDstates+ 11 - -#define B3SOIDDqb B3SOIDDstates+ 12 -#define B3SOIDDcqb B3SOIDDstates+ 13 -#define B3SOIDDqg B3SOIDDstates+ 14 -#define B3SOIDDcqg B3SOIDDstates+ 15 -#define B3SOIDDqd B3SOIDDstates+ 16 -#define B3SOIDDcqd B3SOIDDstates+ 17 -#define B3SOIDDqe B3SOIDDstates+ 18 -#define B3SOIDDcqe B3SOIDDstates+ 19 - -#define B3SOIDDqbs B3SOIDDstates+ 20 -#define B3SOIDDqbd B3SOIDDstates+ 21 -#define B3SOIDDqbe B3SOIDDstates+ 22 - -#define B3SOIDDqth B3SOIDDstates+ 23 -#define B3SOIDDcqth B3SOIDDstates+ 24 - -#define B3SOIDDnumStates 25 - - -/* indices to the array of B3SOIDD NOISE SOURCES */ - -#define B3SOIDDRDNOIZ 0 -#define B3SOIDDRSNOIZ 1 -#define B3SOIDDIDNOIZ 2 -#define B3SOIDDFLNOIZ 3 -#define B3SOIDDFBNOIZ 4 -#define B3SOIDDTOTNOIZ 5 - -#define B3SOIDDNSRCS 6 /* the number of MOSFET(3) noise sources */ - -#ifndef NONOISE - double B3SOIDDnVar[NSTATVARS][B3SOIDDNSRCS]; -#else /* NONOISE */ - double **B3SOIDDnVar; -#endif /* NONOISE */ - -} B3SOIDDinstance ; - -struct b3soiddSizeDependParam -{ - double Width; - double Length; - double Rth0; - double Cth0; - - double B3SOIDDcdsc; - double B3SOIDDcdscb; - double B3SOIDDcdscd; - double B3SOIDDcit; - double B3SOIDDnfactor; - double B3SOIDDvsat; - double B3SOIDDat; - double B3SOIDDa0; - double B3SOIDDags; - double B3SOIDDa1; - double B3SOIDDa2; - double B3SOIDDketa; - double B3SOIDDnpeak; - double B3SOIDDnsub; - double B3SOIDDngate; - double B3SOIDDgamma1; - double B3SOIDDgamma2; - double B3SOIDDvbx; - double B3SOIDDvbi; - double B3SOIDDvbm; - double B3SOIDDvbsc; - double B3SOIDDxt; - double B3SOIDDphi; - double B3SOIDDlitl; - double B3SOIDDk1; - double B3SOIDDkt1; - double B3SOIDDkt1l; - double B3SOIDDkt2; - double B3SOIDDk2; - double B3SOIDDk3; - double B3SOIDDk3b; - double B3SOIDDw0; - double B3SOIDDnlx; - double B3SOIDDdvt0; - double B3SOIDDdvt1; - double B3SOIDDdvt2; - double B3SOIDDdvt0w; - double B3SOIDDdvt1w; - double B3SOIDDdvt2w; - double B3SOIDDdrout; - double B3SOIDDdsub; - double B3SOIDDvth0; - double B3SOIDDua; - double B3SOIDDua1; - double B3SOIDDub; - double B3SOIDDub1; - double B3SOIDDuc; - double B3SOIDDuc1; - double B3SOIDDu0; - double B3SOIDDute; - double B3SOIDDvoff; - double B3SOIDDvfb; - double B3SOIDDuatemp; - double B3SOIDDubtemp; - double B3SOIDDuctemp; - double B3SOIDDrbody; - double B3SOIDDrth; - double B3SOIDDcth; - double B3SOIDDrds0denom; - double B3SOIDDvfbb; - double B3SOIDDjbjt; - double B3SOIDDjdif; - double B3SOIDDjrec; - double B3SOIDDjtun; - double B3SOIDDcsesw; - double B3SOIDDcdesw; - - /* Added */ - double B3SOIDDsdt1; - double B3SOIDDst2; - double B3SOIDDst3; - double B3SOIDDdt2; - double B3SOIDDdt3; - /* Added */ - - double B3SOIDDdelta; - double B3SOIDDrdsw; - double B3SOIDDrds0; - double B3SOIDDprwg; - double B3SOIDDprwb; - double B3SOIDDprt; - double B3SOIDDeta0; - double B3SOIDDetab; - double B3SOIDDpclm; - double B3SOIDDpdibl1; - double B3SOIDDpdibl2; - double B3SOIDDpdiblb; - double B3SOIDDpvag; - double B3SOIDDwr; - double B3SOIDDdwg; - double B3SOIDDdwb; - double B3SOIDDb0; - double B3SOIDDb1; - double B3SOIDDalpha0; - double B3SOIDDalpha1; - double B3SOIDDbeta0; - - - /* CV model */ - double B3SOIDDcgsl; - double B3SOIDDcgdl; - double B3SOIDDckappa; - double B3SOIDDcf; - double B3SOIDDclc; - double B3SOIDDcle; - -/* Added for binning - START0 */ - double B3SOIDDvbsa; - double B3SOIDDdelp; - double B3SOIDDkb1; - double B3SOIDDkb3; - double B3SOIDDdvbd0; - double B3SOIDDdvbd1; - double B3SOIDDabp; - double B3SOIDDmxc; - double B3SOIDDadice0; - double B3SOIDDaii; - double B3SOIDDbii; - double B3SOIDDcii; - double B3SOIDDdii; - double B3SOIDDagidl; - double B3SOIDDbgidl; - double B3SOIDDngidl; - double B3SOIDDntun; - double B3SOIDDndiode; - double B3SOIDDisbjt; - double B3SOIDDisdif; - double B3SOIDDisrec; - double B3SOIDDistun; - double B3SOIDDedl; - double B3SOIDDkbjt1; - double B3SOIDDvsdfb; - double B3SOIDDvsdth; -/* Added for binning - END0 */ - -/* Pre-calculated constants */ - - double B3SOIDDdw; - double B3SOIDDdl; - double B3SOIDDleff; - double B3SOIDDweff; - - double B3SOIDDdwc; - double B3SOIDDdlc; - double B3SOIDDleffCV; - double B3SOIDDweffCV; - double B3SOIDDabulkCVfactor; - double B3SOIDDcgso; - double B3SOIDDcgdo; - double B3SOIDDcgeo; - - double B3SOIDDu0temp; - double B3SOIDDvsattemp; - double B3SOIDDsqrtPhi; - double B3SOIDDphis3; - double B3SOIDDXdep0; - double B3SOIDDsqrtXdep0; - double B3SOIDDtheta0vb0; - double B3SOIDDthetaRout; - - double B3SOIDDcof1; - double B3SOIDDcof2; - double B3SOIDDcof3; - double B3SOIDDcof4; - double B3SOIDDcdep0; - struct b3soiddSizeDependParam *pNext; -}; - - -typedef struct sB3SOIDDmodel -{ - - struct GENmodel gen; - -#define B3SOIDDmodType gen.GENmodType -#define B3SOIDDnextModel(inst) ((struct sB3SOIDDmodel *)((inst)->gen.GENnextModel)) -#define B3SOIDDinstances(inst) ((B3SOIDDinstance *)((inst)->gen.GENinstances)) -#define B3SOIDDmodName gen.GENmodName - - int B3SOIDDtype; - - int B3SOIDDmobMod; - int B3SOIDDcapMod; - int B3SOIDDnoiMod; - int B3SOIDDshMod; - int B3SOIDDbinUnit; - int B3SOIDDparamChk; - double B3SOIDDversion; - double B3SOIDDtox; - double B3SOIDDcdsc; - double B3SOIDDcdscb; - double B3SOIDDcdscd; - double B3SOIDDcit; - double B3SOIDDnfactor; - double B3SOIDDvsat; - double B3SOIDDat; - double B3SOIDDa0; - double B3SOIDDags; - double B3SOIDDa1; - double B3SOIDDa2; - double B3SOIDDketa; - double B3SOIDDnsub; - double B3SOIDDnpeak; - double B3SOIDDngate; - double B3SOIDDgamma1; - double B3SOIDDgamma2; - double B3SOIDDvbx; - double B3SOIDDvbm; - double B3SOIDDxt; - double B3SOIDDk1; - double B3SOIDDkt1; - double B3SOIDDkt1l; - double B3SOIDDkt2; - double B3SOIDDk2; - double B3SOIDDk3; - double B3SOIDDk3b; - double B3SOIDDw0; - double B3SOIDDnlx; - double B3SOIDDdvt0; - double B3SOIDDdvt1; - double B3SOIDDdvt2; - double B3SOIDDdvt0w; - double B3SOIDDdvt1w; - double B3SOIDDdvt2w; - double B3SOIDDdrout; - double B3SOIDDdsub; - double B3SOIDDvth0; - double B3SOIDDua; - double B3SOIDDua1; - double B3SOIDDub; - double B3SOIDDub1; - double B3SOIDDuc; - double B3SOIDDuc1; - double B3SOIDDu0; - double B3SOIDDute; - double B3SOIDDvoff; - double B3SOIDDdelta; - double B3SOIDDrdsw; - double B3SOIDDprwg; - double B3SOIDDprwb; - double B3SOIDDprt; - double B3SOIDDeta0; - double B3SOIDDetab; - double B3SOIDDpclm; - double B3SOIDDpdibl1; - double B3SOIDDpdibl2; - double B3SOIDDpdiblb; - double B3SOIDDpvag; - double B3SOIDDwr; - double B3SOIDDdwg; - double B3SOIDDdwb; - double B3SOIDDb0; - double B3SOIDDb1; - double B3SOIDDalpha0; - double B3SOIDDalpha1; - double B3SOIDDbeta0; - double B3SOIDDtbox; - double B3SOIDDtsi; - double B3SOIDDxj; - double B3SOIDDkb1; - double B3SOIDDkb3; - double B3SOIDDdvbd0; - double B3SOIDDdvbd1; - double B3SOIDDvbsa; - double B3SOIDDdelp; - double B3SOIDDrbody; - double B3SOIDDrbsh; - double B3SOIDDadice0; - double B3SOIDDabp; - double B3SOIDDmxc; - double B3SOIDDrth0; - double B3SOIDDcth0; - double B3SOIDDaii; - double B3SOIDDbii; - double B3SOIDDcii; - double B3SOIDDdii; - double B3SOIDDngidl; - double B3SOIDDagidl; - double B3SOIDDbgidl; - double B3SOIDDndiode; - double B3SOIDDntun; - double B3SOIDDisbjt; - double B3SOIDDisdif; - double B3SOIDDisrec; - double B3SOIDDistun; - double B3SOIDDxbjt; - double B3SOIDDxdif; - double B3SOIDDxrec; - double B3SOIDDxtun; - double B3SOIDDedl; - double B3SOIDDkbjt1; - double B3SOIDDtt; - double B3SOIDDvsdfb; - double B3SOIDDvsdth; - double B3SOIDDcsdmin; - double B3SOIDDasd; - - /* CV model */ - double B3SOIDDcgsl; - double B3SOIDDcgdl; - double B3SOIDDckappa; - double B3SOIDDcf; - double B3SOIDDclc; - double B3SOIDDcle; - double B3SOIDDdwc; - double B3SOIDDdlc; - - double B3SOIDDtnom; - double B3SOIDDcgso; - double B3SOIDDcgdo; - double B3SOIDDcgeo; - - double B3SOIDDxpart; - double B3SOIDDcFringOut; - double B3SOIDDcFringMax; - - double B3SOIDDsheetResistance; - double B3SOIDDbodyJctGateSideGradingCoeff; - double B3SOIDDGatesidewallJctPotential; - double B3SOIDDunitLengthGateSidewallJctCap; - double B3SOIDDcsdesw; - - double B3SOIDDLint; - double B3SOIDDLl; - double B3SOIDDLln; - double B3SOIDDLw; - double B3SOIDDLwn; - double B3SOIDDLwl; - double B3SOIDDLmin; - double B3SOIDDLmax; - - double B3SOIDDWint; - double B3SOIDDWl; - double B3SOIDDWln; - double B3SOIDDWw; - double B3SOIDDWwn; - double B3SOIDDWwl; - double B3SOIDDWmin; - double B3SOIDDWmax; - -/* Added for binning - START1 */ - /* Length Dependence */ - double B3SOIDDlnpeak; - double B3SOIDDlnsub; - double B3SOIDDlngate; - double B3SOIDDlvth0; - double B3SOIDDlk1; - double B3SOIDDlk2; - double B3SOIDDlk3; - double B3SOIDDlk3b; - double B3SOIDDlvbsa; - double B3SOIDDldelp; - double B3SOIDDlkb1; - double B3SOIDDlkb3; - double B3SOIDDldvbd0; - double B3SOIDDldvbd1; - double B3SOIDDlw0; - double B3SOIDDlnlx; - double B3SOIDDldvt0; - double B3SOIDDldvt1; - double B3SOIDDldvt2; - double B3SOIDDldvt0w; - double B3SOIDDldvt1w; - double B3SOIDDldvt2w; - double B3SOIDDlu0; - double B3SOIDDlua; - double B3SOIDDlub; - double B3SOIDDluc; - double B3SOIDDlvsat; - double B3SOIDDla0; - double B3SOIDDlags; - double B3SOIDDlb0; - double B3SOIDDlb1; - double B3SOIDDlketa; - double B3SOIDDlabp; - double B3SOIDDlmxc; - double B3SOIDDladice0; - double B3SOIDDla1; - double B3SOIDDla2; - double B3SOIDDlrdsw; - double B3SOIDDlprwb; - double B3SOIDDlprwg; - double B3SOIDDlwr; - double B3SOIDDlnfactor; - double B3SOIDDldwg; - double B3SOIDDldwb; - double B3SOIDDlvoff; - double B3SOIDDleta0; - double B3SOIDDletab; - double B3SOIDDldsub; - double B3SOIDDlcit; - double B3SOIDDlcdsc; - double B3SOIDDlcdscb; - double B3SOIDDlcdscd; - double B3SOIDDlpclm; - double B3SOIDDlpdibl1; - double B3SOIDDlpdibl2; - double B3SOIDDlpdiblb; - double B3SOIDDldrout; - double B3SOIDDlpvag; - double B3SOIDDldelta; - double B3SOIDDlaii; - double B3SOIDDlbii; - double B3SOIDDlcii; - double B3SOIDDldii; - double B3SOIDDlalpha0; - double B3SOIDDlalpha1; - double B3SOIDDlbeta0; - double B3SOIDDlagidl; - double B3SOIDDlbgidl; - double B3SOIDDlngidl; - double B3SOIDDlntun; - double B3SOIDDlndiode; - double B3SOIDDlisbjt; - double B3SOIDDlisdif; - double B3SOIDDlisrec; - double B3SOIDDlistun; - double B3SOIDDledl; - double B3SOIDDlkbjt1; - /* CV model */ - double B3SOIDDlvsdfb; - double B3SOIDDlvsdth; - - /* Width Dependence */ - double B3SOIDDwnpeak; - double B3SOIDDwnsub; - double B3SOIDDwngate; - double B3SOIDDwvth0; - double B3SOIDDwk1; - double B3SOIDDwk2; - double B3SOIDDwk3; - double B3SOIDDwk3b; - double B3SOIDDwvbsa; - double B3SOIDDwdelp; - double B3SOIDDwkb1; - double B3SOIDDwkb3; - double B3SOIDDwdvbd0; - double B3SOIDDwdvbd1; - double B3SOIDDww0; - double B3SOIDDwnlx; - double B3SOIDDwdvt0; - double B3SOIDDwdvt1; - double B3SOIDDwdvt2; - double B3SOIDDwdvt0w; - double B3SOIDDwdvt1w; - double B3SOIDDwdvt2w; - double B3SOIDDwu0; - double B3SOIDDwua; - double B3SOIDDwub; - double B3SOIDDwuc; - double B3SOIDDwvsat; - double B3SOIDDwa0; - double B3SOIDDwags; - double B3SOIDDwb0; - double B3SOIDDwb1; - double B3SOIDDwketa; - double B3SOIDDwabp; - double B3SOIDDwmxc; - double B3SOIDDwadice0; - double B3SOIDDwa1; - double B3SOIDDwa2; - double B3SOIDDwrdsw; - double B3SOIDDwprwb; - double B3SOIDDwprwg; - double B3SOIDDwwr; - double B3SOIDDwnfactor; - double B3SOIDDwdwg; - double B3SOIDDwdwb; - double B3SOIDDwvoff; - double B3SOIDDweta0; - double B3SOIDDwetab; - double B3SOIDDwdsub; - double B3SOIDDwcit; - double B3SOIDDwcdsc; - double B3SOIDDwcdscb; - double B3SOIDDwcdscd; - double B3SOIDDwpclm; - double B3SOIDDwpdibl1; - double B3SOIDDwpdibl2; - double B3SOIDDwpdiblb; - double B3SOIDDwdrout; - double B3SOIDDwpvag; - double B3SOIDDwdelta; - double B3SOIDDwaii; - double B3SOIDDwbii; - double B3SOIDDwcii; - double B3SOIDDwdii; - double B3SOIDDwalpha0; - double B3SOIDDwalpha1; - double B3SOIDDwbeta0; - double B3SOIDDwagidl; - double B3SOIDDwbgidl; - double B3SOIDDwngidl; - double B3SOIDDwntun; - double B3SOIDDwndiode; - double B3SOIDDwisbjt; - double B3SOIDDwisdif; - double B3SOIDDwisrec; - double B3SOIDDwistun; - double B3SOIDDwedl; - double B3SOIDDwkbjt1; - /* CV model */ - double B3SOIDDwvsdfb; - double B3SOIDDwvsdth; - - /* Cross-term Dependence */ - double B3SOIDDpnpeak; - double B3SOIDDpnsub; - double B3SOIDDpngate; - double B3SOIDDpvth0; - double B3SOIDDpk1; - double B3SOIDDpk2; - double B3SOIDDpk3; - double B3SOIDDpk3b; - double B3SOIDDpvbsa; - double B3SOIDDpdelp; - double B3SOIDDpkb1; - double B3SOIDDpkb3; - double B3SOIDDpdvbd0; - double B3SOIDDpdvbd1; - double B3SOIDDpw0; - double B3SOIDDpnlx; - double B3SOIDDpdvt0; - double B3SOIDDpdvt1; - double B3SOIDDpdvt2; - double B3SOIDDpdvt0w; - double B3SOIDDpdvt1w; - double B3SOIDDpdvt2w; - double B3SOIDDpu0; - double B3SOIDDpua; - double B3SOIDDpub; - double B3SOIDDpuc; - double B3SOIDDpvsat; - double B3SOIDDpa0; - double B3SOIDDpags; - double B3SOIDDpb0; - double B3SOIDDpb1; - double B3SOIDDpketa; - double B3SOIDDpabp; - double B3SOIDDpmxc; - double B3SOIDDpadice0; - double B3SOIDDpa1; - double B3SOIDDpa2; - double B3SOIDDprdsw; - double B3SOIDDpprwb; - double B3SOIDDpprwg; - double B3SOIDDpwr; - double B3SOIDDpnfactor; - double B3SOIDDpdwg; - double B3SOIDDpdwb; - double B3SOIDDpvoff; - double B3SOIDDpeta0; - double B3SOIDDpetab; - double B3SOIDDpdsub; - double B3SOIDDpcit; - double B3SOIDDpcdsc; - double B3SOIDDpcdscb; - double B3SOIDDpcdscd; - double B3SOIDDppclm; - double B3SOIDDppdibl1; - double B3SOIDDppdibl2; - double B3SOIDDppdiblb; - double B3SOIDDpdrout; - double B3SOIDDppvag; - double B3SOIDDpdelta; - double B3SOIDDpaii; - double B3SOIDDpbii; - double B3SOIDDpcii; - double B3SOIDDpdii; - double B3SOIDDpalpha0; - double B3SOIDDpalpha1; - double B3SOIDDpbeta0; - double B3SOIDDpagidl; - double B3SOIDDpbgidl; - double B3SOIDDpngidl; - double B3SOIDDpntun; - double B3SOIDDpndiode; - double B3SOIDDpisbjt; - double B3SOIDDpisdif; - double B3SOIDDpisrec; - double B3SOIDDpistun; - double B3SOIDDpedl; - double B3SOIDDpkbjt1; - /* CV model */ - double B3SOIDDpvsdfb; - double B3SOIDDpvsdth; -/* Added for binning - END1 */ - -/* Pre-calculated constants */ - double B3SOIDDcbox; - double B3SOIDDcsi; - double B3SOIDDcsieff; - double B3SOIDDcoxt; - double B3SOIDDcboxt; - double B3SOIDDcsit; - double B3SOIDDnfb; - double B3SOIDDadice; - double B3SOIDDqsi; - double B3SOIDDqsieff; - double B3SOIDDeg0; - - /* MCJ: move to size-dependent param. */ - double B3SOIDDvtm; - double B3SOIDDcox; - double B3SOIDDcof1; - double B3SOIDDcof2; - double B3SOIDDcof3; - double B3SOIDDcof4; - double B3SOIDDvcrit; - double B3SOIDDfactor1; - - double B3SOIDDoxideTrapDensityA; - double B3SOIDDoxideTrapDensityB; - double B3SOIDDoxideTrapDensityC; - double B3SOIDDem; - double B3SOIDDef; - double B3SOIDDaf; - double B3SOIDDkf; - double B3SOIDDnoif; - - struct b3soiddSizeDependParam *pSizeDependParamKnot; - - /* Flags */ - - unsigned B3SOIDDtboxGiven:1; - unsigned B3SOIDDtsiGiven :1; - unsigned B3SOIDDxjGiven :1; - unsigned B3SOIDDkb1Given :1; - unsigned B3SOIDDkb3Given :1; - unsigned B3SOIDDdvbd0Given :1; - unsigned B3SOIDDdvbd1Given :1; - unsigned B3SOIDDvbsaGiven :1; - unsigned B3SOIDDdelpGiven :1; - unsigned B3SOIDDrbodyGiven :1; - unsigned B3SOIDDrbshGiven :1; - unsigned B3SOIDDadice0Given :1; - unsigned B3SOIDDabpGiven :1; - unsigned B3SOIDDmxcGiven :1; - unsigned B3SOIDDrth0Given :1; - unsigned B3SOIDDcth0Given :1; - unsigned B3SOIDDaiiGiven :1; - unsigned B3SOIDDbiiGiven :1; - unsigned B3SOIDDciiGiven :1; - unsigned B3SOIDDdiiGiven :1; - unsigned B3SOIDDngidlGiven :1; - unsigned B3SOIDDagidlGiven :1; - unsigned B3SOIDDbgidlGiven :1; - unsigned B3SOIDDndiodeGiven :1; - unsigned B3SOIDDntunGiven :1; - unsigned B3SOIDDisbjtGiven :1; - unsigned B3SOIDDisdifGiven :1; - unsigned B3SOIDDisrecGiven :1; - unsigned B3SOIDDistunGiven :1; - unsigned B3SOIDDxbjtGiven :1; - unsigned B3SOIDDxdifGiven :1; - unsigned B3SOIDDxrecGiven :1; - unsigned B3SOIDDxtunGiven :1; - unsigned B3SOIDDedlGiven :1; - unsigned B3SOIDDkbjt1Given :1; - unsigned B3SOIDDttGiven :1; - unsigned B3SOIDDvsdfbGiven :1; - unsigned B3SOIDDvsdthGiven :1; - unsigned B3SOIDDasdGiven :1; - unsigned B3SOIDDcsdminGiven :1; - - unsigned B3SOIDDmobModGiven :1; - unsigned B3SOIDDbinUnitGiven :1; - unsigned B3SOIDDcapModGiven :1; - unsigned B3SOIDDparamChkGiven :1; - unsigned B3SOIDDnoiModGiven :1; - unsigned B3SOIDDshModGiven :1; - unsigned B3SOIDDtypeGiven :1; - unsigned B3SOIDDtoxGiven :1; - unsigned B3SOIDDversionGiven :1; - - unsigned B3SOIDDcdscGiven :1; - unsigned B3SOIDDcdscbGiven :1; - unsigned B3SOIDDcdscdGiven :1; - unsigned B3SOIDDcitGiven :1; - unsigned B3SOIDDnfactorGiven :1; - unsigned B3SOIDDvsatGiven :1; - unsigned B3SOIDDatGiven :1; - unsigned B3SOIDDa0Given :1; - unsigned B3SOIDDagsGiven :1; - unsigned B3SOIDDa1Given :1; - unsigned B3SOIDDa2Given :1; - unsigned B3SOIDDketaGiven :1; - unsigned B3SOIDDnsubGiven :1; - unsigned B3SOIDDnpeakGiven :1; - unsigned B3SOIDDngateGiven :1; - unsigned B3SOIDDgamma1Given :1; - unsigned B3SOIDDgamma2Given :1; - unsigned B3SOIDDvbxGiven :1; - unsigned B3SOIDDvbmGiven :1; - unsigned B3SOIDDxtGiven :1; - unsigned B3SOIDDk1Given :1; - unsigned B3SOIDDkt1Given :1; - unsigned B3SOIDDkt1lGiven :1; - unsigned B3SOIDDkt2Given :1; - unsigned B3SOIDDk2Given :1; - unsigned B3SOIDDk3Given :1; - unsigned B3SOIDDk3bGiven :1; - unsigned B3SOIDDw0Given :1; - unsigned B3SOIDDnlxGiven :1; - unsigned B3SOIDDdvt0Given :1; - unsigned B3SOIDDdvt1Given :1; - unsigned B3SOIDDdvt2Given :1; - unsigned B3SOIDDdvt0wGiven :1; - unsigned B3SOIDDdvt1wGiven :1; - unsigned B3SOIDDdvt2wGiven :1; - unsigned B3SOIDDdroutGiven :1; - unsigned B3SOIDDdsubGiven :1; - unsigned B3SOIDDvth0Given :1; - unsigned B3SOIDDuaGiven :1; - unsigned B3SOIDDua1Given :1; - unsigned B3SOIDDubGiven :1; - unsigned B3SOIDDub1Given :1; - unsigned B3SOIDDucGiven :1; - unsigned B3SOIDDuc1Given :1; - unsigned B3SOIDDu0Given :1; - unsigned B3SOIDDuteGiven :1; - unsigned B3SOIDDvoffGiven :1; - unsigned B3SOIDDrdswGiven :1; - unsigned B3SOIDDprwgGiven :1; - unsigned B3SOIDDprwbGiven :1; - unsigned B3SOIDDprtGiven :1; - unsigned B3SOIDDeta0Given :1; - unsigned B3SOIDDetabGiven :1; - unsigned B3SOIDDpclmGiven :1; - unsigned B3SOIDDpdibl1Given :1; - unsigned B3SOIDDpdibl2Given :1; - unsigned B3SOIDDpdiblbGiven :1; - unsigned B3SOIDDpvagGiven :1; - unsigned B3SOIDDdeltaGiven :1; - unsigned B3SOIDDwrGiven :1; - unsigned B3SOIDDdwgGiven :1; - unsigned B3SOIDDdwbGiven :1; - unsigned B3SOIDDb0Given :1; - unsigned B3SOIDDb1Given :1; - unsigned B3SOIDDalpha0Given :1; - unsigned B3SOIDDalpha1Given :1; - unsigned B3SOIDDbeta0Given :1; - - /* CV model */ - unsigned B3SOIDDcgslGiven :1; - unsigned B3SOIDDcgdlGiven :1; - unsigned B3SOIDDckappaGiven :1; - unsigned B3SOIDDcfGiven :1; - unsigned B3SOIDDclcGiven :1; - unsigned B3SOIDDcleGiven :1; - unsigned B3SOIDDdwcGiven :1; - unsigned B3SOIDDdlcGiven :1; - -/* Added for binning - START2 */ - /* Length Dependence */ - unsigned B3SOIDDlnpeakGiven :1; - unsigned B3SOIDDlnsubGiven :1; - unsigned B3SOIDDlngateGiven :1; - unsigned B3SOIDDlvth0Given :1; - unsigned B3SOIDDlk1Given :1; - unsigned B3SOIDDlk2Given :1; - unsigned B3SOIDDlk3Given :1; - unsigned B3SOIDDlk3bGiven :1; - unsigned B3SOIDDlvbsaGiven :1; - unsigned B3SOIDDldelpGiven :1; - unsigned B3SOIDDlkb1Given :1; - unsigned B3SOIDDlkb3Given :1; - unsigned B3SOIDDldvbd0Given :1; - unsigned B3SOIDDldvbd1Given :1; - unsigned B3SOIDDlw0Given :1; - unsigned B3SOIDDlnlxGiven :1; - unsigned B3SOIDDldvt0Given :1; - unsigned B3SOIDDldvt1Given :1; - unsigned B3SOIDDldvt2Given :1; - unsigned B3SOIDDldvt0wGiven :1; - unsigned B3SOIDDldvt1wGiven :1; - unsigned B3SOIDDldvt2wGiven :1; - unsigned B3SOIDDlu0Given :1; - unsigned B3SOIDDluaGiven :1; - unsigned B3SOIDDlubGiven :1; - unsigned B3SOIDDlucGiven :1; - unsigned B3SOIDDlvsatGiven :1; - unsigned B3SOIDDla0Given :1; - unsigned B3SOIDDlagsGiven :1; - unsigned B3SOIDDlb0Given :1; - unsigned B3SOIDDlb1Given :1; - unsigned B3SOIDDlketaGiven :1; - unsigned B3SOIDDlabpGiven :1; - unsigned B3SOIDDlmxcGiven :1; - unsigned B3SOIDDladice0Given :1; - unsigned B3SOIDDla1Given :1; - unsigned B3SOIDDla2Given :1; - unsigned B3SOIDDlrdswGiven :1; - unsigned B3SOIDDlprwbGiven :1; - unsigned B3SOIDDlprwgGiven :1; - unsigned B3SOIDDlwrGiven :1; - unsigned B3SOIDDlnfactorGiven :1; - unsigned B3SOIDDldwgGiven :1; - unsigned B3SOIDDldwbGiven :1; - unsigned B3SOIDDlvoffGiven :1; - unsigned B3SOIDDleta0Given :1; - unsigned B3SOIDDletabGiven :1; - unsigned B3SOIDDldsubGiven :1; - unsigned B3SOIDDlcitGiven :1; - unsigned B3SOIDDlcdscGiven :1; - unsigned B3SOIDDlcdscbGiven :1; - unsigned B3SOIDDlcdscdGiven :1; - unsigned B3SOIDDlpclmGiven :1; - unsigned B3SOIDDlpdibl1Given :1; - unsigned B3SOIDDlpdibl2Given :1; - unsigned B3SOIDDlpdiblbGiven :1; - unsigned B3SOIDDldroutGiven :1; - unsigned B3SOIDDlpvagGiven :1; - unsigned B3SOIDDldeltaGiven :1; - unsigned B3SOIDDlaiiGiven :1; - unsigned B3SOIDDlbiiGiven :1; - unsigned B3SOIDDlciiGiven :1; - unsigned B3SOIDDldiiGiven :1; - unsigned B3SOIDDlalpha0Given :1; - unsigned B3SOIDDlalpha1Given :1; - unsigned B3SOIDDlbeta0Given :1; - unsigned B3SOIDDlagidlGiven :1; - unsigned B3SOIDDlbgidlGiven :1; - unsigned B3SOIDDlngidlGiven :1; - unsigned B3SOIDDlntunGiven :1; - unsigned B3SOIDDlndiodeGiven :1; - unsigned B3SOIDDlisbjtGiven :1; - unsigned B3SOIDDlisdifGiven :1; - unsigned B3SOIDDlisrecGiven :1; - unsigned B3SOIDDlistunGiven :1; - unsigned B3SOIDDledlGiven :1; - unsigned B3SOIDDlkbjt1Given :1; - /* CV model */ - unsigned B3SOIDDlvsdfbGiven :1; - unsigned B3SOIDDlvsdthGiven :1; - - /* Width Dependence */ - unsigned B3SOIDDwnpeakGiven :1; - unsigned B3SOIDDwnsubGiven :1; - unsigned B3SOIDDwngateGiven :1; - unsigned B3SOIDDwvth0Given :1; - unsigned B3SOIDDwk1Given :1; - unsigned B3SOIDDwk2Given :1; - unsigned B3SOIDDwk3Given :1; - unsigned B3SOIDDwk3bGiven :1; - unsigned B3SOIDDwvbsaGiven :1; - unsigned B3SOIDDwdelpGiven :1; - unsigned B3SOIDDwkb1Given :1; - unsigned B3SOIDDwkb3Given :1; - unsigned B3SOIDDwdvbd0Given :1; - unsigned B3SOIDDwdvbd1Given :1; - unsigned B3SOIDDww0Given :1; - unsigned B3SOIDDwnlxGiven :1; - unsigned B3SOIDDwdvt0Given :1; - unsigned B3SOIDDwdvt1Given :1; - unsigned B3SOIDDwdvt2Given :1; - unsigned B3SOIDDwdvt0wGiven :1; - unsigned B3SOIDDwdvt1wGiven :1; - unsigned B3SOIDDwdvt2wGiven :1; - unsigned B3SOIDDwu0Given :1; - unsigned B3SOIDDwuaGiven :1; - unsigned B3SOIDDwubGiven :1; - unsigned B3SOIDDwucGiven :1; - unsigned B3SOIDDwvsatGiven :1; - unsigned B3SOIDDwa0Given :1; - unsigned B3SOIDDwagsGiven :1; - unsigned B3SOIDDwb0Given :1; - unsigned B3SOIDDwb1Given :1; - unsigned B3SOIDDwketaGiven :1; - unsigned B3SOIDDwabpGiven :1; - unsigned B3SOIDDwmxcGiven :1; - unsigned B3SOIDDwadice0Given :1; - unsigned B3SOIDDwa1Given :1; - unsigned B3SOIDDwa2Given :1; - unsigned B3SOIDDwrdswGiven :1; - unsigned B3SOIDDwprwbGiven :1; - unsigned B3SOIDDwprwgGiven :1; - unsigned B3SOIDDwwrGiven :1; - unsigned B3SOIDDwnfactorGiven :1; - unsigned B3SOIDDwdwgGiven :1; - unsigned B3SOIDDwdwbGiven :1; - unsigned B3SOIDDwvoffGiven :1; - unsigned B3SOIDDweta0Given :1; - unsigned B3SOIDDwetabGiven :1; - unsigned B3SOIDDwdsubGiven :1; - unsigned B3SOIDDwcitGiven :1; - unsigned B3SOIDDwcdscGiven :1; - unsigned B3SOIDDwcdscbGiven :1; - unsigned B3SOIDDwcdscdGiven :1; - unsigned B3SOIDDwpclmGiven :1; - unsigned B3SOIDDwpdibl1Given :1; - unsigned B3SOIDDwpdibl2Given :1; - unsigned B3SOIDDwpdiblbGiven :1; - unsigned B3SOIDDwdroutGiven :1; - unsigned B3SOIDDwpvagGiven :1; - unsigned B3SOIDDwdeltaGiven :1; - unsigned B3SOIDDwaiiGiven :1; - unsigned B3SOIDDwbiiGiven :1; - unsigned B3SOIDDwciiGiven :1; - unsigned B3SOIDDwdiiGiven :1; - unsigned B3SOIDDwalpha0Given :1; - unsigned B3SOIDDwalpha1Given :1; - unsigned B3SOIDDwbeta0Given :1; - unsigned B3SOIDDwagidlGiven :1; - unsigned B3SOIDDwbgidlGiven :1; - unsigned B3SOIDDwngidlGiven :1; - unsigned B3SOIDDwntunGiven :1; - unsigned B3SOIDDwndiodeGiven :1; - unsigned B3SOIDDwisbjtGiven :1; - unsigned B3SOIDDwisdifGiven :1; - unsigned B3SOIDDwisrecGiven :1; - unsigned B3SOIDDwistunGiven :1; - unsigned B3SOIDDwedlGiven :1; - unsigned B3SOIDDwkbjt1Given :1; - /* CV model */ - unsigned B3SOIDDwvsdfbGiven :1; - unsigned B3SOIDDwvsdthGiven :1; - - /* Cross-term Dependence */ - unsigned B3SOIDDpnpeakGiven :1; - unsigned B3SOIDDpnsubGiven :1; - unsigned B3SOIDDpngateGiven :1; - unsigned B3SOIDDpvth0Given :1; - unsigned B3SOIDDpk1Given :1; - unsigned B3SOIDDpk2Given :1; - unsigned B3SOIDDpk3Given :1; - unsigned B3SOIDDpk3bGiven :1; - unsigned B3SOIDDpvbsaGiven :1; - unsigned B3SOIDDpdelpGiven :1; - unsigned B3SOIDDpkb1Given :1; - unsigned B3SOIDDpkb3Given :1; - unsigned B3SOIDDpdvbd0Given :1; - unsigned B3SOIDDpdvbd1Given :1; - unsigned B3SOIDDpw0Given :1; - unsigned B3SOIDDpnlxGiven :1; - unsigned B3SOIDDpdvt0Given :1; - unsigned B3SOIDDpdvt1Given :1; - unsigned B3SOIDDpdvt2Given :1; - unsigned B3SOIDDpdvt0wGiven :1; - unsigned B3SOIDDpdvt1wGiven :1; - unsigned B3SOIDDpdvt2wGiven :1; - unsigned B3SOIDDpu0Given :1; - unsigned B3SOIDDpuaGiven :1; - unsigned B3SOIDDpubGiven :1; - unsigned B3SOIDDpucGiven :1; - unsigned B3SOIDDpvsatGiven :1; - unsigned B3SOIDDpa0Given :1; - unsigned B3SOIDDpagsGiven :1; - unsigned B3SOIDDpb0Given :1; - unsigned B3SOIDDpb1Given :1; - unsigned B3SOIDDpketaGiven :1; - unsigned B3SOIDDpabpGiven :1; - unsigned B3SOIDDpmxcGiven :1; - unsigned B3SOIDDpadice0Given :1; - unsigned B3SOIDDpa1Given :1; - unsigned B3SOIDDpa2Given :1; - unsigned B3SOIDDprdswGiven :1; - unsigned B3SOIDDpprwbGiven :1; - unsigned B3SOIDDpprwgGiven :1; - unsigned B3SOIDDpwrGiven :1; - unsigned B3SOIDDpnfactorGiven :1; - unsigned B3SOIDDpdwgGiven :1; - unsigned B3SOIDDpdwbGiven :1; - unsigned B3SOIDDpvoffGiven :1; - unsigned B3SOIDDpeta0Given :1; - unsigned B3SOIDDpetabGiven :1; - unsigned B3SOIDDpdsubGiven :1; - unsigned B3SOIDDpcitGiven :1; - unsigned B3SOIDDpcdscGiven :1; - unsigned B3SOIDDpcdscbGiven :1; - unsigned B3SOIDDpcdscdGiven :1; - unsigned B3SOIDDppclmGiven :1; - unsigned B3SOIDDppdibl1Given :1; - unsigned B3SOIDDppdibl2Given :1; - unsigned B3SOIDDppdiblbGiven :1; - unsigned B3SOIDDpdroutGiven :1; - unsigned B3SOIDDppvagGiven :1; - unsigned B3SOIDDpdeltaGiven :1; - unsigned B3SOIDDpaiiGiven :1; - unsigned B3SOIDDpbiiGiven :1; - unsigned B3SOIDDpciiGiven :1; - unsigned B3SOIDDpdiiGiven :1; - unsigned B3SOIDDpalpha0Given :1; - unsigned B3SOIDDpalpha1Given :1; - unsigned B3SOIDDpbeta0Given :1; - unsigned B3SOIDDpagidlGiven :1; - unsigned B3SOIDDpbgidlGiven :1; - unsigned B3SOIDDpngidlGiven :1; - unsigned B3SOIDDpntunGiven :1; - unsigned B3SOIDDpndiodeGiven :1; - unsigned B3SOIDDpisbjtGiven :1; - unsigned B3SOIDDpisdifGiven :1; - unsigned B3SOIDDpisrecGiven :1; - unsigned B3SOIDDpistunGiven :1; - unsigned B3SOIDDpedlGiven :1; - unsigned B3SOIDDpkbjt1Given :1; - /* CV model */ - unsigned B3SOIDDpvsdfbGiven :1; - unsigned B3SOIDDpvsdthGiven :1; -/* Added for binning - END2 */ - - unsigned B3SOIDDuseFringeGiven :1; - - unsigned B3SOIDDtnomGiven :1; - unsigned B3SOIDDcgsoGiven :1; - unsigned B3SOIDDcgdoGiven :1; - unsigned B3SOIDDcgeoGiven :1; - unsigned B3SOIDDxpartGiven :1; - unsigned B3SOIDDsheetResistanceGiven :1; - unsigned B3SOIDDGatesidewallJctPotentialGiven :1; - unsigned B3SOIDDbodyJctGateSideGradingCoeffGiven :1; - unsigned B3SOIDDunitLengthGateSidewallJctCapGiven :1; - unsigned B3SOIDDcsdeswGiven :1; - - unsigned B3SOIDDoxideTrapDensityAGiven :1; - unsigned B3SOIDDoxideTrapDensityBGiven :1; - unsigned B3SOIDDoxideTrapDensityCGiven :1; - unsigned B3SOIDDemGiven :1; - unsigned B3SOIDDefGiven :1; - unsigned B3SOIDDafGiven :1; - unsigned B3SOIDDkfGiven :1; - unsigned B3SOIDDnoifGiven :1; - - unsigned B3SOIDDLintGiven :1; - unsigned B3SOIDDLlGiven :1; - unsigned B3SOIDDLlnGiven :1; - unsigned B3SOIDDLwGiven :1; - unsigned B3SOIDDLwnGiven :1; - unsigned B3SOIDDLwlGiven :1; - unsigned B3SOIDDLminGiven :1; - unsigned B3SOIDDLmaxGiven :1; - - unsigned B3SOIDDWintGiven :1; - unsigned B3SOIDDWlGiven :1; - unsigned B3SOIDDWlnGiven :1; - unsigned B3SOIDDWwGiven :1; - unsigned B3SOIDDWwnGiven :1; - unsigned B3SOIDDWwlGiven :1; - unsigned B3SOIDDWminGiven :1; - unsigned B3SOIDDWmaxGiven :1; - -} B3SOIDDmodel; - - -#ifndef NMOS -#define NMOS 1 -#define PMOS -1 -#endif /*NMOS*/ - - -/* device parameters */ -#define B3SOIDD_W 1 -#define B3SOIDD_L 2 -#define B3SOIDD_M 22 -#define B3SOIDD_AS 3 -#define B3SOIDD_AD 4 -#define B3SOIDD_PS 5 -#define B3SOIDD_PD 6 -#define B3SOIDD_NRS 7 -#define B3SOIDD_NRD 8 -#define B3SOIDD_OFF 9 -#define B3SOIDD_IC_VBS 10 -#define B3SOIDD_IC_VDS 11 -#define B3SOIDD_IC_VGS 12 -#define B3SOIDD_IC_VES 13 -#define B3SOIDD_IC_VPS 14 -#define B3SOIDD_BJTOFF 15 -#define B3SOIDD_RTH0 16 -#define B3SOIDD_CTH0 17 -#define B3SOIDD_NRB 18 -#define B3SOIDD_IC 19 -#define B3SOIDD_NQSMOD 20 -#define B3SOIDD_DEBUG 21 - -/* model parameters */ -#define B3SOIDD_MOD_CAPMOD 101 -#define B3SOIDD_MOD_NQSMOD 102 -#define B3SOIDD_MOD_MOBMOD 103 -#define B3SOIDD_MOD_NOIMOD 104 -#define B3SOIDD_MOD_SHMOD 105 -#define B3SOIDD_MOD_DDMOD 106 - -#define B3SOIDD_MOD_TOX 107 - - - -#define B3SOIDD_MOD_CDSC 108 -#define B3SOIDD_MOD_CDSCB 109 -#define B3SOIDD_MOD_CIT 110 -#define B3SOIDD_MOD_NFACTOR 111 -#define B3SOIDD_MOD_XJ 112 -#define B3SOIDD_MOD_VSAT 113 -#define B3SOIDD_MOD_AT 114 -#define B3SOIDD_MOD_A0 115 -#define B3SOIDD_MOD_A1 116 -#define B3SOIDD_MOD_A2 117 -#define B3SOIDD_MOD_KETA 118 -#define B3SOIDD_MOD_NSUB 119 -#define B3SOIDD_MOD_NPEAK 120 -#define B3SOIDD_MOD_NGATE 121 -#define B3SOIDD_MOD_GAMMA1 122 -#define B3SOIDD_MOD_GAMMA2 123 -#define B3SOIDD_MOD_VBX 124 -#define B3SOIDD_MOD_BINUNIT 125 - -#define B3SOIDD_MOD_VBM 126 - -#define B3SOIDD_MOD_XT 127 -#define B3SOIDD_MOD_K1 129 -#define B3SOIDD_MOD_KT1 130 -#define B3SOIDD_MOD_KT1L 131 -#define B3SOIDD_MOD_K2 132 -#define B3SOIDD_MOD_KT2 133 -#define B3SOIDD_MOD_K3 134 -#define B3SOIDD_MOD_K3B 135 -#define B3SOIDD_MOD_W0 136 -#define B3SOIDD_MOD_NLX 137 - -#define B3SOIDD_MOD_DVT0 138 -#define B3SOIDD_MOD_DVT1 139 -#define B3SOIDD_MOD_DVT2 140 - -#define B3SOIDD_MOD_DVT0W 141 -#define B3SOIDD_MOD_DVT1W 142 -#define B3SOIDD_MOD_DVT2W 143 - -#define B3SOIDD_MOD_DROUT 144 -#define B3SOIDD_MOD_DSUB 145 -#define B3SOIDD_MOD_VTH0 146 -#define B3SOIDD_MOD_UA 147 -#define B3SOIDD_MOD_UA1 148 -#define B3SOIDD_MOD_UB 149 -#define B3SOIDD_MOD_UB1 150 -#define B3SOIDD_MOD_UC 151 -#define B3SOIDD_MOD_UC1 152 -#define B3SOIDD_MOD_U0 153 -#define B3SOIDD_MOD_UTE 154 -#define B3SOIDD_MOD_VOFF 155 -#define B3SOIDD_MOD_DELTA 156 -#define B3SOIDD_MOD_RDSW 157 -#define B3SOIDD_MOD_PRT 158 -#define B3SOIDD_MOD_LDD 159 -#define B3SOIDD_MOD_ETA 160 -#define B3SOIDD_MOD_ETA0 161 -#define B3SOIDD_MOD_ETAB 162 -#define B3SOIDD_MOD_PCLM 163 -#define B3SOIDD_MOD_PDIBL1 164 -#define B3SOIDD_MOD_PDIBL2 165 -#define B3SOIDD_MOD_PSCBE1 166 -#define B3SOIDD_MOD_PSCBE2 167 -#define B3SOIDD_MOD_PVAG 168 -#define B3SOIDD_MOD_WR 169 -#define B3SOIDD_MOD_DWG 170 -#define B3SOIDD_MOD_DWB 171 -#define B3SOIDD_MOD_B0 172 -#define B3SOIDD_MOD_B1 173 -#define B3SOIDD_MOD_ALPHA0 174 -#define B3SOIDD_MOD_BETA0 175 -#define B3SOIDD_MOD_PDIBLB 178 - -#define B3SOIDD_MOD_PRWG 179 -#define B3SOIDD_MOD_PRWB 180 - -#define B3SOIDD_MOD_CDSCD 181 -#define B3SOIDD_MOD_AGS 182 - -#define B3SOIDD_MOD_FRINGE 184 -#define B3SOIDD_MOD_CGSL 186 -#define B3SOIDD_MOD_CGDL 187 -#define B3SOIDD_MOD_CKAPPA 188 -#define B3SOIDD_MOD_CF 189 -#define B3SOIDD_MOD_CLC 190 -#define B3SOIDD_MOD_CLE 191 -#define B3SOIDD_MOD_PARAMCHK 192 -#define B3SOIDD_MOD_VERSION 193 - -#define B3SOIDD_MOD_TBOX 195 -#define B3SOIDD_MOD_TSI 196 -#define B3SOIDD_MOD_KB1 197 -#define B3SOIDD_MOD_KB3 198 -#define B3SOIDD_MOD_DVBD0 199 -#define B3SOIDD_MOD_DVBD1 200 -#define B3SOIDD_MOD_DELP 201 -#define B3SOIDD_MOD_VBSA 202 -#define B3SOIDD_MOD_RBODY 204 -#define B3SOIDD_MOD_ADICE0 205 -#define B3SOIDD_MOD_ABP 206 -#define B3SOIDD_MOD_MXC 207 -#define B3SOIDD_MOD_RTH0 208 -#define B3SOIDD_MOD_CTH0 209 -#define B3SOIDD_MOD_AII 210 -#define B3SOIDD_MOD_BII 211 -#define B3SOIDD_MOD_CII 212 -#define B3SOIDD_MOD_DII 213 -#define B3SOIDD_MOD_ALPHA1 214 -#define B3SOIDD_MOD_NGIDL 215 -#define B3SOIDD_MOD_AGIDL 216 -#define B3SOIDD_MOD_BGIDL 217 -#define B3SOIDD_MOD_NDIODE 218 -#define B3SOIDD_MOD_LDIOF 219 -#define B3SOIDD_MOD_LDIOR 220 -#define B3SOIDD_MOD_NTUN 221 -#define B3SOIDD_MOD_ISBJT 222 -#define B3SOIDD_MOD_ISDIF 223 -#define B3SOIDD_MOD_ISREC 224 -#define B3SOIDD_MOD_ISTUN 225 -#define B3SOIDD_MOD_XBJT 226 -#define B3SOIDD_MOD_XDIF 227 -#define B3SOIDD_MOD_XREC 228 -#define B3SOIDD_MOD_XTUN 229 -#define B3SOIDD_MOD_EDL 230 -#define B3SOIDD_MOD_KBJT1 231 -#define B3SOIDD_MOD_TT 232 -#define B3SOIDD_MOD_VSDTH 233 -#define B3SOIDD_MOD_VSDFB 234 -#define B3SOIDD_MOD_ASD 235 -#define B3SOIDD_MOD_CSDMIN 236 -#define B3SOIDD_MOD_RBSH 237 - -/* Added for binning - START3 */ -/* Length dependence */ -#define B3SOIDD_MOD_LNPEAK 301 -#define B3SOIDD_MOD_LNSUB 302 -#define B3SOIDD_MOD_LNGATE 303 -#define B3SOIDD_MOD_LVTH0 304 -#define B3SOIDD_MOD_LK1 305 -#define B3SOIDD_MOD_LK2 306 -#define B3SOIDD_MOD_LK3 307 -#define B3SOIDD_MOD_LK3B 308 -#define B3SOIDD_MOD_LVBSA 309 -#define B3SOIDD_MOD_LDELP 310 -#define B3SOIDD_MOD_LKB1 311 -#define B3SOIDD_MOD_LKB3 312 -#define B3SOIDD_MOD_LDVBD0 313 -#define B3SOIDD_MOD_LDVBD1 314 -#define B3SOIDD_MOD_LW0 315 -#define B3SOIDD_MOD_LNLX 316 -#define B3SOIDD_MOD_LDVT0 317 -#define B3SOIDD_MOD_LDVT1 318 -#define B3SOIDD_MOD_LDVT2 319 -#define B3SOIDD_MOD_LDVT0W 320 -#define B3SOIDD_MOD_LDVT1W 321 -#define B3SOIDD_MOD_LDVT2W 322 -#define B3SOIDD_MOD_LU0 323 -#define B3SOIDD_MOD_LUA 324 -#define B3SOIDD_MOD_LUB 325 -#define B3SOIDD_MOD_LUC 326 -#define B3SOIDD_MOD_LVSAT 327 -#define B3SOIDD_MOD_LA0 328 -#define B3SOIDD_MOD_LAGS 329 -#define B3SOIDD_MOD_LB0 330 -#define B3SOIDD_MOD_LB1 331 -#define B3SOIDD_MOD_LKETA 332 -#define B3SOIDD_MOD_LABP 333 -#define B3SOIDD_MOD_LMXC 334 -#define B3SOIDD_MOD_LADICE0 335 -#define B3SOIDD_MOD_LA1 336 -#define B3SOIDD_MOD_LA2 337 -#define B3SOIDD_MOD_LRDSW 338 -#define B3SOIDD_MOD_LPRWB 339 -#define B3SOIDD_MOD_LPRWG 340 -#define B3SOIDD_MOD_LWR 341 -#define B3SOIDD_MOD_LNFACTOR 342 -#define B3SOIDD_MOD_LDWG 343 -#define B3SOIDD_MOD_LDWB 344 -#define B3SOIDD_MOD_LVOFF 345 -#define B3SOIDD_MOD_LETA0 346 -#define B3SOIDD_MOD_LETAB 347 -#define B3SOIDD_MOD_LDSUB 348 -#define B3SOIDD_MOD_LCIT 349 -#define B3SOIDD_MOD_LCDSC 350 -#define B3SOIDD_MOD_LCDSCB 351 -#define B3SOIDD_MOD_LCDSCD 352 -#define B3SOIDD_MOD_LPCLM 353 -#define B3SOIDD_MOD_LPDIBL1 354 -#define B3SOIDD_MOD_LPDIBL2 355 -#define B3SOIDD_MOD_LPDIBLB 356 -#define B3SOIDD_MOD_LDROUT 357 -#define B3SOIDD_MOD_LPVAG 358 -#define B3SOIDD_MOD_LDELTA 359 -#define B3SOIDD_MOD_LAII 360 -#define B3SOIDD_MOD_LBII 361 -#define B3SOIDD_MOD_LCII 362 -#define B3SOIDD_MOD_LDII 363 -#define B3SOIDD_MOD_LALPHA0 364 -#define B3SOIDD_MOD_LALPHA1 365 -#define B3SOIDD_MOD_LBETA0 366 -#define B3SOIDD_MOD_LAGIDL 367 -#define B3SOIDD_MOD_LBGIDL 368 -#define B3SOIDD_MOD_LNGIDL 369 -#define B3SOIDD_MOD_LNTUN 370 -#define B3SOIDD_MOD_LNDIODE 371 -#define B3SOIDD_MOD_LISBJT 372 -#define B3SOIDD_MOD_LISDIF 373 -#define B3SOIDD_MOD_LISREC 374 -#define B3SOIDD_MOD_LISTUN 375 -#define B3SOIDD_MOD_LEDL 376 -#define B3SOIDD_MOD_LKBJT1 377 -#define B3SOIDD_MOD_LVSDFB 378 -#define B3SOIDD_MOD_LVSDTH 379 - -/* Width dependence */ -#define B3SOIDD_MOD_WNPEAK 401 -#define B3SOIDD_MOD_WNSUB 402 -#define B3SOIDD_MOD_WNGATE 403 -#define B3SOIDD_MOD_WVTH0 404 -#define B3SOIDD_MOD_WK1 405 -#define B3SOIDD_MOD_WK2 406 -#define B3SOIDD_MOD_WK3 407 -#define B3SOIDD_MOD_WK3B 408 -#define B3SOIDD_MOD_WVBSA 409 -#define B3SOIDD_MOD_WDELP 410 -#define B3SOIDD_MOD_WKB1 411 -#define B3SOIDD_MOD_WKB3 412 -#define B3SOIDD_MOD_WDVBD0 413 -#define B3SOIDD_MOD_WDVBD1 414 -#define B3SOIDD_MOD_WW0 415 -#define B3SOIDD_MOD_WNLX 416 -#define B3SOIDD_MOD_WDVT0 417 -#define B3SOIDD_MOD_WDVT1 418 -#define B3SOIDD_MOD_WDVT2 419 -#define B3SOIDD_MOD_WDVT0W 420 -#define B3SOIDD_MOD_WDVT1W 421 -#define B3SOIDD_MOD_WDVT2W 422 -#define B3SOIDD_MOD_WU0 423 -#define B3SOIDD_MOD_WUA 424 -#define B3SOIDD_MOD_WUB 425 -#define B3SOIDD_MOD_WUC 426 -#define B3SOIDD_MOD_WVSAT 427 -#define B3SOIDD_MOD_WA0 428 -#define B3SOIDD_MOD_WAGS 429 -#define B3SOIDD_MOD_WB0 430 -#define B3SOIDD_MOD_WB1 431 -#define B3SOIDD_MOD_WKETA 432 -#define B3SOIDD_MOD_WABP 433 -#define B3SOIDD_MOD_WMXC 434 -#define B3SOIDD_MOD_WADICE0 435 -#define B3SOIDD_MOD_WA1 436 -#define B3SOIDD_MOD_WA2 437 -#define B3SOIDD_MOD_WRDSW 438 -#define B3SOIDD_MOD_WPRWB 439 -#define B3SOIDD_MOD_WPRWG 440 -#define B3SOIDD_MOD_WWR 441 -#define B3SOIDD_MOD_WNFACTOR 442 -#define B3SOIDD_MOD_WDWG 443 -#define B3SOIDD_MOD_WDWB 444 -#define B3SOIDD_MOD_WVOFF 445 -#define B3SOIDD_MOD_WETA0 446 -#define B3SOIDD_MOD_WETAB 447 -#define B3SOIDD_MOD_WDSUB 448 -#define B3SOIDD_MOD_WCIT 449 -#define B3SOIDD_MOD_WCDSC 450 -#define B3SOIDD_MOD_WCDSCB 451 -#define B3SOIDD_MOD_WCDSCD 452 -#define B3SOIDD_MOD_WPCLM 453 -#define B3SOIDD_MOD_WPDIBL1 454 -#define B3SOIDD_MOD_WPDIBL2 455 -#define B3SOIDD_MOD_WPDIBLB 456 -#define B3SOIDD_MOD_WDROUT 457 -#define B3SOIDD_MOD_WPVAG 458 -#define B3SOIDD_MOD_WDELTA 459 -#define B3SOIDD_MOD_WAII 460 -#define B3SOIDD_MOD_WBII 461 -#define B3SOIDD_MOD_WCII 462 -#define B3SOIDD_MOD_WDII 463 -#define B3SOIDD_MOD_WALPHA0 464 -#define B3SOIDD_MOD_WALPHA1 465 -#define B3SOIDD_MOD_WBETA0 466 -#define B3SOIDD_MOD_WAGIDL 467 -#define B3SOIDD_MOD_WBGIDL 468 -#define B3SOIDD_MOD_WNGIDL 469 -#define B3SOIDD_MOD_WNTUN 470 -#define B3SOIDD_MOD_WNDIODE 471 -#define B3SOIDD_MOD_WISBJT 472 -#define B3SOIDD_MOD_WISDIF 473 -#define B3SOIDD_MOD_WISREC 474 -#define B3SOIDD_MOD_WISTUN 475 -#define B3SOIDD_MOD_WEDL 476 -#define B3SOIDD_MOD_WKBJT1 477 -#define B3SOIDD_MOD_WVSDFB 478 -#define B3SOIDD_MOD_WVSDTH 479 - -/* Cross-term dependence */ -#define B3SOIDD_MOD_PNPEAK 501 -#define B3SOIDD_MOD_PNSUB 502 -#define B3SOIDD_MOD_PNGATE 503 -#define B3SOIDD_MOD_PVTH0 504 -#define B3SOIDD_MOD_PK1 505 -#define B3SOIDD_MOD_PK2 506 -#define B3SOIDD_MOD_PK3 507 -#define B3SOIDD_MOD_PK3B 508 -#define B3SOIDD_MOD_PVBSA 509 -#define B3SOIDD_MOD_PDELP 510 -#define B3SOIDD_MOD_PKB1 511 -#define B3SOIDD_MOD_PKB3 512 -#define B3SOIDD_MOD_PDVBD0 513 -#define B3SOIDD_MOD_PDVBD1 514 -#define B3SOIDD_MOD_PW0 515 -#define B3SOIDD_MOD_PNLX 516 -#define B3SOIDD_MOD_PDVT0 517 -#define B3SOIDD_MOD_PDVT1 518 -#define B3SOIDD_MOD_PDVT2 519 -#define B3SOIDD_MOD_PDVT0W 520 -#define B3SOIDD_MOD_PDVT1W 521 -#define B3SOIDD_MOD_PDVT2W 522 -#define B3SOIDD_MOD_PU0 523 -#define B3SOIDD_MOD_PUA 524 -#define B3SOIDD_MOD_PUB 525 -#define B3SOIDD_MOD_PUC 526 -#define B3SOIDD_MOD_PVSAT 527 -#define B3SOIDD_MOD_PA0 528 -#define B3SOIDD_MOD_PAGS 529 -#define B3SOIDD_MOD_PB0 530 -#define B3SOIDD_MOD_PB1 531 -#define B3SOIDD_MOD_PKETA 532 -#define B3SOIDD_MOD_PABP 533 -#define B3SOIDD_MOD_PMXC 534 -#define B3SOIDD_MOD_PADICE0 535 -#define B3SOIDD_MOD_PA1 536 -#define B3SOIDD_MOD_PA2 537 -#define B3SOIDD_MOD_PRDSW 538 -#define B3SOIDD_MOD_PPRWB 539 -#define B3SOIDD_MOD_PPRWG 540 -#define B3SOIDD_MOD_PWR 541 -#define B3SOIDD_MOD_PNFACTOR 542 -#define B3SOIDD_MOD_PDWG 543 -#define B3SOIDD_MOD_PDWB 544 -#define B3SOIDD_MOD_PVOFF 545 -#define B3SOIDD_MOD_PETA0 546 -#define B3SOIDD_MOD_PETAB 547 -#define B3SOIDD_MOD_PDSUB 548 -#define B3SOIDD_MOD_PCIT 549 -#define B3SOIDD_MOD_PCDSC 550 -#define B3SOIDD_MOD_PCDSCB 551 -#define B3SOIDD_MOD_PCDSCD 552 -#define B3SOIDD_MOD_PPCLM 553 -#define B3SOIDD_MOD_PPDIBL1 554 -#define B3SOIDD_MOD_PPDIBL2 555 -#define B3SOIDD_MOD_PPDIBLB 556 -#define B3SOIDD_MOD_PDROUT 557 -#define B3SOIDD_MOD_PPVAG 558 -#define B3SOIDD_MOD_PDELTA 559 -#define B3SOIDD_MOD_PAII 560 -#define B3SOIDD_MOD_PBII 561 -#define B3SOIDD_MOD_PCII 562 -#define B3SOIDD_MOD_PDII 563 -#define B3SOIDD_MOD_PALPHA0 564 -#define B3SOIDD_MOD_PALPHA1 565 -#define B3SOIDD_MOD_PBETA0 566 -#define B3SOIDD_MOD_PAGIDL 567 -#define B3SOIDD_MOD_PBGIDL 568 -#define B3SOIDD_MOD_PNGIDL 569 -#define B3SOIDD_MOD_PNTUN 570 -#define B3SOIDD_MOD_PNDIODE 571 -#define B3SOIDD_MOD_PISBJT 572 -#define B3SOIDD_MOD_PISDIF 573 -#define B3SOIDD_MOD_PISREC 574 -#define B3SOIDD_MOD_PISTUN 575 -#define B3SOIDD_MOD_PEDL 576 -#define B3SOIDD_MOD_PKBJT1 577 -#define B3SOIDD_MOD_PVSDFB 578 -#define B3SOIDD_MOD_PVSDTH 579 -/* Added for binning - END3 */ - -#define B3SOIDD_MOD_TNOM 701 -#define B3SOIDD_MOD_CGSO 702 -#define B3SOIDD_MOD_CGDO 703 -#define B3SOIDD_MOD_CGEO 704 -#define B3SOIDD_MOD_XPART 705 - -#define B3SOIDD_MOD_RSH 706 -#define B3SOIDD_MOD_NMOS 814 -#define B3SOIDD_MOD_PMOS 815 - -#define B3SOIDD_MOD_NOIA 816 -#define B3SOIDD_MOD_NOIB 817 -#define B3SOIDD_MOD_NOIC 818 - -#define B3SOIDD_MOD_LINT 819 -#define B3SOIDD_MOD_LL 820 -#define B3SOIDD_MOD_LLN 821 -#define B3SOIDD_MOD_LW 822 -#define B3SOIDD_MOD_LWN 823 -#define B3SOIDD_MOD_LWL 824 - -#define B3SOIDD_MOD_WINT 827 -#define B3SOIDD_MOD_WL 828 -#define B3SOIDD_MOD_WLN 829 -#define B3SOIDD_MOD_WW 830 -#define B3SOIDD_MOD_WWN 831 -#define B3SOIDD_MOD_WWL 832 - -#define B3SOIDD_MOD_DWC 835 -#define B3SOIDD_MOD_DLC 836 - -#define B3SOIDD_MOD_EM 837 -#define B3SOIDD_MOD_EF 838 -#define B3SOIDD_MOD_AF 839 -#define B3SOIDD_MOD_KF 840 -#define B3SOIDD_MOD_NOIF 841 - - -#define B3SOIDD_MOD_PBSWG 843 -#define B3SOIDD_MOD_MJSWG 844 -#define B3SOIDD_MOD_CJSWG 845 -#define B3SOIDD_MOD_CSDESW 846 - -/* device questions */ -#define B3SOIDD_DNODE 901 -#define B3SOIDD_GNODE 902 -#define B3SOIDD_SNODE 903 -#define B3SOIDD_BNODE 904 -#define B3SOIDD_ENODE 905 -#define B3SOIDD_DNODEPRIME 906 -#define B3SOIDD_SNODEPRIME 907 -#define B3SOIDD_VBD 908 -#define B3SOIDD_VBS 909 -#define B3SOIDD_VGS 910 -#define B3SOIDD_VES 911 -#define B3SOIDD_VDS 912 -#define B3SOIDD_CD 913 -#define B3SOIDD_CBS 914 -#define B3SOIDD_CBD 915 -#define B3SOIDD_GM 916 -#define B3SOIDD_GDS 917 -#define B3SOIDD_GMBS 918 -#define B3SOIDD_GBD 919 -#define B3SOIDD_GBS 920 -#define B3SOIDD_QB 921 -#define B3SOIDD_CQB 922 -#define B3SOIDD_QG 923 -#define B3SOIDD_CQG 924 -#define B3SOIDD_QD 925 -#define B3SOIDD_CQD 926 -#define B3SOIDD_CGG 927 -#define B3SOIDD_CGD 928 -#define B3SOIDD_CGS 929 -#define B3SOIDD_CBG 930 -#define B3SOIDD_CAPBD 931 -#define B3SOIDD_CQBD 932 -#define B3SOIDD_CAPBS 933 -#define B3SOIDD_CQBS 934 -#define B3SOIDD_CDG 935 -#define B3SOIDD_CDD 936 -#define B3SOIDD_CDS 937 -#define B3SOIDD_VON 938 -#define B3SOIDD_VDSAT 939 -#define B3SOIDD_QBS 940 -#define B3SOIDD_QBD 941 -#define B3SOIDD_SOURCECONDUCT 942 -#define B3SOIDD_DRAINCONDUCT 943 -#define B3SOIDD_CBDB 944 -#define B3SOIDD_CBSB 945 -#define B3SOIDD_GMID 946 - - -#include "b3soiddext.h" - -extern void B3SOIDDevaluate(double,double,double,B3SOIDDinstance*,B3SOIDDmodel*, - double*,double*,double*, double*, double*, double*, double*, - double*, double*, double*, double*, double*, double*, double*, - double*, double*, double*, double*, CKTcircuit*); -extern int B3SOIDDdebug(B3SOIDDmodel*, B3SOIDDinstance*, CKTcircuit*, int); -extern int B3SOIDDcheckModel(B3SOIDDmodel*, B3SOIDDinstance*, CKTcircuit*); - -#endif /*B3SOIDD*/ - diff --git a/src/spicelib/devices/bsim3soi_dd/b3soiddext.h b/src/spicelib/devices/bsim3soi_dd/b3soiddext.h deleted file mode 100644 index 454cea528..000000000 --- a/src/spicelib/devices/bsim3soi_dd/b3soiddext.h +++ /dev/null @@ -1,27 +0,0 @@ -/********** -Copyright 1999 Regents of the University of California. All rights reserved. -Author: 1998 Samuel Fung -File: b3soiddext.h -Modifed by Paolo Nenzi 2002 -**********/ - -extern int B3SOIDDacLoad(GENmodel *,CKTcircuit*); -extern int B3SOIDDask(CKTcircuit *,GENinstance*,int,IFvalue*,IFvalue*); -extern int B3SOIDDconvTest(GENmodel *,CKTcircuit*); -extern int B3SOIDDgetic(GENmodel*,CKTcircuit*); -extern int B3SOIDDload(GENmodel*,CKTcircuit*); -extern int B3SOIDDmAsk(CKTcircuit*,GENmodel *,int, IFvalue*); -extern int B3SOIDDmParam(int,IFvalue*,GENmodel*); -extern void B3SOIDDmosCap(CKTcircuit*, double, double, double, double, - double, double, double, double, double, double, double, - double, double, double, double, double, double, double*, - double*, double*, double*, double*, double*, double*, double*, - double*, double*, double*, double*, double*, double*, double*, - double*); -extern int B3SOIDDparam(int,IFvalue*,GENinstance*,IFvalue*); -extern int B3SOIDDpzLoad(GENmodel*,CKTcircuit*,SPcomplex*); -extern int B3SOIDDsetup(SMPmatrix*,GENmodel*,CKTcircuit*,int*); -extern int B3SOIDDtemp(GENmodel*,CKTcircuit*); -extern int B3SOIDDtrunc(GENmodel*,CKTcircuit*,double*); -extern int B3SOIDDnoise(int,int,GENmodel*,CKTcircuit*,Ndata*,double*); -extern int B3SOIDDunsetup(GENmodel*,CKTcircuit*); diff --git a/src/spicelib/devices/bsim3soi_dd/b3soiddgetic.c b/src/spicelib/devices/bsim3soi_dd/b3soiddgetic.c deleted file mode 100644 index 3cbf187a5..000000000 --- a/src/spicelib/devices/bsim3soi_dd/b3soiddgetic.c +++ /dev/null @@ -1,54 +0,0 @@ -/********** -Copyright 1999 Regents of the University of California. All rights reserved. -Author: 1998 Samuel Fung, Dennis Sinitsky and Stephen Tang -File: b3soiddgetic.c 98/5/01 -Modified by Paolo Nenzi 2002 -**********/ - -/* - * Revision 2.1 99/9/27 Pin Su - * BSIMDD2.1 release - */ - -#include "ngspice/ngspice.h" -#include "ngspice/cktdefs.h" -#include "b3soidddef.h" -#include "ngspice/sperror.h" -#include "ngspice/suffix.h" - - -int -B3SOIDDgetic(GENmodel *inModel, CKTcircuit *ckt) -{ -B3SOIDDmodel *model = (B3SOIDDmodel*)inModel; -B3SOIDDinstance *here; - - for (; model ; model = B3SOIDDnextModel(model)) - { for (here = B3SOIDDinstances(model); here; here = B3SOIDDnextInstance(here)) - { - if(!here->B3SOIDDicVBSGiven) - { here->B3SOIDDicVBS = *(ckt->CKTrhs + here->B3SOIDDbNode) - - *(ckt->CKTrhs + here->B3SOIDDsNode); - } - if (!here->B3SOIDDicVDSGiven) - { here->B3SOIDDicVDS = *(ckt->CKTrhs + here->B3SOIDDdNode) - - *(ckt->CKTrhs + here->B3SOIDDsNode); - } - if (!here->B3SOIDDicVGSGiven) - { here->B3SOIDDicVGS = *(ckt->CKTrhs + here->B3SOIDDgNode) - - *(ckt->CKTrhs + here->B3SOIDDsNode); - } - if (!here->B3SOIDDicVESGiven) - { here->B3SOIDDicVES = *(ckt->CKTrhs + here->B3SOIDDeNode) - - *(ckt->CKTrhs + here->B3SOIDDsNode); - } - if (!here->B3SOIDDicVPSGiven) - { here->B3SOIDDicVPS = *(ckt->CKTrhs + here->B3SOIDDpNode) - - *(ckt->CKTrhs + here->B3SOIDDsNode); - } - } - } - return(OK); -} - - diff --git a/src/spicelib/devices/bsim3soi_dd/b3soiddinit.c b/src/spicelib/devices/bsim3soi_dd/b3soiddinit.c deleted file mode 100644 index e45f20684..000000000 --- a/src/spicelib/devices/bsim3soi_dd/b3soiddinit.c +++ /dev/null @@ -1,76 +0,0 @@ -#include "ngspice/config.h" - -#include "ngspice/devdefs.h" - -#include "b3soidditf.h" -#include "b3soiddinit.h" - -SPICEdev B3SOIDDinfo = { - .DEVpublic = { - .name = "B3SOIDD", - .description = "Berkeley SOI MOSFET (DD) model version 2.1", - .terms = &B3SOIDDnSize, - .numNames = &B3SOIDDnSize, - .termNames = B3SOIDDnames, - .numInstanceParms = &B3SOIDDpTSize, - .instanceParms = B3SOIDDpTable, - .numModelParms = &B3SOIDDmPTSize, - .modelParms = B3SOIDDmPTable, - .flags = DEV_DEFAULT, - -#ifdef XSPICE - .cm_func = NULL, - .num_conn = 0, - .conn = NULL, - .num_param = 0, - .param = NULL, - .num_inst_var = 0, - .inst_var = NULL, -#endif - }, - - .DEVparam = B3SOIDDparam, - .DEVmodParam = B3SOIDDmParam, - .DEVload = B3SOIDDload, - .DEVsetup = B3SOIDDsetup, - .DEVunsetup = B3SOIDDunsetup, - .DEVpzSetup = B3SOIDDsetup, - .DEVtemperature = B3SOIDDtemp, - .DEVtrunc = B3SOIDDtrunc, - .DEVfindBranch = NULL, - .DEVacLoad = B3SOIDDacLoad, - .DEVaccept = NULL, - .DEVdestroy = NULL, - .DEVmodDelete = NULL, - .DEVdelete = NULL, - .DEVsetic = B3SOIDDgetic, - .DEVask = B3SOIDDask, - .DEVmodAsk = B3SOIDDmAsk, - .DEVpzLoad = B3SOIDDpzLoad, - .DEVconvTest = B3SOIDDconvTest, - .DEVsenSetup = NULL, - .DEVsenLoad = NULL, - .DEVsenUpdate = NULL, - .DEVsenAcLoad = NULL, - .DEVsenPrint = NULL, - .DEVsenTrunc = NULL, - .DEVdisto = NULL, - .DEVnoise = B3SOIDDnoise, - .DEVsoaCheck = NULL, - .DEVinstSize = &B3SOIDDiSize, - .DEVmodSize = &B3SOIDDmSize, - -#ifdef CIDER - .DEVdump = NULL, - .DEVacct = NULL, -#endif -}; - - -SPICEdev * -get_b3soidd_info (void) -{ - return &B3SOIDDinfo; -} - - diff --git a/src/spicelib/devices/bsim3soi_dd/b3soiddinit.h b/src/spicelib/devices/bsim3soi_dd/b3soiddinit.h deleted file mode 100644 index c6644262f..000000000 --- a/src/spicelib/devices/bsim3soi_dd/b3soiddinit.h +++ /dev/null @@ -1,13 +0,0 @@ -#ifndef _B3SOIDDINIT_H -#define _B3SOIDDINIT_H - -extern IFparm B3SOIDDpTable[]; -extern IFparm B3SOIDDmPTable[]; -extern char *B3SOIDDnames[]; -extern int B3SOIDDpTSize; -extern int B3SOIDDmPTSize; -extern int B3SOIDDnSize; -extern int B3SOIDDiSize; -extern int B3SOIDDmSize; - -#endif diff --git a/src/spicelib/devices/bsim3soi_dd/b3soidditf.h b/src/spicelib/devices/bsim3soi_dd/b3soidditf.h deleted file mode 100644 index f2adf8593..000000000 --- a/src/spicelib/devices/bsim3soi_dd/b3soidditf.h +++ /dev/null @@ -1,14 +0,0 @@ -/********** -Copyright 1999 Regents of the University of California. All rights reserved. -Author: 1998 Samuel Fung -File: b3soidditf.h -**********/ - -#ifndef DEV_B3SOIDD -#define DEV_B3SOIDD - -#include "b3soiddext.h" - -SPICEdev *get_b3soidd_info (void); - -#endif diff --git a/src/spicelib/devices/bsim3soi_dd/b3soiddld.c b/src/spicelib/devices/bsim3soi_dd/b3soiddld.c deleted file mode 100644 index bb2402e2b..000000000 --- a/src/spicelib/devices/bsim3soi_dd/b3soiddld.c +++ /dev/null @@ -1,4460 +0,0 @@ -/********** -Copyright 1999 Regents of the University of California. All rights reserved. -Author: Weidong Liu and Pin Su Feb 1999 -Author: 1998 Samuel Fung, Dennis Sinitsky and Stephen Tang -Modified by Pin Su, Wei Jin 99/9/27 -Modified by Paolo Nenzi 2002 -File: b3soiddld.c 98/5/01 -**********/ - -/* - * Revision 2.1 99/9/27 Pin Su - * BSIMDD2.1 release - */ - -#include "ngspice/ngspice.h" -#include "ngspice/cktdefs.h" -#include "b3soidddef.h" -#include "ngspice/trandefs.h" -#include "ngspice/const.h" -#include "ngspice/sperror.h" -#include "ngspice/devdefs.h" -#include "ngspice/suffix.h" - - -#define MAX_EXP 5.834617425e14 -#define MIN_EXP 1.713908431e-15 -#define EXP_THRESHOLD 34.0 -#define EPSOX 3.453133e-11 -#define EPSSI 1.03594e-10 -#define Charge_q 1.60219e-19 -#define KboQ 8.617087e-5 /* Kb / q */ -#define Eg300 1.115 /* energy gap at 300K */ -#define DELTA_1 0.02 -#define DELTA_2 0.02 -#define DELTA_3 0.02 -#define DELTA_4 0.02 -#define DELT_Vbs0eff 0.02 -#define DELT_Vbsmos 0.005 -#define DELT_Vbseff 0.005 -#define DELT_Xcsat 0.2 -#define DELT_Vbs0dio 1e-7 -#define DELTA_VFB 0.02 -#define DELTA_Vcscv 0.0004 -#define DELT_Vbsdio 0.01 -#define CONST_2OV3 0.6666666666 -#define OFF_Vbsdio 2e-2 -#define OFF_Vbs0_dio 2.02e-2 -#define QEX_FACT 20 - - - /* B3SOIDDSmartVbs(Vbs, Old, here, check) - * Smart Vbs guess. - */ - -static double -B3SOIDDSmartVbs(double New, double Old, B3SOIDDinstance *here, - CKTcircuit *ckt, int *check) -{ - NG_IGNORE(Old); - NG_IGNORE(check); - - /* only do it for floating body and DC */ - if (here->B3SOIDDfloat && (ckt->CKTmode & (MODEDC | MODEDCOP))) - { - /* Vbs cannot be negative in DC */ - if (New < 0.0) New = 0.0; - } - return(New); -} - - - /* B3SOIDDlimit(vnew,vold) - * limits the per-iteration change of any absolute voltage value - */ - -static double -B3SOIDDlimit(double vnew, double vold, double limit, int *check) -{ - double T0, T1; - - if (isnan (vnew) || isnan (vold)) - { - fprintf(stderr, "Alberto says: YOU TURKEY! The limiting function received NaN.\n"); - fprintf(stderr, "New prediction returns to 0.0!\n"); - vnew = 0.0; - *check = 1; - } - T0 = vnew - vold; - T1 = fabs(T0); - if (T1 > limit) { - if (T0 > 0.0) - vnew = vold + limit; - else - vnew = vold - limit; - *check = 1; - } - return vnew; -} - - - -int -B3SOIDDload(GENmodel *inModel, CKTcircuit *ckt) -{ -B3SOIDDmodel *model = (B3SOIDDmodel*)inModel; -B3SOIDDinstance *here; -int selfheat; - -double Gmin; -double ag0, qgd, qgs, von, cbhat, VgstNVt, ExpVgst = 0.0; -double cdhat, cdreq, ceqbd, ceqbs, ceqqb, ceqqd, ceqqg, ceq, geq; -double arg; -double delvbd, delvbs, delvds, delvgd, delvgs; -double Vfbeff, dVfbeff_dVd, dVfbeff_dVb, V3, V4; -double PhiBSWG, MJSWG; -double gcgdb, gcggb, gcgsb, gcgeb, gcgT; -double gcsdb, gcsgb, gcssb, gcseb, gcsT; -double gcddb, gcdgb, gcdsb, gcdeb, gcdT; -double gcbdb, gcbgb, gcbsb, gcbeb, gcbT; -double gcedb, gcegb, gcesb, gceeb, gceT; -double gcTt, gTtg, gTtb, gTte, gTtdp, gTtt, gTtsp; -double vbd, vbs, vds, vgb, vgd, vgs, vgdo; -#ifndef PREDICTOR -double xfact; -#endif -double vg, vd, vs, vp, ve, vb; -double Vds, Vgs, Vbs, Gmbs, FwdSum, RevSum; -double Vgs_eff, Vfb, dVfb_dVb, dVfb_dVd, dVfb_dT; -double Phis, dPhis_dVb, sqrtPhis, dsqrtPhis_dVb, Vth = 0.0; -double dVth_dVb, dVth_dVd, dVth_dT; -double Vgst, dVgs_eff_dVg; -double n, dn_dVb, Vtm; -double ExpArg, V0; -double ueff = 0.0, dueff_dVg, dueff_dVd, dueff_dVb, dueff_dT; -double Esat, Vdsat = 0.0; -double EsatL, dEsatL_dVg, dEsatL_dVd, dEsatL_dVb, dEsatL_dT; -double dVdsat_dVg, dVdsat_dVb, dVdsat_dVd, dVdsat_dT, Vasat; -double dVasat_dVg, dVasat_dVb, dVasat_dVd, dVasat_dT; -double Va, dVa_dVd, dVa_dVg, dVa_dVb, dVa_dT; -double Vbseff, dVbseff_dVb; -double One_Third_CoxWL, Two_Third_CoxWL, CoxWL; -double T0, dT0_dVg, dT0_dVd, dT0_dVb, dT0_dVc, dT0_dVe, dT0_dT; -double T1, dT1_dVg, dT1_dVd, dT1_dVb, dT1_dVc, dT1_dVe, dT1_dT; -double T2, dT2_dVg, dT2_dVd, dT2_dVb, dT2_dVc, dT2_dVe, dT2_dT; -double T3, dT3_dVg, dT3_dVd, dT3_dVb, dT3_dVc, dT3_dVe, dT3_dT; -double T4, dT4_dVg, dT4_dVd, dT4_dVb, dT4_dVc, dT4_dVe, dT4_dT; -double T5, dT5_dVg, dT5_dVd, dT5_dVb, dT5_dVc, dT5_dVe, dT5_dT; -double T6, dT6_dVg, dT6_dVd, dT6_dVb, dT6_dVc, dT6_dVe, dT6_dT; -double T7; -double T8; -double T9; -double T10; -double T11, T12; -double Abulk, dAbulk_dVb, Abulk0, dAbulk0_dVb; -double VACLM, dVACLM_dVg, dVACLM_dVd, dVACLM_dVb, dVACLM_dT; -double VADIBL, dVADIBL_dVg, dVADIBL_dVd, dVADIBL_dVb, dVADIBL_dT; -double Xdep, dXdep_dVb, lt1, dlt1_dVb, ltw, dltw_dVb; -double Delt_vth, dDelt_vth_dVb, dDelt_vth_dT; -double Theta0, dTheta0_dVb; -double TempRatio, tmp1, tmp2, tmp3, tmp4; -double DIBL_Sft, dDIBL_Sft_dVd, Lambda, dLambda_dVg; -double a1; - -double Vgsteff = 0.0, dVgsteff_dVg, dVgsteff_dVd, dVgsteff_dVb; -double dVgsteff_dVe, dVgsteff_dT; -double Vdseff = 0.0, dVdseff_dVg, dVdseff_dVd, dVdseff_dVb, dVdseff_dT; -double VdseffCV, dVdseffCV_dVg, dVdseffCV_dVd, dVdseffCV_dVb; -double diffVds; -double dAbulk_dVg, dn_dVd ; -double beta, dbeta_dVg, dbeta_dVd, dbeta_dVb, dbeta_dT; -double gche, dgche_dVg, dgche_dVd, dgche_dVb, dgche_dT; -double fgche1, dfgche1_dVg, dfgche1_dVd, dfgche1_dVb, dfgche1_dT; -double fgche2, dfgche2_dVg, dfgche2_dVd, dfgche2_dVb, dfgche2_dT; -double Idl, dIdl_dVg, dIdl_dVd, dIdl_dVb, dIdl_dT; -double Ids = 0.0, Gm, Gds = 0.0, Gmb; -double CoxWovL; -double Rds, dRds_dVg, dRds_dVb, dRds_dT, WVCox, WVCoxRds; -double Vgst2Vtm, dVgst2Vtm_dT, VdsatCV, dVdsatCV_dVg, dVdsatCV_dVb; -double Leff, Weff, dWeff_dVg, dWeff_dVb; -double AbulkCV, dAbulkCV_dVb; -double qgdo, qgso, cgdo, cgso; - -double dxpart, sxpart; - -struct b3soiddSizeDependParam *pParam; -int ByPass, Check, ChargeComputationNeeded = 0, error; - -double gbbsp, gbbdp, gbbg, gbbb, gbbe, gbbp, gbbT; -double gddpsp, gddpdp, gddpg, gddpb, gddpe, gddpT; -double gsspsp, gsspdp, gsspg, gsspb, gsspe, gsspT; -double Gbpbs, Gbpgs, Gbpds, Gbpes, Gbpps, GbpT; -double ves, ved, veb, vge = 0.0, delves, vedo, delved; -double vps, vpd, Vps, delvps; -double Vbd, Ves, Vesfb, sqrtXdep, DeltVthtemp, dDeltVthtemp_dT; -double Vbp, dVbp_dVp, dVbp_dVb, dVbp_dVg, dVbp_dVd, dVbp_dVe, dVbp_dT; -double Vpsdio, dVpsdio_dVg, dVpsdio_dVd, dVpsdio_dVe, dVpsdio_dVp, dVpsdio_dT; -double DeltVthw, dDeltVthw_dVb, dDeltVthw_dT; -double dVbseff_dVd, dVbseff_dVe, dVbseff_dT; -double dVdsat_dVc, dVasat_dVc, dVACLM_dVc, dVADIBL_dVc, dVa_dVc; -double dfgche1_dVc, dfgche2_dVc, dgche_dVc, dVdseff_dVc, dIdl_dVc; -double Gm0, Gds0, Gmb0, GmT0, Gmc, Gme, GmT, dVbseff_dVg; -double dDIBL_Sft_dVb, BjtA, dBjtA_dVd; -double diffVdsii ; -double Idgidl = 0.0, Gdgidld, Gdgidlg, Isgidl = 0.0, Gsgidlg; -double Gjsd, Gjsb, GjsT, Gjdd, Gjdb, GjdT; -double Ibp = 0.0, Iii = 0.0, Giid, Giig, Giib, Giie, GiiT, Gcd, Gcb, GcT; -double ceqbody, ceqbodcon = 0.0; -double gppg = 0.0, gppdp = 0.0, gppb = 0.0, gppe = 0.0, gppp = 0.0; -double gppsp = 0.0, gppT; -double delTemp, deldelTemp, Temp; -double ceqth, ceqqth; -double K1; -double qjs = 0.0, gcjsbs, gcjsT; -double qjd = 0.0, gcjdbs, gcjdds, gcjdT; -double qge; -double ceqqe; -double ni, Eg, Cbox, Nfb, CboxWL; -double cjsbs; -double Qbf0, Qsicv, dVfbeff_dVrg, Cbe = 0.0; -double qinv = 0.0, qgate = 0.0, qbody = 0.0, qdrn = 0.0, qsrc, qsub = 0.0; -double cqgate, cqbody = 0.0, cqdrn = 0.0, cqsub, cqtemp; -double Cgg, Cgd, Cgb, Cge; -double Csg, Csd, Csb, Cse, Cbg = 0.0, Cbd = 0.0, Cbb = 0.0; -double Cgg1, Cgb1, Cgd1, Csg1, Csd1, Csb1; -double Vbs0t = 0.0, dVbs0t_dT ; -double Vbs0 = 0.0 ,dVbs0_dVe, dVbs0_dT; -double Vbs0eff = 0.0 ,dVbs0eff_dVg ,dVbs0eff_dVd ,dVbs0eff_dVe, dVbs0eff_dT; -double Vbs0teff = 0.0,dVbs0teff_dVg ,dVbs0teff_dVd, dVbs0teff_dVe; -double dVbs0teff_dT; -double Vbsdio = 0.0, dVbsdio_dVg, dVbsdio_dVd, dVbsdio_dVe, dVbsdio_dVb; -double dVbsdio_dT; -double Vthfd = 0.0 ,dVthfd_dVd ,dVthfd_dVe, dVthfd_dT; -double Vbs0mos = 0.0 ,dVbs0mos_dVe, dVbs0mos_dT; -double Vbsmos ,dVbsmos_dVg ,dVbsmos_dVb ,dVbsmos_dVd, dVbsmos_dVe, dVbsmos_dT; -double Abeff ,dAbeff_dVg ,dAbeff_dVb, dAbeff_dVc; -double Vcs ,dVcs_dVg ,dVcs_dVb ,dVcs_dVd ,dVcs_dVe, dVcs_dT; -double Xcsat = 0.0, dXcsat_dVg, dXcsat_dVc; -double Vdsatii ,dVdsatii_dVg ,dVdsatii_dVd, dVdsatii_dVb, dVdsatii_dT; -double Vdseffii ,dVdseffii_dVg ,dVdseffii_dVd, dVdseffii_dVb, dVdseffii_dT; -double VcsCV = 0.0 ,dVcsCV_dVg = 0.0 ,dVcsCV_dVb = 0.0; -double dVcsCV_dVd = 0.0 ,dVcsCV_dVc = 0.0; -double VdsCV = 0.0 ,dVdsCV_dVg = 0.0 ,dVdsCV_dVb = 0.0; -double dVdsCV_dVd = 0.0 ,dVdsCV_dVc = 0.0; -double Phisc ,dPhisc_dVg ,dPhisc_dVb ,dPhisc_dVd, dPhisc_dVc; -double Phisd ,dPhisd_dVg ,dPhisd_dVb ,dPhisd_dVd, dPhisd_dVc; -double sqrtPhisc; -double sqrtPhisd; -double Xc = 0.0 ,dXc_dVg = 0.0 ,dXc_dVb = 0.0 ,dXc_dVd = 0.0 ,dXc_dVc = 0.0; -double Ibjt = 0.0 ,dIbjt_dVb ,dIbjt_dVd ,dIbjt_dT = 0.0; -double Ibs1 ,dIbs1_dVb ,dIbs1_dT = 0.0; -double Ibs2 ,dIbs2_dVb ,dIbs2_dT = 0.0; -double Ibs3 ,dIbs3_dVb ,dIbs3_dVd, dIbs3_dT = 0.0; -double Ibs4 ,dIbs4_dVb ,dIbs4_dT = 0.0; -double Ibd1 ,dIbd1_dVb ,dIbd1_dVd ,dIbd1_dT = 0.0; -double Ibd2 ,dIbd2_dVb ,dIbd2_dVd ,dIbd2_dT = 0.0; -double Ibd3 ,dIbd3_dVb ,dIbd3_dVd ,dIbd3_dT = 0.0; -double Ibd4 ,dIbd4_dVb ,dIbd4_dVd ,dIbd4_dT = 0.0; -double ExpVbs1, dExpVbs1_dVb, dExpVbs1_dT = 0.0; -double ExpVbs2, dExpVbs2_dVb, dExpVbs2_dT = 0.0; -double ExpVbs4 = 0.0, dExpVbs4_dVb = 0.0, dExpVbs4_dT = 0.0; -double ExpVbd1, dExpVbd1_dVb, dExpVbd1_dT = 0.0; -double ExpVbd2, dExpVbd2_dVb, dExpVbd2_dT = 0.0; -double ExpVbd4 = 0.0, dExpVbd4_dVb = 0.0, dExpVbd4_dT = 0.0; -double WTsi, NVtm1, NVtm2; -double Ic = 0.0; -double Ibs = 0.0; -double Ibd = 0.0; -double Nomi ,dNomi_dVg ,dNomi_dVb ,dNomi_dVd ,dNomi_dVc; -double Denomi ,dDenomi_dVg ,dDenomi_dVd ,dDenomi_dVb ,dDenomi_dVc, dDenomi_dT; -double Qbf = 0.0 ,dQbf_dVg = 0.0 ,dQbf_dVb = 0.0 ,dQbf_dVd = 0.0; -double dQbf_dVc = 0.0 ,dQbf_dVe = 0.0; -double Qsubs1 = 0.0 ,dQsubs1_dVg ,dQsubs1_dVb ,dQsubs1_dVd ,dQsubs1_dVc; -double Qsubs2 = 0.0 ,dQsubs2_dVg ,dQsubs2_dVb ,dQsubs2_dVd ,dQsubs2_dVc ,dQsubs2_dVe; -double Qsub0 = 0.0 ,dQsub0_dVg ,dQsub0_dVb ,dQsub0_dVd ; -double Qac0 = 0.0 ,dQac0_dVb ,dQac0_dVd; -double Qdep0 ,dQdep0_dVb; -double Qe1 = 0.0 , dQe1_dVg ,dQe1_dVb, dQe1_dVd, dQe1_dVe, dQe1_dT; -double Ce1g ,Ce1b ,Ce1d ,Ce1e, Ce1T; -double Ce2g ,Ce2b ,Ce2d ,Ce2e, Ce2T; -double Qe2 = 0.0 , dQe2_dVg ,dQe2_dVb, dQe2_dVd, dQe2_dVe, dQe2_dT; -double dQbf_dVrg = 0.0, dQac0_dVrg, dQsub0_dVrg; -double dQsubs2_dVrg, dQbf0_dVe, dQbf0_dT; - -/* for self-heating */ -double vbi, vfbb, phi, sqrtPhi, Xdep0, jbjt, jdif, jrec, jtun, u0temp, vsattemp; -double rds0, ua, ub, uc; -double dvbi_dT, dvfbb_dT, djbjt_dT, djdif_dT, djrec_dT, djtun_dT, du0temp_dT; -double dvsattemp_dT, drds0_dT, dua_dT, dub_dT, duc_dT, dni_dT, dVtm_dT; -double dVfbeff_dT, dQac0_dT, dQsub0_dT; -double dQbf_dT = 0.0, dVdsCV_dT = 0.0, dPhisd_dT; -double dNomi_dT, dXc_dT = 0.0, dQsubs1_dT, dQsubs2_dT; -double dVcsCV_dT = 0.0, dPhisc_dT, dQsicv_dT; -double CbT, CsT, CgT; - -double Qex, dQex_dVg, dQex_dVb, dQex_dVd, dQex_dVe, dQex_dT; - -/* clean up last */ -FILE *fpdebug = NULL; -/* end clean up */ -int nandetect; -static int nanfound = 0; -char nanmessage [12]; - -double m; - - - for (; model != NULL; model = B3SOIDDnextModel(model)) -{ for (here = B3SOIDDinstances(model); here != NULL; - here = B3SOIDDnextInstance(here)) - { - Check = 0; - ByPass = 0; - selfheat = (model->B3SOIDDshMod == 1) && (here->B3SOIDDrth0 != 0.0); - pParam = here->pParam; - - if (here->B3SOIDDdebugMod > 3) - { - if (model->B3SOIDDtype > 0) - fpdebug = fopen("b3soiddn.log", "a"); - else - fpdebug = fopen("b3soiddp.log", "a"); - - fprintf(fpdebug, "******* Time : %.5e ******* Device: %s Iteration: %d\n", - ckt->CKTtime, here->B3SOIDDname, here->B3SOIDDiterations); - } - - if ((ckt->CKTmode & MODEINITSMSIG)) - { vbs = *(ckt->CKTstate0 + here->B3SOIDDvbs); - vgs = *(ckt->CKTstate0 + here->B3SOIDDvgs); - ves = *(ckt->CKTstate0 + here->B3SOIDDves); - vps = *(ckt->CKTstate0 + here->B3SOIDDvps); - vds = *(ckt->CKTstate0 + here->B3SOIDDvds); - delTemp = *(ckt->CKTstate0 + here->B3SOIDDdeltemp); - - vg = *(ckt->CKTrhsOld + here->B3SOIDDgNode); - vd = *(ckt->CKTrhsOld + here->B3SOIDDdNodePrime); - vs = *(ckt->CKTrhsOld + here->B3SOIDDsNodePrime); - vp = *(ckt->CKTrhsOld + here->B3SOIDDpNode); - ve = *(ckt->CKTrhsOld + here->B3SOIDDeNode); - vb = *(ckt->CKTrhsOld + here->B3SOIDDbNode); - - if (here->B3SOIDDdebugMod > 2) - { - fprintf(fpdebug, "... INIT SMSIG ...\n"); - } - if (here->B3SOIDDdebugMod > 0) - { - fprintf(stderr,"DC op. point converge with %d iterations\n", - here->B3SOIDDiterations); - } - } - else if ((ckt->CKTmode & MODEINITTRAN)) - { vbs = *(ckt->CKTstate1 + here->B3SOIDDvbs); - vgs = *(ckt->CKTstate1 + here->B3SOIDDvgs); - ves = *(ckt->CKTstate1 + here->B3SOIDDves); - vps = *(ckt->CKTstate1 + here->B3SOIDDvps); - vds = *(ckt->CKTstate1 + here->B3SOIDDvds); - delTemp = *(ckt->CKTstate1 + here->B3SOIDDdeltemp); - - vg = *(ckt->CKTrhsOld + here->B3SOIDDgNode); - vd = *(ckt->CKTrhsOld + here->B3SOIDDdNodePrime); - vs = *(ckt->CKTrhsOld + here->B3SOIDDsNodePrime); - vp = *(ckt->CKTrhsOld + here->B3SOIDDpNode); - ve = *(ckt->CKTrhsOld + here->B3SOIDDeNode); - vb = *(ckt->CKTrhsOld + here->B3SOIDDbNode); - - if (here->B3SOIDDdebugMod > 2) - { - fprintf(fpdebug, "... Init Transient ....\n"); - } - if (here->B3SOIDDdebugMod > 0) - { - fprintf(stderr, "Transient operation point converge with %d iterations\n", -here->B3SOIDDiterations); - } - here->B3SOIDDiterations = 0; - } - else if ((ckt->CKTmode & MODEINITJCT) && !here->B3SOIDDoff) - { vds = model->B3SOIDDtype * here->B3SOIDDicVDS; - vgs = model->B3SOIDDtype * here->B3SOIDDicVGS; - ves = model->B3SOIDDtype * here->B3SOIDDicVES; - vbs = model->B3SOIDDtype * here->B3SOIDDicVBS; - vps = model->B3SOIDDtype * here->B3SOIDDicVPS; - - vg = vd = vs = vp = ve = 0.0; - - here->B3SOIDDiterations = 0; /* initialize iteration number */ - - delTemp = 0.0; - here->B3SOIDDphi = pParam->B3SOIDDphi; - - - if (here->B3SOIDDdebugMod > 2) - fprintf(fpdebug, "... INIT JCT ...\n"); - - if ((vds == 0.0) && (vgs == 0.0) && (vbs == 0.0) && - ((ckt->CKTmode & (MODETRAN | MODEAC|MODEDCOP | - MODEDCTRANCURVE)) || (!(ckt->CKTmode & MODEUIC)))) - { vbs = 0.0; - vgs = model->B3SOIDDtype*0.1 + pParam->B3SOIDDvth0; - vds = 0.0; - ves = 0.0; - vps = 0.0; - } - } - else if ((ckt->CKTmode & (MODEINITJCT | MODEINITFIX)) && - (here->B3SOIDDoff)) - { delTemp = vps = vbs = vgs = vds = ves = 0.0; - vg = vd = vs = vp = ve = 0.0; - here->B3SOIDDiterations = 0; /* initialize iteration number */ - } - else - { -#ifndef PREDICTOR - if ((ckt->CKTmode & MODEINITPRED)) - { xfact = ckt->CKTdelta / ckt->CKTdeltaOld[1]; - *(ckt->CKTstate0 + here->B3SOIDDvbs) = - *(ckt->CKTstate1 + here->B3SOIDDvbs); - vbs = (1.0 + xfact)* (*(ckt->CKTstate1 + here->B3SOIDDvbs)) - - (xfact * (*(ckt->CKTstate2 + here->B3SOIDDvbs))); - *(ckt->CKTstate0 + here->B3SOIDDvgs) = - *(ckt->CKTstate1 + here->B3SOIDDvgs); - vgs = (1.0 + xfact)* (*(ckt->CKTstate1 + here->B3SOIDDvgs)) - - (xfact * (*(ckt->CKTstate2 + here->B3SOIDDvgs))); - *(ckt->CKTstate0 + here->B3SOIDDves) = - *(ckt->CKTstate1 + here->B3SOIDDves); - ves = (1.0 + xfact)* (*(ckt->CKTstate1 + here->B3SOIDDves)) - - (xfact * (*(ckt->CKTstate2 + here->B3SOIDDves))); - *(ckt->CKTstate0 + here->B3SOIDDvps) = - *(ckt->CKTstate1 + here->B3SOIDDvps); - vps = (1.0 + xfact)* (*(ckt->CKTstate1 + here->B3SOIDDvps)) - - (xfact * (*(ckt->CKTstate2 + here->B3SOIDDvps))); - *(ckt->CKTstate0 + here->B3SOIDDvds) = - *(ckt->CKTstate1 + here->B3SOIDDvds); - vds = (1.0 + xfact)* (*(ckt->CKTstate1 + here->B3SOIDDvds)) - - (xfact * (*(ckt->CKTstate2 + here->B3SOIDDvds))); - *(ckt->CKTstate0 + here->B3SOIDDvbd) = - *(ckt->CKTstate0 + here->B3SOIDDvbs) - - *(ckt->CKTstate0 + here->B3SOIDDvds); - - *(ckt->CKTstate0 + here->B3SOIDDvg) = *(ckt->CKTstate1 + here->B3SOIDDvg); - *(ckt->CKTstate0 + here->B3SOIDDvd) = *(ckt->CKTstate1 + here->B3SOIDDvd); - *(ckt->CKTstate0 + here->B3SOIDDvs) = *(ckt->CKTstate1 + here->B3SOIDDvs); - *(ckt->CKTstate0 + here->B3SOIDDvp) = *(ckt->CKTstate1 + here->B3SOIDDvp); - *(ckt->CKTstate0 + here->B3SOIDDve) = *(ckt->CKTstate1 + here->B3SOIDDve); - - /* Only predict ve */ - ve = (1.0 + xfact)* (*(ckt->CKTstate1 + here->B3SOIDDve)) - - - (xfact * (*(ckt->CKTstate2 + here->B3SOIDDve))); - /* Then update vg, vs, vb, vd, vp base on ve */ - vs = ve - model->B3SOIDDtype * ves; - vg = model->B3SOIDDtype * vgs + vs; - vd = model->B3SOIDDtype * vds + vs; - vb = model->B3SOIDDtype * vbs + vs; - vp = model->B3SOIDDtype * vps + vs; - - delTemp = (1.0 + xfact)* (*(ckt->CKTstate1 + - here->B3SOIDDdeltemp))-(xfact * (*(ckt->CKTstate2 + - here->B3SOIDDdeltemp))); - - if (selfheat) - { - here->B3SOIDDphi = 2.0 * here->B3SOIDDvtm - * log (pParam->B3SOIDDnpeak / - here->B3SOIDDni); - } - - if (here->B3SOIDDdebugMod > 0) - { - fprintf(stderr, "Time = %.6e converge with %d iterations\n", ckt->CKTtime, here->B3SOIDDiterations); - } - if (here->B3SOIDDdebugMod > 2) - { - fprintf(fpdebug, "... PREDICTOR calculation ....\n"); - } - here->B3SOIDDiterations = 0; - } - else - { -#endif /* PREDICTOR */ - - vg = B3SOIDDlimit(*(ckt->CKTrhsOld + here->B3SOIDDgNode), - *(ckt->CKTstate0 + here->B3SOIDDvg), 3.0, &Check); - vd = B3SOIDDlimit(*(ckt->CKTrhsOld + here->B3SOIDDdNodePrime), - *(ckt->CKTstate0 + here->B3SOIDDvd), 3.0, &Check); - vs = B3SOIDDlimit(*(ckt->CKTrhsOld + here->B3SOIDDsNodePrime), - *(ckt->CKTstate0 + here->B3SOIDDvs), 3.0, &Check); - vp = B3SOIDDlimit(*(ckt->CKTrhsOld + here->B3SOIDDpNode), - *(ckt->CKTstate0 + here->B3SOIDDvp), 3.0, &Check); - ve = B3SOIDDlimit(*(ckt->CKTrhsOld + here->B3SOIDDeNode), - *(ckt->CKTstate0 + here->B3SOIDDve), 3.0, &Check); - delTemp = *(ckt->CKTrhsOld + here->B3SOIDDtempNode); - - vbs = model->B3SOIDDtype * (*(ckt->CKTrhsOld+here->B3SOIDDbNode) - - *(ckt->CKTrhsOld+here->B3SOIDDsNodePrime)); - - vps = model->B3SOIDDtype * (vp - vs); - vgs = model->B3SOIDDtype * (vg - vs); - ves = model->B3SOIDDtype * (ve - vs); - vds = model->B3SOIDDtype * (vd - vs); - - if (here->B3SOIDDdebugMod > 2) - { - fprintf(fpdebug, "... DC calculation ....\n"); -fprintf(fpdebug, "Vg = %.10f; Vb = %.10f; Vs = %.10f\n", - *(ckt->CKTrhsOld + here->B3SOIDDgNode), - *(ckt->CKTrhsOld + here->B3SOIDDbNode), - *(ckt->CKTrhsOld + here->B3SOIDDsNode)); -fprintf(fpdebug, "Vd = %.10f; Vsp = %.10f; Vdp = %.10f\n", - *(ckt->CKTrhsOld + here->B3SOIDDdNode), - *(ckt->CKTrhsOld + here->B3SOIDDsNodePrime), - *(ckt->CKTrhsOld + here->B3SOIDDdNodePrime)); -fprintf(fpdebug, "Ve = %.10f; Vp = %.10f; delTemp = %.10f\n", - *(ckt->CKTrhsOld + here->B3SOIDDeNode), - *(ckt->CKTrhsOld + here->B3SOIDDpNode), - *(ckt->CKTrhsOld + here->B3SOIDDtempNode)); - - } - -#ifndef PREDICTOR - } -#endif /* PREDICTOR */ - - vbd = vbs - vds; - vgd = vgs - vds; - ved = ves - vds; - vgdo = *(ckt->CKTstate0 + here->B3SOIDDvgs) - - *(ckt->CKTstate0 + here->B3SOIDDvds); - vedo = *(ckt->CKTstate0 + here->B3SOIDDves) - - *(ckt->CKTstate0 + here->B3SOIDDvds); - delvbs = vbs - *(ckt->CKTstate0 + here->B3SOIDDvbs); - delvbd = vbd - *(ckt->CKTstate0 + here->B3SOIDDvbd); - delvgs = vgs - *(ckt->CKTstate0 + here->B3SOIDDvgs); - delves = ves - *(ckt->CKTstate0 + here->B3SOIDDves); - delvps = vps - *(ckt->CKTstate0 + here->B3SOIDDvps); - deldelTemp = delTemp - *(ckt->CKTstate0 + here->B3SOIDDdeltemp); - delvds = vds - *(ckt->CKTstate0 + here->B3SOIDDvds); - delvgd = vgd - vgdo; - delved = ved - vedo; - - if (here->B3SOIDDmode >= 0) - { - cdhat = here->B3SOIDDcd + (here->B3SOIDDgm-here->B3SOIDDgjdg) * delvgs - + (here->B3SOIDDgds - here->B3SOIDDgjdd) * delvds - + (here->B3SOIDDgmbs - here->B3SOIDDgjdb) * delvbs - + (here->B3SOIDDgme - here->B3SOIDDgjde) * delves - + (here->B3SOIDDgmT - here->B3SOIDDgjdT) * deldelTemp; - } - else - { - cdhat = here->B3SOIDDcd + (here->B3SOIDDgm-here->B3SOIDDgjdg) * delvgd - - (here->B3SOIDDgds - here->B3SOIDDgjdd) * delvds - + (here->B3SOIDDgmbs - here->B3SOIDDgjdb) * delvbd - + (here->B3SOIDDgme - here->B3SOIDDgjde) * delved - + (here->B3SOIDDgmT - here->B3SOIDDgjdT) * deldelTemp; - - } - cbhat = here->B3SOIDDcb + here->B3SOIDDgbgs * delvgs - + here->B3SOIDDgbbs * delvbs + here->B3SOIDDgbds * delvds - + here->B3SOIDDgbes * delves + here->B3SOIDDgbps * delvps - + here->B3SOIDDgbT * deldelTemp; - -#ifndef NOBYPASS - /* following should be one big if connected by && all over - * the place, but some C compilers can't handle that, so - * we split it up here to let them digest it in stages - */ - - if (here->B3SOIDDdebugMod > 3) - { -fprintf(fpdebug, "Convergent Criteria : vbs %d vds %d vgs %d ves %d vps %d temp %d\n", - ((fabs(delvbs) < (ckt->CKTreltol * MAX(fabs(vbs), - fabs(*(ckt->CKTstate0+here->B3SOIDDvbs))) + ckt->CKTvoltTol))) ? 1 : 0, - ((fabs(delvds) < (ckt->CKTreltol * MAX(fabs(vds), - fabs(*(ckt->CKTstate0+here->B3SOIDDvds))) + ckt->CKTvoltTol))) ? 1 : 0, - ((fabs(delvgs) < (ckt->CKTreltol * MAX(fabs(vgs), - fabs(*(ckt->CKTstate0+here->B3SOIDDvgs))) + ckt->CKTvoltTol))) ? 1 : 0, - ((fabs(delves) < (ckt->CKTreltol * MAX(fabs(ves), - fabs(*(ckt->CKTstate0+here->B3SOIDDves))) + ckt->CKTvoltTol))) ? 1 : 0, - ((fabs(delvps) < (ckt->CKTreltol * MAX(fabs(vps), - fabs(*(ckt->CKTstate0+here->B3SOIDDvps))) + ckt->CKTvoltTol))) ? 1 : 0, - ((fabs(deldelTemp) < (ckt->CKTreltol * MAX(fabs(delTemp), - fabs(*(ckt->CKTstate0+here->B3SOIDDdeltemp))) + ckt->CKTvoltTol*1e4))) ? 1 : 0); -fprintf(fpdebug, "delCd %.4e, delCb %.4e\n", fabs(cdhat - here->B3SOIDDcd) , - fabs(cbhat - here->B3SOIDDcb)); - - } - if ((!(ckt->CKTmode & MODEINITPRED)) && (ckt->CKTbypass) && Check == 0) - if ((fabs(delvbs) < (ckt->CKTreltol * MAX(fabs(vbs), - fabs(*(ckt->CKTstate0+here->B3SOIDDvbs))) + ckt->CKTvoltTol)) ) - if ((fabs(delvbd) < (ckt->CKTreltol * MAX(fabs(vbd), - fabs(*(ckt->CKTstate0+here->B3SOIDDvbd))) + ckt->CKTvoltTol)) ) - if ((fabs(delvgs) < (ckt->CKTreltol * MAX(fabs(vgs), - fabs(*(ckt->CKTstate0+here->B3SOIDDvgs))) + ckt->CKTvoltTol))) - if ((fabs(delves) < (ckt->CKTreltol * MAX(fabs(ves), - fabs(*(ckt->CKTstate0+here->B3SOIDDves))) + ckt->CKTvoltTol))) - if ( (here->B3SOIDDbodyMod == 0) || (here->B3SOIDDbodyMod == 2) || - (fabs(delvps) < (ckt->CKTreltol * MAX(fabs(vps), - fabs(*(ckt->CKTstate0+here->B3SOIDDvps))) + ckt->CKTvoltTol)) ) - if ( (here->B3SOIDDtempNode == 0) || - (fabs(deldelTemp) < (ckt->CKTreltol * MAX(fabs(delTemp), - fabs(*(ckt->CKTstate0+here->B3SOIDDdeltemp))) - + ckt->CKTvoltTol*1e4))) - if ((fabs(delvds) < (ckt->CKTreltol * MAX(fabs(vds), - fabs(*(ckt->CKTstate0+here->B3SOIDDvds))) + ckt->CKTvoltTol))) - if ((fabs(cdhat - here->B3SOIDDcd) < ckt->CKTreltol - * MAX(fabs(cdhat),fabs(here->B3SOIDDcd)) + ckt->CKTabstol)) - if ((fabs(cbhat - here->B3SOIDDcb) < ckt->CKTreltol - * MAX(fabs(cbhat),fabs(here->B3SOIDDcb)) + ckt->CKTabstol) ) - { /* bypass code */ - vbs = *(ckt->CKTstate0 + here->B3SOIDDvbs); - vbd = *(ckt->CKTstate0 + here->B3SOIDDvbd); - vgs = *(ckt->CKTstate0 + here->B3SOIDDvgs); - ves = *(ckt->CKTstate0 + here->B3SOIDDves); - vps = *(ckt->CKTstate0 + here->B3SOIDDvps); - vds = *(ckt->CKTstate0 + here->B3SOIDDvds); - delTemp = *(ckt->CKTstate0 + here->B3SOIDDdeltemp); - - /* calculate Vds for temperature conductance calculation - in bypass (used later when filling Temp node matrix) */ - Vds = here->B3SOIDDmode > 0 ? vds : -vds; - - vgd = vgs - vds; - vgb = vgs - vbs; - veb = ves - vbs; - - if (here->B3SOIDDdebugMod > 2) - { -fprintf(stderr, "Bypass for %s...\n", here->B3SOIDDname); - fprintf(fpdebug, "... By pass ....\n"); - fprintf(fpdebug, "vgs=%.4f, vds=%.4f, vbs=%.4f, ", - vgs, vds, vbs); - fprintf(fpdebug, "ves=%.4f, vps=%.4f\n", ves, vps); - } - if ((ckt->CKTmode & (MODETRAN | MODEAC)) || - ((ckt->CKTmode & MODETRANOP) && (ckt->CKTmode & MODEUIC))) - { ByPass = 1; - goto line755; - } - else - { goto line850; - } - } - - -#endif /*NOBYPASS*/ - von = here->B3SOIDDvon; - - if ((here->B3SOIDDdebugMod > 1) || (here->B3SOIDDdebugMod == -1)) - { - here->B3SOIDDdum1 = here->B3SOIDDdum2 = here->B3SOIDDdum3 = 0.0; - here->B3SOIDDdum4 = here->B3SOIDDdum5 = 0.0; - Qac0 = Qsub0 = Qsubs1 = Qsubs2 = Qbf = Qe1 = Qe2 = 0.0; - qjs = qjd = Cbg = Cbb = Cbd = Cbe = Xc = qdrn = qgate = 0.0; - qbody = qsub = 0.0; - } - - if (here->B3SOIDDdebugMod > 2) { - fprintf(fpdebug, "Limited : vgs = %.8f\n", vgs); - fprintf(fpdebug, "Limited : vds = %.8f\n", vds); - } - - if (*(ckt->CKTstate0 + here->B3SOIDDvds) >= 0.0) - T0 = *(ckt->CKTstate0 + here->B3SOIDDvbs); - else - T0 = *(ckt->CKTstate0 + here->B3SOIDDvbd); - - if (here->B3SOIDDdebugMod > 2) - fprintf(fpdebug, "Before lim : vbs = %.8f, after = ", T0); - - if (vds >= 0.0) - { - vbs = B3SOIDDlimit(vbs, T0, 0.2, &Check); - vbs = B3SOIDDSmartVbs(vbs, T0, here, ckt, &Check); - vbd = vbs - vds; - vb = model->B3SOIDDtype * vbs + vs; - if (here->B3SOIDDdebugMod > 2) - fprintf(fpdebug, "%.8f\n", vbs); - } else - { - vbd = B3SOIDDlimit(vbd, T0, 0.2, &Check); - vbd = B3SOIDDSmartVbs(vbd, T0, here, ckt, &Check); - vbs = vbd + vds; - vb = model->B3SOIDDtype * vbs + vd; - if (here->B3SOIDDdebugMod > 2) - fprintf(fpdebug, "%.8f\n", vbd); - } - - delTemp =B3SOIDDlimit(delTemp, *(ckt->CKTstate0 + here->B3SOIDDdeltemp),5.0,&Check); - - } - -/* Calculate temperature dependent values for self-heating effect */ - Temp = delTemp + ckt->CKTtemp; -/* for debugging - Temp = ckt->CKTtemp; - selfheat = 1; - if (here->B3SOIDDname[1] == '2') - { - Temp += 0.01; - } */ - TempRatio = Temp / model->B3SOIDDtnom; - - if (selfheat) { - Vtm = KboQ * Temp; - - T0 = 1108.0 + Temp; - T5 = Temp * Temp; - Eg = 1.16 - 7.02e-4 * T5 / T0; - T1 = ((7.02e-4 * T5) - T0 * (14.04e-4 * Temp)) / T0 / T0; - /* T1 = dEg / dT */ - - T2 = 1.9230584e-4; /* T2 = 1 / 300.15^(3/2) */ - T5 = sqrt(Temp); - T3 = 1.45e10 * Temp * T5 * T2; - T4 = exp(21.5565981 - Eg / (2.0 * Vtm)); - ni = T3 * T4; - dni_dT = 2.175e10 * T2 * T5 * T4 + T3 * T4 * - (-Vtm * T1 + Eg * KboQ) / (2.0 * Vtm * Vtm); - - T0 = log(1.0e20 * pParam->B3SOIDDnpeak / (ni * ni)); - vbi = Vtm * T0; - dvbi_dT = KboQ * T0 + Vtm * (-2.0 * dni_dT / ni); - - if (pParam->B3SOIDDnsub > 0) { - T0 = log(pParam->B3SOIDDnpeak / pParam->B3SOIDDnsub); - vfbb = -model->B3SOIDDtype * Vtm*T0; - dvfbb_dT = -model->B3SOIDDtype * KboQ*T0; - } - else { - T0 = log(-pParam->B3SOIDDnpeak*pParam->B3SOIDDnsub/ni/ni); - vfbb = -model->B3SOIDDtype * Vtm*T0; - dvfbb_dT = -model->B3SOIDDtype * - (KboQ * T0 + Vtm * 2.0 * dni_dT / ni); - } - -/* phi = 2.0 * Vtm * log(pParam->B3SOIDDnpeak / ni); */ - phi = here->B3SOIDDphi; - sqrtPhi = sqrt(phi); - Xdep0 = sqrt(2.0 * EPSSI / (Charge_q - * pParam->B3SOIDDnpeak * 1.0e6)) - * sqrtPhi; - /* Save the values below for phi calculation in B3SOIDDaccept() */ - here->B3SOIDDvtm = Vtm; - here->B3SOIDDni = ni; - - /* Use dTx_dVe variables to act as dTx_dT variables */ - - T8 = 1 / model->B3SOIDDtnom; - T7 = model->B3SOIDDxbjt / pParam->B3SOIDDndiode; - T0 = pow(TempRatio, T7); - dT0_dVe = T7 * pow(TempRatio, T7 - 1.0) * T8; - - T7 = model->B3SOIDDxdif / pParam->B3SOIDDndiode; - T1 = pow(TempRatio, T7); - dT1_dVe = T7 * pow(TempRatio, T7 - 1.0) * T8; - - T7 = model->B3SOIDDxrec / pParam->B3SOIDDndiode / 2.0; - T2 = pow(TempRatio, T7); - dT2_dVe = T7 * pow(TempRatio, T7 - 1.0) * T8; - - T3 = TempRatio - 1.0; - T4 = Eg300 / pParam->B3SOIDDndiode / Vtm * T3; - dT4_dVe = Eg300 / pParam->B3SOIDDndiode / Vtm / Vtm * - (Vtm * T8 - T3 * KboQ); - T5 = exp(T4); - dT5_dVe = dT4_dVe * T5; - T6 = sqrt(T5); - dT6_dVe = 0.5 / T6 * dT5_dVe; - - jbjt = pParam->B3SOIDDisbjt * T0 * T5; - jdif = pParam->B3SOIDDisdif * T1 * T5; - jrec = pParam->B3SOIDDisrec * T2 * T6; - djbjt_dT = pParam->B3SOIDDisbjt * (T0 * dT5_dVe + T5 * dT0_dVe); - djdif_dT = pParam->B3SOIDDisdif * (T1 * dT5_dVe + T5 * dT1_dVe); - djrec_dT = pParam->B3SOIDDisrec * (T2 * dT6_dVe + T6 * dT2_dVe); - - T7 = model->B3SOIDDxtun / pParam->B3SOIDDntun; - T0 = pow(TempRatio, T7); - jtun = model->B3SOIDDistun * T0; - djtun_dT = model->B3SOIDDistun * T7 * pow(TempRatio, T7 - 1.0) * T8; - - u0temp = pParam->B3SOIDDu0 * pow(TempRatio, pParam->B3SOIDDute); - du0temp_dT = pParam->B3SOIDDu0 * pParam->B3SOIDDute * - pow(TempRatio, pParam->B3SOIDDute - 1.0) * T8; - - vsattemp = pParam->B3SOIDDvsat - pParam->B3SOIDDat * T3; - dvsattemp_dT = -pParam->B3SOIDDat * T8; - - rds0 = (pParam->B3SOIDDrdsw + pParam->B3SOIDDprt - * T3) / pParam->B3SOIDDrds0denom; - drds0_dT = pParam->B3SOIDDprt / pParam->B3SOIDDrds0denom * T8; - - ua = pParam->B3SOIDDuatemp + pParam->B3SOIDDua1 * T3; - ub = pParam->B3SOIDDubtemp + pParam->B3SOIDDub1 * T3; - uc = pParam->B3SOIDDuctemp + pParam->B3SOIDDuc1 * T3; - dua_dT = pParam->B3SOIDDua1 * T8; - dub_dT = pParam->B3SOIDDub1 * T8; - duc_dT = pParam->B3SOIDDuc1 * T8; - } - else { - vbi = pParam->B3SOIDDvbi; - vfbb = pParam->B3SOIDDvfbb; - phi = pParam->B3SOIDDphi; - sqrtPhi = pParam->B3SOIDDsqrtPhi; - Xdep0 = pParam->B3SOIDDXdep0; - jbjt = pParam->B3SOIDDjbjt; - jdif = pParam->B3SOIDDjdif; - jrec = pParam->B3SOIDDjrec; - jtun = pParam->B3SOIDDjtun; - u0temp = pParam->B3SOIDDu0temp; - vsattemp = pParam->B3SOIDDvsattemp; - rds0 = pParam->B3SOIDDrds0; - ua = pParam->B3SOIDDua; - ub = pParam->B3SOIDDub; - uc = pParam->B3SOIDDuc; - dni_dT = dvbi_dT = dvfbb_dT = djbjt_dT = djdif_dT = 0.0; - djrec_dT = djtun_dT = du0temp_dT = dvsattemp_dT = 0.0; - drds0_dT = dua_dT = dub_dT = duc_dT = 0.0; - } - - /* TempRatio used for Vth and mobility */ - if (selfheat) { - TempRatio = Temp / model->B3SOIDDtnom - 1.0; - } - else { - TempRatio = ckt->CKTtemp / model->B3SOIDDtnom - 1.0; - } - - /* determine DC current and derivatives */ - vbd = vbs - vds; - vgd = vgs - vds; - vgb = vgs - vbs; - ved = ves - vds; - veb = ves - vbs; - vge = vgs - ves; - vpd = vps - vds; - - - if (vds >= 0.0) - { /* normal mode */ - here->B3SOIDDmode = 1; - Vds = vds; - Vgs = vgs; - Vbs = vbs; - Vbd = vbd; - Ves = ves; - Vps = vps; - } - else - { /* inverse mode */ - here->B3SOIDDmode = -1; - Vds = -vds; - Vgs = vgd; - Vbs = vbd; - Vbd = vbs; - Ves = ved; - Vps = vpd; - } - - - if (here->B3SOIDDdebugMod > 2) - { - fprintf(fpdebug, "Vgs=%.4f, Vds=%.4f, Vbs=%.4f, ", - Vgs, Vds, Vbs); - fprintf(fpdebug, "Ves=%.4f, Vps=%.4f, Temp=%.1f\n", - Ves, Vps, Temp); - } - - Vesfb = Ves - vfbb; - Cbox = model->B3SOIDDcbox; - K1 = pParam->B3SOIDDk1; - - ChargeComputationNeeded = - ((ckt->CKTmode & (MODEAC | MODETRAN | MODEINITSMSIG)) || - ((ckt->CKTmode & MODETRANOP) && (ckt->CKTmode & MODEUIC))) - ? 1 : 0; - - if (here->B3SOIDDdebugMod == -1) - ChargeComputationNeeded = 1; - - - - -/* Poly Gate Si Depletion Effect */ - T0 = pParam->B3SOIDDvfb + phi; - if ((pParam->B3SOIDDngate > 1.e18) && (pParam->B3SOIDDngate < 1.e25) - && (Vgs > T0)) - /* added to avoid the problem caused by ngate */ - { T1 = 1.0e6 * Charge_q * EPSSI * pParam->B3SOIDDngate - / (model->B3SOIDDcox * model->B3SOIDDcox); - T4 = sqrt(1.0 + 2.0 * (Vgs - T0) / T1); - T2 = T1 * (T4 - 1.0); - T3 = 0.5 * T2 * T2 / T1; /* T3 = Vpoly */ - T7 = 1.12 - T3 - 0.05; - T6 = sqrt(T7 * T7 + 0.224); - T5 = 1.12 - 0.5 * (T7 + T6); - Vgs_eff = Vgs - T5; - dVgs_eff_dVg = 1.0 - (0.5 - 0.5 / T4) * (1.0 + T7 / T6); - } - else - { Vgs_eff = Vgs; - dVgs_eff_dVg = 1.0; - } - - - Leff = pParam->B3SOIDDleff; - - if (selfheat) { - Vtm = KboQ * Temp; - dVtm_dT = KboQ; - } - else { - Vtm = model->B3SOIDDvtm; - dVtm_dT = 0.0; - } - - V0 = vbi - phi; - -/* Prepare Vbs0t */ - T0 = -pParam->B3SOIDDdvbd1 * pParam->B3SOIDDleff / pParam->B3SOIDDlitl; - T1 = pParam->B3SOIDDdvbd0 * (exp(0.5*T0) + 2*exp(T0)); - T2 = T1 * (vbi - phi); - T3 = 0.5 * model->B3SOIDDqsi / model->B3SOIDDcsi; - Vbs0t = phi - T3 + pParam->B3SOIDDvbsa + T2; - if (selfheat) - dVbs0t_dT = T1 * dvbi_dT; - else - dVbs0t_dT = 0.0; - -/* Prepare Vbs0 */ - T0 = 1 + model->B3SOIDDcsieff / Cbox; - T1 = pParam->B3SOIDDkb1 / T0; - T2 = T1 * (Vbs0t - Vesfb); - - /* T6 is Vbs0 before limiting */ - T6 = Vbs0t - T2; - dT6_dVe = T1; - if (selfheat) - dT6_dT = dVbs0t_dT - T1 * (dVbs0t_dT + dvfbb_dT); - else - dT6_dT = 0.0; - - /* limit Vbs0 to below phi */ - T1 = phi - pParam->B3SOIDDdelp; - T2 = T1 - T6 - DELT_Vbseff; - T3 = sqrt(T2 * T2 + 4.0 * DELT_Vbseff); - Vbs0 = T1 - 0.5 * (T2 + T3); - T4 = 0.5 * (1 + T2/T3); - dVbs0_dVe = T4 * dT6_dVe; - if (selfheat) dVbs0_dT = T4 * dT6_dT; - else dVbs0_dT = 0.0; - - T1 = Vbs0t - Vbs0 - DELT_Vbsmos; - T2 = sqrt(T1 * T1 + DELT_Vbsmos * DELT_Vbsmos); - T3 = 0.5 * (T1 + T2); - T4 = T3 * model->B3SOIDDcsieff / model->B3SOIDDqsieff; - Vbs0mos = Vbs0 - 0.5 * T3 * T4; - T5 = 0.5 * T4 * (1 + T1 / T2); - dVbs0mos_dVe = dVbs0_dVe * (1 + T5); - if (selfheat) - dVbs0mos_dT = dVbs0_dT - (dVbs0t_dT - dVbs0_dT) * T5; - else - dVbs0mos_dT = 0.0; - -/* Prepare Vthfd - treat Vbs0mos as if it were independent variable Vb */ - Phis = phi - Vbs0mos; - dPhis_dVb = -1; - sqrtPhis = sqrt(Phis); - dsqrtPhis_dVb = -0.5 / sqrtPhis; - Xdep = Xdep0 * sqrtPhis / sqrtPhi; - dXdep_dVb = (Xdep0 / sqrtPhi) - * dsqrtPhis_dVb; - sqrtXdep = sqrt(Xdep); - - T0 = pParam->B3SOIDDdvt2 * Vbs0mos; - if (T0 >= - 0.5) - { T1 = 1.0 + T0; - T2 = pParam->B3SOIDDdvt2; - } - else /* Added to avoid any discontinuity problems caused by dvt2*/ - { T4 = 1.0 / (3.0 + 8.0 * T0); - T1 = (1.0 + 3.0 * T0) * T4; - T2 = pParam->B3SOIDDdvt2 * T4 * T4; - } - lt1 = model->B3SOIDDfactor1 * sqrtXdep * T1; - dlt1_dVb = model->B3SOIDDfactor1 * (0.5 / sqrtXdep * T1 * dXdep_dVb - + sqrtXdep * T2); - - T0 = pParam->B3SOIDDdvt2w * Vbs0mos; - if (T0 >= - 0.5) - { T1 = 1.0 + T0; - T2 = pParam->B3SOIDDdvt2w; - } - else /* Added to avoid any discontinuity problems caused by - dvt2w */ - { T4 = 1.0 / (3.0 + 8.0 * T0); - T1 = (1.0 + 3.0 * T0) * T4; - T2 = pParam->B3SOIDDdvt2w * T4 * T4; - } - ltw= model->B3SOIDDfactor1 * sqrtXdep * T1; - dltw_dVb = model->B3SOIDDfactor1 * (0.5 / sqrtXdep * T1 * dXdep_dVb - + sqrtXdep * T2); - - T0 = -0.5 * pParam->B3SOIDDdvt1 * Leff / lt1; - if (T0 > -EXP_THRESHOLD) - { T1 = exp(T0); - dT1_dVb = -T0 / lt1 * T1 * dlt1_dVb; - Theta0 = T1 * (1.0 + 2.0 * T1); - dTheta0_dVb = (1.0 + 4.0 * T1) * dT1_dVb; - } - else - { T1 = MIN_EXP; - Theta0 = T1 * (1.0 + 2.0 * T1); - dTheta0_dVb = 0.0; - } - here->B3SOIDDthetavth = pParam->B3SOIDDdvt0 * Theta0; - Delt_vth = here->B3SOIDDthetavth * V0; - dDelt_vth_dVb = pParam->B3SOIDDdvt0 * dTheta0_dVb * V0; - if (selfheat) dDelt_vth_dT = here->B3SOIDDthetavth * dvbi_dT; - else dDelt_vth_dT = 0.0; - - T0 = -0.5*pParam->B3SOIDDdvt1w * pParam->B3SOIDDweff*Leff/ltw; - if (T0 > -EXP_THRESHOLD) - { T1 = exp(T0); - T2 = T1 * (1.0 + 2.0 * T1); - dT1_dVb = -T0 / ltw * T1 * dltw_dVb; - dT2_dVb = (1.0 + 4.0 * T1) * dT1_dVb; - } - else - { T1 = MIN_EXP; - T2 = T1 * (1.0 + 2.0 * T1); - dT2_dVb = 0.0; - } - T0 = pParam->B3SOIDDdvt0w * T2; - DeltVthw = T0 * V0; - dDeltVthw_dVb = pParam->B3SOIDDdvt0w * dT2_dVb * V0; - if (selfheat) dDeltVthw_dT = T0 * dvbi_dT; - else dDeltVthw_dT = 0.0; - - T0 = sqrt(1.0 + pParam->B3SOIDDnlx / Leff); - T1 = (pParam->B3SOIDDkt1 + pParam->B3SOIDDkt1l / Leff - + pParam->B3SOIDDkt2 * Vbs0mos); - DeltVthtemp = pParam->B3SOIDDk1 * (T0 - 1.0) * sqrtPhi + T1 * TempRatio; - if (selfheat) dDeltVthtemp_dT = T1 / model->B3SOIDDtnom; - else dDeltVthtemp_dT = 0.0; - - tmp2 = model->B3SOIDDtox * phi - / (pParam->B3SOIDDweff + pParam->B3SOIDDw0); - - T3 = pParam->B3SOIDDeta0 + pParam->B3SOIDDetab * Vbs0mos; - if (T3 < 1.0e-4) /* avoid discontinuity problems caused by etab */ - { T9 = 1.0 / (3.0 - 2.0e4 * T3); - T3 = (2.0e-4 - T3) * T9; - T4 = T9 * T9 * pParam->B3SOIDDetab; - dT3_dVb = T4; - } - else - { - dT3_dVb = pParam->B3SOIDDetab; - } - DIBL_Sft = T3 * pParam->B3SOIDDtheta0vb0 * Vds; - dDIBL_Sft_dVd = T3 * pParam->B3SOIDDtheta0vb0; - dDIBL_Sft_dVb = pParam->B3SOIDDtheta0vb0 * Vds * dT3_dVb; - - Vthfd = model->B3SOIDDtype * pParam->B3SOIDDvth0 + pParam->B3SOIDDk1 - * (sqrtPhis - sqrtPhi) - pParam->B3SOIDDk2 - * Vbs0mos-Delt_vth-DeltVthw +(pParam->B3SOIDDk3 +pParam->B3SOIDDk3b - * Vbs0mos) * tmp2 + DeltVthtemp - DIBL_Sft; - - T6 = pParam->B3SOIDDk3b * tmp2 - pParam->B3SOIDDk2 + - pParam->B3SOIDDkt2 * TempRatio; - dVthfd_dVd = -dDIBL_Sft_dVd; - T7 = pParam->B3SOIDDk1 * dsqrtPhis_dVb - - dDelt_vth_dVb - dDeltVthw_dVb - + T6 - dDIBL_Sft_dVb; - dVthfd_dVe = T7 * dVbs0mos_dVe; - if (selfheat) - dVthfd_dT = dDeltVthtemp_dT - dDelt_vth_dT - dDeltVthw_dT - + T7 * dVbs0mos_dT; - else - dVthfd_dT = 0.0; - -/* Effective Vbs0 and Vbs0t for all Vgs */ - T1 = Vthfd - Vgs_eff - DELT_Vbs0eff; - T2 = sqrt(T1 * T1 + DELT_Vbs0eff * DELT_Vbs0eff ); - - Vbs0teff = Vbs0t - 0.5 * (T1 + T2); - dVbs0teff_dVg = 0.5 * (1 + T1/T2) * dVgs_eff_dVg; - dVbs0teff_dVd = - 0.5 * (1 + T1 / T2) * dVthfd_dVd; - dVbs0teff_dVe = - 0.5 * (1 + T1 / T2) * dVthfd_dVe; - if (selfheat) - dVbs0teff_dT = dVbs0t_dT - 0.5 * (1 + T1 / T2) * dVthfd_dT; - else - dVbs0teff_dT = 0.0; - - /* Calculate nfb */ - T3 = 1 / (K1 * K1); - T4 = pParam->B3SOIDDkb3 * Cbox / model->B3SOIDDcox; - T8 = sqrt(phi - Vbs0mos); - T5 = sqrt(1 + 4 * T3 * (phi + K1 * T8 - Vbs0mos)); - T6 = 1 + T4 * T5; - Nfb = model->B3SOIDDnfb = 1 / T6; - T7 = 2 * T3 * T4 * Nfb * Nfb / T5 * (0.5 * K1 / T8 + 1); - Vbs0eff = Vbs0 - Nfb * 0.5 * (T1 + T2); - dVbs0eff_dVg = Nfb * 0.5 * (1 + T1/T2) * dVgs_eff_dVg; - dVbs0eff_dVd = - Nfb * 0.5 * (1 + T1 / T2) * dVthfd_dVd; - dVbs0eff_dVe = dVbs0_dVe - Nfb * 0.5 * (1 + T1 / T2) - * dVthfd_dVe - T7 * 0.5 * (T1 + T2) * dVbs0mos_dVe; - if (selfheat) - dVbs0eff_dT = dVbs0_dT - Nfb * 0.5 * (1 + T1 / T2) - * dVthfd_dT - T7 * 0.5 * (T1 + T2) * dVbs0mos_dT; - else - dVbs0eff_dT = 0.0; - -/* Simple check of Vbs */ -/* Prepare Vbsdio */ - T1 = Vbs - (Vbs0eff + OFF_Vbsdio) - DELT_Vbsdio; - T2 = sqrt(T1*T1 + DELT_Vbsdio * DELT_Vbsdio); - T3 = 0.5 * (1 + T1/T2); - - Vbsdio = Vbs0eff + OFF_Vbsdio + 0.5 * (T1 + T2); - dVbsdio_dVg = (1 - T3) * dVbs0eff_dVg; - dVbsdio_dVd = (1 - T3) * dVbs0eff_dVd; - dVbsdio_dVe = (1 - T3) * dVbs0eff_dVe; - if (selfheat) dVbsdio_dT = (1 - T3) * dVbs0eff_dT; - else dVbsdio_dT = 0.0; - dVbsdio_dVb = T3; - -/* Prepare Vbseff */ - T1 = Vbs0teff - Vbsdio - DELT_Vbsmos; - T2 = sqrt(T1 * T1 + DELT_Vbsmos * DELT_Vbsmos); - T3 = 0.5 * (T1 + T2); - T5 = 0.5 * (1 + T1/T2); - dT3_dVg = T5 * (dVbs0teff_dVg - dVbsdio_dVg); - dT3_dVd = T5 * (dVbs0teff_dVd - dVbsdio_dVd); - dT3_dVb = - T5 * dVbsdio_dVb; - dT3_dVe = T5 * (dVbs0teff_dVe - dVbsdio_dVe); - if (selfheat) dT3_dT = T5 * (dVbs0teff_dT - dVbsdio_dT); - else dT3_dT = 0.0; - T4 = T3 * model->B3SOIDDcsieff / model->B3SOIDDqsieff; - - Vbsmos = Vbsdio - 0.5 * T3 * T4; - dVbsmos_dVg = dVbsdio_dVg - T4 * dT3_dVg; - dVbsmos_dVd = dVbsdio_dVd - T4 * dT3_dVd; - dVbsmos_dVb = dVbsdio_dVb - T4 * dT3_dVb; - dVbsmos_dVe = dVbsdio_dVe - T4 * dT3_dVe; - if (selfheat) dVbsmos_dT = dVbsdio_dT - T4 * dT3_dT; - else dVbsmos_dT = 0.0; - -/* Prepare Vcs */ - Vcs = Vbsdio - Vbs0eff; - dVcs_dVb = dVbsdio_dVb; - dVcs_dVg = dVbsdio_dVg - dVbs0eff_dVg; - dVcs_dVd = dVbsdio_dVd - dVbs0eff_dVd; - dVcs_dVe = dVbsdio_dVe - dVbs0eff_dVe; - dVcs_dT = dVbsdio_dT - dVbs0eff_dT; - -/* Check Vps */ - /* Note : if Vps is less Vbs0eff => non-physical */ - T1 = Vps - Vbs0eff + DELT_Vbs0dio; - T2 = sqrt(T1 * T1 + DELT_Vbs0dio * DELT_Vbs0dio); - T3 = 0.5 * (1 + T1/T2); - Vpsdio = Vbs0eff + 0.5 * (T1 + T2); - dVpsdio_dVg = (1 - T3) * dVbs0eff_dVg; - dVpsdio_dVd = (1 - T3) * dVbs0eff_dVd; - dVpsdio_dVe = (1 - T3) * dVbs0eff_dVe; - if (selfheat) dVpsdio_dT = (1 - T3) * dVbs0eff_dT; - else dVpsdio_dT = 0.0; - dVpsdio_dVp = T3; - Vbp = Vbsdio - Vpsdio; - dVbp_dVb = dVbsdio_dVb; - dVbp_dVg = dVbsdio_dVg - dVpsdio_dVg; - dVbp_dVd = dVbsdio_dVd - dVpsdio_dVd; - dVbp_dVe = dVbsdio_dVe - dVpsdio_dVe; - dVbp_dT = dVbsdio_dT - dVpsdio_dT; - dVbp_dVp = - dVpsdio_dVp; - - here->B3SOIDDvbsdio = Vbsdio; - here->B3SOIDDvbs0eff = Vbs0eff; - - T1 = phi - pParam->B3SOIDDdelp; - T2 = T1 - Vbsmos - DELT_Vbseff; - T3 = sqrt(T2 * T2 + 4.0 * DELT_Vbseff * T1); - Vbseff = T1 - 0.5 * (T2 + T3); - T4 = 0.5 * (1 + T2/T3); - dVbseff_dVg = T4 * dVbsmos_dVg; - dVbseff_dVd = T4 * dVbsmos_dVd; - dVbseff_dVb = T4 * dVbsmos_dVb; - dVbseff_dVe = T4 * dVbsmos_dVe; - if (selfheat) dVbseff_dT = T4 * dVbsmos_dT; - else dVbseff_dT = 0.0; - - here->B3SOIDDvbseff = Vbseff; - - Phis = phi - Vbseff; - dPhis_dVb = -1; - sqrtPhis = sqrt(Phis); - dsqrtPhis_dVb = -0.5 / sqrtPhis ; - - Xdep = Xdep0 * sqrtPhis / sqrtPhi; - dXdep_dVb = (Xdep0 / sqrtPhi) - * dsqrtPhis_dVb; - -/* Vth Calculation */ - T3 = sqrt(Xdep); - - T0 = pParam->B3SOIDDdvt2 * Vbseff; - if (T0 >= - 0.5) - { T1 = 1.0 + T0; - T2 = pParam->B3SOIDDdvt2 ; - } - else /* Added to avoid any discontinuity problems caused by dvt2 */ - { T4 = 1.0 / (3.0 + 8.0 * T0); - T1 = (1.0 + 3.0 * T0) * T4; - T2 = pParam->B3SOIDDdvt2 * T4 * T4 ; - } - lt1 = model->B3SOIDDfactor1 * T3 * T1; - dlt1_dVb =model->B3SOIDDfactor1 * (0.5 / T3 * T1 * dXdep_dVb + T3 * T2); - - T0 = pParam->B3SOIDDdvt2w * Vbseff; - if (T0 >= - 0.5) - { T1 = 1.0 + T0; - T2 = pParam->B3SOIDDdvt2w ; - } - else /* Added to avoid any discontinuity problems caused by dvt2w */ - { T4 = 1.0 / (3.0 + 8.0 * T0); - T1 = (1.0 + 3.0 * T0) * T4; - T2 = pParam->B3SOIDDdvt2w * T4 * T4 ; - } - ltw= model->B3SOIDDfactor1 * T3 * T1; - dltw_dVb=model->B3SOIDDfactor1*(0.5 / T3 * T1 * dXdep_dVb + T3 * T2); - - T0 = -0.5 * pParam->B3SOIDDdvt1 * Leff / lt1; - if (T0 > -EXP_THRESHOLD) - { T1 = exp(T0); - Theta0 = T1 * (1.0 + 2.0 * T1); - dT1_dVb = -T0 / lt1 * T1 * dlt1_dVb; - dTheta0_dVb = (1.0 + 4.0 * T1) * dT1_dVb; - } - else - { T1 = MIN_EXP; - Theta0 = T1 * (1.0 + 2.0 * T1); - dTheta0_dVb = 0.0; - } - - here->B3SOIDDthetavth = pParam->B3SOIDDdvt0 * Theta0; - Delt_vth = here->B3SOIDDthetavth * V0; - dDelt_vth_dVb = pParam->B3SOIDDdvt0 * dTheta0_dVb * V0; - if (selfheat) dDelt_vth_dT = here->B3SOIDDthetavth * dvbi_dT; - else dDelt_vth_dT = 0.0; - - T0 = -0.5 * pParam->B3SOIDDdvt1w * pParam->B3SOIDDweff * Leff / ltw; - if (T0 > -EXP_THRESHOLD) - { T1 = exp(T0); - T2 = T1 * (1.0 + 2.0 * T1); - dT1_dVb = -T0 / ltw * T1 * dltw_dVb; - dT2_dVb = (1.0 + 4.0 * T1) * dT1_dVb; - } - else - { T1 = MIN_EXP; - T2 = T1 * (1.0 + 2.0 * T1); - dT2_dVb = 0.0; - } - - T0 = pParam->B3SOIDDdvt0w * T2; - DeltVthw = T0 * V0; - dDeltVthw_dVb = pParam->B3SOIDDdvt0w * dT2_dVb * V0; - if (selfheat) dDeltVthw_dT = T0 * dvbi_dT; - else dDeltVthw_dT = 0.0; - - T0 = sqrt(1.0 + pParam->B3SOIDDnlx / Leff); - T1 = (pParam->B3SOIDDkt1 + pParam->B3SOIDDkt1l / Leff - + pParam->B3SOIDDkt2 * Vbseff); - DeltVthtemp = pParam->B3SOIDDk1 * (T0 - 1.0) * sqrtPhi + T1 * TempRatio; - if (selfheat) - dDeltVthtemp_dT = T1 / model->B3SOIDDtnom; - else - dDeltVthtemp_dT = 0.0; - - tmp2 = model->B3SOIDDtox * phi - / (pParam->B3SOIDDweff + pParam->B3SOIDDw0); - - T3 = pParam->B3SOIDDeta0 + pParam->B3SOIDDetab * Vbseff; - if (T3 < 1.0e-4) /* avoid discontinuity problems caused by etab */ - { T9 = 1.0 / (3.0 - 2.0e4 * T3); - T3 = (2.0e-4 - T3) * T9; - T4 = T9 * T9 * pParam->B3SOIDDetab; - dT3_dVb = T4 ; - } - else - { - dT3_dVb = pParam->B3SOIDDetab ; - } - DIBL_Sft = T3 * pParam->B3SOIDDtheta0vb0 * Vds; - dDIBL_Sft_dVd = pParam->B3SOIDDtheta0vb0 * T3; - dDIBL_Sft_dVb = pParam->B3SOIDDtheta0vb0 * Vds * dT3_dVb; - - Vth = model->B3SOIDDtype * pParam->B3SOIDDvth0 + pParam->B3SOIDDk1 - * (sqrtPhis - sqrtPhi) - pParam->B3SOIDDk2 - * Vbseff- Delt_vth - DeltVthw +(pParam->B3SOIDDk3 + pParam->B3SOIDDk3b - * Vbseff) * tmp2 + DeltVthtemp - DIBL_Sft; - - here->B3SOIDDvon = Vth; - - T6 = pParam->B3SOIDDk3b * tmp2 - pParam->B3SOIDDk2 - + pParam->B3SOIDDkt2 * TempRatio; - dVth_dVb = pParam->B3SOIDDk1 * dsqrtPhis_dVb - - dDelt_vth_dVb - dDeltVthw_dVb - + T6 - dDIBL_Sft_dVb; /* this is actually dVth_dVbseff */ - dVth_dVd = -dDIBL_Sft_dVd; - if (selfheat) dVth_dT = dDeltVthtemp_dT - dDelt_vth_dT - dDeltVthw_dT; - else dVth_dT = 0.0; - -/* Calculate n */ - T2 = pParam->B3SOIDDnfactor * EPSSI / Xdep; - dT2_dVb = - T2 / Xdep * dXdep_dVb; - - T3 = pParam->B3SOIDDcdsc + pParam->B3SOIDDcdscb * Vbseff - + pParam->B3SOIDDcdscd * Vds; - dT3_dVb = pParam->B3SOIDDcdscb; - dT3_dVd = pParam->B3SOIDDcdscd; - - T4 = (T2 + T3 * Theta0 + pParam->B3SOIDDcit) / model->B3SOIDDcox; - dT4_dVb = (dT2_dVb + Theta0 * dT3_dVb + dTheta0_dVb * T3) - / model->B3SOIDDcox; - dT4_dVd = Theta0 * dT3_dVd / model->B3SOIDDcox; - - if (T4 >= -0.5) - { n = 1.0 + T4; - dn_dVb = dT4_dVb; - dn_dVd = dT4_dVd; - } - else - /* avoid discontinuity problems caused by T4 */ - { T0 = 1.0 / (3.0 + 8.0 * T4); - n = (1.0 + 3.0 * T4) * T0; - T0 *= T0; - dn_dVb = T0 * dT4_dVb; - dn_dVd = T0 * dT4_dVd; - } - -/* Effective Vgst (Vgsteff) Calculation */ - - Vgst = Vgs_eff - Vth; - - T10 = 2.0 * n * Vtm; - VgstNVt = Vgst / T10; - ExpArg = (2.0 * pParam->B3SOIDDvoff - Vgst) / T10; - - /* MCJ: Very small Vgst */ - if (VgstNVt > EXP_THRESHOLD) - { Vgsteff = Vgst; - /* T0 is dVgsteff_dVbseff */ - T0 = -dVth_dVb; - dVgsteff_dVg = dVgs_eff_dVg + T0 * dVbseff_dVg; - dVgsteff_dVd = -dVth_dVd + T0 * dVbseff_dVd; - dVgsteff_dVb = T0 * dVbseff_dVb; - dVgsteff_dVe = T0 * dVbseff_dVe; - if (selfheat) - dVgsteff_dT = -dVth_dT + T0 * dVbseff_dT; - else - dVgsteff_dT = 0.0; - } - else if (ExpArg > EXP_THRESHOLD) - { T0 = (Vgst - pParam->B3SOIDDvoff) / (n * Vtm); - ExpVgst = exp(T0); - Vgsteff = Vtm * pParam->B3SOIDDcdep0 / model->B3SOIDDcox * ExpVgst; - T3 = Vgsteff / (n * Vtm) ; - /* T1 is dVgsteff_dVbseff */ - T1 = -T3 * (dVth_dVb + T0 * Vtm * dn_dVb); - dVgsteff_dVg = T3 * dVgs_eff_dVg + T1 * dVbseff_dVg; - dVgsteff_dVd = -T3 * (dVth_dVd + T0 * Vtm * dn_dVd) + T1 * dVbseff_dVd; - dVgsteff_dVe = T1 * dVbseff_dVe; - dVgsteff_dVb = T1 * dVbseff_dVb; - if (selfheat) - dVgsteff_dT = -T3 * (dVth_dT + T0 * dVtm_dT * n) - + Vgsteff / Temp + T1 * dVbseff_dT; - else - dVgsteff_dT = 0.0; - } - else - { ExpVgst = exp(VgstNVt); - T1 = T10 * log(1.0 + ExpVgst); - dT1_dVg = ExpVgst / (1.0 + ExpVgst); - dT1_dVb = -dT1_dVg * (dVth_dVb + Vgst / n * dn_dVb) - + T1 / n * dn_dVb; - dT1_dVd = -dT1_dVg * (dVth_dVd + Vgst / n * dn_dVd) - + T1 / n * dn_dVd; - T3 = (1.0 / Temp); - if (selfheat) - dT1_dT = -dT1_dVg * (dVth_dT + Vgst * T3) + T1 * T3; - else - dT1_dT = 0.0; - - dT2_dVg = -model->B3SOIDDcox / (Vtm * pParam->B3SOIDDcdep0) - * exp(ExpArg); - T2 = 1.0 - T10 * dT2_dVg; - dT2_dVd = -dT2_dVg * (dVth_dVd - 2.0 * Vtm * ExpArg * dn_dVd) - + (T2 - 1.0) / n * dn_dVd; - dT2_dVb = -dT2_dVg * (dVth_dVb - 2.0 * Vtm * ExpArg * dn_dVb) - + (T2 - 1.0) / n * dn_dVb; - if (selfheat) - dT2_dT = -dT2_dVg * (dVth_dT - ExpArg * T10 * T3); - else - dT2_dT = 0.0; - - Vgsteff = T1 / T2; - T3 = T2 * T2; - /* T4 is dVgsteff_dVbseff */ - T4 = (T2 * dT1_dVb - T1 * dT2_dVb) / T3; - dVgsteff_dVb = T4 * dVbseff_dVb; - dVgsteff_dVe = T4 * dVbseff_dVe; - dVgsteff_dVg = (T2 * dT1_dVg - T1 * dT2_dVg) / T3 * dVgs_eff_dVg - + T4 * dVbseff_dVg; - dVgsteff_dVd = (T2 * dT1_dVd - T1 * dT2_dVd) / T3 + T4 * dVbseff_dVd; - if (selfheat) - dVgsteff_dT = (T2 * dT1_dT - T1 * dT2_dT) / T3 + T4 * dVbseff_dT; - else - dVgsteff_dT = 0.0; - } - Vgst2Vtm = Vgsteff + 2.0 * Vtm; - if (selfheat) dVgst2Vtm_dT = 2.0 * dVtm_dT; - else dVgst2Vtm_dT = 0.0; - -/* Calculate Effective Channel Geometry */ - T9 = sqrtPhis - sqrtPhi; - Weff = pParam->B3SOIDDweff - 2.0 * (pParam->B3SOIDDdwg * Vgsteff - + pParam->B3SOIDDdwb * T9); - dWeff_dVg = -2.0 * pParam->B3SOIDDdwg; - dWeff_dVb = -2.0 * pParam->B3SOIDDdwb * dsqrtPhis_dVb; - - if (Weff < 2.0e-8) /* to avoid the discontinuity problem due to Weff*/ - { T0 = 1.0 / (6.0e-8 - 2.0 * Weff); - Weff = 2.0e-8 * (4.0e-8 - Weff) * T0; - T0 *= T0 * 4.0e-16; - dWeff_dVg *= T0; - dWeff_dVb *= T0; - } - - T0 = pParam->B3SOIDDprwg * Vgsteff + pParam->B3SOIDDprwb * T9; - if (T0 >= -0.9) - { Rds = rds0 * (1.0 + T0); - dRds_dVg = rds0 * pParam->B3SOIDDprwg; - dRds_dVb = rds0 * pParam->B3SOIDDprwb * dsqrtPhis_dVb; - if (selfheat) dRds_dT = (1.0 + T0) * drds0_dT; - else dRds_dT = 0.0; - } - else - /* to avoid the discontinuity problem due to prwg and prwb*/ - { T1 = 1.0 / (17.0 + 20.0 * T0); - Rds = rds0 * (0.8 + T0) * T1; - T1 *= T1; - dRds_dVg = rds0 * pParam->B3SOIDDprwg * T1; - dRds_dVb = rds0 * pParam->B3SOIDDprwb * dsqrtPhis_dVb - * T1; - if (selfheat) dRds_dT = (0.8 + T0) * T1 * drds0_dT; - else dRds_dT = 0.0; - } - -/* Calculate Abulk */ - if (pParam->B3SOIDDa0 == 0.0) - { - Abulk0 = Abulk = dAbulk0_dVb = dAbulk_dVg = dAbulk_dVb = 0.0; - } - else - { - T1 = 0.5 * pParam->B3SOIDDk1 / sqrtPhi; - T9 = sqrt(model->B3SOIDDxj * Xdep); - tmp1 = Leff + 2.0 * T9; - T5 = Leff / tmp1; - tmp2 = pParam->B3SOIDDa0 * T5; - tmp3 = pParam->B3SOIDDweff + pParam->B3SOIDDb1; - tmp4 = pParam->B3SOIDDb0 / tmp3; - T2 = tmp2 + tmp4; - dT2_dVb = -T9 * tmp2 / tmp1 / Xdep * dXdep_dVb; - T6 = T5 * T5; - T7 = T5 * T6; - - Abulk0 = T1 * T2; - dAbulk0_dVb = T1 * dT2_dVb; - - T8 = pParam->B3SOIDDags * pParam->B3SOIDDa0 * T7; - dAbulk_dVg = -T1 * T8; - Abulk = Abulk0 + dAbulk_dVg * Vgsteff; - - dAbulk_dVb = dAbulk0_dVb - T8 * Vgsteff * 3.0 * T1 * dT2_dVb - / tmp2; - } - - if (Abulk0 < 0.01) - { - T9 = 1.0 / (3.0 - 200.0 * Abulk0); - Abulk0 = (0.02 - Abulk0) * T9; - dAbulk0_dVb *= T9 * T9; - } - - if (Abulk < 0.01) - { - T9 = 1.0 / (3.0 - 200.0 * Abulk); - Abulk = (0.02 - Abulk) * T9; - dAbulk_dVb *= T9 * T9; - } - - T2 = pParam->B3SOIDDketa * Vbseff; - if (T2 >= -0.9) - { T0 = 1.0 / (1.0 + T2); - dT0_dVb = -pParam->B3SOIDDketa * T0 * T0 ; - } - else - /* added to avoid the problems caused by Keta */ - { T1 = 1.0 / (0.8 + T2); - T0 = (17.0 + 20.0 * T2) * T1; - dT0_dVb = -pParam->B3SOIDDketa * T1 * T1 ; - } - dAbulk_dVg *= T0; - dAbulk_dVb = dAbulk_dVb * T0 + Abulk * dT0_dVb; - dAbulk0_dVb = dAbulk0_dVb * T0 + Abulk0 * dT0_dVb; - Abulk *= T0; - Abulk0 *= T0; - - Abulk += 1; - Abulk0 += 1; - -/* Prepare Abeff */ - T0 = pParam->B3SOIDDabp * Vgst2Vtm; - T1 = 1 - Vcs / T0 - DELT_Xcsat; - T2 = sqrt(T1 * T1 + DELT_Xcsat * DELT_Xcsat); - T3 = 1 - 0.5 * (T1 + T2); - T5 = -0.5 * (1 + T1 / T2); - dT1_dVg = Vcs / Vgst2Vtm / T0; - dT3_dVg = T5 * dT1_dVg; - dT1_dVc = - 1 / T0; - dT3_dVc = T5 * dT1_dVc; - - Xcsat = pParam->B3SOIDDmxc * T3 * T3 + (1 - pParam->B3SOIDDmxc)*T3; - T4 = 2 * pParam->B3SOIDDmxc * T3 + (1 - pParam->B3SOIDDmxc); - dXcsat_dVg = T4 * dT3_dVg; - dXcsat_dVc = T4 * dT3_dVc; - - Abeff = Xcsat * Abulk + (1 - Xcsat) * model->B3SOIDDadice; - T0 = Xcsat * dAbulk_dVg + Abulk * dXcsat_dVg; - dAbeff_dVg = T0 - model->B3SOIDDadice * dXcsat_dVg; - dAbeff_dVb = Xcsat * dAbulk_dVb; - dAbeff_dVc = (Abulk - model->B3SOIDDadice) * dXcsat_dVc; - here->B3SOIDDabeff = Abeff; - -/* Mobility calculation */ - if (model->B3SOIDDmobMod == 1) - { T0 = Vgsteff + Vth + Vth; - T2 = ua + uc * Vbseff; - T3 = T0 / model->B3SOIDDtox; - T5 = T3 * (T2 + ub * T3); - dDenomi_dVg = (T2 + 2.0 * ub * T3) / model->B3SOIDDtox; - dDenomi_dVd = dDenomi_dVg * 2 * dVth_dVd; - dDenomi_dVb = dDenomi_dVg * 2 * dVth_dVb + uc * T3 ; - if (selfheat) - dDenomi_dT = dDenomi_dVg * 2 * dVth_dT - + (dua_dT + Vbseff * duc_dT - + dub_dT * T3 ) * T3; - else - dDenomi_dT = 0.0; - } - else if (model->B3SOIDDmobMod == 2) - { T5 = Vgsteff / model->B3SOIDDtox * (ua - + uc * Vbseff + ub * Vgsteff - / model->B3SOIDDtox); - dDenomi_dVg = (ua + uc * Vbseff - + 2.0 * ub * Vgsteff / model->B3SOIDDtox) - / model->B3SOIDDtox; - dDenomi_dVd = 0.0; - dDenomi_dVb = Vgsteff * uc / model->B3SOIDDtox ; - if (selfheat) - dDenomi_dT = Vgsteff / model->B3SOIDDtox - * (dua_dT + Vbseff * duc_dT + dub_dT - * Vgsteff / model->B3SOIDDtox); - else - dDenomi_dT = 0.0; - } - else /* mobMod == 3 */ - { T0 = Vgsteff + Vth + Vth; - T2 = 1.0 + uc * Vbseff; - T3 = T0 / model->B3SOIDDtox; - T4 = T3 * (ua + ub * T3); - T5 = T4 * T2; - dDenomi_dVg = (ua + 2.0 * ub * T3) * T2 - / model->B3SOIDDtox; - dDenomi_dVd = dDenomi_dVg * 2.0 * dVth_dVd; - dDenomi_dVb = dDenomi_dVg * 2.0 * dVth_dVb - + uc * T4 ; - if (selfheat) - dDenomi_dT = dDenomi_dVg * 2.0 * dVth_dT - + (dua_dT + dub_dT * T3) * T3 * T2 - + T4 * Vbseff * duc_dT; - else - dDenomi_dT = 0.0; - } - - if (T5 >= -0.8) - { Denomi = 1.0 + T5; - } - else /* Added to avoid the discontinuity problem caused by ua and ub*/ - { T9 = 1.0 / (7.0 + 10.0 * T5); - Denomi = (0.6 + T5) * T9; - T9 *= T9; - dDenomi_dVg *= T9; - dDenomi_dVd *= T9; - dDenomi_dVb *= T9; - if (selfheat) dDenomi_dT *= T9; - else dDenomi_dT = 0.0; - } - - here->B3SOIDDueff = ueff = u0temp / Denomi; - T9 = -ueff / Denomi; - dueff_dVg = T9 * dDenomi_dVg; - dueff_dVd = T9 * dDenomi_dVd; - dueff_dVb = T9 * dDenomi_dVb; - if (selfheat) dueff_dT = T9 * dDenomi_dT + du0temp_dT / Denomi; - else dueff_dT = 0.0; - -/* Saturation Drain Voltage Vdsat */ - WVCox = Weff * vsattemp * model->B3SOIDDcox; - WVCoxRds = WVCox * Rds; - -/* dWVCoxRds_dT = WVCox * dRds_dT - + Weff * model->B3SOIDDcox * Rds * dvsattemp_dT; */ - - Esat = 2.0 * vsattemp / ueff; - EsatL = Esat * Leff; - T0 = -EsatL /ueff; - dEsatL_dVg = T0 * dueff_dVg; - dEsatL_dVd = T0 * dueff_dVd; - dEsatL_dVb = T0 * dueff_dVb; - if (selfheat) - dEsatL_dT = T0 * dueff_dT + EsatL / vsattemp * dvsattemp_dT; - else - dEsatL_dT = 0.0; - - /* Sqrt() */ - a1 = pParam->B3SOIDDa1; - if (a1 == 0.0) - { Lambda = pParam->B3SOIDDa2; - dLambda_dVg = 0.0; - } - else if (a1 > 0.0) -/* Added to avoid the discontinuity problem caused by a1 and a2 (Lambda) */ - { T0 = 1.0 - pParam->B3SOIDDa2; - T1 = T0 - pParam->B3SOIDDa1 * Vgsteff - 0.0001; - T2 = sqrt(T1 * T1 + 0.0004 * T0); - Lambda = pParam->B3SOIDDa2 + T0 - 0.5 * (T1 + T2); - dLambda_dVg = 0.5 * pParam->B3SOIDDa1 * (1.0 + T1 / T2); - } - else - { T1 = pParam->B3SOIDDa2 + pParam->B3SOIDDa1 * Vgsteff - 0.0001; - T2 = sqrt(T1 * T1 + 0.0004 * pParam->B3SOIDDa2); - Lambda = 0.5 * (T1 + T2); - dLambda_dVg = 0.5 * pParam->B3SOIDDa1 * (1.0 + T1 / T2); - } - - if (Rds > 0) - { tmp2 = dRds_dVg / Rds + dWeff_dVg / Weff; - tmp3 = dRds_dVb / Rds + dWeff_dVb / Weff; - } - else - { tmp2 = dWeff_dVg / Weff; - tmp3 = dWeff_dVb / Weff; - } - if ((Rds == 0.0) && (Lambda == 1.0)) - { T0 = 1.0 / (Abeff * EsatL + Vgst2Vtm); - tmp1 = 0.0; - T1 = T0 * T0; - T2 = Vgst2Vtm * T0; - T3 = EsatL * Vgst2Vtm; - Vdsat = T3 * T0; - - dT0_dVg = -(Abeff * dEsatL_dVg + EsatL * dAbeff_dVg + 1.0) * T1; - dT0_dVd = -(Abeff * dEsatL_dVd) * T1; - dT0_dVb = -(Abeff * dEsatL_dVb + EsatL * dAbeff_dVb) * T1; - dT0_dVc = -(EsatL * dAbeff_dVc) * T1; - if (selfheat) - dT0_dT = -(Abeff * dEsatL_dT + dVgst2Vtm_dT) * T1; - else dT0_dT = 0.0; - - dVdsat_dVg = T3 * dT0_dVg + T2 * dEsatL_dVg + EsatL * T0; - dVdsat_dVd = T3 * dT0_dVd + T2 * dEsatL_dVd; - dVdsat_dVb = T3 * dT0_dVb + T2 * dEsatL_dVb; - dVdsat_dVc = T3 * dT0_dVc; - if (selfheat) - dVdsat_dT = T3 * dT0_dT + T2 * dEsatL_dT - + EsatL * T0 * dVgst2Vtm_dT; - else dVdsat_dT = 0.0; - } - else - { tmp1 = dLambda_dVg / (Lambda * Lambda); - T9 = Abeff * WVCoxRds; - T8 = Abeff * T9; - T7 = Vgst2Vtm * T9; - T6 = Vgst2Vtm * WVCoxRds; - T0 = 2.0 * Abeff * (T9 - 1.0 + 1.0 / Lambda); - dT0_dVg = 2.0 * (T8 * tmp2 - Abeff * tmp1 - + (2.0 * T9 + 1.0 / Lambda - 1.0) * dAbeff_dVg); -/* dT0_dVb = 2.0 * (T8 * tmp3 this is equivalent to one below, but simpler - + (2.0 * T9 + 1.0 / Lambda - 1.0) * dAbeff_dVg); */ - dT0_dVb = 2.0 * (T8 * (2.0 / Abeff * dAbeff_dVb + tmp3) - + (1.0 / Lambda - 1.0) * dAbeff_dVb); - dT0_dVd = 0.0; - dT0_dVc = 4.0 * T9 * dAbeff_dVc; - - if (selfheat) - { - tmp4 = dRds_dT / Rds + dvsattemp_dT / vsattemp; - dT0_dT = 2.0 * T8 * tmp4; - } else tmp4 = dT0_dT = 0.0; - - T1 = Vgst2Vtm * (2.0 / Lambda - 1.0) + Abeff * EsatL + 3.0 * T7; - - dT1_dVg = (2.0 / Lambda - 1.0) - 2.0 * Vgst2Vtm * tmp1 - + Abeff * dEsatL_dVg + EsatL * dAbeff_dVg + 3.0 * (T9 - + T7 * tmp2 + T6 * dAbeff_dVg); - dT1_dVb = Abeff * dEsatL_dVb + EsatL * dAbeff_dVb - + 3.0 * (T6 * dAbeff_dVb + T7 * tmp3); - dT1_dVd = Abeff * dEsatL_dVd; - dT1_dVc = EsatL * dAbeff_dVc + 3.0 * T6 * dAbeff_dVc; - - if (selfheat) - { - tmp4 += dVgst2Vtm_dT / Vgst2Vtm; - dT1_dT = (2.0 / Lambda - 1.0) * dVgst2Vtm_dT - + Abeff * dEsatL_dT + 3.0 * T7 * tmp4; - } else dT1_dT = 0.0; - - T2 = Vgst2Vtm * (EsatL + 2.0 * T6); - dT2_dVg = EsatL + Vgst2Vtm * dEsatL_dVg - + T6 * (4.0 + 2.0 * Vgst2Vtm * tmp2); - dT2_dVb = Vgst2Vtm * (dEsatL_dVb + 2.0 * T6 * tmp3); - dT2_dVd = Vgst2Vtm * dEsatL_dVd; - if (selfheat) - dT2_dT = Vgst2Vtm * dEsatL_dT + EsatL * dVgst2Vtm_dT - + 2.0 * T6 * (dVgst2Vtm_dT + Vgst2Vtm * tmp4); - else - dT2_dT = 0.0; - - T3 = sqrt(T1 * T1 - 2.0 * T0 * T2); - Vdsat = (T1 - T3) / T0; - - dVdsat_dVg = (dT1_dVg - (T1 * dT1_dVg - dT0_dVg * T2 - - T0 * dT2_dVg) / T3 - Vdsat * dT0_dVg) / T0; - dVdsat_dVb = (dT1_dVb - (T1 * dT1_dVb - dT0_dVb * T2 - - T0 * dT2_dVb) / T3 - Vdsat * dT0_dVb) / T0; - dVdsat_dVd = (dT1_dVd - (T1 * dT1_dVd - T0 * dT2_dVd) / T3) / T0; - dVdsat_dVc = (dT1_dVc - (T1 * dT1_dVc - dT0_dVc * T2) / T3 - - Vdsat * dT0_dVc) / T0; - if (selfheat) - dVdsat_dT = (dT1_dT - (T1 * dT1_dT - dT0_dT * T2 - - T0 * dT2_dT) / T3 - Vdsat * dT0_dT) / T0; - else dVdsat_dT = 0.0; - } - here->B3SOIDDvdsat = Vdsat; - -/* Vdsatii for impact ionization */ - if (pParam->B3SOIDDaii > 0.0) - { - if (pParam->B3SOIDDcii != 0.0) - { - T0 = pParam->B3SOIDDcii / sqrt(3.0) + pParam->B3SOIDDdii; - /* Hard limit Vds to T0 => T4 i.e. limit T0 to 3.0 */ - T1 = Vds - T0 - 0.1; - T2 = sqrt(T1 * T1 + 0.4); - T3 = T0 + 0.5 * (T1 + T2); - dT3_dVd = 0.5 * (1.0 + T1/T2); - - T4 = T3 - pParam->B3SOIDDdii; - T5 = pParam->B3SOIDDcii / T4; - T0 = T5 * T5; - dT0_dVd = - 2 * T0 / T4 * dT3_dVd; - } else - { - T0 = dT0_dVd = 0.0; - } - T0 += 1.0; - - T3 = pParam->B3SOIDDaii + pParam->B3SOIDDbii / Leff; - T4 = 1.0 / (T0 * Vgsteff + T3 * EsatL); - T5 = -T4 * T4; - T6 = Vgsteff * T4; - T7 = EsatL * Vgsteff; - Vdsatii = T7 * T4; - - dT4_dVg = T5 * (T0 + T3 * dEsatL_dVg); - dT4_dVb = T5 * T3 * dEsatL_dVb; - dT4_dVd = T5 * (Vgsteff * dT0_dVd + T3 * dEsatL_dVd); - - if (selfheat) dT4_dT = T5 * (T3 * dEsatL_dT); - else dT4_dT = 0.0; - - T8 = T4 * Vgsteff; - dVdsatii_dVg = T7 * dT4_dVg + T4 * (EsatL + Vgsteff * dEsatL_dVg); - dVdsatii_dVb = T7 * dT4_dVb + T8 * dEsatL_dVb; - dVdsatii_dVd = T7 * dT4_dVd + T8 * dEsatL_dVd; - if (selfheat) dVdsatii_dT = T7 * dT4_dT + T8 * dEsatL_dT; - else dVdsatii_dT = 0.0; - } else - { - Vdsatii = Vdsat; - dVdsatii_dVg = dVdsat_dVg; - dVdsatii_dVb = dVdsat_dVb; - dVdsatii_dVd = dVdsat_dVd; - dVdsatii_dT = dVdsat_dT; - } - -/* Effective Vds (Vdseff) Calculation */ - T1 = Vdsat - Vds - pParam->B3SOIDDdelta; - dT1_dVg = dVdsat_dVg; - dT1_dVd = dVdsat_dVd - 1.0; - dT1_dVb = dVdsat_dVb; - dT1_dVc = dVdsat_dVc; - dT1_dT = dVdsat_dT; - - T2 = sqrt(T1 * T1 + 4.0 * pParam->B3SOIDDdelta * Vdsat); - T0 = T1 / T2; - T3 = 2.0 * pParam->B3SOIDDdelta / T2; - dT2_dVg = T0 * dT1_dVg + T3 * dVdsat_dVg; - dT2_dVd = T0 * dT1_dVd + T3 * dVdsat_dVd; - dT2_dVb = T0 * dT1_dVb + T3 * dVdsat_dVb; - dT2_dVc = T0 * dT1_dVc + T3 * dVdsat_dVc; - if (selfheat) - dT2_dT = T0 * dT1_dT + T3 * dVdsat_dT; - else dT2_dT = 0.0; - - Vdseff = Vdsat - 0.5 * (T1 + T2); - dVdseff_dVg = dVdsat_dVg - 0.5 * (dT1_dVg + dT2_dVg); - dVdseff_dVd = dVdsat_dVd - 0.5 * (dT1_dVd + dT2_dVd); - dVdseff_dVb = dVdsat_dVb - 0.5 * (dT1_dVb + dT2_dVb); - dVdseff_dVc = dVdsat_dVc - 0.5 * (dT1_dVc + dT2_dVc); - if (selfheat) - dVdseff_dT = dVdsat_dT - 0.5 * (dT1_dT + dT2_dT); - else dVdseff_dT = 0.0; - - if (Vdseff > Vds) - Vdseff = Vds; /* This code is added to fixed the problem - caused by computer precision when - Vds is very close to Vdseff. */ - diffVds = Vds - Vdseff; - -/* Effective Vdsii for Iii calculation */ - T1 = Vdsatii - Vds - pParam->B3SOIDDdelta; - - T2 = sqrt(T1 * T1 + 4.0 * pParam->B3SOIDDdelta * Vdsatii); - T0 = T1 / T2; - T3 = 2.0 * pParam->B3SOIDDdelta / T2; - T4 = T0 + T3; - dT2_dVg = T4 * dVdsatii_dVg; - dT2_dVd = T4 * dVdsatii_dVd - T0; - dT2_dVb = T4 * dVdsatii_dVb; - if (selfheat) dT2_dT = T4*dVdsatii_dT; - else dT2_dT = 0.0; - - Vdseffii = Vdsatii - 0.5 * (T1 + T2); - dVdseffii_dVg = 0.5 * (dVdsatii_dVg - dT2_dVg); - dVdseffii_dVd = 0.5 * (dVdsatii_dVd - dT2_dVd + 1.0); - dVdseffii_dVb = 0.5 * (dVdsatii_dVb - dT2_dVb); - if (selfheat) - dVdseffii_dT = 0.5 * (dVdsatii_dT - dT2_dT); - else dVdseffii_dT = 0.0; - diffVdsii = Vds - Vdseffii; - -/* Calculate VAsat */ - tmp4 = 1.0 - 0.5 * Abeff * Vdsat / Vgst2Vtm; - T9 = WVCoxRds * Vgsteff; - T8 = T9 / Vgst2Vtm; - T0 = EsatL + Vdsat + 2.0 * T9 * tmp4; - - T7 = 2.0 * WVCoxRds * tmp4; - dT0_dVg = dEsatL_dVg + dVdsat_dVg + T7 * (1.0 + tmp2 * Vgsteff) - - T8 * (Abeff * dVdsat_dVg - Abeff * Vdsat / Vgst2Vtm - + Vdsat * dAbeff_dVg); - - dT0_dVb = dEsatL_dVb + dVdsat_dVb + T7 * tmp3 * Vgsteff - - T8 * (dAbeff_dVb * Vdsat + Abeff * dVdsat_dVb); - dT0_dVd = dEsatL_dVd + dVdsat_dVd - T8 * Abeff * dVdsat_dVd; - dT0_dVc = dVdsat_dVc - T8 * (Abeff * dVdsat_dVc + Vdsat * dAbeff_dVc); - - if (selfheat) - { - tmp4 = dRds_dT / Rds + dvsattemp_dT / vsattemp; - dT0_dT = dEsatL_dT + dVdsat_dT + T7 * tmp4 * Vgsteff - - T8 * (Abeff * dVdsat_dT - Abeff * Vdsat * dVgst2Vtm_dT - / Vgst2Vtm); - } else - dT0_dT = 0.0; - - T9 = WVCoxRds * Abeff; - T1 = 2.0 / Lambda - 1.0 + T9; - dT1_dVg = -2.0 * tmp1 + WVCoxRds * (Abeff * tmp2 + dAbeff_dVg); - dT1_dVb = dAbeff_dVb * WVCoxRds + T9 * tmp3; - dT1_dVc = dAbeff_dVc * WVCoxRds; - if (selfheat) - dT1_dT = T9 * tmp4; - else - dT1_dT = 0.0; - - Vasat = T0 / T1; - dVasat_dVg = (dT0_dVg - Vasat * dT1_dVg) / T1; - dVasat_dVb = (dT0_dVb - Vasat * dT1_dVb) / T1; - dVasat_dVd = dT0_dVd / T1; - dVasat_dVc = (dT0_dVc - Vasat * dT1_dVc) / T1; - if (selfheat) dVasat_dT = (dT0_dT - Vasat * dT1_dT) / T1; - else dVasat_dT = 0.0; - -/* Calculate VACLM */ - if ((pParam->B3SOIDDpclm > 0.0) && (diffVds > 1.0e-10)) - { T0 = 1.0 / (pParam->B3SOIDDpclm * Abeff * pParam->B3SOIDDlitl); - dT0_dVb = -T0 / Abeff * dAbeff_dVb; - dT0_dVg = -T0 / Abeff * dAbeff_dVg; - dT0_dVc = -T0 / Abeff * dAbeff_dVc; - - T2 = Vgsteff / EsatL; - T1 = Leff * (Abeff + T2); - dT1_dVg = Leff * ((1.0 - T2 * dEsatL_dVg) / EsatL + dAbeff_dVg); - dT1_dVb = Leff * (dAbeff_dVb - T2 * dEsatL_dVb / EsatL); - dT1_dVd = -T2 * dEsatL_dVd / Esat; - dT1_dVc = Leff * dAbeff_dVc; - if (selfheat) dT1_dT = -T2 * dEsatL_dT / Esat; - else dT1_dT = 0.0; - - T9 = T0 * T1; - VACLM = T9 * diffVds; - dVACLM_dVg = T0 * dT1_dVg * diffVds - T9 * dVdseff_dVg - + T1 * diffVds * dT0_dVg; - dVACLM_dVb = (dT0_dVb * T1 + T0 * dT1_dVb) * diffVds - - T9 * dVdseff_dVb; - dVACLM_dVd = T0 * dT1_dVd * diffVds + T9 * (1.0 - dVdseff_dVd); - dVACLM_dVc = (T1 * dT0_dVc + T0 * dT1_dVc) * diffVds - - T9 * dVdseff_dVc; - if (selfheat) - dVACLM_dT = T0 * dT1_dT * diffVds - T9 * dVdseff_dT; - else dVACLM_dT = 0.0; - - } - else - { VACLM = MAX_EXP; - dVACLM_dVd = dVACLM_dVg = dVACLM_dVb = dVACLM_dVc = dVACLM_dT = 0.0; - } - - -/* Calculate VADIBL */ - if (pParam->B3SOIDDthetaRout > 0.0) - { T8 = Abeff * Vdsat; - T0 = Vgst2Vtm * T8; - T1 = Vgst2Vtm + T8; - dT0_dVg = Vgst2Vtm * Abeff * dVdsat_dVg + T8 - + Vgst2Vtm * Vdsat * dAbeff_dVg; - dT1_dVg = 1.0 + Abeff * dVdsat_dVg + Vdsat * dAbeff_dVg; - dT1_dVb = dAbeff_dVb * Vdsat + Abeff * dVdsat_dVb; - dT0_dVb = Vgst2Vtm * dT1_dVb; - dT1_dVd = Abeff * dVdsat_dVd; - dT0_dVd = Vgst2Vtm * dT1_dVd; - dT1_dVc = (Abeff * dVdsat_dVc + Vdsat * dAbeff_dVc); - dT0_dVc = Vgst2Vtm * dT1_dVc; - if (selfheat) - { - dT0_dT = dVgst2Vtm_dT * T8 + Abeff * Vgst2Vtm * dVdsat_dT; - dT1_dT = dVgst2Vtm_dT + Abeff * dVdsat_dT; - } else - dT0_dT = dT1_dT = 0.0; - - T9 = T1 * T1; - T2 = pParam->B3SOIDDthetaRout; - VADIBL = (Vgst2Vtm - T0 / T1) / T2; - dVADIBL_dVg = (1.0 - dT0_dVg / T1 + T0 * dT1_dVg / T9) / T2; - dVADIBL_dVb = (-dT0_dVb / T1 + T0 * dT1_dVb / T9) / T2; - dVADIBL_dVd = (-dT0_dVd / T1 + T0 * dT1_dVd / T9) / T2; - dVADIBL_dVc = (-dT0_dVc / T1 + T0 * dT1_dVc / T9) / T2; - if (selfheat) - dVADIBL_dT = (dVgst2Vtm_dT - dT0_dT/T1 + T0*dT1_dT/T9) / T2; - else dVADIBL_dT = 0.0; - - T7 = pParam->B3SOIDDpdiblb * Vbseff; - if (T7 >= -0.9) - { T3 = 1.0 / (1.0 + T7); - VADIBL *= T3; - dVADIBL_dVg *= T3; - dVADIBL_dVb = (dVADIBL_dVb - VADIBL * pParam->B3SOIDDpdiblb) - * T3; - dVADIBL_dVd *= T3; - dVADIBL_dVc *= T3; - if (selfheat) dVADIBL_dT *= T3; - else dVADIBL_dT = 0.0; - } - else -/* Added to avoid the discontinuity problem caused by pdiblcb */ - { T4 = 1.0 / (0.8 + T7); - T3 = (17.0 + 20.0 * T7) * T4; - dVADIBL_dVg *= T3; - dVADIBL_dVb = dVADIBL_dVb * T3 - - VADIBL * pParam->B3SOIDDpdiblb * T4 * T4; - dVADIBL_dVd *= T3; - dVADIBL_dVc *= T3; - if (selfheat) dVADIBL_dT *= T3; - else dVADIBL_dT = 0.0; - VADIBL *= T3; - } - } - else - { VADIBL = MAX_EXP; - dVADIBL_dVd = dVADIBL_dVg = dVADIBL_dVb = dVADIBL_dVc - = dVADIBL_dT = 0.0; - } - -/* Calculate VA */ - - T8 = pParam->B3SOIDDpvag / EsatL; - T9 = T8 * Vgsteff; - if (T9 > -0.9) - { T0 = 1.0 + T9; - dT0_dVg = T8 * (1.0 - Vgsteff * dEsatL_dVg / EsatL); - dT0_dVb = -T9 * dEsatL_dVb / EsatL; - dT0_dVd = -T9 * dEsatL_dVd / EsatL; - if (selfheat) - dT0_dT = -T9 * dEsatL_dT / EsatL; - else - dT0_dT = 0.0; - } - else /* Added to avoid the discontinuity problems caused by pvag */ - { T1 = 1.0 / (17.0 + 20.0 * T9); - T0 = (0.8 + T9) * T1; - T1 *= T1; - dT0_dVg = T8 * (1.0 - Vgsteff * dEsatL_dVg / EsatL) * T1; - - T9 *= T1 / EsatL; - dT0_dVb = -T9 * dEsatL_dVb; - dT0_dVd = -T9 * dEsatL_dVd; - if (selfheat) - dT0_dT = -T9 * dEsatL_dT; - else - dT0_dT = 0.0; - } - - tmp1 = VACLM * VACLM; - tmp2 = VADIBL * VADIBL; - tmp3 = VACLM + VADIBL; - - T1 = VACLM * VADIBL / tmp3; - tmp3 *= tmp3; - dT1_dVg = (tmp1 * dVADIBL_dVg + tmp2 * dVACLM_dVg) / tmp3; - dT1_dVd = (tmp1 * dVADIBL_dVd + tmp2 * dVACLM_dVd) / tmp3; - dT1_dVb = (tmp1 * dVADIBL_dVb + tmp2 * dVACLM_dVb) / tmp3; - dT1_dVc = (tmp1 * dVADIBL_dVc + tmp2 * dVACLM_dVc) / tmp3; - if (selfheat) - dT1_dT = (tmp1 * dVADIBL_dT + tmp2 * dVACLM_dT ) / tmp3; - else dT1_dT = 0.0; - - Va = Vasat + T0 * T1; - dVa_dVg = dVasat_dVg + T1 * dT0_dVg + T0 * dT1_dVg; - dVa_dVd = dVasat_dVd + T1 * dT0_dVd + T0 * dT1_dVd; - dVa_dVb = dVasat_dVb + T1 * dT0_dVb + T0 * dT1_dVb; - dVa_dVc = dVasat_dVc + T0 * dT1_dVc; - if (selfheat) - dVa_dT = dVasat_dT + T1 * dT0_dT + T0 * dT1_dT; - else dVa_dT = 0.0; - -/* Calculate Ids */ - CoxWovL = model->B3SOIDDcox * Weff / Leff; - beta = ueff * CoxWovL; - dbeta_dVg = CoxWovL * dueff_dVg + beta * dWeff_dVg / Weff; - dbeta_dVd = CoxWovL * dueff_dVd; - dbeta_dVb = CoxWovL * dueff_dVb + beta * dWeff_dVb / Weff; - if (selfheat) dbeta_dT = CoxWovL * dueff_dT; - else dbeta_dT = 0.0; - - T0 = 1.0 - 0.5 * Abeff * Vdseff / Vgst2Vtm; - dT0_dVg = -0.5 * (Abeff * dVdseff_dVg - - Abeff * Vdseff / Vgst2Vtm + Vdseff * dAbeff_dVg) / Vgst2Vtm; - dT0_dVd = -0.5 * Abeff * dVdseff_dVd / Vgst2Vtm; - dT0_dVb = -0.5 * (Abeff * dVdseff_dVb + dAbeff_dVb * Vdseff) - / Vgst2Vtm; - dT0_dVc = -0.5 * (Abeff * dVdseff_dVc + dAbeff_dVc * Vdseff) - / Vgst2Vtm; - if (selfheat) - dT0_dT = -0.5 * (Abeff * dVdseff_dT - - Abeff * Vdseff / Vgst2Vtm * dVgst2Vtm_dT) - / Vgst2Vtm; - else dT0_dT = 0.0; - - fgche1 = Vgsteff * T0; - dfgche1_dVg = Vgsteff * dT0_dVg + T0; - dfgche1_dVd = Vgsteff * dT0_dVd; - dfgche1_dVb = Vgsteff * dT0_dVb; - dfgche1_dVc = Vgsteff * dT0_dVc; - if (selfheat) dfgche1_dT = Vgsteff * dT0_dT; - else dfgche1_dT = 0.0; - - T9 = Vdseff / EsatL; - fgche2 = 1.0 + T9; - dfgche2_dVg = (dVdseff_dVg - T9 * dEsatL_dVg) / EsatL; - dfgche2_dVd = (dVdseff_dVd - T9 * dEsatL_dVd) / EsatL; - dfgche2_dVb = (dVdseff_dVb - T9 * dEsatL_dVb) / EsatL; - dfgche2_dVc = (dVdseff_dVc) / EsatL; - if (selfheat) dfgche2_dT = (dVdseff_dT - T9 * dEsatL_dT) / EsatL; - else dfgche2_dT = 0.0; - - gche = beta * fgche1 / fgche2; - dgche_dVg = (beta * dfgche1_dVg + fgche1 * dbeta_dVg - - gche * dfgche2_dVg) / fgche2; - dgche_dVd = (beta * dfgche1_dVd + fgche1 * dbeta_dVd - - gche * dfgche2_dVd) / fgche2; - dgche_dVb = (beta * dfgche1_dVb + fgche1 * dbeta_dVb - - gche * dfgche2_dVb) / fgche2; - dgche_dVc = (beta * dfgche1_dVc - gche * dfgche2_dVc) / fgche2; - if (selfheat) - dgche_dT = (beta * dfgche1_dT + fgche1 * dbeta_dT - - gche * dfgche2_dT) / fgche2; - else dgche_dT = 0.0; - - T0 = 1.0 + gche * Rds; - T9 = Vdseff / T0; - Idl = gche * T9; - -/* Whoa, these formulas for the derivatives of Idl are convoluted, but I - verified them to be correct */ - - dIdl_dVg = (gche * dVdseff_dVg + T9 * dgche_dVg) / T0 - - Idl * gche / T0 * dRds_dVg ; - dIdl_dVd = (gche * dVdseff_dVd + T9 * dgche_dVd) / T0; - dIdl_dVb = (gche * dVdseff_dVb + T9 * dgche_dVb - - Idl * dRds_dVb * gche) / T0; - dIdl_dVc = (gche * dVdseff_dVc + T9 * dgche_dVc) / T0; - if (selfheat) - dIdl_dT = (gche * dVdseff_dT + T9 * dgche_dT - - Idl * dRds_dT * gche) / T0; - else dIdl_dT = 0.0; - - T9 = diffVds / Va; - T0 = 1.0 + T9; - here->B3SOIDDids = Ids = Idl * T0; - - Gm0 = T0 * dIdl_dVg - Idl * (dVdseff_dVg + T9 * dVa_dVg) / Va; - Gds0 = T0 * dIdl_dVd + Idl * (1.0 - dVdseff_dVd - - T9 * dVa_dVd) / Va; - Gmb0 = T0 * dIdl_dVb - Idl * (dVdseff_dVb + T9 * dVa_dVb) / Va; - Gmc = T0 * dIdl_dVc - Idl * (dVdseff_dVc + T9 * dVa_dVc) / Va; - if (selfheat) - GmT0 = T0 * dIdl_dT - Idl * (dVdseff_dT + T9 * dVa_dT) / Va; - else GmT0 = 0.0; - -/* This includes all dependencies from Vgsteff, Vbseff, Vcs */ - Gm = Gm0 * dVgsteff_dVg + Gmb0 * dVbseff_dVg + Gmc * dVcs_dVg; - Gmb = Gm0 * dVgsteff_dVb + Gmb0 * dVbseff_dVb + Gmc * dVcs_dVb; - Gds = Gm0 * dVgsteff_dVd + Gmb0 * dVbseff_dVd + Gmc * dVcs_dVd + Gds0; - Gme = Gm0 * dVgsteff_dVe + Gmb0 * dVbseff_dVe + Gmc * dVcs_dVe; - if (selfheat) - GmT = Gm0 * dVgsteff_dT + Gmb0 * dVbseff_dT + Gmc * dVcs_dT + GmT0; - else GmT = 0.0; - -/* calculate substrate current Iii */ - T2 = pParam->B3SOIDDalpha1 + pParam->B3SOIDDalpha0 / Leff; - if ((T2 <= 0.0) || (pParam->B3SOIDDbeta0 <= 0.0)) - { Giig = Giib = Giid = Giie = GiiT = 0.0; - here->B3SOIDDiii = Iii = 0.0; - } - else - { - T5 = pParam->B3SOIDDbeta0; - if (diffVdsii > T5 / EXP_THRESHOLD) - { - T0 = -T5 / diffVdsii; - T10 = T0 / diffVdsii; - dT0_dVg = T10 * dVdseffii_dVg; - T1 = T2 * diffVdsii * exp(T0); - - T3 = T1 / diffVdsii * (T0 - 1.0); - dT1_dVg = T1 * (dT0_dVg - dVdseffii_dVg / diffVdsii); - dT1_dVd = -T3 * (1.0 - dVdseffii_dVd); - dT1_dVb = T3 * dVdseffii_dVb; - if (selfheat) dT1_dT = T3 * dVdseffii_dT; - else dT1_dT = 0.0; - } - else - { T3 = T2 * MIN_EXP; - T1 = T3 * diffVdsii; - dT1_dVg = -T3 * dVdseffii_dVg; - dT1_dVd = T3 * (1.0 - dVdseffii_dVd); - dT1_dVb = -T3 * dVdseffii_dVb; - if (selfheat) dT1_dT = -T3 * dVdseffii_dT; - else dT1_dT = 0.0; - } - - here->B3SOIDDiii = Iii = T1 * Ids; - - T2 = T1 * Gm0 + Ids * dT1_dVg; - T3 = T1 * Gds0 + Ids * dT1_dVd; - T4 = T1 * Gmb0 + Ids * dT1_dVb; - T5 = T1 * Gmc; - if (selfheat) T6 = T1 * GmT0 + Ids * dT1_dT; - else T6 = 0.0; - - Giig = T2 * dVgsteff_dVg + T4 * dVbseff_dVg + T5 * dVcs_dVg; - Giib = T2 * dVgsteff_dVb + T4 * dVbseff_dVb + T5 * dVcs_dVb; - Giid = T2 * dVgsteff_dVd + T4 * dVbseff_dVd + T5 * dVcs_dVd + T3; - Giie = T2 * dVgsteff_dVe + T4 * dVbseff_dVe + T5 * dVcs_dVe; - if (selfheat) - GiiT = T2 * dVgsteff_dT + T4 * dVbseff_dT + T5 * dVcs_dT + T6; - else - GiiT = 0.0; - } - -/* calculate GIDL current */ - T0 = 3 * model->B3SOIDDtox; - /* For drain side */ - T1 = (Vds - Vgs_eff - pParam->B3SOIDDngidl) / T0; - if ((pParam->B3SOIDDagidl <= 0.0) || (pParam->B3SOIDDbgidl <= 0.0) || - (T1 <= 0.0)) - { Idgidl = Gdgidld = Gdgidlg = 0.0; - } - else { - dT1_dVd = 1 / T0; - dT1_dVg = - dT1_dVd * dVgs_eff_dVg; - T2 = pParam->B3SOIDDbgidl / T1; - if (T2 < EXP_THRESHOLD) - { - Idgidl = pParam->B3SOIDDweff * pParam->B3SOIDDagidl * T1 * exp(-T2); - T3 = Idgidl / T1 * (T2 + 1); - Gdgidld = T3 * dT1_dVd; - Gdgidlg = T3 * dT1_dVg; - } else - { - T3 = pParam->B3SOIDDweff * pParam->B3SOIDDagidl * MIN_EXP; - Idgidl = T3 * T1 ; - Gdgidld = T3 * dT1_dVd; - Gdgidlg = T3 * dT1_dVg; - } - } - here->B3SOIDDigidl = Idgidl; - - /* For source side */ - T1 = (- Vgs_eff - pParam->B3SOIDDngidl) / T0; - if ((pParam->B3SOIDDagidl <= 0.0) || (pParam->B3SOIDDbgidl <= 0.0) - || (T1 <= 0.0)) - { Isgidl = Gsgidlg = 0; - } - else - { - dT1_dVg = - dVgs_eff_dVg / T0; - T2 = pParam->B3SOIDDbgidl / T1; - if (T2 < EXP_THRESHOLD) - { - Isgidl = pParam->B3SOIDDweff * pParam->B3SOIDDagidl * T1 * exp(-T2); - T3 = Isgidl / T1 * (T2 + 1); - Gsgidlg = T3 * dT1_dVg; - } else - { - T3 = pParam->B3SOIDDweff * pParam->B3SOIDDagidl * MIN_EXP; - Isgidl = T3 * T1 ; - Gsgidlg = T3 * dT1_dVg; - } - } - -/* calculate diode and BJT current */ - - WTsi = pParam->B3SOIDDweff * model->B3SOIDDtsi; - NVtm1 = Vtm * pParam->B3SOIDDndiode; - NVtm2 = Vtm * pParam->B3SOIDDntun; - - /* Create exponents first */ - T0 = Vbs / NVtm1; - if (T0 < 30) - { - ExpVbs1 = exp(T0); - dExpVbs1_dVb = ExpVbs1 / NVtm1; - if (selfheat) dExpVbs1_dT = - T0 * ExpVbs1 / Temp; - } else - { - T1 = 1.0686e13; /* exp(30) */ - dExpVbs1_dVb = T1 / NVtm1; - ExpVbs1 = dExpVbs1_dVb * Vbs - 29.0 * T1; - if (selfheat) dExpVbs1_dT = - dExpVbs1_dVb * Vbs / Temp; - } - - T0 = Vbd / NVtm1; - if (T0 < 30) - { - ExpVbd1 = exp(T0); - dExpVbd1_dVb = ExpVbd1 / NVtm1; - if (selfheat) dExpVbd1_dT = - T0 * ExpVbd1 / Temp; - } else - { - T1 = 1.0686e13; /* exp(30) */ - dExpVbd1_dVb = T1 / NVtm1; - ExpVbd1 = dExpVbd1_dVb * Vbd - 29.0 * T1; - if (selfheat) dExpVbd1_dT = - dExpVbd1_dVb * Vbd / Temp; - } - - if (jtun > 0.0) - { - T0 = -Vbs / NVtm2; - if (T0 < 30) - { - ExpVbs4 = exp(T0); - dExpVbs4_dVb = - ExpVbs4 / NVtm2; - if (selfheat) dExpVbs4_dT = - T0 * ExpVbs4 / Temp; - } else - { - T1 = 1.0686e13; /* exp(30) */ - dExpVbs4_dVb = - T1 / NVtm2; - ExpVbs4 = dExpVbs4_dVb * Vbs - 29.0 * T1; - if (selfheat) dExpVbs4_dT = - dExpVbs4_dVb * Vbs / Temp; - } - - T0 = -Vbd / NVtm2; - if (T0 < 30) - { - ExpVbd4 = exp(T0); - dExpVbd4_dVb = - ExpVbd4 / NVtm2; - if (selfheat) dExpVbd4_dT = - T0 * ExpVbd4 / Temp; - } else - { - T1 = 1.0686e13; /* exp(30) */ - dExpVbd4_dVb = - T1 / NVtm2; - ExpVbd4 = dExpVbd4_dVb * Vbd - 29.0 * T1; - if (selfheat) dExpVbd4_dT = - dExpVbd4_dVb * Vbd / Temp; - } - } - - /* Ibs1 / Ibd1 */ - if (jdif == 0.0) - { - Ibs1 = dIbs1_dVb = dIbs1_dT = 0.0; - Ibd1 = dIbd1_dVd = dIbd1_dVb = dIbd1_dT = 0.0; - } - else - { - T5 = WTsi * jdif; - Ibs1 = T5 * (ExpVbs1 - 1.0); - dIbs1_dVb = T5 * dExpVbs1_dVb; - if (selfheat) - dIbs1_dT = Ibs1 / jdif * djdif_dT + T5 * dExpVbs1_dT; - - Ibd1 = T5 * (ExpVbd1 - 1.0); - dIbd1_dVb = T5 * dExpVbd1_dVb; - dIbd1_dVd = -dIbd1_dVb; - if (selfheat) - dIbd1_dT = Ibd1 / jdif * djdif_dT + T5 * dExpVbd1_dT; - } - - /* Ibs2 */ - if (jrec == 0.0) - { - Ibs2 = dIbs2_dVb = dIbs2_dT = 0.0; - Ibd2 = dIbd2_dVb = dIbd2_dVd = dIbd2_dT = 0.0; - } - else - { - ExpVbs2 = sqrt(ExpVbs1); - if (ExpVbs2 > 1e-20) - { - dExpVbs2_dVb = 0.5 / ExpVbs2 * dExpVbs1_dVb; - if (selfheat) dExpVbs2_dT = 0.5 / ExpVbs2 * dExpVbs1_dT; - } - else - { - dExpVbs2_dVb = dExpVbs2_dT = 0.0; - } - - ExpVbd2 = sqrt(ExpVbd1); - if (ExpVbd2 > 1e-20) - { - dExpVbd2_dVb = 0.5 / ExpVbd2 * dExpVbd1_dVb; - if (selfheat) dExpVbd2_dT = 0.5 / ExpVbd2 * dExpVbd1_dT; - } - else - { - dExpVbd2_dVb = dExpVbd2_dT = 0.0; - } - - T8 = WTsi * jrec; - T9 = 0.5 * T8 / NVtm1; - Ibs2 = T8 * (ExpVbs2 - 1.0); - dIbs2_dVb = T8 * dExpVbs2_dVb; - if (selfheat) - dIbs2_dT = Ibs2 / jrec * djrec_dT + T8 * dExpVbs2_dT; - - T8 = WTsi * jrec; - T9 = 0.5 * T8 / NVtm1; - Ibd2 = T8 * (ExpVbd2 - 1.0); - dIbd2_dVb = T8 * dExpVbd2_dVb; - dIbd2_dVd = -dIbd2_dVb; - if (selfheat) - dIbd2_dT = Ibd2 / jrec * djrec_dT + T8 * dExpVbd2_dT; - } - - /* Ibjt */ - if ((here->B3SOIDDbjtoff == 1) || (Vds == 0.0) || - (jbjt == 0.0)) - { - Ibs3 = dIbs3_dVb = dIbs3_dVd = dIbs3_dT = 0.0; - Ibd3 = dIbd3_dVb = dIbd3_dVd = dIbd3_dT = 0.0; - here->B3SOIDDic = Ic = Gcd = Gcb = GcT = 0.0; - } - else { - T0 = Leff - pParam->B3SOIDDkbjt1 * Vds; - T1 = T0 / pParam->B3SOIDDedl; - dT1_dVd = - pParam->B3SOIDDkbjt1 / pParam->B3SOIDDedl; - if (T1 < 1e-3) /* Limit to 1/2e4 */ - { T2 = 1.0 / (3.0 - 2.0e3 * T1); - T1 = (2.0e-3 - T1) * T2; - dT1_dVd *= T2 * T2; - } else if (T1 > 1.0) - { T1 = 1.0; - dT1_dVd = 0.0; - } - BjtA = 1 - 0.5 * T1 * T1; - dBjtA_dVd = - T1 * dT1_dVd; - - T5 = WTsi * jbjt; - Ibjt = T5 * (ExpVbs1 - ExpVbd1); - dIbjt_dVb = T5 * (dExpVbs1_dVb - dExpVbd1_dVb); - dIbjt_dVd = T5 * dExpVbd1_dVb; - if (selfheat) - dIbjt_dT = T5 * (dExpVbs1_dT - dExpVbd1_dT) - + Ibjt / jbjt * djbjt_dT; - - T3 = (1.0 - BjtA) * T5; - T4 = - T5 * dBjtA_dVd; - Ibs3 = T3 * ExpVbs1; - dIbs3_dVb = T3 * dExpVbs1_dVb; - dIbs3_dVd = T4 * ExpVbs1; - if (selfheat) dIbs3_dT = Ibs3 / jbjt * djbjt_dT + T3 * dExpVbs1_dT; - - Ibd3 = T3 * ExpVbd1; - dIbd3_dVb = T3 * dExpVbd1_dVb; - dIbd3_dVd = T4 * ExpVbd1 - dIbd3_dVb; - if (selfheat) dIbd3_dT = Ibd3 / jbjt * djbjt_dT + T3 * dExpVbd1_dT; - - here->B3SOIDDic = Ic = Ibjt - Ibs3 + Ibd3; - Gcd = dIbjt_dVd - dIbs3_dVd + dIbd3_dVd; - Gcb = dIbjt_dVb - dIbs3_dVb + dIbd3_dVb; - if (selfheat) GcT = dIbjt_dT - dIbs3_dT + dIbd3_dT; - else GcT = 0.0; - } - - if (jtun == 0.0) - { - Ibs4 = dIbs4_dVb = dIbs4_dT = 0.0; - Ibd4 = dIbd4_dVb = dIbd4_dVd = dIbd4_dT = 0.0; - } - else - { - T5 = WTsi * jtun; - Ibs4 = T5 * (1.0 - ExpVbs4); - dIbs4_dVb = - T5 * dExpVbs4_dVb; - if (selfheat) - dIbs4_dT = Ibs4 / jtun * djtun_dT - T5 * dExpVbs4_dT; - - Ibd4 = T5 * (1.0 - ExpVbd4); - dIbd4_dVb = - T5 * dExpVbd4_dVb; - dIbd4_dVd = -dIbd4_dVb; - if (selfheat) - dIbd4_dT = Ibd4 / jtun * djtun_dT - T5 * dExpVbd4_dT; - } - -here->B3SOIDDdum1 = Ibs3 + Ibd4; -here->B3SOIDDdum2 = Ibs1; -here->B3SOIDDdum3 = Ibjt; -here->B3SOIDDdum4 = Ic; - - here->B3SOIDDitun = - Ibd3 - Ibd4; - here->B3SOIDDibs = Ibs = Ibs1 + Ibs2 + Ibs3 + Ibs4; - here->B3SOIDDibd = Ibd = Ibd1 + Ibd2 + Ibd3 + Ibd4; - - Gjsb = dIbs1_dVb + dIbs2_dVb + dIbs3_dVb + dIbs4_dVb; - Gjsd = dIbs3_dVd; - if (selfheat) GjsT = dIbs1_dT + dIbs2_dT + dIbs3_dT + dIbs4_dT; - else GjsT = 0.0; - - Gjdb = dIbd1_dVb + dIbd2_dVb + dIbd3_dVb + dIbd4_dVb; - Gjdd = dIbd1_dVd + dIbd2_dVd + dIbd3_dVd + dIbd4_dVd; - if (selfheat) GjdT = dIbd1_dT + dIbd2_dT + dIbd3_dT + dIbd4_dT; - else GjdT = 0.0; - - - /* Current through body resistor */ - /* Current going out is +ve */ - if ((here->B3SOIDDbodyMod == 0) || (here->B3SOIDDbodyMod == 2)) - { - Ibp = Gbpbs = Gbpgs = Gbpds = Gbpes = Gbpps = GbpT = 0.0; - } - else { /* here->B3SOIDDbodyMod == 1 */ - if (pParam->B3SOIDDrbody < 1e-30) - { - if (here->B3SOIDDrbodyext <= 1e-30) - T0 = 1.0 / 1e-30; - else - T0 = 1.0 / here->B3SOIDDrbodyext; - Ibp = Vbp * T0; - Gbpbs = T0 * dVbp_dVb; - Gbpps = T0 * dVbp_dVp; - Gbpgs = T0 * dVbp_dVg; - Gbpds = T0 * dVbp_dVd; - Gbpes = 0.0; - if (selfheat) GbpT = T0 * dVbp_dT; - else GbpT = 0.0; - } else - { T0 = 1.0 / pParam->B3SOIDDrbody; - if (Vbp >= 0.0) - { - T1 = sqrt(Vcs); - T3 = T1 * T0; - T5 = 1.0 + here->B3SOIDDrbodyext * T3; - T6 = T3 / T5; - T2 = 0.5 * T0 / T1; - T7 = T2 / (T5 * T5); - Ibp = Vbp * T6; - - /* Whoa, again these derivatives are convoluted, but correct */ - - Gbpbs = T6 * dVbp_dVb + Vbp * T7 * dVcs_dVb; - Gbpps = T6 * dVbp_dVp; - Gbpgs = T6 * dVbp_dVg + Vbp * T7 * dVcs_dVg; - Gbpds = T6 * dVbp_dVg + Vbp * T7 * dVcs_dVd; - Gbpes = T6 * dVbp_dVg + Vbp * T7 * dVcs_dVe; - if (selfheat) - GbpT = T6 * dVbp_dT + Vbp * T7 * dVcs_dT; - else GbpT = 0.0; - - } else - { - T1 = sqrt(Vpsdio - Vbs0eff); - T3 = T1 * T0; - T5 = 1.0 + here->B3SOIDDrbodyext * T3; - T6 = T3 / T5; - T2 = 0.5 * T0 / T1; - Ibp = Vbp * T6; - T7 = T2 / (T5 * T5); - Gbpbs = T6 * dVbp_dVb; - Gbpps = T6 * dVbp_dVp + Vbp * T7 * dVpsdio_dVp; - Gbpgs = Vbp * T7 * (dVpsdio_dVg - dVbs0eff_dVg); - Gbpds = Vbp * T7 * (dVpsdio_dVd - dVbs0eff_dVd); - Gbpes = Vbp * T7 * (dVpsdio_dVe - dVbs0eff_dVe); - if (selfheat) - GbpT = Vbp * T7 * (dVpsdio_dT - dVbs0eff_dT); - else GbpT = 0.0; - } - } - } - - here->B3SOIDDibp = Ibp; - here->B3SOIDDgbpbs = Gbpbs; - here->B3SOIDDgbpgs = Gbpgs; - here->B3SOIDDgbpds = Gbpds; - here->B3SOIDDgbpes = Gbpes; - here->B3SOIDDgbpps = Gbpps; - if (selfheat) - here->B3SOIDDgbpT = GbpT; - else { - GbpT = 0.0; - here->B3SOIDDgbpT = 0.0; - } - here->B3SOIDDcbodcon = Ibp - (Gbpbs * Vbs + Gbpgs * Vgs - + Gbpds * Vds + Gbpes * Ves + Gbpps * Vps - + GbpT * delTemp); - - /* Current going out of drainprime node into the drain of device */ - /* "node" means the SPICE circuit node */ - - here->B3SOIDDcdrain = Ids + Ic; - here->B3SOIDDcd = Ids + Ic - Ibd + Iii + Idgidl; - here->B3SOIDDcb = Ibs + Ibd + Ibp - Iii - Idgidl - Isgidl; - - here->B3SOIDDgds = Gds + Gcd; - here->B3SOIDDgm = Gm; - here->B3SOIDDgmbs = Gmb + Gcb; - here->B3SOIDDgme = Gme; - if (selfheat) - here->B3SOIDDgmT = GmT + GcT; - else - here->B3SOIDDgmT = 0.0; - - /* note that sign is switched because power flows out - of device into the temperature node. - Currently ommit self-heating due to bipolar current - because it can cause convergence problem*/ - - here->B3SOIDDgtempg = -Gm * Vds; - here->B3SOIDDgtempb = -Gmb * Vds; - here->B3SOIDDgtempe = -Gme * Vds; - here->B3SOIDDgtempT = -GmT * Vds; - here->B3SOIDDgtempd = -Gds * Vds - Ids; - here->B3SOIDDcth = - Ids * Vds - model->B3SOIDDtype * - (here->B3SOIDDgtempg * Vgs + here->B3SOIDDgtempb * Vbs - + here->B3SOIDDgtempe * Ves + here->B3SOIDDgtempd * Vds) - - here->B3SOIDDgtempT * delTemp; - - /* Body current which flows into drainprime node from the drain of device */ - - here->B3SOIDDgjdb = Gjdb - Giib; - here->B3SOIDDgjdd = Gjdd - (Giid + Gdgidld); - here->B3SOIDDgjdg = - (Giig + Gdgidlg); - here->B3SOIDDgjde = - Giie; - if (selfheat) here->B3SOIDDgjdT = GjdT - GiiT; - else here->B3SOIDDgjdT = 0.0; - here->B3SOIDDcjd = Ibd - Iii - Idgidl - here->B3SOIDDminIsub/2 - - (here->B3SOIDDgjdb * Vbs + here->B3SOIDDgjdd * Vds - + here->B3SOIDDgjdg * Vgs + here->B3SOIDDgjde * Ves - + here->B3SOIDDgjdT * delTemp); - - /* Body current which flows into sourceprime node from the source of device */ - - here->B3SOIDDgjsb = Gjsb; - here->B3SOIDDgjsd = Gjsd; - here->B3SOIDDgjsg = - Gsgidlg; - if (selfheat) here->B3SOIDDgjsT = GjsT; - else here->B3SOIDDgjsT = 0.0; - here->B3SOIDDcjs = Ibs - Isgidl - here->B3SOIDDminIsub/2 - - (here->B3SOIDDgjsb * Vbs + here->B3SOIDDgjsd * Vds - + here->B3SOIDDgjsg * Vgs + here->B3SOIDDgjsT * delTemp); - - /* Current flowing into body node */ - - here->B3SOIDDgbbs = Giib - Gjsb - Gjdb - Gbpbs; - here->B3SOIDDgbgs = Giig + Gdgidlg + Gsgidlg - Gbpgs; - here->B3SOIDDgbds = Giid + Gdgidld - Gjsd - Gjdd - Gbpds; - here->B3SOIDDgbes = Giie - Gbpes; - here->B3SOIDDgbps = - Gbpps; - if (selfheat) here->B3SOIDDgbT = GiiT - GjsT - GjdT - GbpT; - else here->B3SOIDDgbT = 0.0; - here->B3SOIDDcbody = Iii + Idgidl + Isgidl - Ibs - Ibd - Ibp + here->B3SOIDDminIsub - - (here->B3SOIDDgbbs * Vbs + here->B3SOIDDgbgs * Vgs - + here->B3SOIDDgbds * Vds + here->B3SOIDDgbps * Vps - + here->B3SOIDDgbes * Ves + here->B3SOIDDgbT * delTemp); - - /* Calculate Qinv for Noise analysis */ - - T1 = Vgsteff * (1.0 - 0.5 * Abeff * Vdseff / Vgst2Vtm); - here->B3SOIDDqinv = -model->B3SOIDDcox * pParam->B3SOIDDweff * Leff * T1; - - /* Begin CV (charge) model */ - - if ((model->B3SOIDDxpart < 0) || (!ChargeComputationNeeded)) - { qgate = qdrn = qsrc = qbody = 0.0; - here->B3SOIDDcggb = here->B3SOIDDcgsb = here->B3SOIDDcgdb = 0.0; - here->B3SOIDDcdgb = here->B3SOIDDcdsb = here->B3SOIDDcddb = 0.0; - here->B3SOIDDcbgb = here->B3SOIDDcbsb = here->B3SOIDDcbdb = 0.0; - goto finished; - } - else - { - CoxWL = model->B3SOIDDcox * pParam->B3SOIDDweffCV - * pParam->B3SOIDDleffCV; - - /* By using this Vgsteff,cv, discontinuity in moderate - inversion charges can be avoid. However, in capMod=3, - Vdsat from IV is used. The dVdsat_dVg is referred to - the IV Vgsteff and therefore induces error in the charges - derivatives. Fortunately, Vgsteff,iv and Vgsteff,cv are - different only in subthreshold where Qsubs is neglectible. - So the errors in derivatives is not a serious problem */ - - if ((VgstNVt > -EXP_THRESHOLD) && (VgstNVt < EXP_THRESHOLD)) - { ExpVgst *= ExpVgst; - Vgsteff = n * Vtm * log(1.0 + ExpVgst); - T0 = ExpVgst / (1.0 + ExpVgst); - T1 = -T0 * (dVth_dVb + Vgst / n * dn_dVb) + Vgsteff / n * dn_dVb; - dVgsteff_dVd = -T0 * (dVth_dVd + Vgst / n * dn_dVd) - + Vgsteff / n * dn_dVd + T1 * dVbseff_dVd; - dVgsteff_dVg = T0 * dVgs_eff_dVg + T1 * dVbseff_dVg; - dVgsteff_dVb = T1 * dVbseff_dVb; - dVgsteff_dVe = T1 * dVbseff_dVe; - if (selfheat) - dVgsteff_dT = -T0 * (dVth_dT + Vgst / Temp) + Vgsteff / Temp - + T1 * dVbseff_dT; - else dVgsteff_dT = 0.0; - } - - Vfb = Vth - phi - pParam->B3SOIDDk1 * sqrtPhis; - - dVfb_dVb = dVth_dVb - pParam->B3SOIDDk1 * dsqrtPhis_dVb; - dVfb_dVd = dVth_dVd; - dVfb_dT = dVth_dT; - - if ((model->B3SOIDDcapMod == 2) || (model->B3SOIDDcapMod == 3)) - { - /* Necessary because charge behaviour very strange at - Vgsteff = 0 */ - Vgsteff += 1e-4; - - /* Something common in capMod 2 and 3 */ - V3 = Vfb - Vgs_eff + Vbseff - DELTA_3; - if (Vfb <= 0.0) - { T0 = sqrt(V3 * V3 - 4.0 * DELTA_3 * Vfb); - T2 = -DELTA_3 / T0; - } - else - { T0 = sqrt(V3 * V3 + 4.0 * DELTA_3 * Vfb); - T2 = DELTA_3 / T0; - } - - T1 = 0.5 * (1.0 + V3 / T0); - Vfbeff = Vfb - 0.5 * (V3 + T0); - dVfbeff_dVd = (1.0 - T1 - T2) * dVfb_dVd; - dVfbeff_dVb = (1.0 - T1 - T2) * dVfb_dVb - T1; - dVfbeff_dVrg = T1 * dVgs_eff_dVg; - if (selfheat) dVfbeff_dT = (1.0 - T1 - T2) * dVfb_dT; - else dVfbeff_dT = 0.0; - - Qac0 = -CoxWL * (Vfbeff - Vfb); - dQac0_dVrg = -CoxWL * dVfbeff_dVrg; - dQac0_dVd = -CoxWL * (dVfbeff_dVd - dVfb_dVd); - dQac0_dVb = -CoxWL * (dVfbeff_dVb - dVfb_dVb); - if (selfheat) dQac0_dT = -CoxWL * (dVfbeff_dT - dVfb_dT); - else dQac0_dT = 0.0; - - T0 = 0.5 * K1; - T3 = Vgs_eff - Vfbeff - Vbseff - Vgsteff; - if (pParam->B3SOIDDk1 == 0.0) - { T1 = 0.0; - T2 = 0.0; - } - else if (T3 < 0.0) - { T1 = T0 + T3 / pParam->B3SOIDDk1; - T2 = CoxWL; - } - else - { T1 = sqrt(T0 * T0 + T3); - T2 = CoxWL * T0 / T1; - } - - Qsub0 = CoxWL * K1 * (T0 - T1); - - dQsub0_dVrg = T2 * (dVfbeff_dVrg - dVgs_eff_dVg); - dQsub0_dVg = T2; - dQsub0_dVd = T2 * dVfbeff_dVd; - dQsub0_dVb = T2 * (dVfbeff_dVb + 1); - if (selfheat) dQsub0_dT = T2 * dVfbeff_dT; - else dQsub0_dT = 0.0; - - One_Third_CoxWL = CoxWL / 3.0; - Two_Third_CoxWL = 2.0 * One_Third_CoxWL; - AbulkCV = Abulk0 * pParam->B3SOIDDabulkCVfactor; - dAbulkCV_dVb = pParam->B3SOIDDabulkCVfactor * dAbulk0_dVb; - - /* This is actually capMod=2 calculation */ - VdsatCV = Vgsteff / AbulkCV; - dVdsatCV_dVg = 1.0 / AbulkCV; - dVdsatCV_dVb = -VdsatCV * dAbulkCV_dVb / AbulkCV; - VdsatCV += 1e-5; - - V4 = VdsatCV - Vds - DELTA_4; - T0 = sqrt(V4 * V4 + 4.0 * DELTA_4 * VdsatCV); - VdseffCV = VdsatCV - 0.5 * (V4 + T0); - T1 = 0.5 * (1.0 + V4 / T0); - T2 = DELTA_4 / T0; - T3 = (1.0 - T1 - T2) / AbulkCV; - dVdseffCV_dVg = T3; - dVdseffCV_dVd = T1; - dVdseffCV_dVb = -T3 * VdsatCV * dAbulkCV_dVb; - - if (model->B3SOIDDcapMod == 2) - { - /* VdsCV Make it compatible with capMod 3 */ - VdsCV = VdseffCV; - dVdsCV_dVg = dVdseffCV_dVg; - dVdsCV_dVd = dVdseffCV_dVd; - dVdsCV_dVb = dVdseffCV_dVb; - dVdsCV_dVc = 0.0; - - /* This is good for Xc calculation */ - VdsCV += 1e-5; - if (VdsCV > (VdsatCV-1e-7)) VdsCV=VdsatCV-1e-7; - - /* VcsCV calculation */ - T1 = VdsCV - Vcs - VdsCV * VdsCV * DELTA_Vcscv; - T5 = 2 * DELTA_Vcscv; - T2 = sqrt(T1 * T1 + T5 * VdsCV * VdsCV); - - dT1_dVb = dVdsCV_dVb * (1.0 - 2.0 * VdsCV * DELTA_Vcscv); - dT2_dVb = (T1 * dT1_dVb + T5 * VdsCV * dVdsCV_dVb)/T2; - - dT1_dVd = dVdsCV_dVd * (1.0 - 2.0 * VdsCV * DELTA_Vcscv); - dT2_dVd = (T1 * dT1_dVd + T5 * VdsCV * dVdsCV_dVd)/ T2; - - dT1_dVg = dVdsCV_dVg * (1.0 - 2.0 * VdsCV * DELTA_Vcscv) ; - dT2_dVg = (T1 * dT1_dVg + T5 * VdsCV * dVdsCV_dVg)/T2; - - dT1_dVc = -1; - dT2_dVc = T1 * dT1_dVc / T2; - - VcsCV = Vcs + 0.5 * (T1 - T2); - - dVcsCV_dVb = 0.5 * (dT1_dVb - dT2_dVb); - dVcsCV_dVg = 0.5 * (dT1_dVg - dT2_dVg); - dVcsCV_dVd = 0.5 * (dT1_dVd - dT2_dVd); - dVcsCV_dVc = 1.0 + 0.5 * (dT1_dVc - dT2_dVc); - - if (VcsCV < 0.0) VcsCV = 0.0; - else if (VcsCV > VdsCV) VcsCV = VdsCV; - - /* Xc calculation */ - T3 = 2 * VdsatCV - VcsCV; - T4 = 2 * VdsatCV - VdsCV; - dT4_dVg = 2 * dVdsatCV_dVg - dVdsCV_dVg; - dT4_dVd = - dVdsCV_dVd; - dT4_dVb = 2 * dVdsatCV_dVb - dVdsCV_dVb; - T0 = T3 * VcsCV; - T1 = T4 * VdsCV; - Xc = T0 / T1; - - dT0_dVb = VcsCV * (2 * dVdsatCV_dVb - dVcsCV_dVb) + - T3 * dVcsCV_dVb; - dT0_dVg = VcsCV * (2 * dVdsatCV_dVg - dVcsCV_dVg) + - T3 * dVcsCV_dVg; - dT0_dVd = 2 * dVcsCV_dVd * (VdsatCV - VcsCV); - dT0_dVc = 2 * dVcsCV_dVc * (VdsatCV - VcsCV); - - dT1_dVb = VdsCV * dT4_dVb + T4 * dVdsCV_dVb; - dT1_dVg = VdsCV * dT4_dVg + T4 * dVdsCV_dVg; - dT1_dVd = dVdsCV_dVd * T4 + VdsCV * dT4_dVd; - T3 = T1 * T1; - - dXc_dVb = (dT0_dVb - dT1_dVb * Xc) / T1; - dXc_dVg = (dT0_dVg - dT1_dVg * Xc) / T1; - dXc_dVd = (dT0_dVd - dT1_dVd * Xc) / T1; - dXc_dVc = dT0_dVc / T1; - - T0 = AbulkCV * VcsCV; - dT0_dVb = dAbulkCV_dVb * VcsCV + dVcsCV_dVb * AbulkCV; - dT0_dVg = dVcsCV_dVg * AbulkCV; - dT0_dVd = AbulkCV * dVcsCV_dVd; - dT0_dVc = AbulkCV * dVcsCV_dVc; - - T1 = 12.0 * (Vgsteff - 0.5 * T0 + 1e-20); - dT1_dVb = -6.0 * dT0_dVb; - dT1_dVg = 12.0 * (1.0 - 0.5 * dT0_dVg); - dT1_dVd = -6.0 * dT0_dVd; - dT1_dVc = -6.0 * dT0_dVc; - - T2 = VcsCV / T1; - T4 = T1 * T1; - dT2_dVb = ( dVcsCV_dVb * T1 - dT1_dVb * VcsCV ) / T4; - dT2_dVg = ( dVcsCV_dVg * T1 - dT1_dVg * VcsCV ) / T4; - dT2_dVd = ( dVcsCV_dVd * T1 - dT1_dVd * VcsCV ) / T4; - dT2_dVc = ( dVcsCV_dVc * T1 - dT1_dVc * VcsCV ) / T4; - - T3 = T0 * T2; - dT3_dVb = dT0_dVb * T2 + dT2_dVb * T0; - dT3_dVg = dT0_dVg * T2 + dT2_dVg * T0; - dT3_dVd = dT0_dVd * T2 + dT2_dVd * T0; - dT3_dVc = dT0_dVc * T2 + dT2_dVc * T0; - - T4 = 1.0 - AbulkCV; - dT4_dVb = - dAbulkCV_dVb; - - T5 = 0.5 * VcsCV - T3; - dT5_dVb = 0.5 * dVcsCV_dVb - dT3_dVb; - dT5_dVg = 0.5 * dVcsCV_dVg - dT3_dVg; - dT5_dVd = 0.5 * dVcsCV_dVd - dT3_dVd; - dT5_dVc = 0.5 * dVcsCV_dVc - dT3_dVc; - - T6 = T4 * T5 * CoxWL; - T7 = CoxWL * Xc; - - Qsubs1 = CoxWL * Xc * T4 * T5; - dQsubs1_dVb = T6 * dXc_dVb + T7 * ( T4*dT5_dVb + dT4_dVb*T5 ); - dQsubs1_dVg = T6 * dXc_dVg + T7 * T4 * dT5_dVg; - dQsubs1_dVd = T6 * dXc_dVd + T7 * T4 * dT5_dVd; - dQsubs1_dVc = T6 * dXc_dVc + T7 * T4 * dT5_dVc; - - Qsubs2 = -CoxWL * (1-Xc) * (AbulkCV - 1.0) * Vcs; - - T2 = CoxWL * (AbulkCV - 1.0) * Vcs; - dQsubs2_dVb = T2 * dXc_dVb - CoxWL * (1-Xc) * Vcs * dAbulkCV_dVb; - dQsubs2_dVg = T2 * dXc_dVg; - dQsubs2_dVd = T2 * dXc_dVd; - dQsubs2_dVc = T2 * dXc_dVc - CoxWL * (1-Xc) * (AbulkCV - 1.0); - - Qbf = Qac0 + Qsub0 + Qsubs1 + Qsubs2; - dQbf_dVrg = dQac0_dVrg + dQsub0_dVrg; - dQbf_dVg = dQsub0_dVg + dQsubs1_dVg + dQsubs2_dVg; - dQbf_dVd = dQac0_dVd + dQsub0_dVd + dQsubs1_dVd - + dQsubs2_dVd; - dQbf_dVb = dQac0_dVb + dQsub0_dVb + dQsubs1_dVb - + dQsubs2_dVb; - dQbf_dVc = dQsubs1_dVc + dQsubs2_dVc; - dQbf_dVe = 0.0; - if (selfheat) dQbf_dT = dQac0_dT + dQsub0_dT; - else dQbf_dT = 0.0; - } /* End of if (capMod == 2) */ - else if (model->B3SOIDDcapMod == 3) - { - /* Front gate strong inversion depletion charge */ - /* VdssatCV calculation */ - - T1 = Vgsteff + K1*sqrtPhis + 0.5*K1*K1; - T2 = Vgsteff + K1*sqrtPhis + Phis + 0.25*K1*K1; - - dT1_dVb = K1*dsqrtPhis_dVb; - dT2_dVb = dT1_dVb + dPhis_dVb; - dT1_dVg = dT2_dVg = 1; - - /* Note VdsatCV is redefined in capMod = 3 */ - VdsatCV = T1 - K1*sqrt(T2); - - dVdsatCV_dVb = dT1_dVb - K1/2/sqrt(T2)*dT2_dVb; - dVdsatCV_dVg = dT1_dVg - K1/2/sqrt(T2)*dT2_dVg; - - T1 = VdsatCV - Vdsat; - dT1_dVg = dVdsatCV_dVg - dVdsat_dVg; - dT1_dVb = dVdsatCV_dVb - dVdsat_dVb; - dT1_dVd = - dVdsat_dVd; - dT1_dVc = - dVdsat_dVc; - dT1_dT = - dVdsat_dT; - - if (!(T1 == 0.0)) - { T3 = -0.5 * Vdsat / T1; /* Vdsmax */ - T2 = T3 * Vdsat; - T4 = T2 + T1 * T3 * T3; /* fmax */ - if ((Vdseff > T2) && (T1 < 0)) - { - VdsCV = T4; - T5 = -0.5 / (T1 * T1); - dT3_dVg = T5 * (T1 * dVdsat_dVg - Vdsat * dT1_dVg); - dT3_dVb = T5 * (T1 * dVdsat_dVb - Vdsat * dT1_dVb); - dT3_dVd = T5 * (T1 * dVdsat_dVd - Vdsat * dT1_dVd); - dT3_dVc = T5 * (T1 * dVdsat_dVc - Vdsat * dT1_dVc); - if (selfheat) - dT3_dT=T5 * (T1 * dVdsat_dT - Vdsat * dT1_dT); - else dT3_dT=0.0; - - dVdsCV_dVd = T3 * dVdsat_dVd + Vdsat * dT3_dVd - + T3 * (2 * T1 * dT3_dVd + T3 * dT1_dVd); - dVdsCV_dVg = T3 * dVdsat_dVg + Vdsat * dT3_dVg - + T3 * (2 * T1 * dT3_dVg + T3 * dT1_dVg); - dVdsCV_dVb = T3 * dVdsat_dVb + Vdsat * dT3_dVb - + T3 * (2 * T1 * dT3_dVb + T3 * dT1_dVb); - dVdsCV_dVc = T3 * dVdsat_dVc + Vdsat * dT3_dVc - + T3 * (2 * T1 * dT3_dVc + T3 * dT1_dVc); - if (selfheat) - dVdsCV_dT = T3 * dVdsat_dT + Vdsat * dT3_dT - + T3 * (2 * T1 * dT3_dT + T3 * dT1_dT ); - else dVdsCV_dT = 0.0; - } else - { T5 = Vdseff / Vdsat; - T6 = T5 * T5; - T7 = 2 * T1 * T5 / Vdsat; - T8 = T7 / Vdsat; - VdsCV = Vdseff + T1 * T6; - dVdsCV_dVd = dVdseff_dVd + T8 * - ( Vdsat * dVdseff_dVd - - Vdseff * dVdsat_dVd) - + T6 * dT1_dVd; - dVdsCV_dVb = dVdseff_dVb + T8 * ( Vdsat * - dVdseff_dVb - Vdseff * dVdsat_dVb) - + T6 * dT1_dVb; - dVdsCV_dVg = dVdseff_dVg + T8 * - ( Vdsat * dVdseff_dVg - - Vdseff * dVdsat_dVg) - + T6 * dT1_dVg; - dVdsCV_dVc = dVdseff_dVc + T8 * - ( Vdsat * dVdseff_dVc - - Vdseff * dVdsat_dVc) - + T6 * dT1_dVc; - if (selfheat) - dVdsCV_dT = dVdseff_dT + T8 * - ( Vdsat * dVdseff_dT - - Vdseff * dVdsat_dT ) - + T6 * dT1_dT ; - else dVdsCV_dT = 0.0; - } - } else - { VdsCV = Vdseff; - dVdsCV_dVb = dVdseff_dVb; - dVdsCV_dVd = dVdseff_dVd; - dVdsCV_dVg = dVdseff_dVg; - dVdsCV_dVc = dVdseff_dVc; - dVdsCV_dT = dVdseff_dT; - } - if (VdsCV < 0.0) VdsCV = 0.0; - VdsCV += 1e-4; - - if (VdsCV > (VdsatCV - 1e-7)) - { - VdsCV = VdsatCV - 1e-7; - } - Phisd = Phis + VdsCV; - dPhisd_dVb = dPhis_dVb + dVdsCV_dVb; - dPhisd_dVd = dVdsCV_dVd; - dPhisd_dVg = dVdsCV_dVg; - dPhisd_dVc = dVdsCV_dVc; - dPhisd_dT = dVdsCV_dT; - sqrtPhisd = sqrt(Phisd); - - /* Qdep0 - Depletion charge at Vgs=Vth */ - T10 = CoxWL * K1; - Qdep0 = T10 * sqrtPhis; - dQdep0_dVb = T10 * dsqrtPhis_dVb; - - /* VcsCV calculation */ - T1 = VdsCV - Vcs - VdsCV * VdsCV * DELTA_Vcscv; - T5 = 2 * DELTA_Vcscv; - T2 = sqrt(T1 * T1 + T5 * VdsCV * VdsCV); - - dT1_dVb = dVdsCV_dVb * (1.0 - 2.0 * VdsCV * DELTA_Vcscv); - dT2_dVb = (T1 * dT1_dVb + T5 * VdsCV * dVdsCV_dVb)/T2; - - dT1_dVd = dVdsCV_dVd * (1.0 - 2.0 * VdsCV * DELTA_Vcscv); - dT2_dVd = (T1 * dT1_dVd + T5 * VdsCV * dVdsCV_dVd)/ T2; - - dT1_dVg = dVdsCV_dVg * (1.0 - 2.0 * VdsCV * DELTA_Vcscv) ; - dT2_dVg = (T1 * dT1_dVg + T5 * VdsCV * dVdsCV_dVg)/T2; - - dT1_dVc = dVdsCV_dVc * (1.0 - 2.0 * VdsCV * DELTA_Vcscv) - 1; - dT2_dVc = (T1 * dT1_dVc + T5 * VdsCV * dVdsCV_dVc)/T2; - - if (selfheat) - { - dT1_dT = dVdsCV_dT * (1.0 - 2.0 * VdsCV * DELTA_Vcscv); - dT2_dT = (T1 * dT1_dT + T5 * VdsCV * dVdsCV_dT )/ T2; - } else dT1_dT = dT2_dT = 0.0; - - VcsCV = Vcs + 0.5*(T1 - T2); - - dVcsCV_dVb = 0.5 * (dT1_dVb - dT2_dVb); - dVcsCV_dVg = 0.5 * (dT1_dVg - dT2_dVg); - dVcsCV_dVd = 0.5 * (dT1_dVd - dT2_dVd); - dVcsCV_dVc = 1 + 0.5 * (dT1_dVc - dT2_dVc); - if (selfheat) - dVcsCV_dT = 0.5 * (dT1_dT - dT2_dT); - else dVcsCV_dT = 0.0; - - Phisc = Phis + VcsCV; - dPhisc_dVb = dPhis_dVb + dVcsCV_dVb; - dPhisc_dVd = dVcsCV_dVd; - dPhisc_dVg = dVcsCV_dVg; - dPhisc_dVc = dVcsCV_dVc; - dPhisc_dT = dVcsCV_dT; - sqrtPhisc = sqrt(Phisc); - - /* Xc calculation */ - T1 = Vgsteff + K1*sqrtPhis - 0.5*VdsCV; - T2 = CONST_2OV3*K1*(Phisd*sqrtPhisd - Phis*sqrtPhis); - T3 = Vgsteff + K1*sqrtPhis - 0.5*VcsCV; - T4 = CONST_2OV3*K1*(Phisc*sqrtPhisc - Phis*sqrtPhis); - T5 = T1*VdsCV - T2; - T6 = T3*VcsCV - T4; - Xc = T6/T5; - - dT1_dVb = K1*dsqrtPhis_dVb - 0.5*dVdsCV_dVb; - dT2_dVb = K1*(sqrtPhisd*dPhisd_dVb - sqrtPhis*dPhis_dVb); - dT3_dVb = K1*dsqrtPhis_dVb - 0.5*dVcsCV_dVb; - dT4_dVb = K1*(sqrtPhisc*dPhisc_dVb - sqrtPhis*dPhis_dVb); - - dT1_dVd = - 0.5*dVdsCV_dVd; - dT2_dVd = K1 * (sqrtPhisd*dPhisd_dVd); - dT3_dVd = - 0.5*dVcsCV_dVd; - dT4_dVd = K1 * (sqrtPhisc*dPhisc_dVd); - - dT1_dVg = 1 - 0.5*dVdsCV_dVg; - dT2_dVg = K1 * (sqrtPhisd*dPhisd_dVg); - dT3_dVg = 1 - 0.5*dVcsCV_dVg; - dT4_dVg = K1 * (sqrtPhisc*dPhisc_dVg); - - dT1_dVc = - 0.5*dVdsCV_dVc; - dT2_dVc = K1 * (sqrtPhisd*dPhisd_dVc); - dT3_dVc = - 0.5*dVcsCV_dVc; - dT4_dVc = K1 * (sqrtPhisc*dPhisc_dVc); - - if (selfheat) - { - dT1_dT = - 0.5*dVdsCV_dT; - dT2_dT = K1 * (sqrtPhisd*dPhisd_dT); - dT3_dT = - 0.5*dVcsCV_dT; - dT4_dT = K1 * (sqrtPhisc*dPhisc_dT); - } else dT1_dT = dT2_dT = dT3_dT = dT4_dT = 0.0; - - dT5_dVb = T1 * dVdsCV_dVb + VdsCV * dT1_dVb - dT2_dVb; - dT6_dVb = T3 * dVcsCV_dVb + VcsCV * dT3_dVb - dT4_dVb; - - dT5_dVd = T1 * dVdsCV_dVd + VdsCV * dT1_dVd - dT2_dVd; - dT6_dVd = T3 * dVcsCV_dVd + VcsCV * dT3_dVd - dT4_dVd; - - dT5_dVg = T1 * dVdsCV_dVg + VdsCV * dT1_dVg - dT2_dVg; - dT6_dVg = T3 * dVcsCV_dVg + VcsCV * dT3_dVg - dT4_dVg; - - dT5_dVc = T1 * dVdsCV_dVc + VdsCV * dT1_dVc - dT2_dVc; - dT6_dVc = T3 * dVcsCV_dVc + VcsCV * dT3_dVc - dT4_dVc; - - if (selfheat) - { - dT5_dT = T1 * dVdsCV_dT + VdsCV * dT1_dT - dT2_dT; - dT6_dT = T3 * dVcsCV_dT + VcsCV * dT3_dT - dT4_dT; - } else dT5_dT = dT6_dT = 0.0; - - dXc_dVb = (dT6_dVb - T6/T5 * dT5_dVb) / T5; - dXc_dVd = (dT6_dVd - T6/T5 * dT5_dVd) / T5; - dXc_dVg = (dT6_dVg - T6/T5 * dT5_dVg) / T5; - dXc_dVc = (dT6_dVc - T6/T5 * dT5_dVc) / T5; - if (selfheat) - dXc_dT = (dT6_dT - T6/T5 * dT5_dT ) / T5; - else dXc_dT = 0.0; - - T10 = Phis * sqrtPhis ; - T5 = Phisc * sqrtPhisc; - T0 = T5 - T10; - T1 = Vgsteff + K1*sqrtPhis + Phis; - T2 = Phisc*T5 - Phis*T10; - T3 = K1*VcsCV*(Phis + 0.5*VcsCV); - - dT0_dVb = 1.5 *(sqrtPhisc*dPhisc_dVb-sqrtPhis*dPhis_dVb); - dT1_dVb = (0.5*K1/sqrtPhis + 1) * dPhis_dVb; - dT2_dVb = 2.5 * (T5 * dPhisc_dVb - T10 * dPhis_dVb); - dT3_dVb = K1 * ( VcsCV * (dPhis_dVb + 0.5 * dVcsCV_dVb) - + dVcsCV_dVb * (Phis + 0.5*VcsCV)); - - dT0_dVd = 1.5 * sqrtPhisc * dPhisc_dVd; - dT1_dVd = 0; - dT2_dVd = 2.5 * T5 * dPhisc_dVd; - dT3_dVd = K1 * (Phis + VcsCV) * dVcsCV_dVd; - - dT0_dVg = 1.5 * sqrtPhisc * dPhisc_dVg; - dT1_dVg = 1; - dT2_dVg = 2.5 * T5 * dPhisc_dVg; - dT3_dVg = K1 * (VcsCV * 0.5 * dVcsCV_dVg - + dVcsCV_dVg * (Phis + 0.5*VcsCV)); - - dT0_dVc = 1.5 * sqrtPhisc * dPhisc_dVc; - dT1_dVc = 0.0; - dT2_dVc = 2.5 * T5 * dPhisc_dVc; - dT3_dVc = K1 * (VcsCV * 0.5 * dVcsCV_dVc - + dVcsCV_dVc * (Phis + 0.5*VcsCV)); - - if (selfheat) - { - dT0_dT = 1.5 * sqrtPhisc * dPhisc_dT; - dT1_dT = 0; - dT2_dT = 2.5 * T5 * dPhisc_dT; - dT3_dT = K1 * (Phis + VcsCV) * dVcsCV_dT; - } else dT0_dT = dT1_dT = dT2_dT = dT3_dT = 0.0; - - Nomi = K1*(CONST_2OV3*T1*T0 - 0.4*T2 - T3); - - dNomi_dVb = K1*(CONST_2OV3 * (T1 * dT0_dVb + T0*dT1_dVb) - - 0.4 * dT2_dVb - dT3_dVb); - dNomi_dVd = K1*(CONST_2OV3 * (T1 * dT0_dVd + T0*dT1_dVd) - - 0.4 * dT2_dVd - dT3_dVd); - dNomi_dVg = K1*(CONST_2OV3 * (T1 * dT0_dVg + T0*dT1_dVg) - - 0.4 * dT2_dVg - dT3_dVg); - dNomi_dVc = K1*(CONST_2OV3 * (T1 * dT0_dVc + T0*dT1_dVc) - - 0.4 * dT2_dVc - dT3_dVc); - if (selfheat) - dNomi_dT = K1*(CONST_2OV3 * (T1 * dT0_dT + T0*dT1_dT ) - - 0.4 * dT2_dT - dT3_dT ); - else - dNomi_dT = 0.0; - - T4 = Vgsteff + K1*sqrtPhis - 0.5*VdsCV; - T5 = CONST_2OV3*K1*(Phisd*sqrtPhisd - T10); - - dT4_dVb = K1 * dsqrtPhis_dVb - 0.5*dVdsCV_dVb; - dT5_dVb = K1*(sqrtPhisd*dPhisd_dVb - sqrtPhis*dPhis_dVb); - - dT4_dVd = - 0.5*dVdsCV_dVd; - dT5_dVd = K1*( sqrtPhisd * dPhisd_dVd); - - dT4_dVg = 1 - 0.5 * dVdsCV_dVg; - dT5_dVg = K1* sqrtPhisd * dPhisd_dVg; - - dT4_dVc = - 0.5 * dVdsCV_dVc; - dT5_dVc = K1* sqrtPhisd * dPhisd_dVc; - - if (selfheat) - { - dT4_dT = - 0.5 * dVdsCV_dT; - dT5_dT = K1* sqrtPhisd * dPhisd_dT; - } else dT4_dT = dT5_dT = 0.0; - - Denomi = T4*VdsCV - T5; - - dDenomi_dVb = VdsCV*dT4_dVb + T4*dVdsCV_dVb - dT5_dVb; - dDenomi_dVd = VdsCV*dT4_dVd + T4*dVdsCV_dVd - dT5_dVd; - dDenomi_dVg = VdsCV*dT4_dVg + T4*dVdsCV_dVg - dT5_dVg; - dDenomi_dVc = VdsCV*dT4_dVc + T4*dVdsCV_dVc - dT5_dVc; - if (selfheat) - dDenomi_dT = VdsCV*dT4_dT + T4*dVdsCV_dT - dT5_dT; - else dDenomi_dT = 0.0; - - T6 = -CoxWL / Denomi; - Qsubs1 = T6 * Nomi; - dQsubs1_dVb = T6*(dNomi_dVb - Nomi / Denomi*dDenomi_dVb); - dQsubs1_dVg = T6*(dNomi_dVg - Nomi / Denomi*dDenomi_dVg); - dQsubs1_dVd = T6*(dNomi_dVd - Nomi / Denomi*dDenomi_dVd); - dQsubs1_dVc = T6*(dNomi_dVc - Nomi / Denomi*dDenomi_dVc); - if (selfheat) - dQsubs1_dT = T6*(dNomi_dT - Nomi / Denomi*dDenomi_dT ); - else dQsubs1_dT = 0.0; - - T6 = sqrt(1e-4 + phi - Vbs0eff); - T7 = K1 * CoxWL; - T8 = 1 - Xc; - T10 = T7 * T6; - T11 = T7 * T8 * 0.5 / T6; - Qsubs2 = -T10 * T8 ; - dQsubs2_dVg = T10 * dXc_dVg; - dQsubs2_dVb = T10 * dXc_dVb; - dQsubs2_dVd = T10 * dXc_dVd + T11 * dVbs0eff_dVd; - dQsubs2_dVc = T10 * dXc_dVc; - dQsubs2_dVe = T11 * dVbs0eff_dVe; - dQsubs2_dVrg = T11 * dVbs0eff_dVg; - if (selfheat) - dQsubs2_dT = T10 * dXc_dT + T11 * dVbs0eff_dT; - else dQsubs2_dT = 0.0; - - Qbf = Qac0 + Qsub0 + Qsubs1 + Qsubs2 + Qdep0; - dQbf_dVrg = dQac0_dVrg + dQsub0_dVrg + dQsubs2_dVrg; - dQbf_dVg = dQsub0_dVg + dQsubs1_dVg + dQsubs2_dVg ; - dQbf_dVd = dQac0_dVd + dQsub0_dVd + dQsubs1_dVd - + dQsubs2_dVd; - dQbf_dVb = dQac0_dVb + dQsub0_dVb + dQsubs1_dVb - + dQsubs2_dVb + dQdep0_dVb; - dQbf_dVc = dQsubs1_dVc + dQsubs2_dVc; - dQbf_dVe = dQsubs2_dVe; - if (selfheat) - dQbf_dT = dQac0_dT + dQsub0_dT + dQsubs1_dT + dQsubs2_dT; - else dQbf_dT = 0.0; - } /* End of if capMod == 3 */ - - /* Something common in both capMod 2 or 3 */ - - /* Backgate charge */ - CboxWL = pParam->B3SOIDDkb3 * Cbox * pParam->B3SOIDDweffCV - * pParam->B3SOIDDleffCV; - T0 = 0.5 * K1; - T2 = sqrt(phi - Vbs0t); - T3 = phi + K1 * T2 - Vbs0t; - T4 = sqrt(T0 * T0 + T3); - Qsicv = K1 * CoxWL * ( T0 - T4); - T6 = CoxWL * T0 / T4 * (1 + T0 / T2); - if (selfheat) dQsicv_dT = T6 * dVbs0t_dT; - else dQsicv_dT = 0.0; - - T2 = sqrt(phi - Vbs0mos); - T3 = phi + K1 * T2 - Vbs0mos; - T4 = sqrt(T0 * T0 + T3); - Qbf0 = K1 * CoxWL * ( T0 - T4); - T6 = CoxWL * T0 / T4 * (1 + T0 / T2); - dQbf0_dVe = T6 * dVbs0mos_dVe; - if (selfheat) dQbf0_dT = T6 * dVbs0mos_dT; - else dQbf0_dT = 0.0; - - T5 = -CboxWL * (Vbsdio - Vbs0); - T6 = CboxWL * Xc; - Qe1 = -Qsicv + Qbf0 + T5 * Xc; - dQe1_dVg = T5 * (dXc_dVg * dVgsteff_dVg + dXc_dVb * dVbseff_dVg - + dXc_dVc * dVcs_dVg) - T6 * dVbsdio_dVg; - dQe1_dVb = T5 * (dXc_dVg * dVgsteff_dVb + dXc_dVb * dVbseff_dVb - + dXc_dVc * dVcs_dVb) - T6 * dVbsdio_dVb; - dQe1_dVd = T5 * (dXc_dVg * dVgsteff_dVd + dXc_dVb * dVbseff_dVd - + dXc_dVc * dVcs_dVd + dXc_dVd) - T6 * dVbsdio_dVd; - dQe1_dVe = dQbf0_dVe + T6 * (dVbs0_dVe - dVbsdio_dVe); - if (selfheat) - dQe1_dT = -dQsicv_dT + dQbf0_dT - + T5 * (dXc_dVg * dVgsteff_dT + dXc_dVb * dVbseff_dT - + dXc_dVc * dVcs_dT + dXc_dT ) - + T6 * (dVbs0_dT - dVbsdio_dT); - else dQe1_dT = 0.0; - - T2 = -model->B3SOIDDcboxt * pParam->B3SOIDDweffCV - * pParam->B3SOIDDleffCV; - T3 = T2 * 0.5 * (1 - Xc); - T4 = T2 * 0.5 * (VdsCV - VcsCV); - Qe2 = T2 * 0.5 * (1 - Xc) * (VdsCV - VcsCV); - - /* T10 - dVgsteff, T11 - dVbseff, T12 - dVcs */ - T10 = T3 * (dVdsCV_dVg - dVcsCV_dVg) - T4 * dXc_dVg; - T11 = T3 * (dVdsCV_dVb - dVcsCV_dVb) - T4 * dXc_dVb; - T12 = T3 * (dVdsCV_dVc - dVcsCV_dVc) - T4 * dXc_dVc; - dQe2_dVg = T10 * dVgsteff_dVg + T11 * dVbseff_dVg + T12 * dVcs_dVg; - dQe2_dVb = T10 * dVgsteff_dVb + T11 * dVbseff_dVb + T12 * dVcs_dVb; - dQe2_dVd = T10 * dVgsteff_dVd + T11 * dVbseff_dVd + T12 * dVcs_dVd - + T3 * (dVdsCV_dVd - dVcsCV_dVd) - T4 * dXc_dVd; - dQe2_dVe = T10 * dVgsteff_dVe + T11 * dVbseff_dVe + T12 * dVcs_dVe; - if (selfheat) - dQe2_dT = T10 * dVgsteff_dT + T11 * dVbseff_dT + T12 * dVcs_dT - + T3 * (dVdsCV_dT - dVcsCV_dT ) - T4 * dXc_dT; - else dQe2_dT = 0.0; - - /* This transform all the dependency on Vgsteff, Vbseff, - Vcs into real ones */ - Cbg = dQbf_dVrg + dQbf_dVg * dVgsteff_dVg - + dQbf_dVb * dVbseff_dVg + dQbf_dVc * dVcs_dVg; - Cbb = dQbf_dVg * dVgsteff_dVb + dQbf_dVb * dVbseff_dVb - + dQbf_dVc * dVcs_dVb; - Cbd = dQbf_dVg * dVgsteff_dVd + dQbf_dVb * dVbseff_dVd - + dQbf_dVc * dVcs_dVd + dQbf_dVd; - Cbe = dQbf_dVg * dVgsteff_dVe + dQbf_dVb * dVbseff_dVe - + dQbf_dVc * dVcs_dVe + dQbf_dVe; - if (selfheat) - CbT = dQbf_dVg * dVgsteff_dT + dQbf_dVb * dVbseff_dT - + dQbf_dVc * dVcs_dT + dQbf_dT; - else CbT = 0.0; - - Ce1g = dQe1_dVg; - Ce1b = dQe1_dVb; - Ce1d = dQe1_dVd; - Ce1e = dQe1_dVe; - Ce1T = dQe1_dT; - - Ce2g = dQe2_dVg; - Ce2b = dQe2_dVb; - Ce2d = dQe2_dVd; - Ce2e = dQe2_dVe; - Ce2T = dQe2_dT; - - /* Total inversion charge */ - T0 = AbulkCV * VdseffCV; - T1 = 12.0 * (Vgsteff - 0.5 * T0 + 1e-20); - T2 = VdseffCV / T1; - T3 = T0 * T2; - - T4 = (1.0 - 12.0 * T2 * T2 * AbulkCV); - T5 = (6.0 * T0 * (4.0 * Vgsteff - T0) / (T1 * T1) - 0.5); - T6 = 12.0 * T2 * T2 * Vgsteff; - - qinv = CoxWL * (Vgsteff - 0.5 * VdseffCV + T3); - Cgg1 = CoxWL * (T4 + T5 * dVdseffCV_dVg); - Cgd1 = CoxWL * T5 * dVdseffCV_dVd; - Cgb1 = CoxWL * (T5 * dVdseffCV_dVb + T6 * dAbulkCV_dVb); - - /* Inversion charge partitioning into S / D */ - if (model->B3SOIDDxpart > 0.5) - { /* 0/100 Charge partition model */ - T1 = T1 + T1; - qsrc = -CoxWL * (0.5 * Vgsteff + 0.25 * T0 - - T0 * T0 / T1); - T7 = (4.0 * Vgsteff - T0) / (T1 * T1); - T4 = -(0.5 + 24.0 * T0 * T0 / (T1 * T1)); - T5 = -(0.25 * AbulkCV - 12.0 * AbulkCV * T0 * T7); - T6 = -(0.25 * VdseffCV - 12.0 * T0 * VdseffCV * T7); - Csg1 = CoxWL * (T4 + T5 * dVdseffCV_dVg); - Csd1 = CoxWL * T5 * dVdseffCV_dVd; - Csb1 = CoxWL * (T5 * dVdseffCV_dVb + T6 * dAbulkCV_dVb); - - } - else if (model->B3SOIDDxpart < 0.5) - { /* 40/60 Charge partition model */ - T1 = T1 / 12.0; - T2 = 0.5 * CoxWL / (T1 * T1); - T3 = Vgsteff * (2.0 * T0 * T0 / 3.0 + Vgsteff - * (Vgsteff - 4.0 * T0 / 3.0)) - - 2.0 * T0 * T0 * T0 / 15.0; - qsrc = -T2 * T3; - T7 = 4.0 / 3.0 * Vgsteff * (Vgsteff - T0) - + 0.4 * T0 * T0; - T4 = -2.0 * qsrc / T1 - T2 * (Vgsteff * (3.0 - * Vgsteff - 8.0 * T0 / 3.0) - + 2.0 * T0 * T0 / 3.0); - T5 = (qsrc / T1 + T2 * T7) * AbulkCV; - T6 = (qsrc / T1 * VdseffCV + T2 * T7 * VdseffCV); - Csg1 = T4 + T5 * dVdseffCV_dVg; - Csd1 = T5 * dVdseffCV_dVd; - Csb1 = T5 * dVdseffCV_dVb + T6 * dAbulkCV_dVb; - } - else - { /* 50/50 Charge partition model */ - qsrc = - 0.5 * qinv; - Csg1 = - 0.5 * Cgg1; - Csb1 = - 0.5 * Cgb1; - Csd1 = - 0.5 * Cgd1; - } - - Csg = Csg1 * dVgsteff_dVg + Csb1 * dVbseff_dVg; - Csd = Csd1 + Csg1 * dVgsteff_dVd + Csb1 * dVbseff_dVd; - Csb = Csg1 * dVgsteff_dVb + Csb1 * dVbseff_dVb; - Cse = Csg1 * dVgsteff_dVe + Csb1 * dVbseff_dVe; - if (selfheat) - CsT = Csg1 * dVgsteff_dT + Csb1 * dVbseff_dT; - else CsT = 0.0; - - T0 = QEX_FACT * K1 * CoxWL; - Qex = T0 * (Vbs - Vbsdio); - dQex_dVg = - T0 * dVbsdio_dVg; - dQex_dVb = T0 * (1 - dVbsdio_dVb); - dQex_dVd = - T0 * dVbsdio_dVd; - dQex_dVe = - T0 * dVbsdio_dVe; - if (selfheat) dQex_dT = - T0 * dVbsdio_dT; - else dQex_dT = 0.0; - - qgate = qinv - (Qbf + Qe2); - qbody = (Qbf - Qe1 + Qex); - qsub = Qe1 + Qe2 - Qex; - qdrn = -(qinv + qsrc); - - Cgg = (Cgg1 * dVgsteff_dVg + Cgb1 * dVbseff_dVg) - Cbg ; - Cgd = (Cgd1 + Cgg1 * dVgsteff_dVd + Cgb1 * dVbseff_dVd)-Cbd; - Cgb = (Cgb1 * dVbseff_dVb + Cgg1 * dVgsteff_dVb) - Cbb; - Cge = (Cgg1 * dVgsteff_dVe + Cgb1 * dVbseff_dVe) - Cbe; - if (selfheat) - CgT = (Cgg1 * dVgsteff_dT + Cgb1 * dVbseff_dT ) - CbT; - else CgT = 0.0; - - here->B3SOIDDcggb = Cgg - Ce2g; - here->B3SOIDDcgsb = - (Cgg + Cgd + Cgb + Cge) - + (Ce2g + Ce2d + Ce2b + Ce2e); - here->B3SOIDDcgdb = Cgd - Ce2d; - here->B3SOIDDcgeb = Cge - Ce2e; - here->B3SOIDDcgT = CgT - Ce2T; - - here->B3SOIDDcbgb = Cbg - Ce1g + dQex_dVg; - here->B3SOIDDcbsb = -(Cbg + Cbd + Cbb + Cbe) - + (Ce1g + Ce1d + Ce1b + Ce1e) - - (dQex_dVg + dQex_dVd + dQex_dVb + dQex_dVe); - here->B3SOIDDcbdb = Cbd - Ce1d + dQex_dVd; - here->B3SOIDDcbeb = Cbe - Ce1e + dQex_dVe; - here->B3SOIDDcbT = CbT - Ce1T + dQex_dT; - - here->B3SOIDDcegb = Ce1g + Ce2g - dQex_dVg; - here->B3SOIDDcesb = -(Ce1g + Ce1d + Ce1b + Ce1e) - -(Ce2g + Ce2d + Ce2b + Ce2e) - +(dQex_dVg + dQex_dVd + dQex_dVb + dQex_dVe); - here->B3SOIDDcedb = Ce1d + Ce2d - dQex_dVd; - here->B3SOIDDceeb = Ce1e + Ce2e - dQex_dVe; - here->B3SOIDDceT = Ce1T + Ce2T - dQex_dT; - - here->B3SOIDDcdgb = -(Cgg + Cbg + Csg); - here->B3SOIDDcddb = -(Cgd + Cbd + Csd); - here->B3SOIDDcdeb = -(Cge + Cbe + Cse); - here->B3SOIDDcdT = -(CgT + CbT + CsT); - here->B3SOIDDcdsb = (Cgg + Cgd + Cgb + Cge - + Cbg + Cbd + Cbb + Cbe - + Csg + Csd + Csb + Cse); - - } /* End of if capMod == 2 or capMod ==3 */ - } - - finished: /* returning Values to Calling Routine */ - /* - * COMPUTE EQUIVALENT DRAIN CURRENT SOURCE - */ - if (ChargeComputationNeeded) - { - /* Intrinsic S/D junction charge */ - PhiBSWG = model->B3SOIDDGatesidewallJctPotential; - MJSWG = model->B3SOIDDbodyJctGateSideGradingCoeff; - cjsbs = model->B3SOIDDunitLengthGateSidewallJctCap - * pParam->B3SOIDDweff * model->B3SOIDDtsi / 1e-7; - if (Vbs < 0.0) - { arg = 1.0 - Vbs / PhiBSWG; - if (MJSWG == 0.5) - dT3_dVb = 1.0 / sqrt(arg); - else - dT3_dVb = exp(-MJSWG * log(arg)); - T3 = (1.0 - arg * dT3_dVb) * PhiBSWG / (1.0 - MJSWG); - } - else - { T3 = Vbs * ( 1 + 0.5 * MJSWG * Vbs / PhiBSWG); - dT3_dVb = 1 + MJSWG * Vbs / PhiBSWG; - } - - qjs = cjsbs * T3 + model->B3SOIDDtt * Ibs1; - gcjsbs = cjsbs * dT3_dVb + model->B3SOIDDtt * dIbs1_dVb; - if (selfheat) gcjsT = model->B3SOIDDtt * dIbs1_dT; - else gcjsT = 0.0; - - if (Vbd < 0.0) - { arg = 1.0 - Vbd / PhiBSWG; - if (MJSWG == 0.5) - dT3_dVb = 1.0 / sqrt(arg); - else - dT3_dVb = exp(-MJSWG * log(arg)); - T3 = (1.0 - arg * dT3_dVb) * PhiBSWG / (1.0 - MJSWG); - } - else - { T3 = Vbd * ( 1 + 0.5 * MJSWG * Vbd / PhiBSWG); - dT3_dVb = 1 + MJSWG * Vbd / PhiBSWG; - } - dT3_dVd = - dT3_dVb; - - qjd = cjsbs * T3 + model->B3SOIDDtt * Ibd1; - gcjdbs = cjsbs * dT3_dVb + model->B3SOIDDtt * dIbd1_dVb; - gcjdds = cjsbs * dT3_dVd + model->B3SOIDDtt * dIbd1_dVd; - if (selfheat) gcjdT = model->B3SOIDDtt * dIbd1_dT; - else gcjdT = 0.0; - - qdrn -= qjd; - qbody += (qjs + qjd); - qsrc = -(qgate + qbody + qdrn + qsub); - - /* Update the conductance */ - here->B3SOIDDcddb -= gcjdds; - here->B3SOIDDcdT -= gcjdT; - here->B3SOIDDcdsb += gcjdds + gcjdbs; - - here->B3SOIDDcbdb += (gcjdds); - here->B3SOIDDcbT += (gcjdT + gcjsT); - here->B3SOIDDcbsb -= (gcjdds + gcjdbs + gcjsbs); - - /* Extrinsic Bottom S/D to substrate charge */ - T10 = -model->B3SOIDDtype * ves; - /* T10 is vse without type conversion */ - if ( ((pParam->B3SOIDDnsub > 0) && (model->B3SOIDDtype > 0)) || - ((pParam->B3SOIDDnsub < 0) && (model->B3SOIDDtype < 0)) ) - { - if (T10 < pParam->B3SOIDDvsdfb) - { here->B3SOIDDqse = here->B3SOIDDcsbox * (T10 - pParam->B3SOIDDvsdfb); - here->B3SOIDDgcse = here->B3SOIDDcsbox; - } - else if (T10 < pParam->B3SOIDDsdt1) - { T0 = T10 - pParam->B3SOIDDvsdfb; - T1 = T0 * T0; - here->B3SOIDDqse = T0 * (here->B3SOIDDcsbox - - pParam->B3SOIDDst2 / 3 * T1) ; - here->B3SOIDDgcse = here->B3SOIDDcsbox - pParam->B3SOIDDst2 * T1; - } - else if (T10 < pParam->B3SOIDDvsdth) - { T0 = T10 - pParam->B3SOIDDvsdth; - T1 = T0 * T0; - here->B3SOIDDqse = here->B3SOIDDcsmin * T10 + here->B3SOIDDst4 + - pParam->B3SOIDDst3 / 3 * T0 * T1; - here->B3SOIDDgcse = here->B3SOIDDcsmin + pParam->B3SOIDDst3 * T1; - } - else - { here->B3SOIDDqse = here->B3SOIDDcsmin * T10 + here->B3SOIDDst4; - here->B3SOIDDgcse = here->B3SOIDDcsmin; - } - } else - { - if (T10 < pParam->B3SOIDDvsdth) - { here->B3SOIDDqse = here->B3SOIDDcsmin * (T10 - pParam->B3SOIDDvsdth); - here->B3SOIDDgcse = here->B3SOIDDcsmin; - } - else if (T10 < pParam->B3SOIDDsdt1) - { T0 = T10 - pParam->B3SOIDDvsdth; - T1 = T0 * T0; - here->B3SOIDDqse = T0 * (here->B3SOIDDcsmin - pParam->B3SOIDDst2 / 3 * T1) ; - here->B3SOIDDgcse = here->B3SOIDDcsmin - pParam->B3SOIDDst2 * T1; - } - else if (T10 < pParam->B3SOIDDvsdfb) - { T0 = T10 - pParam->B3SOIDDvsdfb; - T1 = T0 * T0; - here->B3SOIDDqse = here->B3SOIDDcsbox * T10 + here->B3SOIDDst4 + - pParam->B3SOIDDst3 / 3 * T0 * T1; - here->B3SOIDDgcse = here->B3SOIDDcsbox + pParam->B3SOIDDst3 * T1; - } - else - { here->B3SOIDDqse = here->B3SOIDDcsbox * T10 + here->B3SOIDDst4; - here->B3SOIDDgcse = here->B3SOIDDcsbox; - } - } - - /* T11 is vde without type conversion */ - T11 = model->B3SOIDDtype * (vds - ves); - if ( ((pParam->B3SOIDDnsub > 0) && (model->B3SOIDDtype > 0)) || - ((pParam->B3SOIDDnsub < 0) && (model->B3SOIDDtype < 0)) ) - { - if (T11 < pParam->B3SOIDDvsdfb) - { here->B3SOIDDqde = here->B3SOIDDcdbox * (T11 - pParam->B3SOIDDvsdfb); - here->B3SOIDDgcde = here->B3SOIDDcdbox; - } - else if (T11 < pParam->B3SOIDDsdt1) - { T0 = T11 - pParam->B3SOIDDvsdfb; - T1 = T0 * T0; - here->B3SOIDDqde = T0 * (here->B3SOIDDcdbox - pParam->B3SOIDDdt2 / 3 * T1) ; - here->B3SOIDDgcde = here->B3SOIDDcdbox - pParam->B3SOIDDdt2 * T1; - } - else if (T11 < pParam->B3SOIDDvsdth) - { T0 = T11 - pParam->B3SOIDDvsdth; - T1 = T0 * T0; - here->B3SOIDDqde = here->B3SOIDDcdmin * T11 + here->B3SOIDDdt4 + - pParam->B3SOIDDdt3 / 3 * T0 * T1; - here->B3SOIDDgcde = here->B3SOIDDcdmin + pParam->B3SOIDDdt3 * T1; - } - else - { here->B3SOIDDqde = here->B3SOIDDcdmin * T11 + here->B3SOIDDdt4; - here->B3SOIDDgcde = here->B3SOIDDcdmin; - } - } else - { - if (T11 < pParam->B3SOIDDvsdth) - { here->B3SOIDDqde = here->B3SOIDDcdmin * (T11 - pParam->B3SOIDDvsdth); - here->B3SOIDDgcde = here->B3SOIDDcdmin; - } - else if (T11 < pParam->B3SOIDDsdt1) - { T0 = T11 - pParam->B3SOIDDvsdth; - T1 = T0 * T0; - here->B3SOIDDqde = T0 * (here->B3SOIDDcdmin - pParam->B3SOIDDdt2 / 3 * T1) ; - here->B3SOIDDgcde = here->B3SOIDDcdmin - pParam->B3SOIDDdt2 * T1; - } - else if (T11 < pParam->B3SOIDDvsdfb) - { T0 = T11 - pParam->B3SOIDDvsdfb; - T1 = T0 * T0; - here->B3SOIDDqde = here->B3SOIDDcdbox * T11 + here->B3SOIDDdt4 + - pParam->B3SOIDDdt3 / 3 * T0 * T1; - here->B3SOIDDgcde = here->B3SOIDDcdbox + pParam->B3SOIDDdt3 * T1; - } - else - { here->B3SOIDDqde = here->B3SOIDDcdbox * T11 + here->B3SOIDDdt4; - here->B3SOIDDgcde = here->B3SOIDDcdbox; - } - } - - /* Extrinsic : Sidewall fringing S/D charge */ - here->B3SOIDDqse += pParam->B3SOIDDcsesw * T10; - here->B3SOIDDgcse += pParam->B3SOIDDcsesw; - here->B3SOIDDqde += pParam->B3SOIDDcdesw * T11; - here->B3SOIDDgcde += pParam->B3SOIDDcdesw; - - /* All charge are mutliplied with type at the end, but qse and qde - have true polarity => so pre-mutliplied with type */ - here->B3SOIDDqse *= model->B3SOIDDtype; - here->B3SOIDDqde *= model->B3SOIDDtype; - } - - here->B3SOIDDxc = Xc; - here->B3SOIDDcbb = Cbb; - here->B3SOIDDcbd = Cbd; - here->B3SOIDDcbg = Cbg; - here->B3SOIDDqbf = Qbf; - here->B3SOIDDqjs = qjs; - here->B3SOIDDqjd = qjd; - - if (here->B3SOIDDdebugMod == -1) - ChargeComputationNeeded = 0; - - /* - * check convergence - */ - if ((here->B3SOIDDoff == 0) || (!(ckt->CKTmode & MODEINITFIX))) - { if (Check == 1) - { ckt->CKTnoncon++; -if (here->B3SOIDDdebugMod > 2) - fprintf(fpdebug, "Check is on, noncon=%d\n", ckt->CKTnoncon++); - } - } - - *(ckt->CKTstate0 + here->B3SOIDDvg) = vg; - *(ckt->CKTstate0 + here->B3SOIDDvd) = vd; - *(ckt->CKTstate0 + here->B3SOIDDvs) = vs; - *(ckt->CKTstate0 + here->B3SOIDDvp) = vp; - *(ckt->CKTstate0 + here->B3SOIDDve) = ve; - - *(ckt->CKTstate0 + here->B3SOIDDvbs) = vbs; - *(ckt->CKTstate0 + here->B3SOIDDvbd) = vbd; - *(ckt->CKTstate0 + here->B3SOIDDvgs) = vgs; - *(ckt->CKTstate0 + here->B3SOIDDvds) = vds; - *(ckt->CKTstate0 + here->B3SOIDDves) = ves; - *(ckt->CKTstate0 + here->B3SOIDDvps) = vps; - *(ckt->CKTstate0 + here->B3SOIDDdeltemp) = delTemp; - - /* bulk and channel charge plus overlaps */ - - if (!ChargeComputationNeeded) - goto line850; -#ifndef NOBYPASS - line755: -#endif - ag0 = ckt->CKTag[0]; - - T0 = vgd + DELTA_1; - T1 = sqrt(T0 * T0 + 4.0 * DELTA_1); - T2 = 0.5 * (T0 - T1); - - T3 = pParam->B3SOIDDweffCV * pParam->B3SOIDDcgdl; - T4 = sqrt(1.0 - 4.0 * T2 / pParam->B3SOIDDckappa); - cgdo = pParam->B3SOIDDcgdo + T3 - T3 * (1.0 - 1.0 / T4) - * (0.5 - 0.5 * T0 / T1); - qgdo = (pParam->B3SOIDDcgdo + T3) * vgd - T3 * (T2 - + 0.5 * pParam->B3SOIDDckappa * (T4 - 1.0)); - - T0 = vgs + DELTA_1; - T1 = sqrt(T0 * T0 + 4.0 * DELTA_1); - T2 = 0.5 * (T0 - T1); - T3 = pParam->B3SOIDDweffCV * pParam->B3SOIDDcgsl; - T4 = sqrt(1.0 - 4.0 * T2 / pParam->B3SOIDDckappa); - cgso = pParam->B3SOIDDcgso + T3 - T3 * (1.0 - 1.0 / T4) - * (0.5 - 0.5 * T0 / T1); - qgso = (pParam->B3SOIDDcgso + T3) * vgs - T3 * (T2 - + 0.5 * pParam->B3SOIDDckappa * (T4 - 1.0)); - - - if (here->B3SOIDDmode > 0) - { gcdgb = (here->B3SOIDDcdgb - cgdo) * ag0; - gcddb = (here->B3SOIDDcddb + cgdo + here->B3SOIDDgcde) * ag0; - gcdsb = here->B3SOIDDcdsb * ag0; - gcdeb = (here->B3SOIDDcdeb - here->B3SOIDDgcde) * ag0; - gcdT = model->B3SOIDDtype * here->B3SOIDDcdT * ag0; - - gcsgb = -(here->B3SOIDDcggb + here->B3SOIDDcbgb + here->B3SOIDDcdgb - + here->B3SOIDDcegb + cgso) * ag0; - gcsdb = -(here->B3SOIDDcgdb + here->B3SOIDDcbdb + here->B3SOIDDcddb - + here->B3SOIDDcedb) * ag0; - gcssb = (cgso + here->B3SOIDDgcse - (here->B3SOIDDcgsb + here->B3SOIDDcbsb - + here->B3SOIDDcdsb + here->B3SOIDDcesb)) * ag0; - gcseb = -(here->B3SOIDDgcse + here->B3SOIDDcgeb + here->B3SOIDDcbeb + here->B3SOIDDcdeb - + here->B3SOIDDceeb) * ag0; - gcsT = - model->B3SOIDDtype * (here->B3SOIDDcgT + here->B3SOIDDcbT + here->B3SOIDDcdT - + here->B3SOIDDceT) * ag0; - - gcggb = (here->B3SOIDDcggb + cgdo + cgso + pParam->B3SOIDDcgeo) * ag0; - gcgdb = (here->B3SOIDDcgdb - cgdo) * ag0; - gcgsb = (here->B3SOIDDcgsb - cgso) * ag0; - gcgeb = (here->B3SOIDDcgeb - pParam->B3SOIDDcgeo) * ag0; - gcgT = model->B3SOIDDtype * here->B3SOIDDcgT * ag0; - - gcbgb = here->B3SOIDDcbgb * ag0; - gcbdb = here->B3SOIDDcbdb * ag0; - gcbsb = here->B3SOIDDcbsb * ag0; - gcbeb = here->B3SOIDDcbeb * ag0; - gcbT = model->B3SOIDDtype * here->B3SOIDDcbT * ag0; - - gcegb = (here->B3SOIDDcegb - pParam->B3SOIDDcgeo) * ag0; - gcedb = (here->B3SOIDDcedb - here->B3SOIDDgcde) * ag0; - gcesb = (here->B3SOIDDcesb - here->B3SOIDDgcse) * ag0; - gceeb = (here->B3SOIDDgcse + here->B3SOIDDgcde + - here->B3SOIDDceeb + pParam->B3SOIDDcgeo) * ag0; - - gceT = model->B3SOIDDtype * here->B3SOIDDceT * ag0; - - gcTt = pParam->B3SOIDDcth * ag0; - - sxpart = 0.6; - dxpart = 0.4; - - /* Lump the overlap capacitance and S/D parasitics */ - qgd = qgdo; - qgs = qgso; - qge = pParam->B3SOIDDcgeo * vge; - qgate += qgd + qgs + qge; - qdrn += here->B3SOIDDqde - qgd; - qsub -= qge + here->B3SOIDDqse + here->B3SOIDDqde; - qsrc = -(qgate + qbody + qdrn + qsub); - } - else - { gcsgb = (here->B3SOIDDcdgb - cgso) * ag0; - gcssb = (here->B3SOIDDcddb + cgso + here->B3SOIDDgcse) * ag0; - gcsdb = here->B3SOIDDcdsb * ag0; - gcseb = (here->B3SOIDDcdeb - here->B3SOIDDgcse) * ag0; - gcsT = model->B3SOIDDtype * here->B3SOIDDcdT * ag0; - - gcdgb = -(here->B3SOIDDcggb + here->B3SOIDDcbgb + here->B3SOIDDcdgb - + here->B3SOIDDcegb + cgdo) * ag0; - gcdsb = -(here->B3SOIDDcgdb + here->B3SOIDDcbdb + here->B3SOIDDcddb - + here->B3SOIDDcedb) * ag0; - gcddb = (cgdo + here->B3SOIDDgcde - (here->B3SOIDDcgsb + here->B3SOIDDcbsb - + here->B3SOIDDcdsb + here->B3SOIDDcesb)) * ag0; - gcdeb = -(here->B3SOIDDgcde + here->B3SOIDDcgeb + here->B3SOIDDcbeb + here->B3SOIDDcdeb - + here->B3SOIDDceeb) * ag0; - gcdT = - model->B3SOIDDtype * (here->B3SOIDDcgT + here->B3SOIDDcbT - + here->B3SOIDDcdT + here->B3SOIDDceT) * ag0; - - gcggb = (here->B3SOIDDcggb + cgdo + cgso + pParam->B3SOIDDcgeo) * ag0; - gcgsb = (here->B3SOIDDcgdb - cgso) * ag0; - gcgdb = (here->B3SOIDDcgsb - cgdo) * ag0; - gcgeb = (here->B3SOIDDcgeb - pParam->B3SOIDDcgeo) * ag0; - gcgT = model->B3SOIDDtype * here->B3SOIDDcgT * ag0; - - gcbgb = here->B3SOIDDcbgb * ag0; - gcbsb = here->B3SOIDDcbdb * ag0; - gcbdb = here->B3SOIDDcbsb * ag0; - gcbeb = here->B3SOIDDcbeb * ag0; - gcbT = model->B3SOIDDtype * here->B3SOIDDcbT * ag0; - - gcegb = (here->B3SOIDDcegb - pParam->B3SOIDDcgeo) * ag0; - gcesb = (here->B3SOIDDcedb - here->B3SOIDDgcse) * ag0; - gcedb = (here->B3SOIDDcesb - here->B3SOIDDgcde) * ag0; - gceeb = (here->B3SOIDDceeb + pParam->B3SOIDDcgeo + - here->B3SOIDDgcse + here->B3SOIDDgcde) * ag0; - gceT = model->B3SOIDDtype * here->B3SOIDDceT * ag0; - - gcTt = pParam->B3SOIDDcth * ag0; - - dxpart = 0.6; - sxpart = 0.4; - - /* Lump the overlap capacitance */ - qgd = qgdo; - qgs = qgso; - qge = pParam->B3SOIDDcgeo * vge; - qgate += qgd + qgs + qge; - qsrc = qdrn - qgs + here->B3SOIDDqse; - qsub -= qge + here->B3SOIDDqse + here->B3SOIDDqde; - qdrn = -(qgate + qbody + qsrc + qsub); - } - - here->B3SOIDDcgdo = cgdo; - here->B3SOIDDcgso = cgso; - - if (ByPass) goto line860; - - *(ckt->CKTstate0 + here->B3SOIDDqe) = qsub; - *(ckt->CKTstate0 + here->B3SOIDDqg) = qgate; - *(ckt->CKTstate0 + here->B3SOIDDqd) = qdrn; - *(ckt->CKTstate0 + here->B3SOIDDqb) = qbody; - if ((model->B3SOIDDshMod == 1) && (here->B3SOIDDrth0!=0.0)) - *(ckt->CKTstate0 + here->B3SOIDDqth) = pParam->B3SOIDDcth * delTemp; - - - /* store small signal parameters */ - if (ckt->CKTmode & MODEINITSMSIG) - { goto line1000; - } - if (!ChargeComputationNeeded) - goto line850; - - - if (ckt->CKTmode & MODEINITTRAN) - { *(ckt->CKTstate1 + here->B3SOIDDqb) = - *(ckt->CKTstate0 + here->B3SOIDDqb); - *(ckt->CKTstate1 + here->B3SOIDDqg) = - *(ckt->CKTstate0 + here->B3SOIDDqg); - *(ckt->CKTstate1 + here->B3SOIDDqd) = - *(ckt->CKTstate0 + here->B3SOIDDqd); - *(ckt->CKTstate1 + here->B3SOIDDqe) = - *(ckt->CKTstate0 + here->B3SOIDDqe); - *(ckt->CKTstate1 + here->B3SOIDDqth) = - *(ckt->CKTstate0 + here->B3SOIDDqth); - } - - error = NIintegrate(ckt, &geq, &ceq,0.0,here->B3SOIDDqb); - if (error) return(error); - error = NIintegrate(ckt, &geq, &ceq, 0.0, here->B3SOIDDqg); - if (error) return(error); - error = NIintegrate(ckt,&geq, &ceq, 0.0, here->B3SOIDDqd); - if (error) return(error); - error = NIintegrate(ckt,&geq, &ceq, 0.0, here->B3SOIDDqe); - if (error) return(error); - if ((model->B3SOIDDshMod == 1) && (here->B3SOIDDrth0!=0.0)) - { - error = NIintegrate(ckt, &geq, &ceq, 0.0, here->B3SOIDDqth); - if (error) return (error); - } - - goto line860; - - line850: - /* initialize to zero charge conductance and current */ - ceqqe = ceqqg = ceqqb = ceqqd = ceqqth= 0.0; - - gcdgb = gcddb = gcdsb = gcdeb = gcdT = 0.0; - gcsgb = gcsdb = gcssb = gcseb = gcsT = 0.0; - gcggb = gcgdb = gcgsb = gcgeb = gcgT = 0.0; - gcbgb = gcbdb = gcbsb = gcbeb = gcbT = 0.0; - gcegb = gcedb = gceeb = gcesb = gceT = 0.0; - gcTt = 0.0; - - sxpart = (1.0 - (dxpart = (here->B3SOIDDmode > 0) ? 0.4 : 0.6)); - - goto line900; - - line860: - /* evaluate equivalent charge current */ - - cqgate = *(ckt->CKTstate0 + here->B3SOIDDcqg); - cqbody = *(ckt->CKTstate0 + here->B3SOIDDcqb); - cqdrn = *(ckt->CKTstate0 + here->B3SOIDDcqd); - cqsub = *(ckt->CKTstate0 + here->B3SOIDDcqe); - cqtemp = *(ckt->CKTstate0 + here->B3SOIDDcqth); - - here->B3SOIDDcb += cqbody; - here->B3SOIDDcd += cqdrn; - - ceqqg = cqgate - gcggb * vgb + gcgdb * vbd + gcgsb * vbs - - gcgeb * veb - gcgT * delTemp; - ceqqb = cqbody - gcbgb * vgb + gcbdb * vbd + gcbsb * vbs - - gcbeb * veb - gcbT * delTemp; - ceqqd = cqdrn - gcdgb * vgb + gcddb * vbd + gcdsb * vbs - - gcdeb * veb - gcdT * delTemp; - ceqqe = cqsub - gcegb * vgb + gcedb * vbd + gcesb * vbs - - gceeb * veb - gceT * delTemp;; - ceqqth = cqtemp - gcTt * delTemp; - - if (ckt->CKTmode & MODEINITTRAN) - { *(ckt->CKTstate1 + here->B3SOIDDcqe) = - *(ckt->CKTstate0 + here->B3SOIDDcqe); - *(ckt->CKTstate1 + here->B3SOIDDcqb) = - *(ckt->CKTstate0 + here->B3SOIDDcqb); - *(ckt->CKTstate1 + here->B3SOIDDcqg) = - *(ckt->CKTstate0 + here->B3SOIDDcqg); - *(ckt->CKTstate1 + here->B3SOIDDcqd) = - *(ckt->CKTstate0 + here->B3SOIDDcqd); - *(ckt->CKTstate1 + here->B3SOIDDcqth) = - *(ckt->CKTstate0 + here->B3SOIDDcqth); - } - - /* - * load current vector - */ - line900: - - m = here->B3SOIDDm; - - if (here->B3SOIDDmode >= 0) - { Gm = here->B3SOIDDgm; - Gmbs = here->B3SOIDDgmbs; - Gme = here->B3SOIDDgme; - GmT = model->B3SOIDDtype * here->B3SOIDDgmT; - FwdSum = Gm + Gmbs + Gme; - RevSum = 0.0; - cdreq = model->B3SOIDDtype * (here->B3SOIDDcdrain - here->B3SOIDDgds * vds - - Gm * vgs - Gmbs * vbs - Gme * ves - GmT * delTemp); - /* ceqbs now is compatible with cdreq, ie. going in is +ve */ - /* Equivalent current source from the diode */ - ceqbs = here->B3SOIDDcjs; - ceqbd = here->B3SOIDDcjd; - /* Current going in is +ve */ - ceqbody = -here->B3SOIDDcbody; - ceqth = here->B3SOIDDcth; - ceqbodcon = here->B3SOIDDcbodcon; - - gbbg = -here->B3SOIDDgbgs; - gbbdp = -here->B3SOIDDgbds; - gbbb = -here->B3SOIDDgbbs; - gbbe = -here->B3SOIDDgbes; - gbbp = -here->B3SOIDDgbps; - gbbT = -model->B3SOIDDtype * here->B3SOIDDgbT; - gbbsp = - ( gbbg + gbbdp + gbbb + gbbe + gbbp); - - gddpg = -here->B3SOIDDgjdg; - gddpdp = -here->B3SOIDDgjdd; - gddpb = -here->B3SOIDDgjdb; - gddpe = -here->B3SOIDDgjde; - gddpT = -model->B3SOIDDtype * here->B3SOIDDgjdT; - gddpsp = - ( gddpg + gddpdp + gddpb + gddpe); - - gsspg = -here->B3SOIDDgjsg; - gsspdp = -here->B3SOIDDgjsd; - gsspb = -here->B3SOIDDgjsb; - gsspe = 0.0; - gsspT = -model->B3SOIDDtype * here->B3SOIDDgjsT; - gsspsp = - (gsspg + gsspdp + gsspb + gsspe); - - gppg = -here->B3SOIDDgbpgs; - gppdp = -here->B3SOIDDgbpds; - gppb = -here->B3SOIDDgbpbs; - gppe = -here->B3SOIDDgbpes; - gppp = -here->B3SOIDDgbpps; - gppT = -model->B3SOIDDtype * here->B3SOIDDgbpT; - gppsp = - (gppg + gppdp + gppb + gppe + gppp); - - gTtg = here->B3SOIDDgtempg; - gTtb = here->B3SOIDDgtempb; - gTte = here->B3SOIDDgtempe; - gTtdp = here->B3SOIDDgtempd; - gTtt = here->B3SOIDDgtempT; - gTtsp = - (gTtg + gTtb + gTte + gTtdp); - } - else - { Gm = -here->B3SOIDDgm; - Gmbs = -here->B3SOIDDgmbs; - Gme = -here->B3SOIDDgme; - GmT = -model->B3SOIDDtype * here->B3SOIDDgmT; - FwdSum = 0.0; - RevSum = -(Gm + Gmbs + Gme); - cdreq = -model->B3SOIDDtype * (here->B3SOIDDcdrain + here->B3SOIDDgds*vds - + Gm * vgd + Gmbs * vbd + Gme * (ves - vds) + GmT * delTemp); - ceqbs = here->B3SOIDDcjd; - ceqbd = here->B3SOIDDcjs; - /* Current going in is +ve */ - ceqbody = -here->B3SOIDDcbody; - ceqth = here->B3SOIDDcth; - ceqbodcon = here->B3SOIDDcbodcon; - - gbbg = -here->B3SOIDDgbgs; - gbbb = -here->B3SOIDDgbbs; - gbbe = -here->B3SOIDDgbes; - gbbp = -here->B3SOIDDgbps; - gbbsp = -here->B3SOIDDgbds; - gbbT = -model->B3SOIDDtype * here->B3SOIDDgbT; - gbbdp = - ( gbbg + gbbsp + gbbb + gbbe + gbbp); - - gddpg = -here->B3SOIDDgjsg; - gddpsp = -here->B3SOIDDgjsd; - gddpb = -here->B3SOIDDgjsb; - gddpe = 0.0; - gddpT = -model->B3SOIDDtype * here->B3SOIDDgjsT; - gddpdp = - (gddpg + gddpsp + gddpb + gddpe); - - gsspg = -here->B3SOIDDgjdg; - gsspsp = -here->B3SOIDDgjdd; - gsspb = -here->B3SOIDDgjdb; - gsspe = -here->B3SOIDDgjde; - gsspT = -model->B3SOIDDtype * here->B3SOIDDgjdT; - gsspdp = - ( gsspg + gsspsp + gsspb + gsspe); - - gppg = -here->B3SOIDDgbpgs; - gppsp = -here->B3SOIDDgbpds; - gppb = -here->B3SOIDDgbpbs; - gppe = -here->B3SOIDDgbpes; - gppp = -here->B3SOIDDgbpps; - gppT = -model->B3SOIDDtype * here->B3SOIDDgbpT; - gppdp = - (gppg + gppsp + gppb + gppe + gppp); - - gTtg = here->B3SOIDDgtempg; - gTtb = here->B3SOIDDgtempb; - gTte = here->B3SOIDDgtempe; - gTtsp = here->B3SOIDDgtempd; - gTtt = here->B3SOIDDgtempT; - gTtdp = - (gTtg + gTtb + gTte + gTtsp); - } - - if (model->B3SOIDDtype < 0) - { - ceqbodcon = -ceqbodcon; - ceqbody = -ceqbody; - ceqbs = -ceqbs; - ceqbd = -ceqbd; - ceqqg = -ceqqg; - ceqqb = -ceqqb; - ceqqd = -ceqqd; - ceqqe = -ceqqe; - } - - (*(ckt->CKTrhs + here->B3SOIDDbNode) -= m * (ceqbody+ceqqb)); - - (*(ckt->CKTrhs + here->B3SOIDDgNode) -= m * ceqqg); - (*(ckt->CKTrhs + here->B3SOIDDdNodePrime) += m * (ceqbd - cdreq - ceqqd)); - (*(ckt->CKTrhs + here->B3SOIDDsNodePrime) += m * ((cdreq + ceqbs + ceqqg - + ceqqb + ceqqd + ceqqe))); - (*(ckt->CKTrhs + here->B3SOIDDeNode) -= m * ceqqe); - - if (here->B3SOIDDbodyMod == 1) { - (*(ckt->CKTrhs + here->B3SOIDDpNode) += m * ceqbodcon); - } - - if (selfheat) { - (*(ckt->CKTrhs + here->B3SOIDDtempNode) -= m * (ceqth + ceqqth)); - } - - - - if ((here->B3SOIDDdebugMod > 1) || (here->B3SOIDDdebugMod == -1)) - { - *(ckt->CKTrhs + here->B3SOIDDvbsNode) = here->B3SOIDDvbsdio; - *(ckt->CKTrhs + here->B3SOIDDidsNode) = here->B3SOIDDids; - *(ckt->CKTrhs + here->B3SOIDDicNode) = here->B3SOIDDic; - *(ckt->CKTrhs + here->B3SOIDDibsNode) = here->B3SOIDDibs; - *(ckt->CKTrhs + here->B3SOIDDibdNode) = here->B3SOIDDibd; - *(ckt->CKTrhs + here->B3SOIDDiiiNode) = here->B3SOIDDiii; - *(ckt->CKTrhs + here->B3SOIDDigidlNode) = here->B3SOIDDigidl; - *(ckt->CKTrhs + here->B3SOIDDitunNode) = here->B3SOIDDitun; - *(ckt->CKTrhs + here->B3SOIDDibpNode) = here->B3SOIDDibp; - *(ckt->CKTrhs + here->B3SOIDDabeffNode) = here->B3SOIDDabeff; - *(ckt->CKTrhs + here->B3SOIDDvbs0effNode) = here->B3SOIDDvbs0eff; - *(ckt->CKTrhs + here->B3SOIDDvbseffNode) = here->B3SOIDDvbseff; - *(ckt->CKTrhs + here->B3SOIDDxcNode) = here->B3SOIDDxc; - *(ckt->CKTrhs + here->B3SOIDDcbbNode) = here->B3SOIDDcbb; - *(ckt->CKTrhs + here->B3SOIDDcbdNode) = here->B3SOIDDcbd; - *(ckt->CKTrhs + here->B3SOIDDcbgNode) = here->B3SOIDDcbg; - *(ckt->CKTrhs + here->B3SOIDDqbfNode) = here->B3SOIDDqbf; - *(ckt->CKTrhs + here->B3SOIDDqjsNode) = here->B3SOIDDqjs; - *(ckt->CKTrhs + here->B3SOIDDqjdNode) = here->B3SOIDDqjd; - - /* clean up last */ - *(ckt->CKTrhs + here->B3SOIDDgmNode) = Gm; - *(ckt->CKTrhs + here->B3SOIDDgmbsNode) = Gmbs; - *(ckt->CKTrhs + here->B3SOIDDgdsNode) = Gds; - *(ckt->CKTrhs + here->B3SOIDDgmeNode) = Gme; - *(ckt->CKTrhs + here->B3SOIDDqdNode) = qdrn; - *(ckt->CKTrhs + here->B3SOIDDcbeNode) = Cbe; - *(ckt->CKTrhs + here->B3SOIDDvbs0teffNode) = Vbs0teff; - *(ckt->CKTrhs + here->B3SOIDDvthNode) = here->B3SOIDDvon; - *(ckt->CKTrhs + here->B3SOIDDvgsteffNode) = Vgsteff; - *(ckt->CKTrhs + here->B3SOIDDxcsatNode) = Xcsat; - *(ckt->CKTrhs + here->B3SOIDDqaccNode) = -Qac0; - *(ckt->CKTrhs + here->B3SOIDDqsub0Node) = Qsub0; - *(ckt->CKTrhs + here->B3SOIDDqsubs1Node) = Qsubs1; - *(ckt->CKTrhs + here->B3SOIDDqsubs2Node) = Qsubs2; - *(ckt->CKTrhs + here->B3SOIDDvdscvNode) = VdsCV; - *(ckt->CKTrhs + here->B3SOIDDvcscvNode) = VcsCV; - *(ckt->CKTrhs + here->B3SOIDDqgNode) = qgate; - *(ckt->CKTrhs + here->B3SOIDDqbNode) = qbody; - *(ckt->CKTrhs + here->B3SOIDDqeNode) = qsub; - *(ckt->CKTrhs + here->B3SOIDDdum1Node) = here->B3SOIDDdum1; - *(ckt->CKTrhs + here->B3SOIDDdum2Node) = here->B3SOIDDdum2; - *(ckt->CKTrhs + here->B3SOIDDdum3Node) = here->B3SOIDDdum3; - *(ckt->CKTrhs + here->B3SOIDDdum4Node) = here->B3SOIDDdum4; - *(ckt->CKTrhs + here->B3SOIDDdum5Node) = here->B3SOIDDdum5; - /* end clean up last */ - } - - - /* - * load y matrix - */ - (*(here->B3SOIDDEgPtr) += m * gcegb); - (*(here->B3SOIDDEdpPtr) += m * gcedb); - (*(here->B3SOIDDEspPtr) += m * gcesb); - (*(here->B3SOIDDGePtr) += m * gcgeb); - (*(here->B3SOIDDDPePtr) += m * (Gme + gddpe + gcdeb)); - (*(here->B3SOIDDSPePtr) += m * (gsspe - Gme + gcseb)); - - Gmin = ckt->CKTgmin * 1e-6; - (*(here->B3SOIDDEbPtr) -= m * (gcegb + gcedb + gcesb + gceeb)); - (*(here->B3SOIDDGbPtr) -= m * (gcggb + gcgdb + gcgsb + gcgeb)); - (*(here->B3SOIDDDPbPtr) -= m * (-gddpb - Gmbs + gcdgb + gcddb + gcdeb + gcdsb)); - (*(here->B3SOIDDSPbPtr) -= m * (-gsspb + Gmbs + gcsgb + gcsdb + gcseb + gcssb)); - (*(here->B3SOIDDBePtr) += m * (gbbe + gcbeb)); - (*(here->B3SOIDDBgPtr) += m * (gcbgb + gbbg)); - (*(here->B3SOIDDBdpPtr) += m * (gcbdb + gbbdp)); - (*(here->B3SOIDDBspPtr) += m * (gcbsb + gbbsp - Gmin)); - (*(here->B3SOIDDBbPtr) += m * (gbbb - gcbgb - gcbdb - gcbsb - gcbeb + Gmin)) ; - - (*(here->B3SOIDDEePtr) += m * gceeb); - - (*(here->B3SOIDDGgPtr) += m * (gcggb + ckt->CKTgmin)); - (*(here->B3SOIDDGdpPtr) += m * (gcgdb - ckt->CKTgmin)); - (*(here->B3SOIDDGspPtr) += m * gcgsb ); - - (*(here->B3SOIDDDPgPtr) += m * ((Gm + gcdgb) + gddpg - ckt->CKTgmin)); - (*(here->B3SOIDDDPdpPtr) += m * ((here->B3SOIDDdrainConductance - + here->B3SOIDDgds + gddpdp - + RevSum + gcddb) + ckt->CKTgmin)); - (*(here->B3SOIDDDPspPtr) -= m * (-gddpsp + here->B3SOIDDgds + FwdSum - gcdsb)); - - (*(here->B3SOIDDDPdPtr) -= m * here->B3SOIDDdrainConductance); - - (*(here->B3SOIDDSPgPtr) += m * (gcsgb - Gm + gsspg)); - (*(here->B3SOIDDSPdpPtr) -= m * (here->B3SOIDDgds - gsspdp + RevSum - gcsdb)); - (*(here->B3SOIDDSPspPtr) += m * (here->B3SOIDDsourceConductance - + here->B3SOIDDgds + gsspsp - + FwdSum + gcssb)); - (*(here->B3SOIDDSPsPtr) -= m * here->B3SOIDDsourceConductance); - - - (*(here->B3SOIDDDdPtr) += m * here->B3SOIDDdrainConductance); - (*(here->B3SOIDDDdpPtr) -= m * here->B3SOIDDdrainConductance); - - - (*(here->B3SOIDDSsPtr) += m * here->B3SOIDDsourceConductance); - (*(here->B3SOIDDSspPtr) -= m * here->B3SOIDDsourceConductance); - - if (here->B3SOIDDbodyMod == 1) { - (*(here->B3SOIDDBpPtr) -= m * gppp); - (*(here->B3SOIDDPbPtr) += m * gppb); - (*(here->B3SOIDDPpPtr) += m * gppp); - (*(here->B3SOIDDPgPtr) += m * gppg); - (*(here->B3SOIDDPdpPtr) += m * gppdp); - (*(here->B3SOIDDPspPtr) += m * gppsp); - (*(here->B3SOIDDPePtr) += m * gppe); - } - - if (selfheat) - { - (*(here->B3SOIDDDPtempPtr) += m * (GmT + gddpT + gcdT)); - (*(here->B3SOIDDSPtempPtr) += m * (-GmT + gsspT + gcsT)); - (*(here->B3SOIDDBtempPtr) += m * (gbbT + gcbT)); - (*(here->B3SOIDDEtempPtr) += m * (gceT)); - (*(here->B3SOIDDGtempPtr) += m * (gcgT)); - if (here->B3SOIDDbodyMod == 1) { - (*(here->B3SOIDDPtempPtr) += m * gppT); - } - (*(here->B3SOIDDTemptempPtr) += m * (gTtt + 1/pParam->B3SOIDDrth + gcTt)); - (*(here->B3SOIDDTempgPtr) += m * gTtg); - (*(here->B3SOIDDTempbPtr) += m * gTtb); - (*(here->B3SOIDDTempePtr) += m * gTte); - (*(here->B3SOIDDTempdpPtr) += m * gTtdp); - (*(here->B3SOIDDTempspPtr) += m * gTtsp); - } - - if ((here->B3SOIDDdebugMod > 1) || (here->B3SOIDDdebugMod == -1)) - { - *(here->B3SOIDDVbsPtr) += m * 1; - *(here->B3SOIDDIdsPtr) += m * 1; - *(here->B3SOIDDIcPtr) += m * 1; - *(here->B3SOIDDIbsPtr) += m * 1; - *(here->B3SOIDDIbdPtr) += m * 1; - *(here->B3SOIDDIiiPtr) += m * 1; - *(here->B3SOIDDIgidlPtr) += m * 1; - *(here->B3SOIDDItunPtr) += m * 1; - *(here->B3SOIDDIbpPtr) += m * 1; - *(here->B3SOIDDAbeffPtr) += m * 1; - *(here->B3SOIDDVbs0effPtr) += m * 1; - *(here->B3SOIDDVbseffPtr) += m * 1; - *(here->B3SOIDDXcPtr) += m * 1; - *(here->B3SOIDDCbgPtr) += m * 1; - *(here->B3SOIDDCbbPtr) += m * 1; - *(here->B3SOIDDCbdPtr) += m * 1; - *(here->B3SOIDDqbPtr) += m * 1; - *(here->B3SOIDDQbfPtr) += m * 1; - *(here->B3SOIDDQjsPtr) += m * 1; - *(here->B3SOIDDQjdPtr) += m * 1; - - /* clean up last */ - *(here->B3SOIDDGmPtr) += m * 1; - *(here->B3SOIDDGmbsPtr) += m * 1; - *(here->B3SOIDDGdsPtr) += m * 1; - *(here->B3SOIDDGmePtr) += m * 1; - *(here->B3SOIDDVbs0teffPtr) += m * 1; - *(here->B3SOIDDVgsteffPtr) += m * 1; - *(here->B3SOIDDCbePtr) += m * 1; - *(here->B3SOIDDVthPtr) += m * 1; - *(here->B3SOIDDXcsatPtr) += m * 1; - *(here->B3SOIDDVdscvPtr) += m * 1; - *(here->B3SOIDDVcscvPtr) += m * 1; - *(here->B3SOIDDQaccPtr) += m * 1; - *(here->B3SOIDDQsub0Ptr) += m * 1; - *(here->B3SOIDDQsubs1Ptr) += m * 1; - *(here->B3SOIDDQsubs2Ptr) += m * 1; - *(here->B3SOIDDqgPtr) += m * 1; - *(here->B3SOIDDqdPtr) += m * 1; - *(here->B3SOIDDqePtr) += m * 1; - *(here->B3SOIDDDum1Ptr) += m * 1; - *(here->B3SOIDDDum2Ptr) += m * 1; - *(here->B3SOIDDDum3Ptr) += m * 1; - *(here->B3SOIDDDum4Ptr) += m * 1; - *(here->B3SOIDDDum5Ptr) += m * 1; - /* end clean up last */ - } - - line1000: ; - -/* Here NaN will be detected in any conductance or equivalent current. Note - that nandetect is initialized within the "if" statements */ - - if ((nandetect = isnan (*(here->B3SOIDDGbPtr))) != 0) - { strcpy (nanmessage, "GbPtr"); } - else if ((nandetect = isnan (*(here->B3SOIDDEbPtr))) != 0) - { strcpy (nanmessage, "EbPtr"); } - else if ((nandetect = isnan (*(here->B3SOIDDDPbPtr))) != 0) - { strcpy (nanmessage, "DPbPtr"); } - else if ((nandetect = isnan (*(here->B3SOIDDSPbPtr))) != 0) - { strcpy (nanmessage, "SPbPtr"); } - else if ((nandetect = isnan (*(here->B3SOIDDBbPtr))) != 0) - { strcpy (nanmessage, "BbPtr"); } - else if ((nandetect = isnan (*(here->B3SOIDDBgPtr))) != 0) - { strcpy (nanmessage, "BgPtr"); } - else if ((nandetect = isnan (*(here->B3SOIDDBePtr))) != 0) - { strcpy (nanmessage, "BePtr"); } - else if ((nandetect = isnan (*(here->B3SOIDDBdpPtr))) != 0) - { strcpy (nanmessage, "BdpPtr"); } - else if ((nandetect = isnan (*(here->B3SOIDDBspPtr))) != 0) - { strcpy (nanmessage, "BspPtr"); } - - else if ((nandetect = isnan (*(here->B3SOIDDGgPtr))) != 0) - { strcpy (nanmessage, "GgPtr"); } - else if ((nandetect = isnan (*(here->B3SOIDDGdpPtr))) != 0) - { strcpy (nanmessage, "GdpPtr"); } - else if ((nandetect = isnan (*(here->B3SOIDDGspPtr))) != 0) - { strcpy (nanmessage, "GspPtr"); } - else if ((nandetect = isnan (*(here->B3SOIDDDPgPtr))) != 0) - { strcpy (nanmessage, "DPgPtr"); } - else if ((nandetect = isnan (*(here->B3SOIDDDPdpPtr))) != 0) - { strcpy (nanmessage, "DPdpPtr"); } - else if ((nandetect = isnan (*(here->B3SOIDDDPspPtr))) != 0) - { strcpy (nanmessage, "DPspPtr"); } - else if ((nandetect = isnan (*(here->B3SOIDDSPgPtr))) != 0) - { strcpy (nanmessage, "SPgPtr"); } - else if ((nandetect = isnan (*(here->B3SOIDDSPdpPtr))) != 0) - { strcpy (nanmessage, "SPdpPtr"); } - else if ((nandetect = isnan (*(here->B3SOIDDSPspPtr))) != 0) - { strcpy (nanmessage, "SPspPtr"); } - else if ((nandetect = isnan (*(here->B3SOIDDEePtr))) != 0) - { strcpy (nanmessage, "EePtr"); } - - /* At this point, nandetect = 0 if none of the - conductances checked so far are NaN */ - - if (nandetect == 0) - { - if ((nandetect = isnan (*(here->B3SOIDDEgPtr))) != 0) - { strcpy (nanmessage, "EgPtr"); } - else if ((nandetect = isnan (*(here->B3SOIDDEdpPtr))) != 0) - { strcpy (nanmessage, "EdpPtr"); } - else if ((nandetect = isnan (*(here->B3SOIDDEspPtr))) != 0) - { strcpy (nanmessage, "EspPtr"); } - else if ((nandetect = isnan (*(here->B3SOIDDGePtr))) != 0) - { strcpy (nanmessage, "GePtr"); } - else if ((nandetect = isnan (*(here->B3SOIDDDPePtr))) != 0) - { strcpy (nanmessage, "DPePtr"); } - else if ((nandetect = isnan (*(here->B3SOIDDSPePtr))) != 0) - { strcpy (nanmessage, "SPePtr"); } } - - /* Now check if self-heating caused NaN if nothing else - has so far (check tempnode current also) */ - - if (selfheat && nandetect == 0) - { - if ((nandetect = isnan (*(here->B3SOIDDTemptempPtr))) != 0) - { strcpy (nanmessage, "TemptempPtr"); } - else if ((nandetect = isnan (*(here->B3SOIDDTempgPtr))) != 0) - { strcpy (nanmessage, "TempgPtr"); } - else if ((nandetect = isnan (*(here->B3SOIDDTempbPtr))) != 0) - { strcpy (nanmessage, "TempbPtr"); } - else if ((nandetect = isnan (*(here->B3SOIDDTempePtr))) != 0) - { strcpy (nanmessage, "TempePtr"); } - else if ((nandetect = isnan (*(here->B3SOIDDTempdpPtr))) != 0) - { strcpy (nanmessage, "TempdpPtr"); } - else if ((nandetect = isnan (*(here->B3SOIDDTempspPtr))) != 0) - { strcpy (nanmessage, "TempspPtr"); } - else if ((nandetect = isnan (*(here->B3SOIDDGtempPtr))) != 0) - { strcpy (nanmessage, "GtempPtr"); } - else if ((nandetect = isnan (*(here->B3SOIDDDPtempPtr))) != 0) - { strcpy (nanmessage, "DPtempPtr"); } - else if ((nandetect = isnan (*(here->B3SOIDDSPtempPtr))) != 0) - { strcpy (nanmessage, "SPtempPtr"); } - else if ((nandetect = isnan (*(here->B3SOIDDEtempPtr))) != 0) - { strcpy (nanmessage, "EtempPtr"); } - else if ((nandetect = isnan (*(here->B3SOIDDBtempPtr))) != 0) - { strcpy (nanmessage, "BtempPtr"); } - else if ((nandetect = isnan (*(ckt->CKTrhs + here->B3SOIDDtempNode))) != 0) - { strcpy (nanmessage, "tempNode"); } - } - - /* Lastly, check all equivalent currents (tempnode is - checked above */ - - if (nandetect == 0) - { - if ((nandetect = isnan (*(ckt->CKTrhs - + here->B3SOIDDgNode))) != 0) - { strcpy (nanmessage, "gNode"); } - else if ((nandetect = isnan (*(ckt->CKTrhs - + here->B3SOIDDbNode))) != 0) - { strcpy (nanmessage, "bNode"); } - else if ((nandetect = isnan (*(ckt->CKTrhs - + here->B3SOIDDdNodePrime))) != 0) - { strcpy (nanmessage, "dpNode"); } - else if ((nandetect = isnan (*(ckt->CKTrhs - + here->B3SOIDDsNodePrime))) != 0) - { strcpy (nanmessage, "spNode"); } - else if ((nandetect = isnan (*(ckt->CKTrhs - + here->B3SOIDDeNode))) != 0) - { strcpy (nanmessage, "eNode"); } - } - - /* Now print error message if NaN detected. Note that - error will only be printed once (the first time it is - encountered) each time SPICE is run since nanfound is - static variable */ - - if (nanfound == 0 && nandetect) - { - fprintf(stderr, "Alberto says: YOU TURKEY! %s is NaN for instance %s at time %g!\n", nanmessage, here->B3SOIDDname, ckt->CKTtime); - nanfound = nandetect; - fprintf(stderr, " The program exit!\n"); - controlled_exit(EXIT_FAILURE); - } - - if (here->B3SOIDDdebugMod > 2) - { - fprintf(fpdebug, "Ids = %.4e, Ic = %.4e, cqdrn = %.4e, gmin=%.3e\n", - Ids, Ic, cqdrn, ckt->CKTgmin); - fprintf(fpdebug, "Iii = %.4e, Idgidl = %.4e, Ibs = %.14e\n", - Iii, Idgidl, Ibs); - fprintf(fpdebug, "Ibd = %.4e, Ibp = %.4e\n", Ibd, Ibp); - fprintf(fpdebug, "qbody = %.5e, qbf = %.5e, qbe = %.5e\n", - qbody, Qbf, -(Qe1+Qe2)); - fprintf(fpdebug, "qbs = %.5e, qbd = %.5e\n", qjs, qjd); - fprintf(fpdebug, "qdrn = %.5e, qinv = %.5e\n", qdrn, qinv); - - - - -/* I am trying to debug the convergence problems here by printing out - the entire Jacobian and equivalent current matrix */ - - - if (here->B3SOIDDdebugMod > 4) { - fprintf(fpdebug, "Ibtot = %.6e;\t Cbtot = %.6e;\n", Ibs+Ibp+Ibd-Iii-Idgidl-Isgidl, cqbody); - fprintf(fpdebug, "ceqg = %.6e;\t ceqb = %.6e;\t ceqdp = %.6e;\t ceqsp = %.6e;\n", - *(ckt->CKTrhs + here->B3SOIDDgNode), - *(ckt->CKTrhs + here->B3SOIDDbNode), - *(ckt->CKTrhs + here->B3SOIDDdNodePrime), - *(ckt->CKTrhs + here->B3SOIDDsNodePrime)); - fprintf(fpdebug, "ceqe = %.6e;\t ceqp = %.6e;\t ceqth = %.6e;\n", - *(ckt->CKTrhs + here->B3SOIDDeNode), - *(ckt->CKTrhs + here->B3SOIDDpNode), - *(ckt->CKTrhs + here->B3SOIDDtempNode)); - - fprintf(fpdebug, "Eg = %.5e;\t Edp = %.5e;\t Esp = %.5e;\t Eb = %.5e;\n", - *(here->B3SOIDDEgPtr), *(here->B3SOIDDEdpPtr), *(here->B3SOIDDEspPtr), - *(here->B3SOIDDEbPtr)); - fprintf(fpdebug, "Ee = %.5e;\t Gg = %.5e;\t Gdp = %.5e;\t Gsp = %.5e;\n", - *(here->B3SOIDDEePtr), - *(here->B3SOIDDGgPtr), - *(here->B3SOIDDGdpPtr), - *(here->B3SOIDDGspPtr)); - fprintf(fpdebug, "Gb = %.5e;\t Ge = %.5e;\t DPg = %.5e;\t DPdp = %.5e;\n", - *(here->B3SOIDDGbPtr), - *(here->B3SOIDDGePtr), - *(here->B3SOIDDDPgPtr), - *(here->B3SOIDDDPdpPtr)); - fprintf(fpdebug, "DPsp = %.5e;\t DPb = %.5e;\t DPe = %.5e;\t\n", - *(here->B3SOIDDDPspPtr), - *(here->B3SOIDDDPbPtr), - *(here->B3SOIDDDPePtr)); - fprintf(fpdebug, "DPd = %.5e;\t SPg = %.5e;\t SPdp = %.5e;\t SPsp = %.5e;\n", - *(here->B3SOIDDDPdPtr), - *(here->B3SOIDDSPgPtr), - *(here->B3SOIDDSPdpPtr), - *(here->B3SOIDDSPspPtr)); - fprintf(fpdebug, "SPb = %.5e;\t SPe = %.5e;\t SPs = %.5e;\n", - *(here->B3SOIDDSPbPtr), - *(here->B3SOIDDSPePtr), - *(here->B3SOIDDSPsPtr)); - fprintf(fpdebug, "Dd = %.5e;\t Ddp = %.5e;\t Ss = %.5e;\t Ssp = %.5e;\n", - *(here->B3SOIDDDdPtr), - *(here->B3SOIDDDdpPtr), - *(here->B3SOIDDSsPtr), - *(here->B3SOIDDSspPtr)); - fprintf(fpdebug, "Bg = %.5e;\t Bdp = %.5e;\t Bsp = %.5e;\t Bb = %.5e;\n", - *(here->B3SOIDDBgPtr), - *(here->B3SOIDDBdpPtr), - *(here->B3SOIDDBspPtr), - *(here->B3SOIDDBbPtr)); - fprintf(fpdebug, "Be = %.5e;\t Btot = %.5e;\t DPtot = %.5e;\n", - *(here->B3SOIDDBePtr), - *(here->B3SOIDDBgPtr) + *(here->B3SOIDDBdpPtr) - + *(here->B3SOIDDBspPtr) + *(here->B3SOIDDBbPtr) - + *(here->B3SOIDDBePtr), - *(here->B3SOIDDDPePtr) - + *(here->B3SOIDDDPgPtr) + *(here->B3SOIDDDPdpPtr) - + *(here->B3SOIDDDPspPtr) + *(here->B3SOIDDDPbPtr)); - if (selfheat) { - fprintf (fpdebug, "DPtemp = %.5e;\t SPtemp = %.5e;\t Btemp = %.5e;\n", - *(here->B3SOIDDDPtempPtr), *(here->B3SOIDDSPtempPtr), - *(here->B3SOIDDBtempPtr)); - fprintf (fpdebug, "Gtemp = %.5e;\t Etemp = %.5e;\n", - *(here->B3SOIDDGtempPtr), *(here->B3SOIDDEtempPtr)); - fprintf (fpdebug, "Tempg = %.5e;\t Tempdp = %.5e;\t Tempsp = %.5e;\t Tempb = %.5e;\n", - *(here->B3SOIDDTempgPtr), *(here->B3SOIDDTempdpPtr), - *(here->B3SOIDDTempspPtr), *(here->B3SOIDDTempbPtr)); - fprintf (fpdebug, "Tempe = %.5e;\t TempT = %.5e;\t Temptot = %.5e;\n", - *(here->B3SOIDDTempePtr), *(here->B3SOIDDTemptempPtr), - *(here->B3SOIDDTempgPtr) + *(here->B3SOIDDTempdpPtr) - + *(here->B3SOIDDTempspPtr)+ *(here->B3SOIDDTempbPtr) - + *(here->B3SOIDDTempePtr)); - } - - if (here->B3SOIDDbodyMod == 1) - { - fprintf(fpdebug, "ceqbodcon=%.5e;\t", ceqbodcon); - fprintf(fpdebug, "Bp = %.5e;\t Pb = %.5e;\t Pp = %.5e;\n", -gppp, gppb, gppp); - fprintf(fpdebug, "Pg=%.5e;\t Pdp=%.5e;\t Psp=%.5e;\t Pe=%.5e;\n", - gppg, gppdp, gppsp, gppe); - } -} - - if (here->B3SOIDDdebugMod > 3) - { - fprintf(fpdebug, "Vth = %.4f, Vbs0eff = %.8f, Vdsat = %.4f\n", - Vth, Vbs0eff, Vdsat); - fprintf(fpdebug, "ueff = %g, Vgsteff = %.4f, Vdseff = %.4f\n", - ueff, Vgsteff, Vdseff); - fprintf(fpdebug, "Vthfd = %.4f, Vbs0mos = %.4f, Vbs0 = %.4f\n", - Vthfd, Vbs0mos, Vbs0); - fprintf(fpdebug, "Vbs0t = %.4f, Vbsdio = %.8f\n", - Vbs0t, Vbsdio); - } - - fclose(fpdebug); - } - - here->B3SOIDDiterations++; /* increment the iteration counter */ - - } /* End of Mosfet Instance */ -} /* End of Model Instance */ - - -return(OK); -} - diff --git a/src/spicelib/devices/bsim3soi_dd/b3soiddmask.c b/src/spicelib/devices/bsim3soi_dd/b3soiddmask.c deleted file mode 100644 index ac5b2c7d6..000000000 --- a/src/spicelib/devices/bsim3soi_dd/b3soiddmask.c +++ /dev/null @@ -1,1206 +0,0 @@ -/********** -Copyright 1999 Regents of the University of California. All rights reserved. -Author: Weidong Liu and Pin Su Feb 1999 -Author: 1998 Samuel Fung, Dennis Sinitsky and Stephen Tang -Modified by Wei Jin 99/9/27 -File: b3soiddmask.c 98/5/01 -Modified by Paolo Nenzi 2002 -**********/ - - -#include "ngspice/ngspice.h" -#include "ngspice/ifsim.h" -#include "ngspice/cktdefs.h" -#include "ngspice/devdefs.h" -#include "b3soidddef.h" -#include "ngspice/sperror.h" -#include "ngspice/suffix.h" - -int -B3SOIDDmAsk(CKTcircuit *ckt, GENmodel *inst, int which, IFvalue *value) -{ - B3SOIDDmodel *model = (B3SOIDDmodel *)inst; - - NG_IGNORE(ckt); - - switch(which) - { case B3SOIDD_MOD_MOBMOD: - value->iValue = model->B3SOIDDmobMod; - return(OK); - case B3SOIDD_MOD_PARAMCHK: - value->iValue = model->B3SOIDDparamChk; - return(OK); - case B3SOIDD_MOD_BINUNIT: - value->iValue = model->B3SOIDDbinUnit; - return(OK); - case B3SOIDD_MOD_CAPMOD: - value->iValue = model->B3SOIDDcapMod; - return(OK); - case B3SOIDD_MOD_SHMOD: - value->iValue = model->B3SOIDDshMod; - return(OK); - case B3SOIDD_MOD_NOIMOD: - value->iValue = model->B3SOIDDnoiMod; - return(OK); - case B3SOIDD_MOD_VERSION : - value->rValue = model->B3SOIDDversion; - return(OK); - case B3SOIDD_MOD_TOX : - value->rValue = model->B3SOIDDtox; - return(OK); - case B3SOIDD_MOD_CDSC : - value->rValue = model->B3SOIDDcdsc; - return(OK); - case B3SOIDD_MOD_CDSCB : - value->rValue = model->B3SOIDDcdscb; - return(OK); - - case B3SOIDD_MOD_CDSCD : - value->rValue = model->B3SOIDDcdscd; - return(OK); - - case B3SOIDD_MOD_CIT : - value->rValue = model->B3SOIDDcit; - return(OK); - case B3SOIDD_MOD_NFACTOR : - value->rValue = model->B3SOIDDnfactor; - return(OK); - case B3SOIDD_MOD_VSAT: - value->rValue = model->B3SOIDDvsat; - return(OK); - case B3SOIDD_MOD_AT: - value->rValue = model->B3SOIDDat; - return(OK); - case B3SOIDD_MOD_A0: - value->rValue = model->B3SOIDDa0; - return(OK); - - case B3SOIDD_MOD_AGS: - value->rValue = model->B3SOIDDags; - return(OK); - - case B3SOIDD_MOD_A1: - value->rValue = model->B3SOIDDa1; - return(OK); - case B3SOIDD_MOD_A2: - value->rValue = model->B3SOIDDa2; - return(OK); - case B3SOIDD_MOD_KETA: - value->rValue = model->B3SOIDDketa; - return(OK); - case B3SOIDD_MOD_NSUB: - value->rValue = model->B3SOIDDnsub; - return(OK); - case B3SOIDD_MOD_NPEAK: - value->rValue = model->B3SOIDDnpeak; - return(OK); - case B3SOIDD_MOD_NGATE: - value->rValue = model->B3SOIDDngate; - return(OK); - case B3SOIDD_MOD_GAMMA1: - value->rValue = model->B3SOIDDgamma1; - return(OK); - case B3SOIDD_MOD_GAMMA2: - value->rValue = model->B3SOIDDgamma2; - return(OK); - case B3SOIDD_MOD_VBX: - value->rValue = model->B3SOIDDvbx; - return(OK); - case B3SOIDD_MOD_VBM: - value->rValue = model->B3SOIDDvbm; - return(OK); - case B3SOIDD_MOD_XT: - value->rValue = model->B3SOIDDxt; - return(OK); - case B3SOIDD_MOD_K1: - value->rValue = model->B3SOIDDk1; - return(OK); - case B3SOIDD_MOD_KT1: - value->rValue = model->B3SOIDDkt1; - return(OK); - case B3SOIDD_MOD_KT1L: - value->rValue = model->B3SOIDDkt1l; - return(OK); - case B3SOIDD_MOD_KT2 : - value->rValue = model->B3SOIDDkt2; - return(OK); - case B3SOIDD_MOD_K2 : - value->rValue = model->B3SOIDDk2; - return(OK); - case B3SOIDD_MOD_K3: - value->rValue = model->B3SOIDDk3; - return(OK); - case B3SOIDD_MOD_K3B: - value->rValue = model->B3SOIDDk3b; - return(OK); - case B3SOIDD_MOD_W0: - value->rValue = model->B3SOIDDw0; - return(OK); - case B3SOIDD_MOD_NLX: - value->rValue = model->B3SOIDDnlx; - return(OK); - case B3SOIDD_MOD_DVT0 : - value->rValue = model->B3SOIDDdvt0; - return(OK); - case B3SOIDD_MOD_DVT1 : - value->rValue = model->B3SOIDDdvt1; - return(OK); - case B3SOIDD_MOD_DVT2 : - value->rValue = model->B3SOIDDdvt2; - return(OK); - case B3SOIDD_MOD_DVT0W : - value->rValue = model->B3SOIDDdvt0w; - return(OK); - case B3SOIDD_MOD_DVT1W : - value->rValue = model->B3SOIDDdvt1w; - return(OK); - case B3SOIDD_MOD_DVT2W : - value->rValue = model->B3SOIDDdvt2w; - return(OK); - case B3SOIDD_MOD_DROUT : - value->rValue = model->B3SOIDDdrout; - return(OK); - case B3SOIDD_MOD_DSUB : - value->rValue = model->B3SOIDDdsub; - return(OK); - case B3SOIDD_MOD_VTH0: - value->rValue = model->B3SOIDDvth0; - return(OK); - case B3SOIDD_MOD_UA: - value->rValue = model->B3SOIDDua; - return(OK); - case B3SOIDD_MOD_UA1: - value->rValue = model->B3SOIDDua1; - return(OK); - case B3SOIDD_MOD_UB: - value->rValue = model->B3SOIDDub; - return(OK); - case B3SOIDD_MOD_UB1: - value->rValue = model->B3SOIDDub1; - return(OK); - case B3SOIDD_MOD_UC: - value->rValue = model->B3SOIDDuc; - return(OK); - case B3SOIDD_MOD_UC1: - value->rValue = model->B3SOIDDuc1; - return(OK); - case B3SOIDD_MOD_U0: - value->rValue = model->B3SOIDDu0; - return(OK); - case B3SOIDD_MOD_UTE: - value->rValue = model->B3SOIDDute; - return(OK); - case B3SOIDD_MOD_VOFF: - value->rValue = model->B3SOIDDvoff; - return(OK); - case B3SOIDD_MOD_DELTA: - value->rValue = model->B3SOIDDdelta; - return(OK); - case B3SOIDD_MOD_RDSW: - value->rValue = model->B3SOIDDrdsw; - return(OK); - case B3SOIDD_MOD_PRWG: - value->rValue = model->B3SOIDDprwg; - return(OK); - case B3SOIDD_MOD_PRWB: - value->rValue = model->B3SOIDDprwb; - return(OK); - case B3SOIDD_MOD_PRT: - value->rValue = model->B3SOIDDprt; - return(OK); - case B3SOIDD_MOD_ETA0: - value->rValue = model->B3SOIDDeta0; - return(OK); - case B3SOIDD_MOD_ETAB: - value->rValue = model->B3SOIDDetab; - return(OK); - case B3SOIDD_MOD_PCLM: - value->rValue = model->B3SOIDDpclm; - return(OK); - case B3SOIDD_MOD_PDIBL1: - value->rValue = model->B3SOIDDpdibl1; - return(OK); - case B3SOIDD_MOD_PDIBL2: - value->rValue = model->B3SOIDDpdibl2; - return(OK); - case B3SOIDD_MOD_PDIBLB: - value->rValue = model->B3SOIDDpdiblb; - return(OK); - case B3SOIDD_MOD_PVAG: - value->rValue = model->B3SOIDDpvag; - return(OK); - case B3SOIDD_MOD_WR: - value->rValue = model->B3SOIDDwr; - return(OK); - case B3SOIDD_MOD_DWG: - value->rValue = model->B3SOIDDdwg; - return(OK); - case B3SOIDD_MOD_DWB: - value->rValue = model->B3SOIDDdwb; - return(OK); - case B3SOIDD_MOD_B0: - value->rValue = model->B3SOIDDb0; - return(OK); - case B3SOIDD_MOD_B1: - value->rValue = model->B3SOIDDb1; - return(OK); - case B3SOIDD_MOD_ALPHA0: - value->rValue = model->B3SOIDDalpha0; - return(OK); - case B3SOIDD_MOD_ALPHA1: - value->rValue = model->B3SOIDDalpha1; - return(OK); - case B3SOIDD_MOD_BETA0: - value->rValue = model->B3SOIDDbeta0; - return(OK); - - case B3SOIDD_MOD_CGSL: - value->rValue = model->B3SOIDDcgsl; - return(OK); - case B3SOIDD_MOD_CGDL: - value->rValue = model->B3SOIDDcgdl; - return(OK); - case B3SOIDD_MOD_CKAPPA: - value->rValue = model->B3SOIDDckappa; - return(OK); - case B3SOIDD_MOD_CF: - value->rValue = model->B3SOIDDcf; - return(OK); - case B3SOIDD_MOD_CLC: - value->rValue = model->B3SOIDDclc; - return(OK); - case B3SOIDD_MOD_CLE: - value->rValue = model->B3SOIDDcle; - return(OK); - case B3SOIDD_MOD_DWC: - value->rValue = model->B3SOIDDdwc; - return(OK); - case B3SOIDD_MOD_DLC: - value->rValue = model->B3SOIDDdlc; - return(OK); - - case B3SOIDD_MOD_TBOX: - value->rValue = model->B3SOIDDtbox; - return(OK); - case B3SOIDD_MOD_TSI: - value->rValue = model->B3SOIDDtsi; - return(OK); - case B3SOIDD_MOD_KB1: - value->rValue = model->B3SOIDDkb1; - return(OK); - case B3SOIDD_MOD_KB3: - value->rValue = model->B3SOIDDkb3; - return(OK); - case B3SOIDD_MOD_DVBD0: - value->rValue = model->B3SOIDDdvbd0; - return(OK); - case B3SOIDD_MOD_DVBD1: - value->rValue = model->B3SOIDDdvbd1; - return(OK); - case B3SOIDD_MOD_DELP: - value->rValue = model->B3SOIDDdelp; - return(OK); - case B3SOIDD_MOD_VBSA: - value->rValue = model->B3SOIDDvbsa; - return(OK); - case B3SOIDD_MOD_RBODY: - value->rValue = model->B3SOIDDrbody; - return(OK); - case B3SOIDD_MOD_RBSH: - value->rValue = model->B3SOIDDrbsh; - return(OK); - case B3SOIDD_MOD_ADICE0: - value->rValue = model->B3SOIDDadice0; - return(OK); - case B3SOIDD_MOD_ABP: - value->rValue = model->B3SOIDDabp; - return(OK); - case B3SOIDD_MOD_MXC: - value->rValue = model->B3SOIDDmxc; - return(OK); - case B3SOIDD_MOD_RTH0: - value->rValue = model->B3SOIDDrth0; - return(OK); - case B3SOIDD_MOD_CTH0: - value->rValue = model->B3SOIDDcth0; - return(OK); - case B3SOIDD_MOD_AII: - value->rValue = model->B3SOIDDaii; - return(OK); - case B3SOIDD_MOD_BII: - value->rValue = model->B3SOIDDbii; - return(OK); - case B3SOIDD_MOD_CII: - value->rValue = model->B3SOIDDcii; - return(OK); - case B3SOIDD_MOD_DII: - value->rValue = model->B3SOIDDdii; - return(OK); - case B3SOIDD_MOD_NDIODE: - value->rValue = model->B3SOIDDndiode; - return(OK); - case B3SOIDD_MOD_NTUN: - value->rValue = model->B3SOIDDntun; - return(OK); - case B3SOIDD_MOD_ISBJT: - value->rValue = model->B3SOIDDisbjt; - return(OK); - case B3SOIDD_MOD_ISDIF: - value->rValue = model->B3SOIDDisdif; - return(OK); - case B3SOIDD_MOD_ISREC: - value->rValue = model->B3SOIDDisrec; - return(OK); - case B3SOIDD_MOD_ISTUN: - value->rValue = model->B3SOIDDistun; - return(OK); - case B3SOIDD_MOD_XBJT: - value->rValue = model->B3SOIDDxbjt; - return(OK); - case B3SOIDD_MOD_XREC: - value->rValue = model->B3SOIDDxrec; - return(OK); - case B3SOIDD_MOD_XTUN: - value->rValue = model->B3SOIDDxtun; - return(OK); - case B3SOIDD_MOD_EDL: - value->rValue = model->B3SOIDDedl; - return(OK); - case B3SOIDD_MOD_KBJT1: - value->rValue = model->B3SOIDDkbjt1; - return(OK); - case B3SOIDD_MOD_TT: - value->rValue = model->B3SOIDDtt; - return(OK); - case B3SOIDD_MOD_VSDTH: - value->rValue = model->B3SOIDDvsdth; - return(OK); - case B3SOIDD_MOD_VSDFB: - value->rValue = model->B3SOIDDvsdfb; - return(OK); - case B3SOIDD_MOD_CSDMIN: - value->rValue = model->B3SOIDDcsdmin; - return(OK); - case B3SOIDD_MOD_ASD: - value->rValue = model->B3SOIDDasd; - return(OK); - - case B3SOIDD_MOD_TNOM : - value->rValue = model->B3SOIDDtnom; - return(OK); - case B3SOIDD_MOD_CGSO: - value->rValue = model->B3SOIDDcgso; - return(OK); - case B3SOIDD_MOD_CGDO: - value->rValue = model->B3SOIDDcgdo; - return(OK); - case B3SOIDD_MOD_CGEO: - value->rValue = model->B3SOIDDcgeo; - return(OK); - case B3SOIDD_MOD_XPART: - value->rValue = model->B3SOIDDxpart; - return(OK); - case B3SOIDD_MOD_RSH: - value->rValue = model->B3SOIDDsheetResistance; - return(OK); - case B3SOIDD_MOD_PBSWG: - value->rValue = model->B3SOIDDGatesidewallJctPotential; - return(OK); - case B3SOIDD_MOD_MJSWG: - value->rValue = model->B3SOIDDbodyJctGateSideGradingCoeff; - return(OK); - case B3SOIDD_MOD_CJSWG: - value->rValue = model->B3SOIDDunitLengthGateSidewallJctCap; - return(OK); - case B3SOIDD_MOD_CSDESW: - value->rValue = model->B3SOIDDcsdesw; - return(OK); - case B3SOIDD_MOD_LINT: - value->rValue = model->B3SOIDDLint; - return(OK); - case B3SOIDD_MOD_LL: - value->rValue = model->B3SOIDDLl; - return(OK); - case B3SOIDD_MOD_LLN: - value->rValue = model->B3SOIDDLln; - return(OK); - case B3SOIDD_MOD_LW: - value->rValue = model->B3SOIDDLw; - return(OK); - case B3SOIDD_MOD_LWN: - value->rValue = model->B3SOIDDLwn; - return(OK); - case B3SOIDD_MOD_LWL: - value->rValue = model->B3SOIDDLwl; - return(OK); - case B3SOIDD_MOD_WINT: - value->rValue = model->B3SOIDDWint; - return(OK); - case B3SOIDD_MOD_WL: - value->rValue = model->B3SOIDDWl; - return(OK); - case B3SOIDD_MOD_WLN: - value->rValue = model->B3SOIDDWln; - return(OK); - case B3SOIDD_MOD_WW: - value->rValue = model->B3SOIDDWw; - return(OK); - case B3SOIDD_MOD_WWN: - value->rValue = model->B3SOIDDWwn; - return(OK); - case B3SOIDD_MOD_WWL: - value->rValue = model->B3SOIDDWwl; - return(OK); - case B3SOIDD_MOD_NOIA: - value->rValue = model->B3SOIDDoxideTrapDensityA; - return(OK); - case B3SOIDD_MOD_NOIB: - value->rValue = model->B3SOIDDoxideTrapDensityB; - return(OK); - case B3SOIDD_MOD_NOIC: - value->rValue = model->B3SOIDDoxideTrapDensityC; - return(OK); - case B3SOIDD_MOD_NOIF: - value->rValue = model->B3SOIDDnoif; - return(OK); - case B3SOIDD_MOD_EM: - value->rValue = model->B3SOIDDem; - return(OK); - case B3SOIDD_MOD_EF: - value->rValue = model->B3SOIDDef; - return(OK); - case B3SOIDD_MOD_AF: - value->rValue = model->B3SOIDDaf; - return(OK); - case B3SOIDD_MOD_KF: - value->rValue = model->B3SOIDDkf; - return(OK); - -/* Added for binning - START */ - /* Length Dependence */ - case B3SOIDD_MOD_LNPEAK: - value->rValue = model->B3SOIDDlnpeak; - return(OK); - case B3SOIDD_MOD_LNSUB: - value->rValue = model->B3SOIDDlnsub; - return(OK); - case B3SOIDD_MOD_LNGATE: - value->rValue = model->B3SOIDDlngate; - return(OK); - case B3SOIDD_MOD_LVTH0: - value->rValue = model->B3SOIDDlvth0; - return(OK); - case B3SOIDD_MOD_LK1: - value->rValue = model->B3SOIDDlk1; - return(OK); - case B3SOIDD_MOD_LK2: - value->rValue = model->B3SOIDDlk2; - return(OK); - case B3SOIDD_MOD_LK3: - value->rValue = model->B3SOIDDlk3; - return(OK); - case B3SOIDD_MOD_LK3B: - value->rValue = model->B3SOIDDlk3b; - return(OK); - case B3SOIDD_MOD_LVBSA: - value->rValue = model->B3SOIDDlvbsa; - return(OK); - case B3SOIDD_MOD_LDELP: - value->rValue = model->B3SOIDDldelp; - return(OK); - case B3SOIDD_MOD_LKB1: - value->rValue = model->B3SOIDDlkb1; - return(OK); - case B3SOIDD_MOD_LKB3: - value->rValue = model->B3SOIDDlkb3; - return(OK); - case B3SOIDD_MOD_LDVBD0: - value->rValue = model->B3SOIDDdvbd0; - return(OK); - case B3SOIDD_MOD_LDVBD1: - value->rValue = model->B3SOIDDdvbd1; - return(OK); - case B3SOIDD_MOD_LW0: - value->rValue = model->B3SOIDDlw0; - return(OK); - case B3SOIDD_MOD_LNLX: - value->rValue = model->B3SOIDDlnlx; - return(OK); - case B3SOIDD_MOD_LDVT0 : - value->rValue = model->B3SOIDDldvt0; - return(OK); - case B3SOIDD_MOD_LDVT1 : - value->rValue = model->B3SOIDDldvt1; - return(OK); - case B3SOIDD_MOD_LDVT2 : - value->rValue = model->B3SOIDDldvt2; - return(OK); - case B3SOIDD_MOD_LDVT0W : - value->rValue = model->B3SOIDDldvt0w; - return(OK); - case B3SOIDD_MOD_LDVT1W : - value->rValue = model->B3SOIDDldvt1w; - return(OK); - case B3SOIDD_MOD_LDVT2W : - value->rValue = model->B3SOIDDldvt2w; - return(OK); - case B3SOIDD_MOD_LU0: - value->rValue = model->B3SOIDDlu0; - return(OK); - case B3SOIDD_MOD_LUA: - value->rValue = model->B3SOIDDlua; - return(OK); - case B3SOIDD_MOD_LUB: - value->rValue = model->B3SOIDDlub; - return(OK); - case B3SOIDD_MOD_LUC: - value->rValue = model->B3SOIDDluc; - return(OK); - case B3SOIDD_MOD_LVSAT: - value->rValue = model->B3SOIDDlvsat; - return(OK); - case B3SOIDD_MOD_LA0: - value->rValue = model->B3SOIDDla0; - return(OK); - case B3SOIDD_MOD_LAGS: - value->rValue = model->B3SOIDDlags; - return(OK); - case B3SOIDD_MOD_LB0: - value->rValue = model->B3SOIDDlb0; - return(OK); - case B3SOIDD_MOD_LB1: - value->rValue = model->B3SOIDDlb1; - return(OK); - case B3SOIDD_MOD_LKETA: - value->rValue = model->B3SOIDDlketa; - return(OK); - case B3SOIDD_MOD_LABP: - value->rValue = model->B3SOIDDlabp; - return(OK); - case B3SOIDD_MOD_LMXC: - value->rValue = model->B3SOIDDlmxc; - return(OK); - case B3SOIDD_MOD_LADICE0: - value->rValue = model->B3SOIDDladice0; - return(OK); - case B3SOIDD_MOD_LA1: - value->rValue = model->B3SOIDDla1; - return(OK); - case B3SOIDD_MOD_LA2: - value->rValue = model->B3SOIDDla2; - return(OK); - case B3SOIDD_MOD_LRDSW: - value->rValue = model->B3SOIDDlrdsw; - return(OK); - case B3SOIDD_MOD_LPRWB: - value->rValue = model->B3SOIDDlprwb; - return(OK); - case B3SOIDD_MOD_LPRWG: - value->rValue = model->B3SOIDDlprwg; - return(OK); - case B3SOIDD_MOD_LWR: - value->rValue = model->B3SOIDDlwr; - return(OK); - case B3SOIDD_MOD_LNFACTOR : - value->rValue = model->B3SOIDDlnfactor; - return(OK); - case B3SOIDD_MOD_LDWG: - value->rValue = model->B3SOIDDldwg; - return(OK); - case B3SOIDD_MOD_LDWB: - value->rValue = model->B3SOIDDldwb; - return(OK); - case B3SOIDD_MOD_LVOFF: - value->rValue = model->B3SOIDDlvoff; - return(OK); - case B3SOIDD_MOD_LETA0: - value->rValue = model->B3SOIDDleta0; - return(OK); - case B3SOIDD_MOD_LETAB: - value->rValue = model->B3SOIDDletab; - return(OK); - case B3SOIDD_MOD_LDSUB : - value->rValue = model->B3SOIDDldsub; - return(OK); - case B3SOIDD_MOD_LCIT : - value->rValue = model->B3SOIDDlcit; - return(OK); - case B3SOIDD_MOD_LCDSC : - value->rValue = model->B3SOIDDlcdsc; - return(OK); - case B3SOIDD_MOD_LCDSCB : - value->rValue = model->B3SOIDDlcdscb; - return(OK); - case B3SOIDD_MOD_LCDSCD : - value->rValue = model->B3SOIDDlcdscd; - return(OK); - case B3SOIDD_MOD_LPCLM: - value->rValue = model->B3SOIDDlpclm; - return(OK); - case B3SOIDD_MOD_LPDIBL1: - value->rValue = model->B3SOIDDlpdibl1; - return(OK); - case B3SOIDD_MOD_LPDIBL2: - value->rValue = model->B3SOIDDlpdibl2; - return(OK); - case B3SOIDD_MOD_LPDIBLB: - value->rValue = model->B3SOIDDlpdiblb; - return(OK); - case B3SOIDD_MOD_LDROUT : - value->rValue = model->B3SOIDDldrout; - return(OK); - case B3SOIDD_MOD_LPVAG: - value->rValue = model->B3SOIDDlpvag; - return(OK); - case B3SOIDD_MOD_LDELTA: - value->rValue = model->B3SOIDDldelta; - return(OK); - case B3SOIDD_MOD_LAII: - value->rValue = model->B3SOIDDlaii; - return(OK); - case B3SOIDD_MOD_LBII: - value->rValue = model->B3SOIDDlbii; - return(OK); - case B3SOIDD_MOD_LCII: - value->rValue = model->B3SOIDDlcii; - return(OK); - case B3SOIDD_MOD_LDII: - value->rValue = model->B3SOIDDldii; - return(OK); - case B3SOIDD_MOD_LALPHA0: - value->rValue = model->B3SOIDDlalpha0; - return(OK); - case B3SOIDD_MOD_LALPHA1: - value->rValue = model->B3SOIDDlalpha1; - return(OK); - case B3SOIDD_MOD_LBETA0: - value->rValue = model->B3SOIDDlbeta0; - return(OK); - case B3SOIDD_MOD_LAGIDL: - value->rValue = model->B3SOIDDlagidl; - return(OK); - case B3SOIDD_MOD_LBGIDL: - value->rValue = model->B3SOIDDlbgidl; - return(OK); - case B3SOIDD_MOD_LNGIDL: - value->rValue = model->B3SOIDDlngidl; - return(OK); - case B3SOIDD_MOD_LNTUN: - value->rValue = model->B3SOIDDlntun; - return(OK); - case B3SOIDD_MOD_LNDIODE: - value->rValue = model->B3SOIDDlndiode; - return(OK); - case B3SOIDD_MOD_LISBJT: - value->rValue = model->B3SOIDDlisbjt; - return(OK); - case B3SOIDD_MOD_LISDIF: - value->rValue = model->B3SOIDDlisdif; - return(OK); - case B3SOIDD_MOD_LISREC: - value->rValue = model->B3SOIDDlisrec; - return(OK); - case B3SOIDD_MOD_LISTUN: - value->rValue = model->B3SOIDDlistun; - return(OK); - case B3SOIDD_MOD_LEDL: - value->rValue = model->B3SOIDDledl; - return(OK); - case B3SOIDD_MOD_LKBJT1: - value->rValue = model->B3SOIDDlkbjt1; - return(OK); - /* CV Model */ - case B3SOIDD_MOD_LVSDFB: - value->rValue = model->B3SOIDDlvsdfb; - return(OK); - case B3SOIDD_MOD_LVSDTH: - value->rValue = model->B3SOIDDlvsdth; - return(OK); - /* Width Dependence */ - case B3SOIDD_MOD_WNPEAK: - value->rValue = model->B3SOIDDwnpeak; - return(OK); - case B3SOIDD_MOD_WNSUB: - value->rValue = model->B3SOIDDwnsub; - return(OK); - case B3SOIDD_MOD_WNGATE: - value->rValue = model->B3SOIDDwngate; - return(OK); - case B3SOIDD_MOD_WVTH0: - value->rValue = model->B3SOIDDwvth0; - return(OK); - case B3SOIDD_MOD_WK1: - value->rValue = model->B3SOIDDwk1; - return(OK); - case B3SOIDD_MOD_WK2: - value->rValue = model->B3SOIDDwk2; - return(OK); - case B3SOIDD_MOD_WK3: - value->rValue = model->B3SOIDDwk3; - return(OK); - case B3SOIDD_MOD_WK3B: - value->rValue = model->B3SOIDDwk3b; - return(OK); - case B3SOIDD_MOD_WVBSA: - value->rValue = model->B3SOIDDwvbsa; - return(OK); - case B3SOIDD_MOD_WDELP: - value->rValue = model->B3SOIDDwdelp; - return(OK); - case B3SOIDD_MOD_WKB1: - value->rValue = model->B3SOIDDwkb1; - return(OK); - case B3SOIDD_MOD_WKB3: - value->rValue = model->B3SOIDDwkb3; - return(OK); - case B3SOIDD_MOD_WDVBD0: - value->rValue = model->B3SOIDDdvbd0; - return(OK); - case B3SOIDD_MOD_WDVBD1: - value->rValue = model->B3SOIDDdvbd1; - return(OK); - case B3SOIDD_MOD_WW0: - value->rValue = model->B3SOIDDww0; - return(OK); - case B3SOIDD_MOD_WNLX: - value->rValue = model->B3SOIDDwnlx; - return(OK); - case B3SOIDD_MOD_WDVT0 : - value->rValue = model->B3SOIDDwdvt0; - return(OK); - case B3SOIDD_MOD_WDVT1 : - value->rValue = model->B3SOIDDwdvt1; - return(OK); - case B3SOIDD_MOD_WDVT2 : - value->rValue = model->B3SOIDDwdvt2; - return(OK); - case B3SOIDD_MOD_WDVT0W : - value->rValue = model->B3SOIDDwdvt0w; - return(OK); - case B3SOIDD_MOD_WDVT1W : - value->rValue = model->B3SOIDDwdvt1w; - return(OK); - case B3SOIDD_MOD_WDVT2W : - value->rValue = model->B3SOIDDwdvt2w; - return(OK); - case B3SOIDD_MOD_WU0: - value->rValue = model->B3SOIDDwu0; - return(OK); - case B3SOIDD_MOD_WUA: - value->rValue = model->B3SOIDDwua; - return(OK); - case B3SOIDD_MOD_WUB: - value->rValue = model->B3SOIDDwub; - return(OK); - case B3SOIDD_MOD_WUC: - value->rValue = model->B3SOIDDwuc; - return(OK); - case B3SOIDD_MOD_WVSAT: - value->rValue = model->B3SOIDDwvsat; - return(OK); - case B3SOIDD_MOD_WA0: - value->rValue = model->B3SOIDDwa0; - return(OK); - case B3SOIDD_MOD_WAGS: - value->rValue = model->B3SOIDDwags; - return(OK); - case B3SOIDD_MOD_WB0: - value->rValue = model->B3SOIDDwb0; - return(OK); - case B3SOIDD_MOD_WB1: - value->rValue = model->B3SOIDDwb1; - return(OK); - case B3SOIDD_MOD_WKETA: - value->rValue = model->B3SOIDDwketa; - return(OK); - case B3SOIDD_MOD_WABP: - value->rValue = model->B3SOIDDwabp; - return(OK); - case B3SOIDD_MOD_WMXC: - value->rValue = model->B3SOIDDwmxc; - return(OK); - case B3SOIDD_MOD_WADICE0: - value->rValue = model->B3SOIDDwadice0; - return(OK); - case B3SOIDD_MOD_WA1: - value->rValue = model->B3SOIDDwa1; - return(OK); - case B3SOIDD_MOD_WA2: - value->rValue = model->B3SOIDDwa2; - return(OK); - case B3SOIDD_MOD_WRDSW: - value->rValue = model->B3SOIDDwrdsw; - return(OK); - case B3SOIDD_MOD_WPRWB: - value->rValue = model->B3SOIDDwprwb; - return(OK); - case B3SOIDD_MOD_WPRWG: - value->rValue = model->B3SOIDDwprwg; - return(OK); - case B3SOIDD_MOD_WWR: - value->rValue = model->B3SOIDDwwr; - return(OK); - case B3SOIDD_MOD_WNFACTOR : - value->rValue = model->B3SOIDDwnfactor; - return(OK); - case B3SOIDD_MOD_WDWG: - value->rValue = model->B3SOIDDwdwg; - return(OK); - case B3SOIDD_MOD_WDWB: - value->rValue = model->B3SOIDDwdwb; - return(OK); - case B3SOIDD_MOD_WVOFF: - value->rValue = model->B3SOIDDwvoff; - return(OK); - case B3SOIDD_MOD_WETA0: - value->rValue = model->B3SOIDDweta0; - return(OK); - case B3SOIDD_MOD_WETAB: - value->rValue = model->B3SOIDDwetab; - return(OK); - case B3SOIDD_MOD_WDSUB : - value->rValue = model->B3SOIDDwdsub; - return(OK); - case B3SOIDD_MOD_WCIT : - value->rValue = model->B3SOIDDwcit; - return(OK); - case B3SOIDD_MOD_WCDSC : - value->rValue = model->B3SOIDDwcdsc; - return(OK); - case B3SOIDD_MOD_WCDSCB : - value->rValue = model->B3SOIDDwcdscb; - return(OK); - case B3SOIDD_MOD_WCDSCD : - value->rValue = model->B3SOIDDwcdscd; - return(OK); - case B3SOIDD_MOD_WPCLM: - value->rValue = model->B3SOIDDwpclm; - return(OK); - case B3SOIDD_MOD_WPDIBL1: - value->rValue = model->B3SOIDDwpdibl1; - return(OK); - case B3SOIDD_MOD_WPDIBL2: - value->rValue = model->B3SOIDDwpdibl2; - return(OK); - case B3SOIDD_MOD_WPDIBLB: - value->rValue = model->B3SOIDDwpdiblb; - return(OK); - case B3SOIDD_MOD_WDROUT : - value->rValue = model->B3SOIDDwdrout; - return(OK); - case B3SOIDD_MOD_WPVAG: - value->rValue = model->B3SOIDDwpvag; - return(OK); - case B3SOIDD_MOD_WDELTA: - value->rValue = model->B3SOIDDwdelta; - return(OK); - case B3SOIDD_MOD_WAII: - value->rValue = model->B3SOIDDwaii; - return(OK); - case B3SOIDD_MOD_WBII: - value->rValue = model->B3SOIDDwbii; - return(OK); - case B3SOIDD_MOD_WCII: - value->rValue = model->B3SOIDDwcii; - return(OK); - case B3SOIDD_MOD_WDII: - value->rValue = model->B3SOIDDwdii; - return(OK); - case B3SOIDD_MOD_WALPHA0: - value->rValue = model->B3SOIDDwalpha0; - return(OK); - case B3SOIDD_MOD_WALPHA1: - value->rValue = model->B3SOIDDwalpha1; - return(OK); - case B3SOIDD_MOD_WBETA0: - value->rValue = model->B3SOIDDwbeta0; - return(OK); - case B3SOIDD_MOD_WAGIDL: - value->rValue = model->B3SOIDDwagidl; - return(OK); - case B3SOIDD_MOD_WBGIDL: - value->rValue = model->B3SOIDDwbgidl; - return(OK); - case B3SOIDD_MOD_WNGIDL: - value->rValue = model->B3SOIDDwngidl; - return(OK); - case B3SOIDD_MOD_WNTUN: - value->rValue = model->B3SOIDDwntun; - return(OK); - case B3SOIDD_MOD_WNDIODE: - value->rValue = model->B3SOIDDwndiode; - return(OK); - case B3SOIDD_MOD_WISBJT: - value->rValue = model->B3SOIDDwisbjt; - return(OK); - case B3SOIDD_MOD_WISDIF: - value->rValue = model->B3SOIDDwisdif; - return(OK); - case B3SOIDD_MOD_WISREC: - value->rValue = model->B3SOIDDwisrec; - return(OK); - case B3SOIDD_MOD_WISTUN: - value->rValue = model->B3SOIDDwistun; - return(OK); - case B3SOIDD_MOD_WEDL: - value->rValue = model->B3SOIDDwedl; - return(OK); - case B3SOIDD_MOD_WKBJT1: - value->rValue = model->B3SOIDDwkbjt1; - return(OK); - /* CV Model */ - case B3SOIDD_MOD_WVSDFB: - value->rValue = model->B3SOIDDwvsdfb; - return(OK); - case B3SOIDD_MOD_WVSDTH: - value->rValue = model->B3SOIDDwvsdth; - return(OK); - /* Cross-term Dependence */ - case B3SOIDD_MOD_PNPEAK: - value->rValue = model->B3SOIDDpnpeak; - return(OK); - case B3SOIDD_MOD_PNSUB: - value->rValue = model->B3SOIDDpnsub; - return(OK); - case B3SOIDD_MOD_PNGATE: - value->rValue = model->B3SOIDDpngate; - return(OK); - case B3SOIDD_MOD_PVTH0: - value->rValue = model->B3SOIDDpvth0; - return(OK); - case B3SOIDD_MOD_PK1: - value->rValue = model->B3SOIDDpk1; - return(OK); - case B3SOIDD_MOD_PK2: - value->rValue = model->B3SOIDDpk2; - return(OK); - case B3SOIDD_MOD_PK3: - value->rValue = model->B3SOIDDpk3; - return(OK); - case B3SOIDD_MOD_PK3B: - value->rValue = model->B3SOIDDpk3b; - return(OK); - case B3SOIDD_MOD_PVBSA: - value->rValue = model->B3SOIDDpvbsa; - return(OK); - case B3SOIDD_MOD_PDELP: - value->rValue = model->B3SOIDDpdelp; - return(OK); - case B3SOIDD_MOD_PKB1: - value->rValue = model->B3SOIDDpkb1; - return(OK); - case B3SOIDD_MOD_PKB3: - value->rValue = model->B3SOIDDpkb3; - return(OK); - case B3SOIDD_MOD_PDVBD0: - value->rValue = model->B3SOIDDdvbd0; - return(OK); - case B3SOIDD_MOD_PDVBD1: - value->rValue = model->B3SOIDDdvbd1; - return(OK); - case B3SOIDD_MOD_PW0: - value->rValue = model->B3SOIDDpw0; - return(OK); - case B3SOIDD_MOD_PNLX: - value->rValue = model->B3SOIDDpnlx; - return(OK); - case B3SOIDD_MOD_PDVT0 : - value->rValue = model->B3SOIDDpdvt0; - return(OK); - case B3SOIDD_MOD_PDVT1 : - value->rValue = model->B3SOIDDpdvt1; - return(OK); - case B3SOIDD_MOD_PDVT2 : - value->rValue = model->B3SOIDDpdvt2; - return(OK); - case B3SOIDD_MOD_PDVT0W : - value->rValue = model->B3SOIDDpdvt0w; - return(OK); - case B3SOIDD_MOD_PDVT1W : - value->rValue = model->B3SOIDDpdvt1w; - return(OK); - case B3SOIDD_MOD_PDVT2W : - value->rValue = model->B3SOIDDpdvt2w; - return(OK); - case B3SOIDD_MOD_PU0: - value->rValue = model->B3SOIDDpu0; - return(OK); - case B3SOIDD_MOD_PUA: - value->rValue = model->B3SOIDDpua; - return(OK); - case B3SOIDD_MOD_PUB: - value->rValue = model->B3SOIDDpub; - return(OK); - case B3SOIDD_MOD_PUC: - value->rValue = model->B3SOIDDpuc; - return(OK); - case B3SOIDD_MOD_PVSAT: - value->rValue = model->B3SOIDDpvsat; - return(OK); - case B3SOIDD_MOD_PA0: - value->rValue = model->B3SOIDDpa0; - return(OK); - case B3SOIDD_MOD_PAGS: - value->rValue = model->B3SOIDDpags; - return(OK); - case B3SOIDD_MOD_PB0: - value->rValue = model->B3SOIDDpb0; - return(OK); - case B3SOIDD_MOD_PB1: - value->rValue = model->B3SOIDDpb1; - return(OK); - case B3SOIDD_MOD_PKETA: - value->rValue = model->B3SOIDDpketa; - return(OK); - case B3SOIDD_MOD_PABP: - value->rValue = model->B3SOIDDpabp; - return(OK); - case B3SOIDD_MOD_PMXC: - value->rValue = model->B3SOIDDpmxc; - return(OK); - case B3SOIDD_MOD_PADICE0: - value->rValue = model->B3SOIDDpadice0; - return(OK); - case B3SOIDD_MOD_PA1: - value->rValue = model->B3SOIDDpa1; - return(OK); - case B3SOIDD_MOD_PA2: - value->rValue = model->B3SOIDDpa2; - return(OK); - case B3SOIDD_MOD_PRDSW: - value->rValue = model->B3SOIDDprdsw; - return(OK); - case B3SOIDD_MOD_PPRWB: - value->rValue = model->B3SOIDDpprwb; - return(OK); - case B3SOIDD_MOD_PPRWG: - value->rValue = model->B3SOIDDpprwg; - return(OK); - case B3SOIDD_MOD_PWR: - value->rValue = model->B3SOIDDpwr; - return(OK); - case B3SOIDD_MOD_PNFACTOR : - value->rValue = model->B3SOIDDpnfactor; - return(OK); - case B3SOIDD_MOD_PDWG: - value->rValue = model->B3SOIDDpdwg; - return(OK); - case B3SOIDD_MOD_PDWB: - value->rValue = model->B3SOIDDpdwb; - return(OK); - case B3SOIDD_MOD_PVOFF: - value->rValue = model->B3SOIDDpvoff; - return(OK); - case B3SOIDD_MOD_PETA0: - value->rValue = model->B3SOIDDpeta0; - return(OK); - case B3SOIDD_MOD_PETAB: - value->rValue = model->B3SOIDDpetab; - return(OK); - case B3SOIDD_MOD_PDSUB : - value->rValue = model->B3SOIDDpdsub; - return(OK); - case B3SOIDD_MOD_PCIT : - value->rValue = model->B3SOIDDpcit; - return(OK); - case B3SOIDD_MOD_PCDSC : - value->rValue = model->B3SOIDDpcdsc; - return(OK); - case B3SOIDD_MOD_PCDSCB : - value->rValue = model->B3SOIDDpcdscb; - return(OK); - case B3SOIDD_MOD_PCDSCD : - value->rValue = model->B3SOIDDpcdscd; - return(OK); - case B3SOIDD_MOD_PPCLM: - value->rValue = model->B3SOIDDppclm; - return(OK); - case B3SOIDD_MOD_PPDIBL1: - value->rValue = model->B3SOIDDppdibl1; - return(OK); - case B3SOIDD_MOD_PPDIBL2: - value->rValue = model->B3SOIDDppdibl2; - return(OK); - case B3SOIDD_MOD_PPDIBLB: - value->rValue = model->B3SOIDDppdiblb; - return(OK); - case B3SOIDD_MOD_PDROUT : - value->rValue = model->B3SOIDDpdrout; - return(OK); - case B3SOIDD_MOD_PPVAG: - value->rValue = model->B3SOIDDppvag; - return(OK); - case B3SOIDD_MOD_PDELTA: - value->rValue = model->B3SOIDDpdelta; - return(OK); - case B3SOIDD_MOD_PAII: - value->rValue = model->B3SOIDDpaii; - return(OK); - case B3SOIDD_MOD_PBII: - value->rValue = model->B3SOIDDpbii; - return(OK); - case B3SOIDD_MOD_PCII: - value->rValue = model->B3SOIDDpcii; - return(OK); - case B3SOIDD_MOD_PDII: - value->rValue = model->B3SOIDDpdii; - return(OK); - case B3SOIDD_MOD_PALPHA0: - value->rValue = model->B3SOIDDpalpha0; - return(OK); - case B3SOIDD_MOD_PALPHA1: - value->rValue = model->B3SOIDDpalpha1; - return(OK); - case B3SOIDD_MOD_PBETA0: - value->rValue = model->B3SOIDDpbeta0; - return(OK); - case B3SOIDD_MOD_PAGIDL: - value->rValue = model->B3SOIDDpagidl; - return(OK); - case B3SOIDD_MOD_PBGIDL: - value->rValue = model->B3SOIDDpbgidl; - return(OK); - case B3SOIDD_MOD_PNGIDL: - value->rValue = model->B3SOIDDpngidl; - return(OK); - case B3SOIDD_MOD_PNTUN: - value->rValue = model->B3SOIDDpntun; - return(OK); - case B3SOIDD_MOD_PNDIODE: - value->rValue = model->B3SOIDDpndiode; - return(OK); - case B3SOIDD_MOD_PISBJT: - value->rValue = model->B3SOIDDpisbjt; - return(OK); - case B3SOIDD_MOD_PISDIF: - value->rValue = model->B3SOIDDpisdif; - return(OK); - case B3SOIDD_MOD_PISREC: - value->rValue = model->B3SOIDDpisrec; - return(OK); - case B3SOIDD_MOD_PISTUN: - value->rValue = model->B3SOIDDpistun; - return(OK); - case B3SOIDD_MOD_PEDL: - value->rValue = model->B3SOIDDpedl; - return(OK); - case B3SOIDD_MOD_PKBJT1: - value->rValue = model->B3SOIDDpkbjt1; - return(OK); - /* CV Model */ - case B3SOIDD_MOD_PVSDFB: - value->rValue = model->B3SOIDDpvsdfb; - return(OK); - case B3SOIDD_MOD_PVSDTH: - value->rValue = model->B3SOIDDpvsdth; - return(OK); -/* Added for binning - END */ - - default: - return(E_BADPARM); - } - /* NOTREACHED */ -} - - - diff --git a/src/spicelib/devices/bsim3soi_dd/b3soiddmpar.c b/src/spicelib/devices/bsim3soi_dd/b3soiddmpar.c deleted file mode 100644 index d0d03aee7..000000000 --- a/src/spicelib/devices/bsim3soi_dd/b3soiddmpar.c +++ /dev/null @@ -1,1626 +0,0 @@ -/********** -Copyright 1999 Regents of the University of California. All rights reserved. -Author: Weidong Liu and Pin Su Feb 1999 -Author: 1998 Samuel Fung, Dennis Sinitsky and Stephen Tang -Modified by Wei Jin 99/9/27 -File: b3soiddmpar.c 98/5/01 -Modified by Paolo Nenzi 2002 -**********/ - -/* - * Revision 2.1 99/9/27 Pin Su - * BSIMDD2.1 release - */ - -#include "ngspice/ngspice.h" -#include "b3soidddef.h" -#include "ngspice/ifsim.h" -#include "ngspice/sperror.h" -#include "ngspice/suffix.h" - - -int -B3SOIDDmParam(int param, IFvalue *value, GENmodel *inMod) -{ - B3SOIDDmodel *mod = (B3SOIDDmodel*)inMod; - switch(param) - { - - case B3SOIDD_MOD_MOBMOD : - mod->B3SOIDDmobMod = value->iValue; - mod->B3SOIDDmobModGiven = TRUE; - break; - case B3SOIDD_MOD_BINUNIT : - mod->B3SOIDDbinUnit = value->iValue; - mod->B3SOIDDbinUnitGiven = TRUE; - break; - case B3SOIDD_MOD_PARAMCHK : - mod->B3SOIDDparamChk = value->iValue; - mod->B3SOIDDparamChkGiven = TRUE; - break; - case B3SOIDD_MOD_CAPMOD : - mod->B3SOIDDcapMod = value->iValue; - mod->B3SOIDDcapModGiven = TRUE; - break; - case B3SOIDD_MOD_SHMOD : - mod->B3SOIDDshMod = value->iValue; - mod->B3SOIDDshModGiven = TRUE; - break; - case B3SOIDD_MOD_NOIMOD : - mod->B3SOIDDnoiMod = value->iValue; - mod->B3SOIDDnoiModGiven = TRUE; - break; - case B3SOIDD_MOD_VERSION : - mod->B3SOIDDversion = value->rValue; - mod->B3SOIDDversionGiven = TRUE; - break; - case B3SOIDD_MOD_TOX : - mod->B3SOIDDtox = value->rValue; - mod->B3SOIDDtoxGiven = TRUE; - break; - - case B3SOIDD_MOD_CDSC : - mod->B3SOIDDcdsc = value->rValue; - mod->B3SOIDDcdscGiven = TRUE; - break; - case B3SOIDD_MOD_CDSCB : - mod->B3SOIDDcdscb = value->rValue; - mod->B3SOIDDcdscbGiven = TRUE; - break; - - case B3SOIDD_MOD_CDSCD : - mod->B3SOIDDcdscd = value->rValue; - mod->B3SOIDDcdscdGiven = TRUE; - break; - - case B3SOIDD_MOD_CIT : - mod->B3SOIDDcit = value->rValue; - mod->B3SOIDDcitGiven = TRUE; - break; - case B3SOIDD_MOD_NFACTOR : - mod->B3SOIDDnfactor = value->rValue; - mod->B3SOIDDnfactorGiven = TRUE; - break; - case B3SOIDD_MOD_VSAT: - mod->B3SOIDDvsat = value->rValue; - mod->B3SOIDDvsatGiven = TRUE; - break; - case B3SOIDD_MOD_A0: - mod->B3SOIDDa0 = value->rValue; - mod->B3SOIDDa0Given = TRUE; - break; - - case B3SOIDD_MOD_AGS: - mod->B3SOIDDags= value->rValue; - mod->B3SOIDDagsGiven = TRUE; - break; - - case B3SOIDD_MOD_A1: - mod->B3SOIDDa1 = value->rValue; - mod->B3SOIDDa1Given = TRUE; - break; - case B3SOIDD_MOD_A2: - mod->B3SOIDDa2 = value->rValue; - mod->B3SOIDDa2Given = TRUE; - break; - case B3SOIDD_MOD_AT: - mod->B3SOIDDat = value->rValue; - mod->B3SOIDDatGiven = TRUE; - break; - case B3SOIDD_MOD_KETA: - mod->B3SOIDDketa = value->rValue; - mod->B3SOIDDketaGiven = TRUE; - break; - case B3SOIDD_MOD_NSUB: - mod->B3SOIDDnsub = value->rValue; - mod->B3SOIDDnsubGiven = TRUE; - break; - case B3SOIDD_MOD_NPEAK: - mod->B3SOIDDnpeak = value->rValue; - mod->B3SOIDDnpeakGiven = TRUE; - if (mod->B3SOIDDnpeak > 1.0e20) - mod->B3SOIDDnpeak *= 1.0e-6; - break; - case B3SOIDD_MOD_NGATE: - mod->B3SOIDDngate = value->rValue; - mod->B3SOIDDngateGiven = TRUE; - if (mod->B3SOIDDngate > 1.0e23) - mod->B3SOIDDngate *= 1.0e-6; - break; - case B3SOIDD_MOD_GAMMA1: - mod->B3SOIDDgamma1 = value->rValue; - mod->B3SOIDDgamma1Given = TRUE; - break; - case B3SOIDD_MOD_GAMMA2: - mod->B3SOIDDgamma2 = value->rValue; - mod->B3SOIDDgamma2Given = TRUE; - break; - case B3SOIDD_MOD_VBX: - mod->B3SOIDDvbx = value->rValue; - mod->B3SOIDDvbxGiven = TRUE; - break; - case B3SOIDD_MOD_VBM: - mod->B3SOIDDvbm = value->rValue; - mod->B3SOIDDvbmGiven = TRUE; - break; - case B3SOIDD_MOD_XT: - mod->B3SOIDDxt = value->rValue; - mod->B3SOIDDxtGiven = TRUE; - break; - case B3SOIDD_MOD_K1: - mod->B3SOIDDk1 = value->rValue; - mod->B3SOIDDk1Given = TRUE; - break; - case B3SOIDD_MOD_KT1: - mod->B3SOIDDkt1 = value->rValue; - mod->B3SOIDDkt1Given = TRUE; - break; - case B3SOIDD_MOD_KT1L: - mod->B3SOIDDkt1l = value->rValue; - mod->B3SOIDDkt1lGiven = TRUE; - break; - case B3SOIDD_MOD_KT2: - mod->B3SOIDDkt2 = value->rValue; - mod->B3SOIDDkt2Given = TRUE; - break; - case B3SOIDD_MOD_K2: - mod->B3SOIDDk2 = value->rValue; - mod->B3SOIDDk2Given = TRUE; - break; - case B3SOIDD_MOD_K3: - mod->B3SOIDDk3 = value->rValue; - mod->B3SOIDDk3Given = TRUE; - break; - case B3SOIDD_MOD_K3B: - mod->B3SOIDDk3b = value->rValue; - mod->B3SOIDDk3bGiven = TRUE; - break; - case B3SOIDD_MOD_NLX: - mod->B3SOIDDnlx = value->rValue; - mod->B3SOIDDnlxGiven = TRUE; - break; - case B3SOIDD_MOD_W0: - mod->B3SOIDDw0 = value->rValue; - mod->B3SOIDDw0Given = TRUE; - break; - case B3SOIDD_MOD_DVT0: - mod->B3SOIDDdvt0 = value->rValue; - mod->B3SOIDDdvt0Given = TRUE; - break; - case B3SOIDD_MOD_DVT1: - mod->B3SOIDDdvt1 = value->rValue; - mod->B3SOIDDdvt1Given = TRUE; - break; - case B3SOIDD_MOD_DVT2: - mod->B3SOIDDdvt2 = value->rValue; - mod->B3SOIDDdvt2Given = TRUE; - break; - case B3SOIDD_MOD_DVT0W: - mod->B3SOIDDdvt0w = value->rValue; - mod->B3SOIDDdvt0wGiven = TRUE; - break; - case B3SOIDD_MOD_DVT1W: - mod->B3SOIDDdvt1w = value->rValue; - mod->B3SOIDDdvt1wGiven = TRUE; - break; - case B3SOIDD_MOD_DVT2W: - mod->B3SOIDDdvt2w = value->rValue; - mod->B3SOIDDdvt2wGiven = TRUE; - break; - case B3SOIDD_MOD_DROUT: - mod->B3SOIDDdrout = value->rValue; - mod->B3SOIDDdroutGiven = TRUE; - break; - case B3SOIDD_MOD_DSUB: - mod->B3SOIDDdsub = value->rValue; - mod->B3SOIDDdsubGiven = TRUE; - break; - case B3SOIDD_MOD_VTH0: - mod->B3SOIDDvth0 = value->rValue; - mod->B3SOIDDvth0Given = TRUE; - break; - case B3SOIDD_MOD_UA: - mod->B3SOIDDua = value->rValue; - mod->B3SOIDDuaGiven = TRUE; - break; - case B3SOIDD_MOD_UA1: - mod->B3SOIDDua1 = value->rValue; - mod->B3SOIDDua1Given = TRUE; - break; - case B3SOIDD_MOD_UB: - mod->B3SOIDDub = value->rValue; - mod->B3SOIDDubGiven = TRUE; - break; - case B3SOIDD_MOD_UB1: - mod->B3SOIDDub1 = value->rValue; - mod->B3SOIDDub1Given = TRUE; - break; - case B3SOIDD_MOD_UC: - mod->B3SOIDDuc = value->rValue; - mod->B3SOIDDucGiven = TRUE; - break; - case B3SOIDD_MOD_UC1: - mod->B3SOIDDuc1 = value->rValue; - mod->B3SOIDDuc1Given = TRUE; - break; - case B3SOIDD_MOD_U0 : - mod->B3SOIDDu0 = value->rValue; - mod->B3SOIDDu0Given = TRUE; - break; - case B3SOIDD_MOD_UTE : - mod->B3SOIDDute = value->rValue; - mod->B3SOIDDuteGiven = TRUE; - break; - case B3SOIDD_MOD_VOFF: - mod->B3SOIDDvoff = value->rValue; - mod->B3SOIDDvoffGiven = TRUE; - break; - case B3SOIDD_MOD_DELTA : - mod->B3SOIDDdelta = value->rValue; - mod->B3SOIDDdeltaGiven = TRUE; - break; - case B3SOIDD_MOD_RDSW: - mod->B3SOIDDrdsw = value->rValue; - mod->B3SOIDDrdswGiven = TRUE; - break; - case B3SOIDD_MOD_PRWG: - mod->B3SOIDDprwg = value->rValue; - mod->B3SOIDDprwgGiven = TRUE; - break; - case B3SOIDD_MOD_PRWB: - mod->B3SOIDDprwb = value->rValue; - mod->B3SOIDDprwbGiven = TRUE; - break; - case B3SOIDD_MOD_PRT: - mod->B3SOIDDprt = value->rValue; - mod->B3SOIDDprtGiven = TRUE; - break; - case B3SOIDD_MOD_ETA0: - mod->B3SOIDDeta0 = value->rValue; - mod->B3SOIDDeta0Given = TRUE; - break; - case B3SOIDD_MOD_ETAB: - mod->B3SOIDDetab = value->rValue; - mod->B3SOIDDetabGiven = TRUE; - break; - case B3SOIDD_MOD_PCLM: - mod->B3SOIDDpclm = value->rValue; - mod->B3SOIDDpclmGiven = TRUE; - break; - case B3SOIDD_MOD_PDIBL1: - mod->B3SOIDDpdibl1 = value->rValue; - mod->B3SOIDDpdibl1Given = TRUE; - break; - case B3SOIDD_MOD_PDIBL2: - mod->B3SOIDDpdibl2 = value->rValue; - mod->B3SOIDDpdibl2Given = TRUE; - break; - case B3SOIDD_MOD_PDIBLB: - mod->B3SOIDDpdiblb = value->rValue; - mod->B3SOIDDpdiblbGiven = TRUE; - break; - case B3SOIDD_MOD_PVAG: - mod->B3SOIDDpvag = value->rValue; - mod->B3SOIDDpvagGiven = TRUE; - break; - case B3SOIDD_MOD_WR : - mod->B3SOIDDwr = value->rValue; - mod->B3SOIDDwrGiven = TRUE; - break; - case B3SOIDD_MOD_DWG : - mod->B3SOIDDdwg = value->rValue; - mod->B3SOIDDdwgGiven = TRUE; - break; - case B3SOIDD_MOD_DWB : - mod->B3SOIDDdwb = value->rValue; - mod->B3SOIDDdwbGiven = TRUE; - break; - case B3SOIDD_MOD_B0 : - mod->B3SOIDDb0 = value->rValue; - mod->B3SOIDDb0Given = TRUE; - break; - case B3SOIDD_MOD_B1 : - mod->B3SOIDDb1 = value->rValue; - mod->B3SOIDDb1Given = TRUE; - break; - case B3SOIDD_MOD_ALPHA0 : - mod->B3SOIDDalpha0 = value->rValue; - mod->B3SOIDDalpha0Given = TRUE; - break; - case B3SOIDD_MOD_ALPHA1 : - mod->B3SOIDDalpha1 = value->rValue; - mod->B3SOIDDalpha1Given = TRUE; - break; - case B3SOIDD_MOD_BETA0 : - mod->B3SOIDDbeta0 = value->rValue; - mod->B3SOIDDbeta0Given = TRUE; - break; - - case B3SOIDD_MOD_CGSL : - mod->B3SOIDDcgsl = value->rValue; - mod->B3SOIDDcgslGiven = TRUE; - break; - case B3SOIDD_MOD_CGDL : - mod->B3SOIDDcgdl = value->rValue; - mod->B3SOIDDcgdlGiven = TRUE; - break; - case B3SOIDD_MOD_CKAPPA : - mod->B3SOIDDckappa = value->rValue; - mod->B3SOIDDckappaGiven = TRUE; - break; - case B3SOIDD_MOD_CF : - mod->B3SOIDDcf = value->rValue; - mod->B3SOIDDcfGiven = TRUE; - break; - case B3SOIDD_MOD_CLC : - mod->B3SOIDDclc = value->rValue; - mod->B3SOIDDclcGiven = TRUE; - break; - case B3SOIDD_MOD_CLE : - mod->B3SOIDDcle = value->rValue; - mod->B3SOIDDcleGiven = TRUE; - break; - case B3SOIDD_MOD_DWC : - mod->B3SOIDDdwc = value->rValue; - mod->B3SOIDDdwcGiven = TRUE; - break; - case B3SOIDD_MOD_DLC : - mod->B3SOIDDdlc = value->rValue; - mod->B3SOIDDdlcGiven = TRUE; - break; - case B3SOIDD_MOD_TBOX : - mod->B3SOIDDtbox = value->rValue; - mod->B3SOIDDtboxGiven = TRUE; - break; - case B3SOIDD_MOD_TSI : - mod->B3SOIDDtsi = value->rValue; - mod->B3SOIDDtsiGiven = TRUE; - break; - case B3SOIDD_MOD_XJ : - mod->B3SOIDDxj = value->rValue; - mod->B3SOIDDxjGiven = TRUE; - break; - case B3SOIDD_MOD_KB1 : - mod->B3SOIDDkb1 = value->rValue; - mod->B3SOIDDkb1Given = TRUE; - break; - case B3SOIDD_MOD_KB3 : - mod->B3SOIDDkb3 = value->rValue; - mod->B3SOIDDkb3Given = TRUE; - break; - case B3SOIDD_MOD_DVBD0 : - mod->B3SOIDDdvbd0 = value->rValue; - mod->B3SOIDDdvbd0Given = TRUE; - break; - case B3SOIDD_MOD_DVBD1 : - mod->B3SOIDDdvbd1 = value->rValue; - mod->B3SOIDDdvbd1Given = TRUE; - break; - case B3SOIDD_MOD_DELP : - mod->B3SOIDDdelp = value->rValue; - mod->B3SOIDDdelpGiven = TRUE; - break; - case B3SOIDD_MOD_VBSA : - mod->B3SOIDDvbsa = value->rValue; - mod->B3SOIDDvbsaGiven = TRUE; - break; - case B3SOIDD_MOD_RBODY : - mod->B3SOIDDrbody = value->rValue; - mod->B3SOIDDrbodyGiven = TRUE; - break; - case B3SOIDD_MOD_RBSH : - mod->B3SOIDDrbsh = value->rValue; - mod->B3SOIDDrbshGiven = TRUE; - break; - case B3SOIDD_MOD_ADICE0 : - mod->B3SOIDDadice0 = value->rValue; - mod->B3SOIDDadice0Given = TRUE; - break; - case B3SOIDD_MOD_ABP : - mod->B3SOIDDabp = value->rValue; - mod->B3SOIDDabpGiven = TRUE; - break; - case B3SOIDD_MOD_MXC : - mod->B3SOIDDmxc = value->rValue; - mod->B3SOIDDmxcGiven = TRUE; - break; - case B3SOIDD_MOD_RTH0 : - mod->B3SOIDDrth0 = value->rValue; - mod->B3SOIDDrth0Given = TRUE; - break; - case B3SOIDD_MOD_CTH0 : - mod->B3SOIDDcth0 = value->rValue; - mod->B3SOIDDcth0Given = TRUE; - break; - case B3SOIDD_MOD_AII : - mod->B3SOIDDaii = value->rValue; - mod->B3SOIDDaiiGiven = TRUE; - break; - case B3SOIDD_MOD_BII : - mod->B3SOIDDbii = value->rValue; - mod->B3SOIDDbiiGiven = TRUE; - break; - case B3SOIDD_MOD_CII : - mod->B3SOIDDcii = value->rValue; - mod->B3SOIDDciiGiven = TRUE; - break; - case B3SOIDD_MOD_DII : - mod->B3SOIDDdii = value->rValue; - mod->B3SOIDDdiiGiven = TRUE; - break; - case B3SOIDD_MOD_NGIDL : - mod->B3SOIDDngidl = value->rValue; - mod->B3SOIDDngidlGiven = TRUE; - break; - case B3SOIDD_MOD_AGIDL : - mod->B3SOIDDagidl = value->rValue; - mod->B3SOIDDagidlGiven = TRUE; - break; - case B3SOIDD_MOD_BGIDL : - mod->B3SOIDDbgidl = value->rValue; - mod->B3SOIDDbgidlGiven = TRUE; - break; - case B3SOIDD_MOD_NDIODE : - mod->B3SOIDDndiode = value->rValue; - mod->B3SOIDDndiodeGiven = TRUE; - break; - case B3SOIDD_MOD_NTUN : - mod->B3SOIDDntun = value->rValue; - mod->B3SOIDDntunGiven = TRUE; - break; - case B3SOIDD_MOD_ISBJT : - mod->B3SOIDDisbjt = value->rValue; - mod->B3SOIDDisbjtGiven = TRUE; - break; - case B3SOIDD_MOD_ISDIF : - mod->B3SOIDDisdif = value->rValue; - mod->B3SOIDDisdifGiven = TRUE; - break; - case B3SOIDD_MOD_ISREC : - mod->B3SOIDDisrec = value->rValue; - mod->B3SOIDDisrecGiven = TRUE; - break; - case B3SOIDD_MOD_ISTUN : - mod->B3SOIDDistun = value->rValue; - mod->B3SOIDDistunGiven = TRUE; - break; - case B3SOIDD_MOD_XBJT : - mod->B3SOIDDxbjt = value->rValue; - mod->B3SOIDDxbjtGiven = TRUE; - break; - case B3SOIDD_MOD_XREC : - mod->B3SOIDDxrec = value->rValue; - mod->B3SOIDDxrecGiven = TRUE; - break; - case B3SOIDD_MOD_XTUN : - mod->B3SOIDDxtun = value->rValue; - mod->B3SOIDDxtunGiven = TRUE; - break; - case B3SOIDD_MOD_EDL : - mod->B3SOIDDedl = value->rValue; - mod->B3SOIDDedlGiven = TRUE; - break; - case B3SOIDD_MOD_KBJT1 : - mod->B3SOIDDkbjt1 = value->rValue; - mod->B3SOIDDkbjt1Given = TRUE; - break; - case B3SOIDD_MOD_TT : - mod->B3SOIDDtt = value->rValue; - mod->B3SOIDDttGiven = TRUE; - break; - case B3SOIDD_MOD_VSDTH : - mod->B3SOIDDvsdth = value->rValue; - mod->B3SOIDDvsdthGiven = TRUE; - break; - case B3SOIDD_MOD_VSDFB : - mod->B3SOIDDvsdfb = value->rValue; - mod->B3SOIDDvsdfbGiven = TRUE; - break; - case B3SOIDD_MOD_CSDMIN : - mod->B3SOIDDcsdmin = value->rValue; - mod->B3SOIDDcsdminGiven = TRUE; - break; - case B3SOIDD_MOD_ASD : - mod->B3SOIDDasd = value->rValue; - mod->B3SOIDDasdGiven = TRUE; - break; - - - case B3SOIDD_MOD_TNOM : - mod->B3SOIDDtnom = value->rValue + 273.15; - mod->B3SOIDDtnomGiven = TRUE; - break; - case B3SOIDD_MOD_CGSO : - mod->B3SOIDDcgso = value->rValue; - mod->B3SOIDDcgsoGiven = TRUE; - break; - case B3SOIDD_MOD_CGDO : - mod->B3SOIDDcgdo = value->rValue; - mod->B3SOIDDcgdoGiven = TRUE; - break; - case B3SOIDD_MOD_CGEO : - mod->B3SOIDDcgeo = value->rValue; - mod->B3SOIDDcgeoGiven = TRUE; - break; - case B3SOIDD_MOD_XPART : - mod->B3SOIDDxpart = value->rValue; - mod->B3SOIDDxpartGiven = TRUE; - break; - case B3SOIDD_MOD_RSH : - mod->B3SOIDDsheetResistance = value->rValue; - mod->B3SOIDDsheetResistanceGiven = TRUE; - break; - case B3SOIDD_MOD_PBSWG : - mod->B3SOIDDGatesidewallJctPotential = value->rValue; - mod->B3SOIDDGatesidewallJctPotentialGiven = TRUE; - break; - case B3SOIDD_MOD_MJSWG : - mod->B3SOIDDbodyJctGateSideGradingCoeff = value->rValue; - mod->B3SOIDDbodyJctGateSideGradingCoeffGiven = TRUE; - break; - case B3SOIDD_MOD_CJSWG : - mod->B3SOIDDunitLengthGateSidewallJctCap = value->rValue; - mod->B3SOIDDunitLengthGateSidewallJctCapGiven = TRUE; - break; - case B3SOIDD_MOD_CSDESW : - mod->B3SOIDDcsdesw = value->rValue; - mod->B3SOIDDcsdeswGiven = TRUE; - break; - case B3SOIDD_MOD_LINT : - mod->B3SOIDDLint = value->rValue; - mod->B3SOIDDLintGiven = TRUE; - break; - case B3SOIDD_MOD_LL : - mod->B3SOIDDLl = value->rValue; - mod->B3SOIDDLlGiven = TRUE; - break; - case B3SOIDD_MOD_LLN : - mod->B3SOIDDLln = value->rValue; - mod->B3SOIDDLlnGiven = TRUE; - break; - case B3SOIDD_MOD_LW : - mod->B3SOIDDLw = value->rValue; - mod->B3SOIDDLwGiven = TRUE; - break; - case B3SOIDD_MOD_LWN : - mod->B3SOIDDLwn = value->rValue; - mod->B3SOIDDLwnGiven = TRUE; - break; - case B3SOIDD_MOD_LWL : - mod->B3SOIDDLwl = value->rValue; - mod->B3SOIDDLwlGiven = TRUE; - break; - case B3SOIDD_MOD_WINT : - mod->B3SOIDDWint = value->rValue; - mod->B3SOIDDWintGiven = TRUE; - break; - case B3SOIDD_MOD_WL : - mod->B3SOIDDWl = value->rValue; - mod->B3SOIDDWlGiven = TRUE; - break; - case B3SOIDD_MOD_WLN : - mod->B3SOIDDWln = value->rValue; - mod->B3SOIDDWlnGiven = TRUE; - break; - case B3SOIDD_MOD_WW : - mod->B3SOIDDWw = value->rValue; - mod->B3SOIDDWwGiven = TRUE; - break; - case B3SOIDD_MOD_WWN : - mod->B3SOIDDWwn = value->rValue; - mod->B3SOIDDWwnGiven = TRUE; - break; - case B3SOIDD_MOD_WWL : - mod->B3SOIDDWwl = value->rValue; - mod->B3SOIDDWwlGiven = TRUE; - break; - - case B3SOIDD_MOD_NOIA : - mod->B3SOIDDoxideTrapDensityA = value->rValue; - mod->B3SOIDDoxideTrapDensityAGiven = TRUE; - break; - case B3SOIDD_MOD_NOIB : - mod->B3SOIDDoxideTrapDensityB = value->rValue; - mod->B3SOIDDoxideTrapDensityBGiven = TRUE; - break; - case B3SOIDD_MOD_NOIC : - mod->B3SOIDDoxideTrapDensityC = value->rValue; - mod->B3SOIDDoxideTrapDensityCGiven = TRUE; - break; - case B3SOIDD_MOD_NOIF : - mod->B3SOIDDnoif = value->rValue; - mod->B3SOIDDnoifGiven = TRUE; - break; - case B3SOIDD_MOD_EM : - mod->B3SOIDDem = value->rValue; - mod->B3SOIDDemGiven = TRUE; - break; - case B3SOIDD_MOD_EF : - mod->B3SOIDDef = value->rValue; - mod->B3SOIDDefGiven = TRUE; - break; - case B3SOIDD_MOD_AF : - mod->B3SOIDDaf = value->rValue; - mod->B3SOIDDafGiven = TRUE; - break; - case B3SOIDD_MOD_KF : - mod->B3SOIDDkf = value->rValue; - mod->B3SOIDDkfGiven = TRUE; - break; - -/* Added for binning - START */ - /* Length Dependence */ - case B3SOIDD_MOD_LNPEAK: - mod->B3SOIDDlnpeak = value->rValue; - mod->B3SOIDDlnpeakGiven = TRUE; - break; - case B3SOIDD_MOD_LNSUB: - mod->B3SOIDDlnsub = value->rValue; - mod->B3SOIDDlnsubGiven = TRUE; - break; - case B3SOIDD_MOD_LNGATE: - mod->B3SOIDDlngate = value->rValue; - mod->B3SOIDDlngateGiven = TRUE; - break; - case B3SOIDD_MOD_LVTH0: - mod->B3SOIDDlvth0 = value->rValue; - mod->B3SOIDDlvth0Given = TRUE; - break; - case B3SOIDD_MOD_LK1: - mod->B3SOIDDlk1 = value->rValue; - mod->B3SOIDDlk1Given = TRUE; - break; - case B3SOIDD_MOD_LK2: - mod->B3SOIDDlk2 = value->rValue; - mod->B3SOIDDlk2Given = TRUE; - break; - case B3SOIDD_MOD_LK3: - mod->B3SOIDDlk3 = value->rValue; - mod->B3SOIDDlk3Given = TRUE; - break; - case B3SOIDD_MOD_LK3B: - mod->B3SOIDDlk3b = value->rValue; - mod->B3SOIDDlk3bGiven = TRUE; - break; - case B3SOIDD_MOD_LVBSA: - mod->B3SOIDDlvbsa = value->rValue; - mod->B3SOIDDlvbsaGiven = TRUE; - break; - case B3SOIDD_MOD_LDELP: - mod->B3SOIDDldelp = value->rValue; - mod->B3SOIDDldelpGiven = TRUE; - break; - case B3SOIDD_MOD_LKB1 : - mod->B3SOIDDlkb1 = value->rValue; - mod->B3SOIDDlkb1Given = TRUE; - break; - case B3SOIDD_MOD_LKB3 : - mod->B3SOIDDlkb3 = value->rValue; - mod->B3SOIDDlkb3Given = TRUE; - break; - case B3SOIDD_MOD_LDVBD0 : - mod->B3SOIDDldvbd0 = value->rValue; - mod->B3SOIDDldvbd0Given = TRUE; - break; - case B3SOIDD_MOD_LDVBD1 : - mod->B3SOIDDldvbd1 = value->rValue; - mod->B3SOIDDldvbd1Given = TRUE; - break; - case B3SOIDD_MOD_LW0: - mod->B3SOIDDlw0 = value->rValue; - mod->B3SOIDDlw0Given = TRUE; - break; - case B3SOIDD_MOD_LNLX: - mod->B3SOIDDlnlx = value->rValue; - mod->B3SOIDDlnlxGiven = TRUE; - break; - case B3SOIDD_MOD_LDVT0: - mod->B3SOIDDldvt0 = value->rValue; - mod->B3SOIDDldvt0Given = TRUE; - break; - case B3SOIDD_MOD_LDVT1: - mod->B3SOIDDldvt1 = value->rValue; - mod->B3SOIDDldvt1Given = TRUE; - break; - case B3SOIDD_MOD_LDVT2: - mod->B3SOIDDldvt2 = value->rValue; - mod->B3SOIDDldvt2Given = TRUE; - break; - case B3SOIDD_MOD_LDVT0W: - mod->B3SOIDDldvt0w = value->rValue; - mod->B3SOIDDldvt0wGiven = TRUE; - break; - case B3SOIDD_MOD_LDVT1W: - mod->B3SOIDDldvt1w = value->rValue; - mod->B3SOIDDldvt1wGiven = TRUE; - break; - case B3SOIDD_MOD_LDVT2W: - mod->B3SOIDDldvt2w = value->rValue; - mod->B3SOIDDldvt2wGiven = TRUE; - break; - case B3SOIDD_MOD_LU0 : - mod->B3SOIDDlu0 = value->rValue; - mod->B3SOIDDlu0Given = TRUE; - break; - case B3SOIDD_MOD_LUA: - mod->B3SOIDDlua = value->rValue; - mod->B3SOIDDluaGiven = TRUE; - break; - case B3SOIDD_MOD_LUB: - mod->B3SOIDDlub = value->rValue; - mod->B3SOIDDlubGiven = TRUE; - break; - case B3SOIDD_MOD_LUC: - mod->B3SOIDDluc = value->rValue; - mod->B3SOIDDlucGiven = TRUE; - break; - case B3SOIDD_MOD_LVSAT: - mod->B3SOIDDlvsat = value->rValue; - mod->B3SOIDDlvsatGiven = TRUE; - break; - case B3SOIDD_MOD_LA0: - mod->B3SOIDDla0 = value->rValue; - mod->B3SOIDDla0Given = TRUE; - break; - case B3SOIDD_MOD_LAGS: - mod->B3SOIDDlags= value->rValue; - mod->B3SOIDDlagsGiven = TRUE; - break; - case B3SOIDD_MOD_LB0 : - mod->B3SOIDDlb0 = value->rValue; - mod->B3SOIDDlb0Given = TRUE; - break; - case B3SOIDD_MOD_LB1 : - mod->B3SOIDDlb1 = value->rValue; - mod->B3SOIDDlb1Given = TRUE; - break; - case B3SOIDD_MOD_LKETA: - mod->B3SOIDDlketa = value->rValue; - mod->B3SOIDDlketaGiven = TRUE; - break; - case B3SOIDD_MOD_LABP: - mod->B3SOIDDlabp = value->rValue; - mod->B3SOIDDlabpGiven = TRUE; - break; - case B3SOIDD_MOD_LMXC: - mod->B3SOIDDlmxc = value->rValue; - mod->B3SOIDDlmxcGiven = TRUE; - break; - case B3SOIDD_MOD_LADICE0: - mod->B3SOIDDladice0 = value->rValue; - mod->B3SOIDDladice0Given = TRUE; - break; - case B3SOIDD_MOD_LA1: - mod->B3SOIDDla1 = value->rValue; - mod->B3SOIDDla1Given = TRUE; - break; - case B3SOIDD_MOD_LA2: - mod->B3SOIDDla2 = value->rValue; - mod->B3SOIDDla2Given = TRUE; - break; - case B3SOIDD_MOD_LRDSW: - mod->B3SOIDDlrdsw = value->rValue; - mod->B3SOIDDlrdswGiven = TRUE; - break; - case B3SOIDD_MOD_LPRWB: - mod->B3SOIDDlprwb = value->rValue; - mod->B3SOIDDlprwbGiven = TRUE; - break; - case B3SOIDD_MOD_LPRWG: - mod->B3SOIDDlprwg = value->rValue; - mod->B3SOIDDlprwgGiven = TRUE; - break; - case B3SOIDD_MOD_LWR : - mod->B3SOIDDlwr = value->rValue; - mod->B3SOIDDlwrGiven = TRUE; - break; - case B3SOIDD_MOD_LNFACTOR : - mod->B3SOIDDlnfactor = value->rValue; - mod->B3SOIDDlnfactorGiven = TRUE; - break; - case B3SOIDD_MOD_LDWG : - mod->B3SOIDDldwg = value->rValue; - mod->B3SOIDDldwgGiven = TRUE; - break; - case B3SOIDD_MOD_LDWB : - mod->B3SOIDDldwb = value->rValue; - mod->B3SOIDDldwbGiven = TRUE; - break; - case B3SOIDD_MOD_LVOFF: - mod->B3SOIDDlvoff = value->rValue; - mod->B3SOIDDlvoffGiven = TRUE; - break; - case B3SOIDD_MOD_LETA0: - mod->B3SOIDDleta0 = value->rValue; - mod->B3SOIDDleta0Given = TRUE; - break; - case B3SOIDD_MOD_LETAB: - mod->B3SOIDDletab = value->rValue; - mod->B3SOIDDletabGiven = TRUE; - break; - case B3SOIDD_MOD_LDSUB: - mod->B3SOIDDldsub = value->rValue; - mod->B3SOIDDldsubGiven = TRUE; - break; - case B3SOIDD_MOD_LCIT : - mod->B3SOIDDlcit = value->rValue; - mod->B3SOIDDlcitGiven = TRUE; - break; - case B3SOIDD_MOD_LCDSC : - mod->B3SOIDDlcdsc = value->rValue; - mod->B3SOIDDlcdscGiven = TRUE; - break; - case B3SOIDD_MOD_LCDSCB : - mod->B3SOIDDlcdscb = value->rValue; - mod->B3SOIDDlcdscbGiven = TRUE; - break; - case B3SOIDD_MOD_LCDSCD : - mod->B3SOIDDlcdscd = value->rValue; - mod->B3SOIDDlcdscdGiven = TRUE; - break; - case B3SOIDD_MOD_LPCLM: - mod->B3SOIDDlpclm = value->rValue; - mod->B3SOIDDlpclmGiven = TRUE; - break; - case B3SOIDD_MOD_LPDIBL1: - mod->B3SOIDDlpdibl1 = value->rValue; - mod->B3SOIDDlpdibl1Given = TRUE; - break; - case B3SOIDD_MOD_LPDIBL2: - mod->B3SOIDDlpdibl2 = value->rValue; - mod->B3SOIDDlpdibl2Given = TRUE; - break; - case B3SOIDD_MOD_LPDIBLB: - mod->B3SOIDDlpdiblb = value->rValue; - mod->B3SOIDDlpdiblbGiven = TRUE; - break; - case B3SOIDD_MOD_LDROUT: - mod->B3SOIDDldrout = value->rValue; - mod->B3SOIDDldroutGiven = TRUE; - break; - case B3SOIDD_MOD_LPVAG: - mod->B3SOIDDlpvag = value->rValue; - mod->B3SOIDDlpvagGiven = TRUE; - break; - case B3SOIDD_MOD_LDELTA : - mod->B3SOIDDldelta = value->rValue; - mod->B3SOIDDldeltaGiven = TRUE; - break; - case B3SOIDD_MOD_LAII : - mod->B3SOIDDlaii = value->rValue; - mod->B3SOIDDlaiiGiven = TRUE; - break; - case B3SOIDD_MOD_LBII : - mod->B3SOIDDlbii = value->rValue; - mod->B3SOIDDlbiiGiven = TRUE; - break; - case B3SOIDD_MOD_LCII : - mod->B3SOIDDlcii = value->rValue; - mod->B3SOIDDlciiGiven = TRUE; - break; - case B3SOIDD_MOD_LDII : - mod->B3SOIDDldii = value->rValue; - mod->B3SOIDDldiiGiven = TRUE; - break; - case B3SOIDD_MOD_LALPHA0 : - mod->B3SOIDDlalpha0 = value->rValue; - mod->B3SOIDDlalpha0Given = TRUE; - break; - case B3SOIDD_MOD_LALPHA1 : - mod->B3SOIDDlalpha1 = value->rValue; - mod->B3SOIDDlalpha1Given = TRUE; - break; - case B3SOIDD_MOD_LBETA0 : - mod->B3SOIDDlbeta0 = value->rValue; - mod->B3SOIDDlbeta0Given = TRUE; - break; - case B3SOIDD_MOD_LAGIDL : - mod->B3SOIDDlagidl = value->rValue; - mod->B3SOIDDlagidlGiven = TRUE; - break; - case B3SOIDD_MOD_LBGIDL : - mod->B3SOIDDlbgidl = value->rValue; - mod->B3SOIDDlbgidlGiven = TRUE; - break; - case B3SOIDD_MOD_LNGIDL : - mod->B3SOIDDlngidl = value->rValue; - mod->B3SOIDDlngidlGiven = TRUE; - break; - case B3SOIDD_MOD_LNTUN : - mod->B3SOIDDlntun = value->rValue; - mod->B3SOIDDlntunGiven = TRUE; - break; - case B3SOIDD_MOD_LNDIODE : - mod->B3SOIDDlndiode = value->rValue; - mod->B3SOIDDlndiodeGiven = TRUE; - break; - case B3SOIDD_MOD_LISBJT : - mod->B3SOIDDlisbjt = value->rValue; - mod->B3SOIDDlisbjtGiven = TRUE; - break; - case B3SOIDD_MOD_LISDIF : - mod->B3SOIDDlisdif = value->rValue; - mod->B3SOIDDlisdifGiven = TRUE; - break; - case B3SOIDD_MOD_LISREC : - mod->B3SOIDDlisrec = value->rValue; - mod->B3SOIDDlisrecGiven = TRUE; - break; - case B3SOIDD_MOD_LISTUN : - mod->B3SOIDDlistun = value->rValue; - mod->B3SOIDDlistunGiven = TRUE; - break; - case B3SOIDD_MOD_LEDL : - mod->B3SOIDDledl = value->rValue; - mod->B3SOIDDledlGiven = TRUE; - break; - case B3SOIDD_MOD_LKBJT1 : - mod->B3SOIDDlkbjt1 = value->rValue; - mod->B3SOIDDlkbjt1Given = TRUE; - break; - /* CV Model */ - case B3SOIDD_MOD_LVSDFB : - mod->B3SOIDDlvsdfb = value->rValue; - mod->B3SOIDDlvsdfbGiven = TRUE; - break; - case B3SOIDD_MOD_LVSDTH : - mod->B3SOIDDlvsdth = value->rValue; - mod->B3SOIDDlvsdthGiven = TRUE; - break; - /* Width Dependence */ - case B3SOIDD_MOD_WNPEAK: - mod->B3SOIDDwnpeak = value->rValue; - mod->B3SOIDDwnpeakGiven = TRUE; - break; - case B3SOIDD_MOD_WNSUB: - mod->B3SOIDDwnsub = value->rValue; - mod->B3SOIDDwnsubGiven = TRUE; - break; - case B3SOIDD_MOD_WNGATE: - mod->B3SOIDDwngate = value->rValue; - mod->B3SOIDDwngateGiven = TRUE; - break; - case B3SOIDD_MOD_WVTH0: - mod->B3SOIDDwvth0 = value->rValue; - mod->B3SOIDDwvth0Given = TRUE; - break; - case B3SOIDD_MOD_WK1: - mod->B3SOIDDwk1 = value->rValue; - mod->B3SOIDDwk1Given = TRUE; - break; - case B3SOIDD_MOD_WK2: - mod->B3SOIDDwk2 = value->rValue; - mod->B3SOIDDwk2Given = TRUE; - break; - case B3SOIDD_MOD_WK3: - mod->B3SOIDDwk3 = value->rValue; - mod->B3SOIDDwk3Given = TRUE; - break; - case B3SOIDD_MOD_WK3B: - mod->B3SOIDDwk3b = value->rValue; - mod->B3SOIDDwk3bGiven = TRUE; - break; - case B3SOIDD_MOD_WVBSA: - mod->B3SOIDDwvbsa = value->rValue; - mod->B3SOIDDwvbsaGiven = TRUE; - break; - case B3SOIDD_MOD_WDELP: - mod->B3SOIDDwdelp = value->rValue; - mod->B3SOIDDwdelpGiven = TRUE; - break; - case B3SOIDD_MOD_WKB1 : - mod->B3SOIDDwkb1 = value->rValue; - mod->B3SOIDDwkb1Given = TRUE; - break; - case B3SOIDD_MOD_WKB3 : - mod->B3SOIDDwkb3 = value->rValue; - mod->B3SOIDDwkb3Given = TRUE; - break; - case B3SOIDD_MOD_WDVBD0 : - mod->B3SOIDDwdvbd0 = value->rValue; - mod->B3SOIDDwdvbd0Given = TRUE; - break; - case B3SOIDD_MOD_WDVBD1 : - mod->B3SOIDDwdvbd1 = value->rValue; - mod->B3SOIDDwdvbd1Given = TRUE; - break; - case B3SOIDD_MOD_WW0: - mod->B3SOIDDww0 = value->rValue; - mod->B3SOIDDww0Given = TRUE; - break; - case B3SOIDD_MOD_WNLX: - mod->B3SOIDDwnlx = value->rValue; - mod->B3SOIDDwnlxGiven = TRUE; - break; - case B3SOIDD_MOD_WDVT0: - mod->B3SOIDDwdvt0 = value->rValue; - mod->B3SOIDDwdvt0Given = TRUE; - break; - case B3SOIDD_MOD_WDVT1: - mod->B3SOIDDwdvt1 = value->rValue; - mod->B3SOIDDwdvt1Given = TRUE; - break; - case B3SOIDD_MOD_WDVT2: - mod->B3SOIDDwdvt2 = value->rValue; - mod->B3SOIDDwdvt2Given = TRUE; - break; - case B3SOIDD_MOD_WDVT0W: - mod->B3SOIDDwdvt0w = value->rValue; - mod->B3SOIDDwdvt0wGiven = TRUE; - break; - case B3SOIDD_MOD_WDVT1W: - mod->B3SOIDDwdvt1w = value->rValue; - mod->B3SOIDDwdvt1wGiven = TRUE; - break; - case B3SOIDD_MOD_WDVT2W: - mod->B3SOIDDwdvt2w = value->rValue; - mod->B3SOIDDwdvt2wGiven = TRUE; - break; - case B3SOIDD_MOD_WU0 : - mod->B3SOIDDwu0 = value->rValue; - mod->B3SOIDDwu0Given = TRUE; - break; - case B3SOIDD_MOD_WUA: - mod->B3SOIDDwua = value->rValue; - mod->B3SOIDDwuaGiven = TRUE; - break; - case B3SOIDD_MOD_WUB: - mod->B3SOIDDwub = value->rValue; - mod->B3SOIDDwubGiven = TRUE; - break; - case B3SOIDD_MOD_WUC: - mod->B3SOIDDwuc = value->rValue; - mod->B3SOIDDwucGiven = TRUE; - break; - case B3SOIDD_MOD_WVSAT: - mod->B3SOIDDwvsat = value->rValue; - mod->B3SOIDDwvsatGiven = TRUE; - break; - case B3SOIDD_MOD_WA0: - mod->B3SOIDDwa0 = value->rValue; - mod->B3SOIDDwa0Given = TRUE; - break; - case B3SOIDD_MOD_WAGS: - mod->B3SOIDDwags= value->rValue; - mod->B3SOIDDwagsGiven = TRUE; - break; - case B3SOIDD_MOD_WB0 : - mod->B3SOIDDwb0 = value->rValue; - mod->B3SOIDDwb0Given = TRUE; - break; - case B3SOIDD_MOD_WB1 : - mod->B3SOIDDwb1 = value->rValue; - mod->B3SOIDDwb1Given = TRUE; - break; - case B3SOIDD_MOD_WKETA: - mod->B3SOIDDwketa = value->rValue; - mod->B3SOIDDwketaGiven = TRUE; - break; - case B3SOIDD_MOD_WABP: - mod->B3SOIDDwabp = value->rValue; - mod->B3SOIDDwabpGiven = TRUE; - break; - case B3SOIDD_MOD_WMXC: - mod->B3SOIDDwmxc = value->rValue; - mod->B3SOIDDwmxcGiven = TRUE; - break; - case B3SOIDD_MOD_WADICE0: - mod->B3SOIDDwadice0 = value->rValue; - mod->B3SOIDDwadice0Given = TRUE; - break; - case B3SOIDD_MOD_WA1: - mod->B3SOIDDwa1 = value->rValue; - mod->B3SOIDDwa1Given = TRUE; - break; - case B3SOIDD_MOD_WA2: - mod->B3SOIDDwa2 = value->rValue; - mod->B3SOIDDwa2Given = TRUE; - break; - case B3SOIDD_MOD_WRDSW: - mod->B3SOIDDwrdsw = value->rValue; - mod->B3SOIDDwrdswGiven = TRUE; - break; - case B3SOIDD_MOD_WPRWB: - mod->B3SOIDDwprwb = value->rValue; - mod->B3SOIDDwprwbGiven = TRUE; - break; - case B3SOIDD_MOD_WPRWG: - mod->B3SOIDDwprwg = value->rValue; - mod->B3SOIDDwprwgGiven = TRUE; - break; - case B3SOIDD_MOD_WWR : - mod->B3SOIDDwwr = value->rValue; - mod->B3SOIDDwwrGiven = TRUE; - break; - case B3SOIDD_MOD_WNFACTOR : - mod->B3SOIDDwnfactor = value->rValue; - mod->B3SOIDDwnfactorGiven = TRUE; - break; - case B3SOIDD_MOD_WDWG : - mod->B3SOIDDwdwg = value->rValue; - mod->B3SOIDDwdwgGiven = TRUE; - break; - case B3SOIDD_MOD_WDWB : - mod->B3SOIDDwdwb = value->rValue; - mod->B3SOIDDwdwbGiven = TRUE; - break; - case B3SOIDD_MOD_WVOFF: - mod->B3SOIDDwvoff = value->rValue; - mod->B3SOIDDwvoffGiven = TRUE; - break; - case B3SOIDD_MOD_WETA0: - mod->B3SOIDDweta0 = value->rValue; - mod->B3SOIDDweta0Given = TRUE; - break; - case B3SOIDD_MOD_WETAB: - mod->B3SOIDDwetab = value->rValue; - mod->B3SOIDDwetabGiven = TRUE; - break; - case B3SOIDD_MOD_WDSUB: - mod->B3SOIDDwdsub = value->rValue; - mod->B3SOIDDwdsubGiven = TRUE; - break; - case B3SOIDD_MOD_WCIT : - mod->B3SOIDDwcit = value->rValue; - mod->B3SOIDDwcitGiven = TRUE; - break; - case B3SOIDD_MOD_WCDSC : - mod->B3SOIDDwcdsc = value->rValue; - mod->B3SOIDDwcdscGiven = TRUE; - break; - case B3SOIDD_MOD_WCDSCB : - mod->B3SOIDDwcdscb = value->rValue; - mod->B3SOIDDwcdscbGiven = TRUE; - break; - case B3SOIDD_MOD_WCDSCD : - mod->B3SOIDDwcdscd = value->rValue; - mod->B3SOIDDwcdscdGiven = TRUE; - break; - case B3SOIDD_MOD_WPCLM: - mod->B3SOIDDwpclm = value->rValue; - mod->B3SOIDDwpclmGiven = TRUE; - break; - case B3SOIDD_MOD_WPDIBL1: - mod->B3SOIDDwpdibl1 = value->rValue; - mod->B3SOIDDwpdibl1Given = TRUE; - break; - case B3SOIDD_MOD_WPDIBL2: - mod->B3SOIDDwpdibl2 = value->rValue; - mod->B3SOIDDwpdibl2Given = TRUE; - break; - case B3SOIDD_MOD_WPDIBLB: - mod->B3SOIDDwpdiblb = value->rValue; - mod->B3SOIDDwpdiblbGiven = TRUE; - break; - case B3SOIDD_MOD_WDROUT: - mod->B3SOIDDwdrout = value->rValue; - mod->B3SOIDDwdroutGiven = TRUE; - break; - case B3SOIDD_MOD_WPVAG: - mod->B3SOIDDwpvag = value->rValue; - mod->B3SOIDDwpvagGiven = TRUE; - break; - case B3SOIDD_MOD_WDELTA : - mod->B3SOIDDwdelta = value->rValue; - mod->B3SOIDDwdeltaGiven = TRUE; - break; - case B3SOIDD_MOD_WAII : - mod->B3SOIDDwaii = value->rValue; - mod->B3SOIDDwaiiGiven = TRUE; - break; - case B3SOIDD_MOD_WBII : - mod->B3SOIDDwbii = value->rValue; - mod->B3SOIDDwbiiGiven = TRUE; - break; - case B3SOIDD_MOD_WCII : - mod->B3SOIDDwcii = value->rValue; - mod->B3SOIDDwciiGiven = TRUE; - break; - case B3SOIDD_MOD_WDII : - mod->B3SOIDDwdii = value->rValue; - mod->B3SOIDDwdiiGiven = TRUE; - break; - case B3SOIDD_MOD_WALPHA0 : - mod->B3SOIDDwalpha0 = value->rValue; - mod->B3SOIDDwalpha0Given = TRUE; - break; - case B3SOIDD_MOD_WALPHA1 : - mod->B3SOIDDwalpha1 = value->rValue; - mod->B3SOIDDwalpha1Given = TRUE; - break; - case B3SOIDD_MOD_WBETA0 : - mod->B3SOIDDwbeta0 = value->rValue; - mod->B3SOIDDwbeta0Given = TRUE; - break; - case B3SOIDD_MOD_WAGIDL : - mod->B3SOIDDwagidl = value->rValue; - mod->B3SOIDDwagidlGiven = TRUE; - break; - case B3SOIDD_MOD_WBGIDL : - mod->B3SOIDDwbgidl = value->rValue; - mod->B3SOIDDwbgidlGiven = TRUE; - break; - case B3SOIDD_MOD_WNGIDL : - mod->B3SOIDDwngidl = value->rValue; - mod->B3SOIDDwngidlGiven = TRUE; - break; - case B3SOIDD_MOD_WNTUN : - mod->B3SOIDDwntun = value->rValue; - mod->B3SOIDDwntunGiven = TRUE; - break; - case B3SOIDD_MOD_WNDIODE : - mod->B3SOIDDwndiode = value->rValue; - mod->B3SOIDDwndiodeGiven = TRUE; - break; - case B3SOIDD_MOD_WISBJT : - mod->B3SOIDDwisbjt = value->rValue; - mod->B3SOIDDwisbjtGiven = TRUE; - break; - case B3SOIDD_MOD_WISDIF : - mod->B3SOIDDwisdif = value->rValue; - mod->B3SOIDDwisdifGiven = TRUE; - break; - case B3SOIDD_MOD_WISREC : - mod->B3SOIDDwisrec = value->rValue; - mod->B3SOIDDwisrecGiven = TRUE; - break; - case B3SOIDD_MOD_WISTUN : - mod->B3SOIDDwistun = value->rValue; - mod->B3SOIDDwistunGiven = TRUE; - break; - case B3SOIDD_MOD_WEDL : - mod->B3SOIDDwedl = value->rValue; - mod->B3SOIDDwedlGiven = TRUE; - break; - case B3SOIDD_MOD_WKBJT1 : - mod->B3SOIDDwkbjt1 = value->rValue; - mod->B3SOIDDwkbjt1Given = TRUE; - break; - /* CV Model */ - case B3SOIDD_MOD_WVSDFB : - mod->B3SOIDDwvsdfb = value->rValue; - mod->B3SOIDDwvsdfbGiven = TRUE; - break; - case B3SOIDD_MOD_WVSDTH : - mod->B3SOIDDwvsdth = value->rValue; - mod->B3SOIDDwvsdthGiven = TRUE; - break; - /* Cross-term Dependence */ - case B3SOIDD_MOD_PNPEAK: - mod->B3SOIDDpnpeak = value->rValue; - mod->B3SOIDDpnpeakGiven = TRUE; - break; - case B3SOIDD_MOD_PNSUB: - mod->B3SOIDDpnsub = value->rValue; - mod->B3SOIDDpnsubGiven = TRUE; - break; - case B3SOIDD_MOD_PNGATE: - mod->B3SOIDDpngate = value->rValue; - mod->B3SOIDDpngateGiven = TRUE; - break; - case B3SOIDD_MOD_PVTH0: - mod->B3SOIDDpvth0 = value->rValue; - mod->B3SOIDDpvth0Given = TRUE; - break; - case B3SOIDD_MOD_PK1: - mod->B3SOIDDpk1 = value->rValue; - mod->B3SOIDDpk1Given = TRUE; - break; - case B3SOIDD_MOD_PK2: - mod->B3SOIDDpk2 = value->rValue; - mod->B3SOIDDpk2Given = TRUE; - break; - case B3SOIDD_MOD_PK3: - mod->B3SOIDDpk3 = value->rValue; - mod->B3SOIDDpk3Given = TRUE; - break; - case B3SOIDD_MOD_PK3B: - mod->B3SOIDDpk3b = value->rValue; - mod->B3SOIDDpk3bGiven = TRUE; - break; - case B3SOIDD_MOD_PVBSA: - mod->B3SOIDDpvbsa = value->rValue; - mod->B3SOIDDpvbsaGiven = TRUE; - break; - case B3SOIDD_MOD_PDELP: - mod->B3SOIDDpdelp = value->rValue; - mod->B3SOIDDpdelpGiven = TRUE; - break; - case B3SOIDD_MOD_PKB1 : - mod->B3SOIDDpkb1 = value->rValue; - mod->B3SOIDDpkb1Given = TRUE; - break; - case B3SOIDD_MOD_PKB3 : - mod->B3SOIDDpkb3 = value->rValue; - mod->B3SOIDDpkb3Given = TRUE; - break; - case B3SOIDD_MOD_PDVBD0 : - mod->B3SOIDDpdvbd0 = value->rValue; - mod->B3SOIDDpdvbd0Given = TRUE; - break; - case B3SOIDD_MOD_PDVBD1 : - mod->B3SOIDDpdvbd1 = value->rValue; - mod->B3SOIDDpdvbd1Given = TRUE; - break; - case B3SOIDD_MOD_PW0: - mod->B3SOIDDpw0 = value->rValue; - mod->B3SOIDDpw0Given = TRUE; - break; - case B3SOIDD_MOD_PNLX: - mod->B3SOIDDpnlx = value->rValue; - mod->B3SOIDDpnlxGiven = TRUE; - break; - case B3SOIDD_MOD_PDVT0: - mod->B3SOIDDpdvt0 = value->rValue; - mod->B3SOIDDpdvt0Given = TRUE; - break; - case B3SOIDD_MOD_PDVT1: - mod->B3SOIDDpdvt1 = value->rValue; - mod->B3SOIDDpdvt1Given = TRUE; - break; - case B3SOIDD_MOD_PDVT2: - mod->B3SOIDDpdvt2 = value->rValue; - mod->B3SOIDDpdvt2Given = TRUE; - break; - case B3SOIDD_MOD_PDVT0W: - mod->B3SOIDDpdvt0w = value->rValue; - mod->B3SOIDDpdvt0wGiven = TRUE; - break; - case B3SOIDD_MOD_PDVT1W: - mod->B3SOIDDpdvt1w = value->rValue; - mod->B3SOIDDpdvt1wGiven = TRUE; - break; - case B3SOIDD_MOD_PDVT2W: - mod->B3SOIDDpdvt2w = value->rValue; - mod->B3SOIDDpdvt2wGiven = TRUE; - break; - case B3SOIDD_MOD_PU0 : - mod->B3SOIDDpu0 = value->rValue; - mod->B3SOIDDpu0Given = TRUE; - break; - case B3SOIDD_MOD_PUA: - mod->B3SOIDDpua = value->rValue; - mod->B3SOIDDpuaGiven = TRUE; - break; - case B3SOIDD_MOD_PUB: - mod->B3SOIDDpub = value->rValue; - mod->B3SOIDDpubGiven = TRUE; - break; - case B3SOIDD_MOD_PUC: - mod->B3SOIDDpuc = value->rValue; - mod->B3SOIDDpucGiven = TRUE; - break; - case B3SOIDD_MOD_PVSAT: - mod->B3SOIDDpvsat = value->rValue; - mod->B3SOIDDpvsatGiven = TRUE; - break; - case B3SOIDD_MOD_PA0: - mod->B3SOIDDpa0 = value->rValue; - mod->B3SOIDDpa0Given = TRUE; - break; - case B3SOIDD_MOD_PAGS: - mod->B3SOIDDpags= value->rValue; - mod->B3SOIDDpagsGiven = TRUE; - break; - case B3SOIDD_MOD_PB0 : - mod->B3SOIDDpb0 = value->rValue; - mod->B3SOIDDpb0Given = TRUE; - break; - case B3SOIDD_MOD_PB1 : - mod->B3SOIDDpb1 = value->rValue; - mod->B3SOIDDpb1Given = TRUE; - break; - case B3SOIDD_MOD_PKETA: - mod->B3SOIDDpketa = value->rValue; - mod->B3SOIDDpketaGiven = TRUE; - break; - case B3SOIDD_MOD_PABP: - mod->B3SOIDDpabp = value->rValue; - mod->B3SOIDDpabpGiven = TRUE; - break; - case B3SOIDD_MOD_PMXC: - mod->B3SOIDDpmxc = value->rValue; - mod->B3SOIDDpmxcGiven = TRUE; - break; - case B3SOIDD_MOD_PADICE0: - mod->B3SOIDDpadice0 = value->rValue; - mod->B3SOIDDpadice0Given = TRUE; - break; - case B3SOIDD_MOD_PA1: - mod->B3SOIDDpa1 = value->rValue; - mod->B3SOIDDpa1Given = TRUE; - break; - case B3SOIDD_MOD_PA2: - mod->B3SOIDDpa2 = value->rValue; - mod->B3SOIDDpa2Given = TRUE; - break; - case B3SOIDD_MOD_PRDSW: - mod->B3SOIDDprdsw = value->rValue; - mod->B3SOIDDprdswGiven = TRUE; - break; - case B3SOIDD_MOD_PPRWB: - mod->B3SOIDDpprwb = value->rValue; - mod->B3SOIDDpprwbGiven = TRUE; - break; - case B3SOIDD_MOD_PPRWG: - mod->B3SOIDDpprwg = value->rValue; - mod->B3SOIDDpprwgGiven = TRUE; - break; - case B3SOIDD_MOD_PWR : - mod->B3SOIDDpwr = value->rValue; - mod->B3SOIDDpwrGiven = TRUE; - break; - case B3SOIDD_MOD_PNFACTOR : - mod->B3SOIDDpnfactor = value->rValue; - mod->B3SOIDDpnfactorGiven = TRUE; - break; - case B3SOIDD_MOD_PDWG : - mod->B3SOIDDpdwg = value->rValue; - mod->B3SOIDDpdwgGiven = TRUE; - break; - case B3SOIDD_MOD_PDWB : - mod->B3SOIDDpdwb = value->rValue; - mod->B3SOIDDpdwbGiven = TRUE; - break; - case B3SOIDD_MOD_PVOFF: - mod->B3SOIDDpvoff = value->rValue; - mod->B3SOIDDpvoffGiven = TRUE; - break; - case B3SOIDD_MOD_PETA0: - mod->B3SOIDDpeta0 = value->rValue; - mod->B3SOIDDpeta0Given = TRUE; - break; - case B3SOIDD_MOD_PETAB: - mod->B3SOIDDpetab = value->rValue; - mod->B3SOIDDpetabGiven = TRUE; - break; - case B3SOIDD_MOD_PDSUB: - mod->B3SOIDDpdsub = value->rValue; - mod->B3SOIDDpdsubGiven = TRUE; - break; - case B3SOIDD_MOD_PCIT : - mod->B3SOIDDpcit = value->rValue; - mod->B3SOIDDpcitGiven = TRUE; - break; - case B3SOIDD_MOD_PCDSC : - mod->B3SOIDDpcdsc = value->rValue; - mod->B3SOIDDpcdscGiven = TRUE; - break; - case B3SOIDD_MOD_PCDSCB : - mod->B3SOIDDpcdscb = value->rValue; - mod->B3SOIDDpcdscbGiven = TRUE; - break; - case B3SOIDD_MOD_PCDSCD : - mod->B3SOIDDpcdscd = value->rValue; - mod->B3SOIDDpcdscdGiven = TRUE; - break; - case B3SOIDD_MOD_PPCLM: - mod->B3SOIDDppclm = value->rValue; - mod->B3SOIDDppclmGiven = TRUE; - break; - case B3SOIDD_MOD_PPDIBL1: - mod->B3SOIDDppdibl1 = value->rValue; - mod->B3SOIDDppdibl1Given = TRUE; - break; - case B3SOIDD_MOD_PPDIBL2: - mod->B3SOIDDppdibl2 = value->rValue; - mod->B3SOIDDppdibl2Given = TRUE; - break; - case B3SOIDD_MOD_PPDIBLB: - mod->B3SOIDDppdiblb = value->rValue; - mod->B3SOIDDppdiblbGiven = TRUE; - break; - case B3SOIDD_MOD_PDROUT: - mod->B3SOIDDpdrout = value->rValue; - mod->B3SOIDDpdroutGiven = TRUE; - break; - case B3SOIDD_MOD_PPVAG: - mod->B3SOIDDppvag = value->rValue; - mod->B3SOIDDppvagGiven = TRUE; - break; - case B3SOIDD_MOD_PDELTA : - mod->B3SOIDDpdelta = value->rValue; - mod->B3SOIDDpdeltaGiven = TRUE; - break; - case B3SOIDD_MOD_PAII : - mod->B3SOIDDpaii = value->rValue; - mod->B3SOIDDpaiiGiven = TRUE; - break; - case B3SOIDD_MOD_PBII : - mod->B3SOIDDpbii = value->rValue; - mod->B3SOIDDpbiiGiven = TRUE; - break; - case B3SOIDD_MOD_PCII : - mod->B3SOIDDpcii = value->rValue; - mod->B3SOIDDpciiGiven = TRUE; - break; - case B3SOIDD_MOD_PDII : - mod->B3SOIDDpdii = value->rValue; - mod->B3SOIDDpdiiGiven = TRUE; - break; - case B3SOIDD_MOD_PALPHA0 : - mod->B3SOIDDpalpha0 = value->rValue; - mod->B3SOIDDpalpha0Given = TRUE; - break; - case B3SOIDD_MOD_PALPHA1 : - mod->B3SOIDDpalpha1 = value->rValue; - mod->B3SOIDDpalpha1Given = TRUE; - break; - case B3SOIDD_MOD_PBETA0 : - mod->B3SOIDDpbeta0 = value->rValue; - mod->B3SOIDDpbeta0Given = TRUE; - break; - case B3SOIDD_MOD_PAGIDL : - mod->B3SOIDDpagidl = value->rValue; - mod->B3SOIDDpagidlGiven = TRUE; - break; - case B3SOIDD_MOD_PBGIDL : - mod->B3SOIDDpbgidl = value->rValue; - mod->B3SOIDDpbgidlGiven = TRUE; - break; - case B3SOIDD_MOD_PNGIDL : - mod->B3SOIDDpngidl = value->rValue; - mod->B3SOIDDpngidlGiven = TRUE; - break; - case B3SOIDD_MOD_PNTUN : - mod->B3SOIDDpntun = value->rValue; - mod->B3SOIDDpntunGiven = TRUE; - break; - case B3SOIDD_MOD_PNDIODE : - mod->B3SOIDDpndiode = value->rValue; - mod->B3SOIDDpndiodeGiven = TRUE; - break; - case B3SOIDD_MOD_PISBJT : - mod->B3SOIDDpisbjt = value->rValue; - mod->B3SOIDDpisbjtGiven = TRUE; - break; - case B3SOIDD_MOD_PISDIF : - mod->B3SOIDDpisdif = value->rValue; - mod->B3SOIDDpisdifGiven = TRUE; - break; - case B3SOIDD_MOD_PISREC : - mod->B3SOIDDpisrec = value->rValue; - mod->B3SOIDDpisrecGiven = TRUE; - break; - case B3SOIDD_MOD_PISTUN : - mod->B3SOIDDpistun = value->rValue; - mod->B3SOIDDpistunGiven = TRUE; - break; - case B3SOIDD_MOD_PEDL : - mod->B3SOIDDpedl = value->rValue; - mod->B3SOIDDpedlGiven = TRUE; - break; - case B3SOIDD_MOD_PKBJT1 : - mod->B3SOIDDpkbjt1 = value->rValue; - mod->B3SOIDDpkbjt1Given = TRUE; - break; - /* CV Model */ - case B3SOIDD_MOD_PVSDFB : - mod->B3SOIDDpvsdfb = value->rValue; - mod->B3SOIDDpvsdfbGiven = TRUE; - break; - case B3SOIDD_MOD_PVSDTH : - mod->B3SOIDDpvsdth = value->rValue; - mod->B3SOIDDpvsdthGiven = TRUE; - break; -/* Added for binning - END */ - - case B3SOIDD_MOD_NMOS : - if(value->iValue) { - mod->B3SOIDDtype = 1; - mod->B3SOIDDtypeGiven = TRUE; - } - break; - case B3SOIDD_MOD_PMOS : - if(value->iValue) { - mod->B3SOIDDtype = - 1; - mod->B3SOIDDtypeGiven = TRUE; - } - break; - default: - return(E_BADPARM); - } - return(OK); -} - - diff --git a/src/spicelib/devices/bsim3soi_dd/b3soiddnoi.c b/src/spicelib/devices/bsim3soi_dd/b3soiddnoi.c deleted file mode 100644 index 94c37df30..000000000 --- a/src/spicelib/devices/bsim3soi_dd/b3soiddnoi.c +++ /dev/null @@ -1,352 +0,0 @@ -/********** -Copyright 1999 Regents of the University of California. All rights reserved. -Author: Weidong Liu and Pin Su Feb 1999 -Author: 1998 Samuel Fung, Dennis Sinitsky and Stephen Tang -File: b3soiddnoi.c 98/5/01 -Modofied by Paolo Nenzi 2002 -**********/ - -/* - * Revision 2.1 99/9/27 Pin Su - * BSIMDD2.1 release - */ - -#include "ngspice/ngspice.h" -#include "b3soidddef.h" -#include "ngspice/cktdefs.h" -#include "ngspice/iferrmsg.h" -#include "ngspice/noisedef.h" -#include "ngspice/suffix.h" -#include "ngspice/const.h" /* jwan */ - -/* - * B3SOIDDnoise (mode, operation, firstModel, ckt, data, OnDens) - * This routine names and evaluates all of the noise sources - * associated with MOSFET's. It starts with the model *firstModel and - * traverses all of its insts. It then proceeds to any other models - * on the linked list. The total output noise density generated by - * all of the MOSFET's is summed with the variable "OnDens". - */ - -/* - Channel thermal and flicker noises are calculated based on the value - of model->B3SOIDDnoiMod. - If model->B3SOIDDnoiMod = 1, - Channel thermal noise = SPICE2 model - Flicker noise = SPICE2 model - If model->B3SOIDDnoiMod = 2, - Channel thermal noise = B3SOIDD model - Flicker noise = B3SOIDD model - If model->B3SOIDDnoiMod = 3, - Channel thermal noise = SPICE2 model - Flicker noise = B3SOIDD model - If model->B3SOIDDnoiMod = 4, - Channel thermal noise = B3SOIDD model - Flicker noise = SPICE2 model - */ - - -static double -B3SOIDDStrongInversionNoiseEval(double vgs, double vds, B3SOIDDmodel *model, - B3SOIDDinstance *here, double freq, - double temp) -{ -struct b3soiddSizeDependParam *pParam; -double cd, esat, DelClm, EffFreq, N0, Nl, Vgst; -double T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, Ssi; - - pParam = here->pParam; - cd = fabs(here->B3SOIDDcd) * here->B3SOIDDm; - if (vds > here->B3SOIDDvdsat) - { esat = 2.0 * pParam->B3SOIDDvsattemp / here->B3SOIDDueff; - T0 = ((((vds - here->B3SOIDDvdsat) / pParam->B3SOIDDlitl) + model->B3SOIDDem) - / esat); - DelClm = pParam->B3SOIDDlitl * log (MAX(T0, N_MINLOG)); - } - else - DelClm = 0.0; - EffFreq = pow(freq, model->B3SOIDDef); - T1 = CHARGE * CHARGE * 8.62e-5 * cd * temp * here->B3SOIDDueff; - T2 = 1.0e8 * EffFreq * model->B3SOIDDcox - * pParam->B3SOIDDleff * pParam->B3SOIDDleff; - Vgst = vgs - here->B3SOIDDvon; - N0 = model->B3SOIDDcox * Vgst / CHARGE; - if (N0 < 0.0) - N0 = 0.0; - Nl = model->B3SOIDDcox * (Vgst - MIN(vds, here->B3SOIDDvdsat)) / CHARGE; - if (Nl < 0.0) - Nl = 0.0; - - T3 = model->B3SOIDDoxideTrapDensityA - * log(MAX(((N0 + 2.0e14) / (Nl + 2.0e14)), N_MINLOG)); - T4 = model->B3SOIDDoxideTrapDensityB * (N0 - Nl); - T5 = model->B3SOIDDoxideTrapDensityC * 0.5 * (N0 * N0 - Nl * Nl); - - T6 = 8.62e-5 * temp * cd * cd; - T7 = 1.0e8 * EffFreq * pParam->B3SOIDDleff - * pParam->B3SOIDDleff * pParam->B3SOIDDweff * here->B3SOIDDm; - T8 = model->B3SOIDDoxideTrapDensityA + model->B3SOIDDoxideTrapDensityB * Nl - + model->B3SOIDDoxideTrapDensityC * Nl * Nl; - T9 = (Nl + 2.0e14) * (Nl + 2.0e14); - - Ssi = T1 / T2 * (T3 + T4 + T5) + T6 / T7 * DelClm * T8 / T9; - - return Ssi; -} - -int -B3SOIDDnoise (int mode, int operation, GENmodel *inModel, CKTcircuit *ckt, - Ndata *data, double *OnDens) -{ -NOISEAN *job = (NOISEAN *) ckt->CKTcurJob; - -B3SOIDDmodel *model = (B3SOIDDmodel *)inModel; -B3SOIDDinstance *here; -struct b3soiddSizeDependParam *pParam; -double tempOnoise; -double tempInoise; -double noizDens[B3SOIDDNSRCS]; -double lnNdens[B3SOIDDNSRCS]; - -double vgs, vds, Slimit; -double T1, T10, T11; -double Ssi, Swi; - -int i; - - /* define the names of the noise sources */ - static char *B3SOIDDnNames[B3SOIDDNSRCS] = - { /* Note that we have to keep the order */ - ".rd", /* noise due to rd */ - /* consistent with the index definitions */ - ".rs", /* noise due to rs */ - /* in B3SOIDDdefs.h */ - ".id", /* noise due to id */ - ".1overf", /* flicker (1/f) noise */ - ".fb", /* noise due to floating body */ - "" /* total transistor noise */ - }; - - for (; model != NULL; model = B3SOIDDnextModel(model)) - { for (here = B3SOIDDinstances(model); here != NULL; - here = B3SOIDDnextInstance(here)) - { - pParam = here->pParam; - switch (operation) - { case N_OPEN: - /* see if we have to to produce a summary report */ - /* if so, name all the noise generators */ - - if (job->NStpsSm != 0) - { switch (mode) - { case N_DENS: - for (i = 0; i < B3SOIDDNSRCS; i++) - { NOISE_ADD_OUTVAR(ckt, data, "onoise.%s%s", here->B3SOIDDname, B3SOIDDnNames[i]); - } - break; - case INT_NOIZ: - for (i = 0; i < B3SOIDDNSRCS; i++) - { NOISE_ADD_OUTVAR(ckt, data, "onoise_total.%s%s", here->B3SOIDDname, B3SOIDDnNames[i]); - NOISE_ADD_OUTVAR(ckt, data, "inoise_total.%s%s", here->B3SOIDDname, B3SOIDDnNames[i]); - } - break; - } - } - break; - case N_CALC: - switch (mode) - { case N_DENS: - NevalSrc(&noizDens[B3SOIDDRDNOIZ], - &lnNdens[B3SOIDDRDNOIZ], ckt, THERMNOISE, - here->B3SOIDDdNodePrime, here->B3SOIDDdNode, - here->B3SOIDDdrainConductance * here->B3SOIDDm); - - NevalSrc(&noizDens[B3SOIDDRSNOIZ], - &lnNdens[B3SOIDDRSNOIZ], ckt, THERMNOISE, - here->B3SOIDDsNodePrime, here->B3SOIDDsNode, - here->B3SOIDDsourceConductance * here->B3SOIDDm); - - switch( model->B3SOIDDnoiMod ) - { case 1: - case 3: - NevalSrc(&noizDens[B3SOIDDIDNOIZ], - &lnNdens[B3SOIDDIDNOIZ], ckt, - THERMNOISE, here->B3SOIDDdNodePrime, - here->B3SOIDDsNodePrime, - (2.0 / 3.0 * fabs(here->B3SOIDDm * (here->B3SOIDDgm - + here->B3SOIDDgds - + here->B3SOIDDgmbs)))); - break; - case 2: - case 4: - NevalSrc(&noizDens[B3SOIDDIDNOIZ], - &lnNdens[B3SOIDDIDNOIZ], ckt, - THERMNOISE, here->B3SOIDDdNodePrime, - here->B3SOIDDsNodePrime, - (here->B3SOIDDueff - * fabs((here->B3SOIDDqinv * here->B3SOIDDm) - / (pParam->B3SOIDDleff - * pParam->B3SOIDDleff)))); - break; - } - NevalSrc(&noizDens[B3SOIDDFLNOIZ], NULL, - ckt, N_GAIN, here->B3SOIDDdNodePrime, - here->B3SOIDDsNodePrime, (double) 0.0); - - switch( model->B3SOIDDnoiMod ) - { case 1: - case 4: - noizDens[B3SOIDDFLNOIZ] *= model->B3SOIDDkf - * exp(model->B3SOIDDaf - * log(MAX(fabs(here->B3SOIDDcd * here->B3SOIDDm), - N_MINLOG))) - / (pow(data->freq, model->B3SOIDDef) - * pParam->B3SOIDDleff - * pParam->B3SOIDDleff - * model->B3SOIDDcox); - break; - case 2: - case 3: - vgs = *(ckt->CKTstates[0] + here->B3SOIDDvgs); - vds = *(ckt->CKTstates[0] + here->B3SOIDDvds); - if (vds < 0.0) - { vds = -vds; - vgs = vgs + vds; - } - if (vgs >= here->B3SOIDDvon + 0.1) - { Ssi = B3SOIDDStrongInversionNoiseEval(vgs, - vds, model, here, data->freq, - ckt->CKTtemp); - noizDens[B3SOIDDFLNOIZ] *= Ssi; - } - else - { pParam = here->pParam; - T10 = model->B3SOIDDoxideTrapDensityA - * 8.62e-5 * ckt->CKTtemp; - T11 = pParam->B3SOIDDweff * here->B3SOIDDm - * pParam->B3SOIDDleff - * pow(data->freq, model->B3SOIDDef) - * 4.0e36; - Swi = T10 / T11 * here->B3SOIDDcd * here->B3SOIDDm - * here->B3SOIDDcd * here->B3SOIDDm; - Slimit = B3SOIDDStrongInversionNoiseEval( - here->B3SOIDDvon + 0.1, vds, model, - here, data->freq, ckt->CKTtemp); - T1 = Swi + Slimit; - if (T1 > 0.0) - noizDens[B3SOIDDFLNOIZ] *= (Slimit - * Swi) / T1; - else - noizDens[B3SOIDDFLNOIZ] *= 0.0; - } - break; - } - - lnNdens[B3SOIDDFLNOIZ] = - log(MAX(noizDens[B3SOIDDFLNOIZ], N_MINLOG)); - - /* Low frequency excess noise due to FBE */ - NevalSrc(&noizDens[B3SOIDDFBNOIZ], &lnNdens[B3SOIDDFBNOIZ], - ckt, SHOTNOISE, here->B3SOIDDsNodePrime, - here->B3SOIDDbNode, - 2.0 * model->B3SOIDDnoif * here->B3SOIDDibs * - here->B3SOIDDm); - - noizDens[B3SOIDDTOTNOIZ] = noizDens[B3SOIDDRDNOIZ] - + noizDens[B3SOIDDRSNOIZ] - + noizDens[B3SOIDDIDNOIZ] - + noizDens[B3SOIDDFLNOIZ] - + noizDens[B3SOIDDFBNOIZ]; - lnNdens[B3SOIDDTOTNOIZ] = - log(MAX(noizDens[B3SOIDDTOTNOIZ], N_MINLOG)); - - *OnDens += noizDens[B3SOIDDTOTNOIZ]; - - if (data->delFreq == 0.0) - { /* if we haven't done any previous - integration, we need to initialize our - "history" variables. - */ - - for (i = 0; i < B3SOIDDNSRCS; i++) - { here->B3SOIDDnVar[LNLSTDENS][i] = - lnNdens[i]; - } - - /* clear out our integration variables - if it's the first pass - */ - if (data->freq == - job->NstartFreq) - { for (i = 0; i < B3SOIDDNSRCS; i++) - { here->B3SOIDDnVar[OUTNOIZ][i] = 0.0; - here->B3SOIDDnVar[INNOIZ][i] = 0.0; - } - } - } - else - { /* data->delFreq != 0.0, - we have to integrate. - */ - for (i = 0; i < B3SOIDDNSRCS; i++) - { if (i != B3SOIDDTOTNOIZ) - { tempOnoise = Nintegrate(noizDens[i], - lnNdens[i], - here->B3SOIDDnVar[LNLSTDENS][i], - data); - tempInoise = Nintegrate(noizDens[i] - * data->GainSqInv, lnNdens[i] - + data->lnGainInv, - here->B3SOIDDnVar[LNLSTDENS][i] - + data->lnGainInv, data); - here->B3SOIDDnVar[LNLSTDENS][i] = - lnNdens[i]; - data->outNoiz += tempOnoise; - data->inNoise += tempInoise; - if (job->NStpsSm != 0) - { here->B3SOIDDnVar[OUTNOIZ][i] - += tempOnoise; - here->B3SOIDDnVar[OUTNOIZ][B3SOIDDTOTNOIZ] - += tempOnoise; - here->B3SOIDDnVar[INNOIZ][i] - += tempInoise; - here->B3SOIDDnVar[INNOIZ][B3SOIDDTOTNOIZ] - += tempInoise; - } - } - } - } - if (data->prtSummary) - { for (i = 0; i < B3SOIDDNSRCS; i++) - { /* print a summary report */ - data->outpVector[data->outNumber++] - = noizDens[i]; - } - } - break; - case INT_NOIZ: - /* already calculated, just output */ - if (job->NStpsSm != 0) - { for (i = 0; i < B3SOIDDNSRCS; i++) - { data->outpVector[data->outNumber++] - = here->B3SOIDDnVar[OUTNOIZ][i]; - data->outpVector[data->outNumber++] - = here->B3SOIDDnVar[INNOIZ][i]; - } - } - break; - } - break; - case N_CLOSE: - /* do nothing, the main calling routine will close */ - return (OK); - break; /* the plots */ - } /* switch (operation) */ - } /* for here */ - } /* for model */ - - return(OK); -} - - - diff --git a/src/spicelib/devices/bsim3soi_dd/b3soiddpar.c b/src/spicelib/devices/bsim3soi_dd/b3soiddpar.c deleted file mode 100644 index a16ca92ca..000000000 --- a/src/spicelib/devices/bsim3soi_dd/b3soiddpar.c +++ /dev/null @@ -1,141 +0,0 @@ -/********** -Copyright 1999 Regents of the University of California. All rights reserved. -Author: 1998 Samuel Fung, Dennis Sinitsky and Stephen Tang -File: b3soiddpar.c 98/5/01 -Modified by Paolo Nenzi 2002 -**********/ - -/* - * Revision 2.1 99/9/27 Pin Su - * BSIMDD2.1 release - */ - -#include "ngspice/ngspice.h" -#include "ngspice/ifsim.h" -#include "b3soidddef.h" -#include "ngspice/sperror.h" -#include "ngspice/suffix.h" - -int -B3SOIDDparam(int param, IFvalue *value, GENinstance *inst, IFvalue *select) -{ - B3SOIDDinstance *here = (B3SOIDDinstance*)inst; - - NG_IGNORE(select); - - /* FALLTHROUGH added to suppress GCC warning due to - * -Wimplicit-fallthrough flag */ - switch(param) { - case B3SOIDD_W: - here->B3SOIDDw = value->rValue; - here->B3SOIDDwGiven = TRUE; - break; - case B3SOIDD_L: - here->B3SOIDDl = value->rValue; - here->B3SOIDDlGiven = TRUE; - break; - case B3SOIDD_M: - here->B3SOIDDm = value->rValue; - here->B3SOIDDmGiven = TRUE; - break; - case B3SOIDD_AS: - here->B3SOIDDsourceArea = value->rValue; - here->B3SOIDDsourceAreaGiven = TRUE; - break; - case B3SOIDD_AD: - here->B3SOIDDdrainArea = value->rValue; - here->B3SOIDDdrainAreaGiven = TRUE; - break; - case B3SOIDD_PS: - here->B3SOIDDsourcePerimeter = value->rValue; - here->B3SOIDDsourcePerimeterGiven = TRUE; - break; - case B3SOIDD_PD: - here->B3SOIDDdrainPerimeter = value->rValue; - here->B3SOIDDdrainPerimeterGiven = TRUE; - break; - case B3SOIDD_NRS: - here->B3SOIDDsourceSquares = value->rValue; - here->B3SOIDDsourceSquaresGiven = TRUE; - break; - case B3SOIDD_NRD: - here->B3SOIDDdrainSquares = value->rValue; - here->B3SOIDDdrainSquaresGiven = TRUE; - break; - case B3SOIDD_OFF: - here->B3SOIDDoff = value->iValue; - break; - case B3SOIDD_IC_VBS: - here->B3SOIDDicVBS = value->rValue; - here->B3SOIDDicVBSGiven = TRUE; - break; - case B3SOIDD_IC_VDS: - here->B3SOIDDicVDS = value->rValue; - here->B3SOIDDicVDSGiven = TRUE; - break; - case B3SOIDD_IC_VGS: - here->B3SOIDDicVGS = value->rValue; - here->B3SOIDDicVGSGiven = TRUE; - break; - case B3SOIDD_IC_VES: - here->B3SOIDDicVES = value->rValue; - here->B3SOIDDicVESGiven = TRUE; - break; - case B3SOIDD_IC_VPS: - here->B3SOIDDicVPS = value->rValue; - here->B3SOIDDicVPSGiven = TRUE; - break; - case B3SOIDD_BJTOFF: - here->B3SOIDDbjtoff = value->iValue; - here->B3SOIDDbjtoffGiven= TRUE; - break; - case B3SOIDD_DEBUG: - here->B3SOIDDdebugMod = value->iValue; - here->B3SOIDDdebugModGiven= TRUE; - break; - case B3SOIDD_RTH0: - here->B3SOIDDrth0= value->rValue; - here->B3SOIDDrth0Given = TRUE; - break; - case B3SOIDD_CTH0: - here->B3SOIDDcth0= value->rValue; - here->B3SOIDDcth0Given = TRUE; - break; - case B3SOIDD_NRB: - here->B3SOIDDbodySquares = value->rValue; - here->B3SOIDDbodySquaresGiven = TRUE; - break; - case B3SOIDD_IC: - switch (value->v.numValue) { - case 5: - here->B3SOIDDicVPS = *(value->v.vec.rVec+4); - here->B3SOIDDicVPSGiven = TRUE; - /* FALLTHROUGH */ - case 4: - here->B3SOIDDicVES = *(value->v.vec.rVec+3); - here->B3SOIDDicVESGiven = TRUE; - /* FALLTHROUGH */ - case 3: - here->B3SOIDDicVBS = *(value->v.vec.rVec+2); - here->B3SOIDDicVBSGiven = TRUE; - /* FALLTHROUGH */ - case 2: - here->B3SOIDDicVGS = *(value->v.vec.rVec+1); - here->B3SOIDDicVGSGiven = TRUE; - /* FALLTHROUGH */ - case 1: - here->B3SOIDDicVDS = *(value->v.vec.rVec); - here->B3SOIDDicVDSGiven = TRUE; - break; - default: - return(E_BADPARM); - } - break; - default: - return(E_BADPARM); - } - return(OK); -} - - - diff --git a/src/spicelib/devices/bsim3soi_dd/b3soiddpzld.c b/src/spicelib/devices/bsim3soi_dd/b3soiddpzld.c deleted file mode 100644 index c2c02bfae..000000000 --- a/src/spicelib/devices/bsim3soi_dd/b3soiddpzld.c +++ /dev/null @@ -1,160 +0,0 @@ -/********** -Copyright 1999 Regents of the University of California. All rights reserved. -Author: Weidong Liu and Pin Su Feb 1999 -Author: 1998 Samuel Fung, Dennis Sinitsky and Stephen Tang -File: b3soiddpzld.c 98/5/01 -Modified by Paolo Nenzi 2002 -**********/ - -/* - * Revision 2.1 99/9/27 Pin Su - * BSIMDD2.1 release - */ - -#include "ngspice/ngspice.h" -#include "ngspice/cktdefs.h" -#include "ngspice/complex.h" -#include "ngspice/sperror.h" -#include "b3soidddef.h" -#include "ngspice/suffix.h" - -int -B3SOIDDpzLoad(GENmodel *inModel, CKTcircuit *ckt, SPcomplex *s) -{ -B3SOIDDmodel *model = (B3SOIDDmodel*)inModel; -B3SOIDDinstance *here; -double xcggb, xcgdb, xcgsb, xcbgb, xcbdb, xcbsb, xcddb, xcssb, xcdgb; -double gdpr, gspr, gds, gbd, gbs, capbd = 0.0, capbs = 0.0; -double xcsgb, xcdsb, xcsdb; -double cggb, cgdb, cgsb, cbgb, cbdb, cbsb, cddb, cdgb, cdsb; -double GSoverlapCap, GDoverlapCap, GBoverlapCap = 0.0; -double FwdSum, RevSum, Gm, Gmbs; - -double m; - - NG_IGNORE(ckt); - - for (; model != NULL; model = B3SOIDDnextModel(model)) - { for (here = B3SOIDDinstances(model); here!= NULL; - here = B3SOIDDnextInstance(here)) - { - if (here->B3SOIDDmode >= 0) - { Gm = here->B3SOIDDgm; - Gmbs = here->B3SOIDDgmbs; - FwdSum = Gm + Gmbs; - RevSum = 0.0; - cggb = here->B3SOIDDcggb; - cgsb = here->B3SOIDDcgsb; - cgdb = here->B3SOIDDcgdb; - - cbgb = here->B3SOIDDcbgb; - cbsb = here->B3SOIDDcbsb; - cbdb = here->B3SOIDDcbdb; - - cdgb = here->B3SOIDDcdgb; - cdsb = here->B3SOIDDcdsb; - cddb = here->B3SOIDDcddb; - } - else - { Gm = -here->B3SOIDDgm; - Gmbs = -here->B3SOIDDgmbs; - FwdSum = 0.0; - RevSum = -Gm - Gmbs; - cggb = here->B3SOIDDcggb; - cgsb = here->B3SOIDDcgdb; - cgdb = here->B3SOIDDcgsb; - - cbgb = here->B3SOIDDcbgb; - cbsb = here->B3SOIDDcbdb; - cbdb = here->B3SOIDDcbsb; - - cdgb = -(here->B3SOIDDcdgb + cggb + cbgb); - cdsb = -(here->B3SOIDDcddb + cgsb + cbsb); - cddb = -(here->B3SOIDDcdsb + cgdb + cbdb); - } - gdpr=here->B3SOIDDdrainConductance; - gspr=here->B3SOIDDsourceConductance; - gds= here->B3SOIDDgds; - gbd= here->B3SOIDDgjdb; - gbs= here->B3SOIDDgjsb; -#ifdef BULKCODE - capbd= here->B3SOIDDcapbd; - capbs= here->B3SOIDDcapbs; -#endif - GSoverlapCap = here->B3SOIDDcgso; - GDoverlapCap = here->B3SOIDDcgdo; -#ifdef BULKCODE - GBoverlapCap = here->pParam->B3SOIDDcgbo; -#endif - - xcdgb = (cdgb - GDoverlapCap); - xcddb = (cddb + capbd + GDoverlapCap); - xcdsb = cdsb; - xcsgb = -(cggb + cbgb + cdgb + GSoverlapCap); - xcsdb = -(cgdb + cbdb + cddb); - xcssb = (capbs + GSoverlapCap - (cgsb+cbsb+cdsb)); - xcggb = (cggb + GDoverlapCap + GSoverlapCap + GBoverlapCap); - xcgdb = (cgdb - GDoverlapCap); - xcgsb = (cgsb - GSoverlapCap); - xcbgb = (cbgb - GBoverlapCap); - xcbdb = (cbdb - capbd); - xcbsb = (cbsb - capbs); - - m = here->B3SOIDDm; - - *(here->B3SOIDDGgPtr ) += m * (xcggb * s->real); - *(here->B3SOIDDGgPtr +1) += m * (xcggb * s->imag); - *(here->B3SOIDDBbPtr ) += m * ((-xcbgb-xcbdb-xcbsb) * s->real); - *(here->B3SOIDDBbPtr +1) += m * ((-xcbgb-xcbdb-xcbsb) * s->imag); - *(here->B3SOIDDDPdpPtr ) += m * (xcddb * s->real); - *(here->B3SOIDDDPdpPtr +1) += m * (xcddb * s->imag); - *(here->B3SOIDDSPspPtr ) += m * (xcssb * s->real); - *(here->B3SOIDDSPspPtr +1) += m * (xcssb * s->imag); - *(here->B3SOIDDGbPtr ) += m * ((-xcggb-xcgdb-xcgsb) * s->real); - *(here->B3SOIDDGbPtr +1) += m * ((-xcggb-xcgdb-xcgsb) * s->imag); - *(here->B3SOIDDGdpPtr ) += m * (xcgdb * s->real); - *(here->B3SOIDDGdpPtr +1) += m * (xcgdb * s->imag); - *(here->B3SOIDDGspPtr ) += m * (xcgsb * s->real); - *(here->B3SOIDDGspPtr +1) += m * (xcgsb * s->imag); - *(here->B3SOIDDBgPtr ) += m * (xcbgb * s->real); - *(here->B3SOIDDBgPtr +1) += m * (xcbgb * s->imag); - *(here->B3SOIDDBdpPtr ) += m * (xcbdb * s->real); - *(here->B3SOIDDBdpPtr +1) += m * (xcbdb * s->imag); - *(here->B3SOIDDBspPtr ) += m * (xcbsb * s->real); - *(here->B3SOIDDBspPtr +1) += (xcbsb * s->imag); - *(here->B3SOIDDDPgPtr ) += m * (xcdgb * s->real); - *(here->B3SOIDDDPgPtr +1) += m * (xcdgb * s->imag); - *(here->B3SOIDDDPbPtr ) += m * ((-xcdgb-xcddb-xcdsb) * s->real); - *(here->B3SOIDDDPbPtr +1) += m * ((-xcdgb-xcddb-xcdsb) * s->imag); - *(here->B3SOIDDDPspPtr ) += m * (xcdsb * s->real); - *(here->B3SOIDDDPspPtr +1) += m * (xcdsb * s->imag); - *(here->B3SOIDDSPgPtr ) += m * (xcsgb * s->real); - *(here->B3SOIDDSPgPtr +1) += m * (xcsgb * s->imag); - *(here->B3SOIDDSPbPtr ) += m * ((-xcsgb-xcsdb-xcssb) * s->real); - *(here->B3SOIDDSPbPtr +1) += m * ((-xcsgb-xcsdb-xcssb) * s->imag); - *(here->B3SOIDDSPdpPtr ) += m * (xcsdb * s->real); - *(here->B3SOIDDSPdpPtr +1) += m * (xcsdb * s->imag); - *(here->B3SOIDDDdPtr) += m * gdpr; - *(here->B3SOIDDSsPtr) += m * gspr; - *(here->B3SOIDDBbPtr) += m * (gbd + gbs); - *(here->B3SOIDDDPdpPtr) += m * (gdpr + gds + gbd + RevSum); - *(here->B3SOIDDSPspPtr) += m * (gspr + gds + gbs + FwdSum); - *(here->B3SOIDDDdpPtr) -= m * gdpr; - *(here->B3SOIDDSspPtr) -= m * gspr; - *(here->B3SOIDDBdpPtr) -= m * gbd; - *(here->B3SOIDDBspPtr) -= m * gbs; - *(here->B3SOIDDDPdPtr) -= m * gdpr; - *(here->B3SOIDDDPgPtr) += m * Gm; - *(here->B3SOIDDDPbPtr) -= m * (gbd - Gmbs); - *(here->B3SOIDDDPspPtr) -= m * (gds + FwdSum); - *(here->B3SOIDDSPgPtr) -= m * Gm; - *(here->B3SOIDDSPsPtr) -= m * gspr; - *(here->B3SOIDDSPbPtr) -= m * (gbs + Gmbs); - *(here->B3SOIDDSPdpPtr) -= m * (gds + RevSum); - - } - } - return(OK); -} - - diff --git a/src/spicelib/devices/bsim3soi_dd/b3soiddset.c b/src/spicelib/devices/bsim3soi_dd/b3soiddset.c deleted file mode 100644 index 99da33c0c..000000000 --- a/src/spicelib/devices/bsim3soi_dd/b3soiddset.c +++ /dev/null @@ -1,1566 +0,0 @@ -/********** -Copyright 1999 Regents of the University of California. All rights reserved. -Author: Weidong Liu and Pin Su Feb 1999 -Author: 1998 Samuel Fung, Dennis Sinitsky and Stephen Tang -Modified by Pin Su, Wei Jin 99/9/27 -File: b3soiddset.c 98/5/01 -Modified by Paolo Nenzi 2002 -**********/ - -/* - * Revision 2.1 99/9/27 Pin Su - * BSIMDD2.1 release - */ - -#include "ngspice/ngspice.h" -#include "ngspice/smpdefs.h" -#include "ngspice/cktdefs.h" -#include "b3soidddef.h" -#include "ngspice/const.h" -#include "ngspice/sperror.h" -#include "ngspice/suffix.h" - -#define MAX_EXP 5.834617425e14 -#define MIN_EXP 1.713908431e-15 -#define EXP_THRESHOLD 34.0 -#define SMOOTHFACTOR 0.1 -#define EPSOX 3.453133e-11 -#define EPSSI 1.03594e-10 -#define PI 3.141592654 -#define Charge_q 1.60219e-19 -#define Meter2Micron 1.0e6 - -int -B3SOIDDsetup(SMPmatrix *matrix, GENmodel *inModel, CKTcircuit *ckt, - int *states) -{ -B3SOIDDmodel *model = (B3SOIDDmodel*)inModel; -B3SOIDDinstance *here; -int error; -CKTnode *tmp; - -double tmp1, tmp2; -double nfb0, Cboxt; - -CKTnode *tmpNode; -IFuid tmpName; - - - /* loop through all the B3SOIDD device models */ - for( ; model != NULL; model = B3SOIDDnextModel(model)) - { -/* Default value Processing for B3SOIDD MOSFET Models */ - - if (!model->B3SOIDDtypeGiven) - model->B3SOIDDtype = NMOS; - if (!model->B3SOIDDmobModGiven) - model->B3SOIDDmobMod = 1; - if (!model->B3SOIDDbinUnitGiven) - model->B3SOIDDbinUnit = 1; - if (!model->B3SOIDDparamChkGiven) - model->B3SOIDDparamChk = 0; - if (!model->B3SOIDDcapModGiven) - model->B3SOIDDcapMod = 2; - if (!model->B3SOIDDnoiModGiven) - model->B3SOIDDnoiMod = 1; - if (!model->B3SOIDDshModGiven) - model->B3SOIDDshMod = 0; - if (!model->B3SOIDDversionGiven) - model->B3SOIDDversion = 2.0; - if (!model->B3SOIDDtoxGiven) - model->B3SOIDDtox = 100.0e-10; - model->B3SOIDDcox = 3.453133e-11 / model->B3SOIDDtox; - - if (!model->B3SOIDDcdscGiven) - model->B3SOIDDcdsc = 2.4e-4; /* unit Q/V/m^2 */ - if (!model->B3SOIDDcdscbGiven) - model->B3SOIDDcdscb = 0.0; /* unit Q/V/m^2 */ - if (!model->B3SOIDDcdscdGiven) - model->B3SOIDDcdscd = 0.0; /* unit Q/V/m^2 */ - if (!model->B3SOIDDcitGiven) - model->B3SOIDDcit = 0.0; /* unit Q/V/m^2 */ - if (!model->B3SOIDDnfactorGiven) - model->B3SOIDDnfactor = 1; - if (!model->B3SOIDDvsatGiven) - model->B3SOIDDvsat = 8.0e4; /* unit m/s */ - if (!model->B3SOIDDatGiven) - model->B3SOIDDat = 3.3e4; /* unit m/s */ - if (!model->B3SOIDDa0Given) - model->B3SOIDDa0 = 1.0; - if (!model->B3SOIDDagsGiven) - model->B3SOIDDags = 0.0; - if (!model->B3SOIDDa1Given) - model->B3SOIDDa1 = 0.0; - if (!model->B3SOIDDa2Given) - model->B3SOIDDa2 = 1.0; - if (!model->B3SOIDDketaGiven) - model->B3SOIDDketa = -0.6; /* unit / V */ - if (!model->B3SOIDDnsubGiven) - model->B3SOIDDnsub = 6.0e16; /* unit 1/cm3 */ - if (!model->B3SOIDDnpeakGiven) - model->B3SOIDDnpeak = 1.7e17; /* unit 1/cm3 */ - if (!model->B3SOIDDngateGiven) - model->B3SOIDDngate = 0; /* unit 1/cm3 */ - if (!model->B3SOIDDvbmGiven) - model->B3SOIDDvbm = -3.0; - if (!model->B3SOIDDxtGiven) - model->B3SOIDDxt = 1.55e-7; - if (!model->B3SOIDDkt1Given) - model->B3SOIDDkt1 = -0.11; /* unit V */ - if (!model->B3SOIDDkt1lGiven) - model->B3SOIDDkt1l = 0.0; /* unit V*m */ - if (!model->B3SOIDDkt2Given) - model->B3SOIDDkt2 = 0.022; /* No unit */ - if (!model->B3SOIDDk3Given) - model->B3SOIDDk3 = 0.0; - if (!model->B3SOIDDk3bGiven) - model->B3SOIDDk3b = 0.0; - if (!model->B3SOIDDw0Given) - model->B3SOIDDw0 = 2.5e-6; - if (!model->B3SOIDDnlxGiven) - model->B3SOIDDnlx = 1.74e-7; - if (!model->B3SOIDDdvt0Given) - model->B3SOIDDdvt0 = 2.2; - if (!model->B3SOIDDdvt1Given) - model->B3SOIDDdvt1 = 0.53; - if (!model->B3SOIDDdvt2Given) - model->B3SOIDDdvt2 = -0.032; /* unit 1 / V */ - - if (!model->B3SOIDDdvt0wGiven) - model->B3SOIDDdvt0w = 0.0; - if (!model->B3SOIDDdvt1wGiven) - model->B3SOIDDdvt1w = 5.3e6; - if (!model->B3SOIDDdvt2wGiven) - model->B3SOIDDdvt2w = -0.032; - - if (!model->B3SOIDDdroutGiven) - model->B3SOIDDdrout = 0.56; - if (!model->B3SOIDDdsubGiven) - model->B3SOIDDdsub = model->B3SOIDDdrout; - if (!model->B3SOIDDvth0Given) - model->B3SOIDDvth0 = (model->B3SOIDDtype == NMOS) ? 0.7 : -0.7; - if (!model->B3SOIDDuaGiven) - model->B3SOIDDua = 2.25e-9; /* unit m/V */ - if (!model->B3SOIDDua1Given) - model->B3SOIDDua1 = 4.31e-9; /* unit m/V */ - if (!model->B3SOIDDubGiven) - model->B3SOIDDub = 5.87e-19; /* unit (m/V)**2 */ - if (!model->B3SOIDDub1Given) - model->B3SOIDDub1 = -7.61e-18; /* unit (m/V)**2 */ - if (!model->B3SOIDDucGiven) - model->B3SOIDDuc = (model->B3SOIDDmobMod == 3) ? -0.0465 : -0.0465e-9; - if (!model->B3SOIDDuc1Given) - model->B3SOIDDuc1 = (model->B3SOIDDmobMod == 3) ? -0.056 : -0.056e-9; - if (!model->B3SOIDDu0Given) - model->B3SOIDDu0 = (model->B3SOIDDtype == NMOS) ? 0.067 : 0.025; - if (!model->B3SOIDDuteGiven) - model->B3SOIDDute = -1.5; - if (!model->B3SOIDDvoffGiven) - model->B3SOIDDvoff = -0.08; - if (!model->B3SOIDDdeltaGiven) - model->B3SOIDDdelta = 0.01; - if (!model->B3SOIDDrdswGiven) - model->B3SOIDDrdsw = 100; - if (!model->B3SOIDDprwgGiven) - model->B3SOIDDprwg = 0.0; /* unit 1/V */ - if (!model->B3SOIDDprwbGiven) - model->B3SOIDDprwb = 0.0; - if (!model->B3SOIDDprtGiven) - model->B3SOIDDprt = 0.0; - if (!model->B3SOIDDeta0Given) - model->B3SOIDDeta0 = 0.08; /* no unit */ - if (!model->B3SOIDDetabGiven) - model->B3SOIDDetab = -0.07; /* unit 1/V */ - if (!model->B3SOIDDpclmGiven) - model->B3SOIDDpclm = 1.3; /* no unit */ - if (!model->B3SOIDDpdibl1Given) - model->B3SOIDDpdibl1 = .39; /* no unit */ - if (!model->B3SOIDDpdibl2Given) - model->B3SOIDDpdibl2 = 0.0086; /* no unit */ - if (!model->B3SOIDDpdiblbGiven) - model->B3SOIDDpdiblb = 0.0; /* 1/V */ - if (!model->B3SOIDDpvagGiven) - model->B3SOIDDpvag = 0.0; - if (!model->B3SOIDDwrGiven) - model->B3SOIDDwr = 1.0; - if (!model->B3SOIDDdwgGiven) - model->B3SOIDDdwg = 0.0; - if (!model->B3SOIDDdwbGiven) - model->B3SOIDDdwb = 0.0; - if (!model->B3SOIDDb0Given) - model->B3SOIDDb0 = 0.0; - if (!model->B3SOIDDb1Given) - model->B3SOIDDb1 = 0.0; - if (!model->B3SOIDDalpha0Given) - model->B3SOIDDalpha0 = 0.0; - if (!model->B3SOIDDalpha1Given) - model->B3SOIDDalpha1 = 1.0; - if (!model->B3SOIDDbeta0Given) - model->B3SOIDDbeta0 = 30.0; - - if (!model->B3SOIDDcgslGiven) - model->B3SOIDDcgsl = 0.0; - if (!model->B3SOIDDcgdlGiven) - model->B3SOIDDcgdl = 0.0; - if (!model->B3SOIDDckappaGiven) - model->B3SOIDDckappa = 0.6; - if (!model->B3SOIDDclcGiven) - model->B3SOIDDclc = 0.1e-7; - if (!model->B3SOIDDcleGiven) - model->B3SOIDDcle = 0.0; - if (!model->B3SOIDDtboxGiven) - model->B3SOIDDtbox = 3e-7; - if (!model->B3SOIDDtsiGiven) - model->B3SOIDDtsi = 1e-7; - if (!model->B3SOIDDxjGiven) - model->B3SOIDDxj = model->B3SOIDDtsi; - if (!model->B3SOIDDkb1Given) - model->B3SOIDDkb1 = 1; - if (!model->B3SOIDDkb3Given) - model->B3SOIDDkb3 = 1; - if (!model->B3SOIDDdvbd0Given) - model->B3SOIDDdvbd0 = 0.0; - if (!model->B3SOIDDdvbd1Given) - model->B3SOIDDdvbd1 = 0.0; - if (!model->B3SOIDDvbsaGiven) - model->B3SOIDDvbsa = 0.0; - if (!model->B3SOIDDdelpGiven) - model->B3SOIDDdelp = 0.02; - if (!model->B3SOIDDrbodyGiven) - model->B3SOIDDrbody = 0.0; - if (!model->B3SOIDDrbshGiven) - model->B3SOIDDrbsh = 0.0; - if (!model->B3SOIDDadice0Given) - model->B3SOIDDadice0 = 1; - if (!model->B3SOIDDabpGiven) - model->B3SOIDDabp = 1; - if (!model->B3SOIDDmxcGiven) - model->B3SOIDDmxc = -0.9; - if (!model->B3SOIDDrth0Given) - model->B3SOIDDrth0 = 0; - if (!model->B3SOIDDcth0Given) - model->B3SOIDDcth0 = 0; - - if (!model->B3SOIDDaiiGiven) - model->B3SOIDDaii = 0.0; - if (!model->B3SOIDDbiiGiven) - model->B3SOIDDbii = 0.0; - if (!model->B3SOIDDciiGiven) - model->B3SOIDDcii = 0.0; - if (!model->B3SOIDDdiiGiven) - model->B3SOIDDdii = -1.0; - if (!model->B3SOIDDagidlGiven) - model->B3SOIDDagidl = 0.0; - if (!model->B3SOIDDbgidlGiven) - model->B3SOIDDbgidl = 0.0; - if (!model->B3SOIDDngidlGiven) - model->B3SOIDDngidl = 1.2; - if (!model->B3SOIDDndiodeGiven) - model->B3SOIDDndiode = 1.0; - if (!model->B3SOIDDntunGiven) - model->B3SOIDDntun = 10.0; - if (!model->B3SOIDDisbjtGiven) - model->B3SOIDDisbjt = 1e-6; - if (!model->B3SOIDDisdifGiven) - model->B3SOIDDisdif = 0.0; - if (!model->B3SOIDDisrecGiven) - model->B3SOIDDisrec = 1e-5; - if (!model->B3SOIDDistunGiven) - model->B3SOIDDistun = 0.0; - if (!model->B3SOIDDxbjtGiven) - model->B3SOIDDxbjt = 2; - if (!model->B3SOIDDxdifGiven) - model->B3SOIDDxdif = 2; - if (!model->B3SOIDDxrecGiven) - model->B3SOIDDxrec = 20; - if (!model->B3SOIDDxtunGiven) - model->B3SOIDDxtun = 0; - if (!model->B3SOIDDedlGiven) - model->B3SOIDDedl = 2e-6; - if (!model->B3SOIDDkbjt1Given) - model->B3SOIDDkbjt1 = 0; - if (!model->B3SOIDDttGiven) - model->B3SOIDDtt = 1e-12; - if (!model->B3SOIDDasdGiven) - model->B3SOIDDasd = 0.3; - - /* unit degree celcius */ - if (!model->B3SOIDDtnomGiven) - model->B3SOIDDtnom = ckt->CKTnomTemp; - if (!model->B3SOIDDLintGiven) - model->B3SOIDDLint = 0.0; - if (!model->B3SOIDDLlGiven) - model->B3SOIDDLl = 0.0; - if (!model->B3SOIDDLlnGiven) - model->B3SOIDDLln = 1.0; - if (!model->B3SOIDDLwGiven) - model->B3SOIDDLw = 0.0; - if (!model->B3SOIDDLwnGiven) - model->B3SOIDDLwn = 1.0; - if (!model->B3SOIDDLwlGiven) - model->B3SOIDDLwl = 0.0; - if (!model->B3SOIDDLminGiven) - model->B3SOIDDLmin = 0.0; - if (!model->B3SOIDDLmaxGiven) - model->B3SOIDDLmax = 1.0; - if (!model->B3SOIDDWintGiven) - model->B3SOIDDWint = 0.0; - if (!model->B3SOIDDWlGiven) - model->B3SOIDDWl = 0.0; - if (!model->B3SOIDDWlnGiven) - model->B3SOIDDWln = 1.0; - if (!model->B3SOIDDWwGiven) - model->B3SOIDDWw = 0.0; - if (!model->B3SOIDDWwnGiven) - model->B3SOIDDWwn = 1.0; - if (!model->B3SOIDDWwlGiven) - model->B3SOIDDWwl = 0.0; - if (!model->B3SOIDDWminGiven) - model->B3SOIDDWmin = 0.0; - if (!model->B3SOIDDWmaxGiven) - model->B3SOIDDWmax = 1.0; - if (!model->B3SOIDDdwcGiven) - model->B3SOIDDdwc = model->B3SOIDDWint; - if (!model->B3SOIDDdlcGiven) - model->B3SOIDDdlc = model->B3SOIDDLint; - -/* Added for binning - START */ - /* Length dependence */ - if (!model->B3SOIDDlnpeakGiven) - model->B3SOIDDlnpeak = 0.0; - if (!model->B3SOIDDlnsubGiven) - model->B3SOIDDlnsub = 0.0; - if (!model->B3SOIDDlngateGiven) - model->B3SOIDDlngate = 0.0; - if (!model->B3SOIDDlvth0Given) - model->B3SOIDDlvth0 = 0.0; - if (!model->B3SOIDDlk1Given) - model->B3SOIDDlk1 = 0.0; - if (!model->B3SOIDDlk2Given) - model->B3SOIDDlk2 = 0.0; - if (!model->B3SOIDDlk3Given) - model->B3SOIDDlk3 = 0.0; - if (!model->B3SOIDDlk3bGiven) - model->B3SOIDDlk3b = 0.0; - if (!model->B3SOIDDlvbsaGiven) - model->B3SOIDDlvbsa = 0.0; - if (!model->B3SOIDDldelpGiven) - model->B3SOIDDldelp = 0.0; - if (!model->B3SOIDDlkb1Given) - model->B3SOIDDlkb1 = 0.0; - if (!model->B3SOIDDlkb3Given) - model->B3SOIDDlkb3 = 1.0; - if (!model->B3SOIDDldvbd0Given) - model->B3SOIDDldvbd0 = 1.0; - if (!model->B3SOIDDldvbd1Given) - model->B3SOIDDldvbd1 = 1.0; - if (!model->B3SOIDDlw0Given) - model->B3SOIDDlw0 = 0.0; - if (!model->B3SOIDDlnlxGiven) - model->B3SOIDDlnlx = 0.0; - if (!model->B3SOIDDldvt0Given) - model->B3SOIDDldvt0 = 0.0; - if (!model->B3SOIDDldvt1Given) - model->B3SOIDDldvt1 = 0.0; - if (!model->B3SOIDDldvt2Given) - model->B3SOIDDldvt2 = 0.0; - if (!model->B3SOIDDldvt0wGiven) - model->B3SOIDDldvt0w = 0.0; - if (!model->B3SOIDDldvt1wGiven) - model->B3SOIDDldvt1w = 0.0; - if (!model->B3SOIDDldvt2wGiven) - model->B3SOIDDldvt2w = 0.0; - if (!model->B3SOIDDlu0Given) - model->B3SOIDDlu0 = 0.0; - if (!model->B3SOIDDluaGiven) - model->B3SOIDDlua = 0.0; - if (!model->B3SOIDDlubGiven) - model->B3SOIDDlub = 0.0; - if (!model->B3SOIDDlucGiven) - model->B3SOIDDluc = 0.0; - if (!model->B3SOIDDlvsatGiven) - model->B3SOIDDlvsat = 0.0; - if (!model->B3SOIDDla0Given) - model->B3SOIDDla0 = 0.0; - if (!model->B3SOIDDlagsGiven) - model->B3SOIDDlags = 0.0; - if (!model->B3SOIDDlb0Given) - model->B3SOIDDlb0 = 0.0; - if (!model->B3SOIDDlb1Given) - model->B3SOIDDlb1 = 0.0; - if (!model->B3SOIDDlketaGiven) - model->B3SOIDDlketa = 0.0; - if (!model->B3SOIDDlabpGiven) - model->B3SOIDDlabp = 0.0; - if (!model->B3SOIDDlmxcGiven) - model->B3SOIDDlmxc = 0.0; - if (!model->B3SOIDDladice0Given) - model->B3SOIDDladice0 = 0.0; - if (!model->B3SOIDDla1Given) - model->B3SOIDDla1 = 0.0; - if (!model->B3SOIDDla2Given) - model->B3SOIDDla2 = 0.0; - if (!model->B3SOIDDlrdswGiven) - model->B3SOIDDlrdsw = 0.0; - if (!model->B3SOIDDlprwbGiven) - model->B3SOIDDlprwb = 0.0; - if (!model->B3SOIDDlprwgGiven) - model->B3SOIDDlprwg = 0.0; - if (!model->B3SOIDDlwrGiven) - model->B3SOIDDlwr = 0.0; - if (!model->B3SOIDDlnfactorGiven) - model->B3SOIDDlnfactor = 0.0; - if (!model->B3SOIDDldwgGiven) - model->B3SOIDDldwg = 0.0; - if (!model->B3SOIDDldwbGiven) - model->B3SOIDDldwb = 0.0; - if (!model->B3SOIDDlvoffGiven) - model->B3SOIDDlvoff = 0.0; - if (!model->B3SOIDDleta0Given) - model->B3SOIDDleta0 = 0.0; - if (!model->B3SOIDDletabGiven) - model->B3SOIDDletab = 0.0; - if (!model->B3SOIDDldsubGiven) - model->B3SOIDDldsub = 0.0; - if (!model->B3SOIDDlcitGiven) - model->B3SOIDDlcit = 0.0; - if (!model->B3SOIDDlcdscGiven) - model->B3SOIDDlcdsc = 0.0; - if (!model->B3SOIDDlcdscbGiven) - model->B3SOIDDlcdscb = 0.0; - if (!model->B3SOIDDlcdscdGiven) - model->B3SOIDDlcdscd = 0.0; - if (!model->B3SOIDDlpclmGiven) - model->B3SOIDDlpclm = 0.0; - if (!model->B3SOIDDlpdibl1Given) - model->B3SOIDDlpdibl1 = 0.0; - if (!model->B3SOIDDlpdibl2Given) - model->B3SOIDDlpdibl2 = 0.0; - if (!model->B3SOIDDlpdiblbGiven) - model->B3SOIDDlpdiblb = 0.0; - if (!model->B3SOIDDldroutGiven) - model->B3SOIDDldrout = 0.0; - if (!model->B3SOIDDlpvagGiven) - model->B3SOIDDlpvag = 0.0; - if (!model->B3SOIDDldeltaGiven) - model->B3SOIDDldelta = 0.0; - if (!model->B3SOIDDlaiiGiven) - model->B3SOIDDlaii = 0.0; - if (!model->B3SOIDDlbiiGiven) - model->B3SOIDDlbii = 0.0; - if (!model->B3SOIDDlciiGiven) - model->B3SOIDDlcii = 0.0; - if (!model->B3SOIDDldiiGiven) - model->B3SOIDDldii = 0.0; - if (!model->B3SOIDDlalpha0Given) - model->B3SOIDDlalpha0 = 0.0; - if (!model->B3SOIDDlalpha1Given) - model->B3SOIDDlalpha1 = 0.0; - if (!model->B3SOIDDlbeta0Given) - model->B3SOIDDlbeta0 = 0.0; - if (!model->B3SOIDDlagidlGiven) - model->B3SOIDDlagidl = 0.0; - if (!model->B3SOIDDlbgidlGiven) - model->B3SOIDDlbgidl = 0.0; - if (!model->B3SOIDDlngidlGiven) - model->B3SOIDDlngidl = 0.0; - if (!model->B3SOIDDlntunGiven) - model->B3SOIDDlntun = 0.0; - if (!model->B3SOIDDlndiodeGiven) - model->B3SOIDDlndiode = 0.0; - if (!model->B3SOIDDlisbjtGiven) - model->B3SOIDDlisbjt = 0.0; - if (!model->B3SOIDDlisdifGiven) - model->B3SOIDDlisdif = 0.0; - if (!model->B3SOIDDlisrecGiven) - model->B3SOIDDlisrec = 0.0; - if (!model->B3SOIDDlistunGiven) - model->B3SOIDDlistun = 0.0; - if (!model->B3SOIDDledlGiven) - model->B3SOIDDledl = 0.0; - if (!model->B3SOIDDlkbjt1Given) - model->B3SOIDDlkbjt1 = 0.0; - /* CV Model */ - if (!model->B3SOIDDlvsdfbGiven) - model->B3SOIDDlvsdfb = 0.0; - if (!model->B3SOIDDlvsdthGiven) - model->B3SOIDDlvsdth = 0.0; - /* Width dependence */ - if (!model->B3SOIDDwnpeakGiven) - model->B3SOIDDwnpeak = 0.0; - if (!model->B3SOIDDwnsubGiven) - model->B3SOIDDwnsub = 0.0; - if (!model->B3SOIDDwngateGiven) - model->B3SOIDDwngate = 0.0; - if (!model->B3SOIDDwvth0Given) - model->B3SOIDDwvth0 = 0.0; - if (!model->B3SOIDDwk1Given) - model->B3SOIDDwk1 = 0.0; - if (!model->B3SOIDDwk2Given) - model->B3SOIDDwk2 = 0.0; - if (!model->B3SOIDDwk3Given) - model->B3SOIDDwk3 = 0.0; - if (!model->B3SOIDDwk3bGiven) - model->B3SOIDDwk3b = 0.0; - if (!model->B3SOIDDwvbsaGiven) - model->B3SOIDDwvbsa = 0.0; - if (!model->B3SOIDDwdelpGiven) - model->B3SOIDDwdelp = 0.0; - if (!model->B3SOIDDwkb1Given) - model->B3SOIDDwkb1 = 0.0; - if (!model->B3SOIDDwkb3Given) - model->B3SOIDDwkb3 = 1.0; - if (!model->B3SOIDDwdvbd0Given) - model->B3SOIDDwdvbd0 = 1.0; - if (!model->B3SOIDDwdvbd1Given) - model->B3SOIDDwdvbd1 = 1.0; - if (!model->B3SOIDDww0Given) - model->B3SOIDDww0 = 0.0; - if (!model->B3SOIDDwnlxGiven) - model->B3SOIDDwnlx = 0.0; - if (!model->B3SOIDDwdvt0Given) - model->B3SOIDDwdvt0 = 0.0; - if (!model->B3SOIDDwdvt1Given) - model->B3SOIDDwdvt1 = 0.0; - if (!model->B3SOIDDwdvt2Given) - model->B3SOIDDwdvt2 = 0.0; - if (!model->B3SOIDDwdvt0wGiven) - model->B3SOIDDwdvt0w = 0.0; - if (!model->B3SOIDDwdvt1wGiven) - model->B3SOIDDwdvt1w = 0.0; - if (!model->B3SOIDDwdvt2wGiven) - model->B3SOIDDwdvt2w = 0.0; - if (!model->B3SOIDDwu0Given) - model->B3SOIDDwu0 = 0.0; - if (!model->B3SOIDDwuaGiven) - model->B3SOIDDwua = 0.0; - if (!model->B3SOIDDwubGiven) - model->B3SOIDDwub = 0.0; - if (!model->B3SOIDDwucGiven) - model->B3SOIDDwuc = 0.0; - if (!model->B3SOIDDwvsatGiven) - model->B3SOIDDwvsat = 0.0; - if (!model->B3SOIDDwa0Given) - model->B3SOIDDwa0 = 0.0; - if (!model->B3SOIDDwagsGiven) - model->B3SOIDDwags = 0.0; - if (!model->B3SOIDDwb0Given) - model->B3SOIDDwb0 = 0.0; - if (!model->B3SOIDDwb1Given) - model->B3SOIDDwb1 = 0.0; - if (!model->B3SOIDDwketaGiven) - model->B3SOIDDwketa = 0.0; - if (!model->B3SOIDDwabpGiven) - model->B3SOIDDwabp = 0.0; - if (!model->B3SOIDDwmxcGiven) - model->B3SOIDDwmxc = 0.0; - if (!model->B3SOIDDwadice0Given) - model->B3SOIDDwadice0 = 0.0; - if (!model->B3SOIDDwa1Given) - model->B3SOIDDwa1 = 0.0; - if (!model->B3SOIDDwa2Given) - model->B3SOIDDwa2 = 0.0; - if (!model->B3SOIDDwrdswGiven) - model->B3SOIDDwrdsw = 0.0; - if (!model->B3SOIDDwprwbGiven) - model->B3SOIDDwprwb = 0.0; - if (!model->B3SOIDDwprwgGiven) - model->B3SOIDDwprwg = 0.0; - if (!model->B3SOIDDwwrGiven) - model->B3SOIDDwwr = 0.0; - if (!model->B3SOIDDwnfactorGiven) - model->B3SOIDDwnfactor = 0.0; - if (!model->B3SOIDDwdwgGiven) - model->B3SOIDDwdwg = 0.0; - if (!model->B3SOIDDwdwbGiven) - model->B3SOIDDwdwb = 0.0; - if (!model->B3SOIDDwvoffGiven) - model->B3SOIDDwvoff = 0.0; - if (!model->B3SOIDDweta0Given) - model->B3SOIDDweta0 = 0.0; - if (!model->B3SOIDDwetabGiven) - model->B3SOIDDwetab = 0.0; - if (!model->B3SOIDDwdsubGiven) - model->B3SOIDDwdsub = 0.0; - if (!model->B3SOIDDwcitGiven) - model->B3SOIDDwcit = 0.0; - if (!model->B3SOIDDwcdscGiven) - model->B3SOIDDwcdsc = 0.0; - if (!model->B3SOIDDwcdscbGiven) - model->B3SOIDDwcdscb = 0.0; - if (!model->B3SOIDDwcdscdGiven) - model->B3SOIDDwcdscd = 0.0; - if (!model->B3SOIDDwpclmGiven) - model->B3SOIDDwpclm = 0.0; - if (!model->B3SOIDDwpdibl1Given) - model->B3SOIDDwpdibl1 = 0.0; - if (!model->B3SOIDDwpdibl2Given) - model->B3SOIDDwpdibl2 = 0.0; - if (!model->B3SOIDDwpdiblbGiven) - model->B3SOIDDwpdiblb = 0.0; - if (!model->B3SOIDDwdroutGiven) - model->B3SOIDDwdrout = 0.0; - if (!model->B3SOIDDwpvagGiven) - model->B3SOIDDwpvag = 0.0; - if (!model->B3SOIDDwdeltaGiven) - model->B3SOIDDwdelta = 0.0; - if (!model->B3SOIDDwaiiGiven) - model->B3SOIDDwaii = 0.0; - if (!model->B3SOIDDwbiiGiven) - model->B3SOIDDwbii = 0.0; - if (!model->B3SOIDDwciiGiven) - model->B3SOIDDwcii = 0.0; - if (!model->B3SOIDDwdiiGiven) - model->B3SOIDDwdii = 0.0; - if (!model->B3SOIDDwalpha0Given) - model->B3SOIDDwalpha0 = 0.0; - if (!model->B3SOIDDwalpha1Given) - model->B3SOIDDwalpha1 = 0.0; - if (!model->B3SOIDDwbeta0Given) - model->B3SOIDDwbeta0 = 0.0; - if (!model->B3SOIDDwagidlGiven) - model->B3SOIDDwagidl = 0.0; - if (!model->B3SOIDDwbgidlGiven) - model->B3SOIDDwbgidl = 0.0; - if (!model->B3SOIDDwngidlGiven) - model->B3SOIDDwngidl = 0.0; - if (!model->B3SOIDDwntunGiven) - model->B3SOIDDwntun = 0.0; - if (!model->B3SOIDDwndiodeGiven) - model->B3SOIDDwndiode = 0.0; - if (!model->B3SOIDDwisbjtGiven) - model->B3SOIDDwisbjt = 0.0; - if (!model->B3SOIDDwisdifGiven) - model->B3SOIDDwisdif = 0.0; - if (!model->B3SOIDDwisrecGiven) - model->B3SOIDDwisrec = 0.0; - if (!model->B3SOIDDwistunGiven) - model->B3SOIDDwistun = 0.0; - if (!model->B3SOIDDwedlGiven) - model->B3SOIDDwedl = 0.0; - if (!model->B3SOIDDwkbjt1Given) - model->B3SOIDDwkbjt1 = 0.0; - /* CV Model */ - if (!model->B3SOIDDwvsdfbGiven) - model->B3SOIDDwvsdfb = 0.0; - if (!model->B3SOIDDwvsdthGiven) - model->B3SOIDDwvsdth = 0.0; - /* Cross-term dependence */ - if (!model->B3SOIDDpnpeakGiven) - model->B3SOIDDpnpeak = 0.0; - if (!model->B3SOIDDpnsubGiven) - model->B3SOIDDpnsub = 0.0; - if (!model->B3SOIDDpngateGiven) - model->B3SOIDDpngate = 0.0; - if (!model->B3SOIDDpvth0Given) - model->B3SOIDDpvth0 = 0.0; - if (!model->B3SOIDDpk1Given) - model->B3SOIDDpk1 = 0.0; - if (!model->B3SOIDDpk2Given) - model->B3SOIDDpk2 = 0.0; - if (!model->B3SOIDDpk3Given) - model->B3SOIDDpk3 = 0.0; - if (!model->B3SOIDDpk3bGiven) - model->B3SOIDDpk3b = 0.0; - if (!model->B3SOIDDpvbsaGiven) - model->B3SOIDDpvbsa = 0.0; - if (!model->B3SOIDDpdelpGiven) - model->B3SOIDDpdelp = 0.0; - if (!model->B3SOIDDpkb1Given) - model->B3SOIDDpkb1 = 0.0; - if (!model->B3SOIDDpkb3Given) - model->B3SOIDDpkb3 = 1.0; - if (!model->B3SOIDDpdvbd0Given) - model->B3SOIDDpdvbd0 = 1.0; - if (!model->B3SOIDDpdvbd1Given) - model->B3SOIDDpdvbd1 = 1.0; - if (!model->B3SOIDDpw0Given) - model->B3SOIDDpw0 = 0.0; - if (!model->B3SOIDDpnlxGiven) - model->B3SOIDDpnlx = 0.0; - if (!model->B3SOIDDpdvt0Given) - model->B3SOIDDpdvt0 = 0.0; - if (!model->B3SOIDDpdvt1Given) - model->B3SOIDDpdvt1 = 0.0; - if (!model->B3SOIDDpdvt2Given) - model->B3SOIDDpdvt2 = 0.0; - if (!model->B3SOIDDpdvt0wGiven) - model->B3SOIDDpdvt0w = 0.0; - if (!model->B3SOIDDpdvt1wGiven) - model->B3SOIDDpdvt1w = 0.0; - if (!model->B3SOIDDpdvt2wGiven) - model->B3SOIDDpdvt2w = 0.0; - if (!model->B3SOIDDpu0Given) - model->B3SOIDDpu0 = 0.0; - if (!model->B3SOIDDpuaGiven) - model->B3SOIDDpua = 0.0; - if (!model->B3SOIDDpubGiven) - model->B3SOIDDpub = 0.0; - if (!model->B3SOIDDpucGiven) - model->B3SOIDDpuc = 0.0; - if (!model->B3SOIDDpvsatGiven) - model->B3SOIDDpvsat = 0.0; - if (!model->B3SOIDDpa0Given) - model->B3SOIDDpa0 = 0.0; - if (!model->B3SOIDDpagsGiven) - model->B3SOIDDpags = 0.0; - if (!model->B3SOIDDpb0Given) - model->B3SOIDDpb0 = 0.0; - if (!model->B3SOIDDpb1Given) - model->B3SOIDDpb1 = 0.0; - if (!model->B3SOIDDpketaGiven) - model->B3SOIDDpketa = 0.0; - if (!model->B3SOIDDpabpGiven) - model->B3SOIDDpabp = 0.0; - if (!model->B3SOIDDpmxcGiven) - model->B3SOIDDpmxc = 0.0; - if (!model->B3SOIDDpadice0Given) - model->B3SOIDDpadice0 = 0.0; - if (!model->B3SOIDDpa1Given) - model->B3SOIDDpa1 = 0.0; - if (!model->B3SOIDDpa2Given) - model->B3SOIDDpa2 = 0.0; - if (!model->B3SOIDDprdswGiven) - model->B3SOIDDprdsw = 0.0; - if (!model->B3SOIDDpprwbGiven) - model->B3SOIDDpprwb = 0.0; - if (!model->B3SOIDDpprwgGiven) - model->B3SOIDDpprwg = 0.0; - if (!model->B3SOIDDpwrGiven) - model->B3SOIDDpwr = 0.0; - if (!model->B3SOIDDpnfactorGiven) - model->B3SOIDDpnfactor = 0.0; - if (!model->B3SOIDDpdwgGiven) - model->B3SOIDDpdwg = 0.0; - if (!model->B3SOIDDpdwbGiven) - model->B3SOIDDpdwb = 0.0; - if (!model->B3SOIDDpvoffGiven) - model->B3SOIDDpvoff = 0.0; - if (!model->B3SOIDDpeta0Given) - model->B3SOIDDpeta0 = 0.0; - if (!model->B3SOIDDpetabGiven) - model->B3SOIDDpetab = 0.0; - if (!model->B3SOIDDpdsubGiven) - model->B3SOIDDpdsub = 0.0; - if (!model->B3SOIDDpcitGiven) - model->B3SOIDDpcit = 0.0; - if (!model->B3SOIDDpcdscGiven) - model->B3SOIDDpcdsc = 0.0; - if (!model->B3SOIDDpcdscbGiven) - model->B3SOIDDpcdscb = 0.0; - if (!model->B3SOIDDpcdscdGiven) - model->B3SOIDDpcdscd = 0.0; - if (!model->B3SOIDDppclmGiven) - model->B3SOIDDppclm = 0.0; - if (!model->B3SOIDDppdibl1Given) - model->B3SOIDDppdibl1 = 0.0; - if (!model->B3SOIDDppdibl2Given) - model->B3SOIDDppdibl2 = 0.0; - if (!model->B3SOIDDppdiblbGiven) - model->B3SOIDDppdiblb = 0.0; - if (!model->B3SOIDDpdroutGiven) - model->B3SOIDDpdrout = 0.0; - if (!model->B3SOIDDppvagGiven) - model->B3SOIDDppvag = 0.0; - if (!model->B3SOIDDpdeltaGiven) - model->B3SOIDDpdelta = 0.0; - if (!model->B3SOIDDpaiiGiven) - model->B3SOIDDpaii = 0.0; - if (!model->B3SOIDDpbiiGiven) - model->B3SOIDDpbii = 0.0; - if (!model->B3SOIDDpciiGiven) - model->B3SOIDDpcii = 0.0; - if (!model->B3SOIDDpdiiGiven) - model->B3SOIDDpdii = 0.0; - if (!model->B3SOIDDpalpha0Given) - model->B3SOIDDpalpha0 = 0.0; - if (!model->B3SOIDDpalpha1Given) - model->B3SOIDDpalpha1 = 0.0; - if (!model->B3SOIDDpbeta0Given) - model->B3SOIDDpbeta0 = 0.0; - if (!model->B3SOIDDpagidlGiven) - model->B3SOIDDpagidl = 0.0; - if (!model->B3SOIDDpbgidlGiven) - model->B3SOIDDpbgidl = 0.0; - if (!model->B3SOIDDpngidlGiven) - model->B3SOIDDpngidl = 0.0; - if (!model->B3SOIDDpntunGiven) - model->B3SOIDDpntun = 0.0; - if (!model->B3SOIDDpndiodeGiven) - model->B3SOIDDpndiode = 0.0; - if (!model->B3SOIDDpisbjtGiven) - model->B3SOIDDpisbjt = 0.0; - if (!model->B3SOIDDpisdifGiven) - model->B3SOIDDpisdif = 0.0; - if (!model->B3SOIDDpisrecGiven) - model->B3SOIDDpisrec = 0.0; - if (!model->B3SOIDDpistunGiven) - model->B3SOIDDpistun = 0.0; - if (!model->B3SOIDDpedlGiven) - model->B3SOIDDpedl = 0.0; - if (!model->B3SOIDDpkbjt1Given) - model->B3SOIDDpkbjt1 = 0.0; - /* CV Model */ - if (!model->B3SOIDDpvsdfbGiven) - model->B3SOIDDpvsdfb = 0.0; - if (!model->B3SOIDDpvsdthGiven) - model->B3SOIDDpvsdth = 0.0; -/* Added for binning - END */ - - if (!model->B3SOIDDcfGiven) - model->B3SOIDDcf = 2.0 * EPSOX / PI - * log(1.0 + 0.4e-6 / model->B3SOIDDtox); - if (!model->B3SOIDDcgdoGiven) - { if (model->B3SOIDDdlcGiven && (model->B3SOIDDdlc > 0.0)) - { model->B3SOIDDcgdo = model->B3SOIDDdlc * model->B3SOIDDcox - - model->B3SOIDDcgdl ; - } - else - model->B3SOIDDcgdo = 0.6 * model->B3SOIDDxj * model->B3SOIDDcox; - } - if (!model->B3SOIDDcgsoGiven) - { if (model->B3SOIDDdlcGiven && (model->B3SOIDDdlc > 0.0)) - { model->B3SOIDDcgso = model->B3SOIDDdlc * model->B3SOIDDcox - - model->B3SOIDDcgsl ; - } - else - model->B3SOIDDcgso = 0.6 * model->B3SOIDDxj * model->B3SOIDDcox; - } - - if (!model->B3SOIDDcgeoGiven) - { model->B3SOIDDcgeo = 0.0; - } - if (!model->B3SOIDDxpartGiven) - model->B3SOIDDxpart = 0.0; - if (!model->B3SOIDDsheetResistanceGiven) - model->B3SOIDDsheetResistance = 0.0; - if (!model->B3SOIDDcsdeswGiven) - model->B3SOIDDcsdesw = 0.0; - if (!model->B3SOIDDunitLengthGateSidewallJctCapGiven) - model->B3SOIDDunitLengthGateSidewallJctCap = 1e-10; - if (!model->B3SOIDDGatesidewallJctPotentialGiven) - model->B3SOIDDGatesidewallJctPotential = 0.7; - if (!model->B3SOIDDbodyJctGateSideGradingCoeffGiven) - model->B3SOIDDbodyJctGateSideGradingCoeff = 0.5; - if (!model->B3SOIDDoxideTrapDensityAGiven) - { if (model->B3SOIDDtype == NMOS) - model->B3SOIDDoxideTrapDensityA = 1e20; - else - model->B3SOIDDoxideTrapDensityA=9.9e18; - } - if (!model->B3SOIDDoxideTrapDensityBGiven) - { if (model->B3SOIDDtype == NMOS) - model->B3SOIDDoxideTrapDensityB = 5e4; - else - model->B3SOIDDoxideTrapDensityB = 2.4e3; - } - if (!model->B3SOIDDoxideTrapDensityCGiven) - { if (model->B3SOIDDtype == NMOS) - model->B3SOIDDoxideTrapDensityC = -1.4e-12; - else - model->B3SOIDDoxideTrapDensityC = 1.4e-12; - - } - if (!model->B3SOIDDemGiven) - model->B3SOIDDem = 4.1e7; /* V/m */ - if (!model->B3SOIDDefGiven) - model->B3SOIDDef = 1.0; - if (!model->B3SOIDDafGiven) - model->B3SOIDDaf = 1.0; - if (!model->B3SOIDDkfGiven) - model->B3SOIDDkf = 0.0; - if (!model->B3SOIDDnoifGiven) - model->B3SOIDDnoif = 1.0; - - /* loop through all the instances of the model */ - for (here = B3SOIDDinstances(model); here != NULL ; - here=B3SOIDDnextInstance(here)) - { - /* allocate a chunk of the state vector */ - here->B3SOIDDstates = *states; - *states += B3SOIDDnumStates; - - /* perform the parameter defaulting */ - if (!here->B3SOIDDdrainAreaGiven) - here->B3SOIDDdrainArea = 0.0; - if (!here->B3SOIDDdrainPerimeterGiven) - here->B3SOIDDdrainPerimeter = 0.0; - if (!here->B3SOIDDdrainSquaresGiven) - here->B3SOIDDdrainSquares = 1.0; - if (!here->B3SOIDDicVBSGiven) - here->B3SOIDDicVBS = 0; - if (!here->B3SOIDDicVDSGiven) - here->B3SOIDDicVDS = 0; - if (!here->B3SOIDDicVGSGiven) - here->B3SOIDDicVGS = 0; - if (!here->B3SOIDDicVESGiven) - here->B3SOIDDicVES = 0; - if (!here->B3SOIDDicVPSGiven) - here->B3SOIDDicVPS = 0; - if (!here->B3SOIDDbjtoffGiven) - here->B3SOIDDbjtoff = 0; - if (!here->B3SOIDDdebugModGiven) - here->B3SOIDDdebugMod = 0; - if (!here->B3SOIDDrth0Given) - here->B3SOIDDrth0 = model->B3SOIDDrth0; - if (!here->B3SOIDDcth0Given) - here->B3SOIDDcth0 = model->B3SOIDDcth0; - if (!here->B3SOIDDbodySquaresGiven) - here->B3SOIDDbodySquares = 1.0; - if (!here->B3SOIDDlGiven) - here->B3SOIDDl = 5e-6; - if (!here->B3SOIDDsourceAreaGiven) - here->B3SOIDDsourceArea = 0; - if (!here->B3SOIDDsourcePerimeterGiven) - here->B3SOIDDsourcePerimeter = 0; - if (!here->B3SOIDDsourceSquaresGiven) - here->B3SOIDDsourceSquares = 1; - if (!here->B3SOIDDwGiven) - here->B3SOIDDw = 5e-6; - - if (!here->B3SOIDDmGiven) - here->B3SOIDDm = 1; - - if (!here->B3SOIDDoffGiven) - here->B3SOIDDoff = 0; - - /* process drain series resistance */ - if ((model->B3SOIDDsheetResistance > 0.0) && - (here->B3SOIDDdrainSquares > 0.0 ) && - (here->B3SOIDDdNodePrime == 0)) - { error = CKTmkVolt(ckt,&tmp,here->B3SOIDDname,"drain"); - if(error) return(error); - here->B3SOIDDdNodePrime = tmp->number; - if (ckt->CKTcopyNodesets) { - if (CKTinst2Node(ckt,here,1,&tmpNode,&tmpName)==OK) { - if (tmpNode->nsGiven) { - tmp->nodeset=tmpNode->nodeset; - tmp->nsGiven=tmpNode->nsGiven; - } - } - } - - } - else - { here->B3SOIDDdNodePrime = here->B3SOIDDdNode; - } - - /* process source series resistance */ - if ((model->B3SOIDDsheetResistance > 0.0) && - (here->B3SOIDDsourceSquares > 0.0 ) && - (here->B3SOIDDsNodePrime == 0)) - { error = CKTmkVolt(ckt,&tmp,here->B3SOIDDname,"source"); - if(error) return(error); - here->B3SOIDDsNodePrime = tmp->number; - - if (ckt->CKTcopyNodesets) { - if (CKTinst2Node(ckt,here,3,&tmpNode,&tmpName)==OK) { - if (tmpNode->nsGiven) { - tmp->nodeset=tmpNode->nodeset; - tmp->nsGiven=tmpNode->nsGiven; - } - } - } - - } - else - { here->B3SOIDDsNodePrime = here->B3SOIDDsNode; - } - - /* process effective silicon film thickness */ - model->B3SOIDDcbox = 3.453133e-11 / model->B3SOIDDtbox; - model->B3SOIDDcsi = 1.03594e-10 / model->B3SOIDDtsi; - Cboxt = model->B3SOIDDcbox * model->B3SOIDDcsi / (model->B3SOIDDcbox + model->B3SOIDDcsi); - model->B3SOIDDqsi = Charge_q*model->B3SOIDDnpeak*1e6*model->B3SOIDDtsi; - /* Tsieff */ - tmp1 = 2.0 * EPSSI * model->B3SOIDDvbsa / Charge_q - / (1e6*model->B3SOIDDnpeak); - tmp2 = model->B3SOIDDtsi * model->B3SOIDDtsi; - if (tmp2 < tmp1) - { - fprintf(stderr, "vbsa = %.3f is too large for this tsi = %.3e and is automatically set to zero\n", model->B3SOIDDvbsa, model->B3SOIDDtsi); - model->B3SOIDDcsieff = model->B3SOIDDcsi; - model->B3SOIDDqsieff = model->B3SOIDDqsi; - } - else - { - tmp1 = sqrt(model->B3SOIDDtsi * model->B3SOIDDtsi - - 2.0 * EPSSI * model->B3SOIDDvbsa / Charge_q / - (1e6*model->B3SOIDDnpeak)); - model->B3SOIDDcsieff = 1.03594e-10 / tmp1; - model->B3SOIDDqsieff = Charge_q*model->B3SOIDDnpeak*1e6*tmp1; - } - model->B3SOIDDcsit = 1/(1/model->B3SOIDDcox + 1/model->B3SOIDDcsieff); - model->B3SOIDDcboxt = 1/(1/model->B3SOIDDcbox + 1/model->B3SOIDDcsieff); - nfb0 = 1/(1 + model->B3SOIDDcbox / model->B3SOIDDcsit); - model->B3SOIDDnfb = model->B3SOIDDkb3 * nfb0; - model->B3SOIDDadice = model->B3SOIDDadice0 / ( 1 + Cboxt / model->B3SOIDDcox); - - here->B3SOIDDfloat = 0; - - here->B3SOIDDpNode = here->B3SOIDDpNodeExt; - here->B3SOIDDbNode = here->B3SOIDDbNodeExt; - here->B3SOIDDtempNode = here->B3SOIDDtempNodeExt; - - if (here->B3SOIDDbNode == -1) - /* no body contact but bNode to be created for SPICE iteration */ - { error = CKTmkVolt(ckt,&tmp,here->B3SOIDDname,"Body"); - if(error) return(error); - here->B3SOIDDbNode = tmp->number; - here->B3SOIDDpNode = 0; - here->B3SOIDDfloat = 1; - here->B3SOIDDbodyMod = 0; - } - else /* if body tied */ - { /* ideal body tie */ - if ((model->B3SOIDDrbody == 0.0) && (model->B3SOIDDrbsh == 0.0)) - { - here->B3SOIDDbodyMod = 2; - /* pNode is not used in this case */ - } - else { - error = CKTmkVolt(ckt, &tmp, here->B3SOIDDname, "Body"); - if(error) return(error); - here->B3SOIDDbodyMod = 1; - here->B3SOIDDpNode = here->B3SOIDDbNode; - here->B3SOIDDbNode = tmp->number; - } - } - - if ((model->B3SOIDDshMod == 1) && (here->B3SOIDDrth0!=0)) - { - error = CKTmkVolt(ckt,&tmp,here->B3SOIDDname,"Temp"); - if(error) return(error); - here->B3SOIDDtempNode = tmp->number; - - } else { - here->B3SOIDDtempNode = 0; - } - -/* here for debugging purpose only */ - if ((here->B3SOIDDdebugMod > 1) || (here->B3SOIDDdebugMod == -1)) - { - /* The real Vbs value */ - error = CKTmkVolt(ckt, &tmp, here->B3SOIDDname, "Vbs"); - if(error) return(error); - here->B3SOIDDvbsNode = tmp->number; - - error = CKTmkVolt(ckt, &tmp, here->B3SOIDDname, "Ids"); - if(error) return(error); - here->B3SOIDDidsNode = tmp->number; - - error = CKTmkVolt(ckt, &tmp, here->B3SOIDDname, "Ic"); - if(error) return(error); - here->B3SOIDDicNode = tmp->number; - - error = CKTmkVolt(ckt, &tmp, here->B3SOIDDname, "Ibs"); - if(error) return(error); - here->B3SOIDDibsNode = tmp->number; - - error = CKTmkVolt(ckt, &tmp, here->B3SOIDDname, "Ibd"); - if(error) return(error); - here->B3SOIDDibdNode = tmp->number; - - error = CKTmkVolt(ckt, &tmp, here->B3SOIDDname, "Iii"); - if(error) return(error); - here->B3SOIDDiiiNode = tmp->number; - - error = CKTmkVolt(ckt, &tmp, here->B3SOIDDname, "Igidl"); - if(error) return(error); - here->B3SOIDDigidlNode = tmp->number; - - error = CKTmkVolt(ckt, &tmp, here->B3SOIDDname, "Itun"); - if(error) return(error); - here->B3SOIDDitunNode = tmp->number; - - error = CKTmkVolt(ckt, &tmp, here->B3SOIDDname, "Ibp"); - if(error) return(error); - here->B3SOIDDibpNode = tmp->number; - - error = CKTmkVolt(ckt, &tmp, here->B3SOIDDname, "Abeff"); - if(error) return(error); - here->B3SOIDDabeffNode = tmp->number; - - error = CKTmkVolt(ckt, &tmp, here->B3SOIDDname, "Vbs0eff"); - if(error) return(error); - here->B3SOIDDvbs0effNode = tmp->number; - - error = CKTmkVolt(ckt, &tmp, here->B3SOIDDname, "Vbseff"); - if(error) return(error); - here->B3SOIDDvbseffNode = tmp->number; - - error = CKTmkVolt(ckt, &tmp, here->B3SOIDDname, "Xc"); - if(error) return(error); - here->B3SOIDDxcNode = tmp->number; - - error = CKTmkVolt(ckt, &tmp, here->B3SOIDDname, "Cbb"); - if(error) return(error); - here->B3SOIDDcbbNode = tmp->number; - - error = CKTmkVolt(ckt, &tmp, here->B3SOIDDname, "Cbd"); - if(error) return(error); - here->B3SOIDDcbdNode = tmp->number; - - error = CKTmkVolt(ckt, &tmp, here->B3SOIDDname, "Cbg"); - if(error) return(error); - here->B3SOIDDcbgNode = tmp->number; - - error = CKTmkVolt(ckt, &tmp, here->B3SOIDDname, "Qbody"); - if(error) return(error); - here->B3SOIDDqbNode = tmp->number; - - error = CKTmkVolt(ckt, &tmp, here->B3SOIDDname, "Qbf"); - if(error) return(error); - here->B3SOIDDqbfNode = tmp->number; - - error = CKTmkVolt(ckt, &tmp, here->B3SOIDDname, "Qjs"); - if(error) return(error); - here->B3SOIDDqjsNode = tmp->number; - - error = CKTmkVolt(ckt, &tmp, here->B3SOIDDname, "Qjd"); - if(error) return(error); - here->B3SOIDDqjdNode = tmp->number; - - /* clean up last */ - error = CKTmkVolt(ckt, &tmp, here->B3SOIDDname, "Gm"); - if(error) return(error); - here->B3SOIDDgmNode = tmp->number; - - error = CKTmkVolt(ckt, &tmp, here->B3SOIDDname, "Gmbs"); - if(error) return(error); - here->B3SOIDDgmbsNode = tmp->number; - - error = CKTmkVolt(ckt, &tmp, here->B3SOIDDname, "Gds"); - if(error) return(error); - here->B3SOIDDgdsNode = tmp->number; - - error = CKTmkVolt(ckt, &tmp, here->B3SOIDDname, "Gme"); - if(error) return(error); - here->B3SOIDDgmeNode = tmp->number; - - error = CKTmkVolt(ckt, &tmp, here->B3SOIDDname, "Vbs0teff"); - if(error) return(error); - here->B3SOIDDvbs0teffNode = tmp->number; - - error = CKTmkVolt(ckt, &tmp, here->B3SOIDDname, "Vth"); - if(error) return(error); - here->B3SOIDDvthNode = tmp->number; - - error = CKTmkVolt(ckt, &tmp, here->B3SOIDDname, "Vgsteff"); - if(error) return(error); - here->B3SOIDDvgsteffNode = tmp->number; - - error = CKTmkVolt(ckt, &tmp, here->B3SOIDDname, "Xcsat"); - if(error) return(error); - here->B3SOIDDxcsatNode = tmp->number; - - error = CKTmkVolt(ckt, &tmp, here->B3SOIDDname, "Qac0"); - if(error) return(error); - here->B3SOIDDqaccNode = tmp->number; - - error = CKTmkVolt(ckt, &tmp, here->B3SOIDDname, "Qsub0"); - if(error) return(error); - here->B3SOIDDqsub0Node = tmp->number; - - error = CKTmkVolt(ckt, &tmp, here->B3SOIDDname, "Qsubs1"); - if(error) return(error); - here->B3SOIDDqsubs1Node = tmp->number; - - error = CKTmkVolt(ckt, &tmp, here->B3SOIDDname, "Qsubs2"); - if(error) return(error); - here->B3SOIDDqsubs2Node = tmp->number; - - error = CKTmkVolt(ckt, &tmp, here->B3SOIDDname, "Qsub"); - if(error) return(error); - here->B3SOIDDqeNode = tmp->number; - - error = CKTmkVolt(ckt, &tmp, here->B3SOIDDname, "Qdrn"); - if(error) return(error); - here->B3SOIDDqdNode = tmp->number; - - error = CKTmkVolt(ckt, &tmp, here->B3SOIDDname, "Qgate"); - if(error) return(error); - here->B3SOIDDqgNode = tmp->number; - - error = CKTmkVolt(ckt, &tmp, here->B3SOIDDname, "Vdscv"); - if(error) return(error); - here->B3SOIDDvdscvNode = tmp->number; - - error = CKTmkVolt(ckt, &tmp, here->B3SOIDDname, "Vcscv"); - if(error) return(error); - here->B3SOIDDvcscvNode = tmp->number; - - error = CKTmkVolt(ckt, &tmp, here->B3SOIDDname, "Cbe"); - if(error) return(error); - here->B3SOIDDcbeNode = tmp->number; - - error = CKTmkVolt(ckt, &tmp, here->B3SOIDDname, "Dum1"); - if(error) return(error); - here->B3SOIDDdum1Node = tmp->number; - - error = CKTmkVolt(ckt, &tmp, here->B3SOIDDname, "Dum2"); - if(error) return(error); - here->B3SOIDDdum2Node = tmp->number; - - error = CKTmkVolt(ckt, &tmp, here->B3SOIDDname, "Dum3"); - if(error) return(error); - here->B3SOIDDdum3Node = tmp->number; - - error = CKTmkVolt(ckt, &tmp, here->B3SOIDDname, "Dum4"); - if(error) return(error); - here->B3SOIDDdum4Node = tmp->number; - - error = CKTmkVolt(ckt, &tmp, here->B3SOIDDname, "Dum5"); - if(error) return(error); - here->B3SOIDDdum5Node = tmp->number; - } - - /* set Sparse Matrix Pointers */ - -/* macro to make elements with built in test for out of memory */ -#define TSTALLOC(ptr,first,second) \ -do { if((here->ptr = SMPmakeElt(matrix, here->first, here->second)) == NULL){\ - return(E_NOMEM);\ -} } while(0) - - - if ((model->B3SOIDDshMod == 1) && (here->B3SOIDDrth0!=0.0)) { - TSTALLOC(B3SOIDDTemptempPtr, B3SOIDDtempNode, B3SOIDDtempNode); - TSTALLOC(B3SOIDDTempdpPtr, B3SOIDDtempNode, B3SOIDDdNodePrime); - TSTALLOC(B3SOIDDTempspPtr, B3SOIDDtempNode, B3SOIDDsNodePrime); - TSTALLOC(B3SOIDDTempgPtr, B3SOIDDtempNode, B3SOIDDgNode); - TSTALLOC(B3SOIDDTempbPtr, B3SOIDDtempNode, B3SOIDDbNode); - TSTALLOC(B3SOIDDTempePtr, B3SOIDDtempNode, B3SOIDDeNode); - - TSTALLOC(B3SOIDDGtempPtr, B3SOIDDgNode, B3SOIDDtempNode); - TSTALLOC(B3SOIDDDPtempPtr, B3SOIDDdNodePrime, B3SOIDDtempNode); - TSTALLOC(B3SOIDDSPtempPtr, B3SOIDDsNodePrime, B3SOIDDtempNode); - TSTALLOC(B3SOIDDEtempPtr, B3SOIDDeNode, B3SOIDDtempNode); - TSTALLOC(B3SOIDDBtempPtr, B3SOIDDbNode, B3SOIDDtempNode); - - if (here->B3SOIDDbodyMod == 1) { - TSTALLOC(B3SOIDDPtempPtr, B3SOIDDpNode, B3SOIDDtempNode); - } - } - if (here->B3SOIDDbodyMod == 2) { - /* Don't create any Jacobian entry for pNode */ - } - else if (here->B3SOIDDbodyMod == 1) { - TSTALLOC(B3SOIDDBpPtr, B3SOIDDbNode, B3SOIDDpNode); - TSTALLOC(B3SOIDDPbPtr, B3SOIDDpNode, B3SOIDDbNode); - TSTALLOC(B3SOIDDPpPtr, B3SOIDDpNode, B3SOIDDpNode); - TSTALLOC(B3SOIDDPgPtr, B3SOIDDpNode, B3SOIDDgNode); - TSTALLOC(B3SOIDDPdpPtr, B3SOIDDpNode, B3SOIDDdNodePrime); - TSTALLOC(B3SOIDDPspPtr, B3SOIDDpNode, B3SOIDDsNodePrime); - TSTALLOC(B3SOIDDPePtr, B3SOIDDpNode, B3SOIDDeNode); - } - - TSTALLOC(B3SOIDDEgPtr, B3SOIDDeNode, B3SOIDDgNode); - TSTALLOC(B3SOIDDEdpPtr, B3SOIDDeNode, B3SOIDDdNodePrime); - TSTALLOC(B3SOIDDEspPtr, B3SOIDDeNode, B3SOIDDsNodePrime); - TSTALLOC(B3SOIDDGePtr, B3SOIDDgNode, B3SOIDDeNode); - TSTALLOC(B3SOIDDDPePtr, B3SOIDDdNodePrime, B3SOIDDeNode); - TSTALLOC(B3SOIDDSPePtr, B3SOIDDsNodePrime, B3SOIDDeNode); - - TSTALLOC(B3SOIDDEbPtr, B3SOIDDeNode, B3SOIDDbNode); - TSTALLOC(B3SOIDDGbPtr, B3SOIDDgNode, B3SOIDDbNode); - TSTALLOC(B3SOIDDDPbPtr, B3SOIDDdNodePrime, B3SOIDDbNode); - TSTALLOC(B3SOIDDSPbPtr, B3SOIDDsNodePrime, B3SOIDDbNode); - TSTALLOC(B3SOIDDBePtr, B3SOIDDbNode, B3SOIDDeNode); - TSTALLOC(B3SOIDDBgPtr, B3SOIDDbNode, B3SOIDDgNode); - TSTALLOC(B3SOIDDBdpPtr, B3SOIDDbNode, B3SOIDDdNodePrime); - TSTALLOC(B3SOIDDBspPtr, B3SOIDDbNode, B3SOIDDsNodePrime); - TSTALLOC(B3SOIDDBbPtr, B3SOIDDbNode, B3SOIDDbNode); - - TSTALLOC(B3SOIDDEePtr, B3SOIDDeNode, B3SOIDDeNode); - - TSTALLOC(B3SOIDDGgPtr, B3SOIDDgNode, B3SOIDDgNode); - TSTALLOC(B3SOIDDGdpPtr, B3SOIDDgNode, B3SOIDDdNodePrime); - TSTALLOC(B3SOIDDGspPtr, B3SOIDDgNode, B3SOIDDsNodePrime); - - TSTALLOC(B3SOIDDDPgPtr, B3SOIDDdNodePrime, B3SOIDDgNode); - TSTALLOC(B3SOIDDDPdpPtr, B3SOIDDdNodePrime, B3SOIDDdNodePrime); - TSTALLOC(B3SOIDDDPspPtr, B3SOIDDdNodePrime, B3SOIDDsNodePrime); - TSTALLOC(B3SOIDDDPdPtr, B3SOIDDdNodePrime, B3SOIDDdNode); - - TSTALLOC(B3SOIDDSPgPtr, B3SOIDDsNodePrime, B3SOIDDgNode); - TSTALLOC(B3SOIDDSPdpPtr, B3SOIDDsNodePrime, B3SOIDDdNodePrime); - TSTALLOC(B3SOIDDSPspPtr, B3SOIDDsNodePrime, B3SOIDDsNodePrime); - TSTALLOC(B3SOIDDSPsPtr, B3SOIDDsNodePrime, B3SOIDDsNode); - - TSTALLOC(B3SOIDDDdPtr, B3SOIDDdNode, B3SOIDDdNode); - TSTALLOC(B3SOIDDDdpPtr, B3SOIDDdNode, B3SOIDDdNodePrime); - - TSTALLOC(B3SOIDDSsPtr, B3SOIDDsNode, B3SOIDDsNode); - TSTALLOC(B3SOIDDSspPtr, B3SOIDDsNode, B3SOIDDsNodePrime); - -/* here for debugging purpose only */ - if ((here->B3SOIDDdebugMod > 1) || (here->B3SOIDDdebugMod == -1)) - { - TSTALLOC(B3SOIDDVbsPtr, B3SOIDDvbsNode, B3SOIDDvbsNode) ; - TSTALLOC(B3SOIDDIdsPtr, B3SOIDDidsNode, B3SOIDDidsNode); - TSTALLOC(B3SOIDDIcPtr, B3SOIDDicNode, B3SOIDDicNode); - TSTALLOC(B3SOIDDIbsPtr, B3SOIDDibsNode, B3SOIDDibsNode); - TSTALLOC(B3SOIDDIbdPtr, B3SOIDDibdNode, B3SOIDDibdNode); - TSTALLOC(B3SOIDDIiiPtr, B3SOIDDiiiNode, B3SOIDDiiiNode); - TSTALLOC(B3SOIDDIgidlPtr, B3SOIDDigidlNode, B3SOIDDigidlNode); - TSTALLOC(B3SOIDDItunPtr, B3SOIDDitunNode, B3SOIDDitunNode); - TSTALLOC(B3SOIDDIbpPtr, B3SOIDDibpNode, B3SOIDDibpNode); - TSTALLOC(B3SOIDDAbeffPtr, B3SOIDDabeffNode, B3SOIDDabeffNode); - TSTALLOC(B3SOIDDVbs0effPtr, B3SOIDDvbs0effNode, B3SOIDDvbs0effNode); - TSTALLOC(B3SOIDDVbseffPtr, B3SOIDDvbseffNode, B3SOIDDvbseffNode); - TSTALLOC(B3SOIDDXcPtr, B3SOIDDxcNode, B3SOIDDxcNode); - TSTALLOC(B3SOIDDCbbPtr, B3SOIDDcbbNode, B3SOIDDcbbNode); - TSTALLOC(B3SOIDDCbdPtr, B3SOIDDcbdNode, B3SOIDDcbdNode); - TSTALLOC(B3SOIDDCbgPtr, B3SOIDDcbgNode, B3SOIDDcbgNode); - TSTALLOC(B3SOIDDqbPtr, B3SOIDDqbNode, B3SOIDDqbNode); - TSTALLOC(B3SOIDDQbfPtr, B3SOIDDqbfNode, B3SOIDDqbfNode); - TSTALLOC(B3SOIDDQjsPtr, B3SOIDDqjsNode, B3SOIDDqjsNode); - TSTALLOC(B3SOIDDQjdPtr, B3SOIDDqjdNode, B3SOIDDqjdNode); - - /* clean up last */ - TSTALLOC(B3SOIDDGmPtr, B3SOIDDgmNode, B3SOIDDgmNode); - TSTALLOC(B3SOIDDGmbsPtr, B3SOIDDgmbsNode, B3SOIDDgmbsNode); - TSTALLOC(B3SOIDDGdsPtr, B3SOIDDgdsNode, B3SOIDDgdsNode); - TSTALLOC(B3SOIDDGmePtr, B3SOIDDgmeNode, B3SOIDDgmeNode); - TSTALLOC(B3SOIDDVbs0teffPtr, B3SOIDDvbs0teffNode, B3SOIDDvbs0teffNode); - TSTALLOC(B3SOIDDVthPtr, B3SOIDDvthNode, B3SOIDDvthNode); - TSTALLOC(B3SOIDDVgsteffPtr, B3SOIDDvgsteffNode, B3SOIDDvgsteffNode); - TSTALLOC(B3SOIDDXcsatPtr, B3SOIDDxcsatNode, B3SOIDDxcsatNode); - TSTALLOC(B3SOIDDVcscvPtr, B3SOIDDvcscvNode, B3SOIDDvcscvNode); - TSTALLOC(B3SOIDDVdscvPtr, B3SOIDDvdscvNode, B3SOIDDvdscvNode); - TSTALLOC(B3SOIDDCbePtr, B3SOIDDcbeNode, B3SOIDDcbeNode); - TSTALLOC(B3SOIDDDum1Ptr, B3SOIDDdum1Node, B3SOIDDdum1Node); - TSTALLOC(B3SOIDDDum2Ptr, B3SOIDDdum2Node, B3SOIDDdum2Node); - TSTALLOC(B3SOIDDDum3Ptr, B3SOIDDdum3Node, B3SOIDDdum3Node); - TSTALLOC(B3SOIDDDum4Ptr, B3SOIDDdum4Node, B3SOIDDdum4Node); - TSTALLOC(B3SOIDDDum5Ptr, B3SOIDDdum5Node, B3SOIDDdum5Node); - TSTALLOC(B3SOIDDQaccPtr, B3SOIDDqaccNode, B3SOIDDqaccNode); - TSTALLOC(B3SOIDDQsub0Ptr, B3SOIDDqsub0Node, B3SOIDDqsub0Node); - TSTALLOC(B3SOIDDQsubs1Ptr, B3SOIDDqsubs1Node, B3SOIDDqsubs1Node); - TSTALLOC(B3SOIDDQsubs2Ptr, B3SOIDDqsubs2Node, B3SOIDDqsubs2Node); - TSTALLOC(B3SOIDDqePtr, B3SOIDDqeNode, B3SOIDDqeNode); - TSTALLOC(B3SOIDDqdPtr, B3SOIDDqdNode, B3SOIDDqdNode); - TSTALLOC(B3SOIDDqgPtr, B3SOIDDqgNode, B3SOIDDqgNode); - } - - } - } - return(OK); -} - -int -B3SOIDDunsetup(GENmodel *inModel, CKTcircuit *ckt) -{ - B3SOIDDmodel *model; - B3SOIDDinstance *here; - - for (model = (B3SOIDDmodel *)inModel; model != NULL; - model = B3SOIDDnextModel(model)) - { - for (here = B3SOIDDinstances(model); here != NULL; - here=B3SOIDDnextInstance(here)) - { - /* here for debugging purpose only */ - if (here->B3SOIDDdum5Node > 0) - CKTdltNNum(ckt, here->B3SOIDDdum5Node); - here->B3SOIDDdum5Node = 0; - - if (here->B3SOIDDdum4Node > 0) - CKTdltNNum(ckt, here->B3SOIDDdum4Node); - here->B3SOIDDdum4Node = 0; - - if (here->B3SOIDDdum3Node > 0) - CKTdltNNum(ckt, here->B3SOIDDdum3Node); - here->B3SOIDDdum3Node = 0; - - if (here->B3SOIDDdum2Node > 0) - CKTdltNNum(ckt, here->B3SOIDDdum2Node); - here->B3SOIDDdum2Node = 0; - - if (here->B3SOIDDdum1Node > 0) - CKTdltNNum(ckt, here->B3SOIDDdum1Node); - here->B3SOIDDdum1Node = 0; - - if (here->B3SOIDDcbeNode > 0) - CKTdltNNum(ckt, here->B3SOIDDcbeNode); - here->B3SOIDDcbeNode = 0; - - if (here->B3SOIDDvcscvNode > 0) - CKTdltNNum(ckt, here->B3SOIDDvcscvNode); - here->B3SOIDDvcscvNode = 0; - - if (here->B3SOIDDvdscvNode > 0) - CKTdltNNum(ckt, here->B3SOIDDvdscvNode); - here->B3SOIDDvdscvNode = 0; - - if (here->B3SOIDDqgNode > 0) - CKTdltNNum(ckt, here->B3SOIDDqgNode); - here->B3SOIDDqgNode = 0; - - if (here->B3SOIDDqdNode > 0) - CKTdltNNum(ckt, here->B3SOIDDqdNode); - here->B3SOIDDqdNode = 0; - - if (here->B3SOIDDqeNode > 0) - CKTdltNNum(ckt, here->B3SOIDDqeNode); - here->B3SOIDDqeNode = 0; - - if (here->B3SOIDDqsubs2Node > 0) - CKTdltNNum(ckt, here->B3SOIDDqsubs2Node); - here->B3SOIDDqsubs2Node = 0; - - if (here->B3SOIDDqsubs1Node > 0) - CKTdltNNum(ckt, here->B3SOIDDqsubs1Node); - here->B3SOIDDqsubs1Node = 0; - - if (here->B3SOIDDqsub0Node > 0) - CKTdltNNum(ckt, here->B3SOIDDqsub0Node); - here->B3SOIDDqsub0Node = 0; - - if (here->B3SOIDDqaccNode > 0) - CKTdltNNum(ckt, here->B3SOIDDqaccNode); - here->B3SOIDDqaccNode = 0; - - if (here->B3SOIDDxcsatNode > 0) - CKTdltNNum(ckt, here->B3SOIDDxcsatNode); - here->B3SOIDDxcsatNode = 0; - - if (here->B3SOIDDvgsteffNode > 0) - CKTdltNNum(ckt, here->B3SOIDDvgsteffNode); - here->B3SOIDDvgsteffNode = 0; - - if (here->B3SOIDDvthNode > 0) - CKTdltNNum(ckt, here->B3SOIDDvthNode); - here->B3SOIDDvthNode = 0; - - if (here->B3SOIDDvbs0teffNode > 0) - CKTdltNNum(ckt, here->B3SOIDDvbs0teffNode); - here->B3SOIDDvbs0teffNode = 0; - - if (here->B3SOIDDgmeNode > 0) - CKTdltNNum(ckt, here->B3SOIDDgmeNode); - here->B3SOIDDgmeNode = 0; - - if (here->B3SOIDDgdsNode > 0) - CKTdltNNum(ckt, here->B3SOIDDgdsNode); - here->B3SOIDDgdsNode = 0; - - if (here->B3SOIDDgmbsNode > 0) - CKTdltNNum(ckt, here->B3SOIDDgmbsNode); - here->B3SOIDDgmbsNode = 0; - - if (here->B3SOIDDgmNode > 0) - CKTdltNNum(ckt, here->B3SOIDDgmNode); - here->B3SOIDDgmNode = 0; - - if (here->B3SOIDDqjdNode > 0) - CKTdltNNum(ckt, here->B3SOIDDqjdNode); - here->B3SOIDDqjdNode = 0; - - if (here->B3SOIDDqjsNode > 0) - CKTdltNNum(ckt, here->B3SOIDDqjsNode); - here->B3SOIDDqjsNode = 0; - - if (here->B3SOIDDqbfNode > 0) - CKTdltNNum(ckt, here->B3SOIDDqbfNode); - here->B3SOIDDqbfNode = 0; - - if (here->B3SOIDDqbNode > 0) - CKTdltNNum(ckt, here->B3SOIDDqbNode); - here->B3SOIDDqbNode = 0; - - if (here->B3SOIDDcbgNode > 0) - CKTdltNNum(ckt, here->B3SOIDDcbgNode); - here->B3SOIDDcbgNode = 0; - - if (here->B3SOIDDcbdNode > 0) - CKTdltNNum(ckt, here->B3SOIDDcbdNode); - here->B3SOIDDcbdNode = 0; - - if (here->B3SOIDDcbbNode > 0) - CKTdltNNum(ckt, here->B3SOIDDcbbNode); - here->B3SOIDDcbbNode = 0; - - if (here->B3SOIDDxcNode > 0) - CKTdltNNum(ckt, here->B3SOIDDxcNode); - here->B3SOIDDxcNode = 0; - - if (here->B3SOIDDvbseffNode > 0) - CKTdltNNum(ckt, here->B3SOIDDvbseffNode); - here->B3SOIDDvbseffNode = 0; - - if (here->B3SOIDDvbs0effNode > 0) - CKTdltNNum(ckt, here->B3SOIDDvbs0effNode); - here->B3SOIDDvbs0effNode = 0; - - if (here->B3SOIDDabeffNode > 0) - CKTdltNNum(ckt, here->B3SOIDDabeffNode); - here->B3SOIDDabeffNode = 0; - - if (here->B3SOIDDibpNode > 0) - CKTdltNNum(ckt, here->B3SOIDDibpNode); - here->B3SOIDDibpNode = 0; - - if (here->B3SOIDDitunNode > 0) - CKTdltNNum(ckt, here->B3SOIDDitunNode); - here->B3SOIDDitunNode = 0; - - if (here->B3SOIDDigidlNode > 0) - CKTdltNNum(ckt, here->B3SOIDDigidlNode); - here->B3SOIDDigidlNode = 0; - - if (here->B3SOIDDiiiNode > 0) - CKTdltNNum(ckt, here->B3SOIDDiiiNode); - here->B3SOIDDiiiNode = 0; - - if (here->B3SOIDDibdNode > 0) - CKTdltNNum(ckt, here->B3SOIDDibdNode); - here->B3SOIDDibdNode = 0; - - if (here->B3SOIDDibsNode > 0) - CKTdltNNum(ckt, here->B3SOIDDibsNode); - here->B3SOIDDibsNode = 0; - - if (here->B3SOIDDicNode > 0) - CKTdltNNum(ckt, here->B3SOIDDicNode); - here->B3SOIDDicNode = 0; - - if (here->B3SOIDDidsNode > 0) - CKTdltNNum(ckt, here->B3SOIDDidsNode); - here->B3SOIDDidsNode = 0; - - if (here->B3SOIDDvbsNode > 0) - CKTdltNNum(ckt, here->B3SOIDDvbsNode); - here->B3SOIDDvbsNode = 0; - - - if (here->B3SOIDDtempNode > 0 && - here->B3SOIDDtempNode != here->B3SOIDDtempNodeExt && - here->B3SOIDDtempNode != here->B3SOIDDbNodeExt && - here->B3SOIDDtempNode != here->B3SOIDDpNodeExt) - CKTdltNNum(ckt, here->B3SOIDDtempNode); - here->B3SOIDDtempNode = 0; - - if (here->B3SOIDDbNode > 0 && - here->B3SOIDDbNode != here->B3SOIDDbNodeExt && - here->B3SOIDDbNode != here->B3SOIDDpNodeExt) - CKTdltNNum(ckt, here->B3SOIDDbNode); - here->B3SOIDDbNode = 0; - - here->B3SOIDDpNode = 0; - - if (here->B3SOIDDsNodePrime > 0 - && here->B3SOIDDsNodePrime != here->B3SOIDDsNode) - CKTdltNNum(ckt, here->B3SOIDDsNodePrime); - here->B3SOIDDsNodePrime = 0; - - if (here->B3SOIDDdNodePrime > 0 - && here->B3SOIDDdNodePrime != here->B3SOIDDdNode) - CKTdltNNum(ckt, here->B3SOIDDdNodePrime); - here->B3SOIDDdNodePrime = 0; - } - } - return OK; -} - diff --git a/src/spicelib/devices/bsim3soi_dd/b3soiddtemp.c b/src/spicelib/devices/bsim3soi_dd/b3soiddtemp.c deleted file mode 100644 index 8bd2fd2fb..000000000 --- a/src/spicelib/devices/bsim3soi_dd/b3soiddtemp.c +++ /dev/null @@ -1,814 +0,0 @@ -/********** -Copyright 1999 Regents of the University of California. All rights reserved. -Author: Weidong Liu and Pin Su Feb 1999 -Author: 1998 Samuel Fung, Dennis Sinitsky and Stephen Tang -Modified by Pin Su, Wei Jin 99/9/27 -File: b3soiddtemp.c 98/5/01 -Modified by Paolo Nenzi 2002 -**********/ - -/* - * Revision 2.1 99/9/27 Pin Su - * BSIMDD2.1 release - */ - -/* Lmin, Lmax, Wmin, Wmax */ - -#include "ngspice/ngspice.h" -#include "ngspice/smpdefs.h" -#include "ngspice/cktdefs.h" -#include "b3soidddef.h" -#include "ngspice/const.h" -#include "ngspice/sperror.h" -#include "ngspice/suffix.h" - -#define Kb 1.3806226e-23 -#define KboQ 8.617087e-5 /* Kb / q where q = 1.60219e-19 */ -#define EPSOX 3.453133e-11 -#define EPSSI 1.03594e-10 -#define PI 3.141592654 -#define MAX_EXP 5.834617425e14 -#define MIN_EXP 1.713908431e-15 -#define EXP_THRESHOLD 34.0 -#define Charge_q 1.60219e-19 - - -/* ARGSUSED */ -int -B3SOIDDtemp(GENmodel *inModel, CKTcircuit *ckt) -{ -B3SOIDDmodel *model = (B3SOIDDmodel*) inModel; -B3SOIDDinstance *here; -struct b3soiddSizeDependParam *pSizeDependParamKnot, *pLastKnot, *pParam=NULL; -double tmp, tmp1, tmp2, Eg, Eg0, ni, T0, T1, T2, T3, T4, T5, T6, Ldrn, Wdrn; -double Temp, TRatio, Inv_L, Inv_W, Inv_LW, Vtm0, Tnom; -double SDphi, SDgamma; -int Size_Not_Found; - - /* loop through all the B3SOIDD device models */ - for (; model != NULL; model = B3SOIDDnextModel(model)) - { Temp = ckt->CKTtemp; - if (model->B3SOIDDGatesidewallJctPotential < 0.1) - model->B3SOIDDGatesidewallJctPotential = 0.1; - - struct b3soiddSizeDependParam *p = model->pSizeDependParamKnot; - while (p) { - struct b3soiddSizeDependParam *next_p = p->pNext; - FREE(p); - p = next_p; - } - model->pSizeDependParamKnot = NULL; - pLastKnot = NULL; - - Tnom = model->B3SOIDDtnom; - TRatio = Temp / Tnom; - - model->B3SOIDDvcrit = CONSTvt0 * log(CONSTvt0 / (CONSTroot2 * 1.0e-14)); - model->B3SOIDDfactor1 = sqrt(EPSSI / EPSOX * model->B3SOIDDtox); - - Vtm0 = KboQ * Tnom; - Eg0 = 1.16 - 7.02e-4 * Tnom * Tnom / (Tnom + 1108.0); - model->B3SOIDDeg0 = Eg0; - model->B3SOIDDvtm = KboQ * Temp; - - Eg = 1.16 - 7.02e-4 * Temp * Temp / (Temp + 1108.0); - /* ni is in cm^-3 */ - ni = 1.45e10 * (Temp / 300.15) * sqrt(Temp / 300.15) - * exp(21.5565981 - Eg / (2.0 * model->B3SOIDDvtm)); - - - /* loop through all the instances of the model */ - /* MCJ: Length and Width not initialized */ - for (here = B3SOIDDinstances(model); here != NULL; - here = B3SOIDDnextInstance(here)) - { - here->B3SOIDDrbodyext = here->B3SOIDDbodySquares * - model->B3SOIDDrbsh; - pSizeDependParamKnot = model->pSizeDependParamKnot; - Size_Not_Found = 1; - while ((pSizeDependParamKnot != NULL) && Size_Not_Found) - { if ((here->B3SOIDDl == pSizeDependParamKnot->Length) - && (here->B3SOIDDw == pSizeDependParamKnot->Width) - && (here->B3SOIDDrth0 == pSizeDependParamKnot->Rth0) - && (here->B3SOIDDcth0 == pSizeDependParamKnot->Cth0)) - { Size_Not_Found = 0; - here->pParam = pSizeDependParamKnot; - } - else - { pLastKnot = pSizeDependParamKnot; - pSizeDependParamKnot = pSizeDependParamKnot->pNext; - } - } - - if (Size_Not_Found) - { pParam = TMALLOC(struct b3soiddSizeDependParam, 1); - if (pLastKnot == NULL) - model->pSizeDependParamKnot = pParam; - else - pLastKnot->pNext = pParam; - pParam->pNext = NULL; - here->pParam = pParam; - - Ldrn = here->B3SOIDDl; - Wdrn = here->B3SOIDDw; - pParam->Length = Ldrn; - pParam->Width = Wdrn; - pParam->Rth0 = here->B3SOIDDrth0; - pParam->Cth0 = here->B3SOIDDcth0; - - T0 = pow(Ldrn, model->B3SOIDDLln); - T1 = pow(Wdrn, model->B3SOIDDLwn); - tmp1 = model->B3SOIDDLl / T0 + model->B3SOIDDLw / T1 - + model->B3SOIDDLwl / (T0 * T1); - pParam->B3SOIDDdl = model->B3SOIDDLint + tmp1; - pParam->B3SOIDDdlc = model->B3SOIDDdlc + tmp1; - - T2 = pow(Ldrn, model->B3SOIDDWln); - T3 = pow(Wdrn, model->B3SOIDDWwn); - tmp2 = model->B3SOIDDWl / T2 + model->B3SOIDDWw / T3 - + model->B3SOIDDWwl / (T2 * T3); - pParam->B3SOIDDdw = model->B3SOIDDWint + tmp2; - pParam->B3SOIDDdwc = model->B3SOIDDdwc + tmp2; - - pParam->B3SOIDDleff = here->B3SOIDDl - 2.0 * pParam->B3SOIDDdl; - if (pParam->B3SOIDDleff <= 0.0) - { - SPfrontEnd->IFerrorf (ERR_FATAL, - "B3SOIDD: mosfet %s, model %s: Effective channel length <= 0", - model->B3SOIDDmodName, here->B3SOIDDname); - return(E_BADPARM); - } - - pParam->B3SOIDDweff = here->B3SOIDDw - 2.0 * pParam->B3SOIDDdw; - if (pParam->B3SOIDDweff <= 0.0) - { - SPfrontEnd->IFerrorf (ERR_FATAL, - "B3SOIDD: mosfet %s, model %s: Effective channel width <= 0", - model->B3SOIDDmodName, here->B3SOIDDname); - return(E_BADPARM); - } - - pParam->B3SOIDDleffCV = here->B3SOIDDl - 2.0 * pParam->B3SOIDDdlc; - if (pParam->B3SOIDDleffCV <= 0.0) - { - SPfrontEnd->IFerrorf (ERR_FATAL, - "B3SOIDD: mosfet %s, model %s: Effective channel length for C-V <= 0", - model->B3SOIDDmodName, here->B3SOIDDname); - return(E_BADPARM); - } - - pParam->B3SOIDDweffCV = here->B3SOIDDw - 2.0 * pParam->B3SOIDDdwc; - if (pParam->B3SOIDDweffCV <= 0.0) - { - SPfrontEnd->IFerrorf (ERR_FATAL, - "B3SOIDD: mosfet %s, model %s: Effective channel width for C-V <= 0", - model->B3SOIDDmodName, here->B3SOIDDname); - return(E_BADPARM); - } - - /* Not binned - START */ - pParam->B3SOIDDat = model->B3SOIDDat; - pParam->B3SOIDDgamma1 = model->B3SOIDDgamma1; - pParam->B3SOIDDgamma2 = model->B3SOIDDgamma2; - pParam->B3SOIDDvbx = model->B3SOIDDvbx; - pParam->B3SOIDDvbm = model->B3SOIDDvbm; - pParam->B3SOIDDxt = model->B3SOIDDxt; - pParam->B3SOIDDkt1 = model->B3SOIDDkt1; - pParam->B3SOIDDkt1l = model->B3SOIDDkt1l; - pParam->B3SOIDDkt2 = model->B3SOIDDkt2; - pParam->B3SOIDDua1 = model->B3SOIDDua1; - pParam->B3SOIDDub1 = model->B3SOIDDub1; - pParam->B3SOIDDuc1 = model->B3SOIDDuc1; - pParam->B3SOIDDute = model->B3SOIDDute; - pParam->B3SOIDDprt = model->B3SOIDDprt; - /* Not binned - END */ - - /* CV model */ - pParam->B3SOIDDcgsl = model->B3SOIDDcgsl; - pParam->B3SOIDDcgdl = model->B3SOIDDcgdl; - pParam->B3SOIDDckappa = model->B3SOIDDckappa; - pParam->B3SOIDDcf = model->B3SOIDDcf; - pParam->B3SOIDDclc = model->B3SOIDDclc; - pParam->B3SOIDDcle = model->B3SOIDDcle; - - pParam->B3SOIDDabulkCVfactor = pow(1.0+(pParam->B3SOIDDclc - / pParam->B3SOIDDleff), - pParam->B3SOIDDcle); - -/* Added for binning - START */ - if (model->B3SOIDDbinUnit == 1) - { Inv_L = 1.0e-6 / pParam->B3SOIDDleff; - Inv_W = 1.0e-6 / pParam->B3SOIDDweff; - Inv_LW = 1.0e-12 / (pParam->B3SOIDDleff - * pParam->B3SOIDDweff); - } - else - { Inv_L = 1.0 / pParam->B3SOIDDleff; - Inv_W = 1.0 / pParam->B3SOIDDweff; - Inv_LW = 1.0 / (pParam->B3SOIDDleff - * pParam->B3SOIDDweff); - } - pParam->B3SOIDDnpeak = model->B3SOIDDnpeak - + model->B3SOIDDlnpeak * Inv_L - + model->B3SOIDDwnpeak * Inv_W - + model->B3SOIDDpnpeak * Inv_LW; - pParam->B3SOIDDnsub = model->B3SOIDDnsub - + model->B3SOIDDlnsub * Inv_L - + model->B3SOIDDwnsub * Inv_W - + model->B3SOIDDpnsub * Inv_LW; - pParam->B3SOIDDngate = model->B3SOIDDngate - + model->B3SOIDDlngate * Inv_L - + model->B3SOIDDwngate * Inv_W - + model->B3SOIDDpngate * Inv_LW; - pParam->B3SOIDDvth0 = model->B3SOIDDvth0 - + model->B3SOIDDlvth0 * Inv_L - + model->B3SOIDDwvth0 * Inv_W - + model->B3SOIDDpvth0 * Inv_LW; - pParam->B3SOIDDk1 = model->B3SOIDDk1 - + model->B3SOIDDlk1 * Inv_L - + model->B3SOIDDwk1 * Inv_W - + model->B3SOIDDpk1 * Inv_LW; - pParam->B3SOIDDk2 = model->B3SOIDDk2 - + model->B3SOIDDlk2 * Inv_L - + model->B3SOIDDwk2 * Inv_W - + model->B3SOIDDpk2 * Inv_LW; - pParam->B3SOIDDk3 = model->B3SOIDDk3 - + model->B3SOIDDlk3 * Inv_L - + model->B3SOIDDwk3 * Inv_W - + model->B3SOIDDpk3 * Inv_LW; - pParam->B3SOIDDk3b = model->B3SOIDDk3b - + model->B3SOIDDlk3b * Inv_L - + model->B3SOIDDwk3b * Inv_W - + model->B3SOIDDpk3b * Inv_LW; - pParam->B3SOIDDvbsa = model->B3SOIDDvbsa - + model->B3SOIDDlvbsa * Inv_L - + model->B3SOIDDwvbsa * Inv_W - + model->B3SOIDDpvbsa * Inv_LW; - pParam->B3SOIDDdelp = model->B3SOIDDdelp - + model->B3SOIDDldelp * Inv_L - + model->B3SOIDDwdelp * Inv_W - + model->B3SOIDDpdelp * Inv_LW; - pParam->B3SOIDDkb1 = model->B3SOIDDkb1 - + model->B3SOIDDlkb1 * Inv_L - + model->B3SOIDDwkb1 * Inv_W - + model->B3SOIDDpkb1 * Inv_LW; - pParam->B3SOIDDkb3 = model->B3SOIDDkb3 - + model->B3SOIDDlkb3 * Inv_L - + model->B3SOIDDwkb3 * Inv_W - + model->B3SOIDDpkb3 * Inv_LW; - pParam->B3SOIDDdvbd0 = model->B3SOIDDdvbd0 - + model->B3SOIDDldvbd0 * Inv_L - + model->B3SOIDDwdvbd0 * Inv_W - + model->B3SOIDDpdvbd0 * Inv_LW; - pParam->B3SOIDDdvbd1 = model->B3SOIDDdvbd1 - + model->B3SOIDDldvbd1 * Inv_L - + model->B3SOIDDwdvbd1 * Inv_W - + model->B3SOIDDpdvbd1 * Inv_LW; - pParam->B3SOIDDw0 = model->B3SOIDDw0 - + model->B3SOIDDlw0 * Inv_L - + model->B3SOIDDww0 * Inv_W - + model->B3SOIDDpw0 * Inv_LW; - pParam->B3SOIDDnlx = model->B3SOIDDnlx - + model->B3SOIDDlnlx * Inv_L - + model->B3SOIDDwnlx * Inv_W - + model->B3SOIDDpnlx * Inv_LW; - pParam->B3SOIDDdvt0 = model->B3SOIDDdvt0 - + model->B3SOIDDldvt0 * Inv_L - + model->B3SOIDDwdvt0 * Inv_W - + model->B3SOIDDpdvt0 * Inv_LW; - pParam->B3SOIDDdvt1 = model->B3SOIDDdvt1 - + model->B3SOIDDldvt1 * Inv_L - + model->B3SOIDDwdvt1 * Inv_W - + model->B3SOIDDpdvt1 * Inv_LW; - pParam->B3SOIDDdvt2 = model->B3SOIDDdvt2 - + model->B3SOIDDldvt2 * Inv_L - + model->B3SOIDDwdvt2 * Inv_W - + model->B3SOIDDpdvt2 * Inv_LW; - pParam->B3SOIDDdvt0w = model->B3SOIDDdvt0w - + model->B3SOIDDldvt0w * Inv_L - + model->B3SOIDDwdvt0w * Inv_W - + model->B3SOIDDpdvt0w * Inv_LW; - pParam->B3SOIDDdvt1w = model->B3SOIDDdvt1w - + model->B3SOIDDldvt1w * Inv_L - + model->B3SOIDDwdvt1w * Inv_W - + model->B3SOIDDpdvt1w * Inv_LW; - pParam->B3SOIDDdvt2w = model->B3SOIDDdvt2w - + model->B3SOIDDldvt2w * Inv_L - + model->B3SOIDDwdvt2w * Inv_W - + model->B3SOIDDpdvt2w * Inv_LW; - pParam->B3SOIDDu0 = model->B3SOIDDu0 - + model->B3SOIDDlu0 * Inv_L - + model->B3SOIDDwu0 * Inv_W - + model->B3SOIDDpu0 * Inv_LW; - pParam->B3SOIDDua = model->B3SOIDDua - + model->B3SOIDDlua * Inv_L - + model->B3SOIDDwua * Inv_W - + model->B3SOIDDpua * Inv_LW; - pParam->B3SOIDDub = model->B3SOIDDub - + model->B3SOIDDlub * Inv_L - + model->B3SOIDDwub * Inv_W - + model->B3SOIDDpub * Inv_LW; - pParam->B3SOIDDuc = model->B3SOIDDuc - + model->B3SOIDDluc * Inv_L - + model->B3SOIDDwuc * Inv_W - + model->B3SOIDDpuc * Inv_LW; - pParam->B3SOIDDvsat = model->B3SOIDDvsat - + model->B3SOIDDlvsat * Inv_L - + model->B3SOIDDwvsat * Inv_W - + model->B3SOIDDpvsat * Inv_LW; - pParam->B3SOIDDa0 = model->B3SOIDDa0 - + model->B3SOIDDla0 * Inv_L - + model->B3SOIDDwa0 * Inv_W - + model->B3SOIDDpa0 * Inv_LW; - pParam->B3SOIDDags = model->B3SOIDDags - + model->B3SOIDDlags * Inv_L - + model->B3SOIDDwags * Inv_W - + model->B3SOIDDpags * Inv_LW; - pParam->B3SOIDDb0 = model->B3SOIDDb0 - + model->B3SOIDDlb0 * Inv_L - + model->B3SOIDDwb0 * Inv_W - + model->B3SOIDDpb0 * Inv_LW; - pParam->B3SOIDDb1 = model->B3SOIDDb1 - + model->B3SOIDDlb1 * Inv_L - + model->B3SOIDDwb1 * Inv_W - + model->B3SOIDDpb1 * Inv_LW; - pParam->B3SOIDDketa = model->B3SOIDDketa - + model->B3SOIDDlketa * Inv_L - + model->B3SOIDDwketa * Inv_W - + model->B3SOIDDpketa * Inv_LW; - pParam->B3SOIDDabp = model->B3SOIDDabp - + model->B3SOIDDlabp * Inv_L - + model->B3SOIDDwabp * Inv_W - + model->B3SOIDDpabp * Inv_LW; - pParam->B3SOIDDmxc = model->B3SOIDDmxc - + model->B3SOIDDlmxc * Inv_L - + model->B3SOIDDwmxc * Inv_W - + model->B3SOIDDpmxc * Inv_LW; - pParam->B3SOIDDadice0 = model->B3SOIDDadice0 - + model->B3SOIDDladice0 * Inv_L - + model->B3SOIDDwadice0 * Inv_W - + model->B3SOIDDpadice0 * Inv_LW; - pParam->B3SOIDDa1 = model->B3SOIDDa1 - + model->B3SOIDDla1 * Inv_L - + model->B3SOIDDwa1 * Inv_W - + model->B3SOIDDpa1 * Inv_LW; - pParam->B3SOIDDa2 = model->B3SOIDDa2 - + model->B3SOIDDla2 * Inv_L - + model->B3SOIDDwa2 * Inv_W - + model->B3SOIDDpa2 * Inv_LW; - pParam->B3SOIDDrdsw = model->B3SOIDDrdsw - + model->B3SOIDDlrdsw * Inv_L - + model->B3SOIDDwrdsw * Inv_W - + model->B3SOIDDprdsw * Inv_LW; - pParam->B3SOIDDprwb = model->B3SOIDDprwb - + model->B3SOIDDlprwb * Inv_L - + model->B3SOIDDwprwb * Inv_W - + model->B3SOIDDpprwb * Inv_LW; - pParam->B3SOIDDprwg = model->B3SOIDDprwg - + model->B3SOIDDlprwg * Inv_L - + model->B3SOIDDwprwg * Inv_W - + model->B3SOIDDpprwg * Inv_LW; - pParam->B3SOIDDwr = model->B3SOIDDwr - + model->B3SOIDDlwr * Inv_L - + model->B3SOIDDwwr * Inv_W - + model->B3SOIDDpwr * Inv_LW; - pParam->B3SOIDDnfactor = model->B3SOIDDnfactor - + model->B3SOIDDlnfactor * Inv_L - + model->B3SOIDDwnfactor * Inv_W - + model->B3SOIDDpnfactor * Inv_LW; - pParam->B3SOIDDdwg = model->B3SOIDDdwg - + model->B3SOIDDldwg * Inv_L - + model->B3SOIDDwdwg * Inv_W - + model->B3SOIDDpdwg * Inv_LW; - pParam->B3SOIDDdwb = model->B3SOIDDdwb - + model->B3SOIDDldwb * Inv_L - + model->B3SOIDDwdwb * Inv_W - + model->B3SOIDDpdwb * Inv_LW; - pParam->B3SOIDDvoff = model->B3SOIDDvoff - + model->B3SOIDDlvoff * Inv_L - + model->B3SOIDDwvoff * Inv_W - + model->B3SOIDDpvoff * Inv_LW; - pParam->B3SOIDDeta0 = model->B3SOIDDeta0 - + model->B3SOIDDleta0 * Inv_L - + model->B3SOIDDweta0 * Inv_W - + model->B3SOIDDpeta0 * Inv_LW; - pParam->B3SOIDDetab = model->B3SOIDDetab - + model->B3SOIDDletab * Inv_L - + model->B3SOIDDwetab * Inv_W - + model->B3SOIDDpetab * Inv_LW; - pParam->B3SOIDDdsub = model->B3SOIDDdsub - + model->B3SOIDDldsub * Inv_L - + model->B3SOIDDwdsub * Inv_W - + model->B3SOIDDpdsub * Inv_LW; - pParam->B3SOIDDcit = model->B3SOIDDcit - + model->B3SOIDDlcit * Inv_L - + model->B3SOIDDwcit * Inv_W - + model->B3SOIDDpcit * Inv_LW; - pParam->B3SOIDDcdsc = model->B3SOIDDcdsc - + model->B3SOIDDlcdsc * Inv_L - + model->B3SOIDDwcdsc * Inv_W - + model->B3SOIDDpcdsc * Inv_LW; - pParam->B3SOIDDcdscb = model->B3SOIDDcdscb - + model->B3SOIDDlcdscb * Inv_L - + model->B3SOIDDwcdscb * Inv_W - + model->B3SOIDDpcdscb * Inv_LW; - pParam->B3SOIDDcdscd = model->B3SOIDDcdscd - + model->B3SOIDDlcdscd * Inv_L - + model->B3SOIDDwcdscd * Inv_W - + model->B3SOIDDpcdscd * Inv_LW; - pParam->B3SOIDDpclm = model->B3SOIDDpclm - + model->B3SOIDDlpclm * Inv_L - + model->B3SOIDDwpclm * Inv_W - + model->B3SOIDDppclm * Inv_LW; - pParam->B3SOIDDpdibl1 = model->B3SOIDDpdibl1 - + model->B3SOIDDlpdibl1 * Inv_L - + model->B3SOIDDwpdibl1 * Inv_W - + model->B3SOIDDppdibl1 * Inv_LW; - pParam->B3SOIDDpdibl2 = model->B3SOIDDpdibl2 - + model->B3SOIDDlpdibl2 * Inv_L - + model->B3SOIDDwpdibl2 * Inv_W - + model->B3SOIDDppdibl2 * Inv_LW; - pParam->B3SOIDDpdiblb = model->B3SOIDDpdiblb - + model->B3SOIDDlpdiblb * Inv_L - + model->B3SOIDDwpdiblb * Inv_W - + model->B3SOIDDppdiblb * Inv_LW; - pParam->B3SOIDDdrout = model->B3SOIDDdrout - + model->B3SOIDDldrout * Inv_L - + model->B3SOIDDwdrout * Inv_W - + model->B3SOIDDpdrout * Inv_LW; - pParam->B3SOIDDpvag = model->B3SOIDDpvag - + model->B3SOIDDlpvag * Inv_L - + model->B3SOIDDwpvag * Inv_W - + model->B3SOIDDppvag * Inv_LW; - pParam->B3SOIDDdelta = model->B3SOIDDdelta - + model->B3SOIDDldelta * Inv_L - + model->B3SOIDDwdelta * Inv_W - + model->B3SOIDDpdelta * Inv_LW; - pParam->B3SOIDDaii = model->B3SOIDDaii - + model->B3SOIDDlaii * Inv_L - + model->B3SOIDDwaii * Inv_W - + model->B3SOIDDpaii * Inv_LW; - pParam->B3SOIDDbii = model->B3SOIDDbii - + model->B3SOIDDlbii * Inv_L - + model->B3SOIDDwbii * Inv_W - + model->B3SOIDDpbii * Inv_LW; - pParam->B3SOIDDcii = model->B3SOIDDcii - + model->B3SOIDDlcii * Inv_L - + model->B3SOIDDwcii * Inv_W - + model->B3SOIDDpcii * Inv_LW; - pParam->B3SOIDDdii = model->B3SOIDDdii - + model->B3SOIDDldii * Inv_L - + model->B3SOIDDwdii * Inv_W - + model->B3SOIDDpdii * Inv_LW; - pParam->B3SOIDDalpha0 = model->B3SOIDDalpha0 - + model->B3SOIDDlalpha0 * Inv_L - + model->B3SOIDDwalpha0 * Inv_W - + model->B3SOIDDpalpha0 * Inv_LW; - pParam->B3SOIDDalpha1 = model->B3SOIDDalpha1 - + model->B3SOIDDlalpha1 * Inv_L - + model->B3SOIDDwalpha1 * Inv_W - + model->B3SOIDDpalpha1 * Inv_LW; - pParam->B3SOIDDbeta0 = model->B3SOIDDbeta0 - + model->B3SOIDDlbeta0 * Inv_L - + model->B3SOIDDwbeta0 * Inv_W - + model->B3SOIDDpbeta0 * Inv_LW; - pParam->B3SOIDDagidl = model->B3SOIDDagidl - + model->B3SOIDDlagidl * Inv_L - + model->B3SOIDDwagidl * Inv_W - + model->B3SOIDDpagidl * Inv_LW; - pParam->B3SOIDDbgidl = model->B3SOIDDbgidl - + model->B3SOIDDlbgidl * Inv_L - + model->B3SOIDDwbgidl * Inv_W - + model->B3SOIDDpbgidl * Inv_LW; - pParam->B3SOIDDngidl = model->B3SOIDDngidl - + model->B3SOIDDlngidl * Inv_L - + model->B3SOIDDwngidl * Inv_W - + model->B3SOIDDpngidl * Inv_LW; - pParam->B3SOIDDntun = model->B3SOIDDntun - + model->B3SOIDDlntun * Inv_L - + model->B3SOIDDwntun * Inv_W - + model->B3SOIDDpntun * Inv_LW; - pParam->B3SOIDDndiode = model->B3SOIDDndiode - + model->B3SOIDDlndiode * Inv_L - + model->B3SOIDDwndiode * Inv_W - + model->B3SOIDDpndiode * Inv_LW; - pParam->B3SOIDDisbjt = model->B3SOIDDisbjt - + model->B3SOIDDlisbjt * Inv_L - + model->B3SOIDDwisbjt * Inv_W - + model->B3SOIDDpisbjt * Inv_LW; - pParam->B3SOIDDisdif = model->B3SOIDDisdif - + model->B3SOIDDlisdif * Inv_L - + model->B3SOIDDwisdif * Inv_W - + model->B3SOIDDpisdif * Inv_LW; - pParam->B3SOIDDisrec = model->B3SOIDDisrec - + model->B3SOIDDlisrec * Inv_L - + model->B3SOIDDwisrec * Inv_W - + model->B3SOIDDpisrec * Inv_LW; - pParam->B3SOIDDistun = model->B3SOIDDistun - + model->B3SOIDDlistun * Inv_L - + model->B3SOIDDwistun * Inv_W - + model->B3SOIDDpistun * Inv_LW; - pParam->B3SOIDDedl = model->B3SOIDDedl - + model->B3SOIDDledl * Inv_L - + model->B3SOIDDwedl * Inv_W - + model->B3SOIDDpedl * Inv_LW; - pParam->B3SOIDDkbjt1 = model->B3SOIDDkbjt1 - + model->B3SOIDDlkbjt1 * Inv_L - + model->B3SOIDDwkbjt1 * Inv_W - + model->B3SOIDDpkbjt1 * Inv_LW; - /* CV model */ - pParam->B3SOIDDvsdfb = model->B3SOIDDvsdfb - + model->B3SOIDDlvsdfb * Inv_L - + model->B3SOIDDwvsdfb * Inv_W - + model->B3SOIDDpvsdfb * Inv_LW; - pParam->B3SOIDDvsdth = model->B3SOIDDvsdth - + model->B3SOIDDlvsdth * Inv_L - + model->B3SOIDDwvsdth * Inv_W - + model->B3SOIDDpvsdth * Inv_LW; -/* Added for binning - END */ - - T0 = (TRatio - 1.0); - - pParam->B3SOIDDuatemp = pParam->B3SOIDDua; /* save ua, ub, and uc for b3soiddld.c */ - pParam->B3SOIDDubtemp = pParam->B3SOIDDub; - pParam->B3SOIDDuctemp = pParam->B3SOIDDuc; - pParam->B3SOIDDrds0denom = pow(pParam->B3SOIDDweff * 1E6, pParam->B3SOIDDwr); - pParam->B3SOIDDrth = here->B3SOIDDrth0 * sqrt(model->B3SOIDDtbox - / model->B3SOIDDtsi) / pParam->B3SOIDDweff; - pParam->B3SOIDDcth = here->B3SOIDDcth0 * model->B3SOIDDtsi; - pParam->B3SOIDDrbody = model->B3SOIDDrbody * - pParam->B3SOIDDweff / pParam->B3SOIDDleff; - pParam->B3SOIDDua = pParam->B3SOIDDua + pParam->B3SOIDDua1 * T0; - pParam->B3SOIDDub = pParam->B3SOIDDub + pParam->B3SOIDDub1 * T0; - pParam->B3SOIDDuc = pParam->B3SOIDDuc + pParam->B3SOIDDuc1 * T0; - if (pParam->B3SOIDDu0 > 1.0) - pParam->B3SOIDDu0 = pParam->B3SOIDDu0 / 1.0e4; - - pParam->B3SOIDDu0temp = pParam->B3SOIDDu0 - * pow(TRatio, pParam->B3SOIDDute); - pParam->B3SOIDDvsattemp = pParam->B3SOIDDvsat - pParam->B3SOIDDat - * T0; - pParam->B3SOIDDrds0 = (pParam->B3SOIDDrdsw + pParam->B3SOIDDprt * T0) - / pow(pParam->B3SOIDDweff * 1E6, pParam->B3SOIDDwr); - - if (B3SOIDDcheckModel(model, here, ckt)) - { - SPfrontEnd->IFerrorf (ERR_FATAL, "Fatal error(s) detected during B3SOIDDV3 parameter checking for %s in model %s", model->B3SOIDDmodName, here->B3SOIDDname); - return(E_BADPARM); - } - - - pParam->B3SOIDDcgdo = (model->B3SOIDDcgdo + pParam->B3SOIDDcf) - * pParam->B3SOIDDweffCV; - pParam->B3SOIDDcgso = (model->B3SOIDDcgso + pParam->B3SOIDDcf) - * pParam->B3SOIDDweffCV; - pParam->B3SOIDDcgeo = model->B3SOIDDcgeo - * pParam->B3SOIDDleffCV; - - - if (!model->B3SOIDDnpeakGiven && model->B3SOIDDgamma1Given) - { T0 = pParam->B3SOIDDgamma1 * model->B3SOIDDcox; - pParam->B3SOIDDnpeak = 3.021E22 * T0 * T0; - } - - T0 = pow(TRatio, model->B3SOIDDxbjt / pParam->B3SOIDDndiode); - T1 = pow(TRatio, model->B3SOIDDxdif / pParam->B3SOIDDndiode); - T2 = pow(TRatio, model->B3SOIDDxrec / pParam->B3SOIDDndiode / 2); - T4 = -Eg0 / pParam->B3SOIDDndiode / model->B3SOIDDvtm * (1 - TRatio); - T5 = exp(T4); - T6 = sqrt(T5); - pParam->B3SOIDDjbjt = pParam->B3SOIDDisbjt * T0 * T5; - pParam->B3SOIDDjdif = pParam->B3SOIDDisdif * T1 * T5; - pParam->B3SOIDDjrec = pParam->B3SOIDDisrec * T2 * T6; - T0 = pow(TRatio, model->B3SOIDDxtun / pParam->B3SOIDDntun); - pParam->B3SOIDDjtun = pParam->B3SOIDDistun * T0 ; - - if (pParam->B3SOIDDnsub > 0) - pParam->B3SOIDDvfbb = -model->B3SOIDDtype * model->B3SOIDDvtm * - log(pParam->B3SOIDDnpeak/ pParam->B3SOIDDnsub); - else - pParam->B3SOIDDvfbb = -model->B3SOIDDtype * model->B3SOIDDvtm * - log(-pParam->B3SOIDDnpeak* pParam->B3SOIDDnsub/ni/ni); - - if (!model->B3SOIDDvsdfbGiven) - { - if (pParam->B3SOIDDnsub > 0) - pParam->B3SOIDDvsdfb = -model->B3SOIDDtype * (model->B3SOIDDvtm*log(1e20 * - pParam->B3SOIDDnsub / ni /ni) - 0.3); - else if (pParam->B3SOIDDnsub < 0) - pParam->B3SOIDDvsdfb = -model->B3SOIDDtype * (model->B3SOIDDvtm*log(-1e20 / - pParam->B3SOIDDnsub) + 0.3); - } - - /* Phi & Gamma */ - SDphi = 2.0*model->B3SOIDDvtm*log(fabs(pParam->B3SOIDDnsub) / ni); - SDgamma = 5.753e-12 * sqrt(fabs(pParam->B3SOIDDnsub)) / model->B3SOIDDcbox; - - if (!model->B3SOIDDvsdthGiven) - { - if ( ((pParam->B3SOIDDnsub > 0) && (model->B3SOIDDtype > 0)) || - ((pParam->B3SOIDDnsub < 0) && (model->B3SOIDDtype < 0)) ) - pParam->B3SOIDDvsdth = pParam->B3SOIDDvsdfb + SDphi + - SDgamma * sqrt(SDphi); - else - pParam->B3SOIDDvsdth = pParam->B3SOIDDvsdfb - SDphi - - SDgamma * sqrt(SDphi); - } - if (!model->B3SOIDDcsdminGiven) - { - /* Cdmin */ - tmp = sqrt(2.0 * EPSSI * SDphi / (Charge_q * - fabs(pParam->B3SOIDDnsub) * 1.0e6)); - tmp1 = EPSSI / tmp; - model->B3SOIDDcsdmin = tmp1 * model->B3SOIDDcbox / - (tmp1 + model->B3SOIDDcbox); - } - - - T0 = model->B3SOIDDcsdesw * log(1 + model->B3SOIDDtsi / - model->B3SOIDDtbox); - T1 = here->B3SOIDDsourcePerimeter - pParam->B3SOIDDweff; - if (T1 > 0.0) - pParam->B3SOIDDcsesw = T0 * T1; - else - pParam->B3SOIDDcsesw = 0.0; - T1 = here->B3SOIDDdrainPerimeter - pParam->B3SOIDDweff; - if (T1 > 0.0) - pParam->B3SOIDDcdesw = T0 * T1; - else - pParam->B3SOIDDcdesw = 0.0; - - pParam->B3SOIDDphi = 2.0 * model->B3SOIDDvtm - * log(pParam->B3SOIDDnpeak / ni); - - pParam->B3SOIDDsqrtPhi = sqrt(pParam->B3SOIDDphi); - pParam->B3SOIDDphis3 = pParam->B3SOIDDsqrtPhi * pParam->B3SOIDDphi; - - pParam->B3SOIDDXdep0 = sqrt(2.0 * EPSSI / (Charge_q - * pParam->B3SOIDDnpeak * 1.0e6)) - * pParam->B3SOIDDsqrtPhi; - pParam->B3SOIDDsqrtXdep0 = sqrt(pParam->B3SOIDDXdep0); - pParam->B3SOIDDlitl = sqrt(3.0 * model->B3SOIDDxj - * model->B3SOIDDtox); - pParam->B3SOIDDvbi = model->B3SOIDDvtm * log(1.0e20 - * pParam->B3SOIDDnpeak / (ni * ni)); - pParam->B3SOIDDcdep0 = sqrt(Charge_q * EPSSI - * pParam->B3SOIDDnpeak * 1.0e6 / 2.0 - / pParam->B3SOIDDphi); - - if (model->B3SOIDDk1Given || model->B3SOIDDk2Given) - { if (!model->B3SOIDDk1Given) - { fprintf(stdout, "Warning: k1 should be specified with k2.\n"); - pParam->B3SOIDDk1 = 0.53; - } - if (!model->B3SOIDDk2Given) - { fprintf(stdout, "Warning: k2 should be specified with k1.\n"); - pParam->B3SOIDDk2 = -0.0186; - } - if (model->B3SOIDDxtGiven) - fprintf(stdout, "Warning: xt is ignored because k1 or k2 is given.\n"); - if (model->B3SOIDDvbxGiven) - fprintf(stdout, "Warning: vbx is ignored because k1 or k2 is given.\n"); - if (model->B3SOIDDvbmGiven) - fprintf(stdout, "Warning: vbm is ignored because k1 or k2 is given.\n"); - if (model->B3SOIDDgamma1Given) - fprintf(stdout, "Warning: gamma1 is ignored because k1 or k2 is given.\n"); - if (model->B3SOIDDgamma2Given) - fprintf(stdout, "Warning: gamma2 is ignored because k1 or k2 is given.\n"); - } - else - { if (!model->B3SOIDDvbxGiven) - pParam->B3SOIDDvbx = pParam->B3SOIDDphi - 7.7348e-4 - * pParam->B3SOIDDnpeak - * pParam->B3SOIDDxt * pParam->B3SOIDDxt; - if (pParam->B3SOIDDvbx > 0.0) - pParam->B3SOIDDvbx = -pParam->B3SOIDDvbx; - if (pParam->B3SOIDDvbm > 0.0) - pParam->B3SOIDDvbm = -pParam->B3SOIDDvbm; - - if (!model->B3SOIDDgamma1Given) - pParam->B3SOIDDgamma1 = 5.753e-12 - * sqrt(pParam->B3SOIDDnpeak) - / model->B3SOIDDcox; - if (!model->B3SOIDDgamma2Given) - pParam->B3SOIDDgamma2 = 5.753e-12 - * sqrt(pParam->B3SOIDDnsub) - / model->B3SOIDDcox; - - T0 = pParam->B3SOIDDgamma1 - pParam->B3SOIDDgamma2; - T1 = sqrt(pParam->B3SOIDDphi - pParam->B3SOIDDvbx) - - pParam->B3SOIDDsqrtPhi; - T2 = sqrt(pParam->B3SOIDDphi * (pParam->B3SOIDDphi - - pParam->B3SOIDDvbm)) - pParam->B3SOIDDphi; - pParam->B3SOIDDk2 = T0 * T1 / (2.0 * T2 + pParam->B3SOIDDvbm); - pParam->B3SOIDDk1 = pParam->B3SOIDDgamma2 - 2.0 - * pParam->B3SOIDDk2 * sqrt(pParam->B3SOIDDphi - - pParam->B3SOIDDvbm); - } - - if (pParam->B3SOIDDk2 < 0.0) - { T0 = 0.5 * pParam->B3SOIDDk1 / pParam->B3SOIDDk2; - pParam->B3SOIDDvbsc = 0.9 * (pParam->B3SOIDDphi - T0 * T0); - if (pParam->B3SOIDDvbsc > -3.0) - pParam->B3SOIDDvbsc = -3.0; - else if (pParam->B3SOIDDvbsc < -30.0) - pParam->B3SOIDDvbsc = -30.0; - } - else - { pParam->B3SOIDDvbsc = -30.0; - } - if (pParam->B3SOIDDvbsc > pParam->B3SOIDDvbm) - pParam->B3SOIDDvbsc = pParam->B3SOIDDvbm; - - if (model->B3SOIDDvth0Given) - { pParam->B3SOIDDvfb = model->B3SOIDDtype * pParam->B3SOIDDvth0 - - pParam->B3SOIDDphi - pParam->B3SOIDDk1 - * pParam->B3SOIDDsqrtPhi; - } - else - { pParam->B3SOIDDvfb = -1.0; - pParam->B3SOIDDvth0 = model->B3SOIDDtype * (pParam->B3SOIDDvfb - + pParam->B3SOIDDphi + pParam->B3SOIDDk1 - * pParam->B3SOIDDsqrtPhi); - } - T1 = sqrt(EPSSI / EPSOX * model->B3SOIDDtox - * pParam->B3SOIDDXdep0); - T0 = exp(-0.5 * pParam->B3SOIDDdsub * pParam->B3SOIDDleff / T1); - pParam->B3SOIDDtheta0vb0 = (T0 + 2.0 * T0 * T0); - - T0 = exp(-0.5 * pParam->B3SOIDDdrout * pParam->B3SOIDDleff / T1); - T2 = (T0 + 2.0 * T0 * T0); - pParam->B3SOIDDthetaRout = pParam->B3SOIDDpdibl1 * T2 - + pParam->B3SOIDDpdibl2; - - here->B3SOIDDminIsub = 5.0e-2 * pParam->B3SOIDDweff * model->B3SOIDDtsi - * MAX(pParam->B3SOIDDisdif, pParam->B3SOIDDisrec); - } - - here->B3SOIDDcsbox = model->B3SOIDDcbox*here->B3SOIDDsourceArea; - here->B3SOIDDcsmin = model->B3SOIDDcsdmin*here->B3SOIDDsourceArea; - here->B3SOIDDcdbox = model->B3SOIDDcbox*here->B3SOIDDdrainArea; - here->B3SOIDDcdmin = model->B3SOIDDcsdmin*here->B3SOIDDdrainArea; - - if ( ((pParam->B3SOIDDnsub > 0) && (model->B3SOIDDtype > 0)) || - ((pParam->B3SOIDDnsub < 0) && (model->B3SOIDDtype < 0)) ) - { - T0 = pParam->B3SOIDDvsdth - pParam->B3SOIDDvsdfb; - pParam->B3SOIDDsdt1 = pParam->B3SOIDDvsdfb + model->B3SOIDDasd * T0; - T1 = here->B3SOIDDcsbox - here->B3SOIDDcsmin; - T2 = T1 / T0 / T0; - pParam->B3SOIDDst2 = T2 / model->B3SOIDDasd; - pParam->B3SOIDDst3 = T2 /( 1 - model->B3SOIDDasd); - here->B3SOIDDst4 = T0 * T1 * (1 + model->B3SOIDDasd) / 3 - - here->B3SOIDDcsmin * pParam->B3SOIDDvsdfb; - - T1 = here->B3SOIDDcdbox - here->B3SOIDDcdmin; - T2 = T1 / T0 / T0; - pParam->B3SOIDDdt2 = T2 / model->B3SOIDDasd; - pParam->B3SOIDDdt3 = T2 /( 1 - model->B3SOIDDasd); - here->B3SOIDDdt4 = T0 * T1 * (1 + model->B3SOIDDasd) / 3 - - here->B3SOIDDcdmin * pParam->B3SOIDDvsdfb; - } else - { - T0 = pParam->B3SOIDDvsdfb - pParam->B3SOIDDvsdth; - pParam->B3SOIDDsdt1 = pParam->B3SOIDDvsdth + model->B3SOIDDasd * T0; - T1 = here->B3SOIDDcsmin - here->B3SOIDDcsbox; - T2 = T1 / T0 / T0; - pParam->B3SOIDDst2 = T2 / model->B3SOIDDasd; - pParam->B3SOIDDst3 = T2 /( 1 - model->B3SOIDDasd); - here->B3SOIDDst4 = T0 * T1 * (1 + model->B3SOIDDasd) / 3 - - here->B3SOIDDcsbox * pParam->B3SOIDDvsdth; - - T1 = here->B3SOIDDcdmin - here->B3SOIDDcdbox; - T2 = T1 / T0 / T0; - pParam->B3SOIDDdt2 = T2 / model->B3SOIDDasd; - pParam->B3SOIDDdt3 = T2 /( 1 - model->B3SOIDDasd); - here->B3SOIDDdt4 = T0 * T1 * (1 + model->B3SOIDDasd) / 3 - - here->B3SOIDDcdbox * pParam->B3SOIDDvsdth; - } - - here->B3SOIDDphi = pParam->B3SOIDDphi; - /* process source/drain series resistance */ - here->B3SOIDDdrainConductance = model->B3SOIDDsheetResistance - * here->B3SOIDDdrainSquares; - if (here->B3SOIDDdrainConductance > 0.0) - here->B3SOIDDdrainConductance = 1.0 - / here->B3SOIDDdrainConductance; - else - here->B3SOIDDdrainConductance = 0.0; - - here->B3SOIDDsourceConductance = model->B3SOIDDsheetResistance - * here->B3SOIDDsourceSquares; - if (here->B3SOIDDsourceConductance > 0.0) - here->B3SOIDDsourceConductance = 1.0 - / here->B3SOIDDsourceConductance; - else - here->B3SOIDDsourceConductance = 0.0; - here->B3SOIDDcgso = pParam->B3SOIDDcgso; - here->B3SOIDDcgdo = pParam->B3SOIDDcgdo; - - } - } - return(OK); -} - diff --git a/src/spicelib/devices/bsim3soi_dd/b3soiddtrunc.c b/src/spicelib/devices/bsim3soi_dd/b3soiddtrunc.c deleted file mode 100644 index dd3750f73..000000000 --- a/src/spicelib/devices/bsim3soi_dd/b3soiddtrunc.c +++ /dev/null @@ -1,53 +0,0 @@ -/********** -Copyright 1999 Regents of the University of California. All rights reserved. -Author: 1998 Samuel Fung, Dennis Sinitsky and Stephen Tang -File: b3soiddtrunc.c 98/5/01 -Modified by Paolo Nenzi 2002 -**********/ - -/* - * Revision 2.1 99/9/27 Pin Su - * BSIMDD2.1 release - */ - -#include "ngspice/ngspice.h" -#include "ngspice/cktdefs.h" -#include "b3soidddef.h" -#include "ngspice/sperror.h" -#include "ngspice/suffix.h" - - -int -B3SOIDDtrunc(GENmodel *inModel, CKTcircuit *ckt, double *timeStep) -{ -B3SOIDDmodel *model = (B3SOIDDmodel*)inModel; -B3SOIDDinstance *here; - -#ifdef STEPDEBUG - double debugtemp; -#endif /* STEPDEBUG */ - - for (; model != NULL; model = B3SOIDDnextModel(model)) - { for (here = B3SOIDDinstances(model); here != NULL; - here = B3SOIDDnextInstance(here)) - { - -#ifdef STEPDEBUG - debugtemp = *timeStep; -#endif /* STEPDEBUG */ - CKTterr(here->B3SOIDDqb,ckt,timeStep); - CKTterr(here->B3SOIDDqg,ckt,timeStep); - CKTterr(here->B3SOIDDqd,ckt,timeStep); -#ifdef STEPDEBUG - if(debugtemp != *timeStep) - { printf("device %s reduces step from %g to %g\n", - here->B3SOIDDname,debugtemp,*timeStep); - } -#endif /* STEPDEBUG */ - } - } - return(OK); -} - - - diff --git a/src/spicelib/devices/bsim3soi_fd/BsimTerms_use b/src/spicelib/devices/bsim3soi_fd/BsimTerms_use deleted file mode 100644 index 6f8e8e540..000000000 --- a/src/spicelib/devices/bsim3soi_fd/BsimTerms_use +++ /dev/null @@ -1,29 +0,0 @@ -The terms under which the software is provided are as the following. - -Software is distributed as is, completely without warranty or service -support. The University of California and its employees are not liable -for the condition or performance of the software. - -The University owns the copyright but shall not be liable for any -infringement of copyright or other proprietary rights brought by third -parties against the users of the software. - -The University of California hereby disclaims all implied warranties. - -The University of California grants the users the right to modify, copy, -and redistribute the software and documentation, both within the user's -organization and externally, subject to the following restrictions - -1. The users agree not to charge for the University of California code - itself but may charge for additions, extensions, or support. - -2. In any product based on the software, the users agree to acknowledge - the UC Berkeley BSIM Research Group that developed the software. This - acknowledgment shall appear in the product documentation. - -3. The users agree to obey all U.S. Government restrictions governing - redistribution or export of the software. - -4. The users agree to reproduce any copyright notice which appears on - the software on any copy or modification of such made available - to others. diff --git a/src/spicelib/devices/bsim3soi_fd/Makefile.am b/src/spicelib/devices/bsim3soi_fd/Makefile.am deleted file mode 100644 index c06b6b72a..000000000 --- a/src/spicelib/devices/bsim3soi_fd/Makefile.am +++ /dev/null @@ -1,34 +0,0 @@ -## Process this file with automake to produce Makefile.in - -noinst_LTLIBRARIES = libbsim3soifd.la - -libbsim3soifd_la_SOURCES = \ - b3soifd.c \ - b3soifdacld.c \ - b3soifdask.c \ - b3soifdcheck.c \ - b3soifdcvtest.c \ - b3soifdgetic.c \ - b3soifdld.c \ - b3soifdmask.c \ - b3soifdmpar.c \ - b3soifdnoi.c \ - b3soifdpar.c \ - b3soifdpzld.c \ - b3soifdset.c \ - b3soifdtemp.c \ - b3soifdtrunc.c \ - b3soifddef.h \ - b3soifdext.h \ - b3soifdinit.c \ - b3soifdinit.h \ - b3soifditf.h - - - -AM_CPPFLAGS = @AM_CPPFLAGS@ -I$(top_srcdir)/src/include -AM_CFLAGS = $(STATIC) - -MAINTAINERCLEANFILES = Makefile.in - -EXTRA_DIST = BsimTerms_use diff --git a/src/spicelib/devices/bsim3soi_fd/b3soifd.c b/src/spicelib/devices/bsim3soi_fd/b3soifd.c deleted file mode 100644 index c6e3e8efb..000000000 --- a/src/spicelib/devices/bsim3soi_fd/b3soifd.c +++ /dev/null @@ -1,484 +0,0 @@ -/********** -Copyright 1999 Regents of the University of California. All rights reserved. -Author: Weidong Liu and Pin Su Feb 1999 -Author: 1998 Samuel Fung, Dennis Sinitsky and Stephen Tang -Modified by Wei Jin 99/9/27 -Modified by Paolo Nenzi 2002 -File: b3soifd.c 98/5/01 -**********/ - -/* - * Revision 2.1 99/9/27 Pin Su - * BSIMFD2.1 release - */ - -#include "ngspice/ngspice.h" -#include "ngspice/devdefs.h" -#include "b3soifddef.h" -#include "ngspice/suffix.h" - -IFparm B3SOIFDpTable[] = { /* parameters */ -IOP( "l", B3SOIFD_L, IF_REAL , "Length"), -IOP( "w", B3SOIFD_W, IF_REAL , "Width"), -IOP( "m", B3SOIFD_M, IF_REAL , "Parallel Multiplier"), -IOP( "ad", B3SOIFD_AD, IF_REAL , "Drain area"), -IOP( "as", B3SOIFD_AS, IF_REAL , "Source area"), -IOP( "pd", B3SOIFD_PD, IF_REAL , "Drain perimeter"), -IOP( "ps", B3SOIFD_PS, IF_REAL , "Source perimeter"), -IOP( "nrd", B3SOIFD_NRD, IF_REAL , "Number of squares in drain"), -IOP( "nrs", B3SOIFD_NRS, IF_REAL , "Number of squares in source"), -IOP( "off", B3SOIFD_OFF, IF_FLAG , "Device is initially off"), -IP( "ic", B3SOIFD_IC, IF_REALVEC , "Vector of DS,GS,BS initial voltages"), -OP( "gmbs", B3SOIFD_GMBS, IF_REAL, "Gmb"), -OP( "gm", B3SOIFD_GM, IF_REAL, "Gm"), -OP( "gm/ids", B3SOIFD_GMID, IF_REAL, "Gm/Ids"), -OP( "gds", B3SOIFD_GDS, IF_REAL, "Gds"), -OP( "vdsat", B3SOIFD_VDSAT, IF_REAL, "Vdsat"), -OP( "vth", B3SOIFD_VON, IF_REAL, "Vth"), -OP( "ids", B3SOIFD_CD, IF_REAL, "Ids"), -OP( "vbs", B3SOIFD_VBS, IF_REAL, "Vbs"), -OP( "vgs", B3SOIFD_VGS, IF_REAL, "Vgs"), -OP( "vds", B3SOIFD_VDS, IF_REAL, "Vds"), -OP( "ves", B3SOIFD_VES, IF_REAL, "Ves"), -IOP( "bjtoff", B3SOIFD_BJTOFF, IF_INTEGER, "BJT on/off flag"), -IOP( "debug", B3SOIFD_DEBUG, IF_INTEGER, "BJT on/off flag"), -IOP( "rth0", B3SOIFD_RTH0, IF_REAL, "Instance Thermal Resistance"), -IOP( "cth0", B3SOIFD_CTH0, IF_REAL, "Instance Thermal Capacitance"), -IOP( "nrb", B3SOIFD_NRB, IF_REAL, "Number of squares in body"), -}; - -IFparm B3SOIFDmPTable[] = { /* model parameters */ -IOP( "capmod", B3SOIFD_MOD_CAPMOD, IF_INTEGER, "Capacitance model selector"), -IOP( "mobmod", B3SOIFD_MOD_MOBMOD, IF_INTEGER, "Mobility model selector"), -IOP( "noimod", B3SOIFD_MOD_NOIMOD, IF_INTEGER, "Noise model selector"), -IOP( "paramchk", B3SOIFD_MOD_PARAMCHK, IF_INTEGER, "Model parameter checking selector"), -IOP( "binunit", B3SOIFD_MOD_BINUNIT, IF_INTEGER, "Bin unit selector"), -IOP( "version", B3SOIFD_MOD_VERSION, IF_REAL, " parameter for model version"), -IOP( "tox", B3SOIFD_MOD_TOX, IF_REAL, "Gate oxide thickness in meters"), - -IOP( "cdsc", B3SOIFD_MOD_CDSC, IF_REAL, "Drain/Source and channel coupling capacitance"), -IOP( "cdscb", B3SOIFD_MOD_CDSCB, IF_REAL, "Body-bias dependence of cdsc"), -IOP( "cdscd", B3SOIFD_MOD_CDSCD, IF_REAL, "Drain-bias dependence of cdsc"), -IOP( "cit", B3SOIFD_MOD_CIT, IF_REAL, "Interface state capacitance"), -IOP( "nfactor", B3SOIFD_MOD_NFACTOR, IF_REAL, "Subthreshold swing Coefficient"), -IOP( "vsat", B3SOIFD_MOD_VSAT, IF_REAL, "Saturation velocity at tnom"), -IOP( "at", B3SOIFD_MOD_AT, IF_REAL, "Temperature coefficient of vsat"), -IOP( "a0", B3SOIFD_MOD_A0, IF_REAL, "Non-uniform depletion width effect coefficient."), -IOP( "ags", B3SOIFD_MOD_AGS, IF_REAL, "Gate bias coefficient of Abulk."), -IOP( "a1", B3SOIFD_MOD_A1, IF_REAL, "Non-saturation effect coefficient"), -IOP( "a2", B3SOIFD_MOD_A2, IF_REAL, "Non-saturation effect coefficient"), -IOP( "keta", B3SOIFD_MOD_KETA, IF_REAL, "Body-bias coefficient of non-uniform depletion width effect."), -IOP( "nsub", B3SOIFD_MOD_NSUB, IF_REAL, "Substrate doping concentration with polarity"), -IOP( "nch", B3SOIFD_MOD_NPEAK, IF_REAL, "Channel doping concentration"), -IOP( "ngate", B3SOIFD_MOD_NGATE, IF_REAL, "Poly-gate doping concentration"), -IOP( "gamma1", B3SOIFD_MOD_GAMMA1, IF_REAL, "Vth body coefficient"), -IOP( "gamma2", B3SOIFD_MOD_GAMMA2, IF_REAL, "Vth body coefficient"), -IOP( "vbx", B3SOIFD_MOD_VBX, IF_REAL, "Vth transition body Voltage"), -IOP( "vbm", B3SOIFD_MOD_VBM, IF_REAL, "Maximum body voltage"), - -IOP( "xt", B3SOIFD_MOD_XT, IF_REAL, "Doping depth"), -IOP( "k1", B3SOIFD_MOD_K1, IF_REAL, "Bulk effect coefficient 1"), -IOP( "kt1", B3SOIFD_MOD_KT1, IF_REAL, "Temperature coefficient of Vth"), -IOP( "kt1l", B3SOIFD_MOD_KT1L, IF_REAL, "Temperature coefficient of Vth"), -IOP( "kt2", B3SOIFD_MOD_KT2, IF_REAL, "Body-coefficient of kt1"), -IOP( "k2", B3SOIFD_MOD_K2, IF_REAL, "Bulk effect coefficient 2"), -IOP( "k3", B3SOIFD_MOD_K3, IF_REAL, "Narrow width effect coefficient"), -IOP( "k3b", B3SOIFD_MOD_K3B, IF_REAL, "Body effect coefficient of k3"), -IOP( "w0", B3SOIFD_MOD_W0, IF_REAL, "Narrow width effect parameter"), -IOP( "nlx", B3SOIFD_MOD_NLX, IF_REAL, "Lateral non-uniform doping effect"), -IOP( "dvt0", B3SOIFD_MOD_DVT0, IF_REAL, "Short channel effect coeff. 0"), -IOP( "dvt1", B3SOIFD_MOD_DVT1, IF_REAL, "Short channel effect coeff. 1"), -IOP( "dvt2", B3SOIFD_MOD_DVT2, IF_REAL, "Short channel effect coeff. 2"), -IOP( "dvt0w", B3SOIFD_MOD_DVT0W, IF_REAL, "Narrow Width coeff. 0"), -IOP( "dvt1w", B3SOIFD_MOD_DVT1W, IF_REAL, "Narrow Width effect coeff. 1"), -IOP( "dvt2w", B3SOIFD_MOD_DVT2W, IF_REAL, "Narrow Width effect coeff. 2"), -IOP( "drout", B3SOIFD_MOD_DROUT, IF_REAL, "DIBL coefficient of output resistance"), -IOP( "dsub", B3SOIFD_MOD_DSUB, IF_REAL, "DIBL coefficient in the subthreshold region"), -IOP( "vth0", B3SOIFD_MOD_VTH0, IF_REAL,"Threshold voltage"), -IOPR("vtho", B3SOIFD_MOD_VTH0, IF_REAL,"Threshold voltage"), -IOP( "ua", B3SOIFD_MOD_UA, IF_REAL, "Linear gate dependence of mobility"), -IOP( "ua1", B3SOIFD_MOD_UA1, IF_REAL, "Temperature coefficient of ua"), -IOP( "ub", B3SOIFD_MOD_UB, IF_REAL, "Quadratic gate dependence of mobility"), -IOP( "ub1", B3SOIFD_MOD_UB1, IF_REAL, "Temperature coefficient of ub"), -IOP( "uc", B3SOIFD_MOD_UC, IF_REAL, "Body-bias dependence of mobility"), -IOP( "uc1", B3SOIFD_MOD_UC1, IF_REAL, "Temperature coefficient of uc"), -IOP( "u0", B3SOIFD_MOD_U0, IF_REAL, "Low-field mobility at Tnom"), -IOP( "ute", B3SOIFD_MOD_UTE, IF_REAL, "Temperature coefficient of mobility"), -IOP( "voff", B3SOIFD_MOD_VOFF, IF_REAL, "Threshold voltage offset"), -IOP( "tnom", B3SOIFD_MOD_TNOM, IF_REAL, "Parameter measurement temperature"), -IOP( "cgso", B3SOIFD_MOD_CGSO, IF_REAL, "Gate-source overlap capacitance per width"), -IOP( "cgdo", B3SOIFD_MOD_CGDO, IF_REAL, "Gate-drain overlap capacitance per width"), -IOP( "cgeo", B3SOIFD_MOD_CGEO, IF_REAL, "Gate-substrate overlap capacitance"), -IOP( "xpart", B3SOIFD_MOD_XPART, IF_REAL, "Channel charge partitioning"), -IOP( "delta", B3SOIFD_MOD_DELTA, IF_REAL, "Effective Vds parameter"), -IOP( "rsh", B3SOIFD_MOD_RSH, IF_REAL, "Source-drain sheet resistance"), -IOP( "rdsw", B3SOIFD_MOD_RDSW, IF_REAL, "Source-drain resistance per width"), - -IOP( "prwg", B3SOIFD_MOD_PRWG, IF_REAL, "Gate-bias effect on parasitic resistance "), -IOP( "prwb", B3SOIFD_MOD_PRWB, IF_REAL, "Body-effect on parasitic resistance "), - -IOP( "prt", B3SOIFD_MOD_PRT, IF_REAL, "Temperature coefficient of parasitic resistance "), -IOP( "eta0", B3SOIFD_MOD_ETA0, IF_REAL, "Subthreshold region DIBL coefficient"), -IOP( "etab", B3SOIFD_MOD_ETAB, IF_REAL, "Subthreshold region DIBL coefficient"), -IOP( "pclm", B3SOIFD_MOD_PCLM, IF_REAL, "Channel length modulation Coefficient"), -IOP( "pdiblc1", B3SOIFD_MOD_PDIBL1, IF_REAL, "Drain-induced barrier lowering coefficient"), -IOP( "pdiblc2", B3SOIFD_MOD_PDIBL2, IF_REAL, "Drain-induced barrier lowering coefficient"), -IOP( "pdiblcb", B3SOIFD_MOD_PDIBLB, IF_REAL, "Body-effect on drain-induced barrier lowering"), - -IOP( "pvag", B3SOIFD_MOD_PVAG, IF_REAL, "Gate dependence of output resistance parameter"), - -IOP( "shmod", B3SOIFD_MOD_SHMOD, IF_INTEGER, "Self heating mode selector"), -IOP( "tbox", B3SOIFD_MOD_TBOX, IF_REAL, "Back gate oxide thickness in meters"), -IOP( "tsi", B3SOIFD_MOD_TSI, IF_REAL, "Silicon-on-insulator thickness in meters"), -IOP( "xj", B3SOIFD_MOD_XJ, IF_REAL, "Junction Depth"), -IOP( "kb1", B3SOIFD_MOD_KB1, IF_REAL, "Backgate coupling coefficient at strong inversion"), -IOP( "kb3", B3SOIFD_MOD_KB3, IF_REAL, "Backgate coupling coefficient at subthreshold"), -IOP( "dvbd0", B3SOIFD_MOD_DVBD0, IF_REAL, "First coefficient of short-channel effect on Vbs0t"), -IOP( "dvbd1", B3SOIFD_MOD_DVBD1, IF_REAL, "Second coefficient of short-channel effect on Vbs0t"), -IOP( "vbsa", B3SOIFD_MOD_VBSA, IF_REAL, "Vbs0t offset voltage"), -IOP( "delp", B3SOIFD_MOD_DELP, IF_REAL, "Offset constant for limiting Vbseff to Phis"), -IOP( "rbody", B3SOIFD_MOD_RBODY, IF_REAL, "Intrinsic body contact sheet resistance"), -IOP( "rbsh", B3SOIFD_MOD_RBSH, IF_REAL, "Extrinsic body contact sheet resistance"), -IOP( "adice0", B3SOIFD_MOD_ADICE0, IF_REAL, "DICE constant for bulk charge effect"), -IOP( "abp", B3SOIFD_MOD_ABP, IF_REAL, "Gate bias coefficient for Xcsat calculation"), -IOP( "mxc", B3SOIFD_MOD_MXC, IF_REAL, "A smoothing parameter for Xcsat calculation"), -IOP( "rth0", B3SOIFD_MOD_RTH0, IF_REAL, "Self-heating thermal resistance"), -IOP( "cth0", B3SOIFD_MOD_CTH0, IF_REAL, "Self-heating thermal capacitance"), -IOP( "aii", B3SOIFD_MOD_AII, IF_REAL, "1st Vdsatii parameter"), -IOP( "bii", B3SOIFD_MOD_BII, IF_REAL, "2nd Vdsatii parameter"), -IOP( "cii", B3SOIFD_MOD_CII, IF_REAL, "3rd Vdsatii parameter"), -IOP( "dii", B3SOIFD_MOD_DII, IF_REAL, "4th Vdsatii parameter"), -IOP( "ngidl", B3SOIFD_MOD_NGIDL, IF_REAL, "GIDL first parameter"), -IOP( "agidl", B3SOIFD_MOD_AGIDL, IF_REAL, "GIDL second parameter"), -IOP( "bgidl", B3SOIFD_MOD_BGIDL, IF_REAL, "GIDL third parameter"), -IOP( "ndiode", B3SOIFD_MOD_NDIODE, IF_REAL, "Diode non-ideality factor"), -IOP( "ntun", B3SOIFD_MOD_NTUN, IF_REAL, "Reverse tunneling non-ideality factor"), -IOP( "isbjt", B3SOIFD_MOD_ISBJT, IF_REAL, "BJT emitter injection constant"), -IOP( "isdif", B3SOIFD_MOD_ISDIF, IF_REAL, "Body to S/D injection constant"), -IOP( "isrec", B3SOIFD_MOD_ISREC, IF_REAL, "Recombination in depletion constant"), -IOP( "istun", B3SOIFD_MOD_ISTUN, IF_REAL, "Tunneling diode constant"), -IOP( "xbjt", B3SOIFD_MOD_XBJT, IF_REAL, "Temperature coefficient for Isbjt"), -IOPR( "xdif",B3SOIFD_MOD_XBJT, IF_REAL, "Temperature coefficient for Isdif"), -IOP( "xrec", B3SOIFD_MOD_XREC, IF_REAL, "Temperature coefficient for Isrec"), -IOP( "xtun", B3SOIFD_MOD_XTUN, IF_REAL, "Temperature coefficient for Istun"), -IOP( "edl", B3SOIFD_MOD_EDL, IF_REAL, "Electron diffusion length"), -IOP( "kbjt1", B3SOIFD_MOD_KBJT1, IF_REAL, "Vds dependency on BJT base width"), -IOP( "tt", B3SOIFD_MOD_TT, IF_REAL, "Diffusion capacitance transit time coefficient"), -IOP( "vsdth", B3SOIFD_MOD_VSDTH, IF_REAL, "Source/Drain diffusion threshold voltage"), -IOP( "vsdfb", B3SOIFD_MOD_VSDFB, IF_REAL, "Source/Drain diffusion flatband voltage"), -IOP( "csdmin", B3SOIFD_MOD_CSDMIN, IF_REAL, "Source/Drain diffusion bottom minimum capacitance"), -IOP( "asd", B3SOIFD_MOD_ASD, IF_REAL, "Source/Drain diffusion smoothing parameter"), - -IOP( "pbswg", B3SOIFD_MOD_PBSWG, IF_REAL, "Source/drain (gate side) sidewall junction capacitance built in potential"), -IOP( "mjswg", B3SOIFD_MOD_MJSWG, IF_REAL, "Source/drain (gate side) sidewall junction capacitance grading coefficient"), - -IOP( "cjswg", B3SOIFD_MOD_CJSWG, IF_REAL, "Source/drain (gate side) sidewall junction capacitance per unit width"), -IOP( "csdesw", B3SOIFD_MOD_CSDESW, IF_REAL, "Source/drain sidewall fringing constant"), -IOP( "lint", B3SOIFD_MOD_LINT, IF_REAL, "Length reduction parameter"), -IOP( "ll", B3SOIFD_MOD_LL, IF_REAL, "Length reduction parameter"), -IOP( "lln", B3SOIFD_MOD_LLN, IF_REAL, "Length reduction parameter"), -IOP( "lw", B3SOIFD_MOD_LW, IF_REAL, "Length reduction parameter"), -IOP( "lwn", B3SOIFD_MOD_LWN, IF_REAL, "Length reduction parameter"), -IOP( "lwl", B3SOIFD_MOD_LWL, IF_REAL, "Length reduction parameter"), - -IOP( "wr", B3SOIFD_MOD_WR, IF_REAL, "Width dependence of rds"), -IOP( "wint", B3SOIFD_MOD_WINT, IF_REAL, "Width reduction parameter"), -IOP( "dwg", B3SOIFD_MOD_DWG, IF_REAL, "Width reduction parameter"), -IOP( "dwb", B3SOIFD_MOD_DWB, IF_REAL, "Width reduction parameter"), - -IOP( "wl", B3SOIFD_MOD_WL, IF_REAL, "Width reduction parameter"), -IOP( "wln", B3SOIFD_MOD_WLN, IF_REAL, "Width reduction parameter"), -IOP( "ww", B3SOIFD_MOD_WW, IF_REAL, "Width reduction parameter"), -IOP( "wwn", B3SOIFD_MOD_WWN, IF_REAL, "Width reduction parameter"), -IOP( "wwl", B3SOIFD_MOD_WWL, IF_REAL, "Width reduction parameter"), - -IOP( "b0", B3SOIFD_MOD_B0, IF_REAL, "Abulk narrow width parameter"), -IOP( "b1", B3SOIFD_MOD_B1, IF_REAL, "Abulk narrow width parameter"), - -IOP( "cgsl", B3SOIFD_MOD_CGSL, IF_REAL, "New C-V model parameter"), -IOP( "cgdl", B3SOIFD_MOD_CGDL, IF_REAL, "New C-V model parameter"), -IOP( "ckappa", B3SOIFD_MOD_CKAPPA, IF_REAL, "New C-V model parameter"), -IOP( "cf", B3SOIFD_MOD_CF, IF_REAL, "Fringe capacitance parameter"), -IOP( "clc", B3SOIFD_MOD_CLC, IF_REAL, "Vdsat parameter for C-V model"), -IOP( "cle", B3SOIFD_MOD_CLE, IF_REAL, "Vdsat parameter for C-V model"), -IOP( "dwc", B3SOIFD_MOD_DWC, IF_REAL, "Delta W for C-V model"), -IOP( "dlc", B3SOIFD_MOD_DLC, IF_REAL, "Delta L for C-V model"), - -IOP( "alpha0", B3SOIFD_MOD_ALPHA0, IF_REAL, "substrate current model parameter"), -IOP( "alpha1", B3SOIFD_MOD_ALPHA1, IF_REAL, "substrate current model parameter"), -IOP( "beta0", B3SOIFD_MOD_BETA0, IF_REAL, "substrate current model parameter"), - -IOP( "noia", B3SOIFD_MOD_NOIA, IF_REAL, "Flicker noise parameter"), -IOP( "noib", B3SOIFD_MOD_NOIB, IF_REAL, "Flicker noise parameter"), -IOP( "noic", B3SOIFD_MOD_NOIC, IF_REAL, "Flicker noise parameter"), -IOP( "em", B3SOIFD_MOD_EM, IF_REAL, "Flicker noise parameter"), -IOP( "ef", B3SOIFD_MOD_EF, IF_REAL, "Flicker noise frequency exponent"), -IOP( "af", B3SOIFD_MOD_AF, IF_REAL, "Flicker noise exponent"), -IOP( "kf", B3SOIFD_MOD_KF, IF_REAL, "Flicker noise coefficient"), -IOP( "noif", B3SOIFD_MOD_NOIF, IF_REAL, "Floating body excess noise ideality factor"), - -/* Added for binning - START */ -/* Length Dependence */ -IOP( "lnch", B3SOIFD_MOD_LNPEAK, IF_REAL, "Length dependence of nch"), -IOP( "lnsub", B3SOIFD_MOD_LNSUB, IF_REAL, "Length dependence of nsub"), -IOP( "lngate", B3SOIFD_MOD_LNGATE, IF_REAL, "Length dependence of ngate"), -IOP( "lvth0", B3SOIFD_MOD_LVTH0, IF_REAL,"Length dependence of vth0"), -IOP( "lk1", B3SOIFD_MOD_LK1, IF_REAL, "Length dependence of k1"), -IOP( "lk2", B3SOIFD_MOD_LK2, IF_REAL, "Length dependence of k2"), -IOP( "lk3", B3SOIFD_MOD_LK3, IF_REAL, "Length dependence of k3"), -IOP( "lk3b", B3SOIFD_MOD_LK3B, IF_REAL, "Length dependence of k3b"), -IOP( "lvbsa", B3SOIFD_MOD_LVBSA, IF_REAL, "Length dependence of vbsa"), -IOP( "ldelp", B3SOIFD_MOD_LDELP, IF_REAL, "Length dependence of delp"), -IOP( "lkb1", B3SOIFD_MOD_LKB1, IF_REAL, "Length dependence of kb1"), -IOP( "lkb3", B3SOIFD_MOD_LKB3, IF_REAL, "Length dependence of kb3"), -IOP( "ldvbd0", B3SOIFD_MOD_LDVBD0, IF_REAL, "Length dependence of dvbd0"), -IOP( "ldvbd1", B3SOIFD_MOD_LDVBD1, IF_REAL, "Length dependence of dvbd1"), -IOP( "lw0", B3SOIFD_MOD_LW0, IF_REAL, "Length dependence of w0"), -IOP( "lnlx", B3SOIFD_MOD_LNLX, IF_REAL, "Length dependence of nlx"), -IOP( "ldvt0", B3SOIFD_MOD_LDVT0, IF_REAL, "Length dependence of dvt0"), -IOP( "ldvt1", B3SOIFD_MOD_LDVT1, IF_REAL, "Length dependence of dvt1"), -IOP( "ldvt2", B3SOIFD_MOD_LDVT2, IF_REAL, "Length dependence of dvt2"), -IOP( "ldvt0w", B3SOIFD_MOD_LDVT0W, IF_REAL, "Length dependence of dvt0w"), -IOP( "ldvt1w", B3SOIFD_MOD_LDVT1W, IF_REAL, "Length dependence of dvt1w"), -IOP( "ldvt2w", B3SOIFD_MOD_LDVT2W, IF_REAL, "Length dependence of dvt2w"), -IOP( "lu0", B3SOIFD_MOD_LU0, IF_REAL, "Length dependence of u0"), -IOP( "lua", B3SOIFD_MOD_LUA, IF_REAL, "Length dependence of ua"), -IOP( "lub", B3SOIFD_MOD_LUB, IF_REAL, "Length dependence of ub"), -IOP( "luc", B3SOIFD_MOD_LUC, IF_REAL, "Length dependence of uc"), -IOP( "lvsat", B3SOIFD_MOD_LVSAT, IF_REAL, "Length dependence of vsat"), -IOP( "la0", B3SOIFD_MOD_LA0, IF_REAL, "Length dependence of a0"), -IOP( "lags", B3SOIFD_MOD_LAGS, IF_REAL, "Length dependence of ags"), -IOP( "lb0", B3SOIFD_MOD_LB0, IF_REAL, "Length dependence of b0"), -IOP( "lb1", B3SOIFD_MOD_LB1, IF_REAL, "Length dependence of b1"), -IOP( "lketa", B3SOIFD_MOD_LKETA, IF_REAL, "Length dependence of keta"), -IOP( "labp", B3SOIFD_MOD_LABP, IF_REAL, "Length dependence of abp"), -IOP( "lmxc", B3SOIFD_MOD_LMXC, IF_REAL, "Length dependence of mxc"), -IOP( "ladice0", B3SOIFD_MOD_LADICE0, IF_REAL, "Length dependence of adice0"), -IOP( "la1", B3SOIFD_MOD_LA1, IF_REAL, "Length dependence of a1"), -IOP( "la2", B3SOIFD_MOD_LA2, IF_REAL, "Length dependence of a2"), -IOP( "lrdsw", B3SOIFD_MOD_LRDSW, IF_REAL, "Length dependence of rdsw "), -IOP( "lprwb", B3SOIFD_MOD_LPRWB, IF_REAL, "Length dependence of prwb "), -IOP( "lprwg", B3SOIFD_MOD_LPRWG, IF_REAL, "Length dependence of prwg "), -IOP( "lwr", B3SOIFD_MOD_LWR, IF_REAL, "Length dependence of wr"), -IOP( "lnfactor", B3SOIFD_MOD_LNFACTOR, IF_REAL, "Length dependence of nfactor"), -IOP( "ldwg", B3SOIFD_MOD_LDWG, IF_REAL, "Length dependence of dwg"), -IOP( "ldwb", B3SOIFD_MOD_LDWB, IF_REAL, "Length dependence of dwb"), -IOP( "lvoff", B3SOIFD_MOD_LVOFF, IF_REAL, "Length dependence of voff"), -IOP( "leta0", B3SOIFD_MOD_LETA0, IF_REAL, "Length dependence of eta0"), -IOP( "letab", B3SOIFD_MOD_LETAB, IF_REAL, "Length dependence of etab"), -IOP( "ldsub", B3SOIFD_MOD_LDSUB, IF_REAL, "Length dependence of dsub"), -IOP( "lcit", B3SOIFD_MOD_LCIT, IF_REAL, "Length dependence of cit"), -IOP( "lcdsc", B3SOIFD_MOD_LCDSC, IF_REAL, "Length dependence of cdsc"), -IOP( "lcdscb", B3SOIFD_MOD_LCDSCB, IF_REAL, "Length dependence of cdscb"), -IOP( "lcdscd", B3SOIFD_MOD_LCDSCD, IF_REAL, "Length dependence of cdscd"), -IOP( "lpclm", B3SOIFD_MOD_LPCLM, IF_REAL, "Length dependence of pclm"), -IOP( "lpdiblc1", B3SOIFD_MOD_LPDIBL1, IF_REAL, "Length dependence of pdiblc1"), -IOP( "lpdiblc2", B3SOIFD_MOD_LPDIBL2, IF_REAL, "Length dependence of pdiblc2"), -IOP( "lpdiblcb", B3SOIFD_MOD_LPDIBLB, IF_REAL, "Length dependence of pdiblcb"), -IOP( "ldrout", B3SOIFD_MOD_LDROUT, IF_REAL, "Length dependence of drout"), -IOP( "lpvag", B3SOIFD_MOD_LPVAG, IF_REAL, "Length dependence of pvag"), -IOP( "ldelta", B3SOIFD_MOD_LDELTA, IF_REAL, "Length dependence of delta"), -IOP( "laii", B3SOIFD_MOD_LAII, IF_REAL, "Length dependence of aii"), -IOP( "lbii", B3SOIFD_MOD_LBII, IF_REAL, "Length dependence of bii"), -IOP( "lcii", B3SOIFD_MOD_LCII, IF_REAL, "Length dependence of cii"), -IOP( "ldii", B3SOIFD_MOD_LDII, IF_REAL, "Length dependence of dii"), -IOP( "lalpha0", B3SOIFD_MOD_LALPHA0, IF_REAL, "Length dependence of alpha0"), -IOP( "lalpha1", B3SOIFD_MOD_LALPHA1, IF_REAL, "Length dependence of alpha1"), -IOP( "lbeta0", B3SOIFD_MOD_LBETA0, IF_REAL, "Length dependence of beta0"), -IOP( "lagidl", B3SOIFD_MOD_LAGIDL, IF_REAL, "Length dependence of agidl"), -IOP( "lbgidl", B3SOIFD_MOD_LBGIDL, IF_REAL, "Length dependence of bgidl"), -IOP( "lngidl", B3SOIFD_MOD_LNGIDL, IF_REAL, "Length dependence of ngidl"), -IOP( "lntun", B3SOIFD_MOD_LNTUN, IF_REAL, "Length dependence of ntun"), -IOP( "lndiode", B3SOIFD_MOD_LNDIODE, IF_REAL, "Length dependence of ndiode"), -IOP( "lisbjt", B3SOIFD_MOD_LISBJT, IF_REAL, "Length dependence of isbjt"), -IOP( "lisdif", B3SOIFD_MOD_LISDIF, IF_REAL, "Length dependence of isdif"), -IOP( "lisrec", B3SOIFD_MOD_LISREC, IF_REAL, "Length dependence of isrec"), -IOP( "listun", B3SOIFD_MOD_LISTUN, IF_REAL, "Length dependence of istun"), -IOP( "ledl", B3SOIFD_MOD_LEDL, IF_REAL, "Length dependence of edl"), -IOP( "lkbjt1", B3SOIFD_MOD_LKBJT1, IF_REAL, "Length dependence of kbjt1"), -IOP( "lvsdfb", B3SOIFD_MOD_LVSDFB, IF_REAL, "Length dependence of vsdfb"), -IOP( "lvsdth", B3SOIFD_MOD_LVSDTH, IF_REAL, "Length dependence of vsdth"), -/* Width Dependence */ -IOP( "wnch", B3SOIFD_MOD_WNPEAK, IF_REAL, "Width dependence of nch"), -IOP( "wnsub", B3SOIFD_MOD_WNSUB, IF_REAL, "Width dependence of nsub"), -IOP( "wngate", B3SOIFD_MOD_WNGATE, IF_REAL, "Width dependence of ngate"), -IOP( "wvth0", B3SOIFD_MOD_WVTH0, IF_REAL,"Width dependence of vth0"), -IOP( "wk1", B3SOIFD_MOD_WK1, IF_REAL, "Width dependence of k1"), -IOP( "wk2", B3SOIFD_MOD_WK2, IF_REAL, "Width dependence of k2"), -IOP( "wk3", B3SOIFD_MOD_WK3, IF_REAL, "Width dependence of k3"), -IOP( "wk3b", B3SOIFD_MOD_WK3B, IF_REAL, "Width dependence of k3b"), -IOP( "wvbsa", B3SOIFD_MOD_WVBSA, IF_REAL, "Width dependence of vbsa"), -IOP( "wdelp", B3SOIFD_MOD_WDELP, IF_REAL, "Width dependence of delp"), -IOP( "wkb1", B3SOIFD_MOD_WKB1, IF_REAL, "Width dependence of kb1"), -IOP( "wkb3", B3SOIFD_MOD_WKB3, IF_REAL, "Width dependence of kb3"), -IOP( "wdvbd0", B3SOIFD_MOD_WDVBD0, IF_REAL, "Width dependence of dvbd0"), -IOP( "wdvbd1", B3SOIFD_MOD_WDVBD1, IF_REAL, "Width dependence of dvbd1"), -IOP( "ww0", B3SOIFD_MOD_WW0, IF_REAL, "Width dependence of w0"), -IOP( "wnlx", B3SOIFD_MOD_WNLX, IF_REAL, "Width dependence of nlx"), -IOP( "wdvt0", B3SOIFD_MOD_WDVT0, IF_REAL, "Width dependence of dvt0"), -IOP( "wdvt1", B3SOIFD_MOD_WDVT1, IF_REAL, "Width dependence of dvt1"), -IOP( "wdvt2", B3SOIFD_MOD_WDVT2, IF_REAL, "Width dependence of dvt2"), -IOP( "wdvt0w", B3SOIFD_MOD_WDVT0W, IF_REAL, "Width dependence of dvt0w"), -IOP( "wdvt1w", B3SOIFD_MOD_WDVT1W, IF_REAL, "Width dependence of dvt1w"), -IOP( "wdvt2w", B3SOIFD_MOD_WDVT2W, IF_REAL, "Width dependence of dvt2w"), -IOP( "wu0", B3SOIFD_MOD_WU0, IF_REAL, "Width dependence of u0"), -IOP( "wua", B3SOIFD_MOD_WUA, IF_REAL, "Width dependence of ua"), -IOP( "wub", B3SOIFD_MOD_WUB, IF_REAL, "Width dependence of ub"), -IOP( "wuc", B3SOIFD_MOD_WUC, IF_REAL, "Width dependence of uc"), -IOP( "wvsat", B3SOIFD_MOD_WVSAT, IF_REAL, "Width dependence of vsat"), -IOP( "wa0", B3SOIFD_MOD_WA0, IF_REAL, "Width dependence of a0"), -IOP( "wags", B3SOIFD_MOD_WAGS, IF_REAL, "Width dependence of ags"), -IOP( "wb0", B3SOIFD_MOD_WB0, IF_REAL, "Width dependence of b0"), -IOP( "wb1", B3SOIFD_MOD_WB1, IF_REAL, "Width dependence of b1"), -IOP( "wketa", B3SOIFD_MOD_WKETA, IF_REAL, "Width dependence of keta"), -IOP( "wabp", B3SOIFD_MOD_WABP, IF_REAL, "Width dependence of abp"), -IOP( "wmxc", B3SOIFD_MOD_WMXC, IF_REAL, "Width dependence of mxc"), -IOP( "wadice0", B3SOIFD_MOD_WADICE0, IF_REAL, "Width dependence of adice0"), -IOP( "wa1", B3SOIFD_MOD_WA1, IF_REAL, "Width dependence of a1"), -IOP( "wa2", B3SOIFD_MOD_WA2, IF_REAL, "Width dependence of a2"), -IOP( "wrdsw", B3SOIFD_MOD_WRDSW, IF_REAL, "Width dependence of rdsw "), -IOP( "wprwb", B3SOIFD_MOD_WPRWB, IF_REAL, "Width dependence of prwb "), -IOP( "wprwg", B3SOIFD_MOD_WPRWG, IF_REAL, "Width dependence of prwg "), -IOP( "wwr", B3SOIFD_MOD_WWR, IF_REAL, "Width dependence of wr"), -IOP( "wnfactor", B3SOIFD_MOD_WNFACTOR, IF_REAL, "Width dependence of nfactor"), -IOP( "wdwg", B3SOIFD_MOD_WDWG, IF_REAL, "Width dependence of dwg"), -IOP( "wdwb", B3SOIFD_MOD_WDWB, IF_REAL, "Width dependence of dwb"), -IOP( "wvoff", B3SOIFD_MOD_WVOFF, IF_REAL, "Width dependence of voff"), -IOP( "weta0", B3SOIFD_MOD_WETA0, IF_REAL, "Width dependence of eta0"), -IOP( "wetab", B3SOIFD_MOD_WETAB, IF_REAL, "Width dependence of etab"), -IOP( "wdsub", B3SOIFD_MOD_WDSUB, IF_REAL, "Width dependence of dsub"), -IOP( "wcit", B3SOIFD_MOD_WCIT, IF_REAL, "Width dependence of cit"), -IOP( "wcdsc", B3SOIFD_MOD_WCDSC, IF_REAL, "Width dependence of cdsc"), -IOP( "wcdscb", B3SOIFD_MOD_WCDSCB, IF_REAL, "Width dependence of cdscb"), -IOP( "wcdscd", B3SOIFD_MOD_WCDSCD, IF_REAL, "Width dependence of cdscd"), -IOP( "wpclm", B3SOIFD_MOD_WPCLM, IF_REAL, "Width dependence of pclm"), -IOP( "wpdiblc1", B3SOIFD_MOD_WPDIBL1, IF_REAL, "Width dependence of pdiblc1"), -IOP( "wpdiblc2", B3SOIFD_MOD_WPDIBL2, IF_REAL, "Width dependence of pdiblc2"), -IOP( "wpdiblcb", B3SOIFD_MOD_WPDIBLB, IF_REAL, "Width dependence of pdiblcb"), -IOP( "wdrout", B3SOIFD_MOD_WDROUT, IF_REAL, "Width dependence of drout"), -IOP( "wpvag", B3SOIFD_MOD_WPVAG, IF_REAL, "Width dependence of pvag"), -IOP( "wdelta", B3SOIFD_MOD_WDELTA, IF_REAL, "Width dependence of delta"), -IOP( "waii", B3SOIFD_MOD_WAII, IF_REAL, "Width dependence of aii"), -IOP( "wbii", B3SOIFD_MOD_WBII, IF_REAL, "Width dependence of bii"), -IOP( "wcii", B3SOIFD_MOD_WCII, IF_REAL, "Width dependence of cii"), -IOP( "wdii", B3SOIFD_MOD_WDII, IF_REAL, "Width dependence of dii"), -IOP( "walpha0", B3SOIFD_MOD_WALPHA0, IF_REAL, "Width dependence of alpha0"), -IOP( "walpha1", B3SOIFD_MOD_WALPHA1, IF_REAL, "Width dependence of alpha1"), -IOP( "wbeta0", B3SOIFD_MOD_WBETA0, IF_REAL, "Width dependence of beta0"), -IOP( "wagidl", B3SOIFD_MOD_WAGIDL, IF_REAL, "Width dependence of agidl"), -IOP( "wbgidl", B3SOIFD_MOD_WBGIDL, IF_REAL, "Width dependence of bgidl"), -IOP( "wngidl", B3SOIFD_MOD_WNGIDL, IF_REAL, "Width dependence of ngidl"), -IOP( "wntun", B3SOIFD_MOD_WNTUN, IF_REAL, "Width dependence of ntun"), -IOP( "wndiode", B3SOIFD_MOD_WNDIODE, IF_REAL, "Width dependence of ndiode"), -IOP( "wisbjt", B3SOIFD_MOD_WISBJT, IF_REAL, "Width dependence of isbjt"), -IOP( "wisdif", B3SOIFD_MOD_WISDIF, IF_REAL, "Width dependence of isdif"), -IOP( "wisrec", B3SOIFD_MOD_WISREC, IF_REAL, "Width dependence of isrec"), -IOP( "wistun", B3SOIFD_MOD_WISTUN, IF_REAL, "Width dependence of istun"), -IOP( "wedl", B3SOIFD_MOD_WEDL, IF_REAL, "Width dependence of edl"), -IOP( "wkbjt1", B3SOIFD_MOD_WKBJT1, IF_REAL, "Width dependence of kbjt1"), -IOP( "wvsdfb", B3SOIFD_MOD_WVSDFB, IF_REAL, "Width dependence of vsdfb"), -IOP( "wvsdth", B3SOIFD_MOD_WVSDTH, IF_REAL, "Width dependence of vsdth"), -/* Cross-term Dependence */ -IOP( "pnch", B3SOIFD_MOD_PNPEAK, IF_REAL, "Cross-term dependence of nch"), -IOP( "pnsub", B3SOIFD_MOD_PNSUB, IF_REAL, "Cross-term dependence of nsub"), -IOP( "pngate", B3SOIFD_MOD_PNGATE, IF_REAL, "Cross-term dependence of ngate"), -IOP( "pvth0", B3SOIFD_MOD_PVTH0, IF_REAL,"Cross-term dependence of vth0"), -IOP( "pk1", B3SOIFD_MOD_PK1, IF_REAL, "Cross-term dependence of k1"), -IOP( "pk2", B3SOIFD_MOD_PK2, IF_REAL, "Cross-term dependence of k2"), -IOP( "pk3", B3SOIFD_MOD_PK3, IF_REAL, "Cross-term dependence of k3"), -IOP( "pk3b", B3SOIFD_MOD_PK3B, IF_REAL, "Cross-term dependence of k3b"), -IOP( "pvbsa", B3SOIFD_MOD_PVBSA, IF_REAL, "Cross-term dependence of vbsa"), -IOP( "pdelp", B3SOIFD_MOD_PDELP, IF_REAL, "Cross-term dependence of delp"), -IOP( "pkb1", B3SOIFD_MOD_PKB1, IF_REAL, "Cross-term dependence of kb1"), -IOP( "pkb3", B3SOIFD_MOD_PKB3, IF_REAL, "Cross-term dependence of kb3"), -IOP( "pdvbd0", B3SOIFD_MOD_PDVBD0, IF_REAL, "Cross-term dependence of dvbd0"), -IOP( "pdvbd1", B3SOIFD_MOD_PDVBD1, IF_REAL, "Cross-term dependence of dvbd1"), -IOP( "pw0", B3SOIFD_MOD_PW0, IF_REAL, "Cross-term dependence of w0"), -IOP( "pnlx", B3SOIFD_MOD_PNLX, IF_REAL, "Cross-term dependence of nlx"), -IOP( "pdvt0", B3SOIFD_MOD_PDVT0, IF_REAL, "Cross-term dependence of dvt0"), -IOP( "pdvt1", B3SOIFD_MOD_PDVT1, IF_REAL, "Cross-term dependence of dvt1"), -IOP( "pdvt2", B3SOIFD_MOD_PDVT2, IF_REAL, "Cross-term dependence of dvt2"), -IOP( "pdvt0w", B3SOIFD_MOD_PDVT0W, IF_REAL, "Cross-term dependence of dvt0w"), -IOP( "pdvt1w", B3SOIFD_MOD_PDVT1W, IF_REAL, "Cross-term dependence of dvt1w"), -IOP( "pdvt2w", B3SOIFD_MOD_PDVT2W, IF_REAL, "Cross-term dependence of dvt2w"), -IOP( "pu0", B3SOIFD_MOD_PU0, IF_REAL, "Cross-term dependence of u0"), -IOP( "pua", B3SOIFD_MOD_PUA, IF_REAL, "Cross-term dependence of ua"), -IOP( "pub", B3SOIFD_MOD_PUB, IF_REAL, "Cross-term dependence of ub"), -IOP( "puc", B3SOIFD_MOD_PUC, IF_REAL, "Cross-term dependence of uc"), -IOP( "pvsat", B3SOIFD_MOD_PVSAT, IF_REAL, "Cross-term dependence of vsat"), -IOP( "pa0", B3SOIFD_MOD_PA0, IF_REAL, "Cross-term dependence of a0"), -IOP( "pags", B3SOIFD_MOD_PAGS, IF_REAL, "Cross-term dependence of ags"), -IOP( "pb0", B3SOIFD_MOD_PB0, IF_REAL, "Cross-term dependence of b0"), -IOP( "pb1", B3SOIFD_MOD_PB1, IF_REAL, "Cross-term dependence of b1"), -IOP( "pketa", B3SOIFD_MOD_PKETA, IF_REAL, "Cross-term dependence of keta"), -IOP( "pabp", B3SOIFD_MOD_PABP, IF_REAL, "Cross-term dependence of abp"), -IOP( "pmxc", B3SOIFD_MOD_PMXC, IF_REAL, "Cross-term dependence of mxc"), -IOP( "padice0", B3SOIFD_MOD_PADICE0, IF_REAL, "Cross-term dependence of adice0"), -IOP( "pa1", B3SOIFD_MOD_PA1, IF_REAL, "Cross-term dependence of a1"), -IOP( "pa2", B3SOIFD_MOD_PA2, IF_REAL, "Cross-term dependence of a2"), -IOP( "prdsw", B3SOIFD_MOD_PRDSW, IF_REAL, "Cross-term dependence of rdsw "), -IOP( "pprwb", B3SOIFD_MOD_PPRWB, IF_REAL, "Cross-term dependence of prwb "), -IOP( "pprwg", B3SOIFD_MOD_PPRWG, IF_REAL, "Cross-term dependence of prwg "), -IOP( "pwr", B3SOIFD_MOD_PWR, IF_REAL, "Cross-term dependence of wr"), -IOP( "pnfactor", B3SOIFD_MOD_PNFACTOR, IF_REAL, "Cross-term dependence of nfactor"), -IOP( "pdwg", B3SOIFD_MOD_PDWG, IF_REAL, "Cross-term dependence of dwg"), -IOP( "pdwb", B3SOIFD_MOD_PDWB, IF_REAL, "Cross-term dependence of dwb"), -IOP( "pvoff", B3SOIFD_MOD_PVOFF, IF_REAL, "Cross-term dependence of voff"), -IOP( "peta0", B3SOIFD_MOD_PETA0, IF_REAL, "Cross-term dependence of eta0"), -IOP( "petab", B3SOIFD_MOD_PETAB, IF_REAL, "Cross-term dependence of etab"), -IOP( "pdsub", B3SOIFD_MOD_PDSUB, IF_REAL, "Cross-term dependence of dsub"), -IOP( "pcit", B3SOIFD_MOD_PCIT, IF_REAL, "Cross-term dependence of cit"), -IOP( "pcdsc", B3SOIFD_MOD_PCDSC, IF_REAL, "Cross-term dependence of cdsc"), -IOP( "pcdscb", B3SOIFD_MOD_PCDSCB, IF_REAL, "Cross-term dependence of cdscb"), -IOP( "pcdscd", B3SOIFD_MOD_PCDSCD, IF_REAL, "Cross-term dependence of cdscd"), -IOP( "ppclm", B3SOIFD_MOD_PPCLM, IF_REAL, "Cross-term dependence of pclm"), -IOP( "ppdiblc1", B3SOIFD_MOD_PPDIBL1, IF_REAL, "Cross-term dependence of pdiblc1"), -IOP( "ppdiblc2", B3SOIFD_MOD_PPDIBL2, IF_REAL, "Cross-term dependence of pdiblc2"), -IOP( "ppdiblcb", B3SOIFD_MOD_PPDIBLB, IF_REAL, "Cross-term dependence of pdiblcb"), -IOP( "pdrout", B3SOIFD_MOD_PDROUT, IF_REAL, "Cross-term dependence of drout"), -IOP( "ppvag", B3SOIFD_MOD_PPVAG, IF_REAL, "Cross-term dependence of pvag"), -IOP( "pdelta", B3SOIFD_MOD_PDELTA, IF_REAL, "Cross-term dependence of delta"), -IOP( "paii", B3SOIFD_MOD_PAII, IF_REAL, "Cross-term dependence of aii"), -IOP( "pbii", B3SOIFD_MOD_PBII, IF_REAL, "Cross-term dependence of bii"), -IOP( "pcii", B3SOIFD_MOD_PCII, IF_REAL, "Cross-term dependence of cii"), -IOP( "pdii", B3SOIFD_MOD_PDII, IF_REAL, "Cross-term dependence of dii"), -IOP( "palpha0", B3SOIFD_MOD_PALPHA0, IF_REAL, "Cross-term dependence of alpha0"), -IOP( "palpha1", B3SOIFD_MOD_PALPHA1, IF_REAL, "Cross-term dependence of alpha1"), -IOP( "pbeta0", B3SOIFD_MOD_PBETA0, IF_REAL, "Cross-term dependence of beta0"), -IOP( "pagidl", B3SOIFD_MOD_PAGIDL, IF_REAL, "Cross-term dependence of agidl"), -IOP( "pbgidl", B3SOIFD_MOD_PBGIDL, IF_REAL, "Cross-term dependence of bgidl"), -IOP( "pngidl", B3SOIFD_MOD_PNGIDL, IF_REAL, "Cross-term dependence of ngidl"), -IOP( "pntun", B3SOIFD_MOD_PNTUN, IF_REAL, "Cross-term dependence of ntun"), -IOP( "pndiode", B3SOIFD_MOD_PNDIODE, IF_REAL, "Cross-term dependence of ndiode"), -IOP( "pisbjt", B3SOIFD_MOD_PISBJT, IF_REAL, "Cross-term dependence of isbjt"), -IOP( "pisdif", B3SOIFD_MOD_PISDIF, IF_REAL, "Cross-term dependence of isdif"), -IOP( "pisrec", B3SOIFD_MOD_PISREC, IF_REAL, "Cross-term dependence of isrec"), -IOP( "pistun", B3SOIFD_MOD_PISTUN, IF_REAL, "Cross-term dependence of istun"), -IOP( "pedl", B3SOIFD_MOD_PEDL, IF_REAL, "Cross-term dependence of edl"), -IOP( "pkbjt1", B3SOIFD_MOD_PKBJT1, IF_REAL, "Cross-term dependence of kbjt1"), -IOP( "pvsdfb", B3SOIFD_MOD_PVSDFB, IF_REAL, "Cross-term dependence of vsdfb"), -IOP( "pvsdth", B3SOIFD_MOD_PVSDTH, IF_REAL, "Cross-term dependence of vsdth"), -/* Added for binning - END */ - -IP( "nmos", B3SOIFD_MOD_NMOS, IF_FLAG, "Flag to indicate NMOS"), -IP( "pmos", B3SOIFD_MOD_PMOS, IF_FLAG, "Flag to indicate PMOS"), -}; - -char *B3SOIFDnames[] = { - "Drain", - "Gate", - "Source", - "Backgate", - "", - "Body", - "Temp", - "Charge", -}; - -int B3SOIFDnSize = NUMELEMS(B3SOIFDnames); -int B3SOIFDpTSize = NUMELEMS(B3SOIFDpTable); -int B3SOIFDmPTSize = NUMELEMS(B3SOIFDmPTable); -int B3SOIFDiSize = sizeof(B3SOIFDinstance); -int B3SOIFDmSize = sizeof(B3SOIFDmodel); - - diff --git a/src/spicelib/devices/bsim3soi_fd/b3soifdacld.c b/src/spicelib/devices/bsim3soi_fd/b3soifdacld.c deleted file mode 100644 index 27d9aa87c..000000000 --- a/src/spicelib/devices/bsim3soi_fd/b3soifdacld.c +++ /dev/null @@ -1,449 +0,0 @@ -/********** -Copyright 1999 Regents of the University of California. All rights reserved. -Author: Weidong Liu and Pin Su Feb 1999 -Author: 1998 Samuel Fung, Dennis Sinitsky and Stephen Tang -Modified by Pin Su 99/9/27 -Modified by Paolo Nenzi 2002 -File: b3soifdacld.c 98/5/01 -**********/ - -/* - * Revision 2.1 99/9/27 Pin Su - * BSIMFD2.1 release - */ - -#include "ngspice/ngspice.h" -#include "ngspice/cktdefs.h" -#include "b3soifddef.h" -#include "ngspice/sperror.h" -#include "ngspice/suffix.h" - - -int -B3SOIFDacLoad(GENmodel *inModel, CKTcircuit *ckt) -{ -B3SOIFDmodel *model = (B3SOIFDmodel*)inModel; -B3SOIFDinstance *here; -int selfheat; -double xcggb, xcgdb, xcgsb, xcgeb, xcgT; -double xcdgb, xcddb, xcdsb, xcdeb, xcdT; -double xcsgb, xcsdb, xcssb, xcseb, xcsT; -double xcbgb, xcbdb, xcbsb, xcbeb, xcbT; -double xcegb, xcedb, xcesb, xceeb, xceT; -double gdpr, gspr, gds; -double cggb, cgdb, cgsb, cgeb, cgT; -double cdgb, cddb, cdsb, cdeb, cdT; -double cbgb, cbdb, cbsb, cbeb, cbT; -double cegb, cedb, cesb, ceeb, ceT; -double GSoverlapCap, GDoverlapCap, GEoverlapCap, FwdSum, RevSum, Gm, Gmbs, Gme, GmT; -double omega; -double dxpart, sxpart; -double gbbg, gbbdp, gbbb, gbbe, gbbp, gbbsp, gbbT; -double gddpg, gddpdp, gddpsp, gddpb, gddpe, gddpT; -double gsspg, gsspdp, gsspsp, gsspb, gsspe, gsspT; -double gppg, gppdp, gppb, gppe, gppp, gppsp, gppT; -double xcTt, cTt, gTtt, gTtg, gTtb, gTte, gTtdp, gTtsp; - -FILE *fpdebug = NULL; - -double m; - - omega = ckt->CKTomega; - for (; model != NULL; model = B3SOIFDnextModel(model)) - { - - for (here = B3SOIFDinstances(model); here!= NULL; - here = B3SOIFDnextInstance(here)) - { - selfheat = (model->B3SOIFDshMod == 1) && (here->B3SOIFDrth0 != 0.0); - if (here->B3SOIFDdebugMod > 2) - { - fpdebug = fopen("b3soifdac.log", "a"); - fprintf(fpdebug, ".......omega=%.5e\n", omega); - } - if (here->B3SOIFDmode >= 0) - { Gm = here->B3SOIFDgm; - Gmbs = here->B3SOIFDgmbs; - Gme = here->B3SOIFDgme; - GmT = model->B3SOIFDtype * here->B3SOIFDgmT; - FwdSum = Gm + Gmbs + Gme; - RevSum = 0.0; - - cbgb = here->B3SOIFDcbgb; - cbsb = here->B3SOIFDcbsb; - cbdb = here->B3SOIFDcbdb; - cbeb = here->B3SOIFDcbeb; - cbT = model->B3SOIFDtype * here->B3SOIFDcbT; - - cegb = here->B3SOIFDcegb; - cesb = here->B3SOIFDcesb; - cedb = here->B3SOIFDcedb; - ceeb = here->B3SOIFDceeb; - ceT = model->B3SOIFDtype * here->B3SOIFDceT; - - cggb = here->B3SOIFDcggb; - cgsb = here->B3SOIFDcgsb; - cgdb = here->B3SOIFDcgdb; - cgeb = here->B3SOIFDcgeb; - cgT = model->B3SOIFDtype * here->B3SOIFDcgT; - - cdgb = here->B3SOIFDcdgb; - cdsb = here->B3SOIFDcdsb; - cddb = here->B3SOIFDcddb; - cdeb = here->B3SOIFDcdeb; - cdT = model->B3SOIFDtype * here->B3SOIFDcdT; - - cTt = here->pParam->B3SOIFDcth; - - gbbg = -here->B3SOIFDgbgs; - gbbdp = -here->B3SOIFDgbds; - gbbb = -here->B3SOIFDgbbs; - gbbe = -here->B3SOIFDgbes; - gbbp = -here->B3SOIFDgbps; - gbbT = -model->B3SOIFDtype * here->B3SOIFDgbT; - gbbsp = - ( gbbg + gbbdp + gbbb + gbbe + gbbp); - - gddpg = -here->B3SOIFDgjdg; - gddpdp = -here->B3SOIFDgjdd; - gddpb = -here->B3SOIFDgjdb; - gddpe = -here->B3SOIFDgjde; - gddpT = -model->B3SOIFDtype * here->B3SOIFDgjdT; - gddpsp = - ( gddpg + gddpdp + gddpb + gddpe); - - gsspg = -here->B3SOIFDgjsg; - gsspdp = -here->B3SOIFDgjsd; - gsspb = -here->B3SOIFDgjsb; - gsspe = 0.0; - gsspT = -model->B3SOIFDtype * here->B3SOIFDgjsT; - gsspsp = - (gsspg + gsspdp + gsspb + gsspe); - - gppg = -here->B3SOIFDgbpgs; - gppdp = -here->B3SOIFDgbpds; - gppb = -here->B3SOIFDgbpbs; - gppe = -here->B3SOIFDgbpes; - gppp = -here->B3SOIFDgbpps; - gppT = -model->B3SOIFDtype * here->B3SOIFDgbpT; - gppsp = - (gppg + gppdp + gppb + gppe + gppp); - - gTtg = here->B3SOIFDgtempg; - gTtb = here->B3SOIFDgtempb; - gTte = here->B3SOIFDgtempe; - gTtdp = here->B3SOIFDgtempd; - gTtt = here->B3SOIFDgtempT; - gTtsp = - (gTtg + gTtb + gTte + gTtdp); - - sxpart = 0.6; - dxpart = 0.4; - - } - else - { Gm = -here->B3SOIFDgm; - Gmbs = -here->B3SOIFDgmbs; - Gme = -here->B3SOIFDgme; - GmT = -model->B3SOIFDtype * here->B3SOIFDgmT; - FwdSum = 0.0; - RevSum = -Gm - Gmbs - Gme; - - cdgb = - (here->B3SOIFDcdgb + here->B3SOIFDcggb + here->B3SOIFDcbgb - + here->B3SOIFDcegb); - cdsb = - (here->B3SOIFDcddb + here->B3SOIFDcgdb + here->B3SOIFDcbdb - + here->B3SOIFDcedb); - cddb = - (here->B3SOIFDcdsb + here->B3SOIFDcgsb + here->B3SOIFDcbsb - + here->B3SOIFDcesb); - cdeb = - (here->B3SOIFDcdeb + here->B3SOIFDcgeb + here->B3SOIFDcbeb - + here->B3SOIFDceeb); - cdT = - model->B3SOIFDtype * (here->B3SOIFDcgT + here->B3SOIFDcbT - + here->B3SOIFDcdT + here->B3SOIFDceT); - - cegb = here->B3SOIFDcegb; - cesb = here->B3SOIFDcedb; - cedb = here->B3SOIFDcesb; - ceeb = here->B3SOIFDceeb; - ceT = model->B3SOIFDtype * here->B3SOIFDceT; - - cggb = here->B3SOIFDcggb; - cgsb = here->B3SOIFDcgdb; - cgdb = here->B3SOIFDcgsb; - cgeb = here->B3SOIFDcgeb; - cgT = model->B3SOIFDtype * here->B3SOIFDcgT; - - cbgb = here->B3SOIFDcbgb; - cbsb = here->B3SOIFDcbdb; - cbdb = here->B3SOIFDcbsb; - cbeb = here->B3SOIFDcbeb; - cbT = model->B3SOIFDtype * here->B3SOIFDcbT; - - cTt = here->pParam->B3SOIFDcth; - - gbbg = -here->B3SOIFDgbgs; - gbbb = -here->B3SOIFDgbbs; - gbbe = -here->B3SOIFDgbes; - gbbp = -here->B3SOIFDgbps; - gbbsp = -here->B3SOIFDgbds; - gbbT = -model->B3SOIFDtype * here->B3SOIFDgbT; - gbbdp = - ( gbbg + gbbsp + gbbb + gbbe + gbbp); - - gddpg = -here->B3SOIFDgjsg; - gddpsp = -here->B3SOIFDgjsd; - gddpb = -here->B3SOIFDgjsb; - gddpe = 0.0; - gddpT = -model->B3SOIFDtype * here->B3SOIFDgjsT; - gddpdp = - (gddpg + gddpsp + gddpb + gddpe); - - gsspg = -here->B3SOIFDgjdg; - gsspsp = -here->B3SOIFDgjdd; - gsspb = -here->B3SOIFDgjdb; - gsspe = -here->B3SOIFDgjde; - gsspT = -model->B3SOIFDtype * here->B3SOIFDgjdT; - gsspdp = - ( gsspg + gsspsp + gsspb + gsspe); - - gppg = -here->B3SOIFDgbpgs; - gppsp = -here->B3SOIFDgbpds; - gppb = -here->B3SOIFDgbpbs; - gppe = -here->B3SOIFDgbpes; - gppp = -here->B3SOIFDgbpps; - gppT = -model->B3SOIFDtype * here->B3SOIFDgbpT; - gppdp = - (gppg + gppsp + gppb + gppe + gppp); - - gTtt = here->B3SOIFDgtempT; - gTtg = here->B3SOIFDgtempg; - gTtb = here->B3SOIFDgtempb; - gTte = here->B3SOIFDgtempe; - gTtdp = here->B3SOIFDgtempd; - gTtsp = - (gTtt + gTtg + gTtb + gTte + gTtdp); - - gTtg = here->B3SOIFDgtempg; - gTtb = here->B3SOIFDgtempb; - gTte = here->B3SOIFDgtempe; - gTtsp = here->B3SOIFDgtempd; - gTtt = here->B3SOIFDgtempT; - gTtdp = - (gTtg + gTtb + gTte + gTtsp); - - sxpart = 0.6; - sxpart = 0.4; - dxpart = 0.6; - } - - gdpr=here->B3SOIFDdrainConductance; - gspr=here->B3SOIFDsourceConductance; - gds= here->B3SOIFDgds; - - GSoverlapCap = here->B3SOIFDcgso; - GDoverlapCap = here->B3SOIFDcgdo; - GEoverlapCap = here->pParam->B3SOIFDcgeo; - - xcegb = (cegb - GEoverlapCap) * omega; - xcedb = cedb * omega; - xcesb = cesb * omega; - xceeb = (ceeb + GEoverlapCap) * omega; - xceT = ceT * omega; - - xcggb = (cggb + GDoverlapCap + GSoverlapCap + GEoverlapCap) - * omega; - xcgdb = (cgdb - GDoverlapCap ) * omega; - xcgsb = (cgsb - GSoverlapCap) * omega; - xcgeb = (cgeb - GEoverlapCap) * omega; - xcgT = cgT * omega; - - xcdgb = (cdgb - GDoverlapCap) * omega; - xcddb = (cddb + GDoverlapCap) * omega; - xcdsb = cdsb * omega; - xcdeb = cdeb * omega; - xcdT = cdT * omega; - - xcsgb = -(cggb + cbgb + cdgb + cegb + GSoverlapCap) * omega; - xcsdb = -(cgdb + cbdb + cddb + cedb) * omega; - xcssb = (GSoverlapCap - (cgsb + cbsb + cdsb + cesb)) * omega; - xcseb = -(cgeb + cbeb + cdeb + ceeb) * omega; - xcsT = -(cgT + cbT + cdT + ceT) * omega; - - xcbgb = cbgb * omega; - xcbdb = cbdb * omega; - xcbsb = cbsb * omega; - xcbeb = cbeb * omega; - xcbT = cbT * omega; - - xcTt = cTt * omega; - - m = here->B3SOIFDm; - - *(here->B3SOIFDEgPtr +1) += m * xcegb; - *(here->B3SOIFDEdpPtr +1) += m * xcedb; - *(here->B3SOIFDEspPtr +1) += m * xcesb; - *(here->B3SOIFDGePtr +1) += m * xcgeb; - *(here->B3SOIFDDPePtr +1) += m * xcdeb; - *(here->B3SOIFDSPePtr +1) += m * xcseb; - - *(here->B3SOIFDEePtr +1) += m * xceeb; - - *(here->B3SOIFDGgPtr +1) += m * xcggb; - *(here->B3SOIFDGdpPtr +1) += m * xcgdb; - *(here->B3SOIFDGspPtr +1) += m * xcgsb; - - *(here->B3SOIFDDPgPtr +1) += m * xcdgb; - *(here->B3SOIFDDPdpPtr +1) += m * xcddb; - *(here->B3SOIFDDPspPtr +1) += m * xcdsb; - - *(here->B3SOIFDSPgPtr +1) += m * xcsgb; - *(here->B3SOIFDSPdpPtr +1) += m * xcsdb; - *(here->B3SOIFDSPspPtr +1) += m * xcssb; - - if (selfheat) - { - *(here->B3SOIFDTemptempPtr + 1) += m * xcTt; - *(here->B3SOIFDDPtempPtr + 1) += m * xcdT; - *(here->B3SOIFDSPtempPtr + 1) += m * xcsT; - *(here->B3SOIFDBtempPtr + 1) += m * xcbT; - *(here->B3SOIFDEtempPtr + 1) += m * xceT; - *(here->B3SOIFDGtempPtr + 1) += m * xcgT; - } - - -if (here->B3SOIFDdebugMod > 3) -{ -fprintf(fpdebug, "Cbg+Cbs+Cbe = %.5e; Cbd = %.5e;\n", -(xcbgb+xcbsb+xcbeb)/omega, xcbdb/omega); -fprintf(fpdebug, "gbs = %.5e; gbd = %.5e\n", gbbsp, gbbdp); - - - fprintf(fpdebug, "AC condunctance...\n"); - fprintf(fpdebug, "Eg=%.5e; Edp=%.5e; Esp=%.5e;\nEb=%.5e; Ee=%.5e\n", -xcegb, xcedb, xcesb, -(xcegb+xcedb+xcesb+xceeb), xceeb); - fprintf(fpdebug, "Gg=%.5e; Gdp=%.5e; Gsp=%.5e;\nGb=%.5e; Ge=%.5e\n", -xcggb, xcgdb, xcgsb, -(xcggb+xcgdb+xcgsb+xcgeb), xcgeb); - fprintf(fpdebug, "Bg=%.5e; Bdp=%.5e; Bsp=%.5e;\nBb=%.5e; Be=%.5e\n", -xcbgb, xcbdb, xcbsb, -(xcbgb+xcbdb+xcbsb+xcbeb), xcbeb); - fprintf(fpdebug, "DPg=%.5e; DPdp=%.5e; DPsp=%.5e;\nDPb=%.5e; DPe=%.5e\n", -xcdgb, xcddb, xcdsb, -(xcdgb+xcddb+xcdsb+xcdeb), xcdeb); - fprintf(fpdebug, "SPg=%.5e; SPdp=%.5e; SPsp=%.5e;\nSPb=%.5e; SPe=%.5e\n", -xcsgb, xcsdb, xcssb, -(xcsgb+xcsdb+xcssb+xcseb), xcseb); -} - - - - *(here->B3SOIFDEgPtr) += 0.0; - *(here->B3SOIFDEdpPtr) += 0.0; - *(here->B3SOIFDEspPtr) += 0.0; - *(here->B3SOIFDGePtr) -= 0.0; - *(here->B3SOIFDDPePtr) += m * (Gme + gddpe); - *(here->B3SOIFDSPePtr) += m * (gsspe - Gme); - - *(here->B3SOIFDEePtr) += 0.0; - - *(here->B3SOIFDDPgPtr) += m * (Gm + gddpg); - *(here->B3SOIFDDPdpPtr) += m * (gdpr + gds + gddpdp + RevSum); - *(here->B3SOIFDDPspPtr) -= m * (gds + FwdSum - gddpsp); - *(here->B3SOIFDDPdPtr) -= m * gdpr; - - *(here->B3SOIFDSPgPtr) -= m * (Gm - gsspg); - *(here->B3SOIFDSPdpPtr) -= m * (gds + RevSum - gsspdp); - *(here->B3SOIFDSPspPtr) += m * (gspr + gds + FwdSum + gsspsp); - *(here->B3SOIFDSPsPtr) -= m * gspr; - - if (selfheat) - { - *(here->B3SOIFDDPtempPtr) += m * (GmT + gddpT); - *(here->B3SOIFDSPtempPtr) += m * (-GmT + gsspT); - *(here->B3SOIFDBtempPtr) += m * gbbT; - if (here->B3SOIFDbodyMod == 1) { - (*(here->B3SOIFDPtempPtr) += m * gppT); - } - - *(here->B3SOIFDTemptempPtr) += m * (gTtt + 1/here->pParam->B3SOIFDrth); - *(here->B3SOIFDTempgPtr) += m * gTtg; - *(here->B3SOIFDTempbPtr) += m * gTtb; - *(here->B3SOIFDTempePtr) += m * gTte; - *(here->B3SOIFDTempdpPtr) += m * gTtdp; - *(here->B3SOIFDTempspPtr) += m * gTtsp; - } - -if (here->B3SOIFDdebugMod > 3) -{ - fprintf(fpdebug, "Static condunctance...\n"); - fprintf(fpdebug, "Gg=%.5e; Gdp=%.5e; Gsp=%.5e;\nGb=%.5e; Ge=%.5e\n", - *(here->B3SOIFDGgPtr), *(here->B3SOIFDGdpPtr), - *(here->B3SOIFDGspPtr), *(here->B3SOIFDGbPtr), - *(here->B3SOIFDGePtr)); - fprintf(fpdebug, "DPg=%.5e; DPdp=%.5e; DPsp=%.5e;\nDPb=%.5e; DPe=%.5e\n", - *(here->B3SOIFDDPgPtr), *(here->B3SOIFDDPdpPtr), - *(here->B3SOIFDDPspPtr), *(here->B3SOIFDDPbPtr), - *(here->B3SOIFDDPePtr)); - fprintf(fpdebug, "SPg=%.5e; SPdp=%.5e; SPsp=%.5e;\nSPb=%.5e; SPe=%.5e\n", - *(here->B3SOIFDSPgPtr), *(here->B3SOIFDSPdpPtr), - *(here->B3SOIFDSPspPtr), *(here->B3SOIFDSPbPtr), - *(here->B3SOIFDSPePtr)); - fprintf(fpdebug, "Bg=%.5e; Bdp=%.5e; Bsp=%.5e;\nBb=%.5e; Be=%.5e\n", -gbbg, gbbdp, gbbsp, gbbb, gbbe); -} - - *(here->B3SOIFDDdPtr) += m * gdpr; - *(here->B3SOIFDDdpPtr) -= m * gdpr; - *(here->B3SOIFDSsPtr) += m * gspr; - *(here->B3SOIFDSspPtr) -= m * gspr; - - - if (here->B3SOIFDbodyMod == 1) { - (*(here->B3SOIFDBpPtr) -= m * gppp); - (*(here->B3SOIFDPbPtr) += m * gppb); - (*(here->B3SOIFDPpPtr) += m * gppp); - (*(here->B3SOIFDPgPtr) += m * gppg); - (*(here->B3SOIFDPdpPtr) += m * gppdp); - (*(here->B3SOIFDPspPtr) += m * gppsp); - (*(here->B3SOIFDPePtr) += m * gppe); - } - if (here->B3SOIFDdebugMod > 1) - { - *(here->B3SOIFDVbsPtr) += m * 1; - *(here->B3SOIFDIdsPtr) += m * 1; - *(here->B3SOIFDIcPtr) += m * 1; - *(here->B3SOIFDIbsPtr) += m * 1; - *(here->B3SOIFDIbdPtr) += m * 1; - *(here->B3SOIFDIiiPtr) += m * 1; - *(here->B3SOIFDIgidlPtr) += m * 1; - *(here->B3SOIFDItunPtr) += m * 1; - *(here->B3SOIFDIbpPtr) += m * 1; - *(here->B3SOIFDAbeffPtr) += m * 1; - *(here->B3SOIFDVbs0effPtr) += m * 1; - *(here->B3SOIFDVbseffPtr) += m * 1; - *(here->B3SOIFDXcPtr) += m * 1; - *(here->B3SOIFDCbgPtr) += m * 1; - *(here->B3SOIFDCbbPtr) += m * 1; - *(here->B3SOIFDCbdPtr) += m * 1; - *(here->B3SOIFDqbPtr) += m * 1; - *(here->B3SOIFDQbfPtr) += m * 1; - *(here->B3SOIFDQjsPtr) += m * 1; - *(here->B3SOIFDQjdPtr) += m * 1; - - /* clean up last */ - *(here->B3SOIFDGmPtr) += m * 1; - *(here->B3SOIFDGmbsPtr) += m * 1; - *(here->B3SOIFDGdsPtr) += m * 1; - *(here->B3SOIFDGmePtr) += m * 1; - *(here->B3SOIFDVbs0teffPtr) += m * 1; - *(here->B3SOIFDVgsteffPtr) += m * 1; - *(here->B3SOIFDCbePtr) += m * 1; - *(here->B3SOIFDVthPtr) += m * 1; - *(here->B3SOIFDXcsatPtr) += m * 1; - *(here->B3SOIFDVdscvPtr) += m * 1; - *(here->B3SOIFDVcscvPtr) += m * 1; - *(here->B3SOIFDQaccPtr) += m * 1; - *(here->B3SOIFDQsub0Ptr) += m * 1; - *(here->B3SOIFDQsubs1Ptr) += m * 1; - *(here->B3SOIFDQsubs2Ptr) += m * 1; - *(here->B3SOIFDqgPtr) += m * 1; - *(here->B3SOIFDqdPtr) += m * 1; - *(here->B3SOIFDqePtr) += m * 1; - *(here->B3SOIFDDum1Ptr) += m * 1; - *(here->B3SOIFDDum2Ptr) += m * 1; - *(here->B3SOIFDDum3Ptr) += m * 1; - *(here->B3SOIFDDum4Ptr) += m * 1; - *(here->B3SOIFDDum5Ptr) += m * 1; - } - - if (here->B3SOIFDdebugMod > 2) - fclose(fpdebug); - } - } - return(OK); -} - diff --git a/src/spicelib/devices/bsim3soi_fd/b3soifdask.c b/src/spicelib/devices/bsim3soi_fd/b3soifdask.c deleted file mode 100644 index 87e1e3db2..000000000 --- a/src/spicelib/devices/bsim3soi_fd/b3soifdask.c +++ /dev/null @@ -1,247 +0,0 @@ -/********** -Copyright 1999 Regents of the University of California. All rights reserved. -Author: 1998 Samuel Fung, Dennis Sinitsky and Stephen Tang -Modified by Paolo Nenzi 2002 -File: b3soifdask.c 98/5/01 -**********/ - -/* - * Revision 2.1 99/9/27 Pin Su - * BSIMFD2.1 release - */ - -#include "ngspice/ngspice.h" -#include "ngspice/ifsim.h" -#include "ngspice/cktdefs.h" -#include "ngspice/devdefs.h" -#include "b3soifddef.h" -#include "ngspice/sperror.h" -#include "ngspice/suffix.h" - -int -B3SOIFDask(CKTcircuit *ckt, GENinstance *inst, int which, IFvalue *value, - IFvalue *select) -{ -B3SOIFDinstance *here = (B3SOIFDinstance*)inst; - - NG_IGNORE(select); - - switch(which) - { case B3SOIFD_L: - value->rValue = here->B3SOIFDl; - return(OK); - case B3SOIFD_W: - value->rValue = here->B3SOIFDw; - return(OK); - case B3SOIFD_M: - value->rValue = here->B3SOIFDm; - return(OK); - case B3SOIFD_AS: - value->rValue = here->B3SOIFDsourceArea; - return(OK); - case B3SOIFD_AD: - value->rValue = here->B3SOIFDdrainArea; - return(OK); - case B3SOIFD_PS: - value->rValue = here->B3SOIFDsourcePerimeter; - return(OK); - case B3SOIFD_PD: - value->rValue = here->B3SOIFDdrainPerimeter; - return(OK); - case B3SOIFD_NRS: - value->rValue = here->B3SOIFDsourceSquares; - return(OK); - case B3SOIFD_NRD: - value->rValue = here->B3SOIFDdrainSquares; - return(OK); - case B3SOIFD_OFF: - value->rValue = here->B3SOIFDoff; - return(OK); - case B3SOIFD_BJTOFF: - value->iValue = here->B3SOIFDbjtoff; - return(OK); - case B3SOIFD_RTH0: - value->rValue = here->B3SOIFDrth0; - value->rValue /= here->B3SOIFDm; - return(OK); - case B3SOIFD_CTH0: - value->rValue = here->B3SOIFDcth0; - value->rValue *= here->B3SOIFDm; - return(OK); - case B3SOIFD_NRB: - value->rValue = here->B3SOIFDbodySquares; - return(OK); - case B3SOIFD_IC_VBS: - value->rValue = here->B3SOIFDicVBS; - return(OK); - case B3SOIFD_IC_VDS: - value->rValue = here->B3SOIFDicVDS; - return(OK); - case B3SOIFD_IC_VGS: - value->rValue = here->B3SOIFDicVGS; - return(OK); - case B3SOIFD_IC_VES: - value->rValue = here->B3SOIFDicVES; - return(OK); - case B3SOIFD_IC_VPS: - value->rValue = here->B3SOIFDicVPS; - return(OK); - case B3SOIFD_DNODE: - value->iValue = here->B3SOIFDdNode; - return(OK); - case B3SOIFD_GNODE: - value->iValue = here->B3SOIFDgNode; - return(OK); - case B3SOIFD_SNODE: - value->iValue = here->B3SOIFDsNode; - return(OK); - case B3SOIFD_BNODE: - value->iValue = here->B3SOIFDbNode; - return(OK); - case B3SOIFD_ENODE: - value->iValue = here->B3SOIFDeNode; - return(OK); - case B3SOIFD_DNODEPRIME: - value->iValue = here->B3SOIFDdNodePrime; - return(OK); - case B3SOIFD_SNODEPRIME: - value->iValue = here->B3SOIFDsNodePrime; - return(OK); - case B3SOIFD_SOURCECONDUCT: - value->rValue = here->B3SOIFDsourceConductance; - value->rValue *= here->B3SOIFDm; - return(OK); - case B3SOIFD_DRAINCONDUCT: - value->rValue = here->B3SOIFDdrainConductance; - value->rValue *= here->B3SOIFDm; - return(OK); - case B3SOIFD_VBD: - value->rValue = *(ckt->CKTstate0 + here->B3SOIFDvbd); - return(OK); - case B3SOIFD_VBS: - value->rValue = *(ckt->CKTstate0 + here->B3SOIFDvbs); - return(OK); - case B3SOIFD_VGS: - value->rValue = *(ckt->CKTstate0 + here->B3SOIFDvgs); - return(OK); - case B3SOIFD_VES: - value->rValue = *(ckt->CKTstate0 + here->B3SOIFDves); - return(OK); - case B3SOIFD_VDS: - value->rValue = *(ckt->CKTstate0 + here->B3SOIFDvds); - return(OK); - case B3SOIFD_CD: - value->rValue = here->B3SOIFDcd; - value->rValue *= here->B3SOIFDm; - return(OK); - case B3SOIFD_CBS: - value->rValue = here->B3SOIFDcjs; - value->rValue *= here->B3SOIFDm; - return(OK); - case B3SOIFD_CBD: - value->rValue = here->B3SOIFDcjd; - value->rValue *= here->B3SOIFDm; - return(OK); - case B3SOIFD_GM: - value->rValue = here->B3SOIFDgm; - value->rValue *= here->B3SOIFDm; - return(OK); - case B3SOIFD_GMID: - value->rValue = here->B3SOIFDgm/here->B3SOIFDcd; - return(OK); - case B3SOIFD_GDS: - value->rValue = here->B3SOIFDgds; - value->rValue *= here->B3SOIFDm; - return(OK); - case B3SOIFD_GMBS: - value->rValue = here->B3SOIFDgmbs; - value->rValue *= here->B3SOIFDm; - return(OK); - case B3SOIFD_GBD: - value->rValue = here->B3SOIFDgjdb; - value->rValue *= here->B3SOIFDm; - return(OK); - case B3SOIFD_GBS: - value->rValue = here->B3SOIFDgjsb; - value->rValue *= here->B3SOIFDm; - return(OK); - case B3SOIFD_QB: - value->rValue = *(ckt->CKTstate0 + here->B3SOIFDqb); - value->rValue *= here->B3SOIFDm; - return(OK); - case B3SOIFD_CQB: - value->rValue = *(ckt->CKTstate0 + here->B3SOIFDcqb); - value->rValue *= here->B3SOIFDm; - return(OK); - case B3SOIFD_QG: - value->rValue = *(ckt->CKTstate0 + here->B3SOIFDqg); - value->rValue *= here->B3SOIFDm; - return(OK); - case B3SOIFD_CQG: - value->rValue = *(ckt->CKTstate0 + here->B3SOIFDcqg); - value->rValue *= here->B3SOIFDm; - return(OK); - case B3SOIFD_QD: - value->rValue = *(ckt->CKTstate0 + here->B3SOIFDqd); - value->rValue *= here->B3SOIFDm; - return(OK); - case B3SOIFD_CQD: - value->rValue = *(ckt->CKTstate0 + here->B3SOIFDcqd); - value->rValue *= here->B3SOIFDm; - return(OK); - case B3SOIFD_CGG: - value->rValue = here->B3SOIFDcggb; - value->rValue *= here->B3SOIFDm; - return(OK); - case B3SOIFD_CGD: - value->rValue = here->B3SOIFDcgdb; - value->rValue *= here->B3SOIFDm; - return(OK); - case B3SOIFD_CGS: - value->rValue = here->B3SOIFDcgsb; - value->rValue *= here->B3SOIFDm; - return(OK); - case B3SOIFD_CDG: - value->rValue = here->B3SOIFDcdgb; - value->rValue *= here->B3SOIFDm; - return(OK); - case B3SOIFD_CDD: - value->rValue = here->B3SOIFDcddb; - value->rValue *= here->B3SOIFDm; - return(OK); - case B3SOIFD_CDS: - value->rValue = here->B3SOIFDcdsb; - value->rValue *= here->B3SOIFDm; - return(OK); - case B3SOIFD_CBG: - value->rValue = here->B3SOIFDcbgb; - value->rValue *= here->B3SOIFDm; - return(OK); - case B3SOIFD_CBDB: - value->rValue = here->B3SOIFDcbdb; - value->rValue *= here->B3SOIFDm; - return(OK); - case B3SOIFD_CBSB: - value->rValue = here->B3SOIFDcbsb; - value->rValue *= here->B3SOIFDm; - return(OK); - case B3SOIFD_VON: - value->rValue = here->B3SOIFDvon; - return(OK); - case B3SOIFD_VDSAT: - value->rValue = here->B3SOIFDvdsat; - return(OK); - case B3SOIFD_QBS: - value->rValue = *(ckt->CKTstate0 + here->B3SOIFDqbs); - value->rValue *= here->B3SOIFDm; - return(OK); - case B3SOIFD_QBD: - value->rValue = *(ckt->CKTstate0 + here->B3SOIFDqbd); - value->rValue *= here->B3SOIFDm; - return(OK); - default: - return(E_BADPARM); - } - /* NOTREACHED */ -} - diff --git a/src/spicelib/devices/bsim3soi_fd/b3soifdcheck.c b/src/spicelib/devices/bsim3soi_fd/b3soifdcheck.c deleted file mode 100644 index 797557274..000000000 --- a/src/spicelib/devices/bsim3soi_fd/b3soifdcheck.c +++ /dev/null @@ -1,507 +0,0 @@ -/********** -Copyright 1999 Regents of the University of California. All rights reserved. -Author: 1998 Samuel Fung, Dennis Sinitsky and Stephen Tang -Modified by Paolo Nenzi 2002 -File: b3soifdcheck.c 98/5/01 -**********/ - -/* - * Revision 2.1 99/9/27 Pin Su - * BSIMFD2.1 release - */ - -#include "ngspice/ngspice.h" -#include "ngspice/cktdefs.h" -#include "b3soifddef.h" -#include "ngspice/trandefs.h" -#include "ngspice/const.h" -#include "ngspice/sperror.h" -#include "ngspice/devdefs.h" -#include "ngspice/suffix.h" - -int -B3SOIFDcheckModel(B3SOIFDmodel *model, B3SOIFDinstance *here, CKTcircuit *ckt) -{ -struct b3soifdSizeDependParam *pParam; -int Fatal_Flag = 0; -FILE *fplog; - - NG_IGNORE(ckt); - - if ((fplog = fopen("b3soifdv2check.log", "w")) != NULL) - { pParam = here->pParam; - fprintf(fplog, "B3SOI (FD) Version 2.1 Parameter Check\n"); - fprintf(fplog, "Model = %s\n", model->B3SOIFDmodName); - fprintf(fplog, "W = %g, L = %g M = %g\n", here->B3SOIFDw, - here->B3SOIFDl, here->B3SOIFDm); - - - if (pParam->B3SOIFDnlx < -pParam->B3SOIFDleff) - { fprintf(fplog, "Fatal: Nlx = %g is less than -Leff.\n", - pParam->B3SOIFDnlx); - printf("Fatal: Nlx = %g is less than -Leff.\n", - pParam->B3SOIFDnlx); - Fatal_Flag = 1; - } - - if (model->B3SOIFDtox <= 0.0) - { fprintf(fplog, "Fatal: Tox = %g is not positive.\n", - model->B3SOIFDtox); - printf("Fatal: Tox = %g is not positive.\n", model->B3SOIFDtox); - Fatal_Flag = 1; - } - - if (model->B3SOIFDtbox <= 0.0) - { fprintf(fplog, "Fatal: Tbox = %g is not positive.\n", - model->B3SOIFDtbox); - printf("Fatal: Tbox = %g is not positive.\n", model->B3SOIFDtbox); - Fatal_Flag = 1; - } - - if (pParam->B3SOIFDnpeak <= 0.0) - { fprintf(fplog, "Fatal: Nch = %g is not positive.\n", - pParam->B3SOIFDnpeak); - printf("Fatal: Nch = %g is not positive.\n", - pParam->B3SOIFDnpeak); - Fatal_Flag = 1; - } - if (pParam->B3SOIFDngate < 0.0) - { fprintf(fplog, "Fatal: Ngate = %g is not positive.\n", - pParam->B3SOIFDngate); - printf("Fatal: Ngate = %g Ngate is not positive.\n", - pParam->B3SOIFDngate); - Fatal_Flag = 1; - } - if (pParam->B3SOIFDngate > 1.e25) - { fprintf(fplog, "Fatal: Ngate = %g is too high.\n", - pParam->B3SOIFDngate); - printf("Fatal: Ngate = %g Ngate is too high\n", - pParam->B3SOIFDngate); - Fatal_Flag = 1; - } - - if (model->B3SOIFDdvbd1 < 0.0) - { fprintf(fplog, "Fatal: Dvbd1 = %g is negative.\n", - model->B3SOIFDdvbd1); - printf("Fatal: Dvbd1 = %g is negative.\n", model->B3SOIFDdvbd1); - Fatal_Flag = 1; - } - - if (pParam->B3SOIFDdvt1 < 0.0) - { fprintf(fplog, "Fatal: Dvt1 = %g is negative.\n", - pParam->B3SOIFDdvt1); - printf("Fatal: Dvt1 = %g is negative.\n", pParam->B3SOIFDdvt1); - Fatal_Flag = 1; - } - - if (pParam->B3SOIFDdvt1w < 0.0) - { fprintf(fplog, "Fatal: Dvt1w = %g is negative.\n", - pParam->B3SOIFDdvt1w); - printf("Fatal: Dvt1w = %g is negative.\n", pParam->B3SOIFDdvt1w); - Fatal_Flag = 1; - } - - if (pParam->B3SOIFDw0 == -pParam->B3SOIFDweff) - { fprintf(fplog, "Fatal: (W0 + Weff) = 0 cauing divided-by-zero.\n"); - printf("Fatal: (W0 + Weff) = 0 cauing divided-by-zero.\n"); - Fatal_Flag = 1; - } - - if (pParam->B3SOIFDdsub < 0.0) - { fprintf(fplog, "Fatal: Dsub = %g is negative.\n", pParam->B3SOIFDdsub); - printf("Fatal: Dsub = %g is negative.\n", pParam->B3SOIFDdsub); - Fatal_Flag = 1; - } - if (pParam->B3SOIFDb1 == -pParam->B3SOIFDweff) - { fprintf(fplog, "Fatal: (B1 + Weff) = 0 causing divided-by-zero.\n"); - printf("Fatal: (B1 + Weff) = 0 causing divided-by-zero.\n"); - Fatal_Flag = 1; - } - if (pParam->B3SOIFDu0temp <= 0.0) - { fprintf(fplog, "Fatal: u0 at current temperature = %g is not positive.\n", pParam->B3SOIFDu0temp); - printf("Fatal: u0 at current temperature = %g is not positive.\n", - pParam->B3SOIFDu0temp); - Fatal_Flag = 1; - } - -/* Check delta parameter */ - if (pParam->B3SOIFDdelta < 0.0) - { fprintf(fplog, "Fatal: Delta = %g is less than zero.\n", - pParam->B3SOIFDdelta); - printf("Fatal: Delta = %g is less than zero.\n", pParam->B3SOIFDdelta); - Fatal_Flag = 1; - } - - if (pParam->B3SOIFDvsattemp <= 0.0) - { fprintf(fplog, "Fatal: Vsat at current temperature = %g is not positive.\n", pParam->B3SOIFDvsattemp); - printf("Fatal: Vsat at current temperature = %g is not positive.\n", - pParam->B3SOIFDvsattemp); - Fatal_Flag = 1; - } -/* Check Rout parameters */ - if (pParam->B3SOIFDpclm <= 0.0) - { fprintf(fplog, "Fatal: Pclm = %g is not positive.\n", pParam->B3SOIFDpclm); - printf("Fatal: Pclm = %g is not positive.\n", pParam->B3SOIFDpclm); - Fatal_Flag = 1; - } - - if (pParam->B3SOIFDdrout < 0.0) - { fprintf(fplog, "Fatal: Drout = %g is negative.\n", pParam->B3SOIFDdrout); - printf("Fatal: Drout = %g is negative.\n", pParam->B3SOIFDdrout); - Fatal_Flag = 1; - } - if ( model->B3SOIFDunitLengthGateSidewallJctCap > 0.0) - { - if (here->B3SOIFDdrainPerimeter < pParam->B3SOIFDweff) - { fprintf(fplog, "Warning: Pd = %g is less than W.\n", - here->B3SOIFDdrainPerimeter); - printf("Warning: Pd = %g is less than W.\n", - here->B3SOIFDdrainPerimeter); - here->B3SOIFDdrainPerimeter =pParam->B3SOIFDweff; - } - if (here->B3SOIFDsourcePerimeter < pParam->B3SOIFDweff) - { fprintf(fplog, "Warning: Ps = %g is less than W.\n", - here->B3SOIFDsourcePerimeter); - printf("Warning: Ps = %g is less than W.\n", - here->B3SOIFDsourcePerimeter); - here->B3SOIFDsourcePerimeter =pParam->B3SOIFDweff; - } - } -/* Check capacitance parameters */ - if (pParam->B3SOIFDclc < 0.0) - { fprintf(fplog, "Fatal: Clc = %g is negative.\n", pParam->B3SOIFDclc); - printf("Fatal: Clc = %g is negative.\n", pParam->B3SOIFDclc); - Fatal_Flag = 1; - } - if (model->B3SOIFDparamChk ==1) - { -/* Check L and W parameters */ - if (pParam->B3SOIFDleff <= 5.0e-8) - { fprintf(fplog, "Warning: Leff = %g may be too small.\n", - pParam->B3SOIFDleff); - printf("Warning: Leff = %g may be too small.\n", - pParam->B3SOIFDleff); - } - - if (pParam->B3SOIFDleffCV <= 5.0e-8) - { fprintf(fplog, "Warning: Leff for CV = %g may be too small.\n", - pParam->B3SOIFDleffCV); - printf("Warning: Leff for CV = %g may be too small.\n", - pParam->B3SOIFDleffCV); - } - - if (pParam->B3SOIFDweff <= 1.0e-7) - { fprintf(fplog, "Warning: Weff = %g may be too small.\n", - pParam->B3SOIFDweff); - printf("Warning: Weff = %g may be too small.\n", - pParam->B3SOIFDweff); - } - - if (pParam->B3SOIFDweffCV <= 1.0e-7) - { fprintf(fplog, "Warning: Weff for CV = %g may be too small.\n", - pParam->B3SOIFDweffCV); - printf("Warning: Weff for CV = %g may be too small.\n", - pParam->B3SOIFDweffCV); - } - -/* Check threshold voltage parameters */ - if (pParam->B3SOIFDnlx < 0.0) - { fprintf(fplog, "Warning: Nlx = %g is negative.\n", pParam->B3SOIFDnlx); - printf("Warning: Nlx = %g is negative.\n", pParam->B3SOIFDnlx); - } - if (model->B3SOIFDtox < 1.0e-9) - { fprintf(fplog, "Warning: Tox = %g is less than 10A.\n", - model->B3SOIFDtox); - printf("Warning: Tox = %g is less than 10A.\n", model->B3SOIFDtox); - } - - if (pParam->B3SOIFDnpeak <= 1.0e15) - { fprintf(fplog, "Warning: Nch = %g may be too small.\n", - pParam->B3SOIFDnpeak); - printf("Warning: Nch = %g may be too small.\n", - pParam->B3SOIFDnpeak); - } - else if (pParam->B3SOIFDnpeak >= 1.0e21) - { fprintf(fplog, "Warning: Nch = %g may be too large.\n", - pParam->B3SOIFDnpeak); - printf("Warning: Nch = %g may be too large.\n", - pParam->B3SOIFDnpeak); - } - - if (fabs(pParam->B3SOIFDnsub) >= 1.0e21) - { fprintf(fplog, "Warning: Nsub = %g may be too large.\n", - pParam->B3SOIFDnsub); - printf("Warning: Nsub = %g may be too large.\n", - pParam->B3SOIFDnsub); - } - - if ((pParam->B3SOIFDngate > 0.0) && - (pParam->B3SOIFDngate <= 1.e18)) - { fprintf(fplog, "Warning: Ngate = %g is less than 1.E18cm^-3.\n", - pParam->B3SOIFDngate); - printf("Warning: Ngate = %g is less than 1.E18cm^-3.\n", - pParam->B3SOIFDngate); - } - - if (model->B3SOIFDdvbd0 < 0.0) - { fprintf(fplog, "Warning: Dvbd0 = %g is negative.\n", - model->B3SOIFDdvbd0); - printf("Warning: Dvbd0 = %g is negative.\n", model->B3SOIFDdvbd0); - } - - if (pParam->B3SOIFDdvt0 < 0.0) - { fprintf(fplog, "Warning: Dvt0 = %g is negative.\n", - pParam->B3SOIFDdvt0); - printf("Warning: Dvt0 = %g is negative.\n", pParam->B3SOIFDdvt0); - } - - if (fabs(1.0e-6 / (pParam->B3SOIFDw0 + pParam->B3SOIFDweff)) > 10.0) - { fprintf(fplog, "Warning: (W0 + Weff) may be too small.\n"); - printf("Warning: (W0 + Weff) may be too small.\n"); - } - -/* Check subthreshold parameters */ - if (pParam->B3SOIFDnfactor < 0.0) - { fprintf(fplog, "Warning: Nfactor = %g is negative.\n", - pParam->B3SOIFDnfactor); - printf("Warning: Nfactor = %g is negative.\n", pParam->B3SOIFDnfactor); - } - if (model->B3SOIFDkb3 < 0.0) - { fprintf(fplog, "Warning: Kb3 = %g is negative.\n", - model->B3SOIFDkb3); - printf("Warning: Kb3 = %g is negative.\n", model->B3SOIFDkb3); - } - - if (pParam->B3SOIFDcdsc < 0.0) - { fprintf(fplog, "Warning: Cdsc = %g is negative.\n", - pParam->B3SOIFDcdsc); - printf("Warning: Cdsc = %g is negative.\n", pParam->B3SOIFDcdsc); - } - if (pParam->B3SOIFDcdscd < 0.0) - { fprintf(fplog, "Warning: Cdscd = %g is negative.\n", - pParam->B3SOIFDcdscd); - printf("Warning: Cdscd = %g is negative.\n", pParam->B3SOIFDcdscd); - } -/* Check DIBL parameters */ - if (pParam->B3SOIFDeta0 < 0.0) - { fprintf(fplog, "Warning: Eta0 = %g is negative.\n", - pParam->B3SOIFDeta0); - printf("Warning: Eta0 = %g is negative.\n", pParam->B3SOIFDeta0); - } - -/* Check Abulk parameters */ - if (fabs(1.0e-6 / (pParam->B3SOIFDb1 + pParam->B3SOIFDweff)) > 10.0) - { fprintf(fplog, "Warning: (B1 + Weff) may be too small.\n"); - printf("Warning: (B1 + Weff) may be too small.\n"); - } - - if (model->B3SOIFDadice0 > 1.0) - { fprintf(fplog, "Warning: Adice0 = %g should be smaller than 1.\n", - model->B3SOIFDadice0); - printf("Warning: Adice0 = %g should be smaller than 1.\n", model->B3SOIFDadice0); - } - - if (model->B3SOIFDabp < 0.2) - { fprintf(fplog, "Warning: Abp = %g is too small.\n", - model->B3SOIFDabp); - printf("Warning: Abp = %g is too small.\n", model->B3SOIFDabp); - } - - if ((model->B3SOIFDmxc < -1.0) || (model->B3SOIFDmxc > 1.0)) - { fprintf(fplog, "Warning: Mxc = %g should be within (-1, 1).\n", - model->B3SOIFDmxc); - printf("Warning: Mxc = %g should be within (-1, 1).\n", model->B3SOIFDmxc); - } - -/* Check Saturation parameters */ - if (pParam->B3SOIFDa2 < 0.01) - { fprintf(fplog, "Warning: A2 = %g is too small. Set to 0.01.\n", pParam->B3SOIFDa2); - printf("Warning: A2 = %g is too small. Set to 0.01.\n", - pParam->B3SOIFDa2); - pParam->B3SOIFDa2 = 0.01; - } - else if (pParam->B3SOIFDa2 > 1.0) - { fprintf(fplog, "Warning: A2 = %g is larger than 1. A2 is set to 1 and A1 is set to 0.\n", - pParam->B3SOIFDa2); - printf("Warning: A2 = %g is larger than 1. A2 is set to 1 and A1 is set to 0.\n", - pParam->B3SOIFDa2); - pParam->B3SOIFDa2 = 1.0; - pParam->B3SOIFDa1 = 0.0; - - } - - if (pParam->B3SOIFDrdsw < 0.0) - { fprintf(fplog, "Warning: Rdsw = %g is negative. Set to zero.\n", - pParam->B3SOIFDrdsw); - printf("Warning: Rdsw = %g is negative. Set to zero.\n", - pParam->B3SOIFDrdsw); - pParam->B3SOIFDrdsw = 0.0; - pParam->B3SOIFDrds0 = 0.0; - } - else if ((pParam->B3SOIFDrds0 > 0.0) && (pParam->B3SOIFDrds0 < 0.001)) - { fprintf(fplog, "Warning: Rds at current temperature = %g is less than 0.001 ohm. Set to zero.\n", - pParam->B3SOIFDrds0); - printf("Warning: Rds at current temperature = %g is less than 0.001 ohm. Set to zero.\n", - pParam->B3SOIFDrds0); - pParam->B3SOIFDrds0 = 0.0; - } - if (pParam->B3SOIFDvsattemp < 1.0e3) - { fprintf(fplog, "Warning: Vsat at current temperature = %g may be too small.\n", pParam->B3SOIFDvsattemp); - printf("Warning: Vsat at current temperature = %g may be too small.\n", pParam->B3SOIFDvsattemp); - } - - if (pParam->B3SOIFDpdibl1 < 0.0) - { fprintf(fplog, "Warning: Pdibl1 = %g is negative.\n", - pParam->B3SOIFDpdibl1); - printf("Warning: Pdibl1 = %g is negative.\n", pParam->B3SOIFDpdibl1); - } - if (pParam->B3SOIFDpdibl2 < 0.0) - { fprintf(fplog, "Warning: Pdibl2 = %g is negative.\n", - pParam->B3SOIFDpdibl2); - printf("Warning: Pdibl2 = %g is negative.\n", pParam->B3SOIFDpdibl2); - } -/* Check overlap capacitance parameters */ - if (model->B3SOIFDcgdo < 0.0) - { fprintf(fplog, "Warning: cgdo = %g is negative. Set to zero.\n", model->B3SOIFDcgdo); - printf("Warning: cgdo = %g is negative. Set to zero.\n", model->B3SOIFDcgdo); - model->B3SOIFDcgdo = 0.0; - } - if (model->B3SOIFDcgso < 0.0) - { fprintf(fplog, "Warning: cgso = %g is negative. Set to zero.\n", model->B3SOIFDcgso); - printf("Warning: cgso = %g is negative. Set to zero.\n", model->B3SOIFDcgso); - model->B3SOIFDcgso = 0.0; - } - if (model->B3SOIFDcgeo < 0.0) - { fprintf(fplog, "Warning: cgeo = %g is negative. Set to zero.\n", model->B3SOIFDcgeo); - printf("Warning: cgeo = %g is negative. Set to zero.\n", model->B3SOIFDcgeo); - model->B3SOIFDcgeo = 0.0; - } - - if (model->B3SOIFDntun < 0.0) - { fprintf(fplog, "Warning: Ntun = %g is negative.\n", - model->B3SOIFDntun); - printf("Warning: Ntun = %g is negative.\n", model->B3SOIFDntun); - } - - if (model->B3SOIFDndiode < 0.0) - { fprintf(fplog, "Warning: Ndiode = %g is negative.\n", - model->B3SOIFDndiode); - printf("Warning: Ndiode = %g is negative.\n", model->B3SOIFDndiode); - } - - if (model->B3SOIFDisbjt < 0.0) - { fprintf(fplog, "Warning: Isbjt = %g is negative.\n", - model->B3SOIFDisbjt); - printf("Warning: Isbjt = %g is negative.\n", model->B3SOIFDisbjt); - } - - if (model->B3SOIFDisdif < 0.0) - { fprintf(fplog, "Warning: Isdif = %g is negative.\n", - model->B3SOIFDisdif); - printf("Warning: Isdif = %g is negative.\n", model->B3SOIFDisdif); - } - - if (model->B3SOIFDisrec < 0.0) - { fprintf(fplog, "Warning: Isrec = %g is negative.\n", - model->B3SOIFDisrec); - printf("Warning: Isrec = %g is negative.\n", model->B3SOIFDisrec); - } - - if (model->B3SOIFDistun < 0.0) - { fprintf(fplog, "Warning: Istun = %g is negative.\n", - model->B3SOIFDistun); - printf("Warning: Istun = %g is negative.\n", model->B3SOIFDistun); - } - - if (model->B3SOIFDedl < 0.0) - { fprintf(fplog, "Warning: Edl = %g is negative.\n", - model->B3SOIFDedl); - printf("Warning: Edl = %g is negative.\n", model->B3SOIFDedl); - } - - if (model->B3SOIFDkbjt1 < 0.0) - { fprintf(fplog, "Warning: Kbjt1 = %g is negative.\n", - model->B3SOIFDkbjt1); - printf("Warning: kbjt1 = %g is negative.\n", model->B3SOIFDkbjt1); - } - - if (model->B3SOIFDtt < 0.0) - { fprintf(fplog, "Warning: Tt = %g is negative.\n", - model->B3SOIFDtt); - printf("Warning: Tt = %g is negative.\n", model->B3SOIFDtt); - } - - if (model->B3SOIFDcsdmin < 0.0) - { fprintf(fplog, "Warning: Csdmin = %g is negative.\n", - model->B3SOIFDcsdmin); - printf("Warning: Csdmin = %g is negative.\n", model->B3SOIFDcsdmin); - } - - if (model->B3SOIFDcsdesw < 0.0) - { fprintf(fplog, "Warning: Csdesw = %g is negative.\n", - model->B3SOIFDcsdesw); - printf("Warning: Csdesw = %g is negative.\n", model->B3SOIFDcsdesw); - } - - if ((model->B3SOIFDasd < 0.0) || (model->B3SOIFDmxc > 1.0)) - { fprintf(fplog, "Warning: Asd = %g should be within (0, 1).\n", - model->B3SOIFDasd); - printf("Warning: Asd = %g should be within (0, 1).\n", model->B3SOIFDasd); - } - - if (model->B3SOIFDrth0 < 0.0) - { fprintf(fplog, "Warning: Rth0 = %g is negative.\n", - model->B3SOIFDrth0); - printf("Warning: Rth0 = %g is negative.\n", model->B3SOIFDrth0); - } - - if (model->B3SOIFDcth0 < 0.0) - { fprintf(fplog, "Warning: Cth0 = %g is negative.\n", - model->B3SOIFDcth0); - printf("Warning: Cth0 = %g is negative.\n", model->B3SOIFDcth0); - } - - if (model->B3SOIFDrbody < 0.0) - { fprintf(fplog, "Warning: Rbody = %g is negative.\n", - model->B3SOIFDrbody); - printf("Warning: Rbody = %g is negative.\n", model->B3SOIFDrbody); - } - - if (model->B3SOIFDrbsh < 0.0) - { fprintf(fplog, "Warning: Rbsh = %g is negative.\n", - model->B3SOIFDrbsh); - printf("Warning: Rbsh = %g is negative.\n", model->B3SOIFDrbsh); - } - - if (model->B3SOIFDxj > model->B3SOIFDtsi) - { fprintf(fplog, "Warning: Xj = %g is thicker than Tsi = %g.\n", - model->B3SOIFDxj, model->B3SOIFDtsi); - printf("Warning: Xj = %g is thicker than Tsi = %g.\n", - model->B3SOIFDxj, model->B3SOIFDtsi); - } - - if (model->B3SOIFDcapMod < 2) - { fprintf(fplog, "Warning: capMod < 2 is not supported by BSIM3SOI.\n"); - printf("Warning: Warning: capMod < 2 is not supported by BSIM3SOI.\n"); - } - - if (model->B3SOIFDcii > 2.0) - { fprintf(fplog, "Warning: Cii = %g is larger than 2.0.\n", model->B3SOIFDcii); - printf("Warning: Cii = %g is larger than 2.0.\n", model->B3SOIFDcii); - } - - if (model->B3SOIFDdii > 1.5) - { fprintf(fplog, "Warning: Dii = %g is larger than 1.5.\n", model->B3SOIFDcii); - printf("Warning: Dii = %g is too larger than 1.5.\n", model->B3SOIFDcii); - } - - }/* loop for the parameter check for warning messages */ - fclose(fplog); - } - else - { fprintf(stderr, "Warning: Can't open log file. Parameter checking skipped.\n"); - } - - return(Fatal_Flag); -} - diff --git a/src/spicelib/devices/bsim3soi_fd/b3soifdcvtest.c b/src/spicelib/devices/bsim3soi_fd/b3soifdcvtest.c deleted file mode 100644 index 6fa55b44f..000000000 --- a/src/spicelib/devices/bsim3soi_fd/b3soifdcvtest.c +++ /dev/null @@ -1,92 +0,0 @@ -/********** -Copyright 1999 Regents of the University of California. All rights reserved. -Author: 1998 Samuel Fung, Dennis Sinitsky and Stephen Tang -Modified by Paolo Nenzi 2002 -File: b3soifdcvtest.c 98/5/01 -**********/ - -/* - * Revision 2.1 99/9/27 Pin Su - * BSIMFD2.1 release - */ - -#include "ngspice/ngspice.h" -#include "ngspice/cktdefs.h" -#include "b3soifddef.h" -#include "ngspice/trandefs.h" -#include "ngspice/const.h" -#include "ngspice/devdefs.h" -#include "ngspice/sperror.h" -#include "ngspice/suffix.h" - - -int -B3SOIFDconvTest(GENmodel *inModel, CKTcircuit *ckt) -{ -B3SOIFDmodel *model = (B3SOIFDmodel*)inModel; -B3SOIFDinstance *here; -double delvbd, delvbs, delvds, delvgd, delvgs, vbd, vbs, vds; -double cbd, cbhat, cbs, cd, cdhat, tol, vgd, vgdo, vgs; - - /* loop through all the B3SOIFD device models */ - for (; model != NULL; model = B3SOIFDnextModel(model)) - { /* loop through all the instances of the model */ - for (here = B3SOIFDinstances(model); here != NULL ; - here=B3SOIFDnextInstance(here)) - { - vbs = model->B3SOIFDtype - * (*(ckt->CKTrhsOld+here->B3SOIFDbNode) - - *(ckt->CKTrhsOld+here->B3SOIFDsNodePrime)); - vgs = model->B3SOIFDtype - * (*(ckt->CKTrhsOld+here->B3SOIFDgNode) - - *(ckt->CKTrhsOld+here->B3SOIFDsNodePrime)); - vds = model->B3SOIFDtype - * (*(ckt->CKTrhsOld+here->B3SOIFDdNodePrime) - - *(ckt->CKTrhsOld+here->B3SOIFDsNodePrime)); - vbd = vbs - vds; - vgd = vgs - vds; - vgdo = *(ckt->CKTstate0 + here->B3SOIFDvgs) - - *(ckt->CKTstate0 + here->B3SOIFDvds); - delvbs = vbs - *(ckt->CKTstate0 + here->B3SOIFDvbs); - delvbd = vbd - *(ckt->CKTstate0 + here->B3SOIFDvbd); - delvgs = vgs - *(ckt->CKTstate0 + here->B3SOIFDvgs); - delvds = vds - *(ckt->CKTstate0 + here->B3SOIFDvds); - delvgd = vgd-vgdo; - - cd = here->B3SOIFDcd; - if (here->B3SOIFDmode >= 0) - { cdhat = cd - here->B3SOIFDgjdb * delvbd - + here->B3SOIFDgmbs * delvbs + here->B3SOIFDgm * delvgs - + here->B3SOIFDgds * delvds; - } - else - { cdhat = cd - (here->B3SOIFDgjdb - here->B3SOIFDgmbs) * delvbd - - here->B3SOIFDgm * delvgd + here->B3SOIFDgds * delvds; - } - - /* - * check convergence - */ - if ((here->B3SOIFDoff == 0) || (!(ckt->CKTmode & MODEINITFIX))) - { tol = ckt->CKTreltol * MAX(fabs(cdhat), fabs(cd)) - + ckt->CKTabstol; - if (fabs(cdhat - cd) >= tol) - { ckt->CKTnoncon++; - return(OK); - } - cbs = here->B3SOIFDcjs; - cbd = here->B3SOIFDcjd; - cbhat = cbs + cbd + here->B3SOIFDgjdb * delvbd - + here->B3SOIFDgjsb * delvbs; - tol = ckt->CKTreltol * MAX(fabs(cbhat), fabs(cbs + cbd)) - + ckt->CKTabstol; - if (fabs(cbhat - (cbs + cbd)) > tol) - { ckt->CKTnoncon++; - return(OK); - } - } - } - } - return(OK); -} - diff --git a/src/spicelib/devices/bsim3soi_fd/b3soifddef.h b/src/spicelib/devices/bsim3soi_fd/b3soifddef.h deleted file mode 100644 index 7bbe71fc9..000000000 --- a/src/spicelib/devices/bsim3soi_fd/b3soifddef.h +++ /dev/null @@ -1,1997 +0,0 @@ -/********** -Copyright 1999 Regents of the University of California. All rights reserved. -Author: Weidong Liu and Pin Su Feb 1999 -Author: 1998 Samuel Fung -Modified by Pin Su, Wei Jin 99/9/27 -Modified by Paolo Nenzi 2002 -File: b3soifddef.h -**********/ - -#ifndef B3SOIFD -#define B3SOIFD - -#define SOICODE -/* #define BULKCODE */ - -#include "ngspice/ifsim.h" -#include "ngspice/gendefs.h" -#include "ngspice/cktdefs.h" -#include "ngspice/complex.h" -#include "ngspice/noisedef.h" - -typedef struct sB3SOIFDinstance -{ - - struct GENinstance gen; - -#define B3SOIFDmodPtr(inst) ((struct sB3SOIFDmodel *)((inst)->gen.GENmodPtr)) -#define B3SOIFDnextInstance(inst) ((struct sB3SOIFDinstance *)((inst)->gen.GENnextInstance)) -#define B3SOIFDname gen.GENname -#define B3SOIFDstates gen.GENstate - - const int B3SOIFDdNode; - const int B3SOIFDgNode; - const int B3SOIFDsNode; - const int B3SOIFDeNode; - const int B3SOIFDbNodeExt; - const int B3SOIFDtempNodeExt; - const int B3SOIFDpNodeExt; - int B3SOIFDbNode; - int B3SOIFDtempNode; - int B3SOIFDpNode; - int B3SOIFDdNodePrime; - int B3SOIFDsNodePrime; - - int B3SOIFDvbsNode; - /* for Debug */ - int B3SOIFDidsNode; - int B3SOIFDicNode; - int B3SOIFDibsNode; - int B3SOIFDibdNode; - int B3SOIFDiiiNode; - int B3SOIFDigidlNode; - int B3SOIFDitunNode; - int B3SOIFDibpNode; - int B3SOIFDabeffNode; - int B3SOIFDvbs0effNode; - int B3SOIFDvbseffNode; - int B3SOIFDxcNode; - int B3SOIFDcbbNode; - int B3SOIFDcbdNode; - int B3SOIFDcbeNode; - int B3SOIFDcbgNode; - int B3SOIFDqbNode; - int B3SOIFDqbfNode; - int B3SOIFDqjsNode; - int B3SOIFDqjdNode; - -/* clean up last */ - int B3SOIFDgmNode; - int B3SOIFDgmbsNode; - int B3SOIFDgdsNode; - int B3SOIFDgmeNode; - int B3SOIFDqgNode; - int B3SOIFDqdNode; - int B3SOIFDqeNode; - int B3SOIFDiterations; - int B3SOIFDvbs0teffNode; - int B3SOIFDvthNode; - int B3SOIFDvgsteffNode; - int B3SOIFDxcsatNode; - int B3SOIFDqaccNode; - int B3SOIFDqsub0Node; - int B3SOIFDqsubs1Node; - int B3SOIFDqsubs2Node; - int B3SOIFDvcscvNode; - int B3SOIFDvdscvNode; - int B3SOIFDdum1Node; - int B3SOIFDdum2Node; - int B3SOIFDdum3Node; - int B3SOIFDdum4Node; - int B3SOIFDdum5Node; -/* end clean up last */ - - double B3SOIFDphi; - double B3SOIFDvtm; - double B3SOIFDni; - double B3SOIFDueff; - double B3SOIFDthetavth; - double B3SOIFDvon; - double B3SOIFDvbsdio; - double B3SOIFDvdsat; - double B3SOIFDcgdo; - double B3SOIFDcgso; - double B3SOIFDcgeo; - - double B3SOIFDids; - double B3SOIFDic; - double B3SOIFDibs; - double B3SOIFDibd; - double B3SOIFDiii; - double B3SOIFDigidl; - double B3SOIFDitun; - double B3SOIFDibp; - double B3SOIFDabeff; - double B3SOIFDvbs0eff; - double B3SOIFDvbseff; - double B3SOIFDxc; - double B3SOIFDcbg; - double B3SOIFDcbb; - double B3SOIFDcbd; - double B3SOIFDqb; - double B3SOIFDqbf; - double B3SOIFDqjs; - double B3SOIFDqjd; - double B3SOIFDminIsub; - int B3SOIFDfloat; - -/* clean up last */ - double B3SOIFDdum1; - double B3SOIFDdum2; - double B3SOIFDdum3; - double B3SOIFDdum4; - double B3SOIFDdum5; -/* end clean up last */ - - double B3SOIFDl; - double B3SOIFDw; - double B3SOIFDm; - double B3SOIFDdrainArea; - double B3SOIFDsourceArea; - double B3SOIFDdrainSquares; - double B3SOIFDsourceSquares; - double B3SOIFDdrainPerimeter; - double B3SOIFDsourcePerimeter; - double B3SOIFDsourceConductance; - double B3SOIFDdrainConductance; - - double B3SOIFDicVBS; - double B3SOIFDicVDS; - double B3SOIFDicVGS; - double B3SOIFDicVES; - double B3SOIFDicVPS; - int B3SOIFDbjtoff; - int B3SOIFDbodyMod; - int B3SOIFDdebugMod; - double B3SOIFDrth0; - double B3SOIFDcth0; - double B3SOIFDbodySquares; - double B3SOIFDrbodyext; - - double B3SOIFDcsbox; - double B3SOIFDcdbox; - double B3SOIFDcsmin; - double B3SOIFDcdmin; - double B3SOIFDst4; - double B3SOIFDdt4; - - int B3SOIFDoff; - int B3SOIFDmode; - - /* OP point */ - double B3SOIFDqinv; - double B3SOIFDcd; - double B3SOIFDcjs; - double B3SOIFDcjd; - double B3SOIFDcbody; - double B3SOIFDcbodcon; - double B3SOIFDcth; - double B3SOIFDcsubstrate; - - double B3SOIFDgm; - double B3SOIFDgme; - double B3SOIFDcb; - double B3SOIFDcdrain; - double B3SOIFDgds; - double B3SOIFDgmbs; - double B3SOIFDgmT; - - double B3SOIFDgbbs; - double B3SOIFDgbgs; - double B3SOIFDgbds; - double B3SOIFDgbes; - double B3SOIFDgbps; - double B3SOIFDgbT; - - double B3SOIFDgjsd; - double B3SOIFDgjsb; - double B3SOIFDgjsg; - double B3SOIFDgjsT; - - double B3SOIFDgjdb; - double B3SOIFDgjdd; - double B3SOIFDgjdg; - double B3SOIFDgjde; - double B3SOIFDgjdT; - - double B3SOIFDgbpbs; - double B3SOIFDgbpgs; - double B3SOIFDgbpds; - double B3SOIFDgbpes; - double B3SOIFDgbpps; - double B3SOIFDgbpT; - - double B3SOIFDgtempb; - double B3SOIFDgtempg; - double B3SOIFDgtempd; - double B3SOIFDgtempe; - double B3SOIFDgtempT; - - double B3SOIFDcggb; - double B3SOIFDcgdb; - double B3SOIFDcgsb; - double B3SOIFDcgeb; - double B3SOIFDcgT; - - double B3SOIFDcbgb; - double B3SOIFDcbdb; - double B3SOIFDcbsb; - double B3SOIFDcbeb; - double B3SOIFDcbT; - - double B3SOIFDcdgb; - double B3SOIFDcddb; - double B3SOIFDcdsb; - double B3SOIFDcdeb; - double B3SOIFDcdT; - - double B3SOIFDcegb; - double B3SOIFDcedb; - double B3SOIFDcesb; - double B3SOIFDceeb; - double B3SOIFDceT; - - double B3SOIFDqse; - double B3SOIFDgcse; - double B3SOIFDqde; - double B3SOIFDgcde; - - struct b3soifdSizeDependParam *pParam; - - unsigned B3SOIFDlGiven :1; - unsigned B3SOIFDwGiven :1; - unsigned B3SOIFDmGiven :1; - unsigned B3SOIFDdrainAreaGiven :1; - unsigned B3SOIFDsourceAreaGiven :1; - unsigned B3SOIFDdrainSquaresGiven :1; - unsigned B3SOIFDsourceSquaresGiven :1; - unsigned B3SOIFDdrainPerimeterGiven :1; - unsigned B3SOIFDsourcePerimeterGiven :1; - unsigned B3SOIFDdNodePrimeSet :1; - unsigned B3SOIFDsNodePrimeSet :1; - unsigned B3SOIFDicVBSGiven :1; - unsigned B3SOIFDicVDSGiven :1; - unsigned B3SOIFDicVGSGiven :1; - unsigned B3SOIFDicVESGiven :1; - unsigned B3SOIFDicVPSGiven :1; - unsigned B3SOIFDbjtoffGiven :1; - unsigned B3SOIFDdebugModGiven :1; - unsigned B3SOIFDrth0Given :1; - unsigned B3SOIFDcth0Given :1; - unsigned B3SOIFDbodySquaresGiven :1; - unsigned B3SOIFDoffGiven :1; - - double *B3SOIFDEePtr; - double *B3SOIFDEbPtr; - double *B3SOIFDBePtr; - double *B3SOIFDEgPtr; - double *B3SOIFDEdpPtr; - double *B3SOIFDEspPtr; - double *B3SOIFDTemptempPtr; - double *B3SOIFDTempdpPtr; - double *B3SOIFDTempspPtr; - double *B3SOIFDTempgPtr; - double *B3SOIFDTempbPtr; - double *B3SOIFDTempePtr; - double *B3SOIFDGtempPtr; - double *B3SOIFDDPtempPtr; - double *B3SOIFDSPtempPtr; - double *B3SOIFDEtempPtr; - double *B3SOIFDBtempPtr; - double *B3SOIFDPtempPtr; - double *B3SOIFDBpPtr; - double *B3SOIFDPbPtr; - double *B3SOIFDPpPtr; - double *B3SOIFDPgPtr; - double *B3SOIFDPdpPtr; - double *B3SOIFDPspPtr; - double *B3SOIFDPePtr; - double *B3SOIFDDPePtr; - double *B3SOIFDSPePtr; - double *B3SOIFDGePtr; - double *B3SOIFDDdPtr; - double *B3SOIFDGgPtr; - double *B3SOIFDSsPtr; - double *B3SOIFDBbPtr; - double *B3SOIFDDPdpPtr; - double *B3SOIFDSPspPtr; - double *B3SOIFDDdpPtr; - double *B3SOIFDGbPtr; - double *B3SOIFDGdpPtr; - double *B3SOIFDGspPtr; - double *B3SOIFDSspPtr; - double *B3SOIFDBdpPtr; - double *B3SOIFDBspPtr; - double *B3SOIFDDPspPtr; - double *B3SOIFDDPdPtr; - double *B3SOIFDBgPtr; - double *B3SOIFDDPgPtr; - double *B3SOIFDSPgPtr; - double *B3SOIFDSPsPtr; - double *B3SOIFDDPbPtr; - double *B3SOIFDSPbPtr; - double *B3SOIFDSPdpPtr; - - double *B3SOIFDVbsPtr; - /* Debug */ - double *B3SOIFDIdsPtr; - double *B3SOIFDIcPtr; - double *B3SOIFDIbsPtr; - double *B3SOIFDIbdPtr; - double *B3SOIFDIiiPtr; - double *B3SOIFDIgidlPtr; - double *B3SOIFDItunPtr; - double *B3SOIFDIbpPtr; - double *B3SOIFDAbeffPtr; - double *B3SOIFDVbs0effPtr; - double *B3SOIFDVbseffPtr; - double *B3SOIFDXcPtr; - double *B3SOIFDCbbPtr; - double *B3SOIFDCbdPtr; - double *B3SOIFDCbgPtr; - double *B3SOIFDqbPtr; - double *B3SOIFDQbfPtr; - double *B3SOIFDQjsPtr; - double *B3SOIFDQjdPtr; - - /* clean up last */ - double *B3SOIFDGmPtr; - double *B3SOIFDGmbsPtr; - double *B3SOIFDGdsPtr; - double *B3SOIFDGmePtr; - double *B3SOIFDVbs0teffPtr; - double *B3SOIFDVthPtr; - double *B3SOIFDVgsteffPtr; - double *B3SOIFDXcsatPtr; - double *B3SOIFDQaccPtr; - double *B3SOIFDQsub0Ptr; - double *B3SOIFDQsubs1Ptr; - double *B3SOIFDQsubs2Ptr; - double *B3SOIFDVdscvPtr; - double *B3SOIFDVcscvPtr; - double *B3SOIFDCbePtr; - double *B3SOIFDqgPtr; - double *B3SOIFDqdPtr; - double *B3SOIFDqePtr; - double *B3SOIFDDum1Ptr; - double *B3SOIFDDum2Ptr; - double *B3SOIFDDum3Ptr; - double *B3SOIFDDum4Ptr; - double *B3SOIFDDum5Ptr; - /* End clean up last */ - -#define B3SOIFDvbd B3SOIFDstates+ 0 -#define B3SOIFDvbs B3SOIFDstates+ 1 -#define B3SOIFDvgs B3SOIFDstates+ 2 -#define B3SOIFDvds B3SOIFDstates+ 3 -#define B3SOIFDves B3SOIFDstates+ 4 -#define B3SOIFDvps B3SOIFDstates+ 5 - -#define B3SOIFDvg B3SOIFDstates+ 6 -#define B3SOIFDvd B3SOIFDstates+ 7 -#define B3SOIFDvs B3SOIFDstates+ 8 -#define B3SOIFDvp B3SOIFDstates+ 9 -#define B3SOIFDve B3SOIFDstates+ 10 -#define B3SOIFDdeltemp B3SOIFDstates+ 11 - -#define B3SOIFDqb B3SOIFDstates+ 12 -#define B3SOIFDcqb B3SOIFDstates+ 13 -#define B3SOIFDqg B3SOIFDstates+ 14 -#define B3SOIFDcqg B3SOIFDstates+ 15 -#define B3SOIFDqd B3SOIFDstates+ 16 -#define B3SOIFDcqd B3SOIFDstates+ 17 -#define B3SOIFDqe B3SOIFDstates+ 18 -#define B3SOIFDcqe B3SOIFDstates+ 19 - -#define B3SOIFDqbs B3SOIFDstates+ 20 -#define B3SOIFDqbd B3SOIFDstates+ 21 -#define B3SOIFDqbe B3SOIFDstates+ 22 - -#define B3SOIFDqth B3SOIFDstates+ 23 -#define B3SOIFDcqth B3SOIFDstates+ 24 - -#define B3SOIFDnumStates 25 - - -/* indices to the array of B3SOIFD NOISE SOURCES */ - -#define B3SOIFDRDNOIZ 0 -#define B3SOIFDRSNOIZ 1 -#define B3SOIFDIDNOIZ 2 -#define B3SOIFDFLNOIZ 3 -#define B3SOIFDFBNOIZ 4 -#define B3SOIFDTOTNOIZ 5 - -#define B3SOIFDNSRCS 6 /* the number of MOSFET(3) noise sources */ - -#ifndef NONOISE - double B3SOIFDnVar[NSTATVARS][B3SOIFDNSRCS]; -#else /* NONOISE */ - double **B3SOIFDnVar; -#endif /* NONOISE */ - -} B3SOIFDinstance ; - -struct b3soifdSizeDependParam -{ - double Width; - double Length; - double Rth0; - double Cth0; - - double B3SOIFDcdsc; - double B3SOIFDcdscb; - double B3SOIFDcdscd; - double B3SOIFDcit; - double B3SOIFDnfactor; - double B3SOIFDvsat; - double B3SOIFDat; - double B3SOIFDa0; - double B3SOIFDags; - double B3SOIFDa1; - double B3SOIFDa2; - double B3SOIFDketa; - double B3SOIFDnpeak; - double B3SOIFDnsub; - double B3SOIFDngate; - double B3SOIFDgamma1; - double B3SOIFDgamma2; - double B3SOIFDvbx; - double B3SOIFDvbi; - double B3SOIFDvbm; - double B3SOIFDvbsc; - double B3SOIFDxt; - double B3SOIFDphi; - double B3SOIFDlitl; - double B3SOIFDk1; - double B3SOIFDkt1; - double B3SOIFDkt1l; - double B3SOIFDkt2; - double B3SOIFDk2; - double B3SOIFDk3; - double B3SOIFDk3b; - double B3SOIFDw0; - double B3SOIFDnlx; - double B3SOIFDdvt0; - double B3SOIFDdvt1; - double B3SOIFDdvt2; - double B3SOIFDdvt0w; - double B3SOIFDdvt1w; - double B3SOIFDdvt2w; - double B3SOIFDdrout; - double B3SOIFDdsub; - double B3SOIFDvth0; - double B3SOIFDua; - double B3SOIFDua1; - double B3SOIFDub; - double B3SOIFDub1; - double B3SOIFDuc; - double B3SOIFDuc1; - double B3SOIFDu0; - double B3SOIFDute; - double B3SOIFDvoff; - double B3SOIFDvfb; - double B3SOIFDuatemp; - double B3SOIFDubtemp; - double B3SOIFDuctemp; - double B3SOIFDrbody; - double B3SOIFDrth; - double B3SOIFDcth; - double B3SOIFDrds0denom; - double B3SOIFDvfbb; - double B3SOIFDjbjt; - double B3SOIFDjdif; - double B3SOIFDjrec; - double B3SOIFDjtun; - double B3SOIFDcsesw; - double B3SOIFDcdesw; - - /* Added */ - double B3SOIFDsdt1; - double B3SOIFDst2; - double B3SOIFDst3; - double B3SOIFDdt2; - double B3SOIFDdt3; - /* Added */ - - double B3SOIFDdelta; - double B3SOIFDrdsw; - double B3SOIFDrds0; - double B3SOIFDprwg; - double B3SOIFDprwb; - double B3SOIFDprt; - double B3SOIFDeta0; - double B3SOIFDetab; - double B3SOIFDpclm; - double B3SOIFDpdibl1; - double B3SOIFDpdibl2; - double B3SOIFDpdiblb; - double B3SOIFDpvag; - double B3SOIFDwr; - double B3SOIFDdwg; - double B3SOIFDdwb; - double B3SOIFDb0; - double B3SOIFDb1; - double B3SOIFDalpha0; - double B3SOIFDalpha1; - double B3SOIFDbeta0; - - - /* CV model */ - double B3SOIFDcgsl; - double B3SOIFDcgdl; - double B3SOIFDckappa; - double B3SOIFDcf; - double B3SOIFDclc; - double B3SOIFDcle; - -/* Added for binning - START0 */ - double B3SOIFDvbsa; - double B3SOIFDdelp; - double B3SOIFDkb1; - double B3SOIFDkb3; - double B3SOIFDdvbd0; - double B3SOIFDdvbd1; - double B3SOIFDabp; - double B3SOIFDmxc; - double B3SOIFDadice0; - double B3SOIFDaii; - double B3SOIFDbii; - double B3SOIFDcii; - double B3SOIFDdii; - double B3SOIFDagidl; - double B3SOIFDbgidl; - double B3SOIFDngidl; - double B3SOIFDntun; - double B3SOIFDndiode; - double B3SOIFDisbjt; - double B3SOIFDisdif; - double B3SOIFDisrec; - double B3SOIFDistun; - double B3SOIFDedl; - double B3SOIFDkbjt1; - double B3SOIFDvsdfb; - double B3SOIFDvsdth; -/* Added for binning - END0 */ - -/* Pre-calculated constants */ - - double B3SOIFDdw; - double B3SOIFDdl; - double B3SOIFDleff; - double B3SOIFDweff; - - double B3SOIFDdwc; - double B3SOIFDdlc; - double B3SOIFDleffCV; - double B3SOIFDweffCV; - double B3SOIFDabulkCVfactor; - double B3SOIFDcgso; - double B3SOIFDcgdo; - double B3SOIFDcgeo; - - double B3SOIFDu0temp; - double B3SOIFDvsattemp; - double B3SOIFDsqrtPhi; - double B3SOIFDphis3; - double B3SOIFDXdep0; - double B3SOIFDsqrtXdep0; - double B3SOIFDtheta0vb0; - double B3SOIFDthetaRout; - - double B3SOIFDcof1; - double B3SOIFDcof2; - double B3SOIFDcof3; - double B3SOIFDcof4; - double B3SOIFDcdep0; - struct b3soifdSizeDependParam *pNext; -}; - - -typedef struct sB3SOIFDmodel -{ - - struct GENmodel gen; - -#define B3SOIFDmodType gen.GENmodType -#define B3SOIFDnextModel(inst) ((struct sB3SOIFDmodel *)((inst)->gen.GENnextModel)) -#define B3SOIFDinstances(inst) ((B3SOIFDinstance *)((inst)->gen.GENinstances)) -#define B3SOIFDmodName gen.GENmodName - - int B3SOIFDtype; - - int B3SOIFDmobMod; - int B3SOIFDcapMod; - int B3SOIFDnoiMod; - int B3SOIFDshMod; - int B3SOIFDbinUnit; - int B3SOIFDparamChk; - double B3SOIFDversion; - double B3SOIFDtox; - double B3SOIFDcdsc; - double B3SOIFDcdscb; - double B3SOIFDcdscd; - double B3SOIFDcit; - double B3SOIFDnfactor; - double B3SOIFDvsat; - double B3SOIFDat; - double B3SOIFDa0; - double B3SOIFDags; - double B3SOIFDa1; - double B3SOIFDa2; - double B3SOIFDketa; - double B3SOIFDnsub; - double B3SOIFDnpeak; - double B3SOIFDngate; - double B3SOIFDgamma1; - double B3SOIFDgamma2; - double B3SOIFDvbx; - double B3SOIFDvbm; - double B3SOIFDxt; - double B3SOIFDk1; - double B3SOIFDkt1; - double B3SOIFDkt1l; - double B3SOIFDkt2; - double B3SOIFDk2; - double B3SOIFDk3; - double B3SOIFDk3b; - double B3SOIFDw0; - double B3SOIFDnlx; - double B3SOIFDdvt0; - double B3SOIFDdvt1; - double B3SOIFDdvt2; - double B3SOIFDdvt0w; - double B3SOIFDdvt1w; - double B3SOIFDdvt2w; - double B3SOIFDdrout; - double B3SOIFDdsub; - double B3SOIFDvth0; - double B3SOIFDua; - double B3SOIFDua1; - double B3SOIFDub; - double B3SOIFDub1; - double B3SOIFDuc; - double B3SOIFDuc1; - double B3SOIFDu0; - double B3SOIFDute; - double B3SOIFDvoff; - double B3SOIFDdelta; - double B3SOIFDrdsw; - double B3SOIFDprwg; - double B3SOIFDprwb; - double B3SOIFDprt; - double B3SOIFDeta0; - double B3SOIFDetab; - double B3SOIFDpclm; - double B3SOIFDpdibl1; - double B3SOIFDpdibl2; - double B3SOIFDpdiblb; - double B3SOIFDpvag; - double B3SOIFDwr; - double B3SOIFDdwg; - double B3SOIFDdwb; - double B3SOIFDb0; - double B3SOIFDb1; - double B3SOIFDalpha0; - double B3SOIFDalpha1; - double B3SOIFDbeta0; - double B3SOIFDtbox; - double B3SOIFDtsi; - double B3SOIFDxj; - double B3SOIFDkb1; - double B3SOIFDkb3; - double B3SOIFDdvbd0; - double B3SOIFDdvbd1; - double B3SOIFDvbsa; - double B3SOIFDdelp; - double B3SOIFDrbody; - double B3SOIFDrbsh; - double B3SOIFDadice0; - double B3SOIFDabp; - double B3SOIFDmxc; - double B3SOIFDrth0; - double B3SOIFDcth0; - double B3SOIFDaii; - double B3SOIFDbii; - double B3SOIFDcii; - double B3SOIFDdii; - double B3SOIFDngidl; - double B3SOIFDagidl; - double B3SOIFDbgidl; - double B3SOIFDndiode; - double B3SOIFDntun; - double B3SOIFDisbjt; - double B3SOIFDisdif; - double B3SOIFDisrec; - double B3SOIFDistun; - double B3SOIFDxbjt; - double B3SOIFDxdif; - double B3SOIFDxrec; - double B3SOIFDxtun; - double B3SOIFDedl; - double B3SOIFDkbjt1; - double B3SOIFDtt; - double B3SOIFDvsdfb; - double B3SOIFDvsdth; - double B3SOIFDcsdmin; - double B3SOIFDasd; - - /* CV model */ - double B3SOIFDcgsl; - double B3SOIFDcgdl; - double B3SOIFDckappa; - double B3SOIFDcf; - double B3SOIFDclc; - double B3SOIFDcle; - double B3SOIFDdwc; - double B3SOIFDdlc; - - double B3SOIFDtnom; - double B3SOIFDcgso; - double B3SOIFDcgdo; - double B3SOIFDcgeo; - double B3SOIFDxpart; - double B3SOIFDcFringOut; - double B3SOIFDcFringMax; - - double B3SOIFDsheetResistance; - double B3SOIFDbodyJctGateSideGradingCoeff; - double B3SOIFDGatesidewallJctPotential; - double B3SOIFDunitLengthGateSidewallJctCap; - double B3SOIFDcsdesw; - - double B3SOIFDLint; - double B3SOIFDLl; - double B3SOIFDLln; - double B3SOIFDLw; - double B3SOIFDLwn; - double B3SOIFDLwl; - double B3SOIFDLmin; - double B3SOIFDLmax; - - double B3SOIFDWint; - double B3SOIFDWl; - double B3SOIFDWln; - double B3SOIFDWw; - double B3SOIFDWwn; - double B3SOIFDWwl; - double B3SOIFDWmin; - double B3SOIFDWmax; - -/* Added for binning - START1 */ - /* Length Dependence */ - double B3SOIFDlnpeak; - double B3SOIFDlnsub; - double B3SOIFDlngate; - double B3SOIFDlvth0; - double B3SOIFDlk1; - double B3SOIFDlk2; - double B3SOIFDlk3; - double B3SOIFDlk3b; - double B3SOIFDlvbsa; - double B3SOIFDldelp; - double B3SOIFDlkb1; - double B3SOIFDlkb3; - double B3SOIFDldvbd0; - double B3SOIFDldvbd1; - double B3SOIFDlw0; - double B3SOIFDlnlx; - double B3SOIFDldvt0; - double B3SOIFDldvt1; - double B3SOIFDldvt2; - double B3SOIFDldvt0w; - double B3SOIFDldvt1w; - double B3SOIFDldvt2w; - double B3SOIFDlu0; - double B3SOIFDlua; - double B3SOIFDlub; - double B3SOIFDluc; - double B3SOIFDlvsat; - double B3SOIFDla0; - double B3SOIFDlags; - double B3SOIFDlb0; - double B3SOIFDlb1; - double B3SOIFDlketa; - double B3SOIFDlabp; - double B3SOIFDlmxc; - double B3SOIFDladice0; - double B3SOIFDla1; - double B3SOIFDla2; - double B3SOIFDlrdsw; - double B3SOIFDlprwb; - double B3SOIFDlprwg; - double B3SOIFDlwr; - double B3SOIFDlnfactor; - double B3SOIFDldwg; - double B3SOIFDldwb; - double B3SOIFDlvoff; - double B3SOIFDleta0; - double B3SOIFDletab; - double B3SOIFDldsub; - double B3SOIFDlcit; - double B3SOIFDlcdsc; - double B3SOIFDlcdscb; - double B3SOIFDlcdscd; - double B3SOIFDlpclm; - double B3SOIFDlpdibl1; - double B3SOIFDlpdibl2; - double B3SOIFDlpdiblb; - double B3SOIFDldrout; - double B3SOIFDlpvag; - double B3SOIFDldelta; - double B3SOIFDlaii; - double B3SOIFDlbii; - double B3SOIFDlcii; - double B3SOIFDldii; - double B3SOIFDlalpha0; - double B3SOIFDlalpha1; - double B3SOIFDlbeta0; - double B3SOIFDlagidl; - double B3SOIFDlbgidl; - double B3SOIFDlngidl; - double B3SOIFDlntun; - double B3SOIFDlndiode; - double B3SOIFDlisbjt; - double B3SOIFDlisdif; - double B3SOIFDlisrec; - double B3SOIFDlistun; - double B3SOIFDledl; - double B3SOIFDlkbjt1; - /* CV model */ - double B3SOIFDlvsdfb; - double B3SOIFDlvsdth; - - /* Width Dependence */ - double B3SOIFDwnpeak; - double B3SOIFDwnsub; - double B3SOIFDwngate; - double B3SOIFDwvth0; - double B3SOIFDwk1; - double B3SOIFDwk2; - double B3SOIFDwk3; - double B3SOIFDwk3b; - double B3SOIFDwvbsa; - double B3SOIFDwdelp; - double B3SOIFDwkb1; - double B3SOIFDwkb3; - double B3SOIFDwdvbd0; - double B3SOIFDwdvbd1; - double B3SOIFDww0; - double B3SOIFDwnlx; - double B3SOIFDwdvt0; - double B3SOIFDwdvt1; - double B3SOIFDwdvt2; - double B3SOIFDwdvt0w; - double B3SOIFDwdvt1w; - double B3SOIFDwdvt2w; - double B3SOIFDwu0; - double B3SOIFDwua; - double B3SOIFDwub; - double B3SOIFDwuc; - double B3SOIFDwvsat; - double B3SOIFDwa0; - double B3SOIFDwags; - double B3SOIFDwb0; - double B3SOIFDwb1; - double B3SOIFDwketa; - double B3SOIFDwabp; - double B3SOIFDwmxc; - double B3SOIFDwadice0; - double B3SOIFDwa1; - double B3SOIFDwa2; - double B3SOIFDwrdsw; - double B3SOIFDwprwb; - double B3SOIFDwprwg; - double B3SOIFDwwr; - double B3SOIFDwnfactor; - double B3SOIFDwdwg; - double B3SOIFDwdwb; - double B3SOIFDwvoff; - double B3SOIFDweta0; - double B3SOIFDwetab; - double B3SOIFDwdsub; - double B3SOIFDwcit; - double B3SOIFDwcdsc; - double B3SOIFDwcdscb; - double B3SOIFDwcdscd; - double B3SOIFDwpclm; - double B3SOIFDwpdibl1; - double B3SOIFDwpdibl2; - double B3SOIFDwpdiblb; - double B3SOIFDwdrout; - double B3SOIFDwpvag; - double B3SOIFDwdelta; - double B3SOIFDwaii; - double B3SOIFDwbii; - double B3SOIFDwcii; - double B3SOIFDwdii; - double B3SOIFDwalpha0; - double B3SOIFDwalpha1; - double B3SOIFDwbeta0; - double B3SOIFDwagidl; - double B3SOIFDwbgidl; - double B3SOIFDwngidl; - double B3SOIFDwntun; - double B3SOIFDwndiode; - double B3SOIFDwisbjt; - double B3SOIFDwisdif; - double B3SOIFDwisrec; - double B3SOIFDwistun; - double B3SOIFDwedl; - double B3SOIFDwkbjt1; - /* CV model */ - double B3SOIFDwvsdfb; - double B3SOIFDwvsdth; - - /* Cross-term Dependence */ - double B3SOIFDpnpeak; - double B3SOIFDpnsub; - double B3SOIFDpngate; - double B3SOIFDpvth0; - double B3SOIFDpk1; - double B3SOIFDpk2; - double B3SOIFDpk3; - double B3SOIFDpk3b; - double B3SOIFDpvbsa; - double B3SOIFDpdelp; - double B3SOIFDpkb1; - double B3SOIFDpkb3; - double B3SOIFDpdvbd0; - double B3SOIFDpdvbd1; - double B3SOIFDpw0; - double B3SOIFDpnlx; - double B3SOIFDpdvt0; - double B3SOIFDpdvt1; - double B3SOIFDpdvt2; - double B3SOIFDpdvt0w; - double B3SOIFDpdvt1w; - double B3SOIFDpdvt2w; - double B3SOIFDpu0; - double B3SOIFDpua; - double B3SOIFDpub; - double B3SOIFDpuc; - double B3SOIFDpvsat; - double B3SOIFDpa0; - double B3SOIFDpags; - double B3SOIFDpb0; - double B3SOIFDpb1; - double B3SOIFDpketa; - double B3SOIFDpabp; - double B3SOIFDpmxc; - double B3SOIFDpadice0; - double B3SOIFDpa1; - double B3SOIFDpa2; - double B3SOIFDprdsw; - double B3SOIFDpprwb; - double B3SOIFDpprwg; - double B3SOIFDpwr; - double B3SOIFDpnfactor; - double B3SOIFDpdwg; - double B3SOIFDpdwb; - double B3SOIFDpvoff; - double B3SOIFDpeta0; - double B3SOIFDpetab; - double B3SOIFDpdsub; - double B3SOIFDpcit; - double B3SOIFDpcdsc; - double B3SOIFDpcdscb; - double B3SOIFDpcdscd; - double B3SOIFDppclm; - double B3SOIFDppdibl1; - double B3SOIFDppdibl2; - double B3SOIFDppdiblb; - double B3SOIFDpdrout; - double B3SOIFDppvag; - double B3SOIFDpdelta; - double B3SOIFDpaii; - double B3SOIFDpbii; - double B3SOIFDpcii; - double B3SOIFDpdii; - double B3SOIFDpalpha0; - double B3SOIFDpalpha1; - double B3SOIFDpbeta0; - double B3SOIFDpagidl; - double B3SOIFDpbgidl; - double B3SOIFDpngidl; - double B3SOIFDpntun; - double B3SOIFDpndiode; - double B3SOIFDpisbjt; - double B3SOIFDpisdif; - double B3SOIFDpisrec; - double B3SOIFDpistun; - double B3SOIFDpedl; - double B3SOIFDpkbjt1; - /* CV model */ - double B3SOIFDpvsdfb; - double B3SOIFDpvsdth; -/* Added for binning - END1 */ - -/* Pre-calculated constants */ - double B3SOIFDcbox; - double B3SOIFDcsi; - double B3SOIFDcsieff; - double B3SOIFDcoxt; - double B3SOIFDcboxt; - double B3SOIFDcsit; - double B3SOIFDnfb; - double B3SOIFDadice; - double B3SOIFDqsi; - double B3SOIFDqsieff; - double B3SOIFDeg0; - - /* MCJ: move to size-dependent param. */ - double B3SOIFDvtm; - double B3SOIFDcox; - double B3SOIFDcof1; - double B3SOIFDcof2; - double B3SOIFDcof3; - double B3SOIFDcof4; - double B3SOIFDvcrit; - double B3SOIFDfactor1; - - double B3SOIFDoxideTrapDensityA; - double B3SOIFDoxideTrapDensityB; - double B3SOIFDoxideTrapDensityC; - double B3SOIFDem; - double B3SOIFDef; - double B3SOIFDaf; - double B3SOIFDkf; - double B3SOIFDnoif; - - struct b3soifdSizeDependParam *pSizeDependParamKnot; - - /* Flags */ - - unsigned B3SOIFDtboxGiven:1; - unsigned B3SOIFDtsiGiven :1; - unsigned B3SOIFDxjGiven :1; - unsigned B3SOIFDkb1Given :1; - unsigned B3SOIFDkb3Given :1; - unsigned B3SOIFDdvbd0Given :1; - unsigned B3SOIFDdvbd1Given :1; - unsigned B3SOIFDvbsaGiven :1; - unsigned B3SOIFDdelpGiven :1; - unsigned B3SOIFDrbodyGiven :1; - unsigned B3SOIFDrbshGiven :1; - unsigned B3SOIFDadice0Given :1; - unsigned B3SOIFDabpGiven :1; - unsigned B3SOIFDmxcGiven :1; - unsigned B3SOIFDrth0Given :1; - unsigned B3SOIFDcth0Given :1; - unsigned B3SOIFDaiiGiven :1; - unsigned B3SOIFDbiiGiven :1; - unsigned B3SOIFDciiGiven :1; - unsigned B3SOIFDdiiGiven :1; - unsigned B3SOIFDngidlGiven :1; - unsigned B3SOIFDagidlGiven :1; - unsigned B3SOIFDbgidlGiven :1; - unsigned B3SOIFDndiodeGiven :1; - unsigned B3SOIFDntunGiven :1; - unsigned B3SOIFDisbjtGiven :1; - unsigned B3SOIFDisdifGiven :1; - unsigned B3SOIFDisrecGiven :1; - unsigned B3SOIFDistunGiven :1; - unsigned B3SOIFDxbjtGiven :1; - unsigned B3SOIFDxdifGiven :1; - unsigned B3SOIFDxrecGiven :1; - unsigned B3SOIFDxtunGiven :1; - unsigned B3SOIFDedlGiven :1; - unsigned B3SOIFDkbjt1Given :1; - unsigned B3SOIFDttGiven :1; - unsigned B3SOIFDvsdfbGiven :1; - unsigned B3SOIFDvsdthGiven :1; - unsigned B3SOIFDasdGiven :1; - unsigned B3SOIFDcsdminGiven :1; - - unsigned B3SOIFDmobModGiven :1; - unsigned B3SOIFDbinUnitGiven :1; - unsigned B3SOIFDcapModGiven :1; - unsigned B3SOIFDparamChkGiven :1; - unsigned B3SOIFDnoiModGiven :1; - unsigned B3SOIFDshModGiven :1; - unsigned B3SOIFDtypeGiven :1; - unsigned B3SOIFDtoxGiven :1; - unsigned B3SOIFDversionGiven :1; - - unsigned B3SOIFDcdscGiven :1; - unsigned B3SOIFDcdscbGiven :1; - unsigned B3SOIFDcdscdGiven :1; - unsigned B3SOIFDcitGiven :1; - unsigned B3SOIFDnfactorGiven :1; - unsigned B3SOIFDvsatGiven :1; - unsigned B3SOIFDatGiven :1; - unsigned B3SOIFDa0Given :1; - unsigned B3SOIFDagsGiven :1; - unsigned B3SOIFDa1Given :1; - unsigned B3SOIFDa2Given :1; - unsigned B3SOIFDketaGiven :1; - unsigned B3SOIFDnsubGiven :1; - unsigned B3SOIFDnpeakGiven :1; - unsigned B3SOIFDngateGiven :1; - unsigned B3SOIFDgamma1Given :1; - unsigned B3SOIFDgamma2Given :1; - unsigned B3SOIFDvbxGiven :1; - unsigned B3SOIFDvbmGiven :1; - unsigned B3SOIFDxtGiven :1; - unsigned B3SOIFDk1Given :1; - unsigned B3SOIFDkt1Given :1; - unsigned B3SOIFDkt1lGiven :1; - unsigned B3SOIFDkt2Given :1; - unsigned B3SOIFDk2Given :1; - unsigned B3SOIFDk3Given :1; - unsigned B3SOIFDk3bGiven :1; - unsigned B3SOIFDw0Given :1; - unsigned B3SOIFDnlxGiven :1; - unsigned B3SOIFDdvt0Given :1; - unsigned B3SOIFDdvt1Given :1; - unsigned B3SOIFDdvt2Given :1; - unsigned B3SOIFDdvt0wGiven :1; - unsigned B3SOIFDdvt1wGiven :1; - unsigned B3SOIFDdvt2wGiven :1; - unsigned B3SOIFDdroutGiven :1; - unsigned B3SOIFDdsubGiven :1; - unsigned B3SOIFDvth0Given :1; - unsigned B3SOIFDuaGiven :1; - unsigned B3SOIFDua1Given :1; - unsigned B3SOIFDubGiven :1; - unsigned B3SOIFDub1Given :1; - unsigned B3SOIFDucGiven :1; - unsigned B3SOIFDuc1Given :1; - unsigned B3SOIFDu0Given :1; - unsigned B3SOIFDuteGiven :1; - unsigned B3SOIFDvoffGiven :1; - unsigned B3SOIFDrdswGiven :1; - unsigned B3SOIFDprwgGiven :1; - unsigned B3SOIFDprwbGiven :1; - unsigned B3SOIFDprtGiven :1; - unsigned B3SOIFDeta0Given :1; - unsigned B3SOIFDetabGiven :1; - unsigned B3SOIFDpclmGiven :1; - unsigned B3SOIFDpdibl1Given :1; - unsigned B3SOIFDpdibl2Given :1; - unsigned B3SOIFDpdiblbGiven :1; - unsigned B3SOIFDpvagGiven :1; - unsigned B3SOIFDdeltaGiven :1; - unsigned B3SOIFDwrGiven :1; - unsigned B3SOIFDdwgGiven :1; - unsigned B3SOIFDdwbGiven :1; - unsigned B3SOIFDb0Given :1; - unsigned B3SOIFDb1Given :1; - unsigned B3SOIFDalpha0Given :1; - unsigned B3SOIFDalpha1Given :1; - unsigned B3SOIFDbeta0Given :1; - - /* CV model */ - unsigned B3SOIFDcgslGiven :1; - unsigned B3SOIFDcgdlGiven :1; - unsigned B3SOIFDckappaGiven :1; - unsigned B3SOIFDcfGiven :1; - unsigned B3SOIFDclcGiven :1; - unsigned B3SOIFDcleGiven :1; - unsigned B3SOIFDdwcGiven :1; - unsigned B3SOIFDdlcGiven :1; - -/* Added for binning - START2 */ - /* Length Dependence */ - unsigned B3SOIFDlnpeakGiven :1; - unsigned B3SOIFDlnsubGiven :1; - unsigned B3SOIFDlngateGiven :1; - unsigned B3SOIFDlvth0Given :1; - unsigned B3SOIFDlk1Given :1; - unsigned B3SOIFDlk2Given :1; - unsigned B3SOIFDlk3Given :1; - unsigned B3SOIFDlk3bGiven :1; - unsigned B3SOIFDlvbsaGiven :1; - unsigned B3SOIFDldelpGiven :1; - unsigned B3SOIFDlkb1Given :1; - unsigned B3SOIFDlkb3Given :1; - unsigned B3SOIFDldvbd0Given :1; - unsigned B3SOIFDldvbd1Given :1; - unsigned B3SOIFDlw0Given :1; - unsigned B3SOIFDlnlxGiven :1; - unsigned B3SOIFDldvt0Given :1; - unsigned B3SOIFDldvt1Given :1; - unsigned B3SOIFDldvt2Given :1; - unsigned B3SOIFDldvt0wGiven :1; - unsigned B3SOIFDldvt1wGiven :1; - unsigned B3SOIFDldvt2wGiven :1; - unsigned B3SOIFDlu0Given :1; - unsigned B3SOIFDluaGiven :1; - unsigned B3SOIFDlubGiven :1; - unsigned B3SOIFDlucGiven :1; - unsigned B3SOIFDlvsatGiven :1; - unsigned B3SOIFDla0Given :1; - unsigned B3SOIFDlagsGiven :1; - unsigned B3SOIFDlb0Given :1; - unsigned B3SOIFDlb1Given :1; - unsigned B3SOIFDlketaGiven :1; - unsigned B3SOIFDlabpGiven :1; - unsigned B3SOIFDlmxcGiven :1; - unsigned B3SOIFDladice0Given :1; - unsigned B3SOIFDla1Given :1; - unsigned B3SOIFDla2Given :1; - unsigned B3SOIFDlrdswGiven :1; - unsigned B3SOIFDlprwbGiven :1; - unsigned B3SOIFDlprwgGiven :1; - unsigned B3SOIFDlwrGiven :1; - unsigned B3SOIFDlnfactorGiven :1; - unsigned B3SOIFDldwgGiven :1; - unsigned B3SOIFDldwbGiven :1; - unsigned B3SOIFDlvoffGiven :1; - unsigned B3SOIFDleta0Given :1; - unsigned B3SOIFDletabGiven :1; - unsigned B3SOIFDldsubGiven :1; - unsigned B3SOIFDlcitGiven :1; - unsigned B3SOIFDlcdscGiven :1; - unsigned B3SOIFDlcdscbGiven :1; - unsigned B3SOIFDlcdscdGiven :1; - unsigned B3SOIFDlpclmGiven :1; - unsigned B3SOIFDlpdibl1Given :1; - unsigned B3SOIFDlpdibl2Given :1; - unsigned B3SOIFDlpdiblbGiven :1; - unsigned B3SOIFDldroutGiven :1; - unsigned B3SOIFDlpvagGiven :1; - unsigned B3SOIFDldeltaGiven :1; - unsigned B3SOIFDlaiiGiven :1; - unsigned B3SOIFDlbiiGiven :1; - unsigned B3SOIFDlciiGiven :1; - unsigned B3SOIFDldiiGiven :1; - unsigned B3SOIFDlalpha0Given :1; - unsigned B3SOIFDlalpha1Given :1; - unsigned B3SOIFDlbeta0Given :1; - unsigned B3SOIFDlagidlGiven :1; - unsigned B3SOIFDlbgidlGiven :1; - unsigned B3SOIFDlngidlGiven :1; - unsigned B3SOIFDlntunGiven :1; - unsigned B3SOIFDlndiodeGiven :1; - unsigned B3SOIFDlisbjtGiven :1; - unsigned B3SOIFDlisdifGiven :1; - unsigned B3SOIFDlisrecGiven :1; - unsigned B3SOIFDlistunGiven :1; - unsigned B3SOIFDledlGiven :1; - unsigned B3SOIFDlkbjt1Given :1; - /* CV model */ - unsigned B3SOIFDlvsdfbGiven :1; - unsigned B3SOIFDlvsdthGiven :1; - - /* Width Dependence */ - unsigned B3SOIFDwnpeakGiven :1; - unsigned B3SOIFDwnsubGiven :1; - unsigned B3SOIFDwngateGiven :1; - unsigned B3SOIFDwvth0Given :1; - unsigned B3SOIFDwk1Given :1; - unsigned B3SOIFDwk2Given :1; - unsigned B3SOIFDwk3Given :1; - unsigned B3SOIFDwk3bGiven :1; - unsigned B3SOIFDwvbsaGiven :1; - unsigned B3SOIFDwdelpGiven :1; - unsigned B3SOIFDwkb1Given :1; - unsigned B3SOIFDwkb3Given :1; - unsigned B3SOIFDwdvbd0Given :1; - unsigned B3SOIFDwdvbd1Given :1; - unsigned B3SOIFDww0Given :1; - unsigned B3SOIFDwnlxGiven :1; - unsigned B3SOIFDwdvt0Given :1; - unsigned B3SOIFDwdvt1Given :1; - unsigned B3SOIFDwdvt2Given :1; - unsigned B3SOIFDwdvt0wGiven :1; - unsigned B3SOIFDwdvt1wGiven :1; - unsigned B3SOIFDwdvt2wGiven :1; - unsigned B3SOIFDwu0Given :1; - unsigned B3SOIFDwuaGiven :1; - unsigned B3SOIFDwubGiven :1; - unsigned B3SOIFDwucGiven :1; - unsigned B3SOIFDwvsatGiven :1; - unsigned B3SOIFDwa0Given :1; - unsigned B3SOIFDwagsGiven :1; - unsigned B3SOIFDwb0Given :1; - unsigned B3SOIFDwb1Given :1; - unsigned B3SOIFDwketaGiven :1; - unsigned B3SOIFDwabpGiven :1; - unsigned B3SOIFDwmxcGiven :1; - unsigned B3SOIFDwadice0Given :1; - unsigned B3SOIFDwa1Given :1; - unsigned B3SOIFDwa2Given :1; - unsigned B3SOIFDwrdswGiven :1; - unsigned B3SOIFDwprwbGiven :1; - unsigned B3SOIFDwprwgGiven :1; - unsigned B3SOIFDwwrGiven :1; - unsigned B3SOIFDwnfactorGiven :1; - unsigned B3SOIFDwdwgGiven :1; - unsigned B3SOIFDwdwbGiven :1; - unsigned B3SOIFDwvoffGiven :1; - unsigned B3SOIFDweta0Given :1; - unsigned B3SOIFDwetabGiven :1; - unsigned B3SOIFDwdsubGiven :1; - unsigned B3SOIFDwcitGiven :1; - unsigned B3SOIFDwcdscGiven :1; - unsigned B3SOIFDwcdscbGiven :1; - unsigned B3SOIFDwcdscdGiven :1; - unsigned B3SOIFDwpclmGiven :1; - unsigned B3SOIFDwpdibl1Given :1; - unsigned B3SOIFDwpdibl2Given :1; - unsigned B3SOIFDwpdiblbGiven :1; - unsigned B3SOIFDwdroutGiven :1; - unsigned B3SOIFDwpvagGiven :1; - unsigned B3SOIFDwdeltaGiven :1; - unsigned B3SOIFDwaiiGiven :1; - unsigned B3SOIFDwbiiGiven :1; - unsigned B3SOIFDwciiGiven :1; - unsigned B3SOIFDwdiiGiven :1; - unsigned B3SOIFDwalpha0Given :1; - unsigned B3SOIFDwalpha1Given :1; - unsigned B3SOIFDwbeta0Given :1; - unsigned B3SOIFDwagidlGiven :1; - unsigned B3SOIFDwbgidlGiven :1; - unsigned B3SOIFDwngidlGiven :1; - unsigned B3SOIFDwntunGiven :1; - unsigned B3SOIFDwndiodeGiven :1; - unsigned B3SOIFDwisbjtGiven :1; - unsigned B3SOIFDwisdifGiven :1; - unsigned B3SOIFDwisrecGiven :1; - unsigned B3SOIFDwistunGiven :1; - unsigned B3SOIFDwedlGiven :1; - unsigned B3SOIFDwkbjt1Given :1; - /* CV model */ - unsigned B3SOIFDwvsdfbGiven :1; - unsigned B3SOIFDwvsdthGiven :1; - - /* Cross-term Dependence */ - unsigned B3SOIFDpnpeakGiven :1; - unsigned B3SOIFDpnsubGiven :1; - unsigned B3SOIFDpngateGiven :1; - unsigned B3SOIFDpvth0Given :1; - unsigned B3SOIFDpk1Given :1; - unsigned B3SOIFDpk2Given :1; - unsigned B3SOIFDpk3Given :1; - unsigned B3SOIFDpk3bGiven :1; - unsigned B3SOIFDpvbsaGiven :1; - unsigned B3SOIFDpdelpGiven :1; - unsigned B3SOIFDpkb1Given :1; - unsigned B3SOIFDpkb3Given :1; - unsigned B3SOIFDpdvbd0Given :1; - unsigned B3SOIFDpdvbd1Given :1; - unsigned B3SOIFDpw0Given :1; - unsigned B3SOIFDpnlxGiven :1; - unsigned B3SOIFDpdvt0Given :1; - unsigned B3SOIFDpdvt1Given :1; - unsigned B3SOIFDpdvt2Given :1; - unsigned B3SOIFDpdvt0wGiven :1; - unsigned B3SOIFDpdvt1wGiven :1; - unsigned B3SOIFDpdvt2wGiven :1; - unsigned B3SOIFDpu0Given :1; - unsigned B3SOIFDpuaGiven :1; - unsigned B3SOIFDpubGiven :1; - unsigned B3SOIFDpucGiven :1; - unsigned B3SOIFDpvsatGiven :1; - unsigned B3SOIFDpa0Given :1; - unsigned B3SOIFDpagsGiven :1; - unsigned B3SOIFDpb0Given :1; - unsigned B3SOIFDpb1Given :1; - unsigned B3SOIFDpketaGiven :1; - unsigned B3SOIFDpabpGiven :1; - unsigned B3SOIFDpmxcGiven :1; - unsigned B3SOIFDpadice0Given :1; - unsigned B3SOIFDpa1Given :1; - unsigned B3SOIFDpa2Given :1; - unsigned B3SOIFDprdswGiven :1; - unsigned B3SOIFDpprwbGiven :1; - unsigned B3SOIFDpprwgGiven :1; - unsigned B3SOIFDpwrGiven :1; - unsigned B3SOIFDpnfactorGiven :1; - unsigned B3SOIFDpdwgGiven :1; - unsigned B3SOIFDpdwbGiven :1; - unsigned B3SOIFDpvoffGiven :1; - unsigned B3SOIFDpeta0Given :1; - unsigned B3SOIFDpetabGiven :1; - unsigned B3SOIFDpdsubGiven :1; - unsigned B3SOIFDpcitGiven :1; - unsigned B3SOIFDpcdscGiven :1; - unsigned B3SOIFDpcdscbGiven :1; - unsigned B3SOIFDpcdscdGiven :1; - unsigned B3SOIFDppclmGiven :1; - unsigned B3SOIFDppdibl1Given :1; - unsigned B3SOIFDppdibl2Given :1; - unsigned B3SOIFDppdiblbGiven :1; - unsigned B3SOIFDpdroutGiven :1; - unsigned B3SOIFDppvagGiven :1; - unsigned B3SOIFDpdeltaGiven :1; - unsigned B3SOIFDpaiiGiven :1; - unsigned B3SOIFDpbiiGiven :1; - unsigned B3SOIFDpciiGiven :1; - unsigned B3SOIFDpdiiGiven :1; - unsigned B3SOIFDpalpha0Given :1; - unsigned B3SOIFDpalpha1Given :1; - unsigned B3SOIFDpbeta0Given :1; - unsigned B3SOIFDpagidlGiven :1; - unsigned B3SOIFDpbgidlGiven :1; - unsigned B3SOIFDpngidlGiven :1; - unsigned B3SOIFDpntunGiven :1; - unsigned B3SOIFDpndiodeGiven :1; - unsigned B3SOIFDpisbjtGiven :1; - unsigned B3SOIFDpisdifGiven :1; - unsigned B3SOIFDpisrecGiven :1; - unsigned B3SOIFDpistunGiven :1; - unsigned B3SOIFDpedlGiven :1; - unsigned B3SOIFDpkbjt1Given :1; - /* CV model */ - unsigned B3SOIFDpvsdfbGiven :1; - unsigned B3SOIFDpvsdthGiven :1; -/* Added for binning - END2 */ - - unsigned B3SOIFDuseFringeGiven :1; - - unsigned B3SOIFDtnomGiven :1; - unsigned B3SOIFDcgsoGiven :1; - unsigned B3SOIFDcgdoGiven :1; - unsigned B3SOIFDcgeoGiven :1; - unsigned B3SOIFDxpartGiven :1; - unsigned B3SOIFDsheetResistanceGiven :1; - unsigned B3SOIFDGatesidewallJctPotentialGiven :1; - unsigned B3SOIFDbodyJctGateSideGradingCoeffGiven :1; - unsigned B3SOIFDunitLengthGateSidewallJctCapGiven :1; - unsigned B3SOIFDcsdeswGiven :1; - - unsigned B3SOIFDoxideTrapDensityAGiven :1; - unsigned B3SOIFDoxideTrapDensityBGiven :1; - unsigned B3SOIFDoxideTrapDensityCGiven :1; - unsigned B3SOIFDemGiven :1; - unsigned B3SOIFDefGiven :1; - unsigned B3SOIFDafGiven :1; - unsigned B3SOIFDkfGiven :1; - unsigned B3SOIFDnoifGiven :1; - - unsigned B3SOIFDLintGiven :1; - unsigned B3SOIFDLlGiven :1; - unsigned B3SOIFDLlnGiven :1; - unsigned B3SOIFDLwGiven :1; - unsigned B3SOIFDLwnGiven :1; - unsigned B3SOIFDLwlGiven :1; - unsigned B3SOIFDLminGiven :1; - unsigned B3SOIFDLmaxGiven :1; - - unsigned B3SOIFDWintGiven :1; - unsigned B3SOIFDWlGiven :1; - unsigned B3SOIFDWlnGiven :1; - unsigned B3SOIFDWwGiven :1; - unsigned B3SOIFDWwnGiven :1; - unsigned B3SOIFDWwlGiven :1; - unsigned B3SOIFDWminGiven :1; - unsigned B3SOIFDWmaxGiven :1; - -} B3SOIFDmodel; - - -#ifndef NMOS -#define NMOS 1 -#define PMOS -1 -#endif /*NMOS*/ - - -/* device parameters */ -#define B3SOIFD_W 1 -#define B3SOIFD_L 2 -#define B3SOIFD_M 22 -#define B3SOIFD_AS 3 -#define B3SOIFD_AD 4 -#define B3SOIFD_PS 5 -#define B3SOIFD_PD 6 -#define B3SOIFD_NRS 7 -#define B3SOIFD_NRD 8 -#define B3SOIFD_OFF 9 -#define B3SOIFD_IC_VBS 10 -#define B3SOIFD_IC_VDS 11 -#define B3SOIFD_IC_VGS 12 -#define B3SOIFD_IC_VES 13 -#define B3SOIFD_IC_VPS 14 -#define B3SOIFD_BJTOFF 15 -#define B3SOIFD_RTH0 16 -#define B3SOIFD_CTH0 17 -#define B3SOIFD_NRB 18 -#define B3SOIFD_IC 19 -#define B3SOIFD_NQSMOD 20 -#define B3SOIFD_DEBUG 21 - -/* model parameters */ -#define B3SOIFD_MOD_CAPMOD 101 -#define B3SOIFD_MOD_NQSMOD 102 -#define B3SOIFD_MOD_MOBMOD 103 -#define B3SOIFD_MOD_NOIMOD 104 -#define B3SOIFD_MOD_SHMOD 105 -#define B3SOIFD_MOD_DDMOD 106 - -#define B3SOIFD_MOD_TOX 107 - - - -#define B3SOIFD_MOD_CDSC 108 -#define B3SOIFD_MOD_CDSCB 109 -#define B3SOIFD_MOD_CIT 110 -#define B3SOIFD_MOD_NFACTOR 111 -#define B3SOIFD_MOD_XJ 112 -#define B3SOIFD_MOD_VSAT 113 -#define B3SOIFD_MOD_AT 114 -#define B3SOIFD_MOD_A0 115 -#define B3SOIFD_MOD_A1 116 -#define B3SOIFD_MOD_A2 117 -#define B3SOIFD_MOD_KETA 118 -#define B3SOIFD_MOD_NSUB 119 -#define B3SOIFD_MOD_NPEAK 120 -#define B3SOIFD_MOD_NGATE 121 -#define B3SOIFD_MOD_GAMMA1 122 -#define B3SOIFD_MOD_GAMMA2 123 -#define B3SOIFD_MOD_VBX 124 -#define B3SOIFD_MOD_BINUNIT 125 - -#define B3SOIFD_MOD_VBM 126 - -#define B3SOIFD_MOD_XT 127 -#define B3SOIFD_MOD_K1 129 -#define B3SOIFD_MOD_KT1 130 -#define B3SOIFD_MOD_KT1L 131 -#define B3SOIFD_MOD_K2 132 -#define B3SOIFD_MOD_KT2 133 -#define B3SOIFD_MOD_K3 134 -#define B3SOIFD_MOD_K3B 135 -#define B3SOIFD_MOD_W0 136 -#define B3SOIFD_MOD_NLX 137 - -#define B3SOIFD_MOD_DVT0 138 -#define B3SOIFD_MOD_DVT1 139 -#define B3SOIFD_MOD_DVT2 140 - -#define B3SOIFD_MOD_DVT0W 141 -#define B3SOIFD_MOD_DVT1W 142 -#define B3SOIFD_MOD_DVT2W 143 - -#define B3SOIFD_MOD_DROUT 144 -#define B3SOIFD_MOD_DSUB 145 -#define B3SOIFD_MOD_VTH0 146 -#define B3SOIFD_MOD_UA 147 -#define B3SOIFD_MOD_UA1 148 -#define B3SOIFD_MOD_UB 149 -#define B3SOIFD_MOD_UB1 150 -#define B3SOIFD_MOD_UC 151 -#define B3SOIFD_MOD_UC1 152 -#define B3SOIFD_MOD_U0 153 -#define B3SOIFD_MOD_UTE 154 -#define B3SOIFD_MOD_VOFF 155 -#define B3SOIFD_MOD_DELTA 156 -#define B3SOIFD_MOD_RDSW 157 -#define B3SOIFD_MOD_PRT 158 -#define B3SOIFD_MOD_LDD 159 -#define B3SOIFD_MOD_ETA 160 -#define B3SOIFD_MOD_ETA0 161 -#define B3SOIFD_MOD_ETAB 162 -#define B3SOIFD_MOD_PCLM 163 -#define B3SOIFD_MOD_PDIBL1 164 -#define B3SOIFD_MOD_PDIBL2 165 -#define B3SOIFD_MOD_PSCBE1 166 -#define B3SOIFD_MOD_PSCBE2 167 -#define B3SOIFD_MOD_PVAG 168 -#define B3SOIFD_MOD_WR 169 -#define B3SOIFD_MOD_DWG 170 -#define B3SOIFD_MOD_DWB 171 -#define B3SOIFD_MOD_B0 172 -#define B3SOIFD_MOD_B1 173 -#define B3SOIFD_MOD_ALPHA0 174 -#define B3SOIFD_MOD_BETA0 175 -#define B3SOIFD_MOD_PDIBLB 178 - -#define B3SOIFD_MOD_PRWG 179 -#define B3SOIFD_MOD_PRWB 180 - -#define B3SOIFD_MOD_CDSCD 181 -#define B3SOIFD_MOD_AGS 182 - -#define B3SOIFD_MOD_FRINGE 184 -#define B3SOIFD_MOD_CGSL 186 -#define B3SOIFD_MOD_CGDL 187 -#define B3SOIFD_MOD_CKAPPA 188 -#define B3SOIFD_MOD_CF 189 -#define B3SOIFD_MOD_CLC 190 -#define B3SOIFD_MOD_CLE 191 -#define B3SOIFD_MOD_PARAMCHK 192 -#define B3SOIFD_MOD_VERSION 193 - -#define B3SOIFD_MOD_TBOX 195 -#define B3SOIFD_MOD_TSI 196 -#define B3SOIFD_MOD_KB1 197 -#define B3SOIFD_MOD_KB3 198 -#define B3SOIFD_MOD_DVBD0 199 -#define B3SOIFD_MOD_DVBD1 200 -#define B3SOIFD_MOD_DELP 201 -#define B3SOIFD_MOD_VBSA 202 -#define B3SOIFD_MOD_RBODY 204 -#define B3SOIFD_MOD_ADICE0 205 -#define B3SOIFD_MOD_ABP 206 -#define B3SOIFD_MOD_MXC 207 -#define B3SOIFD_MOD_RTH0 208 -#define B3SOIFD_MOD_CTH0 209 -#define B3SOIFD_MOD_AII 210 -#define B3SOIFD_MOD_BII 211 -#define B3SOIFD_MOD_CII 212 -#define B3SOIFD_MOD_DII 213 -#define B3SOIFD_MOD_ALPHA1 214 -#define B3SOIFD_MOD_NGIDL 215 -#define B3SOIFD_MOD_AGIDL 216 -#define B3SOIFD_MOD_BGIDL 217 -#define B3SOIFD_MOD_NDIODE 218 -#define B3SOIFD_MOD_LDIOF 219 -#define B3SOIFD_MOD_LDIOR 220 -#define B3SOIFD_MOD_NTUN 221 -#define B3SOIFD_MOD_ISBJT 222 -#define B3SOIFD_MOD_ISDIF 223 -#define B3SOIFD_MOD_ISREC 224 -#define B3SOIFD_MOD_ISTUN 225 -#define B3SOIFD_MOD_XBJT 226 -#define B3SOIFD_MOD_XDIF 227 -#define B3SOIFD_MOD_XREC 228 -#define B3SOIFD_MOD_XTUN 229 -#define B3SOIFD_MOD_EDL 230 -#define B3SOIFD_MOD_KBJT1 231 -#define B3SOIFD_MOD_TT 232 -#define B3SOIFD_MOD_VSDTH 233 -#define B3SOIFD_MOD_VSDFB 234 -#define B3SOIFD_MOD_ASD 235 -#define B3SOIFD_MOD_CSDMIN 236 -#define B3SOIFD_MOD_RBSH 237 - -/* Added for binning - START3 */ -/* Length dependence */ -#define B3SOIFD_MOD_LNPEAK 301 -#define B3SOIFD_MOD_LNSUB 302 -#define B3SOIFD_MOD_LNGATE 303 -#define B3SOIFD_MOD_LVTH0 304 -#define B3SOIFD_MOD_LK1 305 -#define B3SOIFD_MOD_LK2 306 -#define B3SOIFD_MOD_LK3 307 -#define B3SOIFD_MOD_LK3B 308 -#define B3SOIFD_MOD_LVBSA 309 -#define B3SOIFD_MOD_LDELP 310 -#define B3SOIFD_MOD_LKB1 311 -#define B3SOIFD_MOD_LKB3 312 -#define B3SOIFD_MOD_LDVBD0 313 -#define B3SOIFD_MOD_LDVBD1 314 -#define B3SOIFD_MOD_LW0 315 -#define B3SOIFD_MOD_LNLX 316 -#define B3SOIFD_MOD_LDVT0 317 -#define B3SOIFD_MOD_LDVT1 318 -#define B3SOIFD_MOD_LDVT2 319 -#define B3SOIFD_MOD_LDVT0W 320 -#define B3SOIFD_MOD_LDVT1W 321 -#define B3SOIFD_MOD_LDVT2W 322 -#define B3SOIFD_MOD_LU0 323 -#define B3SOIFD_MOD_LUA 324 -#define B3SOIFD_MOD_LUB 325 -#define B3SOIFD_MOD_LUC 326 -#define B3SOIFD_MOD_LVSAT 327 -#define B3SOIFD_MOD_LA0 328 -#define B3SOIFD_MOD_LAGS 329 -#define B3SOIFD_MOD_LB0 330 -#define B3SOIFD_MOD_LB1 331 -#define B3SOIFD_MOD_LKETA 332 -#define B3SOIFD_MOD_LABP 333 -#define B3SOIFD_MOD_LMXC 334 -#define B3SOIFD_MOD_LADICE0 335 -#define B3SOIFD_MOD_LA1 336 -#define B3SOIFD_MOD_LA2 337 -#define B3SOIFD_MOD_LRDSW 338 -#define B3SOIFD_MOD_LPRWB 339 -#define B3SOIFD_MOD_LPRWG 340 -#define B3SOIFD_MOD_LWR 341 -#define B3SOIFD_MOD_LNFACTOR 342 -#define B3SOIFD_MOD_LDWG 343 -#define B3SOIFD_MOD_LDWB 344 -#define B3SOIFD_MOD_LVOFF 345 -#define B3SOIFD_MOD_LETA0 346 -#define B3SOIFD_MOD_LETAB 347 -#define B3SOIFD_MOD_LDSUB 348 -#define B3SOIFD_MOD_LCIT 349 -#define B3SOIFD_MOD_LCDSC 350 -#define B3SOIFD_MOD_LCDSCB 351 -#define B3SOIFD_MOD_LCDSCD 352 -#define B3SOIFD_MOD_LPCLM 353 -#define B3SOIFD_MOD_LPDIBL1 354 -#define B3SOIFD_MOD_LPDIBL2 355 -#define B3SOIFD_MOD_LPDIBLB 356 -#define B3SOIFD_MOD_LDROUT 357 -#define B3SOIFD_MOD_LPVAG 358 -#define B3SOIFD_MOD_LDELTA 359 -#define B3SOIFD_MOD_LAII 360 -#define B3SOIFD_MOD_LBII 361 -#define B3SOIFD_MOD_LCII 362 -#define B3SOIFD_MOD_LDII 363 -#define B3SOIFD_MOD_LALPHA0 364 -#define B3SOIFD_MOD_LALPHA1 365 -#define B3SOIFD_MOD_LBETA0 366 -#define B3SOIFD_MOD_LAGIDL 367 -#define B3SOIFD_MOD_LBGIDL 368 -#define B3SOIFD_MOD_LNGIDL 369 -#define B3SOIFD_MOD_LNTUN 370 -#define B3SOIFD_MOD_LNDIODE 371 -#define B3SOIFD_MOD_LISBJT 372 -#define B3SOIFD_MOD_LISDIF 373 -#define B3SOIFD_MOD_LISREC 374 -#define B3SOIFD_MOD_LISTUN 375 -#define B3SOIFD_MOD_LEDL 376 -#define B3SOIFD_MOD_LKBJT1 377 -#define B3SOIFD_MOD_LVSDFB 378 -#define B3SOIFD_MOD_LVSDTH 379 - -/* Width dependence */ -#define B3SOIFD_MOD_WNPEAK 401 -#define B3SOIFD_MOD_WNSUB 402 -#define B3SOIFD_MOD_WNGATE 403 -#define B3SOIFD_MOD_WVTH0 404 -#define B3SOIFD_MOD_WK1 405 -#define B3SOIFD_MOD_WK2 406 -#define B3SOIFD_MOD_WK3 407 -#define B3SOIFD_MOD_WK3B 408 -#define B3SOIFD_MOD_WVBSA 409 -#define B3SOIFD_MOD_WDELP 410 -#define B3SOIFD_MOD_WKB1 411 -#define B3SOIFD_MOD_WKB3 412 -#define B3SOIFD_MOD_WDVBD0 413 -#define B3SOIFD_MOD_WDVBD1 414 -#define B3SOIFD_MOD_WW0 415 -#define B3SOIFD_MOD_WNLX 416 -#define B3SOIFD_MOD_WDVT0 417 -#define B3SOIFD_MOD_WDVT1 418 -#define B3SOIFD_MOD_WDVT2 419 -#define B3SOIFD_MOD_WDVT0W 420 -#define B3SOIFD_MOD_WDVT1W 421 -#define B3SOIFD_MOD_WDVT2W 422 -#define B3SOIFD_MOD_WU0 423 -#define B3SOIFD_MOD_WUA 424 -#define B3SOIFD_MOD_WUB 425 -#define B3SOIFD_MOD_WUC 426 -#define B3SOIFD_MOD_WVSAT 427 -#define B3SOIFD_MOD_WA0 428 -#define B3SOIFD_MOD_WAGS 429 -#define B3SOIFD_MOD_WB0 430 -#define B3SOIFD_MOD_WB1 431 -#define B3SOIFD_MOD_WKETA 432 -#define B3SOIFD_MOD_WABP 433 -#define B3SOIFD_MOD_WMXC 434 -#define B3SOIFD_MOD_WADICE0 435 -#define B3SOIFD_MOD_WA1 436 -#define B3SOIFD_MOD_WA2 437 -#define B3SOIFD_MOD_WRDSW 438 -#define B3SOIFD_MOD_WPRWB 439 -#define B3SOIFD_MOD_WPRWG 440 -#define B3SOIFD_MOD_WWR 441 -#define B3SOIFD_MOD_WNFACTOR 442 -#define B3SOIFD_MOD_WDWG 443 -#define B3SOIFD_MOD_WDWB 444 -#define B3SOIFD_MOD_WVOFF 445 -#define B3SOIFD_MOD_WETA0 446 -#define B3SOIFD_MOD_WETAB 447 -#define B3SOIFD_MOD_WDSUB 448 -#define B3SOIFD_MOD_WCIT 449 -#define B3SOIFD_MOD_WCDSC 450 -#define B3SOIFD_MOD_WCDSCB 451 -#define B3SOIFD_MOD_WCDSCD 452 -#define B3SOIFD_MOD_WPCLM 453 -#define B3SOIFD_MOD_WPDIBL1 454 -#define B3SOIFD_MOD_WPDIBL2 455 -#define B3SOIFD_MOD_WPDIBLB 456 -#define B3SOIFD_MOD_WDROUT 457 -#define B3SOIFD_MOD_WPVAG 458 -#define B3SOIFD_MOD_WDELTA 459 -#define B3SOIFD_MOD_WAII 460 -#define B3SOIFD_MOD_WBII 461 -#define B3SOIFD_MOD_WCII 462 -#define B3SOIFD_MOD_WDII 463 -#define B3SOIFD_MOD_WALPHA0 464 -#define B3SOIFD_MOD_WALPHA1 465 -#define B3SOIFD_MOD_WBETA0 466 -#define B3SOIFD_MOD_WAGIDL 467 -#define B3SOIFD_MOD_WBGIDL 468 -#define B3SOIFD_MOD_WNGIDL 469 -#define B3SOIFD_MOD_WNTUN 470 -#define B3SOIFD_MOD_WNDIODE 471 -#define B3SOIFD_MOD_WISBJT 472 -#define B3SOIFD_MOD_WISDIF 473 -#define B3SOIFD_MOD_WISREC 474 -#define B3SOIFD_MOD_WISTUN 475 -#define B3SOIFD_MOD_WEDL 476 -#define B3SOIFD_MOD_WKBJT1 477 -#define B3SOIFD_MOD_WVSDFB 478 -#define B3SOIFD_MOD_WVSDTH 479 - -/* Cross-term dependence */ -#define B3SOIFD_MOD_PNPEAK 501 -#define B3SOIFD_MOD_PNSUB 502 -#define B3SOIFD_MOD_PNGATE 503 -#define B3SOIFD_MOD_PVTH0 504 -#define B3SOIFD_MOD_PK1 505 -#define B3SOIFD_MOD_PK2 506 -#define B3SOIFD_MOD_PK3 507 -#define B3SOIFD_MOD_PK3B 508 -#define B3SOIFD_MOD_PVBSA 509 -#define B3SOIFD_MOD_PDELP 510 -#define B3SOIFD_MOD_PKB1 511 -#define B3SOIFD_MOD_PKB3 512 -#define B3SOIFD_MOD_PDVBD0 513 -#define B3SOIFD_MOD_PDVBD1 514 -#define B3SOIFD_MOD_PW0 515 -#define B3SOIFD_MOD_PNLX 516 -#define B3SOIFD_MOD_PDVT0 517 -#define B3SOIFD_MOD_PDVT1 518 -#define B3SOIFD_MOD_PDVT2 519 -#define B3SOIFD_MOD_PDVT0W 520 -#define B3SOIFD_MOD_PDVT1W 521 -#define B3SOIFD_MOD_PDVT2W 522 -#define B3SOIFD_MOD_PU0 523 -#define B3SOIFD_MOD_PUA 524 -#define B3SOIFD_MOD_PUB 525 -#define B3SOIFD_MOD_PUC 526 -#define B3SOIFD_MOD_PVSAT 527 -#define B3SOIFD_MOD_PA0 528 -#define B3SOIFD_MOD_PAGS 529 -#define B3SOIFD_MOD_PB0 530 -#define B3SOIFD_MOD_PB1 531 -#define B3SOIFD_MOD_PKETA 532 -#define B3SOIFD_MOD_PABP 533 -#define B3SOIFD_MOD_PMXC 534 -#define B3SOIFD_MOD_PADICE0 535 -#define B3SOIFD_MOD_PA1 536 -#define B3SOIFD_MOD_PA2 537 -#define B3SOIFD_MOD_PRDSW 538 -#define B3SOIFD_MOD_PPRWB 539 -#define B3SOIFD_MOD_PPRWG 540 -#define B3SOIFD_MOD_PWR 541 -#define B3SOIFD_MOD_PNFACTOR 542 -#define B3SOIFD_MOD_PDWG 543 -#define B3SOIFD_MOD_PDWB 544 -#define B3SOIFD_MOD_PVOFF 545 -#define B3SOIFD_MOD_PETA0 546 -#define B3SOIFD_MOD_PETAB 547 -#define B3SOIFD_MOD_PDSUB 548 -#define B3SOIFD_MOD_PCIT 549 -#define B3SOIFD_MOD_PCDSC 550 -#define B3SOIFD_MOD_PCDSCB 551 -#define B3SOIFD_MOD_PCDSCD 552 -#define B3SOIFD_MOD_PPCLM 553 -#define B3SOIFD_MOD_PPDIBL1 554 -#define B3SOIFD_MOD_PPDIBL2 555 -#define B3SOIFD_MOD_PPDIBLB 556 -#define B3SOIFD_MOD_PDROUT 557 -#define B3SOIFD_MOD_PPVAG 558 -#define B3SOIFD_MOD_PDELTA 559 -#define B3SOIFD_MOD_PAII 560 -#define B3SOIFD_MOD_PBII 561 -#define B3SOIFD_MOD_PCII 562 -#define B3SOIFD_MOD_PDII 563 -#define B3SOIFD_MOD_PALPHA0 564 -#define B3SOIFD_MOD_PALPHA1 565 -#define B3SOIFD_MOD_PBETA0 566 -#define B3SOIFD_MOD_PAGIDL 567 -#define B3SOIFD_MOD_PBGIDL 568 -#define B3SOIFD_MOD_PNGIDL 569 -#define B3SOIFD_MOD_PNTUN 570 -#define B3SOIFD_MOD_PNDIODE 571 -#define B3SOIFD_MOD_PISBJT 572 -#define B3SOIFD_MOD_PISDIF 573 -#define B3SOIFD_MOD_PISREC 574 -#define B3SOIFD_MOD_PISTUN 575 -#define B3SOIFD_MOD_PEDL 576 -#define B3SOIFD_MOD_PKBJT1 577 -#define B3SOIFD_MOD_PVSDFB 578 -#define B3SOIFD_MOD_PVSDTH 579 -/* Added for binning - END3 */ - -#define B3SOIFD_MOD_TNOM 701 -#define B3SOIFD_MOD_CGSO 702 -#define B3SOIFD_MOD_CGDO 703 -#define B3SOIFD_MOD_CGEO 704 -#define B3SOIFD_MOD_XPART 705 - -#define B3SOIFD_MOD_RSH 706 -#define B3SOIFD_MOD_NMOS 814 -#define B3SOIFD_MOD_PMOS 815 - -#define B3SOIFD_MOD_NOIA 816 -#define B3SOIFD_MOD_NOIB 817 -#define B3SOIFD_MOD_NOIC 818 - -#define B3SOIFD_MOD_LINT 819 -#define B3SOIFD_MOD_LL 820 -#define B3SOIFD_MOD_LLN 821 -#define B3SOIFD_MOD_LW 822 -#define B3SOIFD_MOD_LWN 823 -#define B3SOIFD_MOD_LWL 824 - -#define B3SOIFD_MOD_WINT 827 -#define B3SOIFD_MOD_WL 828 -#define B3SOIFD_MOD_WLN 829 -#define B3SOIFD_MOD_WW 830 -#define B3SOIFD_MOD_WWN 831 -#define B3SOIFD_MOD_WWL 832 - -#define B3SOIFD_MOD_DWC 835 -#define B3SOIFD_MOD_DLC 836 - -#define B3SOIFD_MOD_EM 837 -#define B3SOIFD_MOD_EF 838 -#define B3SOIFD_MOD_AF 839 -#define B3SOIFD_MOD_KF 840 -#define B3SOIFD_MOD_NOIF 841 - - -#define B3SOIFD_MOD_PBSWG 843 -#define B3SOIFD_MOD_MJSWG 844 -#define B3SOIFD_MOD_CJSWG 845 -#define B3SOIFD_MOD_CSDESW 846 - -/* device questions */ -#define B3SOIFD_DNODE 901 -#define B3SOIFD_GNODE 902 -#define B3SOIFD_SNODE 903 -#define B3SOIFD_BNODE 904 -#define B3SOIFD_ENODE 905 -#define B3SOIFD_DNODEPRIME 906 -#define B3SOIFD_SNODEPRIME 907 -#define B3SOIFD_VBD 908 -#define B3SOIFD_VBS 909 -#define B3SOIFD_VGS 910 -#define B3SOIFD_VES 911 -#define B3SOIFD_VDS 912 -#define B3SOIFD_CD 913 -#define B3SOIFD_CBS 914 -#define B3SOIFD_CBD 915 -#define B3SOIFD_GM 916 -#define B3SOIFD_GDS 917 -#define B3SOIFD_GMBS 918 -#define B3SOIFD_GBD 919 -#define B3SOIFD_GBS 920 -#define B3SOIFD_QB 921 -#define B3SOIFD_CQB 922 -#define B3SOIFD_QG 923 -#define B3SOIFD_CQG 924 -#define B3SOIFD_QD 925 -#define B3SOIFD_CQD 926 -#define B3SOIFD_CGG 927 -#define B3SOIFD_CGD 928 -#define B3SOIFD_CGS 929 -#define B3SOIFD_CBG 930 -#define B3SOIFD_CAPBD 931 -#define B3SOIFD_CQBD 932 -#define B3SOIFD_CAPBS 933 -#define B3SOIFD_CQBS 934 -#define B3SOIFD_CDG 935 -#define B3SOIFD_CDD 936 -#define B3SOIFD_CDS 937 -#define B3SOIFD_VON 938 -#define B3SOIFD_VDSAT 939 -#define B3SOIFD_QBS 940 -#define B3SOIFD_QBD 941 -#define B3SOIFD_SOURCECONDUCT 942 -#define B3SOIFD_DRAINCONDUCT 943 -#define B3SOIFD_CBDB 944 -#define B3SOIFD_CBSB 945 -#define B3SOIFD_GMID 946 - - -#include "b3soifdext.h" - -extern void B3SOIFDevaluate(double,double,double,B3SOIFDinstance*,B3SOIFDmodel*, - double*,double*,double*, double*, double*, double*, double*, - double*, double*, double*, double*, double*, double*, double*, - double*, double*, double*, double*, CKTcircuit*); -extern int B3SOIFDdebug(B3SOIFDmodel*, B3SOIFDinstance*, CKTcircuit*, int); -extern int B3SOIFDcheckModel(B3SOIFDmodel*, B3SOIFDinstance*, CKTcircuit*); - -#endif /*B3SOIFD*/ - diff --git a/src/spicelib/devices/bsim3soi_fd/b3soifdext.h b/src/spicelib/devices/bsim3soi_fd/b3soifdext.h deleted file mode 100644 index 7b3f69074..000000000 --- a/src/spicelib/devices/bsim3soi_fd/b3soifdext.h +++ /dev/null @@ -1,28 +0,0 @@ -/********** -Copyright 1999 Regents of the University of California. All rights reserved. -Author: 1998 Samuel Fung -Modified by Paolo Nenzi 2002 -File: b3soifdext.h -**********/ - -extern int B3SOIFDacLoad(GENmodel *,CKTcircuit*); -extern int B3SOIFDask(CKTcircuit *,GENinstance*,int,IFvalue*,IFvalue*); -extern int B3SOIFDconvTest(GENmodel *,CKTcircuit*); -extern int B3SOIFDgetic(GENmodel*,CKTcircuit*); -extern int B3SOIFDload(GENmodel*,CKTcircuit*); -extern int B3SOIFDmAsk(CKTcircuit*,GENmodel *,int, IFvalue*); -extern int B3SOIFDmParam(int,IFvalue*,GENmodel*); -extern void B3SOIFDmosCap(CKTcircuit*, double, double, double, double, - double, double, double, double, double, double, double, - double, double, double, double, double, double, double*, - double*, double*, double*, double*, double*, double*, double*, - double*, double*, double*, double*, double*, double*, double*, - double*); -extern int B3SOIFDparam(int,IFvalue*,GENinstance*,IFvalue*); -extern int B3SOIFDpzLoad(GENmodel*,CKTcircuit*,SPcomplex*); -extern int B3SOIFDsetup(SMPmatrix*,GENmodel*,CKTcircuit*,int*); -extern int B3SOIFDtemp(GENmodel*,CKTcircuit*); -extern int B3SOIFDtrunc(GENmodel*,CKTcircuit*,double*); -extern int B3SOIFDnoise(int,int,GENmodel*,CKTcircuit*,Ndata*,double*); -extern int B3SOIFDunsetup(GENmodel*,CKTcircuit*); - diff --git a/src/spicelib/devices/bsim3soi_fd/b3soifdgetic.c b/src/spicelib/devices/bsim3soi_fd/b3soifdgetic.c deleted file mode 100644 index e9673aba7..000000000 --- a/src/spicelib/devices/bsim3soi_fd/b3soifdgetic.c +++ /dev/null @@ -1,54 +0,0 @@ -/********** -Copyright 1999 Regents of the University of California. All rights reserved. -Author: 1998 Samuel Fung, Dennis Sinitsky and Stephen Tang -Modified by Paolo Nenzi 2002 -File: b3soifdgetic.c 98/5/01 -**********/ - -/* - * Revision 2.1 99/9/27 Pin Su - * BSIMFD2.1 release - */ - -#include "ngspice/ngspice.h" -#include "ngspice/cktdefs.h" -#include "b3soifddef.h" -#include "ngspice/sperror.h" -#include "ngspice/suffix.h" - - -int -B3SOIFDgetic(GENmodel *inModel, CKTcircuit *ckt) -{ -B3SOIFDmodel *model = (B3SOIFDmodel*)inModel; -B3SOIFDinstance *here; - - for (; model ; model = B3SOIFDnextModel(model)) - { for (here = B3SOIFDinstances(model); here; here = B3SOIFDnextInstance(here)) - { - if(!here->B3SOIFDicVBSGiven) - { here->B3SOIFDicVBS = *(ckt->CKTrhs + here->B3SOIFDbNode) - - *(ckt->CKTrhs + here->B3SOIFDsNode); - } - if (!here->B3SOIFDicVDSGiven) - { here->B3SOIFDicVDS = *(ckt->CKTrhs + here->B3SOIFDdNode) - - *(ckt->CKTrhs + here->B3SOIFDsNode); - } - if (!here->B3SOIFDicVGSGiven) - { here->B3SOIFDicVGS = *(ckt->CKTrhs + here->B3SOIFDgNode) - - *(ckt->CKTrhs + here->B3SOIFDsNode); - } - if (!here->B3SOIFDicVESGiven) - { here->B3SOIFDicVES = *(ckt->CKTrhs + here->B3SOIFDeNode) - - *(ckt->CKTrhs + here->B3SOIFDsNode); - } - if (!here->B3SOIFDicVPSGiven) - { here->B3SOIFDicVPS = *(ckt->CKTrhs + here->B3SOIFDpNode) - - *(ckt->CKTrhs + here->B3SOIFDsNode); - } - } - } - return(OK); -} - - diff --git a/src/spicelib/devices/bsim3soi_fd/b3soifdinit.c b/src/spicelib/devices/bsim3soi_fd/b3soifdinit.c deleted file mode 100644 index 8e58835c3..000000000 --- a/src/spicelib/devices/bsim3soi_fd/b3soifdinit.c +++ /dev/null @@ -1,74 +0,0 @@ -#include "ngspice/config.h" - -#include "ngspice/devdefs.h" - -#include "b3soifditf.h" -#include "b3soifdinit.h" - -SPICEdev B3SOIFDinfo = { - .DEVpublic = { - .name = "B3SOIFD", - .description = "Berkeley SOI MOSFET (FD) model version 2.1", - .terms = &B3SOIFDnSize, - .numNames = &B3SOIFDnSize, - .termNames = B3SOIFDnames, - .numInstanceParms = &B3SOIFDpTSize, - .instanceParms = B3SOIFDpTable, - .numModelParms = &B3SOIFDmPTSize, - .modelParms = B3SOIFDmPTable, - .flags = DEV_DEFAULT, - -#ifdef XSPICE - .cm_func = NULL, - .num_conn = 0, - .conn = NULL, - .num_param = 0, - .param = NULL, - .num_inst_var = 0, - .inst_var = NULL, -#endif - }, - - .DEVparam = B3SOIFDparam, - .DEVmodParam = B3SOIFDmParam, - .DEVload = B3SOIFDload, - .DEVsetup = B3SOIFDsetup, - .DEVunsetup = B3SOIFDunsetup, - .DEVpzSetup = B3SOIFDsetup, - .DEVtemperature = B3SOIFDtemp, - .DEVtrunc = B3SOIFDtrunc, - .DEVfindBranch = NULL, - .DEVacLoad = B3SOIFDacLoad, - .DEVaccept = NULL, - .DEVdestroy = NULL, - .DEVmodDelete = NULL, - .DEVdelete = NULL, - .DEVsetic = B3SOIFDgetic, - .DEVask = B3SOIFDask, - .DEVmodAsk = B3SOIFDmAsk, - .DEVpzLoad = B3SOIFDpzLoad, - .DEVconvTest = B3SOIFDconvTest, - .DEVsenSetup = NULL, - .DEVsenLoad = NULL, - .DEVsenUpdate = NULL, - .DEVsenAcLoad = NULL, - .DEVsenPrint = NULL, - .DEVsenTrunc = NULL, - .DEVdisto = NULL, - .DEVnoise = B3SOIFDnoise, - .DEVsoaCheck = NULL, - .DEVinstSize = &B3SOIFDiSize, - .DEVmodSize = &B3SOIFDmSize, - -#ifdef CIDER - .DEVdump = NULL, - .DEVacct = NULL, -#endif -}; - - -SPICEdev * -get_b3soifd_info (void) -{ - return &B3SOIFDinfo; -} diff --git a/src/spicelib/devices/bsim3soi_fd/b3soifdinit.h b/src/spicelib/devices/bsim3soi_fd/b3soifdinit.h deleted file mode 100644 index f7e7cdb54..000000000 --- a/src/spicelib/devices/bsim3soi_fd/b3soifdinit.h +++ /dev/null @@ -1,13 +0,0 @@ -#ifndef _B3SOIFDINIT_H -#define _B3SOIFDINIT_H - -extern IFparm B3SOIFDpTable[]; -extern IFparm B3SOIFDmPTable[]; -extern char *B3SOIFDnames[]; -extern int B3SOIFDpTSize; -extern int B3SOIFDmPTSize; -extern int B3SOIFDnSize; -extern int B3SOIFDiSize; -extern int B3SOIFDmSize; - -#endif diff --git a/src/spicelib/devices/bsim3soi_fd/b3soifditf.h b/src/spicelib/devices/bsim3soi_fd/b3soifditf.h deleted file mode 100644 index 1228aff59..000000000 --- a/src/spicelib/devices/bsim3soi_fd/b3soifditf.h +++ /dev/null @@ -1,14 +0,0 @@ -/********** -Copyright 1999 Regents of the University of California. All rights reserved. -Author: 1998 Samuel Fung -File: b3soifditf.h -**********/ -#ifndef DEV_B3SOIFD -#define DEV_B3SOIFD - -#include "b3soifdext.h" - -SPICEdev *get_b3soifd_info (void); - -#endif - diff --git a/src/spicelib/devices/bsim3soi_fd/b3soifdld.c b/src/spicelib/devices/bsim3soi_fd/b3soifdld.c deleted file mode 100644 index 1f72b89a6..000000000 --- a/src/spicelib/devices/bsim3soi_fd/b3soifdld.c +++ /dev/null @@ -1,3550 +0,0 @@ -/********** -Copyright 1999 Regents of the University of California. All rights reserved. -Author: Weidong Liu and Pin Su Feb 1999 -Author: 1998 Samuel Fung, Dennis Sinitsky and Stephen Tang -Modified by Pin Su, Wei Jin 99/9/27 -Modified by Paolo Nenzi 2002 -File: b3soifdld.c 98/5/01 -**********/ - -/* - * Revision 2.1 99/9/27 Pin Su - * BSIMFD2.1 release - */ - -#include "ngspice/ngspice.h" -#include "ngspice/cktdefs.h" -#include "b3soifddef.h" -#include "ngspice/trandefs.h" -#include "ngspice/const.h" -#include "ngspice/sperror.h" -#include "ngspice/devdefs.h" -#include "ngspice/suffix.h" - - -#define MAX_EXP 5.834617425e14 -#define MIN_EXP 1.713908431e-15 -#define EXP_THRESHOLD 34.0 -#define EPSOX 3.453133e-11 -#define EPSSI 1.03594e-10 -#define Charge_q 1.60219e-19 -#define KboQ 8.617087e-5 /* Kb / q */ -#define Eg300 1.115 /* energy gap at 300K */ -#define DELTA_1 0.02 -#define DELTA_2 0.02 -#define DELTA_3 0.02 -#define DELTA_4 0.02 -#define DELT_Vbs0eff 0.02 -#define DELT_Vbsmos 0.005 -#define DELT_Vbseff 0.005 -#define DELT_Xcsat 0.2 -#define DELT_Vbs0dio 1e-7 -#define DELTA_VFB 0.02 -#define DELTA_Vcscv 0.0004 -#define DELT_Vbsdio 0.01 -#define CONST_2OV3 0.6666666666 -#define OFF_Vbsdio 2e-2 -#define OFF_Vbs0_dio 2.02e-2 -#define QEX_FACT 20 - - - /* B3SOIFDSmartVbs(Vbs, Old, here, check) - * Smart Vbs guess. - */ - -static double -B3SOIFDSmartVbs(double New, double Old, B3SOIFDinstance *here, - CKTcircuit *ckt, int *check) -{ - NG_IGNORE(Old); - NG_IGNORE(check); - - /* only do it for floating body and DC */ - if (here->B3SOIFDfloat && (ckt->CKTmode & (MODEDC | MODEDCOP))) - { - /* Vbs cannot be negative in DC */ - if (New < 0.0) New = 0.0; - } - return(New); -} - - - /* B3SOIFDlimit(vnew,vold) - * limits the per-iteration change of any absolute voltage value - */ - -static double -B3SOIFDlimit(double vnew, double vold, double limit, int *check) -{ - double T0, T1; - - if (isnan (vnew) || isnan (vold)) - { - fprintf(stderr, "Alberto says: YOU TURKEY! The limiting function received NaN.\n"); - fprintf(stderr, "New prediction returns to 0.0!\n"); - vnew = 0.0; - *check = 1; - } - T0 = vnew - vold; - T1 = fabs(T0); - if (T1 > limit) { - if (T0 > 0.0) - vnew = vold + limit; - else - vnew = vold - limit; - *check = 1; - } - return vnew; -} - - - -int -B3SOIFDload(GENmodel *inModel, CKTcircuit *ckt) -{ -B3SOIFDmodel *model = (B3SOIFDmodel*)inModel; -B3SOIFDinstance *here; -int selfheat; - -double ag0, qgd, qgs, von, cbhat, VgstNVt, ExpVgst = 0.0; -double cdhat, cdreq, ceqbd, ceqbs, ceqqb, ceqqd, ceqqg, ceq, geq; -double delvbd, delvbs, delvds, delvgd, delvgs; -double Vfbeff, dVfbeff_dVd, dVfbeff_dVb, V3, V4; -double gcgdb, gcggb, gcgsb, gcgeb, gcgT; -double gcsdb, gcsgb, gcssb, gcseb, gcsT; -double gcddb, gcdgb, gcdsb, gcdeb, gcdT; -double gcbdb, gcbgb, gcbsb, gcbeb, gcbT; -double gcedb, gcegb, gcesb, gceeb, gceT; -double gcTt, gTtg, gTtb, gTte, gTtdp, gTtt, gTtsp; -double vbd, vbs, vds, vgb, vgd, vgs, vgdo; -#ifndef PREDICTOR -double xfact; -#endif -double vg, vd, vs, vp, ve, vb; -double Vds, Vgs, Vbs, Gmbs, FwdSum, RevSum; -double Vgs_eff, Vfb, dVfb_dVb, dVfb_dVd, dVfb_dT; -double Phis, dPhis_dVb, sqrtPhis, dsqrtPhis_dVb, Vth = 0.0, dVth_dVb; -double dVth_dVd, dVth_dT; -double Vgst, dVgs_eff_dVg; -double n, dn_dVb, Vtm; -double ExpArg, V0; -double ueff = 0.0, dueff_dVg, dueff_dVd, dueff_dVb, dueff_dT; -double Esat, Vdsat = 0.0; -double EsatL, dEsatL_dVg, dEsatL_dVd, dEsatL_dVb, dEsatL_dT; -double dVdsat_dVg, dVdsat_dVb, dVdsat_dVd, dVdsat_dT, Vasat; -double dVasat_dVg, dVasat_dVb, dVasat_dVd, dVasat_dT; -double Va, dVa_dVd, dVa_dVg, dVa_dVb, dVa_dT; -double Vbseff, dVbseff_dVb; -double One_Third_CoxWL, Two_Third_CoxWL, CoxWL; -double T0, dT0_dVg, dT0_dVd, dT0_dVb, dT0_dVc, dT0_dVe, dT0_dT; -double T1, dT1_dVg, dT1_dVd, dT1_dVb, dT1_dVc, dT1_dVe, dT1_dT; -double T2, dT2_dVg, dT2_dVd, dT2_dVb, dT2_dVc, dT2_dVe, dT2_dT; -double T3, dT3_dVg, dT3_dVd, dT3_dVb, dT3_dVc, dT3_dVe, dT3_dT; -double T4, dT4_dVg, dT4_dVd, dT4_dVb, dT4_dVe, dT4_dT; -double T5, dT5_dVe; -double T6, dT6_dVe, dT6_dT; -double T7; -double T8; -double T9; -double T10; -double T11; -double Abulk, dAbulk_dVb, Abulk0, dAbulk0_dVb; -double VACLM, dVACLM_dVg, dVACLM_dVd, dVACLM_dVb, dVACLM_dT; -double VADIBL, dVADIBL_dVg, dVADIBL_dVd, dVADIBL_dVb, dVADIBL_dT; -double Xdep, dXdep_dVb, lt1, dlt1_dVb, ltw, dltw_dVb; -double Delt_vth, dDelt_vth_dVb, dDelt_vth_dT; -double Theta0, dTheta0_dVb; -double TempRatio, tmp1, tmp2, tmp3, tmp4; -double DIBL_Sft, dDIBL_Sft_dVd, Lambda, dLambda_dVg; -double a1; - -double Vgsteff = 0.0, dVgsteff_dVg, dVgsteff_dVd, dVgsteff_dVb; -double dVgsteff_dVe, dVgsteff_dT; -double Vdseff = 0.0, dVdseff_dVg, dVdseff_dVd, dVdseff_dVb, dVdseff_dT; -double VdseffCV, dVdseffCV_dVg, dVdseffCV_dVd, dVdseffCV_dVb; -double diffVds; -double dAbulk_dVg, dn_dVd ; -double beta, dbeta_dVg, dbeta_dVd, dbeta_dVb, dbeta_dT; -double gche, dgche_dVg, dgche_dVd, dgche_dVb, dgche_dT; -double fgche1, dfgche1_dVg, dfgche1_dVd, dfgche1_dVb, dfgche1_dT; -double fgche2, dfgche2_dVg, dfgche2_dVd, dfgche2_dVb, dfgche2_dT; -double Idl, dIdl_dVg, dIdl_dVd, dIdl_dVb, dIdl_dT; -double Ids = 0.0, Gm, Gds = 0.0, Gmb; -double CoxWovL; -double Rds, dRds_dVg, dRds_dVb, dRds_dT, WVCox, WVCoxRds; -double Vgst2Vtm, dVgst2Vtm_dT, VdsatCV, dVdsatCV_dVg, dVdsatCV_dVb; -double Leff, Weff, dWeff_dVg, dWeff_dVb; -double AbulkCV, dAbulkCV_dVb; -double qgdo, qgso, cgdo, cgso; - -double dxpart, sxpart; - -struct b3soifdSizeDependParam *pParam; -int ByPass, Check, ChargeComputationNeeded = 0, error; - -double gbbsp, gbbdp, gbbg, gbbb, gbbe, gbbp, gbbT; -double gddpsp, gddpdp, gddpg, gddpb, gddpe, gddpT; -double gsspsp, gsspdp, gsspg, gsspb, gsspe, gsspT; -double Gbpbs, Gbpgs, Gbpds, Gbpes, Gbpps, GbpT; -double ves, ved, veb, vge = 0.0, delves, vedo, delved; -double vps, vpd, Vps, delvps; -double Vbd, Ves, Vesfb, sqrtXdep, DeltVthtemp, dDeltVthtemp_dT; -double Vbp, dVbp_dVp, dVbp_dVb, dVbp_dVg, dVbp_dVd, dVbp_dVe, dVbp_dT; -double Vpsdio, dVpsdio_dVg, dVpsdio_dVd, dVpsdio_dVe, dVpsdio_dVp, dVpsdio_dT; -double DeltVthw, dDeltVthw_dVb, dDeltVthw_dT; -double dVbseff_dVd, dVbseff_dVe, dVbseff_dT; -double dVdsat_dVc, dVasat_dVc, dVACLM_dVc, dVADIBL_dVc, dVa_dVc; -double dfgche1_dVc, dfgche2_dVc, dgche_dVc, dVdseff_dVc, dIdl_dVc; -double Gm0, Gds0, Gmb0, GmT0, Gmc, Gme, GmT, dVbseff_dVg; -double dDIBL_Sft_dVb; -double diffVdsii ; -double Idgidl = 0.0, Gdgidld, Gdgidlg, Isgidl = 0.0, Gsgidlg; -double Gjsd, Gjsb, GjsT, Gjdd, Gjdb, GjdT; -double Ibp = 0.0, Iii = 0.0, Giid, Giig, Giib, Giie, GiiT, Gcd, Gcb, GcT; -double ceqbody, ceqbodcon = 0.0; -double gppg = 0.0, gppdp = 0.0, gppb = 0.0, gppe = 0.0; -double gppp = 0.0, gppsp = 0.0, gppT; -double delTemp, deldelTemp, Temp; -double ceqth, ceqqth; -double K1; -double qjs = 0.0, gcjsbs, gcjsT; -double qjd = 0.0, gcjdbs, gcjdds, gcjdT; -double qge; -double ceqqe; -double ni, Eg, Cbox, Nfb, CboxWL; -double dVfbeff_dVrg, Cbe = 0.0; -double qinv = 0.0, qgate = 0.0, qbody = 0.0, qdrn = 0.0, qsrc, qsub = 0.0; -double cqgate, cqbody = 0.0, cqdrn = 0.0, cqsub, cqtemp; -double Cgg, Cgd, Cgb, Cge; -double Csg, Csd, Csb, Cse, Cbg = 0.0, Cbd = 0.0, Cbb = 0.0; -double Cgg1, Cgb1, Cgd1, Csg1, Csd1, Csb1; -double Vbs0t = 0.0, dVbs0t_dT ; -double Vbs0 = 0.0,dVbs0_dVe, dVbs0_dT; -double Vbs0eff = 0.0 ,dVbs0eff_dVg ,dVbs0eff_dVd ,dVbs0eff_dVe, dVbs0eff_dT; -double Vbs0teff = 0.0, dVbs0teff_dVg, dVbs0teff_dVd; -double dVbs0teff_dVe, dVbs0teff_dT; -double dVbsdio_dVg, dVbsdio_dVd, dVbsdio_dVe; -double dVbsdio_dVb, dVbsdio_dT; -double Vthfd = 0.0,dVthfd_dVd ,dVthfd_dVe, dVthfd_dT; -double Vbs0mos = 0.0 ,dVbs0mos_dVe, dVbs0mos_dT; -double Vbsmos ,dVbsmos_dVg ,dVbsmos_dVb ,dVbsmos_dVd, dVbsmos_dVe, dVbsmos_dT; -double Abeff ,dAbeff_dVg ,dAbeff_dVb, dAbeff_dVc; -double Vcs ,dVcs_dVg ,dVcs_dVb ,dVcs_dVd ,dVcs_dVe, dVcs_dT; -double Xcsat = 0.0 ,dXcsat_dVg , dXcsat_dVc; -double Vdsatii ,dVdsatii_dVg ,dVdsatii_dVd, dVdsatii_dVb, dVdsatii_dT; -double Vdseffii ,dVdseffii_dVg ,dVdseffii_dVd, dVdseffii_dVb, dVdseffii_dT; -double VcsCV = 0.0; -double VdsCV = 0.0, dVdsCV_dVg = 0.0, dVdsCV_dVb = 0.0; -double dVdsCV_dVd = 0.0, dVdsCV_dVc = 0.0; -double Phisd ,dPhisd_dVg ,dPhisd_dVb ,dPhisd_dVd, dPhisd_dVc; -double sqrtPhisd; -double Xc = 0.0; -double Ic = 0.0; -double Ibs = 0.0; -double Ibd = 0.0; -double Denomi ,dDenomi_dVg ,dDenomi_dVd ,dDenomi_dVb , dDenomi_dT; -double Qbf = 0.0; -double Qsubs1 = 0.0; -double Qsubs2 = 0.0; -double Qsub0 = 0.0 ,dQsub0_dVg ,dQsub0_dVb ,dQsub0_dVd ; -double Qac0 = 0.0 ,dQac0_dVb ,dQac0_dVd; -double Qdep0 ,dQdep0_dVb; -double Qe1 = 0.0; -double Ce1g ,Ce1b ,Ce1d ,Ce1e, Ce1T; -double Ce2g ,Ce2b ,Ce2d ,Ce2e, Ce2T; -double Qe2 = 0.0; -double dQac0_dVrg, Vbsdio = 0.0, dQsub0_dVrg; - -/* for self-heating */ -double vbi, vfbb, phi, sqrtPhi, Xdep0, jbjt, jdif, jrec, jtun, u0temp, vsattemp; -double rds0, ua, ub, uc; -double dvbi_dT, dvfbb_dT, djbjt_dT, djdif_dT, djrec_dT, djtun_dT, du0temp_dT; -double dvsattemp_dT, drds0_dT, dua_dT, dub_dT, duc_dT, dni_dT, dVtm_dT; -double dVfbeff_dT, dQac0_dT, dQsub0_dT, dVdsCV_dT = 0.0, dPhisd_dT; -double CbT, CsT, CgT; - -double Qex, dQex_dVg, dQex_dVb, dQex_dVd, dQex_dVe, dQex_dT; - -/* clean up last */ -FILE *fpdebug = NULL; -/* end clean up */ -int nandetect; -static int nanfound = 0; -char nanmessage [12]; - -double m; - -for (; model != NULL; model = B3SOIFDnextModel(model)) -{ for (here = B3SOIFDinstances(model); here != NULL; - here = B3SOIFDnextInstance(here)) - { - Check = 0; - ByPass = 0; - selfheat = (model->B3SOIFDshMod == 1) && (here->B3SOIFDrth0 != 0.0); - pParam = here->pParam; - - if (here->B3SOIFDdebugMod > 3) - { - if (model->B3SOIFDtype > 0) - fpdebug = fopen("b3soifdn.log", "a"); - else - fpdebug = fopen("b3soifdp.log", "a"); - - fprintf(fpdebug, "******* Time : %.5e ******* Device: %s Iteration: %d\n", - ckt->CKTtime, here->B3SOIFDname, here->B3SOIFDiterations); - } - - if ((ckt->CKTmode & MODEINITSMSIG)) - { vbs = *(ckt->CKTstate0 + here->B3SOIFDvbs); - vgs = *(ckt->CKTstate0 + here->B3SOIFDvgs); - ves = *(ckt->CKTstate0 + here->B3SOIFDves); - vps = *(ckt->CKTstate0 + here->B3SOIFDvps); - vds = *(ckt->CKTstate0 + here->B3SOIFDvds); - delTemp = *(ckt->CKTstate0 + here->B3SOIFDdeltemp); - - vg = *(ckt->CKTrhsOld + here->B3SOIFDgNode); - vd = *(ckt->CKTrhsOld + here->B3SOIFDdNodePrime); - vs = *(ckt->CKTrhsOld + here->B3SOIFDsNodePrime); - vp = *(ckt->CKTrhsOld + here->B3SOIFDpNode); - ve = *(ckt->CKTrhsOld + here->B3SOIFDeNode); - vb = *(ckt->CKTrhsOld + here->B3SOIFDbNode); - - if (here->B3SOIFDdebugMod > 2) - { - fprintf(fpdebug, "... INIT SMSIG ...\n"); - } - if (here->B3SOIFDdebugMod > 0) - { - fprintf(stderr, - "DC op. point converge with %d iterations\n", - here->B3SOIFDiterations); - } - } - else if ((ckt->CKTmode & MODEINITTRAN)) - { vbs = *(ckt->CKTstate1 + here->B3SOIFDvbs); - vgs = *(ckt->CKTstate1 + here->B3SOIFDvgs); - ves = *(ckt->CKTstate1 + here->B3SOIFDves); - vps = *(ckt->CKTstate1 + here->B3SOIFDvps); - vds = *(ckt->CKTstate1 + here->B3SOIFDvds); - delTemp = *(ckt->CKTstate1 + here->B3SOIFDdeltemp); - - vg = *(ckt->CKTrhsOld + here->B3SOIFDgNode); - vd = *(ckt->CKTrhsOld + here->B3SOIFDdNodePrime); - vs = *(ckt->CKTrhsOld + here->B3SOIFDsNodePrime); - vp = *(ckt->CKTrhsOld + here->B3SOIFDpNode); - ve = *(ckt->CKTrhsOld + here->B3SOIFDeNode); - vb = *(ckt->CKTrhsOld + here->B3SOIFDbNode); - - if (here->B3SOIFDdebugMod > 2) - { - fprintf(fpdebug, "... Init Transient ....\n"); - } - if (here->B3SOIFDdebugMod > 0) - { - fprintf(stderr, "Transient operation point converge with %d iterations\n", -here->B3SOIFDiterations); - } - here->B3SOIFDiterations = 0; - } - else if ((ckt->CKTmode & MODEINITJCT) && !here->B3SOIFDoff) - { vds = model->B3SOIFDtype * here->B3SOIFDicVDS; - vgs = model->B3SOIFDtype * here->B3SOIFDicVGS; - ves = model->B3SOIFDtype * here->B3SOIFDicVES; - vbs = model->B3SOIFDtype * here->B3SOIFDicVBS; - vps = model->B3SOIFDtype * here->B3SOIFDicVPS; - - vg = vd = vs = vp = ve = 0.0; - - here->B3SOIFDiterations = 0; /* initialize iteration number */ - - delTemp = 0.0; - here->B3SOIFDphi = pParam->B3SOIFDphi; - - - if (here->B3SOIFDdebugMod > 2) - fprintf(fpdebug, "... INIT JCT ...\n"); - - if ((vds == 0.0) && (vgs == 0.0) && (vbs == 0.0) && - ((ckt->CKTmode & (MODETRAN | MODEAC|MODEDCOP | - MODEDCTRANCURVE)) || (!(ckt->CKTmode & MODEUIC)))) - { vbs = 0.0; - vgs = model->B3SOIFDtype*0.1 + pParam->B3SOIFDvth0; - vds = 0.0; - ves = 0.0; - vps = 0.0; - } - } - else if ((ckt->CKTmode & (MODEINITJCT | MODEINITFIX)) && - (here->B3SOIFDoff)) - { delTemp = vps = vbs = vgs = vds = ves = 0.0; - vg = vd = vs = vp = ve = 0.0; - here->B3SOIFDiterations = 0; /* initialize iteration number */ - } - else - { -#ifndef PREDICTOR - if ((ckt->CKTmode & MODEINITPRED)) - { xfact = ckt->CKTdelta / ckt->CKTdeltaOld[1]; - *(ckt->CKTstate0 + here->B3SOIFDvbs) = - *(ckt->CKTstate1 + here->B3SOIFDvbs); - vbs = (1.0 + xfact)* (*(ckt->CKTstate1 + here->B3SOIFDvbs)) - - (xfact * (*(ckt->CKTstate2 + here->B3SOIFDvbs))); - *(ckt->CKTstate0 + here->B3SOIFDvgs) = - *(ckt->CKTstate1 + here->B3SOIFDvgs); - vgs = (1.0 + xfact)* (*(ckt->CKTstate1 + here->B3SOIFDvgs)) - - (xfact * (*(ckt->CKTstate2 + here->B3SOIFDvgs))); - *(ckt->CKTstate0 + here->B3SOIFDves) = - *(ckt->CKTstate1 + here->B3SOIFDves); - ves = (1.0 + xfact)* (*(ckt->CKTstate1 + here->B3SOIFDves)) - - (xfact * (*(ckt->CKTstate2 + here->B3SOIFDves))); - *(ckt->CKTstate0 + here->B3SOIFDvps) = - *(ckt->CKTstate1 + here->B3SOIFDvps); - vps = (1.0 + xfact)* (*(ckt->CKTstate1 + here->B3SOIFDvps)) - - (xfact * (*(ckt->CKTstate2 + here->B3SOIFDvps))); - *(ckt->CKTstate0 + here->B3SOIFDvds) = - *(ckt->CKTstate1 + here->B3SOIFDvds); - vds = (1.0 + xfact)* (*(ckt->CKTstate1 + here->B3SOIFDvds)) - - (xfact * (*(ckt->CKTstate2 + here->B3SOIFDvds))); - *(ckt->CKTstate0 + here->B3SOIFDvbd) = - *(ckt->CKTstate0 + here->B3SOIFDvbs) - - *(ckt->CKTstate0 + here->B3SOIFDvds); - - *(ckt->CKTstate0 + here->B3SOIFDvg) = *(ckt->CKTstate1 + here->B3SOIFDvg); - *(ckt->CKTstate0 + here->B3SOIFDvd) = *(ckt->CKTstate1 + here->B3SOIFDvd); - *(ckt->CKTstate0 + here->B3SOIFDvs) = *(ckt->CKTstate1 + here->B3SOIFDvs); - *(ckt->CKTstate0 + here->B3SOIFDvp) = *(ckt->CKTstate1 + here->B3SOIFDvp); - *(ckt->CKTstate0 + here->B3SOIFDve) = *(ckt->CKTstate1 + here->B3SOIFDve); - - /* Only predict ve */ - ve = (1.0 + xfact)* (*(ckt->CKTstate1 + here->B3SOIFDve)) - - - (xfact * (*(ckt->CKTstate2 + here->B3SOIFDve))); - /* Then update vg, vs, vb, vd, vp base on ve */ - vs = ve - model->B3SOIFDtype * ves; - vg = model->B3SOIFDtype * vgs + vs; - vd = model->B3SOIFDtype * vds + vs; - vb = model->B3SOIFDtype * vbs + vs; - vp = model->B3SOIFDtype * vps + vs; - - delTemp = (1.0 + xfact)* (*(ckt->CKTstate1 + - here->B3SOIFDdeltemp))-(xfact * (*(ckt->CKTstate2 + - here->B3SOIFDdeltemp))); - - if (selfheat) - { - here->B3SOIFDphi = 2.0 * here->B3SOIFDvtm - * log (pParam->B3SOIFDnpeak / - here->B3SOIFDni); - } - - if (here->B3SOIFDdebugMod > 0) - { - fprintf(stderr, "Time = %.6e converge with %d iterations\n", ckt->CKTtime, here->B3SOIFDiterations); - } - if (here->B3SOIFDdebugMod > 2) - { - fprintf(fpdebug, "... PREDICTOR calculation ....\n"); - } - here->B3SOIFDiterations = 0; - } - else - { -#endif /* PREDICTOR */ - - vg = B3SOIFDlimit(*(ckt->CKTrhsOld + here->B3SOIFDgNode), - *(ckt->CKTstate0 + here->B3SOIFDvg), 3.0, &Check); - vd = B3SOIFDlimit(*(ckt->CKTrhsOld + here->B3SOIFDdNodePrime), - *(ckt->CKTstate0 + here->B3SOIFDvd), 3.0, &Check); - vs = B3SOIFDlimit(*(ckt->CKTrhsOld + here->B3SOIFDsNodePrime), - *(ckt->CKTstate0 + here->B3SOIFDvs), 3.0, &Check); - vp = B3SOIFDlimit(*(ckt->CKTrhsOld + here->B3SOIFDpNode), - *(ckt->CKTstate0 + here->B3SOIFDvp), 3.0, &Check); - ve = B3SOIFDlimit(*(ckt->CKTrhsOld + here->B3SOIFDeNode), - *(ckt->CKTstate0 + here->B3SOIFDve), 3.0, &Check); - delTemp = *(ckt->CKTrhsOld + here->B3SOIFDtempNode); - - vbs = model->B3SOIFDtype * (*(ckt->CKTrhsOld+here->B3SOIFDbNode) - - *(ckt->CKTrhsOld+here->B3SOIFDsNodePrime)); - - vps = model->B3SOIFDtype * (vp - vs); - vgs = model->B3SOIFDtype * (vg - vs); - ves = model->B3SOIFDtype * (ve - vs); - vds = model->B3SOIFDtype * (vd - vs); - - if (here->B3SOIFDdebugMod > 2) - { - fprintf(fpdebug, "... DC calculation ....\n"); -fprintf(fpdebug, "Vg = %.10f; Vb = %.10f; Vs = %.10f\n", - *(ckt->CKTrhsOld + here->B3SOIFDgNode), - *(ckt->CKTrhsOld + here->B3SOIFDbNode), - *(ckt->CKTrhsOld + here->B3SOIFDsNode)); -fprintf(fpdebug, "Vd = %.10f; Vsp = %.10f; Vdp = %.10f\n", - *(ckt->CKTrhsOld + here->B3SOIFDdNode), - *(ckt->CKTrhsOld + here->B3SOIFDsNodePrime), - *(ckt->CKTrhsOld + here->B3SOIFDdNodePrime)); -fprintf(fpdebug, "Ve = %.10f; Vp = %.10f; delTemp = %.10f\n", - *(ckt->CKTrhsOld + here->B3SOIFDeNode), - *(ckt->CKTrhsOld + here->B3SOIFDpNode), - *(ckt->CKTrhsOld + here->B3SOIFDtempNode)); - - } - -#ifndef PREDICTOR - } -#endif /* PREDICTOR */ - - vbd = vbs - vds; - vgd = vgs - vds; - ved = ves - vds; - vgdo = *(ckt->CKTstate0 + here->B3SOIFDvgs) - - *(ckt->CKTstate0 + here->B3SOIFDvds); - vedo = *(ckt->CKTstate0 + here->B3SOIFDves) - - *(ckt->CKTstate0 + here->B3SOIFDvds); - delvbs = vbs - *(ckt->CKTstate0 + here->B3SOIFDvbs); - delvbd = vbd - *(ckt->CKTstate0 + here->B3SOIFDvbd); - delvgs = vgs - *(ckt->CKTstate0 + here->B3SOIFDvgs); - delves = ves - *(ckt->CKTstate0 + here->B3SOIFDves); - delvps = vps - *(ckt->CKTstate0 + here->B3SOIFDvps); - deldelTemp = delTemp - *(ckt->CKTstate0 + here->B3SOIFDdeltemp); - delvds = vds - *(ckt->CKTstate0 + here->B3SOIFDvds); - delvgd = vgd - vgdo; - delved = ved - vedo; - - if (here->B3SOIFDmode >= 0) - { - cdhat = here->B3SOIFDcd + (here->B3SOIFDgm-here->B3SOIFDgjdg) * delvgs - + (here->B3SOIFDgds - here->B3SOIFDgjdd) * delvds - + (here->B3SOIFDgmbs - here->B3SOIFDgjdb) * delvbs - + (here->B3SOIFDgme - here->B3SOIFDgjde) * delves - + (here->B3SOIFDgmT - here->B3SOIFDgjdT) * deldelTemp; - } - else - { - cdhat = here->B3SOIFDcd + (here->B3SOIFDgm-here->B3SOIFDgjdg) * delvgd - - (here->B3SOIFDgds - here->B3SOIFDgjdd) * delvds - + (here->B3SOIFDgmbs - here->B3SOIFDgjdb) * delvbd - + (here->B3SOIFDgme - here->B3SOIFDgjde) * delved - + (here->B3SOIFDgmT - here->B3SOIFDgjdT) * deldelTemp; - - } - cbhat = here->B3SOIFDcb + here->B3SOIFDgbgs * delvgs - + here->B3SOIFDgbbs * delvbs + here->B3SOIFDgbds * delvds - + here->B3SOIFDgbes * delves + here->B3SOIFDgbps * delvps - + here->B3SOIFDgbT * deldelTemp; - -#ifndef NOBYPASS - /* following should be one big if connected by && all over - * the place, but some C compilers can't handle that, so - * we split it up here to let them digest it in stages - */ - - if (here->B3SOIFDdebugMod > 3) - { -fprintf(fpdebug, "Convergent Criteria : vbs %d vds %d vgs %d ves %d vps %d temp %d\n", - ((fabs(delvbs) < (ckt->CKTreltol * MAX(fabs(vbs), - fabs(*(ckt->CKTstate0+here->B3SOIFDvbs))) + ckt->CKTvoltTol))) ? 1 : 0, - ((fabs(delvds) < (ckt->CKTreltol * MAX(fabs(vds), - fabs(*(ckt->CKTstate0+here->B3SOIFDvds))) + ckt->CKTvoltTol))) ? 1 : 0, - ((fabs(delvgs) < (ckt->CKTreltol * MAX(fabs(vgs), - fabs(*(ckt->CKTstate0+here->B3SOIFDvgs))) + ckt->CKTvoltTol))) ? 1 : 0, - ((fabs(delves) < (ckt->CKTreltol * MAX(fabs(ves), - fabs(*(ckt->CKTstate0+here->B3SOIFDves))) + ckt->CKTvoltTol))) ? 1 : 0, - ((fabs(delvps) < (ckt->CKTreltol * MAX(fabs(vps), - fabs(*(ckt->CKTstate0+here->B3SOIFDvps))) + ckt->CKTvoltTol))) ? 1 : 0, - ((fabs(deldelTemp) < (ckt->CKTreltol * MAX(fabs(delTemp), - fabs(*(ckt->CKTstate0+here->B3SOIFDdeltemp))) + ckt->CKTvoltTol*1e4))) ? 1 : 0); -fprintf(fpdebug, "delCd %.4e, delCb %.4e\n", fabs(cdhat - here->B3SOIFDcd) , - fabs(cbhat - here->B3SOIFDcb)); - - } - if ((!(ckt->CKTmode & MODEINITPRED)) && (ckt->CKTbypass) && Check == 0) - if ((fabs(delvbs) < (ckt->CKTreltol * MAX(fabs(vbs), - fabs(*(ckt->CKTstate0+here->B3SOIFDvbs))) + ckt->CKTvoltTol)) ) - if ((fabs(delvbd) < (ckt->CKTreltol * MAX(fabs(vbd), - fabs(*(ckt->CKTstate0+here->B3SOIFDvbd))) + ckt->CKTvoltTol)) ) - if ((fabs(delvgs) < (ckt->CKTreltol * MAX(fabs(vgs), - fabs(*(ckt->CKTstate0+here->B3SOIFDvgs))) + ckt->CKTvoltTol))) - if ((fabs(delves) < (ckt->CKTreltol * MAX(fabs(ves), - fabs(*(ckt->CKTstate0+here->B3SOIFDves))) + ckt->CKTvoltTol))) - if ( (here->B3SOIFDbodyMod == 0) || (here->B3SOIFDbodyMod == 2) || - (fabs(delvps) < (ckt->CKTreltol * MAX(fabs(vps), - fabs(*(ckt->CKTstate0+here->B3SOIFDvps))) + ckt->CKTvoltTol)) ) - if ( (here->B3SOIFDtempNode == 0) || - (fabs(deldelTemp) < (ckt->CKTreltol * MAX(fabs(delTemp), - fabs(*(ckt->CKTstate0+here->B3SOIFDdeltemp))) - + ckt->CKTvoltTol*1e4))) - if ((fabs(delvds) < (ckt->CKTreltol * MAX(fabs(vds), - fabs(*(ckt->CKTstate0+here->B3SOIFDvds))) + ckt->CKTvoltTol))) - if ((fabs(cdhat - here->B3SOIFDcd) < ckt->CKTreltol - * MAX(fabs(cdhat),fabs(here->B3SOIFDcd)) + ckt->CKTabstol)) - if ((fabs(cbhat - here->B3SOIFDcb) < ckt->CKTreltol - * MAX(fabs(cbhat),fabs(here->B3SOIFDcb)) + ckt->CKTabstol) ) - { /* bypass code */ - vbs = *(ckt->CKTstate0 + here->B3SOIFDvbs); - vbd = *(ckt->CKTstate0 + here->B3SOIFDvbd); - vgs = *(ckt->CKTstate0 + here->B3SOIFDvgs); - ves = *(ckt->CKTstate0 + here->B3SOIFDves); - vps = *(ckt->CKTstate0 + here->B3SOIFDvps); - vds = *(ckt->CKTstate0 + here->B3SOIFDvds); - delTemp = *(ckt->CKTstate0 + here->B3SOIFDdeltemp); - - /* calculate Vds for temperature conductance calculation - in bypass (used later when filling Temp node matrix) */ - Vds = here->B3SOIFDmode > 0 ? vds : -vds; - - vgd = vgs - vds; - vgb = vgs - vbs; - veb = ves - vbs; - - if (here->B3SOIFDdebugMod > 2) - { -fprintf(stderr, "Bypass for %s...\n", here->B3SOIFDname); - fprintf(fpdebug, "... By pass ....\n"); - fprintf(fpdebug, "vgs=%.4f, vds=%.4f, vbs=%.4f, ", - vgs, vds, vbs); - fprintf(fpdebug, "ves=%.4f, vps=%.4f\n", ves, vps); - } - if ((ckt->CKTmode & (MODETRAN | MODEAC)) || - ((ckt->CKTmode & MODETRANOP) && (ckt->CKTmode & MODEUIC))) - { ByPass = 1; - goto line755; - } - else - { goto line850; - } - } - - -#endif /*NOBYPASS*/ - von = here->B3SOIFDvon; - - if ((here->B3SOIFDdebugMod > 1) || (here->B3SOIFDdebugMod == -1)) - { - here->B3SOIFDdum1 = here->B3SOIFDdum2 = here->B3SOIFDdum3 = 0.0; - here->B3SOIFDdum4 = here->B3SOIFDdum5 = 0.0; - Qac0 = Qsub0 = Qsubs1 = Qsubs2 = Qbf = Qe1 = Qe2 = 0.0; - qjs = qjd = Cbg = Cbb = Cbd = Cbe = Xc = qdrn = qgate = 0.0; - qbody = qsub = 0.0; - } - - if (here->B3SOIFDdebugMod > 2) { - fprintf(fpdebug, "Limited : vgs = %.8f\n", vgs); - fprintf(fpdebug, "Limited : vds = %.8f\n", vds); - } - - if (*(ckt->CKTstate0 + here->B3SOIFDvds) >= 0.0) - T0 = *(ckt->CKTstate0 + here->B3SOIFDvbs); - else - T0 = *(ckt->CKTstate0 + here->B3SOIFDvbd); - - if (here->B3SOIFDdebugMod > 2) - fprintf(fpdebug, "Before lim : vbs = %.8f, after = ", T0); - - if (vds >= 0.0) - { - vbs = B3SOIFDlimit(vbs, T0, 0.2, &Check); - vbs = B3SOIFDSmartVbs(vbs, T0, here, ckt, &Check); - vbd = vbs - vds; - vb = model->B3SOIFDtype * vbs + vs; - if (here->B3SOIFDdebugMod > 2) - fprintf(fpdebug, "%.8f\n", vbs); - } else - { - vbd = B3SOIFDlimit(vbd, T0, 0.2, &Check); - vbd = B3SOIFDSmartVbs(vbd, T0, here, ckt, &Check); - vbs = vbd + vds; - vb = model->B3SOIFDtype * vbs + vd; - if (here->B3SOIFDdebugMod > 2) - fprintf(fpdebug, "%.8f\n", vbd); - } - - delTemp =B3SOIFDlimit(delTemp, *(ckt->CKTstate0 + here->B3SOIFDdeltemp),5.0,&Check); - - } - -/* Calculate temperature dependent values for self-heating effect */ - Temp = delTemp + ckt->CKTtemp; -/* for debugging - Temp = ckt->CKTtemp; - selfheat = 1; - if (here->B3SOIFDname[1] == '2') - { - Temp += 0.01; - } */ - TempRatio = Temp / model->B3SOIFDtnom; - - if (selfheat) { - Vtm = KboQ * Temp; - - T0 = 1108.0 + Temp; - T5 = Temp * Temp; - Eg = 1.16 - 7.02e-4 * T5 / T0; - T1 = ((7.02e-4 * T5) - T0 * (14.04e-4 * Temp)) / T0 / T0; - /* T1 = dEg / dT */ - - T2 = 1.9230584e-4; /* T2 = 1 / 300.15^(3/2) */ - T5 = sqrt(Temp); - T3 = 1.45e10 * Temp * T5 * T2; - T4 = exp(21.5565981 - Eg / (2.0 * Vtm)); - ni = T3 * T4; - dni_dT = 2.175e10 * T2 * T5 * T4 + T3 * T4 * - (-Vtm * T1 + Eg * KboQ) / (2.0 * Vtm * Vtm); - - T0 = log(1.0e20 * pParam->B3SOIFDnpeak / (ni * ni)); - vbi = Vtm * T0; - dvbi_dT = KboQ * T0 + Vtm * (-2.0 * dni_dT / ni); - - if (pParam->B3SOIFDnsub > 0) { - T0 = log(pParam->B3SOIFDnpeak / pParam->B3SOIFDnsub); - vfbb = -model->B3SOIFDtype * Vtm*T0; - dvfbb_dT = -model->B3SOIFDtype * KboQ*T0; - } - else { - T0 = log(-pParam->B3SOIFDnpeak*pParam->B3SOIFDnsub/ni/ni); - vfbb = -model->B3SOIFDtype * Vtm*T0; - dvfbb_dT = -model->B3SOIFDtype * - (KboQ * T0 + Vtm * 2.0 * dni_dT / ni); - } - -/* phi = 2.0 * Vtm * log(pParam->B3SOIFDnpeak / ni); */ - phi = here->B3SOIFDphi; - sqrtPhi = sqrt(phi); - Xdep0 = sqrt(2.0 * EPSSI / (Charge_q - * pParam->B3SOIFDnpeak * 1.0e6)) - * sqrtPhi; - /* Save the values below for phi calculation in B3SOIFDaccept() */ - here->B3SOIFDvtm = Vtm; - here->B3SOIFDni = ni; - - /* Use dTx_dVe variables to act as dTx_dT variables */ - - T8 = 1 / model->B3SOIFDtnom; - T7 = model->B3SOIFDxbjt / pParam->B3SOIFDndiode; - T0 = pow(TempRatio, T7); - dT0_dVe = T7 * pow(TempRatio, T7 - 1.0) * T8; - - T7 = model->B3SOIFDxdif / pParam->B3SOIFDndiode; - T1 = pow(TempRatio, T7); - dT1_dVe = T7 * pow(TempRatio, T7 - 1.0) * T8; - - T7 = model->B3SOIFDxrec / pParam->B3SOIFDndiode / 2.0; - T2 = pow(TempRatio, T7); - dT2_dVe = T7 * pow(TempRatio, T7 - 1.0) * T8; - - T3 = TempRatio - 1.0; - T4 = Eg300 / pParam->B3SOIFDndiode / Vtm * T3; - dT4_dVe = Eg300 / pParam->B3SOIFDndiode / Vtm / Vtm * - (Vtm * T8 - T3 * KboQ); - T5 = exp(T4); - dT5_dVe = dT4_dVe * T5; - T6 = sqrt(T5); - dT6_dVe = 0.5 / T6 * dT5_dVe; - - jbjt = pParam->B3SOIFDisbjt * T0 * T5; - jdif = pParam->B3SOIFDisdif * T1 * T5; - jrec = pParam->B3SOIFDisrec * T2 * T6; - djbjt_dT = pParam->B3SOIFDisbjt * (T0 * dT5_dVe + T5 * dT0_dVe); - djdif_dT = pParam->B3SOIFDisdif * (T1 * dT5_dVe + T5 * dT1_dVe); - djrec_dT = pParam->B3SOIFDisrec * (T2 * dT6_dVe + T6 * dT2_dVe); - - T7 = model->B3SOIFDxtun / pParam->B3SOIFDntun; - T0 = pow(TempRatio, T7); - jtun = pParam->B3SOIFDistun * T0; - djtun_dT = pParam->B3SOIFDistun * T7 * pow(TempRatio, T7 - 1.0) * T8; - - u0temp = pParam->B3SOIFDu0 * pow(TempRatio, pParam->B3SOIFDute); - du0temp_dT = pParam->B3SOIFDu0 * pParam->B3SOIFDute * - pow(TempRatio, pParam->B3SOIFDute - 1.0) * T8; - - vsattemp = pParam->B3SOIFDvsat - pParam->B3SOIFDat * T3; - dvsattemp_dT = -pParam->B3SOIFDat * T8; - - rds0 = (pParam->B3SOIFDrdsw + pParam->B3SOIFDprt - * T3) / pParam->B3SOIFDrds0denom; - drds0_dT = pParam->B3SOIFDprt / pParam->B3SOIFDrds0denom * T8; - - ua = pParam->B3SOIFDuatemp + pParam->B3SOIFDua1 * T3; - ub = pParam->B3SOIFDubtemp + pParam->B3SOIFDub1 * T3; - uc = pParam->B3SOIFDuctemp + pParam->B3SOIFDuc1 * T3; - dua_dT = pParam->B3SOIFDua1 * T8; - dub_dT = pParam->B3SOIFDub1 * T8; - duc_dT = pParam->B3SOIFDuc1 * T8; - } - else { - vbi = pParam->B3SOIFDvbi; - vfbb = pParam->B3SOIFDvfbb; - phi = pParam->B3SOIFDphi; - sqrtPhi = pParam->B3SOIFDsqrtPhi; - Xdep0 = pParam->B3SOIFDXdep0; - jbjt = pParam->B3SOIFDjbjt; - jdif = pParam->B3SOIFDjdif; - jrec = pParam->B3SOIFDjrec; - jtun = pParam->B3SOIFDjtun; - u0temp = pParam->B3SOIFDu0temp; - vsattemp = pParam->B3SOIFDvsattemp; - rds0 = pParam->B3SOIFDrds0; - ua = pParam->B3SOIFDua; - ub = pParam->B3SOIFDub; - uc = pParam->B3SOIFDuc; - dni_dT = dvbi_dT = dvfbb_dT = djbjt_dT = djdif_dT = 0.0; - djrec_dT = djtun_dT = du0temp_dT = dvsattemp_dT = 0.0; - drds0_dT = dua_dT = dub_dT = duc_dT = 0.0; - } - - /* TempRatio used for Vth and mobility */ - if (selfheat) { - TempRatio = Temp / model->B3SOIFDtnom - 1.0; - } - else { - TempRatio = ckt->CKTtemp / model->B3SOIFDtnom - 1.0; - } - - /* determine DC current and derivatives */ - vbd = vbs - vds; - vgd = vgs - vds; - vgb = vgs - vbs; - ved = ves - vds; - veb = ves - vbs; - vge = vgs - ves; - vpd = vps - vds; - - - if (vds >= 0.0) - { /* normal mode */ - here->B3SOIFDmode = 1; - Vds = vds; - Vgs = vgs; - Vbs = vbs; - Vbd = vbd; - Ves = ves; - Vps = vps; - } - else - { /* inverse mode */ - here->B3SOIFDmode = -1; - Vds = -vds; - Vgs = vgd; - Vbs = vbd; - Vbd = vbs; - Ves = ved; - Vps = vpd; - } - - - if (here->B3SOIFDdebugMod > 2) - { - fprintf(fpdebug, "Vgs=%.4f, Vds=%.4f, Vbs=%.4f, ", - Vgs, Vds, Vbs); - fprintf(fpdebug, "Ves=%.4f, Vps=%.4f, Temp=%.1f\n", - Ves, Vps, Temp); - } - - Vesfb = Ves - vfbb; - Cbox = model->B3SOIFDcbox; - K1 = pParam->B3SOIFDk1; - - ChargeComputationNeeded = - ((ckt->CKTmode & (MODEAC | MODETRAN | MODEINITSMSIG)) || - ((ckt->CKTmode & MODETRANOP) && (ckt->CKTmode & MODEUIC))) - ? 1 : 0; - - if (here->B3SOIFDdebugMod == -1) - ChargeComputationNeeded = 1; - - - - -/* Poly Gate Si Depletion Effect */ - T0 = pParam->B3SOIFDvfb + phi; - if ((pParam->B3SOIFDngate > 1.e18) && (pParam->B3SOIFDngate < 1.e25) - && (Vgs > T0)) - /* added to avoid the problem caused by ngate */ - { T1 = 1.0e6 * Charge_q * EPSSI * pParam->B3SOIFDngate - / (model->B3SOIFDcox * model->B3SOIFDcox); - T4 = sqrt(1.0 + 2.0 * (Vgs - T0) / T1); - T2 = T1 * (T4 - 1.0); - T3 = 0.5 * T2 * T2 / T1; /* T3 = Vpoly */ - T7 = 1.12 - T3 - 0.05; - T6 = sqrt(T7 * T7 + 0.224); - T5 = 1.12 - 0.5 * (T7 + T6); - Vgs_eff = Vgs - T5; - dVgs_eff_dVg = 1.0 - (0.5 - 0.5 / T4) * (1.0 + T7 / T6); - } - else - { Vgs_eff = Vgs; - dVgs_eff_dVg = 1.0; - } - - - Leff = pParam->B3SOIFDleff; - - if (selfheat) { - Vtm = KboQ * Temp; - dVtm_dT = KboQ; - } - else { - Vtm = model->B3SOIFDvtm; - dVtm_dT = 0.0; - } - - V0 = vbi - phi; - -/* Prepare Vbs0t */ - T0 = -pParam->B3SOIFDdvbd1 * pParam->B3SOIFDleff / pParam->B3SOIFDlitl; - T1 = pParam->B3SOIFDdvbd0 * (exp(0.5*T0) + 2*exp(T0)); - T2 = T1 * (vbi - phi); - T3 = 0.5 * model->B3SOIFDqsi / model->B3SOIFDcsi; - Vbs0t = phi - T3 + pParam->B3SOIFDvbsa + T2; - if (selfheat) - dVbs0t_dT = T1 * dvbi_dT; - else - dVbs0t_dT = 0.0; - -/* Prepare Vbs0 */ - T0 = 1 + model->B3SOIFDcsieff / Cbox; - T1 = pParam->B3SOIFDkb1 / T0; - T2 = T1 * (Vbs0t - Vesfb); - - /* T6 is Vbs0 before limiting */ - T6 = Vbs0t - T2; - dT6_dVe = T1; - if (selfheat) - dT6_dT = dVbs0t_dT - T1 * (dVbs0t_dT + dvfbb_dT); - else - dT6_dT = 0.0; - - /* limit Vbs0 to below phi */ - T1 = phi - pParam->B3SOIFDdelp; - T2 = T1 - T6 - DELT_Vbseff; - T3 = sqrt(T2 * T2 + 4.0 * DELT_Vbseff); - Vbs0 = T1 - 0.5 * (T2 + T3); - T4 = 0.5 * (1 + T2/T3); - dVbs0_dVe = T4 * dT6_dVe; - if (selfheat) dVbs0_dT = T4 * dT6_dT; - else dVbs0_dT = 0.0; - - T1 = Vbs0t - Vbs0 - DELT_Vbsmos; - T2 = sqrt(T1 * T1 + DELT_Vbsmos * DELT_Vbsmos); - T3 = 0.5 * (T1 + T2); - T4 = T3 * model->B3SOIFDcsieff / model->B3SOIFDqsieff; - Vbs0mos = Vbs0 - 0.5 * T3 * T4; - T5 = 0.5 * T4 * (1 + T1 / T2); - dVbs0mos_dVe = dVbs0_dVe * (1 + T5); - if (selfheat) - dVbs0mos_dT = dVbs0_dT - (dVbs0t_dT - dVbs0_dT) * T5; - else - dVbs0mos_dT = 0.0; - -/* Prepare Vthfd - treat Vbs0mos as if it were independent variable Vb */ - Phis = phi - Vbs0mos; - dPhis_dVb = -1; - sqrtPhis = sqrt(Phis); - dsqrtPhis_dVb = -0.5 / sqrtPhis; - Xdep = Xdep0 * sqrtPhis / sqrtPhi; - dXdep_dVb = (Xdep0 / sqrtPhi) - * dsqrtPhis_dVb; - sqrtXdep = sqrt(Xdep); - - T0 = pParam->B3SOIFDdvt2 * Vbs0mos; - if (T0 >= - 0.5) - { T1 = 1.0 + T0; - T2 = pParam->B3SOIFDdvt2; - } - else /* Added to avoid any discontinuity problems caused by dvt2*/ - { T4 = 1.0 / (3.0 + 8.0 * T0); - T1 = (1.0 + 3.0 * T0) * T4; - T2 = pParam->B3SOIFDdvt2 * T4 * T4; - } - lt1 = model->B3SOIFDfactor1 * sqrtXdep * T1; - dlt1_dVb = model->B3SOIFDfactor1 * (0.5 / sqrtXdep * T1 * dXdep_dVb - + sqrtXdep * T2); - - T0 = pParam->B3SOIFDdvt2w * Vbs0mos; - if (T0 >= - 0.5) - { T1 = 1.0 + T0; - T2 = pParam->B3SOIFDdvt2w; - } - else /* Added to avoid any discontinuity problems caused by - dvt2w */ - { T4 = 1.0 / (3.0 + 8.0 * T0); - T1 = (1.0 + 3.0 * T0) * T4; - T2 = pParam->B3SOIFDdvt2w * T4 * T4; - } - ltw= model->B3SOIFDfactor1 * sqrtXdep * T1; - dltw_dVb = model->B3SOIFDfactor1 * (0.5 / sqrtXdep * T1 * dXdep_dVb - + sqrtXdep * T2); - - T0 = -0.5 * pParam->B3SOIFDdvt1 * Leff / lt1; - if (T0 > -EXP_THRESHOLD) - { T1 = exp(T0); - dT1_dVb = -T0 / lt1 * T1 * dlt1_dVb; - Theta0 = T1 * (1.0 + 2.0 * T1); - dTheta0_dVb = (1.0 + 4.0 * T1) * dT1_dVb; - } - else - { T1 = MIN_EXP; - Theta0 = T1 * (1.0 + 2.0 * T1); - dTheta0_dVb = 0.0; - } - here->B3SOIFDthetavth = pParam->B3SOIFDdvt0 * Theta0; - Delt_vth = here->B3SOIFDthetavth * V0; - dDelt_vth_dVb = pParam->B3SOIFDdvt0 * dTheta0_dVb * V0; - if (selfheat) dDelt_vth_dT = here->B3SOIFDthetavth * dvbi_dT; - else dDelt_vth_dT = 0.0; - - T0 = -0.5*pParam->B3SOIFDdvt1w * pParam->B3SOIFDweff*Leff/ltw; - if (T0 > -EXP_THRESHOLD) - { T1 = exp(T0); - T2 = T1 * (1.0 + 2.0 * T1); - dT1_dVb = -T0 / ltw * T1 * dltw_dVb; - dT2_dVb = (1.0 + 4.0 * T1) * dT1_dVb; - } - else - { T1 = MIN_EXP; - T2 = T1 * (1.0 + 2.0 * T1); - dT2_dVb = 0.0; - } - T0 = pParam->B3SOIFDdvt0w * T2; - DeltVthw = T0 * V0; - dDeltVthw_dVb = pParam->B3SOIFDdvt0w * dT2_dVb * V0; - if (selfheat) dDeltVthw_dT = T0 * dvbi_dT; - else dDeltVthw_dT = 0.0; - - T0 = sqrt(1.0 + pParam->B3SOIFDnlx / Leff); - T1 = (pParam->B3SOIFDkt1 + pParam->B3SOIFDkt1l / Leff - + pParam->B3SOIFDkt2 * Vbs0mos); - DeltVthtemp = pParam->B3SOIFDk1 * (T0 - 1.0) * sqrtPhi + T1 * TempRatio; - if (selfheat) dDeltVthtemp_dT = T1 / model->B3SOIFDtnom; - else dDeltVthtemp_dT = 0.0; - - tmp2 = model->B3SOIFDtox * phi - / (pParam->B3SOIFDweff + pParam->B3SOIFDw0); - - T3 = pParam->B3SOIFDeta0 + pParam->B3SOIFDetab * Vbs0mos; - if (T3 < 1.0e-4) /* avoid discontinuity problems caused by etab */ - { T9 = 1.0 / (3.0 - 2.0e4 * T3); - T3 = (2.0e-4 - T3) * T9; - T4 = T9 * T9 * pParam->B3SOIFDetab; - dT3_dVb = T4; - } - else - { - dT3_dVb = pParam->B3SOIFDetab; - } - DIBL_Sft = T3 * pParam->B3SOIFDtheta0vb0 * Vds; - dDIBL_Sft_dVd = T3 * pParam->B3SOIFDtheta0vb0; - dDIBL_Sft_dVb = pParam->B3SOIFDtheta0vb0 * Vds * dT3_dVb; - - Vthfd = model->B3SOIFDtype * pParam->B3SOIFDvth0 + pParam->B3SOIFDk1 - * (sqrtPhis - sqrtPhi) - pParam->B3SOIFDk2 - * Vbs0mos-Delt_vth-DeltVthw +(pParam->B3SOIFDk3 +pParam->B3SOIFDk3b - * Vbs0mos) * tmp2 + DeltVthtemp - DIBL_Sft; - - T6 = pParam->B3SOIFDk3b * tmp2 - pParam->B3SOIFDk2 + - pParam->B3SOIFDkt2 * TempRatio; - dVthfd_dVd = -dDIBL_Sft_dVd; - T7 = pParam->B3SOIFDk1 * dsqrtPhis_dVb - - dDelt_vth_dVb - dDeltVthw_dVb - + T6 - dDIBL_Sft_dVb; - dVthfd_dVe = T7 * dVbs0mos_dVe; - if (selfheat) - dVthfd_dT = dDeltVthtemp_dT - dDelt_vth_dT - dDeltVthw_dT - + T7 * dVbs0mos_dT; - else - dVthfd_dT = 0.0; - -/* Effective Vbs0 and Vbs0t for all Vgs */ - T1 = Vthfd - Vgs_eff - DELT_Vbs0eff; - T2 = sqrt(T1 * T1 + DELT_Vbs0eff * DELT_Vbs0eff ); - - Vbs0teff = Vbs0t - 0.5 * (T1 + T2); - dVbs0teff_dVg = 0.5 * (1 + T1/T2) * dVgs_eff_dVg; - dVbs0teff_dVd = - 0.5 * (1 + T1 / T2) * dVthfd_dVd; - dVbs0teff_dVe = - 0.5 * (1 + T1 / T2) * dVthfd_dVe; - if (selfheat) - dVbs0teff_dT = dVbs0t_dT - 0.5 * (1 + T1 / T2) * dVthfd_dT; - else - dVbs0teff_dT = 0.0; - - /* Calculate nfb */ - T3 = 1 / (K1 * K1); - T4 = pParam->B3SOIFDkb3 * Cbox / model->B3SOIFDcox; - T8 = sqrt(phi - Vbs0mos); - T5 = sqrt(1 + 4 * T3 * (phi + K1 * T8 - Vbs0mos)); - T6 = 1 + T4 * T5; - Nfb = model->B3SOIFDnfb = 1 / T6; - T7 = 2 * T3 * T4 * Nfb * Nfb / T5 * (0.5 * K1 / T8 + 1); - Vbs0eff = Vbs0 - Nfb * 0.5 * (T1 + T2); - dVbs0eff_dVg = Nfb * 0.5 * (1 + T1/T2) * dVgs_eff_dVg; - dVbs0eff_dVd = - Nfb * 0.5 * (1 + T1 / T2) * dVthfd_dVd; - dVbs0eff_dVe = dVbs0_dVe - Nfb * 0.5 * (1 + T1 / T2) - * dVthfd_dVe - T7 * 0.5 * (T1 + T2) * dVbs0mos_dVe; - if (selfheat) - dVbs0eff_dT = dVbs0_dT - Nfb * 0.5 * (1 + T1 / T2) - * dVthfd_dT - T7 * 0.5 * (T1 + T2) * dVbs0mos_dT; - else - dVbs0eff_dT = 0.0; - -/* Simple check of Vbs */ -/* Prepare Vbsdio */ - Vbs = Vbsdio = Vbs0eff; - dVbsdio_dVg = dVbs0eff_dVg; - dVbsdio_dVd = dVbs0eff_dVd; - dVbsdio_dVe = dVbs0eff_dVe; - dVbsdio_dT = dVbs0eff_dT; - dVbsdio_dVb = 0.0; - -/* Prepare Vbseff */ - T1 = Vbs0teff - Vbsdio - DELT_Vbsmos; - T2 = sqrt(T1 * T1 + DELT_Vbsmos * DELT_Vbsmos); - T3 = 0.5 * (T1 + T2); - T5 = 0.5 * (1 + T1/T2); - dT3_dVg = T5 * (dVbs0teff_dVg - dVbsdio_dVg); - dT3_dVd = T5 * (dVbs0teff_dVd - dVbsdio_dVd); - dT3_dVb = - T5 * dVbsdio_dVb; - dT3_dVe = T5 * (dVbs0teff_dVe - dVbsdio_dVe); - if (selfheat) dT3_dT = T5 * (dVbs0teff_dT - dVbsdio_dT); - else dT3_dT = 0.0; - T4 = T3 * model->B3SOIFDcsieff / model->B3SOIFDqsieff; - - Vbsmos = Vbsdio - 0.5 * T3 * T4; - dVbsmos_dVg = dVbsdio_dVg - T4 * dT3_dVg; - dVbsmos_dVd = dVbsdio_dVd - T4 * dT3_dVd; - dVbsmos_dVb = dVbsdio_dVb - T4 * dT3_dVb; - dVbsmos_dVe = dVbsdio_dVe - T4 * dT3_dVe; - if (selfheat) dVbsmos_dT = dVbsdio_dT - T4 * dT3_dT; - else dVbsmos_dT = 0.0; - -/* Prepare Vcs */ - Vcs = Vbsdio - Vbs0eff; - dVcs_dVb = dVbsdio_dVb; - dVcs_dVg = dVbsdio_dVg - dVbs0eff_dVg; - dVcs_dVd = dVbsdio_dVd - dVbs0eff_dVd; - dVcs_dVe = dVbsdio_dVe - dVbs0eff_dVe; - dVcs_dT = dVbsdio_dT - dVbs0eff_dT; - -/* Check Vps */ - /* Note : if Vps is less Vbs0eff => non-physical */ - T1 = Vps - Vbs0eff + DELT_Vbs0dio; - T2 = sqrt(T1 * T1 + DELT_Vbs0dio * DELT_Vbs0dio); - T3 = 0.5 * (1 + T1/T2); - Vpsdio = Vbs0eff + 0.5 * (T1 + T2); - dVpsdio_dVg = (1 - T3) * dVbs0eff_dVg; - dVpsdio_dVd = (1 - T3) * dVbs0eff_dVd; - dVpsdio_dVe = (1 - T3) * dVbs0eff_dVe; - if (selfheat) dVpsdio_dT = (1 - T3) * dVbs0eff_dT; - else dVpsdio_dT = 0.0; - dVpsdio_dVp = T3; - Vbp = Vbsdio - Vpsdio; - dVbp_dVb = dVbsdio_dVb; - dVbp_dVg = dVbsdio_dVg - dVpsdio_dVg; - dVbp_dVd = dVbsdio_dVd - dVpsdio_dVd; - dVbp_dVe = dVbsdio_dVe - dVpsdio_dVe; - dVbp_dT = dVbsdio_dT - dVpsdio_dT; - dVbp_dVp = - dVpsdio_dVp; - - here->B3SOIFDvbsdio = Vbsdio; - here->B3SOIFDvbs0eff = Vbs0eff; - - T1 = phi - pParam->B3SOIFDdelp; - T2 = T1 - Vbsmos - DELT_Vbseff; - T3 = sqrt(T2 * T2 + 4.0 * DELT_Vbseff * T1); - Vbseff = T1 - 0.5 * (T2 + T3); - T4 = 0.5 * (1 + T2/T3); - dVbseff_dVg = T4 * dVbsmos_dVg; - dVbseff_dVd = T4 * dVbsmos_dVd; - dVbseff_dVb = T4 * dVbsmos_dVb; - dVbseff_dVe = T4 * dVbsmos_dVe; - if (selfheat) dVbseff_dT = T4 * dVbsmos_dT; - else dVbseff_dT = 0.0; - - here->B3SOIFDvbseff = Vbseff; - - Phis = phi - Vbseff; - dPhis_dVb = -1; - sqrtPhis = sqrt(Phis); - dsqrtPhis_dVb = -0.5 / sqrtPhis ; - - Xdep = Xdep0 * sqrtPhis / sqrtPhi; - dXdep_dVb = (Xdep0 / sqrtPhi) - * dsqrtPhis_dVb; - -/* Vth Calculation */ - T3 = sqrt(Xdep); - - T0 = pParam->B3SOIFDdvt2 * Vbseff; - if (T0 >= - 0.5) - { T1 = 1.0 + T0; - T2 = pParam->B3SOIFDdvt2 ; - } - else /* Added to avoid any discontinuity problems caused by dvt2 */ - { T4 = 1.0 / (3.0 + 8.0 * T0); - T1 = (1.0 + 3.0 * T0) * T4; - T2 = pParam->B3SOIFDdvt2 * T4 * T4 ; - } - lt1 = model->B3SOIFDfactor1 * T3 * T1; - dlt1_dVb =model->B3SOIFDfactor1 * (0.5 / T3 * T1 * dXdep_dVb + T3 * T2); - - T0 = pParam->B3SOIFDdvt2w * Vbseff; - if (T0 >= - 0.5) - { T1 = 1.0 + T0; - T2 = pParam->B3SOIFDdvt2w ; - } - else /* Added to avoid any discontinuity problems caused by dvt2w */ - { T4 = 1.0 / (3.0 + 8.0 * T0); - T1 = (1.0 + 3.0 * T0) * T4; - T2 = pParam->B3SOIFDdvt2w * T4 * T4 ; - } - ltw= model->B3SOIFDfactor1 * T3 * T1; - dltw_dVb=model->B3SOIFDfactor1*(0.5 / T3 * T1 * dXdep_dVb + T3 * T2); - - T0 = -0.5 * pParam->B3SOIFDdvt1 * Leff / lt1; - if (T0 > -EXP_THRESHOLD) - { T1 = exp(T0); - Theta0 = T1 * (1.0 + 2.0 * T1); - dT1_dVb = -T0 / lt1 * T1 * dlt1_dVb; - dTheta0_dVb = (1.0 + 4.0 * T1) * dT1_dVb; - } - else - { T1 = MIN_EXP; - Theta0 = T1 * (1.0 + 2.0 * T1); - dTheta0_dVb = 0.0; - } - - here->B3SOIFDthetavth = pParam->B3SOIFDdvt0 * Theta0; - Delt_vth = here->B3SOIFDthetavth * V0; - dDelt_vth_dVb = pParam->B3SOIFDdvt0 * dTheta0_dVb * V0; - if (selfheat) dDelt_vth_dT = here->B3SOIFDthetavth * dvbi_dT; - else dDelt_vth_dT = 0.0; - - T0 = -0.5 * pParam->B3SOIFDdvt1w * pParam->B3SOIFDweff * Leff / ltw; - if (T0 > -EXP_THRESHOLD) - { T1 = exp(T0); - T2 = T1 * (1.0 + 2.0 * T1); - dT1_dVb = -T0 / ltw * T1 * dltw_dVb; - dT2_dVb = (1.0 + 4.0 * T1) * dT1_dVb; - } - else - { T1 = MIN_EXP; - T2 = T1 * (1.0 + 2.0 * T1); - dT2_dVb = 0.0; - } - - T0 = pParam->B3SOIFDdvt0w * T2; - DeltVthw = T0 * V0; - dDeltVthw_dVb = pParam->B3SOIFDdvt0w * dT2_dVb * V0; - if (selfheat) dDeltVthw_dT = T0 * dvbi_dT; - else dDeltVthw_dT = 0.0; - - T0 = sqrt(1.0 + pParam->B3SOIFDnlx / Leff); - T1 = (pParam->B3SOIFDkt1 + pParam->B3SOIFDkt1l / Leff - + pParam->B3SOIFDkt2 * Vbseff); - DeltVthtemp = pParam->B3SOIFDk1 * (T0 - 1.0) * sqrtPhi + T1 * TempRatio; - if (selfheat) - dDeltVthtemp_dT = T1 / model->B3SOIFDtnom; - else - dDeltVthtemp_dT = 0.0; - - tmp2 = model->B3SOIFDtox * phi - / (pParam->B3SOIFDweff + pParam->B3SOIFDw0); - - T3 = pParam->B3SOIFDeta0 + pParam->B3SOIFDetab * Vbseff; - if (T3 < 1.0e-4) /* avoid discontinuity problems caused by etab */ - { T9 = 1.0 / (3.0 - 2.0e4 * T3); - T3 = (2.0e-4 - T3) * T9; - T4 = T9 * T9 * pParam->B3SOIFDetab; - dT3_dVb = T4 ; - } - else - { - dT3_dVb = pParam->B3SOIFDetab ; - } - DIBL_Sft = T3 * pParam->B3SOIFDtheta0vb0 * Vds; - dDIBL_Sft_dVd = pParam->B3SOIFDtheta0vb0 * T3; - dDIBL_Sft_dVb = pParam->B3SOIFDtheta0vb0 * Vds * dT3_dVb; - - Vth = model->B3SOIFDtype * pParam->B3SOIFDvth0 + pParam->B3SOIFDk1 - * (sqrtPhis - sqrtPhi) - pParam->B3SOIFDk2 - * Vbseff- Delt_vth - DeltVthw +(pParam->B3SOIFDk3 + pParam->B3SOIFDk3b - * Vbseff) * tmp2 + DeltVthtemp - DIBL_Sft; - - here->B3SOIFDvon = Vth; - - T6 = pParam->B3SOIFDk3b * tmp2 - pParam->B3SOIFDk2 - + pParam->B3SOIFDkt2 * TempRatio; - dVth_dVb = pParam->B3SOIFDk1 * dsqrtPhis_dVb - - dDelt_vth_dVb - dDeltVthw_dVb - + T6 - dDIBL_Sft_dVb; /* this is actually dVth_dVbseff */ - dVth_dVd = -dDIBL_Sft_dVd; - if (selfheat) dVth_dT = dDeltVthtemp_dT - dDelt_vth_dT - dDeltVthw_dT; - else dVth_dT = 0.0; - -/* Calculate n */ - T2 = pParam->B3SOIFDnfactor * EPSSI / Xdep; - dT2_dVb = - T2 / Xdep * dXdep_dVb; - - T3 = pParam->B3SOIFDcdsc + pParam->B3SOIFDcdscb * Vbseff - + pParam->B3SOIFDcdscd * Vds; - dT3_dVb = pParam->B3SOIFDcdscb; - dT3_dVd = pParam->B3SOIFDcdscd; - - T4 = (T2 + T3 * Theta0 + pParam->B3SOIFDcit) / model->B3SOIFDcox; - dT4_dVb = (dT2_dVb + Theta0 * dT3_dVb + dTheta0_dVb * T3) - / model->B3SOIFDcox; - dT4_dVd = Theta0 * dT3_dVd / model->B3SOIFDcox; - - if (T4 >= -0.5) - { n = 1.0 + T4; - dn_dVb = dT4_dVb; - dn_dVd = dT4_dVd; - } - else - /* avoid discontinuity problems caused by T4 */ - { T0 = 1.0 / (3.0 + 8.0 * T4); - n = (1.0 + 3.0 * T4) * T0; - T0 *= T0; - dn_dVb = T0 * dT4_dVb; - dn_dVd = T0 * dT4_dVd; - } - -/* Effective Vgst (Vgsteff) Calculation */ - - Vgst = Vgs_eff - Vth; - - T10 = 2.0 * n * Vtm; - VgstNVt = Vgst / T10; - ExpArg = (2.0 * pParam->B3SOIFDvoff - Vgst) / T10; - - /* MCJ: Very small Vgst */ - if (VgstNVt > EXP_THRESHOLD) - { Vgsteff = Vgst; - /* T0 is dVgsteff_dVbseff */ - T0 = -dVth_dVb; - dVgsteff_dVg = dVgs_eff_dVg + T0 * dVbseff_dVg; - dVgsteff_dVd = -dVth_dVd + T0 * dVbseff_dVd; - dVgsteff_dVb = T0 * dVbseff_dVb; - dVgsteff_dVe = T0 * dVbseff_dVe; - if (selfheat) - dVgsteff_dT = -dVth_dT + T0 * dVbseff_dT; - else - dVgsteff_dT = 0.0; - } - else if (ExpArg > EXP_THRESHOLD) - { T0 = (Vgst - pParam->B3SOIFDvoff) / (n * Vtm); - ExpVgst = exp(T0); - Vgsteff = Vtm * pParam->B3SOIFDcdep0 / model->B3SOIFDcox * ExpVgst; - T3 = Vgsteff / (n * Vtm) ; - /* T1 is dVgsteff_dVbseff */ - T1 = -T3 * (dVth_dVb + T0 * Vtm * dn_dVb); - dVgsteff_dVg = T3 * dVgs_eff_dVg + T1 * dVbseff_dVg; - dVgsteff_dVd = -T3 * (dVth_dVd + T0 * Vtm * dn_dVd) + T1 * dVbseff_dVd; - dVgsteff_dVe = T1 * dVbseff_dVe; - dVgsteff_dVb = T1 * dVbseff_dVb; - if (selfheat) - dVgsteff_dT = -T3 * (dVth_dT + T0 * dVtm_dT * n) - + Vgsteff / Temp + T1 * dVbseff_dT; - else - dVgsteff_dT = 0.0; - } - else - { ExpVgst = exp(VgstNVt); - T1 = T10 * log(1.0 + ExpVgst); - dT1_dVg = ExpVgst / (1.0 + ExpVgst); - dT1_dVb = -dT1_dVg * (dVth_dVb + Vgst / n * dn_dVb) - + T1 / n * dn_dVb; - dT1_dVd = -dT1_dVg * (dVth_dVd + Vgst / n * dn_dVd) - + T1 / n * dn_dVd; - T3 = (1.0 / Temp); - if (selfheat) - dT1_dT = -dT1_dVg * (dVth_dT + Vgst * T3) + T1 * T3; - else - dT1_dT = 0.0; - - dT2_dVg = -model->B3SOIFDcox / (Vtm * pParam->B3SOIFDcdep0) - * exp(ExpArg); - T2 = 1.0 - T10 * dT2_dVg; - dT2_dVd = -dT2_dVg * (dVth_dVd - 2.0 * Vtm * ExpArg * dn_dVd) - + (T2 - 1.0) / n * dn_dVd; - dT2_dVb = -dT2_dVg * (dVth_dVb - 2.0 * Vtm * ExpArg * dn_dVb) - + (T2 - 1.0) / n * dn_dVb; - if (selfheat) - dT2_dT = -dT2_dVg * (dVth_dT - ExpArg * T10 * T3); - else - dT2_dT = 0.0; - - Vgsteff = T1 / T2; - T3 = T2 * T2; - /* T4 is dVgsteff_dVbseff */ - T4 = (T2 * dT1_dVb - T1 * dT2_dVb) / T3; - dVgsteff_dVb = T4 * dVbseff_dVb; - dVgsteff_dVe = T4 * dVbseff_dVe; - dVgsteff_dVg = (T2 * dT1_dVg - T1 * dT2_dVg) / T3 * dVgs_eff_dVg - + T4 * dVbseff_dVg; - dVgsteff_dVd = (T2 * dT1_dVd - T1 * dT2_dVd) / T3 + T4 * dVbseff_dVd; - if (selfheat) - dVgsteff_dT = (T2 * dT1_dT - T1 * dT2_dT) / T3 + T4 * dVbseff_dT; - else - dVgsteff_dT = 0.0; - } - Vgst2Vtm = Vgsteff + 2.0 * Vtm; - if (selfheat) dVgst2Vtm_dT = 2.0 * dVtm_dT; - else dVgst2Vtm_dT = 0.0; - -/* Calculate Effective Channel Geometry */ - T9 = sqrtPhis - sqrtPhi; - Weff = pParam->B3SOIFDweff - 2.0 * (pParam->B3SOIFDdwg * Vgsteff - + pParam->B3SOIFDdwb * T9); - dWeff_dVg = -2.0 * pParam->B3SOIFDdwg; - dWeff_dVb = -2.0 * pParam->B3SOIFDdwb * dsqrtPhis_dVb; - - if (Weff < 2.0e-8) /* to avoid the discontinuity problem due to Weff*/ - { T0 = 1.0 / (6.0e-8 - 2.0 * Weff); - Weff = 2.0e-8 * (4.0e-8 - Weff) * T0; - T0 *= T0 * 4.0e-16; - dWeff_dVg *= T0; - dWeff_dVb *= T0; - } - - T0 = pParam->B3SOIFDprwg * Vgsteff + pParam->B3SOIFDprwb * T9; - if (T0 >= -0.9) - { Rds = rds0 * (1.0 + T0); - dRds_dVg = rds0 * pParam->B3SOIFDprwg; - dRds_dVb = rds0 * pParam->B3SOIFDprwb * dsqrtPhis_dVb; - if (selfheat) dRds_dT = (1.0 + T0) * drds0_dT; - else dRds_dT = 0.0; - } - else - /* to avoid the discontinuity problem due to prwg and prwb*/ - { T1 = 1.0 / (17.0 + 20.0 * T0); - Rds = rds0 * (0.8 + T0) * T1; - T1 *= T1; - dRds_dVg = rds0 * pParam->B3SOIFDprwg * T1; - dRds_dVb = rds0 * pParam->B3SOIFDprwb * dsqrtPhis_dVb - * T1; - if (selfheat) dRds_dT = (0.8 + T0) * T1 * drds0_dT; - else dRds_dT = 0.0; - } - -/* Calculate Abulk */ - if (pParam->B3SOIFDa0 == 0.0) - { - Abulk0 = Abulk = dAbulk0_dVb = dAbulk_dVg = dAbulk_dVb = 0.0; - } - else - { - T1 = 0.5 * pParam->B3SOIFDk1 / sqrtPhi; - T9 = sqrt(model->B3SOIFDxj * Xdep); - tmp1 = Leff + 2.0 * T9; - T5 = Leff / tmp1; - tmp2 = pParam->B3SOIFDa0 * T5; - tmp3 = pParam->B3SOIFDweff + pParam->B3SOIFDb1; - tmp4 = pParam->B3SOIFDb0 / tmp3; - T2 = tmp2 + tmp4; - dT2_dVb = -T9 * tmp2 / tmp1 / Xdep * dXdep_dVb; - T6 = T5 * T5; - T7 = T5 * T6; - - Abulk0 = T1 * T2; - dAbulk0_dVb = T1 * dT2_dVb; - - T8 = pParam->B3SOIFDags * pParam->B3SOIFDa0 * T7; - dAbulk_dVg = -T1 * T8; - Abulk = Abulk0 + dAbulk_dVg * Vgsteff; - - dAbulk_dVb = dAbulk0_dVb - T8 * Vgsteff * 3.0 * T1 * dT2_dVb - / tmp2; - } - - if (Abulk0 < 0.01) - { - T9 = 1.0 / (3.0 - 200.0 * Abulk0); - Abulk0 = (0.02 - Abulk0) * T9; - dAbulk0_dVb *= T9 * T9; - } - - if (Abulk < 0.01) - { - T9 = 1.0 / (3.0 - 200.0 * Abulk); - Abulk = (0.02 - Abulk) * T9; - dAbulk_dVb *= T9 * T9; - } - - T2 = pParam->B3SOIFDketa * Vbseff; - if (T2 >= -0.9) - { T0 = 1.0 / (1.0 + T2); - dT0_dVb = -pParam->B3SOIFDketa * T0 * T0 ; - } - else - /* added to avoid the problems caused by Keta */ - { T1 = 1.0 / (0.8 + T2); - T0 = (17.0 + 20.0 * T2) * T1; - dT0_dVb = -pParam->B3SOIFDketa * T1 * T1 ; - } - dAbulk_dVg *= T0; - dAbulk_dVb = dAbulk_dVb * T0 + Abulk * dT0_dVb; - dAbulk0_dVb = dAbulk0_dVb * T0 + Abulk0 * dT0_dVb; - Abulk *= T0; - Abulk0 *= T0; - - Abulk += 1; - Abulk0 += 1; - -/* Prepare Abeff */ - T0 = pParam->B3SOIFDabp * Vgst2Vtm; - T1 = 1 - Vcs / T0 - DELT_Xcsat; - T2 = sqrt(T1 * T1 + DELT_Xcsat * DELT_Xcsat); - T3 = 1 - 0.5 * (T1 + T2); - T5 = -0.5 * (1 + T1 / T2); - dT1_dVg = Vcs / Vgst2Vtm / T0; - dT3_dVg = T5 * dT1_dVg; - dT1_dVc = - 1 / T0; - dT3_dVc = T5 * dT1_dVc; - - Xcsat = pParam->B3SOIFDmxc * T3 * T3 + (1 - pParam->B3SOIFDmxc)*T3; - T4 = 2 * pParam->B3SOIFDmxc * T3 + (1 - pParam->B3SOIFDmxc); - dXcsat_dVg = T4 * dT3_dVg; - dXcsat_dVc = T4 * dT3_dVc; - - Abeff = Xcsat * Abulk + (1 - Xcsat) * model->B3SOIFDadice; - T0 = Xcsat * dAbulk_dVg + Abulk * dXcsat_dVg; - dAbeff_dVg = T0 - model->B3SOIFDadice * dXcsat_dVg; - dAbeff_dVb = Xcsat * dAbulk_dVb; - dAbeff_dVc = (Abulk - model->B3SOIFDadice) * dXcsat_dVc; - here->B3SOIFDabeff = Abeff; - -/* Mobility calculation */ - if (model->B3SOIFDmobMod == 1) - { T0 = Vgsteff + Vth + Vth; - T2 = ua + uc * Vbseff; - T3 = T0 / model->B3SOIFDtox; - T5 = T3 * (T2 + ub * T3); - dDenomi_dVg = (T2 + 2.0 * ub * T3) / model->B3SOIFDtox; - dDenomi_dVd = dDenomi_dVg * 2 * dVth_dVd; - dDenomi_dVb = dDenomi_dVg * 2 * dVth_dVb + uc * T3 ; - if (selfheat) - dDenomi_dT = dDenomi_dVg * 2 * dVth_dT - + (dua_dT + Vbseff * duc_dT - + dub_dT * T3 ) * T3; - else - dDenomi_dT = 0.0; - } - else if (model->B3SOIFDmobMod == 2) - { T5 = Vgsteff / model->B3SOIFDtox * (ua - + uc * Vbseff + ub * Vgsteff - / model->B3SOIFDtox); - dDenomi_dVg = (ua + uc * Vbseff - + 2.0 * ub * Vgsteff / model->B3SOIFDtox) - / model->B3SOIFDtox; - dDenomi_dVd = 0.0; - dDenomi_dVb = Vgsteff * uc / model->B3SOIFDtox ; - if (selfheat) - dDenomi_dT = Vgsteff / model->B3SOIFDtox - * (dua_dT + Vbseff * duc_dT + dub_dT - * Vgsteff / model->B3SOIFDtox); - else - dDenomi_dT = 0.0; - } - else /* mobMod == 3 */ - { T0 = Vgsteff + Vth + Vth; - T2 = 1.0 + uc * Vbseff; - T3 = T0 / model->B3SOIFDtox; - T4 = T3 * (ua + ub * T3); - T5 = T4 * T2; - dDenomi_dVg = (ua + 2.0 * ub * T3) * T2 - / model->B3SOIFDtox; - dDenomi_dVd = dDenomi_dVg * 2.0 * dVth_dVd; - dDenomi_dVb = dDenomi_dVg * 2.0 * dVth_dVb - + uc * T4 ; - if (selfheat) - dDenomi_dT = dDenomi_dVg * 2.0 * dVth_dT - + (dua_dT + dub_dT * T3) * T3 * T2 - + T4 * Vbseff * duc_dT; - else - dDenomi_dT = 0.0; - } - - if (T5 >= -0.8) - { Denomi = 1.0 + T5; - } - else /* Added to avoid the discontinuity problem caused by ua and ub*/ - { T9 = 1.0 / (7.0 + 10.0 * T5); - Denomi = (0.6 + T5) * T9; - T9 *= T9; - dDenomi_dVg *= T9; - dDenomi_dVd *= T9; - dDenomi_dVb *= T9; - if (selfheat) dDenomi_dT *= T9; - else dDenomi_dT = 0.0; - } - - here->B3SOIFDueff = ueff = u0temp / Denomi; - T9 = -ueff / Denomi; - dueff_dVg = T9 * dDenomi_dVg; - dueff_dVd = T9 * dDenomi_dVd; - dueff_dVb = T9 * dDenomi_dVb; - if (selfheat) dueff_dT = T9 * dDenomi_dT + du0temp_dT / Denomi; - else dueff_dT = 0.0; - -/* Saturation Drain Voltage Vdsat */ - WVCox = Weff * vsattemp * model->B3SOIFDcox; - WVCoxRds = WVCox * Rds; - -/* dWVCoxRds_dT = WVCox * dRds_dT - + Weff * model->B3SOIFDcox * Rds * dvsattemp_dT; */ - - Esat = 2.0 * vsattemp / ueff; - EsatL = Esat * Leff; - T0 = -EsatL /ueff; - dEsatL_dVg = T0 * dueff_dVg; - dEsatL_dVd = T0 * dueff_dVd; - dEsatL_dVb = T0 * dueff_dVb; - if (selfheat) - dEsatL_dT = T0 * dueff_dT + EsatL / vsattemp * dvsattemp_dT; - else - dEsatL_dT = 0.0; - - /* Sqrt() */ - a1 = pParam->B3SOIFDa1; - if (a1 == 0.0) - { Lambda = pParam->B3SOIFDa2; - dLambda_dVg = 0.0; - } - else if (a1 > 0.0) -/* Added to avoid the discontinuity problem caused by a1 and a2 (Lambda) */ - { T0 = 1.0 - pParam->B3SOIFDa2; - T1 = T0 - pParam->B3SOIFDa1 * Vgsteff - 0.0001; - T2 = sqrt(T1 * T1 + 0.0004 * T0); - Lambda = pParam->B3SOIFDa2 + T0 - 0.5 * (T1 + T2); - dLambda_dVg = 0.5 * pParam->B3SOIFDa1 * (1.0 + T1 / T2); - } - else - { T1 = pParam->B3SOIFDa2 + pParam->B3SOIFDa1 * Vgsteff - 0.0001; - T2 = sqrt(T1 * T1 + 0.0004 * pParam->B3SOIFDa2); - Lambda = 0.5 * (T1 + T2); - dLambda_dVg = 0.5 * pParam->B3SOIFDa1 * (1.0 + T1 / T2); - } - - if (Rds > 0) - { tmp2 = dRds_dVg / Rds + dWeff_dVg / Weff; - tmp3 = dRds_dVb / Rds + dWeff_dVb / Weff; - } - else - { tmp2 = dWeff_dVg / Weff; - tmp3 = dWeff_dVb / Weff; - } - if ((Rds == 0.0) && (Lambda == 1.0)) - { T0 = 1.0 / (Abeff * EsatL + Vgst2Vtm); - tmp1 = 0.0; - T1 = T0 * T0; - T2 = Vgst2Vtm * T0; - T3 = EsatL * Vgst2Vtm; - Vdsat = T3 * T0; - - dT0_dVg = -(Abeff * dEsatL_dVg + EsatL * dAbeff_dVg + 1.0) * T1; - dT0_dVd = -(Abeff * dEsatL_dVd) * T1; - dT0_dVb = -(Abeff * dEsatL_dVb + EsatL * dAbeff_dVb) * T1; - dT0_dVc = 0.0; - if (selfheat) - dT0_dT = -(Abeff * dEsatL_dT + dVgst2Vtm_dT) * T1; - else dT0_dT = 0.0; - - dVdsat_dVg = T3 * dT0_dVg + T2 * dEsatL_dVg + EsatL * T0; - dVdsat_dVd = T3 * dT0_dVd + T2 * dEsatL_dVd; - dVdsat_dVb = T3 * dT0_dVb + T2 * dEsatL_dVb; - dVdsat_dVc = 0.0; - if (selfheat) - dVdsat_dT = T3 * dT0_dT + T2 * dEsatL_dT - + EsatL * T0 * dVgst2Vtm_dT; - else dVdsat_dT = 0.0; - } - else - { tmp1 = dLambda_dVg / (Lambda * Lambda); - T9 = Abeff * WVCoxRds; - T8 = Abeff * T9; - T7 = Vgst2Vtm * T9; - T6 = Vgst2Vtm * WVCoxRds; - T0 = 2.0 * Abeff * (T9 - 1.0 + 1.0 / Lambda); - dT0_dVg = 2.0 * (T8 * tmp2 - Abeff * tmp1 - + (2.0 * T9 + 1.0 / Lambda - 1.0) * dAbeff_dVg); -/* dT0_dVb = 2.0 * (T8 * tmp3 this is equivalent to one below, but simpler - + (2.0 * T9 + 1.0 / Lambda - 1.0) * dAbeff_dVg); */ - dT0_dVb = 2.0 * (T8 * (2.0 / Abeff * dAbeff_dVb + tmp3) - + (1.0 / Lambda - 1.0) * dAbeff_dVb); - dT0_dVd = 0.0; - dT0_dVc = 0.0; - - if (selfheat) - { - tmp4 = dRds_dT / Rds + dvsattemp_dT / vsattemp; - dT0_dT = 2.0 * T8 * tmp4; - } else tmp4 = dT0_dT = 0.0; - - T1 = Vgst2Vtm * (2.0 / Lambda - 1.0) + Abeff * EsatL + 3.0 * T7; - - dT1_dVg = (2.0 / Lambda - 1.0) - 2.0 * Vgst2Vtm * tmp1 - + Abeff * dEsatL_dVg + EsatL * dAbeff_dVg + 3.0 * (T9 - + T7 * tmp2 + T6 * dAbeff_dVg); - dT1_dVb = Abeff * dEsatL_dVb + EsatL * dAbeff_dVb - + 3.0 * (T6 * dAbeff_dVb + T7 * tmp3); - dT1_dVd = Abeff * dEsatL_dVd; - dT1_dVc = 0.0; - - - if (selfheat) - { - tmp4 += dVgst2Vtm_dT / Vgst2Vtm; - dT1_dT = (2.0 / Lambda - 1.0) * dVgst2Vtm_dT - + Abeff * dEsatL_dT + 3.0 * T7 * tmp4; - } else dT1_dT = 0.0; - - T2 = Vgst2Vtm * (EsatL + 2.0 * T6); - dT2_dVg = EsatL + Vgst2Vtm * dEsatL_dVg - + T6 * (4.0 + 2.0 * Vgst2Vtm * tmp2); - dT2_dVb = Vgst2Vtm * (dEsatL_dVb + 2.0 * T6 * tmp3); - dT2_dVd = Vgst2Vtm * dEsatL_dVd; - if (selfheat) - dT2_dT = Vgst2Vtm * dEsatL_dT + EsatL * dVgst2Vtm_dT - + 2.0 * T6 * (dVgst2Vtm_dT + Vgst2Vtm * tmp4); - else - dT2_dT = 0.0; - - T3 = sqrt(T1 * T1 - 2.0 * T0 * T2); - Vdsat = (T1 - T3) / T0; - - dVdsat_dVg = (dT1_dVg - (T1 * dT1_dVg - dT0_dVg * T2 - - T0 * dT2_dVg) / T3 - Vdsat * dT0_dVg) / T0; - dVdsat_dVb = (dT1_dVb - (T1 * dT1_dVb - dT0_dVb * T2 - - T0 * dT2_dVb) / T3 - Vdsat * dT0_dVb) / T0; - dVdsat_dVd = (dT1_dVd - (T1 * dT1_dVd - T0 * dT2_dVd) / T3) / T0; - dVdsat_dVc = 0.0; - if (selfheat) - dVdsat_dT = (dT1_dT - (T1 * dT1_dT - dT0_dT * T2 - - T0 * dT2_dT) / T3 - Vdsat * dT0_dT) / T0; - else dVdsat_dT = 0.0; - } - here->B3SOIFDvdsat = Vdsat; - -/* Vdsatii for impact ionization */ - if (pParam->B3SOIFDaii > 0.0) - { - if (pParam->B3SOIFDcii != 0.0) - { - T0 = pParam->B3SOIFDcii / sqrt(3.0) + pParam->B3SOIFDdii; - /* Hard limit Vds to T0 => T4 i.e. limit T0 to 3.0 */ - T1 = Vds - T0 - 0.1; - T2 = sqrt(T1 * T1 + 0.4); - T3 = T0 + 0.5 * (T1 + T2); - dT3_dVd = 0.5 * (1.0 + T1/T2); - - T4 = T3 - pParam->B3SOIFDdii; - T5 = pParam->B3SOIFDcii / T4; - T0 = T5 * T5; - dT0_dVd = - 2 * T0 / T4 * dT3_dVd; - } else - { - T0 = dT0_dVd = 0.0; - } - T0 += 1.0; - - T3 = pParam->B3SOIFDaii + pParam->B3SOIFDbii / Leff; - T4 = 1.0 / (T0 * Vgsteff + T3 * EsatL); - T5 = -T4 * T4; - T6 = Vgsteff * T4; - T7 = EsatL * Vgsteff; - Vdsatii = T7 * T4; - - dT4_dVg = T5 * (T0 + T3 * dEsatL_dVg); - dT4_dVb = T5 * T3 * dEsatL_dVb; - dT4_dVd = T5 * (Vgsteff * dT0_dVd + T3 * dEsatL_dVd); - - if (selfheat) dT4_dT = T5 * (T3 * dEsatL_dT); - else dT4_dT = 0.0; - - T8 = T4 * Vgsteff; - dVdsatii_dVg = T7 * dT4_dVg + T4 * (EsatL + Vgsteff * dEsatL_dVg); - dVdsatii_dVb = T7 * dT4_dVb + T8 * dEsatL_dVb; - dVdsatii_dVd = T7 * dT4_dVd + T8 * dEsatL_dVd; - if (selfheat) dVdsatii_dT = T7 * dT4_dT + T8 * dEsatL_dT; - else dVdsatii_dT = 0.0; - } else - { - Vdsatii = Vdsat; - dVdsatii_dVg = dVdsat_dVg; - dVdsatii_dVb = dVdsat_dVb; - dVdsatii_dVd = dVdsat_dVd; - dVdsatii_dT = dVdsat_dT; - } - -/* Effective Vds (Vdseff) Calculation */ - T1 = Vdsat - Vds - pParam->B3SOIFDdelta; - dT1_dVg = dVdsat_dVg; - dT1_dVd = dVdsat_dVd - 1.0; - dT1_dVb = dVdsat_dVb; - dT1_dVc = dVdsat_dVc; - dT1_dT = dVdsat_dT; - - T2 = sqrt(T1 * T1 + 4.0 * pParam->B3SOIFDdelta * Vdsat); - T0 = T1 / T2; - T3 = 2.0 * pParam->B3SOIFDdelta / T2; - dT2_dVg = T0 * dT1_dVg + T3 * dVdsat_dVg; - dT2_dVd = T0 * dT1_dVd + T3 * dVdsat_dVd; - dT2_dVb = T0 * dT1_dVb + T3 * dVdsat_dVb; - dT2_dVc = 0.0; - if (selfheat) - dT2_dT = T0 * dT1_dT + T3 * dVdsat_dT; - else dT2_dT = 0.0; - - Vdseff = Vdsat - 0.5 * (T1 + T2); - dVdseff_dVg = dVdsat_dVg - 0.5 * (dT1_dVg + dT2_dVg); - dVdseff_dVd = dVdsat_dVd - 0.5 * (dT1_dVd + dT2_dVd); - dVdseff_dVb = dVdsat_dVb - 0.5 * (dT1_dVb + dT2_dVb); - dVdseff_dVc = 0.0; - if (selfheat) - dVdseff_dT = dVdsat_dT - 0.5 * (dT1_dT + dT2_dT); - else dVdseff_dT = 0.0; - - if (Vdseff > Vds) - Vdseff = Vds; /* This code is added to fixed the problem - caused by computer precision when - Vds is very close to Vdseff. */ - diffVds = Vds - Vdseff; - -/* Effective Vdsii for Iii calculation */ - T1 = Vdsatii - Vds - pParam->B3SOIFDdelta; - - T2 = sqrt(T1 * T1 + 4.0 * pParam->B3SOIFDdelta * Vdsatii); - T0 = T1 / T2; - T3 = 2.0 * pParam->B3SOIFDdelta / T2; - T4 = T0 + T3; - dT2_dVg = T4 * dVdsatii_dVg; - dT2_dVd = T4 * dVdsatii_dVd - T0; - dT2_dVb = T4 * dVdsatii_dVb; - if (selfheat) dT2_dT = T4*dVdsatii_dT; - else dT2_dT = 0.0; - - Vdseffii = Vdsatii - 0.5 * (T1 + T2); - dVdseffii_dVg = 0.5 * (dVdsatii_dVg - dT2_dVg); - dVdseffii_dVd = 0.5 * (dVdsatii_dVd - dT2_dVd + 1.0); - dVdseffii_dVb = 0.5 * (dVdsatii_dVb - dT2_dVb); - if (selfheat) - dVdseffii_dT = 0.5 * (dVdsatii_dT - dT2_dT); - else dVdseffii_dT = 0.0; - diffVdsii = Vds - Vdseffii; - -/* Calculate VAsat */ - tmp4 = 1.0 - 0.5 * Abeff * Vdsat / Vgst2Vtm; - T9 = WVCoxRds * Vgsteff; - T8 = T9 / Vgst2Vtm; - T0 = EsatL + Vdsat + 2.0 * T9 * tmp4; - - T7 = 2.0 * WVCoxRds * tmp4; - dT0_dVg = dEsatL_dVg + dVdsat_dVg + T7 * (1.0 + tmp2 * Vgsteff) - - T8 * (Abeff * dVdsat_dVg - Abeff * Vdsat / Vgst2Vtm - + Vdsat * dAbeff_dVg); - - dT0_dVb = dEsatL_dVb + dVdsat_dVb + T7 * tmp3 * Vgsteff - - T8 * (dAbeff_dVb * Vdsat + Abeff * dVdsat_dVb); - dT0_dVd = dEsatL_dVd + dVdsat_dVd - T8 * Abeff * dVdsat_dVd; - dT0_dVc = 0.0; - - if (selfheat) - { - tmp4 = dRds_dT / Rds + dvsattemp_dT / vsattemp; - dT0_dT = dEsatL_dT + dVdsat_dT + T7 * tmp4 * Vgsteff - - T8 * (Abeff * dVdsat_dT - Abeff * Vdsat * dVgst2Vtm_dT - / Vgst2Vtm); - } else - dT0_dT = 0.0; - - T9 = WVCoxRds * Abeff; - T1 = 2.0 / Lambda - 1.0 + T9; - dT1_dVg = -2.0 * tmp1 + WVCoxRds * (Abeff * tmp2 + dAbeff_dVg); - dT1_dVb = dAbeff_dVb * WVCoxRds + T9 * tmp3; - dT1_dVc = 0.0; - if (selfheat) - dT1_dT = T9 * tmp4; - else - dT1_dT = 0.0; - - Vasat = T0 / T1; - dVasat_dVg = (dT0_dVg - Vasat * dT1_dVg) / T1; - dVasat_dVb = (dT0_dVb - Vasat * dT1_dVb) / T1; - dVasat_dVd = dT0_dVd / T1; - dVasat_dVc = 0.0; - if (selfheat) dVasat_dT = (dT0_dT - Vasat * dT1_dT) / T1; - else dVasat_dT = 0.0; - -/* Calculate VACLM */ - if ((pParam->B3SOIFDpclm > 0.0) && (diffVds > 1.0e-10)) - { T0 = 1.0 / (pParam->B3SOIFDpclm * Abeff * pParam->B3SOIFDlitl); - dT0_dVb = -T0 / Abeff * dAbeff_dVb; - dT0_dVg = -T0 / Abeff * dAbeff_dVg; - dT0_dVc = 0.0; - - T2 = Vgsteff / EsatL; - T1 = Leff * (Abeff + T2); - dT1_dVg = Leff * ((1.0 - T2 * dEsatL_dVg) / EsatL + dAbeff_dVg); - dT1_dVb = Leff * (dAbeff_dVb - T2 * dEsatL_dVb / EsatL); - dT1_dVd = -T2 * dEsatL_dVd / Esat; - dT1_dVc = 0.0; - if (selfheat) dT1_dT = -T2 * dEsatL_dT / Esat; - else dT1_dT = 0.0; - - T9 = T0 * T1; - VACLM = T9 * diffVds; - dVACLM_dVg = T0 * dT1_dVg * diffVds - T9 * dVdseff_dVg - + T1 * diffVds * dT0_dVg; - dVACLM_dVb = (dT0_dVb * T1 + T0 * dT1_dVb) * diffVds - - T9 * dVdseff_dVb; - dVACLM_dVd = T0 * dT1_dVd * diffVds + T9 * (1.0 - dVdseff_dVd); - dVACLM_dVc = 0.0; - if (selfheat) - dVACLM_dT = T0 * dT1_dT * diffVds - T9 * dVdseff_dT; - else dVACLM_dT = 0.0; - - } - else - { VACLM = MAX_EXP; - dVACLM_dVd = dVACLM_dVg = dVACLM_dVb = dVACLM_dVc = dVACLM_dT = 0.0; - } - - -/* Calculate VADIBL */ - if (pParam->B3SOIFDthetaRout > 0.0) - { T8 = Abeff * Vdsat; - T0 = Vgst2Vtm * T8; - T1 = Vgst2Vtm + T8; - dT0_dVg = Vgst2Vtm * Abeff * dVdsat_dVg + T8 - + Vgst2Vtm * Vdsat * dAbeff_dVg; - dT1_dVg = 1.0 + Abeff * dVdsat_dVg + Vdsat * dAbeff_dVg; - dT1_dVb = dAbeff_dVb * Vdsat + Abeff * dVdsat_dVb; - dT0_dVb = Vgst2Vtm * dT1_dVb; - dT1_dVd = Abeff * dVdsat_dVd; - dT0_dVd = Vgst2Vtm * dT1_dVd; - dT0_dVc = dT1_dVc = 0.0; - if (selfheat) - { - dT0_dT = dVgst2Vtm_dT * T8 + Abeff * Vgst2Vtm * dVdsat_dT; - dT1_dT = dVgst2Vtm_dT + Abeff * dVdsat_dT; - } else - dT0_dT = dT1_dT = 0.0; - - T9 = T1 * T1; - T2 = pParam->B3SOIFDthetaRout; - VADIBL = (Vgst2Vtm - T0 / T1) / T2; - dVADIBL_dVg = (1.0 - dT0_dVg / T1 + T0 * dT1_dVg / T9) / T2; - dVADIBL_dVb = (-dT0_dVb / T1 + T0 * dT1_dVb / T9) / T2; - dVADIBL_dVd = (-dT0_dVd / T1 + T0 * dT1_dVd / T9) / T2; - dVADIBL_dVc = 0.0; - if (selfheat) - dVADIBL_dT = (dVgst2Vtm_dT - dT0_dT/T1 + T0*dT1_dT/T9) / T2; - else dVADIBL_dT = 0.0; - - T7 = pParam->B3SOIFDpdiblb * Vbseff; - if (T7 >= -0.9) - { T3 = 1.0 / (1.0 + T7); - VADIBL *= T3; - dVADIBL_dVg *= T3; - dVADIBL_dVb = (dVADIBL_dVb - VADIBL * pParam->B3SOIFDpdiblb) - * T3; - dVADIBL_dVd *= T3; - dVADIBL_dVc *= T3; - if (selfheat) dVADIBL_dT *= T3; - else dVADIBL_dT = 0.0; - } - else -/* Added to avoid the discontinuity problem caused by pdiblcb */ - { T4 = 1.0 / (0.8 + T7); - T3 = (17.0 + 20.0 * T7) * T4; - dVADIBL_dVg *= T3; - dVADIBL_dVb = dVADIBL_dVb * T3 - - VADIBL * pParam->B3SOIFDpdiblb * T4 * T4; - dVADIBL_dVd *= T3; - dVADIBL_dVc *= T3; - if (selfheat) dVADIBL_dT *= T3; - else dVADIBL_dT = 0.0; - VADIBL *= T3; - } - } - else - { VADIBL = MAX_EXP; - dVADIBL_dVd = dVADIBL_dVg = dVADIBL_dVb = dVADIBL_dVc - = dVADIBL_dT = 0.0; - } - -/* Calculate VA */ - - T8 = pParam->B3SOIFDpvag / EsatL; - T9 = T8 * Vgsteff; - if (T9 > -0.9) - { T0 = 1.0 + T9; - dT0_dVg = T8 * (1.0 - Vgsteff * dEsatL_dVg / EsatL); - dT0_dVb = -T9 * dEsatL_dVb / EsatL; - dT0_dVd = -T9 * dEsatL_dVd / EsatL; - if (selfheat) - dT0_dT = -T9 * dEsatL_dT / EsatL; - else - dT0_dT = 0.0; - } - else /* Added to avoid the discontinuity problems caused by pvag */ - { T1 = 1.0 / (17.0 + 20.0 * T9); - T0 = (0.8 + T9) * T1; - T1 *= T1; - dT0_dVg = T8 * (1.0 - Vgsteff * dEsatL_dVg / EsatL) * T1; - - T9 *= T1 / EsatL; - dT0_dVb = -T9 * dEsatL_dVb; - dT0_dVd = -T9 * dEsatL_dVd; - if (selfheat) - dT0_dT = -T9 * dEsatL_dT; - else - dT0_dT = 0.0; - } - - tmp1 = VACLM * VACLM; - tmp2 = VADIBL * VADIBL; - tmp3 = VACLM + VADIBL; - - T1 = VACLM * VADIBL / tmp3; - tmp3 *= tmp3; - dT1_dVg = (tmp1 * dVADIBL_dVg + tmp2 * dVACLM_dVg) / tmp3; - dT1_dVd = (tmp1 * dVADIBL_dVd + tmp2 * dVACLM_dVd) / tmp3; - dT1_dVb = (tmp1 * dVADIBL_dVb + tmp2 * dVACLM_dVb) / tmp3; - dT1_dVc = 0.0; - if (selfheat) - dT1_dT = (tmp1 * dVADIBL_dT + tmp2 * dVACLM_dT ) / tmp3; - else dT1_dT = 0.0; - - Va = Vasat + T0 * T1; - dVa_dVg = dVasat_dVg + T1 * dT0_dVg + T0 * dT1_dVg; - dVa_dVd = dVasat_dVd + T1 * dT0_dVd + T0 * dT1_dVd; - dVa_dVb = dVasat_dVb + T1 * dT0_dVb + T0 * dT1_dVb; - dVa_dVc = 0.0; - if (selfheat) - dVa_dT = dVasat_dT + T1 * dT0_dT + T0 * dT1_dT; - else dVa_dT = 0.0; - -/* Calculate Ids */ - CoxWovL = model->B3SOIFDcox * Weff / Leff; - beta = ueff * CoxWovL; - dbeta_dVg = CoxWovL * dueff_dVg + beta * dWeff_dVg / Weff; - dbeta_dVd = CoxWovL * dueff_dVd; - dbeta_dVb = CoxWovL * dueff_dVb + beta * dWeff_dVb / Weff; - if (selfheat) dbeta_dT = CoxWovL * dueff_dT; - else dbeta_dT = 0.0; - - T0 = 1.0 - 0.5 * Abeff * Vdseff / Vgst2Vtm; - dT0_dVg = -0.5 * (Abeff * dVdseff_dVg - - Abeff * Vdseff / Vgst2Vtm + Vdseff * dAbeff_dVg) / Vgst2Vtm; - dT0_dVd = -0.5 * Abeff * dVdseff_dVd / Vgst2Vtm; - dT0_dVb = -0.5 * (Abeff * dVdseff_dVb + dAbeff_dVb * Vdseff) - / Vgst2Vtm; - dT0_dVc = 0.0; - if (selfheat) - dT0_dT = -0.5 * (Abeff * dVdseff_dT - - Abeff * Vdseff / Vgst2Vtm * dVgst2Vtm_dT) - / Vgst2Vtm; - else dT0_dT = 0.0; - - fgche1 = Vgsteff * T0; - dfgche1_dVg = Vgsteff * dT0_dVg + T0; - dfgche1_dVd = Vgsteff * dT0_dVd; - dfgche1_dVb = Vgsteff * dT0_dVb; - dfgche1_dVc = 0.0; - if (selfheat) dfgche1_dT = Vgsteff * dT0_dT; - else dfgche1_dT = 0.0; - - T9 = Vdseff / EsatL; - fgche2 = 1.0 + T9; - dfgche2_dVg = (dVdseff_dVg - T9 * dEsatL_dVg) / EsatL; - dfgche2_dVd = (dVdseff_dVd - T9 * dEsatL_dVd) / EsatL; - dfgche2_dVb = (dVdseff_dVb - T9 * dEsatL_dVb) / EsatL; - dfgche2_dVc = 0.0; - if (selfheat) dfgche2_dT = (dVdseff_dT - T9 * dEsatL_dT) / EsatL; - else dfgche2_dT = 0.0; - - gche = beta * fgche1 / fgche2; - dgche_dVg = (beta * dfgche1_dVg + fgche1 * dbeta_dVg - - gche * dfgche2_dVg) / fgche2; - dgche_dVd = (beta * dfgche1_dVd + fgche1 * dbeta_dVd - - gche * dfgche2_dVd) / fgche2; - dgche_dVb = (beta * dfgche1_dVb + fgche1 * dbeta_dVb - - gche * dfgche2_dVb) / fgche2; - dgche_dVc = 0.0; - if (selfheat) - dgche_dT = (beta * dfgche1_dT + fgche1 * dbeta_dT - - gche * dfgche2_dT) / fgche2; - else dgche_dT = 0.0; - - T0 = 1.0 + gche * Rds; - T9 = Vdseff / T0; - Idl = gche * T9; - -/* Whoa, these formulas for the derivatives of Idl are convoluted, but I - verified them to be correct */ - - dIdl_dVg = (gche * dVdseff_dVg + T9 * dgche_dVg) / T0 - - Idl * gche / T0 * dRds_dVg ; - dIdl_dVd = (gche * dVdseff_dVd + T9 * dgche_dVd) / T0; - dIdl_dVb = (gche * dVdseff_dVb + T9 * dgche_dVb - - Idl * dRds_dVb * gche) / T0; - dIdl_dVc = 0.0; - if (selfheat) - dIdl_dT = (gche * dVdseff_dT + T9 * dgche_dT - - Idl * dRds_dT * gche) / T0; - else dIdl_dT = 0.0; - - T9 = diffVds / Va; - T0 = 1.0 + T9; - here->B3SOIFDids = Ids = Idl * T0; - - Gm0 = T0 * dIdl_dVg - Idl * (dVdseff_dVg + T9 * dVa_dVg) / Va; - Gds0 = T0 * dIdl_dVd + Idl * (1.0 - dVdseff_dVd - - T9 * dVa_dVd) / Va; - Gmb0 = T0 * dIdl_dVb - Idl * (dVdseff_dVb + T9 * dVa_dVb) / Va; - Gmc = 0.0; - if (selfheat) - GmT0 = T0 * dIdl_dT - Idl * (dVdseff_dT + T9 * dVa_dT) / Va; - else GmT0 = 0.0; - -/* This includes all dependencies from Vgsteff, Vbseff, Vcs */ - - Gm = Gm0 * dVgsteff_dVg + Gmb0 * dVbseff_dVg + Gmc * dVcs_dVg; - Gmb = Gm0 * dVgsteff_dVb + Gmb0 * dVbseff_dVb + Gmc * dVcs_dVb; - Gds = Gm0 * dVgsteff_dVd + Gmb0 * dVbseff_dVd + Gmc * dVcs_dVd + Gds0; - Gme = Gm0 * dVgsteff_dVe + Gmb0 * dVbseff_dVe + Gmc * dVcs_dVe; - if (selfheat) - GmT = Gm0 * dVgsteff_dT + Gmb0 * dVbseff_dT + Gmc * dVcs_dT + GmT0; - else GmT = 0.0; - - -/* calculate substrate current Iii */ - - Giig = Giib = Giid = Giie = GiiT = 0.0; - here->B3SOIFDiii = Iii = 0.0; - - Idgidl = Gdgidld = Gdgidlg = 0.0; - Isgidl = Gsgidlg = 0; - - here->B3SOIFDibs = Ibs = 0.0; - here->B3SOIFDibd = Ibd = 0.0; - here->B3SOIFDic = Ic = 0.0; - - Gjsb = Gjsd = GjsT = 0.0; - Gjdb = Gjdd = GjdT = 0.0; - Gcd = Gcb = GcT = 0.0; - - here->B3SOIFDibp = Ibp = 0.0; - here->B3SOIFDgbpbs = here->B3SOIFDgbpgs = here->B3SOIFDgbpds = 0.0; - here->B3SOIFDgbpes = here->B3SOIFDgbpps = here->B3SOIFDgbpT = here->B3SOIFDcbodcon = 0.0; - Gbpbs = Gbpgs = Gbpds = Gbpes = Gbpps = GbpT = 0.0; - - /* Current going out of drainprime node into the drain of device */ - /* "node" means the SPICE circuit node */ - - here->B3SOIFDcdrain = Ids + Ic; - here->B3SOIFDcd = Ids + Ic - Ibd + Iii + Idgidl; - here->B3SOIFDcb = Ibs + Ibd + Ibp - Iii - Idgidl - Isgidl; - - here->B3SOIFDgds = Gds + Gcd; - here->B3SOIFDgm = Gm; - here->B3SOIFDgmbs = Gmb + Gcb; - here->B3SOIFDgme = Gme; - if (selfheat) - here->B3SOIFDgmT = GmT + GcT; - else - here->B3SOIFDgmT = 0.0; - - /* note that sign is switched because power flows out - of device into the temperature node. - Currently ommit self-heating due to bipolar current - because it can cause convergence problem*/ - - here->B3SOIFDgtempg = -Gm * Vds; - here->B3SOIFDgtempb = -Gmb * Vds; - here->B3SOIFDgtempe = -Gme * Vds; - here->B3SOIFDgtempT = -GmT * Vds; - here->B3SOIFDgtempd = -Gds * Vds - Ids; - here->B3SOIFDcth = - Ids * Vds - model->B3SOIFDtype * - (here->B3SOIFDgtempg * Vgs + here->B3SOIFDgtempb * Vbs - + here->B3SOIFDgtempe * Ves + here->B3SOIFDgtempd * Vds) - - here->B3SOIFDgtempT * delTemp; - - /* Body current which flows into drainprime node from the drain of device */ - - here->B3SOIFDgjdb = Gjdb - Giib; - here->B3SOIFDgjdd = Gjdd - (Giid + Gdgidld); - here->B3SOIFDgjdg = - (Giig + Gdgidlg); - here->B3SOIFDgjde = - Giie; - if (selfheat) here->B3SOIFDgjdT = GjdT - GiiT; - else here->B3SOIFDgjdT = 0.0; - here->B3SOIFDcjd = Ibd - Iii - Idgidl - here->B3SOIFDminIsub/2 - - (here->B3SOIFDgjdb * Vbs + here->B3SOIFDgjdd * Vds - + here->B3SOIFDgjdg * Vgs + here->B3SOIFDgjde * Ves - + here->B3SOIFDgjdT * delTemp); - - /* Body current which flows into sourceprime node from the source of device */ - - here->B3SOIFDgjsb = Gjsb; - here->B3SOIFDgjsd = Gjsd; - here->B3SOIFDgjsg = - Gsgidlg; - if (selfheat) here->B3SOIFDgjsT = GjsT; - else here->B3SOIFDgjsT = 0.0; - here->B3SOIFDcjs = Ibs - Isgidl - here->B3SOIFDminIsub/2 - - (here->B3SOIFDgjsb * Vbs + here->B3SOIFDgjsd * Vds - + here->B3SOIFDgjsg * Vgs + here->B3SOIFDgjsT * delTemp); - - /* Current flowing into body node */ - - here->B3SOIFDgbbs = Giib - Gjsb - Gjdb - Gbpbs; - here->B3SOIFDgbgs = Giig + Gdgidlg + Gsgidlg - Gbpgs; - here->B3SOIFDgbds = Giid + Gdgidld - Gjsd - Gjdd - Gbpds; - here->B3SOIFDgbes = Giie - Gbpes; - here->B3SOIFDgbps = - Gbpps; - if (selfheat) here->B3SOIFDgbT = GiiT - GjsT - GjdT - GbpT; - else here->B3SOIFDgbT = 0.0; - here->B3SOIFDcbody = Iii + Idgidl + Isgidl - Ibs - Ibd - Ibp + here->B3SOIFDminIsub - - (here->B3SOIFDgbbs * Vbs + here->B3SOIFDgbgs * Vgs - + here->B3SOIFDgbds * Vds + here->B3SOIFDgbps * Vps - + here->B3SOIFDgbes * Ves + here->B3SOIFDgbT * delTemp); - - /* Calculate Qinv for Noise analysis */ - - T1 = Vgsteff * (1.0 - 0.5 * Abeff * Vdseff / Vgst2Vtm); - here->B3SOIFDqinv = -model->B3SOIFDcox * pParam->B3SOIFDweff * Leff * T1; - - /* Begin CV (charge) model */ - - if ((model->B3SOIFDxpart < 0) || (!ChargeComputationNeeded)) - { qgate = qdrn = qsrc = qbody = 0.0; - here->B3SOIFDcggb = here->B3SOIFDcgsb = here->B3SOIFDcgdb = 0.0; - here->B3SOIFDcdgb = here->B3SOIFDcdsb = here->B3SOIFDcddb = 0.0; - here->B3SOIFDcbgb = here->B3SOIFDcbsb = here->B3SOIFDcbdb = 0.0; - goto finished; - } - else - { - CoxWL = model->B3SOIFDcox * pParam->B3SOIFDweffCV - * pParam->B3SOIFDleffCV; - - /* By using this Vgsteff,cv, discontinuity in moderate - inversion charges can be avoid. However, in capMod=3, - Vdsat from IV is used. The dVdsat_dVg is referred to - the IV Vgsteff and therefore induces error in the charges - derivatives. Fortunately, Vgsteff,iv and Vgsteff,cv are - different only in subthreshold where Qsubs is neglectible. - So the errors in derivatives is not a serious problem */ - - if ((VgstNVt > -EXP_THRESHOLD) && (VgstNVt < EXP_THRESHOLD)) - { ExpVgst *= ExpVgst; - Vgsteff = n * Vtm * log(1.0 + ExpVgst); - T0 = ExpVgst / (1.0 + ExpVgst); - T1 = -T0 * (dVth_dVb + Vgst / n * dn_dVb) + Vgsteff / n * dn_dVb; - dVgsteff_dVd = -T0 * (dVth_dVd + Vgst / n * dn_dVd) - + Vgsteff / n * dn_dVd + T1 * dVbseff_dVd; - dVgsteff_dVg = T0 * dVgs_eff_dVg + T1 * dVbseff_dVg; - dVgsteff_dVb = T1 * dVbseff_dVb; - dVgsteff_dVe = T1 * dVbseff_dVe; - if (selfheat) - dVgsteff_dT = -T0 * (dVth_dT + Vgst / Temp) + Vgsteff / Temp - + T1 * dVbseff_dT; - else dVgsteff_dT = 0.0; - } - - Vfb = Vth - phi - pParam->B3SOIFDk1 * sqrtPhis; - - dVfb_dVb = dVth_dVb - pParam->B3SOIFDk1 * dsqrtPhis_dVb; - dVfb_dVd = dVth_dVd; - dVfb_dT = dVth_dT; - - if ((model->B3SOIFDcapMod == 2) || (model->B3SOIFDcapMod == 3)) - { - /* Necessary because charge behaviour very strange at - Vgsteff = 0 */ - Vgsteff += 1e-4; - - /* Something common in capMod 2 and 3 */ - V3 = Vfb - Vgs_eff + Vbseff - DELTA_3; - if (Vfb <= 0.0) - { T0 = sqrt(V3 * V3 - 4.0 * DELTA_3 * Vfb); - T2 = -DELTA_3 / T0; - } - else - { T0 = sqrt(V3 * V3 + 4.0 * DELTA_3 * Vfb); - T2 = DELTA_3 / T0; - } - - T1 = 0.5 * (1.0 + V3 / T0); - Vfbeff = Vfb - 0.5 * (V3 + T0); - dVfbeff_dVd = (1.0 - T1 - T2) * dVfb_dVd; - dVfbeff_dVb = (1.0 - T1 - T2) * dVfb_dVb - T1; - dVfbeff_dVrg = T1 * dVgs_eff_dVg; - if (selfheat) dVfbeff_dT = (1.0 - T1 - T2) * dVfb_dT; - else dVfbeff_dT = 0.0; - - Qac0 = -CoxWL * (Vfbeff - Vfb); - dQac0_dVrg = -CoxWL * dVfbeff_dVrg; - dQac0_dVd = -CoxWL * (dVfbeff_dVd - dVfb_dVd); - dQac0_dVb = -CoxWL * (dVfbeff_dVb - dVfb_dVb); - if (selfheat) dQac0_dT = -CoxWL * (dVfbeff_dT - dVfb_dT); - else dQac0_dT = 0.0; - - T0 = 0.5 * K1; - T3 = Vgs_eff - Vfbeff - Vbseff - Vgsteff; - if (pParam->B3SOIFDk1 == 0.0) - { T1 = 0.0; - T2 = 0.0; - } - else if (T3 < 0.0) - { T1 = T0 + T3 / pParam->B3SOIFDk1; - T2 = CoxWL; - } - else - { T1 = sqrt(T0 * T0 + T3); - T2 = CoxWL * T0 / T1; - } - - Qsub0 = CoxWL * K1 * (T0 - T1); - - dQsub0_dVrg = T2 * (dVfbeff_dVrg - dVgs_eff_dVg); - dQsub0_dVg = T2; - dQsub0_dVd = T2 * dVfbeff_dVd; - dQsub0_dVb = T2 * (dVfbeff_dVb + 1); - if (selfheat) dQsub0_dT = T2 * dVfbeff_dT; - else dQsub0_dT = 0.0; - - One_Third_CoxWL = CoxWL / 3.0; - Two_Third_CoxWL = 2.0 * One_Third_CoxWL; - AbulkCV = Abulk0 * pParam->B3SOIFDabulkCVfactor; - dAbulkCV_dVb = pParam->B3SOIFDabulkCVfactor * dAbulk0_dVb; - - /* This is actually capMod=2 calculation */ - VdsatCV = Vgsteff / AbulkCV; - dVdsatCV_dVg = 1.0 / AbulkCV; - dVdsatCV_dVb = -VdsatCV * dAbulkCV_dVb / AbulkCV; - VdsatCV += 1e-5; - - V4 = VdsatCV - Vds - DELTA_4; - T0 = sqrt(V4 * V4 + 4.0 * DELTA_4 * VdsatCV); - VdseffCV = VdsatCV - 0.5 * (V4 + T0); - T1 = 0.5 * (1.0 + V4 / T0); - T2 = DELTA_4 / T0; - T3 = (1.0 - T1 - T2) / AbulkCV; - dVdseffCV_dVg = T3; - dVdseffCV_dVd = T1; - dVdseffCV_dVb = -T3 * VdsatCV * dAbulkCV_dVb; - - if (model->B3SOIFDcapMod == 2) - { - /* VdsCV Make it compatible with capMod 3 */ - VdsCV = VdseffCV; - dVdsCV_dVg = dVdseffCV_dVg; - dVdsCV_dVd = dVdseffCV_dVd; - dVdsCV_dVb = dVdseffCV_dVb; - } - else if (model->B3SOIFDcapMod == 3) - { - /* Front gate strong inversion depletion charge */ - /* VdssatCV calculation */ - - T1 = Vgsteff + K1*sqrtPhis + 0.5*K1*K1; - T2 = Vgsteff + K1*sqrtPhis + Phis + 0.25*K1*K1; - - dT1_dVb = K1*dsqrtPhis_dVb; - dT2_dVb = dT1_dVb + dPhis_dVb; - dT1_dVg = dT2_dVg = 1; - - /* Note VdsatCV is redefined in capMod = 3 */ - VdsatCV = T1 - K1*sqrt(T2); - - dVdsatCV_dVb = dT1_dVb - K1/2/sqrt(T2)*dT2_dVb; - dVdsatCV_dVg = dT1_dVg - K1/2/sqrt(T2)*dT2_dVg; - - T1 = VdsatCV - Vdsat; - dT1_dVg = dVdsatCV_dVg - dVdsat_dVg; - dT1_dVb = dVdsatCV_dVb - dVdsat_dVb; - dT1_dVd = - dVdsat_dVd; - dT1_dVc = - dVdsat_dVc; - dT1_dT = - dVdsat_dT; - - if (!(T1 == 0.0)) - { T3 = -0.5 * Vdsat / T1; /* Vdsmax */ - T2 = T3 * Vdsat; - T4 = T2 + T1 * T3 * T3; /* fmax */ - if ((Vdseff > T2) && (T1 < 0)) - { - VdsCV = T4; - T5 = -0.5 / (T1 * T1); - dT3_dVg = T5 * (T1 * dVdsat_dVg - Vdsat * dT1_dVg); - dT3_dVb = T5 * (T1 * dVdsat_dVb - Vdsat * dT1_dVb); - dT3_dVd = T5 * (T1 * dVdsat_dVd - Vdsat * dT1_dVd); - dT3_dVc=0.0; - if (selfheat) - dT3_dT=T5 * (T1 * dVdsat_dT - Vdsat * dT1_dT); - else dT3_dT=0.0; - - dVdsCV_dVd = T3 * dVdsat_dVd + Vdsat * dT3_dVd - + T3 * (2 * T1 * dT3_dVd + T3 * dT1_dVd); - dVdsCV_dVg = T3 * dVdsat_dVg + Vdsat * dT3_dVg - + T3 * (2 * T1 * dT3_dVg + T3 * dT1_dVg); - dVdsCV_dVb = T3 * dVdsat_dVb + Vdsat * dT3_dVb - + T3 * (2 * T1 * dT3_dVb + T3 * dT1_dVb); - dVdsCV_dVc = 0.0; - if (selfheat) - dVdsCV_dT = T3 * dVdsat_dT + Vdsat * dT3_dT - + T3 * (2 * T1 * dT3_dT + T3 * dT1_dT ); - else dVdsCV_dT = 0.0; - } else - { T5 = Vdseff / Vdsat; - T6 = T5 * T5; - T7 = 2 * T1 * T5 / Vdsat; - T8 = T7 / Vdsat; - VdsCV = Vdseff + T1 * T6; - dVdsCV_dVd = dVdseff_dVd + T8 * - ( Vdsat * dVdseff_dVd - - Vdseff * dVdsat_dVd) - + T6 * dT1_dVd; - dVdsCV_dVb = dVdseff_dVb + T8 * ( Vdsat * - dVdseff_dVb - Vdseff * dVdsat_dVb) - + T6 * dT1_dVb; - dVdsCV_dVg = dVdseff_dVg + T8 * - ( Vdsat * dVdseff_dVg - - Vdseff * dVdsat_dVg) - + T6 * dT1_dVg; - dVdsCV_dVc = 0.0; - if (selfheat) - dVdsCV_dT = dVdseff_dT + T8 * - ( Vdsat * dVdseff_dT - - Vdseff * dVdsat_dT ) - + T6 * dT1_dT ; - else dVdsCV_dT = 0.0; - } - } else - { VdsCV = Vdseff; - dVdsCV_dVb = dVdseff_dVb; - dVdsCV_dVd = dVdseff_dVd; - dVdsCV_dVg = dVdseff_dVg; - dVdsCV_dVc = dVdseff_dVc; - dVdsCV_dT = dVdseff_dT; - } - if (VdsCV < 0.0) VdsCV = 0.0; - VdsCV += 1e-4; - - if (VdsCV > (VdsatCV - 1e-7)) - { - VdsCV = VdsatCV - 1e-7; - } - Phisd = Phis + VdsCV; - dPhisd_dVb = dPhis_dVb + dVdsCV_dVb; - dPhisd_dVd = dVdsCV_dVd; - dPhisd_dVg = dVdsCV_dVg; - dPhisd_dVc = dVdsCV_dVc; - dPhisd_dT = dVdsCV_dT; - sqrtPhisd = sqrt(Phisd); - - /* Qdep0 - Depletion charge at Vgs=Vth */ - T10 = CoxWL * K1; - Qdep0 = T10 * sqrtPhis; - dQdep0_dVb = T10 * dsqrtPhis_dVb; - } /* End of if capMod == 3 */ - - /* Something common in both capMod 2 or 3 */ - - /* Backgate charge */ - CboxWL = pParam->B3SOIFDkb3 * Cbox * pParam->B3SOIFDweffCV - * pParam->B3SOIFDleffCV; - Cbg = Cbb = Cbd = Cbe = CbT = 0.0; - Ce2g = Ce2b = Ce2d = Ce2e = Ce2T = 0.0; - Qbf = Qe2 = 0.0; - - T2 = - 0.5 * model->B3SOIFDcboxt * pParam->B3SOIFDweffCV - * pParam->B3SOIFDleffCV; - Qe1 = T2 * VdsCV - CboxWL * (Vbs0eff - Vesfb); - Ce1g = T2 * (dVdsCV_dVg * dVgsteff_dVg + dVdsCV_dVb * dVbseff_dVg - + dVdsCV_dVc * dVcs_dVg) - CboxWL * dVbs0eff_dVg; - Ce1d = T2 * (dVdsCV_dVg * dVgsteff_dVd + dVdsCV_dVb * dVbseff_dVd - + dVdsCV_dVc * dVcs_dVd + dVdsCV_dVd) - - CboxWL * dVbs0eff_dVd; - Ce1b = 0.0; - Ce1e = T2 * (dVdsCV_dVg * dVgsteff_dVe + dVdsCV_dVb * dVbseff_dVe - + dVdsCV_dVc * dVcs_dVe) - - CboxWL * (dVbs0eff_dVe - 1.0); - if (selfheat) - Ce1T = T2 * (dVdsCV_dVg * dVgsteff_dT + dVdsCV_dVb * dVbseff_dT - + dVdsCV_dVc * dVcs_dT + dVdsCV_dT) - - CboxWL * (dVbs0eff_dT + dvfbb_dT); - else Ce1T = 0.0; - - /* Total inversion charge */ - T0 = AbulkCV * VdseffCV; - T1 = 12.0 * (Vgsteff - 0.5 * T0 + 1e-20); - T2 = VdseffCV / T1; - T3 = T0 * T2; - - T4 = (1.0 - 12.0 * T2 * T2 * AbulkCV); - T5 = (6.0 * T0 * (4.0 * Vgsteff - T0) / (T1 * T1) - 0.5); - T6 = 12.0 * T2 * T2 * Vgsteff; - - qinv = CoxWL * (Vgsteff - 0.5 * VdseffCV + T3); - Cgg1 = CoxWL * (T4 + T5 * dVdseffCV_dVg); - Cgd1 = CoxWL * T5 * dVdseffCV_dVd; - Cgb1 = CoxWL * (T5 * dVdseffCV_dVb + T6 * dAbulkCV_dVb); - - /* Inversion charge partitioning into S / D */ - if (model->B3SOIFDxpart > 0.5) - { /* 0/100 Charge partition model */ - T1 = T1 + T1; - qsrc = -CoxWL * (0.5 * Vgsteff + 0.25 * T0 - - T0 * T0 / T1); - T7 = (4.0 * Vgsteff - T0) / (T1 * T1); - T4 = -(0.5 + 24.0 * T0 * T0 / (T1 * T1)); - T5 = -(0.25 * AbulkCV - 12.0 * AbulkCV * T0 * T7); - T6 = -(0.25 * VdseffCV - 12.0 * T0 * VdseffCV * T7); - Csg1 = CoxWL * (T4 + T5 * dVdseffCV_dVg); - Csd1 = CoxWL * T5 * dVdseffCV_dVd; - Csb1 = CoxWL * (T5 * dVdseffCV_dVb + T6 * dAbulkCV_dVb); - - } - else if (model->B3SOIFDxpart < 0.5) - { /* 40/60 Charge partition model */ - T1 = T1 / 12.0; - T2 = 0.5 * CoxWL / (T1 * T1); - T3 = Vgsteff * (2.0 * T0 * T0 / 3.0 + Vgsteff - * (Vgsteff - 4.0 * T0 / 3.0)) - - 2.0 * T0 * T0 * T0 / 15.0; - qsrc = -T2 * T3; - T7 = 4.0 / 3.0 * Vgsteff * (Vgsteff - T0) - + 0.4 * T0 * T0; - T4 = -2.0 * qsrc / T1 - T2 * (Vgsteff * (3.0 - * Vgsteff - 8.0 * T0 / 3.0) - + 2.0 * T0 * T0 / 3.0); - T5 = (qsrc / T1 + T2 * T7) * AbulkCV; - T6 = (qsrc / T1 * VdseffCV + T2 * T7 * VdseffCV); - Csg1 = T4 + T5 * dVdseffCV_dVg; - Csd1 = T5 * dVdseffCV_dVd; - Csb1 = T5 * dVdseffCV_dVb + T6 * dAbulkCV_dVb; - } - else - { /* 50/50 Charge partition model */ - qsrc = - 0.5 * qinv; - Csg1 = - 0.5 * Cgg1; - Csb1 = - 0.5 * Cgb1; - Csd1 = - 0.5 * Cgd1; - } - - Csg = Csg1 * dVgsteff_dVg + Csb1 * dVbseff_dVg; - Csd = Csd1 + Csg1 * dVgsteff_dVd + Csb1 * dVbseff_dVd; - Csb = Csg1 * dVgsteff_dVb + Csb1 * dVbseff_dVb; - Cse = Csg1 * dVgsteff_dVe + Csb1 * dVbseff_dVe; - if (selfheat) - CsT = Csg1 * dVgsteff_dT + Csb1 * dVbseff_dT; - else CsT = 0.0; - - Qex=dQex_dVg=dQex_dVb=dQex_dVd=dQex_dVe=dQex_dT=0.0; - - qgate = qinv - (Qbf + Qe2); - qbody = (Qbf - Qe1 + Qex); - qsub = Qe1 + Qe2 - Qex; - qdrn = -(qinv + qsrc); - - Cgg = (Cgg1 * dVgsteff_dVg + Cgb1 * dVbseff_dVg) - Cbg ; - Cgd = (Cgd1 + Cgg1 * dVgsteff_dVd + Cgb1 * dVbseff_dVd)-Cbd; - Cgb = (Cgb1 * dVbseff_dVb + Cgg1 * dVgsteff_dVb) - Cbb; - Cge = (Cgg1 * dVgsteff_dVe + Cgb1 * dVbseff_dVe) - Cbe; - if (selfheat) - CgT = (Cgg1 * dVgsteff_dT + Cgb1 * dVbseff_dT ) - CbT; - else CgT = 0.0; - - here->B3SOIFDcggb = Cgg - Ce2g; - here->B3SOIFDcgsb = - (Cgg + Cgd + Cgb + Cge) - + (Ce2g + Ce2d + Ce2b + Ce2e); - here->B3SOIFDcgdb = Cgd - Ce2d; - here->B3SOIFDcgeb = Cge - Ce2e; - here->B3SOIFDcgT = CgT - Ce2T; - - here->B3SOIFDcbgb = Cbg - Ce1g + dQex_dVg; - here->B3SOIFDcbsb = -(Cbg + Cbd + Cbb + Cbe) - + (Ce1g + Ce1d + Ce1b + Ce1e) - - (dQex_dVg + dQex_dVd + dQex_dVb + dQex_dVe); - here->B3SOIFDcbdb = Cbd - Ce1d + dQex_dVd; - here->B3SOIFDcbeb = Cbe - Ce1e + dQex_dVe; - here->B3SOIFDcbT = CbT - Ce1T + dQex_dT; - - here->B3SOIFDcegb = Ce1g + Ce2g - dQex_dVg; - here->B3SOIFDcesb = -(Ce1g + Ce1d + Ce1b + Ce1e) - -(Ce2g + Ce2d + Ce2b + Ce2e) - +(dQex_dVg + dQex_dVd + dQex_dVb + dQex_dVe); - here->B3SOIFDcedb = Ce1d + Ce2d - dQex_dVd; - here->B3SOIFDceeb = Ce1e + Ce2e - dQex_dVe; - here->B3SOIFDceT = Ce1T + Ce2T - dQex_dT; - - here->B3SOIFDcdgb = -(Cgg + Cbg + Csg); - here->B3SOIFDcddb = -(Cgd + Cbd + Csd); - here->B3SOIFDcdeb = -(Cge + Cbe + Cse); - here->B3SOIFDcdT = -(CgT + CbT + CsT); - here->B3SOIFDcdsb = (Cgg + Cgd + Cgb + Cge - + Cbg + Cbd + Cbb + Cbe - + Csg + Csd + Csb + Cse); - - } /* End of if capMod == 2 or capMod ==3 */ - } - - finished: /* returning Values to Calling Routine */ - /* - * COMPUTE EQUIVALENT DRAIN CURRENT SOURCE - */ - if (ChargeComputationNeeded) - { - qjs = qjd = 0.0; - gcjdds = gcjdbs = gcjdT = 0.0; - gcjsbs = gcjsT = 0.0; - - qdrn -= qjd; - qbody += (qjs + qjd); - qsrc = -(qgate + qbody + qdrn + qsub); - - /* Update the conductance */ - here->B3SOIFDcddb -= gcjdds; - here->B3SOIFDcdT -= gcjdT; - here->B3SOIFDcdsb += gcjdds + gcjdbs; - - here->B3SOIFDcbdb += (gcjdds); - here->B3SOIFDcbT += (gcjdT + gcjsT); - here->B3SOIFDcbsb -= (gcjdds + gcjdbs + gcjsbs); - - /* Extrinsic Bottom S/D to substrate charge */ - T10 = -model->B3SOIFDtype * ves; - /* T10 is vse without type conversion */ - if ( ((pParam->B3SOIFDnsub > 0) && (model->B3SOIFDtype > 0)) || - ((pParam->B3SOIFDnsub < 0) && (model->B3SOIFDtype < 0)) ) - { - if (T10 < pParam->B3SOIFDvsdfb) - { here->B3SOIFDqse = here->B3SOIFDcsbox * (T10 - pParam->B3SOIFDvsdfb); - here->B3SOIFDgcse = here->B3SOIFDcsbox; - } - else if (T10 < pParam->B3SOIFDsdt1) - { T0 = T10 - pParam->B3SOIFDvsdfb; - T1 = T0 * T0; - here->B3SOIFDqse = T0 * (here->B3SOIFDcsbox - - pParam->B3SOIFDst2 / 3 * T1) ; - here->B3SOIFDgcse = here->B3SOIFDcsbox - pParam->B3SOIFDst2 * T1; - } - else if (T10 < pParam->B3SOIFDvsdth) - { T0 = T10 - pParam->B3SOIFDvsdth; - T1 = T0 * T0; - here->B3SOIFDqse = here->B3SOIFDcsmin * T10 + here->B3SOIFDst4 + - pParam->B3SOIFDst3 / 3 * T0 * T1; - here->B3SOIFDgcse = here->B3SOIFDcsmin + pParam->B3SOIFDst3 * T1; - } - else - { here->B3SOIFDqse = here->B3SOIFDcsmin * T10 + here->B3SOIFDst4; - here->B3SOIFDgcse = here->B3SOIFDcsmin; - } - } else - { - if (T10 < pParam->B3SOIFDvsdth) - { here->B3SOIFDqse = here->B3SOIFDcsmin * (T10 - pParam->B3SOIFDvsdth); - here->B3SOIFDgcse = here->B3SOIFDcsmin; - } - else if (T10 < pParam->B3SOIFDsdt1) - { T0 = T10 - pParam->B3SOIFDvsdth; - T1 = T0 * T0; - here->B3SOIFDqse = T0 * (here->B3SOIFDcsmin - pParam->B3SOIFDst2 / 3 * T1) ; - here->B3SOIFDgcse = here->B3SOIFDcsmin - pParam->B3SOIFDst2 * T1; - } - else if (T10 < pParam->B3SOIFDvsdfb) - { T0 = T10 - pParam->B3SOIFDvsdfb; - T1 = T0 * T0; - here->B3SOIFDqse = here->B3SOIFDcsbox * T10 + here->B3SOIFDst4 + - pParam->B3SOIFDst3 / 3 * T0 * T1; - here->B3SOIFDgcse = here->B3SOIFDcsbox + pParam->B3SOIFDst3 * T1; - } - else - { here->B3SOIFDqse = here->B3SOIFDcsbox * T10 + here->B3SOIFDst4; - here->B3SOIFDgcse = here->B3SOIFDcsbox; - } - } - - /* T11 is vde without type conversion */ - T11 = model->B3SOIFDtype * (vds - ves); - if ( ((pParam->B3SOIFDnsub > 0) && (model->B3SOIFDtype > 0)) || - ((pParam->B3SOIFDnsub < 0) && (model->B3SOIFDtype < 0)) ) - { - if (T11 < pParam->B3SOIFDvsdfb) - { here->B3SOIFDqde = here->B3SOIFDcdbox * (T11 - pParam->B3SOIFDvsdfb); - here->B3SOIFDgcde = here->B3SOIFDcdbox; - } - else if (T11 < pParam->B3SOIFDsdt1) - { T0 = T11 - pParam->B3SOIFDvsdfb; - T1 = T0 * T0; - here->B3SOIFDqde = T0 * (here->B3SOIFDcdbox - pParam->B3SOIFDdt2 / 3 * T1) ; - here->B3SOIFDgcde = here->B3SOIFDcdbox - pParam->B3SOIFDdt2 * T1; - } - else if (T11 < pParam->B3SOIFDvsdth) - { T0 = T11 - pParam->B3SOIFDvsdth; - T1 = T0 * T0; - here->B3SOIFDqde = here->B3SOIFDcdmin * T11 + here->B3SOIFDdt4 + - pParam->B3SOIFDdt3 / 3 * T0 * T1; - here->B3SOIFDgcde = here->B3SOIFDcdmin + pParam->B3SOIFDdt3 * T1; - } - else - { here->B3SOIFDqde = here->B3SOIFDcdmin * T11 + here->B3SOIFDdt4; - here->B3SOIFDgcde = here->B3SOIFDcdmin; - } - } else - { - if (T11 < pParam->B3SOIFDvsdth) - { here->B3SOIFDqde = here->B3SOIFDcdmin * (T11 - pParam->B3SOIFDvsdth); - here->B3SOIFDgcde = here->B3SOIFDcdmin; - } - else if (T11 < pParam->B3SOIFDsdt1) - { T0 = T11 - pParam->B3SOIFDvsdth; - T1 = T0 * T0; - here->B3SOIFDqde = T0 * (here->B3SOIFDcdmin - pParam->B3SOIFDdt2 / 3 * T1) ; - here->B3SOIFDgcde = here->B3SOIFDcdmin - pParam->B3SOIFDdt2 * T1; - } - else if (T11 < pParam->B3SOIFDvsdfb) - { T0 = T11 - pParam->B3SOIFDvsdfb; - T1 = T0 * T0; - here->B3SOIFDqde = here->B3SOIFDcdbox * T11 + here->B3SOIFDdt4 + - pParam->B3SOIFDdt3 / 3 * T0 * T1; - here->B3SOIFDgcde = here->B3SOIFDcdbox + pParam->B3SOIFDdt3 * T1; - } - else - { here->B3SOIFDqde = here->B3SOIFDcdbox * T11 + here->B3SOIFDdt4; - here->B3SOIFDgcde = here->B3SOIFDcdbox; - } - } - - /* Extrinsic : Sidewall fringing S/D charge */ - here->B3SOIFDqse += pParam->B3SOIFDcsesw * T10; - here->B3SOIFDgcse += pParam->B3SOIFDcsesw; - here->B3SOIFDqde += pParam->B3SOIFDcdesw * T11; - here->B3SOIFDgcde += pParam->B3SOIFDcdesw; - - /* All charge are mutliplied with type at the end, but qse and qde - have true polarity => so pre-mutliplied with type */ - here->B3SOIFDqse *= model->B3SOIFDtype; - here->B3SOIFDqde *= model->B3SOIFDtype; - } - - here->B3SOIFDxc = Xc; - here->B3SOIFDcbb = Cbb; - here->B3SOIFDcbd = Cbd; - here->B3SOIFDcbg = Cbg; - here->B3SOIFDqbf = Qbf; - here->B3SOIFDqjs = qjs; - here->B3SOIFDqjd = qjd; - - if (here->B3SOIFDdebugMod == -1) - ChargeComputationNeeded = 0; - - /* - * check convergence - */ - if ((here->B3SOIFDoff == 0) || (!(ckt->CKTmode & MODEINITFIX))) - { if (Check == 1) - { ckt->CKTnoncon++; -if (here->B3SOIFDdebugMod > 2) - fprintf(fpdebug, "Check is on, noncon=%d\n", ckt->CKTnoncon++); - - } - } - - *(ckt->CKTstate0 + here->B3SOIFDvg) = vg; - *(ckt->CKTstate0 + here->B3SOIFDvd) = vd; - *(ckt->CKTstate0 + here->B3SOIFDvs) = vs; - *(ckt->CKTstate0 + here->B3SOIFDvp) = vp; - *(ckt->CKTstate0 + here->B3SOIFDve) = ve; - - *(ckt->CKTstate0 + here->B3SOIFDvbs) = vbs; - *(ckt->CKTstate0 + here->B3SOIFDvbd) = vbd; - *(ckt->CKTstate0 + here->B3SOIFDvgs) = vgs; - *(ckt->CKTstate0 + here->B3SOIFDvds) = vds; - *(ckt->CKTstate0 + here->B3SOIFDves) = ves; - *(ckt->CKTstate0 + here->B3SOIFDvps) = vps; - *(ckt->CKTstate0 + here->B3SOIFDdeltemp) = delTemp; - - /* bulk and channel charge plus overlaps */ - - if (!ChargeComputationNeeded) - goto line850; -#ifndef NOBYPASS - line755: -#endif - ag0 = ckt->CKTag[0]; - - T0 = vgd + DELTA_1; - T1 = sqrt(T0 * T0 + 4.0 * DELTA_1); - T2 = 0.5 * (T0 - T1); - - T3 = pParam->B3SOIFDweffCV * pParam->B3SOIFDcgdl; - T4 = sqrt(1.0 - 4.0 * T2 / pParam->B3SOIFDckappa); - cgdo = pParam->B3SOIFDcgdo + T3 - T3 * (1.0 - 1.0 / T4) - * (0.5 - 0.5 * T0 / T1); - qgdo = (pParam->B3SOIFDcgdo + T3) * vgd - T3 * (T2 - + 0.5 * pParam->B3SOIFDckappa * (T4 - 1.0)); - - T0 = vgs + DELTA_1; - T1 = sqrt(T0 * T0 + 4.0 * DELTA_1); - T2 = 0.5 * (T0 - T1); - T3 = pParam->B3SOIFDweffCV * pParam->B3SOIFDcgsl; - T4 = sqrt(1.0 - 4.0 * T2 / pParam->B3SOIFDckappa); - cgso = pParam->B3SOIFDcgso + T3 - T3 * (1.0 - 1.0 / T4) - * (0.5 - 0.5 * T0 / T1); - qgso = (pParam->B3SOIFDcgso + T3) * vgs - T3 * (T2 - + 0.5 * pParam->B3SOIFDckappa * (T4 - 1.0)); - - - if (here->B3SOIFDmode > 0) - { gcdgb = (here->B3SOIFDcdgb - cgdo) * ag0; - gcddb = (here->B3SOIFDcddb + cgdo + here->B3SOIFDgcde) * ag0; - gcdsb = here->B3SOIFDcdsb * ag0; - gcdeb = (here->B3SOIFDcdeb - here->B3SOIFDgcde) * ag0; - gcdT = model->B3SOIFDtype * here->B3SOIFDcdT * ag0; - - gcsgb = -(here->B3SOIFDcggb + here->B3SOIFDcbgb + here->B3SOIFDcdgb - + here->B3SOIFDcegb + cgso) * ag0; - gcsdb = -(here->B3SOIFDcgdb + here->B3SOIFDcbdb + here->B3SOIFDcddb - + here->B3SOIFDcedb) * ag0; - gcssb = (cgso + here->B3SOIFDgcse - (here->B3SOIFDcgsb + here->B3SOIFDcbsb - + here->B3SOIFDcdsb + here->B3SOIFDcesb)) * ag0; - gcseb = -(here->B3SOIFDgcse + here->B3SOIFDcgeb + here->B3SOIFDcbeb + here->B3SOIFDcdeb - + here->B3SOIFDceeb) * ag0; - gcsT = - model->B3SOIFDtype * (here->B3SOIFDcgT + here->B3SOIFDcbT + here->B3SOIFDcdT - + here->B3SOIFDceT) * ag0; - - gcggb = (here->B3SOIFDcggb + cgdo + cgso + pParam->B3SOIFDcgeo) * ag0; - gcgdb = (here->B3SOIFDcgdb - cgdo) * ag0; - gcgsb = (here->B3SOIFDcgsb - cgso) * ag0; - gcgeb = (here->B3SOIFDcgeb - pParam->B3SOIFDcgeo) * ag0; - gcgT = model->B3SOIFDtype * here->B3SOIFDcgT * ag0; - - gcbgb = here->B3SOIFDcbgb * ag0; - gcbdb = here->B3SOIFDcbdb * ag0; - gcbsb = here->B3SOIFDcbsb * ag0; - gcbeb = here->B3SOIFDcbeb * ag0; - gcbT = model->B3SOIFDtype * here->B3SOIFDcbT * ag0; - - gcegb = (here->B3SOIFDcegb - pParam->B3SOIFDcgeo) * ag0; - gcedb = (here->B3SOIFDcedb - here->B3SOIFDgcde) * ag0; - gcesb = (here->B3SOIFDcesb - here->B3SOIFDgcse) * ag0; - gceeb = (here->B3SOIFDgcse + here->B3SOIFDgcde + - here->B3SOIFDceeb + pParam->B3SOIFDcgeo) * ag0; - - gceT = model->B3SOIFDtype * here->B3SOIFDceT * ag0; - - gcTt = pParam->B3SOIFDcth * ag0; - - sxpart = 0.6; - dxpart = 0.4; - - /* Lump the overlap capacitance and S/D parasitics */ - qgd = qgdo; - qgs = qgso; - qge = pParam->B3SOIFDcgeo * vge; - qgate += qgd + qgs + qge; - qdrn += here->B3SOIFDqde - qgd; - qsub -= qge + here->B3SOIFDqse + here->B3SOIFDqde; - qsrc = -(qgate + qbody + qdrn + qsub); - } - else - { gcsgb = (here->B3SOIFDcdgb - cgso) * ag0; - gcssb = (here->B3SOIFDcddb + cgso + here->B3SOIFDgcse) * ag0; - gcsdb = here->B3SOIFDcdsb * ag0; - gcseb = (here->B3SOIFDcdeb - here->B3SOIFDgcse) * ag0; - gcsT = model->B3SOIFDtype * here->B3SOIFDcdT * ag0; - - gcdgb = -(here->B3SOIFDcggb + here->B3SOIFDcbgb + here->B3SOIFDcdgb - + here->B3SOIFDcegb + cgdo) * ag0; - gcdsb = -(here->B3SOIFDcgdb + here->B3SOIFDcbdb + here->B3SOIFDcddb - + here->B3SOIFDcedb) * ag0; - gcddb = (cgdo + here->B3SOIFDgcde - (here->B3SOIFDcgsb + here->B3SOIFDcbsb - + here->B3SOIFDcdsb + here->B3SOIFDcesb)) * ag0; - gcdeb = -(here->B3SOIFDgcde + here->B3SOIFDcgeb + here->B3SOIFDcbeb + here->B3SOIFDcdeb - + here->B3SOIFDceeb) * ag0; - gcdT = - model->B3SOIFDtype * (here->B3SOIFDcgT + here->B3SOIFDcbT - + here->B3SOIFDcdT + here->B3SOIFDceT) * ag0; - - gcggb = (here->B3SOIFDcggb + cgdo + cgso + pParam->B3SOIFDcgeo) * ag0; - gcgsb = (here->B3SOIFDcgdb - cgso) * ag0; - gcgdb = (here->B3SOIFDcgsb - cgdo) * ag0; - gcgeb = (here->B3SOIFDcgeb - pParam->B3SOIFDcgeo) * ag0; - gcgT = model->B3SOIFDtype * here->B3SOIFDcgT * ag0; - - gcbgb = here->B3SOIFDcbgb * ag0; - gcbsb = here->B3SOIFDcbdb * ag0; - gcbdb = here->B3SOIFDcbsb * ag0; - gcbeb = here->B3SOIFDcbeb * ag0; - gcbT = model->B3SOIFDtype * here->B3SOIFDcbT * ag0; - - gcegb = (here->B3SOIFDcegb - pParam->B3SOIFDcgeo) * ag0; - gcesb = (here->B3SOIFDcedb - here->B3SOIFDgcse) * ag0; - gcedb = (here->B3SOIFDcesb - here->B3SOIFDgcde) * ag0; - gceeb = (here->B3SOIFDceeb + pParam->B3SOIFDcgeo + - here->B3SOIFDgcse + here->B3SOIFDgcde) * ag0; - gceT = model->B3SOIFDtype * here->B3SOIFDceT * ag0; - - gcTt = pParam->B3SOIFDcth * ag0; - - dxpart = 0.6; - sxpart = 0.4; - - /* Lump the overlap capacitance */ - qgd = qgdo; - qgs = qgso; - qge = pParam->B3SOIFDcgeo * vge; - qgate += qgd + qgs + qge; - qsrc = qdrn - qgs + here->B3SOIFDqse; - qsub -= qge + here->B3SOIFDqse + here->B3SOIFDqde; - qdrn = -(qgate + qbody + qsrc + qsub); - } - - here->B3SOIFDcgdo = cgdo; - here->B3SOIFDcgso = cgso; - - if (ByPass) goto line860; - - *(ckt->CKTstate0 + here->B3SOIFDqe) = qsub; - *(ckt->CKTstate0 + here->B3SOIFDqg) = qgate; - *(ckt->CKTstate0 + here->B3SOIFDqd) = qdrn; - *(ckt->CKTstate0 + here->B3SOIFDqb) = qbody; - if ((model->B3SOIFDshMod == 1) && (here->B3SOIFDrth0!=0.0)) - *(ckt->CKTstate0 + here->B3SOIFDqth) = pParam->B3SOIFDcth * delTemp; - - - /* store small signal parameters */ - if (ckt->CKTmode & MODEINITSMSIG) - { goto line1000; - } - if (!ChargeComputationNeeded) - goto line850; - - - if (ckt->CKTmode & MODEINITTRAN) - { *(ckt->CKTstate1 + here->B3SOIFDqb) = - *(ckt->CKTstate0 + here->B3SOIFDqb); - *(ckt->CKTstate1 + here->B3SOIFDqg) = - *(ckt->CKTstate0 + here->B3SOIFDqg); - *(ckt->CKTstate1 + here->B3SOIFDqd) = - *(ckt->CKTstate0 + here->B3SOIFDqd); - *(ckt->CKTstate1 + here->B3SOIFDqe) = - *(ckt->CKTstate0 + here->B3SOIFDqe); - *(ckt->CKTstate1 + here->B3SOIFDqth) = - *(ckt->CKTstate0 + here->B3SOIFDqth); - } - - error = NIintegrate(ckt, &geq, &ceq,0.0,here->B3SOIFDqb); - if (error) return(error); - error = NIintegrate(ckt, &geq, &ceq, 0.0, here->B3SOIFDqg); - if (error) return(error); - error = NIintegrate(ckt,&geq, &ceq, 0.0, here->B3SOIFDqd); - if (error) return(error); - error = NIintegrate(ckt,&geq, &ceq, 0.0, here->B3SOIFDqe); - if (error) return(error); - if ((model->B3SOIFDshMod == 1) && (here->B3SOIFDrth0!=0.0)) - { - error = NIintegrate(ckt, &geq, &ceq, 0.0, here->B3SOIFDqth); - if (error) return (error); - } - - goto line860; - - line850: - /* initialize to zero charge conductance and current */ - ceqqe = ceqqg = ceqqb = ceqqd = ceqqth= 0.0; - - gcdgb = gcddb = gcdsb = gcdeb = gcdT = 0.0; - gcsgb = gcsdb = gcssb = gcseb = gcsT = 0.0; - gcggb = gcgdb = gcgsb = gcgeb = gcgT = 0.0; - gcbgb = gcbdb = gcbsb = gcbeb = gcbT = 0.0; - gcegb = gcedb = gceeb = gcesb = gceT = 0.0; - gcTt = 0.0; - - sxpart = (1.0 - (dxpart = (here->B3SOIFDmode > 0) ? 0.4 : 0.6)); - - goto line900; - - line860: - /* evaluate equivalent charge current */ - - cqgate = *(ckt->CKTstate0 + here->B3SOIFDcqg); - cqbody = *(ckt->CKTstate0 + here->B3SOIFDcqb); - cqdrn = *(ckt->CKTstate0 + here->B3SOIFDcqd); - cqsub = *(ckt->CKTstate0 + here->B3SOIFDcqe); - cqtemp = *(ckt->CKTstate0 + here->B3SOIFDcqth); - - here->B3SOIFDcb += cqbody; - here->B3SOIFDcd += cqdrn; - - ceqqg = cqgate - gcggb * vgb + gcgdb * vbd + gcgsb * vbs - - gcgeb * veb - gcgT * delTemp; - ceqqb = cqbody - gcbgb * vgb + gcbdb * vbd + gcbsb * vbs - - gcbeb * veb - gcbT * delTemp; - ceqqd = cqdrn - gcdgb * vgb + gcddb * vbd + gcdsb * vbs - - gcdeb * veb - gcdT * delTemp; - ceqqe = cqsub - gcegb * vgb + gcedb * vbd + gcesb * vbs - - gceeb * veb - gceT * delTemp;; - ceqqth = cqtemp - gcTt * delTemp; - - if (ckt->CKTmode & MODEINITTRAN) - { *(ckt->CKTstate1 + here->B3SOIFDcqe) = - *(ckt->CKTstate0 + here->B3SOIFDcqe); - *(ckt->CKTstate1 + here->B3SOIFDcqb) = - *(ckt->CKTstate0 + here->B3SOIFDcqb); - *(ckt->CKTstate1 + here->B3SOIFDcqg) = - *(ckt->CKTstate0 + here->B3SOIFDcqg); - *(ckt->CKTstate1 + here->B3SOIFDcqd) = - *(ckt->CKTstate0 + here->B3SOIFDcqd); - *(ckt->CKTstate1 + here->B3SOIFDcqth) = - *(ckt->CKTstate0 + here->B3SOIFDcqth); - } - - /* - * load current vector - */ - line900: - - m = here->B3SOIFDm; - - if (here->B3SOIFDmode >= 0) - { Gm = here->B3SOIFDgm; - Gmbs = here->B3SOIFDgmbs; - Gme = here->B3SOIFDgme; - GmT = model->B3SOIFDtype * here->B3SOIFDgmT; - FwdSum = Gm + Gmbs + Gme; - RevSum = 0.0; - cdreq = model->B3SOIFDtype * (here->B3SOIFDcdrain - here->B3SOIFDgds * vds - - Gm * vgs - Gmbs * vbs - Gme * ves - GmT * delTemp); - /* ceqbs now is compatible with cdreq, ie. going in is +ve */ - /* Equivalent current source from the diode */ - ceqbs = here->B3SOIFDcjs; - ceqbd = here->B3SOIFDcjd; - /* Current going in is +ve */ - ceqbody = -here->B3SOIFDcbody; - ceqth = here->B3SOIFDcth; - ceqbodcon = here->B3SOIFDcbodcon; - - gbbg = -here->B3SOIFDgbgs; - gbbdp = -here->B3SOIFDgbds; - gbbb = -here->B3SOIFDgbbs; - gbbe = -here->B3SOIFDgbes; - gbbp = -here->B3SOIFDgbps; - gbbT = -model->B3SOIFDtype * here->B3SOIFDgbT; - gbbsp = - ( gbbg + gbbdp + gbbb + gbbe + gbbp); - - gddpg = -here->B3SOIFDgjdg; - gddpdp = -here->B3SOIFDgjdd; - gddpb = -here->B3SOIFDgjdb; - gddpe = -here->B3SOIFDgjde; - gddpT = -model->B3SOIFDtype * here->B3SOIFDgjdT; - gddpsp = - ( gddpg + gddpdp + gddpb + gddpe); - - gsspg = -here->B3SOIFDgjsg; - gsspdp = -here->B3SOIFDgjsd; - gsspb = -here->B3SOIFDgjsb; - gsspe = 0.0; - gsspT = -model->B3SOIFDtype * here->B3SOIFDgjsT; - gsspsp = - (gsspg + gsspdp + gsspb + gsspe); - - gppg = -here->B3SOIFDgbpgs; - gppdp = -here->B3SOIFDgbpds; - gppb = -here->B3SOIFDgbpbs; - gppe = -here->B3SOIFDgbpes; - gppp = -here->B3SOIFDgbpps; - gppT = -model->B3SOIFDtype * here->B3SOIFDgbpT; - gppsp = - (gppg + gppdp + gppb + gppe + gppp); - - gTtg = here->B3SOIFDgtempg; - gTtb = here->B3SOIFDgtempb; - gTte = here->B3SOIFDgtempe; - gTtdp = here->B3SOIFDgtempd; - gTtt = here->B3SOIFDgtempT; - gTtsp = - (gTtg + gTtb + gTte + gTtdp); - } - else - { Gm = -here->B3SOIFDgm; - Gmbs = -here->B3SOIFDgmbs; - Gme = -here->B3SOIFDgme; - GmT = -model->B3SOIFDtype * here->B3SOIFDgmT; - FwdSum = 0.0; - RevSum = -(Gm + Gmbs + Gme); - cdreq = -model->B3SOIFDtype * (here->B3SOIFDcdrain + here->B3SOIFDgds*vds - + Gm * vgd + Gmbs * vbd + Gme * (ves - vds) + GmT * delTemp); - ceqbs = here->B3SOIFDcjd; - ceqbd = here->B3SOIFDcjs; - /* Current going in is +ve */ - ceqbody = -here->B3SOIFDcbody; - ceqth = here->B3SOIFDcth; - ceqbodcon = here->B3SOIFDcbodcon; - - gbbg = -here->B3SOIFDgbgs; - gbbb = -here->B3SOIFDgbbs; - gbbe = -here->B3SOIFDgbes; - gbbp = -here->B3SOIFDgbps; - gbbsp = -here->B3SOIFDgbds; - gbbT = -model->B3SOIFDtype * here->B3SOIFDgbT; - gbbdp = - ( gbbg + gbbsp + gbbb + gbbe + gbbp); - - gddpg = -here->B3SOIFDgjsg; - gddpsp = -here->B3SOIFDgjsd; - gddpb = -here->B3SOIFDgjsb; - gddpe = 0.0; - gddpT = -model->B3SOIFDtype * here->B3SOIFDgjsT; - gddpdp = - (gddpg + gddpsp + gddpb + gddpe); - - gsspg = -here->B3SOIFDgjdg; - gsspsp = -here->B3SOIFDgjdd; - gsspb = -here->B3SOIFDgjdb; - gsspe = -here->B3SOIFDgjde; - gsspT = -model->B3SOIFDtype * here->B3SOIFDgjdT; - gsspdp = - ( gsspg + gsspsp + gsspb + gsspe); - - gppg = -here->B3SOIFDgbpgs; - gppsp = -here->B3SOIFDgbpds; - gppb = -here->B3SOIFDgbpbs; - gppe = -here->B3SOIFDgbpes; - gppp = -here->B3SOIFDgbpps; - gppT = -model->B3SOIFDtype * here->B3SOIFDgbpT; - gppdp = - (gppg + gppsp + gppb + gppe + gppp); - - gTtg = here->B3SOIFDgtempg; - gTtb = here->B3SOIFDgtempb; - gTte = here->B3SOIFDgtempe; - gTtsp = here->B3SOIFDgtempd; - gTtt = here->B3SOIFDgtempT; - gTtdp = - (gTtg + gTtb + gTte + gTtsp); - } - - if (model->B3SOIFDtype < 0) - { - ceqbodcon = -ceqbodcon; - ceqbody = -ceqbody; - ceqbs = -ceqbs; - ceqbd = -ceqbd; - ceqqg = -ceqqg; - ceqqb = -ceqqb; - ceqqd = -ceqqd; - ceqqe = -ceqqe; - } - - (*(ckt->CKTrhs + here->B3SOIFDgNode) -= m * ceqqg); - (*(ckt->CKTrhs + here->B3SOIFDdNodePrime) += m * (ceqbd - cdreq - ceqqd)); - (*(ckt->CKTrhs + here->B3SOIFDsNodePrime) += m * (cdreq + ceqbs + ceqqg - + ceqqb + ceqqd + ceqqe)); - (*(ckt->CKTrhs + here->B3SOIFDeNode) -= m * ceqqe); - - if (here->B3SOIFDbodyMod == 1) { - (*(ckt->CKTrhs + here->B3SOIFDpNode) += m * ceqbodcon); - } - - if (selfheat) { - (*(ckt->CKTrhs + here->B3SOIFDtempNode) -= m * (ceqth + ceqqth)); - } - - - - if ((here->B3SOIFDdebugMod > 1) || (here->B3SOIFDdebugMod == -1)) - { - *(ckt->CKTrhs + here->B3SOIFDvbsNode) = here->B3SOIFDvbsdio; - *(ckt->CKTrhs + here->B3SOIFDidsNode) = here->B3SOIFDids; - *(ckt->CKTrhs + here->B3SOIFDicNode) = here->B3SOIFDic; - *(ckt->CKTrhs + here->B3SOIFDibsNode) = here->B3SOIFDibs; - *(ckt->CKTrhs + here->B3SOIFDibdNode) = here->B3SOIFDibd; - *(ckt->CKTrhs + here->B3SOIFDiiiNode) = here->B3SOIFDiii; - *(ckt->CKTrhs + here->B3SOIFDigidlNode) = here->B3SOIFDigidl; - *(ckt->CKTrhs + here->B3SOIFDitunNode) = here->B3SOIFDitun; - *(ckt->CKTrhs + here->B3SOIFDibpNode) = here->B3SOIFDibp; - *(ckt->CKTrhs + here->B3SOIFDabeffNode) = here->B3SOIFDabeff; - *(ckt->CKTrhs + here->B3SOIFDvbs0effNode) = here->B3SOIFDvbs0eff; - *(ckt->CKTrhs + here->B3SOIFDvbseffNode) = here->B3SOIFDvbseff; - *(ckt->CKTrhs + here->B3SOIFDxcNode) = here->B3SOIFDxc; - *(ckt->CKTrhs + here->B3SOIFDcbbNode) = here->B3SOIFDcbb; - *(ckt->CKTrhs + here->B3SOIFDcbdNode) = here->B3SOIFDcbd; - *(ckt->CKTrhs + here->B3SOIFDcbgNode) = here->B3SOIFDcbg; - *(ckt->CKTrhs + here->B3SOIFDqbfNode) = here->B3SOIFDqbf; - *(ckt->CKTrhs + here->B3SOIFDqjsNode) = here->B3SOIFDqjs; - *(ckt->CKTrhs + here->B3SOIFDqjdNode) = here->B3SOIFDqjd; - - /* clean up last */ - *(ckt->CKTrhs + here->B3SOIFDgmNode) = Gm; - *(ckt->CKTrhs + here->B3SOIFDgmbsNode) = Gmbs; - *(ckt->CKTrhs + here->B3SOIFDgdsNode) = Gds; - *(ckt->CKTrhs + here->B3SOIFDgmeNode) = Gme; - *(ckt->CKTrhs + here->B3SOIFDqdNode) = qdrn; - *(ckt->CKTrhs + here->B3SOIFDcbeNode) = Cbe; - *(ckt->CKTrhs + here->B3SOIFDvbs0teffNode) = Vbs0teff; - *(ckt->CKTrhs + here->B3SOIFDvthNode) = here->B3SOIFDvon; - *(ckt->CKTrhs + here->B3SOIFDvgsteffNode) = Vgsteff; - *(ckt->CKTrhs + here->B3SOIFDxcsatNode) = Xcsat; - *(ckt->CKTrhs + here->B3SOIFDqaccNode) = -Qac0; - *(ckt->CKTrhs + here->B3SOIFDqsub0Node) = Qsub0; - *(ckt->CKTrhs + here->B3SOIFDqsubs1Node) = Qsubs1; - *(ckt->CKTrhs + here->B3SOIFDqsubs2Node) = Qsubs2; - *(ckt->CKTrhs + here->B3SOIFDvdscvNode) = VdsCV; - *(ckt->CKTrhs + here->B3SOIFDvcscvNode) = VcsCV; - *(ckt->CKTrhs + here->B3SOIFDqgNode) = qgate; - *(ckt->CKTrhs + here->B3SOIFDqbNode) = qbody; - *(ckt->CKTrhs + here->B3SOIFDqeNode) = qsub; - *(ckt->CKTrhs + here->B3SOIFDdum1Node) = here->B3SOIFDdum1; - *(ckt->CKTrhs + here->B3SOIFDdum2Node) = here->B3SOIFDdum2; - *(ckt->CKTrhs + here->B3SOIFDdum3Node) = here->B3SOIFDdum3; - *(ckt->CKTrhs + here->B3SOIFDdum4Node) = here->B3SOIFDdum4; - *(ckt->CKTrhs + here->B3SOIFDdum5Node) = here->B3SOIFDdum5; - /* end clean up last */ - } - - - /* - * load y matrix - */ - (*(here->B3SOIFDEgPtr) += m * gcegb); - (*(here->B3SOIFDEdpPtr) += m * gcedb); - (*(here->B3SOIFDEspPtr) += m * gcesb); - (*(here->B3SOIFDGePtr) += m * gcgeb); - (*(here->B3SOIFDDPePtr) += m * (Gme + gddpe + gcdeb)); - (*(here->B3SOIFDSPePtr) += m * (gsspe - Gme + gcseb)); - - (*(here->B3SOIFDEePtr) += m * gceeb); - - (*(here->B3SOIFDGgPtr) += m * (gcggb + ckt->CKTgmin)); - (*(here->B3SOIFDGdpPtr) += m * (gcgdb - ckt->CKTgmin)); - (*(here->B3SOIFDGspPtr) += m * gcgsb ); - - (*(here->B3SOIFDDPgPtr) += m * ((Gm + gcdgb) + gddpg - ckt->CKTgmin)); - (*(here->B3SOIFDDPdpPtr) += m * ((here->B3SOIFDdrainConductance - + here->B3SOIFDgds + gddpdp - + RevSum + gcddb) + ckt->CKTgmin)); - (*(here->B3SOIFDDPspPtr) -= m * (-gddpsp + here->B3SOIFDgds + FwdSum - gcdsb)); - - (*(here->B3SOIFDDPdPtr) -= m * here->B3SOIFDdrainConductance); - - (*(here->B3SOIFDSPgPtr) += m * (gcsgb - Gm + gsspg)); - (*(here->B3SOIFDSPdpPtr) -= m * (here->B3SOIFDgds - gsspdp + RevSum - gcsdb)); - (*(here->B3SOIFDSPspPtr) += m * (here->B3SOIFDsourceConductance - + here->B3SOIFDgds + gsspsp - + FwdSum + gcssb)); - (*(here->B3SOIFDSPsPtr) -= m * here->B3SOIFDsourceConductance); - - - (*(here->B3SOIFDDdPtr) += m * here->B3SOIFDdrainConductance); - (*(here->B3SOIFDDdpPtr) -= m * here->B3SOIFDdrainConductance); - - - (*(here->B3SOIFDSsPtr) += m * here->B3SOIFDsourceConductance); - (*(here->B3SOIFDSspPtr) -= m * here->B3SOIFDsourceConductance); - - if (here->B3SOIFDbodyMod == 1) { - (*(here->B3SOIFDBpPtr) -= m * gppp); - (*(here->B3SOIFDPbPtr) += m * gppb); - (*(here->B3SOIFDPpPtr) += m * gppp); - (*(here->B3SOIFDPgPtr) += m * gppg); - (*(here->B3SOIFDPdpPtr) += m * gppdp); - (*(here->B3SOIFDPspPtr) += m * gppsp); - (*(here->B3SOIFDPePtr) += m * gppe); - } - - if (selfheat) - { - (*(here->B3SOIFDDPtempPtr) += m * (GmT + gddpT + gcdT)); - (*(here->B3SOIFDSPtempPtr) += m * (-GmT + gsspT + gcsT)); - (*(here->B3SOIFDBtempPtr) += m * (gbbT + gcbT)); - (*(here->B3SOIFDEtempPtr) += m * gceT); - (*(here->B3SOIFDGtempPtr) += m * gcgT); - if (here->B3SOIFDbodyMod == 1) { - (*(here->B3SOIFDPtempPtr) += m * gppT); - } - (*(here->B3SOIFDTemptempPtr) += m * (gTtt + 1/pParam->B3SOIFDrth + gcTt)); - (*(here->B3SOIFDTempgPtr) += m * gTtg); - (*(here->B3SOIFDTempbPtr) += m * gTtb); - (*(here->B3SOIFDTempePtr) += m * gTte); - (*(here->B3SOIFDTempdpPtr) += m * gTtdp); - (*(here->B3SOIFDTempspPtr) += m * gTtsp); - } - - if ((here->B3SOIFDdebugMod > 1) || (here->B3SOIFDdebugMod == -1)) - { - *(here->B3SOIFDVbsPtr) += m * 1; - *(here->B3SOIFDIdsPtr) += m * 1; - *(here->B3SOIFDIcPtr) += m * 1; - *(here->B3SOIFDIbsPtr) += m * 1; - *(here->B3SOIFDIbdPtr) += m * 1; - *(here->B3SOIFDIiiPtr) += m * 1; - *(here->B3SOIFDIgidlPtr) += m * 1; - *(here->B3SOIFDItunPtr) += m * 1; - *(here->B3SOIFDIbpPtr) += m * 1; - *(here->B3SOIFDAbeffPtr) += m * 1; - *(here->B3SOIFDVbs0effPtr) += m * 1; - *(here->B3SOIFDVbseffPtr) += m * 1; - *(here->B3SOIFDXcPtr) += m * 1; - *(here->B3SOIFDCbgPtr) += m * 1; - *(here->B3SOIFDCbbPtr) += m * 1; - *(here->B3SOIFDCbdPtr) += m * 1; - *(here->B3SOIFDqbPtr) += m * 1; - *(here->B3SOIFDQbfPtr) += m * 1; - *(here->B3SOIFDQjsPtr) += m * 1; - *(here->B3SOIFDQjdPtr) += m * 1; - - /* clean up last */ - *(here->B3SOIFDGmPtr) += m * 1; - *(here->B3SOIFDGmbsPtr) += m * 1; - *(here->B3SOIFDGdsPtr) += m * 1; - *(here->B3SOIFDGmePtr) += m * 1; - *(here->B3SOIFDVbs0teffPtr) += m * 1; - *(here->B3SOIFDVgsteffPtr) += m * 1; - *(here->B3SOIFDCbePtr) += m * 1; - *(here->B3SOIFDVthPtr) += m * 1; - *(here->B3SOIFDXcsatPtr) += m * 1; - *(here->B3SOIFDVdscvPtr) += m * 1; - *(here->B3SOIFDVcscvPtr) += m * 1; - *(here->B3SOIFDQaccPtr) += m * 1; - *(here->B3SOIFDQsub0Ptr) += m * 1; - *(here->B3SOIFDQsubs1Ptr) += m * 1; - *(here->B3SOIFDQsubs2Ptr) += m * 1; - *(here->B3SOIFDqgPtr) += m * 1; - *(here->B3SOIFDqdPtr) += m * 1; - *(here->B3SOIFDqePtr) += m * 1; - *(here->B3SOIFDDum1Ptr) += m * 1; - *(here->B3SOIFDDum2Ptr) += m * 1; - *(here->B3SOIFDDum3Ptr) += m * 1; - *(here->B3SOIFDDum4Ptr) += m * 1; - *(here->B3SOIFDDum5Ptr) += m * 1; - /* end clean up last */ - } - - line1000: ; - -/* Here NaN will be detected in any conductance or equivalent current. Note - that nandetect is initialized within the "if" statements */ - - if ((nandetect = isnan (*(here->B3SOIFDGgPtr))) != 0) - { strcpy (nanmessage, "GgPtr"); } - else if ((nandetect = isnan (*(here->B3SOIFDGdpPtr))) != 0) - { strcpy (nanmessage, "GdpPtr"); } - else if ((nandetect = isnan (*(here->B3SOIFDGspPtr))) != 0) - { strcpy (nanmessage, "GspPtr"); } - else if ((nandetect = isnan (*(here->B3SOIFDDPgPtr))) != 0) - { strcpy (nanmessage, "DPgPtr"); } - else if ((nandetect = isnan (*(here->B3SOIFDDPdpPtr))) != 0) - { strcpy (nanmessage, "DPdpPtr"); } - else if ((nandetect = isnan (*(here->B3SOIFDDPspPtr))) != 0) - { strcpy (nanmessage, "DPspPtr"); } - else if ((nandetect = isnan (*(here->B3SOIFDSPgPtr))) != 0) - { strcpy (nanmessage, "SPgPtr"); } - else if ((nandetect = isnan (*(here->B3SOIFDSPdpPtr))) != 0) - { strcpy (nanmessage, "SPdpPtr"); } - else if ((nandetect = isnan (*(here->B3SOIFDSPspPtr))) != 0) - { strcpy (nanmessage, "SPspPtr"); } - else if ((nandetect = isnan (*(here->B3SOIFDEePtr))) != 0) - { strcpy (nanmessage, "EePtr"); } - - /* At this point, nandetect = 0 if none of the - conductances checked so far are NaN */ - - if (nandetect == 0) - { - if ((nandetect = isnan (*(here->B3SOIFDEgPtr))) != 0) - { strcpy (nanmessage, "EgPtr"); } - else if ((nandetect = isnan (*(here->B3SOIFDEdpPtr))) != 0) - { strcpy (nanmessage, "EdpPtr"); } - else if ((nandetect = isnan (*(here->B3SOIFDEspPtr))) != 0) - { strcpy (nanmessage, "EspPtr"); } - else if ((nandetect = isnan (*(here->B3SOIFDGePtr))) != 0) - { strcpy (nanmessage, "GePtr"); } - else if ((nandetect = isnan (*(here->B3SOIFDDPePtr))) != 0) - { strcpy (nanmessage, "DPePtr"); } - else if ((nandetect = isnan (*(here->B3SOIFDSPePtr))) != 0) - { strcpy (nanmessage, "SPePtr"); } } - - /* Now check if self-heating caused NaN if nothing else - has so far (check tempnode current also) */ - - if (selfheat && nandetect == 0) - { - if ((nandetect = isnan (*(here->B3SOIFDTemptempPtr))) != 0) - { strcpy (nanmessage, "TemptempPtr"); } - else if ((nandetect = isnan (*(here->B3SOIFDTempgPtr))) != 0) - { strcpy (nanmessage, "TempgPtr"); } - else if ((nandetect = isnan (*(here->B3SOIFDTempbPtr))) != 0) - { strcpy (nanmessage, "TempbPtr"); } - else if ((nandetect = isnan (*(here->B3SOIFDTempePtr))) != 0) - { strcpy (nanmessage, "TempePtr"); } - else if ((nandetect = isnan (*(here->B3SOIFDTempdpPtr))) != 0) - { strcpy (nanmessage, "TempdpPtr"); } - else if ((nandetect = isnan (*(here->B3SOIFDTempspPtr))) != 0) - { strcpy (nanmessage, "TempspPtr"); } - else if ((nandetect = isnan (*(here->B3SOIFDGtempPtr))) != 0) - { strcpy (nanmessage, "GtempPtr"); } - else if ((nandetect = isnan (*(here->B3SOIFDDPtempPtr))) != 0) - { strcpy (nanmessage, "DPtempPtr"); } - else if ((nandetect = isnan (*(here->B3SOIFDSPtempPtr))) != 0) - { strcpy (nanmessage, "SPtempPtr"); } - else if ((nandetect = isnan (*(here->B3SOIFDEtempPtr))) != 0) - { strcpy (nanmessage, "EtempPtr"); } - else if ((nandetect = isnan (*(here->B3SOIFDBtempPtr))) != 0) - { strcpy (nanmessage, "BtempPtr"); } - else if ((nandetect = isnan (*(ckt->CKTrhs + here->B3SOIFDtempNode))) != 0) - { strcpy (nanmessage, "tempNode"); } - } - - /* Lastly, check all equivalent currents (tempnode is - checked above */ - - if (nandetect == 0) - { - if ((nandetect = isnan (*(ckt->CKTrhs - + here->B3SOIFDgNode))) != 0) - { strcpy (nanmessage, "gNode"); } - else if ((nandetect = isnan (*(ckt->CKTrhs - + here->B3SOIFDbNode))) != 0) - { strcpy (nanmessage, "bNode"); } - else if ((nandetect = isnan (*(ckt->CKTrhs - + here->B3SOIFDdNodePrime))) != 0) - { strcpy (nanmessage, "dpNode"); } - else if ((nandetect = isnan (*(ckt->CKTrhs - + here->B3SOIFDsNodePrime))) != 0) - { strcpy (nanmessage, "spNode"); } - else if ((nandetect = isnan (*(ckt->CKTrhs - + here->B3SOIFDeNode))) != 0) - { strcpy (nanmessage, "eNode"); } - } - - /* Now print error message if NaN detected. Note that - error will only be printed once (the first time it is - encountered) each time SPICE is run since nanfound is - static variable */ - - if (nanfound == 0 && nandetect) - { - fprintf(stderr, "Alberto says: YOU TURKEY! %s is NaN for instance %s at time %g!\n", nanmessage, here->B3SOIFDname, ckt->CKTtime); - nanfound = nandetect; - fprintf(stderr, " The program exit!\n"); - controlled_exit(EXIT_FAILURE); - } - - if (here->B3SOIFDdebugMod > 2) - { - fprintf(fpdebug, "Ids = %.4e, Ic = %.4e, cqdrn = %.4e, gmin=%.3e\n", - Ids, Ic, cqdrn, ckt->CKTgmin); - fprintf(fpdebug, "Iii = %.4e, Idgidl = %.4e, Ibs = %.14e\n", - Iii, Idgidl, Ibs); - fprintf(fpdebug, "Ibd = %.4e, Ibp = %.4e\n", Ibd, Ibp); - fprintf(fpdebug, "qbody = %.5e, qbf = %.5e, qbe = %.5e\n", - qbody, Qbf, -(Qe1+Qe2)); - fprintf(fpdebug, "qbs = %.5e, qbd = %.5e\n", qjs, qjd); - fprintf(fpdebug, "qdrn = %.5e, qinv = %.5e\n", qdrn, qinv); - - - - -/* I am trying to debug the convergence problems here by printing out - the entire Jacobian and equivalent current matrix */ - - if (here->B3SOIFDdebugMod > 4) { - fprintf(fpdebug, "Ibtot = %.6e;\t Cbtot = %.6e;\n", Ibs+Ibp+Ibd-Iii-Idgidl-Isgidl, cqbody); - fprintf(fpdebug, "ceqg = %.6e;\t ceqb = %.6e;\t ceqdp = %.6e;\t ceqsp = %.6e;\n", - *(ckt->CKTrhs + here->B3SOIFDgNode), - *(ckt->CKTrhs + here->B3SOIFDbNode), - *(ckt->CKTrhs + here->B3SOIFDdNodePrime), - *(ckt->CKTrhs + here->B3SOIFDsNodePrime)); - fprintf(fpdebug, "ceqe = %.6e;\t ceqp = %.6e;\t ceqth = %.6e;\n", - *(ckt->CKTrhs + here->B3SOIFDeNode), - *(ckt->CKTrhs + here->B3SOIFDpNode), - *(ckt->CKTrhs + here->B3SOIFDtempNode)); - - fprintf(fpdebug, "Eg = %.5e;\t Edp = %.5e;\t Esp = %.5e;\t Eb = %.5e;\n", - *(here->B3SOIFDEgPtr), - *(here->B3SOIFDEdpPtr), - *(here->B3SOIFDEspPtr), - *(here->B3SOIFDEbPtr)); - fprintf(fpdebug, "Ee = %.5e;\t Gg = %.5e;\t Gdp = %.5e;\t Gsp = %.5e;\n", - *(here->B3SOIFDEePtr), - *(here->B3SOIFDGgPtr), - *(here->B3SOIFDGdpPtr), - *(here->B3SOIFDGspPtr)); - fprintf(fpdebug, "Gb = %.5e;\t Ge = %.5e;\t DPg = %.5e;\t DPdp = %.5e;\n", - *(here->B3SOIFDGbPtr), - *(here->B3SOIFDGePtr), - *(here->B3SOIFDDPgPtr), - *(here->B3SOIFDDPdpPtr)); - fprintf(fpdebug, "DPsp = %.5e;\t DPb = %.5e;\t DPe = %.5e;\t\n", - *(here->B3SOIFDDPspPtr), - *(here->B3SOIFDDPbPtr), - *(here->B3SOIFDDPePtr)); - fprintf(fpdebug, "DPd = %.5e;\t SPg = %.5e;\t SPdp = %.5e;\t SPsp = %.5e;\n", - *(here->B3SOIFDDPdPtr), - *(here->B3SOIFDSPgPtr), - *(here->B3SOIFDSPdpPtr), - *(here->B3SOIFDSPspPtr)); - fprintf(fpdebug, "SPb = %.5e;\t SPe = %.5e;\t SPs = %.5e;\n", - *(here->B3SOIFDSPbPtr), - *(here->B3SOIFDSPePtr), - *(here->B3SOIFDSPsPtr)); - fprintf(fpdebug, "Dd = %.5e;\t Ddp = %.5e;\t Ss = %.5e;\t Ssp = %.5e;\n", - *(here->B3SOIFDDdPtr), - *(here->B3SOIFDDdpPtr), - *(here->B3SOIFDSsPtr), - *(here->B3SOIFDSspPtr)); - fprintf(fpdebug, "Bg = %.5e;\t Bdp = %.5e;\t Bsp = %.5e;\t Bb = %.5e;\n", - *(here->B3SOIFDBgPtr), - *(here->B3SOIFDBdpPtr), - *(here->B3SOIFDBspPtr), - *(here->B3SOIFDBbPtr)); - fprintf(fpdebug, "Be = %.5e;\t Btot = %.5e;\t DPtot = %.5e;\n", - *(here->B3SOIFDBePtr), - *(here->B3SOIFDBgPtr) + *(here->B3SOIFDBdpPtr) - + *(here->B3SOIFDBspPtr) + *(here->B3SOIFDBbPtr) - + *(here->B3SOIFDBePtr), - *(here->B3SOIFDDPePtr) - + *(here->B3SOIFDDPgPtr) + *(here->B3SOIFDDPdpPtr) - + *(here->B3SOIFDDPspPtr) + *(here->B3SOIFDDPbPtr)); - - if (selfheat) { - fprintf (fpdebug, "DPtemp = %.5e;\t SPtemp = %.5e;\t Btemp = %.5e;\n", - *(here->B3SOIFDDPtempPtr), *(here->B3SOIFDSPtempPtr), - *(here->B3SOIFDBtempPtr)); - fprintf (fpdebug, "Gtemp = %.5e;\t Etemp = %.5e;\n", - *(here->B3SOIFDGtempPtr), *(here->B3SOIFDEtempPtr)); - fprintf (fpdebug, "Tempg = %.5e;\t Tempdp = %.5e;\t Tempsp = %.5e;\t Tempb = %.5e;\n", - *(here->B3SOIFDTempgPtr), *(here->B3SOIFDTempdpPtr), - *(here->B3SOIFDTempspPtr), *(here->B3SOIFDTempbPtr)); - fprintf (fpdebug, "Tempe = %.5e;\t TempT = %.5e;\t Temptot = %.5e;\n", - *(here->B3SOIFDTempePtr), *(here->B3SOIFDTemptempPtr), - *(here->B3SOIFDTempgPtr) + *(here->B3SOIFDTempdpPtr) - + *(here->B3SOIFDTempspPtr)+ *(here->B3SOIFDTempbPtr) - + *(here->B3SOIFDTempePtr)); - } - - if (here->B3SOIFDbodyMod == 1) - { - fprintf(fpdebug, "ceqbodcon=%.5e;\t", ceqbodcon); - fprintf(fpdebug, "Bp = %.5e;\t Pb = %.5e;\t Pp = %.5e;\n", -gppp, gppb, gppp); - fprintf(fpdebug, "Pg=%.5e;\t Pdp=%.5e;\t Psp=%.5e;\t Pe=%.5e;\n", - gppg, gppdp, gppsp, gppe); - } -} - - if (here->B3SOIFDdebugMod > 3) - { - fprintf(fpdebug, "Vth = %.4f, Vbs0eff = %.8f, Vdsat = %.4f\n", - Vth, Vbs0eff, Vdsat); - fprintf(fpdebug, "ueff = %g, Vgsteff = %.4f, Vdseff = %.4f\n", - ueff, Vgsteff, Vdseff); - fprintf(fpdebug, "Vthfd = %.4f, Vbs0mos = %.4f, Vbs0 = %.4f\n", - Vthfd, Vbs0mos, Vbs0); - fprintf(fpdebug, "Vbs0t = %.4f, Vbsdio = %.8f\n", - Vbs0t, Vbsdio); - } - - fclose(fpdebug); - } - - here->B3SOIFDiterations++; /* increment the iteration counter */ - - } /* End of Mosfet Instance */ -} /* End of Model Instance */ - - -return(OK); -} - diff --git a/src/spicelib/devices/bsim3soi_fd/b3soifdmask.c b/src/spicelib/devices/bsim3soi_fd/b3soifdmask.c deleted file mode 100644 index 5cbb2444d..000000000 --- a/src/spicelib/devices/bsim3soi_fd/b3soifdmask.c +++ /dev/null @@ -1,1210 +0,0 @@ -/********** -Copyright 1999 Regents of the University of California. All rights reserved. -Author: Weidong Liu and Pin Su Feb 1999 -Author: 1998 Samuel Fung, Dennis Sinitsky and Stephen Tang -File: b3soifdmask.c 98/5/01 -Modified by Wei Jin 99/9/27 -Modified by Paolo Nenzi 2002 -**********/ - -/* - * Revision 2.1 99/9/27 Pin Su - * BSIMFD2.1 release - */ - -#include "ngspice/ngspice.h" -#include "ngspice/ifsim.h" -#include "ngspice/cktdefs.h" -#include "ngspice/devdefs.h" -#include "b3soifddef.h" -#include "ngspice/sperror.h" -#include "ngspice/suffix.h" - -int -B3SOIFDmAsk(CKTcircuit *ckt, GENmodel *inst, int which, IFvalue *value) -{ - B3SOIFDmodel *model = (B3SOIFDmodel *)inst; - - NG_IGNORE(ckt); - - switch(which) - { case B3SOIFD_MOD_MOBMOD: - value->iValue = model->B3SOIFDmobMod; - return(OK); - case B3SOIFD_MOD_PARAMCHK: - value->iValue = model->B3SOIFDparamChk; - return(OK); - case B3SOIFD_MOD_BINUNIT: - value->iValue = model->B3SOIFDbinUnit; - return(OK); - case B3SOIFD_MOD_CAPMOD: - value->iValue = model->B3SOIFDcapMod; - return(OK); - case B3SOIFD_MOD_SHMOD: - value->iValue = model->B3SOIFDshMod; - return(OK); - case B3SOIFD_MOD_NOIMOD: - value->iValue = model->B3SOIFDnoiMod; - return(OK); - case B3SOIFD_MOD_VERSION : - value->rValue = model->B3SOIFDversion; - return(OK); - case B3SOIFD_MOD_TOX : - value->rValue = model->B3SOIFDtox; - return(OK); - case B3SOIFD_MOD_CDSC : - value->rValue = model->B3SOIFDcdsc; - return(OK); - case B3SOIFD_MOD_CDSCB : - value->rValue = model->B3SOIFDcdscb; - return(OK); - - case B3SOIFD_MOD_CDSCD : - value->rValue = model->B3SOIFDcdscd; - return(OK); - - case B3SOIFD_MOD_CIT : - value->rValue = model->B3SOIFDcit; - return(OK); - case B3SOIFD_MOD_NFACTOR : - value->rValue = model->B3SOIFDnfactor; - return(OK); - case B3SOIFD_MOD_VSAT: - value->rValue = model->B3SOIFDvsat; - return(OK); - case B3SOIFD_MOD_AT: - value->rValue = model->B3SOIFDat; - return(OK); - case B3SOIFD_MOD_A0: - value->rValue = model->B3SOIFDa0; - return(OK); - - case B3SOIFD_MOD_AGS: - value->rValue = model->B3SOIFDags; - return(OK); - - case B3SOIFD_MOD_A1: - value->rValue = model->B3SOIFDa1; - return(OK); - case B3SOIFD_MOD_A2: - value->rValue = model->B3SOIFDa2; - return(OK); - case B3SOIFD_MOD_KETA: - value->rValue = model->B3SOIFDketa; - return(OK); - case B3SOIFD_MOD_NSUB: - value->rValue = model->B3SOIFDnsub; - return(OK); - case B3SOIFD_MOD_NPEAK: - value->rValue = model->B3SOIFDnpeak; - return(OK); - case B3SOIFD_MOD_NGATE: - value->rValue = model->B3SOIFDngate; - return(OK); - case B3SOIFD_MOD_GAMMA1: - value->rValue = model->B3SOIFDgamma1; - return(OK); - case B3SOIFD_MOD_GAMMA2: - value->rValue = model->B3SOIFDgamma2; - return(OK); - case B3SOIFD_MOD_VBX: - value->rValue = model->B3SOIFDvbx; - return(OK); - case B3SOIFD_MOD_VBM: - value->rValue = model->B3SOIFDvbm; - return(OK); - case B3SOIFD_MOD_XT: - value->rValue = model->B3SOIFDxt; - return(OK); - case B3SOIFD_MOD_K1: - value->rValue = model->B3SOIFDk1; - return(OK); - case B3SOIFD_MOD_KT1: - value->rValue = model->B3SOIFDkt1; - return(OK); - case B3SOIFD_MOD_KT1L: - value->rValue = model->B3SOIFDkt1l; - return(OK); - case B3SOIFD_MOD_KT2 : - value->rValue = model->B3SOIFDkt2; - return(OK); - case B3SOIFD_MOD_K2 : - value->rValue = model->B3SOIFDk2; - return(OK); - case B3SOIFD_MOD_K3: - value->rValue = model->B3SOIFDk3; - return(OK); - case B3SOIFD_MOD_K3B: - value->rValue = model->B3SOIFDk3b; - return(OK); - case B3SOIFD_MOD_W0: - value->rValue = model->B3SOIFDw0; - return(OK); - case B3SOIFD_MOD_NLX: - value->rValue = model->B3SOIFDnlx; - return(OK); - case B3SOIFD_MOD_DVT0 : - value->rValue = model->B3SOIFDdvt0; - return(OK); - case B3SOIFD_MOD_DVT1 : - value->rValue = model->B3SOIFDdvt1; - return(OK); - case B3SOIFD_MOD_DVT2 : - value->rValue = model->B3SOIFDdvt2; - return(OK); - case B3SOIFD_MOD_DVT0W : - value->rValue = model->B3SOIFDdvt0w; - return(OK); - case B3SOIFD_MOD_DVT1W : - value->rValue = model->B3SOIFDdvt1w; - return(OK); - case B3SOIFD_MOD_DVT2W : - value->rValue = model->B3SOIFDdvt2w; - return(OK); - case B3SOIFD_MOD_DROUT : - value->rValue = model->B3SOIFDdrout; - return(OK); - case B3SOIFD_MOD_DSUB : - value->rValue = model->B3SOIFDdsub; - return(OK); - case B3SOIFD_MOD_VTH0: - value->rValue = model->B3SOIFDvth0; - return(OK); - case B3SOIFD_MOD_UA: - value->rValue = model->B3SOIFDua; - return(OK); - case B3SOIFD_MOD_UA1: - value->rValue = model->B3SOIFDua1; - return(OK); - case B3SOIFD_MOD_UB: - value->rValue = model->B3SOIFDub; - return(OK); - case B3SOIFD_MOD_UB1: - value->rValue = model->B3SOIFDub1; - return(OK); - case B3SOIFD_MOD_UC: - value->rValue = model->B3SOIFDuc; - return(OK); - case B3SOIFD_MOD_UC1: - value->rValue = model->B3SOIFDuc1; - return(OK); - case B3SOIFD_MOD_U0: - value->rValue = model->B3SOIFDu0; - return(OK); - case B3SOIFD_MOD_UTE: - value->rValue = model->B3SOIFDute; - return(OK); - case B3SOIFD_MOD_VOFF: - value->rValue = model->B3SOIFDvoff; - return(OK); - case B3SOIFD_MOD_DELTA: - value->rValue = model->B3SOIFDdelta; - return(OK); - case B3SOIFD_MOD_RDSW: - value->rValue = model->B3SOIFDrdsw; - return(OK); - case B3SOIFD_MOD_PRWG: - value->rValue = model->B3SOIFDprwg; - return(OK); - case B3SOIFD_MOD_PRWB: - value->rValue = model->B3SOIFDprwb; - return(OK); - case B3SOIFD_MOD_PRT: - value->rValue = model->B3SOIFDprt; - return(OK); - case B3SOIFD_MOD_ETA0: - value->rValue = model->B3SOIFDeta0; - return(OK); - case B3SOIFD_MOD_ETAB: - value->rValue = model->B3SOIFDetab; - return(OK); - case B3SOIFD_MOD_PCLM: - value->rValue = model->B3SOIFDpclm; - return(OK); - case B3SOIFD_MOD_PDIBL1: - value->rValue = model->B3SOIFDpdibl1; - return(OK); - case B3SOIFD_MOD_PDIBL2: - value->rValue = model->B3SOIFDpdibl2; - return(OK); - case B3SOIFD_MOD_PDIBLB: - value->rValue = model->B3SOIFDpdiblb; - return(OK); - case B3SOIFD_MOD_PVAG: - value->rValue = model->B3SOIFDpvag; - return(OK); - case B3SOIFD_MOD_WR: - value->rValue = model->B3SOIFDwr; - return(OK); - case B3SOIFD_MOD_DWG: - value->rValue = model->B3SOIFDdwg; - return(OK); - case B3SOIFD_MOD_DWB: - value->rValue = model->B3SOIFDdwb; - return(OK); - case B3SOIFD_MOD_B0: - value->rValue = model->B3SOIFDb0; - return(OK); - case B3SOIFD_MOD_B1: - value->rValue = model->B3SOIFDb1; - return(OK); - case B3SOIFD_MOD_ALPHA0: - value->rValue = model->B3SOIFDalpha0; - return(OK); - case B3SOIFD_MOD_ALPHA1: - value->rValue = model->B3SOIFDalpha1; - return(OK); - case B3SOIFD_MOD_BETA0: - value->rValue = model->B3SOIFDbeta0; - return(OK); - - case B3SOIFD_MOD_CGSL: - value->rValue = model->B3SOIFDcgsl; - return(OK); - case B3SOIFD_MOD_CGDL: - value->rValue = model->B3SOIFDcgdl; - return(OK); - case B3SOIFD_MOD_CKAPPA: - value->rValue = model->B3SOIFDckappa; - return(OK); - case B3SOIFD_MOD_CF: - value->rValue = model->B3SOIFDcf; - return(OK); - case B3SOIFD_MOD_CLC: - value->rValue = model->B3SOIFDclc; - return(OK); - case B3SOIFD_MOD_CLE: - value->rValue = model->B3SOIFDcle; - return(OK); - case B3SOIFD_MOD_DWC: - value->rValue = model->B3SOIFDdwc; - return(OK); - case B3SOIFD_MOD_DLC: - value->rValue = model->B3SOIFDdlc; - return(OK); - - case B3SOIFD_MOD_TBOX: - value->rValue = model->B3SOIFDtbox; - return(OK); - case B3SOIFD_MOD_TSI: - value->rValue = model->B3SOIFDtsi; - return(OK); - case B3SOIFD_MOD_KB1: - value->rValue = model->B3SOIFDkb1; - return(OK); - case B3SOIFD_MOD_KB3: - value->rValue = model->B3SOIFDkb3; - return(OK); - case B3SOIFD_MOD_DVBD0: - value->rValue = model->B3SOIFDdvbd0; - return(OK); - case B3SOIFD_MOD_DVBD1: - value->rValue = model->B3SOIFDdvbd1; - return(OK); - case B3SOIFD_MOD_DELP: - value->rValue = model->B3SOIFDdelp; - return(OK); - case B3SOIFD_MOD_VBSA: - value->rValue = model->B3SOIFDvbsa; - return(OK); - case B3SOIFD_MOD_RBODY: - value->rValue = model->B3SOIFDrbody; - return(OK); - case B3SOIFD_MOD_RBSH: - value->rValue = model->B3SOIFDrbsh; - return(OK); - case B3SOIFD_MOD_ADICE0: - value->rValue = model->B3SOIFDadice0; - return(OK); - case B3SOIFD_MOD_ABP: - value->rValue = model->B3SOIFDabp; - return(OK); - case B3SOIFD_MOD_MXC: - value->rValue = model->B3SOIFDmxc; - return(OK); - case B3SOIFD_MOD_RTH0: - value->rValue = model->B3SOIFDrth0; - return(OK); - case B3SOIFD_MOD_CTH0: - value->rValue = model->B3SOIFDcth0; - return(OK); - case B3SOIFD_MOD_AII: - value->rValue = model->B3SOIFDaii; - return(OK); - case B3SOIFD_MOD_BII: - value->rValue = model->B3SOIFDbii; - return(OK); - case B3SOIFD_MOD_CII: - value->rValue = model->B3SOIFDcii; - return(OK); - case B3SOIFD_MOD_DII: - value->rValue = model->B3SOIFDdii; - return(OK); - case B3SOIFD_MOD_NDIODE: - value->rValue = model->B3SOIFDndiode; - return(OK); - case B3SOIFD_MOD_NTUN: - value->rValue = model->B3SOIFDntun; - return(OK); - case B3SOIFD_MOD_ISBJT: - value->rValue = model->B3SOIFDisbjt; - return(OK); - case B3SOIFD_MOD_ISDIF: - value->rValue = model->B3SOIFDisdif; - return(OK); - case B3SOIFD_MOD_ISREC: - value->rValue = model->B3SOIFDisrec; - return(OK); - case B3SOIFD_MOD_ISTUN: - value->rValue = model->B3SOIFDistun; - return(OK); - case B3SOIFD_MOD_XBJT: - value->rValue = model->B3SOIFDxbjt; - return(OK); - case B3SOIFD_MOD_XREC: - value->rValue = model->B3SOIFDxrec; - return(OK); - case B3SOIFD_MOD_XTUN: - value->rValue = model->B3SOIFDxtun; - return(OK); - case B3SOIFD_MOD_EDL: - value->rValue = model->B3SOIFDedl; - return(OK); - case B3SOIFD_MOD_KBJT1: - value->rValue = model->B3SOIFDkbjt1; - return(OK); - case B3SOIFD_MOD_TT: - value->rValue = model->B3SOIFDtt; - return(OK); - case B3SOIFD_MOD_VSDTH: - value->rValue = model->B3SOIFDvsdth; - return(OK); - case B3SOIFD_MOD_VSDFB: - value->rValue = model->B3SOIFDvsdfb; - return(OK); - case B3SOIFD_MOD_CSDMIN: - value->rValue = model->B3SOIFDcsdmin; - return(OK); - case B3SOIFD_MOD_ASD: - value->rValue = model->B3SOIFDasd; - return(OK); - - case B3SOIFD_MOD_TNOM : - value->rValue = model->B3SOIFDtnom; - return(OK); - case B3SOIFD_MOD_CGSO: - value->rValue = model->B3SOIFDcgso; - return(OK); - case B3SOIFD_MOD_CGDO: - value->rValue = model->B3SOIFDcgdo; - return(OK); - case B3SOIFD_MOD_CGEO: - value->rValue = model->B3SOIFDcgeo; - return(OK); - case B3SOIFD_MOD_XPART: - value->rValue = model->B3SOIFDxpart; - return(OK); - case B3SOIFD_MOD_RSH: - value->rValue = model->B3SOIFDsheetResistance; - return(OK); - case B3SOIFD_MOD_PBSWG: - value->rValue = model->B3SOIFDGatesidewallJctPotential; - return(OK); - case B3SOIFD_MOD_MJSWG: - value->rValue = model->B3SOIFDbodyJctGateSideGradingCoeff; - return(OK); - case B3SOIFD_MOD_CJSWG: - value->rValue = model->B3SOIFDunitLengthGateSidewallJctCap; - return(OK); - case B3SOIFD_MOD_CSDESW: - value->rValue = model->B3SOIFDcsdesw; - return(OK); - case B3SOIFD_MOD_LINT: - value->rValue = model->B3SOIFDLint; - return(OK); - case B3SOIFD_MOD_LL: - value->rValue = model->B3SOIFDLl; - return(OK); - case B3SOIFD_MOD_LLN: - value->rValue = model->B3SOIFDLln; - return(OK); - case B3SOIFD_MOD_LW: - value->rValue = model->B3SOIFDLw; - return(OK); - case B3SOIFD_MOD_LWN: - value->rValue = model->B3SOIFDLwn; - return(OK); - case B3SOIFD_MOD_LWL: - value->rValue = model->B3SOIFDLwl; - return(OK); - case B3SOIFD_MOD_WINT: - value->rValue = model->B3SOIFDWint; - return(OK); - case B3SOIFD_MOD_WL: - value->rValue = model->B3SOIFDWl; - return(OK); - case B3SOIFD_MOD_WLN: - value->rValue = model->B3SOIFDWln; - return(OK); - case B3SOIFD_MOD_WW: - value->rValue = model->B3SOIFDWw; - return(OK); - case B3SOIFD_MOD_WWN: - value->rValue = model->B3SOIFDWwn; - return(OK); - case B3SOIFD_MOD_WWL: - value->rValue = model->B3SOIFDWwl; - return(OK); - case B3SOIFD_MOD_NOIA: - value->rValue = model->B3SOIFDoxideTrapDensityA; - return(OK); - case B3SOIFD_MOD_NOIB: - value->rValue = model->B3SOIFDoxideTrapDensityB; - return(OK); - case B3SOIFD_MOD_NOIC: - value->rValue = model->B3SOIFDoxideTrapDensityC; - return(OK); - case B3SOIFD_MOD_NOIF: - value->rValue = model->B3SOIFDnoif; - return(OK); - case B3SOIFD_MOD_EM: - value->rValue = model->B3SOIFDem; - return(OK); - case B3SOIFD_MOD_EF: - value->rValue = model->B3SOIFDef; - return(OK); - case B3SOIFD_MOD_AF: - value->rValue = model->B3SOIFDaf; - return(OK); - case B3SOIFD_MOD_KF: - value->rValue = model->B3SOIFDkf; - return(OK); - -/* Added for binning - START */ - /* Length Dependence */ - case B3SOIFD_MOD_LNPEAK: - value->rValue = model->B3SOIFDlnpeak; - return(OK); - case B3SOIFD_MOD_LNSUB: - value->rValue = model->B3SOIFDlnsub; - return(OK); - case B3SOIFD_MOD_LNGATE: - value->rValue = model->B3SOIFDlngate; - return(OK); - case B3SOIFD_MOD_LVTH0: - value->rValue = model->B3SOIFDlvth0; - return(OK); - case B3SOIFD_MOD_LK1: - value->rValue = model->B3SOIFDlk1; - return(OK); - case B3SOIFD_MOD_LK2: - value->rValue = model->B3SOIFDlk2; - return(OK); - case B3SOIFD_MOD_LK3: - value->rValue = model->B3SOIFDlk3; - return(OK); - case B3SOIFD_MOD_LK3B: - value->rValue = model->B3SOIFDlk3b; - return(OK); - case B3SOIFD_MOD_LVBSA: - value->rValue = model->B3SOIFDlvbsa; - return(OK); - case B3SOIFD_MOD_LDELP: - value->rValue = model->B3SOIFDldelp; - return(OK); - case B3SOIFD_MOD_LKB1: - value->rValue = model->B3SOIFDlkb1; - return(OK); - case B3SOIFD_MOD_LKB3: - value->rValue = model->B3SOIFDlkb3; - return(OK); - case B3SOIFD_MOD_LDVBD0: - value->rValue = model->B3SOIFDdvbd0; - return(OK); - case B3SOIFD_MOD_LDVBD1: - value->rValue = model->B3SOIFDdvbd1; - return(OK); - case B3SOIFD_MOD_LW0: - value->rValue = model->B3SOIFDlw0; - return(OK); - case B3SOIFD_MOD_LNLX: - value->rValue = model->B3SOIFDlnlx; - return(OK); - case B3SOIFD_MOD_LDVT0 : - value->rValue = model->B3SOIFDldvt0; - return(OK); - case B3SOIFD_MOD_LDVT1 : - value->rValue = model->B3SOIFDldvt1; - return(OK); - case B3SOIFD_MOD_LDVT2 : - value->rValue = model->B3SOIFDldvt2; - return(OK); - case B3SOIFD_MOD_LDVT0W : - value->rValue = model->B3SOIFDldvt0w; - return(OK); - case B3SOIFD_MOD_LDVT1W : - value->rValue = model->B3SOIFDldvt1w; - return(OK); - case B3SOIFD_MOD_LDVT2W : - value->rValue = model->B3SOIFDldvt2w; - return(OK); - case B3SOIFD_MOD_LU0: - value->rValue = model->B3SOIFDlu0; - return(OK); - case B3SOIFD_MOD_LUA: - value->rValue = model->B3SOIFDlua; - return(OK); - case B3SOIFD_MOD_LUB: - value->rValue = model->B3SOIFDlub; - return(OK); - case B3SOIFD_MOD_LUC: - value->rValue = model->B3SOIFDluc; - return(OK); - case B3SOIFD_MOD_LVSAT: - value->rValue = model->B3SOIFDlvsat; - return(OK); - case B3SOIFD_MOD_LA0: - value->rValue = model->B3SOIFDla0; - return(OK); - case B3SOIFD_MOD_LAGS: - value->rValue = model->B3SOIFDlags; - return(OK); - case B3SOIFD_MOD_LB0: - value->rValue = model->B3SOIFDlb0; - return(OK); - case B3SOIFD_MOD_LB1: - value->rValue = model->B3SOIFDlb1; - return(OK); - case B3SOIFD_MOD_LKETA: - value->rValue = model->B3SOIFDlketa; - return(OK); - case B3SOIFD_MOD_LABP: - value->rValue = model->B3SOIFDlabp; - return(OK); - case B3SOIFD_MOD_LMXC: - value->rValue = model->B3SOIFDlmxc; - return(OK); - case B3SOIFD_MOD_LADICE0: - value->rValue = model->B3SOIFDladice0; - return(OK); - case B3SOIFD_MOD_LA1: - value->rValue = model->B3SOIFDla1; - return(OK); - case B3SOIFD_MOD_LA2: - value->rValue = model->B3SOIFDla2; - return(OK); - case B3SOIFD_MOD_LRDSW: - value->rValue = model->B3SOIFDlrdsw; - return(OK); - case B3SOIFD_MOD_LPRWB: - value->rValue = model->B3SOIFDlprwb; - return(OK); - case B3SOIFD_MOD_LPRWG: - value->rValue = model->B3SOIFDlprwg; - return(OK); - case B3SOIFD_MOD_LWR: - value->rValue = model->B3SOIFDlwr; - return(OK); - case B3SOIFD_MOD_LNFACTOR : - value->rValue = model->B3SOIFDlnfactor; - return(OK); - case B3SOIFD_MOD_LDWG: - value->rValue = model->B3SOIFDldwg; - return(OK); - case B3SOIFD_MOD_LDWB: - value->rValue = model->B3SOIFDldwb; - return(OK); - case B3SOIFD_MOD_LVOFF: - value->rValue = model->B3SOIFDlvoff; - return(OK); - case B3SOIFD_MOD_LETA0: - value->rValue = model->B3SOIFDleta0; - return(OK); - case B3SOIFD_MOD_LETAB: - value->rValue = model->B3SOIFDletab; - return(OK); - case B3SOIFD_MOD_LDSUB : - value->rValue = model->B3SOIFDldsub; - return(OK); - case B3SOIFD_MOD_LCIT : - value->rValue = model->B3SOIFDlcit; - return(OK); - case B3SOIFD_MOD_LCDSC : - value->rValue = model->B3SOIFDlcdsc; - return(OK); - case B3SOIFD_MOD_LCDSCB : - value->rValue = model->B3SOIFDlcdscb; - return(OK); - case B3SOIFD_MOD_LCDSCD : - value->rValue = model->B3SOIFDlcdscd; - return(OK); - case B3SOIFD_MOD_LPCLM: - value->rValue = model->B3SOIFDlpclm; - return(OK); - case B3SOIFD_MOD_LPDIBL1: - value->rValue = model->B3SOIFDlpdibl1; - return(OK); - case B3SOIFD_MOD_LPDIBL2: - value->rValue = model->B3SOIFDlpdibl2; - return(OK); - case B3SOIFD_MOD_LPDIBLB: - value->rValue = model->B3SOIFDlpdiblb; - return(OK); - case B3SOIFD_MOD_LDROUT : - value->rValue = model->B3SOIFDldrout; - return(OK); - case B3SOIFD_MOD_LPVAG: - value->rValue = model->B3SOIFDlpvag; - return(OK); - case B3SOIFD_MOD_LDELTA: - value->rValue = model->B3SOIFDldelta; - return(OK); - case B3SOIFD_MOD_LAII: - value->rValue = model->B3SOIFDlaii; - return(OK); - case B3SOIFD_MOD_LBII: - value->rValue = model->B3SOIFDlbii; - return(OK); - case B3SOIFD_MOD_LCII: - value->rValue = model->B3SOIFDlcii; - return(OK); - case B3SOIFD_MOD_LDII: - value->rValue = model->B3SOIFDldii; - return(OK); - case B3SOIFD_MOD_LALPHA0: - value->rValue = model->B3SOIFDlalpha0; - return(OK); - case B3SOIFD_MOD_LALPHA1: - value->rValue = model->B3SOIFDlalpha1; - return(OK); - case B3SOIFD_MOD_LBETA0: - value->rValue = model->B3SOIFDlbeta0; - return(OK); - case B3SOIFD_MOD_LAGIDL: - value->rValue = model->B3SOIFDlagidl; - return(OK); - case B3SOIFD_MOD_LBGIDL: - value->rValue = model->B3SOIFDlbgidl; - return(OK); - case B3SOIFD_MOD_LNGIDL: - value->rValue = model->B3SOIFDlngidl; - return(OK); - case B3SOIFD_MOD_LNTUN: - value->rValue = model->B3SOIFDlntun; - return(OK); - case B3SOIFD_MOD_LNDIODE: - value->rValue = model->B3SOIFDlndiode; - return(OK); - case B3SOIFD_MOD_LISBJT: - value->rValue = model->B3SOIFDlisbjt; - return(OK); - case B3SOIFD_MOD_LISDIF: - value->rValue = model->B3SOIFDlisdif; - return(OK); - case B3SOIFD_MOD_LISREC: - value->rValue = model->B3SOIFDlisrec; - return(OK); - case B3SOIFD_MOD_LISTUN: - value->rValue = model->B3SOIFDlistun; - return(OK); - case B3SOIFD_MOD_LEDL: - value->rValue = model->B3SOIFDledl; - return(OK); - case B3SOIFD_MOD_LKBJT1: - value->rValue = model->B3SOIFDlkbjt1; - return(OK); - /* CV Model */ - case B3SOIFD_MOD_LVSDFB: - value->rValue = model->B3SOIFDlvsdfb; - return(OK); - case B3SOIFD_MOD_LVSDTH: - value->rValue = model->B3SOIFDlvsdth; - return(OK); - /* Width Dependence */ - case B3SOIFD_MOD_WNPEAK: - value->rValue = model->B3SOIFDwnpeak; - return(OK); - case B3SOIFD_MOD_WNSUB: - value->rValue = model->B3SOIFDwnsub; - return(OK); - case B3SOIFD_MOD_WNGATE: - value->rValue = model->B3SOIFDwngate; - return(OK); - case B3SOIFD_MOD_WVTH0: - value->rValue = model->B3SOIFDwvth0; - return(OK); - case B3SOIFD_MOD_WK1: - value->rValue = model->B3SOIFDwk1; - return(OK); - case B3SOIFD_MOD_WK2: - value->rValue = model->B3SOIFDwk2; - return(OK); - case B3SOIFD_MOD_WK3: - value->rValue = model->B3SOIFDwk3; - return(OK); - case B3SOIFD_MOD_WK3B: - value->rValue = model->B3SOIFDwk3b; - return(OK); - case B3SOIFD_MOD_WVBSA: - value->rValue = model->B3SOIFDwvbsa; - return(OK); - case B3SOIFD_MOD_WDELP: - value->rValue = model->B3SOIFDwdelp; - return(OK); - case B3SOIFD_MOD_WKB1: - value->rValue = model->B3SOIFDwkb1; - return(OK); - case B3SOIFD_MOD_WKB3: - value->rValue = model->B3SOIFDwkb3; - return(OK); - case B3SOIFD_MOD_WDVBD0: - value->rValue = model->B3SOIFDdvbd0; - return(OK); - case B3SOIFD_MOD_WDVBD1: - value->rValue = model->B3SOIFDdvbd1; - return(OK); - case B3SOIFD_MOD_WW0: - value->rValue = model->B3SOIFDww0; - return(OK); - case B3SOIFD_MOD_WNLX: - value->rValue = model->B3SOIFDwnlx; - return(OK); - case B3SOIFD_MOD_WDVT0 : - value->rValue = model->B3SOIFDwdvt0; - return(OK); - case B3SOIFD_MOD_WDVT1 : - value->rValue = model->B3SOIFDwdvt1; - return(OK); - case B3SOIFD_MOD_WDVT2 : - value->rValue = model->B3SOIFDwdvt2; - return(OK); - case B3SOIFD_MOD_WDVT0W : - value->rValue = model->B3SOIFDwdvt0w; - return(OK); - case B3SOIFD_MOD_WDVT1W : - value->rValue = model->B3SOIFDwdvt1w; - return(OK); - case B3SOIFD_MOD_WDVT2W : - value->rValue = model->B3SOIFDwdvt2w; - return(OK); - case B3SOIFD_MOD_WU0: - value->rValue = model->B3SOIFDwu0; - return(OK); - case B3SOIFD_MOD_WUA: - value->rValue = model->B3SOIFDwua; - return(OK); - case B3SOIFD_MOD_WUB: - value->rValue = model->B3SOIFDwub; - return(OK); - case B3SOIFD_MOD_WUC: - value->rValue = model->B3SOIFDwuc; - return(OK); - case B3SOIFD_MOD_WVSAT: - value->rValue = model->B3SOIFDwvsat; - return(OK); - case B3SOIFD_MOD_WA0: - value->rValue = model->B3SOIFDwa0; - return(OK); - case B3SOIFD_MOD_WAGS: - value->rValue = model->B3SOIFDwags; - return(OK); - case B3SOIFD_MOD_WB0: - value->rValue = model->B3SOIFDwb0; - return(OK); - case B3SOIFD_MOD_WB1: - value->rValue = model->B3SOIFDwb1; - return(OK); - case B3SOIFD_MOD_WKETA: - value->rValue = model->B3SOIFDwketa; - return(OK); - case B3SOIFD_MOD_WABP: - value->rValue = model->B3SOIFDwabp; - return(OK); - case B3SOIFD_MOD_WMXC: - value->rValue = model->B3SOIFDwmxc; - return(OK); - case B3SOIFD_MOD_WADICE0: - value->rValue = model->B3SOIFDwadice0; - return(OK); - case B3SOIFD_MOD_WA1: - value->rValue = model->B3SOIFDwa1; - return(OK); - case B3SOIFD_MOD_WA2: - value->rValue = model->B3SOIFDwa2; - return(OK); - case B3SOIFD_MOD_WRDSW: - value->rValue = model->B3SOIFDwrdsw; - return(OK); - case B3SOIFD_MOD_WPRWB: - value->rValue = model->B3SOIFDwprwb; - return(OK); - case B3SOIFD_MOD_WPRWG: - value->rValue = model->B3SOIFDwprwg; - return(OK); - case B3SOIFD_MOD_WWR: - value->rValue = model->B3SOIFDwwr; - return(OK); - case B3SOIFD_MOD_WNFACTOR : - value->rValue = model->B3SOIFDwnfactor; - return(OK); - case B3SOIFD_MOD_WDWG: - value->rValue = model->B3SOIFDwdwg; - return(OK); - case B3SOIFD_MOD_WDWB: - value->rValue = model->B3SOIFDwdwb; - return(OK); - case B3SOIFD_MOD_WVOFF: - value->rValue = model->B3SOIFDwvoff; - return(OK); - case B3SOIFD_MOD_WETA0: - value->rValue = model->B3SOIFDweta0; - return(OK); - case B3SOIFD_MOD_WETAB: - value->rValue = model->B3SOIFDwetab; - return(OK); - case B3SOIFD_MOD_WDSUB : - value->rValue = model->B3SOIFDwdsub; - return(OK); - case B3SOIFD_MOD_WCIT : - value->rValue = model->B3SOIFDwcit; - return(OK); - case B3SOIFD_MOD_WCDSC : - value->rValue = model->B3SOIFDwcdsc; - return(OK); - case B3SOIFD_MOD_WCDSCB : - value->rValue = model->B3SOIFDwcdscb; - return(OK); - case B3SOIFD_MOD_WCDSCD : - value->rValue = model->B3SOIFDwcdscd; - return(OK); - case B3SOIFD_MOD_WPCLM: - value->rValue = model->B3SOIFDwpclm; - return(OK); - case B3SOIFD_MOD_WPDIBL1: - value->rValue = model->B3SOIFDwpdibl1; - return(OK); - case B3SOIFD_MOD_WPDIBL2: - value->rValue = model->B3SOIFDwpdibl2; - return(OK); - case B3SOIFD_MOD_WPDIBLB: - value->rValue = model->B3SOIFDwpdiblb; - return(OK); - case B3SOIFD_MOD_WDROUT : - value->rValue = model->B3SOIFDwdrout; - return(OK); - case B3SOIFD_MOD_WPVAG: - value->rValue = model->B3SOIFDwpvag; - return(OK); - case B3SOIFD_MOD_WDELTA: - value->rValue = model->B3SOIFDwdelta; - return(OK); - case B3SOIFD_MOD_WAII: - value->rValue = model->B3SOIFDwaii; - return(OK); - case B3SOIFD_MOD_WBII: - value->rValue = model->B3SOIFDwbii; - return(OK); - case B3SOIFD_MOD_WCII: - value->rValue = model->B3SOIFDwcii; - return(OK); - case B3SOIFD_MOD_WDII: - value->rValue = model->B3SOIFDwdii; - return(OK); - case B3SOIFD_MOD_WALPHA0: - value->rValue = model->B3SOIFDwalpha0; - return(OK); - case B3SOIFD_MOD_WALPHA1: - value->rValue = model->B3SOIFDwalpha1; - return(OK); - case B3SOIFD_MOD_WBETA0: - value->rValue = model->B3SOIFDwbeta0; - return(OK); - case B3SOIFD_MOD_WAGIDL: - value->rValue = model->B3SOIFDwagidl; - return(OK); - case B3SOIFD_MOD_WBGIDL: - value->rValue = model->B3SOIFDwbgidl; - return(OK); - case B3SOIFD_MOD_WNGIDL: - value->rValue = model->B3SOIFDwngidl; - return(OK); - case B3SOIFD_MOD_WNTUN: - value->rValue = model->B3SOIFDwntun; - return(OK); - case B3SOIFD_MOD_WNDIODE: - value->rValue = model->B3SOIFDwndiode; - return(OK); - case B3SOIFD_MOD_WISBJT: - value->rValue = model->B3SOIFDwisbjt; - return(OK); - case B3SOIFD_MOD_WISDIF: - value->rValue = model->B3SOIFDwisdif; - return(OK); - case B3SOIFD_MOD_WISREC: - value->rValue = model->B3SOIFDwisrec; - return(OK); - case B3SOIFD_MOD_WISTUN: - value->rValue = model->B3SOIFDwistun; - return(OK); - case B3SOIFD_MOD_WEDL: - value->rValue = model->B3SOIFDwedl; - return(OK); - case B3SOIFD_MOD_WKBJT1: - value->rValue = model->B3SOIFDwkbjt1; - return(OK); - /* CV Model */ - case B3SOIFD_MOD_WVSDFB: - value->rValue = model->B3SOIFDwvsdfb; - return(OK); - case B3SOIFD_MOD_WVSDTH: - value->rValue = model->B3SOIFDwvsdth; - return(OK); - /* Cross-term Dependence */ - case B3SOIFD_MOD_PNPEAK: - value->rValue = model->B3SOIFDpnpeak; - return(OK); - case B3SOIFD_MOD_PNSUB: - value->rValue = model->B3SOIFDpnsub; - return(OK); - case B3SOIFD_MOD_PNGATE: - value->rValue = model->B3SOIFDpngate; - return(OK); - case B3SOIFD_MOD_PVTH0: - value->rValue = model->B3SOIFDpvth0; - return(OK); - case B3SOIFD_MOD_PK1: - value->rValue = model->B3SOIFDpk1; - return(OK); - case B3SOIFD_MOD_PK2: - value->rValue = model->B3SOIFDpk2; - return(OK); - case B3SOIFD_MOD_PK3: - value->rValue = model->B3SOIFDpk3; - return(OK); - case B3SOIFD_MOD_PK3B: - value->rValue = model->B3SOIFDpk3b; - return(OK); - case B3SOIFD_MOD_PVBSA: - value->rValue = model->B3SOIFDpvbsa; - return(OK); - case B3SOIFD_MOD_PDELP: - value->rValue = model->B3SOIFDpdelp; - return(OK); - case B3SOIFD_MOD_PKB1: - value->rValue = model->B3SOIFDpkb1; - return(OK); - case B3SOIFD_MOD_PKB3: - value->rValue = model->B3SOIFDpkb3; - return(OK); - case B3SOIFD_MOD_PDVBD0: - value->rValue = model->B3SOIFDdvbd0; - return(OK); - case B3SOIFD_MOD_PDVBD1: - value->rValue = model->B3SOIFDdvbd1; - return(OK); - case B3SOIFD_MOD_PW0: - value->rValue = model->B3SOIFDpw0; - return(OK); - case B3SOIFD_MOD_PNLX: - value->rValue = model->B3SOIFDpnlx; - return(OK); - case B3SOIFD_MOD_PDVT0 : - value->rValue = model->B3SOIFDpdvt0; - return(OK); - case B3SOIFD_MOD_PDVT1 : - value->rValue = model->B3SOIFDpdvt1; - return(OK); - case B3SOIFD_MOD_PDVT2 : - value->rValue = model->B3SOIFDpdvt2; - return(OK); - case B3SOIFD_MOD_PDVT0W : - value->rValue = model->B3SOIFDpdvt0w; - return(OK); - case B3SOIFD_MOD_PDVT1W : - value->rValue = model->B3SOIFDpdvt1w; - return(OK); - case B3SOIFD_MOD_PDVT2W : - value->rValue = model->B3SOIFDpdvt2w; - return(OK); - case B3SOIFD_MOD_PU0: - value->rValue = model->B3SOIFDpu0; - return(OK); - case B3SOIFD_MOD_PUA: - value->rValue = model->B3SOIFDpua; - return(OK); - case B3SOIFD_MOD_PUB: - value->rValue = model->B3SOIFDpub; - return(OK); - case B3SOIFD_MOD_PUC: - value->rValue = model->B3SOIFDpuc; - return(OK); - case B3SOIFD_MOD_PVSAT: - value->rValue = model->B3SOIFDpvsat; - return(OK); - case B3SOIFD_MOD_PA0: - value->rValue = model->B3SOIFDpa0; - return(OK); - case B3SOIFD_MOD_PAGS: - value->rValue = model->B3SOIFDpags; - return(OK); - case B3SOIFD_MOD_PB0: - value->rValue = model->B3SOIFDpb0; - return(OK); - case B3SOIFD_MOD_PB1: - value->rValue = model->B3SOIFDpb1; - return(OK); - case B3SOIFD_MOD_PKETA: - value->rValue = model->B3SOIFDpketa; - return(OK); - case B3SOIFD_MOD_PABP: - value->rValue = model->B3SOIFDpabp; - return(OK); - case B3SOIFD_MOD_PMXC: - value->rValue = model->B3SOIFDpmxc; - return(OK); - case B3SOIFD_MOD_PADICE0: - value->rValue = model->B3SOIFDpadice0; - return(OK); - case B3SOIFD_MOD_PA1: - value->rValue = model->B3SOIFDpa1; - return(OK); - case B3SOIFD_MOD_PA2: - value->rValue = model->B3SOIFDpa2; - return(OK); - case B3SOIFD_MOD_PRDSW: - value->rValue = model->B3SOIFDprdsw; - return(OK); - case B3SOIFD_MOD_PPRWB: - value->rValue = model->B3SOIFDpprwb; - return(OK); - case B3SOIFD_MOD_PPRWG: - value->rValue = model->B3SOIFDpprwg; - return(OK); - case B3SOIFD_MOD_PWR: - value->rValue = model->B3SOIFDpwr; - return(OK); - case B3SOIFD_MOD_PNFACTOR : - value->rValue = model->B3SOIFDpnfactor; - return(OK); - case B3SOIFD_MOD_PDWG: - value->rValue = model->B3SOIFDpdwg; - return(OK); - case B3SOIFD_MOD_PDWB: - value->rValue = model->B3SOIFDpdwb; - return(OK); - case B3SOIFD_MOD_PVOFF: - value->rValue = model->B3SOIFDpvoff; - return(OK); - case B3SOIFD_MOD_PETA0: - value->rValue = model->B3SOIFDpeta0; - return(OK); - case B3SOIFD_MOD_PETAB: - value->rValue = model->B3SOIFDpetab; - return(OK); - case B3SOIFD_MOD_PDSUB : - value->rValue = model->B3SOIFDpdsub; - return(OK); - case B3SOIFD_MOD_PCIT : - value->rValue = model->B3SOIFDpcit; - return(OK); - case B3SOIFD_MOD_PCDSC : - value->rValue = model->B3SOIFDpcdsc; - return(OK); - case B3SOIFD_MOD_PCDSCB : - value->rValue = model->B3SOIFDpcdscb; - return(OK); - case B3SOIFD_MOD_PCDSCD : - value->rValue = model->B3SOIFDpcdscd; - return(OK); - case B3SOIFD_MOD_PPCLM: - value->rValue = model->B3SOIFDppclm; - return(OK); - case B3SOIFD_MOD_PPDIBL1: - value->rValue = model->B3SOIFDppdibl1; - return(OK); - case B3SOIFD_MOD_PPDIBL2: - value->rValue = model->B3SOIFDppdibl2; - return(OK); - case B3SOIFD_MOD_PPDIBLB: - value->rValue = model->B3SOIFDppdiblb; - return(OK); - case B3SOIFD_MOD_PDROUT : - value->rValue = model->B3SOIFDpdrout; - return(OK); - case B3SOIFD_MOD_PPVAG: - value->rValue = model->B3SOIFDppvag; - return(OK); - case B3SOIFD_MOD_PDELTA: - value->rValue = model->B3SOIFDpdelta; - return(OK); - case B3SOIFD_MOD_PAII: - value->rValue = model->B3SOIFDpaii; - return(OK); - case B3SOIFD_MOD_PBII: - value->rValue = model->B3SOIFDpbii; - return(OK); - case B3SOIFD_MOD_PCII: - value->rValue = model->B3SOIFDpcii; - return(OK); - case B3SOIFD_MOD_PDII: - value->rValue = model->B3SOIFDpdii; - return(OK); - case B3SOIFD_MOD_PALPHA0: - value->rValue = model->B3SOIFDpalpha0; - return(OK); - case B3SOIFD_MOD_PALPHA1: - value->rValue = model->B3SOIFDpalpha1; - return(OK); - case B3SOIFD_MOD_PBETA0: - value->rValue = model->B3SOIFDpbeta0; - return(OK); - case B3SOIFD_MOD_PAGIDL: - value->rValue = model->B3SOIFDpagidl; - return(OK); - case B3SOIFD_MOD_PBGIDL: - value->rValue = model->B3SOIFDpbgidl; - return(OK); - case B3SOIFD_MOD_PNGIDL: - value->rValue = model->B3SOIFDpngidl; - return(OK); - case B3SOIFD_MOD_PNTUN: - value->rValue = model->B3SOIFDpntun; - return(OK); - case B3SOIFD_MOD_PNDIODE: - value->rValue = model->B3SOIFDpndiode; - return(OK); - case B3SOIFD_MOD_PISBJT: - value->rValue = model->B3SOIFDpisbjt; - return(OK); - case B3SOIFD_MOD_PISDIF: - value->rValue = model->B3SOIFDpisdif; - return(OK); - case B3SOIFD_MOD_PISREC: - value->rValue = model->B3SOIFDpisrec; - return(OK); - case B3SOIFD_MOD_PISTUN: - value->rValue = model->B3SOIFDpistun; - return(OK); - case B3SOIFD_MOD_PEDL: - value->rValue = model->B3SOIFDpedl; - return(OK); - case B3SOIFD_MOD_PKBJT1: - value->rValue = model->B3SOIFDpkbjt1; - return(OK); - /* CV Model */ - case B3SOIFD_MOD_PVSDFB: - value->rValue = model->B3SOIFDpvsdfb; - return(OK); - case B3SOIFD_MOD_PVSDTH: - value->rValue = model->B3SOIFDpvsdth; - return(OK); -/* Added for binning - END */ - - default: - return(E_BADPARM); - } - /* NOTREACHED */ -} - - - diff --git a/src/spicelib/devices/bsim3soi_fd/b3soifdmpar.c b/src/spicelib/devices/bsim3soi_fd/b3soifdmpar.c deleted file mode 100644 index 69a33ea8b..000000000 --- a/src/spicelib/devices/bsim3soi_fd/b3soifdmpar.c +++ /dev/null @@ -1,1626 +0,0 @@ -/********** -Copyright 1999 Regents of the University of California. All rights reserved. -Author: Weidong Liu and Pin Su Feb 1999 -Author: 1998 Samuel Fung, Dennis Sinitsky and Stephen Tang -File: b3soifdmpar.c 98/5/01 -Modified by Wei Jin 99/9/27 -Modified by Paolo Nenzi 2002 -**********/ - -/* - * Revision 2.1 99/9/27 Pin Su - * BSIMFD2.1 release - */ - -#include "ngspice/ngspice.h" -#include "b3soifddef.h" -#include "ngspice/ifsim.h" -#include "ngspice/sperror.h" -#include "ngspice/suffix.h" - - -int -B3SOIFDmParam(int param, IFvalue *value, GENmodel *inMod) -{ - B3SOIFDmodel *mod = (B3SOIFDmodel*)inMod; - switch(param) - { - - case B3SOIFD_MOD_MOBMOD : - mod->B3SOIFDmobMod = value->iValue; - mod->B3SOIFDmobModGiven = TRUE; - break; - case B3SOIFD_MOD_BINUNIT : - mod->B3SOIFDbinUnit = value->iValue; - mod->B3SOIFDbinUnitGiven = TRUE; - break; - case B3SOIFD_MOD_PARAMCHK : - mod->B3SOIFDparamChk = value->iValue; - mod->B3SOIFDparamChkGiven = TRUE; - break; - case B3SOIFD_MOD_CAPMOD : - mod->B3SOIFDcapMod = value->iValue; - mod->B3SOIFDcapModGiven = TRUE; - break; - case B3SOIFD_MOD_SHMOD : - mod->B3SOIFDshMod = value->iValue; - mod->B3SOIFDshModGiven = TRUE; - break; - case B3SOIFD_MOD_NOIMOD : - mod->B3SOIFDnoiMod = value->iValue; - mod->B3SOIFDnoiModGiven = TRUE; - break; - case B3SOIFD_MOD_VERSION : - mod->B3SOIFDversion = value->rValue; - mod->B3SOIFDversionGiven = TRUE; - break; - case B3SOIFD_MOD_TOX : - mod->B3SOIFDtox = value->rValue; - mod->B3SOIFDtoxGiven = TRUE; - break; - - case B3SOIFD_MOD_CDSC : - mod->B3SOIFDcdsc = value->rValue; - mod->B3SOIFDcdscGiven = TRUE; - break; - case B3SOIFD_MOD_CDSCB : - mod->B3SOIFDcdscb = value->rValue; - mod->B3SOIFDcdscbGiven = TRUE; - break; - - case B3SOIFD_MOD_CDSCD : - mod->B3SOIFDcdscd = value->rValue; - mod->B3SOIFDcdscdGiven = TRUE; - break; - - case B3SOIFD_MOD_CIT : - mod->B3SOIFDcit = value->rValue; - mod->B3SOIFDcitGiven = TRUE; - break; - case B3SOIFD_MOD_NFACTOR : - mod->B3SOIFDnfactor = value->rValue; - mod->B3SOIFDnfactorGiven = TRUE; - break; - case B3SOIFD_MOD_VSAT: - mod->B3SOIFDvsat = value->rValue; - mod->B3SOIFDvsatGiven = TRUE; - break; - case B3SOIFD_MOD_A0: - mod->B3SOIFDa0 = value->rValue; - mod->B3SOIFDa0Given = TRUE; - break; - - case B3SOIFD_MOD_AGS: - mod->B3SOIFDags= value->rValue; - mod->B3SOIFDagsGiven = TRUE; - break; - - case B3SOIFD_MOD_A1: - mod->B3SOIFDa1 = value->rValue; - mod->B3SOIFDa1Given = TRUE; - break; - case B3SOIFD_MOD_A2: - mod->B3SOIFDa2 = value->rValue; - mod->B3SOIFDa2Given = TRUE; - break; - case B3SOIFD_MOD_AT: - mod->B3SOIFDat = value->rValue; - mod->B3SOIFDatGiven = TRUE; - break; - case B3SOIFD_MOD_KETA: - mod->B3SOIFDketa = value->rValue; - mod->B3SOIFDketaGiven = TRUE; - break; - case B3SOIFD_MOD_NSUB: - mod->B3SOIFDnsub = value->rValue; - mod->B3SOIFDnsubGiven = TRUE; - break; - case B3SOIFD_MOD_NPEAK: - mod->B3SOIFDnpeak = value->rValue; - mod->B3SOIFDnpeakGiven = TRUE; - if (mod->B3SOIFDnpeak > 1.0e20) - mod->B3SOIFDnpeak *= 1.0e-6; - break; - case B3SOIFD_MOD_NGATE: - mod->B3SOIFDngate = value->rValue; - mod->B3SOIFDngateGiven = TRUE; - if (mod->B3SOIFDngate > 1.0e23) - mod->B3SOIFDngate *= 1.0e-6; - break; - case B3SOIFD_MOD_GAMMA1: - mod->B3SOIFDgamma1 = value->rValue; - mod->B3SOIFDgamma1Given = TRUE; - break; - case B3SOIFD_MOD_GAMMA2: - mod->B3SOIFDgamma2 = value->rValue; - mod->B3SOIFDgamma2Given = TRUE; - break; - case B3SOIFD_MOD_VBX: - mod->B3SOIFDvbx = value->rValue; - mod->B3SOIFDvbxGiven = TRUE; - break; - case B3SOIFD_MOD_VBM: - mod->B3SOIFDvbm = value->rValue; - mod->B3SOIFDvbmGiven = TRUE; - break; - case B3SOIFD_MOD_XT: - mod->B3SOIFDxt = value->rValue; - mod->B3SOIFDxtGiven = TRUE; - break; - case B3SOIFD_MOD_K1: - mod->B3SOIFDk1 = value->rValue; - mod->B3SOIFDk1Given = TRUE; - break; - case B3SOIFD_MOD_KT1: - mod->B3SOIFDkt1 = value->rValue; - mod->B3SOIFDkt1Given = TRUE; - break; - case B3SOIFD_MOD_KT1L: - mod->B3SOIFDkt1l = value->rValue; - mod->B3SOIFDkt1lGiven = TRUE; - break; - case B3SOIFD_MOD_KT2: - mod->B3SOIFDkt2 = value->rValue; - mod->B3SOIFDkt2Given = TRUE; - break; - case B3SOIFD_MOD_K2: - mod->B3SOIFDk2 = value->rValue; - mod->B3SOIFDk2Given = TRUE; - break; - case B3SOIFD_MOD_K3: - mod->B3SOIFDk3 = value->rValue; - mod->B3SOIFDk3Given = TRUE; - break; - case B3SOIFD_MOD_K3B: - mod->B3SOIFDk3b = value->rValue; - mod->B3SOIFDk3bGiven = TRUE; - break; - case B3SOIFD_MOD_NLX: - mod->B3SOIFDnlx = value->rValue; - mod->B3SOIFDnlxGiven = TRUE; - break; - case B3SOIFD_MOD_W0: - mod->B3SOIFDw0 = value->rValue; - mod->B3SOIFDw0Given = TRUE; - break; - case B3SOIFD_MOD_DVT0: - mod->B3SOIFDdvt0 = value->rValue; - mod->B3SOIFDdvt0Given = TRUE; - break; - case B3SOIFD_MOD_DVT1: - mod->B3SOIFDdvt1 = value->rValue; - mod->B3SOIFDdvt1Given = TRUE; - break; - case B3SOIFD_MOD_DVT2: - mod->B3SOIFDdvt2 = value->rValue; - mod->B3SOIFDdvt2Given = TRUE; - break; - case B3SOIFD_MOD_DVT0W: - mod->B3SOIFDdvt0w = value->rValue; - mod->B3SOIFDdvt0wGiven = TRUE; - break; - case B3SOIFD_MOD_DVT1W: - mod->B3SOIFDdvt1w = value->rValue; - mod->B3SOIFDdvt1wGiven = TRUE; - break; - case B3SOIFD_MOD_DVT2W: - mod->B3SOIFDdvt2w = value->rValue; - mod->B3SOIFDdvt2wGiven = TRUE; - break; - case B3SOIFD_MOD_DROUT: - mod->B3SOIFDdrout = value->rValue; - mod->B3SOIFDdroutGiven = TRUE; - break; - case B3SOIFD_MOD_DSUB: - mod->B3SOIFDdsub = value->rValue; - mod->B3SOIFDdsubGiven = TRUE; - break; - case B3SOIFD_MOD_VTH0: - mod->B3SOIFDvth0 = value->rValue; - mod->B3SOIFDvth0Given = TRUE; - break; - case B3SOIFD_MOD_UA: - mod->B3SOIFDua = value->rValue; - mod->B3SOIFDuaGiven = TRUE; - break; - case B3SOIFD_MOD_UA1: - mod->B3SOIFDua1 = value->rValue; - mod->B3SOIFDua1Given = TRUE; - break; - case B3SOIFD_MOD_UB: - mod->B3SOIFDub = value->rValue; - mod->B3SOIFDubGiven = TRUE; - break; - case B3SOIFD_MOD_UB1: - mod->B3SOIFDub1 = value->rValue; - mod->B3SOIFDub1Given = TRUE; - break; - case B3SOIFD_MOD_UC: - mod->B3SOIFDuc = value->rValue; - mod->B3SOIFDucGiven = TRUE; - break; - case B3SOIFD_MOD_UC1: - mod->B3SOIFDuc1 = value->rValue; - mod->B3SOIFDuc1Given = TRUE; - break; - case B3SOIFD_MOD_U0 : - mod->B3SOIFDu0 = value->rValue; - mod->B3SOIFDu0Given = TRUE; - break; - case B3SOIFD_MOD_UTE : - mod->B3SOIFDute = value->rValue; - mod->B3SOIFDuteGiven = TRUE; - break; - case B3SOIFD_MOD_VOFF: - mod->B3SOIFDvoff = value->rValue; - mod->B3SOIFDvoffGiven = TRUE; - break; - case B3SOIFD_MOD_DELTA : - mod->B3SOIFDdelta = value->rValue; - mod->B3SOIFDdeltaGiven = TRUE; - break; - case B3SOIFD_MOD_RDSW: - mod->B3SOIFDrdsw = value->rValue; - mod->B3SOIFDrdswGiven = TRUE; - break; - case B3SOIFD_MOD_PRWG: - mod->B3SOIFDprwg = value->rValue; - mod->B3SOIFDprwgGiven = TRUE; - break; - case B3SOIFD_MOD_PRWB: - mod->B3SOIFDprwb = value->rValue; - mod->B3SOIFDprwbGiven = TRUE; - break; - case B3SOIFD_MOD_PRT: - mod->B3SOIFDprt = value->rValue; - mod->B3SOIFDprtGiven = TRUE; - break; - case B3SOIFD_MOD_ETA0: - mod->B3SOIFDeta0 = value->rValue; - mod->B3SOIFDeta0Given = TRUE; - break; - case B3SOIFD_MOD_ETAB: - mod->B3SOIFDetab = value->rValue; - mod->B3SOIFDetabGiven = TRUE; - break; - case B3SOIFD_MOD_PCLM: - mod->B3SOIFDpclm = value->rValue; - mod->B3SOIFDpclmGiven = TRUE; - break; - case B3SOIFD_MOD_PDIBL1: - mod->B3SOIFDpdibl1 = value->rValue; - mod->B3SOIFDpdibl1Given = TRUE; - break; - case B3SOIFD_MOD_PDIBL2: - mod->B3SOIFDpdibl2 = value->rValue; - mod->B3SOIFDpdibl2Given = TRUE; - break; - case B3SOIFD_MOD_PDIBLB: - mod->B3SOIFDpdiblb = value->rValue; - mod->B3SOIFDpdiblbGiven = TRUE; - break; - case B3SOIFD_MOD_PVAG: - mod->B3SOIFDpvag = value->rValue; - mod->B3SOIFDpvagGiven = TRUE; - break; - case B3SOIFD_MOD_WR : - mod->B3SOIFDwr = value->rValue; - mod->B3SOIFDwrGiven = TRUE; - break; - case B3SOIFD_MOD_DWG : - mod->B3SOIFDdwg = value->rValue; - mod->B3SOIFDdwgGiven = TRUE; - break; - case B3SOIFD_MOD_DWB : - mod->B3SOIFDdwb = value->rValue; - mod->B3SOIFDdwbGiven = TRUE; - break; - case B3SOIFD_MOD_B0 : - mod->B3SOIFDb0 = value->rValue; - mod->B3SOIFDb0Given = TRUE; - break; - case B3SOIFD_MOD_B1 : - mod->B3SOIFDb1 = value->rValue; - mod->B3SOIFDb1Given = TRUE; - break; - case B3SOIFD_MOD_ALPHA0 : - mod->B3SOIFDalpha0 = value->rValue; - mod->B3SOIFDalpha0Given = TRUE; - break; - case B3SOIFD_MOD_ALPHA1 : - mod->B3SOIFDalpha1 = value->rValue; - mod->B3SOIFDalpha1Given = TRUE; - break; - case B3SOIFD_MOD_BETA0 : - mod->B3SOIFDbeta0 = value->rValue; - mod->B3SOIFDbeta0Given = TRUE; - break; - - case B3SOIFD_MOD_CGSL : - mod->B3SOIFDcgsl = value->rValue; - mod->B3SOIFDcgslGiven = TRUE; - break; - case B3SOIFD_MOD_CGDL : - mod->B3SOIFDcgdl = value->rValue; - mod->B3SOIFDcgdlGiven = TRUE; - break; - case B3SOIFD_MOD_CKAPPA : - mod->B3SOIFDckappa = value->rValue; - mod->B3SOIFDckappaGiven = TRUE; - break; - case B3SOIFD_MOD_CF : - mod->B3SOIFDcf = value->rValue; - mod->B3SOIFDcfGiven = TRUE; - break; - case B3SOIFD_MOD_CLC : - mod->B3SOIFDclc = value->rValue; - mod->B3SOIFDclcGiven = TRUE; - break; - case B3SOIFD_MOD_CLE : - mod->B3SOIFDcle = value->rValue; - mod->B3SOIFDcleGiven = TRUE; - break; - case B3SOIFD_MOD_DWC : - mod->B3SOIFDdwc = value->rValue; - mod->B3SOIFDdwcGiven = TRUE; - break; - case B3SOIFD_MOD_DLC : - mod->B3SOIFDdlc = value->rValue; - mod->B3SOIFDdlcGiven = TRUE; - break; - case B3SOIFD_MOD_TBOX : - mod->B3SOIFDtbox = value->rValue; - mod->B3SOIFDtboxGiven = TRUE; - break; - case B3SOIFD_MOD_TSI : - mod->B3SOIFDtsi = value->rValue; - mod->B3SOIFDtsiGiven = TRUE; - break; - case B3SOIFD_MOD_XJ : - mod->B3SOIFDxj = value->rValue; - mod->B3SOIFDxjGiven = TRUE; - break; - case B3SOIFD_MOD_KB1 : - mod->B3SOIFDkb1 = value->rValue; - mod->B3SOIFDkb1Given = TRUE; - break; - case B3SOIFD_MOD_KB3 : - mod->B3SOIFDkb3 = value->rValue; - mod->B3SOIFDkb3Given = TRUE; - break; - case B3SOIFD_MOD_DVBD0 : - mod->B3SOIFDdvbd0 = value->rValue; - mod->B3SOIFDdvbd0Given = TRUE; - break; - case B3SOIFD_MOD_DVBD1 : - mod->B3SOIFDdvbd1 = value->rValue; - mod->B3SOIFDdvbd1Given = TRUE; - break; - case B3SOIFD_MOD_DELP : - mod->B3SOIFDdelp = value->rValue; - mod->B3SOIFDdelpGiven = TRUE; - break; - case B3SOIFD_MOD_VBSA : - mod->B3SOIFDvbsa = value->rValue; - mod->B3SOIFDvbsaGiven = TRUE; - break; - case B3SOIFD_MOD_RBODY : - mod->B3SOIFDrbody = value->rValue; - mod->B3SOIFDrbodyGiven = TRUE; - break; - case B3SOIFD_MOD_RBSH : - mod->B3SOIFDrbsh = value->rValue; - mod->B3SOIFDrbshGiven = TRUE; - break; - case B3SOIFD_MOD_ADICE0 : - mod->B3SOIFDadice0 = value->rValue; - mod->B3SOIFDadice0Given = TRUE; - break; - case B3SOIFD_MOD_ABP : - mod->B3SOIFDabp = value->rValue; - mod->B3SOIFDabpGiven = TRUE; - break; - case B3SOIFD_MOD_MXC : - mod->B3SOIFDmxc = value->rValue; - mod->B3SOIFDmxcGiven = TRUE; - break; - case B3SOIFD_MOD_RTH0 : - mod->B3SOIFDrth0 = value->rValue; - mod->B3SOIFDrth0Given = TRUE; - break; - case B3SOIFD_MOD_CTH0 : - mod->B3SOIFDcth0 = value->rValue; - mod->B3SOIFDcth0Given = TRUE; - break; - case B3SOIFD_MOD_AII : - mod->B3SOIFDaii = value->rValue; - mod->B3SOIFDaiiGiven = TRUE; - break; - case B3SOIFD_MOD_BII : - mod->B3SOIFDbii = value->rValue; - mod->B3SOIFDbiiGiven = TRUE; - break; - case B3SOIFD_MOD_CII : - mod->B3SOIFDcii = value->rValue; - mod->B3SOIFDciiGiven = TRUE; - break; - case B3SOIFD_MOD_DII : - mod->B3SOIFDdii = value->rValue; - mod->B3SOIFDdiiGiven = TRUE; - break; - case B3SOIFD_MOD_NGIDL : - mod->B3SOIFDngidl = value->rValue; - mod->B3SOIFDngidlGiven = TRUE; - break; - case B3SOIFD_MOD_AGIDL : - mod->B3SOIFDagidl = value->rValue; - mod->B3SOIFDagidlGiven = TRUE; - break; - case B3SOIFD_MOD_BGIDL : - mod->B3SOIFDbgidl = value->rValue; - mod->B3SOIFDbgidlGiven = TRUE; - break; - case B3SOIFD_MOD_NDIODE : - mod->B3SOIFDndiode = value->rValue; - mod->B3SOIFDndiodeGiven = TRUE; - break; - case B3SOIFD_MOD_NTUN : - mod->B3SOIFDntun = value->rValue; - mod->B3SOIFDntunGiven = TRUE; - break; - case B3SOIFD_MOD_ISBJT : - mod->B3SOIFDisbjt = value->rValue; - mod->B3SOIFDisbjtGiven = TRUE; - break; - case B3SOIFD_MOD_ISDIF : - mod->B3SOIFDisdif = value->rValue; - mod->B3SOIFDisdifGiven = TRUE; - break; - case B3SOIFD_MOD_ISREC : - mod->B3SOIFDisrec = value->rValue; - mod->B3SOIFDisrecGiven = TRUE; - break; - case B3SOIFD_MOD_ISTUN : - mod->B3SOIFDistun = value->rValue; - mod->B3SOIFDistunGiven = TRUE; - break; - case B3SOIFD_MOD_XBJT : - mod->B3SOIFDxbjt = value->rValue; - mod->B3SOIFDxbjtGiven = TRUE; - break; - case B3SOIFD_MOD_XREC : - mod->B3SOIFDxrec = value->rValue; - mod->B3SOIFDxrecGiven = TRUE; - break; - case B3SOIFD_MOD_XTUN : - mod->B3SOIFDxtun = value->rValue; - mod->B3SOIFDxtunGiven = TRUE; - break; - case B3SOIFD_MOD_EDL : - mod->B3SOIFDedl = value->rValue; - mod->B3SOIFDedlGiven = TRUE; - break; - case B3SOIFD_MOD_KBJT1 : - mod->B3SOIFDkbjt1 = value->rValue; - mod->B3SOIFDkbjt1Given = TRUE; - break; - case B3SOIFD_MOD_TT : - mod->B3SOIFDtt = value->rValue; - mod->B3SOIFDttGiven = TRUE; - break; - case B3SOIFD_MOD_VSDTH : - mod->B3SOIFDvsdth = value->rValue; - mod->B3SOIFDvsdthGiven = TRUE; - break; - case B3SOIFD_MOD_VSDFB : - mod->B3SOIFDvsdfb = value->rValue; - mod->B3SOIFDvsdfbGiven = TRUE; - break; - case B3SOIFD_MOD_CSDMIN : - mod->B3SOIFDcsdmin = value->rValue; - mod->B3SOIFDcsdminGiven = TRUE; - break; - case B3SOIFD_MOD_ASD : - mod->B3SOIFDasd = value->rValue; - mod->B3SOIFDasdGiven = TRUE; - break; - - - case B3SOIFD_MOD_TNOM : - mod->B3SOIFDtnom = value->rValue + 273.15; - mod->B3SOIFDtnomGiven = TRUE; - break; - case B3SOIFD_MOD_CGSO : - mod->B3SOIFDcgso = value->rValue; - mod->B3SOIFDcgsoGiven = TRUE; - break; - case B3SOIFD_MOD_CGDO : - mod->B3SOIFDcgdo = value->rValue; - mod->B3SOIFDcgdoGiven = TRUE; - break; - case B3SOIFD_MOD_CGEO : - mod->B3SOIFDcgeo = value->rValue; - mod->B3SOIFDcgeoGiven = TRUE; - break; - case B3SOIFD_MOD_XPART : - mod->B3SOIFDxpart = value->rValue; - mod->B3SOIFDxpartGiven = TRUE; - break; - case B3SOIFD_MOD_RSH : - mod->B3SOIFDsheetResistance = value->rValue; - mod->B3SOIFDsheetResistanceGiven = TRUE; - break; - case B3SOIFD_MOD_PBSWG : - mod->B3SOIFDGatesidewallJctPotential = value->rValue; - mod->B3SOIFDGatesidewallJctPotentialGiven = TRUE; - break; - case B3SOIFD_MOD_MJSWG : - mod->B3SOIFDbodyJctGateSideGradingCoeff = value->rValue; - mod->B3SOIFDbodyJctGateSideGradingCoeffGiven = TRUE; - break; - case B3SOIFD_MOD_CJSWG : - mod->B3SOIFDunitLengthGateSidewallJctCap = value->rValue; - mod->B3SOIFDunitLengthGateSidewallJctCapGiven = TRUE; - break; - case B3SOIFD_MOD_CSDESW : - mod->B3SOIFDcsdesw = value->rValue; - mod->B3SOIFDcsdeswGiven = TRUE; - break; - case B3SOIFD_MOD_LINT : - mod->B3SOIFDLint = value->rValue; - mod->B3SOIFDLintGiven = TRUE; - break; - case B3SOIFD_MOD_LL : - mod->B3SOIFDLl = value->rValue; - mod->B3SOIFDLlGiven = TRUE; - break; - case B3SOIFD_MOD_LLN : - mod->B3SOIFDLln = value->rValue; - mod->B3SOIFDLlnGiven = TRUE; - break; - case B3SOIFD_MOD_LW : - mod->B3SOIFDLw = value->rValue; - mod->B3SOIFDLwGiven = TRUE; - break; - case B3SOIFD_MOD_LWN : - mod->B3SOIFDLwn = value->rValue; - mod->B3SOIFDLwnGiven = TRUE; - break; - case B3SOIFD_MOD_LWL : - mod->B3SOIFDLwl = value->rValue; - mod->B3SOIFDLwlGiven = TRUE; - break; - case B3SOIFD_MOD_WINT : - mod->B3SOIFDWint = value->rValue; - mod->B3SOIFDWintGiven = TRUE; - break; - case B3SOIFD_MOD_WL : - mod->B3SOIFDWl = value->rValue; - mod->B3SOIFDWlGiven = TRUE; - break; - case B3SOIFD_MOD_WLN : - mod->B3SOIFDWln = value->rValue; - mod->B3SOIFDWlnGiven = TRUE; - break; - case B3SOIFD_MOD_WW : - mod->B3SOIFDWw = value->rValue; - mod->B3SOIFDWwGiven = TRUE; - break; - case B3SOIFD_MOD_WWN : - mod->B3SOIFDWwn = value->rValue; - mod->B3SOIFDWwnGiven = TRUE; - break; - case B3SOIFD_MOD_WWL : - mod->B3SOIFDWwl = value->rValue; - mod->B3SOIFDWwlGiven = TRUE; - break; - - case B3SOIFD_MOD_NOIA : - mod->B3SOIFDoxideTrapDensityA = value->rValue; - mod->B3SOIFDoxideTrapDensityAGiven = TRUE; - break; - case B3SOIFD_MOD_NOIB : - mod->B3SOIFDoxideTrapDensityB = value->rValue; - mod->B3SOIFDoxideTrapDensityBGiven = TRUE; - break; - case B3SOIFD_MOD_NOIC : - mod->B3SOIFDoxideTrapDensityC = value->rValue; - mod->B3SOIFDoxideTrapDensityCGiven = TRUE; - break; - case B3SOIFD_MOD_NOIF : - mod->B3SOIFDnoif = value->rValue; - mod->B3SOIFDnoifGiven = TRUE; - break; - case B3SOIFD_MOD_EM : - mod->B3SOIFDem = value->rValue; - mod->B3SOIFDemGiven = TRUE; - break; - case B3SOIFD_MOD_EF : - mod->B3SOIFDef = value->rValue; - mod->B3SOIFDefGiven = TRUE; - break; - case B3SOIFD_MOD_AF : - mod->B3SOIFDaf = value->rValue; - mod->B3SOIFDafGiven = TRUE; - break; - case B3SOIFD_MOD_KF : - mod->B3SOIFDkf = value->rValue; - mod->B3SOIFDkfGiven = TRUE; - break; - -/* Added for binning - START */ - /* Length Dependence */ - case B3SOIFD_MOD_LNPEAK: - mod->B3SOIFDlnpeak = value->rValue; - mod->B3SOIFDlnpeakGiven = TRUE; - break; - case B3SOIFD_MOD_LNSUB: - mod->B3SOIFDlnsub = value->rValue; - mod->B3SOIFDlnsubGiven = TRUE; - break; - case B3SOIFD_MOD_LNGATE: - mod->B3SOIFDlngate = value->rValue; - mod->B3SOIFDlngateGiven = TRUE; - break; - case B3SOIFD_MOD_LVTH0: - mod->B3SOIFDlvth0 = value->rValue; - mod->B3SOIFDlvth0Given = TRUE; - break; - case B3SOIFD_MOD_LK1: - mod->B3SOIFDlk1 = value->rValue; - mod->B3SOIFDlk1Given = TRUE; - break; - case B3SOIFD_MOD_LK2: - mod->B3SOIFDlk2 = value->rValue; - mod->B3SOIFDlk2Given = TRUE; - break; - case B3SOIFD_MOD_LK3: - mod->B3SOIFDlk3 = value->rValue; - mod->B3SOIFDlk3Given = TRUE; - break; - case B3SOIFD_MOD_LK3B: - mod->B3SOIFDlk3b = value->rValue; - mod->B3SOIFDlk3bGiven = TRUE; - break; - case B3SOIFD_MOD_LVBSA: - mod->B3SOIFDlvbsa = value->rValue; - mod->B3SOIFDlvbsaGiven = TRUE; - break; - case B3SOIFD_MOD_LDELP: - mod->B3SOIFDldelp = value->rValue; - mod->B3SOIFDldelpGiven = TRUE; - break; - case B3SOIFD_MOD_LKB1 : - mod->B3SOIFDlkb1 = value->rValue; - mod->B3SOIFDlkb1Given = TRUE; - break; - case B3SOIFD_MOD_LKB3 : - mod->B3SOIFDlkb3 = value->rValue; - mod->B3SOIFDlkb3Given = TRUE; - break; - case B3SOIFD_MOD_LDVBD0 : - mod->B3SOIFDldvbd0 = value->rValue; - mod->B3SOIFDldvbd0Given = TRUE; - break; - case B3SOIFD_MOD_LDVBD1 : - mod->B3SOIFDldvbd1 = value->rValue; - mod->B3SOIFDldvbd1Given = TRUE; - break; - case B3SOIFD_MOD_LW0: - mod->B3SOIFDlw0 = value->rValue; - mod->B3SOIFDlw0Given = TRUE; - break; - case B3SOIFD_MOD_LNLX: - mod->B3SOIFDlnlx = value->rValue; - mod->B3SOIFDlnlxGiven = TRUE; - break; - case B3SOIFD_MOD_LDVT0: - mod->B3SOIFDldvt0 = value->rValue; - mod->B3SOIFDldvt0Given = TRUE; - break; - case B3SOIFD_MOD_LDVT1: - mod->B3SOIFDldvt1 = value->rValue; - mod->B3SOIFDldvt1Given = TRUE; - break; - case B3SOIFD_MOD_LDVT2: - mod->B3SOIFDldvt2 = value->rValue; - mod->B3SOIFDldvt2Given = TRUE; - break; - case B3SOIFD_MOD_LDVT0W: - mod->B3SOIFDldvt0w = value->rValue; - mod->B3SOIFDldvt0wGiven = TRUE; - break; - case B3SOIFD_MOD_LDVT1W: - mod->B3SOIFDldvt1w = value->rValue; - mod->B3SOIFDldvt1wGiven = TRUE; - break; - case B3SOIFD_MOD_LDVT2W: - mod->B3SOIFDldvt2w = value->rValue; - mod->B3SOIFDldvt2wGiven = TRUE; - break; - case B3SOIFD_MOD_LU0 : - mod->B3SOIFDlu0 = value->rValue; - mod->B3SOIFDlu0Given = TRUE; - break; - case B3SOIFD_MOD_LUA: - mod->B3SOIFDlua = value->rValue; - mod->B3SOIFDluaGiven = TRUE; - break; - case B3SOIFD_MOD_LUB: - mod->B3SOIFDlub = value->rValue; - mod->B3SOIFDlubGiven = TRUE; - break; - case B3SOIFD_MOD_LUC: - mod->B3SOIFDluc = value->rValue; - mod->B3SOIFDlucGiven = TRUE; - break; - case B3SOIFD_MOD_LVSAT: - mod->B3SOIFDlvsat = value->rValue; - mod->B3SOIFDlvsatGiven = TRUE; - break; - case B3SOIFD_MOD_LA0: - mod->B3SOIFDla0 = value->rValue; - mod->B3SOIFDla0Given = TRUE; - break; - case B3SOIFD_MOD_LAGS: - mod->B3SOIFDlags= value->rValue; - mod->B3SOIFDlagsGiven = TRUE; - break; - case B3SOIFD_MOD_LB0 : - mod->B3SOIFDlb0 = value->rValue; - mod->B3SOIFDlb0Given = TRUE; - break; - case B3SOIFD_MOD_LB1 : - mod->B3SOIFDlb1 = value->rValue; - mod->B3SOIFDlb1Given = TRUE; - break; - case B3SOIFD_MOD_LKETA: - mod->B3SOIFDlketa = value->rValue; - mod->B3SOIFDlketaGiven = TRUE; - break; - case B3SOIFD_MOD_LABP: - mod->B3SOIFDlabp = value->rValue; - mod->B3SOIFDlabpGiven = TRUE; - break; - case B3SOIFD_MOD_LMXC: - mod->B3SOIFDlmxc = value->rValue; - mod->B3SOIFDlmxcGiven = TRUE; - break; - case B3SOIFD_MOD_LADICE0: - mod->B3SOIFDladice0 = value->rValue; - mod->B3SOIFDladice0Given = TRUE; - break; - case B3SOIFD_MOD_LA1: - mod->B3SOIFDla1 = value->rValue; - mod->B3SOIFDla1Given = TRUE; - break; - case B3SOIFD_MOD_LA2: - mod->B3SOIFDla2 = value->rValue; - mod->B3SOIFDla2Given = TRUE; - break; - case B3SOIFD_MOD_LRDSW: - mod->B3SOIFDlrdsw = value->rValue; - mod->B3SOIFDlrdswGiven = TRUE; - break; - case B3SOIFD_MOD_LPRWB: - mod->B3SOIFDlprwb = value->rValue; - mod->B3SOIFDlprwbGiven = TRUE; - break; - case B3SOIFD_MOD_LPRWG: - mod->B3SOIFDlprwg = value->rValue; - mod->B3SOIFDlprwgGiven = TRUE; - break; - case B3SOIFD_MOD_LWR : - mod->B3SOIFDlwr = value->rValue; - mod->B3SOIFDlwrGiven = TRUE; - break; - case B3SOIFD_MOD_LNFACTOR : - mod->B3SOIFDlnfactor = value->rValue; - mod->B3SOIFDlnfactorGiven = TRUE; - break; - case B3SOIFD_MOD_LDWG : - mod->B3SOIFDldwg = value->rValue; - mod->B3SOIFDldwgGiven = TRUE; - break; - case B3SOIFD_MOD_LDWB : - mod->B3SOIFDldwb = value->rValue; - mod->B3SOIFDldwbGiven = TRUE; - break; - case B3SOIFD_MOD_LVOFF: - mod->B3SOIFDlvoff = value->rValue; - mod->B3SOIFDlvoffGiven = TRUE; - break; - case B3SOIFD_MOD_LETA0: - mod->B3SOIFDleta0 = value->rValue; - mod->B3SOIFDleta0Given = TRUE; - break; - case B3SOIFD_MOD_LETAB: - mod->B3SOIFDletab = value->rValue; - mod->B3SOIFDletabGiven = TRUE; - break; - case B3SOIFD_MOD_LDSUB: - mod->B3SOIFDldsub = value->rValue; - mod->B3SOIFDldsubGiven = TRUE; - break; - case B3SOIFD_MOD_LCIT : - mod->B3SOIFDlcit = value->rValue; - mod->B3SOIFDlcitGiven = TRUE; - break; - case B3SOIFD_MOD_LCDSC : - mod->B3SOIFDlcdsc = value->rValue; - mod->B3SOIFDlcdscGiven = TRUE; - break; - case B3SOIFD_MOD_LCDSCB : - mod->B3SOIFDlcdscb = value->rValue; - mod->B3SOIFDlcdscbGiven = TRUE; - break; - case B3SOIFD_MOD_LCDSCD : - mod->B3SOIFDlcdscd = value->rValue; - mod->B3SOIFDlcdscdGiven = TRUE; - break; - case B3SOIFD_MOD_LPCLM: - mod->B3SOIFDlpclm = value->rValue; - mod->B3SOIFDlpclmGiven = TRUE; - break; - case B3SOIFD_MOD_LPDIBL1: - mod->B3SOIFDlpdibl1 = value->rValue; - mod->B3SOIFDlpdibl1Given = TRUE; - break; - case B3SOIFD_MOD_LPDIBL2: - mod->B3SOIFDlpdibl2 = value->rValue; - mod->B3SOIFDlpdibl2Given = TRUE; - break; - case B3SOIFD_MOD_LPDIBLB: - mod->B3SOIFDlpdiblb = value->rValue; - mod->B3SOIFDlpdiblbGiven = TRUE; - break; - case B3SOIFD_MOD_LDROUT: - mod->B3SOIFDldrout = value->rValue; - mod->B3SOIFDldroutGiven = TRUE; - break; - case B3SOIFD_MOD_LPVAG: - mod->B3SOIFDlpvag = value->rValue; - mod->B3SOIFDlpvagGiven = TRUE; - break; - case B3SOIFD_MOD_LDELTA : - mod->B3SOIFDldelta = value->rValue; - mod->B3SOIFDldeltaGiven = TRUE; - break; - case B3SOIFD_MOD_LAII : - mod->B3SOIFDlaii = value->rValue; - mod->B3SOIFDlaiiGiven = TRUE; - break; - case B3SOIFD_MOD_LBII : - mod->B3SOIFDlbii = value->rValue; - mod->B3SOIFDlbiiGiven = TRUE; - break; - case B3SOIFD_MOD_LCII : - mod->B3SOIFDlcii = value->rValue; - mod->B3SOIFDlciiGiven = TRUE; - break; - case B3SOIFD_MOD_LDII : - mod->B3SOIFDldii = value->rValue; - mod->B3SOIFDldiiGiven = TRUE; - break; - case B3SOIFD_MOD_LALPHA0 : - mod->B3SOIFDlalpha0 = value->rValue; - mod->B3SOIFDlalpha0Given = TRUE; - break; - case B3SOIFD_MOD_LALPHA1 : - mod->B3SOIFDlalpha1 = value->rValue; - mod->B3SOIFDlalpha1Given = TRUE; - break; - case B3SOIFD_MOD_LBETA0 : - mod->B3SOIFDlbeta0 = value->rValue; - mod->B3SOIFDlbeta0Given = TRUE; - break; - case B3SOIFD_MOD_LAGIDL : - mod->B3SOIFDlagidl = value->rValue; - mod->B3SOIFDlagidlGiven = TRUE; - break; - case B3SOIFD_MOD_LBGIDL : - mod->B3SOIFDlbgidl = value->rValue; - mod->B3SOIFDlbgidlGiven = TRUE; - break; - case B3SOIFD_MOD_LNGIDL : - mod->B3SOIFDlngidl = value->rValue; - mod->B3SOIFDlngidlGiven = TRUE; - break; - case B3SOIFD_MOD_LNTUN : - mod->B3SOIFDlntun = value->rValue; - mod->B3SOIFDlntunGiven = TRUE; - break; - case B3SOIFD_MOD_LNDIODE : - mod->B3SOIFDlndiode = value->rValue; - mod->B3SOIFDlndiodeGiven = TRUE; - break; - case B3SOIFD_MOD_LISBJT : - mod->B3SOIFDlisbjt = value->rValue; - mod->B3SOIFDlisbjtGiven = TRUE; - break; - case B3SOIFD_MOD_LISDIF : - mod->B3SOIFDlisdif = value->rValue; - mod->B3SOIFDlisdifGiven = TRUE; - break; - case B3SOIFD_MOD_LISREC : - mod->B3SOIFDlisrec = value->rValue; - mod->B3SOIFDlisrecGiven = TRUE; - break; - case B3SOIFD_MOD_LISTUN : - mod->B3SOIFDlistun = value->rValue; - mod->B3SOIFDlistunGiven = TRUE; - break; - case B3SOIFD_MOD_LEDL : - mod->B3SOIFDledl = value->rValue; - mod->B3SOIFDledlGiven = TRUE; - break; - case B3SOIFD_MOD_LKBJT1 : - mod->B3SOIFDlkbjt1 = value->rValue; - mod->B3SOIFDlkbjt1Given = TRUE; - break; - /* CV Model */ - case B3SOIFD_MOD_LVSDFB : - mod->B3SOIFDlvsdfb = value->rValue; - mod->B3SOIFDlvsdfbGiven = TRUE; - break; - case B3SOIFD_MOD_LVSDTH : - mod->B3SOIFDlvsdth = value->rValue; - mod->B3SOIFDlvsdthGiven = TRUE; - break; - /* Width Dependence */ - case B3SOIFD_MOD_WNPEAK: - mod->B3SOIFDwnpeak = value->rValue; - mod->B3SOIFDwnpeakGiven = TRUE; - break; - case B3SOIFD_MOD_WNSUB: - mod->B3SOIFDwnsub = value->rValue; - mod->B3SOIFDwnsubGiven = TRUE; - break; - case B3SOIFD_MOD_WNGATE: - mod->B3SOIFDwngate = value->rValue; - mod->B3SOIFDwngateGiven = TRUE; - break; - case B3SOIFD_MOD_WVTH0: - mod->B3SOIFDwvth0 = value->rValue; - mod->B3SOIFDwvth0Given = TRUE; - break; - case B3SOIFD_MOD_WK1: - mod->B3SOIFDwk1 = value->rValue; - mod->B3SOIFDwk1Given = TRUE; - break; - case B3SOIFD_MOD_WK2: - mod->B3SOIFDwk2 = value->rValue; - mod->B3SOIFDwk2Given = TRUE; - break; - case B3SOIFD_MOD_WK3: - mod->B3SOIFDwk3 = value->rValue; - mod->B3SOIFDwk3Given = TRUE; - break; - case B3SOIFD_MOD_WK3B: - mod->B3SOIFDwk3b = value->rValue; - mod->B3SOIFDwk3bGiven = TRUE; - break; - case B3SOIFD_MOD_WVBSA: - mod->B3SOIFDwvbsa = value->rValue; - mod->B3SOIFDwvbsaGiven = TRUE; - break; - case B3SOIFD_MOD_WDELP: - mod->B3SOIFDwdelp = value->rValue; - mod->B3SOIFDwdelpGiven = TRUE; - break; - case B3SOIFD_MOD_WKB1 : - mod->B3SOIFDwkb1 = value->rValue; - mod->B3SOIFDwkb1Given = TRUE; - break; - case B3SOIFD_MOD_WKB3 : - mod->B3SOIFDwkb3 = value->rValue; - mod->B3SOIFDwkb3Given = TRUE; - break; - case B3SOIFD_MOD_WDVBD0 : - mod->B3SOIFDwdvbd0 = value->rValue; - mod->B3SOIFDwdvbd0Given = TRUE; - break; - case B3SOIFD_MOD_WDVBD1 : - mod->B3SOIFDwdvbd1 = value->rValue; - mod->B3SOIFDwdvbd1Given = TRUE; - break; - case B3SOIFD_MOD_WW0: - mod->B3SOIFDww0 = value->rValue; - mod->B3SOIFDww0Given = TRUE; - break; - case B3SOIFD_MOD_WNLX: - mod->B3SOIFDwnlx = value->rValue; - mod->B3SOIFDwnlxGiven = TRUE; - break; - case B3SOIFD_MOD_WDVT0: - mod->B3SOIFDwdvt0 = value->rValue; - mod->B3SOIFDwdvt0Given = TRUE; - break; - case B3SOIFD_MOD_WDVT1: - mod->B3SOIFDwdvt1 = value->rValue; - mod->B3SOIFDwdvt1Given = TRUE; - break; - case B3SOIFD_MOD_WDVT2: - mod->B3SOIFDwdvt2 = value->rValue; - mod->B3SOIFDwdvt2Given = TRUE; - break; - case B3SOIFD_MOD_WDVT0W: - mod->B3SOIFDwdvt0w = value->rValue; - mod->B3SOIFDwdvt0wGiven = TRUE; - break; - case B3SOIFD_MOD_WDVT1W: - mod->B3SOIFDwdvt1w = value->rValue; - mod->B3SOIFDwdvt1wGiven = TRUE; - break; - case B3SOIFD_MOD_WDVT2W: - mod->B3SOIFDwdvt2w = value->rValue; - mod->B3SOIFDwdvt2wGiven = TRUE; - break; - case B3SOIFD_MOD_WU0 : - mod->B3SOIFDwu0 = value->rValue; - mod->B3SOIFDwu0Given = TRUE; - break; - case B3SOIFD_MOD_WUA: - mod->B3SOIFDwua = value->rValue; - mod->B3SOIFDwuaGiven = TRUE; - break; - case B3SOIFD_MOD_WUB: - mod->B3SOIFDwub = value->rValue; - mod->B3SOIFDwubGiven = TRUE; - break; - case B3SOIFD_MOD_WUC: - mod->B3SOIFDwuc = value->rValue; - mod->B3SOIFDwucGiven = TRUE; - break; - case B3SOIFD_MOD_WVSAT: - mod->B3SOIFDwvsat = value->rValue; - mod->B3SOIFDwvsatGiven = TRUE; - break; - case B3SOIFD_MOD_WA0: - mod->B3SOIFDwa0 = value->rValue; - mod->B3SOIFDwa0Given = TRUE; - break; - case B3SOIFD_MOD_WAGS: - mod->B3SOIFDwags= value->rValue; - mod->B3SOIFDwagsGiven = TRUE; - break; - case B3SOIFD_MOD_WB0 : - mod->B3SOIFDwb0 = value->rValue; - mod->B3SOIFDwb0Given = TRUE; - break; - case B3SOIFD_MOD_WB1 : - mod->B3SOIFDwb1 = value->rValue; - mod->B3SOIFDwb1Given = TRUE; - break; - case B3SOIFD_MOD_WKETA: - mod->B3SOIFDwketa = value->rValue; - mod->B3SOIFDwketaGiven = TRUE; - break; - case B3SOIFD_MOD_WABP: - mod->B3SOIFDwabp = value->rValue; - mod->B3SOIFDwabpGiven = TRUE; - break; - case B3SOIFD_MOD_WMXC: - mod->B3SOIFDwmxc = value->rValue; - mod->B3SOIFDwmxcGiven = TRUE; - break; - case B3SOIFD_MOD_WADICE0: - mod->B3SOIFDwadice0 = value->rValue; - mod->B3SOIFDwadice0Given = TRUE; - break; - case B3SOIFD_MOD_WA1: - mod->B3SOIFDwa1 = value->rValue; - mod->B3SOIFDwa1Given = TRUE; - break; - case B3SOIFD_MOD_WA2: - mod->B3SOIFDwa2 = value->rValue; - mod->B3SOIFDwa2Given = TRUE; - break; - case B3SOIFD_MOD_WRDSW: - mod->B3SOIFDwrdsw = value->rValue; - mod->B3SOIFDwrdswGiven = TRUE; - break; - case B3SOIFD_MOD_WPRWB: - mod->B3SOIFDwprwb = value->rValue; - mod->B3SOIFDwprwbGiven = TRUE; - break; - case B3SOIFD_MOD_WPRWG: - mod->B3SOIFDwprwg = value->rValue; - mod->B3SOIFDwprwgGiven = TRUE; - break; - case B3SOIFD_MOD_WWR : - mod->B3SOIFDwwr = value->rValue; - mod->B3SOIFDwwrGiven = TRUE; - break; - case B3SOIFD_MOD_WNFACTOR : - mod->B3SOIFDwnfactor = value->rValue; - mod->B3SOIFDwnfactorGiven = TRUE; - break; - case B3SOIFD_MOD_WDWG : - mod->B3SOIFDwdwg = value->rValue; - mod->B3SOIFDwdwgGiven = TRUE; - break; - case B3SOIFD_MOD_WDWB : - mod->B3SOIFDwdwb = value->rValue; - mod->B3SOIFDwdwbGiven = TRUE; - break; - case B3SOIFD_MOD_WVOFF: - mod->B3SOIFDwvoff = value->rValue; - mod->B3SOIFDwvoffGiven = TRUE; - break; - case B3SOIFD_MOD_WETA0: - mod->B3SOIFDweta0 = value->rValue; - mod->B3SOIFDweta0Given = TRUE; - break; - case B3SOIFD_MOD_WETAB: - mod->B3SOIFDwetab = value->rValue; - mod->B3SOIFDwetabGiven = TRUE; - break; - case B3SOIFD_MOD_WDSUB: - mod->B3SOIFDwdsub = value->rValue; - mod->B3SOIFDwdsubGiven = TRUE; - break; - case B3SOIFD_MOD_WCIT : - mod->B3SOIFDwcit = value->rValue; - mod->B3SOIFDwcitGiven = TRUE; - break; - case B3SOIFD_MOD_WCDSC : - mod->B3SOIFDwcdsc = value->rValue; - mod->B3SOIFDwcdscGiven = TRUE; - break; - case B3SOIFD_MOD_WCDSCB : - mod->B3SOIFDwcdscb = value->rValue; - mod->B3SOIFDwcdscbGiven = TRUE; - break; - case B3SOIFD_MOD_WCDSCD : - mod->B3SOIFDwcdscd = value->rValue; - mod->B3SOIFDwcdscdGiven = TRUE; - break; - case B3SOIFD_MOD_WPCLM: - mod->B3SOIFDwpclm = value->rValue; - mod->B3SOIFDwpclmGiven = TRUE; - break; - case B3SOIFD_MOD_WPDIBL1: - mod->B3SOIFDwpdibl1 = value->rValue; - mod->B3SOIFDwpdibl1Given = TRUE; - break; - case B3SOIFD_MOD_WPDIBL2: - mod->B3SOIFDwpdibl2 = value->rValue; - mod->B3SOIFDwpdibl2Given = TRUE; - break; - case B3SOIFD_MOD_WPDIBLB: - mod->B3SOIFDwpdiblb = value->rValue; - mod->B3SOIFDwpdiblbGiven = TRUE; - break; - case B3SOIFD_MOD_WDROUT: - mod->B3SOIFDwdrout = value->rValue; - mod->B3SOIFDwdroutGiven = TRUE; - break; - case B3SOIFD_MOD_WPVAG: - mod->B3SOIFDwpvag = value->rValue; - mod->B3SOIFDwpvagGiven = TRUE; - break; - case B3SOIFD_MOD_WDELTA : - mod->B3SOIFDwdelta = value->rValue; - mod->B3SOIFDwdeltaGiven = TRUE; - break; - case B3SOIFD_MOD_WAII : - mod->B3SOIFDwaii = value->rValue; - mod->B3SOIFDwaiiGiven = TRUE; - break; - case B3SOIFD_MOD_WBII : - mod->B3SOIFDwbii = value->rValue; - mod->B3SOIFDwbiiGiven = TRUE; - break; - case B3SOIFD_MOD_WCII : - mod->B3SOIFDwcii = value->rValue; - mod->B3SOIFDwciiGiven = TRUE; - break; - case B3SOIFD_MOD_WDII : - mod->B3SOIFDwdii = value->rValue; - mod->B3SOIFDwdiiGiven = TRUE; - break; - case B3SOIFD_MOD_WALPHA0 : - mod->B3SOIFDwalpha0 = value->rValue; - mod->B3SOIFDwalpha0Given = TRUE; - break; - case B3SOIFD_MOD_WALPHA1 : - mod->B3SOIFDwalpha1 = value->rValue; - mod->B3SOIFDwalpha1Given = TRUE; - break; - case B3SOIFD_MOD_WBETA0 : - mod->B3SOIFDwbeta0 = value->rValue; - mod->B3SOIFDwbeta0Given = TRUE; - break; - case B3SOIFD_MOD_WAGIDL : - mod->B3SOIFDwagidl = value->rValue; - mod->B3SOIFDwagidlGiven = TRUE; - break; - case B3SOIFD_MOD_WBGIDL : - mod->B3SOIFDwbgidl = value->rValue; - mod->B3SOIFDwbgidlGiven = TRUE; - break; - case B3SOIFD_MOD_WNGIDL : - mod->B3SOIFDwngidl = value->rValue; - mod->B3SOIFDwngidlGiven = TRUE; - break; - case B3SOIFD_MOD_WNTUN : - mod->B3SOIFDwntun = value->rValue; - mod->B3SOIFDwntunGiven = TRUE; - break; - case B3SOIFD_MOD_WNDIODE : - mod->B3SOIFDwndiode = value->rValue; - mod->B3SOIFDwndiodeGiven = TRUE; - break; - case B3SOIFD_MOD_WISBJT : - mod->B3SOIFDwisbjt = value->rValue; - mod->B3SOIFDwisbjtGiven = TRUE; - break; - case B3SOIFD_MOD_WISDIF : - mod->B3SOIFDwisdif = value->rValue; - mod->B3SOIFDwisdifGiven = TRUE; - break; - case B3SOIFD_MOD_WISREC : - mod->B3SOIFDwisrec = value->rValue; - mod->B3SOIFDwisrecGiven = TRUE; - break; - case B3SOIFD_MOD_WISTUN : - mod->B3SOIFDwistun = value->rValue; - mod->B3SOIFDwistunGiven = TRUE; - break; - case B3SOIFD_MOD_WEDL : - mod->B3SOIFDwedl = value->rValue; - mod->B3SOIFDwedlGiven = TRUE; - break; - case B3SOIFD_MOD_WKBJT1 : - mod->B3SOIFDwkbjt1 = value->rValue; - mod->B3SOIFDwkbjt1Given = TRUE; - break; - /* CV Model */ - case B3SOIFD_MOD_WVSDFB : - mod->B3SOIFDwvsdfb = value->rValue; - mod->B3SOIFDwvsdfbGiven = TRUE; - break; - case B3SOIFD_MOD_WVSDTH : - mod->B3SOIFDwvsdth = value->rValue; - mod->B3SOIFDwvsdthGiven = TRUE; - break; - /* Cross-term Dependence */ - case B3SOIFD_MOD_PNPEAK: - mod->B3SOIFDpnpeak = value->rValue; - mod->B3SOIFDpnpeakGiven = TRUE; - break; - case B3SOIFD_MOD_PNSUB: - mod->B3SOIFDpnsub = value->rValue; - mod->B3SOIFDpnsubGiven = TRUE; - break; - case B3SOIFD_MOD_PNGATE: - mod->B3SOIFDpngate = value->rValue; - mod->B3SOIFDpngateGiven = TRUE; - break; - case B3SOIFD_MOD_PVTH0: - mod->B3SOIFDpvth0 = value->rValue; - mod->B3SOIFDpvth0Given = TRUE; - break; - case B3SOIFD_MOD_PK1: - mod->B3SOIFDpk1 = value->rValue; - mod->B3SOIFDpk1Given = TRUE; - break; - case B3SOIFD_MOD_PK2: - mod->B3SOIFDpk2 = value->rValue; - mod->B3SOIFDpk2Given = TRUE; - break; - case B3SOIFD_MOD_PK3: - mod->B3SOIFDpk3 = value->rValue; - mod->B3SOIFDpk3Given = TRUE; - break; - case B3SOIFD_MOD_PK3B: - mod->B3SOIFDpk3b = value->rValue; - mod->B3SOIFDpk3bGiven = TRUE; - break; - case B3SOIFD_MOD_PVBSA: - mod->B3SOIFDpvbsa = value->rValue; - mod->B3SOIFDpvbsaGiven = TRUE; - break; - case B3SOIFD_MOD_PDELP: - mod->B3SOIFDpdelp = value->rValue; - mod->B3SOIFDpdelpGiven = TRUE; - break; - case B3SOIFD_MOD_PKB1 : - mod->B3SOIFDpkb1 = value->rValue; - mod->B3SOIFDpkb1Given = TRUE; - break; - case B3SOIFD_MOD_PKB3 : - mod->B3SOIFDpkb3 = value->rValue; - mod->B3SOIFDpkb3Given = TRUE; - break; - case B3SOIFD_MOD_PDVBD0 : - mod->B3SOIFDpdvbd0 = value->rValue; - mod->B3SOIFDpdvbd0Given = TRUE; - break; - case B3SOIFD_MOD_PDVBD1 : - mod->B3SOIFDpdvbd1 = value->rValue; - mod->B3SOIFDpdvbd1Given = TRUE; - break; - case B3SOIFD_MOD_PW0: - mod->B3SOIFDpw0 = value->rValue; - mod->B3SOIFDpw0Given = TRUE; - break; - case B3SOIFD_MOD_PNLX: - mod->B3SOIFDpnlx = value->rValue; - mod->B3SOIFDpnlxGiven = TRUE; - break; - case B3SOIFD_MOD_PDVT0: - mod->B3SOIFDpdvt0 = value->rValue; - mod->B3SOIFDpdvt0Given = TRUE; - break; - case B3SOIFD_MOD_PDVT1: - mod->B3SOIFDpdvt1 = value->rValue; - mod->B3SOIFDpdvt1Given = TRUE; - break; - case B3SOIFD_MOD_PDVT2: - mod->B3SOIFDpdvt2 = value->rValue; - mod->B3SOIFDpdvt2Given = TRUE; - break; - case B3SOIFD_MOD_PDVT0W: - mod->B3SOIFDpdvt0w = value->rValue; - mod->B3SOIFDpdvt0wGiven = TRUE; - break; - case B3SOIFD_MOD_PDVT1W: - mod->B3SOIFDpdvt1w = value->rValue; - mod->B3SOIFDpdvt1wGiven = TRUE; - break; - case B3SOIFD_MOD_PDVT2W: - mod->B3SOIFDpdvt2w = value->rValue; - mod->B3SOIFDpdvt2wGiven = TRUE; - break; - case B3SOIFD_MOD_PU0 : - mod->B3SOIFDpu0 = value->rValue; - mod->B3SOIFDpu0Given = TRUE; - break; - case B3SOIFD_MOD_PUA: - mod->B3SOIFDpua = value->rValue; - mod->B3SOIFDpuaGiven = TRUE; - break; - case B3SOIFD_MOD_PUB: - mod->B3SOIFDpub = value->rValue; - mod->B3SOIFDpubGiven = TRUE; - break; - case B3SOIFD_MOD_PUC: - mod->B3SOIFDpuc = value->rValue; - mod->B3SOIFDpucGiven = TRUE; - break; - case B3SOIFD_MOD_PVSAT: - mod->B3SOIFDpvsat = value->rValue; - mod->B3SOIFDpvsatGiven = TRUE; - break; - case B3SOIFD_MOD_PA0: - mod->B3SOIFDpa0 = value->rValue; - mod->B3SOIFDpa0Given = TRUE; - break; - case B3SOIFD_MOD_PAGS: - mod->B3SOIFDpags= value->rValue; - mod->B3SOIFDpagsGiven = TRUE; - break; - case B3SOIFD_MOD_PB0 : - mod->B3SOIFDpb0 = value->rValue; - mod->B3SOIFDpb0Given = TRUE; - break; - case B3SOIFD_MOD_PB1 : - mod->B3SOIFDpb1 = value->rValue; - mod->B3SOIFDpb1Given = TRUE; - break; - case B3SOIFD_MOD_PKETA: - mod->B3SOIFDpketa = value->rValue; - mod->B3SOIFDpketaGiven = TRUE; - break; - case B3SOIFD_MOD_PABP: - mod->B3SOIFDpabp = value->rValue; - mod->B3SOIFDpabpGiven = TRUE; - break; - case B3SOIFD_MOD_PMXC: - mod->B3SOIFDpmxc = value->rValue; - mod->B3SOIFDpmxcGiven = TRUE; - break; - case B3SOIFD_MOD_PADICE0: - mod->B3SOIFDpadice0 = value->rValue; - mod->B3SOIFDpadice0Given = TRUE; - break; - case B3SOIFD_MOD_PA1: - mod->B3SOIFDpa1 = value->rValue; - mod->B3SOIFDpa1Given = TRUE; - break; - case B3SOIFD_MOD_PA2: - mod->B3SOIFDpa2 = value->rValue; - mod->B3SOIFDpa2Given = TRUE; - break; - case B3SOIFD_MOD_PRDSW: - mod->B3SOIFDprdsw = value->rValue; - mod->B3SOIFDprdswGiven = TRUE; - break; - case B3SOIFD_MOD_PPRWB: - mod->B3SOIFDpprwb = value->rValue; - mod->B3SOIFDpprwbGiven = TRUE; - break; - case B3SOIFD_MOD_PPRWG: - mod->B3SOIFDpprwg = value->rValue; - mod->B3SOIFDpprwgGiven = TRUE; - break; - case B3SOIFD_MOD_PWR : - mod->B3SOIFDpwr = value->rValue; - mod->B3SOIFDpwrGiven = TRUE; - break; - case B3SOIFD_MOD_PNFACTOR : - mod->B3SOIFDpnfactor = value->rValue; - mod->B3SOIFDpnfactorGiven = TRUE; - break; - case B3SOIFD_MOD_PDWG : - mod->B3SOIFDpdwg = value->rValue; - mod->B3SOIFDpdwgGiven = TRUE; - break; - case B3SOIFD_MOD_PDWB : - mod->B3SOIFDpdwb = value->rValue; - mod->B3SOIFDpdwbGiven = TRUE; - break; - case B3SOIFD_MOD_PVOFF: - mod->B3SOIFDpvoff = value->rValue; - mod->B3SOIFDpvoffGiven = TRUE; - break; - case B3SOIFD_MOD_PETA0: - mod->B3SOIFDpeta0 = value->rValue; - mod->B3SOIFDpeta0Given = TRUE; - break; - case B3SOIFD_MOD_PETAB: - mod->B3SOIFDpetab = value->rValue; - mod->B3SOIFDpetabGiven = TRUE; - break; - case B3SOIFD_MOD_PDSUB: - mod->B3SOIFDpdsub = value->rValue; - mod->B3SOIFDpdsubGiven = TRUE; - break; - case B3SOIFD_MOD_PCIT : - mod->B3SOIFDpcit = value->rValue; - mod->B3SOIFDpcitGiven = TRUE; - break; - case B3SOIFD_MOD_PCDSC : - mod->B3SOIFDpcdsc = value->rValue; - mod->B3SOIFDpcdscGiven = TRUE; - break; - case B3SOIFD_MOD_PCDSCB : - mod->B3SOIFDpcdscb = value->rValue; - mod->B3SOIFDpcdscbGiven = TRUE; - break; - case B3SOIFD_MOD_PCDSCD : - mod->B3SOIFDpcdscd = value->rValue; - mod->B3SOIFDpcdscdGiven = TRUE; - break; - case B3SOIFD_MOD_PPCLM: - mod->B3SOIFDppclm = value->rValue; - mod->B3SOIFDppclmGiven = TRUE; - break; - case B3SOIFD_MOD_PPDIBL1: - mod->B3SOIFDppdibl1 = value->rValue; - mod->B3SOIFDppdibl1Given = TRUE; - break; - case B3SOIFD_MOD_PPDIBL2: - mod->B3SOIFDppdibl2 = value->rValue; - mod->B3SOIFDppdibl2Given = TRUE; - break; - case B3SOIFD_MOD_PPDIBLB: - mod->B3SOIFDppdiblb = value->rValue; - mod->B3SOIFDppdiblbGiven = TRUE; - break; - case B3SOIFD_MOD_PDROUT: - mod->B3SOIFDpdrout = value->rValue; - mod->B3SOIFDpdroutGiven = TRUE; - break; - case B3SOIFD_MOD_PPVAG: - mod->B3SOIFDppvag = value->rValue; - mod->B3SOIFDppvagGiven = TRUE; - break; - case B3SOIFD_MOD_PDELTA : - mod->B3SOIFDpdelta = value->rValue; - mod->B3SOIFDpdeltaGiven = TRUE; - break; - case B3SOIFD_MOD_PAII : - mod->B3SOIFDpaii = value->rValue; - mod->B3SOIFDpaiiGiven = TRUE; - break; - case B3SOIFD_MOD_PBII : - mod->B3SOIFDpbii = value->rValue; - mod->B3SOIFDpbiiGiven = TRUE; - break; - case B3SOIFD_MOD_PCII : - mod->B3SOIFDpcii = value->rValue; - mod->B3SOIFDpciiGiven = TRUE; - break; - case B3SOIFD_MOD_PDII : - mod->B3SOIFDpdii = value->rValue; - mod->B3SOIFDpdiiGiven = TRUE; - break; - case B3SOIFD_MOD_PALPHA0 : - mod->B3SOIFDpalpha0 = value->rValue; - mod->B3SOIFDpalpha0Given = TRUE; - break; - case B3SOIFD_MOD_PALPHA1 : - mod->B3SOIFDpalpha1 = value->rValue; - mod->B3SOIFDpalpha1Given = TRUE; - break; - case B3SOIFD_MOD_PBETA0 : - mod->B3SOIFDpbeta0 = value->rValue; - mod->B3SOIFDpbeta0Given = TRUE; - break; - case B3SOIFD_MOD_PAGIDL : - mod->B3SOIFDpagidl = value->rValue; - mod->B3SOIFDpagidlGiven = TRUE; - break; - case B3SOIFD_MOD_PBGIDL : - mod->B3SOIFDpbgidl = value->rValue; - mod->B3SOIFDpbgidlGiven = TRUE; - break; - case B3SOIFD_MOD_PNGIDL : - mod->B3SOIFDpngidl = value->rValue; - mod->B3SOIFDpngidlGiven = TRUE; - break; - case B3SOIFD_MOD_PNTUN : - mod->B3SOIFDpntun = value->rValue; - mod->B3SOIFDpntunGiven = TRUE; - break; - case B3SOIFD_MOD_PNDIODE : - mod->B3SOIFDpndiode = value->rValue; - mod->B3SOIFDpndiodeGiven = TRUE; - break; - case B3SOIFD_MOD_PISBJT : - mod->B3SOIFDpisbjt = value->rValue; - mod->B3SOIFDpisbjtGiven = TRUE; - break; - case B3SOIFD_MOD_PISDIF : - mod->B3SOIFDpisdif = value->rValue; - mod->B3SOIFDpisdifGiven = TRUE; - break; - case B3SOIFD_MOD_PISREC : - mod->B3SOIFDpisrec = value->rValue; - mod->B3SOIFDpisrecGiven = TRUE; - break; - case B3SOIFD_MOD_PISTUN : - mod->B3SOIFDpistun = value->rValue; - mod->B3SOIFDpistunGiven = TRUE; - break; - case B3SOIFD_MOD_PEDL : - mod->B3SOIFDpedl = value->rValue; - mod->B3SOIFDpedlGiven = TRUE; - break; - case B3SOIFD_MOD_PKBJT1 : - mod->B3SOIFDpkbjt1 = value->rValue; - mod->B3SOIFDpkbjt1Given = TRUE; - break; - /* CV Model */ - case B3SOIFD_MOD_PVSDFB : - mod->B3SOIFDpvsdfb = value->rValue; - mod->B3SOIFDpvsdfbGiven = TRUE; - break; - case B3SOIFD_MOD_PVSDTH : - mod->B3SOIFDpvsdth = value->rValue; - mod->B3SOIFDpvsdthGiven = TRUE; - break; -/* Added for binning - END */ - - case B3SOIFD_MOD_NMOS : - if(value->iValue) { - mod->B3SOIFDtype = 1; - mod->B3SOIFDtypeGiven = TRUE; - } - break; - case B3SOIFD_MOD_PMOS : - if(value->iValue) { - mod->B3SOIFDtype = - 1; - mod->B3SOIFDtypeGiven = TRUE; - } - break; - default: - return(E_BADPARM); - } - return(OK); -} - - diff --git a/src/spicelib/devices/bsim3soi_fd/b3soifdnoi.c b/src/spicelib/devices/bsim3soi_fd/b3soifdnoi.c deleted file mode 100644 index 9af38e22f..000000000 --- a/src/spicelib/devices/bsim3soi_fd/b3soifdnoi.c +++ /dev/null @@ -1,349 +0,0 @@ -/********** -Copyright 1999 Regents of the University of California. All rights reserved. -Author: Weidong Liu and Pin Su Feb 1999 -Author: 1998 Samuel Fung, Dennis Sinitsky and Stephen Tang -File: b3soifdnoi.c 98/5/01 -Modified by Paolo Nenzi 2002 -**********/ - -/* - * Revision 2.1 99/9/27 Pin Su - * BSIMFD2.1 release - */ - -#include "ngspice/ngspice.h" -#include "b3soifddef.h" -#include "ngspice/cktdefs.h" -#include "ngspice/iferrmsg.h" -#include "ngspice/noisedef.h" -#include "ngspice/suffix.h" -#include "ngspice/const.h" /* jwan */ - -/* - * B3SOIFDnoise (mode, operation, firstModel, ckt, data, OnDens) - * This routine names and evaluates all of the noise sources - * associated with MOSFET's. It starts with the model *firstModel and - * traverses all of its insts. It then proceeds to any other models - * on the linked list. The total output noise density generated by - * all of the MOSFET's is summed with the variable "OnDens". - */ - -/* - Channel thermal and flicker noises are calculated based on the value - of model->B3SOIFDnoiMod. - If model->B3SOIFDnoiMod = 1, - Channel thermal noise = SPICE2 model - Flicker noise = SPICE2 model - If model->B3SOIFDnoiMod = 2, - Channel thermal noise = B3SOIFD model - Flicker noise = B3SOIFD model - If model->B3SOIFDnoiMod = 3, - Channel thermal noise = SPICE2 model - Flicker noise = B3SOIFD model - If model->B3SOIFDnoiMod = 4, - Channel thermal noise = B3SOIFD model - Flicker noise = SPICE2 model - */ - - -static double -B3SOIFDStrongInversionNoiseEval(double vgs, double vds, B3SOIFDmodel *model, - B3SOIFDinstance *here, double freq, - double temp) -{ -struct b3soifdSizeDependParam *pParam; -double cd, esat, DelClm, EffFreq, N0, Nl, Vgst; -double T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, Ssi; - - pParam = here->pParam; - cd = fabs(here->B3SOIFDcd) * here->B3SOIFDm; - if (vds > here->B3SOIFDvdsat) - { esat = 2.0 * pParam->B3SOIFDvsattemp / here->B3SOIFDueff; - T0 = ((((vds - here->B3SOIFDvdsat) / pParam->B3SOIFDlitl) + model->B3SOIFDem) - / esat); - DelClm = pParam->B3SOIFDlitl * log (MAX(T0, N_MINLOG)); - } - else - DelClm = 0.0; - EffFreq = pow(freq, model->B3SOIFDef); - T1 = CHARGE * CHARGE * 8.62e-5 * cd * temp * here->B3SOIFDueff; - T2 = 1.0e8 * EffFreq * model->B3SOIFDcox - * pParam->B3SOIFDleff * pParam->B3SOIFDleff; - Vgst = vgs - here->B3SOIFDvon; - N0 = model->B3SOIFDcox * Vgst / CHARGE; - if (N0 < 0.0) - N0 = 0.0; - Nl = model->B3SOIFDcox * (Vgst - MIN(vds, here->B3SOIFDvdsat)) / CHARGE; - if (Nl < 0.0) - Nl = 0.0; - - T3 = model->B3SOIFDoxideTrapDensityA - * log(MAX(((N0 + 2.0e14) / (Nl + 2.0e14)), N_MINLOG)); - T4 = model->B3SOIFDoxideTrapDensityB * (N0 - Nl); - T5 = model->B3SOIFDoxideTrapDensityC * 0.5 * (N0 * N0 - Nl * Nl); - - T6 = 8.62e-5 * temp * cd * cd; - T7 = 1.0e8 * EffFreq * pParam->B3SOIFDleff - * pParam->B3SOIFDleff * pParam->B3SOIFDweff * here->B3SOIFDm; - T8 = model->B3SOIFDoxideTrapDensityA + model->B3SOIFDoxideTrapDensityB * Nl - + model->B3SOIFDoxideTrapDensityC * Nl * Nl; - T9 = (Nl + 2.0e14) * (Nl + 2.0e14); - - Ssi = T1 / T2 * (T3 + T4 + T5) + T6 / T7 * DelClm * T8 / T9; - - return Ssi; -} - -int -B3SOIFDnoise (int mode, int operation, GENmodel *inModel, CKTcircuit *ckt, - Ndata *data, double *OnDens) -{ -NOISEAN *job = (NOISEAN *) ckt->CKTcurJob; - -B3SOIFDmodel *model = (B3SOIFDmodel *)inModel; -B3SOIFDinstance *here; -struct b3soifdSizeDependParam *pParam; -double tempOnoise; -double tempInoise; -double noizDens[B3SOIFDNSRCS]; -double lnNdens[B3SOIFDNSRCS]; - -double vgs, vds, Slimit; -double T1, T10, T11; -double Ssi, Swi; - -int i; - - /* define the names of the noise sources */ - static char *B3SOIFDnNames[B3SOIFDNSRCS] = - { /* Note that we have to keep the order */ - ".rd", /* noise due to rd */ - /* consistent with the index definitions */ - ".rs", /* noise due to rs */ - /* in B3SOIFDdefs.h */ - ".id", /* noise due to id */ - ".1overf", /* flicker (1/f) noise */ - ".fb", /* noise due to floating body */ - "" /* total transistor noise */ - }; - - for (; model != NULL; model = B3SOIFDnextModel(model)) - { for (here = B3SOIFDinstances(model); here != NULL; - here = B3SOIFDnextInstance(here)) - { - pParam = here->pParam; - switch (operation) - { case N_OPEN: - /* see if we have to to produce a summary report */ - /* if so, name all the noise generators */ - - if (job->NStpsSm != 0) - { switch (mode) - { case N_DENS: - for (i = 0; i < B3SOIFDNSRCS; i++) - { NOISE_ADD_OUTVAR(ckt, data, "onoise.%s%s", here->B3SOIFDname, B3SOIFDnNames[i]); - } - break; - case INT_NOIZ: - for (i = 0; i < B3SOIFDNSRCS; i++) - { NOISE_ADD_OUTVAR(ckt, data, "onoise_total.%s%s", here->B3SOIFDname, B3SOIFDnNames[i]); - NOISE_ADD_OUTVAR(ckt, data, "inoise_total.%s%s", here->B3SOIFDname, B3SOIFDnNames[i]); - } - break; - } - } - break; - case N_CALC: - switch (mode) - { case N_DENS: - NevalSrc(&noizDens[B3SOIFDRDNOIZ], - &lnNdens[B3SOIFDRDNOIZ], ckt, THERMNOISE, - here->B3SOIFDdNodePrime, here->B3SOIFDdNode, - here->B3SOIFDdrainConductance * here->B3SOIFDm); - - NevalSrc(&noizDens[B3SOIFDRSNOIZ], - &lnNdens[B3SOIFDRSNOIZ], ckt, THERMNOISE, - here->B3SOIFDsNodePrime, here->B3SOIFDsNode, - here->B3SOIFDsourceConductance * here->B3SOIFDm); - - switch( model->B3SOIFDnoiMod ) - { case 1: - case 3: - NevalSrc(&noizDens[B3SOIFDIDNOIZ], - &lnNdens[B3SOIFDIDNOIZ], ckt, - THERMNOISE, here->B3SOIFDdNodePrime, - here->B3SOIFDsNodePrime, - (2.0 / 3.0 * fabs(here->B3SOIFDm * - (here->B3SOIFDgm - + here->B3SOIFDgds - + here->B3SOIFDgmbs)))); - break; - case 2: - case 4: - NevalSrc(&noizDens[B3SOIFDIDNOIZ], - &lnNdens[B3SOIFDIDNOIZ], ckt, - THERMNOISE, here->B3SOIFDdNodePrime, - here->B3SOIFDsNodePrime, - (here->B3SOIFDueff - * fabs((here->B3SOIFDqinv * here->B3SOIFDm) - / (pParam->B3SOIFDleff - * pParam->B3SOIFDleff)))); - break; - } - NevalSrc(&noizDens[B3SOIFDFLNOIZ], NULL, - ckt, N_GAIN, here->B3SOIFDdNodePrime, - here->B3SOIFDsNodePrime, (double) 0.0); - - switch( model->B3SOIFDnoiMod ) - { case 1: - case 4: - noizDens[B3SOIFDFLNOIZ] *= model->B3SOIFDkf - * exp(model->B3SOIFDaf - * log(MAX(fabs(here->B3SOIFDcd * here->B3SOIFDm), - N_MINLOG))) - / (pow(data->freq, model->B3SOIFDef) - * pParam->B3SOIFDleff - * pParam->B3SOIFDleff - * model->B3SOIFDcox); - break; - case 2: - case 3: - vgs = *(ckt->CKTstates[0] + here->B3SOIFDvgs); - vds = *(ckt->CKTstates[0] + here->B3SOIFDvds); - if (vds < 0.0) - { vds = -vds; - vgs = vgs + vds; - } - if (vgs >= here->B3SOIFDvon + 0.1) - { Ssi = B3SOIFDStrongInversionNoiseEval(vgs, - vds, model, here, data->freq, - ckt->CKTtemp); - noizDens[B3SOIFDFLNOIZ] *= Ssi; - } - else - { pParam = here->pParam; - T10 = model->B3SOIFDoxideTrapDensityA - * 8.62e-5 * ckt->CKTtemp; - T11 = pParam->B3SOIFDweff * here->B3SOIFDm - * pParam->B3SOIFDleff - * pow(data->freq, model->B3SOIFDef) - * 4.0e36; - Swi = T10 / T11 * here->B3SOIFDcd * here->B3SOIFDm - * here->B3SOIFDcd * here->B3SOIFDm; - Slimit = B3SOIFDStrongInversionNoiseEval( - here->B3SOIFDvon + 0.1, vds, model, - here, data->freq, ckt->CKTtemp); - T1 = Swi + Slimit; - if (T1 > 0.0) - noizDens[B3SOIFDFLNOIZ] *= (Slimit - * Swi) / T1; - else - noizDens[B3SOIFDFLNOIZ] *= 0.0; - } - break; - } - - lnNdens[B3SOIFDFLNOIZ] = - log(MAX(noizDens[B3SOIFDFLNOIZ], N_MINLOG)); - - /* Low frequency excess noise due to FBE */ - noizDens[B3SOIFDFBNOIZ] = 0.0; - - noizDens[B3SOIFDTOTNOIZ] = noizDens[B3SOIFDRDNOIZ] - + noizDens[B3SOIFDRSNOIZ] - + noizDens[B3SOIFDIDNOIZ] - + noizDens[B3SOIFDFLNOIZ] - + noizDens[B3SOIFDFBNOIZ]; - lnNdens[B3SOIFDTOTNOIZ] = - log(MAX(noizDens[B3SOIFDTOTNOIZ], N_MINLOG)); - - *OnDens += noizDens[B3SOIFDTOTNOIZ]; - - if (data->delFreq == 0.0) - { /* if we haven't done any previous - integration, we need to initialize our - "history" variables. - */ - - for (i = 0; i < B3SOIFDNSRCS; i++) - { here->B3SOIFDnVar[LNLSTDENS][i] = - lnNdens[i]; - } - - /* clear out our integration variables - if it's the first pass - */ - if (data->freq == - job->NstartFreq) - { for (i = 0; i < B3SOIFDNSRCS; i++) - { here->B3SOIFDnVar[OUTNOIZ][i] = 0.0; - here->B3SOIFDnVar[INNOIZ][i] = 0.0; - } - } - } - else - { /* data->delFreq != 0.0, - we have to integrate. - */ - for (i = 0; i < B3SOIFDNSRCS; i++) - { if (i != B3SOIFDTOTNOIZ) - { tempOnoise = Nintegrate(noizDens[i], - lnNdens[i], - here->B3SOIFDnVar[LNLSTDENS][i], - data); - tempInoise = Nintegrate(noizDens[i] - * data->GainSqInv, lnNdens[i] - + data->lnGainInv, - here->B3SOIFDnVar[LNLSTDENS][i] - + data->lnGainInv, data); - here->B3SOIFDnVar[LNLSTDENS][i] = - lnNdens[i]; - data->outNoiz += tempOnoise; - data->inNoise += tempInoise; - if (job->NStpsSm != 0) - { here->B3SOIFDnVar[OUTNOIZ][i] - += tempOnoise; - here->B3SOIFDnVar[OUTNOIZ][B3SOIFDTOTNOIZ] - += tempOnoise; - here->B3SOIFDnVar[INNOIZ][i] - += tempInoise; - here->B3SOIFDnVar[INNOIZ][B3SOIFDTOTNOIZ] - += tempInoise; - } - } - } - } - if (data->prtSummary) - { for (i = 0; i < B3SOIFDNSRCS; i++) - { /* print a summary report */ - data->outpVector[data->outNumber++] - = noizDens[i]; - } - } - break; - case INT_NOIZ: - /* already calculated, just output */ - if (job->NStpsSm != 0) - { for (i = 0; i < B3SOIFDNSRCS; i++) - { data->outpVector[data->outNumber++] - = here->B3SOIFDnVar[OUTNOIZ][i]; - data->outpVector[data->outNumber++] - = here->B3SOIFDnVar[INNOIZ][i]; - } - } - break; - } - break; - case N_CLOSE: - /* do nothing, the main calling routine will close */ - return (OK); - break; /* the plots */ - } /* switch (operation) */ - } /* for here */ - } /* for model */ - - return(OK); -} - - - diff --git a/src/spicelib/devices/bsim3soi_fd/b3soifdpar.c b/src/spicelib/devices/bsim3soi_fd/b3soifdpar.c deleted file mode 100644 index db2d2b32a..000000000 --- a/src/spicelib/devices/bsim3soi_fd/b3soifdpar.c +++ /dev/null @@ -1,142 +0,0 @@ -/********** -Copyright 1999 Regents of the University of California. All rights reserved. -Author: 1998 Samuel Fung, Dennis Sinitsky and Stephen Tang -Modified by Paolo Nenzi 2002 -File: b3soifdpar.c 98/5/01 -**********/ - -/* - * Revision 2.1 99/9/27 Pin Su - * BSIMFD2.1 release - */ - -#include "ngspice/ngspice.h" -#include "ngspice/ifsim.h" -#include "b3soifddef.h" -#include "ngspice/sperror.h" -#include "ngspice/suffix.h" - -int -B3SOIFDparam(int param, IFvalue *value, GENinstance *inst, - IFvalue *select) -{ - B3SOIFDinstance *here = (B3SOIFDinstance*)inst; - - NG_IGNORE(select); - - switch (param) { - case B3SOIFD_W: - here->B3SOIFDw = value->rValue; - here->B3SOIFDwGiven = TRUE; - break; - case B3SOIFD_L: - here->B3SOIFDl = value->rValue; - here->B3SOIFDlGiven = TRUE; - break; - case B3SOIFD_M: - here->B3SOIFDm = value->rValue; - here->B3SOIFDmGiven = TRUE; - break; - case B3SOIFD_AS: - here->B3SOIFDsourceArea = value->rValue; - here->B3SOIFDsourceAreaGiven = TRUE; - break; - case B3SOIFD_AD: - here->B3SOIFDdrainArea = value->rValue; - here->B3SOIFDdrainAreaGiven = TRUE; - break; - case B3SOIFD_PS: - here->B3SOIFDsourcePerimeter = value->rValue; - here->B3SOIFDsourcePerimeterGiven = TRUE; - break; - case B3SOIFD_PD: - here->B3SOIFDdrainPerimeter = value->rValue; - here->B3SOIFDdrainPerimeterGiven = TRUE; - break; - case B3SOIFD_NRS: - here->B3SOIFDsourceSquares = value->rValue; - here->B3SOIFDsourceSquaresGiven = TRUE; - break; - case B3SOIFD_NRD: - here->B3SOIFDdrainSquares = value->rValue; - here->B3SOIFDdrainSquaresGiven = TRUE; - break; - case B3SOIFD_OFF: - here->B3SOIFDoff = value->iValue; - break; - case B3SOIFD_IC_VBS: - here->B3SOIFDicVBS = value->rValue; - here->B3SOIFDicVBSGiven = TRUE; - break; - case B3SOIFD_IC_VDS: - here->B3SOIFDicVDS = value->rValue; - here->B3SOIFDicVDSGiven = TRUE; - break; - case B3SOIFD_IC_VGS: - here->B3SOIFDicVGS = value->rValue; - here->B3SOIFDicVGSGiven = TRUE; - break; - case B3SOIFD_IC_VES: - here->B3SOIFDicVES = value->rValue; - here->B3SOIFDicVESGiven = TRUE; - break; - case B3SOIFD_IC_VPS: - here->B3SOIFDicVPS = value->rValue; - here->B3SOIFDicVPSGiven = TRUE; - break; - case B3SOIFD_BJTOFF: - here->B3SOIFDbjtoff = value->iValue; - here->B3SOIFDbjtoffGiven= TRUE; - break; - case B3SOIFD_DEBUG: - here->B3SOIFDdebugMod = value->iValue; - here->B3SOIFDdebugModGiven= TRUE; - break; - case B3SOIFD_RTH0: - here->B3SOIFDrth0= value->rValue; - here->B3SOIFDrth0Given = TRUE; - break; - case B3SOIFD_CTH0: - here->B3SOIFDcth0= value->rValue; - here->B3SOIFDcth0Given = TRUE; - break; - case B3SOIFD_NRB: - here->B3SOIFDbodySquares = value->rValue; - here->B3SOIFDbodySquaresGiven = TRUE; - break; - case B3SOIFD_IC: - /* FALLTHROUGH added to suppress GCC warning due to - * -Wimplicit-fallthrough flag */ - switch (value->v.numValue) { - case 5: - here->B3SOIFDicVPS = *(value->v.vec.rVec+4); - here->B3SOIFDicVPSGiven = TRUE; - /* FALLTHROUGH */ - case 4: - here->B3SOIFDicVES = *(value->v.vec.rVec+3); - here->B3SOIFDicVESGiven = TRUE; - /* FALLTHROUGH */ - case 3: - here->B3SOIFDicVBS = *(value->v.vec.rVec+2); - here->B3SOIFDicVBSGiven = TRUE; - /* FALLTHROUGH */ - case 2: - here->B3SOIFDicVGS = *(value->v.vec.rVec+1); - here->B3SOIFDicVGSGiven = TRUE; - /* FALLTHROUGH */ - case 1: - here->B3SOIFDicVDS = *(value->v.vec.rVec); - here->B3SOIFDicVDSGiven = TRUE; - break; - default: - return(E_BADPARM); - } - break; - default: - return(E_BADPARM); - } - return(OK); -} - - - diff --git a/src/spicelib/devices/bsim3soi_fd/b3soifdpzld.c b/src/spicelib/devices/bsim3soi_fd/b3soifdpzld.c deleted file mode 100644 index 152b2618d..000000000 --- a/src/spicelib/devices/bsim3soi_fd/b3soifdpzld.c +++ /dev/null @@ -1,159 +0,0 @@ -/********** -Copyright 1999 Regents of the University of California. All rights reserved. -Author: 1998 Samuel Fung, Dennis Sinitsky and Stephen Tang -Modified by Paolo Nenzi 2002 -File: b3soifdpzld.c 98/5/01 -**********/ - -/* - * Revision 2.1 99/9/27 Pin Su - * BSIMFD2.1 release - */ - -#include "ngspice/ngspice.h" -#include "ngspice/cktdefs.h" -#include "ngspice/complex.h" -#include "ngspice/sperror.h" -#include "b3soifddef.h" -#include "ngspice/suffix.h" - -int -B3SOIFDpzLoad(GENmodel *inModel, CKTcircuit *ckt, SPcomplex *s) -{ -B3SOIFDmodel *model = (B3SOIFDmodel*)inModel; -B3SOIFDinstance *here; -double xcggb, xcgdb, xcgsb, xcbgb, xcbdb, xcbsb, xcddb, xcssb, xcdgb; -double gdpr, gspr, gds, gbd, gbs, capbd = 0.0, capbs = 0.0; -double xcsgb, xcdsb, xcsdb; -double cggb, cgdb, cgsb, cbgb, cbdb, cbsb, cddb, cdgb, cdsb; -double GSoverlapCap, GDoverlapCap, GBoverlapCap = 0.0; -double FwdSum, RevSum, Gm, Gmbs; - -double m; - - NG_IGNORE(ckt); - - for (; model != NULL; model = B3SOIFDnextModel(model)) - { for (here = B3SOIFDinstances(model); here!= NULL; - here = B3SOIFDnextInstance(here)) - { - if (here->B3SOIFDmode >= 0) - { Gm = here->B3SOIFDgm; - Gmbs = here->B3SOIFDgmbs; - FwdSum = Gm + Gmbs; - RevSum = 0.0; - cggb = here->B3SOIFDcggb; - cgsb = here->B3SOIFDcgsb; - cgdb = here->B3SOIFDcgdb; - - cbgb = here->B3SOIFDcbgb; - cbsb = here->B3SOIFDcbsb; - cbdb = here->B3SOIFDcbdb; - - cdgb = here->B3SOIFDcdgb; - cdsb = here->B3SOIFDcdsb; - cddb = here->B3SOIFDcddb; - } - else - { Gm = -here->B3SOIFDgm; - Gmbs = -here->B3SOIFDgmbs; - FwdSum = 0.0; - RevSum = -Gm - Gmbs; - cggb = here->B3SOIFDcggb; - cgsb = here->B3SOIFDcgdb; - cgdb = here->B3SOIFDcgsb; - - cbgb = here->B3SOIFDcbgb; - cbsb = here->B3SOIFDcbdb; - cbdb = here->B3SOIFDcbsb; - - cdgb = -(here->B3SOIFDcdgb + cggb + cbgb); - cdsb = -(here->B3SOIFDcddb + cgsb + cbsb); - cddb = -(here->B3SOIFDcdsb + cgdb + cbdb); - } - gdpr=here->B3SOIFDdrainConductance; - gspr=here->B3SOIFDsourceConductance; - gds= here->B3SOIFDgds; - gbd= here->B3SOIFDgjdb; - gbs= here->B3SOIFDgjsb; -#ifdef BULKCODE - capbd= here->B3SOIFDcapbd; - capbs= here->B3SOIFDcapbs; -#endif - GSoverlapCap = here->B3SOIFDcgso; - GDoverlapCap = here->B3SOIFDcgdo; -#ifdef BULKCODE - GBoverlapCap = here->pParam->B3SOIFDcgbo; -#endif - - xcdgb = (cdgb - GDoverlapCap); - xcddb = (cddb + capbd + GDoverlapCap); - xcdsb = cdsb; - xcsgb = -(cggb + cbgb + cdgb + GSoverlapCap); - xcsdb = -(cgdb + cbdb + cddb); - xcssb = (capbs + GSoverlapCap - (cgsb+cbsb+cdsb)); - xcggb = (cggb + GDoverlapCap + GSoverlapCap + GBoverlapCap); - xcgdb = (cgdb - GDoverlapCap); - xcgsb = (cgsb - GSoverlapCap); - xcbgb = (cbgb - GBoverlapCap); - xcbdb = (cbdb - capbd); - xcbsb = (cbsb - capbs); - - m = here->B3SOIFDm; - - *(here->B3SOIFDGgPtr ) += m * (xcggb * s->real); - *(here->B3SOIFDGgPtr +1) += m * (xcggb * s->imag); - *(here->B3SOIFDBbPtr ) += m * ((-xcbgb-xcbdb-xcbsb) * s->real); - *(here->B3SOIFDBbPtr +1) += m * ((-xcbgb-xcbdb-xcbsb) * s->imag); - *(here->B3SOIFDDPdpPtr ) += m * (xcddb * s->real); - *(here->B3SOIFDDPdpPtr +1) += m * (xcddb * s->imag); - *(here->B3SOIFDSPspPtr ) += m * (xcssb * s->real); - *(here->B3SOIFDSPspPtr +1) += m * (xcssb * s->imag); - *(here->B3SOIFDGbPtr ) += m * ((-xcggb-xcgdb-xcgsb) * s->real); - *(here->B3SOIFDGbPtr +1) += m * ((-xcggb-xcgdb-xcgsb) * s->imag); - *(here->B3SOIFDGdpPtr ) += m * (xcgdb * s->real); - *(here->B3SOIFDGdpPtr +1) += m * (xcgdb * s->imag); - *(here->B3SOIFDGspPtr ) += m * (xcgsb * s->real); - *(here->B3SOIFDGspPtr +1) += m * (xcgsb * s->imag); - *(here->B3SOIFDBgPtr ) += m * (xcbgb * s->real); - *(here->B3SOIFDBgPtr +1) += m * (xcbgb * s->imag); - *(here->B3SOIFDBdpPtr ) += m * (xcbdb * s->real); - *(here->B3SOIFDBdpPtr +1) += m * (xcbdb * s->imag); - *(here->B3SOIFDBspPtr ) += m * (xcbsb * s->real); - *(here->B3SOIFDBspPtr +1) += m * (xcbsb * s->imag); - *(here->B3SOIFDDPgPtr ) += m * (xcdgb * s->real); - *(here->B3SOIFDDPgPtr +1) += m * (xcdgb * s->imag); - *(here->B3SOIFDDPbPtr ) += m * ((-xcdgb-xcddb-xcdsb) * s->real); - *(here->B3SOIFDDPbPtr +1) += m * ((-xcdgb-xcddb-xcdsb) * s->imag); - *(here->B3SOIFDDPspPtr ) += m * (xcdsb * s->real); - *(here->B3SOIFDDPspPtr +1) += m * (xcdsb * s->imag); - *(here->B3SOIFDSPgPtr ) += m * (xcsgb * s->real); - *(here->B3SOIFDSPgPtr +1) += m * (xcsgb * s->imag); - *(here->B3SOIFDSPbPtr ) += m * ((-xcsgb-xcsdb-xcssb) * s->real); - *(here->B3SOIFDSPbPtr +1) += m * ((-xcsgb-xcsdb-xcssb) * s->imag); - *(here->B3SOIFDSPdpPtr ) += m * (xcsdb * s->real); - *(here->B3SOIFDSPdpPtr +1) += m * (xcsdb * s->imag); - *(here->B3SOIFDDdPtr) += m * gdpr; - *(here->B3SOIFDSsPtr) += m * gspr; - *(here->B3SOIFDBbPtr) += m * (gbd + gbs); - *(here->B3SOIFDDPdpPtr) += m * (gdpr + gds + gbd + RevSum); - *(here->B3SOIFDSPspPtr) += m * (gspr + gds + gbs + FwdSum); - *(here->B3SOIFDDdpPtr) -= m * gdpr; - *(here->B3SOIFDSspPtr) -= m * gspr; - *(here->B3SOIFDBdpPtr) -= m * gbd; - *(here->B3SOIFDBspPtr) -= m * gbs; - *(here->B3SOIFDDPdPtr) -= m * gdpr; - *(here->B3SOIFDDPgPtr) += m * Gm; - *(here->B3SOIFDDPbPtr) -= m * (gbd - Gmbs); - *(here->B3SOIFDDPspPtr) -= m * (gds + FwdSum); - *(here->B3SOIFDSPgPtr) -= m * Gm; - *(here->B3SOIFDSPsPtr) -= m * gspr; - *(here->B3SOIFDSPbPtr) -= m * (gbs + Gmbs); - *(here->B3SOIFDSPdpPtr) -= m * (gds + RevSum); - - } - } - return(OK); -} - - diff --git a/src/spicelib/devices/bsim3soi_fd/b3soifdset.c b/src/spicelib/devices/bsim3soi_fd/b3soifdset.c deleted file mode 100644 index a1c12178d..000000000 --- a/src/spicelib/devices/bsim3soi_fd/b3soifdset.c +++ /dev/null @@ -1,1555 +0,0 @@ -/********** -Copyright 1999 Regents of the University of California. All rights reserved. -Author: Weidong Liu and Pin Su Feb 1999 -Author: 1998 Samuel Fung, Dennis Sinitsky and Stephen Tang -File: b3soifdset.c 98/5/01 -Modified by Pin Su, Wei Jin 99/9/27 -Modified by Paolo Nenzi 2002 -**********/ - -/* - * Revision 2.1 99/9/27 Pin Su - * BSIMFD2.1 release - */ - -#include "ngspice/ngspice.h" -#include "ngspice/smpdefs.h" -#include "ngspice/cktdefs.h" -#include "b3soifddef.h" -#include "ngspice/const.h" -#include "ngspice/sperror.h" -#include "ngspice/suffix.h" - -#define MAX_EXP 5.834617425e14 -#define MIN_EXP 1.713908431e-15 -#define EXP_THRESHOLD 34.0 -#define SMOOTHFACTOR 0.1 -#define EPSOX 3.453133e-11 -#define EPSSI 1.03594e-10 -#define PI 3.141592654 -#define Charge_q 1.60219e-19 -#define Meter2Micron 1.0e6 - -int -B3SOIFDsetup(SMPmatrix *matrix, GENmodel *inModel, CKTcircuit *ckt, - int *states) -{ -B3SOIFDmodel *model = (B3SOIFDmodel*)inModel; -B3SOIFDinstance *here; -int error; -CKTnode *tmp; - -double tmp1, tmp2; -double nfb0, Cboxt; - -CKTnode *tmpNode; -IFuid tmpName; - - - /* loop through all the B3SOIFD device models */ - for( ; model != NULL; model = B3SOIFDnextModel(model)) - { -/* Default value Processing for B3SOIFD MOSFET Models */ - - if (!model->B3SOIFDtypeGiven) - model->B3SOIFDtype = NMOS; - if (!model->B3SOIFDmobModGiven) - model->B3SOIFDmobMod = 1; - if (!model->B3SOIFDbinUnitGiven) - model->B3SOIFDbinUnit = 1; - if (!model->B3SOIFDparamChkGiven) - model->B3SOIFDparamChk = 0; - if (!model->B3SOIFDcapModGiven) - model->B3SOIFDcapMod = 2; - if (!model->B3SOIFDnoiModGiven) - model->B3SOIFDnoiMod = 1; - if (!model->B3SOIFDshModGiven) - model->B3SOIFDshMod = 0; - if (!model->B3SOIFDversionGiven) - model->B3SOIFDversion = 2.0; - if (!model->B3SOIFDtoxGiven) - model->B3SOIFDtox = 100.0e-10; - model->B3SOIFDcox = 3.453133e-11 / model->B3SOIFDtox; - - if (!model->B3SOIFDcdscGiven) - model->B3SOIFDcdsc = 2.4e-4; /* unit Q/V/m^2 */ - if (!model->B3SOIFDcdscbGiven) - model->B3SOIFDcdscb = 0.0; /* unit Q/V/m^2 */ - if (!model->B3SOIFDcdscdGiven) - model->B3SOIFDcdscd = 0.0; /* unit Q/V/m^2 */ - if (!model->B3SOIFDcitGiven) - model->B3SOIFDcit = 0.0; /* unit Q/V/m^2 */ - if (!model->B3SOIFDnfactorGiven) - model->B3SOIFDnfactor = 1; - if (!model->B3SOIFDvsatGiven) - model->B3SOIFDvsat = 8.0e4; /* unit m/s */ - if (!model->B3SOIFDatGiven) - model->B3SOIFDat = 3.3e4; /* unit m/s */ - if (!model->B3SOIFDa0Given) - model->B3SOIFDa0 = 1.0; - if (!model->B3SOIFDagsGiven) - model->B3SOIFDags = 0.0; - if (!model->B3SOIFDa1Given) - model->B3SOIFDa1 = 0.0; - if (!model->B3SOIFDa2Given) - model->B3SOIFDa2 = 1.0; - if (!model->B3SOIFDketaGiven) - model->B3SOIFDketa = -0.6; /* unit / V */ - if (!model->B3SOIFDnsubGiven) - model->B3SOIFDnsub = 6.0e16; /* unit 1/cm3 */ - if (!model->B3SOIFDnpeakGiven) - model->B3SOIFDnpeak = 1.7e17; /* unit 1/cm3 */ - if (!model->B3SOIFDngateGiven) - model->B3SOIFDngate = 0; /* unit 1/cm3 */ - if (!model->B3SOIFDvbmGiven) - model->B3SOIFDvbm = -3.0; - if (!model->B3SOIFDxtGiven) - model->B3SOIFDxt = 1.55e-7; - if (!model->B3SOIFDkt1Given) - model->B3SOIFDkt1 = -0.11; /* unit V */ - if (!model->B3SOIFDkt1lGiven) - model->B3SOIFDkt1l = 0.0; /* unit V*m */ - if (!model->B3SOIFDkt2Given) - model->B3SOIFDkt2 = 0.022; /* No unit */ - if (!model->B3SOIFDk3Given) - model->B3SOIFDk3 = 0.0; - if (!model->B3SOIFDk3bGiven) - model->B3SOIFDk3b = 0.0; - if (!model->B3SOIFDw0Given) - model->B3SOIFDw0 = 2.5e-6; - if (!model->B3SOIFDnlxGiven) - model->B3SOIFDnlx = 1.74e-7; - if (!model->B3SOIFDdvt0Given) - model->B3SOIFDdvt0 = 2.2; - if (!model->B3SOIFDdvt1Given) - model->B3SOIFDdvt1 = 0.53; - if (!model->B3SOIFDdvt2Given) - model->B3SOIFDdvt2 = -0.032; /* unit 1 / V */ - - if (!model->B3SOIFDdvt0wGiven) - model->B3SOIFDdvt0w = 0.0; - if (!model->B3SOIFDdvt1wGiven) - model->B3SOIFDdvt1w = 5.3e6; - if (!model->B3SOIFDdvt2wGiven) - model->B3SOIFDdvt2w = -0.032; - - if (!model->B3SOIFDdroutGiven) - model->B3SOIFDdrout = 0.56; - if (!model->B3SOIFDdsubGiven) - model->B3SOIFDdsub = model->B3SOIFDdrout; - if (!model->B3SOIFDvth0Given) - model->B3SOIFDvth0 = (model->B3SOIFDtype == NMOS) ? 0.7 : -0.7; - if (!model->B3SOIFDuaGiven) - model->B3SOIFDua = 2.25e-9; /* unit m/V */ - if (!model->B3SOIFDua1Given) - model->B3SOIFDua1 = 4.31e-9; /* unit m/V */ - if (!model->B3SOIFDubGiven) - model->B3SOIFDub = 5.87e-19; /* unit (m/V)**2 */ - if (!model->B3SOIFDub1Given) - model->B3SOIFDub1 = -7.61e-18; /* unit (m/V)**2 */ - if (!model->B3SOIFDucGiven) - model->B3SOIFDuc = (model->B3SOIFDmobMod == 3) ? -0.0465 : -0.0465e-9; - if (!model->B3SOIFDuc1Given) - model->B3SOIFDuc1 = (model->B3SOIFDmobMod == 3) ? -0.056 : -0.056e-9; - if (!model->B3SOIFDu0Given) - model->B3SOIFDu0 = (model->B3SOIFDtype == NMOS) ? 0.067 : 0.025; - if (!model->B3SOIFDuteGiven) - model->B3SOIFDute = -1.5; - if (!model->B3SOIFDvoffGiven) - model->B3SOIFDvoff = -0.08; - if (!model->B3SOIFDdeltaGiven) - model->B3SOIFDdelta = 0.01; - if (!model->B3SOIFDrdswGiven) - model->B3SOIFDrdsw = 100; - if (!model->B3SOIFDprwgGiven) - model->B3SOIFDprwg = 0.0; /* unit 1/V */ - if (!model->B3SOIFDprwbGiven) - model->B3SOIFDprwb = 0.0; - if (!model->B3SOIFDprtGiven) - model->B3SOIFDprt = 0.0; - if (!model->B3SOIFDeta0Given) - model->B3SOIFDeta0 = 0.08; /* no unit */ - if (!model->B3SOIFDetabGiven) - model->B3SOIFDetab = -0.07; /* unit 1/V */ - if (!model->B3SOIFDpclmGiven) - model->B3SOIFDpclm = 1.3; /* no unit */ - if (!model->B3SOIFDpdibl1Given) - model->B3SOIFDpdibl1 = .39; /* no unit */ - if (!model->B3SOIFDpdibl2Given) - model->B3SOIFDpdibl2 = 0.0086; /* no unit */ - if (!model->B3SOIFDpdiblbGiven) - model->B3SOIFDpdiblb = 0.0; /* 1/V */ - if (!model->B3SOIFDpvagGiven) - model->B3SOIFDpvag = 0.0; - if (!model->B3SOIFDwrGiven) - model->B3SOIFDwr = 1.0; - if (!model->B3SOIFDdwgGiven) - model->B3SOIFDdwg = 0.0; - if (!model->B3SOIFDdwbGiven) - model->B3SOIFDdwb = 0.0; - if (!model->B3SOIFDb0Given) - model->B3SOIFDb0 = 0.0; - if (!model->B3SOIFDb1Given) - model->B3SOIFDb1 = 0.0; - if (!model->B3SOIFDalpha0Given) - model->B3SOIFDalpha0 = 0.0; - if (!model->B3SOIFDalpha1Given) - model->B3SOIFDalpha1 = 1.0; - if (!model->B3SOIFDbeta0Given) - model->B3SOIFDbeta0 = 30.0; - - if (!model->B3SOIFDcgslGiven) - model->B3SOIFDcgsl = 0.0; - if (!model->B3SOIFDcgdlGiven) - model->B3SOIFDcgdl = 0.0; - if (!model->B3SOIFDckappaGiven) - model->B3SOIFDckappa = 0.6; - if (!model->B3SOIFDclcGiven) - model->B3SOIFDclc = 0.1e-7; - if (!model->B3SOIFDcleGiven) - model->B3SOIFDcle = 0.0; - if (!model->B3SOIFDtboxGiven) - model->B3SOIFDtbox = 3e-7; - if (!model->B3SOIFDtsiGiven) - model->B3SOIFDtsi = 1e-7; - if (!model->B3SOIFDxjGiven) - model->B3SOIFDxj = model->B3SOIFDtsi; - if (!model->B3SOIFDkb1Given) - model->B3SOIFDkb1 = 1; - if (!model->B3SOIFDkb3Given) - model->B3SOIFDkb3 = 1; - if (!model->B3SOIFDdvbd0Given) - model->B3SOIFDdvbd0 = 0.0; - if (!model->B3SOIFDdvbd1Given) - model->B3SOIFDdvbd1 = 0.0; - if (!model->B3SOIFDvbsaGiven) - model->B3SOIFDvbsa = 0.0; - if (!model->B3SOIFDdelpGiven) - model->B3SOIFDdelp = 0.02; - if (!model->B3SOIFDrbodyGiven) - model->B3SOIFDrbody = 0.0; - if (!model->B3SOIFDrbshGiven) - model->B3SOIFDrbsh = 0.0; - if (!model->B3SOIFDadice0Given) - model->B3SOIFDadice0 = 1; - if (!model->B3SOIFDabpGiven) - model->B3SOIFDabp = 1; - if (!model->B3SOIFDmxcGiven) - model->B3SOIFDmxc = -0.9; - if (!model->B3SOIFDrth0Given) - model->B3SOIFDrth0 = 0; - - if (!model->B3SOIFDcth0Given) - model->B3SOIFDcth0 =0; - - if (!model->B3SOIFDaiiGiven) - model->B3SOIFDaii = 0.0; - if (!model->B3SOIFDbiiGiven) - model->B3SOIFDbii = 0.0; - if (!model->B3SOIFDciiGiven) - model->B3SOIFDcii = 0.0; - if (!model->B3SOIFDdiiGiven) - model->B3SOIFDdii = -1.0; - if (!model->B3SOIFDagidlGiven) - model->B3SOIFDagidl = 0.0; - if (!model->B3SOIFDbgidlGiven) - model->B3SOIFDbgidl = 0.0; - if (!model->B3SOIFDngidlGiven) - model->B3SOIFDngidl = 1.2; - if (!model->B3SOIFDndiodeGiven) - model->B3SOIFDndiode = 1.0; - if (!model->B3SOIFDntunGiven) - model->B3SOIFDntun = 10.0; - if (!model->B3SOIFDisbjtGiven) - model->B3SOIFDisbjt = 1e-6; - if (!model->B3SOIFDisdifGiven) - model->B3SOIFDisdif = 0.0; - if (!model->B3SOIFDisrecGiven) - model->B3SOIFDisrec = 1e-5; - if (!model->B3SOIFDistunGiven) - model->B3SOIFDistun = 0.0; - if (!model->B3SOIFDxbjtGiven) - model->B3SOIFDxbjt = 2; - if (!model->B3SOIFDxdifGiven) - model->B3SOIFDxdif = 2; - if (!model->B3SOIFDxrecGiven) - model->B3SOIFDxrec = 20; - if (!model->B3SOIFDxtunGiven) - model->B3SOIFDxtun = 0; - if (!model->B3SOIFDedlGiven) - model->B3SOIFDedl = 2e-6; - if (!model->B3SOIFDkbjt1Given) - model->B3SOIFDkbjt1 = 0; - if (!model->B3SOIFDttGiven) - model->B3SOIFDtt = 1e-12; - if (!model->B3SOIFDasdGiven) - model->B3SOIFDasd = 0.3; - - /* unit degree celcius */ - if (!model->B3SOIFDtnomGiven) - model->B3SOIFDtnom = ckt->CKTnomTemp; - if (!model->B3SOIFDLintGiven) - model->B3SOIFDLint = 0.0; - if (!model->B3SOIFDLlGiven) - model->B3SOIFDLl = 0.0; - if (!model->B3SOIFDLlnGiven) - model->B3SOIFDLln = 1.0; - if (!model->B3SOIFDLwGiven) - model->B3SOIFDLw = 0.0; - if (!model->B3SOIFDLwnGiven) - model->B3SOIFDLwn = 1.0; - if (!model->B3SOIFDLwlGiven) - model->B3SOIFDLwl = 0.0; - if (!model->B3SOIFDLminGiven) - model->B3SOIFDLmin = 0.0; - if (!model->B3SOIFDLmaxGiven) - model->B3SOIFDLmax = 1.0; - if (!model->B3SOIFDWintGiven) - model->B3SOIFDWint = 0.0; - if (!model->B3SOIFDWlGiven) - model->B3SOIFDWl = 0.0; - if (!model->B3SOIFDWlnGiven) - model->B3SOIFDWln = 1.0; - if (!model->B3SOIFDWwGiven) - model->B3SOIFDWw = 0.0; - if (!model->B3SOIFDWwnGiven) - model->B3SOIFDWwn = 1.0; - if (!model->B3SOIFDWwlGiven) - model->B3SOIFDWwl = 0.0; - if (!model->B3SOIFDWminGiven) - model->B3SOIFDWmin = 0.0; - if (!model->B3SOIFDWmaxGiven) - model->B3SOIFDWmax = 1.0; - if (!model->B3SOIFDdwcGiven) - model->B3SOIFDdwc = model->B3SOIFDWint; - if (!model->B3SOIFDdlcGiven) - model->B3SOIFDdlc = model->B3SOIFDLint; - -/* Added for binning - START */ - /* Length dependence */ - if (!model->B3SOIFDlnpeakGiven) - model->B3SOIFDlnpeak = 0.0; - if (!model->B3SOIFDlnsubGiven) - model->B3SOIFDlnsub = 0.0; - if (!model->B3SOIFDlngateGiven) - model->B3SOIFDlngate = 0.0; - if (!model->B3SOIFDlvth0Given) - model->B3SOIFDlvth0 = 0.0; - if (!model->B3SOIFDlk1Given) - model->B3SOIFDlk1 = 0.0; - if (!model->B3SOIFDlk2Given) - model->B3SOIFDlk2 = 0.0; - if (!model->B3SOIFDlk3Given) - model->B3SOIFDlk3 = 0.0; - if (!model->B3SOIFDlk3bGiven) - model->B3SOIFDlk3b = 0.0; - if (!model->B3SOIFDlvbsaGiven) - model->B3SOIFDlvbsa = 0.0; - if (!model->B3SOIFDldelpGiven) - model->B3SOIFDldelp = 0.0; - if (!model->B3SOIFDlkb1Given) - model->B3SOIFDlkb1 = 0.0; - if (!model->B3SOIFDlkb3Given) - model->B3SOIFDlkb3 = 1.0; - if (!model->B3SOIFDldvbd0Given) - model->B3SOIFDldvbd0 = 1.0; - if (!model->B3SOIFDldvbd1Given) - model->B3SOIFDldvbd1 = 1.0; - if (!model->B3SOIFDlw0Given) - model->B3SOIFDlw0 = 0.0; - if (!model->B3SOIFDlnlxGiven) - model->B3SOIFDlnlx = 0.0; - if (!model->B3SOIFDldvt0Given) - model->B3SOIFDldvt0 = 0.0; - if (!model->B3SOIFDldvt1Given) - model->B3SOIFDldvt1 = 0.0; - if (!model->B3SOIFDldvt2Given) - model->B3SOIFDldvt2 = 0.0; - if (!model->B3SOIFDldvt0wGiven) - model->B3SOIFDldvt0w = 0.0; - if (!model->B3SOIFDldvt1wGiven) - model->B3SOIFDldvt1w = 0.0; - if (!model->B3SOIFDldvt2wGiven) - model->B3SOIFDldvt2w = 0.0; - if (!model->B3SOIFDlu0Given) - model->B3SOIFDlu0 = 0.0; - if (!model->B3SOIFDluaGiven) - model->B3SOIFDlua = 0.0; - if (!model->B3SOIFDlubGiven) - model->B3SOIFDlub = 0.0; - if (!model->B3SOIFDlucGiven) - model->B3SOIFDluc = 0.0; - if (!model->B3SOIFDlvsatGiven) - model->B3SOIFDlvsat = 0.0; - if (!model->B3SOIFDla0Given) - model->B3SOIFDla0 = 0.0; - if (!model->B3SOIFDlagsGiven) - model->B3SOIFDlags = 0.0; - if (!model->B3SOIFDlb0Given) - model->B3SOIFDlb0 = 0.0; - if (!model->B3SOIFDlb1Given) - model->B3SOIFDlb1 = 0.0; - if (!model->B3SOIFDlketaGiven) - model->B3SOIFDlketa = 0.0; - if (!model->B3SOIFDlabpGiven) - model->B3SOIFDlabp = 0.0; - if (!model->B3SOIFDlmxcGiven) - model->B3SOIFDlmxc = 0.0; - if (!model->B3SOIFDladice0Given) - model->B3SOIFDladice0 = 0.0; - if (!model->B3SOIFDla1Given) - model->B3SOIFDla1 = 0.0; - if (!model->B3SOIFDla2Given) - model->B3SOIFDla2 = 0.0; - if (!model->B3SOIFDlrdswGiven) - model->B3SOIFDlrdsw = 0.0; - if (!model->B3SOIFDlprwbGiven) - model->B3SOIFDlprwb = 0.0; - if (!model->B3SOIFDlprwgGiven) - model->B3SOIFDlprwg = 0.0; - if (!model->B3SOIFDlwrGiven) - model->B3SOIFDlwr = 0.0; - if (!model->B3SOIFDlnfactorGiven) - model->B3SOIFDlnfactor = 0.0; - if (!model->B3SOIFDldwgGiven) - model->B3SOIFDldwg = 0.0; - if (!model->B3SOIFDldwbGiven) - model->B3SOIFDldwb = 0.0; - if (!model->B3SOIFDlvoffGiven) - model->B3SOIFDlvoff = 0.0; - if (!model->B3SOIFDleta0Given) - model->B3SOIFDleta0 = 0.0; - if (!model->B3SOIFDletabGiven) - model->B3SOIFDletab = 0.0; - if (!model->B3SOIFDldsubGiven) - model->B3SOIFDldsub = 0.0; - if (!model->B3SOIFDlcitGiven) - model->B3SOIFDlcit = 0.0; - if (!model->B3SOIFDlcdscGiven) - model->B3SOIFDlcdsc = 0.0; - if (!model->B3SOIFDlcdscbGiven) - model->B3SOIFDlcdscb = 0.0; - if (!model->B3SOIFDlcdscdGiven) - model->B3SOIFDlcdscd = 0.0; - if (!model->B3SOIFDlpclmGiven) - model->B3SOIFDlpclm = 0.0; - if (!model->B3SOIFDlpdibl1Given) - model->B3SOIFDlpdibl1 = 0.0; - if (!model->B3SOIFDlpdibl2Given) - model->B3SOIFDlpdibl2 = 0.0; - if (!model->B3SOIFDlpdiblbGiven) - model->B3SOIFDlpdiblb = 0.0; - if (!model->B3SOIFDldroutGiven) - model->B3SOIFDldrout = 0.0; - if (!model->B3SOIFDlpvagGiven) - model->B3SOIFDlpvag = 0.0; - if (!model->B3SOIFDldeltaGiven) - model->B3SOIFDldelta = 0.0; - if (!model->B3SOIFDlaiiGiven) - model->B3SOIFDlaii = 0.0; - if (!model->B3SOIFDlbiiGiven) - model->B3SOIFDlbii = 0.0; - if (!model->B3SOIFDlciiGiven) - model->B3SOIFDlcii = 0.0; - if (!model->B3SOIFDldiiGiven) - model->B3SOIFDldii = 0.0; - if (!model->B3SOIFDlalpha0Given) - model->B3SOIFDlalpha0 = 0.0; - if (!model->B3SOIFDlalpha1Given) - model->B3SOIFDlalpha1 = 0.0; - if (!model->B3SOIFDlbeta0Given) - model->B3SOIFDlbeta0 = 0.0; - if (!model->B3SOIFDlagidlGiven) - model->B3SOIFDlagidl = 0.0; - if (!model->B3SOIFDlbgidlGiven) - model->B3SOIFDlbgidl = 0.0; - if (!model->B3SOIFDlngidlGiven) - model->B3SOIFDlngidl = 0.0; - if (!model->B3SOIFDlntunGiven) - model->B3SOIFDlntun = 0.0; - if (!model->B3SOIFDlndiodeGiven) - model->B3SOIFDlndiode = 0.0; - if (!model->B3SOIFDlisbjtGiven) - model->B3SOIFDlisbjt = 0.0; - if (!model->B3SOIFDlisdifGiven) - model->B3SOIFDlisdif = 0.0; - if (!model->B3SOIFDlisrecGiven) - model->B3SOIFDlisrec = 0.0; - if (!model->B3SOIFDlistunGiven) - model->B3SOIFDlistun = 0.0; - if (!model->B3SOIFDledlGiven) - model->B3SOIFDledl = 0.0; - if (!model->B3SOIFDlkbjt1Given) - model->B3SOIFDlkbjt1 = 0.0; - /* CV Model */ - if (!model->B3SOIFDlvsdfbGiven) - model->B3SOIFDlvsdfb = 0.0; - if (!model->B3SOIFDlvsdthGiven) - model->B3SOIFDlvsdth = 0.0; - /* Width dependence */ - if (!model->B3SOIFDwnpeakGiven) - model->B3SOIFDwnpeak = 0.0; - if (!model->B3SOIFDwnsubGiven) - model->B3SOIFDwnsub = 0.0; - if (!model->B3SOIFDwngateGiven) - model->B3SOIFDwngate = 0.0; - if (!model->B3SOIFDwvth0Given) - model->B3SOIFDwvth0 = 0.0; - if (!model->B3SOIFDwk1Given) - model->B3SOIFDwk1 = 0.0; - if (!model->B3SOIFDwk2Given) - model->B3SOIFDwk2 = 0.0; - if (!model->B3SOIFDwk3Given) - model->B3SOIFDwk3 = 0.0; - if (!model->B3SOIFDwk3bGiven) - model->B3SOIFDwk3b = 0.0; - if (!model->B3SOIFDwvbsaGiven) - model->B3SOIFDwvbsa = 0.0; - if (!model->B3SOIFDwdelpGiven) - model->B3SOIFDwdelp = 0.0; - if (!model->B3SOIFDwkb1Given) - model->B3SOIFDwkb1 = 0.0; - if (!model->B3SOIFDwkb3Given) - model->B3SOIFDwkb3 = 1.0; - if (!model->B3SOIFDwdvbd0Given) - model->B3SOIFDwdvbd0 = 1.0; - if (!model->B3SOIFDwdvbd1Given) - model->B3SOIFDwdvbd1 = 1.0; - if (!model->B3SOIFDww0Given) - model->B3SOIFDww0 = 0.0; - if (!model->B3SOIFDwnlxGiven) - model->B3SOIFDwnlx = 0.0; - if (!model->B3SOIFDwdvt0Given) - model->B3SOIFDwdvt0 = 0.0; - if (!model->B3SOIFDwdvt1Given) - model->B3SOIFDwdvt1 = 0.0; - if (!model->B3SOIFDwdvt2Given) - model->B3SOIFDwdvt2 = 0.0; - if (!model->B3SOIFDwdvt0wGiven) - model->B3SOIFDwdvt0w = 0.0; - if (!model->B3SOIFDwdvt1wGiven) - model->B3SOIFDwdvt1w = 0.0; - if (!model->B3SOIFDwdvt2wGiven) - model->B3SOIFDwdvt2w = 0.0; - if (!model->B3SOIFDwu0Given) - model->B3SOIFDwu0 = 0.0; - if (!model->B3SOIFDwuaGiven) - model->B3SOIFDwua = 0.0; - if (!model->B3SOIFDwubGiven) - model->B3SOIFDwub = 0.0; - if (!model->B3SOIFDwucGiven) - model->B3SOIFDwuc = 0.0; - if (!model->B3SOIFDwvsatGiven) - model->B3SOIFDwvsat = 0.0; - if (!model->B3SOIFDwa0Given) - model->B3SOIFDwa0 = 0.0; - if (!model->B3SOIFDwagsGiven) - model->B3SOIFDwags = 0.0; - if (!model->B3SOIFDwb0Given) - model->B3SOIFDwb0 = 0.0; - if (!model->B3SOIFDwb1Given) - model->B3SOIFDwb1 = 0.0; - if (!model->B3SOIFDwketaGiven) - model->B3SOIFDwketa = 0.0; - if (!model->B3SOIFDwabpGiven) - model->B3SOIFDwabp = 0.0; - if (!model->B3SOIFDwmxcGiven) - model->B3SOIFDwmxc = 0.0; - if (!model->B3SOIFDwadice0Given) - model->B3SOIFDwadice0 = 0.0; - if (!model->B3SOIFDwa1Given) - model->B3SOIFDwa1 = 0.0; - if (!model->B3SOIFDwa2Given) - model->B3SOIFDwa2 = 0.0; - if (!model->B3SOIFDwrdswGiven) - model->B3SOIFDwrdsw = 0.0; - if (!model->B3SOIFDwprwbGiven) - model->B3SOIFDwprwb = 0.0; - if (!model->B3SOIFDwprwgGiven) - model->B3SOIFDwprwg = 0.0; - if (!model->B3SOIFDwwrGiven) - model->B3SOIFDwwr = 0.0; - if (!model->B3SOIFDwnfactorGiven) - model->B3SOIFDwnfactor = 0.0; - if (!model->B3SOIFDwdwgGiven) - model->B3SOIFDwdwg = 0.0; - if (!model->B3SOIFDwdwbGiven) - model->B3SOIFDwdwb = 0.0; - if (!model->B3SOIFDwvoffGiven) - model->B3SOIFDwvoff = 0.0; - if (!model->B3SOIFDweta0Given) - model->B3SOIFDweta0 = 0.0; - if (!model->B3SOIFDwetabGiven) - model->B3SOIFDwetab = 0.0; - if (!model->B3SOIFDwdsubGiven) - model->B3SOIFDwdsub = 0.0; - if (!model->B3SOIFDwcitGiven) - model->B3SOIFDwcit = 0.0; - if (!model->B3SOIFDwcdscGiven) - model->B3SOIFDwcdsc = 0.0; - if (!model->B3SOIFDwcdscbGiven) - model->B3SOIFDwcdscb = 0.0; - if (!model->B3SOIFDwcdscdGiven) - model->B3SOIFDwcdscd = 0.0; - if (!model->B3SOIFDwpclmGiven) - model->B3SOIFDwpclm = 0.0; - if (!model->B3SOIFDwpdibl1Given) - model->B3SOIFDwpdibl1 = 0.0; - if (!model->B3SOIFDwpdibl2Given) - model->B3SOIFDwpdibl2 = 0.0; - if (!model->B3SOIFDwpdiblbGiven) - model->B3SOIFDwpdiblb = 0.0; - if (!model->B3SOIFDwdroutGiven) - model->B3SOIFDwdrout = 0.0; - if (!model->B3SOIFDwpvagGiven) - model->B3SOIFDwpvag = 0.0; - if (!model->B3SOIFDwdeltaGiven) - model->B3SOIFDwdelta = 0.0; - if (!model->B3SOIFDwaiiGiven) - model->B3SOIFDwaii = 0.0; - if (!model->B3SOIFDwbiiGiven) - model->B3SOIFDwbii = 0.0; - if (!model->B3SOIFDwciiGiven) - model->B3SOIFDwcii = 0.0; - if (!model->B3SOIFDwdiiGiven) - model->B3SOIFDwdii = 0.0; - if (!model->B3SOIFDwalpha0Given) - model->B3SOIFDwalpha0 = 0.0; - if (!model->B3SOIFDwalpha1Given) - model->B3SOIFDwalpha1 = 0.0; - if (!model->B3SOIFDwbeta0Given) - model->B3SOIFDwbeta0 = 0.0; - if (!model->B3SOIFDwagidlGiven) - model->B3SOIFDwagidl = 0.0; - if (!model->B3SOIFDwbgidlGiven) - model->B3SOIFDwbgidl = 0.0; - if (!model->B3SOIFDwngidlGiven) - model->B3SOIFDwngidl = 0.0; - if (!model->B3SOIFDwntunGiven) - model->B3SOIFDwntun = 0.0; - if (!model->B3SOIFDwndiodeGiven) - model->B3SOIFDwndiode = 0.0; - if (!model->B3SOIFDwisbjtGiven) - model->B3SOIFDwisbjt = 0.0; - if (!model->B3SOIFDwisdifGiven) - model->B3SOIFDwisdif = 0.0; - if (!model->B3SOIFDwisrecGiven) - model->B3SOIFDwisrec = 0.0; - if (!model->B3SOIFDwistunGiven) - model->B3SOIFDwistun = 0.0; - if (!model->B3SOIFDwedlGiven) - model->B3SOIFDwedl = 0.0; - if (!model->B3SOIFDwkbjt1Given) - model->B3SOIFDwkbjt1 = 0.0; - /* CV Model */ - if (!model->B3SOIFDwvsdfbGiven) - model->B3SOIFDwvsdfb = 0.0; - if (!model->B3SOIFDwvsdthGiven) - model->B3SOIFDwvsdth = 0.0; - /* Cross-term dependence */ - if (!model->B3SOIFDpnpeakGiven) - model->B3SOIFDpnpeak = 0.0; - if (!model->B3SOIFDpnsubGiven) - model->B3SOIFDpnsub = 0.0; - if (!model->B3SOIFDpngateGiven) - model->B3SOIFDpngate = 0.0; - if (!model->B3SOIFDpvth0Given) - model->B3SOIFDpvth0 = 0.0; - if (!model->B3SOIFDpk1Given) - model->B3SOIFDpk1 = 0.0; - if (!model->B3SOIFDpk2Given) - model->B3SOIFDpk2 = 0.0; - if (!model->B3SOIFDpk3Given) - model->B3SOIFDpk3 = 0.0; - if (!model->B3SOIFDpk3bGiven) - model->B3SOIFDpk3b = 0.0; - if (!model->B3SOIFDpvbsaGiven) - model->B3SOIFDpvbsa = 0.0; - if (!model->B3SOIFDpdelpGiven) - model->B3SOIFDpdelp = 0.0; - if (!model->B3SOIFDpkb1Given) - model->B3SOIFDpkb1 = 0.0; - if (!model->B3SOIFDpkb3Given) - model->B3SOIFDpkb3 = 1.0; - if (!model->B3SOIFDpdvbd0Given) - model->B3SOIFDpdvbd0 = 1.0; - if (!model->B3SOIFDpdvbd1Given) - model->B3SOIFDpdvbd1 = 1.0; - if (!model->B3SOIFDpw0Given) - model->B3SOIFDpw0 = 0.0; - if (!model->B3SOIFDpnlxGiven) - model->B3SOIFDpnlx = 0.0; - if (!model->B3SOIFDpdvt0Given) - model->B3SOIFDpdvt0 = 0.0; - if (!model->B3SOIFDpdvt1Given) - model->B3SOIFDpdvt1 = 0.0; - if (!model->B3SOIFDpdvt2Given) - model->B3SOIFDpdvt2 = 0.0; - if (!model->B3SOIFDpdvt0wGiven) - model->B3SOIFDpdvt0w = 0.0; - if (!model->B3SOIFDpdvt1wGiven) - model->B3SOIFDpdvt1w = 0.0; - if (!model->B3SOIFDpdvt2wGiven) - model->B3SOIFDpdvt2w = 0.0; - if (!model->B3SOIFDpu0Given) - model->B3SOIFDpu0 = 0.0; - if (!model->B3SOIFDpuaGiven) - model->B3SOIFDpua = 0.0; - if (!model->B3SOIFDpubGiven) - model->B3SOIFDpub = 0.0; - if (!model->B3SOIFDpucGiven) - model->B3SOIFDpuc = 0.0; - if (!model->B3SOIFDpvsatGiven) - model->B3SOIFDpvsat = 0.0; - if (!model->B3SOIFDpa0Given) - model->B3SOIFDpa0 = 0.0; - if (!model->B3SOIFDpagsGiven) - model->B3SOIFDpags = 0.0; - if (!model->B3SOIFDpb0Given) - model->B3SOIFDpb0 = 0.0; - if (!model->B3SOIFDpb1Given) - model->B3SOIFDpb1 = 0.0; - if (!model->B3SOIFDpketaGiven) - model->B3SOIFDpketa = 0.0; - if (!model->B3SOIFDpabpGiven) - model->B3SOIFDpabp = 0.0; - if (!model->B3SOIFDpmxcGiven) - model->B3SOIFDpmxc = 0.0; - if (!model->B3SOIFDpadice0Given) - model->B3SOIFDpadice0 = 0.0; - if (!model->B3SOIFDpa1Given) - model->B3SOIFDpa1 = 0.0; - if (!model->B3SOIFDpa2Given) - model->B3SOIFDpa2 = 0.0; - if (!model->B3SOIFDprdswGiven) - model->B3SOIFDprdsw = 0.0; - if (!model->B3SOIFDpprwbGiven) - model->B3SOIFDpprwb = 0.0; - if (!model->B3SOIFDpprwgGiven) - model->B3SOIFDpprwg = 0.0; - if (!model->B3SOIFDpwrGiven) - model->B3SOIFDpwr = 0.0; - if (!model->B3SOIFDpnfactorGiven) - model->B3SOIFDpnfactor = 0.0; - if (!model->B3SOIFDpdwgGiven) - model->B3SOIFDpdwg = 0.0; - if (!model->B3SOIFDpdwbGiven) - model->B3SOIFDpdwb = 0.0; - if (!model->B3SOIFDpvoffGiven) - model->B3SOIFDpvoff = 0.0; - if (!model->B3SOIFDpeta0Given) - model->B3SOIFDpeta0 = 0.0; - if (!model->B3SOIFDpetabGiven) - model->B3SOIFDpetab = 0.0; - if (!model->B3SOIFDpdsubGiven) - model->B3SOIFDpdsub = 0.0; - if (!model->B3SOIFDpcitGiven) - model->B3SOIFDpcit = 0.0; - if (!model->B3SOIFDpcdscGiven) - model->B3SOIFDpcdsc = 0.0; - if (!model->B3SOIFDpcdscbGiven) - model->B3SOIFDpcdscb = 0.0; - if (!model->B3SOIFDpcdscdGiven) - model->B3SOIFDpcdscd = 0.0; - if (!model->B3SOIFDppclmGiven) - model->B3SOIFDppclm = 0.0; - if (!model->B3SOIFDppdibl1Given) - model->B3SOIFDppdibl1 = 0.0; - if (!model->B3SOIFDppdibl2Given) - model->B3SOIFDppdibl2 = 0.0; - if (!model->B3SOIFDppdiblbGiven) - model->B3SOIFDppdiblb = 0.0; - if (!model->B3SOIFDpdroutGiven) - model->B3SOIFDpdrout = 0.0; - if (!model->B3SOIFDppvagGiven) - model->B3SOIFDppvag = 0.0; - if (!model->B3SOIFDpdeltaGiven) - model->B3SOIFDpdelta = 0.0; - if (!model->B3SOIFDpaiiGiven) - model->B3SOIFDpaii = 0.0; - if (!model->B3SOIFDpbiiGiven) - model->B3SOIFDpbii = 0.0; - if (!model->B3SOIFDpciiGiven) - model->B3SOIFDpcii = 0.0; - if (!model->B3SOIFDpdiiGiven) - model->B3SOIFDpdii = 0.0; - if (!model->B3SOIFDpalpha0Given) - model->B3SOIFDpalpha0 = 0.0; - if (!model->B3SOIFDpalpha1Given) - model->B3SOIFDpalpha1 = 0.0; - if (!model->B3SOIFDpbeta0Given) - model->B3SOIFDpbeta0 = 0.0; - if (!model->B3SOIFDpagidlGiven) - model->B3SOIFDpagidl = 0.0; - if (!model->B3SOIFDpbgidlGiven) - model->B3SOIFDpbgidl = 0.0; - if (!model->B3SOIFDpngidlGiven) - model->B3SOIFDpngidl = 0.0; - if (!model->B3SOIFDpntunGiven) - model->B3SOIFDpntun = 0.0; - if (!model->B3SOIFDpndiodeGiven) - model->B3SOIFDpndiode = 0.0; - if (!model->B3SOIFDpisbjtGiven) - model->B3SOIFDpisbjt = 0.0; - if (!model->B3SOIFDpisdifGiven) - model->B3SOIFDpisdif = 0.0; - if (!model->B3SOIFDpisrecGiven) - model->B3SOIFDpisrec = 0.0; - if (!model->B3SOIFDpistunGiven) - model->B3SOIFDpistun = 0.0; - if (!model->B3SOIFDpedlGiven) - model->B3SOIFDpedl = 0.0; - if (!model->B3SOIFDpkbjt1Given) - model->B3SOIFDpkbjt1 = 0.0; - /* CV Model */ - if (!model->B3SOIFDpvsdfbGiven) - model->B3SOIFDpvsdfb = 0.0; - if (!model->B3SOIFDpvsdthGiven) - model->B3SOIFDpvsdth = 0.0; -/* Added for binning - END */ - - if (!model->B3SOIFDcfGiven) - model->B3SOIFDcf = 2.0 * EPSOX / PI - * log(1.0 + 0.4e-6 / model->B3SOIFDtox); - if (!model->B3SOIFDcgdoGiven) - { if (model->B3SOIFDdlcGiven && (model->B3SOIFDdlc > 0.0)) - { model->B3SOIFDcgdo = model->B3SOIFDdlc * model->B3SOIFDcox - - model->B3SOIFDcgdl ; - } - else - model->B3SOIFDcgdo = 0.6 * model->B3SOIFDxj * model->B3SOIFDcox; - } - if (!model->B3SOIFDcgsoGiven) - { if (model->B3SOIFDdlcGiven && (model->B3SOIFDdlc > 0.0)) - { model->B3SOIFDcgso = model->B3SOIFDdlc * model->B3SOIFDcox - - model->B3SOIFDcgsl ; - } - else - model->B3SOIFDcgso = 0.6 * model->B3SOIFDxj * model->B3SOIFDcox; - } - - if (!model->B3SOIFDcgeoGiven) - { model->B3SOIFDcgeo = 0.0; - } - if (!model->B3SOIFDxpartGiven) - model->B3SOIFDxpart = 0.0; - if (!model->B3SOIFDsheetResistanceGiven) - model->B3SOIFDsheetResistance = 0.0; - if (!model->B3SOIFDcsdeswGiven) - model->B3SOIFDcsdesw = 0.0; - if (!model->B3SOIFDunitLengthGateSidewallJctCapGiven) - model->B3SOIFDunitLengthGateSidewallJctCap = 1e-10; - if (!model->B3SOIFDGatesidewallJctPotentialGiven) - model->B3SOIFDGatesidewallJctPotential = 0.7; - if (!model->B3SOIFDbodyJctGateSideGradingCoeffGiven) - model->B3SOIFDbodyJctGateSideGradingCoeff = 0.5; - if (!model->B3SOIFDoxideTrapDensityAGiven) - { if (model->B3SOIFDtype == NMOS) - model->B3SOIFDoxideTrapDensityA = 1e20; - else - model->B3SOIFDoxideTrapDensityA=9.9e18; - } - if (!model->B3SOIFDoxideTrapDensityBGiven) - { if (model->B3SOIFDtype == NMOS) - model->B3SOIFDoxideTrapDensityB = 5e4; - else - model->B3SOIFDoxideTrapDensityB = 2.4e3; - } - if (!model->B3SOIFDoxideTrapDensityCGiven) - { if (model->B3SOIFDtype == NMOS) - model->B3SOIFDoxideTrapDensityC = -1.4e-12; - else - model->B3SOIFDoxideTrapDensityC = 1.4e-12; - - } - if (!model->B3SOIFDemGiven) - model->B3SOIFDem = 4.1e7; /* V/m */ - if (!model->B3SOIFDefGiven) - model->B3SOIFDef = 1.0; - if (!model->B3SOIFDafGiven) - model->B3SOIFDaf = 1.0; - if (!model->B3SOIFDkfGiven) - model->B3SOIFDkf = 0.0; - if (!model->B3SOIFDnoifGiven) - model->B3SOIFDnoif = 1.0; - - /* loop through all the instances of the model */ - for (here = B3SOIFDinstances(model); here != NULL ; - here=B3SOIFDnextInstance(here)) - { - /* allocate a chunk of the state vector */ - here->B3SOIFDstates = *states; - *states += B3SOIFDnumStates; - - /* perform the parameter defaulting */ - if (!here->B3SOIFDdrainAreaGiven) - here->B3SOIFDdrainArea = 0.0; - if (!here->B3SOIFDdrainPerimeterGiven) - here->B3SOIFDdrainPerimeter = 0.0; - if (!here->B3SOIFDdrainSquaresGiven) - here->B3SOIFDdrainSquares = 1.0; - if (!here->B3SOIFDicVBSGiven) - here->B3SOIFDicVBS = 0; - if (!here->B3SOIFDicVDSGiven) - here->B3SOIFDicVDS = 0; - if (!here->B3SOIFDicVGSGiven) - here->B3SOIFDicVGS = 0; - if (!here->B3SOIFDicVESGiven) - here->B3SOIFDicVES = 0; - if (!here->B3SOIFDicVPSGiven) - here->B3SOIFDicVPS = 0; - if (!here->B3SOIFDbjtoffGiven) - here->B3SOIFDbjtoff = 0; - if (!here->B3SOIFDdebugModGiven) - here->B3SOIFDdebugMod = 0; - if (!here->B3SOIFDrth0Given) - here->B3SOIFDrth0 = model->B3SOIFDrth0; - if (!here->B3SOIFDcth0Given) - here->B3SOIFDcth0 = model->B3SOIFDcth0; - if (!here->B3SOIFDbodySquaresGiven) - here->B3SOIFDbodySquares = 1.0; - if (!here->B3SOIFDlGiven) - here->B3SOIFDl = 5e-6; - if (!here->B3SOIFDsourceAreaGiven) - here->B3SOIFDsourceArea = 0; - if (!here->B3SOIFDsourcePerimeterGiven) - here->B3SOIFDsourcePerimeter = 0; - if (!here->B3SOIFDsourceSquaresGiven) - here->B3SOIFDsourceSquares = 1; - if (!here->B3SOIFDwGiven) - here->B3SOIFDw = 5e-6; - - if (!here->B3SOIFDmGiven) - here->B3SOIFDm = 1; - - if (!here->B3SOIFDoffGiven) - here->B3SOIFDoff = 0; - - - /* process drain series resistance */ - if ((model->B3SOIFDsheetResistance > 0.0) && - (here->B3SOIFDdrainSquares > 0.0 ) && - (here->B3SOIFDdNodePrime == 0)) - { error = CKTmkVolt(ckt,&tmp,here->B3SOIFDname,"drain"); - if(error) return(error); - here->B3SOIFDdNodePrime = tmp->number; - - if (ckt->CKTcopyNodesets) { - if (CKTinst2Node(ckt,here,1,&tmpNode,&tmpName)==OK) { - if (tmpNode->nsGiven) { - tmp->nodeset=tmpNode->nodeset; - tmp->nsGiven=tmpNode->nsGiven; - } - } - } - - } - else - { here->B3SOIFDdNodePrime = here->B3SOIFDdNode; - } - - /* process source series resistance */ - if ((model->B3SOIFDsheetResistance > 0.0) && - (here->B3SOIFDsourceSquares > 0.0 ) && - (here->B3SOIFDsNodePrime == 0)) - { error = CKTmkVolt(ckt,&tmp,here->B3SOIFDname,"source"); - if(error) return(error); - here->B3SOIFDsNodePrime = tmp->number; - - if (ckt->CKTcopyNodesets) { - if (CKTinst2Node(ckt,here,3,&tmpNode,&tmpName)==OK) { - if (tmpNode->nsGiven) { - tmp->nodeset=tmpNode->nodeset; - tmp->nsGiven=tmpNode->nsGiven; - } - } - } - - } - else - { here->B3SOIFDsNodePrime = here->B3SOIFDsNode; - } - - /* process effective silicon film thickness */ - model->B3SOIFDcbox = 3.453133e-11 / model->B3SOIFDtbox; - model->B3SOIFDcsi = 1.03594e-10 / model->B3SOIFDtsi; - Cboxt = model->B3SOIFDcbox * model->B3SOIFDcsi / (model->B3SOIFDcbox + model->B3SOIFDcsi); - model->B3SOIFDqsi = Charge_q*model->B3SOIFDnpeak*1e6*model->B3SOIFDtsi; - /* Tsieff */ - tmp1 = 2.0 * EPSSI * model->B3SOIFDvbsa / Charge_q - / (1e6*model->B3SOIFDnpeak); - tmp2 = model->B3SOIFDtsi * model->B3SOIFDtsi; - if (tmp2 < tmp1) - { - fprintf(stderr, "vbsa = %.3f is too large for this tsi = %.3e and is automatically set to zero\n", model->B3SOIFDvbsa, model->B3SOIFDtsi); - model->B3SOIFDcsieff = model->B3SOIFDcsi; - model->B3SOIFDqsieff = model->B3SOIFDqsi; - } - else - { - tmp1 = sqrt(model->B3SOIFDtsi * model->B3SOIFDtsi - - 2.0 * EPSSI * model->B3SOIFDvbsa / Charge_q / - (1e6*model->B3SOIFDnpeak)); - model->B3SOIFDcsieff = 1.03594e-10 / tmp1; - model->B3SOIFDqsieff = Charge_q*model->B3SOIFDnpeak*1e6*tmp1; - } - model->B3SOIFDcsit = 1/(1/model->B3SOIFDcox + 1/model->B3SOIFDcsieff); - model->B3SOIFDcboxt = 1/(1/model->B3SOIFDcbox + 1/model->B3SOIFDcsieff); - nfb0 = 1/(1 + model->B3SOIFDcbox / model->B3SOIFDcsit); - model->B3SOIFDnfb = model->B3SOIFDkb3 * nfb0; - model->B3SOIFDadice = model->B3SOIFDadice0 / ( 1 + Cboxt / model->B3SOIFDcox); - - here->B3SOIFDfloat = 0; - - here->B3SOIFDpNode = here->B3SOIFDpNodeExt; - here->B3SOIFDbNode = here->B3SOIFDbNodeExt; - here->B3SOIFDtempNode = here->B3SOIFDtempNodeExt; - - if (here->B3SOIFDbNode == -1) - /* no internal body node is needed for SPICE iteration */ - { here->B3SOIFDbNode = here->B3SOIFDpNode = 0; - here->B3SOIFDbodyMod = 0; - } - else /* body tied */ - { if ((model->B3SOIFDrbody == 0.0) && (model->B3SOIFDrbsh == 0.0)) - { /* ideal body tie */ - here->B3SOIFDbodyMod = 2; - /* pNode is not used in this case */ - } - else { - error = CKTmkVolt(ckt, &tmp, here->B3SOIFDname, "Body"); - if(error) return(error); - here->B3SOIFDbodyMod = 1; - here->B3SOIFDpNode = here->B3SOIFDbNode; - here->B3SOIFDbNode = tmp->number; - } - } - - if ((model->B3SOIFDshMod == 1) && (here->B3SOIFDrth0!=0)) - { - error = CKTmkVolt(ckt,&tmp,here->B3SOIFDname,"Temp"); - if(error) return(error); - here->B3SOIFDtempNode = tmp->number; - - } else { - here->B3SOIFDtempNode = 0; - } - -/* here for debugging purpose only */ - if ((here->B3SOIFDdebugMod > 1) || (here->B3SOIFDdebugMod == -1)) - { - /* The real Vbs value */ - error = CKTmkVolt(ckt, &tmp, here->B3SOIFDname, "Vbs"); - if(error) return(error); - here->B3SOIFDvbsNode = tmp->number; - - error = CKTmkVolt(ckt, &tmp, here->B3SOIFDname, "Ids"); - if(error) return(error); - here->B3SOIFDidsNode = tmp->number; - - error = CKTmkVolt(ckt, &tmp, here->B3SOIFDname, "Ic"); - if(error) return(error); - here->B3SOIFDicNode = tmp->number; - - error = CKTmkVolt(ckt, &tmp, here->B3SOIFDname, "Ibs"); - if(error) return(error); - here->B3SOIFDibsNode = tmp->number; - - error = CKTmkVolt(ckt, &tmp, here->B3SOIFDname, "Ibd"); - if(error) return(error); - here->B3SOIFDibdNode = tmp->number; - - error = CKTmkVolt(ckt, &tmp, here->B3SOIFDname, "Iii"); - if(error) return(error); - here->B3SOIFDiiiNode = tmp->number; - - error = CKTmkVolt(ckt, &tmp, here->B3SOIFDname, "Igidl"); - if(error) return(error); - here->B3SOIFDigidlNode = tmp->number; - - error = CKTmkVolt(ckt, &tmp, here->B3SOIFDname, "Itun"); - if(error) return(error); - here->B3SOIFDitunNode = tmp->number; - - error = CKTmkVolt(ckt, &tmp, here->B3SOIFDname, "Ibp"); - if(error) return(error); - here->B3SOIFDibpNode = tmp->number; - - error = CKTmkVolt(ckt, &tmp, here->B3SOIFDname, "Abeff"); - if(error) return(error); - here->B3SOIFDabeffNode = tmp->number; - - error = CKTmkVolt(ckt, &tmp, here->B3SOIFDname, "Vbs0eff"); - if(error) return(error); - here->B3SOIFDvbs0effNode = tmp->number; - - error = CKTmkVolt(ckt, &tmp, here->B3SOIFDname, "Vbseff"); - if(error) return(error); - here->B3SOIFDvbseffNode = tmp->number; - - error = CKTmkVolt(ckt, &tmp, here->B3SOIFDname, "Xc"); - if(error) return(error); - here->B3SOIFDxcNode = tmp->number; - - error = CKTmkVolt(ckt, &tmp, here->B3SOIFDname, "Cbb"); - if(error) return(error); - here->B3SOIFDcbbNode = tmp->number; - - error = CKTmkVolt(ckt, &tmp, here->B3SOIFDname, "Cbd"); - if(error) return(error); - here->B3SOIFDcbdNode = tmp->number; - - error = CKTmkVolt(ckt, &tmp, here->B3SOIFDname, "Cbg"); - if(error) return(error); - here->B3SOIFDcbgNode = tmp->number; - - error = CKTmkVolt(ckt, &tmp, here->B3SOIFDname, "Qbody"); - if(error) return(error); - here->B3SOIFDqbNode = tmp->number; - - error = CKTmkVolt(ckt, &tmp, here->B3SOIFDname, "Qbf"); - if(error) return(error); - here->B3SOIFDqbfNode = tmp->number; - - error = CKTmkVolt(ckt, &tmp, here->B3SOIFDname, "Qjs"); - if(error) return(error); - here->B3SOIFDqjsNode = tmp->number; - - error = CKTmkVolt(ckt, &tmp, here->B3SOIFDname, "Qjd"); - if(error) return(error); - here->B3SOIFDqjdNode = tmp->number; - - /* clean up last */ - error = CKTmkVolt(ckt, &tmp, here->B3SOIFDname, "Gm"); - if(error) return(error); - here->B3SOIFDgmNode = tmp->number; - - error = CKTmkVolt(ckt, &tmp, here->B3SOIFDname, "Gmbs"); - if(error) return(error); - here->B3SOIFDgmbsNode = tmp->number; - - error = CKTmkVolt(ckt, &tmp, here->B3SOIFDname, "Gds"); - if(error) return(error); - here->B3SOIFDgdsNode = tmp->number; - - error = CKTmkVolt(ckt, &tmp, here->B3SOIFDname, "Gme"); - if(error) return(error); - here->B3SOIFDgmeNode = tmp->number; - - error = CKTmkVolt(ckt, &tmp, here->B3SOIFDname, "Vbs0teff"); - if(error) return(error); - here->B3SOIFDvbs0teffNode = tmp->number; - - error = CKTmkVolt(ckt, &tmp, here->B3SOIFDname, "Vth"); - if(error) return(error); - here->B3SOIFDvthNode = tmp->number; - - error = CKTmkVolt(ckt, &tmp, here->B3SOIFDname, "Vgsteff"); - if(error) return(error); - here->B3SOIFDvgsteffNode = tmp->number; - - error = CKTmkVolt(ckt, &tmp, here->B3SOIFDname, "Xcsat"); - if(error) return(error); - here->B3SOIFDxcsatNode = tmp->number; - - error = CKTmkVolt(ckt, &tmp, here->B3SOIFDname, "Qac0"); - if(error) return(error); - here->B3SOIFDqaccNode = tmp->number; - - error = CKTmkVolt(ckt, &tmp, here->B3SOIFDname, "Qsub0"); - if(error) return(error); - here->B3SOIFDqsub0Node = tmp->number; - - error = CKTmkVolt(ckt, &tmp, here->B3SOIFDname, "Qsubs1"); - if(error) return(error); - here->B3SOIFDqsubs1Node = tmp->number; - - error = CKTmkVolt(ckt, &tmp, here->B3SOIFDname, "Qsubs2"); - if(error) return(error); - here->B3SOIFDqsubs2Node = tmp->number; - - error = CKTmkVolt(ckt, &tmp, here->B3SOIFDname, "Qsub"); - if(error) return(error); - here->B3SOIFDqeNode = tmp->number; - - error = CKTmkVolt(ckt, &tmp, here->B3SOIFDname, "Qdrn"); - if(error) return(error); - here->B3SOIFDqdNode = tmp->number; - - error = CKTmkVolt(ckt, &tmp, here->B3SOIFDname, "Qgate"); - if(error) return(error); - here->B3SOIFDqgNode = tmp->number; - - error = CKTmkVolt(ckt, &tmp, here->B3SOIFDname, "Vdscv"); - if(error) return(error); - here->B3SOIFDvdscvNode = tmp->number; - - error = CKTmkVolt(ckt, &tmp, here->B3SOIFDname, "Vcscv"); - if(error) return(error); - here->B3SOIFDvcscvNode = tmp->number; - - error = CKTmkVolt(ckt, &tmp, here->B3SOIFDname, "Cbe"); - if(error) return(error); - here->B3SOIFDcbeNode = tmp->number; - - error = CKTmkVolt(ckt, &tmp, here->B3SOIFDname, "Dum1"); - if(error) return(error); - here->B3SOIFDdum1Node = tmp->number; - - error = CKTmkVolt(ckt, &tmp, here->B3SOIFDname, "Dum2"); - if(error) return(error); - here->B3SOIFDdum2Node = tmp->number; - - error = CKTmkVolt(ckt, &tmp, here->B3SOIFDname, "Dum3"); - if(error) return(error); - here->B3SOIFDdum3Node = tmp->number; - - error = CKTmkVolt(ckt, &tmp, here->B3SOIFDname, "Dum4"); - if(error) return(error); - here->B3SOIFDdum4Node = tmp->number; - - error = CKTmkVolt(ckt, &tmp, here->B3SOIFDname, "Dum5"); - if(error) return(error); - here->B3SOIFDdum5Node = tmp->number; - } - - /* set Sparse Matrix Pointers */ - -/* macro to make elements with built in test for out of memory */ -#define TSTALLOC(ptr,first,second) \ -do { if((here->ptr = SMPmakeElt(matrix, here->first, here->second)) == NULL){\ - return(E_NOMEM);\ -} } while(0) - - - if ((model->B3SOIFDshMod == 1) && (here->B3SOIFDrth0!=0.0)) { - TSTALLOC(B3SOIFDTemptempPtr, B3SOIFDtempNode, B3SOIFDtempNode); - TSTALLOC(B3SOIFDTempdpPtr, B3SOIFDtempNode, B3SOIFDdNodePrime); - TSTALLOC(B3SOIFDTempspPtr, B3SOIFDtempNode, B3SOIFDsNodePrime); - TSTALLOC(B3SOIFDTempgPtr, B3SOIFDtempNode, B3SOIFDgNode); - TSTALLOC(B3SOIFDTempbPtr, B3SOIFDtempNode, B3SOIFDbNode); - TSTALLOC(B3SOIFDTempePtr, B3SOIFDtempNode, B3SOIFDeNode); - - TSTALLOC(B3SOIFDGtempPtr, B3SOIFDgNode, B3SOIFDtempNode); - TSTALLOC(B3SOIFDDPtempPtr, B3SOIFDdNodePrime, B3SOIFDtempNode); - TSTALLOC(B3SOIFDSPtempPtr, B3SOIFDsNodePrime, B3SOIFDtempNode); - TSTALLOC(B3SOIFDEtempPtr, B3SOIFDeNode, B3SOIFDtempNode); - TSTALLOC(B3SOIFDBtempPtr, B3SOIFDbNode, B3SOIFDtempNode); - - if (here->B3SOIFDbodyMod == 1) { - TSTALLOC(B3SOIFDPtempPtr, B3SOIFDpNode, B3SOIFDtempNode); - } - } - if (here->B3SOIFDbodyMod == 2) { - /* Don't create any Jacobian entry for pNode */ - } - else if (here->B3SOIFDbodyMod == 1) { - TSTALLOC(B3SOIFDBpPtr, B3SOIFDbNode, B3SOIFDpNode); - TSTALLOC(B3SOIFDPbPtr, B3SOIFDpNode, B3SOIFDbNode); - TSTALLOC(B3SOIFDPpPtr, B3SOIFDpNode, B3SOIFDpNode); - TSTALLOC(B3SOIFDPgPtr, B3SOIFDpNode, B3SOIFDgNode); - TSTALLOC(B3SOIFDPdpPtr, B3SOIFDpNode, B3SOIFDdNodePrime); - TSTALLOC(B3SOIFDPspPtr, B3SOIFDpNode, B3SOIFDsNodePrime); - TSTALLOC(B3SOIFDPePtr, B3SOIFDpNode, B3SOIFDeNode); - } - - TSTALLOC(B3SOIFDEgPtr, B3SOIFDeNode, B3SOIFDgNode); - TSTALLOC(B3SOIFDEdpPtr, B3SOIFDeNode, B3SOIFDdNodePrime); - TSTALLOC(B3SOIFDEspPtr, B3SOIFDeNode, B3SOIFDsNodePrime); - TSTALLOC(B3SOIFDGePtr, B3SOIFDgNode, B3SOIFDeNode); - TSTALLOC(B3SOIFDDPePtr, B3SOIFDdNodePrime, B3SOIFDeNode); - TSTALLOC(B3SOIFDSPePtr, B3SOIFDsNodePrime, B3SOIFDeNode); - - TSTALLOC(B3SOIFDEbPtr, B3SOIFDeNode, B3SOIFDbNode); - TSTALLOC(B3SOIFDEePtr, B3SOIFDeNode, B3SOIFDeNode); - - TSTALLOC(B3SOIFDGgPtr, B3SOIFDgNode, B3SOIFDgNode); - TSTALLOC(B3SOIFDGdpPtr, B3SOIFDgNode, B3SOIFDdNodePrime); - TSTALLOC(B3SOIFDGspPtr, B3SOIFDgNode, B3SOIFDsNodePrime); - - TSTALLOC(B3SOIFDDPgPtr, B3SOIFDdNodePrime, B3SOIFDgNode); - TSTALLOC(B3SOIFDDPdpPtr, B3SOIFDdNodePrime, B3SOIFDdNodePrime); - TSTALLOC(B3SOIFDDPspPtr, B3SOIFDdNodePrime, B3SOIFDsNodePrime); - TSTALLOC(B3SOIFDDPdPtr, B3SOIFDdNodePrime, B3SOIFDdNode); - - TSTALLOC(B3SOIFDSPgPtr, B3SOIFDsNodePrime, B3SOIFDgNode); - TSTALLOC(B3SOIFDSPdpPtr, B3SOIFDsNodePrime, B3SOIFDdNodePrime); - TSTALLOC(B3SOIFDSPspPtr, B3SOIFDsNodePrime, B3SOIFDsNodePrime); - TSTALLOC(B3SOIFDSPsPtr, B3SOIFDsNodePrime, B3SOIFDsNode); - - TSTALLOC(B3SOIFDDdPtr, B3SOIFDdNode, B3SOIFDdNode); - TSTALLOC(B3SOIFDDdpPtr, B3SOIFDdNode, B3SOIFDdNodePrime); - - TSTALLOC(B3SOIFDSsPtr, B3SOIFDsNode, B3SOIFDsNode); - TSTALLOC(B3SOIFDSspPtr, B3SOIFDsNode, B3SOIFDsNodePrime); - -/* here for debugging purpose only */ - if ((here->B3SOIFDdebugMod > 1) || (here->B3SOIFDdebugMod == -1)) - { - TSTALLOC(B3SOIFDVbsPtr, B3SOIFDvbsNode, B3SOIFDvbsNode) ; - TSTALLOC(B3SOIFDIdsPtr, B3SOIFDidsNode, B3SOIFDidsNode); - TSTALLOC(B3SOIFDIcPtr, B3SOIFDicNode, B3SOIFDicNode); - TSTALLOC(B3SOIFDIbsPtr, B3SOIFDibsNode, B3SOIFDibsNode); - TSTALLOC(B3SOIFDIbdPtr, B3SOIFDibdNode, B3SOIFDibdNode); - TSTALLOC(B3SOIFDIiiPtr, B3SOIFDiiiNode, B3SOIFDiiiNode); - TSTALLOC(B3SOIFDIgidlPtr, B3SOIFDigidlNode, B3SOIFDigidlNode); - TSTALLOC(B3SOIFDItunPtr, B3SOIFDitunNode, B3SOIFDitunNode); - TSTALLOC(B3SOIFDIbpPtr, B3SOIFDibpNode, B3SOIFDibpNode); - TSTALLOC(B3SOIFDAbeffPtr, B3SOIFDabeffNode, B3SOIFDabeffNode); - TSTALLOC(B3SOIFDVbs0effPtr, B3SOIFDvbs0effNode, B3SOIFDvbs0effNode); - TSTALLOC(B3SOIFDVbseffPtr, B3SOIFDvbseffNode, B3SOIFDvbseffNode); - TSTALLOC(B3SOIFDXcPtr, B3SOIFDxcNode, B3SOIFDxcNode); - TSTALLOC(B3SOIFDCbbPtr, B3SOIFDcbbNode, B3SOIFDcbbNode); - TSTALLOC(B3SOIFDCbdPtr, B3SOIFDcbdNode, B3SOIFDcbdNode); - TSTALLOC(B3SOIFDCbgPtr, B3SOIFDcbgNode, B3SOIFDcbgNode); - TSTALLOC(B3SOIFDqbPtr, B3SOIFDqbNode, B3SOIFDqbNode); - TSTALLOC(B3SOIFDQbfPtr, B3SOIFDqbfNode, B3SOIFDqbfNode); - TSTALLOC(B3SOIFDQjsPtr, B3SOIFDqjsNode, B3SOIFDqjsNode); - TSTALLOC(B3SOIFDQjdPtr, B3SOIFDqjdNode, B3SOIFDqjdNode); - - /* clean up last */ - TSTALLOC(B3SOIFDGmPtr, B3SOIFDgmNode, B3SOIFDgmNode); - TSTALLOC(B3SOIFDGmbsPtr, B3SOIFDgmbsNode, B3SOIFDgmbsNode); - TSTALLOC(B3SOIFDGdsPtr, B3SOIFDgdsNode, B3SOIFDgdsNode); - TSTALLOC(B3SOIFDGmePtr, B3SOIFDgmeNode, B3SOIFDgmeNode); - TSTALLOC(B3SOIFDVbs0teffPtr, B3SOIFDvbs0teffNode, B3SOIFDvbs0teffNode); - TSTALLOC(B3SOIFDVthPtr, B3SOIFDvthNode, B3SOIFDvthNode); - TSTALLOC(B3SOIFDVgsteffPtr, B3SOIFDvgsteffNode, B3SOIFDvgsteffNode); - TSTALLOC(B3SOIFDXcsatPtr, B3SOIFDxcsatNode, B3SOIFDxcsatNode); - TSTALLOC(B3SOIFDVcscvPtr, B3SOIFDvcscvNode, B3SOIFDvcscvNode); - TSTALLOC(B3SOIFDVdscvPtr, B3SOIFDvdscvNode, B3SOIFDvdscvNode); - TSTALLOC(B3SOIFDCbePtr, B3SOIFDcbeNode, B3SOIFDcbeNode); - TSTALLOC(B3SOIFDDum1Ptr, B3SOIFDdum1Node, B3SOIFDdum1Node); - TSTALLOC(B3SOIFDDum2Ptr, B3SOIFDdum2Node, B3SOIFDdum2Node); - TSTALLOC(B3SOIFDDum3Ptr, B3SOIFDdum3Node, B3SOIFDdum3Node); - TSTALLOC(B3SOIFDDum4Ptr, B3SOIFDdum4Node, B3SOIFDdum4Node); - TSTALLOC(B3SOIFDDum5Ptr, B3SOIFDdum5Node, B3SOIFDdum5Node); - TSTALLOC(B3SOIFDQaccPtr, B3SOIFDqaccNode, B3SOIFDqaccNode); - TSTALLOC(B3SOIFDQsub0Ptr, B3SOIFDqsub0Node, B3SOIFDqsub0Node); - TSTALLOC(B3SOIFDQsubs1Ptr, B3SOIFDqsubs1Node, B3SOIFDqsubs1Node); - TSTALLOC(B3SOIFDQsubs2Ptr, B3SOIFDqsubs2Node, B3SOIFDqsubs2Node); - TSTALLOC(B3SOIFDqePtr, B3SOIFDqeNode, B3SOIFDqeNode); - TSTALLOC(B3SOIFDqdPtr, B3SOIFDqdNode, B3SOIFDqdNode); - TSTALLOC(B3SOIFDqgPtr, B3SOIFDqgNode, B3SOIFDqgNode); - } - - } - } - return(OK); -} - -int -B3SOIFDunsetup(GENmodel *inModel, CKTcircuit *ckt) -{ - B3SOIFDmodel *model; - B3SOIFDinstance *here; - - for (model = (B3SOIFDmodel *)inModel; model != NULL; - model = B3SOIFDnextModel(model)) - { - for (here = B3SOIFDinstances(model); here != NULL; - here=B3SOIFDnextInstance(here)) - { - /* here for debugging purpose only */ - if (here->B3SOIFDdum5Node > 0) - CKTdltNNum(ckt, here->B3SOIFDdum5Node); - here->B3SOIFDdum5Node = 0; - - if (here->B3SOIFDdum4Node > 0) - CKTdltNNum(ckt, here->B3SOIFDdum4Node); - here->B3SOIFDdum4Node = 0; - - if (here->B3SOIFDdum3Node > 0) - CKTdltNNum(ckt, here->B3SOIFDdum3Node); - here->B3SOIFDdum3Node = 0; - - if (here->B3SOIFDdum2Node > 0) - CKTdltNNum(ckt, here->B3SOIFDdum2Node); - here->B3SOIFDdum2Node = 0; - - if (here->B3SOIFDdum1Node > 0) - CKTdltNNum(ckt, here->B3SOIFDdum1Node); - here->B3SOIFDdum1Node = 0; - - if (here->B3SOIFDcbeNode > 0) - CKTdltNNum(ckt, here->B3SOIFDcbeNode); - here->B3SOIFDcbeNode = 0; - - if (here->B3SOIFDvcscvNode > 0) - CKTdltNNum(ckt, here->B3SOIFDvcscvNode); - here->B3SOIFDvcscvNode = 0; - - if (here->B3SOIFDvdscvNode > 0) - CKTdltNNum(ckt, here->B3SOIFDvdscvNode); - here->B3SOIFDvdscvNode = 0; - - if (here->B3SOIFDqgNode > 0) - CKTdltNNum(ckt, here->B3SOIFDqgNode); - here->B3SOIFDqgNode = 0; - - if (here->B3SOIFDqdNode > 0) - CKTdltNNum(ckt, here->B3SOIFDqdNode); - here->B3SOIFDqdNode = 0; - - if (here->B3SOIFDqeNode > 0) - CKTdltNNum(ckt, here->B3SOIFDqeNode); - here->B3SOIFDqeNode = 0; - - if (here->B3SOIFDqsubs2Node > 0) - CKTdltNNum(ckt, here->B3SOIFDqsubs2Node); - here->B3SOIFDqsubs2Node = 0; - - if (here->B3SOIFDqsubs1Node > 0) - CKTdltNNum(ckt, here->B3SOIFDqsubs1Node); - here->B3SOIFDqsubs1Node = 0; - - if (here->B3SOIFDqsub0Node > 0) - CKTdltNNum(ckt, here->B3SOIFDqsub0Node); - here->B3SOIFDqsub0Node = 0; - - if (here->B3SOIFDqaccNode > 0) - CKTdltNNum(ckt, here->B3SOIFDqaccNode); - here->B3SOIFDqaccNode = 0; - - if (here->B3SOIFDxcsatNode > 0) - CKTdltNNum(ckt, here->B3SOIFDxcsatNode); - here->B3SOIFDxcsatNode = 0; - - if (here->B3SOIFDvgsteffNode > 0) - CKTdltNNum(ckt, here->B3SOIFDvgsteffNode); - here->B3SOIFDvgsteffNode = 0; - - if (here->B3SOIFDvthNode > 0) - CKTdltNNum(ckt, here->B3SOIFDvthNode); - here->B3SOIFDvthNode = 0; - - if (here->B3SOIFDvbs0teffNode > 0) - CKTdltNNum(ckt, here->B3SOIFDvbs0teffNode); - here->B3SOIFDvbs0teffNode = 0; - - if (here->B3SOIFDgmeNode > 0) - CKTdltNNum(ckt, here->B3SOIFDgmeNode); - here->B3SOIFDgmeNode = 0; - - if (here->B3SOIFDgdsNode > 0) - CKTdltNNum(ckt, here->B3SOIFDgdsNode); - here->B3SOIFDgdsNode = 0; - - if (here->B3SOIFDgmbsNode > 0) - CKTdltNNum(ckt, here->B3SOIFDgmbsNode); - here->B3SOIFDgmbsNode = 0; - - if (here->B3SOIFDgmNode > 0) - CKTdltNNum(ckt, here->B3SOIFDgmNode); - here->B3SOIFDgmNode = 0; - - if (here->B3SOIFDqjdNode > 0) - CKTdltNNum(ckt, here->B3SOIFDqjdNode); - here->B3SOIFDqjdNode = 0; - - if (here->B3SOIFDqjsNode > 0) - CKTdltNNum(ckt, here->B3SOIFDqjsNode); - here->B3SOIFDqjsNode = 0; - - if (here->B3SOIFDqbfNode > 0) - CKTdltNNum(ckt, here->B3SOIFDqbfNode); - here->B3SOIFDqbfNode = 0; - - if (here->B3SOIFDqbNode > 0) - CKTdltNNum(ckt, here->B3SOIFDqbNode); - here->B3SOIFDqbNode = 0; - - if (here->B3SOIFDcbgNode > 0) - CKTdltNNum(ckt, here->B3SOIFDcbgNode); - here->B3SOIFDcbgNode = 0; - - if (here->B3SOIFDcbdNode > 0) - CKTdltNNum(ckt, here->B3SOIFDcbdNode); - here->B3SOIFDcbdNode = 0; - - if (here->B3SOIFDcbbNode > 0) - CKTdltNNum(ckt, here->B3SOIFDcbbNode); - here->B3SOIFDcbbNode = 0; - - if (here->B3SOIFDxcNode > 0) - CKTdltNNum(ckt, here->B3SOIFDxcNode); - here->B3SOIFDxcNode = 0; - - if (here->B3SOIFDvbseffNode > 0) - CKTdltNNum(ckt, here->B3SOIFDvbseffNode); - here->B3SOIFDvbseffNode = 0; - - if (here->B3SOIFDvbs0effNode > 0) - CKTdltNNum(ckt, here->B3SOIFDvbs0effNode); - here->B3SOIFDvbs0effNode = 0; - - if (here->B3SOIFDabeffNode > 0) - CKTdltNNum(ckt, here->B3SOIFDabeffNode); - here->B3SOIFDabeffNode = 0; - - if (here->B3SOIFDibpNode > 0) - CKTdltNNum(ckt, here->B3SOIFDibpNode); - here->B3SOIFDibpNode = 0; - - if (here->B3SOIFDitunNode > 0) - CKTdltNNum(ckt, here->B3SOIFDitunNode); - here->B3SOIFDitunNode = 0; - - if (here->B3SOIFDigidlNode > 0) - CKTdltNNum(ckt, here->B3SOIFDigidlNode); - here->B3SOIFDigidlNode = 0; - - if (here->B3SOIFDiiiNode > 0) - CKTdltNNum(ckt, here->B3SOIFDiiiNode); - here->B3SOIFDiiiNode = 0; - - if (here->B3SOIFDibdNode > 0) - CKTdltNNum(ckt, here->B3SOIFDibdNode); - here->B3SOIFDibdNode = 0; - - if (here->B3SOIFDibsNode > 0) - CKTdltNNum(ckt, here->B3SOIFDibsNode); - here->B3SOIFDibsNode = 0; - - if (here->B3SOIFDicNode > 0) - CKTdltNNum(ckt, here->B3SOIFDicNode); - here->B3SOIFDicNode = 0; - - if (here->B3SOIFDidsNode > 0) - CKTdltNNum(ckt, here->B3SOIFDidsNode); - here->B3SOIFDidsNode = 0; - - if (here->B3SOIFDvbsNode > 0) - CKTdltNNum(ckt, here->B3SOIFDvbsNode); - here->B3SOIFDvbsNode = 0; - - - if (here->B3SOIFDtempNode > 0 && - here->B3SOIFDtempNode != here->B3SOIFDtempNodeExt && - here->B3SOIFDtempNode != here->B3SOIFDbNodeExt && - here->B3SOIFDtempNode != here->B3SOIFDpNodeExt) - CKTdltNNum(ckt, here->B3SOIFDtempNode); - here->B3SOIFDtempNode = 0; - - if (here->B3SOIFDbNode > 0 && - here->B3SOIFDbNode != here->B3SOIFDbNodeExt && - here->B3SOIFDbNode != here->B3SOIFDpNodeExt) - CKTdltNNum(ckt, here->B3SOIFDbNode); - here->B3SOIFDbNode = 0; - - here->B3SOIFDpNode = 0; - - if (here->B3SOIFDsNodePrime > 0 - && here->B3SOIFDsNodePrime != here->B3SOIFDsNode) - CKTdltNNum(ckt, here->B3SOIFDsNodePrime); - here->B3SOIFDsNodePrime = 0; - - if (here->B3SOIFDdNodePrime > 0 - && here->B3SOIFDdNodePrime != here->B3SOIFDdNode) - CKTdltNNum(ckt, here->B3SOIFDdNodePrime); - here->B3SOIFDdNodePrime = 0; - } - } - return OK; -} - diff --git a/src/spicelib/devices/bsim3soi_fd/b3soifdtemp.c b/src/spicelib/devices/bsim3soi_fd/b3soifdtemp.c deleted file mode 100644 index d589e4354..000000000 --- a/src/spicelib/devices/bsim3soi_fd/b3soifdtemp.c +++ /dev/null @@ -1,813 +0,0 @@ -/********** -Copyright 1999 Regents of the University of California. All rights reserved. -Author: 1998 Samuel Fung, Dennis Sinitsky and Stephen Tang -File: b3soifdtemp.c 98/5/01 -Modified by Pin Su, Wei Jin 99/9/27 -Modified by Paolo Nenzi 2002 -**********/ - -/* - * Revision 2.1 99/9/27 Pin Su - * BSIMFD2.1 release - */ - -/* Lmin, Lmax, Wmin, Wmax */ - -#include "ngspice/ngspice.h" -#include "ngspice/smpdefs.h" -#include "ngspice/cktdefs.h" -#include "b3soifddef.h" -#include "ngspice/const.h" -#include "ngspice/sperror.h" -#include "ngspice/suffix.h" - -#define Kb 1.3806226e-23 -#define KboQ 8.617087e-5 /* Kb / q where q = 1.60219e-19 */ -#define EPSOX 3.453133e-11 -#define EPSSI 1.03594e-10 -#define PI 3.141592654 -#define MAX_EXP 5.834617425e14 -#define MIN_EXP 1.713908431e-15 -#define EXP_THRESHOLD 34.0 -#define Charge_q 1.60219e-19 - - -/* ARGSUSED */ -int -B3SOIFDtemp(GENmodel *inModel, CKTcircuit *ckt) -{ -B3SOIFDmodel *model = (B3SOIFDmodel*) inModel; -B3SOIFDinstance *here; -struct b3soifdSizeDependParam *pSizeDependParamKnot, *pLastKnot, *pParam=NULL; -double tmp, tmp1, tmp2, Eg, Eg0, ni, T0, T1, T2, T3, T4, T5, T6, Ldrn, Wdrn; -double Temp, TRatio, Inv_L, Inv_W, Inv_LW, Vtm0, Tnom; -double SDphi, SDgamma; -int Size_Not_Found; - - /* loop through all the B3SOIFD device models */ - for (; model != NULL; model = B3SOIFDnextModel(model)) - { Temp = ckt->CKTtemp; - if (model->B3SOIFDGatesidewallJctPotential < 0.1) - model->B3SOIFDGatesidewallJctPotential = 0.1; - - struct b3soifdSizeDependParam *p = model->pSizeDependParamKnot; - while (p) { - struct b3soifdSizeDependParam *next_p = p->pNext; - FREE(p); - p = next_p; - } - model->pSizeDependParamKnot = NULL; - pLastKnot = NULL; - - Tnom = model->B3SOIFDtnom; - TRatio = Temp / Tnom; - - model->B3SOIFDvcrit = CONSTvt0 * log(CONSTvt0 / (CONSTroot2 * 1.0e-14)); - model->B3SOIFDfactor1 = sqrt(EPSSI / EPSOX * model->B3SOIFDtox); - - Vtm0 = KboQ * Tnom; - Eg0 = 1.16 - 7.02e-4 * Tnom * Tnom / (Tnom + 1108.0); - model->B3SOIFDeg0 = Eg0; - model->B3SOIFDvtm = KboQ * Temp; - - Eg = 1.16 - 7.02e-4 * Temp * Temp / (Temp + 1108.0); - /* ni is in cm^-3 */ - ni = 1.45e10 * (Temp / 300.15) * sqrt(Temp / 300.15) - * exp(21.5565981 - Eg / (2.0 * model->B3SOIFDvtm)); - - - /* loop through all the instances of the model */ - /* MCJ: Length and Width not initialized */ - for (here = B3SOIFDinstances(model); here != NULL; - here = B3SOIFDnextInstance(here)) - { - here->B3SOIFDrbodyext = here->B3SOIFDbodySquares * - model->B3SOIFDrbsh; - pSizeDependParamKnot = model->pSizeDependParamKnot; - Size_Not_Found = 1; - while ((pSizeDependParamKnot != NULL) && Size_Not_Found) - { if ((here->B3SOIFDl == pSizeDependParamKnot->Length) - && (here->B3SOIFDw == pSizeDependParamKnot->Width) - && (here->B3SOIFDrth0 == pSizeDependParamKnot->Rth0) - && (here->B3SOIFDcth0 == pSizeDependParamKnot->Cth0)) - { Size_Not_Found = 0; - here->pParam = pSizeDependParamKnot; - } - else - { pLastKnot = pSizeDependParamKnot; - pSizeDependParamKnot = pSizeDependParamKnot->pNext; - } - } - - if (Size_Not_Found) - { pParam = TMALLOC(struct b3soifdSizeDependParam, 1); - if (pLastKnot == NULL) - model->pSizeDependParamKnot = pParam; - else - pLastKnot->pNext = pParam; - pParam->pNext = NULL; - here->pParam = pParam; - - Ldrn = here->B3SOIFDl; - Wdrn = here->B3SOIFDw; - pParam->Length = Ldrn; - pParam->Width = Wdrn; - pParam->Rth0 = here->B3SOIFDrth0; - pParam->Cth0 = here->B3SOIFDcth0; - - T0 = pow(Ldrn, model->B3SOIFDLln); - T1 = pow(Wdrn, model->B3SOIFDLwn); - tmp1 = model->B3SOIFDLl / T0 + model->B3SOIFDLw / T1 - + model->B3SOIFDLwl / (T0 * T1); - pParam->B3SOIFDdl = model->B3SOIFDLint + tmp1; - pParam->B3SOIFDdlc = model->B3SOIFDdlc + tmp1; - - T2 = pow(Ldrn, model->B3SOIFDWln); - T3 = pow(Wdrn, model->B3SOIFDWwn); - tmp2 = model->B3SOIFDWl / T2 + model->B3SOIFDWw / T3 - + model->B3SOIFDWwl / (T2 * T3); - pParam->B3SOIFDdw = model->B3SOIFDWint + tmp2; - pParam->B3SOIFDdwc = model->B3SOIFDdwc + tmp2; - - pParam->B3SOIFDleff = here->B3SOIFDl - 2.0 * pParam->B3SOIFDdl; - if (pParam->B3SOIFDleff <= 0.0) - { - SPfrontEnd->IFerrorf (ERR_FATAL, - "B3SOIFD: mosfet %s, model %s: Effective channel length <= 0", - model->B3SOIFDmodName, here->B3SOIFDname); - return(E_BADPARM); - } - - pParam->B3SOIFDweff = here->B3SOIFDw - 2.0 * pParam->B3SOIFDdw; - if (pParam->B3SOIFDweff <= 0.0) - { - SPfrontEnd->IFerrorf (ERR_FATAL, - "B3SOIFD: mosfet %s, model %s: Effective channel width <= 0", - model->B3SOIFDmodName, here->B3SOIFDname); - return(E_BADPARM); - } - - pParam->B3SOIFDleffCV = here->B3SOIFDl - 2.0 * pParam->B3SOIFDdlc; - if (pParam->B3SOIFDleffCV <= 0.0) - { - SPfrontEnd->IFerrorf (ERR_FATAL, - "B3SOIFD: mosfet %s, model %s: Effective channel length for C-V <= 0", - model->B3SOIFDmodName, here->B3SOIFDname); - return(E_BADPARM); - } - - pParam->B3SOIFDweffCV = here->B3SOIFDw - 2.0 * pParam->B3SOIFDdwc; - if (pParam->B3SOIFDweffCV <= 0.0) - { - SPfrontEnd->IFerrorf (ERR_FATAL, - "B3SOIFD: mosfet %s, model %s: Effective channel width for C-V <= 0", - model->B3SOIFDmodName, here->B3SOIFDname); - return(E_BADPARM); - } - - /* Not binned - START */ - pParam->B3SOIFDat = model->B3SOIFDat; - pParam->B3SOIFDgamma1 = model->B3SOIFDgamma1; - pParam->B3SOIFDgamma2 = model->B3SOIFDgamma2; - pParam->B3SOIFDvbx = model->B3SOIFDvbx; - pParam->B3SOIFDvbm = model->B3SOIFDvbm; - pParam->B3SOIFDxt = model->B3SOIFDxt; - pParam->B3SOIFDkt1 = model->B3SOIFDkt1; - pParam->B3SOIFDkt1l = model->B3SOIFDkt1l; - pParam->B3SOIFDkt2 = model->B3SOIFDkt2; - pParam->B3SOIFDua1 = model->B3SOIFDua1; - pParam->B3SOIFDub1 = model->B3SOIFDub1; - pParam->B3SOIFDuc1 = model->B3SOIFDuc1; - pParam->B3SOIFDute = model->B3SOIFDute; - pParam->B3SOIFDprt = model->B3SOIFDprt; - /* Not binned - END */ - - /* CV model */ - pParam->B3SOIFDcgsl = model->B3SOIFDcgsl; - pParam->B3SOIFDcgdl = model->B3SOIFDcgdl; - pParam->B3SOIFDckappa = model->B3SOIFDckappa; - pParam->B3SOIFDcf = model->B3SOIFDcf; - pParam->B3SOIFDclc = model->B3SOIFDclc; - pParam->B3SOIFDcle = model->B3SOIFDcle; - - pParam->B3SOIFDabulkCVfactor = pow(1.0+(pParam->B3SOIFDclc - / pParam->B3SOIFDleff), - pParam->B3SOIFDcle); - -/* Added for binning - START */ - if (model->B3SOIFDbinUnit == 1) - { Inv_L = 1.0e-6 / pParam->B3SOIFDleff; - Inv_W = 1.0e-6 / pParam->B3SOIFDweff; - Inv_LW = 1.0e-12 / (pParam->B3SOIFDleff - * pParam->B3SOIFDweff); - } - else - { Inv_L = 1.0 / pParam->B3SOIFDleff; - Inv_W = 1.0 / pParam->B3SOIFDweff; - Inv_LW = 1.0 / (pParam->B3SOIFDleff - * pParam->B3SOIFDweff); - } - pParam->B3SOIFDnpeak = model->B3SOIFDnpeak - + model->B3SOIFDlnpeak * Inv_L - + model->B3SOIFDwnpeak * Inv_W - + model->B3SOIFDpnpeak * Inv_LW; - pParam->B3SOIFDnsub = model->B3SOIFDnsub - + model->B3SOIFDlnsub * Inv_L - + model->B3SOIFDwnsub * Inv_W - + model->B3SOIFDpnsub * Inv_LW; - pParam->B3SOIFDngate = model->B3SOIFDngate - + model->B3SOIFDlngate * Inv_L - + model->B3SOIFDwngate * Inv_W - + model->B3SOIFDpngate * Inv_LW; - pParam->B3SOIFDvth0 = model->B3SOIFDvth0 - + model->B3SOIFDlvth0 * Inv_L - + model->B3SOIFDwvth0 * Inv_W - + model->B3SOIFDpvth0 * Inv_LW; - pParam->B3SOIFDk1 = model->B3SOIFDk1 - + model->B3SOIFDlk1 * Inv_L - + model->B3SOIFDwk1 * Inv_W - + model->B3SOIFDpk1 * Inv_LW; - pParam->B3SOIFDk2 = model->B3SOIFDk2 - + model->B3SOIFDlk2 * Inv_L - + model->B3SOIFDwk2 * Inv_W - + model->B3SOIFDpk2 * Inv_LW; - pParam->B3SOIFDk3 = model->B3SOIFDk3 - + model->B3SOIFDlk3 * Inv_L - + model->B3SOIFDwk3 * Inv_W - + model->B3SOIFDpk3 * Inv_LW; - pParam->B3SOIFDk3b = model->B3SOIFDk3b - + model->B3SOIFDlk3b * Inv_L - + model->B3SOIFDwk3b * Inv_W - + model->B3SOIFDpk3b * Inv_LW; - pParam->B3SOIFDvbsa = model->B3SOIFDvbsa - + model->B3SOIFDlvbsa * Inv_L - + model->B3SOIFDwvbsa * Inv_W - + model->B3SOIFDpvbsa * Inv_LW; - pParam->B3SOIFDdelp = model->B3SOIFDdelp - + model->B3SOIFDldelp * Inv_L - + model->B3SOIFDwdelp * Inv_W - + model->B3SOIFDpdelp * Inv_LW; - pParam->B3SOIFDkb1 = model->B3SOIFDkb1 - + model->B3SOIFDlkb1 * Inv_L - + model->B3SOIFDwkb1 * Inv_W - + model->B3SOIFDpkb1 * Inv_LW; - pParam->B3SOIFDkb3 = model->B3SOIFDkb3 - + model->B3SOIFDlkb3 * Inv_L - + model->B3SOIFDwkb3 * Inv_W - + model->B3SOIFDpkb3 * Inv_LW; - pParam->B3SOIFDdvbd0 = model->B3SOIFDdvbd0 - + model->B3SOIFDldvbd0 * Inv_L - + model->B3SOIFDwdvbd0 * Inv_W - + model->B3SOIFDpdvbd0 * Inv_LW; - pParam->B3SOIFDdvbd1 = model->B3SOIFDdvbd1 - + model->B3SOIFDldvbd1 * Inv_L - + model->B3SOIFDwdvbd1 * Inv_W - + model->B3SOIFDpdvbd1 * Inv_LW; - pParam->B3SOIFDw0 = model->B3SOIFDw0 - + model->B3SOIFDlw0 * Inv_L - + model->B3SOIFDww0 * Inv_W - + model->B3SOIFDpw0 * Inv_LW; - pParam->B3SOIFDnlx = model->B3SOIFDnlx - + model->B3SOIFDlnlx * Inv_L - + model->B3SOIFDwnlx * Inv_W - + model->B3SOIFDpnlx * Inv_LW; - pParam->B3SOIFDdvt0 = model->B3SOIFDdvt0 - + model->B3SOIFDldvt0 * Inv_L - + model->B3SOIFDwdvt0 * Inv_W - + model->B3SOIFDpdvt0 * Inv_LW; - pParam->B3SOIFDdvt1 = model->B3SOIFDdvt1 - + model->B3SOIFDldvt1 * Inv_L - + model->B3SOIFDwdvt1 * Inv_W - + model->B3SOIFDpdvt1 * Inv_LW; - pParam->B3SOIFDdvt2 = model->B3SOIFDdvt2 - + model->B3SOIFDldvt2 * Inv_L - + model->B3SOIFDwdvt2 * Inv_W - + model->B3SOIFDpdvt2 * Inv_LW; - pParam->B3SOIFDdvt0w = model->B3SOIFDdvt0w - + model->B3SOIFDldvt0w * Inv_L - + model->B3SOIFDwdvt0w * Inv_W - + model->B3SOIFDpdvt0w * Inv_LW; - pParam->B3SOIFDdvt1w = model->B3SOIFDdvt1w - + model->B3SOIFDldvt1w * Inv_L - + model->B3SOIFDwdvt1w * Inv_W - + model->B3SOIFDpdvt1w * Inv_LW; - pParam->B3SOIFDdvt2w = model->B3SOIFDdvt2w - + model->B3SOIFDldvt2w * Inv_L - + model->B3SOIFDwdvt2w * Inv_W - + model->B3SOIFDpdvt2w * Inv_LW; - pParam->B3SOIFDu0 = model->B3SOIFDu0 - + model->B3SOIFDlu0 * Inv_L - + model->B3SOIFDwu0 * Inv_W - + model->B3SOIFDpu0 * Inv_LW; - pParam->B3SOIFDua = model->B3SOIFDua - + model->B3SOIFDlua * Inv_L - + model->B3SOIFDwua * Inv_W - + model->B3SOIFDpua * Inv_LW; - pParam->B3SOIFDub = model->B3SOIFDub - + model->B3SOIFDlub * Inv_L - + model->B3SOIFDwub * Inv_W - + model->B3SOIFDpub * Inv_LW; - pParam->B3SOIFDuc = model->B3SOIFDuc - + model->B3SOIFDluc * Inv_L - + model->B3SOIFDwuc * Inv_W - + model->B3SOIFDpuc * Inv_LW; - pParam->B3SOIFDvsat = model->B3SOIFDvsat - + model->B3SOIFDlvsat * Inv_L - + model->B3SOIFDwvsat * Inv_W - + model->B3SOIFDpvsat * Inv_LW; - pParam->B3SOIFDa0 = model->B3SOIFDa0 - + model->B3SOIFDla0 * Inv_L - + model->B3SOIFDwa0 * Inv_W - + model->B3SOIFDpa0 * Inv_LW; - pParam->B3SOIFDags = model->B3SOIFDags - + model->B3SOIFDlags * Inv_L - + model->B3SOIFDwags * Inv_W - + model->B3SOIFDpags * Inv_LW; - pParam->B3SOIFDb0 = model->B3SOIFDb0 - + model->B3SOIFDlb0 * Inv_L - + model->B3SOIFDwb0 * Inv_W - + model->B3SOIFDpb0 * Inv_LW; - pParam->B3SOIFDb1 = model->B3SOIFDb1 - + model->B3SOIFDlb1 * Inv_L - + model->B3SOIFDwb1 * Inv_W - + model->B3SOIFDpb1 * Inv_LW; - pParam->B3SOIFDketa = model->B3SOIFDketa - + model->B3SOIFDlketa * Inv_L - + model->B3SOIFDwketa * Inv_W - + model->B3SOIFDpketa * Inv_LW; - pParam->B3SOIFDabp = model->B3SOIFDabp - + model->B3SOIFDlabp * Inv_L - + model->B3SOIFDwabp * Inv_W - + model->B3SOIFDpabp * Inv_LW; - pParam->B3SOIFDmxc = model->B3SOIFDmxc - + model->B3SOIFDlmxc * Inv_L - + model->B3SOIFDwmxc * Inv_W - + model->B3SOIFDpmxc * Inv_LW; - pParam->B3SOIFDadice0 = model->B3SOIFDadice0 - + model->B3SOIFDladice0 * Inv_L - + model->B3SOIFDwadice0 * Inv_W - + model->B3SOIFDpadice0 * Inv_LW; - pParam->B3SOIFDa1 = model->B3SOIFDa1 - + model->B3SOIFDla1 * Inv_L - + model->B3SOIFDwa1 * Inv_W - + model->B3SOIFDpa1 * Inv_LW; - pParam->B3SOIFDa2 = model->B3SOIFDa2 - + model->B3SOIFDla2 * Inv_L - + model->B3SOIFDwa2 * Inv_W - + model->B3SOIFDpa2 * Inv_LW; - pParam->B3SOIFDrdsw = model->B3SOIFDrdsw - + model->B3SOIFDlrdsw * Inv_L - + model->B3SOIFDwrdsw * Inv_W - + model->B3SOIFDprdsw * Inv_LW; - pParam->B3SOIFDprwb = model->B3SOIFDprwb - + model->B3SOIFDlprwb * Inv_L - + model->B3SOIFDwprwb * Inv_W - + model->B3SOIFDpprwb * Inv_LW; - pParam->B3SOIFDprwg = model->B3SOIFDprwg - + model->B3SOIFDlprwg * Inv_L - + model->B3SOIFDwprwg * Inv_W - + model->B3SOIFDpprwg * Inv_LW; - pParam->B3SOIFDwr = model->B3SOIFDwr - + model->B3SOIFDlwr * Inv_L - + model->B3SOIFDwwr * Inv_W - + model->B3SOIFDpwr * Inv_LW; - pParam->B3SOIFDnfactor = model->B3SOIFDnfactor - + model->B3SOIFDlnfactor * Inv_L - + model->B3SOIFDwnfactor * Inv_W - + model->B3SOIFDpnfactor * Inv_LW; - pParam->B3SOIFDdwg = model->B3SOIFDdwg - + model->B3SOIFDldwg * Inv_L - + model->B3SOIFDwdwg * Inv_W - + model->B3SOIFDpdwg * Inv_LW; - pParam->B3SOIFDdwb = model->B3SOIFDdwb - + model->B3SOIFDldwb * Inv_L - + model->B3SOIFDwdwb * Inv_W - + model->B3SOIFDpdwb * Inv_LW; - pParam->B3SOIFDvoff = model->B3SOIFDvoff - + model->B3SOIFDlvoff * Inv_L - + model->B3SOIFDwvoff * Inv_W - + model->B3SOIFDpvoff * Inv_LW; - pParam->B3SOIFDeta0 = model->B3SOIFDeta0 - + model->B3SOIFDleta0 * Inv_L - + model->B3SOIFDweta0 * Inv_W - + model->B3SOIFDpeta0 * Inv_LW; - pParam->B3SOIFDetab = model->B3SOIFDetab - + model->B3SOIFDletab * Inv_L - + model->B3SOIFDwetab * Inv_W - + model->B3SOIFDpetab * Inv_LW; - pParam->B3SOIFDdsub = model->B3SOIFDdsub - + model->B3SOIFDldsub * Inv_L - + model->B3SOIFDwdsub * Inv_W - + model->B3SOIFDpdsub * Inv_LW; - pParam->B3SOIFDcit = model->B3SOIFDcit - + model->B3SOIFDlcit * Inv_L - + model->B3SOIFDwcit * Inv_W - + model->B3SOIFDpcit * Inv_LW; - pParam->B3SOIFDcdsc = model->B3SOIFDcdsc - + model->B3SOIFDlcdsc * Inv_L - + model->B3SOIFDwcdsc * Inv_W - + model->B3SOIFDpcdsc * Inv_LW; - pParam->B3SOIFDcdscb = model->B3SOIFDcdscb - + model->B3SOIFDlcdscb * Inv_L - + model->B3SOIFDwcdscb * Inv_W - + model->B3SOIFDpcdscb * Inv_LW; - pParam->B3SOIFDcdscd = model->B3SOIFDcdscd - + model->B3SOIFDlcdscd * Inv_L - + model->B3SOIFDwcdscd * Inv_W - + model->B3SOIFDpcdscd * Inv_LW; - pParam->B3SOIFDpclm = model->B3SOIFDpclm - + model->B3SOIFDlpclm * Inv_L - + model->B3SOIFDwpclm * Inv_W - + model->B3SOIFDppclm * Inv_LW; - pParam->B3SOIFDpdibl1 = model->B3SOIFDpdibl1 - + model->B3SOIFDlpdibl1 * Inv_L - + model->B3SOIFDwpdibl1 * Inv_W - + model->B3SOIFDppdibl1 * Inv_LW; - pParam->B3SOIFDpdibl2 = model->B3SOIFDpdibl2 - + model->B3SOIFDlpdibl2 * Inv_L - + model->B3SOIFDwpdibl2 * Inv_W - + model->B3SOIFDppdibl2 * Inv_LW; - pParam->B3SOIFDpdiblb = model->B3SOIFDpdiblb - + model->B3SOIFDlpdiblb * Inv_L - + model->B3SOIFDwpdiblb * Inv_W - + model->B3SOIFDppdiblb * Inv_LW; - pParam->B3SOIFDdrout = model->B3SOIFDdrout - + model->B3SOIFDldrout * Inv_L - + model->B3SOIFDwdrout * Inv_W - + model->B3SOIFDpdrout * Inv_LW; - pParam->B3SOIFDpvag = model->B3SOIFDpvag - + model->B3SOIFDlpvag * Inv_L - + model->B3SOIFDwpvag * Inv_W - + model->B3SOIFDppvag * Inv_LW; - pParam->B3SOIFDdelta = model->B3SOIFDdelta - + model->B3SOIFDldelta * Inv_L - + model->B3SOIFDwdelta * Inv_W - + model->B3SOIFDpdelta * Inv_LW; - pParam->B3SOIFDaii = model->B3SOIFDaii - + model->B3SOIFDlaii * Inv_L - + model->B3SOIFDwaii * Inv_W - + model->B3SOIFDpaii * Inv_LW; - pParam->B3SOIFDbii = model->B3SOIFDbii - + model->B3SOIFDlbii * Inv_L - + model->B3SOIFDwbii * Inv_W - + model->B3SOIFDpbii * Inv_LW; - pParam->B3SOIFDcii = model->B3SOIFDcii - + model->B3SOIFDlcii * Inv_L - + model->B3SOIFDwcii * Inv_W - + model->B3SOIFDpcii * Inv_LW; - pParam->B3SOIFDdii = model->B3SOIFDdii - + model->B3SOIFDldii * Inv_L - + model->B3SOIFDwdii * Inv_W - + model->B3SOIFDpdii * Inv_LW; - pParam->B3SOIFDalpha0 = model->B3SOIFDalpha0 - + model->B3SOIFDlalpha0 * Inv_L - + model->B3SOIFDwalpha0 * Inv_W - + model->B3SOIFDpalpha0 * Inv_LW; - pParam->B3SOIFDalpha1 = model->B3SOIFDalpha1 - + model->B3SOIFDlalpha1 * Inv_L - + model->B3SOIFDwalpha1 * Inv_W - + model->B3SOIFDpalpha1 * Inv_LW; - pParam->B3SOIFDbeta0 = model->B3SOIFDbeta0 - + model->B3SOIFDlbeta0 * Inv_L - + model->B3SOIFDwbeta0 * Inv_W - + model->B3SOIFDpbeta0 * Inv_LW; - pParam->B3SOIFDagidl = model->B3SOIFDagidl - + model->B3SOIFDlagidl * Inv_L - + model->B3SOIFDwagidl * Inv_W - + model->B3SOIFDpagidl * Inv_LW; - pParam->B3SOIFDbgidl = model->B3SOIFDbgidl - + model->B3SOIFDlbgidl * Inv_L - + model->B3SOIFDwbgidl * Inv_W - + model->B3SOIFDpbgidl * Inv_LW; - pParam->B3SOIFDngidl = model->B3SOIFDngidl - + model->B3SOIFDlngidl * Inv_L - + model->B3SOIFDwngidl * Inv_W - + model->B3SOIFDpngidl * Inv_LW; - pParam->B3SOIFDntun = model->B3SOIFDntun - + model->B3SOIFDlntun * Inv_L - + model->B3SOIFDwntun * Inv_W - + model->B3SOIFDpntun * Inv_LW; - pParam->B3SOIFDndiode = model->B3SOIFDndiode - + model->B3SOIFDlndiode * Inv_L - + model->B3SOIFDwndiode * Inv_W - + model->B3SOIFDpndiode * Inv_LW; - pParam->B3SOIFDisbjt = model->B3SOIFDisbjt - + model->B3SOIFDlisbjt * Inv_L - + model->B3SOIFDwisbjt * Inv_W - + model->B3SOIFDpisbjt * Inv_LW; - pParam->B3SOIFDisdif = model->B3SOIFDisdif - + model->B3SOIFDlisdif * Inv_L - + model->B3SOIFDwisdif * Inv_W - + model->B3SOIFDpisdif * Inv_LW; - pParam->B3SOIFDisrec = model->B3SOIFDisrec - + model->B3SOIFDlisrec * Inv_L - + model->B3SOIFDwisrec * Inv_W - + model->B3SOIFDpisrec * Inv_LW; - pParam->B3SOIFDistun = model->B3SOIFDistun - + model->B3SOIFDlistun * Inv_L - + model->B3SOIFDwistun * Inv_W - + model->B3SOIFDpistun * Inv_LW; - pParam->B3SOIFDedl = model->B3SOIFDedl - + model->B3SOIFDledl * Inv_L - + model->B3SOIFDwedl * Inv_W - + model->B3SOIFDpedl * Inv_LW; - pParam->B3SOIFDkbjt1 = model->B3SOIFDkbjt1 - + model->B3SOIFDlkbjt1 * Inv_L - + model->B3SOIFDwkbjt1 * Inv_W - + model->B3SOIFDpkbjt1 * Inv_LW; - /* CV model */ - pParam->B3SOIFDvsdfb = model->B3SOIFDvsdfb - + model->B3SOIFDlvsdfb * Inv_L - + model->B3SOIFDwvsdfb * Inv_W - + model->B3SOIFDpvsdfb * Inv_LW; - pParam->B3SOIFDvsdth = model->B3SOIFDvsdth - + model->B3SOIFDlvsdth * Inv_L - + model->B3SOIFDwvsdth * Inv_W - + model->B3SOIFDpvsdth * Inv_LW; -/* Added for binning - END */ - - T0 = (TRatio - 1.0); - - pParam->B3SOIFDuatemp = pParam->B3SOIFDua; /* save ua, ub, and uc for b3soifdld.c */ - pParam->B3SOIFDubtemp = pParam->B3SOIFDub; - pParam->B3SOIFDuctemp = pParam->B3SOIFDuc; - pParam->B3SOIFDrds0denom = pow(pParam->B3SOIFDweff * 1E6, pParam->B3SOIFDwr); - pParam->B3SOIFDrth = here->B3SOIFDrth0 * sqrt(model->B3SOIFDtbox - / model->B3SOIFDtsi) / pParam->B3SOIFDweff; - pParam->B3SOIFDcth = here->B3SOIFDcth0 * model->B3SOIFDtsi; - pParam->B3SOIFDrbody = model->B3SOIFDrbody * - pParam->B3SOIFDweff / pParam->B3SOIFDleff; - pParam->B3SOIFDua = pParam->B3SOIFDua + pParam->B3SOIFDua1 * T0; - pParam->B3SOIFDub = pParam->B3SOIFDub + pParam->B3SOIFDub1 * T0; - pParam->B3SOIFDuc = pParam->B3SOIFDuc + pParam->B3SOIFDuc1 * T0; - if (pParam->B3SOIFDu0 > 1.0) - pParam->B3SOIFDu0 = pParam->B3SOIFDu0 / 1.0e4; - - pParam->B3SOIFDu0temp = pParam->B3SOIFDu0 - * pow(TRatio, pParam->B3SOIFDute); - pParam->B3SOIFDvsattemp = pParam->B3SOIFDvsat - pParam->B3SOIFDat - * T0; - pParam->B3SOIFDrds0 = (pParam->B3SOIFDrdsw + pParam->B3SOIFDprt * T0) - / pow(pParam->B3SOIFDweff * 1E6, pParam->B3SOIFDwr); - - if (B3SOIFDcheckModel(model, here, ckt)) - { - SPfrontEnd->IFerrorf (ERR_FATAL, "Fatal error(s) detected during B3SOIFDV3 parameter checking for %s in model %s", model->B3SOIFDmodName, here->B3SOIFDname); - return(E_BADPARM); - } - - - pParam->B3SOIFDcgdo = (model->B3SOIFDcgdo + pParam->B3SOIFDcf) - * pParam->B3SOIFDweffCV; - pParam->B3SOIFDcgso = (model->B3SOIFDcgso + pParam->B3SOIFDcf) - * pParam->B3SOIFDweffCV; - - - pParam->B3SOIFDcgeo = model->B3SOIFDcgeo * pParam->B3SOIFDleffCV; - - - if (!model->B3SOIFDnpeakGiven && model->B3SOIFDgamma1Given) - { T0 = pParam->B3SOIFDgamma1 * model->B3SOIFDcox; - pParam->B3SOIFDnpeak = 3.021E22 * T0 * T0; - } - - T0 = pow(TRatio, model->B3SOIFDxbjt / pParam->B3SOIFDndiode); - T1 = pow(TRatio, model->B3SOIFDxdif / pParam->B3SOIFDndiode); - T2 = pow(TRatio, model->B3SOIFDxrec / pParam->B3SOIFDndiode / 2); - T4 = -Eg0 / pParam->B3SOIFDndiode / model->B3SOIFDvtm * (1 - TRatio); - T5 = exp(T4); - T6 = sqrt(T5); - pParam->B3SOIFDjbjt = pParam->B3SOIFDisbjt * T0 * T5; - pParam->B3SOIFDjdif = pParam->B3SOIFDisdif * T1 * T5; - pParam->B3SOIFDjrec = pParam->B3SOIFDisrec * T2 * T6; - T0 = pow(TRatio, model->B3SOIFDxtun / pParam->B3SOIFDntun); - pParam->B3SOIFDjtun = pParam->B3SOIFDistun * T0 ; - - if (pParam->B3SOIFDnsub > 0) - pParam->B3SOIFDvfbb = -model->B3SOIFDtype * model->B3SOIFDvtm * - log(pParam->B3SOIFDnpeak/ pParam->B3SOIFDnsub); - else - pParam->B3SOIFDvfbb = -model->B3SOIFDtype * model->B3SOIFDvtm * - log(-pParam->B3SOIFDnpeak* pParam->B3SOIFDnsub/ni/ni); - - if (!model->B3SOIFDvsdfbGiven) - { - if (pParam->B3SOIFDnsub > 0) - pParam->B3SOIFDvsdfb = -model->B3SOIFDtype * (model->B3SOIFDvtm*log(1e20 * - pParam->B3SOIFDnsub / ni /ni) - 0.3); - else if (pParam->B3SOIFDnsub < 0) - pParam->B3SOIFDvsdfb = -model->B3SOIFDtype * (model->B3SOIFDvtm*log(-1e20 / - pParam->B3SOIFDnsub) + 0.3); - } - - /* Phi & Gamma */ - SDphi = 2.0*model->B3SOIFDvtm*log(fabs(pParam->B3SOIFDnsub) / ni); - SDgamma = 5.753e-12 * sqrt(fabs(pParam->B3SOIFDnsub)) / model->B3SOIFDcbox; - - if (!model->B3SOIFDvsdthGiven) - { - if ( ((pParam->B3SOIFDnsub > 0) && (model->B3SOIFDtype > 0)) || - ((pParam->B3SOIFDnsub < 0) && (model->B3SOIFDtype < 0)) ) - pParam->B3SOIFDvsdth = pParam->B3SOIFDvsdfb + SDphi + - SDgamma * sqrt(SDphi); - else - pParam->B3SOIFDvsdth = pParam->B3SOIFDvsdfb - SDphi - - SDgamma * sqrt(SDphi); - } - if (!model->B3SOIFDcsdminGiven) - { - /* Cdmin */ - tmp = sqrt(2.0 * EPSSI * SDphi / (Charge_q * - fabs(pParam->B3SOIFDnsub) * 1.0e6)); - tmp1 = EPSSI / tmp; - model->B3SOIFDcsdmin = tmp1 * model->B3SOIFDcbox / - (tmp1 + model->B3SOIFDcbox); - } - - T0 = model->B3SOIFDcsdesw * log(1 + model->B3SOIFDtsi / - model->B3SOIFDtbox); - T1 = here->B3SOIFDsourcePerimeter - pParam->B3SOIFDweff; - if (T1 > 0.0) - pParam->B3SOIFDcsesw = T0 * T1; - else - pParam->B3SOIFDcsesw = 0.0; - T1 = here->B3SOIFDdrainPerimeter - pParam->B3SOIFDweff; - if (T1 > 0.0) - pParam->B3SOIFDcdesw = T0 * T1; - else - pParam->B3SOIFDcdesw = 0.0; - - pParam->B3SOIFDphi = 2.0 * model->B3SOIFDvtm - * log(pParam->B3SOIFDnpeak / ni); - - pParam->B3SOIFDsqrtPhi = sqrt(pParam->B3SOIFDphi); - pParam->B3SOIFDphis3 = pParam->B3SOIFDsqrtPhi * pParam->B3SOIFDphi; - - pParam->B3SOIFDXdep0 = sqrt(2.0 * EPSSI / (Charge_q - * pParam->B3SOIFDnpeak * 1.0e6)) - * pParam->B3SOIFDsqrtPhi; - pParam->B3SOIFDsqrtXdep0 = sqrt(pParam->B3SOIFDXdep0); - pParam->B3SOIFDlitl = sqrt(3.0 * model->B3SOIFDxj - * model->B3SOIFDtox); - pParam->B3SOIFDvbi = model->B3SOIFDvtm * log(1.0e20 - * pParam->B3SOIFDnpeak / (ni * ni)); - pParam->B3SOIFDcdep0 = sqrt(Charge_q * EPSSI - * pParam->B3SOIFDnpeak * 1.0e6 / 2.0 - / pParam->B3SOIFDphi); - - if (model->B3SOIFDk1Given || model->B3SOIFDk2Given) - { if (!model->B3SOIFDk1Given) - { fprintf(stdout, "Warning: k1 should be specified with k2.\n"); - pParam->B3SOIFDk1 = 0.53; - } - if (!model->B3SOIFDk2Given) - { fprintf(stdout, "Warning: k2 should be specified with k1.\n"); - pParam->B3SOIFDk2 = -0.0186; - } - if (model->B3SOIFDxtGiven) - fprintf(stdout, "Warning: xt is ignored because k1 or k2 is given.\n"); - if (model->B3SOIFDvbxGiven) - fprintf(stdout, "Warning: vbx is ignored because k1 or k2 is given.\n"); - if (model->B3SOIFDvbmGiven) - fprintf(stdout, "Warning: vbm is ignored because k1 or k2 is given.\n"); - if (model->B3SOIFDgamma1Given) - fprintf(stdout, "Warning: gamma1 is ignored because k1 or k2 is given.\n"); - if (model->B3SOIFDgamma2Given) - fprintf(stdout, "Warning: gamma2 is ignored because k1 or k2 is given.\n"); - } - else - { if (!model->B3SOIFDvbxGiven) - pParam->B3SOIFDvbx = pParam->B3SOIFDphi - 7.7348e-4 - * pParam->B3SOIFDnpeak - * pParam->B3SOIFDxt * pParam->B3SOIFDxt; - if (pParam->B3SOIFDvbx > 0.0) - pParam->B3SOIFDvbx = -pParam->B3SOIFDvbx; - if (pParam->B3SOIFDvbm > 0.0) - pParam->B3SOIFDvbm = -pParam->B3SOIFDvbm; - - if (!model->B3SOIFDgamma1Given) - pParam->B3SOIFDgamma1 = 5.753e-12 - * sqrt(pParam->B3SOIFDnpeak) - / model->B3SOIFDcox; - if (!model->B3SOIFDgamma2Given) - pParam->B3SOIFDgamma2 = 5.753e-12 - * sqrt(pParam->B3SOIFDnsub) - / model->B3SOIFDcox; - - T0 = pParam->B3SOIFDgamma1 - pParam->B3SOIFDgamma2; - T1 = sqrt(pParam->B3SOIFDphi - pParam->B3SOIFDvbx) - - pParam->B3SOIFDsqrtPhi; - T2 = sqrt(pParam->B3SOIFDphi * (pParam->B3SOIFDphi - - pParam->B3SOIFDvbm)) - pParam->B3SOIFDphi; - pParam->B3SOIFDk2 = T0 * T1 / (2.0 * T2 + pParam->B3SOIFDvbm); - pParam->B3SOIFDk1 = pParam->B3SOIFDgamma2 - 2.0 - * pParam->B3SOIFDk2 * sqrt(pParam->B3SOIFDphi - - pParam->B3SOIFDvbm); - } - - if (pParam->B3SOIFDk2 < 0.0) - { T0 = 0.5 * pParam->B3SOIFDk1 / pParam->B3SOIFDk2; - pParam->B3SOIFDvbsc = 0.9 * (pParam->B3SOIFDphi - T0 * T0); - if (pParam->B3SOIFDvbsc > -3.0) - pParam->B3SOIFDvbsc = -3.0; - else if (pParam->B3SOIFDvbsc < -30.0) - pParam->B3SOIFDvbsc = -30.0; - } - else - { pParam->B3SOIFDvbsc = -30.0; - } - if (pParam->B3SOIFDvbsc > pParam->B3SOIFDvbm) - pParam->B3SOIFDvbsc = pParam->B3SOIFDvbm; - - if (model->B3SOIFDvth0Given) - { pParam->B3SOIFDvfb = model->B3SOIFDtype * pParam->B3SOIFDvth0 - - pParam->B3SOIFDphi - pParam->B3SOIFDk1 - * pParam->B3SOIFDsqrtPhi; - } - else - { pParam->B3SOIFDvfb = -1.0; - pParam->B3SOIFDvth0 = model->B3SOIFDtype * (pParam->B3SOIFDvfb - + pParam->B3SOIFDphi + pParam->B3SOIFDk1 - * pParam->B3SOIFDsqrtPhi); - } - T1 = sqrt(EPSSI / EPSOX * model->B3SOIFDtox - * pParam->B3SOIFDXdep0); - T0 = exp(-0.5 * pParam->B3SOIFDdsub * pParam->B3SOIFDleff / T1); - pParam->B3SOIFDtheta0vb0 = (T0 + 2.0 * T0 * T0); - - T0 = exp(-0.5 * pParam->B3SOIFDdrout * pParam->B3SOIFDleff / T1); - T2 = (T0 + 2.0 * T0 * T0); - pParam->B3SOIFDthetaRout = pParam->B3SOIFDpdibl1 * T2 - + pParam->B3SOIFDpdibl2; - - here->B3SOIFDminIsub = 5.0e-2 * pParam->B3SOIFDweff * model->B3SOIFDtsi - * MAX(pParam->B3SOIFDisdif, pParam->B3SOIFDisrec); - } - - here->B3SOIFDcsbox = model->B3SOIFDcbox*here->B3SOIFDsourceArea; - here->B3SOIFDcsmin = model->B3SOIFDcsdmin*here->B3SOIFDsourceArea; - here->B3SOIFDcdbox = model->B3SOIFDcbox*here->B3SOIFDdrainArea; - here->B3SOIFDcdmin = model->B3SOIFDcsdmin*here->B3SOIFDdrainArea; - - if ( ((pParam->B3SOIFDnsub > 0) && (model->B3SOIFDtype > 0)) || - ((pParam->B3SOIFDnsub < 0) && (model->B3SOIFDtype < 0)) ) - { - T0 = pParam->B3SOIFDvsdth - pParam->B3SOIFDvsdfb; - pParam->B3SOIFDsdt1 = pParam->B3SOIFDvsdfb + model->B3SOIFDasd * T0; - T1 = here->B3SOIFDcsbox - here->B3SOIFDcsmin; - T2 = T1 / T0 / T0; - pParam->B3SOIFDst2 = T2 / model->B3SOIFDasd; - pParam->B3SOIFDst3 = T2 /( 1 - model->B3SOIFDasd); - here->B3SOIFDst4 = T0 * T1 * (1 + model->B3SOIFDasd) / 3 - - here->B3SOIFDcsmin * pParam->B3SOIFDvsdfb; - - T1 = here->B3SOIFDcdbox - here->B3SOIFDcdmin; - T2 = T1 / T0 / T0; - pParam->B3SOIFDdt2 = T2 / model->B3SOIFDasd; - pParam->B3SOIFDdt3 = T2 /( 1 - model->B3SOIFDasd); - here->B3SOIFDdt4 = T0 * T1 * (1 + model->B3SOIFDasd) / 3 - - here->B3SOIFDcdmin * pParam->B3SOIFDvsdfb; - } else - { - T0 = pParam->B3SOIFDvsdfb - pParam->B3SOIFDvsdth; - pParam->B3SOIFDsdt1 = pParam->B3SOIFDvsdth + model->B3SOIFDasd * T0; - T1 = here->B3SOIFDcsmin - here->B3SOIFDcsbox; - T2 = T1 / T0 / T0; - pParam->B3SOIFDst2 = T2 / model->B3SOIFDasd; - pParam->B3SOIFDst3 = T2 /( 1 - model->B3SOIFDasd); - here->B3SOIFDst4 = T0 * T1 * (1 + model->B3SOIFDasd) / 3 - - here->B3SOIFDcsbox * pParam->B3SOIFDvsdth; - - T1 = here->B3SOIFDcdmin - here->B3SOIFDcdbox; - T2 = T1 / T0 / T0; - pParam->B3SOIFDdt2 = T2 / model->B3SOIFDasd; - pParam->B3SOIFDdt3 = T2 /( 1 - model->B3SOIFDasd); - here->B3SOIFDdt4 = T0 * T1 * (1 + model->B3SOIFDasd) / 3 - - here->B3SOIFDcdbox * pParam->B3SOIFDvsdth; - } - - here->B3SOIFDphi = pParam->B3SOIFDphi; - /* process source/drain series resistance */ - here->B3SOIFDdrainConductance = model->B3SOIFDsheetResistance - * here->B3SOIFDdrainSquares; - if (here->B3SOIFDdrainConductance > 0.0) - here->B3SOIFDdrainConductance = 1.0 - / here->B3SOIFDdrainConductance; - else - here->B3SOIFDdrainConductance = 0.0; - - here->B3SOIFDsourceConductance = model->B3SOIFDsheetResistance - * here->B3SOIFDsourceSquares; - if (here->B3SOIFDsourceConductance > 0.0) - here->B3SOIFDsourceConductance = 1.0 - / here->B3SOIFDsourceConductance; - else - here->B3SOIFDsourceConductance = 0.0; - here->B3SOIFDcgso = pParam->B3SOIFDcgso; - here->B3SOIFDcgdo = pParam->B3SOIFDcgdo; - - } - } - return(OK); -} - diff --git a/src/spicelib/devices/bsim3soi_fd/b3soifdtrunc.c b/src/spicelib/devices/bsim3soi_fd/b3soifdtrunc.c deleted file mode 100644 index 46f575b4f..000000000 --- a/src/spicelib/devices/bsim3soi_fd/b3soifdtrunc.c +++ /dev/null @@ -1,50 +0,0 @@ -/********** -Copyright 1999 Regents of the University of California. All rights reserved. -Author: 1998 Samuel Fung, Dennis Sinitsky and Stephen Tang -Modified by Paolo Nenzi 2002 -File: b3soifdtrunc.c 98/5/01 -**********/ - -/* - * Revision 2.1 99/9/27 Pin Su - * BSIMFD2.1 release - */ - -#include "ngspice/ngspice.h" -#include "ngspice/cktdefs.h" -#include "b3soifddef.h" -#include "ngspice/sperror.h" -#include "ngspice/suffix.h" - - -int -B3SOIFDtrunc(GENmodel *inModel, CKTcircuit *ckt, double *timeStep) -{ -B3SOIFDmodel *model = (B3SOIFDmodel*)inModel; -B3SOIFDinstance *here; - -#ifdef STEPDEBUG - double debugtemp; -#endif /* STEPDEBUG */ - - for (; model != NULL; model = B3SOIFDnextModel(model)) - { for (here = B3SOIFDinstances(model); here != NULL; - here = B3SOIFDnextInstance(here)) - { - -#ifdef STEPDEBUG - debugtemp = *timeStep; -#endif /* STEPDEBUG */ - CKTterr(here->B3SOIFDqb,ckt,timeStep); - CKTterr(here->B3SOIFDqg,ckt,timeStep); - CKTterr(here->B3SOIFDqd,ckt,timeStep); -#ifdef STEPDEBUG - if(debugtemp != *timeStep) - { printf("device %s reduces step from %g to %g\n", - here->B3SOIFDname,debugtemp,*timeStep); - } -#endif /* STEPDEBUG */ - } - } - return(OK); -} diff --git a/src/spicelib/devices/bsim3soi_pd/BsimTerms_use b/src/spicelib/devices/bsim3soi_pd/BsimTerms_use deleted file mode 100644 index 6f8e8e540..000000000 --- a/src/spicelib/devices/bsim3soi_pd/BsimTerms_use +++ /dev/null @@ -1,29 +0,0 @@ -The terms under which the software is provided are as the following. - -Software is distributed as is, completely without warranty or service -support. The University of California and its employees are not liable -for the condition or performance of the software. - -The University owns the copyright but shall not be liable for any -infringement of copyright or other proprietary rights brought by third -parties against the users of the software. - -The University of California hereby disclaims all implied warranties. - -The University of California grants the users the right to modify, copy, -and redistribute the software and documentation, both within the user's -organization and externally, subject to the following restrictions - -1. The users agree not to charge for the University of California code - itself but may charge for additions, extensions, or support. - -2. In any product based on the software, the users agree to acknowledge - the UC Berkeley BSIM Research Group that developed the software. This - acknowledgment shall appear in the product documentation. - -3. The users agree to obey all U.S. Government restrictions governing - redistribution or export of the software. - -4. The users agree to reproduce any copyright notice which appears on - the software on any copy or modification of such made available - to others. diff --git a/src/spicelib/devices/bsim3soi_pd/ChangeLog b/src/spicelib/devices/bsim3soi_pd/ChangeLog deleted file mode 100644 index 684410234..000000000 --- a/src/spicelib/devices/bsim3soi_pd/ChangeLog +++ /dev/null @@ -1,4 +0,0 @@ -2000-11-14 Paolo Nenzi - - * Initial release - diff --git a/src/spicelib/devices/bsim3soi_pd/Makefile.am b/src/spicelib/devices/bsim3soi_pd/Makefile.am deleted file mode 100644 index f4b594c9d..000000000 --- a/src/spicelib/devices/bsim3soi_pd/Makefile.am +++ /dev/null @@ -1,34 +0,0 @@ -## Process this file with automake to produce Makefile.in - -noinst_LTLIBRARIES = libbsim3soipd.la - -libbsim3soipd_la_SOURCES = \ - b3soipd.c \ - b3soipdacld.c \ - b3soipdask.c \ - b3soipdcheck.c \ - b3soipdcvtest.c \ - b3soipdgetic.c \ - b3soipdld.c \ - b3soipdmask.c \ - b3soipdmpar.c \ - b3soipdnoi.c \ - b3soipdpar.c \ - b3soipdpzld.c \ - b3soipdset.c \ - b3soipdtemp.c \ - b3soipdtrunc.c \ - b3soipddef.h \ - b3soipdext.h \ - b3soipdinit.c \ - b3soipdinit.h \ - b3soipditf.h - - - -AM_CPPFLAGS = @AM_CPPFLAGS@ -I$(top_srcdir)/src/include -AM_CFLAGS = $(STATIC) - -MAINTAINERCLEANFILES = Makefile.in - -EXTRA_DIST = BsimTerms_use diff --git a/src/spicelib/devices/bsim3soi_pd/b3soipd.c b/src/spicelib/devices/bsim3soi_pd/b3soipd.c deleted file mode 100644 index 40b8750b7..000000000 --- a/src/spicelib/devices/bsim3soi_pd/b3soipd.c +++ /dev/null @@ -1,587 +0,0 @@ -/********** -Copyright 1990 Regents of the University of California. All rights reserved. -Author: 1998 Samuel Fung, Dennis Sinitsky and Stephen Tang -File: b3soipd.c 98/5/01 -Modified by Pin Su and Jan Feng 99/2/15 -Modified by Pin Su 99/4/30 -Modified by Wei Jin 99/9/27 -Modified by Pin Su 00/3/1 -Modified by Pin Su 01/2/15 -Modified by Pin Su 02/3/5 -Modified by Paolo Nenzi 2002 -**********/ - -/* - * Revision 2.2.3 02/3/5 Pin Su - * BSIMPD2.2.3 release - */ - -#include "ngspice/ngspice.h" -#include "ngspice/devdefs.h" -#include "b3soipddef.h" -#include "ngspice/suffix.h" - -IFparm B3SOIPDpTable[] = { /* parameters */ -IOP( "l", B3SOIPD_L, IF_REAL , "Length"), -IOP( "w", B3SOIPD_W, IF_REAL , "Width"), -IOP( "m", B3SOIPD_M, IF_REAL , "Parallel Multiplier"), -IOP( "ad", B3SOIPD_AD, IF_REAL , "Drain area"), -IOP( "as", B3SOIPD_AS, IF_REAL , "Source area"), -IOP( "pd", B3SOIPD_PD, IF_REAL , "Drain perimeter"), -IOP( "ps", B3SOIPD_PS, IF_REAL , "Source perimeter"), -IOP( "nrd", B3SOIPD_NRD, IF_REAL , "Number of squares in drain"), -IOP( "nrs", B3SOIPD_NRS, IF_REAL , "Number of squares in source"), -IOP( "off", B3SOIPD_OFF, IF_FLAG , "Device is initially off"), -IP( "ic", B3SOIPD_IC, IF_REALVEC , "Vector of DS,GS,BS initial voltages"), -OP( "gmbs", B3SOIPD_GMBS, IF_REAL, "Gmb"), -OP( "gm", B3SOIPD_GM, IF_REAL, "Gm"), -OP( "gm/ids", B3SOIPD_GMID, IF_REAL, "Gm/Ids"), -OP( "gds", B3SOIPD_GDS, IF_REAL, "Gds"), -OP( "vdsat", B3SOIPD_VDSAT, IF_REAL, "Vdsat"), -OP( "vth", B3SOIPD_VON, IF_REAL, "Vth"), -OP( "ids", B3SOIPD_CD, IF_REAL, "Ids"), -OP( "vbs", B3SOIPD_VBS, IF_REAL, "Vbs"), -OP( "vgs", B3SOIPD_VGS, IF_REAL, "Vgs"), -OP( "vds", B3SOIPD_VDS, IF_REAL, "Vds"), -OP( "ves", B3SOIPD_VES, IF_REAL, "Ves"), -IOP( "bjtoff", B3SOIPD_BJTOFF, IF_INTEGER, "BJT on/off flag"), -IOP( "debug", B3SOIPD_DEBUG, IF_INTEGER, "BJT on/off flag"), -IOP( "rth0", B3SOIPD_RTH0, IF_REAL, "Instance Thermal Resistance"), -IOP( "cth0", B3SOIPD_CTH0, IF_REAL, "Instance Thermal Capacitance"), -IOP( "nrb", B3SOIPD_NRB, IF_REAL, "Number of squares in body"), -IOP( "frbody", B3SOIPD_FRBODY, IF_REAL, "layout dependent body-resistance coefficient"), - - -/* v2.0 release */ -IOP( "nbc", B3SOIPD_NBC, IF_REAL, "Number of body contact isolation edge"), -IOP( "nseg", B3SOIPD_NSEG, IF_REAL, "Number segments for width partitioning"), -IOP( "pdbcp", B3SOIPD_PDBCP, IF_REAL, "Perimeter length for bc parasitics at drain side"), -IOP( "psbcp", B3SOIPD_PSBCP, IF_REAL, "Perimeter length for bc parasitics at source side"), -IOP( "agbcp", B3SOIPD_AGBCP, IF_REAL, "Gate to body overlap area for bc parasitics"), -IOP( "aebcp", B3SOIPD_AEBCP, IF_REAL, "Substrate to body overlap area for bc prasitics"), -IOP( "vbsusr", B3SOIPD_VBSUSR, IF_REAL, "Vbs specified by user"), -IOP( "tnodeout", B3SOIPD_TNODEOUT, IF_FLAG, "Flag indicating external temp node") - -}; - -IFparm B3SOIPDmPTable[] = { /* model parameters */ -IOP( "capmod", B3SOIPD_MOD_CAPMOD, IF_INTEGER, "Capacitance model selector"), -IOP( "mobmod", B3SOIPD_MOD_MOBMOD, IF_INTEGER, "Mobility model selector"), -IOP( "noimod", B3SOIPD_MOD_NOIMOD, IF_INTEGER, "Noise model selector"), -IOP( "paramchk", B3SOIPD_MOD_PARAMCHK, IF_INTEGER, "Model parameter checking selector"), -IOP( "binunit", B3SOIPD_MOD_BINUNIT, IF_INTEGER, "Bin unit selector"), -IOP( "version", B3SOIPD_MOD_VERSION, IF_REAL, " parameter for model version"), -IOP( "tox", B3SOIPD_MOD_TOX, IF_REAL, "Gate oxide thickness in meters"), -IOP( "dtoxcv", B3SOIPD_MOD_DTOXCV, IF_REAL, "Delta oxide thickness in meters in CapMod3"), /* v2.2.3 */ - -IOP( "cdsc", B3SOIPD_MOD_CDSC, IF_REAL, "Drain/Source and channel coupling capacitance"), -IOP( "cdscb", B3SOIPD_MOD_CDSCB, IF_REAL, "Body-bias dependence of cdsc"), -IOP( "cdscd", B3SOIPD_MOD_CDSCD, IF_REAL, "Drain-bias dependence of cdsc"), -IOP( "cit", B3SOIPD_MOD_CIT, IF_REAL, "Interface state capacitance"), -IOP( "nfactor", B3SOIPD_MOD_NFACTOR, IF_REAL, "Subthreshold swing Coefficient"), -IOP( "vsat", B3SOIPD_MOD_VSAT, IF_REAL, "Saturation velocity at tnom"), -IOP( "at", B3SOIPD_MOD_AT, IF_REAL, "Temperature coefficient of vsat"), -IOP( "a0", B3SOIPD_MOD_A0, IF_REAL, "Non-uniform depletion width effect coefficient."), -IOP( "ags", B3SOIPD_MOD_AGS, IF_REAL, "Gate bias coefficient of Abulk."), -IOP( "a1", B3SOIPD_MOD_A1, IF_REAL, "Non-saturation effect coefficient"), -IOP( "a2", B3SOIPD_MOD_A2, IF_REAL, "Non-saturation effect coefficient"), -IOP( "keta", B3SOIPD_MOD_KETA, IF_REAL, "Body-bias coefficient of non-uniform depletion width effect."), -IOP( "nsub", B3SOIPD_MOD_NSUB, IF_REAL, "Substrate doping concentration with polarity"), -IOP( "nch", B3SOIPD_MOD_NPEAK, IF_REAL, "Channel doping concentration"), -IOP( "ngate", B3SOIPD_MOD_NGATE, IF_REAL, "Poly-gate doping concentration"), -IOP( "gamma1", B3SOIPD_MOD_GAMMA1, IF_REAL, "Vth body coefficient"), -IOP( "gamma2", B3SOIPD_MOD_GAMMA2, IF_REAL, "Vth body coefficient"), -IOP( "vbx", B3SOIPD_MOD_VBX, IF_REAL, "Vth transition body Voltage"), -IOP( "vbm", B3SOIPD_MOD_VBM, IF_REAL, "Maximum body voltage"), - -IOP( "xt", B3SOIPD_MOD_XT, IF_REAL, "Doping depth"), -IOP( "k1", B3SOIPD_MOD_K1, IF_REAL, "Bulk effect coefficient 1"), -IOP( "kt1", B3SOIPD_MOD_KT1, IF_REAL, "Temperature coefficient of Vth"), -IOP( "kt1l", B3SOIPD_MOD_KT1L, IF_REAL, "Temperature coefficient of Vth"), -IOP( "kt2", B3SOIPD_MOD_KT2, IF_REAL, "Body-coefficient of kt1"), -IOP( "k2", B3SOIPD_MOD_K2, IF_REAL, "Bulk effect coefficient 2"), -IOP( "k3", B3SOIPD_MOD_K3, IF_REAL, "Narrow width effect coefficient"), -IOP( "k3b", B3SOIPD_MOD_K3B, IF_REAL, "Body effect coefficient of k3"), -IOP( "w0", B3SOIPD_MOD_W0, IF_REAL, "Narrow width effect parameter"), -IOP( "nlx", B3SOIPD_MOD_NLX, IF_REAL, "Lateral non-uniform doping effect"), -IOP( "dvt0", B3SOIPD_MOD_DVT0, IF_REAL, "Short channel effect coeff. 0"), -IOP( "dvt1", B3SOIPD_MOD_DVT1, IF_REAL, "Short channel effect coeff. 1"), -IOP( "dvt2", B3SOIPD_MOD_DVT2, IF_REAL, "Short channel effect coeff. 2"), -IOP( "dvt0w", B3SOIPD_MOD_DVT0W, IF_REAL, "Narrow Width coeff. 0"), -IOP( "dvt1w", B3SOIPD_MOD_DVT1W, IF_REAL, "Narrow Width effect coeff. 1"), -IOP( "dvt2w", B3SOIPD_MOD_DVT2W, IF_REAL, "Narrow Width effect coeff. 2"), -IOP( "drout", B3SOIPD_MOD_DROUT, IF_REAL, "DIBL coefficient of output resistance"), -IOP( "dsub", B3SOIPD_MOD_DSUB, IF_REAL, "DIBL coefficient in the subthreshold region"), -IOP( "vth0", B3SOIPD_MOD_VTH0, IF_REAL,"Threshold voltage"), -IOPR("vtho", B3SOIPD_MOD_VTH0, IF_REAL,"Threshold voltage"), -IOP( "ua", B3SOIPD_MOD_UA, IF_REAL, "Linear gate dependence of mobility"), -IOP( "ua1", B3SOIPD_MOD_UA1, IF_REAL, "Temperature coefficient of ua"), -IOP( "ub", B3SOIPD_MOD_UB, IF_REAL, "Quadratic gate dependence of mobility"), -IOP( "ub1", B3SOIPD_MOD_UB1, IF_REAL, "Temperature coefficient of ub"), -IOP( "uc", B3SOIPD_MOD_UC, IF_REAL, "Body-bias dependence of mobility"), -IOP( "uc1", B3SOIPD_MOD_UC1, IF_REAL, "Temperature coefficient of uc"), -IOP( "u0", B3SOIPD_MOD_U0, IF_REAL, "Low-field mobility at Tnom"), -IOP( "ute", B3SOIPD_MOD_UTE, IF_REAL, "Temperature coefficient of mobility"), -IOP( "voff", B3SOIPD_MOD_VOFF, IF_REAL, "Threshold voltage offset"), -IOP( "tnom", B3SOIPD_MOD_TNOM, IF_REAL, "Parameter measurement temperature"), -IOP( "cgso", B3SOIPD_MOD_CGSO, IF_REAL, "Gate-source overlap capacitance per width"), -IOP( "cgdo", B3SOIPD_MOD_CGDO, IF_REAL, "Gate-drain overlap capacitance per width"), -IOP( "xpart", B3SOIPD_MOD_XPART, IF_REAL, "Channel charge partitioning"), -IOP( "delta", B3SOIPD_MOD_DELTA, IF_REAL, "Effective Vds parameter"), -IOP( "rsh", B3SOIPD_MOD_RSH, IF_REAL, "Source-drain sheet resistance"), -IOP( "rdsw", B3SOIPD_MOD_RDSW, IF_REAL, "Source-drain resistance per width"), - -IOP( "prwg", B3SOIPD_MOD_PRWG, IF_REAL, "Gate-bias effect on parasitic resistance "), -IOP( "prwb", B3SOIPD_MOD_PRWB, IF_REAL, "Body-effect on parasitic resistance "), - -IOP( "prt", B3SOIPD_MOD_PRT, IF_REAL, "Temperature coefficient of parasitic resistance "), -IOP( "eta0", B3SOIPD_MOD_ETA0, IF_REAL, "Subthreshold region DIBL coefficient"), -IOP( "etab", B3SOIPD_MOD_ETAB, IF_REAL, "Subthreshold region DIBL coefficient"), -IOP( "pclm", B3SOIPD_MOD_PCLM, IF_REAL, "Channel length modulation Coefficient"), -IOP( "pdiblc1", B3SOIPD_MOD_PDIBL1, IF_REAL, "Drain-induced barrier lowering coefficient"), -IOP( "pdiblc2", B3SOIPD_MOD_PDIBL2, IF_REAL, "Drain-induced barrier lowering coefficient"), -IOP( "pdiblcb", B3SOIPD_MOD_PDIBLB, IF_REAL, "Body-effect on drain-induced barrier lowering"), - -IOP( "pvag", B3SOIPD_MOD_PVAG, IF_REAL, "Gate dependence of output resistance parameter"), - -IOP( "shmod", B3SOIPD_MOD_SHMOD, IF_INTEGER, "Self heating mode selector"), -IOP( "ddmod", B3SOIPD_MOD_DDMOD, IF_INTEGER, "Dynamic depletion mode selector"), -IOP( "tbox", B3SOIPD_MOD_TBOX, IF_REAL, "Back gate oxide thickness in meters"), -IOP( "tsi", B3SOIPD_MOD_TSI, IF_REAL, "Silicon-on-insulator thickness in meters"), -IOP( "xj", B3SOIPD_MOD_XJ, IF_REAL, "Junction Depth"), -IOP( "rth0", B3SOIPD_MOD_RTH0, IF_REAL, "Self-heating thermal resistance"), -IOP( "cth0", B3SOIPD_MOD_CTH0, IF_REAL, "Self-heating thermal capacitance"), -IOP( "ngidl", B3SOIPD_MOD_NGIDL, IF_REAL, "GIDL first parameter"), -IOP( "agidl", B3SOIPD_MOD_AGIDL, IF_REAL, "GIDL second parameter"), -IOP( "bgidl", B3SOIPD_MOD_BGIDL, IF_REAL, "GIDL third parameter"), -IOP( "ndiode", B3SOIPD_MOD_NDIODE, IF_REAL, "Diode non-ideality factor"), -IOP( "xbjt", B3SOIPD_MOD_XBJT, IF_REAL, "Temperature coefficient for Isbjt"), - -IOP( "xdif", B3SOIPD_MOD_XDIF, IF_REAL, "Temperature coefficient for Isdif"), - -IOP( "xrec", B3SOIPD_MOD_XREC, IF_REAL, "Temperature coefficient for Isrec"), -IOP( "xtun", B3SOIPD_MOD_XTUN, IF_REAL, "Temperature coefficient for Istun"), - -IOP( "pbswg", B3SOIPD_MOD_PBSWG, IF_REAL, "Source/drain (gate side) sidewall junction capacitance built in potential"), -IOP( "mjswg", B3SOIPD_MOD_MJSWG, IF_REAL, "Source/drain (gate side) sidewall junction capacitance grading coefficient"), - -IOP( "cjswg", B3SOIPD_MOD_CJSWG, IF_REAL, "Source/drain (gate side) sidewall junction capacitance per unit width"), -IOP( "lint", B3SOIPD_MOD_LINT, IF_REAL, "Length reduction parameter"), -IOP( "ll", B3SOIPD_MOD_LL, IF_REAL, "Length reduction parameter"), -IOP( "llc", B3SOIPD_MOD_LLC, IF_REAL, "Length reduction parameter"), /* v2.2.3 */ -IOP( "lln", B3SOIPD_MOD_LLN, IF_REAL, "Length reduction parameter"), -IOP( "lw", B3SOIPD_MOD_LW, IF_REAL, "Length reduction parameter"), -IOP( "lwc", B3SOIPD_MOD_LWC, IF_REAL, "Length reduction parameter"), /* v2.2.3 */ -IOP( "lwn", B3SOIPD_MOD_LWN, IF_REAL, "Length reduction parameter"), -IOP( "lwl", B3SOIPD_MOD_LWL, IF_REAL, "Length reduction parameter"), -IOP( "lwlc", B3SOIPD_MOD_LWLC, IF_REAL, "Length reduction parameter"), /* v2.2.3 */ - -IOP( "wr", B3SOIPD_MOD_WR, IF_REAL, "Width dependence of rds"), -IOP( "wint", B3SOIPD_MOD_WINT, IF_REAL, "Width reduction parameter"), -IOP( "dwg", B3SOIPD_MOD_DWG, IF_REAL, "Width reduction parameter"), -IOP( "dwb", B3SOIPD_MOD_DWB, IF_REAL, "Width reduction parameter"), - -IOP( "wl", B3SOIPD_MOD_WL, IF_REAL, "Width reduction parameter"), -IOP( "wlc", B3SOIPD_MOD_WLC, IF_REAL, "Width reduction parameter"), /* v2.2.3 */ -IOP( "wln", B3SOIPD_MOD_WLN, IF_REAL, "Width reduction parameter"), -IOP( "ww", B3SOIPD_MOD_WW, IF_REAL, "Width reduction parameter"), -IOP( "wwc", B3SOIPD_MOD_WWC, IF_REAL, "Width reduction parameter"), /* v2.2.3 */ -IOP( "wwn", B3SOIPD_MOD_WWN, IF_REAL, "Width reduction parameter"), -IOP( "wwl", B3SOIPD_MOD_WWL, IF_REAL, "Width reduction parameter"), -IOP( "wwlc", B3SOIPD_MOD_WWLC, IF_REAL, "Width reduction parameter"), /* v2.2.3 */ - -IOP( "b0", B3SOIPD_MOD_B0, IF_REAL, "Abulk narrow width parameter"), -IOP( "b1", B3SOIPD_MOD_B1, IF_REAL, "Abulk narrow width parameter"), - -IOP( "cgsl", B3SOIPD_MOD_CGSL, IF_REAL, "New C-V model parameter"), -IOP( "cgdl", B3SOIPD_MOD_CGDL, IF_REAL, "New C-V model parameter"), -IOP( "ckappa", B3SOIPD_MOD_CKAPPA, IF_REAL, "New C-V model parameter"), -IOP( "cf", B3SOIPD_MOD_CF, IF_REAL, "Fringe capacitance parameter"), -IOP( "clc", B3SOIPD_MOD_CLC, IF_REAL, "Vdsat parameter for C-V model"), -IOP( "cle", B3SOIPD_MOD_CLE, IF_REAL, "Vdsat parameter for C-V model"), -IOP( "dwc", B3SOIPD_MOD_DWC, IF_REAL, "Delta W for C-V model"), -IOP( "dlc", B3SOIPD_MOD_DLC, IF_REAL, "Delta L for C-V model"), - -IOP( "alpha0", B3SOIPD_MOD_ALPHA0, IF_REAL, "substrate current model parameter"), - -IOP( "noia", B3SOIPD_MOD_NOIA, IF_REAL, "Flicker noise parameter"), -IOP( "noib", B3SOIPD_MOD_NOIB, IF_REAL, "Flicker noise parameter"), -IOP( "noic", B3SOIPD_MOD_NOIC, IF_REAL, "Flicker noise parameter"), -IOP( "em", B3SOIPD_MOD_EM, IF_REAL, "Flicker noise parameter"), -IOP( "ef", B3SOIPD_MOD_EF, IF_REAL, "Flicker noise frequency exponent"), -IOP( "af", B3SOIPD_MOD_AF, IF_REAL, "Flicker noise exponent"), -IOP( "kf", B3SOIPD_MOD_KF, IF_REAL, "Flicker noise coefficient"), -IOP( "noif", B3SOIPD_MOD_NOIF, IF_REAL, "Floating body excess noise ideality factor"), - - -/* v2.0 release */ -IOP( "k1w1", B3SOIPD_MOD_K1W1, IF_REAL, "First Body effect width dependent parameter"), -IOP( "k1w2", B3SOIPD_MOD_K1W2, IF_REAL, "Second Boby effect width dependent parameter"), -IOP( "ketas", B3SOIPD_MOD_KETAS, IF_REAL, "Surface potential adjustment for bulk charge effect"), -IOP( "dwbc", B3SOIPD_MOD_DWBC, IF_REAL, "Width offset for body contact isolation edge"), -IOP( "beta0", B3SOIPD_MOD_BETA0, IF_REAL, "First Vds dependent parameter of impact ionizition current"), -IOP( "beta1", B3SOIPD_MOD_BETA1, IF_REAL, "Second Vds dependent parameter of impact ionizition current"), -IOP( "beta2", B3SOIPD_MOD_BETA2, IF_REAL, "Third Vds dependent parameter of impact ionizition current"), -IOP( "vdsatii0", B3SOIPD_MOD_VDSATII0, IF_REAL, "Nominal drain saturation voltage at threshold for impact ionizition current"), -IOP( "tii", B3SOIPD_MOD_TII, IF_REAL, "Temperature dependent parameter for impact ionizition"), -IOP( "lii", B3SOIPD_MOD_LII, IF_REAL, "Channel length dependent parameter at threshold for impact ionizition current"), -IOP( "sii0", B3SOIPD_MOD_SII0, IF_REAL, "First Vgs dependent parameter for impact ionizition current"), -IOP( "sii1", B3SOIPD_MOD_SII1, IF_REAL, "Second Vgs dependent parameter for impact ionizition current"), -IOP( "sii2", B3SOIPD_MOD_SII2, IF_REAL, "Third Vgs dependent parameter for impact ionizition current"), -IOP( "siid", B3SOIPD_MOD_SIID, IF_REAL, "Vds dependent parameter of drain saturation voltage for impact ionizition current"), -IOP( "fbjtii", B3SOIPD_MOD_FBJTII, IF_REAL, "Fraction of bipolar current affecting the impact ionization"), -IOP( "esatii", B3SOIPD_MOD_ESATII, IF_REAL, "Saturation electric field for impact ionization"), -IOP( "ntun", B3SOIPD_MOD_NTUN, IF_REAL, "Reverse tunneling non-ideality factor"), -IOP( "nrecf0", B3SOIPD_MOD_NRECF0, IF_REAL, "Recombination non-ideality factor at forward bias"), -IOP( "nrecr0", B3SOIPD_MOD_NRECR0, IF_REAL, "Recombination non-ideality factor at reversed bias"), -IOP( "isbjt", B3SOIPD_MOD_ISBJT, IF_REAL, "BJT injection saturation current"), -IOP( "isdif", B3SOIPD_MOD_ISDIF, IF_REAL, "Body to source/drain injection saturation current"), -IOP( "isrec", B3SOIPD_MOD_ISREC, IF_REAL, "Recombination in depletion saturation current"), -IOP( "istun", B3SOIPD_MOD_ISTUN, IF_REAL, "Reverse tunneling saturation current"), -IOP( "ln", B3SOIPD_MOD_LN, IF_REAL, "Electron/hole diffusion length"), -IOP( "vrec0", B3SOIPD_MOD_VREC0, IF_REAL, "Voltage dependent parameter for recombination current"), -IOP( "vtun0", B3SOIPD_MOD_VTUN0, IF_REAL, "Voltage dependent parameter for tunneling current"), -IOP( "nbjt", B3SOIPD_MOD_NBJT, IF_REAL, "Power coefficient of channel length dependency for bipolar current"), -IOP( "lbjt0", B3SOIPD_MOD_LBJT0, IF_REAL, "Refferenc channel length for bipolar cuurent"), -IOP( "ldif0", B3SOIPD_MOD_LDIF0, IF_REAL, "Channel-length dependency coefficient of diffusion cap"), -IOP( "vabjt", B3SOIPD_MOD_VABJT, IF_REAL, "Early voltage for bipolar current"), -IOP( "aely", B3SOIPD_MOD_AELY, IF_REAL, "Channel length dependency of early voltage for bipolar cuurent"), -IOP( "ahli", B3SOIPD_MOD_AHLI, IF_REAL, "High level injection parameter for bipolar current"), -IOP( "rbody", B3SOIPD_MOD_RBODY, IF_REAL, "Intrinsic body contact sheet resistance"), -IOP( "rbsh", B3SOIPD_MOD_RBSH, IF_REAL, "Extrinsic body contact sheet resistance"), -IOP( "cgeo", B3SOIPD_MOD_CGEO, IF_REAL, "Gate substrate overlap capacitance per unit channel length"), -IOP( "tt", B3SOIPD_MOD_TT, IF_REAL, "Diffusion capacitance transit time coefficient"), -IOP( "ndif", B3SOIPD_MOD_NDIF, IF_REAL, "Power coefficient of channel length dependency for diffusion capacitance"), -IOP( "vsdfb", B3SOIPD_MOD_VSDFB, IF_REAL, "Source/drain bottom diffusion capacitance flatband voltage"), -IOP( "vsdth", B3SOIPD_MOD_VSDTH, IF_REAL, "Source/drain bottom diffusion capacitance threshold voltage"), -IOP( "csdmin", B3SOIPD_MOD_CSDMIN, IF_REAL, "Source/drain bottom diffusion minimum capacitance"), -IOP( "asd", B3SOIPD_MOD_ASD, IF_REAL, "Source/drain bottom diffusion smoothing parameter"), -IOP( "csdesw", B3SOIPD_MOD_CSDESW, IF_REAL, "Source/drain sidewall fringing capacitance per unit length"), -IOP( "ntrecf", B3SOIPD_MOD_NTRECF, IF_REAL, "Temperature coefficient for Nrecf"), -IOP( "ntrecr", B3SOIPD_MOD_NTRECR, IF_REAL, "Temperature coefficient for Nrecr"), -IOP( "dlcb", B3SOIPD_MOD_DLCB, IF_REAL, "Length offset fitting parameter for body charge"), -IOP( "fbody", B3SOIPD_MOD_FBODY, IF_REAL, "Scaling factor for body charge"), -IOP( "tcjswg", B3SOIPD_MOD_TCJSWG, IF_REAL, "Temperature coefficient of Cjswg"), -IOP( "tpbswg", B3SOIPD_MOD_TPBSWG, IF_REAL, "Temperature coefficient of Pbswg"), -IOP( "acde", B3SOIPD_MOD_ACDE, IF_REAL, "Exponential coefficient for charge thickness in capMod=3 for accumulation and depletion regions"), -IOP( "moin", B3SOIPD_MOD_MOIN, IF_REAL, "Coefficient for the gate-bias dependent surface potential"), -IOP( "delvt", B3SOIPD_MOD_DELVT, IF_REAL, "Threshold voltage adjust for CV"), -IOP( "kb1", B3SOIPD_MOD_KB1, IF_REAL, "Scaling factor for backgate charge"), -IOP( "dlbg", B3SOIPD_MOD_DLBG, IF_REAL, "Length offset fitting parameter for backgate charge"), - - -/* v2.2 release */ -IOP( "igmod", B3SOIPD_MOD_IGMOD, IF_INTEGER, "gate current model selector"), -IOP( "toxqm", B3SOIPD_MOD_TOXQM, IF_REAL, "effective oxide thickness considering quantum effect"), -IOP( "wth0", B3SOIPD_MOD_WTH0, IF_REAL, "Minimum width for thermal resistance calculation"), -IOP( "rhalo", B3SOIPD_MOD_RHALO, IF_REAL, "body halo sheet resistance"), -IOP( "ntox", B3SOIPD_MOD_NTOX, IF_REAL, "power term of gate current"), -IOP( "toxref", B3SOIPD_MOD_TOXREF, IF_REAL, "target oxide thickness"), -IOP( "ebg", B3SOIPD_MOD_EBG, IF_REAL, "effective bandgap in gate current calcula."), -IOP( "vevb", B3SOIPD_MOD_VEVB, IF_REAL, "Vaux parameter for valence-band electron tunneling"), -IOP( "alphagb1", B3SOIPD_MOD_ALPHAGB1, IF_REAL, "First Vox dependent parameter for gate current in inversion"), -IOP( "betagb1", B3SOIPD_MOD_BETAGB1, IF_REAL, "Second Vox dependent parameter for gate current in inversion"), -IOP( "vgb1", B3SOIPD_MOD_VGB1, IF_REAL, "Third Vox dependent parameter for gate current in inversion"), -IOP( "vecb", B3SOIPD_MOD_VECB, IF_REAL, "Vaux parameter for conduction-band electron tunneling"), -IOP( "alphagb2", B3SOIPD_MOD_ALPHAGB2, IF_REAL, "First Vox dependent parameter for gate current in accumulation"), -IOP( "betagb2", B3SOIPD_MOD_BETAGB2, IF_REAL, "Second Vox dependent parameter for gate current in accumulation"), -IOP( "vgb2", B3SOIPD_MOD_VGB2, IF_REAL, "Third Vox dependent parameter for gate current in accumulation"), -IOP( "voxh", B3SOIPD_MOD_VOXH, IF_REAL, "the limit of Vox in gate current calculation"), -IOP( "deltavox", B3SOIPD_MOD_DELTAVOX, IF_REAL, "the smoothing parameter in the Vox smoothing function"), - - -/* Added for binning - START */ -/* Length Dependence */ -IOP( "lnch", B3SOIPD_MOD_LNPEAK, IF_REAL, "Length dependence of nch"), -IOP( "lnsub", B3SOIPD_MOD_LNSUB, IF_REAL, "Length dependence of nsub"), -IOP( "lngate", B3SOIPD_MOD_LNGATE, IF_REAL, "Length dependence of ngate"), -IOP( "lvth0", B3SOIPD_MOD_LVTH0, IF_REAL,"Length dependence of vth0"), -IOP( "lk1", B3SOIPD_MOD_LK1, IF_REAL, "Length dependence of k1"), -IOP( "lk1w1", B3SOIPD_MOD_LK1W1, IF_REAL, "Length dependence of k1w1"), -IOP( "lk1w2", B3SOIPD_MOD_LK1W2, IF_REAL, "Length dependence of k1w2"), -IOP( "lk2", B3SOIPD_MOD_LK2, IF_REAL, "Length dependence of k2"), -IOP( "lk3", B3SOIPD_MOD_LK3, IF_REAL, "Length dependence of k3"), -IOP( "lk3b", B3SOIPD_MOD_LK3B, IF_REAL, "Length dependence of k3b"), -IOP( "lkb1", B3SOIPD_MOD_LKB1, IF_REAL, "Length dependence of kb1"), -IOP( "lw0", B3SOIPD_MOD_LW0, IF_REAL, "Length dependence of w0"), -IOP( "lnlx", B3SOIPD_MOD_LNLX, IF_REAL, "Length dependence of nlx"), -IOP( "ldvt0", B3SOIPD_MOD_LDVT0, IF_REAL, "Length dependence of dvt0"), -IOP( "ldvt1", B3SOIPD_MOD_LDVT1, IF_REAL, "Length dependence of dvt1"), -IOP( "ldvt2", B3SOIPD_MOD_LDVT2, IF_REAL, "Length dependence of dvt2"), -IOP( "ldvt0w", B3SOIPD_MOD_LDVT0W, IF_REAL, "Length dependence of dvt0w"), -IOP( "ldvt1w", B3SOIPD_MOD_LDVT1W, IF_REAL, "Length dependence of dvt1w"), -IOP( "ldvt2w", B3SOIPD_MOD_LDVT2W, IF_REAL, "Length dependence of dvt2w"), -IOP( "lu0", B3SOIPD_MOD_LU0, IF_REAL, "Length dependence of u0"), -IOP( "lua", B3SOIPD_MOD_LUA, IF_REAL, "Length dependence of ua"), -IOP( "lub", B3SOIPD_MOD_LUB, IF_REAL, "Length dependence of ub"), -IOP( "luc", B3SOIPD_MOD_LUC, IF_REAL, "Length dependence of uc"), -IOP( "lvsat", B3SOIPD_MOD_LVSAT, IF_REAL, "Length dependence of vsat"), -IOP( "la0", B3SOIPD_MOD_LA0, IF_REAL, "Length dependence of a0"), -IOP( "lags", B3SOIPD_MOD_LAGS, IF_REAL, "Length dependence of ags"), -IOP( "lb0", B3SOIPD_MOD_LB0, IF_REAL, "Length dependence of b0"), -IOP( "lb1", B3SOIPD_MOD_LB1, IF_REAL, "Length dependence of b1"), -IOP( "lketa", B3SOIPD_MOD_LKETA, IF_REAL, "Length dependence of keta"), -IOP( "lketas", B3SOIPD_MOD_LKETAS, IF_REAL, "Length dependence of ketas"), -IOP( "la1", B3SOIPD_MOD_LA1, IF_REAL, "Length dependence of a1"), -IOP( "la2", B3SOIPD_MOD_LA2, IF_REAL, "Length dependence of a2"), -IOP( "lrdsw", B3SOIPD_MOD_LRDSW, IF_REAL, "Length dependence of rdsw "), -IOP( "lprwb", B3SOIPD_MOD_LPRWB, IF_REAL, "Length dependence of prwb "), -IOP( "lprwg", B3SOIPD_MOD_LPRWG, IF_REAL, "Length dependence of prwg "), -IOP( "lwr", B3SOIPD_MOD_LWR, IF_REAL, "Length dependence of wr"), -IOP( "lnfactor", B3SOIPD_MOD_LNFACTOR, IF_REAL, "Length dependence of nfactor"), -IOP( "ldwg", B3SOIPD_MOD_LDWG, IF_REAL, "Length dependence of dwg"), -IOP( "ldwb", B3SOIPD_MOD_LDWB, IF_REAL, "Length dependence of dwb"), -IOP( "lvoff", B3SOIPD_MOD_LVOFF, IF_REAL, "Length dependence of voff"), -IOP( "leta0", B3SOIPD_MOD_LETA0, IF_REAL, "Length dependence of eta0"), -IOP( "letab", B3SOIPD_MOD_LETAB, IF_REAL, "Length dependence of etab"), -IOP( "ldsub", B3SOIPD_MOD_LDSUB, IF_REAL, "Length dependence of dsub"), -IOP( "lcit", B3SOIPD_MOD_LCIT, IF_REAL, "Length dependence of cit"), -IOP( "lcdsc", B3SOIPD_MOD_LCDSC, IF_REAL, "Length dependence of cdsc"), -IOP( "lcdscb", B3SOIPD_MOD_LCDSCB, IF_REAL, "Length dependence of cdscb"), -IOP( "lcdscd", B3SOIPD_MOD_LCDSCD, IF_REAL, "Length dependence of cdscd"), -IOP( "lpclm", B3SOIPD_MOD_LPCLM, IF_REAL, "Length dependence of pclm"), -IOP( "lpdiblc1", B3SOIPD_MOD_LPDIBL1, IF_REAL, "Length dependence of pdiblc1"), -IOP( "lpdiblc2", B3SOIPD_MOD_LPDIBL2, IF_REAL, "Length dependence of pdiblc2"), -IOP( "lpdiblcb", B3SOIPD_MOD_LPDIBLB, IF_REAL, "Length dependence of pdiblcb"), -IOP( "ldrout", B3SOIPD_MOD_LDROUT, IF_REAL, "Length dependence of drout"), -IOP( "lpvag", B3SOIPD_MOD_LPVAG, IF_REAL, "Length dependence of pvag"), -IOP( "ldelta", B3SOIPD_MOD_LDELTA, IF_REAL, "Length dependence of delta"), -IOP( "lalpha0", B3SOIPD_MOD_LALPHA0, IF_REAL, "Length dependence of alpha0"), -IOP( "lfbjtii", B3SOIPD_MOD_LFBJTII, IF_REAL, "Length dependence of fbjtii"), -IOP( "lbeta0", B3SOIPD_MOD_LBETA0, IF_REAL, "Length dependence of beta0"), -IOP( "lbeta1", B3SOIPD_MOD_LBETA1, IF_REAL, "Length dependence of beta1"), -IOP( "lbeta2", B3SOIPD_MOD_LBETA2, IF_REAL, "Length dependence of beta2"), -IOP( "lvdsatii0", B3SOIPD_MOD_LVDSATII0, IF_REAL, "Length dependence of vdsatii0"), -IOP( "llii", B3SOIPD_MOD_LLII, IF_REAL, "Length dependence of lii"), -IOP( "lesatii", B3SOIPD_MOD_LESATII, IF_REAL, "Length dependence of esatii"), -IOP( "lsii0", B3SOIPD_MOD_LSII0, IF_REAL, "Length dependence of sii0"), -IOP( "lsii1", B3SOIPD_MOD_LSII1, IF_REAL, "Length dependence of sii1"), -IOP( "lsii2", B3SOIPD_MOD_LSII2, IF_REAL, "Length dependence of sii2"), -IOP( "lsiid", B3SOIPD_MOD_LSIID, IF_REAL, "Length dependence of siid"), -IOP( "lagidl", B3SOIPD_MOD_LAGIDL, IF_REAL, "Length dependence of agidl"), -IOP( "lbgidl", B3SOIPD_MOD_LBGIDL, IF_REAL, "Length dependence of bgidl"), -IOP( "lngidl", B3SOIPD_MOD_LNGIDL, IF_REAL, "Length dependence of ngidl"), -IOP( "lntun", B3SOIPD_MOD_LNTUN, IF_REAL, "Length dependence of ntun"), -IOP( "lndiode", B3SOIPD_MOD_LNDIODE, IF_REAL, "Length dependence of ndiode"), -IOP( "lnrecf0", B3SOIPD_MOD_LNRECF0, IF_REAL, "Length dependence of nrecf0"), -IOP( "lnrecr0", B3SOIPD_MOD_LNRECR0, IF_REAL, "Length dependence of nrecr0"), -IOP( "lisbjt", B3SOIPD_MOD_LISBJT, IF_REAL, "Length dependence of isbjt"), -IOP( "lisdif", B3SOIPD_MOD_LISDIF, IF_REAL, "Length dependence of isdif"), -IOP( "lisrec", B3SOIPD_MOD_LISREC, IF_REAL, "Length dependence of isrec"), -IOP( "listun", B3SOIPD_MOD_LISTUN, IF_REAL, "Length dependence of istun"), -IOP( "lvrec0", B3SOIPD_MOD_LVREC0, IF_REAL, "Length dependence of vrec0"), -IOP( "lvtun0", B3SOIPD_MOD_LVTUN0, IF_REAL, "Length dependence of vtun0"), -IOP( "lnbjt", B3SOIPD_MOD_LNBJT, IF_REAL, "Length dependence of nbjt"), -IOP( "llbjt0", B3SOIPD_MOD_LLBJT0, IF_REAL, "Length dependence of lbjt0"), -IOP( "lvabjt", B3SOIPD_MOD_LVABJT, IF_REAL, "Length dependence of vabjt"), -IOP( "laely", B3SOIPD_MOD_LAELY, IF_REAL, "Length dependence of aely"), -IOP( "lahli", B3SOIPD_MOD_LAHLI, IF_REAL, "Length dependence of ahli"), -IOP( "lvsdfb", B3SOIPD_MOD_LVSDFB, IF_REAL, "Length dependence of vsdfb"), -IOP( "lvsdth", B3SOIPD_MOD_LVSDTH, IF_REAL, "Length dependence of vsdth"), -IOP( "ldelvt", B3SOIPD_MOD_LDELVT, IF_REAL, "Length dependence of delvt"), -IOP( "lacde", B3SOIPD_MOD_LACDE, IF_REAL, "Length dependence of acde"), -IOP( "lmoin", B3SOIPD_MOD_LMOIN, IF_REAL, "Length dependence of amoin"), -/* Width Dependence */ -IOP( "wnch", B3SOIPD_MOD_WNPEAK, IF_REAL, "Width dependence of nch"), -IOP( "wnsub", B3SOIPD_MOD_WNSUB, IF_REAL, "Width dependence of nsub"), -IOP( "wngate", B3SOIPD_MOD_WNGATE, IF_REAL, "Width dependence of ngate"), -IOP( "wvth0", B3SOIPD_MOD_WVTH0, IF_REAL,"Width dependence of vth0"), -IOP( "wk1", B3SOIPD_MOD_WK1, IF_REAL, "Width dependence of k1"), -IOP( "wk1w1", B3SOIPD_MOD_WK1W1, IF_REAL, "Width dependence of k1w1"), -IOP( "wk1w2", B3SOIPD_MOD_WK1W2, IF_REAL, "Width dependence of k1w2"), -IOP( "wk2", B3SOIPD_MOD_WK2, IF_REAL, "Width dependence of k2"), -IOP( "wk3", B3SOIPD_MOD_WK3, IF_REAL, "Width dependence of k3"), -IOP( "wk3b", B3SOIPD_MOD_WK3B, IF_REAL, "Width dependence of k3b"), -IOP( "wkb1", B3SOIPD_MOD_WKB1, IF_REAL, "Width dependence of kb1"), -IOP( "ww0", B3SOIPD_MOD_WW0, IF_REAL, "Width dependence of w0"), -IOP( "wnlx", B3SOIPD_MOD_WNLX, IF_REAL, "Width dependence of nlx"), -IOP( "wdvt0", B3SOIPD_MOD_WDVT0, IF_REAL, "Width dependence of dvt0"), -IOP( "wdvt1", B3SOIPD_MOD_WDVT1, IF_REAL, "Width dependence of dvt1"), -IOP( "wdvt2", B3SOIPD_MOD_WDVT2, IF_REAL, "Width dependence of dvt2"), -IOP( "wdvt0w", B3SOIPD_MOD_WDVT0W, IF_REAL, "Width dependence of dvt0w"), -IOP( "wdvt1w", B3SOIPD_MOD_WDVT1W, IF_REAL, "Width dependence of dvt1w"), -IOP( "wdvt2w", B3SOIPD_MOD_WDVT2W, IF_REAL, "Width dependence of dvt2w"), -IOP( "wu0", B3SOIPD_MOD_WU0, IF_REAL, "Width dependence of u0"), -IOP( "wua", B3SOIPD_MOD_WUA, IF_REAL, "Width dependence of ua"), -IOP( "wub", B3SOIPD_MOD_WUB, IF_REAL, "Width dependence of ub"), -IOP( "wuc", B3SOIPD_MOD_WUC, IF_REAL, "Width dependence of uc"), -IOP( "wvsat", B3SOIPD_MOD_WVSAT, IF_REAL, "Width dependence of vsat"), -IOP( "wa0", B3SOIPD_MOD_WA0, IF_REAL, "Width dependence of a0"), -IOP( "wags", B3SOIPD_MOD_WAGS, IF_REAL, "Width dependence of ags"), -IOP( "wb0", B3SOIPD_MOD_WB0, IF_REAL, "Width dependence of b0"), -IOP( "wb1", B3SOIPD_MOD_WB1, IF_REAL, "Width dependence of b1"), -IOP( "wketa", B3SOIPD_MOD_WKETA, IF_REAL, "Width dependence of keta"), -IOP( "wketas", B3SOIPD_MOD_WKETAS, IF_REAL, "Width dependence of ketas"), -IOP( "wa1", B3SOIPD_MOD_WA1, IF_REAL, "Width dependence of a1"), -IOP( "wa2", B3SOIPD_MOD_WA2, IF_REAL, "Width dependence of a2"), -IOP( "wrdsw", B3SOIPD_MOD_WRDSW, IF_REAL, "Width dependence of rdsw "), -IOP( "wprwb", B3SOIPD_MOD_WPRWB, IF_REAL, "Width dependence of prwb "), -IOP( "wprwg", B3SOIPD_MOD_WPRWG, IF_REAL, "Width dependence of prwg "), -IOP( "wwr", B3SOIPD_MOD_WWR, IF_REAL, "Width dependence of wr"), -IOP( "wnfactor", B3SOIPD_MOD_WNFACTOR, IF_REAL, "Width dependence of nfactor"), -IOP( "wdwg", B3SOIPD_MOD_WDWG, IF_REAL, "Width dependence of dwg"), -IOP( "wdwb", B3SOIPD_MOD_WDWB, IF_REAL, "Width dependence of dwb"), -IOP( "wvoff", B3SOIPD_MOD_WVOFF, IF_REAL, "Width dependence of voff"), -IOP( "weta0", B3SOIPD_MOD_WETA0, IF_REAL, "Width dependence of eta0"), -IOP( "wetab", B3SOIPD_MOD_WETAB, IF_REAL, "Width dependence of etab"), -IOP( "wdsub", B3SOIPD_MOD_WDSUB, IF_REAL, "Width dependence of dsub"), -IOP( "wcit", B3SOIPD_MOD_WCIT, IF_REAL, "Width dependence of cit"), -IOP( "wcdsc", B3SOIPD_MOD_WCDSC, IF_REAL, "Width dependence of cdsc"), -IOP( "wcdscb", B3SOIPD_MOD_WCDSCB, IF_REAL, "Width dependence of cdscb"), -IOP( "wcdscd", B3SOIPD_MOD_WCDSCD, IF_REAL, "Width dependence of cdscd"), -IOP( "wpclm", B3SOIPD_MOD_WPCLM, IF_REAL, "Width dependence of pclm"), -IOP( "wpdiblc1", B3SOIPD_MOD_WPDIBL1, IF_REAL, "Width dependence of pdiblc1"), -IOP( "wpdiblc2", B3SOIPD_MOD_WPDIBL2, IF_REAL, "Width dependence of pdiblc2"), -IOP( "wpdiblcb", B3SOIPD_MOD_WPDIBLB, IF_REAL, "Width dependence of pdiblcb"), -IOP( "wdrout", B3SOIPD_MOD_WDROUT, IF_REAL, "Width dependence of drout"), -IOP( "wpvag", B3SOIPD_MOD_WPVAG, IF_REAL, "Width dependence of pvag"), -IOP( "wdelta", B3SOIPD_MOD_WDELTA, IF_REAL, "Width dependence of delta"), -IOP( "walpha0", B3SOIPD_MOD_WALPHA0, IF_REAL, "Width dependence of alpha0"), -IOP( "wfbjtii", B3SOIPD_MOD_WFBJTII, IF_REAL, "Width dependence of fbjtii"), -IOP( "wbeta0", B3SOIPD_MOD_WBETA0, IF_REAL, "Width dependence of beta0"), -IOP( "wbeta1", B3SOIPD_MOD_WBETA1, IF_REAL, "Width dependence of beta1"), -IOP( "wbeta2", B3SOIPD_MOD_WBETA2, IF_REAL, "Width dependence of beta2"), -IOP( "wvdsatii0", B3SOIPD_MOD_WVDSATII0, IF_REAL, "Width dependence of vdsatii0"), -IOP( "wlii", B3SOIPD_MOD_WLII, IF_REAL, "Width dependence of lii"), -IOP( "wesatii", B3SOIPD_MOD_WESATII, IF_REAL, "Width dependence of esatii"), -IOP( "wsii0", B3SOIPD_MOD_WSII0, IF_REAL, "Width dependence of sii0"), -IOP( "wsii1", B3SOIPD_MOD_WSII1, IF_REAL, "Width dependence of sii1"), -IOP( "wsii2", B3SOIPD_MOD_WSII2, IF_REAL, "Width dependence of sii2"), -IOP( "wsiid", B3SOIPD_MOD_WSIID, IF_REAL, "Width dependence of siid"), -IOP( "wagidl", B3SOIPD_MOD_WAGIDL, IF_REAL, "Width dependence of agidl"), -IOP( "wbgidl", B3SOIPD_MOD_WBGIDL, IF_REAL, "Width dependence of bgidl"), -IOP( "wngidl", B3SOIPD_MOD_WNGIDL, IF_REAL, "Width dependence of ngidl"), -IOP( "wntun", B3SOIPD_MOD_WNTUN, IF_REAL, "Width dependence of ntun"), -IOP( "wndiode", B3SOIPD_MOD_WNDIODE, IF_REAL, "Width dependence of ndiode"), -IOP( "wnrecf0", B3SOIPD_MOD_WNRECF0, IF_REAL, "Width dependence of nrecf0"), -IOP( "wnrecr0", B3SOIPD_MOD_WNRECR0, IF_REAL, "Width dependence of nrecr0"), -IOP( "wisbjt", B3SOIPD_MOD_WISBJT, IF_REAL, "Width dependence of isbjt"), -IOP( "wisdif", B3SOIPD_MOD_WISDIF, IF_REAL, "Width dependence of isdif"), -IOP( "wisrec", B3SOIPD_MOD_WISREC, IF_REAL, "Width dependence of isrec"), -IOP( "wistun", B3SOIPD_MOD_WISTUN, IF_REAL, "Width dependence of istun"), -IOP( "wvrec0", B3SOIPD_MOD_WVREC0, IF_REAL, "Width dependence of vrec0"), -IOP( "wvtun0", B3SOIPD_MOD_WVTUN0, IF_REAL, "Width dependence of vtun0"), -IOP( "wnbjt", B3SOIPD_MOD_WNBJT, IF_REAL, "Width dependence of nbjt"), -IOP( "wlbjt0", B3SOIPD_MOD_WLBJT0, IF_REAL, "Width dependence of lbjt0"), -IOP( "wvabjt", B3SOIPD_MOD_WVABJT, IF_REAL, "Width dependence of vabjt"), -IOP( "waely", B3SOIPD_MOD_WAELY, IF_REAL, "Width dependence of aely"), -IOP( "wahli", B3SOIPD_MOD_WAHLI, IF_REAL, "Width dependence of ahli"), -IOP( "wvsdfb", B3SOIPD_MOD_WVSDFB, IF_REAL, "Width dependence of vsdfb"), -IOP( "wvsdth", B3SOIPD_MOD_WVSDTH, IF_REAL, "Width dependence of vsdth"), -IOP( "wdelvt", B3SOIPD_MOD_WDELVT, IF_REAL, "Width dependence of delvt"), -IOP( "wacde", B3SOIPD_MOD_WACDE, IF_REAL, "Width dependence of acde"), -IOP( "wmoin", B3SOIPD_MOD_WMOIN, IF_REAL, "Width dependence of amoin"), -/* Cross-term Dependence */ -IOP( "pnch", B3SOIPD_MOD_PNPEAK, IF_REAL, "Cross-term dependence of nch"), -IOP( "pnsub", B3SOIPD_MOD_PNSUB, IF_REAL, "Cross-term dependence of nsub"), -IOP( "pngate", B3SOIPD_MOD_PNGATE, IF_REAL, "Cross-term dependence of ngate"), -IOP( "pvth0", B3SOIPD_MOD_PVTH0, IF_REAL,"Cross-term dependence of vth0"), -IOP( "pk1", B3SOIPD_MOD_PK1, IF_REAL, "Cross-term dependence of k1"), -IOP( "pk1w1", B3SOIPD_MOD_PK1W1, IF_REAL, "Cross-term dependence of k1w1"), -IOP( "pk1w2", B3SOIPD_MOD_PK1W2, IF_REAL, "Cross-term dependence of k1w2"), -IOP( "pk2", B3SOIPD_MOD_PK2, IF_REAL, "Cross-term dependence of k2"), -IOP( "pk3", B3SOIPD_MOD_PK3, IF_REAL, "Cross-term dependence of k3"), -IOP( "pk3b", B3SOIPD_MOD_PK3B, IF_REAL, "Cross-term dependence of k3b"), -IOP( "pkb1", B3SOIPD_MOD_PKB1, IF_REAL, "Cross-term dependence of kb1"), -IOP( "pw0", B3SOIPD_MOD_PW0, IF_REAL, "Cross-term dependence of w0"), -IOP( "pnlx", B3SOIPD_MOD_PNLX, IF_REAL, "Cross-term dependence of nlx"), -IOP( "pdvt0", B3SOIPD_MOD_PDVT0, IF_REAL, "Cross-term dependence of dvt0"), -IOP( "pdvt1", B3SOIPD_MOD_PDVT1, IF_REAL, "Cross-term dependence of dvt1"), -IOP( "pdvt2", B3SOIPD_MOD_PDVT2, IF_REAL, "Cross-term dependence of dvt2"), -IOP( "pdvt0w", B3SOIPD_MOD_PDVT0W, IF_REAL, "Cross-term dependence of dvt0w"), -IOP( "pdvt1w", B3SOIPD_MOD_PDVT1W, IF_REAL, "Cross-term dependence of dvt1w"), -IOP( "pdvt2w", B3SOIPD_MOD_PDVT2W, IF_REAL, "Cross-term dependence of dvt2w"), -IOP( "pu0", B3SOIPD_MOD_PU0, IF_REAL, "Cross-term dependence of u0"), -IOP( "pua", B3SOIPD_MOD_PUA, IF_REAL, "Cross-term dependence of ua"), -IOP( "pub", B3SOIPD_MOD_PUB, IF_REAL, "Cross-term dependence of ub"), -IOP( "puc", B3SOIPD_MOD_PUC, IF_REAL, "Cross-term dependence of uc"), -IOP( "pvsat", B3SOIPD_MOD_PVSAT, IF_REAL, "Cross-term dependence of vsat"), -IOP( "pa0", B3SOIPD_MOD_PA0, IF_REAL, "Cross-term dependence of a0"), -IOP( "pags", B3SOIPD_MOD_PAGS, IF_REAL, "Cross-term dependence of ags"), -IOP( "pb0", B3SOIPD_MOD_PB0, IF_REAL, "Cross-term dependence of b0"), -IOP( "pb1", B3SOIPD_MOD_PB1, IF_REAL, "Cross-term dependence of b1"), -IOP( "pketa", B3SOIPD_MOD_PKETA, IF_REAL, "Cross-term dependence of keta"), -IOP( "pketas", B3SOIPD_MOD_PKETAS, IF_REAL, "Cross-term dependence of ketas"), -IOP( "pa1", B3SOIPD_MOD_PA1, IF_REAL, "Cross-term dependence of a1"), -IOP( "pa2", B3SOIPD_MOD_PA2, IF_REAL, "Cross-term dependence of a2"), -IOP( "prdsw", B3SOIPD_MOD_PRDSW, IF_REAL, "Cross-term dependence of rdsw "), -IOP( "pprwb", B3SOIPD_MOD_PPRWB, IF_REAL, "Cross-term dependence of prwb "), -IOP( "pprwg", B3SOIPD_MOD_PPRWG, IF_REAL, "Cross-term dependence of prwg "), -IOP( "pwr", B3SOIPD_MOD_PWR, IF_REAL, "Cross-term dependence of wr"), -IOP( "pnfactor", B3SOIPD_MOD_PNFACTOR, IF_REAL, "Cross-term dependence of nfactor"), -IOP( "pdwg", B3SOIPD_MOD_PDWG, IF_REAL, "Cross-term dependence of dwg"), -IOP( "pdwb", B3SOIPD_MOD_PDWB, IF_REAL, "Cross-term dependence of dwb"), -IOP( "pvoff", B3SOIPD_MOD_PVOFF, IF_REAL, "Cross-term dependence of voff"), -IOP( "peta0", B3SOIPD_MOD_PETA0, IF_REAL, "Cross-term dependence of eta0"), -IOP( "petab", B3SOIPD_MOD_PETAB, IF_REAL, "Cross-term dependence of etab"), -IOP( "pdsub", B3SOIPD_MOD_PDSUB, IF_REAL, "Cross-term dependence of dsub"), -IOP( "pcit", B3SOIPD_MOD_PCIT, IF_REAL, "Cross-term dependence of cit"), -IOP( "pcdsc", B3SOIPD_MOD_PCDSC, IF_REAL, "Cross-term dependence of cdsc"), -IOP( "pcdscb", B3SOIPD_MOD_PCDSCB, IF_REAL, "Cross-term dependence of cdscb"), -IOP( "pcdscd", B3SOIPD_MOD_PCDSCD, IF_REAL, "Cross-term dependence of cdscd"), -IOP( "ppclm", B3SOIPD_MOD_PPCLM, IF_REAL, "Cross-term dependence of pclm"), -IOP( "ppdiblc1", B3SOIPD_MOD_PPDIBL1, IF_REAL, "Cross-term dependence of pdiblc1"), -IOP( "ppdiblc2", B3SOIPD_MOD_PPDIBL2, IF_REAL, "Cross-term dependence of pdiblc2"), -IOP( "ppdiblcb", B3SOIPD_MOD_PPDIBLB, IF_REAL, "Cross-term dependence of pdiblcb"), -IOP( "pdrout", B3SOIPD_MOD_PDROUT, IF_REAL, "Cross-term dependence of drout"), -IOP( "ppvag", B3SOIPD_MOD_PPVAG, IF_REAL, "Cross-term dependence of pvag"), -IOP( "pdelta", B3SOIPD_MOD_PDELTA, IF_REAL, "Cross-term dependence of delta"), -IOP( "palpha0", B3SOIPD_MOD_PALPHA0, IF_REAL, "Cross-term dependence of alpha0"), -IOP( "pfbjtii", B3SOIPD_MOD_PFBJTII, IF_REAL, "Cross-term dependence of fbjtii"), -IOP( "pbeta0", B3SOIPD_MOD_PBETA0, IF_REAL, "Cross-term dependence of beta0"), -IOP( "pbeta1", B3SOIPD_MOD_PBETA1, IF_REAL, "Cross-term dependence of beta1"), -IOP( "pbeta2", B3SOIPD_MOD_PBETA2, IF_REAL, "Cross-term dependence of beta2"), -IOP( "pvdsatii0", B3SOIPD_MOD_PVDSATII0, IF_REAL, "Cross-term dependence of vdsatii0"), -IOP( "plii", B3SOIPD_MOD_PLII, IF_REAL, "Cross-term dependence of lii"), -IOP( "pesatii", B3SOIPD_MOD_PESATII, IF_REAL, "Cross-term dependence of esatii"), -IOP( "psii0", B3SOIPD_MOD_PSII0, IF_REAL, "Cross-term dependence of sii0"), -IOP( "psii1", B3SOIPD_MOD_PSII1, IF_REAL, "Cross-term dependence of sii1"), -IOP( "psii2", B3SOIPD_MOD_PSII2, IF_REAL, "Cross-term dependence of sii2"), -IOP( "psiid", B3SOIPD_MOD_PSIID, IF_REAL, "Cross-term dependence of siid"), -IOP( "pagidl", B3SOIPD_MOD_PAGIDL, IF_REAL, "Cross-term dependence of agidl"), -IOP( "pbgidl", B3SOIPD_MOD_PBGIDL, IF_REAL, "Cross-term dependence of bgidl"), -IOP( "pngidl", B3SOIPD_MOD_PNGIDL, IF_REAL, "Cross-term dependence of ngidl"), -IOP( "pntun", B3SOIPD_MOD_PNTUN, IF_REAL, "Cross-term dependence of ntun"), -IOP( "pndiode", B3SOIPD_MOD_PNDIODE, IF_REAL, "Cross-term dependence of ndiode"), -IOP( "pnrecf0", B3SOIPD_MOD_PNRECF0, IF_REAL, "Cross-term dependence of nrecf0"), -IOP( "pnrecr0", B3SOIPD_MOD_PNRECR0, IF_REAL, "Cross-term dependence of nrecr0"), -IOP( "pisbjt", B3SOIPD_MOD_PISBJT, IF_REAL, "Cross-term dependence of isbjt"), -IOP( "pisdif", B3SOIPD_MOD_PISDIF, IF_REAL, "Cross-term dependence of isdif"), -IOP( "pisrec", B3SOIPD_MOD_PISREC, IF_REAL, "Cross-term dependence of isrec"), -IOP( "pistun", B3SOIPD_MOD_PISTUN, IF_REAL, "Cross-term dependence of istun"), -IOP( "pvrec0", B3SOIPD_MOD_PVREC0, IF_REAL, "Cross-term dependence of vrec0"), -IOP( "pvtun0", B3SOIPD_MOD_PVTUN0, IF_REAL, "Cross-term dependence of vtun0"), -IOP( "pnbjt", B3SOIPD_MOD_PNBJT, IF_REAL, "Cross-term dependence of nbjt"), -IOP( "plbjt0", B3SOIPD_MOD_PLBJT0, IF_REAL, "Cross-term dependence of lbjt0"), -IOP( "pvabjt", B3SOIPD_MOD_PVABJT, IF_REAL, "Cross-term dependence of vabjt"), -IOP( "paely", B3SOIPD_MOD_PAELY, IF_REAL, "Cross-term dependence of aely"), -IOP( "pahli", B3SOIPD_MOD_PAHLI, IF_REAL, "Cross-term dependence of ahli"), -IOP( "pvsdfb", B3SOIPD_MOD_PVSDFB, IF_REAL, "Cross-term dependence of vsdfb"), -IOP( "pvsdth", B3SOIPD_MOD_PVSDTH, IF_REAL, "Cross-term dependence of vsdth"), -IOP( "pdelvt", B3SOIPD_MOD_PDELVT, IF_REAL, "Cross-term dependence of delvt"), -IOP( "pacde", B3SOIPD_MOD_PACDE, IF_REAL, "Cross-term dependence of acde"), -IOP( "pmoin", B3SOIPD_MOD_PMOIN, IF_REAL, "Cross-term dependence of amoin"), -/* Added for binning - END */ - -IP( "nmos", B3SOIPD_MOD_NMOS, IF_FLAG, "Flag to indicate NMOS"), -IP( "pmos", B3SOIPD_MOD_PMOS, IF_FLAG, "Flag to indicate PMOS"), -}; - -char *B3SOIPDnames[] = { - "Drain", - "Gate", - "Source", - "Backgate", - "", - "Body", - "Temp", - "Charge", -}; - -int B3SOIPDnSize = NUMELEMS(B3SOIPDnames); -int B3SOIPDpTSize = NUMELEMS(B3SOIPDpTable); -int B3SOIPDmPTSize = NUMELEMS(B3SOIPDmPTable); -int B3SOIPDiSize = sizeof(B3SOIPDinstance); -int B3SOIPDmSize = sizeof(B3SOIPDmodel); - - diff --git a/src/spicelib/devices/bsim3soi_pd/b3soipdacld.c b/src/spicelib/devices/bsim3soi_pd/b3soipdacld.c deleted file mode 100644 index 273db4294..000000000 --- a/src/spicelib/devices/bsim3soi_pd/b3soipdacld.c +++ /dev/null @@ -1,354 +0,0 @@ -/********** -Copyright 1990 Regents of the University of California. All rights reserved. -Author: 1998 Samuel Fung, Dennis Sinitsky and Stephen Tang -File: b3soipdacld.c 98/5/01 -Modified by Pin Su 99/4/30 -Modified by Pin Su 99/9/27 -Modified by Paolo Nenzi 2002 -**********/ - -/* - * Revision 2.2.3 02/3/5 Pin Su - * BSIMPD2.2.3 release - */ - -#include "ngspice/ngspice.h" -#include "ngspice/cktdefs.h" -#include "b3soipddef.h" -#include "ngspice/sperror.h" -#include "ngspice/suffix.h" - - -int -B3SOIPDacLoad(GENmodel *inModel, CKTcircuit *ckt) -{ -B3SOIPDmodel *model = (B3SOIPDmodel*)inModel; -B3SOIPDinstance *here; -int selfheat; -double xcggb, xcgdb, xcgsb, xcgeb, xcgT; -double xcdgb, xcddb, xcdsb, xcdeb, xcdT; -double xcsgb, xcsdb, xcssb, xcseb, xcsT; -double xcbgb, xcbdb, xcbsb, xcbeb, xcbT; -double xcegb, xceeb, xceT; -double gdpr, gspr, gds; -double cggb, cgdb, cgsb, cgT; -double cdgb, cddb, cdsb, cdeb, cdT; -double cbgb, cbdb, cbsb, cbeb, cbT; -double ceeb, ceT; -double GSoverlapCap, GDoverlapCap, GEoverlapCap, FwdSum, RevSum, Gm, Gmbs, GmT; -double omega; -double dxpart, sxpart; -double gbbg, gbbdp, gbbb, gbbp, gbbsp, gbbT; -double gddpg, gddpdp, gddpsp, gddpb, gddpT; -double gsspg, gsspdp, gsspsp, gsspb, gsspT; -double gppdp, gppb, gppp, gppT; -double xcTt, cTt, gTtt, gTtg, gTtb, gTtdp, gTtsp; -double EDextrinsicCap, ESextrinsicCap; -double xcedb, xcesb; - -double m; - - omega = ckt->CKTomega; - for (; model != NULL; model = B3SOIPDnextModel(model)) - { - - for (here = B3SOIPDinstances(model); here!= NULL; - here = B3SOIPDnextInstance(here)) - { - selfheat = (model->B3SOIPDshMod == 1) && (here->B3SOIPDrth0 != 0.0); - if (here->B3SOIPDmode >= 0) - { Gm = here->B3SOIPDgm; - Gmbs = here->B3SOIPDgmbs; - GmT = model->B3SOIPDtype * here->B3SOIPDgmT; - FwdSum = Gm + Gmbs; - RevSum = 0.0; - - cbgb = here->B3SOIPDcbgb; - cbsb = here->B3SOIPDcbsb; - cbdb = here->B3SOIPDcbdb; - cbeb = here->B3SOIPDcbeb; - cbT = model->B3SOIPDtype * here->B3SOIPDcbT; - - ceeb = here->B3SOIPDceeb; - ceT = model->B3SOIPDtype * here->B3SOIPDceT; - - cggb = here->B3SOIPDcggb; - cgsb = here->B3SOIPDcgsb; - cgdb = here->B3SOIPDcgdb; - cgT = model->B3SOIPDtype * here->B3SOIPDcgT; - - cdgb = here->B3SOIPDcdgb; - cdsb = here->B3SOIPDcdsb; - cddb = here->B3SOIPDcddb; - cdeb = here->B3SOIPDcdeb; - cdT = model->B3SOIPDtype * here->B3SOIPDcdT; - - cTt = here->pParam->B3SOIPDcth; - - gbbg = -here->B3SOIPDgbgs; - gbbdp = -here->B3SOIPDgbds; - gbbb = -here->B3SOIPDgbbs; - gbbp = -here->B3SOIPDgbps; - gbbT = -model->B3SOIPDtype * here->B3SOIPDgbT; - gbbsp = - ( gbbg + gbbdp + gbbb + gbbp); - - gddpg = -here->B3SOIPDgjdg; - gddpdp = -here->B3SOIPDgjdd; - gddpb = -here->B3SOIPDgjdb; - gddpT = -model->B3SOIPDtype * here->B3SOIPDgjdT; - gddpsp = - ( gddpg + gddpdp + gddpb ); - - gsspg = -here->B3SOIPDgjsg; - gsspdp = -here->B3SOIPDgjsd; - gsspb = -here->B3SOIPDgjsb; - gsspT = -model->B3SOIPDtype * here->B3SOIPDgjsT; - gsspsp = - (gsspg + gsspdp + gsspb ); - - gppdp = 0; - gppb = -here->B3SOIPDgbpbs; - gppp = -here->B3SOIPDgbpps; - gppT = -model->B3SOIPDtype * here->B3SOIPDgbpT; - - gTtg = here->B3SOIPDgtempg; - gTtb = here->B3SOIPDgtempb; - gTtdp = here->B3SOIPDgtempd; - gTtt = here->B3SOIPDgtempT; - gTtsp = - (gTtg + gTtb + gTtdp); - - sxpart = 0.6; - dxpart = 0.4; - - } - else - { Gm = -here->B3SOIPDgm; - Gmbs = -here->B3SOIPDgmbs; - GmT = -model->B3SOIPDtype * here->B3SOIPDgmT; - FwdSum = 0.0; - RevSum = -Gm - Gmbs ; - - cdgb = - (here->B3SOIPDcdgb + here->B3SOIPDcggb + here->B3SOIPDcbgb); - cdsb = - (here->B3SOIPDcddb + here->B3SOIPDcgdb + here->B3SOIPDcbdb); - cddb = - (here->B3SOIPDcdsb + here->B3SOIPDcgsb + here->B3SOIPDcbsb); - cdeb = - (here->B3SOIPDcdeb + here->B3SOIPDcbeb + here->B3SOIPDceeb); - cdT = - model->B3SOIPDtype * (here->B3SOIPDcgT + here->B3SOIPDcbT - + here->B3SOIPDcdT + here->B3SOIPDceT); - - ceeb = here->B3SOIPDceeb; - ceT = model->B3SOIPDtype * here->B3SOIPDceT; - - cggb = here->B3SOIPDcggb; - cgsb = here->B3SOIPDcgdb; - cgdb = here->B3SOIPDcgsb; - cgT = model->B3SOIPDtype * here->B3SOIPDcgT; - - cbgb = here->B3SOIPDcbgb; - cbsb = here->B3SOIPDcbdb; - cbdb = here->B3SOIPDcbsb; - cbeb = here->B3SOIPDcbeb; - cbT = model->B3SOIPDtype * here->B3SOIPDcbT; - - cTt = here->pParam->B3SOIPDcth; - - gbbg = -here->B3SOIPDgbgs; - gbbb = -here->B3SOIPDgbbs; - gbbp = -here->B3SOIPDgbps; - gbbsp = -here->B3SOIPDgbds; - gbbT = -model->B3SOIPDtype * here->B3SOIPDgbT; - gbbdp = - ( gbbg + gbbsp + gbbb + gbbp); - - gddpg = -here->B3SOIPDgjsg; - gddpsp = -here->B3SOIPDgjsd; - gddpb = -here->B3SOIPDgjsb; - gddpT = -model->B3SOIPDtype * here->B3SOIPDgjsT; - gddpdp = - (gddpg + gddpsp + gddpb ); - - gsspg = -here->B3SOIPDgjdg; - gsspsp = -here->B3SOIPDgjdd; - gsspb = -here->B3SOIPDgjdb; - gsspT = -model->B3SOIPDtype * here->B3SOIPDgjdT; - gsspdp = - ( gsspg + gsspsp + gsspb ); - - gppb = -here->B3SOIPDgbpbs; - gppp = -here->B3SOIPDgbpps; - gppT = -model->B3SOIPDtype * here->B3SOIPDgbpT; - gppdp = - (gppb + gppp); - - gTtt = here->B3SOIPDgtempT; - gTtg = here->B3SOIPDgtempg; - gTtb = here->B3SOIPDgtempb; - gTtdp = here->B3SOIPDgtempd; - gTtsp = - (gTtt + gTtg + gTtb + gTtdp); - - gTtg = here->B3SOIPDgtempg; - gTtb = here->B3SOIPDgtempb; - gTtsp = here->B3SOIPDgtempd; - gTtt = here->B3SOIPDgtempT; - gTtdp = - (gTtg + gTtb + gTtsp); - - sxpart = 0.6; - sxpart = 0.4; - dxpart = 0.6; - } - - gdpr=here->B3SOIPDdrainConductance; - gspr=here->B3SOIPDsourceConductance; - gds= here->B3SOIPDgds; - - GSoverlapCap = here->B3SOIPDcgso; - GDoverlapCap = here->B3SOIPDcgdo; - GEoverlapCap = here->pParam->B3SOIPDcgeo; - - EDextrinsicCap = here->B3SOIPDgcde; - ESextrinsicCap = here->B3SOIPDgcse; - xcedb = -EDextrinsicCap * omega; - xcdeb = (cdeb - EDextrinsicCap) * omega; - xcddb = (cddb + GDoverlapCap + EDextrinsicCap) * omega; - xceeb = (ceeb + GEoverlapCap + EDextrinsicCap + ESextrinsicCap) * omega; - xcesb = -ESextrinsicCap * omega; - xcssb = (GSoverlapCap + ESextrinsicCap - (cgsb + cbsb + cdsb)) * omega; - - xcseb = -(cbeb + cdeb + ceeb + ESextrinsicCap) * omega; - - xcegb = (- GEoverlapCap) * omega; - xceT = ceT * omega; - xcggb = (cggb + GDoverlapCap + GSoverlapCap + GEoverlapCap) - * omega; - xcgdb = (cgdb - GDoverlapCap ) * omega; - xcgsb = (cgsb - GSoverlapCap) * omega; - xcgeb = (- GEoverlapCap) * omega; - xcgT = cgT * omega; - - xcdgb = (cdgb - GDoverlapCap) * omega; - xcdsb = cdsb * omega; - xcdT = cdT * omega; - - xcsgb = -(cggb + cbgb + cdgb + GSoverlapCap) * omega; - xcsdb = -(cgdb + cbdb + cddb) * omega; - xcsT = -(cgT + cbT + cdT + ceT) * omega; - - xcbgb = cbgb * omega; - xcbdb = cbdb * omega; - xcbsb = cbsb * omega; - xcbeb = cbeb * omega; - xcbT = cbT * omega; - - xcTt = cTt * omega; - - m = here->B3SOIPDm; - - *(here->B3SOIPDEdpPtr +1) += m * xcedb; - *(here->B3SOIPDEspPtr +1) += m * xcesb; - *(here->B3SOIPDDPePtr +1) += m * xcdeb; - *(here->B3SOIPDSPePtr +1) += m * xcseb; - *(here->B3SOIPDEgPtr +1) += m * xcegb; - *(here->B3SOIPDGePtr +1) += m * xcgeb; - - *(here->B3SOIPDEePtr +1) += m * xceeb; - - *(here->B3SOIPDGgPtr +1) += m * xcggb; - *(here->B3SOIPDGdpPtr +1) += m * xcgdb; - *(here->B3SOIPDGspPtr +1) += m * xcgsb; - - *(here->B3SOIPDDPgPtr +1) += m * xcdgb; - *(here->B3SOIPDDPdpPtr +1) += m * xcddb; - *(here->B3SOIPDDPspPtr +1) += m * xcdsb; - - *(here->B3SOIPDSPgPtr +1) += m * xcsgb; - *(here->B3SOIPDSPdpPtr +1) += m * xcsdb; - *(here->B3SOIPDSPspPtr +1) += m * xcssb; - - *(here->B3SOIPDBePtr +1) += m * xcbeb; - *(here->B3SOIPDBgPtr +1) += m * xcbgb; - *(here->B3SOIPDBdpPtr +1) += m * xcbdb; - *(here->B3SOIPDBspPtr +1) += m * xcbsb; - - *(here->B3SOIPDEbPtr +1) -= m * (xcegb + xceeb + xcedb + xcesb); - - *(here->B3SOIPDGbPtr +1) -= m * (xcggb + xcgdb + xcgsb + xcgeb); - *(here->B3SOIPDDPbPtr +1) -= m * (xcdgb + xcddb + xcdsb + xcdeb); - *(here->B3SOIPDSPbPtr +1) -= m * (xcsgb + xcsdb + xcssb + xcseb); - *(here->B3SOIPDBbPtr +1) -= m * (xcbgb + xcbdb + xcbsb + xcbeb); - - if (selfheat) - { - *(here->B3SOIPDTemptempPtr + 1) += m * xcTt; - *(here->B3SOIPDDPtempPtr + 1) += m * xcdT; - *(here->B3SOIPDSPtempPtr + 1) += m * xcsT; - *(here->B3SOIPDBtempPtr + 1) += m * xcbT; - *(here->B3SOIPDEtempPtr + 1) += m * xceT; - *(here->B3SOIPDGtempPtr + 1) += m * xcgT; - } - - - - *(here->B3SOIPDEePtr) += 0.0; - - *(here->B3SOIPDDPgPtr) += m * (Gm + gddpg); - *(here->B3SOIPDDPdpPtr) += m * (gdpr + gds + gddpdp + RevSum); - *(here->B3SOIPDDPspPtr) -= m * (gds + FwdSum - gddpsp); - *(here->B3SOIPDDPdPtr) -= m * gdpr; - - *(here->B3SOIPDSPgPtr) -= m * (Gm - gsspg); - *(here->B3SOIPDSPdpPtr) -= m * (gds + RevSum - gsspdp); - *(here->B3SOIPDSPspPtr) += m * (gspr + gds + FwdSum + gsspsp); - *(here->B3SOIPDSPsPtr) -= m * gspr; - - *(here->B3SOIPDBePtr) += 0; - *(here->B3SOIPDBgPtr) += m * gbbg; - *(here->B3SOIPDBdpPtr) += m * gbbdp; - *(here->B3SOIPDBspPtr) += m * gbbsp; - *(here->B3SOIPDBbPtr) += m * gbbb; - *(here->B3SOIPDEbPtr) += 0.0; - *(here->B3SOIPDSPbPtr) -= m * Gmbs - gsspb; - *(here->B3SOIPDDPbPtr) -= m * (-gddpb - Gmbs); - - if (selfheat) - { - *(here->B3SOIPDDPtempPtr) += m * (GmT + gddpT); - *(here->B3SOIPDSPtempPtr) += m * (-GmT + gsspT); - *(here->B3SOIPDBtempPtr) += m * gbbT; - - *(here->B3SOIPDTemptempPtr) += m * (gTtt + 1/here->pParam->B3SOIPDrth); - *(here->B3SOIPDTempgPtr) += m * gTtg; - *(here->B3SOIPDTempbPtr) += m * gTtb; - *(here->B3SOIPDTempdpPtr) += m * gTtdp; - *(here->B3SOIPDTempspPtr) += m * gTtsp; - } - - - *(here->B3SOIPDDdPtr) += m * gdpr; - *(here->B3SOIPDDdpPtr) -= m * gdpr; - *(here->B3SOIPDSsPtr) += m * gspr; - *(here->B3SOIPDSspPtr) -= m * gspr; - - - if (here->B3SOIPDbodyMod == 1) { - (*(here->B3SOIPDBpPtr) -= m * gppp); - (*(here->B3SOIPDPbPtr) += m * gppb); - (*(here->B3SOIPDPpPtr) += m * gppp); - } - if (here->B3SOIPDdebugMod != 0) - { - *(here->B3SOIPDVbsPtr) += m * 1; - *(here->B3SOIPDIdsPtr) += m * 1; - *(here->B3SOIPDIcPtr) += m * 1; - *(here->B3SOIPDIbsPtr) += m * 1; - *(here->B3SOIPDIbdPtr) += m * 1; - *(here->B3SOIPDIiiPtr) += m * 1; - *(here->B3SOIPDIgidlPtr) += m * 1; - *(here->B3SOIPDItunPtr) += m * 1; - *(here->B3SOIPDIbpPtr) += m * 1; - *(here->B3SOIPDCbgPtr) += m * 1; - *(here->B3SOIPDCbbPtr) += m * 1; - *(here->B3SOIPDCbdPtr) += m * 1; - *(here->B3SOIPDQbfPtr) += m * 1; - *(here->B3SOIPDQjsPtr) += m * 1; - *(here->B3SOIPDQjdPtr) += m * 1; - - } - - } - } - return(OK); -} - diff --git a/src/spicelib/devices/bsim3soi_pd/b3soipdask.c b/src/spicelib/devices/bsim3soi_pd/b3soipdask.c deleted file mode 100644 index d0082c543..000000000 --- a/src/spicelib/devices/bsim3soi_pd/b3soipdask.c +++ /dev/null @@ -1,281 +0,0 @@ -/********** -Copyright 1990 Regents of the University of California. All rights reserved. -Author: 1998 Samuel Fung, Dennis Sinitsky and Stephen Tang -File: b3soipdask.c 98/5/01 -Modified by Pin Su 99/4/30 -Modified by Pin Su 01/2/15 -Modified by Paolo Nenzi 2002 -**********/ - -/* - * Revision 2.2.3 02/3/5 Pin Su - * BSIMPD2.2.3 release - */ - -#include "ngspice/ngspice.h" -#include "ngspice/ifsim.h" -#include "ngspice/cktdefs.h" -#include "ngspice/devdefs.h" -#include "b3soipddef.h" -#include "ngspice/sperror.h" -#include "ngspice/suffix.h" - -int -B3SOIPDask(CKTcircuit *ckt, GENinstance *inst, int which, IFvalue *value, - IFvalue *select) -{ -B3SOIPDinstance *here = (B3SOIPDinstance*)inst; - - NG_IGNORE(select); - - switch(which) - { case B3SOIPD_L: - value->rValue = here->B3SOIPDl; - return(OK); - case B3SOIPD_W: - value->rValue = here->B3SOIPDw; - return(OK); - case B3SOIPD_M: - value->rValue = here->B3SOIPDm; - return(OK); - case B3SOIPD_AS: - value->rValue = here->B3SOIPDsourceArea; - return(OK); - case B3SOIPD_AD: - value->rValue = here->B3SOIPDdrainArea; - return(OK); - case B3SOIPD_PS: - value->rValue = here->B3SOIPDsourcePerimeter; - return(OK); - case B3SOIPD_PD: - value->rValue = here->B3SOIPDdrainPerimeter; - return(OK); - case B3SOIPD_NRS: - value->rValue = here->B3SOIPDsourceSquares; - return(OK); - case B3SOIPD_NRD: - value->rValue = here->B3SOIPDdrainSquares; - return(OK); - case B3SOIPD_OFF: - value->iValue = here->B3SOIPDoff; - return(OK); - case B3SOIPD_BJTOFF: - value->iValue = here->B3SOIPDbjtoff; - return(OK); - case B3SOIPD_RTH0: - value->rValue = here->B3SOIPDrth0; - value->rValue /= here->B3SOIPDm; - return(OK); - case B3SOIPD_CTH0: - value->rValue = here->B3SOIPDcth0; - value->rValue *= here->B3SOIPDm; - return(OK); - case B3SOIPD_NRB: - value->rValue = here->B3SOIPDbodySquares; - return(OK); - case B3SOIPD_FRBODY: - value->rValue = here->B3SOIPDfrbody; - return(OK); - - -/* v2.0 release */ - case B3SOIPD_NBC: - value->rValue = here->B3SOIPDnbc; - return(OK); - case B3SOIPD_NSEG: - value->rValue = here->B3SOIPDnseg; - return(OK); - case B3SOIPD_PDBCP: - value->rValue = here->B3SOIPDpdbcp; - return(OK); - case B3SOIPD_PSBCP: - value->rValue = here->B3SOIPDpsbcp; - return(OK); - case B3SOIPD_AGBCP: - value->rValue = here->B3SOIPDagbcp; - return(OK); - case B3SOIPD_AEBCP: - value->rValue = here->B3SOIPDaebcp; - return(OK); - case B3SOIPD_VBSUSR: - value->rValue = here->B3SOIPDvbsusr; - return(OK); - case B3SOIPD_TNODEOUT: - value->iValue = here->B3SOIPDtnodeout; - return(OK); - - - case B3SOIPD_IC_VBS: - value->rValue = here->B3SOIPDicVBS; - return(OK); - case B3SOIPD_IC_VDS: - value->rValue = here->B3SOIPDicVDS; - return(OK); - case B3SOIPD_IC_VGS: - value->rValue = here->B3SOIPDicVGS; - return(OK); - case B3SOIPD_IC_VES: - value->rValue = here->B3SOIPDicVES; - return(OK); - case B3SOIPD_IC_VPS: - value->rValue = here->B3SOIPDicVPS; - return(OK); - case B3SOIPD_DNODE: - value->iValue = here->B3SOIPDdNode; - return(OK); - case B3SOIPD_GNODE: - value->iValue = here->B3SOIPDgNode; - return(OK); - case B3SOIPD_SNODE: - value->iValue = here->B3SOIPDsNode; - return(OK); - case B3SOIPD_BNODE: - value->iValue = here->B3SOIPDbNode; - return(OK); - case B3SOIPD_ENODE: - value->iValue = here->B3SOIPDeNode; - return(OK); - case B3SOIPD_DNODEPRIME: - value->iValue = here->B3SOIPDdNodePrime; - return(OK); - case B3SOIPD_SNODEPRIME: - value->iValue = here->B3SOIPDsNodePrime; - return(OK); - case B3SOIPD_SOURCECONDUCT: - value->rValue = here->B3SOIPDsourceConductance; - value->rValue *= here->B3SOIPDm; - return(OK); - case B3SOIPD_DRAINCONDUCT: - value->rValue = here->B3SOIPDdrainConductance; - value->rValue *= here->B3SOIPDm; - return(OK); - case B3SOIPD_VBD: - value->rValue = *(ckt->CKTstate0 + here->B3SOIPDvbd); - return(OK); - case B3SOIPD_VBS: - value->rValue = *(ckt->CKTstate0 + here->B3SOIPDvbs); - return(OK); - case B3SOIPD_VGS: - value->rValue = *(ckt->CKTstate0 + here->B3SOIPDvgs); - return(OK); - case B3SOIPD_VES: - value->rValue = *(ckt->CKTstate0 + here->B3SOIPDves); - return(OK); - case B3SOIPD_VDS: - value->rValue = *(ckt->CKTstate0 + here->B3SOIPDvds); - return(OK); - case B3SOIPD_CD: - value->rValue = here->B3SOIPDcd; - value->rValue *= here->B3SOIPDm; - return(OK); - case B3SOIPD_CBS: - value->rValue = here->B3SOIPDcjs; - value->rValue *= here->B3SOIPDm; - return(OK); - case B3SOIPD_CBD: - value->rValue = here->B3SOIPDcjd; - value->rValue *= here->B3SOIPDm; - return(OK); - case B3SOIPD_GM: - value->rValue = here->B3SOIPDgm; - value->rValue *= here->B3SOIPDm; - return(OK); - case B3SOIPD_GMID: - value->rValue = here->B3SOIPDgm/here->B3SOIPDcd; - return(OK); - case B3SOIPD_GDS: - value->rValue = here->B3SOIPDgds; - value->rValue *= here->B3SOIPDm; - return(OK); - case B3SOIPD_GMBS: - value->rValue = here->B3SOIPDgmbs; - value->rValue *= here->B3SOIPDm; - return(OK); - case B3SOIPD_GBD: - value->rValue = here->B3SOIPDgjdb; - value->rValue *= here->B3SOIPDm; - return(OK); - case B3SOIPD_GBS: - value->rValue = here->B3SOIPDgjsb; - value->rValue *= here->B3SOIPDm; - return(OK); - case B3SOIPD_QB: - value->rValue = *(ckt->CKTstate0 + here->B3SOIPDqb); - value->rValue *= here->B3SOIPDm; - return(OK); - case B3SOIPD_CQB: - value->rValue = *(ckt->CKTstate0 + here->B3SOIPDcqb); - value->rValue *= here->B3SOIPDm; - return(OK); - case B3SOIPD_QG: - value->rValue = *(ckt->CKTstate0 + here->B3SOIPDqg); - value->rValue *= here->B3SOIPDm; - return(OK); - case B3SOIPD_CQG: - value->rValue = *(ckt->CKTstate0 + here->B3SOIPDcqg); - value->rValue *= here->B3SOIPDm; - return(OK); - case B3SOIPD_QD: - value->rValue = *(ckt->CKTstate0 + here->B3SOIPDqd); - value->rValue *= here->B3SOIPDm; - return(OK); - case B3SOIPD_CQD: - value->rValue = *(ckt->CKTstate0 + here->B3SOIPDcqd); - value->rValue *= here->B3SOIPDm; - return(OK); - case B3SOIPD_CGG: - value->rValue = here->B3SOIPDcggb; - value->rValue *= here->B3SOIPDm; - return(OK); - case B3SOIPD_CGD: - value->rValue = here->B3SOIPDcgdb; - value->rValue *= here->B3SOIPDm; - return(OK); - case B3SOIPD_CGS: - value->rValue = here->B3SOIPDcgsb; - value->rValue *= here->B3SOIPDm; - return(OK); - case B3SOIPD_CDG: - value->rValue = here->B3SOIPDcdgb; - value->rValue *= here->B3SOIPDm; - return(OK); - case B3SOIPD_CDD: - value->rValue = here->B3SOIPDcddb; - value->rValue *= here->B3SOIPDm; - return(OK); - case B3SOIPD_CDS: - value->rValue = here->B3SOIPDcdsb; - value->rValue *= here->B3SOIPDm; - return(OK); - case B3SOIPD_CBG: - value->rValue = here->B3SOIPDcbgb; - value->rValue *= here->B3SOIPDm; - return(OK); - case B3SOIPD_CBDB: - value->rValue = here->B3SOIPDcbdb; - value->rValue *= here->B3SOIPDm; - return(OK); - case B3SOIPD_CBSB: - value->rValue = here->B3SOIPDcbsb; - value->rValue *= here->B3SOIPDm; - return(OK); - case B3SOIPD_VON: - value->rValue = here->B3SOIPDvon; - return(OK); - case B3SOIPD_VDSAT: - value->rValue = here->B3SOIPDvdsat; - return(OK); - case B3SOIPD_QBS: - value->rValue = *(ckt->CKTstate0 + here->B3SOIPDqbs); - value->rValue *= here->B3SOIPDm; - return(OK); - case B3SOIPD_QBD: - value->rValue = *(ckt->CKTstate0 + here->B3SOIPDqbd); - value->rValue *= here->B3SOIPDm; - return(OK); - default: - return(E_BADPARM); - } - /* NOTREACHED */ -} - diff --git a/src/spicelib/devices/bsim3soi_pd/b3soipdcheck.c b/src/spicelib/devices/bsim3soi_pd/b3soipdcheck.c deleted file mode 100644 index 66721e7d0..000000000 --- a/src/spicelib/devices/bsim3soi_pd/b3soipdcheck.c +++ /dev/null @@ -1,742 +0,0 @@ -/********** -Copyright 1990 Regents of the University of California. All rights reserved. -Author: 1998 Samuel Fung, Dennis Sinitsky and Stephen Tang -File: b3soipdcheck.c 98/5/01 -Modified by Pin Su and Jan Feng 99/2/15 -Modified by Pin Su 99/4/30 -Modified by Pin Su 00/3/1 -Modified by Pin Su and Hui Wan 02/3/5 -Modifies by Paolo Nenzi 2002 -**********/ - -/* - * Revision 2.2.3 02/3/5 Pin Su - * BSIMPD2.2.3 release - */ - -#include "ngspice/ngspice.h" -#include "ngspice/cktdefs.h" -#include "b3soipddef.h" -#include "ngspice/trandefs.h" -#include "ngspice/const.h" -#include "ngspice/sperror.h" -#include "ngspice/devdefs.h" -#include "ngspice/suffix.h" - -int -B3SOIPDcheckModel(B3SOIPDmodel *model, B3SOIPDinstance *here, CKTcircuit *ckt) -{ -struct b3soipdSizeDependParam *pParam; -int Fatal_Flag = 0; -FILE *fplog; - - NG_IGNORE(ckt); - - if ((fplog = fopen("b3soipdv223check.log", "w")) != NULL) - { pParam = here->pParam; - fprintf(fplog, "B3SOIPDV223 Parameter Check\n"); - fprintf(fplog, "Model = %s\n", model->B3SOIPDmodName); - fprintf(fplog, "W = %g, L = %g, M = %g\n", here->B3SOIPDw, - here->B3SOIPDl, here->B3SOIPDm); - - - if (pParam->B3SOIPDnlx < -pParam->B3SOIPDleff) - { fprintf(fplog, "Fatal: Nlx = %g is less than -Leff.\n", - pParam->B3SOIPDnlx); - printf("Fatal: Nlx = %g is less than -Leff.\n", - pParam->B3SOIPDnlx); - Fatal_Flag = 1; - } - - if (model->B3SOIPDtox <= 0.0) - { fprintf(fplog, "Fatal: Tox = %g is not positive.\n", - model->B3SOIPDtox); - printf("Fatal: Tox = %g is not positive.\n", model->B3SOIPDtox); - Fatal_Flag = 1; - } - -/* v2.2.3 */ - if (model->B3SOIPDtox - model->B3SOIPDdtoxcv <= 0.0) - { fprintf(fplog, "Fatal: Tox - dtoxcv = %g is not positive.\n", - model->B3SOIPDtox - model->B3SOIPDdtoxcv); - printf("Fatal: Tox - dtoxcv = %g is not positive.\n", model->B3SOIPDtox - model->B3SOIPDdtoxcv); - Fatal_Flag = 1; - } - - - if (model->B3SOIPDtbox <= 0.0) - { fprintf(fplog, "Fatal: Tbox = %g is not positive.\n", - model->B3SOIPDtbox); - printf("Fatal: Tbox = %g is not positive.\n", model->B3SOIPDtbox); - Fatal_Flag = 1; - } - - if (pParam->B3SOIPDnpeak <= 0.0) - { fprintf(fplog, "Fatal: Nch = %g is not positive.\n", - pParam->B3SOIPDnpeak); - printf("Fatal: Nch = %g is not positive.\n", - pParam->B3SOIPDnpeak); - Fatal_Flag = 1; - } - if (pParam->B3SOIPDngate < 0.0) - { fprintf(fplog, "Fatal: Ngate = %g is not positive.\n", - pParam->B3SOIPDngate); - printf("Fatal: Ngate = %g Ngate is not positive.\n", - pParam->B3SOIPDngate); - Fatal_Flag = 1; - } - if (pParam->B3SOIPDngate > 1.e25) - { fprintf(fplog, "Fatal: Ngate = %g is too high.\n", - pParam->B3SOIPDngate); - printf("Fatal: Ngate = %g Ngate is too high\n", - pParam->B3SOIPDngate); - Fatal_Flag = 1; - } - - if (pParam->B3SOIPDdvt1 < 0.0) - { fprintf(fplog, "Fatal: Dvt1 = %g is negative.\n", - pParam->B3SOIPDdvt1); - printf("Fatal: Dvt1 = %g is negative.\n", pParam->B3SOIPDdvt1); - Fatal_Flag = 1; - } - - if (pParam->B3SOIPDdvt1w < 0.0) - { fprintf(fplog, "Fatal: Dvt1w = %g is negative.\n", - pParam->B3SOIPDdvt1w); - printf("Fatal: Dvt1w = %g is negative.\n", pParam->B3SOIPDdvt1w); - Fatal_Flag = 1; - } - - if (pParam->B3SOIPDw0 == -pParam->B3SOIPDweff) - { fprintf(fplog, "Fatal: (W0 + Weff) = 0 cauing divided-by-zero.\n"); - printf("Fatal: (W0 + Weff) = 0 cauing divided-by-zero.\n"); - Fatal_Flag = 1; - } - - if (pParam->B3SOIPDdsub < 0.0) - { fprintf(fplog, "Fatal: Dsub = %g is negative.\n", pParam->B3SOIPDdsub); - printf("Fatal: Dsub = %g is negative.\n", pParam->B3SOIPDdsub); - Fatal_Flag = 1; - } - if (pParam->B3SOIPDb1 == -pParam->B3SOIPDweff) - { fprintf(fplog, "Fatal: (B1 + Weff) = 0 causing divided-by-zero.\n"); - printf("Fatal: (B1 + Weff) = 0 causing divided-by-zero.\n"); - Fatal_Flag = 1; - } - if (pParam->B3SOIPDu0temp <= 0.0) - { fprintf(fplog, "Fatal: u0 at current temperature = %g is not positive.\n", pParam->B3SOIPDu0temp); - printf("Fatal: u0 at current temperature = %g is not positive.\n", - pParam->B3SOIPDu0temp); - Fatal_Flag = 1; - } - -/* Check delta parameter */ - if (pParam->B3SOIPDdelta < 0.0) - { fprintf(fplog, "Fatal: Delta = %g is less than zero.\n", - pParam->B3SOIPDdelta); - printf("Fatal: Delta = %g is less than zero.\n", pParam->B3SOIPDdelta); - Fatal_Flag = 1; - } - - if (pParam->B3SOIPDvsattemp <= 0.0) - { fprintf(fplog, "Fatal: Vsat at current temperature = %g is not positive.\n", pParam->B3SOIPDvsattemp); - printf("Fatal: Vsat at current temperature = %g is not positive.\n", - pParam->B3SOIPDvsattemp); - Fatal_Flag = 1; - } -/* Check Rout parameters */ - if (pParam->B3SOIPDpclm <= 0.0) - { fprintf(fplog, "Fatal: Pclm = %g is not positive.\n", pParam->B3SOIPDpclm); - printf("Fatal: Pclm = %g is not positive.\n", pParam->B3SOIPDpclm); - Fatal_Flag = 1; - } - - if (pParam->B3SOIPDdrout < 0.0) - { fprintf(fplog, "Fatal: Drout = %g is negative.\n", pParam->B3SOIPDdrout); - printf("Fatal: Drout = %g is negative.\n", pParam->B3SOIPDdrout); - Fatal_Flag = 1; - } - if ( model->B3SOIPDunitLengthGateSidewallJctCap > 0.0) - { - if (here->B3SOIPDdrainPerimeter < pParam->B3SOIPDweff) - { fprintf(fplog, "Warning: Pd = %g is less than W.\n", - here->B3SOIPDdrainPerimeter); - printf("Warning: Pd = %g is less than W.\n", - here->B3SOIPDdrainPerimeter); - here->B3SOIPDdrainPerimeter =pParam->B3SOIPDweff; - } - if (here->B3SOIPDsourcePerimeter < pParam->B3SOIPDweff) - { fprintf(fplog, "Warning: Ps = %g is less than W.\n", - here->B3SOIPDsourcePerimeter); - printf("Warning: Ps = %g is less than W.\n", - here->B3SOIPDsourcePerimeter); - here->B3SOIPDsourcePerimeter =pParam->B3SOIPDweff; - } - } -/* Check capacitance parameters */ - if (pParam->B3SOIPDclc < 0.0) - { fprintf(fplog, "Fatal: Clc = %g is negative.\n", pParam->B3SOIPDclc); - printf("Fatal: Clc = %g is negative.\n", pParam->B3SOIPDclc); - Fatal_Flag = 1; - } - -/* v2.2.3 */ - if (pParam->B3SOIPDmoin < 5.0) - { fprintf(fplog, "Warning: Moin = %g is too small.\n", - pParam->B3SOIPDmoin); - printf("Warning: Moin = %g is too small.\n", pParam->B3SOIPDmoin); - } - if (pParam->B3SOIPDmoin > 25.0) - { fprintf(fplog, "Warning: Moin = %g is too large.\n", - pParam->B3SOIPDmoin); - printf("Warning: Moin = %g is too large.\n", pParam->B3SOIPDmoin); - } - - - if (model->B3SOIPDcapMod == 3) { - if (pParam->B3SOIPDacde < 0.4) - { fprintf (fplog, "Warning: Acde = %g is too small.\n", - pParam->B3SOIPDacde); - printf ("Warning: Acde = %g is too small.\n", - pParam->B3SOIPDacde); - } - if (pParam->B3SOIPDacde > 1.6) - { fprintf (fplog, "Warning: Acde = %g is too large.\n", - pParam->B3SOIPDacde); - printf ("Warning: Acde = %g is too large.\n", - pParam->B3SOIPDacde); - } - } -/* v2.2.3 */ - - if (model->B3SOIPDparamChk ==1) - { -/* Check L and W parameters */ - if (pParam->B3SOIPDleff <= 5.0e-8) - { fprintf(fplog, "Warning: Leff = %g may be too small.\n", - pParam->B3SOIPDleff); - printf("Warning: Leff = %g may be too small.\n", - pParam->B3SOIPDleff); - } - - if (pParam->B3SOIPDleffCV <= 5.0e-8) - { fprintf(fplog, "Warning: Leff for CV = %g may be too small.\n", - pParam->B3SOIPDleffCV); - printf("Warning: Leff for CV = %g may be too small.\n", - pParam->B3SOIPDleffCV); - } - - if (pParam->B3SOIPDweff <= 1.0e-7) - { fprintf(fplog, "Warning: Weff = %g may be too small.\n", - pParam->B3SOIPDweff); - printf("Warning: Weff = %g may be too small.\n", - pParam->B3SOIPDweff); - } - - if (pParam->B3SOIPDweffCV <= 1.0e-7) - { fprintf(fplog, "Warning: Weff for CV = %g may be too small.\n", - pParam->B3SOIPDweffCV); - printf("Warning: Weff for CV = %g may be too small.\n", - pParam->B3SOIPDweffCV); - } - -/* Check threshold voltage parameters */ - if (pParam->B3SOIPDnlx < 0.0) - { fprintf(fplog, "Warning: Nlx = %g is negative.\n", pParam->B3SOIPDnlx); - printf("Warning: Nlx = %g is negative.\n", pParam->B3SOIPDnlx); - } - if (model->B3SOIPDtox < 1.0e-9) - { fprintf(fplog, "Warning: Tox = %g is less than 10A.\n", - model->B3SOIPDtox); - printf("Warning: Tox = %g is less than 10A.\n", model->B3SOIPDtox); - } - - if (pParam->B3SOIPDnpeak <= 1.0e15) - { fprintf(fplog, "Warning: Nch = %g may be too small.\n", - pParam->B3SOIPDnpeak); - printf("Warning: Nch = %g may be too small.\n", - pParam->B3SOIPDnpeak); - } - else if (pParam->B3SOIPDnpeak >= 1.0e21) - { fprintf(fplog, "Warning: Nch = %g may be too large.\n", - pParam->B3SOIPDnpeak); - printf("Warning: Nch = %g may be too large.\n", - pParam->B3SOIPDnpeak); - } - - if (fabs(pParam->B3SOIPDnsub) >= 1.0e21) - { fprintf(fplog, "Warning: Nsub = %g may be too large.\n", - pParam->B3SOIPDnsub); - printf("Warning: Nsub = %g may be too large.\n", - pParam->B3SOIPDnsub); - } - - if ((pParam->B3SOIPDngate > 0.0) && - (pParam->B3SOIPDngate <= 1.e18)) - { fprintf(fplog, "Warning: Ngate = %g is less than 1.E18cm^-3.\n", - pParam->B3SOIPDngate); - printf("Warning: Ngate = %g is less than 1.E18cm^-3.\n", - pParam->B3SOIPDngate); - } - - if (pParam->B3SOIPDdvt0 < 0.0) - { fprintf(fplog, "Warning: Dvt0 = %g is negative.\n", - pParam->B3SOIPDdvt0); - printf("Warning: Dvt0 = %g is negative.\n", pParam->B3SOIPDdvt0); - } - - if (fabs(1.0e-6 / (pParam->B3SOIPDw0 + pParam->B3SOIPDweff)) > 10.0) - { fprintf(fplog, "Warning: (W0 + Weff) may be too small.\n"); - printf("Warning: (W0 + Weff) may be too small.\n"); - } - -/* Check subthreshold parameters */ - if (pParam->B3SOIPDnfactor < 0.0) - { fprintf(fplog, "Warning: Nfactor = %g is negative.\n", - pParam->B3SOIPDnfactor); - printf("Warning: Nfactor = %g is negative.\n", pParam->B3SOIPDnfactor); - } - if (pParam->B3SOIPDcdsc < 0.0) - { fprintf(fplog, "Warning: Cdsc = %g is negative.\n", - pParam->B3SOIPDcdsc); - printf("Warning: Cdsc = %g is negative.\n", pParam->B3SOIPDcdsc); - } - if (pParam->B3SOIPDcdscd < 0.0) - { fprintf(fplog, "Warning: Cdscd = %g is negative.\n", - pParam->B3SOIPDcdscd); - printf("Warning: Cdscd = %g is negative.\n", pParam->B3SOIPDcdscd); - } -/* Check DIBL parameters */ - if (pParam->B3SOIPDeta0 < 0.0) - { fprintf(fplog, "Warning: Eta0 = %g is negative.\n", - pParam->B3SOIPDeta0); - printf("Warning: Eta0 = %g is negative.\n", pParam->B3SOIPDeta0); - } - -/* Check Abulk parameters */ - if (fabs(1.0e-6 / (pParam->B3SOIPDb1 + pParam->B3SOIPDweff)) > 10.0) - { fprintf(fplog, "Warning: (B1 + Weff) may be too small.\n"); - printf("Warning: (B1 + Weff) may be too small.\n"); - } - -/* Check Saturation parameters */ - if (pParam->B3SOIPDa2 < 0.01) - { fprintf(fplog, "Warning: A2 = %g is too small. Set to 0.01.\n", pParam->B3SOIPDa2); - printf("Warning: A2 = %g is too small. Set to 0.01.\n", - pParam->B3SOIPDa2); - pParam->B3SOIPDa2 = 0.01; - } - else if (pParam->B3SOIPDa2 > 1.0) - { fprintf(fplog, "Warning: A2 = %g is larger than 1. A2 is set to 1 and A1 is set to 0.\n", - pParam->B3SOIPDa2); - printf("Warning: A2 = %g is larger than 1. A2 is set to 1 and A1 is set to 0.\n", - pParam->B3SOIPDa2); - pParam->B3SOIPDa2 = 1.0; - pParam->B3SOIPDa1 = 0.0; - - } - - if (pParam->B3SOIPDrdsw < 0.0) - { fprintf(fplog, "Warning: Rdsw = %g is negative. Set to zero.\n", - pParam->B3SOIPDrdsw); - printf("Warning: Rdsw = %g is negative. Set to zero.\n", - pParam->B3SOIPDrdsw); - pParam->B3SOIPDrdsw = 0.0; - pParam->B3SOIPDrds0 = 0.0; - } - else if ((pParam->B3SOIPDrds0 > 0.0) && (pParam->B3SOIPDrds0 < 0.001)) - { fprintf(fplog, "Warning: Rds at current temperature = %g is less than 0.001 ohm. Set to zero.\n", - pParam->B3SOIPDrds0); - printf("Warning: Rds at current temperature = %g is less than 0.001 ohm. Set to zero.\n", - pParam->B3SOIPDrds0); - pParam->B3SOIPDrds0 = 0.0; - } - if (pParam->B3SOIPDvsattemp < 1.0e3) - { fprintf(fplog, "Warning: Vsat at current temperature = %g may be too small.\n", pParam->B3SOIPDvsattemp); - printf("Warning: Vsat at current temperature = %g may be too small.\n", pParam->B3SOIPDvsattemp); - } - - if (pParam->B3SOIPDpdibl1 < 0.0) - { fprintf(fplog, "Warning: Pdibl1 = %g is negative.\n", - pParam->B3SOIPDpdibl1); - printf("Warning: Pdibl1 = %g is negative.\n", pParam->B3SOIPDpdibl1); - } - if (pParam->B3SOIPDpdibl2 < 0.0) - { fprintf(fplog, "Warning: Pdibl2 = %g is negative.\n", - pParam->B3SOIPDpdibl2); - printf("Warning: Pdibl2 = %g is negative.\n", pParam->B3SOIPDpdibl2); - } -/* Check overlap capacitance parameters */ - if (model->B3SOIPDcgdo < 0.0) - { fprintf(fplog, "Warning: cgdo = %g is negative. Set to zero.\n", model->B3SOIPDcgdo); - printf("Warning: cgdo = %g is negative. Set to zero.\n", model->B3SOIPDcgdo); - model->B3SOIPDcgdo = 0.0; - } - if (model->B3SOIPDcgso < 0.0) - { fprintf(fplog, "Warning: cgso = %g is negative. Set to zero.\n", model->B3SOIPDcgso); - printf("Warning: cgso = %g is negative. Set to zero.\n", model->B3SOIPDcgso); - model->B3SOIPDcgso = 0.0; - } - if (model->B3SOIPDcgeo < 0.0) - { fprintf(fplog, "Warning: cgeo = %g is negative. Set to zero.\n", model->B3SOIPDcgeo); - printf("Warning: cgeo = %g is negative. Set to zero.\n", model->B3SOIPDcgeo); - model->B3SOIPDcgeo = 0.0; - } - - if (model->B3SOIPDntun < 0.0) - { fprintf(fplog, "Warning: Ntun = %g is negative.\n", - model->B3SOIPDntun); - printf("Warning: Ntun = %g is negative.\n", model->B3SOIPDntun); - } - - if (model->B3SOIPDndiode < 0.0) - { fprintf(fplog, "Warning: Ndiode = %g is negative.\n", - model->B3SOIPDndiode); - printf("Warning: Ndiode = %g is negative.\n", model->B3SOIPDndiode); - } - - if (model->B3SOIPDisbjt < 0.0) - { fprintf(fplog, "Warning: Isbjt = %g is negative.\n", - model->B3SOIPDisbjt); - printf("Warning: Isbjt = %g is negative.\n", model->B3SOIPDisbjt); - } - - if (model->B3SOIPDisdif < 0.0) - { fprintf(fplog, "Warning: Isdif = %g is negative.\n", - model->B3SOIPDisdif); - printf("Warning: Isdif = %g is negative.\n", model->B3SOIPDisdif); - } - - if (model->B3SOIPDisrec < 0.0) - { fprintf(fplog, "Warning: Isrec = %g is negative.\n", - model->B3SOIPDisrec); - printf("Warning: Isrec = %g is negative.\n", model->B3SOIPDisrec); - } - - if (model->B3SOIPDistun < 0.0) - { fprintf(fplog, "Warning: Istun = %g is negative.\n", - model->B3SOIPDistun); - printf("Warning: Istun = %g is negative.\n", model->B3SOIPDistun); - } - - if (model->B3SOIPDtt < 0.0) - { fprintf(fplog, "Warning: Tt = %g is negative.\n", - model->B3SOIPDtt); - printf("Warning: Tt = %g is negative.\n", model->B3SOIPDtt); - } - - if (model->B3SOIPDcsdmin < 0.0) - { fprintf(fplog, "Warning: Csdmin = %g is negative.\n", - model->B3SOIPDcsdmin); - printf("Warning: Csdmin = %g is negative.\n", model->B3SOIPDcsdmin); - } - - if (model->B3SOIPDcsdesw < 0.0) - { fprintf(fplog, "Warning: Csdesw = %g is negative.\n", - model->B3SOIPDcsdesw); - printf("Warning: Csdesw = %g is negative.\n", model->B3SOIPDcsdesw); - } - - if (model->B3SOIPDasd < 0.0) - { fprintf(fplog, "Warning: Asd = %g should be within (0, 1).\n", - model->B3SOIPDasd); - printf("Warning: Asd = %g should be within (0, 1).\n", model->B3SOIPDasd); - } - - if (model->B3SOIPDrth0 < 0.0) - { fprintf(fplog, "Warning: Rth0 = %g is negative.\n", - model->B3SOIPDrth0); - printf("Warning: Rth0 = %g is negative.\n", model->B3SOIPDrth0); - } - - if (model->B3SOIPDcth0 < 0.0) - { fprintf(fplog, "Warning: Cth0 = %g is negative.\n", - model->B3SOIPDcth0); - printf("Warning: Cth0 = %g is negative.\n", model->B3SOIPDcth0); - } - - if (model->B3SOIPDrbody < 0.0) - { fprintf(fplog, "Warning: Rbody = %g is negative.\n", - model->B3SOIPDrbody); - printf("Warning: Rbody = %g is negative.\n", model->B3SOIPDrbody); - } - - if (model->B3SOIPDrbsh < 0.0) - { fprintf(fplog, "Warning: Rbsh = %g is negative.\n", - model->B3SOIPDrbsh); - printf("Warning: Rbsh = %g is negative.\n", model->B3SOIPDrbsh); - } - - -/* v2.2 release */ - if (model->B3SOIPDwth0 < 0.0) - { fprintf(fplog, "Warning: WTH0 = %g is negative.\n", - model->B3SOIPDwth0); - printf("Warning: Wth0 = %g is negative.\n", model->B3SOIPDwth0); - } - if (model->B3SOIPDrhalo < 0.0) - { fprintf(fplog, "Warning: RHALO = %g is negative.\n", - model->B3SOIPDrhalo); - printf("Warning: Rhalo = %g is negative.\n", model->B3SOIPDrhalo); - } - if (model->B3SOIPDntox < 0.0) - { fprintf(fplog, "Warning: NTOX = %g is negative.\n", - model->B3SOIPDntox); - printf("Warning: Ntox = %g is negative.\n", model->B3SOIPDntox); - } - if (model->B3SOIPDtoxref < 0.0) - { fprintf(fplog, "Warning: TOXREF = %g is negative.\n", - model->B3SOIPDtoxref); - printf("Warning: Toxref = %g is negative.\n", model->B3SOIPDtoxref); - Fatal_Flag = 1; - } - if (model->B3SOIPDebg < 0.0) - { fprintf(fplog, "Warning: EBG = %g is negative.\n", - model->B3SOIPDebg); - printf("Warning: Ebg = %g is negative.\n", model->B3SOIPDebg); - } - if (model->B3SOIPDvevb < 0.0) - { fprintf(fplog, "Warning: VEVB = %g is negative.\n", - model->B3SOIPDvevb); - printf("Warning: Vevb = %g is negative.\n", model->B3SOIPDvevb); - } - if (model->B3SOIPDalphaGB1 < 0.0) - { fprintf(fplog, "Warning: ALPHAGB1 = %g is negative.\n", - model->B3SOIPDalphaGB1); - printf("Warning: AlphaGB1 = %g is negative.\n", model->B3SOIPDalphaGB1); - } - if (model->B3SOIPDbetaGB1 < 0.0) - { fprintf(fplog, "Warning: BETAGB1 = %g is negative.\n", - model->B3SOIPDbetaGB1); - printf("Warning: BetaGB1 = %g is negative.\n", model->B3SOIPDbetaGB1); - } - if (model->B3SOIPDvgb1 < 0.0) - { fprintf(fplog, "Warning: VGB1 = %g is negative.\n", - model->B3SOIPDvgb1); - printf("Warning: Vgb1 = %g is negative.\n", model->B3SOIPDvgb1); - } - if (model->B3SOIPDvecb < 0.0) - { fprintf(fplog, "Warning: VECB = %g is negative.\n", - model->B3SOIPDvecb); - printf("Warning: Vecb = %g is negative.\n", model->B3SOIPDvecb); - } - if (model->B3SOIPDalphaGB2 < 0.0) - { fprintf(fplog, "Warning: ALPHAGB2 = %g is negative.\n", - model->B3SOIPDalphaGB2); - printf("Warning: AlphaGB2 = %g is negative.\n", model->B3SOIPDalphaGB2); - } - if (model->B3SOIPDbetaGB2 < 0.0) - { fprintf(fplog, "Warning: BETAGB2 = %g is negative.\n", - model->B3SOIPDbetaGB2); - printf("Warning: BetaGB2 = %g is negative.\n", model->B3SOIPDbetaGB2); - } - if (model->B3SOIPDvgb2 < 0.0) - { fprintf(fplog, "Warning: VGB2 = %g is negative.\n", - model->B3SOIPDvgb2); - printf("Warning: Vgb2 = %g is negative.\n", model->B3SOIPDvgb2); - } - if (model->B3SOIPDtoxqm <= 0.0) - { fprintf(fplog, "Fatal: Toxqm = %g is not positive.\n", - model->B3SOIPDtoxqm); - printf("Fatal: Toxqm = %g is not positive.\n", model->B3SOIPDtoxqm); - Fatal_Flag = 1; - } - if (model->B3SOIPDvoxh < 0.0) - { fprintf(fplog, "Warning: Voxh = %g is negative.\n", - model->B3SOIPDvoxh); - printf("Warning: Voxh = %g is negative.\n", model->B3SOIPDvoxh); - } - if (model->B3SOIPDdeltavox <= 0.0) - { fprintf(fplog, "Fatal: Deltavox = %g is not positive.\n", - model->B3SOIPDdeltavox); - printf("Fatal: Deltavox = %g is not positive.\n", model->B3SOIPDdeltavox); - } - - -/* v2.0 release */ - if (model->B3SOIPDk1w1 < 0.0) - { fprintf(fplog, "Warning: K1W1 = %g is negative.\n", - model->B3SOIPDk1w1); - printf("Warning: K1w1 = %g is negative.\n", model->B3SOIPDk1w1); - } - if (model->B3SOIPDk1w2 < 0.0) - { fprintf(fplog, "Warning: K1W2 = %g is negative.\n", - model->B3SOIPDk1w2); - printf("Warning: K1w2 = %g is negative.\n", model->B3SOIPDk1w2); - } - if (model->B3SOIPDketas < 0.0) - { fprintf(fplog, "Warning: KETAS = %g is negative.\n", - model->B3SOIPDketas); - printf("Warning: Ketas = %g is negative.\n", model->B3SOIPDketas); - } - if (model->B3SOIPDdwbc < 0.0) - { fprintf(fplog, "Warning: DWBC = %g is negative.\n", - model->B3SOIPDdwbc); - printf("Warning: Dwbc = %g is negative.\n", model->B3SOIPDdwbc); - } - if (model->B3SOIPDbeta0 < 0.0) - { fprintf(fplog, "Warning: BETA0 = %g is negative.\n", - model->B3SOIPDbeta0); - printf("Warning: Beta0 = %g is negative.\n", model->B3SOIPDbeta0); - } - if (model->B3SOIPDbeta1 < 0.0) - { fprintf(fplog, "Warning: BETA1 = %g is negative.\n", - model->B3SOIPDbeta1); - printf("Warning: Beta1 = %g is negative.\n", model->B3SOIPDbeta1); - } - if (model->B3SOIPDbeta2 < 0.0) - { fprintf(fplog, "Warning: BETA2 = %g is negative.\n", - model->B3SOIPDbeta2); - printf("Warning: Beta2 = %g is negative.\n", model->B3SOIPDbeta2); - } - if (model->B3SOIPDtii < 0.0) - { fprintf(fplog, "Warning: TII = %g is negative.\n", - model->B3SOIPDtii); - printf("Warning: Tii = %g is negative.\n", model->B3SOIPDtii); - } - if (model->B3SOIPDlii < 0.0) - { fprintf(fplog, "Warning: LII = %g is negative.\n", - model->B3SOIPDlii); - printf("Warning: Lii = %g is negative.\n", model->B3SOIPDlii); - } - if (model->B3SOIPDsii1 < 0.0) - { fprintf(fplog, "Warning: SII1 = %g is negative.\n", - model->B3SOIPDsii1); - printf("Warning: Sii1 = %g is negative.\n", model->B3SOIPDsii1); - } - if (model->B3SOIPDsii2 < 0.0) - { fprintf(fplog, "Warning: SII2 = %g is negative.\n", - model->B3SOIPDsii2); - printf("Warning: Sii2 = %g is negative.\n", model->B3SOIPDsii1); - } - if (model->B3SOIPDsiid < 0.0) - { fprintf(fplog, "Warning: SIID = %g is negative.\n", - model->B3SOIPDsiid); - printf("Warning: Siid = %g is negative.\n", model->B3SOIPDsiid); - } - if (model->B3SOIPDfbjtii < 0.0) - { fprintf(fplog, "Warning: FBJTII = %g is negative.\n", - model->B3SOIPDfbjtii); - printf("Warning: fbjtii = %g is negative.\n", model->B3SOIPDfbjtii); - } - if (model->B3SOIPDvrec0 < 0.0) - { fprintf(fplog, "Warning: VREC0 = %g is negative.\n", - model->B3SOIPDvrec0); - printf("Warning: Vrec0 = %g is negative.\n", model->B3SOIPDvrec0); - } - if (model->B3SOIPDvtun0 < 0.0) - { fprintf(fplog, "Warning: VTUN0 = %g is negative.\n", - model->B3SOIPDvtun0); - printf("Warning: Vtun0 = %g is negative.\n", model->B3SOIPDvtun0); - } - if (model->B3SOIPDnbjt < 0.0) - { fprintf(fplog, "Warning: NBJT = %g is negative.\n", - model->B3SOIPDnbjt); - printf("Warning: Nbjt = %g is negative.\n", model->B3SOIPDnbjt); - } - if (model->B3SOIPDaely < 0.0) - { fprintf(fplog, "Warning: AELY = %g is negative.\n", - model->B3SOIPDaely); - printf("Warning: Aely = %g is negative.\n", model->B3SOIPDaely); - } - if (model->B3SOIPDahli < 0.0) - { fprintf(fplog, "Warning: AHLI = %g is negative.\n", - model->B3SOIPDahli); - printf("Warning: Ahli = %g is negative.\n", model->B3SOIPDahli); - } - if (model->B3SOIPDrbody < 0.0) - { fprintf(fplog, "Warning: RBODY = %g is negative.\n", - model->B3SOIPDrbody); - printf("Warning: Rbody = %g is negative.\n", model->B3SOIPDrbody); - } - if (model->B3SOIPDrbsh < 0.0) - { fprintf(fplog, "Warning: RBSH = %g is negative.\n", - model->B3SOIPDrbsh); - printf("Warning: Rbsh = %g is negative.\n", model->B3SOIPDrbsh); - } - if (model->B3SOIPDntrecf < 0.0) - { fprintf(fplog, "Warning: NTRECF = %g is negative.\n", - model->B3SOIPDntrecf); - printf("Warning: Ntrecf = %g is negative.\n", model->B3SOIPDntrecf); - } - if (model->B3SOIPDntrecr < 0.0) - { fprintf(fplog, "Warning: NTRECR = %g is negative.\n", - model->B3SOIPDntrecr); - printf("Warning: Ntrecr = %g is negative.\n", model->B3SOIPDntrecr); - } - if (model->B3SOIPDndif < 0.0) - { fprintf(fplog, "Warning: NDIF = %g is negative.\n", - model->B3SOIPDndif); - printf("Warning: Ndif = %g is negative.\n", model->B3SOIPDndif); - } - if (model->B3SOIPDtcjswg < 0.0) - { fprintf(fplog, "Warning: TCJSWG = %g is negative.\n", - model->B3SOIPDtcjswg); - printf("Warning: Tcjswg = %g is negative.\n", model->B3SOIPDtcjswg); - } - if (model->B3SOIPDtpbswg < 0.0) - { fprintf(fplog, "Warning: TPBSWG = %g is negative.\n", - model->B3SOIPDtpbswg); - printf("Warning: Tpbswg = %g is negative.\n", model->B3SOIPDtpbswg); - } - if ((model->B3SOIPDacde < 0.4) || (model->B3SOIPDacde > 1.6)) - { fprintf(fplog, "Warning: ACDE = %g is out of range.\n", - model->B3SOIPDacde); - printf("Warning: Acde = %g is out of range.\n", model->B3SOIPDacde); - } - if ((model->B3SOIPDmoin < 5.0)||(model->B3SOIPDmoin > 25.0)) - { fprintf(fplog, "Warning: MOIN = %g is out of range.\n", - model->B3SOIPDmoin); - printf("Warning: Moin = %g is out of range.\n", model->B3SOIPDmoin); - } - if (model->B3SOIPDdlbg < 0.0) - { fprintf(fplog, "Warning: DLBG = %g is negative.\n", - model->B3SOIPDdlbg); - printf("Warning: dlbg = %g is negative.\n", model->B3SOIPDdlbg); - } - - - if (model->B3SOIPDagidl < 0.0) - { fprintf(fplog, "Warning: AGIDL = %g is negative.\n", - model->B3SOIPDagidl); - printf("Warning: Agidl = %g is negative.\n", model->B3SOIPDagidl); - } - if (model->B3SOIPDbgidl < 0.0) - { fprintf(fplog, "Warning: BGIDL = %g is negative.\n", - model->B3SOIPDbgidl); - printf("Warning: Bgidl = %g is negative.\n", model->B3SOIPDbgidl); - } - if (model->B3SOIPDngidl < 0.0) - { fprintf(fplog, "Warning: NGIDL = %g is negative.\n", - model->B3SOIPDngidl); - printf("Warning: Ngidl = %g is negative.\n", model->B3SOIPDngidl); - } - if (model->B3SOIPDesatii < 0.0) - { fprintf(fplog, "Warning: Esatii = %g should be within positive.\n", - model->B3SOIPDesatii); - printf("Warning: Esatii = %g should be within (0, 1).\n", model->B3SOIPDesatii); - } - - - if (model->B3SOIPDxj > model->B3SOIPDtsi) - { fprintf(fplog, "Warning: Xj = %g is thicker than Tsi = %g.\n", - model->B3SOIPDxj, model->B3SOIPDtsi); - printf("Warning: Xj = %g is thicker than Tsi = %g.\n", - model->B3SOIPDxj, model->B3SOIPDtsi); - } - - if (model->B3SOIPDcapMod < 2) - { fprintf(fplog, "Warning: capMod < 2 is not supported by BSIM3SOI.\n"); - printf("Warning: Warning: capMod < 2 is not supported by BSIM3SOI.\n"); - } - - }/* loop for the parameter check for warning messages */ - fclose(fplog); - } - else - { fprintf(stderr, "Warning: Can't open log file. Parameter checking skipped.\n"); - } - - return(Fatal_Flag); -} - diff --git a/src/spicelib/devices/bsim3soi_pd/b3soipdcvtest.c b/src/spicelib/devices/bsim3soi_pd/b3soipdcvtest.c deleted file mode 100644 index b12763c7a..000000000 --- a/src/spicelib/devices/bsim3soi_pd/b3soipdcvtest.c +++ /dev/null @@ -1,92 +0,0 @@ -/********** -Copyright 1990 Regents of the University of California. All rights reserved. -Author: 1998 Samuel Fung, Dennis Sinitsky and Stephen Tang -File: b3soipdcvtest.c 98/5/01 -Modified by Paolo Nenzi 2002 -**********/ - -/* - * Revision 2.2.3 02/3/5 Pin Su - * BSIMPD2.2.3 release - */ - -#include "ngspice/ngspice.h" -#include "ngspice/cktdefs.h" -#include "b3soipddef.h" -#include "ngspice/trandefs.h" -#include "ngspice/const.h" -#include "ngspice/devdefs.h" -#include "ngspice/sperror.h" -#include "ngspice/suffix.h" - - -int -B3SOIPDconvTest(GENmodel *inModel, CKTcircuit *ckt) -{ -B3SOIPDmodel *model = (B3SOIPDmodel*)inModel; -B3SOIPDinstance *here; -double delvbd, delvbs, delvds, delvgd, delvgs, vbd, vbs, vds; -double cbd, cbhat, cbs, cd, cdhat, tol, vgd, vgdo, vgs; - - /* loop through all the B3SOIPD device models */ - for (; model != NULL; model = B3SOIPDnextModel(model)) - { /* loop through all the instances of the model */ - for (here = B3SOIPDinstances(model); here != NULL ; - here=B3SOIPDnextInstance(here)) - { - vbs = model->B3SOIPDtype - * (*(ckt->CKTrhsOld+here->B3SOIPDbNode) - - *(ckt->CKTrhsOld+here->B3SOIPDsNodePrime)); - vgs = model->B3SOIPDtype - * (*(ckt->CKTrhsOld+here->B3SOIPDgNode) - - *(ckt->CKTrhsOld+here->B3SOIPDsNodePrime)); - vds = model->B3SOIPDtype - * (*(ckt->CKTrhsOld+here->B3SOIPDdNodePrime) - - *(ckt->CKTrhsOld+here->B3SOIPDsNodePrime)); - vbd = vbs - vds; - vgd = vgs - vds; - vgdo = *(ckt->CKTstate0 + here->B3SOIPDvgs) - - *(ckt->CKTstate0 + here->B3SOIPDvds); - delvbs = vbs - *(ckt->CKTstate0 + here->B3SOIPDvbs); - delvbd = vbd - *(ckt->CKTstate0 + here->B3SOIPDvbd); - delvgs = vgs - *(ckt->CKTstate0 + here->B3SOIPDvgs); - delvds = vds - *(ckt->CKTstate0 + here->B3SOIPDvds); - delvgd = vgd-vgdo; - - cd = here->B3SOIPDcd; - if (here->B3SOIPDmode >= 0) - { cdhat = cd - here->B3SOIPDgjdb * delvbd - + here->B3SOIPDgmbs * delvbs + here->B3SOIPDgm * delvgs - + here->B3SOIPDgds * delvds; - } - else - { cdhat = cd - (here->B3SOIPDgjdb - here->B3SOIPDgmbs) * delvbd - - here->B3SOIPDgm * delvgd + here->B3SOIPDgds * delvds; - } - - /* - * check convergence - */ - if ((here->B3SOIPDoff == 0) || (!(ckt->CKTmode & MODEINITFIX))) - { tol = ckt->CKTreltol * MAX(fabs(cdhat), fabs(cd)) - + ckt->CKTabstol; - if (fabs(cdhat - cd) >= tol) - { ckt->CKTnoncon++; - return(OK); - } - cbs = here->B3SOIPDcjs; - cbd = here->B3SOIPDcjd; - cbhat = cbs + cbd + here->B3SOIPDgjdb * delvbd - + here->B3SOIPDgjsb * delvbs; - tol = ckt->CKTreltol * MAX(fabs(cbhat), fabs(cbs + cbd)) - + ckt->CKTabstol; - if (fabs(cbhat - (cbs + cbd)) > tol) - { ckt->CKTnoncon++; - return(OK); - } - } - } - } - return(OK); -} - diff --git a/src/spicelib/devices/bsim3soi_pd/b3soipddef.h b/src/spicelib/devices/bsim3soi_pd/b3soipddef.h deleted file mode 100644 index 769eca872..000000000 --- a/src/spicelib/devices/bsim3soi_pd/b3soipddef.h +++ /dev/null @@ -1,2255 +0,0 @@ -/********** -Copyright 1990 Regents of the University of California. All rights reserved. -Author: 1998 Samuel Fung -File: b3soipddef.h -Modified by Pin Su and Jan Feng 99/2/15 -Modified by Pin Su 99/4/30 -Modified by Pin Su and Wei Jin 99/9/27 -Modified by Pin Su 00/3/1 -Modified by Pin Su 01/2/15 -Modified by Pin Su and Hui Wan 02/3/5 -Modified by Paolo Nenzi 2002 -**********/ - -#ifndef B3SOIPD -#define B3SOIPD - -#define SOICODE -/* #define BULKCODE */ - -#include "ngspice/ifsim.h" -#include "ngspice/gendefs.h" -#include "ngspice/cktdefs.h" -#include "ngspice/complex.h" -#include "ngspice/noisedef.h" - -typedef struct sB3SOIPDinstance -{ - - struct GENinstance gen; - -#define B3SOIPDmodPtr(inst) ((struct sB3SOIPDmodel *)((inst)->gen.GENmodPtr)) -#define B3SOIPDnextInstance(inst) ((struct sB3SOIPDinstance *)((inst)->gen.GENnextInstance)) -#define B3SOIPDname gen.GENname -#define B3SOIPDstates gen.GENstate - - const int B3SOIPDdNode; - const int B3SOIPDgNode; - const int B3SOIPDsNode; - const int B3SOIPDeNode; - const int B3SOIPDbNodeExt; - const int B3SOIPDtempNodeExt; - const int B3SOIPDpNodeExt; - int B3SOIPDpNode; - int B3SOIPDbNode; - int B3SOIPDtempNode; - int B3SOIPDdNodePrime; - int B3SOIPDsNodePrime; - - int B3SOIPDvbsNode; - /* for Debug */ - int B3SOIPDidsNode; - int B3SOIPDicNode; - int B3SOIPDibsNode; - int B3SOIPDibdNode; - int B3SOIPDiiiNode; - int B3SOIPDigNode; - int B3SOIPDgiggNode; - int B3SOIPDgigdNode; - int B3SOIPDgigbNode; - int B3SOIPDigidlNode; - int B3SOIPDitunNode; - int B3SOIPDibpNode; - int B3SOIPDcbbNode; - int B3SOIPDcbdNode; - int B3SOIPDcbgNode; - - int B3SOIPDqbfNode; - int B3SOIPDqjsNode; - int B3SOIPDqjdNode; - - - double B3SOIPDphi; - double B3SOIPDvtm; - double B3SOIPDni; - double B3SOIPDueff; - double B3SOIPDthetavth; - double B3SOIPDvon; - double B3SOIPDvdsat; - double B3SOIPDcgdo; - double B3SOIPDcgso; - double B3SOIPDcgeo; - - double B3SOIPDids; - double B3SOIPDic; - double B3SOIPDibs; - double B3SOIPDibd; - double B3SOIPDiii; - double B3SOIPDig; - double B3SOIPDgigg; - double B3SOIPDgigd; - double B3SOIPDgigb; - double B3SOIPDigidl; - double B3SOIPDitun; - double B3SOIPDibp; - double B3SOIPDabeff; - double B3SOIPDvbseff; - double B3SOIPDcbg; - double B3SOIPDcbb; - double B3SOIPDcbd; - double B3SOIPDqb; - double B3SOIPDqbf; - double B3SOIPDqjs; - double B3SOIPDqjd; - int B3SOIPDfloat; - - double B3SOIPDl; - double B3SOIPDw; - double B3SOIPDm; - double B3SOIPDdrainArea; - double B3SOIPDsourceArea; - double B3SOIPDdrainSquares; - double B3SOIPDsourceSquares; - double B3SOIPDdrainPerimeter; - double B3SOIPDsourcePerimeter; - double B3SOIPDsourceConductance; - double B3SOIPDdrainConductance; - - double B3SOIPDicVBS; - double B3SOIPDicVDS; - double B3SOIPDicVGS; - double B3SOIPDicVES; - double B3SOIPDicVPS; - int B3SOIPDbjtoff; - int B3SOIPDbodyMod; - int B3SOIPDdebugMod; - double B3SOIPDrth0; - double B3SOIPDcth0; - double B3SOIPDbodySquares; - double B3SOIPDrbodyext; - double B3SOIPDfrbody; - - -/* v2.0 release */ - double B3SOIPDnbc; - double B3SOIPDnseg; - double B3SOIPDpdbcp; - double B3SOIPDpsbcp; - double B3SOIPDagbcp; - double B3SOIPDaebcp; - double B3SOIPDvbsusr; - int B3SOIPDtnodeout; - -/* Deleted from pParam and moved to here */ - double B3SOIPDcsesw; - double B3SOIPDcdesw; - double B3SOIPDcsbox; - double B3SOIPDcdbox; - double B3SOIPDcsmin; - double B3SOIPDcdmin; - double B3SOIPDst4; - double B3SOIPDdt4; - - int B3SOIPDoff; - int B3SOIPDmode; - - /* OP point */ - double B3SOIPDqinv; - double B3SOIPDcd; - double B3SOIPDcjs; - double B3SOIPDcjd; - double B3SOIPDcbody; -/* v2.2 release */ - double B3SOIPDcgate; - double B3SOIPDgigs; - double B3SOIPDgigT; - - double B3SOIPDcbodcon; - double B3SOIPDcth; - double B3SOIPDcsubstrate; - - double B3SOIPDgm; - double B3SOIPDcb; - double B3SOIPDcdrain; - double B3SOIPDgds; - double B3SOIPDgmbs; - double B3SOIPDgmT; - - double B3SOIPDgbbs; - double B3SOIPDgbgs; - double B3SOIPDgbds; - double B3SOIPDgbps; - double B3SOIPDgbT; - - double B3SOIPDgjsd; - double B3SOIPDgjsb; - double B3SOIPDgjsg; - double B3SOIPDgjsT; - - double B3SOIPDgjdb; - double B3SOIPDgjdd; - double B3SOIPDgjdg; - double B3SOIPDgjdT; - - double B3SOIPDgbpbs; - double B3SOIPDgbpps; - double B3SOIPDgbpT; - - double B3SOIPDgtempb; - double B3SOIPDgtempg; - double B3SOIPDgtempd; - double B3SOIPDgtempT; - - double B3SOIPDcggb; - double B3SOIPDcgdb; - double B3SOIPDcgsb; - double B3SOIPDcgT; - - double B3SOIPDcbgb; - double B3SOIPDcbdb; - double B3SOIPDcbsb; - double B3SOIPDcbeb; - double B3SOIPDcbT; - - double B3SOIPDcdgb; - double B3SOIPDcddb; - double B3SOIPDcdsb; - double B3SOIPDcdeb; - double B3SOIPDcdT; - - double B3SOIPDceeb; - double B3SOIPDceT; - - double B3SOIPDqse; - double B3SOIPDgcse; - double B3SOIPDqde; - double B3SOIPDgcde; - double B3SOIPDrds; /* v2.2.3 */ - double B3SOIPDVgsteff; /* v2.2.3 */ - double B3SOIPDVdseff; /* v2.2.3 */ - double B3SOIPDAbovVgst2Vtm; /* v2.2.3 */ - - struct b3soipdSizeDependParam *pParam; - - unsigned B3SOIPDlGiven :1; - unsigned B3SOIPDwGiven :1; - unsigned B3SOIPDmGiven :1; - unsigned B3SOIPDdrainAreaGiven :1; - unsigned B3SOIPDsourceAreaGiven :1; - unsigned B3SOIPDdrainSquaresGiven :1; - unsigned B3SOIPDsourceSquaresGiven :1; - unsigned B3SOIPDdrainPerimeterGiven :1; - unsigned B3SOIPDsourcePerimeterGiven :1; - unsigned B3SOIPDdNodePrimeSet :1; - unsigned B3SOIPDsNodePrimeSet :1; - unsigned B3SOIPDicVBSGiven :1; - unsigned B3SOIPDicVDSGiven :1; - unsigned B3SOIPDicVGSGiven :1; - unsigned B3SOIPDicVESGiven :1; - unsigned B3SOIPDicVPSGiven :1; - unsigned B3SOIPDbjtoffGiven :1; - unsigned B3SOIPDdebugModGiven :1; - unsigned B3SOIPDrth0Given :1; - unsigned B3SOIPDcth0Given :1; - unsigned B3SOIPDbodySquaresGiven :1; - unsigned B3SOIPDfrbodyGiven: 1; - -/* v2.0 release */ - unsigned B3SOIPDnbcGiven :1; - unsigned B3SOIPDnsegGiven :1; - unsigned B3SOIPDpdbcpGiven :1; - unsigned B3SOIPDpsbcpGiven :1; - unsigned B3SOIPDagbcpGiven :1; - unsigned B3SOIPDaebcpGiven :1; - unsigned B3SOIPDvbsusrGiven :1; - unsigned B3SOIPDtnodeoutGiven :1; - unsigned B3SOIPDoffGiven :1; - - double *B3SOIPDGePtr; - double *B3SOIPDDPePtr; - double *B3SOIPDSPePtr; - - double *B3SOIPDEePtr; - double *B3SOIPDEbPtr; - double *B3SOIPDBePtr; - double *B3SOIPDEgPtr; - double *B3SOIPDEdpPtr; - double *B3SOIPDEspPtr; - double *B3SOIPDTemptempPtr; - double *B3SOIPDTempdpPtr; - double *B3SOIPDTempspPtr; - double *B3SOIPDTempgPtr; - double *B3SOIPDTempbPtr; - double *B3SOIPDGtempPtr; - double *B3SOIPDDPtempPtr; - double *B3SOIPDSPtempPtr; - double *B3SOIPDEtempPtr; - double *B3SOIPDBtempPtr; - double *B3SOIPDPtempPtr; - double *B3SOIPDBpPtr; - double *B3SOIPDPbPtr; - double *B3SOIPDPpPtr; - double *B3SOIPDDdPtr; - double *B3SOIPDGgPtr; - double *B3SOIPDSsPtr; - double *B3SOIPDBbPtr; - double *B3SOIPDDPdpPtr; - double *B3SOIPDSPspPtr; - double *B3SOIPDDdpPtr; - double *B3SOIPDGbPtr; - double *B3SOIPDGdpPtr; - double *B3SOIPDGspPtr; - double *B3SOIPDSspPtr; - double *B3SOIPDBdpPtr; - double *B3SOIPDBspPtr; - double *B3SOIPDDPspPtr; - double *B3SOIPDDPdPtr; - double *B3SOIPDBgPtr; - double *B3SOIPDDPgPtr; - double *B3SOIPDSPgPtr; - double *B3SOIPDSPsPtr; - double *B3SOIPDDPbPtr; - double *B3SOIPDSPbPtr; - double *B3SOIPDSPdpPtr; - - double *B3SOIPDVbsPtr; - /* Debug */ - double *B3SOIPDIdsPtr; - double *B3SOIPDIcPtr; - double *B3SOIPDIbsPtr; - double *B3SOIPDIbdPtr; - double *B3SOIPDIiiPtr; - double *B3SOIPDIgPtr; - double *B3SOIPDGiggPtr; - double *B3SOIPDGigdPtr; - double *B3SOIPDGigbPtr; - double *B3SOIPDIgidlPtr; - double *B3SOIPDItunPtr; - double *B3SOIPDIbpPtr; - double *B3SOIPDCbbPtr; - double *B3SOIPDCbdPtr; - double *B3SOIPDCbgPtr; - double *B3SOIPDqbPtr; - double *B3SOIPDQbfPtr; - double *B3SOIPDQjsPtr; - double *B3SOIPDQjdPtr; - - -#define B3SOIPDvbd B3SOIPDstates+ 0 -#define B3SOIPDvbs B3SOIPDstates+ 1 -#define B3SOIPDvgs B3SOIPDstates+ 2 -#define B3SOIPDvds B3SOIPDstates+ 3 -#define B3SOIPDves B3SOIPDstates+ 4 -#define B3SOIPDvps B3SOIPDstates+ 5 - -#define B3SOIPDvg B3SOIPDstates+ 6 -#define B3SOIPDvd B3SOIPDstates+ 7 -#define B3SOIPDvs B3SOIPDstates+ 8 -#define B3SOIPDvp B3SOIPDstates+ 9 -#define B3SOIPDve B3SOIPDstates+ 10 -#define B3SOIPDdeltemp B3SOIPDstates+ 11 - -#define B3SOIPDqb B3SOIPDstates+ 12 -#define B3SOIPDcqb B3SOIPDstates+ 13 -#define B3SOIPDqg B3SOIPDstates+ 14 -#define B3SOIPDcqg B3SOIPDstates+ 15 -#define B3SOIPDqd B3SOIPDstates+ 16 -#define B3SOIPDcqd B3SOIPDstates+ 17 -#define B3SOIPDqe B3SOIPDstates+ 18 -#define B3SOIPDcqe B3SOIPDstates+ 19 - -#define B3SOIPDqbs B3SOIPDstates+ 20 -#define B3SOIPDqbd B3SOIPDstates+ 21 -#define B3SOIPDqbe B3SOIPDstates+ 22 - -#define B3SOIPDqth B3SOIPDstates+ 23 -#define B3SOIPDcqth B3SOIPDstates+ 24 - -#define B3SOIPDnumStates 25 - - -/* indices to the array of B3SOIPD NOISE SOURCES */ - -#define B3SOIPDRDNOIZ 0 -#define B3SOIPDRSNOIZ 1 -#define B3SOIPDIDNOIZ 2 -#define B3SOIPDFLNOIZ 3 -#define B3SOIPDFBNOIZ 4 -#define B3SOIPDTOTNOIZ 5 - -#define B3SOIPDNSRCS 6 /* the number of MOSFET(3) noise sources */ - -#ifndef NONOISE - double B3SOIPDnVar[NSTATVARS][B3SOIPDNSRCS]; -#else /* NONOISE */ - double **B3SOIPDnVar; -#endif /* NONOISE */ - -} B3SOIPDinstance ; - -struct b3soipdSizeDependParam -{ - double Width; - double Length; - double Rth0; - double Cth0; - - double B3SOIPDcdsc; - double B3SOIPDcdscb; - double B3SOIPDcdscd; - double B3SOIPDcit; - double B3SOIPDnfactor; - double B3SOIPDvsat; - double B3SOIPDat; - double B3SOIPDa0; - double B3SOIPDags; - double B3SOIPDa1; - double B3SOIPDa2; - double B3SOIPDketa; - double B3SOIPDnpeak; - double B3SOIPDnsub; - double B3SOIPDngate; - double B3SOIPDgamma1; - double B3SOIPDgamma2; - double B3SOIPDvbx; - double B3SOIPDvbi; - double B3SOIPDvbm; - double B3SOIPDvbsc; - double B3SOIPDxt; - double B3SOIPDphi; - double B3SOIPDlitl; - double B3SOIPDk1; - double B3SOIPDkt1; - double B3SOIPDkt1l; - double B3SOIPDkt2; - double B3SOIPDk2; - double B3SOIPDk3; - double B3SOIPDk3b; - double B3SOIPDw0; - double B3SOIPDnlx; - double B3SOIPDdvt0; - double B3SOIPDdvt1; - double B3SOIPDdvt2; - double B3SOIPDdvt0w; - double B3SOIPDdvt1w; - double B3SOIPDdvt2w; - double B3SOIPDdrout; - double B3SOIPDdsub; - double B3SOIPDvth0; - double B3SOIPDua; - double B3SOIPDua1; - double B3SOIPDub; - double B3SOIPDub1; - double B3SOIPDuc; - double B3SOIPDuc1; - double B3SOIPDu0; - double B3SOIPDute; - double B3SOIPDvoff; - double B3SOIPDvfb; - double B3SOIPDuatemp; - double B3SOIPDubtemp; - double B3SOIPDuctemp; - double B3SOIPDrbody; - double B3SOIPDrth; - double B3SOIPDcth; - double B3SOIPDrds0denom; - double B3SOIPDvfbb; - double B3SOIPDjbjt; - double B3SOIPDjdif; - double B3SOIPDjrec; - double B3SOIPDjtun; - double B3SOIPDsdt1; - double B3SOIPDst2; - double B3SOIPDst3; - double B3SOIPDdt2; - double B3SOIPDdt3; - double B3SOIPDdelta; - double B3SOIPDrdsw; - double B3SOIPDrds0; - double B3SOIPDprwg; - double B3SOIPDprwb; - double B3SOIPDprt; - double B3SOIPDeta0; - double B3SOIPDetab; - double B3SOIPDpclm; - double B3SOIPDpdibl1; - double B3SOIPDpdibl2; - double B3SOIPDpdiblb; - double B3SOIPDpvag; - double B3SOIPDwr; - double B3SOIPDdwg; - double B3SOIPDdwb; - double B3SOIPDb0; - double B3SOIPDb1; - double B3SOIPDalpha0; - double B3SOIPDbeta0; - - - /* CV model */ - double B3SOIPDcgsl; - double B3SOIPDcgdl; - double B3SOIPDckappa; - double B3SOIPDcf; - double B3SOIPDclc; - double B3SOIPDcle; - -/* Added for binning - START0 */ - double B3SOIPDkb1; - double B3SOIPDk1w1; - double B3SOIPDk1w2; - double B3SOIPDketas; - double B3SOIPDfbjtii; - double B3SOIPDbeta1; - double B3SOIPDbeta2; - double B3SOIPDvdsatii0; - double B3SOIPDlii; - double B3SOIPDesatii; - double B3SOIPDsii0; - double B3SOIPDsii1; - double B3SOIPDsii2; - double B3SOIPDsiid; - double B3SOIPDagidl; - double B3SOIPDbgidl; - double B3SOIPDngidl; - double B3SOIPDntun; - double B3SOIPDndiode; - double B3SOIPDnrecf0; - double B3SOIPDnrecr0; - double B3SOIPDisbjt; - double B3SOIPDisdif; - double B3SOIPDisrec; - double B3SOIPDistun; - double B3SOIPDvrec0; - double B3SOIPDvtun0; - double B3SOIPDnbjt; - double B3SOIPDlbjt0; - double B3SOIPDvabjt; - double B3SOIPDaely; - double B3SOIPDvsdfb; - double B3SOIPDvsdth; - double B3SOIPDdelvt; -/* Added by binning - END0 */ - -/* Pre-calculated constants */ - - double B3SOIPDdw; - double B3SOIPDdl; - double B3SOIPDleff; - double B3SOIPDweff; - - double B3SOIPDdwc; - double B3SOIPDdlc; - double B3SOIPDleffCV; - double B3SOIPDweffCV; - double B3SOIPDabulkCVfactor; - double B3SOIPDcgso; - double B3SOIPDcgdo; - double B3SOIPDcgeo; - - double B3SOIPDu0temp; - double B3SOIPDvsattemp; - double B3SOIPDsqrtPhi; - double B3SOIPDphis3; - double B3SOIPDXdep0; - double B3SOIPDsqrtXdep0; - double B3SOIPDtheta0vb0; - double B3SOIPDthetaRout; - - -/* v2.2 release */ - double B3SOIPDoxideRatio; - - -/* v2.0 release */ - double B3SOIPDk1eff; - double B3SOIPDwdios; - double B3SOIPDwdiod; - double B3SOIPDwdiodCV; - double B3SOIPDwdiosCV; - double B3SOIPDarfabjt; - double B3SOIPDlratio; - double B3SOIPDlratiodif; - double B3SOIPDvearly; - double B3SOIPDahli; - double B3SOIPDahli0; - double B3SOIPDvfbzb; - double B3SOIPDldeb; - double B3SOIPDacde; - double B3SOIPDmoin; - double B3SOIPDleffCVb; - double B3SOIPDleffCVbg; - - double B3SOIPDcof1; - double B3SOIPDcof2; - double B3SOIPDcof3; - double B3SOIPDcof4; - double B3SOIPDcdep0; - struct b3soipdSizeDependParam *pNext; -}; - - -typedef struct sB3SOIPDmodel -{ - - struct GENmodel gen; - -#define B3SOIPDmodType gen.GENmodType -#define B3SOIPDnextModel(inst) ((struct sB3SOIPDmodel *)((inst)->gen.GENnextModel)) -#define B3SOIPDinstances(inst) ((B3SOIPDinstance *)((inst)->gen.GENinstances)) -#define B3SOIPDmodName gen.GENmodName - - int B3SOIPDtype; - - int B3SOIPDmobMod; - int B3SOIPDcapMod; - int B3SOIPDnoiMod; - int B3SOIPDshMod; - int B3SOIPDbinUnit; - int B3SOIPDparamChk; - double B3SOIPDversion; - double B3SOIPDtox; - double B3SOIPDdtoxcv; /* v2.2.3 */ - double B3SOIPDcdsc; - double B3SOIPDcdscb; - double B3SOIPDcdscd; - double B3SOIPDcit; - double B3SOIPDnfactor; - double B3SOIPDvsat; - double B3SOIPDat; - double B3SOIPDa0; - double B3SOIPDags; - double B3SOIPDa1; - double B3SOIPDa2; - double B3SOIPDketa; - double B3SOIPDnsub; - double B3SOIPDnpeak; - double B3SOIPDngate; - double B3SOIPDgamma1; - double B3SOIPDgamma2; - double B3SOIPDvbx; - double B3SOIPDvbm; - double B3SOIPDxt; - double B3SOIPDk1; - double B3SOIPDkt1; - double B3SOIPDkt1l; - double B3SOIPDkt2; - double B3SOIPDk2; - double B3SOIPDk3; - double B3SOIPDk3b; - double B3SOIPDw0; - double B3SOIPDnlx; - double B3SOIPDdvt0; - double B3SOIPDdvt1; - double B3SOIPDdvt2; - double B3SOIPDdvt0w; - double B3SOIPDdvt1w; - double B3SOIPDdvt2w; - double B3SOIPDdrout; - double B3SOIPDdsub; - double B3SOIPDvth0; - double B3SOIPDua; - double B3SOIPDua1; - double B3SOIPDub; - double B3SOIPDub1; - double B3SOIPDuc; - double B3SOIPDuc1; - double B3SOIPDu0; - double B3SOIPDute; - double B3SOIPDvoff; - double B3SOIPDdelta; - double B3SOIPDrdsw; - double B3SOIPDprwg; - double B3SOIPDprwb; - double B3SOIPDprt; - double B3SOIPDeta0; - double B3SOIPDetab; - double B3SOIPDpclm; - double B3SOIPDpdibl1; - double B3SOIPDpdibl2; - double B3SOIPDpdiblb; - double B3SOIPDpvag; - double B3SOIPDwr; - double B3SOIPDdwg; - double B3SOIPDdwb; - double B3SOIPDb0; - double B3SOIPDb1; - double B3SOIPDalpha0; - double B3SOIPDtbox; - double B3SOIPDtsi; - double B3SOIPDxj; - double B3SOIPDkb1; - double B3SOIPDrth0; - double B3SOIPDcth0; - double B3SOIPDngidl; - double B3SOIPDagidl; - double B3SOIPDbgidl; - double B3SOIPDndiode; - double B3SOIPDistun; - double B3SOIPDxbjt; - double B3SOIPDxdif; - double B3SOIPDxrec; - double B3SOIPDxtun; - - -/* v2.2 release */ - double B3SOIPDwth0; - double B3SOIPDrhalo; - double B3SOIPDntox; - double B3SOIPDtoxref; - double B3SOIPDebg; - double B3SOIPDvevb; - double B3SOIPDalphaGB1; - double B3SOIPDbetaGB1; - double B3SOIPDvgb1; - double B3SOIPDvecb; - double B3SOIPDalphaGB2; - double B3SOIPDbetaGB2; - double B3SOIPDvgb2; - double B3SOIPDtoxqm; - double B3SOIPDvoxh; - double B3SOIPDdeltavox; - int B3SOIPDigMod; - - -/* v2.0 release */ - double B3SOIPDk1w1; - double B3SOIPDk1w2; - double B3SOIPDketas; - double B3SOIPDdwbc; - double B3SOIPDbeta0; - double B3SOIPDbeta1; - double B3SOIPDbeta2; - double B3SOIPDvdsatii0; - double B3SOIPDtii; - double B3SOIPDlii; - double B3SOIPDsii0; - double B3SOIPDsii1; - double B3SOIPDsii2; - double B3SOIPDsiid; - double B3SOIPDfbjtii; - double B3SOIPDesatii; - double B3SOIPDntun; - double B3SOIPDnrecf0; - double B3SOIPDnrecr0; - double B3SOIPDisbjt; - double B3SOIPDisdif; - double B3SOIPDisrec; - double B3SOIPDln; - double B3SOIPDvrec0; - double B3SOIPDvtun0; - double B3SOIPDnbjt; - double B3SOIPDlbjt0; - double B3SOIPDldif0; - double B3SOIPDvabjt; - double B3SOIPDaely; - double B3SOIPDahli; - double B3SOIPDrbody; - double B3SOIPDrbsh; - double B3SOIPDtt; - double B3SOIPDndif; - double B3SOIPDvsdfb; - double B3SOIPDvsdth; - double B3SOIPDcsdmin; - double B3SOIPDasd; - double B3SOIPDntrecf; - double B3SOIPDntrecr; - double B3SOIPDdlcb; - double B3SOIPDfbody; - double B3SOIPDtcjswg; - double B3SOIPDtpbswg; - double B3SOIPDacde; - double B3SOIPDmoin; - double B3SOIPDdelvt; - double B3SOIPDdlbg; - - /* CV model */ - double B3SOIPDcgsl; - double B3SOIPDcgdl; - double B3SOIPDckappa; - double B3SOIPDcf; - double B3SOIPDclc; - double B3SOIPDcle; - double B3SOIPDdwc; - double B3SOIPDdlc; - - double B3SOIPDtnom; - double B3SOIPDcgso; - double B3SOIPDcgdo; - double B3SOIPDcgeo; - double B3SOIPDxpart; - double B3SOIPDcFringOut; - double B3SOIPDcFringMax; - - double B3SOIPDsheetResistance; - double B3SOIPDbodyJctGateSideGradingCoeff; - double B3SOIPDGatesidewallJctPotential; - double B3SOIPDunitLengthGateSidewallJctCap; - double B3SOIPDcsdesw; - - double B3SOIPDLint; - double B3SOIPDLl; - double B3SOIPDLlc; /* v2.2.3 */ - double B3SOIPDLln; - double B3SOIPDLw; - double B3SOIPDLwc; /* v2.2.3 */ - double B3SOIPDLwn; - double B3SOIPDLwl; - double B3SOIPDLwlc; /* v2.2.3 */ - double B3SOIPDLmin; - double B3SOIPDLmax; - - double B3SOIPDWint; - double B3SOIPDWl; - double B3SOIPDWlc; /* v2.2.3 */ - double B3SOIPDWln; - double B3SOIPDWw; - double B3SOIPDWwc; /* v2.2.3 */ - double B3SOIPDWwn; - double B3SOIPDWwl; - double B3SOIPDWwlc; /* v2.2.3 */ - double B3SOIPDWmin; - double B3SOIPDWmax; - -/* Added for binning - START1 */ - /* Length Dependence */ - double B3SOIPDlnpeak; - double B3SOIPDlnsub; - double B3SOIPDlngate; - double B3SOIPDlvth0; - double B3SOIPDlk1; - double B3SOIPDlk1w1; - double B3SOIPDlk1w2; - double B3SOIPDlk2; - double B3SOIPDlk3; - double B3SOIPDlk3b; - double B3SOIPDlkb1; - double B3SOIPDlw0; - double B3SOIPDlnlx; - double B3SOIPDldvt0; - double B3SOIPDldvt1; - double B3SOIPDldvt2; - double B3SOIPDldvt0w; - double B3SOIPDldvt1w; - double B3SOIPDldvt2w; - double B3SOIPDlu0; - double B3SOIPDlua; - double B3SOIPDlub; - double B3SOIPDluc; - double B3SOIPDlvsat; - double B3SOIPDla0; - double B3SOIPDlags; - double B3SOIPDlb0; - double B3SOIPDlb1; - double B3SOIPDlketa; - double B3SOIPDlketas; - double B3SOIPDla1; - double B3SOIPDla2; - double B3SOIPDlrdsw; - double B3SOIPDlprwb; - double B3SOIPDlprwg; - double B3SOIPDlwr; - double B3SOIPDlnfactor; - double B3SOIPDldwg; - double B3SOIPDldwb; - double B3SOIPDlvoff; - double B3SOIPDleta0; - double B3SOIPDletab; - double B3SOIPDldsub; - double B3SOIPDlcit; - double B3SOIPDlcdsc; - double B3SOIPDlcdscb; - double B3SOIPDlcdscd; - double B3SOIPDlpclm; - double B3SOIPDlpdibl1; - double B3SOIPDlpdibl2; - double B3SOIPDlpdiblb; - double B3SOIPDldrout; - double B3SOIPDlpvag; - double B3SOIPDldelta; - double B3SOIPDlalpha0; - double B3SOIPDlfbjtii; - double B3SOIPDlbeta0; - double B3SOIPDlbeta1; - double B3SOIPDlbeta2; - double B3SOIPDlvdsatii0; - double B3SOIPDllii; - double B3SOIPDlesatii; - double B3SOIPDlsii0; - double B3SOIPDlsii1; - double B3SOIPDlsii2; - double B3SOIPDlsiid; - double B3SOIPDlagidl; - double B3SOIPDlbgidl; - double B3SOIPDlngidl; - double B3SOIPDlntun; - double B3SOIPDlndiode; - double B3SOIPDlnrecf0; - double B3SOIPDlnrecr0; - double B3SOIPDlisbjt; - double B3SOIPDlisdif; - double B3SOIPDlisrec; - double B3SOIPDlistun; - double B3SOIPDlvrec0; - double B3SOIPDlvtun0; - double B3SOIPDlnbjt; - double B3SOIPDllbjt0; - double B3SOIPDlvabjt; - double B3SOIPDlaely; - double B3SOIPDlahli; - /* CV model */ - double B3SOIPDlvsdfb; - double B3SOIPDlvsdth; - double B3SOIPDldelvt; - double B3SOIPDlacde; - double B3SOIPDlmoin; - - /* Width Dependence */ - double B3SOIPDwnpeak; - double B3SOIPDwnsub; - double B3SOIPDwngate; - double B3SOIPDwvth0; - double B3SOIPDwk1; - double B3SOIPDwk1w1; - double B3SOIPDwk1w2; - double B3SOIPDwk2; - double B3SOIPDwk3; - double B3SOIPDwk3b; - double B3SOIPDwkb1; - double B3SOIPDww0; - double B3SOIPDwnlx; - double B3SOIPDwdvt0; - double B3SOIPDwdvt1; - double B3SOIPDwdvt2; - double B3SOIPDwdvt0w; - double B3SOIPDwdvt1w; - double B3SOIPDwdvt2w; - double B3SOIPDwu0; - double B3SOIPDwua; - double B3SOIPDwub; - double B3SOIPDwuc; - double B3SOIPDwvsat; - double B3SOIPDwa0; - double B3SOIPDwags; - double B3SOIPDwb0; - double B3SOIPDwb1; - double B3SOIPDwketa; - double B3SOIPDwketas; - double B3SOIPDwa1; - double B3SOIPDwa2; - double B3SOIPDwrdsw; - double B3SOIPDwprwb; - double B3SOIPDwprwg; - double B3SOIPDwwr; - double B3SOIPDwnfactor; - double B3SOIPDwdwg; - double B3SOIPDwdwb; - double B3SOIPDwvoff; - double B3SOIPDweta0; - double B3SOIPDwetab; - double B3SOIPDwdsub; - double B3SOIPDwcit; - double B3SOIPDwcdsc; - double B3SOIPDwcdscb; - double B3SOIPDwcdscd; - double B3SOIPDwpclm; - double B3SOIPDwpdibl1; - double B3SOIPDwpdibl2; - double B3SOIPDwpdiblb; - double B3SOIPDwdrout; - double B3SOIPDwpvag; - double B3SOIPDwdelta; - double B3SOIPDwalpha0; - double B3SOIPDwfbjtii; - double B3SOIPDwbeta0; - double B3SOIPDwbeta1; - double B3SOIPDwbeta2; - double B3SOIPDwvdsatii0; - double B3SOIPDwlii; - double B3SOIPDwesatii; - double B3SOIPDwsii0; - double B3SOIPDwsii1; - double B3SOIPDwsii2; - double B3SOIPDwsiid; - double B3SOIPDwagidl; - double B3SOIPDwbgidl; - double B3SOIPDwngidl; - double B3SOIPDwntun; - double B3SOIPDwndiode; - double B3SOIPDwnrecf0; - double B3SOIPDwnrecr0; - double B3SOIPDwisbjt; - double B3SOIPDwisdif; - double B3SOIPDwisrec; - double B3SOIPDwistun; - double B3SOIPDwvrec0; - double B3SOIPDwvtun0; - double B3SOIPDwnbjt; - double B3SOIPDwlbjt0; - double B3SOIPDwvabjt; - double B3SOIPDwaely; - double B3SOIPDwahli; - /* CV model */ - double B3SOIPDwvsdfb; - double B3SOIPDwvsdth; - double B3SOIPDwdelvt; - double B3SOIPDwacde; - double B3SOIPDwmoin; - - /* Cross-term Dependence */ - double B3SOIPDpnpeak; - double B3SOIPDpnsub; - double B3SOIPDpngate; - double B3SOIPDpvth0; - double B3SOIPDpk1; - double B3SOIPDpk1w1; - double B3SOIPDpk1w2; - double B3SOIPDpk2; - double B3SOIPDpk3; - double B3SOIPDpk3b; - double B3SOIPDpkb1; - double B3SOIPDpw0; - double B3SOIPDpnlx; - double B3SOIPDpdvt0; - double B3SOIPDpdvt1; - double B3SOIPDpdvt2; - double B3SOIPDpdvt0w; - double B3SOIPDpdvt1w; - double B3SOIPDpdvt2w; - double B3SOIPDpu0; - double B3SOIPDpua; - double B3SOIPDpub; - double B3SOIPDpuc; - double B3SOIPDpvsat; - double B3SOIPDpa0; - double B3SOIPDpags; - double B3SOIPDpb0; - double B3SOIPDpb1; - double B3SOIPDpketa; - double B3SOIPDpketas; - double B3SOIPDpa1; - double B3SOIPDpa2; - double B3SOIPDprdsw; - double B3SOIPDpprwb; - double B3SOIPDpprwg; - double B3SOIPDpwr; - double B3SOIPDpnfactor; - double B3SOIPDpdwg; - double B3SOIPDpdwb; - double B3SOIPDpvoff; - double B3SOIPDpeta0; - double B3SOIPDpetab; - double B3SOIPDpdsub; - double B3SOIPDpcit; - double B3SOIPDpcdsc; - double B3SOIPDpcdscb; - double B3SOIPDpcdscd; - double B3SOIPDppclm; - double B3SOIPDppdibl1; - double B3SOIPDppdibl2; - double B3SOIPDppdiblb; - double B3SOIPDpdrout; - double B3SOIPDppvag; - double B3SOIPDpdelta; - double B3SOIPDpalpha0; - double B3SOIPDpfbjtii; - double B3SOIPDpbeta0; - double B3SOIPDpbeta1; - double B3SOIPDpbeta2; - double B3SOIPDpvdsatii0; - double B3SOIPDplii; - double B3SOIPDpesatii; - double B3SOIPDpsii0; - double B3SOIPDpsii1; - double B3SOIPDpsii2; - double B3SOIPDpsiid; - double B3SOIPDpagidl; - double B3SOIPDpbgidl; - double B3SOIPDpngidl; - double B3SOIPDpntun; - double B3SOIPDpndiode; - double B3SOIPDpnrecf0; - double B3SOIPDpnrecr0; - double B3SOIPDpisbjt; - double B3SOIPDpisdif; - double B3SOIPDpisrec; - double B3SOIPDpistun; - double B3SOIPDpvrec0; - double B3SOIPDpvtun0; - double B3SOIPDpnbjt; - double B3SOIPDplbjt0; - double B3SOIPDpvabjt; - double B3SOIPDpaely; - double B3SOIPDpahli; - /* CV model */ - double B3SOIPDpvsdfb; - double B3SOIPDpvsdth; - double B3SOIPDpdelvt; - double B3SOIPDpacde; - double B3SOIPDpmoin; -/* Added for binning - END1 */ - -/* Pre-calculated constants */ - double B3SOIPDcbox; - double B3SOIPDcsi; - double B3SOIPDcsieff; - double B3SOIPDcoxt; - double B3SOIPDnfb; - double B3SOIPDadice; - double B3SOIPDqsi; - double B3SOIPDqsieff; - double B3SOIPDeg0; - - /* MCJ: move to size-dependent param. */ - double B3SOIPDvtm; - double B3SOIPDcox; - double B3SOIPDcof1; - double B3SOIPDcof2; - double B3SOIPDcof3; - double B3SOIPDcof4; - double B3SOIPDvcrit; - double B3SOIPDfactor1; - - double B3SOIPDoxideTrapDensityA; - double B3SOIPDoxideTrapDensityB; - double B3SOIPDoxideTrapDensityC; - double B3SOIPDem; - double B3SOIPDef; - double B3SOIPDaf; - double B3SOIPDkf; - double B3SOIPDnoif; - - struct b3soipdSizeDependParam *pSizeDependParamKnot; - - /* Flags */ - - unsigned B3SOIPDtboxGiven:1; - unsigned B3SOIPDtsiGiven :1; - unsigned B3SOIPDxjGiven :1; - unsigned B3SOIPDkb1Given :1; - unsigned B3SOIPDrth0Given :1; - unsigned B3SOIPDcth0Given :1; - unsigned B3SOIPDngidlGiven :1; - unsigned B3SOIPDagidlGiven :1; - unsigned B3SOIPDbgidlGiven :1; - unsigned B3SOIPDndiodeGiven :1; - unsigned B3SOIPDxbjtGiven :1; - unsigned B3SOIPDxdifGiven :1; - unsigned B3SOIPDxrecGiven :1; - unsigned B3SOIPDxtunGiven :1; - unsigned B3SOIPDttGiven :1; - unsigned B3SOIPDvsdfbGiven :1; - unsigned B3SOIPDvsdthGiven :1; - unsigned B3SOIPDasdGiven :1; - unsigned B3SOIPDcsdminGiven :1; - - unsigned B3SOIPDmobModGiven :1; - unsigned B3SOIPDbinUnitGiven :1; - unsigned B3SOIPDcapModGiven :1; - unsigned B3SOIPDparamChkGiven :1; - unsigned B3SOIPDnoiModGiven :1; - unsigned B3SOIPDshModGiven :1; - unsigned B3SOIPDtypeGiven :1; - unsigned B3SOIPDtoxGiven :1; - unsigned B3SOIPDdtoxcvGiven :1; /* v2.2.3 */ - unsigned B3SOIPDversionGiven :1; - - unsigned B3SOIPDcdscGiven :1; - unsigned B3SOIPDcdscbGiven :1; - unsigned B3SOIPDcdscdGiven :1; - unsigned B3SOIPDcitGiven :1; - unsigned B3SOIPDnfactorGiven :1; - unsigned B3SOIPDvsatGiven :1; - unsigned B3SOIPDatGiven :1; - unsigned B3SOIPDa0Given :1; - unsigned B3SOIPDagsGiven :1; - unsigned B3SOIPDa1Given :1; - unsigned B3SOIPDa2Given :1; - unsigned B3SOIPDketaGiven :1; - unsigned B3SOIPDnsubGiven :1; - unsigned B3SOIPDnpeakGiven :1; - unsigned B3SOIPDngateGiven :1; - unsigned B3SOIPDgamma1Given :1; - unsigned B3SOIPDgamma2Given :1; - unsigned B3SOIPDvbxGiven :1; - unsigned B3SOIPDvbmGiven :1; - unsigned B3SOIPDxtGiven :1; - unsigned B3SOIPDk1Given :1; - unsigned B3SOIPDkt1Given :1; - unsigned B3SOIPDkt1lGiven :1; - unsigned B3SOIPDkt2Given :1; - unsigned B3SOIPDk2Given :1; - unsigned B3SOIPDk3Given :1; - unsigned B3SOIPDk3bGiven :1; - unsigned B3SOIPDw0Given :1; - unsigned B3SOIPDnlxGiven :1; - unsigned B3SOIPDdvt0Given :1; - unsigned B3SOIPDdvt1Given :1; - unsigned B3SOIPDdvt2Given :1; - unsigned B3SOIPDdvt0wGiven :1; - unsigned B3SOIPDdvt1wGiven :1; - unsigned B3SOIPDdvt2wGiven :1; - unsigned B3SOIPDdroutGiven :1; - unsigned B3SOIPDdsubGiven :1; - unsigned B3SOIPDvth0Given :1; - unsigned B3SOIPDuaGiven :1; - unsigned B3SOIPDua1Given :1; - unsigned B3SOIPDubGiven :1; - unsigned B3SOIPDub1Given :1; - unsigned B3SOIPDucGiven :1; - unsigned B3SOIPDuc1Given :1; - unsigned B3SOIPDu0Given :1; - unsigned B3SOIPDuteGiven :1; - unsigned B3SOIPDvoffGiven :1; - unsigned B3SOIPDrdswGiven :1; - unsigned B3SOIPDprwgGiven :1; - unsigned B3SOIPDprwbGiven :1; - unsigned B3SOIPDprtGiven :1; - unsigned B3SOIPDeta0Given :1; - unsigned B3SOIPDetabGiven :1; - unsigned B3SOIPDpclmGiven :1; - unsigned B3SOIPDpdibl1Given :1; - unsigned B3SOIPDpdibl2Given :1; - unsigned B3SOIPDpdiblbGiven :1; - unsigned B3SOIPDpvagGiven :1; - unsigned B3SOIPDdeltaGiven :1; - unsigned B3SOIPDwrGiven :1; - unsigned B3SOIPDdwgGiven :1; - unsigned B3SOIPDdwbGiven :1; - unsigned B3SOIPDb0Given :1; - unsigned B3SOIPDb1Given :1; - unsigned B3SOIPDalpha0Given :1; - - -/* v2.2 release */ - unsigned B3SOIPDwth0Given :1; - unsigned B3SOIPDrhaloGiven :1; - unsigned B3SOIPDntoxGiven :1; - unsigned B3SOIPDtoxrefGiven :1; - unsigned B3SOIPDebgGiven :1; - unsigned B3SOIPDvevbGiven :1; - unsigned B3SOIPDalphaGB1Given :1; - unsigned B3SOIPDbetaGB1Given :1; - unsigned B3SOIPDvgb1Given :1; - unsigned B3SOIPDvecbGiven :1; - unsigned B3SOIPDalphaGB2Given :1; - unsigned B3SOIPDbetaGB2Given :1; - unsigned B3SOIPDvgb2Given :1; - unsigned B3SOIPDtoxqmGiven :1; - unsigned B3SOIPDigModGiven :1; - unsigned B3SOIPDvoxhGiven :1; - unsigned B3SOIPDdeltavoxGiven :1; - - -/* v2.0 release */ - unsigned B3SOIPDk1w1Given :1; - unsigned B3SOIPDk1w2Given :1; - unsigned B3SOIPDketasGiven :1; - unsigned B3SOIPDdwbcGiven :1; - unsigned B3SOIPDbeta0Given :1; - unsigned B3SOIPDbeta1Given :1; - unsigned B3SOIPDbeta2Given :1; - unsigned B3SOIPDvdsatii0Given :1; - unsigned B3SOIPDtiiGiven :1; - unsigned B3SOIPDliiGiven :1; - unsigned B3SOIPDsii0Given :1; - unsigned B3SOIPDsii1Given :1; - unsigned B3SOIPDsii2Given :1; - unsigned B3SOIPDsiidGiven :1; - unsigned B3SOIPDfbjtiiGiven :1; - unsigned B3SOIPDesatiiGiven :1; - unsigned B3SOIPDntunGiven :1; - unsigned B3SOIPDnrecf0Given :1; - unsigned B3SOIPDnrecr0Given :1; - unsigned B3SOIPDisbjtGiven :1; - unsigned B3SOIPDisdifGiven :1; - unsigned B3SOIPDisrecGiven :1; - unsigned B3SOIPDistunGiven :1; - unsigned B3SOIPDlnGiven :1; - unsigned B3SOIPDvrec0Given :1; - unsigned B3SOIPDvtun0Given :1; - unsigned B3SOIPDnbjtGiven :1; - unsigned B3SOIPDlbjt0Given :1; - unsigned B3SOIPDldif0Given :1; - unsigned B3SOIPDvabjtGiven :1; - unsigned B3SOIPDaelyGiven :1; - unsigned B3SOIPDahliGiven :1; - unsigned B3SOIPDrbodyGiven :1; - unsigned B3SOIPDrbshGiven :1; - unsigned B3SOIPDndifGiven :1; - unsigned B3SOIPDntrecfGiven :1; - unsigned B3SOIPDntrecrGiven :1; - unsigned B3SOIPDdlcbGiven :1; - unsigned B3SOIPDfbodyGiven :1; - unsigned B3SOIPDtcjswgGiven :1; - unsigned B3SOIPDtpbswgGiven :1; - unsigned B3SOIPDacdeGiven :1; - unsigned B3SOIPDmoinGiven :1; - unsigned B3SOIPDdelvtGiven :1; - unsigned B3SOIPDdlbgGiven :1; - - - /* CV model */ - unsigned B3SOIPDcgslGiven :1; - unsigned B3SOIPDcgdlGiven :1; - unsigned B3SOIPDckappaGiven :1; - unsigned B3SOIPDcfGiven :1; - unsigned B3SOIPDclcGiven :1; - unsigned B3SOIPDcleGiven :1; - unsigned B3SOIPDdwcGiven :1; - unsigned B3SOIPDdlcGiven :1; - -/* Added for binning - START2 */ - /* Length Dependence */ - unsigned B3SOIPDlnpeakGiven :1; - unsigned B3SOIPDlnsubGiven :1; - unsigned B3SOIPDlngateGiven :1; - unsigned B3SOIPDlvth0Given :1; - unsigned B3SOIPDlk1Given :1; - unsigned B3SOIPDlk1w1Given :1; - unsigned B3SOIPDlk1w2Given :1; - unsigned B3SOIPDlk2Given :1; - unsigned B3SOIPDlk3Given :1; - unsigned B3SOIPDlk3bGiven :1; - unsigned B3SOIPDlkb1Given :1; - unsigned B3SOIPDlw0Given :1; - unsigned B3SOIPDlnlxGiven :1; - unsigned B3SOIPDldvt0Given :1; - unsigned B3SOIPDldvt1Given :1; - unsigned B3SOIPDldvt2Given :1; - unsigned B3SOIPDldvt0wGiven :1; - unsigned B3SOIPDldvt1wGiven :1; - unsigned B3SOIPDldvt2wGiven :1; - unsigned B3SOIPDlu0Given :1; - unsigned B3SOIPDluaGiven :1; - unsigned B3SOIPDlubGiven :1; - unsigned B3SOIPDlucGiven :1; - unsigned B3SOIPDlvsatGiven :1; - unsigned B3SOIPDla0Given :1; - unsigned B3SOIPDlagsGiven :1; - unsigned B3SOIPDlb0Given :1; - unsigned B3SOIPDlb1Given :1; - unsigned B3SOIPDlketaGiven :1; - unsigned B3SOIPDlketasGiven :1; - unsigned B3SOIPDla1Given :1; - unsigned B3SOIPDla2Given :1; - unsigned B3SOIPDlrdswGiven :1; - unsigned B3SOIPDlprwbGiven :1; - unsigned B3SOIPDlprwgGiven :1; - unsigned B3SOIPDlwrGiven :1; - unsigned B3SOIPDlnfactorGiven :1; - unsigned B3SOIPDldwgGiven :1; - unsigned B3SOIPDldwbGiven :1; - unsigned B3SOIPDlvoffGiven :1; - unsigned B3SOIPDleta0Given :1; - unsigned B3SOIPDletabGiven :1; - unsigned B3SOIPDldsubGiven :1; - unsigned B3SOIPDlcitGiven :1; - unsigned B3SOIPDlcdscGiven :1; - unsigned B3SOIPDlcdscbGiven :1; - unsigned B3SOIPDlcdscdGiven :1; - unsigned B3SOIPDlpclmGiven :1; - unsigned B3SOIPDlpdibl1Given :1; - unsigned B3SOIPDlpdibl2Given :1; - unsigned B3SOIPDlpdiblbGiven :1; - unsigned B3SOIPDldroutGiven :1; - unsigned B3SOIPDlpvagGiven :1; - unsigned B3SOIPDldeltaGiven :1; - unsigned B3SOIPDlalpha0Given :1; - unsigned B3SOIPDlfbjtiiGiven :1; - unsigned B3SOIPDlbeta0Given :1; - unsigned B3SOIPDlbeta1Given :1; - unsigned B3SOIPDlbeta2Given :1; - unsigned B3SOIPDlvdsatii0Given :1; - unsigned B3SOIPDlliiGiven :1; - unsigned B3SOIPDlesatiiGiven :1; - unsigned B3SOIPDlsii0Given :1; - unsigned B3SOIPDlsii1Given :1; - unsigned B3SOIPDlsii2Given :1; - unsigned B3SOIPDlsiidGiven :1; - unsigned B3SOIPDlagidlGiven :1; - unsigned B3SOIPDlbgidlGiven :1; - unsigned B3SOIPDlngidlGiven :1; - unsigned B3SOIPDlntunGiven :1; - unsigned B3SOIPDlndiodeGiven :1; - unsigned B3SOIPDlnrecf0Given :1; - unsigned B3SOIPDlnrecr0Given :1; - unsigned B3SOIPDlisbjtGiven :1; - unsigned B3SOIPDlisdifGiven :1; - unsigned B3SOIPDlisrecGiven :1; - unsigned B3SOIPDlistunGiven :1; - unsigned B3SOIPDlvrec0Given :1; - unsigned B3SOIPDlvtun0Given :1; - unsigned B3SOIPDlnbjtGiven :1; - unsigned B3SOIPDllbjt0Given :1; - unsigned B3SOIPDlvabjtGiven :1; - unsigned B3SOIPDlaelyGiven :1; - unsigned B3SOIPDlahliGiven :1; - /* CV model */ - unsigned B3SOIPDlvsdfbGiven :1; - unsigned B3SOIPDlvsdthGiven :1; - unsigned B3SOIPDldelvtGiven :1; - unsigned B3SOIPDlacdeGiven :1; - unsigned B3SOIPDlmoinGiven :1; - - /* Width Dependence */ - unsigned B3SOIPDwnpeakGiven :1; - unsigned B3SOIPDwnsubGiven :1; - unsigned B3SOIPDwngateGiven :1; - unsigned B3SOIPDwvth0Given :1; - unsigned B3SOIPDwk1Given :1; - unsigned B3SOIPDwk1w1Given :1; - unsigned B3SOIPDwk1w2Given :1; - unsigned B3SOIPDwk2Given :1; - unsigned B3SOIPDwk3Given :1; - unsigned B3SOIPDwk3bGiven :1; - unsigned B3SOIPDwkb1Given :1; - unsigned B3SOIPDww0Given :1; - unsigned B3SOIPDwnlxGiven :1; - unsigned B3SOIPDwdvt0Given :1; - unsigned B3SOIPDwdvt1Given :1; - unsigned B3SOIPDwdvt2Given :1; - unsigned B3SOIPDwdvt0wGiven :1; - unsigned B3SOIPDwdvt1wGiven :1; - unsigned B3SOIPDwdvt2wGiven :1; - unsigned B3SOIPDwu0Given :1; - unsigned B3SOIPDwuaGiven :1; - unsigned B3SOIPDwubGiven :1; - unsigned B3SOIPDwucGiven :1; - unsigned B3SOIPDwvsatGiven :1; - unsigned B3SOIPDwa0Given :1; - unsigned B3SOIPDwagsGiven :1; - unsigned B3SOIPDwb0Given :1; - unsigned B3SOIPDwb1Given :1; - unsigned B3SOIPDwketaGiven :1; - unsigned B3SOIPDwketasGiven :1; - unsigned B3SOIPDwa1Given :1; - unsigned B3SOIPDwa2Given :1; - unsigned B3SOIPDwrdswGiven :1; - unsigned B3SOIPDwprwbGiven :1; - unsigned B3SOIPDwprwgGiven :1; - unsigned B3SOIPDwwrGiven :1; - unsigned B3SOIPDwnfactorGiven :1; - unsigned B3SOIPDwdwgGiven :1; - unsigned B3SOIPDwdwbGiven :1; - unsigned B3SOIPDwvoffGiven :1; - unsigned B3SOIPDweta0Given :1; - unsigned B3SOIPDwetabGiven :1; - unsigned B3SOIPDwdsubGiven :1; - unsigned B3SOIPDwcitGiven :1; - unsigned B3SOIPDwcdscGiven :1; - unsigned B3SOIPDwcdscbGiven :1; - unsigned B3SOIPDwcdscdGiven :1; - unsigned B3SOIPDwpclmGiven :1; - unsigned B3SOIPDwpdibl1Given :1; - unsigned B3SOIPDwpdibl2Given :1; - unsigned B3SOIPDwpdiblbGiven :1; - unsigned B3SOIPDwdroutGiven :1; - unsigned B3SOIPDwpvagGiven :1; - unsigned B3SOIPDwdeltaGiven :1; - unsigned B3SOIPDwalpha0Given :1; - unsigned B3SOIPDwfbjtiiGiven :1; - unsigned B3SOIPDwbeta0Given :1; - unsigned B3SOIPDwbeta1Given :1; - unsigned B3SOIPDwbeta2Given :1; - unsigned B3SOIPDwvdsatii0Given :1; - unsigned B3SOIPDwliiGiven :1; - unsigned B3SOIPDwesatiiGiven :1; - unsigned B3SOIPDwsii0Given :1; - unsigned B3SOIPDwsii1Given :1; - unsigned B3SOIPDwsii2Given :1; - unsigned B3SOIPDwsiidGiven :1; - unsigned B3SOIPDwagidlGiven :1; - unsigned B3SOIPDwbgidlGiven :1; - unsigned B3SOIPDwngidlGiven :1; - unsigned B3SOIPDwntunGiven :1; - unsigned B3SOIPDwndiodeGiven :1; - unsigned B3SOIPDwnrecf0Given :1; - unsigned B3SOIPDwnrecr0Given :1; - unsigned B3SOIPDwisbjtGiven :1; - unsigned B3SOIPDwisdifGiven :1; - unsigned B3SOIPDwisrecGiven :1; - unsigned B3SOIPDwistunGiven :1; - unsigned B3SOIPDwvrec0Given :1; - unsigned B3SOIPDwvtun0Given :1; - unsigned B3SOIPDwnbjtGiven :1; - unsigned B3SOIPDwlbjt0Given :1; - unsigned B3SOIPDwvabjtGiven :1; - unsigned B3SOIPDwaelyGiven :1; - unsigned B3SOIPDwahliGiven :1; - /* CV model */ - unsigned B3SOIPDwvsdfbGiven :1; - unsigned B3SOIPDwvsdthGiven :1; - unsigned B3SOIPDwdelvtGiven :1; - unsigned B3SOIPDwacdeGiven :1; - unsigned B3SOIPDwmoinGiven :1; - - /* Cross-term Dependence */ - unsigned B3SOIPDpnpeakGiven :1; - unsigned B3SOIPDpnsubGiven :1; - unsigned B3SOIPDpngateGiven :1; - unsigned B3SOIPDpvth0Given :1; - unsigned B3SOIPDpk1Given :1; - unsigned B3SOIPDpk1w1Given :1; - unsigned B3SOIPDpk1w2Given :1; - unsigned B3SOIPDpk2Given :1; - unsigned B3SOIPDpk3Given :1; - unsigned B3SOIPDpk3bGiven :1; - unsigned B3SOIPDpkb1Given :1; - unsigned B3SOIPDpw0Given :1; - unsigned B3SOIPDpnlxGiven :1; - unsigned B3SOIPDpdvt0Given :1; - unsigned B3SOIPDpdvt1Given :1; - unsigned B3SOIPDpdvt2Given :1; - unsigned B3SOIPDpdvt0wGiven :1; - unsigned B3SOIPDpdvt1wGiven :1; - unsigned B3SOIPDpdvt2wGiven :1; - unsigned B3SOIPDpu0Given :1; - unsigned B3SOIPDpuaGiven :1; - unsigned B3SOIPDpubGiven :1; - unsigned B3SOIPDpucGiven :1; - unsigned B3SOIPDpvsatGiven :1; - unsigned B3SOIPDpa0Given :1; - unsigned B3SOIPDpagsGiven :1; - unsigned B3SOIPDpb0Given :1; - unsigned B3SOIPDpb1Given :1; - unsigned B3SOIPDpketaGiven :1; - unsigned B3SOIPDpketasGiven :1; - unsigned B3SOIPDpa1Given :1; - unsigned B3SOIPDpa2Given :1; - unsigned B3SOIPDprdswGiven :1; - unsigned B3SOIPDpprwbGiven :1; - unsigned B3SOIPDpprwgGiven :1; - unsigned B3SOIPDpwrGiven :1; - unsigned B3SOIPDpnfactorGiven :1; - unsigned B3SOIPDpdwgGiven :1; - unsigned B3SOIPDpdwbGiven :1; - unsigned B3SOIPDpvoffGiven :1; - unsigned B3SOIPDpeta0Given :1; - unsigned B3SOIPDpetabGiven :1; - unsigned B3SOIPDpdsubGiven :1; - unsigned B3SOIPDpcitGiven :1; - unsigned B3SOIPDpcdscGiven :1; - unsigned B3SOIPDpcdscbGiven :1; - unsigned B3SOIPDpcdscdGiven :1; - unsigned B3SOIPDppclmGiven :1; - unsigned B3SOIPDppdibl1Given :1; - unsigned B3SOIPDppdibl2Given :1; - unsigned B3SOIPDppdiblbGiven :1; - unsigned B3SOIPDpdroutGiven :1; - unsigned B3SOIPDppvagGiven :1; - unsigned B3SOIPDpdeltaGiven :1; - unsigned B3SOIPDpalpha0Given :1; - unsigned B3SOIPDpfbjtiiGiven :1; - unsigned B3SOIPDpbeta0Given :1; - unsigned B3SOIPDpbeta1Given :1; - unsigned B3SOIPDpbeta2Given :1; - unsigned B3SOIPDpvdsatii0Given :1; - unsigned B3SOIPDpliiGiven :1; - unsigned B3SOIPDpesatiiGiven :1; - unsigned B3SOIPDpsii0Given :1; - unsigned B3SOIPDpsii1Given :1; - unsigned B3SOIPDpsii2Given :1; - unsigned B3SOIPDpsiidGiven :1; - unsigned B3SOIPDpagidlGiven :1; - unsigned B3SOIPDpbgidlGiven :1; - unsigned B3SOIPDpngidlGiven :1; - unsigned B3SOIPDpntunGiven :1; - unsigned B3SOIPDpndiodeGiven :1; - unsigned B3SOIPDpnrecf0Given :1; - unsigned B3SOIPDpnrecr0Given :1; - unsigned B3SOIPDpisbjtGiven :1; - unsigned B3SOIPDpisdifGiven :1; - unsigned B3SOIPDpisrecGiven :1; - unsigned B3SOIPDpistunGiven :1; - unsigned B3SOIPDpvrec0Given :1; - unsigned B3SOIPDpvtun0Given :1; - unsigned B3SOIPDpnbjtGiven :1; - unsigned B3SOIPDplbjt0Given :1; - unsigned B3SOIPDpvabjtGiven :1; - unsigned B3SOIPDpaelyGiven :1; - unsigned B3SOIPDpahliGiven :1; - /* CV model */ - unsigned B3SOIPDpvsdfbGiven :1; - unsigned B3SOIPDpvsdthGiven :1; - unsigned B3SOIPDpdelvtGiven :1; - unsigned B3SOIPDpacdeGiven :1; - unsigned B3SOIPDpmoinGiven :1; -/* Added for binning - END2 */ - - unsigned B3SOIPDuseFringeGiven :1; - - unsigned B3SOIPDtnomGiven :1; - unsigned B3SOIPDcgsoGiven :1; - unsigned B3SOIPDcgdoGiven :1; - unsigned B3SOIPDcgeoGiven :1; - unsigned B3SOIPDxpartGiven :1; - unsigned B3SOIPDsheetResistanceGiven :1; - unsigned B3SOIPDGatesidewallJctPotentialGiven :1; - unsigned B3SOIPDbodyJctGateSideGradingCoeffGiven :1; - unsigned B3SOIPDunitLengthGateSidewallJctCapGiven :1; - unsigned B3SOIPDcsdeswGiven :1; - - unsigned B3SOIPDoxideTrapDensityAGiven :1; - unsigned B3SOIPDoxideTrapDensityBGiven :1; - unsigned B3SOIPDoxideTrapDensityCGiven :1; - unsigned B3SOIPDemGiven :1; - unsigned B3SOIPDefGiven :1; - unsigned B3SOIPDafGiven :1; - unsigned B3SOIPDkfGiven :1; - unsigned B3SOIPDnoifGiven :1; - - unsigned B3SOIPDLintGiven :1; - unsigned B3SOIPDLlGiven :1; - unsigned B3SOIPDLlcGiven :1; /* v2.2.3 */ - unsigned B3SOIPDLlnGiven :1; - unsigned B3SOIPDLwGiven :1; - unsigned B3SOIPDLwcGiven :1; /* v2.2.3 */ - unsigned B3SOIPDLwnGiven :1; - unsigned B3SOIPDLwlGiven :1; - unsigned B3SOIPDLwlcGiven :1; /* v2.2.3 */ - unsigned B3SOIPDLminGiven :1; - unsigned B3SOIPDLmaxGiven :1; - - unsigned B3SOIPDWintGiven :1; - unsigned B3SOIPDWlGiven :1; - unsigned B3SOIPDWlcGiven :1; /* v2.2.3 */ - unsigned B3SOIPDWlnGiven :1; - unsigned B3SOIPDWwGiven :1; - unsigned B3SOIPDWwcGiven :1; /* v2.2.3 */ - unsigned B3SOIPDWwnGiven :1; - unsigned B3SOIPDWwlGiven :1; - unsigned B3SOIPDWwlcGiven :1; /* v2.2.3 */ - unsigned B3SOIPDWminGiven :1; - unsigned B3SOIPDWmaxGiven :1; - -} B3SOIPDmodel; - - -#ifndef NMOS -#define NMOS 1 -#define PMOS -1 -#endif /*NMOS*/ - - -/* device parameters */ -#define B3SOIPD_W 1 -#define B3SOIPD_L 2 -#define B3SOIPD_M 31 -#define B3SOIPD_AS 3 -#define B3SOIPD_AD 4 -#define B3SOIPD_PS 5 -#define B3SOIPD_PD 6 -#define B3SOIPD_NRS 7 -#define B3SOIPD_NRD 8 -#define B3SOIPD_OFF 9 -#define B3SOIPD_IC_VBS 10 -#define B3SOIPD_IC_VDS 11 -#define B3SOIPD_IC_VGS 12 -#define B3SOIPD_IC_VES 13 -#define B3SOIPD_IC_VPS 14 -#define B3SOIPD_BJTOFF 15 -#define B3SOIPD_RTH0 16 -#define B3SOIPD_CTH0 17 -#define B3SOIPD_NRB 18 -#define B3SOIPD_IC 19 -#define B3SOIPD_NQSMOD 20 -#define B3SOIPD_DEBUG 21 - -/* v2.0 release */ -#define B3SOIPD_NBC 22 -#define B3SOIPD_NSEG 23 -#define B3SOIPD_PDBCP 24 -#define B3SOIPD_PSBCP 25 -#define B3SOIPD_AGBCP 26 -#define B3SOIPD_AEBCP 27 -#define B3SOIPD_VBSUSR 28 -#define B3SOIPD_TNODEOUT 29 - -/* v2.2.2 */ -#define B3SOIPD_FRBODY 30 - - -/* model parameters */ -#define B3SOIPD_MOD_CAPMOD 101 -#define B3SOIPD_MOD_NQSMOD 102 -#define B3SOIPD_MOD_MOBMOD 103 -#define B3SOIPD_MOD_NOIMOD 104 -#define B3SOIPD_MOD_SHMOD 105 -#define B3SOIPD_MOD_DDMOD 106 - -#define B3SOIPD_MOD_TOX 107 - -#define B3SOIPD_MOD_CDSC 108 -#define B3SOIPD_MOD_CDSCB 109 -#define B3SOIPD_MOD_CIT 110 -#define B3SOIPD_MOD_NFACTOR 111 -#define B3SOIPD_MOD_XJ 112 -#define B3SOIPD_MOD_VSAT 113 -#define B3SOIPD_MOD_AT 114 -#define B3SOIPD_MOD_A0 115 -#define B3SOIPD_MOD_A1 116 -#define B3SOIPD_MOD_A2 117 -#define B3SOIPD_MOD_KETA 118 -#define B3SOIPD_MOD_NSUB 119 -#define B3SOIPD_MOD_NPEAK 120 -#define B3SOIPD_MOD_NGATE 121 -#define B3SOIPD_MOD_GAMMA1 122 -#define B3SOIPD_MOD_GAMMA2 123 -#define B3SOIPD_MOD_VBX 124 -#define B3SOIPD_MOD_BINUNIT 125 - -#define B3SOIPD_MOD_VBM 126 - -#define B3SOIPD_MOD_XT 127 -#define B3SOIPD_MOD_K1 129 -#define B3SOIPD_MOD_KT1 130 -#define B3SOIPD_MOD_KT1L 131 -#define B3SOIPD_MOD_K2 132 -#define B3SOIPD_MOD_KT2 133 -#define B3SOIPD_MOD_K3 134 -#define B3SOIPD_MOD_K3B 135 -#define B3SOIPD_MOD_W0 136 -#define B3SOIPD_MOD_NLX 137 - -#define B3SOIPD_MOD_DVT0 138 -#define B3SOIPD_MOD_DVT1 139 -#define B3SOIPD_MOD_DVT2 140 - -#define B3SOIPD_MOD_DVT0W 141 -#define B3SOIPD_MOD_DVT1W 142 -#define B3SOIPD_MOD_DVT2W 143 - -#define B3SOIPD_MOD_DROUT 144 -#define B3SOIPD_MOD_DSUB 145 -#define B3SOIPD_MOD_VTH0 146 -#define B3SOIPD_MOD_UA 147 -#define B3SOIPD_MOD_UA1 148 -#define B3SOIPD_MOD_UB 149 -#define B3SOIPD_MOD_UB1 150 -#define B3SOIPD_MOD_UC 151 -#define B3SOIPD_MOD_UC1 152 -#define B3SOIPD_MOD_U0 153 -#define B3SOIPD_MOD_UTE 154 -#define B3SOIPD_MOD_VOFF 155 -#define B3SOIPD_MOD_DELTA 156 -#define B3SOIPD_MOD_RDSW 157 -#define B3SOIPD_MOD_PRT 158 -#define B3SOIPD_MOD_LDD 159 -#define B3SOIPD_MOD_ETA 160 -#define B3SOIPD_MOD_ETA0 161 -#define B3SOIPD_MOD_ETAB 162 -#define B3SOIPD_MOD_PCLM 163 -#define B3SOIPD_MOD_PDIBL1 164 -#define B3SOIPD_MOD_PDIBL2 165 -#define B3SOIPD_MOD_PSCBE1 166 -#define B3SOIPD_MOD_PSCBE2 167 -#define B3SOIPD_MOD_PVAG 168 -#define B3SOIPD_MOD_WR 169 -#define B3SOIPD_MOD_DWG 170 -#define B3SOIPD_MOD_DWB 171 -#define B3SOIPD_MOD_B0 172 -#define B3SOIPD_MOD_B1 173 -#define B3SOIPD_MOD_ALPHA0 174 -#define B3SOIPD_MOD_PDIBLB 178 - -#define B3SOIPD_MOD_PRWG 179 -#define B3SOIPD_MOD_PRWB 180 - -#define B3SOIPD_MOD_CDSCD 181 -#define B3SOIPD_MOD_AGS 182 - -#define B3SOIPD_MOD_FRINGE 184 -#define B3SOIPD_MOD_CGSL 186 -#define B3SOIPD_MOD_CGDL 187 -#define B3SOIPD_MOD_CKAPPA 188 -#define B3SOIPD_MOD_CF 189 -#define B3SOIPD_MOD_CLC 190 -#define B3SOIPD_MOD_CLE 191 -#define B3SOIPD_MOD_PARAMCHK 192 -#define B3SOIPD_MOD_VERSION 193 - -#define B3SOIPD_MOD_TBOX 195 -#define B3SOIPD_MOD_TSI 196 -#define B3SOIPD_MOD_KB1 197 -#define B3SOIPD_MOD_KB3 198 -#define B3SOIPD_MOD_DVBD0 199 -#define B3SOIPD_MOD_DVBD1 200 -#define B3SOIPD_MOD_DELP 201 -#define B3SOIPD_MOD_VBSA 202 -#define B3SOIPD_MOD_RBODY 204 -#define B3SOIPD_MOD_ADICE0 205 -#define B3SOIPD_MOD_ABP 206 -#define B3SOIPD_MOD_MXC 207 -#define B3SOIPD_MOD_RTH0 208 -#define B3SOIPD_MOD_CTH0 209 -#define B3SOIPD_MOD_ALPHA1 214 -#define B3SOIPD_MOD_NGIDL 215 -#define B3SOIPD_MOD_AGIDL 216 -#define B3SOIPD_MOD_BGIDL 217 -#define B3SOIPD_MOD_NDIODE 218 -#define B3SOIPD_MOD_LDIOF 219 -#define B3SOIPD_MOD_LDIOR 220 -#define B3SOIPD_MOD_NTUN 221 -#define B3SOIPD_MOD_ISBJT 222 -#define B3SOIPD_MOD_ISDIF 223 -#define B3SOIPD_MOD_ISREC 224 -#define B3SOIPD_MOD_ISTUN 225 -#define B3SOIPD_MOD_XBJT 226 -#define B3SOIPD_MOD_XDIF 227 -#define B3SOIPD_MOD_XREC 228 -#define B3SOIPD_MOD_XTUN 229 -#define B3SOIPD_MOD_TT 232 -#define B3SOIPD_MOD_VSDTH 233 -#define B3SOIPD_MOD_VSDFB 234 -#define B3SOIPD_MOD_ASD 235 -#define B3SOIPD_MOD_CSDMIN 236 -#define B3SOIPD_MOD_RBSH 237 -#define B3SOIPD_MOD_ESATII 238 - - -/* v2.0 release */ -#define B3SOIPD_MOD_K1W1 239 -#define B3SOIPD_MOD_K1W2 240 -#define B3SOIPD_MOD_KETAS 241 -#define B3SOIPD_MOD_DWBC 242 -#define B3SOIPD_MOD_BETA0 243 -#define B3SOIPD_MOD_BETA1 244 -#define B3SOIPD_MOD_BETA2 245 -#define B3SOIPD_MOD_VDSATII0 246 -#define B3SOIPD_MOD_TII 247 -#define B3SOIPD_MOD_LII 248 -#define B3SOIPD_MOD_SII0 249 -#define B3SOIPD_MOD_SII1 250 -#define B3SOIPD_MOD_SII2 251 -#define B3SOIPD_MOD_SIID 252 -#define B3SOIPD_MOD_FBJTII 253 -#define B3SOIPD_MOD_NRECF0 255 -#define B3SOIPD_MOD_NRECR0 256 -#define B3SOIPD_MOD_LN 257 -#define B3SOIPD_MOD_VREC0 258 -#define B3SOIPD_MOD_VTUN0 259 -#define B3SOIPD_MOD_NBJT 260 -#define B3SOIPD_MOD_LBJT0 261 -#define B3SOIPD_MOD_VABJT 262 -#define B3SOIPD_MOD_AELY 263 -#define B3SOIPD_MOD_AHLI 264 -#define B3SOIPD_MOD_NTRECF 265 -#define B3SOIPD_MOD_NTRECR 266 -#define B3SOIPD_MOD_DLCB 267 -#define B3SOIPD_MOD_FBODY 268 -#define B3SOIPD_MOD_NDIF 269 -#define B3SOIPD_MOD_TCJSWG 270 -#define B3SOIPD_MOD_TPBSWG 271 -#define B3SOIPD_MOD_ACDE 272 -#define B3SOIPD_MOD_MOIN 273 -#define B3SOIPD_MOD_DELVT 274 -#define B3SOIPD_MOD_DLBG 275 -#define B3SOIPD_MOD_LDIF0 276 - - -/* v2.2 release */ -#define B3SOIPD_MOD_WTH0 277 -#define B3SOIPD_MOD_RHALO 278 -#define B3SOIPD_MOD_NTOX 279 -#define B3SOIPD_MOD_TOXREF 280 -#define B3SOIPD_MOD_EBG 281 -#define B3SOIPD_MOD_VEVB 282 -#define B3SOIPD_MOD_ALPHAGB1 283 -#define B3SOIPD_MOD_BETAGB1 284 -#define B3SOIPD_MOD_VGB1 285 -#define B3SOIPD_MOD_VECB 286 -#define B3SOIPD_MOD_ALPHAGB2 287 -#define B3SOIPD_MOD_BETAGB2 288 -#define B3SOIPD_MOD_VGB2 289 -#define B3SOIPD_MOD_TOXQM 290 -#define B3SOIPD_MOD_IGMOD 291 -#define B3SOIPD_MOD_VOXH 292 -#define B3SOIPD_MOD_DELTAVOX 293 - - -/* Added for binning - START3 */ -/* Length dependence */ -#define B3SOIPD_MOD_LNPEAK 301 -#define B3SOIPD_MOD_LNSUB 302 -#define B3SOIPD_MOD_LNGATE 303 -#define B3SOIPD_MOD_LVTH0 304 -#define B3SOIPD_MOD_LK1 305 -#define B3SOIPD_MOD_LK1W1 306 -#define B3SOIPD_MOD_LK1W2 307 -#define B3SOIPD_MOD_LK2 308 -#define B3SOIPD_MOD_LK3 309 -#define B3SOIPD_MOD_LK3B 310 -#define B3SOIPD_MOD_LKB1 311 -#define B3SOIPD_MOD_LW0 312 -#define B3SOIPD_MOD_LNLX 313 -#define B3SOIPD_MOD_LDVT0 314 -#define B3SOIPD_MOD_LDVT1 315 -#define B3SOIPD_MOD_LDVT2 316 -#define B3SOIPD_MOD_LDVT0W 317 -#define B3SOIPD_MOD_LDVT1W 318 -#define B3SOIPD_MOD_LDVT2W 319 -#define B3SOIPD_MOD_LU0 320 -#define B3SOIPD_MOD_LUA 321 -#define B3SOIPD_MOD_LUB 322 -#define B3SOIPD_MOD_LUC 323 -#define B3SOIPD_MOD_LVSAT 324 -#define B3SOIPD_MOD_LA0 325 -#define B3SOIPD_MOD_LAGS 326 -#define B3SOIPD_MOD_LB0 327 -#define B3SOIPD_MOD_LB1 328 -#define B3SOIPD_MOD_LKETA 329 -#define B3SOIPD_MOD_LKETAS 330 -#define B3SOIPD_MOD_LA1 331 -#define B3SOIPD_MOD_LA2 332 -#define B3SOIPD_MOD_LRDSW 333 -#define B3SOIPD_MOD_LPRWB 334 -#define B3SOIPD_MOD_LPRWG 335 -#define B3SOIPD_MOD_LWR 336 -#define B3SOIPD_MOD_LNFACTOR 337 -#define B3SOIPD_MOD_LDWG 338 -#define B3SOIPD_MOD_LDWB 339 -#define B3SOIPD_MOD_LVOFF 340 -#define B3SOIPD_MOD_LETA0 341 -#define B3SOIPD_MOD_LETAB 342 -#define B3SOIPD_MOD_LDSUB 343 -#define B3SOIPD_MOD_LCIT 344 -#define B3SOIPD_MOD_LCDSC 345 -#define B3SOIPD_MOD_LCDSCB 346 -#define B3SOIPD_MOD_LCDSCD 347 -#define B3SOIPD_MOD_LPCLM 348 -#define B3SOIPD_MOD_LPDIBL1 349 -#define B3SOIPD_MOD_LPDIBL2 350 -#define B3SOIPD_MOD_LPDIBLB 351 -#define B3SOIPD_MOD_LDROUT 352 -#define B3SOIPD_MOD_LPVAG 353 -#define B3SOIPD_MOD_LDELTA 354 -#define B3SOIPD_MOD_LALPHA0 355 -#define B3SOIPD_MOD_LFBJTII 356 -#define B3SOIPD_MOD_LBETA0 357 -#define B3SOIPD_MOD_LBETA1 358 -#define B3SOIPD_MOD_LBETA2 359 -#define B3SOIPD_MOD_LVDSATII0 360 -#define B3SOIPD_MOD_LLII 361 -#define B3SOIPD_MOD_LESATII 362 -#define B3SOIPD_MOD_LSII0 363 -#define B3SOIPD_MOD_LSII1 364 -#define B3SOIPD_MOD_LSII2 365 -#define B3SOIPD_MOD_LSIID 366 -#define B3SOIPD_MOD_LAGIDL 367 -#define B3SOIPD_MOD_LBGIDL 368 -#define B3SOIPD_MOD_LNGIDL 369 -#define B3SOIPD_MOD_LNTUN 370 -#define B3SOIPD_MOD_LNDIODE 371 -#define B3SOIPD_MOD_LNRECF0 372 -#define B3SOIPD_MOD_LNRECR0 373 -#define B3SOIPD_MOD_LISBJT 374 -#define B3SOIPD_MOD_LISDIF 375 -#define B3SOIPD_MOD_LISREC 376 -#define B3SOIPD_MOD_LISTUN 377 -#define B3SOIPD_MOD_LVREC0 378 -#define B3SOIPD_MOD_LVTUN0 379 -#define B3SOIPD_MOD_LNBJT 380 -#define B3SOIPD_MOD_LLBJT0 381 -#define B3SOIPD_MOD_LVABJT 382 -#define B3SOIPD_MOD_LAELY 383 -#define B3SOIPD_MOD_LAHLI 384 -#define B3SOIPD_MOD_LVSDFB 385 -#define B3SOIPD_MOD_LVSDTH 386 -#define B3SOIPD_MOD_LDELVT 387 -#define B3SOIPD_MOD_LACDE 388 -#define B3SOIPD_MOD_LMOIN 389 - -/* Width dependence */ -#define B3SOIPD_MOD_WNPEAK 401 -#define B3SOIPD_MOD_WNSUB 402 -#define B3SOIPD_MOD_WNGATE 403 -#define B3SOIPD_MOD_WVTH0 404 -#define B3SOIPD_MOD_WK1 405 -#define B3SOIPD_MOD_WK1W1 406 -#define B3SOIPD_MOD_WK1W2 407 -#define B3SOIPD_MOD_WK2 408 -#define B3SOIPD_MOD_WK3 409 -#define B3SOIPD_MOD_WK3B 410 -#define B3SOIPD_MOD_WKB1 411 -#define B3SOIPD_MOD_WW0 412 -#define B3SOIPD_MOD_WNLX 413 -#define B3SOIPD_MOD_WDVT0 414 -#define B3SOIPD_MOD_WDVT1 415 -#define B3SOIPD_MOD_WDVT2 416 -#define B3SOIPD_MOD_WDVT0W 417 -#define B3SOIPD_MOD_WDVT1W 418 -#define B3SOIPD_MOD_WDVT2W 419 -#define B3SOIPD_MOD_WU0 420 -#define B3SOIPD_MOD_WUA 421 -#define B3SOIPD_MOD_WUB 422 -#define B3SOIPD_MOD_WUC 423 -#define B3SOIPD_MOD_WVSAT 424 -#define B3SOIPD_MOD_WA0 425 -#define B3SOIPD_MOD_WAGS 426 -#define B3SOIPD_MOD_WB0 427 -#define B3SOIPD_MOD_WB1 428 -#define B3SOIPD_MOD_WKETA 429 -#define B3SOIPD_MOD_WKETAS 430 -#define B3SOIPD_MOD_WA1 431 -#define B3SOIPD_MOD_WA2 432 -#define B3SOIPD_MOD_WRDSW 433 -#define B3SOIPD_MOD_WPRWB 434 -#define B3SOIPD_MOD_WPRWG 435 -#define B3SOIPD_MOD_WWR 436 -#define B3SOIPD_MOD_WNFACTOR 437 -#define B3SOIPD_MOD_WDWG 438 -#define B3SOIPD_MOD_WDWB 439 -#define B3SOIPD_MOD_WVOFF 440 -#define B3SOIPD_MOD_WETA0 441 -#define B3SOIPD_MOD_WETAB 442 -#define B3SOIPD_MOD_WDSUB 443 -#define B3SOIPD_MOD_WCIT 444 -#define B3SOIPD_MOD_WCDSC 445 -#define B3SOIPD_MOD_WCDSCB 446 -#define B3SOIPD_MOD_WCDSCD 447 -#define B3SOIPD_MOD_WPCLM 448 -#define B3SOIPD_MOD_WPDIBL1 449 -#define B3SOIPD_MOD_WPDIBL2 450 -#define B3SOIPD_MOD_WPDIBLB 451 -#define B3SOIPD_MOD_WDROUT 452 -#define B3SOIPD_MOD_WPVAG 453 -#define B3SOIPD_MOD_WDELTA 454 -#define B3SOIPD_MOD_WALPHA0 455 -#define B3SOIPD_MOD_WFBJTII 456 -#define B3SOIPD_MOD_WBETA0 457 -#define B3SOIPD_MOD_WBETA1 458 -#define B3SOIPD_MOD_WBETA2 459 -#define B3SOIPD_MOD_WVDSATII0 460 -#define B3SOIPD_MOD_WLII 461 -#define B3SOIPD_MOD_WESATII 462 -#define B3SOIPD_MOD_WSII0 463 -#define B3SOIPD_MOD_WSII1 464 -#define B3SOIPD_MOD_WSII2 465 -#define B3SOIPD_MOD_WSIID 466 -#define B3SOIPD_MOD_WAGIDL 467 -#define B3SOIPD_MOD_WBGIDL 468 -#define B3SOIPD_MOD_WNGIDL 469 -#define B3SOIPD_MOD_WNTUN 470 -#define B3SOIPD_MOD_WNDIODE 471 -#define B3SOIPD_MOD_WNRECF0 472 -#define B3SOIPD_MOD_WNRECR0 473 -#define B3SOIPD_MOD_WISBJT 474 -#define B3SOIPD_MOD_WISDIF 475 -#define B3SOIPD_MOD_WISREC 476 -#define B3SOIPD_MOD_WISTUN 477 -#define B3SOIPD_MOD_WVREC0 478 -#define B3SOIPD_MOD_WVTUN0 479 -#define B3SOIPD_MOD_WNBJT 480 -#define B3SOIPD_MOD_WLBJT0 481 -#define B3SOIPD_MOD_WVABJT 482 -#define B3SOIPD_MOD_WAELY 483 -#define B3SOIPD_MOD_WAHLI 484 -#define B3SOIPD_MOD_WVSDFB 485 -#define B3SOIPD_MOD_WVSDTH 486 -#define B3SOIPD_MOD_WDELVT 487 -#define B3SOIPD_MOD_WACDE 488 -#define B3SOIPD_MOD_WMOIN 489 - -/* Cross-term dependence */ -#define B3SOIPD_MOD_PNPEAK 501 -#define B3SOIPD_MOD_PNSUB 502 -#define B3SOIPD_MOD_PNGATE 503 -#define B3SOIPD_MOD_PVTH0 504 -#define B3SOIPD_MOD_PK1 505 -#define B3SOIPD_MOD_PK1W1 506 -#define B3SOIPD_MOD_PK1W2 507 -#define B3SOIPD_MOD_PK2 508 -#define B3SOIPD_MOD_PK3 509 -#define B3SOIPD_MOD_PK3B 510 -#define B3SOIPD_MOD_PKB1 511 -#define B3SOIPD_MOD_PW0 512 -#define B3SOIPD_MOD_PNLX 513 -#define B3SOIPD_MOD_PDVT0 514 -#define B3SOIPD_MOD_PDVT1 515 -#define B3SOIPD_MOD_PDVT2 516 -#define B3SOIPD_MOD_PDVT0W 517 -#define B3SOIPD_MOD_PDVT1W 518 -#define B3SOIPD_MOD_PDVT2W 519 -#define B3SOIPD_MOD_PU0 520 -#define B3SOIPD_MOD_PUA 521 -#define B3SOIPD_MOD_PUB 522 -#define B3SOIPD_MOD_PUC 523 -#define B3SOIPD_MOD_PVSAT 524 -#define B3SOIPD_MOD_PA0 525 -#define B3SOIPD_MOD_PAGS 526 -#define B3SOIPD_MOD_PB0 527 -#define B3SOIPD_MOD_PB1 528 -#define B3SOIPD_MOD_PKETA 529 -#define B3SOIPD_MOD_PKETAS 530 -#define B3SOIPD_MOD_PA1 531 -#define B3SOIPD_MOD_PA2 532 -#define B3SOIPD_MOD_PRDSW 533 -#define B3SOIPD_MOD_PPRWB 534 -#define B3SOIPD_MOD_PPRWG 535 -#define B3SOIPD_MOD_PWR 536 -#define B3SOIPD_MOD_PNFACTOR 537 -#define B3SOIPD_MOD_PDWG 538 -#define B3SOIPD_MOD_PDWB 539 -#define B3SOIPD_MOD_PVOFF 540 -#define B3SOIPD_MOD_PETA0 541 -#define B3SOIPD_MOD_PETAB 542 -#define B3SOIPD_MOD_PDSUB 543 -#define B3SOIPD_MOD_PCIT 544 -#define B3SOIPD_MOD_PCDSC 545 -#define B3SOIPD_MOD_PCDSCB 546 -#define B3SOIPD_MOD_PCDSCD 547 -#define B3SOIPD_MOD_PPCLM 548 -#define B3SOIPD_MOD_PPDIBL1 549 -#define B3SOIPD_MOD_PPDIBL2 550 -#define B3SOIPD_MOD_PPDIBLB 551 -#define B3SOIPD_MOD_PDROUT 552 -#define B3SOIPD_MOD_PPVAG 553 -#define B3SOIPD_MOD_PDELTA 554 -#define B3SOIPD_MOD_PALPHA0 555 -#define B3SOIPD_MOD_PFBJTII 556 -#define B3SOIPD_MOD_PBETA0 557 -#define B3SOIPD_MOD_PBETA1 558 -#define B3SOIPD_MOD_PBETA2 559 -#define B3SOIPD_MOD_PVDSATII0 560 -#define B3SOIPD_MOD_PLII 561 -#define B3SOIPD_MOD_PESATII 562 -#define B3SOIPD_MOD_PSII0 563 -#define B3SOIPD_MOD_PSII1 564 -#define B3SOIPD_MOD_PSII2 565 -#define B3SOIPD_MOD_PSIID 566 -#define B3SOIPD_MOD_PAGIDL 567 -#define B3SOIPD_MOD_PBGIDL 568 -#define B3SOIPD_MOD_PNGIDL 569 -#define B3SOIPD_MOD_PNTUN 570 -#define B3SOIPD_MOD_PNDIODE 571 -#define B3SOIPD_MOD_PNRECF0 572 -#define B3SOIPD_MOD_PNRECR0 573 -#define B3SOIPD_MOD_PISBJT 574 -#define B3SOIPD_MOD_PISDIF 575 -#define B3SOIPD_MOD_PISREC 576 -#define B3SOIPD_MOD_PISTUN 577 -#define B3SOIPD_MOD_PVREC0 578 -#define B3SOIPD_MOD_PVTUN0 579 -#define B3SOIPD_MOD_PNBJT 580 -#define B3SOIPD_MOD_PLBJT0 581 -#define B3SOIPD_MOD_PVABJT 582 -#define B3SOIPD_MOD_PAELY 583 -#define B3SOIPD_MOD_PAHLI 584 -#define B3SOIPD_MOD_PVSDFB 585 -#define B3SOIPD_MOD_PVSDTH 586 -#define B3SOIPD_MOD_PDELVT 587 -#define B3SOIPD_MOD_PACDE 588 -#define B3SOIPD_MOD_PMOIN 589 -/* Added for binning - END3 */ - -#define B3SOIPD_MOD_TNOM 701 -#define B3SOIPD_MOD_CGSO 702 -#define B3SOIPD_MOD_CGDO 703 -#define B3SOIPD_MOD_CGEO 704 -#define B3SOIPD_MOD_XPART 705 - -#define B3SOIPD_MOD_RSH 706 -#define B3SOIPD_MOD_NMOS 814 -#define B3SOIPD_MOD_PMOS 815 - -#define B3SOIPD_MOD_NOIA 816 -#define B3SOIPD_MOD_NOIB 817 -#define B3SOIPD_MOD_NOIC 818 - -#define B3SOIPD_MOD_LINT 819 -#define B3SOIPD_MOD_LL 820 -#define B3SOIPD_MOD_LLN 821 -#define B3SOIPD_MOD_LW 822 -#define B3SOIPD_MOD_LWN 823 -#define B3SOIPD_MOD_LWL 824 - -#define B3SOIPD_MOD_WINT 827 -#define B3SOIPD_MOD_WL 828 -#define B3SOIPD_MOD_WLN 829 -#define B3SOIPD_MOD_WW 830 -#define B3SOIPD_MOD_WWN 831 -#define B3SOIPD_MOD_WWL 832 - -/* v2.2.3 */ -#define B3SOIPD_MOD_LWLC 847 -#define B3SOIPD_MOD_LLC 848 -#define B3SOIPD_MOD_LWC 849 -#define B3SOIPD_MOD_WWLC 850 -#define B3SOIPD_MOD_WLC 851 -#define B3SOIPD_MOD_WWC 852 -#define B3SOIPD_MOD_DTOXCV 853 - -#define B3SOIPD_MOD_DWC 835 -#define B3SOIPD_MOD_DLC 836 - -#define B3SOIPD_MOD_EM 837 -#define B3SOIPD_MOD_EF 838 -#define B3SOIPD_MOD_AF 839 -#define B3SOIPD_MOD_KF 840 -#define B3SOIPD_MOD_NOIF 841 - - -#define B3SOIPD_MOD_PBSWG 843 -#define B3SOIPD_MOD_MJSWG 844 -#define B3SOIPD_MOD_CJSWG 845 -#define B3SOIPD_MOD_CSDESW 846 - -/* device questions */ -#define B3SOIPD_DNODE 901 -#define B3SOIPD_GNODE 902 -#define B3SOIPD_SNODE 903 -#define B3SOIPD_BNODE 904 -#define B3SOIPD_ENODE 905 -#define B3SOIPD_DNODEPRIME 906 -#define B3SOIPD_SNODEPRIME 907 -#define B3SOIPD_VBD 908 -#define B3SOIPD_VBS 909 -#define B3SOIPD_VGS 910 -#define B3SOIPD_VES 911 -#define B3SOIPD_VDS 912 -#define B3SOIPD_CD 913 -#define B3SOIPD_CBS 914 -#define B3SOIPD_CBD 915 -#define B3SOIPD_GM 916 -#define B3SOIPD_GDS 917 -#define B3SOIPD_GMBS 918 -#define B3SOIPD_GBD 919 -#define B3SOIPD_GBS 920 -#define B3SOIPD_QB 921 -#define B3SOIPD_CQB 922 -#define B3SOIPD_QG 923 -#define B3SOIPD_CQG 924 -#define B3SOIPD_QD 925 -#define B3SOIPD_CQD 926 -#define B3SOIPD_CGG 927 -#define B3SOIPD_CGD 928 -#define B3SOIPD_CGS 929 -#define B3SOIPD_CBG 930 -#define B3SOIPD_CAPBD 931 -#define B3SOIPD_CQBD 932 -#define B3SOIPD_CAPBS 933 -#define B3SOIPD_CQBS 934 -#define B3SOIPD_CDG 935 -#define B3SOIPD_CDD 936 -#define B3SOIPD_CDS 937 -#define B3SOIPD_VON 938 -#define B3SOIPD_VDSAT 939 -#define B3SOIPD_QBS 940 -#define B3SOIPD_QBD 941 -#define B3SOIPD_SOURCECONDUCT 942 -#define B3SOIPD_DRAINCONDUCT 943 -#define B3SOIPD_CBDB 944 -#define B3SOIPD_CBSB 945 -#define B3SOIPD_GMID 946 - - -#include "b3soipdext.h" - -extern void B3SOIPDevaluate(double,double,double,B3SOIPDinstance*,B3SOIPDmodel*, - double*,double*,double*, double*, double*, double*, double*, - double*, double*, double*, double*, double*, double*, double*, - double*, double*, double*, double*, CKTcircuit*); -extern int B3SOIPDdebug(B3SOIPDmodel*, B3SOIPDinstance*, CKTcircuit*, int); -extern int B3SOIPDcheckModel(B3SOIPDmodel*, B3SOIPDinstance*, CKTcircuit*); -#endif /*B3SOIPD*/ - diff --git a/src/spicelib/devices/bsim3soi_pd/b3soipdext.h b/src/spicelib/devices/bsim3soi_pd/b3soipdext.h deleted file mode 100644 index e8664dc4c..000000000 --- a/src/spicelib/devices/bsim3soi_pd/b3soipdext.h +++ /dev/null @@ -1,27 +0,0 @@ -/********** -Copyright 1990 Regents of the University of California. All rights reserved. -Author: 1998 Samuel Fung -File: b3soipdext.h -Modified by Paolo Nenzi 2002 -**********/ - -extern int B3SOIPDacLoad(GENmodel *,CKTcircuit*); -extern int B3SOIPDask(CKTcircuit *,GENinstance*,int,IFvalue*,IFvalue*); -extern int B3SOIPDconvTest(GENmodel *,CKTcircuit*); -extern int B3SOIPDgetic(GENmodel*,CKTcircuit*); -extern int B3SOIPDload(GENmodel*,CKTcircuit*); -extern int B3SOIPDmAsk(CKTcircuit*,GENmodel *,int, IFvalue*); -extern int B3SOIPDmParam(int,IFvalue*,GENmodel*); -extern void B3SOIPDmosCap(CKTcircuit*, double, double, double, double, - double, double, double, double, double, double, double, - double, double, double, double, double, double, double*, - double*, double*, double*, double*, double*, double*, double*, - double*, double*, double*, double*, double*, double*, double*, - double*); -extern int B3SOIPDparam(int,IFvalue*,GENinstance*,IFvalue*); -extern int B3SOIPDpzLoad(GENmodel*,CKTcircuit*,SPcomplex*); -extern int B3SOIPDsetup(SMPmatrix*,GENmodel*,CKTcircuit*,int*); -extern int B3SOIPDtemp(GENmodel*,CKTcircuit*); -extern int B3SOIPDtrunc(GENmodel*,CKTcircuit*,double*); -extern int B3SOIPDnoise(int,int,GENmodel*,CKTcircuit*,Ndata*,double*); -extern int B3SOIPDunsetup(GENmodel*,CKTcircuit*); diff --git a/src/spicelib/devices/bsim3soi_pd/b3soipdgetic.c b/src/spicelib/devices/bsim3soi_pd/b3soipdgetic.c deleted file mode 100644 index b05507989..000000000 --- a/src/spicelib/devices/bsim3soi_pd/b3soipdgetic.c +++ /dev/null @@ -1,54 +0,0 @@ -/********** -Copyright 1990 Regents of the University of California. All rights reserved. -Author: 1998 Samuel Fung, Dennis Sinitsky and Stephen Tang -File: b3soipdgetic.c 98/5/01 -Modified by Paolo Nenzi 2002 -**********/ - -/* - * Revision 2.2.3 02/3/5 Pin Su - * BSIMPD2.2.3 release - */ - -#include "ngspice/ngspice.h" -#include "ngspice/cktdefs.h" -#include "b3soipddef.h" -#include "ngspice/sperror.h" -#include "ngspice/suffix.h" - - -int -B3SOIPDgetic(GENmodel *inModel, CKTcircuit *ckt) -{ -B3SOIPDmodel *model = (B3SOIPDmodel*)inModel; -B3SOIPDinstance *here; - - for (; model ; model = B3SOIPDnextModel(model)) - { for (here = B3SOIPDinstances(model); here; here = B3SOIPDnextInstance(here)) - { - if(!here->B3SOIPDicVBSGiven) - { here->B3SOIPDicVBS = *(ckt->CKTrhs + here->B3SOIPDbNode) - - *(ckt->CKTrhs + here->B3SOIPDsNode); - } - if (!here->B3SOIPDicVDSGiven) - { here->B3SOIPDicVDS = *(ckt->CKTrhs + here->B3SOIPDdNode) - - *(ckt->CKTrhs + here->B3SOIPDsNode); - } - if (!here->B3SOIPDicVGSGiven) - { here->B3SOIPDicVGS = *(ckt->CKTrhs + here->B3SOIPDgNode) - - *(ckt->CKTrhs + here->B3SOIPDsNode); - } - if (!here->B3SOIPDicVESGiven) - { here->B3SOIPDicVES = *(ckt->CKTrhs + here->B3SOIPDeNode) - - *(ckt->CKTrhs + here->B3SOIPDsNode); - } - if (!here->B3SOIPDicVPSGiven) - { here->B3SOIPDicVPS = *(ckt->CKTrhs + here->B3SOIPDpNode) - - *(ckt->CKTrhs + here->B3SOIPDsNode); - } - } - } - return(OK); -} - - diff --git a/src/spicelib/devices/bsim3soi_pd/b3soipdinit.c b/src/spicelib/devices/bsim3soi_pd/b3soipdinit.c deleted file mode 100644 index 2bfa48110..000000000 --- a/src/spicelib/devices/bsim3soi_pd/b3soipdinit.c +++ /dev/null @@ -1,75 +0,0 @@ -#include "ngspice/config.h" - -#include "ngspice/devdefs.h" - -#include "b3soipditf.h" -#include "b3soipdinit.h" - - -SPICEdev B3SOIPDinfo = { - .DEVpublic = { - .name = "B3SOIPD", - .description = "Berkeley SOI (PD) MOSFET model version 2.2.3", - .terms = &B3SOIPDnSize, - .numNames = &B3SOIPDnSize, - .termNames = B3SOIPDnames, - .numInstanceParms = &B3SOIPDpTSize, - .instanceParms = B3SOIPDpTable, - .numModelParms = &B3SOIPDmPTSize, - .modelParms = B3SOIPDmPTable, - .flags = DEV_DEFAULT, - -#ifdef XSPICE - .cm_func = NULL, - .num_conn = 0, - .conn = NULL, - .num_param = 0, - .param = NULL, - .num_inst_var = 0, - .inst_var = NULL, -#endif - }, - - .DEVparam = B3SOIPDparam, - .DEVmodParam = B3SOIPDmParam, - .DEVload = B3SOIPDload, - .DEVsetup = B3SOIPDsetup, - .DEVunsetup = B3SOIPDunsetup, - .DEVpzSetup = B3SOIPDsetup, - .DEVtemperature = B3SOIPDtemp, - .DEVtrunc = B3SOIPDtrunc, - .DEVfindBranch = NULL, - .DEVacLoad = B3SOIPDacLoad, - .DEVaccept = NULL, - .DEVdestroy = NULL, - .DEVmodDelete = NULL, - .DEVdelete = NULL, - .DEVsetic = B3SOIPDgetic, - .DEVask = B3SOIPDask, - .DEVmodAsk = B3SOIPDmAsk, - .DEVpzLoad = B3SOIPDpzLoad, - .DEVconvTest = B3SOIPDconvTest, - .DEVsenSetup = NULL, - .DEVsenLoad = NULL, - .DEVsenUpdate = NULL, - .DEVsenAcLoad = NULL, - .DEVsenPrint = NULL, - .DEVsenTrunc = NULL, - .DEVdisto = NULL, - .DEVnoise = B3SOIPDnoise, - .DEVsoaCheck = NULL, - .DEVinstSize = &B3SOIPDiSize, - .DEVmodSize = &B3SOIPDmSize, - -#ifdef CIDER - .DEVdump = NULL, - .DEVacct = NULL, -#endif -}; - - -SPICEdev * -get_b3soipd_info (void) -{ - return &B3SOIPDinfo; -} diff --git a/src/spicelib/devices/bsim3soi_pd/b3soipdinit.h b/src/spicelib/devices/bsim3soi_pd/b3soipdinit.h deleted file mode 100644 index 2a487074e..000000000 --- a/src/spicelib/devices/bsim3soi_pd/b3soipdinit.h +++ /dev/null @@ -1,13 +0,0 @@ -#ifndef _B3SOIPDINIT_H -#define _B3SOIPDINIT_H - -extern IFparm B3SOIPDpTable[]; -extern IFparm B3SOIPDmPTable[]; -extern char *B3SOIPDnames[]; -extern int B3SOIPDpTSize; -extern int B3SOIPDmPTSize; -extern int B3SOIPDnSize; -extern int B3SOIPDiSize; -extern int B3SOIPDmSize; - -#endif diff --git a/src/spicelib/devices/bsim3soi_pd/b3soipditf.h b/src/spicelib/devices/bsim3soi_pd/b3soipditf.h deleted file mode 100644 index 2f5ce892f..000000000 --- a/src/spicelib/devices/bsim3soi_pd/b3soipditf.h +++ /dev/null @@ -1,13 +0,0 @@ -/********** -Copyright 1990 Regents of the University of California. All rights reserved. -Author: 1998 Samuel Fung -File: b3soipditf.h -**********/ -#ifndef DEV_B3SOIPD -#define DEV_B3SOIPD - -#include "b3soipdext.h" - -SPICEdev *get_b3soipd_info (void); - -#endif diff --git a/src/spicelib/devices/bsim3soi_pd/b3soipdld.c b/src/spicelib/devices/bsim3soi_pd/b3soipdld.c deleted file mode 100644 index 1f917c098..000000000 --- a/src/spicelib/devices/bsim3soi_pd/b3soipdld.c +++ /dev/null @@ -1,4146 +0,0 @@ -/********** -Copyright 1990 Regents of the University of California. All rights reserved. -Author: 1998 Samuel Fung, Dennis Sinitsky and Stephen Tang -File: b3soipdld.c 98/5/01 -Modified by Pin Su, Weidong Liu and Jan Feng 99/2/15 -Modified by Pin Su 99/4/30 -Modified by Pin Su, Wei Jin 99/9/27 -Modified by Pin Su 00/3/1 -Modified by Pin Su 00/8/15 -Modified by Pin Su 01/2/15 -Modified by Pin Su and Hui Wan 02/3/5 -Modified by Paolo Nenzi 2002 -**********/ - -/* - * Revision 2.2.3 02/3/5 Pin Su - * BSIMPD2.2.3 release - */ - -#include "ngspice/ngspice.h" -#include "ngspice/cktdefs.h" -#include "b3soipddef.h" -#include "ngspice/trandefs.h" -#include "ngspice/const.h" -#include "ngspice/sperror.h" -#include "ngspice/devdefs.h" -#include "ngspice/suffix.h" - -#define EPSOX 3.453133e-11 -#define EPSSI 1.03594e-10 -#define Charge_q 1.60219e-19 -#define KboQ 8.617087e-5 /* Kb / q */ -#define Eg300 1.115 /* energy gap at 300K */ -#define DELTA_1 0.02 -#define DELTA_2 0.02 -#define DELTA_3 0.02 -/* Original is 0.02, for matching IBM model, change to 0.08 */ -#define DELTA_3_SOI 0.08 -#define DELTA_4 0.02 -#define DELT_Vbseff 0.005 -#define DELTA_VFB 0.02 -#define CONST_2OV3 0.6666666666 - -#define MAX_EXPL 2.688117142e+43 -#define MIN_EXPL 3.720075976e-44 -#define EXPL_THRESHOLD 100.0 -#define DEXP(A,B,C) { \ - if (A > EXPL_THRESHOLD) { \ - B = MAX_EXPL*(1.0+(A)-EXPL_THRESHOLD); \ - C = MAX_EXPL; \ - } else if (A < -EXPL_THRESHOLD) { \ - B = MIN_EXPL; \ - C = 0; \ - } else { \ - B = exp(A); \ - C = B; \ - } \ - } - -#define FLOG(A) fabs(A) + 1e-14 - - - /* B3SOIPDlimit(vnew,vold) - * limits the per-iteration change of any absolute voltage value - */ - -static double -B3SOIPDlimit(double vnew, double vold, double limit, int *check) -{ - double T0, T1; - - if (isnan (vnew) || isnan (vold)) - { - fprintf(stderr, "Alberto says: YOU TURKEY! The limiting function received NaN.\n"); - fprintf(stderr, "New prediction returns to 0.0!\n"); - vnew = 0.0; - *check = 1; - } - T0 = vnew - vold; - T1 = fabs(T0); - if (T1 > limit) { - if (T0 > 0.0) - vnew = vold + limit; - else - vnew = vold - limit; - *check = 1; - } - return vnew; -} - - - -int -B3SOIPDload(GENmodel *inModel, CKTcircuit *ckt) -{ -B3SOIPDmodel *model = (B3SOIPDmodel*)inModel; -B3SOIPDinstance *here; -int selfheat; - -double Gmin; -double ag0, qgd, qgs, von, cbhat, VgstNVt, ExpVgst = 0.0; -double cdhat, cdreq, ceqbd, ceqbs, ceqqb, ceqqd, ceqqg, ceq, geq; -double arg; -double delvbd, delvbs, delvds, delvgd, delvgs; -double Vfbeff, dVfbeff_dVg, dVfbeff_dVd, dVfbeff_dVb, V3, V4; -double PhiBSWG, MJSWG; -double gcgdb, gcggb, gcgsb, gcgeb, gcgT; -double gcsdb, gcsgb, gcssb, gcseb, gcsT; -double gcddb, gcdgb, gcdsb, gcdeb, gcdT; -double gcbdb, gcbgb, gcbsb, gcbeb, gcbT; -double gcedb, gcegb, gcesb, gceeb, gceT; -double gcTt, gTtg, gTtb, gTtdp, gTtt, gTtsp; -double vbd, vbs, vds, vgb, vgd, vgs, vgdo; -#ifndef PREDICTOR -double xfact; -#endif -double vg, vd, vs, vp, ve, vb; -double Vds, Vgs, Vbs, Gmbs, FwdSum, RevSum; -double Vgs_eff, Vfb, dVfb_dVb, dVfb_dVd, dVfb_dT; -double Phis, dPhis_dVb, sqrtPhis, dsqrtPhis_dVb, Vth, dVth_dVb, dVth_dVd, dVth_dT; -double Vgst, dVgst_dVg, dVgst_dVb, dVgs_eff_dVg; -double n, dn_dVb, Vtm; -double ExpArg, V0; -double ueff, dueff_dVg, dueff_dVd, dueff_dVb, dueff_dT; -double Esat, Vdsat; -double EsatL, dEsatL_dVg, dEsatL_dVd, dEsatL_dVb, dEsatL_dT; -double dVdsat_dVg, dVdsat_dVb, dVdsat_dVd, dVdsat_dT, Vasat; -double dVasat_dVg, dVasat_dVb, dVasat_dVd, dVasat_dT; -double Va, dVa_dVd, dVa_dVg, dVa_dVb, dVa_dT; -double Vbseff, dVbseff_dVb; -double CoxWL; -double T0, dT0_dVg, dT0_dVd, dT0_dVb, dT0_dT; -double T1, dT1_dVg, dT1_dVd, dT1_dVb, dT1_dT; -double T2, dT2_dVg, dT2_dVd, dT2_dVb, dT2_dT; -double T3, dT3_dVg, dT3_dVd, dT3_dVb, dT3_dT = 0.0; -double T4, dT4_dVd, dT4_dVb, dT4_dT; -double T5, dT5_dVg, dT5_dVd, dT5_dVb, dT5_dT = 0.0; -double T6, dT6_dT = 0.0; -double T7, Vdsatii; -double T8; -double T9; -double T10, dT10_dVb; -double T11, T12; -double tmp, Abulk, dAbulk_dVb, Abulk0, dAbulk0_dVb; -double VACLM, dVACLM_dVg, dVACLM_dVd, dVACLM_dVb, dVACLM_dT; -double VADIBL, dVADIBL_dVg, dVADIBL_dVd, dVADIBL_dVb, dVADIBL_dT; -double Xdep, dXdep_dVb, lt1, dlt1_dVb, ltw, dltw_dVb; -double Delt_vth, dDelt_vth_dVb, dDelt_vth_dT; -double Theta0, dTheta0_dVb; -double TempRatio, tmp1, tmp2, tmp3, tmp4; -double DIBL_Sft, dDIBL_Sft_dVd, Lambda, dLambda_dVg; -double a1; - -double Vgsteff, dVgsteff_dVg, dVgsteff_dVd, dVgsteff_dVb, dVgsteff_dT; -double Vdseff, dVdseff_dVg, dVdseff_dVd, dVdseff_dVb, dVdseff_dT; -double VdseffCV, dVdseffCV_dVg, dVdseffCV_dVd, dVdseffCV_dVb; -double diffVds; -double dAbulk_dVg, dn_dVd ; -double beta, dbeta_dVg, dbeta_dVd, dbeta_dVb, dbeta_dT; -double gche, dgche_dVg, dgche_dVd, dgche_dVb, dgche_dT; -double fgche1, dfgche1_dVg, dfgche1_dVd, dfgche1_dVb, dfgche1_dT; -double fgche2, dfgche2_dVg, dfgche2_dVd, dfgche2_dVb, dfgche2_dT; -double Idl, dIdl_dVg, dIdl_dVd, dIdl_dVb, dIdl_dT; -double Ids, Gm, Gds, Gmb; -double CoxWovL; -double Rds, dRds_dVg, dRds_dVb, dRds_dT, WVCox, WVCoxRds; -double Vgst2Vtm, dVgst2Vtm_dT, VdsatCV, dVdsatCV_dVg, dVdsatCV_dVb; -double Leff, Weff, dWeff_dVg, dWeff_dVb; -double AbulkCV, dAbulkCV_dVb; -double qgdo, qgso, cgdo, cgso; - -double dxpart, sxpart; - -struct b3soipdSizeDependParam *pParam; -int ByPass, Check, ChargeComputationNeeded = 0, error; - -double gbbsp, gbbdp, gbbg, gbbb, gbbp, gbbT; -double gddpsp, gddpdp, gddpg, gddpb, gddpT; -double gsspsp, gsspdp, gsspg, gsspb, gsspT; -double Gbpbs, Gbpps; -double ves, ved, veb, vge = 0.0, delves, vedo, delved; -double vps, vpd, Vps, delvps; -double Vbd, Ves, Vesfb, DeltVthtemp, dDeltVthtemp_dT; -double Vbp, dVbp_dVb; -double DeltVthw, dDeltVthw_dVb, dDeltVthw_dT; -double Gm0, Gds0, Gmb0, GmT0, Gmc, GmT; -double dDIBL_Sft_dVb; -double Idgidl, Gdgidld, Gdgidlg, Isgidl, Gsgidlg; -double Gjsd, Gjsb, GjsT, Gjdd, Gjdb, GjdT; -double Ibp, Iii, Giid, Giig, Giib, GiiT, Gcd, Gcb, GcT, ceqbody, ceqbodcon; -double gppb, gppp, gppT; -double delTemp, deldelTemp, Temp; -double ceqth, ceqqth; -double K1; -double qjs = 0.0, gcjsbs, gcjsT; -double qjd = 0.0, gcjdbs, gcjdds, gcjdT; -double qge; -double ceqqe; -double ni, Eg, Cbox, CboxWL; -double cjsbs; -double dVfbeff_dVrg; -double qinv, qgate = 0.0, qbody = 0.0, qdrn = 0.0, qsrc, qsub = 0.0; -double cqgate, cqbody, cqdrn, cqsub, cqtemp; -double Cgg, Cgd, Cgb; -double Csg, Csd, Csb, Cbg = 0.0, Cbd = 0.0, Cbb = 0.0; -double Cgg1, Cgb1, Cgd1, Cbg1, Cbb1, Cbd1, Csg1, Csd1, Csb1; -double Ibs1 ,dIbs1_dVb ,dIbs1_dT; -double Ibs2 ,dIbs2_dVb ,dIbs2_dT; -double Ibs3 ,dIbs3_dVb ,dIbs3_dVd, dIbs3_dT; -double Ibs4 ,dIbs4_dVb ,dIbs4_dT; -double Ibd1 ,dIbd1_dVb ,dIbd1_dVd ,dIbd1_dT; -double Ibd2 ,dIbd2_dVb ,dIbd2_dVd ,dIbd2_dT; -double Ibd3 ,dIbd3_dVb ,dIbd3_dVd ,dIbd3_dT; -double Ibd4 ,dIbd4_dVb ,dIbd4_dVd ,dIbd4_dT; -double WTsi, NVtm1, NVtm2; -double Ic ,dIc_dVb ,dIc_dVd; -double Ibs; -double Ibd; -double Denomi ,dDenomi_dVg ,dDenomi_dVd ,dDenomi_dVb ,dDenomi_dT; -double Qsub0 = 0.0, dQsub0_dVg, dQsub0_dVb, dQsub0_dVd; -double Qac0 = 0.0, dQac0_dVb, dQac0_dVd; -double Qe1 , dQe1_dVb, dQe1_dVe, dQe1_dT; -double Ce1b ,Ce1e, Ce1T; -double dQac0_dVrg, dQsub0_dVrg; - -/* for self-heating */ -double vbi, vfbb, phi, sqrtPhi, Xdep0, jbjt, jdif, jrec, jtun, u0temp, vsattemp; -double rds0, ua, ub, uc; -double dvbi_dT, dvfbb_dT, djbjt_dT, djdif_dT, djrec_dT, djtun_dT, du0temp_dT; -double dvsattemp_dT, drds0_dT, dua_dT, dub_dT, duc_dT, dni_dT, dVtm_dT; -double dVfbeff_dT, dQac0_dT, dQsub0_dT; -double CbT, CsT, CgT; - - -/* v2.0 release */ -double Vbsh, dVbsh_dVb; -double sqrtPhisExt, dsqrtPhisExt_dVb; -double T13, T14; -double dT11_dVb, dT13_dVb, dT14_dVb; -double dVgst_dVd; -double Vdsatii0, dVdsatii0_dT; -double VgsStep, dVgsStep_dT, Ratio, dRatio_dVg, dRatio_dVb, dRatio_dVd, dRatio_dT, dTempRatio_dT; -double Vdiff, dVdiff_dVg, dVdiff_dVb, dVdiff_dVd, dVdiff_dT; -double dNVtm1_dT; -double NVtmf, NVtmr, dNVtmf_dT, dNVtmr_dT; -double TempRatioMinus1; -double Ahli, dAhli_dT; -double WsTsi, WdTsi; -double dPhiBSWG_dT, dcjsbs_dT, darg_dT = 0.0, ddT3_dVb_dT = 0.0; -double dT7_dT, dT0_dT7, dT1_dT7, dT2_dT7; -double CoxWLb, CoxWLcenb; -double ExpVbsNVtm, dExpVbsNVtm_dVb, dExpVbsNVtm_dT; -double ExpVbdNVtm, dExpVbdNVtm_dVb, dExpVbdNVtm_dVd, dExpVbdNVtm_dT; -double Ien, dIen_dT, Iendif, dIendif_dT; -double Ibsdif, dIbsdif_dVb, dIbsdif_dT; -double Ibddif, dIbddif_dVb, dIbddif_dVd, dIbddif_dT; -double Ehlis, dEhlis_dVb, dEhlis_dT; -double EhlisFactor, dEhlisFactor_dVb, dEhlisFactor_dT; -double Ehlid, dEhlid_dVb, dEhlid_dVd, dEhlid_dT; -double EhlidFactor, dEhlidFactor_dVb, dEhlidFactor_dVd, dEhlidFactor_dT; -double E2ndFactor, dE2ndFactor_dVb, dE2ndFactor_dVd, dE2ndFactor_dT; -double dT10_dT, dT11_dT, DioMax; -double cjdbs, dcjdbs_dT; -double wdios, wdiod, wdiosCV, wdiodCV; - -/* for capMod3 */ -double Cox, Tox, Tcen, dTcen_dVg, dTcen_dVb, LINK, Ccen, Coxeff, dCoxeff_dVg, dCoxeff_dVb; -double CoxWLcen, QovCox, dQac0_dVg, DeltaPhi, dDeltaPhi_dVg, dDeltaPhi_dVd, dDeltaPhi_dVb; -double dTcen_dVd, dTcen_dT, dCoxeff_dVd, dCoxeff_dT, dCoxWLcenb_dT, qinoi, qbulk; -double T3zb, lt1zb, ltwzb, Theta0zb; -double Delt_vthzb, dDelt_vthzb_dT; -double DeltVthwzb, dDeltVthwzb_dT; -double DeltVthtempzb, dDeltVthtempzb_dT; -double Vthzb = 0.0, dVthzb_dT = 0.0, Vfbzb, dVfbzb_dT; - - -/* v2.2 release */ -double Vgb, dVgb_dVg, dVgb_dVb, Vox, dVox_dVg, dVox_dVd, dVox_dVb; -double OxideRatio, Vaux, dVaux_dVg, dVaux_dVd, dVaux_dVb; -double Igb, dIgb_dVg, dIgb_dVd, dIgb_dVb; -double ceqgate; -double dT0_dVox, Voxeff, dVoxeff_dVox; -double dVox_dT = 0.0, dVaux_dT = 0.0, dIgb_dT; -double Voxacc, dVoxacc_dVg, dVoxacc_dVd, dVoxacc_dVb; -double Voxdepinv, dVoxdepinv_dVg, dVoxdepinv_dVb, dVoxdepinv_dVd; -double dVoxdepinv_dT = 0.0; -double Igb1, dIgb1_dVg, dIgb1_dVd, dIgb1_dVb, dIgb1_dT; -double Igb2, dIgb2_dVg, dIgb2_dVd, dIgb2_dVb, dIgb2_dT; -double gigs, gigd, gigb, gigg; -double gigT; - -double m; - -for (; model != NULL; model = B3SOIPDnextModel(model)) -{ for (here = B3SOIPDinstances(model); here != NULL; - here = B3SOIPDnextInstance(here)) - { - Check = 0; - ByPass = 0; - selfheat = (model->B3SOIPDshMod == 1) && (here->B3SOIPDrth0 != 0.0); - pParam = here->pParam; - - - if ((ckt->CKTmode & MODEINITSMSIG)) - { - vs = *(ckt->CKTrhsOld + here->B3SOIPDsNodePrime); - if (!here->B3SOIPDvbsusrGiven) { - vbs = *(ckt->CKTstate0 + here->B3SOIPDvbs); - vb = *(ckt->CKTrhsOld + here->B3SOIPDbNode); - } - else { - vbs = here->B3SOIPDvbsusr; - vb = here->B3SOIPDvbsusr + vs; - } - vgs = *(ckt->CKTstate0 + here->B3SOIPDvgs); - ves = *(ckt->CKTstate0 + here->B3SOIPDves); - vps = *(ckt->CKTstate0 + here->B3SOIPDvps); - vds = *(ckt->CKTstate0 + here->B3SOIPDvds); - delTemp = *(ckt->CKTstate0 + here->B3SOIPDdeltemp); - - vg = *(ckt->CKTrhsOld + here->B3SOIPDgNode); - vd = *(ckt->CKTrhsOld + here->B3SOIPDdNodePrime); - vp = *(ckt->CKTrhsOld + here->B3SOIPDpNode); - ve = *(ckt->CKTrhsOld + here->B3SOIPDeNode); - - } - else if ((ckt->CKTmode & MODEINITTRAN)) - { - vs = *(ckt->CKTrhsOld + here->B3SOIPDsNodePrime); - if (!here->B3SOIPDvbsusrGiven) { - vbs = *(ckt->CKTstate1 + here->B3SOIPDvbs); - vb = *(ckt->CKTrhsOld + here->B3SOIPDbNode); - } - else { - vbs = here->B3SOIPDvbsusr; - vb = here->B3SOIPDvbsusr + vs; - } - vgs = *(ckt->CKTstate1 + here->B3SOIPDvgs); - ves = *(ckt->CKTstate1 + here->B3SOIPDves); - vps = *(ckt->CKTstate1 + here->B3SOIPDvps); - vds = *(ckt->CKTstate1 + here->B3SOIPDvds); - delTemp = *(ckt->CKTstate1 + here->B3SOIPDdeltemp); - - vg = *(ckt->CKTrhsOld + here->B3SOIPDgNode); - vd = *(ckt->CKTrhsOld + here->B3SOIPDdNodePrime); - vp = *(ckt->CKTrhsOld + here->B3SOIPDpNode); - ve = *(ckt->CKTrhsOld + here->B3SOIPDeNode); - - } - else if ((ckt->CKTmode & MODEINITJCT) && !here->B3SOIPDoff) - { vds = model->B3SOIPDtype * here->B3SOIPDicVDS; - vgs = model->B3SOIPDtype * here->B3SOIPDicVGS; - ves = model->B3SOIPDtype * here->B3SOIPDicVES; - vbs = model->B3SOIPDtype * here->B3SOIPDicVBS; - vps = model->B3SOIPDtype * here->B3SOIPDicVPS; - - vg = vd = vs = vp = ve = 0.0; - - - delTemp = 0.0; - here->B3SOIPDphi = pParam->B3SOIPDphi; - - - - if ((vds == 0.0) && (vgs == 0.0) && (vbs == 0.0) && - ((ckt->CKTmode & (MODETRAN | MODEAC|MODEDCOP | - MODEDCTRANCURVE)) || (!(ckt->CKTmode & MODEUIC)))) - { vbs = 0.0; - vgs = model->B3SOIPDtype*0.1 + pParam->B3SOIPDvth0; - vds = 0.0; - ves = 0.0; - vps = 0.0; - } - } - else if ((ckt->CKTmode & (MODEINITJCT | MODEINITFIX)) && - (here->B3SOIPDoff)) - { delTemp = vps = vbs = vgs = vds = ves = 0.0; - vg = vd = vs = vp = ve = 0.0; - } - else - { -#ifndef PREDICTOR - if ((ckt->CKTmode & MODEINITPRED)) - { xfact = ckt->CKTdelta / ckt->CKTdeltaOld[1]; - *(ckt->CKTstate0 + here->B3SOIPDvbs) = - *(ckt->CKTstate1 + here->B3SOIPDvbs); - vbs = (1.0 + xfact)* (*(ckt->CKTstate1 + here->B3SOIPDvbs)) - - (xfact * (*(ckt->CKTstate2 + here->B3SOIPDvbs))); - *(ckt->CKTstate0 + here->B3SOIPDvgs) = - *(ckt->CKTstate1 + here->B3SOIPDvgs); - vgs = (1.0 + xfact)* (*(ckt->CKTstate1 + here->B3SOIPDvgs)) - - (xfact * (*(ckt->CKTstate2 + here->B3SOIPDvgs))); - *(ckt->CKTstate0 + here->B3SOIPDves) = - *(ckt->CKTstate1 + here->B3SOIPDves); - ves = (1.0 + xfact)* (*(ckt->CKTstate1 + here->B3SOIPDves)) - - (xfact * (*(ckt->CKTstate2 + here->B3SOIPDves))); - *(ckt->CKTstate0 + here->B3SOIPDvps) = - *(ckt->CKTstate1 + here->B3SOIPDvps); - vps = (1.0 + xfact)* (*(ckt->CKTstate1 + here->B3SOIPDvps)) - - (xfact * (*(ckt->CKTstate2 + here->B3SOIPDvps))); - *(ckt->CKTstate0 + here->B3SOIPDvds) = - *(ckt->CKTstate1 + here->B3SOIPDvds); - vds = (1.0 + xfact)* (*(ckt->CKTstate1 + here->B3SOIPDvds)) - - (xfact * (*(ckt->CKTstate2 + here->B3SOIPDvds))); - *(ckt->CKTstate0 + here->B3SOIPDvbd) = - *(ckt->CKTstate0 + here->B3SOIPDvbs) - - *(ckt->CKTstate0 + here->B3SOIPDvds); - - *(ckt->CKTstate0 + here->B3SOIPDvg) = *(ckt->CKTstate1 + here->B3SOIPDvg); - *(ckt->CKTstate0 + here->B3SOIPDvd) = *(ckt->CKTstate1 + here->B3SOIPDvd); - *(ckt->CKTstate0 + here->B3SOIPDvs) = *(ckt->CKTstate1 + here->B3SOIPDvs); - *(ckt->CKTstate0 + here->B3SOIPDvp) = *(ckt->CKTstate1 + here->B3SOIPDvp); - *(ckt->CKTstate0 + here->B3SOIPDve) = *(ckt->CKTstate1 + here->B3SOIPDve); - - /* Only predict ve */ - ve = (1.0 + xfact)* (*(ckt->CKTstate1 + here->B3SOIPDve)) - - - (xfact * (*(ckt->CKTstate2 + here->B3SOIPDve))); - /* Then update vg, vs, vb, vd, vp base on ve */ - vs = ve - model->B3SOIPDtype * ves; - vg = model->B3SOIPDtype * vgs + vs; - vd = model->B3SOIPDtype * vds + vs; - vb = model->B3SOIPDtype * vbs + vs; - vp = model->B3SOIPDtype * vps + vs; - - delTemp = (1.0 + xfact)* (*(ckt->CKTstate1 + - here->B3SOIPDdeltemp))-(xfact * (*(ckt->CKTstate2 + - here->B3SOIPDdeltemp))); - -/* v2.2.3 bug fix */ - *(ckt->CKTstate0 + here->B3SOIPDdeltemp) = - *(ckt->CKTstate1 + here->B3SOIPDdeltemp); - - if (selfheat) - { - here->B3SOIPDphi = 2.0 * here->B3SOIPDvtm - * log(pParam->B3SOIPDnpeak / - here->B3SOIPDni); - } - - } - else - { -#endif /* PREDICTOR */ - - vg = B3SOIPDlimit(*(ckt->CKTrhsOld + here->B3SOIPDgNode), - *(ckt->CKTstate0 + here->B3SOIPDvg), 3.0, &Check); - vd = B3SOIPDlimit(*(ckt->CKTrhsOld + here->B3SOIPDdNodePrime), - *(ckt->CKTstate0 + here->B3SOIPDvd), 3.0, &Check); - vs = B3SOIPDlimit(*(ckt->CKTrhsOld + here->B3SOIPDsNodePrime), - *(ckt->CKTstate0 + here->B3SOIPDvs), 3.0, &Check); - vp = B3SOIPDlimit(*(ckt->CKTrhsOld + here->B3SOIPDpNode), - *(ckt->CKTstate0 + here->B3SOIPDvp), 3.0, &Check); - ve = B3SOIPDlimit(*(ckt->CKTrhsOld + here->B3SOIPDeNode), - *(ckt->CKTstate0 + here->B3SOIPDve), 3.0, &Check); - delTemp = *(ckt->CKTrhsOld + here->B3SOIPDtempNode); - - vbs = model->B3SOIPDtype * (*(ckt->CKTrhsOld+here->B3SOIPDbNode) - - *(ckt->CKTrhsOld+here->B3SOIPDsNodePrime)); - - vps = model->B3SOIPDtype * (vp - vs); - vgs = model->B3SOIPDtype * (vg - vs); - ves = model->B3SOIPDtype * (ve - vs); - vds = model->B3SOIPDtype * (vd - vs); - - -#ifndef PREDICTOR - } -#endif /* PREDICTOR */ - - vbd = vbs - vds; - vgd = vgs - vds; - ved = ves - vds; - vgdo = *(ckt->CKTstate0 + here->B3SOIPDvgs) - - *(ckt->CKTstate0 + here->B3SOIPDvds); - vedo = *(ckt->CKTstate0 + here->B3SOIPDves) - - *(ckt->CKTstate0 + here->B3SOIPDvds); - delvbs = vbs - *(ckt->CKTstate0 + here->B3SOIPDvbs); - delvbd = vbd - *(ckt->CKTstate0 + here->B3SOIPDvbd); - delvgs = vgs - *(ckt->CKTstate0 + here->B3SOIPDvgs); - delves = ves - *(ckt->CKTstate0 + here->B3SOIPDves); - delvps = vps - *(ckt->CKTstate0 + here->B3SOIPDvps); - deldelTemp = delTemp - *(ckt->CKTstate0 + here->B3SOIPDdeltemp); - delvds = vds - *(ckt->CKTstate0 + here->B3SOIPDvds); - delvgd = vgd - vgdo; - delved = ved - vedo; - - if (here->B3SOIPDmode >= 0) - { - cdhat = here->B3SOIPDcd + (here->B3SOIPDgm-here->B3SOIPDgjdg) * delvgs - + (here->B3SOIPDgds - here->B3SOIPDgjdd) * delvds - + (here->B3SOIPDgmbs - here->B3SOIPDgjdb) * delvbs - + (here->B3SOIPDgmT - here->B3SOIPDgjdT) * deldelTemp; - } - else - { - cdhat = here->B3SOIPDcd + (here->B3SOIPDgm-here->B3SOIPDgjdg) * delvgd - - (here->B3SOIPDgds - here->B3SOIPDgjdd) * delvds - + (here->B3SOIPDgmbs - here->B3SOIPDgjdb) * delvbd - + (here->B3SOIPDgmT - here->B3SOIPDgjdT) * deldelTemp; - - } - cbhat = here->B3SOIPDcb + here->B3SOIPDgbgs * delvgs - + here->B3SOIPDgbbs * delvbs - + here->B3SOIPDgbds * delvds - + here->B3SOIPDgbps * delvps - + here->B3SOIPDgbT * deldelTemp; - -#ifndef NOBYPASS - /* following should be one big if connected by && all over - * the place, but some C compilers can't handle that, so - * we split it up here to let them digest it in stages - */ - - if ((!(ckt->CKTmode & MODEINITPRED)) && (ckt->CKTbypass) && Check == 0) - if ((fabs(delvbs) < (ckt->CKTreltol * MAX(fabs(vbs), - fabs(*(ckt->CKTstate0+here->B3SOIPDvbs))) + ckt->CKTvoltTol)) ) - if ((fabs(delvbd) < (ckt->CKTreltol * MAX(fabs(vbd), - fabs(*(ckt->CKTstate0+here->B3SOIPDvbd))) + ckt->CKTvoltTol)) ) - if ((fabs(delvgs) < (ckt->CKTreltol * MAX(fabs(vgs), - fabs(*(ckt->CKTstate0+here->B3SOIPDvgs))) + ckt->CKTvoltTol))) - if ((fabs(delves) < (ckt->CKTreltol * MAX(fabs(ves), - fabs(*(ckt->CKTstate0+here->B3SOIPDves))) + ckt->CKTvoltTol))) - if ( (here->B3SOIPDbodyMod == 0) || (here->B3SOIPDbodyMod == 2) || - (fabs(delvps) < (ckt->CKTreltol * MAX(fabs(vps), - fabs(*(ckt->CKTstate0+here->B3SOIPDvps))) + ckt->CKTvoltTol)) ) - if ( (here->B3SOIPDtempNode == 0) || - (fabs(deldelTemp) < (ckt->CKTreltol * MAX(fabs(delTemp), - fabs(*(ckt->CKTstate0+here->B3SOIPDdeltemp))) - + ckt->CKTvoltTol*1e4))) - if ((fabs(delvds) < (ckt->CKTreltol * MAX(fabs(vds), - fabs(*(ckt->CKTstate0+here->B3SOIPDvds))) + ckt->CKTvoltTol))) - if ((fabs(cdhat - here->B3SOIPDcd) < ckt->CKTreltol - * MAX(fabs(cdhat),fabs(here->B3SOIPDcd)) + ckt->CKTabstol)) - if ((fabs(cbhat - here->B3SOIPDcb) < ckt->CKTreltol - * MAX(fabs(cbhat),fabs(here->B3SOIPDcb)) + ckt->CKTabstol) ) - { /* bypass code */ - vbs = *(ckt->CKTstate0 + here->B3SOIPDvbs); - vbd = *(ckt->CKTstate0 + here->B3SOIPDvbd); - vgs = *(ckt->CKTstate0 + here->B3SOIPDvgs); - ves = *(ckt->CKTstate0 + here->B3SOIPDves); - vps = *(ckt->CKTstate0 + here->B3SOIPDvps); - vds = *(ckt->CKTstate0 + here->B3SOIPDvds); - delTemp = *(ckt->CKTstate0 + here->B3SOIPDdeltemp); - - /* calculate Vds for temperature conductance calculation - in bypass (used later when filling Temp node matrix) */ - Vds = here->B3SOIPDmode > 0 ? vds : -vds; - - vgd = vgs - vds; - vgb = vgs - vbs; - veb = ves - vbs; - - if ((ckt->CKTmode & (MODETRAN | MODEAC)) || - ((ckt->CKTmode & MODETRANOP) && (ckt->CKTmode & MODEUIC))) - { ByPass = 1; - goto line755; - } - else - { goto line850; - } - } - - -#endif /*NOBYPASS*/ - von = here->B3SOIPDvon; - - - if (*(ckt->CKTstate0 + here->B3SOIPDvds) >= 0.0) - T0 = *(ckt->CKTstate0 + here->B3SOIPDvbs); - else - T0 = *(ckt->CKTstate0 + here->B3SOIPDvbd); - - - if (vds >= 0.0) - { - vbs = B3SOIPDlimit(vbs, T0, 0.2, &Check); - vbd = vbs - vds; - vb = model->B3SOIPDtype * vbs + vs; - } else - { - vbd = B3SOIPDlimit(vbd, T0, 0.2, &Check); - vbs = vbd + vds; - vb = model->B3SOIPDtype * vbs + vd; - } - - delTemp =B3SOIPDlimit(delTemp, *(ckt->CKTstate0 + here->B3SOIPDdeltemp),5.0,&Check); - - } - -/* Calculate temperature dependent values for self-heating effect */ - Temp = delTemp + ckt->CKTtemp; - dTempRatio_dT = 1 / model->B3SOIPDtnom; - TempRatio = Temp * dTempRatio_dT; - - if (selfheat) { - Vtm = KboQ * Temp; - - T0 = 1108.0 + Temp; - T5 = Temp * Temp; - Eg = 1.16 - 7.02e-4 * T5 / T0; - T1 = ((7.02e-4 * T5) - T0 * (14.04e-4 * Temp)) / T0 / T0; - /* T1 = dEg / dT */ - - T2 = 1.9230584e-4; /* T2 = 1 / 300.15^(3/2) */ - T5 = sqrt(Temp); - T3 = 1.45e10 * Temp * T5 * T2; - T4 = exp(21.5565981 - Eg / (2.0 * Vtm)); - ni = T3 * T4; - dni_dT = 2.175e10 * T2 * T5 * T4 + T3 * T4 * - (-Vtm * T1 + Eg * KboQ) / (2.0 * Vtm * Vtm); - - T0 = log(1.0e20 * pParam->B3SOIPDnpeak / (ni * ni)); - vbi = Vtm * T0; - dvbi_dT = KboQ * T0 + Vtm * (-2.0 * dni_dT / ni); - - if (pParam->B3SOIPDnsub > 0) { - T0 = log(pParam->B3SOIPDnpeak / pParam->B3SOIPDnsub); - vfbb = -model->B3SOIPDtype * Vtm * T0; - dvfbb_dT = -model->B3SOIPDtype * KboQ * T0; - } - else { - T0 = log(-pParam->B3SOIPDnpeak * pParam->B3SOIPDnsub / ni / ni); - vfbb = -model->B3SOIPDtype * Vtm * T0; - dvfbb_dT = -model->B3SOIPDtype * - (KboQ * T0 - Vtm * 2.0 * dni_dT / ni); - } - -/* phi = 2.0 * Vtm * log(pParam->B3SOIPDnpeak / ni); */ - phi = here->B3SOIPDphi; - sqrtPhi = sqrt(phi); - Xdep0 = sqrt(2.0 * EPSSI / (Charge_q - * pParam->B3SOIPDnpeak * 1.0e6)) - * sqrtPhi; - /* Save the values below for phi calculation in B3SOIPDaccept() */ - here->B3SOIPDvtm = Vtm; - here->B3SOIPDni = ni; - - T3 = TempRatio - 1.0; - T8 = 1/ model->B3SOIPDtnom; - T4 = Eg300 / Vtm * T3; - dT4_dT = Eg300 / Vtm / Vtm * (Vtm * T8 - T3 * KboQ); - - T7 = model->B3SOIPDxbjt * T4 / pParam->B3SOIPDndiode; - dT7_dT = model->B3SOIPDxbjt * dT4_dT / pParam->B3SOIPDndiode; - DEXP(T7, T0, dT0_dT7); - dT0_dT = dT0_dT7 * dT7_dT; - - if (model->B3SOIPDxbjt == model->B3SOIPDxdif) { - T1 = T0; - dT1_dT = dT0_dT; - } - else { - T7 = model->B3SOIPDxdif * T4 / pParam->B3SOIPDndiode; - dT7_dT = model->B3SOIPDxdif * dT4_dT / pParam->B3SOIPDndiode; - DEXP(T7, T1, dT1_dT7); - dT1_dT = dT1_dT7 * dT7_dT; - } - - T7 = model->B3SOIPDxrec * T4 / pParam->B3SOIPDnrecf0; - dT7_dT = model->B3SOIPDxrec * dT4_dT / pParam->B3SOIPDnrecf0; - DEXP(T7, T2, dT2_dT7); - dT2_dT = dT2_dT7 * dT7_dT; - - /* high level injection */ - Ahli = pParam->B3SOIPDahli * T0; - dAhli_dT = pParam->B3SOIPDahli * dT0_dT; - - jbjt = pParam->B3SOIPDisbjt * T0; - jdif = pParam->B3SOIPDisdif * T1; - jrec = pParam->B3SOIPDisrec * T2; - djbjt_dT = pParam->B3SOIPDisbjt * dT0_dT; - djdif_dT = pParam->B3SOIPDisdif * dT1_dT; - djrec_dT = pParam->B3SOIPDisrec * dT2_dT; - - T7 = model->B3SOIPDxtun * T3; - dT7_dT = model->B3SOIPDxtun * T8; - DEXP(T7, T0, dT0_dT7); - dT0_dT = dT0_dT7 * dT7_dT; - jtun = pParam->B3SOIPDistun * T0; - djtun_dT = pParam->B3SOIPDistun * dT0_dT; - - u0temp = pParam->B3SOIPDu0 * pow(TempRatio, pParam->B3SOIPDute); - du0temp_dT = pParam->B3SOIPDu0 * pParam->B3SOIPDute * - pow(TempRatio, pParam->B3SOIPDute - 1.0) * T8; - - vsattemp = pParam->B3SOIPDvsat - pParam->B3SOIPDat * T3; - dvsattemp_dT = -pParam->B3SOIPDat * T8; - - rds0 = (pParam->B3SOIPDrdsw + pParam->B3SOIPDprt - * T3) / pParam->B3SOIPDrds0denom; - drds0_dT = pParam->B3SOIPDprt / pParam->B3SOIPDrds0denom * T8; - - ua = pParam->B3SOIPDuatemp + pParam->B3SOIPDua1 * T3; - ub = pParam->B3SOIPDubtemp + pParam->B3SOIPDub1 * T3; - uc = pParam->B3SOIPDuctemp + pParam->B3SOIPDuc1 * T3; - dua_dT = pParam->B3SOIPDua1 * T8; - dub_dT = pParam->B3SOIPDub1 * T8; - duc_dT = pParam->B3SOIPDuc1 * T8; - } - else { - vbi = pParam->B3SOIPDvbi; - vfbb = pParam->B3SOIPDvfbb; - phi = pParam->B3SOIPDphi; - sqrtPhi = pParam->B3SOIPDsqrtPhi; - Xdep0 = pParam->B3SOIPDXdep0; - jbjt = pParam->B3SOIPDjbjt; - jdif = pParam->B3SOIPDjdif; - jrec = pParam->B3SOIPDjrec; - jtun = pParam->B3SOIPDjtun; - - /* v2.2.2 bug fix */ - Ahli = pParam->B3SOIPDahli0; - - u0temp = pParam->B3SOIPDu0temp; - vsattemp = pParam->B3SOIPDvsattemp; - rds0 = pParam->B3SOIPDrds0; - ua = pParam->B3SOIPDua; - ub = pParam->B3SOIPDub; - uc = pParam->B3SOIPDuc; - dni_dT = dvbi_dT = dvfbb_dT = djbjt_dT = djdif_dT = 0.0; - djrec_dT = djtun_dT = du0temp_dT = dvsattemp_dT = 0.0; - drds0_dT = dua_dT = dub_dT = duc_dT = 0.0; - dAhli_dT = 0; - } - - /* TempRatio used for Vth and mobility */ - if (selfheat) { - TempRatioMinus1 = Temp / model->B3SOIPDtnom - 1.0; - } - else { - TempRatioMinus1 = ckt->CKTtemp / model->B3SOIPDtnom - 1.0; - } - - /* determine DC current and derivatives */ - vbd = vbs - vds; - vgd = vgs - vds; - vgb = vgs - vbs; - ved = ves - vds; - veb = ves - vbs; - vge = vgs - ves; - vpd = vps - vds; - - - if (vds >= 0.0) - { /* normal mode */ - here->B3SOIPDmode = 1; - Vds = vds; - Vgs = vgs; - Vbs = vbs; - Vbd = vbd; - Ves = ves; - Vps = vps; - - wdios = pParam->B3SOIPDwdios; - wdiod = pParam->B3SOIPDwdiod; - wdiosCV = pParam->B3SOIPDwdiosCV; - wdiodCV = pParam->B3SOIPDwdiodCV; - - } - else - { /* inverse mode */ - here->B3SOIPDmode = -1; - Vds = -vds; - Vgs = vgd; - Vbs = vbd; - Vbd = vbs; - Ves = ved; - Vps = vpd; - - wdios = pParam->B3SOIPDwdiod; - wdiod = pParam->B3SOIPDwdios; - wdiosCV = pParam->B3SOIPDwdiodCV; - wdiodCV = pParam->B3SOIPDwdiosCV; - - } - - Vesfb = Ves - vfbb; - Cbox = model->B3SOIPDcbox; - K1 = pParam->B3SOIPDk1eff; - - ChargeComputationNeeded = - ((ckt->CKTmode & (MODEAC | MODETRAN | MODEINITSMSIG)) || - ((ckt->CKTmode & MODETRANOP) && (ckt->CKTmode & MODEUIC))) - ? 1 : 0; - - if (here->B3SOIPDdebugMod <0) - ChargeComputationNeeded = 1; - - - - -/* Poly Gate Si Depletion Effect */ - T0 = pParam->B3SOIPDvfb + phi; - if ((pParam->B3SOIPDngate > 1.e18) && (pParam->B3SOIPDngate < 1.e25) - && (Vgs > T0)) - /* added to avoid the problem caused by ngate */ - { T1 = 1.0e6 * Charge_q * EPSSI * pParam->B3SOIPDngate - / (model->B3SOIPDcox * model->B3SOIPDcox); - T4 = sqrt(1.0 + 2.0 * (Vgs - T0) / T1); - T2 = T1 * (T4 - 1.0); - T3 = 0.5 * T2 * T2 / T1; /* T3 = Vpoly */ - T7 = 1.12 - T3 - 0.05; - T6 = sqrt(T7 * T7 + 0.224); - T5 = 1.12 - 0.5 * (T7 + T6); - Vgs_eff = Vgs - T5; - dVgs_eff_dVg = 1.0 - (0.5 - 0.5 / T4) * (1.0 + T7 / T6); - } - else - { Vgs_eff = Vgs; - dVgs_eff_dVg = 1.0; - } - - - Leff = pParam->B3SOIPDleff; - - if (selfheat) { - Vtm = KboQ * Temp; - dVtm_dT = KboQ; - } - else { - Vtm = model->B3SOIPDvtm; - dVtm_dT = 0.0; - } - - V0 = vbi - phi; - - Vbp = Vbs - Vps; - dVbp_dVb = 1; - - - /* T2 is Vbs limited above Vbsc=-5 */ - T0 = Vbs + 5 - 0.001; - T1 = sqrt(T0 * T0 - 0.004 * (-5)); - T2 = (-5) + 0.5 * (T0 + T1); - dT2_dVb = 0.5 * (1.0 + T0 / T1); - - /* Vbsh is T2 limited below 1.5 */ - T0 = 1.5; - T1 = T0 - T2 - 0.002; - T3 = sqrt(T1 * T1 + 0.008 * T0); - Vbsh = T0 - 0.5 * (T1 + T3); - dVbsh_dVb = 0.5 * (1.0 + T1 / T3) * dT2_dVb; - - /* Vbseff is Vbsh limited to 0.95*phi */ - T0 = 0.95 * phi; - T1 = T0 - Vbsh - 0.002; - T2 = sqrt(T1 * T1 + 0.008 * T0); - Vbseff = T0 - 0.5 * (T1 + T2); - dVbseff_dVb = 0.5 * (1.0 + T1 / T2) * dVbsh_dVb; - here->B3SOIPDvbseff = Vbs; - - /* Below all the variables refer to Vbseff */ - if (dVbseff_dVb < 1e-20) { - dVbseff_dVb = 1e-20; - dVbsh_dVb *= 1e20; - } - else - dVbsh_dVb /= dVbseff_dVb; - - Phis = phi - Vbseff; - dPhis_dVb = -1; - sqrtPhis = sqrt(Phis); - dsqrtPhis_dVb = -0.5 / sqrtPhis; - - Xdep = Xdep0 * sqrtPhis / sqrtPhi; - dXdep_dVb = (Xdep0 / sqrtPhi) * dsqrtPhis_dVb; - -/* Vth Calculation */ - T3 = sqrt(Xdep); - - T0 = pParam->B3SOIPDdvt2 * Vbseff; - if (T0 >= - 0.5) - { T1 = 1.0 + T0; - T2 = pParam->B3SOIPDdvt2 ; - } - else /* Added to avoid any discontinuity problems caused by dvt2 */ - { T4 = 1.0 / (3.0 + 8.0 * T0); - T1 = (1.0 + 3.0 * T0) * T4; - T2 = pParam->B3SOIPDdvt2 * T4 * T4 ; - } - lt1 = model->B3SOIPDfactor1 * T3 * T1; - dlt1_dVb =model->B3SOIPDfactor1 * (0.5 / T3 * T1 * dXdep_dVb + T3 * T2); - - T0 = pParam->B3SOIPDdvt2w * Vbseff; - if (T0 >= - 0.5) - { T1 = 1.0 + T0; - T2 = pParam->B3SOIPDdvt2w ; - } - else /* Added to avoid any discontinuity problems caused by dvt2w */ - { T4 = 1.0 / (3.0 + 8.0 * T0); - T1 = (1.0 + 3.0 * T0) * T4; - T2 = pParam->B3SOIPDdvt2w * T4 * T4 ; - } - ltw= model->B3SOIPDfactor1 * T3 * T1; - dltw_dVb=model->B3SOIPDfactor1*(0.5 / T3 * T1 * dXdep_dVb + T3 * T2); - - T0 = -0.5 * pParam->B3SOIPDdvt1 * Leff / lt1; - if (T0 > -EXPL_THRESHOLD) - { T1 = exp(T0); - Theta0 = T1 * (1.0 + 2.0 * T1); - dT1_dVb = -T0 / lt1 * T1 * dlt1_dVb; - dTheta0_dVb = (1.0 + 4.0 * T1) * dT1_dVb; - } - else - { T1 = MIN_EXPL; - Theta0 = T1 * (1.0 + 2.0 * T1); - dTheta0_dVb = 0.0; - } - - here->B3SOIPDthetavth = pParam->B3SOIPDdvt0 * Theta0; - Delt_vth = here->B3SOIPDthetavth * V0; - dDelt_vth_dVb = pParam->B3SOIPDdvt0 * dTheta0_dVb * V0; - if (selfheat) dDelt_vth_dT = here->B3SOIPDthetavth * dvbi_dT; - else dDelt_vth_dT = 0.0; - - T0 = -0.5 * pParam->B3SOIPDdvt1w * pParam->B3SOIPDweff * Leff / ltw; - if (T0 > -EXPL_THRESHOLD) - { T1 = exp(T0); - T2 = T1 * (1.0 + 2.0 * T1); - dT1_dVb = -T0 / ltw * T1 * dltw_dVb; - dT2_dVb = (1.0 + 4.0 * T1) * dT1_dVb; - } - else - { T1 = MIN_EXPL; - T2 = T1 * (1.0 + 2.0 * T1); - dT2_dVb = 0.0; - } - - T0 = pParam->B3SOIPDdvt0w * T2; - DeltVthw = T0 * V0; - dDeltVthw_dVb = pParam->B3SOIPDdvt0w * dT2_dVb * V0; - if (selfheat) dDeltVthw_dT = T0 * dvbi_dT; - else dDeltVthw_dT = 0.0; - - T0 = sqrt(1.0 + pParam->B3SOIPDnlx / Leff); - T1 = (pParam->B3SOIPDkt1 + pParam->B3SOIPDkt1l / Leff - + pParam->B3SOIPDkt2 * Vbseff); - DeltVthtemp = pParam->B3SOIPDk1eff * (T0 - 1.0) * sqrtPhi + T1 * TempRatioMinus1; - if (selfheat) - dDeltVthtemp_dT = T1 / model->B3SOIPDtnom; - else - dDeltVthtemp_dT = 0.0; - - tmp2 = model->B3SOIPDtox * phi - / (pParam->B3SOIPDweff + pParam->B3SOIPDw0); - - T3 = pParam->B3SOIPDeta0 + pParam->B3SOIPDetab * Vbseff; - if (T3 < 1.0e-4) /* avoid discontinuity problems caused by etab */ - { T9 = 1.0 / (3.0 - 2.0e4 * T3); - T3 = (2.0e-4 - T3) * T9; - T4 = T9 * T9 * pParam->B3SOIPDetab; - dT3_dVb = T4 ; - } - else - { - dT3_dVb = pParam->B3SOIPDetab ; - } - DIBL_Sft = T3 * pParam->B3SOIPDtheta0vb0 * Vds; - dDIBL_Sft_dVd = pParam->B3SOIPDtheta0vb0 * T3; - dDIBL_Sft_dVb = pParam->B3SOIPDtheta0vb0 * Vds * dT3_dVb; - - T9 = 2.2361 / sqrtPhi; - sqrtPhisExt = sqrtPhis - T9 * (Vbsh - Vbseff); - dsqrtPhisExt_dVb = dsqrtPhis_dVb - T9 * (dVbsh_dVb - 1); - - Vth = model->B3SOIPDtype * pParam->B3SOIPDvth0 + pParam->B3SOIPDk1eff - * (sqrtPhisExt - sqrtPhi) - pParam->B3SOIPDk2 - * Vbseff- Delt_vth - DeltVthw +(pParam->B3SOIPDk3 + pParam->B3SOIPDk3b - * Vbseff) * tmp2 + DeltVthtemp - DIBL_Sft; - here->B3SOIPDvon = Vth; - - T6 = pParam->B3SOIPDk3b * tmp2 - pParam->B3SOIPDk2 - + pParam->B3SOIPDkt2 * TempRatioMinus1; - dVth_dVb = pParam->B3SOIPDk1eff * dsqrtPhisExt_dVb - - dDelt_vth_dVb - dDeltVthw_dVb - + T6 - dDIBL_Sft_dVb; - /* this is actually dVth_dVbseff */ - - dVth_dVd = -dDIBL_Sft_dVd; - if (selfheat) - dVth_dT = dDeltVthtemp_dT - dDelt_vth_dT - dDeltVthw_dT; - else dVth_dT = 0.0; - - /* dVthzb_dT calculation */ - if ((model->B3SOIPDcapMod == 3) && (selfheat == 1)) { - T3zb = sqrt(Xdep0); - ltwzb = lt1zb = model->B3SOIPDfactor1 * T3zb; - - T0 = -0.5 * pParam->B3SOIPDdvt1 * Leff / lt1zb; - if (T0 > -EXPL_THRESHOLD) - { T1 = exp(T0); - Theta0zb = T1 * (1.0 + 2.0 * T1); - } - else - { T1 = MIN_EXPL; - Theta0zb = T1 * (1.0 + 2.0 * T1); - } - Delt_vthzb = pParam->B3SOIPDdvt0 * Theta0zb * V0; - dDelt_vthzb_dT = pParam->B3SOIPDdvt0 * Theta0zb * dvbi_dT; - - T0 = -0.5 * pParam->B3SOIPDdvt1w * pParam->B3SOIPDweff * Leff / ltwzb; - if (T0 > -EXPL_THRESHOLD) - { T1 = exp(T0); - T2 = T1 * (1.0 + 2.0 * T1); - } - else - { T1 = MIN_EXPL; - T2 = T1 * (1.0 + 2.0 * T1); - } - T0 = pParam->B3SOIPDdvt0w * T2; - DeltVthwzb = T0 * V0; - dDeltVthwzb_dT = T0 * dvbi_dT; - - T0 = sqrt(1.0 + pParam->B3SOIPDnlx / Leff); - T1 = (pParam->B3SOIPDkt1 + pParam->B3SOIPDkt1l / Leff); - DeltVthtempzb = pParam->B3SOIPDk1eff * (T0 - 1.0) * sqrtPhi - + T1 * TempRatioMinus1; - dDeltVthtempzb_dT = T1 / model->B3SOIPDtnom; - - Vthzb = model->B3SOIPDtype * pParam->B3SOIPDvth0 - - Delt_vthzb - DeltVthwzb + pParam->B3SOIPDk3 * tmp2 - + DeltVthtempzb; - dVthzb_dT = dDeltVthtempzb_dT - dDelt_vthzb_dT - dDeltVthwzb_dT; - } - -/* Calculate n */ - T2 = pParam->B3SOIPDnfactor * EPSSI / Xdep; - dT2_dVb = - T2 / Xdep * dXdep_dVb; - - T3 = pParam->B3SOIPDcdsc + pParam->B3SOIPDcdscb * Vbseff - + pParam->B3SOIPDcdscd * Vds; - dT3_dVb = pParam->B3SOIPDcdscb; - dT3_dVd = pParam->B3SOIPDcdscd; - - T4 = (T2 + T3 * Theta0 + pParam->B3SOIPDcit) / model->B3SOIPDcox; - dT4_dVb = (dT2_dVb + Theta0 * dT3_dVb + dTheta0_dVb * T3) - / model->B3SOIPDcox; - dT4_dVd = Theta0 * dT3_dVd / model->B3SOIPDcox; - - if (T4 >= -0.5) - { n = 1.0 + T4; - dn_dVb = dT4_dVb; - dn_dVd = dT4_dVd; - } - else - /* avoid discontinuity problems caused by T4 */ - { T0 = 1.0 / (3.0 + 8.0 * T4); - n = (1.0 + 3.0 * T4) * T0; - T0 *= T0; - dn_dVb = T0 * dT4_dVb; - dn_dVd = T0 * dT4_dVd; - } - -/* Effective Vgst (Vgsteff) Calculation */ - - Vgst = Vgs_eff - Vth; - dVgst_dVg = dVgs_eff_dVg; - dVgst_dVd = -dVth_dVd; - dVgst_dVb = -dVth_dVb; - - T10 = 2.0 * n * Vtm; - VgstNVt = Vgst / T10; - ExpArg = (2.0 * pParam->B3SOIPDvoff - Vgst) / T10; - - /* MCJ: Very small Vgst */ - if (VgstNVt > EXPL_THRESHOLD) - { Vgsteff = Vgst; - /* T0 is dVgsteff_dVbseff */ - T0 = -dVth_dVb; - dVgsteff_dVg = dVgs_eff_dVg; - dVgsteff_dVd = -dVth_dVd; - dVgsteff_dVb = T0 * dVbseff_dVb; - if (selfheat) - dVgsteff_dT = -dVth_dT; - else - dVgsteff_dT = 0.0; - } - else if (ExpArg > EXPL_THRESHOLD) - { T0 = (Vgst - pParam->B3SOIPDvoff) / (n * Vtm); - ExpVgst = exp(T0); - Vgsteff = Vtm * pParam->B3SOIPDcdep0 / model->B3SOIPDcox * ExpVgst; - T3 = Vgsteff / (n * Vtm) ; - /* T1 is dVgsteff_dVbseff */ - T1 = -T3 * (dVth_dVb + T0 * Vtm * dn_dVb); - dVgsteff_dVg = T3 * dVgs_eff_dVg; - dVgsteff_dVd = -T3 * (dVth_dVd + T0 * Vtm * dn_dVd); - dVgsteff_dVb = T1 * dVbseff_dVb; - if (selfheat) - dVgsteff_dT = -T3 * (dVth_dT + T0 * dVtm_dT * n) - + Vgsteff / Temp; - else - dVgsteff_dT = 0.0; - } - else - { ExpVgst = exp(VgstNVt); - T1 = T10 * log(1.0 + ExpVgst); - dT1_dVg = ExpVgst / (1.0 + ExpVgst); - dT1_dVb = -dT1_dVg * (dVth_dVb + Vgst / n * dn_dVb) - + T1 / n * dn_dVb; - dT1_dVd = -dT1_dVg * (dVth_dVd + Vgst / n * dn_dVd) - + T1 / n * dn_dVd; - T3 = (1.0 / Temp); - if (selfheat) - dT1_dT = -dT1_dVg * (dVth_dT + Vgst * T3) + T1 * T3; - else - dT1_dT = 0.0; - - dT2_dVg = -model->B3SOIPDcox / (Vtm * pParam->B3SOIPDcdep0) - * exp(ExpArg); - T2 = 1.0 - T10 * dT2_dVg; - dT2_dVd = -dT2_dVg * (dVth_dVd - 2.0 * Vtm * ExpArg * dn_dVd) - + (T2 - 1.0) / n * dn_dVd; - dT2_dVb = -dT2_dVg * (dVth_dVb - 2.0 * Vtm * ExpArg * dn_dVb) - + (T2 - 1.0) / n * dn_dVb; - if (selfheat) - dT2_dT = -dT2_dVg * (dVth_dT - ExpArg * T10 * T3); - else - dT2_dT = 0.0; - - Vgsteff = T1 / T2; - T3 = T2 * T2; - /* T4 is dVgsteff_dVbseff */ - T4 = (T2 * dT1_dVb - T1 * dT2_dVb) / T3; - dVgsteff_dVb = T4 * dVbseff_dVb; - dVgsteff_dVg = (T2 * dT1_dVg - T1 * dT2_dVg) / T3 * dVgs_eff_dVg; - dVgsteff_dVd = (T2 * dT1_dVd - T1 * dT2_dVd) / T3; - if (selfheat) - dVgsteff_dT = (T2 * dT1_dT - T1 * dT2_dT) / T3; - else - dVgsteff_dT = 0.0; - } - Vgst2Vtm = Vgsteff + 2.0 * Vtm; - if (selfheat) dVgst2Vtm_dT = 2.0 * dVtm_dT; - else dVgst2Vtm_dT = 0.0; - here->B3SOIPDVgsteff = Vgsteff; /* v2.2.3 bug fix */ - -/* Calculate Effective Channel Geometry */ - T9 = sqrtPhis - sqrtPhi; - Weff = pParam->B3SOIPDweff - (2.0 - here->B3SOIPDnbc) * (pParam->B3SOIPDdwg * Vgsteff - + pParam->B3SOIPDdwb * T9); - dWeff_dVg = -(2.0 - here->B3SOIPDnbc) * pParam->B3SOIPDdwg; - dWeff_dVb = -(2.0 - here->B3SOIPDnbc) * pParam->B3SOIPDdwb * dsqrtPhis_dVb; - - if (Weff < 2.0e-8) /* to avoid the discontinuity problem due to Weff*/ - { T0 = 1.0 / (6.0e-8 - 2.0 * Weff); - Weff = 2.0e-8 * (4.0e-8 - Weff) * T0; - T0 *= T0 * 4.0e-16; - dWeff_dVg *= T0; - dWeff_dVb *= T0; - } - - T0 = pParam->B3SOIPDprwg * Vgsteff + pParam->B3SOIPDprwb * T9; - if (T0 >= -0.9) - { Rds = rds0 * (1.0 + T0); - dRds_dVg = rds0 * pParam->B3SOIPDprwg; - dRds_dVb = rds0 * pParam->B3SOIPDprwb * dsqrtPhis_dVb; - - if (selfheat && (Rds!=0.0)) dRds_dT = (1.0 + T0) * drds0_dT; - else dRds_dT = 0.0; - - } - else - /* to avoid the discontinuity problem due to prwg and prwb*/ - { T1 = 1.0 / (17.0 + 20.0 * T0); - Rds = rds0 * (0.8 + T0) * T1; - T1 *= T1; - dRds_dVg = rds0 * pParam->B3SOIPDprwg * T1; - dRds_dVb = rds0 * pParam->B3SOIPDprwb * dsqrtPhis_dVb - * T1; - - if (selfheat && (Rds!=0.0)) dRds_dT = (0.8 + T0) * T1 * drds0_dT; - else dRds_dT = 0.0; - - } - here->B3SOIPDrds = Rds; /* v2.2.3 bug fix */ - -/* Calculate Abulk */ - if (pParam->B3SOIPDa0 == 0.0) { - - Abulk0 = Abulk = 1.0; - - dAbulk0_dVb = dAbulk_dVg = dAbulk_dVb = 0.0; - } - else { - T10 = pParam->B3SOIPDketa * Vbsh; - if (T10 >= -0.9) { - T11 = 1.0 / (1.0 + T10); - dT11_dVb = -pParam->B3SOIPDketa * T11 * T11 * dVbsh_dVb; - } - else { /* added to avoid the problems caused by Keta */ - T12 = 1.0 / (0.8 + T10); - T11 = (17.0 + 20.0 * T10) * T12; - dT11_dVb = -pParam->B3SOIPDketa * T12 * T12 * dVbsh_dVb; - } - - T10 = pParam->B3SOIPDphi + pParam->B3SOIPDketas; - T13 = (Vbsh * T11) / T10; - dT13_dVb = (Vbsh * dT11_dVb + T11 * dVbsh_dVb) / T10; - - /* limit 1/sqrt(1-T13) to 6, starting at T13=0.96 */ - if (T13 < 0.96) { - T14 = 1 / sqrt(1-T13); - T10 = 0.5 * T14 / (1-T13); - dT14_dVb = T10 * dT13_dVb; - } - else { - T11 = 1.0 / (1.0 - 1.043406*T13); - T14 = (6.00167 - 6.26044 * T13) * T11; - T10 = 0.001742 * T11 * T11; - dT14_dVb = T10 * dT13_dVb; - } - - T10 = 0.5 * pParam->B3SOIPDk1eff - / sqrt(pParam->B3SOIPDphi + pParam->B3SOIPDketas); - T1 = T10 * T14; - dT1_dVb = T10 * dT14_dVb; - - T9 = sqrt(model->B3SOIPDxj * Xdep); - tmp1 = Leff + 2.0 * T9; - T5 = Leff / tmp1; - tmp2 = pParam->B3SOIPDa0 * T5; - tmp3 = pParam->B3SOIPDweff + pParam->B3SOIPDb1; - tmp4 = pParam->B3SOIPDb0 / tmp3; - T2 = tmp2 + tmp4; - dT2_dVb = -T9 * tmp2 / tmp1 / Xdep * dXdep_dVb; - T6 = T5 * T5; - T7 = T5 * T6; - - Abulk0 = 1 + T1 * T2; - dAbulk0_dVb = T1 * dT2_dVb + T2 * dT1_dVb; - - T8 = pParam->B3SOIPDags * pParam->B3SOIPDa0 * T7; - dAbulk_dVg = -T1 * T8; - Abulk = Abulk0 + dAbulk_dVg * Vgsteff; - - dAbulk_dVb = dAbulk0_dVb - - T8 * Vgsteff * (dT1_dVb + 3.0 * T1 * dT2_dVb / tmp2); - } - - if (Abulk0 < 0.01) - { - T9 = 1.0 / (3.0 - 200.0 * Abulk0); - Abulk0 = (0.02 - Abulk0) * T9; - dAbulk0_dVb *= T9 * T9; - } - - if (Abulk < 0.01) - { - T9 = 1.0 / (3.0 - 200.0 * Abulk); - Abulk = (0.02 - Abulk) * T9; - dAbulk_dVb *= T9 * T9; - } - -/* Mobility calculation */ - if (model->B3SOIPDmobMod == 1) - { T0 = Vgsteff + Vth + Vth; - T2 = ua + uc * Vbseff; - T3 = T0 / model->B3SOIPDtox; - T5 = T3 * (T2 + ub * T3); - dDenomi_dVg = (T2 + 2.0 * ub * T3) / model->B3SOIPDtox; - dDenomi_dVd = dDenomi_dVg * 2 * dVth_dVd; - dDenomi_dVb = dDenomi_dVg * 2 * dVth_dVb + uc * T3 ; - if (selfheat) - dDenomi_dT = dDenomi_dVg * 2 * dVth_dT - + (dua_dT + Vbseff * duc_dT - + dub_dT * T3 ) * T3; - else - dDenomi_dT = 0.0; - } - else if (model->B3SOIPDmobMod == 2) - { T5 = Vgsteff / model->B3SOIPDtox * (ua - + uc * Vbseff + ub * Vgsteff - / model->B3SOIPDtox); - dDenomi_dVg = (ua + uc * Vbseff - + 2.0 * ub * Vgsteff / model->B3SOIPDtox) - / model->B3SOIPDtox; - dDenomi_dVd = 0.0; - dDenomi_dVb = Vgsteff * uc / model->B3SOIPDtox ; - if (selfheat) - dDenomi_dT = Vgsteff / model->B3SOIPDtox - * (dua_dT + Vbseff * duc_dT + dub_dT - * Vgsteff / model->B3SOIPDtox); - else - dDenomi_dT = 0.0; - } - else /* mobMod == 3 */ - { T0 = Vgsteff + Vth + Vth; - T2 = 1.0 + uc * Vbseff; - T3 = T0 / model->B3SOIPDtox; - T4 = T3 * (ua + ub * T3); - T5 = T4 * T2; - dDenomi_dVg = (ua + 2.0 * ub * T3) * T2 - / model->B3SOIPDtox; - dDenomi_dVd = dDenomi_dVg * 2.0 * dVth_dVd; - dDenomi_dVb = dDenomi_dVg * 2.0 * dVth_dVb - + uc * T4 ; - if (selfheat) - dDenomi_dT = dDenomi_dVg * 2.0 * dVth_dT - + (dua_dT + dub_dT * T3) * T3 * T2 - + T4 * Vbseff * duc_dT; - else - dDenomi_dT = 0.0; - } - - if (T5 >= -0.8) - { Denomi = 1.0 + T5; - } - else /* Added to avoid the discontinuity problem caused by ua and ub*/ - { T9 = 1.0 / (7.0 + 10.0 * T5); - Denomi = (0.6 + T5) * T9; - T9 *= T9; - dDenomi_dVg *= T9; - dDenomi_dVd *= T9; - dDenomi_dVb *= T9; - if (selfheat) dDenomi_dT *= T9; - else dDenomi_dT = 0.0; - } - - here->B3SOIPDueff = ueff = u0temp / Denomi; - T9 = -ueff / Denomi; - dueff_dVg = T9 * dDenomi_dVg; - dueff_dVd = T9 * dDenomi_dVd; - dueff_dVb = T9 * dDenomi_dVb; - if (selfheat) dueff_dT = T9 * dDenomi_dT + du0temp_dT / Denomi; - else dueff_dT = 0.0; - -/* Saturation Drain Voltage Vdsat */ - WVCox = Weff * vsattemp * model->B3SOIPDcox; - WVCoxRds = WVCox * Rds; - -/* dWVCoxRds_dT = WVCox * dRds_dT - + Weff * model->B3SOIPDcox * Rds * dvsattemp_dT; */ - - Esat = 2.0 * vsattemp / ueff; - EsatL = Esat * Leff; - T0 = -EsatL /ueff; - dEsatL_dVg = T0 * dueff_dVg; - dEsatL_dVd = T0 * dueff_dVd; - dEsatL_dVb = T0 * dueff_dVb; - if (selfheat) - dEsatL_dT = T0 * dueff_dT + EsatL / vsattemp * dvsattemp_dT; - else - dEsatL_dT = 0.0; - - /* Sqrt() */ - a1 = pParam->B3SOIPDa1; - if (a1 == 0.0) - { Lambda = pParam->B3SOIPDa2; - dLambda_dVg = 0.0; - } - else if (a1 > 0.0) -/* Added to avoid the discontinuity problem caused by a1 and a2 (Lambda) */ - { T0 = 1.0 - pParam->B3SOIPDa2; - T1 = T0 - pParam->B3SOIPDa1 * Vgsteff - 0.0001; - T2 = sqrt(T1 * T1 + 0.0004 * T0); - Lambda = pParam->B3SOIPDa2 + T0 - 0.5 * (T1 + T2); - dLambda_dVg = 0.5 * pParam->B3SOIPDa1 * (1.0 + T1 / T2); - } - else - { T1 = pParam->B3SOIPDa2 + pParam->B3SOIPDa1 * Vgsteff - 0.0001; - T2 = sqrt(T1 * T1 + 0.0004 * pParam->B3SOIPDa2); - Lambda = 0.5 * (T1 + T2); - dLambda_dVg = 0.5 * pParam->B3SOIPDa1 * (1.0 + T1 / T2); - } - - here->B3SOIPDAbovVgst2Vtm = Abulk /Vgst2Vtm; /* v2.2.3 bug fix */ - - if (Rds > 0) - { tmp2 = dRds_dVg / Rds + dWeff_dVg / Weff; - tmp3 = dRds_dVb / Rds + dWeff_dVb / Weff; - } - else - { tmp2 = dWeff_dVg / Weff; - tmp3 = dWeff_dVb / Weff; - } - if ((Rds == 0.0) && (Lambda == 1.0)) - { T0 = 1.0 / (Abulk * EsatL + Vgst2Vtm); - tmp1 = 0.0; - T1 = T0 * T0; - T2 = Vgst2Vtm * T0; - T3 = EsatL * Vgst2Vtm; - Vdsat = T3 * T0; - - dT0_dVg = -(Abulk * dEsatL_dVg + EsatL * dAbulk_dVg + 1.0) * T1; - dT0_dVd = -(Abulk * dEsatL_dVd) * T1; - dT0_dVb = -(Abulk * dEsatL_dVb + EsatL * dAbulk_dVb) * T1; - if (selfheat) - dT0_dT = -(Abulk * dEsatL_dT + dVgst2Vtm_dT) * T1; - else dT0_dT = 0.0; - - dVdsat_dVg = T3 * dT0_dVg + T2 * dEsatL_dVg + EsatL * T0; - dVdsat_dVd = T3 * dT0_dVd + T2 * dEsatL_dVd; - dVdsat_dVb = T3 * dT0_dVb + T2 * dEsatL_dVb; - if (selfheat) - dVdsat_dT = T3 * dT0_dT + T2 * dEsatL_dT - + EsatL * T0 * dVgst2Vtm_dT; - else dVdsat_dT = 0.0; - } - else - { tmp1 = dLambda_dVg / (Lambda * Lambda); - T9 = Abulk * WVCoxRds; - T8 = Abulk * T9; - T7 = Vgst2Vtm * T9; - T6 = Vgst2Vtm * WVCoxRds; - T0 = 2.0 * Abulk * (T9 - 1.0 + 1.0 / Lambda); - dT0_dVg = 2.0 * (T8 * tmp2 - Abulk * tmp1 - + (2.0 * T9 + 1.0 / Lambda - 1.0) * dAbulk_dVg); -/* dT0_dVb = 2.0 * (T8 * tmp3 this is equivalent to one below, but simpler - + (2.0 * T9 + 1.0 / Lambda - 1.0) * dAbulk_dVg); */ - dT0_dVb = 2.0 * (T8 * (2.0 / Abulk * dAbulk_dVb + tmp3) - + (1.0 / Lambda - 1.0) * dAbulk_dVb); - dT0_dVd = 0.0; - - if (selfheat) - { - - if (Rds!=0.0) - tmp4 = dRds_dT / Rds + dvsattemp_dT / vsattemp; - else - tmp4 = dvsattemp_dT / vsattemp; - - dT0_dT = 2.0 * T8 * tmp4; - } else tmp4 = dT0_dT = 0.0; - - T1 = Vgst2Vtm * (2.0 / Lambda - 1.0) + Abulk * EsatL + 3.0 * T7; - - dT1_dVg = (2.0 / Lambda - 1.0) - 2.0 * Vgst2Vtm * tmp1 - + Abulk * dEsatL_dVg + EsatL * dAbulk_dVg + 3.0 * (T9 - + T7 * tmp2 + T6 * dAbulk_dVg); - dT1_dVb = Abulk * dEsatL_dVb + EsatL * dAbulk_dVb - + 3.0 * (T6 * dAbulk_dVb + T7 * tmp3); - dT1_dVd = Abulk * dEsatL_dVd; - - - if (selfheat) - { - tmp4 += dVgst2Vtm_dT / Vgst2Vtm; - dT1_dT = (2.0 / Lambda - 1.0) * dVgst2Vtm_dT - + Abulk * dEsatL_dT + 3.0 * T7 * tmp4; - } else dT1_dT = 0.0; - - T2 = Vgst2Vtm * (EsatL + 2.0 * T6); - dT2_dVg = EsatL + Vgst2Vtm * dEsatL_dVg - + T6 * (4.0 + 2.0 * Vgst2Vtm * tmp2); - dT2_dVb = Vgst2Vtm * (dEsatL_dVb + 2.0 * T6 * tmp3); - dT2_dVd = Vgst2Vtm * dEsatL_dVd; - if (selfheat) - dT2_dT = Vgst2Vtm * dEsatL_dT + EsatL * dVgst2Vtm_dT - + 2.0 * T6 * (dVgst2Vtm_dT + Vgst2Vtm * tmp4); - else - dT2_dT = 0.0; - - T3 = sqrt(T1 * T1 - 2.0 * T0 * T2); - Vdsat = (T1 - T3) / T0; - - dVdsat_dVg = (dT1_dVg - (T1 * dT1_dVg - dT0_dVg * T2 - - T0 * dT2_dVg) / T3 - Vdsat * dT0_dVg) / T0; - dVdsat_dVb = (dT1_dVb - (T1 * dT1_dVb - dT0_dVb * T2 - - T0 * dT2_dVb) / T3 - Vdsat * dT0_dVb) / T0; - dVdsat_dVd = (dT1_dVd - (T1 * dT1_dVd - T0 * dT2_dVd) / T3) / T0; - if (selfheat) - dVdsat_dT = (dT1_dT - (T1 * dT1_dT - dT0_dT * T2 - - T0 * dT2_dT) / T3 - Vdsat * dT0_dT) / T0; - else dVdsat_dT = 0.0; - } - here->B3SOIPDvdsat = Vdsat; - - -/* Effective Vds (Vdseff) Calculation */ - T1 = Vdsat - Vds - pParam->B3SOIPDdelta; - dT1_dVg = dVdsat_dVg; - dT1_dVd = dVdsat_dVd - 1.0; - dT1_dVb = dVdsat_dVb; - dT1_dT = dVdsat_dT; - - T2 = sqrt(T1 * T1 + 4.0 * pParam->B3SOIPDdelta * Vdsat); - T0 = T1 / T2; - T3 = 2.0 * pParam->B3SOIPDdelta / T2; - dT2_dVg = T0 * dT1_dVg + T3 * dVdsat_dVg; - dT2_dVd = T0 * dT1_dVd + T3 * dVdsat_dVd; - dT2_dVb = T0 * dT1_dVb + T3 * dVdsat_dVb; - if (selfheat) - dT2_dT = T0 * dT1_dT + T3 * dVdsat_dT; - else dT2_dT = 0.0; - - Vdseff = Vdsat - 0.5 * (T1 + T2); - dVdseff_dVg = dVdsat_dVg - 0.5 * (dT1_dVg + dT2_dVg); - dVdseff_dVd = dVdsat_dVd - 0.5 * (dT1_dVd + dT2_dVd); - dVdseff_dVb = dVdsat_dVb - 0.5 * (dT1_dVb + dT2_dVb); - if (selfheat) - dVdseff_dT = dVdsat_dT - 0.5 * (dT1_dT + dT2_dT); - else dVdseff_dT = 0.0; - - if (Vdseff > Vds) - Vdseff = Vds; /* This code is added to fixed the problem - caused by computer precision when - Vds is very close to Vdseff. */ - diffVds = Vds - Vdseff; - here->B3SOIPDVdseff = Vdseff; /* v2.2.3 bug fix */ - -/* Calculate VAsat */ - tmp4 = 1.0 - 0.5 * Abulk * Vdsat / Vgst2Vtm; - T9 = WVCoxRds * Vgsteff; - T8 = T9 / Vgst2Vtm; - T0 = EsatL + Vdsat + 2.0 * T9 * tmp4; - - T7 = 2.0 * WVCoxRds * tmp4; - dT0_dVg = dEsatL_dVg + dVdsat_dVg + T7 * (1.0 + tmp2 * Vgsteff) - - T8 * (Abulk * dVdsat_dVg - Abulk * Vdsat / Vgst2Vtm - + Vdsat * dAbulk_dVg); - - dT0_dVb = dEsatL_dVb + dVdsat_dVb + T7 * tmp3 * Vgsteff - - T8 * (dAbulk_dVb * Vdsat + Abulk * dVdsat_dVb); - dT0_dVd = dEsatL_dVd + dVdsat_dVd - T8 * Abulk * dVdsat_dVd; - - if (selfheat) - { - - if (Rds!=0.0) - tmp4 = dRds_dT / Rds + dvsattemp_dT / vsattemp; - else tmp4 = dvsattemp_dT / vsattemp; - - dT0_dT = dEsatL_dT + dVdsat_dT + T7 * tmp4 * Vgsteff - - T8 * (Abulk * dVdsat_dT - Abulk * Vdsat * dVgst2Vtm_dT - / Vgst2Vtm); - } else - dT0_dT = 0.0; - - T9 = WVCoxRds * Abulk; - T1 = 2.0 / Lambda - 1.0 + T9; - dT1_dVg = -2.0 * tmp1 + WVCoxRds * (Abulk * tmp2 + dAbulk_dVg); - dT1_dVb = dAbulk_dVb * WVCoxRds + T9 * tmp3; - if (selfheat) - dT1_dT = T9 * tmp4; - else - dT1_dT = 0.0; - - Vasat = T0 / T1; - dVasat_dVg = (dT0_dVg - Vasat * dT1_dVg) / T1; - dVasat_dVb = (dT0_dVb - Vasat * dT1_dVb) / T1; - dVasat_dVd = dT0_dVd / T1; - if (selfheat) dVasat_dT = (dT0_dT - Vasat * dT1_dT) / T1; - else dVasat_dT = 0.0; - -/* Calculate VACLM */ - if ((pParam->B3SOIPDpclm > 0.0) && (diffVds > 1.0e-10)) - { T0 = 1.0 / (pParam->B3SOIPDpclm * Abulk * pParam->B3SOIPDlitl); - dT0_dVb = -T0 / Abulk * dAbulk_dVb; - dT0_dVg = -T0 / Abulk * dAbulk_dVg; - - T2 = Vgsteff / EsatL; - T1 = Leff * (Abulk + T2); - dT1_dVg = Leff * ((1.0 - T2 * dEsatL_dVg) / EsatL + dAbulk_dVg); - dT1_dVb = Leff * (dAbulk_dVb - T2 * dEsatL_dVb / EsatL); - dT1_dVd = -T2 * dEsatL_dVd / Esat; - if (selfheat) dT1_dT = -T2 * dEsatL_dT / Esat; - else dT1_dT = 0.0; - - T9 = T0 * T1; - VACLM = T9 * diffVds; - dVACLM_dVg = T0 * dT1_dVg * diffVds - T9 * dVdseff_dVg - + T1 * diffVds * dT0_dVg; - dVACLM_dVb = (dT0_dVb * T1 + T0 * dT1_dVb) * diffVds - - T9 * dVdseff_dVb; - dVACLM_dVd = T0 * dT1_dVd * diffVds + T9 * (1.0 - dVdseff_dVd); - if (selfheat) - dVACLM_dT = T0 * dT1_dT * diffVds - T9 * dVdseff_dT; - else dVACLM_dT = 0.0; - - } - else - { VACLM = MAX_EXPL; - dVACLM_dVd = dVACLM_dVg = dVACLM_dVb = dVACLM_dT = 0.0; - } - - -/* Calculate VADIBL */ - if (pParam->B3SOIPDthetaRout > 0.0) - { T8 = Abulk * Vdsat; - T0 = Vgst2Vtm * T8; - T1 = Vgst2Vtm + T8; - dT0_dVg = Vgst2Vtm * Abulk * dVdsat_dVg + T8 - + Vgst2Vtm * Vdsat * dAbulk_dVg; - dT1_dVg = 1.0 + Abulk * dVdsat_dVg + Vdsat * dAbulk_dVg; - dT1_dVb = dAbulk_dVb * Vdsat + Abulk * dVdsat_dVb; - dT0_dVb = Vgst2Vtm * dT1_dVb; - dT1_dVd = Abulk * dVdsat_dVd; - dT0_dVd = Vgst2Vtm * dT1_dVd; - if (selfheat) - { - dT0_dT = dVgst2Vtm_dT * T8 + Abulk * Vgst2Vtm * dVdsat_dT; - dT1_dT = dVgst2Vtm_dT + Abulk * dVdsat_dT; - } else - dT0_dT = dT1_dT = 0.0; - - T9 = T1 * T1; - T2 = pParam->B3SOIPDthetaRout; - VADIBL = (Vgst2Vtm - T0 / T1) / T2; - dVADIBL_dVg = (1.0 - dT0_dVg / T1 + T0 * dT1_dVg / T9) / T2; - dVADIBL_dVb = (-dT0_dVb / T1 + T0 * dT1_dVb / T9) / T2; - dVADIBL_dVd = (-dT0_dVd / T1 + T0 * dT1_dVd / T9) / T2; - if (selfheat) - dVADIBL_dT = (dVgst2Vtm_dT - dT0_dT/T1 + T0*dT1_dT/T9) / T2; - else dVADIBL_dT = 0.0; - - T7 = pParam->B3SOIPDpdiblb * Vbseff; - if (T7 >= -0.9) - { T3 = 1.0 / (1.0 + T7); - VADIBL *= T3; - dVADIBL_dVg *= T3; - dVADIBL_dVb = (dVADIBL_dVb - VADIBL * pParam->B3SOIPDpdiblb) - * T3; - dVADIBL_dVd *= T3; - if (selfheat) dVADIBL_dT *= T3; - else dVADIBL_dT = 0.0; - } - else -/* Added to avoid the discontinuity problem caused by pdiblcb */ - { T4 = 1.0 / (0.8 + T7); - T3 = (17.0 + 20.0 * T7) * T4; - dVADIBL_dVg *= T3; - dVADIBL_dVb = dVADIBL_dVb * T3 - - VADIBL * pParam->B3SOIPDpdiblb * T4 * T4; - dVADIBL_dVd *= T3; - if (selfheat) dVADIBL_dT *= T3; - else dVADIBL_dT = 0.0; - VADIBL *= T3; - } - } - else - { VADIBL = MAX_EXPL; - dVADIBL_dVd = dVADIBL_dVg = dVADIBL_dVb = dVADIBL_dT = 0.0; - } - -/* Calculate VA */ - - T8 = pParam->B3SOIPDpvag / EsatL; - T9 = T8 * Vgsteff; - if (T9 > -0.9) - { T0 = 1.0 + T9; - dT0_dVg = T8 * (1.0 - Vgsteff * dEsatL_dVg / EsatL); - dT0_dVb = -T9 * dEsatL_dVb / EsatL; - dT0_dVd = -T9 * dEsatL_dVd / EsatL; - if (selfheat) - dT0_dT = -T9 * dEsatL_dT / EsatL; - else - dT0_dT = 0.0; - } - else /* Added to avoid the discontinuity problems caused by pvag */ - { T1 = 1.0 / (17.0 + 20.0 * T9); - T0 = (0.8 + T9) * T1; - T1 *= T1; - dT0_dVg = T8 * (1.0 - Vgsteff * dEsatL_dVg / EsatL) * T1; - - T9 *= T1 / EsatL; - dT0_dVb = -T9 * dEsatL_dVb; - dT0_dVd = -T9 * dEsatL_dVd; - if (selfheat) - dT0_dT = -T9 * dEsatL_dT; - else - dT0_dT = 0.0; - } - - tmp1 = VACLM * VACLM; - tmp2 = VADIBL * VADIBL; - tmp3 = VACLM + VADIBL; - - T1 = VACLM * VADIBL / tmp3; - tmp3 *= tmp3; - dT1_dVg = (tmp1 * dVADIBL_dVg + tmp2 * dVACLM_dVg) / tmp3; - dT1_dVd = (tmp1 * dVADIBL_dVd + tmp2 * dVACLM_dVd) / tmp3; - dT1_dVb = (tmp1 * dVADIBL_dVb + tmp2 * dVACLM_dVb) / tmp3; - if (selfheat) - dT1_dT = (tmp1 * dVADIBL_dT + tmp2 * dVACLM_dT ) / tmp3; - else dT1_dT = 0.0; - - Va = Vasat + T0 * T1; - dVa_dVg = dVasat_dVg + T1 * dT0_dVg + T0 * dT1_dVg; - dVa_dVd = dVasat_dVd + T1 * dT0_dVd + T0 * dT1_dVd; - dVa_dVb = dVasat_dVb + T1 * dT0_dVb + T0 * dT1_dVb; - if (selfheat) - dVa_dT = dVasat_dT + T1 * dT0_dT + T0 * dT1_dT; - else dVa_dT = 0.0; - -/* Calculate Ids */ - CoxWovL = model->B3SOIPDcox * Weff / Leff; - beta = ueff * CoxWovL; - dbeta_dVg = CoxWovL * dueff_dVg + beta * dWeff_dVg / Weff ; - dbeta_dVd = CoxWovL * dueff_dVd; - dbeta_dVb = CoxWovL * dueff_dVb + beta * dWeff_dVb / Weff ; - if (selfheat) dbeta_dT = CoxWovL * dueff_dT; - else dbeta_dT = 0.0; - - T0 = 1.0 - 0.5 * Abulk * Vdseff / Vgst2Vtm; - dT0_dVg = -0.5 * (Abulk * dVdseff_dVg - - Abulk * Vdseff / Vgst2Vtm + Vdseff * dAbulk_dVg) / Vgst2Vtm; - dT0_dVd = -0.5 * Abulk * dVdseff_dVd / Vgst2Vtm; - dT0_dVb = -0.5 * (Abulk * dVdseff_dVb + dAbulk_dVb * Vdseff) - / Vgst2Vtm; - if (selfheat) - dT0_dT = -0.5 * (Abulk * dVdseff_dT - - Abulk * Vdseff / Vgst2Vtm * dVgst2Vtm_dT) - / Vgst2Vtm; - else dT0_dT = 0.0; - - fgche1 = Vgsteff * T0; - dfgche1_dVg = Vgsteff * dT0_dVg + T0; - dfgche1_dVd = Vgsteff * dT0_dVd; - dfgche1_dVb = Vgsteff * dT0_dVb; - if (selfheat) dfgche1_dT = Vgsteff * dT0_dT; - else dfgche1_dT = 0.0; - - T9 = Vdseff / EsatL; - fgche2 = 1.0 + T9; - dfgche2_dVg = (dVdseff_dVg - T9 * dEsatL_dVg) / EsatL; - dfgche2_dVd = (dVdseff_dVd - T9 * dEsatL_dVd) / EsatL; - dfgche2_dVb = (dVdseff_dVb - T9 * dEsatL_dVb) / EsatL; - if (selfheat) dfgche2_dT = (dVdseff_dT - T9 * dEsatL_dT) / EsatL; - else dfgche2_dT = 0.0; - - gche = beta * fgche1 / fgche2; - dgche_dVg = (beta * dfgche1_dVg + fgche1 * dbeta_dVg - - gche * dfgche2_dVg) / fgche2; - dgche_dVd = (beta * dfgche1_dVd + fgche1 * dbeta_dVd - - gche * dfgche2_dVd) / fgche2; - dgche_dVb = (beta * dfgche1_dVb + fgche1 * dbeta_dVb - - gche * dfgche2_dVb) / fgche2; - if (selfheat) - dgche_dT = (beta * dfgche1_dT + fgche1 * dbeta_dT - - gche * dfgche2_dT) / fgche2; - else dgche_dT = 0.0; - - T0 = 1.0 + gche * Rds; - T9 = Vdseff / T0; - Idl = gche * T9; - -/* Whoa, these formulas for the derivatives of Idl are convoluted, but I - verified them to be correct */ - - dIdl_dVg = (gche * dVdseff_dVg + T9 * dgche_dVg) / T0 - - Idl * gche / T0 * dRds_dVg ; - dIdl_dVd = (gche * dVdseff_dVd + T9 * dgche_dVd) / T0; - dIdl_dVb = (gche * dVdseff_dVb + T9 * dgche_dVb - - Idl * dRds_dVb * gche) / T0; - if (selfheat) - dIdl_dT = (gche * dVdseff_dT + T9 * dgche_dT - - Idl * dRds_dT * gche) / T0; - else dIdl_dT = 0.0; - - T9 = diffVds / Va; - T0 = 1.0 + T9; - here->B3SOIPDids = Ids = Idl * T0 / here->B3SOIPDnseg; - - Gm0 = T0 * dIdl_dVg - Idl * (dVdseff_dVg + T9 * dVa_dVg) / Va; - Gds0 = T0 * dIdl_dVd + Idl * (1.0 - dVdseff_dVd - - T9 * dVa_dVd) / Va; - Gmb0 = T0 * dIdl_dVb - Idl * (dVdseff_dVb + T9 * dVa_dVb) / Va; - Gmc = 0.0; - if (selfheat) - GmT0 = T0 * dIdl_dT - Idl * (dVdseff_dT + T9 * dVa_dT) / Va; - else GmT0 = 0.0; - -/* This includes all dependencies from Vgsteff, Vbseff */ - - Gm = Gm0 * dVgsteff_dVg / here->B3SOIPDnseg; - Gmb = (Gm0 * dVgsteff_dVb + Gmb0 * dVbseff_dVb) / here->B3SOIPDnseg; - Gds = (Gm0 * dVgsteff_dVd + Gds0) / here->B3SOIPDnseg; - if (selfheat) - GmT = (Gm0 * dVgsteff_dT + GmT0) / here->B3SOIPDnseg; - else GmT = 0.0; - -/* calculate GIDL current */ - T0 = 3 * model->B3SOIPDtox; - /* For drain side */ - T1 = (Vds - Vgs_eff - pParam->B3SOIPDngidl) / T0; - if ((pParam->B3SOIPDagidl <= 0.0) || (pParam->B3SOIPDbgidl <= 0.0) || - (T1 <= 0.0)) - { Idgidl = Gdgidld = Gdgidlg = 0.0; - } - else { - dT1_dVd = 1 / T0; - dT1_dVg = - dT1_dVd * dVgs_eff_dVg; - T2 = pParam->B3SOIPDbgidl / T1; - if (T2 < EXPL_THRESHOLD) - { - Idgidl = wdiod * pParam->B3SOIPDagidl * T1 * exp(-T2); - T3 = Idgidl / T1 * (T2 + 1); - Gdgidld = T3 * dT1_dVd; - Gdgidlg = T3 * dT1_dVg; - } else - { - T3 = wdiod * pParam->B3SOIPDagidl * MIN_EXPL; - Idgidl = T3 * T1 ; - Gdgidld = T3 * dT1_dVd; - Gdgidlg = T3 * dT1_dVg; - } - } - here->B3SOIPDigidl = Idgidl; - - /* For source side */ - T1 = (- Vgs_eff - pParam->B3SOIPDngidl) / T0; - if ((pParam->B3SOIPDagidl <= 0.0) || (pParam->B3SOIPDbgidl <= 0.0) - || (T1 <= 0.0)) - { Isgidl = Gsgidlg = 0; - } - else - { - dT1_dVg = - dVgs_eff_dVg / T0; - T2 = pParam->B3SOIPDbgidl / T1; - if (T2 < EXPL_THRESHOLD) - { - Isgidl = wdios * pParam->B3SOIPDagidl * T1 * exp(-T2); - T3 = Isgidl / T1 * (T2 + 1); - Gsgidlg = T3 * dT1_dVg; - } else - { - T3 = wdios * pParam->B3SOIPDagidl * MIN_EXPL; - Isgidl = T3 * T1 ; - Gsgidlg = T3 * dT1_dVg; - } - } - -/* calculate diode and BJT current */ - WsTsi = wdios * model->B3SOIPDtsi; - WdTsi = wdiod * model->B3SOIPDtsi; - - NVtm1 = Vtm * pParam->B3SOIPDndiode; - if (selfheat) - dNVtm1_dT = pParam->B3SOIPDndiode * dVtm_dT; - else - dNVtm1_dT = 0; - - T0 = Vbs / NVtm1; - dT0_dVb = 1.0 / NVtm1; - if (selfheat) - dT0_dT = -Vbs / NVtm1 / NVtm1 * dNVtm1_dT; - else - dT0_dT = 0; - DEXP(T0, ExpVbsNVtm, T1); - dExpVbsNVtm_dVb = T1 * dT0_dVb; - if (selfheat) - dExpVbsNVtm_dT = T1 * dT0_dT; - else - dExpVbsNVtm_dT = 0; - - T0 = Vbd / NVtm1; - dT0_dVb = 1.0 / NVtm1; - dT0_dVd = -dT0_dVb; - if (selfheat) - dT0_dT = -Vbd / NVtm1 / NVtm1 * dNVtm1_dT; - else - dT0_dT = 0; - DEXP(T0, ExpVbdNVtm, T1); - dExpVbdNVtm_dVb = T1 * dT0_dVb; - dExpVbdNVtm_dVd = -dExpVbdNVtm_dVb; - if (selfheat) - dExpVbdNVtm_dT = T1 * dT0_dT; - else - dExpVbdNVtm_dT = 0; - - /* Ibs1 / Ibd1 : diffusion current */ - if (jdif == 0) { - Ibs1 = dIbs1_dVb = dIbs1_dT = Ibd1 = dIbd1_dVb = dIbd1_dVd = dIbd1_dT = 0; - } - else { - T0 = WsTsi * jdif; - if (selfheat) - dT0_dT = WsTsi * djdif_dT; - else - dT0_dT = 0; - Ibs1 = T0 * (ExpVbsNVtm - 1); - dIbs1_dVb = T0 * dExpVbsNVtm_dVb; - if (selfheat) - dIbs1_dT = T0 * dExpVbsNVtm_dT + (ExpVbsNVtm - 1) * dT0_dT; - else - dIbs1_dT = 0; - - T0 = WdTsi * jdif; - if (selfheat) - dT0_dT = WdTsi * djdif_dT; - else - dT0_dT = 0; - Ibd1 = T0 * (ExpVbdNVtm - 1); - dIbd1_dVb = T0 * dExpVbdNVtm_dVb; - dIbd1_dVd = -dIbd1_dVb; - if (selfheat) - dIbd1_dT = T0 * dExpVbdNVtm_dT + (ExpVbdNVtm -1) * dT0_dT; - else - dIbd1_dT = 0; - } - - /* Ibs2:recombination/trap-assisted tunneling current */ - NVtmf = 0.026 * pParam->B3SOIPDnrecf0 - * (1 + model->B3SOIPDntrecf * (TempRatio - 1)); - NVtmr = 0.026 * pParam->B3SOIPDnrecr0 /* v2.2.2 bug fix */ - * (1 + model->B3SOIPDntrecr * (TempRatio - 1)); - if (selfheat) { - dNVtmf_dT = pParam->B3SOIPDnrecf0 * 0.026 - * model->B3SOIPDntrecf * dTempRatio_dT; - dNVtmr_dT = pParam->B3SOIPDnrecr0 * 0.026 /* v2.2.2 bug fix */ - * model->B3SOIPDntrecr * dTempRatio_dT; - } - else - dNVtmf_dT = dNVtmr_dT = 0; - - if (jrec == 0) { - Ibs2 = dIbs2_dVb = dIbs2_dT = 0; - Ibd2 = dIbd2_dVb = dIbd2_dVd = dIbd2_dT = 0; - } - else { - /* forward bias */ - T0 = Vbs / NVtmf; - DEXP(T0,T10,T2); - T4 = 1 / NVtmf; - dT10_dVb = T4 * T2; - if (selfheat) - dT10_dT = - T4 * T2 * Vbs / NVtmf * dNVtmf_dT ; - else dT10_dT = 0.0; - - /* reverse bias */ - if ((pParam->B3SOIPDvrec0 - Vbs) < 1e-3) { - - /* v2.2.3 bug fix */ - T1 = 1e3; - T0 = -Vbs / NVtmr * pParam->B3SOIPDvrec0 * T1; - T11 = -exp(T0); - - dT11_dVb = dT11_dT = 0; - } - else { - T1 = 1 / (pParam->B3SOIPDvrec0 - Vbs); - T0 = -Vbs / NVtmr * pParam->B3SOIPDvrec0 * T1; - dT0_dVb = -pParam->B3SOIPDvrec0 / NVtmr * (T1 + Vbs * T1 * T1) ; - if (selfheat) - dT0_dT = -T0 / NVtmr * dNVtmr_dT; - else dT0_dT = 0; - - DEXP(T0, T11, T2); - T11 = -T11; - dT11_dVb = -T2 * dT0_dVb; - if (selfheat) - dT11_dT = -T2 * dT0_dT; - else dT11_dT = 0; - } - T3 = WsTsi * jrec; - Ibs2 = T3 * (T10 + T11); - dIbs2_dVb = T3 * (dT10_dVb + dT11_dVb); - if (selfheat) - dIbs2_dT = T3 * (dT10_dT + dT11_dT) + WsTsi * (T10 + T11) * djrec_dT; - else dIbs2_dT = 0; - - /* Ibd2 */ - T0 = Vbd / NVtmf; - DEXP(T0,T10,T2); - T4 = 1 / NVtmf; - dT10_dVb = T4 * T2; - if (selfheat) - dT10_dT = - T4 * T2 * Vbd / NVtmf * dNVtmf_dT ; - else dT10_dT = 0.0; - - if ((pParam->B3SOIPDvrec0 - Vbd) < 1e-3) { - - /* v2.2.3 bug fix */ - T1 = 1e3; - T0 = -Vbd / NVtmr * pParam->B3SOIPDvrec0 * T1; - T11 = -exp(T0); - - dT11_dVb = dT11_dT = 0; - } - else { - T1 = 1 / (pParam->B3SOIPDvrec0 - Vbd); - T0 = -Vbd / NVtmr * pParam->B3SOIPDvrec0 * T1; - dT0_dVb = -pParam->B3SOIPDvrec0 / NVtmr * (T1 + Vbd * T1 * T1) ; - if (selfheat) - dT0_dT = -T0 / NVtmr * dNVtmr_dT; - else - dT0_dT = 0; - DEXP(T0, T11, T2); - T11 = - T11; - dT11_dVb = -T2 * dT0_dVb; - if (selfheat) - dT11_dT = -T2 * dT0_dT; - else - dT11_dT = 0; - } - T3 = WdTsi * jrec; - Ibd2 = T3 * (T10 + T11); - dIbd2_dVb = T3 * (dT10_dVb + dT11_dVb); - dIbd2_dVd = -dIbd2_dVb; - if (selfheat) - dIbd2_dT = T3 * (dT10_dT + dT11_dT) + WdTsi * (T10 + T11) * djrec_dT; - else - dIbd2_dT = 0; - } - - /* Ibs3/Ibd3: recombination current in neutral body */ - WTsi = pParam->B3SOIPDweff / here->B3SOIPDnseg * model->B3SOIPDtsi; - if (jbjt == 0.0) - { - Ibs3 = dIbs3_dVb = dIbs3_dVd = dIbs3_dT = 0.0; - Ibd3 = dIbd3_dVb = dIbd3_dVd = dIbd3_dT = 0.0; - Ibsdif = dIbsdif_dVb = dIbsdif_dT = 0; - Ibddif = dIbddif_dVb = dIbddif_dVd = dIbddif_dT = 0; - here->B3SOIPDic = Ic = Gcd = Gcb = GcT = 0.0; - } - else { - Ien = WTsi * jbjt * pParam->B3SOIPDlratio; - if (selfheat) - dIen_dT = WTsi * djbjt_dT * pParam->B3SOIPDlratio; - else - dIen_dT = 0; - - /* high level injection of source side */ - if ((Ehlis = Ahli * (ExpVbsNVtm - 1)) < 1e-5) { - Ehlis = dEhlis_dVb = dEhlis_dT = 0; - EhlisFactor = 1; - dEhlisFactor_dVb = dEhlisFactor_dT = 0; - } - else { - dEhlis_dVb = Ahli * dExpVbsNVtm_dVb; - if (selfheat) - dEhlis_dT = Ahli * dExpVbsNVtm_dT + (ExpVbsNVtm - 1) * dAhli_dT; - else - dEhlis_dT = 0; - EhlisFactor = 1.0 / sqrt(1 + Ehlis); - T0 = -0.5 * EhlisFactor / (1 + Ehlis); - dEhlisFactor_dVb = T0 * dEhlis_dVb; - if (selfheat) - dEhlisFactor_dT = T0 * dEhlis_dT; - else - dEhlisFactor_dT = 0; - } - - /* high level injection of drain side */ - if ((Ehlid = Ahli * (ExpVbdNVtm - 1)) < 1e-5) { - Ehlid = dEhlid_dVb = dEhlid_dVd = dEhlid_dT = 0; - EhlidFactor = 1; - dEhlidFactor_dVb = dEhlidFactor_dVd = dEhlidFactor_dT = 0; - } - else { - dEhlid_dVb = Ahli * dExpVbdNVtm_dVb; - dEhlid_dVd = -dEhlid_dVb; - if (selfheat) - dEhlid_dT = Ahli * dExpVbdNVtm_dT + (ExpVbdNVtm - 1) * dAhli_dT; - else - dEhlid_dT = 0; - EhlidFactor = 1.0 / sqrt(1 + Ehlid); - T0 = -0.5 * EhlidFactor / (1 + Ehlid); - dEhlidFactor_dVb = T0 * dEhlid_dVb; - dEhlidFactor_dVd = -dEhlidFactor_dVb; - if (selfheat) - dEhlidFactor_dT = T0 * dEhlid_dT; - else - dEhlidFactor_dT = 0; - } - - if ((T0 = (1 - pParam->B3SOIPDarfabjt)) < 1e-2) { - Ibs3 = dIbs3_dVb = dIbs3_dT = 0; - - dIbs3_dVd = 0; - - Ibd3 = dIbd3_dVb = dIbd3_dVd = dIbd3_dT = 0; - } - else { - T1 = T0 * Ien; - if (selfheat) - dT1_dT = T0 * dIen_dT; - else - dT1_dT = 0; - - Ibs3 = T1 * (ExpVbsNVtm - 1) * EhlisFactor; - dIbs3_dVb = T1 * (dExpVbsNVtm_dVb * EhlisFactor - + (ExpVbsNVtm - 1) * dEhlisFactor_dVb); - dIbs3_dVd = 0; - if (selfheat) - dIbs3_dT = dT1_dT * (ExpVbsNVtm - 1) * EhlisFactor - + T1 * (dExpVbsNVtm_dT * EhlisFactor - + (ExpVbsNVtm - 1) * dEhlisFactor_dT); - else - dIbs3_dT = 0.0; - - Ibd3 = T1 * (ExpVbdNVtm - 1) * EhlidFactor; - dIbd3_dVb = T1 * (dExpVbdNVtm_dVb * EhlidFactor - + (ExpVbdNVtm - 1) * dEhlidFactor_dVb); - dIbd3_dVd = -dIbd3_dVb; - if (selfheat) - dIbd3_dT = dT1_dT * (ExpVbdNVtm - 1) * EhlidFactor - + T1 * (dExpVbdNVtm_dT * EhlidFactor - + (ExpVbdNVtm - 1) * dEhlidFactor_dT); - else - dIbd3_dT = 0.0; - } - - /* effective diffusion current for capacitance calcu. */ - Iendif = WTsi * jbjt * pParam->B3SOIPDlratiodif; - if (selfheat) - dIendif_dT = WTsi * djbjt_dT * pParam->B3SOIPDlratiodif; - else - dIendif_dT = 0; - - Ibsdif = Iendif * (ExpVbsNVtm - 1) * EhlisFactor; - dIbsdif_dVb = Iendif * (dExpVbsNVtm_dVb * EhlisFactor - + (ExpVbsNVtm - 1) * dEhlisFactor_dVb); - if (selfheat) - dIbsdif_dT = dIendif_dT * (ExpVbsNVtm - 1) * EhlisFactor - + Iendif * (dExpVbsNVtm_dT * EhlisFactor - + (ExpVbsNVtm - 1) * dEhlisFactor_dT); - else - dIbsdif_dT = 0; - - Ibddif = Iendif * (ExpVbdNVtm - 1) * EhlidFactor; - dIbddif_dVb = Iendif * (dExpVbdNVtm_dVb * EhlidFactor - + (ExpVbdNVtm - 1) * dEhlidFactor_dVb); - dIbddif_dVd = -dIbddif_dVb; - if (selfheat) - dIbddif_dT = dIendif_dT * (ExpVbdNVtm - 1) * EhlidFactor - + Iendif * (dExpVbdNVtm_dT * EhlidFactor - + (ExpVbdNVtm - 1) * dEhlidFactor_dT); - else - dIbddif_dT = 0; - - /* Ic: Bjt collector current */ - if ((here->B3SOIPDbjtoff == 1) || (Vds == 0.0)) { - here->B3SOIPDic = Ic = Gcd = Gcb = GcT = 0.0; - } - else { - /* second order effects */ - T0 = 1 + (Vbs + Vbd) / pParam->B3SOIPDvearly; - dT0_dVb = 2.0 / pParam->B3SOIPDvearly; - dT0_dVd = -1.0 / pParam->B3SOIPDvearly; - - T1 = Ehlis + Ehlid; - dT1_dVb = dEhlis_dVb + dEhlid_dVb; - dT1_dVd = dEhlid_dVd; - if (selfheat) - dT1_dT = dEhlis_dT + dEhlid_dT; - else - dT1_dT = 0; - - T3 = sqrt(T0 * T0 + 4 * T1); - dT3_dVb = 0.5 / T3 * (2 * T0 * dT0_dVb + 4 * dT1_dVb); - dT3_dVd = 0.5 / T3 * (2 * T0 * dT0_dVd + 4 * dT1_dVd); - if (selfheat) - dT3_dT = 2 * dT1_dT / T3; - else - dT3_dT = 0; - - T2 = (T0 + T3) / 2.0; - dT2_dVb = (dT0_dVb + dT3_dVb) / 2.0; - dT2_dVd = (dT0_dVd + dT3_dVd) / 2.0; - if (selfheat) - dT2_dT = dT3_dT /2.0; - else - dT2_dT = 0; - - if (T2 < .1) - { - E2ndFactor = 10.0; - dE2ndFactor_dVb = dE2ndFactor_dVd = dE2ndFactor_dT = 0; - } - - else { - E2ndFactor = 1.0 / T2; - dE2ndFactor_dVb = -E2ndFactor / T2 * dT2_dVb; - dE2ndFactor_dVd = -E2ndFactor / T2 * dT2_dVd; - if (selfheat) - dE2ndFactor_dT = -E2ndFactor / T2 * dT2_dT; - else - dE2ndFactor_dT = 0; - } - - T0 = pParam->B3SOIPDarfabjt * Ien; - if (selfheat) - dT0_dT = pParam->B3SOIPDarfabjt * dIen_dT; - else - dT0_dT = 0; - here->B3SOIPDic = Ic - = T0 * (ExpVbsNVtm - ExpVbdNVtm) * E2ndFactor; - Gcb = dIc_dVb - = T0 * ((dExpVbsNVtm_dVb - dExpVbdNVtm_dVb) * E2ndFactor - + (ExpVbsNVtm - ExpVbdNVtm) * dE2ndFactor_dVb); - Gcd = dIc_dVd - = T0 * (-dExpVbdNVtm_dVd * E2ndFactor - + (ExpVbsNVtm - ExpVbdNVtm) * dE2ndFactor_dVd); - if (selfheat) - GcT = T0 * (dExpVbsNVtm_dT - dExpVbdNVtm_dT) * E2ndFactor - + dT0_dT * (ExpVbsNVtm - ExpVbdNVtm) * E2ndFactor - + T0 * (ExpVbsNVtm - ExpVbdNVtm) * dE2ndFactor_dT; - else - GcT = 0; - } - } - - /* Ibs4/Ibd4 : tunneling */ - NVtm2 = 0.026 * pParam->B3SOIPDntun; - if (jtun == 0) - { Ibs4 = Ibd4 = dIbs4_dVb = dIbs4_dT = dIbd4_dVb = dIbd4_dVd = dIbd4_dT = 0; - } else - { - if ((pParam->B3SOIPDvtun0 - Vbs) < 1e-3) - { - /* v2.2.3 bug fix */ - T1=1e3; - T0 = -Vbs / NVtm2 * pParam->B3SOIPDvtun0 * T1; - T1 = exp(T0); - T3 = WsTsi * jtun; - Ibs4 = T3 * (1- T1); - - dIbs4_dVb = dIbs4_dT = 0; - } - else { - T1 = 1 / (pParam->B3SOIPDvtun0 - Vbs); - T0 = -Vbs / NVtm2 * pParam->B3SOIPDvtun0 * T1; - dT0_dVb = -pParam->B3SOIPDvtun0 / NVtm2 * (T1 + Vbs * T1 * T1) ; - - DEXP(T0, T1, T2); - T3 = WsTsi * jtun; - Ibs4 = T3 * (1- T1); - dIbs4_dVb = -T3 * T2 * dT0_dVb; - if (selfheat) - dIbs4_dT = (1 - T1) * WsTsi * djtun_dT; - else dIbs4_dT = 0; - } - - if ((pParam->B3SOIPDvtun0 - Vbd) < 1e-3) { - - /* v2.2.3 bug fix */ - T1=1e3; - T0 = -Vbd / NVtm2 * pParam->B3SOIPDvtun0 * T1; - T1 = exp(T0); - T3 = WdTsi * jtun; - Ibd4 = T3 * (1- T1); - - dIbd4_dVb = dIbd4_dT = 0; - dIbd4_dVd = 0; - - } - else { - T1 = 1 / (pParam->B3SOIPDvtun0 - Vbd); - T0 = -Vbd / NVtm2 * pParam->B3SOIPDvtun0 * T1; - dT0_dVb = -pParam->B3SOIPDvtun0 / NVtm2 * (T1 + Vbd * T1 * T1) ; - - DEXP(T0, T1, T2); - T3 = WdTsi * jtun; - Ibd4 = T3 * (1- T1); - dIbd4_dVb = -T3 * T2 * dT0_dVb; - - dIbd4_dVd = -dIbd4_dVb; - - if (selfheat) - dIbd4_dT = (1 - T1) * WdTsi * djtun_dT; - else dIbd4_dT = 0; - } - } - - here->B3SOIPDitun = - Ibd3 - Ibd4; - here->B3SOIPDibs = Ibs = Ibs1 + Ibs2 + Ibs3 + Ibs4; - here->B3SOIPDibd = Ibd = Ibd1 + Ibd2 + Ibd3 + Ibd4; - - Gjsb = dIbs1_dVb + dIbs2_dVb + dIbs3_dVb + dIbs4_dVb; - Gjsd = dIbs3_dVd; - if (selfheat) GjsT = dIbs1_dT + dIbs2_dT + dIbs3_dT + dIbs4_dT; - else GjsT = 0.0; - - Gjdb = dIbd1_dVb + dIbd2_dVb + dIbd3_dVb + dIbd4_dVb; - Gjdd = dIbd1_dVd + dIbd2_dVd + dIbd3_dVd + dIbd4_dVd; - if (selfheat) GjdT = dIbd1_dT + dIbd2_dT + dIbd3_dT + dIbd4_dT; - else GjdT = 0.0; - - -/* v2.2: calculate gate-tunneling-to-body current */ - - if (model->B3SOIPDigMod >= 1) { - Vgb = Vgs_eff - Vbs; - dVgb_dVg = dVgs_eff_dVg; - dVgb_dVb = -1; - - /* Calculate Vox first */ - Vfb = model->B3SOIPDtype * pParam->B3SOIPDvth0 - phi - pParam->B3SOIPDk1eff * sqrtPhi; - - T3 = Vfb - Vgs_eff + Vbs - DELTA_3; - dT3_dVg = -dVgs_eff_dVg; - dT3_dVd = 0; - dT3_dVb = 1; - - if (Vfb <= 0.0) { - T0 = sqrt(T3 * T3 - 4.0 * DELTA_3 * Vfb); - dT0_dVg = 1.0/(2.0 * T0) * 2.0*T3 * dT3_dVg; - dT0_dVb = 0.5*(1.0/T0) * 2.0*T3 * dT3_dVb; - } - else { - T0 = sqrt(T3 * T3 + 4.0 * DELTA_3 * Vfb); - dT0_dVg = 1.0/(2.0 * T0) * 2.0*T3 * dT3_dVg; - dT0_dVb = 0.5*(1.0/T0) * 2.0*T3 * dT3_dVb; - } - - Vfbeff = Vfb - 0.5 * (T3 + T0); - dVfbeff_dVg = -0.5 * (dT3_dVg + dT0_dVg); - dVfbeff_dVb = -0.5 * (dT3_dVb + dT0_dVb); - - Voxacc = Vfb - Vfbeff; - dVoxacc_dVg = -dVfbeff_dVg; - dVoxacc_dVd = 0.0; - dVoxacc_dVb = -dVfbeff_dVb; - if (Voxacc < 0.0) - Voxacc = dVoxacc_dVg = dVoxacc_dVb = 0.0; - - T0 = Vgs_eff - Vgsteff - Vfbeff - Vbseff; - dT0_dVg = dVgs_eff_dVg - dVgsteff_dVg - dVfbeff_dVg; - dT0_dVd = -dVgsteff_dVd; - dT0_dVb = -dVgsteff_dVb - dVfbeff_dVb - dVbseff_dVb; - if (selfheat) - dT0_dT = -dVgsteff_dT; - - if (pParam->B3SOIPDk1eff == 0.0) { - Voxdepinv = dVoxdepinv_dVg = dVoxdepinv_dVd = dVoxdepinv_dVb - = dVoxdepinv_dT = 0.0; - } else { - if (T0 < 0.0) { - T1 = T0/pParam->B3SOIPDk1eff; - dT1_dVg = dT0_dVg/pParam->B3SOIPDk1eff; - dT1_dVd = dT0_dVd/pParam->B3SOIPDk1eff; - dT1_dVb = dT0_dVb/pParam->B3SOIPDk1eff; - if (selfheat) dT1_dT = dT0_dT/pParam->B3SOIPDk1eff; - } - else { - T1 = pParam->B3SOIPDk1eff/2*(-1 + sqrt(1 + - 4*T0/pParam->B3SOIPDk1eff/pParam->B3SOIPDk1eff)); - T2 = pParam->B3SOIPDk1eff/2 * - 0.5/sqrt(1 + 4*T0/pParam->B3SOIPDk1eff/pParam->B3SOIPDk1eff) * - 4/pParam->B3SOIPDk1eff/pParam->B3SOIPDk1eff; - dT1_dVg = T2 * dT0_dVg; - dT1_dVd = T2 * dT0_dVd; - dT1_dVb = T2 * dT0_dVb; - if (selfheat) - dT1_dT = T2 * dT0_dT; - } - - Voxdepinv = Vgs_eff - (T1*T1 + Vbs) - Vfb; - dVoxdepinv_dVg = dVgs_eff_dVg - (2.0*T1*dT1_dVg); - dVoxdepinv_dVd = -(2.0*T1*dT1_dVd); - dVoxdepinv_dVb = -(2.0*T1*dT1_dVb + 1); - if (selfheat) - dVoxdepinv_dT = -(2.0*T1*dT1_dT); - } - - - OxideRatio = pParam->B3SOIPDoxideRatio; - - Vox = Voxdepinv; - /* Voxeff is Vox limited below Voxh */ - T0 = model->B3SOIPDvoxh; - T1 = T0 - Vox - model->B3SOIPDdeltavox; - T3 = sqrt(T1 * T1 + 4*model->B3SOIPDdeltavox * T0); - Voxeff = T0 - 0.5 * (T1 + T3); - dVoxeff_dVox = 0.5 * (1.0 + T1 / T3); - - Vox = Voxeff; - dVox_dVg = dVoxdepinv_dVg * dVoxeff_dVox; - dVox_dVd = dVoxdepinv_dVd * dVoxeff_dVox; - dVox_dVb = dVoxdepinv_dVb * dVoxeff_dVox; - dVox_dT = dVoxdepinv_dT * dVoxeff_dVox; - - - T0 = (Vox - model->B3SOIPDebg)/model->B3SOIPDvevb; - if (selfheat) - dT0_dT = dVox_dT /model->B3SOIPDvevb; - - DEXP(T0, T1, T2); /* T1=exp(T0), T2=dT1_dT0 */ - if (selfheat) - dT1_dT = T2 * dT0_dT; - - Vaux = model->B3SOIPDvevb * log(1 + T1); - dVaux_dVg = T2 / (1 + T1) * dVox_dVg; - dVaux_dVd = T2 / (1 + T1) * dVox_dVd; - dVaux_dVb = T2 / (1 + T1) * dVox_dVb; - if (selfheat) - dVaux_dT = T2 / (1 + T1) * dVox_dT; - - if (model->B3SOIPDvgb1 != 0) { - T0 = 1 - Vox / model->B3SOIPDvgb1; - dT0_dVox = -1.0/model->B3SOIPDvgb1; - if (selfheat) - dT0_dT = -dVox_dT / model->B3SOIPDvgb1; - } else { - T0 = 1; - dT0_dVox = dT0_dT = 0.0; - } - - if (T0 < 0.01) { - T0 = 0.01; - dT0_dVox = dT0_dT = 0.0; - } - -/* v2.2.3 bug fix */ - T1 = Leff * Weff * 3.7622e-7 * OxideRatio / here->B3SOIPDnseg; - - T2 = -3.1051e10 * model->B3SOIPDtoxqm; - T3 = model->B3SOIPDalphaGB1; - T4 = model->B3SOIPDbetaGB1; - - T6 = T2*(T3 - T4 * Vox) / T0; - if (selfheat) dT6_dT = -T2 * T4 * dVox_dT / T0 - T6/T0 * dT0_dT; - - DEXP(T6, T5, T7); /* T5=exp(T6), T7=dT5_dT6 */ - dT5_dVg = -T7 * dVox_dVg * T2 / T0 * (T4 + (T3 - T4 * Vox) / T0 * dT0_dVox); - dT5_dVd = -T7 * dVox_dVd * T2 / T0 * (T4 + (T3 - T4 * Vox) / T0 * dT0_dVox); - dT5_dVb = -T7 * dVox_dVb * T2 / T0 * (T4 + (T3 - T4 * Vox) / T0 * dT0_dVox); - if (selfheat) - dT5_dT = T7 * dT6_dT; - - Igb1 = T1 * Vgb * Vaux * T5; - dIgb1_dVg = T1 * (Vgb*Vaux*dT5_dVg + dVgb_dVg*Vaux*T5 + - Vgb*T5*dVaux_dVg); - dIgb1_dVd = T1 * (Vgb*Vaux*dT5_dVd + Vgb*T5*dVaux_dVd); - dIgb1_dVb = T1 * (Vgb*Vaux*dT5_dVb + dVgb_dVb*Vaux*T5 + - Vgb*T5*dVaux_dVb); - if (selfheat) - dIgb1_dT = T1 * Vgb * (Vaux*dT5_dT + T5*dVaux_dT); - else dIgb1_dT = 0.0; - - - Vox = Voxacc; - /* Voxeff is Vox limited below Voxh */ - T0 = model->B3SOIPDvoxh; - T1 = T0 - Vox - model->B3SOIPDdeltavox; - T3 = sqrt(T1 * T1 + 4*model->B3SOIPDdeltavox * T0); - Voxeff = T0 - 0.5 * (T1 + T3); - dVoxeff_dVox = 0.5 * (1.0 + T1 / T3); - - Vox = Voxeff; - dVox_dVg = dVoxacc_dVg * dVoxeff_dVox; - dVox_dVd = dVoxacc_dVd * dVoxeff_dVox; - dVox_dVb = dVoxacc_dVb * dVoxeff_dVox; - dVox_dT = 0; - - T0 = (-Vgb+(Vfb))/model->B3SOIPDvecb; - if (selfheat) - dT0_dT = 0; - - DEXP(T0, T1, T2); /* T1=exp(T0), T2=dT1_dT0 */ - if (selfheat) - dT1_dT = 0; - - Vaux = model->B3SOIPDvecb* log(1 + T1); - dVaux_dVg = -T2 / (1 + T1); - dVaux_dVd = 0; - dVaux_dVb = -dVaux_dVg; - if (selfheat) - dVaux_dT = 0; - - if (model->B3SOIPDvgb2 != 0) { - T0 = 1 - Vox / model->B3SOIPDvgb2; - dT0_dVox = -1.0/model->B3SOIPDvgb2; - if (selfheat) dT0_dT = -dVox_dT / model->B3SOIPDvgb2; - } else { - T0 = 1; - dT0_dVox = dT0_dT =0.0; - } - - if (T0 < 0.01) { - T0 = 0.01; - dT0_dVox = dT0_dT =0.0; - } - -/* v2.2.3 bug fix */ - T1 = Leff * Weff * 4.9758e-7 * OxideRatio / here->B3SOIPDnseg; - - T2 = -2.357e10 * model->B3SOIPDtoxqm; - T3 = model->B3SOIPDalphaGB2; - T4 = model->B3SOIPDbetaGB2; - - T6 = T2*(T3 - T4 * Vox) / T0; - if (selfheat) dT6_dT = -T2 * T4 * dVox_dT / T0 - T6/T0 * dT0_dT; - - DEXP(T6, T5, T7); /* T5=exp(T6), T7=dT5_dT6 */ - dT5_dVg = -T7 * dVox_dVg * T2 / T0 * (T4 + (T3 - T4 * Vox) / T0 * dT0_dVox); - dT5_dVd = -T7 * dVox_dVd * T2 / T0 * (T4 + (T3 - T4 * Vox) / T0 * dT0_dVox); - dT5_dVb = -T7 * dVox_dVb * T2 / T0 * (T4 + (T3 - T4 * Vox) / T0 * dT0_dVox); - if (selfheat) - dT5_dT = T7 * dT6_dT; - - Igb2 = T1 * Vgb * Vaux * T5; - dIgb2_dVg = T1 * (Vgb*Vaux*dT5_dVg + dVgb_dVg*Vaux*T5 + - Vgb*T5*dVaux_dVg); - dIgb2_dVd = T1 * (Vgb*Vaux*dT5_dVd + Vgb*T5*dVaux_dVd); - dIgb2_dVb = T1 * (Vgb*Vaux*dT5_dVb + dVgb_dVb*Vaux*T5 + - Vgb*T5*dVaux_dVb); - if (selfheat) - dIgb2_dT = T1 * Vgb * (Vaux*dT5_dT + T5*dVaux_dT); - else dIgb2_dT = 0.0; - - -/* Igb1 dominates in inversion region, while Igb2 doninates in accumulation */ -/* v2.2.3 bug fix for residue at low Vgb */ - if (Vgb >= 0) - { - Igb = Igb1; - dIgb_dVg = dIgb1_dVg; - dIgb_dVd = dIgb1_dVd; - dIgb_dVb = dIgb1_dVb; - dIgb_dT = dIgb1_dT; - } - else - { - Igb = Igb2; - dIgb_dVg = dIgb2_dVg; - dIgb_dVd = dIgb2_dVd; - dIgb_dVb = dIgb2_dVb; - dIgb_dT = dIgb2_dT; - } - - - } - else { - Igb = 0.0; - dIgb_dVg = 0.0; - dIgb_dVd = 0.0; - dIgb_dVb = 0.0; - dIgb_dT = 0.0; - } - - here->B3SOIPDig = Igb; - here->B3SOIPDgigg = dIgb_dVg; - here->B3SOIPDgigd = dIgb_dVd; - here->B3SOIPDgigb = dIgb_dVb; - here->B3SOIPDgigs = -(dIgb_dVg + dIgb_dVd + dIgb_dVb); - here->B3SOIPDgigT = dIgb_dT; -/* end of v2.2 gate current */ - - - -/* calculate substrate current Iii */ - - if (pParam->B3SOIPDalpha0 <= 0.0) { - Giig = Giib = Giid = GiiT = 0.0; - here->B3SOIPDiii = Iii = 0.0; - } - else { - Vdsatii0 = pParam->B3SOIPDvdsatii0 * (1 + model->B3SOIPDtii * (TempRatio-1.0)) - - pParam->B3SOIPDlii / Leff; - if (selfheat) - dVdsatii0_dT = pParam->B3SOIPDvdsatii0 * model->B3SOIPDtii * dTempRatio_dT; - else - dVdsatii0_dT = 0; - - /* Calculate VgsStep */ - T0 = pParam->B3SOIPDesatii * Leff; - T1 = pParam->B3SOIPDsii0 * T0 / (1.0 + T0); - - T0 = 1 / (1 + pParam->B3SOIPDsii1 * Vgsteff); - if (selfheat) - dT0_dT = - pParam->B3SOIPDsii1 * T0 * T0 *dVgsteff_dT; - else - dT0_dT = 0; - T3 = T0 + pParam->B3SOIPDsii2; - T4 = Vgst * pParam->B3SOIPDsii1 * T0 * T0; - T2 = Vgst * T3; - dT2_dVg = T3 * dVgst_dVg - T4 * dVgsteff_dVg; - dT2_dVb = T3 * dVgst_dVb * dVbseff_dVb - T4 * dVgsteff_dVb; - dT2_dVd = T3 * dVgst_dVd - T4 * dVgsteff_dVd; - if (selfheat) - dT2_dT = -dVth_dT * T3 + Vgst * dT0_dT; - else dT2_dT = 0; - - T3 = 1 / (1 + pParam->B3SOIPDsiid * Vds); - dT3_dVd = - pParam->B3SOIPDsiid * T3 * T3; - - VgsStep = T1 * T2 * T3; - if (selfheat) - dVgsStep_dT = T1 * T3 * dT2_dT; - else dVgsStep_dT = 0; - Vdsatii = Vdsatii0 + VgsStep; - Vdiff = Vds - Vdsatii; - dVdiff_dVg = - T1 * T3 * dT2_dVg; - dVdiff_dVb = - T1 * T3 * dT2_dVb; - dVdiff_dVd = 1.0 - T1 * (T3 * dT2_dVd + T2 * dT3_dVd); - if (selfheat) - dVdiff_dT = -(dVdsatii0_dT + dVgsStep_dT); - else dVdiff_dT = 0; - - T0 = pParam->B3SOIPDbeta2 + pParam->B3SOIPDbeta1 * Vdiff - + pParam->B3SOIPDbeta0 * Vdiff * Vdiff; - if (T0 < 1e-5) - { - T0 = 1e-5; - dT0_dVg = dT0_dVd = dT0_dVb = dT0_dT = 0.0; - } - else - { - T1 = pParam->B3SOIPDbeta1 + 2 * pParam->B3SOIPDbeta0 * Vdiff; - dT0_dVg = T1 * dVdiff_dVg; - dT0_dVb = T1 * dVdiff_dVb; - dT0_dVd = T1 * dVdiff_dVd; - if (selfheat) - dT0_dT = T1 * dVdiff_dT; - else - dT0_dT = 0; - } - - if ((T0 < Vdiff / EXPL_THRESHOLD) && (Vdiff > 0.0)) { - Ratio = pParam->B3SOIPDalpha0 * MAX_EXPL; - dRatio_dVg = dRatio_dVb = dRatio_dVd = dRatio_dT = 0.0; - } - else if ((T0 < -Vdiff / EXPL_THRESHOLD) && (Vdiff < 0.0)) { - Ratio = pParam->B3SOIPDalpha0 * MIN_EXPL; - dRatio_dVg = dRatio_dVb = dRatio_dVd = dRatio_dT = 0.0; - } - else { - Ratio = pParam->B3SOIPDalpha0 * exp(Vdiff / T0); - T1 = Ratio / T0 / T0; - dRatio_dVg = T1 * (T0 * dVdiff_dVg - Vdiff * dT0_dVg); - dRatio_dVb = T1 * (T0 * dVdiff_dVb - Vdiff * dT0_dVb); - dRatio_dVd = T1 * (T0 * dVdiff_dVd - Vdiff * dT0_dVd); - if (selfheat) - dRatio_dT = T1 * (T0 * dVdiff_dT - Vdiff * dT0_dT); - else - dRatio_dT = 0; - } - - /* Avoid too high ratio */ - if (Ratio > 10.0) { - Ratio = 10.0; - dRatio_dVg = dRatio_dVb = dRatio_dVd = dRatio_dT = 0.0; - } - - T0 = Ids + pParam->B3SOIPDfbjtii * Ic; - here->B3SOIPDiii = Iii = Ratio * T0; - Giig = Ratio * Gm + T0 * dRatio_dVg; - Giib = Ratio * (Gmb + pParam->B3SOIPDfbjtii * Gcb) - + T0 * dRatio_dVb; - Giid = Ratio * (Gds + pParam->B3SOIPDfbjtii * Gcd) - + T0 * dRatio_dVd; - - if (selfheat) - GiiT = Ratio * (GmT + pParam->B3SOIPDfbjtii * GcT) - + T0 * dRatio_dT; - else - GiiT = 0.0; - - } - - /* Current through body resistor */ - /* Current going out is +ve */ - if ((here->B3SOIPDbodyMod == 0) || (here->B3SOIPDbodyMod == 2)) - { - Ibp = Gbpbs = Gbpps = 0.0; - } - else { /* here->B3SOIPDbodyMod == 1 */ - if (pParam->B3SOIPDrbody < 1e-30) - { - if (here->B3SOIPDrbodyext <= 1e-30) - T0 = 1.0 / 1e-30; - else - T0 = 1.0 / here->B3SOIPDrbodyext; - Ibp = Vbp * T0; - Gbpbs = T0 * dVbp_dVb; - Gbpps = -T0 * dVbp_dVb; - } else - { - Gbpbs = 1.0 / (pParam->B3SOIPDrbody + here->B3SOIPDrbodyext); - Ibp = Vbp * Gbpbs; - Gbpps = - Gbpbs; - } - } - - here->B3SOIPDibp = Ibp; - here->B3SOIPDgbpbs = Gbpbs; - here->B3SOIPDgbpps = Gbpps; - here->B3SOIPDgbpT = 0.0; - here->B3SOIPDcbodcon = Ibp - (Gbpbs * Vbs + Gbpps * Vps); - - - - /* Current going out of drainprime node into the drain of device */ - /* "node" means the SPICE circuit node */ - - here->B3SOIPDcdrain = Ids + Ic; - here->B3SOIPDcd = Ids + Ic - Ibd + Iii + Idgidl; - here->B3SOIPDcb = Ibs + Ibd + Ibp - Iii - Idgidl - Isgidl - Igb; - - here->B3SOIPDgds = Gds + Gcd; - here->B3SOIPDgm = Gm; - here->B3SOIPDgmbs = Gmb + Gcb; - if (selfheat) - here->B3SOIPDgmT = GmT + GcT; - else - here->B3SOIPDgmT = 0.0; - - /* note that sign is switched because power flows out - of device into the temperature node. - Currently ommit self-heating due to bipolar current - because it can cause convergence problem*/ - - here->B3SOIPDgtempg = -Gm * Vds; - here->B3SOIPDgtempb = -Gmb * Vds; - here->B3SOIPDgtempT = -GmT * Vds; - here->B3SOIPDgtempd = -Gds * Vds - Ids; - here->B3SOIPDcth = - Ids * Vds - model->B3SOIPDtype * - (here->B3SOIPDgtempg * Vgs + here->B3SOIPDgtempb * Vbs - + here->B3SOIPDgtempd * Vds) - - here->B3SOIPDgtempT * delTemp; - - /* Body current which flows into drainprime node from the drain of device */ - - here->B3SOIPDgjdb = Gjdb - Giib; - here->B3SOIPDgjdd = Gjdd - (Giid + Gdgidld); - here->B3SOIPDgjdg = - (Giig + Gdgidlg); - if (selfheat) here->B3SOIPDgjdT = GjdT - GiiT; - else here->B3SOIPDgjdT = 0.0; - here->B3SOIPDcjd = Ibd - Iii - Idgidl - - (here->B3SOIPDgjdb * Vbs + here->B3SOIPDgjdd * Vds - + here->B3SOIPDgjdg * Vgs + here->B3SOIPDgjdT * delTemp); - - /* Body current which flows into sourceprime node from the source of device */ - - here->B3SOIPDgjsb = Gjsb; - here->B3SOIPDgjsd = Gjsd; - here->B3SOIPDgjsg = - Gsgidlg; - if (selfheat) here->B3SOIPDgjsT = GjsT; - else here->B3SOIPDgjsT = 0.0; - here->B3SOIPDcjs = Ibs - Isgidl - - (here->B3SOIPDgjsb * Vbs + here->B3SOIPDgjsd * Vds - + here->B3SOIPDgjsg * Vgs + here->B3SOIPDgjsT * delTemp); - - /* Current flowing into body node */ - - here->B3SOIPDgbbs = Giib - Gjsb - Gjdb - Gbpbs; - here->B3SOIPDgbgs = Giig + Gdgidlg + Gsgidlg; - here->B3SOIPDgbds = Giid + Gdgidld - Gjsd - Gjdd; - here->B3SOIPDgbps = - Gbpps; - if (selfheat) here->B3SOIPDgbT = GiiT - GjsT - GjdT; - else here->B3SOIPDgbT = 0.0; - - - here->B3SOIPDcbody = Iii + Idgidl + Isgidl - Ibs - Ibd - Ibp + Igb - - ( (here->B3SOIPDgbbs + dIgb_dVb) * Vbs - + (here->B3SOIPDgbgs + dIgb_dVg) * Vgs - + (here->B3SOIPDgbds + dIgb_dVd) * Vds - + here->B3SOIPDgbps * Vps - + (here->B3SOIPDgbT + dIgb_dT) * delTemp); - - - here->B3SOIPDcgate = Igb - - (dIgb_dVb * Vbs + dIgb_dVg * Vgs + dIgb_dVd * Vds + dIgb_dT * delTemp); - - - /* Calculate Qinv for Noise analysis */ - - T1 = Vgsteff * (1.0 - 0.5 * Abulk * Vdseff / Vgst2Vtm); - here->B3SOIPDqinv = -model->B3SOIPDcox * pParam->B3SOIPDweff * Leff * T1; - - - /* Begin CV (charge) model */ - - if ((model->B3SOIPDxpart < 0) || (!ChargeComputationNeeded)) - { qgate = qdrn = qsrc = qbody = qsub = 0.0; /* v2.2.3 bug fix */ - here->B3SOIPDcggb = here->B3SOIPDcgsb = here->B3SOIPDcgdb = 0.0; - here->B3SOIPDcdgb = here->B3SOIPDcdsb = here->B3SOIPDcddb = 0.0; - here->B3SOIPDcbgb = here->B3SOIPDcbsb = here->B3SOIPDcbdb = 0.0; - goto finished; - } - else - { - CoxWL = model->B3SOIPDcox * (pParam->B3SOIPDweffCV / here->B3SOIPDnseg - * pParam->B3SOIPDleffCV + here->B3SOIPDagbcp); - CoxWLb = model->B3SOIPDfbody * model->B3SOIPDcox - * (pParam->B3SOIPDweffCV / here->B3SOIPDnseg - * pParam->B3SOIPDleffCVb + here->B3SOIPDagbcp); - - /* By using this Vgsteff,cv, discontinuity in moderate - inversion charges can be avoid. */ - - if ((VgstNVt > -EXPL_THRESHOLD) && (VgstNVt < EXPL_THRESHOLD)) - { ExpVgst *= ExpVgst; - ExpVgst *= exp( -(pParam->B3SOIPDdelvt / (n * Vtm))); - Vgsteff = n * Vtm * log(1.0 + ExpVgst); - T0 = ExpVgst / (1.0 + ExpVgst); - T1 = -T0 * (dVth_dVb + Vgst / n * dn_dVb) + Vgsteff / n * dn_dVb; - dVgsteff_dVd = -T0 * (dVth_dVd + Vgst / n * dn_dVd) - + Vgsteff / n * dn_dVd; - dVgsteff_dVg = T0 * dVgs_eff_dVg; - dVgsteff_dVb = T1 * dVbseff_dVb; - if (selfheat) - dVgsteff_dT = -T0 * (dVth_dT + (Vgst - pParam->B3SOIPDdelvt) / Temp) - + Vgsteff / Temp; - else dVgsteff_dT = 0.0; - } - - if (model->B3SOIPDcapMod == 2) - { - Vfb = Vth - phi - pParam->B3SOIPDk1eff * sqrtPhis + pParam->B3SOIPDdelvt; - dVfb_dVb = dVth_dVb - pParam->B3SOIPDk1eff * dsqrtPhis_dVb; - dVfb_dVd = dVth_dVd; - dVfb_dT = dVth_dT; - - V3 = Vfb - Vgs_eff + Vbseff - DELTA_3_SOI; - if (Vfb <= 0.0) - { T0 = sqrt(V3 * V3 - 4.0 * DELTA_3_SOI * Vfb); - T2 = -DELTA_3_SOI / T0; - } - else - { T0 = sqrt(V3 * V3 + 4.0 * DELTA_3_SOI * Vfb); - T2 = DELTA_3_SOI / T0; - } - - T1 = 0.5 * (1.0 + V3 / T0); - Vfbeff = Vfb - 0.5 * (V3 + T0); - dVfbeff_dVd = (1.0 - T1 - T2) * dVfb_dVd; - dVfbeff_dVb = (1.0 - T1 - T2) * dVfb_dVb - T1; - dVfbeff_dVrg = T1 * dVgs_eff_dVg; - if (selfheat) dVfbeff_dT = (1.0 - T1 - T2) * dVfb_dT; - else dVfbeff_dT = 0.0; - - Qac0 = CoxWLb * (Vfbeff - Vfb); - dQac0_dVrg = CoxWLb * dVfbeff_dVrg; - dQac0_dVd = CoxWLb * (dVfbeff_dVd - dVfb_dVd); - dQac0_dVb = CoxWLb * (dVfbeff_dVb - dVfb_dVb); - if (selfheat) dQac0_dT = CoxWLb * (dVfbeff_dT - dVfb_dT); - else dQac0_dT = 0.0; - - T0 = 0.5 * K1; - T3 = Vgs_eff - Vfbeff - Vbseff - Vgsteff; - if (pParam->B3SOIPDk1eff == 0.0) - { T1 = 0.0; - T2 = 0.0; - } - else if (T3 < 0.0) - { T1 = T0 + T3 / pParam->B3SOIPDk1eff; - T2 = CoxWLb; - } - else - { T1 = sqrt(T0 * T0 + T3); - T2 = CoxWLb * T0 / T1; - } - - Qsub0 = CoxWLb * K1 * (T1 - T0); - dQsub0_dVrg = T2 * (dVgs_eff_dVg - dVfbeff_dVrg); - dQsub0_dVg = -T2; - dQsub0_dVd = -T2 * dVfbeff_dVd; - dQsub0_dVb = -T2 * (dVfbeff_dVb + 1); - if (selfheat) dQsub0_dT = -T2 * dVfbeff_dT; - else dQsub0_dT = 0.0; - - AbulkCV = Abulk0 * pParam->B3SOIPDabulkCVfactor; - dAbulkCV_dVb = pParam->B3SOIPDabulkCVfactor * dAbulk0_dVb; - - VdsatCV = Vgsteff / AbulkCV; - dVdsatCV_dVg = 1.0 / AbulkCV; - dVdsatCV_dVb = -VdsatCV * dAbulkCV_dVb / AbulkCV; - - V4 = VdsatCV - Vds - DELTA_4; - T0 = sqrt(V4 * V4 + 4.0 * DELTA_4 * VdsatCV); - VdseffCV = VdsatCV - 0.5 * (V4 + T0); - T1 = 0.5 * (1.0 + V4 / T0); - T2 = DELTA_4 / T0; - T3 = (1.0 - T1 - T2) / AbulkCV; - dVdseffCV_dVg = T3; - dVdseffCV_dVd = T1; - dVdseffCV_dVb = -T3 * VdsatCV * dAbulkCV_dVb; - - T0 = AbulkCV * VdseffCV; - T1 = 12.0 * (Vgsteff - 0.5 * T0 + 1e-20); - T2 = VdseffCV / T1; - T3 = T0 * T2; - T4 = (1.0 - 12.0 * T2 * T2 * AbulkCV); - T5 = (6.0 * T0 * (4.0 * Vgsteff- T0) / (T1 * T1) - 0.5); - T6 = 12.0 * T2 * T2 * Vgsteff; - - T7 = 1.0 - AbulkCV; - qbulk = CoxWLb * T7 * (0.5 * VdseffCV - T3); - T4 = -T7 * (T4 - 1.0); - T5 = -T7 * T5; - T6 = -(T7 * T6 + (0.5 * VdseffCV - T3)); - - Cbg1 = CoxWLb * (T4 + T5 * dVdseffCV_dVg); - Cbd1 = CoxWLb * T5 * dVdseffCV_dVd ; - Cbb1 = CoxWLb * (T5 * dVdseffCV_dVb + T6 * dAbulkCV_dVb); - - /* Total inversion charge */ - T0 = AbulkCV * VdseffCV; - T1 = 12.0 * (Vgsteff - 0.5 * T0 + 1e-20); - T2 = VdseffCV / T1; - T3 = T0 * T2; - - T4 = (1.0 - 12.0 * T2 * T2 * AbulkCV); - T5 = (6.0 * T0 * (4.0 * Vgsteff - T0) / (T1 * T1) - 0.5); - T6 = 12.0 * T2 * T2 * Vgsteff; - - qinv = CoxWL * (Vgsteff - 0.5 * VdseffCV + T3); - Cgg1 = CoxWL * (T4 + T5 * dVdseffCV_dVg); - Cgd1 = CoxWL * T5 * dVdseffCV_dVd; - Cgb1 = CoxWL * (T5 * dVdseffCV_dVb + T6 * dAbulkCV_dVb); - - /* Inversion charge partitioning into S / D */ - if (model->B3SOIPDxpart > 0.5) - { /* 0/100 Charge partition model */ - T1 = T1 + T1; - qsrc = -CoxWL * (0.5 * Vgsteff + 0.25 * T0 - - T0 * T0 / T1); - T7 = (4.0 * Vgsteff - T0) / (T1 * T1); - T4 = -(0.5 + 24.0 * T0 * T0 / (T1 * T1)); - T5 = -(0.25 * AbulkCV - 12.0 * AbulkCV * T0 * T7); - T6 = -(0.25 * VdseffCV - 12.0 * T0 * VdseffCV * T7); - Csg1 = CoxWL * (T4 + T5 * dVdseffCV_dVg); - Csd1 = CoxWL * T5 * dVdseffCV_dVd; - Csb1 = CoxWL * (T5 * dVdseffCV_dVb + T6 * dAbulkCV_dVb); - - } - else if (model->B3SOIPDxpart < 0.5) - { /* 40/60 Charge partition model */ - T1 = T1 / 12.0; - T2 = 0.5 * CoxWL / (T1 * T1); - T3 = Vgsteff * (2.0 * T0 * T0 / 3.0 + Vgsteff - * (Vgsteff - 4.0 * T0 / 3.0)) - - 2.0 * T0 * T0 * T0 / 15.0; - qsrc = -T2 * T3; - T7 = 4.0 / 3.0 * Vgsteff * (Vgsteff - T0) - + 0.4 * T0 * T0; - T4 = -2.0 * qsrc / T1 - T2 * (Vgsteff * (3.0 - * Vgsteff - 8.0 * T0 / 3.0) - + 2.0 * T0 * T0 / 3.0); - T5 = (qsrc / T1 + T2 * T7) * AbulkCV; - T6 = (qsrc / T1 * VdseffCV + T2 * T7 * VdseffCV); - Csg1 = T4 + T5 * dVdseffCV_dVg; - Csd1 = T5 * dVdseffCV_dVd; - Csb1 = T5 * dVdseffCV_dVb + T6 * dAbulkCV_dVb; - } - else - { /* 50/50 Charge partition model */ - qsrc = - 0.5 * (qinv + qbulk); - Csg1 = - 0.5 * (Cgg1 + Cbg1); - Csb1 = - 0.5 * (Cgb1 + Cbb1); - Csd1 = - 0.5 * (Cgd1 + Cbd1); - } - - /* Backgate charge */ - CboxWL = pParam->B3SOIPDkb1 * model->B3SOIPDfbody * Cbox - * (pParam->B3SOIPDweffCV / here->B3SOIPDnseg - * pParam->B3SOIPDleffCVbg + here->B3SOIPDaebcp); - Qe1 = CboxWL * (Vesfb - Vbs); - dQe1_dVb = -CboxWL; - dQe1_dVe = CboxWL; - if (selfheat) dQe1_dT = -CboxWL * dvfbb_dT; - else dQe1_dT = 0; - - qgate = qinv + Qac0 + Qsub0; - qbody = (qbulk - Qac0 - Qsub0 - Qe1); - qsub = Qe1; - qdrn = -(qgate + qsrc + qbody + qsub); - - /* This transform all the dependency on Vgsteff, Vbseff - into real ones */ - Ce1b = dQe1_dVb; - Ce1e = dQe1_dVe; - - Csg = Csg1 * dVgsteff_dVg; - Csd = Csd1 + Csg1 * dVgsteff_dVd; - Csb = Csg1 * dVgsteff_dVb + Csb1 * dVbseff_dVb; - if (selfheat) CsT = Csg1 * dVgsteff_dT; - else CsT = 0.0; - - Cgg = (Cgg1 + dQsub0_dVg) * dVgsteff_dVg - + dQac0_dVrg + dQsub0_dVrg; - Cgd = (Cgg1 + dQsub0_dVg) * dVgsteff_dVd + Cgd1 - + dQac0_dVd + dQsub0_dVd; - Cgb = (Cgg1 + dQsub0_dVg) * dVgsteff_dVb - + (Cgb1 + dQsub0_dVb + dQac0_dVb) * dVbseff_dVb; - if (selfheat) - CgT = (Cgg1 + dQsub0_dVg) * dVgsteff_dT - + dQac0_dT + dQsub0_dT; - else CgT = 0.0; - - Cbg = (Cbg1 - dQsub0_dVg) * dVgsteff_dVg - - dQac0_dVrg - dQsub0_dVrg; - Cbd = (Cbg1 - dQsub0_dVg) * dVgsteff_dVd + Cbd1 - - dQac0_dVd - dQsub0_dVd; - Cbb = (Cbg1 - dQsub0_dVg) * dVgsteff_dVb - dQe1_dVb - + (Cbb1 - dQsub0_dVb - dQac0_dVb) * dVbseff_dVb; - if (selfheat) - CbT = (Cbg1 - dQsub0_dVg) * dVgsteff_dT - - dQac0_dT - dQsub0_dT - dQe1_dT; - else CbT = 0.0; - - here->B3SOIPDcggb = Cgg ; - here->B3SOIPDcgsb = - (Cgg + Cgd + Cgb); - here->B3SOIPDcgdb = Cgd; - here->B3SOIPDcgT = CgT; - - here->B3SOIPDcbgb = Cbg; - here->B3SOIPDcbsb = -(Cbg + Cbd + Cbb) - + Ce1e; - here->B3SOIPDcbdb = Cbd; - here->B3SOIPDcbeb = - Ce1e ; - here->B3SOIPDcbT = CbT; - - here->B3SOIPDceeb = Ce1e ; - here->B3SOIPDceT = dQe1_dT; - - here->B3SOIPDcdgb = -(Cgg + Cbg + Csg); - here->B3SOIPDcddb = -(Cgd + Cbd + Csd); - here->B3SOIPDcdeb = 0; - here->B3SOIPDcdT = -(CgT + CbT + CsT) - dQe1_dT; - here->B3SOIPDcdsb = (Cgg + Cgd + Cgb - + Cbg + Cbd + Cbb - + Csg + Csd + Csb) + Ce1b; - } /* End of if capMod == 2 */ - - else if (model->B3SOIPDcapMod == 3) - { - dVgsteff_dVb /= dVbseff_dVb; - - if (selfheat) { - Vfbzb = Vthzb - phi - pParam->B3SOIPDk1eff * sqrtPhi - + pParam->B3SOIPDdelvt; - dVfbzb_dT = dVthzb_dT; - } - else { - Vfbzb = pParam->B3SOIPDvfbzb + pParam->B3SOIPDdelvt; - dVfbzb_dT = 0; - } - - V3 = Vfbzb - Vgs_eff + Vbseff - DELTA_3; - if (Vfbzb <= 0.0) - { T0 = sqrt(V3 * V3 - 4.0 * DELTA_3 * Vfbzb); - T2 = -DELTA_3 / T0; - } - else - { T0 = sqrt(V3 * V3 + 4.0 * DELTA_3 * Vfbzb); - T2 = DELTA_3 / T0; - } - - T1 = 0.5 * (1.0 + V3 / T0); - Vfbeff = Vfbzb - 0.5 * (V3 + T0); - dVfbeff_dVg = T1 * dVgs_eff_dVg; - dVfbeff_dVb = -T1; - if (selfheat) dVfbeff_dT = (1.0 - T1 - T2) * dVfbzb_dT; - else dVfbeff_dT = 0.0; - -/* v2.2.3 */ - Cox = 3.453133e-11 / (model->B3SOIPDtox - model->B3SOIPDdtoxcv); - CoxWL *= model->B3SOIPDtox/ (model->B3SOIPDtox - model->B3SOIPDdtoxcv); - CoxWLb *= model->B3SOIPDtox/ (model->B3SOIPDtox - model->B3SOIPDdtoxcv); - Tox = 1.0e8 * (model->B3SOIPDtox - model->B3SOIPDdtoxcv); - - T0 = (Vgs_eff - Vbseff - Vfbzb) / Tox; - dT0_dVg = dVgs_eff_dVg / Tox; - dT0_dVb = -1.0 / Tox; - - tmp = T0 * pParam->B3SOIPDacde; - if ((-EXPL_THRESHOLD < tmp) && (tmp < EXPL_THRESHOLD)) - { Tcen = pParam->B3SOIPDldeb * exp(tmp); - dTcen_dVg = pParam->B3SOIPDacde * Tcen; - dTcen_dVb = dTcen_dVg * dT0_dVb; - dTcen_dVg *= dT0_dVg; - if (selfheat) - dTcen_dT = -Tcen * pParam->B3SOIPDacde * dVfbzb_dT / Tox; - else dTcen_dT = 0; - } - else if (tmp <= -EXPL_THRESHOLD) - { Tcen = pParam->B3SOIPDldeb * MIN_EXPL; - dTcen_dVg = dTcen_dVb = dTcen_dT = 0.0; - } - else - { Tcen = pParam->B3SOIPDldeb * MAX_EXPL; - dTcen_dVg = dTcen_dVb = dTcen_dT = 0.0; - } - - LINK = 1.0e-3 * (model->B3SOIPDtox - model->B3SOIPDdtoxcv); /* v2.2.3 */ - V3 = pParam->B3SOIPDldeb - Tcen - LINK; - V4 = sqrt(V3 * V3 + 4.0 * LINK * pParam->B3SOIPDldeb); - Tcen = pParam->B3SOIPDldeb - 0.5 * (V3 + V4); - T1 = 0.5 * (1.0 + V3 / V4); - dTcen_dVg *= T1; - dTcen_dVb *= T1; - if (selfheat) - dTcen_dT *= T1; - else dTcen_dT = 0; - - Ccen = EPSSI / Tcen; - T2 = Cox / (Cox + Ccen); - Coxeff = T2 * Ccen; - T3 = -Ccen / Tcen; - dCoxeff_dVg = T2 * T2 * T3; - dCoxeff_dVb = dCoxeff_dVg * dTcen_dVb; - dCoxeff_dVg *= dTcen_dVg; - if (selfheat) - dCoxeff_dT = T3 * dTcen_dT * (T2 - Coxeff / (Cox + Ccen)); - else dCoxeff_dT = 0; - CoxWLcenb = CoxWLb * Coxeff / Cox; - if (selfheat) - dCoxWLcenb_dT = CoxWLb * dCoxeff_dT / Cox; - else dCoxWLcenb_dT = 0; - - Qac0 = CoxWLcenb * (Vfbeff - Vfbzb); - QovCox = Qac0 / Coxeff; - dQac0_dVg = CoxWLcenb * dVfbeff_dVg - + QovCox * dCoxeff_dVg; - dQac0_dVb = CoxWLcenb * dVfbeff_dVb - + QovCox * dCoxeff_dVb; - if (selfheat) dQac0_dT = CoxWLcenb * (dVfbeff_dT - dVfbzb_dT) - + dCoxWLcenb_dT * (Vfbeff - Vfbzb); - else dQac0_dT = 0.0; - - T0 = 0.5 * pParam->B3SOIPDk1eff; - T3 = Vgs_eff - Vfbeff - Vbseff - Vgsteff; - if (pParam->B3SOIPDk1eff == 0.0) - { T1 = 0.0; - T2 = 0.0; - } - else if (T3 < 0.0) - { T1 = T0 + T3 / pParam->B3SOIPDk1eff; - T2 = CoxWLcenb; - } - else - { T1 = sqrt(T0 * T0 + T3); - T2 = CoxWLcenb * T0 / T1; - } - - Qsub0 = CoxWLcenb * pParam->B3SOIPDk1eff * (T1 - T0); - QovCox = Qsub0 / Coxeff; - dQsub0_dVg = T2 * (dVgs_eff_dVg - dVfbeff_dVg - dVgsteff_dVg) - + QovCox * dCoxeff_dVg; - dQsub0_dVd = -T2 * dVgsteff_dVd; - dQsub0_dVb = -T2 * (dVfbeff_dVb + 1 + dVgsteff_dVb) - + QovCox * dCoxeff_dVb; - if (selfheat) - dQsub0_dT = -T2 * (dVfbeff_dT + dVgsteff_dT) - + dCoxWLcenb_dT * pParam->B3SOIPDk1eff * (T1 - T0); - else dQsub0_dT = 0.0; - - /* Gate-bias dependent delta Phis begins */ - if (pParam->B3SOIPDk1eff <= 0.0) - { Denomi = 0.25 * pParam->B3SOIPDmoin * Vtm; - T0 = 0.5 * pParam->B3SOIPDsqrtPhi; - } - else - { Denomi = pParam->B3SOIPDmoin * Vtm - * pParam->B3SOIPDk1eff * pParam->B3SOIPDk1eff; - T0 = pParam->B3SOIPDk1eff * pParam->B3SOIPDsqrtPhi; - } - T1 = 2.0 * T0 + Vgsteff; - - DeltaPhi = Vtm * log(1.0 + T1 * Vgsteff / Denomi); - dDeltaPhi_dVg = 2.0 * Vtm * (T1 -T0) / (Denomi + T1 * Vgsteff); - dDeltaPhi_dVd = dDeltaPhi_dVg * dVgsteff_dVd; - dDeltaPhi_dVb = dDeltaPhi_dVg * dVgsteff_dVb; - /* End of delta Phis */ - - T3 = 4.0 * (Vth - Vfbzb - phi); - Tox += Tox; - if ((T0 = (Vgsteff + T3) / Tox) > 1e-20) { - tmp = exp(0.7 * log(T0)); - T1 = 1.0 + tmp; - T2 = 0.7 * tmp / (T0 * Tox); - Tcen = 1.9e-9 / T1; - dTcen_dVg = -1.9e-9 * T2 / T1 /T1; - dTcen_dVd = dTcen_dVg * (4.0 * dVth_dVd + dVgsteff_dVd); - dTcen_dVb = dTcen_dVg * (4.0 * dVth_dVb + dVgsteff_dVb); - dTcen_dVg *= dVgsteff_dVg; - if (selfheat) - dTcen_dT = -Tcen * T2 / T1 - * (4.0 * (dVth_dT - dVfbzb_dT) + dVgsteff_dT); - else dTcen_dT = 0; - } - else { - T0 = 1e-20; - tmp = exp(0.7 * log(T0)); - T1 = 1.0 + tmp; - T2 = 0.7 * tmp / (T0 * Tox); - Tcen = 1.9e-9 / T1; - dTcen_dVg = 0; - dTcen_dVd = 0; - dTcen_dVb = 0; - dTcen_dT = 0; - } - - Ccen = EPSSI / Tcen; - T0 = Cox / (Cox + Ccen); - Coxeff = T0 * Ccen; - T1 = -Ccen / Tcen; - dCoxeff_dVg = T0 * T0 * T1; - dCoxeff_dVd = dCoxeff_dVg * dTcen_dVd; - dCoxeff_dVb = dCoxeff_dVg * dTcen_dVb; - dCoxeff_dVg *= dTcen_dVg; - if (selfheat) - dCoxeff_dT = T1 * dTcen_dT * (T0 - Coxeff / (Cox + Ccen)); - else dCoxeff_dT = 0; - CoxWLcen = CoxWL * Coxeff / Cox; - CoxWLcenb = CoxWLb * Coxeff / Cox; - - AbulkCV = Abulk0 * pParam->B3SOIPDabulkCVfactor; - dAbulkCV_dVb = pParam->B3SOIPDabulkCVfactor * dAbulk0_dVb; - VdsatCV = (Vgsteff - DeltaPhi) / AbulkCV; - V4 = VdsatCV - Vds - DELTA_4; - T0 = sqrt(V4 * V4 + 4.0 * DELTA_4 * VdsatCV); - VdseffCV = VdsatCV - 0.5 * (V4 + T0); - T1 = 0.5 * (1.0 + V4 / T0); - T2 = DELTA_4 / T0; - T3 = (1.0 - T1 - T2) / AbulkCV; - T4 = T3 * ( 1.0 - dDeltaPhi_dVg); - dVdseffCV_dVg = T4; - dVdseffCV_dVd = T1; - dVdseffCV_dVb = -T3 * VdsatCV * dAbulkCV_dVb; - - T0 = AbulkCV * VdseffCV; - T1 = Vgsteff - DeltaPhi; - T2 = 12.0 * (T1 - 0.5 * T0 + 1.0e-20); - T3 = T0 / T2; - T4 = 1.0 - 12.0 * T3 * T3; - T5 = AbulkCV * (6.0 * T0 * (4.0 * T1 - T0) / (T2 * T2) - 0.5); - T6 = T5 * VdseffCV / AbulkCV; - - qinv = qgate = qinoi = CoxWLcen * (T1 - T0 * (0.5 - T3)); - QovCox = qgate / Coxeff; - Cgg1 = CoxWLcen * (T4 * (1.0 - dDeltaPhi_dVg) - + T5 * dVdseffCV_dVg); - Cgd1 = CoxWLcen * T5 * dVdseffCV_dVd + Cgg1 - * dVgsteff_dVd + QovCox * dCoxeff_dVd; - Cgb1 = CoxWLcen * (T5 * dVdseffCV_dVb + T6 * dAbulkCV_dVb) - + Cgg1 * dVgsteff_dVb + QovCox * dCoxeff_dVb; - Cgg1 = Cgg1 * dVgsteff_dVg + QovCox * dCoxeff_dVg; - - T7 = 1.0 - AbulkCV; - T8 = T2 * T2; - T9 = 12.0 * T7 * T0 * T0 / (T8 * AbulkCV); - T10 = T9 * (1.0 - dDeltaPhi_dVg); - T11 = -T7 * T5 / AbulkCV; - T12 = -(T9 * T1 / AbulkCV + VdseffCV * (0.5 - T0 / T2)); - - qbulk = CoxWLcenb * T7 * (0.5 * VdseffCV - T0 * VdseffCV / T2); - QovCox = qbulk / Coxeff; - Cbg1 = CoxWLcenb * (T10 + T11 * dVdseffCV_dVg); - Cbd1 = CoxWLcenb * T11 * dVdseffCV_dVd + Cbg1 - * dVgsteff_dVd + QovCox * dCoxeff_dVd; - Cbb1 = CoxWLcenb * (T11 * dVdseffCV_dVb + T12 * dAbulkCV_dVb) - + Cbg1 * dVgsteff_dVb + QovCox * dCoxeff_dVb; - Cbg1 = Cbg1 * dVgsteff_dVg + QovCox * dCoxeff_dVg; - - if (model->B3SOIPDxpart > 0.5) - { /* 0/100 partition */ - qsrc = -CoxWLcen * (T1 / 2.0 + T0 / 4.0 - - 0.5 * T0 * T0 / T2); - QovCox = qsrc / Coxeff; - T2 += T2; - T3 = T2 * T2; - T7 = -(0.25 - 12.0 * T0 * (4.0 * T1 - T0) / T3); - T4 = -(0.5 + 24.0 * T0 * T0 / T3) * (1.0 - dDeltaPhi_dVg); - T5 = T7 * AbulkCV; - T6 = T7 * VdseffCV; - - Csg = CoxWLcen * (T4 + T5 * dVdseffCV_dVg); - Csd = CoxWLcen * T5 * dVdseffCV_dVd + Csg * dVgsteff_dVd - + QovCox * dCoxeff_dVd; - Csb = CoxWLcen * (T5 * dVdseffCV_dVb + T6 * dAbulkCV_dVb) - + Csg * dVgsteff_dVb + QovCox * dCoxeff_dVb; - Csg = Csg * dVgsteff_dVg + QovCox * dCoxeff_dVg; - } - else if (model->B3SOIPDxpart < 0.5) - { /* 40/60 partition */ - T2 = T2 / 12.0; - T3 = 0.5 * CoxWLcen / (T2 * T2); - T4 = T1 * (2.0 * T0 * T0 / 3.0 + T1 * (T1 - 4.0 - * T0 / 3.0)) - 2.0 * T0 * T0 * T0 / 15.0; - qsrc = -T3 * T4; - QovCox = qsrc / Coxeff; - T8 = 4.0 / 3.0 * T1 * (T1 - T0) + 0.4 * T0 * T0; - T5 = -2.0 * qsrc / T2 - T3 * (T1 * (3.0 * T1 - 8.0 - * T0 / 3.0) + 2.0 * T0 * T0 / 3.0); - T6 = AbulkCV * (qsrc / T2 + T3 * T8); - T7 = T6 * VdseffCV / AbulkCV; - - Csg = T5 * (1.0 - dDeltaPhi_dVg) + T6 * dVdseffCV_dVg; - Csd = Csg * dVgsteff_dVd + T6 * dVdseffCV_dVd - + QovCox * dCoxeff_dVd; - Csb = Csg * dVgsteff_dVb + T6 * dVdseffCV_dVb - + T7 * dAbulkCV_dVb + QovCox * dCoxeff_dVb; - Csg = Csg * dVgsteff_dVg + QovCox * dCoxeff_dVg; - } - else - { /* 50/50 partition */ - qsrc = -0.5 * qgate; - Csg = -0.5 * Cgg1; - Csd = -0.5 * Cgd1; - Csb = -0.5 * Cgb1; - } - - /* Backgate charge */ - CboxWL = pParam->B3SOIPDkb1 * model->B3SOIPDfbody * Cbox - * (pParam->B3SOIPDweffCV / here->B3SOIPDnseg - * pParam->B3SOIPDleffCVbg + here->B3SOIPDaebcp); - Qe1 = CboxWL * (Vesfb - Vbs); - Ce1b = dQe1_dVb = -CboxWL; - Ce1e = dQe1_dVe = CboxWL; - if (selfheat) Ce1T = dQe1_dT = -CboxWL * dvfbb_dT; - else Ce1T = dQe1_dT = 0.0; - - qgate += Qac0 + Qsub0 - qbulk; - qbody = qbulk - Qac0 - Qsub0 - Qe1; - qsub = Qe1; - qdrn = -(qgate + qbody + qsub + qsrc); - - Cbg = Cbg1 - dQac0_dVg - dQsub0_dVg; - Cbd = Cbd1 - dQsub0_dVd; - Cbb = Cbb1 - dQac0_dVb - dQsub0_dVb - Ce1b / dVbseff_dVb; - if (selfheat) - CbT = Cbg1 * dVgsteff_dT - dQac0_dT - - dQsub0_dT - dQe1_dT; - else CbT = 0.0; - - Cgg = Cgg1 - Cbg; - Cgd = Cgd1 - Cbd; - Cgb = Cgb1 - Cbb - Ce1b / dVbseff_dVb; - if (selfheat) - CgT = Cgg1 * dVgsteff_dT + dQac0_dT - + dQsub0_dT; - else CgT = 0.0; - - Cgb *= dVbseff_dVb; - Cbb *= dVbseff_dVb; - Csb *= dVbseff_dVb; - if (selfheat) CsT = Csg * dVgsteff_dT; - else CsT = 0.0; - - here->B3SOIPDcggb = Cgg; - here->B3SOIPDcgsb = -(Cgg + Cgd + Cgb); - here->B3SOIPDcgdb = Cgd; - here->B3SOIPDcgT = CgT; - - here->B3SOIPDcbgb = Cbg; - here->B3SOIPDcbsb = -(Cbg + Cbd + Cbb) - + Ce1e; - here->B3SOIPDcbdb = Cbd; - here->B3SOIPDcbeb = -Ce1e; - here->B3SOIPDcbT = CbT; - - here->B3SOIPDceT = Ce1T; - here->B3SOIPDceeb = Ce1e ; - - here->B3SOIPDcdgb = -(Cgg + Cbg + Csg); - here->B3SOIPDcddb = -(Cgd + Cbd + Csd); - here->B3SOIPDcdeb = 0; - here->B3SOIPDcdT = -(CgT+CbT+CsT) - Ce1T; - here->B3SOIPDcdsb = (Cgg + Cgd + Cgb + Cbg + Cbd + Cbb - + Csg + Csd + Csb) + Ce1b; - here->B3SOIPDqinv = -qinoi; - - } /* End of if capMod ==3 */ - } - - - finished: /* returning Values to Calling Routine */ - /* - * COMPUTE EQUIVALENT DRAIN CURRENT SOURCE - */ - if (ChargeComputationNeeded) - { - /* Intrinsic S/D junction charge */ - PhiBSWG = model->B3SOIPDGatesidewallJctPotential; - dPhiBSWG_dT = -model->B3SOIPDtpbswg; - PhiBSWG += dPhiBSWG_dT * (Temp - model->B3SOIPDtnom); - MJSWG = model->B3SOIPDbodyJctGateSideGradingCoeff; - - cjsbs = model->B3SOIPDunitLengthGateSidewallJctCap - * wdiosCV * model->B3SOIPDtsi / 1e-7; - dcjsbs_dT = cjsbs * model->B3SOIPDtcjswg; - cjsbs += dcjsbs_dT * (Temp - model->B3SOIPDtnom); - - cjdbs = model->B3SOIPDunitLengthGateSidewallJctCap - * wdiodCV * model->B3SOIPDtsi / 1e-7; - dcjdbs_dT = cjdbs * model->B3SOIPDtcjswg; - cjdbs += dcjdbs_dT * (Temp - model->B3SOIPDtnom); - - DioMax = 0.9 * (PhiBSWG); - - arg = 1.0 - (Vbs > DioMax ? DioMax : Vbs) / PhiBSWG; - - if (selfheat) - darg_dT = (1 - arg) / PhiBSWG * dPhiBSWG_dT; - - if (MJSWG == 0.5) { - dT3_dVb = 1.0 / sqrt(arg); - - if (selfheat) ddT3_dVb_dT = -0.5 * dT3_dVb / arg * darg_dT; - } - else { - dT3_dVb = exp(-MJSWG * log(arg)); - - if (selfheat) ddT3_dVb_dT = -MJSWG * dT3_dVb / arg * darg_dT; - } - T3 = (1.0 - arg * dT3_dVb) * PhiBSWG / (1.0 - MJSWG); - - if (selfheat) - dT3_dT = (1.0 - arg * dT3_dVb) * dPhiBSWG_dT / (1.0 - MJSWG) - - (arg * ddT3_dVb_dT + darg_dT * dT3_dVb) * PhiBSWG / (1.0 - MJSWG); - - if (Vbs > DioMax) - T3 += dT3_dVb * (Vbs - DioMax); - - qjs = cjsbs * T3 + model->B3SOIPDtt * Ibsdif; - gcjsbs = cjsbs * dT3_dVb + model->B3SOIPDtt * dIbsdif_dVb; - - if (selfheat) - gcjsT = model->B3SOIPDtt * dIbsdif_dT + dcjsbs_dT * T3 + dT3_dT * cjsbs; - else gcjsT = 0.0; - - - arg = 1.0 - (Vbd > DioMax ? DioMax : Vbd) / PhiBSWG; - - if (selfheat) - darg_dT = (1 - arg) / PhiBSWG * dPhiBSWG_dT; - - if (MJSWG == 0.5) { - dT3_dVb = 1.0 / sqrt(arg); - - if (selfheat) ddT3_dVb_dT = -0.5 * dT3_dVb / arg * darg_dT; - } - else { - dT3_dVb = exp(-MJSWG * log(arg)); - - if (selfheat) ddT3_dVb_dT = -MJSWG * dT3_dVb / arg * darg_dT; - } - T3 = (1.0 - arg * dT3_dVb) * PhiBSWG / (1.0 - MJSWG); - - if (selfheat) - dT3_dT = (1.0 - arg * dT3_dVb) * dPhiBSWG_dT / (1.0 - MJSWG) - - (arg * ddT3_dVb_dT + darg_dT * dT3_dVb) * PhiBSWG / (1.0 - MJSWG); - - if (Vbd > DioMax) - T3 += dT3_dVb * (Vbd - DioMax); - - dT3_dVd = -dT3_dVb; - - qjd = cjdbs * T3 + model->B3SOIPDtt * Ibddif; - gcjdbs = cjdbs * dT3_dVb + model->B3SOIPDtt * dIbddif_dVb; - gcjdds = cjdbs * dT3_dVd + model->B3SOIPDtt * dIbddif_dVd; - - if (selfheat) - gcjdT = model->B3SOIPDtt * dIbddif_dT + dcjdbs_dT * T3 + dT3_dT * cjdbs; - else gcjdT = 0.0; - - - qdrn -= qjd; - qbody += (qjs + qjd); - qsrc = -(qgate + qbody + qdrn + qsub); - - /* Update the conductance */ - here->B3SOIPDcddb -= gcjdds; - here->B3SOIPDcdT -= gcjdT; - here->B3SOIPDcdsb += gcjdds + gcjdbs; - - here->B3SOIPDcbdb += (gcjdds); - here->B3SOIPDcbT += (gcjdT + gcjsT); - here->B3SOIPDcbsb -= (gcjdds + gcjdbs + gcjsbs); - - - /* Extrinsic Bottom S/D to substrate charge */ - T10 = -model->B3SOIPDtype * ves; - /* T10 is vse without type conversion */ - T11 = model->B3SOIPDtype * (vds - ves); - /* T11 is vde without type conversion */ - - if (model->B3SOIPDcsdmin != 0.0) - { - if ( ((pParam->B3SOIPDnsub > 0) && (model->B3SOIPDtype > 0)) || - ((pParam->B3SOIPDnsub < 0) && (model->B3SOIPDtype < 0)) ) - { - if (T10 < pParam->B3SOIPDvsdfb) - { here->B3SOIPDqse = here->B3SOIPDcsbox * (T10 - pParam->B3SOIPDvsdfb); - here->B3SOIPDgcse = here->B3SOIPDcsbox; - } - else if (T10 < pParam->B3SOIPDsdt1) - { T0 = T10 - pParam->B3SOIPDvsdfb; - T1 = T0 * T0; - here->B3SOIPDqse = T0 * (here->B3SOIPDcsbox - - pParam->B3SOIPDst2 / 3 * T1) ; - here->B3SOIPDgcse = here->B3SOIPDcsbox - pParam->B3SOIPDst2 * T1; - } - else if (T10 < pParam->B3SOIPDvsdth) - { T0 = T10 - pParam->B3SOIPDvsdth; - T1 = T0 * T0; - here->B3SOIPDqse = here->B3SOIPDcsmin * T10 + here->B3SOIPDst4 + - pParam->B3SOIPDst3 / 3 * T0 * T1; - here->B3SOIPDgcse = here->B3SOIPDcsmin + pParam->B3SOIPDst3 * T1; - } - else - { here->B3SOIPDqse = here->B3SOIPDcsmin * T10 + here->B3SOIPDst4; - here->B3SOIPDgcse = here->B3SOIPDcsmin; - } - } else - { - if (T10 < pParam->B3SOIPDvsdth) - { here->B3SOIPDqse = here->B3SOIPDcsmin * (T10 - pParam->B3SOIPDvsdth); - here->B3SOIPDgcse = here->B3SOIPDcsmin; - } - else if (T10 < pParam->B3SOIPDsdt1) - { T0 = T10 - pParam->B3SOIPDvsdth; - T1 = T0 * T0; - here->B3SOIPDqse = T0 * (here->B3SOIPDcsmin - pParam->B3SOIPDst2 / 3 * T1) ; - here->B3SOIPDgcse = here->B3SOIPDcsmin - pParam->B3SOIPDst2 * T1; - } - else if (T10 < pParam->B3SOIPDvsdfb) - { T0 = T10 - pParam->B3SOIPDvsdfb; - T1 = T0 * T0; - here->B3SOIPDqse = here->B3SOIPDcsbox * T10 + here->B3SOIPDst4 + - pParam->B3SOIPDst3 / 3 * T0 * T1; - here->B3SOIPDgcse = here->B3SOIPDcsbox + pParam->B3SOIPDst3 * T1; - } - else - { here->B3SOIPDqse = here->B3SOIPDcsbox * T10 + here->B3SOIPDst4; - here->B3SOIPDgcse = here->B3SOIPDcsbox; - } - } - - if ( ((pParam->B3SOIPDnsub > 0) && (model->B3SOIPDtype > 0)) || - ((pParam->B3SOIPDnsub < 0) && (model->B3SOIPDtype < 0)) ) - { - if (T11 < pParam->B3SOIPDvsdfb) - { here->B3SOIPDqde = here->B3SOIPDcdbox * (T11 - pParam->B3SOIPDvsdfb); - here->B3SOIPDgcde = here->B3SOIPDcdbox; - } - else if (T11 < pParam->B3SOIPDsdt1) - { T0 = T11 - pParam->B3SOIPDvsdfb; - T1 = T0 * T0; - here->B3SOIPDqde = T0 * (here->B3SOIPDcdbox - pParam->B3SOIPDdt2 / 3 * T1) ; - here->B3SOIPDgcde = here->B3SOIPDcdbox - pParam->B3SOIPDdt2 * T1; - } - else if (T11 < pParam->B3SOIPDvsdth) - { T0 = T11 - pParam->B3SOIPDvsdth; - T1 = T0 * T0; - here->B3SOIPDqde = here->B3SOIPDcdmin * T11 + here->B3SOIPDdt4 + - pParam->B3SOIPDdt3 / 3 * T0 * T1; - here->B3SOIPDgcde = here->B3SOIPDcdmin + pParam->B3SOIPDdt3 * T1; - } - else - { here->B3SOIPDqde = here->B3SOIPDcdmin * T11 + here->B3SOIPDdt4; - here->B3SOIPDgcde = here->B3SOIPDcdmin; - } - } else - { - if (T11 < pParam->B3SOIPDvsdth) - { here->B3SOIPDqde = here->B3SOIPDcdmin * (T11 - pParam->B3SOIPDvsdth); - here->B3SOIPDgcde = here->B3SOIPDcdmin; - } - else if (T11 < pParam->B3SOIPDsdt1) - { T0 = T11 - pParam->B3SOIPDvsdth; - T1 = T0 * T0; - here->B3SOIPDqde = T0 * (here->B3SOIPDcdmin - pParam->B3SOIPDdt2 / 3 * T1) ; - here->B3SOIPDgcde = here->B3SOIPDcdmin - pParam->B3SOIPDdt2 * T1; - } - else if (T11 < pParam->B3SOIPDvsdfb) - { T0 = T11 - pParam->B3SOIPDvsdfb; - T1 = T0 * T0; - here->B3SOIPDqde = here->B3SOIPDcdbox * T11 + here->B3SOIPDdt4 + - pParam->B3SOIPDdt3 / 3 * T0 * T1; - here->B3SOIPDgcde = here->B3SOIPDcdbox + pParam->B3SOIPDdt3 * T1; - } - else - { here->B3SOIPDqde = here->B3SOIPDcdbox * T11 + here->B3SOIPDdt4; - here->B3SOIPDgcde = here->B3SOIPDcdbox; - } - } - } - else { - here->B3SOIPDqse = here->B3SOIPDcsbox * T10; - here->B3SOIPDgcse = here->B3SOIPDcsbox; - here->B3SOIPDqde = here->B3SOIPDcdbox * T11; - here->B3SOIPDgcde = here->B3SOIPDcdbox; - } - - /* Extrinsic : Sidewall fringing S/D charge */ - here->B3SOIPDqse += here->B3SOIPDcsesw * T10; - here->B3SOIPDgcse += here->B3SOIPDcsesw; - here->B3SOIPDqde += here->B3SOIPDcdesw * T11; - here->B3SOIPDgcde += here->B3SOIPDcdesw; - - /* All charge are mutliplied with type at the end, but qse and qde - have true polarity => so pre-mutliplied with type */ - here->B3SOIPDqse *= model->B3SOIPDtype; - here->B3SOIPDqde *= model->B3SOIPDtype; - } - - - here->B3SOIPDcbb = Cbb; - here->B3SOIPDcbd = Cbd; - here->B3SOIPDcbg = Cbg; - here->B3SOIPDqbf = -Qsub0 - Qac0; - here->B3SOIPDqjs = qjs; - here->B3SOIPDqjd = qjd; - - /* - * check convergence - */ - if ((here->B3SOIPDoff == 0) || (!(ckt->CKTmode & MODEINITFIX))) - { if (Check == 1) - { ckt->CKTnoncon++; - } - } - - *(ckt->CKTstate0 + here->B3SOIPDvg) = vg; - *(ckt->CKTstate0 + here->B3SOIPDvd) = vd; - *(ckt->CKTstate0 + here->B3SOIPDvs) = vs; - *(ckt->CKTstate0 + here->B3SOIPDvp) = vp; - *(ckt->CKTstate0 + here->B3SOIPDve) = ve; - - *(ckt->CKTstate0 + here->B3SOIPDvbs) = vbs; - *(ckt->CKTstate0 + here->B3SOIPDvbd) = vbd; - *(ckt->CKTstate0 + here->B3SOIPDvgs) = vgs; - *(ckt->CKTstate0 + here->B3SOIPDvds) = vds; - *(ckt->CKTstate0 + here->B3SOIPDves) = ves; - *(ckt->CKTstate0 + here->B3SOIPDvps) = vps; - *(ckt->CKTstate0 + here->B3SOIPDdeltemp) = delTemp; - - /* bulk and channel charge plus overlaps */ - - if (!ChargeComputationNeeded) - goto line850; -#ifndef NOBYPASS - line755: -#endif - ag0 = ckt->CKTag[0]; - - T0 = vgd + DELTA_1; - T1 = sqrt(T0 * T0 + 4.0 * DELTA_1); - T2 = 0.5 * (T0 - T1); - -/* v2.2.3 bug fix */ - T3 = pParam->B3SOIPDwdiodCV * pParam->B3SOIPDcgdl; - - T4 = sqrt(1.0 - 4.0 * T2 / pParam->B3SOIPDckappa); - cgdo = pParam->B3SOIPDcgdo + T3 - T3 * (1.0 - 1.0 / T4) - * (0.5 - 0.5 * T0 / T1); - qgdo = (pParam->B3SOIPDcgdo + T3) * vgd - T3 * (T2 - + 0.5 * pParam->B3SOIPDckappa * (T4 - 1.0)); - - T0 = vgs + DELTA_1; - T1 = sqrt(T0 * T0 + 4.0 * DELTA_1); - T2 = 0.5 * (T0 - T1); - -/* v2.2.3 bug fix */ - T3 = pParam->B3SOIPDwdiosCV * pParam->B3SOIPDcgsl; - - T4 = sqrt(1.0 - 4.0 * T2 / pParam->B3SOIPDckappa); - cgso = pParam->B3SOIPDcgso + T3 - T3 * (1.0 - 1.0 / T4) - * (0.5 - 0.5 * T0 / T1); - qgso = (pParam->B3SOIPDcgso + T3) * vgs - T3 * (T2 - + 0.5 * pParam->B3SOIPDckappa * (T4 - 1.0)); - - - - if (here->B3SOIPDdebugMod < 0) - goto line850; - - - if (here->B3SOIPDmode > 0) - { gcdgb = (here->B3SOIPDcdgb - cgdo) * ag0; - gcddb = (here->B3SOIPDcddb + cgdo + here->B3SOIPDgcde) * ag0; - gcdsb = here->B3SOIPDcdsb * ag0; - gcdeb = (here->B3SOIPDcdeb - here->B3SOIPDgcde) * ag0; - gcdT = model->B3SOIPDtype * here->B3SOIPDcdT * ag0; - - gcsgb = -(here->B3SOIPDcggb + here->B3SOIPDcbgb + here->B3SOIPDcdgb - + cgso) * ag0; - gcsdb = -(here->B3SOIPDcgdb + here->B3SOIPDcbdb + here->B3SOIPDcddb) * ag0; - gcssb = (cgso + here->B3SOIPDgcse - (here->B3SOIPDcgsb + here->B3SOIPDcbsb - + here->B3SOIPDcdsb)) * ag0; - gcseb = -(here->B3SOIPDgcse + here->B3SOIPDcbeb + here->B3SOIPDcdeb - + here->B3SOIPDceeb) * ag0; - gcsT = - model->B3SOIPDtype * (here->B3SOIPDcgT + here->B3SOIPDcbT + here->B3SOIPDcdT - + here->B3SOIPDceT) * ag0; - - gcggb = (here->B3SOIPDcggb + cgdo + cgso + pParam->B3SOIPDcgeo) * ag0; - gcgdb = (here->B3SOIPDcgdb - cgdo) * ag0; - gcgsb = (here->B3SOIPDcgsb - cgso) * ag0; - gcgeb = (- pParam->B3SOIPDcgeo) * ag0; - gcgT = model->B3SOIPDtype * here->B3SOIPDcgT * ag0; - - gcbgb = here->B3SOIPDcbgb * ag0; - gcbdb = here->B3SOIPDcbdb * ag0; - gcbsb = here->B3SOIPDcbsb * ag0; - gcbeb = here->B3SOIPDcbeb * ag0; - gcbT = model->B3SOIPDtype * here->B3SOIPDcbT * ag0; - - gcegb = (- pParam->B3SOIPDcgeo) * ag0; - gcedb = (- here->B3SOIPDgcde) * ag0; - gcesb = (- here->B3SOIPDgcse) * ag0; - gceeb = (here->B3SOIPDgcse + here->B3SOIPDgcde + - here->B3SOIPDceeb + pParam->B3SOIPDcgeo) * ag0; - - gceT = model->B3SOIPDtype * here->B3SOIPDceT * ag0; - - gcTt = pParam->B3SOIPDcth * ag0; - - sxpart = 0.6; - dxpart = 0.4; - - /* Lump the overlap capacitance and S/D parasitics */ - qgd = qgdo; - qgs = qgso; - qge = pParam->B3SOIPDcgeo * vge; - qgate += qgd + qgs + qge; - qdrn += here->B3SOIPDqde - qgd; - qsub -= qge + here->B3SOIPDqse + here->B3SOIPDqde; - qsrc = -(qgate + qbody + qdrn + qsub); - } - else - { gcsgb = (here->B3SOIPDcdgb - cgso) * ag0; - gcssb = (here->B3SOIPDcddb + cgso + here->B3SOIPDgcse) * ag0; - gcsdb = here->B3SOIPDcdsb * ag0; - gcseb = (here->B3SOIPDcdeb - here->B3SOIPDgcse) * ag0; - gcsT = model->B3SOIPDtype * here->B3SOIPDcdT * ag0; - - gcdgb = -(here->B3SOIPDcggb + here->B3SOIPDcbgb + here->B3SOIPDcdgb - + cgdo) * ag0; - gcdsb = -(here->B3SOIPDcgdb + here->B3SOIPDcbdb + here->B3SOIPDcddb) * ag0; - gcddb = (cgdo + here->B3SOIPDgcde - (here->B3SOIPDcgsb + here->B3SOIPDcbsb - + here->B3SOIPDcdsb)) * ag0; - gcdeb = -(here->B3SOIPDgcde + here->B3SOIPDcbeb + here->B3SOIPDcdeb - + here->B3SOIPDceeb) * ag0; - gcdT = - model->B3SOIPDtype * (here->B3SOIPDcgT + here->B3SOIPDcbT - + here->B3SOIPDcdT + here->B3SOIPDceT) * ag0; - - gcggb = (here->B3SOIPDcggb + cgdo + cgso + pParam->B3SOIPDcgeo) * ag0; - gcgsb = (here->B3SOIPDcgdb - cgso) * ag0; - gcgdb = (here->B3SOIPDcgsb - cgdo) * ag0; - gcgeb = (- pParam->B3SOIPDcgeo) * ag0; - gcgT = model->B3SOIPDtype * here->B3SOIPDcgT * ag0; - - gcbgb = here->B3SOIPDcbgb * ag0; - gcbsb = here->B3SOIPDcbdb * ag0; - gcbdb = here->B3SOIPDcbsb * ag0; - gcbeb = here->B3SOIPDcbeb * ag0; - gcbT = model->B3SOIPDtype * here->B3SOIPDcbT * ag0; - - gcegb = (-pParam->B3SOIPDcgeo) * ag0; - gcesb = (- here->B3SOIPDgcse) * ag0; - gcedb = (- here->B3SOIPDgcde) * ag0; - gceeb = (here->B3SOIPDceeb + pParam->B3SOIPDcgeo + - here->B3SOIPDgcse + here->B3SOIPDgcde) * ag0; - gceT = model->B3SOIPDtype * here->B3SOIPDceT * ag0; - - gcTt = pParam->B3SOIPDcth * ag0; - - dxpart = 0.6; - sxpart = 0.4; - - /* Lump the overlap capacitance */ - qgd = qgdo; - qgs = qgso; - qge = pParam->B3SOIPDcgeo * vge; - qgate += qgd + qgs + qge; - qsrc = qdrn - qgs + here->B3SOIPDqse; - qsub -= qge + here->B3SOIPDqse + here->B3SOIPDqde; - qdrn = -(qgate + qbody + qsrc + qsub); - } - - here->B3SOIPDcgdo = cgdo; - here->B3SOIPDcgso = cgso; - - if (ByPass) goto line860; - - *(ckt->CKTstate0 + here->B3SOIPDqe) = qsub; - *(ckt->CKTstate0 + here->B3SOIPDqg) = qgate; - *(ckt->CKTstate0 + here->B3SOIPDqd) = qdrn; - *(ckt->CKTstate0 + here->B3SOIPDqb) = qbody; - if ((model->B3SOIPDshMod == 1) && (here->B3SOIPDrth0!=0.0)) - *(ckt->CKTstate0 + here->B3SOIPDqth) = pParam->B3SOIPDcth * delTemp; - - - /* store small signal parameters */ - if (ckt->CKTmode & MODEINITSMSIG) - { goto line1000; - } - if (!ChargeComputationNeeded) - goto line850; - - - if (ckt->CKTmode & MODEINITTRAN) - { *(ckt->CKTstate1 + here->B3SOIPDqb) = - *(ckt->CKTstate0 + here->B3SOIPDqb); - *(ckt->CKTstate1 + here->B3SOIPDqg) = - *(ckt->CKTstate0 + here->B3SOIPDqg); - *(ckt->CKTstate1 + here->B3SOIPDqd) = - *(ckt->CKTstate0 + here->B3SOIPDqd); - *(ckt->CKTstate1 + here->B3SOIPDqe) = - *(ckt->CKTstate0 + here->B3SOIPDqe); - *(ckt->CKTstate1 + here->B3SOIPDqth) = - *(ckt->CKTstate0 + here->B3SOIPDqth); - } - - error = NIintegrate(ckt, &geq, &ceq,0.0,here->B3SOIPDqb); - if (error) return(error); - error = NIintegrate(ckt, &geq, &ceq, 0.0, here->B3SOIPDqg); - if (error) return(error); - error = NIintegrate(ckt,&geq, &ceq, 0.0, here->B3SOIPDqd); - if (error) return(error); - error = NIintegrate(ckt,&geq, &ceq, 0.0, here->B3SOIPDqe); - if (error) return(error); - if ((model->B3SOIPDshMod == 1) && (here->B3SOIPDrth0!=0.0)) - { - error = NIintegrate(ckt, &geq, &ceq, 0.0, here->B3SOIPDqth); - if (error) return (error); - } - - goto line860; - - line850: - /* initialize to zero charge conductance and current */ - ceqqe = ceqqg = ceqqb = ceqqd = ceqqth= 0.0; - - gcdgb = gcddb = gcdsb = gcdeb = gcdT = 0.0; - gcsgb = gcsdb = gcssb = gcseb = gcsT = 0.0; - gcggb = gcgdb = gcgsb = gcgeb = gcgT = 0.0; - gcbgb = gcbdb = gcbsb = gcbeb = gcbT = 0.0; - gcegb = gcedb = gceeb = gcesb = gceT = 0.0; - gcTt = 0.0; - - sxpart = (1.0 - (dxpart = (here->B3SOIPDmode > 0) ? 0.4 : 0.6)); - - goto line900; - - line860: - /* evaluate equivalent charge current */ - - cqgate = *(ckt->CKTstate0 + here->B3SOIPDcqg); - cqbody = *(ckt->CKTstate0 + here->B3SOIPDcqb); - cqdrn = *(ckt->CKTstate0 + here->B3SOIPDcqd); - cqsub = *(ckt->CKTstate0 + here->B3SOIPDcqe); - cqtemp = *(ckt->CKTstate0 + here->B3SOIPDcqth); - - here->B3SOIPDcb += cqbody; - here->B3SOIPDcd += cqdrn; - - ceqqg = cqgate - gcggb * vgb + gcgdb * vbd + gcgsb * vbs - - gcgeb * veb - gcgT * delTemp; - ceqqb = cqbody - gcbgb * vgb + gcbdb * vbd + gcbsb * vbs - - gcbeb * veb - gcbT * delTemp; - ceqqd = cqdrn - gcdgb * vgb + gcddb * vbd + gcdsb * vbs - - gcdeb * veb - gcdT * delTemp; - ceqqe = cqsub - gcegb * vgb + gcedb * vbd + gcesb * vbs - - gceeb * veb - gceT * delTemp;; - ceqqth = cqtemp - gcTt * delTemp; - - if (ckt->CKTmode & MODEINITTRAN) - { *(ckt->CKTstate1 + here->B3SOIPDcqe) = - *(ckt->CKTstate0 + here->B3SOIPDcqe); - *(ckt->CKTstate1 + here->B3SOIPDcqb) = - *(ckt->CKTstate0 + here->B3SOIPDcqb); - *(ckt->CKTstate1 + here->B3SOIPDcqg) = - *(ckt->CKTstate0 + here->B3SOIPDcqg); - *(ckt->CKTstate1 + here->B3SOIPDcqd) = - *(ckt->CKTstate0 + here->B3SOIPDcqd); - *(ckt->CKTstate1 + here->B3SOIPDcqth) = - *(ckt->CKTstate0 + here->B3SOIPDcqth); - } - - /* - * load current vector - */ - line900: - - m = here->B3SOIPDm; - - if (here->B3SOIPDmode >= 0) - { Gm = here->B3SOIPDgm; - Gmbs = here->B3SOIPDgmbs; - GmT = model->B3SOIPDtype * here->B3SOIPDgmT; - FwdSum = Gm + Gmbs; - RevSum = 0.0; - - /* v2.2.2 bug fix */ - cdreq = model->B3SOIPDtype * (here->B3SOIPDcdrain - here->B3SOIPDgds * vds - - Gm * vgs - Gmbs * vbs) - GmT * delTemp; - - /* ceqbs now is compatible with cdreq, ie. going in is +ve */ - /* Equivalent current source from the diode */ - ceqbs = here->B3SOIPDcjs; - ceqbd = here->B3SOIPDcjd; - /* Current going in is +ve */ - ceqbody = -here->B3SOIPDcbody; - - - ceqgate = here->B3SOIPDcgate; - gigg = here->B3SOIPDgigg; - gigb = here->B3SOIPDgigb; - gigs = here->B3SOIPDgigs; - gigd = here->B3SOIPDgigd; - gigT = model->B3SOIPDtype * here->B3SOIPDgigT; - - ceqth = here->B3SOIPDcth; - ceqbodcon = here->B3SOIPDcbodcon; - - gbbg = -here->B3SOIPDgbgs; - gbbdp = -here->B3SOIPDgbds; - gbbb = -here->B3SOIPDgbbs; - gbbp = -here->B3SOIPDgbps; - gbbT = -model->B3SOIPDtype * here->B3SOIPDgbT; - gbbsp = - ( gbbg + gbbdp + gbbb + gbbp); - - gddpg = -here->B3SOIPDgjdg; - gddpdp = -here->B3SOIPDgjdd; - gddpb = -here->B3SOIPDgjdb; - gddpT = -model->B3SOIPDtype * here->B3SOIPDgjdT; - gddpsp = - ( gddpg + gddpdp + gddpb); - - gsspg = -here->B3SOIPDgjsg; - gsspdp = -here->B3SOIPDgjsd; - gsspb = -here->B3SOIPDgjsb; - gsspT = -model->B3SOIPDtype * here->B3SOIPDgjsT; - gsspsp = - (gsspg + gsspdp + gsspb ); - - gppb = -here->B3SOIPDgbpbs; - gppp = -here->B3SOIPDgbpps; - gppT = -model->B3SOIPDtype * here->B3SOIPDgbpT; - - gTtg = here->B3SOIPDgtempg; - gTtb = here->B3SOIPDgtempb; - gTtdp = here->B3SOIPDgtempd; - gTtt = here->B3SOIPDgtempT; - gTtsp = - (gTtg + gTtb + gTtdp); - } - else - { Gm = -here->B3SOIPDgm; - Gmbs = -here->B3SOIPDgmbs; - GmT = -model->B3SOIPDtype * here->B3SOIPDgmT; - FwdSum = 0.0; - RevSum = -(Gm + Gmbs); - - /* v2.2.2 bug fix */ - cdreq = -model->B3SOIPDtype * (here->B3SOIPDcdrain + here->B3SOIPDgds*vds - + Gm * vgd + Gmbs * vbd) + GmT * delTemp; - - ceqbs = here->B3SOIPDcjd; - ceqbd = here->B3SOIPDcjs; - /* Current going in is +ve */ - ceqbody = -here->B3SOIPDcbody; - - - ceqgate = here->B3SOIPDcgate; - gigg = here->B3SOIPDgigg; - gigb = here->B3SOIPDgigb; - gigs = here->B3SOIPDgigd; - gigd = here->B3SOIPDgigs; - gigT = model->B3SOIPDtype * here->B3SOIPDgigT; - - ceqth = here->B3SOIPDcth; - ceqbodcon = here->B3SOIPDcbodcon; - - gbbg = -here->B3SOIPDgbgs; - gbbb = -here->B3SOIPDgbbs; - gbbp = -here->B3SOIPDgbps; - gbbsp = -here->B3SOIPDgbds; - gbbT = -model->B3SOIPDtype * here->B3SOIPDgbT; - gbbdp = - ( gbbg + gbbsp + gbbb + gbbp); - - gddpg = -here->B3SOIPDgjsg; - gddpsp = -here->B3SOIPDgjsd; - gddpb = -here->B3SOIPDgjsb; - gddpT = -model->B3SOIPDtype * here->B3SOIPDgjsT; - gddpdp = - (gddpg + gddpsp + gddpb ); - - gsspg = -here->B3SOIPDgjdg; - gsspsp = -here->B3SOIPDgjdd; - gsspb = -here->B3SOIPDgjdb; - gsspT = -model->B3SOIPDtype * here->B3SOIPDgjdT; - gsspdp = - ( gsspg + gsspsp + gsspb ); - - gppb = -here->B3SOIPDgbpbs; - gppp = -here->B3SOIPDgbpps; - gppT = -model->B3SOIPDtype * here->B3SOIPDgbpT; - - gTtg = here->B3SOIPDgtempg; - gTtb = here->B3SOIPDgtempb; - gTtsp = here->B3SOIPDgtempd; - gTtt = here->B3SOIPDgtempT; - gTtdp = - (gTtg + gTtb + gTtsp); - } - - if (model->B3SOIPDtype < 0) - { - ceqbodcon = -ceqbodcon; - ceqbody = -ceqbody; - ceqgate = -ceqgate; - ceqbs = -ceqbs; - ceqbd = -ceqbd; - ceqqg = -ceqqg; - ceqqb = -ceqqb; - ceqqd = -ceqqd; - ceqqe = -ceqqe; - } - - (*(ckt->CKTrhs + here->B3SOIPDbNode) -= m * (ceqbody + ceqqb)); - - (*(ckt->CKTrhs + here->B3SOIPDgNode) -= m * (ceqgate + ceqqg)); - (*(ckt->CKTrhs + here->B3SOIPDdNodePrime) += m * (ceqbd - cdreq - ceqqd)); - (*(ckt->CKTrhs + here->B3SOIPDsNodePrime) += m * (cdreq + ceqbs + ceqqg - + ceqqb + ceqqd + ceqqe)); - (*(ckt->CKTrhs + here->B3SOIPDeNode) -= m * ceqqe); - - if (here->B3SOIPDbodyMod == 1) { - (*(ckt->CKTrhs + here->B3SOIPDpNode) += m * ceqbodcon); - } - - if (selfheat) { - (*(ckt->CKTrhs + here->B3SOIPDtempNode) -= m * (ceqth + ceqqth)); - } - - - - if (here->B3SOIPDdebugMod != 0) - { - *(ckt->CKTrhs + here->B3SOIPDvbsNode) = here->B3SOIPDvbseff; - *(ckt->CKTrhs + here->B3SOIPDidsNode) = FLOG(here->B3SOIPDids); - *(ckt->CKTrhs + here->B3SOIPDicNode) = FLOG(here->B3SOIPDic); - *(ckt->CKTrhs + here->B3SOIPDibsNode) = FLOG(here->B3SOIPDibs); - *(ckt->CKTrhs + here->B3SOIPDibdNode) = FLOG(here->B3SOIPDibd); - *(ckt->CKTrhs + here->B3SOIPDiiiNode) = FLOG(here->B3SOIPDiii); - *(ckt->CKTrhs + here->B3SOIPDigNode) = here->B3SOIPDig; - *(ckt->CKTrhs + here->B3SOIPDgiggNode) = here->B3SOIPDgigg; - *(ckt->CKTrhs + here->B3SOIPDgigdNode) = here->B3SOIPDgigd; - *(ckt->CKTrhs + here->B3SOIPDgigbNode) = here->B3SOIPDgigb; - *(ckt->CKTrhs + here->B3SOIPDigidlNode) = here->B3SOIPDigidl; - *(ckt->CKTrhs + here->B3SOIPDitunNode) = here->B3SOIPDitun; - *(ckt->CKTrhs + here->B3SOIPDibpNode) = here->B3SOIPDibp; - *(ckt->CKTrhs + here->B3SOIPDcbbNode) = here->B3SOIPDcbb; - *(ckt->CKTrhs + here->B3SOIPDcbdNode) = here->B3SOIPDcbd; - *(ckt->CKTrhs + here->B3SOIPDcbgNode) = here->B3SOIPDcbg; - *(ckt->CKTrhs + here->B3SOIPDqbfNode) = here->B3SOIPDqbf; - *(ckt->CKTrhs + here->B3SOIPDqjsNode) = here->B3SOIPDqjs; - *(ckt->CKTrhs + here->B3SOIPDqjdNode) = here->B3SOIPDqjd; - } - - - /* - * load y matrix - */ - Gmin = ckt->CKTgmin * 1e-6; - - *(here->B3SOIPDEdpPtr) += m * gcedb; - *(here->B3SOIPDEspPtr) += m * gcesb; - *(here->B3SOIPDDPePtr) += m * gcdeb; - *(here->B3SOIPDSPePtr) += m * gcseb; - *(here->B3SOIPDEgPtr) += m * gcegb; - *(here->B3SOIPDGePtr) += m * gcgeb; - - (*(here->B3SOIPDEbPtr) -= m * (gcegb + gcedb + gcesb + gceeb)); - (*(here->B3SOIPDGbPtr) -= m * (-gigb + gcggb + gcgdb + gcgsb + gcgeb)); - (*(here->B3SOIPDDPbPtr) -= m * (-gddpb - Gmbs + gcdgb + gcddb + gcdeb + gcdsb)); - - (*(here->B3SOIPDSPbPtr) -= m * (-gsspb + Gmbs + gcsgb + gcsdb + gcseb + gcssb + Gmin)); - - - (*(here->B3SOIPDBePtr) += m * gcbeb); - (*(here->B3SOIPDBgPtr) += m * (-gigg + gcbgb + gbbg)); - (*(here->B3SOIPDBdpPtr) += (-gigd + gcbdb + gbbdp)); - (*(here->B3SOIPDBspPtr) += m * (gcbsb + gbbsp - Gmin - - gigs)); - (*(here->B3SOIPDBbPtr) += m * (-gigb + gbbb - gcbgb - gcbdb - gcbsb - gcbeb + Gmin)); - (*(here->B3SOIPDEePtr) += m * gceeb); - - (*(here->B3SOIPDGgPtr) += m * (gigg + gcggb + ckt->CKTgmin)); - (*(here->B3SOIPDGdpPtr) += m * (gigd + gcgdb - ckt->CKTgmin)); - (*(here->B3SOIPDGspPtr) += m * (gcgsb + gigs)); - - (*(here->B3SOIPDDPgPtr) += m * ((Gm + gcdgb) + gddpg - ckt->CKTgmin)); - (*(here->B3SOIPDDPdpPtr) += m * ((here->B3SOIPDdrainConductance - + here->B3SOIPDgds + gddpdp - + RevSum + gcddb) + ckt->CKTgmin)); - (*(here->B3SOIPDDPspPtr) -= m * (-gddpsp + here->B3SOIPDgds + FwdSum - gcdsb)); - - (*(here->B3SOIPDDPdPtr) -= m * here->B3SOIPDdrainConductance); - - (*(here->B3SOIPDSPgPtr) += m * (gcsgb - Gm + gsspg)); - (*(here->B3SOIPDSPdpPtr) -= m * (here->B3SOIPDgds - gsspdp + RevSum - gcsdb)); - - (*(here->B3SOIPDSPspPtr) += m * (here->B3SOIPDsourceConductance - + here->B3SOIPDgds + gsspsp - + FwdSum + gcssb - + Gmin)); - - - (*(here->B3SOIPDSPsPtr) -= m * here->B3SOIPDsourceConductance); - - - (*(here->B3SOIPDDdPtr) += m * here->B3SOIPDdrainConductance); - (*(here->B3SOIPDDdpPtr) -= m * here->B3SOIPDdrainConductance); - - - (*(here->B3SOIPDSsPtr) += m * here->B3SOIPDsourceConductance); - (*(here->B3SOIPDSspPtr) -= m * here->B3SOIPDsourceConductance); - - if (here->B3SOIPDbodyMod == 1) { - (*(here->B3SOIPDBpPtr) -= m * gppp); - (*(here->B3SOIPDPbPtr) += m * gppb); - (*(here->B3SOIPDPpPtr) += m * gppp); - } - - if (selfheat) - { - (*(here->B3SOIPDDPtempPtr) += m * (GmT + gddpT + gcdT)); - (*(here->B3SOIPDSPtempPtr) += m * (-GmT + gsspT + gcsT)); - (*(here->B3SOIPDBtempPtr) += m * (gbbT + gcbT - gigT)); - (*(here->B3SOIPDEtempPtr) += m * gceT); - (*(here->B3SOIPDGtempPtr) += m * (gcgT + gigT)); - (*(here->B3SOIPDTemptempPtr) += m * (gTtt + 1/pParam->B3SOIPDrth + gcTt)); - (*(here->B3SOIPDTempgPtr) += m * gTtg); - (*(here->B3SOIPDTempbPtr) += m * gTtb); - (*(here->B3SOIPDTempdpPtr) += m * gTtdp); - (*(here->B3SOIPDTempspPtr) += m * gTtsp); - } - - if (here->B3SOIPDdebugMod != 0) - { - *(here->B3SOIPDVbsPtr) += m * 1; - *(here->B3SOIPDIdsPtr) += m * 1; - *(here->B3SOIPDIcPtr) += m * 1; - *(here->B3SOIPDIbsPtr) += m * 1; - *(here->B3SOIPDIbdPtr) += m * 1; - *(here->B3SOIPDIiiPtr) += m * 1; - *(here->B3SOIPDIgPtr) += m * 1; - *(here->B3SOIPDGiggPtr) += m * 1; - *(here->B3SOIPDGigdPtr) += m * 1; - *(here->B3SOIPDGigbPtr) += m * 1; - *(here->B3SOIPDIgidlPtr) += m * 1; - *(here->B3SOIPDItunPtr) += m * 1; - *(here->B3SOIPDIbpPtr) += m * 1; - *(here->B3SOIPDCbgPtr) += m * 1; - *(here->B3SOIPDCbbPtr) += m * 1; - *(here->B3SOIPDCbdPtr) += m * 1; - *(here->B3SOIPDQbfPtr) += m * 1; - *(here->B3SOIPDQjsPtr) += m * 1; - *(here->B3SOIPDQjdPtr) += m * 1; - - } - - line1000: ; - - - } /* End of Mosfet Instance */ -} /* End of Model Instance */ - - -return(OK); -} - diff --git a/src/spicelib/devices/bsim3soi_pd/b3soipdmask.c b/src/spicelib/devices/bsim3soi_pd/b3soipdmask.c deleted file mode 100644 index 37a21eee9..000000000 --- a/src/spicelib/devices/bsim3soi_pd/b3soipdmask.c +++ /dev/null @@ -1,1480 +0,0 @@ -/********** -Copyright 1990 Regents of the University of California. All rights reserved. -Author: 1998 Samuel Fung, Dennis Sinitsky and Stephen Tang -File: b3soipdmask.c 98/5/01 -Modified by Pin Su and Jan Feng 99/2/15 -Modified by Pin Su 99/4/30 -Modified by Wei Jin 99/9/27 -Modified by Pin Su 00/3/1 -Modified by Pin Su 01/2/15 -Modified by Pin Su 02/3/5 -Modified by Paolo Nenzi 2002 -**********/ - -/* - * Revision 2.2.3 02/3/5 Pin Su - * BSIMPD2.2.3 release - */ - -#include "ngspice/ngspice.h" -#include "ngspice/ifsim.h" -#include "ngspice/cktdefs.h" -#include "ngspice/devdefs.h" -#include "b3soipddef.h" -#include "ngspice/sperror.h" -#include "ngspice/suffix.h" - -int -B3SOIPDmAsk(CKTcircuit *ckt, GENmodel *inst, int which, IFvalue *value) -{ - B3SOIPDmodel *model = (B3SOIPDmodel *)inst; - - NG_IGNORE(ckt); - - switch(which) - { case B3SOIPD_MOD_MOBMOD: - value->iValue = model->B3SOIPDmobMod; - return(OK); - case B3SOIPD_MOD_PARAMCHK: - value->iValue = model->B3SOIPDparamChk; - return(OK); - case B3SOIPD_MOD_BINUNIT: - value->iValue = model->B3SOIPDbinUnit; - return(OK); - case B3SOIPD_MOD_CAPMOD: - value->iValue = model->B3SOIPDcapMod; - return(OK); - case B3SOIPD_MOD_SHMOD: - value->iValue = model->B3SOIPDshMod; - return(OK); - case B3SOIPD_MOD_NOIMOD: - value->iValue = model->B3SOIPDnoiMod; - return(OK); - case B3SOIPD_MOD_VERSION : - value->rValue = model->B3SOIPDversion; - return(OK); - case B3SOIPD_MOD_TOX : - value->rValue = model->B3SOIPDtox; - return(OK); -/* v2.2.3 */ - case B3SOIPD_MOD_DTOXCV : - value->rValue = model->B3SOIPDdtoxcv; - return(OK); - - case B3SOIPD_MOD_CDSC : - value->rValue = model->B3SOIPDcdsc; - return(OK); - case B3SOIPD_MOD_CDSCB : - value->rValue = model->B3SOIPDcdscb; - return(OK); - - case B3SOIPD_MOD_CDSCD : - value->rValue = model->B3SOIPDcdscd; - return(OK); - - case B3SOIPD_MOD_CIT : - value->rValue = model->B3SOIPDcit; - return(OK); - case B3SOIPD_MOD_NFACTOR : - value->rValue = model->B3SOIPDnfactor; - return(OK); - case B3SOIPD_MOD_VSAT: - value->rValue = model->B3SOIPDvsat; - return(OK); - case B3SOIPD_MOD_AT: - value->rValue = model->B3SOIPDat; - return(OK); - case B3SOIPD_MOD_A0: - value->rValue = model->B3SOIPDa0; - return(OK); - - case B3SOIPD_MOD_AGS: - value->rValue = model->B3SOIPDags; - return(OK); - - case B3SOIPD_MOD_A1: - value->rValue = model->B3SOIPDa1; - return(OK); - case B3SOIPD_MOD_A2: - value->rValue = model->B3SOIPDa2; - return(OK); - case B3SOIPD_MOD_KETA: - value->rValue = model->B3SOIPDketa; - return(OK); - case B3SOIPD_MOD_NSUB: - value->rValue = model->B3SOIPDnsub; - return(OK); - case B3SOIPD_MOD_NPEAK: - value->rValue = model->B3SOIPDnpeak; - return(OK); - case B3SOIPD_MOD_NGATE: - value->rValue = model->B3SOIPDngate; - return(OK); - case B3SOIPD_MOD_GAMMA1: - value->rValue = model->B3SOIPDgamma1; - return(OK); - case B3SOIPD_MOD_GAMMA2: - value->rValue = model->B3SOIPDgamma2; - return(OK); - case B3SOIPD_MOD_VBX: - value->rValue = model->B3SOIPDvbx; - return(OK); - case B3SOIPD_MOD_VBM: - value->rValue = model->B3SOIPDvbm; - return(OK); - case B3SOIPD_MOD_XT: - value->rValue = model->B3SOIPDxt; - return(OK); - case B3SOIPD_MOD_K1: - value->rValue = model->B3SOIPDk1; - return(OK); - case B3SOIPD_MOD_KT1: - value->rValue = model->B3SOIPDkt1; - return(OK); - case B3SOIPD_MOD_KT1L: - value->rValue = model->B3SOIPDkt1l; - return(OK); - case B3SOIPD_MOD_KT2 : - value->rValue = model->B3SOIPDkt2; - return(OK); - case B3SOIPD_MOD_K2 : - value->rValue = model->B3SOIPDk2; - return(OK); - case B3SOIPD_MOD_K3: - value->rValue = model->B3SOIPDk3; - return(OK); - case B3SOIPD_MOD_K3B: - value->rValue = model->B3SOIPDk3b; - return(OK); - case B3SOIPD_MOD_W0: - value->rValue = model->B3SOIPDw0; - return(OK); - case B3SOIPD_MOD_NLX: - value->rValue = model->B3SOIPDnlx; - return(OK); - case B3SOIPD_MOD_DVT0 : - value->rValue = model->B3SOIPDdvt0; - return(OK); - case B3SOIPD_MOD_DVT1 : - value->rValue = model->B3SOIPDdvt1; - return(OK); - case B3SOIPD_MOD_DVT2 : - value->rValue = model->B3SOIPDdvt2; - return(OK); - case B3SOIPD_MOD_DVT0W : - value->rValue = model->B3SOIPDdvt0w; - return(OK); - case B3SOIPD_MOD_DVT1W : - value->rValue = model->B3SOIPDdvt1w; - return(OK); - case B3SOIPD_MOD_DVT2W : - value->rValue = model->B3SOIPDdvt2w; - return(OK); - case B3SOIPD_MOD_DROUT : - value->rValue = model->B3SOIPDdrout; - return(OK); - case B3SOIPD_MOD_DSUB : - value->rValue = model->B3SOIPDdsub; - return(OK); - case B3SOIPD_MOD_VTH0: - value->rValue = model->B3SOIPDvth0; - return(OK); - case B3SOIPD_MOD_UA: - value->rValue = model->B3SOIPDua; - return(OK); - case B3SOIPD_MOD_UA1: - value->rValue = model->B3SOIPDua1; - return(OK); - case B3SOIPD_MOD_UB: - value->rValue = model->B3SOIPDub; - return(OK); - case B3SOIPD_MOD_UB1: - value->rValue = model->B3SOIPDub1; - return(OK); - case B3SOIPD_MOD_UC: - value->rValue = model->B3SOIPDuc; - return(OK); - case B3SOIPD_MOD_UC1: - value->rValue = model->B3SOIPDuc1; - return(OK); - case B3SOIPD_MOD_U0: - value->rValue = model->B3SOIPDu0; - return(OK); - case B3SOIPD_MOD_UTE: - value->rValue = model->B3SOIPDute; - return(OK); - case B3SOIPD_MOD_VOFF: - value->rValue = model->B3SOIPDvoff; - return(OK); - case B3SOIPD_MOD_DELTA: - value->rValue = model->B3SOIPDdelta; - return(OK); - case B3SOIPD_MOD_RDSW: - value->rValue = model->B3SOIPDrdsw; - return(OK); - case B3SOIPD_MOD_PRWG: - value->rValue = model->B3SOIPDprwg; - return(OK); - case B3SOIPD_MOD_PRWB: - value->rValue = model->B3SOIPDprwb; - return(OK); - case B3SOIPD_MOD_PRT: - value->rValue = model->B3SOIPDprt; - return(OK); - case B3SOIPD_MOD_ETA0: - value->rValue = model->B3SOIPDeta0; - return(OK); - case B3SOIPD_MOD_ETAB: - value->rValue = model->B3SOIPDetab; - return(OK); - case B3SOIPD_MOD_PCLM: - value->rValue = model->B3SOIPDpclm; - return(OK); - case B3SOIPD_MOD_PDIBL1: - value->rValue = model->B3SOIPDpdibl1; - return(OK); - case B3SOIPD_MOD_PDIBL2: - value->rValue = model->B3SOIPDpdibl2; - return(OK); - case B3SOIPD_MOD_PDIBLB: - value->rValue = model->B3SOIPDpdiblb; - return(OK); - case B3SOIPD_MOD_PVAG: - value->rValue = model->B3SOIPDpvag; - return(OK); - case B3SOIPD_MOD_WR: - value->rValue = model->B3SOIPDwr; - return(OK); - case B3SOIPD_MOD_DWG: - value->rValue = model->B3SOIPDdwg; - return(OK); - case B3SOIPD_MOD_DWB: - value->rValue = model->B3SOIPDdwb; - return(OK); - case B3SOIPD_MOD_B0: - value->rValue = model->B3SOIPDb0; - return(OK); - case B3SOIPD_MOD_B1: - value->rValue = model->B3SOIPDb1; - return(OK); - case B3SOIPD_MOD_ALPHA0: - value->rValue = model->B3SOIPDalpha0; - return(OK); - - case B3SOIPD_MOD_CGSL: - value->rValue = model->B3SOIPDcgsl; - return(OK); - case B3SOIPD_MOD_CGDL: - value->rValue = model->B3SOIPDcgdl; - return(OK); - case B3SOIPD_MOD_CKAPPA: - value->rValue = model->B3SOIPDckappa; - return(OK); - case B3SOIPD_MOD_CF: - value->rValue = model->B3SOIPDcf; - return(OK); - case B3SOIPD_MOD_CLC: - value->rValue = model->B3SOIPDclc; - return(OK); - case B3SOIPD_MOD_CLE: - value->rValue = model->B3SOIPDcle; - return(OK); - case B3SOIPD_MOD_DWC: - value->rValue = model->B3SOIPDdwc; - return(OK); - case B3SOIPD_MOD_DLC: - value->rValue = model->B3SOIPDdlc; - return(OK); - - case B3SOIPD_MOD_TBOX: - value->rValue = model->B3SOIPDtbox; - return(OK); - case B3SOIPD_MOD_TSI: - value->rValue = model->B3SOIPDtsi; - return(OK); - case B3SOIPD_MOD_RTH0: - value->rValue = model->B3SOIPDrth0; - return(OK); - case B3SOIPD_MOD_CTH0: - value->rValue = model->B3SOIPDcth0; - return(OK); - case B3SOIPD_MOD_NDIODE: - value->rValue = model->B3SOIPDndiode; - return(OK); - case B3SOIPD_MOD_XBJT: - value->rValue = model->B3SOIPDxbjt; - return(OK); - - case B3SOIPD_MOD_XDIF: - value->rValue = model->B3SOIPDxdif; - return(OK); - - case B3SOIPD_MOD_XREC: - value->rValue = model->B3SOIPDxrec; - return(OK); - case B3SOIPD_MOD_XTUN: - value->rValue = model->B3SOIPDxtun; - return(OK); - case B3SOIPD_MOD_TT: - value->rValue = model->B3SOIPDtt; - return(OK); - case B3SOIPD_MOD_VSDTH: - value->rValue = model->B3SOIPDvsdth; - return(OK); - case B3SOIPD_MOD_VSDFB: - value->rValue = model->B3SOIPDvsdfb; - return(OK); - case B3SOIPD_MOD_CSDMIN: - value->rValue = model->B3SOIPDcsdmin; - return(OK); - case B3SOIPD_MOD_ASD: - value->rValue = model->B3SOIPDasd; - return(OK); - - case B3SOIPD_MOD_TNOM : - value->rValue = model->B3SOIPDtnom; - return(OK); - case B3SOIPD_MOD_CGSO: - value->rValue = model->B3SOIPDcgso; - return(OK); - case B3SOIPD_MOD_CGDO: - value->rValue = model->B3SOIPDcgdo; - return(OK); - case B3SOIPD_MOD_CGEO: - value->rValue = model->B3SOIPDcgeo; - return(OK); - case B3SOIPD_MOD_XPART: - value->rValue = model->B3SOIPDxpart; - return(OK); - case B3SOIPD_MOD_RSH: - value->rValue = model->B3SOIPDsheetResistance; - return(OK); - case B3SOIPD_MOD_PBSWG: - value->rValue = model->B3SOIPDGatesidewallJctPotential; - return(OK); - case B3SOIPD_MOD_MJSWG: - value->rValue = model->B3SOIPDbodyJctGateSideGradingCoeff; - return(OK); - case B3SOIPD_MOD_CJSWG: - value->rValue = model->B3SOIPDunitLengthGateSidewallJctCap; - return(OK); - case B3SOIPD_MOD_CSDESW: - value->rValue = model->B3SOIPDcsdesw; - return(OK); - case B3SOIPD_MOD_LINT: - value->rValue = model->B3SOIPDLint; - return(OK); - case B3SOIPD_MOD_LL: - value->rValue = model->B3SOIPDLl; - return(OK); -/* v2.2.3 */ - case B3SOIPD_MOD_LLC: - value->rValue = model->B3SOIPDLlc; - return(OK); - - case B3SOIPD_MOD_LLN: - value->rValue = model->B3SOIPDLln; - return(OK); - case B3SOIPD_MOD_LW: - value->rValue = model->B3SOIPDLw; - return(OK); -/* v2.2.3 */ - case B3SOIPD_MOD_LWC: - value->rValue = model->B3SOIPDLwc; - return(OK); - - case B3SOIPD_MOD_LWN: - value->rValue = model->B3SOIPDLwn; - return(OK); - case B3SOIPD_MOD_LWL: - value->rValue = model->B3SOIPDLwl; - return(OK); -/* v2.2.3 */ - case B3SOIPD_MOD_LWLC: - value->rValue = model->B3SOIPDLwlc; - return(OK); - - case B3SOIPD_MOD_WINT: - value->rValue = model->B3SOIPDWint; - return(OK); - case B3SOIPD_MOD_WL: - value->rValue = model->B3SOIPDWl; - return(OK); -/* v2.2.3 */ - case B3SOIPD_MOD_WLC: - value->rValue = model->B3SOIPDWlc; - return(OK); - - case B3SOIPD_MOD_WLN: - value->rValue = model->B3SOIPDWln; - return(OK); - case B3SOIPD_MOD_WW: - value->rValue = model->B3SOIPDWw; - return(OK); -/* v2.2.3 */ - case B3SOIPD_MOD_WWC: - value->rValue = model->B3SOIPDWwc; - return(OK); - - case B3SOIPD_MOD_WWN: - value->rValue = model->B3SOIPDWwn; - return(OK); - case B3SOIPD_MOD_WWL: - value->rValue = model->B3SOIPDWwl; - return(OK); -/* v2.2.3 */ - case B3SOIPD_MOD_WWLC: - value->rValue = model->B3SOIPDWwlc; - return(OK); - - case B3SOIPD_MOD_NOIA: - value->rValue = model->B3SOIPDoxideTrapDensityA; - return(OK); - case B3SOIPD_MOD_NOIB: - value->rValue = model->B3SOIPDoxideTrapDensityB; - return(OK); - case B3SOIPD_MOD_NOIC: - value->rValue = model->B3SOIPDoxideTrapDensityC; - return(OK); - case B3SOIPD_MOD_NOIF: - value->rValue = model->B3SOIPDnoif; - return(OK); - case B3SOIPD_MOD_EM: - value->rValue = model->B3SOIPDem; - return(OK); - case B3SOIPD_MOD_EF: - value->rValue = model->B3SOIPDef; - return(OK); - case B3SOIPD_MOD_AF: - value->rValue = model->B3SOIPDaf; - return(OK); - case B3SOIPD_MOD_KF: - value->rValue = model->B3SOIPDkf; - return(OK); - - -/* v2.0 release */ - case B3SOIPD_MOD_K1W1: - value->rValue = model->B3SOIPDk1w1; - return(OK); - case B3SOIPD_MOD_K1W2: - value->rValue = model->B3SOIPDk1w2; - return(OK); - case B3SOIPD_MOD_KETAS: - value->rValue = model->B3SOIPDketas; - return(OK); - case B3SOIPD_MOD_DWBC: - value->rValue = model->B3SOIPDdwbc; - return(OK); - case B3SOIPD_MOD_BETA0: - value->rValue = model->B3SOIPDbeta0; - return(OK); - case B3SOIPD_MOD_BETA1: - value->rValue = model->B3SOIPDbeta1; - return(OK); - case B3SOIPD_MOD_BETA2: - value->rValue = model->B3SOIPDbeta2; - return(OK); - case B3SOIPD_MOD_VDSATII0: - value->rValue = model->B3SOIPDvdsatii0; - return(OK); - case B3SOIPD_MOD_TII: - value->rValue = model->B3SOIPDtii; - return(OK); - case B3SOIPD_MOD_LII: - value->rValue = model->B3SOIPDlii; - return(OK); - case B3SOIPD_MOD_SII0: - value->rValue = model->B3SOIPDsii0; - return(OK); - case B3SOIPD_MOD_SII1: - value->rValue = model->B3SOIPDsii1; - return(OK); - case B3SOIPD_MOD_SII2: - value->rValue = model->B3SOIPDsii2; - return(OK); - case B3SOIPD_MOD_SIID: - value->rValue = model->B3SOIPDsiid; - return(OK); - case B3SOIPD_MOD_FBJTII: - value->rValue = model->B3SOIPDfbjtii; - return(OK); - case B3SOIPD_MOD_ESATII: - value->rValue = model->B3SOIPDesatii; - return(OK); - case B3SOIPD_MOD_NTUN: - value->rValue = model->B3SOIPDntun; - return(OK); - case B3SOIPD_MOD_NRECF0: - value->rValue = model->B3SOIPDnrecf0; - return(OK); - case B3SOIPD_MOD_NRECR0: - value->rValue = model->B3SOIPDnrecr0; - return(OK); - case B3SOIPD_MOD_ISBJT: - value->rValue = model->B3SOIPDisbjt; - return(OK); - case B3SOIPD_MOD_ISDIF: - value->rValue = model->B3SOIPDisdif; - return(OK); - case B3SOIPD_MOD_ISREC: - value->rValue = model->B3SOIPDisrec; - return(OK); - case B3SOIPD_MOD_ISTUN: - value->rValue = model->B3SOIPDistun; - return(OK); - case B3SOIPD_MOD_LN: - value->rValue = model->B3SOIPDln; - return(OK); - case B3SOIPD_MOD_VREC0: - value->rValue = model->B3SOIPDvrec0; - return(OK); - case B3SOIPD_MOD_VTUN0: - value->rValue = model->B3SOIPDvtun0; - return(OK); - case B3SOIPD_MOD_NBJT: - value->rValue = model->B3SOIPDnbjt; - return(OK); - case B3SOIPD_MOD_LBJT0: - value->rValue = model->B3SOIPDlbjt0; - return(OK); - case B3SOIPD_MOD_LDIF0: - value->rValue = model->B3SOIPDldif0; - return(OK); - case B3SOIPD_MOD_VABJT: - value->rValue = model->B3SOIPDvabjt; - return(OK); - case B3SOIPD_MOD_AELY: - value->rValue = model->B3SOIPDaely; - return(OK); - case B3SOIPD_MOD_AHLI: - value->rValue = model->B3SOIPDahli; - return(OK); - case B3SOIPD_MOD_RBODY: - value->rValue = model->B3SOIPDrbody; - return(OK); - case B3SOIPD_MOD_RBSH: - value->rValue = model->B3SOIPDrbsh; - return(OK); - case B3SOIPD_MOD_NTRECF: - value->rValue = model->B3SOIPDntrecf; - return(OK); - case B3SOIPD_MOD_NTRECR: - value->rValue = model->B3SOIPDntrecr; - return(OK); - case B3SOIPD_MOD_NDIF: - value->rValue = model->B3SOIPDndif; - return(OK); - case B3SOIPD_MOD_DLCB: - value->rValue = model->B3SOIPDdlcb; - return(OK); - case B3SOIPD_MOD_FBODY: - value->rValue = model->B3SOIPDfbody; - return(OK); - case B3SOIPD_MOD_TCJSWG: - value->rValue = model->B3SOIPDtcjswg; - return(OK); - case B3SOIPD_MOD_TPBSWG: - value->rValue = model->B3SOIPDtpbswg; - return(OK); - case B3SOIPD_MOD_ACDE: - value->rValue = model->B3SOIPDacde; - return(OK); - case B3SOIPD_MOD_MOIN: - value->rValue = model->B3SOIPDmoin; - return(OK); - case B3SOIPD_MOD_DELVT: - value->rValue = model->B3SOIPDdelvt; - return(OK); - case B3SOIPD_MOD_KB1: - value->rValue = model->B3SOIPDkb1; - return(OK); - case B3SOIPD_MOD_DLBG: - value->rValue = model->B3SOIPDdlbg; - return(OK); - - case B3SOIPD_MOD_NGIDL: - value->rValue = model->B3SOIPDngidl; - return(OK); - case B3SOIPD_MOD_AGIDL: - value->rValue = model->B3SOIPDagidl; - return(OK); - case B3SOIPD_MOD_BGIDL: - value->rValue = model->B3SOIPDbgidl; - return(OK); - - -/* v2.2 release */ - case B3SOIPD_MOD_WTH0: - value->rValue = model->B3SOIPDwth0; - return(OK); - case B3SOIPD_MOD_RHALO: - value->rValue = model->B3SOIPDrhalo; - return(OK); - case B3SOIPD_MOD_NTOX: - value->rValue = model->B3SOIPDntox; - return(OK); - case B3SOIPD_MOD_TOXREF: - value->rValue = model->B3SOIPDtoxref; - return(OK); - case B3SOIPD_MOD_EBG: - value->rValue = model->B3SOIPDebg; - return(OK); - case B3SOIPD_MOD_VEVB: - value->rValue = model->B3SOIPDvevb; - return(OK); - case B3SOIPD_MOD_ALPHAGB1: - value->rValue = model->B3SOIPDalphaGB1; - return(OK); - case B3SOIPD_MOD_BETAGB1: - value->rValue = model->B3SOIPDbetaGB1; - return(OK); - case B3SOIPD_MOD_VGB1: - value->rValue = model->B3SOIPDvgb1; - return(OK); - case B3SOIPD_MOD_VECB: - value->rValue = model->B3SOIPDvecb; - return(OK); - case B3SOIPD_MOD_ALPHAGB2: - value->rValue = model->B3SOIPDalphaGB2; - return(OK); - case B3SOIPD_MOD_BETAGB2: - value->rValue = model->B3SOIPDbetaGB2; - return(OK); - case B3SOIPD_MOD_VGB2: - value->rValue = model->B3SOIPDvgb2; - return(OK); - case B3SOIPD_MOD_TOXQM: - value->rValue = model->B3SOIPDtoxqm; - return(OK); - case B3SOIPD_MOD_VOXH: - value->rValue = model->B3SOIPDvoxh; - return(OK); - case B3SOIPD_MOD_DELTAVOX: - value->rValue = model->B3SOIPDdeltavox; - return(OK); - case B3SOIPD_MOD_IGMOD: - value->iValue = model->B3SOIPDigMod; - return(OK); - - -/* Added for binning - START */ - /* Length Dependence */ - case B3SOIPD_MOD_LNPEAK: - value->rValue = model->B3SOIPDlnpeak; - return(OK); - case B3SOIPD_MOD_LNSUB: - value->rValue = model->B3SOIPDlnsub; - return(OK); - case B3SOIPD_MOD_LNGATE: - value->rValue = model->B3SOIPDlngate; - return(OK); - case B3SOIPD_MOD_LVTH0: - value->rValue = model->B3SOIPDlvth0; - return(OK); - case B3SOIPD_MOD_LK1: - value->rValue = model->B3SOIPDlk1; - return(OK); - case B3SOIPD_MOD_LK1W1: - value->rValue = model->B3SOIPDlk1w1; - return(OK); - case B3SOIPD_MOD_LK1W2: - value->rValue = model->B3SOIPDlk1w2; - return(OK); - case B3SOIPD_MOD_LK2: - value->rValue = model->B3SOIPDlk2; - return(OK); - case B3SOIPD_MOD_LK3: - value->rValue = model->B3SOIPDlk3; - return(OK); - case B3SOIPD_MOD_LK3B: - value->rValue = model->B3SOIPDlk3b; - return(OK); - case B3SOIPD_MOD_LKB1: - value->rValue = model->B3SOIPDlkb1; - return(OK); - case B3SOIPD_MOD_LW0: - value->rValue = model->B3SOIPDlw0; - return(OK); - case B3SOIPD_MOD_LNLX: - value->rValue = model->B3SOIPDlnlx; - return(OK); - case B3SOIPD_MOD_LDVT0 : - value->rValue = model->B3SOIPDldvt0; - return(OK); - case B3SOIPD_MOD_LDVT1 : - value->rValue = model->B3SOIPDldvt1; - return(OK); - case B3SOIPD_MOD_LDVT2 : - value->rValue = model->B3SOIPDldvt2; - return(OK); - case B3SOIPD_MOD_LDVT0W : - value->rValue = model->B3SOIPDldvt0w; - return(OK); - case B3SOIPD_MOD_LDVT1W : - value->rValue = model->B3SOIPDldvt1w; - return(OK); - case B3SOIPD_MOD_LDVT2W : - value->rValue = model->B3SOIPDldvt2w; - return(OK); - case B3SOIPD_MOD_LU0: - value->rValue = model->B3SOIPDlu0; - return(OK); - case B3SOIPD_MOD_LUA: - value->rValue = model->B3SOIPDlua; - return(OK); - case B3SOIPD_MOD_LUB: - value->rValue = model->B3SOIPDlub; - return(OK); - case B3SOIPD_MOD_LUC: - value->rValue = model->B3SOIPDluc; - return(OK); - case B3SOIPD_MOD_LVSAT: - value->rValue = model->B3SOIPDlvsat; - return(OK); - case B3SOIPD_MOD_LA0: - value->rValue = model->B3SOIPDla0; - return(OK); - case B3SOIPD_MOD_LAGS: - value->rValue = model->B3SOIPDlags; - return(OK); - case B3SOIPD_MOD_LB0: - value->rValue = model->B3SOIPDlb0; - return(OK); - case B3SOIPD_MOD_LB1: - value->rValue = model->B3SOIPDlb1; - return(OK); - case B3SOIPD_MOD_LKETA: - value->rValue = model->B3SOIPDlketa; - return(OK); - case B3SOIPD_MOD_LKETAS: - value->rValue = model->B3SOIPDlketas; - return(OK); - case B3SOIPD_MOD_LA1: - value->rValue = model->B3SOIPDla1; - return(OK); - case B3SOIPD_MOD_LA2: - value->rValue = model->B3SOIPDla2; - return(OK); - case B3SOIPD_MOD_LRDSW: - value->rValue = model->B3SOIPDlrdsw; - return(OK); - case B3SOIPD_MOD_LPRWB: - value->rValue = model->B3SOIPDlprwb; - return(OK); - case B3SOIPD_MOD_LPRWG: - value->rValue = model->B3SOIPDlprwg; - return(OK); - case B3SOIPD_MOD_LWR: - value->rValue = model->B3SOIPDlwr; - return(OK); - case B3SOIPD_MOD_LNFACTOR : - value->rValue = model->B3SOIPDlnfactor; - return(OK); - case B3SOIPD_MOD_LDWG: - value->rValue = model->B3SOIPDldwg; - return(OK); - case B3SOIPD_MOD_LDWB: - value->rValue = model->B3SOIPDldwb; - return(OK); - case B3SOIPD_MOD_LVOFF: - value->rValue = model->B3SOIPDlvoff; - return(OK); - case B3SOIPD_MOD_LETA0: - value->rValue = model->B3SOIPDleta0; - return(OK); - case B3SOIPD_MOD_LETAB: - value->rValue = model->B3SOIPDletab; - return(OK); - case B3SOIPD_MOD_LDSUB : - value->rValue = model->B3SOIPDldsub; - return(OK); - case B3SOIPD_MOD_LCIT : - value->rValue = model->B3SOIPDlcit; - return(OK); - case B3SOIPD_MOD_LCDSC : - value->rValue = model->B3SOIPDlcdsc; - return(OK); - case B3SOIPD_MOD_LCDSCB : - value->rValue = model->B3SOIPDlcdscb; - return(OK); - case B3SOIPD_MOD_LCDSCD : - value->rValue = model->B3SOIPDlcdscd; - return(OK); - case B3SOIPD_MOD_LPCLM: - value->rValue = model->B3SOIPDlpclm; - return(OK); - case B3SOIPD_MOD_LPDIBL1: - value->rValue = model->B3SOIPDlpdibl1; - return(OK); - case B3SOIPD_MOD_LPDIBL2: - value->rValue = model->B3SOIPDlpdibl2; - return(OK); - case B3SOIPD_MOD_LPDIBLB: - value->rValue = model->B3SOIPDlpdiblb; - return(OK); - case B3SOIPD_MOD_LDROUT : - value->rValue = model->B3SOIPDldrout; - return(OK); - case B3SOIPD_MOD_LPVAG: - value->rValue = model->B3SOIPDlpvag; - return(OK); - case B3SOIPD_MOD_LDELTA: - value->rValue = model->B3SOIPDldelta; - return(OK); - case B3SOIPD_MOD_LALPHA0: - value->rValue = model->B3SOIPDlalpha0; - return(OK); - case B3SOIPD_MOD_LFBJTII: - value->rValue = model->B3SOIPDlfbjtii; - return(OK); - case B3SOIPD_MOD_LBETA0: - value->rValue = model->B3SOIPDlbeta0; - return(OK); - case B3SOIPD_MOD_LBETA1: - value->rValue = model->B3SOIPDlbeta1; - return(OK); - case B3SOIPD_MOD_LBETA2: - value->rValue = model->B3SOIPDlbeta2; - return(OK); - case B3SOIPD_MOD_LVDSATII0: - value->rValue = model->B3SOIPDlvdsatii0; - return(OK); - case B3SOIPD_MOD_LLII: - value->rValue = model->B3SOIPDllii; - return(OK); - case B3SOIPD_MOD_LESATII: - value->rValue = model->B3SOIPDlesatii; - return(OK); - case B3SOIPD_MOD_LSII0: - value->rValue = model->B3SOIPDlsii0; - return(OK); - case B3SOIPD_MOD_LSII1: - value->rValue = model->B3SOIPDlsii1; - return(OK); - case B3SOIPD_MOD_LSII2: - value->rValue = model->B3SOIPDlsii2; - return(OK); - case B3SOIPD_MOD_LSIID: - value->rValue = model->B3SOIPDlsiid; - return(OK); - case B3SOIPD_MOD_LAGIDL: - value->rValue = model->B3SOIPDlagidl; - return(OK); - case B3SOIPD_MOD_LBGIDL: - value->rValue = model->B3SOIPDlbgidl; - return(OK); - case B3SOIPD_MOD_LNGIDL: - value->rValue = model->B3SOIPDlngidl; - return(OK); - case B3SOIPD_MOD_LNTUN: - value->rValue = model->B3SOIPDlntun; - return(OK); - case B3SOIPD_MOD_LNDIODE: - value->rValue = model->B3SOIPDlndiode; - return(OK); - case B3SOIPD_MOD_LNRECF0: - value->rValue = model->B3SOIPDlnrecf0; - return(OK); - case B3SOIPD_MOD_LNRECR0: - value->rValue = model->B3SOIPDlnrecr0; - return(OK); - case B3SOIPD_MOD_LISBJT: - value->rValue = model->B3SOIPDlisbjt; - return(OK); - case B3SOIPD_MOD_LISDIF: - value->rValue = model->B3SOIPDlisdif; - return(OK); - case B3SOIPD_MOD_LISREC: - value->rValue = model->B3SOIPDlisrec; - return(OK); - case B3SOIPD_MOD_LISTUN: - value->rValue = model->B3SOIPDlistun; - return(OK); - case B3SOIPD_MOD_LVREC0: - value->rValue = model->B3SOIPDlvrec0; - return(OK); - case B3SOIPD_MOD_LVTUN0: - value->rValue = model->B3SOIPDlvtun0; - return(OK); - case B3SOIPD_MOD_LNBJT: - value->rValue = model->B3SOIPDlnbjt; - return(OK); - case B3SOIPD_MOD_LLBJT0: - value->rValue = model->B3SOIPDllbjt0; - return(OK); - case B3SOIPD_MOD_LVABJT: - value->rValue = model->B3SOIPDlvabjt; - return(OK); - case B3SOIPD_MOD_LAELY: - value->rValue = model->B3SOIPDlaely; - return(OK); - case B3SOIPD_MOD_LAHLI: - value->rValue = model->B3SOIPDlahli; - return(OK); - /* CV Model */ - case B3SOIPD_MOD_LVSDFB: - value->rValue = model->B3SOIPDlvsdfb; - return(OK); - case B3SOIPD_MOD_LVSDTH: - value->rValue = model->B3SOIPDlvsdth; - return(OK); - case B3SOIPD_MOD_LDELVT: - value->rValue = model->B3SOIPDldelvt; - return(OK); - case B3SOIPD_MOD_LACDE: - value->rValue = model->B3SOIPDlacde; - return(OK); - case B3SOIPD_MOD_LMOIN: - value->rValue = model->B3SOIPDlmoin; - return(OK); - - /* Width Dependence */ - case B3SOIPD_MOD_WNPEAK: - value->rValue = model->B3SOIPDwnpeak; - return(OK); - case B3SOIPD_MOD_WNSUB: - value->rValue = model->B3SOIPDwnsub; - return(OK); - case B3SOIPD_MOD_WNGATE: - value->rValue = model->B3SOIPDwngate; - return(OK); - case B3SOIPD_MOD_WVTH0: - value->rValue = model->B3SOIPDwvth0; - return(OK); - case B3SOIPD_MOD_WK1: - value->rValue = model->B3SOIPDwk1; - return(OK); - case B3SOIPD_MOD_WK1W1: - value->rValue = model->B3SOIPDwk1w1; - return(OK); - case B3SOIPD_MOD_WK1W2: - value->rValue = model->B3SOIPDwk1w2; - return(OK); - case B3SOIPD_MOD_WK2: - value->rValue = model->B3SOIPDwk2; - return(OK); - case B3SOIPD_MOD_WK3: - value->rValue = model->B3SOIPDwk3; - return(OK); - case B3SOIPD_MOD_WK3B: - value->rValue = model->B3SOIPDwk3b; - return(OK); - case B3SOIPD_MOD_WKB1: - value->rValue = model->B3SOIPDwkb1; - return(OK); - case B3SOIPD_MOD_WW0: - value->rValue = model->B3SOIPDww0; - return(OK); - case B3SOIPD_MOD_WNLX: - value->rValue = model->B3SOIPDwnlx; - return(OK); - case B3SOIPD_MOD_WDVT0 : - value->rValue = model->B3SOIPDwdvt0; - return(OK); - case B3SOIPD_MOD_WDVT1 : - value->rValue = model->B3SOIPDwdvt1; - return(OK); - case B3SOIPD_MOD_WDVT2 : - value->rValue = model->B3SOIPDwdvt2; - return(OK); - case B3SOIPD_MOD_WDVT0W : - value->rValue = model->B3SOIPDwdvt0w; - return(OK); - case B3SOIPD_MOD_WDVT1W : - value->rValue = model->B3SOIPDwdvt1w; - return(OK); - case B3SOIPD_MOD_WDVT2W : - value->rValue = model->B3SOIPDwdvt2w; - return(OK); - case B3SOIPD_MOD_WU0: - value->rValue = model->B3SOIPDwu0; - return(OK); - case B3SOIPD_MOD_WUA: - value->rValue = model->B3SOIPDwua; - return(OK); - case B3SOIPD_MOD_WUB: - value->rValue = model->B3SOIPDwub; - return(OK); - case B3SOIPD_MOD_WUC: - value->rValue = model->B3SOIPDwuc; - return(OK); - case B3SOIPD_MOD_WVSAT: - value->rValue = model->B3SOIPDwvsat; - return(OK); - case B3SOIPD_MOD_WA0: - value->rValue = model->B3SOIPDwa0; - return(OK); - case B3SOIPD_MOD_WAGS: - value->rValue = model->B3SOIPDwags; - return(OK); - case B3SOIPD_MOD_WB0: - value->rValue = model->B3SOIPDwb0; - return(OK); - case B3SOIPD_MOD_WB1: - value->rValue = model->B3SOIPDwb1; - return(OK); - case B3SOIPD_MOD_WKETA: - value->rValue = model->B3SOIPDwketa; - return(OK); - case B3SOIPD_MOD_WKETAS: - value->rValue = model->B3SOIPDwketas; - return(OK); - case B3SOIPD_MOD_WA1: - value->rValue = model->B3SOIPDwa1; - return(OK); - case B3SOIPD_MOD_WA2: - value->rValue = model->B3SOIPDwa2; - return(OK); - case B3SOIPD_MOD_WRDSW: - value->rValue = model->B3SOIPDwrdsw; - return(OK); - case B3SOIPD_MOD_WPRWB: - value->rValue = model->B3SOIPDwprwb; - return(OK); - case B3SOIPD_MOD_WPRWG: - value->rValue = model->B3SOIPDwprwg; - return(OK); - case B3SOIPD_MOD_WWR: - value->rValue = model->B3SOIPDwwr; - return(OK); - case B3SOIPD_MOD_WNFACTOR : - value->rValue = model->B3SOIPDwnfactor; - return(OK); - case B3SOIPD_MOD_WDWG: - value->rValue = model->B3SOIPDwdwg; - return(OK); - case B3SOIPD_MOD_WDWB: - value->rValue = model->B3SOIPDwdwb; - return(OK); - case B3SOIPD_MOD_WVOFF: - value->rValue = model->B3SOIPDwvoff; - return(OK); - case B3SOIPD_MOD_WETA0: - value->rValue = model->B3SOIPDweta0; - return(OK); - case B3SOIPD_MOD_WETAB: - value->rValue = model->B3SOIPDwetab; - return(OK); - case B3SOIPD_MOD_WDSUB : - value->rValue = model->B3SOIPDwdsub; - return(OK); - case B3SOIPD_MOD_WCIT : - value->rValue = model->B3SOIPDwcit; - return(OK); - case B3SOIPD_MOD_WCDSC : - value->rValue = model->B3SOIPDwcdsc; - return(OK); - case B3SOIPD_MOD_WCDSCB : - value->rValue = model->B3SOIPDwcdscb; - return(OK); - case B3SOIPD_MOD_WCDSCD : - value->rValue = model->B3SOIPDwcdscd; - return(OK); - case B3SOIPD_MOD_WPCLM: - value->rValue = model->B3SOIPDwpclm; - return(OK); - case B3SOIPD_MOD_WPDIBL1: - value->rValue = model->B3SOIPDwpdibl1; - return(OK); - case B3SOIPD_MOD_WPDIBL2: - value->rValue = model->B3SOIPDwpdibl2; - return(OK); - case B3SOIPD_MOD_WPDIBLB: - value->rValue = model->B3SOIPDwpdiblb; - return(OK); - case B3SOIPD_MOD_WDROUT : - value->rValue = model->B3SOIPDwdrout; - return(OK); - case B3SOIPD_MOD_WPVAG: - value->rValue = model->B3SOIPDwpvag; - return(OK); - case B3SOIPD_MOD_WDELTA: - value->rValue = model->B3SOIPDwdelta; - return(OK); - case B3SOIPD_MOD_WALPHA0: - value->rValue = model->B3SOIPDwalpha0; - return(OK); - case B3SOIPD_MOD_WFBJTII: - value->rValue = model->B3SOIPDwfbjtii; - return(OK); - case B3SOIPD_MOD_WBETA0: - value->rValue = model->B3SOIPDwbeta0; - return(OK); - case B3SOIPD_MOD_WBETA1: - value->rValue = model->B3SOIPDwbeta1; - return(OK); - case B3SOIPD_MOD_WBETA2: - value->rValue = model->B3SOIPDwbeta2; - return(OK); - case B3SOIPD_MOD_WVDSATII0: - value->rValue = model->B3SOIPDwvdsatii0; - return(OK); - case B3SOIPD_MOD_WLII: - value->rValue = model->B3SOIPDwlii; - return(OK); - case B3SOIPD_MOD_WESATII: - value->rValue = model->B3SOIPDwesatii; - return(OK); - case B3SOIPD_MOD_WSII0: - value->rValue = model->B3SOIPDwsii0; - return(OK); - case B3SOIPD_MOD_WSII1: - value->rValue = model->B3SOIPDwsii1; - return(OK); - case B3SOIPD_MOD_WSII2: - value->rValue = model->B3SOIPDwsii2; - return(OK); - case B3SOIPD_MOD_WSIID: - value->rValue = model->B3SOIPDwsiid; - return(OK); - case B3SOIPD_MOD_WAGIDL: - value->rValue = model->B3SOIPDwagidl; - return(OK); - case B3SOIPD_MOD_WBGIDL: - value->rValue = model->B3SOIPDwbgidl; - return(OK); - case B3SOIPD_MOD_WNGIDL: - value->rValue = model->B3SOIPDwngidl; - return(OK); - case B3SOIPD_MOD_WNTUN: - value->rValue = model->B3SOIPDwntun; - return(OK); - case B3SOIPD_MOD_WNDIODE: - value->rValue = model->B3SOIPDwndiode; - return(OK); - case B3SOIPD_MOD_WNRECF0: - value->rValue = model->B3SOIPDwnrecf0; - return(OK); - case B3SOIPD_MOD_WNRECR0: - value->rValue = model->B3SOIPDwnrecr0; - return(OK); - case B3SOIPD_MOD_WISBJT: - value->rValue = model->B3SOIPDwisbjt; - return(OK); - case B3SOIPD_MOD_WISDIF: - value->rValue = model->B3SOIPDwisdif; - return(OK); - case B3SOIPD_MOD_WISREC: - value->rValue = model->B3SOIPDwisrec; - return(OK); - case B3SOIPD_MOD_WISTUN: - value->rValue = model->B3SOIPDwistun; - return(OK); - case B3SOIPD_MOD_WVREC0: - value->rValue = model->B3SOIPDwvrec0; - return(OK); - case B3SOIPD_MOD_WVTUN0: - value->rValue = model->B3SOIPDwvtun0; - return(OK); - case B3SOIPD_MOD_WNBJT: - value->rValue = model->B3SOIPDwnbjt; - return(OK); - case B3SOIPD_MOD_WLBJT0: - value->rValue = model->B3SOIPDwlbjt0; - return(OK); - case B3SOIPD_MOD_WVABJT: - value->rValue = model->B3SOIPDwvabjt; - return(OK); - case B3SOIPD_MOD_WAELY: - value->rValue = model->B3SOIPDwaely; - return(OK); - case B3SOIPD_MOD_WAHLI: - value->rValue = model->B3SOIPDwahli; - return(OK); - /* CV Model */ - case B3SOIPD_MOD_WVSDFB: - value->rValue = model->B3SOIPDwvsdfb; - return(OK); - case B3SOIPD_MOD_WVSDTH: - value->rValue = model->B3SOIPDwvsdth; - return(OK); - case B3SOIPD_MOD_WDELVT: - value->rValue = model->B3SOIPDwdelvt; - return(OK); - case B3SOIPD_MOD_WACDE: - value->rValue = model->B3SOIPDwacde; - return(OK); - case B3SOIPD_MOD_WMOIN: - value->rValue = model->B3SOIPDwmoin; - return(OK); - - /* Cross-term Dependence */ - case B3SOIPD_MOD_PNPEAK: - value->rValue = model->B3SOIPDpnpeak; - return(OK); - case B3SOIPD_MOD_PNSUB: - value->rValue = model->B3SOIPDpnsub; - return(OK); - case B3SOIPD_MOD_PNGATE: - value->rValue = model->B3SOIPDpngate; - return(OK); - case B3SOIPD_MOD_PVTH0: - value->rValue = model->B3SOIPDpvth0; - return(OK); - case B3SOIPD_MOD_PK1: - value->rValue = model->B3SOIPDpk1; - return(OK); - case B3SOIPD_MOD_PK1W1: - value->rValue = model->B3SOIPDpk1w1; - return(OK); - case B3SOIPD_MOD_PK1W2: - value->rValue = model->B3SOIPDpk1w2; - return(OK); - case B3SOIPD_MOD_PK2: - value->rValue = model->B3SOIPDpk2; - return(OK); - case B3SOIPD_MOD_PK3: - value->rValue = model->B3SOIPDpk3; - return(OK); - case B3SOIPD_MOD_PK3B: - value->rValue = model->B3SOIPDpk3b; - return(OK); - case B3SOIPD_MOD_PKB1: - value->rValue = model->B3SOIPDpkb1; - return(OK); - case B3SOIPD_MOD_PW0: - value->rValue = model->B3SOIPDpw0; - return(OK); - case B3SOIPD_MOD_PNLX: - value->rValue = model->B3SOIPDpnlx; - return(OK); - case B3SOIPD_MOD_PDVT0 : - value->rValue = model->B3SOIPDpdvt0; - return(OK); - case B3SOIPD_MOD_PDVT1 : - value->rValue = model->B3SOIPDpdvt1; - return(OK); - case B3SOIPD_MOD_PDVT2 : - value->rValue = model->B3SOIPDpdvt2; - return(OK); - case B3SOIPD_MOD_PDVT0W : - value->rValue = model->B3SOIPDpdvt0w; - return(OK); - case B3SOIPD_MOD_PDVT1W : - value->rValue = model->B3SOIPDpdvt1w; - return(OK); - case B3SOIPD_MOD_PDVT2W : - value->rValue = model->B3SOIPDpdvt2w; - return(OK); - case B3SOIPD_MOD_PU0: - value->rValue = model->B3SOIPDpu0; - return(OK); - case B3SOIPD_MOD_PUA: - value->rValue = model->B3SOIPDpua; - return(OK); - case B3SOIPD_MOD_PUB: - value->rValue = model->B3SOIPDpub; - return(OK); - case B3SOIPD_MOD_PUC: - value->rValue = model->B3SOIPDpuc; - return(OK); - case B3SOIPD_MOD_PVSAT: - value->rValue = model->B3SOIPDpvsat; - return(OK); - case B3SOIPD_MOD_PA0: - value->rValue = model->B3SOIPDpa0; - return(OK); - case B3SOIPD_MOD_PAGS: - value->rValue = model->B3SOIPDpags; - return(OK); - case B3SOIPD_MOD_PB0: - value->rValue = model->B3SOIPDpb0; - return(OK); - case B3SOIPD_MOD_PB1: - value->rValue = model->B3SOIPDpb1; - return(OK); - case B3SOIPD_MOD_PKETA: - value->rValue = model->B3SOIPDpketa; - return(OK); - case B3SOIPD_MOD_PKETAS: - value->rValue = model->B3SOIPDpketas; - return(OK); - case B3SOIPD_MOD_PA1: - value->rValue = model->B3SOIPDpa1; - return(OK); - case B3SOIPD_MOD_PA2: - value->rValue = model->B3SOIPDpa2; - return(OK); - case B3SOIPD_MOD_PRDSW: - value->rValue = model->B3SOIPDprdsw; - return(OK); - case B3SOIPD_MOD_PPRWB: - value->rValue = model->B3SOIPDpprwb; - return(OK); - case B3SOIPD_MOD_PPRWG: - value->rValue = model->B3SOIPDpprwg; - return(OK); - case B3SOIPD_MOD_PWR: - value->rValue = model->B3SOIPDpwr; - return(OK); - case B3SOIPD_MOD_PNFACTOR : - value->rValue = model->B3SOIPDpnfactor; - return(OK); - case B3SOIPD_MOD_PDWG: - value->rValue = model->B3SOIPDpdwg; - return(OK); - case B3SOIPD_MOD_PDWB: - value->rValue = model->B3SOIPDpdwb; - return(OK); - case B3SOIPD_MOD_PVOFF: - value->rValue = model->B3SOIPDpvoff; - return(OK); - case B3SOIPD_MOD_PETA0: - value->rValue = model->B3SOIPDpeta0; - return(OK); - case B3SOIPD_MOD_PETAB: - value->rValue = model->B3SOIPDpetab; - return(OK); - case B3SOIPD_MOD_PDSUB : - value->rValue = model->B3SOIPDpdsub; - return(OK); - case B3SOIPD_MOD_PCIT : - value->rValue = model->B3SOIPDpcit; - return(OK); - case B3SOIPD_MOD_PCDSC : - value->rValue = model->B3SOIPDpcdsc; - return(OK); - case B3SOIPD_MOD_PCDSCB : - value->rValue = model->B3SOIPDpcdscb; - return(OK); - case B3SOIPD_MOD_PCDSCD : - value->rValue = model->B3SOIPDpcdscd; - return(OK); - case B3SOIPD_MOD_PPCLM: - value->rValue = model->B3SOIPDppclm; - return(OK); - case B3SOIPD_MOD_PPDIBL1: - value->rValue = model->B3SOIPDppdibl1; - return(OK); - case B3SOIPD_MOD_PPDIBL2: - value->rValue = model->B3SOIPDppdibl2; - return(OK); - case B3SOIPD_MOD_PPDIBLB: - value->rValue = model->B3SOIPDppdiblb; - return(OK); - case B3SOIPD_MOD_PDROUT : - value->rValue = model->B3SOIPDpdrout; - return(OK); - case B3SOIPD_MOD_PPVAG: - value->rValue = model->B3SOIPDppvag; - return(OK); - case B3SOIPD_MOD_PDELTA: - value->rValue = model->B3SOIPDpdelta; - return(OK); - case B3SOIPD_MOD_PALPHA0: - value->rValue = model->B3SOIPDpalpha0; - return(OK); - case B3SOIPD_MOD_PFBJTII: - value->rValue = model->B3SOIPDpfbjtii; - return(OK); - case B3SOIPD_MOD_PBETA0: - value->rValue = model->B3SOIPDpbeta0; - return(OK); - case B3SOIPD_MOD_PBETA1: - value->rValue = model->B3SOIPDpbeta1; - return(OK); - case B3SOIPD_MOD_PBETA2: - value->rValue = model->B3SOIPDpbeta2; - return(OK); - case B3SOIPD_MOD_PVDSATII0: - value->rValue = model->B3SOIPDpvdsatii0; - return(OK); - case B3SOIPD_MOD_PLII: - value->rValue = model->B3SOIPDplii; - return(OK); - case B3SOIPD_MOD_PESATII: - value->rValue = model->B3SOIPDpesatii; - return(OK); - case B3SOIPD_MOD_PSII0: - value->rValue = model->B3SOIPDpsii0; - return(OK); - case B3SOIPD_MOD_PSII1: - value->rValue = model->B3SOIPDpsii1; - return(OK); - case B3SOIPD_MOD_PSII2: - value->rValue = model->B3SOIPDpsii2; - return(OK); - case B3SOIPD_MOD_PSIID: - value->rValue = model->B3SOIPDpsiid; - return(OK); - case B3SOIPD_MOD_PAGIDL: - value->rValue = model->B3SOIPDpagidl; - return(OK); - case B3SOIPD_MOD_PBGIDL: - value->rValue = model->B3SOIPDpbgidl; - return(OK); - case B3SOIPD_MOD_PNGIDL: - value->rValue = model->B3SOIPDpngidl; - return(OK); - case B3SOIPD_MOD_PNTUN: - value->rValue = model->B3SOIPDpntun; - return(OK); - case B3SOIPD_MOD_PNDIODE: - value->rValue = model->B3SOIPDpndiode; - return(OK); - case B3SOIPD_MOD_PNRECF0: - value->rValue = model->B3SOIPDpnrecf0; - return(OK); - case B3SOIPD_MOD_PNRECR0: - value->rValue = model->B3SOIPDpnrecr0; - return(OK); - case B3SOIPD_MOD_PISBJT: - value->rValue = model->B3SOIPDpisbjt; - return(OK); - case B3SOIPD_MOD_PISDIF: - value->rValue = model->B3SOIPDpisdif; - return(OK); - case B3SOIPD_MOD_PISREC: - value->rValue = model->B3SOIPDpisrec; - return(OK); - case B3SOIPD_MOD_PISTUN: - value->rValue = model->B3SOIPDpistun; - return(OK); - case B3SOIPD_MOD_PVREC0: - value->rValue = model->B3SOIPDpvrec0; - return(OK); - case B3SOIPD_MOD_PVTUN0: - value->rValue = model->B3SOIPDpvtun0; - return(OK); - case B3SOIPD_MOD_PNBJT: - value->rValue = model->B3SOIPDpnbjt; - return(OK); - case B3SOIPD_MOD_PLBJT0: - value->rValue = model->B3SOIPDplbjt0; - return(OK); - case B3SOIPD_MOD_PVABJT: - value->rValue = model->B3SOIPDpvabjt; - return(OK); - case B3SOIPD_MOD_PAELY: - value->rValue = model->B3SOIPDpaely; - return(OK); - case B3SOIPD_MOD_PAHLI: - value->rValue = model->B3SOIPDpahli; - return(OK); - /* CV Model */ - case B3SOIPD_MOD_PVSDFB: - value->rValue = model->B3SOIPDpvsdfb; - return(OK); - case B3SOIPD_MOD_PVSDTH: - value->rValue = model->B3SOIPDpvsdth; - return(OK); - case B3SOIPD_MOD_PDELVT: - value->rValue = model->B3SOIPDpdelvt; - return(OK); - case B3SOIPD_MOD_PACDE: - value->rValue = model->B3SOIPDpacde; - return(OK); - case B3SOIPD_MOD_PMOIN: - value->rValue = model->B3SOIPDpmoin; - return(OK); -/* Added for binning - END */ - - default: - return(E_BADPARM); - } - /* NOTREACHED */ -} - - - diff --git a/src/spicelib/devices/bsim3soi_pd/b3soipdmpar.c b/src/spicelib/devices/bsim3soi_pd/b3soipdmpar.c deleted file mode 100644 index 6d52f5535..000000000 --- a/src/spicelib/devices/bsim3soi_pd/b3soipdmpar.c +++ /dev/null @@ -1,1960 +0,0 @@ -/********** -Copyright 1990 Regents of the University of California. All rights reserved. -Author: 1998 Samuel Fung, Dennis Sinitsky and Stephen Tang -File: b3soipdmpar.c 98/5/01 -Modified by Pin Su and Jan Feng 99/2/15 -Modified by Pin Su 99/4/30 -Modified by Wei Jin 99/9/27 -Modified by Pin Su 00/3/1 -Modified by Pin Su 01/2/15 -Modified by Pin Su 02/3/5 -Modified by Paolo Nenzi 2002 -**********/ - -/* - * Revision 2.2.3 02/3/5 Pin Su - * BSIMPD2.2.3 release - */ - -#include "ngspice/ngspice.h" -#include "b3soipddef.h" -#include "ngspice/ifsim.h" -#include "ngspice/sperror.h" -#include "ngspice/suffix.h" - - -int -B3SOIPDmParam(int param, IFvalue *value, GENmodel *inMod) -{ - B3SOIPDmodel *mod = (B3SOIPDmodel*)inMod; - switch(param) - { - - case B3SOIPD_MOD_MOBMOD : - mod->B3SOIPDmobMod = value->iValue; - mod->B3SOIPDmobModGiven = TRUE; - break; - case B3SOIPD_MOD_BINUNIT : - mod->B3SOIPDbinUnit = value->iValue; - mod->B3SOIPDbinUnitGiven = TRUE; - break; - case B3SOIPD_MOD_PARAMCHK : - mod->B3SOIPDparamChk = value->iValue; - mod->B3SOIPDparamChkGiven = TRUE; - break; - case B3SOIPD_MOD_CAPMOD : - mod->B3SOIPDcapMod = value->iValue; - mod->B3SOIPDcapModGiven = TRUE; - break; - case B3SOIPD_MOD_SHMOD : - mod->B3SOIPDshMod = value->iValue; - mod->B3SOIPDshModGiven = TRUE; - break; - case B3SOIPD_MOD_NOIMOD : - mod->B3SOIPDnoiMod = value->iValue; - mod->B3SOIPDnoiModGiven = TRUE; - break; - case B3SOIPD_MOD_VERSION : - mod->B3SOIPDversion = value->rValue; - mod->B3SOIPDversionGiven = TRUE; - break; - case B3SOIPD_MOD_TOX : - mod->B3SOIPDtox = value->rValue; - mod->B3SOIPDtoxGiven = TRUE; - break; -/* v2.2.3 */ - case B3SOIPD_MOD_DTOXCV : - mod->B3SOIPDdtoxcv = value->rValue; - mod->B3SOIPDdtoxcvGiven = TRUE; - break; - - case B3SOIPD_MOD_CDSC : - mod->B3SOIPDcdsc = value->rValue; - mod->B3SOIPDcdscGiven = TRUE; - break; - case B3SOIPD_MOD_CDSCB : - mod->B3SOIPDcdscb = value->rValue; - mod->B3SOIPDcdscbGiven = TRUE; - break; - - case B3SOIPD_MOD_CDSCD : - mod->B3SOIPDcdscd = value->rValue; - mod->B3SOIPDcdscdGiven = TRUE; - break; - - case B3SOIPD_MOD_CIT : - mod->B3SOIPDcit = value->rValue; - mod->B3SOIPDcitGiven = TRUE; - break; - case B3SOIPD_MOD_NFACTOR : - mod->B3SOIPDnfactor = value->rValue; - mod->B3SOIPDnfactorGiven = TRUE; - break; - case B3SOIPD_MOD_VSAT: - mod->B3SOIPDvsat = value->rValue; - mod->B3SOIPDvsatGiven = TRUE; - break; - case B3SOIPD_MOD_A0: - mod->B3SOIPDa0 = value->rValue; - mod->B3SOIPDa0Given = TRUE; - break; - - case B3SOIPD_MOD_AGS: - mod->B3SOIPDags= value->rValue; - mod->B3SOIPDagsGiven = TRUE; - break; - - case B3SOIPD_MOD_A1: - mod->B3SOIPDa1 = value->rValue; - mod->B3SOIPDa1Given = TRUE; - break; - case B3SOIPD_MOD_A2: - mod->B3SOIPDa2 = value->rValue; - mod->B3SOIPDa2Given = TRUE; - break; - case B3SOIPD_MOD_AT: - mod->B3SOIPDat = value->rValue; - mod->B3SOIPDatGiven = TRUE; - break; - case B3SOIPD_MOD_KETA: - mod->B3SOIPDketa = value->rValue; - mod->B3SOIPDketaGiven = TRUE; - break; - case B3SOIPD_MOD_NSUB: - mod->B3SOIPDnsub = value->rValue; - mod->B3SOIPDnsubGiven = TRUE; - break; - case B3SOIPD_MOD_NPEAK: - mod->B3SOIPDnpeak = value->rValue; - mod->B3SOIPDnpeakGiven = TRUE; - if (mod->B3SOIPDnpeak > 1.0e20) - mod->B3SOIPDnpeak *= 1.0e-6; - break; - case B3SOIPD_MOD_NGATE: - mod->B3SOIPDngate = value->rValue; - mod->B3SOIPDngateGiven = TRUE; - if (mod->B3SOIPDngate > 1.0e23) - mod->B3SOIPDngate *= 1.0e-6; - break; - case B3SOIPD_MOD_GAMMA1: - mod->B3SOIPDgamma1 = value->rValue; - mod->B3SOIPDgamma1Given = TRUE; - break; - case B3SOIPD_MOD_GAMMA2: - mod->B3SOIPDgamma2 = value->rValue; - mod->B3SOIPDgamma2Given = TRUE; - break; - case B3SOIPD_MOD_VBX: - mod->B3SOIPDvbx = value->rValue; - mod->B3SOIPDvbxGiven = TRUE; - break; - case B3SOIPD_MOD_VBM: - mod->B3SOIPDvbm = value->rValue; - mod->B3SOIPDvbmGiven = TRUE; - break; - case B3SOIPD_MOD_XT: - mod->B3SOIPDxt = value->rValue; - mod->B3SOIPDxtGiven = TRUE; - break; - case B3SOIPD_MOD_K1: - mod->B3SOIPDk1 = value->rValue; - mod->B3SOIPDk1Given = TRUE; - break; - case B3SOIPD_MOD_KT1: - mod->B3SOIPDkt1 = value->rValue; - mod->B3SOIPDkt1Given = TRUE; - break; - case B3SOIPD_MOD_KT1L: - mod->B3SOIPDkt1l = value->rValue; - mod->B3SOIPDkt1lGiven = TRUE; - break; - case B3SOIPD_MOD_KT2: - mod->B3SOIPDkt2 = value->rValue; - mod->B3SOIPDkt2Given = TRUE; - break; - case B3SOIPD_MOD_K2: - mod->B3SOIPDk2 = value->rValue; - mod->B3SOIPDk2Given = TRUE; - break; - case B3SOIPD_MOD_K3: - mod->B3SOIPDk3 = value->rValue; - mod->B3SOIPDk3Given = TRUE; - break; - case B3SOIPD_MOD_K3B: - mod->B3SOIPDk3b = value->rValue; - mod->B3SOIPDk3bGiven = TRUE; - break; - case B3SOIPD_MOD_NLX: - mod->B3SOIPDnlx = value->rValue; - mod->B3SOIPDnlxGiven = TRUE; - break; - case B3SOIPD_MOD_W0: - mod->B3SOIPDw0 = value->rValue; - mod->B3SOIPDw0Given = TRUE; - break; - case B3SOIPD_MOD_DVT0: - mod->B3SOIPDdvt0 = value->rValue; - mod->B3SOIPDdvt0Given = TRUE; - break; - case B3SOIPD_MOD_DVT1: - mod->B3SOIPDdvt1 = value->rValue; - mod->B3SOIPDdvt1Given = TRUE; - break; - case B3SOIPD_MOD_DVT2: - mod->B3SOIPDdvt2 = value->rValue; - mod->B3SOIPDdvt2Given = TRUE; - break; - case B3SOIPD_MOD_DVT0W: - mod->B3SOIPDdvt0w = value->rValue; - mod->B3SOIPDdvt0wGiven = TRUE; - break; - case B3SOIPD_MOD_DVT1W: - mod->B3SOIPDdvt1w = value->rValue; - mod->B3SOIPDdvt1wGiven = TRUE; - break; - case B3SOIPD_MOD_DVT2W: - mod->B3SOIPDdvt2w = value->rValue; - mod->B3SOIPDdvt2wGiven = TRUE; - break; - case B3SOIPD_MOD_DROUT: - mod->B3SOIPDdrout = value->rValue; - mod->B3SOIPDdroutGiven = TRUE; - break; - case B3SOIPD_MOD_DSUB: - mod->B3SOIPDdsub = value->rValue; - mod->B3SOIPDdsubGiven = TRUE; - break; - case B3SOIPD_MOD_VTH0: - mod->B3SOIPDvth0 = value->rValue; - mod->B3SOIPDvth0Given = TRUE; - break; - case B3SOIPD_MOD_UA: - mod->B3SOIPDua = value->rValue; - mod->B3SOIPDuaGiven = TRUE; - break; - case B3SOIPD_MOD_UA1: - mod->B3SOIPDua1 = value->rValue; - mod->B3SOIPDua1Given = TRUE; - break; - case B3SOIPD_MOD_UB: - mod->B3SOIPDub = value->rValue; - mod->B3SOIPDubGiven = TRUE; - break; - case B3SOIPD_MOD_UB1: - mod->B3SOIPDub1 = value->rValue; - mod->B3SOIPDub1Given = TRUE; - break; - case B3SOIPD_MOD_UC: - mod->B3SOIPDuc = value->rValue; - mod->B3SOIPDucGiven = TRUE; - break; - case B3SOIPD_MOD_UC1: - mod->B3SOIPDuc1 = value->rValue; - mod->B3SOIPDuc1Given = TRUE; - break; - case B3SOIPD_MOD_U0 : - mod->B3SOIPDu0 = value->rValue; - mod->B3SOIPDu0Given = TRUE; - break; - case B3SOIPD_MOD_UTE : - mod->B3SOIPDute = value->rValue; - mod->B3SOIPDuteGiven = TRUE; - break; - case B3SOIPD_MOD_VOFF: - mod->B3SOIPDvoff = value->rValue; - mod->B3SOIPDvoffGiven = TRUE; - break; - case B3SOIPD_MOD_DELTA : - mod->B3SOIPDdelta = value->rValue; - mod->B3SOIPDdeltaGiven = TRUE; - break; - case B3SOIPD_MOD_RDSW: - mod->B3SOIPDrdsw = value->rValue; - mod->B3SOIPDrdswGiven = TRUE; - break; - case B3SOIPD_MOD_PRWG: - mod->B3SOIPDprwg = value->rValue; - mod->B3SOIPDprwgGiven = TRUE; - break; - case B3SOIPD_MOD_PRWB: - mod->B3SOIPDprwb = value->rValue; - mod->B3SOIPDprwbGiven = TRUE; - break; - case B3SOIPD_MOD_PRT: - mod->B3SOIPDprt = value->rValue; - mod->B3SOIPDprtGiven = TRUE; - break; - case B3SOIPD_MOD_ETA0: - mod->B3SOIPDeta0 = value->rValue; - mod->B3SOIPDeta0Given = TRUE; - break; - case B3SOIPD_MOD_ETAB: - mod->B3SOIPDetab = value->rValue; - mod->B3SOIPDetabGiven = TRUE; - break; - case B3SOIPD_MOD_PCLM: - mod->B3SOIPDpclm = value->rValue; - mod->B3SOIPDpclmGiven = TRUE; - break; - case B3SOIPD_MOD_PDIBL1: - mod->B3SOIPDpdibl1 = value->rValue; - mod->B3SOIPDpdibl1Given = TRUE; - break; - case B3SOIPD_MOD_PDIBL2: - mod->B3SOIPDpdibl2 = value->rValue; - mod->B3SOIPDpdibl2Given = TRUE; - break; - case B3SOIPD_MOD_PDIBLB: - mod->B3SOIPDpdiblb = value->rValue; - mod->B3SOIPDpdiblbGiven = TRUE; - break; - case B3SOIPD_MOD_PVAG: - mod->B3SOIPDpvag = value->rValue; - mod->B3SOIPDpvagGiven = TRUE; - break; - case B3SOIPD_MOD_WR : - mod->B3SOIPDwr = value->rValue; - mod->B3SOIPDwrGiven = TRUE; - break; - case B3SOIPD_MOD_DWG : - mod->B3SOIPDdwg = value->rValue; - mod->B3SOIPDdwgGiven = TRUE; - break; - case B3SOIPD_MOD_DWB : - mod->B3SOIPDdwb = value->rValue; - mod->B3SOIPDdwbGiven = TRUE; - break; - case B3SOIPD_MOD_B0 : - mod->B3SOIPDb0 = value->rValue; - mod->B3SOIPDb0Given = TRUE; - break; - case B3SOIPD_MOD_B1 : - mod->B3SOIPDb1 = value->rValue; - mod->B3SOIPDb1Given = TRUE; - break; - case B3SOIPD_MOD_ALPHA0 : - mod->B3SOIPDalpha0 = value->rValue; - mod->B3SOIPDalpha0Given = TRUE; - break; - - case B3SOIPD_MOD_CGSL : - mod->B3SOIPDcgsl = value->rValue; - mod->B3SOIPDcgslGiven = TRUE; - break; - case B3SOIPD_MOD_CGDL : - mod->B3SOIPDcgdl = value->rValue; - mod->B3SOIPDcgdlGiven = TRUE; - break; - case B3SOIPD_MOD_CKAPPA : - mod->B3SOIPDckappa = value->rValue; - mod->B3SOIPDckappaGiven = TRUE; - break; - case B3SOIPD_MOD_CF : - mod->B3SOIPDcf = value->rValue; - mod->B3SOIPDcfGiven = TRUE; - break; - case B3SOIPD_MOD_CLC : - mod->B3SOIPDclc = value->rValue; - mod->B3SOIPDclcGiven = TRUE; - break; - case B3SOIPD_MOD_CLE : - mod->B3SOIPDcle = value->rValue; - mod->B3SOIPDcleGiven = TRUE; - break; - case B3SOIPD_MOD_DWC : - mod->B3SOIPDdwc = value->rValue; - mod->B3SOIPDdwcGiven = TRUE; - break; - case B3SOIPD_MOD_DLC : - mod->B3SOIPDdlc = value->rValue; - mod->B3SOIPDdlcGiven = TRUE; - break; - case B3SOIPD_MOD_TBOX : - mod->B3SOIPDtbox = value->rValue; - mod->B3SOIPDtboxGiven = TRUE; - break; - case B3SOIPD_MOD_TSI : - mod->B3SOIPDtsi = value->rValue; - mod->B3SOIPDtsiGiven = TRUE; - break; - case B3SOIPD_MOD_XJ : - mod->B3SOIPDxj = value->rValue; - mod->B3SOIPDxjGiven = TRUE; - break; - case B3SOIPD_MOD_RBODY : - mod->B3SOIPDrbody = value->rValue; - mod->B3SOIPDrbodyGiven = TRUE; - break; - case B3SOIPD_MOD_RBSH : - mod->B3SOIPDrbsh = value->rValue; - mod->B3SOIPDrbshGiven = TRUE; - break; - case B3SOIPD_MOD_RTH0 : - mod->B3SOIPDrth0 = value->rValue; - mod->B3SOIPDrth0Given = TRUE; - break; - case B3SOIPD_MOD_CTH0 : - mod->B3SOIPDcth0 = value->rValue; - mod->B3SOIPDcth0Given = TRUE; - break; - case B3SOIPD_MOD_NGIDL : - mod->B3SOIPDngidl = value->rValue; - mod->B3SOIPDngidlGiven = TRUE; - break; - case B3SOIPD_MOD_AGIDL : - mod->B3SOIPDagidl = value->rValue; - mod->B3SOIPDagidlGiven = TRUE; - break; - case B3SOIPD_MOD_BGIDL : - mod->B3SOIPDbgidl = value->rValue; - mod->B3SOIPDbgidlGiven = TRUE; - break; - case B3SOIPD_MOD_NDIODE : - mod->B3SOIPDndiode = value->rValue; - mod->B3SOIPDndiodeGiven = TRUE; - break; - case B3SOIPD_MOD_XBJT : - mod->B3SOIPDxbjt = value->rValue; - mod->B3SOIPDxbjtGiven = TRUE; - break; - - case B3SOIPD_MOD_XDIF : - mod->B3SOIPDxdif = value->rValue; - mod->B3SOIPDxdifGiven = TRUE; - break; - - case B3SOIPD_MOD_XREC : - mod->B3SOIPDxrec = value->rValue; - mod->B3SOIPDxrecGiven = TRUE; - break; - case B3SOIPD_MOD_XTUN : - mod->B3SOIPDxtun = value->rValue; - mod->B3SOIPDxtunGiven = TRUE; - break; - case B3SOIPD_MOD_TT : - mod->B3SOIPDtt = value->rValue; - mod->B3SOIPDttGiven = TRUE; - break; - case B3SOIPD_MOD_VSDTH : - mod->B3SOIPDvsdth = value->rValue; - mod->B3SOIPDvsdthGiven = TRUE; - break; - case B3SOIPD_MOD_VSDFB : - mod->B3SOIPDvsdfb = value->rValue; - mod->B3SOIPDvsdfbGiven = TRUE; - break; - case B3SOIPD_MOD_CSDMIN : - mod->B3SOIPDcsdmin = value->rValue; - mod->B3SOIPDcsdminGiven = TRUE; - break; - case B3SOIPD_MOD_ASD : - mod->B3SOIPDasd = value->rValue; - mod->B3SOIPDasdGiven = TRUE; - break; - - - case B3SOIPD_MOD_TNOM : - mod->B3SOIPDtnom = value->rValue + 273.15; - mod->B3SOIPDtnomGiven = TRUE; - break; - case B3SOIPD_MOD_CGSO : - mod->B3SOIPDcgso = value->rValue; - mod->B3SOIPDcgsoGiven = TRUE; - break; - case B3SOIPD_MOD_CGDO : - mod->B3SOIPDcgdo = value->rValue; - mod->B3SOIPDcgdoGiven = TRUE; - break; - case B3SOIPD_MOD_CGEO : - mod->B3SOIPDcgeo = value->rValue; - mod->B3SOIPDcgeoGiven = TRUE; - break; - case B3SOIPD_MOD_XPART : - mod->B3SOIPDxpart = value->rValue; - mod->B3SOIPDxpartGiven = TRUE; - break; - case B3SOIPD_MOD_RSH : - mod->B3SOIPDsheetResistance = value->rValue; - mod->B3SOIPDsheetResistanceGiven = TRUE; - break; - case B3SOIPD_MOD_PBSWG : - mod->B3SOIPDGatesidewallJctPotential = value->rValue; - mod->B3SOIPDGatesidewallJctPotentialGiven = TRUE; - break; - case B3SOIPD_MOD_MJSWG : - mod->B3SOIPDbodyJctGateSideGradingCoeff = value->rValue; - mod->B3SOIPDbodyJctGateSideGradingCoeffGiven = TRUE; - break; - case B3SOIPD_MOD_CJSWG : - mod->B3SOIPDunitLengthGateSidewallJctCap = value->rValue; - mod->B3SOIPDunitLengthGateSidewallJctCapGiven = TRUE; - break; - case B3SOIPD_MOD_CSDESW : - mod->B3SOIPDcsdesw = value->rValue; - mod->B3SOIPDcsdeswGiven = TRUE; - break; - case B3SOIPD_MOD_LINT : - mod->B3SOIPDLint = value->rValue; - mod->B3SOIPDLintGiven = TRUE; - break; - case B3SOIPD_MOD_LL : - mod->B3SOIPDLl = value->rValue; - mod->B3SOIPDLlGiven = TRUE; - break; -/* v2.2.3 */ - case B3SOIPD_MOD_LLC : - mod->B3SOIPDLlc = value->rValue; - mod->B3SOIPDLlcGiven = TRUE; - break; - - case B3SOIPD_MOD_LLN : - mod->B3SOIPDLln = value->rValue; - mod->B3SOIPDLlnGiven = TRUE; - break; - case B3SOIPD_MOD_LW : - mod->B3SOIPDLw = value->rValue; - mod->B3SOIPDLwGiven = TRUE; - break; -/* v2.2.3 */ - case B3SOIPD_MOD_LWC : - mod->B3SOIPDLwc = value->rValue; - mod->B3SOIPDLwcGiven = TRUE; - break; - - case B3SOIPD_MOD_LWN : - mod->B3SOIPDLwn = value->rValue; - mod->B3SOIPDLwnGiven = TRUE; - break; - case B3SOIPD_MOD_LWL : - mod->B3SOIPDLwl = value->rValue; - mod->B3SOIPDLwlGiven = TRUE; - break; -/* v2.2.3 */ - case B3SOIPD_MOD_LWLC : - mod->B3SOIPDLwlc = value->rValue; - mod->B3SOIPDLwlcGiven = TRUE; - break; - - case B3SOIPD_MOD_WINT : - mod->B3SOIPDWint = value->rValue; - mod->B3SOIPDWintGiven = TRUE; - break; - case B3SOIPD_MOD_WL : - mod->B3SOIPDWl = value->rValue; - mod->B3SOIPDWlGiven = TRUE; - break; -/* v2.2.3 */ - case B3SOIPD_MOD_WLC : - mod->B3SOIPDWlc = value->rValue; - mod->B3SOIPDWlcGiven = TRUE; - break; - - case B3SOIPD_MOD_WLN : - mod->B3SOIPDWln = value->rValue; - mod->B3SOIPDWlnGiven = TRUE; - break; - case B3SOIPD_MOD_WW : - mod->B3SOIPDWw = value->rValue; - mod->B3SOIPDWwGiven = TRUE; - break; -/* v2.2.3 */ - case B3SOIPD_MOD_WWC : - mod->B3SOIPDWwc = value->rValue; - mod->B3SOIPDWwcGiven = TRUE; - break; - - case B3SOIPD_MOD_WWN : - mod->B3SOIPDWwn = value->rValue; - mod->B3SOIPDWwnGiven = TRUE; - break; - case B3SOIPD_MOD_WWL : - mod->B3SOIPDWwl = value->rValue; - mod->B3SOIPDWwlGiven = TRUE; - break; -/* v2.2.3 */ - case B3SOIPD_MOD_WWLC : - mod->B3SOIPDWwlc = value->rValue; - mod->B3SOIPDWwlcGiven = TRUE; - break; - - case B3SOIPD_MOD_NOIA : - mod->B3SOIPDoxideTrapDensityA = value->rValue; - mod->B3SOIPDoxideTrapDensityAGiven = TRUE; - break; - case B3SOIPD_MOD_NOIB : - mod->B3SOIPDoxideTrapDensityB = value->rValue; - mod->B3SOIPDoxideTrapDensityBGiven = TRUE; - break; - case B3SOIPD_MOD_NOIC : - mod->B3SOIPDoxideTrapDensityC = value->rValue; - mod->B3SOIPDoxideTrapDensityCGiven = TRUE; - break; - case B3SOIPD_MOD_NOIF : - mod->B3SOIPDnoif = value->rValue; - mod->B3SOIPDnoifGiven = TRUE; - break; - case B3SOIPD_MOD_EM : - mod->B3SOIPDem = value->rValue; - mod->B3SOIPDemGiven = TRUE; - break; - case B3SOIPD_MOD_EF : - mod->B3SOIPDef = value->rValue; - mod->B3SOIPDefGiven = TRUE; - break; - case B3SOIPD_MOD_AF : - mod->B3SOIPDaf = value->rValue; - mod->B3SOIPDafGiven = TRUE; - break; - case B3SOIPD_MOD_KF : - mod->B3SOIPDkf = value->rValue; - mod->B3SOIPDkfGiven = TRUE; - break; - - -/* v2.2 release */ - case B3SOIPD_MOD_WTH0 : - mod->B3SOIPDwth0 = value->rValue; - mod->B3SOIPDwth0Given = TRUE; - break; - case B3SOIPD_MOD_RHALO : - mod->B3SOIPDrhalo = value->rValue; - mod->B3SOIPDrhaloGiven = TRUE; - break; - case B3SOIPD_MOD_NTOX : - mod->B3SOIPDntox = value->rValue; - mod->B3SOIPDntoxGiven = TRUE; - break; - case B3SOIPD_MOD_TOXREF : - mod->B3SOIPDtoxref = value->rValue; - mod->B3SOIPDtoxrefGiven = TRUE; - break; - case B3SOIPD_MOD_EBG : - mod->B3SOIPDebg = value->rValue; - mod->B3SOIPDebgGiven = TRUE; - break; - case B3SOIPD_MOD_VEVB : - mod->B3SOIPDvevb = value->rValue; - mod->B3SOIPDvevbGiven = TRUE; - break; - case B3SOIPD_MOD_ALPHAGB1 : - mod->B3SOIPDalphaGB1 = value->rValue; - mod->B3SOIPDalphaGB1Given = TRUE; - break; - case B3SOIPD_MOD_BETAGB1 : - mod->B3SOIPDbetaGB1 = value->rValue; - mod->B3SOIPDbetaGB1Given = TRUE; - break; - case B3SOIPD_MOD_VGB1 : - mod->B3SOIPDvgb1 = value->rValue; - mod->B3SOIPDvgb1Given = TRUE; - break; - case B3SOIPD_MOD_VECB : - mod->B3SOIPDvecb = value->rValue; - mod->B3SOIPDvecbGiven = TRUE; - break; - case B3SOIPD_MOD_ALPHAGB2 : - mod->B3SOIPDalphaGB2 = value->rValue; - mod->B3SOIPDalphaGB2Given = TRUE; - break; - case B3SOIPD_MOD_BETAGB2 : - mod->B3SOIPDbetaGB2 = value->rValue; - mod->B3SOIPDbetaGB2Given = TRUE; - break; - case B3SOIPD_MOD_VGB2 : - mod->B3SOIPDvgb2 = value->rValue; - mod->B3SOIPDvgb2Given = TRUE; - break; - case B3SOIPD_MOD_TOXQM : - mod->B3SOIPDtoxqm = value->rValue; - mod->B3SOIPDtoxqmGiven = TRUE; - break; - case B3SOIPD_MOD_VOXH : - mod->B3SOIPDvoxh = value->rValue; - mod->B3SOIPDvoxhGiven = TRUE; - break; - case B3SOIPD_MOD_DELTAVOX : - mod->B3SOIPDdeltavox = value->rValue; - mod->B3SOIPDdeltavoxGiven = TRUE; - break; - case B3SOIPD_MOD_IGMOD : - mod->B3SOIPDigMod = value->iValue; - mod->B3SOIPDigModGiven = TRUE; - break; - - -/* v2.0 release */ - case B3SOIPD_MOD_K1W1 : - mod->B3SOIPDk1w1 = value->rValue; - mod->B3SOIPDk1w1Given = TRUE; - break; - case B3SOIPD_MOD_K1W2 : - mod->B3SOIPDk1w2 = value->rValue; - mod->B3SOIPDk1w2Given = TRUE; - break; - case B3SOIPD_MOD_KETAS : - mod->B3SOIPDketas = value->rValue; - mod->B3SOIPDketasGiven = TRUE; - break; - case B3SOIPD_MOD_DWBC : - mod->B3SOIPDdwbc = value->rValue; - mod->B3SOIPDdwbcGiven = TRUE; - break; - case B3SOIPD_MOD_BETA0 : - mod->B3SOIPDbeta0 = value->rValue; - mod->B3SOIPDbeta0Given = TRUE; - break; - case B3SOIPD_MOD_BETA1 : - mod->B3SOIPDbeta1 = value->rValue; - mod->B3SOIPDbeta1Given = TRUE; - break; - case B3SOIPD_MOD_BETA2 : - mod->B3SOIPDbeta2 = value->rValue; - mod->B3SOIPDbeta2Given = TRUE; - break; - case B3SOIPD_MOD_VDSATII0 : - mod->B3SOIPDvdsatii0 = value->rValue; - mod->B3SOIPDvdsatii0Given = TRUE; - break; - case B3SOIPD_MOD_TII : - mod->B3SOIPDtii = value->rValue; - mod->B3SOIPDtiiGiven = TRUE; - break; - case B3SOIPD_MOD_LII : - mod->B3SOIPDlii = value->rValue; - mod->B3SOIPDliiGiven = TRUE; - break; - case B3SOIPD_MOD_SII0 : - mod->B3SOIPDsii0 = value->rValue; - mod->B3SOIPDsii0Given = TRUE; - break; - case B3SOIPD_MOD_SII1 : - mod->B3SOIPDsii1 = value->rValue; - mod->B3SOIPDsii1Given = TRUE; - break; - case B3SOIPD_MOD_SII2 : - mod->B3SOIPDsii2 = value->rValue; - mod->B3SOIPDsii2Given = TRUE; - break; - case B3SOIPD_MOD_SIID : - mod->B3SOIPDsiid = value->rValue; - mod->B3SOIPDsiidGiven = TRUE; - break; - case B3SOIPD_MOD_FBJTII : - mod->B3SOIPDfbjtii = value->rValue; - mod->B3SOIPDfbjtiiGiven = TRUE; - break; - case B3SOIPD_MOD_ESATII : - mod->B3SOIPDesatii = value->rValue; - mod->B3SOIPDesatiiGiven = TRUE; - break; - case B3SOIPD_MOD_NTUN : - mod->B3SOIPDntun = value->rValue; - mod->B3SOIPDntunGiven = TRUE; - break; - case B3SOIPD_MOD_NRECF0 : - mod->B3SOIPDnrecf0 = value->rValue; - mod->B3SOIPDnrecf0Given = TRUE; - break; - case B3SOIPD_MOD_NRECR0 : - mod->B3SOIPDnrecr0 = value->rValue; - mod->B3SOIPDnrecr0Given = TRUE; - break; - case B3SOIPD_MOD_ISBJT : - mod->B3SOIPDisbjt = value->rValue; - mod->B3SOIPDisbjtGiven = TRUE; - break; - case B3SOIPD_MOD_ISDIF : - mod->B3SOIPDisdif = value->rValue; - mod->B3SOIPDisdifGiven = TRUE; - break; - case B3SOIPD_MOD_ISREC : - mod->B3SOIPDisrec = value->rValue; - mod->B3SOIPDisrecGiven = TRUE; - break; - case B3SOIPD_MOD_ISTUN : - mod->B3SOIPDistun = value->rValue; - mod->B3SOIPDistunGiven = TRUE; - break; - case B3SOIPD_MOD_LN : - mod->B3SOIPDln = value->rValue; - mod->B3SOIPDlnGiven = TRUE; - break; - case B3SOIPD_MOD_VREC0 : - mod->B3SOIPDvrec0 = value->rValue; - mod->B3SOIPDvrec0Given = TRUE; - break; - case B3SOIPD_MOD_VTUN0 : - mod->B3SOIPDvtun0 = value->rValue; - mod->B3SOIPDvtun0Given = TRUE; - break; - case B3SOIPD_MOD_NBJT : - mod->B3SOIPDnbjt = value->rValue; - mod->B3SOIPDnbjtGiven = TRUE; - break; - case B3SOIPD_MOD_LBJT0 : - mod->B3SOIPDlbjt0 = value->rValue; - mod->B3SOIPDlbjt0Given = TRUE; - break; - case B3SOIPD_MOD_LDIF0 : - mod->B3SOIPDldif0 = value->rValue; - mod->B3SOIPDldif0Given = TRUE; - break; - case B3SOIPD_MOD_VABJT : - mod->B3SOIPDvabjt = value->rValue; - mod->B3SOIPDvabjtGiven = TRUE; - break; - case B3SOIPD_MOD_AELY : - mod->B3SOIPDaely = value->rValue; - mod->B3SOIPDaelyGiven = TRUE; - break; - case B3SOIPD_MOD_AHLI : - mod->B3SOIPDahli = value->rValue; - mod->B3SOIPDahliGiven = TRUE; - break; - case B3SOIPD_MOD_NDIF : - mod->B3SOIPDndif = value->rValue; - mod->B3SOIPDndifGiven = TRUE; - break; - case B3SOIPD_MOD_NTRECF : - mod->B3SOIPDntrecf = value->rValue; - mod->B3SOIPDntrecfGiven = TRUE; - break; - case B3SOIPD_MOD_NTRECR : - mod->B3SOIPDntrecr = value->rValue; - mod->B3SOIPDntrecrGiven = TRUE; - break; - case B3SOIPD_MOD_DLCB : - mod->B3SOIPDdlcb = value->rValue; - mod->B3SOIPDdlcbGiven = TRUE; - break; - case B3SOIPD_MOD_FBODY : - mod->B3SOIPDfbody = value->rValue; - mod->B3SOIPDfbodyGiven = TRUE; - break; - case B3SOIPD_MOD_TCJSWG : - mod->B3SOIPDtcjswg = value->rValue; - mod->B3SOIPDtcjswgGiven = TRUE; - break; - case B3SOIPD_MOD_TPBSWG : - mod->B3SOIPDtpbswg = value->rValue; - mod->B3SOIPDtpbswgGiven = TRUE; - break; - case B3SOIPD_MOD_ACDE : - mod->B3SOIPDacde = value->rValue; - mod->B3SOIPDacdeGiven = TRUE; - break; - case B3SOIPD_MOD_MOIN : - mod->B3SOIPDmoin = value->rValue; - mod->B3SOIPDmoinGiven = TRUE; - break; - case B3SOIPD_MOD_DELVT : - mod->B3SOIPDdelvt = value->rValue; - mod->B3SOIPDdelvtGiven = TRUE; - break; - case B3SOIPD_MOD_KB1 : - mod->B3SOIPDkb1 = value->rValue; - mod->B3SOIPDkb1Given = TRUE; - break; - case B3SOIPD_MOD_DLBG : - mod->B3SOIPDdlbg = value->rValue; - mod->B3SOIPDdlbgGiven = TRUE; - break; - -/* Added for binning - START */ - /* Length Dependence */ - case B3SOIPD_MOD_LNPEAK: - mod->B3SOIPDlnpeak = value->rValue; - mod->B3SOIPDlnpeakGiven = TRUE; - break; - case B3SOIPD_MOD_LNSUB: - mod->B3SOIPDlnsub = value->rValue; - mod->B3SOIPDlnsubGiven = TRUE; - break; - case B3SOIPD_MOD_LNGATE: - mod->B3SOIPDlngate = value->rValue; - mod->B3SOIPDlngateGiven = TRUE; - break; - case B3SOIPD_MOD_LVTH0: - mod->B3SOIPDlvth0 = value->rValue; - mod->B3SOIPDlvth0Given = TRUE; - break; - case B3SOIPD_MOD_LK1: - mod->B3SOIPDlk1 = value->rValue; - mod->B3SOIPDlk1Given = TRUE; - break; - case B3SOIPD_MOD_LK1W1: - mod->B3SOIPDlk1w1 = value->rValue; - mod->B3SOIPDlk1w1Given = TRUE; - break; - case B3SOIPD_MOD_LK1W2: - mod->B3SOIPDlk1w2 = value->rValue; - mod->B3SOIPDlk1w2Given = TRUE; - break; - case B3SOIPD_MOD_LK2: - mod->B3SOIPDlk2 = value->rValue; - mod->B3SOIPDlk2Given = TRUE; - break; - case B3SOIPD_MOD_LK3: - mod->B3SOIPDlk3 = value->rValue; - mod->B3SOIPDlk3Given = TRUE; - break; - case B3SOIPD_MOD_LK3B: - mod->B3SOIPDlk3b = value->rValue; - mod->B3SOIPDlk3bGiven = TRUE; - break; - case B3SOIPD_MOD_LKB1 : - mod->B3SOIPDlkb1 = value->rValue; - mod->B3SOIPDlkb1Given = TRUE; - break; - case B3SOIPD_MOD_LW0: - mod->B3SOIPDlw0 = value->rValue; - mod->B3SOIPDlw0Given = TRUE; - break; - case B3SOIPD_MOD_LNLX: - mod->B3SOIPDlnlx = value->rValue; - mod->B3SOIPDlnlxGiven = TRUE; - break; - case B3SOIPD_MOD_LDVT0: - mod->B3SOIPDldvt0 = value->rValue; - mod->B3SOIPDldvt0Given = TRUE; - break; - case B3SOIPD_MOD_LDVT1: - mod->B3SOIPDldvt1 = value->rValue; - mod->B3SOIPDldvt1Given = TRUE; - break; - case B3SOIPD_MOD_LDVT2: - mod->B3SOIPDldvt2 = value->rValue; - mod->B3SOIPDldvt2Given = TRUE; - break; - case B3SOIPD_MOD_LDVT0W: - mod->B3SOIPDldvt0w = value->rValue; - mod->B3SOIPDldvt0wGiven = TRUE; - break; - case B3SOIPD_MOD_LDVT1W: - mod->B3SOIPDldvt1w = value->rValue; - mod->B3SOIPDldvt1wGiven = TRUE; - break; - case B3SOIPD_MOD_LDVT2W: - mod->B3SOIPDldvt2w = value->rValue; - mod->B3SOIPDldvt2wGiven = TRUE; - break; - case B3SOIPD_MOD_LU0 : - mod->B3SOIPDlu0 = value->rValue; - mod->B3SOIPDlu0Given = TRUE; - break; - case B3SOIPD_MOD_LUA: - mod->B3SOIPDlua = value->rValue; - mod->B3SOIPDluaGiven = TRUE; - break; - case B3SOIPD_MOD_LUB: - mod->B3SOIPDlub = value->rValue; - mod->B3SOIPDlubGiven = TRUE; - break; - case B3SOIPD_MOD_LUC: - mod->B3SOIPDluc = value->rValue; - mod->B3SOIPDlucGiven = TRUE; - break; - case B3SOIPD_MOD_LVSAT: - mod->B3SOIPDlvsat = value->rValue; - mod->B3SOIPDlvsatGiven = TRUE; - break; - case B3SOIPD_MOD_LA0: - mod->B3SOIPDla0 = value->rValue; - mod->B3SOIPDla0Given = TRUE; - break; - case B3SOIPD_MOD_LAGS: - mod->B3SOIPDlags= value->rValue; - mod->B3SOIPDlagsGiven = TRUE; - break; - case B3SOIPD_MOD_LB0 : - mod->B3SOIPDlb0 = value->rValue; - mod->B3SOIPDlb0Given = TRUE; - break; - case B3SOIPD_MOD_LB1 : - mod->B3SOIPDlb1 = value->rValue; - mod->B3SOIPDlb1Given = TRUE; - break; - case B3SOIPD_MOD_LKETA: - mod->B3SOIPDlketa = value->rValue; - mod->B3SOIPDlketaGiven = TRUE; - break; - case B3SOIPD_MOD_LKETAS: - mod->B3SOIPDlketas = value->rValue; - mod->B3SOIPDlketasGiven = TRUE; - break; - case B3SOIPD_MOD_LA1: - mod->B3SOIPDla1 = value->rValue; - mod->B3SOIPDla1Given = TRUE; - break; - case B3SOIPD_MOD_LA2: - mod->B3SOIPDla2 = value->rValue; - mod->B3SOIPDla2Given = TRUE; - break; - case B3SOIPD_MOD_LRDSW: - mod->B3SOIPDlrdsw = value->rValue; - mod->B3SOIPDlrdswGiven = TRUE; - break; - case B3SOIPD_MOD_LPRWB: - mod->B3SOIPDlprwb = value->rValue; - mod->B3SOIPDlprwbGiven = TRUE; - break; - case B3SOIPD_MOD_LPRWG: - mod->B3SOIPDlprwg = value->rValue; - mod->B3SOIPDlprwgGiven = TRUE; - break; - case B3SOIPD_MOD_LWR : - mod->B3SOIPDlwr = value->rValue; - mod->B3SOIPDlwrGiven = TRUE; - break; - case B3SOIPD_MOD_LNFACTOR : - mod->B3SOIPDlnfactor = value->rValue; - mod->B3SOIPDlnfactorGiven = TRUE; - break; - case B3SOIPD_MOD_LDWG : - mod->B3SOIPDldwg = value->rValue; - mod->B3SOIPDldwgGiven = TRUE; - break; - case B3SOIPD_MOD_LDWB : - mod->B3SOIPDldwb = value->rValue; - mod->B3SOIPDldwbGiven = TRUE; - break; - case B3SOIPD_MOD_LVOFF: - mod->B3SOIPDlvoff = value->rValue; - mod->B3SOIPDlvoffGiven = TRUE; - break; - case B3SOIPD_MOD_LETA0: - mod->B3SOIPDleta0 = value->rValue; - mod->B3SOIPDleta0Given = TRUE; - break; - case B3SOIPD_MOD_LETAB: - mod->B3SOIPDletab = value->rValue; - mod->B3SOIPDletabGiven = TRUE; - break; - case B3SOIPD_MOD_LDSUB: - mod->B3SOIPDldsub = value->rValue; - mod->B3SOIPDldsubGiven = TRUE; - break; - case B3SOIPD_MOD_LCIT : - mod->B3SOIPDlcit = value->rValue; - mod->B3SOIPDlcitGiven = TRUE; - break; - case B3SOIPD_MOD_LCDSC : - mod->B3SOIPDlcdsc = value->rValue; - mod->B3SOIPDlcdscGiven = TRUE; - break; - case B3SOIPD_MOD_LCDSCB : - mod->B3SOIPDlcdscb = value->rValue; - mod->B3SOIPDlcdscbGiven = TRUE; - break; - case B3SOIPD_MOD_LCDSCD : - mod->B3SOIPDlcdscd = value->rValue; - mod->B3SOIPDlcdscdGiven = TRUE; - break; - case B3SOIPD_MOD_LPCLM: - mod->B3SOIPDlpclm = value->rValue; - mod->B3SOIPDlpclmGiven = TRUE; - break; - case B3SOIPD_MOD_LPDIBL1: - mod->B3SOIPDlpdibl1 = value->rValue; - mod->B3SOIPDlpdibl1Given = TRUE; - break; - case B3SOIPD_MOD_LPDIBL2: - mod->B3SOIPDlpdibl2 = value->rValue; - mod->B3SOIPDlpdibl2Given = TRUE; - break; - case B3SOIPD_MOD_LPDIBLB: - mod->B3SOIPDlpdiblb = value->rValue; - mod->B3SOIPDlpdiblbGiven = TRUE; - break; - case B3SOIPD_MOD_LDROUT: - mod->B3SOIPDldrout = value->rValue; - mod->B3SOIPDldroutGiven = TRUE; - break; - case B3SOIPD_MOD_LPVAG: - mod->B3SOIPDlpvag = value->rValue; - mod->B3SOIPDlpvagGiven = TRUE; - break; - case B3SOIPD_MOD_LDELTA : - mod->B3SOIPDldelta = value->rValue; - mod->B3SOIPDldeltaGiven = TRUE; - break; - case B3SOIPD_MOD_LALPHA0 : - mod->B3SOIPDlalpha0 = value->rValue; - mod->B3SOIPDlalpha0Given = TRUE; - break; - case B3SOIPD_MOD_LFBJTII : - mod->B3SOIPDlfbjtii = value->rValue; - mod->B3SOIPDlfbjtiiGiven = TRUE; - break; - case B3SOIPD_MOD_LBETA0 : - mod->B3SOIPDlbeta0 = value->rValue; - mod->B3SOIPDlbeta0Given = TRUE; - break; - case B3SOIPD_MOD_LBETA1 : - mod->B3SOIPDlbeta1 = value->rValue; - mod->B3SOIPDlbeta1Given = TRUE; - break; - case B3SOIPD_MOD_LBETA2 : - mod->B3SOIPDlbeta2 = value->rValue; - mod->B3SOIPDlbeta2Given = TRUE; - break; - case B3SOIPD_MOD_LVDSATII0 : - mod->B3SOIPDlvdsatii0 = value->rValue; - mod->B3SOIPDlvdsatii0Given = TRUE; - break; - case B3SOIPD_MOD_LLII : - mod->B3SOIPDllii = value->rValue; - mod->B3SOIPDlliiGiven = TRUE; - break; - case B3SOIPD_MOD_LESATII : - mod->B3SOIPDlesatii = value->rValue; - mod->B3SOIPDlesatiiGiven = TRUE; - break; - case B3SOIPD_MOD_LSII0 : - mod->B3SOIPDlsii0 = value->rValue; - mod->B3SOIPDlsii0Given = TRUE; - break; - case B3SOIPD_MOD_LSII1 : - mod->B3SOIPDlsii1 = value->rValue; - mod->B3SOIPDlsii1Given = TRUE; - break; - case B3SOIPD_MOD_LSII2 : - mod->B3SOIPDlsii2 = value->rValue; - mod->B3SOIPDlsii2Given = TRUE; - break; - case B3SOIPD_MOD_LSIID : - mod->B3SOIPDlsiid = value->rValue; - mod->B3SOIPDlsiidGiven = TRUE; - break; - case B3SOIPD_MOD_LAGIDL : - mod->B3SOIPDlagidl = value->rValue; - mod->B3SOIPDlagidlGiven = TRUE; - break; - case B3SOIPD_MOD_LBGIDL : - mod->B3SOIPDlbgidl = value->rValue; - mod->B3SOIPDlbgidlGiven = TRUE; - break; - case B3SOIPD_MOD_LNGIDL : - mod->B3SOIPDlngidl = value->rValue; - mod->B3SOIPDlngidlGiven = TRUE; - break; - case B3SOIPD_MOD_LNTUN : - mod->B3SOIPDlntun = value->rValue; - mod->B3SOIPDlntunGiven = TRUE; - break; - case B3SOIPD_MOD_LNDIODE : - mod->B3SOIPDlndiode = value->rValue; - mod->B3SOIPDlndiodeGiven = TRUE; - break; - case B3SOIPD_MOD_LNRECF0 : - mod->B3SOIPDlnrecf0 = value->rValue; - mod->B3SOIPDlnrecf0Given = TRUE; - break; - case B3SOIPD_MOD_LNRECR0 : - mod->B3SOIPDlnrecr0 = value->rValue; - mod->B3SOIPDlnrecr0Given = TRUE; - break; - case B3SOIPD_MOD_LISBJT : - mod->B3SOIPDlisbjt = value->rValue; - mod->B3SOIPDlisbjtGiven = TRUE; - break; - case B3SOIPD_MOD_LISDIF : - mod->B3SOIPDlisdif = value->rValue; - mod->B3SOIPDlisdifGiven = TRUE; - break; - case B3SOIPD_MOD_LISREC : - mod->B3SOIPDlisrec = value->rValue; - mod->B3SOIPDlisrecGiven = TRUE; - break; - case B3SOIPD_MOD_LISTUN : - mod->B3SOIPDlistun = value->rValue; - mod->B3SOIPDlistunGiven = TRUE; - break; - case B3SOIPD_MOD_LVREC0 : - mod->B3SOIPDlvrec0 = value->rValue; - mod->B3SOIPDlvrec0Given = TRUE; - break; - case B3SOIPD_MOD_LVTUN0 : - mod->B3SOIPDlvtun0 = value->rValue; - mod->B3SOIPDlvtun0Given = TRUE; - break; - case B3SOIPD_MOD_LNBJT : - mod->B3SOIPDlnbjt = value->rValue; - mod->B3SOIPDlnbjtGiven = TRUE; - break; - case B3SOIPD_MOD_LLBJT0 : - mod->B3SOIPDllbjt0 = value->rValue; - mod->B3SOIPDllbjt0Given = TRUE; - break; - case B3SOIPD_MOD_LVABJT : - mod->B3SOIPDlvabjt = value->rValue; - mod->B3SOIPDlvabjtGiven = TRUE; - break; - case B3SOIPD_MOD_LAELY : - mod->B3SOIPDlaely = value->rValue; - mod->B3SOIPDlaelyGiven = TRUE; - break; - case B3SOIPD_MOD_LAHLI : - mod->B3SOIPDlahli = value->rValue; - mod->B3SOIPDlahliGiven = TRUE; - break; - /* CV Model */ - case B3SOIPD_MOD_LVSDFB : - mod->B3SOIPDlvsdfb = value->rValue; - mod->B3SOIPDlvsdfbGiven = TRUE; - break; - case B3SOIPD_MOD_LVSDTH : - mod->B3SOIPDlvsdth = value->rValue; - mod->B3SOIPDlvsdthGiven = TRUE; - break; - case B3SOIPD_MOD_LDELVT : - mod->B3SOIPDldelvt = value->rValue; - mod->B3SOIPDldelvtGiven = TRUE; - break; - case B3SOIPD_MOD_LACDE : - mod->B3SOIPDlacde = value->rValue; - mod->B3SOIPDlacdeGiven = TRUE; - break; - case B3SOIPD_MOD_LMOIN : - mod->B3SOIPDlmoin = value->rValue; - mod->B3SOIPDlmoinGiven = TRUE; - break; - - /* Width Dependence */ - case B3SOIPD_MOD_WNPEAK: - mod->B3SOIPDwnpeak = value->rValue; - mod->B3SOIPDwnpeakGiven = TRUE; - break; - case B3SOIPD_MOD_WNSUB: - mod->B3SOIPDwnsub = value->rValue; - mod->B3SOIPDwnsubGiven = TRUE; - break; - case B3SOIPD_MOD_WNGATE: - mod->B3SOIPDwngate = value->rValue; - mod->B3SOIPDwngateGiven = TRUE; - break; - case B3SOIPD_MOD_WVTH0: - mod->B3SOIPDwvth0 = value->rValue; - mod->B3SOIPDwvth0Given = TRUE; - break; - case B3SOIPD_MOD_WK1: - mod->B3SOIPDwk1 = value->rValue; - mod->B3SOIPDwk1Given = TRUE; - break; - case B3SOIPD_MOD_WK1W1: - mod->B3SOIPDwk1w1 = value->rValue; - mod->B3SOIPDwk1w1Given = TRUE; - break; - case B3SOIPD_MOD_WK1W2: - mod->B3SOIPDwk1w2 = value->rValue; - mod->B3SOIPDwk1w2Given = TRUE; - break; - case B3SOIPD_MOD_WK2: - mod->B3SOIPDwk2 = value->rValue; - mod->B3SOIPDwk2Given = TRUE; - break; - case B3SOIPD_MOD_WK3: - mod->B3SOIPDwk3 = value->rValue; - mod->B3SOIPDwk3Given = TRUE; - break; - case B3SOIPD_MOD_WK3B: - mod->B3SOIPDwk3b = value->rValue; - mod->B3SOIPDwk3bGiven = TRUE; - break; - case B3SOIPD_MOD_WKB1 : - mod->B3SOIPDwkb1 = value->rValue; - mod->B3SOIPDwkb1Given = TRUE; - break; - case B3SOIPD_MOD_WW0: - mod->B3SOIPDww0 = value->rValue; - mod->B3SOIPDww0Given = TRUE; - break; - case B3SOIPD_MOD_WNLX: - mod->B3SOIPDwnlx = value->rValue; - mod->B3SOIPDwnlxGiven = TRUE; - break; - case B3SOIPD_MOD_WDVT0: - mod->B3SOIPDwdvt0 = value->rValue; - mod->B3SOIPDwdvt0Given = TRUE; - break; - case B3SOIPD_MOD_WDVT1: - mod->B3SOIPDwdvt1 = value->rValue; - mod->B3SOIPDwdvt1Given = TRUE; - break; - case B3SOIPD_MOD_WDVT2: - mod->B3SOIPDwdvt2 = value->rValue; - mod->B3SOIPDwdvt2Given = TRUE; - break; - case B3SOIPD_MOD_WDVT0W: - mod->B3SOIPDwdvt0w = value->rValue; - mod->B3SOIPDwdvt0wGiven = TRUE; - break; - case B3SOIPD_MOD_WDVT1W: - mod->B3SOIPDwdvt1w = value->rValue; - mod->B3SOIPDwdvt1wGiven = TRUE; - break; - case B3SOIPD_MOD_WDVT2W: - mod->B3SOIPDwdvt2w = value->rValue; - mod->B3SOIPDwdvt2wGiven = TRUE; - break; - case B3SOIPD_MOD_WU0 : - mod->B3SOIPDwu0 = value->rValue; - mod->B3SOIPDwu0Given = TRUE; - break; - case B3SOIPD_MOD_WUA: - mod->B3SOIPDwua = value->rValue; - mod->B3SOIPDwuaGiven = TRUE; - break; - case B3SOIPD_MOD_WUB: - mod->B3SOIPDwub = value->rValue; - mod->B3SOIPDwubGiven = TRUE; - break; - case B3SOIPD_MOD_WUC: - mod->B3SOIPDwuc = value->rValue; - mod->B3SOIPDwucGiven = TRUE; - break; - case B3SOIPD_MOD_WVSAT: - mod->B3SOIPDwvsat = value->rValue; - mod->B3SOIPDwvsatGiven = TRUE; - break; - case B3SOIPD_MOD_WA0: - mod->B3SOIPDwa0 = value->rValue; - mod->B3SOIPDwa0Given = TRUE; - break; - case B3SOIPD_MOD_WAGS: - mod->B3SOIPDwags= value->rValue; - mod->B3SOIPDwagsGiven = TRUE; - break; - case B3SOIPD_MOD_WB0 : - mod->B3SOIPDwb0 = value->rValue; - mod->B3SOIPDwb0Given = TRUE; - break; - case B3SOIPD_MOD_WB1 : - mod->B3SOIPDwb1 = value->rValue; - mod->B3SOIPDwb1Given = TRUE; - break; - case B3SOIPD_MOD_WKETA: - mod->B3SOIPDwketa = value->rValue; - mod->B3SOIPDwketaGiven = TRUE; - break; - case B3SOIPD_MOD_WKETAS: - mod->B3SOIPDwketas = value->rValue; - mod->B3SOIPDwketasGiven = TRUE; - break; - case B3SOIPD_MOD_WA1: - mod->B3SOIPDwa1 = value->rValue; - mod->B3SOIPDwa1Given = TRUE; - break; - case B3SOIPD_MOD_WA2: - mod->B3SOIPDwa2 = value->rValue; - mod->B3SOIPDwa2Given = TRUE; - break; - case B3SOIPD_MOD_WRDSW: - mod->B3SOIPDwrdsw = value->rValue; - mod->B3SOIPDwrdswGiven = TRUE; - break; - case B3SOIPD_MOD_WPRWB: - mod->B3SOIPDwprwb = value->rValue; - mod->B3SOIPDwprwbGiven = TRUE; - break; - case B3SOIPD_MOD_WPRWG: - mod->B3SOIPDwprwg = value->rValue; - mod->B3SOIPDwprwgGiven = TRUE; - break; - case B3SOIPD_MOD_WWR : - mod->B3SOIPDwwr = value->rValue; - mod->B3SOIPDwwrGiven = TRUE; - break; - case B3SOIPD_MOD_WNFACTOR : - mod->B3SOIPDwnfactor = value->rValue; - mod->B3SOIPDwnfactorGiven = TRUE; - break; - case B3SOIPD_MOD_WDWG : - mod->B3SOIPDwdwg = value->rValue; - mod->B3SOIPDwdwgGiven = TRUE; - break; - case B3SOIPD_MOD_WDWB : - mod->B3SOIPDwdwb = value->rValue; - mod->B3SOIPDwdwbGiven = TRUE; - break; - case B3SOIPD_MOD_WVOFF: - mod->B3SOIPDwvoff = value->rValue; - mod->B3SOIPDwvoffGiven = TRUE; - break; - case B3SOIPD_MOD_WETA0: - mod->B3SOIPDweta0 = value->rValue; - mod->B3SOIPDweta0Given = TRUE; - break; - case B3SOIPD_MOD_WETAB: - mod->B3SOIPDwetab = value->rValue; - mod->B3SOIPDwetabGiven = TRUE; - break; - case B3SOIPD_MOD_WDSUB: - mod->B3SOIPDwdsub = value->rValue; - mod->B3SOIPDwdsubGiven = TRUE; - break; - case B3SOIPD_MOD_WCIT : - mod->B3SOIPDwcit = value->rValue; - mod->B3SOIPDwcitGiven = TRUE; - break; - case B3SOIPD_MOD_WCDSC : - mod->B3SOIPDwcdsc = value->rValue; - mod->B3SOIPDwcdscGiven = TRUE; - break; - case B3SOIPD_MOD_WCDSCB : - mod->B3SOIPDwcdscb = value->rValue; - mod->B3SOIPDwcdscbGiven = TRUE; - break; - case B3SOIPD_MOD_WCDSCD : - mod->B3SOIPDwcdscd = value->rValue; - mod->B3SOIPDwcdscdGiven = TRUE; - break; - case B3SOIPD_MOD_WPCLM: - mod->B3SOIPDwpclm = value->rValue; - mod->B3SOIPDwpclmGiven = TRUE; - break; - case B3SOIPD_MOD_WPDIBL1: - mod->B3SOIPDwpdibl1 = value->rValue; - mod->B3SOIPDwpdibl1Given = TRUE; - break; - case B3SOIPD_MOD_WPDIBL2: - mod->B3SOIPDwpdibl2 = value->rValue; - mod->B3SOIPDwpdibl2Given = TRUE; - break; - case B3SOIPD_MOD_WPDIBLB: - mod->B3SOIPDwpdiblb = value->rValue; - mod->B3SOIPDwpdiblbGiven = TRUE; - break; - case B3SOIPD_MOD_WDROUT: - mod->B3SOIPDwdrout = value->rValue; - mod->B3SOIPDwdroutGiven = TRUE; - break; - case B3SOIPD_MOD_WPVAG: - mod->B3SOIPDwpvag = value->rValue; - mod->B3SOIPDwpvagGiven = TRUE; - break; - case B3SOIPD_MOD_WDELTA : - mod->B3SOIPDwdelta = value->rValue; - mod->B3SOIPDwdeltaGiven = TRUE; - break; - case B3SOIPD_MOD_WALPHA0 : - mod->B3SOIPDwalpha0 = value->rValue; - mod->B3SOIPDwalpha0Given = TRUE; - break; - case B3SOIPD_MOD_WFBJTII : - mod->B3SOIPDwfbjtii = value->rValue; - mod->B3SOIPDwfbjtiiGiven = TRUE; - break; - case B3SOIPD_MOD_WBETA0 : - mod->B3SOIPDwbeta0 = value->rValue; - mod->B3SOIPDwbeta0Given = TRUE; - break; - case B3SOIPD_MOD_WBETA1 : - mod->B3SOIPDwbeta1 = value->rValue; - mod->B3SOIPDwbeta1Given = TRUE; - break; - case B3SOIPD_MOD_WBETA2 : - mod->B3SOIPDwbeta2 = value->rValue; - mod->B3SOIPDwbeta2Given = TRUE; - break; - case B3SOIPD_MOD_WVDSATII0 : - mod->B3SOIPDwvdsatii0 = value->rValue; - mod->B3SOIPDwvdsatii0Given = TRUE; - break; - case B3SOIPD_MOD_WLII : - mod->B3SOIPDwlii = value->rValue; - mod->B3SOIPDwliiGiven = TRUE; - break; - case B3SOIPD_MOD_WESATII : - mod->B3SOIPDwesatii = value->rValue; - mod->B3SOIPDwesatiiGiven = TRUE; - break; - case B3SOIPD_MOD_WSII0 : - mod->B3SOIPDwsii0 = value->rValue; - mod->B3SOIPDwsii0Given = TRUE; - break; - case B3SOIPD_MOD_WSII1 : - mod->B3SOIPDwsii1 = value->rValue; - mod->B3SOIPDwsii1Given = TRUE; - break; - case B3SOIPD_MOD_WSII2 : - mod->B3SOIPDwsii2 = value->rValue; - mod->B3SOIPDwsii2Given = TRUE; - break; - case B3SOIPD_MOD_WSIID : - mod->B3SOIPDwsiid = value->rValue; - mod->B3SOIPDwsiidGiven = TRUE; - break; - case B3SOIPD_MOD_WAGIDL : - mod->B3SOIPDwagidl = value->rValue; - mod->B3SOIPDwagidlGiven = TRUE; - break; - case B3SOIPD_MOD_WBGIDL : - mod->B3SOIPDwbgidl = value->rValue; - mod->B3SOIPDwbgidlGiven = TRUE; - break; - case B3SOIPD_MOD_WNGIDL : - mod->B3SOIPDwngidl = value->rValue; - mod->B3SOIPDwngidlGiven = TRUE; - break; - case B3SOIPD_MOD_WNTUN : - mod->B3SOIPDwntun = value->rValue; - mod->B3SOIPDwntunGiven = TRUE; - break; - case B3SOIPD_MOD_WNDIODE : - mod->B3SOIPDwndiode = value->rValue; - mod->B3SOIPDwndiodeGiven = TRUE; - break; - case B3SOIPD_MOD_WNRECF0 : - mod->B3SOIPDwnrecf0 = value->rValue; - mod->B3SOIPDwnrecf0Given = TRUE; - break; - case B3SOIPD_MOD_WNRECR0 : - mod->B3SOIPDwnrecr0 = value->rValue; - mod->B3SOIPDwnrecr0Given = TRUE; - break; - case B3SOIPD_MOD_WISBJT : - mod->B3SOIPDwisbjt = value->rValue; - mod->B3SOIPDwisbjtGiven = TRUE; - break; - case B3SOIPD_MOD_WISDIF : - mod->B3SOIPDwisdif = value->rValue; - mod->B3SOIPDwisdifGiven = TRUE; - break; - case B3SOIPD_MOD_WISREC : - mod->B3SOIPDwisrec = value->rValue; - mod->B3SOIPDwisrecGiven = TRUE; - break; - case B3SOIPD_MOD_WISTUN : - mod->B3SOIPDwistun = value->rValue; - mod->B3SOIPDwistunGiven = TRUE; - break; - case B3SOIPD_MOD_WVREC0 : - mod->B3SOIPDwvrec0 = value->rValue; - mod->B3SOIPDwvrec0Given = TRUE; - break; - case B3SOIPD_MOD_WVTUN0 : - mod->B3SOIPDwvtun0 = value->rValue; - mod->B3SOIPDwvtun0Given = TRUE; - break; - case B3SOIPD_MOD_WNBJT : - mod->B3SOIPDwnbjt = value->rValue; - mod->B3SOIPDwnbjtGiven = TRUE; - break; - case B3SOIPD_MOD_WLBJT0 : - mod->B3SOIPDwlbjt0 = value->rValue; - mod->B3SOIPDwlbjt0Given = TRUE; - break; - case B3SOIPD_MOD_WVABJT : - mod->B3SOIPDwvabjt = value->rValue; - mod->B3SOIPDwvabjtGiven = TRUE; - break; - case B3SOIPD_MOD_WAELY : - mod->B3SOIPDwaely = value->rValue; - mod->B3SOIPDwaelyGiven = TRUE; - break; - case B3SOIPD_MOD_WAHLI : - mod->B3SOIPDwahli = value->rValue; - mod->B3SOIPDwahliGiven = TRUE; - break; - /* CV Model */ - case B3SOIPD_MOD_WVSDFB : - mod->B3SOIPDwvsdfb = value->rValue; - mod->B3SOIPDwvsdfbGiven = TRUE; - break; - case B3SOIPD_MOD_WVSDTH : - mod->B3SOIPDwvsdth = value->rValue; - mod->B3SOIPDwvsdthGiven = TRUE; - break; - case B3SOIPD_MOD_WDELVT : - mod->B3SOIPDwdelvt = value->rValue; - mod->B3SOIPDwdelvtGiven = TRUE; - break; - case B3SOIPD_MOD_WACDE : - mod->B3SOIPDwacde = value->rValue; - mod->B3SOIPDwacdeGiven = TRUE; - break; - case B3SOIPD_MOD_WMOIN : - mod->B3SOIPDwmoin = value->rValue; - mod->B3SOIPDwmoinGiven = TRUE; - break; - - /* Cross-term Dependence */ - case B3SOIPD_MOD_PNPEAK: - mod->B3SOIPDpnpeak = value->rValue; - mod->B3SOIPDpnpeakGiven = TRUE; - break; - case B3SOIPD_MOD_PNSUB: - mod->B3SOIPDpnsub = value->rValue; - mod->B3SOIPDpnsubGiven = TRUE; - break; - case B3SOIPD_MOD_PNGATE: - mod->B3SOIPDpngate = value->rValue; - mod->B3SOIPDpngateGiven = TRUE; - break; - case B3SOIPD_MOD_PVTH0: - mod->B3SOIPDpvth0 = value->rValue; - mod->B3SOIPDpvth0Given = TRUE; - break; - case B3SOIPD_MOD_PK1: - mod->B3SOIPDpk1 = value->rValue; - mod->B3SOIPDpk1Given = TRUE; - break; - case B3SOIPD_MOD_PK1W1: - mod->B3SOIPDpk1w1 = value->rValue; - mod->B3SOIPDpk1w1Given = TRUE; - break; - case B3SOIPD_MOD_PK1W2: - mod->B3SOIPDpk1w2 = value->rValue; - mod->B3SOIPDpk1w2Given = TRUE; - break; - case B3SOIPD_MOD_PK2: - mod->B3SOIPDpk2 = value->rValue; - mod->B3SOIPDpk2Given = TRUE; - break; - case B3SOIPD_MOD_PK3: - mod->B3SOIPDpk3 = value->rValue; - mod->B3SOIPDpk3Given = TRUE; - break; - case B3SOIPD_MOD_PK3B: - mod->B3SOIPDpk3b = value->rValue; - mod->B3SOIPDpk3bGiven = TRUE; - break; - case B3SOIPD_MOD_PKB1 : - mod->B3SOIPDpkb1 = value->rValue; - mod->B3SOIPDpkb1Given = TRUE; - break; - case B3SOIPD_MOD_PW0: - mod->B3SOIPDpw0 = value->rValue; - mod->B3SOIPDpw0Given = TRUE; - break; - case B3SOIPD_MOD_PNLX: - mod->B3SOIPDpnlx = value->rValue; - mod->B3SOIPDpnlxGiven = TRUE; - break; - case B3SOIPD_MOD_PDVT0: - mod->B3SOIPDpdvt0 = value->rValue; - mod->B3SOIPDpdvt0Given = TRUE; - break; - case B3SOIPD_MOD_PDVT1: - mod->B3SOIPDpdvt1 = value->rValue; - mod->B3SOIPDpdvt1Given = TRUE; - break; - case B3SOIPD_MOD_PDVT2: - mod->B3SOIPDpdvt2 = value->rValue; - mod->B3SOIPDpdvt2Given = TRUE; - break; - case B3SOIPD_MOD_PDVT0W: - mod->B3SOIPDpdvt0w = value->rValue; - mod->B3SOIPDpdvt0wGiven = TRUE; - break; - case B3SOIPD_MOD_PDVT1W: - mod->B3SOIPDpdvt1w = value->rValue; - mod->B3SOIPDpdvt1wGiven = TRUE; - break; - case B3SOIPD_MOD_PDVT2W: - mod->B3SOIPDpdvt2w = value->rValue; - mod->B3SOIPDpdvt2wGiven = TRUE; - break; - case B3SOIPD_MOD_PU0 : - mod->B3SOIPDpu0 = value->rValue; - mod->B3SOIPDpu0Given = TRUE; - break; - case B3SOIPD_MOD_PUA: - mod->B3SOIPDpua = value->rValue; - mod->B3SOIPDpuaGiven = TRUE; - break; - case B3SOIPD_MOD_PUB: - mod->B3SOIPDpub = value->rValue; - mod->B3SOIPDpubGiven = TRUE; - break; - case B3SOIPD_MOD_PUC: - mod->B3SOIPDpuc = value->rValue; - mod->B3SOIPDpucGiven = TRUE; - break; - case B3SOIPD_MOD_PVSAT: - mod->B3SOIPDpvsat = value->rValue; - mod->B3SOIPDpvsatGiven = TRUE; - break; - case B3SOIPD_MOD_PA0: - mod->B3SOIPDpa0 = value->rValue; - mod->B3SOIPDpa0Given = TRUE; - break; - case B3SOIPD_MOD_PAGS: - mod->B3SOIPDpags= value->rValue; - mod->B3SOIPDpagsGiven = TRUE; - break; - case B3SOIPD_MOD_PB0 : - mod->B3SOIPDpb0 = value->rValue; - mod->B3SOIPDpb0Given = TRUE; - break; - case B3SOIPD_MOD_PB1 : - mod->B3SOIPDpb1 = value->rValue; - mod->B3SOIPDpb1Given = TRUE; - break; - case B3SOIPD_MOD_PKETA: - mod->B3SOIPDpketa = value->rValue; - mod->B3SOIPDpketaGiven = TRUE; - break; - case B3SOIPD_MOD_PKETAS: - mod->B3SOIPDpketas = value->rValue; - mod->B3SOIPDpketasGiven = TRUE; - break; - case B3SOIPD_MOD_PA1: - mod->B3SOIPDpa1 = value->rValue; - mod->B3SOIPDpa1Given = TRUE; - break; - case B3SOIPD_MOD_PA2: - mod->B3SOIPDpa2 = value->rValue; - mod->B3SOIPDpa2Given = TRUE; - break; - case B3SOIPD_MOD_PRDSW: - mod->B3SOIPDprdsw = value->rValue; - mod->B3SOIPDprdswGiven = TRUE; - break; - case B3SOIPD_MOD_PPRWB: - mod->B3SOIPDpprwb = value->rValue; - mod->B3SOIPDpprwbGiven = TRUE; - break; - case B3SOIPD_MOD_PPRWG: - mod->B3SOIPDpprwg = value->rValue; - mod->B3SOIPDpprwgGiven = TRUE; - break; - case B3SOIPD_MOD_PWR : - mod->B3SOIPDpwr = value->rValue; - mod->B3SOIPDpwrGiven = TRUE; - break; - case B3SOIPD_MOD_PNFACTOR : - mod->B3SOIPDpnfactor = value->rValue; - mod->B3SOIPDpnfactorGiven = TRUE; - break; - case B3SOIPD_MOD_PDWG : - mod->B3SOIPDpdwg = value->rValue; - mod->B3SOIPDpdwgGiven = TRUE; - break; - case B3SOIPD_MOD_PDWB : - mod->B3SOIPDpdwb = value->rValue; - mod->B3SOIPDpdwbGiven = TRUE; - break; - case B3SOIPD_MOD_PVOFF: - mod->B3SOIPDpvoff = value->rValue; - mod->B3SOIPDpvoffGiven = TRUE; - break; - case B3SOIPD_MOD_PETA0: - mod->B3SOIPDpeta0 = value->rValue; - mod->B3SOIPDpeta0Given = TRUE; - break; - case B3SOIPD_MOD_PETAB: - mod->B3SOIPDpetab = value->rValue; - mod->B3SOIPDpetabGiven = TRUE; - break; - case B3SOIPD_MOD_PDSUB: - mod->B3SOIPDpdsub = value->rValue; - mod->B3SOIPDpdsubGiven = TRUE; - break; - case B3SOIPD_MOD_PCIT : - mod->B3SOIPDpcit = value->rValue; - mod->B3SOIPDpcitGiven = TRUE; - break; - case B3SOIPD_MOD_PCDSC : - mod->B3SOIPDpcdsc = value->rValue; - mod->B3SOIPDpcdscGiven = TRUE; - break; - case B3SOIPD_MOD_PCDSCB : - mod->B3SOIPDpcdscb = value->rValue; - mod->B3SOIPDpcdscbGiven = TRUE; - break; - case B3SOIPD_MOD_PCDSCD : - mod->B3SOIPDpcdscd = value->rValue; - mod->B3SOIPDpcdscdGiven = TRUE; - break; - case B3SOIPD_MOD_PPCLM: - mod->B3SOIPDppclm = value->rValue; - mod->B3SOIPDppclmGiven = TRUE; - break; - case B3SOIPD_MOD_PPDIBL1: - mod->B3SOIPDppdibl1 = value->rValue; - mod->B3SOIPDppdibl1Given = TRUE; - break; - case B3SOIPD_MOD_PPDIBL2: - mod->B3SOIPDppdibl2 = value->rValue; - mod->B3SOIPDppdibl2Given = TRUE; - break; - case B3SOIPD_MOD_PPDIBLB: - mod->B3SOIPDppdiblb = value->rValue; - mod->B3SOIPDppdiblbGiven = TRUE; - break; - case B3SOIPD_MOD_PDROUT: - mod->B3SOIPDpdrout = value->rValue; - mod->B3SOIPDpdroutGiven = TRUE; - break; - case B3SOIPD_MOD_PPVAG: - mod->B3SOIPDppvag = value->rValue; - mod->B3SOIPDppvagGiven = TRUE; - break; - case B3SOIPD_MOD_PDELTA : - mod->B3SOIPDpdelta = value->rValue; - mod->B3SOIPDpdeltaGiven = TRUE; - break; - case B3SOIPD_MOD_PALPHA0 : - mod->B3SOIPDpalpha0 = value->rValue; - mod->B3SOIPDpalpha0Given = TRUE; - break; - case B3SOIPD_MOD_PFBJTII : - mod->B3SOIPDpfbjtii = value->rValue; - mod->B3SOIPDpfbjtiiGiven = TRUE; - break; - case B3SOIPD_MOD_PBETA0 : - mod->B3SOIPDpbeta0 = value->rValue; - mod->B3SOIPDpbeta0Given = TRUE; - break; - case B3SOIPD_MOD_PBETA1 : - mod->B3SOIPDpbeta1 = value->rValue; - mod->B3SOIPDpbeta1Given = TRUE; - break; - case B3SOIPD_MOD_PBETA2 : - mod->B3SOIPDpbeta2 = value->rValue; - mod->B3SOIPDpbeta2Given = TRUE; - break; - case B3SOIPD_MOD_PVDSATII0 : - mod->B3SOIPDpvdsatii0 = value->rValue; - mod->B3SOIPDpvdsatii0Given = TRUE; - break; - case B3SOIPD_MOD_PLII : - mod->B3SOIPDplii = value->rValue; - mod->B3SOIPDpliiGiven = TRUE; - break; - case B3SOIPD_MOD_PESATII : - mod->B3SOIPDpesatii = value->rValue; - mod->B3SOIPDpesatiiGiven = TRUE; - break; - case B3SOIPD_MOD_PSII0 : - mod->B3SOIPDpsii0 = value->rValue; - mod->B3SOIPDpsii0Given = TRUE; - break; - case B3SOIPD_MOD_PSII1 : - mod->B3SOIPDpsii1 = value->rValue; - mod->B3SOIPDpsii1Given = TRUE; - break; - case B3SOIPD_MOD_PSII2 : - mod->B3SOIPDpsii2 = value->rValue; - mod->B3SOIPDpsii2Given = TRUE; - break; - case B3SOIPD_MOD_PSIID : - mod->B3SOIPDpsiid = value->rValue; - mod->B3SOIPDpsiidGiven = TRUE; - break; - case B3SOIPD_MOD_PAGIDL : - mod->B3SOIPDpagidl = value->rValue; - mod->B3SOIPDpagidlGiven = TRUE; - break; - case B3SOIPD_MOD_PBGIDL : - mod->B3SOIPDpbgidl = value->rValue; - mod->B3SOIPDpbgidlGiven = TRUE; - break; - case B3SOIPD_MOD_PNGIDL : - mod->B3SOIPDpngidl = value->rValue; - mod->B3SOIPDpngidlGiven = TRUE; - break; - case B3SOIPD_MOD_PNTUN : - mod->B3SOIPDpntun = value->rValue; - mod->B3SOIPDpntunGiven = TRUE; - break; - case B3SOIPD_MOD_PNDIODE : - mod->B3SOIPDpndiode = value->rValue; - mod->B3SOIPDpndiodeGiven = TRUE; - break; - case B3SOIPD_MOD_PNRECF0 : - mod->B3SOIPDpnrecf0 = value->rValue; - mod->B3SOIPDpnrecf0Given = TRUE; - break; - case B3SOIPD_MOD_PNRECR0 : - mod->B3SOIPDpnrecr0 = value->rValue; - mod->B3SOIPDpnrecr0Given = TRUE; - break; - case B3SOIPD_MOD_PISBJT : - mod->B3SOIPDpisbjt = value->rValue; - mod->B3SOIPDpisbjtGiven = TRUE; - break; - case B3SOIPD_MOD_PISDIF : - mod->B3SOIPDpisdif = value->rValue; - mod->B3SOIPDpisdifGiven = TRUE; - break; - case B3SOIPD_MOD_PISREC : - mod->B3SOIPDpisrec = value->rValue; - mod->B3SOIPDpisrecGiven = TRUE; - break; - case B3SOIPD_MOD_PISTUN : - mod->B3SOIPDpistun = value->rValue; - mod->B3SOIPDpistunGiven = TRUE; - break; - case B3SOIPD_MOD_PVREC0 : - mod->B3SOIPDpvrec0 = value->rValue; - mod->B3SOIPDpvrec0Given = TRUE; - break; - case B3SOIPD_MOD_PVTUN0 : - mod->B3SOIPDpvtun0 = value->rValue; - mod->B3SOIPDpvtun0Given = TRUE; - break; - case B3SOIPD_MOD_PNBJT : - mod->B3SOIPDpnbjt = value->rValue; - mod->B3SOIPDpnbjtGiven = TRUE; - break; - case B3SOIPD_MOD_PLBJT0 : - mod->B3SOIPDplbjt0 = value->rValue; - mod->B3SOIPDplbjt0Given = TRUE; - break; - case B3SOIPD_MOD_PVABJT : - mod->B3SOIPDpvabjt = value->rValue; - mod->B3SOIPDpvabjtGiven = TRUE; - break; - case B3SOIPD_MOD_PAELY : - mod->B3SOIPDpaely = value->rValue; - mod->B3SOIPDpaelyGiven = TRUE; - break; - case B3SOIPD_MOD_PAHLI : - mod->B3SOIPDpahli = value->rValue; - mod->B3SOIPDpahliGiven = TRUE; - break; - /* CV Model */ - case B3SOIPD_MOD_PVSDFB : - mod->B3SOIPDpvsdfb = value->rValue; - mod->B3SOIPDpvsdfbGiven = TRUE; - break; - case B3SOIPD_MOD_PVSDTH : - mod->B3SOIPDpvsdth = value->rValue; - mod->B3SOIPDpvsdthGiven = TRUE; - break; - case B3SOIPD_MOD_PDELVT : - mod->B3SOIPDpdelvt = value->rValue; - mod->B3SOIPDpdelvtGiven = TRUE; - break; - case B3SOIPD_MOD_PACDE : - mod->B3SOIPDpacde = value->rValue; - mod->B3SOIPDpacdeGiven = TRUE; - break; - case B3SOIPD_MOD_PMOIN : - mod->B3SOIPDpmoin = value->rValue; - mod->B3SOIPDpmoinGiven = TRUE; - break; -/* Added for binning - END */ - - case B3SOIPD_MOD_NMOS : - if(value->iValue) { - mod->B3SOIPDtype = 1; - mod->B3SOIPDtypeGiven = TRUE; - } - break; - case B3SOIPD_MOD_PMOS : - if(value->iValue) { - mod->B3SOIPDtype = - 1; - mod->B3SOIPDtypeGiven = TRUE; - } - break; - default: - return(E_BADPARM); - } - return(OK); -} - - diff --git a/src/spicelib/devices/bsim3soi_pd/b3soipdnoi.c b/src/spicelib/devices/bsim3soi_pd/b3soipdnoi.c deleted file mode 100644 index 9aff8aeff..000000000 --- a/src/spicelib/devices/bsim3soi_pd/b3soipdnoi.c +++ /dev/null @@ -1,361 +0,0 @@ -/********** -Copyright 1990 Regents of the University of California. All rights reserved. -Author: 1998 Samuel Fung, Dennis Sinitsky and Stephen Tang -File: b3soipdnoi.c 98/5/01 -Modified by Hui Wan 02/3/5 -Modified by Paolo Nenzi 2002 -**********/ - -/* - * Revision 2.2.3 02/3/5 Pin Su - * BSIMPD2.2.3 release - */ - -#include "ngspice/ngspice.h" -#include "b3soipddef.h" -#include "ngspice/cktdefs.h" -#include "ngspice/iferrmsg.h" -#include "ngspice/noisedef.h" -#include "ngspice/suffix.h" -#include "ngspice/const.h" /* jwan */ - -/* - * B3SOIPDnoise (mode, operation, firstModel, ckt, data, OnDens) - * This routine names and evaluates all of the noise sources - * associated with MOSFET's. It starts with the model *firstModel and - * traverses all of its insts. It then proceeds to any other models - * on the linked list. The total output noise density generated by - * all of the MOSFET's is summed with the variable "OnDens". - */ - -/* - Channel thermal and flicker noises are calculated based on the value - of model->B3SOIPDnoiMod. - If model->B3SOIPDnoiMod = 1, - Channel thermal noise = SPICE2 model - Flicker noise = SPICE2 model - If model->B3SOIPDnoiMod = 2, - Channel thermal noise = B3SOIPD model - Flicker noise = B3SOIPD model - If model->B3SOIPDnoiMod = 3, - Channel thermal noise = SPICE2 model - Flicker noise = B3SOIPD model - If model->B3SOIPDnoiMod = 4, - Channel thermal noise = B3SOIPD model - Flicker noise = SPICE2 model - */ - - -static double -B3SOIPDStrongInversionNoiseEval(double vgs, double vds, B3SOIPDmodel *model, - B3SOIPDinstance *here, double freq, - double temp) -{ -struct b3soipdSizeDependParam *pParam; -double cd, esat, DelClm, EffFreq, N0, Nl; -double T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, Ssi; - - NG_IGNORE(vgs); - - pParam = here->pParam; - cd = fabs(here->B3SOIPDcd) * here->B3SOIPDm; - -/* v2.2.3 bug fix */ - if(model->B3SOIPDem<=0.0) DelClm = 0.0; - else { - esat = 2.0 * pParam->B3SOIPDvsattemp / here->B3SOIPDueff; - T0 = ((((vds - here->B3SOIPDVdseff) / pParam->B3SOIPDlitl) - + model->B3SOIPDem) / esat); - DelClm = pParam->B3SOIPDlitl * log (MAX(T0, N_MINLOG)); - } - - - EffFreq = pow(freq, model->B3SOIPDef); - T1 = CHARGE * CHARGE * 8.62e-5 * cd * temp * here->B3SOIPDueff; - T2 = 1.0e8 * EffFreq * model->B3SOIPDcox - * pParam->B3SOIPDleff * pParam->B3SOIPDleff; - -/* v2.2.3 bug fix */ - N0 = model->B3SOIPDcox * here->B3SOIPDVgsteff / CHARGE; - Nl = model->B3SOIPDcox * here->B3SOIPDVgsteff - * (1.0 - here->B3SOIPDAbovVgst2Vtm * here->B3SOIPDVdseff) / CHARGE; - - - T3 = model->B3SOIPDoxideTrapDensityA - * log(MAX(((N0 + 2.0e14) / (Nl + 2.0e14)), N_MINLOG)); - T4 = model->B3SOIPDoxideTrapDensityB * (N0 - Nl); - T5 = model->B3SOIPDoxideTrapDensityC * 0.5 * (N0 * N0 - Nl * Nl); - - T6 = 8.62e-5 * temp * cd * cd; - T7 = 1.0e8 * EffFreq * pParam->B3SOIPDleff - * pParam->B3SOIPDleff * pParam->B3SOIPDweff * here->B3SOIPDm; - T8 = model->B3SOIPDoxideTrapDensityA + model->B3SOIPDoxideTrapDensityB * Nl - + model->B3SOIPDoxideTrapDensityC * Nl * Nl; - T9 = (Nl + 2.0e14) * (Nl + 2.0e14); - - Ssi = T1 / T2 * (T3 + T4 + T5) + T6 / T7 * DelClm * T8 / T9; - - return Ssi; -} - -int -B3SOIPDnoise (int mode, int operation, GENmodel *inModel, CKTcircuit *ckt, - Ndata *data, double *OnDens) -{ -NOISEAN *job = (NOISEAN *) ckt->CKTcurJob; - -B3SOIPDmodel *model = (B3SOIPDmodel *)inModel; -B3SOIPDinstance *here; -struct b3soipdSizeDependParam *pParam; -double tempOnoise; -double tempInoise; -double noizDens[B3SOIPDNSRCS]; -double lnNdens[B3SOIPDNSRCS]; - -double vgs, vds, Slimit; -double T1, T10, T11; -double Ssi, Swi; - -int i; - - /* define the names of the noise sources */ - static char *B3SOIPDnNames[B3SOIPDNSRCS] = - { /* Note that we have to keep the order */ - ".rd", /* noise due to rd */ - /* consistent with the index definitions */ - ".rs", /* noise due to rs */ - /* in B3SOIPDdefs.h */ - ".id", /* noise due to id */ - ".1overf", /* flicker (1/f) noise */ - ".fb", /* noise due to floating body */ - "" /* total transistor noise */ - }; - - for (; model != NULL; model = B3SOIPDnextModel(model)) - { for (here = B3SOIPDinstances(model); here != NULL; - here = B3SOIPDnextInstance(here)) - { - pParam = here->pParam; - switch (operation) - { case N_OPEN: - /* see if we have to to produce a summary report */ - /* if so, name all the noise generators */ - - if (job->NStpsSm != 0) - { switch (mode) - { case N_DENS: - for (i = 0; i < B3SOIPDNSRCS; i++) - { NOISE_ADD_OUTVAR(ckt, data, "onoise.%s%s", here->B3SOIPDname, B3SOIPDnNames[i]); - } - break; - case INT_NOIZ: - for (i = 0; i < B3SOIPDNSRCS; i++) - { NOISE_ADD_OUTVAR(ckt, data, "onoise_total.%s%s", here->B3SOIPDname, B3SOIPDnNames[i]); - NOISE_ADD_OUTVAR(ckt, data, "inoise_total.%s%s", here->B3SOIPDname, B3SOIPDnNames[i]); - } - break; - } - } - break; - case N_CALC: - switch (mode) - { case N_DENS: - NevalSrc(&noizDens[B3SOIPDRDNOIZ], - &lnNdens[B3SOIPDRDNOIZ], ckt, THERMNOISE, - here->B3SOIPDdNodePrime, here->B3SOIPDdNode, - here->B3SOIPDdrainConductance * here->B3SOIPDm); - - NevalSrc(&noizDens[B3SOIPDRSNOIZ], - &lnNdens[B3SOIPDRSNOIZ], ckt, THERMNOISE, - here->B3SOIPDsNodePrime, here->B3SOIPDsNode, - here->B3SOIPDsourceConductance * here->B3SOIPDm); - - switch( model->B3SOIPDnoiMod ) - { case 1: - case 3: - NevalSrc(&noizDens[B3SOIPDIDNOIZ], - &lnNdens[B3SOIPDIDNOIZ], ckt, - THERMNOISE, here->B3SOIPDdNodePrime, - here->B3SOIPDsNodePrime, - (2.0 / 3.0 * fabs(here->B3SOIPDm * - (here->B3SOIPDgm - + here->B3SOIPDgds - + here->B3SOIPDgmbs)))); - break; - case 2: - -/* v2.2.3 bug fix */ - case 4: - NevalSrc(&noizDens[B3SOIPDIDNOIZ], - &lnNdens[B3SOIPDIDNOIZ], ckt, - THERMNOISE, here->B3SOIPDdNodePrime, - here->B3SOIPDsNodePrime, - (here->B3SOIPDueff - * fabs((here->B3SOIPDqinv * here->B3SOIPDm) - / (pParam->B3SOIPDleff - * pParam->B3SOIPDleff+ - here->B3SOIPDueff*fabs - (here->B3SOIPDqinv * here->B3SOIPDm)* - (here->B3SOIPDrds / here->B3SOIPDm))))); - break; - } - NevalSrc(&noizDens[B3SOIPDFLNOIZ], NULL, - ckt, N_GAIN, here->B3SOIPDdNodePrime, - here->B3SOIPDsNodePrime, (double) 0.0); - - switch( model->B3SOIPDnoiMod ) - { case 1: - case 4: - noizDens[B3SOIPDFLNOIZ] *= model->B3SOIPDkf - * exp(model->B3SOIPDaf - * log(MAX(fabs(here->B3SOIPDcd * here->B3SOIPDm), - N_MINLOG))) - / (pow(data->freq, model->B3SOIPDef) - * pParam->B3SOIPDleff - * pParam->B3SOIPDleff - * model->B3SOIPDcox); - break; - case 2: - case 3: - vgs = *(ckt->CKTstates[0] + here->B3SOIPDvgs); - vds = *(ckt->CKTstates[0] + here->B3SOIPDvds); - if (vds < 0.0) - { vds = -vds; - vgs = vgs + vds; - } - if (vgs >= here->B3SOIPDvon + 0.1) - { Ssi = B3SOIPDStrongInversionNoiseEval(vgs, - vds, model, here, data->freq, - ckt->CKTtemp); - noizDens[B3SOIPDFLNOIZ] *= Ssi; - } - else - { pParam = here->pParam; - T10 = model->B3SOIPDoxideTrapDensityA - * 8.62e-5 * ckt->CKTtemp; - T11 = pParam->B3SOIPDweff * here->B3SOIPDm - * pParam->B3SOIPDleff - * pow(data->freq, model->B3SOIPDef) - * 4.0e36; - Swi = T10 / T11 * here->B3SOIPDcd * here->B3SOIPDm - * here->B3SOIPDcd * here->B3SOIPDm; - Slimit = B3SOIPDStrongInversionNoiseEval( - here->B3SOIPDvon + 0.1, vds, model, - here, data->freq, ckt->CKTtemp); - T1 = Swi + Slimit; - if (T1 > 0.0) - noizDens[B3SOIPDFLNOIZ] *= (Slimit - * Swi) / T1; - else - noizDens[B3SOIPDFLNOIZ] *= 0.0; - } - break; - } - - lnNdens[B3SOIPDFLNOIZ] = - log(MAX(noizDens[B3SOIPDFLNOIZ], N_MINLOG)); - - /* Low frequency excess noise due to FBE */ - NevalSrc(&noizDens[B3SOIPDFBNOIZ], &lnNdens[B3SOIPDFBNOIZ], - ckt, SHOTNOISE, here->B3SOIPDsNodePrime, - here->B3SOIPDbNode, - 2.0 * model->B3SOIPDnoif * here->B3SOIPDibs * here->B3SOIPDm); - - noizDens[B3SOIPDTOTNOIZ] = noizDens[B3SOIPDRDNOIZ] - + noizDens[B3SOIPDRSNOIZ] - + noizDens[B3SOIPDIDNOIZ] - + noizDens[B3SOIPDFLNOIZ] - + noizDens[B3SOIPDFBNOIZ]; - lnNdens[B3SOIPDTOTNOIZ] = - log(MAX(noizDens[B3SOIPDTOTNOIZ], N_MINLOG)); - - *OnDens += noizDens[B3SOIPDTOTNOIZ]; - - if (data->delFreq == 0.0) - { /* if we haven't done any previous - integration, we need to initialize our - "history" variables. - */ - - for (i = 0; i < B3SOIPDNSRCS; i++) - { here->B3SOIPDnVar[LNLSTDENS][i] = - lnNdens[i]; - } - - /* clear out our integration variables - if it's the first pass - */ - if (data->freq == - job->NstartFreq) - { for (i = 0; i < B3SOIPDNSRCS; i++) - { here->B3SOIPDnVar[OUTNOIZ][i] = 0.0; - here->B3SOIPDnVar[INNOIZ][i] = 0.0; - } - } - } - else - { /* data->delFreq != 0.0, - we have to integrate. - */ - for (i = 0; i < B3SOIPDNSRCS; i++) - { if (i != B3SOIPDTOTNOIZ) - { tempOnoise = Nintegrate(noizDens[i], - lnNdens[i], - here->B3SOIPDnVar[LNLSTDENS][i], - data); - tempInoise = Nintegrate(noizDens[i] - * data->GainSqInv, lnNdens[i] - + data->lnGainInv, - here->B3SOIPDnVar[LNLSTDENS][i] - + data->lnGainInv, data); - here->B3SOIPDnVar[LNLSTDENS][i] = - lnNdens[i]; - data->outNoiz += tempOnoise; - data->inNoise += tempInoise; - if (job->NStpsSm != 0) - { here->B3SOIPDnVar[OUTNOIZ][i] - += tempOnoise; - here->B3SOIPDnVar[OUTNOIZ][B3SOIPDTOTNOIZ] - += tempOnoise; - here->B3SOIPDnVar[INNOIZ][i] - += tempInoise; - here->B3SOIPDnVar[INNOIZ][B3SOIPDTOTNOIZ] - += tempInoise; - } - } - } - } - if (data->prtSummary) - { for (i = 0; i < B3SOIPDNSRCS; i++) - { /* print a summary report */ - data->outpVector[data->outNumber++] - = noizDens[i]; - } - } - break; - case INT_NOIZ: - /* already calculated, just output */ - if (job->NStpsSm != 0) - { for (i = 0; i < B3SOIPDNSRCS; i++) - { data->outpVector[data->outNumber++] - = here->B3SOIPDnVar[OUTNOIZ][i]; - data->outpVector[data->outNumber++] - = here->B3SOIPDnVar[INNOIZ][i]; - } - } - break; - } - break; - case N_CLOSE: - /* do nothing, the main calling routine will close */ - return (OK); - break; /* the plots */ - } /* switch (operation) */ - } /* for here */ - } /* for model */ - - return(OK); -} - - - diff --git a/src/spicelib/devices/bsim3soi_pd/b3soipdpar.c b/src/spicelib/devices/bsim3soi_pd/b3soipdpar.c deleted file mode 100644 index 624e41009..000000000 --- a/src/spicelib/devices/bsim3soi_pd/b3soipdpar.c +++ /dev/null @@ -1,185 +0,0 @@ -/********** -Copyright 1990 Regents of the University of California. All rights reserved. -Author: 1998 Samuel Fung, Dennis Sinitsky and Stephen Tang -File: b3soipdpar.c 98/5/01 -Modified by Pin Su 99/2/15 -Modified by Pin Su 01/2/15 -Modified by Paolo Nenzi 2002 -**********/ - -/* - * Revision 2.2.3 02/3/5 Pin Su - * BSIMPD2.2.3 release - */ - -#include "ngspice/ngspice.h" -#include "ngspice/ifsim.h" -#include "b3soipddef.h" -#include "ngspice/sperror.h" -#include "ngspice/suffix.h" - -int -B3SOIPDparam(int param, IFvalue *value, GENinstance *inst, IFvalue *select) -{ - B3SOIPDinstance *here = (B3SOIPDinstance*)inst; - - NG_IGNORE(select); - - /* FALLTHROUGH added to suppress GCC warning due to - * -Wimplicit-fallthrough flag */ - switch(param) { - case B3SOIPD_W: - here->B3SOIPDw = value->rValue; - here->B3SOIPDwGiven = TRUE; - break; - case B3SOIPD_L: - here->B3SOIPDl = value->rValue; - here->B3SOIPDlGiven = TRUE; - break; - case B3SOIPD_M: - here->B3SOIPDm = value->rValue; - here->B3SOIPDmGiven = TRUE; - break; - case B3SOIPD_AS: - here->B3SOIPDsourceArea = value->rValue; - here->B3SOIPDsourceAreaGiven = TRUE; - break; - case B3SOIPD_AD: - here->B3SOIPDdrainArea = value->rValue; - here->B3SOIPDdrainAreaGiven = TRUE; - break; - case B3SOIPD_PS: - here->B3SOIPDsourcePerimeter = value->rValue; - here->B3SOIPDsourcePerimeterGiven = TRUE; - break; - case B3SOIPD_PD: - here->B3SOIPDdrainPerimeter = value->rValue; - here->B3SOIPDdrainPerimeterGiven = TRUE; - break; - case B3SOIPD_NRS: - here->B3SOIPDsourceSquares = value->rValue; - here->B3SOIPDsourceSquaresGiven = TRUE; - break; - case B3SOIPD_NRD: - here->B3SOIPDdrainSquares = value->rValue; - here->B3SOIPDdrainSquaresGiven = TRUE; - break; - case B3SOIPD_OFF: - here->B3SOIPDoff = value->iValue; - here->B3SOIPDoffGiven = TRUE; - break; - case B3SOIPD_IC_VBS: - here->B3SOIPDicVBS = value->rValue; - here->B3SOIPDicVBSGiven = TRUE; - break; - case B3SOIPD_IC_VDS: - here->B3SOIPDicVDS = value->rValue; - here->B3SOIPDicVDSGiven = TRUE; - break; - case B3SOIPD_IC_VGS: - here->B3SOIPDicVGS = value->rValue; - here->B3SOIPDicVGSGiven = TRUE; - break; - case B3SOIPD_IC_VES: - here->B3SOIPDicVES = value->rValue; - here->B3SOIPDicVESGiven = TRUE; - break; - case B3SOIPD_IC_VPS: - here->B3SOIPDicVPS = value->rValue; - here->B3SOIPDicVPSGiven = TRUE; - break; - case B3SOIPD_BJTOFF: - here->B3SOIPDbjtoff = value->iValue; - here->B3SOIPDbjtoffGiven= TRUE; - break; - case B3SOIPD_DEBUG: - here->B3SOIPDdebugMod = value->iValue; - here->B3SOIPDdebugModGiven= TRUE; - break; - case B3SOIPD_RTH0: - here->B3SOIPDrth0= value->rValue; - here->B3SOIPDrth0Given = TRUE; - break; - case B3SOIPD_CTH0: - here->B3SOIPDcth0= value->rValue; - here->B3SOIPDcth0Given = TRUE; - break; - case B3SOIPD_NRB: - here->B3SOIPDbodySquares = value->rValue; - here->B3SOIPDbodySquaresGiven = TRUE; - break; - case B3SOIPD_FRBODY: - here->B3SOIPDfrbody = value->rValue; - here->B3SOIPDfrbodyGiven = TRUE; - break; - - -/* v2.0 release */ - case B3SOIPD_NBC: - here->B3SOIPDnbc = value->rValue; - here->B3SOIPDnbcGiven = TRUE; - break; - case B3SOIPD_NSEG: - here->B3SOIPDnseg = value->rValue; - here->B3SOIPDnsegGiven = TRUE; - break; - case B3SOIPD_PDBCP: - here->B3SOIPDpdbcp = value->rValue; - here->B3SOIPDpdbcpGiven = TRUE; - break; - case B3SOIPD_PSBCP: - here->B3SOIPDpsbcp = value->rValue; - here->B3SOIPDpsbcpGiven = TRUE; - break; - case B3SOIPD_AGBCP: - here->B3SOIPDagbcp = value->rValue; - here->B3SOIPDagbcpGiven = TRUE; - break; - case B3SOIPD_AEBCP: - here->B3SOIPDaebcp = value->rValue; - here->B3SOIPDaebcpGiven = TRUE; - break; - case B3SOIPD_VBSUSR: - here->B3SOIPDvbsusr = value->rValue; - here->B3SOIPDvbsusrGiven = TRUE; - break; - case B3SOIPD_TNODEOUT: - here->B3SOIPDtnodeout = value->iValue; - here->B3SOIPDtnodeoutGiven = TRUE; - break; - - - case B3SOIPD_IC: - switch (value->v.numValue) { - case 5: - here->B3SOIPDicVPS = *(value->v.vec.rVec+4); - here->B3SOIPDicVPSGiven = TRUE; - /* FALLTHROUGH */ - case 4: - here->B3SOIPDicVES = *(value->v.vec.rVec+3); - here->B3SOIPDicVESGiven = TRUE; - /* FALLTHROUGH */ - case 3: - here->B3SOIPDicVBS = *(value->v.vec.rVec+2); - here->B3SOIPDicVBSGiven = TRUE; - /* FALLTHROUGH */ - case 2: - here->B3SOIPDicVGS = *(value->v.vec.rVec+1); - here->B3SOIPDicVGSGiven = TRUE; - /* FALLTHROUGH */ - case 1: - here->B3SOIPDicVDS = *(value->v.vec.rVec); - here->B3SOIPDicVDSGiven = TRUE; - break; - default: - return(E_BADPARM); - } - break; - default: - return(E_BADPARM); - } - return(OK); -} - - - diff --git a/src/spicelib/devices/bsim3soi_pd/b3soipdpzld.c b/src/spicelib/devices/bsim3soi_pd/b3soipdpzld.c deleted file mode 100644 index b2800435d..000000000 --- a/src/spicelib/devices/bsim3soi_pd/b3soipdpzld.c +++ /dev/null @@ -1,159 +0,0 @@ -/********** -Copyright 1990 Regents of the University of California. All rights reserved. -Author: 1998 Samuel Fung, Dennis Sinitsky and Stephen Tang -File: b3soipdpzld.c 98/5/01 -Modified by Paolo Nenzi 2002 -**********/ - -/* - * Revision 2.2.3 02/3/5 Pin Su - * BSIMPD2.2.3 release - */ - -#include "ngspice/ngspice.h" -#include "ngspice/cktdefs.h" -#include "ngspice/complex.h" -#include "ngspice/sperror.h" -#include "b3soipddef.h" -#include "ngspice/suffix.h" - -int -B3SOIPDpzLoad(GENmodel *inModel, CKTcircuit *ckt, SPcomplex *s) -{ -B3SOIPDmodel *model = (B3SOIPDmodel*)inModel; -B3SOIPDinstance *here; -double xcggb, xcgdb, xcgsb, xcbgb, xcbdb, xcbsb, xcddb, xcssb, xcdgb; -double gdpr, gspr, gds, gbd, gbs, capbd = 0.0, capbs = 0.0; -double xcsgb, xcdsb, xcsdb; -double cggb, cgdb, cgsb, cbgb, cbdb, cbsb, cddb, cdgb, cdsb; -double GSoverlapCap, GDoverlapCap, GBoverlapCap = 0.0; -double FwdSum, RevSum, Gm, Gmbs; - -double m; - - NG_IGNORE(ckt); - - for (; model != NULL; model = B3SOIPDnextModel(model)) - { for (here = B3SOIPDinstances(model); here!= NULL; - here = B3SOIPDnextInstance(here)) - { - if (here->B3SOIPDmode >= 0) - { Gm = here->B3SOIPDgm; - Gmbs = here->B3SOIPDgmbs; - FwdSum = Gm + Gmbs; - RevSum = 0.0; - cggb = here->B3SOIPDcggb; - cgsb = here->B3SOIPDcgsb; - cgdb = here->B3SOIPDcgdb; - - cbgb = here->B3SOIPDcbgb; - cbsb = here->B3SOIPDcbsb; - cbdb = here->B3SOIPDcbdb; - - cdgb = here->B3SOIPDcdgb; - cdsb = here->B3SOIPDcdsb; - cddb = here->B3SOIPDcddb; - } - else - { Gm = -here->B3SOIPDgm; - Gmbs = -here->B3SOIPDgmbs; - FwdSum = 0.0; - RevSum = -Gm - Gmbs; - cggb = here->B3SOIPDcggb; - cgsb = here->B3SOIPDcgdb; - cgdb = here->B3SOIPDcgsb; - - cbgb = here->B3SOIPDcbgb; - cbsb = here->B3SOIPDcbdb; - cbdb = here->B3SOIPDcbsb; - - cdgb = -(here->B3SOIPDcdgb + cggb + cbgb); - cdsb = -(here->B3SOIPDcddb + cgsb + cbsb); - cddb = -(here->B3SOIPDcdsb + cgdb + cbdb); - } - gdpr=here->B3SOIPDdrainConductance; - gspr=here->B3SOIPDsourceConductance; - gds= here->B3SOIPDgds; - gbd= here->B3SOIPDgjdb; - gbs= here->B3SOIPDgjsb; -#ifdef BULKCODE - capbd= here->B3SOIPDcapbd; - capbs= here->B3SOIPDcapbs; -#endif - GSoverlapCap = here->B3SOIPDcgso; - GDoverlapCap = here->B3SOIPDcgdo; -#ifdef BULKCODE - GBoverlapCap = here->pParam->B3SOIPDcgbo; -#endif - - xcdgb = (cdgb - GDoverlapCap); - xcddb = (cddb + capbd + GDoverlapCap); - xcdsb = cdsb; - xcsgb = -(cggb + cbgb + cdgb + GSoverlapCap); - xcsdb = -(cgdb + cbdb + cddb); - xcssb = (capbs + GSoverlapCap - (cgsb+cbsb+cdsb)); - xcggb = (cggb + GDoverlapCap + GSoverlapCap + GBoverlapCap); - xcgdb = (cgdb - GDoverlapCap); - xcgsb = (cgsb - GSoverlapCap); - xcbgb = (cbgb - GBoverlapCap); - xcbdb = (cbdb - capbd); - xcbsb = (cbsb - capbs); - - m = here->B3SOIPDm; - - *(here->B3SOIPDGgPtr ) += m * (xcggb * s->real); - *(here->B3SOIPDGgPtr +1) += m * (xcggb * s->imag); - *(here->B3SOIPDBbPtr ) += m * ((-xcbgb-xcbdb-xcbsb) * s->real); - *(here->B3SOIPDBbPtr +1) += m * ((-xcbgb-xcbdb-xcbsb) * s->imag); - *(here->B3SOIPDDPdpPtr ) += m * (xcddb * s->real); - *(here->B3SOIPDDPdpPtr +1) += m * (xcddb * s->imag); - *(here->B3SOIPDSPspPtr ) += m * (xcssb * s->real); - *(here->B3SOIPDSPspPtr +1) += m * (xcssb * s->imag); - *(here->B3SOIPDGbPtr ) += m * ((-xcggb-xcgdb-xcgsb) * s->real); - *(here->B3SOIPDGbPtr +1) += m * ((-xcggb-xcgdb-xcgsb) * s->imag); - *(here->B3SOIPDGdpPtr ) += m * (xcgdb * s->real); - *(here->B3SOIPDGdpPtr +1) += m * (xcgdb * s->imag); - *(here->B3SOIPDGspPtr ) += m * (xcgsb * s->real); - *(here->B3SOIPDGspPtr +1) += m * (xcgsb * s->imag); - *(here->B3SOIPDBgPtr ) += m * (xcbgb * s->real); - *(here->B3SOIPDBgPtr +1) += m * (xcbgb * s->imag); - *(here->B3SOIPDBdpPtr ) += m * (xcbdb * s->real); - *(here->B3SOIPDBdpPtr +1) += m * (xcbdb * s->imag); - *(here->B3SOIPDBspPtr ) += m * (xcbsb * s->real); - *(here->B3SOIPDBspPtr +1) += m * (xcbsb * s->imag); - *(here->B3SOIPDDPgPtr ) += m * (xcdgb * s->real); - *(here->B3SOIPDDPgPtr +1) += m * (xcdgb * s->imag); - *(here->B3SOIPDDPbPtr ) += m * ((-xcdgb-xcddb-xcdsb) * s->real); - *(here->B3SOIPDDPbPtr +1) += m * ((-xcdgb-xcddb-xcdsb) * s->imag); - *(here->B3SOIPDDPspPtr ) += m * (xcdsb * s->real); - *(here->B3SOIPDDPspPtr +1) += m * (xcdsb * s->imag); - *(here->B3SOIPDSPgPtr ) += m * (xcsgb * s->real); - *(here->B3SOIPDSPgPtr +1) += m * (xcsgb * s->imag); - *(here->B3SOIPDSPbPtr ) += m * ((-xcsgb-xcsdb-xcssb) * s->real); - *(here->B3SOIPDSPbPtr +1) += m * ((-xcsgb-xcsdb-xcssb) * s->imag); - *(here->B3SOIPDSPdpPtr ) += m * (xcsdb * s->real); - *(here->B3SOIPDSPdpPtr +1) += m * (xcsdb * s->imag); - *(here->B3SOIPDDdPtr) += m * gdpr; - *(here->B3SOIPDSsPtr) += m * gspr; - *(here->B3SOIPDBbPtr) += m * (gbd + gbs); - *(here->B3SOIPDDPdpPtr) += m * (gdpr + gds + gbd + RevSum); - *(here->B3SOIPDSPspPtr) += m * (gspr + gds + gbs + FwdSum); - *(here->B3SOIPDDdpPtr) -= m * gdpr; - *(here->B3SOIPDSspPtr) -= m * gspr; - *(here->B3SOIPDBdpPtr) -= m * gbd; - *(here->B3SOIPDBspPtr) -= m * gbs; - *(here->B3SOIPDDPdPtr) -= m * gdpr; - *(here->B3SOIPDDPgPtr) += m * Gm; - *(here->B3SOIPDDPbPtr) -= m * (gbd - Gmbs); - *(here->B3SOIPDDPspPtr) -= m * (gds + FwdSum); - *(here->B3SOIPDSPgPtr) -= m * Gm; - *(here->B3SOIPDSPsPtr) -= m * gspr; - *(here->B3SOIPDSPbPtr) -= m * (gbs + Gmbs); - *(here->B3SOIPDSPdpPtr) -= m * (gds + RevSum); - - } - } - return(OK); -} - - diff --git a/src/spicelib/devices/bsim3soi_pd/b3soipdset.c b/src/spicelib/devices/bsim3soi_pd/b3soipdset.c deleted file mode 100644 index 5e5774a82..000000000 --- a/src/spicelib/devices/bsim3soi_pd/b3soipdset.c +++ /dev/null @@ -1,1574 +0,0 @@ -/********** -Copyright 1990 Regents of the University of California. All rights reserved. -Author: 1998 Samuel Fung, Dennis Sinitsky and Stephen Tang -File: b3soipdset.c 98/5/01 -Modified by Pin Su and Jan Feng 99/2/15 -Modified by Pin Su 99/4/30 -Modified by Pin Su, Wei Jin 99/9/27 -Modified by Pin Su 00/3/1 -Modified by Pin Su 01/2/15 -Modified by Pin Su 02/3/5 -Modified by Paolo Nenzi 2002 -**********/ - -/* - * Revision 2.2.3 02/3/5 Pin Su - * BSIMPD2.2.3 release - */ - -#include "ngspice/ngspice.h" -#include "ngspice/smpdefs.h" -#include "ngspice/cktdefs.h" -#include "b3soipddef.h" -#include "ngspice/const.h" -#include "ngspice/sperror.h" -#include "ngspice/suffix.h" - -#define SMOOTHFACTOR 0.1 -#define EPSOX 3.453133e-11 -#define EPSSI 1.03594e-10 -#define PI 3.141592654 -#define Charge_q 1.60219e-19 -#define Meter2Micron 1.0e6 - -int -B3SOIPDsetup(SMPmatrix *matrix, GENmodel *inModel, CKTcircuit *ckt, - int *states) -{ -B3SOIPDmodel *model = (B3SOIPDmodel*)inModel; -B3SOIPDinstance *here; -int error; -CKTnode *tmp; - -double Cboxt; - -CKTnode *tmpNode; -IFuid tmpName; - - - /* loop through all the B3SOIPD device models */ - for( ; model != NULL; model = B3SOIPDnextModel(model)) - { -/* Default value Processing for B3SOIPD MOSFET Models */ - - if (!model->B3SOIPDtypeGiven) - model->B3SOIPDtype = NMOS; - if (!model->B3SOIPDmobModGiven) - model->B3SOIPDmobMod = 1; - if (!model->B3SOIPDbinUnitGiven) - model->B3SOIPDbinUnit = 1; - if (!model->B3SOIPDparamChkGiven) - model->B3SOIPDparamChk = 0; - if (!model->B3SOIPDcapModGiven) - model->B3SOIPDcapMod = 2; - if (!model->B3SOIPDnoiModGiven) - model->B3SOIPDnoiMod = 1; - if (!model->B3SOIPDshModGiven) - model->B3SOIPDshMod = 0; - if (!model->B3SOIPDversionGiven) - model->B3SOIPDversion = 2.0; - if (!model->B3SOIPDtoxGiven) - model->B3SOIPDtox = 100.0e-10; - model->B3SOIPDcox = 3.453133e-11 / model->B3SOIPDtox; - -/* v2.2.3 */ - if (!model->B3SOIPDdtoxcvGiven) - model->B3SOIPDdtoxcv = 0.0; - - if (!model->B3SOIPDcdscGiven) - model->B3SOIPDcdsc = 2.4e-4; /* unit Q/V/m^2 */ - if (!model->B3SOIPDcdscbGiven) - model->B3SOIPDcdscb = 0.0; /* unit Q/V/m^2 */ - if (!model->B3SOIPDcdscdGiven) - model->B3SOIPDcdscd = 0.0; /* unit Q/V/m^2 */ - if (!model->B3SOIPDcitGiven) - model->B3SOIPDcit = 0.0; /* unit Q/V/m^2 */ - if (!model->B3SOIPDnfactorGiven) - model->B3SOIPDnfactor = 1; - if (!model->B3SOIPDvsatGiven) - model->B3SOIPDvsat = 8.0e4; /* unit m/s */ - if (!model->B3SOIPDatGiven) - model->B3SOIPDat = 3.3e4; /* unit m/s */ - if (!model->B3SOIPDa0Given) - model->B3SOIPDa0 = 1.0; - if (!model->B3SOIPDagsGiven) - model->B3SOIPDags = 0.0; - if (!model->B3SOIPDa1Given) - model->B3SOIPDa1 = 0.0; - if (!model->B3SOIPDa2Given) - model->B3SOIPDa2 = 1.0; - if (!model->B3SOIPDketaGiven) - model->B3SOIPDketa = -0.6; /* unit / V */ - if (!model->B3SOIPDnsubGiven) - model->B3SOIPDnsub = 6.0e16; /* unit 1/cm3 */ - if (!model->B3SOIPDnpeakGiven) - model->B3SOIPDnpeak = 1.7e17; /* unit 1/cm3 */ - if (!model->B3SOIPDngateGiven) - model->B3SOIPDngate = 0; /* unit 1/cm3 */ - if (!model->B3SOIPDvbmGiven) - model->B3SOIPDvbm = -3.0; - if (!model->B3SOIPDxtGiven) - model->B3SOIPDxt = 1.55e-7; - if (!model->B3SOIPDkt1Given) - model->B3SOIPDkt1 = -0.11; /* unit V */ - if (!model->B3SOIPDkt1lGiven) - model->B3SOIPDkt1l = 0.0; /* unit V*m */ - if (!model->B3SOIPDkt2Given) - model->B3SOIPDkt2 = 0.022; /* No unit */ - if (!model->B3SOIPDk3Given) - model->B3SOIPDk3 = 0.0; - if (!model->B3SOIPDk3bGiven) - model->B3SOIPDk3b = 0.0; - if (!model->B3SOIPDw0Given) - model->B3SOIPDw0 = 2.5e-6; - if (!model->B3SOIPDnlxGiven) - model->B3SOIPDnlx = 1.74e-7; - if (!model->B3SOIPDdvt0Given) - model->B3SOIPDdvt0 = 2.2; - if (!model->B3SOIPDdvt1Given) - model->B3SOIPDdvt1 = 0.53; - if (!model->B3SOIPDdvt2Given) - model->B3SOIPDdvt2 = -0.032; /* unit 1 / V */ - - if (!model->B3SOIPDdvt0wGiven) - model->B3SOIPDdvt0w = 0.0; - if (!model->B3SOIPDdvt1wGiven) - model->B3SOIPDdvt1w = 5.3e6; - if (!model->B3SOIPDdvt2wGiven) - model->B3SOIPDdvt2w = -0.032; - - if (!model->B3SOIPDdroutGiven) - model->B3SOIPDdrout = 0.56; - if (!model->B3SOIPDdsubGiven) - model->B3SOIPDdsub = model->B3SOIPDdrout; - if (!model->B3SOIPDvth0Given) - model->B3SOIPDvth0 = (model->B3SOIPDtype == NMOS) ? 0.7 : -0.7; - if (!model->B3SOIPDuaGiven) - model->B3SOIPDua = 2.25e-9; /* unit m/V */ - if (!model->B3SOIPDua1Given) - model->B3SOIPDua1 = 4.31e-9; /* unit m/V */ - if (!model->B3SOIPDubGiven) - model->B3SOIPDub = 5.87e-19; /* unit (m/V)**2 */ - if (!model->B3SOIPDub1Given) - model->B3SOIPDub1 = -7.61e-18; /* unit (m/V)**2 */ - if (!model->B3SOIPDucGiven) - model->B3SOIPDuc = (model->B3SOIPDmobMod == 3) ? -0.0465 : -0.0465e-9; - if (!model->B3SOIPDuc1Given) - model->B3SOIPDuc1 = (model->B3SOIPDmobMod == 3) ? -0.056 : -0.056e-9; - if (!model->B3SOIPDu0Given) - model->B3SOIPDu0 = (model->B3SOIPDtype == NMOS) ? 0.067 : 0.025; - if (!model->B3SOIPDuteGiven) - model->B3SOIPDute = -1.5; - if (!model->B3SOIPDvoffGiven) - model->B3SOIPDvoff = -0.08; - if (!model->B3SOIPDdeltaGiven) - model->B3SOIPDdelta = 0.01; - if (!model->B3SOIPDrdswGiven) - model->B3SOIPDrdsw = 100; - if (!model->B3SOIPDprwgGiven) - model->B3SOIPDprwg = 0.0; /* unit 1/V */ - if (!model->B3SOIPDprwbGiven) - model->B3SOIPDprwb = 0.0; - if (!model->B3SOIPDprtGiven) - model->B3SOIPDprt = 0.0; - if (!model->B3SOIPDeta0Given) - model->B3SOIPDeta0 = 0.08; /* no unit */ - if (!model->B3SOIPDetabGiven) - model->B3SOIPDetab = -0.07; /* unit 1/V */ - if (!model->B3SOIPDpclmGiven) - model->B3SOIPDpclm = 1.3; /* no unit */ - if (!model->B3SOIPDpdibl1Given) - model->B3SOIPDpdibl1 = .39; /* no unit */ - if (!model->B3SOIPDpdibl2Given) - model->B3SOIPDpdibl2 = 0.0086; /* no unit */ - if (!model->B3SOIPDpdiblbGiven) - model->B3SOIPDpdiblb = 0.0; /* 1/V */ - if (!model->B3SOIPDpvagGiven) - model->B3SOIPDpvag = 0.0; - if (!model->B3SOIPDwrGiven) - model->B3SOIPDwr = 1.0; - if (!model->B3SOIPDdwgGiven) - model->B3SOIPDdwg = 0.0; - if (!model->B3SOIPDdwbGiven) - model->B3SOIPDdwb = 0.0; - if (!model->B3SOIPDb0Given) - model->B3SOIPDb0 = 0.0; - if (!model->B3SOIPDb1Given) - model->B3SOIPDb1 = 0.0; - if (!model->B3SOIPDalpha0Given) - model->B3SOIPDalpha0 = 0.0; - - if (!model->B3SOIPDcgslGiven) - model->B3SOIPDcgsl = 0.0; - if (!model->B3SOIPDcgdlGiven) - model->B3SOIPDcgdl = 0.0; - if (!model->B3SOIPDckappaGiven) - model->B3SOIPDckappa = 0.6; - if (!model->B3SOIPDclcGiven) - model->B3SOIPDclc = 0.1e-7; - if (!model->B3SOIPDcleGiven) - model->B3SOIPDcle = 0.0; - if (!model->B3SOIPDtboxGiven) - model->B3SOIPDtbox = 3e-7; - if (!model->B3SOIPDtsiGiven) - model->B3SOIPDtsi = 1e-7; - if (!model->B3SOIPDxjGiven) - model->B3SOIPDxj = model->B3SOIPDtsi; - if (!model->B3SOIPDrbodyGiven) - model->B3SOIPDrbody = 0.0; - if (!model->B3SOIPDrbshGiven) - model->B3SOIPDrbsh = 0.0; - if (!model->B3SOIPDrth0Given) - model->B3SOIPDrth0 = 0; - - if (!model->B3SOIPDcth0Given) - model->B3SOIPDcth0 = 0; - - if (!model->B3SOIPDagidlGiven) - model->B3SOIPDagidl = 0.0; - if (!model->B3SOIPDbgidlGiven) - model->B3SOIPDbgidl = 0.0; - if (!model->B3SOIPDngidlGiven) - model->B3SOIPDngidl = 1.2; - if (!model->B3SOIPDndiodeGiven) - model->B3SOIPDndiode = 1.0; - if (!model->B3SOIPDntunGiven) - model->B3SOIPDntun = 10.0; - - if (!model->B3SOIPDnrecf0Given) - model->B3SOIPDnrecf0 = 2.0; - if (!model->B3SOIPDnrecr0Given) - model->B3SOIPDnrecr0 = 10.0; - - if (!model->B3SOIPDisbjtGiven) - model->B3SOIPDisbjt = 1e-6; - if (!model->B3SOIPDisdifGiven) - model->B3SOIPDisdif = 0.0; - if (!model->B3SOIPDisrecGiven) - model->B3SOIPDisrec = 1e-5; - if (!model->B3SOIPDistunGiven) - model->B3SOIPDistun = 0.0; - if (!model->B3SOIPDxbjtGiven) - model->B3SOIPDxbjt = 1; -/* - if (!model->B3SOIPDxdifGiven) - model->B3SOIPDxdif = 1; -*/ - if (!model->B3SOIPDxdifGiven) - model->B3SOIPDxdif = model->B3SOIPDxbjt; - - if (!model->B3SOIPDxrecGiven) - model->B3SOIPDxrec = 1; - if (!model->B3SOIPDxtunGiven) - model->B3SOIPDxtun = 0; - if (!model->B3SOIPDttGiven) - model->B3SOIPDtt = 1e-12; - if (!model->B3SOIPDasdGiven) - model->B3SOIPDasd = 0.3; - - /* unit degree celcius */ - if (!model->B3SOIPDtnomGiven) - model->B3SOIPDtnom = ckt->CKTnomTemp; - if (!model->B3SOIPDLintGiven) - model->B3SOIPDLint = 0.0; - if (!model->B3SOIPDLlGiven) - model->B3SOIPDLl = 0.0; - if (!model->B3SOIPDLlcGiven) - model->B3SOIPDLlc = 0.0; /* v2.2.3 */ - if (!model->B3SOIPDLlnGiven) - model->B3SOIPDLln = 1.0; - if (!model->B3SOIPDLwGiven) - model->B3SOIPDLw = 0.0; - if (!model->B3SOIPDLwcGiven) - model->B3SOIPDLwc = 0.0; /* v2.2.3 */ - if (!model->B3SOIPDLwnGiven) - model->B3SOIPDLwn = 1.0; - if (!model->B3SOIPDLwlGiven) - model->B3SOIPDLwl = 0.0; - if (!model->B3SOIPDLwlcGiven) - model->B3SOIPDLwlc = 0.0; /* v2.2.3 */ - if (!model->B3SOIPDLminGiven) - model->B3SOIPDLmin = 0.0; - if (!model->B3SOIPDLmaxGiven) - model->B3SOIPDLmax = 1.0; - if (!model->B3SOIPDWintGiven) - model->B3SOIPDWint = 0.0; - if (!model->B3SOIPDWlGiven) - model->B3SOIPDWl = 0.0; - if (!model->B3SOIPDWlcGiven) - model->B3SOIPDWlc = 0.0; /* v2.2.3 */ - if (!model->B3SOIPDWlnGiven) - model->B3SOIPDWln = 1.0; - if (!model->B3SOIPDWwGiven) - model->B3SOIPDWw = 0.0; - if (!model->B3SOIPDWwcGiven) - model->B3SOIPDWwc = 0.0; /* v2.2.3 */ - if (!model->B3SOIPDWwnGiven) - model->B3SOIPDWwn = 1.0; - if (!model->B3SOIPDWwlGiven) - model->B3SOIPDWwl = 0.0; - if (!model->B3SOIPDWwlcGiven) - model->B3SOIPDWwlc = 0.0; /* v2.2.3 */ - if (!model->B3SOIPDWminGiven) - model->B3SOIPDWmin = 0.0; - if (!model->B3SOIPDWmaxGiven) - model->B3SOIPDWmax = 1.0; - if (!model->B3SOIPDdwcGiven) - model->B3SOIPDdwc = model->B3SOIPDWint; - if (!model->B3SOIPDdlcGiven) - model->B3SOIPDdlc = model->B3SOIPDLint; - - -/* v2.2 release */ - if (!model->B3SOIPDwth0Given) - model->B3SOIPDwth0 = 0.0; - if (!model->B3SOIPDrhaloGiven) - model->B3SOIPDrhalo = 1e15; - if (!model->B3SOIPDntoxGiven) - model->B3SOIPDntox = 1; - if (!model->B3SOIPDtoxrefGiven) - model->B3SOIPDtoxref = 2.5e-9; - if (!model->B3SOIPDebgGiven) - model->B3SOIPDebg = 1.2; - if (!model->B3SOIPDvevbGiven) - model->B3SOIPDvevb = 0.075; - if (!model->B3SOIPDalphaGB1Given) - model->B3SOIPDalphaGB1 = 0.35; - if (!model->B3SOIPDbetaGB1Given) - model->B3SOIPDbetaGB1 = 0.03; - if (!model->B3SOIPDvgb1Given) - model->B3SOIPDvgb1 = 300; - if (!model->B3SOIPDalphaGB2Given) - model->B3SOIPDalphaGB2 = 0.43; - if (!model->B3SOIPDbetaGB2Given) - model->B3SOIPDbetaGB2 = 0.05; - if (!model->B3SOIPDvecbGiven) - model->B3SOIPDvecb = 0.026; - if (!model->B3SOIPDvgb2Given) - model->B3SOIPDvgb2 = 17; - if (!model->B3SOIPDtoxqmGiven) - model->B3SOIPDtoxqm = model->B3SOIPDtox; - if (!model->B3SOIPDvoxhGiven) - model->B3SOIPDvoxh = 5.0; - if (!model->B3SOIPDdeltavoxGiven) - model->B3SOIPDdeltavox = 0.005; - if (!model->B3SOIPDigModGiven) - model->B3SOIPDigMod = 0; - - -/* v2.0 release */ - if (!model->B3SOIPDk1w1Given) - model->B3SOIPDk1w1 = 0.0; - if (!model->B3SOIPDk1w2Given) - model->B3SOIPDk1w2 = 0.0; - if (!model->B3SOIPDketasGiven) - model->B3SOIPDketas = 0.0; - if (!model->B3SOIPDdwbcGiven) - model->B3SOIPDdwbc = 0.0; - if (!model->B3SOIPDbeta0Given) - model->B3SOIPDbeta0 = 0.0; - if (!model->B3SOIPDbeta1Given) - model->B3SOIPDbeta1 = 0.0; - if (!model->B3SOIPDbeta2Given) - model->B3SOIPDbeta2 = 0.1; - if (!model->B3SOIPDvdsatii0Given) - model->B3SOIPDvdsatii0 = 0.9; - if (!model->B3SOIPDtiiGiven) - model->B3SOIPDtii = 0.0; - if (!model->B3SOIPDliiGiven) - model->B3SOIPDlii = 0.0; - if (!model->B3SOIPDsii0Given) - model->B3SOIPDsii0 = 0.5; - if (!model->B3SOIPDsii1Given) - model->B3SOIPDsii1 = 0.1; - if (!model->B3SOIPDsii2Given) - model->B3SOIPDsii2 = 0.0; - if (!model->B3SOIPDsiidGiven) - model->B3SOIPDsiid = 0.0; - if (!model->B3SOIPDfbjtiiGiven) - model->B3SOIPDfbjtii = 0.0; - if (!model->B3SOIPDesatiiGiven) - model->B3SOIPDesatii = 1e7; - if (!model->B3SOIPDlnGiven) - model->B3SOIPDln = 2e-6; - if (!model->B3SOIPDvrec0Given) - model->B3SOIPDvrec0 = 0; - if (!model->B3SOIPDvtun0Given) - model->B3SOIPDvtun0 = 0; - if (!model->B3SOIPDnbjtGiven) - model->B3SOIPDnbjt = 1.0; - if (!model->B3SOIPDlbjt0Given) - model->B3SOIPDlbjt0 = 0.20e-6; - if (!model->B3SOIPDldif0Given) - model->B3SOIPDldif0 = 1.0; - if (!model->B3SOIPDvabjtGiven) - model->B3SOIPDvabjt = 10.0; - if (!model->B3SOIPDaelyGiven) - model->B3SOIPDaely = 0; - if (!model->B3SOIPDahliGiven) - model->B3SOIPDahli = 0; - if (!model->B3SOIPDrbodyGiven) - model->B3SOIPDrbody = 0.0; - if (!model->B3SOIPDrbshGiven) - model->B3SOIPDrbsh = 0.0; - if (!model->B3SOIPDntrecfGiven) - model->B3SOIPDntrecf = 0.0; - if (!model->B3SOIPDntrecrGiven) - model->B3SOIPDntrecr = 0.0; - if (!model->B3SOIPDndifGiven) - model->B3SOIPDndif = -1.0; - if (!model->B3SOIPDdlcbGiven) - model->B3SOIPDdlcb = 0.0; - if (!model->B3SOIPDfbodyGiven) - model->B3SOIPDfbody = 1.0; - if (!model->B3SOIPDtcjswgGiven) - model->B3SOIPDtcjswg = 0.0; - if (!model->B3SOIPDtpbswgGiven) - model->B3SOIPDtpbswg = 0.0; - if (!model->B3SOIPDacdeGiven) - model->B3SOIPDacde = 1.0; - if (!model->B3SOIPDmoinGiven) - model->B3SOIPDmoin = 15.0; - if (!model->B3SOIPDdelvtGiven) - model->B3SOIPDdelvt = 0.0; - if (!model->B3SOIPDkb1Given) - model->B3SOIPDkb1 = 1.0; - if (!model->B3SOIPDdlbgGiven) - model->B3SOIPDdlbg = 0.0; - -/* Added for binning - START */ - /* Length dependence */ - if (!model->B3SOIPDlnpeakGiven) - model->B3SOIPDlnpeak = 0.0; - if (!model->B3SOIPDlnsubGiven) - model->B3SOIPDlnsub = 0.0; - if (!model->B3SOIPDlngateGiven) - model->B3SOIPDlngate = 0.0; - if (!model->B3SOIPDlvth0Given) - model->B3SOIPDlvth0 = 0.0; - if (!model->B3SOIPDlk1Given) - model->B3SOIPDlk1 = 0.0; - if (!model->B3SOIPDlk1w1Given) - model->B3SOIPDlk1w1 = 0.0; - if (!model->B3SOIPDlk1w2Given) - model->B3SOIPDlk1w2 = 0.0; - if (!model->B3SOIPDlk2Given) - model->B3SOIPDlk2 = 0.0; - if (!model->B3SOIPDlk3Given) - model->B3SOIPDlk3 = 0.0; - if (!model->B3SOIPDlk3bGiven) - model->B3SOIPDlk3b = 0.0; - if (!model->B3SOIPDlkb1Given) - model->B3SOIPDlkb1 = 0.0; - if (!model->B3SOIPDlw0Given) - model->B3SOIPDlw0 = 0.0; - if (!model->B3SOIPDlnlxGiven) - model->B3SOIPDlnlx = 0.0; - if (!model->B3SOIPDldvt0Given) - model->B3SOIPDldvt0 = 0.0; - if (!model->B3SOIPDldvt1Given) - model->B3SOIPDldvt1 = 0.0; - if (!model->B3SOIPDldvt2Given) - model->B3SOIPDldvt2 = 0.0; - if (!model->B3SOIPDldvt0wGiven) - model->B3SOIPDldvt0w = 0.0; - if (!model->B3SOIPDldvt1wGiven) - model->B3SOIPDldvt1w = 0.0; - if (!model->B3SOIPDldvt2wGiven) - model->B3SOIPDldvt2w = 0.0; - if (!model->B3SOIPDlu0Given) - model->B3SOIPDlu0 = 0.0; - if (!model->B3SOIPDluaGiven) - model->B3SOIPDlua = 0.0; - if (!model->B3SOIPDlubGiven) - model->B3SOIPDlub = 0.0; - if (!model->B3SOIPDlucGiven) - model->B3SOIPDluc = 0.0; - if (!model->B3SOIPDlvsatGiven) - model->B3SOIPDlvsat = 0.0; - if (!model->B3SOIPDla0Given) - model->B3SOIPDla0 = 0.0; - if (!model->B3SOIPDlagsGiven) - model->B3SOIPDlags = 0.0; - if (!model->B3SOIPDlb0Given) - model->B3SOIPDlb0 = 0.0; - if (!model->B3SOIPDlb1Given) - model->B3SOIPDlb1 = 0.0; - if (!model->B3SOIPDlketaGiven) - model->B3SOIPDlketa = 0.0; - if (!model->B3SOIPDlketasGiven) - model->B3SOIPDlketas = 0.0; - if (!model->B3SOIPDla1Given) - model->B3SOIPDla1 = 0.0; - if (!model->B3SOIPDla2Given) - model->B3SOIPDla2 = 0.0; - if (!model->B3SOIPDlrdswGiven) - model->B3SOIPDlrdsw = 0.0; - if (!model->B3SOIPDlprwbGiven) - model->B3SOIPDlprwb = 0.0; - if (!model->B3SOIPDlprwgGiven) - model->B3SOIPDlprwg = 0.0; - if (!model->B3SOIPDlwrGiven) - model->B3SOIPDlwr = 0.0; - if (!model->B3SOIPDlnfactorGiven) - model->B3SOIPDlnfactor = 0.0; - if (!model->B3SOIPDldwgGiven) - model->B3SOIPDldwg = 0.0; - if (!model->B3SOIPDldwbGiven) - model->B3SOIPDldwb = 0.0; - if (!model->B3SOIPDlvoffGiven) - model->B3SOIPDlvoff = 0.0; - if (!model->B3SOIPDleta0Given) - model->B3SOIPDleta0 = 0.0; - if (!model->B3SOIPDletabGiven) - model->B3SOIPDletab = 0.0; - if (!model->B3SOIPDldsubGiven) - model->B3SOIPDldsub = 0.0; - if (!model->B3SOIPDlcitGiven) - model->B3SOIPDlcit = 0.0; - if (!model->B3SOIPDlcdscGiven) - model->B3SOIPDlcdsc = 0.0; - if (!model->B3SOIPDlcdscbGiven) - model->B3SOIPDlcdscb = 0.0; - if (!model->B3SOIPDlcdscdGiven) - model->B3SOIPDlcdscd = 0.0; - if (!model->B3SOIPDlpclmGiven) - model->B3SOIPDlpclm = 0.0; - if (!model->B3SOIPDlpdibl1Given) - model->B3SOIPDlpdibl1 = 0.0; - if (!model->B3SOIPDlpdibl2Given) - model->B3SOIPDlpdibl2 = 0.0; - if (!model->B3SOIPDlpdiblbGiven) - model->B3SOIPDlpdiblb = 0.0; - if (!model->B3SOIPDldroutGiven) - model->B3SOIPDldrout = 0.0; - if (!model->B3SOIPDlpvagGiven) - model->B3SOIPDlpvag = 0.0; - if (!model->B3SOIPDldeltaGiven) - model->B3SOIPDldelta = 0.0; - if (!model->B3SOIPDlalpha0Given) - model->B3SOIPDlalpha0 = 0.0; - if (!model->B3SOIPDlfbjtiiGiven) - model->B3SOIPDlfbjtii = 0.0; - if (!model->B3SOIPDlbeta0Given) - model->B3SOIPDlbeta0 = 0.0; - if (!model->B3SOIPDlbeta1Given) - model->B3SOIPDlbeta1 = 0.0; - if (!model->B3SOIPDlbeta2Given) - model->B3SOIPDlbeta2 = 0.0; - if (!model->B3SOIPDlvdsatii0Given) - model->B3SOIPDlvdsatii0 = 0.0; - if (!model->B3SOIPDlliiGiven) - model->B3SOIPDllii = 0.0; - if (!model->B3SOIPDlesatiiGiven) - model->B3SOIPDlesatii = 0.0; - if (!model->B3SOIPDlsii0Given) - model->B3SOIPDlsii0 = 0.0; - if (!model->B3SOIPDlsii1Given) - model->B3SOIPDlsii1 = 0.0; - if (!model->B3SOIPDlsii2Given) - model->B3SOIPDlsii2 = 0.0; - if (!model->B3SOIPDlsiidGiven) - model->B3SOIPDlsiid = 0.0; - if (!model->B3SOIPDlagidlGiven) - model->B3SOIPDlagidl = 0.0; - if (!model->B3SOIPDlbgidlGiven) - model->B3SOIPDlbgidl = 0.0; - if (!model->B3SOIPDlngidlGiven) - model->B3SOIPDlngidl = 0.0; - if (!model->B3SOIPDlntunGiven) - model->B3SOIPDlntun = 0.0; - if (!model->B3SOIPDlndiodeGiven) - model->B3SOIPDlndiode = 0.0; - if (!model->B3SOIPDlnrecf0Given) - model->B3SOIPDlnrecf0 = 0.0; - if (!model->B3SOIPDlnrecr0Given) - model->B3SOIPDlnrecr0 = 0.0; - if (!model->B3SOIPDlisbjtGiven) - model->B3SOIPDlisbjt = 0.0; - if (!model->B3SOIPDlisdifGiven) - model->B3SOIPDlisdif = 0.0; - if (!model->B3SOIPDlisrecGiven) - model->B3SOIPDlisrec = 0.0; - if (!model->B3SOIPDlistunGiven) - model->B3SOIPDlistun = 0.0; - if (!model->B3SOIPDlvrec0Given) - model->B3SOIPDlvrec0 = 0.0; - if (!model->B3SOIPDlvtun0Given) - model->B3SOIPDlvtun0 = 0.0; - if (!model->B3SOIPDlnbjtGiven) - model->B3SOIPDlnbjt = 0.0; - if (!model->B3SOIPDllbjt0Given) - model->B3SOIPDllbjt0 = 0.0; - if (!model->B3SOIPDlvabjtGiven) - model->B3SOIPDlvabjt = 0.0; - if (!model->B3SOIPDlaelyGiven) - model->B3SOIPDlaely = 0.0; - if (!model->B3SOIPDlahliGiven) - model->B3SOIPDlahli = 0.0; - /* CV Model */ - if (!model->B3SOIPDlvsdfbGiven) - model->B3SOIPDlvsdfb = 0.0; - if (!model->B3SOIPDlvsdthGiven) - model->B3SOIPDlvsdth = 0.0; - if (!model->B3SOIPDldelvtGiven) - model->B3SOIPDldelvt = 0.0; - if (!model->B3SOIPDlacdeGiven) - model->B3SOIPDlacde = 0.0; - if (!model->B3SOIPDlmoinGiven) - model->B3SOIPDlmoin = 0.0; - - /* Width dependence */ - if (!model->B3SOIPDwnpeakGiven) - model->B3SOIPDwnpeak = 0.0; - if (!model->B3SOIPDwnsubGiven) - model->B3SOIPDwnsub = 0.0; - if (!model->B3SOIPDwngateGiven) - model->B3SOIPDwngate = 0.0; - if (!model->B3SOIPDwvth0Given) - model->B3SOIPDwvth0 = 0.0; - if (!model->B3SOIPDwk1Given) - model->B3SOIPDwk1 = 0.0; - if (!model->B3SOIPDwk1w1Given) - model->B3SOIPDwk1w1 = 0.0; - if (!model->B3SOIPDwk1w2Given) - model->B3SOIPDwk1w2 = 0.0; - if (!model->B3SOIPDwk2Given) - model->B3SOIPDwk2 = 0.0; - if (!model->B3SOIPDwk3Given) - model->B3SOIPDwk3 = 0.0; - if (!model->B3SOIPDwk3bGiven) - model->B3SOIPDwk3b = 0.0; - if (!model->B3SOIPDwkb1Given) - model->B3SOIPDwkb1 = 0.0; - if (!model->B3SOIPDww0Given) - model->B3SOIPDww0 = 0.0; - if (!model->B3SOIPDwnlxGiven) - model->B3SOIPDwnlx = 0.0; - if (!model->B3SOIPDwdvt0Given) - model->B3SOIPDwdvt0 = 0.0; - if (!model->B3SOIPDwdvt1Given) - model->B3SOIPDwdvt1 = 0.0; - if (!model->B3SOIPDwdvt2Given) - model->B3SOIPDwdvt2 = 0.0; - if (!model->B3SOIPDwdvt0wGiven) - model->B3SOIPDwdvt0w = 0.0; - if (!model->B3SOIPDwdvt1wGiven) - model->B3SOIPDwdvt1w = 0.0; - if (!model->B3SOIPDwdvt2wGiven) - model->B3SOIPDwdvt2w = 0.0; - if (!model->B3SOIPDwu0Given) - model->B3SOIPDwu0 = 0.0; - if (!model->B3SOIPDwuaGiven) - model->B3SOIPDwua = 0.0; - if (!model->B3SOIPDwubGiven) - model->B3SOIPDwub = 0.0; - if (!model->B3SOIPDwucGiven) - model->B3SOIPDwuc = 0.0; - if (!model->B3SOIPDwvsatGiven) - model->B3SOIPDwvsat = 0.0; - if (!model->B3SOIPDwa0Given) - model->B3SOIPDwa0 = 0.0; - if (!model->B3SOIPDwagsGiven) - model->B3SOIPDwags = 0.0; - if (!model->B3SOIPDwb0Given) - model->B3SOIPDwb0 = 0.0; - if (!model->B3SOIPDwb1Given) - model->B3SOIPDwb1 = 0.0; - if (!model->B3SOIPDwketaGiven) - model->B3SOIPDwketa = 0.0; - if (!model->B3SOIPDwketasGiven) - model->B3SOIPDwketas = 0.0; - if (!model->B3SOIPDwa1Given) - model->B3SOIPDwa1 = 0.0; - if (!model->B3SOIPDwa2Given) - model->B3SOIPDwa2 = 0.0; - if (!model->B3SOIPDwrdswGiven) - model->B3SOIPDwrdsw = 0.0; - if (!model->B3SOIPDwprwbGiven) - model->B3SOIPDwprwb = 0.0; - if (!model->B3SOIPDwprwgGiven) - model->B3SOIPDwprwg = 0.0; - if (!model->B3SOIPDwwrGiven) - model->B3SOIPDwwr = 0.0; - if (!model->B3SOIPDwnfactorGiven) - model->B3SOIPDwnfactor = 0.0; - if (!model->B3SOIPDwdwgGiven) - model->B3SOIPDwdwg = 0.0; - if (!model->B3SOIPDwdwbGiven) - model->B3SOIPDwdwb = 0.0; - if (!model->B3SOIPDwvoffGiven) - model->B3SOIPDwvoff = 0.0; - if (!model->B3SOIPDweta0Given) - model->B3SOIPDweta0 = 0.0; - if (!model->B3SOIPDwetabGiven) - model->B3SOIPDwetab = 0.0; - if (!model->B3SOIPDwdsubGiven) - model->B3SOIPDwdsub = 0.0; - if (!model->B3SOIPDwcitGiven) - model->B3SOIPDwcit = 0.0; - if (!model->B3SOIPDwcdscGiven) - model->B3SOIPDwcdsc = 0.0; - if (!model->B3SOIPDwcdscbGiven) - model->B3SOIPDwcdscb = 0.0; - if (!model->B3SOIPDwcdscdGiven) - model->B3SOIPDwcdscd = 0.0; - if (!model->B3SOIPDwpclmGiven) - model->B3SOIPDwpclm = 0.0; - if (!model->B3SOIPDwpdibl1Given) - model->B3SOIPDwpdibl1 = 0.0; - if (!model->B3SOIPDwpdibl2Given) - model->B3SOIPDwpdibl2 = 0.0; - if (!model->B3SOIPDwpdiblbGiven) - model->B3SOIPDwpdiblb = 0.0; - if (!model->B3SOIPDwdroutGiven) - model->B3SOIPDwdrout = 0.0; - if (!model->B3SOIPDwpvagGiven) - model->B3SOIPDwpvag = 0.0; - if (!model->B3SOIPDwdeltaGiven) - model->B3SOIPDwdelta = 0.0; - if (!model->B3SOIPDwalpha0Given) - model->B3SOIPDwalpha0 = 0.0; - if (!model->B3SOIPDwfbjtiiGiven) - model->B3SOIPDwfbjtii = 0.0; - if (!model->B3SOIPDwbeta0Given) - model->B3SOIPDwbeta0 = 0.0; - if (!model->B3SOIPDwbeta1Given) - model->B3SOIPDwbeta1 = 0.0; - if (!model->B3SOIPDwbeta2Given) - model->B3SOIPDwbeta2 = 0.0; - if (!model->B3SOIPDwvdsatii0Given) - model->B3SOIPDwvdsatii0 = 0.0; - if (!model->B3SOIPDwliiGiven) - model->B3SOIPDwlii = 0.0; - if (!model->B3SOIPDwesatiiGiven) - model->B3SOIPDwesatii = 0.0; - if (!model->B3SOIPDwsii0Given) - model->B3SOIPDwsii0 = 0.0; - if (!model->B3SOIPDwsii1Given) - model->B3SOIPDwsii1 = 0.0; - if (!model->B3SOIPDwsii2Given) - model->B3SOIPDwsii2 = 0.0; - if (!model->B3SOIPDwsiidGiven) - model->B3SOIPDwsiid = 0.0; - if (!model->B3SOIPDwagidlGiven) - model->B3SOIPDwagidl = 0.0; - if (!model->B3SOIPDwbgidlGiven) - model->B3SOIPDwbgidl = 0.0; - if (!model->B3SOIPDwngidlGiven) - model->B3SOIPDwngidl = 0.0; - if (!model->B3SOIPDwntunGiven) - model->B3SOIPDwntun = 0.0; - if (!model->B3SOIPDwndiodeGiven) - model->B3SOIPDwndiode = 0.0; - if (!model->B3SOIPDwnrecf0Given) - model->B3SOIPDwnrecf0 = 0.0; - if (!model->B3SOIPDwnrecr0Given) - model->B3SOIPDwnrecr0 = 0.0; - if (!model->B3SOIPDwisbjtGiven) - model->B3SOIPDwisbjt = 0.0; - if (!model->B3SOIPDwisdifGiven) - model->B3SOIPDwisdif = 0.0; - if (!model->B3SOIPDwisrecGiven) - model->B3SOIPDwisrec = 0.0; - if (!model->B3SOIPDwistunGiven) - model->B3SOIPDwistun = 0.0; - if (!model->B3SOIPDwvrec0Given) - model->B3SOIPDwvrec0 = 0.0; - if (!model->B3SOIPDwvtun0Given) - model->B3SOIPDwvtun0 = 0.0; - if (!model->B3SOIPDwnbjtGiven) - model->B3SOIPDwnbjt = 0.0; - if (!model->B3SOIPDwlbjt0Given) - model->B3SOIPDwlbjt0 = 0.0; - if (!model->B3SOIPDwvabjtGiven) - model->B3SOIPDwvabjt = 0.0; - if (!model->B3SOIPDwaelyGiven) - model->B3SOIPDwaely = 0.0; - if (!model->B3SOIPDwahliGiven) - model->B3SOIPDwahli = 0.0; - /* CV Model */ - if (!model->B3SOIPDwvsdfbGiven) - model->B3SOIPDwvsdfb = 0.0; - if (!model->B3SOIPDwvsdthGiven) - model->B3SOIPDwvsdth = 0.0; - if (!model->B3SOIPDwdelvtGiven) - model->B3SOIPDwdelvt = 0.0; - if (!model->B3SOIPDwacdeGiven) - model->B3SOIPDwacde = 0.0; - if (!model->B3SOIPDwmoinGiven) - model->B3SOIPDwmoin = 0.0; - - /* Cross-term dependence */ - if (!model->B3SOIPDpnpeakGiven) - model->B3SOIPDpnpeak = 0.0; - if (!model->B3SOIPDpnsubGiven) - model->B3SOIPDpnsub = 0.0; - if (!model->B3SOIPDpngateGiven) - model->B3SOIPDpngate = 0.0; - if (!model->B3SOIPDpvth0Given) - model->B3SOIPDpvth0 = 0.0; - if (!model->B3SOIPDpk1Given) - model->B3SOIPDpk1 = 0.0; - if (!model->B3SOIPDpk1w1Given) - model->B3SOIPDpk1w1 = 0.0; - if (!model->B3SOIPDpk1w2Given) - model->B3SOIPDpk1w2 = 0.0; - if (!model->B3SOIPDpk2Given) - model->B3SOIPDpk2 = 0.0; - if (!model->B3SOIPDpk3Given) - model->B3SOIPDpk3 = 0.0; - if (!model->B3SOIPDpk3bGiven) - model->B3SOIPDpk3b = 0.0; - if (!model->B3SOIPDpkb1Given) - model->B3SOIPDpkb1 = 0.0; - if (!model->B3SOIPDpw0Given) - model->B3SOIPDpw0 = 0.0; - if (!model->B3SOIPDpnlxGiven) - model->B3SOIPDpnlx = 0.0; - if (!model->B3SOIPDpdvt0Given) - model->B3SOIPDpdvt0 = 0.0; - if (!model->B3SOIPDpdvt1Given) - model->B3SOIPDpdvt1 = 0.0; - if (!model->B3SOIPDpdvt2Given) - model->B3SOIPDpdvt2 = 0.0; - if (!model->B3SOIPDpdvt0wGiven) - model->B3SOIPDpdvt0w = 0.0; - if (!model->B3SOIPDpdvt1wGiven) - model->B3SOIPDpdvt1w = 0.0; - if (!model->B3SOIPDpdvt2wGiven) - model->B3SOIPDpdvt2w = 0.0; - if (!model->B3SOIPDpu0Given) - model->B3SOIPDpu0 = 0.0; - if (!model->B3SOIPDpuaGiven) - model->B3SOIPDpua = 0.0; - if (!model->B3SOIPDpubGiven) - model->B3SOIPDpub = 0.0; - if (!model->B3SOIPDpucGiven) - model->B3SOIPDpuc = 0.0; - if (!model->B3SOIPDpvsatGiven) - model->B3SOIPDpvsat = 0.0; - if (!model->B3SOIPDpa0Given) - model->B3SOIPDpa0 = 0.0; - if (!model->B3SOIPDpagsGiven) - model->B3SOIPDpags = 0.0; - if (!model->B3SOIPDpb0Given) - model->B3SOIPDpb0 = 0.0; - if (!model->B3SOIPDpb1Given) - model->B3SOIPDpb1 = 0.0; - if (!model->B3SOIPDpketaGiven) - model->B3SOIPDpketa = 0.0; - if (!model->B3SOIPDpketasGiven) - model->B3SOIPDpketas = 0.0; - if (!model->B3SOIPDpa1Given) - model->B3SOIPDpa1 = 0.0; - if (!model->B3SOIPDpa2Given) - model->B3SOIPDpa2 = 0.0; - if (!model->B3SOIPDprdswGiven) - model->B3SOIPDprdsw = 0.0; - if (!model->B3SOIPDpprwbGiven) - model->B3SOIPDpprwb = 0.0; - if (!model->B3SOIPDpprwgGiven) - model->B3SOIPDpprwg = 0.0; - if (!model->B3SOIPDpwrGiven) - model->B3SOIPDpwr = 0.0; - if (!model->B3SOIPDpnfactorGiven) - model->B3SOIPDpnfactor = 0.0; - if (!model->B3SOIPDpdwgGiven) - model->B3SOIPDpdwg = 0.0; - if (!model->B3SOIPDpdwbGiven) - model->B3SOIPDpdwb = 0.0; - if (!model->B3SOIPDpvoffGiven) - model->B3SOIPDpvoff = 0.0; - if (!model->B3SOIPDpeta0Given) - model->B3SOIPDpeta0 = 0.0; - if (!model->B3SOIPDpetabGiven) - model->B3SOIPDpetab = 0.0; - if (!model->B3SOIPDpdsubGiven) - model->B3SOIPDpdsub = 0.0; - if (!model->B3SOIPDpcitGiven) - model->B3SOIPDpcit = 0.0; - if (!model->B3SOIPDpcdscGiven) - model->B3SOIPDpcdsc = 0.0; - if (!model->B3SOIPDpcdscbGiven) - model->B3SOIPDpcdscb = 0.0; - if (!model->B3SOIPDpcdscdGiven) - model->B3SOIPDpcdscd = 0.0; - if (!model->B3SOIPDppclmGiven) - model->B3SOIPDppclm = 0.0; - if (!model->B3SOIPDppdibl1Given) - model->B3SOIPDppdibl1 = 0.0; - if (!model->B3SOIPDppdibl2Given) - model->B3SOIPDppdibl2 = 0.0; - if (!model->B3SOIPDppdiblbGiven) - model->B3SOIPDppdiblb = 0.0; - if (!model->B3SOIPDpdroutGiven) - model->B3SOIPDpdrout = 0.0; - if (!model->B3SOIPDppvagGiven) - model->B3SOIPDppvag = 0.0; - if (!model->B3SOIPDpdeltaGiven) - model->B3SOIPDpdelta = 0.0; - if (!model->B3SOIPDpalpha0Given) - model->B3SOIPDpalpha0 = 0.0; - if (!model->B3SOIPDpfbjtiiGiven) - model->B3SOIPDpfbjtii = 0.0; - if (!model->B3SOIPDpbeta0Given) - model->B3SOIPDpbeta0 = 0.0; - if (!model->B3SOIPDpbeta1Given) - model->B3SOIPDpbeta1 = 0.0; - if (!model->B3SOIPDpbeta2Given) - model->B3SOIPDpbeta2 = 0.0; - if (!model->B3SOIPDpvdsatii0Given) - model->B3SOIPDpvdsatii0 = 0.0; - if (!model->B3SOIPDpliiGiven) - model->B3SOIPDplii = 0.0; - if (!model->B3SOIPDpesatiiGiven) - model->B3SOIPDpesatii = 0.0; - if (!model->B3SOIPDpsii0Given) - model->B3SOIPDpsii0 = 0.0; - if (!model->B3SOIPDpsii1Given) - model->B3SOIPDpsii1 = 0.0; - if (!model->B3SOIPDpsii2Given) - model->B3SOIPDpsii2 = 0.0; - if (!model->B3SOIPDpsiidGiven) - model->B3SOIPDpsiid = 0.0; - if (!model->B3SOIPDpagidlGiven) - model->B3SOIPDpagidl = 0.0; - if (!model->B3SOIPDpbgidlGiven) - model->B3SOIPDpbgidl = 0.0; - if (!model->B3SOIPDpngidlGiven) - model->B3SOIPDpngidl = 0.0; - if (!model->B3SOIPDpntunGiven) - model->B3SOIPDpntun = 0.0; - if (!model->B3SOIPDpndiodeGiven) - model->B3SOIPDpndiode = 0.0; - if (!model->B3SOIPDpnrecf0Given) - model->B3SOIPDpnrecf0 = 0.0; - if (!model->B3SOIPDpnrecr0Given) - model->B3SOIPDpnrecr0 = 0.0; - if (!model->B3SOIPDpisbjtGiven) - model->B3SOIPDpisbjt = 0.0; - if (!model->B3SOIPDpisdifGiven) - model->B3SOIPDpisdif = 0.0; - if (!model->B3SOIPDpisrecGiven) - model->B3SOIPDpisrec = 0.0; - if (!model->B3SOIPDpistunGiven) - model->B3SOIPDpistun = 0.0; - if (!model->B3SOIPDpvrec0Given) - model->B3SOIPDpvrec0 = 0.0; - if (!model->B3SOIPDpvtun0Given) - model->B3SOIPDpvtun0 = 0.0; - if (!model->B3SOIPDpnbjtGiven) - model->B3SOIPDpnbjt = 0.0; - if (!model->B3SOIPDplbjt0Given) - model->B3SOIPDplbjt0 = 0.0; - if (!model->B3SOIPDpvabjtGiven) - model->B3SOIPDpvabjt = 0.0; - if (!model->B3SOIPDpaelyGiven) - model->B3SOIPDpaely = 0.0; - if (!model->B3SOIPDpahliGiven) - model->B3SOIPDpahli = 0.0; - /* CV Model */ - if (!model->B3SOIPDpvsdfbGiven) - model->B3SOIPDpvsdfb = 0.0; - if (!model->B3SOIPDpvsdthGiven) - model->B3SOIPDpvsdth = 0.0; - if (!model->B3SOIPDpdelvtGiven) - model->B3SOIPDpdelvt = 0.0; - if (!model->B3SOIPDpacdeGiven) - model->B3SOIPDpacde = 0.0; - if (!model->B3SOIPDpmoinGiven) - model->B3SOIPDpmoin = 0.0; -/* Added for binning - END */ - - if (!model->B3SOIPDcfGiven) - model->B3SOIPDcf = 2.0 * EPSOX / PI - * log(1.0 + 0.4e-6 / model->B3SOIPDtox); - if (!model->B3SOIPDcgdoGiven) - { if (model->B3SOIPDdlcGiven && (model->B3SOIPDdlc > 0.0)) - { model->B3SOIPDcgdo = model->B3SOIPDdlc * model->B3SOIPDcox - - model->B3SOIPDcgdl ; - } - else - model->B3SOIPDcgdo = 0.6 * model->B3SOIPDxj * model->B3SOIPDcox; - } - if (!model->B3SOIPDcgsoGiven) - { if (model->B3SOIPDdlcGiven && (model->B3SOIPDdlc > 0.0)) - { model->B3SOIPDcgso = model->B3SOIPDdlc * model->B3SOIPDcox - - model->B3SOIPDcgsl ; - } - else - model->B3SOIPDcgso = 0.6 * model->B3SOIPDxj * model->B3SOIPDcox; - } - - if (!model->B3SOIPDcgeoGiven) - { model->B3SOIPDcgeo = 0.0; - } - if (!model->B3SOIPDxpartGiven) - model->B3SOIPDxpart = 0.0; - if (!model->B3SOIPDsheetResistanceGiven) - model->B3SOIPDsheetResistance = 0.0; - if (!model->B3SOIPDcsdeswGiven) - model->B3SOIPDcsdesw = 0.0; - if (!model->B3SOIPDunitLengthGateSidewallJctCapGiven) - model->B3SOIPDunitLengthGateSidewallJctCap = 1e-10; - if (!model->B3SOIPDGatesidewallJctPotentialGiven) - model->B3SOIPDGatesidewallJctPotential = 0.7; - if (!model->B3SOIPDbodyJctGateSideGradingCoeffGiven) - model->B3SOIPDbodyJctGateSideGradingCoeff = 0.5; - if (!model->B3SOIPDoxideTrapDensityAGiven) - { if (model->B3SOIPDtype == NMOS) - model->B3SOIPDoxideTrapDensityA = 1e20; - else - model->B3SOIPDoxideTrapDensityA=9.9e18; - } - if (!model->B3SOIPDoxideTrapDensityBGiven) - { if (model->B3SOIPDtype == NMOS) - model->B3SOIPDoxideTrapDensityB = 5e4; - else - model->B3SOIPDoxideTrapDensityB = 2.4e3; - } - if (!model->B3SOIPDoxideTrapDensityCGiven) - { if (model->B3SOIPDtype == NMOS) - model->B3SOIPDoxideTrapDensityC = -1.4e-12; - else - model->B3SOIPDoxideTrapDensityC = 1.4e-12; - - } - if (!model->B3SOIPDemGiven) - model->B3SOIPDem = 4.1e7; /* V/m */ - if (!model->B3SOIPDefGiven) - model->B3SOIPDef = 1.0; - if (!model->B3SOIPDafGiven) - model->B3SOIPDaf = 1.0; - if (!model->B3SOIPDkfGiven) - model->B3SOIPDkf = 0.0; - if (!model->B3SOIPDnoifGiven) - model->B3SOIPDnoif = 1.0; - - /* loop through all the instances of the model */ - for (here = B3SOIPDinstances(model); here != NULL ; - here=B3SOIPDnextInstance(here)) - { - /* allocate a chunk of the state vector */ - here->B3SOIPDstates = *states; - *states += B3SOIPDnumStates; - - /* perform the parameter defaulting */ - if (!here->B3SOIPDdrainAreaGiven) - here->B3SOIPDdrainArea = 0.0; - if (!here->B3SOIPDdrainPerimeterGiven) - here->B3SOIPDdrainPerimeter = 0.0; - if (!here->B3SOIPDdrainSquaresGiven) - here->B3SOIPDdrainSquares = 1.0; - if (!here->B3SOIPDicVBSGiven) - here->B3SOIPDicVBS = 0; - if (!here->B3SOIPDicVDSGiven) - here->B3SOIPDicVDS = 0; - if (!here->B3SOIPDicVGSGiven) - here->B3SOIPDicVGS = 0; - if (!here->B3SOIPDicVESGiven) - here->B3SOIPDicVES = 0; - if (!here->B3SOIPDicVPSGiven) - here->B3SOIPDicVPS = 0; - if (!here->B3SOIPDbjtoffGiven) - here->B3SOIPDbjtoff = 0; - if (!here->B3SOIPDdebugModGiven) - here->B3SOIPDdebugMod = 0; - if (!here->B3SOIPDrth0Given) - here->B3SOIPDrth0 = model->B3SOIPDrth0; - if (!here->B3SOIPDcth0Given) - here->B3SOIPDcth0 = model->B3SOIPDcth0; - if (!here->B3SOIPDbodySquaresGiven) - here->B3SOIPDbodySquares = 1.0; - if (!here->B3SOIPDfrbodyGiven) - here->B3SOIPDfrbody = 1.0; - if (!here->B3SOIPDlGiven) - here->B3SOIPDl = 5e-6; - if (!here->B3SOIPDsourceAreaGiven) - here->B3SOIPDsourceArea = 0; - if (!here->B3SOIPDsourcePerimeterGiven) - here->B3SOIPDsourcePerimeter = 0; - if (!here->B3SOIPDsourceSquaresGiven) - here->B3SOIPDsourceSquares = 1; - if (!here->B3SOIPDwGiven) - here->B3SOIPDw = 5e-6; - - if (!here->B3SOIPDmGiven) - here->B3SOIPDm = 1; - - -/* v2.0 release */ - if (!here->B3SOIPDnbcGiven) - here->B3SOIPDnbc = 0; - if (!here->B3SOIPDnsegGiven) - here->B3SOIPDnseg = 1; - if (!here->B3SOIPDpdbcpGiven) - here->B3SOIPDpdbcp = 0; - if (!here->B3SOIPDpsbcpGiven) - here->B3SOIPDpsbcp = 0; - if (!here->B3SOIPDagbcpGiven) - here->B3SOIPDagbcp = 0; - if (!here->B3SOIPDaebcpGiven) - here->B3SOIPDaebcp = 0; - - if (!here->B3SOIPDoffGiven) - here->B3SOIPDoff = 0; - - /* process drain series resistance */ - if ((model->B3SOIPDsheetResistance > 0.0) && - (here->B3SOIPDdrainSquares > 0.0 ) && - (here->B3SOIPDdNodePrime == 0)) - { error = CKTmkVolt(ckt,&tmp,here->B3SOIPDname,"drain"); - if(error) return(error); - here->B3SOIPDdNodePrime = tmp->number; - - if (ckt->CKTcopyNodesets) { - if (CKTinst2Node(ckt,here,1,&tmpNode,&tmpName)==OK) { - if (tmpNode->nsGiven) { - tmp->nodeset=tmpNode->nodeset; - tmp->nsGiven=tmpNode->nsGiven; - } - } - } - - } - else - { here->B3SOIPDdNodePrime = here->B3SOIPDdNode; - } - - /* process source series resistance */ - if ((model->B3SOIPDsheetResistance > 0.0) && - (here->B3SOIPDsourceSquares > 0.0 ) && - (here->B3SOIPDsNodePrime == 0)) - { error = CKTmkVolt(ckt,&tmp,here->B3SOIPDname,"source"); - if(error) return(error); - here->B3SOIPDsNodePrime = tmp->number; - - if (ckt->CKTcopyNodesets) { - if (CKTinst2Node(ckt,here,3,&tmpNode,&tmpName)==OK) { - if (tmpNode->nsGiven) { - tmp->nodeset=tmpNode->nodeset; - tmp->nsGiven=tmpNode->nsGiven; - } - } - } - - } - else - { here->B3SOIPDsNodePrime = here->B3SOIPDsNode; - } - - /* process effective silicon film thickness */ - model->B3SOIPDcbox = 3.453133e-11 / model->B3SOIPDtbox; - model->B3SOIPDcsi = 1.03594e-10 / model->B3SOIPDtsi; - Cboxt = model->B3SOIPDcbox * model->B3SOIPDcsi / (model->B3SOIPDcbox + model->B3SOIPDcsi); - model->B3SOIPDqsi = Charge_q*model->B3SOIPDnpeak*1e6*model->B3SOIPDtsi; - - - here->B3SOIPDfloat = 0; - - here->B3SOIPDpNode = here->B3SOIPDpNodeExt; - here->B3SOIPDbNode = here->B3SOIPDbNodeExt; - here->B3SOIPDtempNode = here->B3SOIPDtempNodeExt; - - if (here->B3SOIPDpNode == -1) { /* floating body case -- 4-node */ - error = CKTmkVolt(ckt,&tmp,here->B3SOIPDname,"Body"); - if (error) return(error); - here->B3SOIPDbNode = tmp->number; - here->B3SOIPDpNode = 0; - here->B3SOIPDfloat = 1; - here->B3SOIPDbodyMod = 0; - } - else /* the 5th Node has been assigned */ - { - if (!here->B3SOIPDtnodeoutGiven) { /* if t-node not assigned */ - if (here->B3SOIPDbNode == -1) - { /* 5-node body tie, bNode has not been assigned */ - if ((model->B3SOIPDrbody == 0.0) && (model->B3SOIPDrbsh == 0.0)) - { /* ideal body tie, pNode is not used */ - here->B3SOIPDbNode = here->B3SOIPDpNode; - here->B3SOIPDbodyMod = 2; - } - else { /* nonideal body tie */ - error = CKTmkVolt(ckt, &tmp, here->B3SOIPDname, "Body"); - if (error) return(error); - here->B3SOIPDbNode = tmp->number; - here->B3SOIPDbodyMod = 1; - } - } - else { /* 6-node body tie, bNode has been assigned */ - if ((model->B3SOIPDrbody == 0.0) && (model->B3SOIPDrbsh == 0.0)) - { - printf("\n Warning: model parameter rbody=0!\n"); - model->B3SOIPDrbody = 1e0; - here->B3SOIPDbodyMod = 1; - } - else { /* nonideal body tie */ - here->B3SOIPDbodyMod = 1; - } - } - } - else { /* t-node assigned */ - if (here->B3SOIPDbNode == -1) - { /* 4 nodes & t-node, floating body */ - error = CKTmkVolt(ckt, &tmp, here->B3SOIPDname, "Body"); - if (error) return(error); - here->B3SOIPDbNode = tmp->number; - here->B3SOIPDtempNode = here->B3SOIPDpNode; - here->B3SOIPDpNode = 0; - here->B3SOIPDfloat = 1; - here->B3SOIPDbodyMod = 0; - } - else { /* 5 or 6 nodes & t-node, body-contact device */ - if (here->B3SOIPDtempNode == -1) { /* 5 nodes & tnode */ - if ((model->B3SOIPDrbody == 0.0) && (model->B3SOIPDrbsh == 0.0)) - { /* ideal body tie, pNode is not used */ - here->B3SOIPDtempNode = here->B3SOIPDbNode; - here->B3SOIPDbNode = here->B3SOIPDpNode; - here->B3SOIPDbodyMod = 2; - } - else { /* nonideal body tie */ - here->B3SOIPDtempNode = here->B3SOIPDbNode; - error = CKTmkVolt(ckt, &tmp, here->B3SOIPDname, "Body"); - if (error) return(error); - here->B3SOIPDbNode = tmp->number; - here->B3SOIPDbodyMod = 1; - } - } - else { /* 6 nodes & t-node */ - if ((model->B3SOIPDrbody == 0.0) && (model->B3SOIPDrbsh == 0.0)) - { - printf("\n Warning: model parameter rbody=0!\n"); - model->B3SOIPDrbody = 1e0; - here->B3SOIPDbodyMod = 1; - } - else { /* nonideal body tie */ - here->B3SOIPDbodyMod = 1; - } - } - } - } - } - - - if ((model->B3SOIPDshMod == 1) && (here->B3SOIPDrth0!=0)) - { - if (here->B3SOIPDtempNode == -1) { - error = CKTmkVolt(ckt,&tmp,here->B3SOIPDname,"Temp"); - if (error) return(error); - here->B3SOIPDtempNode = tmp->number; - } - - } else { - here->B3SOIPDtempNode = 0; - } - -/* here for debugging purpose only */ - if (here->B3SOIPDdebugMod != 0) - { - /* The real Vbs value */ - error = CKTmkVolt(ckt, &tmp, here->B3SOIPDname, "Vbs"); - if(error) return(error); - here->B3SOIPDvbsNode = tmp->number; - - error = CKTmkVolt(ckt, &tmp, here->B3SOIPDname, "Ids"); - if(error) return(error); - here->B3SOIPDidsNode = tmp->number; - - error = CKTmkVolt(ckt, &tmp, here->B3SOIPDname, "Ic"); - if(error) return(error); - here->B3SOIPDicNode = tmp->number; - - error = CKTmkVolt(ckt, &tmp, here->B3SOIPDname, "Ibs"); - if(error) return(error); - here->B3SOIPDibsNode = tmp->number; - - error = CKTmkVolt(ckt, &tmp, here->B3SOIPDname, "Ibd"); - if(error) return(error); - here->B3SOIPDibdNode = tmp->number; - - error = CKTmkVolt(ckt, &tmp, here->B3SOIPDname, "Iii"); - if(error) return(error); - here->B3SOIPDiiiNode = tmp->number; - - error = CKTmkVolt(ckt, &tmp, here->B3SOIPDname, "Ig"); - if(error) return(error); - here->B3SOIPDigNode = tmp->number; - - error = CKTmkVolt(ckt, &tmp, here->B3SOIPDname, "Gigg"); - if(error) return(error); - here->B3SOIPDgiggNode = tmp->number; - - error = CKTmkVolt(ckt, &tmp, here->B3SOIPDname, "Gigd"); - if(error) return(error); - here->B3SOIPDgigdNode = tmp->number; - - error = CKTmkVolt(ckt, &tmp, here->B3SOIPDname, "Gigb"); - if(error) return(error); - here->B3SOIPDgigbNode = tmp->number; - - error = CKTmkVolt(ckt, &tmp, here->B3SOIPDname, "Igidl"); - if(error) return(error); - here->B3SOIPDigidlNode = tmp->number; - - error = CKTmkVolt(ckt, &tmp, here->B3SOIPDname, "Itun"); - if(error) return(error); - here->B3SOIPDitunNode = tmp->number; - - error = CKTmkVolt(ckt, &tmp, here->B3SOIPDname, "Ibp"); - if(error) return(error); - here->B3SOIPDibpNode = tmp->number; - - error = CKTmkVolt(ckt, &tmp, here->B3SOIPDname, "Cbb"); - if(error) return(error); - here->B3SOIPDcbbNode = tmp->number; - - error = CKTmkVolt(ckt, &tmp, here->B3SOIPDname, "Cbd"); - if(error) return(error); - here->B3SOIPDcbdNode = tmp->number; - - error = CKTmkVolt(ckt, &tmp, here->B3SOIPDname, "Cbg"); - if(error) return(error); - here->B3SOIPDcbgNode = tmp->number; - - - error = CKTmkVolt(ckt, &tmp, here->B3SOIPDname, "Qbf"); - if(error) return(error); - here->B3SOIPDqbfNode = tmp->number; - - error = CKTmkVolt(ckt, &tmp, here->B3SOIPDname, "Qjs"); - if(error) return(error); - here->B3SOIPDqjsNode = tmp->number; - - error = CKTmkVolt(ckt, &tmp, here->B3SOIPDname, "Qjd"); - if(error) return(error); - here->B3SOIPDqjdNode = tmp->number; - - } - - /* set Sparse Matrix Pointers */ - -/* macro to make elements with built in test for out of memory */ -#define TSTALLOC(ptr,first,second) \ -do { if((here->ptr = SMPmakeElt(matrix, here->first, here->second)) == NULL){\ - return(E_NOMEM);\ -} } while(0) - - - if ((model->B3SOIPDshMod == 1) && (here->B3SOIPDrth0!=0.0)) { - TSTALLOC(B3SOIPDTemptempPtr, B3SOIPDtempNode, B3SOIPDtempNode); - TSTALLOC(B3SOIPDTempdpPtr, B3SOIPDtempNode, B3SOIPDdNodePrime); - TSTALLOC(B3SOIPDTempspPtr, B3SOIPDtempNode, B3SOIPDsNodePrime); - TSTALLOC(B3SOIPDTempgPtr, B3SOIPDtempNode, B3SOIPDgNode); - TSTALLOC(B3SOIPDTempbPtr, B3SOIPDtempNode, B3SOIPDbNode); - - TSTALLOC(B3SOIPDGtempPtr, B3SOIPDgNode, B3SOIPDtempNode); - TSTALLOC(B3SOIPDDPtempPtr, B3SOIPDdNodePrime, B3SOIPDtempNode); - TSTALLOC(B3SOIPDSPtempPtr, B3SOIPDsNodePrime, B3SOIPDtempNode); - TSTALLOC(B3SOIPDEtempPtr, B3SOIPDeNode, B3SOIPDtempNode); - TSTALLOC(B3SOIPDBtempPtr, B3SOIPDbNode, B3SOIPDtempNode); - - if (here->B3SOIPDbodyMod == 1) { - TSTALLOC(B3SOIPDPtempPtr, B3SOIPDpNode, B3SOIPDtempNode); - } - } - if (here->B3SOIPDbodyMod == 2) { - /* Don't create any Jacobian entry for pNode */ - } - else if (here->B3SOIPDbodyMod == 1) { - TSTALLOC(B3SOIPDBpPtr, B3SOIPDbNode, B3SOIPDpNode); - TSTALLOC(B3SOIPDPbPtr, B3SOIPDpNode, B3SOIPDbNode); - TSTALLOC(B3SOIPDPpPtr, B3SOIPDpNode, B3SOIPDpNode); - } - - TSTALLOC(B3SOIPDEbPtr, B3SOIPDeNode, B3SOIPDbNode); - TSTALLOC(B3SOIPDGbPtr, B3SOIPDgNode, B3SOIPDbNode); - TSTALLOC(B3SOIPDDPbPtr, B3SOIPDdNodePrime, B3SOIPDbNode); - TSTALLOC(B3SOIPDSPbPtr, B3SOIPDsNodePrime, B3SOIPDbNode); - TSTALLOC(B3SOIPDBePtr, B3SOIPDbNode, B3SOIPDeNode); - TSTALLOC(B3SOIPDBgPtr, B3SOIPDbNode, B3SOIPDgNode); - TSTALLOC(B3SOIPDBdpPtr, B3SOIPDbNode, B3SOIPDdNodePrime); - TSTALLOC(B3SOIPDBspPtr, B3SOIPDbNode, B3SOIPDsNodePrime); - TSTALLOC(B3SOIPDBbPtr, B3SOIPDbNode, B3SOIPDbNode); - - TSTALLOC(B3SOIPDEgPtr, B3SOIPDeNode, B3SOIPDgNode); - TSTALLOC(B3SOIPDEdpPtr, B3SOIPDeNode, B3SOIPDdNodePrime); - TSTALLOC(B3SOIPDEspPtr, B3SOIPDeNode, B3SOIPDsNodePrime); - TSTALLOC(B3SOIPDGePtr, B3SOIPDgNode, B3SOIPDeNode); - TSTALLOC(B3SOIPDDPePtr, B3SOIPDdNodePrime, B3SOIPDeNode); - TSTALLOC(B3SOIPDSPePtr, B3SOIPDsNodePrime, B3SOIPDeNode); - - TSTALLOC(B3SOIPDEePtr, B3SOIPDeNode, B3SOIPDeNode); - - TSTALLOC(B3SOIPDGgPtr, B3SOIPDgNode, B3SOIPDgNode); - TSTALLOC(B3SOIPDGdpPtr, B3SOIPDgNode, B3SOIPDdNodePrime); - TSTALLOC(B3SOIPDGspPtr, B3SOIPDgNode, B3SOIPDsNodePrime); - - TSTALLOC(B3SOIPDDPgPtr, B3SOIPDdNodePrime, B3SOIPDgNode); - TSTALLOC(B3SOIPDDPdpPtr, B3SOIPDdNodePrime, B3SOIPDdNodePrime); - TSTALLOC(B3SOIPDDPspPtr, B3SOIPDdNodePrime, B3SOIPDsNodePrime); - TSTALLOC(B3SOIPDDPdPtr, B3SOIPDdNodePrime, B3SOIPDdNode); - - TSTALLOC(B3SOIPDSPgPtr, B3SOIPDsNodePrime, B3SOIPDgNode); - TSTALLOC(B3SOIPDSPdpPtr, B3SOIPDsNodePrime, B3SOIPDdNodePrime); - TSTALLOC(B3SOIPDSPspPtr, B3SOIPDsNodePrime, B3SOIPDsNodePrime); - TSTALLOC(B3SOIPDSPsPtr, B3SOIPDsNodePrime, B3SOIPDsNode); - - TSTALLOC(B3SOIPDDdPtr, B3SOIPDdNode, B3SOIPDdNode); - TSTALLOC(B3SOIPDDdpPtr, B3SOIPDdNode, B3SOIPDdNodePrime); - - TSTALLOC(B3SOIPDSsPtr, B3SOIPDsNode, B3SOIPDsNode); - TSTALLOC(B3SOIPDSspPtr, B3SOIPDsNode, B3SOIPDsNodePrime); - -/* here for debugging purpose only */ - if (here->B3SOIPDdebugMod != 0) - { - TSTALLOC(B3SOIPDVbsPtr, B3SOIPDvbsNode, B3SOIPDvbsNode); - TSTALLOC(B3SOIPDIdsPtr, B3SOIPDidsNode, B3SOIPDidsNode); - TSTALLOC(B3SOIPDIcPtr, B3SOIPDicNode, B3SOIPDicNode); - TSTALLOC(B3SOIPDIbsPtr, B3SOIPDibsNode, B3SOIPDibsNode); - TSTALLOC(B3SOIPDIbdPtr, B3SOIPDibdNode, B3SOIPDibdNode); - TSTALLOC(B3SOIPDIiiPtr, B3SOIPDiiiNode, B3SOIPDiiiNode); - TSTALLOC(B3SOIPDIgPtr, B3SOIPDigNode, B3SOIPDigNode); - TSTALLOC(B3SOIPDGiggPtr, B3SOIPDgiggNode, B3SOIPDgiggNode); - TSTALLOC(B3SOIPDGigdPtr, B3SOIPDgigdNode, B3SOIPDgigdNode); - TSTALLOC(B3SOIPDGigbPtr, B3SOIPDgigbNode, B3SOIPDgigbNode); - TSTALLOC(B3SOIPDIgidlPtr, B3SOIPDigidlNode, B3SOIPDigidlNode); - TSTALLOC(B3SOIPDItunPtr, B3SOIPDitunNode, B3SOIPDitunNode); - TSTALLOC(B3SOIPDIbpPtr, B3SOIPDibpNode, B3SOIPDibpNode); - TSTALLOC(B3SOIPDCbbPtr, B3SOIPDcbbNode, B3SOIPDcbbNode); - TSTALLOC(B3SOIPDCbdPtr, B3SOIPDcbdNode, B3SOIPDcbdNode); - TSTALLOC(B3SOIPDCbgPtr, B3SOIPDcbgNode, B3SOIPDcbgNode); - TSTALLOC(B3SOIPDQbfPtr, B3SOIPDqbfNode, B3SOIPDqbfNode); - TSTALLOC(B3SOIPDQjsPtr, B3SOIPDqjsNode, B3SOIPDqjsNode); - TSTALLOC(B3SOIPDQjdPtr, B3SOIPDqjdNode, B3SOIPDqjdNode); - - } - - } - } - return(OK); -} - -int -B3SOIPDunsetup( - GENmodel *inModel, - CKTcircuit *ckt) -{ - B3SOIPDmodel *model; - B3SOIPDinstance *here; - - for (model = (B3SOIPDmodel *)inModel; model != NULL; - model = B3SOIPDnextModel(model)) - { - for (here = B3SOIPDinstances(model); here != NULL; - here=B3SOIPDnextInstance(here)) - { - /* here for debugging purpose only */ - if (here->B3SOIPDqjdNode > 0) - CKTdltNNum(ckt, here->B3SOIPDqjdNode); - here->B3SOIPDqjdNode = 0; - - if (here->B3SOIPDqjsNode > 0) - CKTdltNNum(ckt, here->B3SOIPDqjsNode); - here->B3SOIPDqjsNode = 0; - - if (here->B3SOIPDqbfNode > 0) - CKTdltNNum(ckt, here->B3SOIPDqbfNode); - here->B3SOIPDqbfNode = 0; - - if (here->B3SOIPDcbgNode > 0) - CKTdltNNum(ckt, here->B3SOIPDcbgNode); - here->B3SOIPDcbgNode = 0; - - if (here->B3SOIPDcbdNode > 0) - CKTdltNNum(ckt, here->B3SOIPDcbdNode); - here->B3SOIPDcbdNode = 0; - - if (here->B3SOIPDcbbNode > 0) - CKTdltNNum(ckt, here->B3SOIPDcbbNode); - here->B3SOIPDcbbNode = 0; - - if (here->B3SOIPDibpNode > 0) - CKTdltNNum(ckt, here->B3SOIPDibpNode); - here->B3SOIPDibpNode = 0; - - if (here->B3SOIPDitunNode > 0) - CKTdltNNum(ckt, here->B3SOIPDitunNode); - here->B3SOIPDitunNode = 0; - - if (here->B3SOIPDigidlNode > 0) - CKTdltNNum(ckt, here->B3SOIPDigidlNode); - here->B3SOIPDigidlNode = 0; - - if (here->B3SOIPDgigbNode > 0) - CKTdltNNum(ckt, here->B3SOIPDgigbNode); - here->B3SOIPDgigbNode = 0; - - if (here->B3SOIPDgigdNode > 0) - CKTdltNNum(ckt, here->B3SOIPDgigdNode); - here->B3SOIPDgigdNode = 0; - - if (here->B3SOIPDgiggNode > 0) - CKTdltNNum(ckt, here->B3SOIPDgiggNode); - here->B3SOIPDgiggNode = 0; - - if (here->B3SOIPDigNode > 0) - CKTdltNNum(ckt, here->B3SOIPDigNode); - here->B3SOIPDigNode = 0; - - if (here->B3SOIPDiiiNode > 0) - CKTdltNNum(ckt, here->B3SOIPDiiiNode); - here->B3SOIPDiiiNode = 0; - - if (here->B3SOIPDibdNode > 0) - CKTdltNNum(ckt, here->B3SOIPDibdNode); - here->B3SOIPDibdNode = 0; - - if (here->B3SOIPDibsNode > 0) - CKTdltNNum(ckt, here->B3SOIPDibsNode); - here->B3SOIPDibsNode = 0; - - if (here->B3SOIPDicNode > 0) - CKTdltNNum(ckt, here->B3SOIPDicNode); - here->B3SOIPDicNode = 0; - - if (here->B3SOIPDidsNode > 0) - CKTdltNNum(ckt, here->B3SOIPDidsNode); - here->B3SOIPDidsNode = 0; - - if (here->B3SOIPDvbsNode > 0) - CKTdltNNum(ckt, here->B3SOIPDvbsNode); - here->B3SOIPDvbsNode = 0; - - - if (here->B3SOIPDtempNode > 0 && - here->B3SOIPDtempNode != here->B3SOIPDtempNodeExt && - here->B3SOIPDtempNode != here->B3SOIPDbNodeExt && - here->B3SOIPDtempNode != here->B3SOIPDpNodeExt) - CKTdltNNum(ckt, here->B3SOIPDtempNode); - here->B3SOIPDtempNode = 0; - - if (here->B3SOIPDbNode > 0 && - here->B3SOIPDbNode != here->B3SOIPDbNodeExt && - here->B3SOIPDbNode != here->B3SOIPDpNodeExt) - CKTdltNNum(ckt, here->B3SOIPDbNode); - here->B3SOIPDbNode = 0; - - here->B3SOIPDpNode = 0; - - if (here->B3SOIPDsNodePrime > 0 - && here->B3SOIPDsNodePrime != here->B3SOIPDsNode) - CKTdltNNum(ckt, here->B3SOIPDsNodePrime); - here->B3SOIPDsNodePrime = 0; - - if (here->B3SOIPDdNodePrime > 0 - && here->B3SOIPDdNodePrime != here->B3SOIPDdNode) - CKTdltNNum(ckt, here->B3SOIPDdNodePrime); - here->B3SOIPDdNodePrime = 0; - } - } - return OK; -} - diff --git a/src/spicelib/devices/bsim3soi_pd/b3soipdtemp.c b/src/spicelib/devices/bsim3soi_pd/b3soipdtemp.c deleted file mode 100644 index 2ed4cb900..000000000 --- a/src/spicelib/devices/bsim3soi_pd/b3soipdtemp.c +++ /dev/null @@ -1,994 +0,0 @@ -/********** -Copyright 1990 Regents of the University of California. All rights reserved. -Author: 1998 Samuel Fung, Dennis Sinitsky and Stephen Tang -File: b3soipdtemp.c 98/5/01 -Modified by Pin Su 99/2/15 -Modified by Pin Su 99/4/30 -Modified by Pin Su, Wei Jin 99/9/27 -Modified by Pin Su 00/3/1 -Modified by Pin Su 01/2/15 -Modified by Pin Su and Hui Wan 02/3/5 -Modified by Paolo Nenzi 2002 -**********/ - -/* - * Revision 2.2.3 02/3/5 Pin Su - * BSIMPD2.2.3 release - */ - -/* Lmin, Lmax, Wmin, Wmax */ - -#include "ngspice/ngspice.h" -#include "ngspice/smpdefs.h" -#include "ngspice/cktdefs.h" -#include "b3soipddef.h" -#include "ngspice/const.h" -#include "ngspice/sperror.h" -#include "ngspice/suffix.h" - -#define Kb 1.3806226e-23 -#define KboQ 8.617087e-5 /* Kb / q where q = 1.60219e-19 */ -#define EPSOX 3.453133e-11 -#define EPSSI 1.03594e-10 -#define PI 3.141592654 -#define Charge_q 1.60219e-19 -#define Eg300 1.115 /* energy gap at 300K */ - -#define MAX_EXPL 2.688117142e+43 -#define MIN_EXPL 3.720075976e-44 -#define EXPL_THRESHOLD 100.0 -#define DEXP(A,B) { \ - if (A > EXPL_THRESHOLD) { \ - B = MAX_EXPL*(1.0+(A)-EXPL_THRESHOLD); \ - } else if (A < -EXPL_THRESHOLD) { \ - B = MIN_EXPL; \ - } else { \ - B = exp(A); \ - } \ - } - -/* ARGSUSED */ -int -B3SOIPDtemp(GENmodel *inModel, CKTcircuit *ckt) -{ -B3SOIPDmodel *model = (B3SOIPDmodel*) inModel; -B3SOIPDinstance *here; -struct b3soipdSizeDependParam *pSizeDependParamKnot, *pLastKnot, *pParam=NULL; -double tmp, tmp1, tmp2, Eg, Eg0, ni, T0, T1, T2, T3, T4, T5, Ldrn, Wdrn; -double Temp, TempRatio, Inv_L, Inv_W, Inv_LW, Vtm0, Tnom; -double SDphi, SDgamma; -int Size_Not_Found; - -/* v2.0 release */ -double tmp3, T7; - - - /* loop through all the B3SOIPD device models */ - for (; model != NULL; model = B3SOIPDnextModel(model)) - { Temp = ckt->CKTtemp; - if (model->B3SOIPDGatesidewallJctPotential < 0.1) - model->B3SOIPDGatesidewallJctPotential = 0.1; - - struct b3soipdSizeDependParam *p = model->pSizeDependParamKnot; - while (p) { - struct b3soipdSizeDependParam *next_p = p->pNext; - FREE(p); - p = next_p; - } - model->pSizeDependParamKnot = NULL; - pLastKnot = NULL; - - Tnom = model->B3SOIPDtnom; - TempRatio = Temp / Tnom; - - model->B3SOIPDvcrit = CONSTvt0 * log(CONSTvt0 / (CONSTroot2 * 1.0e-14)); - model->B3SOIPDfactor1 = sqrt(EPSSI / EPSOX * model->B3SOIPDtox); - - Vtm0 = KboQ * Tnom; - Eg0 = 1.16 - 7.02e-4 * Tnom * Tnom / (Tnom + 1108.0); - model->B3SOIPDeg0 = Eg0; - model->B3SOIPDvtm = KboQ * Temp; - - Eg = 1.16 - 7.02e-4 * Temp * Temp / (Temp + 1108.0); - /* ni is in cm^-3 */ - ni = 1.45e10 * (Temp / 300.15) * sqrt(Temp / 300.15) - * exp(21.5565981 - Eg / (2.0 * model->B3SOIPDvtm)); - - - /* loop through all the instances of the model */ - /* MCJ: Length and Width not initialized */ - for (here = B3SOIPDinstances(model); here != NULL; - here = B3SOIPDnextInstance(here)) - { - here->B3SOIPDrbodyext = here->B3SOIPDbodySquares * - model->B3SOIPDrbsh; - pSizeDependParamKnot = model->pSizeDependParamKnot; - Size_Not_Found = 1; - while ((pSizeDependParamKnot != NULL) && Size_Not_Found) - { if ((here->B3SOIPDl == pSizeDependParamKnot->Length) - && (here->B3SOIPDw == pSizeDependParamKnot->Width) - && (here->B3SOIPDrth0 == pSizeDependParamKnot->Rth0) - && (here->B3SOIPDcth0 == pSizeDependParamKnot->Cth0)) - { Size_Not_Found = 0; - here->pParam = pSizeDependParamKnot; - pParam = here->pParam; /* v2.2.3 bug fix */ - } - else - { pLastKnot = pSizeDependParamKnot; - pSizeDependParamKnot = pSizeDependParamKnot->pNext; - } - } - - if (Size_Not_Found) - { pParam = TMALLOC(struct b3soipdSizeDependParam, 1); - if (pLastKnot == NULL) - model->pSizeDependParamKnot = pParam; - else - pLastKnot->pNext = pParam; - pParam->pNext = NULL; - here->pParam = pParam; - - Ldrn = here->B3SOIPDl; - Wdrn = here->B3SOIPDw; - pParam->Length = Ldrn; - pParam->Width = Wdrn; - pParam->Rth0 = here->B3SOIPDrth0; - pParam->Cth0 = here->B3SOIPDcth0; - - T0 = pow(Ldrn, model->B3SOIPDLln); - T1 = pow(Wdrn, model->B3SOIPDLwn); - tmp1 = model->B3SOIPDLl / T0 + model->B3SOIPDLw / T1 - + model->B3SOIPDLwl / (T0 * T1); - pParam->B3SOIPDdl = model->B3SOIPDLint + tmp1; - -/* v2.2.3 */ - tmp1 = model->B3SOIPDLlc / T0 + model->B3SOIPDLwc / T1 - + model->B3SOIPDLwlc / (T0 * T1); - pParam->B3SOIPDdlc = model->B3SOIPDdlc + tmp1; - - - T2 = pow(Ldrn, model->B3SOIPDWln); - T3 = pow(Wdrn, model->B3SOIPDWwn); - tmp2 = model->B3SOIPDWl / T2 + model->B3SOIPDWw / T3 - + model->B3SOIPDWwl / (T2 * T3); - pParam->B3SOIPDdw = model->B3SOIPDWint + tmp2; - -/* v2.2.3 */ - tmp2 = model->B3SOIPDWlc / T2 + model->B3SOIPDWwc / T3 - + model->B3SOIPDWwlc / (T2 * T3); - pParam->B3SOIPDdwc = model->B3SOIPDdwc + tmp2; - - - pParam->B3SOIPDleff = here->B3SOIPDl - 2.0 * pParam->B3SOIPDdl; - if (pParam->B3SOIPDleff <= 0.0) - { - SPfrontEnd->IFerrorf (ERR_FATAL, - "B3SOIPD: mosfet %s, model %s: Effective channel length <= 0", - model->B3SOIPDmodName, here->B3SOIPDname); - return(E_BADPARM); - } - - pParam->B3SOIPDweff = here->B3SOIPDw - here->B3SOIPDnbc * model->B3SOIPDdwbc - - (2.0 - here->B3SOIPDnbc) * pParam->B3SOIPDdw; - if (pParam->B3SOIPDweff <= 0.0) - { - SPfrontEnd->IFerrorf (ERR_FATAL, - "B3SOIPD: mosfet %s, model %s: Effective channel width <= 0", - model->B3SOIPDmodName, here->B3SOIPDname); - return(E_BADPARM); - } - - pParam->B3SOIPDwdiod = pParam->B3SOIPDweff / here->B3SOIPDnseg + here->B3SOIPDpdbcp; - pParam->B3SOIPDwdios = pParam->B3SOIPDweff / here->B3SOIPDnseg + here->B3SOIPDpsbcp; - - pParam->B3SOIPDleffCV = here->B3SOIPDl - 2.0 * pParam->B3SOIPDdlc; - if (pParam->B3SOIPDleffCV <= 0.0) - { - SPfrontEnd->IFerrorf (ERR_FATAL, - "B3SOIPD: mosfet %s, model %s: Effective channel length for C-V <= 0", - model->B3SOIPDmodName, here->B3SOIPDname); - return(E_BADPARM); - } - - pParam->B3SOIPDweffCV = here->B3SOIPDw - here->B3SOIPDnbc * model->B3SOIPDdwbc - - (2.0 - here->B3SOIPDnbc) * pParam->B3SOIPDdwc; - if (pParam->B3SOIPDweffCV <= 0.0) - { - SPfrontEnd->IFerrorf (ERR_FATAL, - "B3SOIPD: mosfet %s, model %s: Effective channel width for C-V <= 0", - model->B3SOIPDmodName, here->B3SOIPDname); - return(E_BADPARM); - } - - pParam->B3SOIPDwdiodCV = pParam->B3SOIPDweffCV / here->B3SOIPDnseg + here->B3SOIPDpdbcp; - pParam->B3SOIPDwdiosCV = pParam->B3SOIPDweffCV / here->B3SOIPDnseg + here->B3SOIPDpsbcp; - - pParam->B3SOIPDleffCVb = here->B3SOIPDl - 2.0 * pParam->B3SOIPDdlc - model->B3SOIPDdlcb; - if (pParam->B3SOIPDleffCVb <= 0.0) - { - SPfrontEnd->IFerrorf (ERR_FATAL, - "B3SOIPD: mosfet %s, model %s: Effective channel length for C-V (body) <= 0", - model->B3SOIPDmodName, here->B3SOIPDname); - return(E_BADPARM); - } - - pParam->B3SOIPDleffCVbg = pParam->B3SOIPDleffCVb + 2 * model->B3SOIPDdlbg; - if (pParam->B3SOIPDleffCVbg <= 0.0) - { - SPfrontEnd->IFerrorf (ERR_FATAL, - "B3SOIPD: mosfet %s, model %s: Effective channel length for C-V (backgate) <= 0", - model->B3SOIPDmodName, here->B3SOIPDname); - return(E_BADPARM); - } - - /* Not binned - START */ - pParam->B3SOIPDat = model->B3SOIPDat; - pParam->B3SOIPDgamma1 = model->B3SOIPDgamma1; - pParam->B3SOIPDgamma2 = model->B3SOIPDgamma2; - pParam->B3SOIPDvbx = model->B3SOIPDvbx; - pParam->B3SOIPDvbm = model->B3SOIPDvbm; - pParam->B3SOIPDxt = model->B3SOIPDxt; - pParam->B3SOIPDkt1 = model->B3SOIPDkt1; - pParam->B3SOIPDkt1l = model->B3SOIPDkt1l; - pParam->B3SOIPDkt2 = model->B3SOIPDkt2; - pParam->B3SOIPDua1 = model->B3SOIPDua1; - pParam->B3SOIPDub1 = model->B3SOIPDub1; - pParam->B3SOIPDuc1 = model->B3SOIPDuc1; - pParam->B3SOIPDute = model->B3SOIPDute; - pParam->B3SOIPDprt = model->B3SOIPDprt; - /* Not binned - END */ - - /* CV model */ - pParam->B3SOIPDcgsl = model->B3SOIPDcgsl; - pParam->B3SOIPDcgdl = model->B3SOIPDcgdl; - pParam->B3SOIPDckappa = model->B3SOIPDckappa; - pParam->B3SOIPDcf = model->B3SOIPDcf; - pParam->B3SOIPDclc = model->B3SOIPDclc; - pParam->B3SOIPDcle = model->B3SOIPDcle; - - pParam->B3SOIPDabulkCVfactor = 1.0 + pow((pParam->B3SOIPDclc / pParam->B3SOIPDleff), - pParam->B3SOIPDcle); - - /* Added for binning - START */ - if (model->B3SOIPDbinUnit == 1) - { Inv_L = 1.0e-6 / pParam->B3SOIPDleff; - Inv_W = 1.0e-6 / pParam->B3SOIPDweff; - Inv_LW = 1.0e-12 / (pParam->B3SOIPDleff - * pParam->B3SOIPDweff); - } - else - { Inv_L = 1.0 / pParam->B3SOIPDleff; - Inv_W = 1.0 / pParam->B3SOIPDweff; - Inv_LW = 1.0 / (pParam->B3SOIPDleff - * pParam->B3SOIPDweff); - } - pParam->B3SOIPDnpeak = model->B3SOIPDnpeak - + model->B3SOIPDlnpeak * Inv_L - + model->B3SOIPDwnpeak * Inv_W - + model->B3SOIPDpnpeak * Inv_LW; - pParam->B3SOIPDnsub = model->B3SOIPDnsub - + model->B3SOIPDlnsub * Inv_L - + model->B3SOIPDwnsub * Inv_W - + model->B3SOIPDpnsub * Inv_LW; - pParam->B3SOIPDngate = model->B3SOIPDngate - + model->B3SOIPDlngate * Inv_L - + model->B3SOIPDwngate * Inv_W - + model->B3SOIPDpngate * Inv_LW; - pParam->B3SOIPDvth0 = model->B3SOIPDvth0 - + model->B3SOIPDlvth0 * Inv_L - + model->B3SOIPDwvth0 * Inv_W - + model->B3SOIPDpvth0 * Inv_LW; - pParam->B3SOIPDk1 = model->B3SOIPDk1 - + model->B3SOIPDlk1 * Inv_L - + model->B3SOIPDwk1 * Inv_W - + model->B3SOIPDpk1 * Inv_LW; - pParam->B3SOIPDk2 = model->B3SOIPDk2 - + model->B3SOIPDlk2 * Inv_L - + model->B3SOIPDwk2 * Inv_W - + model->B3SOIPDpk2 * Inv_LW; - pParam->B3SOIPDk1w1 = model->B3SOIPDk1w1 - + model->B3SOIPDlk1w1 * Inv_L - + model->B3SOIPDwk1w1 * Inv_W - + model->B3SOIPDpk1w1 * Inv_LW; - pParam->B3SOIPDk1w2 = model->B3SOIPDk1w2 - + model->B3SOIPDlk1w2 * Inv_L - + model->B3SOIPDwk1w2 * Inv_W - + model->B3SOIPDpk1w2 * Inv_LW; - pParam->B3SOIPDk3 = model->B3SOIPDk3 - + model->B3SOIPDlk3 * Inv_L - + model->B3SOIPDwk3 * Inv_W - + model->B3SOIPDpk3 * Inv_LW; - pParam->B3SOIPDk3b = model->B3SOIPDk3b - + model->B3SOIPDlk3b * Inv_L - + model->B3SOIPDwk3b * Inv_W - + model->B3SOIPDpk3b * Inv_LW; - pParam->B3SOIPDkb1 = model->B3SOIPDkb1 - + model->B3SOIPDlkb1 * Inv_L - + model->B3SOIPDwkb1 * Inv_W - + model->B3SOIPDpkb1 * Inv_LW; - pParam->B3SOIPDw0 = model->B3SOIPDw0 - + model->B3SOIPDlw0 * Inv_L - + model->B3SOIPDww0 * Inv_W - + model->B3SOIPDpw0 * Inv_LW; - pParam->B3SOIPDnlx = model->B3SOIPDnlx - + model->B3SOIPDlnlx * Inv_L - + model->B3SOIPDwnlx * Inv_W - + model->B3SOIPDpnlx * Inv_LW; - pParam->B3SOIPDdvt0 = model->B3SOIPDdvt0 - + model->B3SOIPDldvt0 * Inv_L - + model->B3SOIPDwdvt0 * Inv_W - + model->B3SOIPDpdvt0 * Inv_LW; - pParam->B3SOIPDdvt1 = model->B3SOIPDdvt1 - + model->B3SOIPDldvt1 * Inv_L - + model->B3SOIPDwdvt1 * Inv_W - + model->B3SOIPDpdvt1 * Inv_LW; - pParam->B3SOIPDdvt2 = model->B3SOIPDdvt2 - + model->B3SOIPDldvt2 * Inv_L - + model->B3SOIPDwdvt2 * Inv_W - + model->B3SOIPDpdvt2 * Inv_LW; - pParam->B3SOIPDdvt0w = model->B3SOIPDdvt0w - + model->B3SOIPDldvt0w * Inv_L - + model->B3SOIPDwdvt0w * Inv_W - + model->B3SOIPDpdvt0w * Inv_LW; - pParam->B3SOIPDdvt1w = model->B3SOIPDdvt1w - + model->B3SOIPDldvt1w * Inv_L - + model->B3SOIPDwdvt1w * Inv_W - + model->B3SOIPDpdvt1w * Inv_LW; - pParam->B3SOIPDdvt2w = model->B3SOIPDdvt2w - + model->B3SOIPDldvt2w * Inv_L - + model->B3SOIPDwdvt2w * Inv_W - + model->B3SOIPDpdvt2w * Inv_LW; - pParam->B3SOIPDu0 = model->B3SOIPDu0 - + model->B3SOIPDlu0 * Inv_L - + model->B3SOIPDwu0 * Inv_W - + model->B3SOIPDpu0 * Inv_LW; - pParam->B3SOIPDua = model->B3SOIPDua - + model->B3SOIPDlua * Inv_L - + model->B3SOIPDwua * Inv_W - + model->B3SOIPDpua * Inv_LW; - pParam->B3SOIPDub = model->B3SOIPDub - + model->B3SOIPDlub * Inv_L - + model->B3SOIPDwub * Inv_W - + model->B3SOIPDpub * Inv_LW; - pParam->B3SOIPDuc = model->B3SOIPDuc - + model->B3SOIPDluc * Inv_L - + model->B3SOIPDwuc * Inv_W - + model->B3SOIPDpuc * Inv_LW; - pParam->B3SOIPDvsat = model->B3SOIPDvsat - + model->B3SOIPDlvsat * Inv_L - + model->B3SOIPDwvsat * Inv_W - + model->B3SOIPDpvsat * Inv_LW; - pParam->B3SOIPDa0 = model->B3SOIPDa0 - + model->B3SOIPDla0 * Inv_L - + model->B3SOIPDwa0 * Inv_W - + model->B3SOIPDpa0 * Inv_LW; - pParam->B3SOIPDags = model->B3SOIPDags - + model->B3SOIPDlags * Inv_L - + model->B3SOIPDwags * Inv_W - + model->B3SOIPDpags * Inv_LW; - pParam->B3SOIPDb0 = model->B3SOIPDb0 - + model->B3SOIPDlb0 * Inv_L - + model->B3SOIPDwb0 * Inv_W - + model->B3SOIPDpb0 * Inv_LW; - pParam->B3SOIPDb1 = model->B3SOIPDb1 - + model->B3SOIPDlb1 * Inv_L - + model->B3SOIPDwb1 * Inv_W - + model->B3SOIPDpb1 * Inv_LW; - pParam->B3SOIPDketa = model->B3SOIPDketa - + model->B3SOIPDlketa * Inv_L - + model->B3SOIPDwketa * Inv_W - + model->B3SOIPDpketa * Inv_LW; - pParam->B3SOIPDketas = model->B3SOIPDketas - + model->B3SOIPDlketas * Inv_L - + model->B3SOIPDwketas * Inv_W - + model->B3SOIPDpketas * Inv_LW; - pParam->B3SOIPDa1 = model->B3SOIPDa1 - + model->B3SOIPDla1 * Inv_L - + model->B3SOIPDwa1 * Inv_W - + model->B3SOIPDpa1 * Inv_LW; - pParam->B3SOIPDa2 = model->B3SOIPDa2 - + model->B3SOIPDla2 * Inv_L - + model->B3SOIPDwa2 * Inv_W - + model->B3SOIPDpa2 * Inv_LW; - pParam->B3SOIPDrdsw = model->B3SOIPDrdsw - + model->B3SOIPDlrdsw * Inv_L - + model->B3SOIPDwrdsw * Inv_W - + model->B3SOIPDprdsw * Inv_LW; - pParam->B3SOIPDprwb = model->B3SOIPDprwb - + model->B3SOIPDlprwb * Inv_L - + model->B3SOIPDwprwb * Inv_W - + model->B3SOIPDpprwb * Inv_LW; - pParam->B3SOIPDprwg = model->B3SOIPDprwg - + model->B3SOIPDlprwg * Inv_L - + model->B3SOIPDwprwg * Inv_W - + model->B3SOIPDpprwg * Inv_LW; - pParam->B3SOIPDwr = model->B3SOIPDwr - + model->B3SOIPDlwr * Inv_L - + model->B3SOIPDwwr * Inv_W - + model->B3SOIPDpwr * Inv_LW; - pParam->B3SOIPDnfactor = model->B3SOIPDnfactor - + model->B3SOIPDlnfactor * Inv_L - + model->B3SOIPDwnfactor * Inv_W - + model->B3SOIPDpnfactor * Inv_LW; - pParam->B3SOIPDdwg = model->B3SOIPDdwg - + model->B3SOIPDldwg * Inv_L - + model->B3SOIPDwdwg * Inv_W - + model->B3SOIPDpdwg * Inv_LW; - pParam->B3SOIPDdwb = model->B3SOIPDdwb - + model->B3SOIPDldwb * Inv_L - + model->B3SOIPDwdwb * Inv_W - + model->B3SOIPDpdwb * Inv_LW; - pParam->B3SOIPDvoff = model->B3SOIPDvoff - + model->B3SOIPDlvoff * Inv_L - + model->B3SOIPDwvoff * Inv_W - + model->B3SOIPDpvoff * Inv_LW; - pParam->B3SOIPDeta0 = model->B3SOIPDeta0 - + model->B3SOIPDleta0 * Inv_L - + model->B3SOIPDweta0 * Inv_W - + model->B3SOIPDpeta0 * Inv_LW; - pParam->B3SOIPDetab = model->B3SOIPDetab - + model->B3SOIPDletab * Inv_L - + model->B3SOIPDwetab * Inv_W - + model->B3SOIPDpetab * Inv_LW; - pParam->B3SOIPDdsub = model->B3SOIPDdsub - + model->B3SOIPDldsub * Inv_L - + model->B3SOIPDwdsub * Inv_W - + model->B3SOIPDpdsub * Inv_LW; - pParam->B3SOIPDcit = model->B3SOIPDcit - + model->B3SOIPDlcit * Inv_L - + model->B3SOIPDwcit * Inv_W - + model->B3SOIPDpcit * Inv_LW; - pParam->B3SOIPDcdsc = model->B3SOIPDcdsc - + model->B3SOIPDlcdsc * Inv_L - + model->B3SOIPDwcdsc * Inv_W - + model->B3SOIPDpcdsc * Inv_LW; - pParam->B3SOIPDcdscb = model->B3SOIPDcdscb - + model->B3SOIPDlcdscb * Inv_L - + model->B3SOIPDwcdscb * Inv_W - + model->B3SOIPDpcdscb * Inv_LW; - pParam->B3SOIPDcdscd = model->B3SOIPDcdscd - + model->B3SOIPDlcdscd * Inv_L - + model->B3SOIPDwcdscd * Inv_W - + model->B3SOIPDpcdscd * Inv_LW; - pParam->B3SOIPDpclm = model->B3SOIPDpclm - + model->B3SOIPDlpclm * Inv_L - + model->B3SOIPDwpclm * Inv_W - + model->B3SOIPDppclm * Inv_LW; - pParam->B3SOIPDpdibl1 = model->B3SOIPDpdibl1 - + model->B3SOIPDlpdibl1 * Inv_L - + model->B3SOIPDwpdibl1 * Inv_W - + model->B3SOIPDppdibl1 * Inv_LW; - pParam->B3SOIPDpdibl2 = model->B3SOIPDpdibl2 - + model->B3SOIPDlpdibl2 * Inv_L - + model->B3SOIPDwpdibl2 * Inv_W - + model->B3SOIPDppdibl2 * Inv_LW; - pParam->B3SOIPDpdiblb = model->B3SOIPDpdiblb - + model->B3SOIPDlpdiblb * Inv_L - + model->B3SOIPDwpdiblb * Inv_W - + model->B3SOIPDppdiblb * Inv_LW; - pParam->B3SOIPDdrout = model->B3SOIPDdrout - + model->B3SOIPDldrout * Inv_L - + model->B3SOIPDwdrout * Inv_W - + model->B3SOIPDpdrout * Inv_LW; - pParam->B3SOIPDpvag = model->B3SOIPDpvag - + model->B3SOIPDlpvag * Inv_L - + model->B3SOIPDwpvag * Inv_W - + model->B3SOIPDppvag * Inv_LW; - pParam->B3SOIPDdelta = model->B3SOIPDdelta - + model->B3SOIPDldelta * Inv_L - + model->B3SOIPDwdelta * Inv_W - + model->B3SOIPDpdelta * Inv_LW; - pParam->B3SOIPDalpha0 = model->B3SOIPDalpha0 - + model->B3SOIPDlalpha0 * Inv_L - + model->B3SOIPDwalpha0 * Inv_W - + model->B3SOIPDpalpha0 * Inv_LW; - pParam->B3SOIPDfbjtii = model->B3SOIPDfbjtii - + model->B3SOIPDlfbjtii * Inv_L - + model->B3SOIPDwfbjtii * Inv_W - + model->B3SOIPDpfbjtii * Inv_LW; - pParam->B3SOIPDbeta0 = model->B3SOIPDbeta0 - + model->B3SOIPDlbeta0 * Inv_L - + model->B3SOIPDwbeta0 * Inv_W - + model->B3SOIPDpbeta0 * Inv_LW; - pParam->B3SOIPDbeta1 = model->B3SOIPDbeta1 - + model->B3SOIPDlbeta1 * Inv_L - + model->B3SOIPDwbeta1 * Inv_W - + model->B3SOIPDpbeta1 * Inv_LW; - pParam->B3SOIPDbeta2 = model->B3SOIPDbeta2 - + model->B3SOIPDlbeta2 * Inv_L - + model->B3SOIPDwbeta2 * Inv_W - + model->B3SOIPDpbeta2 * Inv_LW; - pParam->B3SOIPDvdsatii0 = model->B3SOIPDvdsatii0 - + model->B3SOIPDlvdsatii0 * Inv_L - + model->B3SOIPDwvdsatii0 * Inv_W - + model->B3SOIPDpvdsatii0 * Inv_LW; - pParam->B3SOIPDlii = model->B3SOIPDlii - + model->B3SOIPDllii * Inv_L - + model->B3SOIPDwlii * Inv_W - + model->B3SOIPDplii * Inv_LW; - pParam->B3SOIPDesatii = model->B3SOIPDesatii - + model->B3SOIPDlesatii * Inv_L - + model->B3SOIPDwesatii * Inv_W - + model->B3SOIPDpesatii * Inv_LW; - pParam->B3SOIPDsii0 = model->B3SOIPDsii0 - + model->B3SOIPDlsii0 * Inv_L - + model->B3SOIPDwsii0 * Inv_W - + model->B3SOIPDpsii0 * Inv_LW; - pParam->B3SOIPDsii1 = model->B3SOIPDsii1 - + model->B3SOIPDlsii1 * Inv_L - + model->B3SOIPDwsii1 * Inv_W - + model->B3SOIPDpsii1 * Inv_LW; - pParam->B3SOIPDsii2 = model->B3SOIPDsii2 - + model->B3SOIPDlsii2 * Inv_L - + model->B3SOIPDwsii2 * Inv_W - + model->B3SOIPDpsii2 * Inv_LW; - pParam->B3SOIPDsiid = model->B3SOIPDsiid - + model->B3SOIPDlsiid * Inv_L - + model->B3SOIPDwsiid * Inv_W - + model->B3SOIPDpsiid * Inv_LW; - pParam->B3SOIPDagidl = model->B3SOIPDagidl - + model->B3SOIPDlagidl * Inv_L - + model->B3SOIPDwagidl * Inv_W - + model->B3SOIPDpagidl * Inv_LW; - pParam->B3SOIPDbgidl = model->B3SOIPDbgidl - + model->B3SOIPDlbgidl * Inv_L - + model->B3SOIPDwbgidl * Inv_W - + model->B3SOIPDpbgidl * Inv_LW; - pParam->B3SOIPDngidl = model->B3SOIPDngidl - + model->B3SOIPDlngidl * Inv_L - + model->B3SOIPDwngidl * Inv_W - + model->B3SOIPDpngidl * Inv_LW; - pParam->B3SOIPDntun = model->B3SOIPDntun - + model->B3SOIPDlntun * Inv_L - + model->B3SOIPDwntun * Inv_W - + model->B3SOIPDpntun * Inv_LW; - pParam->B3SOIPDndiode = model->B3SOIPDndiode - + model->B3SOIPDlndiode * Inv_L - + model->B3SOIPDwndiode * Inv_W - + model->B3SOIPDpndiode * Inv_LW; - pParam->B3SOIPDnrecf0 = model->B3SOIPDnrecf0 - + model->B3SOIPDlnrecf0 * Inv_L - + model->B3SOIPDwnrecf0 * Inv_W - + model->B3SOIPDpnrecf0 * Inv_LW; - pParam->B3SOIPDnrecr0 = model->B3SOIPDnrecr0 - + model->B3SOIPDlnrecr0 * Inv_L - + model->B3SOIPDwnrecr0 * Inv_W - + model->B3SOIPDpnrecr0 * Inv_LW; - pParam->B3SOIPDisbjt = model->B3SOIPDisbjt - + model->B3SOIPDlisbjt * Inv_L - + model->B3SOIPDwisbjt * Inv_W - + model->B3SOIPDpisbjt * Inv_LW; - pParam->B3SOIPDisdif = model->B3SOIPDisdif - + model->B3SOIPDlisdif * Inv_L - + model->B3SOIPDwisdif * Inv_W - + model->B3SOIPDpisdif * Inv_LW; - pParam->B3SOIPDisrec = model->B3SOIPDisrec - + model->B3SOIPDlisrec * Inv_L - + model->B3SOIPDwisrec * Inv_W - + model->B3SOIPDpisrec * Inv_LW; - pParam->B3SOIPDistun = model->B3SOIPDistun - + model->B3SOIPDlistun * Inv_L - + model->B3SOIPDwistun * Inv_W - + model->B3SOIPDpistun * Inv_LW; - pParam->B3SOIPDvrec0 = model->B3SOIPDvrec0 - + model->B3SOIPDlvrec0 * Inv_L - + model->B3SOIPDwvrec0 * Inv_W - + model->B3SOIPDpvrec0 * Inv_LW; - pParam->B3SOIPDvtun0 = model->B3SOIPDvtun0 - + model->B3SOIPDlvtun0 * Inv_L - + model->B3SOIPDwvtun0 * Inv_W - + model->B3SOIPDpvtun0 * Inv_LW; - pParam->B3SOIPDnbjt = model->B3SOIPDnbjt - + model->B3SOIPDlnbjt * Inv_L - + model->B3SOIPDwnbjt * Inv_W - + model->B3SOIPDpnbjt * Inv_LW; - pParam->B3SOIPDlbjt0 = model->B3SOIPDlbjt0 - + model->B3SOIPDllbjt0 * Inv_L - + model->B3SOIPDwlbjt0 * Inv_W - + model->B3SOIPDplbjt0 * Inv_LW; - pParam->B3SOIPDvabjt = model->B3SOIPDvabjt - + model->B3SOIPDlvabjt * Inv_L - + model->B3SOIPDwvabjt * Inv_W - + model->B3SOIPDpvabjt * Inv_LW; - pParam->B3SOIPDaely = model->B3SOIPDaely - + model->B3SOIPDlaely * Inv_L - + model->B3SOIPDwaely * Inv_W - + model->B3SOIPDpaely * Inv_LW; - pParam->B3SOIPDahli = model->B3SOIPDahli - + model->B3SOIPDlahli * Inv_L - + model->B3SOIPDwahli * Inv_W - + model->B3SOIPDpahli * Inv_LW; - /* CV model */ - pParam->B3SOIPDvsdfb = model->B3SOIPDvsdfb - + model->B3SOIPDlvsdfb * Inv_L - + model->B3SOIPDwvsdfb * Inv_W - + model->B3SOIPDpvsdfb * Inv_LW; - pParam->B3SOIPDvsdth = model->B3SOIPDvsdth - + model->B3SOIPDlvsdth * Inv_L - + model->B3SOIPDwvsdth * Inv_W - + model->B3SOIPDpvsdth * Inv_LW; - pParam->B3SOIPDdelvt = model->B3SOIPDdelvt - + model->B3SOIPDldelvt * Inv_L - + model->B3SOIPDwdelvt * Inv_W - + model->B3SOIPDpdelvt * Inv_LW; - pParam->B3SOIPDacde = model->B3SOIPDacde - + model->B3SOIPDlacde * Inv_L - + model->B3SOIPDwacde * Inv_W - + model->B3SOIPDpacde * Inv_LW; - pParam->B3SOIPDmoin = model->B3SOIPDmoin - + model->B3SOIPDlmoin * Inv_L - + model->B3SOIPDwmoin * Inv_W - + model->B3SOIPDpmoin * Inv_LW; - /* Added for binning - END */ - - T0 = (TempRatio - 1.0); - - pParam->B3SOIPDuatemp = pParam->B3SOIPDua; /* save ua, ub, and uc for b3soipdld.c */ - pParam->B3SOIPDubtemp = pParam->B3SOIPDub; - pParam->B3SOIPDuctemp = pParam->B3SOIPDuc; - pParam->B3SOIPDrds0denom = pow(pParam->B3SOIPDweff * 1E6, pParam->B3SOIPDwr); - - -/* v2.2 release */ - pParam->B3SOIPDrth = here->B3SOIPDrth0 / (pParam->B3SOIPDweff + model->B3SOIPDwth0) - * here->B3SOIPDnseg; - pParam->B3SOIPDcth = here->B3SOIPDcth0 * (pParam->B3SOIPDweff + model->B3SOIPDwth0) - / here->B3SOIPDnseg; - -/* v2.2.2 adding layout-dependent Frbody multiplier */ - pParam->B3SOIPDrbody = here->B3SOIPDfrbody *model->B3SOIPDrbody * model->B3SOIPDrhalo - / (2 * model->B3SOIPDrbody + model->B3SOIPDrhalo * pParam->B3SOIPDleff) - * pParam->B3SOIPDweff / here->B3SOIPDnseg; - - pParam->B3SOIPDoxideRatio = pow(model->B3SOIPDtoxref/model->B3SOIPDtoxqm, - model->B3SOIPDntox) /model->B3SOIPDtoxqm/model->B3SOIPDtoxqm; -/* v2.2 release */ - - - pParam->B3SOIPDua = pParam->B3SOIPDua + pParam->B3SOIPDua1 * T0; - pParam->B3SOIPDub = pParam->B3SOIPDub + pParam->B3SOIPDub1 * T0; - pParam->B3SOIPDuc = pParam->B3SOIPDuc + pParam->B3SOIPDuc1 * T0; - if (pParam->B3SOIPDu0 > 1.0) - pParam->B3SOIPDu0 = pParam->B3SOIPDu0 / 1.0e4; - - pParam->B3SOIPDu0temp = pParam->B3SOIPDu0 - * pow(TempRatio, pParam->B3SOIPDute); - pParam->B3SOIPDvsattemp = pParam->B3SOIPDvsat - pParam->B3SOIPDat - * T0; - pParam->B3SOIPDrds0 = (pParam->B3SOIPDrdsw + pParam->B3SOIPDprt * T0) - / pow(pParam->B3SOIPDweff * 1E6, pParam->B3SOIPDwr); - - if (B3SOIPDcheckModel(model, here, ckt)) - { - SPfrontEnd->IFerrorf (ERR_FATAL, "Fatal error(s) detected during B3SOIPDV3 parameter checking for %s in model %s", model->B3SOIPDmodName, here->B3SOIPDname); - return(E_BADPARM); - } - - - pParam->B3SOIPDcgdo = (model->B3SOIPDcgdo + pParam->B3SOIPDcf) - * pParam->B3SOIPDwdiodCV; - pParam->B3SOIPDcgso = (model->B3SOIPDcgso + pParam->B3SOIPDcf) - * pParam->B3SOIPDwdiosCV; - - pParam->B3SOIPDcgeo = model->B3SOIPDcgeo - * pParam->B3SOIPDleffCV; - - - if (!model->B3SOIPDnpeakGiven && model->B3SOIPDgamma1Given) - { T0 = pParam->B3SOIPDgamma1 * model->B3SOIPDcox; - pParam->B3SOIPDnpeak = 3.021E22 * T0 * T0; - } - - - T4 = Eg300 / model->B3SOIPDvtm * (TempRatio - 1.0); - T7 = model->B3SOIPDxbjt * T4 / pParam->B3SOIPDndiode; - DEXP(T7, T0); - T7 = model->B3SOIPDxdif * T4 / pParam->B3SOIPDndiode; - DEXP(T7, T1); - T7 = model->B3SOIPDxrec * T4 / pParam->B3SOIPDnrecf0; - DEXP(T7, T2); - - /* v2.2.2 bug fix */ - pParam->B3SOIPDahli0 = pParam->B3SOIPDahli * T0; - - pParam->B3SOIPDjbjt = pParam->B3SOIPDisbjt * T0; - pParam->B3SOIPDjdif = pParam->B3SOIPDisdif * T1; - pParam->B3SOIPDjrec = pParam->B3SOIPDisrec * T2; - - T7 = model->B3SOIPDxtun * (TempRatio - 1); - DEXP(T7, T0); - pParam->B3SOIPDjtun = pParam->B3SOIPDistun * T0; - - - if (pParam->B3SOIPDnsub > 0) - pParam->B3SOIPDvfbb = -model->B3SOIPDtype * model->B3SOIPDvtm * - log(pParam->B3SOIPDnpeak/ pParam->B3SOIPDnsub); - else - pParam->B3SOIPDvfbb = -model->B3SOIPDtype * model->B3SOIPDvtm * - log(-pParam->B3SOIPDnpeak* pParam->B3SOIPDnsub/ni/ni); - - if (!model->B3SOIPDvsdfbGiven) - { - if (pParam->B3SOIPDnsub > 0) - pParam->B3SOIPDvsdfb = -model->B3SOIPDtype * (model->B3SOIPDvtm*log(1e20 * - pParam->B3SOIPDnsub / ni /ni) - 0.3); - else if (pParam->B3SOIPDnsub < 0) - pParam->B3SOIPDvsdfb = -model->B3SOIPDtype * (model->B3SOIPDvtm*log(-1e20 / - pParam->B3SOIPDnsub) + 0.3); - } - - /* Phi & Gamma */ - SDphi = 2.0*model->B3SOIPDvtm*log(fabs(pParam->B3SOIPDnsub) / ni); - SDgamma = 5.753e-12 * sqrt(fabs(pParam->B3SOIPDnsub)) / model->B3SOIPDcbox; - - if (!model->B3SOIPDvsdthGiven) - { - if ( ((pParam->B3SOIPDnsub > 0) && (model->B3SOIPDtype > 0)) || - ((pParam->B3SOIPDnsub < 0) && (model->B3SOIPDtype < 0)) ) - pParam->B3SOIPDvsdth = pParam->B3SOIPDvsdfb + SDphi + - SDgamma * sqrt(SDphi); - else - pParam->B3SOIPDvsdth = pParam->B3SOIPDvsdfb - SDphi - - SDgamma * sqrt(SDphi); - } - - if (!model->B3SOIPDcsdminGiven) { - /* Cdmin */ - tmp = sqrt(2.0 * EPSSI * SDphi / (Charge_q * - fabs(pParam->B3SOIPDnsub) * 1.0e6)); - tmp1 = EPSSI / tmp; - model->B3SOIPDcsdmin = tmp1 * model->B3SOIPDcbox / - (tmp1 + model->B3SOIPDcbox); - } - - - pParam->B3SOIPDphi = 2.0 * model->B3SOIPDvtm - * log(pParam->B3SOIPDnpeak / ni); - - pParam->B3SOIPDsqrtPhi = sqrt(pParam->B3SOIPDphi); - pParam->B3SOIPDphis3 = pParam->B3SOIPDsqrtPhi * pParam->B3SOIPDphi; - - pParam->B3SOIPDXdep0 = sqrt(2.0 * EPSSI / (Charge_q - * pParam->B3SOIPDnpeak * 1.0e6)) - * pParam->B3SOIPDsqrtPhi; - pParam->B3SOIPDsqrtXdep0 = sqrt(pParam->B3SOIPDXdep0); - pParam->B3SOIPDlitl = sqrt(3.0 * model->B3SOIPDxj - * model->B3SOIPDtox); - pParam->B3SOIPDvbi = model->B3SOIPDvtm * log(1.0e20 - * pParam->B3SOIPDnpeak / (ni * ni)); - pParam->B3SOIPDcdep0 = sqrt(Charge_q * EPSSI - * pParam->B3SOIPDnpeak * 1.0e6 / 2.0 - / pParam->B3SOIPDphi); - - if (model->B3SOIPDk1Given || model->B3SOIPDk2Given) - { if (!model->B3SOIPDk1Given) - { fprintf(stdout, "Warning: k1 should be specified with k2.\n"); - pParam->B3SOIPDk1 = 0.53; - } - if (!model->B3SOIPDk2Given) - { fprintf(stdout, "Warning: k2 should be specified with k1.\n"); - pParam->B3SOIPDk2 = -0.0186; - } - if (model->B3SOIPDxtGiven) - fprintf(stdout, "Warning: xt is ignored because k1 or k2 is given.\n"); - if (model->B3SOIPDvbxGiven) - fprintf(stdout, "Warning: vbx is ignored because k1 or k2 is given.\n"); - if (model->B3SOIPDvbmGiven) - fprintf(stdout, "Warning: vbm is ignored because k1 or k2 is given.\n"); - if (model->B3SOIPDgamma1Given) - fprintf(stdout, "Warning: gamma1 is ignored because k1 or k2 is given.\n"); - if (model->B3SOIPDgamma2Given) - fprintf(stdout, "Warning: gamma2 is ignored because k1 or k2 is given.\n"); - } - else - { if (!model->B3SOIPDvbxGiven) - pParam->B3SOIPDvbx = pParam->B3SOIPDphi - 7.7348e-4 - * pParam->B3SOIPDnpeak - * pParam->B3SOIPDxt * pParam->B3SOIPDxt; - if (pParam->B3SOIPDvbx > 0.0) - pParam->B3SOIPDvbx = -pParam->B3SOIPDvbx; - if (pParam->B3SOIPDvbm > 0.0) - pParam->B3SOIPDvbm = -pParam->B3SOIPDvbm; - - if (!model->B3SOIPDgamma1Given) - pParam->B3SOIPDgamma1 = 5.753e-12 - * sqrt(pParam->B3SOIPDnpeak) - / model->B3SOIPDcox; - if (!model->B3SOIPDgamma2Given) - pParam->B3SOIPDgamma2 = 5.753e-12 - * sqrt(pParam->B3SOIPDnsub) - / model->B3SOIPDcox; - - T0 = pParam->B3SOIPDgamma1 - pParam->B3SOIPDgamma2; - T1 = sqrt(pParam->B3SOIPDphi - pParam->B3SOIPDvbx) - - pParam->B3SOIPDsqrtPhi; - T2 = sqrt(pParam->B3SOIPDphi * (pParam->B3SOIPDphi - - pParam->B3SOIPDvbm)) - pParam->B3SOIPDphi; - pParam->B3SOIPDk2 = T0 * T1 / (2.0 * T2 + pParam->B3SOIPDvbm); - pParam->B3SOIPDk1 = pParam->B3SOIPDgamma2 - 2.0 - * pParam->B3SOIPDk2 * sqrt(pParam->B3SOIPDphi - - pParam->B3SOIPDvbm); - } - - if (pParam->B3SOIPDk2 < 0.0) - { T0 = 0.5 * pParam->B3SOIPDk1 / pParam->B3SOIPDk2; - pParam->B3SOIPDvbsc = 0.9 * (pParam->B3SOIPDphi - T0 * T0); - if (pParam->B3SOIPDvbsc > -3.0) - pParam->B3SOIPDvbsc = -3.0; - else if (pParam->B3SOIPDvbsc < -30.0) - pParam->B3SOIPDvbsc = -30.0; - } - else - { pParam->B3SOIPDvbsc = -30.0; - } - if (pParam->B3SOIPDvbsc > pParam->B3SOIPDvbm) - pParam->B3SOIPDvbsc = pParam->B3SOIPDvbm; - - if ((T0 = pParam->B3SOIPDweff + pParam->B3SOIPDk1w2) < 1e-8) - T0 = 1e-8; - pParam->B3SOIPDk1eff = pParam->B3SOIPDk1 * (1 + pParam->B3SOIPDk1w1/T0); - - if (model->B3SOIPDvth0Given) - { pParam->B3SOIPDvfb = model->B3SOIPDtype * pParam->B3SOIPDvth0 - - pParam->B3SOIPDphi - pParam->B3SOIPDk1eff - * pParam->B3SOIPDsqrtPhi; - } - else - { pParam->B3SOIPDvfb = -1.0; - pParam->B3SOIPDvth0 = model->B3SOIPDtype * (pParam->B3SOIPDvfb - + pParam->B3SOIPDphi + pParam->B3SOIPDk1eff - * pParam->B3SOIPDsqrtPhi); - } - T1 = sqrt(EPSSI / EPSOX * model->B3SOIPDtox - * pParam->B3SOIPDXdep0); - T0 = exp(-0.5 * pParam->B3SOIPDdsub * pParam->B3SOIPDleff / T1); - pParam->B3SOIPDtheta0vb0 = (T0 + 2.0 * T0 * T0); - - T0 = exp(-0.5 * pParam->B3SOIPDdrout * pParam->B3SOIPDleff / T1); - T2 = (T0 + 2.0 * T0 * T0); - pParam->B3SOIPDthetaRout = pParam->B3SOIPDpdibl1 * T2 - + pParam->B3SOIPDpdibl2; - } - - here->B3SOIPDcsbox = model->B3SOIPDcbox*here->B3SOIPDsourceArea; - here->B3SOIPDcsmin = model->B3SOIPDcsdmin*here->B3SOIPDsourceArea; - here->B3SOIPDcdbox = model->B3SOIPDcbox*here->B3SOIPDdrainArea; - here->B3SOIPDcdmin = model->B3SOIPDcsdmin*here->B3SOIPDdrainArea; - - if ( ((pParam->B3SOIPDnsub > 0) && (model->B3SOIPDtype > 0)) || - ((pParam->B3SOIPDnsub < 0) && (model->B3SOIPDtype < 0)) ) - { - T0 = pParam->B3SOIPDvsdth - pParam->B3SOIPDvsdfb; - pParam->B3SOIPDsdt1 = pParam->B3SOIPDvsdfb + model->B3SOIPDasd * T0; - T1 = here->B3SOIPDcsbox - here->B3SOIPDcsmin; - T2 = T1 / T0 / T0; - pParam->B3SOIPDst2 = T2 / model->B3SOIPDasd; - pParam->B3SOIPDst3 = T2 /( 1 - model->B3SOIPDasd); - here->B3SOIPDst4 = T0 * T1 * (1 + model->B3SOIPDasd) / 3 - - here->B3SOIPDcsmin * pParam->B3SOIPDvsdfb; - - T1 = here->B3SOIPDcdbox - here->B3SOIPDcdmin; - T2 = T1 / T0 / T0; - pParam->B3SOIPDdt2 = T2 / model->B3SOIPDasd; - pParam->B3SOIPDdt3 = T2 /( 1 - model->B3SOIPDasd); - here->B3SOIPDdt4 = T0 * T1 * (1 + model->B3SOIPDasd) / 3 - - here->B3SOIPDcdmin * pParam->B3SOIPDvsdfb; - } else - { - T0 = pParam->B3SOIPDvsdfb - pParam->B3SOIPDvsdth; - pParam->B3SOIPDsdt1 = pParam->B3SOIPDvsdth + model->B3SOIPDasd * T0; - T1 = here->B3SOIPDcsmin - here->B3SOIPDcsbox; - T2 = T1 / T0 / T0; - pParam->B3SOIPDst2 = T2 / model->B3SOIPDasd; - pParam->B3SOIPDst3 = T2 /( 1 - model->B3SOIPDasd); - here->B3SOIPDst4 = T0 * T1 * (1 + model->B3SOIPDasd) / 3 - - here->B3SOIPDcsbox * pParam->B3SOIPDvsdth; - - T1 = here->B3SOIPDcdmin - here->B3SOIPDcdbox; - T2 = T1 / T0 / T0; - pParam->B3SOIPDdt2 = T2 / model->B3SOIPDasd; - pParam->B3SOIPDdt3 = T2 /( 1 - model->B3SOIPDasd); - here->B3SOIPDdt4 = T0 * T1 * (1 + model->B3SOIPDasd) / 3 - - here->B3SOIPDcdbox * pParam->B3SOIPDvsdth; - } - - /* v2.2.2 bug fix */ - T0 = model->B3SOIPDcsdesw * log(1 + model->B3SOIPDtsi / - model->B3SOIPDtbox); - T1 = here->B3SOIPDsourcePerimeter - here->B3SOIPDw; - if (T1 > 0.0) - here->B3SOIPDcsesw = T0 * T1; - else - here->B3SOIPDcsesw = 0.0; - T1 = here->B3SOIPDdrainPerimeter - here->B3SOIPDw; - if (T1 > 0.0) - here->B3SOIPDcdesw = T0 * T1; - else - here->B3SOIPDcdesw = 0.0; - - - here->B3SOIPDphi = pParam->B3SOIPDphi; - /* process source/drain series resistance */ - here->B3SOIPDdrainConductance = model->B3SOIPDsheetResistance - * here->B3SOIPDdrainSquares; - if (here->B3SOIPDdrainConductance > 0.0) - here->B3SOIPDdrainConductance = 1.0 - / here->B3SOIPDdrainConductance; - else - here->B3SOIPDdrainConductance = 0.0; - - here->B3SOIPDsourceConductance = model->B3SOIPDsheetResistance - * here->B3SOIPDsourceSquares; - if (here->B3SOIPDsourceConductance > 0.0) - here->B3SOIPDsourceConductance = 1.0 - / here->B3SOIPDsourceConductance; - else - here->B3SOIPDsourceConductance = 0.0; - here->B3SOIPDcgso = pParam->B3SOIPDcgso; - here->B3SOIPDcgdo = pParam->B3SOIPDcgdo; - - -/* v2.0 release */ - if (model->B3SOIPDln < 1e-15) model->B3SOIPDln = 1e-15; - T0 = -0.5 * pParam->B3SOIPDleff * pParam->B3SOIPDleff / model->B3SOIPDln / model->B3SOIPDln; - DEXP(T0,T1); - pParam->B3SOIPDarfabjt = T1; - - T0 = pParam->B3SOIPDlbjt0 * (1.0 / pParam->B3SOIPDleff + 1.0 / model->B3SOIPDln); - pParam->B3SOIPDlratio = pow(T0,pParam->B3SOIPDnbjt); - pParam->B3SOIPDlratiodif = 1.0 + model->B3SOIPDldif0 * pow(T0,model->B3SOIPDndif); - - if ((pParam->B3SOIPDvearly = pParam->B3SOIPDvabjt + pParam->B3SOIPDaely * pParam->B3SOIPDleff) < 1) - pParam->B3SOIPDvearly = 1; - - /* vfbzb calculation for capMod 3 */ - tmp = sqrt(pParam->B3SOIPDXdep0); - tmp1 = pParam->B3SOIPDvbi - pParam->B3SOIPDphi; - tmp2 = model->B3SOIPDfactor1 * tmp; - - T0 = -0.5 * pParam->B3SOIPDdvt1w * pParam->B3SOIPDweff - * pParam->B3SOIPDleff / tmp2; - if (T0 > -EXPL_THRESHOLD) - { T1 = exp(T0); - T2 = T1 * (1.0 + 2.0 * T1); - } - else - { T1 = MIN_EXPL; - T2 = T1 * (1.0 + 2.0 * T1); - } - T0 = pParam->B3SOIPDdvt0w * T2; - T2 = T0 * tmp1; - - T0 = -0.5 * pParam->B3SOIPDdvt1 * pParam->B3SOIPDleff / tmp2; - if (T0 > -EXPL_THRESHOLD) - { T1 = exp(T0); - T3 = T1 * (1.0 + 2.0 * T1); - } - else - { T1 = MIN_EXPL; - T3 = T1 * (1.0 + 2.0 * T1); - } - T3 = pParam->B3SOIPDdvt0 * T3 * tmp1; - -/* v2.2.3 */ - T4 = (model->B3SOIPDtox - model->B3SOIPDdtoxcv) * pParam->B3SOIPDphi - / (pParam->B3SOIPDweff + pParam->B3SOIPDw0); - - T0 = sqrt(1.0 + pParam->B3SOIPDnlx / pParam->B3SOIPDleff); - T5 = pParam->B3SOIPDk1eff * (T0 - 1.0) * pParam->B3SOIPDsqrtPhi - + (pParam->B3SOIPDkt1 + pParam->B3SOIPDkt1l / pParam->B3SOIPDleff) - * (TempRatio - 1.0); - - tmp3 = model->B3SOIPDtype * pParam->B3SOIPDvth0 - - T2 - T3 + pParam->B3SOIPDk3 * T4 + T5; - pParam->B3SOIPDvfbzb = tmp3 - pParam->B3SOIPDphi - pParam->B3SOIPDk1eff - * pParam->B3SOIPDsqrtPhi; - /* End of vfbzb */ - - pParam->B3SOIPDldeb = sqrt(EPSSI * Vtm0 / (Charge_q * pParam->B3SOIPDnpeak * 1.0e6)) / 3.0; - pParam->B3SOIPDacde = pParam->B3SOIPDacde * pow((pParam->B3SOIPDnpeak / 2.0e16), -0.25); - } - } - return(OK); -} - diff --git a/src/spicelib/devices/bsim3soi_pd/b3soipdtrunc.c b/src/spicelib/devices/bsim3soi_pd/b3soipdtrunc.c deleted file mode 100644 index 2c90823da..000000000 --- a/src/spicelib/devices/bsim3soi_pd/b3soipdtrunc.c +++ /dev/null @@ -1,49 +0,0 @@ -/********** -Copyright 1990 Regents of the University of California. All rights reserved. -Author: 1998 Samuel Fung, Dennis Sinitsky and Stephen Tang -File: b3soipdtrunc.c 98/5/01 -Modified by Paolo Nenzi 2002 -**********/ - -/* - * Revision 2.2.3 02/3/5 Pin Su - * BSIMPD2.2.3 release - */ - -#include "ngspice/ngspice.h" -#include "ngspice/cktdefs.h" -#include "b3soipddef.h" -#include "ngspice/sperror.h" -#include "ngspice/suffix.h" - - -int -B3SOIPDtrunc(GENmodel *inModel, CKTcircuit *ckt, double *timeStep) -{ -B3SOIPDmodel *model = (B3SOIPDmodel*)inModel; -B3SOIPDinstance *here; - -#ifdef STEPDEBUG - double debugtemp; -#endif /* STEPDEBUG */ - - for (; model != NULL; model = B3SOIPDnextModel(model)) - { for (here = B3SOIPDinstances(model); here != NULL; - here = B3SOIPDnextInstance(here)) - { -#ifdef STEPDEBUG - debugtemp = *timeStep; -#endif /* STEPDEBUG */ - CKTterr(here->B3SOIPDqb,ckt,timeStep); - CKTterr(here->B3SOIPDqg,ckt,timeStep); - CKTterr(here->B3SOIPDqd,ckt,timeStep); -#ifdef STEPDEBUG - if(debugtemp != *timeStep) - { printf("device %s reduces step from %g to %g\n", - here->B3SOIPDname,debugtemp,*timeStep); - } -#endif /* STEPDEBUG */ - } - } - return(OK); -} diff --git a/src/spicelib/devices/bsim3v0/Makefile.am b/src/spicelib/devices/bsim3v0/Makefile.am deleted file mode 100644 index 6c5154726..000000000 --- a/src/spicelib/devices/bsim3v0/Makefile.am +++ /dev/null @@ -1,31 +0,0 @@ -## Process this file with automake to produce Makefile.in - -noinst_LTLIBRARIES = libbsim3v0.la - -libbsim3v0_la_SOURCES = \ - b3v0.c \ - b3v0acld.c \ - b3v0ask.c \ - b3v0cvtest.c \ - b3v0getic.c \ - b3v0ld.c \ - b3v0mask.c \ - b3v0mpar.c \ - b3v0noi.c \ - b3v0par.c \ - b3v0pzld.c \ - b3v0set.c \ - b3v0temp.c \ - b3v0trunc.c \ - bsim3v0def.h \ - bsim3v0ext.h \ - bsim3v0init.c \ - bsim3v0init.h \ - bsim3v0itf.h - - - -AM_CPPFLAGS = @AM_CPPFLAGS@ -I$(top_srcdir)/src/include -AM_CFLAGS = $(STATIC) - -MAINTAINERCLEANFILES = Makefile.in diff --git a/src/spicelib/devices/bsim3v0/b3v0.c b/src/spicelib/devices/bsim3v0/b3v0.c deleted file mode 100644 index bbee570df..000000000 --- a/src/spicelib/devices/bsim3v0/b3v0.c +++ /dev/null @@ -1,433 +0,0 @@ -/********** -Copyright 1990 Regents of the University of California. All rights reserved. -Author: 1995 Min-Chie Jeng and Mansun Chan. -File: b3.c -**********/ - -#include "ngspice/ngspice.h" -#include "ngspice/devdefs.h" -#include "bsim3v0def.h" -#include "ngspice/suffix.h" - -IFparm BSIM3v0pTable[] = { /* parameters */ -IOP( "l", BSIM3v0_L, IF_REAL , "Length"), -IOP( "w", BSIM3v0_W, IF_REAL , "Width"), -IOP( "m", BSIM3v0_M, IF_REAL , "Parallel multiplier"), -IOP( "ad", BSIM3v0_AD, IF_REAL , "Drain area"), -IOP( "as", BSIM3v0_AS, IF_REAL , "Source area"), -IOP( "pd", BSIM3v0_PD, IF_REAL , "Drain perimeter"), -IOP( "ps", BSIM3v0_PS, IF_REAL , "Source perimeter"), -IOP( "nrd", BSIM3v0_NRD, IF_REAL , "Number of squares in drain"), -IOP( "nrs", BSIM3v0_NRS, IF_REAL , "Number of squares in source"), -IOP( "off", BSIM3v0_OFF, IF_FLAG , "Device is initially off"), -IOP( "nqsmod", BSIM3v0_NQSMOD, IF_INTEGER, "Non-quasi-static model selector"), -IP( "ic", BSIM3v0_IC, IF_REALVEC , "Vector of DS,GS,BS initial voltages"), -OP( "gmbs", BSIM3v0_GMBS, IF_REAL, "Gmb"), -OP( "gm", BSIM3v0_GM, IF_REAL, "Gm"), -OP( "gds", BSIM3v0_GDS, IF_REAL, "Gds"), -OP( "vdsat", BSIM3v0_VDSAT, IF_REAL, "Vdsat"), -OP( "vth", BSIM3v0_VON, IF_REAL, "Vth"), -OP( "id", BSIM3v0_CD, IF_REAL, "Ids"), -OP( "vbs", BSIM3v0_VBS, IF_REAL, "Vbs"), -OP( "vgs", BSIM3v0_VGS, IF_REAL, "Vgs"), -OP( "vds", BSIM3v0_VDS, IF_REAL, "Vds"), -OP( "gbd", BSIM3v0_GBD, IF_REAL, "Gbd"), -OP( "gbs", BSIM3v0_GBS, IF_REAL, "Gbs"), -OP( "ibd", BSIM3v0_CBD, IF_REAL, "Ibd"), -OP( "ibs", BSIM3v0_CBS, IF_REAL, "Ibs"), -}; - -IFparm BSIM3v0mPTable[] = { /* model parameters */ -IOP( "capmod", BSIM3v0_MOD_CAPMOD, IF_INTEGER, "Capacitance model selector"), -IOP( "nqsmod", BSIM3v0_MOD_NQSMOD, IF_INTEGER, "Non-quasi-static model selector"), -IOP( "mobmod", BSIM3v0_MOD_MOBMOD, IF_INTEGER, "Mobility model selector"), -IOP( "noimod", BSIM3v0_MOD_NOIMOD, IF_INTEGER, "Noise model selector"), -IOP( "binunit", BSIM3v0_MOD_BINUNIT, IF_INTEGER, "Bin unit selector"), -IOP( "tox", BSIM3v0_MOD_TOX, IF_REAL, "Gate oxide thickness in meters"), - -IOP( "cdsc", BSIM3v0_MOD_CDSC, IF_REAL, "Drain/Source and channel coupling capacitance"), -IOP( "cdscb", BSIM3v0_MOD_CDSCB, IF_REAL, "Body-bias dependence of cdsc"), -IOP( "cdscd", BSIM3v0_MOD_CDSCD, IF_REAL, "Drain-bias dependence of cdsc"), -IOP( "cit", BSIM3v0_MOD_CIT, IF_REAL, "Interface state capacitance"), -IOP( "nfactor", BSIM3v0_MOD_NFACTOR, IF_REAL, "Subthreshold swing Coefficient"), -IOP( "xj", BSIM3v0_MOD_XJ, IF_REAL, "Junction depth in meters"), -IOP( "vsat", BSIM3v0_MOD_VSAT, IF_REAL, "Saturation velocity at tnom"), -IOP( "at", BSIM3v0_MOD_AT, IF_REAL, "Temperature coefficient of vsat"), -IOP( "a0", BSIM3v0_MOD_A0, IF_REAL, "Non-uniform depletion width effect coefficient."), -IOP( "ags", BSIM3v0_MOD_AGS, IF_REAL, "Gate bias coefficient of Abulk."), -IOP( "a1", BSIM3v0_MOD_A1, IF_REAL, "Non-saturation effect coefficient"), -IOP( "a2", BSIM3v0_MOD_A2, IF_REAL, "Non-saturation effect coefficient"), -IOP( "keta", BSIM3v0_MOD_KETA, IF_REAL, "Body-bias coefficient of non-uniform depletion width effect."), -IOP( "nsub", BSIM3v0_MOD_NSUB, IF_REAL, "Substrate doping concentration"), -IOP( "nch", BSIM3v0_MOD_NPEAK, IF_REAL, "Channel doping concentration"), -IOP( "ngate", BSIM3v0_MOD_NGATE, IF_REAL, "Poly-gate doping concentration"), -IOP( "gamma1", BSIM3v0_MOD_GAMMA1, IF_REAL, "Vth body coefficient"), -IOP( "gamma2", BSIM3v0_MOD_GAMMA2, IF_REAL, "Vth body coefficient"), -IOP( "vbx", BSIM3v0_MOD_VBX, IF_REAL, "Vth transition body Voltage"), -IOP( "vbm", BSIM3v0_MOD_VBM, IF_REAL, "Maximum body voltage"), - -IOP( "xt", BSIM3v0_MOD_XT, IF_REAL, "Doping depth"), -IOP( "k1", BSIM3v0_MOD_K1, IF_REAL, "Bulk effect coefficient 1"), -IOP( "kt1", BSIM3v0_MOD_KT1, IF_REAL, "Temperature coefficient of Vth"), -IOP( "kt1l", BSIM3v0_MOD_KT1L, IF_REAL, "Temperature coefficient of Vth"), -IOP( "kt2", BSIM3v0_MOD_KT2, IF_REAL, "Body-coefficient of kt1"), -IOP( "k2", BSIM3v0_MOD_K2, IF_REAL, "Bulk effect coefficient 2"), -IOP( "k3", BSIM3v0_MOD_K3, IF_REAL, "Narrow width effect coefficient"), -IOP( "k3b", BSIM3v0_MOD_K3B, IF_REAL, "Body effect coefficient of k3"), -IOP( "w0", BSIM3v0_MOD_W0, IF_REAL, "Narrow width effect parameter"), -IOP( "nlx", BSIM3v0_MOD_NLX, IF_REAL, "Lateral non-uniform doping effect"), -IOP( "dvt0", BSIM3v0_MOD_DVT0, IF_REAL, "Short channel effect coeff. 0"), -IOP( "dvt1", BSIM3v0_MOD_DVT1, IF_REAL, "Short channel effect coeff. 1"), -IOP( "dvt2", BSIM3v0_MOD_DVT2, IF_REAL, "Short channel effect coeff. 2"), -IOP( "dvt0w", BSIM3v0_MOD_DVT0W, IF_REAL, "Narrow Width coeff. 0"), -IOP( "dvt1w", BSIM3v0_MOD_DVT1W, IF_REAL, "Narrow Width effect coeff. 1"), -IOP( "dvt2w", BSIM3v0_MOD_DVT2W, IF_REAL, "Narrow Width effect coeff. 2"), -IOP( "drout", BSIM3v0_MOD_DROUT, IF_REAL, "DIBL coefficient of output resistance"), -IOP( "dsub", BSIM3v0_MOD_DSUB, IF_REAL, "DIBL coefficient in the subthreshold region"), -IOP( "vth0", BSIM3v0_MOD_VTH0, IF_REAL,"Threshold voltage"), -IOPR("vtho", BSIM3v0_MOD_VTH0, IF_REAL,"Threshold voltage"), -IOP( "ua", BSIM3v0_MOD_UA, IF_REAL, "Linear gate dependence of mobility"), -IOP( "ua1", BSIM3v0_MOD_UA1, IF_REAL, "Temperature coefficient of ua"), -IOP( "ub", BSIM3v0_MOD_UB, IF_REAL, "Quadratic gate dependence of mobility"), -IOP( "ub1", BSIM3v0_MOD_UB1, IF_REAL, "Temperature coefficient of ub"), -IOP( "uc", BSIM3v0_MOD_UC, IF_REAL, "Body-bias dependence of mobility"), -IOP( "uc1", BSIM3v0_MOD_UC1, IF_REAL, "Temperature coefficient of uc"), -IOP( "u0", BSIM3v0_MOD_U0, IF_REAL, "Low-field mobility at Tnom"), -IOP( "ute", BSIM3v0_MOD_UTE, IF_REAL, "Temperature coefficient of mobility"), -IOP( "voff", BSIM3v0_MOD_VOFF, IF_REAL, "Threshold voltage offset"), -IOP( "tnom", BSIM3v0_MOD_TNOM, IF_REAL, "Parameter measurement temperature"), -IOP( "cgso", BSIM3v0_MOD_CGSO, IF_REAL, "Gate-source overlap capacitance per width"), -IOP( "cgdo", BSIM3v0_MOD_CGDO, IF_REAL, "Gate-drain overlap capacitance per width"), -IOP( "cgbo", BSIM3v0_MOD_CGBO, IF_REAL, "Gate-bulk overlap capacitance per length"), -IOP( "xpart", BSIM3v0_MOD_XPART, IF_REAL, "Channel charge partitioning"), -IOP( "elm", BSIM3v0_MOD_ELM, IF_REAL, "Non-quasi-static Elmore Constant Parameter"), -IOP( "delta", BSIM3v0_MOD_DELTA, IF_REAL, "Effective Vds parameter"), -IOP( "rsh", BSIM3v0_MOD_RSH, IF_REAL, "Source-drain sheet resistance"), -IOP( "rdsw", BSIM3v0_MOD_RDSW, IF_REAL, "Source-drain resistance per width"), - -IOP( "prwg", BSIM3v0_MOD_PRWG, IF_REAL, "Gate-bias effect on parasitic resistance "), -IOP( "prwb", BSIM3v0_MOD_PRWB, IF_REAL, "Body-effect on parasitic resistance "), - -IOP( "prt", BSIM3v0_MOD_PRT, IF_REAL, "Temperature coefficient of parasitic resistance "), -IOP( "eta0", BSIM3v0_MOD_ETA0, IF_REAL, "Subthreshold region DIBL coefficient"), -IOP( "etab", BSIM3v0_MOD_ETAB, IF_REAL, "Subthreshold region DIBL coefficient"), -IOP( "pclm", BSIM3v0_MOD_PCLM, IF_REAL, "Channel length modulation Coefficient"), -IOP( "pdiblc1", BSIM3v0_MOD_PDIBL1, IF_REAL, "Drain-induced barrier lowering coefficient"), -IOP( "pdiblc2", BSIM3v0_MOD_PDIBL2, IF_REAL, "Drain-induced barrier lowering coefficient"), -IOP( "pdiblcb", BSIM3v0_MOD_PDIBLB, IF_REAL, "Body-effect on drain-induced barrier lowering"), -IOP( "pscbe1", BSIM3v0_MOD_PSCBE1, IF_REAL, "Substrate current body-effect coefficient"), -IOP( "pscbe2", BSIM3v0_MOD_PSCBE2, IF_REAL, "Substrate current body-effect coefficient"), -IOP( "pvag", BSIM3v0_MOD_PVAG, IF_REAL, "Gate dependence of output resistance parameter"), -IOP( "js", BSIM3v0_MOD_JS, IF_REAL, "Source/drain junction reverse saturation current density"), -IOP( "pb", BSIM3v0_MOD_PB, IF_REAL, "Source/drain junction built-in potential"), -IOP( "mj", BSIM3v0_MOD_MJ, IF_REAL, "Source/drain bottom junction capacitance grading coefficient"), -IOP( "pbsw", BSIM3v0_MOD_PBSW, IF_REAL, "Source/drain sidewall junction capacitance built in potential"), -IOP( "mjsw", BSIM3v0_MOD_MJSW, IF_REAL, "Source/drain sidewall junction capacitance grading coefficient"), -IOP( "cj", BSIM3v0_MOD_CJ, IF_REAL, "Source/drain bottom junction capacitance per unit area"), -IOP( "cjsw", BSIM3v0_MOD_CJSW, IF_REAL, "Source/drain sidewall junction capacitance per unit area"), - -IOP( "lint", BSIM3v0_MOD_LINT, IF_REAL, "Length reduction parameter"), -IOP( "ll", BSIM3v0_MOD_LL, IF_REAL, "Length reduction parameter"), -IOP( "lln", BSIM3v0_MOD_LLN, IF_REAL, "Length reduction parameter"), -IOP( "lw", BSIM3v0_MOD_LW, IF_REAL, "Length reduction parameter"), -IOP( "lwn", BSIM3v0_MOD_LWN, IF_REAL, "Length reduction parameter"), -IOP( "lwl", BSIM3v0_MOD_LWL, IF_REAL, "Length reduction parameter"), -IOP( "lmin", BSIM3v0_MOD_LMIN, IF_REAL, "Minimum length for the model"), -IOP( "lmax", BSIM3v0_MOD_LMAX, IF_REAL, "Maximum length for the model"), - -IOP( "wr", BSIM3v0_MOD_WR, IF_REAL, "Width dependence of rds"), -IOP( "wint", BSIM3v0_MOD_WINT, IF_REAL, "Width reduction parameter"), -IOP( "dwg", BSIM3v0_MOD_DWG, IF_REAL, "Width reduction parameter"), -IOP( "dwb", BSIM3v0_MOD_DWB, IF_REAL, "Width reduction parameter"), - -IOP( "wl", BSIM3v0_MOD_WL, IF_REAL, "Width reduction parameter"), -IOP( "wln", BSIM3v0_MOD_WLN, IF_REAL, "Width reduction parameter"), -IOP( "ww", BSIM3v0_MOD_WW, IF_REAL, "Width reduction parameter"), -IOP( "wwn", BSIM3v0_MOD_WWN, IF_REAL, "Width reduction parameter"), -IOP( "wwl", BSIM3v0_MOD_WWL, IF_REAL, "Width reduction parameter"), -IOP( "wmin", BSIM3v0_MOD_WMIN, IF_REAL, "Minimum width for the model"), -IOP( "wmax", BSIM3v0_MOD_WMAX, IF_REAL, "Maximum width for the model"), - -IOP( "b0", BSIM3v0_MOD_B0, IF_REAL, "Abulk narrow width parameter"), -IOP( "b1", BSIM3v0_MOD_B1, IF_REAL, "Abulk narrow width parameter"), - -IOP( "cgsl", BSIM3v0_MOD_CGSL, IF_REAL, "New C-V model parameter"), -IOP( "cgdl", BSIM3v0_MOD_CGDL, IF_REAL, "New C-V model parameter"), -IOP( "ckappa", BSIM3v0_MOD_CKAPPA, IF_REAL, "New C-V model parameter"), -IOP( "cf", BSIM3v0_MOD_CF, IF_REAL, "Fringe capacitance parameter"), -IOP( "clc", BSIM3v0_MOD_CLC, IF_REAL, "Vdsat parameter for C-V model"), -IOP( "cle", BSIM3v0_MOD_CLE, IF_REAL, "Vdsat parameter for C-V model"), -IOP( "dwc", BSIM3v0_MOD_DWC, IF_REAL, "Delta W for C-V model"), -IOP( "dlc", BSIM3v0_MOD_DLC, IF_REAL, "Delta L for C-V model"), - -IOP( "alpha0", BSIM3v0_MOD_ALPHA0, IF_REAL, "substrate current model parameter"), -IOP( "beta0", BSIM3v0_MOD_BETA0, IF_REAL, "substrate current model parameter"), - -IOP( "lcdsc", BSIM3v0_MOD_LCDSC, IF_REAL, "Length dependence of cdsc"), -IOP( "lcdscb", BSIM3v0_MOD_LCDSCB, IF_REAL, "Length dependence of cdscb"), -IOP( "lcdscd", BSIM3v0_MOD_LCDSCD, IF_REAL, "Length dependence of cdscd"), -IOP( "lcit", BSIM3v0_MOD_LCIT, IF_REAL, "Length dependence of cit"), -IOP( "lnfactor", BSIM3v0_MOD_LNFACTOR, IF_REAL, "Length dependence of nfactor"), -IOP( "lxj", BSIM3v0_MOD_LXJ, IF_REAL, "Length dependence of xj"), -IOP( "lvsat", BSIM3v0_MOD_LVSAT, IF_REAL, "Length dependence of vsat"), -IOP( "lat", BSIM3v0_MOD_LAT, IF_REAL, "Length dependence of at"), -IOP( "la0", BSIM3v0_MOD_LA0, IF_REAL, "Length dependence of a0"), -IOP( "lags", BSIM3v0_MOD_LAGS, IF_REAL, "Length dependence of ags"), -IOP( "la1", BSIM3v0_MOD_LA1, IF_REAL, "Length dependence of a1"), -IOP( "la2", BSIM3v0_MOD_LA2, IF_REAL, "Length dependence of a2"), -IOP( "lketa", BSIM3v0_MOD_LKETA, IF_REAL, "Length dependence of keta"), -IOP( "lnsub", BSIM3v0_MOD_LNSUB, IF_REAL, "Length dependence of nsub"), -IOP( "lnch", BSIM3v0_MOD_LNPEAK, IF_REAL, "Length dependence of nch"), -IOP( "lngate", BSIM3v0_MOD_LNGATE, IF_REAL, "Length dependence of ngate"), -IOP( "lgamma1", BSIM3v0_MOD_LGAMMA1, IF_REAL, "Length dependence of gamma1"), -IOP( "lgamma2", BSIM3v0_MOD_LGAMMA2, IF_REAL, "Length dependence of gamma2"), -IOP( "lvbx", BSIM3v0_MOD_LVBX, IF_REAL, "Length dependence of vbx"), -IOP( "lvbm", BSIM3v0_MOD_LVBM, IF_REAL, "Length dependence of vbm"), -IOP( "lxt", BSIM3v0_MOD_LXT, IF_REAL, "Length dependence of xt"), -IOP( "lk1", BSIM3v0_MOD_LK1, IF_REAL, "Length dependence of k1"), -IOP( "lkt1", BSIM3v0_MOD_LKT1, IF_REAL, "Length dependence of kt1"), -IOP( "lkt1l", BSIM3v0_MOD_LKT1L, IF_REAL, "Length dependence of kt1l"), -IOP( "lkt2", BSIM3v0_MOD_LKT2, IF_REAL, "Length dependence of kt2"), -IOP( "lk2", BSIM3v0_MOD_LK2, IF_REAL, "Length dependence of k2"), -IOP( "lk3", BSIM3v0_MOD_LK3, IF_REAL, "Length dependence of k3"), -IOP( "lk3b", BSIM3v0_MOD_LK3B, IF_REAL, "Length dependence of k3b"), -IOP( "lw0", BSIM3v0_MOD_LW0, IF_REAL, "Length dependence of w0"), -IOP( "lnlx", BSIM3v0_MOD_LNLX, IF_REAL, "Length dependence of nlx"), -IOP( "ldvt0", BSIM3v0_MOD_LDVT0, IF_REAL, "Length dependence of dvt0"), -IOP( "ldvt1", BSIM3v0_MOD_LDVT1, IF_REAL, "Length dependence of dvt1"), -IOP( "ldvt2", BSIM3v0_MOD_LDVT2, IF_REAL, "Length dependence of dvt2"), -IOP( "ldvt0w", BSIM3v0_MOD_LDVT0W, IF_REAL, "Length dependence of dvt0w"), -IOP( "ldvt1w", BSIM3v0_MOD_LDVT1W, IF_REAL, "Length dependence of dvt1w"), -IOP( "ldvt2w", BSIM3v0_MOD_LDVT2W, IF_REAL, "Length dependence of dvt2w"), -IOP( "ldrout", BSIM3v0_MOD_LDROUT, IF_REAL, "Length dependence of drout"), -IOP( "ldsub", BSIM3v0_MOD_LDSUB, IF_REAL, "Length dependence of dsub"), -IOP( "lvth0", BSIM3v0_MOD_LVTH0, IF_REAL,"Length dependence of vth0"), -IOPR("lvtho", BSIM3v0_MOD_LVTH0, IF_REAL,"Length dependence of vtho"), -IOP( "lua", BSIM3v0_MOD_LUA, IF_REAL, "Length dependence of ua"), -IOP( "lua1", BSIM3v0_MOD_LUA1, IF_REAL, "Length dependence of ua1"), -IOP( "lub", BSIM3v0_MOD_LUB, IF_REAL, "Length dependence of ub"), -IOP( "lub1", BSIM3v0_MOD_LUB1, IF_REAL, "Length dependence of ub1"), -IOP( "luc", BSIM3v0_MOD_LUC, IF_REAL, "Length dependence of uc"), -IOP( "luc1", BSIM3v0_MOD_LUC1, IF_REAL, "Length dependence of uc1"), -IOP( "lu0", BSIM3v0_MOD_LU0, IF_REAL, "Length dependence of u0"), -IOP( "lute", BSIM3v0_MOD_LUTE, IF_REAL, "Length dependence of ute"), -IOP( "lvoff", BSIM3v0_MOD_LVOFF, IF_REAL, "Length dependence of voff"), -IOP( "lelm", BSIM3v0_MOD_LELM, IF_REAL, "Length dependence of elm"), -IOP( "ldelta", BSIM3v0_MOD_LDELTA, IF_REAL, "Length dependence of delta"), -IOP( "lrdsw", BSIM3v0_MOD_LRDSW, IF_REAL, "Length dependence of rdsw "), - -IOP( "lprwg", BSIM3v0_MOD_LPRWG, IF_REAL, "Length dependence of prwg "), -IOP( "lprwb", BSIM3v0_MOD_LPRWB, IF_REAL, "Length dependence of prwb "), - -IOP( "lprt", BSIM3v0_MOD_LPRT, IF_REAL, "Length dependence of prt "), -IOP( "leta0", BSIM3v0_MOD_LETA0, IF_REAL, "Length dependence of eta0"), -IOP( "letab", BSIM3v0_MOD_LETAB, IF_REAL, "Length dependence of etab"), -IOP( "lpclm", BSIM3v0_MOD_LPCLM, IF_REAL, "Length dependence of pclm"), -IOP( "lpdiblc1", BSIM3v0_MOD_LPDIBL1, IF_REAL, "Length dependence of pdiblc1"), -IOP( "lpdiblc2", BSIM3v0_MOD_LPDIBL2, IF_REAL, "Length dependence of pdiblc2"), -IOP( "lpdiblcb", BSIM3v0_MOD_LPDIBLB, IF_REAL, "Length dependence of pdiblcb"), -IOP( "lpscbe1", BSIM3v0_MOD_LPSCBE1, IF_REAL, "Length dependence of pscbe1"), -IOP( "lpscbe2", BSIM3v0_MOD_LPSCBE2, IF_REAL, "Length dependence of pscbe2"), -IOP( "lpvag", BSIM3v0_MOD_LPVAG, IF_REAL, "Length dependence of pvag"), -IOP( "lwr", BSIM3v0_MOD_LWR, IF_REAL, "Length dependence of wr"), -IOP( "ldwg", BSIM3v0_MOD_LDWG, IF_REAL, "Length dependence of dwg"), -IOP( "ldwb", BSIM3v0_MOD_LDWB, IF_REAL, "Length dependence of dwb"), -IOP( "lb0", BSIM3v0_MOD_LB0, IF_REAL, "Length dependence of b0"), -IOP( "lb1", BSIM3v0_MOD_LB1, IF_REAL, "Length dependence of b1"), -IOP( "lcgsl", BSIM3v0_MOD_LCGSL, IF_REAL, "Length dependence of cgsl"), -IOP( "lcgdl", BSIM3v0_MOD_LCGDL, IF_REAL, "Length dependence of cgdl"), -IOP( "lckappa", BSIM3v0_MOD_LCKAPPA, IF_REAL, "Length dependence of ckappa"), -IOP( "lcf", BSIM3v0_MOD_LCF, IF_REAL, "Length dependence of cf"), -IOP( "lclc", BSIM3v0_MOD_LCLC, IF_REAL, "Length dependence of clc"), -IOP( "lcle", BSIM3v0_MOD_LCLE, IF_REAL, "Length dependence of cle"), -IOP( "lalpha0", BSIM3v0_MOD_LALPHA0, IF_REAL, "Length dependence of alpha0"), -IOP( "lbeta0", BSIM3v0_MOD_LBETA0, IF_REAL, "Length dependence of beta0"), - -IOP( "wcdsc", BSIM3v0_MOD_WCDSC, IF_REAL, "Width dependence of cdsc"), -IOP( "wcdscb", BSIM3v0_MOD_WCDSCB, IF_REAL, "Width dependence of cdscb"), -IOP( "wcdscd", BSIM3v0_MOD_WCDSCD, IF_REAL, "Width dependence of cdscd"), -IOP( "wcit", BSIM3v0_MOD_WCIT, IF_REAL, "Width dependence of cit"), -IOP( "wnfactor", BSIM3v0_MOD_WNFACTOR, IF_REAL, "Width dependence of nfactor"), -IOP( "wxj", BSIM3v0_MOD_WXJ, IF_REAL, "Width dependence of xj"), -IOP( "wvsat", BSIM3v0_MOD_WVSAT, IF_REAL, "Width dependence of vsat"), -IOP( "wat", BSIM3v0_MOD_WAT, IF_REAL, "Width dependence of at"), -IOP( "wa0", BSIM3v0_MOD_WA0, IF_REAL, "Width dependence of a0"), -IOP( "wags", BSIM3v0_MOD_WAGS, IF_REAL, "Width dependence of ags"), -IOP( "wa1", BSIM3v0_MOD_WA1, IF_REAL, "Width dependence of a1"), -IOP( "wa2", BSIM3v0_MOD_WA2, IF_REAL, "Width dependence of a2"), -IOP( "wketa", BSIM3v0_MOD_WKETA, IF_REAL, "Width dependence of keta"), -IOP( "wnsub", BSIM3v0_MOD_WNSUB, IF_REAL, "Width dependence of nsub"), -IOP( "wnch", BSIM3v0_MOD_WNPEAK, IF_REAL, "Width dependence of nch"), -IOP( "wngate", BSIM3v0_MOD_WNGATE, IF_REAL, "Width dependence of ngate"), -IOP( "wgamma1", BSIM3v0_MOD_WGAMMA1, IF_REAL, "Width dependence of gamma1"), -IOP( "wgamma2", BSIM3v0_MOD_WGAMMA2, IF_REAL, "Width dependence of gamma2"), -IOP( "wvbx", BSIM3v0_MOD_WVBX, IF_REAL, "Width dependence of vbx"), -IOP( "wvbm", BSIM3v0_MOD_WVBM, IF_REAL, "Width dependence of vbm"), -IOP( "wxt", BSIM3v0_MOD_WXT, IF_REAL, "Width dependence of xt"), -IOP( "wk1", BSIM3v0_MOD_WK1, IF_REAL, "Width dependence of k1"), -IOP( "wkt1", BSIM3v0_MOD_WKT1, IF_REAL, "Width dependence of kt1"), -IOP( "wkt1l", BSIM3v0_MOD_WKT1L, IF_REAL, "Width dependence of kt1l"), -IOP( "wkt2", BSIM3v0_MOD_WKT2, IF_REAL, "Width dependence of kt2"), -IOP( "wk2", BSIM3v0_MOD_WK2, IF_REAL, "Width dependence of k2"), -IOP( "wk3", BSIM3v0_MOD_WK3, IF_REAL, "Width dependence of k3"), -IOP( "wk3b", BSIM3v0_MOD_WK3B, IF_REAL, "Width dependence of k3b"), -IOP( "ww0", BSIM3v0_MOD_WW0, IF_REAL, "Width dependence of w0"), -IOP( "wnlx", BSIM3v0_MOD_WNLX, IF_REAL, "Width dependence of nlx"), -IOP( "wdvt0", BSIM3v0_MOD_WDVT0, IF_REAL, "Width dependence of dvt0"), -IOP( "wdvt1", BSIM3v0_MOD_WDVT1, IF_REAL, "Width dependence of dvt1"), -IOP( "wdvt2", BSIM3v0_MOD_WDVT2, IF_REAL, "Width dependence of dvt2"), -IOP( "wdvt0w", BSIM3v0_MOD_WDVT0W, IF_REAL, "Width dependence of dvt0w"), -IOP( "wdvt1w", BSIM3v0_MOD_WDVT1W, IF_REAL, "Width dependence of dvt1w"), -IOP( "wdvt2w", BSIM3v0_MOD_WDVT2W, IF_REAL, "Width dependence of dvt2w"), -IOP( "wdrout", BSIM3v0_MOD_WDROUT, IF_REAL, "Width dependence of drout"), -IOP( "wdsub", BSIM3v0_MOD_WDSUB, IF_REAL, "Width dependence of dsub"), -IOP( "wvth0", BSIM3v0_MOD_WVTH0, IF_REAL,"Width dependence of vth0"), -IOPR("wvtho", BSIM3v0_MOD_WVTH0, IF_REAL,"Width dependence of vtho"), -IOP( "wua", BSIM3v0_MOD_WUA, IF_REAL, "Width dependence of ua"), -IOP( "wua1", BSIM3v0_MOD_WUA1, IF_REAL, "Width dependence of ua1"), -IOP( "wub", BSIM3v0_MOD_WUB, IF_REAL, "Width dependence of ub"), -IOP( "wub1", BSIM3v0_MOD_WUB1, IF_REAL, "Width dependence of ub1"), -IOP( "wuc", BSIM3v0_MOD_WUC, IF_REAL, "Width dependence of uc"), -IOP( "wuc1", BSIM3v0_MOD_WUC1, IF_REAL, "Width dependence of uc1"), -IOP( "wu0", BSIM3v0_MOD_WU0, IF_REAL, "Width dependence of u0"), -IOP( "wute", BSIM3v0_MOD_WUTE, IF_REAL, "Width dependence of ute"), -IOP( "wvoff", BSIM3v0_MOD_WVOFF, IF_REAL, "Width dependence of voff"), -IOP( "welm", BSIM3v0_MOD_WELM, IF_REAL, "Width dependence of elm"), -IOP( "wdelta", BSIM3v0_MOD_WDELTA, IF_REAL, "Width dependence of delta"), -IOP( "wrdsw", BSIM3v0_MOD_WRDSW, IF_REAL, "Width dependence of rdsw "), - -IOP( "wprwg", BSIM3v0_MOD_WPRWG, IF_REAL, "Width dependence of prwg "), -IOP( "wprwb", BSIM3v0_MOD_WPRWB, IF_REAL, "Width dependence of prwb "), - -IOP( "wprt", BSIM3v0_MOD_WPRT, IF_REAL, "Width dependence of prt"), -IOP( "weta0", BSIM3v0_MOD_WETA0, IF_REAL, "Width dependence of eta0"), -IOP( "wetab", BSIM3v0_MOD_WETAB, IF_REAL, "Width dependence of etab"), -IOP( "wpclm", BSIM3v0_MOD_WPCLM, IF_REAL, "Width dependence of pclm"), -IOP( "wpdiblc1", BSIM3v0_MOD_WPDIBL1, IF_REAL, "Width dependence of pdiblc1"), -IOP( "wpdiblc2", BSIM3v0_MOD_WPDIBL2, IF_REAL, "Width dependence of pdiblc2"), -IOP( "wpdiblcb", BSIM3v0_MOD_WPDIBLB, IF_REAL, "Width dependence of pdiblcb"), -IOP( "wpscbe1", BSIM3v0_MOD_WPSCBE1, IF_REAL, "Width dependence of pscbe1"), -IOP( "wpscbe2", BSIM3v0_MOD_WPSCBE2, IF_REAL, "Width dependence of pscbe2"), -IOP( "wpvag", BSIM3v0_MOD_WPVAG, IF_REAL, "Width dependence of pvag"), -IOP( "wwr", BSIM3v0_MOD_WWR, IF_REAL, "Width dependence of wr"), -IOP( "wdwg", BSIM3v0_MOD_WDWG, IF_REAL, "Width dependence of dwg"), -IOP( "wdwb", BSIM3v0_MOD_WDWB, IF_REAL, "Width dependence of dwb"), -IOP( "wb0", BSIM3v0_MOD_WB0, IF_REAL, "Width dependence of b0"), -IOP( "wb1", BSIM3v0_MOD_WB1, IF_REAL, "Width dependence of b1"), -IOP( "wcgsl", BSIM3v0_MOD_WCGSL, IF_REAL, "Width dependence of cgsl"), -IOP( "wcgdl", BSIM3v0_MOD_WCGDL, IF_REAL, "Width dependence of cgdl"), -IOP( "wckappa", BSIM3v0_MOD_WCKAPPA, IF_REAL, "Width dependence of ckappa"), -IOP( "wcf", BSIM3v0_MOD_WCF, IF_REAL, "Width dependence of cf"), -IOP( "wclc", BSIM3v0_MOD_WCLC, IF_REAL, "Width dependence of clc"), -IOP( "wcle", BSIM3v0_MOD_WCLE, IF_REAL, "Width dependence of cle"), -IOP( "walpha0", BSIM3v0_MOD_WALPHA0, IF_REAL, "Width dependence of alpha0"), -IOP( "wbeta0", BSIM3v0_MOD_WBETA0, IF_REAL, "Width dependence of beta0"), - -IOP( "pcdsc", BSIM3v0_MOD_PCDSC, IF_REAL, "Cross-term dependence of cdsc"), -IOP( "pcdscb", BSIM3v0_MOD_PCDSCB, IF_REAL, "Cross-term dependence of cdscb"), -IOP( "pcdscd", BSIM3v0_MOD_PCDSCD, IF_REAL, "Cross-term dependence of cdscd"), -IOP( "pcit", BSIM3v0_MOD_PCIT, IF_REAL, "Cross-term dependence of cit"), -IOP( "pnfactor", BSIM3v0_MOD_PNFACTOR, IF_REAL, "Cross-term dependence of nfactor"), -IOP( "pxj", BSIM3v0_MOD_PXJ, IF_REAL, "Cross-term dependence of xj"), -IOP( "pvsat", BSIM3v0_MOD_PVSAT, IF_REAL, "Cross-term dependence of vsat"), -IOP( "pat", BSIM3v0_MOD_PAT, IF_REAL, "Cross-term dependence of at"), -IOP( "pa0", BSIM3v0_MOD_PA0, IF_REAL, "Cross-term dependence of a0"), -IOP( "pags", BSIM3v0_MOD_PAGS, IF_REAL, "Cross-term dependence of ags"), -IOP( "pa1", BSIM3v0_MOD_PA1, IF_REAL, "Cross-term dependence of a1"), -IOP( "pa2", BSIM3v0_MOD_PA2, IF_REAL, "Cross-term dependence of a2"), -IOP( "pketa", BSIM3v0_MOD_PKETA, IF_REAL, "Cross-term dependence of keta"), -IOP( "pnsub", BSIM3v0_MOD_PNSUB, IF_REAL, "Cross-term dependence of nsub"), -IOP( "pnch", BSIM3v0_MOD_PNPEAK, IF_REAL, "Cross-term dependence of nch"), -IOP( "pngate", BSIM3v0_MOD_PNGATE, IF_REAL, "Cross-term dependence of ngate"), -IOP( "pgamma1", BSIM3v0_MOD_PGAMMA1, IF_REAL, "Cross-term dependence of gamma1"), -IOP( "pgamma2", BSIM3v0_MOD_PGAMMA2, IF_REAL, "Cross-term dependence of gamma2"), -IOP( "pvbx", BSIM3v0_MOD_PVBX, IF_REAL, "Cross-term dependence of vbx"), -IOP( "pvbm", BSIM3v0_MOD_PVBM, IF_REAL, "Cross-term dependence of vbm"), -IOP( "pxt", BSIM3v0_MOD_PXT, IF_REAL, "Cross-term dependence of xt"), -IOP( "pk1", BSIM3v0_MOD_PK1, IF_REAL, "Cross-term dependence of k1"), -IOP( "pkt1", BSIM3v0_MOD_PKT1, IF_REAL, "Cross-term dependence of kt1"), -IOP( "pkt1l", BSIM3v0_MOD_PKT1L, IF_REAL, "Cross-term dependence of kt1l"), -IOP( "pkt2", BSIM3v0_MOD_PKT2, IF_REAL, "Cross-term dependence of kt2"), -IOP( "pk2", BSIM3v0_MOD_PK2, IF_REAL, "Cross-term dependence of k2"), -IOP( "pk3", BSIM3v0_MOD_PK3, IF_REAL, "Cross-term dependence of k3"), -IOP( "pk3b", BSIM3v0_MOD_PK3B, IF_REAL, "Cross-term dependence of k3b"), -IOP( "pw0", BSIM3v0_MOD_PW0, IF_REAL, "Cross-term dependence of w0"), -IOP( "pnlx", BSIM3v0_MOD_PNLX, IF_REAL, "Cross-term dependence of nlx"), -IOP( "pdvt0", BSIM3v0_MOD_PDVT0, IF_REAL, "Cross-term dependence of dvt0"), -IOP( "pdvt1", BSIM3v0_MOD_PDVT1, IF_REAL, "Cross-term dependence of dvt1"), -IOP( "pdvt2", BSIM3v0_MOD_PDVT2, IF_REAL, "Cross-term dependence of dvt2"), -IOP( "pdvt0w", BSIM3v0_MOD_PDVT0W, IF_REAL, "Cross-term dependence of dvt0w"), -IOP( "pdvt1w", BSIM3v0_MOD_PDVT1W, IF_REAL, "Cross-term dependence of dvt1w"), -IOP( "pdvt2w", BSIM3v0_MOD_PDVT2W, IF_REAL, "Cross-term dependence of dvt2w"), -IOP( "pdrout", BSIM3v0_MOD_PDROUT, IF_REAL, "Cross-term dependence of drout"), -IOP( "pdsub", BSIM3v0_MOD_PDSUB, IF_REAL, "Cross-term dependence of dsub"), -IOP( "pvth0", BSIM3v0_MOD_PVTH0, IF_REAL,"Cross-term dependence of vth0"), -IOPR("pvtho", BSIM3v0_MOD_PVTH0, IF_REAL,"Cross-term dependence of vtho"), -IOP( "pua", BSIM3v0_MOD_PUA, IF_REAL, "Cross-term dependence of ua"), -IOP( "pua1", BSIM3v0_MOD_PUA1, IF_REAL, "Cross-term dependence of ua1"), -IOP( "pub", BSIM3v0_MOD_PUB, IF_REAL, "Cross-term dependence of ub"), -IOP( "pub1", BSIM3v0_MOD_PUB1, IF_REAL, "Cross-term dependence of ub1"), -IOP( "puc", BSIM3v0_MOD_PUC, IF_REAL, "Cross-term dependence of uc"), -IOP( "puc1", BSIM3v0_MOD_PUC1, IF_REAL, "Cross-term dependence of uc1"), -IOP( "pu0", BSIM3v0_MOD_PU0, IF_REAL, "Cross-term dependence of u0"), -IOP( "pute", BSIM3v0_MOD_PUTE, IF_REAL, "Cross-term dependence of ute"), -IOP( "pvoff", BSIM3v0_MOD_PVOFF, IF_REAL, "Cross-term dependence of voff"), -IOP( "pelm", BSIM3v0_MOD_PELM, IF_REAL, "Cross-term dependence of elm"), -IOP( "pdelta", BSIM3v0_MOD_PDELTA, IF_REAL, "Cross-term dependence of delta"), -IOP( "prdsw", BSIM3v0_MOD_PRDSW, IF_REAL, "Cross-term dependence of rdsw "), - -IOP( "pprwg", BSIM3v0_MOD_PPRWG, IF_REAL, "Cross-term dependence of prwg "), -IOP( "pprwb", BSIM3v0_MOD_PPRWB, IF_REAL, "Cross-term dependence of prwb "), - -IOP( "pprt", BSIM3v0_MOD_PPRT, IF_REAL, "Cross-term dependence of prt "), -IOP( "peta0", BSIM3v0_MOD_PETA0, IF_REAL, "Cross-term dependence of eta0"), -IOP( "petab", BSIM3v0_MOD_PETAB, IF_REAL, "Cross-term dependence of etab"), -IOP( "ppclm", BSIM3v0_MOD_PPCLM, IF_REAL, "Cross-term dependence of pclm"), -IOP( "ppdiblc1", BSIM3v0_MOD_PPDIBL1, IF_REAL, "Cross-term dependence of pdiblc1"), -IOP( "ppdiblc2", BSIM3v0_MOD_PPDIBL2, IF_REAL, "Cross-term dependence of pdiblc2"), -IOP( "ppdiblcb", BSIM3v0_MOD_PPDIBLB, IF_REAL, "Cross-term dependence of pdiblcb"), -IOP( "ppscbe1", BSIM3v0_MOD_PPSCBE1, IF_REAL, "Cross-term dependence of pscbe1"), -IOP( "ppscbe2", BSIM3v0_MOD_PPSCBE2, IF_REAL, "Cross-term dependence of pscbe2"), -IOP( "ppvag", BSIM3v0_MOD_PPVAG, IF_REAL, "Cross-term dependence of pvag"), -IOP( "pwr", BSIM3v0_MOD_PWR, IF_REAL, "Cross-term dependence of wr"), -IOP( "pdwg", BSIM3v0_MOD_PDWG, IF_REAL, "Cross-term dependence of dwg"), -IOP( "pdwb", BSIM3v0_MOD_PDWB, IF_REAL, "Cross-term dependence of dwb"), -IOP( "pb0", BSIM3v0_MOD_PB0, IF_REAL, "Cross-term dependence of b0"), -IOP( "pb1", BSIM3v0_MOD_PB1, IF_REAL, "Cross-term dependence of b1"), -IOP( "pcgsl", BSIM3v0_MOD_PCGSL, IF_REAL, "Cross-term dependence of cgsl"), -IOP( "pcgdl", BSIM3v0_MOD_PCGDL, IF_REAL, "Cross-term dependence of cgdl"), -IOP( "pckappa", BSIM3v0_MOD_PCKAPPA, IF_REAL, "Cross-term dependence of ckappa"), -IOP( "pcf", BSIM3v0_MOD_PCF, IF_REAL, "Cross-term dependence of cf"), -IOP( "pclc", BSIM3v0_MOD_PCLC, IF_REAL, "Cross-term dependence of clc"), -IOP( "pcle", BSIM3v0_MOD_PCLE, IF_REAL, "Cross-term dependence of cle"), -IOP( "palpha0", BSIM3v0_MOD_PALPHA0, IF_REAL, "Cross-term dependence of alpha0"), -IOP( "pbeta0", BSIM3v0_MOD_PBETA0, IF_REAL, "Cross-term dependence of beta0"), - -IOP( "noia", BSIM3v0_MOD_NOIA, IF_REAL, "Flicker noise parameter"), -IOP( "noib", BSIM3v0_MOD_NOIB, IF_REAL, "Flicker noise parameter"), -IOP( "noic", BSIM3v0_MOD_NOIC, IF_REAL, "Flicker noise parameter"), -IOP( "em", BSIM3v0_MOD_EM, IF_REAL, "Flicker noise parameter"), -IOP( "ef", BSIM3v0_MOD_EF, IF_REAL, "Flicker noise frequency exponent"), -IOP( "af", BSIM3v0_MOD_AF, IF_REAL, "Flicker noise exponent"), -IOP( "kf", BSIM3v0_MOD_KF, IF_REAL, "Flicker noise coefficient"), - -IP( "nmos", BSIM3v0_MOD_NMOS, IF_FLAG, "Flag to indicate NMOS"), -IP( "pmos", BSIM3v0_MOD_PMOS, IF_FLAG, "Flag to indicate PMOS"), -}; - -char *BSIM3v0names[] = { - "Drain", - "Gate", - "Source", - "Bulk", - "Charge" -}; - -int BSIM3v0nSize = NUMELEMS(BSIM3v0names); -int BSIM3v0pTSize = NUMELEMS(BSIM3v0pTable); -int BSIM3v0mPTSize = NUMELEMS(BSIM3v0mPTable); -int BSIM3v0iSize = sizeof(BSIM3v0instance); -int BSIM3v0mSize = sizeof(BSIM3v0model); - - - diff --git a/src/spicelib/devices/bsim3v0/b3v0acld.c b/src/spicelib/devices/bsim3v0/b3v0acld.c deleted file mode 100644 index 3de6e2fd3..000000000 --- a/src/spicelib/devices/bsim3v0/b3v0acld.c +++ /dev/null @@ -1,180 +0,0 @@ -/********** -Copyright 1990 Regents of the University of California. All rights reserved. -Author: 1995 Min-Chie Jeng and Mansun Chan. -File: b3v0acld.c -**********/ - -#include "ngspice/ngspice.h" -#include "ngspice/cktdefs.h" -#include "bsim3v0def.h" -#include "ngspice/sperror.h" -#include "ngspice/suffix.h" - - -int -BSIM3v0acLoad(GENmodel *inModel, CKTcircuit *ckt) -{ -BSIM3v0model *model = (BSIM3v0model*)inModel; -BSIM3v0instance *here; -double xcggb, xcgdb, xcgsb, xcbgb, xcbdb, xcbsb, xcddb, xcssb, xcdgb; -double gdpr, gspr, gds, gbd, gbs, capbd, capbs, xcsgb, xcdsb, xcsdb; -double cggb, cgdb, cgsb, cbgb, cbdb, cbsb, cddb, cdgb, cdsb, omega; -double GSoverlapCap, GDoverlapCap, GBoverlapCap, FwdSum, RevSum, Gm, Gmbs; - -double dxpart, sxpart, cqgb, cqdb, cqsb, cqbb, xcqgb, xcqdb, xcqsb, xcqbb; - -double m; - - omega = ckt->CKTomega; - for (; model != NULL; model = BSIM3v0nextModel(model)) - { - - - for (here = BSIM3v0instances(model); here!= NULL; - here = BSIM3v0nextInstance(here)) - { - if (here->BSIM3v0mode >= 0) - { Gm = here->BSIM3v0gm; - Gmbs = here->BSIM3v0gmbs; - FwdSum = Gm + Gmbs; - RevSum = 0.0; - cggb = here->BSIM3v0cggb; - cgsb = here->BSIM3v0cgsb; - cgdb = here->BSIM3v0cgdb; - - cbgb = here->BSIM3v0cbgb; - cbsb = here->BSIM3v0cbsb; - cbdb = here->BSIM3v0cbdb; - - cdgb = here->BSIM3v0cdgb; - cdsb = here->BSIM3v0cdsb; - cddb = here->BSIM3v0cddb; - - cqgb = here->BSIM3v0cqgb; - cqdb = here->BSIM3v0cqdb; - cqsb = here->BSIM3v0cqsb; - cqbb = here->BSIM3v0cqbb; - sxpart = 0.6; - dxpart = 0.4; - - } - else - { Gm = -here->BSIM3v0gm; - Gmbs = -here->BSIM3v0gmbs; - FwdSum = 0.0; - RevSum = -Gm - Gmbs; - cggb = here->BSIM3v0cggb; - cgsb = here->BSIM3v0cgdb; - cgdb = here->BSIM3v0cgsb; - - cbgb = here->BSIM3v0cbgb; - cbsb = here->BSIM3v0cbdb; - cbdb = here->BSIM3v0cbsb; - - cdgb = -(here->BSIM3v0cdgb + cggb + cbgb); - cdsb = -(here->BSIM3v0cddb + cgsb + cbsb); - cddb = -(here->BSIM3v0cdsb + cgdb + cbdb); - - cqgb = here->BSIM3v0cqgb; - cqdb = here->BSIM3v0cqsb; - cqsb = here->BSIM3v0cqdb; - cqbb = here->BSIM3v0cqbb; - sxpart = 0.4; - dxpart = 0.6; - } - - gdpr=here->BSIM3v0drainConductance; - gspr=here->BSIM3v0sourceConductance; - gds= here->BSIM3v0gds; - gbd= here->BSIM3v0gbd; - gbs= here->BSIM3v0gbs; - capbd= here->BSIM3v0capbd; - capbs= here->BSIM3v0capbs; - - GSoverlapCap = here->BSIM3v0cgso; - GDoverlapCap = here->BSIM3v0cgdo; - GBoverlapCap = here->pParam->BSIM3v0cgbo; - - xcdgb = (cdgb - GDoverlapCap) * omega; - xcddb = (cddb + capbd + GDoverlapCap) * omega; - xcdsb = cdsb * omega; - xcsgb = -(cggb + cbgb + cdgb + GSoverlapCap) * omega; - xcsdb = -(cgdb + cbdb + cddb) * omega; - xcssb = (capbs + GSoverlapCap - (cgsb + cbsb + cdsb)) * omega; - xcggb = (cggb + GDoverlapCap + GSoverlapCap + GBoverlapCap) - * omega; - xcgdb = (cgdb - GDoverlapCap ) * omega; - xcgsb = (cgsb - GSoverlapCap) * omega; - xcbgb = (cbgb - GBoverlapCap) * omega; - xcbdb = (cbdb - capbd ) * omega; - xcbsb = (cbsb - capbs ) * omega; - xcqgb = cqgb * omega; - xcqdb = cqdb * omega; - xcqsb = cqsb * omega; - xcqbb = cqbb * omega; - - m = here->BSIM3v0m; - - *(here->BSIM3v0GgPtr +1) += m * xcggb; - *(here->BSIM3v0BbPtr +1) -= m * (xcbgb + xcbdb + xcbsb); - *(here->BSIM3v0DPdpPtr +1) += m * xcddb; - *(here->BSIM3v0SPspPtr +1) += m * xcssb; - *(here->BSIM3v0GbPtr +1) -= m * (xcggb + xcgdb + xcgsb); - *(here->BSIM3v0GdpPtr +1) += m * xcgdb; - *(here->BSIM3v0GspPtr +1) += m * xcgsb; - *(here->BSIM3v0BgPtr +1) += m * xcbgb; - *(here->BSIM3v0BdpPtr +1) += m * xcbdb; - *(here->BSIM3v0BspPtr +1) += m * xcbsb; - *(here->BSIM3v0DPgPtr +1) += m * xcdgb; - *(here->BSIM3v0DPbPtr +1) -= m * (xcdgb + xcddb + xcdsb); - *(here->BSIM3v0DPspPtr +1) += m * xcdsb; - *(here->BSIM3v0SPgPtr +1) += m * xcsgb; - *(here->BSIM3v0SPbPtr +1) -= m * (xcsgb + xcsdb + xcssb); - *(here->BSIM3v0SPdpPtr +1) += m * xcsdb; - - *(here->BSIM3v0QqPtr +1) += m * omega; - - *(here->BSIM3v0QgPtr +1) -= m * xcqgb; - *(here->BSIM3v0QdpPtr +1) -= m * xcqdb; - *(here->BSIM3v0QspPtr +1) -= m * xcqsb; - *(here->BSIM3v0QbPtr +1) -= m * xcqbb; - - - *(here->BSIM3v0DdPtr) += m * gdpr; - *(here->BSIM3v0SsPtr) += m * gspr; - *(here->BSIM3v0BbPtr) += m * (gbd + gbs); - *(here->BSIM3v0DPdpPtr) += m * (gdpr + gds + gbd + RevSum + dxpart*here->BSIM3v0gtd); - *(here->BSIM3v0SPspPtr) += m * (gspr + gds + gbs + FwdSum + sxpart*here->BSIM3v0gts); - *(here->BSIM3v0DdpPtr) -= m * gdpr; - *(here->BSIM3v0SspPtr) -= m * gspr; - *(here->BSIM3v0BdpPtr) -= m * gbd; - *(here->BSIM3v0BspPtr) -= m * gbs; - *(here->BSIM3v0DPdPtr) -= m * gdpr; - *(here->BSIM3v0DPgPtr) += m * (Gm + dxpart * here->BSIM3v0gtg); - *(here->BSIM3v0DPbPtr) -= m * (gbd - Gmbs - dxpart * here->BSIM3v0gtb); - *(here->BSIM3v0DPspPtr) -= m * (gds + FwdSum - dxpart * here->BSIM3v0gts); - *(here->BSIM3v0SPgPtr) -= m * (Gm - sxpart * here->BSIM3v0gtg); - *(here->BSIM3v0SPsPtr) -= m * gspr; - *(here->BSIM3v0SPbPtr) -= m * (gbs + Gmbs - sxpart * here->BSIM3v0gtg); - *(here->BSIM3v0SPdpPtr) -= m * (gds + RevSum - sxpart * here->BSIM3v0gtd); - *(here->BSIM3v0GgPtr) -= m * here->BSIM3v0gtg; - *(here->BSIM3v0GbPtr) -= m * here->BSIM3v0gtb; - *(here->BSIM3v0GdpPtr) -= m * here->BSIM3v0gtd; - *(here->BSIM3v0GspPtr) -= m * here->BSIM3v0gts; - - *(here->BSIM3v0QqPtr) += m * here->BSIM3v0gtau; - - *(here->BSIM3v0DPqPtr) += m * (dxpart * here->BSIM3v0gtau); - *(here->BSIM3v0SPqPtr) += m * (sxpart * here->BSIM3v0gtau); - *(here->BSIM3v0GqPtr) -= m * here->BSIM3v0gtau; - - *(here->BSIM3v0QgPtr) += m * here->BSIM3v0gtg; - *(here->BSIM3v0QdpPtr) += m * here->BSIM3v0gtd; - *(here->BSIM3v0QspPtr) += m * here->BSIM3v0gts; - *(here->BSIM3v0QbPtr) += m * here->BSIM3v0gtb; - - } - } - return(OK); -} - diff --git a/src/spicelib/devices/bsim3v0/b3v0ask.c b/src/spicelib/devices/bsim3v0/b3v0ask.c deleted file mode 100644 index 61caf2db5..000000000 --- a/src/spicelib/devices/bsim3v0/b3v0ask.c +++ /dev/null @@ -1,223 +0,0 @@ -/********** -Copyright 1990 Regents of the University of California. All rights reserved. -Author: 1995 Min-Chie Jeng and Mansun Chan. -File: b3v0ask.c -**********/ - -#include "ngspice/ngspice.h" -#include "ngspice/ifsim.h" -#include "ngspice/cktdefs.h" -#include "ngspice/devdefs.h" -#include "bsim3v0def.h" -#include "ngspice/sperror.h" -#include "ngspice/suffix.h" - -int -BSIM3v0ask(CKTcircuit *ckt, GENinstance *inst, int which, IFvalue *value, - IFvalue *select) -{ -BSIM3v0instance *here = (BSIM3v0instance*)inst; - - NG_IGNORE(select); - - switch(which) - { case BSIM3v0_L: - value->rValue = here->BSIM3v0l; - return(OK); - case BSIM3v0_W: - value->rValue = here->BSIM3v0w; - return(OK); - case BSIM3v0_M: - value->rValue = here->BSIM3v0m; - return(OK); - case BSIM3v0_AS: - value->rValue = here->BSIM3v0sourceArea; - return(OK); - case BSIM3v0_AD: - value->rValue = here->BSIM3v0drainArea; - return(OK); - case BSIM3v0_PS: - value->rValue = here->BSIM3v0sourcePerimeter; - return(OK); - case BSIM3v0_PD: - value->rValue = here->BSIM3v0drainPerimeter; - return(OK); - case BSIM3v0_NRS: - value->rValue = here->BSIM3v0sourceSquares; - return(OK); - case BSIM3v0_NRD: - value->rValue = here->BSIM3v0drainSquares; - return(OK); - case BSIM3v0_OFF: - value->rValue = here->BSIM3v0off; - return(OK); - case BSIM3v0_NQSMOD: - value->iValue = here->BSIM3v0nqsMod; - return(OK); - case BSIM3v0_IC_VBS: - value->rValue = here->BSIM3v0icVBS; - return(OK); - case BSIM3v0_IC_VDS: - value->rValue = here->BSIM3v0icVDS; - return(OK); - case BSIM3v0_IC_VGS: - value->rValue = here->BSIM3v0icVGS; - return(OK); - case BSIM3v0_DNODE: - value->iValue = here->BSIM3v0dNode; - return(OK); - case BSIM3v0_GNODE: - value->iValue = here->BSIM3v0gNode; - return(OK); - case BSIM3v0_SNODE: - value->iValue = here->BSIM3v0sNode; - return(OK); - case BSIM3v0_BNODE: - value->iValue = here->BSIM3v0bNode; - return(OK); - case BSIM3v0_DNODEPRIME: - value->iValue = here->BSIM3v0dNodePrime; - return(OK); - case BSIM3v0_SNODEPRIME: - value->iValue = here->BSIM3v0sNodePrime; - return(OK); - case BSIM3v0_SOURCECONDUCT: - value->rValue = here->BSIM3v0sourceConductance; - value->rValue *= here->BSIM3v0m; - return(OK); - case BSIM3v0_DRAINCONDUCT: - value->rValue = here->BSIM3v0drainConductance; - value->rValue *= here->BSIM3v0m; - return(OK); - case BSIM3v0_VBD: - value->rValue = *(ckt->CKTstate0 + here->BSIM3v0vbd); - return(OK); - case BSIM3v0_VBS: - value->rValue = *(ckt->CKTstate0 + here->BSIM3v0vbs); - return(OK); - case BSIM3v0_VGS: - value->rValue = *(ckt->CKTstate0 + here->BSIM3v0vgs); - return(OK); - case BSIM3v0_VDS: - value->rValue = *(ckt->CKTstate0 + here->BSIM3v0vds); - return(OK); - case BSIM3v0_CD: - value->rValue = here->BSIM3v0cd; - value->rValue *= here->BSIM3v0m; - return(OK); - case BSIM3v0_CBS: - value->rValue = here->BSIM3v0cbs; - value->rValue *= here->BSIM3v0m; - return(OK); - case BSIM3v0_CBD: - value->rValue = here->BSIM3v0cbd; - value->rValue *= here->BSIM3v0m; - return(OK); - case BSIM3v0_GM: - value->rValue = here->BSIM3v0gm; - value->rValue *= here->BSIM3v0m; - return(OK); - case BSIM3v0_GDS: - value->rValue = here->BSIM3v0gds; - value->rValue *= here->BSIM3v0m; - return(OK); - case BSIM3v0_GMBS: - value->rValue = here->BSIM3v0gmbs; - value->rValue *= here->BSIM3v0m; - return(OK); - case BSIM3v0_GBD: - value->rValue = here->BSIM3v0gbd; - value->rValue *= here->BSIM3v0m; - return(OK); - case BSIM3v0_GBS: - value->rValue = here->BSIM3v0gbs; - value->rValue *= here->BSIM3v0m; - return(OK); - case BSIM3v0_QB: - value->rValue = *(ckt->CKTstate0 + here->BSIM3v0qb); - value->rValue *= here->BSIM3v0m; - return(OK); - case BSIM3v0_CQB: - value->rValue = *(ckt->CKTstate0 + here->BSIM3v0cqb); - value->rValue *= here->BSIM3v0m; - return(OK); - case BSIM3v0_QG: - value->rValue = *(ckt->CKTstate0 + here->BSIM3v0qg); - value->rValue *= here->BSIM3v0m; - return(OK); - case BSIM3v0_CQG: - value->rValue = *(ckt->CKTstate0 + here->BSIM3v0cqg); - value->rValue *= here->BSIM3v0m; - return(OK); - case BSIM3v0_QD: - value->rValue = *(ckt->CKTstate0 + here->BSIM3v0qd); - value->rValue *= here->BSIM3v0m; - return(OK); - case BSIM3v0_CQD: - value->rValue = *(ckt->CKTstate0 + here->BSIM3v0cqd); - value->rValue *= here->BSIM3v0m; - return(OK); - case BSIM3v0_CGG: - value->rValue = here->BSIM3v0cggb; - value->rValue *= here->BSIM3v0m; - return(OK); - case BSIM3v0_CGD: - value->rValue = here->BSIM3v0cgdb; - value->rValue *= here->BSIM3v0m; - return(OK); - case BSIM3v0_CGS: - value->rValue = here->BSIM3v0cgsb; - value->rValue *= here->BSIM3v0m; - return(OK); - case BSIM3v0_CDG: - value->rValue = here->BSIM3v0cdgb; - value->rValue *= here->BSIM3v0m; - return(OK); - case BSIM3v0_CDD: - value->rValue = here->BSIM3v0cddb; - value->rValue *= here->BSIM3v0m; - return(OK); - case BSIM3v0_CDS: - value->rValue = here->BSIM3v0cdsb; - value->rValue *= here->BSIM3v0m; - return(OK); - case BSIM3v0_CBG: - value->rValue = here->BSIM3v0cbgb; - value->rValue *= here->BSIM3v0m; - return(OK); - case BSIM3v0_CBDB: - value->rValue = here->BSIM3v0cbdb; - value->rValue *= here->BSIM3v0m; - return(OK); - case BSIM3v0_CBSB: - value->rValue = here->BSIM3v0cbsb; - value->rValue *= here->BSIM3v0m; - return(OK); - case BSIM3v0_CAPBD: - value->rValue = here->BSIM3v0capbd; - value->rValue *= here->BSIM3v0m; - return(OK); - case BSIM3v0_CAPBS: - value->rValue = here->BSIM3v0capbs; - value->rValue *= here->BSIM3v0m; - return(OK); - case BSIM3v0_VON: - value->rValue = here->BSIM3v0von; - return(OK); - case BSIM3v0_VDSAT: - value->rValue = here->BSIM3v0vdsat; - return(OK); - case BSIM3v0_QBS: - value->rValue = *(ckt->CKTstate0 + here->BSIM3v0qbs); - value->rValue *= here->BSIM3v0m; - return(OK); - case BSIM3v0_QBD: - value->rValue = *(ckt->CKTstate0 + here->BSIM3v0qbd); - value->rValue *= here->BSIM3v0m; - return(OK); - default: - return(E_BADPARM); - } - /* NOTREACHED */ -} - diff --git a/src/spicelib/devices/bsim3v0/b3v0cvtest.c b/src/spicelib/devices/bsim3v0/b3v0cvtest.c deleted file mode 100644 index 5ba77179e..000000000 --- a/src/spicelib/devices/bsim3v0/b3v0cvtest.c +++ /dev/null @@ -1,86 +0,0 @@ -/********** -Copyright 1990 Regents of the University of California. All rights reserved. -Author: 1995 Min-Chie Jeng and Mansun Chan. -File: b3v0cvtest.c -**********/ - -#include "ngspice/ngspice.h" -#include "ngspice/cktdefs.h" -#include "bsim3v0def.h" -#include "ngspice/trandefs.h" -#include "ngspice/const.h" -#include "ngspice/devdefs.h" -#include "ngspice/sperror.h" -#include "ngspice/suffix.h" - - -int -BSIM3v0convTest(GENmodel *inModel, CKTcircuit *ckt) -{ -BSIM3v0model *model = (BSIM3v0model*)inModel; -BSIM3v0instance *here; -double delvbd, delvbs, delvds, delvgd, delvgs, vbd, vbs, vds; -double cbd, cbhat, cbs, cd, cdhat, tol, vgd, vgdo, vgs; - - /* loop through all the BSIM3v0 device models */ - for (; model != NULL; model = BSIM3v0nextModel(model)) - { /* loop through all the instances of the model */ - for (here = BSIM3v0instances(model); here != NULL ; - here=BSIM3v0nextInstance(here)) - { - vbs = model->BSIM3v0type - * (*(ckt->CKTrhsOld+here->BSIM3v0bNode) - - *(ckt->CKTrhsOld+here->BSIM3v0sNodePrime)); - vgs = model->BSIM3v0type - * (*(ckt->CKTrhsOld+here->BSIM3v0gNode) - - *(ckt->CKTrhsOld+here->BSIM3v0sNodePrime)); - vds = model->BSIM3v0type - * (*(ckt->CKTrhsOld+here->BSIM3v0dNodePrime) - - *(ckt->CKTrhsOld+here->BSIM3v0sNodePrime)); - vbd = vbs - vds; - vgd = vgs - vds; - vgdo = *(ckt->CKTstate0 + here->BSIM3v0vgs) - - *(ckt->CKTstate0 + here->BSIM3v0vds); - delvbs = vbs - *(ckt->CKTstate0 + here->BSIM3v0vbs); - delvbd = vbd - *(ckt->CKTstate0 + here->BSIM3v0vbd); - delvgs = vgs - *(ckt->CKTstate0 + here->BSIM3v0vgs); - delvds = vds - *(ckt->CKTstate0 + here->BSIM3v0vds); - delvgd = vgd-vgdo; - - cd = here->BSIM3v0cd; - if (here->BSIM3v0mode >= 0) - { cdhat = cd - here->BSIM3v0gbd * delvbd - + here->BSIM3v0gmbs * delvbs + here->BSIM3v0gm * delvgs - + here->BSIM3v0gds * delvds; - } - else - { cdhat = cd - (here->BSIM3v0gbd - here->BSIM3v0gmbs) * delvbd - - here->BSIM3v0gm * delvgd + here->BSIM3v0gds * delvds; - } - - /* - * check convergence - */ - if ((here->BSIM3v0off == 0) || (!(ckt->CKTmode & MODEINITFIX))) - { tol = ckt->CKTreltol * MAX(fabs(cdhat), fabs(cd)) - + ckt->CKTabstol; - if (fabs(cdhat - cd) >= tol) - { ckt->CKTnoncon++; - return(OK); - } - cbs = here->BSIM3v0cbs; - cbd = here->BSIM3v0cbd; - cbhat = cbs + cbd + here->BSIM3v0gbd * delvbd - + here->BSIM3v0gbs * delvbs; - tol = ckt->CKTreltol * MAX(fabs(cbhat), fabs(cbs + cbd)) - + ckt->CKTabstol; - if (fabs(cbhat - (cbs + cbd)) > tol) - { ckt->CKTnoncon++; - return(OK); - } - } - } - } - return(OK); -} - diff --git a/src/spicelib/devices/bsim3v0/b3v0getic.c b/src/spicelib/devices/bsim3v0/b3v0getic.c deleted file mode 100644 index 80bb26822..000000000 --- a/src/spicelib/devices/bsim3v0/b3v0getic.c +++ /dev/null @@ -1,40 +0,0 @@ -/********** -Copyright 1990 Regents of the University of California. All rights reserved. -Author: 1995 Min-Chie Jeng and Mansun Chan. -File: b3v0getic.c -**********/ - -#include "ngspice/ngspice.h" -#include "ngspice/cktdefs.h" -#include "bsim3v0def.h" -#include "ngspice/sperror.h" -#include "ngspice/suffix.h" - - -int -BSIM3v0getic(GENmodel *inModel, CKTcircuit *ckt) -{ -BSIM3v0model *model = (BSIM3v0model*)inModel; -BSIM3v0instance *here; - - for (; model ; model = BSIM3v0nextModel(model)) - { for (here = BSIM3v0instances(model); here; here = BSIM3v0nextInstance(here)) - { - if(!here->BSIM3v0icVBSGiven) - { here->BSIM3v0icVBS = *(ckt->CKTrhs + here->BSIM3v0bNode) - - *(ckt->CKTrhs + here->BSIM3v0sNode); - } - if (!here->BSIM3v0icVDSGiven) - { here->BSIM3v0icVDS = *(ckt->CKTrhs + here->BSIM3v0dNode) - - *(ckt->CKTrhs + here->BSIM3v0sNode); - } - if (!here->BSIM3v0icVGSGiven) - { here->BSIM3v0icVGS = *(ckt->CKTrhs + here->BSIM3v0gNode) - - *(ckt->CKTrhs + here->BSIM3v0sNode); - } - } - } - return(OK); -} - - diff --git a/src/spicelib/devices/bsim3v0/b3v0ld.c b/src/spicelib/devices/bsim3v0/b3v0ld.c deleted file mode 100644 index 705f308c6..000000000 --- a/src/spicelib/devices/bsim3v0/b3v0ld.c +++ /dev/null @@ -1,1934 +0,0 @@ -/********** -Copyright 1990 Regents of the University of California. All rights reserved. -Author: 1991 JianHui Huang and Min-Chie Jeng. -File: b3ld.c 1/3/92 -Modified by Mansun Chan (1995) -**********/ - -#include "ngspice/ngspice.h" -#include "ngspice/cktdefs.h" -#include "bsim3v0def.h" -#include "ngspice/trandefs.h" -#include "ngspice/const.h" -#include "ngspice/sperror.h" -#include "ngspice/devdefs.h" -#include "ngspice/suffix.h" - -#define MAX_EXP 5.834617425e14 -#define MIN_EXP 1.713908431e-15 -#define EXP_THRESHOLD 34.0 -#define EPSOX 3.453133e-11 -#define EPSSI 1.03594e-10 -#define Charge_q 1.60219e-19 -#define DELTA_1 0.02 -#define DELTA_2 0.02 -#define DELTA_3 0.02 -#define DELTA_4 0.02 - - -int -BSIM3v0load(GENmodel *inModel, CKTcircuit *ckt) -{ -BSIM3v0model *model = (BSIM3v0model*)inModel; -BSIM3v0instance *here; -double SourceSatCurrent, DrainSatCurrent; -double ag0, qgd, qgs, qgb, von, cbhat = 0.0, VgstNVt, ExpVgst = 0.0; -double cdrain, cdhat = 0.0, cdreq, ceqbd, ceqbs, ceqqb, ceqqd, ceqqg, ceq, geq; -double czbd, czbdsw, czbs, czbssw, evbd, evbs, arg, sarg; -double delvbd, delvbs, delvds, delvgd, delvgs; -double Vfbeff, dVfbeff_dVg, dVfbeff_dVd, dVfbeff_dVb, V3, V4; -double gcbdb, gcbgb, gcbsb, gcddb, gcdgb, gcdsb, gcgdb, gcggb, gcgsb, gcsdb; -#ifndef NEWCONV -double tol; -#endif -double gcsgb, gcssb, PhiB, PhiBSW, MJ, MJSW; -double vbd, vbs, vds, vgb, vgd, vgs, vgdo; -#ifndef PREDICTOR -double xfact; -#endif -double qgate = 0.0, qbulk = 0.0, qdrn = 0.0, qsrc, cqgate, cqbulk, cqdrn; -double Vds, Vgs, Vbs, Gmbs, FwdSum, RevSum; -double Vgs_eff, Vfb, dVfb_dVb, dVfb_dVd; -double Phis, dPhis_dVb, sqrtPhis, dsqrtPhis_dVb, Vth, dVth_dVb, dVth_dVd; -double Vgst, dVgs_eff_dVg; -double n, dn_dVb, Vtm; -double ExpArg; -double Denomi, dDenomi_dVg, dDenomi_dVd, dDenomi_dVb; -double ueff, dueff_dVg, dueff_dVd, dueff_dVb; -double Esat, Vdsat; -double EsatL, dEsatL_dVg, dEsatL_dVd, dEsatL_dVb; -double dVdsat_dVg, dVdsat_dVb, dVdsat_dVd, Vasat; -double dVasat_dVg, dVasat_dVb, dVasat_dVd, Va, dVa_dVd, dVa_dVg, dVa_dVb; -double Vbseff, dVbseff_dVb, VbseffCV, dVbseffCV_dVb; -double Arg1, One_Third_CoxWL, Two_Third_CoxWL, CoxWL; -double T0, dT0_dVg, dT0_dVd, dT0_dVb; -double T1, dT1_dVg, dT1_dVd, dT1_dVb; -double T2, dT2_dVg, dT2_dVd, dT2_dVb; -double T3, dT3_dVg, dT3_dVd, dT3_dVb; -double T4, dT4_dVg, dT4_dVd, dT4_dVb; -double T5; -double T6; -double T7; -double T8; -double T10; -double Abulk, dAbulk_dVb, Abulk0, dAbulk0_dVb; -double VACLM, dVACLM_dVg, dVACLM_dVd, dVACLM_dVb; -double VADIBL, dVADIBL_dVg, dVADIBL_dVd, dVADIBL_dVb; -double Xdep, dXdep_dVb, lt1, dlt1_dVb, ltw, dltw_dVb, Delt_vth, dDelt_vth_dVb; -double Theta0, dTheta0_dVb; -double TempRatio, tmp1, tmp2, tmp3, tmp4; -double DIBL_Sft, dDIBL_Sft_dVd, Pmos_factor; -#ifndef NOBYPASS -double tempv; -#endif -double a1; - -double Vgsteff, dVgsteff_dVg, dVgsteff_dVd, dVgsteff_dVb; -double Vdseff, dVdseff_dVg, dVdseff_dVd, dVdseff_dVb; -double VdseffCV, dVdseffCV_dVg, dVdseffCV_dVd, dVdseffCV_dVb; -double diffVds; -double dAbulk_dVg, dn_dVd ; -double beta, dbeta_dVg, dbeta_dVd, dbeta_dVb; -double gche, dgche_dVg, dgche_dVd, dgche_dVb; -double fgche1, dfgche1_dVg, dfgche1_dVd, dfgche1_dVb; -double fgche2, dfgche2_dVg, dfgche2_dVd, dfgche2_dVb; -double Idl, dIdl_dVg, dIdl_dVd, dIdl_dVb; -double Idsa, dIdsa_dVg, dIdsa_dVd, dIdsa_dVb; -double Ids, Gm, Gds, Gmb; -double Isub, Gbd, Gbg, Gbb; -double VASCBE, dVASCBE_dVg, dVASCBE_dVd, dVASCBE_dVb; -double CoxWovL; -double Rds, dRds_dVg, dRds_dVb, WVCox, WVCoxRds; -double Vgst2Vtm, VdsatCV, dVdsatCV_dVg, dVdsatCV_dVb; -double Leff = 0.0, Weff, dWeff_dVg, dWeff_dVb; -double AbulkCV, dAbulkCV_dVb; -double qgdo, qgso, cgdo, cgso; - -double qcheq, qdef, gqdef, cqdef, cqcheq, gtau_diff, gtau_drift; -double gcqdb,gcqsb,gcqgb,gcqbb; -double dxpart, sxpart; - -double gbspsp, gbbdp, gbbsp, gbspg, gbspb, gbspdp; -double gbdpdp, gbdpg, gbdpb, gbdpsp; -double Cgg, Cgd, Cgb; -double Csg, Csd, Csb, Cbg, Cbd, Cbb; -double Cgg1, Cgb1, Cgd1, Cbg1, Cbb1, Cbd1, Qac0, Qsub0; -double dQac0_dVg, dQac0_dVd, dQac0_dVb, dQsub0_dVg, dQsub0_dVd, dQsub0_dVb; - -struct bsim3v0SizeDependParam *pParam; -int ByPass, Check, ChargeComputationNeeded = 0, error; -double m = 1.0; - -for (; model != NULL; model = BSIM3v0nextModel(model)) -{ for (here = BSIM3v0instances(model); here != NULL; - here = BSIM3v0nextInstance(here)) - { - Check = 1; - ByPass = 0; - pParam = here->pParam; - if ((ckt->CKTmode & MODEINITSMSIG)) - { vbs = *(ckt->CKTstate0 + here->BSIM3v0vbs); - vgs = *(ckt->CKTstate0 + here->BSIM3v0vgs); - vds = *(ckt->CKTstate0 + here->BSIM3v0vds); - qdef = *(ckt->CKTstate0 + here->BSIM3v0qcdump); - } - else if ((ckt->CKTmode & MODEINITTRAN)) - { vbs = *(ckt->CKTstate1 + here->BSIM3v0vbs); - vgs = *(ckt->CKTstate1 + here->BSIM3v0vgs); - vds = *(ckt->CKTstate1 + here->BSIM3v0vds); - qdef = *(ckt->CKTstate1 + here->BSIM3v0qcdump); - } - else if ((ckt->CKTmode & MODEINITJCT) && !here->BSIM3v0off) - { vds = model->BSIM3v0type * here->BSIM3v0icVDS; - vgs = model->BSIM3v0type * here->BSIM3v0icVGS; - vbs = model->BSIM3v0type * here->BSIM3v0icVBS; - qdef = 0.0; - - if ((vds == 0.0) && (vgs == 0.0) && (vbs == 0.0) && - ((ckt->CKTmode & (MODETRAN | MODEAC|MODEDCOP | - MODEDCTRANCURVE)) || (!(ckt->CKTmode & MODEUIC)))) - { vbs = 0.0; - vgs = pParam->BSIM3v0vth0 + 0.1; - vds = 0.1; - } - } - else if ((ckt->CKTmode & (MODEINITJCT | MODEINITFIX)) && - (here->BSIM3v0off)) - { qdef = vbs = vgs = vds = 0.0; - } - else - { -#ifndef PREDICTOR - if ((ckt->CKTmode & MODEINITPRED)) - { xfact = ckt->CKTdelta / ckt->CKTdeltaOld[1]; - *(ckt->CKTstate0 + here->BSIM3v0vbs) = - *(ckt->CKTstate1 + here->BSIM3v0vbs); - vbs = (1.0 + xfact)* (*(ckt->CKTstate1 + here->BSIM3v0vbs)) - - (xfact * (*(ckt->CKTstate2 + here->BSIM3v0vbs))); - *(ckt->CKTstate0 + here->BSIM3v0vgs) = - *(ckt->CKTstate1 + here->BSIM3v0vgs); - vgs = (1.0 + xfact)* (*(ckt->CKTstate1 + here->BSIM3v0vgs)) - - (xfact * (*(ckt->CKTstate2 + here->BSIM3v0vgs))); - *(ckt->CKTstate0 + here->BSIM3v0vds) = - *(ckt->CKTstate1 + here->BSIM3v0vds); - vds = (1.0 + xfact)* (*(ckt->CKTstate1 + here->BSIM3v0vds)) - - (xfact * (*(ckt->CKTstate2 + here->BSIM3v0vds))); - *(ckt->CKTstate0 + here->BSIM3v0vbd) = - *(ckt->CKTstate0 + here->BSIM3v0vbs) - - *(ckt->CKTstate0 + here->BSIM3v0vds); - qdef = (1.0 + xfact)* (*(ckt->CKTstate1 + here->BSIM3v0qcdump)) - -(xfact * (*(ckt->CKTstate2 + here->BSIM3v0qcdump))); - } - else - { -#endif /* PREDICTOR */ - vbs = model->BSIM3v0type - * (*(ckt->CKTrhsOld + here->BSIM3v0bNode) - - *(ckt->CKTrhsOld + here->BSIM3v0sNodePrime)); - vgs = model->BSIM3v0type - * (*(ckt->CKTrhsOld + here->BSIM3v0gNode) - - *(ckt->CKTrhsOld + here->BSIM3v0sNodePrime)); - vds = model->BSIM3v0type - * (*(ckt->CKTrhsOld + here->BSIM3v0dNodePrime) - - *(ckt->CKTrhsOld + here->BSIM3v0sNodePrime)); - qdef = *(ckt->CKTrhsOld + here->BSIM3v0qNode); -#ifndef PREDICTOR - } -#endif /* PREDICTOR */ - - vbd = vbs - vds; - vgd = vgs - vds; - vgdo = *(ckt->CKTstate0 + here->BSIM3v0vgs) - - *(ckt->CKTstate0 + here->BSIM3v0vds); - delvbs = vbs - *(ckt->CKTstate0 + here->BSIM3v0vbs); - delvbd = vbd - *(ckt->CKTstate0 + here->BSIM3v0vbd); - delvgs = vgs - *(ckt->CKTstate0 + here->BSIM3v0vgs); - delvds = vds - *(ckt->CKTstate0 + here->BSIM3v0vds); - delvgd = vgd - vgdo; - - if (here->BSIM3v0mode >= 0) - { cdhat = here->BSIM3v0cd - here->BSIM3v0gbd * delvbd - + here->BSIM3v0gmbs * delvbs + here->BSIM3v0gm * delvgs - + here->BSIM3v0gds * delvds; - } - else - { cdhat = here->BSIM3v0cd - (here->BSIM3v0gbd - here->BSIM3v0gmbs) - * delvbd - here->BSIM3v0gm * delvgd - + here->BSIM3v0gds * delvds; - - } - cbhat = here->BSIM3v0cbs + here->BSIM3v0cbd + here->BSIM3v0gbd - * delvbd + here->BSIM3v0gbs * delvbs; - -#ifndef NOBYPASS - /* following should be one big if connected by && all over - * the place, but some C compilers can't handle that, so - * we split it up here to let them digest it in stages - */ - - if ((!(ckt->CKTmode & MODEINITPRED)) && (ckt->CKTbypass)) - if ((fabs(delvbs) < (ckt->CKTreltol * MAX(fabs(vbs), - fabs(*(ckt->CKTstate0+here->BSIM3v0vbs))) + ckt->CKTvoltTol))) - if ((fabs(delvbd) < (ckt->CKTreltol * MAX(fabs(vbd), - fabs(*(ckt->CKTstate0+here->BSIM3v0vbd))) + ckt->CKTvoltTol))) - if ((fabs(delvgs) < (ckt->CKTreltol * MAX(fabs(vgs), - fabs(*(ckt->CKTstate0+here->BSIM3v0vgs))) + ckt->CKTvoltTol))) - if ((fabs(delvds) < (ckt->CKTreltol * MAX(fabs(vds), - fabs(*(ckt->CKTstate0+here->BSIM3v0vds))) + ckt->CKTvoltTol))) - if ((fabs(cdhat - here->BSIM3v0cd) < ckt->CKTreltol - * MAX(fabs(cdhat),fabs(here->BSIM3v0cd)) + ckt->CKTabstol)) - { tempv = MAX(fabs(cbhat),fabs(here->BSIM3v0cbs - + here->BSIM3v0cbd)) + ckt->CKTabstol; - if ((fabs(cbhat - (here->BSIM3v0cbs + here->BSIM3v0cbd)) - < ckt->CKTreltol * tempv)) - { /* bypass code */ - vbs = *(ckt->CKTstate0 + here->BSIM3v0vbs); - vbd = *(ckt->CKTstate0 + here->BSIM3v0vbd); - vgs = *(ckt->CKTstate0 + here->BSIM3v0vgs); - vds = *(ckt->CKTstate0 + here->BSIM3v0vds); - qcheq = *(ckt->CKTstate0 + here->BSIM3v0qcheq); - - vgd = vgs - vds; - vgb = vgs - vbs; - - cdrain = here->BSIM3v0mode * (here->BSIM3v0cd - + here->BSIM3v0cbd); - if ((ckt->CKTmode & (MODETRAN | MODEAC)) || - ((ckt->CKTmode & MODETRANOP) && - (ckt->CKTmode & MODEUIC))) - { ByPass = 1; - goto line755; - } - else - { goto line850; - } - } - } - -#endif /*NOBYPASS*/ - von = here->BSIM3v0von; - if (*(ckt->CKTstate0 + here->BSIM3v0vds) >= 0.0) - { vgs = DEVfetlim(vgs, *(ckt->CKTstate0+here->BSIM3v0vgs), von); - vds = vgs - vgd; - vds = DEVlimvds(vds, *(ckt->CKTstate0 + here->BSIM3v0vds)); - vgd = vgs - vds; - - } - else - { vgd = DEVfetlim(vgd, vgdo, von); - vds = vgs - vgd; - vds = -DEVlimvds(-vds, -(*(ckt->CKTstate0+here->BSIM3v0vds))); - vgs = vgd + vds; - } - - if (vds >= 0.0) - { vbs = DEVpnjlim(vbs, *(ckt->CKTstate0 + here->BSIM3v0vbs), - CONSTvt0, model->BSIM3v0vcrit, &Check); - vbd = vbs - vds; - - } - else - { vbd = DEVpnjlim(vbd, *(ckt->CKTstate0 + here->BSIM3v0vbd), - CONSTvt0, model->BSIM3v0vcrit, &Check); - vbs = vbd + vds; - } - } - - /* determine DC current and derivatives */ - vbd = vbs - vds; - vgd = vgs - vds; - vgb = vgs - vbs; - - m = here->BSIM3v0m; - - SourceSatCurrent = here->BSIM3v0sourceArea*model->BSIM3v0jctSatCurDensity; - if (here->BSIM3v0sourceArea <= 0.0) - SourceSatCurrent = 1.0e-14; - if (SourceSatCurrent <= 0.0) - { here->BSIM3v0gbs = ckt->CKTgmin; - here->BSIM3v0cbs = here->BSIM3v0gbs * vbs; - } - else if (vbs <= -0.5) - { here->BSIM3v0gbs = ckt->CKTgmin; - here->BSIM3v0cbs = -SourceSatCurrent + here->BSIM3v0gbs * vbs; - } - else if (vbs < 0.5) - { evbs = exp(vbs / CONSTvt0); - here->BSIM3v0gbs = SourceSatCurrent * evbs / CONSTvt0 - + ckt->CKTgmin; - here->BSIM3v0cbs = SourceSatCurrent * (evbs - 1.0) - + ckt->CKTgmin * vbs; - } - else - { evbs = exp(0.5 / CONSTvt0); - here->BSIM3v0gbs = SourceSatCurrent * evbs / CONSTvt0 - + ckt->CKTgmin; - here->BSIM3v0cbs = SourceSatCurrent * (evbs - 1.0) - + ckt->CKTgmin * 0.5; - } - - DrainSatCurrent = here->BSIM3v0drainArea * model->BSIM3v0jctSatCurDensity; - if (here->BSIM3v0drainArea <= 0.0) - DrainSatCurrent = 1.0e-14; - if (DrainSatCurrent <= 0.0) - { here->BSIM3v0gbd = ckt->CKTgmin; - here->BSIM3v0cbd = here->BSIM3v0gbd * vbd; - } - else if (vbd <= -0.5) - { here->BSIM3v0gbd = ckt->CKTgmin; - here->BSIM3v0cbd = -DrainSatCurrent + here->BSIM3v0gbd * vbd; - } - else if (vbd < 0.5) - { evbd = exp(vbd/CONSTvt0); - here->BSIM3v0gbd = DrainSatCurrent * evbd / CONSTvt0 - + ckt->CKTgmin; - here->BSIM3v0cbd = DrainSatCurrent * (evbd - 1.0) - + ckt->CKTgmin * vbd; - } - else - { evbd = exp(0.5/CONSTvt0); - here->BSIM3v0gbd = DrainSatCurrent * evbd / CONSTvt0 - + ckt->CKTgmin; - here->BSIM3v0cbd = DrainSatCurrent * (evbd - 1.0) - + ckt->CKTgmin * 0.5; - } - - if (vds >= 0.0) - { /* normal mode */ - here->BSIM3v0mode = 1; - Vds = vds; - Vgs = vgs; - Vbs = vbs; - } - else - { /* inverse mode */ - here->BSIM3v0mode = -1; - Vds = -vds; - Vgs = vgd; - Vbs = vbd; - } - - ChargeComputationNeeded = - ((ckt->CKTmode & (MODEAC | MODETRAN | MODEINITSMSIG)) || - ((ckt->CKTmode & MODETRANOP) && (ckt->CKTmode & MODEUIC))) - ? 1 : 0; - - T0 = Vbs - pParam->BSIM3v0vbsc - 0.001; - T1 = sqrt(T0 * T0 - 0.004 * pParam->BSIM3v0vbsc); - Vbseff = pParam->BSIM3v0vbsc + 0.5 * (T0 + T1); - dVbseff_dVb = 0.5 * (1.0 + T0 / T1); - - if (Vbseff > 0.0) - { T0 = pParam->BSIM3v0phi / (pParam->BSIM3v0phi + Vbseff); - Phis = pParam->BSIM3v0phi * T0; - dPhis_dVb = -T0 * T0; - sqrtPhis = pParam->BSIM3v0phis3 / (pParam->BSIM3v0phi + 0.5 * Vbseff); - dsqrtPhis_dVb = -0.5 * sqrtPhis * sqrtPhis / pParam->BSIM3v0phis3; - } - else - { Phis = pParam->BSIM3v0phi - Vbseff; - dPhis_dVb = -1.0; - sqrtPhis = sqrt(Phis); - dsqrtPhis_dVb = -0.5 / sqrtPhis; - } - Xdep = pParam->BSIM3v0Xdep0 * sqrtPhis / pParam->BSIM3v0sqrtPhi; - dXdep_dVb = (pParam->BSIM3v0Xdep0 / pParam->BSIM3v0sqrtPhi) - * dsqrtPhis_dVb; - - Leff = pParam->BSIM3v0leff; -/* Vth Calculation */ - if ((T1 = 1.0 + pParam->BSIM3v0dvt2 * Vbseff) < 1.0e-10) - T1 = 1.0E-10; - if ((T2 = 1.0 + pParam->BSIM3v0dvt2w * Vbseff) < 1.0E-10) - T2 = 1.0E-10; - - T3 = sqrt(Xdep); - lt1 = model->BSIM3v0factor1 * T3 * T1; - dlt1_dVb = model->BSIM3v0factor1 * (0.5 / T3 * T1 * dXdep_dVb - + T3 * pParam->BSIM3v0dvt2); - - ltw = model->BSIM3v0factor1 * T3 * T2; - dltw_dVb = model->BSIM3v0factor1 * (0.5 / T3 * T2 * dXdep_dVb - + T3 * pParam->BSIM3v0dvt2w); - - T0 = -0.5 * pParam->BSIM3v0dvt1 * Leff / lt1; - if (T0 > -EXP_THRESHOLD) - { T1 = exp(T0); - dT1_dVb = -T0 / lt1 * T1 * dlt1_dVb; - } - else - { T1 = MIN_EXP; - dT1_dVb = 0.0; - } - - Theta0 = T1 * (1.0 + 2.0 * T1); - dTheta0_dVb = (1.0 + 4.0 * T1) * dT1_dVb; - - here->BSIM3v0thetavth = pParam->BSIM3v0dvt0 * Theta0; - T0 = pParam->BSIM3v0vbi - pParam->BSIM3v0phi; - Delt_vth = here->BSIM3v0thetavth * T0; - dDelt_vth_dVb = pParam->BSIM3v0dvt0 * dTheta0_dVb * T0; - - T0 = -0.5 * pParam->BSIM3v0dvt1w * pParam->BSIM3v0weff * Leff / ltw; - if (T0 > -EXP_THRESHOLD) - { T1 = exp(T0); - dT1_dVb = -T0 / ltw * T1 * dltw_dVb; - } - else - { T1 = MIN_EXP; - dT1_dVb = 0.0; - } - - T2 = T1 * (1.0 + 2.0 * T1); - dT2_dVb = (1.0 + 4.0 * T1) * dT1_dVb; - - T0 = pParam->BSIM3v0dvt0w * T2; - T1 = pParam->BSIM3v0vbi - pParam->BSIM3v0phi; - T2 = T0 * T1; - dT2_dVb = pParam->BSIM3v0dvt0w * dT2_dVb * T1; - - TempRatio = ckt->CKTtemp / model->BSIM3v0tnom - 1.0; - T0 = sqrt(1.0 + pParam->BSIM3v0nlx / Leff); - T1 = pParam->BSIM3v0k1 * (T0 - 1.0) * pParam->BSIM3v0sqrtPhi - + (pParam->BSIM3v0kt1 + pParam->BSIM3v0kt1l / Leff - + pParam->BSIM3v0kt2 * Vbseff) * TempRatio; - tmp2 = model->BSIM3v0tox / (pParam->BSIM3v0weff - + pParam->BSIM3v0w0) * pParam->BSIM3v0phi; - - dDIBL_Sft_dVd = (pParam->BSIM3v0eta0 + pParam->BSIM3v0etab - * Vbseff) * pParam->BSIM3v0theta0vb0; - DIBL_Sft = dDIBL_Sft_dVd * Vds; - - Vth = model->BSIM3v0type * pParam->BSIM3v0vth0 + pParam->BSIM3v0k1 - * (sqrtPhis - pParam->BSIM3v0sqrtPhi) - pParam->BSIM3v0k2 - * Vbseff - Delt_vth - T2 + (pParam->BSIM3v0k3 + pParam->BSIM3v0k3b - * Vbseff) * tmp2 + T1 - DIBL_Sft; - - here->BSIM3v0von = Vth; - - dVth_dVb = pParam->BSIM3v0k1 * dsqrtPhis_dVb - pParam->BSIM3v0k2 - - dDelt_vth_dVb - dT2_dVb + pParam->BSIM3v0k3b * tmp2 - - pParam->BSIM3v0etab * Vds * pParam->BSIM3v0theta0vb0 - + pParam->BSIM3v0kt2 * TempRatio; - dVth_dVd = -dDIBL_Sft_dVd; - -/* Calculate n */ - tmp2 = pParam->BSIM3v0nfactor * EPSSI / Xdep; - tmp3 = pParam->BSIM3v0cdsc + pParam->BSIM3v0cdscb * Vbseff - + pParam->BSIM3v0cdscd * Vds; - n = 1.0 + (tmp2 + tmp3 * Theta0 + pParam->BSIM3v0cit) / model->BSIM3v0cox; - if (n > 1.0) - { dn_dVb = (-tmp2 / Xdep * dXdep_dVb + tmp3 * dTheta0_dVb - + pParam->BSIM3v0cdscb * Theta0) / model->BSIM3v0cox; - dn_dVd = pParam->BSIM3v0cdscd * Theta0 / model->BSIM3v0cox; - } - else - { n = 1.0; - dn_dVb = dn_dVd = 0.0; - } - -/* Poly Gate Si Depletion Effect */ - T0 = pParam->BSIM3v0vfb + pParam->BSIM3v0phi; - if (model->BSIM3v0ngateGiven && (Vgs > T0)) - { T1 = 1.0e6 * Charge_q * EPSSI * pParam->BSIM3v0ngate - / (model->BSIM3v0cox * model->BSIM3v0cox); - T4 = sqrt(1.0 + 2.0 * (Vgs - T0) / T1); - T2 = T1 * (T4 - 1.0); - T3 = 0.5 * T2 * T2 / T1; - - if (T3 < 1.12) - { Vgs_eff = T0 + T2; - dVgs_eff_dVg = 1.0 / T4; - } - else - { Vgs_eff = Vgs - 1.12; - dVgs_eff_dVg = 1.0; - } - } - else - { Vgs_eff = Vgs; - dVgs_eff_dVg = 1.0; - } - Vgst = Vgs_eff - Vth; - -/* Effective Vgst (Vgsteff) Calculation */ - Vtm = model->BSIM3v0vtm; - - T10 = 2.0 * n * Vtm; - VgstNVt = Vgst / T10; - if (VgstNVt < -EXP_THRESHOLD) - { T1 = T10 * MIN_EXP; - dT1_dVg = dT1_dVd = dT1_dVb = 0.0; - } - else if (VgstNVt > EXP_THRESHOLD) - { T1 = Vgst; - dT1_dVg = dVgs_eff_dVg; - dT1_dVd = -dVth_dVd; - dT1_dVb = -dVth_dVb; - } - else - { ExpVgst = exp(VgstNVt); - T1 = T10 * log(1.0 + ExpVgst); - dT1_dVg = ExpVgst / (1.0 + ExpVgst); - dT1_dVb = -dT1_dVg * (dVth_dVb + Vgst / n * dn_dVb) - + T1 / n * dn_dVb; - dT1_dVd = -dT1_dVg * (dVth_dVd + Vgst / n * dn_dVd) - + T1 / n * dn_dVd; - dT1_dVg *= dVgs_eff_dVg; - } - - T2 = model->BSIM3v0tox / (pParam->BSIM3v0weff + pParam->BSIM3v0w0); - ExpArg = (2.0 * pParam->BSIM3v0voff - Vgst) / T10; - if (ExpArg < -EXP_THRESHOLD) - { T2 = 1.0; - dT2_dVg = dT2_dVd = dT2_dVb = 0.0; - - } - else if (ExpArg > EXP_THRESHOLD) - { T2 = 1.0 + 2.0 * n * model->BSIM3v0cox / pParam->BSIM3v0cdep0 - * MAX_EXP; - dT2_dVg = dT2_dVd = dT2_dVb = 0.0; - } - else - { dT2_dVg = -model->BSIM3v0cox / Vtm / pParam->BSIM3v0cdep0 - * exp(ExpArg); - T2 = 1.0 - T10 * dT2_dVg; - dT2_dVd = -dT2_dVg * (dVth_dVd - 2.0 * Vtm - * ExpArg * dn_dVd) + (T2 - 1.0) / n * dn_dVd; - dT2_dVb = -dT2_dVg * (dVth_dVb - 2.0 * Vtm - * ExpArg * dn_dVb) + (T2 - 1.0) / n * dn_dVb; - dT2_dVg *= dVgs_eff_dVg; - } - - Vgsteff = T1 / T2; - dVgsteff_dVg = (T2 * dT1_dVg - T1 * dT2_dVg) / (T2 * T2); - dVgsteff_dVd = (T2 * dT1_dVd - T1 * dT2_dVd) / (T2 * T2); - dVgsteff_dVb = (T2 * dT1_dVb - T1 * dT2_dVb) / (T2 * T2); - -/* Calculate Effective Channel Geometry */ - Weff = pParam->BSIM3v0weff - 2.0 * (pParam->BSIM3v0dwg * Vgsteff - + pParam->BSIM3v0dwb * (sqrtPhis - pParam->BSIM3v0sqrtPhi)); - dWeff_dVg = -2.0 * pParam->BSIM3v0dwg; - dWeff_dVb = -2.0 * pParam->BSIM3v0dwb * dsqrtPhis_dVb; - - if (Weff < 1.0e-8) - { Weff = 1.0e-8; - dWeff_dVg = dWeff_dVb = 0; - } - - Rds = pParam->BSIM3v0rds0 * (1.0 + pParam->BSIM3v0prwg * Vgsteff - + pParam->BSIM3v0prwb * (sqrtPhis - pParam->BSIM3v0sqrtPhi)); - if (Rds > 0.0) - { dRds_dVg = pParam->BSIM3v0rds0 * pParam->BSIM3v0prwg; - dRds_dVb = pParam->BSIM3v0rds0 * pParam->BSIM3v0prwb * dsqrtPhis_dVb; - } - else - { Rds = dRds_dVg = dRds_dVb = 0.0; - } - - WVCox = Weff * pParam->BSIM3v0vsattemp * model->BSIM3v0cox; - WVCoxRds = WVCox * Rds; - -/* Calculate Abulk */ - T0 = 1.0 / (1.0 + pParam->BSIM3v0keta * Vbseff); - dT0_dVb = -pParam->BSIM3v0keta * T0 * T0; - - T1 = 0.5 * pParam->BSIM3v0k1 / sqrtPhis; - dT1_dVb = -T1 / sqrtPhis * dsqrtPhis_dVb; - - tmp1 = Leff + 2.0 * sqrt(pParam->BSIM3v0xj * Xdep); - T5 = Leff / tmp1; - tmp2 = pParam->BSIM3v0a0 *T5; - tmp3 = pParam->BSIM3v0weff + pParam->BSIM3v0b1; - tmp4 = pParam->BSIM3v0b0 / tmp3; - T2 = tmp2 + tmp4; - dT2_dVb = -tmp2 / tmp1 * sqrt(pParam->BSIM3v0xj / Xdep) * dXdep_dVb; - T6 = T5 * T5; - T7 = T5 * T6; - Abulk0 = T0 * (1.0 + T1 * T2); - if (Abulk0 < 0.01) - Abulk0= 0.01; - T8 = pParam->BSIM3v0ags * pParam->BSIM3v0a0 * T7; - dAbulk_dVg = -T1 * T0 * T8; - Abulk = Abulk0 + dAbulk_dVg * Vgsteff; - if (Abulk < 0.01) - Abulk= 0.01; - - dAbulk0_dVb = T0 * T1 * dT2_dVb + T0 * T2 * dT1_dVb - + (1.0 + T1 * T2) * dT0_dVb; - dAbulk_dVb = dAbulk0_dVb - T8 * Vgsteff * (T1 * (3.0 * T0 * dT2_dVb - / tmp2 + dT0_dVb) + T0 * dT1_dVb); -/* Mobility calculation */ - - if (model->BSIM3v0mobMod == 1) - { T0 = Vgsteff + Vth + Vth; - T2 = pParam->BSIM3v0ua + pParam->BSIM3v0uc * Vbseff; - T3 = T0 / model->BSIM3v0tox; - Denomi = 1.0 + T3 * (T2 - + pParam->BSIM3v0ub * T3); - T1 = T2 / model->BSIM3v0tox + 2.0 * pParam->BSIM3v0ub * T3 - / model->BSIM3v0tox; - dDenomi_dVg = T1; - dDenomi_dVd = T1 * 2.0 * dVth_dVd; - dDenomi_dVb = T1 * 2.0 * dVth_dVb + pParam->BSIM3v0uc * T3; - } - else if (model->BSIM3v0mobMod == 2) - { Denomi = 1.0 + Vgsteff / model->BSIM3v0tox * (pParam->BSIM3v0ua - + pParam->BSIM3v0uc * Vbseff + pParam->BSIM3v0ub * Vgsteff - / model->BSIM3v0tox); - T1 = (pParam->BSIM3v0ua + pParam->BSIM3v0uc * Vbseff) / model->BSIM3v0tox - + 2.0 * pParam->BSIM3v0ub / (model->BSIM3v0tox * model->BSIM3v0tox) - * Vgsteff; - dDenomi_dVg = T1; - dDenomi_dVd = 0.0; - dDenomi_dVb = Vgsteff * pParam->BSIM3v0uc / model->BSIM3v0tox; - } - else - { T0 = Vgsteff + Vth + Vth; - T2 = 1.0 + pParam->BSIM3v0uc * Vbseff; - T3 = T0 / model->BSIM3v0tox; - T4 = T3 * (pParam->BSIM3v0ua + pParam->BSIM3v0ub * T3); - Denomi = 1.0 + T4 * T2; - - T1 = (pParam->BSIM3v0ua / model->BSIM3v0tox + 2.0 * pParam->BSIM3v0ub - * T3 / model->BSIM3v0tox) * T2; - dDenomi_dVg = T1; - dDenomi_dVd = T1 * 2.0 * dVth_dVd; - dDenomi_dVb = T1 * 2.0 * dVth_dVb + pParam->BSIM3v0uc * T4; - } - - here->BSIM3v0ueff = ueff = pParam->BSIM3v0u0temp / Denomi; - dueff_dVg = -ueff / Denomi * dDenomi_dVg; - dueff_dVd = -ueff / Denomi * dDenomi_dVd; - dueff_dVb = -ueff / Denomi * dDenomi_dVb; - - -/* Saturation Drain Voltage Vdsat */ - Esat = 2.0 * pParam->BSIM3v0vsattemp / ueff; - EsatL = Esat * Leff; - T0 = -EsatL /ueff; - dEsatL_dVg = T0 * dueff_dVg; - dEsatL_dVd = T0 * dueff_dVd; - dEsatL_dVb = T0 * dueff_dVb; - - a1 = pParam->BSIM3v0a1; - if ((Pmos_factor = a1 * Vgsteff + pParam->BSIM3v0a2) > 1.0) - { Pmos_factor = 1.0; - a1 = 0.0; - } - - Vgst2Vtm = Vgsteff + 2.0 * Vtm; - if ((Rds == 0.0) && (Pmos_factor == 1.0)) - { T0 = 1.0 / (Abulk * EsatL + Vgst2Vtm); - here->BSIM3v0vdsat = Vdsat = EsatL * Vgst2Vtm * T0; - - dT0_dVg = -(Abulk * dEsatL_dVg +EsatL*dAbulk_dVg+ 1.0) * T0 * T0; - dT0_dVd = -(Abulk * dEsatL_dVd) * T0 * T0; - dT0_dVb = -(Abulk * dEsatL_dVb + dAbulk_dVb * EsatL) * T0 * T0; - - dVdsat_dVg = EsatL * Vgst2Vtm * dT0_dVg + EsatL * T0 - + Vgst2Vtm * T0 * dEsatL_dVg; - dVdsat_dVd = EsatL * Vgst2Vtm * dT0_dVd - + Vgst2Vtm * T0 * dEsatL_dVd; - dVdsat_dVb = EsatL * Vgst2Vtm * dT0_dVb - + Vgst2Vtm * T0 * dEsatL_dVb; - } - else - { tmp1 = a1 / (Pmos_factor * Pmos_factor); - if (Rds > 0) - { tmp2 = dRds_dVg / Rds + dWeff_dVg / Weff; - tmp3 = dRds_dVb / Rds + dWeff_dVb / Weff; - } - else - { tmp2 = dWeff_dVg / Weff; - tmp3 = dWeff_dVb / Weff; - } - - T0 = 2.0 * Abulk * (Abulk * WVCoxRds - 1.0 + 1.0 / Pmos_factor); - dT0_dVg = 2.0 * (Abulk * Abulk * WVCoxRds * tmp2 - Abulk * tmp1 - + (2.0 * WVCoxRds * Abulk + 1.0 / Pmos_factor - 1.0) - * dAbulk_dVg); - - dT0_dVb = 2.0 * (Abulk * Abulk * WVCoxRds * (2.0 / Abulk - * dAbulk_dVb + tmp3) + (1.0 / Pmos_factor - 1.0) - * dAbulk_dVb); - dT0_dVd= 0.0; - T1 = Vgst2Vtm * (2.0 / Pmos_factor - 1.0) + Abulk - * EsatL + 3.0 * Abulk * Vgst2Vtm * WVCoxRds; - - dT1_dVg = (2.0 / Pmos_factor - 1.0) - 2.0 * Vgst2Vtm * tmp1 - + Abulk * dEsatL_dVg + EsatL * dAbulk_dVg + 3.0 * (Abulk - * WVCoxRds + Abulk * Vgst2Vtm * WVCoxRds * tmp2 + Vgst2Vtm - * WVCoxRds * dAbulk_dVg); - dT1_dVb = Abulk * dEsatL_dVb + EsatL * dAbulk_dVb - + 3.0 * (Vgst2Vtm * WVCoxRds * dAbulk_dVb - + Abulk * Vgst2Vtm * WVCoxRds * tmp3); - dT1_dVd = Abulk * dEsatL_dVd; - - T2 = Vgst2Vtm * (EsatL + 2.0 * Vgst2Vtm * WVCoxRds); - dT2_dVg = EsatL + Vgst2Vtm * dEsatL_dVg + Vgst2Vtm * WVCoxRds - * (4.0 + 2.0 * Vgst2Vtm * tmp2); - dT2_dVb = Vgst2Vtm * dEsatL_dVb + 2.0 * Vgst2Vtm * WVCoxRds - * Vgst2Vtm * tmp3; - dT2_dVd = Vgst2Vtm * dEsatL_dVd; - - T3 = sqrt(T1 * T1 - 2.0 * T0 * T2); - here->BSIM3v0vdsat = Vdsat = (T1 - T3) / T0; - - dT3_dVg = (T1 * dT1_dVg - 2.0 * (T0 * dT2_dVg + T2 * dT0_dVg)) - / T3; - dT3_dVd = (T1 * dT1_dVd - 2.0 * (T0 * dT2_dVd + T2 * dT0_dVd)) - / T3; - dT3_dVb = (T1 * dT1_dVb - 2.0 * (T0 * dT2_dVb + T2 * dT0_dVb)) - / T3; - - T4 = T1 - T3; - dT4_dVg = - dT1_dVg - dT3_dVg; - dT4_dVd = - dT1_dVd - dT3_dVd; - dT4_dVb = - dT1_dVb - dT3_dVb; - - dVdsat_dVg = (dT1_dVg - (T1 * dT1_dVg - dT0_dVg * T2 - - T0 * dT2_dVg) / T3 - Vdsat * dT0_dVg) / T0; - dVdsat_dVb = (dT1_dVb - (T1 * dT1_dVb - dT0_dVb * T2 - - T0 * dT2_dVb) / T3 - Vdsat * dT0_dVb) / T0; - dVdsat_dVd = (dT1_dVd - (T1 * dT1_dVd - T0 * dT2_dVd) / T3) / T0; - } - -/* Effective Vds (Vdseff) Calculation */ - T1 = Vdsat - Vds - pParam->BSIM3v0delta; - dT1_dVg = dVdsat_dVg; - dT1_dVd = dVdsat_dVd - 1.0; - dT1_dVb = dVdsat_dVb; - - T2 = sqrt(T1 * T1 + 4.0 * pParam->BSIM3v0delta * Vdsat); - T0 = T1 / T2; - T3 = 2.0 * pParam->BSIM3v0delta / T2; - dT2_dVg = T0 * dT1_dVg + T3 * dVdsat_dVg; - dT2_dVd = T0 * dT1_dVd + T3 * dVdsat_dVd; - dT2_dVb = T0 * dT1_dVb + T3 * dVdsat_dVb; - - Vdseff = Vdsat - 0.5 * (T1 + T2); - dVdseff_dVg = dVdsat_dVg - 0.5 * (dT1_dVg + dT2_dVg); - dVdseff_dVd = dVdsat_dVd - 0.5 * (dT1_dVd + dT2_dVd); - dVdseff_dVb = dVdsat_dVb - 0.5 * (dT1_dVb + dT2_dVb); - -/* Calculate VAsat */ - tmp1 = a1 / (Pmos_factor * Pmos_factor); - if (Rds > 0) - { tmp2 = dRds_dVg / Rds + dWeff_dVg / Weff; - tmp3 = dRds_dVb / Rds + dWeff_dVb / Weff; - } - else - { tmp2 = dWeff_dVg / Weff; - tmp3 = dWeff_dVb / Weff; - } - tmp4 = 1.0 - 0.5 * Abulk * Vdsat / Vgst2Vtm; - T0 = EsatL + Vdsat + 2.0 * WVCoxRds * Vgsteff * tmp4; - - dT0_dVg = dEsatL_dVg + dVdsat_dVg + 2.0 * WVCoxRds * tmp4 - * (1.0 + tmp2 * Vgsteff) - WVCoxRds * Vgsteff / Vgst2Vtm - * (Abulk * dVdsat_dVg - Abulk * Vdsat / Vgst2Vtm - + Vdsat * dAbulk_dVg); - - dT0_dVb = dEsatL_dVb + dVdsat_dVb + 2.0 * WVCoxRds * tmp4 * tmp3 - * Vgsteff - WVCoxRds * Vgsteff / Vgst2Vtm * (dAbulk_dVb - * Vdsat + Abulk * dVdsat_dVb); - dT0_dVd = dEsatL_dVd + dVdsat_dVd - WVCoxRds * Vgsteff / Vgst2Vtm - * Abulk * dVdsat_dVd; - - T1 = 2.0 / Pmos_factor - 1.0 + WVCoxRds * Abulk; - dT1_dVg = -2.0 * tmp1 + WVCoxRds *(Abulk * tmp2+ dAbulk_dVg); - dT1_dVb = dAbulk_dVb * WVCoxRds + Abulk * WVCoxRds * tmp3; - - Vasat = T0 / T1; - dVasat_dVg = (dT0_dVg - T0 / T1 * dT1_dVg) / T1; - dVasat_dVb = (dT0_dVb - T0 / T1 * dT1_dVb) / T1; - dVasat_dVd = dT0_dVd / T1; - - diffVds = Vds - Vdseff; -/* Calculate VACLM */ - if (pParam->BSIM3v0pclm > 0.0) - { T0 = 1.0 / (pParam->BSIM3v0pclm * Abulk * pParam->BSIM3v0litl); - dT0_dVb = -T0 / Abulk * dAbulk_dVb; - dT0_dVg= - T0/Abulk*dAbulk_dVg; - - T2 = Vgsteff / EsatL; - T1 = Leff * (Abulk + T2); - dT1_dVg = Leff * ((1.0 - T2 * dEsatL_dVg) / EsatL+dAbulk_dVg); - dT1_dVb = Leff * (dAbulk_dVb - T2 * dEsatL_dVb / EsatL); - dT1_dVd = -T2 * dEsatL_dVd / Esat; - - VACLM = T0 * T1 * diffVds; - dVACLM_dVg = T0 * dT1_dVg * diffVds - T0 * T1 * dVdseff_dVg - + T1 * diffVds * dT0_dVg; - dVACLM_dVb = (dT0_dVb * T1 + T0 * dT1_dVb) * diffVds - - T0 * T1 * dVdseff_dVb; - dVACLM_dVd = T0 * dT1_dVd * diffVds - + T0 * T1 * (1.0 - dVdseff_dVd); - } - else - { VACLM = MAX_EXP; - dVACLM_dVd = dVACLM_dVg = dVACLM_dVb = 0.0; - } - -/* Calculate VADIBL */ - if (pParam->BSIM3v0thetaRout > 0.0) - { T0 = Vgst2Vtm * Abulk * Vdsat; - dT0_dVg = Vgst2Vtm * Abulk * dVdsat_dVg + Abulk * Vdsat - + Vgst2Vtm * Vdsat * dAbulk_dVg; - dT0_dVb = Vgst2Vtm * (dAbulk_dVb * Vdsat + Abulk * dVdsat_dVb); - dT0_dVd = Vgst2Vtm * Abulk * dVdsat_dVd; - - T1 = Vgst2Vtm + Abulk * Vdsat; - dT1_dVg = 1.0 + Abulk * dVdsat_dVg + Vdsat * dAbulk_dVg; - dT1_dVb = Abulk * dVdsat_dVb + dAbulk_dVb * Vdsat; - dT1_dVd = Abulk * dVdsat_dVd; - - T2 = pParam->BSIM3v0thetaRout * (1.0 + pParam->BSIM3v0pdiblb * Vbseff); - VADIBL = (Vgst2Vtm - T0 / T1) / T2; - dVADIBL_dVg = (1.0 - dT0_dVg / T1 + T0 * dT1_dVg / (T1 * T1)) / T2; - dVADIBL_dVb = ((-dT0_dVb / T1 + T0 * dT1_dVb / (T1 * T1)) - VADIBL - * pParam->BSIM3v0thetaRout * pParam->BSIM3v0pdiblb) / T2; - dVADIBL_dVd = (-dT0_dVd / T1 + T0 * dT1_dVd / (T1 * T1)) / T2; - } - else - { VADIBL = MAX_EXP; - dVADIBL_dVd = dVADIBL_dVg = dVADIBL_dVb = 0.0; - } - -/* Calculate VA */ - T0 = 1.0 + pParam->BSIM3v0pvag * Vgsteff / EsatL; - dT0_dVg = pParam->BSIM3v0pvag * (1.0 - Vgsteff * dEsatL_dVg - / EsatL) / EsatL; - dT0_dVb = -pParam->BSIM3v0pvag * Vgsteff * dEsatL_dVb - / EsatL / EsatL; - dT0_dVd = -pParam->BSIM3v0pvag * Vgsteff * dEsatL_dVd - / EsatL / EsatL; - - tmp1 = VACLM * VACLM; - tmp2 = VADIBL * VADIBL; - tmp3 = VACLM + VADIBL; - - T1 = VACLM * VADIBL / tmp3; - tmp3 *= tmp3; - dT1_dVg = (tmp1 * dVADIBL_dVg + tmp2 * dVACLM_dVg) / tmp3; - dT1_dVd = (tmp1 * dVADIBL_dVd + tmp2 * dVACLM_dVd) / tmp3; - dT1_dVb = (tmp1 * dVADIBL_dVb + tmp2 * dVACLM_dVb) / tmp3; - - Va = Vasat + T0 * T1; - dVa_dVg = dVasat_dVg + T1 * dT0_dVg + T0 * dT1_dVg; - dVa_dVd = dVasat_dVd + T1 * dT0_dVd + T0 * dT1_dVd; - dVa_dVb = dVasat_dVb + T1 * dT0_dVb + T0 * dT1_dVb; - -/* Calculate VASCBE */ - if ((diffVds) && ((T0 = pParam->BSIM3v0pscbe1 * pParam->BSIM3v0litl - / diffVds) > 0.0) && (T0 < EXP_THRESHOLD)) - { VASCBE = Leff * exp(T0) / pParam->BSIM3v0pscbe2; - T1 = T0 * VASCBE / diffVds; - dVASCBE_dVg = T1 * dVdseff_dVg; - dVASCBE_dVd = -T1 * (1.0 - dVdseff_dVd); - dVASCBE_dVb = T1 * dVdseff_dVb; - } - else - { VASCBE = MAX_EXP*Leff/pParam->BSIM3v0pscbe2; - dVASCBE_dVg = dVASCBE_dVd = dVASCBE_dVb = 0.0; - } - -/* Calculate Ids */ - CoxWovL = model->BSIM3v0cox * Weff / Leff; - beta = ueff * CoxWovL; - dbeta_dVg = CoxWovL * dueff_dVg + beta * dWeff_dVg / Weff; - dbeta_dVd = CoxWovL * dueff_dVd; - dbeta_dVb = CoxWovL * dueff_dVb + beta * dWeff_dVb / Weff; - - T0 = 1.0 - 0.5 * Abulk * Vdseff / Vgst2Vtm; - dT0_dVg = -0.5 * (Abulk * dVdseff_dVg - - Abulk * Vdseff / Vgst2Vtm+Vdseff*dAbulk_dVg) / Vgst2Vtm; - dT0_dVd = -0.5 * Abulk * dVdseff_dVd / Vgst2Vtm; - dT0_dVb = -0.5 * (Abulk * dVdseff_dVb + dAbulk_dVb * Vdseff) - / Vgst2Vtm; - - fgche1 = Vgsteff * T0; - dfgche1_dVg = Vgsteff * dT0_dVg + T0; - dfgche1_dVd = Vgsteff * dT0_dVd; - dfgche1_dVb = Vgsteff * dT0_dVb; - - fgche2 = 1.0 + Vdseff / EsatL; - dfgche2_dVg = (dVdseff_dVg - Vdseff / EsatL * dEsatL_dVg) / EsatL; - dfgche2_dVd = (dVdseff_dVd - Vdseff / EsatL * dEsatL_dVd) / EsatL; - dfgche2_dVb = (dVdseff_dVb - Vdseff / EsatL * dEsatL_dVb) / EsatL; - - gche = beta * fgche1 / fgche2; - dgche_dVg = (beta * dfgche1_dVg + fgche1 * dbeta_dVg - - gche * dfgche2_dVg) / fgche2; - dgche_dVd = (beta * dfgche1_dVd + fgche1 * dbeta_dVd - - gche * dfgche2_dVd) / fgche2; - dgche_dVb = (beta * dfgche1_dVb + fgche1 * dbeta_dVb - - gche * dfgche2_dVb) / fgche2; - - T0 = 1.0 + gche * Rds; - Idl = gche * Vdseff / T0; - - dIdl_dVg = (gche * dVdseff_dVg + Vdseff * dgche_dVg / T0) / T0 - - Idl * gche / T0 * dRds_dVg ; - - dIdl_dVd = (gche * dVdseff_dVd + Vdseff * dgche_dVd / T0) / T0; - dIdl_dVb = (gche * dVdseff_dVb + Vdseff * dgche_dVb / T0 - - Idl * dRds_dVb * gche) / T0; - - T0 = 1.0 + diffVds / Va; - Idsa = Idl * T0; - dIdsa_dVg = T0 * dIdl_dVg - Idl * (dVdseff_dVg + diffVds / Va - * dVa_dVg) / Va; - dIdsa_dVd = T0 * dIdl_dVd + Idl * (1.0 - dVdseff_dVd - diffVds / Va - * dVa_dVd) / Va; - dIdsa_dVb = T0 * dIdl_dVb - Idl * (dVdseff_dVb + diffVds / Va - * dVa_dVb) / Va; - - T0 = 1.0 + diffVds / VASCBE; - Ids = Idsa * T0; - - Gm = T0 * dIdsa_dVg - Idsa * (dVdseff_dVg + diffVds / VASCBE - * dVASCBE_dVg) / VASCBE; - Gds = T0 * dIdsa_dVd + Idsa * (1.0 - dVdseff_dVd - diffVds / VASCBE - * dVASCBE_dVd) / VASCBE; - Gmb = T0 * dIdsa_dVb - Idsa * (dVdseff_dVb + diffVds / VASCBE - * dVASCBE_dVb) / VASCBE; - - Gds += Gm * dVgsteff_dVd; - Gmb += Gm * dVgsteff_dVb; - Gm *= dVgsteff_dVg; - Gmb *= dVbseff_dVb; - -/* calculate substrate current Isub */ - if ((pParam->BSIM3v0alpha0 <= 0.0) || (pParam->BSIM3v0beta0 <= 0.0)) - { Isub = Gbd = Gbb = Gbg = 0.0; - } - else - { T2 = pParam->BSIM3v0alpha0 / Leff; - if (diffVds<0.0) { - diffVds=0.0; - Vdseff=Vds; - } /* added to avoid the hardwrae problem - when Vds=0 */ - - if ((diffVds != 0.0) && ((T0 = -pParam->BSIM3v0beta0 / diffVds) - > -EXP_THRESHOLD)) - { T1 = T2 * diffVds * exp(T0); - dT1_dVg = T1 / diffVds * (T0 - 1.0) * dVdseff_dVg; - dT1_dVd = T1 / diffVds * (1.0 - T0) * (1.0 - dVdseff_dVd); - dT1_dVb = T1 / diffVds * (T0 - 1.0) * dVdseff_dVb; - } - else - { T1 = T2 * diffVds * MIN_EXP; - dT1_dVg = -T2 * MIN_EXP * dVdseff_dVg; - dT1_dVd = T2 * MIN_EXP * (1.0 - dVdseff_dVd); - dT1_dVb = -T2 * MIN_EXP * dVdseff_dVb; - } - Isub = T1 * Idsa; - Gbg = T1 * dIdsa_dVg + Idsa * dT1_dVg; - Gbd = T1 * dIdsa_dVd + Idsa * dT1_dVd; - Gbb = T1 * dIdsa_dVb + Idsa * dT1_dVb; - - Gbd += Gbg * dVgsteff_dVd; - Gbb += Gbg * dVgsteff_dVb; - Gbg *= dVgsteff_dVg; - Gbg *= dVbseff_dVb; - } - - cdrain = Ids; - here->BSIM3v0gds = Gds; - here->BSIM3v0gm = Gm; - here->BSIM3v0gmbs = Gmb; - - here->BSIM3v0gbbs = Gbb; - here->BSIM3v0gbgs = Gbg; - here->BSIM3v0gbds = Gbd; - - here->BSIM3v0csub = Isub - (Gbb * Vbseff + Gbd * Vds + Gbg * Vgs); - -/* Calculate Qinv for Noise analysis */ - - T1 = Vgsteff * (1.0 - 0.5 * Abulk * Vdseff / Vgst2Vtm); - here->BSIM3v0qinv = -model->BSIM3v0cox * Weff * Leff * T1; - - if ((model->BSIM3v0xpart < 0) || (!ChargeComputationNeeded)) - { qgate = qdrn = qsrc = qbulk = 0.0; - here->BSIM3v0cggb = here->BSIM3v0cgsb = here->BSIM3v0cgdb = 0.0; - here->BSIM3v0cdgb = here->BSIM3v0cdsb = here->BSIM3v0cddb = 0.0; - here->BSIM3v0cbgb = here->BSIM3v0cbsb = here->BSIM3v0cbdb = 0.0; - here->BSIM3v0cqdb = here->BSIM3v0cqsb = here->BSIM3v0cqgb - = here->BSIM3v0cqbb = 0.0; - here->BSIM3v0gtau = 0.0; - goto finished; - } - else - { if (Vbseff < 0.0) - { VbseffCV = Vbseff; - dVbseffCV_dVb = 1.0; - } - else - { VbseffCV = pParam->BSIM3v0phi - Phis; - dVbseffCV_dVb = -dPhis_dVb; - } - - CoxWL = model->BSIM3v0cox * pParam->BSIM3v0weffCV - * pParam->BSIM3v0leffCV; - Vfb = Vth - pParam->BSIM3v0phi - pParam->BSIM3v0k1 * sqrtPhis; - - dVfb_dVb = dVth_dVb - pParam->BSIM3v0k1 * dsqrtPhis_dVb; - dVfb_dVd = dVth_dVd; - - if ((VgstNVt > -EXP_THRESHOLD) && (VgstNVt < EXP_THRESHOLD)) - { ExpVgst *= ExpVgst; - Vgsteff = n * Vtm * log(1.0 + ExpVgst); - dVgsteff_dVg = ExpVgst / (1.0 + ExpVgst); - dVgsteff_dVd = -dVgsteff_dVg * (dVth_dVd + (Vgs_eff - Vth) - / n * dn_dVd) + Vgsteff / n * dn_dVd; - dVgsteff_dVb = -dVgsteff_dVg * (dVth_dVb + (Vgs_eff - Vth) - / n * dn_dVb) + Vgsteff / n * dn_dVb; - dVgsteff_dVg *= dVgs_eff_dVg; - } - - if (model->BSIM3v0capMod == 1) - { Arg1 = Vgs_eff - VbseffCV - Vfb; - - if (Arg1 <= 0.0) - { qgate = CoxWL * (Arg1 - Vgsteff); - Cgg = CoxWL * (dVgs_eff_dVg - dVgsteff_dVg); - Cgd = -CoxWL * (dVfb_dVd + dVgsteff_dVd); - Cgb = -CoxWL * (dVfb_dVb + dVbseffCV_dVb + dVgsteff_dVb); - } - else - { T0 = 0.5 * pParam->BSIM3v0k1; - T1 = sqrt(T0 * T0 + Arg1 - Vgsteff); - qgate = CoxWL * pParam->BSIM3v0k1 * (T1 - T0); - - T2 = CoxWL * T0 / T1; - Cgg = T2 * (dVgs_eff_dVg - dVgsteff_dVg); - Cgd = -T2 * (dVfb_dVd + dVgsteff_dVd); - Cgb = -T2 * (dVfb_dVb + dVbseffCV_dVb + dVgsteff_dVb); - } - qbulk = -qgate; - Cbg = -Cgg; - Cbd = -Cgd; - Cbb = -Cgb; - - One_Third_CoxWL = CoxWL / 3.0; - Two_Third_CoxWL = 2.0 * One_Third_CoxWL; - AbulkCV = Abulk0 * pParam->BSIM3v0abulkCVfactor; - dAbulkCV_dVb = pParam->BSIM3v0abulkCVfactor * dAbulk0_dVb; - VdsatCV = Vgsteff / AbulkCV; - if (VdsatCV <= Vds) - { dVdsatCV_dVg = 1.0 / AbulkCV; - dVdsatCV_dVb = -VdsatCV * dAbulkCV_dVb / AbulkCV; - T0 = Vgsteff - VdsatCV / 3.0; - dT0_dVg = 1.0 - dVdsatCV_dVg / 3.0; - dT0_dVb = -dVdsatCV_dVb / 3.0; - qgate += CoxWL * T0; - Cgg1 = CoxWL * dT0_dVg; - Cgb1 = CoxWL * dT0_dVb + Cgg1 * dVgsteff_dVb; - Cgd1 = Cgg1 * dVgsteff_dVd; - Cgg1 *= dVgsteff_dVg; - Cgg += Cgg1; - Cgb += Cgb1; - Cgd += Cgd1; - - T0 = VdsatCV - Vgsteff; - dT0_dVg = dVdsatCV_dVg - 1.0; - dT0_dVb = dVdsatCV_dVb; - qbulk += One_Third_CoxWL * T0; - Cbg1 = One_Third_CoxWL * dT0_dVg; - Cbb1 = One_Third_CoxWL * dT0_dVb + Cbg1 * dVgsteff_dVb; - Cbd1 = Cbg1 * dVgsteff_dVd; - Cbg1 *= dVgsteff_dVg; - Cbg += Cbg1; - Cbb += Cbb1; - Cbd += Cbd1; - - if (model->BSIM3v0xpart > 0.5) - T0 = -Two_Third_CoxWL; - else if (model->BSIM3v0xpart < 0.5) - T0 = -0.4 * CoxWL; - else - T0 = -One_Third_CoxWL; - - qsrc = T0 * Vgsteff; - Csg = T0 * dVgsteff_dVg; - Csb = T0 * dVgsteff_dVb; - Csd = T0 * dVgsteff_dVd; - Cgb *= dVbseff_dVb; - Cbb *= dVbseff_dVb; - Csb *= dVbseff_dVb; - } - else - { T0 = AbulkCV * Vds; - T1 = 12.0 * (Vgsteff - 0.5 * T0); - T2 = Vds / T1; - T3 = T0 * T2; - dT3_dVg = -12.0 * T2 * T2 * AbulkCV; - dT3_dVd = 6.0 * T0 * (4.0 * Vgsteff - T0) / T1 / T1 - 0.5; - dT3_dVb = 12.0 * T2 * T2 * dAbulkCV_dVb * Vgsteff; - - qgate += CoxWL * (Vgsteff - 0.5 * Vds + T3); - Cgg1 = CoxWL * (1.0 + dT3_dVg); - Cgb1 = CoxWL * dT3_dVb + Cgg1 * dVgsteff_dVb; - Cgd1 = CoxWL * dT3_dVd + Cgg1 * dVgsteff_dVd; - Cgg1 *= dVgsteff_dVg; - Cgg += Cgg1; - Cgb += Cgb1; - Cgd += Cgd1; - - qbulk += CoxWL * (1.0 - AbulkCV) * (0.5 * Vds - T3); - Cbg1 = -CoxWL * ((1.0 - AbulkCV) * dT3_dVg); - Cbb1 = -CoxWL * ((1.0 - AbulkCV) * dT3_dVb - + (0.5 * Vds - T3) * dAbulkCV_dVb) - + Cbg1 * dVgsteff_dVb; - Cbd1 = -CoxWL * (1.0 - AbulkCV) * dT3_dVd - + Cbg1 * dVgsteff_dVd; - Cbg1 *= dVgsteff_dVg; - Cbg += Cbg1; - Cbb += Cbb1; - Cbd += Cbd1; - - if (model->BSIM3v0xpart > 0.5) - { /* 0/100 Charge petition model */ - T1 = T1 + T1; - qsrc = -CoxWL * (0.5 * Vgsteff + 0.25 * T0 - - T0 * T0 / T1); - Csg = -CoxWL * (0.5 + 24.0 * T0 * Vds / T1 / T1 - * AbulkCV); - Csb = -CoxWL * (0.25 * Vds * dAbulkCV_dVb - - 12.0 * T0 * Vds / T1 / T1 * (4.0 * Vgsteff - T0) - * dAbulkCV_dVb) + Csg * dVgsteff_dVb; - Csd = -CoxWL * (0.25 * AbulkCV - 12.0 * AbulkCV * T0 - / T1 / T1 * (4.0 * Vgsteff - T0)) - + Csg * dVgsteff_dVd; - Csg *= dVgsteff_dVg; - } - else if (model->BSIM3v0xpart < 0.5) - { /* 40/60 Charge petition model */ - T1 = T1 / 12.0; - T2 = 0.5 * CoxWL / (T1 * T1); - T3 = Vgsteff * (2.0 * T0 * T0 / 3.0 + Vgsteff - * (Vgsteff - 4.0 * T0 / 3.0)) - - 2.0 * T0 * T0 * T0 / 15.0; - qsrc = -T2 * T3; - T4 = 4.0 / 3.0 * Vgsteff * (Vgsteff - T0) - + 0.4 * T0 * T0; - Csg = -2.0 * qsrc / T1 - T2 * (Vgsteff * (3.0 - * Vgsteff - 8.0 * T0 / 3.0) - + 2.0 * T0 * T0 / 3.0); - Csb = (qsrc / T1 * Vds + T2 * T4 * Vds) * dAbulkCV_dVb - + Csg * dVgsteff_dVb; - Csd = (qsrc / T1 + T2 * T4) * AbulkCV - + Csg * dVgsteff_dVd; - Csg *= dVgsteff_dVg; - } - else - { /* 50/50 Charge petition model */ - qsrc = -0.5 * (qgate + qbulk); - Csg = -0.5 * (Cgg1 + Cbg1); - Csb = -0.5 * (Cgb1 + Cbb1); - Csd = -0.5 * (Cgd1 + Cbd1); - } - Cgb *= dVbseff_dVb; - Cbb *= dVbseff_dVb; - Csb *= dVbseff_dVb; - } - qdrn = -(qgate + qbulk + qsrc); - here->BSIM3v0cggb = Cgg; - here->BSIM3v0cgsb = -(Cgg + Cgd + Cgb); - here->BSIM3v0cgdb = Cgd; - here->BSIM3v0cdgb = -(Cgg + Cbg + Csg); - here->BSIM3v0cdsb = (Cgg + Cgd + Cgb + Cbg + Cbd + Cbb - + Csg + Csd + Csb); - here->BSIM3v0cddb = -(Cgd + Cbd + Csd); - here->BSIM3v0cbgb = Cbg; - here->BSIM3v0cbsb = -(Cbg + Cbd + Cbb); - here->BSIM3v0cbdb = Cbd; - } - else - { V3 = Vfb - Vgs_eff + VbseffCV - DELTA_3; - if (Vfb <= 0.0) - { T0 = sqrt(V3 * V3 - 4.0 * DELTA_3 * Vfb); - T2 = -DELTA_3 / T0; - } - else - { T0 = sqrt(V3 * V3 + 4.0 * DELTA_3 * Vfb); - T2 = DELTA_3 / T0; - } - - T1 = 0.5 * (1.0 + V3 / T0); - Vfbeff = Vfb - 0.5 * (V3 + T0); - dVfbeff_dVd = (1.0 - T1 - T2) * dVfb_dVd; - dVfbeff_dVg = T1 * dVgs_eff_dVg; - dVfbeff_dVb = (1.0 - T1 - T2) * dVfb_dVb - - T1 * dVbseffCV_dVb; - Qac0 = CoxWL * (Vfbeff - Vfb); - dQac0_dVg = CoxWL * dVfbeff_dVg; - dQac0_dVd = CoxWL * (dVfbeff_dVd - dVfb_dVd); - dQac0_dVb = CoxWL * (dVfbeff_dVb - dVfb_dVb); - - T0 = 0.5 * pParam->BSIM3v0k1; - T1 = sqrt(T0 * T0 + Vgs_eff - Vfbeff - VbseffCV - Vgsteff); - - Qsub0 = CoxWL * pParam->BSIM3v0k1 * (T1 - T0); - - T2 = CoxWL * T0 / T1; - dQsub0_dVg = T2 * (dVgs_eff_dVg - dVfbeff_dVg - dVgsteff_dVg); - dQsub0_dVd = -T2 * (dVfbeff_dVd + dVgsteff_dVd); - dQsub0_dVb = -T2 * (dVfbeff_dVb + dVbseffCV_dVb - + dVgsteff_dVb); - - One_Third_CoxWL = CoxWL / 3.0; - Two_Third_CoxWL = 2.0 * One_Third_CoxWL; - AbulkCV = Abulk0 * pParam->BSIM3v0abulkCVfactor; - dAbulkCV_dVb = pParam->BSIM3v0abulkCVfactor * dAbulk0_dVb; - VdsatCV = Vgsteff / AbulkCV; - - V4 = VdsatCV - Vds - DELTA_4; - T0 = sqrt(V4 * V4 + 4.0 * DELTA_4 * VdsatCV); - VdseffCV = VdsatCV - 0.5 * (V4 + T0); - T1 = 0.5 * (1.0 + V4 / T0); - T2 = DELTA_4 / T0; - T3 = (1.0 - T1 - T2) / AbulkCV; - dVdseffCV_dVg = T3; - dVdseffCV_dVd = T1; - dVdseffCV_dVb = -T3 * VdsatCV * dAbulkCV_dVb; - - T0 = AbulkCV * VdseffCV; - T1 = 12.0 * (Vgsteff - 0.5 * T0 + 1e-20); - T2 = VdseffCV / T1; - T3 = T0 * T2; - - T4 = (1.0 - 12.0 * T2 * T2 * AbulkCV); - T5 = (6.0 * T0 * (4.0 * Vgsteff - T0) / (T1 * T1) - 0.5); - T6 = 12.0 * T2 * T2 * Vgsteff; - - qgate = CoxWL * (Vgsteff - 0.5 * VdseffCV + T3); - Cgg1 = CoxWL * (T4 + T5 * dVdseffCV_dVg); - Cgd1 = CoxWL * T5 * dVdseffCV_dVd + Cgg1 * dVgsteff_dVd; - Cgb1 = CoxWL * (T5 * dVdseffCV_dVb + T6 * dAbulkCV_dVb) - + Cgg1 * dVgsteff_dVb; - Cgg1 *= dVgsteff_dVg; - - T7 = 1.0 - AbulkCV; - qbulk = CoxWL * T7 * (0.5 * VdseffCV - T3); - T4 = -T7 * (T4 - 1.0); - T5 = -T7 * T5; - T6 = -(T7 * T6 + (0.5 * VdseffCV - T3)); - Cbg1 = CoxWL * (T4 + T5 * dVdseffCV_dVg); - Cbd1 = CoxWL * T5 * dVdseffCV_dVd + Cbg1 * dVgsteff_dVd; - Cbb1 = CoxWL * (T5 * dVdseffCV_dVb + T6 * dAbulkCV_dVb) - + Cbg1 * dVgsteff_dVb; - Cbg1 *= dVgsteff_dVg; - - if (model->BSIM3v0xpart > 0.5) - { /* 0/100 Charge petition model */ - T1 = T1 + T1; - qsrc = -CoxWL * (0.5 * Vgsteff + 0.25 * T0 - - T0 * T0 / T1); - T7 = (4.0 * Vgsteff - T0) / (T1 * T1); - T4 = -(0.5 + 24.0 * T0 * T0 / (T1 * T1)); - T5 = -(0.25 * AbulkCV - 12.0 * AbulkCV * T0 * T7); - T6 = -(0.25 * VdseffCV - 12.0 * T0 * VdseffCV * T7); - Csg = CoxWL * (T4 + T5 * dVdseffCV_dVg); - Csd = CoxWL * T5 * dVdseffCV_dVd + Csg * dVgsteff_dVd; - Csb = CoxWL * (T5 * dVdseffCV_dVb + T6 * dAbulkCV_dVb) - + Csg * dVgsteff_dVb; - Csg *= dVgsteff_dVg; - } - else if (model->BSIM3v0xpart < 0.5) - { /* 40/60 Charge petition model */ - T1 = T1 / 12.0; - T2 = 0.5 * CoxWL / (T1 * T1); - T3 = Vgsteff * (2.0 * T0 * T0 / 3.0 + Vgsteff - * (Vgsteff - 4.0 * T0 / 3.0)) - - 2.0 * T0 * T0 * T0 / 15.0; - qsrc = -T2 * T3; - T7 = 4.0 / 3.0 * Vgsteff * (Vgsteff - T0) - + 0.4 * T0 * T0; - T4 = -2.0 * qsrc / T1 - T2 * (Vgsteff * (3.0 - * Vgsteff - 8.0 * T0 / 3.0) - + 2.0 * T0 * T0 / 3.0); - T5 = (qsrc / T1 + T2 * T7) * AbulkCV; - T6 = (qsrc / T1 * VdseffCV + T2 * T7 * VdseffCV); - Csg = (T4 + T5 * dVdseffCV_dVg); - Csd = T5 * dVdseffCV_dVd + Csg * dVgsteff_dVd; - Csb = (T5 * dVdseffCV_dVb + T6 * dAbulkCV_dVb) - + Csg * dVgsteff_dVb; - Csg *= dVgsteff_dVg; - } - else - { /* 50/50 Charge petition model */ - qsrc = -0.5 * (qgate + qbulk); - Csg = -0.5 * (Cgg1 + Cbg1); - Csb = -0.5 * (Cgb1 + Cbb1); - Csd = -0.5 * (Cgd1 + Cbd1); - } - - qgate += Qac0 + Qsub0; - qbulk -= (Qac0 + Qsub0); - qdrn = -(qgate + qbulk + qsrc); - - Cgg = dQac0_dVg + dQsub0_dVg + Cgg1; - Cgd = dQac0_dVd + dQsub0_dVd + Cgd1; - Cgb = dQac0_dVb + dQsub0_dVb + Cgb1; - - Cbg = Cbg1 - dQac0_dVg - dQsub0_dVg; - Cbd = Cbd1 - dQac0_dVd - dQsub0_dVd; - Cbb = Cbb1 - dQac0_dVb - dQsub0_dVb; - - Cgb *= dVbseff_dVb; - Cbb *= dVbseff_dVb; - Csb *= dVbseff_dVb; - - here->BSIM3v0cggb = Cgg; - here->BSIM3v0cgsb = -(Cgg + Cgd + Cgb); - here->BSIM3v0cgdb = Cgd; - here->BSIM3v0cdgb = -(Cgg + Cbg + Csg); - here->BSIM3v0cdsb = (Cgg + Cgd + Cgb + Cbg + Cbd + Cbb - + Csg + Csd + Csb); - here->BSIM3v0cddb = -(Cgd + Cbd + Csd); - here->BSIM3v0cbgb = Cbg; - here->BSIM3v0cbsb = -(Cbg + Cbd + Cbb); - here->BSIM3v0cbdb = Cbd; - - } - -/* Non-quasi-static Model */ - - if (here->BSIM3v0nqsMod) - { - qcheq = -qbulk - qgate; - qbulk = qgate = qdrn = qsrc = 0.0; - - here->BSIM3v0cqgb = -(here->BSIM3v0cggb + here->BSIM3v0cbgb); - here->BSIM3v0cqdb = -(here->BSIM3v0cgdb + here->BSIM3v0cbdb); - here->BSIM3v0cqsb = -(here->BSIM3v0cgsb + here->BSIM3v0cbsb); - here->BSIM3v0cqbb = here->BSIM3v0cggb + here->BSIM3v0cgdb - + here->BSIM3v0cgsb + here->BSIM3v0cbgb - + here->BSIM3v0cbdb + here->BSIM3v0cbsb; - - here->BSIM3v0cggb = here->BSIM3v0cgsb = here->BSIM3v0cgdb = 0.0; - here->BSIM3v0cdgb = here->BSIM3v0cdsb = here->BSIM3v0cddb = 0.0; - here->BSIM3v0cbgb = here->BSIM3v0cbsb = here->BSIM3v0cbdb = 0.0; - - T0 = pParam->BSIM3v0leffCV * pParam->BSIM3v0leffCV; - here->BSIM3v0tconst = pParam->BSIM3v0u0temp * pParam->BSIM3v0elm - / CoxWL / T0; - - if (qcheq == 0.0) - here->BSIM3v0tconst = 0.0; - else if (qcheq < 0.0) - here->BSIM3v0tconst = -here->BSIM3v0tconst; - - gtau_drift = fabs(here->BSIM3v0tconst * qcheq); - gtau_diff = 16.0 * pParam->BSIM3v0u0temp * model->BSIM3v0vtm / T0; - - here->BSIM3v0gtau = gtau_drift + gtau_diff; - - *(ckt->CKTstate0 + here->BSIM3v0qcheq) = qcheq; - - if (ckt->CKTmode & MODEINITTRAN) - *(ckt->CKTstate1 + here->BSIM3v0qcheq) = - *(ckt->CKTstate0 + here->BSIM3v0qcheq); - - error = NIintegrate(ckt, &geq, &ceq, 0.0, here->BSIM3v0qcheq); - if (error) return (error); - } - else - { here->BSIM3v0cqgb = here->BSIM3v0cqdb = here->BSIM3v0cqsb - = here->BSIM3v0cqbb = 0.0; - here->BSIM3v0gtau = 0.0; - } - } - -finished: /* returning Values to Calling Routine */ - /* - * COMPUTE EQUIVALENT DRAIN CURRENT SOURCE - */ - here->BSIM3v0cd = here->BSIM3v0mode * cdrain - here->BSIM3v0cbd; - if (ChargeComputationNeeded) - { /* charge storage elements - * bulk-drain and bulk-source depletion capacitances - * czbd : zero bias drain junction capacitance - * czbs : zero bias source junction capacitance - * czbdsw:zero bias drain junction sidewall capacitance - * czbssw:zero bias source junction sidewall capacitance - */ - - czbd = model->BSIM3v0unitAreaJctCap * here->BSIM3v0drainArea; - czbs = model->BSIM3v0unitAreaJctCap * here->BSIM3v0sourceArea; - czbdsw = model->BSIM3v0unitLengthSidewallJctCap - * here->BSIM3v0drainPerimeter; - czbssw = model->BSIM3v0unitLengthSidewallJctCap - * here->BSIM3v0sourcePerimeter; - PhiB = model->BSIM3v0bulkJctPotential; - PhiBSW = model->BSIM3v0sidewallJctPotential; - MJ = model->BSIM3v0bulkJctBotGradingCoeff; - MJSW = model->BSIM3v0bulkJctSideGradingCoeff; - - /* Source Bulk Junction */ - if (vbs == 0.0) - { *(ckt->CKTstate0 + here->BSIM3v0qbs) = 0.0; - here->BSIM3v0capbs = czbs + czbssw; - } - else if (vbs < 0.0) - { if (czbs > 0.0) - { arg = 1.0 - vbs / PhiB; - if (MJ == 0.5) - sarg = 1.0 / sqrt(arg); - else - sarg = exp(-MJ * log(arg)); - *(ckt->CKTstate0 + here->BSIM3v0qbs) = PhiB * czbs - * (1.0 - arg * sarg) / (1.0 - MJ); - here->BSIM3v0capbs = czbs * sarg; - } - else - { *(ckt->CKTstate0 + here->BSIM3v0qbs) = 0.0; - here->BSIM3v0capbs = 0.0; - } - if (czbssw > 0.0) - { arg = 1.0 - vbs / PhiBSW; - if (MJSW == 0.5) - sarg = 1.0 / sqrt(arg); - else - sarg = exp(-MJSW * log(arg)); - *(ckt->CKTstate0 + here->BSIM3v0qbs) += PhiBSW * czbssw - * (1.0 - arg * sarg) / (1.0 - MJSW); - here->BSIM3v0capbs += czbssw * sarg; - } - } - else - { *(ckt->CKTstate0+here->BSIM3v0qbs) = vbs * (czbs + czbssw) - + vbs * vbs * (czbs * MJ * 0.5 / PhiB - + czbssw * MJSW * 0.5 / PhiBSW); - here->BSIM3v0capbs = czbs + czbssw + vbs * (czbs * MJ /PhiB - + czbssw * MJSW / PhiBSW ); - } - - /* Drain Bulk Junction */ - if (vbd == 0.0) - { *(ckt->CKTstate0 + here->BSIM3v0qbd) = 0.0; - here->BSIM3v0capbd = czbd + czbdsw; - } - else if (vbd < 0.0) - { if (czbd > 0.0) - { arg = 1.0 - vbd / PhiB; - if (MJ == 0.5) - sarg = 1.0 / sqrt(arg); - else - sarg = exp(-MJ * log(arg)); - *(ckt->CKTstate0 + here->BSIM3v0qbd) = PhiB * czbd - * (1.0 - arg * sarg) / (1.0 - MJ); - here->BSIM3v0capbd = czbd * sarg; - } - else - { *(ckt->CKTstate0 + here->BSIM3v0qbd) = 0.0; - here->BSIM3v0capbd = 0.0; - } - if (czbdsw > 0.0) - { arg = 1.0 - vbd / PhiBSW; - if (MJSW == 0.5) - sarg = 1.0 / sqrt(arg); - else - sarg = exp(-MJSW * log(arg)); - *(ckt->CKTstate0 + here->BSIM3v0qbd) += PhiBSW * czbdsw - * (1.0 - arg * sarg) / (1.0 - MJSW); - here->BSIM3v0capbd += czbdsw * sarg; - } - } - else - { *(ckt->CKTstate0+here->BSIM3v0qbd) = vbd * (czbd + czbdsw) - + vbd * vbd * (czbd * MJ * 0.5 / PhiB - + czbdsw * MJSW * 0.5 / PhiBSW); - here->BSIM3v0capbd = czbd + czbdsw + vbd * (czbd * MJ / PhiB - + czbdsw * MJSW / PhiBSW ); - } - } - - /* - * check convergence - */ - if ((here->BSIM3v0off == 0) || (!(ckt->CKTmode & MODEINITFIX))) - { if (Check == 1) - { ckt->CKTnoncon++; -#ifndef NEWCONV - } - else - { tol = ckt->CKTreltol * MAX(fabs(cdhat), fabs(here->BSIM3v0cd)) - + ckt->CKTabstol; - if (fabs(cdhat - here->BSIM3v0cd) >= tol) - { ckt->CKTnoncon++; - } - else - { tol = ckt->CKTreltol * MAX(fabs(cbhat), - fabs(here->BSIM3v0cbs + here->BSIM3v0cbd)) - + ckt->CKTabstol; - if (fabs(cbhat - (here->BSIM3v0cbs + here->BSIM3v0cbd)) - > tol) - { ckt->CKTnoncon++; - } - } -#endif /* NEWCONV */ - } - } - *(ckt->CKTstate0 + here->BSIM3v0vbs) = vbs; - *(ckt->CKTstate0 + here->BSIM3v0vbd) = vbd; - *(ckt->CKTstate0 + here->BSIM3v0vgs) = vgs; - *(ckt->CKTstate0 + here->BSIM3v0vds) = vds; - - /* bulk and channel charge plus overlaps */ - - if (!ChargeComputationNeeded) - goto line850; -#ifndef NOBYPASS -line755: -#endif - ag0 = ckt->CKTag[0]; - - if (model->BSIM3v0capMod == 1) - { if (vgd < 0.0) - { T1 = sqrt(1.0 - 4.0 * vgd / pParam->BSIM3v0ckappa); - cgdo = pParam->BSIM3v0cgdo + pParam->BSIM3v0weffCV - * pParam->BSIM3v0cgdl / T1; - qgdo = pParam->BSIM3v0cgdo * vgd - pParam->BSIM3v0weffCV * 0.5 - * pParam->BSIM3v0cgdl * pParam->BSIM3v0ckappa * (T1 - 1.0); - } - else - { cgdo = pParam->BSIM3v0cgdo + pParam->BSIM3v0weffCV - * pParam->BSIM3v0cgdl; - qgdo = (pParam->BSIM3v0weffCV * pParam->BSIM3v0cgdl - + pParam->BSIM3v0cgdo) * vgd; - } - - if (vgs < 0.0) - { T1 = sqrt(1.0 - 4.0 * vgs / pParam->BSIM3v0ckappa); - cgso = pParam->BSIM3v0cgso + pParam->BSIM3v0weffCV - * pParam->BSIM3v0cgsl / T1; - qgso = pParam->BSIM3v0cgso * vgs - pParam->BSIM3v0weffCV * 0.5 - * pParam->BSIM3v0cgsl * pParam->BSIM3v0ckappa * (T1 - 1.0); - } - else - { cgso = pParam->BSIM3v0cgso + pParam->BSIM3v0weffCV - * pParam->BSIM3v0cgsl; - qgso = (pParam->BSIM3v0weffCV * pParam->BSIM3v0cgsl - + pParam->BSIM3v0cgso) * vgs; - } - } - else - { T0 = vgd + DELTA_1; - T1 = sqrt(T0 * T0 + 4.0 * DELTA_1); - T2 = 0.5 * (T0 - T1); - - T3 = pParam->BSIM3v0weffCV * pParam->BSIM3v0cgdl; - T4 = sqrt(1.0 - 4.0 * T2 / pParam->BSIM3v0ckappa); - cgdo = pParam->BSIM3v0cgdo + T3 - T3 * (1.0 - 1.0 / T4) - * (0.5 - 0.5 * T0 / T1); - qgdo = (pParam->BSIM3v0cgdo + T3) * vgd - T3 * (T2 - + 0.5 * pParam->BSIM3v0ckappa * (T4 - 1.0)); - - T0 = vgs + DELTA_1; - T1 = sqrt(T0 * T0 + 4.0 * DELTA_1); - T2 = 0.5 * (T0 - T1); - T3 = pParam->BSIM3v0weffCV * pParam->BSIM3v0cgsl; - T4 = sqrt(1.0 - 4.0 * T2 / pParam->BSIM3v0ckappa); - cgso = pParam->BSIM3v0cgso + T3 - T3 * (1.0 - 1.0 / T4) - * (0.5 - 0.5 * T0 / T1); - qgso = (pParam->BSIM3v0cgso + T3) * vgs - T3 * (T2 - + 0.5 * pParam->BSIM3v0ckappa * (T4 - 1.0)); - } - - if (here->BSIM3v0mode > 0) - { gcdgb = (here->BSIM3v0cdgb - cgdo) * ag0; - gcddb = (here->BSIM3v0cddb + here->BSIM3v0capbd + cgdo) * ag0; - gcdsb = here->BSIM3v0cdsb * ag0; - gcsgb = -(here->BSIM3v0cggb + here->BSIM3v0cbgb + here->BSIM3v0cdgb - + cgso) * ag0; - gcsdb = -(here->BSIM3v0cgdb + here->BSIM3v0cbdb + here->BSIM3v0cddb) - * ag0; - gcssb = (here->BSIM3v0capbs + cgso - (here->BSIM3v0cgsb - + here->BSIM3v0cbsb + here->BSIM3v0cdsb)) * ag0; - gcggb = (here->BSIM3v0cggb + cgdo + cgso + pParam->BSIM3v0cgbo ) * ag0; - gcgdb = (here->BSIM3v0cgdb - cgdo) * ag0; - gcgsb = (here->BSIM3v0cgsb - cgso) * ag0; - gcbgb = (here->BSIM3v0cbgb - pParam->BSIM3v0cgbo) * ag0; - gcbdb = (here->BSIM3v0cbdb - here->BSIM3v0capbd) * ag0; - gcbsb = (here->BSIM3v0cbsb - here->BSIM3v0capbs) * ag0; - - gcqgb = here->BSIM3v0cqgb * ag0; - gcqdb = here->BSIM3v0cqdb * ag0; - gcqsb = here->BSIM3v0cqsb * ag0; - gcqbb = here->BSIM3v0cqbb * ag0; - - T0 = here->BSIM3v0tconst * qdef; - here->BSIM3v0gtg = T0 * here->BSIM3v0cqgb; - here->BSIM3v0gtb = T0 * here->BSIM3v0cqbb; - here->BSIM3v0gtd = T0 * here->BSIM3v0cqdb; - here->BSIM3v0gts = T0 * here->BSIM3v0cqsb; - - sxpart = 0.6; - dxpart = 0.4; - - /* compute total terminal charge */ - qgd = qgdo; - qgs = qgso; - qgb = pParam->BSIM3v0cgbo * vgb; - qgate += qgd + qgs + qgb; - qbulk -= qgb; - qdrn -= qgd; - qsrc = -(qgate + qbulk + qdrn); - } - else - { gcsgb = (here->BSIM3v0cdgb - cgso) * ag0; - gcsdb = here->BSIM3v0cdsb * ag0; - gcssb = (here->BSIM3v0cddb + here->BSIM3v0capbs + cgso) * ag0; - - gcdgb = -(here->BSIM3v0cggb + here->BSIM3v0cbgb + here->BSIM3v0cdgb - + cgdo) * ag0; - gcdsb = -(here->BSIM3v0cgdb + here->BSIM3v0cbdb + here->BSIM3v0cddb) - * ag0; - gcddb = (here->BSIM3v0capbd + cgdo - (here->BSIM3v0cgsb - + here->BSIM3v0cbsb + here->BSIM3v0cdsb)) * ag0; - gcggb = (here->BSIM3v0cggb + cgdo + cgso + pParam->BSIM3v0cgbo ) * ag0; - gcgdb = (here->BSIM3v0cgsb - cgdo) * ag0; - gcgsb = (here->BSIM3v0cgdb - cgso) * ag0; - gcbgb = (here->BSIM3v0cbgb - pParam->BSIM3v0cgbo) * ag0; - gcbdb = (here->BSIM3v0cbsb - here->BSIM3v0capbd) * ag0; - gcbsb = (here->BSIM3v0cbdb - here->BSIM3v0capbs) * ag0; - - gcqgb = here->BSIM3v0cqgb * ag0; - gcqdb = here->BSIM3v0cqsb * ag0; - gcqsb = here->BSIM3v0cqdb * ag0; - gcqbb = here->BSIM3v0cqbb * ag0; - - T0 = here->BSIM3v0tconst * qdef; - here->BSIM3v0gtg = T0 * here->BSIM3v0cqgb; - here->BSIM3v0gtb = T0 * here->BSIM3v0cqbb; - here->BSIM3v0gtd = T0 * here->BSIM3v0cqdb; - here->BSIM3v0gts = T0 * here->BSIM3v0cqsb; - - dxpart = 0.6; - sxpart = 0.4; - - /* compute total terminal charge */ - qgd = qgdo; - qgs = qgso; - qgb = pParam->BSIM3v0cgbo * vgb; - qgate += qgd + qgs + qgb; - qbulk -= qgb; - qsrc = qdrn - qgs; - qdrn = -(qgate + qbulk + qsrc); - } - - here->BSIM3v0cgdo = cgdo; - here->BSIM3v0cgso = cgso; - -/* added by Mansun 11/1/93 */ - - - if (here->BSIM3v0nqsMod) - { *(ckt->CKTstate0 + here->BSIM3v0qcdump) = qdef; - - if (ckt->CKTmode & MODEINITTRAN) - *(ckt->CKTstate1 + here->BSIM3v0qcdump) = - *(ckt->CKTstate0 + here->BSIM3v0qcdump); - - error = NIintegrate(ckt, &gqdef, &cqdef, 1.0, here->BSIM3v0qcdump); - if (error) return (error); - } - else - { gqdef = cqdef = 0.0; - } - - if (ByPass) goto line860; - -/* End added by Mansun 11/1/93 */ - - *(ckt->CKTstate0 + here->BSIM3v0qg) = qgate; - *(ckt->CKTstate0 + here->BSIM3v0qd) = qdrn - - *(ckt->CKTstate0 + here->BSIM3v0qbd); - *(ckt->CKTstate0 + here->BSIM3v0qb) = qbulk - + *(ckt->CKTstate0 + here->BSIM3v0qbd) - + *(ckt->CKTstate0 + here->BSIM3v0qbs); - - /* store small signal parameters */ - if (ckt->CKTmode & MODEINITSMSIG) - { goto line1000; - } - if (!ChargeComputationNeeded) - goto line850; - - if (ckt->CKTmode & MODEINITTRAN) - { *(ckt->CKTstate1 + here->BSIM3v0qb) = - *(ckt->CKTstate0 + here->BSIM3v0qb); - *(ckt->CKTstate1 + here->BSIM3v0qg) = - *(ckt->CKTstate0 + here->BSIM3v0qg); - *(ckt->CKTstate1 + here->BSIM3v0qd) = - *(ckt->CKTstate0 + here->BSIM3v0qd); - } - - error = NIintegrate(ckt, &geq, &ceq, 0.0, here->BSIM3v0qb); - if (error) - return(error); - error = NIintegrate(ckt, &geq, &ceq, 0.0, here->BSIM3v0qg); - if (error) - return(error); - error = NIintegrate(ckt,&geq, &ceq, 0.0, here->BSIM3v0qd); - if (error) - return(error); - - goto line860; - -line850: - /* initialize to zero charge conductance and current */ - ceqqg = ceqqb = ceqqd = 0.0; - - cqcheq = cqdef = 0.0; - - gcdgb = gcddb = gcdsb = 0.0; - gcsgb = gcsdb = gcssb = 0.0; - gcggb = gcgdb = gcgsb = 0.0; - gcbgb = gcbdb = gcbsb = 0.0; - - gcqgb = gcqdb = gcqsb = gcqbb = 0.0; - here->BSIM3v0gtg = here->BSIM3v0gtd = here->BSIM3v0gts = here->BSIM3v0gtb = 0.0; - gqdef = 0.0; - sxpart = (1.0 - (dxpart = (here->BSIM3v0mode > 0) ? 0.4 : 0.6)); - if (here->BSIM3v0nqsMod) - here->BSIM3v0gtau = 16.0 * pParam->BSIM3v0u0temp * model->BSIM3v0vtm - / Leff / Leff; - else - here->BSIM3v0gtau = 0.0; - - goto line900; - -line860: - /* evaluate equivalent charge current */ - - cqgate = *(ckt->CKTstate0 + here->BSIM3v0cqg); - cqbulk = *(ckt->CKTstate0 + here->BSIM3v0cqb); - cqdrn = *(ckt->CKTstate0 + here->BSIM3v0cqd); - - ceqqg = cqgate - gcggb * vgb + gcgdb * vbd + gcgsb * vbs - + (here->BSIM3v0gtg * vgb - here->BSIM3v0gtd * vbd - here->BSIM3v0gts * vbs); - ceqqb = cqbulk - gcbgb * vgb + gcbdb * vbd + gcbsb * vbs; - ceqqd = cqdrn - gcdgb * vgb + gcddb * vbd + gcdsb * vbs - - dxpart * (here->BSIM3v0gtg * vgb - here->BSIM3v0gtd * vbd - - here->BSIM3v0gts * vbs); - - cqcheq = *(ckt->CKTstate0 + here->BSIM3v0cqcheq) - - (gcqgb * vgb - gcqdb * vbd - gcqsb * vbs) - + (here->BSIM3v0gtg * vgb - here->BSIM3v0gtd * vbd - here->BSIM3v0gts * vbs); - - if (ckt->CKTmode & MODEINITTRAN) - { *(ckt->CKTstate1 + here->BSIM3v0cqb) = - *(ckt->CKTstate0 + here->BSIM3v0cqb); - *(ckt->CKTstate1 + here->BSIM3v0cqg) = - *(ckt->CKTstate0 + here->BSIM3v0cqg); - *(ckt->CKTstate1 + here->BSIM3v0cqd) = - *(ckt->CKTstate0 + here->BSIM3v0cqd); - *(ckt->CKTstate1 + here->BSIM3v0cqcheq) = - *(ckt->CKTstate0 + here->BSIM3v0cqcheq); - *(ckt->CKTstate1 + here->BSIM3v0cqcdump) = - *(ckt->CKTstate0 + here->BSIM3v0cqcdump); - } - - /* - * load current vector - */ -line900: - - if (here->BSIM3v0mode >= 0) - { Gm = here->BSIM3v0gm; - Gmbs = here->BSIM3v0gmbs; - FwdSum = Gm + Gmbs; - RevSum = 0.0; - cdreq = model->BSIM3v0type * (cdrain - here->BSIM3v0gds * vds - - Gm * vgs - Gmbs * vbs); - ceqbs = -here->BSIM3v0csub; - ceqbd = 0.0; - - gbspsp = -here->BSIM3v0gbds - here->BSIM3v0gbgs - here->BSIM3v0gbbs; - gbbdp = -here->BSIM3v0gbds; - gbbsp = here->BSIM3v0gbds + here->BSIM3v0gbgs + here->BSIM3v0gbbs; - gbspg = here->BSIM3v0gbgs; - gbspb = here->BSIM3v0gbbs; - gbspdp = here->BSIM3v0gbds; - gbdpdp = 0.0; - gbdpg = 0.0; - gbdpb = 0.0; - gbdpsp = 0.0; - } - else - { Gm = -here->BSIM3v0gm; - Gmbs = -here->BSIM3v0gmbs; - FwdSum = 0.0; - RevSum = -(Gm + Gmbs); - cdreq = -model->BSIM3v0type * (cdrain + here->BSIM3v0gds * vds - + Gm * vgd + Gmbs * vbd); - ceqbs = 0.0; - ceqbd = -here->BSIM3v0csub; - - gbspsp = 0.0; - gbbdp = here->BSIM3v0gbds + here->BSIM3v0gbgs + here->BSIM3v0gbbs; - gbbsp = -here->BSIM3v0gbds; - gbspg = 0.0; - gbspb = 0.0; - gbspdp = 0.0; - gbdpdp = -here->BSIM3v0gbds - here->BSIM3v0gbgs - here->BSIM3v0gbbs; - gbdpg = here->BSIM3v0gbgs; - gbdpb = here->BSIM3v0gbbs; - gbdpsp = here->BSIM3v0gbds; - } - - if (model->BSIM3v0type > 0) - { ceqbs += (here->BSIM3v0cbs - (here->BSIM3v0gbs - ckt->CKTgmin) * vbs); - ceqbd += (here->BSIM3v0cbd - (here->BSIM3v0gbd - ckt->CKTgmin) * vbd); - /* - ceqqg = ceqqg; - ceqqb = ceqqb; - ceqqd = ceqqd; - cqcheq = cqcheq; - */ - } - else - { ceqbs = -ceqbs - (here->BSIM3v0cbs - (here->BSIM3v0gbs - - ckt->CKTgmin) * vbs); - ceqbd = -ceqbd - (here->BSIM3v0cbd - (here->BSIM3v0gbd - - ckt->CKTgmin) * vbd); - ceqqg = -ceqqg; - ceqqb = -ceqqb; - ceqqd = -ceqqd; - cqcheq = -cqcheq; - } - - (*(ckt->CKTrhs + here->BSIM3v0gNode) -= m * ceqqg); - (*(ckt->CKTrhs + here->BSIM3v0bNode) -= m * (ceqbs + ceqbd + ceqqb)); - (*(ckt->CKTrhs + here->BSIM3v0dNodePrime) += m * (ceqbd - cdreq - ceqqd)); - (*(ckt->CKTrhs + here->BSIM3v0sNodePrime) += m * (cdreq + ceqbs + ceqqg - + ceqqb + ceqqd)); - - *(ckt->CKTrhs + here->BSIM3v0qNode) += m * (cqcheq - cqdef); - - /* - * load y matrix - */ - - (*(here->BSIM3v0DdPtr) += m * here->BSIM3v0drainConductance); - (*(here->BSIM3v0GgPtr) += m * (gcggb - here->BSIM3v0gtg)); - (*(here->BSIM3v0SsPtr) += m * here->BSIM3v0sourceConductance); - (*(here->BSIM3v0BbPtr) += m * ((here->BSIM3v0gbd + here->BSIM3v0gbs - - gcbgb - gcbdb - gcbsb) - here->BSIM3v0gbbs)); - (*(here->BSIM3v0DPdpPtr) += m * ((here->BSIM3v0drainConductance - + here->BSIM3v0gds + here->BSIM3v0gbd - + RevSum + gcddb) + dxpart * here->BSIM3v0gtd + gbdpdp)); - (*(here->BSIM3v0SPspPtr) += m * ((here->BSIM3v0sourceConductance - + here->BSIM3v0gds + here->BSIM3v0gbs - + FwdSum + gcssb) + sxpart * here->BSIM3v0gts + gbspsp)); - (*(here->BSIM3v0DdpPtr) -= m * here->BSIM3v0drainConductance); - (*(here->BSIM3v0GbPtr) -= m * (gcggb + gcgdb + gcgsb + here->BSIM3v0gtb)); - (*(here->BSIM3v0GdpPtr) += m * (gcgdb - here->BSIM3v0gtd)); - (*(here->BSIM3v0GspPtr) += m * (gcgsb - here->BSIM3v0gts)); - (*(here->BSIM3v0SspPtr) -= m * here->BSIM3v0sourceConductance); - (*(here->BSIM3v0BgPtr) += m * (gcbgb - here->BSIM3v0gbgs)); - (*(here->BSIM3v0BdpPtr) += m * (gcbdb - here->BSIM3v0gbd + gbbdp)); - (*(here->BSIM3v0BspPtr) += m * (gcbsb - here->BSIM3v0gbs + gbbsp)); - (*(here->BSIM3v0DPdPtr) -= m * here->BSIM3v0drainConductance); - (*(here->BSIM3v0DPgPtr) += m * ((Gm + gcdgb) + dxpart * here->BSIM3v0gtg + gbdpg)); - (*(here->BSIM3v0DPbPtr) -= m * ((here->BSIM3v0gbd - Gmbs + gcdgb + gcddb - + gcdsb - dxpart * here->BSIM3v0gtb) - gbdpb)); - (*(here->BSIM3v0DPspPtr) -= m * ((here->BSIM3v0gds + FwdSum - gcdsb - - 0.5 * here->BSIM3v0gts) - gbdpsp)); - (*(here->BSIM3v0SPgPtr) += m * (gcsgb - Gm + sxpart * here->BSIM3v0gtg + gbspg)); - (*(here->BSIM3v0SPsPtr) -= m * here->BSIM3v0sourceConductance); - (*(here->BSIM3v0SPbPtr) -= m * ((here->BSIM3v0gbs + Gmbs + gcsgb + gcsdb - + gcssb - sxpart * here->BSIM3v0gtg) - gbspb)); - (*(here->BSIM3v0SPdpPtr) -= m * ((here->BSIM3v0gds + RevSum - gcsdb - - sxpart * here->BSIM3v0gtd - here->BSIM3v0gbd) - gbspdp)); - - *(here->BSIM3v0QqPtr) += m * (gqdef + here->BSIM3v0gtau); - - *(here->BSIM3v0DPqPtr) += m * (dxpart * here->BSIM3v0gtau); - *(here->BSIM3v0SPqPtr) += m * (sxpart * here->BSIM3v0gtau); - *(here->BSIM3v0GqPtr) -= m * here->BSIM3v0gtau; - - *(here->BSIM3v0QgPtr) += m * (-gcqgb + here->BSIM3v0gtg); - *(here->BSIM3v0QdpPtr) += m * (-gcqdb + here->BSIM3v0gtd); - *(here->BSIM3v0QspPtr) += m * (-gcqsb + here->BSIM3v0gts); - *(here->BSIM3v0QbPtr) += m * (-gcqbb + here->BSIM3v0gtb); - -line1000: ; - - } /* End of Mosfet Instance */ -} /* End of Model Instance */ - -return(OK); -} - - - - - diff --git a/src/spicelib/devices/bsim3v0/b3v0mask.c b/src/spicelib/devices/bsim3v0/b3v0mask.c deleted file mode 100644 index 49b52d20c..000000000 --- a/src/spicelib/devices/bsim3v0/b3v0mask.c +++ /dev/null @@ -1,1093 +0,0 @@ -/********** -Copyright 1990 Regents of the University of California. All rights reserved. -Author: 1995 Min-Chie Jeng and Mansun Chan. -File: b3v0mask.c -**********/ - -#include "ngspice/ngspice.h" -#include "ngspice/ifsim.h" -#include "ngspice/cktdefs.h" -#include "ngspice/devdefs.h" -#include "bsim3v0def.h" -#include "ngspice/sperror.h" -#include "ngspice/suffix.h" - -int -BSIM3v0mAsk( -CKTcircuit *ckt, -GENmodel *inst, -int which, -IFvalue *value) -{ - BSIM3v0model *model = (BSIM3v0model *)inst; - - NG_IGNORE(ckt); - - switch(which) - { case BSIM3v0_MOD_MOBMOD: - value->iValue = model->BSIM3v0mobMod; - return(OK); - case BSIM3v0_MOD_BINUNIT: - value->iValue = model->BSIM3v0binUnit; - return(OK); - case BSIM3v0_MOD_CAPMOD: - value->iValue = model->BSIM3v0capMod; - return(OK); - case BSIM3v0_MOD_NQSMOD: - value->iValue = model->BSIM3v0nqsMod; - return(OK); - case BSIM3v0_MOD_NOIMOD: - value->iValue = model->BSIM3v0noiMod; - return(OK); - case BSIM3v0_MOD_TOX : - value->rValue = model->BSIM3v0tox; - return(OK); - case BSIM3v0_MOD_CDSC : - value->rValue = model->BSIM3v0cdsc; - return(OK); - case BSIM3v0_MOD_CDSCB : - value->rValue = model->BSIM3v0cdscb; - return(OK); - - case BSIM3v0_MOD_CDSCD : - value->rValue = model->BSIM3v0cdscd; - return(OK); - - case BSIM3v0_MOD_CIT : - value->rValue = model->BSIM3v0cit; - return(OK); - case BSIM3v0_MOD_NFACTOR : - value->rValue = model->BSIM3v0nfactor; - return(OK); - case BSIM3v0_MOD_XJ: - value->rValue = model->BSIM3v0xj; - return(OK); - case BSIM3v0_MOD_VSAT: - value->rValue = model->BSIM3v0vsat; - return(OK); - case BSIM3v0_MOD_AT: - value->rValue = model->BSIM3v0at; - return(OK); - case BSIM3v0_MOD_A0: - value->rValue = model->BSIM3v0a0; - return(OK); - - case BSIM3v0_MOD_AGS: - value->rValue = model->BSIM3v0ags; - return(OK); - - case BSIM3v0_MOD_A1: - value->rValue = model->BSIM3v0a1; - return(OK); - case BSIM3v0_MOD_A2: - value->rValue = model->BSIM3v0a2; - return(OK); - case BSIM3v0_MOD_KETA: - value->rValue = model->BSIM3v0keta; - return(OK); - case BSIM3v0_MOD_NSUB: - value->rValue = model->BSIM3v0nsub; - return(OK); - case BSIM3v0_MOD_NPEAK: - value->rValue = model->BSIM3v0npeak; - return(OK); - case BSIM3v0_MOD_NGATE: - value->rValue = model->BSIM3v0ngate; - return(OK); - case BSIM3v0_MOD_GAMMA1: - value->rValue = model->BSIM3v0gamma1; - return(OK); - case BSIM3v0_MOD_GAMMA2: - value->rValue = model->BSIM3v0gamma2; - return(OK); - case BSIM3v0_MOD_VBX: - value->rValue = model->BSIM3v0vbx; - return(OK); - case BSIM3v0_MOD_VBM: - value->rValue = model->BSIM3v0vbm; - return(OK); - case BSIM3v0_MOD_XT: - value->rValue = model->BSIM3v0xt; - return(OK); - case BSIM3v0_MOD_K1: - value->rValue = model->BSIM3v0k1; - return(OK); - case BSIM3v0_MOD_KT1: - value->rValue = model->BSIM3v0kt1; - return(OK); - case BSIM3v0_MOD_KT1L: - value->rValue = model->BSIM3v0kt1l; - return(OK); - case BSIM3v0_MOD_KT2 : - value->rValue = model->BSIM3v0kt2; - return(OK); - case BSIM3v0_MOD_K2 : - value->rValue = model->BSIM3v0k2; - return(OK); - case BSIM3v0_MOD_K3: - value->rValue = model->BSIM3v0k3; - return(OK); - case BSIM3v0_MOD_K3B: - value->rValue = model->BSIM3v0k3b; - return(OK); - case BSIM3v0_MOD_W0: - value->rValue = model->BSIM3v0w0; - return(OK); - case BSIM3v0_MOD_NLX: - value->rValue = model->BSIM3v0nlx; - return(OK); - case BSIM3v0_MOD_DVT0 : - value->rValue = model->BSIM3v0dvt0; - return(OK); - case BSIM3v0_MOD_DVT1 : - value->rValue = model->BSIM3v0dvt1; - return(OK); - case BSIM3v0_MOD_DVT2 : - value->rValue = model->BSIM3v0dvt2; - return(OK); - case BSIM3v0_MOD_DVT0W : - value->rValue = model->BSIM3v0dvt0w; - return(OK); - case BSIM3v0_MOD_DVT1W : - value->rValue = model->BSIM3v0dvt1w; - return(OK); - case BSIM3v0_MOD_DVT2W : - value->rValue = model->BSIM3v0dvt2w; - return(OK); - case BSIM3v0_MOD_DROUT : - value->rValue = model->BSIM3v0drout; - return(OK); - case BSIM3v0_MOD_DSUB : - value->rValue = model->BSIM3v0dsub; - return(OK); - case BSIM3v0_MOD_VTH0: - value->rValue = model->BSIM3v0vth0; - return(OK); - case BSIM3v0_MOD_UA: - value->rValue = model->BSIM3v0ua; - return(OK); - case BSIM3v0_MOD_UA1: - value->rValue = model->BSIM3v0ua1; - return(OK); - case BSIM3v0_MOD_UB: - value->rValue = model->BSIM3v0ub; - return(OK); - case BSIM3v0_MOD_UB1: - value->rValue = model->BSIM3v0ub1; - return(OK); - case BSIM3v0_MOD_UC: - value->rValue = model->BSIM3v0uc; - return(OK); - case BSIM3v0_MOD_UC1: - value->rValue = model->BSIM3v0uc1; - return(OK); - case BSIM3v0_MOD_U0: - value->rValue = model->BSIM3v0u0; - return(OK); - case BSIM3v0_MOD_UTE: - value->rValue = model->BSIM3v0ute; - return(OK); - case BSIM3v0_MOD_VOFF: - value->rValue = model->BSIM3v0voff; - return(OK); - case BSIM3v0_MOD_DELTA: - value->rValue = model->BSIM3v0delta; - return(OK); - case BSIM3v0_MOD_RDSW: - value->rValue = model->BSIM3v0rdsw; - return(OK); - case BSIM3v0_MOD_PRWG: - value->rValue = model->BSIM3v0prwg; - return(OK); - case BSIM3v0_MOD_PRWB: - value->rValue = model->BSIM3v0prwb; - return(OK); - case BSIM3v0_MOD_PRT: - value->rValue = model->BSIM3v0prt; - return(OK); - case BSIM3v0_MOD_ETA0: - value->rValue = model->BSIM3v0eta0; - return(OK); - case BSIM3v0_MOD_ETAB: - value->rValue = model->BSIM3v0etab; - return(OK); - case BSIM3v0_MOD_PCLM: - value->rValue = model->BSIM3v0pclm; - return(OK); - case BSIM3v0_MOD_PDIBL1: - value->rValue = model->BSIM3v0pdibl1; - return(OK); - case BSIM3v0_MOD_PDIBL2: - value->rValue = model->BSIM3v0pdibl2; - return(OK); - case BSIM3v0_MOD_PDIBLB: - value->rValue = model->BSIM3v0pdiblb; - return(OK); - case BSIM3v0_MOD_PSCBE1: - value->rValue = model->BSIM3v0pscbe1; - return(OK); - case BSIM3v0_MOD_PSCBE2: - value->rValue = model->BSIM3v0pscbe2; - return(OK); - case BSIM3v0_MOD_PVAG: - value->rValue = model->BSIM3v0pvag; - return(OK); - case BSIM3v0_MOD_WR: - value->rValue = model->BSIM3v0wr; - return(OK); - case BSIM3v0_MOD_DWG: - value->rValue = model->BSIM3v0dwg; - return(OK); - case BSIM3v0_MOD_DWB: - value->rValue = model->BSIM3v0dwb; - return(OK); - case BSIM3v0_MOD_B0: - value->rValue = model->BSIM3v0b0; - return(OK); - case BSIM3v0_MOD_B1: - value->rValue = model->BSIM3v0b1; - return(OK); - case BSIM3v0_MOD_ALPHA0: - value->rValue = model->BSIM3v0alpha0; - return(OK); - case BSIM3v0_MOD_BETA0: - value->rValue = model->BSIM3v0beta0; - return(OK); - - case BSIM3v0_MOD_ELM: - value->rValue = model->BSIM3v0elm; - return(OK); - case BSIM3v0_MOD_CGSL: - value->rValue = model->BSIM3v0cgsl; - return(OK); - case BSIM3v0_MOD_CGDL: - value->rValue = model->BSIM3v0cgdl; - return(OK); - case BSIM3v0_MOD_CKAPPA: - value->rValue = model->BSIM3v0ckappa; - return(OK); - case BSIM3v0_MOD_CF: - value->rValue = model->BSIM3v0cf; - return(OK); - case BSIM3v0_MOD_CLC: - value->rValue = model->BSIM3v0clc; - return(OK); - case BSIM3v0_MOD_CLE: - value->rValue = model->BSIM3v0cle; - return(OK); - case BSIM3v0_MOD_DWC: - value->rValue = model->BSIM3v0dwc; - return(OK); - case BSIM3v0_MOD_DLC: - value->rValue = model->BSIM3v0dlc; - return(OK); - - /* Length dependence */ - case BSIM3v0_MOD_LCDSC : - value->rValue = model->BSIM3v0lcdsc; - return(OK); - case BSIM3v0_MOD_LCDSCB : - value->rValue = model->BSIM3v0lcdscb; - return(OK); - case BSIM3v0_MOD_LCDSCD : - value->rValue = model->BSIM3v0lcdscd; - return(OK); - case BSIM3v0_MOD_LCIT : - value->rValue = model->BSIM3v0lcit; - return(OK); - case BSIM3v0_MOD_LNFACTOR : - value->rValue = model->BSIM3v0lnfactor; - return(OK); - case BSIM3v0_MOD_LXJ: - value->rValue = model->BSIM3v0lxj; - return(OK); - case BSIM3v0_MOD_LVSAT: - value->rValue = model->BSIM3v0lvsat; - return(OK); - case BSIM3v0_MOD_LAT: - value->rValue = model->BSIM3v0lat; - return(OK); - case BSIM3v0_MOD_LA0: - value->rValue = model->BSIM3v0la0; - return(OK); - case BSIM3v0_MOD_LAGS: - value->rValue = model->BSIM3v0lags; - return(OK); - case BSIM3v0_MOD_LA1: - value->rValue = model->BSIM3v0la1; - return(OK); - case BSIM3v0_MOD_LA2: - value->rValue = model->BSIM3v0la2; - return(OK); - case BSIM3v0_MOD_LKETA: - value->rValue = model->BSIM3v0lketa; - return(OK); - case BSIM3v0_MOD_LNSUB: - value->rValue = model->BSIM3v0lnsub; - return(OK); - case BSIM3v0_MOD_LNPEAK: - value->rValue = model->BSIM3v0lnpeak; - return(OK); - case BSIM3v0_MOD_LNGATE: - value->rValue = model->BSIM3v0lngate; - return(OK); - case BSIM3v0_MOD_LGAMMA1: - value->rValue = model->BSIM3v0lgamma1; - return(OK); - case BSIM3v0_MOD_LGAMMA2: - value->rValue = model->BSIM3v0lgamma2; - return(OK); - case BSIM3v0_MOD_LVBX: - value->rValue = model->BSIM3v0lvbx; - return(OK); - case BSIM3v0_MOD_LVBM: - value->rValue = model->BSIM3v0lvbm; - return(OK); - case BSIM3v0_MOD_LXT: - value->rValue = model->BSIM3v0lxt; - return(OK); - case BSIM3v0_MOD_LK1: - value->rValue = model->BSIM3v0lk1; - return(OK); - case BSIM3v0_MOD_LKT1: - value->rValue = model->BSIM3v0lkt1; - return(OK); - case BSIM3v0_MOD_LKT1L: - value->rValue = model->BSIM3v0lkt1l; - return(OK); - case BSIM3v0_MOD_LKT2 : - value->rValue = model->BSIM3v0lkt2; - return(OK); - case BSIM3v0_MOD_LK2 : - value->rValue = model->BSIM3v0lk2; - return(OK); - case BSIM3v0_MOD_LK3: - value->rValue = model->BSIM3v0lk3; - return(OK); - case BSIM3v0_MOD_LK3B: - value->rValue = model->BSIM3v0lk3b; - return(OK); - case BSIM3v0_MOD_LW0: - value->rValue = model->BSIM3v0lw0; - return(OK); - case BSIM3v0_MOD_LNLX: - value->rValue = model->BSIM3v0lnlx; - return(OK); - case BSIM3v0_MOD_LDVT0: - value->rValue = model->BSIM3v0ldvt0; - return(OK); - case BSIM3v0_MOD_LDVT1 : - value->rValue = model->BSIM3v0ldvt1; - return(OK); - case BSIM3v0_MOD_LDVT2 : - value->rValue = model->BSIM3v0ldvt2; - return(OK); - case BSIM3v0_MOD_LDVT0W : - value->rValue = model->BSIM3v0ldvt0w; - return(OK); - case BSIM3v0_MOD_LDVT1W : - value->rValue = model->BSIM3v0ldvt1w; - return(OK); - case BSIM3v0_MOD_LDVT2W : - value->rValue = model->BSIM3v0ldvt2w; - return(OK); - case BSIM3v0_MOD_LDROUT : - value->rValue = model->BSIM3v0ldrout; - return(OK); - case BSIM3v0_MOD_LDSUB : - value->rValue = model->BSIM3v0ldsub; - return(OK); - case BSIM3v0_MOD_LVTH0: - value->rValue = model->BSIM3v0lvth0; - return(OK); - case BSIM3v0_MOD_LUA: - value->rValue = model->BSIM3v0lua; - return(OK); - case BSIM3v0_MOD_LUA1: - value->rValue = model->BSIM3v0lua1; - return(OK); - case BSIM3v0_MOD_LUB: - value->rValue = model->BSIM3v0lub; - return(OK); - case BSIM3v0_MOD_LUB1: - value->rValue = model->BSIM3v0lub1; - return(OK); - case BSIM3v0_MOD_LUC: - value->rValue = model->BSIM3v0luc; - return(OK); - case BSIM3v0_MOD_LUC1: - value->rValue = model->BSIM3v0luc1; - return(OK); - case BSIM3v0_MOD_LU0: - value->rValue = model->BSIM3v0lu0; - return(OK); - case BSIM3v0_MOD_LUTE: - value->rValue = model->BSIM3v0lute; - return(OK); - case BSIM3v0_MOD_LVOFF: - value->rValue = model->BSIM3v0lvoff; - return(OK); - case BSIM3v0_MOD_LDELTA: - value->rValue = model->BSIM3v0ldelta; - return(OK); - case BSIM3v0_MOD_LRDSW: - value->rValue = model->BSIM3v0lrdsw; - return(OK); - case BSIM3v0_MOD_LPRWB: - value->rValue = model->BSIM3v0lprwb; - return(OK); - case BSIM3v0_MOD_LPRWG: - value->rValue = model->BSIM3v0lprwg; - return(OK); - case BSIM3v0_MOD_LPRT: - value->rValue = model->BSIM3v0lprt; - return(OK); - case BSIM3v0_MOD_LETA0: - value->rValue = model->BSIM3v0leta0; - return(OK); - case BSIM3v0_MOD_LETAB: - value->rValue = model->BSIM3v0letab; - return(OK); - case BSIM3v0_MOD_LPCLM: - value->rValue = model->BSIM3v0lpclm; - return(OK); - case BSIM3v0_MOD_LPDIBL1: - value->rValue = model->BSIM3v0lpdibl1; - return(OK); - case BSIM3v0_MOD_LPDIBL2: - value->rValue = model->BSIM3v0lpdibl2; - return(OK); - case BSIM3v0_MOD_LPDIBLB: - value->rValue = model->BSIM3v0lpdiblb; - return(OK); - case BSIM3v0_MOD_LPSCBE1: - value->rValue = model->BSIM3v0lpscbe1; - return(OK); - case BSIM3v0_MOD_LPSCBE2: - value->rValue = model->BSIM3v0lpscbe2; - return(OK); - case BSIM3v0_MOD_LPVAG: - value->rValue = model->BSIM3v0lpvag; - return(OK); - case BSIM3v0_MOD_LWR: - value->rValue = model->BSIM3v0lwr; - return(OK); - case BSIM3v0_MOD_LDWG: - value->rValue = model->BSIM3v0ldwg; - return(OK); - case BSIM3v0_MOD_LDWB: - value->rValue = model->BSIM3v0ldwb; - return(OK); - case BSIM3v0_MOD_LB0: - value->rValue = model->BSIM3v0lb0; - return(OK); - case BSIM3v0_MOD_LB1: - value->rValue = model->BSIM3v0lb1; - return(OK); - case BSIM3v0_MOD_LALPHA0: - value->rValue = model->BSIM3v0lalpha0; - return(OK); - case BSIM3v0_MOD_LBETA0: - value->rValue = model->BSIM3v0lbeta0; - return(OK); - - case BSIM3v0_MOD_LELM: - value->rValue = model->BSIM3v0lelm; - return(OK); - case BSIM3v0_MOD_LCGSL: - value->rValue = model->BSIM3v0lcgsl; - return(OK); - case BSIM3v0_MOD_LCGDL: - value->rValue = model->BSIM3v0lcgdl; - return(OK); - case BSIM3v0_MOD_LCKAPPA: - value->rValue = model->BSIM3v0lckappa; - return(OK); - case BSIM3v0_MOD_LCF: - value->rValue = model->BSIM3v0lcf; - return(OK); - case BSIM3v0_MOD_LCLC: - value->rValue = model->BSIM3v0lclc; - return(OK); - case BSIM3v0_MOD_LCLE: - value->rValue = model->BSIM3v0lcle; - return(OK); - - /* Width dependence */ - case BSIM3v0_MOD_WCDSC : - value->rValue = model->BSIM3v0wcdsc; - return(OK); - case BSIM3v0_MOD_WCDSCB : - value->rValue = model->BSIM3v0wcdscb; - return(OK); - case BSIM3v0_MOD_WCDSCD : - value->rValue = model->BSIM3v0wcdscd; - return(OK); - case BSIM3v0_MOD_WCIT : - value->rValue = model->BSIM3v0wcit; - return(OK); - case BSIM3v0_MOD_WNFACTOR : - value->rValue = model->BSIM3v0wnfactor; - return(OK); - case BSIM3v0_MOD_WXJ: - value->rValue = model->BSIM3v0wxj; - return(OK); - case BSIM3v0_MOD_WVSAT: - value->rValue = model->BSIM3v0wvsat; - return(OK); - case BSIM3v0_MOD_WAT: - value->rValue = model->BSIM3v0wat; - return(OK); - case BSIM3v0_MOD_WA0: - value->rValue = model->BSIM3v0wa0; - return(OK); - case BSIM3v0_MOD_WAGS: - value->rValue = model->BSIM3v0wags; - return(OK); - case BSIM3v0_MOD_WA1: - value->rValue = model->BSIM3v0wa1; - return(OK); - case BSIM3v0_MOD_WA2: - value->rValue = model->BSIM3v0wa2; - return(OK); - case BSIM3v0_MOD_WKETA: - value->rValue = model->BSIM3v0wketa; - return(OK); - case BSIM3v0_MOD_WNSUB: - value->rValue = model->BSIM3v0wnsub; - return(OK); - case BSIM3v0_MOD_WNPEAK: - value->rValue = model->BSIM3v0wnpeak; - return(OK); - case BSIM3v0_MOD_WNGATE: - value->rValue = model->BSIM3v0wngate; - return(OK); - case BSIM3v0_MOD_WGAMMA1: - value->rValue = model->BSIM3v0wgamma1; - return(OK); - case BSIM3v0_MOD_WGAMMA2: - value->rValue = model->BSIM3v0wgamma2; - return(OK); - case BSIM3v0_MOD_WVBX: - value->rValue = model->BSIM3v0wvbx; - return(OK); - case BSIM3v0_MOD_WVBM: - value->rValue = model->BSIM3v0wvbm; - return(OK); - case BSIM3v0_MOD_WXT: - value->rValue = model->BSIM3v0wxt; - return(OK); - case BSIM3v0_MOD_WK1: - value->rValue = model->BSIM3v0wk1; - return(OK); - case BSIM3v0_MOD_WKT1: - value->rValue = model->BSIM3v0wkt1; - return(OK); - case BSIM3v0_MOD_WKT1L: - value->rValue = model->BSIM3v0wkt1l; - return(OK); - case BSIM3v0_MOD_WKT2 : - value->rValue = model->BSIM3v0wkt2; - return(OK); - case BSIM3v0_MOD_WK2 : - value->rValue = model->BSIM3v0wk2; - return(OK); - case BSIM3v0_MOD_WK3: - value->rValue = model->BSIM3v0wk3; - return(OK); - case BSIM3v0_MOD_WK3B: - value->rValue = model->BSIM3v0wk3b; - return(OK); - case BSIM3v0_MOD_WW0: - value->rValue = model->BSIM3v0ww0; - return(OK); - case BSIM3v0_MOD_WNLX: - value->rValue = model->BSIM3v0wnlx; - return(OK); - case BSIM3v0_MOD_WDVT0: - value->rValue = model->BSIM3v0wdvt0; - return(OK); - case BSIM3v0_MOD_WDVT1 : - value->rValue = model->BSIM3v0wdvt1; - return(OK); - case BSIM3v0_MOD_WDVT2 : - value->rValue = model->BSIM3v0wdvt2; - return(OK); - case BSIM3v0_MOD_WDVT0W : - value->rValue = model->BSIM3v0wdvt0w; - return(OK); - case BSIM3v0_MOD_WDVT1W : - value->rValue = model->BSIM3v0wdvt1w; - return(OK); - case BSIM3v0_MOD_WDVT2W : - value->rValue = model->BSIM3v0wdvt2w; - return(OK); - case BSIM3v0_MOD_WDROUT : - value->rValue = model->BSIM3v0wdrout; - return(OK); - case BSIM3v0_MOD_WDSUB : - value->rValue = model->BSIM3v0wdsub; - return(OK); - case BSIM3v0_MOD_WVTH0: - value->rValue = model->BSIM3v0wvth0; - return(OK); - case BSIM3v0_MOD_WUA: - value->rValue = model->BSIM3v0wua; - return(OK); - case BSIM3v0_MOD_WUA1: - value->rValue = model->BSIM3v0wua1; - return(OK); - case BSIM3v0_MOD_WUB: - value->rValue = model->BSIM3v0wub; - return(OK); - case BSIM3v0_MOD_WUB1: - value->rValue = model->BSIM3v0wub1; - return(OK); - case BSIM3v0_MOD_WUC: - value->rValue = model->BSIM3v0wuc; - return(OK); - case BSIM3v0_MOD_WUC1: - value->rValue = model->BSIM3v0wuc1; - return(OK); - case BSIM3v0_MOD_WU0: - value->rValue = model->BSIM3v0wu0; - return(OK); - case BSIM3v0_MOD_WUTE: - value->rValue = model->BSIM3v0wute; - return(OK); - case BSIM3v0_MOD_WVOFF: - value->rValue = model->BSIM3v0wvoff; - return(OK); - case BSIM3v0_MOD_WDELTA: - value->rValue = model->BSIM3v0wdelta; - return(OK); - case BSIM3v0_MOD_WRDSW: - value->rValue = model->BSIM3v0wrdsw; - return(OK); - case BSIM3v0_MOD_WPRWB: - value->rValue = model->BSIM3v0wprwb; - return(OK); - case BSIM3v0_MOD_WPRWG: - value->rValue = model->BSIM3v0wprwg; - return(OK); - case BSIM3v0_MOD_WPRT: - value->rValue = model->BSIM3v0wprt; - return(OK); - case BSIM3v0_MOD_WETA0: - value->rValue = model->BSIM3v0weta0; - return(OK); - case BSIM3v0_MOD_WETAB: - value->rValue = model->BSIM3v0wetab; - return(OK); - case BSIM3v0_MOD_WPCLM: - value->rValue = model->BSIM3v0wpclm; - return(OK); - case BSIM3v0_MOD_WPDIBL1: - value->rValue = model->BSIM3v0wpdibl1; - return(OK); - case BSIM3v0_MOD_WPDIBL2: - value->rValue = model->BSIM3v0wpdibl2; - return(OK); - case BSIM3v0_MOD_WPDIBLB: - value->rValue = model->BSIM3v0wpdiblb; - return(OK); - case BSIM3v0_MOD_WPSCBE1: - value->rValue = model->BSIM3v0wpscbe1; - return(OK); - case BSIM3v0_MOD_WPSCBE2: - value->rValue = model->BSIM3v0wpscbe2; - return(OK); - case BSIM3v0_MOD_WPVAG: - value->rValue = model->BSIM3v0wpvag; - return(OK); - case BSIM3v0_MOD_WWR: - value->rValue = model->BSIM3v0wwr; - return(OK); - case BSIM3v0_MOD_WDWG: - value->rValue = model->BSIM3v0wdwg; - return(OK); - case BSIM3v0_MOD_WDWB: - value->rValue = model->BSIM3v0wdwb; - return(OK); - case BSIM3v0_MOD_WB0: - value->rValue = model->BSIM3v0wb0; - return(OK); - case BSIM3v0_MOD_WB1: - value->rValue = model->BSIM3v0wb1; - return(OK); - case BSIM3v0_MOD_WALPHA0: - value->rValue = model->BSIM3v0walpha0; - return(OK); - case BSIM3v0_MOD_WBETA0: - value->rValue = model->BSIM3v0wbeta0; - return(OK); - - case BSIM3v0_MOD_WELM: - value->rValue = model->BSIM3v0welm; - return(OK); - case BSIM3v0_MOD_WCGSL: - value->rValue = model->BSIM3v0wcgsl; - return(OK); - case BSIM3v0_MOD_WCGDL: - value->rValue = model->BSIM3v0wcgdl; - return(OK); - case BSIM3v0_MOD_WCKAPPA: - value->rValue = model->BSIM3v0wckappa; - return(OK); - case BSIM3v0_MOD_WCF: - value->rValue = model->BSIM3v0wcf; - return(OK); - case BSIM3v0_MOD_WCLC: - value->rValue = model->BSIM3v0wclc; - return(OK); - case BSIM3v0_MOD_WCLE: - value->rValue = model->BSIM3v0wcle; - return(OK); - - /* Cross-term dependence */ - case BSIM3v0_MOD_PCDSC : - value->rValue = model->BSIM3v0pcdsc; - return(OK); - case BSIM3v0_MOD_PCDSCB : - value->rValue = model->BSIM3v0pcdscb; - return(OK); - case BSIM3v0_MOD_PCDSCD : - value->rValue = model->BSIM3v0pcdscd; - return(OK); - case BSIM3v0_MOD_PCIT : - value->rValue = model->BSIM3v0pcit; - return(OK); - case BSIM3v0_MOD_PNFACTOR : - value->rValue = model->BSIM3v0pnfactor; - return(OK); - case BSIM3v0_MOD_PXJ: - value->rValue = model->BSIM3v0pxj; - return(OK); - case BSIM3v0_MOD_PVSAT: - value->rValue = model->BSIM3v0pvsat; - return(OK); - case BSIM3v0_MOD_PAT: - value->rValue = model->BSIM3v0pat; - return(OK); - case BSIM3v0_MOD_PA0: - value->rValue = model->BSIM3v0pa0; - return(OK); - case BSIM3v0_MOD_PAGS: - value->rValue = model->BSIM3v0pags; - return(OK); - case BSIM3v0_MOD_PA1: - value->rValue = model->BSIM3v0pa1; - return(OK); - case BSIM3v0_MOD_PA2: - value->rValue = model->BSIM3v0pa2; - return(OK); - case BSIM3v0_MOD_PKETA: - value->rValue = model->BSIM3v0pketa; - return(OK); - case BSIM3v0_MOD_PNSUB: - value->rValue = model->BSIM3v0pnsub; - return(OK); - case BSIM3v0_MOD_PNPEAK: - value->rValue = model->BSIM3v0pnpeak; - return(OK); - case BSIM3v0_MOD_PNGATE: - value->rValue = model->BSIM3v0pngate; - return(OK); - case BSIM3v0_MOD_PGAMMA1: - value->rValue = model->BSIM3v0pgamma1; - return(OK); - case BSIM3v0_MOD_PGAMMA2: - value->rValue = model->BSIM3v0pgamma2; - return(OK); - case BSIM3v0_MOD_PVBX: - value->rValue = model->BSIM3v0pvbx; - return(OK); - case BSIM3v0_MOD_PVBM: - value->rValue = model->BSIM3v0pvbm; - return(OK); - case BSIM3v0_MOD_PXT: - value->rValue = model->BSIM3v0pxt; - return(OK); - case BSIM3v0_MOD_PK1: - value->rValue = model->BSIM3v0pk1; - return(OK); - case BSIM3v0_MOD_PKT1: - value->rValue = model->BSIM3v0pkt1; - return(OK); - case BSIM3v0_MOD_PKT1L: - value->rValue = model->BSIM3v0pkt1l; - return(OK); - case BSIM3v0_MOD_PKT2 : - value->rValue = model->BSIM3v0pkt2; - return(OK); - case BSIM3v0_MOD_PK2 : - value->rValue = model->BSIM3v0pk2; - return(OK); - case BSIM3v0_MOD_PK3: - value->rValue = model->BSIM3v0pk3; - return(OK); - case BSIM3v0_MOD_PK3B: - value->rValue = model->BSIM3v0pk3b; - return(OK); - case BSIM3v0_MOD_PW0: - value->rValue = model->BSIM3v0pw0; - return(OK); - case BSIM3v0_MOD_PNLX: - value->rValue = model->BSIM3v0pnlx; - return(OK); - case BSIM3v0_MOD_PDVT0 : - value->rValue = model->BSIM3v0pdvt0; - return(OK); - case BSIM3v0_MOD_PDVT1 : - value->rValue = model->BSIM3v0pdvt1; - return(OK); - case BSIM3v0_MOD_PDVT2 : - value->rValue = model->BSIM3v0pdvt2; - return(OK); - case BSIM3v0_MOD_PDVT0W : - value->rValue = model->BSIM3v0pdvt0w; - return(OK); - case BSIM3v0_MOD_PDVT1W : - value->rValue = model->BSIM3v0pdvt1w; - return(OK); - case BSIM3v0_MOD_PDVT2W : - value->rValue = model->BSIM3v0pdvt2w; - return(OK); - case BSIM3v0_MOD_PDROUT : - value->rValue = model->BSIM3v0pdrout; - return(OK); - case BSIM3v0_MOD_PDSUB : - value->rValue = model->BSIM3v0pdsub; - return(OK); - case BSIM3v0_MOD_PVTH0: - value->rValue = model->BSIM3v0pvth0; - return(OK); - case BSIM3v0_MOD_PUA: - value->rValue = model->BSIM3v0pua; - return(OK); - case BSIM3v0_MOD_PUA1: - value->rValue = model->BSIM3v0pua1; - return(OK); - case BSIM3v0_MOD_PUB: - value->rValue = model->BSIM3v0pub; - return(OK); - case BSIM3v0_MOD_PUB1: - value->rValue = model->BSIM3v0pub1; - return(OK); - case BSIM3v0_MOD_PUC: - value->rValue = model->BSIM3v0puc; - return(OK); - case BSIM3v0_MOD_PUC1: - value->rValue = model->BSIM3v0puc1; - return(OK); - case BSIM3v0_MOD_PU0: - value->rValue = model->BSIM3v0pu0; - return(OK); - case BSIM3v0_MOD_PUTE: - value->rValue = model->BSIM3v0pute; - return(OK); - case BSIM3v0_MOD_PVOFF: - value->rValue = model->BSIM3v0pvoff; - return(OK); - case BSIM3v0_MOD_PDELTA: - value->rValue = model->BSIM3v0pdelta; - return(OK); - case BSIM3v0_MOD_PRDSW: - value->rValue = model->BSIM3v0prdsw; - return(OK); - case BSIM3v0_MOD_PPRWB: - value->rValue = model->BSIM3v0pprwb; - return(OK); - case BSIM3v0_MOD_PPRWG: - value->rValue = model->BSIM3v0pprwg; - return(OK); - case BSIM3v0_MOD_PPRT: - value->rValue = model->BSIM3v0pprt; - return(OK); - case BSIM3v0_MOD_PETA0: - value->rValue = model->BSIM3v0peta0; - return(OK); - case BSIM3v0_MOD_PETAB: - value->rValue = model->BSIM3v0petab; - return(OK); - case BSIM3v0_MOD_PPCLM: - value->rValue = model->BSIM3v0ppclm; - return(OK); - case BSIM3v0_MOD_PPDIBL1: - value->rValue = model->BSIM3v0ppdibl1; - return(OK); - case BSIM3v0_MOD_PPDIBL2: - value->rValue = model->BSIM3v0ppdibl2; - return(OK); - case BSIM3v0_MOD_PPDIBLB: - value->rValue = model->BSIM3v0ppdiblb; - return(OK); - case BSIM3v0_MOD_PPSCBE1: - value->rValue = model->BSIM3v0ppscbe1; - return(OK); - case BSIM3v0_MOD_PPSCBE2: - value->rValue = model->BSIM3v0ppscbe2; - return(OK); - case BSIM3v0_MOD_PPVAG: - value->rValue = model->BSIM3v0ppvag; - return(OK); - case BSIM3v0_MOD_PWR: - value->rValue = model->BSIM3v0pwr; - return(OK); - case BSIM3v0_MOD_PDWG: - value->rValue = model->BSIM3v0pdwg; - return(OK); - case BSIM3v0_MOD_PDWB: - value->rValue = model->BSIM3v0pdwb; - return(OK); - case BSIM3v0_MOD_PB0: - value->rValue = model->BSIM3v0pb0; - return(OK); - case BSIM3v0_MOD_PB1: - value->rValue = model->BSIM3v0pb1; - return(OK); - case BSIM3v0_MOD_PALPHA0: - value->rValue = model->BSIM3v0palpha0; - return(OK); - case BSIM3v0_MOD_PBETA0: - value->rValue = model->BSIM3v0pbeta0; - return(OK); - - case BSIM3v0_MOD_PELM: - value->rValue = model->BSIM3v0pelm; - return(OK); - case BSIM3v0_MOD_PCGSL: - value->rValue = model->BSIM3v0pcgsl; - return(OK); - case BSIM3v0_MOD_PCGDL: - value->rValue = model->BSIM3v0pcgdl; - return(OK); - case BSIM3v0_MOD_PCKAPPA: - value->rValue = model->BSIM3v0pckappa; - return(OK); - case BSIM3v0_MOD_PCF: - value->rValue = model->BSIM3v0pcf; - return(OK); - case BSIM3v0_MOD_PCLC: - value->rValue = model->BSIM3v0pclc; - return(OK); - case BSIM3v0_MOD_PCLE: - value->rValue = model->BSIM3v0pcle; - return(OK); - - case BSIM3v0_MOD_TNOM : - value->rValue = model->BSIM3v0tnom; - return(OK); - case BSIM3v0_MOD_CGSO: - value->rValue = model->BSIM3v0cgso; - return(OK); - case BSIM3v0_MOD_CGDO: - value->rValue = model->BSIM3v0cgdo; - return(OK); - case BSIM3v0_MOD_CGBO: - value->rValue = model->BSIM3v0cgbo; - return(OK); - case BSIM3v0_MOD_XPART: - value->rValue = model->BSIM3v0xpart; - return(OK); - case BSIM3v0_MOD_RSH: - value->rValue = model->BSIM3v0sheetResistance; - return(OK); - case BSIM3v0_MOD_JS: - value->rValue = model->BSIM3v0jctSatCurDensity; - return(OK); - case BSIM3v0_MOD_PB: - value->rValue = model->BSIM3v0bulkJctPotential; - return(OK); - case BSIM3v0_MOD_MJ: - value->rValue = model->BSIM3v0bulkJctBotGradingCoeff; - return(OK); - case BSIM3v0_MOD_PBSW: - value->rValue = model->BSIM3v0sidewallJctPotential; - return(OK); - case BSIM3v0_MOD_MJSW: - value->rValue = model->BSIM3v0bulkJctSideGradingCoeff; - return(OK); - case BSIM3v0_MOD_CJ: - value->rValue = model->BSIM3v0unitAreaJctCap; - return(OK); - case BSIM3v0_MOD_CJSW: - value->rValue = model->BSIM3v0unitLengthSidewallJctCap; - return(OK); - case BSIM3v0_MOD_LINT: - value->rValue = model->BSIM3v0Lint; - return(OK); - case BSIM3v0_MOD_LL: - value->rValue = model->BSIM3v0Ll; - return(OK); - case BSIM3v0_MOD_LLN: - value->rValue = model->BSIM3v0Lln; - return(OK); - case BSIM3v0_MOD_LW: - value->rValue = model->BSIM3v0Lw; - return(OK); - case BSIM3v0_MOD_LWN: - value->rValue = model->BSIM3v0Lwn; - return(OK); - case BSIM3v0_MOD_LWL: - value->rValue = model->BSIM3v0Lwl; - return(OK); - case BSIM3v0_MOD_LMIN: - value->rValue = model->BSIM3v0Lmin; - return(OK); - case BSIM3v0_MOD_LMAX: - value->rValue = model->BSIM3v0Lmax; - return(OK); - case BSIM3v0_MOD_WINT: - value->rValue = model->BSIM3v0Wint; - return(OK); - case BSIM3v0_MOD_WL: - value->rValue = model->BSIM3v0Wl; - return(OK); - case BSIM3v0_MOD_WLN: - value->rValue = model->BSIM3v0Wln; - return(OK); - case BSIM3v0_MOD_WW: - value->rValue = model->BSIM3v0Ww; - return(OK); - case BSIM3v0_MOD_WWN: - value->rValue = model->BSIM3v0Wwn; - return(OK); - case BSIM3v0_MOD_WWL: - value->rValue = model->BSIM3v0Wwl; - return(OK); - case BSIM3v0_MOD_WMIN: - value->rValue = model->BSIM3v0Wmin; - return(OK); - case BSIM3v0_MOD_WMAX: - value->rValue = model->BSIM3v0Wmax; - return(OK); - case BSIM3v0_MOD_NOIA: - value->rValue = model->BSIM3v0oxideTrapDensityA; - return(OK); - case BSIM3v0_MOD_NOIB: - value->rValue = model->BSIM3v0oxideTrapDensityB; - return(OK); - case BSIM3v0_MOD_NOIC: - value->rValue = model->BSIM3v0oxideTrapDensityC; - return(OK); - case BSIM3v0_MOD_EM: - value->rValue = model->BSIM3v0em; - return(OK); - case BSIM3v0_MOD_EF: - value->rValue = model->BSIM3v0ef; - return(OK); - case BSIM3v0_MOD_AF: - value->rValue = model->BSIM3v0af; - return(OK); - case BSIM3v0_MOD_KF: - value->rValue = model->BSIM3v0kf; - return(OK); - default: - return(E_BADPARM); - } - /* NOTREACHED */ -} - - - diff --git a/src/spicelib/devices/bsim3v0/b3v0mpar.c b/src/spicelib/devices/bsim3v0/b3v0mpar.c deleted file mode 100644 index bc7a3e47c..000000000 --- a/src/spicelib/devices/bsim3v0/b3v0mpar.c +++ /dev/null @@ -1,1482 +0,0 @@ -/********** -Copyright 1990 Regents of the University of California. All rights reserved. -Author: 1995 Min-Chie Jeng and Mansun Chan. -File: b3v0mpar.c -**********/ - -#include "ngspice/ngspice.h" -#include "bsim3v0def.h" -#include "ngspice/ifsim.h" -#include "ngspice/sperror.h" -#include "ngspice/suffix.h" - - -int -BSIM3v0mParam(int param, IFvalue *value, GENmodel *inMod) -{ - BSIM3v0model *mod = (BSIM3v0model*)inMod; - switch(param) - { case BSIM3v0_MOD_MOBMOD : - mod->BSIM3v0mobMod = value->iValue; - mod->BSIM3v0mobModGiven = TRUE; - break; - case BSIM3v0_MOD_BINUNIT : - mod->BSIM3v0binUnit = value->iValue; - mod->BSIM3v0binUnitGiven = TRUE; - break; - case BSIM3v0_MOD_CAPMOD : - mod->BSIM3v0capMod = value->iValue; - mod->BSIM3v0capModGiven = TRUE; - break; - case BSIM3v0_MOD_NQSMOD : - mod->BSIM3v0nqsMod = value->iValue; - mod->BSIM3v0nqsModGiven = TRUE; - break; - case BSIM3v0_MOD_NOIMOD : - mod->BSIM3v0noiMod = value->iValue; - mod->BSIM3v0noiModGiven = TRUE; - break; - case BSIM3v0_MOD_TOX : - mod->BSIM3v0tox = value->rValue; - mod->BSIM3v0toxGiven = TRUE; - break; - - case BSIM3v0_MOD_CDSC : - mod->BSIM3v0cdsc = value->rValue; - mod->BSIM3v0cdscGiven = TRUE; - break; - case BSIM3v0_MOD_CDSCB : - mod->BSIM3v0cdscb = value->rValue; - mod->BSIM3v0cdscbGiven = TRUE; - break; - - case BSIM3v0_MOD_CDSCD : - mod->BSIM3v0cdscd = value->rValue; - mod->BSIM3v0cdscdGiven = TRUE; - break; - - case BSIM3v0_MOD_CIT : - mod->BSIM3v0cit = value->rValue; - mod->BSIM3v0citGiven = TRUE; - break; - case BSIM3v0_MOD_NFACTOR : - mod->BSIM3v0nfactor = value->rValue; - mod->BSIM3v0nfactorGiven = TRUE; - break; - case BSIM3v0_MOD_XJ: - mod->BSIM3v0xj = value->rValue; - mod->BSIM3v0xjGiven = TRUE; - break; - case BSIM3v0_MOD_VSAT: - mod->BSIM3v0vsat = value->rValue; - mod->BSIM3v0vsatGiven = TRUE; - break; - case BSIM3v0_MOD_A0: - mod->BSIM3v0a0 = value->rValue; - mod->BSIM3v0a0Given = TRUE; - break; - - case BSIM3v0_MOD_AGS: - mod->BSIM3v0ags= value->rValue; - mod->BSIM3v0agsGiven = TRUE; - break; - - case BSIM3v0_MOD_A1: - mod->BSIM3v0a1 = value->rValue; - mod->BSIM3v0a1Given = TRUE; - break; - case BSIM3v0_MOD_A2: - mod->BSIM3v0a2 = value->rValue; - mod->BSIM3v0a2Given = TRUE; - break; - case BSIM3v0_MOD_AT: - mod->BSIM3v0at = value->rValue; - mod->BSIM3v0atGiven = TRUE; - break; - case BSIM3v0_MOD_KETA: - mod->BSIM3v0keta = value->rValue; - mod->BSIM3v0ketaGiven = TRUE; - break; - case BSIM3v0_MOD_NSUB: - mod->BSIM3v0nsub = value->rValue; - mod->BSIM3v0nsubGiven = TRUE; - break; - case BSIM3v0_MOD_NPEAK: - mod->BSIM3v0npeak = value->rValue; - mod->BSIM3v0npeakGiven = TRUE; - if (mod->BSIM3v0npeak > 1.0e20) - mod->BSIM3v0npeak *= 1.0e-6; - break; - case BSIM3v0_MOD_NGATE: - mod->BSIM3v0ngate = value->rValue; - mod->BSIM3v0ngateGiven = TRUE; - if (mod->BSIM3v0ngate > 1.0e23) - mod->BSIM3v0ngate *= 1.0e-6; - break; - case BSIM3v0_MOD_GAMMA1: - mod->BSIM3v0gamma1 = value->rValue; - mod->BSIM3v0gamma1Given = TRUE; - break; - case BSIM3v0_MOD_GAMMA2: - mod->BSIM3v0gamma2 = value->rValue; - mod->BSIM3v0gamma2Given = TRUE; - break; - case BSIM3v0_MOD_VBX: - mod->BSIM3v0vbx = value->rValue; - mod->BSIM3v0vbxGiven = TRUE; - break; - case BSIM3v0_MOD_VBM: - mod->BSIM3v0vbm = value->rValue; - mod->BSIM3v0vbmGiven = TRUE; - break; - case BSIM3v0_MOD_XT: - mod->BSIM3v0xt = value->rValue; - mod->BSIM3v0xtGiven = TRUE; - break; - case BSIM3v0_MOD_K1: - mod->BSIM3v0k1 = value->rValue; - mod->BSIM3v0k1Given = TRUE; - break; - case BSIM3v0_MOD_KT1: - mod->BSIM3v0kt1 = value->rValue; - mod->BSIM3v0kt1Given = TRUE; - break; - case BSIM3v0_MOD_KT1L: - mod->BSIM3v0kt1l = value->rValue; - mod->BSIM3v0kt1lGiven = TRUE; - break; - case BSIM3v0_MOD_KT2: - mod->BSIM3v0kt2 = value->rValue; - mod->BSIM3v0kt2Given = TRUE; - break; - case BSIM3v0_MOD_K2: - mod->BSIM3v0k2 = value->rValue; - mod->BSIM3v0k2Given = TRUE; - break; - case BSIM3v0_MOD_K3: - mod->BSIM3v0k3 = value->rValue; - mod->BSIM3v0k3Given = TRUE; - break; - case BSIM3v0_MOD_K3B: - mod->BSIM3v0k3b = value->rValue; - mod->BSIM3v0k3bGiven = TRUE; - break; - case BSIM3v0_MOD_NLX: - mod->BSIM3v0nlx = value->rValue; - mod->BSIM3v0nlxGiven = TRUE; - break; - case BSIM3v0_MOD_W0: - mod->BSIM3v0w0 = value->rValue; - mod->BSIM3v0w0Given = TRUE; - break; - case BSIM3v0_MOD_DVT0: - mod->BSIM3v0dvt0 = value->rValue; - mod->BSIM3v0dvt0Given = TRUE; - break; - case BSIM3v0_MOD_DVT1: - mod->BSIM3v0dvt1 = value->rValue; - mod->BSIM3v0dvt1Given = TRUE; - break; - case BSIM3v0_MOD_DVT2: - mod->BSIM3v0dvt2 = value->rValue; - mod->BSIM3v0dvt2Given = TRUE; - break; - case BSIM3v0_MOD_DVT0W: - mod->BSIM3v0dvt0w = value->rValue; - mod->BSIM3v0dvt0wGiven = TRUE; - break; - case BSIM3v0_MOD_DVT1W: - mod->BSIM3v0dvt1w = value->rValue; - mod->BSIM3v0dvt1wGiven = TRUE; - break; - case BSIM3v0_MOD_DVT2W: - mod->BSIM3v0dvt2w = value->rValue; - mod->BSIM3v0dvt2wGiven = TRUE; - break; - case BSIM3v0_MOD_DROUT: - mod->BSIM3v0drout = value->rValue; - mod->BSIM3v0droutGiven = TRUE; - break; - case BSIM3v0_MOD_DSUB: - mod->BSIM3v0dsub = value->rValue; - mod->BSIM3v0dsubGiven = TRUE; - break; - case BSIM3v0_MOD_VTH0: - mod->BSIM3v0vth0 = value->rValue; - mod->BSIM3v0vth0Given = TRUE; - break; - case BSIM3v0_MOD_UA: - mod->BSIM3v0ua = value->rValue; - mod->BSIM3v0uaGiven = TRUE; - break; - case BSIM3v0_MOD_UA1: - mod->BSIM3v0ua1 = value->rValue; - mod->BSIM3v0ua1Given = TRUE; - break; - case BSIM3v0_MOD_UB: - mod->BSIM3v0ub = value->rValue; - mod->BSIM3v0ubGiven = TRUE; - break; - case BSIM3v0_MOD_UB1: - mod->BSIM3v0ub1 = value->rValue; - mod->BSIM3v0ub1Given = TRUE; - break; - case BSIM3v0_MOD_UC: - mod->BSIM3v0uc = value->rValue; - mod->BSIM3v0ucGiven = TRUE; - break; - case BSIM3v0_MOD_UC1: - mod->BSIM3v0uc1 = value->rValue; - mod->BSIM3v0uc1Given = TRUE; - break; - case BSIM3v0_MOD_U0 : - mod->BSIM3v0u0 = value->rValue; - mod->BSIM3v0u0Given = TRUE; - if (mod->BSIM3v0u0 > 1.0) - mod->BSIM3v0u0 *= 1.0e-4; - break; - case BSIM3v0_MOD_UTE : - mod->BSIM3v0ute = value->rValue; - mod->BSIM3v0uteGiven = TRUE; - break; - case BSIM3v0_MOD_VOFF: - mod->BSIM3v0voff = value->rValue; - mod->BSIM3v0voffGiven = TRUE; - break; - case BSIM3v0_MOD_DELTA : - mod->BSIM3v0delta = value->rValue; - mod->BSIM3v0deltaGiven = TRUE; - break; - case BSIM3v0_MOD_RDSW: - mod->BSIM3v0rdsw = value->rValue; - mod->BSIM3v0rdswGiven = TRUE; - break; - case BSIM3v0_MOD_PRWG: - mod->BSIM3v0prwg = value->rValue; - mod->BSIM3v0prwgGiven = TRUE; - break; - case BSIM3v0_MOD_PRWB: - mod->BSIM3v0prwb = value->rValue; - mod->BSIM3v0prwbGiven = TRUE; - break; - case BSIM3v0_MOD_PRT: - mod->BSIM3v0prt = value->rValue; - mod->BSIM3v0prtGiven = TRUE; - break; - case BSIM3v0_MOD_ETA0: - mod->BSIM3v0eta0 = value->rValue; - mod->BSIM3v0eta0Given = TRUE; - break; - case BSIM3v0_MOD_ETAB: - mod->BSIM3v0etab = value->rValue; - mod->BSIM3v0etabGiven = TRUE; - break; - case BSIM3v0_MOD_PCLM: - mod->BSIM3v0pclm = value->rValue; - mod->BSIM3v0pclmGiven = TRUE; - break; - case BSIM3v0_MOD_PDIBL1: - mod->BSIM3v0pdibl1 = value->rValue; - mod->BSIM3v0pdibl1Given = TRUE; - break; - case BSIM3v0_MOD_PDIBL2: - mod->BSIM3v0pdibl2 = value->rValue; - mod->BSIM3v0pdibl2Given = TRUE; - break; - case BSIM3v0_MOD_PDIBLB: - mod->BSIM3v0pdiblb = value->rValue; - mod->BSIM3v0pdiblbGiven = TRUE; - break; - case BSIM3v0_MOD_PSCBE1: - mod->BSIM3v0pscbe1 = value->rValue; - mod->BSIM3v0pscbe1Given = TRUE; - break; - case BSIM3v0_MOD_PSCBE2: - mod->BSIM3v0pscbe2 = value->rValue; - mod->BSIM3v0pscbe2Given = TRUE; - break; - case BSIM3v0_MOD_PVAG: - mod->BSIM3v0pvag = value->rValue; - mod->BSIM3v0pvagGiven = TRUE; - break; - case BSIM3v0_MOD_WR : - mod->BSIM3v0wr = value->rValue; - mod->BSIM3v0wrGiven = TRUE; - break; - case BSIM3v0_MOD_DWG : - mod->BSIM3v0dwg = value->rValue; - mod->BSIM3v0dwgGiven = TRUE; - break; - case BSIM3v0_MOD_DWB : - mod->BSIM3v0dwb = value->rValue; - mod->BSIM3v0dwbGiven = TRUE; - break; - case BSIM3v0_MOD_B0 : - mod->BSIM3v0b0 = value->rValue; - mod->BSIM3v0b0Given = TRUE; - break; - case BSIM3v0_MOD_B1 : - mod->BSIM3v0b1 = value->rValue; - mod->BSIM3v0b1Given = TRUE; - break; - case BSIM3v0_MOD_ALPHA0 : - mod->BSIM3v0alpha0 = value->rValue; - mod->BSIM3v0alpha0Given = TRUE; - break; - case BSIM3v0_MOD_BETA0 : - mod->BSIM3v0beta0 = value->rValue; - mod->BSIM3v0beta0Given = TRUE; - break; - - case BSIM3v0_MOD_ELM : - mod->BSIM3v0elm = value->rValue; - mod->BSIM3v0elmGiven = TRUE; - break; - case BSIM3v0_MOD_CGSL : - mod->BSIM3v0cgsl = value->rValue; - mod->BSIM3v0cgslGiven = TRUE; - break; - case BSIM3v0_MOD_CGDL : - mod->BSIM3v0cgdl = value->rValue; - mod->BSIM3v0cgdlGiven = TRUE; - break; - case BSIM3v0_MOD_CKAPPA : - mod->BSIM3v0ckappa = value->rValue; - mod->BSIM3v0ckappaGiven = TRUE; - break; - case BSIM3v0_MOD_CF : - mod->BSIM3v0cf = value->rValue; - mod->BSIM3v0cfGiven = TRUE; - break; - case BSIM3v0_MOD_CLC : - mod->BSIM3v0clc = value->rValue; - mod->BSIM3v0clcGiven = TRUE; - break; - case BSIM3v0_MOD_CLE : - mod->BSIM3v0cle = value->rValue; - mod->BSIM3v0cleGiven = TRUE; - break; - case BSIM3v0_MOD_DWC : - mod->BSIM3v0dwc = value->rValue; - mod->BSIM3v0dwcGiven = TRUE; - break; - case BSIM3v0_MOD_DLC : - mod->BSIM3v0dlc = value->rValue; - mod->BSIM3v0dlcGiven = TRUE; - break; - - /* Length dependence */ - case BSIM3v0_MOD_LCDSC : - mod->BSIM3v0lcdsc = value->rValue; - mod->BSIM3v0lcdscGiven = TRUE; - break; - - - case BSIM3v0_MOD_LCDSCB : - mod->BSIM3v0lcdscb = value->rValue; - mod->BSIM3v0lcdscbGiven = TRUE; - break; - case BSIM3v0_MOD_LCDSCD : - mod->BSIM3v0lcdscd = value->rValue; - mod->BSIM3v0lcdscdGiven = TRUE; - break; - case BSIM3v0_MOD_LCIT : - mod->BSIM3v0lcit = value->rValue; - mod->BSIM3v0lcitGiven = TRUE; - break; - case BSIM3v0_MOD_LNFACTOR : - mod->BSIM3v0lnfactor = value->rValue; - mod->BSIM3v0lnfactorGiven = TRUE; - break; - case BSIM3v0_MOD_LXJ: - mod->BSIM3v0lxj = value->rValue; - mod->BSIM3v0lxjGiven = TRUE; - break; - case BSIM3v0_MOD_LVSAT: - mod->BSIM3v0lvsat = value->rValue; - mod->BSIM3v0lvsatGiven = TRUE; - break; - - - case BSIM3v0_MOD_LA0: - mod->BSIM3v0la0 = value->rValue; - mod->BSIM3v0la0Given = TRUE; - break; - case BSIM3v0_MOD_LAGS: - mod->BSIM3v0lags = value->rValue; - mod->BSIM3v0lagsGiven = TRUE; - break; - case BSIM3v0_MOD_LA1: - mod->BSIM3v0la1 = value->rValue; - mod->BSIM3v0la1Given = TRUE; - break; - case BSIM3v0_MOD_LA2: - mod->BSIM3v0la2 = value->rValue; - mod->BSIM3v0la2Given = TRUE; - break; - case BSIM3v0_MOD_LAT: - mod->BSIM3v0lat = value->rValue; - mod->BSIM3v0latGiven = TRUE; - break; - case BSIM3v0_MOD_LKETA: - mod->BSIM3v0lketa = value->rValue; - mod->BSIM3v0lketaGiven = TRUE; - break; - case BSIM3v0_MOD_LNSUB: - mod->BSIM3v0lnsub = value->rValue; - mod->BSIM3v0lnsubGiven = TRUE; - break; - case BSIM3v0_MOD_LNPEAK: - mod->BSIM3v0lnpeak = value->rValue; - mod->BSIM3v0lnpeakGiven = TRUE; - if (mod->BSIM3v0lnpeak > 1.0e20) - mod->BSIM3v0lnpeak *= 1.0e-6; - break; - case BSIM3v0_MOD_LNGATE: - mod->BSIM3v0lngate = value->rValue; - mod->BSIM3v0lngateGiven = TRUE; - if (mod->BSIM3v0lngate > 1.0e23) - mod->BSIM3v0lngate *= 1.0e-6; - break; - case BSIM3v0_MOD_LGAMMA1: - mod->BSIM3v0lgamma1 = value->rValue; - mod->BSIM3v0lgamma1Given = TRUE; - break; - case BSIM3v0_MOD_LGAMMA2: - mod->BSIM3v0lgamma2 = value->rValue; - mod->BSIM3v0lgamma2Given = TRUE; - break; - case BSIM3v0_MOD_LVBX: - mod->BSIM3v0lvbx = value->rValue; - mod->BSIM3v0lvbxGiven = TRUE; - break; - case BSIM3v0_MOD_LVBM: - mod->BSIM3v0lvbm = value->rValue; - mod->BSIM3v0lvbmGiven = TRUE; - break; - case BSIM3v0_MOD_LXT: - mod->BSIM3v0lxt = value->rValue; - mod->BSIM3v0lxtGiven = TRUE; - break; - case BSIM3v0_MOD_LK1: - mod->BSIM3v0lk1 = value->rValue; - mod->BSIM3v0lk1Given = TRUE; - break; - case BSIM3v0_MOD_LKT1: - mod->BSIM3v0lkt1 = value->rValue; - mod->BSIM3v0lkt1Given = TRUE; - break; - case BSIM3v0_MOD_LKT1L: - mod->BSIM3v0lkt1l = value->rValue; - mod->BSIM3v0lkt1lGiven = TRUE; - break; - case BSIM3v0_MOD_LKT2: - mod->BSIM3v0lkt2 = value->rValue; - mod->BSIM3v0lkt2Given = TRUE; - break; - case BSIM3v0_MOD_LK2: - mod->BSIM3v0lk2 = value->rValue; - mod->BSIM3v0lk2Given = TRUE; - break; - case BSIM3v0_MOD_LK3: - mod->BSIM3v0lk3 = value->rValue; - mod->BSIM3v0lk3Given = TRUE; - break; - case BSIM3v0_MOD_LK3B: - mod->BSIM3v0lk3b = value->rValue; - mod->BSIM3v0lk3bGiven = TRUE; - break; - case BSIM3v0_MOD_LNLX: - mod->BSIM3v0lnlx = value->rValue; - mod->BSIM3v0lnlxGiven = TRUE; - break; - case BSIM3v0_MOD_LW0: - mod->BSIM3v0lw0 = value->rValue; - mod->BSIM3v0lw0Given = TRUE; - break; - case BSIM3v0_MOD_LDVT0: - mod->BSIM3v0ldvt0 = value->rValue; - mod->BSIM3v0ldvt0Given = TRUE; - break; - case BSIM3v0_MOD_LDVT1: - mod->BSIM3v0ldvt1 = value->rValue; - mod->BSIM3v0ldvt1Given = TRUE; - break; - case BSIM3v0_MOD_LDVT2: - mod->BSIM3v0ldvt2 = value->rValue; - mod->BSIM3v0ldvt2Given = TRUE; - break; - case BSIM3v0_MOD_LDVT0W: - mod->BSIM3v0ldvt0w = value->rValue; - mod->BSIM3v0ldvt0Given = TRUE; - break; - case BSIM3v0_MOD_LDVT1W: - mod->BSIM3v0ldvt1 = value->rValue; - mod->BSIM3v0ldvt1wGiven = TRUE; - break; - case BSIM3v0_MOD_LDVT2W: - mod->BSIM3v0ldvt2 = value->rValue; - mod->BSIM3v0ldvt2wGiven = TRUE; - break; - case BSIM3v0_MOD_LDROUT: - mod->BSIM3v0ldrout = value->rValue; - mod->BSIM3v0ldroutGiven = TRUE; - break; - case BSIM3v0_MOD_LDSUB: - mod->BSIM3v0ldsub = value->rValue; - mod->BSIM3v0ldsubGiven = TRUE; - break; - case BSIM3v0_MOD_LVTH0: - mod->BSIM3v0lvth0 = value->rValue; - mod->BSIM3v0lvth0Given = TRUE; - break; - case BSIM3v0_MOD_LUA: - mod->BSIM3v0lua = value->rValue; - mod->BSIM3v0luaGiven = TRUE; - break; - case BSIM3v0_MOD_LUA1: - mod->BSIM3v0lua1 = value->rValue; - mod->BSIM3v0lua1Given = TRUE; - break; - case BSIM3v0_MOD_LUB: - mod->BSIM3v0lub = value->rValue; - mod->BSIM3v0lubGiven = TRUE; - break; - case BSIM3v0_MOD_LUB1: - mod->BSIM3v0lub1 = value->rValue; - mod->BSIM3v0lub1Given = TRUE; - break; - case BSIM3v0_MOD_LUC: - mod->BSIM3v0luc = value->rValue; - mod->BSIM3v0lucGiven = TRUE; - break; - case BSIM3v0_MOD_LUC1: - mod->BSIM3v0luc1 = value->rValue; - mod->BSIM3v0luc1Given = TRUE; - break; - case BSIM3v0_MOD_LU0 : - mod->BSIM3v0lu0 = value->rValue; - mod->BSIM3v0lu0Given = TRUE; - if (mod->BSIM3v0lu0 > 1.0) - mod->BSIM3v0lu0 *= 1.0e-4; - break; - case BSIM3v0_MOD_LUTE : - mod->BSIM3v0lute = value->rValue; - mod->BSIM3v0luteGiven = TRUE; - break; - case BSIM3v0_MOD_LVOFF: - mod->BSIM3v0lvoff = value->rValue; - mod->BSIM3v0lvoffGiven = TRUE; - break; - case BSIM3v0_MOD_LDELTA : - mod->BSIM3v0ldelta = value->rValue; - mod->BSIM3v0ldeltaGiven = TRUE; - break; - case BSIM3v0_MOD_LRDSW: - mod->BSIM3v0lrdsw = value->rValue; - mod->BSIM3v0lrdswGiven = TRUE; - break; - case BSIM3v0_MOD_LPRWB: - mod->BSIM3v0lprwb = value->rValue; - mod->BSIM3v0lprwbGiven = TRUE; - break; - case BSIM3v0_MOD_LPRWG: - mod->BSIM3v0lprwg = value->rValue; - mod->BSIM3v0lprwgGiven = TRUE; - break; - case BSIM3v0_MOD_LPRT: - mod->BSIM3v0lprt = value->rValue; - mod->BSIM3v0lprtGiven = TRUE; - break; - case BSIM3v0_MOD_LETA0: - mod->BSIM3v0leta0 = value->rValue; - mod->BSIM3v0leta0Given = TRUE; - break; - case BSIM3v0_MOD_LETAB: - mod->BSIM3v0letab = value->rValue; - mod->BSIM3v0letabGiven = TRUE; - break; - case BSIM3v0_MOD_LPCLM: - mod->BSIM3v0lpclm = value->rValue; - mod->BSIM3v0lpclmGiven = TRUE; - break; - case BSIM3v0_MOD_LPDIBL1: - mod->BSIM3v0lpdibl1 = value->rValue; - mod->BSIM3v0lpdibl1Given = TRUE; - break; - case BSIM3v0_MOD_LPDIBL2: - mod->BSIM3v0lpdibl2 = value->rValue; - mod->BSIM3v0lpdibl2Given = TRUE; - break; - case BSIM3v0_MOD_LPDIBLB: - mod->BSIM3v0lpdiblb = value->rValue; - mod->BSIM3v0lpdiblbGiven = TRUE; - break; - case BSIM3v0_MOD_LPSCBE1: - mod->BSIM3v0lpscbe1 = value->rValue; - mod->BSIM3v0lpscbe1Given = TRUE; - break; - case BSIM3v0_MOD_LPSCBE2: - mod->BSIM3v0lpscbe2 = value->rValue; - mod->BSIM3v0lpscbe2Given = TRUE; - break; - case BSIM3v0_MOD_LPVAG: - mod->BSIM3v0lpvag = value->rValue; - mod->BSIM3v0lpvagGiven = TRUE; - break; - case BSIM3v0_MOD_LWR : - mod->BSIM3v0lwr = value->rValue; - mod->BSIM3v0lwrGiven = TRUE; - break; - case BSIM3v0_MOD_LDWG : - mod->BSIM3v0ldwg = value->rValue; - mod->BSIM3v0ldwgGiven = TRUE; - break; - case BSIM3v0_MOD_LDWB : - mod->BSIM3v0ldwb = value->rValue; - mod->BSIM3v0ldwbGiven = TRUE; - break; - case BSIM3v0_MOD_LB0 : - mod->BSIM3v0lb0 = value->rValue; - mod->BSIM3v0lb0Given = TRUE; - break; - case BSIM3v0_MOD_LB1 : - mod->BSIM3v0lb1 = value->rValue; - mod->BSIM3v0lb1Given = TRUE; - break; - case BSIM3v0_MOD_LALPHA0 : - mod->BSIM3v0lalpha0 = value->rValue; - mod->BSIM3v0lalpha0Given = TRUE; - break; - case BSIM3v0_MOD_LBETA0 : - mod->BSIM3v0lbeta0 = value->rValue; - mod->BSIM3v0lbeta0Given = TRUE; - break; - - case BSIM3v0_MOD_LELM : - mod->BSIM3v0lelm = value->rValue; - mod->BSIM3v0lelmGiven = TRUE; - break; - case BSIM3v0_MOD_LCGSL : - mod->BSIM3v0lcgsl = value->rValue; - mod->BSIM3v0lcgslGiven = TRUE; - break; - case BSIM3v0_MOD_LCGDL : - mod->BSIM3v0lcgdl = value->rValue; - mod->BSIM3v0lcgdlGiven = TRUE; - break; - case BSIM3v0_MOD_LCKAPPA : - mod->BSIM3v0lckappa = value->rValue; - mod->BSIM3v0lckappaGiven = TRUE; - break; - case BSIM3v0_MOD_LCF : - mod->BSIM3v0lcf = value->rValue; - mod->BSIM3v0lcfGiven = TRUE; - break; - case BSIM3v0_MOD_LCLC : - mod->BSIM3v0lclc = value->rValue; - mod->BSIM3v0lclcGiven = TRUE; - break; - case BSIM3v0_MOD_LCLE : - mod->BSIM3v0lcle = value->rValue; - mod->BSIM3v0lcleGiven = TRUE; - break; - - /* Width dependence */ - case BSIM3v0_MOD_WCDSC : - mod->BSIM3v0wcdsc = value->rValue; - mod->BSIM3v0wcdscGiven = TRUE; - break; - - - case BSIM3v0_MOD_WCDSCB : - mod->BSIM3v0wcdscb = value->rValue; - mod->BSIM3v0wcdscbGiven = TRUE; - break; - case BSIM3v0_MOD_WCDSCD : - mod->BSIM3v0wcdscd = value->rValue; - mod->BSIM3v0wcdscdGiven = TRUE; - break; - case BSIM3v0_MOD_WCIT : - mod->BSIM3v0wcit = value->rValue; - mod->BSIM3v0wcitGiven = TRUE; - break; - case BSIM3v0_MOD_WNFACTOR : - mod->BSIM3v0wnfactor = value->rValue; - mod->BSIM3v0wnfactorGiven = TRUE; - break; - case BSIM3v0_MOD_WXJ: - mod->BSIM3v0wxj = value->rValue; - mod->BSIM3v0wxjGiven = TRUE; - break; - case BSIM3v0_MOD_WVSAT: - mod->BSIM3v0wvsat = value->rValue; - mod->BSIM3v0wvsatGiven = TRUE; - break; - - - case BSIM3v0_MOD_WA0: - mod->BSIM3v0wa0 = value->rValue; - mod->BSIM3v0wa0Given = TRUE; - break; - case BSIM3v0_MOD_WAGS: - mod->BSIM3v0wags = value->rValue; - mod->BSIM3v0wagsGiven = TRUE; - break; - case BSIM3v0_MOD_WA1: - mod->BSIM3v0wa1 = value->rValue; - mod->BSIM3v0wa1Given = TRUE; - break; - case BSIM3v0_MOD_WA2: - mod->BSIM3v0wa2 = value->rValue; - mod->BSIM3v0wa2Given = TRUE; - break; - case BSIM3v0_MOD_WAT: - mod->BSIM3v0wat = value->rValue; - mod->BSIM3v0watGiven = TRUE; - break; - case BSIM3v0_MOD_WKETA: - mod->BSIM3v0wketa = value->rValue; - mod->BSIM3v0wketaGiven = TRUE; - break; - case BSIM3v0_MOD_WNSUB: - mod->BSIM3v0wnsub = value->rValue; - mod->BSIM3v0wnsubGiven = TRUE; - break; - case BSIM3v0_MOD_WNPEAK: - mod->BSIM3v0wnpeak = value->rValue; - mod->BSIM3v0wnpeakGiven = TRUE; - if (mod->BSIM3v0wnpeak > 1.0e20) - mod->BSIM3v0wnpeak *= 1.0e-6; - break; - case BSIM3v0_MOD_WNGATE: - mod->BSIM3v0wngate = value->rValue; - mod->BSIM3v0wngateGiven = TRUE; - if (mod->BSIM3v0wngate > 1.0e23) - mod->BSIM3v0wngate *= 1.0e-6; - break; - case BSIM3v0_MOD_WGAMMA1: - mod->BSIM3v0wgamma1 = value->rValue; - mod->BSIM3v0wgamma1Given = TRUE; - break; - case BSIM3v0_MOD_WGAMMA2: - mod->BSIM3v0wgamma2 = value->rValue; - mod->BSIM3v0wgamma2Given = TRUE; - break; - case BSIM3v0_MOD_WVBX: - mod->BSIM3v0wvbx = value->rValue; - mod->BSIM3v0wvbxGiven = TRUE; - break; - case BSIM3v0_MOD_WVBM: - mod->BSIM3v0wvbm = value->rValue; - mod->BSIM3v0wvbmGiven = TRUE; - break; - case BSIM3v0_MOD_WXT: - mod->BSIM3v0wxt = value->rValue; - mod->BSIM3v0wxtGiven = TRUE; - break; - case BSIM3v0_MOD_WK1: - mod->BSIM3v0wk1 = value->rValue; - mod->BSIM3v0wk1Given = TRUE; - break; - case BSIM3v0_MOD_WKT1: - mod->BSIM3v0wkt1 = value->rValue; - mod->BSIM3v0wkt1Given = TRUE; - break; - case BSIM3v0_MOD_WKT1L: - mod->BSIM3v0wkt1l = value->rValue; - mod->BSIM3v0wkt1lGiven = TRUE; - break; - case BSIM3v0_MOD_WKT2: - mod->BSIM3v0wkt2 = value->rValue; - mod->BSIM3v0wkt2Given = TRUE; - break; - case BSIM3v0_MOD_WK2: - mod->BSIM3v0wk2 = value->rValue; - mod->BSIM3v0wk2Given = TRUE; - break; - case BSIM3v0_MOD_WK3: - mod->BSIM3v0wk3 = value->rValue; - mod->BSIM3v0wk3Given = TRUE; - break; - case BSIM3v0_MOD_WK3B: - mod->BSIM3v0wk3b = value->rValue; - mod->BSIM3v0wk3bGiven = TRUE; - break; - case BSIM3v0_MOD_WNLX: - mod->BSIM3v0wnlx = value->rValue; - mod->BSIM3v0wnlxGiven = TRUE; - break; - case BSIM3v0_MOD_WW0: - mod->BSIM3v0ww0 = value->rValue; - mod->BSIM3v0ww0Given = TRUE; - break; - case BSIM3v0_MOD_WDVT0: - mod->BSIM3v0wdvt0 = value->rValue; - mod->BSIM3v0wdvt0Given = TRUE; - break; - case BSIM3v0_MOD_WDVT1: - mod->BSIM3v0wdvt1 = value->rValue; - mod->BSIM3v0wdvt1Given = TRUE; - break; - case BSIM3v0_MOD_WDVT2: - mod->BSIM3v0wdvt2 = value->rValue; - mod->BSIM3v0wdvt2Given = TRUE; - break; - case BSIM3v0_MOD_WDVT0W: - mod->BSIM3v0wdvt0w = value->rValue; - mod->BSIM3v0wdvt0wGiven = TRUE; - break; - case BSIM3v0_MOD_WDVT1W: - mod->BSIM3v0wdvt1w = value->rValue; - mod->BSIM3v0wdvt1wGiven = TRUE; - break; - case BSIM3v0_MOD_WDVT2W: - mod->BSIM3v0wdvt2w = value->rValue; - mod->BSIM3v0wdvt2wGiven = TRUE; - break; - case BSIM3v0_MOD_WDROUT: - mod->BSIM3v0wdrout = value->rValue; - mod->BSIM3v0wdroutGiven = TRUE; - break; - case BSIM3v0_MOD_WDSUB: - mod->BSIM3v0wdsub = value->rValue; - mod->BSIM3v0wdsubGiven = TRUE; - break; - case BSIM3v0_MOD_WVTH0: - mod->BSIM3v0wvth0 = value->rValue; - mod->BSIM3v0wvth0Given = TRUE; - break; - case BSIM3v0_MOD_WUA: - mod->BSIM3v0wua = value->rValue; - mod->BSIM3v0wuaGiven = TRUE; - break; - case BSIM3v0_MOD_WUA1: - mod->BSIM3v0wua1 = value->rValue; - mod->BSIM3v0wua1Given = TRUE; - break; - case BSIM3v0_MOD_WUB: - mod->BSIM3v0wub = value->rValue; - mod->BSIM3v0wubGiven = TRUE; - break; - case BSIM3v0_MOD_WUB1: - mod->BSIM3v0wub1 = value->rValue; - mod->BSIM3v0wub1Given = TRUE; - break; - case BSIM3v0_MOD_WUC: - mod->BSIM3v0wuc = value->rValue; - mod->BSIM3v0wucGiven = TRUE; - break; - case BSIM3v0_MOD_WUC1: - mod->BSIM3v0wuc1 = value->rValue; - mod->BSIM3v0wuc1Given = TRUE; - break; - case BSIM3v0_MOD_WU0 : - mod->BSIM3v0wu0 = value->rValue; - mod->BSIM3v0wu0Given = TRUE; - if (mod->BSIM3v0wu0 > 1.0) - mod->BSIM3v0wu0 *= 1.0e-4; - break; - case BSIM3v0_MOD_WUTE : - mod->BSIM3v0wute = value->rValue; - mod->BSIM3v0wuteGiven = TRUE; - break; - case BSIM3v0_MOD_WVOFF: - mod->BSIM3v0wvoff = value->rValue; - mod->BSIM3v0wvoffGiven = TRUE; - break; - case BSIM3v0_MOD_WDELTA : - mod->BSIM3v0wdelta = value->rValue; - mod->BSIM3v0wdeltaGiven = TRUE; - break; - case BSIM3v0_MOD_WRDSW: - mod->BSIM3v0wrdsw = value->rValue; - mod->BSIM3v0wrdswGiven = TRUE; - break; - case BSIM3v0_MOD_WPRWB: - mod->BSIM3v0wprwb = value->rValue; - mod->BSIM3v0wprwbGiven = TRUE; - break; - case BSIM3v0_MOD_WPRWG: - mod->BSIM3v0wprwg = value->rValue; - mod->BSIM3v0wprwgGiven = TRUE; - break; - case BSIM3v0_MOD_WPRT: - mod->BSIM3v0wprt = value->rValue; - mod->BSIM3v0wprtGiven = TRUE; - break; - case BSIM3v0_MOD_WETA0: - mod->BSIM3v0weta0 = value->rValue; - mod->BSIM3v0weta0Given = TRUE; - break; - case BSIM3v0_MOD_WETAB: - mod->BSIM3v0wetab = value->rValue; - mod->BSIM3v0wetabGiven = TRUE; - break; - case BSIM3v0_MOD_WPCLM: - mod->BSIM3v0wpclm = value->rValue; - mod->BSIM3v0wpclmGiven = TRUE; - break; - case BSIM3v0_MOD_WPDIBL1: - mod->BSIM3v0wpdibl1 = value->rValue; - mod->BSIM3v0wpdibl1Given = TRUE; - break; - case BSIM3v0_MOD_WPDIBL2: - mod->BSIM3v0wpdibl2 = value->rValue; - mod->BSIM3v0wpdibl2Given = TRUE; - break; - case BSIM3v0_MOD_WPDIBLB: - mod->BSIM3v0wpdiblb = value->rValue; - mod->BSIM3v0wpdiblbGiven = TRUE; - break; - case BSIM3v0_MOD_WPSCBE1: - mod->BSIM3v0wpscbe1 = value->rValue; - mod->BSIM3v0wpscbe1Given = TRUE; - break; - case BSIM3v0_MOD_WPSCBE2: - mod->BSIM3v0wpscbe2 = value->rValue; - mod->BSIM3v0wpscbe2Given = TRUE; - break; - case BSIM3v0_MOD_WPVAG: - mod->BSIM3v0wpvag = value->rValue; - mod->BSIM3v0wpvagGiven = TRUE; - break; - case BSIM3v0_MOD_WWR : - mod->BSIM3v0wwr = value->rValue; - mod->BSIM3v0wwrGiven = TRUE; - break; - case BSIM3v0_MOD_WDWG : - mod->BSIM3v0wdwg = value->rValue; - mod->BSIM3v0wdwgGiven = TRUE; - break; - case BSIM3v0_MOD_WDWB : - mod->BSIM3v0wdwb = value->rValue; - mod->BSIM3v0wdwbGiven = TRUE; - break; - case BSIM3v0_MOD_WB0 : - mod->BSIM3v0wb0 = value->rValue; - mod->BSIM3v0wb0Given = TRUE; - break; - case BSIM3v0_MOD_WB1 : - mod->BSIM3v0wb1 = value->rValue; - mod->BSIM3v0wb1Given = TRUE; - break; - case BSIM3v0_MOD_WALPHA0 : - mod->BSIM3v0walpha0 = value->rValue; - mod->BSIM3v0walpha0Given = TRUE; - break; - case BSIM3v0_MOD_WBETA0 : - mod->BSIM3v0wbeta0 = value->rValue; - mod->BSIM3v0wbeta0Given = TRUE; - break; - - case BSIM3v0_MOD_WELM : - mod->BSIM3v0welm = value->rValue; - mod->BSIM3v0welmGiven = TRUE; - break; - case BSIM3v0_MOD_WCGSL : - mod->BSIM3v0wcgsl = value->rValue; - mod->BSIM3v0wcgslGiven = TRUE; - break; - case BSIM3v0_MOD_WCGDL : - mod->BSIM3v0wcgdl = value->rValue; - mod->BSIM3v0wcgdlGiven = TRUE; - break; - case BSIM3v0_MOD_WCKAPPA : - mod->BSIM3v0wckappa = value->rValue; - mod->BSIM3v0wckappaGiven = TRUE; - break; - case BSIM3v0_MOD_WCF : - mod->BSIM3v0wcf = value->rValue; - mod->BSIM3v0wcfGiven = TRUE; - break; - case BSIM3v0_MOD_WCLC : - mod->BSIM3v0wclc = value->rValue; - mod->BSIM3v0wclcGiven = TRUE; - break; - case BSIM3v0_MOD_WCLE : - mod->BSIM3v0wcle = value->rValue; - mod->BSIM3v0wcleGiven = TRUE; - break; - - /* Cross-term dependence */ - case BSIM3v0_MOD_PCDSC : - mod->BSIM3v0pcdsc = value->rValue; - mod->BSIM3v0pcdscGiven = TRUE; - break; - - - case BSIM3v0_MOD_PCDSCB : - mod->BSIM3v0pcdscb = value->rValue; - mod->BSIM3v0pcdscbGiven = TRUE; - break; - case BSIM3v0_MOD_PCDSCD : - mod->BSIM3v0pcdscd = value->rValue; - mod->BSIM3v0pcdscdGiven = TRUE; - break; - case BSIM3v0_MOD_PCIT : - mod->BSIM3v0pcit = value->rValue; - mod->BSIM3v0pcitGiven = TRUE; - break; - case BSIM3v0_MOD_PNFACTOR : - mod->BSIM3v0pnfactor = value->rValue; - mod->BSIM3v0pnfactorGiven = TRUE; - break; - case BSIM3v0_MOD_PXJ: - mod->BSIM3v0pxj = value->rValue; - mod->BSIM3v0pxjGiven = TRUE; - break; - case BSIM3v0_MOD_PVSAT: - mod->BSIM3v0pvsat = value->rValue; - mod->BSIM3v0pvsatGiven = TRUE; - break; - - - case BSIM3v0_MOD_PA0: - mod->BSIM3v0pa0 = value->rValue; - mod->BSIM3v0pa0Given = TRUE; - break; - case BSIM3v0_MOD_PAGS: - mod->BSIM3v0pags = value->rValue; - mod->BSIM3v0pagsGiven = TRUE; - break; - case BSIM3v0_MOD_PA1: - mod->BSIM3v0pa1 = value->rValue; - mod->BSIM3v0pa1Given = TRUE; - break; - case BSIM3v0_MOD_PA2: - mod->BSIM3v0pa2 = value->rValue; - mod->BSIM3v0pa2Given = TRUE; - break; - case BSIM3v0_MOD_PAT: - mod->BSIM3v0pat = value->rValue; - mod->BSIM3v0patGiven = TRUE; - break; - case BSIM3v0_MOD_PKETA: - mod->BSIM3v0pketa = value->rValue; - mod->BSIM3v0pketaGiven = TRUE; - break; - case BSIM3v0_MOD_PNSUB: - mod->BSIM3v0pnsub = value->rValue; - mod->BSIM3v0pnsubGiven = TRUE; - break; - case BSIM3v0_MOD_PNPEAK: - mod->BSIM3v0pnpeak = value->rValue; - mod->BSIM3v0pnpeakGiven = TRUE; - if (mod->BSIM3v0pnpeak > 1.0e20) - mod->BSIM3v0pnpeak *= 1.0e-6; - break; - case BSIM3v0_MOD_PNGATE: - mod->BSIM3v0pngate = value->rValue; - mod->BSIM3v0pngateGiven = TRUE; - if (mod->BSIM3v0pngate > 1.0e23) - mod->BSIM3v0pngate *= 1.0e-6; - break; - case BSIM3v0_MOD_PGAMMA1: - mod->BSIM3v0pgamma1 = value->rValue; - mod->BSIM3v0pgamma1Given = TRUE; - break; - case BSIM3v0_MOD_PGAMMA2: - mod->BSIM3v0pgamma2 = value->rValue; - mod->BSIM3v0pgamma2Given = TRUE; - break; - case BSIM3v0_MOD_PVBX: - mod->BSIM3v0pvbx = value->rValue; - mod->BSIM3v0pvbxGiven = TRUE; - break; - case BSIM3v0_MOD_PVBM: - mod->BSIM3v0pvbm = value->rValue; - mod->BSIM3v0pvbmGiven = TRUE; - break; - case BSIM3v0_MOD_PXT: - mod->BSIM3v0pxt = value->rValue; - mod->BSIM3v0pxtGiven = TRUE; - break; - case BSIM3v0_MOD_PK1: - mod->BSIM3v0pk1 = value->rValue; - mod->BSIM3v0pk1Given = TRUE; - break; - case BSIM3v0_MOD_PKT1: - mod->BSIM3v0pkt1 = value->rValue; - mod->BSIM3v0pkt1Given = TRUE; - break; - case BSIM3v0_MOD_PKT1L: - mod->BSIM3v0pkt1l = value->rValue; - mod->BSIM3v0pkt1lGiven = TRUE; - break; - case BSIM3v0_MOD_PKT2: - mod->BSIM3v0pkt2 = value->rValue; - mod->BSIM3v0pkt2Given = TRUE; - break; - case BSIM3v0_MOD_PK2: - mod->BSIM3v0pk2 = value->rValue; - mod->BSIM3v0pk2Given = TRUE; - break; - case BSIM3v0_MOD_PK3: - mod->BSIM3v0pk3 = value->rValue; - mod->BSIM3v0pk3Given = TRUE; - break; - case BSIM3v0_MOD_PK3B: - mod->BSIM3v0pk3b = value->rValue; - mod->BSIM3v0pk3bGiven = TRUE; - break; - case BSIM3v0_MOD_PNLX: - mod->BSIM3v0pnlx = value->rValue; - mod->BSIM3v0pnlxGiven = TRUE; - break; - case BSIM3v0_MOD_PW0: - mod->BSIM3v0pw0 = value->rValue; - mod->BSIM3v0pw0Given = TRUE; - break; - case BSIM3v0_MOD_PDVT0: - mod->BSIM3v0pdvt0 = value->rValue; - mod->BSIM3v0pdvt0Given = TRUE; - break; - case BSIM3v0_MOD_PDVT1: - mod->BSIM3v0pdvt1 = value->rValue; - mod->BSIM3v0pdvt1Given = TRUE; - break; - case BSIM3v0_MOD_PDVT2: - mod->BSIM3v0pdvt2 = value->rValue; - mod->BSIM3v0pdvt2Given = TRUE; - break; - case BSIM3v0_MOD_PDVT0W: - mod->BSIM3v0pdvt0w = value->rValue; - mod->BSIM3v0pdvt0wGiven = TRUE; - break; - case BSIM3v0_MOD_PDVT1W: - mod->BSIM3v0pdvt1w = value->rValue; - mod->BSIM3v0pdvt1wGiven = TRUE; - break; - case BSIM3v0_MOD_PDVT2W: - mod->BSIM3v0pdvt2w = value->rValue; - mod->BSIM3v0pdvt2wGiven = TRUE; - break; - case BSIM3v0_MOD_PDROUT: - mod->BSIM3v0pdrout = value->rValue; - mod->BSIM3v0pdroutGiven = TRUE; - break; - case BSIM3v0_MOD_PDSUB: - mod->BSIM3v0pdsub = value->rValue; - mod->BSIM3v0pdsubGiven = TRUE; - break; - case BSIM3v0_MOD_PVTH0: - mod->BSIM3v0pvth0 = value->rValue; - mod->BSIM3v0pvth0Given = TRUE; - break; - case BSIM3v0_MOD_PUA: - mod->BSIM3v0pua = value->rValue; - mod->BSIM3v0puaGiven = TRUE; - break; - case BSIM3v0_MOD_PUA1: - mod->BSIM3v0pua1 = value->rValue; - mod->BSIM3v0pua1Given = TRUE; - break; - case BSIM3v0_MOD_PUB: - mod->BSIM3v0pub = value->rValue; - mod->BSIM3v0pubGiven = TRUE; - break; - case BSIM3v0_MOD_PUB1: - mod->BSIM3v0pub1 = value->rValue; - mod->BSIM3v0pub1Given = TRUE; - break; - case BSIM3v0_MOD_PUC: - mod->BSIM3v0puc = value->rValue; - mod->BSIM3v0pucGiven = TRUE; - break; - case BSIM3v0_MOD_PUC1: - mod->BSIM3v0puc1 = value->rValue; - mod->BSIM3v0puc1Given = TRUE; - break; - case BSIM3v0_MOD_PU0 : - mod->BSIM3v0pu0 = value->rValue; - mod->BSIM3v0pu0Given = TRUE; - if (mod->BSIM3v0pu0 > 1.0) - mod->BSIM3v0pu0 *= 1.0e-4; - break; - case BSIM3v0_MOD_PUTE : - mod->BSIM3v0pute = value->rValue; - mod->BSIM3v0puteGiven = TRUE; - break; - case BSIM3v0_MOD_PVOFF: - mod->BSIM3v0pvoff = value->rValue; - mod->BSIM3v0pvoffGiven = TRUE; - break; - case BSIM3v0_MOD_PDELTA : - mod->BSIM3v0pdelta = value->rValue; - mod->BSIM3v0pdeltaGiven = TRUE; - break; - case BSIM3v0_MOD_PRDSW: - mod->BSIM3v0prdsw = value->rValue; - mod->BSIM3v0prdswGiven = TRUE; - break; - case BSIM3v0_MOD_PPRWB: - mod->BSIM3v0pprwb = value->rValue; - mod->BSIM3v0pprwbGiven = TRUE; - break; - case BSIM3v0_MOD_PPRWG: - mod->BSIM3v0pprwg = value->rValue; - mod->BSIM3v0pprwgGiven = TRUE; - break; - case BSIM3v0_MOD_PPRT: - mod->BSIM3v0pprt = value->rValue; - mod->BSIM3v0pprtGiven = TRUE; - break; - case BSIM3v0_MOD_PETA0: - mod->BSIM3v0peta0 = value->rValue; - mod->BSIM3v0peta0Given = TRUE; - break; - case BSIM3v0_MOD_PETAB: - mod->BSIM3v0petab = value->rValue; - mod->BSIM3v0petabGiven = TRUE; - break; - case BSIM3v0_MOD_PPCLM: - mod->BSIM3v0ppclm = value->rValue; - mod->BSIM3v0ppclmGiven = TRUE; - break; - case BSIM3v0_MOD_PPDIBL1: - mod->BSIM3v0ppdibl1 = value->rValue; - mod->BSIM3v0ppdibl1Given = TRUE; - break; - case BSIM3v0_MOD_PPDIBL2: - mod->BSIM3v0ppdibl2 = value->rValue; - mod->BSIM3v0ppdibl2Given = TRUE; - break; - case BSIM3v0_MOD_PPDIBLB: - mod->BSIM3v0ppdiblb = value->rValue; - mod->BSIM3v0ppdiblbGiven = TRUE; - break; - case BSIM3v0_MOD_PPSCBE1: - mod->BSIM3v0ppscbe1 = value->rValue; - mod->BSIM3v0ppscbe1Given = TRUE; - break; - case BSIM3v0_MOD_PPSCBE2: - mod->BSIM3v0ppscbe2 = value->rValue; - mod->BSIM3v0ppscbe2Given = TRUE; - break; - case BSIM3v0_MOD_PPVAG: - mod->BSIM3v0ppvag = value->rValue; - mod->BSIM3v0ppvagGiven = TRUE; - break; - case BSIM3v0_MOD_PWR : - mod->BSIM3v0pwr = value->rValue; - mod->BSIM3v0pwrGiven = TRUE; - break; - case BSIM3v0_MOD_PDWG : - mod->BSIM3v0pdwg = value->rValue; - mod->BSIM3v0pdwgGiven = TRUE; - break; - case BSIM3v0_MOD_PDWB : - mod->BSIM3v0pdwb = value->rValue; - mod->BSIM3v0pdwbGiven = TRUE; - break; - case BSIM3v0_MOD_PB0 : - mod->BSIM3v0pb0 = value->rValue; - mod->BSIM3v0pb0Given = TRUE; - break; - case BSIM3v0_MOD_PB1 : - mod->BSIM3v0pb1 = value->rValue; - mod->BSIM3v0pb1Given = TRUE; - break; - case BSIM3v0_MOD_PALPHA0 : - mod->BSIM3v0palpha0 = value->rValue; - mod->BSIM3v0palpha0Given = TRUE; - break; - case BSIM3v0_MOD_PBETA0 : - mod->BSIM3v0pbeta0 = value->rValue; - mod->BSIM3v0pbeta0Given = TRUE; - break; - - case BSIM3v0_MOD_PELM : - mod->BSIM3v0pelm = value->rValue; - mod->BSIM3v0pelmGiven = TRUE; - break; - case BSIM3v0_MOD_PCGSL : - mod->BSIM3v0pcgsl = value->rValue; - mod->BSIM3v0pcgslGiven = TRUE; - break; - case BSIM3v0_MOD_PCGDL : - mod->BSIM3v0pcgdl = value->rValue; - mod->BSIM3v0pcgdlGiven = TRUE; - break; - case BSIM3v0_MOD_PCKAPPA : - mod->BSIM3v0pckappa = value->rValue; - mod->BSIM3v0pckappaGiven = TRUE; - break; - case BSIM3v0_MOD_PCF : - mod->BSIM3v0pcf = value->rValue; - mod->BSIM3v0pcfGiven = TRUE; - break; - case BSIM3v0_MOD_PCLC : - mod->BSIM3v0pclc = value->rValue; - mod->BSIM3v0pclcGiven = TRUE; - break; - case BSIM3v0_MOD_PCLE : - mod->BSIM3v0pcle = value->rValue; - mod->BSIM3v0pcleGiven = TRUE; - break; - - case BSIM3v0_MOD_TNOM : - mod->BSIM3v0tnom = value->rValue + 273.15; - mod->BSIM3v0tnomGiven = TRUE; - break; - case BSIM3v0_MOD_CGSO : - mod->BSIM3v0cgso = value->rValue; - mod->BSIM3v0cgsoGiven = TRUE; - break; - case BSIM3v0_MOD_CGDO : - mod->BSIM3v0cgdo = value->rValue; - mod->BSIM3v0cgdoGiven = TRUE; - break; - case BSIM3v0_MOD_CGBO : - mod->BSIM3v0cgbo = value->rValue; - mod->BSIM3v0cgboGiven = TRUE; - break; - case BSIM3v0_MOD_XPART : - mod->BSIM3v0xpart = value->rValue; - mod->BSIM3v0xpartGiven = TRUE; - break; - case BSIM3v0_MOD_RSH : - mod->BSIM3v0sheetResistance = value->rValue; - mod->BSIM3v0sheetResistanceGiven = TRUE; - break; - case BSIM3v0_MOD_JS : - mod->BSIM3v0jctSatCurDensity = value->rValue; - mod->BSIM3v0jctSatCurDensityGiven = TRUE; - break; - case BSIM3v0_MOD_PB : - mod->BSIM3v0bulkJctPotential = value->rValue; - mod->BSIM3v0bulkJctPotentialGiven = TRUE; - break; - case BSIM3v0_MOD_MJ : - mod->BSIM3v0bulkJctBotGradingCoeff = value->rValue; - mod->BSIM3v0bulkJctBotGradingCoeffGiven = TRUE; - break; - case BSIM3v0_MOD_PBSW : - mod->BSIM3v0sidewallJctPotential = value->rValue; - mod->BSIM3v0sidewallJctPotentialGiven = TRUE; - break; - case BSIM3v0_MOD_MJSW : - mod->BSIM3v0bulkJctSideGradingCoeff = value->rValue; - mod->BSIM3v0bulkJctSideGradingCoeffGiven = TRUE; - break; - case BSIM3v0_MOD_CJ : - mod->BSIM3v0unitAreaJctCap = value->rValue; - mod->BSIM3v0unitAreaJctCapGiven = TRUE; - break; - case BSIM3v0_MOD_CJSW : - mod->BSIM3v0unitLengthSidewallJctCap = value->rValue; - mod->BSIM3v0unitLengthSidewallJctCapGiven = TRUE; - break; - case BSIM3v0_MOD_LINT : - mod->BSIM3v0Lint = value->rValue; - mod->BSIM3v0LintGiven = TRUE; - break; - case BSIM3v0_MOD_LL : - mod->BSIM3v0Ll = value->rValue; - mod->BSIM3v0LlGiven = TRUE; - break; - case BSIM3v0_MOD_LLN : - mod->BSIM3v0Lln = value->rValue; - mod->BSIM3v0LlnGiven = TRUE; - break; - case BSIM3v0_MOD_LW : - mod->BSIM3v0Lw = value->rValue; - mod->BSIM3v0LwGiven = TRUE; - break; - case BSIM3v0_MOD_LWN : - mod->BSIM3v0Lwn = value->rValue; - mod->BSIM3v0LwnGiven = TRUE; - break; - case BSIM3v0_MOD_LWL : - mod->BSIM3v0Lwl = value->rValue; - mod->BSIM3v0LwlGiven = TRUE; - break; - case BSIM3v0_MOD_LMIN : - mod->BSIM3v0Lmin = value->rValue; - mod->BSIM3v0LminGiven = TRUE; - break; - case BSIM3v0_MOD_LMAX : - mod->BSIM3v0Lmax = value->rValue; - mod->BSIM3v0LmaxGiven = TRUE; - break; - case BSIM3v0_MOD_WINT : - mod->BSIM3v0Wint = value->rValue; - mod->BSIM3v0WintGiven = TRUE; - break; - case BSIM3v0_MOD_WL : - mod->BSIM3v0Wl = value->rValue; - mod->BSIM3v0WlGiven = TRUE; - break; - case BSIM3v0_MOD_WLN : - mod->BSIM3v0Wln = value->rValue; - mod->BSIM3v0WlnGiven = TRUE; - break; - case BSIM3v0_MOD_WW : - mod->BSIM3v0Ww = value->rValue; - mod->BSIM3v0WwGiven = TRUE; - break; - case BSIM3v0_MOD_WWN : - mod->BSIM3v0Wwn = value->rValue; - mod->BSIM3v0WwnGiven = TRUE; - break; - case BSIM3v0_MOD_WWL : - mod->BSIM3v0Wwl = value->rValue; - mod->BSIM3v0WwlGiven = TRUE; - break; - case BSIM3v0_MOD_WMIN : - mod->BSIM3v0Wmin = value->rValue; - mod->BSIM3v0WminGiven = TRUE; - break; - case BSIM3v0_MOD_WMAX : - mod->BSIM3v0Wmax = value->rValue; - mod->BSIM3v0WmaxGiven = TRUE; - break; - - case BSIM3v0_MOD_NOIA : - mod->BSIM3v0oxideTrapDensityA = value->rValue; - mod->BSIM3v0oxideTrapDensityAGiven = TRUE; - break; - case BSIM3v0_MOD_NOIB : - mod->BSIM3v0oxideTrapDensityB = value->rValue; - mod->BSIM3v0oxideTrapDensityBGiven = TRUE; - break; - case BSIM3v0_MOD_NOIC : - mod->BSIM3v0oxideTrapDensityC = value->rValue; - mod->BSIM3v0oxideTrapDensityCGiven = TRUE; - break; - case BSIM3v0_MOD_EM : - mod->BSIM3v0em = value->rValue; - mod->BSIM3v0emGiven = TRUE; - break; - case BSIM3v0_MOD_EF : - mod->BSIM3v0ef = value->rValue; - mod->BSIM3v0efGiven = TRUE; - break; - case BSIM3v0_MOD_AF : - mod->BSIM3v0af = value->rValue; - mod->BSIM3v0afGiven = TRUE; - break; - case BSIM3v0_MOD_KF : - mod->BSIM3v0kf = value->rValue; - mod->BSIM3v0kfGiven = TRUE; - break; - case BSIM3v0_MOD_NMOS : - if(value->iValue) { - mod->BSIM3v0type = 1; - mod->BSIM3v0typeGiven = TRUE; - } - break; - case BSIM3v0_MOD_PMOS : - if(value->iValue) { - mod->BSIM3v0type = - 1; - mod->BSIM3v0typeGiven = TRUE; - } - break; - default: - return(E_BADPARM); - } - return(OK); -} - - diff --git a/src/spicelib/devices/bsim3v0/b3v0noi.c b/src/spicelib/devices/bsim3v0/b3v0noi.c deleted file mode 100644 index 965ee6186..000000000 --- a/src/spicelib/devices/bsim3v0/b3v0noi.c +++ /dev/null @@ -1,308 +0,0 @@ -/********** -Copyright 1990 Regents of the University of California. All rights reserved. -Author: 1995 Gary W. Ng and Min-Chie Jeng. -File: b3v0noi.c -**********/ - -#include "ngspice/ngspice.h" -#include "bsim3v0def.h" -#include "ngspice/cktdefs.h" -#include "ngspice/iferrmsg.h" -#include "ngspice/noisedef.h" -#include "ngspice/suffix.h" -#include "ngspice/const.h" /* jwan */ - -/* - * BSIM3v0noise (mode, operation, firstModel, ckt, data, OnDens) - * This routine names and evaluates all of the noise sources - * associated with MOSFET's. It starts with the model *firstModel and - * traverses all of its insts. It then proceeds to any other models - * on the linked list. The total output noise density generated by - * all of the MOSFET's is summed with the variable "OnDens". - */ - - -static double -StrongInversionNoiseEval3v0(double vgs, double vds, BSIM3v0model *model, - BSIM3v0instance *here, double freq, double temp) -{ -struct bsim3v0SizeDependParam *pParam; -double cd, esat, DelClm, EffFreq, N0, Nl, Vgst; -double T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, Ssi; - - pParam = here->pParam; - cd = fabs(here->BSIM3v0cd) * here->BSIM3v0m; - if (vds > here->BSIM3v0vdsat) - { esat = 2.0 * pParam->BSIM3v0vsattemp / here->BSIM3v0ueff; - T0 = ((((vds - here->BSIM3v0vdsat) / pParam->BSIM3v0litl) + model->BSIM3v0em) - / esat); - DelClm = pParam->BSIM3v0litl * log (MAX(T0, N_MINLOG)); - } - else - DelClm = 0.0; - EffFreq = pow(freq, model->BSIM3v0ef); - T1 = CHARGE * CHARGE * 8.62e-5 * cd * (temp + CONSTCtoK) * here->BSIM3v0ueff; - T2 = 1.0e8 * EffFreq * model->BSIM3v0cox - * pParam->BSIM3v0leff * pParam->BSIM3v0leff; - Vgst = vgs - here->BSIM3v0von; - N0 = model->BSIM3v0cox * Vgst / CHARGE; - if (N0 < 0.0) - N0 = 0.0; - Nl = model->BSIM3v0cox * (Vgst - MIN(vds, here->BSIM3v0vdsat)) / CHARGE; - if (Nl < 0.0) - Nl = 0.0; - - T3 = model->BSIM3v0oxideTrapDensityA - * log(MAX(((N0 + 2.0e14) / (Nl + 2.0e14)), N_MINLOG)); - T4 = model->BSIM3v0oxideTrapDensityB * (N0 - Nl); - T5 = model->BSIM3v0oxideTrapDensityC * 0.5 * (N0 * N0 - Nl * Nl); - - T6 = 8.62e-5 * (temp + CONSTCtoK) * cd * cd; - T7 = 1.0e8 * EffFreq * pParam->BSIM3v0leff - * pParam->BSIM3v0leff * pParam->BSIM3v0weff * here->BSIM3v0m; - T8 = model->BSIM3v0oxideTrapDensityA + model->BSIM3v0oxideTrapDensityB * Nl - + model->BSIM3v0oxideTrapDensityC * Nl * Nl; - T9 = (Nl + 2.0e14) * (Nl + 2.0e14); - - Ssi = T1 / T2 * (T3 + T4 + T5) + T6 / T7 * DelClm * T8 / T9; - return Ssi; -} - -int -BSIM3v0noise (int mode, int operation, GENmodel *inModel, CKTcircuit *ckt, - Ndata *data, double *OnDens) -{ -NOISEAN *job = (NOISEAN *) ckt->CKTcurJob; - -BSIM3v0model *model = (BSIM3v0model *)inModel; -BSIM3v0instance *here; -struct bsim3v0SizeDependParam *pParam; -double tempOnoise; -double tempInoise; -double noizDens[BSIM3v0NSRCS]; -double lnNdens[BSIM3v0NSRCS]; - -double vgs, vds, Slimit; -double T1, T10, T11; -double Ssi, Swi; - -int i; - - /* define the names of the noise sources */ - static char *BSIM3v0nNames[BSIM3v0NSRCS] = - { /* Note that we have to keep the order */ - ".rd", /* noise due to rd */ - /* consistent with the index definitions */ - ".rs", /* noise due to rs */ - /* in BSIM3v0defs.h */ - ".id", /* noise due to id */ - ".1overf", /* flicker (1/f) noise */ - "" /* total transistor noise */ - }; - - for (; model != NULL; model = BSIM3v0nextModel(model)) - { for (here = BSIM3v0instances(model); here != NULL; - here = BSIM3v0nextInstance(here)) - { - pParam = here->pParam; - switch (operation) - { case N_OPEN: - /* see if we have to to produce a summary report */ - /* if so, name all the noise generators */ - - if (job->NStpsSm != 0) - { switch (mode) - { case N_DENS: - for (i = 0; i < BSIM3v0NSRCS; i++) - { NOISE_ADD_OUTVAR(ckt, data, "onoise.%s%s", here->BSIM3v0name, BSIM3v0nNames[i]); - } - break; - case INT_NOIZ: - for (i = 0; i < BSIM3v0NSRCS; i++) - { NOISE_ADD_OUTVAR(ckt, data, "onoise_total.%s%s", here->BSIM3v0name, BSIM3v0nNames[i]); - NOISE_ADD_OUTVAR(ckt, data, "inoise_total.%s%s", here->BSIM3v0name, BSIM3v0nNames[i]); - } - break; - } - } - break; - case N_CALC: - switch (mode) - { case N_DENS: - NevalSrc(&noizDens[BSIM3v0RDNOIZ], - &lnNdens[BSIM3v0RDNOIZ], ckt, THERMNOISE, - here->BSIM3v0dNodePrime, here->BSIM3v0dNode, - here->BSIM3v0drainConductance * here->BSIM3v0m); - - NevalSrc(&noizDens[BSIM3v0RSNOIZ], - &lnNdens[BSIM3v0RSNOIZ], ckt, THERMNOISE, - here->BSIM3v0sNodePrime, here->BSIM3v0sNode, - here->BSIM3v0sourceConductance * here->BSIM3v0m); - - if (model->BSIM3v0noiMod == 2) - { NevalSrc(&noizDens[BSIM3v0IDNOIZ], - &lnNdens[BSIM3v0IDNOIZ], ckt, THERMNOISE, - here->BSIM3v0dNodePrime, - here->BSIM3v0sNodePrime, (here->BSIM3v0ueff - * fabs((here->BSIM3v0qinv * here->BSIM3v0m) - / (pParam->BSIM3v0leff - * pParam->BSIM3v0leff)))); - } - else - { NevalSrc(&noizDens[BSIM3v0IDNOIZ], - &lnNdens[BSIM3v0IDNOIZ], ckt, THERMNOISE, - here->BSIM3v0dNodePrime, - here->BSIM3v0sNodePrime, - (2.0 / 3.0 * fabs(here->BSIM3v0gm - + here->BSIM3v0gds) * here->BSIM3v0m)); - - } - NevalSrc(&noizDens[BSIM3v0FLNOIZ], NULL, - ckt, N_GAIN, here->BSIM3v0dNodePrime, - here->BSIM3v0sNodePrime, (double) 0.0); - - if (model->BSIM3v0noiMod == 2) - { vgs = *(ckt->CKTstates[0] + here->BSIM3v0vgs); - vds = *(ckt->CKTstates[0] + here->BSIM3v0vds); - if (vds < 0.0) - { vds = -vds; - vgs = vgs + vds; - } - if (vgs >= here->BSIM3v0von + 0.1) - { Ssi = StrongInversionNoiseEval3v0(vgs, vds, - model, here, data->freq, - ckt->CKTtemp); - noizDens[BSIM3v0FLNOIZ] *= Ssi; - } - else - { pParam = here->pParam; - T10 = model->BSIM3v0oxideTrapDensityA - * 8.62e-5 * (ckt->CKTtemp + CONSTCtoK); - T11 = pParam->BSIM3v0weff * here->BSIM3v0m * pParam->BSIM3v0leff - * pow(data->freq, model->BSIM3v0ef) - * 4.0e36; - Swi = T10 / T11 * here->BSIM3v0cd * here->BSIM3v0m - * here->BSIM3v0cd * here->BSIM3v0m; - Slimit = StrongInversionNoiseEval3v0( - here->BSIM3v0von + 0.1, - vds, model, here, - data->freq, ckt->CKTtemp); - T1 = Swi + Slimit; - if (T1 > 0.0) - noizDens[BSIM3v0FLNOIZ] *= (Slimit * Swi) - / T1; - else - noizDens[BSIM3v0FLNOIZ] *= 0.0; - } - } - else - { noizDens[BSIM3v0FLNOIZ] *= model->BSIM3v0kf * - exp(model->BSIM3v0af - * log(MAX(fabs(here->BSIM3v0cd * here->BSIM3v0m), - N_MINLOG))) - / (pow(data->freq, model->BSIM3v0ef) - * pParam->BSIM3v0leff - * pParam->BSIM3v0leff - * model->BSIM3v0cox); - } - - lnNdens[BSIM3v0FLNOIZ] = - log(MAX(noizDens[BSIM3v0FLNOIZ], N_MINLOG)); - - noizDens[BSIM3v0TOTNOIZ] = noizDens[BSIM3v0RDNOIZ] - + noizDens[BSIM3v0RSNOIZ] - + noizDens[BSIM3v0IDNOIZ] - + noizDens[BSIM3v0FLNOIZ]; - lnNdens[BSIM3v0TOTNOIZ] = - log(MAX(noizDens[BSIM3v0TOTNOIZ], N_MINLOG)); - - *OnDens += noizDens[BSIM3v0TOTNOIZ]; - - if (data->delFreq == 0.0) - { /* if we haven't done any previous - integration, we need to initialize our - "history" variables. - */ - - for (i = 0; i < BSIM3v0NSRCS; i++) - { here->BSIM3v0nVar[LNLSTDENS][i] = - lnNdens[i]; - } - - /* clear out our integration variables - if it's the first pass - */ - if (data->freq == - job->NstartFreq) - { for (i = 0; i < BSIM3v0NSRCS; i++) - { here->BSIM3v0nVar[OUTNOIZ][i] = 0.0; - here->BSIM3v0nVar[INNOIZ][i] = 0.0; - } - } - } - else - { /* data->delFreq != 0.0, - we have to integrate. - */ - for (i = 0; i < BSIM3v0NSRCS; i++) - { if (i != BSIM3v0TOTNOIZ) - { tempOnoise = Nintegrate(noizDens[i], - lnNdens[i], - here->BSIM3v0nVar[LNLSTDENS][i], - data); - tempInoise = Nintegrate(noizDens[i] - * data->GainSqInv, lnNdens[i] - + data->lnGainInv, - here->BSIM3v0nVar[LNLSTDENS][i] - + data->lnGainInv, data); - here->BSIM3v0nVar[LNLSTDENS][i] = - lnNdens[i]; - data->outNoiz += tempOnoise; - data->inNoise += tempInoise; - if (job->NStpsSm != 0) - { here->BSIM3v0nVar[OUTNOIZ][i] - += tempOnoise; - here->BSIM3v0nVar[OUTNOIZ][BSIM3v0TOTNOIZ] - += tempOnoise; - here->BSIM3v0nVar[INNOIZ][i] - += tempInoise; - here->BSIM3v0nVar[INNOIZ][BSIM3v0TOTNOIZ] - += tempInoise; - } - } - } - } - if (data->prtSummary) - { for (i = 0; i < BSIM3v0NSRCS; i++) - { /* print a summary report */ - data->outpVector[data->outNumber++] - = noizDens[i]; - } - } - break; - case INT_NOIZ: - /* already calculated, just output */ - if (job->NStpsSm != 0) - { for (i = 0; i < BSIM3v0NSRCS; i++) - { data->outpVector[data->outNumber++] - = here->BSIM3v0nVar[OUTNOIZ][i]; - data->outpVector[data->outNumber++] - = here->BSIM3v0nVar[INNOIZ][i]; - } - } - break; - } - break; - case N_CLOSE: - /* do nothing, the main calling routine will close */ - return (OK); - break; /* the plots */ - } /* switch (operation) */ - } /* for here */ - } /* for model */ - - return(OK); -} - - - diff --git a/src/spicelib/devices/bsim3v0/b3v0par.c b/src/spicelib/devices/bsim3v0/b3v0par.c deleted file mode 100644 index c3d0ac1c3..000000000 --- a/src/spicelib/devices/bsim3v0/b3v0par.c +++ /dev/null @@ -1,109 +0,0 @@ -/********** -Copyright 1990 Regents of the University of California. All rights reserved. -Author: 1995 Min-Chie Jeng and Mansun Chan. -File: b3v0par.c -**********/ - -#include "ngspice/ngspice.h" -#include "ngspice/ifsim.h" -#include "bsim3v0def.h" -#include "ngspice/sperror.h" -#include "ngspice/suffix.h" -#include "ngspice/fteext.h" - -int -BSIM3v0param(int param, IFvalue *value, GENinstance *inst, IFvalue *select) -{ - double scale; - - BSIM3v0instance *here = (BSIM3v0instance*)inst; - - NG_IGNORE(select); - - if (!cp_getvar("scale", CP_REAL, &scale, 0)) - scale = 1; - - switch (param) { - case BSIM3v0_W: - here->BSIM3v0w = value->rValue*scale; - here->BSIM3v0wGiven = TRUE; - break; - case BSIM3v0_L: - here->BSIM3v0l = value->rValue*scale; - here->BSIM3v0lGiven = TRUE; - break; - case BSIM3v0_M: - here->BSIM3v0m = value->rValue; - here->BSIM3v0mGiven = TRUE; - break; - case BSIM3v0_AS: - here->BSIM3v0sourceArea = value->rValue*scale*scale; - here->BSIM3v0sourceAreaGiven = TRUE; - break; - case BSIM3v0_AD: - here->BSIM3v0drainArea = value->rValue*scale*scale; - here->BSIM3v0drainAreaGiven = TRUE; - break; - case BSIM3v0_PS: - here->BSIM3v0sourcePerimeter = value->rValue*scale; - here->BSIM3v0sourcePerimeterGiven = TRUE; - break; - case BSIM3v0_PD: - here->BSIM3v0drainPerimeter = value->rValue*scale; - here->BSIM3v0drainPerimeterGiven = TRUE; - break; - case BSIM3v0_NRS: - here->BSIM3v0sourceSquares = value->rValue; - here->BSIM3v0sourceSquaresGiven = TRUE; - break; - case BSIM3v0_NRD: - here->BSIM3v0drainSquares = value->rValue; - here->BSIM3v0drainSquaresGiven = TRUE; - break; - case BSIM3v0_OFF: - here->BSIM3v0off = value->iValue; - break; - case BSIM3v0_IC_VBS: - here->BSIM3v0icVBS = value->rValue; - here->BSIM3v0icVBSGiven = TRUE; - break; - case BSIM3v0_IC_VDS: - here->BSIM3v0icVDS = value->rValue; - here->BSIM3v0icVDSGiven = TRUE; - break; - case BSIM3v0_IC_VGS: - here->BSIM3v0icVGS = value->rValue; - here->BSIM3v0icVGSGiven = TRUE; - break; - case BSIM3v0_NQSMOD: - here->BSIM3v0nqsMod = value->iValue; - here->BSIM3v0nqsModGiven = TRUE; - break; - case BSIM3v0_IC: - /* FALLTHROUGH added to suppress GCC warning due to - * -Wimplicit-fallthrough flag */ - switch (value->v.numValue) { - case 3: - here->BSIM3v0icVBS = *(value->v.vec.rVec+2); - here->BSIM3v0icVBSGiven = TRUE; - /* FALLTHROUGH */ - case 2: - here->BSIM3v0icVGS = *(value->v.vec.rVec+1); - here->BSIM3v0icVGSGiven = TRUE; - /* FALLTHROUGH */ - case 1: - here->BSIM3v0icVDS = *(value->v.vec.rVec); - here->BSIM3v0icVDSGiven = TRUE; - break; - default: - return(E_BADPARM); - } - break; - default: - return(E_BADPARM); - } - return(OK); -} - - - diff --git a/src/spicelib/devices/bsim3v0/b3v0pzld.c b/src/spicelib/devices/bsim3v0/b3v0pzld.c deleted file mode 100644 index 7a0e1e77c..000000000 --- a/src/spicelib/devices/bsim3v0/b3v0pzld.c +++ /dev/null @@ -1,148 +0,0 @@ -/********** -Copyright 1990 Regents of the University of California. All rights reserved. -Author: 1995 Min-Chie Jeng and Mansun Chan. -File: b3pzld.c -**********/ - -#include "ngspice/ngspice.h" -#include "ngspice/cktdefs.h" -#include "ngspice/complex.h" -#include "ngspice/sperror.h" -#include "bsim3v0def.h" -#include "ngspice/suffix.h" - -int -BSIM3v0pzLoad(GENmodel *inModel, CKTcircuit *ckt, SPcomplex *s) -{ -BSIM3v0model *model = (BSIM3v0model*)inModel; -BSIM3v0instance *here; -double xcggb, xcgdb, xcgsb, xcbgb, xcbdb, xcbsb, xcddb, xcssb, xcdgb; -double gdpr, gspr, gds, gbd, gbs, capbd, capbs, xcsgb, xcdsb, xcsdb; -double cggb, cgdb, cgsb, cbgb, cbdb, cbsb, cddb, cdgb, cdsb; -double GSoverlapCap, GDoverlapCap, GBoverlapCap; -double FwdSum, RevSum, Gm, Gmbs; - -double m; - - NG_IGNORE(ckt); - - for (; model != NULL; model = BSIM3v0nextModel(model)) - { for (here = BSIM3v0instances(model); here!= NULL; - here = BSIM3v0nextInstance(here)) - { - if (here->BSIM3v0mode >= 0) - { Gm = here->BSIM3v0gm; - Gmbs = here->BSIM3v0gmbs; - FwdSum = Gm + Gmbs; - RevSum = 0.0; - cggb = here->BSIM3v0cggb; - cgsb = here->BSIM3v0cgsb; - cgdb = here->BSIM3v0cgdb; - - cbgb = here->BSIM3v0cbgb; - cbsb = here->BSIM3v0cbsb; - cbdb = here->BSIM3v0cbdb; - - cdgb = here->BSIM3v0cdgb; - cdsb = here->BSIM3v0cdsb; - cddb = here->BSIM3v0cddb; - } - else - { Gm = -here->BSIM3v0gm; - Gmbs = -here->BSIM3v0gmbs; - FwdSum = 0.0; - RevSum = -Gm - Gmbs; - cggb = here->BSIM3v0cggb; - cgsb = here->BSIM3v0cgdb; - cgdb = here->BSIM3v0cgsb; - - cbgb = here->BSIM3v0cbgb; - cbsb = here->BSIM3v0cbdb; - cbdb = here->BSIM3v0cbsb; - - cdgb = -(here->BSIM3v0cdgb + cggb + cbgb); - cdsb = -(here->BSIM3v0cddb + cgsb + cbsb); - cddb = -(here->BSIM3v0cdsb + cgdb + cbdb); - } - gdpr=here->BSIM3v0drainConductance; - gspr=here->BSIM3v0sourceConductance; - gds= here->BSIM3v0gds; - gbd= here->BSIM3v0gbd; - gbs= here->BSIM3v0gbs; - capbd= here->BSIM3v0capbd; - capbs= here->BSIM3v0capbs; - GSoverlapCap = here->BSIM3v0cgso; - GDoverlapCap = here->BSIM3v0cgdo; - GBoverlapCap = here->pParam->BSIM3v0cgbo; - - xcdgb = (cdgb - GDoverlapCap); - xcddb = (cddb + capbd + GDoverlapCap); - xcdsb = cdsb; - xcsgb = -(cggb + cbgb + cdgb + GSoverlapCap); - xcsdb = -(cgdb + cbdb + cddb); - xcssb = (capbs + GSoverlapCap - (cgsb+cbsb+cdsb)); - xcggb = (cggb + GDoverlapCap + GSoverlapCap + GBoverlapCap); - xcgdb = (cgdb - GDoverlapCap); - xcgsb = (cgsb - GSoverlapCap); - xcbgb = (cbgb - GBoverlapCap); - xcbdb = (cbdb - capbd); - xcbsb = (cbsb - capbs); - - m = here->BSIM3v0m; - - *(here->BSIM3v0GgPtr ) += m * (xcggb * s->real); - *(here->BSIM3v0GgPtr +1) += m * (xcggb * s->imag); - *(here->BSIM3v0BbPtr ) += m * ((-xcbgb-xcbdb-xcbsb) * s->real); - *(here->BSIM3v0BbPtr +1) += m * ((-xcbgb-xcbdb-xcbsb) * s->imag); - *(here->BSIM3v0DPdpPtr ) += m * (xcddb * s->real); - *(here->BSIM3v0DPdpPtr +1) += m * (xcddb * s->imag); - *(here->BSIM3v0SPspPtr ) += m * (xcssb * s->real); - *(here->BSIM3v0SPspPtr +1) += m * (xcssb * s->imag); - *(here->BSIM3v0GbPtr ) += m * ((-xcggb-xcgdb-xcgsb) * s->real); - *(here->BSIM3v0GbPtr +1) += m * ((-xcggb-xcgdb-xcgsb) * s->imag); - *(here->BSIM3v0GdpPtr ) += m * (xcgdb * s->real); - *(here->BSIM3v0GdpPtr +1) += m * (xcgdb * s->imag); - *(here->BSIM3v0GspPtr ) += m * (xcgsb * s->real); - *(here->BSIM3v0GspPtr +1) += m * (xcgsb * s->imag); - *(here->BSIM3v0BgPtr ) += m * (xcbgb * s->real); - *(here->BSIM3v0BgPtr +1) += m * (xcbgb * s->imag); - *(here->BSIM3v0BdpPtr ) += m * (xcbdb * s->real); - *(here->BSIM3v0BdpPtr +1) += m * (xcbdb * s->imag); - *(here->BSIM3v0BspPtr ) += m * (xcbsb * s->real); - *(here->BSIM3v0BspPtr +1) += m * (xcbsb * s->imag); - *(here->BSIM3v0DPgPtr ) += m * (xcdgb * s->real); - *(here->BSIM3v0DPgPtr +1) += m * (xcdgb * s->imag); - *(here->BSIM3v0DPbPtr ) += m * ((-xcdgb-xcddb-xcdsb) * s->real); - *(here->BSIM3v0DPbPtr +1) += m * ((-xcdgb-xcddb-xcdsb) * s->imag); - *(here->BSIM3v0DPspPtr ) += m * (xcdsb * s->real); - *(here->BSIM3v0DPspPtr +1) += m * (xcdsb * s->imag); - *(here->BSIM3v0SPgPtr ) += m * (xcsgb * s->real); - *(here->BSIM3v0SPgPtr +1) += m * (xcsgb * s->imag); - *(here->BSIM3v0SPbPtr ) += m * ((-xcsgb-xcsdb-xcssb) * s->real); - *(here->BSIM3v0SPbPtr +1) += m * ((-xcsgb-xcsdb-xcssb) * s->imag); - *(here->BSIM3v0SPdpPtr ) += m * (xcsdb * s->real); - *(here->BSIM3v0SPdpPtr +1) += m * (xcsdb * s->imag); - *(here->BSIM3v0DdPtr) += m * gdpr; - *(here->BSIM3v0SsPtr) += m * gspr; - *(here->BSIM3v0BbPtr) += m * (gbd + gbs); - *(here->BSIM3v0DPdpPtr) += m * (gdpr + gds + gbd + RevSum); - *(here->BSIM3v0SPspPtr) += m * (gspr + gds + gbs + FwdSum); - *(here->BSIM3v0DdpPtr) -= m * gdpr; - *(here->BSIM3v0SspPtr) -= m * gspr; - *(here->BSIM3v0BdpPtr) -= m * gbd; - *(here->BSIM3v0BspPtr) -= m * gbs; - *(here->BSIM3v0DPdPtr) -= m * gdpr; - *(here->BSIM3v0DPgPtr) += m * Gm; - *(here->BSIM3v0DPbPtr) -= m * (gbd - Gmbs); - *(here->BSIM3v0DPspPtr) -= m * (gds + FwdSum); - *(here->BSIM3v0SPgPtr) -= m * Gm; - *(here->BSIM3v0SPsPtr) -= m * gspr; - *(here->BSIM3v0SPbPtr) -= m * (gbs + Gmbs); - *(here->BSIM3v0SPdpPtr) -= m * (gds + RevSum); - - } - } - return(OK); -} - - diff --git a/src/spicelib/devices/bsim3v0/b3v0set.c b/src/spicelib/devices/bsim3v0/b3v0set.c deleted file mode 100644 index 6ecdca04e..000000000 --- a/src/spicelib/devices/bsim3v0/b3v0set.c +++ /dev/null @@ -1,923 +0,0 @@ -/********** -Copyright 1990 Regents of the University of California. All rights reserved. -Author: 1995 Min-Chie Jeng and Mansun Chan. -File: b3v0set.c -**********/ - -#include "ngspice/ngspice.h" -#include "ngspice/smpdefs.h" -#include "ngspice/cktdefs.h" -#include "bsim3v0def.h" -#include "ngspice/const.h" -#include "ngspice/sperror.h" -#include "ngspice/suffix.h" - -#define MAX_EXP 5.834617425e14 -#define MIN_EXP 1.713908431e-15 -#define EXP_THRESHOLD 34.0 -#define SMOOTHFACTOR 0.1 -#define EPSOX 3.453133e-11 -#define EPSSI 1.03594e-10 -#define PI 3.141592654 -#define Charge_q 1.60219e-19 -#define Meter2Micron 1.0e6 - -int -BSIM3v0setup(SMPmatrix *matrix, GENmodel *inModel, CKTcircuit *ckt, - int *states) -{ -BSIM3v0model *model = (BSIM3v0model*)inModel; -BSIM3v0instance *here; -int error; -CKTnode *tmp; - -CKTnode *tmpNode; -IFuid tmpName; - - /* loop through all the BSIM3v0 device models */ - for( ; model != NULL; model = BSIM3v0nextModel(model)) - { -/* Default value Processing for BSIM3v0 MOSFET Models */ - if (!model->BSIM3v0typeGiven) - model->BSIM3v0type = NMOS; - if (!model->BSIM3v0mobModGiven) - model->BSIM3v0mobMod = 1; - if (!model->BSIM3v0binUnitGiven) - model->BSIM3v0binUnit = 1; - if (!model->BSIM3v0capModGiven) - model->BSIM3v0capMod = 1; - if (!model->BSIM3v0nqsModGiven) - model->BSIM3v0nqsMod = 0; - if (!model->BSIM3v0noiModGiven) - model->BSIM3v0noiMod = 1; - if (!model->BSIM3v0toxGiven) - model->BSIM3v0tox = 150.0e-10; - model->BSIM3v0cox = 3.453133e-11 / model->BSIM3v0tox; - - if (!model->BSIM3v0cdscGiven) - model->BSIM3v0cdsc = 2.4e-4; /* unit Q/V/m^2 */ - if (!model->BSIM3v0cdscbGiven) - model->BSIM3v0cdscb = 0.0; /* unit Q/V/m^2 */ - if (!model->BSIM3v0cdscdGiven) - model->BSIM3v0cdscd = 0.0; /* unit Q/V/m^2 */ - if (!model->BSIM3v0citGiven) - model->BSIM3v0cit = 0.0; /* unit Q/V/m^2 */ - if (!model->BSIM3v0nfactorGiven) - model->BSIM3v0nfactor = 1; - if (!model->BSIM3v0xjGiven) - model->BSIM3v0xj = .15e-6; - if (!model->BSIM3v0vsatGiven) - model->BSIM3v0vsat = 8.0e4; /* unit m/s */ - if (!model->BSIM3v0atGiven) - model->BSIM3v0at = 3.3e4; /* unit m/s */ - if (!model->BSIM3v0a0Given) - model->BSIM3v0a0 = 1.0; - if (!model->BSIM3v0agsGiven) - model->BSIM3v0ags = 0.0; - if (!model->BSIM3v0a1Given) - model->BSIM3v0a1 = 0.0; - if (!model->BSIM3v0a2Given) - model->BSIM3v0a2 = 1.0; - if (!model->BSIM3v0ketaGiven) - model->BSIM3v0keta = -0.047; /* unit / V */ - if (!model->BSIM3v0nsubGiven) - model->BSIM3v0nsub = 6.0e16; /* unit 1/cm3 */ - if (!model->BSIM3v0npeakGiven) - model->BSIM3v0npeak = 1.7e17; /* unit 1/cm3 */ - if (!model->BSIM3v0vbmGiven) - model->BSIM3v0vbm = -5.0; - if (!model->BSIM3v0xtGiven) - model->BSIM3v0xt = 1.55e-7; - if (!model->BSIM3v0kt1Given) - model->BSIM3v0kt1 = -0.11; /* unit V */ - if (!model->BSIM3v0kt1lGiven) - model->BSIM3v0kt1l = 0.0; /* unit V*m */ - if (!model->BSIM3v0kt2Given) - model->BSIM3v0kt2 = 0.022; /* No unit */ - if (!model->BSIM3v0k3Given) - model->BSIM3v0k3 = 80.0; - if (!model->BSIM3v0k3bGiven) - model->BSIM3v0k3b = 0.0; - if (!model->BSIM3v0w0Given) - model->BSIM3v0w0 = 2.5e-6; - if (!model->BSIM3v0nlxGiven) - model->BSIM3v0nlx = 1.74e-7; - if (!model->BSIM3v0dvt0Given) - model->BSIM3v0dvt0 = 2.2; - if (!model->BSIM3v0dvt1Given) - model->BSIM3v0dvt1 = 0.53; - if (!model->BSIM3v0dvt2Given) - model->BSIM3v0dvt2 = -0.032; /* unit 1 / V */ - - if (!model->BSIM3v0dvt0wGiven) - model->BSIM3v0dvt0w = 0.0; - if (!model->BSIM3v0dvt1wGiven) - model->BSIM3v0dvt1w = 5.3e6; - if (!model->BSIM3v0dvt2wGiven) - model->BSIM3v0dvt2w = -0.032; - - if (!model->BSIM3v0droutGiven) - model->BSIM3v0drout = 0.56; - if (!model->BSIM3v0dsubGiven) - model->BSIM3v0dsub = model->BSIM3v0drout; - if (!model->BSIM3v0vth0Given) - model->BSIM3v0vth0 = (model->BSIM3v0type == NMOS) ? 0.7 : -0.7; - if (!model->BSIM3v0uaGiven) - model->BSIM3v0ua = 2.25e-9; /* unit m/V */ - if (!model->BSIM3v0ua1Given) - model->BSIM3v0ua1 = 4.31e-9; /* unit m/V */ - if (!model->BSIM3v0ubGiven) - model->BSIM3v0ub = 5.87e-19; /* unit (m/V)**2 */ - if (!model->BSIM3v0ub1Given) - model->BSIM3v0ub1 = -7.61e-18; /* unit (m/V)**2 */ - if (!model->BSIM3v0ucGiven) - model->BSIM3v0uc = (model->BSIM3v0mobMod == 3) ? -0.0465 : -0.0465e-9; - if (!model->BSIM3v0uc1Given) - model->BSIM3v0uc1 = (model->BSIM3v0mobMod == 3) ? -0.056 : -0.056e-9; - if (!model->BSIM3v0u0Given) - model->BSIM3v0u0 = (model->BSIM3v0type == NMOS) ? 0.067 : 0.025; - else if (model->BSIM3v0u0 > 1.0) - model->BSIM3v0u0 = model->BSIM3v0u0 / 1.0e4; - /* if u0 > 1.0, cm.g.sec unit system is used. If should be - converted into SI unit system. */ - if (!model->BSIM3v0uteGiven) - model->BSIM3v0ute = -1.5; - if (!model->BSIM3v0voffGiven) - model->BSIM3v0voff = -0.08; - if (!model->BSIM3v0deltaGiven) - model->BSIM3v0delta = 0.01; - if (!model->BSIM3v0rdswGiven) - model->BSIM3v0rdsw = 0; - if (!model->BSIM3v0prwgGiven) - model->BSIM3v0prwg = 0.0; /* unit 1/V */ - if (!model->BSIM3v0prwbGiven) - model->BSIM3v0prwb = 0.0; - if (!model->BSIM3v0prtGiven) - model->BSIM3v0prt = 0.0; - if (!model->BSIM3v0eta0Given) - model->BSIM3v0eta0 = 0.08; /* no unit */ - if (!model->BSIM3v0etabGiven) - model->BSIM3v0etab = -0.07; /* unit 1/V */ - if (!model->BSIM3v0pclmGiven) - model->BSIM3v0pclm = 1.3; /* no unit */ - if (!model->BSIM3v0pdibl1Given) - model->BSIM3v0pdibl1 = .39; /* no unit */ - if (!model->BSIM3v0pdibl2Given) - model->BSIM3v0pdibl2 = 0.0086; /* no unit */ - if (!model->BSIM3v0pdiblbGiven) - model->BSIM3v0pdiblb = 0.0; /* 1/V */ - if (!model->BSIM3v0pscbe1Given) - model->BSIM3v0pscbe1 = 4.24e8; - if (!model->BSIM3v0pscbe2Given) - model->BSIM3v0pscbe2 = 1.0e-5; - if (!model->BSIM3v0pvagGiven) - model->BSIM3v0pvag = 0.0; - if (!model->BSIM3v0wrGiven) - model->BSIM3v0wr = 1.0; - if (!model->BSIM3v0dwgGiven) - model->BSIM3v0dwg = 0.0; - if (!model->BSIM3v0dwbGiven) - model->BSIM3v0dwb = 0.0; - if (!model->BSIM3v0b0Given) - model->BSIM3v0b0 = 0.0; - if (!model->BSIM3v0b1Given) - model->BSIM3v0b1 = 0.0; - if (!model->BSIM3v0alpha0Given) - model->BSIM3v0alpha0 = 0.0; - if (!model->BSIM3v0beta0Given) - model->BSIM3v0beta0 = 30.0; - - if (!model->BSIM3v0elmGiven) - model->BSIM3v0elm = 5.0; - if (!model->BSIM3v0cgslGiven) - model->BSIM3v0cgsl = 0.0; - if (!model->BSIM3v0cgdlGiven) - model->BSIM3v0cgdl = 0.0; - if (!model->BSIM3v0ckappaGiven) - model->BSIM3v0ckappa = 0.6; - if (!model->BSIM3v0clcGiven) - model->BSIM3v0clc = 0.1e-6; - if (!model->BSIM3v0cleGiven) - model->BSIM3v0cle = 0.6; - - /* Length dependence */ - if (!model->BSIM3v0lcdscGiven) - model->BSIM3v0lcdsc = 0.0; - if (!model->BSIM3v0lcdscbGiven) - model->BSIM3v0lcdscb = 0.0; - if (!model->BSIM3v0lcdscdGiven) - model->BSIM3v0lcdscd = 0.0; - if (!model->BSIM3v0lcitGiven) - model->BSIM3v0lcit = 0.0; - if (!model->BSIM3v0lnfactorGiven) - model->BSIM3v0lnfactor = 0.0; - if (!model->BSIM3v0lxjGiven) - model->BSIM3v0lxj = 0.0; - if (!model->BSIM3v0lvsatGiven) - model->BSIM3v0lvsat = 0.0; - if (!model->BSIM3v0latGiven) - model->BSIM3v0lat = 0.0; - if (!model->BSIM3v0la0Given) - model->BSIM3v0la0 = 0.0; - if (!model->BSIM3v0lagsGiven) - model->BSIM3v0lags = 0.0; - if (!model->BSIM3v0la1Given) - model->BSIM3v0la1 = 0.0; - if (!model->BSIM3v0la2Given) - model->BSIM3v0la2 = 0.0; - if (!model->BSIM3v0lketaGiven) - model->BSIM3v0lketa = 0.0; - if (!model->BSIM3v0lnsubGiven) - model->BSIM3v0lnsub = 0.0; - if (!model->BSIM3v0lnpeakGiven) - model->BSIM3v0lnpeak = 0.0; - if (!model->BSIM3v0lvbmGiven) - model->BSIM3v0lvbm = 0.0; - if (!model->BSIM3v0lxtGiven) - model->BSIM3v0lxt = 0.0; - if (!model->BSIM3v0lkt1Given) - model->BSIM3v0lkt1 = 0.0; - if (!model->BSIM3v0lkt1lGiven) - model->BSIM3v0lkt1l = 0.0; - if (!model->BSIM3v0lkt2Given) - model->BSIM3v0lkt2 = 0.0; - if (!model->BSIM3v0lk3Given) - model->BSIM3v0lk3 = 0.0; - if (!model->BSIM3v0lk3bGiven) - model->BSIM3v0lk3b = 0.0; - if (!model->BSIM3v0lw0Given) - model->BSIM3v0lw0 = 0.0; - if (!model->BSIM3v0lnlxGiven) - model->BSIM3v0lnlx = 0.0; - if (!model->BSIM3v0ldvt0Given) - model->BSIM3v0ldvt0 = 0.0; - if (!model->BSIM3v0ldvt1Given) - model->BSIM3v0ldvt1 = 0.0; - if (!model->BSIM3v0ldvt2Given) - model->BSIM3v0ldvt2 = 0.0; - if (!model->BSIM3v0ldvt0wGiven) - model->BSIM3v0ldvt0w = 0.0; - if (!model->BSIM3v0ldvt1wGiven) - model->BSIM3v0ldvt1w = 0.0; - if (!model->BSIM3v0ldvt2wGiven) - model->BSIM3v0ldvt2w = 0.0; - if (!model->BSIM3v0ldroutGiven) - model->BSIM3v0ldrout = 0.0; - if (!model->BSIM3v0ldsubGiven) - model->BSIM3v0ldsub = 0.0; - if (!model->BSIM3v0lvth0Given) - model->BSIM3v0lvth0 = 0.0; - if (!model->BSIM3v0luaGiven) - model->BSIM3v0lua = 0.0; - if (!model->BSIM3v0lua1Given) - model->BSIM3v0lua1 = 0.0; - if (!model->BSIM3v0lubGiven) - model->BSIM3v0lub = 0.0; - if (!model->BSIM3v0lub1Given) - model->BSIM3v0lub1 = 0.0; - if (!model->BSIM3v0lucGiven) - model->BSIM3v0luc = 0.0; - if (!model->BSIM3v0luc1Given) - model->BSIM3v0luc1 = 0.0; - if (!model->BSIM3v0lu0Given) - model->BSIM3v0lu0 = 0.0; - else if (model->BSIM3v0u0 > 1.0) - model->BSIM3v0lu0 = model->BSIM3v0lu0 / 1.0e4; - if (!model->BSIM3v0luteGiven) - model->BSIM3v0lute = 0.0; - if (!model->BSIM3v0lvoffGiven) - model->BSIM3v0lvoff = 0.0; - if (!model->BSIM3v0ldeltaGiven) - model->BSIM3v0ldelta = 0.0; - if (!model->BSIM3v0lrdswGiven) - model->BSIM3v0lrdsw = 0.0; - if (!model->BSIM3v0lprwbGiven) - model->BSIM3v0lprwb = 0.0; - if (!model->BSIM3v0lprwgGiven) - model->BSIM3v0lprwg = 0.0; - if (!model->BSIM3v0lprtGiven) - model->BSIM3v0lprt = 0.0; - if (!model->BSIM3v0leta0Given) - model->BSIM3v0leta0 = 0.0; - if (!model->BSIM3v0letabGiven) - model->BSIM3v0letab = -0.0; - if (!model->BSIM3v0lpclmGiven) - model->BSIM3v0lpclm = 0.0; - if (!model->BSIM3v0lpdibl1Given) - model->BSIM3v0lpdibl1 = 0.0; - if (!model->BSIM3v0lpdibl2Given) - model->BSIM3v0lpdibl2 = 0.0; - if (!model->BSIM3v0lpdiblbGiven) - model->BSIM3v0lpdiblb = 0.0; - if (!model->BSIM3v0lpscbe1Given) - model->BSIM3v0lpscbe1 = 0.0; - if (!model->BSIM3v0lpscbe2Given) - model->BSIM3v0lpscbe2 = 0.0; - if (!model->BSIM3v0lpvagGiven) - model->BSIM3v0lpvag = 0.0; - if (!model->BSIM3v0lwrGiven) - model->BSIM3v0lwr = 0.0; - if (!model->BSIM3v0ldwgGiven) - model->BSIM3v0ldwg = 0.0; - if (!model->BSIM3v0ldwbGiven) - model->BSIM3v0ldwb = 0.0; - if (!model->BSIM3v0lb0Given) - model->BSIM3v0lb0 = 0.0; - if (!model->BSIM3v0lb1Given) - model->BSIM3v0lb1 = 0.0; - if (!model->BSIM3v0lalpha0Given) - model->BSIM3v0lalpha0 = 0.0; - if (!model->BSIM3v0lbeta0Given) - model->BSIM3v0lbeta0 = 0.0; - - if (!model->BSIM3v0lelmGiven) - model->BSIM3v0lelm = 0.0; - if (!model->BSIM3v0lcgslGiven) - model->BSIM3v0lcgsl = 0.0; - if (!model->BSIM3v0lcgdlGiven) - model->BSIM3v0lcgdl = 0.0; - if (!model->BSIM3v0lckappaGiven) - model->BSIM3v0lckappa = 0.0; - if (!model->BSIM3v0lcfGiven) - model->BSIM3v0lcf = 0.0; - if (!model->BSIM3v0lclcGiven) - model->BSIM3v0lclc = 0.0; - if (!model->BSIM3v0lcleGiven) - model->BSIM3v0lcle = 0.0; - - /* Width dependence */ - if (!model->BSIM3v0wcdscGiven) - model->BSIM3v0wcdsc = 0.0; - if (!model->BSIM3v0wcdscbGiven) - model->BSIM3v0wcdscb = 0.0; - if (!model->BSIM3v0wcdscdGiven) - model->BSIM3v0wcdscd = 0.0; - if (!model->BSIM3v0wcitGiven) - model->BSIM3v0wcit = 0.0; - if (!model->BSIM3v0wnfactorGiven) - model->BSIM3v0wnfactor = 0.0; - if (!model->BSIM3v0wxjGiven) - model->BSIM3v0wxj = 0.0; - if (!model->BSIM3v0wvsatGiven) - model->BSIM3v0wvsat = 0.0; - if (!model->BSIM3v0watGiven) - model->BSIM3v0wat = 0.0; - if (!model->BSIM3v0wa0Given) - model->BSIM3v0wa0 = 0.0; - if (!model->BSIM3v0wagsGiven) - model->BSIM3v0wags = 0.0; - if (!model->BSIM3v0wa1Given) - model->BSIM3v0wa1 = 0.0; - if (!model->BSIM3v0wa2Given) - model->BSIM3v0wa2 = 0.0; - if (!model->BSIM3v0wketaGiven) - model->BSIM3v0wketa = 0.0; - if (!model->BSIM3v0wnsubGiven) - model->BSIM3v0wnsub = 0.0; - if (!model->BSIM3v0wnpeakGiven) - model->BSIM3v0wnpeak = 0.0; - if (!model->BSIM3v0wvbmGiven) - model->BSIM3v0wvbm = 0.0; - if (!model->BSIM3v0wxtGiven) - model->BSIM3v0wxt = 0.0; - if (!model->BSIM3v0wkt1Given) - model->BSIM3v0wkt1 = 0.0; - if (!model->BSIM3v0wkt1lGiven) - model->BSIM3v0wkt1l = 0.0; - if (!model->BSIM3v0wkt2Given) - model->BSIM3v0wkt2 = 0.0; - if (!model->BSIM3v0wk3Given) - model->BSIM3v0wk3 = 0.0; - if (!model->BSIM3v0wk3bGiven) - model->BSIM3v0wk3b = 0.0; - if (!model->BSIM3v0ww0Given) - model->BSIM3v0ww0 = 0.0; - if (!model->BSIM3v0wnlxGiven) - model->BSIM3v0wnlx = 0.0; - if (!model->BSIM3v0wdvt0Given) - model->BSIM3v0wdvt0 = 0.0; - if (!model->BSIM3v0wdvt1Given) - model->BSIM3v0wdvt1 = 0.0; - if (!model->BSIM3v0wdvt2Given) - model->BSIM3v0wdvt2 = 0.0; - if (!model->BSIM3v0wdvt0wGiven) - model->BSIM3v0wdvt0w = 0.0; - if (!model->BSIM3v0wdvt1wGiven) - model->BSIM3v0wdvt1w = 0.0; - if (!model->BSIM3v0wdvt2wGiven) - model->BSIM3v0wdvt2w = 0.0; - if (!model->BSIM3v0wdroutGiven) - model->BSIM3v0wdrout = 0.0; - if (!model->BSIM3v0wdsubGiven) - model->BSIM3v0wdsub = 0.0; - if (!model->BSIM3v0wvth0Given) - model->BSIM3v0wvth0 = 0.0; - if (!model->BSIM3v0wuaGiven) - model->BSIM3v0wua = 0.0; - if (!model->BSIM3v0wua1Given) - model->BSIM3v0wua1 = 0.0; - if (!model->BSIM3v0wubGiven) - model->BSIM3v0wub = 0.0; - if (!model->BSIM3v0wub1Given) - model->BSIM3v0wub1 = 0.0; - if (!model->BSIM3v0wucGiven) - model->BSIM3v0wuc = 0.0; - if (!model->BSIM3v0wuc1Given) - model->BSIM3v0wuc1 = 0.0; - if (!model->BSIM3v0wu0Given) - model->BSIM3v0wu0 = 0.0; - else if (model->BSIM3v0u0 > 1.0) - model->BSIM3v0wu0 = model->BSIM3v0wu0 / 1.0e4; - if (!model->BSIM3v0wuteGiven) - model->BSIM3v0wute = 0.0; - if (!model->BSIM3v0wvoffGiven) - model->BSIM3v0wvoff = 0.0; - if (!model->BSIM3v0wdeltaGiven) - model->BSIM3v0wdelta = 0.0; - if (!model->BSIM3v0wrdswGiven) - model->BSIM3v0wrdsw = 0.0; - if (!model->BSIM3v0wprwbGiven) - model->BSIM3v0wprwb = 0.0; - if (!model->BSIM3v0wprwgGiven) - model->BSIM3v0wprwg = 0.0; - if (!model->BSIM3v0wprtGiven) - model->BSIM3v0wprt = 0.0; - if (!model->BSIM3v0weta0Given) - model->BSIM3v0weta0 = 0.0; - if (!model->BSIM3v0wetabGiven) - model->BSIM3v0wetab = 0.0; - if (!model->BSIM3v0wpclmGiven) - model->BSIM3v0wpclm = 0.0; - if (!model->BSIM3v0wpdibl1Given) - model->BSIM3v0wpdibl1 = 0.0; - if (!model->BSIM3v0wpdibl2Given) - model->BSIM3v0wpdibl2 = 0.0; - if (!model->BSIM3v0wpdiblbGiven) - model->BSIM3v0wpdiblb = 0.0; - if (!model->BSIM3v0wpscbe1Given) - model->BSIM3v0wpscbe1 = 0.0; - if (!model->BSIM3v0wpscbe2Given) - model->BSIM3v0wpscbe2 = 0.0; - if (!model->BSIM3v0wpvagGiven) - model->BSIM3v0wpvag = 0.0; - if (!model->BSIM3v0wwrGiven) - model->BSIM3v0wwr = 0.0; - if (!model->BSIM3v0wdwgGiven) - model->BSIM3v0wdwg = 0.0; - if (!model->BSIM3v0wdwbGiven) - model->BSIM3v0wdwb = 0.0; - if (!model->BSIM3v0wb0Given) - model->BSIM3v0wb0 = 0.0; - if (!model->BSIM3v0wb1Given) - model->BSIM3v0wb1 = 0.0; - if (!model->BSIM3v0walpha0Given) - model->BSIM3v0walpha0 = 0.0; - if (!model->BSIM3v0wbeta0Given) - model->BSIM3v0wbeta0 = 0.0; - - if (!model->BSIM3v0welmGiven) - model->BSIM3v0welm = 0.0; - if (!model->BSIM3v0wcgslGiven) - model->BSIM3v0wcgsl = 0.0; - if (!model->BSIM3v0wcgdlGiven) - model->BSIM3v0wcgdl = 0.0; - if (!model->BSIM3v0wckappaGiven) - model->BSIM3v0wckappa = 0.0; - if (!model->BSIM3v0wcfGiven) - model->BSIM3v0wcf = 0.0; - if (!model->BSIM3v0wclcGiven) - model->BSIM3v0wclc = 0.0; - if (!model->BSIM3v0wcleGiven) - model->BSIM3v0wcle = 0.0; - - /* Cross-term dependence */ - if (!model->BSIM3v0pcdscGiven) - model->BSIM3v0pcdsc = 0.0; - if (!model->BSIM3v0pcdscbGiven) - model->BSIM3v0pcdscb = 0.0; - if (!model->BSIM3v0pcdscdGiven) - model->BSIM3v0pcdscd = 0.0; - if (!model->BSIM3v0pcitGiven) - model->BSIM3v0pcit = 0.0; - if (!model->BSIM3v0pnfactorGiven) - model->BSIM3v0pnfactor = 0.0; - if (!model->BSIM3v0pxjGiven) - model->BSIM3v0pxj = 0.0; - if (!model->BSIM3v0pvsatGiven) - model->BSIM3v0pvsat = 0.0; - if (!model->BSIM3v0patGiven) - model->BSIM3v0pat = 0.0; - if (!model->BSIM3v0pa0Given) - model->BSIM3v0pa0 = 0.0; - - if (!model->BSIM3v0pagsGiven) - model->BSIM3v0pags = 0.0; - if (!model->BSIM3v0pa1Given) - model->BSIM3v0pa1 = 0.0; - if (!model->BSIM3v0pa2Given) - model->BSIM3v0pa2 = 0.0; - if (!model->BSIM3v0pketaGiven) - model->BSIM3v0pketa = 0.0; - if (!model->BSIM3v0pnsubGiven) - model->BSIM3v0pnsub = 0.0; - if (!model->BSIM3v0pnpeakGiven) - model->BSIM3v0pnpeak = 0.0; - if (!model->BSIM3v0pvbmGiven) - model->BSIM3v0pvbm = 0.0; - if (!model->BSIM3v0pxtGiven) - model->BSIM3v0pxt = 0.0; - if (!model->BSIM3v0pkt1Given) - model->BSIM3v0pkt1 = 0.0; - if (!model->BSIM3v0pkt1lGiven) - model->BSIM3v0pkt1l = 0.0; - if (!model->BSIM3v0pkt2Given) - model->BSIM3v0pkt2 = 0.0; - if (!model->BSIM3v0pk3Given) - model->BSIM3v0pk3 = 0.0; - if (!model->BSIM3v0pk3bGiven) - model->BSIM3v0pk3b = 0.0; - if (!model->BSIM3v0pw0Given) - model->BSIM3v0pw0 = 0.0; - if (!model->BSIM3v0pnlxGiven) - model->BSIM3v0pnlx = 0.0; - if (!model->BSIM3v0pdvt0Given) - model->BSIM3v0pdvt0 = 0.0; - if (!model->BSIM3v0pdvt1Given) - model->BSIM3v0pdvt1 = 0.0; - if (!model->BSIM3v0pdvt2Given) - model->BSIM3v0pdvt2 = 0.0; - if (!model->BSIM3v0pdvt0wGiven) - model->BSIM3v0pdvt0w = 0.0; - if (!model->BSIM3v0pdvt1wGiven) - model->BSIM3v0pdvt1w = 0.0; - if (!model->BSIM3v0pdvt2wGiven) - model->BSIM3v0pdvt2w = 0.0; - if (!model->BSIM3v0pdroutGiven) - model->BSIM3v0pdrout = 0.0; - if (!model->BSIM3v0pdsubGiven) - model->BSIM3v0pdsub = 0.0; - if (!model->BSIM3v0pvth0Given) - model->BSIM3v0pvth0 = 0.0; - if (!model->BSIM3v0puaGiven) - model->BSIM3v0pua = 0.0; - if (!model->BSIM3v0pua1Given) - model->BSIM3v0pua1 = 0.0; - if (!model->BSIM3v0pubGiven) - model->BSIM3v0pub = 0.0; - if (!model->BSIM3v0pub1Given) - model->BSIM3v0pub1 = 0.0; - if (!model->BSIM3v0pucGiven) - model->BSIM3v0puc = 0.0; - if (!model->BSIM3v0puc1Given) - model->BSIM3v0puc1 = 0.0; - if (!model->BSIM3v0pu0Given) - model->BSIM3v0pu0 = 0.0; - else if (model->BSIM3v0u0 > 1.0) - model->BSIM3v0pu0 = model->BSIM3v0pu0 / 1.0e4; - if (!model->BSIM3v0puteGiven) - model->BSIM3v0pute = 0.0; - if (!model->BSIM3v0pvoffGiven) - model->BSIM3v0pvoff = 0.0; - if (!model->BSIM3v0pdeltaGiven) - model->BSIM3v0pdelta = 0.0; - if (!model->BSIM3v0prdswGiven) - model->BSIM3v0prdsw = 0.0; - if (!model->BSIM3v0pprwbGiven) - model->BSIM3v0pprwb = 0.0; - if (!model->BSIM3v0pprwgGiven) - model->BSIM3v0pprwg = 0.0; - if (!model->BSIM3v0pprtGiven) - model->BSIM3v0pprt = 0.0; - if (!model->BSIM3v0peta0Given) - model->BSIM3v0peta0 = 0.0; - if (!model->BSIM3v0petabGiven) - model->BSIM3v0petab = 0.0; - if (!model->BSIM3v0ppclmGiven) - model->BSIM3v0ppclm = 0.0; - if (!model->BSIM3v0ppdibl1Given) - model->BSIM3v0ppdibl1 = 0.0; - if (!model->BSIM3v0ppdibl2Given) - model->BSIM3v0ppdibl2 = 0.0; - if (!model->BSIM3v0ppdiblbGiven) - model->BSIM3v0ppdiblb = 0.0; - if (!model->BSIM3v0ppscbe1Given) - model->BSIM3v0ppscbe1 = 0.0; - if (!model->BSIM3v0ppscbe2Given) - model->BSIM3v0ppscbe2 = 0.0; - if (!model->BSIM3v0ppvagGiven) - model->BSIM3v0ppvag = 0.0; - if (!model->BSIM3v0pwrGiven) - model->BSIM3v0pwr = 0.0; - if (!model->BSIM3v0pdwgGiven) - model->BSIM3v0pdwg = 0.0; - if (!model->BSIM3v0pdwbGiven) - model->BSIM3v0pdwb = 0.0; - if (!model->BSIM3v0pb0Given) - model->BSIM3v0pb0 = 0.0; - if (!model->BSIM3v0pb1Given) - model->BSIM3v0pb1 = 0.0; - if (!model->BSIM3v0palpha0Given) - model->BSIM3v0palpha0 = 0.0; - if (!model->BSIM3v0pbeta0Given) - model->BSIM3v0pbeta0 = 0.0; - - if (!model->BSIM3v0pelmGiven) - model->BSIM3v0pelm = 0.0; - if (!model->BSIM3v0pcgslGiven) - model->BSIM3v0pcgsl = 0.0; - if (!model->BSIM3v0pcgdlGiven) - model->BSIM3v0pcgdl = 0.0; - if (!model->BSIM3v0pckappaGiven) - model->BSIM3v0pckappa = 0.0; - if (!model->BSIM3v0pcfGiven) - model->BSIM3v0pcf = 0.0; - if (!model->BSIM3v0pclcGiven) - model->BSIM3v0pclc = 0.0; - if (!model->BSIM3v0pcleGiven) - model->BSIM3v0pcle = 0.0; - - /* unit degree celcius */ - if (!model->BSIM3v0tnomGiven) - model->BSIM3v0tnom = ckt->CKTnomTemp; - if (!model->BSIM3v0LintGiven) - model->BSIM3v0Lint = 0.0; - if (!model->BSIM3v0LlGiven) - model->BSIM3v0Ll = 0.0; - if (!model->BSIM3v0LlnGiven) - model->BSIM3v0Lln = 1.0; - if (!model->BSIM3v0LwGiven) - model->BSIM3v0Lw = 0.0; - if (!model->BSIM3v0LwnGiven) - model->BSIM3v0Lwn = 1.0; - if (!model->BSIM3v0LwlGiven) - model->BSIM3v0Lwl = 0.0; - if (!model->BSIM3v0LminGiven) - model->BSIM3v0Lmin = 0.0; - if (!model->BSIM3v0LmaxGiven) - model->BSIM3v0Lmax = 1.0; - if (!model->BSIM3v0WintGiven) - model->BSIM3v0Wint = 0.0; - if (!model->BSIM3v0WlGiven) - model->BSIM3v0Wl = 0.0; - if (!model->BSIM3v0WlnGiven) - model->BSIM3v0Wln = 1.0; - if (!model->BSIM3v0WwGiven) - model->BSIM3v0Ww = 0.0; - if (!model->BSIM3v0WwnGiven) - model->BSIM3v0Wwn = 1.0; - if (!model->BSIM3v0WwlGiven) - model->BSIM3v0Wwl = 0.0; - if (!model->BSIM3v0WminGiven) - model->BSIM3v0Wmin = 0.0; - if (!model->BSIM3v0WmaxGiven) - model->BSIM3v0Wmax = 1.0; - if (!model->BSIM3v0dwcGiven) - model->BSIM3v0dwc = model->BSIM3v0Wint; - if (!model->BSIM3v0dlcGiven) - model->BSIM3v0dlc = model->BSIM3v0Lint; - if (!model->BSIM3v0cfGiven) - model->BSIM3v0cf = 2.0 * EPSOX / PI - * log(1.0 + 0.4e-6 / model->BSIM3v0tox); - if (!model->BSIM3v0cgdoGiven) - { if (model->BSIM3v0dlcGiven && (model->BSIM3v0dlc > 0.0)) - { model->BSIM3v0cgdo = model->BSIM3v0dlc * model->BSIM3v0cox - - model->BSIM3v0cgdl ; - if (model->BSIM3v0cgdo < 0.0) - model->BSIM3v0cgdo = 0.0; - } - else - model->BSIM3v0cgdo = 0.6 * model->BSIM3v0xj * model->BSIM3v0cox; - } - if (!model->BSIM3v0cgsoGiven) - { if (model->BSIM3v0dlcGiven && (model->BSIM3v0dlc > 0.0)) - { model->BSIM3v0cgso = model->BSIM3v0dlc * model->BSIM3v0cox - - model->BSIM3v0cgsl ; - if (model->BSIM3v0cgso < 0.0) - model->BSIM3v0cgso = 0.0; - } - else - model->BSIM3v0cgso = 0.6 * model->BSIM3v0xj * model->BSIM3v0cox; - } - - if (!model->BSIM3v0cgboGiven) - model->BSIM3v0cgbo = 0.0; - if (!model->BSIM3v0xpartGiven) - model->BSIM3v0xpart = 0.0; - if (!model->BSIM3v0sheetResistanceGiven) - model->BSIM3v0sheetResistance = 0.0; - if (!model->BSIM3v0unitAreaJctCapGiven) - model->BSIM3v0unitAreaJctCap = 5.0E-4; - if (!model->BSIM3v0unitLengthSidewallJctCapGiven) - model->BSIM3v0unitLengthSidewallJctCap = 5.0E-10; - if (!model->BSIM3v0jctSatCurDensityGiven) - model->BSIM3v0jctSatCurDensity = 1.0E-4; - if (!model->BSIM3v0bulkJctPotentialGiven) - model->BSIM3v0bulkJctPotential = 1.0; - if (!model->BSIM3v0sidewallJctPotentialGiven) - model->BSIM3v0sidewallJctPotential = 1.0; - if (!model->BSIM3v0bulkJctBotGradingCoeffGiven) - model->BSIM3v0bulkJctBotGradingCoeff = 0.5; - if (!model->BSIM3v0bulkJctSideGradingCoeffGiven) - model->BSIM3v0bulkJctSideGradingCoeff = 0.33; - if (!model->BSIM3v0oxideTrapDensityAGiven) - { if (model->BSIM3v0type == NMOS) - model->BSIM3v0oxideTrapDensityA = 1e20; - else - model->BSIM3v0oxideTrapDensityA=9.9e18; - } - if (!model->BSIM3v0oxideTrapDensityBGiven) - { if (model->BSIM3v0type == NMOS) - model->BSIM3v0oxideTrapDensityB = 5e4; - else - model->BSIM3v0oxideTrapDensityB = 2.4e3; - } - if (!model->BSIM3v0oxideTrapDensityCGiven) - { if (model->BSIM3v0type == NMOS) - model->BSIM3v0oxideTrapDensityC = -1.4e-12; - else - model->BSIM3v0oxideTrapDensityC = 1.4e-12; - - } - if (!model->BSIM3v0emGiven) - model->BSIM3v0em = 4.1e7; /* V/m */ - if (!model->BSIM3v0efGiven) - model->BSIM3v0ef = 1.0; - if (!model->BSIM3v0afGiven) - model->BSIM3v0af = 1.0; - if (!model->BSIM3v0kfGiven) - model->BSIM3v0kf = 0.0; - /* loop through all the instances of the model */ - for (here = BSIM3v0instances(model); here != NULL ; - here=BSIM3v0nextInstance(here)) - { - /* allocate a chunk of the state vector */ - here->BSIM3v0states = *states; - *states += BSIM3v0numStates; - - /* perform the parameter defaulting */ - if (!here->BSIM3v0drainAreaGiven) - here->BSIM3v0drainArea = 0.0; - if (!here->BSIM3v0drainPerimeterGiven) - here->BSIM3v0drainPerimeter = 0.0; - if (!here->BSIM3v0drainSquaresGiven) - here->BSIM3v0drainSquares = 1.0; - if (!here->BSIM3v0icVBSGiven) - here->BSIM3v0icVBS = 0; - if (!here->BSIM3v0icVDSGiven) - here->BSIM3v0icVDS = 0; - if (!here->BSIM3v0icVGSGiven) - here->BSIM3v0icVGS = 0; - if (!here->BSIM3v0lGiven) - here->BSIM3v0l = 5e-6; - if (!here->BSIM3v0sourceAreaGiven) - here->BSIM3v0sourceArea = 0; - if (!here->BSIM3v0sourcePerimeterGiven) - here->BSIM3v0sourcePerimeter = 0; - if (!here->BSIM3v0sourceSquaresGiven) - here->BSIM3v0sourceSquares = 1; - if (!here->BSIM3v0wGiven) - here->BSIM3v0w = 5e-6; - - if (!here->BSIM3v0mGiven) - here->BSIM3v0m = 1; - - if (!here->BSIM3v0nqsModGiven) - here->BSIM3v0nqsMod = model->BSIM3v0nqsMod; - - /* process drain series resistance */ - if ((model->BSIM3v0sheetResistance > 0.0) && - (here->BSIM3v0drainSquares > 0.0 )) - { if(here->BSIM3v0dNodePrime == 0) - { error = CKTmkVolt(ckt,&tmp,here->BSIM3v0name,"drain"); - if(error) return(error); - here->BSIM3v0dNodePrime = tmp->number; - - if (ckt->CKTcopyNodesets) { - if (CKTinst2Node(ckt,here,1,&tmpNode,&tmpName)==OK) { - if (tmpNode->nsGiven) { - tmp->nodeset=tmpNode->nodeset; - tmp->nsGiven=tmpNode->nsGiven; - } - } - } - } - } - else - { here->BSIM3v0dNodePrime = here->BSIM3v0dNode; - } - - /* process source series resistance */ - if ((model->BSIM3v0sheetResistance > 0.0) && - (here->BSIM3v0sourceSquares > 0.0 )) - { if(here->BSIM3v0sNodePrime == 0) - { error = CKTmkVolt(ckt,&tmp,here->BSIM3v0name,"source"); - if(error) return(error); - here->BSIM3v0sNodePrime = tmp->number; - - if (ckt->CKTcopyNodesets) { - if (CKTinst2Node(ckt,here,3,&tmpNode,&tmpName)==OK) { - if (tmpNode->nsGiven) { - tmp->nodeset=tmpNode->nodeset; - tmp->nsGiven=tmpNode->nsGiven; - } - } - } - - } - } - else - { here->BSIM3v0sNodePrime = here->BSIM3v0sNode; - } - - /* internal charge node */ - - if ((here->BSIM3v0nqsMod)) - { if(here->BSIM3v0qNode == 0) - { error = CKTmkVolt(ckt,&tmp,here->BSIM3v0name,"charge"); - if(error) return(error); - here->BSIM3v0qNode = tmp->number; - } - } - else - { here->BSIM3v0qNode = 0; - } - - /* set Sparse Matrix Pointers */ - -/* macro to make elements with built in test for out of memory */ -#define TSTALLOC(ptr,first,second) \ -do { if((here->ptr = SMPmakeElt(matrix, here->first, here->second)) == NULL){\ - return(E_NOMEM);\ -} } while(0) - - TSTALLOC(BSIM3v0DdPtr, BSIM3v0dNode, BSIM3v0dNode); - TSTALLOC(BSIM3v0GgPtr, BSIM3v0gNode, BSIM3v0gNode); - TSTALLOC(BSIM3v0SsPtr, BSIM3v0sNode, BSIM3v0sNode); - TSTALLOC(BSIM3v0BbPtr, BSIM3v0bNode, BSIM3v0bNode); - TSTALLOC(BSIM3v0DPdpPtr, BSIM3v0dNodePrime, BSIM3v0dNodePrime); - TSTALLOC(BSIM3v0SPspPtr, BSIM3v0sNodePrime, BSIM3v0sNodePrime); - TSTALLOC(BSIM3v0DdpPtr, BSIM3v0dNode, BSIM3v0dNodePrime); - TSTALLOC(BSIM3v0GbPtr, BSIM3v0gNode, BSIM3v0bNode); - TSTALLOC(BSIM3v0GdpPtr, BSIM3v0gNode, BSIM3v0dNodePrime); - TSTALLOC(BSIM3v0GspPtr, BSIM3v0gNode, BSIM3v0sNodePrime); - TSTALLOC(BSIM3v0SspPtr, BSIM3v0sNode, BSIM3v0sNodePrime); - TSTALLOC(BSIM3v0BdpPtr, BSIM3v0bNode, BSIM3v0dNodePrime); - TSTALLOC(BSIM3v0BspPtr, BSIM3v0bNode, BSIM3v0sNodePrime); - TSTALLOC(BSIM3v0DPspPtr, BSIM3v0dNodePrime, BSIM3v0sNodePrime); - TSTALLOC(BSIM3v0DPdPtr, BSIM3v0dNodePrime, BSIM3v0dNode); - TSTALLOC(BSIM3v0BgPtr, BSIM3v0bNode, BSIM3v0gNode); - TSTALLOC(BSIM3v0DPgPtr, BSIM3v0dNodePrime, BSIM3v0gNode); - TSTALLOC(BSIM3v0SPgPtr, BSIM3v0sNodePrime, BSIM3v0gNode); - TSTALLOC(BSIM3v0SPsPtr, BSIM3v0sNodePrime, BSIM3v0sNode); - TSTALLOC(BSIM3v0DPbPtr, BSIM3v0dNodePrime, BSIM3v0bNode); - TSTALLOC(BSIM3v0SPbPtr, BSIM3v0sNodePrime, BSIM3v0bNode); - TSTALLOC(BSIM3v0SPdpPtr, BSIM3v0sNodePrime, BSIM3v0dNodePrime); - - TSTALLOC(BSIM3v0QqPtr, BSIM3v0qNode, BSIM3v0qNode); - - TSTALLOC(BSIM3v0QdpPtr, BSIM3v0qNode, BSIM3v0dNodePrime); - TSTALLOC(BSIM3v0QspPtr, BSIM3v0qNode, BSIM3v0sNodePrime); - TSTALLOC(BSIM3v0QgPtr, BSIM3v0qNode, BSIM3v0gNode); - TSTALLOC(BSIM3v0QbPtr, BSIM3v0qNode, BSIM3v0bNode); - TSTALLOC(BSIM3v0DPqPtr, BSIM3v0dNodePrime, BSIM3v0qNode); - TSTALLOC(BSIM3v0SPqPtr, BSIM3v0sNodePrime, BSIM3v0qNode); - TSTALLOC(BSIM3v0GqPtr, BSIM3v0gNode, BSIM3v0qNode); - TSTALLOC(BSIM3v0BqPtr, BSIM3v0bNode, BSIM3v0qNode); - - } - } - return(OK); -} - - -int -BSIM3v0unsetup(GENmodel *inModel, CKTcircuit *ckt) -{ - BSIM3v0model *model; - BSIM3v0instance *here; - - for (model = (BSIM3v0model *)inModel; model != NULL; - model = BSIM3v0nextModel(model)) - { - for (here = BSIM3v0instances(model); here != NULL; - here=BSIM3v0nextInstance(here)) - { - if (here->BSIM3v0qNode > 0) - CKTdltNNum(ckt, here->BSIM3v0qNode); - here->BSIM3v0qNode = 0; - - if (here->BSIM3v0sNodePrime > 0 - && here->BSIM3v0sNodePrime != here->BSIM3v0sNode) - CKTdltNNum(ckt, here->BSIM3v0sNodePrime); - here->BSIM3v0sNodePrime = 0; - - if (here->BSIM3v0dNodePrime > 0 - && here->BSIM3v0dNodePrime != here->BSIM3v0dNode) - CKTdltNNum(ckt, here->BSIM3v0dNodePrime); - here->BSIM3v0dNodePrime = 0; - } - } - return OK; -} - - diff --git a/src/spicelib/devices/bsim3v0/b3v0temp.c b/src/spicelib/devices/bsim3v0/b3v0temp.c deleted file mode 100644 index 99a2e258a..000000000 --- a/src/spicelib/devices/bsim3v0/b3v0temp.c +++ /dev/null @@ -1,625 +0,0 @@ -/*********** -Copyright 1990 Regents of the University of California. All rights reserved. -Author: 1995 Min-Chie Jeng and Mansun Chan. -File: b3temp.c -**********/ -/* Lmin, Lmax, Wmin, Wmax */ - -#include "ngspice/ngspice.h" -#include "ngspice/smpdefs.h" -#include "ngspice/cktdefs.h" -#include "bsim3v0def.h" -#include "ngspice/const.h" -#include "ngspice/sperror.h" -#include "ngspice/suffix.h" - -#define Kb 1.3806226e-23 -#define KboQ 8.617087e-5 /* Kb / q where q = 1.60219e-19 */ -#define EPSOX 3.453133e-11 -#define EPSSI 1.03594e-10 -#define PI 3.141592654 -#define MAX_EXP 5.834617425e14 -#define MIN_EXP 1.713908431e-15 -#define EXP_THRESHOLD 34.0 -#define Charge_q 1.60219e-19 - - -/* ARGSUSED */ -int -BSIM3v0temp(GENmodel *inModel, CKTcircuit *ckt) -{ -BSIM3v0model *model = (BSIM3v0model*) inModel; -BSIM3v0instance *here; -struct bsim3v0SizeDependParam *pSizeDependParamKnot, *pLastKnot, *pParam = NULL; -double tmp1, tmp2, Eg, ni, T0, T1, T2, T3, Ldrn, Wdrn; -double Temp, TRatio, Inv_L, Inv_W, Inv_LW, Vtm0, Tnom; -int Size_Not_Found; - - /* loop through all the BSIM3v0 device models */ - for (; model != NULL; model = BSIM3v0nextModel(model)) - { Temp = ckt->CKTtemp; - if (model->BSIM3v0bulkJctPotential < 0.1) - model->BSIM3v0bulkJctPotential = 0.1; - if (model->BSIM3v0sidewallJctPotential < 0.1) - model->BSIM3v0sidewallJctPotential = 0.1; - - struct bsim3v0SizeDependParam *p = model->pSizeDependParamKnot; - while (p) { - struct bsim3v0SizeDependParam *next_p = p->pNext; - FREE(p); - p = next_p; - } - model->pSizeDependParamKnot = NULL; - pLastKnot = NULL; - - Tnom = model->BSIM3v0tnom; - TRatio = Temp / Tnom; - - /* loop through all the instances of the model */ - for (here = BSIM3v0instances(model); here != NULL; - here=BSIM3v0nextInstance(here)) - { - pSizeDependParamKnot = model->pSizeDependParamKnot; - Size_Not_Found = 1; - while ((pSizeDependParamKnot != NULL) && Size_Not_Found) - { if ((here->BSIM3v0l == pSizeDependParamKnot->Length) - && (here->BSIM3v0w == pSizeDependParamKnot->Width)) - { Size_Not_Found = 0; - here->pParam = pSizeDependParamKnot; - } - else - { pLastKnot = pSizeDependParamKnot; - pSizeDependParamKnot = pSizeDependParamKnot->pNext; - } - } - - if (Size_Not_Found) - { pParam = TMALLOC(struct bsim3v0SizeDependParam, 1); - if (pLastKnot == NULL) - model->pSizeDependParamKnot = pParam; - else - pLastKnot->pNext = pParam; - pParam->pNext = NULL; - here->pParam = pParam; - - Ldrn = here->BSIM3v0l; - Wdrn = here->BSIM3v0w; - - T0 = pow(Ldrn, model->BSIM3v0Lln); - T1 = pow(Wdrn, model->BSIM3v0Lwn); - tmp1 = model->BSIM3v0Ll / T0 + model->BSIM3v0Lw / T1 - + model->BSIM3v0Lwl / (T0 * T1); - pParam->BSIM3v0dl = model->BSIM3v0Lint + tmp1; - pParam->BSIM3v0dlc = model->BSIM3v0dlc + tmp1; - - T2 = pow(Ldrn, model->BSIM3v0Wln); - T3 = pow(Wdrn, model->BSIM3v0Wwn); - tmp2 = model->BSIM3v0Wl / T2 + model->BSIM3v0Ww / T3 - + model->BSIM3v0Wwl / (T2 * T3); - pParam->BSIM3v0dw = model->BSIM3v0Wint + tmp2; - pParam->BSIM3v0dwc = model->BSIM3v0dwc + tmp2; - - pParam->BSIM3v0leff = here->BSIM3v0l - 2.0 * pParam->BSIM3v0dl; - if (pParam->BSIM3v0leff <= 0.0) - { - SPfrontEnd->IFerrorf (ERR_FATAL, - "BSIM3v0: mosfet %s, model %s: Effective channel length <= 0", - model->BSIM3v0modName, here->BSIM3v0name); - return(E_BADPARM); - } - - pParam->BSIM3v0weff = here->BSIM3v0w - 2.0 * pParam->BSIM3v0dw; - if (pParam->BSIM3v0weff <= 0.0) - { - SPfrontEnd->IFerrorf (ERR_FATAL, - "BSIM3v0: mosfet %s, model %s: Effective channel width <= 0", - model->BSIM3v0modName, here->BSIM3v0name); - return(E_BADPARM); - } - - pParam->BSIM3v0leffCV = here->BSIM3v0l - 2.0 * pParam->BSIM3v0dlc; - if (pParam->BSIM3v0leffCV <= 0.0) - { - SPfrontEnd->IFerrorf (ERR_FATAL, - "BSIM3v0: mosfet %s, model %s: Effective channel length for C-V <= 0", - model->BSIM3v0modName, here->BSIM3v0name); - return(E_BADPARM); - } - - pParam->BSIM3v0weffCV = here->BSIM3v0w - 2.0 * pParam->BSIM3v0dwc; - if (pParam->BSIM3v0weffCV <= 0.0) - { - SPfrontEnd->IFerrorf (ERR_FATAL, - "BSIM3v0: mosfet %s, model %s: Effective channel width for C-V <= 0", - model->BSIM3v0modName, here->BSIM3v0name); - return(E_BADPARM); - } - - model->BSIM3v0vcrit = CONSTvt0 * log(CONSTvt0 - / (CONSTroot2 * 1.0e-14)); - model->BSIM3v0factor1 = sqrt(EPSSI / EPSOX * model->BSIM3v0tox); - - - if (model->BSIM3v0binUnit == 1) - { Inv_L = 1.0e-6 / pParam->BSIM3v0leff; - Inv_W = 1.0e-6 / pParam->BSIM3v0weff; - Inv_LW = 1.0e-12 / (pParam->BSIM3v0leff - * pParam->BSIM3v0weff); - } - else - { Inv_L = 1.0 / pParam->BSIM3v0leff; - Inv_W = 1.0 / pParam->BSIM3v0weff; - Inv_LW = 1.0 / (pParam->BSIM3v0leff - * pParam->BSIM3v0weff); - } - pParam->BSIM3v0cdsc = model->BSIM3v0cdsc - + model->BSIM3v0lcdsc * Inv_L - + model->BSIM3v0wcdsc * Inv_W - + model->BSIM3v0pcdsc * Inv_LW; - pParam->BSIM3v0cdscb = model->BSIM3v0cdscb - + model->BSIM3v0lcdscb * Inv_L - + model->BSIM3v0wcdscb * Inv_W - + model->BSIM3v0pcdscb * Inv_LW; - - pParam->BSIM3v0cdscd = model->BSIM3v0cdscd - + model->BSIM3v0lcdscd * Inv_L - + model->BSIM3v0wcdscd * Inv_W - + model->BSIM3v0pcdscd * Inv_LW; - - pParam->BSIM3v0cit = model->BSIM3v0cit - + model->BSIM3v0lcit * Inv_L - + model->BSIM3v0wcit * Inv_W - + model->BSIM3v0pcit * Inv_LW; - pParam->BSIM3v0nfactor = model->BSIM3v0nfactor - + model->BSIM3v0lnfactor * Inv_L - + model->BSIM3v0wnfactor * Inv_W - + model->BSIM3v0pnfactor * Inv_LW; - pParam->BSIM3v0xj = model->BSIM3v0xj - + model->BSIM3v0lxj * Inv_L - + model->BSIM3v0wxj * Inv_W - + model->BSIM3v0pxj * Inv_LW; - pParam->BSIM3v0vsat = model->BSIM3v0vsat - + model->BSIM3v0lvsat * Inv_L - + model->BSIM3v0wvsat * Inv_W - + model->BSIM3v0pvsat * Inv_LW; - pParam->BSIM3v0at = model->BSIM3v0at - + model->BSIM3v0lat * Inv_L - + model->BSIM3v0wat * Inv_W - + model->BSIM3v0pat * Inv_LW; - pParam->BSIM3v0a0 = model->BSIM3v0a0 - + model->BSIM3v0la0 * Inv_L - + model->BSIM3v0wa0 * Inv_W - + model->BSIM3v0pa0 * Inv_LW; - - pParam->BSIM3v0ags = model->BSIM3v0ags - + model->BSIM3v0lags * Inv_L - + model->BSIM3v0wags * Inv_W - + model->BSIM3v0pags * Inv_LW; - - pParam->BSIM3v0a1 = model->BSIM3v0a1 - + model->BSIM3v0la1 * Inv_L - + model->BSIM3v0wa1 * Inv_W - + model->BSIM3v0pa1 * Inv_LW; - pParam->BSIM3v0a2 = model->BSIM3v0a2 - + model->BSIM3v0la2 * Inv_L - + model->BSIM3v0wa2 * Inv_W - + model->BSIM3v0pa2 * Inv_LW; - pParam->BSIM3v0keta = model->BSIM3v0keta - + model->BSIM3v0lketa * Inv_L - + model->BSIM3v0wketa * Inv_W - + model->BSIM3v0pketa * Inv_LW; - pParam->BSIM3v0nsub = model->BSIM3v0nsub - + model->BSIM3v0lnsub * Inv_L - + model->BSIM3v0wnsub * Inv_W - + model->BSIM3v0pnsub * Inv_LW; - pParam->BSIM3v0npeak = model->BSIM3v0npeak - + model->BSIM3v0lnpeak * Inv_L - + model->BSIM3v0wnpeak * Inv_W - + model->BSIM3v0pnpeak * Inv_LW; - pParam->BSIM3v0ngate = model->BSIM3v0ngate - + model->BSIM3v0lngate * Inv_L - + model->BSIM3v0wngate * Inv_W - + model->BSIM3v0pngate * Inv_LW; - pParam->BSIM3v0gamma1 = model->BSIM3v0gamma1 - + model->BSIM3v0lgamma1 * Inv_L - + model->BSIM3v0wgamma1 * Inv_W - + model->BSIM3v0pgamma1 * Inv_LW; - pParam->BSIM3v0gamma2 = model->BSIM3v0gamma2 - + model->BSIM3v0lgamma2 * Inv_L - + model->BSIM3v0wgamma2 * Inv_W - + model->BSIM3v0pgamma2 * Inv_LW; - pParam->BSIM3v0vbx = model->BSIM3v0vbx - + model->BSIM3v0lvbx * Inv_L - + model->BSIM3v0wvbx * Inv_W - + model->BSIM3v0pvbx * Inv_LW; - pParam->BSIM3v0vbm = model->BSIM3v0vbm - + model->BSIM3v0lvbm * Inv_L - + model->BSIM3v0wvbm * Inv_W - + model->BSIM3v0pvbm * Inv_LW; - pParam->BSIM3v0xt = model->BSIM3v0xt - + model->BSIM3v0lxt * Inv_L - + model->BSIM3v0wxt * Inv_W - + model->BSIM3v0pxt * Inv_LW; - pParam->BSIM3v0k1 = model->BSIM3v0k1 - + model->BSIM3v0lk1 * Inv_L - + model->BSIM3v0wk1 * Inv_W - + model->BSIM3v0pk1 * Inv_LW; - pParam->BSIM3v0kt1 = model->BSIM3v0kt1 - + model->BSIM3v0lkt1 * Inv_L - + model->BSIM3v0wkt1 * Inv_W - + model->BSIM3v0pkt1 * Inv_LW; - pParam->BSIM3v0kt1l = model->BSIM3v0kt1l - + model->BSIM3v0lkt1l * Inv_L - + model->BSIM3v0wkt1l * Inv_W - + model->BSIM3v0pkt1l * Inv_LW; - pParam->BSIM3v0k2 = model->BSIM3v0k2 - + model->BSIM3v0lk2 * Inv_L - + model->BSIM3v0wk2 * Inv_W - + model->BSIM3v0pk2 * Inv_LW; - pParam->BSIM3v0kt2 = model->BSIM3v0kt2 - + model->BSIM3v0lkt2 * Inv_L - + model->BSIM3v0wkt2 * Inv_W - + model->BSIM3v0pkt2 * Inv_LW; - pParam->BSIM3v0k3 = model->BSIM3v0k3 - + model->BSIM3v0lk3 * Inv_L - + model->BSIM3v0wk3 * Inv_W - + model->BSIM3v0pk3 * Inv_LW; - pParam->BSIM3v0k3b = model->BSIM3v0k3b - + model->BSIM3v0lk3b * Inv_L - + model->BSIM3v0wk3b * Inv_W - + model->BSIM3v0pk3b * Inv_LW; - pParam->BSIM3v0w0 = model->BSIM3v0w0 - + model->BSIM3v0lw0 * Inv_L - + model->BSIM3v0ww0 * Inv_W - + model->BSIM3v0pw0 * Inv_LW; - pParam->BSIM3v0nlx = model->BSIM3v0nlx - + model->BSIM3v0lnlx * Inv_L - + model->BSIM3v0wnlx * Inv_W - + model->BSIM3v0pnlx * Inv_LW; - pParam->BSIM3v0dvt0 = model->BSIM3v0dvt0 - + model->BSIM3v0ldvt0 * Inv_L - + model->BSIM3v0wdvt0 * Inv_W - + model->BSIM3v0pdvt0 * Inv_LW; - pParam->BSIM3v0dvt1 = model->BSIM3v0dvt1 - + model->BSIM3v0ldvt1 * Inv_L - + model->BSIM3v0wdvt1 * Inv_W - + model->BSIM3v0pdvt1 * Inv_LW; - pParam->BSIM3v0dvt2 = model->BSIM3v0dvt2 - + model->BSIM3v0ldvt2 * Inv_L - + model->BSIM3v0wdvt2 * Inv_W - + model->BSIM3v0pdvt2 * Inv_LW; - pParam->BSIM3v0dvt0w = model->BSIM3v0dvt0w - + model->BSIM3v0ldvt0w * Inv_L - + model->BSIM3v0wdvt0w * Inv_W - + model->BSIM3v0pdvt0w * Inv_LW; - pParam->BSIM3v0dvt1w = model->BSIM3v0dvt1w - + model->BSIM3v0ldvt1w * Inv_L - + model->BSIM3v0wdvt1w * Inv_W - + model->BSIM3v0pdvt1w * Inv_LW; - pParam->BSIM3v0dvt2w = model->BSIM3v0dvt2w - + model->BSIM3v0ldvt2w * Inv_L - + model->BSIM3v0wdvt2w * Inv_W - + model->BSIM3v0pdvt2w * Inv_LW; - pParam->BSIM3v0drout = model->BSIM3v0drout - + model->BSIM3v0ldrout * Inv_L - + model->BSIM3v0wdrout * Inv_W - + model->BSIM3v0pdrout * Inv_LW; - pParam->BSIM3v0dsub = model->BSIM3v0dsub - + model->BSIM3v0ldsub * Inv_L - + model->BSIM3v0wdsub * Inv_W - + model->BSIM3v0pdsub * Inv_LW; - pParam->BSIM3v0vth0 = model->BSIM3v0vth0 - + model->BSIM3v0lvth0 * Inv_L - + model->BSIM3v0wvth0 * Inv_W - + model->BSIM3v0pvth0 * Inv_LW; - pParam->BSIM3v0ua = model->BSIM3v0ua - + model->BSIM3v0lua * Inv_L - + model->BSIM3v0wua * Inv_W - + model->BSIM3v0pua * Inv_LW; - pParam->BSIM3v0ua1 = model->BSIM3v0ua1 - + model->BSIM3v0lua1 * Inv_L - + model->BSIM3v0wua1 * Inv_W - + model->BSIM3v0pua1 * Inv_LW; - pParam->BSIM3v0ub = model->BSIM3v0ub - + model->BSIM3v0lub * Inv_L - + model->BSIM3v0wub * Inv_W - + model->BSIM3v0pub * Inv_LW; - pParam->BSIM3v0ub1 = model->BSIM3v0ub1 - + model->BSIM3v0lub1 * Inv_L - + model->BSIM3v0wub1 * Inv_W - + model->BSIM3v0pub1 * Inv_LW; - pParam->BSIM3v0uc = model->BSIM3v0uc - + model->BSIM3v0luc * Inv_L - + model->BSIM3v0wuc * Inv_W - + model->BSIM3v0puc * Inv_LW; - pParam->BSIM3v0uc1 = model->BSIM3v0uc1 - + model->BSIM3v0luc1 * Inv_L - + model->BSIM3v0wuc1 * Inv_W - + model->BSIM3v0puc1 * Inv_LW; - pParam->BSIM3v0u0 = model->BSIM3v0u0 - + model->BSIM3v0lu0 * Inv_L - + model->BSIM3v0wu0 * Inv_W - + model->BSIM3v0pu0 * Inv_LW; - pParam->BSIM3v0ute = model->BSIM3v0ute - + model->BSIM3v0lute * Inv_L - + model->BSIM3v0wute * Inv_W - + model->BSIM3v0pute * Inv_LW; - pParam->BSIM3v0voff = model->BSIM3v0voff - + model->BSIM3v0lvoff * Inv_L - + model->BSIM3v0wvoff * Inv_W - + model->BSIM3v0pvoff * Inv_LW; - pParam->BSIM3v0delta = model->BSIM3v0delta - + model->BSIM3v0ldelta * Inv_L - + model->BSIM3v0wdelta * Inv_W - + model->BSIM3v0pdelta * Inv_LW; - pParam->BSIM3v0rdsw = model->BSIM3v0rdsw - + model->BSIM3v0lrdsw * Inv_L - + model->BSIM3v0wrdsw * Inv_W - + model->BSIM3v0prdsw * Inv_LW; - pParam->BSIM3v0prwg = model->BSIM3v0prwg - + model->BSIM3v0lprwg * Inv_L - + model->BSIM3v0wprwg * Inv_W - + model->BSIM3v0pprwg * Inv_LW; - pParam->BSIM3v0prwb = model->BSIM3v0prwb - + model->BSIM3v0lprwb * Inv_L - + model->BSIM3v0wprwb * Inv_W - + model->BSIM3v0pprwb * Inv_LW; - pParam->BSIM3v0prt = model->BSIM3v0prt - + model->BSIM3v0lprt * Inv_L - + model->BSIM3v0wprt * Inv_W - + model->BSIM3v0pprt * Inv_LW; - pParam->BSIM3v0eta0 = model->BSIM3v0eta0 - + model->BSIM3v0leta0 * Inv_L - + model->BSIM3v0weta0 * Inv_W - + model->BSIM3v0peta0 * Inv_LW; - pParam->BSIM3v0etab = model->BSIM3v0etab - + model->BSIM3v0letab * Inv_L - + model->BSIM3v0wetab * Inv_W - + model->BSIM3v0petab * Inv_LW; - pParam->BSIM3v0pclm = model->BSIM3v0pclm - + model->BSIM3v0lpclm * Inv_L - + model->BSIM3v0wpclm * Inv_W - + model->BSIM3v0ppclm * Inv_LW; - pParam->BSIM3v0pdibl1 = model->BSIM3v0pdibl1 - + model->BSIM3v0lpdibl1 * Inv_L - + model->BSIM3v0wpdibl1 * Inv_W - + model->BSIM3v0ppdibl1 * Inv_LW; - pParam->BSIM3v0pdibl2 = model->BSIM3v0pdibl2 - + model->BSIM3v0lpdibl2 * Inv_L - + model->BSIM3v0wpdibl2 * Inv_W - + model->BSIM3v0ppdibl2 * Inv_LW; - pParam->BSIM3v0pdiblb = model->BSIM3v0pdiblb - + model->BSIM3v0lpdiblb * Inv_L - + model->BSIM3v0wpdiblb * Inv_W - + model->BSIM3v0ppdiblb * Inv_LW; - pParam->BSIM3v0pscbe1 = model->BSIM3v0pscbe1 - + model->BSIM3v0lpscbe1 * Inv_L - + model->BSIM3v0wpscbe1 * Inv_W - + model->BSIM3v0ppscbe1 * Inv_LW; - pParam->BSIM3v0pscbe2 = model->BSIM3v0pscbe2 - + model->BSIM3v0lpscbe2 * Inv_L - + model->BSIM3v0wpscbe2 * Inv_W - + model->BSIM3v0ppscbe2 * Inv_LW; - pParam->BSIM3v0pvag = model->BSIM3v0pvag - + model->BSIM3v0lpvag * Inv_L - + model->BSIM3v0wpvag * Inv_W - + model->BSIM3v0ppvag * Inv_LW; - pParam->BSIM3v0wr = model->BSIM3v0wr - + model->BSIM3v0lwr * Inv_L - + model->BSIM3v0wwr * Inv_W - + model->BSIM3v0pwr * Inv_LW; - pParam->BSIM3v0dwg = model->BSIM3v0dwg - + model->BSIM3v0ldwg * Inv_L - + model->BSIM3v0wdwg * Inv_W - + model->BSIM3v0pdwg * Inv_LW; - pParam->BSIM3v0dwb = model->BSIM3v0dwb - + model->BSIM3v0ldwb * Inv_L - + model->BSIM3v0wdwb * Inv_W - + model->BSIM3v0pdwb * Inv_LW; - pParam->BSIM3v0b0 = model->BSIM3v0b0 - + model->BSIM3v0lb0 * Inv_L - + model->BSIM3v0wb0 * Inv_W - + model->BSIM3v0pb0 * Inv_LW; - pParam->BSIM3v0b1 = model->BSIM3v0b1 - + model->BSIM3v0lb1 * Inv_L - + model->BSIM3v0wb1 * Inv_W - + model->BSIM3v0pb1 * Inv_LW; - pParam->BSIM3v0alpha0 = model->BSIM3v0alpha0 - + model->BSIM3v0lalpha0 * Inv_L - + model->BSIM3v0walpha0 * Inv_W - + model->BSIM3v0palpha0 * Inv_LW; - pParam->BSIM3v0beta0 = model->BSIM3v0beta0 - + model->BSIM3v0lbeta0 * Inv_L - + model->BSIM3v0wbeta0 * Inv_W - + model->BSIM3v0pbeta0 * Inv_LW; - /* CV model */ - pParam->BSIM3v0elm = model->BSIM3v0elm - + model->BSIM3v0lelm * Inv_L - + model->BSIM3v0welm * Inv_W - + model->BSIM3v0pelm * Inv_LW; - pParam->BSIM3v0cgsl = model->BSIM3v0cgsl - + model->BSIM3v0lcgsl * Inv_L - + model->BSIM3v0wcgsl * Inv_W - + model->BSIM3v0pcgsl * Inv_LW; - pParam->BSIM3v0cgdl = model->BSIM3v0cgdl - + model->BSIM3v0lcgdl * Inv_L - + model->BSIM3v0wcgdl * Inv_W - + model->BSIM3v0pcgdl * Inv_LW; - pParam->BSIM3v0ckappa = model->BSIM3v0ckappa - + model->BSIM3v0lckappa * Inv_L - + model->BSIM3v0wckappa * Inv_W - + model->BSIM3v0pckappa * Inv_LW; - pParam->BSIM3v0cf = model->BSIM3v0cf - + model->BSIM3v0lcf * Inv_L - + model->BSIM3v0wcf * Inv_W - + model->BSIM3v0pcf * Inv_LW; - pParam->BSIM3v0clc = model->BSIM3v0clc - + model->BSIM3v0lclc * Inv_L - + model->BSIM3v0wclc * Inv_W - + model->BSIM3v0pclc * Inv_LW; - pParam->BSIM3v0cle = model->BSIM3v0cle - + model->BSIM3v0lcle * Inv_L - + model->BSIM3v0wcle * Inv_W - + model->BSIM3v0pcle * Inv_LW; - pParam->BSIM3v0abulkCVfactor = 1.0 + pow((pParam->BSIM3v0clc - / pParam->BSIM3v0leff), - pParam->BSIM3v0cle); - - pParam->BSIM3v0cgdo = (model->BSIM3v0cgdo + pParam->BSIM3v0cf) - * pParam->BSIM3v0weffCV; - pParam->BSIM3v0cgso = (model->BSIM3v0cgso + pParam->BSIM3v0cf) - * pParam->BSIM3v0weffCV; - pParam->BSIM3v0cgbo = model->BSIM3v0cgbo * pParam->BSIM3v0leffCV; - - T0 = (TRatio - 1.0); - pParam->BSIM3v0ua = pParam->BSIM3v0ua + pParam->BSIM3v0ua1 * T0; - pParam->BSIM3v0ub = pParam->BSIM3v0ub + pParam->BSIM3v0ub1 * T0; - pParam->BSIM3v0uc = pParam->BSIM3v0uc + pParam->BSIM3v0uc1 * T0; - - pParam->BSIM3v0u0temp = pParam->BSIM3v0u0 - * pow(TRatio, pParam->BSIM3v0ute); - pParam->BSIM3v0vsattemp = pParam->BSIM3v0vsat - pParam->BSIM3v0at - * T0; - pParam->BSIM3v0rds0 = (pParam->BSIM3v0rdsw + pParam->BSIM3v0prt * T0) - / pow(pParam->BSIM3v0weff * 1E6, pParam->BSIM3v0wr); - - if (!model->BSIM3v0npeakGiven && model->BSIM3v0gamma1Given) - { T0 = pParam->BSIM3v0gamma1 * model->BSIM3v0cox; - pParam->BSIM3v0npeak = 3.021E22 * T0 * T0; - } - - Vtm0 = KboQ * Tnom; - Eg = 1.16 - 7.02e-4 * Tnom * Tnom / (Tnom + 1108.0); - ni = 1.45e10 * (Tnom / 300.15) * sqrt(Tnom / 300.15) - * exp(21.5565981 - Eg / (2.0 * Vtm0)); - - pParam->BSIM3v0phi = 2.0 * Vtm0 - * log(pParam->BSIM3v0npeak / ni); - - pParam->BSIM3v0sqrtPhi = sqrt(pParam->BSIM3v0phi); - pParam->BSIM3v0phis3 = pParam->BSIM3v0sqrtPhi * pParam->BSIM3v0phi; - - pParam->BSIM3v0Xdep0 = sqrt(2.0 * EPSSI / (Charge_q - * pParam->BSIM3v0npeak * 1.0e6)) - * pParam->BSIM3v0sqrtPhi; - pParam->BSIM3v0sqrtXdep0 = sqrt(pParam->BSIM3v0Xdep0); - pParam->BSIM3v0litl = sqrt(3.0 * pParam->BSIM3v0xj - * model->BSIM3v0tox); - pParam->BSIM3v0vbi = Vtm0 * log(1.0e20 - * pParam->BSIM3v0npeak / (ni * ni)); - pParam->BSIM3v0cdep0 = sqrt(Charge_q * EPSSI - * pParam->BSIM3v0npeak * 1.0e6 / 2.0 - / pParam->BSIM3v0phi); - - if (model->BSIM3v0k1Given || model->BSIM3v0k2Given) - { if (!model->BSIM3v0k1Given) - { fprintf(stdout, "Warning: k1 should be specified with k2.\n"); - pParam->BSIM3v0k1 = 0.53; - } - if (!model->BSIM3v0k2Given) - { fprintf(stdout, "Warning: k2 should be specified with k1.\n"); - pParam->BSIM3v0k2 = -0.0186; - } - if (model->BSIM3v0nsubGiven) - fprintf(stdout, "Warning: nsub is ignored because k1 or k2 is given.\n"); - if (model->BSIM3v0xtGiven) - fprintf(stdout, "Warning: xt is ignored because k1 or k2 is given.\n"); - if (model->BSIM3v0vbxGiven) - fprintf(stdout, "Warning: vbx is ignored because k1 or k2 is given.\n"); - if (model->BSIM3v0vbmGiven) - fprintf(stdout, "Warning: vbm is ignored because k1 or k2 is given.\n"); - if (model->BSIM3v0gamma1Given) - fprintf(stdout, "Warning: gamma1 is ignored because k1 or k2 is given.\n"); - if (model->BSIM3v0gamma2Given) - fprintf(stdout, "Warning: gamma2 is ignored because k1 or k2 is given.\n"); - } - else - { if (!model->BSIM3v0vbxGiven) - pParam->BSIM3v0vbx = pParam->BSIM3v0phi - 7.7348e-4 - * pParam->BSIM3v0npeak - * pParam->BSIM3v0xt * pParam->BSIM3v0xt; - if (pParam->BSIM3v0vbx > 0.0) - pParam->BSIM3v0vbx = -pParam->BSIM3v0vbx; - if (pParam->BSIM3v0vbm > 0.0) - pParam->BSIM3v0vbm = -pParam->BSIM3v0vbm; - - if (!model->BSIM3v0gamma1Given) - pParam->BSIM3v0gamma1 = 5.753e-12 - * sqrt(pParam->BSIM3v0npeak) - / model->BSIM3v0cox; - if (!model->BSIM3v0gamma2Given) - pParam->BSIM3v0gamma2 = 5.753e-12 - * sqrt(pParam->BSIM3v0nsub) - / model->BSIM3v0cox; - - T0 = pParam->BSIM3v0gamma1 - pParam->BSIM3v0gamma2; - T1 = sqrt(pParam->BSIM3v0phi - pParam->BSIM3v0vbx) - - pParam->BSIM3v0sqrtPhi; - T2 = sqrt(pParam->BSIM3v0phi * (pParam->BSIM3v0phi - - pParam->BSIM3v0vbm)) - pParam->BSIM3v0phi; - pParam->BSIM3v0k2 = T0 * T1 / (2.0 * T2 + pParam->BSIM3v0vbm); - pParam->BSIM3v0k1 = pParam->BSIM3v0gamma2 - 2.0 - * pParam->BSIM3v0k2 * sqrt(pParam->BSIM3v0phi - - pParam->BSIM3v0vbm); - } - - if (pParam->BSIM3v0k2 > 0.0) - { T0 = 0.5 * pParam->BSIM3v0k1 / pParam->BSIM3v0k2; - pParam->BSIM3v0vbsc = 0.9 * (pParam->BSIM3v0phi - T0 * T0); - if (pParam->BSIM3v0vbsc > -3.0) - pParam->BSIM3v0vbsc = -3.0; - else if (pParam->BSIM3v0vbsc < -30.0) - pParam->BSIM3v0vbsc = -30.0; - } - else - { pParam->BSIM3v0vbsc = -10.0; - } - - model->BSIM3v0vtm = KboQ * Temp; - - if (model->BSIM3v0vth0Given) - pParam->BSIM3v0vfb = model->BSIM3v0type * pParam->BSIM3v0vth0 - - pParam->BSIM3v0phi - pParam->BSIM3v0k1 - * pParam->BSIM3v0sqrtPhi; - else - pParam->BSIM3v0vth0 = model->BSIM3v0type * (-1.0 - + pParam->BSIM3v0phi + pParam->BSIM3v0k1 - * pParam->BSIM3v0sqrtPhi); - - T1 = sqrt(EPSSI / EPSOX * model->BSIM3v0tox - * pParam->BSIM3v0Xdep0); - T0 = exp(-0.5 * pParam->BSIM3v0dsub * pParam->BSIM3v0leff / T1); - pParam->BSIM3v0theta0vb0 = (T0 + 2.0 * T0 * T0); - - T0 = exp(-0.5 * pParam->BSIM3v0drout * pParam->BSIM3v0leff / T1); - T2 = (T0 + 2.0 * T0 * T0); - pParam->BSIM3v0thetaRout = pParam->BSIM3v0pdibl1 * T2 - + pParam->BSIM3v0pdibl2; - - /* process source/drain series resistance */ - here->BSIM3v0drainConductance = model->BSIM3v0sheetResistance - * here->BSIM3v0drainSquares; - if (here->BSIM3v0drainConductance > 0.0) - here->BSIM3v0drainConductance = 1.0 - / here->BSIM3v0drainConductance; - else - here->BSIM3v0drainConductance = 0.0; - - here->BSIM3v0sourceConductance = model->BSIM3v0sheetResistance - * here->BSIM3v0sourceSquares; - if (here->BSIM3v0sourceConductance > 0.0) - here->BSIM3v0sourceConductance = 1.0 - / here->BSIM3v0sourceConductance; - else - here->BSIM3v0sourceConductance = 0.0; - } - here->BSIM3v0cgso = pParam->BSIM3v0cgso; - here->BSIM3v0cgdo = pParam->BSIM3v0cgdo; - } - } - return(OK); -} - - - - diff --git a/src/spicelib/devices/bsim3v0/b3v0trunc.c b/src/spicelib/devices/bsim3v0/b3v0trunc.c deleted file mode 100644 index 0774f296f..000000000 --- a/src/spicelib/devices/bsim3v0/b3v0trunc.c +++ /dev/null @@ -1,44 +0,0 @@ -/********** -Copyright 1990 Regents of the University of California. All rights reserved. -Author: 1995 Min-Chie Jeng and Mansun Chan. -File: b3v0trunc.c -**********/ - -#include "ngspice/ngspice.h" -#include "ngspice/cktdefs.h" -#include "bsim3v0def.h" -#include "ngspice/sperror.h" -#include "ngspice/suffix.h" - - -int -BSIM3v0trunc(GENmodel *inModel, CKTcircuit *ckt, double *timeStep) -{ -BSIM3v0model *model = (BSIM3v0model*)inModel; -BSIM3v0instance *here; - -#ifdef STEPDEBUG - double debugtemp; -#endif /* STEPDEBUG */ - - for (; model != NULL; model = BSIM3v0nextModel(model)) - { for (here = BSIM3v0instances(model); here != NULL; - here = BSIM3v0nextInstance(here)) - { - -#ifdef STEPDEBUG - debugtemp = *timeStep; -#endif /* STEPDEBUG */ - CKTterr(here->BSIM3v0qb,ckt,timeStep); - CKTterr(here->BSIM3v0qg,ckt,timeStep); - CKTterr(here->BSIM3v0qd,ckt,timeStep); -#ifdef STEPDEBUG - if(debugtemp != *timeStep) - { printf("device %s reduces step from %g to %g\n", - here->BSIM3v0name,debugtemp,*timeStep); - } -#endif /* STEPDEBUG */ - } - } - return(OK); -} diff --git a/src/spicelib/devices/bsim3v0/bsim3v0def.h b/src/spicelib/devices/bsim3v0/bsim3v0def.h deleted file mode 100644 index 062d010df..000000000 --- a/src/spicelib/devices/bsim3v0/bsim3v0def.h +++ /dev/null @@ -1,1586 +0,0 @@ -/********** -Copyright 1990 Regents of the University of California. All rights reserved. -Author: 1995 Min-Chie Jeng and Mansun Chan -File: bsim3v0def.h -**********/ - -#ifndef BSIM3v0 -#define BSIM3v0 - -#include "ngspice/ifsim.h" -#include "ngspice/gendefs.h" -#include "ngspice/cktdefs.h" -#include "ngspice/complex.h" -#include "ngspice/noisedef.h" - -typedef struct sBSIM3v0instance -{ - - struct GENinstance gen; - -#define BSIM3v0modPtr(inst) ((struct sBSIM3v0model *)((inst)->gen.GENmodPtr)) -#define BSIM3v0nextInstance(inst) ((struct sBSIM3v0instance *)((inst)->gen.GENnextInstance)) -#define BSIM3v0name gen.GENname -#define BSIM3v0states gen.GENstate - - const int BSIM3v0dNode; - const int BSIM3v0gNode; - const int BSIM3v0sNode; - const int BSIM3v0bNode; - int BSIM3v0dNodePrime; - int BSIM3v0sNodePrime; - int BSIM3v0qNode; /* MCJ */ - - /* MCJ */ - double BSIM3v0ueff; - double BSIM3v0thetavth; - double BSIM3v0von; - double BSIM3v0vdsat; - double BSIM3v0cgdo; - double BSIM3v0cgso; - - double BSIM3v0l; - double BSIM3v0w; - double BSIM3v0m; - double BSIM3v0drainArea; - double BSIM3v0sourceArea; - double BSIM3v0drainSquares; - double BSIM3v0sourceSquares; - double BSIM3v0drainPerimeter; - double BSIM3v0sourcePerimeter; - double BSIM3v0sourceConductance; - double BSIM3v0drainConductance; - - double BSIM3v0icVBS; - double BSIM3v0icVDS; - double BSIM3v0icVGS; - int BSIM3v0off; - int BSIM3v0mode; - int BSIM3v0nqsMod; - - /* OP point */ - double BSIM3v0qinv; - double BSIM3v0cd; - double BSIM3v0cbs; - double BSIM3v0cbd; - double BSIM3v0csub; - double BSIM3v0gm; - double BSIM3v0gds; - double BSIM3v0gmbs; - double BSIM3v0gbd; - double BSIM3v0gbs; - - double BSIM3v0gbbs; - double BSIM3v0gbgs; - double BSIM3v0gbds; - - double BSIM3v0cggb; - double BSIM3v0cgdb; - double BSIM3v0cgsb; - double BSIM3v0cbgb; - double BSIM3v0cbdb; - double BSIM3v0cbsb; - double BSIM3v0cdgb; - double BSIM3v0cddb; - double BSIM3v0cdsb; - double BSIM3v0capbd; - double BSIM3v0capbs; - - double BSIM3v0cqgb; - double BSIM3v0cqdb; - double BSIM3v0cqsb; - double BSIM3v0cqbb; - - double BSIM3v0gtau; - double BSIM3v0gtg; - double BSIM3v0gtd; - double BSIM3v0gts; - double BSIM3v0gtb; - double BSIM3v0tconst; - - struct bsim3v0SizeDependParam *pParam; - - unsigned BSIM3v0lGiven :1; - unsigned BSIM3v0wGiven :1; - unsigned BSIM3v0mGiven :1; - unsigned BSIM3v0drainAreaGiven :1; - unsigned BSIM3v0sourceAreaGiven :1; - unsigned BSIM3v0drainSquaresGiven :1; - unsigned BSIM3v0sourceSquaresGiven :1; - unsigned BSIM3v0drainPerimeterGiven :1; - unsigned BSIM3v0sourcePerimeterGiven :1; - unsigned BSIM3v0dNodePrimeSet :1; - unsigned BSIM3v0sNodePrimeSet :1; - unsigned BSIM3v0icVBSGiven :1; - unsigned BSIM3v0icVDSGiven :1; - unsigned BSIM3v0icVGSGiven :1; - unsigned BSIM3v0nqsModGiven :1; - - double *BSIM3v0DdPtr; - double *BSIM3v0GgPtr; - double *BSIM3v0SsPtr; - double *BSIM3v0BbPtr; - double *BSIM3v0DPdpPtr; - double *BSIM3v0SPspPtr; - double *BSIM3v0DdpPtr; - double *BSIM3v0GbPtr; - double *BSIM3v0GdpPtr; - double *BSIM3v0GspPtr; - double *BSIM3v0SspPtr; - double *BSIM3v0BdpPtr; - double *BSIM3v0BspPtr; - double *BSIM3v0DPspPtr; - double *BSIM3v0DPdPtr; - double *BSIM3v0BgPtr; - double *BSIM3v0DPgPtr; - double *BSIM3v0SPgPtr; - double *BSIM3v0SPsPtr; - double *BSIM3v0DPbPtr; - double *BSIM3v0SPbPtr; - double *BSIM3v0SPdpPtr; - - double *BSIM3v0QqPtr; - double *BSIM3v0QdpPtr; - double *BSIM3v0QgPtr; - double *BSIM3v0QspPtr; - double *BSIM3v0QbPtr; - double *BSIM3v0DPqPtr; - double *BSIM3v0GqPtr; - double *BSIM3v0SPqPtr; - double *BSIM3v0BqPtr; - -#define BSIM3v0vbd BSIM3v0states+ 0 -#define BSIM3v0vbs BSIM3v0states+ 1 -#define BSIM3v0vgs BSIM3v0states+ 2 -#define BSIM3v0vds BSIM3v0states+ 3 - -#define BSIM3v0qb BSIM3v0states+ 4 -#define BSIM3v0cqb BSIM3v0states+ 5 -#define BSIM3v0qg BSIM3v0states+ 6 -#define BSIM3v0cqg BSIM3v0states+ 7 -#define BSIM3v0qd BSIM3v0states+ 8 -#define BSIM3v0cqd BSIM3v0states+ 9 - -#define BSIM3v0qbs BSIM3v0states+ 10 -#define BSIM3v0qbd BSIM3v0states+ 11 - -#define BSIM3v0qcheq BSIM3v0states+ 12 -#define BSIM3v0cqcheq BSIM3v0states+ 13 -#define BSIM3v0qcdump BSIM3v0states+ 14 -#define BSIM3v0cqcdump BSIM3v0states+ 15 - -#define BSIM3v0tau BSIM3v0states+ 16 -#define BSIM3v0qdef BSIM3v0states+ 17 - -#define BSIM3v0numStates 18 - - -/* indices to the array of BSIM3v0 NOISE SOURCES */ - -#define BSIM3v0RDNOIZ 0 -#define BSIM3v0RSNOIZ 1 -#define BSIM3v0IDNOIZ 2 -#define BSIM3v0FLNOIZ 3 -#define BSIM3v0TOTNOIZ 4 - -#define BSIM3v0NSRCS 5 /* the number of MOSFET(3) noise sources */ - -#ifndef NONOISE - double BSIM3v0nVar[NSTATVARS][BSIM3v0NSRCS]; -#else /* NONOISE */ - double **BSIM3v0nVar; -#endif /* NONOISE */ - -} BSIM3v0instance ; - -struct bsim3v0SizeDependParam -{ - double Width; - double Length; - - double BSIM3v0cdsc; - double BSIM3v0cdscb; - double BSIM3v0cdscd; - double BSIM3v0cit; - double BSIM3v0nfactor; - double BSIM3v0xj; - double BSIM3v0vsat; - double BSIM3v0at; - double BSIM3v0a0; - double BSIM3v0ags; - double BSIM3v0a1; - double BSIM3v0a2; - double BSIM3v0keta; - double BSIM3v0nsub; - double BSIM3v0npeak; - double BSIM3v0ngate; - double BSIM3v0gamma1; - double BSIM3v0gamma2; - double BSIM3v0vbx; - double BSIM3v0vbi; - double BSIM3v0vbm; - double BSIM3v0vbsc; - double BSIM3v0xt; - double BSIM3v0phi; - double BSIM3v0litl; - double BSIM3v0k1; - double BSIM3v0kt1; - double BSIM3v0kt1l; - double BSIM3v0kt2; - double BSIM3v0k2; - double BSIM3v0k3; - double BSIM3v0k3b; - double BSIM3v0w0; - double BSIM3v0nlx; - double BSIM3v0dvt0; - double BSIM3v0dvt1; - double BSIM3v0dvt2; - double BSIM3v0dvt0w; - double BSIM3v0dvt1w; - double BSIM3v0dvt2w; - double BSIM3v0drout; - double BSIM3v0dsub; - double BSIM3v0vth0; - double BSIM3v0ua; - double BSIM3v0ua1; - double BSIM3v0ub; - double BSIM3v0ub1; - double BSIM3v0uc; - double BSIM3v0uc1; - double BSIM3v0u0; - double BSIM3v0ute; - double BSIM3v0voff; - double BSIM3v0vfb; - double BSIM3v0delta; - double BSIM3v0rdsw; - double BSIM3v0rds0; - double BSIM3v0prwg; - double BSIM3v0prwb; - double BSIM3v0prt; - double BSIM3v0eta0; - double BSIM3v0etab; - double BSIM3v0pclm; - double BSIM3v0pdibl1; - double BSIM3v0pdibl2; - double BSIM3v0pdiblb; - double BSIM3v0pscbe1; - double BSIM3v0pscbe2; - double BSIM3v0pvag; - double BSIM3v0wr; - double BSIM3v0dwg; - double BSIM3v0dwb; - double BSIM3v0b0; - double BSIM3v0b1; - double BSIM3v0alpha0; - double BSIM3v0beta0; - - - /* CV model */ - double BSIM3v0elm; - double BSIM3v0cgsl; - double BSIM3v0cgdl; - double BSIM3v0ckappa; - double BSIM3v0cf; - double BSIM3v0clc; - double BSIM3v0cle; - - -/* Pre-calculated constants */ - - double BSIM3v0dw; - double BSIM3v0dl; - double BSIM3v0leff; - double BSIM3v0weff; - - double BSIM3v0dwc; - double BSIM3v0dlc; - double BSIM3v0leffCV; - double BSIM3v0weffCV; - double BSIM3v0abulkCVfactor; - double BSIM3v0cgso; - double BSIM3v0cgdo; - double BSIM3v0cgbo; - - double BSIM3v0u0temp; - double BSIM3v0vsattemp; - double BSIM3v0sqrtPhi; - double BSIM3v0phis3; - double BSIM3v0Xdep0; - double BSIM3v0sqrtXdep0; - double BSIM3v0theta0vb0; - double BSIM3v0thetaRout; - - double BSIM3v0cof1; - double BSIM3v0cof2; - double BSIM3v0cof3; - double BSIM3v0cof4; - double BSIM3v0cdep0; - struct bsim3v0SizeDependParam *pNext; -}; - - -typedef struct sBSIM3v0model -{ - - struct GENmodel gen; - -#define BSIM3v0modType gen.GENmodType -#define BSIM3v0nextModel(inst) ((struct sBSIM3v0model *)((inst)->gen.GENnextModel)) -#define BSIM3v0instances(inst) ((BSIM3v0instance *)((inst)->gen.GENinstances)) -#define BSIM3v0modName gen.GENmodName - - int BSIM3v0type; - - int BSIM3v0mobMod; - int BSIM3v0capMod; - int BSIM3v0nqsMod; - int BSIM3v0noiMod; - int BSIM3v0binUnit; - double BSIM3v0tox; - double BSIM3v0cdsc; - double BSIM3v0cdscb; - double BSIM3v0cdscd; - double BSIM3v0cit; - double BSIM3v0nfactor; - double BSIM3v0xj; - double BSIM3v0vsat; - double BSIM3v0at; - double BSIM3v0a0; - double BSIM3v0ags; - double BSIM3v0a1; - double BSIM3v0a2; - double BSIM3v0keta; - double BSIM3v0nsub; - double BSIM3v0npeak; - double BSIM3v0ngate; - double BSIM3v0gamma1; - double BSIM3v0gamma2; - double BSIM3v0vbx; - double BSIM3v0vbm; - double BSIM3v0xt; - double BSIM3v0k1; - double BSIM3v0kt1; - double BSIM3v0kt1l; - double BSIM3v0kt2; - double BSIM3v0k2; - double BSIM3v0k3; - double BSIM3v0k3b; - double BSIM3v0w0; - double BSIM3v0nlx; - double BSIM3v0dvt0; - double BSIM3v0dvt1; - double BSIM3v0dvt2; - double BSIM3v0dvt0w; - double BSIM3v0dvt1w; - double BSIM3v0dvt2w; - double BSIM3v0drout; - double BSIM3v0dsub; - double BSIM3v0vth0; - double BSIM3v0ua; - double BSIM3v0ua1; - double BSIM3v0ub; - double BSIM3v0ub1; - double BSIM3v0uc; - double BSIM3v0uc1; - double BSIM3v0u0; - double BSIM3v0ute; - double BSIM3v0voff; - double BSIM3v0delta; - double BSIM3v0rdsw; - double BSIM3v0prwg; - double BSIM3v0prwb; - double BSIM3v0prt; - double BSIM3v0eta0; - double BSIM3v0etab; - double BSIM3v0pclm; - double BSIM3v0pdibl1; - double BSIM3v0pdibl2; - double BSIM3v0pdiblb; - double BSIM3v0pscbe1; - double BSIM3v0pscbe2; - double BSIM3v0pvag; - double BSIM3v0wr; - double BSIM3v0dwg; - double BSIM3v0dwb; - double BSIM3v0b0; - double BSIM3v0b1; - double BSIM3v0alpha0; - double BSIM3v0beta0; - - /* CV model */ - double BSIM3v0elm; - double BSIM3v0cgsl; - double BSIM3v0cgdl; - double BSIM3v0ckappa; - double BSIM3v0cf; - double BSIM3v0clc; - double BSIM3v0cle; - double BSIM3v0dwc; - double BSIM3v0dlc; - - /* Length Dependence */ - double BSIM3v0lcdsc; - double BSIM3v0lcdscb; - double BSIM3v0lcdscd; - double BSIM3v0lcit; - double BSIM3v0lnfactor; - double BSIM3v0lxj; - double BSIM3v0lvsat; - double BSIM3v0lat; - double BSIM3v0la0; - double BSIM3v0lags; - double BSIM3v0la1; - double BSIM3v0la2; - double BSIM3v0lketa; - double BSIM3v0lnsub; - double BSIM3v0lnpeak; - double BSIM3v0lngate; - double BSIM3v0lgamma1; - double BSIM3v0lgamma2; - double BSIM3v0lvbx; - double BSIM3v0lvbm; - double BSIM3v0lxt; - double BSIM3v0lk1; - double BSIM3v0lkt1; - double BSIM3v0lkt1l; - double BSIM3v0lkt2; - double BSIM3v0lk2; - double BSIM3v0lk3; - double BSIM3v0lk3b; - double BSIM3v0lw0; - double BSIM3v0lnlx; - double BSIM3v0ldvt0; - double BSIM3v0ldvt1; - double BSIM3v0ldvt2; - double BSIM3v0ldvt0w; - double BSIM3v0ldvt1w; - double BSIM3v0ldvt2w; - double BSIM3v0ldrout; - double BSIM3v0ldsub; - double BSIM3v0lvth0; - double BSIM3v0lua; - double BSIM3v0lua1; - double BSIM3v0lub; - double BSIM3v0lub1; - double BSIM3v0luc; - double BSIM3v0luc1; - double BSIM3v0lu0; - double BSIM3v0lute; - double BSIM3v0lvoff; - double BSIM3v0ldelta; - double BSIM3v0lrdsw; - double BSIM3v0lprwg; - double BSIM3v0lprwb; - double BSIM3v0lprt; - double BSIM3v0leta0; - double BSIM3v0letab; - double BSIM3v0lpclm; - double BSIM3v0lpdibl1; - double BSIM3v0lpdibl2; - double BSIM3v0lpdiblb; - double BSIM3v0lpscbe1; - double BSIM3v0lpscbe2; - double BSIM3v0lpvag; - double BSIM3v0lwr; - double BSIM3v0ldwg; - double BSIM3v0ldwb; - double BSIM3v0lb0; - double BSIM3v0lb1; - double BSIM3v0lalpha0; - double BSIM3v0lbeta0; - - /* CV model */ - double BSIM3v0lelm; - double BSIM3v0lcgsl; - double BSIM3v0lcgdl; - double BSIM3v0lckappa; - double BSIM3v0lcf; - double BSIM3v0lclc; - double BSIM3v0lcle; - - /* Width Dependence */ - double BSIM3v0wcdsc; - double BSIM3v0wcdscb; - double BSIM3v0wcdscd; - double BSIM3v0wcit; - double BSIM3v0wnfactor; - double BSIM3v0wxj; - double BSIM3v0wvsat; - double BSIM3v0wat; - double BSIM3v0wa0; - double BSIM3v0wags; - double BSIM3v0wa1; - double BSIM3v0wa2; - double BSIM3v0wketa; - double BSIM3v0wnsub; - double BSIM3v0wnpeak; - double BSIM3v0wngate; - double BSIM3v0wgamma1; - double BSIM3v0wgamma2; - double BSIM3v0wvbx; - double BSIM3v0wvbm; - double BSIM3v0wxt; - double BSIM3v0wk1; - double BSIM3v0wkt1; - double BSIM3v0wkt1l; - double BSIM3v0wkt2; - double BSIM3v0wk2; - double BSIM3v0wk3; - double BSIM3v0wk3b; - double BSIM3v0ww0; - double BSIM3v0wnlx; - double BSIM3v0wdvt0; - double BSIM3v0wdvt1; - double BSIM3v0wdvt2; - double BSIM3v0wdvt0w; - double BSIM3v0wdvt1w; - double BSIM3v0wdvt2w; - double BSIM3v0wdrout; - double BSIM3v0wdsub; - double BSIM3v0wvth0; - double BSIM3v0wua; - double BSIM3v0wua1; - double BSIM3v0wub; - double BSIM3v0wub1; - double BSIM3v0wuc; - double BSIM3v0wuc1; - double BSIM3v0wu0; - double BSIM3v0wute; - double BSIM3v0wvoff; - double BSIM3v0wdelta; - double BSIM3v0wrdsw; - double BSIM3v0wprwg; - double BSIM3v0wprwb; - double BSIM3v0wprt; - double BSIM3v0weta0; - double BSIM3v0wetab; - double BSIM3v0wpclm; - double BSIM3v0wpdibl1; - double BSIM3v0wpdibl2; - double BSIM3v0wpdiblb; - double BSIM3v0wpscbe1; - double BSIM3v0wpscbe2; - double BSIM3v0wpvag; - double BSIM3v0wwr; - double BSIM3v0wdwg; - double BSIM3v0wdwb; - double BSIM3v0wb0; - double BSIM3v0wb1; - double BSIM3v0walpha0; - double BSIM3v0wbeta0; - - /* CV model */ - double BSIM3v0welm; - double BSIM3v0wcgsl; - double BSIM3v0wcgdl; - double BSIM3v0wckappa; - double BSIM3v0wcf; - double BSIM3v0wclc; - double BSIM3v0wcle; - - /* Cross-term Dependence */ - double BSIM3v0pcdsc; - double BSIM3v0pcdscb; - double BSIM3v0pcdscd; - double BSIM3v0pcit; - double BSIM3v0pnfactor; - double BSIM3v0pxj; - double BSIM3v0pvsat; - double BSIM3v0pat; - double BSIM3v0pa0; - double BSIM3v0pags; - double BSIM3v0pa1; - double BSIM3v0pa2; - double BSIM3v0pketa; - double BSIM3v0pnsub; - double BSIM3v0pnpeak; - double BSIM3v0pngate; - double BSIM3v0pgamma1; - double BSIM3v0pgamma2; - double BSIM3v0pvbx; - double BSIM3v0pvbm; - double BSIM3v0pxt; - double BSIM3v0pk1; - double BSIM3v0pkt1; - double BSIM3v0pkt1l; - double BSIM3v0pkt2; - double BSIM3v0pk2; - double BSIM3v0pk3; - double BSIM3v0pk3b; - double BSIM3v0pw0; - double BSIM3v0pnlx; - double BSIM3v0pdvt0; - double BSIM3v0pdvt1; - double BSIM3v0pdvt2; - double BSIM3v0pdvt0w; - double BSIM3v0pdvt1w; - double BSIM3v0pdvt2w; - double BSIM3v0pdrout; - double BSIM3v0pdsub; - double BSIM3v0pvth0; - double BSIM3v0pua; - double BSIM3v0pua1; - double BSIM3v0pub; - double BSIM3v0pub1; - double BSIM3v0puc; - double BSIM3v0puc1; - double BSIM3v0pu0; - double BSIM3v0pute; - double BSIM3v0pvoff; - double BSIM3v0pdelta; - double BSIM3v0prdsw; - double BSIM3v0pprwg; - double BSIM3v0pprwb; - double BSIM3v0pprt; - double BSIM3v0peta0; - double BSIM3v0petab; - double BSIM3v0ppclm; - double BSIM3v0ppdibl1; - double BSIM3v0ppdibl2; - double BSIM3v0ppdiblb; - double BSIM3v0ppscbe1; - double BSIM3v0ppscbe2; - double BSIM3v0ppvag; - double BSIM3v0pwr; - double BSIM3v0pdwg; - double BSIM3v0pdwb; - double BSIM3v0pb0; - double BSIM3v0pb1; - double BSIM3v0palpha0; - double BSIM3v0pbeta0; - - /* CV model */ - double BSIM3v0pelm; - double BSIM3v0pcgsl; - double BSIM3v0pcgdl; - double BSIM3v0pckappa; - double BSIM3v0pcf; - double BSIM3v0pclc; - double BSIM3v0pcle; - - double BSIM3v0tnom; - double BSIM3v0cgso; - double BSIM3v0cgdo; - double BSIM3v0cgbo; - double BSIM3v0xpart; - double BSIM3v0cFringOut; - double BSIM3v0cFringMax; - - double BSIM3v0sheetResistance; - double BSIM3v0jctSatCurDensity; - double BSIM3v0bulkJctPotential; - double BSIM3v0bulkJctBotGradingCoeff; - double BSIM3v0bulkJctSideGradingCoeff; - double BSIM3v0sidewallJctPotential; - double BSIM3v0unitAreaJctCap; - double BSIM3v0unitLengthSidewallJctCap; - - double BSIM3v0Lint; - double BSIM3v0Ll; - double BSIM3v0Lln; - double BSIM3v0Lw; - double BSIM3v0Lwn; - double BSIM3v0Lwl; - double BSIM3v0Lmin; - double BSIM3v0Lmax; - - double BSIM3v0Wint; - double BSIM3v0Wl; - double BSIM3v0Wln; - double BSIM3v0Ww; - double BSIM3v0Wwn; - double BSIM3v0Wwl; - double BSIM3v0Wmin; - double BSIM3v0Wmax; - - -/* Pre-calculated constants */ - /* MCJ: move to size-dependent param. */ - double BSIM3v0vtm; - double BSIM3v0cox; - double BSIM3v0cof1; - double BSIM3v0cof2; - double BSIM3v0cof3; - double BSIM3v0cof4; - double BSIM3v0vcrit; - double BSIM3v0factor1; - - double BSIM3v0oxideTrapDensityA; - double BSIM3v0oxideTrapDensityB; - double BSIM3v0oxideTrapDensityC; - double BSIM3v0em; - double BSIM3v0ef; - double BSIM3v0af; - double BSIM3v0kf; - - struct bsim3v0SizeDependParam *pSizeDependParamKnot; - - /* Flags */ - unsigned BSIM3v0mobModGiven :1; - unsigned BSIM3v0binUnitGiven :1; - unsigned BSIM3v0capModGiven :1; - unsigned BSIM3v0nqsModGiven :1; - unsigned BSIM3v0noiModGiven :1; - unsigned BSIM3v0typeGiven :1; - unsigned BSIM3v0toxGiven :1; - - unsigned BSIM3v0cdscGiven :1; - unsigned BSIM3v0cdscbGiven :1; - unsigned BSIM3v0cdscdGiven :1; - unsigned BSIM3v0citGiven :1; - unsigned BSIM3v0nfactorGiven :1; - unsigned BSIM3v0xjGiven :1; - unsigned BSIM3v0vsatGiven :1; - unsigned BSIM3v0atGiven :1; - unsigned BSIM3v0a0Given :1; - unsigned BSIM3v0agsGiven :1; - unsigned BSIM3v0a1Given :1; - unsigned BSIM3v0a2Given :1; - unsigned BSIM3v0ketaGiven :1; - unsigned BSIM3v0nsubGiven :1; - unsigned BSIM3v0npeakGiven :1; - unsigned BSIM3v0ngateGiven :1; - unsigned BSIM3v0gamma1Given :1; - unsigned BSIM3v0gamma2Given :1; - unsigned BSIM3v0vbxGiven :1; - unsigned BSIM3v0vbmGiven :1; - unsigned BSIM3v0xtGiven :1; - unsigned BSIM3v0k1Given :1; - unsigned BSIM3v0kt1Given :1; - unsigned BSIM3v0kt1lGiven :1; - unsigned BSIM3v0kt2Given :1; - unsigned BSIM3v0k2Given :1; - unsigned BSIM3v0k3Given :1; - unsigned BSIM3v0k3bGiven :1; - unsigned BSIM3v0w0Given :1; - unsigned BSIM3v0nlxGiven :1; - unsigned BSIM3v0dvt0Given :1; - unsigned BSIM3v0dvt1Given :1; - unsigned BSIM3v0dvt2Given :1; - unsigned BSIM3v0dvt0wGiven :1; - unsigned BSIM3v0dvt1wGiven :1; - unsigned BSIM3v0dvt2wGiven :1; - unsigned BSIM3v0droutGiven :1; - unsigned BSIM3v0dsubGiven :1; - unsigned BSIM3v0vth0Given :1; - unsigned BSIM3v0uaGiven :1; - unsigned BSIM3v0ua1Given :1; - unsigned BSIM3v0ubGiven :1; - unsigned BSIM3v0ub1Given :1; - unsigned BSIM3v0ucGiven :1; - unsigned BSIM3v0uc1Given :1; - unsigned BSIM3v0u0Given :1; - unsigned BSIM3v0uteGiven :1; - unsigned BSIM3v0voffGiven :1; - unsigned BSIM3v0rdswGiven :1; - unsigned BSIM3v0prwgGiven :1; - unsigned BSIM3v0prwbGiven :1; - unsigned BSIM3v0prtGiven :1; - unsigned BSIM3v0eta0Given :1; - unsigned BSIM3v0etabGiven :1; - unsigned BSIM3v0pclmGiven :1; - unsigned BSIM3v0pdibl1Given :1; - unsigned BSIM3v0pdibl2Given :1; - unsigned BSIM3v0pdiblbGiven :1; - unsigned BSIM3v0pscbe1Given :1; - unsigned BSIM3v0pscbe2Given :1; - unsigned BSIM3v0pvagGiven :1; - unsigned BSIM3v0deltaGiven :1; - unsigned BSIM3v0wrGiven :1; - unsigned BSIM3v0dwgGiven :1; - unsigned BSIM3v0dwbGiven :1; - unsigned BSIM3v0b0Given :1; - unsigned BSIM3v0b1Given :1; - unsigned BSIM3v0alpha0Given :1; - unsigned BSIM3v0beta0Given :1; - - /* CV model */ - unsigned BSIM3v0elmGiven :1; - unsigned BSIM3v0cgslGiven :1; - unsigned BSIM3v0cgdlGiven :1; - unsigned BSIM3v0ckappaGiven :1; - unsigned BSIM3v0cfGiven :1; - unsigned BSIM3v0clcGiven :1; - unsigned BSIM3v0cleGiven :1; - unsigned BSIM3v0dwcGiven :1; - unsigned BSIM3v0dlcGiven :1; - - - /* Length dependence */ - unsigned BSIM3v0lcdscGiven :1; - unsigned BSIM3v0lcdscbGiven :1; - unsigned BSIM3v0lcdscdGiven :1; - unsigned BSIM3v0lcitGiven :1; - unsigned BSIM3v0lnfactorGiven :1; - unsigned BSIM3v0lxjGiven :1; - unsigned BSIM3v0lvsatGiven :1; - unsigned BSIM3v0latGiven :1; - unsigned BSIM3v0la0Given :1; - unsigned BSIM3v0lagsGiven :1; - unsigned BSIM3v0la1Given :1; - unsigned BSIM3v0la2Given :1; - unsigned BSIM3v0lketaGiven :1; - unsigned BSIM3v0lnsubGiven :1; - unsigned BSIM3v0lnpeakGiven :1; - unsigned BSIM3v0lngateGiven :1; - unsigned BSIM3v0lgamma1Given :1; - unsigned BSIM3v0lgamma2Given :1; - unsigned BSIM3v0lvbxGiven :1; - unsigned BSIM3v0lvbmGiven :1; - unsigned BSIM3v0lxtGiven :1; - unsigned BSIM3v0lk1Given :1; - unsigned BSIM3v0lkt1Given :1; - unsigned BSIM3v0lkt1lGiven :1; - unsigned BSIM3v0lkt2Given :1; - unsigned BSIM3v0lk2Given :1; - unsigned BSIM3v0lk3Given :1; - unsigned BSIM3v0lk3bGiven :1; - unsigned BSIM3v0lw0Given :1; - unsigned BSIM3v0lnlxGiven :1; - unsigned BSIM3v0ldvt0Given :1; - unsigned BSIM3v0ldvt1Given :1; - unsigned BSIM3v0ldvt2Given :1; - unsigned BSIM3v0ldvt0wGiven :1; - unsigned BSIM3v0ldvt1wGiven :1; - unsigned BSIM3v0ldvt2wGiven :1; - unsigned BSIM3v0ldroutGiven :1; - unsigned BSIM3v0ldsubGiven :1; - unsigned BSIM3v0lvth0Given :1; - unsigned BSIM3v0luaGiven :1; - unsigned BSIM3v0lua1Given :1; - unsigned BSIM3v0lubGiven :1; - unsigned BSIM3v0lub1Given :1; - unsigned BSIM3v0lucGiven :1; - unsigned BSIM3v0luc1Given :1; - unsigned BSIM3v0lu0Given :1; - unsigned BSIM3v0luteGiven :1; - unsigned BSIM3v0lvoffGiven :1; - unsigned BSIM3v0lrdswGiven :1; - unsigned BSIM3v0lprwgGiven :1; - unsigned BSIM3v0lprwbGiven :1; - unsigned BSIM3v0lprtGiven :1; - unsigned BSIM3v0leta0Given :1; - unsigned BSIM3v0letabGiven :1; - unsigned BSIM3v0lpclmGiven :1; - unsigned BSIM3v0lpdibl1Given :1; - unsigned BSIM3v0lpdibl2Given :1; - unsigned BSIM3v0lpdiblbGiven :1; - unsigned BSIM3v0lpscbe1Given :1; - unsigned BSIM3v0lpscbe2Given :1; - unsigned BSIM3v0lpvagGiven :1; - unsigned BSIM3v0ldeltaGiven :1; - unsigned BSIM3v0lwrGiven :1; - unsigned BSIM3v0ldwgGiven :1; - unsigned BSIM3v0ldwbGiven :1; - unsigned BSIM3v0lb0Given :1; - unsigned BSIM3v0lb1Given :1; - unsigned BSIM3v0lalpha0Given :1; - unsigned BSIM3v0lbeta0Given :1; - - /* CV model */ - unsigned BSIM3v0lelmGiven :1; - unsigned BSIM3v0lcgslGiven :1; - unsigned BSIM3v0lcgdlGiven :1; - unsigned BSIM3v0lckappaGiven :1; - unsigned BSIM3v0lcfGiven :1; - unsigned BSIM3v0lclcGiven :1; - unsigned BSIM3v0lcleGiven :1; - - /* Width dependence */ - unsigned BSIM3v0wcdscGiven :1; - unsigned BSIM3v0wcdscbGiven :1; - unsigned BSIM3v0wcdscdGiven :1; - unsigned BSIM3v0wcitGiven :1; - unsigned BSIM3v0wnfactorGiven :1; - unsigned BSIM3v0wxjGiven :1; - unsigned BSIM3v0wvsatGiven :1; - unsigned BSIM3v0watGiven :1; - unsigned BSIM3v0wa0Given :1; - unsigned BSIM3v0wagsGiven :1; - unsigned BSIM3v0wa1Given :1; - unsigned BSIM3v0wa2Given :1; - unsigned BSIM3v0wketaGiven :1; - unsigned BSIM3v0wnsubGiven :1; - unsigned BSIM3v0wnpeakGiven :1; - unsigned BSIM3v0wngateGiven :1; - unsigned BSIM3v0wgamma1Given :1; - unsigned BSIM3v0wgamma2Given :1; - unsigned BSIM3v0wvbxGiven :1; - unsigned BSIM3v0wvbmGiven :1; - unsigned BSIM3v0wxtGiven :1; - unsigned BSIM3v0wk1Given :1; - unsigned BSIM3v0wkt1Given :1; - unsigned BSIM3v0wkt1lGiven :1; - unsigned BSIM3v0wkt2Given :1; - unsigned BSIM3v0wk2Given :1; - unsigned BSIM3v0wk3Given :1; - unsigned BSIM3v0wk3bGiven :1; - unsigned BSIM3v0ww0Given :1; - unsigned BSIM3v0wnlxGiven :1; - unsigned BSIM3v0wdvt0Given :1; - unsigned BSIM3v0wdvt1Given :1; - unsigned BSIM3v0wdvt2Given :1; - unsigned BSIM3v0wdvt0wGiven :1; - unsigned BSIM3v0wdvt1wGiven :1; - unsigned BSIM3v0wdvt2wGiven :1; - unsigned BSIM3v0wdroutGiven :1; - unsigned BSIM3v0wdsubGiven :1; - unsigned BSIM3v0wvth0Given :1; - unsigned BSIM3v0wuaGiven :1; - unsigned BSIM3v0wua1Given :1; - unsigned BSIM3v0wubGiven :1; - unsigned BSIM3v0wub1Given :1; - unsigned BSIM3v0wucGiven :1; - unsigned BSIM3v0wuc1Given :1; - unsigned BSIM3v0wu0Given :1; - unsigned BSIM3v0wuteGiven :1; - unsigned BSIM3v0wvoffGiven :1; - unsigned BSIM3v0wrdswGiven :1; - unsigned BSIM3v0wprwgGiven :1; - unsigned BSIM3v0wprwbGiven :1; - unsigned BSIM3v0wprtGiven :1; - unsigned BSIM3v0weta0Given :1; - unsigned BSIM3v0wetabGiven :1; - unsigned BSIM3v0wpclmGiven :1; - unsigned BSIM3v0wpdibl1Given :1; - unsigned BSIM3v0wpdibl2Given :1; - unsigned BSIM3v0wpdiblbGiven :1; - unsigned BSIM3v0wpscbe1Given :1; - unsigned BSIM3v0wpscbe2Given :1; - unsigned BSIM3v0wpvagGiven :1; - unsigned BSIM3v0wdeltaGiven :1; - unsigned BSIM3v0wwrGiven :1; - unsigned BSIM3v0wdwgGiven :1; - unsigned BSIM3v0wdwbGiven :1; - unsigned BSIM3v0wb0Given :1; - unsigned BSIM3v0wb1Given :1; - unsigned BSIM3v0walpha0Given :1; - unsigned BSIM3v0wbeta0Given :1; - - /* CV model */ - unsigned BSIM3v0welmGiven :1; - unsigned BSIM3v0wcgslGiven :1; - unsigned BSIM3v0wcgdlGiven :1; - unsigned BSIM3v0wckappaGiven :1; - unsigned BSIM3v0wcfGiven :1; - unsigned BSIM3v0wclcGiven :1; - unsigned BSIM3v0wcleGiven :1; - - /* Cross-term dependence */ - unsigned BSIM3v0pcdscGiven :1; - unsigned BSIM3v0pcdscbGiven :1; - unsigned BSIM3v0pcdscdGiven :1; - unsigned BSIM3v0pcitGiven :1; - unsigned BSIM3v0pnfactorGiven :1; - unsigned BSIM3v0pxjGiven :1; - unsigned BSIM3v0pvsatGiven :1; - unsigned BSIM3v0patGiven :1; - unsigned BSIM3v0pa0Given :1; - unsigned BSIM3v0pagsGiven :1; - unsigned BSIM3v0pa1Given :1; - unsigned BSIM3v0pa2Given :1; - unsigned BSIM3v0pketaGiven :1; - unsigned BSIM3v0pnsubGiven :1; - unsigned BSIM3v0pnpeakGiven :1; - unsigned BSIM3v0pngateGiven :1; - unsigned BSIM3v0pgamma1Given :1; - unsigned BSIM3v0pgamma2Given :1; - unsigned BSIM3v0pvbxGiven :1; - unsigned BSIM3v0pvbmGiven :1; - unsigned BSIM3v0pxtGiven :1; - unsigned BSIM3v0pk1Given :1; - unsigned BSIM3v0pkt1Given :1; - unsigned BSIM3v0pkt1lGiven :1; - unsigned BSIM3v0pkt2Given :1; - unsigned BSIM3v0pk2Given :1; - unsigned BSIM3v0pk3Given :1; - unsigned BSIM3v0pk3bGiven :1; - unsigned BSIM3v0pw0Given :1; - unsigned BSIM3v0pnlxGiven :1; - unsigned BSIM3v0pdvt0Given :1; - unsigned BSIM3v0pdvt1Given :1; - unsigned BSIM3v0pdvt2Given :1; - unsigned BSIM3v0pdvt0wGiven :1; - unsigned BSIM3v0pdvt1wGiven :1; - unsigned BSIM3v0pdvt2wGiven :1; - unsigned BSIM3v0pdroutGiven :1; - unsigned BSIM3v0pdsubGiven :1; - unsigned BSIM3v0pvth0Given :1; - unsigned BSIM3v0puaGiven :1; - unsigned BSIM3v0pua1Given :1; - unsigned BSIM3v0pubGiven :1; - unsigned BSIM3v0pub1Given :1; - unsigned BSIM3v0pucGiven :1; - unsigned BSIM3v0puc1Given :1; - unsigned BSIM3v0pu0Given :1; - unsigned BSIM3v0puteGiven :1; - unsigned BSIM3v0pvoffGiven :1; - unsigned BSIM3v0prdswGiven :1; - unsigned BSIM3v0pprwgGiven :1; - unsigned BSIM3v0pprwbGiven :1; - unsigned BSIM3v0pprtGiven :1; - unsigned BSIM3v0peta0Given :1; - unsigned BSIM3v0petabGiven :1; - unsigned BSIM3v0ppclmGiven :1; - unsigned BSIM3v0ppdibl1Given :1; - unsigned BSIM3v0ppdibl2Given :1; - unsigned BSIM3v0ppdiblbGiven :1; - unsigned BSIM3v0ppscbe1Given :1; - unsigned BSIM3v0ppscbe2Given :1; - unsigned BSIM3v0ppvagGiven :1; - unsigned BSIM3v0pdeltaGiven :1; - unsigned BSIM3v0pwrGiven :1; - unsigned BSIM3v0pdwgGiven :1; - unsigned BSIM3v0pdwbGiven :1; - unsigned BSIM3v0pb0Given :1; - unsigned BSIM3v0pb1Given :1; - unsigned BSIM3v0palpha0Given :1; - unsigned BSIM3v0pbeta0Given :1; - - /* CV model */ - unsigned BSIM3v0pelmGiven :1; - unsigned BSIM3v0pcgslGiven :1; - unsigned BSIM3v0pcgdlGiven :1; - unsigned BSIM3v0pckappaGiven :1; - unsigned BSIM3v0pcfGiven :1; - unsigned BSIM3v0pclcGiven :1; - unsigned BSIM3v0pcleGiven :1; - - unsigned BSIM3v0useFringeGiven :1; - - unsigned BSIM3v0tnomGiven :1; - unsigned BSIM3v0cgsoGiven :1; - unsigned BSIM3v0cgdoGiven :1; - unsigned BSIM3v0cgboGiven :1; - unsigned BSIM3v0xpartGiven :1; - unsigned BSIM3v0sheetResistanceGiven :1; - unsigned BSIM3v0jctSatCurDensityGiven :1; - unsigned BSIM3v0bulkJctPotentialGiven :1; - unsigned BSIM3v0bulkJctBotGradingCoeffGiven :1; - unsigned BSIM3v0sidewallJctPotentialGiven :1; - unsigned BSIM3v0bulkJctSideGradingCoeffGiven :1; - unsigned BSIM3v0unitAreaJctCapGiven :1; - unsigned BSIM3v0unitLengthSidewallJctCapGiven :1; - - unsigned BSIM3v0oxideTrapDensityAGiven :1; - unsigned BSIM3v0oxideTrapDensityBGiven :1; - unsigned BSIM3v0oxideTrapDensityCGiven :1; - unsigned BSIM3v0emGiven :1; - unsigned BSIM3v0efGiven :1; - unsigned BSIM3v0afGiven :1; - unsigned BSIM3v0kfGiven :1; - - unsigned BSIM3v0LintGiven :1; - unsigned BSIM3v0LlGiven :1; - unsigned BSIM3v0LlnGiven :1; - unsigned BSIM3v0LwGiven :1; - unsigned BSIM3v0LwnGiven :1; - unsigned BSIM3v0LwlGiven :1; - unsigned BSIM3v0LminGiven :1; - unsigned BSIM3v0LmaxGiven :1; - - unsigned BSIM3v0WintGiven :1; - unsigned BSIM3v0WlGiven :1; - unsigned BSIM3v0WlnGiven :1; - unsigned BSIM3v0WwGiven :1; - unsigned BSIM3v0WwnGiven :1; - unsigned BSIM3v0WwlGiven :1; - unsigned BSIM3v0WminGiven :1; - unsigned BSIM3v0WmaxGiven :1; - -} BSIM3v0model; - - -#ifndef NMOS -#define NMOS 1 -#define PMOS -1 -#endif /*NMOS*/ - - -/* device parameters */ -#define BSIM3v0_W 1 -#define BSIM3v0_L 2 -#define BSIM3v0_M 15 -#define BSIM3v0_AS 3 -#define BSIM3v0_AD 4 -#define BSIM3v0_PS 5 -#define BSIM3v0_PD 6 -#define BSIM3v0_NRS 7 -#define BSIM3v0_NRD 8 -#define BSIM3v0_OFF 9 -#define BSIM3v0_IC_VBS 10 -#define BSIM3v0_IC_VDS 11 -#define BSIM3v0_IC_VGS 12 -#define BSIM3v0_IC 13 -#define BSIM3v0_NQSMOD 14 - -/* model parameters */ -#define BSIM3v0_MOD_CAPMOD 101 -#define BSIM3v0_MOD_NQSMOD 102 -#define BSIM3v0_MOD_MOBMOD 103 -#define BSIM3v0_MOD_NOIMOD 104 - -#define BSIM3v0_MOD_TOX 105 - -#define BSIM3v0_MOD_CDSC 106 -#define BSIM3v0_MOD_CDSCB 107 -#define BSIM3v0_MOD_CIT 108 -#define BSIM3v0_MOD_NFACTOR 109 -#define BSIM3v0_MOD_XJ 110 -#define BSIM3v0_MOD_VSAT 111 -#define BSIM3v0_MOD_AT 112 -#define BSIM3v0_MOD_A0 113 -#define BSIM3v0_MOD_A1 114 -#define BSIM3v0_MOD_A2 115 -#define BSIM3v0_MOD_KETA 116 -#define BSIM3v0_MOD_NSUB 117 -#define BSIM3v0_MOD_NPEAK 118 -#define BSIM3v0_MOD_NGATE 120 -#define BSIM3v0_MOD_GAMMA1 121 -#define BSIM3v0_MOD_GAMMA2 122 -#define BSIM3v0_MOD_VBX 123 -#define BSIM3v0_MOD_BINUNIT 124 - -#define BSIM3v0_MOD_VBM 125 - -#define BSIM3v0_MOD_XT 126 -#define BSIM3v0_MOD_K1 129 -#define BSIM3v0_MOD_KT1 130 -#define BSIM3v0_MOD_KT1L 131 -#define BSIM3v0_MOD_K2 132 -#define BSIM3v0_MOD_KT2 133 -#define BSIM3v0_MOD_K3 134 -#define BSIM3v0_MOD_K3B 135 -#define BSIM3v0_MOD_W0 136 -#define BSIM3v0_MOD_NLX 137 - -#define BSIM3v0_MOD_DVT0 138 -#define BSIM3v0_MOD_DVT1 139 -#define BSIM3v0_MOD_DVT2 140 - -#define BSIM3v0_MOD_DVT0W 141 -#define BSIM3v0_MOD_DVT1W 142 -#define BSIM3v0_MOD_DVT2W 143 - -#define BSIM3v0_MOD_DROUT 144 -#define BSIM3v0_MOD_DSUB 145 -#define BSIM3v0_MOD_VTH0 146 -#define BSIM3v0_MOD_UA 147 -#define BSIM3v0_MOD_UA1 148 -#define BSIM3v0_MOD_UB 149 -#define BSIM3v0_MOD_UB1 150 -#define BSIM3v0_MOD_UC 151 -#define BSIM3v0_MOD_UC1 152 -#define BSIM3v0_MOD_U0 153 -#define BSIM3v0_MOD_UTE 154 -#define BSIM3v0_MOD_VOFF 155 -#define BSIM3v0_MOD_DELTA 156 -#define BSIM3v0_MOD_RDSW 157 -#define BSIM3v0_MOD_PRT 158 -#define BSIM3v0_MOD_LDD 159 -#define BSIM3v0_MOD_ETA 160 -#define BSIM3v0_MOD_ETA0 161 -#define BSIM3v0_MOD_ETAB 162 -#define BSIM3v0_MOD_PCLM 163 -#define BSIM3v0_MOD_PDIBL1 164 -#define BSIM3v0_MOD_PDIBL2 165 -#define BSIM3v0_MOD_PSCBE1 166 -#define BSIM3v0_MOD_PSCBE2 167 -#define BSIM3v0_MOD_PVAG 168 -#define BSIM3v0_MOD_WR 169 -#define BSIM3v0_MOD_DWG 170 -#define BSIM3v0_MOD_DWB 171 -#define BSIM3v0_MOD_B0 172 -#define BSIM3v0_MOD_B1 173 -#define BSIM3v0_MOD_ALPHA0 174 -#define BSIM3v0_MOD_BETA0 175 -#define BSIM3v0_MOD_PDIBLB 178 - -#define BSIM3v0_MOD_PRWG 179 -#define BSIM3v0_MOD_PRWB 180 - -#define BSIM3v0_MOD_CDSCD 181 -#define BSIM3v0_MOD_AGS 182 - -#define BSIM3v0_MOD_FRINGE 184 -#define BSIM3v0_MOD_ELM 185 -#define BSIM3v0_MOD_CGSL 186 -#define BSIM3v0_MOD_CGDL 187 -#define BSIM3v0_MOD_CKAPPA 188 -#define BSIM3v0_MOD_CF 189 -#define BSIM3v0_MOD_CLC 190 -#define BSIM3v0_MOD_CLE 191 - -/* Length dependence */ -#define BSIM3v0_MOD_LCDSC 201 -#define BSIM3v0_MOD_LCDSCB 202 -#define BSIM3v0_MOD_LCIT 203 -#define BSIM3v0_MOD_LNFACTOR 204 -#define BSIM3v0_MOD_LXJ 205 -#define BSIM3v0_MOD_LVSAT 206 -#define BSIM3v0_MOD_LAT 207 -#define BSIM3v0_MOD_LA0 208 -#define BSIM3v0_MOD_LA1 209 -#define BSIM3v0_MOD_LA2 210 -#define BSIM3v0_MOD_LKETA 211 -#define BSIM3v0_MOD_LNSUB 212 -#define BSIM3v0_MOD_LNPEAK 213 -#define BSIM3v0_MOD_LNGATE 215 -#define BSIM3v0_MOD_LGAMMA1 216 -#define BSIM3v0_MOD_LGAMMA2 217 -#define BSIM3v0_MOD_LVBX 218 - -#define BSIM3v0_MOD_LVBM 220 - -#define BSIM3v0_MOD_LXT 222 -#define BSIM3v0_MOD_LK1 225 -#define BSIM3v0_MOD_LKT1 226 -#define BSIM3v0_MOD_LKT1L 227 -#define BSIM3v0_MOD_LK2 228 -#define BSIM3v0_MOD_LKT2 229 -#define BSIM3v0_MOD_LK3 230 -#define BSIM3v0_MOD_LK3B 231 -#define BSIM3v0_MOD_LW0 232 -#define BSIM3v0_MOD_LNLX 233 - -#define BSIM3v0_MOD_LDVT0 234 -#define BSIM3v0_MOD_LDVT1 235 -#define BSIM3v0_MOD_LDVT2 236 - -#define BSIM3v0_MOD_LDVT0W 237 -#define BSIM3v0_MOD_LDVT1W 238 -#define BSIM3v0_MOD_LDVT2W 239 - -#define BSIM3v0_MOD_LDROUT 240 -#define BSIM3v0_MOD_LDSUB 241 -#define BSIM3v0_MOD_LVTH0 242 -#define BSIM3v0_MOD_LUA 243 -#define BSIM3v0_MOD_LUA1 244 -#define BSIM3v0_MOD_LUB 245 -#define BSIM3v0_MOD_LUB1 246 -#define BSIM3v0_MOD_LUC 247 -#define BSIM3v0_MOD_LUC1 248 -#define BSIM3v0_MOD_LU0 249 -#define BSIM3v0_MOD_LUTE 250 -#define BSIM3v0_MOD_LVOFF 251 -#define BSIM3v0_MOD_LDELTA 252 -#define BSIM3v0_MOD_LRDSW 253 -#define BSIM3v0_MOD_LPRT 254 -#define BSIM3v0_MOD_LLDD 255 -#define BSIM3v0_MOD_LETA 256 -#define BSIM3v0_MOD_LETA0 257 -#define BSIM3v0_MOD_LETAB 258 -#define BSIM3v0_MOD_LPCLM 259 -#define BSIM3v0_MOD_LPDIBL1 260 -#define BSIM3v0_MOD_LPDIBL2 261 -#define BSIM3v0_MOD_LPSCBE1 262 -#define BSIM3v0_MOD_LPSCBE2 263 -#define BSIM3v0_MOD_LPVAG 264 -#define BSIM3v0_MOD_LWR 265 -#define BSIM3v0_MOD_LDWG 266 -#define BSIM3v0_MOD_LDWB 267 -#define BSIM3v0_MOD_LB0 268 -#define BSIM3v0_MOD_LB1 269 -#define BSIM3v0_MOD_LALPHA0 270 -#define BSIM3v0_MOD_LBETA0 271 -#define BSIM3v0_MOD_LPDIBLB 274 - -#define BSIM3v0_MOD_LPRWG 275 -#define BSIM3v0_MOD_LPRWB 276 - -#define BSIM3v0_MOD_LCDSCD 277 -#define BSIM3v0_MOD_LAGS 278 - - -#define BSIM3v0_MOD_LFRINGE 281 -#define BSIM3v0_MOD_LELM 282 -#define BSIM3v0_MOD_LCGSL 283 -#define BSIM3v0_MOD_LCGDL 284 -#define BSIM3v0_MOD_LCKAPPA 285 -#define BSIM3v0_MOD_LCF 286 -#define BSIM3v0_MOD_LCLC 287 -#define BSIM3v0_MOD_LCLE 288 - -/* Width dependence */ -#define BSIM3v0_MOD_WCDSC 301 -#define BSIM3v0_MOD_WCDSCB 302 -#define BSIM3v0_MOD_WCIT 303 -#define BSIM3v0_MOD_WNFACTOR 304 -#define BSIM3v0_MOD_WXJ 305 -#define BSIM3v0_MOD_WVSAT 306 -#define BSIM3v0_MOD_WAT 307 -#define BSIM3v0_MOD_WA0 308 -#define BSIM3v0_MOD_WA1 309 -#define BSIM3v0_MOD_WA2 310 -#define BSIM3v0_MOD_WKETA 311 -#define BSIM3v0_MOD_WNSUB 312 -#define BSIM3v0_MOD_WNPEAK 313 -#define BSIM3v0_MOD_WNGATE 315 -#define BSIM3v0_MOD_WGAMMA1 316 -#define BSIM3v0_MOD_WGAMMA2 317 -#define BSIM3v0_MOD_WVBX 318 - -#define BSIM3v0_MOD_WVBM 320 - -#define BSIM3v0_MOD_WXT 322 -#define BSIM3v0_MOD_WK1 325 -#define BSIM3v0_MOD_WKT1 326 -#define BSIM3v0_MOD_WKT1L 327 -#define BSIM3v0_MOD_WK2 328 -#define BSIM3v0_MOD_WKT2 329 -#define BSIM3v0_MOD_WK3 330 -#define BSIM3v0_MOD_WK3B 331 -#define BSIM3v0_MOD_WW0 332 -#define BSIM3v0_MOD_WNLX 333 - -#define BSIM3v0_MOD_WDVT0 334 -#define BSIM3v0_MOD_WDVT1 335 -#define BSIM3v0_MOD_WDVT2 336 - -#define BSIM3v0_MOD_WDVT0W 337 -#define BSIM3v0_MOD_WDVT1W 338 -#define BSIM3v0_MOD_WDVT2W 339 - -#define BSIM3v0_MOD_WDROUT 340 -#define BSIM3v0_MOD_WDSUB 341 -#define BSIM3v0_MOD_WVTH0 342 -#define BSIM3v0_MOD_WUA 343 -#define BSIM3v0_MOD_WUA1 344 -#define BSIM3v0_MOD_WUB 345 -#define BSIM3v0_MOD_WUB1 346 -#define BSIM3v0_MOD_WUC 347 -#define BSIM3v0_MOD_WUC1 348 -#define BSIM3v0_MOD_WU0 349 -#define BSIM3v0_MOD_WUTE 350 -#define BSIM3v0_MOD_WVOFF 351 -#define BSIM3v0_MOD_WDELTA 352 -#define BSIM3v0_MOD_WRDSW 353 -#define BSIM3v0_MOD_WPRT 354 -#define BSIM3v0_MOD_WLDD 355 -#define BSIM3v0_MOD_WETA 356 -#define BSIM3v0_MOD_WETA0 357 -#define BSIM3v0_MOD_WETAB 358 -#define BSIM3v0_MOD_WPCLM 359 -#define BSIM3v0_MOD_WPDIBL1 360 -#define BSIM3v0_MOD_WPDIBL2 361 -#define BSIM3v0_MOD_WPSCBE1 362 -#define BSIM3v0_MOD_WPSCBE2 363 -#define BSIM3v0_MOD_WPVAG 364 -#define BSIM3v0_MOD_WWR 365 -#define BSIM3v0_MOD_WDWG 366 -#define BSIM3v0_MOD_WDWB 367 -#define BSIM3v0_MOD_WB0 368 -#define BSIM3v0_MOD_WB1 369 -#define BSIM3v0_MOD_WALPHA0 370 -#define BSIM3v0_MOD_WBETA0 371 -#define BSIM3v0_MOD_WPDIBLB 374 - -#define BSIM3v0_MOD_WPRWG 375 -#define BSIM3v0_MOD_WPRWB 376 - -#define BSIM3v0_MOD_WCDSCD 377 -#define BSIM3v0_MOD_WAGS 378 - - -#define BSIM3v0_MOD_WFRINGE 381 -#define BSIM3v0_MOD_WELM 382 -#define BSIM3v0_MOD_WCGSL 383 -#define BSIM3v0_MOD_WCGDL 384 -#define BSIM3v0_MOD_WCKAPPA 385 -#define BSIM3v0_MOD_WCF 386 -#define BSIM3v0_MOD_WCLC 387 -#define BSIM3v0_MOD_WCLE 388 - -/* Cross-term dependence */ -#define BSIM3v0_MOD_PCDSC 401 -#define BSIM3v0_MOD_PCDSCB 402 -#define BSIM3v0_MOD_PCIT 403 -#define BSIM3v0_MOD_PNFACTOR 404 -#define BSIM3v0_MOD_PXJ 405 -#define BSIM3v0_MOD_PVSAT 406 -#define BSIM3v0_MOD_PAT 407 -#define BSIM3v0_MOD_PA0 408 -#define BSIM3v0_MOD_PA1 409 -#define BSIM3v0_MOD_PA2 410 -#define BSIM3v0_MOD_PKETA 411 -#define BSIM3v0_MOD_PNSUB 412 -#define BSIM3v0_MOD_PNPEAK 413 -#define BSIM3v0_MOD_PNGATE 415 -#define BSIM3v0_MOD_PGAMMA1 416 -#define BSIM3v0_MOD_PGAMMA2 417 -#define BSIM3v0_MOD_PVBX 418 - -#define BSIM3v0_MOD_PVBM 420 - -#define BSIM3v0_MOD_PXT 422 -#define BSIM3v0_MOD_PK1 425 -#define BSIM3v0_MOD_PKT1 426 -#define BSIM3v0_MOD_PKT1L 427 -#define BSIM3v0_MOD_PK2 428 -#define BSIM3v0_MOD_PKT2 429 -#define BSIM3v0_MOD_PK3 430 -#define BSIM3v0_MOD_PK3B 431 -#define BSIM3v0_MOD_PW0 432 -#define BSIM3v0_MOD_PNLX 433 - -#define BSIM3v0_MOD_PDVT0 434 -#define BSIM3v0_MOD_PDVT1 435 -#define BSIM3v0_MOD_PDVT2 436 - -#define BSIM3v0_MOD_PDVT0W 437 -#define BSIM3v0_MOD_PDVT1W 438 -#define BSIM3v0_MOD_PDVT2W 439 - -#define BSIM3v0_MOD_PDROUT 440 -#define BSIM3v0_MOD_PDSUB 441 -#define BSIM3v0_MOD_PVTH0 442 -#define BSIM3v0_MOD_PUA 443 -#define BSIM3v0_MOD_PUA1 444 -#define BSIM3v0_MOD_PUB 445 -#define BSIM3v0_MOD_PUB1 446 -#define BSIM3v0_MOD_PUC 447 -#define BSIM3v0_MOD_PUC1 448 -#define BSIM3v0_MOD_PU0 449 -#define BSIM3v0_MOD_PUTE 450 -#define BSIM3v0_MOD_PVOFF 451 -#define BSIM3v0_MOD_PDELTA 452 -#define BSIM3v0_MOD_PRDSW 453 -#define BSIM3v0_MOD_PPRT 454 -#define BSIM3v0_MOD_PLDD 455 -#define BSIM3v0_MOD_PETA 456 -#define BSIM3v0_MOD_PETA0 457 -#define BSIM3v0_MOD_PETAB 458 -#define BSIM3v0_MOD_PPCLM 459 -#define BSIM3v0_MOD_PPDIBL1 460 -#define BSIM3v0_MOD_PPDIBL2 461 -#define BSIM3v0_MOD_PPSCBE1 462 -#define BSIM3v0_MOD_PPSCBE2 463 -#define BSIM3v0_MOD_PPVAG 464 -#define BSIM3v0_MOD_PWR 465 -#define BSIM3v0_MOD_PDWG 466 -#define BSIM3v0_MOD_PDWB 467 -#define BSIM3v0_MOD_PB0 468 -#define BSIM3v0_MOD_PB1 469 -#define BSIM3v0_MOD_PALPHA0 470 -#define BSIM3v0_MOD_PBETA0 471 -#define BSIM3v0_MOD_PPDIBLB 474 - -#define BSIM3v0_MOD_PPRWG 475 -#define BSIM3v0_MOD_PPRWB 476 - -#define BSIM3v0_MOD_PCDSCD 477 -#define BSIM3v0_MOD_PAGS 478 - -#define BSIM3v0_MOD_PFRINGE 481 -#define BSIM3v0_MOD_PELM 482 -#define BSIM3v0_MOD_PCGSL 483 -#define BSIM3v0_MOD_PCGDL 484 -#define BSIM3v0_MOD_PCKAPPA 485 -#define BSIM3v0_MOD_PCF 486 -#define BSIM3v0_MOD_PCLC 487 -#define BSIM3v0_MOD_PCLE 488 - -#define BSIM3v0_MOD_TNOM 501 -#define BSIM3v0_MOD_CGSO 502 -#define BSIM3v0_MOD_CGDO 503 -#define BSIM3v0_MOD_CGBO 504 -#define BSIM3v0_MOD_XPART 505 - -#define BSIM3v0_MOD_RSH 506 -#define BSIM3v0_MOD_JS 507 -#define BSIM3v0_MOD_PB 508 -#define BSIM3v0_MOD_MJ 509 -#define BSIM3v0_MOD_PBSW 510 -#define BSIM3v0_MOD_MJSW 511 -#define BSIM3v0_MOD_CJ 512 -#define BSIM3v0_MOD_CJSW 513 -#define BSIM3v0_MOD_NMOS 514 -#define BSIM3v0_MOD_PMOS 515 - -#define BSIM3v0_MOD_NOIA 516 -#define BSIM3v0_MOD_NOIB 517 -#define BSIM3v0_MOD_NOIC 518 - -#define BSIM3v0_MOD_LINT 519 -#define BSIM3v0_MOD_LL 520 -#define BSIM3v0_MOD_LLN 521 -#define BSIM3v0_MOD_LW 522 -#define BSIM3v0_MOD_LWN 523 -#define BSIM3v0_MOD_LWL 524 -#define BSIM3v0_MOD_LMIN 525 -#define BSIM3v0_MOD_LMAX 526 - -#define BSIM3v0_MOD_WINT 527 -#define BSIM3v0_MOD_WL 528 -#define BSIM3v0_MOD_WLN 529 -#define BSIM3v0_MOD_WW 530 -#define BSIM3v0_MOD_WWN 531 -#define BSIM3v0_MOD_WWL 532 -#define BSIM3v0_MOD_WMIN 533 -#define BSIM3v0_MOD_WMAX 534 - -#define BSIM3v0_MOD_DWC 535 -#define BSIM3v0_MOD_DLC 536 - -#define BSIM3v0_MOD_EM 537 -#define BSIM3v0_MOD_EF 538 -#define BSIM3v0_MOD_AF 539 -#define BSIM3v0_MOD_KF 540 - - -/* device questions */ -#define BSIM3v0_DNODE 601 -#define BSIM3v0_GNODE 602 -#define BSIM3v0_SNODE 603 -#define BSIM3v0_BNODE 604 -#define BSIM3v0_DNODEPRIME 605 -#define BSIM3v0_SNODEPRIME 606 -#define BSIM3v0_VBD 607 -#define BSIM3v0_VBS 608 -#define BSIM3v0_VGS 609 -#define BSIM3v0_VDS 610 -#define BSIM3v0_CD 611 -#define BSIM3v0_CBS 612 -#define BSIM3v0_CBD 613 -#define BSIM3v0_GM 614 -#define BSIM3v0_GDS 615 -#define BSIM3v0_GMBS 616 -#define BSIM3v0_GBD 617 -#define BSIM3v0_GBS 618 -#define BSIM3v0_QB 619 -#define BSIM3v0_CQB 620 -#define BSIM3v0_QG 621 -#define BSIM3v0_CQG 622 -#define BSIM3v0_QD 623 -#define BSIM3v0_CQD 624 -#define BSIM3v0_CGG 625 -#define BSIM3v0_CGD 626 -#define BSIM3v0_CGS 627 -#define BSIM3v0_CBG 628 -#define BSIM3v0_CAPBD 629 -#define BSIM3v0_CQBD 630 -#define BSIM3v0_CAPBS 631 -#define BSIM3v0_CQBS 632 -#define BSIM3v0_CDG 633 -#define BSIM3v0_CDD 634 -#define BSIM3v0_CDS 635 -#define BSIM3v0_VON 636 -#define BSIM3v0_VDSAT 637 -#define BSIM3v0_QBS 638 -#define BSIM3v0_QBD 639 -#define BSIM3v0_SOURCECONDUCT 640 -#define BSIM3v0_DRAINCONDUCT 641 -#define BSIM3v0_CBDB 642 -#define BSIM3v0_CBSB 643 - -#include "bsim3v0ext.h" - -extern void BSIM3v0evaluate(double,double,double,BSIM3v0instance*,BSIM3v0model*, - double*,double*,double*, double*, double*, double*, double*, - double*, double*, double*, double*, double*, double*, double*, - double*, double*, double*, double*, CKTcircuit*); - -#endif /*BSIM3v0*/ - - - diff --git a/src/spicelib/devices/bsim3v0/bsim3v0ext.h b/src/spicelib/devices/bsim3v0/bsim3v0ext.h deleted file mode 100644 index 5d011e557..000000000 --- a/src/spicelib/devices/bsim3v0/bsim3v0ext.h +++ /dev/null @@ -1,27 +0,0 @@ -/********** -Copyright 1990 Regents of the University of California. All rights reserved. -Author: 1991 JianHui Huang and Min-Chie Jeng. -File: bsim3v0ext.h -**********/ - -extern int BSIM3v0acLoad(GENmodel *,CKTcircuit*); -extern int BSIM3v0ask(CKTcircuit *,GENinstance*,int,IFvalue*,IFvalue*); -extern int BSIM3v0convTest(GENmodel *,CKTcircuit*); -extern int BSIM3v0getic(GENmodel*,CKTcircuit*); -extern int BSIM3v0load(GENmodel*,CKTcircuit*); -extern int BSIM3v0mAsk(CKTcircuit*,GENmodel *,int, IFvalue*); -extern int BSIM3v0mParam(int,IFvalue*,GENmodel*); -extern void BSIM3v0mosCap(CKTcircuit*, double, double, double, double, - double, double, double, double, double, double, double, - double, double, double, double, double, double, double*, - double*, double*, double*, double*, double*, double*, double*, - double*, double*, double*, double*, double*, double*, double*, - double*); -extern int BSIM3v0param(int,IFvalue*,GENinstance*,IFvalue*); -extern int BSIM3v0pzLoad(GENmodel*,CKTcircuit*,SPcomplex*); -extern int BSIM3v0setup(SMPmatrix*,GENmodel*,CKTcircuit*,int*); -extern int BSIM3v0temp(GENmodel*,CKTcircuit*); -extern int BSIM3v0trunc(GENmodel*,CKTcircuit*,double*); -extern int BSIM3v0noise(int,int,GENmodel*,CKTcircuit*,Ndata*,double*); -extern int BSIM3v0unsetup(GENmodel *, CKTcircuit *); - diff --git a/src/spicelib/devices/bsim3v0/bsim3v0init.c b/src/spicelib/devices/bsim3v0/bsim3v0init.c deleted file mode 100644 index 54eba2633..000000000 --- a/src/spicelib/devices/bsim3v0/bsim3v0init.c +++ /dev/null @@ -1,75 +0,0 @@ -#include "ngspice/config.h" - -#include "ngspice/devdefs.h" - -#include "bsim3v0itf.h" -#include "bsim3v0ext.h" -#include "bsim3v0init.h" - -SPICEdev B3v0info = { - .DEVpublic = { - .name = "BSIM3v0", - .description = "Berkeley Short Channel IGFET Model Version-3 (3.0)", - .terms = &BSIM3v0nSize, - .numNames = &BSIM3v0nSize, - .termNames = BSIM3v0names, - .numInstanceParms = &BSIM3v0pTSize, - .instanceParms = BSIM3v0pTable, - .numModelParms = &BSIM3v0mPTSize, - .modelParms = BSIM3v0mPTable, - .flags = DEV_DEFAULT, - -#ifdef XSPICE - .cm_func = NULL, - .num_conn = 0, - .conn = NULL, - .num_param = 0, - .param = NULL, - .num_inst_var = 0, - .inst_var = NULL, -#endif - }, - - .DEVparam = BSIM3v0param, - .DEVmodParam = BSIM3v0mParam, - .DEVload = BSIM3v0load, - .DEVsetup = BSIM3v0setup, - .DEVunsetup = BSIM3v0unsetup, - .DEVpzSetup = BSIM3v0setup, - .DEVtemperature = BSIM3v0temp, - .DEVtrunc = BSIM3v0trunc, - .DEVfindBranch = NULL, - .DEVacLoad = BSIM3v0acLoad, - .DEVaccept = NULL, - .DEVdestroy = NULL, - .DEVmodDelete = NULL, - .DEVdelete = NULL, - .DEVsetic = BSIM3v0getic, - .DEVask = BSIM3v0ask, - .DEVmodAsk = BSIM3v0mAsk, - .DEVpzLoad = BSIM3v0pzLoad, - .DEVconvTest = BSIM3v0convTest, - .DEVsenSetup = NULL, - .DEVsenLoad = NULL, - .DEVsenUpdate = NULL, - .DEVsenAcLoad = NULL, - .DEVsenPrint = NULL, - .DEVsenTrunc = NULL, - .DEVdisto = NULL, - .DEVnoise = BSIM3v0noise, - .DEVsoaCheck = NULL, - .DEVinstSize = &BSIM3v0iSize, - .DEVmodSize = &BSIM3v0mSize, - -#ifdef CIDER - .DEVdump = NULL, - .DEVacct = NULL, -#endif -}; - - -SPICEdev * -get_bsim3v0_info(void) -{ - return &B3v0info; -} diff --git a/src/spicelib/devices/bsim3v0/bsim3v0init.h b/src/spicelib/devices/bsim3v0/bsim3v0init.h deleted file mode 100644 index b4692b4cd..000000000 --- a/src/spicelib/devices/bsim3v0/bsim3v0init.h +++ /dev/null @@ -1,13 +0,0 @@ -#ifndef _BSIM3v0INIT_H -#define _BSIM3v0INIT_H - -extern IFparm BSIM3v0pTable[ ]; -extern IFparm BSIM3v0mPTable[ ]; -extern char *BSIM3v0names[ ]; -extern int BSIM3v0pTSize; -extern int BSIM3v0mPTSize; -extern int BSIM3v0nSize; -extern int BSIM3v0iSize; -extern int BSIM3v0mSize; - -#endif diff --git a/src/spicelib/devices/bsim3v0/bsim3v0itf.h b/src/spicelib/devices/bsim3v0/bsim3v0itf.h deleted file mode 100644 index 0d2908003..000000000 --- a/src/spicelib/devices/bsim3v0/bsim3v0itf.h +++ /dev/null @@ -1,13 +0,0 @@ -/********** -Copyright 1990 Regents of the University of California. All rights reserved. -Author: 1991 JianHui Huang and Min-Chie Jeng. -File: bsim3v0itf.h -**********/ - -#ifndef DEV_bsim3v0 -#define DEV_bsim3v0 - -SPICEdev *get_bsim3v0_info(void); - -#endif - diff --git a/src/spicelib/devices/bsim3v1/ChangeLog b/src/spicelib/devices/bsim3v1/ChangeLog deleted file mode 100644 index a20d00526..000000000 --- a/src/spicelib/devices/bsim3v1/ChangeLog +++ /dev/null @@ -1,8 +0,0 @@ -22-10-2012 Francesco Lannutti - * b3v1acld.c, b3v1cvtest.c, b3v1getic.c, b3v1ld.c, b3v1pzld.c, b3v1set.c, b3v1temp.c, b3v1trunc.c, bsim3v1def.h: Deleted the BSIM3V1owner field - -27-01-2000 Paolo Nenzi - - * bsim3v1def.h: added BSIM3V1owner varialbe to the BSIM3V1instance structure to support "parallel" processing with Cider - - * b3v1acld.c, b3v1cvtest.c, b3v1getic.c, b3v1ld.c, b3v1pzld.c, b3v1set.c, b3v1temp.c, b3v1trunc.c: added the BSIM3V1owner check in these files diff --git a/src/spicelib/devices/bsim3v1/Makefile.am b/src/spicelib/devices/bsim3v1/Makefile.am deleted file mode 100644 index f9000b6a4..000000000 --- a/src/spicelib/devices/bsim3v1/Makefile.am +++ /dev/null @@ -1,32 +0,0 @@ -## Process this file with automake to produce Makefile.in - -noinst_LTLIBRARIES = libbsim3v1.la - -libbsim3v1_la_SOURCES = \ - b3v1.c \ - b3v1acld.c \ - b3v1ask.c \ - b3v1check.c \ - b3v1cvtest.c \ - b3v1getic.c \ - b3v1ld.c \ - b3v1mask.c \ - b3v1mpar.c \ - b3v1noi.c \ - b3v1par.c \ - b3v1pzld.c \ - b3v1set.c \ - b3v1temp.c \ - b3v1trunc.c \ - bsim3v1def.h \ - bsim3v1ext.h \ - bsim3v1init.c \ - bsim3v1init.h \ - bsim3v1itf.h - - - -AM_CPPFLAGS = @AM_CPPFLAGS@ -I$(top_srcdir)/src/include -AM_CFLAGS = $(STATIC) - -MAINTAINERCLEANFILES = Makefile.in diff --git a/src/spicelib/devices/bsim3v1/b3v1.c b/src/spicelib/devices/bsim3v1/b3v1.c deleted file mode 100644 index a19c11073..000000000 --- a/src/spicelib/devices/bsim3v1/b3v1.c +++ /dev/null @@ -1,449 +0,0 @@ -/********** - * Copyright 1990 Regents of the University of California. All rights reserved. - * File: b3.c - * Author: 1995 Min-Chie Jeng and Mansun Chan. - * Modified by Paolo Nenzi 2002 - **********/ - -/* - * Release Notes: - * BSIM3v1v3.1, Released by yuhua 96/12/08 - */ - - -#include "ngspice/ngspice.h" -#include "ngspice/devdefs.h" -#include "bsim3v1def.h" -#include "ngspice/suffix.h" - -IFparm BSIM3v1pTable[] = { /* parameters */ -IOP( "l", BSIM3v1_L, IF_REAL , "Length"), -IOP( "w", BSIM3v1_W, IF_REAL , "Width"), -IOP( "m", BSIM3v1_M, IF_REAL , "Parallel multiplier"), -IOP( "ad", BSIM3v1_AD, IF_REAL , "Drain area"), -IOP( "as", BSIM3v1_AS, IF_REAL , "Source area"), -IOP( "pd", BSIM3v1_PD, IF_REAL , "Drain perimeter"), -IOP( "ps", BSIM3v1_PS, IF_REAL , "Source perimeter"), -IOP( "nrd", BSIM3v1_NRD, IF_REAL , "Number of squares in drain"), -IOP( "nrs", BSIM3v1_NRS, IF_REAL , "Number of squares in source"), -IOP( "off", BSIM3v1_OFF, IF_FLAG , "Device is initially off"), -IOP( "nqsmod", BSIM3v1_NQSMOD, IF_INTEGER, "Non-quasi-static model selector"), -IP( "ic", BSIM3v1_IC, IF_REALVEC , "Vector of DS,GS,BS initial voltages"), -OP( "gmbs", BSIM3v1_GMBS, IF_REAL, "Gmb"), -OP( "gm", BSIM3v1_GM, IF_REAL, "Gm"), -OP( "gds", BSIM3v1_GDS, IF_REAL, "Gds"), -OP( "vdsat", BSIM3v1_VDSAT, IF_REAL, "Vdsat"), -OP( "vth", BSIM3v1_VON, IF_REAL, "Vth"), -OP( "id", BSIM3v1_CD, IF_REAL, "Ids"), -OP( "vbs", BSIM3v1_VBS, IF_REAL, "Vbs"), -OP( "vgs", BSIM3v1_VGS, IF_REAL, "Vgs"), -OP( "vds", BSIM3v1_VDS, IF_REAL, "Vds"), -}; - -IFparm BSIM3v1mPTable[] = { /* model parameters */ -IOP( "capmod", BSIM3v1_MOD_CAPMOD, IF_INTEGER, "Capacitance model selector"), -IOP( "nqsmod", BSIM3v1_MOD_NQSMOD, IF_INTEGER, "Non-quasi-static model selector"), -IOP( "mobmod", BSIM3v1_MOD_MOBMOD, IF_INTEGER, "Mobility model selector"), -IOP( "noimod", BSIM3v1_MOD_NOIMOD, IF_INTEGER, "Noise model selector"), -IOP( "paramchk", BSIM3v1_MOD_PARAMCHK, IF_INTEGER, "Model parameter checking selector"), -IOP( "binunit", BSIM3v1_MOD_BINUNIT, IF_INTEGER, "Bin unit selector"), -IOP( "version", BSIM3v1_MOD_VERSION, IF_REAL, " parameter for model version"), -IOP( "tox", BSIM3v1_MOD_TOX, IF_REAL, "Gate oxide thickness in meters"), - -IOP( "cdsc", BSIM3v1_MOD_CDSC, IF_REAL, "Drain/Source and channel coupling capacitance"), -IOP( "cdscb", BSIM3v1_MOD_CDSCB, IF_REAL, "Body-bias dependence of cdsc"), -IOP( "cdscd", BSIM3v1_MOD_CDSCD, IF_REAL, "Drain-bias dependence of cdsc"), -IOP( "cit", BSIM3v1_MOD_CIT, IF_REAL, "Interface state capacitance"), -IOP( "nfactor", BSIM3v1_MOD_NFACTOR, IF_REAL, "Subthreshold swing Coefficient"), -IOP( "xj", BSIM3v1_MOD_XJ, IF_REAL, "Junction depth in meters"), -IOP( "vsat", BSIM3v1_MOD_VSAT, IF_REAL, "Saturation velocity at tnom"), -IOP( "at", BSIM3v1_MOD_AT, IF_REAL, "Temperature coefficient of vsat"), -IOP( "a0", BSIM3v1_MOD_A0, IF_REAL, "Non-uniform depletion width effect coefficient."), -IOP( "ags", BSIM3v1_MOD_AGS, IF_REAL, "Gate bias coefficient of Abulk."), -IOP( "a1", BSIM3v1_MOD_A1, IF_REAL, "Non-saturation effect coefficient"), -IOP( "a2", BSIM3v1_MOD_A2, IF_REAL, "Non-saturation effect coefficient"), -IOP( "keta", BSIM3v1_MOD_KETA, IF_REAL, "Body-bias coefficient of non-uniform depletion width effect."), -IOP( "nsub", BSIM3v1_MOD_NSUB, IF_REAL, "Substrate doping concentration"), -IOP( "nch", BSIM3v1_MOD_NPEAK, IF_REAL, "Channel doping concentration"), -IOP( "ngate", BSIM3v1_MOD_NGATE, IF_REAL, "Poly-gate doping concentration"), -IOP( "gamma1", BSIM3v1_MOD_GAMMA1, IF_REAL, "Vth body coefficient"), -IOP( "gamma2", BSIM3v1_MOD_GAMMA2, IF_REAL, "Vth body coefficient"), -IOP( "vbx", BSIM3v1_MOD_VBX, IF_REAL, "Vth transition body Voltage"), -IOP( "vbm", BSIM3v1_MOD_VBM, IF_REAL, "Maximum body voltage"), - -IOP( "xt", BSIM3v1_MOD_XT, IF_REAL, "Doping depth"), -IOP( "k1", BSIM3v1_MOD_K1, IF_REAL, "Bulk effect coefficient 1"), -IOP( "kt1", BSIM3v1_MOD_KT1, IF_REAL, "Temperature coefficient of Vth"), -IOP( "kt1l", BSIM3v1_MOD_KT1L, IF_REAL, "Temperature coefficient of Vth"), -IOP( "kt2", BSIM3v1_MOD_KT2, IF_REAL, "Body-coefficient of kt1"), -IOP( "k2", BSIM3v1_MOD_K2, IF_REAL, "Bulk effect coefficient 2"), -IOP( "k3", BSIM3v1_MOD_K3, IF_REAL, "Narrow width effect coefficient"), -IOP( "k3b", BSIM3v1_MOD_K3B, IF_REAL, "Body effect coefficient of k3"), -IOP( "w0", BSIM3v1_MOD_W0, IF_REAL, "Narrow width effect parameter"), -IOP( "nlx", BSIM3v1_MOD_NLX, IF_REAL, "Lateral non-uniform doping effect"), -IOP( "dvt0", BSIM3v1_MOD_DVT0, IF_REAL, "Short channel effect coeff. 0"), -IOP( "dvt1", BSIM3v1_MOD_DVT1, IF_REAL, "Short channel effect coeff. 1"), -IOP( "dvt2", BSIM3v1_MOD_DVT2, IF_REAL, "Short channel effect coeff. 2"), -IOP( "dvt0w", BSIM3v1_MOD_DVT0W, IF_REAL, "Narrow Width coeff. 0"), -IOP( "dvt1w", BSIM3v1_MOD_DVT1W, IF_REAL, "Narrow Width effect coeff. 1"), -IOP( "dvt2w", BSIM3v1_MOD_DVT2W, IF_REAL, "Narrow Width effect coeff. 2"), -IOP( "drout", BSIM3v1_MOD_DROUT, IF_REAL, "DIBL coefficient of output resistance"), -IOP( "dsub", BSIM3v1_MOD_DSUB, IF_REAL, "DIBL coefficient in the subthreshold region"), -IOP( "vth0", BSIM3v1_MOD_VTH0, IF_REAL,"Threshold voltage"), -IOPR("vtho", BSIM3v1_MOD_VTH0, IF_REAL,"Threshold voltage"), -IOP( "ua", BSIM3v1_MOD_UA, IF_REAL, "Linear gate dependence of mobility"), -IOP( "ua1", BSIM3v1_MOD_UA1, IF_REAL, "Temperature coefficient of ua"), -IOP( "ub", BSIM3v1_MOD_UB, IF_REAL, "Quadratic gate dependence of mobility"), -IOP( "ub1", BSIM3v1_MOD_UB1, IF_REAL, "Temperature coefficient of ub"), -IOP( "uc", BSIM3v1_MOD_UC, IF_REAL, "Body-bias dependence of mobility"), -IOP( "uc1", BSIM3v1_MOD_UC1, IF_REAL, "Temperature coefficient of uc"), -IOP( "u0", BSIM3v1_MOD_U0, IF_REAL, "Low-field mobility at Tnom"), -IOP( "ute", BSIM3v1_MOD_UTE, IF_REAL, "Temperature coefficient of mobility"), -IOP( "voff", BSIM3v1_MOD_VOFF, IF_REAL, "Threshold voltage offset"), -IOP( "tnom", BSIM3v1_MOD_TNOM, IF_REAL, "Parameter measurement temperature"), -IOP( "cgso", BSIM3v1_MOD_CGSO, IF_REAL, "Gate-source overlap capacitance per width"), -IOP( "cgdo", BSIM3v1_MOD_CGDO, IF_REAL, "Gate-drain overlap capacitance per width"), -IOP( "cgbo", BSIM3v1_MOD_CGBO, IF_REAL, "Gate-bulk overlap capacitance per length"), -IOP( "xpart", BSIM3v1_MOD_XPART, IF_REAL, "Channel charge partitioning"), -IOP( "elm", BSIM3v1_MOD_ELM, IF_REAL, "Non-quasi-static Elmore Constant Parameter"), -IOP( "delta", BSIM3v1_MOD_DELTA, IF_REAL, "Effective Vds parameter"), -IOP( "rsh", BSIM3v1_MOD_RSH, IF_REAL, "Source-drain sheet resistance"), -IOP( "rdsw", BSIM3v1_MOD_RDSW, IF_REAL, "Source-drain resistance per width"), - -IOP( "prwg", BSIM3v1_MOD_PRWG, IF_REAL, "Gate-bias effect on parasitic resistance "), -IOP( "prwb", BSIM3v1_MOD_PRWB, IF_REAL, "Body-effect on parasitic resistance "), - -IOP( "prt", BSIM3v1_MOD_PRT, IF_REAL, "Temperature coefficient of parasitic resistance "), -IOP( "eta0", BSIM3v1_MOD_ETA0, IF_REAL, "Subthreshold region DIBL coefficient"), -IOP( "etab", BSIM3v1_MOD_ETAB, IF_REAL, "Subthreshold region DIBL coefficient"), -IOP( "pclm", BSIM3v1_MOD_PCLM, IF_REAL, "Channel length modulation Coefficient"), -IOP( "pdiblc1", BSIM3v1_MOD_PDIBL1, IF_REAL, "Drain-induced barrier lowering coefficient"), -IOP( "pdiblc2", BSIM3v1_MOD_PDIBL2, IF_REAL, "Drain-induced barrier lowering coefficient"), -IOP( "pdiblcb", BSIM3v1_MOD_PDIBLB, IF_REAL, "Body-effect on drain-induced barrier lowering"), -IOP( "pscbe1", BSIM3v1_MOD_PSCBE1, IF_REAL, "Substrate current body-effect coefficient"), -IOP( "pscbe2", BSIM3v1_MOD_PSCBE2, IF_REAL, "Substrate current body-effect coefficient"), -IOP( "pvag", BSIM3v1_MOD_PVAG, IF_REAL, "Gate dependence of output resistance parameter"), -IOP( "js", BSIM3v1_MOD_JS, IF_REAL, "Source/drain junction reverse saturation current density"), -IOP( "jsw", BSIM3v1_MOD_JSW, IF_REAL, "Sidewall junction reverse saturation current density"), -IOP( "pb", BSIM3v1_MOD_PB, IF_REAL, "Source/drain junction built-in potential"), -IOP( "nj", BSIM3v1_MOD_NJ, IF_REAL, "Source/drain junction emission coefficient"), -IOP( "xti", BSIM3v1_MOD_XTI, IF_REAL, "Junction current temperature exponent"), -IOP( "mj", BSIM3v1_MOD_MJ, IF_REAL, "Source/drain bottom junction capacitance grading coefficient"), -IOP( "pbsw", BSIM3v1_MOD_PBSW, IF_REAL, "Source/drain sidewall junction capacitance built in potential"), -IOP( "mjsw", BSIM3v1_MOD_MJSW, IF_REAL, "Source/drain sidewall junction capacitance grading coefficient"), -IOP( "pbswg", BSIM3v1_MOD_PBSWG, IF_REAL, "Source/drain (gate side) sidewall junction capacitance built in potential"), -IOP( "mjswg", BSIM3v1_MOD_MJSWG, IF_REAL, "Source/drain (gate side) sidewall junction capacitance grading coefficient"), -IOP( "cj", BSIM3v1_MOD_CJ, IF_REAL, "Source/drain bottom junction capacitance per unit area"), -IOP( "vfbcv", BSIM3v1_MOD_VFBCV, IF_REAL, "Flat Band Voltage parameter for capmod=0 only"), -IOP( "cjsw", BSIM3v1_MOD_CJSW, IF_REAL, "Source/drain sidewall junction capacitance per unit periphery"), - -IOP( "cjswg", BSIM3v1_MOD_CJSWG, IF_REAL, "Source/drain (gate side) sidewall junction capacitance per unit width"), -IOP( "lint", BSIM3v1_MOD_LINT, IF_REAL, "Length reduction parameter"), -IOP( "ll", BSIM3v1_MOD_LL, IF_REAL, "Length reduction parameter"), -IOP( "lln", BSIM3v1_MOD_LLN, IF_REAL, "Length reduction parameter"), -IOP( "lw", BSIM3v1_MOD_LW, IF_REAL, "Length reduction parameter"), -IOP( "lwn", BSIM3v1_MOD_LWN, IF_REAL, "Length reduction parameter"), -IOP( "lwl", BSIM3v1_MOD_LWL, IF_REAL, "Length reduction parameter"), -IOP( "lmin", BSIM3v1_MOD_LMIN, IF_REAL, "Minimum length for the model"), -IOP( "lmax", BSIM3v1_MOD_LMAX, IF_REAL, "Maximum length for the model"), - -IOP( "wr", BSIM3v1_MOD_WR, IF_REAL, "Width dependence of rds"), -IOP( "wint", BSIM3v1_MOD_WINT, IF_REAL, "Width reduction parameter"), -IOP( "dwg", BSIM3v1_MOD_DWG, IF_REAL, "Width reduction parameter"), -IOP( "dwb", BSIM3v1_MOD_DWB, IF_REAL, "Width reduction parameter"), - -IOP( "wl", BSIM3v1_MOD_WL, IF_REAL, "Width reduction parameter"), -IOP( "wln", BSIM3v1_MOD_WLN, IF_REAL, "Width reduction parameter"), -IOP( "ww", BSIM3v1_MOD_WW, IF_REAL, "Width reduction parameter"), -IOP( "wwn", BSIM3v1_MOD_WWN, IF_REAL, "Width reduction parameter"), -IOP( "wwl", BSIM3v1_MOD_WWL, IF_REAL, "Width reduction parameter"), -IOP( "wmin", BSIM3v1_MOD_WMIN, IF_REAL, "Minimum width for the model"), -IOP( "wmax", BSIM3v1_MOD_WMAX, IF_REAL, "Maximum width for the model"), - -IOP( "b0", BSIM3v1_MOD_B0, IF_REAL, "Abulk narrow width parameter"), -IOP( "b1", BSIM3v1_MOD_B1, IF_REAL, "Abulk narrow width parameter"), - -IOP( "cgsl", BSIM3v1_MOD_CGSL, IF_REAL, "New C-V model parameter"), -IOP( "cgdl", BSIM3v1_MOD_CGDL, IF_REAL, "New C-V model parameter"), -IOP( "ckappa", BSIM3v1_MOD_CKAPPA, IF_REAL, "New C-V model parameter"), -IOP( "cf", BSIM3v1_MOD_CF, IF_REAL, "Fringe capacitance parameter"), -IOP( "clc", BSIM3v1_MOD_CLC, IF_REAL, "Vdsat parameter for C-V model"), -IOP( "cle", BSIM3v1_MOD_CLE, IF_REAL, "Vdsat parameter for C-V model"), -IOP( "dwc", BSIM3v1_MOD_DWC, IF_REAL, "Delta W for C-V model"), -IOP( "dlc", BSIM3v1_MOD_DLC, IF_REAL, "Delta L for C-V model"), - -IOP( "alpha0", BSIM3v1_MOD_ALPHA0, IF_REAL, "substrate current model parameter"), -IOP( "beta0", BSIM3v1_MOD_BETA0, IF_REAL, "substrate current model parameter"), - -IOP( "lcdsc", BSIM3v1_MOD_LCDSC, IF_REAL, "Length dependence of cdsc"), -IOP( "lcdscb", BSIM3v1_MOD_LCDSCB, IF_REAL, "Length dependence of cdscb"), -IOP( "lcdscd", BSIM3v1_MOD_LCDSCD, IF_REAL, "Length dependence of cdscd"), -IOP( "lcit", BSIM3v1_MOD_LCIT, IF_REAL, "Length dependence of cit"), -IOP( "lnfactor", BSIM3v1_MOD_LNFACTOR, IF_REAL, "Length dependence of nfactor"), -IOP( "lxj", BSIM3v1_MOD_LXJ, IF_REAL, "Length dependence of xj"), -IOP( "lvsat", BSIM3v1_MOD_LVSAT, IF_REAL, "Length dependence of vsat"), -IOP( "lat", BSIM3v1_MOD_LAT, IF_REAL, "Length dependence of at"), -IOP( "la0", BSIM3v1_MOD_LA0, IF_REAL, "Length dependence of a0"), -IOP( "lags", BSIM3v1_MOD_LAGS, IF_REAL, "Length dependence of ags"), -IOP( "la1", BSIM3v1_MOD_LA1, IF_REAL, "Length dependence of a1"), -IOP( "la2", BSIM3v1_MOD_LA2, IF_REAL, "Length dependence of a2"), -IOP( "lketa", BSIM3v1_MOD_LKETA, IF_REAL, "Length dependence of keta"), -IOP( "lnsub", BSIM3v1_MOD_LNSUB, IF_REAL, "Length dependence of nsub"), -IOP( "lnch", BSIM3v1_MOD_LNPEAK, IF_REAL, "Length dependence of nch"), -IOP( "lngate", BSIM3v1_MOD_LNGATE, IF_REAL, "Length dependence of ngate"), -IOP( "lgamma1", BSIM3v1_MOD_LGAMMA1, IF_REAL, "Length dependence of gamma1"), -IOP( "lgamma2", BSIM3v1_MOD_LGAMMA2, IF_REAL, "Length dependence of gamma2"), -IOP( "lvbx", BSIM3v1_MOD_LVBX, IF_REAL, "Length dependence of vbx"), -IOP( "lvbm", BSIM3v1_MOD_LVBM, IF_REAL, "Length dependence of vbm"), -IOP( "lxt", BSIM3v1_MOD_LXT, IF_REAL, "Length dependence of xt"), -IOP( "lk1", BSIM3v1_MOD_LK1, IF_REAL, "Length dependence of k1"), -IOP( "lkt1", BSIM3v1_MOD_LKT1, IF_REAL, "Length dependence of kt1"), -IOP( "lkt1l", BSIM3v1_MOD_LKT1L, IF_REAL, "Length dependence of kt1l"), -IOP( "lkt2", BSIM3v1_MOD_LKT2, IF_REAL, "Length dependence of kt2"), -IOP( "lk2", BSIM3v1_MOD_LK2, IF_REAL, "Length dependence of k2"), -IOP( "lk3", BSIM3v1_MOD_LK3, IF_REAL, "Length dependence of k3"), -IOP( "lk3b", BSIM3v1_MOD_LK3B, IF_REAL, "Length dependence of k3b"), -IOP( "lw0", BSIM3v1_MOD_LW0, IF_REAL, "Length dependence of w0"), -IOP( "lnlx", BSIM3v1_MOD_LNLX, IF_REAL, "Length dependence of nlx"), -IOP( "ldvt0", BSIM3v1_MOD_LDVT0, IF_REAL, "Length dependence of dvt0"), -IOP( "ldvt1", BSIM3v1_MOD_LDVT1, IF_REAL, "Length dependence of dvt1"), -IOP( "ldvt2", BSIM3v1_MOD_LDVT2, IF_REAL, "Length dependence of dvt2"), -IOP( "ldvt0w", BSIM3v1_MOD_LDVT0W, IF_REAL, "Length dependence of dvt0w"), -IOP( "ldvt1w", BSIM3v1_MOD_LDVT1W, IF_REAL, "Length dependence of dvt1w"), -IOP( "ldvt2w", BSIM3v1_MOD_LDVT2W, IF_REAL, "Length dependence of dvt2w"), -IOP( "ldrout", BSIM3v1_MOD_LDROUT, IF_REAL, "Length dependence of drout"), -IOP( "ldsub", BSIM3v1_MOD_LDSUB, IF_REAL, "Length dependence of dsub"), -IOP( "lvth0", BSIM3v1_MOD_LVTH0, IF_REAL,"Length dependence of vth0"), -IOPR("lvtho", BSIM3v1_MOD_LVTH0, IF_REAL,"Length dependence of vtho"), -IOP( "lua", BSIM3v1_MOD_LUA, IF_REAL, "Length dependence of ua"), -IOP( "lua1", BSIM3v1_MOD_LUA1, IF_REAL, "Length dependence of ua1"), -IOP( "lub", BSIM3v1_MOD_LUB, IF_REAL, "Length dependence of ub"), -IOP( "lub1", BSIM3v1_MOD_LUB1, IF_REAL, "Length dependence of ub1"), -IOP( "luc", BSIM3v1_MOD_LUC, IF_REAL, "Length dependence of uc"), -IOP( "luc1", BSIM3v1_MOD_LUC1, IF_REAL, "Length dependence of uc1"), -IOP( "lu0", BSIM3v1_MOD_LU0, IF_REAL, "Length dependence of u0"), -IOP( "lute", BSIM3v1_MOD_LUTE, IF_REAL, "Length dependence of ute"), -IOP( "lvoff", BSIM3v1_MOD_LVOFF, IF_REAL, "Length dependence of voff"), -IOP( "lelm", BSIM3v1_MOD_LELM, IF_REAL, "Length dependence of elm"), -IOP( "ldelta", BSIM3v1_MOD_LDELTA, IF_REAL, "Length dependence of delta"), -IOP( "lrdsw", BSIM3v1_MOD_LRDSW, IF_REAL, "Length dependence of rdsw "), - -IOP( "lprwg", BSIM3v1_MOD_LPRWG, IF_REAL, "Length dependence of prwg "), -IOP( "lprwb", BSIM3v1_MOD_LPRWB, IF_REAL, "Length dependence of prwb "), - -IOP( "lprt", BSIM3v1_MOD_LPRT, IF_REAL, "Length dependence of prt "), -IOP( "leta0", BSIM3v1_MOD_LETA0, IF_REAL, "Length dependence of eta0"), -IOP( "letab", BSIM3v1_MOD_LETAB, IF_REAL, "Length dependence of etab"), -IOP( "lpclm", BSIM3v1_MOD_LPCLM, IF_REAL, "Length dependence of pclm"), -IOP( "lpdiblc1", BSIM3v1_MOD_LPDIBL1, IF_REAL, "Length dependence of pdiblc1"), -IOP( "lpdiblc2", BSIM3v1_MOD_LPDIBL2, IF_REAL, "Length dependence of pdiblc2"), -IOP( "lpdiblcb", BSIM3v1_MOD_LPDIBLB, IF_REAL, "Length dependence of pdiblcb"), -IOP( "lpscbe1", BSIM3v1_MOD_LPSCBE1, IF_REAL, "Length dependence of pscbe1"), -IOP( "lpscbe2", BSIM3v1_MOD_LPSCBE2, IF_REAL, "Length dependence of pscbe2"), -IOP( "lpvag", BSIM3v1_MOD_LPVAG, IF_REAL, "Length dependence of pvag"), -IOP( "lwr", BSIM3v1_MOD_LWR, IF_REAL, "Length dependence of wr"), -IOP( "ldwg", BSIM3v1_MOD_LDWG, IF_REAL, "Length dependence of dwg"), -IOP( "ldwb", BSIM3v1_MOD_LDWB, IF_REAL, "Length dependence of dwb"), -IOP( "lb0", BSIM3v1_MOD_LB0, IF_REAL, "Length dependence of b0"), -IOP( "lb1", BSIM3v1_MOD_LB1, IF_REAL, "Length dependence of b1"), -IOP( "lcgsl", BSIM3v1_MOD_LCGSL, IF_REAL, "Length dependence of cgsl"), -IOP( "lcgdl", BSIM3v1_MOD_LCGDL, IF_REAL, "Length dependence of cgdl"), -IOP( "lckappa", BSIM3v1_MOD_LCKAPPA, IF_REAL, "Length dependence of ckappa"), -IOP( "lcf", BSIM3v1_MOD_LCF, IF_REAL, "Length dependence of cf"), -IOP( "lclc", BSIM3v1_MOD_LCLC, IF_REAL, "Length dependence of clc"), -IOP( "lcle", BSIM3v1_MOD_LCLE, IF_REAL, "Length dependence of cle"), -IOP( "lalpha0", BSIM3v1_MOD_LALPHA0, IF_REAL, "Length dependence of alpha0"), -IOP( "lbeta0", BSIM3v1_MOD_LBETA0, IF_REAL, "Length dependence of beta0"), -IOP( "lvfbcv", BSIM3v1_MOD_LVFBCV, IF_REAL, "Length dependence of vfbcv"), -IOP( "wcdsc", BSIM3v1_MOD_WCDSC, IF_REAL, "Width dependence of cdsc"), -IOP( "wcdscb", BSIM3v1_MOD_WCDSCB, IF_REAL, "Width dependence of cdscb"), -IOP( "wcdscd", BSIM3v1_MOD_WCDSCD, IF_REAL, "Width dependence of cdscd"), -IOP( "wcit", BSIM3v1_MOD_WCIT, IF_REAL, "Width dependence of cit"), -IOP( "wnfactor", BSIM3v1_MOD_WNFACTOR, IF_REAL, "Width dependence of nfactor"), -IOP( "wxj", BSIM3v1_MOD_WXJ, IF_REAL, "Width dependence of xj"), -IOP( "wvsat", BSIM3v1_MOD_WVSAT, IF_REAL, "Width dependence of vsat"), -IOP( "wat", BSIM3v1_MOD_WAT, IF_REAL, "Width dependence of at"), -IOP( "wa0", BSIM3v1_MOD_WA0, IF_REAL, "Width dependence of a0"), -IOP( "wags", BSIM3v1_MOD_WAGS, IF_REAL, "Width dependence of ags"), -IOP( "wa1", BSIM3v1_MOD_WA1, IF_REAL, "Width dependence of a1"), -IOP( "wa2", BSIM3v1_MOD_WA2, IF_REAL, "Width dependence of a2"), -IOP( "wketa", BSIM3v1_MOD_WKETA, IF_REAL, "Width dependence of keta"), -IOP( "wnsub", BSIM3v1_MOD_WNSUB, IF_REAL, "Width dependence of nsub"), -IOP( "wnch", BSIM3v1_MOD_WNPEAK, IF_REAL, "Width dependence of nch"), -IOP( "wngate", BSIM3v1_MOD_WNGATE, IF_REAL, "Width dependence of ngate"), -IOP( "wgamma1", BSIM3v1_MOD_WGAMMA1, IF_REAL, "Width dependence of gamma1"), -IOP( "wgamma2", BSIM3v1_MOD_WGAMMA2, IF_REAL, "Width dependence of gamma2"), -IOP( "wvbx", BSIM3v1_MOD_WVBX, IF_REAL, "Width dependence of vbx"), -IOP( "wvbm", BSIM3v1_MOD_WVBM, IF_REAL, "Width dependence of vbm"), -IOP( "wxt", BSIM3v1_MOD_WXT, IF_REAL, "Width dependence of xt"), -IOP( "wk1", BSIM3v1_MOD_WK1, IF_REAL, "Width dependence of k1"), -IOP( "wkt1", BSIM3v1_MOD_WKT1, IF_REAL, "Width dependence of kt1"), -IOP( "wkt1l", BSIM3v1_MOD_WKT1L, IF_REAL, "Width dependence of kt1l"), -IOP( "wkt2", BSIM3v1_MOD_WKT2, IF_REAL, "Width dependence of kt2"), -IOP( "wk2", BSIM3v1_MOD_WK2, IF_REAL, "Width dependence of k2"), -IOP( "wk3", BSIM3v1_MOD_WK3, IF_REAL, "Width dependence of k3"), -IOP( "wk3b", BSIM3v1_MOD_WK3B, IF_REAL, "Width dependence of k3b"), -IOP( "ww0", BSIM3v1_MOD_WW0, IF_REAL, "Width dependence of w0"), -IOP( "wnlx", BSIM3v1_MOD_WNLX, IF_REAL, "Width dependence of nlx"), -IOP( "wdvt0", BSIM3v1_MOD_WDVT0, IF_REAL, "Width dependence of dvt0"), -IOP( "wdvt1", BSIM3v1_MOD_WDVT1, IF_REAL, "Width dependence of dvt1"), -IOP( "wdvt2", BSIM3v1_MOD_WDVT2, IF_REAL, "Width dependence of dvt2"), -IOP( "wdvt0w", BSIM3v1_MOD_WDVT0W, IF_REAL, "Width dependence of dvt0w"), -IOP( "wdvt1w", BSIM3v1_MOD_WDVT1W, IF_REAL, "Width dependence of dvt1w"), -IOP( "wdvt2w", BSIM3v1_MOD_WDVT2W, IF_REAL, "Width dependence of dvt2w"), -IOP( "wdrout", BSIM3v1_MOD_WDROUT, IF_REAL, "Width dependence of drout"), -IOP( "wdsub", BSIM3v1_MOD_WDSUB, IF_REAL, "Width dependence of dsub"), -IOP( "wvth0", BSIM3v1_MOD_WVTH0, IF_REAL,"Width dependence of vth0"), -IOPR("wvtho", BSIM3v1_MOD_WVTH0, IF_REAL,"Width dependence of vtho"), -IOP( "wua", BSIM3v1_MOD_WUA, IF_REAL, "Width dependence of ua"), -IOP( "wua1", BSIM3v1_MOD_WUA1, IF_REAL, "Width dependence of ua1"), -IOP( "wub", BSIM3v1_MOD_WUB, IF_REAL, "Width dependence of ub"), -IOP( "wub1", BSIM3v1_MOD_WUB1, IF_REAL, "Width dependence of ub1"), -IOP( "wuc", BSIM3v1_MOD_WUC, IF_REAL, "Width dependence of uc"), -IOP( "wuc1", BSIM3v1_MOD_WUC1, IF_REAL, "Width dependence of uc1"), -IOP( "wu0", BSIM3v1_MOD_WU0, IF_REAL, "Width dependence of u0"), -IOP( "wute", BSIM3v1_MOD_WUTE, IF_REAL, "Width dependence of ute"), -IOP( "wvoff", BSIM3v1_MOD_WVOFF, IF_REAL, "Width dependence of voff"), -IOP( "welm", BSIM3v1_MOD_WELM, IF_REAL, "Width dependence of elm"), -IOP( "wdelta", BSIM3v1_MOD_WDELTA, IF_REAL, "Width dependence of delta"), -IOP( "wrdsw", BSIM3v1_MOD_WRDSW, IF_REAL, "Width dependence of rdsw "), - -IOP( "wprwg", BSIM3v1_MOD_WPRWG, IF_REAL, "Width dependence of prwg "), -IOP( "wprwb", BSIM3v1_MOD_WPRWB, IF_REAL, "Width dependence of prwb "), - -IOP( "wprt", BSIM3v1_MOD_WPRT, IF_REAL, "Width dependence of prt"), -IOP( "weta0", BSIM3v1_MOD_WETA0, IF_REAL, "Width dependence of eta0"), -IOP( "wetab", BSIM3v1_MOD_WETAB, IF_REAL, "Width dependence of etab"), -IOP( "wpclm", BSIM3v1_MOD_WPCLM, IF_REAL, "Width dependence of pclm"), -IOP( "wpdiblc1", BSIM3v1_MOD_WPDIBL1, IF_REAL, "Width dependence of pdiblc1"), -IOP( "wpdiblc2", BSIM3v1_MOD_WPDIBL2, IF_REAL, "Width dependence of pdiblc2"), -IOP( "wpdiblcb", BSIM3v1_MOD_WPDIBLB, IF_REAL, "Width dependence of pdiblcb"), -IOP( "wpscbe1", BSIM3v1_MOD_WPSCBE1, IF_REAL, "Width dependence of pscbe1"), -IOP( "wpscbe2", BSIM3v1_MOD_WPSCBE2, IF_REAL, "Width dependence of pscbe2"), -IOP( "wpvag", BSIM3v1_MOD_WPVAG, IF_REAL, "Width dependence of pvag"), -IOP( "wwr", BSIM3v1_MOD_WWR, IF_REAL, "Width dependence of wr"), -IOP( "wdwg", BSIM3v1_MOD_WDWG, IF_REAL, "Width dependence of dwg"), -IOP( "wdwb", BSIM3v1_MOD_WDWB, IF_REAL, "Width dependence of dwb"), -IOP( "wb0", BSIM3v1_MOD_WB0, IF_REAL, "Width dependence of b0"), -IOP( "wb1", BSIM3v1_MOD_WB1, IF_REAL, "Width dependence of b1"), -IOP( "wcgsl", BSIM3v1_MOD_WCGSL, IF_REAL, "Width dependence of cgsl"), -IOP( "wcgdl", BSIM3v1_MOD_WCGDL, IF_REAL, "Width dependence of cgdl"), -IOP( "wckappa", BSIM3v1_MOD_WCKAPPA, IF_REAL, "Width dependence of ckappa"), -IOP( "wcf", BSIM3v1_MOD_WCF, IF_REAL, "Width dependence of cf"), -IOP( "wclc", BSIM3v1_MOD_WCLC, IF_REAL, "Width dependence of clc"), -IOP( "wcle", BSIM3v1_MOD_WCLE, IF_REAL, "Width dependence of cle"), -IOP( "walpha0", BSIM3v1_MOD_WALPHA0, IF_REAL, "Width dependence of alpha0"), -IOP( "wbeta0", BSIM3v1_MOD_WBETA0, IF_REAL, "Width dependence of beta0"), -IOP( "wvfbcv", BSIM3v1_MOD_WVFBCV, IF_REAL, "Width dependence of vfbcv"), - -IOP( "pcdsc", BSIM3v1_MOD_PCDSC, IF_REAL, "Cross-term dependence of cdsc"), -IOP( "pcdscb", BSIM3v1_MOD_PCDSCB, IF_REAL, "Cross-term dependence of cdscb"), -IOP( "pcdscd", BSIM3v1_MOD_PCDSCD, IF_REAL, "Cross-term dependence of cdscd"), -IOP( "pcit", BSIM3v1_MOD_PCIT, IF_REAL, "Cross-term dependence of cit"), -IOP( "pnfactor", BSIM3v1_MOD_PNFACTOR, IF_REAL, "Cross-term dependence of nfactor"), -IOP( "pxj", BSIM3v1_MOD_PXJ, IF_REAL, "Cross-term dependence of xj"), -IOP( "pvsat", BSIM3v1_MOD_PVSAT, IF_REAL, "Cross-term dependence of vsat"), -IOP( "pat", BSIM3v1_MOD_PAT, IF_REAL, "Cross-term dependence of at"), -IOP( "pa0", BSIM3v1_MOD_PA0, IF_REAL, "Cross-term dependence of a0"), -IOP( "pags", BSIM3v1_MOD_PAGS, IF_REAL, "Cross-term dependence of ags"), -IOP( "pa1", BSIM3v1_MOD_PA1, IF_REAL, "Cross-term dependence of a1"), -IOP( "pa2", BSIM3v1_MOD_PA2, IF_REAL, "Cross-term dependence of a2"), -IOP( "pketa", BSIM3v1_MOD_PKETA, IF_REAL, "Cross-term dependence of keta"), -IOP( "pnsub", BSIM3v1_MOD_PNSUB, IF_REAL, "Cross-term dependence of nsub"), -IOP( "pnch", BSIM3v1_MOD_PNPEAK, IF_REAL, "Cross-term dependence of nch"), -IOP( "pngate", BSIM3v1_MOD_PNGATE, IF_REAL, "Cross-term dependence of ngate"), -IOP( "pgamma1", BSIM3v1_MOD_PGAMMA1, IF_REAL, "Cross-term dependence of gamma1"), -IOP( "pgamma2", BSIM3v1_MOD_PGAMMA2, IF_REAL, "Cross-term dependence of gamma2"), -IOP( "pvbx", BSIM3v1_MOD_PVBX, IF_REAL, "Cross-term dependence of vbx"), -IOP( "pvbm", BSIM3v1_MOD_PVBM, IF_REAL, "Cross-term dependence of vbm"), -IOP( "pxt", BSIM3v1_MOD_PXT, IF_REAL, "Cross-term dependence of xt"), -IOP( "pk1", BSIM3v1_MOD_PK1, IF_REAL, "Cross-term dependence of k1"), -IOP( "pkt1", BSIM3v1_MOD_PKT1, IF_REAL, "Cross-term dependence of kt1"), -IOP( "pkt1l", BSIM3v1_MOD_PKT1L, IF_REAL, "Cross-term dependence of kt1l"), -IOP( "pkt2", BSIM3v1_MOD_PKT2, IF_REAL, "Cross-term dependence of kt2"), -IOP( "pk2", BSIM3v1_MOD_PK2, IF_REAL, "Cross-term dependence of k2"), -IOP( "pk3", BSIM3v1_MOD_PK3, IF_REAL, "Cross-term dependence of k3"), -IOP( "pk3b", BSIM3v1_MOD_PK3B, IF_REAL, "Cross-term dependence of k3b"), -IOP( "pw0", BSIM3v1_MOD_PW0, IF_REAL, "Cross-term dependence of w0"), -IOP( "pnlx", BSIM3v1_MOD_PNLX, IF_REAL, "Cross-term dependence of nlx"), -IOP( "pdvt0", BSIM3v1_MOD_PDVT0, IF_REAL, "Cross-term dependence of dvt0"), -IOP( "pdvt1", BSIM3v1_MOD_PDVT1, IF_REAL, "Cross-term dependence of dvt1"), -IOP( "pdvt2", BSIM3v1_MOD_PDVT2, IF_REAL, "Cross-term dependence of dvt2"), -IOP( "pdvt0w", BSIM3v1_MOD_PDVT0W, IF_REAL, "Cross-term dependence of dvt0w"), -IOP( "pdvt1w", BSIM3v1_MOD_PDVT1W, IF_REAL, "Cross-term dependence of dvt1w"), -IOP( "pdvt2w", BSIM3v1_MOD_PDVT2W, IF_REAL, "Cross-term dependence of dvt2w"), -IOP( "pdrout", BSIM3v1_MOD_PDROUT, IF_REAL, "Cross-term dependence of drout"), -IOP( "pdsub", BSIM3v1_MOD_PDSUB, IF_REAL, "Cross-term dependence of dsub"), -IOP( "pvth0", BSIM3v1_MOD_PVTH0, IF_REAL,"Cross-term dependence of vth0"), -IOPR("pvtho", BSIM3v1_MOD_PVTH0, IF_REAL,"Cross-term dependence of vtho"), -IOP( "pua", BSIM3v1_MOD_PUA, IF_REAL, "Cross-term dependence of ua"), -IOP( "pua1", BSIM3v1_MOD_PUA1, IF_REAL, "Cross-term dependence of ua1"), -IOP( "pub", BSIM3v1_MOD_PUB, IF_REAL, "Cross-term dependence of ub"), -IOP( "pub1", BSIM3v1_MOD_PUB1, IF_REAL, "Cross-term dependence of ub1"), -IOP( "puc", BSIM3v1_MOD_PUC, IF_REAL, "Cross-term dependence of uc"), -IOP( "puc1", BSIM3v1_MOD_PUC1, IF_REAL, "Cross-term dependence of uc1"), -IOP( "pu0", BSIM3v1_MOD_PU0, IF_REAL, "Cross-term dependence of u0"), -IOP( "pute", BSIM3v1_MOD_PUTE, IF_REAL, "Cross-term dependence of ute"), -IOP( "pvoff", BSIM3v1_MOD_PVOFF, IF_REAL, "Cross-term dependence of voff"), -IOP( "pelm", BSIM3v1_MOD_PELM, IF_REAL, "Cross-term dependence of elm"), -IOP( "pdelta", BSIM3v1_MOD_PDELTA, IF_REAL, "Cross-term dependence of delta"), -IOP( "prdsw", BSIM3v1_MOD_PRDSW, IF_REAL, "Cross-term dependence of rdsw "), - -IOP( "pprwg", BSIM3v1_MOD_PPRWG, IF_REAL, "Cross-term dependence of prwg "), -IOP( "pprwb", BSIM3v1_MOD_PPRWB, IF_REAL, "Cross-term dependence of prwb "), - -IOP( "pprt", BSIM3v1_MOD_PPRT, IF_REAL, "Cross-term dependence of prt "), -IOP( "peta0", BSIM3v1_MOD_PETA0, IF_REAL, "Cross-term dependence of eta0"), -IOP( "petab", BSIM3v1_MOD_PETAB, IF_REAL, "Cross-term dependence of etab"), -IOP( "ppclm", BSIM3v1_MOD_PPCLM, IF_REAL, "Cross-term dependence of pclm"), -IOP( "ppdiblc1", BSIM3v1_MOD_PPDIBL1, IF_REAL, "Cross-term dependence of pdiblc1"), -IOP( "ppdiblc2", BSIM3v1_MOD_PPDIBL2, IF_REAL, "Cross-term dependence of pdiblc2"), -IOP( "ppdiblcb", BSIM3v1_MOD_PPDIBLB, IF_REAL, "Cross-term dependence of pdiblcb"), -IOP( "ppscbe1", BSIM3v1_MOD_PPSCBE1, IF_REAL, "Cross-term dependence of pscbe1"), -IOP( "ppscbe2", BSIM3v1_MOD_PPSCBE2, IF_REAL, "Cross-term dependence of pscbe2"), -IOP( "ppvag", BSIM3v1_MOD_PPVAG, IF_REAL, "Cross-term dependence of pvag"), -IOP( "pwr", BSIM3v1_MOD_PWR, IF_REAL, "Cross-term dependence of wr"), -IOP( "pdwg", BSIM3v1_MOD_PDWG, IF_REAL, "Cross-term dependence of dwg"), -IOP( "pdwb", BSIM3v1_MOD_PDWB, IF_REAL, "Cross-term dependence of dwb"), -IOP( "pb0", BSIM3v1_MOD_PB0, IF_REAL, "Cross-term dependence of b0"), -IOP( "pb1", BSIM3v1_MOD_PB1, IF_REAL, "Cross-term dependence of b1"), -IOP( "pcgsl", BSIM3v1_MOD_PCGSL, IF_REAL, "Cross-term dependence of cgsl"), -IOP( "pcgdl", BSIM3v1_MOD_PCGDL, IF_REAL, "Cross-term dependence of cgdl"), -IOP( "pckappa", BSIM3v1_MOD_PCKAPPA, IF_REAL, "Cross-term dependence of ckappa"), -IOP( "pcf", BSIM3v1_MOD_PCF, IF_REAL, "Cross-term dependence of cf"), -IOP( "pclc", BSIM3v1_MOD_PCLC, IF_REAL, "Cross-term dependence of clc"), -IOP( "pcle", BSIM3v1_MOD_PCLE, IF_REAL, "Cross-term dependence of cle"), -IOP( "palpha0", BSIM3v1_MOD_PALPHA0, IF_REAL, "Cross-term dependence of alpha0"), -IOP( "pbeta0", BSIM3v1_MOD_PBETA0, IF_REAL, "Cross-term dependence of beta0"), -IOP( "pvfbcv", BSIM3v1_MOD_PVFBCV, IF_REAL, "Cross-term dependence of vfbcv"), - -IOP( "noia", BSIM3v1_MOD_NOIA, IF_REAL, "Flicker noise parameter"), -IOP( "noib", BSIM3v1_MOD_NOIB, IF_REAL, "Flicker noise parameter"), -IOP( "noic", BSIM3v1_MOD_NOIC, IF_REAL, "Flicker noise parameter"), -IOP( "em", BSIM3v1_MOD_EM, IF_REAL, "Flicker noise parameter"), -IOP( "ef", BSIM3v1_MOD_EF, IF_REAL, "Flicker noise frequency exponent"), -IOP( "af", BSIM3v1_MOD_AF, IF_REAL, "Flicker noise exponent"), -IOP( "kf", BSIM3v1_MOD_KF, IF_REAL, "Flicker noise coefficient"), - -IP( "nmos", BSIM3v1_MOD_NMOS, IF_FLAG, "Flag to indicate NMOS"), -IP( "pmos", BSIM3v1_MOD_PMOS, IF_FLAG, "Flag to indicate PMOS"), -/* serban */ -IOP( "hdif", BSIM3v1_MOD_HDIF, IF_REAL, "S/D junction extension"), -}; - -char *BSIM3v1names[] = { - "Drain", - "Gate", - "Source", - "Bulk", - "Charge" -}; - -int BSIM3v1nSize = NUMELEMS(BSIM3v1names); -int BSIM3v1pTSize = NUMELEMS(BSIM3v1pTable); -int BSIM3v1mPTSize = NUMELEMS(BSIM3v1mPTable); -int BSIM3v1iSize = sizeof(BSIM3v1instance); -int BSIM3v1mSize = sizeof(BSIM3v1model); - - - diff --git a/src/spicelib/devices/bsim3v1/b3v1acld.c b/src/spicelib/devices/bsim3v1/b3v1acld.c deleted file mode 100644 index 3790d2453..000000000 --- a/src/spicelib/devices/bsim3v1/b3v1acld.c +++ /dev/null @@ -1,186 +0,0 @@ -/********** - * Copyright 1990 Regents of the University of California. All rights reserved. - * File: b3v1acld.c - * Author: 1995 Min-Chie Jeng and Mansun Chan. - * Modified by Paolo Nenzi 2002 - **********/ - -/* - * Release Notes: - * BSIM3v3.1, Released by yuhua 96/12/08 - */ - -#include "ngspice/ngspice.h" -#include "ngspice/cktdefs.h" -#include "bsim3v1def.h" -#include "ngspice/sperror.h" -#include "ngspice/suffix.h" - - -int -BSIM3v1acLoad (GENmodel * inModel, CKTcircuit * ckt) -{ - BSIM3v1model *model = (BSIM3v1model *) inModel; - BSIM3v1instance *here; - double xcggb, xcgdb, xcgsb, xcbgb, xcbdb, xcbsb, xcddb, xcssb, xcdgb; - double gdpr, gspr, gds, gbd, gbs, capbd, capbs, xcsgb, xcdsb, xcsdb; - double cggb, cgdb, cgsb, cbgb, cbdb, cbsb, cddb, cdgb, cdsb, omega; - double GSoverlapCap, GDoverlapCap, GBoverlapCap, FwdSum, RevSum, Gm, Gmbs; - - double dxpart, sxpart, cqgb, cqdb, cqsb, cqbb, xcqgb, xcqdb, xcqsb, xcqbb; - - double m; - - omega = ckt->CKTomega; - for (; model != NULL; model = BSIM3v1nextModel(model)) - { - - - for (here = BSIM3v1instances(model); here != NULL; - here = BSIM3v1nextInstance(here)) - { - if (here->BSIM3v1mode >= 0) - { - Gm = here->BSIM3v1gm; - Gmbs = here->BSIM3v1gmbs; - FwdSum = Gm + Gmbs; - RevSum = 0.0; - cggb = here->BSIM3v1cggb; - cgsb = here->BSIM3v1cgsb; - cgdb = here->BSIM3v1cgdb; - - cbgb = here->BSIM3v1cbgb; - cbsb = here->BSIM3v1cbsb; - cbdb = here->BSIM3v1cbdb; - - cdgb = here->BSIM3v1cdgb; - cdsb = here->BSIM3v1cdsb; - cddb = here->BSIM3v1cddb; - - cqgb = here->BSIM3v1cqgb; - cqdb = here->BSIM3v1cqdb; - cqsb = here->BSIM3v1cqsb; - cqbb = here->BSIM3v1cqbb; - sxpart = 0.6; - dxpart = 0.4; - - } - else - { - Gm = -here->BSIM3v1gm; - Gmbs = -here->BSIM3v1gmbs; - FwdSum = 0.0; - RevSum = -Gm - Gmbs; - cggb = here->BSIM3v1cggb; - cgsb = here->BSIM3v1cgdb; - cgdb = here->BSIM3v1cgsb; - - cbgb = here->BSIM3v1cbgb; - cbsb = here->BSIM3v1cbdb; - cbdb = here->BSIM3v1cbsb; - - cdgb = -(here->BSIM3v1cdgb + cggb + cbgb); - cdsb = -(here->BSIM3v1cddb + cgsb + cbsb); - cddb = -(here->BSIM3v1cdsb + cgdb + cbdb); - - cqgb = here->BSIM3v1cqgb; - cqdb = here->BSIM3v1cqsb; - cqsb = here->BSIM3v1cqdb; - cqbb = here->BSIM3v1cqbb; - sxpart = 0.4; - dxpart = 0.6; - } - - gdpr = here->BSIM3v1drainConductance; - gspr = here->BSIM3v1sourceConductance; - gds = here->BSIM3v1gds; - gbd = here->BSIM3v1gbd; - gbs = here->BSIM3v1gbs; - capbd = here->BSIM3v1capbd; - capbs = here->BSIM3v1capbs; - - GSoverlapCap = here->BSIM3v1cgso; - GDoverlapCap = here->BSIM3v1cgdo; - GBoverlapCap = here->pParam->BSIM3v1cgbo; - - xcdgb = (cdgb - GDoverlapCap) * omega; - xcddb = (cddb + capbd + GDoverlapCap) * omega; - xcdsb = cdsb * omega; - xcsgb = -(cggb + cbgb + cdgb + GSoverlapCap) * omega; - xcsdb = -(cgdb + cbdb + cddb) * omega; - xcssb = (capbs + GSoverlapCap - (cgsb + cbsb + cdsb)) * omega; - xcggb = (cggb + GDoverlapCap + GSoverlapCap + GBoverlapCap) * omega; - xcgdb = (cgdb - GDoverlapCap) * omega; - xcgsb = (cgsb - GSoverlapCap) * omega; - xcbgb = (cbgb - GBoverlapCap) * omega; - xcbdb = (cbdb - capbd) * omega; - xcbsb = (cbsb - capbs) * omega; - xcqgb = cqgb * omega; - xcqdb = cqdb * omega; - xcqsb = cqsb * omega; - xcqbb = cqbb * omega; - - m = here->BSIM3v1m; - - *(here->BSIM3v1GgPtr + 1) += m * xcggb; - *(here->BSIM3v1BbPtr + 1) -= m * (xcbgb + xcbdb + xcbsb); - *(here->BSIM3v1DPdpPtr + 1) += m * xcddb; - *(here->BSIM3v1SPspPtr + 1) += m * xcssb; - *(here->BSIM3v1GbPtr + 1) -= m * (xcggb + xcgdb + xcgsb); - *(here->BSIM3v1GdpPtr + 1) += m * xcgdb; - *(here->BSIM3v1GspPtr + 1) += m * xcgsb; - *(here->BSIM3v1BgPtr + 1) += m * xcbgb; - *(here->BSIM3v1BdpPtr + 1) += m * xcbdb; - *(here->BSIM3v1BspPtr + 1) += m * xcbsb; - *(here->BSIM3v1DPgPtr + 1) += m * xcdgb; - *(here->BSIM3v1DPbPtr + 1) -= m * (xcdgb + xcddb + xcdsb); - *(here->BSIM3v1DPspPtr + 1) += m * xcdsb; - *(here->BSIM3v1SPgPtr + 1) += m * xcsgb; - *(here->BSIM3v1SPbPtr + 1) -= m * (xcsgb + xcsdb + xcssb); - *(here->BSIM3v1SPdpPtr + 1) += m * xcsdb; - - *(here->BSIM3v1QqPtr + 1) += m * omega; - - *(here->BSIM3v1QgPtr + 1) -= m * xcqgb; - *(here->BSIM3v1QdpPtr + 1) -= m * xcqdb; - *(here->BSIM3v1QspPtr + 1) -= m * xcqsb; - *(here->BSIM3v1QbPtr + 1) -= m * xcqbb; - - - *(here->BSIM3v1DdPtr) += m * gdpr; - *(here->BSIM3v1SsPtr) += m * gspr; - *(here->BSIM3v1BbPtr) += m * (gbd + gbs); - *(here->BSIM3v1DPdpPtr) += m * (gdpr + gds + gbd + RevSum + dxpart * here->BSIM3v1gtd); - *(here->BSIM3v1SPspPtr) += m * (gspr + gds + gbs + FwdSum + sxpart * here->BSIM3v1gts); - *(here->BSIM3v1DdpPtr) -= m * gdpr; - *(here->BSIM3v1SspPtr) -= m * gspr; - *(here->BSIM3v1BdpPtr) -= m * gbd; - *(here->BSIM3v1BspPtr) -= m * gbs; - *(here->BSIM3v1DPdPtr) -= m * gdpr; - *(here->BSIM3v1DPgPtr) += m * (Gm + dxpart * here->BSIM3v1gtg); - *(here->BSIM3v1DPbPtr) -= m * (gbd - Gmbs - dxpart * here->BSIM3v1gtb); - *(here->BSIM3v1DPspPtr) -= m * (gds + FwdSum - dxpart * here->BSIM3v1gts); - *(here->BSIM3v1SPgPtr) -= m * (Gm - sxpart * here->BSIM3v1gtg); - *(here->BSIM3v1SPsPtr) -= m * gspr; - *(here->BSIM3v1SPbPtr) -= m * (gbs + Gmbs - sxpart * here->BSIM3v1gtg); - *(here->BSIM3v1SPdpPtr) -= m * (gds + RevSum - sxpart * here->BSIM3v1gtd); - *(here->BSIM3v1GgPtr) -= m * here->BSIM3v1gtg; - *(here->BSIM3v1GbPtr) -= m * here->BSIM3v1gtb; - *(here->BSIM3v1GdpPtr) -= m * here->BSIM3v1gtd; - *(here->BSIM3v1GspPtr) -= m * here->BSIM3v1gts; - - *(here->BSIM3v1QqPtr) += m * here->BSIM3v1gtau; - - *(here->BSIM3v1DPqPtr) += m * dxpart * here->BSIM3v1gtau; - *(here->BSIM3v1SPqPtr) += m * sxpart * here->BSIM3v1gtau; - *(here->BSIM3v1GqPtr) -= m * here->BSIM3v1gtau; - - *(here->BSIM3v1QgPtr) += m * here->BSIM3v1gtg; - *(here->BSIM3v1QdpPtr) += m * here->BSIM3v1gtd; - *(here->BSIM3v1QspPtr) += m * here->BSIM3v1gts; - *(here->BSIM3v1QbPtr) += m * here->BSIM3v1gtb; - - } - } - return (OK); -} diff --git a/src/spicelib/devices/bsim3v1/b3v1ask.c b/src/spicelib/devices/bsim3v1/b3v1ask.c deleted file mode 100644 index 2b840847c..000000000 --- a/src/spicelib/devices/bsim3v1/b3v1ask.c +++ /dev/null @@ -1,229 +0,0 @@ -/********** - * Copyright 1990 Regents of the University of California. All rights reserved. - * File: b3ask.c - * Author: 1995 Min-Chie Jeng and Mansun Chan. - * Modified by Paolo Nenzi 2002 - **********/ - -/* - * Release Notes: - * BSIM3v1v3.1, Released by yuhua 96/12/08 - */ - -#include "ngspice/ngspice.h" -#include "ngspice/ifsim.h" -#include "ngspice/cktdefs.h" -#include "ngspice/devdefs.h" -#include "bsim3v1def.h" -#include "ngspice/sperror.h" -#include "ngspice/suffix.h" - -int -BSIM3v1ask (CKTcircuit * ckt, GENinstance * inst, int which, IFvalue * value, - IFvalue * select) -{ - BSIM3v1instance *here = (BSIM3v1instance *) inst; - - NG_IGNORE(select); - - switch (which) - { - case BSIM3v1_L: - value->rValue = here->BSIM3v1l; - return(OK); - case BSIM3v1_W: - value->rValue = here->BSIM3v1w; - return(OK); - case BSIM3v1_M: - value->rValue = here->BSIM3v1m; - return(OK); - case BSIM3v1_AS: - value->rValue = here->BSIM3v1sourceArea; - return(OK); - case BSIM3v1_AD: - value->rValue = here->BSIM3v1drainArea; - return(OK); - case BSIM3v1_PS: - value->rValue = here->BSIM3v1sourcePerimeter; - return(OK); - case BSIM3v1_PD: - value->rValue = here->BSIM3v1drainPerimeter; - return(OK); - case BSIM3v1_NRS: - value->rValue = here->BSIM3v1sourceSquares; - return(OK); - case BSIM3v1_NRD: - value->rValue = here->BSIM3v1drainSquares; - return(OK); - case BSIM3v1_OFF: - value->rValue = here->BSIM3v1off; - return(OK); - case BSIM3v1_NQSMOD: - value->iValue = here->BSIM3v1nqsMod; - return(OK); - case BSIM3v1_IC_VBS: - value->rValue = here->BSIM3v1icVBS; - return(OK); - case BSIM3v1_IC_VDS: - value->rValue = here->BSIM3v1icVDS; - return(OK); - case BSIM3v1_IC_VGS: - value->rValue = here->BSIM3v1icVGS; - return(OK); - case BSIM3v1_DNODE: - value->iValue = here->BSIM3v1dNode; - return(OK); - case BSIM3v1_GNODE: - value->iValue = here->BSIM3v1gNode; - return(OK); - case BSIM3v1_SNODE: - value->iValue = here->BSIM3v1sNode; - return(OK); - case BSIM3v1_BNODE: - value->iValue = here->BSIM3v1bNode; - return(OK); - case BSIM3v1_DNODEPRIME: - value->iValue = here->BSIM3v1dNodePrime; - return(OK); - case BSIM3v1_SNODEPRIME: - value->iValue = here->BSIM3v1sNodePrime; - return(OK); - case BSIM3v1_SOURCECONDUCT: - value->rValue = here->BSIM3v1sourceConductance; - value->rValue *= here->BSIM3v1m; - return(OK); - case BSIM3v1_DRAINCONDUCT: - value->rValue = here->BSIM3v1drainConductance; - value->rValue *= here->BSIM3v1m; - return(OK); - case BSIM3v1_VBD: - value->rValue = *(ckt->CKTstate0 + here->BSIM3v1vbd); - return(OK); - case BSIM3v1_VBS: - value->rValue = *(ckt->CKTstate0 + here->BSIM3v1vbs); - return(OK); - case BSIM3v1_VGS: - value->rValue = *(ckt->CKTstate0 + here->BSIM3v1vgs); - return(OK); - case BSIM3v1_VDS: - value->rValue = *(ckt->CKTstate0 + here->BSIM3v1vds); - return(OK); - case BSIM3v1_CD: - value->rValue = here->BSIM3v1cd; - value->rValue *= here->BSIM3v1m; - return(OK); - case BSIM3v1_CBS: - value->rValue = here->BSIM3v1cbs; - value->rValue *= here->BSIM3v1m; - return(OK); - case BSIM3v1_CBD: - value->rValue = here->BSIM3v1cbd; - value->rValue *= here->BSIM3v1m; - return(OK); - case BSIM3v1_GM: - value->rValue = here->BSIM3v1gm; - value->rValue *= here->BSIM3v1m; - return(OK); - case BSIM3v1_GDS: - value->rValue = here->BSIM3v1gds; - value->rValue *= here->BSIM3v1m; - return(OK); - case BSIM3v1_GMBS: - value->rValue = here->BSIM3v1gmbs; - value->rValue *= here->BSIM3v1m; - return(OK); - case BSIM3v1_GBD: - value->rValue = here->BSIM3v1gbd; - value->rValue *= here->BSIM3v1m; - return(OK); - case BSIM3v1_GBS: - value->rValue = here->BSIM3v1gbs; - value->rValue *= here->BSIM3v1m; - return(OK); - case BSIM3v1_QB: - value->rValue = *(ckt->CKTstate0 + here->BSIM3v1qb); - value->rValue *= here->BSIM3v1m; - return(OK); - case BSIM3v1_CQB: - value->rValue = *(ckt->CKTstate0 + here->BSIM3v1cqb); - value->rValue *= here->BSIM3v1m; - return(OK); - case BSIM3v1_QG: - value->rValue = *(ckt->CKTstate0 + here->BSIM3v1qg); - value->rValue *= here->BSIM3v1m; - return(OK); - case BSIM3v1_CQG: - value->rValue = *(ckt->CKTstate0 + here->BSIM3v1cqg); - value->rValue *= here->BSIM3v1m; - return(OK); - case BSIM3v1_QD: - value->rValue = *(ckt->CKTstate0 + here->BSIM3v1qd); - value->rValue *= here->BSIM3v1m; - return(OK); - case BSIM3v1_CQD: - value->rValue = *(ckt->CKTstate0 + here->BSIM3v1cqd); - value->rValue *= here->BSIM3v1m; - return(OK); - case BSIM3v1_CGG: - value->rValue = here->BSIM3v1cggb; - value->rValue *= here->BSIM3v1m; - return(OK); - case BSIM3v1_CGD: - value->rValue = here->BSIM3v1cgdb; - value->rValue *= here->BSIM3v1m; - return(OK); - case BSIM3v1_CGS: - value->rValue = here->BSIM3v1cgsb; - value->rValue *= here->BSIM3v1m; - return(OK); - case BSIM3v1_CDG: - value->rValue = here->BSIM3v1cdgb; - value->rValue *= here->BSIM3v1m; - return(OK); - case BSIM3v1_CDD: - value->rValue = here->BSIM3v1cddb; - value->rValue *= here->BSIM3v1m; - return(OK); - case BSIM3v1_CDS: - value->rValue = here->BSIM3v1cdsb; - value->rValue *= here->BSIM3v1m; - return(OK); - case BSIM3v1_CBG: - value->rValue = here->BSIM3v1cbgb; - value->rValue *= here->BSIM3v1m; - return(OK); - case BSIM3v1_CBDB: - value->rValue = here->BSIM3v1cbdb; - value->rValue *= here->BSIM3v1m; - return(OK); - case BSIM3v1_CBSB: - value->rValue = here->BSIM3v1cbsb; - value->rValue *= here->BSIM3v1m; - return(OK); - case BSIM3v1_CAPBD: - value->rValue = here->BSIM3v1capbd; - value->rValue *= here->BSIM3v1m; - return(OK); - case BSIM3v1_CAPBS: - value->rValue = here->BSIM3v1capbs; - value->rValue *= here->BSIM3v1m; - return(OK); - case BSIM3v1_VON: - value->rValue = here->BSIM3v1von; - return(OK); - case BSIM3v1_VDSAT: - value->rValue = here->BSIM3v1vdsat; - return(OK); - case BSIM3v1_QBS: - value->rValue = *(ckt->CKTstate0 + here->BSIM3v1qbs); - value->rValue *= here->BSIM3v1m; - return(OK); - case BSIM3v1_QBD: - value->rValue = *(ckt->CKTstate0 + here->BSIM3v1qbd); - value->rValue *= here->BSIM3v1m; - return(OK); - default: - return (E_BADPARM); - } - /* NOTREACHED */ -} diff --git a/src/spicelib/devices/bsim3v1/b3v1check.c b/src/spicelib/devices/bsim3v1/b3v1check.c deleted file mode 100644 index 8e87c914f..000000000 --- a/src/spicelib/devices/bsim3v1/b3v1check.c +++ /dev/null @@ -1,366 +0,0 @@ -/********** - * Copyright 1990 Regents of the University of California. All rights reserved. - * File: b3v1check.c - * Author: 1995 Min-Chie Jeng and Mansun Chan. - * Modified by Paolo Nenzi 2002 - **********/ - -/* - * Release Notes: - * BSIM3v3.1, Released by yuhua 96/12/08 - */ - - -#include "ngspice/ngspice.h" -#include "ngspice/cktdefs.h" -#include "bsim3v1def.h" -#include "ngspice/trandefs.h" -#include "ngspice/const.h" -#include "ngspice/sperror.h" -#include "ngspice/devdefs.h" -#include "ngspice/suffix.h" - -int -BSIM3v1checkModel(BSIM3v1model *model, BSIM3v1instance *here, CKTcircuit *ckt) -{ -struct bsim3v1SizeDependParam *pParam; -int Fatal_Flag = 0; -FILE *fplog; - - NG_IGNORE(ckt); - - if ((fplog = fopen("b3v3_1check.log", "w")) != NULL) - { pParam = here->pParam; - fprintf(fplog, "BSIM3V3.1 Parameter Check\n"); - fprintf(fplog, "Model = %s\n", model->BSIM3v1modName); - fprintf(fplog, "W = %g, L = %g\n", here->BSIM3v1w, here->BSIM3v1l); - - - if (pParam->BSIM3v1nlx < -pParam->BSIM3v1leff) - { fprintf(fplog, "Fatal: Nlx = %g is less than -Leff.\n", - pParam->BSIM3v1nlx); - printf("Fatal: Nlx = %g is less than -Leff.\n", - pParam->BSIM3v1nlx); - Fatal_Flag = 1; - } - - if (model->BSIM3v1tox <= 0.0) - { fprintf(fplog, "Fatal: Tox = %g is not positive.\n", - model->BSIM3v1tox); - printf("Fatal: Tox = %g is not positive.\n", model->BSIM3v1tox); - Fatal_Flag = 1; - } - - if (pParam->BSIM3v1npeak <= 0.0) - { fprintf(fplog, "Fatal: Nch = %g is not positive.\n", - pParam->BSIM3v1npeak); - printf("Fatal: Nch = %g is not positive.\n", - pParam->BSIM3v1npeak); - Fatal_Flag = 1; - } - if (pParam->BSIM3v1nsub <= 0.0) - { fprintf(fplog, "Fatal: Nsub = %g is not positive.\n", - pParam->BSIM3v1nsub); - printf("Fatal: Nsub = %g is not positive.\n", - pParam->BSIM3v1nsub); - Fatal_Flag = 1; - } - if (pParam->BSIM3v1ngate < 0.0) - { fprintf(fplog, "Fatal: Ngate = %g is not positive.\n", - pParam->BSIM3v1ngate); - printf("Fatal: Ngate = %g Ngate is not positive.\n", - pParam->BSIM3v1ngate); - Fatal_Flag = 1; - } - if (pParam->BSIM3v1ngate > 1.e25) - { fprintf(fplog, "Fatal: Ngate = %g is too high.\n", - pParam->BSIM3v1ngate); - printf("Fatal: Ngate = %g Ngate is too high\n", - pParam->BSIM3v1ngate); - Fatal_Flag = 1; - } - if (pParam->BSIM3v1xj <= 0.0) - { fprintf(fplog, "Fatal: Xj = %g is not positive.\n", - pParam->BSIM3v1xj); - printf("Fatal: Xj = %g is not positive.\n", pParam->BSIM3v1xj); - Fatal_Flag = 1; - } - - if (pParam->BSIM3v1dvt1 < 0.0) - { fprintf(fplog, "Fatal: Dvt1 = %g is negative.\n", - pParam->BSIM3v1dvt1); - printf("Fatal: Dvt1 = %g is negative.\n", pParam->BSIM3v1dvt1); - Fatal_Flag = 1; - } - - if (pParam->BSIM3v1dvt1w < 0.0) - { fprintf(fplog, "Fatal: Dvt1w = %g is negative.\n", - pParam->BSIM3v1dvt1w); - printf("Fatal: Dvt1w = %g is negative.\n", pParam->BSIM3v1dvt1w); - Fatal_Flag = 1; - } - - if (pParam->BSIM3v1w0 == -pParam->BSIM3v1weff) - { fprintf(fplog, "Fatal: (W0 + Weff) = 0 cauing divided-by-zero.\n"); - printf("Fatal: (W0 + Weff) = 0 cauing divided-by-zero.\n"); - Fatal_Flag = 1; - } - - if (pParam->BSIM3v1dsub < 0.0) - { fprintf(fplog, "Fatal: Dsub = %g is negative.\n", pParam->BSIM3v1dsub); - printf("Fatal: Dsub = %g is negative.\n", pParam->BSIM3v1dsub); - Fatal_Flag = 1; - } - if (pParam->BSIM3v1b1 == -pParam->BSIM3v1weff) - { fprintf(fplog, "Fatal: (B1 + Weff) = 0 causing divided-by-zero.\n"); - printf("Fatal: (B1 + Weff) = 0 causing divided-by-zero.\n"); - Fatal_Flag = 1; - } - if (pParam->BSIM3v1u0temp <= 0.0) - { fprintf(fplog, "Fatal: u0 at current temperature = %g is not positive.\n", pParam->BSIM3v1u0temp); - printf("Fatal: u0 at current temperature = %g is not positive.\n", - pParam->BSIM3v1u0temp); - Fatal_Flag = 1; - } - -/* Check delta parameter */ - if (pParam->BSIM3v1delta < 0.0) - { fprintf(fplog, "Fatal: Delta = %g is less than zero.\n", - pParam->BSIM3v1delta); - printf("Fatal: Delta = %g is less than zero.\n", pParam->BSIM3v1delta); - Fatal_Flag = 1; - } - - if (pParam->BSIM3v1vsattemp <= 0.0) - { fprintf(fplog, "Fatal: Vsat at current temperature = %g is not positive.\n", pParam->BSIM3v1vsattemp); - printf("Fatal: Vsat at current temperature = %g is not positive.\n", - pParam->BSIM3v1vsattemp); - Fatal_Flag = 1; - } -/* Check Rout parameters */ - if (pParam->BSIM3v1pclm <= 0.0) - { fprintf(fplog, "Fatal: Pclm = %g is not positive.\n", pParam->BSIM3v1pclm); - printf("Fatal: Pclm = %g is not positive.\n", pParam->BSIM3v1pclm); - Fatal_Flag = 1; - } - - if (pParam->BSIM3v1drout < 0.0) - { fprintf(fplog, "Fatal: Drout = %g is negative.\n", pParam->BSIM3v1drout); - printf("Fatal: Drout = %g is negative.\n", pParam->BSIM3v1drout); - Fatal_Flag = 1; - } - if (model->BSIM3v1unitLengthSidewallJctCap > 0.0 || - model->BSIM3v1unitLengthGateSidewallJctCap > 0.0) - { - if (here->BSIM3v1drainPerimeter < pParam->BSIM3v1weff) - { fprintf(fplog, "Warning: Pd = %g is less than W.\n", - here->BSIM3v1drainPerimeter); - printf("Warning: Pd = %g is less than W.\n", - here->BSIM3v1drainPerimeter); - here->BSIM3v1drainPerimeter =pParam->BSIM3v1weff; - } - if (here->BSIM3v1sourcePerimeter < pParam->BSIM3v1weff) - { fprintf(fplog, "Warning: Ps = %g is less than W.\n", - here->BSIM3v1sourcePerimeter); - printf("Warning: Ps = %g is less than W.\n", - here->BSIM3v1sourcePerimeter); - here->BSIM3v1sourcePerimeter =pParam->BSIM3v1weff; - } - } -/* Check capacitance parameters */ - if (pParam->BSIM3v1clc < 0.0) - { fprintf(fplog, "Fatal: Clc = %g is negative.\n", pParam->BSIM3v1clc); - printf("Fatal: Clc = %g is negative.\n", pParam->BSIM3v1clc); - Fatal_Flag = 1; - } - if (model->BSIM3v1paramChk ==1) - { -/* Check L and W parameters */ - if (pParam->BSIM3v1leff <= 5.0e-8) - { fprintf(fplog, "Warning: Leff = %g may be too small.\n", - pParam->BSIM3v1leff); - printf("Warning: Leff = %g may be too small.\n", - pParam->BSIM3v1leff); - } - - if (pParam->BSIM3v1leffCV <= 5.0e-8) - { fprintf(fplog, "Warning: Leff for CV = %g may be too small.\n", - pParam->BSIM3v1leffCV); - printf("Warning: Leff for CV = %g may be too small.\n", - pParam->BSIM3v1leffCV); - } - - if (pParam->BSIM3v1weff <= 1.0e-7) - { fprintf(fplog, "Warning: Weff = %g may be too small.\n", - pParam->BSIM3v1weff); - printf("Warning: Weff = %g may be too small.\n", - pParam->BSIM3v1weff); - } - - if (pParam->BSIM3v1weffCV <= 1.0e-7) - { fprintf(fplog, "Warning: Weff for CV = %g may be too small.\n", - pParam->BSIM3v1weffCV); - printf("Warning: Weff for CV = %g may be too small.\n", - pParam->BSIM3v1weffCV); - } - -/* Check threshold voltage parameters */ - if (pParam->BSIM3v1nlx < 0.0) - { fprintf(fplog, "Warning: Nlx = %g is negative.\n", pParam->BSIM3v1nlx); - printf("Warning: Nlx = %g is negative.\n", pParam->BSIM3v1nlx); - } - if (model->BSIM3v1tox < 1.0e-9) - { fprintf(fplog, "Warning: Tox = %g is less than 10A.\n", - model->BSIM3v1tox); - printf("Warning: Tox = %g is less than 10A.\n", model->BSIM3v1tox); - } - - if (pParam->BSIM3v1npeak <= 1.0e15) - { fprintf(fplog, "Warning: Nch = %g may be too small.\n", - pParam->BSIM3v1npeak); - printf("Warning: Nch = %g may be too small.\n", - pParam->BSIM3v1npeak); - } - else if (pParam->BSIM3v1npeak >= 1.0e21) - { fprintf(fplog, "Warning: Nch = %g may be too large.\n", - pParam->BSIM3v1npeak); - printf("Warning: Nch = %g may be too large.\n", - pParam->BSIM3v1npeak); - } - - if (pParam->BSIM3v1nsub <= 1.0e14) - { fprintf(fplog, "Warning: Nsub = %g may be too small.\n", - pParam->BSIM3v1nsub); - printf("Warning: Nsub = %g may be too small.\n", - pParam->BSIM3v1nsub); - } - else if (pParam->BSIM3v1nsub >= 1.0e21) - { fprintf(fplog, "Warning: Nsub = %g may be too large.\n", - pParam->BSIM3v1nsub); - printf("Warning: Nsub = %g may be too large.\n", - pParam->BSIM3v1nsub); - } - - if ((pParam->BSIM3v1ngate > 0.0) && - (pParam->BSIM3v1ngate <= 1.e18)) - { fprintf(fplog, "Warning: Ngate = %g is less than 1.E18cm^-3.\n", - pParam->BSIM3v1ngate); - printf("Warning: Ngate = %g is less than 1.E18cm^-3.\n", - pParam->BSIM3v1ngate); - } - - if (pParam->BSIM3v1dvt0 < 0.0) - { fprintf(fplog, "Warning: Dvt0 = %g is negative.\n", - pParam->BSIM3v1dvt0); - printf("Warning: Dvt0 = %g is negative.\n", pParam->BSIM3v1dvt0); - } - - if (fabs(1.0e-6 / (pParam->BSIM3v1w0 + pParam->BSIM3v1weff)) > 10.0) - { fprintf(fplog, "Warning: (W0 + Weff) may be too small.\n"); - printf("Warning: (W0 + Weff) may be too small.\n"); - } - -/* Check subthreshold parameters */ - if (pParam->BSIM3v1nfactor < 0.0) - { fprintf(fplog, "Warning: Nfactor = %g is negative.\n", - pParam->BSIM3v1nfactor); - printf("Warning: Nfactor = %g is negative.\n", pParam->BSIM3v1nfactor); - } - if (pParam->BSIM3v1cdsc < 0.0) - { fprintf(fplog, "Warning: Cdsc = %g is negative.\n", - pParam->BSIM3v1cdsc); - printf("Warning: Cdsc = %g is negative.\n", pParam->BSIM3v1cdsc); - } - if (pParam->BSIM3v1cdscd < 0.0) - { fprintf(fplog, "Warning: Cdscd = %g is negative.\n", - pParam->BSIM3v1cdscd); - printf("Warning: Cdscd = %g is negative.\n", pParam->BSIM3v1cdscd); - } -/* Check DIBL parameters */ - if (pParam->BSIM3v1eta0 < 0.0) - { fprintf(fplog, "Warning: Eta0 = %g is negative.\n", - pParam->BSIM3v1eta0); - printf("Warning: Eta0 = %g is negative.\n", pParam->BSIM3v1eta0); - } - -/* Check Abulk parameters */ - if (fabs(1.0e-6 / (pParam->BSIM3v1b1 + pParam->BSIM3v1weff)) > 10.0) - { fprintf(fplog, "Warning: (B1 + Weff) may be too small.\n"); - printf("Warning: (B1 + Weff) may be too small.\n"); - } - - -/* Check Saturation parameters */ - if (pParam->BSIM3v1a2 < 0.01) - { fprintf(fplog, "Warning: A2 = %g is too small. Set to 0.01.\n", pParam->BSIM3v1a2); - printf("Warning: A2 = %g is too small. Set to 0.01.\n", - pParam->BSIM3v1a2); - pParam->BSIM3v1a2 = 0.01; - } - else if (pParam->BSIM3v1a2 > 1.0) - { fprintf(fplog, "Warning: A2 = %g is larger than 1. A2 is set to 1 and A1 is set to 0.\n", - pParam->BSIM3v1a2); - printf("Warning: A2 = %g is larger than 1. A2 is set to 1 and A1 is set to 0.\n", - pParam->BSIM3v1a2); - pParam->BSIM3v1a2 = 1.0; - pParam->BSIM3v1a1 = 0.0; - - } - - if (pParam->BSIM3v1rdsw < 0.0) - { fprintf(fplog, "Warning: Rdsw = %g is negative. Set to zero.\n", - pParam->BSIM3v1rdsw); - printf("Warning: Rdsw = %g is negative. Set to zero.\n", - pParam->BSIM3v1rdsw); - pParam->BSIM3v1rdsw = 0.0; - pParam->BSIM3v1rds0 = 0.0; - } - else if ((pParam->BSIM3v1rds0 > 0.0) && (pParam->BSIM3v1rds0 < 0.001)) - { fprintf(fplog, "Warning: Rds at current temperature = %g is less than 0.001 ohm. Set to zero.\n", - pParam->BSIM3v1rds0); - printf("Warning: Rds at current temperature = %g is less than 0.001 ohm. Set to zero.\n", - pParam->BSIM3v1rds0); - pParam->BSIM3v1rds0 = 0.0; - } - if (pParam->BSIM3v1vsattemp < 1.0e3) - { fprintf(fplog, "Warning: Vsat at current temperature = %g may be too small.\n", pParam->BSIM3v1vsattemp); - printf("Warning: Vsat at current temperature = %g may be too small.\n", pParam->BSIM3v1vsattemp); - } - - if (pParam->BSIM3v1pdibl1 < 0.0) - { fprintf(fplog, "Warning: Pdibl1 = %g is negative.\n", - pParam->BSIM3v1pdibl1); - printf("Warning: Pdibl1 = %g is negative.\n", pParam->BSIM3v1pdibl1); - } - if (pParam->BSIM3v1pdibl2 < 0.0) - { fprintf(fplog, "Warning: Pdibl2 = %g is negative.\n", - pParam->BSIM3v1pdibl2); - printf("Warning: Pdibl2 = %g is negative.\n", pParam->BSIM3v1pdibl2); - } -/* Check overlap capacitance parameters */ - if (model->BSIM3v1cgdo < 0.0) - { fprintf(fplog, "Warning: cgdo = %g is negative. Set to zero.\n", model->BSIM3v1cgdo); - printf("Warning: cgdo = %g is negative. Set to zero.\n", model->BSIM3v1cgdo); - model->BSIM3v1cgdo = 0.0; - } - if (model->BSIM3v1cgso < 0.0) - { fprintf(fplog, "Warning: cgso = %g is negative. Set to zero.\n", model->BSIM3v1cgso); - printf("Warning: cgso = %g is negative. Set to zero.\n", model->BSIM3v1cgso); - model->BSIM3v1cgso = 0.0; - } - if (model->BSIM3v1cgbo < 0.0) - { fprintf(fplog, "Warning: cgbo = %g is negative. Set to zero.\n", model->BSIM3v1cgbo); - printf("Warning: cgbo = %g is negative. Set to zero.\n", model->BSIM3v1cgbo); - model->BSIM3v1cgbo = 0.0; - } - - }/* loop for the parameter check for warning messages */ - fclose(fplog); - } - else - { fprintf(stderr, "Warning: Can't open log file. Parameter checking skipped.\n"); - } - - return(Fatal_Flag); -} - diff --git a/src/spicelib/devices/bsim3v1/b3v1cvtest.c b/src/spicelib/devices/bsim3v1/b3v1cvtest.c deleted file mode 100644 index 9cbc13bfa..000000000 --- a/src/spicelib/devices/bsim3v1/b3v1cvtest.c +++ /dev/null @@ -1,92 +0,0 @@ -/********** - * Copyright 1990 Regents of the University of California. All rights reserved. - * File: b3v1cvtest.c - * Author: 1995 Min-Chie Jeng and Mansun Chan. - * Modified by Paolo Nenzi 2002 - **********/ - -/* - * Release Notes: - * BSIM3v3.1, Released by yuhua 96/12/08 - */ - -#include "ngspice/ngspice.h" -#include "ngspice/cktdefs.h" -#include "bsim3v1def.h" -#include "ngspice/trandefs.h" -#include "ngspice/const.h" -#include "ngspice/devdefs.h" -#include "ngspice/sperror.h" -#include "ngspice/suffix.h" - - -int -BSIM3v1convTest(GENmodel *inModel, CKTcircuit *ckt) -{ -BSIM3v1model *model = (BSIM3v1model*)inModel; -BSIM3v1instance *here; -double delvbd, delvbs, delvds, delvgd, delvgs, vbd, vbs, vds; -double cbd, cbhat, cbs, cd, cdhat, tol, vgd, vgdo, vgs; - - /* loop through all the BSIM3v1 device models */ - for (; model != NULL; model = BSIM3v1nextModel(model)) - { /* loop through all the instances of the model */ - for (here = BSIM3v1instances(model); here != NULL ; - here=BSIM3v1nextInstance(here)) - { - vbs = model->BSIM3v1type - * (*(ckt->CKTrhsOld+here->BSIM3v1bNode) - - *(ckt->CKTrhsOld+here->BSIM3v1sNodePrime)); - vgs = model->BSIM3v1type - * (*(ckt->CKTrhsOld+here->BSIM3v1gNode) - - *(ckt->CKTrhsOld+here->BSIM3v1sNodePrime)); - vds = model->BSIM3v1type - * (*(ckt->CKTrhsOld+here->BSIM3v1dNodePrime) - - *(ckt->CKTrhsOld+here->BSIM3v1sNodePrime)); - vbd = vbs - vds; - vgd = vgs - vds; - vgdo = *(ckt->CKTstate0 + here->BSIM3v1vgs) - - *(ckt->CKTstate0 + here->BSIM3v1vds); - delvbs = vbs - *(ckt->CKTstate0 + here->BSIM3v1vbs); - delvbd = vbd - *(ckt->CKTstate0 + here->BSIM3v1vbd); - delvgs = vgs - *(ckt->CKTstate0 + here->BSIM3v1vgs); - delvds = vds - *(ckt->CKTstate0 + here->BSIM3v1vds); - delvgd = vgd-vgdo; - - cd = here->BSIM3v1cd; - if (here->BSIM3v1mode >= 0) - { cdhat = cd - here->BSIM3v1gbd * delvbd - + here->BSIM3v1gmbs * delvbs + here->BSIM3v1gm * delvgs - + here->BSIM3v1gds * delvds; - } - else - { cdhat = cd - (here->BSIM3v1gbd - here->BSIM3v1gmbs) * delvbd - - here->BSIM3v1gm * delvgd + here->BSIM3v1gds * delvds; - } - - /* - * check convergence - */ - if ((here->BSIM3v1off == 0) || (!(ckt->CKTmode & MODEINITFIX))) - { tol = ckt->CKTreltol * MAX(fabs(cdhat), fabs(cd)) - + ckt->CKTabstol; - if (fabs(cdhat - cd) >= tol) - { ckt->CKTnoncon++; - return(OK); - } - cbs = here->BSIM3v1cbs; - cbd = here->BSIM3v1cbd; - cbhat = cbs + cbd + here->BSIM3v1gbd * delvbd - + here->BSIM3v1gbs * delvbs; - tol = ckt->CKTreltol * MAX(fabs(cbhat), fabs(cbs + cbd)) - + ckt->CKTabstol; - if (fabs(cbhat - (cbs + cbd)) > tol) - { ckt->CKTnoncon++; - return(OK); - } - } - } - } - return(OK); -} - diff --git a/src/spicelib/devices/bsim3v1/b3v1getic.c b/src/spicelib/devices/bsim3v1/b3v1getic.c deleted file mode 100644 index e8d8a9ad9..000000000 --- a/src/spicelib/devices/bsim3v1/b3v1getic.c +++ /dev/null @@ -1,44 +0,0 @@ -/********** - * Copyright 1990 Regents of the University of California. All rights reserved. - * File: b3v1getic.c - * Author: 1995 Min-Chie Jeng and Mansun Chan. - * Modified by Paolo Nenzi 2002 - **********/ - -/* - * Release Notes: - * BSIM3v3.1, Released by yuhua 96/12/08 - */ - -#include "ngspice/ngspice.h" -#include "ngspice/cktdefs.h" -#include "bsim3v1def.h" -#include "ngspice/sperror.h" -#include "ngspice/suffix.h" - - -int -BSIM3v1getic(GENmodel *inModel, CKTcircuit *ckt) -{ -BSIM3v1model *model = (BSIM3v1model*)inModel; -BSIM3v1instance *here; - - for (; model ; model = BSIM3v1nextModel(model)) - { for (here = BSIM3v1instances(model); here; here = BSIM3v1nextInstance(here)) - { - if(!here->BSIM3v1icVBSGiven) - { here->BSIM3v1icVBS = *(ckt->CKTrhs + here->BSIM3v1bNode) - - *(ckt->CKTrhs + here->BSIM3v1sNode); - } - if (!here->BSIM3v1icVDSGiven) - { here->BSIM3v1icVDS = *(ckt->CKTrhs + here->BSIM3v1dNode) - - *(ckt->CKTrhs + here->BSIM3v1sNode); - } - if (!here->BSIM3v1icVGSGiven) - { here->BSIM3v1icVGS = *(ckt->CKTrhs + here->BSIM3v1gNode) - - *(ckt->CKTrhs + here->BSIM3v1sNode); - } - } - } - return(OK); -} diff --git a/src/spicelib/devices/bsim3v1/b3v1ld.c b/src/spicelib/devices/bsim3v1/b3v1ld.c deleted file mode 100644 index 61362a3d0..000000000 --- a/src/spicelib/devices/bsim3v1/b3v1ld.c +++ /dev/null @@ -1,2440 +0,0 @@ -/********** - * Copyright 1990 Regents of the University of California. All rights reserved. - * File: b3ld.c - * Author: 1995 Min-Chie Jeng and Mansun Chan. - * Modified by Mansun Chan (1995) - * Modified by Paolo Nenzi 2002 - **********/ - -/* - * Release Notes: - * BSIM3v1v3.1, Released by yuhua 96/12/08 - */ - -#include "ngspice/ngspice.h" -#include "ngspice/cktdefs.h" -#include "bsim3v1def.h" -#include "ngspice/trandefs.h" -#include "ngspice/const.h" -#include "ngspice/sperror.h" -#include "ngspice/devdefs.h" -#include "ngspice/suffix.h" - -#define MAX_EXP 5.834617425e14 -#define MIN_EXP 1.713908431e-15 -#define EXP_THRESHOLD 34.0 -#define EPSOX 3.453133e-11 -#define EPSSI 1.03594e-10 -#define Charge_q 1.60219e-19 -#define DELTA_1 0.02 -#define DELTA_2 0.02 -#define DELTA_3 0.02 -#define DELTA_4 0.02 - - -int -BSIM3v1load(GENmodel *inModel, CKTcircuit *ckt) -{ -BSIM3v1model *model = (BSIM3v1model*)inModel; -BSIM3v1instance *here; -double SourceSatCurrent, DrainSatCurrent; -double ag0, qgd, qgs, qgb, von, cbhat, VgstNVt, ExpVgst = 0.0; -double cdrain, cdhat, cdreq, ceqbd, ceqbs, ceqqb, ceqqd, ceqqg, ceq, geq; -double czbd, czbdsw, czbdswg, czbs, czbssw, czbsswg, evbd, evbs, arg, sarg; -double delvbd, delvbs, delvds, delvgd, delvgs; -double Vfbeff, dVfbeff_dVg, dVfbeff_dVd, dVfbeff_dVb, V3, V4; -double gcbdb, gcbgb, gcbsb, gcddb, gcdgb, gcdsb, gcgdb, gcggb, gcgsb, gcsdb; -double gcsgb, gcssb, PhiB, PhiBSW, MJ, MJSW, PhiBSWG, MJSWG; -double vbd, vbs, vds, vgb, vgd, vgs, vgdo; -#ifndef PREDICTOR -double xfact; -#endif -double qgate = 0.0, qbulk = 0.0, qdrn = 0.0, qsrc, cqgate, cqbulk, cqdrn; -double Vds, Vgs, Vbs, Gmbs, FwdSum, RevSum; -double Vgs_eff, Vfb, dVfb_dVb, dVfb_dVd; -double Phis, dPhis_dVb, sqrtPhis, dsqrtPhis_dVb, Vth, dVth_dVb, dVth_dVd; -double Vgst, dVgst_dVg, dVgst_dVb, dVgs_eff_dVg, Nvtm; -double n, dn_dVb, Vtm; -double ExpArg, V0; -double Denomi, dDenomi_dVg, dDenomi_dVd, dDenomi_dVb; -double ueff, dueff_dVg, dueff_dVd, dueff_dVb; -double Esat, Vdsat; -double EsatL, dEsatL_dVg, dEsatL_dVd, dEsatL_dVb; -double dVdsat_dVg, dVdsat_dVb, dVdsat_dVd, Vasat, dAlphaz_dVg, dAlphaz_dVb; -double dVasat_dVg, dVasat_dVb, dVasat_dVd, Va, dVa_dVd, dVa_dVg, dVa_dVb; -double Vbseff, dVbseff_dVb, VbseffCV, dVbseffCV_dVb; -double Arg1, One_Third_CoxWL, Two_Third_CoxWL, Alphaz, CoxWL; -double T0, dT0_dVg, dT0_dVd, dT0_dVb; -double T1, dT1_dVg, dT1_dVd, dT1_dVb; -double T2, dT2_dVg, dT2_dVd, dT2_dVb; -double T3, dT3_dVg, dT3_dVd, dT3_dVb; -double T4; -double T5; -double T6; -double T7; -double T8; -double T9; -double T10; -double T11, T12; -double tmp, Abulk, dAbulk_dVb, Abulk0, dAbulk0_dVb; -double VACLM, dVACLM_dVg, dVACLM_dVd, dVACLM_dVb; -double VADIBL, dVADIBL_dVg, dVADIBL_dVd, dVADIBL_dVb; -double Xdep, dXdep_dVb, lt1, dlt1_dVb, ltw, dltw_dVb, Delt_vth, dDelt_vth_dVb; -double Theta0, dTheta0_dVb; -double TempRatio, tmp1, tmp2, tmp3, tmp4; -double DIBL_Sft, dDIBL_Sft_dVd, Lambda, dLambda_dVg; -#ifndef NOBYPASS -double tempv; -#endif -double a1; - -double Vgsteff, dVgsteff_dVg, dVgsteff_dVd, dVgsteff_dVb; -double Vdseff, dVdseff_dVg, dVdseff_dVd, dVdseff_dVb; -double VdseffCV, dVdseffCV_dVg, dVdseffCV_dVd, dVdseffCV_dVb; -double diffVds; -double dAbulk_dVg, dn_dVd ; -double beta, dbeta_dVg, dbeta_dVd, dbeta_dVb; -double gche, dgche_dVg, dgche_dVd, dgche_dVb; -double fgche1, dfgche1_dVg, dfgche1_dVd, dfgche1_dVb; -double fgche2, dfgche2_dVg, dfgche2_dVd, dfgche2_dVb; -double Idl, dIdl_dVg, dIdl_dVd, dIdl_dVb; -double Idsa, dIdsa_dVg, dIdsa_dVd, dIdsa_dVb; -double Ids, Gm, Gds, Gmb; -double Isub, Gbd, Gbg, Gbb; -double VASCBE, dVASCBE_dVg, dVASCBE_dVd, dVASCBE_dVb; -double CoxWovL; -double Rds, dRds_dVg, dRds_dVb, WVCox, WVCoxRds; -double Vgst2Vtm, VdsatCV, dVdsatCV_dVg, dVdsatCV_dVb; -double Leff = 0.0, Weff, dWeff_dVg, dWeff_dVb; -double AbulkCV, dAbulkCV_dVb; -double qgdo, qgso, cgdo, cgso; - -double qcheq, qdef, gqdef, cqdef, cqcheq, gtau_diff, gtau_drift; -double gcqdb,gcqsb,gcqgb,gcqbb; -double dxpart, sxpart; - -double gbspsp, gbbdp, gbbsp, gbspg, gbspb, gbspdp; -double gbdpdp, gbdpg, gbdpb, gbdpsp; -double Cgg, Cgd, Cgb; -double Csg, Csd, Csb, Cbg, Cbd, Cbb; -double Cgg1, Cgb1, Cgd1, Cbg1, Cbb1, Cbd1, Qac0, Qsub0; -double dQac0_dVg, dQac0_dVd, dQac0_dVb, dQsub0_dVg, dQsub0_dVd, dQsub0_dVb; - -double m = 1.0; - -struct bsim3v1SizeDependParam *pParam; -int ByPass, Check, ChargeComputationNeeded = 0, error; - -for (; model != NULL; model = BSIM3v1nextModel(model)) -{ for (here = BSIM3v1instances(model); here != NULL; - here = BSIM3v1nextInstance(here)) - { - Check = 1; - ByPass = 0; - pParam = here->pParam; - if ((ckt->CKTmode & MODEINITSMSIG)) - { vbs = *(ckt->CKTstate0 + here->BSIM3v1vbs); - vgs = *(ckt->CKTstate0 + here->BSIM3v1vgs); - vds = *(ckt->CKTstate0 + here->BSIM3v1vds); - qdef = *(ckt->CKTstate0 + here->BSIM3v1qcdump); - } - else if ((ckt->CKTmode & MODEINITTRAN)) - { vbs = *(ckt->CKTstate1 + here->BSIM3v1vbs); - vgs = *(ckt->CKTstate1 + here->BSIM3v1vgs); - vds = *(ckt->CKTstate1 + here->BSIM3v1vds); - qdef = *(ckt->CKTstate1 + here->BSIM3v1qcdump); - } - else if ((ckt->CKTmode & MODEINITJCT) && !here->BSIM3v1off) - { vds = model->BSIM3v1type * here->BSIM3v1icVDS; - vgs = model->BSIM3v1type * here->BSIM3v1icVGS; - vbs = model->BSIM3v1type * here->BSIM3v1icVBS; - qdef = 0.0; - - if ((vds == 0.0) && (vgs == 0.0) && (vbs == 0.0) && - ((ckt->CKTmode & (MODETRAN | MODEAC|MODEDCOP | - MODEDCTRANCURVE)) || (!(ckt->CKTmode & MODEUIC)))) - { vbs = 0.0; - vgs = pParam->BSIM3v1vth0 + 0.1; - vds = 0.1; - } - } - else if ((ckt->CKTmode & (MODEINITJCT | MODEINITFIX)) && - (here->BSIM3v1off)) - { qdef = vbs = vgs = vds = 0.0; - } - else - { -#ifndef PREDICTOR - if ((ckt->CKTmode & MODEINITPRED)) - { xfact = ckt->CKTdelta / ckt->CKTdeltaOld[1]; - *(ckt->CKTstate0 + here->BSIM3v1vbs) = - *(ckt->CKTstate1 + here->BSIM3v1vbs); - vbs = (1.0 + xfact)* (*(ckt->CKTstate1 + here->BSIM3v1vbs)) - - (xfact * (*(ckt->CKTstate2 + here->BSIM3v1vbs))); - *(ckt->CKTstate0 + here->BSIM3v1vgs) = - *(ckt->CKTstate1 + here->BSIM3v1vgs); - vgs = (1.0 + xfact)* (*(ckt->CKTstate1 + here->BSIM3v1vgs)) - - (xfact * (*(ckt->CKTstate2 + here->BSIM3v1vgs))); - *(ckt->CKTstate0 + here->BSIM3v1vds) = - *(ckt->CKTstate1 + here->BSIM3v1vds); - vds = (1.0 + xfact)* (*(ckt->CKTstate1 + here->BSIM3v1vds)) - - (xfact * (*(ckt->CKTstate2 + here->BSIM3v1vds))); - *(ckt->CKTstate0 + here->BSIM3v1vbd) = - *(ckt->CKTstate0 + here->BSIM3v1vbs) - - *(ckt->CKTstate0 + here->BSIM3v1vds); - qdef = (1.0 + xfact)* (*(ckt->CKTstate1 + here->BSIM3v1qcdump)) - -(xfact * (*(ckt->CKTstate2 + here->BSIM3v1qcdump))); - } - else - { -#endif /* PREDICTOR */ - vbs = model->BSIM3v1type - * (*(ckt->CKTrhsOld + here->BSIM3v1bNode) - - *(ckt->CKTrhsOld + here->BSIM3v1sNodePrime)); - vgs = model->BSIM3v1type - * (*(ckt->CKTrhsOld + here->BSIM3v1gNode) - - *(ckt->CKTrhsOld + here->BSIM3v1sNodePrime)); - vds = model->BSIM3v1type - * (*(ckt->CKTrhsOld + here->BSIM3v1dNodePrime) - - *(ckt->CKTrhsOld + here->BSIM3v1sNodePrime)); - qdef = *(ckt->CKTrhsOld + here->BSIM3v1qNode); -#ifndef PREDICTOR - } -#endif /* PREDICTOR */ - - vbd = vbs - vds; - vgd = vgs - vds; - vgdo = *(ckt->CKTstate0 + here->BSIM3v1vgs) - - *(ckt->CKTstate0 + here->BSIM3v1vds); - delvbs = vbs - *(ckt->CKTstate0 + here->BSIM3v1vbs); - delvbd = vbd - *(ckt->CKTstate0 + here->BSIM3v1vbd); - delvgs = vgs - *(ckt->CKTstate0 + here->BSIM3v1vgs); - delvds = vds - *(ckt->CKTstate0 + here->BSIM3v1vds); - delvgd = vgd - vgdo; - - if (here->BSIM3v1mode >= 0) - { cdhat = here->BSIM3v1cd - here->BSIM3v1gbd * delvbd - + here->BSIM3v1gmbs * delvbs + here->BSIM3v1gm * delvgs - + here->BSIM3v1gds * delvds; - } - else - { cdhat = here->BSIM3v1cd - (here->BSIM3v1gbd - here->BSIM3v1gmbs) - * delvbd - here->BSIM3v1gm * delvgd - + here->BSIM3v1gds * delvds; - - } - cbhat = here->BSIM3v1cbs + here->BSIM3v1cbd + here->BSIM3v1gbd - * delvbd + here->BSIM3v1gbs * delvbs; - -#ifndef NOBYPASS - /* following should be one big if connected by && all over - * the place, but some C compilers can't handle that, so - * we split it up here to let them digest it in stages - */ - - if ((!(ckt->CKTmode & MODEINITPRED)) && (ckt->CKTbypass)) - if ((fabs(delvbs) < (ckt->CKTreltol * MAX(fabs(vbs), - fabs(*(ckt->CKTstate0+here->BSIM3v1vbs))) + ckt->CKTvoltTol))) - if ((fabs(delvbd) < (ckt->CKTreltol * MAX(fabs(vbd), - fabs(*(ckt->CKTstate0+here->BSIM3v1vbd))) + ckt->CKTvoltTol))) - if ((fabs(delvgs) < (ckt->CKTreltol * MAX(fabs(vgs), - fabs(*(ckt->CKTstate0+here->BSIM3v1vgs))) + ckt->CKTvoltTol))) - if ((fabs(delvds) < (ckt->CKTreltol * MAX(fabs(vds), - fabs(*(ckt->CKTstate0+here->BSIM3v1vds))) + ckt->CKTvoltTol))) - if ((fabs(cdhat - here->BSIM3v1cd) < ckt->CKTreltol - * MAX(fabs(cdhat),fabs(here->BSIM3v1cd)) + ckt->CKTabstol)) - { tempv = MAX(fabs(cbhat),fabs(here->BSIM3v1cbs - + here->BSIM3v1cbd)) + ckt->CKTabstol; - if ((fabs(cbhat - (here->BSIM3v1cbs + here->BSIM3v1cbd)) - < ckt->CKTreltol * tempv)) - { /* bypass code */ - vbs = *(ckt->CKTstate0 + here->BSIM3v1vbs); - vbd = *(ckt->CKTstate0 + here->BSIM3v1vbd); - vgs = *(ckt->CKTstate0 + here->BSIM3v1vgs); - vds = *(ckt->CKTstate0 + here->BSIM3v1vds); - qcheq = *(ckt->CKTstate0 + here->BSIM3v1qcheq); - - vgd = vgs - vds; - vgb = vgs - vbs; - - cdrain = here->BSIM3v1mode * (here->BSIM3v1cd - + here->BSIM3v1cbd); - if ((ckt->CKTmode & (MODETRAN | MODEAC)) || - ((ckt->CKTmode & MODETRANOP) && - (ckt->CKTmode & MODEUIC))) - { ByPass = 1; - goto line755; - } - else - { goto line850; - } - } - } - -#endif /*NOBYPASS*/ - von = here->BSIM3v1von; - if (*(ckt->CKTstate0 + here->BSIM3v1vds) >= 0.0) - { vgs = DEVfetlim(vgs, *(ckt->CKTstate0+here->BSIM3v1vgs), von); - vds = vgs - vgd; - vds = DEVlimvds(vds, *(ckt->CKTstate0 + here->BSIM3v1vds)); - vgd = vgs - vds; - - } - else - { vgd = DEVfetlim(vgd, vgdo, von); - vds = vgs - vgd; - vds = -DEVlimvds(-vds, -(*(ckt->CKTstate0+here->BSIM3v1vds))); - vgs = vgd + vds; - } - - if (vds >= 0.0) - { vbs = DEVpnjlim(vbs, *(ckt->CKTstate0 + here->BSIM3v1vbs), - CONSTvt0, model->BSIM3v1vcrit, &Check); - vbd = vbs - vds; - - } - else - { vbd = DEVpnjlim(vbd, *(ckt->CKTstate0 + here->BSIM3v1vbd), - CONSTvt0, model->BSIM3v1vcrit, &Check); - vbs = vbd + vds; - } - } - - /* determine DC current and derivatives */ - vbd = vbs - vds; - vgd = vgs - vds; - vgb = vgs - vbs; - - m = here->BSIM3v1m; - -/* the following code has been changed for the calculation of S/B and D/B diodes*/ - - if ((here->BSIM3v1sourceArea <= 0.0) && - (here->BSIM3v1sourcePerimeter <= 0.0)) - { SourceSatCurrent = 1.0e-14; - } - else - { SourceSatCurrent = here->BSIM3v1sourceArea - * model->BSIM3v1jctTempSatCurDensity - + here->BSIM3v1sourcePerimeter - * model->BSIM3v1jctSidewallTempSatCurDensity; - } - - Nvtm = model->BSIM3v1vtm * model->BSIM3v1jctEmissionCoeff; - if (SourceSatCurrent <= 0.0) - { here->BSIM3v1gbs = ckt->CKTgmin; - here->BSIM3v1cbs = here->BSIM3v1gbs * vbs; - } - else if (vbs < 0.5) - { evbs = exp(vbs / Nvtm); - here->BSIM3v1gbs = SourceSatCurrent * evbs / Nvtm + ckt->CKTgmin; - here->BSIM3v1cbs = SourceSatCurrent * (evbs - 1.0) - + ckt->CKTgmin * vbs; - } - else - { evbs = exp(0.5 / Nvtm); - T0 = SourceSatCurrent * evbs / Nvtm; - here->BSIM3v1gbs = T0 + ckt->CKTgmin; - here->BSIM3v1cbs = SourceSatCurrent * (evbs - 1.0) - + T0 * (vbs - 0.5) + ckt->CKTgmin * vbs; - } - - if ((here->BSIM3v1drainArea <= 0.0) && - (here->BSIM3v1drainPerimeter <= 0.0)) - { DrainSatCurrent = 1.0e-14; - } - else - { DrainSatCurrent = here->BSIM3v1drainArea - * model->BSIM3v1jctTempSatCurDensity - + here->BSIM3v1drainPerimeter - * model->BSIM3v1jctSidewallTempSatCurDensity; - } - - if (DrainSatCurrent <= 0.0) - { here->BSIM3v1gbd = ckt->CKTgmin; - here->BSIM3v1cbd = here->BSIM3v1gbd * vbd; - } - else if (vbd < 0.5) - { evbd = exp(vbd / Nvtm); - here->BSIM3v1gbd = DrainSatCurrent * evbd / Nvtm + ckt->CKTgmin; - here->BSIM3v1cbd = DrainSatCurrent * (evbd - 1.0) - + ckt->CKTgmin * vbd; - } - else - { evbd = exp(0.5 / Nvtm); - T0 = DrainSatCurrent * evbd / Nvtm; - here->BSIM3v1gbd = T0 + ckt->CKTgmin; - here->BSIM3v1cbd = DrainSatCurrent * (evbd - 1.0) - + T0 * (vbd - 0.5) + ckt->CKTgmin * vbd; - } -/* S/B and D/B diodes code change ends */ - - if (vds >= 0.0) - { /* normal mode */ - here->BSIM3v1mode = 1; - Vds = vds; - Vgs = vgs; - Vbs = vbs; - } - else - { /* inverse mode */ - here->BSIM3v1mode = -1; - Vds = -vds; - Vgs = vgd; - Vbs = vbd; - } - - ChargeComputationNeeded = - ((ckt->CKTmode & (MODEAC | MODETRAN | MODEINITSMSIG)) || - ((ckt->CKTmode & MODETRANOP) && (ckt->CKTmode & MODEUIC))) - ? 1 : 0; - T0 = Vbs - pParam->BSIM3v1vbsc - 0.001; - T1 = sqrt(T0 * T0 - 0.004 * pParam->BSIM3v1vbsc); - Vbseff = pParam->BSIM3v1vbsc + 0.5 * (T0 + T1); - dVbseff_dVb = 0.5 * (1.0 + T0 / T1); - if (Vbseff < Vbs) - { Vbseff = Vbs; - } /* Added to avoid the possible numerical problems due to computer accuracy. See comments for diffVds */ - - if (Vbseff > 0.0) - { T0 = pParam->BSIM3v1phi / (pParam->BSIM3v1phi + Vbseff); - Phis = pParam->BSIM3v1phi * T0; - dPhis_dVb = -T0 * T0; - sqrtPhis = pParam->BSIM3v1phis3 / (pParam->BSIM3v1phi + 0.5 * Vbseff); - dsqrtPhis_dVb = -0.5 * sqrtPhis * sqrtPhis / pParam->BSIM3v1phis3; - } - else - { Phis = pParam->BSIM3v1phi - Vbseff; - dPhis_dVb = -1.0; - sqrtPhis = sqrt(Phis); - dsqrtPhis_dVb = -0.5 / sqrtPhis; - } - Xdep = pParam->BSIM3v1Xdep0 * sqrtPhis / pParam->BSIM3v1sqrtPhi; - dXdep_dVb = (pParam->BSIM3v1Xdep0 / pParam->BSIM3v1sqrtPhi) - * dsqrtPhis_dVb; - - Leff = pParam->BSIM3v1leff; - Vtm = model->BSIM3v1vtm; -/* Vth Calculation */ - T3 = sqrt(Xdep); - V0 = pParam->BSIM3v1vbi - pParam->BSIM3v1phi; - - T0 = pParam->BSIM3v1dvt2 * Vbseff; - if (T0 >= - 0.5) - { T1 = 1.0 + T0; - T2 = pParam->BSIM3v1dvt2; - } - else /* Added to avoid any discontinuity problems caused by dvt2 */ - { T4 = 1.0 / (3.0 + 8.0 * T0); - T1 = (1.0 + 3.0 * T0) * T4; - T2 = pParam->BSIM3v1dvt2 * T4 * T4; - } - lt1 = model->BSIM3v1factor1 * T3 * T1; - dlt1_dVb = model->BSIM3v1factor1 * (0.5 / T3 * T1 * dXdep_dVb + T3 * T2); - - T0 = pParam->BSIM3v1dvt2w * Vbseff; - if (T0 >= - 0.5) - { T1 = 1.0 + T0; - T2 = pParam->BSIM3v1dvt2w; - } - else /* Added to avoid any discontinuity problems caused by dvt2w */ - { T4 = 1.0 / (3.0 + 8.0 * T0); - T1 = (1.0 + 3.0 * T0) * T4; - T2 = pParam->BSIM3v1dvt2w * T4 * T4; - } - ltw = model->BSIM3v1factor1 * T3 * T1; - dltw_dVb = model->BSIM3v1factor1 * (0.5 / T3 * T1 * dXdep_dVb + T3 * T2); - - T0 = -0.5 * pParam->BSIM3v1dvt1 * Leff / lt1; - if (T0 > -EXP_THRESHOLD) - { T1 = exp(T0); - Theta0 = T1 * (1.0 + 2.0 * T1); - dT1_dVb = -T0 / lt1 * T1 * dlt1_dVb; - dTheta0_dVb = (1.0 + 4.0 * T1) * dT1_dVb; - } - else - { T1 = MIN_EXP; - Theta0 = T1 * (1.0 + 2.0 * T1); - dTheta0_dVb = 0.0; - } - - here->BSIM3v1thetavth = pParam->BSIM3v1dvt0 * Theta0; - Delt_vth = here->BSIM3v1thetavth * V0; - dDelt_vth_dVb = pParam->BSIM3v1dvt0 * dTheta0_dVb * V0; - - T0 = -0.5 * pParam->BSIM3v1dvt1w * pParam->BSIM3v1weff * Leff / ltw; - if (T0 > -EXP_THRESHOLD) - { T1 = exp(T0); - T2 = T1 * (1.0 + 2.0 * T1); - dT1_dVb = -T0 / ltw * T1 * dltw_dVb; - dT2_dVb = (1.0 + 4.0 * T1) * dT1_dVb; - } - else - { T1 = MIN_EXP; - T2 = T1 * (1.0 + 2.0 * T1); - dT2_dVb = 0.0; - } - - T0 = pParam->BSIM3v1dvt0w * T2; - T2 = T0 * V0; - dT2_dVb = pParam->BSIM3v1dvt0w * dT2_dVb * V0; - - TempRatio = ckt->CKTtemp / model->BSIM3v1tnom - 1.0; - T0 = sqrt(1.0 + pParam->BSIM3v1nlx / Leff); - T1 = pParam->BSIM3v1k1 * (T0 - 1.0) * pParam->BSIM3v1sqrtPhi - + (pParam->BSIM3v1kt1 + pParam->BSIM3v1kt1l / Leff - + pParam->BSIM3v1kt2 * Vbseff) * TempRatio; - tmp2 = model->BSIM3v1tox * pParam->BSIM3v1phi - / (pParam->BSIM3v1weff + pParam->BSIM3v1w0); - - T3 = pParam->BSIM3v1eta0 + pParam->BSIM3v1etab * Vbseff; - if (T3 < 1.0e-4) /* avoid discontinuity problems caused by etab */ - { T9 = 1.0 / (3.0 - 2.0e4 * T3); - T3 = (2.0e-4 - T3) * T9; - T4 = T9 * T9; - } - else - { T4 = 1.0; - } - dDIBL_Sft_dVd = T3 * pParam->BSIM3v1theta0vb0; - DIBL_Sft = dDIBL_Sft_dVd * Vds; - - Vth = model->BSIM3v1type * pParam->BSIM3v1vth0 + pParam->BSIM3v1k1 - * (sqrtPhis - pParam->BSIM3v1sqrtPhi) - pParam->BSIM3v1k2 - * Vbseff - Delt_vth - T2 + (pParam->BSIM3v1k3 + pParam->BSIM3v1k3b - * Vbseff) * tmp2 + T1 - DIBL_Sft; - - here->BSIM3v1von = Vth; - - dVth_dVb = pParam->BSIM3v1k1 * dsqrtPhis_dVb - pParam->BSIM3v1k2 - - dDelt_vth_dVb - dT2_dVb + pParam->BSIM3v1k3b * tmp2 - - pParam->BSIM3v1etab * Vds * pParam->BSIM3v1theta0vb0 * T4 - + pParam->BSIM3v1kt2 * TempRatio; - dVth_dVd = -dDIBL_Sft_dVd; - -/* Calculate n */ - tmp2 = pParam->BSIM3v1nfactor * EPSSI / Xdep; - tmp3 = pParam->BSIM3v1cdsc + pParam->BSIM3v1cdscb * Vbseff - + pParam->BSIM3v1cdscd * Vds; - tmp4 = (tmp2 + tmp3 * Theta0 + pParam->BSIM3v1cit) / model->BSIM3v1cox; - if (tmp4 >= -0.5) - { n = 1.0 + tmp4; - dn_dVb = (-tmp2 / Xdep * dXdep_dVb + tmp3 * dTheta0_dVb - + pParam->BSIM3v1cdscb * Theta0) / model->BSIM3v1cox; - dn_dVd = pParam->BSIM3v1cdscd * Theta0 / model->BSIM3v1cox; - } - else - /* avoid discontinuity problems caused by tmp4 */ - { T0 = 1.0 / (3.0 + 8.0 * tmp4); - n = (1.0 + 3.0 * tmp4) * T0; - T0 *= T0; - dn_dVb = (-tmp2 / Xdep * dXdep_dVb + tmp3 * dTheta0_dVb - + pParam->BSIM3v1cdscb * Theta0) / model->BSIM3v1cox * T0; - dn_dVd = pParam->BSIM3v1cdscd * Theta0 / model->BSIM3v1cox * T0; - } - -/* Poly Gate Si Depletion Effect */ - T0 = pParam->BSIM3v1vfb + pParam->BSIM3v1phi; - if ((pParam->BSIM3v1ngate > 1.e18) && (pParam->BSIM3v1ngate < 1.e25) - && (Vgs > T0)) - /* added to avoid the problem caused by ngate */ - { T1 = 1.0e6 * Charge_q * EPSSI * pParam->BSIM3v1ngate - / (model->BSIM3v1cox * model->BSIM3v1cox); - T4 = sqrt(1.0 + 2.0 * (Vgs - T0) / T1); - T2 = T1 * (T4 - 1.0); - T3 = 0.5 * T2 * T2 / T1; /* T3 = Vpoly */ - T7 = 1.12 - T3 - 0.05; - T6 = sqrt(T7 * T7 + 0.224); - T5 = 1.12 - 0.5 * (T7 + T6); - Vgs_eff = Vgs - T5; - dVgs_eff_dVg = 1.0 - (0.5 - 0.5 / T4) * (1.0 + T7 / T6); - } - else - { Vgs_eff = Vgs; - dVgs_eff_dVg = 1.0; - } - Vgst = Vgs_eff - Vth; - -/* Effective Vgst (Vgsteff) Calculation */ - - T10 = 2.0 * n * Vtm; - VgstNVt = Vgst / T10; - ExpArg = (2.0 * pParam->BSIM3v1voff - Vgst) / T10; - - /* MCJ: Very small Vgst */ - if (VgstNVt > EXP_THRESHOLD) - { Vgsteff = Vgst; - dVgsteff_dVg = dVgs_eff_dVg; - dVgsteff_dVd = -dVth_dVd; - dVgsteff_dVb = -dVth_dVb; - } - else if (ExpArg > EXP_THRESHOLD) - { T0 = (Vgst - pParam->BSIM3v1voff) / (n * Vtm); - ExpVgst = exp(T0); - Vgsteff = Vtm * pParam->BSIM3v1cdep0 / model->BSIM3v1cox * ExpVgst; - dVgsteff_dVg = Vgsteff / (n * Vtm); - dVgsteff_dVd = -dVgsteff_dVg * (dVth_dVd + T0 * Vtm * dn_dVd); - dVgsteff_dVb = -dVgsteff_dVg * (dVth_dVb + T0 * Vtm * dn_dVb); - dVgsteff_dVg *= dVgs_eff_dVg; - } - else - { ExpVgst = exp(VgstNVt); - T1 = T10 * log(1.0 + ExpVgst); - dT1_dVg = ExpVgst / (1.0 + ExpVgst); - dT1_dVb = -dT1_dVg * (dVth_dVb + Vgst / n * dn_dVb) - + T1 / n * dn_dVb; - dT1_dVd = -dT1_dVg * (dVth_dVd + Vgst / n * dn_dVd) - + T1 / n * dn_dVd; - - dT2_dVg = -model->BSIM3v1cox / (Vtm * pParam->BSIM3v1cdep0) - * exp(ExpArg); - T2 = 1.0 - T10 * dT2_dVg; - dT2_dVd = -dT2_dVg * (dVth_dVd - 2.0 * Vtm * ExpArg * dn_dVd) - + (T2 - 1.0) / n * dn_dVd; - dT2_dVb = -dT2_dVg * (dVth_dVb - 2.0 * Vtm * ExpArg * dn_dVb) - + (T2 - 1.0) / n * dn_dVb; - - Vgsteff = T1 / T2; - T3 = T2 * T2; - dVgsteff_dVg = (T2 * dT1_dVg - T1 * dT2_dVg) / T3 * dVgs_eff_dVg; - dVgsteff_dVd = (T2 * dT1_dVd - T1 * dT2_dVd) / T3; - dVgsteff_dVb = (T2 * dT1_dVb - T1 * dT2_dVb) / T3; - } - -/* Calculate Effective Channel Geometry */ - T9 = sqrtPhis - pParam->BSIM3v1sqrtPhi; - Weff = pParam->BSIM3v1weff - 2.0 * (pParam->BSIM3v1dwg * Vgsteff - + pParam->BSIM3v1dwb * T9); - dWeff_dVg = -2.0 * pParam->BSIM3v1dwg; - dWeff_dVb = -2.0 * pParam->BSIM3v1dwb * dsqrtPhis_dVb; - - if (Weff < 2.0e-8) /* to avoid the discontinuity problem due to Weff*/ - { T0 = 1.0 / (6.0e-8 - 2.0 * Weff); - Weff = 2.0e-8 * (4.0e-8 - Weff) * T0; - T0 *= T0 * 4.0e-16; - dWeff_dVg *= T0; - dWeff_dVb *= T0; - } - - T0 = pParam->BSIM3v1prwg * Vgsteff + pParam->BSIM3v1prwb * T9; - if (T0 >= -0.9) - { Rds = pParam->BSIM3v1rds0 * (1.0 + T0); - dRds_dVg = pParam->BSIM3v1rds0 * pParam->BSIM3v1prwg; - dRds_dVb = pParam->BSIM3v1rds0 * pParam->BSIM3v1prwb * dsqrtPhis_dVb; - } - else - /* to avoid the discontinuity problem due to prwg and prwb*/ - { T1 = 1.0 / (17.0 + 20.0 * T0); - Rds = pParam->BSIM3v1rds0 * (0.8 + T0) * T1; - T1 *= T1; - dRds_dVg = pParam->BSIM3v1rds0 * pParam->BSIM3v1prwg * T1; - dRds_dVb = pParam->BSIM3v1rds0 * pParam->BSIM3v1prwb * dsqrtPhis_dVb - * T1; - } - -/* Calculate Abulk */ - T1 = 0.5 * pParam->BSIM3v1k1 / sqrtPhis; - dT1_dVb = -T1 / sqrtPhis * dsqrtPhis_dVb; - - T9 = sqrt(pParam->BSIM3v1xj * Xdep); - tmp1 = Leff + 2.0 * T9; - T5 = Leff / tmp1; - tmp2 = pParam->BSIM3v1a0 * T5; - tmp3 = pParam->BSIM3v1weff + pParam->BSIM3v1b1; - tmp4 = pParam->BSIM3v1b0 / tmp3; - T2 = tmp2 + tmp4; - dT2_dVb = -T9 / tmp1 / Xdep * dXdep_dVb; - T6 = T5 * T5; - T7 = T5 * T6; - - Abulk0 = 1.0 + T1 * T2; - dAbulk0_dVb = T1 * tmp2 * dT2_dVb + T2 * dT1_dVb; - - T8 = pParam->BSIM3v1ags * pParam->BSIM3v1a0 * T7; - dAbulk_dVg = -T1 * T8; - Abulk = Abulk0 + dAbulk_dVg * Vgsteff; - dAbulk_dVb = dAbulk0_dVb - T8 * Vgsteff * (dT1_dVb - + 3.0 * T1 * dT2_dVb); - - if (Abulk0 < 0.1) /* added to avoid the problems caused by Abulk0 */ - { T9 = 1.0 / (3.0 - 20.0 * Abulk0); - Abulk0 = (0.2 - Abulk0) * T9; - dAbulk0_dVb *= T9 * T9; - } - - if (Abulk < 0.1) - /* added to avoid the problems caused by Abulk */ - { T9 = 1.0 / (3.0 - 20.0 * Abulk); - Abulk = (0.2 - Abulk) * T9; - dAbulk_dVb *= T9 * T9; - } - - T2 = pParam->BSIM3v1keta * Vbseff; - if (T2 >= -0.9) - { T0 = 1.0 / (1.0 + T2); - dT0_dVb = -pParam->BSIM3v1keta * T0 * T0; - } - else - /* added to avoid the problems caused by Keta */ - { T1 = 1.0 / (0.8 + T2); - T0 = (17.0 + 20.0 * T2) * T1; - dT0_dVb = -pParam->BSIM3v1keta * T1 * T1; - } - dAbulk_dVg *= T0; - dAbulk_dVb = dAbulk_dVb * T0 + Abulk * dT0_dVb; - dAbulk0_dVb = dAbulk0_dVb * T0 + Abulk0 * dT0_dVb; - Abulk *= T0; - Abulk0 *= T0; - - -/* Mobility calculation */ - if (model->BSIM3v1mobMod == 1) - { T0 = Vgsteff + Vth + Vth; - T2 = pParam->BSIM3v1ua + pParam->BSIM3v1uc * Vbseff; - T3 = T0 / model->BSIM3v1tox; - T5 = T3 * (T2 + pParam->BSIM3v1ub * T3); - dDenomi_dVg = (T2 + 2.0 * pParam->BSIM3v1ub * T3) / model->BSIM3v1tox; - dDenomi_dVd = dDenomi_dVg * 2.0 * dVth_dVd; - dDenomi_dVb = dDenomi_dVg * 2.0 * dVth_dVb + pParam->BSIM3v1uc * T3; - } - else if (model->BSIM3v1mobMod == 2) - { T5 = Vgsteff / model->BSIM3v1tox * (pParam->BSIM3v1ua - + pParam->BSIM3v1uc * Vbseff + pParam->BSIM3v1ub * Vgsteff - / model->BSIM3v1tox); - dDenomi_dVg = (pParam->BSIM3v1ua + pParam->BSIM3v1uc * Vbseff - + 2.0 * pParam->BSIM3v1ub * Vgsteff / model->BSIM3v1tox) - / model->BSIM3v1tox; - dDenomi_dVd = 0.0; - dDenomi_dVb = Vgsteff * pParam->BSIM3v1uc / model->BSIM3v1tox; - } - else - { T0 = Vgsteff + Vth + Vth; - T2 = 1.0 + pParam->BSIM3v1uc * Vbseff; - T3 = T0 / model->BSIM3v1tox; - T4 = T3 * (pParam->BSIM3v1ua + pParam->BSIM3v1ub * T3); - T5 = T4 * T2; - dDenomi_dVg = (pParam->BSIM3v1ua + 2.0 * pParam->BSIM3v1ub * T3) * T2 - / model->BSIM3v1tox; - dDenomi_dVd = dDenomi_dVg * 2.0 * dVth_dVd; - dDenomi_dVb = dDenomi_dVg * 2.0 * dVth_dVb + pParam->BSIM3v1uc * T4; - } - - if (T5 >= -0.8) - { Denomi = 1.0 + T5; - } - else /* Added to avoid the discontinuity problem caused by ua and ub*/ - { T9 = 1.0 / (7.0 + 10.0 * T5); - Denomi = (0.6 + T5) * T9; - T9 *= T9; - dDenomi_dVg *= T9; - dDenomi_dVd *= T9; - dDenomi_dVb *= T9; - } - - here->BSIM3v1ueff = ueff = pParam->BSIM3v1u0temp / Denomi; - T9 = -ueff / Denomi; - dueff_dVg = T9 * dDenomi_dVg; - dueff_dVd = T9 * dDenomi_dVd; - dueff_dVb = T9 * dDenomi_dVb; - -/* Saturation Drain Voltage Vdsat */ - WVCox = Weff * pParam->BSIM3v1vsattemp * model->BSIM3v1cox; - WVCoxRds = WVCox * Rds; - - Esat = 2.0 * pParam->BSIM3v1vsattemp / ueff; - EsatL = Esat * Leff; - T0 = -EsatL /ueff; - dEsatL_dVg = T0 * dueff_dVg; - dEsatL_dVd = T0 * dueff_dVd; - dEsatL_dVb = T0 * dueff_dVb; - - /* Sqrt() */ - a1 = pParam->BSIM3v1a1; - if (a1 == 0.0) - { Lambda = pParam->BSIM3v1a2; - dLambda_dVg = 0.0; - } - else if (a1 > 0.0) -/* Added to avoid the discontinuity problem - caused by a1 and a2 (Lambda) */ - { T0 = 1.0 - pParam->BSIM3v1a2; - T1 = T0 - pParam->BSIM3v1a1 * Vgsteff - 0.0001; - T2 = sqrt(T1 * T1 + 0.0004 * T0); - Lambda = pParam->BSIM3v1a2 + T0 - 0.5 * (T1 + T2); - dLambda_dVg = 0.5 * pParam->BSIM3v1a1 * (1.0 + T1 / T2); - } - else - { T1 = pParam->BSIM3v1a2 + pParam->BSIM3v1a1 * Vgsteff - 0.0001; - T2 = sqrt(T1 * T1 + 0.0004 * pParam->BSIM3v1a2); - Lambda = 0.5 * (T1 + T2); - dLambda_dVg = 0.5 * pParam->BSIM3v1a1 * (1.0 + T1 / T2); - } - - Vgst2Vtm = Vgsteff + 2.0 * Vtm; - if (Rds > 0) - { tmp2 = dRds_dVg / Rds + dWeff_dVg / Weff; - tmp3 = dRds_dVb / Rds + dWeff_dVb / Weff; - } - else - { tmp2 = dWeff_dVg / Weff; - tmp3 = dWeff_dVb / Weff; - } - if ((Rds == 0.0) && (Lambda == 1.0)) - { T0 = 1.0 / (Abulk * EsatL + Vgst2Vtm); - tmp1 = 0.0; - T1 = T0 * T0; - T2 = Vgst2Vtm * T0; - T3 = EsatL * Vgst2Vtm; - Vdsat = T3 * T0; - - dT0_dVg = -(Abulk * dEsatL_dVg + EsatL * dAbulk_dVg + 1.0) * T1; - dT0_dVd = -(Abulk * dEsatL_dVd) * T1; - dT0_dVb = -(Abulk * dEsatL_dVb + dAbulk_dVb * EsatL) * T1; - - dVdsat_dVg = T3 * dT0_dVg + T2 * dEsatL_dVg + EsatL * T0; - dVdsat_dVd = T3 * dT0_dVd + T2 * dEsatL_dVd; - dVdsat_dVb = T3 * dT0_dVb + T2 * dEsatL_dVb; - } - else - { tmp1 = dLambda_dVg / (Lambda * Lambda); - T9 = Abulk * WVCoxRds; - T8 = Abulk * T9; - T7 = Vgst2Vtm * T9; - T6 = Vgst2Vtm * WVCoxRds; - T0 = 2.0 * Abulk * (T9 - 1.0 + 1.0 / Lambda); - dT0_dVg = 2.0 * (T8 * tmp2 - Abulk * tmp1 - + (2.0 * T9 + 1.0 / Lambda - 1.0) * dAbulk_dVg); - - dT0_dVb = 2.0 * (T8 * (2.0 / Abulk * dAbulk_dVb + tmp3) - + (1.0 / Lambda - 1.0) * dAbulk_dVb); - dT0_dVd = 0.0; - T1 = Vgst2Vtm * (2.0 / Lambda - 1.0) + Abulk * EsatL + 3.0 * T7; - - dT1_dVg = (2.0 / Lambda - 1.0) - 2.0 * Vgst2Vtm * tmp1 - + Abulk * dEsatL_dVg + EsatL * dAbulk_dVg + 3.0 * (T9 - + T7 * tmp2 + T6 * dAbulk_dVg); - dT1_dVb = Abulk * dEsatL_dVb + EsatL * dAbulk_dVb - + 3.0 * (T6 * dAbulk_dVb + T7 * tmp3); - dT1_dVd = Abulk * dEsatL_dVd; - - T2 = Vgst2Vtm * (EsatL + 2.0 * T6); - dT2_dVg = EsatL + Vgst2Vtm * dEsatL_dVg - + T6 * (4.0 + 2.0 * Vgst2Vtm * tmp2); - dT2_dVb = Vgst2Vtm * (dEsatL_dVb + 2.0 * T6 * tmp3); - dT2_dVd = Vgst2Vtm * dEsatL_dVd; - - T3 = sqrt(T1 * T1 - 2.0 * T0 * T2); - Vdsat = (T1 - T3) / T0; - - dT3_dVg = (T1 * dT1_dVg - 2.0 * (T0 * dT2_dVg + T2 * dT0_dVg)) - / T3; - dT3_dVd = (T1 * dT1_dVd - 2.0 * (T0 * dT2_dVd + T2 * dT0_dVd)) - / T3; - dT3_dVb = (T1 * dT1_dVb - 2.0 * (T0 * dT2_dVb + T2 * dT0_dVb)) - / T3; - - dVdsat_dVg = (dT1_dVg - (T1 * dT1_dVg - dT0_dVg * T2 - - T0 * dT2_dVg) / T3 - Vdsat * dT0_dVg) / T0; - dVdsat_dVb = (dT1_dVb - (T1 * dT1_dVb - dT0_dVb * T2 - - T0 * dT2_dVb) / T3 - Vdsat * dT0_dVb) / T0; - dVdsat_dVd = (dT1_dVd - (T1 * dT1_dVd - T0 * dT2_dVd) / T3) / T0; - } - here->BSIM3v1vdsat = Vdsat; - -/* Effective Vds (Vdseff) Calculation */ - T1 = Vdsat - Vds - pParam->BSIM3v1delta; - dT1_dVg = dVdsat_dVg; - dT1_dVd = dVdsat_dVd - 1.0; - dT1_dVb = dVdsat_dVb; - - T2 = sqrt(T1 * T1 + 4.0 * pParam->BSIM3v1delta * Vdsat); - T0 = T1 / T2; - T3 = 2.0 * pParam->BSIM3v1delta / T2; - dT2_dVg = T0 * dT1_dVg + T3 * dVdsat_dVg; - dT2_dVd = T0 * dT1_dVd + T3 * dVdsat_dVd; - dT2_dVb = T0 * dT1_dVb + T3 * dVdsat_dVb; - - Vdseff = Vdsat - 0.5 * (T1 + T2); - dVdseff_dVg = dVdsat_dVg - 0.5 * (dT1_dVg + dT2_dVg); - dVdseff_dVd = dVdsat_dVd - 0.5 * (dT1_dVd + dT2_dVd); - dVdseff_dVb = dVdsat_dVb - 0.5 * (dT1_dVb + dT2_dVb); - -/* Calculate VAsat */ - tmp4 = 1.0 - 0.5 * Abulk * Vdsat / Vgst2Vtm; - T9 = WVCoxRds * Vgsteff; - T8 = T9 / Vgst2Vtm; - T0 = EsatL + Vdsat + 2.0 * T9 * tmp4; - - T7 = 2.0 * WVCoxRds * tmp4; - dT0_dVg = dEsatL_dVg + dVdsat_dVg + T7 * (1.0 + tmp2 * Vgsteff) - - T8 * (Abulk * dVdsat_dVg - Abulk * Vdsat / Vgst2Vtm - + Vdsat * dAbulk_dVg); - - dT0_dVb = dEsatL_dVb + dVdsat_dVb + T7 * tmp3 * Vgsteff - - T8 * (dAbulk_dVb * Vdsat + Abulk * dVdsat_dVb); - dT0_dVd = dEsatL_dVd + dVdsat_dVd - T8 * Abulk * dVdsat_dVd; - - T9 = WVCoxRds * Abulk; - T1 = 2.0 / Lambda - 1.0 + T9; - dT1_dVg = -2.0 * tmp1 + WVCoxRds * (Abulk * tmp2 + dAbulk_dVg); - dT1_dVb = dAbulk_dVb * WVCoxRds + T9 * tmp3; - - Vasat = T0 / T1; - dVasat_dVg = (dT0_dVg - Vasat * dT1_dVg) / T1; - dVasat_dVb = (dT0_dVb - Vasat * dT1_dVb) / T1; - dVasat_dVd = dT0_dVd / T1; - - if (Vdseff > Vds) - Vdseff = Vds; /* This code is added to fixed the problem - caused by computer precision when - Vds is very close to Vdseff. */ - diffVds = Vds - Vdseff; -/* Calculate VACLM */ - if ((pParam->BSIM3v1pclm > 0.0) && (diffVds > 1.0e-10)) - { T0 = 1.0 / (pParam->BSIM3v1pclm * Abulk * pParam->BSIM3v1litl); - dT0_dVb = -T0 / Abulk * dAbulk_dVb; - dT0_dVg = -T0 / Abulk * dAbulk_dVg; - - T2 = Vgsteff / EsatL; - T1 = Leff * (Abulk + T2); - dT1_dVg = Leff * ((1.0 - T2 * dEsatL_dVg) / EsatL + dAbulk_dVg); - dT1_dVb = Leff * (dAbulk_dVb - T2 * dEsatL_dVb / EsatL); - dT1_dVd = -T2 * dEsatL_dVd / Esat; - - T9 = T0 * T1; - VACLM = T9 * diffVds; - dVACLM_dVg = T0 * dT1_dVg * diffVds - T9 * dVdseff_dVg - + T1 * diffVds * dT0_dVg; - dVACLM_dVb = (dT0_dVb * T1 + T0 * dT1_dVb) * diffVds - - T9 * dVdseff_dVb; - dVACLM_dVd = T0 * dT1_dVd * diffVds + T9 * (1.0 - dVdseff_dVd); - } - else - { VACLM = MAX_EXP; - dVACLM_dVd = dVACLM_dVg = dVACLM_dVb = 0.0; - } - -/* Calculate VADIBL */ - if (pParam->BSIM3v1thetaRout > 0.0) - { T8 = Abulk * Vdsat; - T0 = Vgst2Vtm * T8; - dT0_dVg = Vgst2Vtm * Abulk * dVdsat_dVg + T8 - + Vgst2Vtm * Vdsat * dAbulk_dVg; - dT0_dVb = Vgst2Vtm * (dAbulk_dVb * Vdsat + Abulk * dVdsat_dVb); - dT0_dVd = Vgst2Vtm * Abulk * dVdsat_dVd; - - T1 = Vgst2Vtm + T8; - dT1_dVg = 1.0 + Abulk * dVdsat_dVg + Vdsat * dAbulk_dVg; - dT1_dVb = Abulk * dVdsat_dVb + dAbulk_dVb * Vdsat; - dT1_dVd = Abulk * dVdsat_dVd; - - T9 = T1 * T1; - T2 = pParam->BSIM3v1thetaRout; - VADIBL = (Vgst2Vtm - T0 / T1) / T2; - dVADIBL_dVg = (1.0 - dT0_dVg / T1 + T0 * dT1_dVg / T9) / T2; - dVADIBL_dVb = (-dT0_dVb / T1 + T0 * dT1_dVb / T9) / T2; - dVADIBL_dVd = (-dT0_dVd / T1 + T0 * dT1_dVd / T9) / T2; - - T7 = pParam->BSIM3v1pdiblb * Vbseff; - if (T7 >= -0.9) - { T3 = 1.0 / (1.0 + T7); - VADIBL *= T3; - dVADIBL_dVg *= T3; - dVADIBL_dVb = (dVADIBL_dVb - VADIBL * pParam->BSIM3v1pdiblb) - * T3; - dVADIBL_dVd *= T3; - } - else -/* Added to avoid the discontinuity problem caused by pdiblcb */ - { T4 = 1.0 / (0.8 + T7); - T3 = (17.0 + 20.0 * T7) * T4; - dVADIBL_dVg *= T3; - dVADIBL_dVb = dVADIBL_dVb * T3 - - VADIBL * pParam->BSIM3v1pdiblb * T4 * T4; - dVADIBL_dVd *= T3; - VADIBL *= T3; - } - } - else - { VADIBL = MAX_EXP; - dVADIBL_dVd = dVADIBL_dVg = dVADIBL_dVb = 0.0; - } - -/* Calculate VA */ - - T8 = pParam->BSIM3v1pvag / EsatL; - T9 = T8 * Vgsteff; - if (T9 > -0.9) - { T0 = 1.0 + T9; - dT0_dVg = T8 * (1.0 - Vgsteff * dEsatL_dVg / EsatL); - dT0_dVb = -T9 * dEsatL_dVb / EsatL; - dT0_dVd = -T9 * dEsatL_dVd / EsatL; - } - else /* Added to avoid the discontinuity problems caused by pvag */ - { T1 = 1.0 / (17.0 + 20.0 * T9); - T0 = (0.8 + T9) * T1; - T1 *= T1; - dT0_dVg = T8 * (1.0 - Vgsteff * dEsatL_dVg / EsatL) * T1; - - T9 *= T1 / EsatL; - dT0_dVb = -T9 * dEsatL_dVb; - dT0_dVd = -T9 * dEsatL_dVd; - } - - tmp1 = VACLM * VACLM; - tmp2 = VADIBL * VADIBL; - tmp3 = VACLM + VADIBL; - - T1 = VACLM * VADIBL / tmp3; - tmp3 *= tmp3; - dT1_dVg = (tmp1 * dVADIBL_dVg + tmp2 * dVACLM_dVg) / tmp3; - dT1_dVd = (tmp1 * dVADIBL_dVd + tmp2 * dVACLM_dVd) / tmp3; - dT1_dVb = (tmp1 * dVADIBL_dVb + tmp2 * dVACLM_dVb) / tmp3; - - Va = Vasat + T0 * T1; - dVa_dVg = dVasat_dVg + T1 * dT0_dVg + T0 * dT1_dVg; - dVa_dVd = dVasat_dVd + T1 * dT0_dVd + T0 * dT1_dVd; - dVa_dVb = dVasat_dVb + T1 * dT0_dVb + T0 * dT1_dVb; - -/* Calculate VASCBE */ - if (pParam->BSIM3v1pscbe2 > 0.0) - { if (diffVds > pParam->BSIM3v1pscbe1 * pParam->BSIM3v1litl - / EXP_THRESHOLD) - { T0 = pParam->BSIM3v1pscbe1 * pParam->BSIM3v1litl / diffVds; - VASCBE = Leff * exp(T0) / pParam->BSIM3v1pscbe2; - T1 = T0 * VASCBE / diffVds; - dVASCBE_dVg = T1 * dVdseff_dVg; - dVASCBE_dVd = -T1 * (1.0 - dVdseff_dVd); - dVASCBE_dVb = T1 * dVdseff_dVb; - } - else - { VASCBE = MAX_EXP * Leff/pParam->BSIM3v1pscbe2; - dVASCBE_dVg = dVASCBE_dVd = dVASCBE_dVb = 0.0; - } - } - else - { VASCBE = MAX_EXP; - dVASCBE_dVg = dVASCBE_dVd = dVASCBE_dVb = 0.0; - } - -/* Calculate Ids */ - CoxWovL = model->BSIM3v1cox * Weff / Leff; - beta = ueff * CoxWovL; - dbeta_dVg = CoxWovL * dueff_dVg + beta * dWeff_dVg / Weff; - dbeta_dVd = CoxWovL * dueff_dVd; - dbeta_dVb = CoxWovL * dueff_dVb + beta * dWeff_dVb / Weff; - - T0 = 1.0 - 0.5 * Abulk * Vdseff / Vgst2Vtm; - dT0_dVg = -0.5 * (Abulk * dVdseff_dVg - - Abulk * Vdseff / Vgst2Vtm + Vdseff * dAbulk_dVg) / Vgst2Vtm; - dT0_dVd = -0.5 * Abulk * dVdseff_dVd / Vgst2Vtm; - dT0_dVb = -0.5 * (Abulk * dVdseff_dVb + dAbulk_dVb * Vdseff) - / Vgst2Vtm; - - fgche1 = Vgsteff * T0; - dfgche1_dVg = Vgsteff * dT0_dVg + T0; - dfgche1_dVd = Vgsteff * dT0_dVd; - dfgche1_dVb = Vgsteff * dT0_dVb; - - T9 = Vdseff / EsatL; - fgche2 = 1.0 + T9; - dfgche2_dVg = (dVdseff_dVg - T9 * dEsatL_dVg) / EsatL; - dfgche2_dVd = (dVdseff_dVd - T9 * dEsatL_dVd) / EsatL; - dfgche2_dVb = (dVdseff_dVb - T9 * dEsatL_dVb) / EsatL; - - gche = beta * fgche1 / fgche2; - dgche_dVg = (beta * dfgche1_dVg + fgche1 * dbeta_dVg - - gche * dfgche2_dVg) / fgche2; - dgche_dVd = (beta * dfgche1_dVd + fgche1 * dbeta_dVd - - gche * dfgche2_dVd) / fgche2; - dgche_dVb = (beta * dfgche1_dVb + fgche1 * dbeta_dVb - - gche * dfgche2_dVb) / fgche2; - - T0 = 1.0 + gche * Rds; - T9 = Vdseff / T0; - Idl = gche * T9; - - dIdl_dVg = (gche * dVdseff_dVg + T9 * dgche_dVg) / T0 - - Idl * gche / T0 * dRds_dVg ; - - dIdl_dVd = (gche * dVdseff_dVd + T9 * dgche_dVd) / T0; - dIdl_dVb = (gche * dVdseff_dVb + T9 * dgche_dVb - - Idl * dRds_dVb * gche) / T0; - - T9 = diffVds / Va; - T0 = 1.0 + T9; - Idsa = Idl * T0; - dIdsa_dVg = T0 * dIdl_dVg - Idl * (dVdseff_dVg + T9 * dVa_dVg) / Va; - dIdsa_dVd = T0 * dIdl_dVd + Idl * (1.0 - dVdseff_dVd - - T9 * dVa_dVd) / Va; - dIdsa_dVb = T0 * dIdl_dVb - Idl * (dVdseff_dVb + T9 * dVa_dVb) / Va; - - T9 = diffVds / VASCBE; - T0 = 1.0 + T9; - Ids = Idsa * T0; - - Gm = T0 * dIdsa_dVg - Idsa * (dVdseff_dVg + T9 * dVASCBE_dVg) / VASCBE; - Gds = T0 * dIdsa_dVd + Idsa * (1.0 - dVdseff_dVd - - T9 * dVASCBE_dVd) / VASCBE; - Gmb = T0 * dIdsa_dVb - Idsa * (dVdseff_dVb - + T9 * dVASCBE_dVb) / VASCBE; - - Gds += Gm * dVgsteff_dVd; - Gmb += Gm * dVgsteff_dVb; - Gm *= dVgsteff_dVg; - Gmb *= dVbseff_dVb; - -/* calculate substrate current Isub */ - if ((pParam->BSIM3v1alpha0 <= 0.0) || (pParam->BSIM3v1beta0 <= 0.0)) - { Isub = Gbd = Gbb = Gbg = 0.0; - } - else - { T2 = pParam->BSIM3v1alpha0 / Leff; - if (diffVds > pParam->BSIM3v1beta0 / EXP_THRESHOLD) - { T0 = -pParam->BSIM3v1beta0 / diffVds; - T1 = T2 * diffVds * exp(T0); - T3 = T1 / diffVds * (T0 - 1.0); - dT1_dVg = T3 * dVdseff_dVg; - dT1_dVd = -T3 * (1.0 - dVdseff_dVd); - dT1_dVb = T3 * dVdseff_dVb; - } - else - { T3 = T2 * MIN_EXP; - T1 = T3 * diffVds; - dT1_dVg = -T3 * dVdseff_dVg; - dT1_dVd = T3 * (1.0 - dVdseff_dVd); - dT1_dVb = -T3 * dVdseff_dVb; - } - Isub = T1 * Idsa; - Gbg = T1 * dIdsa_dVg + Idsa * dT1_dVg; - Gbd = T1 * dIdsa_dVd + Idsa * dT1_dVd; - Gbb = T1 * dIdsa_dVb + Idsa * dT1_dVb; - - Gbd += Gbg * dVgsteff_dVd; - Gbb += Gbg * dVgsteff_dVb; - Gbg *= dVgsteff_dVg; - Gbb *= dVbseff_dVb; /* bug fixing */ - } - - cdrain = Ids; - here->BSIM3v1gds = Gds; - here->BSIM3v1gm = Gm; - here->BSIM3v1gmbs = Gmb; - - here->BSIM3v1gbbs = Gbb; - here->BSIM3v1gbgs = Gbg; - here->BSIM3v1gbds = Gbd; - - here->BSIM3v1csub = Isub - (Gbb * Vbseff + Gbd * Vds + Gbg * Vgs); - -/* Calculate Qinv for Noise analysis */ - - T1 = Vgsteff * (1.0 - 0.5 * Abulk * Vdseff / Vgst2Vtm); - here->BSIM3v1qinv = -model->BSIM3v1cox * Weff * Leff * T1; - - if ((model->BSIM3v1xpart < 0) || (!ChargeComputationNeeded)) - { qgate = qdrn = qsrc = qbulk = 0.0; - here->BSIM3v1cggb = here->BSIM3v1cgsb = here->BSIM3v1cgdb = 0.0; - here->BSIM3v1cdgb = here->BSIM3v1cdsb = here->BSIM3v1cddb = 0.0; - here->BSIM3v1cbgb = here->BSIM3v1cbsb = here->BSIM3v1cbdb = 0.0; - here->BSIM3v1cqdb = here->BSIM3v1cqsb = here->BSIM3v1cqgb - = here->BSIM3v1cqbb = 0.0; - here->BSIM3v1gtau = 0.0; - goto finished; - } - else if (model->BSIM3v1capMod == 0) - { - if (Vbseff < 0.0) - { Vbseff = Vbs; - dVbseff_dVb = 1.0; - } - else - { Vbseff = pParam->BSIM3v1phi - Phis; - dVbseff_dVb = -dPhis_dVb; - } - - Vfb = pParam->BSIM3v1vfbcv; - Vth = Vfb + pParam->BSIM3v1phi + pParam->BSIM3v1k1 * sqrtPhis; - Vgst = Vgs_eff - Vth; - dVth_dVb = pParam->BSIM3v1k1 * dsqrtPhis_dVb; - dVgst_dVb = -dVth_dVb; - dVgst_dVg = dVgs_eff_dVg; - - CoxWL = model->BSIM3v1cox * pParam->BSIM3v1weffCV - * pParam->BSIM3v1leffCV; - Arg1 = Vgs_eff - Vbseff - Vfb; - if (Arg1 <= 0.0) - { qgate = CoxWL * Arg1; - qbulk = -qgate; - qdrn = 0.0; - - here->BSIM3v1cggb = CoxWL * dVgs_eff_dVg; - here->BSIM3v1cgdb = 0.0; - here->BSIM3v1cgsb = CoxWL * (dVbseff_dVb - - dVgs_eff_dVg); - - here->BSIM3v1cdgb = 0.0; - here->BSIM3v1cddb = 0.0; - here->BSIM3v1cdsb = 0.0; - - here->BSIM3v1cbgb = -CoxWL * dVgs_eff_dVg; - here->BSIM3v1cbdb = 0.0; - here->BSIM3v1cbsb = -here->BSIM3v1cgsb; - - } - else if (Vgst <= 0.0) - { T1 = 0.5 * pParam->BSIM3v1k1; - T2 = sqrt(T1 * T1 + Arg1); - qgate = CoxWL * pParam->BSIM3v1k1 * (T2 - T1); - qbulk = -qgate; - qdrn = 0.0; - - T0 = CoxWL * T1 / T2; - here->BSIM3v1cggb = T0 * dVgs_eff_dVg; - here->BSIM3v1cgdb = 0.0; - here->BSIM3v1cgsb = T0 * (dVbseff_dVb - - dVgs_eff_dVg); - - here->BSIM3v1cdgb = 0.0; - here->BSIM3v1cddb = 0.0; - here->BSIM3v1cdsb = 0.0; - - here->BSIM3v1cbgb = -here->BSIM3v1cggb; - here->BSIM3v1cbdb = 0.0; - here->BSIM3v1cbsb = -here->BSIM3v1cgsb; - } - else - { One_Third_CoxWL = CoxWL / 3.0; - Two_Third_CoxWL = 2.0 * One_Third_CoxWL; - - AbulkCV = Abulk0 * pParam->BSIM3v1abulkCVfactor; - dAbulkCV_dVb = pParam->BSIM3v1abulkCVfactor * dAbulk0_dVb; - Vdsat = Vgst / AbulkCV; - dVdsat_dVg = dVgs_eff_dVg / AbulkCV; - dVdsat_dVb = - (Vdsat * dAbulkCV_dVb + dVth_dVb)/ AbulkCV; - - if (model->BSIM3v1xpart > 0.5) - { /* 0/100 Charge petition model */ - if (Vdsat <= Vds) - { /* saturation region */ - T1 = Vdsat / 3.0; - qgate = CoxWL * (Vgs_eff - Vfb - - pParam->BSIM3v1phi - T1); - T2 = -Two_Third_CoxWL * Vgst; - qbulk = -(qgate + T2); - qdrn = 0.0; - - here->BSIM3v1cggb = One_Third_CoxWL * (3.0 - - dVdsat_dVg) * dVgs_eff_dVg; - T2 = -One_Third_CoxWL * dVdsat_dVb; - here->BSIM3v1cgsb = -(here->BSIM3v1cggb + T2); - here->BSIM3v1cgdb = 0.0; - - here->BSIM3v1cdgb = 0.0; - here->BSIM3v1cddb = 0.0; - here->BSIM3v1cdsb = 0.0; - - here->BSIM3v1cbgb = -(here->BSIM3v1cggb - - Two_Third_CoxWL * dVgs_eff_dVg); - T3 = -(T2 + Two_Third_CoxWL * dVth_dVb); - here->BSIM3v1cbsb = -(here->BSIM3v1cbgb + T3); - here->BSIM3v1cbdb = 0.0; - } - else - { /* linear region */ - Alphaz = Vgst / Vdsat; - T1 = 2.0 * Vdsat - Vds; - T2 = Vds / (3.0 * T1); - T3 = T2 * Vds; - T9 = 0.25 * CoxWL; - T4 = T9 * Alphaz; - T7 = 2.0 * Vds - T1 - 3.0 * T3; - T8 = T3 - T1 - 2.0 * Vds; - qgate = CoxWL * (Vgs_eff - Vfb - - pParam->BSIM3v1phi - 0.5 * (Vds - T3)); - T10 = T4 * T8; - qdrn = T4 * T7; - qbulk = -(qgate + qdrn + T10); - - T5 = T3 / T1; - here->BSIM3v1cggb = CoxWL * (1.0 - T5 * dVdsat_dVg) - * dVgs_eff_dVg; - T11 = -CoxWL * T5 * dVdsat_dVb; - here->BSIM3v1cgdb = CoxWL * (T2 - 0.5 + 0.5 * T5); - here->BSIM3v1cgsb = -(here->BSIM3v1cggb + T11 - + here->BSIM3v1cgdb); - T6 = 1.0 / Vdsat; - dAlphaz_dVg = T6 * (1.0 - Alphaz * dVdsat_dVg); - dAlphaz_dVb = -T6 * (dVth_dVb + Alphaz * dVdsat_dVb); - T7 = T9 * T7; - T8 = T9 * T8; - T9 = 2.0 * T4 * (1.0 - 3.0 * T5); - here->BSIM3v1cdgb = (T7 * dAlphaz_dVg - T9 - * dVdsat_dVg) * dVgs_eff_dVg; - T12 = T7 * dAlphaz_dVb - T9 * dVdsat_dVb; - here->BSIM3v1cddb = T4 * (3.0 - 6.0 * T2 - 3.0 * T5); - here->BSIM3v1cdsb = -(here->BSIM3v1cdgb + T12 - + here->BSIM3v1cddb); - - T9 = 2.0 * T4 * (1.0 + T5); - T10 = (T8 * dAlphaz_dVg - T9 * dVdsat_dVg) - * dVgs_eff_dVg; - T11 = T8 * dAlphaz_dVb - T9 * dVdsat_dVb; - T12 = T4 * (2.0 * T2 + T5 - 1.0); - T0 = -(T10 + T11 + T12); - - here->BSIM3v1cbgb = -(here->BSIM3v1cggb - + here->BSIM3v1cdgb + T10); - here->BSIM3v1cbdb = -(here->BSIM3v1cgdb - + here->BSIM3v1cddb + T12); - here->BSIM3v1cbsb = -(here->BSIM3v1cgsb - + here->BSIM3v1cdsb + T0); - } - } - else if (model->BSIM3v1xpart < 0.5) - { /* 40/60 Charge petition model */ - if (Vds >= Vdsat) - { /* saturation region */ - T1 = Vdsat / 3.0; - qgate = CoxWL * (Vgs_eff - Vfb - - pParam->BSIM3v1phi - T1); - T2 = -Two_Third_CoxWL * Vgst; - qbulk = -(qgate + T2); - qdrn = 0.4 * T2; - - here->BSIM3v1cggb = One_Third_CoxWL * (3.0 - - dVdsat_dVg) * dVgs_eff_dVg; - T2 = -One_Third_CoxWL * dVdsat_dVb; - here->BSIM3v1cgsb = -(here->BSIM3v1cggb + T2); - here->BSIM3v1cgdb = 0.0; - - T3 = 0.4 * Two_Third_CoxWL; - here->BSIM3v1cdgb = -T3 * dVgs_eff_dVg; - here->BSIM3v1cddb = 0.0; - T4 = T3 * dVth_dVb; - here->BSIM3v1cdsb = -(T4 + here->BSIM3v1cdgb); - - here->BSIM3v1cbgb = -(here->BSIM3v1cggb - - Two_Third_CoxWL * dVgs_eff_dVg); - T3 = -(T2 + Two_Third_CoxWL * dVth_dVb); - here->BSIM3v1cbsb = -(here->BSIM3v1cbgb + T3); - here->BSIM3v1cbdb = 0.0; - } - else - { /* linear region */ - Alphaz = Vgst / Vdsat; - T1 = 2.0 * Vdsat - Vds; - T2 = Vds / (3.0 * T1); - T3 = T2 * Vds; - T9 = 0.25 * CoxWL; - T4 = T9 * Alphaz; - qgate = CoxWL * (Vgs_eff - Vfb - pParam->BSIM3v1phi - - 0.5 * (Vds - T3)); - - T5 = T3 / T1; - here->BSIM3v1cggb = CoxWL * (1.0 - T5 * dVdsat_dVg) - * dVgs_eff_dVg; - tmp = -CoxWL * T5 * dVdsat_dVb; - here->BSIM3v1cgdb = CoxWL * (T2 - 0.5 + 0.5 * T5); - here->BSIM3v1cgsb = -(here->BSIM3v1cggb - + here->BSIM3v1cgdb + tmp); - - T6 = 1.0 / Vdsat; - dAlphaz_dVg = T6 * (1.0 - Alphaz * dVdsat_dVg); - dAlphaz_dVb = -T6 * (dVth_dVb + Alphaz * dVdsat_dVb); - - T6 = 8.0 * Vdsat * Vdsat - 6.0 * Vdsat * Vds - + 1.2 * Vds * Vds; - T8 = T2 / T1; - T7 = Vds - T1 - T8 * T6; - qdrn = T4 * T7; - T7 *= T9; - tmp = T8 / T1; - tmp1 = T4 * (2.0 - 4.0 * tmp * T6 - + T8 * (16.0 * Vdsat - 6.0 * Vds)); - - here->BSIM3v1cdgb = (T7 * dAlphaz_dVg - tmp1 - * dVdsat_dVg) * dVgs_eff_dVg; - T10 = T7 * dAlphaz_dVb - tmp1 * dVdsat_dVb; - here->BSIM3v1cddb = T4 * (2.0 - (1.0 / (3.0 * T1 - * T1) + 2.0 * tmp) * T6 + T8 - * (6.0 * Vdsat - 2.4 * Vds)); - here->BSIM3v1cdsb = -(here->BSIM3v1cdgb - + T10 + here->BSIM3v1cddb); - - T7 = 2.0 * (T1 + T3); - qbulk = -(qgate - T4 * T7); - T7 *= T9; - T0 = 4.0 * T4 * (1.0 - T5); - T12 = (-T7 * dAlphaz_dVg - here->BSIM3v1cdgb - - T0 * dVdsat_dVg) * dVgs_eff_dVg; - T11 = -T7 * dAlphaz_dVb - T10 - T0 * dVdsat_dVb; - T10 = -4.0 * T4 * (T2 - 0.5 + 0.5 * T5) - - here->BSIM3v1cddb; - tmp = -(T10 + T11 + T12); - - here->BSIM3v1cbgb = -(here->BSIM3v1cggb - + here->BSIM3v1cdgb + T12); - here->BSIM3v1cbdb = -(here->BSIM3v1cgdb - + here->BSIM3v1cddb + T11); - here->BSIM3v1cbsb = -(here->BSIM3v1cgsb - + here->BSIM3v1cdsb + tmp); - } - } - else - { /* 50/50 partitioning */ - if (Vds >= Vdsat) - { /* saturation region */ - T1 = Vdsat / 3.0; - qgate = CoxWL * (Vgs_eff - Vfb - - pParam->BSIM3v1phi - T1); - T2 = -Two_Third_CoxWL * Vgst; - qbulk = -(qgate + T2); - qdrn = 0.5 * T2; - - here->BSIM3v1cggb = One_Third_CoxWL * (3.0 - - dVdsat_dVg) * dVgs_eff_dVg; - T2 = -One_Third_CoxWL * dVdsat_dVb; - here->BSIM3v1cgsb = -(here->BSIM3v1cggb + T2); - here->BSIM3v1cgdb = 0.0; - - here->BSIM3v1cdgb = -One_Third_CoxWL * dVgs_eff_dVg; - here->BSIM3v1cddb = 0.0; - T4 = One_Third_CoxWL * dVth_dVb; - here->BSIM3v1cdsb = -(T4 + here->BSIM3v1cdgb); - - here->BSIM3v1cbgb = -(here->BSIM3v1cggb - - Two_Third_CoxWL * dVgs_eff_dVg); - T3 = -(T2 + Two_Third_CoxWL * dVth_dVb); - here->BSIM3v1cbsb = -(here->BSIM3v1cbgb + T3); - here->BSIM3v1cbdb = 0.0; - } - else - { /* linear region */ - Alphaz = Vgst / Vdsat; - T1 = 2.0 * Vdsat - Vds; - T2 = Vds / (3.0 * T1); - T3 = T2 * Vds; - T9 = 0.25 * CoxWL; - T4 = T9 * Alphaz; - qgate = CoxWL * (Vgs_eff - Vfb - pParam->BSIM3v1phi - - 0.5 * (Vds - T3)); - - T5 = T3 / T1; - here->BSIM3v1cggb = CoxWL * (1.0 - T5 * dVdsat_dVg) - * dVgs_eff_dVg; - tmp = -CoxWL * T5 * dVdsat_dVb; - here->BSIM3v1cgdb = CoxWL * (T2 - 0.5 + 0.5 * T5); - here->BSIM3v1cgsb = -(here->BSIM3v1cggb - + here->BSIM3v1cgdb + tmp); - - T6 = 1.0 / Vdsat; - dAlphaz_dVg = T6 * (1.0 - Alphaz * dVdsat_dVg); - dAlphaz_dVb = -T6 * (dVth_dVb + Alphaz * dVdsat_dVb); - - T7 = T1 + T3; - qdrn = -T4 * T7; - qbulk = - (qgate + qdrn + qdrn); - T7 *= T9; - T0 = T4 * (2.0 * T5 - 2.0); - - here->BSIM3v1cdgb = (T0 * dVdsat_dVg - T7 - * dAlphaz_dVg) * dVgs_eff_dVg; - T12 = T0 * dVdsat_dVb - T7 * dAlphaz_dVb; - here->BSIM3v1cddb = T4 * (1.0 - 2.0 * T2 - T5); - here->BSIM3v1cdsb = -(here->BSIM3v1cdgb + T12 - + here->BSIM3v1cddb); - - here->BSIM3v1cbgb = -(here->BSIM3v1cggb - + 2.0 * here->BSIM3v1cdgb); - here->BSIM3v1cbdb = -(here->BSIM3v1cgdb - + 2.0 * here->BSIM3v1cddb); - here->BSIM3v1cbsb = -(here->BSIM3v1cgsb - + 2.0 * here->BSIM3v1cdsb); - } - } - } - - } - else - { if (Vbseff < 0.0) - { VbseffCV = Vbseff; - dVbseffCV_dVb = 1.0; - } - else - { VbseffCV = pParam->BSIM3v1phi - Phis; - dVbseffCV_dVb = -dPhis_dVb; - } - - CoxWL = model->BSIM3v1cox * pParam->BSIM3v1weffCV - * pParam->BSIM3v1leffCV; - Vfb = Vth - pParam->BSIM3v1phi - pParam->BSIM3v1k1 * sqrtPhis; - - dVfb_dVb = dVth_dVb - pParam->BSIM3v1k1 * dsqrtPhis_dVb; - dVfb_dVd = dVth_dVd; - - if ((VgstNVt > -EXP_THRESHOLD) && (VgstNVt < EXP_THRESHOLD)) - { ExpVgst *= ExpVgst; - Vgsteff = n * Vtm * log(1.0 + ExpVgst); - dVgsteff_dVg = ExpVgst / (1.0 + ExpVgst); - dVgsteff_dVd = -dVgsteff_dVg * (dVth_dVd + (Vgs_eff - Vth) - / n * dn_dVd) + Vgsteff / n * dn_dVd; - dVgsteff_dVb = -dVgsteff_dVg * (dVth_dVb + (Vgs_eff - Vth) - / n * dn_dVb) + Vgsteff / n * dn_dVb; - dVgsteff_dVg *= dVgs_eff_dVg; - } - - if (model->BSIM3v1capMod == 1) - { Arg1 = Vgs_eff - VbseffCV - Vfb - Vgsteff; - - if (Arg1 <= 0.0) - { qgate = CoxWL * Arg1; - Cgg = CoxWL * (dVgs_eff_dVg - dVgsteff_dVg); - Cgd = -CoxWL * (dVfb_dVd + dVgsteff_dVd); - Cgb = -CoxWL * (dVfb_dVb + dVbseffCV_dVb + dVgsteff_dVb); - } - else - { T0 = 0.5 * pParam->BSIM3v1k1; - T1 = sqrt(T0 * T0 + Arg1); - T2 = CoxWL * T0 / T1; - - qgate = CoxWL * pParam->BSIM3v1k1 * (T1 - T0); - - Cgg = T2 * (dVgs_eff_dVg - dVgsteff_dVg); - Cgd = -T2 * (dVfb_dVd + dVgsteff_dVd); - Cgb = -T2 * (dVfb_dVb + dVbseffCV_dVb + dVgsteff_dVb); - } - qbulk = -qgate; - Cbg = -Cgg; - Cbd = -Cgd; - Cbb = -Cgb; - - One_Third_CoxWL = CoxWL / 3.0; - Two_Third_CoxWL = 2.0 * One_Third_CoxWL; - AbulkCV = Abulk0 * pParam->BSIM3v1abulkCVfactor; - dAbulkCV_dVb = pParam->BSIM3v1abulkCVfactor * dAbulk0_dVb; - VdsatCV = Vgsteff / AbulkCV; - if (VdsatCV < Vds) - { dVdsatCV_dVg = 1.0 / AbulkCV; - dVdsatCV_dVb = -VdsatCV * dAbulkCV_dVb / AbulkCV; - T0 = Vgsteff - VdsatCV / 3.0; - dT0_dVg = 1.0 - dVdsatCV_dVg / 3.0; - dT0_dVb = -dVdsatCV_dVb / 3.0; - qgate += CoxWL * T0; - Cgg1 = CoxWL * dT0_dVg; - Cgb1 = CoxWL * dT0_dVb + Cgg1 * dVgsteff_dVb; - Cgd1 = Cgg1 * dVgsteff_dVd; - Cgg1 *= dVgsteff_dVg; - Cgg += Cgg1; - Cgb += Cgb1; - Cgd += Cgd1; - - T0 = VdsatCV - Vgsteff; - dT0_dVg = dVdsatCV_dVg - 1.0; - dT0_dVb = dVdsatCV_dVb; - qbulk += One_Third_CoxWL * T0; - Cbg1 = One_Third_CoxWL * dT0_dVg; - Cbb1 = One_Third_CoxWL * dT0_dVb + Cbg1 * dVgsteff_dVb; - Cbd1 = Cbg1 * dVgsteff_dVd; - Cbg1 *= dVgsteff_dVg; - Cbg += Cbg1; - Cbb += Cbb1; - Cbd += Cbd1; - - if (model->BSIM3v1xpart > 0.5) - T0 = -Two_Third_CoxWL; - else if (model->BSIM3v1xpart < 0.5) - T0 = -0.4 * CoxWL; - else - T0 = -One_Third_CoxWL; - - qsrc = T0 * Vgsteff; - Csg = T0 * dVgsteff_dVg; - Csb = T0 * dVgsteff_dVb; - Csd = T0 * dVgsteff_dVd; - Cgb *= dVbseff_dVb; - Cbb *= dVbseff_dVb; - Csb *= dVbseff_dVb; - } - else - { T0 = AbulkCV * Vds; - T1 = 12.0 * (Vgsteff - 0.5 * T0 + 1.e-20); - T2 = Vds / T1; - T3 = T0 * T2; - dT3_dVg = -12.0 * T2 * T2 * AbulkCV; - dT3_dVd = 6.0 * T0 * (4.0 * Vgsteff - T0) / T1 / T1 - 0.5; - dT3_dVb = 12.0 * T2 * T2 * dAbulkCV_dVb * Vgsteff; - - qgate += CoxWL * (Vgsteff - 0.5 * Vds + T3); - Cgg1 = CoxWL * (1.0 + dT3_dVg); - Cgb1 = CoxWL * dT3_dVb + Cgg1 * dVgsteff_dVb; - Cgd1 = CoxWL * dT3_dVd + Cgg1 * dVgsteff_dVd; - Cgg1 *= dVgsteff_dVg; - Cgg += Cgg1; - Cgb += Cgb1; - Cgd += Cgd1; - - qbulk += CoxWL * (1.0 - AbulkCV) * (0.5 * Vds - T3); - Cbg1 = -CoxWL * ((1.0 - AbulkCV) * dT3_dVg); - Cbb1 = -CoxWL * ((1.0 - AbulkCV) * dT3_dVb - + (0.5 * Vds - T3) * dAbulkCV_dVb) - + Cbg1 * dVgsteff_dVb; - Cbd1 = -CoxWL * (1.0 - AbulkCV) * dT3_dVd - + Cbg1 * dVgsteff_dVd; - Cbg1 *= dVgsteff_dVg; - Cbg += Cbg1; - Cbb += Cbb1; - Cbd += Cbd1; - - if (model->BSIM3v1xpart > 0.5) - { /* 0/100 Charge petition model */ - T1 = T1 + T1; - qsrc = -CoxWL * (0.5 * Vgsteff + 0.25 * T0 - - T0 * T0 / T1); - Csg = -CoxWL * (0.5 + 24.0 * T0 * Vds / T1 / T1 - * AbulkCV); - Csb = -CoxWL * (0.25 * Vds * dAbulkCV_dVb - - 12.0 * T0 * Vds / T1 / T1 * (4.0 * Vgsteff - T0) - * dAbulkCV_dVb) + Csg * dVgsteff_dVb; - Csd = -CoxWL * (0.25 * AbulkCV - 12.0 * AbulkCV * T0 - / T1 / T1 * (4.0 * Vgsteff - T0)) - + Csg * dVgsteff_dVd; - Csg *= dVgsteff_dVg; - } - else if (model->BSIM3v1xpart < 0.5) - { /* 40/60 Charge petition model */ - T1 = T1 / 12.0; - T2 = 0.5 * CoxWL / (T1 * T1); - T3 = Vgsteff * (2.0 * T0 * T0 / 3.0 + Vgsteff - * (Vgsteff - 4.0 * T0 / 3.0)) - - 2.0 * T0 * T0 * T0 / 15.0; - qsrc = -T2 * T3; - T4 = 4.0 / 3.0 * Vgsteff * (Vgsteff - T0) - + 0.4 * T0 * T0; - Csg = -2.0 * qsrc / T1 - T2 * (Vgsteff * (3.0 - * Vgsteff - 8.0 * T0 / 3.0) - + 2.0 * T0 * T0 / 3.0); - Csb = (qsrc / T1 * Vds + T2 * T4 * Vds) * dAbulkCV_dVb - + Csg * dVgsteff_dVb; - Csd = (qsrc / T1 + T2 * T4) * AbulkCV - + Csg * dVgsteff_dVd; - Csg *= dVgsteff_dVg; - } - else - { /* 50/50 Charge petition model */ - qsrc = -0.5 * (qgate + qbulk); - Csg = -0.5 * (Cgg1 + Cbg1); - Csb = -0.5 * (Cgb1 + Cbb1); - Csd = -0.5 * (Cgd1 + Cbd1); - } - Cgb *= dVbseff_dVb; - Cbb *= dVbseff_dVb; - Csb *= dVbseff_dVb; - } - qdrn = -(qgate + qbulk + qsrc); - here->BSIM3v1cggb = Cgg; - here->BSIM3v1cgsb = -(Cgg + Cgd + Cgb); - here->BSIM3v1cgdb = Cgd; - here->BSIM3v1cdgb = -(Cgg + Cbg + Csg); - here->BSIM3v1cdsb = (Cgg + Cgd + Cgb + Cbg + Cbd + Cbb - + Csg + Csd + Csb); - here->BSIM3v1cddb = -(Cgd + Cbd + Csd); - here->BSIM3v1cbgb = Cbg; - here->BSIM3v1cbsb = -(Cbg + Cbd + Cbb); - here->BSIM3v1cbdb = Cbd; - } - else if (model->BSIM3v1capMod == 2) - - { V3 = Vfb - Vgs_eff + VbseffCV - DELTA_3; - if (Vfb <= 0.0) - { T0 = sqrt(V3 * V3 - 4.0 * DELTA_3 * Vfb); - T2 = -DELTA_3 / T0; - } - else - { T0 = sqrt(V3 * V3 + 4.0 * DELTA_3 * Vfb); - T2 = DELTA_3 / T0; - } - - T1 = 0.5 * (1.0 + V3 / T0); - Vfbeff = Vfb - 0.5 * (V3 + T0); - dVfbeff_dVd = (1.0 - T1 - T2) * dVfb_dVd; - dVfbeff_dVg = T1 * dVgs_eff_dVg; - dVfbeff_dVb = (1.0 - T1 - T2) * dVfb_dVb - - T1 * dVbseffCV_dVb; - Qac0 = CoxWL * (Vfbeff - Vfb); - dQac0_dVg = CoxWL * dVfbeff_dVg; - dQac0_dVd = CoxWL * (dVfbeff_dVd - dVfb_dVd); - dQac0_dVb = CoxWL * (dVfbeff_dVb - dVfb_dVb); - - T0 = 0.5 * pParam->BSIM3v1k1; - T3 = Vgs_eff - Vfbeff - VbseffCV - Vgsteff; - if (pParam->BSIM3v1k1 == 0.0) - { T1 = 0.0; - T2 = 0.0; - } - else if (T3 < 0.0) - { T1 = T0 + T3 / pParam->BSIM3v1k1; - T2 = CoxWL; - } - else - { T1 = sqrt(T0 * T0 + T3); - T2 = CoxWL * T0 / T1; - } - - Qsub0 = CoxWL * pParam->BSIM3v1k1 * (T1 - T0); - - dQsub0_dVg = T2 * (dVgs_eff_dVg - dVfbeff_dVg - dVgsteff_dVg); - dQsub0_dVd = -T2 * (dVfbeff_dVd + dVgsteff_dVd); - dQsub0_dVb = -T2 * (dVfbeff_dVb + dVbseffCV_dVb - + dVgsteff_dVb); - - One_Third_CoxWL = CoxWL / 3.0; - Two_Third_CoxWL = 2.0 * One_Third_CoxWL; - AbulkCV = Abulk0 * pParam->BSIM3v1abulkCVfactor; - dAbulkCV_dVb = pParam->BSIM3v1abulkCVfactor * dAbulk0_dVb; - VdsatCV = Vgsteff / AbulkCV; - - V4 = VdsatCV - Vds - DELTA_4; - T0 = sqrt(V4 * V4 + 4.0 * DELTA_4 * VdsatCV); - VdseffCV = VdsatCV - 0.5 * (V4 + T0); - T1 = 0.5 * (1.0 + V4 / T0); - T2 = DELTA_4 / T0; - T3 = (1.0 - T1 - T2) / AbulkCV; - dVdseffCV_dVg = T3; - dVdseffCV_dVd = T1; - dVdseffCV_dVb = -T3 * VdsatCV * dAbulkCV_dVb; - - T0 = AbulkCV * VdseffCV; - T1 = 12.0 * (Vgsteff - 0.5 * T0 + 1e-20); - T2 = VdseffCV / T1; - T3 = T0 * T2; - - T4 = (1.0 - 12.0 * T2 * T2 * AbulkCV); - T5 = (6.0 * T0 * (4.0 * Vgsteff - T0) / (T1 * T1) - 0.5); - T6 = 12.0 * T2 * T2 * Vgsteff; - - qgate = CoxWL * (Vgsteff - 0.5 * VdseffCV + T3); - Cgg1 = CoxWL * (T4 + T5 * dVdseffCV_dVg); - Cgd1 = CoxWL * T5 * dVdseffCV_dVd + Cgg1 * dVgsteff_dVd; - Cgb1 = CoxWL * (T5 * dVdseffCV_dVb + T6 * dAbulkCV_dVb) - + Cgg1 * dVgsteff_dVb; - Cgg1 *= dVgsteff_dVg; - - T7 = 1.0 - AbulkCV; - qbulk = CoxWL * T7 * (0.5 * VdseffCV - T3); - T4 = -T7 * (T4 - 1.0); - T5 = -T7 * T5; - T6 = -(T7 * T6 + (0.5 * VdseffCV - T3)); - Cbg1 = CoxWL * (T4 + T5 * dVdseffCV_dVg); - Cbd1 = CoxWL * T5 * dVdseffCV_dVd + Cbg1 * dVgsteff_dVd; - Cbb1 = CoxWL * (T5 * dVdseffCV_dVb + T6 * dAbulkCV_dVb) - + Cbg1 * dVgsteff_dVb; - Cbg1 *= dVgsteff_dVg; - - if (model->BSIM3v1xpart > 0.5) - { /* 0/100 Charge petition model */ - T1 = T1 + T1; - qsrc = -CoxWL * (0.5 * Vgsteff + 0.25 * T0 - - T0 * T0 / T1); - T7 = (4.0 * Vgsteff - T0) / (T1 * T1); - T4 = -(0.5 + 24.0 * T0 * T0 / (T1 * T1)); - T5 = -(0.25 * AbulkCV - 12.0 * AbulkCV * T0 * T7); - T6 = -(0.25 * VdseffCV - 12.0 * T0 * VdseffCV * T7); - Csg = CoxWL * (T4 + T5 * dVdseffCV_dVg); - Csd = CoxWL * T5 * dVdseffCV_dVd + Csg * dVgsteff_dVd; - Csb = CoxWL * (T5 * dVdseffCV_dVb + T6 * dAbulkCV_dVb) - + Csg * dVgsteff_dVb; - Csg *= dVgsteff_dVg; - } - else if (model->BSIM3v1xpart < 0.5) - { /* 40/60 Charge petition model */ - T1 = T1 / 12.0; - T2 = 0.5 * CoxWL / (T1 * T1); - T3 = Vgsteff * (2.0 * T0 * T0 / 3.0 + Vgsteff - * (Vgsteff - 4.0 * T0 / 3.0)) - - 2.0 * T0 * T0 * T0 / 15.0; - qsrc = -T2 * T3; - T7 = 4.0 / 3.0 * Vgsteff * (Vgsteff - T0) - + 0.4 * T0 * T0; - T4 = -2.0 * qsrc / T1 - T2 * (Vgsteff * (3.0 - * Vgsteff - 8.0 * T0 / 3.0) - + 2.0 * T0 * T0 / 3.0); - T5 = (qsrc / T1 + T2 * T7) * AbulkCV; - T6 = (qsrc / T1 * VdseffCV + T2 * T7 * VdseffCV); - Csg = (T4 + T5 * dVdseffCV_dVg); - Csd = T5 * dVdseffCV_dVd + Csg * dVgsteff_dVd; - Csb = (T5 * dVdseffCV_dVb + T6 * dAbulkCV_dVb) - + Csg * dVgsteff_dVb; - Csg *= dVgsteff_dVg; - } - else - { /* 50/50 Charge petition model */ - qsrc = -0.5 * (qgate + qbulk); - Csg = -0.5 * (Cgg1 + Cbg1); - Csb = -0.5 * (Cgb1 + Cbb1); - Csd = -0.5 * (Cgd1 + Cbd1); - } - - qgate += Qac0 + Qsub0; - qbulk -= (Qac0 + Qsub0); - qdrn = -(qgate + qbulk + qsrc); - - Cgg = dQac0_dVg + dQsub0_dVg + Cgg1; - Cgd = dQac0_dVd + dQsub0_dVd + Cgd1; - Cgb = dQac0_dVb + dQsub0_dVb + Cgb1; - - Cbg = Cbg1 - dQac0_dVg - dQsub0_dVg; - Cbd = Cbd1 - dQac0_dVd - dQsub0_dVd; - Cbb = Cbb1 - dQac0_dVb - dQsub0_dVb; - - Cgb *= dVbseff_dVb; - Cbb *= dVbseff_dVb; - Csb *= dVbseff_dVb; - - here->BSIM3v1cggb = Cgg; - here->BSIM3v1cgsb = -(Cgg + Cgd + Cgb); - here->BSIM3v1cgdb = Cgd; - here->BSIM3v1cdgb = -(Cgg + Cbg + Csg); - here->BSIM3v1cdsb = (Cgg + Cgd + Cgb + Cbg + Cbd + Cbb - + Csg + Csd + Csb); - here->BSIM3v1cddb = -(Cgd + Cbd + Csd); - here->BSIM3v1cbgb = Cbg; - here->BSIM3v1cbsb = -(Cbg + Cbd + Cbb); - here->BSIM3v1cbdb = Cbd; - - } -/* Non-quasi-static Model */ - - if (here->BSIM3v1nqsMod) - { - qcheq = -qbulk - qgate; - qbulk = qgate = qdrn = qsrc = 0.0; - - here->BSIM3v1cqgb = -(here->BSIM3v1cggb + here->BSIM3v1cbgb); - here->BSIM3v1cqdb = -(here->BSIM3v1cgdb + here->BSIM3v1cbdb); - here->BSIM3v1cqsb = -(here->BSIM3v1cgsb + here->BSIM3v1cbsb); - here->BSIM3v1cqbb = here->BSIM3v1cggb + here->BSIM3v1cgdb - + here->BSIM3v1cgsb + here->BSIM3v1cbgb - + here->BSIM3v1cbdb + here->BSIM3v1cbsb; - - here->BSIM3v1cggb = here->BSIM3v1cgsb = here->BSIM3v1cgdb = 0.0; - here->BSIM3v1cdgb = here->BSIM3v1cdsb = here->BSIM3v1cddb = 0.0; - here->BSIM3v1cbgb = here->BSIM3v1cbsb = here->BSIM3v1cbdb = 0.0; - - T0 = pParam->BSIM3v1leffCV * pParam->BSIM3v1leffCV; - here->BSIM3v1tconst = pParam->BSIM3v1u0temp * pParam->BSIM3v1elm - / CoxWL / T0; - - if (qcheq == 0.0) - here->BSIM3v1tconst = 0.0; - else if (qcheq < 0.0) - here->BSIM3v1tconst = -here->BSIM3v1tconst; - - gtau_drift = fabs(here->BSIM3v1tconst * qcheq); - gtau_diff = 16.0 * pParam->BSIM3v1u0temp * model->BSIM3v1vtm / T0; - - here->BSIM3v1gtau = gtau_drift + gtau_diff; - - *(ckt->CKTstate0 + here->BSIM3v1qcheq) = qcheq; - - if (ckt->CKTmode & MODEINITTRAN) - *(ckt->CKTstate1 + here->BSIM3v1qcheq) = - *(ckt->CKTstate0 + here->BSIM3v1qcheq); - - error = NIintegrate(ckt, &geq, &ceq, 0.0, here->BSIM3v1qcheq); - if (error) return (error); - } - else - { here->BSIM3v1cqgb = here->BSIM3v1cqdb = here->BSIM3v1cqsb - = here->BSIM3v1cqbb = 0.0; - here->BSIM3v1gtau = 0.0; - } - } - -finished: /* returning Values to Calling Routine */ - /* - * COMPUTE EQUIVALENT DRAIN CURRENT SOURCE - */ - here->BSIM3v1cd = here->BSIM3v1mode * cdrain - here->BSIM3v1cbd; - if (ChargeComputationNeeded) - { /* charge storage elements - * bulk-drain and bulk-source depletion capacitances - * czbd : zero bias drain junction capacitance - * czbs : zero bias source junction capacitance - * czbdsw: zero bias drain junction sidewall capacitance - along field oxide - * czbssw: zero bias source junction sidewall capacitance - along field oxide - * czbdswg: zero bias drain junction sidewall capacitance - along gate side - * czbsswg: zero bias source junction sidewall capacitance - along gate side - */ - - czbd = model->BSIM3v1unitAreaJctCap * here->BSIM3v1drainArea; - czbs = model->BSIM3v1unitAreaJctCap * here->BSIM3v1sourceArea; - if (here->BSIM3v1drainPerimeter < pParam->BSIM3v1weff) - { - czbdswg = model->BSIM3v1unitLengthGateSidewallJctCap - * here->BSIM3v1drainPerimeter; - czbdsw = 0.0; - } - else - { - czbdsw = model->BSIM3v1unitLengthSidewallJctCap - * (here->BSIM3v1drainPerimeter - pParam->BSIM3v1weff); - czbdswg = model->BSIM3v1unitLengthGateSidewallJctCap - * pParam->BSIM3v1weff; - } - if (here->BSIM3v1sourcePerimeter < pParam->BSIM3v1weff) - { - czbssw = 0.0; - czbsswg = model->BSIM3v1unitLengthGateSidewallJctCap - * here->BSIM3v1sourcePerimeter; - } - else - { - czbssw = model->BSIM3v1unitLengthSidewallJctCap - * (here->BSIM3v1sourcePerimeter - pParam->BSIM3v1weff); - czbsswg = model->BSIM3v1unitLengthGateSidewallJctCap - * pParam->BSIM3v1weff; - } - PhiB = model->BSIM3v1bulkJctPotential; - PhiBSW = model->BSIM3v1sidewallJctPotential; - PhiBSWG = model->BSIM3v1GatesidewallJctPotential; - MJ = model->BSIM3v1bulkJctBotGradingCoeff; - MJSW = model->BSIM3v1bulkJctSideGradingCoeff; - MJSWG = model->BSIM3v1bulkJctGateSideGradingCoeff; - - /* Source Bulk Junction */ - if (vbs == 0.0) - { *(ckt->CKTstate0 + here->BSIM3v1qbs) = 0.0; - here->BSIM3v1capbs = czbs + czbssw + czbsswg; - } - else if (vbs < 0.0) - { if (czbs > 0.0) - { arg = 1.0 - vbs / PhiB; - if (MJ == 0.5) - sarg = 1.0 / sqrt(arg); - else - sarg = exp(-MJ * log(arg)); - *(ckt->CKTstate0 + here->BSIM3v1qbs) = PhiB * czbs - * (1.0 - arg * sarg) / (1.0 - MJ); - here->BSIM3v1capbs = czbs * sarg; - } - else - { *(ckt->CKTstate0 + here->BSIM3v1qbs) = 0.0; - here->BSIM3v1capbs = 0.0; - } - if (czbssw > 0.0) - { arg = 1.0 - vbs / PhiBSW; - if (MJSW == 0.5) - sarg = 1.0 / sqrt(arg); - else - sarg = exp(-MJSW * log(arg)); - *(ckt->CKTstate0 + here->BSIM3v1qbs) += PhiBSW * czbssw - * (1.0 - arg * sarg) / (1.0 - MJSW); - here->BSIM3v1capbs += czbssw * sarg; - } - if (czbsswg > 0.0) - { arg = 1.0 - vbs / PhiBSWG; - if (MJSWG == 0.5) - sarg = 1.0 / sqrt(arg); - else - sarg = exp(-MJSWG * log(arg)); - *(ckt->CKTstate0 + here->BSIM3v1qbs) += PhiBSWG * czbsswg - * (1.0 - arg * sarg) / (1.0 - MJSWG); - here->BSIM3v1capbs += czbsswg * sarg; - } - - } - else - { *(ckt->CKTstate0+here->BSIM3v1qbs) = vbs * (czbs + czbssw - + czbsswg) + vbs * vbs * (czbs * MJ * 0.5 / PhiB - + czbssw * MJSW * 0.5 / PhiBSW - + czbsswg * MJSWG * 0.5 / PhiBSWG); - here->BSIM3v1capbs = czbs + czbssw + czbsswg + vbs * (czbs * MJ / - PhiB + czbssw * MJSW / PhiBSW + czbsswg * MJSWG / PhiBSWG); - } - - /* Drain Bulk Junction */ - if (vbd == 0.0) - { *(ckt->CKTstate0 + here->BSIM3v1qbd) = 0.0; - here->BSIM3v1capbd = czbd + czbdsw + czbdswg; - } - else if (vbd < 0.0) - { if (czbd > 0.0) - { arg = 1.0 - vbd / PhiB; - if (MJ == 0.5) - sarg = 1.0 / sqrt(arg); - else - sarg = exp(-MJ * log(arg)); - *(ckt->CKTstate0 + here->BSIM3v1qbd) = PhiB * czbd - * (1.0 - arg * sarg) / (1.0 - MJ); - here->BSIM3v1capbd = czbd * sarg; - } - else - { *(ckt->CKTstate0 + here->BSIM3v1qbd) = 0.0; - here->BSIM3v1capbd = 0.0; - } - if (czbdsw > 0.0) - { arg = 1.0 - vbd / PhiBSW; - if (MJSW == 0.5) - sarg = 1.0 / sqrt(arg); - else - sarg = exp(-MJSW * log(arg)); - *(ckt->CKTstate0 + here->BSIM3v1qbd) += PhiBSW * czbdsw - * (1.0 - arg * sarg) / (1.0 - MJSW); - here->BSIM3v1capbd += czbdsw * sarg; - } - if (czbdswg > 0.0) - { arg = 1.0 - vbd / PhiBSWG; - if (MJSWG == 0.5) - sarg = 1.0 / sqrt(arg); - else - sarg = exp(-MJSWG * log(arg)); - *(ckt->CKTstate0 + here->BSIM3v1qbd) += PhiBSWG * czbdswg - * (1.0 - arg * sarg) / (1.0 - MJSWG); - here->BSIM3v1capbd += czbdswg * sarg; - } - } - else - { *(ckt->CKTstate0+here->BSIM3v1qbd) = vbd * (czbd + czbdsw - + czbdswg) + vbd * vbd * (czbd * MJ * 0.5 / PhiB - + czbdsw * MJSW * 0.5 / PhiBSW - + czbdswg * MJSWG * 0.5 / PhiBSWG); - here->BSIM3v1capbd = czbd + czbdsw + czbdswg + vbd * (czbd * MJ / - PhiB + czbdsw * MJSW / PhiBSW + czbdswg * MJSWG / PhiBSWG); - } - } - - /* - * check convergence - */ - if ((here->BSIM3v1off == 0) || (!(ckt->CKTmode & MODEINITFIX))) - { if (Check == 1) - { ckt->CKTnoncon++; -#ifndef NEWCONV - } - else - { tol = ckt->CKTreltol * MAX(fabs(cdhat), fabs(here->BSIM3v1cd)) - + ckt->CKTabstol; - if (fabs(cdhat - here->BSIM3v1cd) >= tol) - { ckt->CKTnoncon++; - } - else - { tol = ckt->CKTreltol * MAX(fabs(cbhat), - fabs(here->BSIM3v1cbs + here->BSIM3v1cbd)) - + ckt->CKTabstol; - if (fabs(cbhat - (here->BSIM3v1cbs + here->BSIM3v1cbd)) - > tol) - { ckt->CKTnoncon++; - } - } -#endif /* NEWCONV */ - } - } - *(ckt->CKTstate0 + here->BSIM3v1vbs) = vbs; - *(ckt->CKTstate0 + here->BSIM3v1vbd) = vbd; - *(ckt->CKTstate0 + here->BSIM3v1vgs) = vgs; - *(ckt->CKTstate0 + here->BSIM3v1vds) = vds; - - /* bulk and channel charge plus overlaps */ - - if (!ChargeComputationNeeded) - goto line850; -#ifndef NOBYPASS -line755: -#endif - ag0 = ckt->CKTag[0]; - - if (model->BSIM3v1capMod == 0) - { - cgdo = pParam->BSIM3v1cgdo; - qgdo = pParam->BSIM3v1cgdo * vgd; - cgso = pParam->BSIM3v1cgso; - qgso = pParam->BSIM3v1cgso * vgs; - } - else if (model->BSIM3v1capMod == 1) - { if (vgd < 0.0) - { T1 = sqrt(1.0 - 4.0 * vgd / pParam->BSIM3v1ckappa); - cgdo = pParam->BSIM3v1cgdo + pParam->BSIM3v1weffCV - * pParam->BSIM3v1cgdl / T1; - qgdo = pParam->BSIM3v1cgdo * vgd - pParam->BSIM3v1weffCV * 0.5 - * pParam->BSIM3v1cgdl * pParam->BSIM3v1ckappa * (T1 - 1.0); - } - else - { cgdo = pParam->BSIM3v1cgdo + pParam->BSIM3v1weffCV - * pParam->BSIM3v1cgdl; - qgdo = (pParam->BSIM3v1weffCV * pParam->BSIM3v1cgdl - + pParam->BSIM3v1cgdo) * vgd; - } - - if (vgs < 0.0) - { T1 = sqrt(1.0 - 4.0 * vgs / pParam->BSIM3v1ckappa); - cgso = pParam->BSIM3v1cgso + pParam->BSIM3v1weffCV - * pParam->BSIM3v1cgsl / T1; - qgso = pParam->BSIM3v1cgso * vgs - pParam->BSIM3v1weffCV * 0.5 - * pParam->BSIM3v1cgsl * pParam->BSIM3v1ckappa * (T1 - 1.0); - } - else - { cgso = pParam->BSIM3v1cgso + pParam->BSIM3v1weffCV - * pParam->BSIM3v1cgsl; - qgso = (pParam->BSIM3v1weffCV * pParam->BSIM3v1cgsl - + pParam->BSIM3v1cgso) * vgs; - } - } - else - { T0 = vgd + DELTA_1; - T1 = sqrt(T0 * T0 + 4.0 * DELTA_1); - T2 = 0.5 * (T0 - T1); - - T3 = pParam->BSIM3v1weffCV * pParam->BSIM3v1cgdl; - T4 = sqrt(1.0 - 4.0 * T2 / pParam->BSIM3v1ckappa); - cgdo = pParam->BSIM3v1cgdo + T3 - T3 * (1.0 - 1.0 / T4) - * (0.5 - 0.5 * T0 / T1); - qgdo = (pParam->BSIM3v1cgdo + T3) * vgd - T3 * (T2 - + 0.5 * pParam->BSIM3v1ckappa * (T4 - 1.0)); - - T0 = vgs + DELTA_1; - T1 = sqrt(T0 * T0 + 4.0 * DELTA_1); - T2 = 0.5 * (T0 - T1); - T3 = pParam->BSIM3v1weffCV * pParam->BSIM3v1cgsl; - T4 = sqrt(1.0 - 4.0 * T2 / pParam->BSIM3v1ckappa); - cgso = pParam->BSIM3v1cgso + T3 - T3 * (1.0 - 1.0 / T4) - * (0.5 - 0.5 * T0 / T1); - qgso = (pParam->BSIM3v1cgso + T3) * vgs - T3 * (T2 - + 0.5 * pParam->BSIM3v1ckappa * (T4 - 1.0)); - } - - if (here->BSIM3v1mode > 0) - { gcdgb = (here->BSIM3v1cdgb - cgdo) * ag0; - gcddb = (here->BSIM3v1cddb + here->BSIM3v1capbd + cgdo) * ag0; - gcdsb = here->BSIM3v1cdsb * ag0; - gcsgb = -(here->BSIM3v1cggb + here->BSIM3v1cbgb + here->BSIM3v1cdgb - + cgso) * ag0; - gcsdb = -(here->BSIM3v1cgdb + here->BSIM3v1cbdb + here->BSIM3v1cddb) - * ag0; - gcssb = (here->BSIM3v1capbs + cgso - (here->BSIM3v1cgsb - + here->BSIM3v1cbsb + here->BSIM3v1cdsb)) * ag0; - gcggb = (here->BSIM3v1cggb + cgdo + cgso + pParam->BSIM3v1cgbo ) * ag0; - gcgdb = (here->BSIM3v1cgdb - cgdo) * ag0; - gcgsb = (here->BSIM3v1cgsb - cgso) * ag0; - gcbgb = (here->BSIM3v1cbgb - pParam->BSIM3v1cgbo) * ag0; - gcbdb = (here->BSIM3v1cbdb - here->BSIM3v1capbd) * ag0; - gcbsb = (here->BSIM3v1cbsb - here->BSIM3v1capbs) * ag0; - - gcqgb = here->BSIM3v1cqgb * ag0; - gcqdb = here->BSIM3v1cqdb * ag0; - gcqsb = here->BSIM3v1cqsb * ag0; - gcqbb = here->BSIM3v1cqbb * ag0; - - T0 = here->BSIM3v1tconst * qdef; - here->BSIM3v1gtg = T0 * here->BSIM3v1cqgb; - here->BSIM3v1gtb = T0 * here->BSIM3v1cqbb; - here->BSIM3v1gtd = T0 * here->BSIM3v1cqdb; - here->BSIM3v1gts = T0 * here->BSIM3v1cqsb; - - sxpart = 0.6; - dxpart = 0.4; - - /* compute total terminal charge */ - qgd = qgdo; - qgs = qgso; - qgb = pParam->BSIM3v1cgbo * vgb; - qgate += qgd + qgs + qgb; - qbulk -= qgb; - qdrn -= qgd; - qsrc = -(qgate + qbulk + qdrn); - } - else - { gcsgb = (here->BSIM3v1cdgb - cgso) * ag0; - gcsdb = here->BSIM3v1cdsb * ag0; - gcssb = (here->BSIM3v1cddb + here->BSIM3v1capbs + cgso) * ag0; - - gcdgb = -(here->BSIM3v1cggb + here->BSIM3v1cbgb + here->BSIM3v1cdgb - + cgdo) * ag0; - gcdsb = -(here->BSIM3v1cgdb + here->BSIM3v1cbdb + here->BSIM3v1cddb) - * ag0; - gcddb = (here->BSIM3v1capbd + cgdo - (here->BSIM3v1cgsb - + here->BSIM3v1cbsb + here->BSIM3v1cdsb)) * ag0; - gcggb = (here->BSIM3v1cggb + cgdo + cgso + pParam->BSIM3v1cgbo ) * ag0; - gcgdb = (here->BSIM3v1cgsb - cgdo) * ag0; - gcgsb = (here->BSIM3v1cgdb - cgso) * ag0; - gcbgb = (here->BSIM3v1cbgb - pParam->BSIM3v1cgbo) * ag0; - gcbdb = (here->BSIM3v1cbsb - here->BSIM3v1capbd) * ag0; - gcbsb = (here->BSIM3v1cbdb - here->BSIM3v1capbs) * ag0; - - gcqgb = here->BSIM3v1cqgb * ag0; - gcqdb = here->BSIM3v1cqsb * ag0; - gcqsb = here->BSIM3v1cqdb * ag0; - gcqbb = here->BSIM3v1cqbb * ag0; - - T0 = here->BSIM3v1tconst * qdef; - here->BSIM3v1gtg = T0 * here->BSIM3v1cqgb; - here->BSIM3v1gtb = T0 * here->BSIM3v1cqbb; - here->BSIM3v1gtd = T0 * here->BSIM3v1cqdb; - here->BSIM3v1gts = T0 * here->BSIM3v1cqsb; - - dxpart = 0.6; - sxpart = 0.4; - - /* compute total terminal charge */ - qgd = qgdo; - qgs = qgso; - qgb = pParam->BSIM3v1cgbo * vgb; - qgate += qgd + qgs + qgb; - qbulk -= qgb; - qsrc = qdrn - qgs; - qdrn = -(qgate + qbulk + qsrc); - } - - here->BSIM3v1cgdo = cgdo; - here->BSIM3v1cgso = cgso; - -/* added by Mansun 11/1/93 */ - - - if (here->BSIM3v1nqsMod) - { *(ckt->CKTstate0 + here->BSIM3v1qcdump) = qdef; - - if (ckt->CKTmode & MODEINITTRAN) - *(ckt->CKTstate1 + here->BSIM3v1qcdump) = - *(ckt->CKTstate0 + here->BSIM3v1qcdump); - - error = NIintegrate(ckt, &gqdef, &cqdef, 1.0, here->BSIM3v1qcdump); - if (error) return (error); - } - else - { gqdef = cqdef = 0.0; - } - - if (ByPass) goto line860; - -/* End added by Mansun 11/1/93 */ - - *(ckt->CKTstate0 + here->BSIM3v1qg) = qgate; - *(ckt->CKTstate0 + here->BSIM3v1qd) = qdrn - - *(ckt->CKTstate0 + here->BSIM3v1qbd); - *(ckt->CKTstate0 + here->BSIM3v1qb) = qbulk - + *(ckt->CKTstate0 + here->BSIM3v1qbd) - + *(ckt->CKTstate0 + here->BSIM3v1qbs); - - /* store small signal parameters */ - if (ckt->CKTmode & MODEINITSMSIG) - { goto line1000; - } - if (!ChargeComputationNeeded) - goto line850; - - if (ckt->CKTmode & MODEINITTRAN) - { *(ckt->CKTstate1 + here->BSIM3v1qb) = - *(ckt->CKTstate0 + here->BSIM3v1qb); - *(ckt->CKTstate1 + here->BSIM3v1qg) = - *(ckt->CKTstate0 + here->BSIM3v1qg); - *(ckt->CKTstate1 + here->BSIM3v1qd) = - *(ckt->CKTstate0 + here->BSIM3v1qd); - } - - error = NIintegrate(ckt, &geq, &ceq, 0.0, here->BSIM3v1qb); - if (error) - return(error); - error = NIintegrate(ckt, &geq, &ceq, 0.0, here->BSIM3v1qg); - if (error) - return(error); - error = NIintegrate(ckt,&geq, &ceq, 0.0, here->BSIM3v1qd); - if (error) - return(error); - - goto line860; - -line850: - /* initialize to zero charge conductance and current */ - ceqqg = ceqqb = ceqqd = 0.0; - - cqcheq = cqdef = 0.0; - - gcdgb = gcddb = gcdsb = 0.0; - gcsgb = gcsdb = gcssb = 0.0; - gcggb = gcgdb = gcgsb = 0.0; - gcbgb = gcbdb = gcbsb = 0.0; - - gcqgb = gcqdb = gcqsb = gcqbb = 0.0; - here->BSIM3v1gtg = here->BSIM3v1gtd = here->BSIM3v1gts = here->BSIM3v1gtb = 0.0; - gqdef = 0.0; - sxpart = (1.0 - (dxpart = (here->BSIM3v1mode > 0) ? 0.4 : 0.6)); - if (here->BSIM3v1nqsMod) - here->BSIM3v1gtau = 16.0 * pParam->BSIM3v1u0temp * model->BSIM3v1vtm - / Leff / Leff; - else - here->BSIM3v1gtau = 0.0; - - goto line900; - -line860: - /* evaluate equivalent charge current */ - - cqgate = *(ckt->CKTstate0 + here->BSIM3v1cqg); - cqbulk = *(ckt->CKTstate0 + here->BSIM3v1cqb); - cqdrn = *(ckt->CKTstate0 + here->BSIM3v1cqd); - - ceqqg = cqgate - gcggb * vgb + gcgdb * vbd + gcgsb * vbs - + (here->BSIM3v1gtg * vgb - here->BSIM3v1gtd * vbd - here->BSIM3v1gts * vbs); - ceqqb = cqbulk - gcbgb * vgb + gcbdb * vbd + gcbsb * vbs; - ceqqd = cqdrn - gcdgb * vgb + gcddb * vbd + gcdsb * vbs - - dxpart * (here->BSIM3v1gtg * vgb - here->BSIM3v1gtd * vbd - - here->BSIM3v1gts * vbs); - - cqcheq = *(ckt->CKTstate0 + here->BSIM3v1cqcheq) - - (gcqgb * vgb - gcqdb * vbd - gcqsb * vbs) - + (here->BSIM3v1gtg * vgb - here->BSIM3v1gtd * vbd - here->BSIM3v1gts * vbs); - - if (ckt->CKTmode & MODEINITTRAN) - { *(ckt->CKTstate1 + here->BSIM3v1cqb) = - *(ckt->CKTstate0 + here->BSIM3v1cqb); - *(ckt->CKTstate1 + here->BSIM3v1cqg) = - *(ckt->CKTstate0 + here->BSIM3v1cqg); - *(ckt->CKTstate1 + here->BSIM3v1cqd) = - *(ckt->CKTstate0 + here->BSIM3v1cqd); - *(ckt->CKTstate1 + here->BSIM3v1cqcheq) = - *(ckt->CKTstate0 + here->BSIM3v1cqcheq); - *(ckt->CKTstate1 + here->BSIM3v1cqcdump) = - *(ckt->CKTstate0 + here->BSIM3v1cqcdump); - } - - /* - * load current vector - */ -line900: - - if (here->BSIM3v1mode >= 0) - { Gm = here->BSIM3v1gm; - Gmbs = here->BSIM3v1gmbs; - FwdSum = Gm + Gmbs; - RevSum = 0.0; - cdreq = model->BSIM3v1type * (cdrain - here->BSIM3v1gds * vds - - Gm * vgs - Gmbs * vbs); - ceqbs = -here->BSIM3v1csub; - ceqbd = 0.0; - - gbspsp = -here->BSIM3v1gbds - here->BSIM3v1gbgs - here->BSIM3v1gbbs; - gbbdp = -here->BSIM3v1gbds; - gbbsp = here->BSIM3v1gbds + here->BSIM3v1gbgs + here->BSIM3v1gbbs; - gbspg = here->BSIM3v1gbgs; - gbspb = here->BSIM3v1gbbs; - gbspdp = here->BSIM3v1gbds; - gbdpdp = 0.0; - gbdpg = 0.0; - gbdpb = 0.0; - gbdpsp = 0.0; - } - else - { Gm = -here->BSIM3v1gm; - Gmbs = -here->BSIM3v1gmbs; - FwdSum = 0.0; - RevSum = -(Gm + Gmbs); - cdreq = -model->BSIM3v1type * (cdrain + here->BSIM3v1gds * vds - + Gm * vgd + Gmbs * vbd); - ceqbs = 0.0; - ceqbd = -here->BSIM3v1csub; - - gbspsp = 0.0; - gbbdp = here->BSIM3v1gbds + here->BSIM3v1gbgs + here->BSIM3v1gbbs; - gbbsp = -here->BSIM3v1gbds; - gbspg = 0.0; - gbspb = 0.0; - gbspdp = 0.0; - gbdpdp = -here->BSIM3v1gbds - here->BSIM3v1gbgs - here->BSIM3v1gbbs; - gbdpg = here->BSIM3v1gbgs; - gbdpb = here->BSIM3v1gbbs; - gbdpsp = here->BSIM3v1gbds; - } - - if (model->BSIM3v1type > 0) - { ceqbs += (here->BSIM3v1cbs - (here->BSIM3v1gbs - ckt->CKTgmin) * vbs); - ceqbd += (here->BSIM3v1cbd - (here->BSIM3v1gbd - ckt->CKTgmin) * vbd); - /* - ceqqg = ceqqg; - ceqqb = ceqqb; - ceqqd = ceqqd; - cqcheq = cqcheq; - */ - } - else - { ceqbs = -ceqbs - (here->BSIM3v1cbs - (here->BSIM3v1gbs - - ckt->CKTgmin) * vbs); - ceqbd = -ceqbd - (here->BSIM3v1cbd - (here->BSIM3v1gbd - - ckt->CKTgmin) * vbd); - ceqqg = -ceqqg; - ceqqb = -ceqqb; - ceqqd = -ceqqd; - cqcheq = -cqcheq; - } - - (*(ckt->CKTrhs + here->BSIM3v1gNode) -= m * ceqqg); - (*(ckt->CKTrhs + here->BSIM3v1bNode) -= m * (ceqbs + ceqbd + ceqqb)); - (*(ckt->CKTrhs + here->BSIM3v1dNodePrime) += m * (ceqbd - cdreq - ceqqd)); - (*(ckt->CKTrhs + here->BSIM3v1sNodePrime) += m * (cdreq + ceqbs + ceqqg - + ceqqb + ceqqd)); - - *(ckt->CKTrhs + here->BSIM3v1qNode) += m * (cqcheq - cqdef); - - /* - * load y matrix - */ - - (*(here->BSIM3v1DdPtr) += m * here->BSIM3v1drainConductance); - (*(here->BSIM3v1GgPtr) += m * (gcggb - here->BSIM3v1gtg)); - (*(here->BSIM3v1SsPtr) += m * here->BSIM3v1sourceConductance); - (*(here->BSIM3v1BbPtr) += m * ((here->BSIM3v1gbd + here->BSIM3v1gbs - - gcbgb - gcbdb - gcbsb) - here->BSIM3v1gbbs)); - (*(here->BSIM3v1DPdpPtr) += m * ((here->BSIM3v1drainConductance - + here->BSIM3v1gds + here->BSIM3v1gbd - + RevSum + gcddb) + dxpart * here->BSIM3v1gtd + gbdpdp)); - (*(here->BSIM3v1SPspPtr) += m * ((here->BSIM3v1sourceConductance - + here->BSIM3v1gds + here->BSIM3v1gbs - + FwdSum + gcssb) + sxpart * here->BSIM3v1gts + gbspsp)); - (*(here->BSIM3v1DdpPtr) -= m * here->BSIM3v1drainConductance); - (*(here->BSIM3v1GbPtr) -= m * (gcggb + gcgdb + gcgsb + here->BSIM3v1gtb)); - (*(here->BSIM3v1GdpPtr) += m * (gcgdb - here->BSIM3v1gtd)); - (*(here->BSIM3v1GspPtr) += m * (gcgsb - here->BSIM3v1gts)); - (*(here->BSIM3v1SspPtr) -= m * here->BSIM3v1sourceConductance); - (*(here->BSIM3v1BgPtr) += m * (gcbgb - here->BSIM3v1gbgs)); - (*(here->BSIM3v1BdpPtr) += m * (gcbdb - here->BSIM3v1gbd + gbbdp)); - (*(here->BSIM3v1BspPtr) += m * (gcbsb - here->BSIM3v1gbs + gbbsp)); - (*(here->BSIM3v1DPdPtr) -= m * here->BSIM3v1drainConductance); - (*(here->BSIM3v1DPgPtr) += m * ((Gm + gcdgb) + dxpart * - here->BSIM3v1gtg + gbdpg)); - (*(here->BSIM3v1DPbPtr) -= m * ((here->BSIM3v1gbd - Gmbs + gcdgb + gcddb - + gcdsb - dxpart * here->BSIM3v1gtb) - gbdpb)); - (*(here->BSIM3v1DPspPtr) -= m * ((here->BSIM3v1gds + FwdSum - gcdsb - - dxpart * here->BSIM3v1gts) - gbdpsp)); - (*(here->BSIM3v1SPgPtr) += m * (gcsgb - Gm + sxpart * - here->BSIM3v1gtg + gbspg)); - (*(here->BSIM3v1SPsPtr) -= m * here->BSIM3v1sourceConductance); - (*(here->BSIM3v1SPbPtr) -= m * ((here->BSIM3v1gbs + Gmbs + gcsgb + gcsdb - + gcssb - sxpart * here->BSIM3v1gtb) - gbspb)); - (*(here->BSIM3v1SPdpPtr) -= m * ((here->BSIM3v1gds + RevSum - gcsdb - - sxpart * here->BSIM3v1gtd - here->BSIM3v1gbd) - gbspdp)); - - *(here->BSIM3v1QqPtr) += m * ((gqdef + here->BSIM3v1gtau)); - - *(here->BSIM3v1DPqPtr) += m * ((dxpart * here->BSIM3v1gtau)); - *(here->BSIM3v1SPqPtr) += m * ((sxpart * here->BSIM3v1gtau)); - *(here->BSIM3v1GqPtr) -= m * here->BSIM3v1gtau; - - *(here->BSIM3v1QgPtr) += m * (-gcqgb + here->BSIM3v1gtg); - *(here->BSIM3v1QdpPtr) += m * (-gcqdb + here->BSIM3v1gtd); - *(here->BSIM3v1QspPtr) += m * (-gcqsb + here->BSIM3v1gts); - *(here->BSIM3v1QbPtr) += m * (-gcqbb + here->BSIM3v1gtb); - -line1000: ; - - } /* End of Mosfet Instance */ -} /* End of Model Instance */ - -return(OK); -} - - - diff --git a/src/spicelib/devices/bsim3v1/b3v1mask.c b/src/spicelib/devices/bsim3v1/b3v1mask.c deleted file mode 100644 index 3cd356924..000000000 --- a/src/spicelib/devices/bsim3v1/b3v1mask.c +++ /dev/null @@ -1,1131 +0,0 @@ -/********** - * Copyright 1990 Regents of the University of California. All rights reserved. - * File: b3v1mask.c - * Author: 1995 Min-Chie Jeng and Mansun Chan. - * Modified by Paolo Nenzi 2002 - **********/ - -/* - * Release Notes: - * BSIM3v3.1, Released by yuhua 96/12/08 - */ - -#include "ngspice/ngspice.h" -#include "ngspice/ifsim.h" -#include "ngspice/cktdefs.h" -#include "ngspice/devdefs.h" -#include "bsim3v1def.h" -#include "ngspice/sperror.h" -#include "ngspice/suffix.h" - -int -BSIM3v1mAsk(CKTcircuit *ckt, GENmodel *inst, int which, IFvalue *value) -{ - BSIM3v1model *model = (BSIM3v1model *)inst; - - NG_IGNORE(ckt); - - switch(which) - { case BSIM3v1_MOD_MOBMOD: - value->iValue = model->BSIM3v1mobMod; - return(OK); - case BSIM3v1_MOD_PARAMCHK: - value->iValue = model->BSIM3v1paramChk; - return(OK); - case BSIM3v1_MOD_BINUNIT: - value->iValue = model->BSIM3v1binUnit; - return(OK); - case BSIM3v1_MOD_CAPMOD: - value->iValue = model->BSIM3v1capMod; - return(OK); - case BSIM3v1_MOD_NQSMOD: - value->iValue = model->BSIM3v1nqsMod; - return(OK); - case BSIM3v1_MOD_NOIMOD: - value->iValue = model->BSIM3v1noiMod; - return(OK); - case BSIM3v1_MOD_VERSION : - value->rValue = model->BSIM3v1version; - return(OK); - case BSIM3v1_MOD_TOX : - value->rValue = model->BSIM3v1tox; - return(OK); - case BSIM3v1_MOD_CDSC : - value->rValue = model->BSIM3v1cdsc; - return(OK); - case BSIM3v1_MOD_CDSCB : - value->rValue = model->BSIM3v1cdscb; - return(OK); - - case BSIM3v1_MOD_CDSCD : - value->rValue = model->BSIM3v1cdscd; - return(OK); - - case BSIM3v1_MOD_CIT : - value->rValue = model->BSIM3v1cit; - return(OK); - case BSIM3v1_MOD_NFACTOR : - value->rValue = model->BSIM3v1nfactor; - return(OK); - case BSIM3v1_MOD_XJ: - value->rValue = model->BSIM3v1xj; - return(OK); - case BSIM3v1_MOD_VSAT: - value->rValue = model->BSIM3v1vsat; - return(OK); - case BSIM3v1_MOD_AT: - value->rValue = model->BSIM3v1at; - return(OK); - case BSIM3v1_MOD_A0: - value->rValue = model->BSIM3v1a0; - return(OK); - - case BSIM3v1_MOD_AGS: - value->rValue = model->BSIM3v1ags; - return(OK); - - case BSIM3v1_MOD_A1: - value->rValue = model->BSIM3v1a1; - return(OK); - case BSIM3v1_MOD_A2: - value->rValue = model->BSIM3v1a2; - return(OK); - case BSIM3v1_MOD_KETA: - value->rValue = model->BSIM3v1keta; - return(OK); - case BSIM3v1_MOD_NSUB: - value->rValue = model->BSIM3v1nsub; - return(OK); - case BSIM3v1_MOD_NPEAK: - value->rValue = model->BSIM3v1npeak; - return(OK); - case BSIM3v1_MOD_NGATE: - value->rValue = model->BSIM3v1ngate; - return(OK); - case BSIM3v1_MOD_GAMMA1: - value->rValue = model->BSIM3v1gamma1; - return(OK); - case BSIM3v1_MOD_GAMMA2: - value->rValue = model->BSIM3v1gamma2; - return(OK); - case BSIM3v1_MOD_VBX: - value->rValue = model->BSIM3v1vbx; - return(OK); - case BSIM3v1_MOD_VBM: - value->rValue = model->BSIM3v1vbm; - return(OK); - case BSIM3v1_MOD_XT: - value->rValue = model->BSIM3v1xt; - return(OK); - case BSIM3v1_MOD_K1: - value->rValue = model->BSIM3v1k1; - return(OK); - case BSIM3v1_MOD_KT1: - value->rValue = model->BSIM3v1kt1; - return(OK); - case BSIM3v1_MOD_KT1L: - value->rValue = model->BSIM3v1kt1l; - return(OK); - case BSIM3v1_MOD_KT2 : - value->rValue = model->BSIM3v1kt2; - return(OK); - case BSIM3v1_MOD_K2 : - value->rValue = model->BSIM3v1k2; - return(OK); - case BSIM3v1_MOD_K3: - value->rValue = model->BSIM3v1k3; - return(OK); - case BSIM3v1_MOD_K3B: - value->rValue = model->BSIM3v1k3b; - return(OK); - case BSIM3v1_MOD_W0: - value->rValue = model->BSIM3v1w0; - return(OK); - case BSIM3v1_MOD_NLX: - value->rValue = model->BSIM3v1nlx; - return(OK); - case BSIM3v1_MOD_DVT0 : - value->rValue = model->BSIM3v1dvt0; - return(OK); - case BSIM3v1_MOD_DVT1 : - value->rValue = model->BSIM3v1dvt1; - return(OK); - case BSIM3v1_MOD_DVT2 : - value->rValue = model->BSIM3v1dvt2; - return(OK); - case BSIM3v1_MOD_DVT0W : - value->rValue = model->BSIM3v1dvt0w; - return(OK); - case BSIM3v1_MOD_DVT1W : - value->rValue = model->BSIM3v1dvt1w; - return(OK); - case BSIM3v1_MOD_DVT2W : - value->rValue = model->BSIM3v1dvt2w; - return(OK); - case BSIM3v1_MOD_DROUT : - value->rValue = model->BSIM3v1drout; - return(OK); - case BSIM3v1_MOD_DSUB : - value->rValue = model->BSIM3v1dsub; - return(OK); - case BSIM3v1_MOD_VTH0: - value->rValue = model->BSIM3v1vth0; - return(OK); - case BSIM3v1_MOD_UA: - value->rValue = model->BSIM3v1ua; - return(OK); - case BSIM3v1_MOD_UA1: - value->rValue = model->BSIM3v1ua1; - return(OK); - case BSIM3v1_MOD_UB: - value->rValue = model->BSIM3v1ub; - return(OK); - case BSIM3v1_MOD_UB1: - value->rValue = model->BSIM3v1ub1; - return(OK); - case BSIM3v1_MOD_UC: - value->rValue = model->BSIM3v1uc; - return(OK); - case BSIM3v1_MOD_UC1: - value->rValue = model->BSIM3v1uc1; - return(OK); - case BSIM3v1_MOD_U0: - value->rValue = model->BSIM3v1u0; - return(OK); - case BSIM3v1_MOD_UTE: - value->rValue = model->BSIM3v1ute; - return(OK); - case BSIM3v1_MOD_VOFF: - value->rValue = model->BSIM3v1voff; - return(OK); - case BSIM3v1_MOD_DELTA: - value->rValue = model->BSIM3v1delta; - return(OK); - case BSIM3v1_MOD_RDSW: - value->rValue = model->BSIM3v1rdsw; - return(OK); - case BSIM3v1_MOD_PRWG: - value->rValue = model->BSIM3v1prwg; - return(OK); - case BSIM3v1_MOD_PRWB: - value->rValue = model->BSIM3v1prwb; - return(OK); - case BSIM3v1_MOD_PRT: - value->rValue = model->BSIM3v1prt; - return(OK); - case BSIM3v1_MOD_ETA0: - value->rValue = model->BSIM3v1eta0; - return(OK); - case BSIM3v1_MOD_ETAB: - value->rValue = model->BSIM3v1etab; - return(OK); - case BSIM3v1_MOD_PCLM: - value->rValue = model->BSIM3v1pclm; - return(OK); - case BSIM3v1_MOD_PDIBL1: - value->rValue = model->BSIM3v1pdibl1; - return(OK); - case BSIM3v1_MOD_PDIBL2: - value->rValue = model->BSIM3v1pdibl2; - return(OK); - case BSIM3v1_MOD_PDIBLB: - value->rValue = model->BSIM3v1pdiblb; - return(OK); - case BSIM3v1_MOD_PSCBE1: - value->rValue = model->BSIM3v1pscbe1; - return(OK); - case BSIM3v1_MOD_PSCBE2: - value->rValue = model->BSIM3v1pscbe2; - return(OK); - case BSIM3v1_MOD_PVAG: - value->rValue = model->BSIM3v1pvag; - return(OK); - case BSIM3v1_MOD_WR: - value->rValue = model->BSIM3v1wr; - return(OK); - case BSIM3v1_MOD_DWG: - value->rValue = model->BSIM3v1dwg; - return(OK); - case BSIM3v1_MOD_DWB: - value->rValue = model->BSIM3v1dwb; - return(OK); - case BSIM3v1_MOD_B0: - value->rValue = model->BSIM3v1b0; - return(OK); - case BSIM3v1_MOD_B1: - value->rValue = model->BSIM3v1b1; - return(OK); - case BSIM3v1_MOD_ALPHA0: - value->rValue = model->BSIM3v1alpha0; - return(OK); - case BSIM3v1_MOD_BETA0: - value->rValue = model->BSIM3v1beta0; - return(OK); - - case BSIM3v1_MOD_ELM: - value->rValue = model->BSIM3v1elm; - return(OK); - case BSIM3v1_MOD_CGSL: - value->rValue = model->BSIM3v1cgsl; - return(OK); - case BSIM3v1_MOD_CGDL: - value->rValue = model->BSIM3v1cgdl; - return(OK); - case BSIM3v1_MOD_CKAPPA: - value->rValue = model->BSIM3v1ckappa; - return(OK); - case BSIM3v1_MOD_CF: - value->rValue = model->BSIM3v1cf; - return(OK); - case BSIM3v1_MOD_CLC: - value->rValue = model->BSIM3v1clc; - return(OK); - case BSIM3v1_MOD_CLE: - value->rValue = model->BSIM3v1cle; - return(OK); - case BSIM3v1_MOD_DWC: - value->rValue = model->BSIM3v1dwc; - return(OK); - case BSIM3v1_MOD_DLC: - value->rValue = model->BSIM3v1dlc; - return(OK); - case BSIM3v1_MOD_VFBCV: - value->rValue = model->BSIM3v1vfbcv; - return(OK); - - /* Length dependence */ - case BSIM3v1_MOD_LCDSC : - value->rValue = model->BSIM3v1lcdsc; - return(OK); - case BSIM3v1_MOD_LCDSCB : - value->rValue = model->BSIM3v1lcdscb; - return(OK); - case BSIM3v1_MOD_LCDSCD : - value->rValue = model->BSIM3v1lcdscd; - return(OK); - case BSIM3v1_MOD_LCIT : - value->rValue = model->BSIM3v1lcit; - return(OK); - case BSIM3v1_MOD_LNFACTOR : - value->rValue = model->BSIM3v1lnfactor; - return(OK); - case BSIM3v1_MOD_LXJ: - value->rValue = model->BSIM3v1lxj; - return(OK); - case BSIM3v1_MOD_LVSAT: - value->rValue = model->BSIM3v1lvsat; - return(OK); - case BSIM3v1_MOD_LAT: - value->rValue = model->BSIM3v1lat; - return(OK); - case BSIM3v1_MOD_LA0: - value->rValue = model->BSIM3v1la0; - return(OK); - case BSIM3v1_MOD_LAGS: - value->rValue = model->BSIM3v1lags; - return(OK); - case BSIM3v1_MOD_LA1: - value->rValue = model->BSIM3v1la1; - return(OK); - case BSIM3v1_MOD_LA2: - value->rValue = model->BSIM3v1la2; - return(OK); - case BSIM3v1_MOD_LKETA: - value->rValue = model->BSIM3v1lketa; - return(OK); - case BSIM3v1_MOD_LNSUB: - value->rValue = model->BSIM3v1lnsub; - return(OK); - case BSIM3v1_MOD_LNPEAK: - value->rValue = model->BSIM3v1lnpeak; - return(OK); - case BSIM3v1_MOD_LNGATE: - value->rValue = model->BSIM3v1lngate; - return(OK); - case BSIM3v1_MOD_LGAMMA1: - value->rValue = model->BSIM3v1lgamma1; - return(OK); - case BSIM3v1_MOD_LGAMMA2: - value->rValue = model->BSIM3v1lgamma2; - return(OK); - case BSIM3v1_MOD_LVBX: - value->rValue = model->BSIM3v1lvbx; - return(OK); - case BSIM3v1_MOD_LVBM: - value->rValue = model->BSIM3v1lvbm; - return(OK); - case BSIM3v1_MOD_LXT: - value->rValue = model->BSIM3v1lxt; - return(OK); - case BSIM3v1_MOD_LK1: - value->rValue = model->BSIM3v1lk1; - return(OK); - case BSIM3v1_MOD_LKT1: - value->rValue = model->BSIM3v1lkt1; - return(OK); - case BSIM3v1_MOD_LKT1L: - value->rValue = model->BSIM3v1lkt1l; - return(OK); - case BSIM3v1_MOD_LKT2 : - value->rValue = model->BSIM3v1lkt2; - return(OK); - case BSIM3v1_MOD_LK2 : - value->rValue = model->BSIM3v1lk2; - return(OK); - case BSIM3v1_MOD_LK3: - value->rValue = model->BSIM3v1lk3; - return(OK); - case BSIM3v1_MOD_LK3B: - value->rValue = model->BSIM3v1lk3b; - return(OK); - case BSIM3v1_MOD_LW0: - value->rValue = model->BSIM3v1lw0; - return(OK); - case BSIM3v1_MOD_LNLX: - value->rValue = model->BSIM3v1lnlx; - return(OK); - case BSIM3v1_MOD_LDVT0: - value->rValue = model->BSIM3v1ldvt0; - return(OK); - case BSIM3v1_MOD_LDVT1 : - value->rValue = model->BSIM3v1ldvt1; - return(OK); - case BSIM3v1_MOD_LDVT2 : - value->rValue = model->BSIM3v1ldvt2; - return(OK); - case BSIM3v1_MOD_LDVT0W : - value->rValue = model->BSIM3v1ldvt0w; - return(OK); - case BSIM3v1_MOD_LDVT1W : - value->rValue = model->BSIM3v1ldvt1w; - return(OK); - case BSIM3v1_MOD_LDVT2W : - value->rValue = model->BSIM3v1ldvt2w; - return(OK); - case BSIM3v1_MOD_LDROUT : - value->rValue = model->BSIM3v1ldrout; - return(OK); - case BSIM3v1_MOD_LDSUB : - value->rValue = model->BSIM3v1ldsub; - return(OK); - case BSIM3v1_MOD_LVTH0: - value->rValue = model->BSIM3v1lvth0; - return(OK); - case BSIM3v1_MOD_LUA: - value->rValue = model->BSIM3v1lua; - return(OK); - case BSIM3v1_MOD_LUA1: - value->rValue = model->BSIM3v1lua1; - return(OK); - case BSIM3v1_MOD_LUB: - value->rValue = model->BSIM3v1lub; - return(OK); - case BSIM3v1_MOD_LUB1: - value->rValue = model->BSIM3v1lub1; - return(OK); - case BSIM3v1_MOD_LUC: - value->rValue = model->BSIM3v1luc; - return(OK); - case BSIM3v1_MOD_LUC1: - value->rValue = model->BSIM3v1luc1; - return(OK); - case BSIM3v1_MOD_LU0: - value->rValue = model->BSIM3v1lu0; - return(OK); - case BSIM3v1_MOD_LUTE: - value->rValue = model->BSIM3v1lute; - return(OK); - case BSIM3v1_MOD_LVOFF: - value->rValue = model->BSIM3v1lvoff; - return(OK); - case BSIM3v1_MOD_LDELTA: - value->rValue = model->BSIM3v1ldelta; - return(OK); - case BSIM3v1_MOD_LRDSW: - value->rValue = model->BSIM3v1lrdsw; - return(OK); - case BSIM3v1_MOD_LPRWB: - value->rValue = model->BSIM3v1lprwb; - return(OK); - case BSIM3v1_MOD_LPRWG: - value->rValue = model->BSIM3v1lprwg; - return(OK); - case BSIM3v1_MOD_LPRT: - value->rValue = model->BSIM3v1lprt; - return(OK); - case BSIM3v1_MOD_LETA0: - value->rValue = model->BSIM3v1leta0; - return(OK); - case BSIM3v1_MOD_LETAB: - value->rValue = model->BSIM3v1letab; - return(OK); - case BSIM3v1_MOD_LPCLM: - value->rValue = model->BSIM3v1lpclm; - return(OK); - case BSIM3v1_MOD_LPDIBL1: - value->rValue = model->BSIM3v1lpdibl1; - return(OK); - case BSIM3v1_MOD_LPDIBL2: - value->rValue = model->BSIM3v1lpdibl2; - return(OK); - case BSIM3v1_MOD_LPDIBLB: - value->rValue = model->BSIM3v1lpdiblb; - return(OK); - case BSIM3v1_MOD_LPSCBE1: - value->rValue = model->BSIM3v1lpscbe1; - return(OK); - case BSIM3v1_MOD_LPSCBE2: - value->rValue = model->BSIM3v1lpscbe2; - return(OK); - case BSIM3v1_MOD_LPVAG: - value->rValue = model->BSIM3v1lpvag; - return(OK); - case BSIM3v1_MOD_LWR: - value->rValue = model->BSIM3v1lwr; - return(OK); - case BSIM3v1_MOD_LDWG: - value->rValue = model->BSIM3v1ldwg; - return(OK); - case BSIM3v1_MOD_LDWB: - value->rValue = model->BSIM3v1ldwb; - return(OK); - case BSIM3v1_MOD_LB0: - value->rValue = model->BSIM3v1lb0; - return(OK); - case BSIM3v1_MOD_LB1: - value->rValue = model->BSIM3v1lb1; - return(OK); - case BSIM3v1_MOD_LALPHA0: - value->rValue = model->BSIM3v1lalpha0; - return(OK); - case BSIM3v1_MOD_LBETA0: - value->rValue = model->BSIM3v1lbeta0; - return(OK); - - case BSIM3v1_MOD_LELM: - value->rValue = model->BSIM3v1lelm; - return(OK); - case BSIM3v1_MOD_LCGSL: - value->rValue = model->BSIM3v1lcgsl; - return(OK); - case BSIM3v1_MOD_LCGDL: - value->rValue = model->BSIM3v1lcgdl; - return(OK); - case BSIM3v1_MOD_LCKAPPA: - value->rValue = model->BSIM3v1lckappa; - return(OK); - case BSIM3v1_MOD_LCF: - value->rValue = model->BSIM3v1lcf; - return(OK); - case BSIM3v1_MOD_LCLC: - value->rValue = model->BSIM3v1lclc; - return(OK); - case BSIM3v1_MOD_LCLE: - value->rValue = model->BSIM3v1lcle; - return(OK); - case BSIM3v1_MOD_LVFBCV: - value->rValue = model->BSIM3v1lvfbcv; - return(OK); - - /* Width dependence */ - case BSIM3v1_MOD_WCDSC : - value->rValue = model->BSIM3v1wcdsc; - return(OK); - case BSIM3v1_MOD_WCDSCB : - value->rValue = model->BSIM3v1wcdscb; - return(OK); - case BSIM3v1_MOD_WCDSCD : - value->rValue = model->BSIM3v1wcdscd; - return(OK); - case BSIM3v1_MOD_WCIT : - value->rValue = model->BSIM3v1wcit; - return(OK); - case BSIM3v1_MOD_WNFACTOR : - value->rValue = model->BSIM3v1wnfactor; - return(OK); - case BSIM3v1_MOD_WXJ: - value->rValue = model->BSIM3v1wxj; - return(OK); - case BSIM3v1_MOD_WVSAT: - value->rValue = model->BSIM3v1wvsat; - return(OK); - case BSIM3v1_MOD_WAT: - value->rValue = model->BSIM3v1wat; - return(OK); - case BSIM3v1_MOD_WA0: - value->rValue = model->BSIM3v1wa0; - return(OK); - case BSIM3v1_MOD_WAGS: - value->rValue = model->BSIM3v1wags; - return(OK); - case BSIM3v1_MOD_WA1: - value->rValue = model->BSIM3v1wa1; - return(OK); - case BSIM3v1_MOD_WA2: - value->rValue = model->BSIM3v1wa2; - return(OK); - case BSIM3v1_MOD_WKETA: - value->rValue = model->BSIM3v1wketa; - return(OK); - case BSIM3v1_MOD_WNSUB: - value->rValue = model->BSIM3v1wnsub; - return(OK); - case BSIM3v1_MOD_WNPEAK: - value->rValue = model->BSIM3v1wnpeak; - return(OK); - case BSIM3v1_MOD_WNGATE: - value->rValue = model->BSIM3v1wngate; - return(OK); - case BSIM3v1_MOD_WGAMMA1: - value->rValue = model->BSIM3v1wgamma1; - return(OK); - case BSIM3v1_MOD_WGAMMA2: - value->rValue = model->BSIM3v1wgamma2; - return(OK); - case BSIM3v1_MOD_WVBX: - value->rValue = model->BSIM3v1wvbx; - return(OK); - case BSIM3v1_MOD_WVBM: - value->rValue = model->BSIM3v1wvbm; - return(OK); - case BSIM3v1_MOD_WXT: - value->rValue = model->BSIM3v1wxt; - return(OK); - case BSIM3v1_MOD_WK1: - value->rValue = model->BSIM3v1wk1; - return(OK); - case BSIM3v1_MOD_WKT1: - value->rValue = model->BSIM3v1wkt1; - return(OK); - case BSIM3v1_MOD_WKT1L: - value->rValue = model->BSIM3v1wkt1l; - return(OK); - case BSIM3v1_MOD_WKT2 : - value->rValue = model->BSIM3v1wkt2; - return(OK); - case BSIM3v1_MOD_WK2 : - value->rValue = model->BSIM3v1wk2; - return(OK); - case BSIM3v1_MOD_WK3: - value->rValue = model->BSIM3v1wk3; - return(OK); - case BSIM3v1_MOD_WK3B: - value->rValue = model->BSIM3v1wk3b; - return(OK); - case BSIM3v1_MOD_WW0: - value->rValue = model->BSIM3v1ww0; - return(OK); - case BSIM3v1_MOD_WNLX: - value->rValue = model->BSIM3v1wnlx; - return(OK); - case BSIM3v1_MOD_WDVT0: - value->rValue = model->BSIM3v1wdvt0; - return(OK); - case BSIM3v1_MOD_WDVT1 : - value->rValue = model->BSIM3v1wdvt1; - return(OK); - case BSIM3v1_MOD_WDVT2 : - value->rValue = model->BSIM3v1wdvt2; - return(OK); - case BSIM3v1_MOD_WDVT0W : - value->rValue = model->BSIM3v1wdvt0w; - return(OK); - case BSIM3v1_MOD_WDVT1W : - value->rValue = model->BSIM3v1wdvt1w; - return(OK); - case BSIM3v1_MOD_WDVT2W : - value->rValue = model->BSIM3v1wdvt2w; - return(OK); - case BSIM3v1_MOD_WDROUT : - value->rValue = model->BSIM3v1wdrout; - return(OK); - case BSIM3v1_MOD_WDSUB : - value->rValue = model->BSIM3v1wdsub; - return(OK); - case BSIM3v1_MOD_WVTH0: - value->rValue = model->BSIM3v1wvth0; - return(OK); - case BSIM3v1_MOD_WUA: - value->rValue = model->BSIM3v1wua; - return(OK); - case BSIM3v1_MOD_WUA1: - value->rValue = model->BSIM3v1wua1; - return(OK); - case BSIM3v1_MOD_WUB: - value->rValue = model->BSIM3v1wub; - return(OK); - case BSIM3v1_MOD_WUB1: - value->rValue = model->BSIM3v1wub1; - return(OK); - case BSIM3v1_MOD_WUC: - value->rValue = model->BSIM3v1wuc; - return(OK); - case BSIM3v1_MOD_WUC1: - value->rValue = model->BSIM3v1wuc1; - return(OK); - case BSIM3v1_MOD_WU0: - value->rValue = model->BSIM3v1wu0; - return(OK); - case BSIM3v1_MOD_WUTE: - value->rValue = model->BSIM3v1wute; - return(OK); - case BSIM3v1_MOD_WVOFF: - value->rValue = model->BSIM3v1wvoff; - return(OK); - case BSIM3v1_MOD_WDELTA: - value->rValue = model->BSIM3v1wdelta; - return(OK); - case BSIM3v1_MOD_WRDSW: - value->rValue = model->BSIM3v1wrdsw; - return(OK); - case BSIM3v1_MOD_WPRWB: - value->rValue = model->BSIM3v1wprwb; - return(OK); - case BSIM3v1_MOD_WPRWG: - value->rValue = model->BSIM3v1wprwg; - return(OK); - case BSIM3v1_MOD_WPRT: - value->rValue = model->BSIM3v1wprt; - return(OK); - case BSIM3v1_MOD_WETA0: - value->rValue = model->BSIM3v1weta0; - return(OK); - case BSIM3v1_MOD_WETAB: - value->rValue = model->BSIM3v1wetab; - return(OK); - case BSIM3v1_MOD_WPCLM: - value->rValue = model->BSIM3v1wpclm; - return(OK); - case BSIM3v1_MOD_WPDIBL1: - value->rValue = model->BSIM3v1wpdibl1; - return(OK); - case BSIM3v1_MOD_WPDIBL2: - value->rValue = model->BSIM3v1wpdibl2; - return(OK); - case BSIM3v1_MOD_WPDIBLB: - value->rValue = model->BSIM3v1wpdiblb; - return(OK); - case BSIM3v1_MOD_WPSCBE1: - value->rValue = model->BSIM3v1wpscbe1; - return(OK); - case BSIM3v1_MOD_WPSCBE2: - value->rValue = model->BSIM3v1wpscbe2; - return(OK); - case BSIM3v1_MOD_WPVAG: - value->rValue = model->BSIM3v1wpvag; - return(OK); - case BSIM3v1_MOD_WWR: - value->rValue = model->BSIM3v1wwr; - return(OK); - case BSIM3v1_MOD_WDWG: - value->rValue = model->BSIM3v1wdwg; - return(OK); - case BSIM3v1_MOD_WDWB: - value->rValue = model->BSIM3v1wdwb; - return(OK); - case BSIM3v1_MOD_WB0: - value->rValue = model->BSIM3v1wb0; - return(OK); - case BSIM3v1_MOD_WB1: - value->rValue = model->BSIM3v1wb1; - return(OK); - case BSIM3v1_MOD_WALPHA0: - value->rValue = model->BSIM3v1walpha0; - return(OK); - case BSIM3v1_MOD_WBETA0: - value->rValue = model->BSIM3v1wbeta0; - return(OK); - - case BSIM3v1_MOD_WELM: - value->rValue = model->BSIM3v1welm; - return(OK); - case BSIM3v1_MOD_WCGSL: - value->rValue = model->BSIM3v1wcgsl; - return(OK); - case BSIM3v1_MOD_WCGDL: - value->rValue = model->BSIM3v1wcgdl; - return(OK); - case BSIM3v1_MOD_WCKAPPA: - value->rValue = model->BSIM3v1wckappa; - return(OK); - case BSIM3v1_MOD_WCF: - value->rValue = model->BSIM3v1wcf; - return(OK); - case BSIM3v1_MOD_WCLC: - value->rValue = model->BSIM3v1wclc; - return(OK); - case BSIM3v1_MOD_WCLE: - value->rValue = model->BSIM3v1wcle; - return(OK); - case BSIM3v1_MOD_WVFBCV: - value->rValue = model->BSIM3v1wvfbcv; - return(OK); - - /* Cross-term dependence */ - case BSIM3v1_MOD_PCDSC : - value->rValue = model->BSIM3v1pcdsc; - return(OK); - case BSIM3v1_MOD_PCDSCB : - value->rValue = model->BSIM3v1pcdscb; - return(OK); - case BSIM3v1_MOD_PCDSCD : - value->rValue = model->BSIM3v1pcdscd; - return(OK); - case BSIM3v1_MOD_PCIT : - value->rValue = model->BSIM3v1pcit; - return(OK); - case BSIM3v1_MOD_PNFACTOR : - value->rValue = model->BSIM3v1pnfactor; - return(OK); - case BSIM3v1_MOD_PXJ: - value->rValue = model->BSIM3v1pxj; - return(OK); - case BSIM3v1_MOD_PVSAT: - value->rValue = model->BSIM3v1pvsat; - return(OK); - case BSIM3v1_MOD_PAT: - value->rValue = model->BSIM3v1pat; - return(OK); - case BSIM3v1_MOD_PA0: - value->rValue = model->BSIM3v1pa0; - return(OK); - case BSIM3v1_MOD_PAGS: - value->rValue = model->BSIM3v1pags; - return(OK); - case BSIM3v1_MOD_PA1: - value->rValue = model->BSIM3v1pa1; - return(OK); - case BSIM3v1_MOD_PA2: - value->rValue = model->BSIM3v1pa2; - return(OK); - case BSIM3v1_MOD_PKETA: - value->rValue = model->BSIM3v1pketa; - return(OK); - case BSIM3v1_MOD_PNSUB: - value->rValue = model->BSIM3v1pnsub; - return(OK); - case BSIM3v1_MOD_PNPEAK: - value->rValue = model->BSIM3v1pnpeak; - return(OK); - case BSIM3v1_MOD_PNGATE: - value->rValue = model->BSIM3v1pngate; - return(OK); - case BSIM3v1_MOD_PGAMMA1: - value->rValue = model->BSIM3v1pgamma1; - return(OK); - case BSIM3v1_MOD_PGAMMA2: - value->rValue = model->BSIM3v1pgamma2; - return(OK); - case BSIM3v1_MOD_PVBX: - value->rValue = model->BSIM3v1pvbx; - return(OK); - case BSIM3v1_MOD_PVBM: - value->rValue = model->BSIM3v1pvbm; - return(OK); - case BSIM3v1_MOD_PXT: - value->rValue = model->BSIM3v1pxt; - return(OK); - case BSIM3v1_MOD_PK1: - value->rValue = model->BSIM3v1pk1; - return(OK); - case BSIM3v1_MOD_PKT1: - value->rValue = model->BSIM3v1pkt1; - return(OK); - case BSIM3v1_MOD_PKT1L: - value->rValue = model->BSIM3v1pkt1l; - return(OK); - case BSIM3v1_MOD_PKT2 : - value->rValue = model->BSIM3v1pkt2; - return(OK); - case BSIM3v1_MOD_PK2 : - value->rValue = model->BSIM3v1pk2; - return(OK); - case BSIM3v1_MOD_PK3: - value->rValue = model->BSIM3v1pk3; - return(OK); - case BSIM3v1_MOD_PK3B: - value->rValue = model->BSIM3v1pk3b; - return(OK); - case BSIM3v1_MOD_PW0: - value->rValue = model->BSIM3v1pw0; - return(OK); - case BSIM3v1_MOD_PNLX: - value->rValue = model->BSIM3v1pnlx; - return(OK); - case BSIM3v1_MOD_PDVT0 : - value->rValue = model->BSIM3v1pdvt0; - return(OK); - case BSIM3v1_MOD_PDVT1 : - value->rValue = model->BSIM3v1pdvt1; - return(OK); - case BSIM3v1_MOD_PDVT2 : - value->rValue = model->BSIM3v1pdvt2; - return(OK); - case BSIM3v1_MOD_PDVT0W : - value->rValue = model->BSIM3v1pdvt0w; - return(OK); - case BSIM3v1_MOD_PDVT1W : - value->rValue = model->BSIM3v1pdvt1w; - return(OK); - case BSIM3v1_MOD_PDVT2W : - value->rValue = model->BSIM3v1pdvt2w; - return(OK); - case BSIM3v1_MOD_PDROUT : - value->rValue = model->BSIM3v1pdrout; - return(OK); - case BSIM3v1_MOD_PDSUB : - value->rValue = model->BSIM3v1pdsub; - return(OK); - case BSIM3v1_MOD_PVTH0: - value->rValue = model->BSIM3v1pvth0; - return(OK); - case BSIM3v1_MOD_PUA: - value->rValue = model->BSIM3v1pua; - return(OK); - case BSIM3v1_MOD_PUA1: - value->rValue = model->BSIM3v1pua1; - return(OK); - case BSIM3v1_MOD_PUB: - value->rValue = model->BSIM3v1pub; - return(OK); - case BSIM3v1_MOD_PUB1: - value->rValue = model->BSIM3v1pub1; - return(OK); - case BSIM3v1_MOD_PUC: - value->rValue = model->BSIM3v1puc; - return(OK); - case BSIM3v1_MOD_PUC1: - value->rValue = model->BSIM3v1puc1; - return(OK); - case BSIM3v1_MOD_PU0: - value->rValue = model->BSIM3v1pu0; - return(OK); - case BSIM3v1_MOD_PUTE: - value->rValue = model->BSIM3v1pute; - return(OK); - case BSIM3v1_MOD_PVOFF: - value->rValue = model->BSIM3v1pvoff; - return(OK); - case BSIM3v1_MOD_PDELTA: - value->rValue = model->BSIM3v1pdelta; - return(OK); - case BSIM3v1_MOD_PRDSW: - value->rValue = model->BSIM3v1prdsw; - return(OK); - case BSIM3v1_MOD_PPRWB: - value->rValue = model->BSIM3v1pprwb; - return(OK); - case BSIM3v1_MOD_PPRWG: - value->rValue = model->BSIM3v1pprwg; - return(OK); - case BSIM3v1_MOD_PPRT: - value->rValue = model->BSIM3v1pprt; - return(OK); - case BSIM3v1_MOD_PETA0: - value->rValue = model->BSIM3v1peta0; - return(OK); - case BSIM3v1_MOD_PETAB: - value->rValue = model->BSIM3v1petab; - return(OK); - case BSIM3v1_MOD_PPCLM: - value->rValue = model->BSIM3v1ppclm; - return(OK); - case BSIM3v1_MOD_PPDIBL1: - value->rValue = model->BSIM3v1ppdibl1; - return(OK); - case BSIM3v1_MOD_PPDIBL2: - value->rValue = model->BSIM3v1ppdibl2; - return(OK); - case BSIM3v1_MOD_PPDIBLB: - value->rValue = model->BSIM3v1ppdiblb; - return(OK); - case BSIM3v1_MOD_PPSCBE1: - value->rValue = model->BSIM3v1ppscbe1; - return(OK); - case BSIM3v1_MOD_PPSCBE2: - value->rValue = model->BSIM3v1ppscbe2; - return(OK); - case BSIM3v1_MOD_PPVAG: - value->rValue = model->BSIM3v1ppvag; - return(OK); - case BSIM3v1_MOD_PWR: - value->rValue = model->BSIM3v1pwr; - return(OK); - case BSIM3v1_MOD_PDWG: - value->rValue = model->BSIM3v1pdwg; - return(OK); - case BSIM3v1_MOD_PDWB: - value->rValue = model->BSIM3v1pdwb; - return(OK); - case BSIM3v1_MOD_PB0: - value->rValue = model->BSIM3v1pb0; - return(OK); - case BSIM3v1_MOD_PB1: - value->rValue = model->BSIM3v1pb1; - return(OK); - case BSIM3v1_MOD_PALPHA0: - value->rValue = model->BSIM3v1palpha0; - return(OK); - case BSIM3v1_MOD_PBETA0: - value->rValue = model->BSIM3v1pbeta0; - return(OK); - - case BSIM3v1_MOD_PELM: - value->rValue = model->BSIM3v1pelm; - return(OK); - case BSIM3v1_MOD_PCGSL: - value->rValue = model->BSIM3v1pcgsl; - return(OK); - case BSIM3v1_MOD_PCGDL: - value->rValue = model->BSIM3v1pcgdl; - return(OK); - case BSIM3v1_MOD_PCKAPPA: - value->rValue = model->BSIM3v1pckappa; - return(OK); - case BSIM3v1_MOD_PCF: - value->rValue = model->BSIM3v1pcf; - return(OK); - case BSIM3v1_MOD_PCLC: - value->rValue = model->BSIM3v1pclc; - return(OK); - case BSIM3v1_MOD_PCLE: - value->rValue = model->BSIM3v1pcle; - return(OK); - case BSIM3v1_MOD_PVFBCV: - value->rValue = model->BSIM3v1pvfbcv; - return(OK); - - case BSIM3v1_MOD_TNOM : - value->rValue = model->BSIM3v1tnom; - return(OK); - case BSIM3v1_MOD_CGSO: - value->rValue = model->BSIM3v1cgso; - return(OK); - case BSIM3v1_MOD_CGDO: - value->rValue = model->BSIM3v1cgdo; - return(OK); - case BSIM3v1_MOD_CGBO: - value->rValue = model->BSIM3v1cgbo; - return(OK); - case BSIM3v1_MOD_XPART: - value->rValue = model->BSIM3v1xpart; - return(OK); - case BSIM3v1_MOD_RSH: - value->rValue = model->BSIM3v1sheetResistance; - return(OK); - case BSIM3v1_MOD_JS: - value->rValue = model->BSIM3v1jctSatCurDensity; - return(OK); - case BSIM3v1_MOD_JSW: - value->rValue = model->BSIM3v1jctSidewallSatCurDensity; - return(OK); - case BSIM3v1_MOD_PB: - value->rValue = model->BSIM3v1bulkJctPotential; - return(OK); - case BSIM3v1_MOD_MJ: - value->rValue = model->BSIM3v1bulkJctBotGradingCoeff; - return(OK); - case BSIM3v1_MOD_PBSW: - value->rValue = model->BSIM3v1sidewallJctPotential; - return(OK); - case BSIM3v1_MOD_MJSW: - value->rValue = model->BSIM3v1bulkJctSideGradingCoeff; - return(OK); - case BSIM3v1_MOD_CJ: - value->rValue = model->BSIM3v1unitAreaJctCap; - return(OK); - case BSIM3v1_MOD_CJSW: - value->rValue = model->BSIM3v1unitLengthSidewallJctCap; - return(OK); - case BSIM3v1_MOD_PBSWG: - value->rValue = model->BSIM3v1GatesidewallJctPotential; - return(OK); - case BSIM3v1_MOD_MJSWG: - value->rValue = model->BSIM3v1bulkJctGateSideGradingCoeff; - return(OK); - case BSIM3v1_MOD_CJSWG: - value->rValue = model->BSIM3v1unitLengthGateSidewallJctCap; - return(OK); - case BSIM3v1_MOD_NJ: - value->rValue = model->BSIM3v1jctEmissionCoeff; - return(OK); - case BSIM3v1_MOD_XTI: - value->rValue = model->BSIM3v1jctTempExponent; - return(OK); - case BSIM3v1_MOD_LINT: - value->rValue = model->BSIM3v1Lint; - return(OK); - case BSIM3v1_MOD_LL: - value->rValue = model->BSIM3v1Ll; - return(OK); - case BSIM3v1_MOD_LLN: - value->rValue = model->BSIM3v1Lln; - return(OK); - case BSIM3v1_MOD_LW: - value->rValue = model->BSIM3v1Lw; - return(OK); - case BSIM3v1_MOD_LWN: - value->rValue = model->BSIM3v1Lwn; - return(OK); - case BSIM3v1_MOD_LWL: - value->rValue = model->BSIM3v1Lwl; - return(OK); - case BSIM3v1_MOD_LMIN: - value->rValue = model->BSIM3v1Lmin; - return(OK); - case BSIM3v1_MOD_LMAX: - value->rValue = model->BSIM3v1Lmax; - return(OK); - case BSIM3v1_MOD_WINT: - value->rValue = model->BSIM3v1Wint; - return(OK); - case BSIM3v1_MOD_WL: - value->rValue = model->BSIM3v1Wl; - return(OK); - case BSIM3v1_MOD_WLN: - value->rValue = model->BSIM3v1Wln; - return(OK); - case BSIM3v1_MOD_WW: - value->rValue = model->BSIM3v1Ww; - return(OK); - case BSIM3v1_MOD_WWN: - value->rValue = model->BSIM3v1Wwn; - return(OK); - case BSIM3v1_MOD_WWL: - value->rValue = model->BSIM3v1Wwl; - return(OK); - case BSIM3v1_MOD_WMIN: - value->rValue = model->BSIM3v1Wmin; - return(OK); - case BSIM3v1_MOD_WMAX: - value->rValue = model->BSIM3v1Wmax; - return(OK); - case BSIM3v1_MOD_NOIA: - value->rValue = model->BSIM3v1oxideTrapDensityA; - return(OK); - case BSIM3v1_MOD_NOIB: - value->rValue = model->BSIM3v1oxideTrapDensityB; - return(OK); - case BSIM3v1_MOD_NOIC: - value->rValue = model->BSIM3v1oxideTrapDensityC; - return(OK); - case BSIM3v1_MOD_EM: - value->rValue = model->BSIM3v1em; - return(OK); - case BSIM3v1_MOD_EF: - value->rValue = model->BSIM3v1ef; - return(OK); - case BSIM3v1_MOD_AF: - value->rValue = model->BSIM3v1af; - return(OK); - case BSIM3v1_MOD_KF: - value->rValue = model->BSIM3v1kf; - return(OK); - default: - return(E_BADPARM); - } - /* NOTREACHED */ -} - - - diff --git a/src/spicelib/devices/bsim3v1/b3v1mpar.c b/src/spicelib/devices/bsim3v1/b3v1mpar.c deleted file mode 100644 index b99cb7ec5..000000000 --- a/src/spicelib/devices/bsim3v1/b3v1mpar.c +++ /dev/null @@ -1,1533 +0,0 @@ -/********** - * Copyright 1990 Regents of the University of California. All rights reserved. - * File: b3mpar.c - * Author: 1995 Min-Chie Jeng and Mansun Chan. - * Modified by Paolo Nenzi 2002 - **********/ - -/* - * Release Notes: - * BSIM3v1v3.1, Released by yuhua 96/12/08 - */ - -#include "ngspice/ngspice.h" -#include "bsim3v1def.h" -#include "ngspice/ifsim.h" -#include "ngspice/sperror.h" -#include "ngspice/suffix.h" - - -int -BSIM3v1mParam(int param, IFvalue *value, GENmodel *inMod) -{ - BSIM3v1model *mod = (BSIM3v1model*)inMod; - switch(param) - { case BSIM3v1_MOD_MOBMOD : - mod->BSIM3v1mobMod = value->iValue; - mod->BSIM3v1mobModGiven = TRUE; - break; - case BSIM3v1_MOD_BINUNIT : - mod->BSIM3v1binUnit = value->iValue; - mod->BSIM3v1binUnitGiven = TRUE; - break; - case BSIM3v1_MOD_PARAMCHK : - mod->BSIM3v1paramChk = value->iValue; - mod->BSIM3v1paramChkGiven = TRUE; - break; - case BSIM3v1_MOD_CAPMOD : - mod->BSIM3v1capMod = value->iValue; - mod->BSIM3v1capModGiven = TRUE; - break; - case BSIM3v1_MOD_NQSMOD : - mod->BSIM3v1nqsMod = value->iValue; - mod->BSIM3v1nqsModGiven = TRUE; - break; - case BSIM3v1_MOD_NOIMOD : - mod->BSIM3v1noiMod = value->iValue; - mod->BSIM3v1noiModGiven = TRUE; - break; - case BSIM3v1_MOD_VERSION : - mod->BSIM3v1version = value->rValue; - mod->BSIM3v1versionGiven = TRUE; - break; - case BSIM3v1_MOD_TOX : - mod->BSIM3v1tox = value->rValue; - mod->BSIM3v1toxGiven = TRUE; - break; - - case BSIM3v1_MOD_CDSC : - mod->BSIM3v1cdsc = value->rValue; - mod->BSIM3v1cdscGiven = TRUE; - break; - case BSIM3v1_MOD_CDSCB : - mod->BSIM3v1cdscb = value->rValue; - mod->BSIM3v1cdscbGiven = TRUE; - break; - - case BSIM3v1_MOD_CDSCD : - mod->BSIM3v1cdscd = value->rValue; - mod->BSIM3v1cdscdGiven = TRUE; - break; - - case BSIM3v1_MOD_CIT : - mod->BSIM3v1cit = value->rValue; - mod->BSIM3v1citGiven = TRUE; - break; - case BSIM3v1_MOD_NFACTOR : - mod->BSIM3v1nfactor = value->rValue; - mod->BSIM3v1nfactorGiven = TRUE; - break; - case BSIM3v1_MOD_XJ: - mod->BSIM3v1xj = value->rValue; - mod->BSIM3v1xjGiven = TRUE; - break; - case BSIM3v1_MOD_VSAT: - mod->BSIM3v1vsat = value->rValue; - mod->BSIM3v1vsatGiven = TRUE; - break; - case BSIM3v1_MOD_A0: - mod->BSIM3v1a0 = value->rValue; - mod->BSIM3v1a0Given = TRUE; - break; - - case BSIM3v1_MOD_AGS: - mod->BSIM3v1ags= value->rValue; - mod->BSIM3v1agsGiven = TRUE; - break; - - case BSIM3v1_MOD_A1: - mod->BSIM3v1a1 = value->rValue; - mod->BSIM3v1a1Given = TRUE; - break; - case BSIM3v1_MOD_A2: - mod->BSIM3v1a2 = value->rValue; - mod->BSIM3v1a2Given = TRUE; - break; - case BSIM3v1_MOD_AT: - mod->BSIM3v1at = value->rValue; - mod->BSIM3v1atGiven = TRUE; - break; - case BSIM3v1_MOD_KETA: - mod->BSIM3v1keta = value->rValue; - mod->BSIM3v1ketaGiven = TRUE; - break; - case BSIM3v1_MOD_NSUB: - mod->BSIM3v1nsub = value->rValue; - mod->BSIM3v1nsubGiven = TRUE; - break; - case BSIM3v1_MOD_NPEAK: - mod->BSIM3v1npeak = value->rValue; - mod->BSIM3v1npeakGiven = TRUE; - if (mod->BSIM3v1npeak > 1.0e20) - mod->BSIM3v1npeak *= 1.0e-6; - break; - case BSIM3v1_MOD_NGATE: - mod->BSIM3v1ngate = value->rValue; - mod->BSIM3v1ngateGiven = TRUE; - if (mod->BSIM3v1ngate > 1.000001e24) - mod->BSIM3v1ngate *= 1.0e-6; - break; - case BSIM3v1_MOD_GAMMA1: - mod->BSIM3v1gamma1 = value->rValue; - mod->BSIM3v1gamma1Given = TRUE; - break; - case BSIM3v1_MOD_GAMMA2: - mod->BSIM3v1gamma2 = value->rValue; - mod->BSIM3v1gamma2Given = TRUE; - break; - case BSIM3v1_MOD_VBX: - mod->BSIM3v1vbx = value->rValue; - mod->BSIM3v1vbxGiven = TRUE; - break; - case BSIM3v1_MOD_VBM: - mod->BSIM3v1vbm = value->rValue; - mod->BSIM3v1vbmGiven = TRUE; - break; - case BSIM3v1_MOD_XT: - mod->BSIM3v1xt = value->rValue; - mod->BSIM3v1xtGiven = TRUE; - break; - case BSIM3v1_MOD_K1: - mod->BSIM3v1k1 = value->rValue; - mod->BSIM3v1k1Given = TRUE; - break; - case BSIM3v1_MOD_KT1: - mod->BSIM3v1kt1 = value->rValue; - mod->BSIM3v1kt1Given = TRUE; - break; - case BSIM3v1_MOD_KT1L: - mod->BSIM3v1kt1l = value->rValue; - mod->BSIM3v1kt1lGiven = TRUE; - break; - case BSIM3v1_MOD_KT2: - mod->BSIM3v1kt2 = value->rValue; - mod->BSIM3v1kt2Given = TRUE; - break; - case BSIM3v1_MOD_K2: - mod->BSIM3v1k2 = value->rValue; - mod->BSIM3v1k2Given = TRUE; - break; - case BSIM3v1_MOD_K3: - mod->BSIM3v1k3 = value->rValue; - mod->BSIM3v1k3Given = TRUE; - break; - case BSIM3v1_MOD_K3B: - mod->BSIM3v1k3b = value->rValue; - mod->BSIM3v1k3bGiven = TRUE; - break; - case BSIM3v1_MOD_NLX: - mod->BSIM3v1nlx = value->rValue; - mod->BSIM3v1nlxGiven = TRUE; - break; - case BSIM3v1_MOD_W0: - mod->BSIM3v1w0 = value->rValue; - mod->BSIM3v1w0Given = TRUE; - break; - case BSIM3v1_MOD_DVT0: - mod->BSIM3v1dvt0 = value->rValue; - mod->BSIM3v1dvt0Given = TRUE; - break; - case BSIM3v1_MOD_DVT1: - mod->BSIM3v1dvt1 = value->rValue; - mod->BSIM3v1dvt1Given = TRUE; - break; - case BSIM3v1_MOD_DVT2: - mod->BSIM3v1dvt2 = value->rValue; - mod->BSIM3v1dvt2Given = TRUE; - break; - case BSIM3v1_MOD_DVT0W: - mod->BSIM3v1dvt0w = value->rValue; - mod->BSIM3v1dvt0wGiven = TRUE; - break; - case BSIM3v1_MOD_DVT1W: - mod->BSIM3v1dvt1w = value->rValue; - mod->BSIM3v1dvt1wGiven = TRUE; - break; - case BSIM3v1_MOD_DVT2W: - mod->BSIM3v1dvt2w = value->rValue; - mod->BSIM3v1dvt2wGiven = TRUE; - break; - case BSIM3v1_MOD_DROUT: - mod->BSIM3v1drout = value->rValue; - mod->BSIM3v1droutGiven = TRUE; - break; - case BSIM3v1_MOD_DSUB: - mod->BSIM3v1dsub = value->rValue; - mod->BSIM3v1dsubGiven = TRUE; - break; - case BSIM3v1_MOD_VTH0: - mod->BSIM3v1vth0 = value->rValue; - mod->BSIM3v1vth0Given = TRUE; - break; - case BSIM3v1_MOD_UA: - mod->BSIM3v1ua = value->rValue; - mod->BSIM3v1uaGiven = TRUE; - break; - case BSIM3v1_MOD_UA1: - mod->BSIM3v1ua1 = value->rValue; - mod->BSIM3v1ua1Given = TRUE; - break; - case BSIM3v1_MOD_UB: - mod->BSIM3v1ub = value->rValue; - mod->BSIM3v1ubGiven = TRUE; - break; - case BSIM3v1_MOD_UB1: - mod->BSIM3v1ub1 = value->rValue; - mod->BSIM3v1ub1Given = TRUE; - break; - case BSIM3v1_MOD_UC: - mod->BSIM3v1uc = value->rValue; - mod->BSIM3v1ucGiven = TRUE; - break; - case BSIM3v1_MOD_UC1: - mod->BSIM3v1uc1 = value->rValue; - mod->BSIM3v1uc1Given = TRUE; - break; - case BSIM3v1_MOD_U0 : - mod->BSIM3v1u0 = value->rValue; - mod->BSIM3v1u0Given = TRUE; - break; - case BSIM3v1_MOD_UTE : - mod->BSIM3v1ute = value->rValue; - mod->BSIM3v1uteGiven = TRUE; - break; - case BSIM3v1_MOD_VOFF: - mod->BSIM3v1voff = value->rValue; - mod->BSIM3v1voffGiven = TRUE; - break; - case BSIM3v1_MOD_DELTA : - mod->BSIM3v1delta = value->rValue; - mod->BSIM3v1deltaGiven = TRUE; - break; - case BSIM3v1_MOD_RDSW: - mod->BSIM3v1rdsw = value->rValue; - mod->BSIM3v1rdswGiven = TRUE; - break; - case BSIM3v1_MOD_PRWG: - mod->BSIM3v1prwg = value->rValue; - mod->BSIM3v1prwgGiven = TRUE; - break; - case BSIM3v1_MOD_PRWB: - mod->BSIM3v1prwb = value->rValue; - mod->BSIM3v1prwbGiven = TRUE; - break; - case BSIM3v1_MOD_PRT: - mod->BSIM3v1prt = value->rValue; - mod->BSIM3v1prtGiven = TRUE; - break; - case BSIM3v1_MOD_ETA0: - mod->BSIM3v1eta0 = value->rValue; - mod->BSIM3v1eta0Given = TRUE; - break; - case BSIM3v1_MOD_ETAB: - mod->BSIM3v1etab = value->rValue; - mod->BSIM3v1etabGiven = TRUE; - break; - case BSIM3v1_MOD_PCLM: - mod->BSIM3v1pclm = value->rValue; - mod->BSIM3v1pclmGiven = TRUE; - break; - case BSIM3v1_MOD_PDIBL1: - mod->BSIM3v1pdibl1 = value->rValue; - mod->BSIM3v1pdibl1Given = TRUE; - break; - case BSIM3v1_MOD_PDIBL2: - mod->BSIM3v1pdibl2 = value->rValue; - mod->BSIM3v1pdibl2Given = TRUE; - break; - case BSIM3v1_MOD_PDIBLB: - mod->BSIM3v1pdiblb = value->rValue; - mod->BSIM3v1pdiblbGiven = TRUE; - break; - case BSIM3v1_MOD_PSCBE1: - mod->BSIM3v1pscbe1 = value->rValue; - mod->BSIM3v1pscbe1Given = TRUE; - break; - case BSIM3v1_MOD_PSCBE2: - mod->BSIM3v1pscbe2 = value->rValue; - mod->BSIM3v1pscbe2Given = TRUE; - break; - case BSIM3v1_MOD_PVAG: - mod->BSIM3v1pvag = value->rValue; - mod->BSIM3v1pvagGiven = TRUE; - break; - case BSIM3v1_MOD_WR : - mod->BSIM3v1wr = value->rValue; - mod->BSIM3v1wrGiven = TRUE; - break; - case BSIM3v1_MOD_DWG : - mod->BSIM3v1dwg = value->rValue; - mod->BSIM3v1dwgGiven = TRUE; - break; - case BSIM3v1_MOD_DWB : - mod->BSIM3v1dwb = value->rValue; - mod->BSIM3v1dwbGiven = TRUE; - break; - case BSIM3v1_MOD_B0 : - mod->BSIM3v1b0 = value->rValue; - mod->BSIM3v1b0Given = TRUE; - break; - case BSIM3v1_MOD_B1 : - mod->BSIM3v1b1 = value->rValue; - mod->BSIM3v1b1Given = TRUE; - break; - case BSIM3v1_MOD_ALPHA0 : - mod->BSIM3v1alpha0 = value->rValue; - mod->BSIM3v1alpha0Given = TRUE; - break; - case BSIM3v1_MOD_BETA0 : - mod->BSIM3v1beta0 = value->rValue; - mod->BSIM3v1beta0Given = TRUE; - break; - - case BSIM3v1_MOD_ELM : - mod->BSIM3v1elm = value->rValue; - mod->BSIM3v1elmGiven = TRUE; - break; - case BSIM3v1_MOD_CGSL : - mod->BSIM3v1cgsl = value->rValue; - mod->BSIM3v1cgslGiven = TRUE; - break; - case BSIM3v1_MOD_CGDL : - mod->BSIM3v1cgdl = value->rValue; - mod->BSIM3v1cgdlGiven = TRUE; - break; - case BSIM3v1_MOD_CKAPPA : - mod->BSIM3v1ckappa = value->rValue; - mod->BSIM3v1ckappaGiven = TRUE; - break; - case BSIM3v1_MOD_CF : - mod->BSIM3v1cf = value->rValue; - mod->BSIM3v1cfGiven = TRUE; - break; - case BSIM3v1_MOD_CLC : - mod->BSIM3v1clc = value->rValue; - mod->BSIM3v1clcGiven = TRUE; - break; - case BSIM3v1_MOD_CLE : - mod->BSIM3v1cle = value->rValue; - mod->BSIM3v1cleGiven = TRUE; - break; - case BSIM3v1_MOD_DWC : - mod->BSIM3v1dwc = value->rValue; - mod->BSIM3v1dwcGiven = TRUE; - break; - case BSIM3v1_MOD_DLC : - mod->BSIM3v1dlc = value->rValue; - mod->BSIM3v1dlcGiven = TRUE; - break; - case BSIM3v1_MOD_VFBCV : - mod->BSIM3v1vfbcv = value->rValue; - mod->BSIM3v1vfbcvGiven = TRUE; - break; - - /* Length dependence */ - case BSIM3v1_MOD_LCDSC : - mod->BSIM3v1lcdsc = value->rValue; - mod->BSIM3v1lcdscGiven = TRUE; - break; - - - case BSIM3v1_MOD_LCDSCB : - mod->BSIM3v1lcdscb = value->rValue; - mod->BSIM3v1lcdscbGiven = TRUE; - break; - case BSIM3v1_MOD_LCDSCD : - mod->BSIM3v1lcdscd = value->rValue; - mod->BSIM3v1lcdscdGiven = TRUE; - break; - case BSIM3v1_MOD_LCIT : - mod->BSIM3v1lcit = value->rValue; - mod->BSIM3v1lcitGiven = TRUE; - break; - case BSIM3v1_MOD_LNFACTOR : - mod->BSIM3v1lnfactor = value->rValue; - mod->BSIM3v1lnfactorGiven = TRUE; - break; - case BSIM3v1_MOD_LXJ: - mod->BSIM3v1lxj = value->rValue; - mod->BSIM3v1lxjGiven = TRUE; - break; - case BSIM3v1_MOD_LVSAT: - mod->BSIM3v1lvsat = value->rValue; - mod->BSIM3v1lvsatGiven = TRUE; - break; - - - case BSIM3v1_MOD_LA0: - mod->BSIM3v1la0 = value->rValue; - mod->BSIM3v1la0Given = TRUE; - break; - case BSIM3v1_MOD_LAGS: - mod->BSIM3v1lags = value->rValue; - mod->BSIM3v1lagsGiven = TRUE; - break; - case BSIM3v1_MOD_LA1: - mod->BSIM3v1la1 = value->rValue; - mod->BSIM3v1la1Given = TRUE; - break; - case BSIM3v1_MOD_LA2: - mod->BSIM3v1la2 = value->rValue; - mod->BSIM3v1la2Given = TRUE; - break; - case BSIM3v1_MOD_LAT: - mod->BSIM3v1lat = value->rValue; - mod->BSIM3v1latGiven = TRUE; - break; - case BSIM3v1_MOD_LKETA: - mod->BSIM3v1lketa = value->rValue; - mod->BSIM3v1lketaGiven = TRUE; - break; - case BSIM3v1_MOD_LNSUB: - mod->BSIM3v1lnsub = value->rValue; - mod->BSIM3v1lnsubGiven = TRUE; - break; - case BSIM3v1_MOD_LNPEAK: - mod->BSIM3v1lnpeak = value->rValue; - mod->BSIM3v1lnpeakGiven = TRUE; - if (mod->BSIM3v1lnpeak > 1.0e20) - mod->BSIM3v1lnpeak *= 1.0e-6; - break; - case BSIM3v1_MOD_LNGATE: - mod->BSIM3v1lngate = value->rValue; - mod->BSIM3v1lngateGiven = TRUE; - if (mod->BSIM3v1lngate > 1.0e23) - mod->BSIM3v1lngate *= 1.0e-6; - break; - case BSIM3v1_MOD_LGAMMA1: - mod->BSIM3v1lgamma1 = value->rValue; - mod->BSIM3v1lgamma1Given = TRUE; - break; - case BSIM3v1_MOD_LGAMMA2: - mod->BSIM3v1lgamma2 = value->rValue; - mod->BSIM3v1lgamma2Given = TRUE; - break; - case BSIM3v1_MOD_LVBX: - mod->BSIM3v1lvbx = value->rValue; - mod->BSIM3v1lvbxGiven = TRUE; - break; - case BSIM3v1_MOD_LVBM: - mod->BSIM3v1lvbm = value->rValue; - mod->BSIM3v1lvbmGiven = TRUE; - break; - case BSIM3v1_MOD_LXT: - mod->BSIM3v1lxt = value->rValue; - mod->BSIM3v1lxtGiven = TRUE; - break; - case BSIM3v1_MOD_LK1: - mod->BSIM3v1lk1 = value->rValue; - mod->BSIM3v1lk1Given = TRUE; - break; - case BSIM3v1_MOD_LKT1: - mod->BSIM3v1lkt1 = value->rValue; - mod->BSIM3v1lkt1Given = TRUE; - break; - case BSIM3v1_MOD_LKT1L: - mod->BSIM3v1lkt1l = value->rValue; - mod->BSIM3v1lkt1lGiven = TRUE; - break; - case BSIM3v1_MOD_LKT2: - mod->BSIM3v1lkt2 = value->rValue; - mod->BSIM3v1lkt2Given = TRUE; - break; - case BSIM3v1_MOD_LK2: - mod->BSIM3v1lk2 = value->rValue; - mod->BSIM3v1lk2Given = TRUE; - break; - case BSIM3v1_MOD_LK3: - mod->BSIM3v1lk3 = value->rValue; - mod->BSIM3v1lk3Given = TRUE; - break; - case BSIM3v1_MOD_LK3B: - mod->BSIM3v1lk3b = value->rValue; - mod->BSIM3v1lk3bGiven = TRUE; - break; - case BSIM3v1_MOD_LNLX: - mod->BSIM3v1lnlx = value->rValue; - mod->BSIM3v1lnlxGiven = TRUE; - break; - case BSIM3v1_MOD_LW0: - mod->BSIM3v1lw0 = value->rValue; - mod->BSIM3v1lw0Given = TRUE; - break; - case BSIM3v1_MOD_LDVT0: - mod->BSIM3v1ldvt0 = value->rValue; - mod->BSIM3v1ldvt0Given = TRUE; - break; - case BSIM3v1_MOD_LDVT1: - mod->BSIM3v1ldvt1 = value->rValue; - mod->BSIM3v1ldvt1Given = TRUE; - break; - case BSIM3v1_MOD_LDVT2: - mod->BSIM3v1ldvt2 = value->rValue; - mod->BSIM3v1ldvt2Given = TRUE; - break; - case BSIM3v1_MOD_LDVT0W: - mod->BSIM3v1ldvt0w = value->rValue; - mod->BSIM3v1ldvt0Given = TRUE; - break; - case BSIM3v1_MOD_LDVT1W: - mod->BSIM3v1ldvt1w = value->rValue; - mod->BSIM3v1ldvt1wGiven = TRUE; - break; - case BSIM3v1_MOD_LDVT2W: - mod->BSIM3v1ldvt2w = value->rValue; - mod->BSIM3v1ldvt2wGiven = TRUE; - break; - case BSIM3v1_MOD_LDROUT: - mod->BSIM3v1ldrout = value->rValue; - mod->BSIM3v1ldroutGiven = TRUE; - break; - case BSIM3v1_MOD_LDSUB: - mod->BSIM3v1ldsub = value->rValue; - mod->BSIM3v1ldsubGiven = TRUE; - break; - case BSIM3v1_MOD_LVTH0: - mod->BSIM3v1lvth0 = value->rValue; - mod->BSIM3v1lvth0Given = TRUE; - break; - case BSIM3v1_MOD_LUA: - mod->BSIM3v1lua = value->rValue; - mod->BSIM3v1luaGiven = TRUE; - break; - case BSIM3v1_MOD_LUA1: - mod->BSIM3v1lua1 = value->rValue; - mod->BSIM3v1lua1Given = TRUE; - break; - case BSIM3v1_MOD_LUB: - mod->BSIM3v1lub = value->rValue; - mod->BSIM3v1lubGiven = TRUE; - break; - case BSIM3v1_MOD_LUB1: - mod->BSIM3v1lub1 = value->rValue; - mod->BSIM3v1lub1Given = TRUE; - break; - case BSIM3v1_MOD_LUC: - mod->BSIM3v1luc = value->rValue; - mod->BSIM3v1lucGiven = TRUE; - break; - case BSIM3v1_MOD_LUC1: - mod->BSIM3v1luc1 = value->rValue; - mod->BSIM3v1luc1Given = TRUE; - break; - case BSIM3v1_MOD_LU0 : - mod->BSIM3v1lu0 = value->rValue; - mod->BSIM3v1lu0Given = TRUE; - break; - case BSIM3v1_MOD_LUTE : - mod->BSIM3v1lute = value->rValue; - mod->BSIM3v1luteGiven = TRUE; - break; - case BSIM3v1_MOD_LVOFF: - mod->BSIM3v1lvoff = value->rValue; - mod->BSIM3v1lvoffGiven = TRUE; - break; - case BSIM3v1_MOD_LDELTA : - mod->BSIM3v1ldelta = value->rValue; - mod->BSIM3v1ldeltaGiven = TRUE; - break; - case BSIM3v1_MOD_LRDSW: - mod->BSIM3v1lrdsw = value->rValue; - mod->BSIM3v1lrdswGiven = TRUE; - break; - case BSIM3v1_MOD_LPRWB: - mod->BSIM3v1lprwb = value->rValue; - mod->BSIM3v1lprwbGiven = TRUE; - break; - case BSIM3v1_MOD_LPRWG: - mod->BSIM3v1lprwg = value->rValue; - mod->BSIM3v1lprwgGiven = TRUE; - break; - case BSIM3v1_MOD_LPRT: - mod->BSIM3v1lprt = value->rValue; - mod->BSIM3v1lprtGiven = TRUE; - break; - case BSIM3v1_MOD_LETA0: - mod->BSIM3v1leta0 = value->rValue; - mod->BSIM3v1leta0Given = TRUE; - break; - case BSIM3v1_MOD_LETAB: - mod->BSIM3v1letab = value->rValue; - mod->BSIM3v1letabGiven = TRUE; - break; - case BSIM3v1_MOD_LPCLM: - mod->BSIM3v1lpclm = value->rValue; - mod->BSIM3v1lpclmGiven = TRUE; - break; - case BSIM3v1_MOD_LPDIBL1: - mod->BSIM3v1lpdibl1 = value->rValue; - mod->BSIM3v1lpdibl1Given = TRUE; - break; - case BSIM3v1_MOD_LPDIBL2: - mod->BSIM3v1lpdibl2 = value->rValue; - mod->BSIM3v1lpdibl2Given = TRUE; - break; - case BSIM3v1_MOD_LPDIBLB: - mod->BSIM3v1lpdiblb = value->rValue; - mod->BSIM3v1lpdiblbGiven = TRUE; - break; - case BSIM3v1_MOD_LPSCBE1: - mod->BSIM3v1lpscbe1 = value->rValue; - mod->BSIM3v1lpscbe1Given = TRUE; - break; - case BSIM3v1_MOD_LPSCBE2: - mod->BSIM3v1lpscbe2 = value->rValue; - mod->BSIM3v1lpscbe2Given = TRUE; - break; - case BSIM3v1_MOD_LPVAG: - mod->BSIM3v1lpvag = value->rValue; - mod->BSIM3v1lpvagGiven = TRUE; - break; - case BSIM3v1_MOD_LWR : - mod->BSIM3v1lwr = value->rValue; - mod->BSIM3v1lwrGiven = TRUE; - break; - case BSIM3v1_MOD_LDWG : - mod->BSIM3v1ldwg = value->rValue; - mod->BSIM3v1ldwgGiven = TRUE; - break; - case BSIM3v1_MOD_LDWB : - mod->BSIM3v1ldwb = value->rValue; - mod->BSIM3v1ldwbGiven = TRUE; - break; - case BSIM3v1_MOD_LB0 : - mod->BSIM3v1lb0 = value->rValue; - mod->BSIM3v1lb0Given = TRUE; - break; - case BSIM3v1_MOD_LB1 : - mod->BSIM3v1lb1 = value->rValue; - mod->BSIM3v1lb1Given = TRUE; - break; - case BSIM3v1_MOD_LALPHA0 : - mod->BSIM3v1lalpha0 = value->rValue; - mod->BSIM3v1lalpha0Given = TRUE; - break; - case BSIM3v1_MOD_LBETA0 : - mod->BSIM3v1lbeta0 = value->rValue; - mod->BSIM3v1lbeta0Given = TRUE; - break; - - case BSIM3v1_MOD_LELM : - mod->BSIM3v1lelm = value->rValue; - mod->BSIM3v1lelmGiven = TRUE; - break; - case BSIM3v1_MOD_LCGSL : - mod->BSIM3v1lcgsl = value->rValue; - mod->BSIM3v1lcgslGiven = TRUE; - break; - case BSIM3v1_MOD_LCGDL : - mod->BSIM3v1lcgdl = value->rValue; - mod->BSIM3v1lcgdlGiven = TRUE; - break; - case BSIM3v1_MOD_LCKAPPA : - mod->BSIM3v1lckappa = value->rValue; - mod->BSIM3v1lckappaGiven = TRUE; - break; - case BSIM3v1_MOD_LCF : - mod->BSIM3v1lcf = value->rValue; - mod->BSIM3v1lcfGiven = TRUE; - break; - case BSIM3v1_MOD_LCLC : - mod->BSIM3v1lclc = value->rValue; - mod->BSIM3v1lclcGiven = TRUE; - break; - case BSIM3v1_MOD_LCLE : - mod->BSIM3v1lcle = value->rValue; - mod->BSIM3v1lcleGiven = TRUE; - break; - case BSIM3v1_MOD_LVFBCV : - mod->BSIM3v1lvfbcv = value->rValue; - mod->BSIM3v1lvfbcvGiven = TRUE; - break; - - /* Width dependence */ - case BSIM3v1_MOD_WCDSC : - mod->BSIM3v1wcdsc = value->rValue; - mod->BSIM3v1wcdscGiven = TRUE; - break; - - - case BSIM3v1_MOD_WCDSCB : - mod->BSIM3v1wcdscb = value->rValue; - mod->BSIM3v1wcdscbGiven = TRUE; - break; - case BSIM3v1_MOD_WCDSCD : - mod->BSIM3v1wcdscd = value->rValue; - mod->BSIM3v1wcdscdGiven = TRUE; - break; - case BSIM3v1_MOD_WCIT : - mod->BSIM3v1wcit = value->rValue; - mod->BSIM3v1wcitGiven = TRUE; - break; - case BSIM3v1_MOD_WNFACTOR : - mod->BSIM3v1wnfactor = value->rValue; - mod->BSIM3v1wnfactorGiven = TRUE; - break; - case BSIM3v1_MOD_WXJ: - mod->BSIM3v1wxj = value->rValue; - mod->BSIM3v1wxjGiven = TRUE; - break; - case BSIM3v1_MOD_WVSAT: - mod->BSIM3v1wvsat = value->rValue; - mod->BSIM3v1wvsatGiven = TRUE; - break; - - - case BSIM3v1_MOD_WA0: - mod->BSIM3v1wa0 = value->rValue; - mod->BSIM3v1wa0Given = TRUE; - break; - case BSIM3v1_MOD_WAGS: - mod->BSIM3v1wags = value->rValue; - mod->BSIM3v1wagsGiven = TRUE; - break; - case BSIM3v1_MOD_WA1: - mod->BSIM3v1wa1 = value->rValue; - mod->BSIM3v1wa1Given = TRUE; - break; - case BSIM3v1_MOD_WA2: - mod->BSIM3v1wa2 = value->rValue; - mod->BSIM3v1wa2Given = TRUE; - break; - case BSIM3v1_MOD_WAT: - mod->BSIM3v1wat = value->rValue; - mod->BSIM3v1watGiven = TRUE; - break; - case BSIM3v1_MOD_WKETA: - mod->BSIM3v1wketa = value->rValue; - mod->BSIM3v1wketaGiven = TRUE; - break; - case BSIM3v1_MOD_WNSUB: - mod->BSIM3v1wnsub = value->rValue; - mod->BSIM3v1wnsubGiven = TRUE; - break; - case BSIM3v1_MOD_WNPEAK: - mod->BSIM3v1wnpeak = value->rValue; - mod->BSIM3v1wnpeakGiven = TRUE; - if (mod->BSIM3v1wnpeak > 1.0e20) - mod->BSIM3v1wnpeak *= 1.0e-6; - break; - case BSIM3v1_MOD_WNGATE: - mod->BSIM3v1wngate = value->rValue; - mod->BSIM3v1wngateGiven = TRUE; - if (mod->BSIM3v1wngate > 1.0e23) - mod->BSIM3v1wngate *= 1.0e-6; - break; - case BSIM3v1_MOD_WGAMMA1: - mod->BSIM3v1wgamma1 = value->rValue; - mod->BSIM3v1wgamma1Given = TRUE; - break; - case BSIM3v1_MOD_WGAMMA2: - mod->BSIM3v1wgamma2 = value->rValue; - mod->BSIM3v1wgamma2Given = TRUE; - break; - case BSIM3v1_MOD_WVBX: - mod->BSIM3v1wvbx = value->rValue; - mod->BSIM3v1wvbxGiven = TRUE; - break; - case BSIM3v1_MOD_WVBM: - mod->BSIM3v1wvbm = value->rValue; - mod->BSIM3v1wvbmGiven = TRUE; - break; - case BSIM3v1_MOD_WXT: - mod->BSIM3v1wxt = value->rValue; - mod->BSIM3v1wxtGiven = TRUE; - break; - case BSIM3v1_MOD_WK1: - mod->BSIM3v1wk1 = value->rValue; - mod->BSIM3v1wk1Given = TRUE; - break; - case BSIM3v1_MOD_WKT1: - mod->BSIM3v1wkt1 = value->rValue; - mod->BSIM3v1wkt1Given = TRUE; - break; - case BSIM3v1_MOD_WKT1L: - mod->BSIM3v1wkt1l = value->rValue; - mod->BSIM3v1wkt1lGiven = TRUE; - break; - case BSIM3v1_MOD_WKT2: - mod->BSIM3v1wkt2 = value->rValue; - mod->BSIM3v1wkt2Given = TRUE; - break; - case BSIM3v1_MOD_WK2: - mod->BSIM3v1wk2 = value->rValue; - mod->BSIM3v1wk2Given = TRUE; - break; - case BSIM3v1_MOD_WK3: - mod->BSIM3v1wk3 = value->rValue; - mod->BSIM3v1wk3Given = TRUE; - break; - case BSIM3v1_MOD_WK3B: - mod->BSIM3v1wk3b = value->rValue; - mod->BSIM3v1wk3bGiven = TRUE; - break; - case BSIM3v1_MOD_WNLX: - mod->BSIM3v1wnlx = value->rValue; - mod->BSIM3v1wnlxGiven = TRUE; - break; - case BSIM3v1_MOD_WW0: - mod->BSIM3v1ww0 = value->rValue; - mod->BSIM3v1ww0Given = TRUE; - break; - case BSIM3v1_MOD_WDVT0: - mod->BSIM3v1wdvt0 = value->rValue; - mod->BSIM3v1wdvt0Given = TRUE; - break; - case BSIM3v1_MOD_WDVT1: - mod->BSIM3v1wdvt1 = value->rValue; - mod->BSIM3v1wdvt1Given = TRUE; - break; - case BSIM3v1_MOD_WDVT2: - mod->BSIM3v1wdvt2 = value->rValue; - mod->BSIM3v1wdvt2Given = TRUE; - break; - case BSIM3v1_MOD_WDVT0W: - mod->BSIM3v1wdvt0w = value->rValue; - mod->BSIM3v1wdvt0wGiven = TRUE; - break; - case BSIM3v1_MOD_WDVT1W: - mod->BSIM3v1wdvt1w = value->rValue; - mod->BSIM3v1wdvt1wGiven = TRUE; - break; - case BSIM3v1_MOD_WDVT2W: - mod->BSIM3v1wdvt2w = value->rValue; - mod->BSIM3v1wdvt2wGiven = TRUE; - break; - case BSIM3v1_MOD_WDROUT: - mod->BSIM3v1wdrout = value->rValue; - mod->BSIM3v1wdroutGiven = TRUE; - break; - case BSIM3v1_MOD_WDSUB: - mod->BSIM3v1wdsub = value->rValue; - mod->BSIM3v1wdsubGiven = TRUE; - break; - case BSIM3v1_MOD_WVTH0: - mod->BSIM3v1wvth0 = value->rValue; - mod->BSIM3v1wvth0Given = TRUE; - break; - case BSIM3v1_MOD_WUA: - mod->BSIM3v1wua = value->rValue; - mod->BSIM3v1wuaGiven = TRUE; - break; - case BSIM3v1_MOD_WUA1: - mod->BSIM3v1wua1 = value->rValue; - mod->BSIM3v1wua1Given = TRUE; - break; - case BSIM3v1_MOD_WUB: - mod->BSIM3v1wub = value->rValue; - mod->BSIM3v1wubGiven = TRUE; - break; - case BSIM3v1_MOD_WUB1: - mod->BSIM3v1wub1 = value->rValue; - mod->BSIM3v1wub1Given = TRUE; - break; - case BSIM3v1_MOD_WUC: - mod->BSIM3v1wuc = value->rValue; - mod->BSIM3v1wucGiven = TRUE; - break; - case BSIM3v1_MOD_WUC1: - mod->BSIM3v1wuc1 = value->rValue; - mod->BSIM3v1wuc1Given = TRUE; - break; - case BSIM3v1_MOD_WU0 : - mod->BSIM3v1wu0 = value->rValue; - mod->BSIM3v1wu0Given = TRUE; - break; - case BSIM3v1_MOD_WUTE : - mod->BSIM3v1wute = value->rValue; - mod->BSIM3v1wuteGiven = TRUE; - break; - case BSIM3v1_MOD_WVOFF: - mod->BSIM3v1wvoff = value->rValue; - mod->BSIM3v1wvoffGiven = TRUE; - break; - case BSIM3v1_MOD_WDELTA : - mod->BSIM3v1wdelta = value->rValue; - mod->BSIM3v1wdeltaGiven = TRUE; - break; - case BSIM3v1_MOD_WRDSW: - mod->BSIM3v1wrdsw = value->rValue; - mod->BSIM3v1wrdswGiven = TRUE; - break; - case BSIM3v1_MOD_WPRWB: - mod->BSIM3v1wprwb = value->rValue; - mod->BSIM3v1wprwbGiven = TRUE; - break; - case BSIM3v1_MOD_WPRWG: - mod->BSIM3v1wprwg = value->rValue; - mod->BSIM3v1wprwgGiven = TRUE; - break; - case BSIM3v1_MOD_WPRT: - mod->BSIM3v1wprt = value->rValue; - mod->BSIM3v1wprtGiven = TRUE; - break; - case BSIM3v1_MOD_WETA0: - mod->BSIM3v1weta0 = value->rValue; - mod->BSIM3v1weta0Given = TRUE; - break; - case BSIM3v1_MOD_WETAB: - mod->BSIM3v1wetab = value->rValue; - mod->BSIM3v1wetabGiven = TRUE; - break; - case BSIM3v1_MOD_WPCLM: - mod->BSIM3v1wpclm = value->rValue; - mod->BSIM3v1wpclmGiven = TRUE; - break; - case BSIM3v1_MOD_WPDIBL1: - mod->BSIM3v1wpdibl1 = value->rValue; - mod->BSIM3v1wpdibl1Given = TRUE; - break; - case BSIM3v1_MOD_WPDIBL2: - mod->BSIM3v1wpdibl2 = value->rValue; - mod->BSIM3v1wpdibl2Given = TRUE; - break; - case BSIM3v1_MOD_WPDIBLB: - mod->BSIM3v1wpdiblb = value->rValue; - mod->BSIM3v1wpdiblbGiven = TRUE; - break; - case BSIM3v1_MOD_WPSCBE1: - mod->BSIM3v1wpscbe1 = value->rValue; - mod->BSIM3v1wpscbe1Given = TRUE; - break; - case BSIM3v1_MOD_WPSCBE2: - mod->BSIM3v1wpscbe2 = value->rValue; - mod->BSIM3v1wpscbe2Given = TRUE; - break; - case BSIM3v1_MOD_WPVAG: - mod->BSIM3v1wpvag = value->rValue; - mod->BSIM3v1wpvagGiven = TRUE; - break; - case BSIM3v1_MOD_WWR : - mod->BSIM3v1wwr = value->rValue; - mod->BSIM3v1wwrGiven = TRUE; - break; - case BSIM3v1_MOD_WDWG : - mod->BSIM3v1wdwg = value->rValue; - mod->BSIM3v1wdwgGiven = TRUE; - break; - case BSIM3v1_MOD_WDWB : - mod->BSIM3v1wdwb = value->rValue; - mod->BSIM3v1wdwbGiven = TRUE; - break; - case BSIM3v1_MOD_WB0 : - mod->BSIM3v1wb0 = value->rValue; - mod->BSIM3v1wb0Given = TRUE; - break; - case BSIM3v1_MOD_WB1 : - mod->BSIM3v1wb1 = value->rValue; - mod->BSIM3v1wb1Given = TRUE; - break; - case BSIM3v1_MOD_WALPHA0 : - mod->BSIM3v1walpha0 = value->rValue; - mod->BSIM3v1walpha0Given = TRUE; - break; - case BSIM3v1_MOD_WBETA0 : - mod->BSIM3v1wbeta0 = value->rValue; - mod->BSIM3v1wbeta0Given = TRUE; - break; - - case BSIM3v1_MOD_WELM : - mod->BSIM3v1welm = value->rValue; - mod->BSIM3v1welmGiven = TRUE; - break; - case BSIM3v1_MOD_WCGSL : - mod->BSIM3v1wcgsl = value->rValue; - mod->BSIM3v1wcgslGiven = TRUE; - break; - case BSIM3v1_MOD_WCGDL : - mod->BSIM3v1wcgdl = value->rValue; - mod->BSIM3v1wcgdlGiven = TRUE; - break; - case BSIM3v1_MOD_WCKAPPA : - mod->BSIM3v1wckappa = value->rValue; - mod->BSIM3v1wckappaGiven = TRUE; - break; - case BSIM3v1_MOD_WCF : - mod->BSIM3v1wcf = value->rValue; - mod->BSIM3v1wcfGiven = TRUE; - break; - case BSIM3v1_MOD_WCLC : - mod->BSIM3v1wclc = value->rValue; - mod->BSIM3v1wclcGiven = TRUE; - break; - case BSIM3v1_MOD_WCLE : - mod->BSIM3v1wcle = value->rValue; - mod->BSIM3v1wcleGiven = TRUE; - break; - case BSIM3v1_MOD_WVFBCV : - mod->BSIM3v1wvfbcv = value->rValue; - mod->BSIM3v1wvfbcvGiven = TRUE; - break; - - /* Cross-term dependence */ - case BSIM3v1_MOD_PCDSC : - mod->BSIM3v1pcdsc = value->rValue; - mod->BSIM3v1pcdscGiven = TRUE; - break; - - - case BSIM3v1_MOD_PCDSCB : - mod->BSIM3v1pcdscb = value->rValue; - mod->BSIM3v1pcdscbGiven = TRUE; - break; - case BSIM3v1_MOD_PCDSCD : - mod->BSIM3v1pcdscd = value->rValue; - mod->BSIM3v1pcdscdGiven = TRUE; - break; - case BSIM3v1_MOD_PCIT : - mod->BSIM3v1pcit = value->rValue; - mod->BSIM3v1pcitGiven = TRUE; - break; - case BSIM3v1_MOD_PNFACTOR : - mod->BSIM3v1pnfactor = value->rValue; - mod->BSIM3v1pnfactorGiven = TRUE; - break; - case BSIM3v1_MOD_PXJ: - mod->BSIM3v1pxj = value->rValue; - mod->BSIM3v1pxjGiven = TRUE; - break; - case BSIM3v1_MOD_PVSAT: - mod->BSIM3v1pvsat = value->rValue; - mod->BSIM3v1pvsatGiven = TRUE; - break; - - - case BSIM3v1_MOD_PA0: - mod->BSIM3v1pa0 = value->rValue; - mod->BSIM3v1pa0Given = TRUE; - break; - case BSIM3v1_MOD_PAGS: - mod->BSIM3v1pags = value->rValue; - mod->BSIM3v1pagsGiven = TRUE; - break; - case BSIM3v1_MOD_PA1: - mod->BSIM3v1pa1 = value->rValue; - mod->BSIM3v1pa1Given = TRUE; - break; - case BSIM3v1_MOD_PA2: - mod->BSIM3v1pa2 = value->rValue; - mod->BSIM3v1pa2Given = TRUE; - break; - case BSIM3v1_MOD_PAT: - mod->BSIM3v1pat = value->rValue; - mod->BSIM3v1patGiven = TRUE; - break; - case BSIM3v1_MOD_PKETA: - mod->BSIM3v1pketa = value->rValue; - mod->BSIM3v1pketaGiven = TRUE; - break; - case BSIM3v1_MOD_PNSUB: - mod->BSIM3v1pnsub = value->rValue; - mod->BSIM3v1pnsubGiven = TRUE; - break; - case BSIM3v1_MOD_PNPEAK: - mod->BSIM3v1pnpeak = value->rValue; - mod->BSIM3v1pnpeakGiven = TRUE; - if (mod->BSIM3v1pnpeak > 1.0e20) - mod->BSIM3v1pnpeak *= 1.0e-6; - break; - case BSIM3v1_MOD_PNGATE: - mod->BSIM3v1pngate = value->rValue; - mod->BSIM3v1pngateGiven = TRUE; - if (mod->BSIM3v1pngate > 1.0e23) - mod->BSIM3v1pngate *= 1.0e-6; - break; - case BSIM3v1_MOD_PGAMMA1: - mod->BSIM3v1pgamma1 = value->rValue; - mod->BSIM3v1pgamma1Given = TRUE; - break; - case BSIM3v1_MOD_PGAMMA2: - mod->BSIM3v1pgamma2 = value->rValue; - mod->BSIM3v1pgamma2Given = TRUE; - break; - case BSIM3v1_MOD_PVBX: - mod->BSIM3v1pvbx = value->rValue; - mod->BSIM3v1pvbxGiven = TRUE; - break; - case BSIM3v1_MOD_PVBM: - mod->BSIM3v1pvbm = value->rValue; - mod->BSIM3v1pvbmGiven = TRUE; - break; - case BSIM3v1_MOD_PXT: - mod->BSIM3v1pxt = value->rValue; - mod->BSIM3v1pxtGiven = TRUE; - break; - case BSIM3v1_MOD_PK1: - mod->BSIM3v1pk1 = value->rValue; - mod->BSIM3v1pk1Given = TRUE; - break; - case BSIM3v1_MOD_PKT1: - mod->BSIM3v1pkt1 = value->rValue; - mod->BSIM3v1pkt1Given = TRUE; - break; - case BSIM3v1_MOD_PKT1L: - mod->BSIM3v1pkt1l = value->rValue; - mod->BSIM3v1pkt1lGiven = TRUE; - break; - case BSIM3v1_MOD_PKT2: - mod->BSIM3v1pkt2 = value->rValue; - mod->BSIM3v1pkt2Given = TRUE; - break; - case BSIM3v1_MOD_PK2: - mod->BSIM3v1pk2 = value->rValue; - mod->BSIM3v1pk2Given = TRUE; - break; - case BSIM3v1_MOD_PK3: - mod->BSIM3v1pk3 = value->rValue; - mod->BSIM3v1pk3Given = TRUE; - break; - case BSIM3v1_MOD_PK3B: - mod->BSIM3v1pk3b = value->rValue; - mod->BSIM3v1pk3bGiven = TRUE; - break; - case BSIM3v1_MOD_PNLX: - mod->BSIM3v1pnlx = value->rValue; - mod->BSIM3v1pnlxGiven = TRUE; - break; - case BSIM3v1_MOD_PW0: - mod->BSIM3v1pw0 = value->rValue; - mod->BSIM3v1pw0Given = TRUE; - break; - case BSIM3v1_MOD_PDVT0: - mod->BSIM3v1pdvt0 = value->rValue; - mod->BSIM3v1pdvt0Given = TRUE; - break; - case BSIM3v1_MOD_PDVT1: - mod->BSIM3v1pdvt1 = value->rValue; - mod->BSIM3v1pdvt1Given = TRUE; - break; - case BSIM3v1_MOD_PDVT2: - mod->BSIM3v1pdvt2 = value->rValue; - mod->BSIM3v1pdvt2Given = TRUE; - break; - case BSIM3v1_MOD_PDVT0W: - mod->BSIM3v1pdvt0w = value->rValue; - mod->BSIM3v1pdvt0wGiven = TRUE; - break; - case BSIM3v1_MOD_PDVT1W: - mod->BSIM3v1pdvt1w = value->rValue; - mod->BSIM3v1pdvt1wGiven = TRUE; - break; - case BSIM3v1_MOD_PDVT2W: - mod->BSIM3v1pdvt2w = value->rValue; - mod->BSIM3v1pdvt2wGiven = TRUE; - break; - case BSIM3v1_MOD_PDROUT: - mod->BSIM3v1pdrout = value->rValue; - mod->BSIM3v1pdroutGiven = TRUE; - break; - case BSIM3v1_MOD_PDSUB: - mod->BSIM3v1pdsub = value->rValue; - mod->BSIM3v1pdsubGiven = TRUE; - break; - case BSIM3v1_MOD_PVTH0: - mod->BSIM3v1pvth0 = value->rValue; - mod->BSIM3v1pvth0Given = TRUE; - break; - case BSIM3v1_MOD_PUA: - mod->BSIM3v1pua = value->rValue; - mod->BSIM3v1puaGiven = TRUE; - break; - case BSIM3v1_MOD_PUA1: - mod->BSIM3v1pua1 = value->rValue; - mod->BSIM3v1pua1Given = TRUE; - break; - case BSIM3v1_MOD_PUB: - mod->BSIM3v1pub = value->rValue; - mod->BSIM3v1pubGiven = TRUE; - break; - case BSIM3v1_MOD_PUB1: - mod->BSIM3v1pub1 = value->rValue; - mod->BSIM3v1pub1Given = TRUE; - break; - case BSIM3v1_MOD_PUC: - mod->BSIM3v1puc = value->rValue; - mod->BSIM3v1pucGiven = TRUE; - break; - case BSIM3v1_MOD_PUC1: - mod->BSIM3v1puc1 = value->rValue; - mod->BSIM3v1puc1Given = TRUE; - break; - case BSIM3v1_MOD_PU0 : - mod->BSIM3v1pu0 = value->rValue; - mod->BSIM3v1pu0Given = TRUE; - break; - case BSIM3v1_MOD_PUTE : - mod->BSIM3v1pute = value->rValue; - mod->BSIM3v1puteGiven = TRUE; - break; - case BSIM3v1_MOD_PVOFF: - mod->BSIM3v1pvoff = value->rValue; - mod->BSIM3v1pvoffGiven = TRUE; - break; - case BSIM3v1_MOD_PDELTA : - mod->BSIM3v1pdelta = value->rValue; - mod->BSIM3v1pdeltaGiven = TRUE; - break; - case BSIM3v1_MOD_PRDSW: - mod->BSIM3v1prdsw = value->rValue; - mod->BSIM3v1prdswGiven = TRUE; - break; - case BSIM3v1_MOD_PPRWB: - mod->BSIM3v1pprwb = value->rValue; - mod->BSIM3v1pprwbGiven = TRUE; - break; - case BSIM3v1_MOD_PPRWG: - mod->BSIM3v1pprwg = value->rValue; - mod->BSIM3v1pprwgGiven = TRUE; - break; - case BSIM3v1_MOD_PPRT: - mod->BSIM3v1pprt = value->rValue; - mod->BSIM3v1pprtGiven = TRUE; - break; - case BSIM3v1_MOD_PETA0: - mod->BSIM3v1peta0 = value->rValue; - mod->BSIM3v1peta0Given = TRUE; - break; - case BSIM3v1_MOD_PETAB: - mod->BSIM3v1petab = value->rValue; - mod->BSIM3v1petabGiven = TRUE; - break; - case BSIM3v1_MOD_PPCLM: - mod->BSIM3v1ppclm = value->rValue; - mod->BSIM3v1ppclmGiven = TRUE; - break; - case BSIM3v1_MOD_PPDIBL1: - mod->BSIM3v1ppdibl1 = value->rValue; - mod->BSIM3v1ppdibl1Given = TRUE; - break; - case BSIM3v1_MOD_PPDIBL2: - mod->BSIM3v1ppdibl2 = value->rValue; - mod->BSIM3v1ppdibl2Given = TRUE; - break; - case BSIM3v1_MOD_PPDIBLB: - mod->BSIM3v1ppdiblb = value->rValue; - mod->BSIM3v1ppdiblbGiven = TRUE; - break; - case BSIM3v1_MOD_PPSCBE1: - mod->BSIM3v1ppscbe1 = value->rValue; - mod->BSIM3v1ppscbe1Given = TRUE; - break; - case BSIM3v1_MOD_PPSCBE2: - mod->BSIM3v1ppscbe2 = value->rValue; - mod->BSIM3v1ppscbe2Given = TRUE; - break; - case BSIM3v1_MOD_PPVAG: - mod->BSIM3v1ppvag = value->rValue; - mod->BSIM3v1ppvagGiven = TRUE; - break; - case BSIM3v1_MOD_PWR : - mod->BSIM3v1pwr = value->rValue; - mod->BSIM3v1pwrGiven = TRUE; - break; - case BSIM3v1_MOD_PDWG : - mod->BSIM3v1pdwg = value->rValue; - mod->BSIM3v1pdwgGiven = TRUE; - break; - case BSIM3v1_MOD_PDWB : - mod->BSIM3v1pdwb = value->rValue; - mod->BSIM3v1pdwbGiven = TRUE; - break; - case BSIM3v1_MOD_PB0 : - mod->BSIM3v1pb0 = value->rValue; - mod->BSIM3v1pb0Given = TRUE; - break; - case BSIM3v1_MOD_PB1 : - mod->BSIM3v1pb1 = value->rValue; - mod->BSIM3v1pb1Given = TRUE; - break; - case BSIM3v1_MOD_PALPHA0 : - mod->BSIM3v1palpha0 = value->rValue; - mod->BSIM3v1palpha0Given = TRUE; - break; - case BSIM3v1_MOD_PBETA0 : - mod->BSIM3v1pbeta0 = value->rValue; - mod->BSIM3v1pbeta0Given = TRUE; - break; - - case BSIM3v1_MOD_PELM : - mod->BSIM3v1pelm = value->rValue; - mod->BSIM3v1pelmGiven = TRUE; - break; - case BSIM3v1_MOD_PCGSL : - mod->BSIM3v1pcgsl = value->rValue; - mod->BSIM3v1pcgslGiven = TRUE; - break; - case BSIM3v1_MOD_PCGDL : - mod->BSIM3v1pcgdl = value->rValue; - mod->BSIM3v1pcgdlGiven = TRUE; - break; - case BSIM3v1_MOD_PCKAPPA : - mod->BSIM3v1pckappa = value->rValue; - mod->BSIM3v1pckappaGiven = TRUE; - break; - case BSIM3v1_MOD_PCF : - mod->BSIM3v1pcf = value->rValue; - mod->BSIM3v1pcfGiven = TRUE; - break; - case BSIM3v1_MOD_PCLC : - mod->BSIM3v1pclc = value->rValue; - mod->BSIM3v1pclcGiven = TRUE; - break; - case BSIM3v1_MOD_PCLE : - mod->BSIM3v1pcle = value->rValue; - mod->BSIM3v1pcleGiven = TRUE; - break; - case BSIM3v1_MOD_PVFBCV : - mod->BSIM3v1pvfbcv = value->rValue; - mod->BSIM3v1pvfbcvGiven = TRUE; - break; - - case BSIM3v1_MOD_TNOM : - mod->BSIM3v1tnom = value->rValue + 273.15; - mod->BSIM3v1tnomGiven = TRUE; - break; - case BSIM3v1_MOD_CGSO : - mod->BSIM3v1cgso = value->rValue; - mod->BSIM3v1cgsoGiven = TRUE; - break; - case BSIM3v1_MOD_CGDO : - mod->BSIM3v1cgdo = value->rValue; - mod->BSIM3v1cgdoGiven = TRUE; - break; - case BSIM3v1_MOD_CGBO : - mod->BSIM3v1cgbo = value->rValue; - mod->BSIM3v1cgboGiven = TRUE; - break; - case BSIM3v1_MOD_XPART : - mod->BSIM3v1xpart = value->rValue; - mod->BSIM3v1xpartGiven = TRUE; - break; - case BSIM3v1_MOD_RSH : - mod->BSIM3v1sheetResistance = value->rValue; - mod->BSIM3v1sheetResistanceGiven = TRUE; - break; - case BSIM3v1_MOD_JS : - mod->BSIM3v1jctSatCurDensity = value->rValue; - mod->BSIM3v1jctSatCurDensityGiven = TRUE; - break; - case BSIM3v1_MOD_JSW : - mod->BSIM3v1jctSidewallSatCurDensity = value->rValue; - mod->BSIM3v1jctSidewallSatCurDensityGiven = TRUE; - break; - case BSIM3v1_MOD_PB : - mod->BSIM3v1bulkJctPotential = value->rValue; - mod->BSIM3v1bulkJctPotentialGiven = TRUE; - break; - case BSIM3v1_MOD_MJ : - mod->BSIM3v1bulkJctBotGradingCoeff = value->rValue; - mod->BSIM3v1bulkJctBotGradingCoeffGiven = TRUE; - break; - case BSIM3v1_MOD_PBSW : - mod->BSIM3v1sidewallJctPotential = value->rValue; - mod->BSIM3v1sidewallJctPotentialGiven = TRUE; - break; - case BSIM3v1_MOD_MJSW : - mod->BSIM3v1bulkJctSideGradingCoeff = value->rValue; - mod->BSIM3v1bulkJctSideGradingCoeffGiven = TRUE; - break; - case BSIM3v1_MOD_CJ : - mod->BSIM3v1unitAreaJctCap = value->rValue; - mod->BSIM3v1unitAreaJctCapGiven = TRUE; - break; - case BSIM3v1_MOD_CJSW : - mod->BSIM3v1unitLengthSidewallJctCap = value->rValue; - mod->BSIM3v1unitLengthSidewallJctCapGiven = TRUE; - break; - case BSIM3v1_MOD_NJ : - mod->BSIM3v1jctEmissionCoeff = value->rValue; - mod->BSIM3v1jctEmissionCoeffGiven = TRUE; - break; - case BSIM3v1_MOD_PBSWG : - mod->BSIM3v1GatesidewallJctPotential = value->rValue; - mod->BSIM3v1GatesidewallJctPotentialGiven = TRUE; - break; - case BSIM3v1_MOD_MJSWG : - mod->BSIM3v1bulkJctGateSideGradingCoeff = value->rValue; - mod->BSIM3v1bulkJctGateSideGradingCoeffGiven = TRUE; - break; - case BSIM3v1_MOD_CJSWG : - mod->BSIM3v1unitLengthGateSidewallJctCap = value->rValue; - mod->BSIM3v1unitLengthGateSidewallJctCapGiven = TRUE; - break; - case BSIM3v1_MOD_XTI : - mod->BSIM3v1jctTempExponent = value->rValue; - mod->BSIM3v1jctTempExponentGiven = TRUE; - break; - case BSIM3v1_MOD_LINT : - mod->BSIM3v1Lint = value->rValue; - mod->BSIM3v1LintGiven = TRUE; - break; - case BSIM3v1_MOD_LL : - mod->BSIM3v1Ll = value->rValue; - mod->BSIM3v1LlGiven = TRUE; - break; - case BSIM3v1_MOD_LLN : - mod->BSIM3v1Lln = value->rValue; - mod->BSIM3v1LlnGiven = TRUE; - break; - case BSIM3v1_MOD_LW : - mod->BSIM3v1Lw = value->rValue; - mod->BSIM3v1LwGiven = TRUE; - break; - case BSIM3v1_MOD_LWN : - mod->BSIM3v1Lwn = value->rValue; - mod->BSIM3v1LwnGiven = TRUE; - break; - case BSIM3v1_MOD_LWL : - mod->BSIM3v1Lwl = value->rValue; - mod->BSIM3v1LwlGiven = TRUE; - break; - case BSIM3v1_MOD_LMIN : - mod->BSIM3v1Lmin = value->rValue; - mod->BSIM3v1LminGiven = TRUE; - break; - case BSIM3v1_MOD_LMAX : - mod->BSIM3v1Lmax = value->rValue; - mod->BSIM3v1LmaxGiven = TRUE; - break; - case BSIM3v1_MOD_WINT : - mod->BSIM3v1Wint = value->rValue; - mod->BSIM3v1WintGiven = TRUE; - break; - case BSIM3v1_MOD_WL : - mod->BSIM3v1Wl = value->rValue; - mod->BSIM3v1WlGiven = TRUE; - break; - case BSIM3v1_MOD_WLN : - mod->BSIM3v1Wln = value->rValue; - mod->BSIM3v1WlnGiven = TRUE; - break; - case BSIM3v1_MOD_WW : - mod->BSIM3v1Ww = value->rValue; - mod->BSIM3v1WwGiven = TRUE; - break; - case BSIM3v1_MOD_WWN : - mod->BSIM3v1Wwn = value->rValue; - mod->BSIM3v1WwnGiven = TRUE; - break; - case BSIM3v1_MOD_WWL : - mod->BSIM3v1Wwl = value->rValue; - mod->BSIM3v1WwlGiven = TRUE; - break; - case BSIM3v1_MOD_WMIN : - mod->BSIM3v1Wmin = value->rValue; - mod->BSIM3v1WminGiven = TRUE; - break; - case BSIM3v1_MOD_WMAX : - mod->BSIM3v1Wmax = value->rValue; - mod->BSIM3v1WmaxGiven = TRUE; - break; - - case BSIM3v1_MOD_NOIA : - mod->BSIM3v1oxideTrapDensityA = value->rValue; - mod->BSIM3v1oxideTrapDensityAGiven = TRUE; - break; - case BSIM3v1_MOD_NOIB : - mod->BSIM3v1oxideTrapDensityB = value->rValue; - mod->BSIM3v1oxideTrapDensityBGiven = TRUE; - break; - case BSIM3v1_MOD_NOIC : - mod->BSIM3v1oxideTrapDensityC = value->rValue; - mod->BSIM3v1oxideTrapDensityCGiven = TRUE; - break; - case BSIM3v1_MOD_EM : - mod->BSIM3v1em = value->rValue; - mod->BSIM3v1emGiven = TRUE; - break; - case BSIM3v1_MOD_EF : - mod->BSIM3v1ef = value->rValue; - mod->BSIM3v1efGiven = TRUE; - break; - case BSIM3v1_MOD_AF : - mod->BSIM3v1af = value->rValue; - mod->BSIM3v1afGiven = TRUE; - break; - case BSIM3v1_MOD_KF : - mod->BSIM3v1kf = value->rValue; - mod->BSIM3v1kfGiven = TRUE; - break; - case BSIM3v1_MOD_NMOS : - if(value->iValue) { - mod->BSIM3v1type = 1; - mod->BSIM3v1typeGiven = TRUE; - } - break; - case BSIM3v1_MOD_PMOS : - if(value->iValue) { - mod->BSIM3v1type = - 1; - mod->BSIM3v1typeGiven = TRUE; - } - break; -/* serban */ - case BSIM3v1_MOD_HDIF : - mod->BSIM3v1hdif = value->rValue; - mod->BSIM3v1hdifGiven = TRUE; - break; - default: - return(E_BADPARM); - } - return(OK); -} - - diff --git a/src/spicelib/devices/bsim3v1/b3v1noi.c b/src/spicelib/devices/bsim3v1/b3v1noi.c deleted file mode 100644 index df950dd7a..000000000 --- a/src/spicelib/devices/bsim3v1/b3v1noi.c +++ /dev/null @@ -1,340 +0,0 @@ -/********** - * Copyright 1990 Regents of the University of California. All rights reserved. - * File: b3noi.c - * Author: 1995 Min-Chie Jeng and Mansun Chan. - * Modified by Paolo Nenzi 2002 - **********/ - -/* - * Release Notes: - * BSIM3v1v3.1, Released by yuhua 96/12/08 - */ - -#include "ngspice/ngspice.h" -#include "bsim3v1def.h" -#include "ngspice/cktdefs.h" -#include "ngspice/iferrmsg.h" -#include "ngspice/noisedef.h" -#include "ngspice/suffix.h" -#include "ngspice/const.h" /* jwan */ - -/* - * BSIM3v1noise (mode, operation, firstModel, ckt, data, OnDens) - * This routine names and evaluates all of the noise sources - * associated with MOSFET's. It starts with the model *firstModel and - * traverses all of its insts. It then proceeds to any other models - * on the linked list. The total output noise density generated by - * all of the MOSFET's is summed with the variable "OnDens". - */ - -/* - Channel thermal and flicker noises are calculated based on the value - of model->BSIM3v1noiMod. - If model->BSIM3v1noiMod = 1, - Channel thermal noise = SPICE2 model - Flicker noise = SPICE2 model - If model->BSIM3v1noiMod = 2, - Channel thermal noise = BSIM3v1 model - Flicker noise = BSIM3v1 model - If model->BSIM3v1noiMod = 3, - Channel thermal noise = SPICE2 model - Flicker noise = BSIM3v1 model - If model->BSIM3v1noiMod = 4, - Channel thermal noise = BSIM3v1 model - Flicker noise = SPICE2 model - */ - - -static double -StrongInversionNoiseEval_b3(double vgs, double vds, BSIM3v1model *model, - BSIM3v1instance *here, double freq, double temp) -{ -struct bsim3v1SizeDependParam *pParam; -double cd, esat, DelClm, EffFreq, N0, Nl, Vgst; -double T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, Ssi; - - pParam = here->pParam; - cd = fabs(here->BSIM3v1cd) * here->BSIM3v1m; - if (vds > here->BSIM3v1vdsat) - { esat = 2.0 * pParam->BSIM3v1vsattemp / here->BSIM3v1ueff; - T0 = ((((vds - here->BSIM3v1vdsat) / pParam->BSIM3v1litl) + model->BSIM3v1em) - / esat); - DelClm = pParam->BSIM3v1litl * log (MAX(T0, N_MINLOG)); - } - else - DelClm = 0.0; - EffFreq = pow(freq, model->BSIM3v1ef); - T1 = CHARGE * CHARGE * 8.62e-5 * cd * temp * here->BSIM3v1ueff; - T2 = 1.0e8 * EffFreq * model->BSIM3v1cox - * pParam->BSIM3v1leff * pParam->BSIM3v1leff; - Vgst = vgs - here->BSIM3v1von; - N0 = model->BSIM3v1cox * Vgst / CHARGE; - if (N0 < 0.0) - N0 = 0.0; - Nl = model->BSIM3v1cox * (Vgst - MIN(vds, here->BSIM3v1vdsat)) / CHARGE; - if (Nl < 0.0) - Nl = 0.0; - - T3 = model->BSIM3v1oxideTrapDensityA - * log(MAX(((N0 + 2.0e14) / (Nl + 2.0e14)), N_MINLOG)); - T4 = model->BSIM3v1oxideTrapDensityB * (N0 - Nl); - T5 = model->BSIM3v1oxideTrapDensityC * 0.5 * (N0 * N0 - Nl * Nl); - - T6 = 8.62e-5 * temp * cd * cd; - T7 = 1.0e8 * EffFreq * pParam->BSIM3v1leff - * pParam->BSIM3v1leff * pParam->BSIM3v1weff * here->BSIM3v1m; - T8 = model->BSIM3v1oxideTrapDensityA + model->BSIM3v1oxideTrapDensityB * Nl - + model->BSIM3v1oxideTrapDensityC * Nl * Nl; - T9 = (Nl + 2.0e14) * (Nl + 2.0e14); - - Ssi = T1 / T2 * (T3 + T4 + T5) + T6 / T7 * DelClm * T8 / T9; - return Ssi; -} - -int -BSIM3v1noise (int mode, int operation, GENmodel *inModel, CKTcircuit *ckt, - Ndata *data, double *OnDens) -{ -NOISEAN *job = (NOISEAN *) ckt->CKTcurJob; - -BSIM3v1model *model = (BSIM3v1model *)inModel; -BSIM3v1instance *here; -struct bsim3v1SizeDependParam *pParam; -double tempOnoise; -double tempInoise; -double noizDens[BSIM3v1NSRCS]; -double lnNdens[BSIM3v1NSRCS]; - -double vgs, vds, Slimit; -double T1, T10, T11; -double Ssi, Swi; - -int i; - - /* define the names of the noise sources */ - static char *BSIM3v1nNames[BSIM3v1NSRCS] = - { /* Note that we have to keep the order */ - ".rd", /* noise due to rd */ - /* consistent with the index definitions */ - ".rs", /* noise due to rs */ - /* in BSIM3v1defs.h */ - ".id", /* noise due to id */ - ".1overf", /* flicker (1/f) noise */ - "" /* total transistor noise */ - }; - - for (; model != NULL; model = BSIM3v1nextModel(model)) - { for (here = BSIM3v1instances(model); here != NULL; - here = BSIM3v1nextInstance(here)) - { - pParam = here->pParam; - switch (operation) - { case N_OPEN: - /* see if we have to to produce a summary report */ - /* if so, name all the noise generators */ - - if (job->NStpsSm != 0) - { switch (mode) - { case N_DENS: - for (i = 0; i < BSIM3v1NSRCS; i++) - { NOISE_ADD_OUTVAR(ckt, data, "onoise.%s%s", here->BSIM3v1name, BSIM3v1nNames[i]); - } - break; - case INT_NOIZ: - for (i = 0; i < BSIM3v1NSRCS; i++) - { NOISE_ADD_OUTVAR(ckt, data, "onoise_total.%s%s", here->BSIM3v1name, BSIM3v1nNames[i]); - NOISE_ADD_OUTVAR(ckt, data, "inoise_total.%s%s", here->BSIM3v1name, BSIM3v1nNames[i]); - } - break; - } - } - break; - case N_CALC: - switch (mode) - { case N_DENS: - NevalSrc(&noizDens[BSIM3v1RDNOIZ], - &lnNdens[BSIM3v1RDNOIZ], ckt, THERMNOISE, - here->BSIM3v1dNodePrime, here->BSIM3v1dNode, - here->BSIM3v1drainConductance * here->BSIM3v1m); - - NevalSrc(&noizDens[BSIM3v1RSNOIZ], - &lnNdens[BSIM3v1RSNOIZ], ckt, THERMNOISE, - here->BSIM3v1sNodePrime, here->BSIM3v1sNode, - here->BSIM3v1sourceConductance * here->BSIM3v1m); - - switch( model->BSIM3v1noiMod ) - { case 1: - case 3: - NevalSrc(&noizDens[BSIM3v1IDNOIZ], - &lnNdens[BSIM3v1IDNOIZ], ckt, - THERMNOISE, here->BSIM3v1dNodePrime, - here->BSIM3v1sNodePrime, - (2.0 / 3.0 * fabs(here->BSIM3v1gm - + here->BSIM3v1gds - + here->BSIM3v1gmbs) * here->BSIM3v1m)); - break; - case 2: - case 4: - NevalSrc(&noizDens[BSIM3v1IDNOIZ], - &lnNdens[BSIM3v1IDNOIZ], ckt, - THERMNOISE, here->BSIM3v1dNodePrime, - here->BSIM3v1sNodePrime, - (here->BSIM3v1ueff - * fabs((here->BSIM3v1qinv * here->BSIM3v1m) - / (pParam->BSIM3v1leff - * pParam->BSIM3v1leff)))); - break; - } - NevalSrc(&noizDens[BSIM3v1FLNOIZ], NULL, - ckt, N_GAIN, here->BSIM3v1dNodePrime, - here->BSIM3v1sNodePrime, (double) 0.0); - - switch( model->BSIM3v1noiMod ) - { case 1: - case 4: - noizDens[BSIM3v1FLNOIZ] *= model->BSIM3v1kf - * exp(model->BSIM3v1af - * log(MAX(fabs(here->BSIM3v1cd * here->BSIM3v1m), - N_MINLOG))) - / (pow(data->freq, model->BSIM3v1ef) - * pParam->BSIM3v1leff - * pParam->BSIM3v1leff - * model->BSIM3v1cox); - break; - case 2: - case 3: - vgs = *(ckt->CKTstates[0] + here->BSIM3v1vgs); - vds = *(ckt->CKTstates[0] + here->BSIM3v1vds); - if (vds < 0.0) - { vds = -vds; - vgs = vgs + vds; - } - if (vgs >= here->BSIM3v1von + 0.1) - { Ssi = StrongInversionNoiseEval_b3(vgs, - vds, model, here, data->freq, - ckt->CKTtemp); - noizDens[BSIM3v1FLNOIZ] *= Ssi; - } - else - { pParam = here->pParam; - T10 = model->BSIM3v1oxideTrapDensityA - * 8.62e-5 * ckt->CKTtemp; - T11 = pParam->BSIM3v1weff * here->BSIM3v1m - * pParam->BSIM3v1leff - * pow(data->freq, model->BSIM3v1ef) - * 4.0e36; - Swi = T10 / T11 * here->BSIM3v1cd * here->BSIM3v1m - * here->BSIM3v1cd * here->BSIM3v1m; - Slimit = StrongInversionNoiseEval_b3( - here->BSIM3v1von + 0.1, vds, model, - here, data->freq, ckt->CKTtemp); - T1 = Swi + Slimit; - if (T1 > 0.0) - noizDens[BSIM3v1FLNOIZ] *= (Slimit - * Swi) / T1; - else - noizDens[BSIM3v1FLNOIZ] *= 0.0; - } - break; - } - - lnNdens[BSIM3v1FLNOIZ] = - log(MAX(noizDens[BSIM3v1FLNOIZ], N_MINLOG)); - - noizDens[BSIM3v1TOTNOIZ] = noizDens[BSIM3v1RDNOIZ] - + noizDens[BSIM3v1RSNOIZ] - + noizDens[BSIM3v1IDNOIZ] - + noizDens[BSIM3v1FLNOIZ]; - lnNdens[BSIM3v1TOTNOIZ] = - log(MAX(noizDens[BSIM3v1TOTNOIZ], N_MINLOG)); - - *OnDens += noizDens[BSIM3v1TOTNOIZ]; - - if (data->delFreq == 0.0) - { /* if we haven't done any previous - integration, we need to initialize our - "history" variables. - */ - - for (i = 0; i < BSIM3v1NSRCS; i++) - { here->BSIM3v1nVar[LNLSTDENS][i] = - lnNdens[i]; - } - - /* clear out our integration variables - if it's the first pass - */ - if (data->freq == - job->NstartFreq) - { for (i = 0; i < BSIM3v1NSRCS; i++) - { here->BSIM3v1nVar[OUTNOIZ][i] = 0.0; - here->BSIM3v1nVar[INNOIZ][i] = 0.0; - } - } - } - else - { /* data->delFreq != 0.0, - we have to integrate. - */ - for (i = 0; i < BSIM3v1NSRCS; i++) - { if (i != BSIM3v1TOTNOIZ) - { tempOnoise = Nintegrate(noizDens[i], - lnNdens[i], - here->BSIM3v1nVar[LNLSTDENS][i], - data); - tempInoise = Nintegrate(noizDens[i] - * data->GainSqInv, lnNdens[i] - + data->lnGainInv, - here->BSIM3v1nVar[LNLSTDENS][i] - + data->lnGainInv, data); - here->BSIM3v1nVar[LNLSTDENS][i] = - lnNdens[i]; - data->outNoiz += tempOnoise; - data->inNoise += tempInoise; - if (job->NStpsSm != 0) - { here->BSIM3v1nVar[OUTNOIZ][i] - += tempOnoise; - here->BSIM3v1nVar[OUTNOIZ][BSIM3v1TOTNOIZ] - += tempOnoise; - here->BSIM3v1nVar[INNOIZ][i] - += tempInoise; - here->BSIM3v1nVar[INNOIZ][BSIM3v1TOTNOIZ] - += tempInoise; - } - } - } - } - if (data->prtSummary) - { for (i = 0; i < BSIM3v1NSRCS; i++) - { /* print a summary report */ - data->outpVector[data->outNumber++] - = noizDens[i]; - } - } - break; - case INT_NOIZ: - /* already calculated, just output */ - if (job->NStpsSm != 0) - { for (i = 0; i < BSIM3v1NSRCS; i++) - { data->outpVector[data->outNumber++] - = here->BSIM3v1nVar[OUTNOIZ][i]; - data->outpVector[data->outNumber++] - = here->BSIM3v1nVar[INNOIZ][i]; - } - } - break; - } - break; - case N_CLOSE: - /* do nothing, the main calling routine will close */ - return (OK); - break; /* the plots */ - } /* switch (operation) */ - } /* for here */ - } /* for model */ - - return(OK); -} - - - diff --git a/src/spicelib/devices/bsim3v1/b3v1par.c b/src/spicelib/devices/bsim3v1/b3v1par.c deleted file mode 100644 index 839b604c1..000000000 --- a/src/spicelib/devices/bsim3v1/b3v1par.c +++ /dev/null @@ -1,115 +0,0 @@ -/********** - * Copyright 1990 Regents of the University of California. All rights reserved. - * File: b3par.c - * Author: 1995 Min-Chie Jeng and Mansun Chan. - * Modified by Paolo Nenzi 2002 - **********/ - -/* - * Release Notes: - * BSIM3v1v3.1, Released by yuhua 96/12/08 - */ - -#include "ngspice/ngspice.h" -#include "ngspice/ifsim.h" -#include "bsim3v1def.h" -#include "ngspice/sperror.h" -#include "ngspice/suffix.h" -#include "ngspice/fteext.h" - -int -BSIM3v1param(int param, IFvalue *value, GENinstance *inst, IFvalue *select) -{ - double scale; - - BSIM3v1instance *here = (BSIM3v1instance*)inst; - - NG_IGNORE(select); - - if (!cp_getvar("scale", CP_REAL, &scale, 0)) - scale = 1; - - switch (param) { - case BSIM3v1_W: - here->BSIM3v1w = value->rValue*scale; - here->BSIM3v1wGiven = TRUE; - break; - case BSIM3v1_L: - here->BSIM3v1l = value->rValue*scale; - here->BSIM3v1lGiven = TRUE; - break; - case BSIM3v1_M: - here->BSIM3v1m = value->rValue; - here->BSIM3v1mGiven = TRUE; - break; - case BSIM3v1_AS: - here->BSIM3v1sourceArea = value->rValue*scale*scale; - here->BSIM3v1sourceAreaGiven = TRUE; - break; - case BSIM3v1_AD: - here->BSIM3v1drainArea = value->rValue*scale*scale; - here->BSIM3v1drainAreaGiven = TRUE; - break; - case BSIM3v1_PS: - here->BSIM3v1sourcePerimeter = value->rValue*scale; - here->BSIM3v1sourcePerimeterGiven = TRUE; - break; - case BSIM3v1_PD: - here->BSIM3v1drainPerimeter = value->rValue*scale; - here->BSIM3v1drainPerimeterGiven = TRUE; - break; - case BSIM3v1_NRS: - here->BSIM3v1sourceSquares = value->rValue; - here->BSIM3v1sourceSquaresGiven = TRUE; - break; - case BSIM3v1_NRD: - here->BSIM3v1drainSquares = value->rValue; - here->BSIM3v1drainSquaresGiven = TRUE; - break; - case BSIM3v1_OFF: - here->BSIM3v1off = value->iValue; - break; - case BSIM3v1_IC_VBS: - here->BSIM3v1icVBS = value->rValue; - here->BSIM3v1icVBSGiven = TRUE; - break; - case BSIM3v1_IC_VDS: - here->BSIM3v1icVDS = value->rValue; - here->BSIM3v1icVDSGiven = TRUE; - break; - case BSIM3v1_IC_VGS: - here->BSIM3v1icVGS = value->rValue; - here->BSIM3v1icVGSGiven = TRUE; - break; - case BSIM3v1_NQSMOD: - here->BSIM3v1nqsMod = value->iValue; - here->BSIM3v1nqsModGiven = TRUE; - break; - case BSIM3v1_IC: - /* FALLTHROUGH added to suppress GCC warning due to - * -Wimplicit-fallthrough flag */ - switch (value->v.numValue) { - case 3: - here->BSIM3v1icVBS = *(value->v.vec.rVec+2); - here->BSIM3v1icVBSGiven = TRUE; - /* FALLTHROUGH */ - case 2: - here->BSIM3v1icVGS = *(value->v.vec.rVec+1); - here->BSIM3v1icVGSGiven = TRUE; - /* FALLTHROUGH */ - case 1: - here->BSIM3v1icVDS = *(value->v.vec.rVec); - here->BSIM3v1icVDSGiven = TRUE; - break; - default: - return(E_BADPARM); - } - break; - default: - return(E_BADPARM); - } - return(OK); -} - - - diff --git a/src/spicelib/devices/bsim3v1/b3v1pzld.c b/src/spicelib/devices/bsim3v1/b3v1pzld.c deleted file mode 100644 index d8989fbb0..000000000 --- a/src/spicelib/devices/bsim3v1/b3v1pzld.c +++ /dev/null @@ -1,154 +0,0 @@ -/********** - * Copyright 1990 Regents of the University of California. All rights reserved. - * File: b3v1pzld.c - * Author: 1995 Min-Chie Jeng and Mansun Chan. - * Modified by Paolo Nenzi 2002 - **********/ - -/* - * Release Notes: - * BSIM3v3.1, Released by yuhua 96/12/08 - */ - -#include "ngspice/ngspice.h" -#include "ngspice/cktdefs.h" -#include "ngspice/complex.h" -#include "ngspice/sperror.h" -#include "bsim3v1def.h" -#include "ngspice/suffix.h" - -int -BSIM3v1pzLoad(GENmodel *inModel, CKTcircuit *ckt, SPcomplex *s) -{ -BSIM3v1model *model = (BSIM3v1model*)inModel; -BSIM3v1instance *here; -double xcggb, xcgdb, xcgsb, xcbgb, xcbdb, xcbsb, xcddb, xcssb, xcdgb; -double gdpr, gspr, gds, gbd, gbs, capbd, capbs, xcsgb, xcdsb, xcsdb; -double cggb, cgdb, cgsb, cbgb, cbdb, cbsb, cddb, cdgb, cdsb; -double GSoverlapCap, GDoverlapCap, GBoverlapCap; -double FwdSum, RevSum, Gm, Gmbs; - -double m; - - NG_IGNORE(ckt); - - for (; model != NULL; model = BSIM3v1nextModel(model)) - { for (here = BSIM3v1instances(model); here!= NULL; - here = BSIM3v1nextInstance(here)) - { - if (here->BSIM3v1mode >= 0) - { Gm = here->BSIM3v1gm; - Gmbs = here->BSIM3v1gmbs; - FwdSum = Gm + Gmbs; - RevSum = 0.0; - cggb = here->BSIM3v1cggb; - cgsb = here->BSIM3v1cgsb; - cgdb = here->BSIM3v1cgdb; - - cbgb = here->BSIM3v1cbgb; - cbsb = here->BSIM3v1cbsb; - cbdb = here->BSIM3v1cbdb; - - cdgb = here->BSIM3v1cdgb; - cdsb = here->BSIM3v1cdsb; - cddb = here->BSIM3v1cddb; - } - else - { Gm = -here->BSIM3v1gm; - Gmbs = -here->BSIM3v1gmbs; - FwdSum = 0.0; - RevSum = -Gm - Gmbs; - cggb = here->BSIM3v1cggb; - cgsb = here->BSIM3v1cgdb; - cgdb = here->BSIM3v1cgsb; - - cbgb = here->BSIM3v1cbgb; - cbsb = here->BSIM3v1cbdb; - cbdb = here->BSIM3v1cbsb; - - cdgb = -(here->BSIM3v1cdgb + cggb + cbgb); - cdsb = -(here->BSIM3v1cddb + cgsb + cbsb); - cddb = -(here->BSIM3v1cdsb + cgdb + cbdb); - } - gdpr=here->BSIM3v1drainConductance; - gspr=here->BSIM3v1sourceConductance; - gds= here->BSIM3v1gds; - gbd= here->BSIM3v1gbd; - gbs= here->BSIM3v1gbs; - capbd= here->BSIM3v1capbd; - capbs= here->BSIM3v1capbs; - GSoverlapCap = here->BSIM3v1cgso; - GDoverlapCap = here->BSIM3v1cgdo; - GBoverlapCap = here->pParam->BSIM3v1cgbo; - - xcdgb = (cdgb - GDoverlapCap); - xcddb = (cddb + capbd + GDoverlapCap); - xcdsb = cdsb; - xcsgb = -(cggb + cbgb + cdgb + GSoverlapCap); - xcsdb = -(cgdb + cbdb + cddb); - xcssb = (capbs + GSoverlapCap - (cgsb+cbsb+cdsb)); - xcggb = (cggb + GDoverlapCap + GSoverlapCap + GBoverlapCap); - xcgdb = (cgdb - GDoverlapCap); - xcgsb = (cgsb - GSoverlapCap); - xcbgb = (cbgb - GBoverlapCap); - xcbdb = (cbdb - capbd); - xcbsb = (cbsb - capbs); - - m = here->BSIM3v1m; - - *(here->BSIM3v1GgPtr ) += m * (xcggb * s->real); - *(here->BSIM3v1GgPtr +1) += m * (xcggb * s->imag); - *(here->BSIM3v1BbPtr ) += m * ((-xcbgb-xcbdb-xcbsb) * s->real); - *(here->BSIM3v1BbPtr +1) += m * ((-xcbgb-xcbdb-xcbsb) * s->imag); - *(here->BSIM3v1DPdpPtr ) += m * (xcddb * s->real); - *(here->BSIM3v1DPdpPtr +1) += xcddb * s->imag; - *(here->BSIM3v1SPspPtr ) += m * (xcssb * s->real); - *(here->BSIM3v1SPspPtr +1) += m * (xcssb * s->imag); - *(here->BSIM3v1GbPtr ) += m * ((-xcggb-xcgdb-xcgsb) * s->real); - *(here->BSIM3v1GbPtr +1) += m * ((-xcggb-xcgdb-xcgsb) * s->imag); - *(here->BSIM3v1GdpPtr ) += m * (xcgdb * s->real); - *(here->BSIM3v1GdpPtr +1) += m * (xcgdb * s->imag); - *(here->BSIM3v1GspPtr ) += m * (xcgsb * s->real); - *(here->BSIM3v1GspPtr +1) += m * (xcgsb * s->imag); - *(here->BSIM3v1BgPtr ) += m * (xcbgb * s->real); - *(here->BSIM3v1BgPtr +1) += m * (xcbgb * s->imag); - *(here->BSIM3v1BdpPtr ) += m * (xcbdb * s->real); - *(here->BSIM3v1BdpPtr +1) += m * (xcbdb * s->imag); - *(here->BSIM3v1BspPtr ) += m * (xcbsb * s->real); - *(here->BSIM3v1BspPtr +1) += m * (xcbsb * s->imag); - *(here->BSIM3v1DPgPtr ) += m * (xcdgb * s->real); - *(here->BSIM3v1DPgPtr +1) += m * (xcdgb * s->imag); - *(here->BSIM3v1DPbPtr ) += m * ((-xcdgb-xcddb-xcdsb) * s->real); - *(here->BSIM3v1DPbPtr +1) += m * ((-xcdgb-xcddb-xcdsb) * s->imag); - *(here->BSIM3v1DPspPtr ) += m * (xcdsb * s->real); - *(here->BSIM3v1DPspPtr +1) += m * (xcdsb * s->imag); - *(here->BSIM3v1SPgPtr ) += m * (xcsgb * s->real); - *(here->BSIM3v1SPgPtr +1) += m * (xcsgb * s->imag); - *(here->BSIM3v1SPbPtr ) += m * ((-xcsgb-xcsdb-xcssb) * s->real); - *(here->BSIM3v1SPbPtr +1) += m * ((-xcsgb-xcsdb-xcssb) * s->imag); - *(here->BSIM3v1SPdpPtr ) += m * (xcsdb * s->real); - *(here->BSIM3v1SPdpPtr +1) += m * (xcsdb * s->imag); - *(here->BSIM3v1DdPtr) += m * gdpr; - *(here->BSIM3v1SsPtr) += m * gspr; - *(here->BSIM3v1BbPtr) += m * (gbd + gbs); - *(here->BSIM3v1DPdpPtr) += m * (gdpr + gds + gbd + RevSum); - *(here->BSIM3v1SPspPtr) += m * (gspr + gds + gbs + FwdSum); - *(here->BSIM3v1DdpPtr) -= m * gdpr; - *(here->BSIM3v1SspPtr) -= m * gspr; - *(here->BSIM3v1BdpPtr) -= m * gbd; - *(here->BSIM3v1BspPtr) -= m * gbs; - *(here->BSIM3v1DPdPtr) -= m * gdpr; - *(here->BSIM3v1DPgPtr) += m * Gm; - *(here->BSIM3v1DPbPtr) -= m * (gbd - Gmbs); - *(here->BSIM3v1DPspPtr) -= m * (gds + FwdSum); - *(here->BSIM3v1SPgPtr) -= m * Gm; - *(here->BSIM3v1SPsPtr) -= m * gspr; - *(here->BSIM3v1SPbPtr) -= m * (gbs + Gmbs); - *(here->BSIM3v1SPdpPtr) -= m * (gds + RevSum); - - } - } - return(OK); -} - - diff --git a/src/spicelib/devices/bsim3v1/b3v1set.c b/src/spicelib/devices/bsim3v1/b3v1set.c deleted file mode 100644 index bd0c51f92..000000000 --- a/src/spicelib/devices/bsim3v1/b3v1set.c +++ /dev/null @@ -1,982 +0,0 @@ -/********** - * Copyright 1990 Regents of the University of California. All rights reserved. - * File: b3set.c - * Author: 1995 Min-Chie Jeng and Mansun Chan. - * Modified by Paolo Nenzi 2002 - **********/ - -/* - * Release Notes: - * BSIM3v1v3.1, Released by yuhua 96/12/08 - */ - -#include "ngspice/ngspice.h" -#include "ngspice/smpdefs.h" -#include "ngspice/cktdefs.h" -#include "bsim3v1def.h" -#include "ngspice/const.h" -#include "ngspice/sperror.h" -#include "ngspice/suffix.h" - -#define MAX_EXP 5.834617425e14 -#define MIN_EXP 1.713908431e-15 -#define EXP_THRESHOLD 34.0 -#define SMOOTHFACTOR 0.1 -#define EPSOX 3.453133e-11 -#define EPSSI 1.03594e-10 -#define PI 3.141592654 -#define Charge_q 1.60219e-19 -#define Meter2Micron 1.0e6 - -int -BSIM3v1setup(SMPmatrix *matrix, GENmodel *inModel, CKTcircuit *ckt, - int *states) -{ -BSIM3v1model *model = (BSIM3v1model*)inModel; -BSIM3v1instance *here; -int error; -CKTnode *tmp; - -CKTnode *tmpNode; -IFuid tmpName; - - /* loop through all the BSIM3v1 device models */ - for( ; model != NULL; model = BSIM3v1nextModel(model)) - { -/* Default value Processing for BSIM3v1 MOSFET Models */ - if (!model->BSIM3v1typeGiven) - model->BSIM3v1type = NMOS; - if (!model->BSIM3v1mobModGiven) - model->BSIM3v1mobMod = 1; - if (!model->BSIM3v1binUnitGiven) - model->BSIM3v1binUnit = 1; - if (!model->BSIM3v1paramChkGiven) - model->BSIM3v1paramChk = 0; - if (!model->BSIM3v1capModGiven) - model->BSIM3v1capMod = 2; - if (!model->BSIM3v1nqsModGiven) - model->BSIM3v1nqsMod = 0; - if (!model->BSIM3v1noiModGiven) - model->BSIM3v1noiMod = 1; - if (!model->BSIM3v1versionGiven) - model->BSIM3v1version = 3.1; - if (!model->BSIM3v1toxGiven) - model->BSIM3v1tox = 150.0e-10; - model->BSIM3v1cox = 3.453133e-11 / model->BSIM3v1tox; - - if (!model->BSIM3v1cdscGiven) - model->BSIM3v1cdsc = 2.4e-4; /* unit Q/V/m^2 */ - if (!model->BSIM3v1cdscbGiven) - model->BSIM3v1cdscb = 0.0; /* unit Q/V/m^2 */ - if (!model->BSIM3v1cdscdGiven) - model->BSIM3v1cdscd = 0.0; /* unit Q/V/m^2 */ - if (!model->BSIM3v1citGiven) - model->BSIM3v1cit = 0.0; /* unit Q/V/m^2 */ - if (!model->BSIM3v1nfactorGiven) - model->BSIM3v1nfactor = 1; - if (!model->BSIM3v1xjGiven) - model->BSIM3v1xj = .15e-6; - if (!model->BSIM3v1vsatGiven) - model->BSIM3v1vsat = 8.0e4; /* unit m/s */ - if (!model->BSIM3v1atGiven) - model->BSIM3v1at = 3.3e4; /* unit m/s */ - if (!model->BSIM3v1a0Given) - model->BSIM3v1a0 = 1.0; - if (!model->BSIM3v1agsGiven) - model->BSIM3v1ags = 0.0; - if (!model->BSIM3v1a1Given) - model->BSIM3v1a1 = 0.0; - if (!model->BSIM3v1a2Given) - model->BSIM3v1a2 = 1.0; - if (!model->BSIM3v1ketaGiven) - model->BSIM3v1keta = -0.047; /* unit / V */ - if (!model->BSIM3v1nsubGiven) - model->BSIM3v1nsub = 6.0e16; /* unit 1/cm3 */ - if (!model->BSIM3v1npeakGiven) - model->BSIM3v1npeak = 1.7e17; /* unit 1/cm3 */ - if (!model->BSIM3v1ngateGiven) - model->BSIM3v1ngate = 0; /* unit 1/cm3 */ - if (!model->BSIM3v1vbmGiven) - model->BSIM3v1vbm = -3.0; - if (!model->BSIM3v1xtGiven) - model->BSIM3v1xt = 1.55e-7; - if (!model->BSIM3v1kt1Given) - model->BSIM3v1kt1 = -0.11; /* unit V */ - if (!model->BSIM3v1kt1lGiven) - model->BSIM3v1kt1l = 0.0; /* unit V*m */ - if (!model->BSIM3v1kt2Given) - model->BSIM3v1kt2 = 0.022; /* No unit */ - if (!model->BSIM3v1k3Given) - model->BSIM3v1k3 = 80.0; - if (!model->BSIM3v1k3bGiven) - model->BSIM3v1k3b = 0.0; - if (!model->BSIM3v1w0Given) - model->BSIM3v1w0 = 2.5e-6; - if (!model->BSIM3v1nlxGiven) - model->BSIM3v1nlx = 1.74e-7; - if (!model->BSIM3v1dvt0Given) - model->BSIM3v1dvt0 = 2.2; - if (!model->BSIM3v1dvt1Given) - model->BSIM3v1dvt1 = 0.53; - if (!model->BSIM3v1dvt2Given) - model->BSIM3v1dvt2 = -0.032; /* unit 1 / V */ - - if (!model->BSIM3v1dvt0wGiven) - model->BSIM3v1dvt0w = 0.0; - if (!model->BSIM3v1dvt1wGiven) - model->BSIM3v1dvt1w = 5.3e6; - if (!model->BSIM3v1dvt2wGiven) - model->BSIM3v1dvt2w = -0.032; - - if (!model->BSIM3v1droutGiven) - model->BSIM3v1drout = 0.56; - if (!model->BSIM3v1dsubGiven) - model->BSIM3v1dsub = model->BSIM3v1drout; - if (!model->BSIM3v1vth0Given) - model->BSIM3v1vth0 = (model->BSIM3v1type == NMOS) ? 0.7 : -0.7; - if (!model->BSIM3v1uaGiven) - model->BSIM3v1ua = 2.25e-9; /* unit m/V */ - if (!model->BSIM3v1ua1Given) - model->BSIM3v1ua1 = 4.31e-9; /* unit m/V */ - if (!model->BSIM3v1ubGiven) - model->BSIM3v1ub = 5.87e-19; /* unit (m/V)**2 */ - if (!model->BSIM3v1ub1Given) - model->BSIM3v1ub1 = -7.61e-18; /* unit (m/V)**2 */ - if (!model->BSIM3v1ucGiven) - model->BSIM3v1uc = (model->BSIM3v1mobMod == 3) ? -0.0465 : -0.0465e-9; - if (!model->BSIM3v1uc1Given) - model->BSIM3v1uc1 = (model->BSIM3v1mobMod == 3) ? -0.056 : -0.056e-9; - if (!model->BSIM3v1u0Given) - model->BSIM3v1u0 = (model->BSIM3v1type == NMOS) ? 0.067 : 0.025; - if (!model->BSIM3v1uteGiven) - model->BSIM3v1ute = -1.5; - if (!model->BSIM3v1voffGiven) - model->BSIM3v1voff = -0.08; - if (!model->BSIM3v1deltaGiven) - model->BSIM3v1delta = 0.01; - if (!model->BSIM3v1rdswGiven) - model->BSIM3v1rdsw = 0; - if (!model->BSIM3v1prwgGiven) - model->BSIM3v1prwg = 0.0; /* unit 1/V */ - if (!model->BSIM3v1prwbGiven) - model->BSIM3v1prwb = 0.0; - if (!model->BSIM3v1prtGiven) - model->BSIM3v1prt = 0.0; - if (!model->BSIM3v1eta0Given) - model->BSIM3v1eta0 = 0.08; /* no unit */ - if (!model->BSIM3v1etabGiven) - model->BSIM3v1etab = -0.07; /* unit 1/V */ - if (!model->BSIM3v1pclmGiven) - model->BSIM3v1pclm = 1.3; /* no unit */ - if (!model->BSIM3v1pdibl1Given) - model->BSIM3v1pdibl1 = .39; /* no unit */ - if (!model->BSIM3v1pdibl2Given) - model->BSIM3v1pdibl2 = 0.0086; /* no unit */ - if (!model->BSIM3v1pdiblbGiven) - model->BSIM3v1pdiblb = 0.0; /* 1/V */ - if (!model->BSIM3v1pscbe1Given) - model->BSIM3v1pscbe1 = 4.24e8; - if (!model->BSIM3v1pscbe2Given) - model->BSIM3v1pscbe2 = 1.0e-5; - if (!model->BSIM3v1pvagGiven) - model->BSIM3v1pvag = 0.0; - if (!model->BSIM3v1wrGiven) - model->BSIM3v1wr = 1.0; - if (!model->BSIM3v1dwgGiven) - model->BSIM3v1dwg = 0.0; - if (!model->BSIM3v1dwbGiven) - model->BSIM3v1dwb = 0.0; - if (!model->BSIM3v1b0Given) - model->BSIM3v1b0 = 0.0; - if (!model->BSIM3v1b1Given) - model->BSIM3v1b1 = 0.0; - if (!model->BSIM3v1alpha0Given) - model->BSIM3v1alpha0 = 0.0; - if (!model->BSIM3v1beta0Given) - model->BSIM3v1beta0 = 30.0; - - if (!model->BSIM3v1elmGiven) - model->BSIM3v1elm = 5.0; - if (!model->BSIM3v1cgslGiven) - model->BSIM3v1cgsl = 0.0; - if (!model->BSIM3v1cgdlGiven) - model->BSIM3v1cgdl = 0.0; - if (!model->BSIM3v1ckappaGiven) - model->BSIM3v1ckappa = 0.6; - if (!model->BSIM3v1clcGiven) - model->BSIM3v1clc = 0.1e-6; - if (!model->BSIM3v1cleGiven) - model->BSIM3v1cle = 0.6; - if (!model->BSIM3v1vfbcvGiven) - model->BSIM3v1vfbcv = -1.0; - - /* Length dependence */ - if (!model->BSIM3v1lcdscGiven) - model->BSIM3v1lcdsc = 0.0; - if (!model->BSIM3v1lcdscbGiven) - model->BSIM3v1lcdscb = 0.0; - if (!model->BSIM3v1lcdscdGiven) - model->BSIM3v1lcdscd = 0.0; - if (!model->BSIM3v1lcitGiven) - model->BSIM3v1lcit = 0.0; - if (!model->BSIM3v1lnfactorGiven) - model->BSIM3v1lnfactor = 0.0; - if (!model->BSIM3v1lxjGiven) - model->BSIM3v1lxj = 0.0; - if (!model->BSIM3v1lvsatGiven) - model->BSIM3v1lvsat = 0.0; - if (!model->BSIM3v1latGiven) - model->BSIM3v1lat = 0.0; - if (!model->BSIM3v1la0Given) - model->BSIM3v1la0 = 0.0; - if (!model->BSIM3v1lagsGiven) - model->BSIM3v1lags = 0.0; - if (!model->BSIM3v1la1Given) - model->BSIM3v1la1 = 0.0; - if (!model->BSIM3v1la2Given) - model->BSIM3v1la2 = 0.0; - if (!model->BSIM3v1lketaGiven) - model->BSIM3v1lketa = 0.0; - if (!model->BSIM3v1lnsubGiven) - model->BSIM3v1lnsub = 0.0; - if (!model->BSIM3v1lnpeakGiven) - model->BSIM3v1lnpeak = 0.0; - if (!model->BSIM3v1lngateGiven) - model->BSIM3v1lngate = 0.0; - if (!model->BSIM3v1lvbmGiven) - model->BSIM3v1lvbm = 0.0; - if (!model->BSIM3v1lxtGiven) - model->BSIM3v1lxt = 0.0; - if (!model->BSIM3v1lkt1Given) - model->BSIM3v1lkt1 = 0.0; - if (!model->BSIM3v1lkt1lGiven) - model->BSIM3v1lkt1l = 0.0; - if (!model->BSIM3v1lkt2Given) - model->BSIM3v1lkt2 = 0.0; - if (!model->BSIM3v1lk3Given) - model->BSIM3v1lk3 = 0.0; - if (!model->BSIM3v1lk3bGiven) - model->BSIM3v1lk3b = 0.0; - if (!model->BSIM3v1lw0Given) - model->BSIM3v1lw0 = 0.0; - if (!model->BSIM3v1lnlxGiven) - model->BSIM3v1lnlx = 0.0; - if (!model->BSIM3v1ldvt0Given) - model->BSIM3v1ldvt0 = 0.0; - if (!model->BSIM3v1ldvt1Given) - model->BSIM3v1ldvt1 = 0.0; - if (!model->BSIM3v1ldvt2Given) - model->BSIM3v1ldvt2 = 0.0; - if (!model->BSIM3v1ldvt0wGiven) - model->BSIM3v1ldvt0w = 0.0; - if (!model->BSIM3v1ldvt1wGiven) - model->BSIM3v1ldvt1w = 0.0; - if (!model->BSIM3v1ldvt2wGiven) - model->BSIM3v1ldvt2w = 0.0; - if (!model->BSIM3v1ldroutGiven) - model->BSIM3v1ldrout = 0.0; - if (!model->BSIM3v1ldsubGiven) - model->BSIM3v1ldsub = 0.0; - if (!model->BSIM3v1lvth0Given) - model->BSIM3v1lvth0 = 0.0; - if (!model->BSIM3v1luaGiven) - model->BSIM3v1lua = 0.0; - if (!model->BSIM3v1lua1Given) - model->BSIM3v1lua1 = 0.0; - if (!model->BSIM3v1lubGiven) - model->BSIM3v1lub = 0.0; - if (!model->BSIM3v1lub1Given) - model->BSIM3v1lub1 = 0.0; - if (!model->BSIM3v1lucGiven) - model->BSIM3v1luc = 0.0; - if (!model->BSIM3v1luc1Given) - model->BSIM3v1luc1 = 0.0; - if (!model->BSIM3v1lu0Given) - model->BSIM3v1lu0 = 0.0; - if (!model->BSIM3v1luteGiven) - model->BSIM3v1lute = 0.0; - if (!model->BSIM3v1lvoffGiven) - model->BSIM3v1lvoff = 0.0; - if (!model->BSIM3v1ldeltaGiven) - model->BSIM3v1ldelta = 0.0; - if (!model->BSIM3v1lrdswGiven) - model->BSIM3v1lrdsw = 0.0; - if (!model->BSIM3v1lprwbGiven) - model->BSIM3v1lprwb = 0.0; - if (!model->BSIM3v1lprwgGiven) - model->BSIM3v1lprwg = 0.0; - if (!model->BSIM3v1lprtGiven) - model->BSIM3v1lprt = 0.0; - if (!model->BSIM3v1leta0Given) - model->BSIM3v1leta0 = 0.0; - if (!model->BSIM3v1letabGiven) - model->BSIM3v1letab = -0.0; - if (!model->BSIM3v1lpclmGiven) - model->BSIM3v1lpclm = 0.0; - if (!model->BSIM3v1lpdibl1Given) - model->BSIM3v1lpdibl1 = 0.0; - if (!model->BSIM3v1lpdibl2Given) - model->BSIM3v1lpdibl2 = 0.0; - if (!model->BSIM3v1lpdiblbGiven) - model->BSIM3v1lpdiblb = 0.0; - if (!model->BSIM3v1lpscbe1Given) - model->BSIM3v1lpscbe1 = 0.0; - if (!model->BSIM3v1lpscbe2Given) - model->BSIM3v1lpscbe2 = 0.0; - if (!model->BSIM3v1lpvagGiven) - model->BSIM3v1lpvag = 0.0; - if (!model->BSIM3v1lwrGiven) - model->BSIM3v1lwr = 0.0; - if (!model->BSIM3v1ldwgGiven) - model->BSIM3v1ldwg = 0.0; - if (!model->BSIM3v1ldwbGiven) - model->BSIM3v1ldwb = 0.0; - if (!model->BSIM3v1lb0Given) - model->BSIM3v1lb0 = 0.0; - if (!model->BSIM3v1lb1Given) - model->BSIM3v1lb1 = 0.0; - if (!model->BSIM3v1lalpha0Given) - model->BSIM3v1lalpha0 = 0.0; - if (!model->BSIM3v1lbeta0Given) - model->BSIM3v1lbeta0 = 0.0; - - if (!model->BSIM3v1lelmGiven) - model->BSIM3v1lelm = 0.0; - if (!model->BSIM3v1lcgslGiven) - model->BSIM3v1lcgsl = 0.0; - if (!model->BSIM3v1lcgdlGiven) - model->BSIM3v1lcgdl = 0.0; - if (!model->BSIM3v1lckappaGiven) - model->BSIM3v1lckappa = 0.0; - if (!model->BSIM3v1lclcGiven) - model->BSIM3v1lclc = 0.0; - if (!model->BSIM3v1lcleGiven) - model->BSIM3v1lcle = 0.0; - if (!model->BSIM3v1lcfGiven) - model->BSIM3v1lcf = 0.0; - if (!model->BSIM3v1lvfbcvGiven) - model->BSIM3v1lvfbcv = 0.0; - - /* Width dependence */ - if (!model->BSIM3v1wcdscGiven) - model->BSIM3v1wcdsc = 0.0; - if (!model->BSIM3v1wcdscbGiven) - model->BSIM3v1wcdscb = 0.0; - if (!model->BSIM3v1wcdscdGiven) - model->BSIM3v1wcdscd = 0.0; - if (!model->BSIM3v1wcitGiven) - model->BSIM3v1wcit = 0.0; - if (!model->BSIM3v1wnfactorGiven) - model->BSIM3v1wnfactor = 0.0; - if (!model->BSIM3v1wxjGiven) - model->BSIM3v1wxj = 0.0; - if (!model->BSIM3v1wvsatGiven) - model->BSIM3v1wvsat = 0.0; - if (!model->BSIM3v1watGiven) - model->BSIM3v1wat = 0.0; - if (!model->BSIM3v1wa0Given) - model->BSIM3v1wa0 = 0.0; - if (!model->BSIM3v1wagsGiven) - model->BSIM3v1wags = 0.0; - if (!model->BSIM3v1wa1Given) - model->BSIM3v1wa1 = 0.0; - if (!model->BSIM3v1wa2Given) - model->BSIM3v1wa2 = 0.0; - if (!model->BSIM3v1wketaGiven) - model->BSIM3v1wketa = 0.0; - if (!model->BSIM3v1wnsubGiven) - model->BSIM3v1wnsub = 0.0; - if (!model->BSIM3v1wnpeakGiven) - model->BSIM3v1wnpeak = 0.0; - if (!model->BSIM3v1wngateGiven) - model->BSIM3v1wngate = 0.0; - if (!model->BSIM3v1wvbmGiven) - model->BSIM3v1wvbm = 0.0; - if (!model->BSIM3v1wxtGiven) - model->BSIM3v1wxt = 0.0; - if (!model->BSIM3v1wkt1Given) - model->BSIM3v1wkt1 = 0.0; - if (!model->BSIM3v1wkt1lGiven) - model->BSIM3v1wkt1l = 0.0; - if (!model->BSIM3v1wkt2Given) - model->BSIM3v1wkt2 = 0.0; - if (!model->BSIM3v1wk3Given) - model->BSIM3v1wk3 = 0.0; - if (!model->BSIM3v1wk3bGiven) - model->BSIM3v1wk3b = 0.0; - if (!model->BSIM3v1ww0Given) - model->BSIM3v1ww0 = 0.0; - if (!model->BSIM3v1wnlxGiven) - model->BSIM3v1wnlx = 0.0; - if (!model->BSIM3v1wdvt0Given) - model->BSIM3v1wdvt0 = 0.0; - if (!model->BSIM3v1wdvt1Given) - model->BSIM3v1wdvt1 = 0.0; - if (!model->BSIM3v1wdvt2Given) - model->BSIM3v1wdvt2 = 0.0; - if (!model->BSIM3v1wdvt0wGiven) - model->BSIM3v1wdvt0w = 0.0; - if (!model->BSIM3v1wdvt1wGiven) - model->BSIM3v1wdvt1w = 0.0; - if (!model->BSIM3v1wdvt2wGiven) - model->BSIM3v1wdvt2w = 0.0; - if (!model->BSIM3v1wdroutGiven) - model->BSIM3v1wdrout = 0.0; - if (!model->BSIM3v1wdsubGiven) - model->BSIM3v1wdsub = 0.0; - if (!model->BSIM3v1wvth0Given) - model->BSIM3v1wvth0 = 0.0; - if (!model->BSIM3v1wuaGiven) - model->BSIM3v1wua = 0.0; - if (!model->BSIM3v1wua1Given) - model->BSIM3v1wua1 = 0.0; - if (!model->BSIM3v1wubGiven) - model->BSIM3v1wub = 0.0; - if (!model->BSIM3v1wub1Given) - model->BSIM3v1wub1 = 0.0; - if (!model->BSIM3v1wucGiven) - model->BSIM3v1wuc = 0.0; - if (!model->BSIM3v1wuc1Given) - model->BSIM3v1wuc1 = 0.0; - if (!model->BSIM3v1wu0Given) - model->BSIM3v1wu0 = 0.0; - if (!model->BSIM3v1wuteGiven) - model->BSIM3v1wute = 0.0; - if (!model->BSIM3v1wvoffGiven) - model->BSIM3v1wvoff = 0.0; - if (!model->BSIM3v1wdeltaGiven) - model->BSIM3v1wdelta = 0.0; - if (!model->BSIM3v1wrdswGiven) - model->BSIM3v1wrdsw = 0.0; - if (!model->BSIM3v1wprwbGiven) - model->BSIM3v1wprwb = 0.0; - if (!model->BSIM3v1wprwgGiven) - model->BSIM3v1wprwg = 0.0; - if (!model->BSIM3v1wprtGiven) - model->BSIM3v1wprt = 0.0; - if (!model->BSIM3v1weta0Given) - model->BSIM3v1weta0 = 0.0; - if (!model->BSIM3v1wetabGiven) - model->BSIM3v1wetab = 0.0; - if (!model->BSIM3v1wpclmGiven) - model->BSIM3v1wpclm = 0.0; - if (!model->BSIM3v1wpdibl1Given) - model->BSIM3v1wpdibl1 = 0.0; - if (!model->BSIM3v1wpdibl2Given) - model->BSIM3v1wpdibl2 = 0.0; - if (!model->BSIM3v1wpdiblbGiven) - model->BSIM3v1wpdiblb = 0.0; - if (!model->BSIM3v1wpscbe1Given) - model->BSIM3v1wpscbe1 = 0.0; - if (!model->BSIM3v1wpscbe2Given) - model->BSIM3v1wpscbe2 = 0.0; - if (!model->BSIM3v1wpvagGiven) - model->BSIM3v1wpvag = 0.0; - if (!model->BSIM3v1wwrGiven) - model->BSIM3v1wwr = 0.0; - if (!model->BSIM3v1wdwgGiven) - model->BSIM3v1wdwg = 0.0; - if (!model->BSIM3v1wdwbGiven) - model->BSIM3v1wdwb = 0.0; - if (!model->BSIM3v1wb0Given) - model->BSIM3v1wb0 = 0.0; - if (!model->BSIM3v1wb1Given) - model->BSIM3v1wb1 = 0.0; - if (!model->BSIM3v1walpha0Given) - model->BSIM3v1walpha0 = 0.0; - if (!model->BSIM3v1wbeta0Given) - model->BSIM3v1wbeta0 = 0.0; - - if (!model->BSIM3v1welmGiven) - model->BSIM3v1welm = 0.0; - if (!model->BSIM3v1wcgslGiven) - model->BSIM3v1wcgsl = 0.0; - if (!model->BSIM3v1wcgdlGiven) - model->BSIM3v1wcgdl = 0.0; - if (!model->BSIM3v1wckappaGiven) - model->BSIM3v1wckappa = 0.0; - if (!model->BSIM3v1wcfGiven) - model->BSIM3v1wcf = 0.0; - if (!model->BSIM3v1wclcGiven) - model->BSIM3v1wclc = 0.0; - if (!model->BSIM3v1wcleGiven) - model->BSIM3v1wcle = 0.0; - if (!model->BSIM3v1wvfbcvGiven) - model->BSIM3v1wvfbcv = 0.0; - - /* Cross-term dependence */ - if (!model->BSIM3v1pcdscGiven) - model->BSIM3v1pcdsc = 0.0; - if (!model->BSIM3v1pcdscbGiven) - model->BSIM3v1pcdscb = 0.0; - if (!model->BSIM3v1pcdscdGiven) - model->BSIM3v1pcdscd = 0.0; - if (!model->BSIM3v1pcitGiven) - model->BSIM3v1pcit = 0.0; - if (!model->BSIM3v1pnfactorGiven) - model->BSIM3v1pnfactor = 0.0; - if (!model->BSIM3v1pxjGiven) - model->BSIM3v1pxj = 0.0; - if (!model->BSIM3v1pvsatGiven) - model->BSIM3v1pvsat = 0.0; - if (!model->BSIM3v1patGiven) - model->BSIM3v1pat = 0.0; - if (!model->BSIM3v1pa0Given) - model->BSIM3v1pa0 = 0.0; - - if (!model->BSIM3v1pagsGiven) - model->BSIM3v1pags = 0.0; - if (!model->BSIM3v1pa1Given) - model->BSIM3v1pa1 = 0.0; - if (!model->BSIM3v1pa2Given) - model->BSIM3v1pa2 = 0.0; - if (!model->BSIM3v1pketaGiven) - model->BSIM3v1pketa = 0.0; - if (!model->BSIM3v1pnsubGiven) - model->BSIM3v1pnsub = 0.0; - if (!model->BSIM3v1pnpeakGiven) - model->BSIM3v1pnpeak = 0.0; - if (!model->BSIM3v1pngateGiven) - model->BSIM3v1pngate = 0.0; - if (!model->BSIM3v1pvbmGiven) - model->BSIM3v1pvbm = 0.0; - if (!model->BSIM3v1pxtGiven) - model->BSIM3v1pxt = 0.0; - if (!model->BSIM3v1pkt1Given) - model->BSIM3v1pkt1 = 0.0; - if (!model->BSIM3v1pkt1lGiven) - model->BSIM3v1pkt1l = 0.0; - if (!model->BSIM3v1pkt2Given) - model->BSIM3v1pkt2 = 0.0; - if (!model->BSIM3v1pk3Given) - model->BSIM3v1pk3 = 0.0; - if (!model->BSIM3v1pk3bGiven) - model->BSIM3v1pk3b = 0.0; - if (!model->BSIM3v1pw0Given) - model->BSIM3v1pw0 = 0.0; - if (!model->BSIM3v1pnlxGiven) - model->BSIM3v1pnlx = 0.0; - if (!model->BSIM3v1pdvt0Given) - model->BSIM3v1pdvt0 = 0.0; - if (!model->BSIM3v1pdvt1Given) - model->BSIM3v1pdvt1 = 0.0; - if (!model->BSIM3v1pdvt2Given) - model->BSIM3v1pdvt2 = 0.0; - if (!model->BSIM3v1pdvt0wGiven) - model->BSIM3v1pdvt0w = 0.0; - if (!model->BSIM3v1pdvt1wGiven) - model->BSIM3v1pdvt1w = 0.0; - if (!model->BSIM3v1pdvt2wGiven) - model->BSIM3v1pdvt2w = 0.0; - if (!model->BSIM3v1pdroutGiven) - model->BSIM3v1pdrout = 0.0; - if (!model->BSIM3v1pdsubGiven) - model->BSIM3v1pdsub = 0.0; - if (!model->BSIM3v1pvth0Given) - model->BSIM3v1pvth0 = 0.0; - if (!model->BSIM3v1puaGiven) - model->BSIM3v1pua = 0.0; - if (!model->BSIM3v1pua1Given) - model->BSIM3v1pua1 = 0.0; - if (!model->BSIM3v1pubGiven) - model->BSIM3v1pub = 0.0; - if (!model->BSIM3v1pub1Given) - model->BSIM3v1pub1 = 0.0; - if (!model->BSIM3v1pucGiven) - model->BSIM3v1puc = 0.0; - if (!model->BSIM3v1puc1Given) - model->BSIM3v1puc1 = 0.0; - if (!model->BSIM3v1pu0Given) - model->BSIM3v1pu0 = 0.0; - if (!model->BSIM3v1puteGiven) - model->BSIM3v1pute = 0.0; - if (!model->BSIM3v1pvoffGiven) - model->BSIM3v1pvoff = 0.0; - if (!model->BSIM3v1pdeltaGiven) - model->BSIM3v1pdelta = 0.0; - if (!model->BSIM3v1prdswGiven) - model->BSIM3v1prdsw = 0.0; - if (!model->BSIM3v1pprwbGiven) - model->BSIM3v1pprwb = 0.0; - if (!model->BSIM3v1pprwgGiven) - model->BSIM3v1pprwg = 0.0; - if (!model->BSIM3v1pprtGiven) - model->BSIM3v1pprt = 0.0; - if (!model->BSIM3v1peta0Given) - model->BSIM3v1peta0 = 0.0; - if (!model->BSIM3v1petabGiven) - model->BSIM3v1petab = 0.0; - if (!model->BSIM3v1ppclmGiven) - model->BSIM3v1ppclm = 0.0; - if (!model->BSIM3v1ppdibl1Given) - model->BSIM3v1ppdibl1 = 0.0; - if (!model->BSIM3v1ppdibl2Given) - model->BSIM3v1ppdibl2 = 0.0; - if (!model->BSIM3v1ppdiblbGiven) - model->BSIM3v1ppdiblb = 0.0; - if (!model->BSIM3v1ppscbe1Given) - model->BSIM3v1ppscbe1 = 0.0; - if (!model->BSIM3v1ppscbe2Given) - model->BSIM3v1ppscbe2 = 0.0; - if (!model->BSIM3v1ppvagGiven) - model->BSIM3v1ppvag = 0.0; - if (!model->BSIM3v1pwrGiven) - model->BSIM3v1pwr = 0.0; - if (!model->BSIM3v1pdwgGiven) - model->BSIM3v1pdwg = 0.0; - if (!model->BSIM3v1pdwbGiven) - model->BSIM3v1pdwb = 0.0; - if (!model->BSIM3v1pb0Given) - model->BSIM3v1pb0 = 0.0; - if (!model->BSIM3v1pb1Given) - model->BSIM3v1pb1 = 0.0; - if (!model->BSIM3v1palpha0Given) - model->BSIM3v1palpha0 = 0.0; - if (!model->BSIM3v1pbeta0Given) - model->BSIM3v1pbeta0 = 0.0; - - if (!model->BSIM3v1pelmGiven) - model->BSIM3v1pelm = 0.0; - if (!model->BSIM3v1pcgslGiven) - model->BSIM3v1pcgsl = 0.0; - if (!model->BSIM3v1pcgdlGiven) - model->BSIM3v1pcgdl = 0.0; - if (!model->BSIM3v1pckappaGiven) - model->BSIM3v1pckappa = 0.0; - if (!model->BSIM3v1pcfGiven) - model->BSIM3v1pcf = 0.0; - if (!model->BSIM3v1pclcGiven) - model->BSIM3v1pclc = 0.0; - if (!model->BSIM3v1pcleGiven) - model->BSIM3v1pcle = 0.0; - if (!model->BSIM3v1pvfbcvGiven) - model->BSIM3v1pvfbcv = 0.0; - - /* unit degree celcius */ - if (!model->BSIM3v1tnomGiven) - model->BSIM3v1tnom = ckt->CKTnomTemp; - if (!model->BSIM3v1LintGiven) - model->BSIM3v1Lint = 0.0; - if (!model->BSIM3v1LlGiven) - model->BSIM3v1Ll = 0.0; - if (!model->BSIM3v1LlnGiven) - model->BSIM3v1Lln = 1.0; - if (!model->BSIM3v1LwGiven) - model->BSIM3v1Lw = 0.0; - if (!model->BSIM3v1LwnGiven) - model->BSIM3v1Lwn = 1.0; - if (!model->BSIM3v1LwlGiven) - model->BSIM3v1Lwl = 0.0; - if (!model->BSIM3v1LminGiven) - model->BSIM3v1Lmin = 0.0; - if (!model->BSIM3v1LmaxGiven) - model->BSIM3v1Lmax = 1.0; - if (!model->BSIM3v1WintGiven) - model->BSIM3v1Wint = 0.0; - if (!model->BSIM3v1WlGiven) - model->BSIM3v1Wl = 0.0; - if (!model->BSIM3v1WlnGiven) - model->BSIM3v1Wln = 1.0; - if (!model->BSIM3v1WwGiven) - model->BSIM3v1Ww = 0.0; - if (!model->BSIM3v1WwnGiven) - model->BSIM3v1Wwn = 1.0; - if (!model->BSIM3v1WwlGiven) - model->BSIM3v1Wwl = 0.0; - if (!model->BSIM3v1WminGiven) - model->BSIM3v1Wmin = 0.0; - if (!model->BSIM3v1WmaxGiven) - model->BSIM3v1Wmax = 1.0; - if (!model->BSIM3v1dwcGiven) - model->BSIM3v1dwc = model->BSIM3v1Wint; - if (!model->BSIM3v1dlcGiven) - model->BSIM3v1dlc = model->BSIM3v1Lint; - if (!model->BSIM3v1cfGiven) - model->BSIM3v1cf = 2.0 * EPSOX / PI - * log(1.0 + 0.4e-6 / model->BSIM3v1tox); - if (!model->BSIM3v1cgdoGiven) - { if (model->BSIM3v1dlcGiven && (model->BSIM3v1dlc > 0.0)) - { model->BSIM3v1cgdo = model->BSIM3v1dlc * model->BSIM3v1cox - - model->BSIM3v1cgdl ; - } - else - model->BSIM3v1cgdo = 0.6 * model->BSIM3v1xj * model->BSIM3v1cox; - } - if (!model->BSIM3v1cgsoGiven) - { if (model->BSIM3v1dlcGiven && (model->BSIM3v1dlc > 0.0)) - { model->BSIM3v1cgso = model->BSIM3v1dlc * model->BSIM3v1cox - - model->BSIM3v1cgsl ; - } - else - model->BSIM3v1cgso = 0.6 * model->BSIM3v1xj * model->BSIM3v1cox; - } - - if (!model->BSIM3v1cgboGiven) - { model->BSIM3v1cgbo = 2.0 * model->BSIM3v1dwc * model->BSIM3v1cox; - } - if (!model->BSIM3v1xpartGiven) - model->BSIM3v1xpart = 0.0; - if (!model->BSIM3v1sheetResistanceGiven) - model->BSIM3v1sheetResistance = 0.0; - if (!model->BSIM3v1unitAreaJctCapGiven) - model->BSIM3v1unitAreaJctCap = 5.0E-4; - if (!model->BSIM3v1unitLengthSidewallJctCapGiven) - model->BSIM3v1unitLengthSidewallJctCap = 5.0E-10; - if (!model->BSIM3v1unitLengthGateSidewallJctCapGiven) - model->BSIM3v1unitLengthGateSidewallJctCap = model->BSIM3v1unitLengthSidewallJctCap ; - if (!model->BSIM3v1jctSatCurDensityGiven) - model->BSIM3v1jctSatCurDensity = 1.0E-4; - if (!model->BSIM3v1jctSidewallSatCurDensityGiven) - model->BSIM3v1jctSidewallSatCurDensity = 0.0; - if (!model->BSIM3v1bulkJctPotentialGiven) - model->BSIM3v1bulkJctPotential = 1.0; - if (!model->BSIM3v1sidewallJctPotentialGiven) - model->BSIM3v1sidewallJctPotential = 1.0; - if (!model->BSIM3v1GatesidewallJctPotentialGiven) - model->BSIM3v1GatesidewallJctPotential = model->BSIM3v1sidewallJctPotential; - if (!model->BSIM3v1bulkJctBotGradingCoeffGiven) - model->BSIM3v1bulkJctBotGradingCoeff = 0.5; - if (!model->BSIM3v1bulkJctSideGradingCoeffGiven) - model->BSIM3v1bulkJctSideGradingCoeff = 0.33; - if (!model->BSIM3v1bulkJctGateSideGradingCoeffGiven) - model->BSIM3v1bulkJctGateSideGradingCoeff = model->BSIM3v1bulkJctSideGradingCoeff; - if (!model->BSIM3v1jctEmissionCoeffGiven) - model->BSIM3v1jctEmissionCoeff = 1.0; - if (!model->BSIM3v1jctTempExponentGiven) - model->BSIM3v1jctTempExponent = 3.0; - if (!model->BSIM3v1oxideTrapDensityAGiven) - { if (model->BSIM3v1type == NMOS) - model->BSIM3v1oxideTrapDensityA = 1e20; - else - model->BSIM3v1oxideTrapDensityA=9.9e18; - } - if (!model->BSIM3v1oxideTrapDensityBGiven) - { if (model->BSIM3v1type == NMOS) - model->BSIM3v1oxideTrapDensityB = 5e4; - else - model->BSIM3v1oxideTrapDensityB = 2.4e3; - } - if (!model->BSIM3v1oxideTrapDensityCGiven) - { if (model->BSIM3v1type == NMOS) - model->BSIM3v1oxideTrapDensityC = -1.4e-12; - else - model->BSIM3v1oxideTrapDensityC = 1.4e-12; - - } - if (!model->BSIM3v1emGiven) - model->BSIM3v1em = 4.1e7; /* V/m */ - if (!model->BSIM3v1efGiven) - model->BSIM3v1ef = 1.0; - if (!model->BSIM3v1afGiven) - model->BSIM3v1af = 1.0; - if (!model->BSIM3v1kfGiven) - model->BSIM3v1kf = 0.0; - /* loop through all the instances of the model */ - for (here = BSIM3v1instances(model); here != NULL ; - here=BSIM3v1nextInstance(here)) - { - /* allocate a chunk of the state vector */ - here->BSIM3v1states = *states; - *states += BSIM3v1numStates; - - /* perform the parameter defaulting */ - if(here->BSIM3v1m == 0.0) - here->BSIM3v1m = 1.0; - - if (!here->BSIM3v1wGiven) - here->BSIM3v1w = 5e-6; - - if (!here->BSIM3v1drainAreaGiven) - { - if(model->BSIM3v1hdifGiven) - here->BSIM3v1drainArea = here->BSIM3v1w * 2 * model->BSIM3v1hdif; - else - here->BSIM3v1drainArea = 0.0; - } - if (!here->BSIM3v1drainPerimeterGiven) - { - if(model->BSIM3v1hdifGiven) - here->BSIM3v1drainPerimeter = - 2 * here->BSIM3v1w + 4 * model->BSIM3v1hdif; - else - here->BSIM3v1drainPerimeter = 0.0; - } - - if (!here->BSIM3v1drainSquaresGiven) - here->BSIM3v1drainSquares = 1.0; - - if (!here->BSIM3v1icVBSGiven) - here->BSIM3v1icVBS = 0; - if (!here->BSIM3v1icVDSGiven) - here->BSIM3v1icVDS = 0; - if (!here->BSIM3v1icVGSGiven) - here->BSIM3v1icVGS = 0; - if (!here->BSIM3v1lGiven) - here->BSIM3v1l = 5e-6; - if (!here->BSIM3v1sourceAreaGiven) - { - if(model->BSIM3v1hdifGiven) - here->BSIM3v1sourceArea = here->BSIM3v1w * 2 * model->BSIM3v1hdif; - else - here->BSIM3v1sourceArea = 0.0; - } - - if (!here->BSIM3v1sourcePerimeterGiven) - { - if(model->BSIM3v1hdifGiven) - here->BSIM3v1sourcePerimeter = - 2 * here->BSIM3v1w + 4 * model->BSIM3v1hdif; - else - here->BSIM3v1sourcePerimeter = 0.0; - } - - if (!here->BSIM3v1sourceSquaresGiven) - here->BSIM3v1sourceSquares = 1; - - if (!here->BSIM3v1wGiven) - here->BSIM3v1w = 5e-6; - - if (!here->BSIM3v1mGiven) - here->BSIM3v1m = 1; - - if (!here->BSIM3v1nqsModGiven) - here->BSIM3v1nqsMod = model->BSIM3v1nqsMod; - - /* process drain series resistance */ - if ((model->BSIM3v1sheetResistance > 0.0) && - (here->BSIM3v1drainSquares > 0.0 )) - { if(here->BSIM3v1dNodePrime == 0) - { error = CKTmkVolt(ckt,&tmp,here->BSIM3v1name,"drain"); - if(error) return(error); - here->BSIM3v1dNodePrime = tmp->number; - - if (ckt->CKTcopyNodesets) { - if (CKTinst2Node(ckt,here,1,&tmpNode,&tmpName)==OK) { - if (tmpNode->nsGiven) { - tmp->nodeset=tmpNode->nodeset; - tmp->nsGiven=tmpNode->nsGiven; - } - } - } - - } - } - else - { here->BSIM3v1dNodePrime = here->BSIM3v1dNode; - } - - /* process source series resistance */ - if ((model->BSIM3v1sheetResistance > 0.0) && - (here->BSIM3v1sourceSquares > 0.0 )) - { if(here->BSIM3v1sNodePrime == 0) - { error = CKTmkVolt(ckt,&tmp,here->BSIM3v1name,"source"); - if(error) return(error); - here->BSIM3v1sNodePrime = tmp->number; - - if (ckt->CKTcopyNodesets) { - if (CKTinst2Node(ckt,here,3,&tmpNode,&tmpName)==OK) { - if (tmpNode->nsGiven) { - tmp->nodeset=tmpNode->nodeset; - tmp->nsGiven=tmpNode->nsGiven; - } - } - } - } - - } - else - { here->BSIM3v1sNodePrime = here->BSIM3v1sNode; - } - - /* internal charge node */ - - if ((here->BSIM3v1nqsMod)) - { if(here->BSIM3v1qNode == 0) - { error = CKTmkVolt(ckt,&tmp,here->BSIM3v1name,"charge"); - if(error) return(error); - here->BSIM3v1qNode = tmp->number; - } - } - else - { here->BSIM3v1qNode = 0; - } - - /* set Sparse Matrix Pointers */ - -/* macro to make elements with built in test for out of memory */ -#define TSTALLOC(ptr,first,second) \ -do { if((here->ptr = SMPmakeElt(matrix, here->first, here->second)) == NULL){\ - return(E_NOMEM);\ -} } while(0) - - TSTALLOC(BSIM3v1DdPtr, BSIM3v1dNode, BSIM3v1dNode); - TSTALLOC(BSIM3v1GgPtr, BSIM3v1gNode, BSIM3v1gNode); - TSTALLOC(BSIM3v1SsPtr, BSIM3v1sNode, BSIM3v1sNode); - TSTALLOC(BSIM3v1BbPtr, BSIM3v1bNode, BSIM3v1bNode); - TSTALLOC(BSIM3v1DPdpPtr, BSIM3v1dNodePrime, BSIM3v1dNodePrime); - TSTALLOC(BSIM3v1SPspPtr, BSIM3v1sNodePrime, BSIM3v1sNodePrime); - TSTALLOC(BSIM3v1DdpPtr, BSIM3v1dNode, BSIM3v1dNodePrime); - TSTALLOC(BSIM3v1GbPtr, BSIM3v1gNode, BSIM3v1bNode); - TSTALLOC(BSIM3v1GdpPtr, BSIM3v1gNode, BSIM3v1dNodePrime); - TSTALLOC(BSIM3v1GspPtr, BSIM3v1gNode, BSIM3v1sNodePrime); - TSTALLOC(BSIM3v1SspPtr, BSIM3v1sNode, BSIM3v1sNodePrime); - TSTALLOC(BSIM3v1BdpPtr, BSIM3v1bNode, BSIM3v1dNodePrime); - TSTALLOC(BSIM3v1BspPtr, BSIM3v1bNode, BSIM3v1sNodePrime); - TSTALLOC(BSIM3v1DPspPtr, BSIM3v1dNodePrime, BSIM3v1sNodePrime); - TSTALLOC(BSIM3v1DPdPtr, BSIM3v1dNodePrime, BSIM3v1dNode); - TSTALLOC(BSIM3v1BgPtr, BSIM3v1bNode, BSIM3v1gNode); - TSTALLOC(BSIM3v1DPgPtr, BSIM3v1dNodePrime, BSIM3v1gNode); - TSTALLOC(BSIM3v1SPgPtr, BSIM3v1sNodePrime, BSIM3v1gNode); - TSTALLOC(BSIM3v1SPsPtr, BSIM3v1sNodePrime, BSIM3v1sNode); - TSTALLOC(BSIM3v1DPbPtr, BSIM3v1dNodePrime, BSIM3v1bNode); - TSTALLOC(BSIM3v1SPbPtr, BSIM3v1sNodePrime, BSIM3v1bNode); - TSTALLOC(BSIM3v1SPdpPtr, BSIM3v1sNodePrime, BSIM3v1dNodePrime); - - TSTALLOC(BSIM3v1QqPtr, BSIM3v1qNode, BSIM3v1qNode); - - TSTALLOC(BSIM3v1QdpPtr, BSIM3v1qNode, BSIM3v1dNodePrime); - TSTALLOC(BSIM3v1QspPtr, BSIM3v1qNode, BSIM3v1sNodePrime); - TSTALLOC(BSIM3v1QgPtr, BSIM3v1qNode, BSIM3v1gNode); - TSTALLOC(BSIM3v1QbPtr, BSIM3v1qNode, BSIM3v1bNode); - TSTALLOC(BSIM3v1DPqPtr, BSIM3v1dNodePrime, BSIM3v1qNode); - TSTALLOC(BSIM3v1SPqPtr, BSIM3v1sNodePrime, BSIM3v1qNode); - TSTALLOC(BSIM3v1GqPtr, BSIM3v1gNode, BSIM3v1qNode); - TSTALLOC(BSIM3v1BqPtr, BSIM3v1bNode, BSIM3v1qNode); - - } - } - return(OK); -} - - -int -BSIM3v1unsetup(GENmodel *inModel, CKTcircuit *ckt) -{ - BSIM3v1model *model; - BSIM3v1instance *here; - - for (model = (BSIM3v1model *)inModel; model != NULL; - model = BSIM3v1nextModel(model)) - { - for (here = BSIM3v1instances(model); here != NULL; - here=BSIM3v1nextInstance(here)) - { - if (here->BSIM3v1qNode > 0) - CKTdltNNum(ckt, here->BSIM3v1qNode); - here->BSIM3v1qNode = 0; - - if (here->BSIM3v1sNodePrime > 0 - && here->BSIM3v1sNodePrime != here->BSIM3v1sNode) - CKTdltNNum(ckt, here->BSIM3v1sNodePrime); - here->BSIM3v1sNodePrime = 0; - - if (here->BSIM3v1dNodePrime > 0 - && here->BSIM3v1dNodePrime != here->BSIM3v1dNode) - CKTdltNNum(ckt, here->BSIM3v1dNodePrime); - here->BSIM3v1dNodePrime = 0; - } - } - return OK; -} - - diff --git a/src/spicelib/devices/bsim3v1/b3v1temp.c b/src/spicelib/devices/bsim3v1/b3v1temp.c deleted file mode 100644 index e179be58a..000000000 --- a/src/spicelib/devices/bsim3v1/b3v1temp.c +++ /dev/null @@ -1,669 +0,0 @@ -/********** - * Copyright 1990 Regents of the University of California. All rights reserved. - * File: b3v1ld.c - * Author: 1995 Min-Chie Jeng and Mansun Chan. - * Modified by Paolo Nenzi 2002 - **********/ - -/* - * Release Notes: - * BSIM3v3.1, Released by yuhua 96/12/08 - */ - -/* Lmin, Lmax, Wmin, Wmax */ - -#include "ngspice/ngspice.h" -#include "ngspice/smpdefs.h" -#include "ngspice/cktdefs.h" -#include "bsim3v1def.h" -#include "ngspice/const.h" -#include "ngspice/sperror.h" -#include "ngspice/suffix.h" - -#define Kb 1.3806226e-23 -#define KboQ 8.617087e-5 /* Kb / q where q = 1.60219e-19 */ -#define EPSOX 3.453133e-11 -#define EPSSI 1.03594e-10 -#define PI 3.141592654 -#define MAX_EXP 5.834617425e14 -#define MIN_EXP 1.713908431e-15 -#define EXP_THRESHOLD 34.0 -#define Charge_q 1.60219e-19 - - -/* ARGSUSED */ -int -BSIM3v1temp(GENmodel *inModel, CKTcircuit *ckt) -{ -BSIM3v1model *model = (BSIM3v1model*) inModel; -BSIM3v1instance *here; -struct bsim3v1SizeDependParam *pSizeDependParamKnot, *pLastKnot, *pParam = NULL; -double tmp1, tmp2, Eg, Eg0, ni, T0, T1, T2, T3, Ldrn, Wdrn; -double Temp, TRatio, Inv_L, Inv_W, Inv_LW, Vtm0, Tnom; -int Size_Not_Found; - - /* loop through all the BSIM3v1 device models */ - for (; model != NULL; model = BSIM3v1nextModel(model)) - { Temp = ckt->CKTtemp; - if (model->BSIM3v1bulkJctPotential < 0.1) - model->BSIM3v1bulkJctPotential = 0.1; - if (model->BSIM3v1sidewallJctPotential < 0.1) - model->BSIM3v1sidewallJctPotential = 0.1; - if (model->BSIM3v1GatesidewallJctPotential < 0.1) - model->BSIM3v1GatesidewallJctPotential = 0.1; - - struct bsim3v1SizeDependParam *p = model->pSizeDependParamKnot; - while (p) { - struct bsim3v1SizeDependParam *next_p = p->pNext; - FREE(p); - p = next_p; - } - model->pSizeDependParamKnot = NULL; - pLastKnot = NULL; - - Tnom = model->BSIM3v1tnom; - TRatio = Temp / Tnom; - - model->BSIM3v1vcrit = CONSTvt0 * log(CONSTvt0 / (CONSTroot2 * 1.0e-14)); - model->BSIM3v1factor1 = sqrt(EPSSI / EPSOX * model->BSIM3v1tox); - - Vtm0 = KboQ * Tnom; - Eg0 = 1.16 - 7.02e-4 * Tnom * Tnom / (Tnom + 1108.0); - ni = 1.45e10 * (Tnom / 300.15) * sqrt(Tnom / 300.15) - * exp(21.5565981 - Eg0 / (2.0 * Vtm0)); - - model->BSIM3v1vtm = KboQ * Temp; - Eg = 1.16 - 7.02e-4 * Temp * Temp / (Temp + 1108.0); - if (Temp != Tnom) - { T0 = Eg0 / Vtm0 - Eg / model->BSIM3v1vtm + model->BSIM3v1jctTempExponent - * log(Temp / Tnom); - T1 = exp(T0 / model->BSIM3v1jctEmissionCoeff); - model->BSIM3v1jctTempSatCurDensity = model->BSIM3v1jctSatCurDensity - * T1; - model->BSIM3v1jctSidewallTempSatCurDensity - = model->BSIM3v1jctSidewallSatCurDensity * T1; - } - else - { model->BSIM3v1jctTempSatCurDensity = model->BSIM3v1jctSatCurDensity; - model->BSIM3v1jctSidewallTempSatCurDensity - = model->BSIM3v1jctSidewallSatCurDensity; - } - - if (model->BSIM3v1jctTempSatCurDensity < 0.0) - model->BSIM3v1jctTempSatCurDensity = 0.0; - if (model->BSIM3v1jctSidewallTempSatCurDensity < 0.0) - model->BSIM3v1jctSidewallTempSatCurDensity = 0.0; - - /* loop through all the instances of the model */ - /* MCJ: Length and Width not initialized */ - for (here = BSIM3v1instances(model); here != NULL; - here = BSIM3v1nextInstance(here)) - { - pSizeDependParamKnot = model->pSizeDependParamKnot; - Size_Not_Found = 1; - while ((pSizeDependParamKnot != NULL) && Size_Not_Found) - { if ((here->BSIM3v1l == pSizeDependParamKnot->Length) - && (here->BSIM3v1w == pSizeDependParamKnot->Width)) - { Size_Not_Found = 0; - here->pParam = pSizeDependParamKnot; - } - else - { pLastKnot = pSizeDependParamKnot; - pSizeDependParamKnot = pSizeDependParamKnot->pNext; - } - } - - if (Size_Not_Found) - { pParam = TMALLOC(struct bsim3v1SizeDependParam, 1); - if (pLastKnot == NULL) - model->pSizeDependParamKnot = pParam; - else - pLastKnot->pNext = pParam; - pParam->pNext = NULL; - here->pParam = pParam; - - Ldrn = here->BSIM3v1l; - Wdrn = here->BSIM3v1w; - pParam->Length = Ldrn; - pParam->Width = Wdrn; - - T0 = pow(Ldrn, model->BSIM3v1Lln); - T1 = pow(Wdrn, model->BSIM3v1Lwn); - tmp1 = model->BSIM3v1Ll / T0 + model->BSIM3v1Lw / T1 - + model->BSIM3v1Lwl / (T0 * T1); - pParam->BSIM3v1dl = model->BSIM3v1Lint + tmp1; - pParam->BSIM3v1dlc = model->BSIM3v1dlc + tmp1; - - T2 = pow(Ldrn, model->BSIM3v1Wln); - T3 = pow(Wdrn, model->BSIM3v1Wwn); - tmp2 = model->BSIM3v1Wl / T2 + model->BSIM3v1Ww / T3 - + model->BSIM3v1Wwl / (T2 * T3); - pParam->BSIM3v1dw = model->BSIM3v1Wint + tmp2; - pParam->BSIM3v1dwc = model->BSIM3v1dwc + tmp2; - - pParam->BSIM3v1leff = here->BSIM3v1l - 2.0 * pParam->BSIM3v1dl; - if (pParam->BSIM3v1leff <= 0.0) - { - SPfrontEnd->IFerrorf (ERR_FATAL, - "BSIM3v1: mosfet %s, model %s: Effective channel length <= 0", - model->BSIM3v1modName, here->BSIM3v1name); - return(E_BADPARM); - } - - pParam->BSIM3v1weff = here->BSIM3v1w - 2.0 * pParam->BSIM3v1dw; - if (pParam->BSIM3v1weff <= 0.0) - { - SPfrontEnd->IFerrorf (ERR_FATAL, - "BSIM3v1: mosfet %s, model %s: Effective channel width <= 0", - model->BSIM3v1modName, here->BSIM3v1name); - return(E_BADPARM); - } - - pParam->BSIM3v1leffCV = here->BSIM3v1l - 2.0 * pParam->BSIM3v1dlc; - if (pParam->BSIM3v1leffCV <= 0.0) - { - SPfrontEnd->IFerrorf (ERR_FATAL, - "BSIM3v1: mosfet %s, model %s: Effective channel length for C-V <= 0", - model->BSIM3v1modName, here->BSIM3v1name); - return(E_BADPARM); - } - - pParam->BSIM3v1weffCV = here->BSIM3v1w - 2.0 * pParam->BSIM3v1dwc; - if (pParam->BSIM3v1weffCV <= 0.0) - { - SPfrontEnd->IFerrorf (ERR_FATAL, - "BSIM3v1: mosfet %s, model %s: Effective channel width for C-V <= 0", - model->BSIM3v1modName, here->BSIM3v1name); - return(E_BADPARM); - } - - - if (model->BSIM3v1binUnit == 1) - { Inv_L = 1.0e-6 / pParam->BSIM3v1leff; - Inv_W = 1.0e-6 / pParam->BSIM3v1weff; - Inv_LW = 1.0e-12 / (pParam->BSIM3v1leff - * pParam->BSIM3v1weff); - } - else - { Inv_L = 1.0 / pParam->BSIM3v1leff; - Inv_W = 1.0 / pParam->BSIM3v1weff; - Inv_LW = 1.0 / (pParam->BSIM3v1leff - * pParam->BSIM3v1weff); - } - pParam->BSIM3v1cdsc = model->BSIM3v1cdsc - + model->BSIM3v1lcdsc * Inv_L - + model->BSIM3v1wcdsc * Inv_W - + model->BSIM3v1pcdsc * Inv_LW; - pParam->BSIM3v1cdscb = model->BSIM3v1cdscb - + model->BSIM3v1lcdscb * Inv_L - + model->BSIM3v1wcdscb * Inv_W - + model->BSIM3v1pcdscb * Inv_LW; - - pParam->BSIM3v1cdscd = model->BSIM3v1cdscd - + model->BSIM3v1lcdscd * Inv_L - + model->BSIM3v1wcdscd * Inv_W - + model->BSIM3v1pcdscd * Inv_LW; - - pParam->BSIM3v1cit = model->BSIM3v1cit - + model->BSIM3v1lcit * Inv_L - + model->BSIM3v1wcit * Inv_W - + model->BSIM3v1pcit * Inv_LW; - pParam->BSIM3v1nfactor = model->BSIM3v1nfactor - + model->BSIM3v1lnfactor * Inv_L - + model->BSIM3v1wnfactor * Inv_W - + model->BSIM3v1pnfactor * Inv_LW; - pParam->BSIM3v1xj = model->BSIM3v1xj - + model->BSIM3v1lxj * Inv_L - + model->BSIM3v1wxj * Inv_W - + model->BSIM3v1pxj * Inv_LW; - pParam->BSIM3v1vsat = model->BSIM3v1vsat - + model->BSIM3v1lvsat * Inv_L - + model->BSIM3v1wvsat * Inv_W - + model->BSIM3v1pvsat * Inv_LW; - pParam->BSIM3v1at = model->BSIM3v1at - + model->BSIM3v1lat * Inv_L - + model->BSIM3v1wat * Inv_W - + model->BSIM3v1pat * Inv_LW; - pParam->BSIM3v1a0 = model->BSIM3v1a0 - + model->BSIM3v1la0 * Inv_L - + model->BSIM3v1wa0 * Inv_W - + model->BSIM3v1pa0 * Inv_LW; - - pParam->BSIM3v1ags = model->BSIM3v1ags - + model->BSIM3v1lags * Inv_L - + model->BSIM3v1wags * Inv_W - + model->BSIM3v1pags * Inv_LW; - - pParam->BSIM3v1a1 = model->BSIM3v1a1 - + model->BSIM3v1la1 * Inv_L - + model->BSIM3v1wa1 * Inv_W - + model->BSIM3v1pa1 * Inv_LW; - pParam->BSIM3v1a2 = model->BSIM3v1a2 - + model->BSIM3v1la2 * Inv_L - + model->BSIM3v1wa2 * Inv_W - + model->BSIM3v1pa2 * Inv_LW; - pParam->BSIM3v1keta = model->BSIM3v1keta - + model->BSIM3v1lketa * Inv_L - + model->BSIM3v1wketa * Inv_W - + model->BSIM3v1pketa * Inv_LW; - pParam->BSIM3v1nsub = model->BSIM3v1nsub - + model->BSIM3v1lnsub * Inv_L - + model->BSIM3v1wnsub * Inv_W - + model->BSIM3v1pnsub * Inv_LW; - pParam->BSIM3v1npeak = model->BSIM3v1npeak - + model->BSIM3v1lnpeak * Inv_L - + model->BSIM3v1wnpeak * Inv_W - + model->BSIM3v1pnpeak * Inv_LW; - pParam->BSIM3v1ngate = model->BSIM3v1ngate - + model->BSIM3v1lngate * Inv_L - + model->BSIM3v1wngate * Inv_W - + model->BSIM3v1pngate * Inv_LW; - pParam->BSIM3v1gamma1 = model->BSIM3v1gamma1 - + model->BSIM3v1lgamma1 * Inv_L - + model->BSIM3v1wgamma1 * Inv_W - + model->BSIM3v1pgamma1 * Inv_LW; - pParam->BSIM3v1gamma2 = model->BSIM3v1gamma2 - + model->BSIM3v1lgamma2 * Inv_L - + model->BSIM3v1wgamma2 * Inv_W - + model->BSIM3v1pgamma2 * Inv_LW; - pParam->BSIM3v1vbx = model->BSIM3v1vbx - + model->BSIM3v1lvbx * Inv_L - + model->BSIM3v1wvbx * Inv_W - + model->BSIM3v1pvbx * Inv_LW; - pParam->BSIM3v1vbm = model->BSIM3v1vbm - + model->BSIM3v1lvbm * Inv_L - + model->BSIM3v1wvbm * Inv_W - + model->BSIM3v1pvbm * Inv_LW; - pParam->BSIM3v1xt = model->BSIM3v1xt - + model->BSIM3v1lxt * Inv_L - + model->BSIM3v1wxt * Inv_W - + model->BSIM3v1pxt * Inv_LW; - pParam->BSIM3v1k1 = model->BSIM3v1k1 - + model->BSIM3v1lk1 * Inv_L - + model->BSIM3v1wk1 * Inv_W - + model->BSIM3v1pk1 * Inv_LW; - pParam->BSIM3v1kt1 = model->BSIM3v1kt1 - + model->BSIM3v1lkt1 * Inv_L - + model->BSIM3v1wkt1 * Inv_W - + model->BSIM3v1pkt1 * Inv_LW; - pParam->BSIM3v1kt1l = model->BSIM3v1kt1l - + model->BSIM3v1lkt1l * Inv_L - + model->BSIM3v1wkt1l * Inv_W - + model->BSIM3v1pkt1l * Inv_LW; - pParam->BSIM3v1k2 = model->BSIM3v1k2 - + model->BSIM3v1lk2 * Inv_L - + model->BSIM3v1wk2 * Inv_W - + model->BSIM3v1pk2 * Inv_LW; - pParam->BSIM3v1kt2 = model->BSIM3v1kt2 - + model->BSIM3v1lkt2 * Inv_L - + model->BSIM3v1wkt2 * Inv_W - + model->BSIM3v1pkt2 * Inv_LW; - pParam->BSIM3v1k3 = model->BSIM3v1k3 - + model->BSIM3v1lk3 * Inv_L - + model->BSIM3v1wk3 * Inv_W - + model->BSIM3v1pk3 * Inv_LW; - pParam->BSIM3v1k3b = model->BSIM3v1k3b - + model->BSIM3v1lk3b * Inv_L - + model->BSIM3v1wk3b * Inv_W - + model->BSIM3v1pk3b * Inv_LW; - pParam->BSIM3v1w0 = model->BSIM3v1w0 - + model->BSIM3v1lw0 * Inv_L - + model->BSIM3v1ww0 * Inv_W - + model->BSIM3v1pw0 * Inv_LW; - pParam->BSIM3v1nlx = model->BSIM3v1nlx - + model->BSIM3v1lnlx * Inv_L - + model->BSIM3v1wnlx * Inv_W - + model->BSIM3v1pnlx * Inv_LW; - pParam->BSIM3v1dvt0 = model->BSIM3v1dvt0 - + model->BSIM3v1ldvt0 * Inv_L - + model->BSIM3v1wdvt0 * Inv_W - + model->BSIM3v1pdvt0 * Inv_LW; - pParam->BSIM3v1dvt1 = model->BSIM3v1dvt1 - + model->BSIM3v1ldvt1 * Inv_L - + model->BSIM3v1wdvt1 * Inv_W - + model->BSIM3v1pdvt1 * Inv_LW; - pParam->BSIM3v1dvt2 = model->BSIM3v1dvt2 - + model->BSIM3v1ldvt2 * Inv_L - + model->BSIM3v1wdvt2 * Inv_W - + model->BSIM3v1pdvt2 * Inv_LW; - pParam->BSIM3v1dvt0w = model->BSIM3v1dvt0w - + model->BSIM3v1ldvt0w * Inv_L - + model->BSIM3v1wdvt0w * Inv_W - + model->BSIM3v1pdvt0w * Inv_LW; - pParam->BSIM3v1dvt1w = model->BSIM3v1dvt1w - + model->BSIM3v1ldvt1w * Inv_L - + model->BSIM3v1wdvt1w * Inv_W - + model->BSIM3v1pdvt1w * Inv_LW; - pParam->BSIM3v1dvt2w = model->BSIM3v1dvt2w - + model->BSIM3v1ldvt2w * Inv_L - + model->BSIM3v1wdvt2w * Inv_W - + model->BSIM3v1pdvt2w * Inv_LW; - pParam->BSIM3v1drout = model->BSIM3v1drout - + model->BSIM3v1ldrout * Inv_L - + model->BSIM3v1wdrout * Inv_W - + model->BSIM3v1pdrout * Inv_LW; - pParam->BSIM3v1dsub = model->BSIM3v1dsub - + model->BSIM3v1ldsub * Inv_L - + model->BSIM3v1wdsub * Inv_W - + model->BSIM3v1pdsub * Inv_LW; - pParam->BSIM3v1vth0 = model->BSIM3v1vth0 - + model->BSIM3v1lvth0 * Inv_L - + model->BSIM3v1wvth0 * Inv_W - + model->BSIM3v1pvth0 * Inv_LW; - pParam->BSIM3v1ua = model->BSIM3v1ua - + model->BSIM3v1lua * Inv_L - + model->BSIM3v1wua * Inv_W - + model->BSIM3v1pua * Inv_LW; - pParam->BSIM3v1ua1 = model->BSIM3v1ua1 - + model->BSIM3v1lua1 * Inv_L - + model->BSIM3v1wua1 * Inv_W - + model->BSIM3v1pua1 * Inv_LW; - pParam->BSIM3v1ub = model->BSIM3v1ub - + model->BSIM3v1lub * Inv_L - + model->BSIM3v1wub * Inv_W - + model->BSIM3v1pub * Inv_LW; - pParam->BSIM3v1ub1 = model->BSIM3v1ub1 - + model->BSIM3v1lub1 * Inv_L - + model->BSIM3v1wub1 * Inv_W - + model->BSIM3v1pub1 * Inv_LW; - pParam->BSIM3v1uc = model->BSIM3v1uc - + model->BSIM3v1luc * Inv_L - + model->BSIM3v1wuc * Inv_W - + model->BSIM3v1puc * Inv_LW; - pParam->BSIM3v1uc1 = model->BSIM3v1uc1 - + model->BSIM3v1luc1 * Inv_L - + model->BSIM3v1wuc1 * Inv_W - + model->BSIM3v1puc1 * Inv_LW; - pParam->BSIM3v1u0 = model->BSIM3v1u0 - + model->BSIM3v1lu0 * Inv_L - + model->BSIM3v1wu0 * Inv_W - + model->BSIM3v1pu0 * Inv_LW; - pParam->BSIM3v1ute = model->BSIM3v1ute - + model->BSIM3v1lute * Inv_L - + model->BSIM3v1wute * Inv_W - + model->BSIM3v1pute * Inv_LW; - pParam->BSIM3v1voff = model->BSIM3v1voff - + model->BSIM3v1lvoff * Inv_L - + model->BSIM3v1wvoff * Inv_W - + model->BSIM3v1pvoff * Inv_LW; - pParam->BSIM3v1delta = model->BSIM3v1delta - + model->BSIM3v1ldelta * Inv_L - + model->BSIM3v1wdelta * Inv_W - + model->BSIM3v1pdelta * Inv_LW; - pParam->BSIM3v1rdsw = model->BSIM3v1rdsw - + model->BSIM3v1lrdsw * Inv_L - + model->BSIM3v1wrdsw * Inv_W - + model->BSIM3v1prdsw * Inv_LW; - pParam->BSIM3v1prwg = model->BSIM3v1prwg - + model->BSIM3v1lprwg * Inv_L - + model->BSIM3v1wprwg * Inv_W - + model->BSIM3v1pprwg * Inv_LW; - pParam->BSIM3v1prwb = model->BSIM3v1prwb - + model->BSIM3v1lprwb * Inv_L - + model->BSIM3v1wprwb * Inv_W - + model->BSIM3v1pprwb * Inv_LW; - pParam->BSIM3v1prt = model->BSIM3v1prt - + model->BSIM3v1lprt * Inv_L - + model->BSIM3v1wprt * Inv_W - + model->BSIM3v1pprt * Inv_LW; - pParam->BSIM3v1eta0 = model->BSIM3v1eta0 - + model->BSIM3v1leta0 * Inv_L - + model->BSIM3v1weta0 * Inv_W - + model->BSIM3v1peta0 * Inv_LW; - pParam->BSIM3v1etab = model->BSIM3v1etab - + model->BSIM3v1letab * Inv_L - + model->BSIM3v1wetab * Inv_W - + model->BSIM3v1petab * Inv_LW; - pParam->BSIM3v1pclm = model->BSIM3v1pclm - + model->BSIM3v1lpclm * Inv_L - + model->BSIM3v1wpclm * Inv_W - + model->BSIM3v1ppclm * Inv_LW; - pParam->BSIM3v1pdibl1 = model->BSIM3v1pdibl1 - + model->BSIM3v1lpdibl1 * Inv_L - + model->BSIM3v1wpdibl1 * Inv_W - + model->BSIM3v1ppdibl1 * Inv_LW; - pParam->BSIM3v1pdibl2 = model->BSIM3v1pdibl2 - + model->BSIM3v1lpdibl2 * Inv_L - + model->BSIM3v1wpdibl2 * Inv_W - + model->BSIM3v1ppdibl2 * Inv_LW; - pParam->BSIM3v1pdiblb = model->BSIM3v1pdiblb - + model->BSIM3v1lpdiblb * Inv_L - + model->BSIM3v1wpdiblb * Inv_W - + model->BSIM3v1ppdiblb * Inv_LW; - pParam->BSIM3v1pscbe1 = model->BSIM3v1pscbe1 - + model->BSIM3v1lpscbe1 * Inv_L - + model->BSIM3v1wpscbe1 * Inv_W - + model->BSIM3v1ppscbe1 * Inv_LW; - pParam->BSIM3v1pscbe2 = model->BSIM3v1pscbe2 - + model->BSIM3v1lpscbe2 * Inv_L - + model->BSIM3v1wpscbe2 * Inv_W - + model->BSIM3v1ppscbe2 * Inv_LW; - pParam->BSIM3v1pvag = model->BSIM3v1pvag - + model->BSIM3v1lpvag * Inv_L - + model->BSIM3v1wpvag * Inv_W - + model->BSIM3v1ppvag * Inv_LW; - pParam->BSIM3v1wr = model->BSIM3v1wr - + model->BSIM3v1lwr * Inv_L - + model->BSIM3v1wwr * Inv_W - + model->BSIM3v1pwr * Inv_LW; - pParam->BSIM3v1dwg = model->BSIM3v1dwg - + model->BSIM3v1ldwg * Inv_L - + model->BSIM3v1wdwg * Inv_W - + model->BSIM3v1pdwg * Inv_LW; - pParam->BSIM3v1dwb = model->BSIM3v1dwb - + model->BSIM3v1ldwb * Inv_L - + model->BSIM3v1wdwb * Inv_W - + model->BSIM3v1pdwb * Inv_LW; - pParam->BSIM3v1b0 = model->BSIM3v1b0 - + model->BSIM3v1lb0 * Inv_L - + model->BSIM3v1wb0 * Inv_W - + model->BSIM3v1pb0 * Inv_LW; - pParam->BSIM3v1b1 = model->BSIM3v1b1 - + model->BSIM3v1lb1 * Inv_L - + model->BSIM3v1wb1 * Inv_W - + model->BSIM3v1pb1 * Inv_LW; - pParam->BSIM3v1alpha0 = model->BSIM3v1alpha0 - + model->BSIM3v1lalpha0 * Inv_L - + model->BSIM3v1walpha0 * Inv_W - + model->BSIM3v1palpha0 * Inv_LW; - pParam->BSIM3v1beta0 = model->BSIM3v1beta0 - + model->BSIM3v1lbeta0 * Inv_L - + model->BSIM3v1wbeta0 * Inv_W - + model->BSIM3v1pbeta0 * Inv_LW; - /* CV model */ - pParam->BSIM3v1elm = model->BSIM3v1elm - + model->BSIM3v1lelm * Inv_L - + model->BSIM3v1welm * Inv_W - + model->BSIM3v1pelm * Inv_LW; - pParam->BSIM3v1cgsl = model->BSIM3v1cgsl - + model->BSIM3v1lcgsl * Inv_L - + model->BSIM3v1wcgsl * Inv_W - + model->BSIM3v1pcgsl * Inv_LW; - pParam->BSIM3v1cgdl = model->BSIM3v1cgdl - + model->BSIM3v1lcgdl * Inv_L - + model->BSIM3v1wcgdl * Inv_W - + model->BSIM3v1pcgdl * Inv_LW; - pParam->BSIM3v1ckappa = model->BSIM3v1ckappa - + model->BSIM3v1lckappa * Inv_L - + model->BSIM3v1wckappa * Inv_W - + model->BSIM3v1pckappa * Inv_LW; - pParam->BSIM3v1cf = model->BSIM3v1cf - + model->BSIM3v1lcf * Inv_L - + model->BSIM3v1wcf * Inv_W - + model->BSIM3v1pcf * Inv_LW; - pParam->BSIM3v1clc = model->BSIM3v1clc - + model->BSIM3v1lclc * Inv_L - + model->BSIM3v1wclc * Inv_W - + model->BSIM3v1pclc * Inv_LW; - pParam->BSIM3v1cle = model->BSIM3v1cle - + model->BSIM3v1lcle * Inv_L - + model->BSIM3v1wcle * Inv_W - + model->BSIM3v1pcle * Inv_LW; - pParam->BSIM3v1vfbcv = model->BSIM3v1vfbcv - + model->BSIM3v1lvfbcv * Inv_L - + model->BSIM3v1wvfbcv * Inv_W - + model->BSIM3v1pvfbcv * Inv_LW; - pParam->BSIM3v1abulkCVfactor = 1.0 + pow((pParam->BSIM3v1clc - / pParam->BSIM3v1leff), - pParam->BSIM3v1cle); - - T0 = (TRatio - 1.0); - pParam->BSIM3v1ua = pParam->BSIM3v1ua + pParam->BSIM3v1ua1 * T0; - pParam->BSIM3v1ub = pParam->BSIM3v1ub + pParam->BSIM3v1ub1 * T0; - pParam->BSIM3v1uc = pParam->BSIM3v1uc + pParam->BSIM3v1uc1 * T0; - if (pParam->BSIM3v1u0 > 1.0) - pParam->BSIM3v1u0 = pParam->BSIM3v1u0 / 1.0e4; - - pParam->BSIM3v1u0temp = pParam->BSIM3v1u0 - * pow(TRatio, pParam->BSIM3v1ute); - pParam->BSIM3v1vsattemp = pParam->BSIM3v1vsat - pParam->BSIM3v1at - * T0; - pParam->BSIM3v1rds0 = (pParam->BSIM3v1rdsw + pParam->BSIM3v1prt * T0) - / pow(pParam->BSIM3v1weff * 1E6, pParam->BSIM3v1wr); - - if (BSIM3v1checkModel(model, here, ckt)) - { - SPfrontEnd->IFerrorf (ERR_FATAL, "Fatal error(s) detected during BSIM3V3.1 parameter checking for %s in model %s", model->BSIM3v1modName, here->BSIM3v1name); - return(E_BADPARM); - } - - pParam->BSIM3v1cgdo = (model->BSIM3v1cgdo + pParam->BSIM3v1cf) - * pParam->BSIM3v1weffCV; - pParam->BSIM3v1cgso = (model->BSIM3v1cgso + pParam->BSIM3v1cf) - * pParam->BSIM3v1weffCV; - pParam->BSIM3v1cgbo = model->BSIM3v1cgbo * pParam->BSIM3v1leffCV; - - if (!model->BSIM3v1npeakGiven && model->BSIM3v1gamma1Given) - { T0 = pParam->BSIM3v1gamma1 * model->BSIM3v1cox; - pParam->BSIM3v1npeak = 3.021E22 * T0 * T0; - } - - pParam->BSIM3v1phi = 2.0 * Vtm0 - * log(pParam->BSIM3v1npeak / ni); - - pParam->BSIM3v1sqrtPhi = sqrt(pParam->BSIM3v1phi); - pParam->BSIM3v1phis3 = pParam->BSIM3v1sqrtPhi * pParam->BSIM3v1phi; - - pParam->BSIM3v1Xdep0 = sqrt(2.0 * EPSSI / (Charge_q - * pParam->BSIM3v1npeak * 1.0e6)) - * pParam->BSIM3v1sqrtPhi; - pParam->BSIM3v1sqrtXdep0 = sqrt(pParam->BSIM3v1Xdep0); - pParam->BSIM3v1litl = sqrt(3.0 * pParam->BSIM3v1xj - * model->BSIM3v1tox); - pParam->BSIM3v1vbi = Vtm0 * log(1.0e20 - * pParam->BSIM3v1npeak / (ni * ni)); - pParam->BSIM3v1cdep0 = sqrt(Charge_q * EPSSI - * pParam->BSIM3v1npeak * 1.0e6 / 2.0 - / pParam->BSIM3v1phi); - - if (model->BSIM3v1k1Given || model->BSIM3v1k2Given) - { if (!model->BSIM3v1k1Given) - { fprintf(stdout, "Warning: k1 should be specified with k2.\n"); - pParam->BSIM3v1k1 = 0.53; - } - if (!model->BSIM3v1k2Given) - { fprintf(stdout, "Warning: k2 should be specified with k1.\n"); - pParam->BSIM3v1k2 = -0.0186; - } - if (model->BSIM3v1nsubGiven) - fprintf(stdout, "Warning: nsub is ignored because k1 or k2 is given.\n"); - if (model->BSIM3v1xtGiven) - fprintf(stdout, "Warning: xt is ignored because k1 or k2 is given.\n"); - if (model->BSIM3v1vbxGiven) - fprintf(stdout, "Warning: vbx is ignored because k1 or k2 is given.\n"); - if (model->BSIM3v1vbmGiven) - fprintf(stdout, "Warning: vbm is ignored because k1 or k2 is given.\n"); - if (model->BSIM3v1gamma1Given) - fprintf(stdout, "Warning: gamma1 is ignored because k1 or k2 is given.\n"); - if (model->BSIM3v1gamma2Given) - fprintf(stdout, "Warning: gamma2 is ignored because k1 or k2 is given.\n"); - } - else - { if (!model->BSIM3v1vbxGiven) - pParam->BSIM3v1vbx = pParam->BSIM3v1phi - 7.7348e-4 - * pParam->BSIM3v1npeak - * pParam->BSIM3v1xt * pParam->BSIM3v1xt; - if (pParam->BSIM3v1vbx > 0.0) - pParam->BSIM3v1vbx = -pParam->BSIM3v1vbx; - if (pParam->BSIM3v1vbm > 0.0) - pParam->BSIM3v1vbm = -pParam->BSIM3v1vbm; - - if (!model->BSIM3v1gamma1Given) - pParam->BSIM3v1gamma1 = 5.753e-12 - * sqrt(pParam->BSIM3v1npeak) - / model->BSIM3v1cox; - if (!model->BSIM3v1gamma2Given) - pParam->BSIM3v1gamma2 = 5.753e-12 - * sqrt(pParam->BSIM3v1nsub) - / model->BSIM3v1cox; - - T0 = pParam->BSIM3v1gamma1 - pParam->BSIM3v1gamma2; - T1 = sqrt(pParam->BSIM3v1phi - pParam->BSIM3v1vbx) - - pParam->BSIM3v1sqrtPhi; - T2 = sqrt(pParam->BSIM3v1phi * (pParam->BSIM3v1phi - - pParam->BSIM3v1vbm)) - pParam->BSIM3v1phi; - pParam->BSIM3v1k2 = T0 * T1 / (2.0 * T2 + pParam->BSIM3v1vbm); - pParam->BSIM3v1k1 = pParam->BSIM3v1gamma2 - 2.0 - * pParam->BSIM3v1k2 * sqrt(pParam->BSIM3v1phi - - pParam->BSIM3v1vbm); - } - - if (pParam->BSIM3v1k2 < 0.0) - { T0 = 0.5 * pParam->BSIM3v1k1 / pParam->BSIM3v1k2; - pParam->BSIM3v1vbsc = 0.9 * (pParam->BSIM3v1phi - T0 * T0); - if (pParam->BSIM3v1vbsc > -3.0) - pParam->BSIM3v1vbsc = -3.0; - else if (pParam->BSIM3v1vbsc < -30.0) - pParam->BSIM3v1vbsc = -30.0; - } - else - { pParam->BSIM3v1vbsc = -30.0; - } - if (pParam->BSIM3v1vbsc > pParam->BSIM3v1vbm) - pParam->BSIM3v1vbsc = pParam->BSIM3v1vbm; - - if (model->BSIM3v1vth0Given) - { pParam->BSIM3v1vfb = model->BSIM3v1type * pParam->BSIM3v1vth0 - - pParam->BSIM3v1phi - pParam->BSIM3v1k1 - * pParam->BSIM3v1sqrtPhi; - } - else - { pParam->BSIM3v1vfb = -1.0; - pParam->BSIM3v1vth0 = model->BSIM3v1type * (pParam->BSIM3v1vfb - + pParam->BSIM3v1phi + pParam->BSIM3v1k1 - * pParam->BSIM3v1sqrtPhi); - } - T1 = sqrt(EPSSI / EPSOX * model->BSIM3v1tox - * pParam->BSIM3v1Xdep0); - T0 = exp(-0.5 * pParam->BSIM3v1dsub * pParam->BSIM3v1leff / T1); - pParam->BSIM3v1theta0vb0 = (T0 + 2.0 * T0 * T0); - - T0 = exp(-0.5 * pParam->BSIM3v1drout * pParam->BSIM3v1leff / T1); - T2 = (T0 + 2.0 * T0 * T0); - pParam->BSIM3v1thetaRout = pParam->BSIM3v1pdibl1 * T2 - + pParam->BSIM3v1pdibl2; - } - - /* process source/drain series resistance */ - here->BSIM3v1drainConductance = model->BSIM3v1sheetResistance - * here->BSIM3v1drainSquares; - if (here->BSIM3v1drainConductance > 0.0) - here->BSIM3v1drainConductance = 1.0 - / here->BSIM3v1drainConductance; - else - here->BSIM3v1drainConductance = 0.0; - - here->BSIM3v1sourceConductance = model->BSIM3v1sheetResistance - * here->BSIM3v1sourceSquares; - if (here->BSIM3v1sourceConductance > 0.0) - here->BSIM3v1sourceConductance = 1.0 - / here->BSIM3v1sourceConductance; - else - here->BSIM3v1sourceConductance = 0.0; - here->BSIM3v1cgso = pParam->BSIM3v1cgso; - here->BSIM3v1cgdo = pParam->BSIM3v1cgdo; - } - } - return(OK); -} - diff --git a/src/spicelib/devices/bsim3v1/b3v1trunc.c b/src/spicelib/devices/bsim3v1/b3v1trunc.c deleted file mode 100644 index 80cae9be5..000000000 --- a/src/spicelib/devices/bsim3v1/b3v1trunc.c +++ /dev/null @@ -1,49 +0,0 @@ -/********** - * Copyright 1990 Regents of the University of California. All rights reserved. - * File: b3v1ld.c - * Author: 1995 Min-Chie Jeng and Mansun Chan. - * Modified by Paolo Nenzi 2002 - **********/ - -/* - * Release Notes: - * BSIM3v3.1, Released by yuhua 96/12/08 - */ - -#include "ngspice/ngspice.h" -#include "ngspice/cktdefs.h" -#include "bsim3v1def.h" -#include "ngspice/sperror.h" -#include "ngspice/suffix.h" - - -int -BSIM3v1trunc(GENmodel *inModel, CKTcircuit *ckt, double *timeStep) -{ -BSIM3v1model *model = (BSIM3v1model*)inModel; -BSIM3v1instance *here; - -#ifdef STEPDEBUG - double debugtemp; -#endif /* STEPDEBUG */ - - for (; model != NULL; model = BSIM3v1nextModel(model)) - { for (here = BSIM3v1instances(model); here != NULL; - here = BSIM3v1nextInstance(here)) - { -#ifdef STEPDEBUG - debugtemp = *timeStep; -#endif /* STEPDEBUG */ - CKTterr(here->BSIM3v1qb,ckt,timeStep); - CKTterr(here->BSIM3v1qg,ckt,timeStep); - CKTterr(here->BSIM3v1qd,ckt,timeStep); -#ifdef STEPDEBUG - if(debugtemp != *timeStep) - { printf("device %s reduces step from %g to %g\n", - here->BSIM3v1name,debugtemp,*timeStep); - } -#endif /* STEPDEBUG */ - } - } - return(OK); -} diff --git a/src/spicelib/devices/bsim3v1/bsim3v1def.h b/src/spicelib/devices/bsim3v1/bsim3v1def.h deleted file mode 100644 index be9f83846..000000000 --- a/src/spicelib/devices/bsim3v1/bsim3v1def.h +++ /dev/null @@ -1,1635 +0,0 @@ -/********** -Copyright 1990 Regents of the University of California. All rights reserved. -Author: 1995 Min-Chie Jeng and Mansun Chan. -Modified: 2002 Paolo Nenzi. -File: bsim3v1def.h -**********/ - -#ifndef BSIM3v1 -#define BSIM3v1 - -#include "ngspice/ifsim.h" -#include "ngspice/gendefs.h" -#include "ngspice/cktdefs.h" -#include "ngspice/complex.h" -#include "ngspice/noisedef.h" - -typedef struct sBSIM3v1instance -{ - - struct GENinstance gen; - -#define BSIM3v1modPtr(inst) ((struct sBSIM3v1model *)((inst)->gen.GENmodPtr)) -#define BSIM3v1nextInstance(inst) ((struct sBSIM3v1instance *)((inst)->gen.GENnextInstance)) -#define BSIM3v1name gen.GENname -#define BSIM3v1states gen.GENstate - - const int BSIM3v1dNode; - const int BSIM3v1gNode; - const int BSIM3v1sNode; - const int BSIM3v1bNode; - int BSIM3v1dNodePrime; - int BSIM3v1sNodePrime; - int BSIM3v1qNode; /* MCJ */ - - /* MCJ */ - double BSIM3v1ueff; - double BSIM3v1thetavth; - double BSIM3v1von; - double BSIM3v1vdsat; - double BSIM3v1cgdo; - double BSIM3v1cgso; - - double BSIM3v1l; - double BSIM3v1w; - double BSIM3v1m; - double BSIM3v1drainArea; - double BSIM3v1sourceArea; - double BSIM3v1drainSquares; - double BSIM3v1sourceSquares; - double BSIM3v1drainPerimeter; - double BSIM3v1sourcePerimeter; - double BSIM3v1sourceConductance; - double BSIM3v1drainConductance; - - double BSIM3v1icVBS; - double BSIM3v1icVDS; - double BSIM3v1icVGS; - int BSIM3v1off; - int BSIM3v1mode; - int BSIM3v1nqsMod; - - /* OP point */ - double BSIM3v1qinv; - double BSIM3v1cd; - double BSIM3v1cbs; - double BSIM3v1cbd; - double BSIM3v1csub; - double BSIM3v1gm; - double BSIM3v1gds; - double BSIM3v1gmbs; - double BSIM3v1gbd; - double BSIM3v1gbs; - - double BSIM3v1gbbs; - double BSIM3v1gbgs; - double BSIM3v1gbds; - - double BSIM3v1cggb; - double BSIM3v1cgdb; - double BSIM3v1cgsb; - double BSIM3v1cbgb; - double BSIM3v1cbdb; - double BSIM3v1cbsb; - double BSIM3v1cdgb; - double BSIM3v1cddb; - double BSIM3v1cdsb; - double BSIM3v1capbd; - double BSIM3v1capbs; - - double BSIM3v1cqgb; - double BSIM3v1cqdb; - double BSIM3v1cqsb; - double BSIM3v1cqbb; - - double BSIM3v1gtau; - double BSIM3v1gtg; - double BSIM3v1gtd; - double BSIM3v1gts; - double BSIM3v1gtb; - double BSIM3v1tconst; - - struct bsim3v1SizeDependParam *pParam; - - unsigned BSIM3v1lGiven :1; - unsigned BSIM3v1wGiven :1; - unsigned BSIM3v1mGiven :1; - unsigned BSIM3v1drainAreaGiven :1; - unsigned BSIM3v1sourceAreaGiven :1; - unsigned BSIM3v1drainSquaresGiven :1; - unsigned BSIM3v1sourceSquaresGiven :1; - unsigned BSIM3v1drainPerimeterGiven :1; - unsigned BSIM3v1sourcePerimeterGiven :1; - unsigned BSIM3v1dNodePrimeSet :1; - unsigned BSIM3v1sNodePrimeSet :1; - unsigned BSIM3v1icVBSGiven :1; - unsigned BSIM3v1icVDSGiven :1; - unsigned BSIM3v1icVGSGiven :1; - unsigned BSIM3v1nqsModGiven :1; - - double *BSIM3v1DdPtr; - double *BSIM3v1GgPtr; - double *BSIM3v1SsPtr; - double *BSIM3v1BbPtr; - double *BSIM3v1DPdpPtr; - double *BSIM3v1SPspPtr; - double *BSIM3v1DdpPtr; - double *BSIM3v1GbPtr; - double *BSIM3v1GdpPtr; - double *BSIM3v1GspPtr; - double *BSIM3v1SspPtr; - double *BSIM3v1BdpPtr; - double *BSIM3v1BspPtr; - double *BSIM3v1DPspPtr; - double *BSIM3v1DPdPtr; - double *BSIM3v1BgPtr; - double *BSIM3v1DPgPtr; - double *BSIM3v1SPgPtr; - double *BSIM3v1SPsPtr; - double *BSIM3v1DPbPtr; - double *BSIM3v1SPbPtr; - double *BSIM3v1SPdpPtr; - - double *BSIM3v1QqPtr; - double *BSIM3v1QdpPtr; - double *BSIM3v1QgPtr; - double *BSIM3v1QspPtr; - double *BSIM3v1QbPtr; - double *BSIM3v1DPqPtr; - double *BSIM3v1GqPtr; - double *BSIM3v1SPqPtr; - double *BSIM3v1BqPtr; - -#define BSIM3v1vbd BSIM3v1states+ 0 -#define BSIM3v1vbs BSIM3v1states+ 1 -#define BSIM3v1vgs BSIM3v1states+ 2 -#define BSIM3v1vds BSIM3v1states+ 3 - -#define BSIM3v1qb BSIM3v1states+ 4 -#define BSIM3v1cqb BSIM3v1states+ 5 -#define BSIM3v1qg BSIM3v1states+ 6 -#define BSIM3v1cqg BSIM3v1states+ 7 -#define BSIM3v1qd BSIM3v1states+ 8 -#define BSIM3v1cqd BSIM3v1states+ 9 - -#define BSIM3v1qbs BSIM3v1states+ 10 -#define BSIM3v1qbd BSIM3v1states+ 11 - -#define BSIM3v1qcheq BSIM3v1states+ 12 -#define BSIM3v1cqcheq BSIM3v1states+ 13 -#define BSIM3v1qcdump BSIM3v1states+ 14 -#define BSIM3v1cqcdump BSIM3v1states+ 15 - -#define BSIM3v1tau BSIM3v1states+ 16 -#define BSIM3v1qdef BSIM3v1states+ 17 - -#define BSIM3v1numStates 18 - - -/* indices to the array of BSIM3v1 NOISE SOURCES */ - -#define BSIM3v1RDNOIZ 0 -#define BSIM3v1RSNOIZ 1 -#define BSIM3v1IDNOIZ 2 -#define BSIM3v1FLNOIZ 3 -#define BSIM3v1TOTNOIZ 4 - -#define BSIM3v1NSRCS 5 /* the number of MOSFET(3) noise sources */ - -#ifndef NONOISE - double BSIM3v1nVar[NSTATVARS][BSIM3v1NSRCS]; -#else /* NONOISE */ - double **BSIM3v1nVar; -#endif /* NONOISE */ - -} BSIM3v1instance ; - -struct bsim3v1SizeDependParam -{ - double Width; - double Length; - - double BSIM3v1cdsc; - double BSIM3v1cdscb; - double BSIM3v1cdscd; - double BSIM3v1cit; - double BSIM3v1nfactor; - double BSIM3v1xj; - double BSIM3v1vsat; - double BSIM3v1at; - double BSIM3v1a0; - double BSIM3v1ags; - double BSIM3v1a1; - double BSIM3v1a2; - double BSIM3v1keta; - double BSIM3v1nsub; - double BSIM3v1npeak; - double BSIM3v1ngate; - double BSIM3v1gamma1; - double BSIM3v1gamma2; - double BSIM3v1vbx; - double BSIM3v1vbi; - double BSIM3v1vbm; - double BSIM3v1vbsc; - double BSIM3v1xt; - double BSIM3v1phi; - double BSIM3v1litl; - double BSIM3v1k1; - double BSIM3v1kt1; - double BSIM3v1kt1l; - double BSIM3v1kt2; - double BSIM3v1k2; - double BSIM3v1k3; - double BSIM3v1k3b; - double BSIM3v1w0; - double BSIM3v1nlx; - double BSIM3v1dvt0; - double BSIM3v1dvt1; - double BSIM3v1dvt2; - double BSIM3v1dvt0w; - double BSIM3v1dvt1w; - double BSIM3v1dvt2w; - double BSIM3v1drout; - double BSIM3v1dsub; - double BSIM3v1vth0; - double BSIM3v1ua; - double BSIM3v1ua1; - double BSIM3v1ub; - double BSIM3v1ub1; - double BSIM3v1uc; - double BSIM3v1uc1; - double BSIM3v1u0; - double BSIM3v1ute; - double BSIM3v1voff; - double BSIM3v1vfb; - double BSIM3v1delta; - double BSIM3v1rdsw; - double BSIM3v1rds0; - double BSIM3v1prwg; - double BSIM3v1prwb; - double BSIM3v1prt; - double BSIM3v1eta0; - double BSIM3v1etab; - double BSIM3v1pclm; - double BSIM3v1pdibl1; - double BSIM3v1pdibl2; - double BSIM3v1pdiblb; - double BSIM3v1pscbe1; - double BSIM3v1pscbe2; - double BSIM3v1pvag; - double BSIM3v1wr; - double BSIM3v1dwg; - double BSIM3v1dwb; - double BSIM3v1b0; - double BSIM3v1b1; - double BSIM3v1alpha0; - double BSIM3v1beta0; - - - /* CV model */ - double BSIM3v1elm; - double BSIM3v1cgsl; - double BSIM3v1cgdl; - double BSIM3v1ckappa; - double BSIM3v1cf; - double BSIM3v1clc; - double BSIM3v1cle; - double BSIM3v1vfbcv; - - -/* Pre-calculated constants */ - - double BSIM3v1dw; - double BSIM3v1dl; - double BSIM3v1leff; - double BSIM3v1weff; - - double BSIM3v1dwc; - double BSIM3v1dlc; - double BSIM3v1leffCV; - double BSIM3v1weffCV; - double BSIM3v1abulkCVfactor; - double BSIM3v1cgso; - double BSIM3v1cgdo; - double BSIM3v1cgbo; - - double BSIM3v1u0temp; - double BSIM3v1vsattemp; - double BSIM3v1sqrtPhi; - double BSIM3v1phis3; - double BSIM3v1Xdep0; - double BSIM3v1sqrtXdep0; - double BSIM3v1theta0vb0; - double BSIM3v1thetaRout; - - double BSIM3v1cof1; - double BSIM3v1cof2; - double BSIM3v1cof3; - double BSIM3v1cof4; - double BSIM3v1cdep0; - struct bsim3v1SizeDependParam *pNext; -}; - - -typedef struct sBSIM3v1model -{ - - struct GENmodel gen; - -#define BSIM3v1modType gen.GENmodType -#define BSIM3v1nextModel(inst) ((struct sBSIM3v1model *)((inst)->gen.GENnextModel)) -#define BSIM3v1instances(inst) ((BSIM3v1instance *)((inst)->gen.GENinstances)) -#define BSIM3v1modName gen.GENmodName - - int BSIM3v1type; - - int BSIM3v1mobMod; - int BSIM3v1capMod; - int BSIM3v1nqsMod; - int BSIM3v1noiMod; - int BSIM3v1binUnit; - int BSIM3v1paramChk; - double BSIM3v1version; - double BSIM3v1tox; - double BSIM3v1cdsc; - double BSIM3v1cdscb; - double BSIM3v1cdscd; - double BSIM3v1cit; - double BSIM3v1nfactor; - double BSIM3v1xj; - double BSIM3v1vsat; - double BSIM3v1at; - double BSIM3v1a0; - double BSIM3v1ags; - double BSIM3v1a1; - double BSIM3v1a2; - double BSIM3v1keta; - double BSIM3v1nsub; - double BSIM3v1npeak; - double BSIM3v1ngate; - double BSIM3v1gamma1; - double BSIM3v1gamma2; - double BSIM3v1vbx; - double BSIM3v1vbm; - double BSIM3v1xt; - double BSIM3v1k1; - double BSIM3v1kt1; - double BSIM3v1kt1l; - double BSIM3v1kt2; - double BSIM3v1k2; - double BSIM3v1k3; - double BSIM3v1k3b; - double BSIM3v1w0; - double BSIM3v1nlx; - double BSIM3v1dvt0; - double BSIM3v1dvt1; - double BSIM3v1dvt2; - double BSIM3v1dvt0w; - double BSIM3v1dvt1w; - double BSIM3v1dvt2w; - double BSIM3v1drout; - double BSIM3v1dsub; - double BSIM3v1vth0; - double BSIM3v1ua; - double BSIM3v1ua1; - double BSIM3v1ub; - double BSIM3v1ub1; - double BSIM3v1uc; - double BSIM3v1uc1; - double BSIM3v1u0; - double BSIM3v1ute; - double BSIM3v1voff; - double BSIM3v1delta; - double BSIM3v1rdsw; - double BSIM3v1prwg; - double BSIM3v1prwb; - double BSIM3v1prt; - double BSIM3v1eta0; - double BSIM3v1etab; - double BSIM3v1pclm; - double BSIM3v1pdibl1; - double BSIM3v1pdibl2; - double BSIM3v1pdiblb; - double BSIM3v1pscbe1; - double BSIM3v1pscbe2; - double BSIM3v1pvag; - double BSIM3v1wr; - double BSIM3v1dwg; - double BSIM3v1dwb; - double BSIM3v1b0; - double BSIM3v1b1; - double BSIM3v1alpha0; - double BSIM3v1beta0; -/* serban */ - double BSIM3v1hdif; - - /* CV model */ - double BSIM3v1elm; - double BSIM3v1cgsl; - double BSIM3v1cgdl; - double BSIM3v1ckappa; - double BSIM3v1cf; - double BSIM3v1vfbcv; - double BSIM3v1clc; - double BSIM3v1cle; - double BSIM3v1dwc; - double BSIM3v1dlc; - - /* Length Dependence */ - double BSIM3v1lcdsc; - double BSIM3v1lcdscb; - double BSIM3v1lcdscd; - double BSIM3v1lcit; - double BSIM3v1lnfactor; - double BSIM3v1lxj; - double BSIM3v1lvsat; - double BSIM3v1lat; - double BSIM3v1la0; - double BSIM3v1lags; - double BSIM3v1la1; - double BSIM3v1la2; - double BSIM3v1lketa; - double BSIM3v1lnsub; - double BSIM3v1lnpeak; - double BSIM3v1lngate; - double BSIM3v1lgamma1; - double BSIM3v1lgamma2; - double BSIM3v1lvbx; - double BSIM3v1lvbm; - double BSIM3v1lxt; - double BSIM3v1lk1; - double BSIM3v1lkt1; - double BSIM3v1lkt1l; - double BSIM3v1lkt2; - double BSIM3v1lk2; - double BSIM3v1lk3; - double BSIM3v1lk3b; - double BSIM3v1lw0; - double BSIM3v1lnlx; - double BSIM3v1ldvt0; - double BSIM3v1ldvt1; - double BSIM3v1ldvt2; - double BSIM3v1ldvt0w; - double BSIM3v1ldvt1w; - double BSIM3v1ldvt2w; - double BSIM3v1ldrout; - double BSIM3v1ldsub; - double BSIM3v1lvth0; - double BSIM3v1lua; - double BSIM3v1lua1; - double BSIM3v1lub; - double BSIM3v1lub1; - double BSIM3v1luc; - double BSIM3v1luc1; - double BSIM3v1lu0; - double BSIM3v1lute; - double BSIM3v1lvoff; - double BSIM3v1ldelta; - double BSIM3v1lrdsw; - double BSIM3v1lprwg; - double BSIM3v1lprwb; - double BSIM3v1lprt; - double BSIM3v1leta0; - double BSIM3v1letab; - double BSIM3v1lpclm; - double BSIM3v1lpdibl1; - double BSIM3v1lpdibl2; - double BSIM3v1lpdiblb; - double BSIM3v1lpscbe1; - double BSIM3v1lpscbe2; - double BSIM3v1lpvag; - double BSIM3v1lwr; - double BSIM3v1ldwg; - double BSIM3v1ldwb; - double BSIM3v1lb0; - double BSIM3v1lb1; - double BSIM3v1lalpha0; - double BSIM3v1lbeta0; - - /* CV model */ - double BSIM3v1lelm; - double BSIM3v1lcgsl; - double BSIM3v1lcgdl; - double BSIM3v1lckappa; - double BSIM3v1lcf; - double BSIM3v1lclc; - double BSIM3v1lcle; - double BSIM3v1lvfbcv; - - /* Width Dependence */ - double BSIM3v1wcdsc; - double BSIM3v1wcdscb; - double BSIM3v1wcdscd; - double BSIM3v1wcit; - double BSIM3v1wnfactor; - double BSIM3v1wxj; - double BSIM3v1wvsat; - double BSIM3v1wat; - double BSIM3v1wa0; - double BSIM3v1wags; - double BSIM3v1wa1; - double BSIM3v1wa2; - double BSIM3v1wketa; - double BSIM3v1wnsub; - double BSIM3v1wnpeak; - double BSIM3v1wngate; - double BSIM3v1wgamma1; - double BSIM3v1wgamma2; - double BSIM3v1wvbx; - double BSIM3v1wvbm; - double BSIM3v1wxt; - double BSIM3v1wk1; - double BSIM3v1wkt1; - double BSIM3v1wkt1l; - double BSIM3v1wkt2; - double BSIM3v1wk2; - double BSIM3v1wk3; - double BSIM3v1wk3b; - double BSIM3v1ww0; - double BSIM3v1wnlx; - double BSIM3v1wdvt0; - double BSIM3v1wdvt1; - double BSIM3v1wdvt2; - double BSIM3v1wdvt0w; - double BSIM3v1wdvt1w; - double BSIM3v1wdvt2w; - double BSIM3v1wdrout; - double BSIM3v1wdsub; - double BSIM3v1wvth0; - double BSIM3v1wua; - double BSIM3v1wua1; - double BSIM3v1wub; - double BSIM3v1wub1; - double BSIM3v1wuc; - double BSIM3v1wuc1; - double BSIM3v1wu0; - double BSIM3v1wute; - double BSIM3v1wvoff; - double BSIM3v1wdelta; - double BSIM3v1wrdsw; - double BSIM3v1wprwg; - double BSIM3v1wprwb; - double BSIM3v1wprt; - double BSIM3v1weta0; - double BSIM3v1wetab; - double BSIM3v1wpclm; - double BSIM3v1wpdibl1; - double BSIM3v1wpdibl2; - double BSIM3v1wpdiblb; - double BSIM3v1wpscbe1; - double BSIM3v1wpscbe2; - double BSIM3v1wpvag; - double BSIM3v1wwr; - double BSIM3v1wdwg; - double BSIM3v1wdwb; - double BSIM3v1wb0; - double BSIM3v1wb1; - double BSIM3v1walpha0; - double BSIM3v1wbeta0; - - /* CV model */ - double BSIM3v1welm; - double BSIM3v1wcgsl; - double BSIM3v1wcgdl; - double BSIM3v1wckappa; - double BSIM3v1wcf; - double BSIM3v1wclc; - double BSIM3v1wcle; - double BSIM3v1wvfbcv; - - /* Cross-term Dependence */ - double BSIM3v1pcdsc; - double BSIM3v1pcdscb; - double BSIM3v1pcdscd; - double BSIM3v1pcit; - double BSIM3v1pnfactor; - double BSIM3v1pxj; - double BSIM3v1pvsat; - double BSIM3v1pat; - double BSIM3v1pa0; - double BSIM3v1pags; - double BSIM3v1pa1; - double BSIM3v1pa2; - double BSIM3v1pketa; - double BSIM3v1pnsub; - double BSIM3v1pnpeak; - double BSIM3v1pngate; - double BSIM3v1pgamma1; - double BSIM3v1pgamma2; - double BSIM3v1pvbx; - double BSIM3v1pvbm; - double BSIM3v1pxt; - double BSIM3v1pk1; - double BSIM3v1pkt1; - double BSIM3v1pkt1l; - double BSIM3v1pkt2; - double BSIM3v1pk2; - double BSIM3v1pk3; - double BSIM3v1pk3b; - double BSIM3v1pw0; - double BSIM3v1pnlx; - double BSIM3v1pdvt0; - double BSIM3v1pdvt1; - double BSIM3v1pdvt2; - double BSIM3v1pdvt0w; - double BSIM3v1pdvt1w; - double BSIM3v1pdvt2w; - double BSIM3v1pdrout; - double BSIM3v1pdsub; - double BSIM3v1pvth0; - double BSIM3v1pua; - double BSIM3v1pua1; - double BSIM3v1pub; - double BSIM3v1pub1; - double BSIM3v1puc; - double BSIM3v1puc1; - double BSIM3v1pu0; - double BSIM3v1pute; - double BSIM3v1pvoff; - double BSIM3v1pdelta; - double BSIM3v1prdsw; - double BSIM3v1pprwg; - double BSIM3v1pprwb; - double BSIM3v1pprt; - double BSIM3v1peta0; - double BSIM3v1petab; - double BSIM3v1ppclm; - double BSIM3v1ppdibl1; - double BSIM3v1ppdibl2; - double BSIM3v1ppdiblb; - double BSIM3v1ppscbe1; - double BSIM3v1ppscbe2; - double BSIM3v1ppvag; - double BSIM3v1pwr; - double BSIM3v1pdwg; - double BSIM3v1pdwb; - double BSIM3v1pb0; - double BSIM3v1pb1; - double BSIM3v1palpha0; - double BSIM3v1pbeta0; - - /* CV model */ - double BSIM3v1pelm; - double BSIM3v1pcgsl; - double BSIM3v1pcgdl; - double BSIM3v1pckappa; - double BSIM3v1pcf; - double BSIM3v1pclc; - double BSIM3v1pcle; - double BSIM3v1pvfbcv; - - double BSIM3v1tnom; - double BSIM3v1cgso; - double BSIM3v1cgdo; - double BSIM3v1cgbo; - double BSIM3v1xpart; - double BSIM3v1cFringOut; - double BSIM3v1cFringMax; - - double BSIM3v1sheetResistance; - double BSIM3v1jctSatCurDensity; - double BSIM3v1jctSidewallSatCurDensity; - double BSIM3v1bulkJctPotential; - double BSIM3v1bulkJctBotGradingCoeff; - double BSIM3v1bulkJctSideGradingCoeff; - double BSIM3v1bulkJctGateSideGradingCoeff; - double BSIM3v1sidewallJctPotential; - double BSIM3v1GatesidewallJctPotential; - double BSIM3v1unitAreaJctCap; - double BSIM3v1unitLengthSidewallJctCap; - double BSIM3v1unitLengthGateSidewallJctCap; - double BSIM3v1jctEmissionCoeff; - double BSIM3v1jctTempExponent; - - double BSIM3v1Lint; - double BSIM3v1Ll; - double BSIM3v1Lln; - double BSIM3v1Lw; - double BSIM3v1Lwn; - double BSIM3v1Lwl; - double BSIM3v1Lmin; - double BSIM3v1Lmax; - - double BSIM3v1Wint; - double BSIM3v1Wl; - double BSIM3v1Wln; - double BSIM3v1Ww; - double BSIM3v1Wwn; - double BSIM3v1Wwl; - double BSIM3v1Wmin; - double BSIM3v1Wmax; - - -/* Pre-calculated constants */ - /* MCJ: move to size-dependent param. */ - double BSIM3v1vtm; - double BSIM3v1cox; - double BSIM3v1cof1; - double BSIM3v1cof2; - double BSIM3v1cof3; - double BSIM3v1cof4; - double BSIM3v1vcrit; - double BSIM3v1factor1; - double BSIM3v1jctTempSatCurDensity; - double BSIM3v1jctSidewallTempSatCurDensity; - - double BSIM3v1oxideTrapDensityA; - double BSIM3v1oxideTrapDensityB; - double BSIM3v1oxideTrapDensityC; - double BSIM3v1em; - double BSIM3v1ef; - double BSIM3v1af; - double BSIM3v1kf; - - struct bsim3v1SizeDependParam *pSizeDependParamKnot; - - /* Flags */ - unsigned BSIM3v1mobModGiven :1; - unsigned BSIM3v1binUnitGiven :1; - unsigned BSIM3v1capModGiven :1; - unsigned BSIM3v1paramChkGiven :1; - unsigned BSIM3v1nqsModGiven :1; - unsigned BSIM3v1noiModGiven :1; - unsigned BSIM3v1typeGiven :1; - unsigned BSIM3v1toxGiven :1; - unsigned BSIM3v1versionGiven :1; - - unsigned BSIM3v1cdscGiven :1; - unsigned BSIM3v1cdscbGiven :1; - unsigned BSIM3v1cdscdGiven :1; - unsigned BSIM3v1citGiven :1; - unsigned BSIM3v1nfactorGiven :1; - unsigned BSIM3v1xjGiven :1; - unsigned BSIM3v1vsatGiven :1; - unsigned BSIM3v1atGiven :1; - unsigned BSIM3v1a0Given :1; - unsigned BSIM3v1agsGiven :1; - unsigned BSIM3v1a1Given :1; - unsigned BSIM3v1a2Given :1; - unsigned BSIM3v1ketaGiven :1; - unsigned BSIM3v1nsubGiven :1; - unsigned BSIM3v1npeakGiven :1; - unsigned BSIM3v1ngateGiven :1; - unsigned BSIM3v1gamma1Given :1; - unsigned BSIM3v1gamma2Given :1; - unsigned BSIM3v1vbxGiven :1; - unsigned BSIM3v1vbmGiven :1; - unsigned BSIM3v1xtGiven :1; - unsigned BSIM3v1k1Given :1; - unsigned BSIM3v1kt1Given :1; - unsigned BSIM3v1kt1lGiven :1; - unsigned BSIM3v1kt2Given :1; - unsigned BSIM3v1k2Given :1; - unsigned BSIM3v1k3Given :1; - unsigned BSIM3v1k3bGiven :1; - unsigned BSIM3v1w0Given :1; - unsigned BSIM3v1nlxGiven :1; - unsigned BSIM3v1dvt0Given :1; - unsigned BSIM3v1dvt1Given :1; - unsigned BSIM3v1dvt2Given :1; - unsigned BSIM3v1dvt0wGiven :1; - unsigned BSIM3v1dvt1wGiven :1; - unsigned BSIM3v1dvt2wGiven :1; - unsigned BSIM3v1droutGiven :1; - unsigned BSIM3v1dsubGiven :1; - unsigned BSIM3v1vth0Given :1; - unsigned BSIM3v1uaGiven :1; - unsigned BSIM3v1ua1Given :1; - unsigned BSIM3v1ubGiven :1; - unsigned BSIM3v1ub1Given :1; - unsigned BSIM3v1ucGiven :1; - unsigned BSIM3v1uc1Given :1; - unsigned BSIM3v1u0Given :1; - unsigned BSIM3v1uteGiven :1; - unsigned BSIM3v1voffGiven :1; - unsigned BSIM3v1rdswGiven :1; - unsigned BSIM3v1prwgGiven :1; - unsigned BSIM3v1prwbGiven :1; - unsigned BSIM3v1prtGiven :1; - unsigned BSIM3v1eta0Given :1; - unsigned BSIM3v1etabGiven :1; - unsigned BSIM3v1pclmGiven :1; - unsigned BSIM3v1pdibl1Given :1; - unsigned BSIM3v1pdibl2Given :1; - unsigned BSIM3v1pdiblbGiven :1; - unsigned BSIM3v1pscbe1Given :1; - unsigned BSIM3v1pscbe2Given :1; - unsigned BSIM3v1pvagGiven :1; - unsigned BSIM3v1deltaGiven :1; - unsigned BSIM3v1wrGiven :1; - unsigned BSIM3v1dwgGiven :1; - unsigned BSIM3v1dwbGiven :1; - unsigned BSIM3v1b0Given :1; - unsigned BSIM3v1b1Given :1; - unsigned BSIM3v1alpha0Given :1; - unsigned BSIM3v1beta0Given :1; - unsigned BSIM3v1hdifGiven :1; - - /* CV model */ - unsigned BSIM3v1elmGiven :1; - unsigned BSIM3v1cgslGiven :1; - unsigned BSIM3v1cgdlGiven :1; - unsigned BSIM3v1ckappaGiven :1; - unsigned BSIM3v1cfGiven :1; - unsigned BSIM3v1vfbcvGiven :1; - unsigned BSIM3v1clcGiven :1; - unsigned BSIM3v1cleGiven :1; - unsigned BSIM3v1dwcGiven :1; - unsigned BSIM3v1dlcGiven :1; - - - /* Length dependence */ - unsigned BSIM3v1lcdscGiven :1; - unsigned BSIM3v1lcdscbGiven :1; - unsigned BSIM3v1lcdscdGiven :1; - unsigned BSIM3v1lcitGiven :1; - unsigned BSIM3v1lnfactorGiven :1; - unsigned BSIM3v1lxjGiven :1; - unsigned BSIM3v1lvsatGiven :1; - unsigned BSIM3v1latGiven :1; - unsigned BSIM3v1la0Given :1; - unsigned BSIM3v1lagsGiven :1; - unsigned BSIM3v1la1Given :1; - unsigned BSIM3v1la2Given :1; - unsigned BSIM3v1lketaGiven :1; - unsigned BSIM3v1lnsubGiven :1; - unsigned BSIM3v1lnpeakGiven :1; - unsigned BSIM3v1lngateGiven :1; - unsigned BSIM3v1lgamma1Given :1; - unsigned BSIM3v1lgamma2Given :1; - unsigned BSIM3v1lvbxGiven :1; - unsigned BSIM3v1lvbmGiven :1; - unsigned BSIM3v1lxtGiven :1; - unsigned BSIM3v1lk1Given :1; - unsigned BSIM3v1lkt1Given :1; - unsigned BSIM3v1lkt1lGiven :1; - unsigned BSIM3v1lkt2Given :1; - unsigned BSIM3v1lk2Given :1; - unsigned BSIM3v1lk3Given :1; - unsigned BSIM3v1lk3bGiven :1; - unsigned BSIM3v1lw0Given :1; - unsigned BSIM3v1lnlxGiven :1; - unsigned BSIM3v1ldvt0Given :1; - unsigned BSIM3v1ldvt1Given :1; - unsigned BSIM3v1ldvt2Given :1; - unsigned BSIM3v1ldvt0wGiven :1; - unsigned BSIM3v1ldvt1wGiven :1; - unsigned BSIM3v1ldvt2wGiven :1; - unsigned BSIM3v1ldroutGiven :1; - unsigned BSIM3v1ldsubGiven :1; - unsigned BSIM3v1lvth0Given :1; - unsigned BSIM3v1luaGiven :1; - unsigned BSIM3v1lua1Given :1; - unsigned BSIM3v1lubGiven :1; - unsigned BSIM3v1lub1Given :1; - unsigned BSIM3v1lucGiven :1; - unsigned BSIM3v1luc1Given :1; - unsigned BSIM3v1lu0Given :1; - unsigned BSIM3v1luteGiven :1; - unsigned BSIM3v1lvoffGiven :1; - unsigned BSIM3v1lrdswGiven :1; - unsigned BSIM3v1lprwgGiven :1; - unsigned BSIM3v1lprwbGiven :1; - unsigned BSIM3v1lprtGiven :1; - unsigned BSIM3v1leta0Given :1; - unsigned BSIM3v1letabGiven :1; - unsigned BSIM3v1lpclmGiven :1; - unsigned BSIM3v1lpdibl1Given :1; - unsigned BSIM3v1lpdibl2Given :1; - unsigned BSIM3v1lpdiblbGiven :1; - unsigned BSIM3v1lpscbe1Given :1; - unsigned BSIM3v1lpscbe2Given :1; - unsigned BSIM3v1lpvagGiven :1; - unsigned BSIM3v1ldeltaGiven :1; - unsigned BSIM3v1lwrGiven :1; - unsigned BSIM3v1ldwgGiven :1; - unsigned BSIM3v1ldwbGiven :1; - unsigned BSIM3v1lb0Given :1; - unsigned BSIM3v1lb1Given :1; - unsigned BSIM3v1lalpha0Given :1; - unsigned BSIM3v1lbeta0Given :1; - - /* CV model */ - unsigned BSIM3v1lelmGiven :1; - unsigned BSIM3v1lcgslGiven :1; - unsigned BSIM3v1lcgdlGiven :1; - unsigned BSIM3v1lckappaGiven :1; - unsigned BSIM3v1lcfGiven :1; - unsigned BSIM3v1lclcGiven :1; - unsigned BSIM3v1lcleGiven :1; - unsigned BSIM3v1lvfbcvGiven :1; - - /* Width dependence */ - unsigned BSIM3v1wcdscGiven :1; - unsigned BSIM3v1wcdscbGiven :1; - unsigned BSIM3v1wcdscdGiven :1; - unsigned BSIM3v1wcitGiven :1; - unsigned BSIM3v1wnfactorGiven :1; - unsigned BSIM3v1wxjGiven :1; - unsigned BSIM3v1wvsatGiven :1; - unsigned BSIM3v1watGiven :1; - unsigned BSIM3v1wa0Given :1; - unsigned BSIM3v1wagsGiven :1; - unsigned BSIM3v1wa1Given :1; - unsigned BSIM3v1wa2Given :1; - unsigned BSIM3v1wketaGiven :1; - unsigned BSIM3v1wnsubGiven :1; - unsigned BSIM3v1wnpeakGiven :1; - unsigned BSIM3v1wngateGiven :1; - unsigned BSIM3v1wgamma1Given :1; - unsigned BSIM3v1wgamma2Given :1; - unsigned BSIM3v1wvbxGiven :1; - unsigned BSIM3v1wvbmGiven :1; - unsigned BSIM3v1wxtGiven :1; - unsigned BSIM3v1wk1Given :1; - unsigned BSIM3v1wkt1Given :1; - unsigned BSIM3v1wkt1lGiven :1; - unsigned BSIM3v1wkt2Given :1; - unsigned BSIM3v1wk2Given :1; - unsigned BSIM3v1wk3Given :1; - unsigned BSIM3v1wk3bGiven :1; - unsigned BSIM3v1ww0Given :1; - unsigned BSIM3v1wnlxGiven :1; - unsigned BSIM3v1wdvt0Given :1; - unsigned BSIM3v1wdvt1Given :1; - unsigned BSIM3v1wdvt2Given :1; - unsigned BSIM3v1wdvt0wGiven :1; - unsigned BSIM3v1wdvt1wGiven :1; - unsigned BSIM3v1wdvt2wGiven :1; - unsigned BSIM3v1wdroutGiven :1; - unsigned BSIM3v1wdsubGiven :1; - unsigned BSIM3v1wvth0Given :1; - unsigned BSIM3v1wuaGiven :1; - unsigned BSIM3v1wua1Given :1; - unsigned BSIM3v1wubGiven :1; - unsigned BSIM3v1wub1Given :1; - unsigned BSIM3v1wucGiven :1; - unsigned BSIM3v1wuc1Given :1; - unsigned BSIM3v1wu0Given :1; - unsigned BSIM3v1wuteGiven :1; - unsigned BSIM3v1wvoffGiven :1; - unsigned BSIM3v1wrdswGiven :1; - unsigned BSIM3v1wprwgGiven :1; - unsigned BSIM3v1wprwbGiven :1; - unsigned BSIM3v1wprtGiven :1; - unsigned BSIM3v1weta0Given :1; - unsigned BSIM3v1wetabGiven :1; - unsigned BSIM3v1wpclmGiven :1; - unsigned BSIM3v1wpdibl1Given :1; - unsigned BSIM3v1wpdibl2Given :1; - unsigned BSIM3v1wpdiblbGiven :1; - unsigned BSIM3v1wpscbe1Given :1; - unsigned BSIM3v1wpscbe2Given :1; - unsigned BSIM3v1wpvagGiven :1; - unsigned BSIM3v1wdeltaGiven :1; - unsigned BSIM3v1wwrGiven :1; - unsigned BSIM3v1wdwgGiven :1; - unsigned BSIM3v1wdwbGiven :1; - unsigned BSIM3v1wb0Given :1; - unsigned BSIM3v1wb1Given :1; - unsigned BSIM3v1walpha0Given :1; - unsigned BSIM3v1wbeta0Given :1; - - /* CV model */ - unsigned BSIM3v1welmGiven :1; - unsigned BSIM3v1wcgslGiven :1; - unsigned BSIM3v1wcgdlGiven :1; - unsigned BSIM3v1wckappaGiven :1; - unsigned BSIM3v1wcfGiven :1; - unsigned BSIM3v1wclcGiven :1; - unsigned BSIM3v1wcleGiven :1; - unsigned BSIM3v1wvfbcvGiven :1; - - /* Cross-term dependence */ - unsigned BSIM3v1pcdscGiven :1; - unsigned BSIM3v1pcdscbGiven :1; - unsigned BSIM3v1pcdscdGiven :1; - unsigned BSIM3v1pcitGiven :1; - unsigned BSIM3v1pnfactorGiven :1; - unsigned BSIM3v1pxjGiven :1; - unsigned BSIM3v1pvsatGiven :1; - unsigned BSIM3v1patGiven :1; - unsigned BSIM3v1pa0Given :1; - unsigned BSIM3v1pagsGiven :1; - unsigned BSIM3v1pa1Given :1; - unsigned BSIM3v1pa2Given :1; - unsigned BSIM3v1pketaGiven :1; - unsigned BSIM3v1pnsubGiven :1; - unsigned BSIM3v1pnpeakGiven :1; - unsigned BSIM3v1pngateGiven :1; - unsigned BSIM3v1pgamma1Given :1; - unsigned BSIM3v1pgamma2Given :1; - unsigned BSIM3v1pvbxGiven :1; - unsigned BSIM3v1pvbmGiven :1; - unsigned BSIM3v1pxtGiven :1; - unsigned BSIM3v1pk1Given :1; - unsigned BSIM3v1pkt1Given :1; - unsigned BSIM3v1pkt1lGiven :1; - unsigned BSIM3v1pkt2Given :1; - unsigned BSIM3v1pk2Given :1; - unsigned BSIM3v1pk3Given :1; - unsigned BSIM3v1pk3bGiven :1; - unsigned BSIM3v1pw0Given :1; - unsigned BSIM3v1pnlxGiven :1; - unsigned BSIM3v1pdvt0Given :1; - unsigned BSIM3v1pdvt1Given :1; - unsigned BSIM3v1pdvt2Given :1; - unsigned BSIM3v1pdvt0wGiven :1; - unsigned BSIM3v1pdvt1wGiven :1; - unsigned BSIM3v1pdvt2wGiven :1; - unsigned BSIM3v1pdroutGiven :1; - unsigned BSIM3v1pdsubGiven :1; - unsigned BSIM3v1pvth0Given :1; - unsigned BSIM3v1puaGiven :1; - unsigned BSIM3v1pua1Given :1; - unsigned BSIM3v1pubGiven :1; - unsigned BSIM3v1pub1Given :1; - unsigned BSIM3v1pucGiven :1; - unsigned BSIM3v1puc1Given :1; - unsigned BSIM3v1pu0Given :1; - unsigned BSIM3v1puteGiven :1; - unsigned BSIM3v1pvoffGiven :1; - unsigned BSIM3v1prdswGiven :1; - unsigned BSIM3v1pprwgGiven :1; - unsigned BSIM3v1pprwbGiven :1; - unsigned BSIM3v1pprtGiven :1; - unsigned BSIM3v1peta0Given :1; - unsigned BSIM3v1petabGiven :1; - unsigned BSIM3v1ppclmGiven :1; - unsigned BSIM3v1ppdibl1Given :1; - unsigned BSIM3v1ppdibl2Given :1; - unsigned BSIM3v1ppdiblbGiven :1; - unsigned BSIM3v1ppscbe1Given :1; - unsigned BSIM3v1ppscbe2Given :1; - unsigned BSIM3v1ppvagGiven :1; - unsigned BSIM3v1pdeltaGiven :1; - unsigned BSIM3v1pwrGiven :1; - unsigned BSIM3v1pdwgGiven :1; - unsigned BSIM3v1pdwbGiven :1; - unsigned BSIM3v1pb0Given :1; - unsigned BSIM3v1pb1Given :1; - unsigned BSIM3v1palpha0Given :1; - unsigned BSIM3v1pbeta0Given :1; - - /* CV model */ - unsigned BSIM3v1pelmGiven :1; - unsigned BSIM3v1pcgslGiven :1; - unsigned BSIM3v1pcgdlGiven :1; - unsigned BSIM3v1pckappaGiven :1; - unsigned BSIM3v1pcfGiven :1; - unsigned BSIM3v1pclcGiven :1; - unsigned BSIM3v1pcleGiven :1; - unsigned BSIM3v1pvfbcvGiven :1; - - unsigned BSIM3v1useFringeGiven :1; - - unsigned BSIM3v1tnomGiven :1; - unsigned BSIM3v1cgsoGiven :1; - unsigned BSIM3v1cgdoGiven :1; - unsigned BSIM3v1cgboGiven :1; - unsigned BSIM3v1xpartGiven :1; - unsigned BSIM3v1sheetResistanceGiven :1; - unsigned BSIM3v1jctSatCurDensityGiven :1; - unsigned BSIM3v1jctSidewallSatCurDensityGiven :1; - unsigned BSIM3v1bulkJctPotentialGiven :1; - unsigned BSIM3v1bulkJctBotGradingCoeffGiven :1; - unsigned BSIM3v1sidewallJctPotentialGiven :1; - unsigned BSIM3v1GatesidewallJctPotentialGiven :1; - unsigned BSIM3v1bulkJctSideGradingCoeffGiven :1; - unsigned BSIM3v1unitAreaJctCapGiven :1; - unsigned BSIM3v1unitLengthSidewallJctCapGiven :1; - unsigned BSIM3v1bulkJctGateSideGradingCoeffGiven :1; - unsigned BSIM3v1unitLengthGateSidewallJctCapGiven :1; - unsigned BSIM3v1jctEmissionCoeffGiven :1; - unsigned BSIM3v1jctTempExponentGiven :1; - - unsigned BSIM3v1oxideTrapDensityAGiven :1; - unsigned BSIM3v1oxideTrapDensityBGiven :1; - unsigned BSIM3v1oxideTrapDensityCGiven :1; - unsigned BSIM3v1emGiven :1; - unsigned BSIM3v1efGiven :1; - unsigned BSIM3v1afGiven :1; - unsigned BSIM3v1kfGiven :1; - - unsigned BSIM3v1LintGiven :1; - unsigned BSIM3v1LlGiven :1; - unsigned BSIM3v1LlnGiven :1; - unsigned BSIM3v1LwGiven :1; - unsigned BSIM3v1LwnGiven :1; - unsigned BSIM3v1LwlGiven :1; - unsigned BSIM3v1LminGiven :1; - unsigned BSIM3v1LmaxGiven :1; - - unsigned BSIM3v1WintGiven :1; - unsigned BSIM3v1WlGiven :1; - unsigned BSIM3v1WlnGiven :1; - unsigned BSIM3v1WwGiven :1; - unsigned BSIM3v1WwnGiven :1; - unsigned BSIM3v1WwlGiven :1; - unsigned BSIM3v1WminGiven :1; - unsigned BSIM3v1WmaxGiven :1; - -} BSIM3v1model; - - -#ifndef NMOS -#define NMOS 1 -#define PMOS -1 -#endif /*NMOS*/ - - -/* device parameters */ -#define BSIM3v1_W 1 -#define BSIM3v1_L 2 -#define BSIM3v1_M 15 -#define BSIM3v1_AS 3 -#define BSIM3v1_AD 4 -#define BSIM3v1_PS 5 -#define BSIM3v1_PD 6 -#define BSIM3v1_NRS 7 -#define BSIM3v1_NRD 8 -#define BSIM3v1_OFF 9 -#define BSIM3v1_IC_VBS 10 -#define BSIM3v1_IC_VDS 11 -#define BSIM3v1_IC_VGS 12 -#define BSIM3v1_IC 13 -#define BSIM3v1_NQSMOD 14 - -/* model parameters */ -#define BSIM3v1_MOD_CAPMOD 101 -#define BSIM3v1_MOD_NQSMOD 102 -#define BSIM3v1_MOD_MOBMOD 103 -#define BSIM3v1_MOD_NOIMOD 104 - -#define BSIM3v1_MOD_TOX 105 - -#define BSIM3v1_MOD_CDSC 106 -#define BSIM3v1_MOD_CDSCB 107 -#define BSIM3v1_MOD_CIT 108 -#define BSIM3v1_MOD_NFACTOR 109 -#define BSIM3v1_MOD_XJ 110 -#define BSIM3v1_MOD_VSAT 111 -#define BSIM3v1_MOD_AT 112 -#define BSIM3v1_MOD_A0 113 -#define BSIM3v1_MOD_A1 114 -#define BSIM3v1_MOD_A2 115 -#define BSIM3v1_MOD_KETA 116 -#define BSIM3v1_MOD_NSUB 117 -#define BSIM3v1_MOD_NPEAK 118 -#define BSIM3v1_MOD_NGATE 120 -#define BSIM3v1_MOD_GAMMA1 121 -#define BSIM3v1_MOD_GAMMA2 122 -#define BSIM3v1_MOD_VBX 123 -#define BSIM3v1_MOD_BINUNIT 124 - -#define BSIM3v1_MOD_VBM 125 - -#define BSIM3v1_MOD_XT 126 -#define BSIM3v1_MOD_K1 129 -#define BSIM3v1_MOD_KT1 130 -#define BSIM3v1_MOD_KT1L 131 -#define BSIM3v1_MOD_K2 132 -#define BSIM3v1_MOD_KT2 133 -#define BSIM3v1_MOD_K3 134 -#define BSIM3v1_MOD_K3B 135 -#define BSIM3v1_MOD_W0 136 -#define BSIM3v1_MOD_NLX 137 - -#define BSIM3v1_MOD_DVT0 138 -#define BSIM3v1_MOD_DVT1 139 -#define BSIM3v1_MOD_DVT2 140 - -#define BSIM3v1_MOD_DVT0W 141 -#define BSIM3v1_MOD_DVT1W 142 -#define BSIM3v1_MOD_DVT2W 143 - -#define BSIM3v1_MOD_DROUT 144 -#define BSIM3v1_MOD_DSUB 145 -#define BSIM3v1_MOD_VTH0 146 -#define BSIM3v1_MOD_UA 147 -#define BSIM3v1_MOD_UA1 148 -#define BSIM3v1_MOD_UB 149 -#define BSIM3v1_MOD_UB1 150 -#define BSIM3v1_MOD_UC 151 -#define BSIM3v1_MOD_UC1 152 -#define BSIM3v1_MOD_U0 153 -#define BSIM3v1_MOD_UTE 154 -#define BSIM3v1_MOD_VOFF 155 -#define BSIM3v1_MOD_DELTA 156 -#define BSIM3v1_MOD_RDSW 157 -#define BSIM3v1_MOD_PRT 158 -#define BSIM3v1_MOD_LDD 159 -#define BSIM3v1_MOD_ETA 160 -#define BSIM3v1_MOD_ETA0 161 -#define BSIM3v1_MOD_ETAB 162 -#define BSIM3v1_MOD_PCLM 163 -#define BSIM3v1_MOD_PDIBL1 164 -#define BSIM3v1_MOD_PDIBL2 165 -#define BSIM3v1_MOD_PSCBE1 166 -#define BSIM3v1_MOD_PSCBE2 167 -#define BSIM3v1_MOD_PVAG 168 -#define BSIM3v1_MOD_WR 169 -#define BSIM3v1_MOD_DWG 170 -#define BSIM3v1_MOD_DWB 171 -#define BSIM3v1_MOD_B0 172 -#define BSIM3v1_MOD_B1 173 -#define BSIM3v1_MOD_ALPHA0 174 -#define BSIM3v1_MOD_BETA0 175 -#define BSIM3v1_MOD_PDIBLB 178 - -#define BSIM3v1_MOD_PRWG 179 -#define BSIM3v1_MOD_PRWB 180 - -#define BSIM3v1_MOD_CDSCD 181 -#define BSIM3v1_MOD_AGS 182 - -#define BSIM3v1_MOD_FRINGE 184 -#define BSIM3v1_MOD_ELM 185 -#define BSIM3v1_MOD_CGSL 186 -#define BSIM3v1_MOD_CGDL 187 -#define BSIM3v1_MOD_CKAPPA 188 -#define BSIM3v1_MOD_CF 189 -#define BSIM3v1_MOD_CLC 190 -#define BSIM3v1_MOD_CLE 191 -#define BSIM3v1_MOD_PARAMCHK 192 -#define BSIM3v1_MOD_VERSION 193 -#define BSIM3v1_MOD_VFBCV 194 - -#define BSIM3v1_MOD_HDIF 198 - -/* Length dependence */ -#define BSIM3v1_MOD_LCDSC 201 -#define BSIM3v1_MOD_LCDSCB 202 -#define BSIM3v1_MOD_LCIT 203 -#define BSIM3v1_MOD_LNFACTOR 204 -#define BSIM3v1_MOD_LXJ 205 -#define BSIM3v1_MOD_LVSAT 206 -#define BSIM3v1_MOD_LAT 207 -#define BSIM3v1_MOD_LA0 208 -#define BSIM3v1_MOD_LA1 209 -#define BSIM3v1_MOD_LA2 210 -#define BSIM3v1_MOD_LKETA 211 -#define BSIM3v1_MOD_LNSUB 212 -#define BSIM3v1_MOD_LNPEAK 213 -#define BSIM3v1_MOD_LNGATE 215 -#define BSIM3v1_MOD_LGAMMA1 216 -#define BSIM3v1_MOD_LGAMMA2 217 -#define BSIM3v1_MOD_LVBX 218 - -#define BSIM3v1_MOD_LVBM 220 - -#define BSIM3v1_MOD_LXT 222 -#define BSIM3v1_MOD_LK1 225 -#define BSIM3v1_MOD_LKT1 226 -#define BSIM3v1_MOD_LKT1L 227 -#define BSIM3v1_MOD_LK2 228 -#define BSIM3v1_MOD_LKT2 229 -#define BSIM3v1_MOD_LK3 230 -#define BSIM3v1_MOD_LK3B 231 -#define BSIM3v1_MOD_LW0 232 -#define BSIM3v1_MOD_LNLX 233 - -#define BSIM3v1_MOD_LDVT0 234 -#define BSIM3v1_MOD_LDVT1 235 -#define BSIM3v1_MOD_LDVT2 236 - -#define BSIM3v1_MOD_LDVT0W 237 -#define BSIM3v1_MOD_LDVT1W 238 -#define BSIM3v1_MOD_LDVT2W 239 - -#define BSIM3v1_MOD_LDROUT 240 -#define BSIM3v1_MOD_LDSUB 241 -#define BSIM3v1_MOD_LVTH0 242 -#define BSIM3v1_MOD_LUA 243 -#define BSIM3v1_MOD_LUA1 244 -#define BSIM3v1_MOD_LUB 245 -#define BSIM3v1_MOD_LUB1 246 -#define BSIM3v1_MOD_LUC 247 -#define BSIM3v1_MOD_LUC1 248 -#define BSIM3v1_MOD_LU0 249 -#define BSIM3v1_MOD_LUTE 250 -#define BSIM3v1_MOD_LVOFF 251 -#define BSIM3v1_MOD_LDELTA 252 -#define BSIM3v1_MOD_LRDSW 253 -#define BSIM3v1_MOD_LPRT 254 -#define BSIM3v1_MOD_LLDD 255 -#define BSIM3v1_MOD_LETA 256 -#define BSIM3v1_MOD_LETA0 257 -#define BSIM3v1_MOD_LETAB 258 -#define BSIM3v1_MOD_LPCLM 259 -#define BSIM3v1_MOD_LPDIBL1 260 -#define BSIM3v1_MOD_LPDIBL2 261 -#define BSIM3v1_MOD_LPSCBE1 262 -#define BSIM3v1_MOD_LPSCBE2 263 -#define BSIM3v1_MOD_LPVAG 264 -#define BSIM3v1_MOD_LWR 265 -#define BSIM3v1_MOD_LDWG 266 -#define BSIM3v1_MOD_LDWB 267 -#define BSIM3v1_MOD_LB0 268 -#define BSIM3v1_MOD_LB1 269 -#define BSIM3v1_MOD_LALPHA0 270 -#define BSIM3v1_MOD_LBETA0 271 -#define BSIM3v1_MOD_LPDIBLB 274 - -#define BSIM3v1_MOD_LPRWG 275 -#define BSIM3v1_MOD_LPRWB 276 - -#define BSIM3v1_MOD_LCDSCD 277 -#define BSIM3v1_MOD_LAGS 278 - - -#define BSIM3v1_MOD_LFRINGE 281 -#define BSIM3v1_MOD_LELM 282 -#define BSIM3v1_MOD_LCGSL 283 -#define BSIM3v1_MOD_LCGDL 284 -#define BSIM3v1_MOD_LCKAPPA 285 -#define BSIM3v1_MOD_LCF 286 -#define BSIM3v1_MOD_LCLC 287 -#define BSIM3v1_MOD_LCLE 288 -#define BSIM3v1_MOD_LVFBCV 289 - -/* Width dependence */ -#define BSIM3v1_MOD_WCDSC 301 -#define BSIM3v1_MOD_WCDSCB 302 -#define BSIM3v1_MOD_WCIT 303 -#define BSIM3v1_MOD_WNFACTOR 304 -#define BSIM3v1_MOD_WXJ 305 -#define BSIM3v1_MOD_WVSAT 306 -#define BSIM3v1_MOD_WAT 307 -#define BSIM3v1_MOD_WA0 308 -#define BSIM3v1_MOD_WA1 309 -#define BSIM3v1_MOD_WA2 310 -#define BSIM3v1_MOD_WKETA 311 -#define BSIM3v1_MOD_WNSUB 312 -#define BSIM3v1_MOD_WNPEAK 313 -#define BSIM3v1_MOD_WNGATE 315 -#define BSIM3v1_MOD_WGAMMA1 316 -#define BSIM3v1_MOD_WGAMMA2 317 -#define BSIM3v1_MOD_WVBX 318 - -#define BSIM3v1_MOD_WVBM 320 - -#define BSIM3v1_MOD_WXT 322 -#define BSIM3v1_MOD_WK1 325 -#define BSIM3v1_MOD_WKT1 326 -#define BSIM3v1_MOD_WKT1L 327 -#define BSIM3v1_MOD_WK2 328 -#define BSIM3v1_MOD_WKT2 329 -#define BSIM3v1_MOD_WK3 330 -#define BSIM3v1_MOD_WK3B 331 -#define BSIM3v1_MOD_WW0 332 -#define BSIM3v1_MOD_WNLX 333 - -#define BSIM3v1_MOD_WDVT0 334 -#define BSIM3v1_MOD_WDVT1 335 -#define BSIM3v1_MOD_WDVT2 336 - -#define BSIM3v1_MOD_WDVT0W 337 -#define BSIM3v1_MOD_WDVT1W 338 -#define BSIM3v1_MOD_WDVT2W 339 - -#define BSIM3v1_MOD_WDROUT 340 -#define BSIM3v1_MOD_WDSUB 341 -#define BSIM3v1_MOD_WVTH0 342 -#define BSIM3v1_MOD_WUA 343 -#define BSIM3v1_MOD_WUA1 344 -#define BSIM3v1_MOD_WUB 345 -#define BSIM3v1_MOD_WUB1 346 -#define BSIM3v1_MOD_WUC 347 -#define BSIM3v1_MOD_WUC1 348 -#define BSIM3v1_MOD_WU0 349 -#define BSIM3v1_MOD_WUTE 350 -#define BSIM3v1_MOD_WVOFF 351 -#define BSIM3v1_MOD_WDELTA 352 -#define BSIM3v1_MOD_WRDSW 353 -#define BSIM3v1_MOD_WPRT 354 -#define BSIM3v1_MOD_WLDD 355 -#define BSIM3v1_MOD_WETA 356 -#define BSIM3v1_MOD_WETA0 357 -#define BSIM3v1_MOD_WETAB 358 -#define BSIM3v1_MOD_WPCLM 359 -#define BSIM3v1_MOD_WPDIBL1 360 -#define BSIM3v1_MOD_WPDIBL2 361 -#define BSIM3v1_MOD_WPSCBE1 362 -#define BSIM3v1_MOD_WPSCBE2 363 -#define BSIM3v1_MOD_WPVAG 364 -#define BSIM3v1_MOD_WWR 365 -#define BSIM3v1_MOD_WDWG 366 -#define BSIM3v1_MOD_WDWB 367 -#define BSIM3v1_MOD_WB0 368 -#define BSIM3v1_MOD_WB1 369 -#define BSIM3v1_MOD_WALPHA0 370 -#define BSIM3v1_MOD_WBETA0 371 -#define BSIM3v1_MOD_WPDIBLB 374 - -#define BSIM3v1_MOD_WPRWG 375 -#define BSIM3v1_MOD_WPRWB 376 - -#define BSIM3v1_MOD_WCDSCD 377 -#define BSIM3v1_MOD_WAGS 378 - - -#define BSIM3v1_MOD_WFRINGE 381 -#define BSIM3v1_MOD_WELM 382 -#define BSIM3v1_MOD_WCGSL 383 -#define BSIM3v1_MOD_WCGDL 384 -#define BSIM3v1_MOD_WCKAPPA 385 -#define BSIM3v1_MOD_WCF 386 -#define BSIM3v1_MOD_WCLC 387 -#define BSIM3v1_MOD_WCLE 388 -#define BSIM3v1_MOD_WVFBCV 389 - -/* Cross-term dependence */ -#define BSIM3v1_MOD_PCDSC 401 -#define BSIM3v1_MOD_PCDSCB 402 -#define BSIM3v1_MOD_PCIT 403 -#define BSIM3v1_MOD_PNFACTOR 404 -#define BSIM3v1_MOD_PXJ 405 -#define BSIM3v1_MOD_PVSAT 406 -#define BSIM3v1_MOD_PAT 407 -#define BSIM3v1_MOD_PA0 408 -#define BSIM3v1_MOD_PA1 409 -#define BSIM3v1_MOD_PA2 410 -#define BSIM3v1_MOD_PKETA 411 -#define BSIM3v1_MOD_PNSUB 412 -#define BSIM3v1_MOD_PNPEAK 413 -#define BSIM3v1_MOD_PNGATE 415 -#define BSIM3v1_MOD_PGAMMA1 416 -#define BSIM3v1_MOD_PGAMMA2 417 -#define BSIM3v1_MOD_PVBX 418 - -#define BSIM3v1_MOD_PVBM 420 - -#define BSIM3v1_MOD_PXT 422 -#define BSIM3v1_MOD_PK1 425 -#define BSIM3v1_MOD_PKT1 426 -#define BSIM3v1_MOD_PKT1L 427 -#define BSIM3v1_MOD_PK2 428 -#define BSIM3v1_MOD_PKT2 429 -#define BSIM3v1_MOD_PK3 430 -#define BSIM3v1_MOD_PK3B 431 -#define BSIM3v1_MOD_PW0 432 -#define BSIM3v1_MOD_PNLX 433 - -#define BSIM3v1_MOD_PDVT0 434 -#define BSIM3v1_MOD_PDVT1 435 -#define BSIM3v1_MOD_PDVT2 436 - -#define BSIM3v1_MOD_PDVT0W 437 -#define BSIM3v1_MOD_PDVT1W 438 -#define BSIM3v1_MOD_PDVT2W 439 - -#define BSIM3v1_MOD_PDROUT 440 -#define BSIM3v1_MOD_PDSUB 441 -#define BSIM3v1_MOD_PVTH0 442 -#define BSIM3v1_MOD_PUA 443 -#define BSIM3v1_MOD_PUA1 444 -#define BSIM3v1_MOD_PUB 445 -#define BSIM3v1_MOD_PUB1 446 -#define BSIM3v1_MOD_PUC 447 -#define BSIM3v1_MOD_PUC1 448 -#define BSIM3v1_MOD_PU0 449 -#define BSIM3v1_MOD_PUTE 450 -#define BSIM3v1_MOD_PVOFF 451 -#define BSIM3v1_MOD_PDELTA 452 -#define BSIM3v1_MOD_PRDSW 453 -#define BSIM3v1_MOD_PPRT 454 -#define BSIM3v1_MOD_PLDD 455 -#define BSIM3v1_MOD_PETA 456 -#define BSIM3v1_MOD_PETA0 457 -#define BSIM3v1_MOD_PETAB 458 -#define BSIM3v1_MOD_PPCLM 459 -#define BSIM3v1_MOD_PPDIBL1 460 -#define BSIM3v1_MOD_PPDIBL2 461 -#define BSIM3v1_MOD_PPSCBE1 462 -#define BSIM3v1_MOD_PPSCBE2 463 -#define BSIM3v1_MOD_PPVAG 464 -#define BSIM3v1_MOD_PWR 465 -#define BSIM3v1_MOD_PDWG 466 -#define BSIM3v1_MOD_PDWB 467 -#define BSIM3v1_MOD_PB0 468 -#define BSIM3v1_MOD_PB1 469 -#define BSIM3v1_MOD_PALPHA0 470 -#define BSIM3v1_MOD_PBETA0 471 -#define BSIM3v1_MOD_PPDIBLB 474 - -#define BSIM3v1_MOD_PPRWG 475 -#define BSIM3v1_MOD_PPRWB 476 - -#define BSIM3v1_MOD_PCDSCD 477 -#define BSIM3v1_MOD_PAGS 478 - -#define BSIM3v1_MOD_PFRINGE 481 -#define BSIM3v1_MOD_PELM 482 -#define BSIM3v1_MOD_PCGSL 483 -#define BSIM3v1_MOD_PCGDL 484 -#define BSIM3v1_MOD_PCKAPPA 485 -#define BSIM3v1_MOD_PCF 486 -#define BSIM3v1_MOD_PCLC 487 -#define BSIM3v1_MOD_PCLE 488 -#define BSIM3v1_MOD_PVFBCV 489 - -#define BSIM3v1_MOD_TNOM 501 -#define BSIM3v1_MOD_CGSO 502 -#define BSIM3v1_MOD_CGDO 503 -#define BSIM3v1_MOD_CGBO 504 -#define BSIM3v1_MOD_XPART 505 - -#define BSIM3v1_MOD_RSH 506 -#define BSIM3v1_MOD_JS 507 -#define BSIM3v1_MOD_PB 508 -#define BSIM3v1_MOD_MJ 509 -#define BSIM3v1_MOD_PBSW 510 -#define BSIM3v1_MOD_MJSW 511 -#define BSIM3v1_MOD_CJ 512 -#define BSIM3v1_MOD_CJSW 513 -#define BSIM3v1_MOD_NMOS 514 -#define BSIM3v1_MOD_PMOS 515 - -#define BSIM3v1_MOD_NOIA 516 -#define BSIM3v1_MOD_NOIB 517 -#define BSIM3v1_MOD_NOIC 518 - -#define BSIM3v1_MOD_LINT 519 -#define BSIM3v1_MOD_LL 520 -#define BSIM3v1_MOD_LLN 521 -#define BSIM3v1_MOD_LW 522 -#define BSIM3v1_MOD_LWN 523 -#define BSIM3v1_MOD_LWL 524 -#define BSIM3v1_MOD_LMIN 525 -#define BSIM3v1_MOD_LMAX 526 - -#define BSIM3v1_MOD_WINT 527 -#define BSIM3v1_MOD_WL 528 -#define BSIM3v1_MOD_WLN 529 -#define BSIM3v1_MOD_WW 530 -#define BSIM3v1_MOD_WWN 531 -#define BSIM3v1_MOD_WWL 532 -#define BSIM3v1_MOD_WMIN 533 -#define BSIM3v1_MOD_WMAX 534 - -#define BSIM3v1_MOD_DWC 535 -#define BSIM3v1_MOD_DLC 536 - -#define BSIM3v1_MOD_EM 537 -#define BSIM3v1_MOD_EF 538 -#define BSIM3v1_MOD_AF 539 -#define BSIM3v1_MOD_KF 540 - -#define BSIM3v1_MOD_NJ 541 -#define BSIM3v1_MOD_XTI 542 - -#define BSIM3v1_MOD_PBSWG 543 -#define BSIM3v1_MOD_MJSWG 544 -#define BSIM3v1_MOD_CJSWG 545 -#define BSIM3v1_MOD_JSW 546 - -/* device questions */ -#define BSIM3v1_DNODE 601 -#define BSIM3v1_GNODE 602 -#define BSIM3v1_SNODE 603 -#define BSIM3v1_BNODE 604 -#define BSIM3v1_DNODEPRIME 605 -#define BSIM3v1_SNODEPRIME 606 -#define BSIM3v1_VBD 607 -#define BSIM3v1_VBS 608 -#define BSIM3v1_VGS 609 -#define BSIM3v1_VDS 610 -#define BSIM3v1_CD 611 -#define BSIM3v1_CBS 612 -#define BSIM3v1_CBD 613 -#define BSIM3v1_GM 614 -#define BSIM3v1_GDS 615 -#define BSIM3v1_GMBS 616 -#define BSIM3v1_GBD 617 -#define BSIM3v1_GBS 618 -#define BSIM3v1_QB 619 -#define BSIM3v1_CQB 620 -#define BSIM3v1_QG 621 -#define BSIM3v1_CQG 622 -#define BSIM3v1_QD 623 -#define BSIM3v1_CQD 624 -#define BSIM3v1_CGG 625 -#define BSIM3v1_CGD 626 -#define BSIM3v1_CGS 627 -#define BSIM3v1_CBG 628 -#define BSIM3v1_CAPBD 629 -#define BSIM3v1_CQBD 630 -#define BSIM3v1_CAPBS 631 -#define BSIM3v1_CQBS 632 -#define BSIM3v1_CDG 633 -#define BSIM3v1_CDD 634 -#define BSIM3v1_CDS 635 -#define BSIM3v1_VON 636 -#define BSIM3v1_VDSAT 637 -#define BSIM3v1_QBS 638 -#define BSIM3v1_QBD 639 -#define BSIM3v1_SOURCECONDUCT 640 -#define BSIM3v1_DRAINCONDUCT 641 -#define BSIM3v1_CBDB 642 -#define BSIM3v1_CBSB 643 - -#include "bsim3v1ext.h" - -extern void BSIM3v1evaluate(double,double,double,BSIM3v1instance*,BSIM3v1model*, - double*,double*,double*, double*, double*, double*, double*, - double*, double*, double*, double*, double*, double*, double*, - double*, double*, double*, double*, CKTcircuit*); -extern int BSIM3v1debug(BSIM3v1model*, BSIM3v1instance*, CKTcircuit*, int); -extern int BSIM3v1checkModel(BSIM3v1model*, BSIM3v1instance*, CKTcircuit*); - -#endif /*BSIM3v1*/ - - - - diff --git a/src/spicelib/devices/bsim3v1/bsim3v1ext.h b/src/spicelib/devices/bsim3v1/bsim3v1ext.h deleted file mode 100644 index 5fd68451a..000000000 --- a/src/spicelib/devices/bsim3v1/bsim3v1ext.h +++ /dev/null @@ -1,28 +0,0 @@ -/********** -Copyright 1990 Regents of the University of California. All rights reserved. -Author: 1991 JianHui Huang and Min-Chie Jeng. -Modified: 2002 Paolo Nenzi. -File: bsim3v1ext.h -**********/ - -extern int BSIM3v1acLoad(GENmodel *, CKTcircuit *); -extern int BSIM3v1ask(CKTcircuit *, GENinstance *, int, IFvalue *, IFvalue *); -extern int BSIM3v1convTest(GENmodel *, CKTcircuit *); -extern int BSIM3v1getic(GENmodel *, CKTcircuit *); -extern int BSIM3v1load(GENmodel *, CKTcircuit *); -extern int BSIM3v1mAsk(CKTcircuit *, GENmodel *, int, IFvalue *); -extern int BSIM3v1mParam(int, IFvalue *, GENmodel *); -extern void BSIM3v1mosCap(CKTcircuit *, double, double, double, double, - double, double, double, double, double, double, double, - double, double, double, double, double, double, double*, - double *, double *, double *, double *, double *, double *, double *, - double *, double *, double *, double *, double *, double *, double *, - double *); -extern int BSIM3v1param(int, IFvalue *, GENinstance *, IFvalue *); -extern int BSIM3v1pzLoad(GENmodel *, CKTcircuit *, SPcomplex *); -extern int BSIM3v1setup(SMPmatrix *, GENmodel *, CKTcircuit *, int *); -extern int BSIM3v1temp(GENmodel *, CKTcircuit *); -extern int BSIM3v1trunc(GENmodel *, CKTcircuit *, double *); -extern int BSIM3v1noise(int, int, GENmodel *, CKTcircuit *, Ndata *, double *); -extern int BSIM3v1unsetup(GENmodel *, CKTcircuit *); - diff --git a/src/spicelib/devices/bsim3v1/bsim3v1init.c b/src/spicelib/devices/bsim3v1/bsim3v1init.c deleted file mode 100644 index 1e5ec3c2b..000000000 --- a/src/spicelib/devices/bsim3v1/bsim3v1init.c +++ /dev/null @@ -1,75 +0,0 @@ -#include "ngspice/config.h" - -#include "ngspice/devdefs.h" - -#include "bsim3v1itf.h" -#include "bsim3v1ext.h" -#include "bsim3v1init.h" - -SPICEdev BSIM3v1info = { - .DEVpublic = { - .name = "BSIM3v1", - .description = "Berkeley Short Channel IGFET Model Version-3 (3.1)", - .terms = &BSIM3v1nSize, - .numNames = &BSIM3v1nSize, - .termNames = BSIM3v1names, - .numInstanceParms = &BSIM3v1pTSize, - .instanceParms = BSIM3v1pTable, - .numModelParms = &BSIM3v1mPTSize, - .modelParms = BSIM3v1mPTable, - .flags = DEV_DEFAULT, - -#ifdef XSPICE - .cm_func = NULL, - .num_conn = 0, - .conn = NULL, - .num_param = 0, - .param = NULL, - .num_inst_var = 0, - .inst_var = NULL, -#endif - }, - - .DEVparam = BSIM3v1param, - .DEVmodParam = BSIM3v1mParam, - .DEVload = BSIM3v1load, - .DEVsetup = BSIM3v1setup, - .DEVunsetup = BSIM3v1unsetup, - .DEVpzSetup = BSIM3v1setup, - .DEVtemperature = BSIM3v1temp, - .DEVtrunc = BSIM3v1trunc, - .DEVfindBranch = NULL, - .DEVacLoad = BSIM3v1acLoad, - .DEVaccept = NULL, - .DEVdestroy = NULL, - .DEVmodDelete = NULL, - .DEVdelete = NULL, - .DEVsetic = BSIM3v1getic, - .DEVask = BSIM3v1ask, - .DEVmodAsk = BSIM3v1mAsk, - .DEVpzLoad = BSIM3v1pzLoad, - .DEVconvTest = BSIM3v1convTest, - .DEVsenSetup = NULL, - .DEVsenLoad = NULL, - .DEVsenUpdate = NULL, - .DEVsenAcLoad = NULL, - .DEVsenPrint = NULL, - .DEVsenTrunc = NULL, - .DEVdisto = NULL, - .DEVnoise = BSIM3v1noise, - .DEVsoaCheck = NULL, - .DEVinstSize = &BSIM3v1iSize, - .DEVmodSize = &BSIM3v1mSize, - -#ifdef CIDER - .DEVdump = NULL, - .DEVacct = NULL, -#endif -}; - - -SPICEdev * -get_bsim3v1_info(void) -{ - return &BSIM3v1info; -} diff --git a/src/spicelib/devices/bsim3v1/bsim3v1init.h b/src/spicelib/devices/bsim3v1/bsim3v1init.h deleted file mode 100644 index 35701d659..000000000 --- a/src/spicelib/devices/bsim3v1/bsim3v1init.h +++ /dev/null @@ -1,13 +0,0 @@ -#ifndef _BSIM3v1INIT_H -#define _BSIM3v1INIT_H - -extern IFparm BSIM3v1pTable[ ]; -extern IFparm BSIM3v1mPTable[ ]; -extern char *BSIM3v1names[ ]; -extern int BSIM3v1pTSize; -extern int BSIM3v1mPTSize; -extern int BSIM3v1nSize; -extern int BSIM3v1iSize; -extern int BSIM3v1mSize; - -#endif diff --git a/src/spicelib/devices/bsim3v1/bsim3v1itf.h b/src/spicelib/devices/bsim3v1/bsim3v1itf.h deleted file mode 100644 index 101e4f07a..000000000 --- a/src/spicelib/devices/bsim3v1/bsim3v1itf.h +++ /dev/null @@ -1,14 +0,0 @@ -/********** -Copyright 1990 Regents of the University of California. All rights reserved. -Author: 1991 JianHui Huang and Min-Chie Jeng. -Modified: 2002 Paolo Nenzi. -File: bsim3v1itf.h -**********/ - -#ifndef DEV_BSIM3v1 -#define DEV_BSIM3v1 - -SPICEdev *get_bsim3v1_info(void); - -#endif - diff --git a/src/spicelib/devices/bsim3v32/B3TERMS_OF_USE b/src/spicelib/devices/bsim3v32/B3TERMS_OF_USE deleted file mode 100644 index bc4a61beb..000000000 --- a/src/spicelib/devices/bsim3v32/B3TERMS_OF_USE +++ /dev/null @@ -1,30 +0,0 @@ - -The terms under which the software is provided are as the following. - -Software is distributed as is, completely without warranty or service -support. The University of California and its employees are not liable -for the condition or performance of the software. - -The University owns the copyright but shall not be liable for any -infringement of copyright or other proprietary rights brought by third -parties against the users of the software. - -The University of California hereby disclaims all implied warranties. - -The University of California grants the users the right to modify, copy, -and redistribute the software and documentation, both within the user's -organization and externally, subject to the following restrictions: - -1. The users agree not to charge for the University of California code - itself but may charge for additions, extensions, or support. - -2. In any product based on the software, the users agree to acknowledge - the UC Berkeley BSIM Research Group that developed the software. This - acknowledgment shall appear in the product documentation. - -3. The users agree to obey all U.S. Government restrictions governing - redistribution or export of the software. - -4. The users agree to reproduce any copyright notice which appears on - the software on any copy or modification of such made available - to others. diff --git a/src/spicelib/devices/bsim3v32/Makefile.am b/src/spicelib/devices/bsim3v32/Makefile.am deleted file mode 100644 index 0f5818873..000000000 --- a/src/spicelib/devices/bsim3v32/Makefile.am +++ /dev/null @@ -1,36 +0,0 @@ -## Process this file with automake to produce Makefile.in - -noinst_LTLIBRARIES = libbsim3v32.la - -libbsim3v32_la_SOURCES = \ - b3v32.c \ - b3v32acld.c \ - b3v32ask.c \ - b3v32check.c \ - b3v32cvtest.c \ - b3v32getic.c \ - b3v32ld.c \ - b3v32mask.c \ - b3v32mdel.c \ - b3v32mpar.c \ - b3v32noi.c \ - b3v32par.c \ - b3v32pzld.c \ - b3v32set.c \ - b3v32soachk.c \ - b3v32temp.c \ - b3v32trunc.c \ - bsim3v32def.h \ - bsim3v32ext.h \ - bsim3v32init.c \ - bsim3v32init.h \ - bsim3v32itf.h - - - -AM_CPPFLAGS = @AM_CPPFLAGS@ -I$(top_srcdir)/src/include -AM_CFLAGS = $(STATIC) - -MAINTAINERCLEANFILES = Makefile.in - -EXTRA_DIST = B3TERMS_OF_USE diff --git a/src/spicelib/devices/bsim3v32/b3v32.c b/src/spicelib/devices/bsim3v32/b3v32.c deleted file mode 100644 index 8b38ff9b3..000000000 --- a/src/spicelib/devices/bsim3v32/b3v32.c +++ /dev/null @@ -1,534 +0,0 @@ -/**** BSIM3v3.2.4, Released by Xuemei Xi 12/14/2001 ****/ - -/********** - * Copyright 2001 Regents of the University of California. All rights reserved. - * File: b3.c of BSIM3v3.2.4 - * Author: 1995 Min-Chie Jeng and Mansun Chan - * Author: 1997-1999 Weidong Liu. - * Author: 2001 Xuemei Xi - * Modified by Paolo Nenzi 2002 and Dietmar Warning 2003 - **********/ - -#include "ngspice/ngspice.h" -#include "ngspice/devdefs.h" -#include "bsim3v32def.h" -#include "ngspice/suffix.h" - -IFparm BSIM3v32pTable[] = { /* parameters */ -IOP( "l", BSIM3v32_L, IF_REAL , "Length"), -IOP( "w", BSIM3v32_W, IF_REAL , "Width"), -IOP( "m", BSIM3v32_M, IF_REAL , "Parallel multiplier"), -IOP( "ad", BSIM3v32_AD, IF_REAL , "Drain area"), -IOP( "as", BSIM3v32_AS, IF_REAL , "Source area"), -IOP( "pd", BSIM3v32_PD, IF_REAL , "Drain perimeter"), -IOP( "ps", BSIM3v32_PS, IF_REAL , "Source perimeter"), -IOP( "nrd", BSIM3v32_NRD, IF_REAL , "Number of squares in drain"), -IOP( "nrs", BSIM3v32_NRS, IF_REAL , "Number of squares in source"), -IOP( "off", BSIM3v32_OFF, IF_FLAG , "Device is initially off"), -IOP( "nqsmod", BSIM3v32_NQSMOD, IF_INTEGER, "Non-quasi-static model selector"), -IOP( "geo", BSIM3v32_GEO, IF_INTEGER, "ACM model drain/source connection"), -IOP( "delvto", BSIM3v32_DELVTO, IF_REAL , "Zero bias threshold voltage variation"), -IOP( "mulu0", BSIM3v32_MULU0, IF_REAL , "Low field mobility multiplier"), -IP( "ic", BSIM3v32_IC, IF_REALVEC , "Vector of DS,GS,BS initial voltages"), -OP( "gmbs", BSIM3v32_GMBS, IF_REAL, "Gmb"), -OP( "gm", BSIM3v32_GM, IF_REAL, "Gm"), -OP( "gds", BSIM3v32_GDS, IF_REAL, "Gds"), -OP( "vdsat", BSIM3v32_VDSAT, IF_REAL, "Vdsat"), -OP( "vth", BSIM3v32_VON, IF_REAL, "Vth"), -OP( "id", BSIM3v32_CD, IF_REAL, "Ids"), -OP( "vbs", BSIM3v32_VBS, IF_REAL, "Vbs"), -OP( "vgs", BSIM3v32_VGS, IF_REAL, "Vgs"), -OP( "vds", BSIM3v32_VDS, IF_REAL, "Vds"), -OP( "ibd", BSIM3v32_CBD, IF_REAL, "Ibd"), /* newly added from here */ -OP( "ibs", BSIM3v32_CBS, IF_REAL, "Ibs"), -OP( "gbd", BSIM3v32_GBD, IF_REAL, "gbd"), -OP( "gbs", BSIM3v32_GBS, IF_REAL, "gbs"), -OP( "qb", BSIM3v32_QB, IF_REAL, "Qbulk"), -OP( "cqb", BSIM3v32_CQB, IF_REAL, "CQbulk"), -OP( "qg", BSIM3v32_QG, IF_REAL, "Qgate"), -OP( "cqg", BSIM3v32_CQG, IF_REAL, "CQgate"), -OP( "qd", BSIM3v32_QD, IF_REAL, "Qdrain"), -OP( "cqd", BSIM3v32_CQD, IF_REAL, "CQdrain"), -OP( "cgg", BSIM3v32_CGG, IF_REAL, "Cggb"), -OP( "cgd", BSIM3v32_CGD, IF_REAL, "Cgdb"), -OP( "cgs", BSIM3v32_CGS, IF_REAL, "Cgsb"), -OP( "cdg", BSIM3v32_CDG, IF_REAL, "Cdgb"), -OP( "cdd", BSIM3v32_CDD, IF_REAL, "Cddb"), -OP( "cds", BSIM3v32_CDS, IF_REAL, "Cdsb"), -OP( "cbg", BSIM3v32_CBG, IF_REAL, "Cbgb"), -OP( "cbd", BSIM3v32_CBDB, IF_REAL, "Cbdb"), -OP( "cbs", BSIM3v32_CBSB, IF_REAL, "Cbsb"), -OP( "capbd", BSIM3v32_CAPBD, IF_REAL, "Capbd"), -OP( "capbs", BSIM3v32_CAPBS, IF_REAL, "Capbs"), -}; - -IFparm BSIM3v32mPTable[] = { /* model parameters */ -IOP( "capmod", BSIM3v32_MOD_CAPMOD, IF_INTEGER, "Capacitance model selector"), -IOP( "mobmod", BSIM3v32_MOD_MOBMOD, IF_INTEGER, "Mobility model selector"), -IOP( "noimod", BSIM3v32_MOD_NOIMOD, IF_INTEGER, "Noise model selector"), -IOP( "nqsmod", BSIM3v32_MOD_NQSMOD, IF_INTEGER, "Non-quasi-static model selector"), -IOP( "acm", BSIM3v32_MOD_ACMMOD, IF_INTEGER, "Area calculation method selector"), -IOP( "calcacm", BSIM3v32_MOD_CALCACM, IF_INTEGER, "Area calculation method ACM=12"), -IOP( "paramchk", BSIM3v32_MOD_PARAMCHK, IF_INTEGER, "Model parameter checking selector"), -IOP( "binunit", BSIM3v32_MOD_BINUNIT, IF_INTEGER, "Bin unit selector"), -IOP( "version", BSIM3v32_MOD_VERSION, IF_STRING, " parameter for model version"), -IOP( "tox", BSIM3v32_MOD_TOX, IF_REAL, "Gate oxide thickness in meters"), - -IOP( "toxm", BSIM3v32_MOD_TOXM, IF_REAL, "Gate oxide thickness used in extraction"), -IOP( "cdsc", BSIM3v32_MOD_CDSC, IF_REAL, "Drain/Source and channel coupling capacitance"), -IOP( "cdscb", BSIM3v32_MOD_CDSCB, IF_REAL, "Body-bias dependence of cdsc"), -IOP( "cdscd", BSIM3v32_MOD_CDSCD, IF_REAL, "Drain-bias dependence of cdsc"), -IOP( "cit", BSIM3v32_MOD_CIT, IF_REAL, "Interface state capacitance"), -IOP( "nfactor", BSIM3v32_MOD_NFACTOR, IF_REAL, "Subthreshold swing Coefficient"), -IOP( "xj", BSIM3v32_MOD_XJ, IF_REAL, "Junction depth in meters"), -IOP( "vsat", BSIM3v32_MOD_VSAT, IF_REAL, "Saturation velocity at tnom"), -IOP( "at", BSIM3v32_MOD_AT, IF_REAL, "Temperature coefficient of vsat"), -IOP( "a0", BSIM3v32_MOD_A0, IF_REAL, "Non-uniform depletion width effect coefficient."), -IOP( "ags", BSIM3v32_MOD_AGS, IF_REAL, "Gate bias coefficient of Abulk."), -IOP( "a1", BSIM3v32_MOD_A1, IF_REAL, "Non-saturation effect coefficient"), -IOP( "a2", BSIM3v32_MOD_A2, IF_REAL, "Non-saturation effect coefficient"), -IOP( "keta", BSIM3v32_MOD_KETA, IF_REAL, "Body-bias coefficient of non-uniform depletion width effect."), -IOP( "nsub", BSIM3v32_MOD_NSUB, IF_REAL, "Substrate doping concentration"), -IOP( "nch", BSIM3v32_MOD_NPEAK, IF_REAL, "Channel doping concentration"), -IOP( "ngate", BSIM3v32_MOD_NGATE, IF_REAL, "Poly-gate doping concentration"), -IOP( "gamma1", BSIM3v32_MOD_GAMMA1, IF_REAL, "Vth body coefficient"), -IOP( "gamma2", BSIM3v32_MOD_GAMMA2, IF_REAL, "Vth body coefficient"), -IOP( "vbx", BSIM3v32_MOD_VBX, IF_REAL, "Vth transition body Voltage"), -IOP( "vbm", BSIM3v32_MOD_VBM, IF_REAL, "Maximum body voltage"), - -IOP( "xt", BSIM3v32_MOD_XT, IF_REAL, "Doping depth"), -IOP( "k1", BSIM3v32_MOD_K1, IF_REAL, "Bulk effect coefficient 1"), -IOP( "kt1", BSIM3v32_MOD_KT1, IF_REAL, "Temperature coefficient of Vth"), -IOP( "kt1l", BSIM3v32_MOD_KT1L, IF_REAL, "Temperature coefficient of Vth"), -IOP( "kt2", BSIM3v32_MOD_KT2, IF_REAL, "Body-coefficient of kt1"), -IOP( "k2", BSIM3v32_MOD_K2, IF_REAL, "Bulk effect coefficient 2"), -IOP( "k3", BSIM3v32_MOD_K3, IF_REAL, "Narrow width effect coefficient"), -IOP( "k3b", BSIM3v32_MOD_K3B, IF_REAL, "Body effect coefficient of k3"), -IOP( "w0", BSIM3v32_MOD_W0, IF_REAL, "Narrow width effect parameter"), -IOP( "nlx", BSIM3v32_MOD_NLX, IF_REAL, "Lateral non-uniform doping effect"), -IOP( "dvt0", BSIM3v32_MOD_DVT0, IF_REAL, "Short channel effect coeff. 0"), -IOP( "dvt1", BSIM3v32_MOD_DVT1, IF_REAL, "Short channel effect coeff. 1"), -IOP( "dvt2", BSIM3v32_MOD_DVT2, IF_REAL, "Short channel effect coeff. 2"), -IOP( "dvt0w", BSIM3v32_MOD_DVT0W, IF_REAL, "Narrow Width coeff. 0"), -IOP( "dvt1w", BSIM3v32_MOD_DVT1W, IF_REAL, "Narrow Width effect coeff. 1"), -IOP( "dvt2w", BSIM3v32_MOD_DVT2W, IF_REAL, "Narrow Width effect coeff. 2"), -IOP( "drout", BSIM3v32_MOD_DROUT, IF_REAL, "DIBL coefficient of output resistance"), -IOP( "dsub", BSIM3v32_MOD_DSUB, IF_REAL, "DIBL coefficient in the subthreshold region"), -IOP( "vth0", BSIM3v32_MOD_VTH0, IF_REAL,"Threshold voltage"), -IOPR("vtho", BSIM3v32_MOD_VTH0, IF_REAL,"Threshold voltage"), -IOP( "ua", BSIM3v32_MOD_UA, IF_REAL, "Linear gate dependence of mobility"), -IOP( "ua1", BSIM3v32_MOD_UA1, IF_REAL, "Temperature coefficient of ua"), -IOP( "ub", BSIM3v32_MOD_UB, IF_REAL, "Quadratic gate dependence of mobility"), -IOP( "ub1", BSIM3v32_MOD_UB1, IF_REAL, "Temperature coefficient of ub"), -IOP( "uc", BSIM3v32_MOD_UC, IF_REAL, "Body-bias dependence of mobility"), -IOP( "uc1", BSIM3v32_MOD_UC1, IF_REAL, "Temperature coefficient of uc"), -IOP( "u0", BSIM3v32_MOD_U0, IF_REAL, "Low-field mobility at Tnom"), -IOP( "ute", BSIM3v32_MOD_UTE, IF_REAL, "Temperature coefficient of mobility"), -IOP( "voff", BSIM3v32_MOD_VOFF, IF_REAL, "Threshold voltage offset"), -IOP( "tnom", BSIM3v32_MOD_TNOM, IF_REAL, "Parameter measurement temperature"), -IOP( "cgso", BSIM3v32_MOD_CGSO, IF_REAL, "Gate-source overlap capacitance per width"), -IOP( "cgdo", BSIM3v32_MOD_CGDO, IF_REAL, "Gate-drain overlap capacitance per width"), -IOP( "cgbo", BSIM3v32_MOD_CGBO, IF_REAL, "Gate-bulk overlap capacitance per length"), -IOP( "xpart", BSIM3v32_MOD_XPART, IF_REAL, "Channel charge partitioning"), -IOP( "elm", BSIM3v32_MOD_ELM, IF_REAL, "Non-quasi-static Elmore Constant Parameter"), -IOP( "delta", BSIM3v32_MOD_DELTA, IF_REAL, "Effective Vds parameter"), -IOP( "rsh", BSIM3v32_MOD_RSH, IF_REAL, "Source-drain sheet resistance"), -IOP( "rdsw", BSIM3v32_MOD_RDSW, IF_REAL, "Source-drain resistance per width"), - -IOP( "prwg", BSIM3v32_MOD_PRWG, IF_REAL, "Gate-bias effect on parasitic resistance "), -IOP( "prwb", BSIM3v32_MOD_PRWB, IF_REAL, "Body-effect on parasitic resistance "), - -IOP( "prt", BSIM3v32_MOD_PRT, IF_REAL, "Temperature coefficient of parasitic resistance "), -IOP( "eta0", BSIM3v32_MOD_ETA0, IF_REAL, "Subthreshold region DIBL coefficient"), -IOP( "etab", BSIM3v32_MOD_ETAB, IF_REAL, "Subthreshold region DIBL coefficient"), -IOP( "pclm", BSIM3v32_MOD_PCLM, IF_REAL, "Channel length modulation Coefficient"), -IOP( "pdiblc1", BSIM3v32_MOD_PDIBL1, IF_REAL, "Drain-induced barrier lowering coefficient"), -IOP( "pdiblc2", BSIM3v32_MOD_PDIBL2, IF_REAL, "Drain-induced barrier lowering coefficient"), -IOP( "pdiblcb", BSIM3v32_MOD_PDIBLB, IF_REAL, "Body-effect on drain-induced barrier lowering"), -IOP( "pscbe1", BSIM3v32_MOD_PSCBE1, IF_REAL, "Substrate current body-effect coefficient"), -IOP( "pscbe2", BSIM3v32_MOD_PSCBE2, IF_REAL, "Substrate current body-effect coefficient"), -IOP( "pvag", BSIM3v32_MOD_PVAG, IF_REAL, "Gate dependence of output resistance parameter"), -IOP( "js", BSIM3v32_MOD_JS, IF_REAL, "Source/drain junction reverse saturation current density"), -IOP( "jsw", BSIM3v32_MOD_JSW, IF_REAL, "Sidewall junction reverse saturation current density"), -IOP( "pb", BSIM3v32_MOD_PB, IF_REAL, "Source/drain junction built-in potential"), -IOP( "nj", BSIM3v32_MOD_NJ, IF_REAL, "Source/drain junction emission coefficient"), -IOP( "xti", BSIM3v32_MOD_XTI, IF_REAL, "Junction current temperature exponent"), -IOP( "mj", BSIM3v32_MOD_MJ, IF_REAL, "Source/drain bottom junction capacitance grading coefficient"), -IOP( "pbsw", BSIM3v32_MOD_PBSW, IF_REAL, "Source/drain sidewall junction capacitance built in potential"), -IOP( "mjsw", BSIM3v32_MOD_MJSW, IF_REAL, "Source/drain sidewall junction capacitance grading coefficient"), -IOP( "pbswg", BSIM3v32_MOD_PBSWG, IF_REAL, "Source/drain (gate side) sidewall junction capacitance built in potential"), -IOP( "mjswg", BSIM3v32_MOD_MJSWG, IF_REAL, "Source/drain (gate side) sidewall junction capacitance grading coefficient"), -IOP( "cj", BSIM3v32_MOD_CJ, IF_REAL, "Source/drain bottom junction capacitance per unit area"), -IOP( "vfbcv", BSIM3v32_MOD_VFBCV, IF_REAL, "Flat Band Voltage parameter for capmod=0 only"), -IOP( "vfb", BSIM3v32_MOD_VFB, IF_REAL, "Flat Band Voltage"), -IOP( "cjsw", BSIM3v32_MOD_CJSW, IF_REAL, "Source/drain sidewall junction capacitance per unit periphery"), -IOP( "cjswg", BSIM3v32_MOD_CJSWG, IF_REAL, "Source/drain (gate side) sidewall junction capacitance per unit width"), -IOP( "tpb", BSIM3v32_MOD_TPB, IF_REAL, "Temperature coefficient of pb"), -IOP( "tcj", BSIM3v32_MOD_TCJ, IF_REAL, "Temperature coefficient of cj"), -IOP( "tpbsw", BSIM3v32_MOD_TPBSW, IF_REAL, "Temperature coefficient of pbsw"), -IOP( "tcjsw", BSIM3v32_MOD_TCJSW, IF_REAL, "Temperature coefficient of cjsw"), -IOP( "tpbswg", BSIM3v32_MOD_TPBSWG, IF_REAL, "Temperature coefficient of pbswg"), -IOP( "tcjswg", BSIM3v32_MOD_TCJSWG, IF_REAL, "Temperature coefficient of cjswg"), -IOP( "acde", BSIM3v32_MOD_ACDE, IF_REAL, "Exponential coefficient for finite charge thickness"), -IOP( "moin", BSIM3v32_MOD_MOIN, IF_REAL, "Coefficient for gate-bias dependent surface potential"), -IOP( "noff", BSIM3v32_MOD_NOFF, IF_REAL, "C-V turn-on/off parameter"), -IOP( "voffcv", BSIM3v32_MOD_VOFFCV, IF_REAL, "C-V lateral-shift parameter"), -IOP( "lint", BSIM3v32_MOD_LINT, IF_REAL, "Length reduction parameter"), -IOP( "ll", BSIM3v32_MOD_LL, IF_REAL, "Length reduction parameter"), -IOP( "llc", BSIM3v32_MOD_LLC, IF_REAL, "Length reduction parameter for CV"), -IOP( "lln", BSIM3v32_MOD_LLN, IF_REAL, "Length reduction parameter"), -IOP( "lw", BSIM3v32_MOD_LW, IF_REAL, "Length reduction parameter"), -IOP( "lwc", BSIM3v32_MOD_LWC, IF_REAL, "Length reduction parameter for CV"), -IOP( "lwn", BSIM3v32_MOD_LWN, IF_REAL, "Length reduction parameter"), -IOP( "lwl", BSIM3v32_MOD_LWL, IF_REAL, "Length reduction parameter"), -IOP( "lwlc", BSIM3v32_MOD_LWLC, IF_REAL, "Length reduction parameter for CV"), -IOP( "lmin", BSIM3v32_MOD_LMIN, IF_REAL, "Minimum length for the model"), -IOP( "lmax", BSIM3v32_MOD_LMAX, IF_REAL, "Maximum length for the model"), - -IOP( "xl", BSIM3v32_MOD_XL, IF_REAL, "Length correction parameter"), -IOP( "xw", BSIM3v32_MOD_XW, IF_REAL, "Width correction parameter"), - -IOP( "wr", BSIM3v32_MOD_WR, IF_REAL, "Width dependence of rds"), -IOP( "wint", BSIM3v32_MOD_WINT, IF_REAL, "Width reduction parameter"), -IOP( "dwg", BSIM3v32_MOD_DWG, IF_REAL, "Width reduction parameter"), -IOP( "dwb", BSIM3v32_MOD_DWB, IF_REAL, "Width reduction parameter"), - -IOP( "wl", BSIM3v32_MOD_WL, IF_REAL, "Width reduction parameter"), -IOP( "wlc", BSIM3v32_MOD_WLC, IF_REAL, "Width reduction parameter for CV"), -IOP( "wln", BSIM3v32_MOD_WLN, IF_REAL, "Width reduction parameter"), -IOP( "ww", BSIM3v32_MOD_WW, IF_REAL, "Width reduction parameter"), -IOP( "wwc", BSIM3v32_MOD_WWC, IF_REAL, "Width reduction parameter for CV"), -IOP( "wwn", BSIM3v32_MOD_WWN, IF_REAL, "Width reduction parameter"), -IOP( "wwl", BSIM3v32_MOD_WWL, IF_REAL, "Width reduction parameter"), -IOP( "wwlc", BSIM3v32_MOD_WWLC, IF_REAL, "Width reduction parameter for CV"), -IOP( "wmin", BSIM3v32_MOD_WMIN, IF_REAL, "Minimum width for the model"), -IOP( "wmax", BSIM3v32_MOD_WMAX, IF_REAL, "Maximum width for the model"), - -IOP( "b0", BSIM3v32_MOD_B0, IF_REAL, "Abulk narrow width parameter"), -IOP( "b1", BSIM3v32_MOD_B1, IF_REAL, "Abulk narrow width parameter"), - -IOP( "cgsl", BSIM3v32_MOD_CGSL, IF_REAL, "New C-V model parameter"), -IOP( "cgdl", BSIM3v32_MOD_CGDL, IF_REAL, "New C-V model parameter"), -IOP( "ckappa", BSIM3v32_MOD_CKAPPA, IF_REAL, "New C-V model parameter"), -IOP( "cf", BSIM3v32_MOD_CF, IF_REAL, "Fringe capacitance parameter"), -IOP( "clc", BSIM3v32_MOD_CLC, IF_REAL, "Vdsat parameter for C-V model"), -IOP( "cle", BSIM3v32_MOD_CLE, IF_REAL, "Vdsat parameter for C-V model"), -IOP( "dwc", BSIM3v32_MOD_DWC, IF_REAL, "Delta W for C-V model"), -IOP( "dlc", BSIM3v32_MOD_DLC, IF_REAL, "Delta L for C-V model"), - -IOP( "hdif", BSIM3v32_MOD_HDIF, IF_REAL, "ACM Parameter: Distance Gate - contact"), -IOP( "ldif", BSIM3v32_MOD_LDIF, IF_REAL, "ACM Parameter: Length of LDD Gate-Source/Drain"), -IOP( "ld", BSIM3v32_MOD_LD, IF_REAL, "ACM Parameter: Length of LDD under Gate"), -IOP( "rd", BSIM3v32_MOD_RD, IF_REAL, "ACM Parameter: Resistance of LDD drain side"), -IOP( "rs", BSIM3v32_MOD_RS, IF_REAL, "ACM Parameter: Resistance of LDD source side"), -IOP( "rdc", BSIM3v32_MOD_RDC, IF_REAL, "ACM Parameter: Resistance contact drain side"), -IOP( "rsc", BSIM3v32_MOD_RSC, IF_REAL, "ACM Parameter: Resistance contact source side"), -IOP( "wmlt", BSIM3v32_MOD_WMLT, IF_REAL, "ACM Parameter: Width shrink factor"), - -IOP( "lmlt", BSIM3v32_MOD_LMLT, IF_REAL, "Channel length shrink factor"), - -IOP( "alpha0", BSIM3v32_MOD_ALPHA0, IF_REAL, "substrate current model parameter"), -IOP( "alpha1", BSIM3v32_MOD_ALPHA1, IF_REAL, "substrate current model parameter"), -IOP( "beta0", BSIM3v32_MOD_BETA0, IF_REAL, "substrate current model parameter"), -IOP( "ijth", BSIM3v32_MOD_IJTH, IF_REAL, "Diode limiting current"), - -IOP( "lcdsc", BSIM3v32_MOD_LCDSC, IF_REAL, "Length dependence of cdsc"), -IOP( "lcdscb", BSIM3v32_MOD_LCDSCB, IF_REAL, "Length dependence of cdscb"), -IOP( "lcdscd", BSIM3v32_MOD_LCDSCD, IF_REAL, "Length dependence of cdscd"), -IOP( "lcit", BSIM3v32_MOD_LCIT, IF_REAL, "Length dependence of cit"), -IOP( "lnfactor", BSIM3v32_MOD_LNFACTOR, IF_REAL, "Length dependence of nfactor"), -IOP( "lxj", BSIM3v32_MOD_LXJ, IF_REAL, "Length dependence of xj"), -IOP( "lvsat", BSIM3v32_MOD_LVSAT, IF_REAL, "Length dependence of vsat"), -IOP( "lat", BSIM3v32_MOD_LAT, IF_REAL, "Length dependence of at"), -IOP( "la0", BSIM3v32_MOD_LA0, IF_REAL, "Length dependence of a0"), -IOP( "lags", BSIM3v32_MOD_LAGS, IF_REAL, "Length dependence of ags"), -IOP( "la1", BSIM3v32_MOD_LA1, IF_REAL, "Length dependence of a1"), -IOP( "la2", BSIM3v32_MOD_LA2, IF_REAL, "Length dependence of a2"), -IOP( "lketa", BSIM3v32_MOD_LKETA, IF_REAL, "Length dependence of keta"), -IOP( "lnsub", BSIM3v32_MOD_LNSUB, IF_REAL, "Length dependence of nsub"), -IOP( "lnch", BSIM3v32_MOD_LNPEAK, IF_REAL, "Length dependence of nch"), -IOP( "lngate", BSIM3v32_MOD_LNGATE, IF_REAL, "Length dependence of ngate"), -IOP( "lgamma1", BSIM3v32_MOD_LGAMMA1, IF_REAL, "Length dependence of gamma1"), -IOP( "lgamma2", BSIM3v32_MOD_LGAMMA2, IF_REAL, "Length dependence of gamma2"), -IOP( "lvbx", BSIM3v32_MOD_LVBX, IF_REAL, "Length dependence of vbx"), -IOP( "lvbm", BSIM3v32_MOD_LVBM, IF_REAL, "Length dependence of vbm"), -IOP( "lxt", BSIM3v32_MOD_LXT, IF_REAL, "Length dependence of xt"), -IOP( "lk1", BSIM3v32_MOD_LK1, IF_REAL, "Length dependence of k1"), -IOP( "lkt1", BSIM3v32_MOD_LKT1, IF_REAL, "Length dependence of kt1"), -IOP( "lkt1l", BSIM3v32_MOD_LKT1L, IF_REAL, "Length dependence of kt1l"), -IOP( "lkt2", BSIM3v32_MOD_LKT2, IF_REAL, "Length dependence of kt2"), -IOP( "lk2", BSIM3v32_MOD_LK2, IF_REAL, "Length dependence of k2"), -IOP( "lk3", BSIM3v32_MOD_LK3, IF_REAL, "Length dependence of k3"), -IOP( "lk3b", BSIM3v32_MOD_LK3B, IF_REAL, "Length dependence of k3b"), -IOP( "lw0", BSIM3v32_MOD_LW0, IF_REAL, "Length dependence of w0"), -IOP( "lnlx", BSIM3v32_MOD_LNLX, IF_REAL, "Length dependence of nlx"), -IOP( "ldvt0", BSIM3v32_MOD_LDVT0, IF_REAL, "Length dependence of dvt0"), -IOP( "ldvt1", BSIM3v32_MOD_LDVT1, IF_REAL, "Length dependence of dvt1"), -IOP( "ldvt2", BSIM3v32_MOD_LDVT2, IF_REAL, "Length dependence of dvt2"), -IOP( "ldvt0w", BSIM3v32_MOD_LDVT0W, IF_REAL, "Length dependence of dvt0w"), -IOP( "ldvt1w", BSIM3v32_MOD_LDVT1W, IF_REAL, "Length dependence of dvt1w"), -IOP( "ldvt2w", BSIM3v32_MOD_LDVT2W, IF_REAL, "Length dependence of dvt2w"), -IOP( "ldrout", BSIM3v32_MOD_LDROUT, IF_REAL, "Length dependence of drout"), -IOP( "ldsub", BSIM3v32_MOD_LDSUB, IF_REAL, "Length dependence of dsub"), -IOP( "lvth0", BSIM3v32_MOD_LVTH0, IF_REAL,"Length dependence of vth0"), -IOPR("lvtho", BSIM3v32_MOD_LVTH0, IF_REAL,"Length dependence of vtho"), -IOP( "lua", BSIM3v32_MOD_LUA, IF_REAL, "Length dependence of ua"), -IOP( "lua1", BSIM3v32_MOD_LUA1, IF_REAL, "Length dependence of ua1"), -IOP( "lub", BSIM3v32_MOD_LUB, IF_REAL, "Length dependence of ub"), -IOP( "lub1", BSIM3v32_MOD_LUB1, IF_REAL, "Length dependence of ub1"), -IOP( "luc", BSIM3v32_MOD_LUC, IF_REAL, "Length dependence of uc"), -IOP( "luc1", BSIM3v32_MOD_LUC1, IF_REAL, "Length dependence of uc1"), -IOP( "lu0", BSIM3v32_MOD_LU0, IF_REAL, "Length dependence of u0"), -IOP( "lute", BSIM3v32_MOD_LUTE, IF_REAL, "Length dependence of ute"), -IOP( "lvoff", BSIM3v32_MOD_LVOFF, IF_REAL, "Length dependence of voff"), -IOP( "lelm", BSIM3v32_MOD_LELM, IF_REAL, "Length dependence of elm"), -IOP( "ldelta", BSIM3v32_MOD_LDELTA, IF_REAL, "Length dependence of delta"), -IOP( "lrdsw", BSIM3v32_MOD_LRDSW, IF_REAL, "Length dependence of rdsw "), - -IOP( "lprwg", BSIM3v32_MOD_LPRWG, IF_REAL, "Length dependence of prwg "), -IOP( "lprwb", BSIM3v32_MOD_LPRWB, IF_REAL, "Length dependence of prwb "), - -IOP( "lprt", BSIM3v32_MOD_LPRT, IF_REAL, "Length dependence of prt "), -IOP( "leta0", BSIM3v32_MOD_LETA0, IF_REAL, "Length dependence of eta0"), -IOP( "letab", BSIM3v32_MOD_LETAB, IF_REAL, "Length dependence of etab"), -IOP( "lpclm", BSIM3v32_MOD_LPCLM, IF_REAL, "Length dependence of pclm"), -IOP( "lpdiblc1", BSIM3v32_MOD_LPDIBL1, IF_REAL, "Length dependence of pdiblc1"), -IOP( "lpdiblc2", BSIM3v32_MOD_LPDIBL2, IF_REAL, "Length dependence of pdiblc2"), -IOP( "lpdiblcb", BSIM3v32_MOD_LPDIBLB, IF_REAL, "Length dependence of pdiblcb"), -IOP( "lpscbe1", BSIM3v32_MOD_LPSCBE1, IF_REAL, "Length dependence of pscbe1"), -IOP( "lpscbe2", BSIM3v32_MOD_LPSCBE2, IF_REAL, "Length dependence of pscbe2"), -IOP( "lpvag", BSIM3v32_MOD_LPVAG, IF_REAL, "Length dependence of pvag"), -IOP( "lwr", BSIM3v32_MOD_LWR, IF_REAL, "Length dependence of wr"), -IOP( "ldwg", BSIM3v32_MOD_LDWG, IF_REAL, "Length dependence of dwg"), -IOP( "ldwb", BSIM3v32_MOD_LDWB, IF_REAL, "Length dependence of dwb"), -IOP( "lb0", BSIM3v32_MOD_LB0, IF_REAL, "Length dependence of b0"), -IOP( "lb1", BSIM3v32_MOD_LB1, IF_REAL, "Length dependence of b1"), -IOP( "lcgsl", BSIM3v32_MOD_LCGSL, IF_REAL, "Length dependence of cgsl"), -IOP( "lcgdl", BSIM3v32_MOD_LCGDL, IF_REAL, "Length dependence of cgdl"), -IOP( "lckappa", BSIM3v32_MOD_LCKAPPA, IF_REAL, "Length dependence of ckappa"), -IOP( "lcf", BSIM3v32_MOD_LCF, IF_REAL, "Length dependence of cf"), -IOP( "lclc", BSIM3v32_MOD_LCLC, IF_REAL, "Length dependence of clc"), -IOP( "lcle", BSIM3v32_MOD_LCLE, IF_REAL, "Length dependence of cle"), -IOP( "lalpha0", BSIM3v32_MOD_LALPHA0, IF_REAL, "Length dependence of alpha0"), -IOP( "lalpha1", BSIM3v32_MOD_LALPHA1, IF_REAL, "Length dependence of alpha1"), -IOP( "lbeta0", BSIM3v32_MOD_LBETA0, IF_REAL, "Length dependence of beta0"), -IOP( "lvfbcv", BSIM3v32_MOD_LVFBCV, IF_REAL, "Length dependence of vfbcv"), -IOP( "lvfb", BSIM3v32_MOD_LVFB, IF_REAL, "Length dependence of vfb"), -IOP( "lacde", BSIM3v32_MOD_LACDE, IF_REAL, "Length dependence of acde"), -IOP( "lmoin", BSIM3v32_MOD_LMOIN, IF_REAL, "Length dependence of moin"), -IOP( "lnoff", BSIM3v32_MOD_LNOFF, IF_REAL, "Length dependence of noff"), -IOP( "lvoffcv", BSIM3v32_MOD_LVOFFCV, IF_REAL, "Length dependence of voffcv"), -IOP( "wcdsc", BSIM3v32_MOD_WCDSC, IF_REAL, "Width dependence of cdsc"), -IOP( "wcdscb", BSIM3v32_MOD_WCDSCB, IF_REAL, "Width dependence of cdscb"), -IOP( "wcdscd", BSIM3v32_MOD_WCDSCD, IF_REAL, "Width dependence of cdscd"), -IOP( "wcit", BSIM3v32_MOD_WCIT, IF_REAL, "Width dependence of cit"), -IOP( "wnfactor", BSIM3v32_MOD_WNFACTOR, IF_REAL, "Width dependence of nfactor"), -IOP( "wxj", BSIM3v32_MOD_WXJ, IF_REAL, "Width dependence of xj"), -IOP( "wvsat", BSIM3v32_MOD_WVSAT, IF_REAL, "Width dependence of vsat"), -IOP( "wat", BSIM3v32_MOD_WAT, IF_REAL, "Width dependence of at"), -IOP( "wa0", BSIM3v32_MOD_WA0, IF_REAL, "Width dependence of a0"), -IOP( "wags", BSIM3v32_MOD_WAGS, IF_REAL, "Width dependence of ags"), -IOP( "wa1", BSIM3v32_MOD_WA1, IF_REAL, "Width dependence of a1"), -IOP( "wa2", BSIM3v32_MOD_WA2, IF_REAL, "Width dependence of a2"), -IOP( "wketa", BSIM3v32_MOD_WKETA, IF_REAL, "Width dependence of keta"), -IOP( "wnsub", BSIM3v32_MOD_WNSUB, IF_REAL, "Width dependence of nsub"), -IOP( "wnch", BSIM3v32_MOD_WNPEAK, IF_REAL, "Width dependence of nch"), -IOP( "wngate", BSIM3v32_MOD_WNGATE, IF_REAL, "Width dependence of ngate"), -IOP( "wgamma1", BSIM3v32_MOD_WGAMMA1, IF_REAL, "Width dependence of gamma1"), -IOP( "wgamma2", BSIM3v32_MOD_WGAMMA2, IF_REAL, "Width dependence of gamma2"), -IOP( "wvbx", BSIM3v32_MOD_WVBX, IF_REAL, "Width dependence of vbx"), -IOP( "wvbm", BSIM3v32_MOD_WVBM, IF_REAL, "Width dependence of vbm"), -IOP( "wxt", BSIM3v32_MOD_WXT, IF_REAL, "Width dependence of xt"), -IOP( "wk1", BSIM3v32_MOD_WK1, IF_REAL, "Width dependence of k1"), -IOP( "wkt1", BSIM3v32_MOD_WKT1, IF_REAL, "Width dependence of kt1"), -IOP( "wkt1l", BSIM3v32_MOD_WKT1L, IF_REAL, "Width dependence of kt1l"), -IOP( "wkt2", BSIM3v32_MOD_WKT2, IF_REAL, "Width dependence of kt2"), -IOP( "wk2", BSIM3v32_MOD_WK2, IF_REAL, "Width dependence of k2"), -IOP( "wk3", BSIM3v32_MOD_WK3, IF_REAL, "Width dependence of k3"), -IOP( "wk3b", BSIM3v32_MOD_WK3B, IF_REAL, "Width dependence of k3b"), -IOP( "ww0", BSIM3v32_MOD_WW0, IF_REAL, "Width dependence of w0"), -IOP( "wnlx", BSIM3v32_MOD_WNLX, IF_REAL, "Width dependence of nlx"), -IOP( "wdvt0", BSIM3v32_MOD_WDVT0, IF_REAL, "Width dependence of dvt0"), -IOP( "wdvt1", BSIM3v32_MOD_WDVT1, IF_REAL, "Width dependence of dvt1"), -IOP( "wdvt2", BSIM3v32_MOD_WDVT2, IF_REAL, "Width dependence of dvt2"), -IOP( "wdvt0w", BSIM3v32_MOD_WDVT0W, IF_REAL, "Width dependence of dvt0w"), -IOP( "wdvt1w", BSIM3v32_MOD_WDVT1W, IF_REAL, "Width dependence of dvt1w"), -IOP( "wdvt2w", BSIM3v32_MOD_WDVT2W, IF_REAL, "Width dependence of dvt2w"), -IOP( "wdrout", BSIM3v32_MOD_WDROUT, IF_REAL, "Width dependence of drout"), -IOP( "wdsub", BSIM3v32_MOD_WDSUB, IF_REAL, "Width dependence of dsub"), -IOP( "wvth0", BSIM3v32_MOD_WVTH0, IF_REAL,"Width dependence of vth0"), -IOPR("wvtho", BSIM3v32_MOD_WVTH0, IF_REAL,"Width dependence of vtho"), -IOP( "wua", BSIM3v32_MOD_WUA, IF_REAL, "Width dependence of ua"), -IOP( "wua1", BSIM3v32_MOD_WUA1, IF_REAL, "Width dependence of ua1"), -IOP( "wub", BSIM3v32_MOD_WUB, IF_REAL, "Width dependence of ub"), -IOP( "wub1", BSIM3v32_MOD_WUB1, IF_REAL, "Width dependence of ub1"), -IOP( "wuc", BSIM3v32_MOD_WUC, IF_REAL, "Width dependence of uc"), -IOP( "wuc1", BSIM3v32_MOD_WUC1, IF_REAL, "Width dependence of uc1"), -IOP( "wu0", BSIM3v32_MOD_WU0, IF_REAL, "Width dependence of u0"), -IOP( "wute", BSIM3v32_MOD_WUTE, IF_REAL, "Width dependence of ute"), -IOP( "wvoff", BSIM3v32_MOD_WVOFF, IF_REAL, "Width dependence of voff"), -IOP( "welm", BSIM3v32_MOD_WELM, IF_REAL, "Width dependence of elm"), -IOP( "wdelta", BSIM3v32_MOD_WDELTA, IF_REAL, "Width dependence of delta"), -IOP( "wrdsw", BSIM3v32_MOD_WRDSW, IF_REAL, "Width dependence of rdsw "), - -IOP( "wprwg", BSIM3v32_MOD_WPRWG, IF_REAL, "Width dependence of prwg "), -IOP( "wprwb", BSIM3v32_MOD_WPRWB, IF_REAL, "Width dependence of prwb "), - -IOP( "wprt", BSIM3v32_MOD_WPRT, IF_REAL, "Width dependence of prt"), -IOP( "weta0", BSIM3v32_MOD_WETA0, IF_REAL, "Width dependence of eta0"), -IOP( "wetab", BSIM3v32_MOD_WETAB, IF_REAL, "Width dependence of etab"), -IOP( "wpclm", BSIM3v32_MOD_WPCLM, IF_REAL, "Width dependence of pclm"), -IOP( "wpdiblc1", BSIM3v32_MOD_WPDIBL1, IF_REAL, "Width dependence of pdiblc1"), -IOP( "wpdiblc2", BSIM3v32_MOD_WPDIBL2, IF_REAL, "Width dependence of pdiblc2"), -IOP( "wpdiblcb", BSIM3v32_MOD_WPDIBLB, IF_REAL, "Width dependence of pdiblcb"), -IOP( "wpscbe1", BSIM3v32_MOD_WPSCBE1, IF_REAL, "Width dependence of pscbe1"), -IOP( "wpscbe2", BSIM3v32_MOD_WPSCBE2, IF_REAL, "Width dependence of pscbe2"), -IOP( "wpvag", BSIM3v32_MOD_WPVAG, IF_REAL, "Width dependence of pvag"), -IOP( "wwr", BSIM3v32_MOD_WWR, IF_REAL, "Width dependence of wr"), -IOP( "wdwg", BSIM3v32_MOD_WDWG, IF_REAL, "Width dependence of dwg"), -IOP( "wdwb", BSIM3v32_MOD_WDWB, IF_REAL, "Width dependence of dwb"), -IOP( "wb0", BSIM3v32_MOD_WB0, IF_REAL, "Width dependence of b0"), -IOP( "wb1", BSIM3v32_MOD_WB1, IF_REAL, "Width dependence of b1"), -IOP( "wcgsl", BSIM3v32_MOD_WCGSL, IF_REAL, "Width dependence of cgsl"), -IOP( "wcgdl", BSIM3v32_MOD_WCGDL, IF_REAL, "Width dependence of cgdl"), -IOP( "wckappa", BSIM3v32_MOD_WCKAPPA, IF_REAL, "Width dependence of ckappa"), -IOP( "wcf", BSIM3v32_MOD_WCF, IF_REAL, "Width dependence of cf"), -IOP( "wclc", BSIM3v32_MOD_WCLC, IF_REAL, "Width dependence of clc"), -IOP( "wcle", BSIM3v32_MOD_WCLE, IF_REAL, "Width dependence of cle"), -IOP( "walpha0", BSIM3v32_MOD_WALPHA0, IF_REAL, "Width dependence of alpha0"), -IOP( "walpha1", BSIM3v32_MOD_WALPHA1, IF_REAL, "Width dependence of alpha1"), -IOP( "wbeta0", BSIM3v32_MOD_WBETA0, IF_REAL, "Width dependence of beta0"), -IOP( "wvfbcv", BSIM3v32_MOD_WVFBCV, IF_REAL, "Width dependence of vfbcv"), -IOP( "wvfb", BSIM3v32_MOD_WVFB, IF_REAL, "Width dependence of vfb"), -IOP( "wacde", BSIM3v32_MOD_WACDE, IF_REAL, "Width dependence of acde"), -IOP( "wmoin", BSIM3v32_MOD_WMOIN, IF_REAL, "Width dependence of moin"), -IOP( "wnoff", BSIM3v32_MOD_WNOFF, IF_REAL, "Width dependence of noff"), -IOP( "wvoffcv", BSIM3v32_MOD_WVOFFCV, IF_REAL, "Width dependence of voffcv"), - -IOP( "pcdsc", BSIM3v32_MOD_PCDSC, IF_REAL, "Cross-term dependence of cdsc"), -IOP( "pcdscb", BSIM3v32_MOD_PCDSCB, IF_REAL, "Cross-term dependence of cdscb"), -IOP( "pcdscd", BSIM3v32_MOD_PCDSCD, IF_REAL, "Cross-term dependence of cdscd"), -IOP( "pcit", BSIM3v32_MOD_PCIT, IF_REAL, "Cross-term dependence of cit"), -IOP( "pnfactor", BSIM3v32_MOD_PNFACTOR, IF_REAL, "Cross-term dependence of nfactor"), -IOP( "pxj", BSIM3v32_MOD_PXJ, IF_REAL, "Cross-term dependence of xj"), -IOP( "pvsat", BSIM3v32_MOD_PVSAT, IF_REAL, "Cross-term dependence of vsat"), -IOP( "pat", BSIM3v32_MOD_PAT, IF_REAL, "Cross-term dependence of at"), -IOP( "pa0", BSIM3v32_MOD_PA0, IF_REAL, "Cross-term dependence of a0"), -IOP( "pags", BSIM3v32_MOD_PAGS, IF_REAL, "Cross-term dependence of ags"), -IOP( "pa1", BSIM3v32_MOD_PA1, IF_REAL, "Cross-term dependence of a1"), -IOP( "pa2", BSIM3v32_MOD_PA2, IF_REAL, "Cross-term dependence of a2"), -IOP( "pketa", BSIM3v32_MOD_PKETA, IF_REAL, "Cross-term dependence of keta"), -IOP( "pnsub", BSIM3v32_MOD_PNSUB, IF_REAL, "Cross-term dependence of nsub"), -IOP( "pnch", BSIM3v32_MOD_PNPEAK, IF_REAL, "Cross-term dependence of nch"), -IOP( "pngate", BSIM3v32_MOD_PNGATE, IF_REAL, "Cross-term dependence of ngate"), -IOP( "pgamma1", BSIM3v32_MOD_PGAMMA1, IF_REAL, "Cross-term dependence of gamma1"), -IOP( "pgamma2", BSIM3v32_MOD_PGAMMA2, IF_REAL, "Cross-term dependence of gamma2"), -IOP( "pvbx", BSIM3v32_MOD_PVBX, IF_REAL, "Cross-term dependence of vbx"), -IOP( "pvbm", BSIM3v32_MOD_PVBM, IF_REAL, "Cross-term dependence of vbm"), -IOP( "pxt", BSIM3v32_MOD_PXT, IF_REAL, "Cross-term dependence of xt"), -IOP( "pk1", BSIM3v32_MOD_PK1, IF_REAL, "Cross-term dependence of k1"), -IOP( "pkt1", BSIM3v32_MOD_PKT1, IF_REAL, "Cross-term dependence of kt1"), -IOP( "pkt1l", BSIM3v32_MOD_PKT1L, IF_REAL, "Cross-term dependence of kt1l"), -IOP( "pkt2", BSIM3v32_MOD_PKT2, IF_REAL, "Cross-term dependence of kt2"), -IOP( "pk2", BSIM3v32_MOD_PK2, IF_REAL, "Cross-term dependence of k2"), -IOP( "pk3", BSIM3v32_MOD_PK3, IF_REAL, "Cross-term dependence of k3"), -IOP( "pk3b", BSIM3v32_MOD_PK3B, IF_REAL, "Cross-term dependence of k3b"), -IOP( "pw0", BSIM3v32_MOD_PW0, IF_REAL, "Cross-term dependence of w0"), -IOP( "pnlx", BSIM3v32_MOD_PNLX, IF_REAL, "Cross-term dependence of nlx"), -IOP( "pdvt0", BSIM3v32_MOD_PDVT0, IF_REAL, "Cross-term dependence of dvt0"), -IOP( "pdvt1", BSIM3v32_MOD_PDVT1, IF_REAL, "Cross-term dependence of dvt1"), -IOP( "pdvt2", BSIM3v32_MOD_PDVT2, IF_REAL, "Cross-term dependence of dvt2"), -IOP( "pdvt0w", BSIM3v32_MOD_PDVT0W, IF_REAL, "Cross-term dependence of dvt0w"), -IOP( "pdvt1w", BSIM3v32_MOD_PDVT1W, IF_REAL, "Cross-term dependence of dvt1w"), -IOP( "pdvt2w", BSIM3v32_MOD_PDVT2W, IF_REAL, "Cross-term dependence of dvt2w"), -IOP( "pdrout", BSIM3v32_MOD_PDROUT, IF_REAL, "Cross-term dependence of drout"), -IOP( "pdsub", BSIM3v32_MOD_PDSUB, IF_REAL, "Cross-term dependence of dsub"), -IOP( "pvth0", BSIM3v32_MOD_PVTH0, IF_REAL,"Cross-term dependence of vth0"), -IOPR("pvtho", BSIM3v32_MOD_PVTH0, IF_REAL,"Cross-term dependence of vtho"), -IOP( "pua", BSIM3v32_MOD_PUA, IF_REAL, "Cross-term dependence of ua"), -IOP( "pua1", BSIM3v32_MOD_PUA1, IF_REAL, "Cross-term dependence of ua1"), -IOP( "pub", BSIM3v32_MOD_PUB, IF_REAL, "Cross-term dependence of ub"), -IOP( "pub1", BSIM3v32_MOD_PUB1, IF_REAL, "Cross-term dependence of ub1"), -IOP( "puc", BSIM3v32_MOD_PUC, IF_REAL, "Cross-term dependence of uc"), -IOP( "puc1", BSIM3v32_MOD_PUC1, IF_REAL, "Cross-term dependence of uc1"), -IOP( "pu0", BSIM3v32_MOD_PU0, IF_REAL, "Cross-term dependence of u0"), -IOP( "pute", BSIM3v32_MOD_PUTE, IF_REAL, "Cross-term dependence of ute"), -IOP( "pvoff", BSIM3v32_MOD_PVOFF, IF_REAL, "Cross-term dependence of voff"), -IOP( "pelm", BSIM3v32_MOD_PELM, IF_REAL, "Cross-term dependence of elm"), -IOP( "pdelta", BSIM3v32_MOD_PDELTA, IF_REAL, "Cross-term dependence of delta"), -IOP( "prdsw", BSIM3v32_MOD_PRDSW, IF_REAL, "Cross-term dependence of rdsw "), - -IOP( "pprwg", BSIM3v32_MOD_PPRWG, IF_REAL, "Cross-term dependence of prwg "), -IOP( "pprwb", BSIM3v32_MOD_PPRWB, IF_REAL, "Cross-term dependence of prwb "), - -IOP( "pprt", BSIM3v32_MOD_PPRT, IF_REAL, "Cross-term dependence of prt "), -IOP( "peta0", BSIM3v32_MOD_PETA0, IF_REAL, "Cross-term dependence of eta0"), -IOP( "petab", BSIM3v32_MOD_PETAB, IF_REAL, "Cross-term dependence of etab"), -IOP( "ppclm", BSIM3v32_MOD_PPCLM, IF_REAL, "Cross-term dependence of pclm"), -IOP( "ppdiblc1", BSIM3v32_MOD_PPDIBL1, IF_REAL, "Cross-term dependence of pdiblc1"), -IOP( "ppdiblc2", BSIM3v32_MOD_PPDIBL2, IF_REAL, "Cross-term dependence of pdiblc2"), -IOP( "ppdiblcb", BSIM3v32_MOD_PPDIBLB, IF_REAL, "Cross-term dependence of pdiblcb"), -IOP( "ppscbe1", BSIM3v32_MOD_PPSCBE1, IF_REAL, "Cross-term dependence of pscbe1"), -IOP( "ppscbe2", BSIM3v32_MOD_PPSCBE2, IF_REAL, "Cross-term dependence of pscbe2"), -IOP( "ppvag", BSIM3v32_MOD_PPVAG, IF_REAL, "Cross-term dependence of pvag"), -IOP( "pwr", BSIM3v32_MOD_PWR, IF_REAL, "Cross-term dependence of wr"), -IOP( "pdwg", BSIM3v32_MOD_PDWG, IF_REAL, "Cross-term dependence of dwg"), -IOP( "pdwb", BSIM3v32_MOD_PDWB, IF_REAL, "Cross-term dependence of dwb"), -IOP( "pb0", BSIM3v32_MOD_PB0, IF_REAL, "Cross-term dependence of b0"), -IOP( "pb1", BSIM3v32_MOD_PB1, IF_REAL, "Cross-term dependence of b1"), -IOP( "pcgsl", BSIM3v32_MOD_PCGSL, IF_REAL, "Cross-term dependence of cgsl"), -IOP( "pcgdl", BSIM3v32_MOD_PCGDL, IF_REAL, "Cross-term dependence of cgdl"), -IOP( "pckappa", BSIM3v32_MOD_PCKAPPA, IF_REAL, "Cross-term dependence of ckappa"), -IOP( "pcf", BSIM3v32_MOD_PCF, IF_REAL, "Cross-term dependence of cf"), -IOP( "pclc", BSIM3v32_MOD_PCLC, IF_REAL, "Cross-term dependence of clc"), -IOP( "pcle", BSIM3v32_MOD_PCLE, IF_REAL, "Cross-term dependence of cle"), -IOP( "palpha0", BSIM3v32_MOD_PALPHA0, IF_REAL, "Cross-term dependence of alpha0"), -IOP( "palpha1", BSIM3v32_MOD_PALPHA1, IF_REAL, "Cross-term dependence of alpha1"), -IOP( "pbeta0", BSIM3v32_MOD_PBETA0, IF_REAL, "Cross-term dependence of beta0"), -IOP( "pvfbcv", BSIM3v32_MOD_PVFBCV, IF_REAL, "Cross-term dependence of vfbcv"), -IOP( "pvfb", BSIM3v32_MOD_PVFB, IF_REAL, "Cross-term dependence of vfb"), -IOP( "pacde", BSIM3v32_MOD_PACDE, IF_REAL, "Cross-term dependence of acde"), -IOP( "pmoin", BSIM3v32_MOD_PMOIN, IF_REAL, "Cross-term dependence of moin"), -IOP( "pnoff", BSIM3v32_MOD_PNOFF, IF_REAL, "Cross-term dependence of noff"), -IOP( "pvoffcv", BSIM3v32_MOD_PVOFFCV, IF_REAL, "Cross-term dependence of voffcv"), - -IOP( "noia", BSIM3v32_MOD_NOIA, IF_REAL, "Flicker noise parameter"), -IOP( "noib", BSIM3v32_MOD_NOIB, IF_REAL, "Flicker noise parameter"), -IOP( "noic", BSIM3v32_MOD_NOIC, IF_REAL, "Flicker noise parameter"), -IOP( "em", BSIM3v32_MOD_EM, IF_REAL, "Flicker noise parameter"), -IOP( "ef", BSIM3v32_MOD_EF, IF_REAL, "Flicker noise frequency exponent"), -IOP( "af", BSIM3v32_MOD_AF, IF_REAL, "Flicker noise exponent"), -IOP( "kf", BSIM3v32_MOD_KF, IF_REAL, "Flicker noise coefficient"), - -IOP("vgs_max", BSIM3v32_MOD_VGS_MAX, IF_REAL, "maximum voltage G-S branch"), -IOP("vgd_max", BSIM3v32_MOD_VGD_MAX, IF_REAL, "maximum voltage G-D branch"), -IOP("vgb_max", BSIM3v32_MOD_VGB_MAX, IF_REAL, "maximum voltage G-B branch"), -IOP("vds_max", BSIM3v32_MOD_VDS_MAX, IF_REAL, "maximum voltage D-S branch"), -IOP("vbs_max", BSIM3v32_MOD_VBS_MAX, IF_REAL, "maximum voltage B-S branch"), -IOP("vbd_max", BSIM3v32_MOD_VBD_MAX, IF_REAL, "maximum voltage B-D branch"), -IOP("vgsr_max", BSIM3v32_MOD_VGSR_MAX, IF_REAL, "maximum voltage G-S branch"), -IOP("vgdr_max", BSIM3v32_MOD_VGDR_MAX, IF_REAL, "maximum voltage G-D branch"), -IOP("vgbr_max", BSIM3v32_MOD_VGBR_MAX, IF_REAL, "maximum voltage G-B branch"), -IOP("vbsr_max", BSIM3v32_MOD_VBSR_MAX, IF_REAL, "maximum voltage B-S branch"), -IOP("vbdr_max", BSIM3v32_MOD_VBDR_MAX, IF_REAL, "maximum voltage B-D branch"), - -IP( "nmos", BSIM3v32_MOD_NMOS, IF_FLAG, "Flag to indicate NMOS"), -IP( "pmos", BSIM3v32_MOD_PMOS, IF_FLAG, "Flag to indicate PMOS"), -}; - -char *BSIM3v32names[] = { - "Drain", - "Gate", - "Source", - "Bulk", - "Charge" -}; - -int BSIM3v32nSize = NUMELEMS(BSIM3v32names); -int BSIM3v32pTSize = NUMELEMS(BSIM3v32pTable); -int BSIM3v32mPTSize = NUMELEMS(BSIM3v32mPTable); -int BSIM3v32iSize = sizeof(BSIM3v32instance); -int BSIM3v32mSize = sizeof(BSIM3v32model); - - - diff --git a/src/spicelib/devices/bsim3v32/b3v32acld.c b/src/spicelib/devices/bsim3v32/b3v32acld.c deleted file mode 100644 index ee9326940..000000000 --- a/src/spicelib/devices/bsim3v32/b3v32acld.c +++ /dev/null @@ -1,361 +0,0 @@ -/**** BSIM3v3.2.4, Released by Xuemei Xi 12/14/2001 ****/ - -/********** - * Copyright 2001 Regents of the University of California. All rights reserved. - * File: b3acld.c of BSIM3v3.2.4 - * Author: 1995 Min-Chie Jeng and Mansun Chan - * Author: 1997-1999 Weidong Liu. - * Author: 2001 Xuemei Xi - * Modified by Paolo Nenzi 2002 and Dietmar Warning 2003 - **********/ - -#include "ngspice/ngspice.h" -#include "ngspice/cktdefs.h" -#include "bsim3v32def.h" -#include "ngspice/sperror.h" -#include "ngspice/suffix.h" - - -int -BSIM3v32acLoad (GENmodel *inModel, CKTcircuit *ckt) -{ -BSIM3v32model *model = (BSIM3v32model*)inModel; -BSIM3v32instance *here; -double xcggb, xcgdb, xcgsb, xcbgb, xcbdb, xcbsb, xcddb, xcssb, xcdgb; -double gdpr, gspr, gds, gbd, gbs, capbd, capbs, xcsgb, xcdsb, xcsdb; -double cggb, cgdb, cgsb, cbgb, cbdb, cbsb, cddb, cdgb, cdsb, omega; -double GSoverlapCap, GDoverlapCap, GBoverlapCap, FwdSum, RevSum, Gm, Gmbs; -double dxpart, sxpart, xgtg, xgtd, xgts, xgtb; -double xcqgb = 0.0, xcqdb = 0.0, xcqsb = 0.0, xcqbb = 0.0; -double gbspsp, gbbdp, gbbsp, gbspg, gbspb; -double gbspdp, gbdpdp, gbdpg, gbdpb, gbdpsp; -double ddxpart_dVd, ddxpart_dVg, ddxpart_dVb, ddxpart_dVs; -double dsxpart_dVd, dsxpart_dVg, dsxpart_dVb, dsxpart_dVs; -double T1, CoxWL, qcheq, Cdg, Cdd, Cds, Csg, Csd, Css; -double ScalingFactor = 1.0e-9; -double m; - - omega = ckt->CKTomega; - for (; model != NULL; model = BSIM3v32nextModel(model)) - { for (here = BSIM3v32instances(model); here!= NULL; - here = BSIM3v32nextInstance(here)) - { - if (here->BSIM3v32mode >= 0) - { Gm = here->BSIM3v32gm; - Gmbs = here->BSIM3v32gmbs; - FwdSum = Gm + Gmbs; - RevSum = 0.0; - - gbbdp = -here->BSIM3v32gbds; - gbbsp = here->BSIM3v32gbds + here->BSIM3v32gbgs + here->BSIM3v32gbbs; - - gbdpg = here->BSIM3v32gbgs; - gbdpb = here->BSIM3v32gbbs; - gbdpdp = here->BSIM3v32gbds; - gbdpsp = -(gbdpg + gbdpb + gbdpdp); - - gbspdp = 0.0; - gbspg = 0.0; - gbspb = 0.0; - gbspsp = 0.0; - - if (here->BSIM3v32nqsMod == 0) - { cggb = here->BSIM3v32cggb; - cgsb = here->BSIM3v32cgsb; - cgdb = here->BSIM3v32cgdb; - - cbgb = here->BSIM3v32cbgb; - cbsb = here->BSIM3v32cbsb; - cbdb = here->BSIM3v32cbdb; - - cdgb = here->BSIM3v32cdgb; - cdsb = here->BSIM3v32cdsb; - cddb = here->BSIM3v32cddb; - - xgtg = xgtd = xgts = xgtb = 0.0; - sxpart = 0.6; - dxpart = 0.4; - ddxpart_dVd = ddxpart_dVg = ddxpart_dVb - = ddxpart_dVs = 0.0; - dsxpart_dVd = dsxpart_dVg = dsxpart_dVb - = dsxpart_dVs = 0.0; - } - else - { cggb = cgdb = cgsb = 0.0; - cbgb = cbdb = cbsb = 0.0; - cdgb = cddb = cdsb = 0.0; - - xgtg = here->BSIM3v32gtg; - xgtd = here->BSIM3v32gtd; - xgts = here->BSIM3v32gts; - xgtb = here->BSIM3v32gtb; - - xcqgb = here->BSIM3v32cqgb * omega; - xcqdb = here->BSIM3v32cqdb * omega; - xcqsb = here->BSIM3v32cqsb * omega; - xcqbb = here->BSIM3v32cqbb * omega; - - CoxWL = model->BSIM3v32cox * here->pParam->BSIM3v32weffCV - * here->pParam->BSIM3v32leffCV; - qcheq = -(here->BSIM3v32qgate + here->BSIM3v32qbulk); - if (fabs(qcheq) <= 1.0e-5 * CoxWL) - { if (model->BSIM3v32xpart < 0.5) - { dxpart = 0.4; - } - else if (model->BSIM3v32xpart > 0.5) - { dxpart = 0.0; - } - else - { dxpart = 0.5; - } - ddxpart_dVd = ddxpart_dVg = ddxpart_dVb - = ddxpart_dVs = 0.0; - } - else - { dxpart = here->BSIM3v32qdrn / qcheq; - Cdd = here->BSIM3v32cddb; - Csd = -(here->BSIM3v32cgdb + here->BSIM3v32cddb - + here->BSIM3v32cbdb); - ddxpart_dVd = (Cdd - dxpart * (Cdd + Csd)) / qcheq; - Cdg = here->BSIM3v32cdgb; - Csg = -(here->BSIM3v32cggb + here->BSIM3v32cdgb - + here->BSIM3v32cbgb); - ddxpart_dVg = (Cdg - dxpart * (Cdg + Csg)) / qcheq; - - Cds = here->BSIM3v32cdsb; - Css = -(here->BSIM3v32cgsb + here->BSIM3v32cdsb - + here->BSIM3v32cbsb); - ddxpart_dVs = (Cds - dxpart * (Cds + Css)) / qcheq; - - ddxpart_dVb = -(ddxpart_dVd + ddxpart_dVg - + ddxpart_dVs); - } - sxpart = 1.0 - dxpart; - dsxpart_dVd = -ddxpart_dVd; - dsxpart_dVg = -ddxpart_dVg; - dsxpart_dVs = -ddxpart_dVs; - dsxpart_dVb = -(dsxpart_dVd + dsxpart_dVg + dsxpart_dVs); - } - } - else - { Gm = -here->BSIM3v32gm; - Gmbs = -here->BSIM3v32gmbs; - FwdSum = 0.0; - RevSum = -(Gm + Gmbs); - - gbbsp = -here->BSIM3v32gbds; - gbbdp = here->BSIM3v32gbds + here->BSIM3v32gbgs + here->BSIM3v32gbbs; - - gbdpg = 0.0; - gbdpsp = 0.0; - gbdpb = 0.0; - gbdpdp = 0.0; - - gbspg = here->BSIM3v32gbgs; - gbspsp = here->BSIM3v32gbds; - gbspb = here->BSIM3v32gbbs; - gbspdp = -(gbspg + gbspsp + gbspb); - - if (here->BSIM3v32nqsMod == 0) - { cggb = here->BSIM3v32cggb; - cgsb = here->BSIM3v32cgdb; - cgdb = here->BSIM3v32cgsb; - - cbgb = here->BSIM3v32cbgb; - cbsb = here->BSIM3v32cbdb; - cbdb = here->BSIM3v32cbsb; - - cdgb = -(here->BSIM3v32cdgb + cggb + cbgb); - cdsb = -(here->BSIM3v32cddb + cgsb + cbsb); - cddb = -(here->BSIM3v32cdsb + cgdb + cbdb); - - xgtg = xgtd = xgts = xgtb = 0.0; - sxpart = 0.4; - dxpart = 0.6; - ddxpart_dVd = ddxpart_dVg = ddxpart_dVb - = ddxpart_dVs = 0.0; - dsxpart_dVd = dsxpart_dVg = dsxpart_dVb - = dsxpart_dVs = 0.0; - } - else - { cggb = cgdb = cgsb = 0.0; - cbgb = cbdb = cbsb = 0.0; - cdgb = cddb = cdsb = 0.0; - - xgtg = here->BSIM3v32gtg; - xgtd = here->BSIM3v32gts; - xgts = here->BSIM3v32gtd; - xgtb = here->BSIM3v32gtb; - - xcqgb = here->BSIM3v32cqgb * omega; - xcqdb = here->BSIM3v32cqsb * omega; - xcqsb = here->BSIM3v32cqdb * omega; - xcqbb = here->BSIM3v32cqbb * omega; - - CoxWL = model->BSIM3v32cox * here->pParam->BSIM3v32weffCV - * here->pParam->BSIM3v32leffCV; - qcheq = -(here->BSIM3v32qgate + here->BSIM3v32qbulk); - if (fabs(qcheq) <= 1.0e-5 * CoxWL) - { if (model->BSIM3v32xpart < 0.5) - { sxpart = 0.4; - } - else if (model->BSIM3v32xpart > 0.5) - { sxpart = 0.0; - } - else - { sxpart = 0.5; - } - dsxpart_dVd = dsxpart_dVg = dsxpart_dVb - = dsxpart_dVs = 0.0; - } - else - { sxpart = here->BSIM3v32qdrn / qcheq; - Css = here->BSIM3v32cddb; - Cds = -(here->BSIM3v32cgdb + here->BSIM3v32cddb - + here->BSIM3v32cbdb); - dsxpart_dVs = (Css - sxpart * (Css + Cds)) / qcheq; - Csg = here->BSIM3v32cdgb; - Cdg = -(here->BSIM3v32cggb + here->BSIM3v32cdgb - + here->BSIM3v32cbgb); - dsxpart_dVg = (Csg - sxpart * (Csg + Cdg)) / qcheq; - - Csd = here->BSIM3v32cdsb; - Cdd = -(here->BSIM3v32cgsb + here->BSIM3v32cdsb - + here->BSIM3v32cbsb); - dsxpart_dVd = (Csd - sxpart * (Csd + Cdd)) / qcheq; - - dsxpart_dVb = -(dsxpart_dVd + dsxpart_dVg - + dsxpart_dVs); - } - dxpart = 1.0 - sxpart; - ddxpart_dVd = -dsxpart_dVd; - ddxpart_dVg = -dsxpart_dVg; - ddxpart_dVs = -dsxpart_dVs; - ddxpart_dVb = -(ddxpart_dVd + ddxpart_dVg + ddxpart_dVs); - } - } - - T1 = *(ckt->CKTstate0 + here->BSIM3v32qdef) * here->BSIM3v32gtau; - gdpr = here->BSIM3v32drainConductance; - gspr = here->BSIM3v32sourceConductance; - gds = here->BSIM3v32gds; - gbd = here->BSIM3v32gbd; - gbs = here->BSIM3v32gbs; - capbd = here->BSIM3v32capbd; - capbs = here->BSIM3v32capbs; - - GSoverlapCap = here->BSIM3v32cgso; - GDoverlapCap = here->BSIM3v32cgdo; - GBoverlapCap = here->pParam->BSIM3v32cgbo; - - xcdgb = (cdgb - GDoverlapCap) * omega; - xcddb = (cddb + capbd + GDoverlapCap) * omega; - xcdsb = cdsb * omega; - xcsgb = -(cggb + cbgb + cdgb + GSoverlapCap) * omega; - xcsdb = -(cgdb + cbdb + cddb) * omega; - xcssb = (capbs + GSoverlapCap - (cgsb + cbsb + cdsb)) * omega; - xcggb = (cggb + GDoverlapCap + GSoverlapCap + GBoverlapCap) - * omega; - xcgdb = (cgdb - GDoverlapCap ) * omega; - xcgsb = (cgsb - GSoverlapCap) * omega; - xcbgb = (cbgb - GBoverlapCap) * omega; - xcbdb = (cbdb - capbd ) * omega; - xcbsb = (cbsb - capbs ) * omega; - - m = here->BSIM3v32m; - - *(here->BSIM3v32GgPtr + 1) += m * xcggb; - *(here->BSIM3v32BbPtr + 1) -= - m * (xcbgb + xcbdb + xcbsb); - *(here->BSIM3v32DPdpPtr + 1) += m * xcddb; - *(here->BSIM3v32SPspPtr + 1) += m * xcssb; - *(here->BSIM3v32GbPtr + 1) -= - m * (xcggb + xcgdb + xcgsb); - *(here->BSIM3v32GdpPtr + 1) += m * xcgdb; - *(here->BSIM3v32GspPtr + 1) += m * xcgsb; - *(here->BSIM3v32BgPtr + 1) += m * xcbgb; - *(here->BSIM3v32BdpPtr + 1) += m * xcbdb; - *(here->BSIM3v32BspPtr + 1) += m * xcbsb; - *(here->BSIM3v32DPgPtr + 1) += m * xcdgb; - *(here->BSIM3v32DPbPtr + 1) -= - m * (xcdgb + xcddb + xcdsb); - *(here->BSIM3v32DPspPtr + 1) += m * xcdsb; - *(here->BSIM3v32SPgPtr + 1) += m * xcsgb; - *(here->BSIM3v32SPbPtr + 1) -= - m * (xcsgb + xcsdb + xcssb); - *(here->BSIM3v32SPdpPtr + 1) += m * xcsdb; - - *(here->BSIM3v32DdPtr) += m * gdpr; - *(here->BSIM3v32SsPtr) += m * gspr; - *(here->BSIM3v32BbPtr) += - m * (gbd + gbs - here->BSIM3v32gbbs); - *(here->BSIM3v32DPdpPtr) += - m * (gdpr + gds + gbd + RevSum + - dxpart * xgtd + T1 * ddxpart_dVd + - gbdpdp); - *(here->BSIM3v32SPspPtr) += - m * (gspr + gds + gbs + FwdSum + - sxpart * xgts + T1 * dsxpart_dVs + - gbspsp); - - *(here->BSIM3v32DdpPtr) -= m * gdpr; - *(here->BSIM3v32SspPtr) -= m * gspr; - - *(here->BSIM3v32BgPtr) -= m * here->BSIM3v32gbgs; - *(here->BSIM3v32BdpPtr) -= m * (gbd - gbbdp); - *(here->BSIM3v32BspPtr) -= m * (gbs - gbbsp); - - *(here->BSIM3v32DPdPtr) -= m * gdpr; - *(here->BSIM3v32DPgPtr) += - m * (Gm + dxpart * xgtg + T1 * ddxpart_dVg + - gbdpg); - *(here->BSIM3v32DPbPtr) -= - m * (gbd - Gmbs - dxpart * xgtb - - T1 * ddxpart_dVb - gbdpb); - *(here->BSIM3v32DPspPtr) -= - m * (gds + FwdSum - dxpart * xgts - - T1 * ddxpart_dVs - gbdpsp); - - *(here->BSIM3v32SPgPtr) -= - m * (Gm - sxpart * xgtg - T1 * dsxpart_dVg - - gbspg); - *(here->BSIM3v32SPsPtr) -= m * gspr; - *(here->BSIM3v32SPbPtr) -= - m * (gbs + Gmbs - sxpart * xgtb - - T1 * dsxpart_dVb - gbspb); - *(here->BSIM3v32SPdpPtr) -= - m * (gds + RevSum - sxpart * xgtd - - T1 * dsxpart_dVd - gbspdp); - - *(here->BSIM3v32GgPtr) -= m * xgtg; - *(here->BSIM3v32GbPtr) -= m * xgtb; - *(here->BSIM3v32GdpPtr) -= m * xgtd; - *(here->BSIM3v32GspPtr) -= m * xgts; - - if (here->BSIM3v32nqsMod) - { - *(here->BSIM3v32QqPtr + 1) += - m * omega * ScalingFactor; - *(here->BSIM3v32QgPtr + 1) -= m * xcqgb; - *(here->BSIM3v32QdpPtr + 1) -= m * xcqdb; - *(here->BSIM3v32QspPtr + 1) -= m * xcqsb; - *(here->BSIM3v32QbPtr + 1) -= m * xcqbb; - - *(here->BSIM3v32QqPtr) += m * here->BSIM3v32gtau; - - *(here->BSIM3v32DPqPtr) += - m * (dxpart * here->BSIM3v32gtau); - *(here->BSIM3v32SPqPtr) += - m * (sxpart * here->BSIM3v32gtau); - *(here->BSIM3v32GqPtr) -= m * here->BSIM3v32gtau; - - *(here->BSIM3v32QgPtr) += m * xgtg; - *(here->BSIM3v32QdpPtr) += m * xgtd; - *(here->BSIM3v32QspPtr) += m * xgts; - *(here->BSIM3v32QbPtr) += m * xgtb; - } - } - } - return(OK); -} - diff --git a/src/spicelib/devices/bsim3v32/b3v32ask.c b/src/spicelib/devices/bsim3v32/b3v32ask.c deleted file mode 100644 index 2b057b77b..000000000 --- a/src/spicelib/devices/bsim3v32/b3v32ask.c +++ /dev/null @@ -1,239 +0,0 @@ -/**** BSIM3v3.2.4, Released by Xuemei Xi 12/14/2001 ****/ - -/********** - * Copyright 2001 Regents of the University of California. All rights reserved. - * File: b3ask.c of BSIM3v3.2.4 - * Author: 1995 Min-Chie Jeng and Mansun Chan - * Author: 1997-1999 Weidong Liu. - * Author: 2001 Xuemei Xi - * Modified bt Paolo Nenzi 2002 and Dietmar Warning 2003 - **********/ - -#include "ngspice/ngspice.h" -#include "ngspice/ifsim.h" -#include "ngspice/cktdefs.h" -#include "ngspice/devdefs.h" -#include "bsim3v32def.h" -#include "ngspice/sperror.h" -#include "ngspice/suffix.h" - -int -BSIM3v32ask (CKTcircuit *ckt, GENinstance *inst, int which, IFvalue *value, - IFvalue *select) -{ -BSIM3v32instance *here = (BSIM3v32instance*)inst; -BSIM3v32model *model = BSIM3v32modPtr(here); /* for lmlt */ - - NG_IGNORE(select); - - switch(which) - { case BSIM3v32_L: - value->rValue = here->BSIM3v32l; - value->rValue *= model->BSIM3v32lmlt; - return(OK); - case BSIM3v32_W: - value->rValue = here->BSIM3v32w; - return(OK); - case BSIM3v32_M: - value->rValue = here->BSIM3v32m; - return (OK); - case BSIM3v32_AS: - value->rValue = here->BSIM3v32sourceArea; - return(OK); - case BSIM3v32_AD: - value->rValue = here->BSIM3v32drainArea; - return(OK); - case BSIM3v32_PS: - value->rValue = here->BSIM3v32sourcePerimeter; - return(OK); - case BSIM3v32_PD: - value->rValue = here->BSIM3v32drainPerimeter; - return(OK); - case BSIM3v32_NRS: - value->rValue = here->BSIM3v32sourceSquares; - return(OK); - case BSIM3v32_NRD: - value->rValue = here->BSIM3v32drainSquares; - return(OK); - case BSIM3v32_OFF: - value->rValue = here->BSIM3v32off; - return(OK); - case BSIM3v32_NQSMOD: - value->iValue = here->BSIM3v32nqsMod; - return(OK); - case BSIM3v32_GEO: - value->iValue = here->BSIM3v32geo; - return(OK); - case BSIM3v32_DELVTO: - value->rValue = here->BSIM3v32delvto; - return(OK); - case BSIM3v32_MULU0: - value->rValue = here->BSIM3v32mulu0; - return(OK); - case BSIM3v32_IC_VBS: - value->rValue = here->BSIM3v32icVBS; - return(OK); - case BSIM3v32_IC_VDS: - value->rValue = here->BSIM3v32icVDS; - return(OK); - case BSIM3v32_IC_VGS: - value->rValue = here->BSIM3v32icVGS; - return(OK); - case BSIM3v32_DNODE: - value->iValue = here->BSIM3v32dNode; - return(OK); - case BSIM3v32_GNODE: - value->iValue = here->BSIM3v32gNode; - return(OK); - case BSIM3v32_SNODE: - value->iValue = here->BSIM3v32sNode; - return(OK); - case BSIM3v32_BNODE: - value->iValue = here->BSIM3v32bNode; - return(OK); - case BSIM3v32_DNODEPRIME: - value->iValue = here->BSIM3v32dNodePrime; - return(OK); - case BSIM3v32_SNODEPRIME: - value->iValue = here->BSIM3v32sNodePrime; - return(OK); - case BSIM3v32_SOURCECONDUCT: - value->rValue = here->BSIM3v32sourceConductance; - value->rValue *= here->BSIM3v32m; - return(OK); - case BSIM3v32_DRAINCONDUCT: - value->rValue = here->BSIM3v32drainConductance; - value->rValue *= here->BSIM3v32m; - return(OK); - case BSIM3v32_VBD: - value->rValue = *(ckt->CKTstate0 + here->BSIM3v32vbd); - return(OK); - case BSIM3v32_VBS: - value->rValue = *(ckt->CKTstate0 + here->BSIM3v32vbs); - return(OK); - case BSIM3v32_VGS: - value->rValue = *(ckt->CKTstate0 + here->BSIM3v32vgs); - return(OK); - case BSIM3v32_VDS: - value->rValue = *(ckt->CKTstate0 + here->BSIM3v32vds); - return(OK); - case BSIM3v32_CD: - value->rValue = here->BSIM3v32cd; - value->rValue *= here->BSIM3v32m; - return(OK); - case BSIM3v32_CBS: - value->rValue = here->BSIM3v32cbs; - value->rValue *= here->BSIM3v32m; - return(OK); - case BSIM3v32_CBD: - value->rValue = here->BSIM3v32cbd; - value->rValue *= here->BSIM3v32m; - return(OK); - case BSIM3v32_GM: - value->rValue = here->BSIM3v32gm; - value->rValue *= here->BSIM3v32m; - return(OK); - case BSIM3v32_GDS: - value->rValue = here->BSIM3v32gds; - value->rValue *= here->BSIM3v32m; - return(OK); - case BSIM3v32_GMBS: - value->rValue = here->BSIM3v32gmbs; - value->rValue *= here->BSIM3v32m; - return(OK); - case BSIM3v32_GBD: - value->rValue = here->BSIM3v32gbd; - value->rValue *= here->BSIM3v32m; - return(OK); - case BSIM3v32_GBS: - value->rValue = here->BSIM3v32gbs; - value->rValue *= here->BSIM3v32m; - return(OK); - case BSIM3v32_QB: - value->rValue = *(ckt->CKTstate0 + here->BSIM3v32qb); - value->rValue *= here->BSIM3v32m; - return(OK); - case BSIM3v32_CQB: - value->rValue = *(ckt->CKTstate0 + here->BSIM3v32cqb); - value->rValue *= here->BSIM3v32m; - return(OK); - case BSIM3v32_QG: - value->rValue = *(ckt->CKTstate0 + here->BSIM3v32qg); - value->rValue *= here->BSIM3v32m; - return(OK); - case BSIM3v32_CQG: - value->rValue = *(ckt->CKTstate0 + here->BSIM3v32cqg); - value->rValue *= here->BSIM3v32m; - return(OK); - case BSIM3v32_QD: - value->rValue = *(ckt->CKTstate0 + here->BSIM3v32qd); - value->rValue *= here->BSIM3v32m; - return(OK); - case BSIM3v32_CQD: - value->rValue = *(ckt->CKTstate0 + here->BSIM3v32cqd); - value->rValue *= here->BSIM3v32m; - return(OK); - case BSIM3v32_CGG: - value->rValue = here->BSIM3v32cggb; - value->rValue *= here->BSIM3v32m; - return(OK); - case BSIM3v32_CGD: - value->rValue = here->BSIM3v32cgdb; - value->rValue *= here->BSIM3v32m; - return(OK); - case BSIM3v32_CGS: - value->rValue = here->BSIM3v32cgsb; - value->rValue *= here->BSIM3v32m; - return(OK); - case BSIM3v32_CDG: - value->rValue = here->BSIM3v32cdgb; - value->rValue *= here->BSIM3v32m; - return(OK); - case BSIM3v32_CDD: - value->rValue = here->BSIM3v32cddb; - value->rValue *= here->BSIM3v32m; - return(OK); - case BSIM3v32_CDS: - value->rValue = here->BSIM3v32cdsb; - value->rValue *= here->BSIM3v32m; - return(OK); - case BSIM3v32_CBG: - value->rValue = here->BSIM3v32cbgb; - value->rValue *= here->BSIM3v32m; - return(OK); - case BSIM3v32_CBDB: - value->rValue = here->BSIM3v32cbdb; - value->rValue *= here->BSIM3v32m; - return(OK); - case BSIM3v32_CBSB: - value->rValue = here->BSIM3v32cbsb; - value->rValue *= here->BSIM3v32m; - return(OK); - case BSIM3v32_CAPBD: - value->rValue = here->BSIM3v32capbd; - value->rValue *= here->BSIM3v32m; - return(OK); - case BSIM3v32_CAPBS: - value->rValue = here->BSIM3v32capbs; - value->rValue *= here->BSIM3v32m; - return(OK); - case BSIM3v32_VON: - value->rValue = here->BSIM3v32von; - return(OK); - case BSIM3v32_VDSAT: - value->rValue = here->BSIM3v32vdsat; - return(OK); - case BSIM3v32_QBS: - value->rValue = *(ckt->CKTstate0 + here->BSIM3v32qbs); - value->rValue *= here->BSIM3v32m; - return(OK); - case BSIM3v32_QBD: - value->rValue = *(ckt->CKTstate0 + here->BSIM3v32qbd); - value->rValue *= here->BSIM3v32m; - return(OK); - default: - return(E_BADPARM); - } - /* NOTREACHED */ -} - diff --git a/src/spicelib/devices/bsim3v32/b3v32check.c b/src/spicelib/devices/bsim3v32/b3v32check.c deleted file mode 100644 index b18ddb509..000000000 --- a/src/spicelib/devices/bsim3v32/b3v32check.c +++ /dev/null @@ -1,395 +0,0 @@ -/**** BSIM3v3.2.4, Released by Xuemei Xi 12/14/2001 ****/ - -/********** - * Copyright 2001 Regents of the University of California. All rights reserved. - * File: b3check.c of BSIM3v3.2.4 - * Author: 1995 Min-Chie Jeng - * Author: 1997-1999 Weidong Liu. - * Author: 2001 Xuemei Xi - * Modified by Xuemei Xi, 10/05, 12/14, 2001. - * Modified by Paolo Nenzi 2002 and Dietmar Warning 2003 - * Modified by Dietmar Warning, 12/21/2020. - **********/ - -#include "ngspice/ngspice.h" -#include "ngspice/cktdefs.h" -#include "bsim3v32def.h" -#include "ngspice/trandefs.h" -#include "ngspice/const.h" -#include "ngspice/sperror.h" -#include "ngspice/devdefs.h" -#include "ngspice/suffix.h" -#include "ngspice/wordlist.h" -#include "ngspice/cpextern.h" - -/* Check for correctness of the BSIM3.2 parameters: - If parameter excursions are found, put the warning or error message into a wordlist. - Only then open a file b3v32check.log and print the data into the file. */ - -int -BSIM3v32checkModel (BSIM3v32model *model, BSIM3v32instance *here, CKTcircuit *ckt) -{ - struct bsim3v32SizeDependParam *pParam; - int Fatal_Flag = 0; - FILE *fplog; - wordlist* wl, *wlstart; - - NG_IGNORE(ckt); - - pParam = here->pParam; - - if (cp_getvar("ng_nomodcheck", CP_BOOL, NULL, 0)) - return(0); - - wl = wlstart = TMALLOC(wordlist, 1); - wl->wl_prev = NULL; - wl->wl_next = NULL; - wl->wl_word = tprintf("\nChecking parameters for BSIM 3.2 model %s\n", model->BSIM3v32modName); - - if ((strcmp(model->BSIM3v32version, "3.2.4")) && (strncmp(model->BSIM3v32version, "3.24", 4)) - && (strcmp(model->BSIM3v32version, "3.2.3")) && (strncmp(model->BSIM3v32version, "3.23", 4)) - && (strcmp(model->BSIM3v32version, "3.2.2")) && (strncmp(model->BSIM3v32version, "3.22", 4)) - && (strncmp(model->BSIM3v32version, "3.2", 3)) && (strncmp(model->BSIM3v32version, "3.20", 4))) - { - printf("Warning: This model supports BSIM3v3.2, BSIM3v3.2.2, BSIM3v3.2.3, BSIM3v3.2.4\n"); - printf("You specified a wrong version number. Working now with BSIM3v3.2.4.\n"); - wl_append_word(&wl, &wl, tprintf("Warning: This model supports BSIM3v3.2, BSIM3v3.2.2, BSIM3v3.2.3, BSIM3v3.2.4\n")); - wl_append_word(&wl, &wl, tprintf("You specified a wrong version number. Working now with BSIM3v3.2.4.\n")); - } - - if (pParam->BSIM3v32nlx < -pParam->BSIM3v32leff) - { wl_append_word(&wl, &wl, tprintf("Fatal: Nlx = %g is less than -Leff.\n", - pParam->BSIM3v32nlx)); - Fatal_Flag = 1; - } - - if (model->BSIM3v32tox <= 0.0) - { wl_append_word(&wl, &wl, tprintf("Fatal: Tox = %g is not positive.\n", - model->BSIM3v32tox)); - Fatal_Flag = 1; - } - - if (model->BSIM3v32toxm <= 0.0) - { wl_append_word(&wl, &wl, tprintf("Fatal: Toxm = %g is not positive.\n", - model->BSIM3v32toxm)); - Fatal_Flag = 1; - } - - if (pParam->BSIM3v32npeak <= 0.0) - { wl_append_word(&wl, &wl, tprintf("Fatal: Nch = %g is not positive.\n", - pParam->BSIM3v32npeak)); - Fatal_Flag = 1; - } - if (pParam->BSIM3v32nsub <= 0.0) - { wl_append_word(&wl, &wl, tprintf("Fatal: Nsub = %g is not positive.\n", - pParam->BSIM3v32nsub)); - Fatal_Flag = 1; - } - if (pParam->BSIM3v32ngate < 0.0) - { wl_append_word(&wl, &wl, tprintf("Fatal: Ngate = %g is not positive.\n", - pParam->BSIM3v32ngate)); - Fatal_Flag = 1; - } - if (pParam->BSIM3v32ngate > 1.e25) - { wl_append_word(&wl, &wl, tprintf("Fatal: Ngate = %g is too high.\n", - pParam->BSIM3v32ngate)); - Fatal_Flag = 1; - } - if (pParam->BSIM3v32xj <= 0.0) - { wl_append_word(&wl, &wl, tprintf("Fatal: Xj = %g is not positive.\n", - pParam->BSIM3v32xj)); - Fatal_Flag = 1; - } - - if (pParam->BSIM3v32dvt1 < 0.0) - { wl_append_word(&wl, &wl, tprintf("Fatal: Dvt1 = %g is negative.\n", - pParam->BSIM3v32dvt1)); - Fatal_Flag = 1; - } - - if (pParam->BSIM3v32dvt1w < 0.0) - { wl_append_word(&wl, &wl, tprintf("Fatal: Dvt1w = %g is negative.\n", - pParam->BSIM3v32dvt1w)); - Fatal_Flag = 1; - } - - if (pParam->BSIM3v32w0 == -pParam->BSIM3v32weff) - { wl_append_word(&wl, &wl, tprintf("Fatal: (W0 + Weff) = 0 causing divided-by-zero.\n")); - Fatal_Flag = 1; - } - - if (pParam->BSIM3v32dsub < 0.0) - { wl_append_word(&wl, &wl, tprintf("Fatal: Dsub = %g is negative.\n", pParam->BSIM3v32dsub)); - Fatal_Flag = 1; - } - if (pParam->BSIM3v32b1 == -pParam->BSIM3v32weff) - { wl_append_word(&wl, &wl, tprintf("Fatal: (B1 + Weff) = 0 causing divided-by-zero.\n")); - Fatal_Flag = 1; - } - if (pParam->BSIM3v32u0temp <= 0.0) - { wl_append_word(&wl, &wl, tprintf("Fatal: u0 at current temperature = %g is not positive.\n", pParam->BSIM3v32u0temp)); - Fatal_Flag = 1; - } - -/* Check delta parameter */ - if (pParam->BSIM3v32delta < 0.0) - { wl_append_word(&wl, &wl, tprintf("Fatal: Delta = %g is less than zero.\n", - pParam->BSIM3v32delta)); - Fatal_Flag = 1; - } - - if (pParam->BSIM3v32vsattemp <= 0.0) - { wl_append_word(&wl, &wl, tprintf("Fatal: Vsat at current temperature = %g is not positive.\n", pParam->BSIM3v32vsattemp)); - Fatal_Flag = 1; - } -/* Check Rout parameters */ - if (pParam->BSIM3v32pclm <= 0.0) - { wl_append_word(&wl, &wl, tprintf("Fatal: Pclm = %g is not positive.\n", pParam->BSIM3v32pclm)); - Fatal_Flag = 1; - } - - if (pParam->BSIM3v32drout < 0.0) - { wl_append_word(&wl, &wl, tprintf("Fatal: Drout = %g is negative.\n", pParam->BSIM3v32drout)); - Fatal_Flag = 1; - } - - if (pParam->BSIM3v32pscbe2 <= 0.0) - { wl_append_word(&wl, &wl, tprintf("Warning: Pscbe2 = %g is not positive.\n", - pParam->BSIM3v32pscbe2)); - } - - /* ACM model */ - if (model->BSIM3v32acmMod == 0) { - if (model->BSIM3v32unitLengthSidewallJctCap > 0.0 || - model->BSIM3v32unitLengthGateSidewallJctCap > 0.0) - { - if (here->BSIM3v32drainPerimeter < pParam->BSIM3v32weff) - { wl_append_word(&wl, &wl, tprintf("Warning: Pd = %g is less than W.\n", - here->BSIM3v32drainPerimeter)); - } - if (here->BSIM3v32sourcePerimeter < pParam->BSIM3v32weff) - { wl_append_word(&wl, &wl, tprintf("Warning: Ps = %g is less than W.\n", - here->BSIM3v32sourcePerimeter)); - } - } - } - - if ((model->BSIM3v32calcacm > 0) && (model->BSIM3v32acmMod != 12)) - { wl_append_word(&wl, &wl, tprintf("Warning: CALCACM = %d is wrong. Set back to 0.\n", - model->BSIM3v32calcacm)); - model->BSIM3v32calcacm = 0; - } - - if (pParam->BSIM3v32noff < 0.1) - { wl_append_word(&wl, &wl, tprintf("Warning: Noff = %g is too small.\n", - pParam->BSIM3v32noff)); - } - if (pParam->BSIM3v32noff > 4.0) - { wl_append_word(&wl, &wl, tprintf("Warning: Noff = %g is too large.\n", - pParam->BSIM3v32noff)); - } - - if (pParam->BSIM3v32voffcv < -0.5) - { wl_append_word(&wl, &wl, tprintf("Warning: Voffcv = %g is too small.\n", - pParam->BSIM3v32voffcv)); - } - if (pParam->BSIM3v32voffcv > 0.5) - { wl_append_word(&wl, &wl, tprintf("Warning: Voffcv = %g is too large.\n", - pParam->BSIM3v32voffcv)); - } - - if (model->BSIM3v32ijth < 0.0) - { wl_append_word(&wl, &wl, tprintf("Fatal: Ijth = %g cannot be negative.\n", - model->BSIM3v32ijth)); - Fatal_Flag = 1; - } - -/* Check capacitance parameters */ - if (pParam->BSIM3v32clc < 0.0) - { wl_append_word(&wl, &wl, tprintf("Fatal: Clc = %g is negative.\n", pParam->BSIM3v32clc)); - Fatal_Flag = 1; - } - - if (pParam->BSIM3v32moin < 5.0) - { wl_append_word(&wl, &wl, tprintf("Warning: Moin = %g is too small.\n", - pParam->BSIM3v32moin)); - } - if (pParam->BSIM3v32moin > 25.0) - { wl_append_word(&wl, &wl, tprintf("Warning: Moin = %g is too large.\n", - pParam->BSIM3v32moin)); - } - - if(model->BSIM3v32capMod ==3) { - if (pParam->BSIM3v32acde < 0.4) - { wl_append_word(&wl, &wl, tprintf("Warning: Acde = %g is too small.\n", - pParam->BSIM3v32acde)); - } - if (pParam->BSIM3v32acde > 1.6) - { wl_append_word(&wl, &wl, tprintf("Warning: Acde = %g is too large.\n", - pParam->BSIM3v32acde)); - } - } - - if (model->BSIM3v32paramChk ==1) - { - /* Check L and W parameters */ - if (pParam->BSIM3v32leff <= 5.0e-8) - { wl_append_word(&wl, &wl, tprintf("Warning: Leff = %g may be too small.\n", - pParam->BSIM3v32leff)); - } - - if (pParam->BSIM3v32leffCV <= 5.0e-8) - { wl_append_word(&wl, &wl, tprintf("Warning: Leff for CV = %g may be too small.\n", - pParam->BSIM3v32leffCV)); - } - - if (pParam->BSIM3v32weff <= 1.0e-7) - { wl_append_word(&wl, &wl, tprintf("Warning: Weff = %g may be too small.\n", - pParam->BSIM3v32weff)); - } - - if (pParam->BSIM3v32weffCV <= 1.0e-7) - { wl_append_word(&wl, &wl, tprintf("Warning: Weff for CV = %g may be too small.\n", - pParam->BSIM3v32weffCV)); - } - - /* Check threshold voltage parameters */ - if (pParam->BSIM3v32nlx < 0.0) - { wl_append_word(&wl, &wl, tprintf("Warning: Nlx = %g is negative.\n", pParam->BSIM3v32nlx)); - } - if (model->BSIM3v32tox < 1.0e-9) - { wl_append_word(&wl, &wl, tprintf("Warning: Tox = %g is less than 10A.\n", - model->BSIM3v32tox)); - } - - if (pParam->BSIM3v32npeak <= 1.0e15) - { wl_append_word(&wl, &wl, tprintf("Warning: Nch = %g may be too small.\n", - pParam->BSIM3v32npeak)); - } - else if (pParam->BSIM3v32npeak >= 1.0e21) - { wl_append_word(&wl, &wl, tprintf("Warning: Nch = %g may be too large.\n", - pParam->BSIM3v32npeak)); - } - - if (pParam->BSIM3v32nsub <= 1.0e14) - { wl_append_word(&wl, &wl, tprintf("Warning: Nsub = %g may be too small.\n", - pParam->BSIM3v32nsub)); - } - else if (pParam->BSIM3v32nsub >= 1.0e21) - { wl_append_word(&wl, &wl, tprintf("Warning: Nsub = %g may be too large.\n", - pParam->BSIM3v32nsub)); - } - - if ((pParam->BSIM3v32ngate > 0.0) && - (pParam->BSIM3v32ngate <= 1.e18)) - { wl_append_word(&wl, &wl, tprintf("Warning: Ngate = %g is less than 1.E18cm^-3.\n", - pParam->BSIM3v32ngate)); - } - - if (pParam->BSIM3v32dvt0 < 0.0) - { wl_append_word(&wl, &wl, tprintf("Warning: Dvt0 = %g is negative.\n", - pParam->BSIM3v32dvt0)); - } - - if (fabs(1.0e-6 / (pParam->BSIM3v32w0 + pParam->BSIM3v32weff)) > 10.0) - { wl_append_word(&wl, &wl, tprintf("Warning: (W0 + Weff) may be too small.\n")); - } - - /* Check subthreshold parameters */ - if (pParam->BSIM3v32nfactor < 0.0) - { wl_append_word(&wl, &wl, tprintf("Warning: Nfactor = %g is negative.\n", - pParam->BSIM3v32nfactor)); - } - if (pParam->BSIM3v32cdsc < 0.0) - { wl_append_word(&wl, &wl, tprintf("Warning: Cdsc = %g is negative.\n", - pParam->BSIM3v32cdsc)); - } - if (pParam->BSIM3v32cdscd < 0.0) - { wl_append_word(&wl, &wl, tprintf("Warning: Cdscd = %g is negative.\n", - pParam->BSIM3v32cdscd)); - } - /* Check DIBL parameters */ - if (pParam->BSIM3v32eta0 < 0.0) - { wl_append_word(&wl, &wl, tprintf("Warning: Eta0 = %g is negative.\n", - pParam->BSIM3v32eta0)); - } - - /* Check Abulk parameters */ - if (fabs(1.0e-6 / (pParam->BSIM3v32b1 + pParam->BSIM3v32weff)) > 10.0) - { wl_append_word(&wl, &wl, tprintf("Warning: (B1 + Weff) may be too small.\n")); - } - - /* Check Saturation parameters */ - if (pParam->BSIM3v32a2 < 0.01) - { wl_append_word(&wl, &wl, tprintf("Warning: A2 = %g is too small. Set to 0.01.\n", pParam->BSIM3v32a2)); - pParam->BSIM3v32a2 = 0.01; - } - else if (pParam->BSIM3v32a2 > 1.0) - { wl_append_word(&wl, &wl, tprintf("Warning: A2 = %g is larger than 1. A2 is set to 1 and A1 is set to 0.\n", - pParam->BSIM3v32a2)); - pParam->BSIM3v32a2 = 1.0; - pParam->BSIM3v32a1 = 0.0; - - } - - if (pParam->BSIM3v32rdsw < 0.0) - { wl_append_word(&wl, &wl, tprintf("Warning: Rdsw = %g is negative. Set to zero.\n", - pParam->BSIM3v32rdsw)); - pParam->BSIM3v32rdsw = 0.0; - pParam->BSIM3v32rds0 = 0.0; - } - else if ((pParam->BSIM3v32rds0 > 0.0) && (pParam->BSIM3v32rds0 < 0.001)) - { wl_append_word(&wl, &wl, tprintf("Warning: Rds at current temperature = %g is less than 0.001 ohm. Set to zero.\n", - pParam->BSIM3v32rds0)); - pParam->BSIM3v32rds0 = 0.0; - } - if (pParam->BSIM3v32vsattemp < 1.0e3) - { wl_append_word(&wl, &wl, tprintf("Warning: Vsat at current temperature = %g may be too small.\n", pParam->BSIM3v32vsattemp)); - } - - if (pParam->BSIM3v32pdibl1 < 0.0) - { wl_append_word(&wl, &wl, tprintf("Warning: Pdibl1 = %g is negative.\n", - pParam->BSIM3v32pdibl1)); - } - if (pParam->BSIM3v32pdibl2 < 0.0) - { wl_append_word(&wl, &wl, tprintf("Warning: Pdibl2 = %g is negative.\n", - pParam->BSIM3v32pdibl2)); - } - /* Check overlap capacitance parameters */ - if (model->BSIM3v32cgdo < 0.0) - { wl_append_word(&wl, &wl, tprintf("Warning: cgdo = %g is negative. Set to zero.\n", model->BSIM3v32cgdo)); - model->BSIM3v32cgdo = 0.0; - } - if (model->BSIM3v32cgso < 0.0) - { wl_append_word(&wl, &wl, tprintf("Warning: cgso = %g is negative. Set to zero.\n", model->BSIM3v32cgso)); - model->BSIM3v32cgso = 0.0; - } - if (model->BSIM3v32cgbo < 0.0) - { wl_append_word(&wl, &wl, tprintf("Warning: cgbo = %g is negative. Set to zero.\n", model->BSIM3v32cgbo)); - model->BSIM3v32cgbo = 0.0; - } - - } - - if (wlstart->wl_next) { - if ((fplog = fopen("b3v32check.log", "w")) != NULL) { - while (wlstart) { - fprintf(fplog, "%s", wlstart->wl_word); - fprintf(stderr, "%s", wlstart->wl_word); - wlstart = wlstart->wl_next; - } - fclose(fplog); - } - else { - while (wlstart) { - fprintf(stderr, "%s", wlstart->wl_word); - wlstart = wlstart->wl_next; - } - } - } - - wl_free(wlstart); - - return(Fatal_Flag); -} - diff --git a/src/spicelib/devices/bsim3v32/b3v32cvtest.c b/src/spicelib/devices/bsim3v32/b3v32cvtest.c deleted file mode 100644 index 0df873973..000000000 --- a/src/spicelib/devices/bsim3v32/b3v32cvtest.c +++ /dev/null @@ -1,106 +0,0 @@ -/**** BSIM3v3.2.4, Released by Xuemei Xi 12/14/2001 ****/ - -/********** - * Copyright 2001 Regents of the University of California. All rights reserved. - * File: b3cvtest.c of BSIM3v3.2.4 - * Author: 1995 Min-Chie Jeng and Mansun Chan - * Author: 1997-1999 Weidong Liu. - * Author: 2001 Xuemei Xi - * Modified by Paolo Nenzi 2002 - **********/ - -#include "ngspice/ngspice.h" -#include "ngspice/cktdefs.h" -#include "bsim3v32def.h" -#include "ngspice/trandefs.h" -#include "ngspice/const.h" -#include "ngspice/devdefs.h" -#include "ngspice/sperror.h" -#include "ngspice/suffix.h" - - -int -BSIM3v32convTest (GENmodel *inModel, CKTcircuit *ckt) -{ -BSIM3v32model *model = (BSIM3v32model*)inModel; -BSIM3v32instance *here; -double delvbd, delvbs, delvds, delvgd, delvgs, vbd, vbs, vds; -double cbd, cbhat, cbs, cd, cdhat, tol, vgd, vgdo, vgs; - - /* loop through all the BSIM3v32 device models */ - for (; model != NULL; model = BSIM3v32nextModel(model)) - { /* loop through all the instances of the model */ - for (here = BSIM3v32instances(model); here != NULL ; - here=BSIM3v32nextInstance(here)) - { - vbs = model->BSIM3v32type - * (*(ckt->CKTrhsOld+here->BSIM3v32bNode) - - *(ckt->CKTrhsOld+here->BSIM3v32sNodePrime)); - vgs = model->BSIM3v32type - * (*(ckt->CKTrhsOld+here->BSIM3v32gNode) - - *(ckt->CKTrhsOld+here->BSIM3v32sNodePrime)); - vds = model->BSIM3v32type - * (*(ckt->CKTrhsOld+here->BSIM3v32dNodePrime) - - *(ckt->CKTrhsOld+here->BSIM3v32sNodePrime)); - vbd = vbs - vds; - vgd = vgs - vds; - vgdo = *(ckt->CKTstate0 + here->BSIM3v32vgs) - - *(ckt->CKTstate0 + here->BSIM3v32vds); - delvbs = vbs - *(ckt->CKTstate0 + here->BSIM3v32vbs); - delvbd = vbd - *(ckt->CKTstate0 + here->BSIM3v32vbd); - delvgs = vgs - *(ckt->CKTstate0 + here->BSIM3v32vgs); - delvds = vds - *(ckt->CKTstate0 + here->BSIM3v32vds); - delvgd = vgd-vgdo; - - cd = here->BSIM3v32cd - here->BSIM3v32cbd; - if (here->BSIM3v32mode >= 0) - { cd += here->BSIM3v32csub; - cdhat = cd - here->BSIM3v32gbd * delvbd - + (here->BSIM3v32gmbs + here->BSIM3v32gbbs) * delvbs - + (here->BSIM3v32gm + here->BSIM3v32gbgs) * delvgs - + (here->BSIM3v32gds + here->BSIM3v32gbds) * delvds; - } - else - { cdhat = cd + (here->BSIM3v32gmbs - here->BSIM3v32gbd) * delvbd - + here->BSIM3v32gm * delvgd - here->BSIM3v32gds * delvds; - } - - /* - * check convergence - */ - if ((here->BSIM3v32off == 0) || (!(ckt->CKTmode & MODEINITFIX))) - { tol = ckt->CKTreltol * MAX(fabs(cdhat), fabs(cd)) - + ckt->CKTabstol; - if (fabs(cdhat - cd) >= tol) - { ckt->CKTnoncon++; - return(OK); - } - cbs = here->BSIM3v32cbs; - cbd = here->BSIM3v32cbd; - if (here->BSIM3v32mode >= 0) - { cbhat = cbs + cbd - here->BSIM3v32csub - + here->BSIM3v32gbd * delvbd - + (here->BSIM3v32gbs - here->BSIM3v32gbbs) * delvbs - - here->BSIM3v32gbgs * delvgs - - here->BSIM3v32gbds * delvds; - } - else - { cbhat = cbs + cbd - here->BSIM3v32csub - + here->BSIM3v32gbs * delvbs - + (here->BSIM3v32gbd - here->BSIM3v32gbbs) * delvbd - - here->BSIM3v32gbgs * delvgd - + here->BSIM3v32gbds * delvds; - } - tol = ckt->CKTreltol * MAX(fabs(cbhat), - fabs(cbs + cbd - here->BSIM3v32csub)) + ckt->CKTabstol; - if (fabs(cbhat - (cbs + cbd - here->BSIM3v32csub)) > tol) - { ckt->CKTnoncon++; - return(OK); - } - } - } - } - return(OK); -} - - diff --git a/src/spicelib/devices/bsim3v32/b3v32getic.c b/src/spicelib/devices/bsim3v32/b3v32getic.c deleted file mode 100644 index ccb47a93a..000000000 --- a/src/spicelib/devices/bsim3v32/b3v32getic.c +++ /dev/null @@ -1,44 +0,0 @@ -/**** BSIM3v3.2.4, Released by Xuemei Xi 12/14/2001 ****/ - -/********** - * Copyright 2001 Regents of the University of California. All rights reserved. - * File: b3getic.c of BSIM3v3.2.4 - * Author: 1995 Min-Chie Jeng and Mansun Chan. - * Author: 1997-1999 Weidong Liu. - * Author: 2001 Xuemei Xi - **********/ - -#include "ngspice/ngspice.h" -#include "ngspice/cktdefs.h" -#include "bsim3v32def.h" -#include "ngspice/sperror.h" -#include "ngspice/suffix.h" - - -int -BSIM3v32getic (GENmodel *inModel, CKTcircuit *ckt) -{ -BSIM3v32model *model = (BSIM3v32model*)inModel; -BSIM3v32instance *here; - - for (; model ; model = BSIM3v32nextModel(model)) - { for (here = BSIM3v32instances(model); here; here = BSIM3v32nextInstance(here)) - { - if (!here->BSIM3v32icVBSGiven) - { here->BSIM3v32icVBS = *(ckt->CKTrhs + here->BSIM3v32bNode) - - *(ckt->CKTrhs + here->BSIM3v32sNode); - } - if (!here->BSIM3v32icVDSGiven) - { here->BSIM3v32icVDS = *(ckt->CKTrhs + here->BSIM3v32dNode) - - *(ckt->CKTrhs + here->BSIM3v32sNode); - } - if (!here->BSIM3v32icVGSGiven) - { here->BSIM3v32icVGS = *(ckt->CKTrhs + here->BSIM3v32gNode) - - *(ckt->CKTrhs + here->BSIM3v32sNode); - } - } - } - return(OK); -} - - diff --git a/src/spicelib/devices/bsim3v32/b3v32ld.c b/src/spicelib/devices/bsim3v32/b3v32ld.c deleted file mode 100644 index 60a8c3261..000000000 --- a/src/spicelib/devices/bsim3v32/b3v32ld.c +++ /dev/null @@ -1,3512 +0,0 @@ -/**** BSIM3v3.2.4, Released by Xuemei Xi 12/21/2001 ****/ - -/********** - * Copyright 2001 Regents of the University of California. All rights reserved. - * File: b3ld.c of BSIM3v3.2.4 - * Author: 1991 JianHui Huang and Min-Chie Jeng. - * Modified by Mansun Chan (1995). - * Author: 1997-1999 Weidong Liu. - * Author: 2001 Xuemei Xi - * Modified by Xuemei Xi, 10/05, 12/21, 2001. - * Modified by Paolo Nenzi 2002 and Dietmar Warning 2003 - **********/ - -#include "ngspice/ngspice.h" -#include "ngspice/cktdefs.h" -#include "bsim3v32def.h" -#include "ngspice/trandefs.h" -#include "ngspice/const.h" -#include "ngspice/sperror.h" -#include "ngspice/devdefs.h" -#include "ngspice/suffix.h" - -#define MAX_EXP 5.834617425e14 -#define MIN_EXP 1.713908431e-15 -#define EXP_THRESHOLD 34.0 -#define EPSOX 3.453133e-11 -#define EPSSI 1.03594e-10 -#define Charge_q 1.60219e-19 -#define DELTA_1 0.02 -#define DELTA_2 0.02 -#define DELTA_3 0.02 -#define DELTA_4 0.02 - -#ifdef USE_OMP -int BSIM3v32LoadOMP(BSIM3v32instance *here, CKTcircuit *ckt); -void BSIM3v32LoadRhsMat(GENmodel *inModel, CKTcircuit *ckt); -#endif - -int -BSIM3v32load (GENmodel *inModel, CKTcircuit *ckt) -{ -#ifdef USE_OMP - int idx; - BSIM3v32model *model = (BSIM3v32model*)inModel; - int error = 0; - BSIM3v32instance **InstArray; - InstArray = model->BSIM3v32InstanceArray; - -#pragma omp parallel for - for (idx = 0; idx < model->BSIM3v32InstCount; idx++) { - BSIM3v32instance *here = InstArray[idx]; - int local_error = BSIM3v32LoadOMP(here, ckt); - if (local_error) - error = local_error; - } - - BSIM3v32LoadRhsMat(inModel, ckt); - - return error; -} - - -int BSIM3v32LoadOMP(BSIM3v32instance *here, CKTcircuit *ckt) { - BSIM3v32model *model = BSIM3v32modPtr(here); -#else -BSIM3v32model *model = (BSIM3v32model*)inModel; -BSIM3v32instance *here; -#endif -double SourceSatCurrent, DrainSatCurrent; -double ag0, qgd, qgs, qgb, von, cbhat, VgstNVt, ExpVgst; -double cdrain, cdhat, cdreq, ceqbd, ceqbs, ceqqb, ceqqd, ceqqg, ceq, geq; -double czbd, czbdsw, czbdswg, czbs, czbssw, czbsswg, evbd, evbs, arg, sarg; -double delvbd, delvbs, delvds, delvgd, delvgs; -double Vfbeff, dVfbeff_dVg, dVfbeff_dVd = 0.0, dVfbeff_dVb, V3, V4; -double gcbdb, gcbgb, gcbsb, gcddb, gcdgb, gcdsb, gcgdb, gcggb, gcgsb, gcsdb; -#ifndef NEWCONV -double tol; -#endif -double gcsgb, gcssb, MJ, MJSW, MJSWG; -double vbd, vbs, vds, vgb, vgd, vgs, vgdo; -#ifndef PREDICTOR -double xfact; -#endif -double qgate = 0.0, qbulk = 0.0, qdrn = 0.0, qsrc; -double qinoi, cqgate, cqbulk, cqdrn; -double Vds, Vgs, Vbs, Gmbs, FwdSum, RevSum; -double Vgs_eff, Vfb, dVfb_dVb = 0.0, dVfb_dVd = 0.0; -double Phis, dPhis_dVb, sqrtPhis, dsqrtPhis_dVb, Vth, dVth_dVb, dVth_dVd; -double Vgst, dVgst_dVg, dVgst_dVb, dVgs_eff_dVg, Nvtm; -double Vtm; -double n, dn_dVb, dn_dVd, voffcv, noff, dnoff_dVd, dnoff_dVb; -double ExpArg, V0, CoxWLcen, QovCox, LINK; -double DeltaPhi, dDeltaPhi_dVg, dDeltaPhi_dVd, dDeltaPhi_dVb; -double Cox, Tox, Tcen, dTcen_dVg, dTcen_dVd, dTcen_dVb; -double Ccen, Coxeff, dCoxeff_dVg, dCoxeff_dVd, dCoxeff_dVb; -double Denomi, dDenomi_dVg, dDenomi_dVd, dDenomi_dVb; -double ueff, dueff_dVg, dueff_dVd, dueff_dVb; -double Esat, Vdsat; -double EsatL, dEsatL_dVg, dEsatL_dVd, dEsatL_dVb; -double dVdsat_dVg, dVdsat_dVb, dVdsat_dVd, Vasat, dAlphaz_dVg, dAlphaz_dVb; -double dVasat_dVg, dVasat_dVb, dVasat_dVd, Va, dVa_dVd, dVa_dVg, dVa_dVb; -double Vbseff, dVbseff_dVb, VbseffCV, dVbseffCV_dVb; -double Arg1, One_Third_CoxWL, Two_Third_CoxWL, Alphaz, CoxWL; -double T0, dT0_dVg, dT0_dVd, dT0_dVb; -double T1, dT1_dVg, dT1_dVd, dT1_dVb; -double T2, dT2_dVg, dT2_dVd, dT2_dVb; -double T3, dT3_dVg, dT3_dVd, dT3_dVb; -double T4; -double T5; -double T6; -double T7; -double T8; -double T9; -double T10; -double T11, T12; -double tmp, Abulk, dAbulk_dVb, Abulk0, dAbulk0_dVb; -double VACLM, dVACLM_dVg, dVACLM_dVd, dVACLM_dVb; -double VADIBL, dVADIBL_dVg, dVADIBL_dVd, dVADIBL_dVb; -double Xdep, dXdep_dVb, lt1, dlt1_dVb, ltw, dltw_dVb, Delt_vth, dDelt_vth_dVb; -double Theta0, dTheta0_dVb; -double TempRatio, tmp1, tmp2, tmp3, tmp4; -double DIBL_Sft, dDIBL_Sft_dVd, Lambda, dLambda_dVg; -double Idtot, Ibtot; -#ifndef NOBYPASS -double tempv; -#endif -double a1, ScalingFactor; - -double Vgsteff, dVgsteff_dVg, dVgsteff_dVd, dVgsteff_dVb; -double Vdseff, dVdseff_dVg, dVdseff_dVd, dVdseff_dVb; -double VdseffCV, dVdseffCV_dVg, dVdseffCV_dVd, dVdseffCV_dVb; -double diffVds, dAbulk_dVg; -double beta, dbeta_dVg, dbeta_dVd, dbeta_dVb; -double gche, dgche_dVg, dgche_dVd, dgche_dVb; -double fgche1, dfgche1_dVg, dfgche1_dVd, dfgche1_dVb; -double fgche2, dfgche2_dVg, dfgche2_dVd, dfgche2_dVb; -double Idl, dIdl_dVg, dIdl_dVd, dIdl_dVb; -double Idsa, dIdsa_dVg, dIdsa_dVd, dIdsa_dVb; -double Ids, Gm, Gds, Gmb; -double Isub, Gbd, Gbg, Gbb; -double VASCBE, dVASCBE_dVg, dVASCBE_dVd, dVASCBE_dVb; -double CoxWovL; -double Rds, dRds_dVg, dRds_dVb, WVCox, WVCoxRds; -double Vgst2Vtm, VdsatCV, dVdsatCV_dVg, dVdsatCV_dVb; -double Leff, Weff, dWeff_dVg, dWeff_dVb; -double AbulkCV, dAbulkCV_dVb; -double qgdo, qgso, cgdo, cgso; - -double qcheq = 0.0, qdef, gqdef = 0.0, cqdef, cqcheq, gtau_diff, gtau_drift; -double gcqdb = 0.0,gcqsb = 0.0, gcqgb = 0.0,gcqbb = 0.0; -double dxpart, sxpart, ggtg, ggtd, ggts, ggtb; -double ddxpart_dVd, ddxpart_dVg, ddxpart_dVb, ddxpart_dVs; -double dsxpart_dVd, dsxpart_dVg, dsxpart_dVb, dsxpart_dVs; - -double gbspsp, gbbdp, gbbsp, gbspg, gbspb, gbspdp; -double gbdpdp, gbdpg, gbdpb, gbdpsp; -double Cgg, Cgd, Cgb, Cdg, Cdd, Cds; -double Csg, Csd, Css, Csb, Cbg, Cbd, Cbb; -double Cgg1, Cgb1, Cgd1, Cbg1, Cbb1, Cbd1, Qac0, Qsub0; -double dQac0_dVg, dQac0_dVd = 0.0, dQac0_dVb, dQsub0_dVg; -double dQsub0_dVd, dQsub0_dVb; - -double m; - -struct bsim3v32SizeDependParam *pParam; -int ByPass, Check, ChargeComputationNeeded, error; - -ScalingFactor = 1.0e-9; -ChargeComputationNeeded = - ((ckt->CKTmode & (MODEDCTRANCURVE | MODEAC | MODETRAN | MODEINITSMSIG)) || - ((ckt->CKTmode & MODETRANOP) && (ckt->CKTmode & MODEUIC))) - ? 1 : 0; -#ifndef USE_OMP -for (; model != NULL; model = BSIM3v32nextModel(model)) -{ for (here = BSIM3v32instances(model); here != NULL; - here = BSIM3v32nextInstance(here)) - { -#endif - Check = 1; - ByPass = 0; - pParam = here->pParam; - if ((ckt->CKTmode & MODEINITSMSIG)) - { vbs = *(ckt->CKTstate0 + here->BSIM3v32vbs); - vgs = *(ckt->CKTstate0 + here->BSIM3v32vgs); - vds = *(ckt->CKTstate0 + here->BSIM3v32vds); - qdef = *(ckt->CKTstate0 + here->BSIM3v32qdef); - } - else if ((ckt->CKTmode & MODEINITTRAN)) - { vbs = *(ckt->CKTstate1 + here->BSIM3v32vbs); - vgs = *(ckt->CKTstate1 + here->BSIM3v32vgs); - vds = *(ckt->CKTstate1 + here->BSIM3v32vds); - qdef = *(ckt->CKTstate1 + here->BSIM3v32qdef); - } - else if ((ckt->CKTmode & MODEINITJCT) && !here->BSIM3v32off) - { vds = model->BSIM3v32type * here->BSIM3v32icVDS; - vgs = model->BSIM3v32type * here->BSIM3v32icVGS; - vbs = model->BSIM3v32type * here->BSIM3v32icVBS; - qdef = 0.0; - - if ((vds == 0.0) && (vgs == 0.0) && (vbs == 0.0) && - ((ckt->CKTmode & (MODETRAN | MODEAC|MODEDCOP | - MODEDCTRANCURVE)) || (!(ckt->CKTmode & MODEUIC)))) - { vbs = 0.0; - vgs = model->BSIM3v32type * here->BSIM3v32vth0 + 0.1; - vds = 0.1; - } - } - else if ((ckt->CKTmode & (MODEINITJCT | MODEINITFIX)) && - (here->BSIM3v32off)) - { qdef = vbs = vgs = vds = 0.0; - } - else - { -#ifndef PREDICTOR - if ((ckt->CKTmode & MODEINITPRED)) - { xfact = ckt->CKTdelta / ckt->CKTdeltaOld[1]; - *(ckt->CKTstate0 + here->BSIM3v32vbs) = - *(ckt->CKTstate1 + here->BSIM3v32vbs); - vbs = (1.0 + xfact)* (*(ckt->CKTstate1 + here->BSIM3v32vbs)) - - (xfact * (*(ckt->CKTstate2 + here->BSIM3v32vbs))); - *(ckt->CKTstate0 + here->BSIM3v32vgs) = - *(ckt->CKTstate1 + here->BSIM3v32vgs); - vgs = (1.0 + xfact)* (*(ckt->CKTstate1 + here->BSIM3v32vgs)) - - (xfact * (*(ckt->CKTstate2 + here->BSIM3v32vgs))); - *(ckt->CKTstate0 + here->BSIM3v32vds) = - *(ckt->CKTstate1 + here->BSIM3v32vds); - vds = (1.0 + xfact)* (*(ckt->CKTstate1 + here->BSIM3v32vds)) - - (xfact * (*(ckt->CKTstate2 + here->BSIM3v32vds))); - *(ckt->CKTstate0 + here->BSIM3v32vbd) = - *(ckt->CKTstate0 + here->BSIM3v32vbs) - - *(ckt->CKTstate0 + here->BSIM3v32vds); - *(ckt->CKTstate0 + here->BSIM3v32qdef) = - *(ckt->CKTstate1 + here->BSIM3v32qdef); - qdef = (1.0 + xfact)* (*(ckt->CKTstate1 + here->BSIM3v32qdef)) - -(xfact * (*(ckt->CKTstate2 + here->BSIM3v32qdef))); - } - else - { -#endif /* PREDICTOR */ - vbs = model->BSIM3v32type - * (*(ckt->CKTrhsOld + here->BSIM3v32bNode) - - *(ckt->CKTrhsOld + here->BSIM3v32sNodePrime)); - vgs = model->BSIM3v32type - * (*(ckt->CKTrhsOld + here->BSIM3v32gNode) - - *(ckt->CKTrhsOld + here->BSIM3v32sNodePrime)); - vds = model->BSIM3v32type - * (*(ckt->CKTrhsOld + here->BSIM3v32dNodePrime) - - *(ckt->CKTrhsOld + here->BSIM3v32sNodePrime)); - qdef = model->BSIM3v32type - * (*(ckt->CKTrhsOld + here->BSIM3v32qNode)); -#ifndef PREDICTOR - } -#endif /* PREDICTOR */ - - vbd = vbs - vds; - vgd = vgs - vds; - vgdo = *(ckt->CKTstate0 + here->BSIM3v32vgs) - - *(ckt->CKTstate0 + here->BSIM3v32vds); - delvbs = vbs - *(ckt->CKTstate0 + here->BSIM3v32vbs); - delvbd = vbd - *(ckt->CKTstate0 + here->BSIM3v32vbd); - delvgs = vgs - *(ckt->CKTstate0 + here->BSIM3v32vgs); - delvds = vds - *(ckt->CKTstate0 + here->BSIM3v32vds); - delvgd = vgd - vgdo; - - if (here->BSIM3v32mode >= 0) - { Idtot = here->BSIM3v32cd + here->BSIM3v32csub - here->BSIM3v32cbd; - cdhat = Idtot - here->BSIM3v32gbd * delvbd - + (here->BSIM3v32gmbs + here->BSIM3v32gbbs) * delvbs - + (here->BSIM3v32gm + here->BSIM3v32gbgs) * delvgs - + (here->BSIM3v32gds + here->BSIM3v32gbds) * delvds; - Ibtot = here->BSIM3v32cbs + here->BSIM3v32cbd - here->BSIM3v32csub; - cbhat = Ibtot + here->BSIM3v32gbd * delvbd - + (here->BSIM3v32gbs - here->BSIM3v32gbbs) * delvbs - - here->BSIM3v32gbgs * delvgs - - here->BSIM3v32gbds * delvds; - } - else - { Idtot = here->BSIM3v32cd - here->BSIM3v32cbd; - cdhat = Idtot - (here->BSIM3v32gbd - here->BSIM3v32gmbs) * delvbd - + here->BSIM3v32gm * delvgd - - here->BSIM3v32gds * delvds; - Ibtot = here->BSIM3v32cbs + here->BSIM3v32cbd - here->BSIM3v32csub; - cbhat = Ibtot + here->BSIM3v32gbs * delvbs - + (here->BSIM3v32gbd - here->BSIM3v32gbbs) * delvbd - - here->BSIM3v32gbgs * delvgd - + here->BSIM3v32gbds * delvds; - } - -#ifndef NOBYPASS - /* following should be one big if connected by && all over - * the place, but some C compilers can't handle that, so - * we split it up here to let them digest it in stages - */ - - if ((!(ckt->CKTmode & MODEINITPRED)) && (ckt->CKTbypass)) - if ((fabs(delvbs) < (ckt->CKTreltol * MAX(fabs(vbs), - fabs(*(ckt->CKTstate0+here->BSIM3v32vbs))) + ckt->CKTvoltTol))) - if ((fabs(delvbd) < (ckt->CKTreltol * MAX(fabs(vbd), - fabs(*(ckt->CKTstate0+here->BSIM3v32vbd))) + ckt->CKTvoltTol))) - if ((fabs(delvgs) < (ckt->CKTreltol * MAX(fabs(vgs), - fabs(*(ckt->CKTstate0+here->BSIM3v32vgs))) + ckt->CKTvoltTol))) - if ((fabs(delvds) < (ckt->CKTreltol * MAX(fabs(vds), - fabs(*(ckt->CKTstate0+here->BSIM3v32vds))) + ckt->CKTvoltTol))) - if ((fabs(cdhat - Idtot) < ckt->CKTreltol - * MAX(fabs(cdhat),fabs(Idtot)) + ckt->CKTabstol)) - { tempv = MAX(fabs(cbhat),fabs(Ibtot)) + ckt->CKTabstol; - if ((fabs(cbhat - Ibtot)) < ckt->CKTreltol * tempv) - { /* bypass code */ - vbs = *(ckt->CKTstate0 + here->BSIM3v32vbs); - vbd = *(ckt->CKTstate0 + here->BSIM3v32vbd); - vgs = *(ckt->CKTstate0 + here->BSIM3v32vgs); - vds = *(ckt->CKTstate0 + here->BSIM3v32vds); - qdef = *(ckt->CKTstate0 + here->BSIM3v32qdef); - - vgd = vgs - vds; - vgb = vgs - vbs; - - cdrain = here->BSIM3v32cd; - if ((ckt->CKTmode & (MODETRAN | MODEAC)) || - ((ckt->CKTmode & MODETRANOP) && - (ckt->CKTmode & MODEUIC))) - { ByPass = 1; - qgate = here->BSIM3v32qgate; - qbulk = here->BSIM3v32qbulk; - qdrn = here->BSIM3v32qdrn; - goto line755; - } - else - { goto line850; - } - } - } - -#endif /*NOBYPASS*/ - von = here->BSIM3v32von; - if (*(ckt->CKTstate0 + here->BSIM3v32vds) >= 0.0) - { vgs = DEVfetlim(vgs, *(ckt->CKTstate0+here->BSIM3v32vgs), von); - vds = vgs - vgd; - vds = DEVlimvds(vds, *(ckt->CKTstate0 + here->BSIM3v32vds)); - vgd = vgs - vds; - - } - else - { vgd = DEVfetlim(vgd, vgdo, von); - vds = vgs - vgd; - vds = -DEVlimvds(-vds, -(*(ckt->CKTstate0+here->BSIM3v32vds))); - vgs = vgd + vds; - } - - if (vds >= 0.0) - { vbs = DEVpnjlim(vbs, *(ckt->CKTstate0 + here->BSIM3v32vbs), - CONSTvt0, model->BSIM3v32vcrit, &Check); - vbd = vbs - vds; - - } - else - { vbd = DEVpnjlim(vbd, *(ckt->CKTstate0 + here->BSIM3v32vbd), - CONSTvt0, model->BSIM3v32vcrit, &Check); - vbs = vbd + vds; - } - } - - /* determine DC current and derivatives */ - vbd = vbs - vds; - vgd = vgs - vds; - vgb = vgs - vbs; - - /* Source/drain junction diode DC model begins */ - Nvtm = model->BSIM3v32vtm * model->BSIM3v32jctEmissionCoeff; - /* acm model */ - if (model->BSIM3v32acmMod == 0) - { - if ((here->BSIM3v32sourceArea <= 0.0) - && (here->BSIM3v32sourcePerimeter <= 0.0)) - { - SourceSatCurrent = 1.0e-14; - } - else - { - SourceSatCurrent = here->BSIM3v32sourceArea - * model->BSIM3v32jctTempSatCurDensity - + here->BSIM3v32sourcePerimeter - * model->BSIM3v32jctSidewallTempSatCurDensity; - } - if ((here->BSIM3v32drainArea <= 0.0) && (here->BSIM3v32drainPerimeter <= 0.0)) - { DrainSatCurrent = 1.0e-14; - } - else - { DrainSatCurrent = here->BSIM3v32drainArea - * model->BSIM3v32jctTempSatCurDensity - + here->BSIM3v32drainPerimeter - * model->BSIM3v32jctSidewallTempSatCurDensity; - } - } - else - { - error = ACM_saturationCurrents( - model->BSIM3v32acmMod, - model->BSIM3v32calcacm, - here->BSIM3v32geo, - model->BSIM3v32hdif, - model->BSIM3v32wmlt, - here->BSIM3v32w, - model->BSIM3v32xw, - model->BSIM3v32jctTempSatCurDensity, - model->BSIM3v32jctSidewallTempSatCurDensity, - here->BSIM3v32drainAreaGiven, - here->BSIM3v32drainArea, - here->BSIM3v32drainPerimeterGiven, - here->BSIM3v32drainPerimeter, - here->BSIM3v32sourceAreaGiven, - here->BSIM3v32sourceArea, - here->BSIM3v32sourcePerimeterGiven, - here->BSIM3v32sourcePerimeter, - &DrainSatCurrent, - &SourceSatCurrent - ); - if (error) - return(error); - } - if (SourceSatCurrent <= 0.0) - { here->BSIM3v32gbs = ckt->CKTgmin; - here->BSIM3v32cbs = here->BSIM3v32gbs * vbs; - } - else - { if (model->BSIM3v32ijth == 0.0) - { evbs = exp(vbs / Nvtm); - here->BSIM3v32gbs = SourceSatCurrent * evbs / Nvtm + ckt->CKTgmin; - here->BSIM3v32cbs = SourceSatCurrent * (evbs - 1.0) - + ckt->CKTgmin * vbs; - } - else - { if (vbs < here->BSIM3v32vjsm) - { evbs = exp(vbs / Nvtm); - here->BSIM3v32gbs = SourceSatCurrent * evbs / Nvtm + ckt->CKTgmin; - here->BSIM3v32cbs = SourceSatCurrent * (evbs - 1.0) - + ckt->CKTgmin * vbs; - } - else - { - /* Added revision dependent code */ - switch (model->BSIM3v32intVersion) { - case BSIM3v32V324: - case BSIM3v32V323: - case BSIM3v32V322: - T0 = here->BSIM3v32IsEvjsm / Nvtm; - here->BSIM3v32gbs = T0 + (ckt->CKTgmin); - here->BSIM3v32cbs = here->BSIM3v32IsEvjsm - SourceSatCurrent - + T0 * (vbs - here->BSIM3v32vjsm) + (ckt->CKTgmin) * vbs; - break; - case BSIM3v32V32: - default: - T0 = (SourceSatCurrent + model->BSIM3v32ijth) / Nvtm; - here->BSIM3v32gbs = T0 + (ckt->CKTgmin); - here->BSIM3v32cbs = model->BSIM3v32ijth + (ckt->CKTgmin) * vbs - + T0 * (vbs - here->BSIM3v32vjsm); - } - } - } - } - - if (DrainSatCurrent <= 0.0) - { here->BSIM3v32gbd = ckt->CKTgmin; - here->BSIM3v32cbd = here->BSIM3v32gbd * vbd; - } - else - { if (model->BSIM3v32ijth == 0.0) - { evbd = exp(vbd / Nvtm); - here->BSIM3v32gbd = DrainSatCurrent * evbd / Nvtm + ckt->CKTgmin; - here->BSIM3v32cbd = DrainSatCurrent * (evbd - 1.0) - + ckt->CKTgmin * vbd; - } - else - { if (vbd < here->BSIM3v32vjdm) - { evbd = exp(vbd / Nvtm); - here->BSIM3v32gbd = DrainSatCurrent * evbd / Nvtm + ckt->CKTgmin; - here->BSIM3v32cbd = DrainSatCurrent * (evbd - 1.0) - + ckt->CKTgmin * vbd; - } - else - { - /* Added revision dependent code */ - switch (model->BSIM3v32intVersion) { - case BSIM3v32V324: - case BSIM3v32V323: - case BSIM3v32V322: - T0 = here->BSIM3v32IsEvjdm / Nvtm; - here->BSIM3v32gbd = T0 + (ckt->CKTgmin); - here->BSIM3v32cbd = here->BSIM3v32IsEvjdm - DrainSatCurrent - + T0 * (vbd - here->BSIM3v32vjdm) + (ckt->CKTgmin) * vbd; - break; - case BSIM3v32V32: - default: - T0 = (DrainSatCurrent + model->BSIM3v32ijth) / Nvtm; - here->BSIM3v32gbd = T0 + (ckt->CKTgmin); - here->BSIM3v32cbd = model->BSIM3v32ijth + (ckt->CKTgmin) * vbd - + T0 * (vbd - here->BSIM3v32vjdm); - } - } - } - } - /* End of diode DC model */ - - if (vds >= 0.0) - { /* normal mode */ - here->BSIM3v32mode = 1; - Vds = vds; - Vgs = vgs; - Vbs = vbs; - } - else - { /* inverse mode */ - here->BSIM3v32mode = -1; - Vds = -vds; - Vgs = vgd; - Vbs = vbd; - } - - T0 = Vbs - pParam->BSIM3v32vbsc - 0.001; - T1 = sqrt(T0 * T0 - 0.004 * pParam->BSIM3v32vbsc); - Vbseff = pParam->BSIM3v32vbsc + 0.5 * (T0 + T1); - dVbseff_dVb = 0.5 * (1.0 + T0 / T1); - if (Vbseff < Vbs) - { Vbseff = Vbs; - } - - if (Vbseff > 0.0) - { T0 = pParam->BSIM3v32phi / (pParam->BSIM3v32phi + Vbseff); - Phis = pParam->BSIM3v32phi * T0; - dPhis_dVb = -T0 * T0; - sqrtPhis = pParam->BSIM3v32phis3 / (pParam->BSIM3v32phi + 0.5 * Vbseff); - dsqrtPhis_dVb = -0.5 * sqrtPhis * sqrtPhis / pParam->BSIM3v32phis3; - } - else - { Phis = pParam->BSIM3v32phi - Vbseff; - dPhis_dVb = -1.0; - sqrtPhis = sqrt(Phis); - dsqrtPhis_dVb = -0.5 / sqrtPhis; - } - Xdep = pParam->BSIM3v32Xdep0 * sqrtPhis / pParam->BSIM3v32sqrtPhi; - dXdep_dVb = (pParam->BSIM3v32Xdep0 / pParam->BSIM3v32sqrtPhi) - * dsqrtPhis_dVb; - - Leff = pParam->BSIM3v32leff; - Vtm = model->BSIM3v32vtm; -/* Vth Calculation */ - T3 = sqrt(Xdep); - V0 = pParam->BSIM3v32vbi - pParam->BSIM3v32phi; - - T0 = pParam->BSIM3v32dvt2 * Vbseff; - if (T0 >= - 0.5) - { T1 = 1.0 + T0; - T2 = pParam->BSIM3v32dvt2; - } - else /* Added to avoid any discontinuity problems caused by dvt2 */ - { T4 = 1.0 / (3.0 + 8.0 * T0); - T1 = (1.0 + 3.0 * T0) * T4; - T2 = pParam->BSIM3v32dvt2 * T4 * T4; - } - lt1 = model->BSIM3v32factor1 * T3 * T1; - dlt1_dVb = model->BSIM3v32factor1 * (0.5 / T3 * T1 * dXdep_dVb + T3 * T2); - - T0 = pParam->BSIM3v32dvt2w * Vbseff; - if (T0 >= - 0.5) - { T1 = 1.0 + T0; - T2 = pParam->BSIM3v32dvt2w; - } - else /* Added to avoid any discontinuity problems caused by dvt2w */ - { T4 = 1.0 / (3.0 + 8.0 * T0); - T1 = (1.0 + 3.0 * T0) * T4; - T2 = pParam->BSIM3v32dvt2w * T4 * T4; - } - ltw = model->BSIM3v32factor1 * T3 * T1; - dltw_dVb = model->BSIM3v32factor1 * (0.5 / T3 * T1 * dXdep_dVb + T3 * T2); - - T0 = -0.5 * pParam->BSIM3v32dvt1 * Leff / lt1; - if (T0 > -EXP_THRESHOLD) - { T1 = exp(T0); - Theta0 = T1 * (1.0 + 2.0 * T1); - dT1_dVb = -T0 / lt1 * T1 * dlt1_dVb; - dTheta0_dVb = (1.0 + 4.0 * T1) * dT1_dVb; - } - else - { T1 = MIN_EXP; - Theta0 = T1 * (1.0 + 2.0 * T1); - dTheta0_dVb = 0.0; - } - - here->BSIM3v32thetavth = pParam->BSIM3v32dvt0 * Theta0; - Delt_vth = here->BSIM3v32thetavth * V0; - dDelt_vth_dVb = pParam->BSIM3v32dvt0 * dTheta0_dVb * V0; - - T0 = -0.5 * pParam->BSIM3v32dvt1w * pParam->BSIM3v32weff * Leff / ltw; - if (T0 > -EXP_THRESHOLD) - { T1 = exp(T0); - T2 = T1 * (1.0 + 2.0 * T1); - dT1_dVb = -T0 / ltw * T1 * dltw_dVb; - dT2_dVb = (1.0 + 4.0 * T1) * dT1_dVb; - } - else - { T1 = MIN_EXP; - T2 = T1 * (1.0 + 2.0 * T1); - dT2_dVb = 0.0; - } - - T0 = pParam->BSIM3v32dvt0w * T2; - T2 = T0 * V0; - dT2_dVb = pParam->BSIM3v32dvt0w * dT2_dVb * V0; - - TempRatio = ckt->CKTtemp / model->BSIM3v32tnom - 1.0; - T0 = sqrt(1.0 + pParam->BSIM3v32nlx / Leff); - T1 = pParam->BSIM3v32k1ox * (T0 - 1.0) * pParam->BSIM3v32sqrtPhi - + (pParam->BSIM3v32kt1 + pParam->BSIM3v32kt1l / Leff - + pParam->BSIM3v32kt2 * Vbseff) * TempRatio; - tmp2 = model->BSIM3v32tox * pParam->BSIM3v32phi - / (pParam->BSIM3v32weff + pParam->BSIM3v32w0); - - T3 = pParam->BSIM3v32eta0 + pParam->BSIM3v32etab * Vbseff; - if (T3 < 1.0e-4) /* avoid discontinuity problems caused by etab */ - { T9 = 1.0 / (3.0 - 2.0e4 * T3); - T3 = (2.0e-4 - T3) * T9; - T4 = T9 * T9; - } - else - { T4 = 1.0; - } - dDIBL_Sft_dVd = T3 * pParam->BSIM3v32theta0vb0; - DIBL_Sft = dDIBL_Sft_dVd * Vds; - - Vth = model->BSIM3v32type * here->BSIM3v32vth0 - pParam->BSIM3v32k1 - * pParam->BSIM3v32sqrtPhi + pParam->BSIM3v32k1ox * sqrtPhis - - pParam->BSIM3v32k2ox * Vbseff - Delt_vth - T2 + (pParam->BSIM3v32k3 - + pParam->BSIM3v32k3b * Vbseff) * tmp2 + T1 - DIBL_Sft; - - here->BSIM3v32von = Vth; - - dVth_dVb = pParam->BSIM3v32k1ox * dsqrtPhis_dVb - pParam->BSIM3v32k2ox - - dDelt_vth_dVb - dT2_dVb + pParam->BSIM3v32k3b * tmp2 - - pParam->BSIM3v32etab * Vds * pParam->BSIM3v32theta0vb0 * T4 - + pParam->BSIM3v32kt2 * TempRatio; - dVth_dVd = -dDIBL_Sft_dVd; - -/* Calculate n */ - tmp2 = pParam->BSIM3v32nfactor * EPSSI / Xdep; - tmp3 = pParam->BSIM3v32cdsc + pParam->BSIM3v32cdscb * Vbseff - + pParam->BSIM3v32cdscd * Vds; - tmp4 = (tmp2 + tmp3 * Theta0 + pParam->BSIM3v32cit) / model->BSIM3v32cox; - if (tmp4 >= -0.5) - { n = 1.0 + tmp4; - dn_dVb = (-tmp2 / Xdep * dXdep_dVb + tmp3 * dTheta0_dVb - + pParam->BSIM3v32cdscb * Theta0) / model->BSIM3v32cox; - dn_dVd = pParam->BSIM3v32cdscd * Theta0 / model->BSIM3v32cox; - } - else - /* avoid discontinuity problems caused by tmp4 */ - { T0 = 1.0 / (3.0 + 8.0 * tmp4); - n = (1.0 + 3.0 * tmp4) * T0; - T0 *= T0; - dn_dVb = (-tmp2 / Xdep * dXdep_dVb + tmp3 * dTheta0_dVb - + pParam->BSIM3v32cdscb * Theta0) / model->BSIM3v32cox * T0; - dn_dVd = pParam->BSIM3v32cdscd * Theta0 / model->BSIM3v32cox * T0; - } - -/* Poly Gate Si Depletion Effect */ - T0 = here->BSIM3v32vfb + pParam->BSIM3v32phi; - if ((pParam->BSIM3v32ngate > 1.e18) && (pParam->BSIM3v32ngate < 1.e25) - && (Vgs > T0)) - /* added to avoid the problem caused by ngate */ - { T1 = 1.0e6 * Charge_q * EPSSI * pParam->BSIM3v32ngate - / (model->BSIM3v32cox * model->BSIM3v32cox); - T4 = sqrt(1.0 + 2.0 * (Vgs - T0) / T1); - T2 = T1 * (T4 - 1.0); - T3 = 0.5 * T2 * T2 / T1; /* T3 = Vpoly */ - T7 = 1.12 - T3 - 0.05; - T6 = sqrt(T7 * T7 + 0.224); - T5 = 1.12 - 0.5 * (T7 + T6); - Vgs_eff = Vgs - T5; - dVgs_eff_dVg = 1.0 - (0.5 - 0.5 / T4) * (1.0 + T7 / T6); - } - else - { Vgs_eff = Vgs; - dVgs_eff_dVg = 1.0; - } - Vgst = Vgs_eff - Vth; - -/* Effective Vgst (Vgsteff) Calculation */ - - T10 = 2.0 * n * Vtm; - VgstNVt = Vgst / T10; - ExpArg = (2.0 * pParam->BSIM3v32voff - Vgst) / T10; - - /* MCJ: Very small Vgst */ - if (VgstNVt > EXP_THRESHOLD) - { Vgsteff = Vgst; - dVgsteff_dVg = dVgs_eff_dVg; - dVgsteff_dVd = -dVth_dVd; - dVgsteff_dVb = -dVth_dVb; - } - else if (ExpArg > EXP_THRESHOLD) - { T0 = (Vgst - pParam->BSIM3v32voff) / (n * Vtm); - ExpVgst = exp(T0); - Vgsteff = Vtm * pParam->BSIM3v32cdep0 / model->BSIM3v32cox * ExpVgst; - dVgsteff_dVg = Vgsteff / (n * Vtm); - dVgsteff_dVd = -dVgsteff_dVg * (dVth_dVd + T0 * Vtm * dn_dVd); - dVgsteff_dVb = -dVgsteff_dVg * (dVth_dVb + T0 * Vtm * dn_dVb); - dVgsteff_dVg *= dVgs_eff_dVg; - } - else - { ExpVgst = exp(VgstNVt); - T1 = T10 * log(1.0 + ExpVgst); - dT1_dVg = ExpVgst / (1.0 + ExpVgst); - dT1_dVb = -dT1_dVg * (dVth_dVb + Vgst / n * dn_dVb) - + T1 / n * dn_dVb; - dT1_dVd = -dT1_dVg * (dVth_dVd + Vgst / n * dn_dVd) - + T1 / n * dn_dVd; - - dT2_dVg = -model->BSIM3v32cox / (Vtm * pParam->BSIM3v32cdep0) - * exp(ExpArg); - T2 = 1.0 - T10 * dT2_dVg; - dT2_dVd = -dT2_dVg * (dVth_dVd - 2.0 * Vtm * ExpArg * dn_dVd) - + (T2 - 1.0) / n * dn_dVd; - dT2_dVb = -dT2_dVg * (dVth_dVb - 2.0 * Vtm * ExpArg * dn_dVb) - + (T2 - 1.0) / n * dn_dVb; - - Vgsteff = T1 / T2; - T3 = T2 * T2; - dVgsteff_dVg = (T2 * dT1_dVg - T1 * dT2_dVg) / T3 * dVgs_eff_dVg; - dVgsteff_dVd = (T2 * dT1_dVd - T1 * dT2_dVd) / T3; - dVgsteff_dVb = (T2 * dT1_dVb - T1 * dT2_dVb) / T3; - } - /* Added revision dependent code */ - if (model->BSIM3v32intVersion > BSIM3v32V323) { - here->BSIM3v32Vgsteff = Vgsteff; - } - -/* Calculate Effective Channel Geometry */ - T9 = sqrtPhis - pParam->BSIM3v32sqrtPhi; - Weff = pParam->BSIM3v32weff - 2.0 * (pParam->BSIM3v32dwg * Vgsteff - + pParam->BSIM3v32dwb * T9); - dWeff_dVg = -2.0 * pParam->BSIM3v32dwg; - dWeff_dVb = -2.0 * pParam->BSIM3v32dwb * dsqrtPhis_dVb; - - if (Weff < 2.0e-8) /* to avoid the discontinuity problem due to Weff*/ - { T0 = 1.0 / (6.0e-8 - 2.0 * Weff); - Weff = 2.0e-8 * (4.0e-8 - Weff) * T0; - T0 *= T0 * 4.0e-16; - dWeff_dVg *= T0; - dWeff_dVb *= T0; - } - - T0 = pParam->BSIM3v32prwg * Vgsteff + pParam->BSIM3v32prwb * T9; - if (T0 >= -0.9) - { Rds = pParam->BSIM3v32rds0 * (1.0 + T0); - dRds_dVg = pParam->BSIM3v32rds0 * pParam->BSIM3v32prwg; - dRds_dVb = pParam->BSIM3v32rds0 * pParam->BSIM3v32prwb * dsqrtPhis_dVb; - } - else - /* to avoid the discontinuity problem due to prwg and prwb*/ - { T1 = 1.0 / (17.0 + 20.0 * T0); - Rds = pParam->BSIM3v32rds0 * (0.8 + T0) * T1; - T1 *= T1; - dRds_dVg = pParam->BSIM3v32rds0 * pParam->BSIM3v32prwg * T1; - dRds_dVb = pParam->BSIM3v32rds0 * pParam->BSIM3v32prwb * dsqrtPhis_dVb - * T1; - } - /* Added revision dependent code */ - if (model->BSIM3v32intVersion > BSIM3v32V323) { - here->BSIM3v32rds = Rds; /* Noise Bugfix */ - } - -/* Calculate Abulk */ - T1 = 0.5 * pParam->BSIM3v32k1ox / sqrtPhis; - dT1_dVb = -T1 / sqrtPhis * dsqrtPhis_dVb; - - T9 = sqrt(pParam->BSIM3v32xj * Xdep); - tmp1 = Leff + 2.0 * T9; - T5 = Leff / tmp1; - tmp2 = pParam->BSIM3v32a0 * T5; - tmp3 = pParam->BSIM3v32weff + pParam->BSIM3v32b1; - tmp4 = pParam->BSIM3v32b0 / tmp3; - T2 = tmp2 + tmp4; - dT2_dVb = -T9 / tmp1 / Xdep * dXdep_dVb; - T6 = T5 * T5; - T7 = T5 * T6; - - Abulk0 = 1.0 + T1 * T2; - dAbulk0_dVb = T1 * tmp2 * dT2_dVb + T2 * dT1_dVb; - - T8 = pParam->BSIM3v32ags * pParam->BSIM3v32a0 * T7; - dAbulk_dVg = -T1 * T8; - Abulk = Abulk0 + dAbulk_dVg * Vgsteff; - dAbulk_dVb = dAbulk0_dVb - T8 * Vgsteff * (dT1_dVb - + 3.0 * T1 * dT2_dVb); - - if (Abulk0 < 0.1) /* added to avoid the problems caused by Abulk0 */ - { T9 = 1.0 / (3.0 - 20.0 * Abulk0); - Abulk0 = (0.2 - Abulk0) * T9; - dAbulk0_dVb *= T9 * T9; - } - - if (Abulk < 0.1) - /* added to avoid the problems caused by Abulk */ - { T9 = 1.0 / (3.0 - 20.0 * Abulk); - Abulk = (0.2 - Abulk) * T9; - /* Added revision dependent code */ - if (model->BSIM3v32intVersion > BSIM3v32V32) { - T10 = T9 * T9; - dAbulk_dVb *= T10; - dAbulk_dVg *= T10; - } else { - dAbulk_dVb *= T9 * T9; - } - } - /* Added revision dependent code */ - if (model->BSIM3v32intVersion > BSIM3v32V323) { - here->BSIM3v32Abulk = Abulk; - } - - T2 = pParam->BSIM3v32keta * Vbseff; - if (T2 >= -0.9) - { T0 = 1.0 / (1.0 + T2); - dT0_dVb = -pParam->BSIM3v32keta * T0 * T0; - } - else - /* added to avoid the problems caused by Keta */ - { T1 = 1.0 / (0.8 + T2); - T0 = (17.0 + 20.0 * T2) * T1; - dT0_dVb = -pParam->BSIM3v32keta * T1 * T1; - } - dAbulk_dVg *= T0; - dAbulk_dVb = dAbulk_dVb * T0 + Abulk * dT0_dVb; - dAbulk0_dVb = dAbulk0_dVb * T0 + Abulk0 * dT0_dVb; - Abulk *= T0; - Abulk0 *= T0; - - -/* Mobility calculation */ - if (model->BSIM3v32mobMod == 1) - { T0 = Vgsteff + Vth + Vth; - T2 = pParam->BSIM3v32ua + pParam->BSIM3v32uc * Vbseff; - T3 = T0 / model->BSIM3v32tox; - T5 = T3 * (T2 + pParam->BSIM3v32ub * T3); - dDenomi_dVg = (T2 + 2.0 * pParam->BSIM3v32ub * T3) / model->BSIM3v32tox; - dDenomi_dVd = dDenomi_dVg * 2.0 * dVth_dVd; - dDenomi_dVb = dDenomi_dVg * 2.0 * dVth_dVb + pParam->BSIM3v32uc * T3; - } - else if (model->BSIM3v32mobMod == 2) - { T5 = Vgsteff / model->BSIM3v32tox * (pParam->BSIM3v32ua - + pParam->BSIM3v32uc * Vbseff + pParam->BSIM3v32ub * Vgsteff - / model->BSIM3v32tox); - dDenomi_dVg = (pParam->BSIM3v32ua + pParam->BSIM3v32uc * Vbseff - + 2.0 * pParam->BSIM3v32ub * Vgsteff / model->BSIM3v32tox) - / model->BSIM3v32tox; - dDenomi_dVd = 0.0; - dDenomi_dVb = Vgsteff * pParam->BSIM3v32uc / model->BSIM3v32tox; - } - else - { T0 = Vgsteff + Vth + Vth; - T2 = 1.0 + pParam->BSIM3v32uc * Vbseff; - T3 = T0 / model->BSIM3v32tox; - T4 = T3 * (pParam->BSIM3v32ua + pParam->BSIM3v32ub * T3); - T5 = T4 * T2; - dDenomi_dVg = (pParam->BSIM3v32ua + 2.0 * pParam->BSIM3v32ub * T3) * T2 - / model->BSIM3v32tox; - dDenomi_dVd = dDenomi_dVg * 2.0 * dVth_dVd; - dDenomi_dVb = dDenomi_dVg * 2.0 * dVth_dVb + pParam->BSIM3v32uc * T4; - } - - if (T5 >= -0.8) - { Denomi = 1.0 + T5; - } - else /* Added to avoid the discontinuity problem caused by ua and ub*/ - { T9 = 1.0 / (7.0 + 10.0 * T5); - Denomi = (0.6 + T5) * T9; - T9 *= T9; - dDenomi_dVg *= T9; - dDenomi_dVd *= T9; - dDenomi_dVb *= T9; - } - - here->BSIM3v32ueff = ueff = here->BSIM3v32u0temp / Denomi; - T9 = -ueff / Denomi; - dueff_dVg = T9 * dDenomi_dVg; - dueff_dVd = T9 * dDenomi_dVd; - dueff_dVb = T9 * dDenomi_dVb; - -/* Saturation Drain Voltage Vdsat */ - WVCox = Weff * pParam->BSIM3v32vsattemp * model->BSIM3v32cox; - WVCoxRds = WVCox * Rds; - - Esat = 2.0 * pParam->BSIM3v32vsattemp / ueff; - EsatL = Esat * Leff; - T0 = -EsatL /ueff; - dEsatL_dVg = T0 * dueff_dVg; - dEsatL_dVd = T0 * dueff_dVd; - dEsatL_dVb = T0 * dueff_dVb; - - /* Sqrt() */ - a1 = pParam->BSIM3v32a1; - if (a1 == 0.0) - { Lambda = pParam->BSIM3v32a2; - dLambda_dVg = 0.0; - } - else if (a1 > 0.0) -/* Added to avoid the discontinuity problem - caused by a1 and a2 (Lambda) */ - { T0 = 1.0 - pParam->BSIM3v32a2; - T1 = T0 - pParam->BSIM3v32a1 * Vgsteff - 0.0001; - T2 = sqrt(T1 * T1 + 0.0004 * T0); - Lambda = pParam->BSIM3v32a2 + T0 - 0.5 * (T1 + T2); - dLambda_dVg = 0.5 * pParam->BSIM3v32a1 * (1.0 + T1 / T2); - } - else - { T1 = pParam->BSIM3v32a2 + pParam->BSIM3v32a1 * Vgsteff - 0.0001; - T2 = sqrt(T1 * T1 + 0.0004 * pParam->BSIM3v32a2); - Lambda = 0.5 * (T1 + T2); - dLambda_dVg = 0.5 * pParam->BSIM3v32a1 * (1.0 + T1 / T2); - } - - Vgst2Vtm = Vgsteff + 2.0 * Vtm; - /* Added revision dependent code */ - if (model->BSIM3v32intVersion > BSIM3v32V323) { - here->BSIM3v32AbovVgst2Vtm = Abulk / Vgst2Vtm; - } - - if (Rds > 0) - { tmp2 = dRds_dVg / Rds + dWeff_dVg / Weff; - tmp3 = dRds_dVb / Rds + dWeff_dVb / Weff; - } - else - { tmp2 = dWeff_dVg / Weff; - tmp3 = dWeff_dVb / Weff; - } - if ((Rds == 0.0) && (Lambda == 1.0)) - { T0 = 1.0 / (Abulk * EsatL + Vgst2Vtm); - tmp1 = 0.0; - T1 = T0 * T0; - T2 = Vgst2Vtm * T0; - T3 = EsatL * Vgst2Vtm; - Vdsat = T3 * T0; - - dT0_dVg = -(Abulk * dEsatL_dVg + EsatL * dAbulk_dVg + 1.0) * T1; - dT0_dVd = -(Abulk * dEsatL_dVd) * T1; - dT0_dVb = -(Abulk * dEsatL_dVb + dAbulk_dVb * EsatL) * T1; - - dVdsat_dVg = T3 * dT0_dVg + T2 * dEsatL_dVg + EsatL * T0; - dVdsat_dVd = T3 * dT0_dVd + T2 * dEsatL_dVd; - dVdsat_dVb = T3 * dT0_dVb + T2 * dEsatL_dVb; - } - else - { tmp1 = dLambda_dVg / (Lambda * Lambda); - T9 = Abulk * WVCoxRds; - T8 = Abulk * T9; - T7 = Vgst2Vtm * T9; - T6 = Vgst2Vtm * WVCoxRds; - T0 = 2.0 * Abulk * (T9 - 1.0 + 1.0 / Lambda); - dT0_dVg = 2.0 * (T8 * tmp2 - Abulk * tmp1 - + (2.0 * T9 + 1.0 / Lambda - 1.0) * dAbulk_dVg); - - dT0_dVb = 2.0 * (T8 * (2.0 / Abulk * dAbulk_dVb + tmp3) - + (1.0 / Lambda - 1.0) * dAbulk_dVb); - dT0_dVd = 0.0; - T1 = Vgst2Vtm * (2.0 / Lambda - 1.0) + Abulk * EsatL + 3.0 * T7; - - dT1_dVg = (2.0 / Lambda - 1.0) - 2.0 * Vgst2Vtm * tmp1 - + Abulk * dEsatL_dVg + EsatL * dAbulk_dVg + 3.0 * (T9 - + T7 * tmp2 + T6 * dAbulk_dVg); - dT1_dVb = Abulk * dEsatL_dVb + EsatL * dAbulk_dVb - + 3.0 * (T6 * dAbulk_dVb + T7 * tmp3); - dT1_dVd = Abulk * dEsatL_dVd; - - T2 = Vgst2Vtm * (EsatL + 2.0 * T6); - dT2_dVg = EsatL + Vgst2Vtm * dEsatL_dVg - + T6 * (4.0 + 2.0 * Vgst2Vtm * tmp2); - dT2_dVb = Vgst2Vtm * (dEsatL_dVb + 2.0 * T6 * tmp3); - dT2_dVd = Vgst2Vtm * dEsatL_dVd; - - T3 = sqrt(T1 * T1 - 2.0 * T0 * T2); - Vdsat = (T1 - T3) / T0; - - dT3_dVg = (T1 * dT1_dVg - 2.0 * (T0 * dT2_dVg + T2 * dT0_dVg)) - / T3; - dT3_dVd = (T1 * dT1_dVd - 2.0 * (T0 * dT2_dVd + T2 * dT0_dVd)) - / T3; - dT3_dVb = (T1 * dT1_dVb - 2.0 * (T0 * dT2_dVb + T2 * dT0_dVb)) - / T3; - - dVdsat_dVg = (dT1_dVg - (T1 * dT1_dVg - dT0_dVg * T2 - - T0 * dT2_dVg) / T3 - Vdsat * dT0_dVg) / T0; - dVdsat_dVb = (dT1_dVb - (T1 * dT1_dVb - dT0_dVb * T2 - - T0 * dT2_dVb) / T3 - Vdsat * dT0_dVb) / T0; - dVdsat_dVd = (dT1_dVd - (T1 * dT1_dVd - T0 * dT2_dVd) / T3) / T0; - } - here->BSIM3v32vdsat = Vdsat; - -/* Effective Vds (Vdseff) Calculation */ - T1 = Vdsat - Vds - pParam->BSIM3v32delta; - dT1_dVg = dVdsat_dVg; - dT1_dVd = dVdsat_dVd - 1.0; - dT1_dVb = dVdsat_dVb; - - T2 = sqrt(T1 * T1 + 4.0 * pParam->BSIM3v32delta * Vdsat); - T0 = T1 / T2; - T3 = 2.0 * pParam->BSIM3v32delta / T2; - dT2_dVg = T0 * dT1_dVg + T3 * dVdsat_dVg; - dT2_dVd = T0 * dT1_dVd + T3 * dVdsat_dVd; - dT2_dVb = T0 * dT1_dVb + T3 * dVdsat_dVb; - - Vdseff = Vdsat - 0.5 * (T1 + T2); - dVdseff_dVg = dVdsat_dVg - 0.5 * (dT1_dVg + dT2_dVg); - dVdseff_dVd = dVdsat_dVd - 0.5 * (dT1_dVd + dT2_dVd); - dVdseff_dVb = dVdsat_dVb - 0.5 * (dT1_dVb + dT2_dVb); - /* Added revision dependent code */ - switch (model->BSIM3v32intVersion) { - case BSIM3v32V324: - case BSIM3v32V323: - case BSIM3v32V322: - /* Added to eliminate non-zero Vdseff at Vds=0.0 */ - if (Vds == 0.0) - { - Vdseff = 0.0; - dVdseff_dVg = 0.0; - dVdseff_dVb = 0.0; - } - break; - case BSIM3v32V32: - default: - /* Do nothing */ - break; - } - -/* Calculate VAsat */ - tmp4 = 1.0 - 0.5 * Abulk * Vdsat / Vgst2Vtm; - T9 = WVCoxRds * Vgsteff; - T8 = T9 / Vgst2Vtm; - T0 = EsatL + Vdsat + 2.0 * T9 * tmp4; - - T7 = 2.0 * WVCoxRds * tmp4; - dT0_dVg = dEsatL_dVg + dVdsat_dVg + T7 * (1.0 + tmp2 * Vgsteff) - - T8 * (Abulk * dVdsat_dVg - Abulk * Vdsat / Vgst2Vtm - + Vdsat * dAbulk_dVg); - - dT0_dVb = dEsatL_dVb + dVdsat_dVb + T7 * tmp3 * Vgsteff - - T8 * (dAbulk_dVb * Vdsat + Abulk * dVdsat_dVb); - dT0_dVd = dEsatL_dVd + dVdsat_dVd - T8 * Abulk * dVdsat_dVd; - - T9 = WVCoxRds * Abulk; - T1 = 2.0 / Lambda - 1.0 + T9; - dT1_dVg = -2.0 * tmp1 + WVCoxRds * (Abulk * tmp2 + dAbulk_dVg); - dT1_dVb = dAbulk_dVb * WVCoxRds + T9 * tmp3; - - Vasat = T0 / T1; - dVasat_dVg = (dT0_dVg - Vasat * dT1_dVg) / T1; - dVasat_dVb = (dT0_dVb - Vasat * dT1_dVb) / T1; - dVasat_dVd = dT0_dVd / T1; - - if (Vdseff > Vds) - Vdseff = Vds; - diffVds = Vds - Vdseff; - /* Added revision dependent code */ - if (model->BSIM3v32intVersion > BSIM3v32V323) { - here->BSIM3v32Vdseff = Vdseff; - } - -/* Calculate VACLM */ - if ((pParam->BSIM3v32pclm > 0.0) && (diffVds > 1.0e-10)) - { T0 = 1.0 / (pParam->BSIM3v32pclm * Abulk * pParam->BSIM3v32litl); - dT0_dVb = -T0 / Abulk * dAbulk_dVb; - dT0_dVg = -T0 / Abulk * dAbulk_dVg; - - T2 = Vgsteff / EsatL; - T1 = Leff * (Abulk + T2); - dT1_dVg = Leff * ((1.0 - T2 * dEsatL_dVg) / EsatL + dAbulk_dVg); - dT1_dVb = Leff * (dAbulk_dVb - T2 * dEsatL_dVb / EsatL); - dT1_dVd = -T2 * dEsatL_dVd / Esat; - - T9 = T0 * T1; - VACLM = T9 * diffVds; - dVACLM_dVg = T0 * dT1_dVg * diffVds - T9 * dVdseff_dVg - + T1 * diffVds * dT0_dVg; - dVACLM_dVb = (dT0_dVb * T1 + T0 * dT1_dVb) * diffVds - - T9 * dVdseff_dVb; - dVACLM_dVd = T0 * dT1_dVd * diffVds + T9 * (1.0 - dVdseff_dVd); - } - else - { VACLM = MAX_EXP; - dVACLM_dVd = dVACLM_dVg = dVACLM_dVb = 0.0; - } - -/* Calculate VADIBL */ - if (pParam->BSIM3v32thetaRout > 0.0) - { T8 = Abulk * Vdsat; - T0 = Vgst2Vtm * T8; - dT0_dVg = Vgst2Vtm * Abulk * dVdsat_dVg + T8 - + Vgst2Vtm * Vdsat * dAbulk_dVg; - dT0_dVb = Vgst2Vtm * (dAbulk_dVb * Vdsat + Abulk * dVdsat_dVb); - dT0_dVd = Vgst2Vtm * Abulk * dVdsat_dVd; - - T1 = Vgst2Vtm + T8; - dT1_dVg = 1.0 + Abulk * dVdsat_dVg + Vdsat * dAbulk_dVg; - dT1_dVb = Abulk * dVdsat_dVb + dAbulk_dVb * Vdsat; - dT1_dVd = Abulk * dVdsat_dVd; - - T9 = T1 * T1; - T2 = pParam->BSIM3v32thetaRout; - VADIBL = (Vgst2Vtm - T0 / T1) / T2; - dVADIBL_dVg = (1.0 - dT0_dVg / T1 + T0 * dT1_dVg / T9) / T2; - dVADIBL_dVb = (-dT0_dVb / T1 + T0 * dT1_dVb / T9) / T2; - dVADIBL_dVd = (-dT0_dVd / T1 + T0 * dT1_dVd / T9) / T2; - - T7 = pParam->BSIM3v32pdiblb * Vbseff; - if (T7 >= -0.9) - { T3 = 1.0 / (1.0 + T7); - VADIBL *= T3; - dVADIBL_dVg *= T3; - dVADIBL_dVb = (dVADIBL_dVb - VADIBL * pParam->BSIM3v32pdiblb) - * T3; - dVADIBL_dVd *= T3; - } - else -/* Added to avoid the discontinuity problem caused by pdiblcb */ - { T4 = 1.0 / (0.8 + T7); - T3 = (17.0 + 20.0 * T7) * T4; - dVADIBL_dVg *= T3; - dVADIBL_dVb = dVADIBL_dVb * T3 - - VADIBL * pParam->BSIM3v32pdiblb * T4 * T4; - dVADIBL_dVd *= T3; - VADIBL *= T3; - } - } - else - { VADIBL = MAX_EXP; - dVADIBL_dVd = dVADIBL_dVg = dVADIBL_dVb = 0.0; - } - -/* Calculate VA */ - - T8 = pParam->BSIM3v32pvag / EsatL; - T9 = T8 * Vgsteff; - if (T9 > -0.9) - { T0 = 1.0 + T9; - dT0_dVg = T8 * (1.0 - Vgsteff * dEsatL_dVg / EsatL); - dT0_dVb = -T9 * dEsatL_dVb / EsatL; - dT0_dVd = -T9 * dEsatL_dVd / EsatL; - } - else /* Added to avoid the discontinuity problems caused by pvag */ - { T1 = 1.0 / (17.0 + 20.0 * T9); - T0 = (0.8 + T9) * T1; - T1 *= T1; - dT0_dVg = T8 * (1.0 - Vgsteff * dEsatL_dVg / EsatL) * T1; - - T9 *= T1 / EsatL; - dT0_dVb = -T9 * dEsatL_dVb; - dT0_dVd = -T9 * dEsatL_dVd; - } - - tmp1 = VACLM * VACLM; - tmp2 = VADIBL * VADIBL; - tmp3 = VACLM + VADIBL; - - T1 = VACLM * VADIBL / tmp3; - tmp3 *= tmp3; - dT1_dVg = (tmp1 * dVADIBL_dVg + tmp2 * dVACLM_dVg) / tmp3; - dT1_dVd = (tmp1 * dVADIBL_dVd + tmp2 * dVACLM_dVd) / tmp3; - dT1_dVb = (tmp1 * dVADIBL_dVb + tmp2 * dVACLM_dVb) / tmp3; - - Va = Vasat + T0 * T1; - dVa_dVg = dVasat_dVg + T1 * dT0_dVg + T0 * dT1_dVg; - dVa_dVd = dVasat_dVd + T1 * dT0_dVd + T0 * dT1_dVd; - dVa_dVb = dVasat_dVb + T1 * dT0_dVb + T0 * dT1_dVb; - -/* Calculate VASCBE */ - if (pParam->BSIM3v32pscbe2 > 0.0) - { if (diffVds > pParam->BSIM3v32pscbe1 * pParam->BSIM3v32litl - / EXP_THRESHOLD) - { T0 = pParam->BSIM3v32pscbe1 * pParam->BSIM3v32litl / diffVds; - VASCBE = Leff * exp(T0) / pParam->BSIM3v32pscbe2; - T1 = T0 * VASCBE / diffVds; - dVASCBE_dVg = T1 * dVdseff_dVg; - dVASCBE_dVd = -T1 * (1.0 - dVdseff_dVd); - dVASCBE_dVb = T1 * dVdseff_dVb; - } - else - { VASCBE = MAX_EXP * Leff/pParam->BSIM3v32pscbe2; - dVASCBE_dVg = dVASCBE_dVd = dVASCBE_dVb = 0.0; - } - } - else - { VASCBE = MAX_EXP; - dVASCBE_dVg = dVASCBE_dVd = dVASCBE_dVb = 0.0; - } - -/* Calculate Ids */ - CoxWovL = model->BSIM3v32cox * Weff / Leff; - beta = ueff * CoxWovL; - dbeta_dVg = CoxWovL * dueff_dVg + beta * dWeff_dVg / Weff; - dbeta_dVd = CoxWovL * dueff_dVd; - dbeta_dVb = CoxWovL * dueff_dVb + beta * dWeff_dVb / Weff; - - T0 = 1.0 - 0.5 * Abulk * Vdseff / Vgst2Vtm; - dT0_dVg = -0.5 * (Abulk * dVdseff_dVg - - Abulk * Vdseff / Vgst2Vtm + Vdseff * dAbulk_dVg) / Vgst2Vtm; - dT0_dVd = -0.5 * Abulk * dVdseff_dVd / Vgst2Vtm; - dT0_dVb = -0.5 * (Abulk * dVdseff_dVb + dAbulk_dVb * Vdseff) - / Vgst2Vtm; - - fgche1 = Vgsteff * T0; - dfgche1_dVg = Vgsteff * dT0_dVg + T0; - dfgche1_dVd = Vgsteff * dT0_dVd; - dfgche1_dVb = Vgsteff * dT0_dVb; - - T9 = Vdseff / EsatL; - fgche2 = 1.0 + T9; - dfgche2_dVg = (dVdseff_dVg - T9 * dEsatL_dVg) / EsatL; - dfgche2_dVd = (dVdseff_dVd - T9 * dEsatL_dVd) / EsatL; - dfgche2_dVb = (dVdseff_dVb - T9 * dEsatL_dVb) / EsatL; - - gche = beta * fgche1 / fgche2; - dgche_dVg = (beta * dfgche1_dVg + fgche1 * dbeta_dVg - - gche * dfgche2_dVg) / fgche2; - dgche_dVd = (beta * dfgche1_dVd + fgche1 * dbeta_dVd - - gche * dfgche2_dVd) / fgche2; - dgche_dVb = (beta * dfgche1_dVb + fgche1 * dbeta_dVb - - gche * dfgche2_dVb) / fgche2; - - T0 = 1.0 + gche * Rds; - T9 = Vdseff / T0; - Idl = gche * T9; - - dIdl_dVg = (gche * dVdseff_dVg + T9 * dgche_dVg) / T0 - - Idl * gche / T0 * dRds_dVg ; - - dIdl_dVd = (gche * dVdseff_dVd + T9 * dgche_dVd) / T0; - dIdl_dVb = (gche * dVdseff_dVb + T9 * dgche_dVb - - Idl * dRds_dVb * gche) / T0; - - T9 = diffVds / Va; - T0 = 1.0 + T9; - Idsa = Idl * T0; - dIdsa_dVg = T0 * dIdl_dVg - Idl * (dVdseff_dVg + T9 * dVa_dVg) / Va; - dIdsa_dVd = T0 * dIdl_dVd + Idl * (1.0 - dVdseff_dVd - - T9 * dVa_dVd) / Va; - dIdsa_dVb = T0 * dIdl_dVb - Idl * (dVdseff_dVb + T9 * dVa_dVb) / Va; - - T9 = diffVds / VASCBE; - T0 = 1.0 + T9; - Ids = Idsa * T0; - - Gm = T0 * dIdsa_dVg - Idsa * (dVdseff_dVg + T9 * dVASCBE_dVg) / VASCBE; - Gds = T0 * dIdsa_dVd + Idsa * (1.0 - dVdseff_dVd - - T9 * dVASCBE_dVd) / VASCBE; - Gmb = T0 * dIdsa_dVb - Idsa * (dVdseff_dVb - + T9 * dVASCBE_dVb) / VASCBE; - - Gds += Gm * dVgsteff_dVd; - Gmb += Gm * dVgsteff_dVb; - Gm *= dVgsteff_dVg; - Gmb *= dVbseff_dVb; - - /* Substrate current begins */ - tmp = pParam->BSIM3v32alpha0 + pParam->BSIM3v32alpha1 * Leff; - if ((tmp <= 0.0) || (pParam->BSIM3v32beta0 <= 0.0)) - { Isub = Gbd = Gbb = Gbg = 0.0; - } - else - { T2 = tmp / Leff; - if (diffVds > pParam->BSIM3v32beta0 / EXP_THRESHOLD) - { T0 = -pParam->BSIM3v32beta0 / diffVds; - T1 = T2 * diffVds * exp(T0); - T3 = T1 / diffVds * (T0 - 1.0); - dT1_dVg = T3 * dVdseff_dVg; - dT1_dVd = T3 * (dVdseff_dVd - 1.0); - dT1_dVb = T3 * dVdseff_dVb; - } - else - { T3 = T2 * MIN_EXP; - T1 = T3 * diffVds; - dT1_dVg = -T3 * dVdseff_dVg; - dT1_dVd = T3 * (1.0 - dVdseff_dVd); - dT1_dVb = -T3 * dVdseff_dVb; - } - Isub = T1 * Idsa; - Gbg = T1 * dIdsa_dVg + Idsa * dT1_dVg; - Gbd = T1 * dIdsa_dVd + Idsa * dT1_dVd; - Gbb = T1 * dIdsa_dVb + Idsa * dT1_dVb; - - Gbd += Gbg * dVgsteff_dVd; - Gbb += Gbg * dVgsteff_dVb; - Gbg *= dVgsteff_dVg; - Gbb *= dVbseff_dVb; /* bug fixing */ - } - - cdrain = Ids; - here->BSIM3v32gds = Gds; - here->BSIM3v32gm = Gm; - here->BSIM3v32gmbs = Gmb; - - here->BSIM3v32gbbs = Gbb; - here->BSIM3v32gbgs = Gbg; - here->BSIM3v32gbds = Gbd; - - here->BSIM3v32csub = Isub; - - /* BSIM3v32 thermal noise Qinv calculated from all capMod - * 0, 1, 2 & 3 stored in here->BSIM3v32qinv 1/1998 */ - - if ((model->BSIM3v32xpart < 0) || (!ChargeComputationNeeded)) - { qgate = qdrn = qsrc = qbulk = 0.0; - here->BSIM3v32cggb = here->BSIM3v32cgsb = here->BSIM3v32cgdb = 0.0; - here->BSIM3v32cdgb = here->BSIM3v32cdsb = here->BSIM3v32cddb = 0.0; - here->BSIM3v32cbgb = here->BSIM3v32cbsb = here->BSIM3v32cbdb = 0.0; - here->BSIM3v32cqdb = here->BSIM3v32cqsb = here->BSIM3v32cqgb - = here->BSIM3v32cqbb = 0.0; - here->BSIM3v32gtau = 0.0; - goto finished; - } - else if (model->BSIM3v32capMod == 0) - { - if (Vbseff < 0.0) - { Vbseff = Vbs; - dVbseff_dVb = 1.0; - } - else - { Vbseff = pParam->BSIM3v32phi - Phis; - dVbseff_dVb = -dPhis_dVb; - } - - Vfb = pParam->BSIM3v32vfbcv; - Vth = Vfb + pParam->BSIM3v32phi + pParam->BSIM3v32k1ox * sqrtPhis; - Vgst = Vgs_eff - Vth; - dVth_dVb = pParam->BSIM3v32k1ox * dsqrtPhis_dVb; - dVgst_dVb = -dVth_dVb; - dVgst_dVg = dVgs_eff_dVg; - - CoxWL = model->BSIM3v32cox * pParam->BSIM3v32weffCV - * pParam->BSIM3v32leffCV; - Arg1 = Vgs_eff - Vbseff - Vfb; - - if (Arg1 <= 0.0) - { qgate = CoxWL * Arg1; - qbulk = -qgate; - qdrn = 0.0; - - here->BSIM3v32cggb = CoxWL * dVgs_eff_dVg; - here->BSIM3v32cgdb = 0.0; - here->BSIM3v32cgsb = CoxWL * (dVbseff_dVb - dVgs_eff_dVg); - - here->BSIM3v32cdgb = 0.0; - here->BSIM3v32cddb = 0.0; - here->BSIM3v32cdsb = 0.0; - - here->BSIM3v32cbgb = -CoxWL * dVgs_eff_dVg; - here->BSIM3v32cbdb = 0.0; - here->BSIM3v32cbsb = -here->BSIM3v32cgsb; - here->BSIM3v32qinv = 0.0; - } - else if (Vgst <= 0.0) - { T1 = 0.5 * pParam->BSIM3v32k1ox; - T2 = sqrt(T1 * T1 + Arg1); - qgate = CoxWL * pParam->BSIM3v32k1ox * (T2 - T1); - qbulk = -qgate; - qdrn = 0.0; - - T0 = CoxWL * T1 / T2; - here->BSIM3v32cggb = T0 * dVgs_eff_dVg; - here->BSIM3v32cgdb = 0.0; - here->BSIM3v32cgsb = T0 * (dVbseff_dVb - dVgs_eff_dVg); - - here->BSIM3v32cdgb = 0.0; - here->BSIM3v32cddb = 0.0; - here->BSIM3v32cdsb = 0.0; - - here->BSIM3v32cbgb = -here->BSIM3v32cggb; - here->BSIM3v32cbdb = 0.0; - here->BSIM3v32cbsb = -here->BSIM3v32cgsb; - here->BSIM3v32qinv = 0.0; - } - else - { One_Third_CoxWL = CoxWL / 3.0; - Two_Third_CoxWL = 2.0 * One_Third_CoxWL; - - AbulkCV = Abulk0 * pParam->BSIM3v32abulkCVfactor; - dAbulkCV_dVb = pParam->BSIM3v32abulkCVfactor * dAbulk0_dVb; - Vdsat = Vgst / AbulkCV; - dVdsat_dVg = dVgs_eff_dVg / AbulkCV; - dVdsat_dVb = - (Vdsat * dAbulkCV_dVb + dVth_dVb)/ AbulkCV; - - if (model->BSIM3v32xpart > 0.5) - { /* 0/100 Charge partition model */ - if (Vdsat <= Vds) - { /* saturation region */ - T1 = Vdsat / 3.0; - qgate = CoxWL * (Vgs_eff - Vfb - - pParam->BSIM3v32phi - T1); - T2 = -Two_Third_CoxWL * Vgst; - qbulk = -(qgate + T2); - qdrn = 0.0; - - here->BSIM3v32cggb = One_Third_CoxWL * (3.0 - - dVdsat_dVg) * dVgs_eff_dVg; - T2 = -One_Third_CoxWL * dVdsat_dVb; - here->BSIM3v32cgsb = -(here->BSIM3v32cggb + T2); - here->BSIM3v32cgdb = 0.0; - - here->BSIM3v32cdgb = 0.0; - here->BSIM3v32cddb = 0.0; - here->BSIM3v32cdsb = 0.0; - - here->BSIM3v32cbgb = -(here->BSIM3v32cggb - - Two_Third_CoxWL * dVgs_eff_dVg); - T3 = -(T2 + Two_Third_CoxWL * dVth_dVb); - here->BSIM3v32cbsb = -(here->BSIM3v32cbgb + T3); - here->BSIM3v32cbdb = 0.0; - here->BSIM3v32qinv = -(qgate + qbulk); - } - else - { /* linear region */ - Alphaz = Vgst / Vdsat; - T1 = 2.0 * Vdsat - Vds; - T2 = Vds / (3.0 * T1); - T3 = T2 * Vds; - T9 = 0.25 * CoxWL; - T4 = T9 * Alphaz; - T7 = 2.0 * Vds - T1 - 3.0 * T3; - T8 = T3 - T1 - 2.0 * Vds; - qgate = CoxWL * (Vgs_eff - Vfb - - pParam->BSIM3v32phi - 0.5 * (Vds - T3)); - T10 = T4 * T8; - qdrn = T4 * T7; - qbulk = -(qgate + qdrn + T10); - - T5 = T3 / T1; - here->BSIM3v32cggb = CoxWL * (1.0 - T5 * dVdsat_dVg) - * dVgs_eff_dVg; - T11 = -CoxWL * T5 * dVdsat_dVb; - here->BSIM3v32cgdb = CoxWL * (T2 - 0.5 + 0.5 * T5); - here->BSIM3v32cgsb = -(here->BSIM3v32cggb + T11 - + here->BSIM3v32cgdb); - T6 = 1.0 / Vdsat; - dAlphaz_dVg = T6 * (1.0 - Alphaz * dVdsat_dVg); - dAlphaz_dVb = -T6 * (dVth_dVb + Alphaz * dVdsat_dVb); - T7 = T9 * T7; - T8 = T9 * T8; - T9 = 2.0 * T4 * (1.0 - 3.0 * T5); - here->BSIM3v32cdgb = (T7 * dAlphaz_dVg - T9 - * dVdsat_dVg) * dVgs_eff_dVg; - T12 = T7 * dAlphaz_dVb - T9 * dVdsat_dVb; - here->BSIM3v32cddb = T4 * (3.0 - 6.0 * T2 - 3.0 * T5); - here->BSIM3v32cdsb = -(here->BSIM3v32cdgb + T12 - + here->BSIM3v32cddb); - - T9 = 2.0 * T4 * (1.0 + T5); - T10 = (T8 * dAlphaz_dVg - T9 * dVdsat_dVg) - * dVgs_eff_dVg; - T11 = T8 * dAlphaz_dVb - T9 * dVdsat_dVb; - T12 = T4 * (2.0 * T2 + T5 - 1.0); - T0 = -(T10 + T11 + T12); - - here->BSIM3v32cbgb = -(here->BSIM3v32cggb - + here->BSIM3v32cdgb + T10); - here->BSIM3v32cbdb = -(here->BSIM3v32cgdb - + here->BSIM3v32cddb + T12); - here->BSIM3v32cbsb = -(here->BSIM3v32cgsb - + here->BSIM3v32cdsb + T0); - here->BSIM3v32qinv = -(qgate + qbulk); - } - } - else if (model->BSIM3v32xpart < 0.5) - { /* 40/60 Charge partition model */ - if (Vds >= Vdsat) - { /* saturation region */ - T1 = Vdsat / 3.0; - qgate = CoxWL * (Vgs_eff - Vfb - - pParam->BSIM3v32phi - T1); - T2 = -Two_Third_CoxWL * Vgst; - qbulk = -(qgate + T2); - qdrn = 0.4 * T2; - - here->BSIM3v32cggb = One_Third_CoxWL * (3.0 - - dVdsat_dVg) * dVgs_eff_dVg; - T2 = -One_Third_CoxWL * dVdsat_dVb; - here->BSIM3v32cgsb = -(here->BSIM3v32cggb + T2); - here->BSIM3v32cgdb = 0.0; - - T3 = 0.4 * Two_Third_CoxWL; - here->BSIM3v32cdgb = -T3 * dVgs_eff_dVg; - here->BSIM3v32cddb = 0.0; - T4 = T3 * dVth_dVb; - here->BSIM3v32cdsb = -(T4 + here->BSIM3v32cdgb); - - here->BSIM3v32cbgb = -(here->BSIM3v32cggb - - Two_Third_CoxWL * dVgs_eff_dVg); - T3 = -(T2 + Two_Third_CoxWL * dVth_dVb); - here->BSIM3v32cbsb = -(here->BSIM3v32cbgb + T3); - here->BSIM3v32cbdb = 0.0; - here->BSIM3v32qinv = -(qgate + qbulk); - } - else - { /* linear region */ - Alphaz = Vgst / Vdsat; - T1 = 2.0 * Vdsat - Vds; - T2 = Vds / (3.0 * T1); - T3 = T2 * Vds; - T9 = 0.25 * CoxWL; - T4 = T9 * Alphaz; - qgate = CoxWL * (Vgs_eff - Vfb - pParam->BSIM3v32phi - - 0.5 * (Vds - T3)); - - T5 = T3 / T1; - here->BSIM3v32cggb = CoxWL * (1.0 - T5 * dVdsat_dVg) - * dVgs_eff_dVg; - tmp = -CoxWL * T5 * dVdsat_dVb; - here->BSIM3v32cgdb = CoxWL * (T2 - 0.5 + 0.5 * T5); - here->BSIM3v32cgsb = -(here->BSIM3v32cggb - + here->BSIM3v32cgdb + tmp); - - T6 = 1.0 / Vdsat; - dAlphaz_dVg = T6 * (1.0 - Alphaz * dVdsat_dVg); - dAlphaz_dVb = -T6 * (dVth_dVb + Alphaz * dVdsat_dVb); - - T6 = 8.0 * Vdsat * Vdsat - 6.0 * Vdsat * Vds - + 1.2 * Vds * Vds; - T8 = T2 / T1; - T7 = Vds - T1 - T8 * T6; - qdrn = T4 * T7; - T7 *= T9; - tmp = T8 / T1; - tmp1 = T4 * (2.0 - 4.0 * tmp * T6 - + T8 * (16.0 * Vdsat - 6.0 * Vds)); - - here->BSIM3v32cdgb = (T7 * dAlphaz_dVg - tmp1 - * dVdsat_dVg) * dVgs_eff_dVg; - T10 = T7 * dAlphaz_dVb - tmp1 * dVdsat_dVb; - here->BSIM3v32cddb = T4 * (2.0 - (1.0 / (3.0 * T1 - * T1) + 2.0 * tmp) * T6 + T8 - * (6.0 * Vdsat - 2.4 * Vds)); - here->BSIM3v32cdsb = -(here->BSIM3v32cdgb - + T10 + here->BSIM3v32cddb); - - T7 = 2.0 * (T1 + T3); - qbulk = -(qgate - T4 * T7); - T7 *= T9; - T0 = 4.0 * T4 * (1.0 - T5); - T12 = (-T7 * dAlphaz_dVg - here->BSIM3v32cdgb - - T0 * dVdsat_dVg) * dVgs_eff_dVg; - T11 = -T7 * dAlphaz_dVb - T10 - T0 * dVdsat_dVb; - T10 = -4.0 * T4 * (T2 - 0.5 + 0.5 * T5) - - here->BSIM3v32cddb; - tmp = -(T10 + T11 + T12); - - here->BSIM3v32cbgb = -(here->BSIM3v32cggb - + here->BSIM3v32cdgb + T12); - here->BSIM3v32cbdb = -(here->BSIM3v32cgdb - + here->BSIM3v32cddb + T10); /* bug fix */ - here->BSIM3v32cbsb = -(here->BSIM3v32cgsb - + here->BSIM3v32cdsb + tmp); - here->BSIM3v32qinv = -(qgate + qbulk); - } - } - else - { /* 50/50 partitioning */ - if (Vds >= Vdsat) - { /* saturation region */ - T1 = Vdsat / 3.0; - qgate = CoxWL * (Vgs_eff - Vfb - - pParam->BSIM3v32phi - T1); - T2 = -Two_Third_CoxWL * Vgst; - qbulk = -(qgate + T2); - qdrn = 0.5 * T2; - - here->BSIM3v32cggb = One_Third_CoxWL * (3.0 - - dVdsat_dVg) * dVgs_eff_dVg; - T2 = -One_Third_CoxWL * dVdsat_dVb; - here->BSIM3v32cgsb = -(here->BSIM3v32cggb + T2); - here->BSIM3v32cgdb = 0.0; - - here->BSIM3v32cdgb = -One_Third_CoxWL * dVgs_eff_dVg; - here->BSIM3v32cddb = 0.0; - T4 = One_Third_CoxWL * dVth_dVb; - here->BSIM3v32cdsb = -(T4 + here->BSIM3v32cdgb); - - here->BSIM3v32cbgb = -(here->BSIM3v32cggb - - Two_Third_CoxWL * dVgs_eff_dVg); - T3 = -(T2 + Two_Third_CoxWL * dVth_dVb); - here->BSIM3v32cbsb = -(here->BSIM3v32cbgb + T3); - here->BSIM3v32cbdb = 0.0; - here->BSIM3v32qinv = -(qgate + qbulk); - } - else - { /* linear region */ - Alphaz = Vgst / Vdsat; - T1 = 2.0 * Vdsat - Vds; - T2 = Vds / (3.0 * T1); - T3 = T2 * Vds; - T9 = 0.25 * CoxWL; - T4 = T9 * Alphaz; - qgate = CoxWL * (Vgs_eff - Vfb - pParam->BSIM3v32phi - - 0.5 * (Vds - T3)); - - T5 = T3 / T1; - here->BSIM3v32cggb = CoxWL * (1.0 - T5 * dVdsat_dVg) - * dVgs_eff_dVg; - tmp = -CoxWL * T5 * dVdsat_dVb; - here->BSIM3v32cgdb = CoxWL * (T2 - 0.5 + 0.5 * T5); - here->BSIM3v32cgsb = -(here->BSIM3v32cggb - + here->BSIM3v32cgdb + tmp); - - T6 = 1.0 / Vdsat; - dAlphaz_dVg = T6 * (1.0 - Alphaz * dVdsat_dVg); - dAlphaz_dVb = -T6 * (dVth_dVb + Alphaz * dVdsat_dVb); - - T7 = T1 + T3; - qdrn = -T4 * T7; - qbulk = - (qgate + qdrn + qdrn); - T7 *= T9; - T0 = T4 * (2.0 * T5 - 2.0); - - here->BSIM3v32cdgb = (T0 * dVdsat_dVg - T7 - * dAlphaz_dVg) * dVgs_eff_dVg; - T12 = T0 * dVdsat_dVb - T7 * dAlphaz_dVb; - here->BSIM3v32cddb = T4 * (1.0 - 2.0 * T2 - T5); - here->BSIM3v32cdsb = -(here->BSIM3v32cdgb + T12 - + here->BSIM3v32cddb); - - here->BSIM3v32cbgb = -(here->BSIM3v32cggb - + 2.0 * here->BSIM3v32cdgb); - here->BSIM3v32cbdb = -(here->BSIM3v32cgdb - + 2.0 * here->BSIM3v32cddb); - here->BSIM3v32cbsb = -(here->BSIM3v32cgsb - + 2.0 * here->BSIM3v32cdsb); - here->BSIM3v32qinv = -(qgate + qbulk); - } - } - } - } - else - { if (Vbseff < 0.0) - { VbseffCV = Vbseff; - dVbseffCV_dVb = 1.0; - } - else - { VbseffCV = pParam->BSIM3v32phi - Phis; - dVbseffCV_dVb = -dPhis_dVb; - } - - CoxWL = model->BSIM3v32cox * pParam->BSIM3v32weffCV - * pParam->BSIM3v32leffCV; - - /* Seperate VgsteffCV with noff and voffcv */ - noff = n * pParam->BSIM3v32noff; - dnoff_dVd = pParam->BSIM3v32noff * dn_dVd; - dnoff_dVb = pParam->BSIM3v32noff * dn_dVb; - T0 = Vtm * noff; - voffcv = pParam->BSIM3v32voffcv; - VgstNVt = (Vgst - voffcv) / T0; - - if (VgstNVt > EXP_THRESHOLD) - { Vgsteff = Vgst - voffcv; - dVgsteff_dVg = dVgs_eff_dVg; - dVgsteff_dVd = -dVth_dVd; - dVgsteff_dVb = -dVth_dVb; - } - else if (VgstNVt < -EXP_THRESHOLD) - { Vgsteff = T0 * log(1.0 + MIN_EXP); - dVgsteff_dVg = 0.0; - dVgsteff_dVd = Vgsteff / noff; - dVgsteff_dVb = dVgsteff_dVd * dnoff_dVb; - dVgsteff_dVd *= dnoff_dVd; - } - else - { ExpVgst = exp(VgstNVt); - Vgsteff = T0 * log(1.0 + ExpVgst); - dVgsteff_dVg = ExpVgst / (1.0 + ExpVgst); - dVgsteff_dVd = -dVgsteff_dVg * (dVth_dVd + (Vgst - voffcv) - / noff * dnoff_dVd) + Vgsteff / noff * dnoff_dVd; - dVgsteff_dVb = -dVgsteff_dVg * (dVth_dVb + (Vgst - voffcv) - / noff * dnoff_dVb) + Vgsteff / noff * dnoff_dVb; - dVgsteff_dVg *= dVgs_eff_dVg; - } /* End of VgsteffCV */ - - if (model->BSIM3v32capMod == 1) - { - /* Added revision dependent code */ - switch (model->BSIM3v32intVersion) { - case BSIM3v32V324: - case BSIM3v32V323: - case BSIM3v32V322: - Vfb = here->BSIM3v32vfbzb; - break; - case BSIM3v32V32: - Vfb = here->BSIM3v32vfbzb; - dVfb_dVb = dVfb_dVd = 0.0; - break; - default: - Vfb = Vth - pParam->BSIM3v32phi - pParam->BSIM3v32k1ox * sqrtPhis; - dVfb_dVb = dVth_dVb - pParam->BSIM3v32k1ox * dsqrtPhis_dVb; - dVfb_dVd = dVth_dVd; - } - - Arg1 = Vgs_eff - VbseffCV - Vfb - Vgsteff; - - if (Arg1 <= 0.0) - { qgate = CoxWL * Arg1; - Cgg = CoxWL * (dVgs_eff_dVg - dVgsteff_dVg); - /* Added revision dependent code */ - switch (model->BSIM3v32intVersion) { - case BSIM3v32V324: - case BSIM3v32V323: - case BSIM3v32V322: - Cgd = -CoxWL * dVgsteff_dVd; - Cgb = -CoxWL * (dVbseffCV_dVb + dVgsteff_dVb); - break; - case BSIM3v32V32: - default: - Cgd = -CoxWL * (dVfb_dVd + dVgsteff_dVd); - Cgb = -CoxWL * (dVfb_dVb + dVbseffCV_dVb + dVgsteff_dVb); - } - } - else - { T0 = 0.5 * pParam->BSIM3v32k1ox; - T1 = sqrt(T0 * T0 + Arg1); - T2 = CoxWL * T0 / T1; - - qgate = CoxWL * pParam->BSIM3v32k1ox * (T1 - T0); - - Cgg = T2 * (dVgs_eff_dVg - dVgsteff_dVg); - /* Added revision dependent code */ - switch (model->BSIM3v32intVersion) { - case BSIM3v32V324: - case BSIM3v32V323: - case BSIM3v32V322: - Cgd = -T2 * dVgsteff_dVd; - Cgb = -T2 * (dVbseffCV_dVb + dVgsteff_dVb); - break; - case BSIM3v32V32: - default: - Cgd = -T2 * (dVfb_dVd + dVgsteff_dVd); - Cgb = -T2 * (dVfb_dVb + dVbseffCV_dVb + dVgsteff_dVb); - } - } - qbulk = -qgate; - Cbg = -Cgg; - Cbd = -Cgd; - Cbb = -Cgb; - - One_Third_CoxWL = CoxWL / 3.0; - Two_Third_CoxWL = 2.0 * One_Third_CoxWL; - AbulkCV = Abulk0 * pParam->BSIM3v32abulkCVfactor; - dAbulkCV_dVb = pParam->BSIM3v32abulkCVfactor * dAbulk0_dVb; - VdsatCV = Vgsteff / AbulkCV; - if (VdsatCV < Vds) - { dVdsatCV_dVg = 1.0 / AbulkCV; - dVdsatCV_dVb = -VdsatCV * dAbulkCV_dVb / AbulkCV; - T0 = Vgsteff - VdsatCV / 3.0; - dT0_dVg = 1.0 - dVdsatCV_dVg / 3.0; - dT0_dVb = -dVdsatCV_dVb / 3.0; - qgate += CoxWL * T0; - Cgg1 = CoxWL * dT0_dVg; - Cgb1 = CoxWL * dT0_dVb + Cgg1 * dVgsteff_dVb; - Cgd1 = Cgg1 * dVgsteff_dVd; - Cgg1 *= dVgsteff_dVg; - Cgg += Cgg1; - Cgb += Cgb1; - Cgd += Cgd1; - - T0 = VdsatCV - Vgsteff; - dT0_dVg = dVdsatCV_dVg - 1.0; - dT0_dVb = dVdsatCV_dVb; - qbulk += One_Third_CoxWL * T0; - Cbg1 = One_Third_CoxWL * dT0_dVg; - Cbb1 = One_Third_CoxWL * dT0_dVb + Cbg1 * dVgsteff_dVb; - Cbd1 = Cbg1 * dVgsteff_dVd; - Cbg1 *= dVgsteff_dVg; - Cbg += Cbg1; - Cbb += Cbb1; - Cbd += Cbd1; - - if (model->BSIM3v32xpart > 0.5) - T0 = -Two_Third_CoxWL; - else if (model->BSIM3v32xpart < 0.5) - T0 = -0.4 * CoxWL; - else - T0 = -One_Third_CoxWL; - - qsrc = T0 * Vgsteff; - Csg = T0 * dVgsteff_dVg; - Csb = T0 * dVgsteff_dVb; - Csd = T0 * dVgsteff_dVd; - Cgb *= dVbseff_dVb; - Cbb *= dVbseff_dVb; - Csb *= dVbseff_dVb; - } - else - { T0 = AbulkCV * Vds; - T1 = 12.0 * (Vgsteff - 0.5 * T0 + 1.e-20); - T2 = Vds / T1; - T3 = T0 * T2; - dT3_dVg = -12.0 * T2 * T2 * AbulkCV; - dT3_dVd = 6.0 * T0 * (4.0 * Vgsteff - T0) / T1 / T1 - 0.5; - dT3_dVb = 12.0 * T2 * T2 * dAbulkCV_dVb * Vgsteff; - - qgate += CoxWL * (Vgsteff - 0.5 * Vds + T3); - Cgg1 = CoxWL * (1.0 + dT3_dVg); - Cgb1 = CoxWL * dT3_dVb + Cgg1 * dVgsteff_dVb; - Cgd1 = CoxWL * dT3_dVd + Cgg1 * dVgsteff_dVd; - Cgg1 *= dVgsteff_dVg; - Cgg += Cgg1; - Cgb += Cgb1; - Cgd += Cgd1; - - qbulk += CoxWL * (1.0 - AbulkCV) * (0.5 * Vds - T3); - Cbg1 = -CoxWL * ((1.0 - AbulkCV) * dT3_dVg); - Cbb1 = -CoxWL * ((1.0 - AbulkCV) * dT3_dVb - + (0.5 * Vds - T3) * dAbulkCV_dVb) - + Cbg1 * dVgsteff_dVb; - Cbd1 = -CoxWL * (1.0 - AbulkCV) * dT3_dVd - + Cbg1 * dVgsteff_dVd; - Cbg1 *= dVgsteff_dVg; - Cbg += Cbg1; - Cbb += Cbb1; - Cbd += Cbd1; - - if (model->BSIM3v32xpart > 0.5) - { /* 0/100 Charge petition model */ - T1 = T1 + T1; - qsrc = -CoxWL * (0.5 * Vgsteff + 0.25 * T0 - - T0 * T0 / T1); - Csg = -CoxWL * (0.5 + 24.0 * T0 * Vds / T1 / T1 - * AbulkCV); - Csb = -CoxWL * (0.25 * Vds * dAbulkCV_dVb - - 12.0 * T0 * Vds / T1 / T1 * (4.0 * Vgsteff - T0) - * dAbulkCV_dVb) + Csg * dVgsteff_dVb; - Csd = -CoxWL * (0.25 * AbulkCV - 12.0 * AbulkCV * T0 - / T1 / T1 * (4.0 * Vgsteff - T0)) - + Csg * dVgsteff_dVd; - Csg *= dVgsteff_dVg; - } - else if (model->BSIM3v32xpart < 0.5) - { /* 40/60 Charge petition model */ - T1 = T1 / 12.0; - T2 = 0.5 * CoxWL / (T1 * T1); - T3 = Vgsteff * (2.0 * T0 * T0 / 3.0 + Vgsteff - * (Vgsteff - 4.0 * T0 / 3.0)) - - 2.0 * T0 * T0 * T0 / 15.0; - qsrc = -T2 * T3; - T4 = 4.0 / 3.0 * Vgsteff * (Vgsteff - T0) - + 0.4 * T0 * T0; - Csg = -2.0 * qsrc / T1 - T2 * (Vgsteff * (3.0 - * Vgsteff - 8.0 * T0 / 3.0) - + 2.0 * T0 * T0 / 3.0); - Csb = (qsrc / T1 * Vds + T2 * T4 * Vds) * dAbulkCV_dVb - + Csg * dVgsteff_dVb; - Csd = (qsrc / T1 + T2 * T4) * AbulkCV - + Csg * dVgsteff_dVd; - Csg *= dVgsteff_dVg; - } - else - { /* 50/50 Charge petition model */ - qsrc = -0.5 * (qgate + qbulk); - Csg = -0.5 * (Cgg1 + Cbg1); - Csb = -0.5 * (Cgb1 + Cbb1); - Csd = -0.5 * (Cgd1 + Cbd1); - } - Cgb *= dVbseff_dVb; - Cbb *= dVbseff_dVb; - Csb *= dVbseff_dVb; - } - qdrn = -(qgate + qbulk + qsrc); - here->BSIM3v32cggb = Cgg; - here->BSIM3v32cgsb = -(Cgg + Cgd + Cgb); - here->BSIM3v32cgdb = Cgd; - here->BSIM3v32cdgb = -(Cgg + Cbg + Csg); - here->BSIM3v32cdsb = (Cgg + Cgd + Cgb + Cbg + Cbd + Cbb - + Csg + Csd + Csb); - here->BSIM3v32cddb = -(Cgd + Cbd + Csd); - here->BSIM3v32cbgb = Cbg; - here->BSIM3v32cbsb = -(Cbg + Cbd + Cbb); - here->BSIM3v32cbdb = Cbd; - here->BSIM3v32qinv = -(qgate + qbulk); - } - - else if (model->BSIM3v32capMod == 2) - { - /* Added revision dependent code */ - switch (model->BSIM3v32intVersion) { - case BSIM3v32V324: - case BSIM3v32V323: - case BSIM3v32V322: - Vfb = here->BSIM3v32vfbzb; - break; - case BSIM3v32V32: - Vfb = here->BSIM3v32vfbzb; - dVfb_dVb = dVfb_dVd = 0.0; - break; - default: /* old code prior to v3.2 */ - Vfb = Vth - pParam->BSIM3v32phi - pParam->BSIM3v32k1ox * sqrtPhis; - dVfb_dVb = dVth_dVb - pParam->BSIM3v32k1ox * dsqrtPhis_dVb; - dVfb_dVd = dVth_dVd; - } - - V3 = Vfb - Vgs_eff + VbseffCV - DELTA_3; - if (Vfb <= 0.0) - { T0 = sqrt(V3 * V3 - 4.0 * DELTA_3 * Vfb); - T2 = -DELTA_3 / T0; - } - else - { T0 = sqrt(V3 * V3 + 4.0 * DELTA_3 * Vfb); - T2 = DELTA_3 / T0; - } - - T1 = 0.5 * (1.0 + V3 / T0); - Vfbeff = Vfb - 0.5 * (V3 + T0); - /* Added revision dependent code */ - switch (model->BSIM3v32intVersion) { - case BSIM3v32V324: - case BSIM3v32V323: - case BSIM3v32V322: - /* Do nothing */ - break; - case BSIM3v32V32: - default: - dVfbeff_dVd = (1.0 - T1 - T2) * dVfb_dVd; - } - dVfbeff_dVg = T1 * dVgs_eff_dVg; - /* Added revision dependent code */ - switch (model->BSIM3v32intVersion) { - case BSIM3v32V324: - case BSIM3v32V323: - case BSIM3v32V322: - dVfbeff_dVb = -T1 * dVbseffCV_dVb; - break; - case BSIM3v32V32: - default: - dVfbeff_dVb = (1.0 - T1 - T2) * dVfb_dVb - T1 * dVbseffCV_dVb; - } - Qac0 = CoxWL * (Vfbeff - Vfb); - dQac0_dVg = CoxWL * dVfbeff_dVg; - /* Added revision dependent code */ - switch (model->BSIM3v32intVersion) { - case BSIM3v32V324: - case BSIM3v32V323: - case BSIM3v32V322: - /* Do nothing */ - break; - case BSIM3v32V32: - default: - dQac0_dVd = CoxWL * (dVfbeff_dVd - dVfb_dVd); - } - /* Added revision dependent code */ - switch (model->BSIM3v32intVersion) { - case BSIM3v32V324: - case BSIM3v32V323: - case BSIM3v32V322: - dQac0_dVb = CoxWL * dVfbeff_dVb; - break; - case BSIM3v32V32: - default: - dQac0_dVb = CoxWL * (dVfbeff_dVb - dVfb_dVb); - } - - T0 = 0.5 * pParam->BSIM3v32k1ox; - T3 = Vgs_eff - Vfbeff - VbseffCV - Vgsteff; - if (pParam->BSIM3v32k1ox == 0.0) - { T1 = 0.0; - T2 = 0.0; - } - else if (T3 < 0.0) - { T1 = T0 + T3 / pParam->BSIM3v32k1ox; - T2 = CoxWL; - } - else - { T1 = sqrt(T0 * T0 + T3); - T2 = CoxWL * T0 / T1; - } - - Qsub0 = CoxWL * pParam->BSIM3v32k1ox * (T1 - T0); - - dQsub0_dVg = T2 * (dVgs_eff_dVg - dVfbeff_dVg - dVgsteff_dVg); - /* Added revision dependent code */ - switch (model->BSIM3v32intVersion) { - case BSIM3v32V324: - case BSIM3v32V323: - case BSIM3v32V322: - dQsub0_dVd = -T2 * dVgsteff_dVd; - break; - case BSIM3v32V32: - default: - dQsub0_dVd = -T2 * (dVfbeff_dVd + dVgsteff_dVd); - } - dQsub0_dVb = -T2 * (dVfbeff_dVb + dVbseffCV_dVb - + dVgsteff_dVb); - - AbulkCV = Abulk0 * pParam->BSIM3v32abulkCVfactor; - dAbulkCV_dVb = pParam->BSIM3v32abulkCVfactor * dAbulk0_dVb; - VdsatCV = Vgsteff / AbulkCV; - - V4 = VdsatCV - Vds - DELTA_4; - T0 = sqrt(V4 * V4 + 4.0 * DELTA_4 * VdsatCV); - VdseffCV = VdsatCV - 0.5 * (V4 + T0); - T1 = 0.5 * (1.0 + V4 / T0); - T2 = DELTA_4 / T0; - T3 = (1.0 - T1 - T2) / AbulkCV; - dVdseffCV_dVg = T3; - dVdseffCV_dVd = T1; - dVdseffCV_dVb = -T3 * VdsatCV * dAbulkCV_dVb; - /* Added revision dependent code */ - switch (model->BSIM3v32intVersion) { - case BSIM3v32V324: - case BSIM3v32V323: - case BSIM3v32V322: - /* Added to eliminate non-zero VdseffCV at Vds=0.0 */ - if (Vds == 0.0) - { - VdseffCV = 0.0; - dVdseffCV_dVg = 0.0; - dVdseffCV_dVb = 0.0; - } - break; - case BSIM3v32V32: - default: - /* Do nothing */ - break; - } - - T0 = AbulkCV * VdseffCV; - T1 = 12.0 * (Vgsteff - 0.5 * T0 + 1e-20); - T2 = VdseffCV / T1; - T3 = T0 * T2; - - T4 = (1.0 - 12.0 * T2 * T2 * AbulkCV); - T5 = (6.0 * T0 * (4.0 * Vgsteff - T0) / (T1 * T1) - 0.5); - T6 = 12.0 * T2 * T2 * Vgsteff; - - qinoi = -CoxWL * (Vgsteff - 0.5 * T0 + AbulkCV * T3); - qgate = CoxWL * (Vgsteff - 0.5 * VdseffCV + T3); - Cgg1 = CoxWL * (T4 + T5 * dVdseffCV_dVg); - Cgd1 = CoxWL * T5 * dVdseffCV_dVd + Cgg1 * dVgsteff_dVd; - Cgb1 = CoxWL * (T5 * dVdseffCV_dVb + T6 * dAbulkCV_dVb) - + Cgg1 * dVgsteff_dVb; - Cgg1 *= dVgsteff_dVg; - - T7 = 1.0 - AbulkCV; - qbulk = CoxWL * T7 * (0.5 * VdseffCV - T3); - T4 = -T7 * (T4 - 1.0); - T5 = -T7 * T5; - T6 = -(T7 * T6 + (0.5 * VdseffCV - T3)); - Cbg1 = CoxWL * (T4 + T5 * dVdseffCV_dVg); - Cbd1 = CoxWL * T5 * dVdseffCV_dVd + Cbg1 * dVgsteff_dVd; - Cbb1 = CoxWL * (T5 * dVdseffCV_dVb + T6 * dAbulkCV_dVb) - + Cbg1 * dVgsteff_dVb; - Cbg1 *= dVgsteff_dVg; - - if (model->BSIM3v32xpart > 0.5) - { /* 0/100 Charge petition model */ - T1 = T1 + T1; - qsrc = -CoxWL * (0.5 * Vgsteff + 0.25 * T0 - - T0 * T0 / T1); - T7 = (4.0 * Vgsteff - T0) / (T1 * T1); - T4 = -(0.5 + 24.0 * T0 * T0 / (T1 * T1)); - T5 = -(0.25 * AbulkCV - 12.0 * AbulkCV * T0 * T7); - T6 = -(0.25 * VdseffCV - 12.0 * T0 * VdseffCV * T7); - Csg = CoxWL * (T4 + T5 * dVdseffCV_dVg); - Csd = CoxWL * T5 * dVdseffCV_dVd + Csg * dVgsteff_dVd; - Csb = CoxWL * (T5 * dVdseffCV_dVb + T6 * dAbulkCV_dVb) - + Csg * dVgsteff_dVb; - Csg *= dVgsteff_dVg; - } - else if (model->BSIM3v32xpart < 0.5) - { /* 40/60 Charge petition model */ - T1 = T1 / 12.0; - T2 = 0.5 * CoxWL / (T1 * T1); - T3 = Vgsteff * (2.0 * T0 * T0 / 3.0 + Vgsteff - * (Vgsteff - 4.0 * T0 / 3.0)) - - 2.0 * T0 * T0 * T0 / 15.0; - qsrc = -T2 * T3; - T7 = 4.0 / 3.0 * Vgsteff * (Vgsteff - T0) - + 0.4 * T0 * T0; - T4 = -2.0 * qsrc / T1 - T2 * (Vgsteff * (3.0 - * Vgsteff - 8.0 * T0 / 3.0) - + 2.0 * T0 * T0 / 3.0); - T5 = (qsrc / T1 + T2 * T7) * AbulkCV; - T6 = (qsrc / T1 * VdseffCV + T2 * T7 * VdseffCV); - Csg = (T4 + T5 * dVdseffCV_dVg); - Csd = T5 * dVdseffCV_dVd + Csg * dVgsteff_dVd; - Csb = (T5 * dVdseffCV_dVb + T6 * dAbulkCV_dVb) - + Csg * dVgsteff_dVb; - Csg *= dVgsteff_dVg; - } - else - { /* 50/50 Charge petition model */ - qsrc = -0.5 * (qgate + qbulk); - Csg = -0.5 * (Cgg1 + Cbg1); - Csb = -0.5 * (Cgb1 + Cbb1); - Csd = -0.5 * (Cgd1 + Cbd1); - } - - qgate += Qac0 + Qsub0; - qbulk -= (Qac0 + Qsub0); - qdrn = -(qgate + qbulk + qsrc); - - Cgg = dQac0_dVg + dQsub0_dVg + Cgg1; - /* Added revision dependent code */ - switch (model->BSIM3v32intVersion) { - case BSIM3v32V324: - case BSIM3v32V323: - case BSIM3v32V322: - Cgd = dQsub0_dVd + Cgd1; - break; - case BSIM3v32V32: - default: - Cgd = dQac0_dVd + dQsub0_dVd + Cgd1; - } - Cgb = dQac0_dVb + dQsub0_dVb + Cgb1; - - Cbg = Cbg1 - dQac0_dVg - dQsub0_dVg; - /* Added revision dependent code */ - switch (model->BSIM3v32intVersion) { - case BSIM3v32V324: - case BSIM3v32V323: - case BSIM3v32V322: - Cbd = Cbd1 - dQsub0_dVd; - break; - case BSIM3v32V32: - default: - Cbd = Cbd1 - dQac0_dVd - dQsub0_dVd; - } - Cbb = Cbb1 - dQac0_dVb - dQsub0_dVb; - - Cgb *= dVbseff_dVb; - Cbb *= dVbseff_dVb; - Csb *= dVbseff_dVb; - - here->BSIM3v32cggb = Cgg; - here->BSIM3v32cgsb = -(Cgg + Cgd + Cgb); - here->BSIM3v32cgdb = Cgd; - here->BSIM3v32cdgb = -(Cgg + Cbg + Csg); - here->BSIM3v32cdsb = (Cgg + Cgd + Cgb + Cbg + Cbd + Cbb - + Csg + Csd + Csb); - here->BSIM3v32cddb = -(Cgd + Cbd + Csd); - here->BSIM3v32cbgb = Cbg; - here->BSIM3v32cbsb = -(Cbg + Cbd + Cbb); - here->BSIM3v32cbdb = Cbd; - here->BSIM3v32qinv = qinoi; - } - - /* New Charge-Thickness capMod (CTM) begins */ - else if (model->BSIM3v32capMod == 3) - { V3 = here->BSIM3v32vfbzb - Vgs_eff + VbseffCV - DELTA_3; - if (here->BSIM3v32vfbzb <= 0.0) - { T0 = sqrt(V3 * V3 - 4.0 * DELTA_3 * here->BSIM3v32vfbzb); - T2 = -DELTA_3 / T0; - } - else - { T0 = sqrt(V3 * V3 + 4.0 * DELTA_3 * here->BSIM3v32vfbzb); - T2 = DELTA_3 / T0; - } - - T1 = 0.5 * (1.0 + V3 / T0); - Vfbeff = here->BSIM3v32vfbzb - 0.5 * (V3 + T0); - dVfbeff_dVg = T1 * dVgs_eff_dVg; - dVfbeff_dVb = -T1 * dVbseffCV_dVb; - - Cox = model->BSIM3v32cox; - Tox = 1.0e8 * model->BSIM3v32tox; - T0 = (Vgs_eff - VbseffCV - here->BSIM3v32vfbzb) / Tox; - dT0_dVg = dVgs_eff_dVg / Tox; - dT0_dVb = -dVbseffCV_dVb / Tox; - - tmp = T0 * pParam->BSIM3v32acde; - if ((-EXP_THRESHOLD < tmp) && (tmp < EXP_THRESHOLD)) - { Tcen = pParam->BSIM3v32ldeb * exp(tmp); - dTcen_dVg = pParam->BSIM3v32acde * Tcen; - dTcen_dVb = dTcen_dVg * dT0_dVb; - dTcen_dVg *= dT0_dVg; - } - else if (tmp <= -EXP_THRESHOLD) - { Tcen = pParam->BSIM3v32ldeb * MIN_EXP; - dTcen_dVg = dTcen_dVb = 0.0; - } - else - { Tcen = pParam->BSIM3v32ldeb * MAX_EXP; - dTcen_dVg = dTcen_dVb = 0.0; - } - - LINK = 1.0e-3 * model->BSIM3v32tox; - V3 = pParam->BSIM3v32ldeb - Tcen - LINK; - V4 = sqrt(V3 * V3 + 4.0 * LINK * pParam->BSIM3v32ldeb); - Tcen = pParam->BSIM3v32ldeb - 0.5 * (V3 + V4); - T1 = 0.5 * (1.0 + V3 / V4); - dTcen_dVg *= T1; - dTcen_dVb *= T1; - - Ccen = EPSSI / Tcen; - T2 = Cox / (Cox + Ccen); - Coxeff = T2 * Ccen; - T3 = -Ccen / Tcen; - dCoxeff_dVg = T2 * T2 * T3; - dCoxeff_dVb = dCoxeff_dVg * dTcen_dVb; - dCoxeff_dVg *= dTcen_dVg; - CoxWLcen = CoxWL * Coxeff / Cox; - - Qac0 = CoxWLcen * (Vfbeff - here->BSIM3v32vfbzb); - QovCox = Qac0 / Coxeff; - dQac0_dVg = CoxWLcen * dVfbeff_dVg - + QovCox * dCoxeff_dVg; - dQac0_dVb = CoxWLcen * dVfbeff_dVb - + QovCox * dCoxeff_dVb; - - T0 = 0.5 * pParam->BSIM3v32k1ox; - T3 = Vgs_eff - Vfbeff - VbseffCV - Vgsteff; - if (pParam->BSIM3v32k1ox == 0.0) - { T1 = 0.0; - T2 = 0.0; - } - else if (T3 < 0.0) - { T1 = T0 + T3 / pParam->BSIM3v32k1ox; - T2 = CoxWLcen; - } - else - { T1 = sqrt(T0 * T0 + T3); - T2 = CoxWLcen * T0 / T1; - } - - Qsub0 = CoxWLcen * pParam->BSIM3v32k1ox * (T1 - T0); - QovCox = Qsub0 / Coxeff; - dQsub0_dVg = T2 * (dVgs_eff_dVg - dVfbeff_dVg - dVgsteff_dVg) - + QovCox * dCoxeff_dVg; - dQsub0_dVd = -T2 * dVgsteff_dVd; - dQsub0_dVb = -T2 * (dVfbeff_dVb + dVbseffCV_dVb + dVgsteff_dVb) - + QovCox * dCoxeff_dVb; - - /* Gate-bias dependent delta Phis begins */ - if (pParam->BSIM3v32k1ox <= 0.0) - { Denomi = 0.25 * pParam->BSIM3v32moin * Vtm; - T0 = 0.5 * pParam->BSIM3v32sqrtPhi; - } - else - { Denomi = pParam->BSIM3v32moin * Vtm - * pParam->BSIM3v32k1ox * pParam->BSIM3v32k1ox; - T0 = pParam->BSIM3v32k1ox * pParam->BSIM3v32sqrtPhi; - } - T1 = 2.0 * T0 + Vgsteff; - - DeltaPhi = Vtm * log(1.0 + T1 * Vgsteff / Denomi); - dDeltaPhi_dVg = 2.0 * Vtm * (T1 -T0) / (Denomi + T1 * Vgsteff); - dDeltaPhi_dVd = dDeltaPhi_dVg * dVgsteff_dVd; - dDeltaPhi_dVb = dDeltaPhi_dVg * dVgsteff_dVb; - /* End of delta Phis */ - - T3 = 4.0 * (Vth - here->BSIM3v32vfbzb - pParam->BSIM3v32phi); - Tox += Tox; - if (T3 >= 0.0) - { - /* Added revision dependent code */ - switch (model->BSIM3v32intVersion) { - case BSIM3v32V324: - case BSIM3v32V323: - case BSIM3v32V322: - T0 = (Vgsteff + T3) / Tox; - dT0_dVd = (dVgsteff_dVd + 4.0 * dVth_dVd) / Tox; - dT0_dVb = (dVgsteff_dVb + 4.0 * dVth_dVb) / Tox; - break; - case BSIM3v32V32: - default: - T0 = (Vgsteff + T3) / Tox; - } - } - else - { - /* Added revision dependent code */ - switch (model->BSIM3v32intVersion) { - case BSIM3v32V324: - case BSIM3v32V323: - case BSIM3v32V322: - T0 = (Vgsteff + 1.0e-20) / Tox; - dT0_dVd = dVgsteff_dVd / Tox; - dT0_dVb = dVgsteff_dVb / Tox; - break; - case BSIM3v32V32: - default: - T0 = (Vgsteff + 1.0e-20) / Tox; - } - } - tmp = exp(0.7 * log(T0)); - T1 = 1.0 + tmp; - T2 = 0.7 * tmp / (T0 * Tox); - Tcen = 1.9e-9 / T1; - dTcen_dVg = -1.9e-9 * T2 / T1 /T1; - /* Added revision dependent code */ - switch (model->BSIM3v32intVersion) { - case BSIM3v32V324: - case BSIM3v32V323: - case BSIM3v32V322: - dTcen_dVd = Tox * dTcen_dVg; - dTcen_dVb = dTcen_dVd * dT0_dVb; - dTcen_dVd *= dT0_dVd; - break; - case BSIM3v32V32: - default: - dTcen_dVd = dTcen_dVg * (4.0 * dVth_dVd + dVgsteff_dVd); - dTcen_dVb = dTcen_dVg * (4.0 * dVth_dVb + dVgsteff_dVb); - } - dTcen_dVg *= dVgsteff_dVg; - - Ccen = EPSSI / Tcen; - T0 = Cox / (Cox + Ccen); - Coxeff = T0 * Ccen; - T1 = -Ccen / Tcen; - dCoxeff_dVg = T0 * T0 * T1; - dCoxeff_dVd = dCoxeff_dVg * dTcen_dVd; - dCoxeff_dVb = dCoxeff_dVg * dTcen_dVb; - dCoxeff_dVg *= dTcen_dVg; - CoxWLcen = CoxWL * Coxeff / Cox; - - AbulkCV = Abulk0 * pParam->BSIM3v32abulkCVfactor; - dAbulkCV_dVb = pParam->BSIM3v32abulkCVfactor * dAbulk0_dVb; - VdsatCV = (Vgsteff - DeltaPhi) / AbulkCV; - V4 = VdsatCV - Vds - DELTA_4; - T0 = sqrt(V4 * V4 + 4.0 * DELTA_4 * VdsatCV); - VdseffCV = VdsatCV - 0.5 * (V4 + T0); - T1 = 0.5 * (1.0 + V4 / T0); - T2 = DELTA_4 / T0; - T3 = (1.0 - T1 - T2) / AbulkCV; - T4 = T3 * ( 1.0 - dDeltaPhi_dVg); - dVdseffCV_dVg = T4; - dVdseffCV_dVd = T1; - dVdseffCV_dVb = -T3 * VdsatCV * dAbulkCV_dVb; - /* Added revision dependent code */ - switch (model->BSIM3v32intVersion) { - case BSIM3v32V324: - case BSIM3v32V323: - case BSIM3v32V322: - /* Added to eliminate non-zero VdseffCV at Vds=0.0 */ - if (Vds == 0.0) - { - VdseffCV = 0.0; - dVdseffCV_dVg = 0.0; - dVdseffCV_dVb = 0.0; - } - break; - case BSIM3v32V32: - default: - /* Do nothing */ - break; - } - - T0 = AbulkCV * VdseffCV; - T1 = Vgsteff - DeltaPhi; - T2 = 12.0 * (T1 - 0.5 * T0 + 1.0e-20); - T3 = T0 / T2; - T4 = 1.0 - 12.0 * T3 * T3; - T5 = AbulkCV * (6.0 * T0 * (4.0 * T1 - T0) / (T2 * T2) - 0.5); - T6 = T5 * VdseffCV / AbulkCV; - - qgate = qinoi = CoxWLcen * (T1 - T0 * (0.5 - T3)); - QovCox = qgate / Coxeff; - Cgg1 = CoxWLcen * (T4 * (1.0 - dDeltaPhi_dVg) - + T5 * dVdseffCV_dVg); - Cgd1 = CoxWLcen * T5 * dVdseffCV_dVd + Cgg1 - * dVgsteff_dVd + QovCox * dCoxeff_dVd; - Cgb1 = CoxWLcen * (T5 * dVdseffCV_dVb + T6 * dAbulkCV_dVb) - + Cgg1 * dVgsteff_dVb + QovCox * dCoxeff_dVb; - Cgg1 = Cgg1 * dVgsteff_dVg + QovCox * dCoxeff_dVg; - - - T7 = 1.0 - AbulkCV; - T8 = T2 * T2; - T9 = 12.0 * T7 * T0 * T0 / (T8 * AbulkCV); - T10 = T9 * (1.0 - dDeltaPhi_dVg); - T11 = -T7 * T5 / AbulkCV; - T12 = -(T9 * T1 / AbulkCV + VdseffCV * (0.5 - T0 / T2)); - - qbulk = CoxWLcen * T7 * (0.5 * VdseffCV - T0 * VdseffCV / T2); - QovCox = qbulk / Coxeff; - Cbg1 = CoxWLcen * (T10 + T11 * dVdseffCV_dVg); - Cbd1 = CoxWLcen * T11 * dVdseffCV_dVd + Cbg1 - * dVgsteff_dVd + QovCox * dCoxeff_dVd; - Cbb1 = CoxWLcen * (T11 * dVdseffCV_dVb + T12 * dAbulkCV_dVb) - + Cbg1 * dVgsteff_dVb + QovCox * dCoxeff_dVb; - Cbg1 = Cbg1 * dVgsteff_dVg + QovCox * dCoxeff_dVg; - - if (model->BSIM3v32xpart > 0.5) - { /* 0/100 partition */ - qsrc = -CoxWLcen * (T1 / 2.0 + T0 / 4.0 - - 0.5 * T0 * T0 / T2); - QovCox = qsrc / Coxeff; - T2 += T2; - T3 = T2 * T2; - T7 = -(0.25 - 12.0 * T0 * (4.0 * T1 - T0) / T3); - T4 = -(0.5 + 24.0 * T0 * T0 / T3) * (1.0 - dDeltaPhi_dVg); - T5 = T7 * AbulkCV; - T6 = T7 * VdseffCV; - - Csg = CoxWLcen * (T4 + T5 * dVdseffCV_dVg); - Csd = CoxWLcen * T5 * dVdseffCV_dVd + Csg * dVgsteff_dVd - + QovCox * dCoxeff_dVd; - Csb = CoxWLcen * (T5 * dVdseffCV_dVb + T6 * dAbulkCV_dVb) - + Csg * dVgsteff_dVb + QovCox * dCoxeff_dVb; - Csg = Csg * dVgsteff_dVg + QovCox * dCoxeff_dVg; - } - else if (model->BSIM3v32xpart < 0.5) - { /* 40/60 partition */ - T2 = T2 / 12.0; - T3 = 0.5 * CoxWLcen / (T2 * T2); - T4 = T1 * (2.0 * T0 * T0 / 3.0 + T1 * (T1 - 4.0 - * T0 / 3.0)) - 2.0 * T0 * T0 * T0 / 15.0; - qsrc = -T3 * T4; - QovCox = qsrc / Coxeff; - T8 = 4.0 / 3.0 * T1 * (T1 - T0) + 0.4 * T0 * T0; - T5 = -2.0 * qsrc / T2 - T3 * (T1 * (3.0 * T1 - 8.0 - * T0 / 3.0) + 2.0 * T0 * T0 / 3.0); - T6 = AbulkCV * (qsrc / T2 + T3 * T8); - T7 = T6 * VdseffCV / AbulkCV; - - Csg = T5 * (1.0 - dDeltaPhi_dVg) + T6 * dVdseffCV_dVg; - Csd = Csg * dVgsteff_dVd + T6 * dVdseffCV_dVd - + QovCox * dCoxeff_dVd; - Csb = Csg * dVgsteff_dVb + T6 * dVdseffCV_dVb - + T7 * dAbulkCV_dVb + QovCox * dCoxeff_dVb; - Csg = Csg * dVgsteff_dVg + QovCox * dCoxeff_dVg; - } - else - { /* 50/50 partition */ - qsrc = -0.5 * qgate; - Csg = -0.5 * Cgg1; - Csd = -0.5 * Cgd1; - Csb = -0.5 * Cgb1; - } - - qgate += Qac0 + Qsub0 - qbulk; - qbulk -= (Qac0 + Qsub0); - qdrn = -(qgate + qbulk + qsrc); - - Cbg = Cbg1 - dQac0_dVg - dQsub0_dVg; - Cbd = Cbd1 - dQsub0_dVd; - Cbb = Cbb1 - dQac0_dVb - dQsub0_dVb; - - Cgg = Cgg1 - Cbg; - Cgd = Cgd1 - Cbd; - Cgb = Cgb1 - Cbb; - - Cgb *= dVbseff_dVb; - Cbb *= dVbseff_dVb; - Csb *= dVbseff_dVb; - - here->BSIM3v32cggb = Cgg; - here->BSIM3v32cgsb = -(Cgg + Cgd + Cgb); - here->BSIM3v32cgdb = Cgd; - here->BSIM3v32cdgb = -(Cgg + Cbg + Csg); - here->BSIM3v32cdsb = (Cgg + Cgd + Cgb + Cbg + Cbd + Cbb - + Csg + Csd + Csb); - here->BSIM3v32cddb = -(Cgd + Cbd + Csd); - here->BSIM3v32cbgb = Cbg; - here->BSIM3v32cbsb = -(Cbg + Cbd + Cbb); - here->BSIM3v32cbdb = Cbd; - here->BSIM3v32qinv = -qinoi; - } /* End of CTM */ - } - -finished: - /* Returning Values to Calling Routine */ - /* - * COMPUTE EQUIVALENT DRAIN CURRENT SOURCE - */ - - here->BSIM3v32qgate = qgate; - here->BSIM3v32qbulk = qbulk; - here->BSIM3v32qdrn = qdrn; - here->BSIM3v32cd = cdrain; - - if (ChargeComputationNeeded) - { /* charge storage elements - * bulk-drain and bulk-source depletion capacitances - * czbd : zero bias drain junction capacitance - * czbs : zero bias source junction capacitance - * czbdsw: zero bias drain junction sidewall capacitance - along field oxide - * czbssw: zero bias source junction sidewall capacitance - along field oxide - * czbdswg: zero bias drain junction sidewall capacitance - along gate side - * czbsswg: zero bias source junction sidewall capacitance - along gate side - */ - - if (model->BSIM3v32acmMod == 0) - { - /* Added revision dependent code */ - switch (model->BSIM3v32intVersion) { - case BSIM3v32V324: - case BSIM3v32V323: - czbd = model->BSIM3v32unitAreaTempJctCap * here->BSIM3v32drainArea; /*bug fix */ - czbs = model->BSIM3v32unitAreaTempJctCap * here->BSIM3v32sourceArea; - break; - case BSIM3v32V322: - case BSIM3v32V32: - default: - czbd = model->BSIM3v32unitAreaJctCap * here->BSIM3v32drainArea; - czbs = model->BSIM3v32unitAreaJctCap * here->BSIM3v32sourceArea; - } - - if (here->BSIM3v32drainPerimeter < pParam->BSIM3v32weff) - { - czbdsw = 0.0; - /* Added revision dependent code */ - switch (model->BSIM3v32intVersion) { - case BSIM3v32V324: - case BSIM3v32V323: - czbdswg = model->BSIM3v32unitLengthGateSidewallTempJctCap - * here->BSIM3v32drainPerimeter; - break; - case BSIM3v32V322: - case BSIM3v32V32: - default: - czbdswg = model->BSIM3v32unitLengthGateSidewallJctCap - * here->BSIM3v32drainPerimeter; - } - } - else - { - /* Added revision dependent code */ - switch (model->BSIM3v32intVersion) { - case BSIM3v32V324: - case BSIM3v32V323: - czbdsw = model->BSIM3v32unitLengthSidewallTempJctCap - * (here->BSIM3v32drainPerimeter - pParam->BSIM3v32weff); - czbdswg = model->BSIM3v32unitLengthGateSidewallTempJctCap - * pParam->BSIM3v32weff; - break; - case BSIM3v32V322: - case BSIM3v32V32: - default: - czbdsw = model->BSIM3v32unitLengthSidewallJctCap - * (here->BSIM3v32drainPerimeter - pParam->BSIM3v32weff); - czbdswg = model->BSIM3v32unitLengthGateSidewallJctCap - * pParam->BSIM3v32weff; - } - } - if (here->BSIM3v32sourcePerimeter < pParam->BSIM3v32weff) - { - czbssw = 0.0; - /* Added revision dependent code */ - switch (model->BSIM3v32intVersion) { - case BSIM3v32V324: - case BSIM3v32V323: - czbsswg = model->BSIM3v32unitLengthGateSidewallTempJctCap - * here->BSIM3v32sourcePerimeter; - break; - case BSIM3v32V322: - case BSIM3v32V32: - default: - czbsswg = model->BSIM3v32unitLengthGateSidewallJctCap - * here->BSIM3v32sourcePerimeter; - } - } - else - { - /* Added revision dependent code */ - switch (model->BSIM3v32intVersion) { - case BSIM3v32V324: - case BSIM3v32V323: - czbssw = model->BSIM3v32unitLengthSidewallTempJctCap - * (here->BSIM3v32sourcePerimeter - pParam->BSIM3v32weff); - czbsswg = model->BSIM3v32unitLengthGateSidewallTempJctCap - * pParam->BSIM3v32weff; - break; - case BSIM3v32V322: - case BSIM3v32V32: - default: - czbssw = model->BSIM3v32unitLengthSidewallJctCap - * (here->BSIM3v32sourcePerimeter - pParam->BSIM3v32weff); - czbsswg = model->BSIM3v32unitLengthGateSidewallJctCap - * pParam->BSIM3v32weff; - } - } - - } else { - /* Added revision dependent code */ - switch (model->BSIM3v32intVersion) { - case BSIM3v32V324: - case BSIM3v32V323: - error = ACM_junctionCapacitances( - model->BSIM3v32acmMod, - model->BSIM3v32calcacm, - here->BSIM3v32geo, - model->BSIM3v32hdif, - model->BSIM3v32wmlt, - here->BSIM3v32w, - model->BSIM3v32xw, - here->BSIM3v32drainAreaGiven, - here->BSIM3v32drainArea, - here->BSIM3v32drainPerimeterGiven, - here->BSIM3v32drainPerimeter, - here->BSIM3v32sourceAreaGiven, - here->BSIM3v32sourceArea, - here->BSIM3v32sourcePerimeterGiven, - here->BSIM3v32sourcePerimeter, - model->BSIM3v32unitAreaTempJctCap, - model->BSIM3v32unitLengthSidewallTempJctCap, - model->BSIM3v32unitLengthGateSidewallTempJctCap, - &czbd, - &czbdsw, - &czbdswg, - &czbs, - &czbssw, - &czbsswg - ); - break; - case BSIM3v32V322: - case BSIM3v32V32: - default: - error = ACM_junctionCapacitances( - model->BSIM3v32acmMod, - model->BSIM3v32calcacm, - here->BSIM3v32geo, - model->BSIM3v32hdif, - model->BSIM3v32wmlt, - here->BSIM3v32w, - model->BSIM3v32xw, - here->BSIM3v32drainAreaGiven, - here->BSIM3v32drainArea, - here->BSIM3v32drainPerimeterGiven, - here->BSIM3v32drainPerimeter, - here->BSIM3v32sourceAreaGiven, - here->BSIM3v32sourceArea, - here->BSIM3v32sourcePerimeterGiven, - here->BSIM3v32sourcePerimeter, - model->BSIM3v32unitAreaJctCap, - model->BSIM3v32unitLengthSidewallJctCap, - model->BSIM3v32unitLengthGateSidewallJctCap, - &czbd, - &czbdsw, - &czbdswg, - &czbs, - &czbssw, - &czbsswg - ); - } - if (error) - return(error); - } - - MJ = model->BSIM3v32bulkJctBotGradingCoeff; - MJSW = model->BSIM3v32bulkJctSideGradingCoeff; - MJSWG = model->BSIM3v32bulkJctGateSideGradingCoeff; - - /* Source Bulk Junction */ - if (vbs == 0.0) - { *(ckt->CKTstate0 + here->BSIM3v32qbs) = 0.0; - here->BSIM3v32capbs = czbs + czbssw + czbsswg; - } - else if (vbs < 0.0) - { if (czbs > 0.0) - { arg = 1.0 - vbs / model->BSIM3v32PhiB; - if (MJ == 0.5) - sarg = 1.0 / sqrt(arg); - else - sarg = exp(-MJ * log(arg)); - *(ckt->CKTstate0 + here->BSIM3v32qbs) = model->BSIM3v32PhiB * czbs - * (1.0 - arg * sarg) / (1.0 - MJ); - here->BSIM3v32capbs = czbs * sarg; - } - else - { *(ckt->CKTstate0 + here->BSIM3v32qbs) = 0.0; - here->BSIM3v32capbs = 0.0; - } - if (czbssw > 0.0) - { arg = 1.0 - vbs / model->BSIM3v32PhiBSW; - if (MJSW == 0.5) - sarg = 1.0 / sqrt(arg); - else - sarg = exp(-MJSW * log(arg)); - *(ckt->CKTstate0 + here->BSIM3v32qbs) += model->BSIM3v32PhiBSW * czbssw - * (1.0 - arg * sarg) / (1.0 - MJSW); - here->BSIM3v32capbs += czbssw * sarg; - } - if (czbsswg > 0.0) - { arg = 1.0 - vbs / model->BSIM3v32PhiBSWG; - if (MJSWG == 0.5) - sarg = 1.0 / sqrt(arg); - else - sarg = exp(-MJSWG * log(arg)); - *(ckt->CKTstate0 + here->BSIM3v32qbs) += model->BSIM3v32PhiBSWG * czbsswg - * (1.0 - arg * sarg) / (1.0 - MJSWG); - here->BSIM3v32capbs += czbsswg * sarg; - } - - } - else - { T0 = czbs + czbssw + czbsswg; - T1 = vbs * (czbs * MJ / model->BSIM3v32PhiB + czbssw * MJSW - / model->BSIM3v32PhiBSW + czbsswg * MJSWG / model->BSIM3v32PhiBSWG); - *(ckt->CKTstate0 + here->BSIM3v32qbs) = vbs * (T0 + 0.5 * T1); - here->BSIM3v32capbs = T0 + T1; - } - - /* Drain Bulk Junction */ - if (vbd == 0.0) - { *(ckt->CKTstate0 + here->BSIM3v32qbd) = 0.0; - here->BSIM3v32capbd = czbd + czbdsw + czbdswg; - } - else if (vbd < 0.0) - { if (czbd > 0.0) - { arg = 1.0 - vbd / model->BSIM3v32PhiB; - if (MJ == 0.5) - sarg = 1.0 / sqrt(arg); - else - sarg = exp(-MJ * log(arg)); - *(ckt->CKTstate0 + here->BSIM3v32qbd) = model->BSIM3v32PhiB * czbd - * (1.0 - arg * sarg) / (1.0 - MJ); - here->BSIM3v32capbd = czbd * sarg; - } - else - { *(ckt->CKTstate0 + here->BSIM3v32qbd) = 0.0; - here->BSIM3v32capbd = 0.0; - } - if (czbdsw > 0.0) - { arg = 1.0 - vbd / model->BSIM3v32PhiBSW; - if (MJSW == 0.5) - sarg = 1.0 / sqrt(arg); - else - sarg = exp(-MJSW * log(arg)); - *(ckt->CKTstate0 + here->BSIM3v32qbd) += model->BSIM3v32PhiBSW * czbdsw - * (1.0 - arg * sarg) / (1.0 - MJSW); - here->BSIM3v32capbd += czbdsw * sarg; - } - if (czbdswg > 0.0) - { arg = 1.0 - vbd / model->BSIM3v32PhiBSWG; - if (MJSWG == 0.5) - sarg = 1.0 / sqrt(arg); - else - sarg = exp(-MJSWG * log(arg)); - *(ckt->CKTstate0 + here->BSIM3v32qbd) += model->BSIM3v32PhiBSWG * czbdswg - * (1.0 - arg * sarg) / (1.0 - MJSWG); - here->BSIM3v32capbd += czbdswg * sarg; - } - } - else - { T0 = czbd + czbdsw + czbdswg; - T1 = vbd * (czbd * MJ / model->BSIM3v32PhiB + czbdsw * MJSW - / model->BSIM3v32PhiBSW + czbdswg * MJSWG / model->BSIM3v32PhiBSWG); - *(ckt->CKTstate0 + here->BSIM3v32qbd) = vbd * (T0 + 0.5 * T1); - here->BSIM3v32capbd = T0 + T1; - } - } - - /* - * check convergence - */ - if ((here->BSIM3v32off == 0) || (!(ckt->CKTmode & MODEINITFIX))) - { if (Check == 1) - { ckt->CKTnoncon++; -#ifndef NEWCONV - } - else - { if (here->BSIM3v32mode >= 0) - { Idtot = here->BSIM3v32cd + here->BSIM3v32csub - here->BSIM3v32cbd; - } - else - { Idtot = here->BSIM3v32cd - here->BSIM3v32cbd; - } - tol = ckt->CKTreltol * MAX(fabs(cdhat), fabs(Idtot)) - + ckt->CKTabstol; - if (fabs(cdhat - Idtot) >= tol) - { ckt->CKTnoncon++; - } - else - { Ibtot = here->BSIM3v32cbs + here->BSIM3v32cbd - here->BSIM3v32csub; - tol = ckt->CKTreltol * MAX(fabs(cbhat), fabs(Ibtot)) - + ckt->CKTabstol; - if (fabs(cbhat - Ibtot) > tol) - { ckt->CKTnoncon++; - } - } -#endif /* NEWCONV */ - } - } - *(ckt->CKTstate0 + here->BSIM3v32vbs) = vbs; - *(ckt->CKTstate0 + here->BSIM3v32vbd) = vbd; - *(ckt->CKTstate0 + here->BSIM3v32vgs) = vgs; - *(ckt->CKTstate0 + here->BSIM3v32vds) = vds; - *(ckt->CKTstate0 + here->BSIM3v32qdef) = qdef; - - /* bulk and channel charge plus overlaps */ - - if (!ChargeComputationNeeded) - goto line850; - -#ifndef NOBYPASS -line755: -#endif - /* NQS begins */ - if (here->BSIM3v32nqsMod) - { qcheq = -(qbulk + qgate); - - here->BSIM3v32cqgb = -(here->BSIM3v32cggb + here->BSIM3v32cbgb); - here->BSIM3v32cqdb = -(here->BSIM3v32cgdb + here->BSIM3v32cbdb); - here->BSIM3v32cqsb = -(here->BSIM3v32cgsb + here->BSIM3v32cbsb); - here->BSIM3v32cqbb = -(here->BSIM3v32cqgb + here->BSIM3v32cqdb - + here->BSIM3v32cqsb); - - gtau_drift = fabs(here->BSIM3v32tconst * qcheq) * ScalingFactor; - T0 = pParam->BSIM3v32leffCV * pParam->BSIM3v32leffCV; - gtau_diff = 16.0 * here->BSIM3v32u0temp * model->BSIM3v32vtm / T0 - * ScalingFactor; - here->BSIM3v32gtau = gtau_drift + gtau_diff; - } - - if (model->BSIM3v32capMod == 0) - { - /* code merge -JX */ - cgdo = pParam->BSIM3v32cgdo; - qgdo = pParam->BSIM3v32cgdo * vgd; - cgso = pParam->BSIM3v32cgso; - qgso = pParam->BSIM3v32cgso * vgs; - } - else if (model->BSIM3v32capMod == 1) - { if (vgd < 0.0) - { T1 = sqrt(1.0 - 4.0 * vgd / pParam->BSIM3v32ckappa); - cgdo = pParam->BSIM3v32cgdo + pParam->BSIM3v32weffCV - * pParam->BSIM3v32cgdl / T1; - qgdo = pParam->BSIM3v32cgdo * vgd - pParam->BSIM3v32weffCV * 0.5 - * pParam->BSIM3v32cgdl * pParam->BSIM3v32ckappa * (T1 - 1.0); - } - else - { cgdo = pParam->BSIM3v32cgdo + pParam->BSIM3v32weffCV - * pParam->BSIM3v32cgdl; - qgdo = (pParam->BSIM3v32weffCV * pParam->BSIM3v32cgdl - + pParam->BSIM3v32cgdo) * vgd; - } - - if (vgs < 0.0) - { T1 = sqrt(1.0 - 4.0 * vgs / pParam->BSIM3v32ckappa); - cgso = pParam->BSIM3v32cgso + pParam->BSIM3v32weffCV - * pParam->BSIM3v32cgsl / T1; - qgso = pParam->BSIM3v32cgso * vgs - pParam->BSIM3v32weffCV * 0.5 - * pParam->BSIM3v32cgsl * pParam->BSIM3v32ckappa * (T1 - 1.0); - } - else - { cgso = pParam->BSIM3v32cgso + pParam->BSIM3v32weffCV - * pParam->BSIM3v32cgsl; - qgso = (pParam->BSIM3v32weffCV * pParam->BSIM3v32cgsl - + pParam->BSIM3v32cgso) * vgs; - } - } - else - { T0 = vgd + DELTA_1; - T1 = sqrt(T0 * T0 + 4.0 * DELTA_1); - T2 = 0.5 * (T0 - T1); - - T3 = pParam->BSIM3v32weffCV * pParam->BSIM3v32cgdl; - T4 = sqrt(1.0 - 4.0 * T2 / pParam->BSIM3v32ckappa); - cgdo = pParam->BSIM3v32cgdo + T3 - T3 * (1.0 - 1.0 / T4) - * (0.5 - 0.5 * T0 / T1); - qgdo = (pParam->BSIM3v32cgdo + T3) * vgd - T3 * (T2 - + 0.5 * pParam->BSIM3v32ckappa * (T4 - 1.0)); - - T0 = vgs + DELTA_1; - T1 = sqrt(T0 * T0 + 4.0 * DELTA_1); - T2 = 0.5 * (T0 - T1); - T3 = pParam->BSIM3v32weffCV * pParam->BSIM3v32cgsl; - T4 = sqrt(1.0 - 4.0 * T2 / pParam->BSIM3v32ckappa); - cgso = pParam->BSIM3v32cgso + T3 - T3 * (1.0 - 1.0 / T4) - * (0.5 - 0.5 * T0 / T1); - qgso = (pParam->BSIM3v32cgso + T3) * vgs - T3 * (T2 - + 0.5 * pParam->BSIM3v32ckappa * (T4 - 1.0)); - } - - here->BSIM3v32cgdo = cgdo; - here->BSIM3v32cgso = cgso; - - ag0 = ckt->CKTag[0]; - if (here->BSIM3v32mode > 0) - { if (here->BSIM3v32nqsMod == 0) - { gcggb = (here->BSIM3v32cggb + cgdo + cgso - + pParam->BSIM3v32cgbo ) * ag0; - gcgdb = (here->BSIM3v32cgdb - cgdo) * ag0; - gcgsb = (here->BSIM3v32cgsb - cgso) * ag0; - - gcdgb = (here->BSIM3v32cdgb - cgdo) * ag0; - gcddb = (here->BSIM3v32cddb + here->BSIM3v32capbd + cgdo) * ag0; - gcdsb = here->BSIM3v32cdsb * ag0; - - gcsgb = -(here->BSIM3v32cggb + here->BSIM3v32cbgb - + here->BSIM3v32cdgb + cgso) * ag0; - gcsdb = -(here->BSIM3v32cgdb + here->BSIM3v32cbdb - + here->BSIM3v32cddb) * ag0; - gcssb = (here->BSIM3v32capbs + cgso - (here->BSIM3v32cgsb - + here->BSIM3v32cbsb + here->BSIM3v32cdsb)) * ag0; - - gcbgb = (here->BSIM3v32cbgb - pParam->BSIM3v32cgbo) * ag0; - gcbdb = (here->BSIM3v32cbdb - here->BSIM3v32capbd) * ag0; - gcbsb = (here->BSIM3v32cbsb - here->BSIM3v32capbs) * ag0; - - qgd = qgdo; - qgs = qgso; - qgb = pParam->BSIM3v32cgbo * vgb; - qgate += qgd + qgs + qgb; - qbulk -= qgb; - qdrn -= qgd; - qsrc = -(qgate + qbulk + qdrn); - - ggtg = ggtd = ggtb = ggts = 0.0; - sxpart = 0.6; - dxpart = 0.4; - ddxpart_dVd = ddxpart_dVg = ddxpart_dVb = ddxpart_dVs = 0.0; - dsxpart_dVd = dsxpart_dVg = dsxpart_dVb = dsxpart_dVs = 0.0; - } - else - { if (qcheq > 0.0) - T0 = here->BSIM3v32tconst * qdef * ScalingFactor; - else - T0 = -here->BSIM3v32tconst * qdef * ScalingFactor; - ggtg = here->BSIM3v32gtg = T0 * here->BSIM3v32cqgb; - ggtd = here->BSIM3v32gtd = T0 * here->BSIM3v32cqdb; - ggts = here->BSIM3v32gts = T0 * here->BSIM3v32cqsb; - ggtb = here->BSIM3v32gtb = T0 * here->BSIM3v32cqbb; - gqdef = ScalingFactor * ag0; - - gcqgb = here->BSIM3v32cqgb * ag0; - gcqdb = here->BSIM3v32cqdb * ag0; - gcqsb = here->BSIM3v32cqsb * ag0; - gcqbb = here->BSIM3v32cqbb * ag0; - - gcggb = (cgdo + cgso + pParam->BSIM3v32cgbo ) * ag0; - gcgdb = -cgdo * ag0; - gcgsb = -cgso * ag0; - - gcdgb = -cgdo * ag0; - gcddb = (here->BSIM3v32capbd + cgdo) * ag0; - gcdsb = 0.0; - - gcsgb = -cgso * ag0; - gcsdb = 0.0; - gcssb = (here->BSIM3v32capbs + cgso) * ag0; - - gcbgb = -pParam->BSIM3v32cgbo * ag0; - gcbdb = -here->BSIM3v32capbd * ag0; - gcbsb = -here->BSIM3v32capbs * ag0; - - CoxWL = model->BSIM3v32cox * pParam->BSIM3v32weffCV - * pParam->BSIM3v32leffCV; - if (fabs(qcheq) <= 1.0e-5 * CoxWL) - { if (model->BSIM3v32xpart < 0.5) - { dxpart = 0.4; - } - else if (model->BSIM3v32xpart > 0.5) - { dxpart = 0.0; - } - else - { dxpart = 0.5; - } - ddxpart_dVd = ddxpart_dVg = ddxpart_dVb - = ddxpart_dVs = 0.0; - } - else - { dxpart = qdrn / qcheq; - Cdd = here->BSIM3v32cddb; - Csd = -(here->BSIM3v32cgdb + here->BSIM3v32cddb - + here->BSIM3v32cbdb); - ddxpart_dVd = (Cdd - dxpart * (Cdd + Csd)) / qcheq; - Cdg = here->BSIM3v32cdgb; - Csg = -(here->BSIM3v32cggb + here->BSIM3v32cdgb - + here->BSIM3v32cbgb); - ddxpart_dVg = (Cdg - dxpart * (Cdg + Csg)) / qcheq; - - Cds = here->BSIM3v32cdsb; - Css = -(here->BSIM3v32cgsb + here->BSIM3v32cdsb - + here->BSIM3v32cbsb); - ddxpart_dVs = (Cds - dxpart * (Cds + Css)) / qcheq; - - ddxpart_dVb = -(ddxpart_dVd + ddxpart_dVg + ddxpart_dVs); - } - sxpart = 1.0 - dxpart; - dsxpart_dVd = -ddxpart_dVd; - dsxpart_dVg = -ddxpart_dVg; - dsxpart_dVs = -ddxpart_dVs; - dsxpart_dVb = -(dsxpart_dVd + dsxpart_dVg + dsxpart_dVs); - - qgd = qgdo; - qgs = qgso; - qgb = pParam->BSIM3v32cgbo * vgb; - qgate = qgd + qgs + qgb; - qbulk = -qgb; - qdrn = -qgd; - qsrc = -(qgate + qbulk + qdrn); - } - } - else - { if (here->BSIM3v32nqsMod == 0) - { gcggb = (here->BSIM3v32cggb + cgdo + cgso - + pParam->BSIM3v32cgbo ) * ag0; - gcgdb = (here->BSIM3v32cgsb - cgdo) * ag0; - gcgsb = (here->BSIM3v32cgdb - cgso) * ag0; - - gcdgb = -(here->BSIM3v32cggb + here->BSIM3v32cbgb - + here->BSIM3v32cdgb + cgdo) * ag0; - gcddb = (here->BSIM3v32capbd + cgdo - (here->BSIM3v32cgsb - + here->BSIM3v32cbsb + here->BSIM3v32cdsb)) * ag0; - gcdsb = -(here->BSIM3v32cgdb + here->BSIM3v32cbdb - + here->BSIM3v32cddb) * ag0; - - gcsgb = (here->BSIM3v32cdgb - cgso) * ag0; - gcsdb = here->BSIM3v32cdsb * ag0; - gcssb = (here->BSIM3v32cddb + here->BSIM3v32capbs + cgso) * ag0; - - gcbgb = (here->BSIM3v32cbgb - pParam->BSIM3v32cgbo) * ag0; - gcbdb = (here->BSIM3v32cbsb - here->BSIM3v32capbd) * ag0; - gcbsb = (here->BSIM3v32cbdb - here->BSIM3v32capbs) * ag0; - - qgd = qgdo; - qgs = qgso; - qgb = pParam->BSIM3v32cgbo * vgb; - qgate += qgd + qgs + qgb; - qbulk -= qgb; - qsrc = qdrn - qgs; - qdrn = -(qgate + qbulk + qsrc); - - ggtg = ggtd = ggtb = ggts = 0.0; - sxpart = 0.4; - dxpart = 0.6; - ddxpart_dVd = ddxpart_dVg = ddxpart_dVb = ddxpart_dVs = 0.0; - dsxpart_dVd = dsxpart_dVg = dsxpart_dVb = dsxpart_dVs = 0.0; - } - else - { if (qcheq > 0.0) - T0 = here->BSIM3v32tconst * qdef * ScalingFactor; - else - T0 = -here->BSIM3v32tconst * qdef * ScalingFactor; - ggtg = here->BSIM3v32gtg = T0 * here->BSIM3v32cqgb; - ggts = here->BSIM3v32gtd = T0 * here->BSIM3v32cqdb; - ggtd = here->BSIM3v32gts = T0 * here->BSIM3v32cqsb; - ggtb = here->BSIM3v32gtb = T0 * here->BSIM3v32cqbb; - gqdef = ScalingFactor * ag0; - - gcqgb = here->BSIM3v32cqgb * ag0; - gcqdb = here->BSIM3v32cqsb * ag0; - gcqsb = here->BSIM3v32cqdb * ag0; - gcqbb = here->BSIM3v32cqbb * ag0; - - gcggb = (cgdo + cgso + pParam->BSIM3v32cgbo) * ag0; - gcgdb = -cgdo * ag0; - gcgsb = -cgso * ag0; - - gcdgb = -cgdo * ag0; - gcddb = (here->BSIM3v32capbd + cgdo) * ag0; - gcdsb = 0.0; - - gcsgb = -cgso * ag0; - gcsdb = 0.0; - gcssb = (here->BSIM3v32capbs + cgso) * ag0; - - gcbgb = -pParam->BSIM3v32cgbo * ag0; - gcbdb = -here->BSIM3v32capbd * ag0; - gcbsb = -here->BSIM3v32capbs * ag0; - - CoxWL = model->BSIM3v32cox * pParam->BSIM3v32weffCV - * pParam->BSIM3v32leffCV; - if (fabs(qcheq) <= 1.0e-5 * CoxWL) - { if (model->BSIM3v32xpart < 0.5) - { sxpart = 0.4; - } - else if (model->BSIM3v32xpart > 0.5) - { sxpart = 0.0; - } - else - { sxpart = 0.5; - } - dsxpart_dVd = dsxpart_dVg = dsxpart_dVb - = dsxpart_dVs = 0.0; - } - else - { sxpart = qdrn / qcheq; - Css = here->BSIM3v32cddb; - Cds = -(here->BSIM3v32cgdb + here->BSIM3v32cddb - + here->BSIM3v32cbdb); - dsxpart_dVs = (Css - sxpart * (Css + Cds)) / qcheq; - Csg = here->BSIM3v32cdgb; - Cdg = -(here->BSIM3v32cggb + here->BSIM3v32cdgb - + here->BSIM3v32cbgb); - dsxpart_dVg = (Csg - sxpart * (Csg + Cdg)) / qcheq; - - Csd = here->BSIM3v32cdsb; - Cdd = -(here->BSIM3v32cgsb + here->BSIM3v32cdsb - + here->BSIM3v32cbsb); - dsxpart_dVd = (Csd - sxpart * (Csd + Cdd)) / qcheq; - - dsxpart_dVb = -(dsxpart_dVd + dsxpart_dVg + dsxpart_dVs); - } - dxpart = 1.0 - sxpart; - ddxpart_dVd = -dsxpart_dVd; - ddxpart_dVg = -dsxpart_dVg; - ddxpart_dVs = -dsxpart_dVs; - ddxpart_dVb = -(ddxpart_dVd + ddxpart_dVg + ddxpart_dVs); - - qgd = qgdo; - qgs = qgso; - qgb = pParam->BSIM3v32cgbo * vgb; - qgate = qgd + qgs + qgb; - qbulk = -qgb; - qsrc = -qgs; - qdrn = -(qgate + qbulk + qsrc); - } - } - - cqdef = cqcheq = 0.0; - if (ByPass) goto line860; - - *(ckt->CKTstate0 + here->BSIM3v32qg) = qgate; - *(ckt->CKTstate0 + here->BSIM3v32qd) = qdrn - - *(ckt->CKTstate0 + here->BSIM3v32qbd); - *(ckt->CKTstate0 + here->BSIM3v32qb) = qbulk - + *(ckt->CKTstate0 + here->BSIM3v32qbd) - + *(ckt->CKTstate0 + here->BSIM3v32qbs); - - if (here->BSIM3v32nqsMod) - { *(ckt->CKTstate0 + here->BSIM3v32qcdump) = qdef * ScalingFactor; - *(ckt->CKTstate0 + here->BSIM3v32qcheq) = qcheq; - } - - /* store small signal parameters */ - if (ckt->CKTmode & MODEINITSMSIG) - { goto line1000; - } - if (!ChargeComputationNeeded) - goto line850; - - /* no integration, if dc sweep, but keep evaluating capacitances */ - if (ckt->CKTmode & MODEDCTRANCURVE) - goto line850; - - if (ckt->CKTmode & MODEINITTRAN) - { *(ckt->CKTstate1 + here->BSIM3v32qb) = - *(ckt->CKTstate0 + here->BSIM3v32qb); - *(ckt->CKTstate1 + here->BSIM3v32qg) = - *(ckt->CKTstate0 + here->BSIM3v32qg); - *(ckt->CKTstate1 + here->BSIM3v32qd) = - *(ckt->CKTstate0 + here->BSIM3v32qd); - if (here->BSIM3v32nqsMod) - { *(ckt->CKTstate1 + here->BSIM3v32qcheq) = - *(ckt->CKTstate0 + here->BSIM3v32qcheq); - *(ckt->CKTstate1 + here->BSIM3v32qcdump) = - *(ckt->CKTstate0 + here->BSIM3v32qcdump); - } - } - - error = NIintegrate(ckt, &geq, &ceq, 0.0, here->BSIM3v32qb); - if (error) - return(error); - error = NIintegrate(ckt, &geq, &ceq, 0.0, here->BSIM3v32qg); - if (error) - return(error); - error = NIintegrate(ckt, &geq, &ceq, 0.0, here->BSIM3v32qd); - if (error) - return(error); - if (here->BSIM3v32nqsMod) - { error = NIintegrate(ckt, &geq, &ceq, 0.0, here->BSIM3v32qcdump); - if (error) - return(error); - error = NIintegrate(ckt, &geq, &ceq, 0.0, here->BSIM3v32qcheq); - if (error) - return(error); - } - - goto line860; - -line850: - /* initialize to zero charge conductance and current */ - ceqqg = ceqqb = ceqqd = 0.0; - cqcheq = cqdef = 0.0; - - gcdgb = gcddb = gcdsb = 0.0; - gcsgb = gcsdb = gcssb = 0.0; - gcggb = gcgdb = gcgsb = 0.0; - gcbgb = gcbdb = gcbsb = 0.0; - - gqdef = gcqgb = gcqdb = gcqsb = gcqbb = 0.0; - ggtg = ggtd = ggtb = ggts = 0.0; - sxpart = (1.0 - (dxpart = (here->BSIM3v32mode > 0) ? 0.4 : 0.6)); - ddxpart_dVd = ddxpart_dVg = ddxpart_dVb = ddxpart_dVs = 0.0; - dsxpart_dVd = dsxpart_dVg = dsxpart_dVb = dsxpart_dVs = 0.0; - - if (here->BSIM3v32nqsMod) - here->BSIM3v32gtau = 16.0 * here->BSIM3v32u0temp * model->BSIM3v32vtm - / pParam->BSIM3v32leffCV / pParam->BSIM3v32leffCV - * ScalingFactor; - else - here->BSIM3v32gtau = 0.0; - - goto line900; - -line860: - /* evaluate equivalent charge current */ - - cqgate = *(ckt->CKTstate0 + here->BSIM3v32cqg); - cqbulk = *(ckt->CKTstate0 + here->BSIM3v32cqb); - cqdrn = *(ckt->CKTstate0 + here->BSIM3v32cqd); - - ceqqg = cqgate - gcggb * vgb + gcgdb * vbd + gcgsb * vbs; - ceqqb = cqbulk - gcbgb * vgb + gcbdb * vbd + gcbsb * vbs; - ceqqd = cqdrn - gcdgb * vgb + gcddb * vbd + gcdsb * vbs; - - if (here->BSIM3v32nqsMod) - { T0 = ggtg * vgb - ggtd * vbd - ggts * vbs; - ceqqg += T0; - T1 = qdef * here->BSIM3v32gtau; - ceqqd -= dxpart * T0 + T1 * (ddxpart_dVg * vgb - ddxpart_dVd - * vbd - ddxpart_dVs * vbs); - cqdef = *(ckt->CKTstate0 + here->BSIM3v32cqcdump) - gqdef * qdef; - cqcheq = *(ckt->CKTstate0 + here->BSIM3v32cqcheq) - - (gcqgb * vgb - gcqdb * vbd - gcqsb * vbs) + T0; - } - - if (ckt->CKTmode & MODEINITTRAN) - { *(ckt->CKTstate1 + here->BSIM3v32cqb) = - *(ckt->CKTstate0 + here->BSIM3v32cqb); - *(ckt->CKTstate1 + here->BSIM3v32cqg) = - *(ckt->CKTstate0 + here->BSIM3v32cqg); - *(ckt->CKTstate1 + here->BSIM3v32cqd) = - *(ckt->CKTstate0 + here->BSIM3v32cqd); - - if (here->BSIM3v32nqsMod) - { *(ckt->CKTstate1 + here->BSIM3v32cqcheq) = - *(ckt->CKTstate0 + here->BSIM3v32cqcheq); - *(ckt->CKTstate1 + here->BSIM3v32cqcdump) = - *(ckt->CKTstate0 + here->BSIM3v32cqcdump); - } - } - - /* - * load current vector - */ -line900: - - if (here->BSIM3v32mode >= 0) - { Gm = here->BSIM3v32gm; - Gmbs = here->BSIM3v32gmbs; - FwdSum = Gm + Gmbs; - RevSum = 0.0; - cdreq = model->BSIM3v32type * (cdrain - here->BSIM3v32gds * vds - - Gm * vgs - Gmbs * vbs); - - ceqbd = -model->BSIM3v32type * (here->BSIM3v32csub - - here->BSIM3v32gbds * vds - here->BSIM3v32gbgs * vgs - - here->BSIM3v32gbbs * vbs); - ceqbs = 0.0; - - gbbdp = -here->BSIM3v32gbds; - gbbsp = (here->BSIM3v32gbds + here->BSIM3v32gbgs + here->BSIM3v32gbbs); - - gbdpg = here->BSIM3v32gbgs; - gbdpdp = here->BSIM3v32gbds; - gbdpb = here->BSIM3v32gbbs; - gbdpsp = -(gbdpg + gbdpdp + gbdpb); - - gbspg = 0.0; - gbspdp = 0.0; - gbspb = 0.0; - gbspsp = 0.0; - } - else - { Gm = -here->BSIM3v32gm; - Gmbs = -here->BSIM3v32gmbs; - FwdSum = 0.0; - RevSum = -(Gm + Gmbs); - cdreq = -model->BSIM3v32type * (cdrain + here->BSIM3v32gds * vds - + Gm * vgd + Gmbs * vbd); - - ceqbs = -model->BSIM3v32type * (here->BSIM3v32csub - + here->BSIM3v32gbds * vds - here->BSIM3v32gbgs * vgd - - here->BSIM3v32gbbs * vbd); - ceqbd = 0.0; - - gbbsp = -here->BSIM3v32gbds; - gbbdp = (here->BSIM3v32gbds + here->BSIM3v32gbgs + here->BSIM3v32gbbs); - - gbdpg = 0.0; - gbdpsp = 0.0; - gbdpb = 0.0; - gbdpdp = 0.0; - - gbspg = here->BSIM3v32gbgs; - gbspsp = here->BSIM3v32gbds; - gbspb = here->BSIM3v32gbbs; - gbspdp = -(gbspg + gbspsp + gbspb); - } - - if (model->BSIM3v32type > 0) - { ceqbs += (here->BSIM3v32cbs - here->BSIM3v32gbs * vbs); - ceqbd += (here->BSIM3v32cbd - here->BSIM3v32gbd * vbd); - /* - ceqqg = ceqqg; - ceqqb = ceqqb; - ceqqd = ceqqd; - cqdef = cqdef; - cqcheq = cqcheq; - */ - } - else - { ceqbs -= (here->BSIM3v32cbs - here->BSIM3v32gbs * vbs); - ceqbd -= (here->BSIM3v32cbd - here->BSIM3v32gbd * vbd); - ceqqg = -ceqqg; - ceqqb = -ceqqb; - ceqqd = -ceqqd; - cqdef = -cqdef; - cqcheq = -cqcheq; - } - - m = here->BSIM3v32m; - -#ifdef USE_OMP - here->BSIM3v32rhsG = m * ceqqg; - here->BSIM3v32rhsB = m * (ceqbs + ceqbd + ceqqb); - here->BSIM3v32rhsD = m * (ceqbd - cdreq - ceqqd); - here->BSIM3v32rhsS = m * (cdreq + ceqbs + ceqqg - + ceqqb + ceqqd); - if (here->BSIM3v32nqsMod) - here->BSIM3v32rhsQ = m * (cqcheq - cqdef); -#else - (*(ckt->CKTrhs + here->BSIM3v32gNode) -= m * ceqqg); - (*(ckt->CKTrhs + here->BSIM3v32bNode) -= m * (ceqbs + ceqbd + ceqqb)); - (*(ckt->CKTrhs + here->BSIM3v32dNodePrime) += m * (ceqbd - cdreq - ceqqd)); - (*(ckt->CKTrhs + here->BSIM3v32sNodePrime) += m * (cdreq + ceqbs + ceqqg - + ceqqb + ceqqd)); - if (here->BSIM3v32nqsMod) - *(ckt->CKTrhs + here->BSIM3v32qNode) += m * (cqcheq - cqdef); -#endif - - /* - * load y matrix - */ - - T1 = qdef * here->BSIM3v32gtau; -#ifdef USE_OMP - here->BSIM3v32DdPt = m * here->BSIM3v32drainConductance; - here->BSIM3v32GgPt = m * (gcggb - ggtg); - here->BSIM3v32SsPt = m * here->BSIM3v32sourceConductance; - here->BSIM3v32BbPt = m * (here->BSIM3v32gbd + here->BSIM3v32gbs - - gcbgb - gcbdb - gcbsb - here->BSIM3v32gbbs); - here->BSIM3v32DPdpPt = m * (here->BSIM3v32drainConductance - + here->BSIM3v32gds + here->BSIM3v32gbd - + RevSum + gcddb + dxpart * ggtd - + T1 * ddxpart_dVd + gbdpdp); - here->BSIM3v32SPspPt = m * (here->BSIM3v32sourceConductance - + here->BSIM3v32gds + here->BSIM3v32gbs - + FwdSum + gcssb + sxpart * ggts - + T1 * dsxpart_dVs + gbspsp); - here->BSIM3v32DdpPt = m * here->BSIM3v32drainConductance; - here->BSIM3v32GbPt = m * (gcggb + gcgdb + gcgsb + ggtb); - here->BSIM3v32GdpPt = m * (gcgdb - ggtd); - here->BSIM3v32GspPt = m * (gcgsb - ggts); - here->BSIM3v32SspPt = m * here->BSIM3v32sourceConductance; - here->BSIM3v32BgPt = m * (gcbgb - here->BSIM3v32gbgs); - here->BSIM3v32BdpPt = m * (gcbdb - here->BSIM3v32gbd + gbbdp); - here->BSIM3v32BspPt = m * (gcbsb - here->BSIM3v32gbs + gbbsp); - here->BSIM3v32DPdPt = m * here->BSIM3v32drainConductance; - here->BSIM3v32DPgPt = m * (Gm + gcdgb + dxpart * ggtg - + T1 * ddxpart_dVg + gbdpg); - here->BSIM3v32DPbPt = m * (here->BSIM3v32gbd - Gmbs + gcdgb + gcddb - + gcdsb - dxpart * ggtb - - T1 * ddxpart_dVb - gbdpb); - here->BSIM3v32DPspPt = m * (here->BSIM3v32gds + FwdSum - gcdsb - - dxpart * ggts - T1 * ddxpart_dVs - gbdpsp); - here->BSIM3v32SPgPt = m * (gcsgb - Gm + sxpart * ggtg - + T1 * dsxpart_dVg + gbspg); - here->BSIM3v32SPsPt = m * here->BSIM3v32sourceConductance; - here->BSIM3v32SPbPt = m * (here->BSIM3v32gbs + Gmbs + gcsgb + gcsdb - + gcssb - sxpart * ggtb - - T1 * dsxpart_dVb - gbspb); - here->BSIM3v32SPdpPt = m * (here->BSIM3v32gds + RevSum - gcsdb - - sxpart * ggtd - T1 * dsxpart_dVd - gbspdp); - - if (here->BSIM3v32nqsMod) - { - here->BSIM3v32QqPt = m * (gqdef + here->BSIM3v32gtau); - - here->BSIM3v32DPqPt = m * (dxpart * here->BSIM3v32gtau); - here->BSIM3v32SPqPt = m * (sxpart * here->BSIM3v32gtau); - here->BSIM3v32GqPt = m * here->BSIM3v32gtau; - - here->BSIM3v32QgPt = m * (ggtg - gcqgb); - here->BSIM3v32QdpPt = m * (ggtd - gcqdb); - here->BSIM3v32QspPt = m * (ggts - gcqsb); - here->BSIM3v32QbPt = m * (ggtb - gcqbb); - } -#else - (*(here->BSIM3v32DdPtr) += m * here->BSIM3v32drainConductance); - (*(here->BSIM3v32GgPtr) += m * (gcggb - ggtg)); - (*(here->BSIM3v32SsPtr) += m * here->BSIM3v32sourceConductance); - (*(here->BSIM3v32BbPtr) += m * (here->BSIM3v32gbd + here->BSIM3v32gbs - - gcbgb - gcbdb - gcbsb - here->BSIM3v32gbbs)); - (*(here->BSIM3v32DPdpPtr) += m * (here->BSIM3v32drainConductance - + here->BSIM3v32gds + here->BSIM3v32gbd - + RevSum + gcddb + dxpart * ggtd - + T1 * ddxpart_dVd + gbdpdp)); - (*(here->BSIM3v32SPspPtr) += m * (here->BSIM3v32sourceConductance - + here->BSIM3v32gds + here->BSIM3v32gbs - + FwdSum + gcssb + sxpart * ggts - + T1 * dsxpart_dVs + gbspsp)); - (*(here->BSIM3v32DdpPtr) -= m * here->BSIM3v32drainConductance); - (*(here->BSIM3v32GbPtr) -= m * (gcggb + gcgdb + gcgsb + ggtb)); - (*(here->BSIM3v32GdpPtr) += m * (gcgdb - ggtd)); - (*(here->BSIM3v32GspPtr) += m * (gcgsb - ggts)); - (*(here->BSIM3v32SspPtr) -= m * here->BSIM3v32sourceConductance); - (*(here->BSIM3v32BgPtr) += m * (gcbgb - here->BSIM3v32gbgs)); - (*(here->BSIM3v32BdpPtr) += m * (gcbdb - here->BSIM3v32gbd + gbbdp)); - (*(here->BSIM3v32BspPtr) += m * (gcbsb - here->BSIM3v32gbs + gbbsp)); - (*(here->BSIM3v32DPdPtr) -= m * here->BSIM3v32drainConductance); - (*(here->BSIM3v32DPgPtr) += m * (Gm + gcdgb + dxpart * ggtg - + T1 * ddxpart_dVg + gbdpg)); - (*(here->BSIM3v32DPbPtr) -= m * (here->BSIM3v32gbd - Gmbs + gcdgb + gcddb - + gcdsb - dxpart * ggtb - - T1 * ddxpart_dVb - gbdpb)); - (*(here->BSIM3v32DPspPtr) -= m * (here->BSIM3v32gds + FwdSum - gcdsb - - dxpart * ggts - T1 * ddxpart_dVs - gbdpsp)); - (*(here->BSIM3v32SPgPtr) += m * (gcsgb - Gm + sxpart * ggtg - + T1 * dsxpart_dVg + gbspg)); - (*(here->BSIM3v32SPsPtr) -= m * here->BSIM3v32sourceConductance); - (*(here->BSIM3v32SPbPtr) -= m * (here->BSIM3v32gbs + Gmbs + gcsgb + gcsdb - + gcssb - sxpart * ggtb - - T1 * dsxpart_dVb - gbspb)); - (*(here->BSIM3v32SPdpPtr) -= m * (here->BSIM3v32gds + RevSum - gcsdb - - sxpart * ggtd - T1 * dsxpart_dVd - gbspdp)); - - if (here->BSIM3v32nqsMod) - { - *(here->BSIM3v32QqPtr) += m * (gqdef + here->BSIM3v32gtau); - - *(here->BSIM3v32DPqPtr) += m * (dxpart * here->BSIM3v32gtau); - *(here->BSIM3v32SPqPtr) += m * (sxpart * here->BSIM3v32gtau); - *(here->BSIM3v32GqPtr) -= m * here->BSIM3v32gtau; - - *(here->BSIM3v32QgPtr) += m * (ggtg - gcqgb); - *(here->BSIM3v32QdpPtr) += m * (ggtd - gcqdb); - *(here->BSIM3v32QspPtr) += m * (ggts - gcqsb); - *(here->BSIM3v32QbPtr) += m * (ggtb - gcqbb); - } -#endif - -line1000: ; - -#ifndef USE_OMP - } /* End of Mosfet Instance */ -} /* End of Model Instance */ -#endif - -return(OK); -} - -#ifdef USE_OMP -void BSIM3v32LoadRhsMat(GENmodel *inModel, CKTcircuit *ckt) -{ - int InstCount, idx; - BSIM3v32instance **InstArray; - BSIM3v32instance *here; - BSIM3v32model *model = (BSIM3v32model*)inModel; - - InstArray = model->BSIM3v32InstanceArray; - InstCount = model->BSIM3v32InstCount; - - for (idx = 0; idx < InstCount; idx++) { - here = InstArray[idx]; - model = BSIM3v32modPtr(here); - /* Update b for Ax = b */ - (*(ckt->CKTrhs + here->BSIM3v32gNode) -= here->BSIM3v32rhsG); - (*(ckt->CKTrhs + here->BSIM3v32bNode) -= here->BSIM3v32rhsB); - (*(ckt->CKTrhs + here->BSIM3v32dNodePrime) += here->BSIM3v32rhsD); - (*(ckt->CKTrhs + here->BSIM3v32sNodePrime) += here->BSIM3v32rhsS); - if (here->BSIM3v32nqsMod) - (*(ckt->CKTrhs + here->BSIM3v32qNode) += here->BSIM3v32rhsQ); - - /* Update A for Ax = b */ - (*(here->BSIM3v32DdPtr) += here->BSIM3v32DdPt); - (*(here->BSIM3v32GgPtr) += here->BSIM3v32GgPt); - (*(here->BSIM3v32SsPtr) += here->BSIM3v32SsPt); - (*(here->BSIM3v32BbPtr) += here->BSIM3v32BbPt); - (*(here->BSIM3v32DPdpPtr) += here->BSIM3v32DPdpPt); - (*(here->BSIM3v32SPspPtr) += here->BSIM3v32SPspPt); - (*(here->BSIM3v32DdpPtr) -= here->BSIM3v32DdpPt); - (*(here->BSIM3v32GbPtr) -= here->BSIM3v32GbPt); - (*(here->BSIM3v32GdpPtr) += here->BSIM3v32GdpPt); - (*(here->BSIM3v32GspPtr) += here->BSIM3v32GspPt); - (*(here->BSIM3v32SspPtr) -= here->BSIM3v32SspPt); - (*(here->BSIM3v32BgPtr) += here->BSIM3v32BgPt); - (*(here->BSIM3v32BdpPtr) += here->BSIM3v32BdpPt); - (*(here->BSIM3v32BspPtr) += here->BSIM3v32BspPt); - (*(here->BSIM3v32DPdPtr) -= here->BSIM3v32DPdPt); - (*(here->BSIM3v32DPgPtr) += here->BSIM3v32DPgPt); - (*(here->BSIM3v32DPbPtr) -= here->BSIM3v32DPbPt); - (*(here->BSIM3v32DPspPtr) -= here->BSIM3v32DPspPt); - (*(here->BSIM3v32SPgPtr) += here->BSIM3v32SPgPt); - (*(here->BSIM3v32SPsPtr) -= here->BSIM3v32SPsPt); - (*(here->BSIM3v32SPbPtr) -= here->BSIM3v32SPbPt); - (*(here->BSIM3v32SPdpPtr) -= here->BSIM3v32SPdpPt); - - if (here->BSIM3v32nqsMod) - { - *(here->BSIM3v32QqPtr) += here->BSIM3v32QqPt; - - *(here->BSIM3v32DPqPtr) += here->BSIM3v32DPqPt; - *(here->BSIM3v32SPqPtr) += here->BSIM3v32SPqPt; - *(here->BSIM3v32GqPtr) -= here->BSIM3v32GqPt; - - *(here->BSIM3v32QgPtr) += here->BSIM3v32QgPt; - *(here->BSIM3v32QdpPtr) += here->BSIM3v32QdpPt; - *(here->BSIM3v32QspPtr) += here->BSIM3v32QspPt; - *(here->BSIM3v32QbPtr) += here->BSIM3v32QbPt; - } - - } -} -#endif diff --git a/src/spicelib/devices/bsim3v32/b3v32mask.c b/src/spicelib/devices/bsim3v32/b3v32mask.c deleted file mode 100644 index 15ba67204..000000000 --- a/src/spicelib/devices/bsim3v32/b3v32mask.c +++ /dev/null @@ -1,1320 +0,0 @@ -/**** BSIM3v3.2.4, Released by Xuemei Xi 12/21/2001 ****/ - -/********** - * Copyright 2001 Regents of the University of California. All rights reserved. - * File: b3mask.c of BSIM3v3.2.4 - * Author: 1995 Min-Chie Jeng and Mansun Chan. - * Author: 1997-1999 Weidong Liu. - * Author: 2001 Xuemei Xi - * Modified by Paolo Nenzi 2002 and Dietmar Warning 2003 - **********/ - -#include "ngspice/ngspice.h" -#include "ngspice/ifsim.h" -#include "ngspice/cktdefs.h" -#include "ngspice/devdefs.h" -#include "bsim3v32def.h" -#include "ngspice/sperror.h" -#include "ngspice/suffix.h" - -int -BSIM3v32mAsk (CKTcircuit *ckt, GENmodel *inst, int which, IFvalue *value) -{ - BSIM3v32model *model = (BSIM3v32model *)inst; - - NG_IGNORE(ckt); - - switch(which) - { case BSIM3v32_MOD_MOBMOD: - value->iValue = model->BSIM3v32mobMod; - return(OK); - case BSIM3v32_MOD_PARAMCHK: - value->iValue = model->BSIM3v32paramChk; - return(OK); - case BSIM3v32_MOD_BINUNIT: - value->iValue = model->BSIM3v32binUnit; - return(OK); - case BSIM3v32_MOD_CAPMOD: - value->iValue = model->BSIM3v32capMod; - return(OK); - case BSIM3v32_MOD_NOIMOD: - value->iValue = model->BSIM3v32noiMod; - return(OK); - case BSIM3v32_MOD_NQSMOD: - value->iValue = model->BSIM3v32nqsMod; - return(OK); - case BSIM3v32_MOD_ACMMOD: - value->iValue = model->BSIM3v32acmMod; - return(OK); - case BSIM3v32_MOD_CALCACM: - value->iValue = model->BSIM3v32calcacm; - return(OK); - case BSIM3v32_MOD_VERSION : - value->sValue = model->BSIM3v32version; - return(OK); - case BSIM3v32_MOD_TOX : - value->rValue = model->BSIM3v32tox; - return(OK); - case BSIM3v32_MOD_TOXM : - value->rValue = model->BSIM3v32toxm; - return(OK); - case BSIM3v32_MOD_CDSC : - value->rValue = model->BSIM3v32cdsc; - return(OK); - case BSIM3v32_MOD_CDSCB : - value->rValue = model->BSIM3v32cdscb; - return(OK); - - case BSIM3v32_MOD_CDSCD : - value->rValue = model->BSIM3v32cdscd; - return(OK); - - case BSIM3v32_MOD_CIT : - value->rValue = model->BSIM3v32cit; - return(OK); - case BSIM3v32_MOD_NFACTOR : - value->rValue = model->BSIM3v32nfactor; - return(OK); - case BSIM3v32_MOD_XJ: - value->rValue = model->BSIM3v32xj; - return(OK); - case BSIM3v32_MOD_VSAT: - value->rValue = model->BSIM3v32vsat; - return(OK); - case BSIM3v32_MOD_AT: - value->rValue = model->BSIM3v32at; - return(OK); - case BSIM3v32_MOD_A0: - value->rValue = model->BSIM3v32a0; - return(OK); - - case BSIM3v32_MOD_AGS: - value->rValue = model->BSIM3v32ags; - return(OK); - - case BSIM3v32_MOD_A1: - value->rValue = model->BSIM3v32a1; - return(OK); - case BSIM3v32_MOD_A2: - value->rValue = model->BSIM3v32a2; - return(OK); - case BSIM3v32_MOD_KETA: - value->rValue = model->BSIM3v32keta; - return(OK); - case BSIM3v32_MOD_NSUB: - value->rValue = model->BSIM3v32nsub; - return(OK); - case BSIM3v32_MOD_NPEAK: - value->rValue = model->BSIM3v32npeak; - return(OK); - case BSIM3v32_MOD_NGATE: - value->rValue = model->BSIM3v32ngate; - return(OK); - case BSIM3v32_MOD_GAMMA1: - value->rValue = model->BSIM3v32gamma1; - return(OK); - case BSIM3v32_MOD_GAMMA2: - value->rValue = model->BSIM3v32gamma2; - return(OK); - case BSIM3v32_MOD_VBX: - value->rValue = model->BSIM3v32vbx; - return(OK); - case BSIM3v32_MOD_VBM: - value->rValue = model->BSIM3v32vbm; - return(OK); - case BSIM3v32_MOD_XT: - value->rValue = model->BSIM3v32xt; - return(OK); - case BSIM3v32_MOD_K1: - value->rValue = model->BSIM3v32k1; - return(OK); - case BSIM3v32_MOD_KT1: - value->rValue = model->BSIM3v32kt1; - return(OK); - case BSIM3v32_MOD_KT1L: - value->rValue = model->BSIM3v32kt1l; - return(OK); - case BSIM3v32_MOD_KT2 : - value->rValue = model->BSIM3v32kt2; - return(OK); - case BSIM3v32_MOD_K2 : - value->rValue = model->BSIM3v32k2; - return(OK); - case BSIM3v32_MOD_K3: - value->rValue = model->BSIM3v32k3; - return(OK); - case BSIM3v32_MOD_K3B: - value->rValue = model->BSIM3v32k3b; - return(OK); - case BSIM3v32_MOD_W0: - value->rValue = model->BSIM3v32w0; - return(OK); - case BSIM3v32_MOD_NLX: - value->rValue = model->BSIM3v32nlx; - return(OK); - case BSIM3v32_MOD_DVT0 : - value->rValue = model->BSIM3v32dvt0; - return(OK); - case BSIM3v32_MOD_DVT1 : - value->rValue = model->BSIM3v32dvt1; - return(OK); - case BSIM3v32_MOD_DVT2 : - value->rValue = model->BSIM3v32dvt2; - return(OK); - case BSIM3v32_MOD_DVT0W : - value->rValue = model->BSIM3v32dvt0w; - return(OK); - case BSIM3v32_MOD_DVT1W : - value->rValue = model->BSIM3v32dvt1w; - return(OK); - case BSIM3v32_MOD_DVT2W : - value->rValue = model->BSIM3v32dvt2w; - return(OK); - case BSIM3v32_MOD_DROUT : - value->rValue = model->BSIM3v32drout; - return(OK); - case BSIM3v32_MOD_DSUB : - value->rValue = model->BSIM3v32dsub; - return(OK); - case BSIM3v32_MOD_VTH0: - value->rValue = model->BSIM3v32vth0; - return(OK); - case BSIM3v32_MOD_UA: - value->rValue = model->BSIM3v32ua; - return(OK); - case BSIM3v32_MOD_UA1: - value->rValue = model->BSIM3v32ua1; - return(OK); - case BSIM3v32_MOD_UB: - value->rValue = model->BSIM3v32ub; - return(OK); - case BSIM3v32_MOD_UB1: - value->rValue = model->BSIM3v32ub1; - return(OK); - case BSIM3v32_MOD_UC: - value->rValue = model->BSIM3v32uc; - return(OK); - case BSIM3v32_MOD_UC1: - value->rValue = model->BSIM3v32uc1; - return(OK); - case BSIM3v32_MOD_U0: - value->rValue = model->BSIM3v32u0; - return(OK); - case BSIM3v32_MOD_UTE: - value->rValue = model->BSIM3v32ute; - return(OK); - case BSIM3v32_MOD_VOFF: - value->rValue = model->BSIM3v32voff; - return(OK); - case BSIM3v32_MOD_DELTA: - value->rValue = model->BSIM3v32delta; - return(OK); - case BSIM3v32_MOD_RDSW: - value->rValue = model->BSIM3v32rdsw; - return(OK); - case BSIM3v32_MOD_PRWG: - value->rValue = model->BSIM3v32prwg; - return(OK); - case BSIM3v32_MOD_PRWB: - value->rValue = model->BSIM3v32prwb; - return(OK); - case BSIM3v32_MOD_PRT: - value->rValue = model->BSIM3v32prt; - return(OK); - case BSIM3v32_MOD_ETA0: - value->rValue = model->BSIM3v32eta0; - return(OK); - case BSIM3v32_MOD_ETAB: - value->rValue = model->BSIM3v32etab; - return(OK); - case BSIM3v32_MOD_PCLM: - value->rValue = model->BSIM3v32pclm; - return(OK); - case BSIM3v32_MOD_PDIBL1: - value->rValue = model->BSIM3v32pdibl1; - return(OK); - case BSIM3v32_MOD_PDIBL2: - value->rValue = model->BSIM3v32pdibl2; - return(OK); - case BSIM3v32_MOD_PDIBLB: - value->rValue = model->BSIM3v32pdiblb; - return(OK); - case BSIM3v32_MOD_PSCBE1: - value->rValue = model->BSIM3v32pscbe1; - return(OK); - case BSIM3v32_MOD_PSCBE2: - value->rValue = model->BSIM3v32pscbe2; - return(OK); - case BSIM3v32_MOD_PVAG: - value->rValue = model->BSIM3v32pvag; - return(OK); - case BSIM3v32_MOD_WR: - value->rValue = model->BSIM3v32wr; - return(OK); - case BSIM3v32_MOD_DWG: - value->rValue = model->BSIM3v32dwg; - return(OK); - case BSIM3v32_MOD_DWB: - value->rValue = model->BSIM3v32dwb; - return(OK); - case BSIM3v32_MOD_B0: - value->rValue = model->BSIM3v32b0; - return(OK); - case BSIM3v32_MOD_B1: - value->rValue = model->BSIM3v32b1; - return(OK); - case BSIM3v32_MOD_ALPHA0: - value->rValue = model->BSIM3v32alpha0; - return(OK); - case BSIM3v32_MOD_ALPHA1: - value->rValue = model->BSIM3v32alpha1; - return(OK); - case BSIM3v32_MOD_BETA0: - value->rValue = model->BSIM3v32beta0; - return(OK); - case BSIM3v32_MOD_IJTH: - value->rValue = model->BSIM3v32ijth; - return(OK); - case BSIM3v32_MOD_VFB: - value->rValue = model->BSIM3v32vfb; - return(OK); - - case BSIM3v32_MOD_ELM: - value->rValue = model->BSIM3v32elm; - return(OK); - case BSIM3v32_MOD_CGSL: - value->rValue = model->BSIM3v32cgsl; - return(OK); - case BSIM3v32_MOD_CGDL: - value->rValue = model->BSIM3v32cgdl; - return(OK); - case BSIM3v32_MOD_CKAPPA: - value->rValue = model->BSIM3v32ckappa; - return(OK); - case BSIM3v32_MOD_CF: - value->rValue = model->BSIM3v32cf; - return(OK); - case BSIM3v32_MOD_CLC: - value->rValue = model->BSIM3v32clc; - return(OK); - case BSIM3v32_MOD_CLE: - value->rValue = model->BSIM3v32cle; - return(OK); - case BSIM3v32_MOD_DWC: - value->rValue = model->BSIM3v32dwc; - return(OK); - case BSIM3v32_MOD_DLC: - value->rValue = model->BSIM3v32dlc; - return(OK); - case BSIM3v32_MOD_VFBCV: - value->rValue = model->BSIM3v32vfbcv; - return(OK); - case BSIM3v32_MOD_ACDE: - value->rValue = model->BSIM3v32acde; - return(OK); - case BSIM3v32_MOD_MOIN: - value->rValue = model->BSIM3v32moin; - return(OK); - case BSIM3v32_MOD_NOFF: - value->rValue = model->BSIM3v32noff; - return(OK); - case BSIM3v32_MOD_VOFFCV: - value->rValue = model->BSIM3v32voffcv; - return(OK); - case BSIM3v32_MOD_TCJ: - value->rValue = model->BSIM3v32tcj; - return(OK); - case BSIM3v32_MOD_TPB: - value->rValue = model->BSIM3v32tpb; - return(OK); - case BSIM3v32_MOD_TCJSW: - value->rValue = model->BSIM3v32tcjsw; - return(OK); - case BSIM3v32_MOD_TPBSW: - value->rValue = model->BSIM3v32tpbsw; - return(OK); - case BSIM3v32_MOD_TCJSWG: - value->rValue = model->BSIM3v32tcjswg; - return(OK); - case BSIM3v32_MOD_TPBSWG: - value->rValue = model->BSIM3v32tpbswg; - return(OK); - - /* ACM model */ - case BSIM3v32_MOD_HDIF: - value->rValue = model->BSIM3v32hdif; - return(OK); - case BSIM3v32_MOD_LDIF: - value->rValue = model->BSIM3v32ldif; - return(OK); - case BSIM3v32_MOD_LD: - value->rValue = model->BSIM3v32ld; - return(OK); - case BSIM3v32_MOD_RD: - value->rValue = model->BSIM3v32rd; - return(OK); - case BSIM3v32_MOD_RS: - value->rValue = model->BSIM3v32rs; - return(OK); - case BSIM3v32_MOD_RDC: - value->rValue = model->BSIM3v32rdc; - return(OK); - case BSIM3v32_MOD_RSC: - value->rValue = model->BSIM3v32rsc; - return(OK); - case BSIM3v32_MOD_WMLT: - value->rValue = model->BSIM3v32wmlt; - return(OK); - - case BSIM3v32_MOD_LMLT: - value->rValue = model->BSIM3v32lmlt; - return(OK); - - /* Length dependence */ - case BSIM3v32_MOD_LCDSC : - value->rValue = model->BSIM3v32lcdsc; - return(OK); - case BSIM3v32_MOD_LCDSCB : - value->rValue = model->BSIM3v32lcdscb; - return(OK); - case BSIM3v32_MOD_LCDSCD : - value->rValue = model->BSIM3v32lcdscd; - return(OK); - case BSIM3v32_MOD_LCIT : - value->rValue = model->BSIM3v32lcit; - return(OK); - case BSIM3v32_MOD_LNFACTOR : - value->rValue = model->BSIM3v32lnfactor; - return(OK); - case BSIM3v32_MOD_LXJ: - value->rValue = model->BSIM3v32lxj; - return(OK); - case BSIM3v32_MOD_LVSAT: - value->rValue = model->BSIM3v32lvsat; - return(OK); - case BSIM3v32_MOD_LAT: - value->rValue = model->BSIM3v32lat; - return(OK); - case BSIM3v32_MOD_LA0: - value->rValue = model->BSIM3v32la0; - return(OK); - case BSIM3v32_MOD_LAGS: - value->rValue = model->BSIM3v32lags; - return(OK); - case BSIM3v32_MOD_LA1: - value->rValue = model->BSIM3v32la1; - return(OK); - case BSIM3v32_MOD_LA2: - value->rValue = model->BSIM3v32la2; - return(OK); - case BSIM3v32_MOD_LKETA: - value->rValue = model->BSIM3v32lketa; - return(OK); - case BSIM3v32_MOD_LNSUB: - value->rValue = model->BSIM3v32lnsub; - return(OK); - case BSIM3v32_MOD_LNPEAK: - value->rValue = model->BSIM3v32lnpeak; - return(OK); - case BSIM3v32_MOD_LNGATE: - value->rValue = model->BSIM3v32lngate; - return(OK); - case BSIM3v32_MOD_LGAMMA1: - value->rValue = model->BSIM3v32lgamma1; - return(OK); - case BSIM3v32_MOD_LGAMMA2: - value->rValue = model->BSIM3v32lgamma2; - return(OK); - case BSIM3v32_MOD_LVBX: - value->rValue = model->BSIM3v32lvbx; - return(OK); - case BSIM3v32_MOD_LVBM: - value->rValue = model->BSIM3v32lvbm; - return(OK); - case BSIM3v32_MOD_LXT: - value->rValue = model->BSIM3v32lxt; - return(OK); - case BSIM3v32_MOD_LK1: - value->rValue = model->BSIM3v32lk1; - return(OK); - case BSIM3v32_MOD_LKT1: - value->rValue = model->BSIM3v32lkt1; - return(OK); - case BSIM3v32_MOD_LKT1L: - value->rValue = model->BSIM3v32lkt1l; - return(OK); - case BSIM3v32_MOD_LKT2 : - value->rValue = model->BSIM3v32lkt2; - return(OK); - case BSIM3v32_MOD_LK2 : - value->rValue = model->BSIM3v32lk2; - return(OK); - case BSIM3v32_MOD_LK3: - value->rValue = model->BSIM3v32lk3; - return(OK); - case BSIM3v32_MOD_LK3B: - value->rValue = model->BSIM3v32lk3b; - return(OK); - case BSIM3v32_MOD_LW0: - value->rValue = model->BSIM3v32lw0; - return(OK); - case BSIM3v32_MOD_LNLX: - value->rValue = model->BSIM3v32lnlx; - return(OK); - case BSIM3v32_MOD_LDVT0: - value->rValue = model->BSIM3v32ldvt0; - return(OK); - case BSIM3v32_MOD_LDVT1 : - value->rValue = model->BSIM3v32ldvt1; - return(OK); - case BSIM3v32_MOD_LDVT2 : - value->rValue = model->BSIM3v32ldvt2; - return(OK); - case BSIM3v32_MOD_LDVT0W : - value->rValue = model->BSIM3v32ldvt0w; - return(OK); - case BSIM3v32_MOD_LDVT1W : - value->rValue = model->BSIM3v32ldvt1w; - return(OK); - case BSIM3v32_MOD_LDVT2W : - value->rValue = model->BSIM3v32ldvt2w; - return(OK); - case BSIM3v32_MOD_LDROUT : - value->rValue = model->BSIM3v32ldrout; - return(OK); - case BSIM3v32_MOD_LDSUB : - value->rValue = model->BSIM3v32ldsub; - return(OK); - case BSIM3v32_MOD_LVTH0: - value->rValue = model->BSIM3v32lvth0; - return(OK); - case BSIM3v32_MOD_LUA: - value->rValue = model->BSIM3v32lua; - return(OK); - case BSIM3v32_MOD_LUA1: - value->rValue = model->BSIM3v32lua1; - return(OK); - case BSIM3v32_MOD_LUB: - value->rValue = model->BSIM3v32lub; - return(OK); - case BSIM3v32_MOD_LUB1: - value->rValue = model->BSIM3v32lub1; - return(OK); - case BSIM3v32_MOD_LUC: - value->rValue = model->BSIM3v32luc; - return(OK); - case BSIM3v32_MOD_LUC1: - value->rValue = model->BSIM3v32luc1; - return(OK); - case BSIM3v32_MOD_LU0: - value->rValue = model->BSIM3v32lu0; - return(OK); - case BSIM3v32_MOD_LUTE: - value->rValue = model->BSIM3v32lute; - return(OK); - case BSIM3v32_MOD_LVOFF: - value->rValue = model->BSIM3v32lvoff; - return(OK); - case BSIM3v32_MOD_LDELTA: - value->rValue = model->BSIM3v32ldelta; - return(OK); - case BSIM3v32_MOD_LRDSW: - value->rValue = model->BSIM3v32lrdsw; - return(OK); - case BSIM3v32_MOD_LPRWB: - value->rValue = model->BSIM3v32lprwb; - return(OK); - case BSIM3v32_MOD_LPRWG: - value->rValue = model->BSIM3v32lprwg; - return(OK); - case BSIM3v32_MOD_LPRT: - value->rValue = model->BSIM3v32lprt; - return(OK); - case BSIM3v32_MOD_LETA0: - value->rValue = model->BSIM3v32leta0; - return(OK); - case BSIM3v32_MOD_LETAB: - value->rValue = model->BSIM3v32letab; - return(OK); - case BSIM3v32_MOD_LPCLM: - value->rValue = model->BSIM3v32lpclm; - return(OK); - case BSIM3v32_MOD_LPDIBL1: - value->rValue = model->BSIM3v32lpdibl1; - return(OK); - case BSIM3v32_MOD_LPDIBL2: - value->rValue = model->BSIM3v32lpdibl2; - return(OK); - case BSIM3v32_MOD_LPDIBLB: - value->rValue = model->BSIM3v32lpdiblb; - return(OK); - case BSIM3v32_MOD_LPSCBE1: - value->rValue = model->BSIM3v32lpscbe1; - return(OK); - case BSIM3v32_MOD_LPSCBE2: - value->rValue = model->BSIM3v32lpscbe2; - return(OK); - case BSIM3v32_MOD_LPVAG: - value->rValue = model->BSIM3v32lpvag; - return(OK); - case BSIM3v32_MOD_LWR: - value->rValue = model->BSIM3v32lwr; - return(OK); - case BSIM3v32_MOD_LDWG: - value->rValue = model->BSIM3v32ldwg; - return(OK); - case BSIM3v32_MOD_LDWB: - value->rValue = model->BSIM3v32ldwb; - return(OK); - case BSIM3v32_MOD_LB0: - value->rValue = model->BSIM3v32lb0; - return(OK); - case BSIM3v32_MOD_LB1: - value->rValue = model->BSIM3v32lb1; - return(OK); - case BSIM3v32_MOD_LALPHA0: - value->rValue = model->BSIM3v32lalpha0; - return(OK); - case BSIM3v32_MOD_LALPHA1: - value->rValue = model->BSIM3v32lalpha1; - return(OK); - case BSIM3v32_MOD_LBETA0: - value->rValue = model->BSIM3v32lbeta0; - return(OK); - case BSIM3v32_MOD_LVFB: - value->rValue = model->BSIM3v32lvfb; - return(OK); - - case BSIM3v32_MOD_LELM: - value->rValue = model->BSIM3v32lelm; - return(OK); - case BSIM3v32_MOD_LCGSL: - value->rValue = model->BSIM3v32lcgsl; - return(OK); - case BSIM3v32_MOD_LCGDL: - value->rValue = model->BSIM3v32lcgdl; - return(OK); - case BSIM3v32_MOD_LCKAPPA: - value->rValue = model->BSIM3v32lckappa; - return(OK); - case BSIM3v32_MOD_LCF: - value->rValue = model->BSIM3v32lcf; - return(OK); - case BSIM3v32_MOD_LCLC: - value->rValue = model->BSIM3v32lclc; - return(OK); - case BSIM3v32_MOD_LCLE: - value->rValue = model->BSIM3v32lcle; - return(OK); - case BSIM3v32_MOD_LVFBCV: - value->rValue = model->BSIM3v32lvfbcv; - return(OK); - case BSIM3v32_MOD_LACDE: - value->rValue = model->BSIM3v32lacde; - return(OK); - case BSIM3v32_MOD_LMOIN: - value->rValue = model->BSIM3v32lmoin; - return(OK); - case BSIM3v32_MOD_LNOFF: - value->rValue = model->BSIM3v32lnoff; - return(OK); - case BSIM3v32_MOD_LVOFFCV: - value->rValue = model->BSIM3v32lvoffcv; - return(OK); - - /* Width dependence */ - case BSIM3v32_MOD_WCDSC : - value->rValue = model->BSIM3v32wcdsc; - return(OK); - case BSIM3v32_MOD_WCDSCB : - value->rValue = model->BSIM3v32wcdscb; - return(OK); - case BSIM3v32_MOD_WCDSCD : - value->rValue = model->BSIM3v32wcdscd; - return(OK); - case BSIM3v32_MOD_WCIT : - value->rValue = model->BSIM3v32wcit; - return(OK); - case BSIM3v32_MOD_WNFACTOR : - value->rValue = model->BSIM3v32wnfactor; - return(OK); - case BSIM3v32_MOD_WXJ: - value->rValue = model->BSIM3v32wxj; - return(OK); - case BSIM3v32_MOD_WVSAT: - value->rValue = model->BSIM3v32wvsat; - return(OK); - case BSIM3v32_MOD_WAT: - value->rValue = model->BSIM3v32wat; - return(OK); - case BSIM3v32_MOD_WA0: - value->rValue = model->BSIM3v32wa0; - return(OK); - case BSIM3v32_MOD_WAGS: - value->rValue = model->BSIM3v32wags; - return(OK); - case BSIM3v32_MOD_WA1: - value->rValue = model->BSIM3v32wa1; - return(OK); - case BSIM3v32_MOD_WA2: - value->rValue = model->BSIM3v32wa2; - return(OK); - case BSIM3v32_MOD_WKETA: - value->rValue = model->BSIM3v32wketa; - return(OK); - case BSIM3v32_MOD_WNSUB: - value->rValue = model->BSIM3v32wnsub; - return(OK); - case BSIM3v32_MOD_WNPEAK: - value->rValue = model->BSIM3v32wnpeak; - return(OK); - case BSIM3v32_MOD_WNGATE: - value->rValue = model->BSIM3v32wngate; - return(OK); - case BSIM3v32_MOD_WGAMMA1: - value->rValue = model->BSIM3v32wgamma1; - return(OK); - case BSIM3v32_MOD_WGAMMA2: - value->rValue = model->BSIM3v32wgamma2; - return(OK); - case BSIM3v32_MOD_WVBX: - value->rValue = model->BSIM3v32wvbx; - return(OK); - case BSIM3v32_MOD_WVBM: - value->rValue = model->BSIM3v32wvbm; - return(OK); - case BSIM3v32_MOD_WXT: - value->rValue = model->BSIM3v32wxt; - return(OK); - case BSIM3v32_MOD_WK1: - value->rValue = model->BSIM3v32wk1; - return(OK); - case BSIM3v32_MOD_WKT1: - value->rValue = model->BSIM3v32wkt1; - return(OK); - case BSIM3v32_MOD_WKT1L: - value->rValue = model->BSIM3v32wkt1l; - return(OK); - case BSIM3v32_MOD_WKT2 : - value->rValue = model->BSIM3v32wkt2; - return(OK); - case BSIM3v32_MOD_WK2 : - value->rValue = model->BSIM3v32wk2; - return(OK); - case BSIM3v32_MOD_WK3: - value->rValue = model->BSIM3v32wk3; - return(OK); - case BSIM3v32_MOD_WK3B: - value->rValue = model->BSIM3v32wk3b; - return(OK); - case BSIM3v32_MOD_WW0: - value->rValue = model->BSIM3v32ww0; - return(OK); - case BSIM3v32_MOD_WNLX: - value->rValue = model->BSIM3v32wnlx; - return(OK); - case BSIM3v32_MOD_WDVT0: - value->rValue = model->BSIM3v32wdvt0; - return(OK); - case BSIM3v32_MOD_WDVT1 : - value->rValue = model->BSIM3v32wdvt1; - return(OK); - case BSIM3v32_MOD_WDVT2 : - value->rValue = model->BSIM3v32wdvt2; - return(OK); - case BSIM3v32_MOD_WDVT0W : - value->rValue = model->BSIM3v32wdvt0w; - return(OK); - case BSIM3v32_MOD_WDVT1W : - value->rValue = model->BSIM3v32wdvt1w; - return(OK); - case BSIM3v32_MOD_WDVT2W : - value->rValue = model->BSIM3v32wdvt2w; - return(OK); - case BSIM3v32_MOD_WDROUT : - value->rValue = model->BSIM3v32wdrout; - return(OK); - case BSIM3v32_MOD_WDSUB : - value->rValue = model->BSIM3v32wdsub; - return(OK); - case BSIM3v32_MOD_WVTH0: - value->rValue = model->BSIM3v32wvth0; - return(OK); - case BSIM3v32_MOD_WUA: - value->rValue = model->BSIM3v32wua; - return(OK); - case BSIM3v32_MOD_WUA1: - value->rValue = model->BSIM3v32wua1; - return(OK); - case BSIM3v32_MOD_WUB: - value->rValue = model->BSIM3v32wub; - return(OK); - case BSIM3v32_MOD_WUB1: - value->rValue = model->BSIM3v32wub1; - return(OK); - case BSIM3v32_MOD_WUC: - value->rValue = model->BSIM3v32wuc; - return(OK); - case BSIM3v32_MOD_WUC1: - value->rValue = model->BSIM3v32wuc1; - return(OK); - case BSIM3v32_MOD_WU0: - value->rValue = model->BSIM3v32wu0; - return(OK); - case BSIM3v32_MOD_WUTE: - value->rValue = model->BSIM3v32wute; - return(OK); - case BSIM3v32_MOD_WVOFF: - value->rValue = model->BSIM3v32wvoff; - return(OK); - case BSIM3v32_MOD_WDELTA: - value->rValue = model->BSIM3v32wdelta; - return(OK); - case BSIM3v32_MOD_WRDSW: - value->rValue = model->BSIM3v32wrdsw; - return(OK); - case BSIM3v32_MOD_WPRWB: - value->rValue = model->BSIM3v32wprwb; - return(OK); - case BSIM3v32_MOD_WPRWG: - value->rValue = model->BSIM3v32wprwg; - return(OK); - case BSIM3v32_MOD_WPRT: - value->rValue = model->BSIM3v32wprt; - return(OK); - case BSIM3v32_MOD_WETA0: - value->rValue = model->BSIM3v32weta0; - return(OK); - case BSIM3v32_MOD_WETAB: - value->rValue = model->BSIM3v32wetab; - return(OK); - case BSIM3v32_MOD_WPCLM: - value->rValue = model->BSIM3v32wpclm; - return(OK); - case BSIM3v32_MOD_WPDIBL1: - value->rValue = model->BSIM3v32wpdibl1; - return(OK); - case BSIM3v32_MOD_WPDIBL2: - value->rValue = model->BSIM3v32wpdibl2; - return(OK); - case BSIM3v32_MOD_WPDIBLB: - value->rValue = model->BSIM3v32wpdiblb; - return(OK); - case BSIM3v32_MOD_WPSCBE1: - value->rValue = model->BSIM3v32wpscbe1; - return(OK); - case BSIM3v32_MOD_WPSCBE2: - value->rValue = model->BSIM3v32wpscbe2; - return(OK); - case BSIM3v32_MOD_WPVAG: - value->rValue = model->BSIM3v32wpvag; - return(OK); - case BSIM3v32_MOD_WWR: - value->rValue = model->BSIM3v32wwr; - return(OK); - case BSIM3v32_MOD_WDWG: - value->rValue = model->BSIM3v32wdwg; - return(OK); - case BSIM3v32_MOD_WDWB: - value->rValue = model->BSIM3v32wdwb; - return(OK); - case BSIM3v32_MOD_WB0: - value->rValue = model->BSIM3v32wb0; - return(OK); - case BSIM3v32_MOD_WB1: - value->rValue = model->BSIM3v32wb1; - return(OK); - case BSIM3v32_MOD_WALPHA0: - value->rValue = model->BSIM3v32walpha0; - return(OK); - case BSIM3v32_MOD_WALPHA1: - value->rValue = model->BSIM3v32walpha1; - return(OK); - case BSIM3v32_MOD_WBETA0: - value->rValue = model->BSIM3v32wbeta0; - return(OK); - case BSIM3v32_MOD_WVFB: - value->rValue = model->BSIM3v32wvfb; - return(OK); - - case BSIM3v32_MOD_WELM: - value->rValue = model->BSIM3v32welm; - return(OK); - case BSIM3v32_MOD_WCGSL: - value->rValue = model->BSIM3v32wcgsl; - return(OK); - case BSIM3v32_MOD_WCGDL: - value->rValue = model->BSIM3v32wcgdl; - return(OK); - case BSIM3v32_MOD_WCKAPPA: - value->rValue = model->BSIM3v32wckappa; - return(OK); - case BSIM3v32_MOD_WCF: - value->rValue = model->BSIM3v32wcf; - return(OK); - case BSIM3v32_MOD_WCLC: - value->rValue = model->BSIM3v32wclc; - return(OK); - case BSIM3v32_MOD_WCLE: - value->rValue = model->BSIM3v32wcle; - return(OK); - case BSIM3v32_MOD_WVFBCV: - value->rValue = model->BSIM3v32wvfbcv; - return(OK); - case BSIM3v32_MOD_WACDE: - value->rValue = model->BSIM3v32wacde; - return(OK); - case BSIM3v32_MOD_WMOIN: - value->rValue = model->BSIM3v32wmoin; - return(OK); - case BSIM3v32_MOD_WNOFF: - value->rValue = model->BSIM3v32wnoff; - return(OK); - case BSIM3v32_MOD_WVOFFCV: - value->rValue = model->BSIM3v32wvoffcv; - return(OK); - - /* Cross-term dependence */ - case BSIM3v32_MOD_PCDSC : - value->rValue = model->BSIM3v32pcdsc; - return(OK); - case BSIM3v32_MOD_PCDSCB : - value->rValue = model->BSIM3v32pcdscb; - return(OK); - case BSIM3v32_MOD_PCDSCD : - value->rValue = model->BSIM3v32pcdscd; - return(OK); - case BSIM3v32_MOD_PCIT : - value->rValue = model->BSIM3v32pcit; - return(OK); - case BSIM3v32_MOD_PNFACTOR : - value->rValue = model->BSIM3v32pnfactor; - return(OK); - case BSIM3v32_MOD_PXJ: - value->rValue = model->BSIM3v32pxj; - return(OK); - case BSIM3v32_MOD_PVSAT: - value->rValue = model->BSIM3v32pvsat; - return(OK); - case BSIM3v32_MOD_PAT: - value->rValue = model->BSIM3v32pat; - return(OK); - case BSIM3v32_MOD_PA0: - value->rValue = model->BSIM3v32pa0; - return(OK); - case BSIM3v32_MOD_PAGS: - value->rValue = model->BSIM3v32pags; - return(OK); - case BSIM3v32_MOD_PA1: - value->rValue = model->BSIM3v32pa1; - return(OK); - case BSIM3v32_MOD_PA2: - value->rValue = model->BSIM3v32pa2; - return(OK); - case BSIM3v32_MOD_PKETA: - value->rValue = model->BSIM3v32pketa; - return(OK); - case BSIM3v32_MOD_PNSUB: - value->rValue = model->BSIM3v32pnsub; - return(OK); - case BSIM3v32_MOD_PNPEAK: - value->rValue = model->BSIM3v32pnpeak; - return(OK); - case BSIM3v32_MOD_PNGATE: - value->rValue = model->BSIM3v32pngate; - return(OK); - case BSIM3v32_MOD_PGAMMA1: - value->rValue = model->BSIM3v32pgamma1; - return(OK); - case BSIM3v32_MOD_PGAMMA2: - value->rValue = model->BSIM3v32pgamma2; - return(OK); - case BSIM3v32_MOD_PVBX: - value->rValue = model->BSIM3v32pvbx; - return(OK); - case BSIM3v32_MOD_PVBM: - value->rValue = model->BSIM3v32pvbm; - return(OK); - case BSIM3v32_MOD_PXT: - value->rValue = model->BSIM3v32pxt; - return(OK); - case BSIM3v32_MOD_PK1: - value->rValue = model->BSIM3v32pk1; - return(OK); - case BSIM3v32_MOD_PKT1: - value->rValue = model->BSIM3v32pkt1; - return(OK); - case BSIM3v32_MOD_PKT1L: - value->rValue = model->BSIM3v32pkt1l; - return(OK); - case BSIM3v32_MOD_PKT2 : - value->rValue = model->BSIM3v32pkt2; - return(OK); - case BSIM3v32_MOD_PK2 : - value->rValue = model->BSIM3v32pk2; - return(OK); - case BSIM3v32_MOD_PK3: - value->rValue = model->BSIM3v32pk3; - return(OK); - case BSIM3v32_MOD_PK3B: - value->rValue = model->BSIM3v32pk3b; - return(OK); - case BSIM3v32_MOD_PW0: - value->rValue = model->BSIM3v32pw0; - return(OK); - case BSIM3v32_MOD_PNLX: - value->rValue = model->BSIM3v32pnlx; - return(OK); - case BSIM3v32_MOD_PDVT0 : - value->rValue = model->BSIM3v32pdvt0; - return(OK); - case BSIM3v32_MOD_PDVT1 : - value->rValue = model->BSIM3v32pdvt1; - return(OK); - case BSIM3v32_MOD_PDVT2 : - value->rValue = model->BSIM3v32pdvt2; - return(OK); - case BSIM3v32_MOD_PDVT0W : - value->rValue = model->BSIM3v32pdvt0w; - return(OK); - case BSIM3v32_MOD_PDVT1W : - value->rValue = model->BSIM3v32pdvt1w; - return(OK); - case BSIM3v32_MOD_PDVT2W : - value->rValue = model->BSIM3v32pdvt2w; - return(OK); - case BSIM3v32_MOD_PDROUT : - value->rValue = model->BSIM3v32pdrout; - return(OK); - case BSIM3v32_MOD_PDSUB : - value->rValue = model->BSIM3v32pdsub; - return(OK); - case BSIM3v32_MOD_PVTH0: - value->rValue = model->BSIM3v32pvth0; - return(OK); - case BSIM3v32_MOD_PUA: - value->rValue = model->BSIM3v32pua; - return(OK); - case BSIM3v32_MOD_PUA1: - value->rValue = model->BSIM3v32pua1; - return(OK); - case BSIM3v32_MOD_PUB: - value->rValue = model->BSIM3v32pub; - return(OK); - case BSIM3v32_MOD_PUB1: - value->rValue = model->BSIM3v32pub1; - return(OK); - case BSIM3v32_MOD_PUC: - value->rValue = model->BSIM3v32puc; - return(OK); - case BSIM3v32_MOD_PUC1: - value->rValue = model->BSIM3v32puc1; - return(OK); - case BSIM3v32_MOD_PU0: - value->rValue = model->BSIM3v32pu0; - return(OK); - case BSIM3v32_MOD_PUTE: - value->rValue = model->BSIM3v32pute; - return(OK); - case BSIM3v32_MOD_PVOFF: - value->rValue = model->BSIM3v32pvoff; - return(OK); - case BSIM3v32_MOD_PDELTA: - value->rValue = model->BSIM3v32pdelta; - return(OK); - case BSIM3v32_MOD_PRDSW: - value->rValue = model->BSIM3v32prdsw; - return(OK); - case BSIM3v32_MOD_PPRWB: - value->rValue = model->BSIM3v32pprwb; - return(OK); - case BSIM3v32_MOD_PPRWG: - value->rValue = model->BSIM3v32pprwg; - return(OK); - case BSIM3v32_MOD_PPRT: - value->rValue = model->BSIM3v32pprt; - return(OK); - case BSIM3v32_MOD_PETA0: - value->rValue = model->BSIM3v32peta0; - return(OK); - case BSIM3v32_MOD_PETAB: - value->rValue = model->BSIM3v32petab; - return(OK); - case BSIM3v32_MOD_PPCLM: - value->rValue = model->BSIM3v32ppclm; - return(OK); - case BSIM3v32_MOD_PPDIBL1: - value->rValue = model->BSIM3v32ppdibl1; - return(OK); - case BSIM3v32_MOD_PPDIBL2: - value->rValue = model->BSIM3v32ppdibl2; - return(OK); - case BSIM3v32_MOD_PPDIBLB: - value->rValue = model->BSIM3v32ppdiblb; - return(OK); - case BSIM3v32_MOD_PPSCBE1: - value->rValue = model->BSIM3v32ppscbe1; - return(OK); - case BSIM3v32_MOD_PPSCBE2: - value->rValue = model->BSIM3v32ppscbe2; - return(OK); - case BSIM3v32_MOD_PPVAG: - value->rValue = model->BSIM3v32ppvag; - return(OK); - case BSIM3v32_MOD_PWR: - value->rValue = model->BSIM3v32pwr; - return(OK); - case BSIM3v32_MOD_PDWG: - value->rValue = model->BSIM3v32pdwg; - return(OK); - case BSIM3v32_MOD_PDWB: - value->rValue = model->BSIM3v32pdwb; - return(OK); - case BSIM3v32_MOD_PB0: - value->rValue = model->BSIM3v32pb0; - return(OK); - case BSIM3v32_MOD_PB1: - value->rValue = model->BSIM3v32pb1; - return(OK); - case BSIM3v32_MOD_PALPHA0: - value->rValue = model->BSIM3v32palpha0; - return(OK); - case BSIM3v32_MOD_PALPHA1: - value->rValue = model->BSIM3v32palpha1; - return(OK); - case BSIM3v32_MOD_PBETA0: - value->rValue = model->BSIM3v32pbeta0; - return(OK); - case BSIM3v32_MOD_PVFB: - value->rValue = model->BSIM3v32pvfb; - return(OK); - - case BSIM3v32_MOD_PELM: - value->rValue = model->BSIM3v32pelm; - return(OK); - case BSIM3v32_MOD_PCGSL: - value->rValue = model->BSIM3v32pcgsl; - return(OK); - case BSIM3v32_MOD_PCGDL: - value->rValue = model->BSIM3v32pcgdl; - return(OK); - case BSIM3v32_MOD_PCKAPPA: - value->rValue = model->BSIM3v32pckappa; - return(OK); - case BSIM3v32_MOD_PCF: - value->rValue = model->BSIM3v32pcf; - return(OK); - case BSIM3v32_MOD_PCLC: - value->rValue = model->BSIM3v32pclc; - return(OK); - case BSIM3v32_MOD_PCLE: - value->rValue = model->BSIM3v32pcle; - return(OK); - case BSIM3v32_MOD_PVFBCV: - value->rValue = model->BSIM3v32pvfbcv; - return(OK); - case BSIM3v32_MOD_PACDE: - value->rValue = model->BSIM3v32pacde; - return(OK); - case BSIM3v32_MOD_PMOIN: - value->rValue = model->BSIM3v32pmoin; - return(OK); - case BSIM3v32_MOD_PNOFF: - value->rValue = model->BSIM3v32pnoff; - return(OK); - case BSIM3v32_MOD_PVOFFCV: - value->rValue = model->BSIM3v32pvoffcv; - return(OK); - - case BSIM3v32_MOD_TNOM : - value->rValue = model->BSIM3v32tnom; - return(OK); - case BSIM3v32_MOD_CGSO: - value->rValue = model->BSIM3v32cgso; - return(OK); - case BSIM3v32_MOD_CGDO: - value->rValue = model->BSIM3v32cgdo; - return(OK); - case BSIM3v32_MOD_CGBO: - value->rValue = model->BSIM3v32cgbo; - return(OK); - case BSIM3v32_MOD_XPART: - value->rValue = model->BSIM3v32xpart; - return(OK); - case BSIM3v32_MOD_RSH: - value->rValue = model->BSIM3v32sheetResistance; - return(OK); - case BSIM3v32_MOD_JS: - value->rValue = model->BSIM3v32jctSatCurDensity; - return(OK); - case BSIM3v32_MOD_JSW: - value->rValue = model->BSIM3v32jctSidewallSatCurDensity; - return(OK); - case BSIM3v32_MOD_PB: - value->rValue = model->BSIM3v32bulkJctPotential; - return(OK); - case BSIM3v32_MOD_MJ: - value->rValue = model->BSIM3v32bulkJctBotGradingCoeff; - return(OK); - case BSIM3v32_MOD_PBSW: - value->rValue = model->BSIM3v32sidewallJctPotential; - return(OK); - case BSIM3v32_MOD_MJSW: - value->rValue = model->BSIM3v32bulkJctSideGradingCoeff; - return(OK); - case BSIM3v32_MOD_CJ: - value->rValue = model->BSIM3v32unitAreaJctCap; - return(OK); - case BSIM3v32_MOD_CJSW: - value->rValue = model->BSIM3v32unitLengthSidewallJctCap; - return(OK); - case BSIM3v32_MOD_PBSWG: - value->rValue = model->BSIM3v32GatesidewallJctPotential; - return(OK); - case BSIM3v32_MOD_MJSWG: - value->rValue = model->BSIM3v32bulkJctGateSideGradingCoeff; - return(OK); - case BSIM3v32_MOD_CJSWG: - value->rValue = model->BSIM3v32unitLengthGateSidewallJctCap; - return(OK); - case BSIM3v32_MOD_NJ: - value->rValue = model->BSIM3v32jctEmissionCoeff; - return(OK); - case BSIM3v32_MOD_XTI: - value->rValue = model->BSIM3v32jctTempExponent; - return(OK); - case BSIM3v32_MOD_LINT: - value->rValue = model->BSIM3v32Lint; - return(OK); - case BSIM3v32_MOD_LL: - value->rValue = model->BSIM3v32Ll; - return(OK); - case BSIM3v32_MOD_LLC: - value->rValue = model->BSIM3v32Llc; - return(OK); - case BSIM3v32_MOD_LLN: - value->rValue = model->BSIM3v32Lln; - return(OK); - case BSIM3v32_MOD_LW: - value->rValue = model->BSIM3v32Lw; - return(OK); - case BSIM3v32_MOD_LWC: - value->rValue = model->BSIM3v32Lwc; - return(OK); - case BSIM3v32_MOD_LWN: - value->rValue = model->BSIM3v32Lwn; - return(OK); - case BSIM3v32_MOD_LWL: - value->rValue = model->BSIM3v32Lwl; - return(OK); - case BSIM3v32_MOD_LWLC: - value->rValue = model->BSIM3v32Lwlc; - return(OK); - case BSIM3v32_MOD_LMIN: - value->rValue = model->BSIM3v32Lmin; - return(OK); - case BSIM3v32_MOD_LMAX: - value->rValue = model->BSIM3v32Lmax; - return(OK); - case BSIM3v32_MOD_WINT: - value->rValue = model->BSIM3v32Wint; - return(OK); - case BSIM3v32_MOD_WL: - value->rValue = model->BSIM3v32Wl; - return(OK); - case BSIM3v32_MOD_WLC: - value->rValue = model->BSIM3v32Wlc; - return(OK); - case BSIM3v32_MOD_WLN: - value->rValue = model->BSIM3v32Wln; - return(OK); - case BSIM3v32_MOD_WW: - value->rValue = model->BSIM3v32Ww; - return(OK); - case BSIM3v32_MOD_WWC: - value->rValue = model->BSIM3v32Wwc; - return(OK); - case BSIM3v32_MOD_WWN: - value->rValue = model->BSIM3v32Wwn; - return(OK); - case BSIM3v32_MOD_WWL: - value->rValue = model->BSIM3v32Wwl; - return(OK); - case BSIM3v32_MOD_WWLC: - value->rValue = model->BSIM3v32Wwlc; - return(OK); - case BSIM3v32_MOD_WMIN: - value->rValue = model->BSIM3v32Wmin; - return(OK); - case BSIM3v32_MOD_WMAX: - value->rValue = model->BSIM3v32Wmax; - return(OK); - - case BSIM3v32_MOD_XL: - value->rValue = model->BSIM3v32xl; - return(OK); - case BSIM3v32_MOD_XW: - value->rValue = model->BSIM3v32xw; - return(OK); - - case BSIM3v32_MOD_NOIA: - value->rValue = model->BSIM3v32oxideTrapDensityA; - return(OK); - case BSIM3v32_MOD_NOIB: - value->rValue = model->BSIM3v32oxideTrapDensityB; - return(OK); - case BSIM3v32_MOD_NOIC: - value->rValue = model->BSIM3v32oxideTrapDensityC; - return(OK); - case BSIM3v32_MOD_EM: - value->rValue = model->BSIM3v32em; - return(OK); - case BSIM3v32_MOD_EF: - value->rValue = model->BSIM3v32ef; - return(OK); - case BSIM3v32_MOD_AF: - value->rValue = model->BSIM3v32af; - return(OK); - case BSIM3v32_MOD_KF: - value->rValue = model->BSIM3v32kf; - return(OK); - - case BSIM3v32_MOD_VGS_MAX: - value->rValue = model->BSIM3v32vgsMax; - return(OK); - case BSIM3v32_MOD_VGD_MAX: - value->rValue = model->BSIM3v32vgdMax; - return(OK); - case BSIM3v32_MOD_VGB_MAX: - value->rValue = model->BSIM3v32vgbMax; - return(OK); - case BSIM3v32_MOD_VDS_MAX: - value->rValue = model->BSIM3v32vdsMax; - return(OK); - case BSIM3v32_MOD_VBS_MAX: - value->rValue = model->BSIM3v32vbsMax; - return(OK); - case BSIM3v32_MOD_VBD_MAX: - value->rValue = model->BSIM3v32vbdMax; - return(OK); - case BSIM3v32_MOD_VGSR_MAX: - value->rValue = model->BSIM3v32vgsrMax; - return(OK); - case BSIM3v32_MOD_VGDR_MAX: - value->rValue = model->BSIM3v32vgdrMax; - return(OK); - case BSIM3v32_MOD_VGBR_MAX: - value->rValue = model->BSIM3v32vgbrMax; - return(OK); - case BSIM3v32_MOD_VBSR_MAX: - value->rValue = model->BSIM3v32vbsrMax; - return(OK); - case BSIM3v32_MOD_VBDR_MAX: - value->rValue = model->BSIM3v32vbdrMax; - return(OK); - - default: - return(E_BADPARM); - } - /* NOTREACHED */ -} diff --git a/src/spicelib/devices/bsim3v32/b3v32mdel.c b/src/spicelib/devices/bsim3v32/b3v32mdel.c deleted file mode 100644 index bc119f1d1..000000000 --- a/src/spicelib/devices/bsim3v32/b3v32mdel.c +++ /dev/null @@ -1,37 +0,0 @@ -/**** BSIM3v3.2.4, Released by Xuemei Xi 12/21/2001 ****/ - -/********** - * Copyright 2001 Regents of the University of California. All rights reserved. - * File: b3mdel.c of BSIM3v3.2.4 - * Author: 1995 Min-Chie Jeng and Mansun Chan. - * Author: 1997-1999 Weidong Liu. - * Author: 2001 Xuemei Xi - * Modified by Paolo Nenzi 2002 - **********/ - -#include "ngspice/ngspice.h" -#include "bsim3v32def.h" -#include "ngspice/sperror.h" -#include "ngspice/suffix.h" - - -int -BSIM3v32mDelete(GENmodel *gen_model) -{ - BSIM3v32model *model = (BSIM3v32model *) gen_model; - -#ifdef USE_OMP - FREE(model->BSIM3v32InstanceArray); -#endif - - struct bsim3v32SizeDependParam *p = model->pSizeDependParamKnot; - while (p) { - struct bsim3v32SizeDependParam *next_p = p->pNext; - FREE(p); - p = next_p; - } - - FREE(model->BSIM3v32version); - - return OK; -} diff --git a/src/spicelib/devices/bsim3v32/b3v32mpar.c b/src/spicelib/devices/bsim3v32/b3v32mpar.c deleted file mode 100644 index 33112c05a..000000000 --- a/src/spicelib/devices/bsim3v32/b3v32mpar.c +++ /dev/null @@ -1,1782 +0,0 @@ -/**** BSIM3v3.2.4, Released by Xuemei Xi 12/21/2001 ****/ - -/********** - * Copyright 2001 Regents of the University of California. All rights reserved. - * File: b3mpar.c of BSIM3v3.2.4 - * Author: 1995 Min-Chie Jeng and Mansun Chan. - * Author: 1997-1999 Weidong Liu. - * Author: 2001 Xuemei Xi - * Modified by Paolo Nenzi 2002 and Dietmar Warning 2003 - **********/ - -#include "ngspice/ngspice.h" -#include "bsim3v32def.h" -#include "ngspice/ifsim.h" -#include "ngspice/sperror.h" -#include "ngspice/suffix.h" - - -int -BSIM3v32mParam(int param, IFvalue *value, GENmodel *inMod) -{ - BSIM3v32model *mod = (BSIM3v32model*)inMod; - switch(param) - { case BSIM3v32_MOD_MOBMOD : - mod->BSIM3v32mobMod = value->iValue; - mod->BSIM3v32mobModGiven = TRUE; - break; - case BSIM3v32_MOD_BINUNIT : - mod->BSIM3v32binUnit = value->iValue; - mod->BSIM3v32binUnitGiven = TRUE; - break; - case BSIM3v32_MOD_PARAMCHK : - mod->BSIM3v32paramChk = value->iValue; - mod->BSIM3v32paramChkGiven = TRUE; - break; - case BSIM3v32_MOD_CAPMOD : - mod->BSIM3v32capMod = value->iValue; - mod->BSIM3v32capModGiven = TRUE; - break; - case BSIM3v32_MOD_ACMMOD: - mod->BSIM3v32acmMod = value->iValue; - mod->BSIM3v32acmModGiven = TRUE; - break; - case BSIM3v32_MOD_CALCACM: - mod->BSIM3v32calcacm = value->iValue; - mod->BSIM3v32calcacmGiven = TRUE; - break; - case BSIM3v32_MOD_NOIMOD : - mod->BSIM3v32noiMod = value->iValue; - mod->BSIM3v32noiModGiven = TRUE; - break; - case BSIM3v32_MOD_NQSMOD : - mod->BSIM3v32nqsMod = value->iValue; - mod->BSIM3v32nqsModGiven = TRUE; - break; - case BSIM3v32_MOD_VERSION : - mod->BSIM3v32version = value->sValue; - mod->BSIM3v32versionGiven = TRUE; - break; - case BSIM3v32_MOD_TOX : - mod->BSIM3v32tox = value->rValue; - mod->BSIM3v32toxGiven = TRUE; - break; - case BSIM3v32_MOD_TOXM : - mod->BSIM3v32toxm = value->rValue; - mod->BSIM3v32toxmGiven = TRUE; - break; - - case BSIM3v32_MOD_CDSC : - mod->BSIM3v32cdsc = value->rValue; - mod->BSIM3v32cdscGiven = TRUE; - break; - case BSIM3v32_MOD_CDSCB : - mod->BSIM3v32cdscb = value->rValue; - mod->BSIM3v32cdscbGiven = TRUE; - break; - - case BSIM3v32_MOD_CDSCD : - mod->BSIM3v32cdscd = value->rValue; - mod->BSIM3v32cdscdGiven = TRUE; - break; - - case BSIM3v32_MOD_CIT : - mod->BSIM3v32cit = value->rValue; - mod->BSIM3v32citGiven = TRUE; - break; - case BSIM3v32_MOD_NFACTOR : - mod->BSIM3v32nfactor = value->rValue; - mod->BSIM3v32nfactorGiven = TRUE; - break; - case BSIM3v32_MOD_XJ: - mod->BSIM3v32xj = value->rValue; - mod->BSIM3v32xjGiven = TRUE; - break; - case BSIM3v32_MOD_VSAT: - mod->BSIM3v32vsat = value->rValue; - mod->BSIM3v32vsatGiven = TRUE; - break; - case BSIM3v32_MOD_A0: - mod->BSIM3v32a0 = value->rValue; - mod->BSIM3v32a0Given = TRUE; - break; - - case BSIM3v32_MOD_AGS: - mod->BSIM3v32ags= value->rValue; - mod->BSIM3v32agsGiven = TRUE; - break; - - case BSIM3v32_MOD_A1: - mod->BSIM3v32a1 = value->rValue; - mod->BSIM3v32a1Given = TRUE; - break; - case BSIM3v32_MOD_A2: - mod->BSIM3v32a2 = value->rValue; - mod->BSIM3v32a2Given = TRUE; - break; - case BSIM3v32_MOD_AT: - mod->BSIM3v32at = value->rValue; - mod->BSIM3v32atGiven = TRUE; - break; - case BSIM3v32_MOD_KETA: - mod->BSIM3v32keta = value->rValue; - mod->BSIM3v32ketaGiven = TRUE; - break; - case BSIM3v32_MOD_NSUB: - mod->BSIM3v32nsub = value->rValue; - mod->BSIM3v32nsubGiven = TRUE; - break; - case BSIM3v32_MOD_NPEAK: - mod->BSIM3v32npeak = value->rValue; - mod->BSIM3v32npeakGiven = TRUE; - if (mod->BSIM3v32npeak > 1.0e20) - mod->BSIM3v32npeak *= 1.0e-6; - break; - case BSIM3v32_MOD_NGATE: - mod->BSIM3v32ngate = value->rValue; - mod->BSIM3v32ngateGiven = TRUE; - if (mod->BSIM3v32ngate > 1.000001e24) - mod->BSIM3v32ngate *= 1.0e-6; - break; - case BSIM3v32_MOD_GAMMA1: - mod->BSIM3v32gamma1 = value->rValue; - mod->BSIM3v32gamma1Given = TRUE; - break; - case BSIM3v32_MOD_GAMMA2: - mod->BSIM3v32gamma2 = value->rValue; - mod->BSIM3v32gamma2Given = TRUE; - break; - case BSIM3v32_MOD_VBX: - mod->BSIM3v32vbx = value->rValue; - mod->BSIM3v32vbxGiven = TRUE; - break; - case BSIM3v32_MOD_VBM: - mod->BSIM3v32vbm = value->rValue; - mod->BSIM3v32vbmGiven = TRUE; - break; - case BSIM3v32_MOD_XT: - mod->BSIM3v32xt = value->rValue; - mod->BSIM3v32xtGiven = TRUE; - break; - case BSIM3v32_MOD_K1: - mod->BSIM3v32k1 = value->rValue; - mod->BSIM3v32k1Given = TRUE; - break; - case BSIM3v32_MOD_KT1: - mod->BSIM3v32kt1 = value->rValue; - mod->BSIM3v32kt1Given = TRUE; - break; - case BSIM3v32_MOD_KT1L: - mod->BSIM3v32kt1l = value->rValue; - mod->BSIM3v32kt1lGiven = TRUE; - break; - case BSIM3v32_MOD_KT2: - mod->BSIM3v32kt2 = value->rValue; - mod->BSIM3v32kt2Given = TRUE; - break; - case BSIM3v32_MOD_K2: - mod->BSIM3v32k2 = value->rValue; - mod->BSIM3v32k2Given = TRUE; - break; - case BSIM3v32_MOD_K3: - mod->BSIM3v32k3 = value->rValue; - mod->BSIM3v32k3Given = TRUE; - break; - case BSIM3v32_MOD_K3B: - mod->BSIM3v32k3b = value->rValue; - mod->BSIM3v32k3bGiven = TRUE; - break; - case BSIM3v32_MOD_NLX: - mod->BSIM3v32nlx = value->rValue; - mod->BSIM3v32nlxGiven = TRUE; - break; - case BSIM3v32_MOD_W0: - mod->BSIM3v32w0 = value->rValue; - mod->BSIM3v32w0Given = TRUE; - break; - case BSIM3v32_MOD_DVT0: - mod->BSIM3v32dvt0 = value->rValue; - mod->BSIM3v32dvt0Given = TRUE; - break; - case BSIM3v32_MOD_DVT1: - mod->BSIM3v32dvt1 = value->rValue; - mod->BSIM3v32dvt1Given = TRUE; - break; - case BSIM3v32_MOD_DVT2: - mod->BSIM3v32dvt2 = value->rValue; - mod->BSIM3v32dvt2Given = TRUE; - break; - case BSIM3v32_MOD_DVT0W: - mod->BSIM3v32dvt0w = value->rValue; - mod->BSIM3v32dvt0wGiven = TRUE; - break; - case BSIM3v32_MOD_DVT1W: - mod->BSIM3v32dvt1w = value->rValue; - mod->BSIM3v32dvt1wGiven = TRUE; - break; - case BSIM3v32_MOD_DVT2W: - mod->BSIM3v32dvt2w = value->rValue; - mod->BSIM3v32dvt2wGiven = TRUE; - break; - case BSIM3v32_MOD_DROUT: - mod->BSIM3v32drout = value->rValue; - mod->BSIM3v32droutGiven = TRUE; - break; - case BSIM3v32_MOD_DSUB: - mod->BSIM3v32dsub = value->rValue; - mod->BSIM3v32dsubGiven = TRUE; - break; - case BSIM3v32_MOD_VTH0: - mod->BSIM3v32vth0 = value->rValue; - mod->BSIM3v32vth0Given = TRUE; - break; - case BSIM3v32_MOD_UA: - mod->BSIM3v32ua = value->rValue; - mod->BSIM3v32uaGiven = TRUE; - break; - case BSIM3v32_MOD_UA1: - mod->BSIM3v32ua1 = value->rValue; - mod->BSIM3v32ua1Given = TRUE; - break; - case BSIM3v32_MOD_UB: - mod->BSIM3v32ub = value->rValue; - mod->BSIM3v32ubGiven = TRUE; - break; - case BSIM3v32_MOD_UB1: - mod->BSIM3v32ub1 = value->rValue; - mod->BSIM3v32ub1Given = TRUE; - break; - case BSIM3v32_MOD_UC: - mod->BSIM3v32uc = value->rValue; - mod->BSIM3v32ucGiven = TRUE; - break; - case BSIM3v32_MOD_UC1: - mod->BSIM3v32uc1 = value->rValue; - mod->BSIM3v32uc1Given = TRUE; - break; - case BSIM3v32_MOD_U0 : - mod->BSIM3v32u0 = value->rValue; - mod->BSIM3v32u0Given = TRUE; - break; - case BSIM3v32_MOD_UTE : - mod->BSIM3v32ute = value->rValue; - mod->BSIM3v32uteGiven = TRUE; - break; - case BSIM3v32_MOD_VOFF: - mod->BSIM3v32voff = value->rValue; - mod->BSIM3v32voffGiven = TRUE; - break; - case BSIM3v32_MOD_DELTA : - mod->BSIM3v32delta = value->rValue; - mod->BSIM3v32deltaGiven = TRUE; - break; - case BSIM3v32_MOD_RDSW: - mod->BSIM3v32rdsw = value->rValue; - mod->BSIM3v32rdswGiven = TRUE; - break; - case BSIM3v32_MOD_PRWG: - mod->BSIM3v32prwg = value->rValue; - mod->BSIM3v32prwgGiven = TRUE; - break; - case BSIM3v32_MOD_PRWB: - mod->BSIM3v32prwb = value->rValue; - mod->BSIM3v32prwbGiven = TRUE; - break; - case BSIM3v32_MOD_PRT: - mod->BSIM3v32prt = value->rValue; - mod->BSIM3v32prtGiven = TRUE; - break; - case BSIM3v32_MOD_ETA0: - mod->BSIM3v32eta0 = value->rValue; - mod->BSIM3v32eta0Given = TRUE; - break; - case BSIM3v32_MOD_ETAB: - mod->BSIM3v32etab = value->rValue; - mod->BSIM3v32etabGiven = TRUE; - break; - case BSIM3v32_MOD_PCLM: - mod->BSIM3v32pclm = value->rValue; - mod->BSIM3v32pclmGiven = TRUE; - break; - case BSIM3v32_MOD_PDIBL1: - mod->BSIM3v32pdibl1 = value->rValue; - mod->BSIM3v32pdibl1Given = TRUE; - break; - case BSIM3v32_MOD_PDIBL2: - mod->BSIM3v32pdibl2 = value->rValue; - mod->BSIM3v32pdibl2Given = TRUE; - break; - case BSIM3v32_MOD_PDIBLB: - mod->BSIM3v32pdiblb = value->rValue; - mod->BSIM3v32pdiblbGiven = TRUE; - break; - case BSIM3v32_MOD_PSCBE1: - mod->BSIM3v32pscbe1 = value->rValue; - mod->BSIM3v32pscbe1Given = TRUE; - break; - case BSIM3v32_MOD_PSCBE2: - mod->BSIM3v32pscbe2 = value->rValue; - mod->BSIM3v32pscbe2Given = TRUE; - break; - case BSIM3v32_MOD_PVAG: - mod->BSIM3v32pvag = value->rValue; - mod->BSIM3v32pvagGiven = TRUE; - break; - case BSIM3v32_MOD_WR : - mod->BSIM3v32wr = value->rValue; - mod->BSIM3v32wrGiven = TRUE; - break; - case BSIM3v32_MOD_DWG : - mod->BSIM3v32dwg = value->rValue; - mod->BSIM3v32dwgGiven = TRUE; - break; - case BSIM3v32_MOD_DWB : - mod->BSIM3v32dwb = value->rValue; - mod->BSIM3v32dwbGiven = TRUE; - break; - case BSIM3v32_MOD_B0 : - mod->BSIM3v32b0 = value->rValue; - mod->BSIM3v32b0Given = TRUE; - break; - case BSIM3v32_MOD_B1 : - mod->BSIM3v32b1 = value->rValue; - mod->BSIM3v32b1Given = TRUE; - break; - case BSIM3v32_MOD_ALPHA0 : - mod->BSIM3v32alpha0 = value->rValue; - mod->BSIM3v32alpha0Given = TRUE; - break; - case BSIM3v32_MOD_ALPHA1 : - mod->BSIM3v32alpha1 = value->rValue; - mod->BSIM3v32alpha1Given = TRUE; - break; - case BSIM3v32_MOD_BETA0 : - mod->BSIM3v32beta0 = value->rValue; - mod->BSIM3v32beta0Given = TRUE; - break; - case BSIM3v32_MOD_IJTH : - mod->BSIM3v32ijth = value->rValue; - mod->BSIM3v32ijthGiven = TRUE; - break; - case BSIM3v32_MOD_VFB : - mod->BSIM3v32vfb = value->rValue; - mod->BSIM3v32vfbGiven = TRUE; - break; - - case BSIM3v32_MOD_ELM : - mod->BSIM3v32elm = value->rValue; - mod->BSIM3v32elmGiven = TRUE; - break; - case BSIM3v32_MOD_CGSL : - mod->BSIM3v32cgsl = value->rValue; - mod->BSIM3v32cgslGiven = TRUE; - break; - case BSIM3v32_MOD_CGDL : - mod->BSIM3v32cgdl = value->rValue; - mod->BSIM3v32cgdlGiven = TRUE; - break; - case BSIM3v32_MOD_CKAPPA : - mod->BSIM3v32ckappa = value->rValue; - mod->BSIM3v32ckappaGiven = TRUE; - break; - case BSIM3v32_MOD_CF : - mod->BSIM3v32cf = value->rValue; - mod->BSIM3v32cfGiven = TRUE; - break; - case BSIM3v32_MOD_CLC : - mod->BSIM3v32clc = value->rValue; - mod->BSIM3v32clcGiven = TRUE; - break; - case BSIM3v32_MOD_CLE : - mod->BSIM3v32cle = value->rValue; - mod->BSIM3v32cleGiven = TRUE; - break; - case BSIM3v32_MOD_DWC : - mod->BSIM3v32dwc = value->rValue; - mod->BSIM3v32dwcGiven = TRUE; - break; - case BSIM3v32_MOD_DLC : - mod->BSIM3v32dlc = value->rValue; - mod->BSIM3v32dlcGiven = TRUE; - break; - case BSIM3v32_MOD_VFBCV : - mod->BSIM3v32vfbcv = value->rValue; - mod->BSIM3v32vfbcvGiven = TRUE; - break; - case BSIM3v32_MOD_ACDE : - mod->BSIM3v32acde = value->rValue; - mod->BSIM3v32acdeGiven = TRUE; - break; - case BSIM3v32_MOD_MOIN : - mod->BSIM3v32moin = value->rValue; - mod->BSIM3v32moinGiven = TRUE; - break; - case BSIM3v32_MOD_NOFF : - mod->BSIM3v32noff = value->rValue; - mod->BSIM3v32noffGiven = TRUE; - break; - case BSIM3v32_MOD_VOFFCV : - mod->BSIM3v32voffcv = value->rValue; - mod->BSIM3v32voffcvGiven = TRUE; - break; - case BSIM3v32_MOD_TCJ : - mod->BSIM3v32tcj = value->rValue; - mod->BSIM3v32tcjGiven = TRUE; - break; - case BSIM3v32_MOD_TPB : - mod->BSIM3v32tpb = value->rValue; - mod->BSIM3v32tpbGiven = TRUE; - break; - case BSIM3v32_MOD_TCJSW : - mod->BSIM3v32tcjsw = value->rValue; - mod->BSIM3v32tcjswGiven = TRUE; - break; - case BSIM3v32_MOD_TPBSW : - mod->BSIM3v32tpbsw = value->rValue; - mod->BSIM3v32tpbswGiven = TRUE; - break; - case BSIM3v32_MOD_TCJSWG : - mod->BSIM3v32tcjswg = value->rValue; - mod->BSIM3v32tcjswgGiven = TRUE; - break; - case BSIM3v32_MOD_TPBSWG : - mod->BSIM3v32tpbswg = value->rValue; - mod->BSIM3v32tpbswgGiven = TRUE; - break; - - /* acm model */ - case BSIM3v32_MOD_HDIF: - mod->BSIM3v32hdif = value->rValue; - mod->BSIM3v32hdifGiven = TRUE; - break; - case BSIM3v32_MOD_LDIF: - mod->BSIM3v32ldif = value->rValue; - mod->BSIM3v32ldifGiven = TRUE; - break; - case BSIM3v32_MOD_LD: - mod->BSIM3v32ld = value->rValue; - mod->BSIM3v32ldGiven = TRUE; - break; - case BSIM3v32_MOD_RD: - mod->BSIM3v32rd = value->rValue; - mod->BSIM3v32rdGiven = TRUE; - break; - case BSIM3v32_MOD_RS: - mod->BSIM3v32rs = value->rValue; - mod->BSIM3v32rsGiven = TRUE; - break; - case BSIM3v32_MOD_RDC: - mod->BSIM3v32rdc = value->rValue; - mod->BSIM3v32rdcGiven = TRUE; - break; - case BSIM3v32_MOD_RSC: - mod->BSIM3v32rsc = value->rValue; - mod->BSIM3v32rscGiven = TRUE; - break; - case BSIM3v32_MOD_WMLT: - mod->BSIM3v32wmlt = value->rValue; - mod->BSIM3v32wmltGiven = TRUE; - break; - - /* Length shrink */ - case BSIM3v32_MOD_LMLT: - mod->BSIM3v32lmlt = value->rValue; - mod->BSIM3v32lmltGiven = TRUE; - break; - - /* Length dependence */ - case BSIM3v32_MOD_LCDSC : - mod->BSIM3v32lcdsc = value->rValue; - mod->BSIM3v32lcdscGiven = TRUE; - break; - - - case BSIM3v32_MOD_LCDSCB : - mod->BSIM3v32lcdscb = value->rValue; - mod->BSIM3v32lcdscbGiven = TRUE; - break; - case BSIM3v32_MOD_LCDSCD : - mod->BSIM3v32lcdscd = value->rValue; - mod->BSIM3v32lcdscdGiven = TRUE; - break; - case BSIM3v32_MOD_LCIT : - mod->BSIM3v32lcit = value->rValue; - mod->BSIM3v32lcitGiven = TRUE; - break; - case BSIM3v32_MOD_LNFACTOR : - mod->BSIM3v32lnfactor = value->rValue; - mod->BSIM3v32lnfactorGiven = TRUE; - break; - case BSIM3v32_MOD_LXJ: - mod->BSIM3v32lxj = value->rValue; - mod->BSIM3v32lxjGiven = TRUE; - break; - case BSIM3v32_MOD_LVSAT: - mod->BSIM3v32lvsat = value->rValue; - mod->BSIM3v32lvsatGiven = TRUE; - break; - - - case BSIM3v32_MOD_LA0: - mod->BSIM3v32la0 = value->rValue; - mod->BSIM3v32la0Given = TRUE; - break; - case BSIM3v32_MOD_LAGS: - mod->BSIM3v32lags = value->rValue; - mod->BSIM3v32lagsGiven = TRUE; - break; - case BSIM3v32_MOD_LA1: - mod->BSIM3v32la1 = value->rValue; - mod->BSIM3v32la1Given = TRUE; - break; - case BSIM3v32_MOD_LA2: - mod->BSIM3v32la2 = value->rValue; - mod->BSIM3v32la2Given = TRUE; - break; - case BSIM3v32_MOD_LAT: - mod->BSIM3v32lat = value->rValue; - mod->BSIM3v32latGiven = TRUE; - break; - case BSIM3v32_MOD_LKETA: - mod->BSIM3v32lketa = value->rValue; - mod->BSIM3v32lketaGiven = TRUE; - break; - case BSIM3v32_MOD_LNSUB: - mod->BSIM3v32lnsub = value->rValue; - mod->BSIM3v32lnsubGiven = TRUE; - break; - case BSIM3v32_MOD_LNPEAK: - mod->BSIM3v32lnpeak = value->rValue; - mod->BSIM3v32lnpeakGiven = TRUE; - if (mod->BSIM3v32lnpeak > 1.0e20) - mod->BSIM3v32lnpeak *= 1.0e-6; - break; - case BSIM3v32_MOD_LNGATE: - mod->BSIM3v32lngate = value->rValue; - mod->BSIM3v32lngateGiven = TRUE; - if (mod->BSIM3v32lngate > 1.0e23) - mod->BSIM3v32lngate *= 1.0e-6; - break; - case BSIM3v32_MOD_LGAMMA1: - mod->BSIM3v32lgamma1 = value->rValue; - mod->BSIM3v32lgamma1Given = TRUE; - break; - case BSIM3v32_MOD_LGAMMA2: - mod->BSIM3v32lgamma2 = value->rValue; - mod->BSIM3v32lgamma2Given = TRUE; - break; - case BSIM3v32_MOD_LVBX: - mod->BSIM3v32lvbx = value->rValue; - mod->BSIM3v32lvbxGiven = TRUE; - break; - case BSIM3v32_MOD_LVBM: - mod->BSIM3v32lvbm = value->rValue; - mod->BSIM3v32lvbmGiven = TRUE; - break; - case BSIM3v32_MOD_LXT: - mod->BSIM3v32lxt = value->rValue; - mod->BSIM3v32lxtGiven = TRUE; - break; - case BSIM3v32_MOD_LK1: - mod->BSIM3v32lk1 = value->rValue; - mod->BSIM3v32lk1Given = TRUE; - break; - case BSIM3v32_MOD_LKT1: - mod->BSIM3v32lkt1 = value->rValue; - mod->BSIM3v32lkt1Given = TRUE; - break; - case BSIM3v32_MOD_LKT1L: - mod->BSIM3v32lkt1l = value->rValue; - mod->BSIM3v32lkt1lGiven = TRUE; - break; - case BSIM3v32_MOD_LKT2: - mod->BSIM3v32lkt2 = value->rValue; - mod->BSIM3v32lkt2Given = TRUE; - break; - case BSIM3v32_MOD_LK2: - mod->BSIM3v32lk2 = value->rValue; - mod->BSIM3v32lk2Given = TRUE; - break; - case BSIM3v32_MOD_LK3: - mod->BSIM3v32lk3 = value->rValue; - mod->BSIM3v32lk3Given = TRUE; - break; - case BSIM3v32_MOD_LK3B: - mod->BSIM3v32lk3b = value->rValue; - mod->BSIM3v32lk3bGiven = TRUE; - break; - case BSIM3v32_MOD_LNLX: - mod->BSIM3v32lnlx = value->rValue; - mod->BSIM3v32lnlxGiven = TRUE; - break; - case BSIM3v32_MOD_LW0: - mod->BSIM3v32lw0 = value->rValue; - mod->BSIM3v32lw0Given = TRUE; - break; - case BSIM3v32_MOD_LDVT0: - mod->BSIM3v32ldvt0 = value->rValue; - mod->BSIM3v32ldvt0Given = TRUE; - break; - case BSIM3v32_MOD_LDVT1: - mod->BSIM3v32ldvt1 = value->rValue; - mod->BSIM3v32ldvt1Given = TRUE; - break; - case BSIM3v32_MOD_LDVT2: - mod->BSIM3v32ldvt2 = value->rValue; - mod->BSIM3v32ldvt2Given = TRUE; - break; - case BSIM3v32_MOD_LDVT0W: - mod->BSIM3v32ldvt0w = value->rValue; - mod->BSIM3v32ldvt0wGiven = TRUE; - break; - case BSIM3v32_MOD_LDVT1W: - mod->BSIM3v32ldvt1w = value->rValue; - mod->BSIM3v32ldvt1wGiven = TRUE; - break; - case BSIM3v32_MOD_LDVT2W: - mod->BSIM3v32ldvt2w = value->rValue; - mod->BSIM3v32ldvt2wGiven = TRUE; - break; - case BSIM3v32_MOD_LDROUT: - mod->BSIM3v32ldrout = value->rValue; - mod->BSIM3v32ldroutGiven = TRUE; - break; - case BSIM3v32_MOD_LDSUB: - mod->BSIM3v32ldsub = value->rValue; - mod->BSIM3v32ldsubGiven = TRUE; - break; - case BSIM3v32_MOD_LVTH0: - mod->BSIM3v32lvth0 = value->rValue; - mod->BSIM3v32lvth0Given = TRUE; - break; - case BSIM3v32_MOD_LUA: - mod->BSIM3v32lua = value->rValue; - mod->BSIM3v32luaGiven = TRUE; - break; - case BSIM3v32_MOD_LUA1: - mod->BSIM3v32lua1 = value->rValue; - mod->BSIM3v32lua1Given = TRUE; - break; - case BSIM3v32_MOD_LUB: - mod->BSIM3v32lub = value->rValue; - mod->BSIM3v32lubGiven = TRUE; - break; - case BSIM3v32_MOD_LUB1: - mod->BSIM3v32lub1 = value->rValue; - mod->BSIM3v32lub1Given = TRUE; - break; - case BSIM3v32_MOD_LUC: - mod->BSIM3v32luc = value->rValue; - mod->BSIM3v32lucGiven = TRUE; - break; - case BSIM3v32_MOD_LUC1: - mod->BSIM3v32luc1 = value->rValue; - mod->BSIM3v32luc1Given = TRUE; - break; - case BSIM3v32_MOD_LU0 : - mod->BSIM3v32lu0 = value->rValue; - mod->BSIM3v32lu0Given = TRUE; - break; - case BSIM3v32_MOD_LUTE : - mod->BSIM3v32lute = value->rValue; - mod->BSIM3v32luteGiven = TRUE; - break; - case BSIM3v32_MOD_LVOFF: - mod->BSIM3v32lvoff = value->rValue; - mod->BSIM3v32lvoffGiven = TRUE; - break; - case BSIM3v32_MOD_LDELTA : - mod->BSIM3v32ldelta = value->rValue; - mod->BSIM3v32ldeltaGiven = TRUE; - break; - case BSIM3v32_MOD_LRDSW: - mod->BSIM3v32lrdsw = value->rValue; - mod->BSIM3v32lrdswGiven = TRUE; - break; - case BSIM3v32_MOD_LPRWB: - mod->BSIM3v32lprwb = value->rValue; - mod->BSIM3v32lprwbGiven = TRUE; - break; - case BSIM3v32_MOD_LPRWG: - mod->BSIM3v32lprwg = value->rValue; - mod->BSIM3v32lprwgGiven = TRUE; - break; - case BSIM3v32_MOD_LPRT: - mod->BSIM3v32lprt = value->rValue; - mod->BSIM3v32lprtGiven = TRUE; - break; - case BSIM3v32_MOD_LETA0: - mod->BSIM3v32leta0 = value->rValue; - mod->BSIM3v32leta0Given = TRUE; - break; - case BSIM3v32_MOD_LETAB: - mod->BSIM3v32letab = value->rValue; - mod->BSIM3v32letabGiven = TRUE; - break; - case BSIM3v32_MOD_LPCLM: - mod->BSIM3v32lpclm = value->rValue; - mod->BSIM3v32lpclmGiven = TRUE; - break; - case BSIM3v32_MOD_LPDIBL1: - mod->BSIM3v32lpdibl1 = value->rValue; - mod->BSIM3v32lpdibl1Given = TRUE; - break; - case BSIM3v32_MOD_LPDIBL2: - mod->BSIM3v32lpdibl2 = value->rValue; - mod->BSIM3v32lpdibl2Given = TRUE; - break; - case BSIM3v32_MOD_LPDIBLB: - mod->BSIM3v32lpdiblb = value->rValue; - mod->BSIM3v32lpdiblbGiven = TRUE; - break; - case BSIM3v32_MOD_LPSCBE1: - mod->BSIM3v32lpscbe1 = value->rValue; - mod->BSIM3v32lpscbe1Given = TRUE; - break; - case BSIM3v32_MOD_LPSCBE2: - mod->BSIM3v32lpscbe2 = value->rValue; - mod->BSIM3v32lpscbe2Given = TRUE; - break; - case BSIM3v32_MOD_LPVAG: - mod->BSIM3v32lpvag = value->rValue; - mod->BSIM3v32lpvagGiven = TRUE; - break; - case BSIM3v32_MOD_LWR : - mod->BSIM3v32lwr = value->rValue; - mod->BSIM3v32lwrGiven = TRUE; - break; - case BSIM3v32_MOD_LDWG : - mod->BSIM3v32ldwg = value->rValue; - mod->BSIM3v32ldwgGiven = TRUE; - break; - case BSIM3v32_MOD_LDWB : - mod->BSIM3v32ldwb = value->rValue; - mod->BSIM3v32ldwbGiven = TRUE; - break; - case BSIM3v32_MOD_LB0 : - mod->BSIM3v32lb0 = value->rValue; - mod->BSIM3v32lb0Given = TRUE; - break; - case BSIM3v32_MOD_LB1 : - mod->BSIM3v32lb1 = value->rValue; - mod->BSIM3v32lb1Given = TRUE; - break; - case BSIM3v32_MOD_LALPHA0 : - mod->BSIM3v32lalpha0 = value->rValue; - mod->BSIM3v32lalpha0Given = TRUE; - break; - case BSIM3v32_MOD_LALPHA1 : - mod->BSIM3v32lalpha1 = value->rValue; - mod->BSIM3v32lalpha1Given = TRUE; - break; - case BSIM3v32_MOD_LBETA0 : - mod->BSIM3v32lbeta0 = value->rValue; - mod->BSIM3v32lbeta0Given = TRUE; - break; - case BSIM3v32_MOD_LVFB : - mod->BSIM3v32lvfb = value->rValue; - mod->BSIM3v32lvfbGiven = TRUE; - break; - - case BSIM3v32_MOD_LELM : - mod->BSIM3v32lelm = value->rValue; - mod->BSIM3v32lelmGiven = TRUE; - break; - case BSIM3v32_MOD_LCGSL : - mod->BSIM3v32lcgsl = value->rValue; - mod->BSIM3v32lcgslGiven = TRUE; - break; - case BSIM3v32_MOD_LCGDL : - mod->BSIM3v32lcgdl = value->rValue; - mod->BSIM3v32lcgdlGiven = TRUE; - break; - case BSIM3v32_MOD_LCKAPPA : - mod->BSIM3v32lckappa = value->rValue; - mod->BSIM3v32lckappaGiven = TRUE; - break; - case BSIM3v32_MOD_LCF : - mod->BSIM3v32lcf = value->rValue; - mod->BSIM3v32lcfGiven = TRUE; - break; - case BSIM3v32_MOD_LCLC : - mod->BSIM3v32lclc = value->rValue; - mod->BSIM3v32lclcGiven = TRUE; - break; - case BSIM3v32_MOD_LCLE : - mod->BSIM3v32lcle = value->rValue; - mod->BSIM3v32lcleGiven = TRUE; - break; - case BSIM3v32_MOD_LVFBCV : - mod->BSIM3v32lvfbcv = value->rValue; - mod->BSIM3v32lvfbcvGiven = TRUE; - break; - case BSIM3v32_MOD_LACDE : - mod->BSIM3v32lacde = value->rValue; - mod->BSIM3v32lacdeGiven = TRUE; - break; - case BSIM3v32_MOD_LMOIN : - mod->BSIM3v32lmoin = value->rValue; - mod->BSIM3v32lmoinGiven = TRUE; - break; - case BSIM3v32_MOD_LNOFF : - mod->BSIM3v32lnoff = value->rValue; - mod->BSIM3v32lnoffGiven = TRUE; - break; - case BSIM3v32_MOD_LVOFFCV : - mod->BSIM3v32lvoffcv = value->rValue; - mod->BSIM3v32lvoffcvGiven = TRUE; - break; - - /* Width dependence */ - case BSIM3v32_MOD_WCDSC : - mod->BSIM3v32wcdsc = value->rValue; - mod->BSIM3v32wcdscGiven = TRUE; - break; - - - case BSIM3v32_MOD_WCDSCB : - mod->BSIM3v32wcdscb = value->rValue; - mod->BSIM3v32wcdscbGiven = TRUE; - break; - case BSIM3v32_MOD_WCDSCD : - mod->BSIM3v32wcdscd = value->rValue; - mod->BSIM3v32wcdscdGiven = TRUE; - break; - case BSIM3v32_MOD_WCIT : - mod->BSIM3v32wcit = value->rValue; - mod->BSIM3v32wcitGiven = TRUE; - break; - case BSIM3v32_MOD_WNFACTOR : - mod->BSIM3v32wnfactor = value->rValue; - mod->BSIM3v32wnfactorGiven = TRUE; - break; - case BSIM3v32_MOD_WXJ: - mod->BSIM3v32wxj = value->rValue; - mod->BSIM3v32wxjGiven = TRUE; - break; - case BSIM3v32_MOD_WVSAT: - mod->BSIM3v32wvsat = value->rValue; - mod->BSIM3v32wvsatGiven = TRUE; - break; - - - case BSIM3v32_MOD_WA0: - mod->BSIM3v32wa0 = value->rValue; - mod->BSIM3v32wa0Given = TRUE; - break; - case BSIM3v32_MOD_WAGS: - mod->BSIM3v32wags = value->rValue; - mod->BSIM3v32wagsGiven = TRUE; - break; - case BSIM3v32_MOD_WA1: - mod->BSIM3v32wa1 = value->rValue; - mod->BSIM3v32wa1Given = TRUE; - break; - case BSIM3v32_MOD_WA2: - mod->BSIM3v32wa2 = value->rValue; - mod->BSIM3v32wa2Given = TRUE; - break; - case BSIM3v32_MOD_WAT: - mod->BSIM3v32wat = value->rValue; - mod->BSIM3v32watGiven = TRUE; - break; - case BSIM3v32_MOD_WKETA: - mod->BSIM3v32wketa = value->rValue; - mod->BSIM3v32wketaGiven = TRUE; - break; - case BSIM3v32_MOD_WNSUB: - mod->BSIM3v32wnsub = value->rValue; - mod->BSIM3v32wnsubGiven = TRUE; - break; - case BSIM3v32_MOD_WNPEAK: - mod->BSIM3v32wnpeak = value->rValue; - mod->BSIM3v32wnpeakGiven = TRUE; - if (mod->BSIM3v32wnpeak > 1.0e20) - mod->BSIM3v32wnpeak *= 1.0e-6; - break; - case BSIM3v32_MOD_WNGATE: - mod->BSIM3v32wngate = value->rValue; - mod->BSIM3v32wngateGiven = TRUE; - if (mod->BSIM3v32wngate > 1.0e23) - mod->BSIM3v32wngate *= 1.0e-6; - break; - case BSIM3v32_MOD_WGAMMA1: - mod->BSIM3v32wgamma1 = value->rValue; - mod->BSIM3v32wgamma1Given = TRUE; - break; - case BSIM3v32_MOD_WGAMMA2: - mod->BSIM3v32wgamma2 = value->rValue; - mod->BSIM3v32wgamma2Given = TRUE; - break; - case BSIM3v32_MOD_WVBX: - mod->BSIM3v32wvbx = value->rValue; - mod->BSIM3v32wvbxGiven = TRUE; - break; - case BSIM3v32_MOD_WVBM: - mod->BSIM3v32wvbm = value->rValue; - mod->BSIM3v32wvbmGiven = TRUE; - break; - case BSIM3v32_MOD_WXT: - mod->BSIM3v32wxt = value->rValue; - mod->BSIM3v32wxtGiven = TRUE; - break; - case BSIM3v32_MOD_WK1: - mod->BSIM3v32wk1 = value->rValue; - mod->BSIM3v32wk1Given = TRUE; - break; - case BSIM3v32_MOD_WKT1: - mod->BSIM3v32wkt1 = value->rValue; - mod->BSIM3v32wkt1Given = TRUE; - break; - case BSIM3v32_MOD_WKT1L: - mod->BSIM3v32wkt1l = value->rValue; - mod->BSIM3v32wkt1lGiven = TRUE; - break; - case BSIM3v32_MOD_WKT2: - mod->BSIM3v32wkt2 = value->rValue; - mod->BSIM3v32wkt2Given = TRUE; - break; - case BSIM3v32_MOD_WK2: - mod->BSIM3v32wk2 = value->rValue; - mod->BSIM3v32wk2Given = TRUE; - break; - case BSIM3v32_MOD_WK3: - mod->BSIM3v32wk3 = value->rValue; - mod->BSIM3v32wk3Given = TRUE; - break; - case BSIM3v32_MOD_WK3B: - mod->BSIM3v32wk3b = value->rValue; - mod->BSIM3v32wk3bGiven = TRUE; - break; - case BSIM3v32_MOD_WNLX: - mod->BSIM3v32wnlx = value->rValue; - mod->BSIM3v32wnlxGiven = TRUE; - break; - case BSIM3v32_MOD_WW0: - mod->BSIM3v32ww0 = value->rValue; - mod->BSIM3v32ww0Given = TRUE; - break; - case BSIM3v32_MOD_WDVT0: - mod->BSIM3v32wdvt0 = value->rValue; - mod->BSIM3v32wdvt0Given = TRUE; - break; - case BSIM3v32_MOD_WDVT1: - mod->BSIM3v32wdvt1 = value->rValue; - mod->BSIM3v32wdvt1Given = TRUE; - break; - case BSIM3v32_MOD_WDVT2: - mod->BSIM3v32wdvt2 = value->rValue; - mod->BSIM3v32wdvt2Given = TRUE; - break; - case BSIM3v32_MOD_WDVT0W: - mod->BSIM3v32wdvt0w = value->rValue; - mod->BSIM3v32wdvt0wGiven = TRUE; - break; - case BSIM3v32_MOD_WDVT1W: - mod->BSIM3v32wdvt1w = value->rValue; - mod->BSIM3v32wdvt1wGiven = TRUE; - break; - case BSIM3v32_MOD_WDVT2W: - mod->BSIM3v32wdvt2w = value->rValue; - mod->BSIM3v32wdvt2wGiven = TRUE; - break; - case BSIM3v32_MOD_WDROUT: - mod->BSIM3v32wdrout = value->rValue; - mod->BSIM3v32wdroutGiven = TRUE; - break; - case BSIM3v32_MOD_WDSUB: - mod->BSIM3v32wdsub = value->rValue; - mod->BSIM3v32wdsubGiven = TRUE; - break; - case BSIM3v32_MOD_WVTH0: - mod->BSIM3v32wvth0 = value->rValue; - mod->BSIM3v32wvth0Given = TRUE; - break; - case BSIM3v32_MOD_WUA: - mod->BSIM3v32wua = value->rValue; - mod->BSIM3v32wuaGiven = TRUE; - break; - case BSIM3v32_MOD_WUA1: - mod->BSIM3v32wua1 = value->rValue; - mod->BSIM3v32wua1Given = TRUE; - break; - case BSIM3v32_MOD_WUB: - mod->BSIM3v32wub = value->rValue; - mod->BSIM3v32wubGiven = TRUE; - break; - case BSIM3v32_MOD_WUB1: - mod->BSIM3v32wub1 = value->rValue; - mod->BSIM3v32wub1Given = TRUE; - break; - case BSIM3v32_MOD_WUC: - mod->BSIM3v32wuc = value->rValue; - mod->BSIM3v32wucGiven = TRUE; - break; - case BSIM3v32_MOD_WUC1: - mod->BSIM3v32wuc1 = value->rValue; - mod->BSIM3v32wuc1Given = TRUE; - break; - case BSIM3v32_MOD_WU0 : - mod->BSIM3v32wu0 = value->rValue; - mod->BSIM3v32wu0Given = TRUE; - break; - case BSIM3v32_MOD_WUTE : - mod->BSIM3v32wute = value->rValue; - mod->BSIM3v32wuteGiven = TRUE; - break; - case BSIM3v32_MOD_WVOFF: - mod->BSIM3v32wvoff = value->rValue; - mod->BSIM3v32wvoffGiven = TRUE; - break; - case BSIM3v32_MOD_WDELTA : - mod->BSIM3v32wdelta = value->rValue; - mod->BSIM3v32wdeltaGiven = TRUE; - break; - case BSIM3v32_MOD_WRDSW: - mod->BSIM3v32wrdsw = value->rValue; - mod->BSIM3v32wrdswGiven = TRUE; - break; - case BSIM3v32_MOD_WPRWB: - mod->BSIM3v32wprwb = value->rValue; - mod->BSIM3v32wprwbGiven = TRUE; - break; - case BSIM3v32_MOD_WPRWG: - mod->BSIM3v32wprwg = value->rValue; - mod->BSIM3v32wprwgGiven = TRUE; - break; - case BSIM3v32_MOD_WPRT: - mod->BSIM3v32wprt = value->rValue; - mod->BSIM3v32wprtGiven = TRUE; - break; - case BSIM3v32_MOD_WETA0: - mod->BSIM3v32weta0 = value->rValue; - mod->BSIM3v32weta0Given = TRUE; - break; - case BSIM3v32_MOD_WETAB: - mod->BSIM3v32wetab = value->rValue; - mod->BSIM3v32wetabGiven = TRUE; - break; - case BSIM3v32_MOD_WPCLM: - mod->BSIM3v32wpclm = value->rValue; - mod->BSIM3v32wpclmGiven = TRUE; - break; - case BSIM3v32_MOD_WPDIBL1: - mod->BSIM3v32wpdibl1 = value->rValue; - mod->BSIM3v32wpdibl1Given = TRUE; - break; - case BSIM3v32_MOD_WPDIBL2: - mod->BSIM3v32wpdibl2 = value->rValue; - mod->BSIM3v32wpdibl2Given = TRUE; - break; - case BSIM3v32_MOD_WPDIBLB: - mod->BSIM3v32wpdiblb = value->rValue; - mod->BSIM3v32wpdiblbGiven = TRUE; - break; - case BSIM3v32_MOD_WPSCBE1: - mod->BSIM3v32wpscbe1 = value->rValue; - mod->BSIM3v32wpscbe1Given = TRUE; - break; - case BSIM3v32_MOD_WPSCBE2: - mod->BSIM3v32wpscbe2 = value->rValue; - mod->BSIM3v32wpscbe2Given = TRUE; - break; - case BSIM3v32_MOD_WPVAG: - mod->BSIM3v32wpvag = value->rValue; - mod->BSIM3v32wpvagGiven = TRUE; - break; - case BSIM3v32_MOD_WWR : - mod->BSIM3v32wwr = value->rValue; - mod->BSIM3v32wwrGiven = TRUE; - break; - case BSIM3v32_MOD_WDWG : - mod->BSIM3v32wdwg = value->rValue; - mod->BSIM3v32wdwgGiven = TRUE; - break; - case BSIM3v32_MOD_WDWB : - mod->BSIM3v32wdwb = value->rValue; - mod->BSIM3v32wdwbGiven = TRUE; - break; - case BSIM3v32_MOD_WB0 : - mod->BSIM3v32wb0 = value->rValue; - mod->BSIM3v32wb0Given = TRUE; - break; - case BSIM3v32_MOD_WB1 : - mod->BSIM3v32wb1 = value->rValue; - mod->BSIM3v32wb1Given = TRUE; - break; - case BSIM3v32_MOD_WALPHA0 : - mod->BSIM3v32walpha0 = value->rValue; - mod->BSIM3v32walpha0Given = TRUE; - break; - case BSIM3v32_MOD_WALPHA1 : - mod->BSIM3v32walpha1 = value->rValue; - mod->BSIM3v32walpha1Given = TRUE; - break; - case BSIM3v32_MOD_WBETA0 : - mod->BSIM3v32wbeta0 = value->rValue; - mod->BSIM3v32wbeta0Given = TRUE; - break; - case BSIM3v32_MOD_WVFB : - mod->BSIM3v32wvfb = value->rValue; - mod->BSIM3v32wvfbGiven = TRUE; - break; - - case BSIM3v32_MOD_WELM : - mod->BSIM3v32welm = value->rValue; - mod->BSIM3v32welmGiven = TRUE; - break; - case BSIM3v32_MOD_WCGSL : - mod->BSIM3v32wcgsl = value->rValue; - mod->BSIM3v32wcgslGiven = TRUE; - break; - case BSIM3v32_MOD_WCGDL : - mod->BSIM3v32wcgdl = value->rValue; - mod->BSIM3v32wcgdlGiven = TRUE; - break; - case BSIM3v32_MOD_WCKAPPA : - mod->BSIM3v32wckappa = value->rValue; - mod->BSIM3v32wckappaGiven = TRUE; - break; - case BSIM3v32_MOD_WCF : - mod->BSIM3v32wcf = value->rValue; - mod->BSIM3v32wcfGiven = TRUE; - break; - case BSIM3v32_MOD_WCLC : - mod->BSIM3v32wclc = value->rValue; - mod->BSIM3v32wclcGiven = TRUE; - break; - case BSIM3v32_MOD_WCLE : - mod->BSIM3v32wcle = value->rValue; - mod->BSIM3v32wcleGiven = TRUE; - break; - case BSIM3v32_MOD_WVFBCV : - mod->BSIM3v32wvfbcv = value->rValue; - mod->BSIM3v32wvfbcvGiven = TRUE; - break; - case BSIM3v32_MOD_WACDE : - mod->BSIM3v32wacde = value->rValue; - mod->BSIM3v32wacdeGiven = TRUE; - break; - case BSIM3v32_MOD_WMOIN : - mod->BSIM3v32wmoin = value->rValue; - mod->BSIM3v32wmoinGiven = TRUE; - break; - case BSIM3v32_MOD_WNOFF : - mod->BSIM3v32wnoff = value->rValue; - mod->BSIM3v32wnoffGiven = TRUE; - break; - case BSIM3v32_MOD_WVOFFCV : - mod->BSIM3v32wvoffcv = value->rValue; - mod->BSIM3v32wvoffcvGiven = TRUE; - break; - - /* Cross-term dependence */ - case BSIM3v32_MOD_PCDSC : - mod->BSIM3v32pcdsc = value->rValue; - mod->BSIM3v32pcdscGiven = TRUE; - break; - - - case BSIM3v32_MOD_PCDSCB : - mod->BSIM3v32pcdscb = value->rValue; - mod->BSIM3v32pcdscbGiven = TRUE; - break; - case BSIM3v32_MOD_PCDSCD : - mod->BSIM3v32pcdscd = value->rValue; - mod->BSIM3v32pcdscdGiven = TRUE; - break; - case BSIM3v32_MOD_PCIT : - mod->BSIM3v32pcit = value->rValue; - mod->BSIM3v32pcitGiven = TRUE; - break; - case BSIM3v32_MOD_PNFACTOR : - mod->BSIM3v32pnfactor = value->rValue; - mod->BSIM3v32pnfactorGiven = TRUE; - break; - case BSIM3v32_MOD_PXJ: - mod->BSIM3v32pxj = value->rValue; - mod->BSIM3v32pxjGiven = TRUE; - break; - case BSIM3v32_MOD_PVSAT: - mod->BSIM3v32pvsat = value->rValue; - mod->BSIM3v32pvsatGiven = TRUE; - break; - - - case BSIM3v32_MOD_PA0: - mod->BSIM3v32pa0 = value->rValue; - mod->BSIM3v32pa0Given = TRUE; - break; - case BSIM3v32_MOD_PAGS: - mod->BSIM3v32pags = value->rValue; - mod->BSIM3v32pagsGiven = TRUE; - break; - case BSIM3v32_MOD_PA1: - mod->BSIM3v32pa1 = value->rValue; - mod->BSIM3v32pa1Given = TRUE; - break; - case BSIM3v32_MOD_PA2: - mod->BSIM3v32pa2 = value->rValue; - mod->BSIM3v32pa2Given = TRUE; - break; - case BSIM3v32_MOD_PAT: - mod->BSIM3v32pat = value->rValue; - mod->BSIM3v32patGiven = TRUE; - break; - case BSIM3v32_MOD_PKETA: - mod->BSIM3v32pketa = value->rValue; - mod->BSIM3v32pketaGiven = TRUE; - break; - case BSIM3v32_MOD_PNSUB: - mod->BSIM3v32pnsub = value->rValue; - mod->BSIM3v32pnsubGiven = TRUE; - break; - case BSIM3v32_MOD_PNPEAK: - mod->BSIM3v32pnpeak = value->rValue; - mod->BSIM3v32pnpeakGiven = TRUE; - if (mod->BSIM3v32pnpeak > 1.0e20) - mod->BSIM3v32pnpeak *= 1.0e-6; - break; - case BSIM3v32_MOD_PNGATE: - mod->BSIM3v32pngate = value->rValue; - mod->BSIM3v32pngateGiven = TRUE; - if (mod->BSIM3v32pngate > 1.0e23) - mod->BSIM3v32pngate *= 1.0e-6; - break; - case BSIM3v32_MOD_PGAMMA1: - mod->BSIM3v32pgamma1 = value->rValue; - mod->BSIM3v32pgamma1Given = TRUE; - break; - case BSIM3v32_MOD_PGAMMA2: - mod->BSIM3v32pgamma2 = value->rValue; - mod->BSIM3v32pgamma2Given = TRUE; - break; - case BSIM3v32_MOD_PVBX: - mod->BSIM3v32pvbx = value->rValue; - mod->BSIM3v32pvbxGiven = TRUE; - break; - case BSIM3v32_MOD_PVBM: - mod->BSIM3v32pvbm = value->rValue; - mod->BSIM3v32pvbmGiven = TRUE; - break; - case BSIM3v32_MOD_PXT: - mod->BSIM3v32pxt = value->rValue; - mod->BSIM3v32pxtGiven = TRUE; - break; - case BSIM3v32_MOD_PK1: - mod->BSIM3v32pk1 = value->rValue; - mod->BSIM3v32pk1Given = TRUE; - break; - case BSIM3v32_MOD_PKT1: - mod->BSIM3v32pkt1 = value->rValue; - mod->BSIM3v32pkt1Given = TRUE; - break; - case BSIM3v32_MOD_PKT1L: - mod->BSIM3v32pkt1l = value->rValue; - mod->BSIM3v32pkt1lGiven = TRUE; - break; - case BSIM3v32_MOD_PKT2: - mod->BSIM3v32pkt2 = value->rValue; - mod->BSIM3v32pkt2Given = TRUE; - break; - case BSIM3v32_MOD_PK2: - mod->BSIM3v32pk2 = value->rValue; - mod->BSIM3v32pk2Given = TRUE; - break; - case BSIM3v32_MOD_PK3: - mod->BSIM3v32pk3 = value->rValue; - mod->BSIM3v32pk3Given = TRUE; - break; - case BSIM3v32_MOD_PK3B: - mod->BSIM3v32pk3b = value->rValue; - mod->BSIM3v32pk3bGiven = TRUE; - break; - case BSIM3v32_MOD_PNLX: - mod->BSIM3v32pnlx = value->rValue; - mod->BSIM3v32pnlxGiven = TRUE; - break; - case BSIM3v32_MOD_PW0: - mod->BSIM3v32pw0 = value->rValue; - mod->BSIM3v32pw0Given = TRUE; - break; - case BSIM3v32_MOD_PDVT0: - mod->BSIM3v32pdvt0 = value->rValue; - mod->BSIM3v32pdvt0Given = TRUE; - break; - case BSIM3v32_MOD_PDVT1: - mod->BSIM3v32pdvt1 = value->rValue; - mod->BSIM3v32pdvt1Given = TRUE; - break; - case BSIM3v32_MOD_PDVT2: - mod->BSIM3v32pdvt2 = value->rValue; - mod->BSIM3v32pdvt2Given = TRUE; - break; - case BSIM3v32_MOD_PDVT0W: - mod->BSIM3v32pdvt0w = value->rValue; - mod->BSIM3v32pdvt0wGiven = TRUE; - break; - case BSIM3v32_MOD_PDVT1W: - mod->BSIM3v32pdvt1w = value->rValue; - mod->BSIM3v32pdvt1wGiven = TRUE; - break; - case BSIM3v32_MOD_PDVT2W: - mod->BSIM3v32pdvt2w = value->rValue; - mod->BSIM3v32pdvt2wGiven = TRUE; - break; - case BSIM3v32_MOD_PDROUT: - mod->BSIM3v32pdrout = value->rValue; - mod->BSIM3v32pdroutGiven = TRUE; - break; - case BSIM3v32_MOD_PDSUB: - mod->BSIM3v32pdsub = value->rValue; - mod->BSIM3v32pdsubGiven = TRUE; - break; - case BSIM3v32_MOD_PVTH0: - mod->BSIM3v32pvth0 = value->rValue; - mod->BSIM3v32pvth0Given = TRUE; - break; - case BSIM3v32_MOD_PUA: - mod->BSIM3v32pua = value->rValue; - mod->BSIM3v32puaGiven = TRUE; - break; - case BSIM3v32_MOD_PUA1: - mod->BSIM3v32pua1 = value->rValue; - mod->BSIM3v32pua1Given = TRUE; - break; - case BSIM3v32_MOD_PUB: - mod->BSIM3v32pub = value->rValue; - mod->BSIM3v32pubGiven = TRUE; - break; - case BSIM3v32_MOD_PUB1: - mod->BSIM3v32pub1 = value->rValue; - mod->BSIM3v32pub1Given = TRUE; - break; - case BSIM3v32_MOD_PUC: - mod->BSIM3v32puc = value->rValue; - mod->BSIM3v32pucGiven = TRUE; - break; - case BSIM3v32_MOD_PUC1: - mod->BSIM3v32puc1 = value->rValue; - mod->BSIM3v32puc1Given = TRUE; - break; - case BSIM3v32_MOD_PU0 : - mod->BSIM3v32pu0 = value->rValue; - mod->BSIM3v32pu0Given = TRUE; - break; - case BSIM3v32_MOD_PUTE : - mod->BSIM3v32pute = value->rValue; - mod->BSIM3v32puteGiven = TRUE; - break; - case BSIM3v32_MOD_PVOFF: - mod->BSIM3v32pvoff = value->rValue; - mod->BSIM3v32pvoffGiven = TRUE; - break; - case BSIM3v32_MOD_PDELTA : - mod->BSIM3v32pdelta = value->rValue; - mod->BSIM3v32pdeltaGiven = TRUE; - break; - case BSIM3v32_MOD_PRDSW: - mod->BSIM3v32prdsw = value->rValue; - mod->BSIM3v32prdswGiven = TRUE; - break; - case BSIM3v32_MOD_PPRWB: - mod->BSIM3v32pprwb = value->rValue; - mod->BSIM3v32pprwbGiven = TRUE; - break; - case BSIM3v32_MOD_PPRWG: - mod->BSIM3v32pprwg = value->rValue; - mod->BSIM3v32pprwgGiven = TRUE; - break; - case BSIM3v32_MOD_PPRT: - mod->BSIM3v32pprt = value->rValue; - mod->BSIM3v32pprtGiven = TRUE; - break; - case BSIM3v32_MOD_PETA0: - mod->BSIM3v32peta0 = value->rValue; - mod->BSIM3v32peta0Given = TRUE; - break; - case BSIM3v32_MOD_PETAB: - mod->BSIM3v32petab = value->rValue; - mod->BSIM3v32petabGiven = TRUE; - break; - case BSIM3v32_MOD_PPCLM: - mod->BSIM3v32ppclm = value->rValue; - mod->BSIM3v32ppclmGiven = TRUE; - break; - case BSIM3v32_MOD_PPDIBL1: - mod->BSIM3v32ppdibl1 = value->rValue; - mod->BSIM3v32ppdibl1Given = TRUE; - break; - case BSIM3v32_MOD_PPDIBL2: - mod->BSIM3v32ppdibl2 = value->rValue; - mod->BSIM3v32ppdibl2Given = TRUE; - break; - case BSIM3v32_MOD_PPDIBLB: - mod->BSIM3v32ppdiblb = value->rValue; - mod->BSIM3v32ppdiblbGiven = TRUE; - break; - case BSIM3v32_MOD_PPSCBE1: - mod->BSIM3v32ppscbe1 = value->rValue; - mod->BSIM3v32ppscbe1Given = TRUE; - break; - case BSIM3v32_MOD_PPSCBE2: - mod->BSIM3v32ppscbe2 = value->rValue; - mod->BSIM3v32ppscbe2Given = TRUE; - break; - case BSIM3v32_MOD_PPVAG: - mod->BSIM3v32ppvag = value->rValue; - mod->BSIM3v32ppvagGiven = TRUE; - break; - case BSIM3v32_MOD_PWR : - mod->BSIM3v32pwr = value->rValue; - mod->BSIM3v32pwrGiven = TRUE; - break; - case BSIM3v32_MOD_PDWG : - mod->BSIM3v32pdwg = value->rValue; - mod->BSIM3v32pdwgGiven = TRUE; - break; - case BSIM3v32_MOD_PDWB : - mod->BSIM3v32pdwb = value->rValue; - mod->BSIM3v32pdwbGiven = TRUE; - break; - case BSIM3v32_MOD_PB0 : - mod->BSIM3v32pb0 = value->rValue; - mod->BSIM3v32pb0Given = TRUE; - break; - case BSIM3v32_MOD_PB1 : - mod->BSIM3v32pb1 = value->rValue; - mod->BSIM3v32pb1Given = TRUE; - break; - case BSIM3v32_MOD_PALPHA0 : - mod->BSIM3v32palpha0 = value->rValue; - mod->BSIM3v32palpha0Given = TRUE; - break; - case BSIM3v32_MOD_PALPHA1 : - mod->BSIM3v32palpha1 = value->rValue; - mod->BSIM3v32palpha1Given = TRUE; - break; - case BSIM3v32_MOD_PBETA0 : - mod->BSIM3v32pbeta0 = value->rValue; - mod->BSIM3v32pbeta0Given = TRUE; - break; - case BSIM3v32_MOD_PVFB : - mod->BSIM3v32pvfb = value->rValue; - mod->BSIM3v32pvfbGiven = TRUE; - break; - - case BSIM3v32_MOD_PELM : - mod->BSIM3v32pelm = value->rValue; - mod->BSIM3v32pelmGiven = TRUE; - break; - case BSIM3v32_MOD_PCGSL : - mod->BSIM3v32pcgsl = value->rValue; - mod->BSIM3v32pcgslGiven = TRUE; - break; - case BSIM3v32_MOD_PCGDL : - mod->BSIM3v32pcgdl = value->rValue; - mod->BSIM3v32pcgdlGiven = TRUE; - break; - case BSIM3v32_MOD_PCKAPPA : - mod->BSIM3v32pckappa = value->rValue; - mod->BSIM3v32pckappaGiven = TRUE; - break; - case BSIM3v32_MOD_PCF : - mod->BSIM3v32pcf = value->rValue; - mod->BSIM3v32pcfGiven = TRUE; - break; - case BSIM3v32_MOD_PCLC : - mod->BSIM3v32pclc = value->rValue; - mod->BSIM3v32pclcGiven = TRUE; - break; - case BSIM3v32_MOD_PCLE : - mod->BSIM3v32pcle = value->rValue; - mod->BSIM3v32pcleGiven = TRUE; - break; - case BSIM3v32_MOD_PVFBCV : - mod->BSIM3v32pvfbcv = value->rValue; - mod->BSIM3v32pvfbcvGiven = TRUE; - break; - case BSIM3v32_MOD_PACDE : - mod->BSIM3v32pacde = value->rValue; - mod->BSIM3v32pacdeGiven = TRUE; - break; - case BSIM3v32_MOD_PMOIN : - mod->BSIM3v32pmoin = value->rValue; - mod->BSIM3v32pmoinGiven = TRUE; - break; - case BSIM3v32_MOD_PNOFF : - mod->BSIM3v32pnoff = value->rValue; - mod->BSIM3v32pnoffGiven = TRUE; - break; - case BSIM3v32_MOD_PVOFFCV : - mod->BSIM3v32pvoffcv = value->rValue; - mod->BSIM3v32pvoffcvGiven = TRUE; - break; - - case BSIM3v32_MOD_TNOM : - mod->BSIM3v32tnom = value->rValue + CONSTCtoK; - mod->BSIM3v32tnomGiven = TRUE; - break; - case BSIM3v32_MOD_CGSO : - mod->BSIM3v32cgso = value->rValue; - mod->BSIM3v32cgsoGiven = TRUE; - break; - case BSIM3v32_MOD_CGDO : - mod->BSIM3v32cgdo = value->rValue; - mod->BSIM3v32cgdoGiven = TRUE; - break; - case BSIM3v32_MOD_CGBO : - mod->BSIM3v32cgbo = value->rValue; - mod->BSIM3v32cgboGiven = TRUE; - break; - case BSIM3v32_MOD_XPART : - mod->BSIM3v32xpart = value->rValue; - mod->BSIM3v32xpartGiven = TRUE; - break; - case BSIM3v32_MOD_RSH : - mod->BSIM3v32sheetResistance = value->rValue; - mod->BSIM3v32sheetResistanceGiven = TRUE; - break; - case BSIM3v32_MOD_JS : - mod->BSIM3v32jctSatCurDensity = value->rValue; - mod->BSIM3v32jctSatCurDensityGiven = TRUE; - break; - case BSIM3v32_MOD_JSW : - mod->BSIM3v32jctSidewallSatCurDensity = value->rValue; - mod->BSIM3v32jctSidewallSatCurDensityGiven = TRUE; - break; - case BSIM3v32_MOD_PB : - mod->BSIM3v32bulkJctPotential = value->rValue; - mod->BSIM3v32bulkJctPotentialGiven = TRUE; - break; - case BSIM3v32_MOD_MJ : - mod->BSIM3v32bulkJctBotGradingCoeff = value->rValue; - mod->BSIM3v32bulkJctBotGradingCoeffGiven = TRUE; - break; - case BSIM3v32_MOD_PBSW : - mod->BSIM3v32sidewallJctPotential = value->rValue; - mod->BSIM3v32sidewallJctPotentialGiven = TRUE; - break; - case BSIM3v32_MOD_MJSW : - mod->BSIM3v32bulkJctSideGradingCoeff = value->rValue; - mod->BSIM3v32bulkJctSideGradingCoeffGiven = TRUE; - break; - case BSIM3v32_MOD_CJ : - mod->BSIM3v32unitAreaJctCap = value->rValue; - mod->BSIM3v32unitAreaJctCapGiven = TRUE; - break; - case BSIM3v32_MOD_CJSW : - mod->BSIM3v32unitLengthSidewallJctCap = value->rValue; - mod->BSIM3v32unitLengthSidewallJctCapGiven = TRUE; - break; - case BSIM3v32_MOD_NJ : - mod->BSIM3v32jctEmissionCoeff = value->rValue; - mod->BSIM3v32jctEmissionCoeffGiven = TRUE; - break; - case BSIM3v32_MOD_PBSWG : - mod->BSIM3v32GatesidewallJctPotential = value->rValue; - mod->BSIM3v32GatesidewallJctPotentialGiven = TRUE; - break; - case BSIM3v32_MOD_MJSWG : - mod->BSIM3v32bulkJctGateSideGradingCoeff = value->rValue; - mod->BSIM3v32bulkJctGateSideGradingCoeffGiven = TRUE; - break; - case BSIM3v32_MOD_CJSWG : - mod->BSIM3v32unitLengthGateSidewallJctCap = value->rValue; - mod->BSIM3v32unitLengthGateSidewallJctCapGiven = TRUE; - break; - case BSIM3v32_MOD_XTI : - mod->BSIM3v32jctTempExponent = value->rValue; - mod->BSIM3v32jctTempExponentGiven = TRUE; - break; - case BSIM3v32_MOD_LINT : - mod->BSIM3v32Lint = value->rValue; - mod->BSIM3v32LintGiven = TRUE; - break; - case BSIM3v32_MOD_LL : - mod->BSIM3v32Ll = value->rValue; - mod->BSIM3v32LlGiven = TRUE; - break; - case BSIM3v32_MOD_LLC : - mod->BSIM3v32Llc = value->rValue; - mod->BSIM3v32LlcGiven = TRUE; - break; - case BSIM3v32_MOD_LLN : - mod->BSIM3v32Lln = value->rValue; - mod->BSIM3v32LlnGiven = TRUE; - break; - case BSIM3v32_MOD_LW : - mod->BSIM3v32Lw = value->rValue; - mod->BSIM3v32LwGiven = TRUE; - break; - case BSIM3v32_MOD_LWC : - mod->BSIM3v32Lwc = value->rValue; - mod->BSIM3v32LwcGiven = TRUE; - break; - case BSIM3v32_MOD_LWN : - mod->BSIM3v32Lwn = value->rValue; - mod->BSIM3v32LwnGiven = TRUE; - break; - case BSIM3v32_MOD_LWL : - mod->BSIM3v32Lwl = value->rValue; - mod->BSIM3v32LwlGiven = TRUE; - break; - case BSIM3v32_MOD_LWLC : - mod->BSIM3v32Lwlc = value->rValue; - mod->BSIM3v32LwlcGiven = TRUE; - break; - case BSIM3v32_MOD_LMIN : - mod->BSIM3v32Lmin = value->rValue; - mod->BSIM3v32LminGiven = TRUE; - break; - case BSIM3v32_MOD_LMAX : - mod->BSIM3v32Lmax = value->rValue; - mod->BSIM3v32LmaxGiven = TRUE; - break; - case BSIM3v32_MOD_WINT : - mod->BSIM3v32Wint = value->rValue; - mod->BSIM3v32WintGiven = TRUE; - break; - case BSIM3v32_MOD_WL : - mod->BSIM3v32Wl = value->rValue; - mod->BSIM3v32WlGiven = TRUE; - break; - case BSIM3v32_MOD_WLC : - mod->BSIM3v32Wlc = value->rValue; - mod->BSIM3v32WlcGiven = TRUE; - break; - case BSIM3v32_MOD_WLN : - mod->BSIM3v32Wln = value->rValue; - mod->BSIM3v32WlnGiven = TRUE; - break; - case BSIM3v32_MOD_WW : - mod->BSIM3v32Ww = value->rValue; - mod->BSIM3v32WwGiven = TRUE; - break; - case BSIM3v32_MOD_WWC : - mod->BSIM3v32Wwc = value->rValue; - mod->BSIM3v32WwcGiven = TRUE; - break; - case BSIM3v32_MOD_WWN : - mod->BSIM3v32Wwn = value->rValue; - mod->BSIM3v32WwnGiven = TRUE; - break; - case BSIM3v32_MOD_WWL : - mod->BSIM3v32Wwl = value->rValue; - mod->BSIM3v32WwlGiven = TRUE; - break; - case BSIM3v32_MOD_WWLC : - mod->BSIM3v32Wwlc = value->rValue; - mod->BSIM3v32WwlcGiven = TRUE; - break; - case BSIM3v32_MOD_WMIN : - mod->BSIM3v32Wmin = value->rValue; - mod->BSIM3v32WminGiven = TRUE; - break; - case BSIM3v32_MOD_WMAX : - mod->BSIM3v32Wmax = value->rValue; - mod->BSIM3v32WmaxGiven = TRUE; - break; - - case BSIM3v32_MOD_XL: - mod->BSIM3v32xl = value->rValue; - mod->BSIM3v32xlGiven = TRUE; - break; - case BSIM3v32_MOD_XW: - mod->BSIM3v32xw = value->rValue; - mod->BSIM3v32xwGiven = TRUE; - break; - - case BSIM3v32_MOD_NOIA : - mod->BSIM3v32oxideTrapDensityA = value->rValue; - mod->BSIM3v32oxideTrapDensityAGiven = TRUE; - break; - case BSIM3v32_MOD_NOIB : - mod->BSIM3v32oxideTrapDensityB = value->rValue; - mod->BSIM3v32oxideTrapDensityBGiven = TRUE; - break; - case BSIM3v32_MOD_NOIC : - mod->BSIM3v32oxideTrapDensityC = value->rValue; - mod->BSIM3v32oxideTrapDensityCGiven = TRUE; - break; - case BSIM3v32_MOD_EM : - mod->BSIM3v32em = value->rValue; - mod->BSIM3v32emGiven = TRUE; - break; - case BSIM3v32_MOD_EF : - mod->BSIM3v32ef = value->rValue; - mod->BSIM3v32efGiven = TRUE; - break; - case BSIM3v32_MOD_AF : - mod->BSIM3v32af = value->rValue; - mod->BSIM3v32afGiven = TRUE; - break; - case BSIM3v32_MOD_KF : - mod->BSIM3v32kf = value->rValue; - mod->BSIM3v32kfGiven = TRUE; - break; - - case BSIM3v32_MOD_VGS_MAX: - mod->BSIM3v32vgsMax = value->rValue; - mod->BSIM3v32vgsMaxGiven = TRUE; - break; - case BSIM3v32_MOD_VGD_MAX: - mod->BSIM3v32vgdMax = value->rValue; - mod->BSIM3v32vgdMaxGiven = TRUE; - break; - case BSIM3v32_MOD_VGB_MAX: - mod->BSIM3v32vgbMax = value->rValue; - mod->BSIM3v32vgbMaxGiven = TRUE; - break; - case BSIM3v32_MOD_VDS_MAX: - mod->BSIM3v32vdsMax = value->rValue; - mod->BSIM3v32vdsMaxGiven = TRUE; - break; - case BSIM3v32_MOD_VBS_MAX: - mod->BSIM3v32vbsMax = value->rValue; - mod->BSIM3v32vbsMaxGiven = TRUE; - break; - case BSIM3v32_MOD_VBD_MAX: - mod->BSIM3v32vbdMax = value->rValue; - mod->BSIM3v32vbdMaxGiven = TRUE; - break; - case BSIM3v32_MOD_VGSR_MAX: - mod->BSIM3v32vgsrMax = value->rValue; - mod->BSIM3v32vgsrMaxGiven = TRUE; - break; - case BSIM3v32_MOD_VGDR_MAX: - mod->BSIM3v32vgdrMax = value->rValue; - mod->BSIM3v32vgdrMaxGiven = TRUE; - break; - case BSIM3v32_MOD_VGBR_MAX: - mod->BSIM3v32vgbrMax = value->rValue; - mod->BSIM3v32vgbrMaxGiven = TRUE; - break; - case BSIM3v32_MOD_VBSR_MAX: - mod->BSIM3v32vbsrMax = value->rValue; - mod->BSIM3v32vbsrMaxGiven = TRUE; - break; - case BSIM3v32_MOD_VBDR_MAX: - mod->BSIM3v32vbdrMax = value->rValue; - mod->BSIM3v32vbdrMaxGiven = TRUE; - break; - - case BSIM3v32_MOD_NMOS : - if(value->iValue) { - mod->BSIM3v32type = 1; - mod->BSIM3v32typeGiven = TRUE; - } - break; - case BSIM3v32_MOD_PMOS : - if(value->iValue) { - mod->BSIM3v32type = - 1; - mod->BSIM3v32typeGiven = TRUE; - } - break; - default: - return(E_BADPARM); - } - return(OK); -} - - diff --git a/src/spicelib/devices/bsim3v32/b3v32noi.c b/src/spicelib/devices/bsim3v32/b3v32noi.c deleted file mode 100644 index dedcf957f..000000000 --- a/src/spicelib/devices/bsim3v32/b3v32noi.c +++ /dev/null @@ -1,463 +0,0 @@ -/**** BSIM3v3.2.4, Released by Xuemei Xi 12/21/2001 ****/ - -/********** - * Copyright 2001 Regents of the University of California. All rights reserved. - * File: b3noi.c of BSIM3v3.2.4 - * Author: 1995 Gary W. Ng and Min-Chie Jeng. - * Author: 1997-1999 Weidong Liu. - * Author: 2001 Xuemei Xi - * Modified by Xuemei Xi, 10/05, 12/21, 2001. - * Modified bt Paolo Nenzi 2002 and Dietmar Warning 2003 - **********/ - -#include "ngspice/ngspice.h" -#include "bsim3v32def.h" -#include "ngspice/cktdefs.h" -#include "ngspice/iferrmsg.h" -#include "ngspice/noisedef.h" -#include "ngspice/suffix.h" -#include "ngspice/const.h" /* jwan */ - -/* - * BSIM3v32noise (mode, operation, firstModel, ckt, data, OnDens) - * This routine names and evaluates all of the noise sources - * associated with MOSFET's. It starts with the model *firstModel and - * traverses all of its insts. It then proceeds to any other models - * on the linked list. The total output noise density generated by - * all of the MOSFET's is summed with the variable "OnDens". - */ - -/* - Channel thermal and flicker noises are calculated based on the value - of model->BSIM3v32noiMod. - If model->BSIM3v32noiMod = 1, - Channel thermal noise = SPICE2 model - Flicker noise = SPICE2 model - If model->BSIM3v32noiMod = 2, - Channel thermal noise = BSIM3v32 model - Flicker noise = BSIM3v32 model - If model->BSIM3v32noiMod = 3, - Channel thermal noise = SPICE2 model - Flicker noise = BSIM3v32 model - If model->BSIM3v32noiMod = 4, - Channel thermal noise = BSIM3v32 model - Flicker noise = SPICE2 model - */ - - -/* - * The StrongInversionNoiseEval function has been modified in - * the release 3.2.4 of BSIM3v32 model. To accomodate both the old - * and the new code, I have renamed according to the following: - * - * - * BSIM3v3.2.4 -> StrongInversionNoiseEvalNew - * Previous -> StrongInversionNoiseEvalOld - * - * 2002 Paolo Nenzi - */ - -/* - * JX: 1/f noise model is smoothed out 12/18/01. - */ - -static double -StrongInversionNoiseEvalNew(double Vds, BSIM3v32model *model, - BSIM3v32instance *here, double freq, double temp) -{ -struct bsim3v32SizeDependParam *pParam; -double cd, esat, DelClm, EffFreq, N0, Nl; -double T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, Ssi; - - pParam = here->pParam; - cd = fabs(here->BSIM3v32cd); - esat = 2.0 * pParam->BSIM3v32vsattemp / here->BSIM3v32ueff; - if(model->BSIM3v32em<=0.0) DelClm = 0.0; - else { - T0 = ((((Vds - here->BSIM3v32Vdseff) / pParam->BSIM3v32litl) - + model->BSIM3v32em) / esat); - DelClm = pParam->BSIM3v32litl * log (MAX(T0, N_MINLOG)); - } - EffFreq = pow(freq, model->BSIM3v32ef); - T1 = CHARGE * CHARGE * 8.62e-5 * cd * temp * here->BSIM3v32ueff; - T2 = 1.0e8 * EffFreq * here->BSIM3v32Abulk * model->BSIM3v32cox - * pParam->BSIM3v32leff * pParam->BSIM3v32leff; - N0 = model->BSIM3v32cox * here->BSIM3v32Vgsteff / CHARGE; - Nl = model->BSIM3v32cox * here->BSIM3v32Vgsteff - * (1.0 - here->BSIM3v32AbovVgst2Vtm * here->BSIM3v32Vdseff) / CHARGE; - - T3 = model->BSIM3v32oxideTrapDensityA - * log(MAX(((N0 + 2.0e14) / (Nl + 2.0e14)), N_MINLOG)); - T4 = model->BSIM3v32oxideTrapDensityB * (N0 - Nl); - T5 = model->BSIM3v32oxideTrapDensityC * 0.5 * (N0 * N0 - Nl * Nl); - - T6 = 8.62e-5 * temp * cd * cd; - T7 = 1.0e8 * EffFreq * pParam->BSIM3v32leff - * pParam->BSIM3v32leff * pParam->BSIM3v32weff; - T8 = model->BSIM3v32oxideTrapDensityA + model->BSIM3v32oxideTrapDensityB * Nl - + model->BSIM3v32oxideTrapDensityC * Nl * Nl; - T9 = (Nl + 2.0e14) * (Nl + 2.0e14); - - Ssi = T1 / T2 * (T3 + T4 + T5) + T6 / T7 * DelClm * T8 / T9; - return Ssi; -} - -/* - * The code for releases: BSIM3V32, BSIM3V322, BSIM3V323 - * follows - */ - -static double -StrongInversionNoiseEvalOld(double vgs, double vds, BSIM3v32model *model, - BSIM3v32instance *here, double freq, double temp) -{ - struct bsim3v32SizeDependParam *pParam; - double cd, esat, DelClm, EffFreq, N0, Nl, Vgst; - double T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, Ssi; - - pParam = here->pParam; - cd = fabs (here->BSIM3v32cd); - /* Added revision dependent code */ - if (model->BSIM3v32intVersion < BSIM3v32V323) - { - if (vds > here->BSIM3v32vdsat) - { - esat = 2.0 * pParam->BSIM3v32vsattemp / here->BSIM3v32ueff; - T0 = ((((vds - here->BSIM3v32vdsat) / pParam->BSIM3v32litl) + - model->BSIM3v32em) / esat); - DelClm = pParam->BSIM3v32litl * log (MAX (T0, N_MINLOG)); - } - else - DelClm = 0.0; - } - else - { - if (model->BSIM3v32em <= 0.0) /* flicker noise modified -JX */ - DelClm = 0.0; - else if (vds > here->BSIM3v32vdsat) - { - esat = 2.0 * pParam->BSIM3v32vsattemp / here->BSIM3v32ueff; - T0 = ((((vds - here->BSIM3v32vdsat) / pParam->BSIM3v32litl) + - model->BSIM3v32em) / esat); - DelClm = pParam->BSIM3v32litl * log (MAX (T0, N_MINLOG)); - } - else - DelClm = 0.0; - } - EffFreq = pow (freq, model->BSIM3v32ef); - T1 = CHARGE * CHARGE * 8.62e-5 * cd * temp * here->BSIM3v32ueff; - T2 = 1.0e8 * EffFreq * model->BSIM3v32cox - * pParam->BSIM3v32leff * pParam->BSIM3v32leff; - Vgst = vgs - here->BSIM3v32von; - N0 = model->BSIM3v32cox * Vgst / CHARGE; - if (N0 < 0.0) - N0 = 0.0; - Nl = model->BSIM3v32cox * (Vgst - MIN (vds, here->BSIM3v32vdsat)) / CHARGE; - if (Nl < 0.0) - Nl = 0.0; - - T3 = model->BSIM3v32oxideTrapDensityA - * log (MAX (((N0 + 2.0e14) / (Nl + 2.0e14)), N_MINLOG)); - T4 = model->BSIM3v32oxideTrapDensityB * (N0 - Nl); - T5 = model->BSIM3v32oxideTrapDensityC * 0.5 * (N0 * N0 - Nl * Nl); - - T6 = 8.62e-5 * temp * cd * cd; - T7 = 1.0e8 * EffFreq * pParam->BSIM3v32leff - * pParam->BSIM3v32leff * pParam->BSIM3v32weff; - T8 = model->BSIM3v32oxideTrapDensityA + model->BSIM3v32oxideTrapDensityB * Nl - + model->BSIM3v32oxideTrapDensityC * Nl * Nl; - T9 = (Nl + 2.0e14) * (Nl + 2.0e14); - - Ssi = T1 / T2 * (T3 + T4 + T5) + T6 / T7 * DelClm * T8 / T9; - return Ssi; -} - - - -int -BSIM3v32noise (int mode, int operation, GENmodel *inModel, CKTcircuit *ckt, - Ndata *data, double *OnDens) -{ -NOISEAN *job = (NOISEAN *) ckt->CKTcurJob; - -BSIM3v32model *model = (BSIM3v32model *)inModel; -BSIM3v32instance *here; -struct bsim3v32SizeDependParam *pParam; -double tempOnoise; -double tempInoise; -double noizDens[BSIM3v32NSRCS]; -double lnNdens[BSIM3v32NSRCS]; - -double vgs, vds, Slimit; -double T1, T10, T11; -double Ssi, Swi; - -double m; - -int i; - - /* define the names of the noise sources */ - static char *BSIM3v32nNames[BSIM3v32NSRCS] = - { /* Note that we have to keep the order */ - ".rd", /* noise due to rd */ - /* consistent with the index definitions */ - ".rs", /* noise due to rs */ - /* in BSIM3v32defs.h */ - ".id", /* noise due to id */ - ".1overf", /* flicker (1/f) noise */ - "" /* total transistor noise */ - }; - - for (; model != NULL; model = BSIM3v32nextModel(model)) - { for (here = BSIM3v32instances(model); here != NULL; - here = BSIM3v32nextInstance(here)) - { pParam = here->pParam; - switch (operation) - { case N_OPEN: - /* see if we have to to produce a summary report */ - /* if so, name all the noise generators */ - - if (job->NStpsSm != 0) - { switch (mode) - { case N_DENS: - for (i = 0; i < BSIM3v32NSRCS; i++) - { NOISE_ADD_OUTVAR(ckt, data, "onoise.%s%s", here->BSIM3v32name, BSIM3v32nNames[i]); - } - break; - case INT_NOIZ: - for (i = 0; i < BSIM3v32NSRCS; i++) - { NOISE_ADD_OUTVAR(ckt, data, "onoise_total.%s%s", here->BSIM3v32name, BSIM3v32nNames[i]); - NOISE_ADD_OUTVAR(ckt, data, "inoise_total.%s%s", here->BSIM3v32name, BSIM3v32nNames[i]); - } - break; - } - } - break; - case N_CALC: - m = here->BSIM3v32m; - switch (mode) - { case N_DENS: - NevalSrc(&noizDens[BSIM3v32RDNOIZ], - &lnNdens[BSIM3v32RDNOIZ], ckt, THERMNOISE, - here->BSIM3v32dNodePrime, here->BSIM3v32dNode, - here->BSIM3v32drainConductance * m); - - NevalSrc(&noizDens[BSIM3v32RSNOIZ], - &lnNdens[BSIM3v32RSNOIZ], ckt, THERMNOISE, - here->BSIM3v32sNodePrime, here->BSIM3v32sNode, - here->BSIM3v32sourceConductance * m); - - switch( model->BSIM3v32noiMod ) - { case 1: - case 3: - NevalSrc(&noizDens[BSIM3v32IDNOIZ], - &lnNdens[BSIM3v32IDNOIZ], ckt, - THERMNOISE, here->BSIM3v32dNodePrime, - here->BSIM3v32sNodePrime, - (2.0 / 3.0 * fabs(here->BSIM3v32gm - + here->BSIM3v32gds - + here->BSIM3v32gmbs)) * m); - break; - case 2: - case 4: - /* Added revision dependent code */ - if (model->BSIM3v32intVersion == BSIM3v32V324) - { - NevalSrc(&noizDens[BSIM3v32IDNOIZ], - &lnNdens[BSIM3v32IDNOIZ], ckt, - THERMNOISE, here->BSIM3v32dNodePrime, - here->BSIM3v32sNodePrime, - (m * here->BSIM3v32ueff - * fabs(here->BSIM3v32qinv) - / (pParam->BSIM3v32leff * pParam->BSIM3v32leff - + here->BSIM3v32ueff * fabs(here->BSIM3v32qinv) - * here->BSIM3v32rds))); /* bugfix */ - } - else - { /* for all versions lower then 3.2.4 */ - NevalSrc(&noizDens[BSIM3v32IDNOIZ], - &lnNdens[BSIM3v32IDNOIZ], ckt, - THERMNOISE, here->BSIM3v32dNodePrime, - here->BSIM3v32sNodePrime, - (m * here->BSIM3v32ueff - * fabs(here->BSIM3v32qinv - / (pParam->BSIM3v32leff - * pParam->BSIM3v32leff)))); - } - break; - } - NevalSrc(&noizDens[BSIM3v32FLNOIZ], NULL, - ckt, N_GAIN, here->BSIM3v32dNodePrime, - here->BSIM3v32sNodePrime, (double) 0.0); - - switch( model->BSIM3v32noiMod ) - { case 1: - case 4: - noizDens[BSIM3v32FLNOIZ] *= m * model->BSIM3v32kf - * exp(model->BSIM3v32af - * log(MAX(fabs(here->BSIM3v32cd), - N_MINLOG))) - / (pow(data->freq, model->BSIM3v32ef) - * pParam->BSIM3v32leff - * pParam->BSIM3v32leff - * model->BSIM3v32cox); - break; - case 2: - case 3: - vgs = *(ckt->CKTstates[0] + here->BSIM3v32vgs); - vds = *(ckt->CKTstates[0] + here->BSIM3v32vds); - if (vds < 0.0) - { vds = -vds; - vgs = vgs + vds; - } - /* Added revision dependent code */ - if (model->BSIM3v32intVersion == BSIM3v32V324) - { - Ssi = StrongInversionNoiseEvalNew(vds, model, - here, data->freq, ckt->CKTtemp); - T10 = model->BSIM3v32oxideTrapDensityA - * 8.62e-5 * ckt->CKTtemp; - T11 = pParam->BSIM3v32weff - * pParam->BSIM3v32leff - * pow(data->freq, model->BSIM3v32ef) - * 4.0e36; - Swi = T10 / T11 * here->BSIM3v32cd - * here->BSIM3v32cd; - T1 = Swi + Ssi; - if (T1 > 0.0) - noizDens[BSIM3v32FLNOIZ] *= m * (Ssi * Swi) / T1; - else - noizDens[BSIM3v32FLNOIZ] *= 0.0; - } - else - { /* for all versions lower then 3.2.4 */ - if (vgs >= here->BSIM3v32von + 0.1) - { - Ssi = StrongInversionNoiseEvalOld(vgs, vds, model, - here, data->freq, ckt->CKTtemp); - noizDens[BSIM3v32FLNOIZ] *= m * Ssi; - } - else - { - pParam = here->pParam; - T10 = model->BSIM3v32oxideTrapDensityA - * 8.62e-5 * ckt->CKTtemp; - T11 = pParam->BSIM3v32weff - * pParam-> BSIM3v32leff - * pow (data->freq, model->BSIM3v32ef) - * 4.0e36; - Swi = T10 / T11 * here->BSIM3v32cd * here->BSIM3v32cd; - - Slimit = StrongInversionNoiseEvalOld( - here->BSIM3v32von + 0.1, vds, model, - here, data->freq, ckt->CKTtemp); - T1 = Swi + Slimit; - if (T1 > 0.0) - noizDens[BSIM3v32FLNOIZ] *= m * (Slimit * Swi) / T1; - else - noizDens[BSIM3v32FLNOIZ] *= 0.0; - } - } - break; - } - - lnNdens[BSIM3v32FLNOIZ] = - log(MAX(noizDens[BSIM3v32FLNOIZ], N_MINLOG)); - - noizDens[BSIM3v32TOTNOIZ] = noizDens[BSIM3v32RDNOIZ] - + noizDens[BSIM3v32RSNOIZ] - + noizDens[BSIM3v32IDNOIZ] - + noizDens[BSIM3v32FLNOIZ]; - lnNdens[BSIM3v32TOTNOIZ] = - log(MAX(noizDens[BSIM3v32TOTNOIZ], N_MINLOG)); - - *OnDens += noizDens[BSIM3v32TOTNOIZ]; - - if (data->delFreq == 0.0) - { /* if we haven't done any previous - integration, we need to initialize our - "history" variables. - */ - - for (i = 0; i < BSIM3v32NSRCS; i++) - { here->BSIM3v32nVar[LNLSTDENS][i] = - lnNdens[i]; - } - - /* clear out our integration variables - if it's the first pass - */ - if (data->freq == - job->NstartFreq) - { for (i = 0; i < BSIM3v32NSRCS; i++) - { here->BSIM3v32nVar[OUTNOIZ][i] = 0.0; - here->BSIM3v32nVar[INNOIZ][i] = 0.0; - } - } - } - else - { /* data->delFreq != 0.0, - we have to integrate. - */ - for (i = 0; i < BSIM3v32NSRCS; i++) - { if (i != BSIM3v32TOTNOIZ) - { tempOnoise = Nintegrate(noizDens[i], - lnNdens[i], - here->BSIM3v32nVar[LNLSTDENS][i], - data); - tempInoise = Nintegrate(noizDens[i] - * data->GainSqInv, lnNdens[i] - + data->lnGainInv, - here->BSIM3v32nVar[LNLSTDENS][i] - + data->lnGainInv, data); - here->BSIM3v32nVar[LNLSTDENS][i] = - lnNdens[i]; - data->outNoiz += tempOnoise; - data->inNoise += tempInoise; - if (job->NStpsSm != 0) - { here->BSIM3v32nVar[OUTNOIZ][i] - += tempOnoise; - here->BSIM3v32nVar[OUTNOIZ][BSIM3v32TOTNOIZ] - += tempOnoise; - here->BSIM3v32nVar[INNOIZ][i] - += tempInoise; - here->BSIM3v32nVar[INNOIZ][BSIM3v32TOTNOIZ] - += tempInoise; - } - } - } - } - if (data->prtSummary) - { for (i = 0; i < BSIM3v32NSRCS; i++) - { /* print a summary report */ - data->outpVector[data->outNumber++] - = noizDens[i]; - } - } - break; - case INT_NOIZ: - /* already calculated, just output */ - if (job->NStpsSm != 0) - { for (i = 0; i < BSIM3v32NSRCS; i++) - { data->outpVector[data->outNumber++] - = here->BSIM3v32nVar[OUTNOIZ][i]; - data->outpVector[data->outNumber++] - = here->BSIM3v32nVar[INNOIZ][i]; - } - } - break; - } - break; - case N_CLOSE: - /* do nothing, the main calling routine will close */ - return (OK); - break; /* the plots */ - } /* switch (operation) */ - } /* for here */ - } /* for model */ - - return(OK); -} - - - diff --git a/src/spicelib/devices/bsim3v32/b3v32par.c b/src/spicelib/devices/bsim3v32/b3v32par.c deleted file mode 100644 index ff5d7fa82..000000000 --- a/src/spicelib/devices/bsim3v32/b3v32par.c +++ /dev/null @@ -1,124 +0,0 @@ -/**** BSIM3v3.2.4, Released by Xuemei Xi 12/21/2001 ****/ - -/********** - * Copyright 2001 Regents of the University of California. All rights reserved. - * File: b3par.c of BSIM3v3.2.4 - * Author: 1995 Min-Chie Jeng and Mansun Chan - * Author: 1997-1999 Weidong Liu. - * Author: 2001 Xuemei Xi - * Modified by Paolo Nenzi 2002 and Dietmar Warning 2003 - **********/ - -#include "ngspice/ngspice.h" -#include "ngspice/ifsim.h" -#include "bsim3v32def.h" -#include "ngspice/sperror.h" -#include "ngspice/suffix.h" -#include "ngspice/fteext.h" - -int -BSIM3v32param (int param, IFvalue *value, GENinstance *inst, IFvalue *select) -{ - double scale; - - BSIM3v32instance *here = (BSIM3v32instance*)inst; - - NG_IGNORE(select); - - if (!cp_getvar("scale", CP_REAL, &scale, 0)) - scale = 1; - - switch (param) { - case BSIM3v32_W: - here->BSIM3v32w = value->rValue*scale; - here->BSIM3v32wGiven = TRUE; - break; - case BSIM3v32_L: - here->BSIM3v32l = value->rValue*scale; - here->BSIM3v32lGiven = TRUE; - break; - case BSIM3v32_M: - here->BSIM3v32m = value->rValue; - here->BSIM3v32mGiven = TRUE; - break; - case BSIM3v32_AS: - here->BSIM3v32sourceArea = value->rValue*scale*scale; - here->BSIM3v32sourceAreaGiven = TRUE; - break; - case BSIM3v32_AD: - here->BSIM3v32drainArea = value->rValue*scale*scale; - here->BSIM3v32drainAreaGiven = TRUE; - break; - case BSIM3v32_PS: - here->BSIM3v32sourcePerimeter = value->rValue*scale; - here->BSIM3v32sourcePerimeterGiven = TRUE; - break; - case BSIM3v32_PD: - here->BSIM3v32drainPerimeter = value->rValue*scale; - here->BSIM3v32drainPerimeterGiven = TRUE; - break; - case BSIM3v32_NRS: - here->BSIM3v32sourceSquares = value->rValue; - here->BSIM3v32sourceSquaresGiven = TRUE; - break; - case BSIM3v32_NRD: - here->BSIM3v32drainSquares = value->rValue; - here->BSIM3v32drainSquaresGiven = TRUE; - break; - case BSIM3v32_OFF: - here->BSIM3v32off = value->iValue; - break; - case BSIM3v32_IC_VBS: - here->BSIM3v32icVBS = value->rValue; - here->BSIM3v32icVBSGiven = TRUE; - break; - case BSIM3v32_IC_VDS: - here->BSIM3v32icVDS = value->rValue; - here->BSIM3v32icVDSGiven = TRUE; - break; - case BSIM3v32_IC_VGS: - here->BSIM3v32icVGS = value->rValue; - here->BSIM3v32icVGSGiven = TRUE; - break; - case BSIM3v32_NQSMOD: - here->BSIM3v32nqsMod = value->iValue; - here->BSIM3v32nqsModGiven = TRUE; - break; - case BSIM3v32_GEO: - here->BSIM3v32geo = value->iValue; - here->BSIM3v32geoGiven = TRUE; - break; - case BSIM3v32_DELVTO: - here->BSIM3v32delvto = value->rValue; - here->BSIM3v32delvtoGiven = TRUE; - break; - case BSIM3v32_MULU0: - here->BSIM3v32mulu0 = value->rValue; - here->BSIM3v32mulu0Given = TRUE; - break; - case BSIM3v32_IC: - /* FALLTHROUGH added to suppress GCC warning due to - * -Wimplicit-fallthrough flag */ - switch (value->v.numValue) { - case 3: - here->BSIM3v32icVBS = *(value->v.vec.rVec+2); - here->BSIM3v32icVBSGiven = TRUE; - /* FALLTHROUGH */ - case 2: - here->BSIM3v32icVGS = *(value->v.vec.rVec+1); - here->BSIM3v32icVGSGiven = TRUE; - /* FALLTHROUGH */ - case 1: - here->BSIM3v32icVDS = *(value->v.vec.rVec); - here->BSIM3v32icVDSGiven = TRUE; - break; - default: - return(E_BADPARM); - } - break; - default: - return(E_BADPARM); - } - return(OK); -} - diff --git a/src/spicelib/devices/bsim3v32/b3v32pzld.c b/src/spicelib/devices/bsim3v32/b3v32pzld.c deleted file mode 100644 index dff705cc1..000000000 --- a/src/spicelib/devices/bsim3v32/b3v32pzld.c +++ /dev/null @@ -1,370 +0,0 @@ -/**** BSIM3v3.2.4, Released by Xuemei Xi 12/21/2001 ****/ - -/********** - * Copyright 2001 Regents of the University of California. All rights reserved. - * File: b3pzld.c of BSIM3v3.2.4 - * Author: 1995 Min-Chie Jeng and Mansun Chan. - * Author: 1997-1999 Weidong Liu. - * Author: 2001 Xuemei Xi - * Modified by Paolo Nenzi 2002 - **********/ - -#include "ngspice/ngspice.h" -#include "ngspice/cktdefs.h" -#include "ngspice/complex.h" -#include "ngspice/sperror.h" -#include "bsim3v32def.h" -#include "ngspice/suffix.h" - -int -BSIM3v32pzLoad (GENmodel *inModel, CKTcircuit *ckt, SPcomplex *s) -{ -BSIM3v32model *model = (BSIM3v32model*)inModel; -BSIM3v32instance *here; -double xcggb, xcgdb, xcgsb, xcgbb, xcbgb, xcbdb, xcbsb, xcbbb; -double xcdgb, xcddb, xcdsb, xcdbb, xcsgb, xcsdb, xcssb, xcsbb; -double gdpr, gspr, gds, gbd, gbs, capbd, capbs, FwdSum, RevSum, Gm, Gmbs; -double cggb, cgdb, cgsb, cbgb, cbdb, cbsb, cddb, cdgb, cdsb; -double GSoverlapCap, GDoverlapCap, GBoverlapCap; -double dxpart, sxpart, xgtg, xgtd, xgts, xgtb; -double xcqgb = 0.0, xcqdb = 0.0, xcqsb = 0.0, xcqbb = 0.0; -double gbspsp, gbbdp, gbbsp, gbspg, gbspb; -double gbspdp, gbdpdp, gbdpg, gbdpb, gbdpsp; -double ddxpart_dVd, ddxpart_dVg, ddxpart_dVb, ddxpart_dVs; -double dsxpart_dVd, dsxpart_dVg, dsxpart_dVb, dsxpart_dVs; -double T1, CoxWL, qcheq, Cdg, Cdd, Cds, Csg, Csd, Css; -double ScalingFactor = 1.0e-9; -double m; - - for (; model != NULL; model = BSIM3v32nextModel(model)) - { for (here = BSIM3v32instances(model); here!= NULL; - here = BSIM3v32nextInstance(here)) - { - if (here->BSIM3v32mode >= 0) - { Gm = here->BSIM3v32gm; - Gmbs = here->BSIM3v32gmbs; - FwdSum = Gm + Gmbs; - RevSum = 0.0; - - gbbdp = -here->BSIM3v32gbds; - gbbsp = here->BSIM3v32gbds + here->BSIM3v32gbgs + here->BSIM3v32gbbs; - - gbdpg = here->BSIM3v32gbgs; - gbdpdp = here->BSIM3v32gbds; - gbdpb = here->BSIM3v32gbbs; - gbdpsp = -(gbdpg + gbdpdp + gbdpb); - - gbspg = 0.0; - gbspdp = 0.0; - gbspb = 0.0; - gbspsp = 0.0; - - if (here->BSIM3v32nqsMod == 0) - { cggb = here->BSIM3v32cggb; - cgsb = here->BSIM3v32cgsb; - cgdb = here->BSIM3v32cgdb; - - cbgb = here->BSIM3v32cbgb; - cbsb = here->BSIM3v32cbsb; - cbdb = here->BSIM3v32cbdb; - - cdgb = here->BSIM3v32cdgb; - cdsb = here->BSIM3v32cdsb; - cddb = here->BSIM3v32cddb; - - xgtg = xgtd = xgts = xgtb = 0.0; - sxpart = 0.6; - dxpart = 0.4; - ddxpart_dVd = ddxpart_dVg = ddxpart_dVb - = ddxpart_dVs = 0.0; - dsxpart_dVd = dsxpart_dVg = dsxpart_dVb - = dsxpart_dVs = 0.0; - } - else - { cggb = cgdb = cgsb = 0.0; - cbgb = cbdb = cbsb = 0.0; - cdgb = cddb = cdsb = 0.0; - - xgtg = here->BSIM3v32gtg; - xgtd = here->BSIM3v32gtd; - xgts = here->BSIM3v32gts; - xgtb = here->BSIM3v32gtb; - - xcqgb = here->BSIM3v32cqgb; - xcqdb = here->BSIM3v32cqdb; - xcqsb = here->BSIM3v32cqsb; - xcqbb = here->BSIM3v32cqbb; - - CoxWL = model->BSIM3v32cox * here->pParam->BSIM3v32weffCV - * here->pParam->BSIM3v32leffCV; - qcheq = -(here->BSIM3v32qgate + here->BSIM3v32qbulk); - if (fabs(qcheq) <= 1.0e-5 * CoxWL) - { if (model->BSIM3v32xpart < 0.5) - { dxpart = 0.4; - } - else if (model->BSIM3v32xpart > 0.5) - { dxpart = 0.0; - } - else - { dxpart = 0.5; - } - ddxpart_dVd = ddxpart_dVg = ddxpart_dVb - = ddxpart_dVs = 0.0; - } - else - { dxpart = here->BSIM3v32qdrn / qcheq; - Cdd = here->BSIM3v32cddb; - Csd = -(here->BSIM3v32cgdb + here->BSIM3v32cddb - + here->BSIM3v32cbdb); - ddxpart_dVd = (Cdd - dxpart * (Cdd + Csd)) / qcheq; - Cdg = here->BSIM3v32cdgb; - Csg = -(here->BSIM3v32cggb + here->BSIM3v32cdgb - + here->BSIM3v32cbgb); - ddxpart_dVg = (Cdg - dxpart * (Cdg + Csg)) / qcheq; - - Cds = here->BSIM3v32cdsb; - Css = -(here->BSIM3v32cgsb + here->BSIM3v32cdsb - + here->BSIM3v32cbsb); - ddxpart_dVs = (Cds - dxpart * (Cds + Css)) / qcheq; - - ddxpart_dVb = -(ddxpart_dVd + ddxpart_dVg - + ddxpart_dVs); - } - sxpart = 1.0 - dxpart; - dsxpart_dVd = -ddxpart_dVd; - dsxpart_dVg = -ddxpart_dVg; - dsxpart_dVs = -ddxpart_dVs; - dsxpart_dVb = -(dsxpart_dVd + dsxpart_dVg + dsxpart_dVs); - } - } - else - { Gm = -here->BSIM3v32gm; - Gmbs = -here->BSIM3v32gmbs; - FwdSum = 0.0; - RevSum = -(Gm + Gmbs); - - gbbsp = -here->BSIM3v32gbds; - gbbdp = here->BSIM3v32gbds + here->BSIM3v32gbgs + here->BSIM3v32gbbs; - - gbdpg = 0.0; - gbdpsp = 0.0; - gbdpb = 0.0; - gbdpdp = 0.0; - - gbspg = here->BSIM3v32gbgs; - gbspsp = here->BSIM3v32gbds; - gbspb = here->BSIM3v32gbbs; - gbspdp = -(gbspg + gbspsp + gbspb); - - if (here->BSIM3v32nqsMod == 0) - { cggb = here->BSIM3v32cggb; - cgsb = here->BSIM3v32cgdb; - cgdb = here->BSIM3v32cgsb; - - cbgb = here->BSIM3v32cbgb; - cbsb = here->BSIM3v32cbdb; - cbdb = here->BSIM3v32cbsb; - - cdgb = -(here->BSIM3v32cdgb + cggb + cbgb); - cdsb = -(here->BSIM3v32cddb + cgsb + cbsb); - cddb = -(here->BSIM3v32cdsb + cgdb + cbdb); - - xgtg = xgtd = xgts = xgtb = 0.0; - sxpart = 0.4; - dxpart = 0.6; - ddxpart_dVd = ddxpart_dVg = ddxpart_dVb - = ddxpart_dVs = 0.0; - dsxpart_dVd = dsxpart_dVg = dsxpart_dVb - = dsxpart_dVs = 0.0; - } - else - { cggb = cgdb = cgsb = 0.0; - cbgb = cbdb = cbsb = 0.0; - cdgb = cddb = cdsb = 0.0; - - xgtg = here->BSIM3v32gtg; - xgtd = here->BSIM3v32gts; - xgts = here->BSIM3v32gtd; - xgtb = here->BSIM3v32gtb; - - xcqgb = here->BSIM3v32cqgb; - xcqdb = here->BSIM3v32cqsb; - xcqsb = here->BSIM3v32cqdb; - xcqbb = here->BSIM3v32cqbb; - - CoxWL = model->BSIM3v32cox * here->pParam->BSIM3v32weffCV - * here->pParam->BSIM3v32leffCV; - qcheq = -(here->BSIM3v32qgate + here->BSIM3v32qbulk); - if (fabs(qcheq) <= 1.0e-5 * CoxWL) - { if (model->BSIM3v32xpart < 0.5) - { sxpart = 0.4; - } - else if (model->BSIM3v32xpart > 0.5) - { sxpart = 0.0; - } - else - { sxpart = 0.5; - } - dsxpart_dVd = dsxpart_dVg = dsxpart_dVb - = dsxpart_dVs = 0.0; - } - else - { sxpart = here->BSIM3v32qdrn / qcheq; - Css = here->BSIM3v32cddb; - Cds = -(here->BSIM3v32cgdb + here->BSIM3v32cddb - + here->BSIM3v32cbdb); - dsxpart_dVs = (Css - sxpart * (Css + Cds)) / qcheq; - Csg = here->BSIM3v32cdgb; - Cdg = -(here->BSIM3v32cggb + here->BSIM3v32cdgb - + here->BSIM3v32cbgb); - dsxpart_dVg = (Csg - sxpart * (Csg + Cdg)) / qcheq; - - Csd = here->BSIM3v32cdsb; - Cdd = -(here->BSIM3v32cgsb + here->BSIM3v32cdsb - + here->BSIM3v32cbsb); - dsxpart_dVd = (Csd - sxpart * (Csd + Cdd)) / qcheq; - - dsxpart_dVb = -(dsxpart_dVd + dsxpart_dVg - + dsxpart_dVs); - } - dxpart = 1.0 - sxpart; - ddxpart_dVd = -dsxpart_dVd; - ddxpart_dVg = -dsxpart_dVg; - ddxpart_dVs = -dsxpart_dVs; - ddxpart_dVb = -(ddxpart_dVd + ddxpart_dVg + ddxpart_dVs); - } - } - - - T1 = *(ckt->CKTstate0 + here->BSIM3v32qdef) * here->BSIM3v32gtau; - gdpr = here->BSIM3v32drainConductance; - gspr = here->BSIM3v32sourceConductance; - gds = here->BSIM3v32gds; - gbd = here->BSIM3v32gbd; - gbs = here->BSIM3v32gbs; - capbd = here->BSIM3v32capbd; - capbs = here->BSIM3v32capbs; - - GSoverlapCap = here->BSIM3v32cgso; - GDoverlapCap = here->BSIM3v32cgdo; - GBoverlapCap = here->pParam->BSIM3v32cgbo; - - xcdgb = (cdgb - GDoverlapCap); - xcddb = (cddb + capbd + GDoverlapCap); - xcdsb = cdsb; - xcdbb = -(xcdgb + xcddb + xcdsb); - xcsgb = -(cggb + cbgb + cdgb + GSoverlapCap); - xcsdb = -(cgdb + cbdb + cddb); - xcssb = (capbs + GSoverlapCap - (cgsb + cbsb + cdsb)); - xcsbb = -(xcsgb + xcsdb + xcssb); - xcggb = (cggb + GDoverlapCap + GSoverlapCap + GBoverlapCap); - xcgdb = (cgdb - GDoverlapCap); - xcgsb = (cgsb - GSoverlapCap); - xcgbb = -(xcggb + xcgdb + xcgsb); - xcbgb = (cbgb - GBoverlapCap); - xcbdb = (cbdb - capbd); - xcbsb = (cbsb - capbs); - xcbbb = -(xcbgb + xcbdb + xcbsb); - - m = here->BSIM3v32m; - - *(here->BSIM3v32GgPtr ) += m * (xcggb * s->real); - *(here->BSIM3v32GgPtr +1) += m * (xcggb * s->imag); - *(here->BSIM3v32BbPtr ) += m * (xcbbb * s->real); - *(here->BSIM3v32BbPtr +1) += m * (xcbbb * s->imag); - *(here->BSIM3v32DPdpPtr ) += m * (xcddb * s->real); - *(here->BSIM3v32DPdpPtr +1) += m * (xcddb * s->imag); - *(here->BSIM3v32SPspPtr ) += m * (xcssb * s->real); - *(here->BSIM3v32SPspPtr +1) += m * (xcssb * s->imag); - - *(here->BSIM3v32GbPtr ) += m * (xcgbb * s->real); - *(here->BSIM3v32GbPtr +1) += m * (xcgbb * s->imag); - *(here->BSIM3v32GdpPtr ) += m * (xcgdb * s->real); - *(here->BSIM3v32GdpPtr +1) += m * (xcgdb * s->imag); - *(here->BSIM3v32GspPtr ) += m * (xcgsb * s->real); - *(here->BSIM3v32GspPtr +1) += m * (xcgsb * s->imag); - - *(here->BSIM3v32BgPtr ) += m * (xcbgb * s->real); - *(here->BSIM3v32BgPtr +1) += m * (xcbgb * s->imag); - *(here->BSIM3v32BdpPtr ) += m * (xcbdb * s->real); - *(here->BSIM3v32BdpPtr +1) += m * (xcbdb * s->imag); - *(here->BSIM3v32BspPtr ) += m * (xcbsb * s->real); - *(here->BSIM3v32BspPtr +1) += m * (xcbsb * s->imag); - - *(here->BSIM3v32DPgPtr ) += m * (xcdgb * s->real); - *(here->BSIM3v32DPgPtr +1) += m * (xcdgb * s->imag); - *(here->BSIM3v32DPbPtr ) += m * (xcdbb * s->real); - *(here->BSIM3v32DPbPtr +1) += m * (xcdbb * s->imag); - *(here->BSIM3v32DPspPtr ) += m * (xcdsb * s->real); - *(here->BSIM3v32DPspPtr +1) += m * (xcdsb * s->imag); - - *(here->BSIM3v32SPgPtr ) += m * (xcsgb * s->real); - *(here->BSIM3v32SPgPtr +1) += m * (xcsgb * s->imag); - *(here->BSIM3v32SPbPtr ) += m * (xcsbb * s->real); - *(here->BSIM3v32SPbPtr +1) += m * (xcsbb * s->imag); - *(here->BSIM3v32SPdpPtr ) += m * (xcsdb * s->real); - *(here->BSIM3v32SPdpPtr +1) += m * (xcsdb * s->imag); - - *(here->BSIM3v32DdPtr) += m * gdpr; - *(here->BSIM3v32DdpPtr) -= m * gdpr; - *(here->BSIM3v32DPdPtr) -= m * gdpr; - - *(here->BSIM3v32SsPtr) += m * gspr; - *(here->BSIM3v32SspPtr) -= m * gspr; - *(here->BSIM3v32SPsPtr) -= m * gspr; - - *(here->BSIM3v32BgPtr) -= m * here->BSIM3v32gbgs; - *(here->BSIM3v32BbPtr) += m * (gbd + gbs - here->BSIM3v32gbbs); - *(here->BSIM3v32BdpPtr) -= m * (gbd - gbbdp); - *(here->BSIM3v32BspPtr) -= m * (gbs - gbbsp); - - *(here->BSIM3v32DPgPtr) += Gm + dxpart * xgtg - + T1 * ddxpart_dVg + gbdpg; - *(here->BSIM3v32DPdpPtr) += gdpr + gds + gbd + RevSum - + dxpart * xgtd + T1 * ddxpart_dVd + gbdpdp; - *(here->BSIM3v32DPspPtr) -= gds + FwdSum - dxpart * xgts - - T1 * ddxpart_dVs - gbdpsp; - *(here->BSIM3v32DPbPtr) -= gbd - Gmbs - dxpart * xgtb - - T1 * ddxpart_dVb - gbdpb; - - *(here->BSIM3v32SPgPtr) -= Gm - sxpart * xgtg - - T1 * dsxpart_dVg - gbspg; - *(here->BSIM3v32SPspPtr) += gspr + gds + gbs + FwdSum - + sxpart * xgts + T1 * dsxpart_dVs + gbspsp; - *(here->BSIM3v32SPbPtr) -= gbs + Gmbs - sxpart * xgtb - - T1 * dsxpart_dVb - gbspb; - *(here->BSIM3v32SPdpPtr) -= gds + RevSum - sxpart * xgtd - - T1 * dsxpart_dVd - gbspdp; - - *(here->BSIM3v32GgPtr) -= xgtg; - *(here->BSIM3v32GbPtr) -= xgtb; - *(here->BSIM3v32GdpPtr) -= xgtd; - *(here->BSIM3v32GspPtr) -= xgts; - - if (here->BSIM3v32nqsMod) - { *(here->BSIM3v32QqPtr ) += m * (s->real * ScalingFactor); - *(here->BSIM3v32QqPtr +1) += m * (s->imag * ScalingFactor); - *(here->BSIM3v32QgPtr ) -= m * (xcqgb * s->real); - *(here->BSIM3v32QgPtr +1) -= m * (xcqgb * s->imag); - *(here->BSIM3v32QdpPtr ) -= m * (xcqdb * s->real); - *(here->BSIM3v32QdpPtr +1) -= m * (xcqdb * s->imag); - *(here->BSIM3v32QbPtr ) -= m * (xcqbb * s->real); - *(here->BSIM3v32QbPtr +1) -= m * (xcqbb * s->imag); - *(here->BSIM3v32QspPtr ) -= m * (xcqsb * s->real); - *(here->BSIM3v32QspPtr +1) -= m * (xcqsb * s->imag); - - *(here->BSIM3v32GqPtr) -= m * (here->BSIM3v32gtau); - *(here->BSIM3v32DPqPtr) += m * (dxpart * here->BSIM3v32gtau); - *(here->BSIM3v32SPqPtr) += m * (sxpart * here->BSIM3v32gtau); - - *(here->BSIM3v32QqPtr) += m * (here->BSIM3v32gtau); - *(here->BSIM3v32QgPtr) += m * xgtg; - *(here->BSIM3v32QdpPtr) += m * xgtd; - *(here->BSIM3v32QbPtr) += m * xgtb; - *(here->BSIM3v32QspPtr) += m * xgts; - } - } - } - return(OK); -} - diff --git a/src/spicelib/devices/bsim3v32/b3v32set.c b/src/spicelib/devices/bsim3v32/b3v32set.c deleted file mode 100644 index 919b0f2ee..000000000 --- a/src/spicelib/devices/bsim3v32/b3v32set.c +++ /dev/null @@ -1,1217 +0,0 @@ -/**** BSIM3v3.2.4, Released by Xuemei Xi 12/21/2001 ****/ - -/********** - * Copyright 2001 Regents of the University of California. All rights reserved. - * File: b3set.c of BSIM3v3.2.4 - * Author: 1995 Min-Chie Jeng and Mansun Chan. - * Author: 1997-1999 Weidong Liu. - * Author: 2001 Xuemei Xi - **********/ - -#include "ngspice/ngspice.h" -#include "ngspice/smpdefs.h" -#include "ngspice/cktdefs.h" -#include "bsim3v32def.h" -#include "ngspice/const.h" -#include "ngspice/sperror.h" -#include "ngspice/devdefs.h" -#include "ngspice/suffix.h" - -#define MAX_EXP 5.834617425e14 -#define MIN_EXP 1.713908431e-15 -#define EXP_THRESHOLD 34.0 -#define SMOOTHFACTOR 0.1 -#define EPSOX 3.453133e-11 -#define EPSSI 1.03594e-10 -#define PI 3.141592654 -#define Charge_q 1.60219e-19 -#define Meter2Micron 1.0e6 - -int -BSIM3v32setup (SMPmatrix *matrix, GENmodel *inModel, CKTcircuit *ckt, - int *states) -{ -BSIM3v32model *model = (BSIM3v32model*)inModel; -BSIM3v32instance *here; -int error; -CKTnode *tmp; - -CKTnode *tmpNode; -IFuid tmpName; - -#ifdef USE_OMP -int idx, InstCount; -BSIM3v32instance **InstArray; -#endif - - /* loop through all the BSIM3v32 device models */ - for( ; model != NULL; model = BSIM3v32nextModel(model)) - { -/* Default value Processing for BSIM3v32 MOSFET Models */ - if (!model->BSIM3v32typeGiven) - model->BSIM3v32type = NMOS; - if (!model->BSIM3v32mobModGiven) - model->BSIM3v32mobMod = 1; - if (!model->BSIM3v32binUnitGiven) - model->BSIM3v32binUnit = 1; - if (!model->BSIM3v32paramChkGiven) - model->BSIM3v32paramChk = 0; - if (!model->BSIM3v32capModGiven) - model->BSIM3v32capMod = 3; - if (!model->BSIM3v32acmModGiven) - model->BSIM3v32acmMod = 0; - if (!model->BSIM3v32calcacmGiven) - model->BSIM3v32calcacm = 0; - if (!model->BSIM3v32noiModGiven) - model->BSIM3v32noiMod = 1; - if (!model->BSIM3v32nqsModGiven) - model->BSIM3v32nqsMod = 0; - else if ((model->BSIM3v32nqsMod != 0) && (model->BSIM3v32nqsMod != 1)) - { model->BSIM3v32nqsMod = 0; - printf("Warning: nqsMod has been set to its default value: 0.\n"); - } - - /* If the user does not provide the model revision, - * we always choose the most recent. - */ - if (!model->BSIM3v32versionGiven) - model->BSIM3v32version = copy("3.2.4"); - - /* I have added below the code that translate model string - * into an integer. This trick is meant to speed up the - * revision testing instruction, since comparing integer - * is faster than comparing strings. - * Paolo Nenzi 2002 - */ - if ((!strcmp(model->BSIM3v32version, "3.2.4"))||(!strncmp(model->BSIM3v32version, "3.24", 4))) - model->BSIM3v32intVersion = BSIM3v32V324; - else if ((!strcmp(model->BSIM3v32version, "3.2.3"))||(!strncmp(model->BSIM3v32version, "3.23", 4))) - model->BSIM3v32intVersion = BSIM3v32V323; - else if ((!strcmp(model->BSIM3v32version, "3.2.2"))||(!strncmp(model->BSIM3v32version, "3.22", 4))) - model->BSIM3v32intVersion = BSIM3v32V322; - else if ((!strncmp(model->BSIM3v32version, "3.2", 3))||(!strncmp(model->BSIM3v32version, "3.20", 4))) - model->BSIM3v32intVersion = BSIM3v32V32; - else - model->BSIM3v32intVersion = BSIM3v32V3OLD; - /* BSIM3v32V3OLD is a placeholder for pre 3.2 revision - * This model should not be used for pre 3.2 models. - */ - - if (!model->BSIM3v32toxGiven) - model->BSIM3v32tox = 150.0e-10; - model->BSIM3v32cox = 3.453133e-11 / model->BSIM3v32tox; - if (!model->BSIM3v32toxmGiven) - model->BSIM3v32toxm = model->BSIM3v32tox; - - if (!model->BSIM3v32cdscGiven) - model->BSIM3v32cdsc = 2.4e-4; /* unit Q/V/m^2 */ - if (!model->BSIM3v32cdscbGiven) - model->BSIM3v32cdscb = 0.0; /* unit Q/V/m^2 */ - if (!model->BSIM3v32cdscdGiven) - model->BSIM3v32cdscd = 0.0; /* unit Q/V/m^2 */ - if (!model->BSIM3v32citGiven) - model->BSIM3v32cit = 0.0; /* unit Q/V/m^2 */ - if (!model->BSIM3v32nfactorGiven) - model->BSIM3v32nfactor = 1; - if (!model->BSIM3v32xjGiven) - model->BSIM3v32xj = .15e-6; - if (!model->BSIM3v32vsatGiven) - model->BSIM3v32vsat = 8.0e4; /* unit m/s */ - if (!model->BSIM3v32atGiven) - model->BSIM3v32at = 3.3e4; /* unit m/s */ - if (!model->BSIM3v32a0Given) - model->BSIM3v32a0 = 1.0; - if (!model->BSIM3v32agsGiven) - model->BSIM3v32ags = 0.0; - if (!model->BSIM3v32a1Given) - model->BSIM3v32a1 = 0.0; - if (!model->BSIM3v32a2Given) - model->BSIM3v32a2 = 1.0; - if (!model->BSIM3v32ketaGiven) - model->BSIM3v32keta = -0.047; /* unit / V */ - if (!model->BSIM3v32nsubGiven) - model->BSIM3v32nsub = 6.0e16; /* unit 1/cm3 */ - if (!model->BSIM3v32npeakGiven) - model->BSIM3v32npeak = 1.7e17; /* unit 1/cm3 */ - if (!model->BSIM3v32ngateGiven) - model->BSIM3v32ngate = 0; /* unit 1/cm3 */ - if (!model->BSIM3v32vbmGiven) - model->BSIM3v32vbm = -3.0; - if (!model->BSIM3v32xtGiven) - model->BSIM3v32xt = 1.55e-7; - if (!model->BSIM3v32kt1Given) - model->BSIM3v32kt1 = -0.11; /* unit V */ - if (!model->BSIM3v32kt1lGiven) - model->BSIM3v32kt1l = 0.0; /* unit V*m */ - if (!model->BSIM3v32kt2Given) - model->BSIM3v32kt2 = 0.022; /* No unit */ - if (!model->BSIM3v32k3Given) - model->BSIM3v32k3 = 80.0; - if (!model->BSIM3v32k3bGiven) - model->BSIM3v32k3b = 0.0; - if (!model->BSIM3v32w0Given) - model->BSIM3v32w0 = 2.5e-6; - if (!model->BSIM3v32nlxGiven) - model->BSIM3v32nlx = 1.74e-7; - if (!model->BSIM3v32dvt0Given) - model->BSIM3v32dvt0 = 2.2; - if (!model->BSIM3v32dvt1Given) - model->BSIM3v32dvt1 = 0.53; - if (!model->BSIM3v32dvt2Given) - model->BSIM3v32dvt2 = -0.032; /* unit 1 / V */ - - if (!model->BSIM3v32dvt0wGiven) - model->BSIM3v32dvt0w = 0.0; - if (!model->BSIM3v32dvt1wGiven) - model->BSIM3v32dvt1w = 5.3e6; - if (!model->BSIM3v32dvt2wGiven) - model->BSIM3v32dvt2w = -0.032; - - if (!model->BSIM3v32droutGiven) - model->BSIM3v32drout = 0.56; - if (!model->BSIM3v32dsubGiven) - model->BSIM3v32dsub = model->BSIM3v32drout; - if (!model->BSIM3v32vth0Given) - model->BSIM3v32vth0 = (model->BSIM3v32type == NMOS) ? 0.7 : -0.7; - if (!model->BSIM3v32uaGiven) - model->BSIM3v32ua = 2.25e-9; /* unit m/V */ - if (!model->BSIM3v32ua1Given) - model->BSIM3v32ua1 = 4.31e-9; /* unit m/V */ - if (!model->BSIM3v32ubGiven) - model->BSIM3v32ub = 5.87e-19; /* unit (m/V)**2 */ - if (!model->BSIM3v32ub1Given) - model->BSIM3v32ub1 = -7.61e-18; /* unit (m/V)**2 */ - if (!model->BSIM3v32ucGiven) - model->BSIM3v32uc = (model->BSIM3v32mobMod == 3) ? -0.0465 : -0.0465e-9; - if (!model->BSIM3v32uc1Given) - model->BSIM3v32uc1 = (model->BSIM3v32mobMod == 3) ? -0.056 : -0.056e-9; - if (!model->BSIM3v32u0Given) - model->BSIM3v32u0 = (model->BSIM3v32type == NMOS) ? 0.067 : 0.025; - if (!model->BSIM3v32uteGiven) - model->BSIM3v32ute = -1.5; - if (!model->BSIM3v32voffGiven) - model->BSIM3v32voff = -0.08; - if (!model->BSIM3v32deltaGiven) - model->BSIM3v32delta = 0.01; - if (!model->BSIM3v32rdswGiven) - model->BSIM3v32rdsw = 0; - if (!model->BSIM3v32prwgGiven) - model->BSIM3v32prwg = 0.0; /* unit 1/V */ - if (!model->BSIM3v32prwbGiven) - model->BSIM3v32prwb = 0.0; - if (!model->BSIM3v32prtGiven) - model->BSIM3v32prt = 0.0; - if (!model->BSIM3v32eta0Given) - model->BSIM3v32eta0 = 0.08; /* no unit */ - if (!model->BSIM3v32etabGiven) - model->BSIM3v32etab = -0.07; /* unit 1/V */ - if (!model->BSIM3v32pclmGiven) - model->BSIM3v32pclm = 1.3; /* no unit */ - if (!model->BSIM3v32pdibl1Given) - model->BSIM3v32pdibl1 = .39; /* no unit */ - if (!model->BSIM3v32pdibl2Given) - model->BSIM3v32pdibl2 = 0.0086; /* no unit */ - if (!model->BSIM3v32pdiblbGiven) - model->BSIM3v32pdiblb = 0.0; /* 1/V */ - if (!model->BSIM3v32pscbe1Given) - model->BSIM3v32pscbe1 = 4.24e8; - if (!model->BSIM3v32pscbe2Given) - model->BSIM3v32pscbe2 = 1.0e-5; - if (!model->BSIM3v32pvagGiven) - model->BSIM3v32pvag = 0.0; - if (!model->BSIM3v32wrGiven) - model->BSIM3v32wr = 1.0; - if (!model->BSIM3v32dwgGiven) - model->BSIM3v32dwg = 0.0; - if (!model->BSIM3v32dwbGiven) - model->BSIM3v32dwb = 0.0; - if (!model->BSIM3v32b0Given) - model->BSIM3v32b0 = 0.0; - if (!model->BSIM3v32b1Given) - model->BSIM3v32b1 = 0.0; - if (!model->BSIM3v32alpha0Given) - model->BSIM3v32alpha0 = 0.0; - if (!model->BSIM3v32alpha1Given) - model->BSIM3v32alpha1 = 0.0; - if (!model->BSIM3v32beta0Given) - model->BSIM3v32beta0 = 30.0; - if (!model->BSIM3v32ijthGiven) - model->BSIM3v32ijth = 0.1; /* unit A */ - - if (!model->BSIM3v32elmGiven) - model->BSIM3v32elm = 5.0; - if (!model->BSIM3v32cgslGiven) - model->BSIM3v32cgsl = 0.0; - if (!model->BSIM3v32cgdlGiven) - model->BSIM3v32cgdl = 0.0; - if (!model->BSIM3v32ckappaGiven) - model->BSIM3v32ckappa = 0.6; - if (!model->BSIM3v32clcGiven) - model->BSIM3v32clc = 0.1e-6; - if (!model->BSIM3v32cleGiven) - model->BSIM3v32cle = 0.6; - if (!model->BSIM3v32vfbcvGiven) - model->BSIM3v32vfbcv = -1.0; - if (!model->BSIM3v32acdeGiven) - model->BSIM3v32acde = 1.0; - if (!model->BSIM3v32moinGiven) - model->BSIM3v32moin = 15.0; - if (!model->BSIM3v32noffGiven) - model->BSIM3v32noff = 1.0; - if (!model->BSIM3v32voffcvGiven) - model->BSIM3v32voffcv = 0.0; - if (!model->BSIM3v32tcjGiven) - model->BSIM3v32tcj = 0.0; - if (!model->BSIM3v32tpbGiven) - model->BSIM3v32tpb = 0.0; - if (!model->BSIM3v32tcjswGiven) - model->BSIM3v32tcjsw = 0.0; - if (!model->BSIM3v32tpbswGiven) - model->BSIM3v32tpbsw = 0.0; - if (!model->BSIM3v32tcjswgGiven) - model->BSIM3v32tcjswg = 0.0; - if (!model->BSIM3v32tpbswgGiven) - model->BSIM3v32tpbswg = 0.0; - - /* ACM model */ - if (!model->BSIM3v32hdifGiven) - model->BSIM3v32hdif = 0.0; - if (!model->BSIM3v32ldifGiven) - model->BSIM3v32ldif = 0.0; - if (!model->BSIM3v32ldGiven) - model->BSIM3v32ld = 0.0; - if (!model->BSIM3v32rdGiven) - model->BSIM3v32rd = 0.0; - if (!model->BSIM3v32rsGiven) - model->BSIM3v32rs = 0.0; - if (!model->BSIM3v32rdcGiven) - model->BSIM3v32rdc = 0.0; - if (!model->BSIM3v32rscGiven) - model->BSIM3v32rsc = 0.0; - if (!model->BSIM3v32wmltGiven) - model->BSIM3v32wmlt = 1.0; - - if (!model->BSIM3v32lmltGiven) - model->BSIM3v32lmlt = 1.0; - - /* Length dependence */ - if (!model->BSIM3v32lcdscGiven) - model->BSIM3v32lcdsc = 0.0; - if (!model->BSIM3v32lcdscbGiven) - model->BSIM3v32lcdscb = 0.0; - if (!model->BSIM3v32lcdscdGiven) - model->BSIM3v32lcdscd = 0.0; - if (!model->BSIM3v32lcitGiven) - model->BSIM3v32lcit = 0.0; - if (!model->BSIM3v32lnfactorGiven) - model->BSIM3v32lnfactor = 0.0; - if (!model->BSIM3v32lxjGiven) - model->BSIM3v32lxj = 0.0; - if (!model->BSIM3v32lvsatGiven) - model->BSIM3v32lvsat = 0.0; - if (!model->BSIM3v32latGiven) - model->BSIM3v32lat = 0.0; - if (!model->BSIM3v32la0Given) - model->BSIM3v32la0 = 0.0; - if (!model->BSIM3v32lagsGiven) - model->BSIM3v32lags = 0.0; - if (!model->BSIM3v32la1Given) - model->BSIM3v32la1 = 0.0; - if (!model->BSIM3v32la2Given) - model->BSIM3v32la2 = 0.0; - if (!model->BSIM3v32lketaGiven) - model->BSIM3v32lketa = 0.0; - if (!model->BSIM3v32lnsubGiven) - model->BSIM3v32lnsub = 0.0; - if (!model->BSIM3v32lnpeakGiven) - model->BSIM3v32lnpeak = 0.0; - if (!model->BSIM3v32lngateGiven) - model->BSIM3v32lngate = 0.0; - if (!model->BSIM3v32lvbmGiven) - model->BSIM3v32lvbm = 0.0; - if (!model->BSIM3v32lxtGiven) - model->BSIM3v32lxt = 0.0; - if (!model->BSIM3v32lkt1Given) - model->BSIM3v32lkt1 = 0.0; - if (!model->BSIM3v32lkt1lGiven) - model->BSIM3v32lkt1l = 0.0; - if (!model->BSIM3v32lkt2Given) - model->BSIM3v32lkt2 = 0.0; - if (!model->BSIM3v32lk3Given) - model->BSIM3v32lk3 = 0.0; - if (!model->BSIM3v32lk3bGiven) - model->BSIM3v32lk3b = 0.0; - if (!model->BSIM3v32lw0Given) - model->BSIM3v32lw0 = 0.0; - if (!model->BSIM3v32lnlxGiven) - model->BSIM3v32lnlx = 0.0; - if (!model->BSIM3v32ldvt0Given) - model->BSIM3v32ldvt0 = 0.0; - if (!model->BSIM3v32ldvt1Given) - model->BSIM3v32ldvt1 = 0.0; - if (!model->BSIM3v32ldvt2Given) - model->BSIM3v32ldvt2 = 0.0; - if (!model->BSIM3v32ldvt0wGiven) - model->BSIM3v32ldvt0w = 0.0; - if (!model->BSIM3v32ldvt1wGiven) - model->BSIM3v32ldvt1w = 0.0; - if (!model->BSIM3v32ldvt2wGiven) - model->BSIM3v32ldvt2w = 0.0; - if (!model->BSIM3v32ldroutGiven) - model->BSIM3v32ldrout = 0.0; - if (!model->BSIM3v32ldsubGiven) - model->BSIM3v32ldsub = 0.0; - if (!model->BSIM3v32lvth0Given) - model->BSIM3v32lvth0 = 0.0; - if (!model->BSIM3v32luaGiven) - model->BSIM3v32lua = 0.0; - if (!model->BSIM3v32lua1Given) - model->BSIM3v32lua1 = 0.0; - if (!model->BSIM3v32lubGiven) - model->BSIM3v32lub = 0.0; - if (!model->BSIM3v32lub1Given) - model->BSIM3v32lub1 = 0.0; - if (!model->BSIM3v32lucGiven) - model->BSIM3v32luc = 0.0; - if (!model->BSIM3v32luc1Given) - model->BSIM3v32luc1 = 0.0; - if (!model->BSIM3v32lu0Given) - model->BSIM3v32lu0 = 0.0; - if (!model->BSIM3v32luteGiven) - model->BSIM3v32lute = 0.0; - if (!model->BSIM3v32lvoffGiven) - model->BSIM3v32lvoff = 0.0; - if (!model->BSIM3v32ldeltaGiven) - model->BSIM3v32ldelta = 0.0; - if (!model->BSIM3v32lrdswGiven) - model->BSIM3v32lrdsw = 0.0; - if (!model->BSIM3v32lprwbGiven) - model->BSIM3v32lprwb = 0.0; - if (!model->BSIM3v32lprwgGiven) - model->BSIM3v32lprwg = 0.0; - if (!model->BSIM3v32lprtGiven) - model->BSIM3v32lprt = 0.0; - if (!model->BSIM3v32leta0Given) - model->BSIM3v32leta0 = 0.0; - if (!model->BSIM3v32letabGiven) - model->BSIM3v32letab = -0.0; - if (!model->BSIM3v32lpclmGiven) - model->BSIM3v32lpclm = 0.0; - if (!model->BSIM3v32lpdibl1Given) - model->BSIM3v32lpdibl1 = 0.0; - if (!model->BSIM3v32lpdibl2Given) - model->BSIM3v32lpdibl2 = 0.0; - if (!model->BSIM3v32lpdiblbGiven) - model->BSIM3v32lpdiblb = 0.0; - if (!model->BSIM3v32lpscbe1Given) - model->BSIM3v32lpscbe1 = 0.0; - if (!model->BSIM3v32lpscbe2Given) - model->BSIM3v32lpscbe2 = 0.0; - if (!model->BSIM3v32lpvagGiven) - model->BSIM3v32lpvag = 0.0; - if (!model->BSIM3v32lwrGiven) - model->BSIM3v32lwr = 0.0; - if (!model->BSIM3v32ldwgGiven) - model->BSIM3v32ldwg = 0.0; - if (!model->BSIM3v32ldwbGiven) - model->BSIM3v32ldwb = 0.0; - if (!model->BSIM3v32lb0Given) - model->BSIM3v32lb0 = 0.0; - if (!model->BSIM3v32lb1Given) - model->BSIM3v32lb1 = 0.0; - if (!model->BSIM3v32lalpha0Given) - model->BSIM3v32lalpha0 = 0.0; - if (!model->BSIM3v32lalpha1Given) - model->BSIM3v32lalpha1 = 0.0; - if (!model->BSIM3v32lbeta0Given) - model->BSIM3v32lbeta0 = 0.0; - if (!model->BSIM3v32lvfbGiven) - model->BSIM3v32lvfb = 0.0; - - if (!model->BSIM3v32lelmGiven) - model->BSIM3v32lelm = 0.0; - if (!model->BSIM3v32lcgslGiven) - model->BSIM3v32lcgsl = 0.0; - if (!model->BSIM3v32lcgdlGiven) - model->BSIM3v32lcgdl = 0.0; - if (!model->BSIM3v32lckappaGiven) - model->BSIM3v32lckappa = 0.0; - if (!model->BSIM3v32lclcGiven) - model->BSIM3v32lclc = 0.0; - if (!model->BSIM3v32lcleGiven) - model->BSIM3v32lcle = 0.0; - if (!model->BSIM3v32lcfGiven) - model->BSIM3v32lcf = 0.0; - if (!model->BSIM3v32lvfbcvGiven) - model->BSIM3v32lvfbcv = 0.0; - if (!model->BSIM3v32lacdeGiven) - model->BSIM3v32lacde = 0.0; - if (!model->BSIM3v32lmoinGiven) - model->BSIM3v32lmoin = 0.0; - if (!model->BSIM3v32lnoffGiven) - model->BSIM3v32lnoff = 0.0; - if (!model->BSIM3v32lvoffcvGiven) - model->BSIM3v32lvoffcv = 0.0; - - /* Width dependence */ - if (!model->BSIM3v32wcdscGiven) - model->BSIM3v32wcdsc = 0.0; - if (!model->BSIM3v32wcdscbGiven) - model->BSIM3v32wcdscb = 0.0; - if (!model->BSIM3v32wcdscdGiven) - model->BSIM3v32wcdscd = 0.0; - if (!model->BSIM3v32wcitGiven) - model->BSIM3v32wcit = 0.0; - if (!model->BSIM3v32wnfactorGiven) - model->BSIM3v32wnfactor = 0.0; - if (!model->BSIM3v32wxjGiven) - model->BSIM3v32wxj = 0.0; - if (!model->BSIM3v32wvsatGiven) - model->BSIM3v32wvsat = 0.0; - if (!model->BSIM3v32watGiven) - model->BSIM3v32wat = 0.0; - if (!model->BSIM3v32wa0Given) - model->BSIM3v32wa0 = 0.0; - if (!model->BSIM3v32wagsGiven) - model->BSIM3v32wags = 0.0; - if (!model->BSIM3v32wa1Given) - model->BSIM3v32wa1 = 0.0; - if (!model->BSIM3v32wa2Given) - model->BSIM3v32wa2 = 0.0; - if (!model->BSIM3v32wketaGiven) - model->BSIM3v32wketa = 0.0; - if (!model->BSIM3v32wnsubGiven) - model->BSIM3v32wnsub = 0.0; - if (!model->BSIM3v32wnpeakGiven) - model->BSIM3v32wnpeak = 0.0; - if (!model->BSIM3v32wngateGiven) - model->BSIM3v32wngate = 0.0; - if (!model->BSIM3v32wvbmGiven) - model->BSIM3v32wvbm = 0.0; - if (!model->BSIM3v32wxtGiven) - model->BSIM3v32wxt = 0.0; - if (!model->BSIM3v32wkt1Given) - model->BSIM3v32wkt1 = 0.0; - if (!model->BSIM3v32wkt1lGiven) - model->BSIM3v32wkt1l = 0.0; - if (!model->BSIM3v32wkt2Given) - model->BSIM3v32wkt2 = 0.0; - if (!model->BSIM3v32wk3Given) - model->BSIM3v32wk3 = 0.0; - if (!model->BSIM3v32wk3bGiven) - model->BSIM3v32wk3b = 0.0; - if (!model->BSIM3v32ww0Given) - model->BSIM3v32ww0 = 0.0; - if (!model->BSIM3v32wnlxGiven) - model->BSIM3v32wnlx = 0.0; - if (!model->BSIM3v32wdvt0Given) - model->BSIM3v32wdvt0 = 0.0; - if (!model->BSIM3v32wdvt1Given) - model->BSIM3v32wdvt1 = 0.0; - if (!model->BSIM3v32wdvt2Given) - model->BSIM3v32wdvt2 = 0.0; - if (!model->BSIM3v32wdvt0wGiven) - model->BSIM3v32wdvt0w = 0.0; - if (!model->BSIM3v32wdvt1wGiven) - model->BSIM3v32wdvt1w = 0.0; - if (!model->BSIM3v32wdvt2wGiven) - model->BSIM3v32wdvt2w = 0.0; - if (!model->BSIM3v32wdroutGiven) - model->BSIM3v32wdrout = 0.0; - if (!model->BSIM3v32wdsubGiven) - model->BSIM3v32wdsub = 0.0; - if (!model->BSIM3v32wvth0Given) - model->BSIM3v32wvth0 = 0.0; - if (!model->BSIM3v32wuaGiven) - model->BSIM3v32wua = 0.0; - if (!model->BSIM3v32wua1Given) - model->BSIM3v32wua1 = 0.0; - if (!model->BSIM3v32wubGiven) - model->BSIM3v32wub = 0.0; - if (!model->BSIM3v32wub1Given) - model->BSIM3v32wub1 = 0.0; - if (!model->BSIM3v32wucGiven) - model->BSIM3v32wuc = 0.0; - if (!model->BSIM3v32wuc1Given) - model->BSIM3v32wuc1 = 0.0; - if (!model->BSIM3v32wu0Given) - model->BSIM3v32wu0 = 0.0; - if (!model->BSIM3v32wuteGiven) - model->BSIM3v32wute = 0.0; - if (!model->BSIM3v32wvoffGiven) - model->BSIM3v32wvoff = 0.0; - if (!model->BSIM3v32wdeltaGiven) - model->BSIM3v32wdelta = 0.0; - if (!model->BSIM3v32wrdswGiven) - model->BSIM3v32wrdsw = 0.0; - if (!model->BSIM3v32wprwbGiven) - model->BSIM3v32wprwb = 0.0; - if (!model->BSIM3v32wprwgGiven) - model->BSIM3v32wprwg = 0.0; - if (!model->BSIM3v32wprtGiven) - model->BSIM3v32wprt = 0.0; - if (!model->BSIM3v32weta0Given) - model->BSIM3v32weta0 = 0.0; - if (!model->BSIM3v32wetabGiven) - model->BSIM3v32wetab = 0.0; - if (!model->BSIM3v32wpclmGiven) - model->BSIM3v32wpclm = 0.0; - if (!model->BSIM3v32wpdibl1Given) - model->BSIM3v32wpdibl1 = 0.0; - if (!model->BSIM3v32wpdibl2Given) - model->BSIM3v32wpdibl2 = 0.0; - if (!model->BSIM3v32wpdiblbGiven) - model->BSIM3v32wpdiblb = 0.0; - if (!model->BSIM3v32wpscbe1Given) - model->BSIM3v32wpscbe1 = 0.0; - if (!model->BSIM3v32wpscbe2Given) - model->BSIM3v32wpscbe2 = 0.0; - if (!model->BSIM3v32wpvagGiven) - model->BSIM3v32wpvag = 0.0; - if (!model->BSIM3v32wwrGiven) - model->BSIM3v32wwr = 0.0; - if (!model->BSIM3v32wdwgGiven) - model->BSIM3v32wdwg = 0.0; - if (!model->BSIM3v32wdwbGiven) - model->BSIM3v32wdwb = 0.0; - if (!model->BSIM3v32wb0Given) - model->BSIM3v32wb0 = 0.0; - if (!model->BSIM3v32wb1Given) - model->BSIM3v32wb1 = 0.0; - if (!model->BSIM3v32walpha0Given) - model->BSIM3v32walpha0 = 0.0; - if (!model->BSIM3v32walpha1Given) - model->BSIM3v32walpha1 = 0.0; - if (!model->BSIM3v32wbeta0Given) - model->BSIM3v32wbeta0 = 0.0; - if (!model->BSIM3v32wvfbGiven) - model->BSIM3v32wvfb = 0.0; - - if (!model->BSIM3v32welmGiven) - model->BSIM3v32welm = 0.0; - if (!model->BSIM3v32wcgslGiven) - model->BSIM3v32wcgsl = 0.0; - if (!model->BSIM3v32wcgdlGiven) - model->BSIM3v32wcgdl = 0.0; - if (!model->BSIM3v32wckappaGiven) - model->BSIM3v32wckappa = 0.0; - if (!model->BSIM3v32wcfGiven) - model->BSIM3v32wcf = 0.0; - if (!model->BSIM3v32wclcGiven) - model->BSIM3v32wclc = 0.0; - if (!model->BSIM3v32wcleGiven) - model->BSIM3v32wcle = 0.0; - if (!model->BSIM3v32wvfbcvGiven) - model->BSIM3v32wvfbcv = 0.0; - if (!model->BSIM3v32wacdeGiven) - model->BSIM3v32wacde = 0.0; - if (!model->BSIM3v32wmoinGiven) - model->BSIM3v32wmoin = 0.0; - if (!model->BSIM3v32wnoffGiven) - model->BSIM3v32wnoff = 0.0; - if (!model->BSIM3v32wvoffcvGiven) - model->BSIM3v32wvoffcv = 0.0; - - /* Cross-term dependence */ - if (!model->BSIM3v32pcdscGiven) - model->BSIM3v32pcdsc = 0.0; - if (!model->BSIM3v32pcdscbGiven) - model->BSIM3v32pcdscb = 0.0; - if (!model->BSIM3v32pcdscdGiven) - model->BSIM3v32pcdscd = 0.0; - if (!model->BSIM3v32pcitGiven) - model->BSIM3v32pcit = 0.0; - if (!model->BSIM3v32pnfactorGiven) - model->BSIM3v32pnfactor = 0.0; - if (!model->BSIM3v32pxjGiven) - model->BSIM3v32pxj = 0.0; - if (!model->BSIM3v32pvsatGiven) - model->BSIM3v32pvsat = 0.0; - if (!model->BSIM3v32patGiven) - model->BSIM3v32pat = 0.0; - if (!model->BSIM3v32pa0Given) - model->BSIM3v32pa0 = 0.0; - - if (!model->BSIM3v32pagsGiven) - model->BSIM3v32pags = 0.0; - if (!model->BSIM3v32pa1Given) - model->BSIM3v32pa1 = 0.0; - if (!model->BSIM3v32pa2Given) - model->BSIM3v32pa2 = 0.0; - if (!model->BSIM3v32pketaGiven) - model->BSIM3v32pketa = 0.0; - if (!model->BSIM3v32pnsubGiven) - model->BSIM3v32pnsub = 0.0; - if (!model->BSIM3v32pnpeakGiven) - model->BSIM3v32pnpeak = 0.0; - if (!model->BSIM3v32pngateGiven) - model->BSIM3v32pngate = 0.0; - if (!model->BSIM3v32pvbmGiven) - model->BSIM3v32pvbm = 0.0; - if (!model->BSIM3v32pxtGiven) - model->BSIM3v32pxt = 0.0; - if (!model->BSIM3v32pkt1Given) - model->BSIM3v32pkt1 = 0.0; - if (!model->BSIM3v32pkt1lGiven) - model->BSIM3v32pkt1l = 0.0; - if (!model->BSIM3v32pkt2Given) - model->BSIM3v32pkt2 = 0.0; - if (!model->BSIM3v32pk3Given) - model->BSIM3v32pk3 = 0.0; - if (!model->BSIM3v32pk3bGiven) - model->BSIM3v32pk3b = 0.0; - if (!model->BSIM3v32pw0Given) - model->BSIM3v32pw0 = 0.0; - if (!model->BSIM3v32pnlxGiven) - model->BSIM3v32pnlx = 0.0; - if (!model->BSIM3v32pdvt0Given) - model->BSIM3v32pdvt0 = 0.0; - if (!model->BSIM3v32pdvt1Given) - model->BSIM3v32pdvt1 = 0.0; - if (!model->BSIM3v32pdvt2Given) - model->BSIM3v32pdvt2 = 0.0; - if (!model->BSIM3v32pdvt0wGiven) - model->BSIM3v32pdvt0w = 0.0; - if (!model->BSIM3v32pdvt1wGiven) - model->BSIM3v32pdvt1w = 0.0; - if (!model->BSIM3v32pdvt2wGiven) - model->BSIM3v32pdvt2w = 0.0; - if (!model->BSIM3v32pdroutGiven) - model->BSIM3v32pdrout = 0.0; - if (!model->BSIM3v32pdsubGiven) - model->BSIM3v32pdsub = 0.0; - if (!model->BSIM3v32pvth0Given) - model->BSIM3v32pvth0 = 0.0; - if (!model->BSIM3v32puaGiven) - model->BSIM3v32pua = 0.0; - if (!model->BSIM3v32pua1Given) - model->BSIM3v32pua1 = 0.0; - if (!model->BSIM3v32pubGiven) - model->BSIM3v32pub = 0.0; - if (!model->BSIM3v32pub1Given) - model->BSIM3v32pub1 = 0.0; - if (!model->BSIM3v32pucGiven) - model->BSIM3v32puc = 0.0; - if (!model->BSIM3v32puc1Given) - model->BSIM3v32puc1 = 0.0; - if (!model->BSIM3v32pu0Given) - model->BSIM3v32pu0 = 0.0; - if (!model->BSIM3v32puteGiven) - model->BSIM3v32pute = 0.0; - if (!model->BSIM3v32pvoffGiven) - model->BSIM3v32pvoff = 0.0; - if (!model->BSIM3v32pdeltaGiven) - model->BSIM3v32pdelta = 0.0; - if (!model->BSIM3v32prdswGiven) - model->BSIM3v32prdsw = 0.0; - if (!model->BSIM3v32pprwbGiven) - model->BSIM3v32pprwb = 0.0; - if (!model->BSIM3v32pprwgGiven) - model->BSIM3v32pprwg = 0.0; - if (!model->BSIM3v32pprtGiven) - model->BSIM3v32pprt = 0.0; - if (!model->BSIM3v32peta0Given) - model->BSIM3v32peta0 = 0.0; - if (!model->BSIM3v32petabGiven) - model->BSIM3v32petab = 0.0; - if (!model->BSIM3v32ppclmGiven) - model->BSIM3v32ppclm = 0.0; - if (!model->BSIM3v32ppdibl1Given) - model->BSIM3v32ppdibl1 = 0.0; - if (!model->BSIM3v32ppdibl2Given) - model->BSIM3v32ppdibl2 = 0.0; - if (!model->BSIM3v32ppdiblbGiven) - model->BSIM3v32ppdiblb = 0.0; - if (!model->BSIM3v32ppscbe1Given) - model->BSIM3v32ppscbe1 = 0.0; - if (!model->BSIM3v32ppscbe2Given) - model->BSIM3v32ppscbe2 = 0.0; - if (!model->BSIM3v32ppvagGiven) - model->BSIM3v32ppvag = 0.0; - if (!model->BSIM3v32pwrGiven) - model->BSIM3v32pwr = 0.0; - if (!model->BSIM3v32pdwgGiven) - model->BSIM3v32pdwg = 0.0; - if (!model->BSIM3v32pdwbGiven) - model->BSIM3v32pdwb = 0.0; - if (!model->BSIM3v32pb0Given) - model->BSIM3v32pb0 = 0.0; - if (!model->BSIM3v32pb1Given) - model->BSIM3v32pb1 = 0.0; - if (!model->BSIM3v32palpha0Given) - model->BSIM3v32palpha0 = 0.0; - if (!model->BSIM3v32palpha1Given) - model->BSIM3v32palpha1 = 0.0; - if (!model->BSIM3v32pbeta0Given) - model->BSIM3v32pbeta0 = 0.0; - if (!model->BSIM3v32pvfbGiven) - model->BSIM3v32pvfb = 0.0; - - if (!model->BSIM3v32pelmGiven) - model->BSIM3v32pelm = 0.0; - if (!model->BSIM3v32pcgslGiven) - model->BSIM3v32pcgsl = 0.0; - if (!model->BSIM3v32pcgdlGiven) - model->BSIM3v32pcgdl = 0.0; - if (!model->BSIM3v32pckappaGiven) - model->BSIM3v32pckappa = 0.0; - if (!model->BSIM3v32pcfGiven) - model->BSIM3v32pcf = 0.0; - if (!model->BSIM3v32pclcGiven) - model->BSIM3v32pclc = 0.0; - if (!model->BSIM3v32pcleGiven) - model->BSIM3v32pcle = 0.0; - if (!model->BSIM3v32pvfbcvGiven) - model->BSIM3v32pvfbcv = 0.0; - if (!model->BSIM3v32pacdeGiven) - model->BSIM3v32pacde = 0.0; - if (!model->BSIM3v32pmoinGiven) - model->BSIM3v32pmoin = 0.0; - if (!model->BSIM3v32pnoffGiven) - model->BSIM3v32pnoff = 0.0; - if (!model->BSIM3v32pvoffcvGiven) - model->BSIM3v32pvoffcv = 0.0; - - /* unit degree celcius */ - if (!model->BSIM3v32tnomGiven) - model->BSIM3v32tnom = ckt->CKTnomTemp; -/* else - model->BSIM3v32tnom = model->BSIM3v32tnom + 273.15; we make this transform in b3v32mpar.c in the first run */ - if (!model->BSIM3v32LintGiven) - model->BSIM3v32Lint = 0.0; - if (!model->BSIM3v32LlGiven) - model->BSIM3v32Ll = 0.0; - if (!model->BSIM3v32LlcGiven) - model->BSIM3v32Llc = model->BSIM3v32Ll; - if (!model->BSIM3v32LlnGiven) - model->BSIM3v32Lln = 1.0; - if (!model->BSIM3v32LwGiven) - model->BSIM3v32Lw = 0.0; - if (!model->BSIM3v32LwcGiven) - model->BSIM3v32Lwc = model->BSIM3v32Lw; - if (!model->BSIM3v32LwnGiven) - model->BSIM3v32Lwn = 1.0; - if (!model->BSIM3v32LwlGiven) - model->BSIM3v32Lwl = 0.0; - if (!model->BSIM3v32LwlcGiven) - model->BSIM3v32Lwlc = model->BSIM3v32Lwl; - if (!model->BSIM3v32LminGiven) - model->BSIM3v32Lmin = 0.0; - if (!model->BSIM3v32LmaxGiven) - model->BSIM3v32Lmax = 1.0; - if (!model->BSIM3v32WintGiven) - model->BSIM3v32Wint = 0.0; - if (!model->BSIM3v32WlGiven) - model->BSIM3v32Wl = 0.0; - if (!model->BSIM3v32WlcGiven) - model->BSIM3v32Wlc = model->BSIM3v32Wl; - if (!model->BSIM3v32WlnGiven) - model->BSIM3v32Wln = 1.0; - if (!model->BSIM3v32WwGiven) - model->BSIM3v32Ww = 0.0; - if (!model->BSIM3v32WwcGiven) - model->BSIM3v32Wwc = model->BSIM3v32Ww; - if (!model->BSIM3v32WwnGiven) - model->BSIM3v32Wwn = 1.0; - if (!model->BSIM3v32WwlGiven) - model->BSIM3v32Wwl = 0.0; - if (!model->BSIM3v32WwlcGiven) - model->BSIM3v32Wwlc = model->BSIM3v32Wwl; - if (!model->BSIM3v32WminGiven) - model->BSIM3v32Wmin = 0.0; - if (!model->BSIM3v32WmaxGiven) - model->BSIM3v32Wmax = 1.0; - if (!model->BSIM3v32dwcGiven) - model->BSIM3v32dwc = model->BSIM3v32Wint; - if (!model->BSIM3v32dlcGiven) - model->BSIM3v32dlc = model->BSIM3v32Lint; - - if (!model->BSIM3v32xlGiven) - model->BSIM3v32xl = 0.0; - if (!model->BSIM3v32xwGiven) - model->BSIM3v32xw = 0.0; - - if (!model->BSIM3v32cfGiven) - model->BSIM3v32cf = 2.0 * EPSOX / PI - * log(1.0 + 0.4e-6 / model->BSIM3v32tox); - if (!model->BSIM3v32cgdoGiven) - { if (model->BSIM3v32dlcGiven && (model->BSIM3v32dlc > 0.0)) - { model->BSIM3v32cgdo = model->BSIM3v32dlc * model->BSIM3v32cox - - model->BSIM3v32cgdl ; - } - else - model->BSIM3v32cgdo = 0.6 * model->BSIM3v32xj * model->BSIM3v32cox; - } - if (!model->BSIM3v32cgsoGiven) - { if (model->BSIM3v32dlcGiven && (model->BSIM3v32dlc > 0.0)) - { model->BSIM3v32cgso = model->BSIM3v32dlc * model->BSIM3v32cox - - model->BSIM3v32cgsl ; - } - else - model->BSIM3v32cgso = 0.6 * model->BSIM3v32xj * model->BSIM3v32cox; - } - - if (!model->BSIM3v32cgboGiven) - { model->BSIM3v32cgbo = 2.0 * model->BSIM3v32dwc * model->BSIM3v32cox; - } - if (!model->BSIM3v32xpartGiven) - model->BSIM3v32xpart = 0.0; - if (!model->BSIM3v32sheetResistanceGiven) - model->BSIM3v32sheetResistance = 0.0; - if (!model->BSIM3v32unitAreaJctCapGiven) - model->BSIM3v32unitAreaJctCap = 5.0E-4; - if (!model->BSIM3v32unitLengthSidewallJctCapGiven) - model->BSIM3v32unitLengthSidewallJctCap = 5.0E-10; - if (!model->BSIM3v32unitLengthGateSidewallJctCapGiven) - model->BSIM3v32unitLengthGateSidewallJctCap = model->BSIM3v32unitLengthSidewallJctCap ; - if (!model->BSIM3v32jctSatCurDensityGiven) - model->BSIM3v32jctSatCurDensity = 1.0E-4; - if (!model->BSIM3v32jctSidewallSatCurDensityGiven) - model->BSIM3v32jctSidewallSatCurDensity = 0.0; - if (!model->BSIM3v32bulkJctPotentialGiven) - model->BSIM3v32bulkJctPotential = 1.0; - if (!model->BSIM3v32sidewallJctPotentialGiven) - model->BSIM3v32sidewallJctPotential = 1.0; - if (!model->BSIM3v32GatesidewallJctPotentialGiven) - model->BSIM3v32GatesidewallJctPotential = model->BSIM3v32sidewallJctPotential; - if (!model->BSIM3v32bulkJctBotGradingCoeffGiven) - model->BSIM3v32bulkJctBotGradingCoeff = 0.5; - if (!model->BSIM3v32bulkJctSideGradingCoeffGiven) - model->BSIM3v32bulkJctSideGradingCoeff = 0.33; - if (!model->BSIM3v32bulkJctGateSideGradingCoeffGiven) - model->BSIM3v32bulkJctGateSideGradingCoeff = model->BSIM3v32bulkJctSideGradingCoeff; - if (!model->BSIM3v32jctEmissionCoeffGiven) - model->BSIM3v32jctEmissionCoeff = 1.0; - if (!model->BSIM3v32jctTempExponentGiven) - model->BSIM3v32jctTempExponent = 3.0; - if (!model->BSIM3v32oxideTrapDensityAGiven) - { if (model->BSIM3v32type == NMOS) - model->BSIM3v32oxideTrapDensityA = 1e20; - else - model->BSIM3v32oxideTrapDensityA=9.9e18; - } - if (!model->BSIM3v32oxideTrapDensityBGiven) - { if (model->BSIM3v32type == NMOS) - model->BSIM3v32oxideTrapDensityB = 5e4; - else - model->BSIM3v32oxideTrapDensityB = 2.4e3; - } - if (!model->BSIM3v32oxideTrapDensityCGiven) - { if (model->BSIM3v32type == NMOS) - model->BSIM3v32oxideTrapDensityC = -1.4e-12; - else - model->BSIM3v32oxideTrapDensityC = 1.4e-12; - - } - if (!model->BSIM3v32emGiven) - model->BSIM3v32em = 4.1e7; /* V/m */ - if (!model->BSIM3v32efGiven) - model->BSIM3v32ef = 1.0; - if (!model->BSIM3v32afGiven) - model->BSIM3v32af = 1.0; - if (!model->BSIM3v32kfGiven) - model->BSIM3v32kf = 0.0; - - if (!model->BSIM3v32vgsMaxGiven) - model->BSIM3v32vgsMax = 1e99; - if (!model->BSIM3v32vgdMaxGiven) - model->BSIM3v32vgdMax = 1e99; - if (!model->BSIM3v32vgbMaxGiven) - model->BSIM3v32vgbMax = 1e99; - if (!model->BSIM3v32vdsMaxGiven) - model->BSIM3v32vdsMax = 1e99; - if (!model->BSIM3v32vbsMaxGiven) - model->BSIM3v32vbsMax = 1e99; - if (!model->BSIM3v32vbdMaxGiven) - model->BSIM3v32vbdMax = 1e99; - if (!model->BSIM3v32vgsrMaxGiven) - model->BSIM3v32vgsrMax = 1e99; - if (!model->BSIM3v32vgdrMaxGiven) - model->BSIM3v32vgdrMax = 1e99; - if (!model->BSIM3v32vgbrMaxGiven) - model->BSIM3v32vgbrMax = 1e99; - if (!model->BSIM3v32vbsrMaxGiven) - model->BSIM3v32vbsrMax = 1e99; - if (!model->BSIM3v32vbdrMaxGiven) - model->BSIM3v32vbdrMax = 1e99; - - /* loop through all the instances of the model */ - for (here = BSIM3v32instances(model); here != NULL ; - here=BSIM3v32nextInstance(here)) - { - /* allocate a chunk of the state vector */ - here->BSIM3v32states = *states; - *states += BSIM3v32numStates; - - /* perform the parameter defaulting */ - if (!here->BSIM3v32drainAreaGiven) - here->BSIM3v32drainArea = 0.0; - if (!here->BSIM3v32drainPerimeterGiven) - here->BSIM3v32drainPerimeter = 0.0; - if (!here->BSIM3v32drainSquaresGiven) - { - if (model->BSIM3v32acmMod == 0) - here->BSIM3v32drainSquares = 1.0; - else - here->BSIM3v32drainSquares = 0.0; - } - if (!here->BSIM3v32delvtoGiven) - here->BSIM3v32delvto = 0.0; - if (!here->BSIM3v32mulu0Given) - here->BSIM3v32mulu0 = 1.0; - if (!here->BSIM3v32icVBSGiven) - here->BSIM3v32icVBS = 0.0; - if (!here->BSIM3v32icVDSGiven) - here->BSIM3v32icVDS = 0.0; - if (!here->BSIM3v32icVGSGiven) - here->BSIM3v32icVGS = 0.0; - if (!here->BSIM3v32lGiven) - here->BSIM3v32l = 5.0e-6; - if (!here->BSIM3v32sourceAreaGiven) - here->BSIM3v32sourceArea = 0.0; - if (!here->BSIM3v32sourcePerimeterGiven) - here->BSIM3v32sourcePerimeter = 0.0; - if (!here->BSIM3v32sourceSquaresGiven) - { - if (model->BSIM3v32acmMod == 0) - here->BSIM3v32sourceSquares = 1.0; - else - here->BSIM3v32sourceSquares = 0.0; - } - if (!here->BSIM3v32wGiven) - here->BSIM3v32w = 5.0e-6; - if (!here->BSIM3v32nqsModGiven) - here->BSIM3v32nqsMod = model->BSIM3v32nqsMod; - else if ((here->BSIM3v32nqsMod != 0) && (here->BSIM3v32nqsMod != 1)) - { here->BSIM3v32nqsMod = model->BSIM3v32nqsMod; - printf("Warning: nqsMod has been set to its global value %d.\n", - model->BSIM3v32nqsMod); - } - if (!here->BSIM3v32geoGiven) - here->BSIM3v32geo = 0; - - if (!here->BSIM3v32mGiven) - here->BSIM3v32m = 1; - - /* process source/drain series resistance */ - /* ACM model */ - - double DrainResistance, SourceResistance; - - if (model->BSIM3v32acmMod == 0) - { - DrainResistance = model->BSIM3v32sheetResistance - * here->BSIM3v32drainSquares; - SourceResistance = model->BSIM3v32sheetResistance - * here->BSIM3v32sourceSquares; - } - else /* ACM > 0 */ - { - error = ACM_SourceDrainResistances( - model->BSIM3v32acmMod, - model->BSIM3v32ld, - model->BSIM3v32ldif, - model->BSIM3v32hdif, - model->BSIM3v32wmlt, - here->BSIM3v32w, - model->BSIM3v32xw, - model->BSIM3v32sheetResistance, - here->BSIM3v32drainSquaresGiven, - model->BSIM3v32rd, - model->BSIM3v32rdc, - here->BSIM3v32drainSquares, - here->BSIM3v32sourceSquaresGiven, - model->BSIM3v32rs, - model->BSIM3v32rsc, - here->BSIM3v32sourceSquares, - &DrainResistance, - &SourceResistance - ); - if (error) - return(error); - } - - /* process drain series resistance */ - if (DrainResistance != 0) - { - if(here->BSIM3v32dNodePrime == 0) { - error = CKTmkVolt(ckt,&tmp,here->BSIM3v32name,"drain"); - if(error) return(error); - here->BSIM3v32dNodePrime = tmp->number; - if (ckt->CKTcopyNodesets) { - if (CKTinst2Node(ckt,here,1,&tmpNode,&tmpName)==OK) { - if (tmpNode->nsGiven) { - tmp->nodeset=tmpNode->nodeset; - tmp->nsGiven=tmpNode->nsGiven; - } - } - } - } - } - else - { here->BSIM3v32dNodePrime = here->BSIM3v32dNode; - } - - /* process source series resistance */ - if (SourceResistance != 0) - { - if(here->BSIM3v32sNodePrime == 0) { - error = CKTmkVolt(ckt,&tmp,here->BSIM3v32name,"source"); - if(error) return(error); - here->BSIM3v32sNodePrime = tmp->number; - if (ckt->CKTcopyNodesets) { - if (CKTinst2Node(ckt,here,3,&tmpNode,&tmpName)==OK) { - if (tmpNode->nsGiven) { - tmp->nodeset=tmpNode->nodeset; - tmp->nsGiven=tmpNode->nsGiven; - } - } - } - } - } - else - { here->BSIM3v32sNodePrime = here->BSIM3v32sNode; - } - - /* internal charge node */ - - if (here->BSIM3v32nqsMod) - { if(here->BSIM3v32qNode == 0) - { error = CKTmkVolt(ckt,&tmp,here->BSIM3v32name,"charge"); - if(error) return(error); - here->BSIM3v32qNode = tmp->number; - } - } - else - { here->BSIM3v32qNode = 0; - } - - /* Channel length scaling with lmlt model parameter */ - - if (model->BSIM3v32lmltGiven) - here->BSIM3v32l *= model->BSIM3v32lmlt; - - /* set Sparse Matrix Pointers */ - -/* macro to make elements with built in test for out of memory */ -#define TSTALLOC(ptr,first,second) \ -do { if((here->ptr = SMPmakeElt(matrix, here->first, here->second)) == NULL){\ - return(E_NOMEM);\ -} } while(0) - - TSTALLOC(BSIM3v32DdPtr, BSIM3v32dNode, BSIM3v32dNode); - TSTALLOC(BSIM3v32GgPtr, BSIM3v32gNode, BSIM3v32gNode); - TSTALLOC(BSIM3v32SsPtr, BSIM3v32sNode, BSIM3v32sNode); - TSTALLOC(BSIM3v32BbPtr, BSIM3v32bNode, BSIM3v32bNode); - TSTALLOC(BSIM3v32DPdpPtr, BSIM3v32dNodePrime, BSIM3v32dNodePrime); - TSTALLOC(BSIM3v32SPspPtr, BSIM3v32sNodePrime, BSIM3v32sNodePrime); - TSTALLOC(BSIM3v32DdpPtr, BSIM3v32dNode, BSIM3v32dNodePrime); - TSTALLOC(BSIM3v32GbPtr, BSIM3v32gNode, BSIM3v32bNode); - TSTALLOC(BSIM3v32GdpPtr, BSIM3v32gNode, BSIM3v32dNodePrime); - TSTALLOC(BSIM3v32GspPtr, BSIM3v32gNode, BSIM3v32sNodePrime); - TSTALLOC(BSIM3v32SspPtr, BSIM3v32sNode, BSIM3v32sNodePrime); - TSTALLOC(BSIM3v32BdpPtr, BSIM3v32bNode, BSIM3v32dNodePrime); - TSTALLOC(BSIM3v32BspPtr, BSIM3v32bNode, BSIM3v32sNodePrime); - TSTALLOC(BSIM3v32DPspPtr, BSIM3v32dNodePrime, BSIM3v32sNodePrime); - TSTALLOC(BSIM3v32DPdPtr, BSIM3v32dNodePrime, BSIM3v32dNode); - TSTALLOC(BSIM3v32BgPtr, BSIM3v32bNode, BSIM3v32gNode); - TSTALLOC(BSIM3v32DPgPtr, BSIM3v32dNodePrime, BSIM3v32gNode); - TSTALLOC(BSIM3v32SPgPtr, BSIM3v32sNodePrime, BSIM3v32gNode); - TSTALLOC(BSIM3v32SPsPtr, BSIM3v32sNodePrime, BSIM3v32sNode); - TSTALLOC(BSIM3v32DPbPtr, BSIM3v32dNodePrime, BSIM3v32bNode); - TSTALLOC(BSIM3v32SPbPtr, BSIM3v32sNodePrime, BSIM3v32bNode); - TSTALLOC(BSIM3v32SPdpPtr, BSIM3v32sNodePrime, BSIM3v32dNodePrime); - - TSTALLOC(BSIM3v32QqPtr, BSIM3v32qNode, BSIM3v32qNode); - - TSTALLOC(BSIM3v32QdpPtr, BSIM3v32qNode, BSIM3v32dNodePrime); - TSTALLOC(BSIM3v32QspPtr, BSIM3v32qNode, BSIM3v32sNodePrime); - TSTALLOC(BSIM3v32QgPtr, BSIM3v32qNode, BSIM3v32gNode); - TSTALLOC(BSIM3v32QbPtr, BSIM3v32qNode, BSIM3v32bNode); - TSTALLOC(BSIM3v32DPqPtr, BSIM3v32dNodePrime, BSIM3v32qNode); - TSTALLOC(BSIM3v32SPqPtr, BSIM3v32sNodePrime, BSIM3v32qNode); - TSTALLOC(BSIM3v32GqPtr, BSIM3v32gNode, BSIM3v32qNode); - TSTALLOC(BSIM3v32BqPtr, BSIM3v32bNode, BSIM3v32qNode); - - } - } -#ifdef USE_OMP - InstCount = 0; - model = (BSIM3v32model*)inModel; - /* loop through all the BSIM3 device models - to count the number of instances */ - - for (; model != NULL; model = BSIM3v32nextModel(model)) - { - /* loop through all the instances of the model */ - for (here = BSIM3v32instances(model); here != NULL; - here = BSIM3v32nextInstance(here)) - { - InstCount++; - } - model->BSIM3v32InstCount = 0; - model->BSIM3v32InstanceArray = NULL; - } - InstArray = TMALLOC(BSIM3v32instance*, InstCount); - model = (BSIM3v32model*)inModel; - /* store this in the first model only */ - model->BSIM3v32InstCount = InstCount; - model->BSIM3v32InstanceArray = InstArray; - idx = 0; - for (; model != NULL; model = BSIM3v32nextModel(model)) - { - /* loop through all the instances of the model */ - for (here = BSIM3v32instances(model); here != NULL; - here = BSIM3v32nextInstance(here)) - { - InstArray[idx] = here; - idx++; - } - } - -#endif - return(OK); -} - -int -BSIM3v32unsetup( - GENmodel *inModel, - CKTcircuit *ckt) -{ - BSIM3v32model *model; - BSIM3v32instance *here; - -#ifdef USE_OMP - model = (BSIM3v32model*)inModel; - tfree(model->BSIM3v32InstanceArray); -#endif - - for (model = (BSIM3v32model *)inModel; model != NULL; - model = BSIM3v32nextModel(model)) - { - for (here = BSIM3v32instances(model); here != NULL; - here=BSIM3v32nextInstance(here)) - { - if (here->BSIM3v32qNode > 0) - CKTdltNNum(ckt, here->BSIM3v32qNode); - here->BSIM3v32qNode = 0; - - if (here->BSIM3v32sNodePrime > 0 - && here->BSIM3v32sNodePrime != here->BSIM3v32sNode) - CKTdltNNum(ckt, here->BSIM3v32sNodePrime); - here->BSIM3v32sNodePrime = 0; - - if (here->BSIM3v32dNodePrime > 0 - && here->BSIM3v32dNodePrime != here->BSIM3v32dNode) - CKTdltNNum(ckt, here->BSIM3v32dNodePrime); - here->BSIM3v32dNodePrime = 0; - } - } - return OK; -} - - - - - - diff --git a/src/spicelib/devices/bsim3v32/b3v32soachk.c b/src/spicelib/devices/bsim3v32/b3v32soachk.c deleted file mode 100644 index 52ed26a74..000000000 --- a/src/spicelib/devices/bsim3v32/b3v32soachk.c +++ /dev/null @@ -1,341 +0,0 @@ -/********** -Copyright 2013 Dietmar Warning. All rights reserved. -Author: 2013 Dietmar Warning -**********/ - -#include "ngspice/ngspice.h" -#include "ngspice/cktdefs.h" -#include "bsim3v32def.h" -#include "ngspice/trandefs.h" -#include "ngspice/sperror.h" -#include "ngspice/suffix.h" -#include "ngspice/cpdefs.h" - - -int -BSIM3v32soaCheck(CKTcircuit *ckt, GENmodel *inModel) -{ - BSIM3v32model *model = (BSIM3v32model *) inModel; - BSIM3v32instance *here; - double vgs, vgd, vgb, vds, vbs, vbd; /* actual mos voltages */ - int maxwarns; - static int warns_vgs = 0, warns_vgd = 0, warns_vgb = 0, warns_vds = 0, warns_vbs = 0, warns_vbd = 0; - - if (!ckt) { - warns_vgs = 0; - warns_vgd = 0; - warns_vgb = 0; - warns_vds = 0; - warns_vbs = 0; - warns_vbd = 0; - return OK; - } - - maxwarns = ckt->CKTsoaMaxWarns; - - for (; model; model = BSIM3v32nextModel(model)) { - - for (here = BSIM3v32instances(model); here; here = BSIM3v32nextInstance(here)) { - - vgs = ckt->CKTrhsOld [here->BSIM3v32gNode] - - ckt->CKTrhsOld [here->BSIM3v32sNodePrime]; - - vgd = ckt->CKTrhsOld [here->BSIM3v32gNode] - - ckt->CKTrhsOld [here->BSIM3v32dNodePrime]; - - vgb = ckt->CKTrhsOld [here->BSIM3v32gNode] - - ckt->CKTrhsOld [here->BSIM3v32bNode]; - - vds = ckt->CKTrhsOld [here->BSIM3v32dNodePrime] - - ckt->CKTrhsOld [here->BSIM3v32sNodePrime]; - - vbs = ckt->CKTrhsOld [here->BSIM3v32bNode] - - ckt->CKTrhsOld [here->BSIM3v32sNodePrime]; - - vbd = ckt->CKTrhsOld [here->BSIM3v32bNode] - - ckt->CKTrhsOld [here->BSIM3v32dNodePrime]; - - if (!model->BSIM3v32vgsrMaxGiven) { - if (fabs(vgs) > model->BSIM3v32vgsMax) - if (warns_vgs < maxwarns) { - soa_printf(ckt, (GENinstance*) here, - "Vgs=%g has exceeded Vgs_max=%g\n", - vgs, model->BSIM3v32vgsMax); - warns_vgs++; - } - if (!model->BSIM3v32vgbMaxGiven) { - if (fabs(vgb) > model->BSIM3v32vgsMax) - if (warns_vgb < maxwarns) { - soa_printf(ckt, (GENinstance*) here, - "Vgb=%g has exceeded Vgs_max=%g\n", - vgb, model->BSIM3v32vgsMax); - warns_vgb++; - } - } else { - if (fabs(vgb) > model->BSIM3v32vgbMax) - if (warns_vgb < maxwarns) { - soa_printf(ckt, (GENinstance*) here, - "Vgb=%g has exceeded Vgb_max=%g\n", - vgb, model->BSIM3v32vgbMax); - warns_vgb++; - } - } - } else { - if (model->BSIM3v32type > 0) { - if (vgs > model->BSIM3v32vgsMax) - if (warns_vgs < maxwarns) { - soa_printf(ckt, (GENinstance*) here, - "Vgs=%g has exceeded Vgs_max=%g\n", - vgs, model->BSIM3v32vgsMax); - warns_vgs++; - } - if (-1*vgs > model->BSIM3v32vgsrMax) - if (warns_vgs < maxwarns) { - soa_printf(ckt, (GENinstance*) here, - "Vgs=%g has exceeded Vgsr_max=%g\n", - vgs, model->BSIM3v32vgsrMax); - warns_vgs++; - } - } else { - if (vgs > model->BSIM3v32vgsrMax) - if (warns_vgs < maxwarns) { - soa_printf(ckt, (GENinstance*) here, - "Vgs=%g has exceeded Vgsr_max=%g\n", - vgs, model->BSIM3v32vgsrMax); - warns_vgs++; - } - if (-1*vgs > model->BSIM3v32vgsMax) - if (warns_vgs < maxwarns) { - soa_printf(ckt, (GENinstance*) here, - "Vgs=%g has exceeded Vgs_max=%g\n", - vgs, model->BSIM3v32vgsMax); - warns_vgs++; - } - } - } - - if (!model->BSIM3v32vgdrMaxGiven) { - if (fabs(vgd) > model->BSIM3v32vgdMax) - if (warns_vgd < maxwarns) { - soa_printf(ckt, (GENinstance*) here, - "Vgd=%g has exceeded Vgd_max=%g\n", - vgd, model->BSIM3v32vgdMax); - warns_vgd++; - } - } else { - if (model->BSIM3v32type > 0) { - if (vgd > model->BSIM3v32vgdMax) - if (warns_vgd < maxwarns) { - soa_printf(ckt, (GENinstance*) here, - "Vgd=%g has exceeded Vgd_max=%g\n", - vgd, model->BSIM3v32vgdMax); - warns_vgd++; - } - if (-1*vgd > model->BSIM3v32vgdrMax) - if (warns_vgd < maxwarns) { - soa_printf(ckt, (GENinstance*) here, - "Vgd=%g has exceeded Vgdr_max=%g\n", - vgd, model->BSIM3v32vgdrMax); - warns_vgd++; - } - } else { - if (vgd > model->BSIM3v32vgdrMax) - if (warns_vgd < maxwarns) { - soa_printf(ckt, (GENinstance*) here, - "Vgd=%g has exceeded Vgdr_max=%g\n", - vgd, model->BSIM3v32vgdrMax); - warns_vgd++; - } - if (-1*vgd > model->BSIM3v32vgdMax) - if (warns_vgd < maxwarns) { - soa_printf(ckt, (GENinstance*) here, - "Vgd=%g has exceeded Vgd_max=%g\n", - vgd, model->BSIM3v32vgdMax); - warns_vgd++; - } - } - } - - if (fabs(vds) > model->BSIM3v32vdsMax) - if (warns_vds < maxwarns) { - soa_printf(ckt, (GENinstance*) here, - "Vds=%g has exceeded Vds_max=%g\n", - vds, model->BSIM3v32vdsMax); - warns_vds++; - } - - if (!model->BSIM3v32vgbrMaxGiven) { - if (fabs(vgb) > model->BSIM3v32vgbMax) - if (warns_vgb < maxwarns) { - soa_printf(ckt, (GENinstance*) here, - "Vgb=%g has exceeded Vgb_max=%g\n", - vgb, model->BSIM3v32vgbMax); - warns_vgb++; - } - } else { - if (model->BSIM3v32type > 0) { - if (vgb > model->BSIM3v32vgbMax) - if (warns_vgb < maxwarns) { - soa_printf(ckt, (GENinstance*) here, - "Vgb=%g has exceeded Vgb_max=%g\n", - vgb, model->BSIM3v32vgbMax); - warns_vgb++; - } - if (-1*vgb > model->BSIM3v32vgbrMax) - if (warns_vgb < maxwarns) { - soa_printf(ckt, (GENinstance*) here, - "Vgb=%g has exceeded Vgbr_max=%g\n", - vgb, model->BSIM3v32vgbrMax); - warns_vgb++; - } - } else { - if (vgb > model->BSIM3v32vgbrMax) - if (warns_vgb < maxwarns) { - soa_printf(ckt, (GENinstance*) here, - "Vgb=%g has exceeded Vgbr_max=%g\n", - vgb, model->BSIM3v32vgbrMax); - warns_vgb++; - } - if (-1*vgb > model->BSIM3v32vgbMax) - if (warns_vgb < maxwarns) { - soa_printf(ckt, (GENinstance*) here, - "Vgb=%g has exceeded Vgb_max=%g\n", - vgb, model->BSIM3v32vgbMax); - warns_vgb++; - } - } - } - - if (!model->BSIM3v32vbsrMaxGiven) { - if (!model->BSIM3v32vbsMaxGiven) { - if (fabs(vbs) > model->BSIM3v32vbdMax) - if (warns_vbs < maxwarns) { - soa_printf(ckt, (GENinstance*) here, - "Vbs=%g has exceeded Vbd_max=%g\n", - vbs, model->BSIM3v32vbdMax); - warns_vbs++; - } - } else { - if (fabs(vbs) > model->BSIM3v32vbsMax) - if (warns_vbs < maxwarns) { - soa_printf(ckt, (GENinstance*) here, - "Vbs=%g has exceeded Vbs_max=%g\n", - vbs, model->BSIM3v32vbsMax); - warns_vbs++; - } - } - } else { - if (!model->BSIM3v32vbsMaxGiven) { - if (model->BSIM3v32type > 0) { - if (vbs > model->BSIM3v32vbdMax) - if (warns_vbs < maxwarns) { - soa_printf(ckt, (GENinstance*) here, - "Vbs=%g has exceeded Vbd_max=%g\n", - vbs, model->BSIM3v32vbdMax); - warns_vbs++; - } - if (-1*vbs > model->BSIM3v32vbsrMax) - if (warns_vbs < maxwarns) { - soa_printf(ckt, (GENinstance*) here, - "Vbs=%g has exceeded Vbsr_max=%g\n", - vbs, model->BSIM3v32vbsrMax); - warns_vbs++; - } - } else { - if (vbs > model->BSIM3v32vbsrMax) - if (warns_vbs < maxwarns) { - soa_printf(ckt, (GENinstance*) here, - "Vbs=%g has exceeded Vbsr_max=%g\n", - vbs, model->BSIM3v32vbsrMax); - warns_vbs++; - } - if (-1*vbs > model->BSIM3v32vbdMax) - if (warns_vbs < maxwarns) { - soa_printf(ckt, (GENinstance*) here, - "Vbs=%g has exceeded Vbd_max=%g\n", - vbs, model->BSIM3v32vbdMax); - warns_vbs++; - } - } - } else { - if (model->BSIM3v32type > 0) { - if (vbs > model->BSIM3v32vbsMax) - if (warns_vbs < maxwarns) { - soa_printf(ckt, (GENinstance*) here, - "Vbs=%g has exceeded Vbs_max=%g\n", - vbs, model->BSIM3v32vbsMax); - warns_vbs++; - } - if (-1*vbs > model->BSIM3v32vbsrMax) - if (warns_vbs < maxwarns) { - soa_printf(ckt, (GENinstance*) here, - "Vbs=%g has exceeded Vbsr_max=%g\n", - vbs, model->BSIM3v32vbsrMax); - warns_vbs++; - } - } else { - if (vbs > model->BSIM3v32vbsrMax) - if (warns_vbs < maxwarns) { - soa_printf(ckt, (GENinstance*) here, - "Vbs=%g has exceeded Vbsr_max=%g\n", - vbs, model->BSIM3v32vbsrMax); - warns_vbs++; - } - if (-1*vbs > model->BSIM3v32vbsMax) - if (warns_vbs < maxwarns) { - soa_printf(ckt, (GENinstance*) here, - "Vbs=%g has exceeded Vbs_max=%g\n", - vbs, model->BSIM3v32vbsMax); - warns_vbs++; - } - } - } - } - - if (!model->BSIM3v32vbdrMaxGiven) { - if (fabs(vbd) > model->BSIM3v32vbdMax) - if (warns_vbd < maxwarns) { - soa_printf(ckt, (GENinstance*) here, - "Vbd=%g has exceeded Vbd_max=%g\n", - vbd, model->BSIM3v32vbdMax); - warns_vbd++; - } - } else { - if (model->BSIM3v32type > 0) { - if (vbd > model->BSIM3v32vbdMax) - if (warns_vbd < maxwarns) { - soa_printf(ckt, (GENinstance*) here, - "Vbd=%g has exceeded Vbd_max=%g\n", - vbd, model->BSIM3v32vbdMax); - warns_vbd++; - } - if (-1*vbd > model->BSIM3v32vbdrMax) - if (warns_vbd < maxwarns) { - soa_printf(ckt, (GENinstance*) here, - "Vbd=%g has exceeded Vbdr_max=%g\n", - vbd, model->BSIM3v32vbdrMax); - warns_vbd++; - } - } else { - if (vbd > model->BSIM3v32vbdrMax) - if (warns_vbd < maxwarns) { - soa_printf(ckt, (GENinstance*) here, - "Vbd=%g has exceeded Vbdr_max=%g\n", - vbd, model->BSIM3v32vbdrMax); - warns_vbd++; - } - if (-1*vbd > model->BSIM3v32vbdMax) - if (warns_vbd < maxwarns) { - soa_printf(ckt, (GENinstance*) here, - "Vbd=%g has exceeded Vbd_max=%g\n", - vbd, model->BSIM3v32vbdMax); - warns_vbd++; - } - } - } - - } - } - - return OK; -} diff --git a/src/spicelib/devices/bsim3v32/b3v32temp.c b/src/spicelib/devices/bsim3v32/b3v32temp.c deleted file mode 100644 index 18550edf6..000000000 --- a/src/spicelib/devices/bsim3v32/b3v32temp.c +++ /dev/null @@ -1,1017 +0,0 @@ -/**** BSIM3v3.2.4, Released by Xuemei Xi 12/21/2001 ****/ - -/********** - * Copyright 2001 Regents of the University of California. All rights reserved. - * File: b3temp.c of BSIM3v3.2.4 - * Author: 1995 Min-Chie Jeng and Mansun Chan. - * Author: 1997-1999 Weidong Liu. - * Author: 2001 Xuemei Xi - * Modified by Paolo Nenzi 2002 and Dietmar Warning 2003 - **********/ - -#include "ngspice/ngspice.h" -#include "ngspice/smpdefs.h" -#include "ngspice/cktdefs.h" -#include "bsim3v32def.h" -#include "ngspice/const.h" -#include "ngspice/sperror.h" -#include "ngspice/devdefs.h" -#include "ngspice/suffix.h" - -#define Kb 1.3806226e-23 -#define KboQ 8.617087e-5 /* Kb / q where q = 1.60219e-19 */ -#define EPSOX 3.453133e-11 -#define EPSSI 1.03594e-10 -#define PI 3.141592654 -#define MAX_EXP 5.834617425e14 -#define MIN_EXP 1.713908431e-15 -#define EXP_THRESHOLD 34.0 -#define Charge_q 1.60219e-19 - -/* ARGSUSED */ -int -BSIM3v32temp (GENmodel *inModel, CKTcircuit *ckt) -{ -BSIM3v32model *model = (BSIM3v32model*) inModel; -BSIM3v32instance *here; -struct bsim3v32SizeDependParam *pSizeDependParamKnot, *pLastKnot, *pParam=NULL; -double tmp, tmp1, tmp2, tmp3, Eg, Eg0, ni, T0, T1, T2, T3, T4, T5, Ldrn, Wdrn; -double delTemp, Temp, TRatio, Inv_L, Inv_W, Inv_LW, Vtm0, Tnom; -double Nvtm, SourceSatCurrent, DrainSatCurrent; -int Size_Not_Found, error; - - /* loop through all the BSIM3v32 device models */ - for (; model != NULL; model = BSIM3v32nextModel(model)) - { Temp = ckt->CKTtemp; - if (model->BSIM3v32bulkJctPotential < 0.1) - { model->BSIM3v32bulkJctPotential = 0.1; - fprintf(stderr, "Given pb is less than 0.1. Pb is set to 0.1.\n"); - } - if (model->BSIM3v32sidewallJctPotential < 0.1) - { model->BSIM3v32sidewallJctPotential = 0.1; - fprintf(stderr, "Given pbsw is less than 0.1. Pbsw is set to 0.1.\n"); - } - if (model->BSIM3v32GatesidewallJctPotential < 0.1) - { model->BSIM3v32GatesidewallJctPotential = 0.1; - fprintf(stderr, "Given pbswg is less than 0.1. Pbswg is set to 0.1.\n"); - } - - struct bsim3v32SizeDependParam *p = model->pSizeDependParamKnot; - while (p) { - struct bsim3v32SizeDependParam *next_p = p->pNext; - FREE(p); - p = next_p; - } - model->pSizeDependParamKnot = NULL; - pLastKnot = NULL; - - Tnom = model->BSIM3v32tnom; - TRatio = Temp / Tnom; - - model->BSIM3v32vcrit = CONSTvt0 * log(CONSTvt0 / (CONSTroot2 * 1.0e-14)); - model->BSIM3v32factor1 = sqrt(EPSSI / EPSOX * model->BSIM3v32tox); - - Vtm0 = KboQ * Tnom; - Eg0 = 1.16 - 7.02e-4 * Tnom * Tnom / (Tnom + 1108.0); - ni = 1.45e10 * (Tnom / 300.15) * sqrt(Tnom / 300.15) - * exp(21.5565981 - Eg0 / (2.0 * Vtm0)); - - model->BSIM3v32vtm = KboQ * Temp; - Eg = 1.16 - 7.02e-4 * Temp * Temp / (Temp + 1108.0); - if (Temp != Tnom) - { T0 = Eg0 / Vtm0 - Eg / model->BSIM3v32vtm + model->BSIM3v32jctTempExponent - * log(Temp / Tnom); - T1 = exp(T0 / model->BSIM3v32jctEmissionCoeff); - model->BSIM3v32jctTempSatCurDensity = model->BSIM3v32jctSatCurDensity - * T1; - model->BSIM3v32jctSidewallTempSatCurDensity - = model->BSIM3v32jctSidewallSatCurDensity * T1; - } - else - { model->BSIM3v32jctTempSatCurDensity = model->BSIM3v32jctSatCurDensity; - model->BSIM3v32jctSidewallTempSatCurDensity - = model->BSIM3v32jctSidewallSatCurDensity; - } - - if (model->BSIM3v32jctTempSatCurDensity < 0.0) - model->BSIM3v32jctTempSatCurDensity = 0.0; - if (model->BSIM3v32jctSidewallTempSatCurDensity < 0.0) - model->BSIM3v32jctSidewallTempSatCurDensity = 0.0; - - /* Temperature dependence of D/B and S/B diode capacitance begins */ - delTemp = ckt->CKTtemp - model->BSIM3v32tnom; - T0 = model->BSIM3v32tcj * delTemp; - if (T0 >= -1.0) - { - /* Added revision dependent code */ - switch (model->BSIM3v32intVersion) { - case BSIM3v32V324: - case BSIM3v32V323: - model->BSIM3v32unitAreaTempJctCap = - model->BSIM3v32unitAreaJctCap * (1.0 + T0); - break; - case BSIM3v32V322: - case BSIM3v32V32: - default: - model->BSIM3v32unitAreaJctCap *= 1.0 + T0; - } - } - else if (model->BSIM3v32unitAreaJctCap > 0.0) - { - /* Added revision dependent code */ - switch (model->BSIM3v32intVersion) { - case BSIM3v32V324: - case BSIM3v32V323: - model->BSIM3v32unitAreaTempJctCap = 0.0; - break; - case BSIM3v32V322: - case BSIM3v32V32: - default: - model->BSIM3v32unitAreaJctCap = 0.0; - } - fprintf(stderr, "Temperature effect has caused cj to be negative. Cj is clamped to zero.\n"); - } - T0 = model->BSIM3v32tcjsw * delTemp; - if (T0 >= -1.0) - { - /* Added revision dependent code */ - switch (model->BSIM3v32intVersion) { - case BSIM3v32V324: - case BSIM3v32V323: - model->BSIM3v32unitLengthSidewallTempJctCap = - model->BSIM3v32unitLengthSidewallJctCap * (1.0 + T0); - break; - case BSIM3v32V322: - case BSIM3v32V32: - default: - model->BSIM3v32unitLengthSidewallJctCap *= 1.0 + T0; - } - } - else if (model->BSIM3v32unitLengthSidewallJctCap > 0.0) - { - /* Added revision dependent code */ - switch (model->BSIM3v32intVersion) { - case BSIM3v32V324: - case BSIM3v32V323: - model->BSIM3v32unitLengthSidewallTempJctCap = 0.0; - break; - case BSIM3v32V322: - case BSIM3v32V32: - default: - model->BSIM3v32unitLengthSidewallJctCap = 0.0; - } - fprintf(stderr, "Temperature effect has caused cjsw to be negative. Cjsw is clamped to zero.\n"); - } - T0 = model->BSIM3v32tcjswg * delTemp; - if (T0 >= -1.0) - { - /* Added revision dependent code */ - switch (model->BSIM3v32intVersion) { - case BSIM3v32V324: - case BSIM3v32V323: - model->BSIM3v32unitLengthGateSidewallTempJctCap = - model->BSIM3v32unitLengthGateSidewallJctCap * (1.0 + T0); - break; - case BSIM3v32V322: - case BSIM3v32V32: - default: - model->BSIM3v32unitLengthGateSidewallJctCap *= 1.0 + T0; - } - } - else if (model->BSIM3v32unitLengthGateSidewallJctCap > 0.0) - { - /* Added revision dependent code */ - switch (model->BSIM3v32intVersion) { - case BSIM3v32V324: - case BSIM3v32V323: - model->BSIM3v32unitLengthGateSidewallTempJctCap = 0.0; - break; - case BSIM3v32V322: - case BSIM3v32V32: - default: - model->BSIM3v32unitLengthGateSidewallJctCap = 0.0; - } - fprintf(stderr, "Temperature effect has caused cjswg to be negative. Cjswg is clamped to zero.\n"); - } - - model->BSIM3v32PhiB = model->BSIM3v32bulkJctPotential - - model->BSIM3v32tpb * delTemp; - if (model->BSIM3v32PhiB < 0.01) - { model->BSIM3v32PhiB = 0.01; - fprintf(stderr, "Temperature effect has caused pb to be less than 0.01. Pb is clamped to 0.01.\n"); - } - model->BSIM3v32PhiBSW = model->BSIM3v32sidewallJctPotential - - model->BSIM3v32tpbsw * delTemp; - if (model->BSIM3v32PhiBSW <= 0.01) - { model->BSIM3v32PhiBSW = 0.01; - fprintf(stderr, "Temperature effect has caused pbsw to be less than 0.01. Pbsw is clamped to 0.01.\n"); - } - model->BSIM3v32PhiBSWG = model->BSIM3v32GatesidewallJctPotential - - model->BSIM3v32tpbswg * delTemp; - if (model->BSIM3v32PhiBSWG <= 0.01) - { model->BSIM3v32PhiBSWG = 0.01; - fprintf(stderr, "Temperature effect has caused pbswg to be less than 0.01. Pbswg is clamped to 0.01.\n"); - } - /* End of junction capacitance */ - - /* loop through all the instances of the model */ - /* MCJ: Length and Width not initialized */ - for (here = BSIM3v32instances(model); here != NULL; - here = BSIM3v32nextInstance(here)) - { - pSizeDependParamKnot = model->pSizeDependParamKnot; - Size_Not_Found = 1; - while ((pSizeDependParamKnot != NULL) && Size_Not_Found) - { if ((here->BSIM3v32l == pSizeDependParamKnot->Length) - && (here->BSIM3v32w == pSizeDependParamKnot->Width)) - { Size_Not_Found = 0; - here->pParam = pSizeDependParamKnot; - if (model->BSIM3v32intVersion > BSIM3v32V322) - { - pParam = here->pParam; /*bug-fix */ - } - } - else - { pLastKnot = pSizeDependParamKnot; - pSizeDependParamKnot = pSizeDependParamKnot->pNext; - } - } - - if (Size_Not_Found) - { pParam = TMALLOC(struct bsim3v32SizeDependParam, 1); - if (pLastKnot == NULL) - model->pSizeDependParamKnot = pParam; - else - pLastKnot->pNext = pParam; - pParam->pNext = NULL; - here->pParam = pParam; - - Ldrn = here->BSIM3v32l; - Wdrn = here->BSIM3v32w; - pParam->Length = Ldrn; - pParam->Width = Wdrn; - - T0 = pow(Ldrn, model->BSIM3v32Lln); - T1 = pow(Wdrn, model->BSIM3v32Lwn); - tmp1 = model->BSIM3v32Ll / T0 + model->BSIM3v32Lw / T1 - + model->BSIM3v32Lwl / (T0 * T1); - pParam->BSIM3v32dl = model->BSIM3v32Lint + tmp1; - tmp2 = model->BSIM3v32Llc / T0 + model->BSIM3v32Lwc / T1 - + model->BSIM3v32Lwlc / (T0 * T1); - pParam->BSIM3v32dlc = model->BSIM3v32dlc + tmp2; - - T2 = pow(Ldrn, model->BSIM3v32Wln); - T3 = pow(Wdrn, model->BSIM3v32Wwn); - tmp1 = model->BSIM3v32Wl / T2 + model->BSIM3v32Ww / T3 - + model->BSIM3v32Wwl / (T2 * T3); - pParam->BSIM3v32dw = model->BSIM3v32Wint + tmp1; - tmp2 = model->BSIM3v32Wlc / T2 + model->BSIM3v32Wwc / T3 - + model->BSIM3v32Wwlc / (T2 * T3); - pParam->BSIM3v32dwc = model->BSIM3v32dwc + tmp2; - - pParam->BSIM3v32leff = here->BSIM3v32l + model->BSIM3v32xl - 2.0 * pParam->BSIM3v32dl; - if (pParam->BSIM3v32leff <= 0.0) - { - SPfrontEnd->IFerrorf (ERR_FATAL, - "BSIM3v32: mosfet %s, model %s: Effective channel length <= 0", - model->BSIM3v32modName, here->BSIM3v32name); - return(E_BADPARM); - } - - pParam->BSIM3v32weff = here->BSIM3v32w + model->BSIM3v32xw - 2.0 * pParam->BSIM3v32dw; - if (pParam->BSIM3v32weff <= 0.0) - { - SPfrontEnd->IFerrorf (ERR_FATAL, - "BSIM3v32: mosfet %s, model %s: Effective channel width <= 0", - model->BSIM3v32modName, here->BSIM3v32name); - return(E_BADPARM); - } - - pParam->BSIM3v32leffCV = here->BSIM3v32l + model->BSIM3v32xl - 2.0 * pParam->BSIM3v32dlc; - if (pParam->BSIM3v32leffCV <= 0.0) - { - SPfrontEnd->IFerrorf (ERR_FATAL, - "BSIM3v32: mosfet %s, model %s: Effective channel length for C-V <= 0", - model->BSIM3v32modName, here->BSIM3v32name); - return(E_BADPARM); - } - - pParam->BSIM3v32weffCV = here->BSIM3v32w + model->BSIM3v32xw - 2.0 * pParam->BSIM3v32dwc; - if (pParam->BSIM3v32weffCV <= 0.0) - { - SPfrontEnd->IFerrorf (ERR_FATAL, - "BSIM3v32: mosfet %s, model %s: Effective channel width for C-V <= 0", - model->BSIM3v32modName, here->BSIM3v32name); - return(E_BADPARM); - } - - - if (model->BSIM3v32binUnit == 1) - { Inv_L = 1.0e-6 / pParam->BSIM3v32leff; - Inv_W = 1.0e-6 / pParam->BSIM3v32weff; - Inv_LW = 1.0e-12 / (pParam->BSIM3v32leff - * pParam->BSIM3v32weff); - } - else - { Inv_L = 1.0 / pParam->BSIM3v32leff; - Inv_W = 1.0 / pParam->BSIM3v32weff; - Inv_LW = 1.0 / (pParam->BSIM3v32leff - * pParam->BSIM3v32weff); - } - pParam->BSIM3v32cdsc = model->BSIM3v32cdsc - + model->BSIM3v32lcdsc * Inv_L - + model->BSIM3v32wcdsc * Inv_W - + model->BSIM3v32pcdsc * Inv_LW; - pParam->BSIM3v32cdscb = model->BSIM3v32cdscb - + model->BSIM3v32lcdscb * Inv_L - + model->BSIM3v32wcdscb * Inv_W - + model->BSIM3v32pcdscb * Inv_LW; - - pParam->BSIM3v32cdscd = model->BSIM3v32cdscd - + model->BSIM3v32lcdscd * Inv_L - + model->BSIM3v32wcdscd * Inv_W - + model->BSIM3v32pcdscd * Inv_LW; - - pParam->BSIM3v32cit = model->BSIM3v32cit - + model->BSIM3v32lcit * Inv_L - + model->BSIM3v32wcit * Inv_W - + model->BSIM3v32pcit * Inv_LW; - pParam->BSIM3v32nfactor = model->BSIM3v32nfactor - + model->BSIM3v32lnfactor * Inv_L - + model->BSIM3v32wnfactor * Inv_W - + model->BSIM3v32pnfactor * Inv_LW; - pParam->BSIM3v32xj = model->BSIM3v32xj - + model->BSIM3v32lxj * Inv_L - + model->BSIM3v32wxj * Inv_W - + model->BSIM3v32pxj * Inv_LW; - pParam->BSIM3v32vsat = model->BSIM3v32vsat - + model->BSIM3v32lvsat * Inv_L - + model->BSIM3v32wvsat * Inv_W - + model->BSIM3v32pvsat * Inv_LW; - pParam->BSIM3v32at = model->BSIM3v32at - + model->BSIM3v32lat * Inv_L - + model->BSIM3v32wat * Inv_W - + model->BSIM3v32pat * Inv_LW; - pParam->BSIM3v32a0 = model->BSIM3v32a0 - + model->BSIM3v32la0 * Inv_L - + model->BSIM3v32wa0 * Inv_W - + model->BSIM3v32pa0 * Inv_LW; - - pParam->BSIM3v32ags = model->BSIM3v32ags - + model->BSIM3v32lags * Inv_L - + model->BSIM3v32wags * Inv_W - + model->BSIM3v32pags * Inv_LW; - - pParam->BSIM3v32a1 = model->BSIM3v32a1 - + model->BSIM3v32la1 * Inv_L - + model->BSIM3v32wa1 * Inv_W - + model->BSIM3v32pa1 * Inv_LW; - pParam->BSIM3v32a2 = model->BSIM3v32a2 - + model->BSIM3v32la2 * Inv_L - + model->BSIM3v32wa2 * Inv_W - + model->BSIM3v32pa2 * Inv_LW; - pParam->BSIM3v32keta = model->BSIM3v32keta - + model->BSIM3v32lketa * Inv_L - + model->BSIM3v32wketa * Inv_W - + model->BSIM3v32pketa * Inv_LW; - pParam->BSIM3v32nsub = model->BSIM3v32nsub - + model->BSIM3v32lnsub * Inv_L - + model->BSIM3v32wnsub * Inv_W - + model->BSIM3v32pnsub * Inv_LW; - pParam->BSIM3v32npeak = model->BSIM3v32npeak - + model->BSIM3v32lnpeak * Inv_L - + model->BSIM3v32wnpeak * Inv_W - + model->BSIM3v32pnpeak * Inv_LW; - pParam->BSIM3v32ngate = model->BSIM3v32ngate - + model->BSIM3v32lngate * Inv_L - + model->BSIM3v32wngate * Inv_W - + model->BSIM3v32pngate * Inv_LW; - pParam->BSIM3v32gamma1 = model->BSIM3v32gamma1 - + model->BSIM3v32lgamma1 * Inv_L - + model->BSIM3v32wgamma1 * Inv_W - + model->BSIM3v32pgamma1 * Inv_LW; - pParam->BSIM3v32gamma2 = model->BSIM3v32gamma2 - + model->BSIM3v32lgamma2 * Inv_L - + model->BSIM3v32wgamma2 * Inv_W - + model->BSIM3v32pgamma2 * Inv_LW; - pParam->BSIM3v32vbx = model->BSIM3v32vbx - + model->BSIM3v32lvbx * Inv_L - + model->BSIM3v32wvbx * Inv_W - + model->BSIM3v32pvbx * Inv_LW; - pParam->BSIM3v32vbm = model->BSIM3v32vbm - + model->BSIM3v32lvbm * Inv_L - + model->BSIM3v32wvbm * Inv_W - + model->BSIM3v32pvbm * Inv_LW; - pParam->BSIM3v32xt = model->BSIM3v32xt - + model->BSIM3v32lxt * Inv_L - + model->BSIM3v32wxt * Inv_W - + model->BSIM3v32pxt * Inv_LW; - pParam->BSIM3v32vfb = model->BSIM3v32vfb - + model->BSIM3v32lvfb * Inv_L - + model->BSIM3v32wvfb * Inv_W - + model->BSIM3v32pvfb * Inv_LW; - pParam->BSIM3v32k1 = model->BSIM3v32k1 - + model->BSIM3v32lk1 * Inv_L - + model->BSIM3v32wk1 * Inv_W - + model->BSIM3v32pk1 * Inv_LW; - pParam->BSIM3v32kt1 = model->BSIM3v32kt1 - + model->BSIM3v32lkt1 * Inv_L - + model->BSIM3v32wkt1 * Inv_W - + model->BSIM3v32pkt1 * Inv_LW; - pParam->BSIM3v32kt1l = model->BSIM3v32kt1l - + model->BSIM3v32lkt1l * Inv_L - + model->BSIM3v32wkt1l * Inv_W - + model->BSIM3v32pkt1l * Inv_LW; - pParam->BSIM3v32k2 = model->BSIM3v32k2 - + model->BSIM3v32lk2 * Inv_L - + model->BSIM3v32wk2 * Inv_W - + model->BSIM3v32pk2 * Inv_LW; - pParam->BSIM3v32kt2 = model->BSIM3v32kt2 - + model->BSIM3v32lkt2 * Inv_L - + model->BSIM3v32wkt2 * Inv_W - + model->BSIM3v32pkt2 * Inv_LW; - pParam->BSIM3v32k3 = model->BSIM3v32k3 - + model->BSIM3v32lk3 * Inv_L - + model->BSIM3v32wk3 * Inv_W - + model->BSIM3v32pk3 * Inv_LW; - pParam->BSIM3v32k3b = model->BSIM3v32k3b - + model->BSIM3v32lk3b * Inv_L - + model->BSIM3v32wk3b * Inv_W - + model->BSIM3v32pk3b * Inv_LW; - pParam->BSIM3v32w0 = model->BSIM3v32w0 - + model->BSIM3v32lw0 * Inv_L - + model->BSIM3v32ww0 * Inv_W - + model->BSIM3v32pw0 * Inv_LW; - pParam->BSIM3v32nlx = model->BSIM3v32nlx - + model->BSIM3v32lnlx * Inv_L - + model->BSIM3v32wnlx * Inv_W - + model->BSIM3v32pnlx * Inv_LW; - pParam->BSIM3v32dvt0 = model->BSIM3v32dvt0 - + model->BSIM3v32ldvt0 * Inv_L - + model->BSIM3v32wdvt0 * Inv_W - + model->BSIM3v32pdvt0 * Inv_LW; - pParam->BSIM3v32dvt1 = model->BSIM3v32dvt1 - + model->BSIM3v32ldvt1 * Inv_L - + model->BSIM3v32wdvt1 * Inv_W - + model->BSIM3v32pdvt1 * Inv_LW; - pParam->BSIM3v32dvt2 = model->BSIM3v32dvt2 - + model->BSIM3v32ldvt2 * Inv_L - + model->BSIM3v32wdvt2 * Inv_W - + model->BSIM3v32pdvt2 * Inv_LW; - pParam->BSIM3v32dvt0w = model->BSIM3v32dvt0w - + model->BSIM3v32ldvt0w * Inv_L - + model->BSIM3v32wdvt0w * Inv_W - + model->BSIM3v32pdvt0w * Inv_LW; - pParam->BSIM3v32dvt1w = model->BSIM3v32dvt1w - + model->BSIM3v32ldvt1w * Inv_L - + model->BSIM3v32wdvt1w * Inv_W - + model->BSIM3v32pdvt1w * Inv_LW; - pParam->BSIM3v32dvt2w = model->BSIM3v32dvt2w - + model->BSIM3v32ldvt2w * Inv_L - + model->BSIM3v32wdvt2w * Inv_W - + model->BSIM3v32pdvt2w * Inv_LW; - pParam->BSIM3v32drout = model->BSIM3v32drout - + model->BSIM3v32ldrout * Inv_L - + model->BSIM3v32wdrout * Inv_W - + model->BSIM3v32pdrout * Inv_LW; - pParam->BSIM3v32dsub = model->BSIM3v32dsub - + model->BSIM3v32ldsub * Inv_L - + model->BSIM3v32wdsub * Inv_W - + model->BSIM3v32pdsub * Inv_LW; - pParam->BSIM3v32vth0 = model->BSIM3v32vth0 - + model->BSIM3v32lvth0 * Inv_L - + model->BSIM3v32wvth0 * Inv_W - + model->BSIM3v32pvth0 * Inv_LW; - pParam->BSIM3v32ua = model->BSIM3v32ua - + model->BSIM3v32lua * Inv_L - + model->BSIM3v32wua * Inv_W - + model->BSIM3v32pua * Inv_LW; - pParam->BSIM3v32ua1 = model->BSIM3v32ua1 - + model->BSIM3v32lua1 * Inv_L - + model->BSIM3v32wua1 * Inv_W - + model->BSIM3v32pua1 * Inv_LW; - pParam->BSIM3v32ub = model->BSIM3v32ub - + model->BSIM3v32lub * Inv_L - + model->BSIM3v32wub * Inv_W - + model->BSIM3v32pub * Inv_LW; - pParam->BSIM3v32ub1 = model->BSIM3v32ub1 - + model->BSIM3v32lub1 * Inv_L - + model->BSIM3v32wub1 * Inv_W - + model->BSIM3v32pub1 * Inv_LW; - pParam->BSIM3v32uc = model->BSIM3v32uc - + model->BSIM3v32luc * Inv_L - + model->BSIM3v32wuc * Inv_W - + model->BSIM3v32puc * Inv_LW; - pParam->BSIM3v32uc1 = model->BSIM3v32uc1 - + model->BSIM3v32luc1 * Inv_L - + model->BSIM3v32wuc1 * Inv_W - + model->BSIM3v32puc1 * Inv_LW; - pParam->BSIM3v32u0 = model->BSIM3v32u0 - + model->BSIM3v32lu0 * Inv_L - + model->BSIM3v32wu0 * Inv_W - + model->BSIM3v32pu0 * Inv_LW; - pParam->BSIM3v32ute = model->BSIM3v32ute - + model->BSIM3v32lute * Inv_L - + model->BSIM3v32wute * Inv_W - + model->BSIM3v32pute * Inv_LW; - pParam->BSIM3v32voff = model->BSIM3v32voff - + model->BSIM3v32lvoff * Inv_L - + model->BSIM3v32wvoff * Inv_W - + model->BSIM3v32pvoff * Inv_LW; - pParam->BSIM3v32delta = model->BSIM3v32delta - + model->BSIM3v32ldelta * Inv_L - + model->BSIM3v32wdelta * Inv_W - + model->BSIM3v32pdelta * Inv_LW; - pParam->BSIM3v32rdsw = model->BSIM3v32rdsw - + model->BSIM3v32lrdsw * Inv_L - + model->BSIM3v32wrdsw * Inv_W - + model->BSIM3v32prdsw * Inv_LW; - pParam->BSIM3v32prwg = model->BSIM3v32prwg - + model->BSIM3v32lprwg * Inv_L - + model->BSIM3v32wprwg * Inv_W - + model->BSIM3v32pprwg * Inv_LW; - pParam->BSIM3v32prwb = model->BSIM3v32prwb - + model->BSIM3v32lprwb * Inv_L - + model->BSIM3v32wprwb * Inv_W - + model->BSIM3v32pprwb * Inv_LW; - pParam->BSIM3v32prt = model->BSIM3v32prt - + model->BSIM3v32lprt * Inv_L - + model->BSIM3v32wprt * Inv_W - + model->BSIM3v32pprt * Inv_LW; - pParam->BSIM3v32eta0 = model->BSIM3v32eta0 - + model->BSIM3v32leta0 * Inv_L - + model->BSIM3v32weta0 * Inv_W - + model->BSIM3v32peta0 * Inv_LW; - pParam->BSIM3v32etab = model->BSIM3v32etab - + model->BSIM3v32letab * Inv_L - + model->BSIM3v32wetab * Inv_W - + model->BSIM3v32petab * Inv_LW; - pParam->BSIM3v32pclm = model->BSIM3v32pclm - + model->BSIM3v32lpclm * Inv_L - + model->BSIM3v32wpclm * Inv_W - + model->BSIM3v32ppclm * Inv_LW; - pParam->BSIM3v32pdibl1 = model->BSIM3v32pdibl1 - + model->BSIM3v32lpdibl1 * Inv_L - + model->BSIM3v32wpdibl1 * Inv_W - + model->BSIM3v32ppdibl1 * Inv_LW; - pParam->BSIM3v32pdibl2 = model->BSIM3v32pdibl2 - + model->BSIM3v32lpdibl2 * Inv_L - + model->BSIM3v32wpdibl2 * Inv_W - + model->BSIM3v32ppdibl2 * Inv_LW; - pParam->BSIM3v32pdiblb = model->BSIM3v32pdiblb - + model->BSIM3v32lpdiblb * Inv_L - + model->BSIM3v32wpdiblb * Inv_W - + model->BSIM3v32ppdiblb * Inv_LW; - pParam->BSIM3v32pscbe1 = model->BSIM3v32pscbe1 - + model->BSIM3v32lpscbe1 * Inv_L - + model->BSIM3v32wpscbe1 * Inv_W - + model->BSIM3v32ppscbe1 * Inv_LW; - pParam->BSIM3v32pscbe2 = model->BSIM3v32pscbe2 - + model->BSIM3v32lpscbe2 * Inv_L - + model->BSIM3v32wpscbe2 * Inv_W - + model->BSIM3v32ppscbe2 * Inv_LW; - pParam->BSIM3v32pvag = model->BSIM3v32pvag - + model->BSIM3v32lpvag * Inv_L - + model->BSIM3v32wpvag * Inv_W - + model->BSIM3v32ppvag * Inv_LW; - pParam->BSIM3v32wr = model->BSIM3v32wr - + model->BSIM3v32lwr * Inv_L - + model->BSIM3v32wwr * Inv_W - + model->BSIM3v32pwr * Inv_LW; - pParam->BSIM3v32dwg = model->BSIM3v32dwg - + model->BSIM3v32ldwg * Inv_L - + model->BSIM3v32wdwg * Inv_W - + model->BSIM3v32pdwg * Inv_LW; - pParam->BSIM3v32dwb = model->BSIM3v32dwb - + model->BSIM3v32ldwb * Inv_L - + model->BSIM3v32wdwb * Inv_W - + model->BSIM3v32pdwb * Inv_LW; - pParam->BSIM3v32b0 = model->BSIM3v32b0 - + model->BSIM3v32lb0 * Inv_L - + model->BSIM3v32wb0 * Inv_W - + model->BSIM3v32pb0 * Inv_LW; - pParam->BSIM3v32b1 = model->BSIM3v32b1 - + model->BSIM3v32lb1 * Inv_L - + model->BSIM3v32wb1 * Inv_W - + model->BSIM3v32pb1 * Inv_LW; - pParam->BSIM3v32alpha0 = model->BSIM3v32alpha0 - + model->BSIM3v32lalpha0 * Inv_L - + model->BSIM3v32walpha0 * Inv_W - + model->BSIM3v32palpha0 * Inv_LW; - pParam->BSIM3v32alpha1 = model->BSIM3v32alpha1 - + model->BSIM3v32lalpha1 * Inv_L - + model->BSIM3v32walpha1 * Inv_W - + model->BSIM3v32palpha1 * Inv_LW; - pParam->BSIM3v32beta0 = model->BSIM3v32beta0 - + model->BSIM3v32lbeta0 * Inv_L - + model->BSIM3v32wbeta0 * Inv_W - + model->BSIM3v32pbeta0 * Inv_LW; - /* CV model */ - pParam->BSIM3v32elm = model->BSIM3v32elm - + model->BSIM3v32lelm * Inv_L - + model->BSIM3v32welm * Inv_W - + model->BSIM3v32pelm * Inv_LW; - pParam->BSIM3v32cgsl = model->BSIM3v32cgsl - + model->BSIM3v32lcgsl * Inv_L - + model->BSIM3v32wcgsl * Inv_W - + model->BSIM3v32pcgsl * Inv_LW; - pParam->BSIM3v32cgdl = model->BSIM3v32cgdl - + model->BSIM3v32lcgdl * Inv_L - + model->BSIM3v32wcgdl * Inv_W - + model->BSIM3v32pcgdl * Inv_LW; - pParam->BSIM3v32ckappa = model->BSIM3v32ckappa - + model->BSIM3v32lckappa * Inv_L - + model->BSIM3v32wckappa * Inv_W - + model->BSIM3v32pckappa * Inv_LW; - pParam->BSIM3v32cf = model->BSIM3v32cf - + model->BSIM3v32lcf * Inv_L - + model->BSIM3v32wcf * Inv_W - + model->BSIM3v32pcf * Inv_LW; - pParam->BSIM3v32clc = model->BSIM3v32clc - + model->BSIM3v32lclc * Inv_L - + model->BSIM3v32wclc * Inv_W - + model->BSIM3v32pclc * Inv_LW; - pParam->BSIM3v32cle = model->BSIM3v32cle - + model->BSIM3v32lcle * Inv_L - + model->BSIM3v32wcle * Inv_W - + model->BSIM3v32pcle * Inv_LW; - pParam->BSIM3v32vfbcv = model->BSIM3v32vfbcv - + model->BSIM3v32lvfbcv * Inv_L - + model->BSIM3v32wvfbcv * Inv_W - + model->BSIM3v32pvfbcv * Inv_LW; - pParam->BSIM3v32acde = model->BSIM3v32acde - + model->BSIM3v32lacde * Inv_L - + model->BSIM3v32wacde * Inv_W - + model->BSIM3v32pacde * Inv_LW; - pParam->BSIM3v32moin = model->BSIM3v32moin - + model->BSIM3v32lmoin * Inv_L - + model->BSIM3v32wmoin * Inv_W - + model->BSIM3v32pmoin * Inv_LW; - pParam->BSIM3v32noff = model->BSIM3v32noff - + model->BSIM3v32lnoff * Inv_L - + model->BSIM3v32wnoff * Inv_W - + model->BSIM3v32pnoff * Inv_LW; - pParam->BSIM3v32voffcv = model->BSIM3v32voffcv - + model->BSIM3v32lvoffcv * Inv_L - + model->BSIM3v32wvoffcv * Inv_W - + model->BSIM3v32pvoffcv * Inv_LW; - - pParam->BSIM3v32abulkCVfactor = 1.0 + pow((pParam->BSIM3v32clc - / pParam->BSIM3v32leffCV), - pParam->BSIM3v32cle); - - T0 = (TRatio - 1.0); - pParam->BSIM3v32ua = pParam->BSIM3v32ua + pParam->BSIM3v32ua1 * T0; - pParam->BSIM3v32ub = pParam->BSIM3v32ub + pParam->BSIM3v32ub1 * T0; - pParam->BSIM3v32uc = pParam->BSIM3v32uc + pParam->BSIM3v32uc1 * T0; - if (pParam->BSIM3v32u0 > 1.0) - pParam->BSIM3v32u0 = pParam->BSIM3v32u0 / 1.0e4; - - pParam->BSIM3v32u0temp = pParam->BSIM3v32u0 - * pow(TRatio, pParam->BSIM3v32ute); - pParam->BSIM3v32vsattemp = pParam->BSIM3v32vsat - pParam->BSIM3v32at - * T0; - pParam->BSIM3v32rds0 = (pParam->BSIM3v32rdsw + pParam->BSIM3v32prt * T0) - / pow(pParam->BSIM3v32weff * 1E6, pParam->BSIM3v32wr); - - if (BSIM3v32checkModel(model, here, ckt)) - { - SPfrontEnd->IFerrorf (ERR_FATAL, "Fatal error(s) detected during BSIM3v32V3.2 parameter checking for %s in model %s", model->BSIM3v32modName, here->BSIM3v32name); - return(E_BADPARM); - } - - pParam->BSIM3v32cgdo = (model->BSIM3v32cgdo + pParam->BSIM3v32cf) - * pParam->BSIM3v32weffCV; - pParam->BSIM3v32cgso = (model->BSIM3v32cgso + pParam->BSIM3v32cf) - * pParam->BSIM3v32weffCV; - pParam->BSIM3v32cgbo = model->BSIM3v32cgbo * pParam->BSIM3v32leffCV; - - T0 = pParam->BSIM3v32leffCV * pParam->BSIM3v32leffCV; - pParam->BSIM3v32tconst = pParam->BSIM3v32u0temp * pParam->BSIM3v32elm / (model->BSIM3v32cox - * pParam->BSIM3v32weffCV * pParam->BSIM3v32leffCV * T0); - - if (!model->BSIM3v32npeakGiven && model->BSIM3v32gamma1Given) - { T0 = pParam->BSIM3v32gamma1 * model->BSIM3v32cox; - pParam->BSIM3v32npeak = 3.021E22 * T0 * T0; - } - - pParam->BSIM3v32phi = 2.0 * Vtm0 - * log(pParam->BSIM3v32npeak / ni); - - pParam->BSIM3v32sqrtPhi = sqrt(pParam->BSIM3v32phi); - pParam->BSIM3v32phis3 = pParam->BSIM3v32sqrtPhi * pParam->BSIM3v32phi; - - pParam->BSIM3v32Xdep0 = sqrt(2.0 * EPSSI / (Charge_q - * pParam->BSIM3v32npeak * 1.0e6)) - * pParam->BSIM3v32sqrtPhi; - pParam->BSIM3v32sqrtXdep0 = sqrt(pParam->BSIM3v32Xdep0); - pParam->BSIM3v32litl = sqrt(3.0 * pParam->BSIM3v32xj - * model->BSIM3v32tox); - pParam->BSIM3v32vbi = Vtm0 * log(1.0e20 - * pParam->BSIM3v32npeak / (ni * ni)); - pParam->BSIM3v32cdep0 = sqrt(Charge_q * EPSSI - * pParam->BSIM3v32npeak * 1.0e6 / 2.0 - / pParam->BSIM3v32phi); - - pParam->BSIM3v32ldeb = sqrt(EPSSI * Vtm0 / (Charge_q - * pParam->BSIM3v32npeak * 1.0e6)) / 3.0; - pParam->BSIM3v32acde *= pow((pParam->BSIM3v32npeak / 2.0e16), -0.25); - - - if (model->BSIM3v32k1Given || model->BSIM3v32k2Given) - { if (!model->BSIM3v32k1Given) - { - if ((!ckt->CKTcurJob) || (ckt->CKTcurJob->JOBtype < 9)) /* don't print in sensitivity */ - fprintf(stdout, "Warning: k1 should be specified with k2.\n"); - pParam->BSIM3v32k1 = 0.53; - } - if (!model->BSIM3v32k2Given) - { - if ((!ckt->CKTcurJob) || (ckt->CKTcurJob->JOBtype < 9)) /* don't print in sensitivity */ - fprintf(stdout, "Warning: k2 should be specified with k1.\n"); - pParam->BSIM3v32k2 = -0.0186; - } - if ((!ckt->CKTcurJob) || (ckt->CKTcurJob->JOBtype < 9)) { /* don't print in sensitivity */ - if (model->BSIM3v32nsubGiven) - fprintf(stdout, "Warning: nsub is ignored because k1 or k2 is given.\n"); - if (model->BSIM3v32xtGiven) - fprintf(stdout, "Warning: xt is ignored because k1 or k2 is given.\n"); - if (model->BSIM3v32vbxGiven) - fprintf(stdout, "Warning: vbx is ignored because k1 or k2 is given.\n"); - if (model->BSIM3v32gamma1Given) - fprintf(stdout, "Warning: gamma1 is ignored because k1 or k2 is given.\n"); - if (model->BSIM3v32gamma2Given) - fprintf(stdout, "Warning: gamma2 is ignored because k1 or k2 is given.\n"); - } - } - else - { if (!model->BSIM3v32vbxGiven) - pParam->BSIM3v32vbx = pParam->BSIM3v32phi - 7.7348e-4 - * pParam->BSIM3v32npeak - * pParam->BSIM3v32xt * pParam->BSIM3v32xt; - if (pParam->BSIM3v32vbx > 0.0) - pParam->BSIM3v32vbx = -pParam->BSIM3v32vbx; - if (pParam->BSIM3v32vbm > 0.0) - pParam->BSIM3v32vbm = -pParam->BSIM3v32vbm; - - if (!model->BSIM3v32gamma1Given) - pParam->BSIM3v32gamma1 = 5.753e-12 - * sqrt(pParam->BSIM3v32npeak) - / model->BSIM3v32cox; - if (!model->BSIM3v32gamma2Given) - pParam->BSIM3v32gamma2 = 5.753e-12 - * sqrt(pParam->BSIM3v32nsub) - / model->BSIM3v32cox; - - T0 = pParam->BSIM3v32gamma1 - pParam->BSIM3v32gamma2; - T1 = sqrt(pParam->BSIM3v32phi - pParam->BSIM3v32vbx) - - pParam->BSIM3v32sqrtPhi; - T2 = sqrt(pParam->BSIM3v32phi * (pParam->BSIM3v32phi - - pParam->BSIM3v32vbm)) - pParam->BSIM3v32phi; - pParam->BSIM3v32k2 = T0 * T1 / (2.0 * T2 + pParam->BSIM3v32vbm); - pParam->BSIM3v32k1 = pParam->BSIM3v32gamma2 - 2.0 - * pParam->BSIM3v32k2 * sqrt(pParam->BSIM3v32phi - - pParam->BSIM3v32vbm); - } - - if (pParam->BSIM3v32k2 < 0.0) - { T0 = 0.5 * pParam->BSIM3v32k1 / pParam->BSIM3v32k2; - pParam->BSIM3v32vbsc = 0.9 * (pParam->BSIM3v32phi - T0 * T0); - if (pParam->BSIM3v32vbsc > -3.0) - pParam->BSIM3v32vbsc = -3.0; - else if (pParam->BSIM3v32vbsc < -30.0) - pParam->BSIM3v32vbsc = -30.0; - } - else - { pParam->BSIM3v32vbsc = -30.0; - } - if (pParam->BSIM3v32vbsc > pParam->BSIM3v32vbm) - pParam->BSIM3v32vbsc = pParam->BSIM3v32vbm; - - if (!model->BSIM3v32vfbGiven) - { if (model->BSIM3v32vth0Given) - { pParam->BSIM3v32vfb = model->BSIM3v32type * pParam->BSIM3v32vth0 - - pParam->BSIM3v32phi - pParam->BSIM3v32k1 - * pParam->BSIM3v32sqrtPhi; - } - else - { pParam->BSIM3v32vfb = -1.0; - } - } - if (!model->BSIM3v32vth0Given) - { pParam->BSIM3v32vth0 = model->BSIM3v32type * (pParam->BSIM3v32vfb - + pParam->BSIM3v32phi + pParam->BSIM3v32k1 - * pParam->BSIM3v32sqrtPhi); - } - - pParam->BSIM3v32k1ox = pParam->BSIM3v32k1 * model->BSIM3v32tox - / model->BSIM3v32toxm; - pParam->BSIM3v32k2ox = pParam->BSIM3v32k2 * model->BSIM3v32tox - / model->BSIM3v32toxm; - - T1 = sqrt(EPSSI / EPSOX * model->BSIM3v32tox - * pParam->BSIM3v32Xdep0); - T0 = exp(-0.5 * pParam->BSIM3v32dsub * pParam->BSIM3v32leff / T1); - pParam->BSIM3v32theta0vb0 = (T0 + 2.0 * T0 * T0); - - T0 = exp(-0.5 * pParam->BSIM3v32drout * pParam->BSIM3v32leff / T1); - T2 = (T0 + 2.0 * T0 * T0); - pParam->BSIM3v32thetaRout = pParam->BSIM3v32pdibl1 * T2 - + pParam->BSIM3v32pdibl2; - - tmp = sqrt(pParam->BSIM3v32Xdep0); - tmp1 = pParam->BSIM3v32vbi - pParam->BSIM3v32phi; - tmp2 = model->BSIM3v32factor1 * tmp; - - T0 = -0.5 * pParam->BSIM3v32dvt1w * pParam->BSIM3v32weff - * pParam->BSIM3v32leff / tmp2; - if (T0 > -EXP_THRESHOLD) - { T1 = exp(T0); - T2 = T1 * (1.0 + 2.0 * T1); - } - else - { T1 = MIN_EXP; - T2 = T1 * (1.0 + 2.0 * T1); - } - T0 = pParam->BSIM3v32dvt0w * T2; - T2 = T0 * tmp1; - - T0 = -0.5 * pParam->BSIM3v32dvt1 * pParam->BSIM3v32leff / tmp2; - if (T0 > -EXP_THRESHOLD) - { T1 = exp(T0); - T3 = T1 * (1.0 + 2.0 * T1); - } - else - { T1 = MIN_EXP; - T3 = T1 * (1.0 + 2.0 * T1); - } - T3 = pParam->BSIM3v32dvt0 * T3 * tmp1; - - T4 = model->BSIM3v32tox * pParam->BSIM3v32phi - / (pParam->BSIM3v32weff + pParam->BSIM3v32w0); - - T0 = sqrt(1.0 + pParam->BSIM3v32nlx / pParam->BSIM3v32leff); - T5 = pParam->BSIM3v32k1ox * (T0 - 1.0) * pParam->BSIM3v32sqrtPhi - + (pParam->BSIM3v32kt1 + pParam->BSIM3v32kt1l / pParam->BSIM3v32leff) - * (TRatio - 1.0); - - tmp3 = model->BSIM3v32type * pParam->BSIM3v32vth0 - - T2 - T3 + pParam->BSIM3v32k3 * T4 + T5; - pParam->BSIM3v32vfbzb = tmp3 - pParam->BSIM3v32phi - pParam->BSIM3v32k1 - * pParam->BSIM3v32sqrtPhi; - /* End of vfbzb */ - } - - /* adding delvto */ - here->BSIM3v32vth0 = pParam->BSIM3v32vth0 + here->BSIM3v32delvto; - here->BSIM3v32vfb = pParam->BSIM3v32vfb + model->BSIM3v32type * here->BSIM3v32delvto; - here->BSIM3v32vfbzb = pParam->BSIM3v32vfbzb + model->BSIM3v32type * here->BSIM3v32delvto; - - /* low field mobility multiplier */ - here->BSIM3v32u0temp = pParam->BSIM3v32u0temp * here->BSIM3v32mulu0; - - here->BSIM3v32tconst = here->BSIM3v32u0temp * pParam->BSIM3v32elm / (model->BSIM3v32cox - * pParam->BSIM3v32weffCV * pParam->BSIM3v32leffCV * T0); - - /* process source/drain series resistance */ - /* ACM model */ - - double DrainResistance, SourceResistance; - - if (model->BSIM3v32acmMod == 0) - { - DrainResistance = model->BSIM3v32sheetResistance - * here->BSIM3v32drainSquares; - SourceResistance = model->BSIM3v32sheetResistance - * here->BSIM3v32sourceSquares; - } - else /* ACM > 0 */ - { - error = ACM_SourceDrainResistances( - model->BSIM3v32acmMod, - model->BSIM3v32ld, - model->BSIM3v32ldif, - model->BSIM3v32hdif, - model->BSIM3v32wmlt, - here->BSIM3v32w, - model->BSIM3v32xw, - model->BSIM3v32sheetResistance, - here->BSIM3v32drainSquaresGiven, - model->BSIM3v32rd, - model->BSIM3v32rdc, - here->BSIM3v32drainSquares, - here->BSIM3v32sourceSquaresGiven, - model->BSIM3v32rs, - model->BSIM3v32rsc, - here->BSIM3v32sourceSquares, - &DrainResistance, - &SourceResistance - ); - if (error) - return(error); - } - if (DrainResistance > 0.0) - here->BSIM3v32drainConductance = 1.0 / DrainResistance; - else - here->BSIM3v32drainConductance = 0.0; - - if (SourceResistance > 0.0) - here->BSIM3v32sourceConductance = 1.0 / SourceResistance; - else - here->BSIM3v32sourceConductance = 0.0; - - here->BSIM3v32cgso = pParam->BSIM3v32cgso; - here->BSIM3v32cgdo = pParam->BSIM3v32cgdo; - - Nvtm = model->BSIM3v32vtm * model->BSIM3v32jctEmissionCoeff; - if (model->BSIM3v32acmMod == 0) - { - if ((here->BSIM3v32sourceArea <= 0.0) && - (here->BSIM3v32sourcePerimeter <= 0.0)) - { SourceSatCurrent = 1.0e-14; - } - else - { SourceSatCurrent = here->BSIM3v32sourceArea - * model->BSIM3v32jctTempSatCurDensity - + here->BSIM3v32sourcePerimeter - * model->BSIM3v32jctSidewallTempSatCurDensity; - } - - if ((here->BSIM3v32drainArea <= 0.0) && - (here->BSIM3v32drainPerimeter <= 0.0)) - { DrainSatCurrent = 1.0e-14; - } - else - { DrainSatCurrent = here->BSIM3v32drainArea - * model->BSIM3v32jctTempSatCurDensity - + here->BSIM3v32drainPerimeter - * model->BSIM3v32jctSidewallTempSatCurDensity; - } - } - else /* ACM > 0 */ - { - error = ACM_saturationCurrents( - model->BSIM3v32acmMod, - model->BSIM3v32calcacm, - here->BSIM3v32geo, - model->BSIM3v32hdif, - model->BSIM3v32wmlt, - here->BSIM3v32w, - model->BSIM3v32xw, - model->BSIM3v32jctTempSatCurDensity, - model->BSIM3v32jctSidewallTempSatCurDensity, - here->BSIM3v32drainAreaGiven, - here->BSIM3v32drainArea, - here->BSIM3v32drainPerimeterGiven, - here->BSIM3v32drainPerimeter, - here->BSIM3v32sourceAreaGiven, - here->BSIM3v32sourceArea, - here->BSIM3v32sourcePerimeterGiven, - here->BSIM3v32sourcePerimeter, - &DrainSatCurrent, - &SourceSatCurrent - ); - if (error) - return(error); - } - - if ((SourceSatCurrent > 0.0) && (model->BSIM3v32ijth > 0.0)) - { here->BSIM3v32vjsm = Nvtm * log(model->BSIM3v32ijth - / SourceSatCurrent + 1.0); - /* Added revision dependent code */ - switch (model->BSIM3v32intVersion) { - case BSIM3v32V324: - case BSIM3v32V323: - case BSIM3v32V322: - here->BSIM3v32IsEvjsm = - SourceSatCurrent * exp(here->BSIM3v32vjsm / Nvtm); - break; - case BSIM3v32V32: - default: - /* Do nothing */ - break; - } - } - - if ((DrainSatCurrent > 0.0) && (model->BSIM3v32ijth > 0.0)) - { here->BSIM3v32vjdm = Nvtm * log(model->BSIM3v32ijth - / DrainSatCurrent + 1.0); - /* Added revision dependent code */ - switch (model->BSIM3v32intVersion) { - case BSIM3v32V324: - case BSIM3v32V323: - case BSIM3v32V322: - here->BSIM3v32IsEvjdm = - DrainSatCurrent * exp(here->BSIM3v32vjdm / Nvtm); - break; - case BSIM3v32V32: - default: - /* Do nothing */ - break; - } - } - } - } - return(OK); -} - diff --git a/src/spicelib/devices/bsim3v32/b3v32trunc.c b/src/spicelib/devices/bsim3v32/b3v32trunc.c deleted file mode 100644 index af96b7969..000000000 --- a/src/spicelib/devices/bsim3v32/b3v32trunc.c +++ /dev/null @@ -1,48 +0,0 @@ -/**** BSIM3v3.2.4, Released by Xuemei Xi 12/21/2001 ****/ - -/********** - * Copyright 2001 Regents of the University of California. All rights reserved. - * File: b3trunc.c of BSIM3v3.2.4 - * Author: 1995 Min-Chie Jeng and Mansun Chan. - * Author: 1997-1999 Weidong Liu. - * Author: 2001 Xuemei Xi - * Modified by Poalo Nenzi 2002 - **********/ - -#include "ngspice/ngspice.h" -#include "ngspice/cktdefs.h" -#include "bsim3v32def.h" -#include "ngspice/sperror.h" -#include "ngspice/suffix.h" - - -int -BSIM3v32trunc (GENmodel *inModel, CKTcircuit *ckt, double *timeStep) -{ -BSIM3v32model *model = (BSIM3v32model*)inModel; -BSIM3v32instance *here; - -#ifdef STEPDEBUG - double debugtemp; -#endif /* STEPDEBUG */ - - for (; model != NULL; model = BSIM3v32nextModel(model)) - { for (here = BSIM3v32instances(model); here != NULL; - here = BSIM3v32nextInstance(here)) - { -#ifdef STEPDEBUG - debugtemp = *timeStep; -#endif /* STEPDEBUG */ - CKTterr(here->BSIM3v32qb,ckt,timeStep); - CKTterr(here->BSIM3v32qg,ckt,timeStep); - CKTterr(here->BSIM3v32qd,ckt,timeStep); -#ifdef STEPDEBUG - if(debugtemp != *timeStep) - { printf("device %s reduces step from %g to %g\n", - here->BSIM3v32name,debugtemp,*timeStep); - } -#endif /* STEPDEBUG */ - } - } - return(OK); -} diff --git a/src/spicelib/devices/bsim3v32/bsim3v32def.h b/src/spicelib/devices/bsim3v32/bsim3v32def.h deleted file mode 100644 index 85192c57f..000000000 --- a/src/spicelib/devices/bsim3v32/bsim3v32def.h +++ /dev/null @@ -1,1923 +0,0 @@ -/********** -Copyright 2001 Regents of the University of California. All rights reserved. -Author: 1995 Min-Chie Jeng and Mansun Chan. -Author: 1997-1999 Weidong Liu. -Author: 2001 Xuemei Xi -Modified by Paolo Nenzi 2002 and Dietmar Warning 2003 -File: bsim3v32def.h -**********/ - -#ifndef BSIM3v32 -#define BSIM3v32 - -#include "ngspice/ifsim.h" -#include "ngspice/gendefs.h" -#include "ngspice/cktdefs.h" -#include "ngspice/complex.h" -#include "ngspice/noisedef.h" - -typedef struct sBSIM3v32instance -{ - - struct GENinstance gen; - -#define BSIM3v32modPtr(inst) ((struct sBSIM3v32model *)((inst)->gen.GENmodPtr)) -#define BSIM3v32nextInstance(inst) ((struct sBSIM3v32instance *)((inst)->gen.GENnextInstance)) -#define BSIM3v32name gen.GENname -#define BSIM3v32states gen.GENstate - - const int BSIM3v32dNode; - const int BSIM3v32gNode; - const int BSIM3v32sNode; - const int BSIM3v32bNode; - int BSIM3v32dNodePrime; - int BSIM3v32sNodePrime; - int BSIM3v32qNode; /* MCJ */ - - /* MCJ */ - double BSIM3v32ueff; - double BSIM3v32thetavth; - double BSIM3v32von; - double BSIM3v32vdsat; - double BSIM3v32cgdo; - double BSIM3v32cgso; - double BSIM3v32vjsm; - double BSIM3v32IsEvjsm; - double BSIM3v32vjdm; - double BSIM3v32IsEvjdm; - - double BSIM3v32l; - double BSIM3v32w; - double BSIM3v32m; - double BSIM3v32drainArea; - double BSIM3v32sourceArea; - double BSIM3v32drainSquares; - double BSIM3v32sourceSquares; - double BSIM3v32drainPerimeter; - double BSIM3v32sourcePerimeter; - double BSIM3v32sourceConductance; - double BSIM3v32drainConductance; - double BSIM3v32delvto; - double BSIM3v32mulu0; - double BSIM3v32vth0; - double BSIM3v32vfb; - double BSIM3v32vfbzb; - double BSIM3v32u0temp; - double BSIM3v32tconst; - - double BSIM3v32icVBS; - double BSIM3v32icVDS; - double BSIM3v32icVGS; - int BSIM3v32off; - int BSIM3v32mode; - int BSIM3v32nqsMod; - int BSIM3v32geo; - - /* OP point */ - double BSIM3v32qinv; - double BSIM3v32cd; - double BSIM3v32cbs; - double BSIM3v32cbd; - double BSIM3v32csub; - double BSIM3v32gm; - double BSIM3v32gds; - double BSIM3v32gmbs; - double BSIM3v32gbd; - double BSIM3v32gbs; - - double BSIM3v32gbbs; - double BSIM3v32gbgs; - double BSIM3v32gbds; - - double BSIM3v32cggb; - double BSIM3v32cgdb; - double BSIM3v32cgsb; - double BSIM3v32cbgb; - double BSIM3v32cbdb; - double BSIM3v32cbsb; - double BSIM3v32cdgb; - double BSIM3v32cddb; - double BSIM3v32cdsb; - double BSIM3v32capbd; - double BSIM3v32capbs; - - double BSIM3v32cqgb; - double BSIM3v32cqdb; - double BSIM3v32cqsb; - double BSIM3v32cqbb; - - double BSIM3v32qgate; - double BSIM3v32qbulk; - double BSIM3v32qdrn; - - double BSIM3v32gtau; - double BSIM3v32gtg; - double BSIM3v32gtd; - double BSIM3v32gts; - double BSIM3v32gtb; - double BSIM3v32rds; /* Noise bugfix */ - double BSIM3v32Vgsteff; - double BSIM3v32Vdseff; - double BSIM3v32Abulk; - double BSIM3v32AbovVgst2Vtm; - - struct bsim3v32SizeDependParam *pParam; - - unsigned BSIM3v32lGiven :1; - unsigned BSIM3v32wGiven :1; - unsigned BSIM3v32mGiven :1; - unsigned BSIM3v32drainAreaGiven :1; - unsigned BSIM3v32sourceAreaGiven :1; - unsigned BSIM3v32drainSquaresGiven :1; - unsigned BSIM3v32sourceSquaresGiven :1; - unsigned BSIM3v32drainPerimeterGiven :1; - unsigned BSIM3v32sourcePerimeterGiven :1; - unsigned BSIM3v32delvtoGiven :1; - unsigned BSIM3v32mulu0Given :1; - unsigned BSIM3v32dNodePrimeSet :1; - unsigned BSIM3v32sNodePrimeSet :1; - unsigned BSIM3v32icVBSGiven :1; - unsigned BSIM3v32icVDSGiven :1; - unsigned BSIM3v32icVGSGiven :1; - unsigned BSIM3v32nqsModGiven :1; - unsigned BSIM3v32geoGiven :1; - - double *BSIM3v32DdPtr; - double *BSIM3v32GgPtr; - double *BSIM3v32SsPtr; - double *BSIM3v32BbPtr; - double *BSIM3v32DPdpPtr; - double *BSIM3v32SPspPtr; - double *BSIM3v32DdpPtr; - double *BSIM3v32GbPtr; - double *BSIM3v32GdpPtr; - double *BSIM3v32GspPtr; - double *BSIM3v32SspPtr; - double *BSIM3v32BdpPtr; - double *BSIM3v32BspPtr; - double *BSIM3v32DPspPtr; - double *BSIM3v32DPdPtr; - double *BSIM3v32BgPtr; - double *BSIM3v32DPgPtr; - double *BSIM3v32SPgPtr; - double *BSIM3v32SPsPtr; - double *BSIM3v32DPbPtr; - double *BSIM3v32SPbPtr; - double *BSIM3v32SPdpPtr; - - double *BSIM3v32QqPtr; - double *BSIM3v32QdpPtr; - double *BSIM3v32QgPtr; - double *BSIM3v32QspPtr; - double *BSIM3v32QbPtr; - double *BSIM3v32DPqPtr; - double *BSIM3v32GqPtr; - double *BSIM3v32SPqPtr; - double *BSIM3v32BqPtr; - -#ifdef USE_OMP - /* per instance storage of results, to update matrix at a later stge */ - double BSIM3v32rhsG; - double BSIM3v32rhsB; - double BSIM3v32rhsD; - double BSIM3v32rhsS; - double BSIM3v32rhsQ; - - double BSIM3v32DdPt; - double BSIM3v32GgPt; - double BSIM3v32SsPt; - double BSIM3v32BbPt; - double BSIM3v32DPdpPt; - double BSIM3v32SPspPt; - double BSIM3v32DdpPt; - double BSIM3v32GbPt; - double BSIM3v32GdpPt; - double BSIM3v32GspPt; - double BSIM3v32SspPt; - double BSIM3v32BdpPt; - double BSIM3v32BspPt; - double BSIM3v32DPspPt; - double BSIM3v32DPdPt; - double BSIM3v32BgPt; - double BSIM3v32DPgPt; - double BSIM3v32SPgPt; - double BSIM3v32SPsPt; - double BSIM3v32DPbPt; - double BSIM3v32SPbPt; - double BSIM3v32SPdpPt; - - double BSIM3v32QqPt; - double BSIM3v32QdpPt; - double BSIM3v32QgPt; - double BSIM3v32QspPt; - double BSIM3v32QbPt; - double BSIM3v32DPqPt; - double BSIM3v32GqPt; - double BSIM3v32SPqPt; - double BSIM3v32BqPt; -#endif - -#define BSIM3v32vbd BSIM3v32states+ 0 -#define BSIM3v32vbs BSIM3v32states+ 1 -#define BSIM3v32vgs BSIM3v32states+ 2 -#define BSIM3v32vds BSIM3v32states+ 3 - -#define BSIM3v32qb BSIM3v32states+ 4 -#define BSIM3v32cqb BSIM3v32states+ 5 -#define BSIM3v32qg BSIM3v32states+ 6 -#define BSIM3v32cqg BSIM3v32states+ 7 -#define BSIM3v32qd BSIM3v32states+ 8 -#define BSIM3v32cqd BSIM3v32states+ 9 - -#define BSIM3v32qbs BSIM3v32states+ 10 -#define BSIM3v32qbd BSIM3v32states+ 11 - -#define BSIM3v32qcheq BSIM3v32states+ 12 -#define BSIM3v32cqcheq BSIM3v32states+ 13 -#define BSIM3v32qcdump BSIM3v32states+ 14 -#define BSIM3v32cqcdump BSIM3v32states+ 15 - -#define BSIM3v32qdef BSIM3v32states+ 16 - -#define BSIM3v32numStates 17 - - -/* indices to the array of BSIM3v32 NOISE SOURCES */ - -#define BSIM3v32RDNOIZ 0 -#define BSIM3v32RSNOIZ 1 -#define BSIM3v32IDNOIZ 2 -#define BSIM3v32FLNOIZ 3 -#define BSIM3v32TOTNOIZ 4 - -#define BSIM3v32NSRCS 5 /* the number of BSIM3v32 MOSFET noise sources */ - -#ifndef NONOISE - double BSIM3v32nVar[NSTATVARS][BSIM3v32NSRCS]; -#else /* NONOISE */ - double **BSIM3v32nVar; -#endif /* NONOISE */ - -} BSIM3v32instance ; - -struct bsim3v32SizeDependParam -{ - double Width; - double Length; - - double BSIM3v32cdsc; - double BSIM3v32cdscb; - double BSIM3v32cdscd; - double BSIM3v32cit; - double BSIM3v32nfactor; - double BSIM3v32xj; - double BSIM3v32vsat; - double BSIM3v32at; - double BSIM3v32a0; - double BSIM3v32ags; - double BSIM3v32a1; - double BSIM3v32a2; - double BSIM3v32keta; - double BSIM3v32nsub; - double BSIM3v32npeak; - double BSIM3v32ngate; - double BSIM3v32gamma1; - double BSIM3v32gamma2; - double BSIM3v32vbx; - double BSIM3v32vbi; - double BSIM3v32vbm; - double BSIM3v32vbsc; - double BSIM3v32xt; - double BSIM3v32phi; - double BSIM3v32litl; - double BSIM3v32k1; - double BSIM3v32kt1; - double BSIM3v32kt1l; - double BSIM3v32kt2; - double BSIM3v32k2; - double BSIM3v32k3; - double BSIM3v32k3b; - double BSIM3v32w0; - double BSIM3v32nlx; - double BSIM3v32dvt0; - double BSIM3v32dvt1; - double BSIM3v32dvt2; - double BSIM3v32dvt0w; - double BSIM3v32dvt1w; - double BSIM3v32dvt2w; - double BSIM3v32drout; - double BSIM3v32dsub; - double BSIM3v32vth0; - double BSIM3v32ua; - double BSIM3v32ua1; - double BSIM3v32ub; - double BSIM3v32ub1; - double BSIM3v32uc; - double BSIM3v32uc1; - double BSIM3v32u0; - double BSIM3v32ute; - double BSIM3v32voff; - double BSIM3v32vfb; - double BSIM3v32delta; - double BSIM3v32rdsw; - double BSIM3v32rds0; - double BSIM3v32prwg; - double BSIM3v32prwb; - double BSIM3v32prt; - double BSIM3v32eta0; - double BSIM3v32etab; - double BSIM3v32pclm; - double BSIM3v32pdibl1; - double BSIM3v32pdibl2; - double BSIM3v32pdiblb; - double BSIM3v32pscbe1; - double BSIM3v32pscbe2; - double BSIM3v32pvag; - double BSIM3v32wr; - double BSIM3v32dwg; - double BSIM3v32dwb; - double BSIM3v32b0; - double BSIM3v32b1; - double BSIM3v32alpha0; - double BSIM3v32alpha1; - double BSIM3v32beta0; - - - /* CV model */ - double BSIM3v32elm; - double BSIM3v32cgsl; - double BSIM3v32cgdl; - double BSIM3v32ckappa; - double BSIM3v32cf; - double BSIM3v32clc; - double BSIM3v32cle; - double BSIM3v32vfbcv; - double BSIM3v32noff; - double BSIM3v32voffcv; - double BSIM3v32acde; - double BSIM3v32moin; - - -/* Pre-calculated constants */ - - double BSIM3v32dw; - double BSIM3v32dl; - double BSIM3v32leff; - double BSIM3v32weff; - - double BSIM3v32dwc; - double BSIM3v32dlc; - double BSIM3v32leffCV; - double BSIM3v32weffCV; - double BSIM3v32abulkCVfactor; - double BSIM3v32cgso; - double BSIM3v32cgdo; - double BSIM3v32cgbo; - double BSIM3v32tconst; - - double BSIM3v32u0temp; - double BSIM3v32vsattemp; - double BSIM3v32sqrtPhi; - double BSIM3v32phis3; - double BSIM3v32Xdep0; - double BSIM3v32sqrtXdep0; - double BSIM3v32theta0vb0; - double BSIM3v32thetaRout; - - double BSIM3v32cof1; - double BSIM3v32cof2; - double BSIM3v32cof3; - double BSIM3v32cof4; - double BSIM3v32cdep0; - double BSIM3v32vfbzb; - double BSIM3v32ldeb; - double BSIM3v32k1ox; - double BSIM3v32k2ox; - - struct bsim3v32SizeDependParam *pNext; -}; - - -typedef struct sBSIM3v32model -{ - - struct GENmodel gen; - -#define BSIM3v32modType gen.GENmodType -#define BSIM3v32nextModel(inst) ((struct sBSIM3v32model *)((inst)->gen.GENnextModel)) -#define BSIM3v32instances(inst) ((BSIM3v32instance *)((inst)->gen.GENinstances)) -#define BSIM3v32modName gen.GENmodName - - int BSIM3v32type; - - int BSIM3v32mobMod; - int BSIM3v32capMod; - int BSIM3v32acmMod; - int BSIM3v32calcacm; - int BSIM3v32noiMod; - int BSIM3v32nqsMod; - int BSIM3v32binUnit; - int BSIM3v32paramChk; - char *BSIM3v32version; - /* The following field is an integer coding - * of BSIM3v32version. - */ - int BSIM3v32intVersion; -#define BSIM3v32V324 324 /* BSIM3v32 V3.2.4 */ -#define BSIM3v32V323 323 /* BSIM3v32 V3.2.3 */ -#define BSIM3v32V322 322 /* BSIM3v32 V3.2.2 */ -#define BSIM3v32V32 32 /* BSIM3v32 V3.2 */ -#define BSIM3v32V3OLD 0 /* Old model */ - double BSIM3v32tox; - double BSIM3v32toxm; - double BSIM3v32cdsc; - double BSIM3v32cdscb; - double BSIM3v32cdscd; - double BSIM3v32cit; - double BSIM3v32nfactor; - double BSIM3v32xj; - double BSIM3v32vsat; - double BSIM3v32at; - double BSIM3v32a0; - double BSIM3v32ags; - double BSIM3v32a1; - double BSIM3v32a2; - double BSIM3v32keta; - double BSIM3v32nsub; - double BSIM3v32npeak; - double BSIM3v32ngate; - double BSIM3v32gamma1; - double BSIM3v32gamma2; - double BSIM3v32vbx; - double BSIM3v32vbm; - double BSIM3v32xt; - double BSIM3v32k1; - double BSIM3v32kt1; - double BSIM3v32kt1l; - double BSIM3v32kt2; - double BSIM3v32k2; - double BSIM3v32k3; - double BSIM3v32k3b; - double BSIM3v32w0; - double BSIM3v32nlx; - double BSIM3v32dvt0; - double BSIM3v32dvt1; - double BSIM3v32dvt2; - double BSIM3v32dvt0w; - double BSIM3v32dvt1w; - double BSIM3v32dvt2w; - double BSIM3v32drout; - double BSIM3v32dsub; - double BSIM3v32vth0; - double BSIM3v32ua; - double BSIM3v32ua1; - double BSIM3v32ub; - double BSIM3v32ub1; - double BSIM3v32uc; - double BSIM3v32uc1; - double BSIM3v32u0; - double BSIM3v32ute; - double BSIM3v32voff; - double BSIM3v32delta; - double BSIM3v32rdsw; - double BSIM3v32prwg; - double BSIM3v32prwb; - double BSIM3v32prt; - double BSIM3v32eta0; - double BSIM3v32etab; - double BSIM3v32pclm; - double BSIM3v32pdibl1; - double BSIM3v32pdibl2; - double BSIM3v32pdiblb; - double BSIM3v32pscbe1; - double BSIM3v32pscbe2; - double BSIM3v32pvag; - double BSIM3v32wr; - double BSIM3v32dwg; - double BSIM3v32dwb; - double BSIM3v32b0; - double BSIM3v32b1; - double BSIM3v32alpha0; - double BSIM3v32alpha1; - double BSIM3v32beta0; - double BSIM3v32ijth; - double BSIM3v32vfb; - - /* CV model */ - double BSIM3v32elm; - double BSIM3v32cgsl; - double BSIM3v32cgdl; - double BSIM3v32ckappa; - double BSIM3v32cf; - double BSIM3v32vfbcv; - double BSIM3v32clc; - double BSIM3v32cle; - double BSIM3v32dwc; - double BSIM3v32dlc; - double BSIM3v32noff; - double BSIM3v32voffcv; - double BSIM3v32acde; - double BSIM3v32moin; - double BSIM3v32tcj; - double BSIM3v32tcjsw; - double BSIM3v32tcjswg; - double BSIM3v32tpb; - double BSIM3v32tpbsw; - double BSIM3v32tpbswg; - - /* ACM model */ - double BSIM3v32xl; - double BSIM3v32xw; - double BSIM3v32hdif; - double BSIM3v32ldif; - double BSIM3v32ld; - double BSIM3v32rd; - double BSIM3v32rs; - double BSIM3v32rdc; - double BSIM3v32rsc; - double BSIM3v32wmlt; - - double BSIM3v32lmlt; - - /* Length Dependence */ - double BSIM3v32lcdsc; - double BSIM3v32lcdscb; - double BSIM3v32lcdscd; - double BSIM3v32lcit; - double BSIM3v32lnfactor; - double BSIM3v32lxj; - double BSIM3v32lvsat; - double BSIM3v32lat; - double BSIM3v32la0; - double BSIM3v32lags; - double BSIM3v32la1; - double BSIM3v32la2; - double BSIM3v32lketa; - double BSIM3v32lnsub; - double BSIM3v32lnpeak; - double BSIM3v32lngate; - double BSIM3v32lgamma1; - double BSIM3v32lgamma2; - double BSIM3v32lvbx; - double BSIM3v32lvbm; - double BSIM3v32lxt; - double BSIM3v32lk1; - double BSIM3v32lkt1; - double BSIM3v32lkt1l; - double BSIM3v32lkt2; - double BSIM3v32lk2; - double BSIM3v32lk3; - double BSIM3v32lk3b; - double BSIM3v32lw0; - double BSIM3v32lnlx; - double BSIM3v32ldvt0; - double BSIM3v32ldvt1; - double BSIM3v32ldvt2; - double BSIM3v32ldvt0w; - double BSIM3v32ldvt1w; - double BSIM3v32ldvt2w; - double BSIM3v32ldrout; - double BSIM3v32ldsub; - double BSIM3v32lvth0; - double BSIM3v32lua; - double BSIM3v32lua1; - double BSIM3v32lub; - double BSIM3v32lub1; - double BSIM3v32luc; - double BSIM3v32luc1; - double BSIM3v32lu0; - double BSIM3v32lute; - double BSIM3v32lvoff; - double BSIM3v32ldelta; - double BSIM3v32lrdsw; - double BSIM3v32lprwg; - double BSIM3v32lprwb; - double BSIM3v32lprt; - double BSIM3v32leta0; - double BSIM3v32letab; - double BSIM3v32lpclm; - double BSIM3v32lpdibl1; - double BSIM3v32lpdibl2; - double BSIM3v32lpdiblb; - double BSIM3v32lpscbe1; - double BSIM3v32lpscbe2; - double BSIM3v32lpvag; - double BSIM3v32lwr; - double BSIM3v32ldwg; - double BSIM3v32ldwb; - double BSIM3v32lb0; - double BSIM3v32lb1; - double BSIM3v32lalpha0; - double BSIM3v32lalpha1; - double BSIM3v32lbeta0; - double BSIM3v32lvfb; - - /* CV model */ - double BSIM3v32lelm; - double BSIM3v32lcgsl; - double BSIM3v32lcgdl; - double BSIM3v32lckappa; - double BSIM3v32lcf; - double BSIM3v32lclc; - double BSIM3v32lcle; - double BSIM3v32lvfbcv; - double BSIM3v32lnoff; - double BSIM3v32lvoffcv; - double BSIM3v32lacde; - double BSIM3v32lmoin; - - /* Width Dependence */ - double BSIM3v32wcdsc; - double BSIM3v32wcdscb; - double BSIM3v32wcdscd; - double BSIM3v32wcit; - double BSIM3v32wnfactor; - double BSIM3v32wxj; - double BSIM3v32wvsat; - double BSIM3v32wat; - double BSIM3v32wa0; - double BSIM3v32wags; - double BSIM3v32wa1; - double BSIM3v32wa2; - double BSIM3v32wketa; - double BSIM3v32wnsub; - double BSIM3v32wnpeak; - double BSIM3v32wngate; - double BSIM3v32wgamma1; - double BSIM3v32wgamma2; - double BSIM3v32wvbx; - double BSIM3v32wvbm; - double BSIM3v32wxt; - double BSIM3v32wk1; - double BSIM3v32wkt1; - double BSIM3v32wkt1l; - double BSIM3v32wkt2; - double BSIM3v32wk2; - double BSIM3v32wk3; - double BSIM3v32wk3b; - double BSIM3v32ww0; - double BSIM3v32wnlx; - double BSIM3v32wdvt0; - double BSIM3v32wdvt1; - double BSIM3v32wdvt2; - double BSIM3v32wdvt0w; - double BSIM3v32wdvt1w; - double BSIM3v32wdvt2w; - double BSIM3v32wdrout; - double BSIM3v32wdsub; - double BSIM3v32wvth0; - double BSIM3v32wua; - double BSIM3v32wua1; - double BSIM3v32wub; - double BSIM3v32wub1; - double BSIM3v32wuc; - double BSIM3v32wuc1; - double BSIM3v32wu0; - double BSIM3v32wute; - double BSIM3v32wvoff; - double BSIM3v32wdelta; - double BSIM3v32wrdsw; - double BSIM3v32wprwg; - double BSIM3v32wprwb; - double BSIM3v32wprt; - double BSIM3v32weta0; - double BSIM3v32wetab; - double BSIM3v32wpclm; - double BSIM3v32wpdibl1; - double BSIM3v32wpdibl2; - double BSIM3v32wpdiblb; - double BSIM3v32wpscbe1; - double BSIM3v32wpscbe2; - double BSIM3v32wpvag; - double BSIM3v32wwr; - double BSIM3v32wdwg; - double BSIM3v32wdwb; - double BSIM3v32wb0; - double BSIM3v32wb1; - double BSIM3v32walpha0; - double BSIM3v32walpha1; - double BSIM3v32wbeta0; - double BSIM3v32wvfb; - - /* CV model */ - double BSIM3v32welm; - double BSIM3v32wcgsl; - double BSIM3v32wcgdl; - double BSIM3v32wckappa; - double BSIM3v32wcf; - double BSIM3v32wclc; - double BSIM3v32wcle; - double BSIM3v32wvfbcv; - double BSIM3v32wnoff; - double BSIM3v32wvoffcv; - double BSIM3v32wacde; - double BSIM3v32wmoin; - - /* Cross-term Dependence */ - double BSIM3v32pcdsc; - double BSIM3v32pcdscb; - double BSIM3v32pcdscd; - double BSIM3v32pcit; - double BSIM3v32pnfactor; - double BSIM3v32pxj; - double BSIM3v32pvsat; - double BSIM3v32pat; - double BSIM3v32pa0; - double BSIM3v32pags; - double BSIM3v32pa1; - double BSIM3v32pa2; - double BSIM3v32pketa; - double BSIM3v32pnsub; - double BSIM3v32pnpeak; - double BSIM3v32pngate; - double BSIM3v32pgamma1; - double BSIM3v32pgamma2; - double BSIM3v32pvbx; - double BSIM3v32pvbm; - double BSIM3v32pxt; - double BSIM3v32pk1; - double BSIM3v32pkt1; - double BSIM3v32pkt1l; - double BSIM3v32pkt2; - double BSIM3v32pk2; - double BSIM3v32pk3; - double BSIM3v32pk3b; - double BSIM3v32pw0; - double BSIM3v32pnlx; - double BSIM3v32pdvt0; - double BSIM3v32pdvt1; - double BSIM3v32pdvt2; - double BSIM3v32pdvt0w; - double BSIM3v32pdvt1w; - double BSIM3v32pdvt2w; - double BSIM3v32pdrout; - double BSIM3v32pdsub; - double BSIM3v32pvth0; - double BSIM3v32pua; - double BSIM3v32pua1; - double BSIM3v32pub; - double BSIM3v32pub1; - double BSIM3v32puc; - double BSIM3v32puc1; - double BSIM3v32pu0; - double BSIM3v32pute; - double BSIM3v32pvoff; - double BSIM3v32pdelta; - double BSIM3v32prdsw; - double BSIM3v32pprwg; - double BSIM3v32pprwb; - double BSIM3v32pprt; - double BSIM3v32peta0; - double BSIM3v32petab; - double BSIM3v32ppclm; - double BSIM3v32ppdibl1; - double BSIM3v32ppdibl2; - double BSIM3v32ppdiblb; - double BSIM3v32ppscbe1; - double BSIM3v32ppscbe2; - double BSIM3v32ppvag; - double BSIM3v32pwr; - double BSIM3v32pdwg; - double BSIM3v32pdwb; - double BSIM3v32pb0; - double BSIM3v32pb1; - double BSIM3v32palpha0; - double BSIM3v32palpha1; - double BSIM3v32pbeta0; - double BSIM3v32pvfb; - - /* CV model */ - double BSIM3v32pelm; - double BSIM3v32pcgsl; - double BSIM3v32pcgdl; - double BSIM3v32pckappa; - double BSIM3v32pcf; - double BSIM3v32pclc; - double BSIM3v32pcle; - double BSIM3v32pvfbcv; - double BSIM3v32pnoff; - double BSIM3v32pvoffcv; - double BSIM3v32pacde; - double BSIM3v32pmoin; - - double BSIM3v32tnom; - double BSIM3v32cgso; - double BSIM3v32cgdo; - double BSIM3v32cgbo; - double BSIM3v32xpart; - double BSIM3v32cFringOut; - double BSIM3v32cFringMax; - - double BSIM3v32sheetResistance; - double BSIM3v32jctSatCurDensity; - double BSIM3v32jctSidewallSatCurDensity; - double BSIM3v32bulkJctPotential; - double BSIM3v32bulkJctBotGradingCoeff; - double BSIM3v32bulkJctSideGradingCoeff; - double BSIM3v32bulkJctGateSideGradingCoeff; - double BSIM3v32sidewallJctPotential; - double BSIM3v32GatesidewallJctPotential; - double BSIM3v32unitAreaJctCap; - double BSIM3v32unitLengthSidewallJctCap; - double BSIM3v32unitLengthGateSidewallJctCap; - double BSIM3v32jctEmissionCoeff; - double BSIM3v32jctTempExponent; - - double BSIM3v32Lint; - double BSIM3v32Ll; - double BSIM3v32Llc; - double BSIM3v32Lln; - double BSIM3v32Lw; - double BSIM3v32Lwc; - double BSIM3v32Lwn; - double BSIM3v32Lwl; - double BSIM3v32Lwlc; - double BSIM3v32Lmin; - double BSIM3v32Lmax; - - double BSIM3v32Wint; - double BSIM3v32Wl; - double BSIM3v32Wlc; - double BSIM3v32Wln; - double BSIM3v32Ww; - double BSIM3v32Wwc; - double BSIM3v32Wwn; - double BSIM3v32Wwl; - double BSIM3v32Wwlc; - double BSIM3v32Wmin; - double BSIM3v32Wmax; - -/* Pre-calculated constants */ - /* MCJ: move to size-dependent param. */ - double BSIM3v32vtm; - double BSIM3v32cox; - double BSIM3v32cof1; - double BSIM3v32cof2; - double BSIM3v32cof3; - double BSIM3v32cof4; - double BSIM3v32vcrit; - double BSIM3v32factor1; - double BSIM3v32PhiB; - double BSIM3v32PhiBSW; - double BSIM3v32PhiBSWG; - double BSIM3v32jctTempSatCurDensity; - double BSIM3v32jctSidewallTempSatCurDensity; - double BSIM3v32unitAreaTempJctCap; - double BSIM3v32unitLengthSidewallTempJctCap; - double BSIM3v32unitLengthGateSidewallTempJctCap; - - double BSIM3v32oxideTrapDensityA; - double BSIM3v32oxideTrapDensityB; - double BSIM3v32oxideTrapDensityC; - double BSIM3v32em; - double BSIM3v32ef; - double BSIM3v32af; - double BSIM3v32kf; - - double BSIM3v32vgsMax; - double BSIM3v32vgdMax; - double BSIM3v32vgbMax; - double BSIM3v32vdsMax; - double BSIM3v32vbsMax; - double BSIM3v32vbdMax; - double BSIM3v32vgsrMax; - double BSIM3v32vgdrMax; - double BSIM3v32vgbrMax; - double BSIM3v32vbsrMax; - double BSIM3v32vbdrMax; - - struct bsim3v32SizeDependParam *pSizeDependParamKnot; - -#ifdef USE_OMP - int BSIM3v32InstCount; - struct sBSIM3v32instance **BSIM3v32InstanceArray; -#endif - - /* Flags */ - unsigned BSIM3v32mobModGiven :1; - unsigned BSIM3v32binUnitGiven :1; - unsigned BSIM3v32capModGiven :1; - unsigned BSIM3v32acmModGiven :1; - unsigned BSIM3v32calcacmGiven :1; - unsigned BSIM3v32paramChkGiven :1; - unsigned BSIM3v32noiModGiven :1; - unsigned BSIM3v32nqsModGiven :1; - unsigned BSIM3v32typeGiven :1; - unsigned BSIM3v32toxGiven :1; - unsigned BSIM3v32versionGiven :1; - unsigned BSIM3v32toxmGiven :1; - unsigned BSIM3v32cdscGiven :1; - unsigned BSIM3v32cdscbGiven :1; - unsigned BSIM3v32cdscdGiven :1; - unsigned BSIM3v32citGiven :1; - unsigned BSIM3v32nfactorGiven :1; - unsigned BSIM3v32xjGiven :1; - unsigned BSIM3v32vsatGiven :1; - unsigned BSIM3v32atGiven :1; - unsigned BSIM3v32a0Given :1; - unsigned BSIM3v32agsGiven :1; - unsigned BSIM3v32a1Given :1; - unsigned BSIM3v32a2Given :1; - unsigned BSIM3v32ketaGiven :1; - unsigned BSIM3v32nsubGiven :1; - unsigned BSIM3v32npeakGiven :1; - unsigned BSIM3v32ngateGiven :1; - unsigned BSIM3v32gamma1Given :1; - unsigned BSIM3v32gamma2Given :1; - unsigned BSIM3v32vbxGiven :1; - unsigned BSIM3v32vbmGiven :1; - unsigned BSIM3v32xtGiven :1; - unsigned BSIM3v32k1Given :1; - unsigned BSIM3v32kt1Given :1; - unsigned BSIM3v32kt1lGiven :1; - unsigned BSIM3v32kt2Given :1; - unsigned BSIM3v32k2Given :1; - unsigned BSIM3v32k3Given :1; - unsigned BSIM3v32k3bGiven :1; - unsigned BSIM3v32w0Given :1; - unsigned BSIM3v32nlxGiven :1; - unsigned BSIM3v32dvt0Given :1; - unsigned BSIM3v32dvt1Given :1; - unsigned BSIM3v32dvt2Given :1; - unsigned BSIM3v32dvt0wGiven :1; - unsigned BSIM3v32dvt1wGiven :1; - unsigned BSIM3v32dvt2wGiven :1; - unsigned BSIM3v32droutGiven :1; - unsigned BSIM3v32dsubGiven :1; - unsigned BSIM3v32vth0Given :1; - unsigned BSIM3v32uaGiven :1; - unsigned BSIM3v32ua1Given :1; - unsigned BSIM3v32ubGiven :1; - unsigned BSIM3v32ub1Given :1; - unsigned BSIM3v32ucGiven :1; - unsigned BSIM3v32uc1Given :1; - unsigned BSIM3v32u0Given :1; - unsigned BSIM3v32uteGiven :1; - unsigned BSIM3v32voffGiven :1; - unsigned BSIM3v32rdswGiven :1; - unsigned BSIM3v32prwgGiven :1; - unsigned BSIM3v32prwbGiven :1; - unsigned BSIM3v32prtGiven :1; - unsigned BSIM3v32eta0Given :1; - unsigned BSIM3v32etabGiven :1; - unsigned BSIM3v32pclmGiven :1; - unsigned BSIM3v32pdibl1Given :1; - unsigned BSIM3v32pdibl2Given :1; - unsigned BSIM3v32pdiblbGiven :1; - unsigned BSIM3v32pscbe1Given :1; - unsigned BSIM3v32pscbe2Given :1; - unsigned BSIM3v32pvagGiven :1; - unsigned BSIM3v32deltaGiven :1; - unsigned BSIM3v32wrGiven :1; - unsigned BSIM3v32dwgGiven :1; - unsigned BSIM3v32dwbGiven :1; - unsigned BSIM3v32b0Given :1; - unsigned BSIM3v32b1Given :1; - unsigned BSIM3v32alpha0Given :1; - unsigned BSIM3v32alpha1Given :1; - unsigned BSIM3v32beta0Given :1; - unsigned BSIM3v32ijthGiven :1; - unsigned BSIM3v32vfbGiven :1; - - /* CV model */ - unsigned BSIM3v32elmGiven :1; - unsigned BSIM3v32cgslGiven :1; - unsigned BSIM3v32cgdlGiven :1; - unsigned BSIM3v32ckappaGiven :1; - unsigned BSIM3v32cfGiven :1; - unsigned BSIM3v32vfbcvGiven :1; - unsigned BSIM3v32clcGiven :1; - unsigned BSIM3v32cleGiven :1; - unsigned BSIM3v32dwcGiven :1; - unsigned BSIM3v32dlcGiven :1; - unsigned BSIM3v32noffGiven :1; - unsigned BSIM3v32voffcvGiven :1; - unsigned BSIM3v32acdeGiven :1; - unsigned BSIM3v32moinGiven :1; - unsigned BSIM3v32tcjGiven :1; - unsigned BSIM3v32tcjswGiven :1; - unsigned BSIM3v32tcjswgGiven :1; - unsigned BSIM3v32tpbGiven :1; - unsigned BSIM3v32tpbswGiven :1; - unsigned BSIM3v32tpbswgGiven :1; - - /* ACM model */ - unsigned BSIM3v32xlGiven :1; - unsigned BSIM3v32xwGiven :1; - unsigned BSIM3v32hdifGiven :1; - unsigned BSIM3v32ldifGiven :1; - unsigned BSIM3v32ldGiven :1; - unsigned BSIM3v32rdGiven :1; - unsigned BSIM3v32rsGiven :1; - unsigned BSIM3v32rdcGiven :1; - unsigned BSIM3v32rscGiven :1; - unsigned BSIM3v32wmltGiven :1; - - unsigned BSIM3v32lmltGiven :1; - - /* Length dependence */ - unsigned BSIM3v32lcdscGiven :1; - unsigned BSIM3v32lcdscbGiven :1; - unsigned BSIM3v32lcdscdGiven :1; - unsigned BSIM3v32lcitGiven :1; - unsigned BSIM3v32lnfactorGiven :1; - unsigned BSIM3v32lxjGiven :1; - unsigned BSIM3v32lvsatGiven :1; - unsigned BSIM3v32latGiven :1; - unsigned BSIM3v32la0Given :1; - unsigned BSIM3v32lagsGiven :1; - unsigned BSIM3v32la1Given :1; - unsigned BSIM3v32la2Given :1; - unsigned BSIM3v32lketaGiven :1; - unsigned BSIM3v32lnsubGiven :1; - unsigned BSIM3v32lnpeakGiven :1; - unsigned BSIM3v32lngateGiven :1; - unsigned BSIM3v32lgamma1Given :1; - unsigned BSIM3v32lgamma2Given :1; - unsigned BSIM3v32lvbxGiven :1; - unsigned BSIM3v32lvbmGiven :1; - unsigned BSIM3v32lxtGiven :1; - unsigned BSIM3v32lk1Given :1; - unsigned BSIM3v32lkt1Given :1; - unsigned BSIM3v32lkt1lGiven :1; - unsigned BSIM3v32lkt2Given :1; - unsigned BSIM3v32lk2Given :1; - unsigned BSIM3v32lk3Given :1; - unsigned BSIM3v32lk3bGiven :1; - unsigned BSIM3v32lw0Given :1; - unsigned BSIM3v32lnlxGiven :1; - unsigned BSIM3v32ldvt0Given :1; - unsigned BSIM3v32ldvt1Given :1; - unsigned BSIM3v32ldvt2Given :1; - unsigned BSIM3v32ldvt0wGiven :1; - unsigned BSIM3v32ldvt1wGiven :1; - unsigned BSIM3v32ldvt2wGiven :1; - unsigned BSIM3v32ldroutGiven :1; - unsigned BSIM3v32ldsubGiven :1; - unsigned BSIM3v32lvth0Given :1; - unsigned BSIM3v32luaGiven :1; - unsigned BSIM3v32lua1Given :1; - unsigned BSIM3v32lubGiven :1; - unsigned BSIM3v32lub1Given :1; - unsigned BSIM3v32lucGiven :1; - unsigned BSIM3v32luc1Given :1; - unsigned BSIM3v32lu0Given :1; - unsigned BSIM3v32luteGiven :1; - unsigned BSIM3v32lvoffGiven :1; - unsigned BSIM3v32lrdswGiven :1; - unsigned BSIM3v32lprwgGiven :1; - unsigned BSIM3v32lprwbGiven :1; - unsigned BSIM3v32lprtGiven :1; - unsigned BSIM3v32leta0Given :1; - unsigned BSIM3v32letabGiven :1; - unsigned BSIM3v32lpclmGiven :1; - unsigned BSIM3v32lpdibl1Given :1; - unsigned BSIM3v32lpdibl2Given :1; - unsigned BSIM3v32lpdiblbGiven :1; - unsigned BSIM3v32lpscbe1Given :1; - unsigned BSIM3v32lpscbe2Given :1; - unsigned BSIM3v32lpvagGiven :1; - unsigned BSIM3v32ldeltaGiven :1; - unsigned BSIM3v32lwrGiven :1; - unsigned BSIM3v32ldwgGiven :1; - unsigned BSIM3v32ldwbGiven :1; - unsigned BSIM3v32lb0Given :1; - unsigned BSIM3v32lb1Given :1; - unsigned BSIM3v32lalpha0Given :1; - unsigned BSIM3v32lalpha1Given :1; - unsigned BSIM3v32lbeta0Given :1; - unsigned BSIM3v32lvfbGiven :1; - - /* CV model */ - unsigned BSIM3v32lelmGiven :1; - unsigned BSIM3v32lcgslGiven :1; - unsigned BSIM3v32lcgdlGiven :1; - unsigned BSIM3v32lckappaGiven :1; - unsigned BSIM3v32lcfGiven :1; - unsigned BSIM3v32lclcGiven :1; - unsigned BSIM3v32lcleGiven :1; - unsigned BSIM3v32lvfbcvGiven :1; - unsigned BSIM3v32lnoffGiven :1; - unsigned BSIM3v32lvoffcvGiven :1; - unsigned BSIM3v32lacdeGiven :1; - unsigned BSIM3v32lmoinGiven :1; - - /* Width dependence */ - unsigned BSIM3v32wcdscGiven :1; - unsigned BSIM3v32wcdscbGiven :1; - unsigned BSIM3v32wcdscdGiven :1; - unsigned BSIM3v32wcitGiven :1; - unsigned BSIM3v32wnfactorGiven :1; - unsigned BSIM3v32wxjGiven :1; - unsigned BSIM3v32wvsatGiven :1; - unsigned BSIM3v32watGiven :1; - unsigned BSIM3v32wa0Given :1; - unsigned BSIM3v32wagsGiven :1; - unsigned BSIM3v32wa1Given :1; - unsigned BSIM3v32wa2Given :1; - unsigned BSIM3v32wketaGiven :1; - unsigned BSIM3v32wnsubGiven :1; - unsigned BSIM3v32wnpeakGiven :1; - unsigned BSIM3v32wngateGiven :1; - unsigned BSIM3v32wgamma1Given :1; - unsigned BSIM3v32wgamma2Given :1; - unsigned BSIM3v32wvbxGiven :1; - unsigned BSIM3v32wvbmGiven :1; - unsigned BSIM3v32wxtGiven :1; - unsigned BSIM3v32wk1Given :1; - unsigned BSIM3v32wkt1Given :1; - unsigned BSIM3v32wkt1lGiven :1; - unsigned BSIM3v32wkt2Given :1; - unsigned BSIM3v32wk2Given :1; - unsigned BSIM3v32wk3Given :1; - unsigned BSIM3v32wk3bGiven :1; - unsigned BSIM3v32ww0Given :1; - unsigned BSIM3v32wnlxGiven :1; - unsigned BSIM3v32wdvt0Given :1; - unsigned BSIM3v32wdvt1Given :1; - unsigned BSIM3v32wdvt2Given :1; - unsigned BSIM3v32wdvt0wGiven :1; - unsigned BSIM3v32wdvt1wGiven :1; - unsigned BSIM3v32wdvt2wGiven :1; - unsigned BSIM3v32wdroutGiven :1; - unsigned BSIM3v32wdsubGiven :1; - unsigned BSIM3v32wvth0Given :1; - unsigned BSIM3v32wuaGiven :1; - unsigned BSIM3v32wua1Given :1; - unsigned BSIM3v32wubGiven :1; - unsigned BSIM3v32wub1Given :1; - unsigned BSIM3v32wucGiven :1; - unsigned BSIM3v32wuc1Given :1; - unsigned BSIM3v32wu0Given :1; - unsigned BSIM3v32wuteGiven :1; - unsigned BSIM3v32wvoffGiven :1; - unsigned BSIM3v32wrdswGiven :1; - unsigned BSIM3v32wprwgGiven :1; - unsigned BSIM3v32wprwbGiven :1; - unsigned BSIM3v32wprtGiven :1; - unsigned BSIM3v32weta0Given :1; - unsigned BSIM3v32wetabGiven :1; - unsigned BSIM3v32wpclmGiven :1; - unsigned BSIM3v32wpdibl1Given :1; - unsigned BSIM3v32wpdibl2Given :1; - unsigned BSIM3v32wpdiblbGiven :1; - unsigned BSIM3v32wpscbe1Given :1; - unsigned BSIM3v32wpscbe2Given :1; - unsigned BSIM3v32wpvagGiven :1; - unsigned BSIM3v32wdeltaGiven :1; - unsigned BSIM3v32wwrGiven :1; - unsigned BSIM3v32wdwgGiven :1; - unsigned BSIM3v32wdwbGiven :1; - unsigned BSIM3v32wb0Given :1; - unsigned BSIM3v32wb1Given :1; - unsigned BSIM3v32walpha0Given :1; - unsigned BSIM3v32walpha1Given :1; - unsigned BSIM3v32wbeta0Given :1; - unsigned BSIM3v32wvfbGiven :1; - - /* CV model */ - unsigned BSIM3v32welmGiven :1; - unsigned BSIM3v32wcgslGiven :1; - unsigned BSIM3v32wcgdlGiven :1; - unsigned BSIM3v32wckappaGiven :1; - unsigned BSIM3v32wcfGiven :1; - unsigned BSIM3v32wclcGiven :1; - unsigned BSIM3v32wcleGiven :1; - unsigned BSIM3v32wvfbcvGiven :1; - unsigned BSIM3v32wnoffGiven :1; - unsigned BSIM3v32wvoffcvGiven :1; - unsigned BSIM3v32wacdeGiven :1; - unsigned BSIM3v32wmoinGiven :1; - - /* Cross-term dependence */ - unsigned BSIM3v32pcdscGiven :1; - unsigned BSIM3v32pcdscbGiven :1; - unsigned BSIM3v32pcdscdGiven :1; - unsigned BSIM3v32pcitGiven :1; - unsigned BSIM3v32pnfactorGiven :1; - unsigned BSIM3v32pxjGiven :1; - unsigned BSIM3v32pvsatGiven :1; - unsigned BSIM3v32patGiven :1; - unsigned BSIM3v32pa0Given :1; - unsigned BSIM3v32pagsGiven :1; - unsigned BSIM3v32pa1Given :1; - unsigned BSIM3v32pa2Given :1; - unsigned BSIM3v32pketaGiven :1; - unsigned BSIM3v32pnsubGiven :1; - unsigned BSIM3v32pnpeakGiven :1; - unsigned BSIM3v32pngateGiven :1; - unsigned BSIM3v32pgamma1Given :1; - unsigned BSIM3v32pgamma2Given :1; - unsigned BSIM3v32pvbxGiven :1; - unsigned BSIM3v32pvbmGiven :1; - unsigned BSIM3v32pxtGiven :1; - unsigned BSIM3v32pk1Given :1; - unsigned BSIM3v32pkt1Given :1; - unsigned BSIM3v32pkt1lGiven :1; - unsigned BSIM3v32pkt2Given :1; - unsigned BSIM3v32pk2Given :1; - unsigned BSIM3v32pk3Given :1; - unsigned BSIM3v32pk3bGiven :1; - unsigned BSIM3v32pw0Given :1; - unsigned BSIM3v32pnlxGiven :1; - unsigned BSIM3v32pdvt0Given :1; - unsigned BSIM3v32pdvt1Given :1; - unsigned BSIM3v32pdvt2Given :1; - unsigned BSIM3v32pdvt0wGiven :1; - unsigned BSIM3v32pdvt1wGiven :1; - unsigned BSIM3v32pdvt2wGiven :1; - unsigned BSIM3v32pdroutGiven :1; - unsigned BSIM3v32pdsubGiven :1; - unsigned BSIM3v32pvth0Given :1; - unsigned BSIM3v32puaGiven :1; - unsigned BSIM3v32pua1Given :1; - unsigned BSIM3v32pubGiven :1; - unsigned BSIM3v32pub1Given :1; - unsigned BSIM3v32pucGiven :1; - unsigned BSIM3v32puc1Given :1; - unsigned BSIM3v32pu0Given :1; - unsigned BSIM3v32puteGiven :1; - unsigned BSIM3v32pvoffGiven :1; - unsigned BSIM3v32prdswGiven :1; - unsigned BSIM3v32pprwgGiven :1; - unsigned BSIM3v32pprwbGiven :1; - unsigned BSIM3v32pprtGiven :1; - unsigned BSIM3v32peta0Given :1; - unsigned BSIM3v32petabGiven :1; - unsigned BSIM3v32ppclmGiven :1; - unsigned BSIM3v32ppdibl1Given :1; - unsigned BSIM3v32ppdibl2Given :1; - unsigned BSIM3v32ppdiblbGiven :1; - unsigned BSIM3v32ppscbe1Given :1; - unsigned BSIM3v32ppscbe2Given :1; - unsigned BSIM3v32ppvagGiven :1; - unsigned BSIM3v32pdeltaGiven :1; - unsigned BSIM3v32pwrGiven :1; - unsigned BSIM3v32pdwgGiven :1; - unsigned BSIM3v32pdwbGiven :1; - unsigned BSIM3v32pb0Given :1; - unsigned BSIM3v32pb1Given :1; - unsigned BSIM3v32palpha0Given :1; - unsigned BSIM3v32palpha1Given :1; - unsigned BSIM3v32pbeta0Given :1; - unsigned BSIM3v32pvfbGiven :1; - - /* CV model */ - unsigned BSIM3v32pelmGiven :1; - unsigned BSIM3v32pcgslGiven :1; - unsigned BSIM3v32pcgdlGiven :1; - unsigned BSIM3v32pckappaGiven :1; - unsigned BSIM3v32pcfGiven :1; - unsigned BSIM3v32pclcGiven :1; - unsigned BSIM3v32pcleGiven :1; - unsigned BSIM3v32pvfbcvGiven :1; - unsigned BSIM3v32pnoffGiven :1; - unsigned BSIM3v32pvoffcvGiven :1; - unsigned BSIM3v32pacdeGiven :1; - unsigned BSIM3v32pmoinGiven :1; - - unsigned BSIM3v32useFringeGiven :1; - - unsigned BSIM3v32tnomGiven :1; - unsigned BSIM3v32cgsoGiven :1; - unsigned BSIM3v32cgdoGiven :1; - unsigned BSIM3v32cgboGiven :1; - unsigned BSIM3v32xpartGiven :1; - unsigned BSIM3v32sheetResistanceGiven :1; - unsigned BSIM3v32jctSatCurDensityGiven :1; - unsigned BSIM3v32jctSidewallSatCurDensityGiven :1; - unsigned BSIM3v32bulkJctPotentialGiven :1; - unsigned BSIM3v32bulkJctBotGradingCoeffGiven :1; - unsigned BSIM3v32sidewallJctPotentialGiven :1; - unsigned BSIM3v32GatesidewallJctPotentialGiven :1; - unsigned BSIM3v32bulkJctSideGradingCoeffGiven :1; - unsigned BSIM3v32unitAreaJctCapGiven :1; - unsigned BSIM3v32unitLengthSidewallJctCapGiven :1; - unsigned BSIM3v32bulkJctGateSideGradingCoeffGiven :1; - unsigned BSIM3v32unitLengthGateSidewallJctCapGiven :1; - unsigned BSIM3v32jctEmissionCoeffGiven :1; - unsigned BSIM3v32jctTempExponentGiven :1; - - unsigned BSIM3v32oxideTrapDensityAGiven :1; - unsigned BSIM3v32oxideTrapDensityBGiven :1; - unsigned BSIM3v32oxideTrapDensityCGiven :1; - unsigned BSIM3v32emGiven :1; - unsigned BSIM3v32efGiven :1; - unsigned BSIM3v32afGiven :1; - unsigned BSIM3v32kfGiven :1; - - unsigned BSIM3v32LintGiven :1; - unsigned BSIM3v32LlGiven :1; - unsigned BSIM3v32LlcGiven :1; - unsigned BSIM3v32LlnGiven :1; - unsigned BSIM3v32LwGiven :1; - unsigned BSIM3v32LwcGiven :1; - unsigned BSIM3v32LwnGiven :1; - unsigned BSIM3v32LwlGiven :1; - unsigned BSIM3v32LwlcGiven :1; - unsigned BSIM3v32LminGiven :1; - unsigned BSIM3v32LmaxGiven :1; - - unsigned BSIM3v32WintGiven :1; - unsigned BSIM3v32WlGiven :1; - unsigned BSIM3v32WlcGiven :1; - unsigned BSIM3v32WlnGiven :1; - unsigned BSIM3v32WwGiven :1; - unsigned BSIM3v32WwcGiven :1; - unsigned BSIM3v32WwnGiven :1; - unsigned BSIM3v32WwlGiven :1; - unsigned BSIM3v32WwlcGiven :1; - unsigned BSIM3v32WminGiven :1; - unsigned BSIM3v32WmaxGiven :1; - - unsigned BSIM3v32vgsMaxGiven :1; - unsigned BSIM3v32vgdMaxGiven :1; - unsigned BSIM3v32vgbMaxGiven :1; - unsigned BSIM3v32vdsMaxGiven :1; - unsigned BSIM3v32vbsMaxGiven :1; - unsigned BSIM3v32vbdMaxGiven :1; - unsigned BSIM3v32vgsrMaxGiven :1; - unsigned BSIM3v32vgdrMaxGiven :1; - unsigned BSIM3v32vgbrMaxGiven :1; - unsigned BSIM3v32vbsrMaxGiven :1; - unsigned BSIM3v32vbdrMaxGiven :1; - -} BSIM3v32model; - - -#ifndef NMOS -#define NMOS 1 -#define PMOS -1 -#endif /*NMOS*/ - - -/* device parameters */ -#define BSIM3v32_W 1 -#define BSIM3v32_L 2 -#define BSIM3v32_AS 3 -#define BSIM3v32_AD 4 -#define BSIM3v32_PS 5 -#define BSIM3v32_PD 6 -#define BSIM3v32_NRS 7 -#define BSIM3v32_NRD 8 -#define BSIM3v32_OFF 9 -#define BSIM3v32_IC_VBS 10 -#define BSIM3v32_IC_VDS 11 -#define BSIM3v32_IC_VGS 12 -#define BSIM3v32_IC 13 -#define BSIM3v32_NQSMOD 14 -#define BSIM3v32_M 15 -#define BSIM3v32_DELVTO 16 -#define BSIM3v32_MULU0 17 -#define BSIM3v32_GEO 18 - -/* model parameters */ -#define BSIM3v32_MOD_CAPMOD 100 -#define BSIM3v32_MOD_ACMMOD 101 -#define BSIM3v32_MOD_CALCACM 102 -#define BSIM3v32_MOD_MOBMOD 103 -#define BSIM3v32_MOD_NOIMOD 104 -#define BSIM3v32_MOD_NQSMOD 105 - -#define BSIM3v32_MOD_TOX 106 - -#define BSIM3v32_MOD_CDSC 107 -#define BSIM3v32_MOD_CDSCB 108 -#define BSIM3v32_MOD_CIT 109 -#define BSIM3v32_MOD_NFACTOR 110 -#define BSIM3v32_MOD_XJ 111 -#define BSIM3v32_MOD_VSAT 112 -#define BSIM3v32_MOD_AT 113 -#define BSIM3v32_MOD_A0 114 -#define BSIM3v32_MOD_A1 115 -#define BSIM3v32_MOD_A2 116 -#define BSIM3v32_MOD_KETA 117 -#define BSIM3v32_MOD_NSUB 118 -#define BSIM3v32_MOD_NPEAK 119 -#define BSIM3v32_MOD_NGATE 120 -#define BSIM3v32_MOD_GAMMA1 121 -#define BSIM3v32_MOD_GAMMA2 122 -#define BSIM3v32_MOD_VBX 123 -#define BSIM3v32_MOD_BINUNIT 124 - -#define BSIM3v32_MOD_VBM 125 - -#define BSIM3v32_MOD_XT 128 -#define BSIM3v32_MOD_K1 129 -#define BSIM3v32_MOD_KT1 130 -#define BSIM3v32_MOD_KT1L 131 -#define BSIM3v32_MOD_K2 132 -#define BSIM3v32_MOD_KT2 133 -#define BSIM3v32_MOD_K3 134 -#define BSIM3v32_MOD_K3B 135 -#define BSIM3v32_MOD_W0 136 -#define BSIM3v32_MOD_NLX 137 - -#define BSIM3v32_MOD_DVT0 138 -#define BSIM3v32_MOD_DVT1 139 -#define BSIM3v32_MOD_DVT2 140 - -#define BSIM3v32_MOD_DVT0W 141 -#define BSIM3v32_MOD_DVT1W 142 -#define BSIM3v32_MOD_DVT2W 143 - -#define BSIM3v32_MOD_DROUT 144 -#define BSIM3v32_MOD_DSUB 145 -#define BSIM3v32_MOD_VTH0 146 -#define BSIM3v32_MOD_UA 147 -#define BSIM3v32_MOD_UA1 148 -#define BSIM3v32_MOD_UB 149 -#define BSIM3v32_MOD_UB1 150 -#define BSIM3v32_MOD_UC 151 -#define BSIM3v32_MOD_UC1 152 -#define BSIM3v32_MOD_U0 153 -#define BSIM3v32_MOD_UTE 154 -#define BSIM3v32_MOD_VOFF 155 -#define BSIM3v32_MOD_DELTA 156 -#define BSIM3v32_MOD_RDSW 157 -#define BSIM3v32_MOD_PRT 158 -#define BSIM3v32_MOD_LDD 159 -#define BSIM3v32_MOD_ETA 160 -#define BSIM3v32_MOD_ETA0 161 -#define BSIM3v32_MOD_ETAB 162 -#define BSIM3v32_MOD_PCLM 163 -#define BSIM3v32_MOD_PDIBL1 164 -#define BSIM3v32_MOD_PDIBL2 165 -#define BSIM3v32_MOD_PSCBE1 166 -#define BSIM3v32_MOD_PSCBE2 167 -#define BSIM3v32_MOD_PVAG 168 -#define BSIM3v32_MOD_WR 169 -#define BSIM3v32_MOD_DWG 170 -#define BSIM3v32_MOD_DWB 171 -#define BSIM3v32_MOD_B0 172 -#define BSIM3v32_MOD_B1 173 -#define BSIM3v32_MOD_ALPHA0 174 -#define BSIM3v32_MOD_BETA0 175 -#define BSIM3v32_MOD_PDIBLB 178 - -#define BSIM3v32_MOD_PRWG 179 -#define BSIM3v32_MOD_PRWB 180 - -#define BSIM3v32_MOD_CDSCD 181 -#define BSIM3v32_MOD_AGS 182 - -#define BSIM3v32_MOD_FRINGE 184 -#define BSIM3v32_MOD_ELM 185 -#define BSIM3v32_MOD_CGSL 186 -#define BSIM3v32_MOD_CGDL 187 -#define BSIM3v32_MOD_CKAPPA 188 -#define BSIM3v32_MOD_CF 189 -#define BSIM3v32_MOD_CLC 190 -#define BSIM3v32_MOD_CLE 191 -#define BSIM3v32_MOD_PARAMCHK 192 -#define BSIM3v32_MOD_VERSION 193 -#define BSIM3v32_MOD_VFBCV 194 -#define BSIM3v32_MOD_ACDE 195 -#define BSIM3v32_MOD_MOIN 196 -#define BSIM3v32_MOD_NOFF 197 -#define BSIM3v32_MOD_IJTH 198 -#define BSIM3v32_MOD_ALPHA1 199 -#define BSIM3v32_MOD_VFB 200 -#define BSIM3v32_MOD_TOXM 201 -#define BSIM3v32_MOD_TCJ 202 -#define BSIM3v32_MOD_TCJSW 203 -#define BSIM3v32_MOD_TCJSWG 204 -#define BSIM3v32_MOD_TPB 205 -#define BSIM3v32_MOD_TPBSW 206 -#define BSIM3v32_MOD_TPBSWG 207 -#define BSIM3v32_MOD_VOFFCV 208 - -/* Length dependence */ -#define BSIM3v32_MOD_LCDSC 251 -#define BSIM3v32_MOD_LCDSCB 252 -#define BSIM3v32_MOD_LCIT 253 -#define BSIM3v32_MOD_LNFACTOR 254 -#define BSIM3v32_MOD_LXJ 255 -#define BSIM3v32_MOD_LVSAT 256 -#define BSIM3v32_MOD_LAT 257 -#define BSIM3v32_MOD_LA0 258 -#define BSIM3v32_MOD_LA1 259 -#define BSIM3v32_MOD_LA2 260 -#define BSIM3v32_MOD_LKETA 261 -#define BSIM3v32_MOD_LNSUB 262 -#define BSIM3v32_MOD_LNPEAK 263 -#define BSIM3v32_MOD_LNGATE 265 -#define BSIM3v32_MOD_LGAMMA1 266 -#define BSIM3v32_MOD_LGAMMA2 267 -#define BSIM3v32_MOD_LVBX 268 - -#define BSIM3v32_MOD_LVBM 270 - -#define BSIM3v32_MOD_LXT 272 -#define BSIM3v32_MOD_LK1 275 -#define BSIM3v32_MOD_LKT1 276 -#define BSIM3v32_MOD_LKT1L 277 -#define BSIM3v32_MOD_LK2 278 -#define BSIM3v32_MOD_LKT2 279 -#define BSIM3v32_MOD_LK3 280 -#define BSIM3v32_MOD_LK3B 281 -#define BSIM3v32_MOD_LW0 282 -#define BSIM3v32_MOD_LNLX 283 - -#define BSIM3v32_MOD_LDVT0 284 -#define BSIM3v32_MOD_LDVT1 285 -#define BSIM3v32_MOD_LDVT2 286 - -#define BSIM3v32_MOD_LDVT0W 287 -#define BSIM3v32_MOD_LDVT1W 288 -#define BSIM3v32_MOD_LDVT2W 289 - -#define BSIM3v32_MOD_LDROUT 290 -#define BSIM3v32_MOD_LDSUB 291 -#define BSIM3v32_MOD_LVTH0 292 -#define BSIM3v32_MOD_LUA 293 -#define BSIM3v32_MOD_LUA1 294 -#define BSIM3v32_MOD_LUB 295 -#define BSIM3v32_MOD_LUB1 296 -#define BSIM3v32_MOD_LUC 297 -#define BSIM3v32_MOD_LUC1 298 -#define BSIM3v32_MOD_LU0 299 -#define BSIM3v32_MOD_LUTE 300 -#define BSIM3v32_MOD_LVOFF 301 -#define BSIM3v32_MOD_LDELTA 302 -#define BSIM3v32_MOD_LRDSW 303 -#define BSIM3v32_MOD_LPRT 304 -#define BSIM3v32_MOD_LLDD 305 -#define BSIM3v32_MOD_LETA 306 -#define BSIM3v32_MOD_LETA0 307 -#define BSIM3v32_MOD_LETAB 308 -#define BSIM3v32_MOD_LPCLM 309 -#define BSIM3v32_MOD_LPDIBL1 310 -#define BSIM3v32_MOD_LPDIBL2 311 -#define BSIM3v32_MOD_LPSCBE1 312 -#define BSIM3v32_MOD_LPSCBE2 313 -#define BSIM3v32_MOD_LPVAG 314 -#define BSIM3v32_MOD_LWR 315 -#define BSIM3v32_MOD_LDWG 316 -#define BSIM3v32_MOD_LDWB 317 -#define BSIM3v32_MOD_LB0 318 -#define BSIM3v32_MOD_LB1 319 -#define BSIM3v32_MOD_LALPHA0 320 -#define BSIM3v32_MOD_LBETA0 321 -#define BSIM3v32_MOD_LPDIBLB 324 - -#define BSIM3v32_MOD_LPRWG 325 -#define BSIM3v32_MOD_LPRWB 326 - -#define BSIM3v32_MOD_LCDSCD 327 -#define BSIM3v32_MOD_LAGS 328 - - -#define BSIM3v32_MOD_LFRINGE 331 -#define BSIM3v32_MOD_LELM 332 -#define BSIM3v32_MOD_LCGSL 333 -#define BSIM3v32_MOD_LCGDL 334 -#define BSIM3v32_MOD_LCKAPPA 335 -#define BSIM3v32_MOD_LCF 336 -#define BSIM3v32_MOD_LCLC 337 -#define BSIM3v32_MOD_LCLE 338 -#define BSIM3v32_MOD_LVFBCV 339 -#define BSIM3v32_MOD_LACDE 340 -#define BSIM3v32_MOD_LMOIN 341 -#define BSIM3v32_MOD_LNOFF 342 -#define BSIM3v32_MOD_LALPHA1 344 -#define BSIM3v32_MOD_LVFB 345 -#define BSIM3v32_MOD_LVOFFCV 346 - -/* Width dependence */ -#define BSIM3v32_MOD_WCDSC 381 -#define BSIM3v32_MOD_WCDSCB 382 -#define BSIM3v32_MOD_WCIT 383 -#define BSIM3v32_MOD_WNFACTOR 384 -#define BSIM3v32_MOD_WXJ 385 -#define BSIM3v32_MOD_WVSAT 386 -#define BSIM3v32_MOD_WAT 387 -#define BSIM3v32_MOD_WA0 388 -#define BSIM3v32_MOD_WA1 389 -#define BSIM3v32_MOD_WA2 390 -#define BSIM3v32_MOD_WKETA 391 -#define BSIM3v32_MOD_WNSUB 392 -#define BSIM3v32_MOD_WNPEAK 393 -#define BSIM3v32_MOD_WNGATE 395 -#define BSIM3v32_MOD_WGAMMA1 396 -#define BSIM3v32_MOD_WGAMMA2 397 -#define BSIM3v32_MOD_WVBX 398 - -#define BSIM3v32_MOD_WVBM 400 - -#define BSIM3v32_MOD_WXT 402 -#define BSIM3v32_MOD_WK1 405 -#define BSIM3v32_MOD_WKT1 406 -#define BSIM3v32_MOD_WKT1L 407 -#define BSIM3v32_MOD_WK2 408 -#define BSIM3v32_MOD_WKT2 409 -#define BSIM3v32_MOD_WK3 410 -#define BSIM3v32_MOD_WK3B 411 -#define BSIM3v32_MOD_WW0 412 -#define BSIM3v32_MOD_WNLX 413 - -#define BSIM3v32_MOD_WDVT0 414 -#define BSIM3v32_MOD_WDVT1 415 -#define BSIM3v32_MOD_WDVT2 416 - -#define BSIM3v32_MOD_WDVT0W 417 -#define BSIM3v32_MOD_WDVT1W 418 -#define BSIM3v32_MOD_WDVT2W 419 - -#define BSIM3v32_MOD_WDROUT 420 -#define BSIM3v32_MOD_WDSUB 421 -#define BSIM3v32_MOD_WVTH0 422 -#define BSIM3v32_MOD_WUA 423 -#define BSIM3v32_MOD_WUA1 424 -#define BSIM3v32_MOD_WUB 425 -#define BSIM3v32_MOD_WUB1 426 -#define BSIM3v32_MOD_WUC 427 -#define BSIM3v32_MOD_WUC1 428 -#define BSIM3v32_MOD_WU0 429 -#define BSIM3v32_MOD_WUTE 430 -#define BSIM3v32_MOD_WVOFF 431 -#define BSIM3v32_MOD_WDELTA 432 -#define BSIM3v32_MOD_WRDSW 433 -#define BSIM3v32_MOD_WPRT 434 -#define BSIM3v32_MOD_WLDD 435 -#define BSIM3v32_MOD_WETA 436 -#define BSIM3v32_MOD_WETA0 437 -#define BSIM3v32_MOD_WETAB 438 -#define BSIM3v32_MOD_WPCLM 439 -#define BSIM3v32_MOD_WPDIBL1 440 -#define BSIM3v32_MOD_WPDIBL2 441 -#define BSIM3v32_MOD_WPSCBE1 442 -#define BSIM3v32_MOD_WPSCBE2 443 -#define BSIM3v32_MOD_WPVAG 444 -#define BSIM3v32_MOD_WWR 445 -#define BSIM3v32_MOD_WDWG 446 -#define BSIM3v32_MOD_WDWB 447 -#define BSIM3v32_MOD_WB0 448 -#define BSIM3v32_MOD_WB1 449 -#define BSIM3v32_MOD_WALPHA0 450 -#define BSIM3v32_MOD_WBETA0 451 -#define BSIM3v32_MOD_WPDIBLB 454 - -#define BSIM3v32_MOD_WPRWG 455 -#define BSIM3v32_MOD_WPRWB 456 - -#define BSIM3v32_MOD_WCDSCD 457 -#define BSIM3v32_MOD_WAGS 458 - - -#define BSIM3v32_MOD_WFRINGE 461 -#define BSIM3v32_MOD_WELM 462 -#define BSIM3v32_MOD_WCGSL 463 -#define BSIM3v32_MOD_WCGDL 464 -#define BSIM3v32_MOD_WCKAPPA 465 -#define BSIM3v32_MOD_WCF 466 -#define BSIM3v32_MOD_WCLC 467 -#define BSIM3v32_MOD_WCLE 468 -#define BSIM3v32_MOD_WVFBCV 469 -#define BSIM3v32_MOD_WACDE 470 -#define BSIM3v32_MOD_WMOIN 471 -#define BSIM3v32_MOD_WNOFF 472 -#define BSIM3v32_MOD_WALPHA1 474 -#define BSIM3v32_MOD_WVFB 475 -#define BSIM3v32_MOD_WVOFFCV 476 - -/* Cross-term dependence */ -#define BSIM3v32_MOD_PCDSC 511 -#define BSIM3v32_MOD_PCDSCB 512 -#define BSIM3v32_MOD_PCIT 513 -#define BSIM3v32_MOD_PNFACTOR 514 -#define BSIM3v32_MOD_PXJ 515 -#define BSIM3v32_MOD_PVSAT 516 -#define BSIM3v32_MOD_PAT 517 -#define BSIM3v32_MOD_PA0 518 -#define BSIM3v32_MOD_PA1 519 -#define BSIM3v32_MOD_PA2 520 -#define BSIM3v32_MOD_PKETA 521 -#define BSIM3v32_MOD_PNSUB 522 -#define BSIM3v32_MOD_PNPEAK 523 -#define BSIM3v32_MOD_PNGATE 525 -#define BSIM3v32_MOD_PGAMMA1 526 -#define BSIM3v32_MOD_PGAMMA2 527 -#define BSIM3v32_MOD_PVBX 528 - -#define BSIM3v32_MOD_PVBM 530 - -#define BSIM3v32_MOD_PXT 532 -#define BSIM3v32_MOD_PK1 535 -#define BSIM3v32_MOD_PKT1 536 -#define BSIM3v32_MOD_PKT1L 537 -#define BSIM3v32_MOD_PK2 538 -#define BSIM3v32_MOD_PKT2 539 -#define BSIM3v32_MOD_PK3 540 -#define BSIM3v32_MOD_PK3B 541 -#define BSIM3v32_MOD_PW0 542 -#define BSIM3v32_MOD_PNLX 543 - -#define BSIM3v32_MOD_PDVT0 544 -#define BSIM3v32_MOD_PDVT1 545 -#define BSIM3v32_MOD_PDVT2 546 - -#define BSIM3v32_MOD_PDVT0W 547 -#define BSIM3v32_MOD_PDVT1W 548 -#define BSIM3v32_MOD_PDVT2W 549 - -#define BSIM3v32_MOD_PDROUT 550 -#define BSIM3v32_MOD_PDSUB 551 -#define BSIM3v32_MOD_PVTH0 552 -#define BSIM3v32_MOD_PUA 553 -#define BSIM3v32_MOD_PUA1 554 -#define BSIM3v32_MOD_PUB 555 -#define BSIM3v32_MOD_PUB1 556 -#define BSIM3v32_MOD_PUC 557 -#define BSIM3v32_MOD_PUC1 558 -#define BSIM3v32_MOD_PU0 559 -#define BSIM3v32_MOD_PUTE 560 -#define BSIM3v32_MOD_PVOFF 561 -#define BSIM3v32_MOD_PDELTA 562 -#define BSIM3v32_MOD_PRDSW 563 -#define BSIM3v32_MOD_PPRT 564 -#define BSIM3v32_MOD_PLDD 565 -#define BSIM3v32_MOD_PETA 566 -#define BSIM3v32_MOD_PETA0 567 -#define BSIM3v32_MOD_PETAB 568 -#define BSIM3v32_MOD_PPCLM 569 -#define BSIM3v32_MOD_PPDIBL1 570 -#define BSIM3v32_MOD_PPDIBL2 571 -#define BSIM3v32_MOD_PPSCBE1 572 -#define BSIM3v32_MOD_PPSCBE2 573 -#define BSIM3v32_MOD_PPVAG 574 -#define BSIM3v32_MOD_PWR 575 -#define BSIM3v32_MOD_PDWG 576 -#define BSIM3v32_MOD_PDWB 577 -#define BSIM3v32_MOD_PB0 578 -#define BSIM3v32_MOD_PB1 579 -#define BSIM3v32_MOD_PALPHA0 580 -#define BSIM3v32_MOD_PBETA0 581 -#define BSIM3v32_MOD_PPDIBLB 584 - -#define BSIM3v32_MOD_PPRWG 585 -#define BSIM3v32_MOD_PPRWB 586 - -#define BSIM3v32_MOD_PCDSCD 587 -#define BSIM3v32_MOD_PAGS 588 - -#define BSIM3v32_MOD_PFRINGE 591 -#define BSIM3v32_MOD_PELM 592 -#define BSIM3v32_MOD_PCGSL 593 -#define BSIM3v32_MOD_PCGDL 594 -#define BSIM3v32_MOD_PCKAPPA 595 -#define BSIM3v32_MOD_PCF 596 -#define BSIM3v32_MOD_PCLC 597 -#define BSIM3v32_MOD_PCLE 598 -#define BSIM3v32_MOD_PVFBCV 599 -#define BSIM3v32_MOD_PACDE 600 -#define BSIM3v32_MOD_PMOIN 601 -#define BSIM3v32_MOD_PNOFF 602 -#define BSIM3v32_MOD_PALPHA1 604 -#define BSIM3v32_MOD_PVFB 605 -#define BSIM3v32_MOD_PVOFFCV 606 - -#define BSIM3v32_MOD_TNOM 651 -#define BSIM3v32_MOD_CGSO 652 -#define BSIM3v32_MOD_CGDO 653 -#define BSIM3v32_MOD_CGBO 654 -#define BSIM3v32_MOD_XPART 655 - -#define BSIM3v32_MOD_RSH 656 -#define BSIM3v32_MOD_JS 657 -#define BSIM3v32_MOD_PB 658 -#define BSIM3v32_MOD_MJ 659 -#define BSIM3v32_MOD_PBSW 660 -#define BSIM3v32_MOD_MJSW 661 -#define BSIM3v32_MOD_CJ 662 -#define BSIM3v32_MOD_CJSW 663 -#define BSIM3v32_MOD_NMOS 664 -#define BSIM3v32_MOD_PMOS 665 - -#define BSIM3v32_MOD_NOIA 666 -#define BSIM3v32_MOD_NOIB 667 -#define BSIM3v32_MOD_NOIC 668 - -#define BSIM3v32_MOD_LINT 669 -#define BSIM3v32_MOD_LL 670 -#define BSIM3v32_MOD_LLN 671 -#define BSIM3v32_MOD_LW 672 -#define BSIM3v32_MOD_LWN 673 -#define BSIM3v32_MOD_LWL 674 -#define BSIM3v32_MOD_LMIN 675 -#define BSIM3v32_MOD_LMAX 676 - -#define BSIM3v32_MOD_WINT 677 -#define BSIM3v32_MOD_WL 678 -#define BSIM3v32_MOD_WLN 679 -#define BSIM3v32_MOD_WW 680 -#define BSIM3v32_MOD_WWN 681 -#define BSIM3v32_MOD_WWL 682 -#define BSIM3v32_MOD_WMIN 683 -#define BSIM3v32_MOD_WMAX 684 - -#define BSIM3v32_MOD_DWC 685 -#define BSIM3v32_MOD_DLC 686 - -#define BSIM3v32_MOD_EM 687 -#define BSIM3v32_MOD_EF 688 -#define BSIM3v32_MOD_AF 689 -#define BSIM3v32_MOD_KF 690 - -#define BSIM3v32_MOD_NJ 691 -#define BSIM3v32_MOD_XTI 692 - -#define BSIM3v32_MOD_PBSWG 693 -#define BSIM3v32_MOD_MJSWG 694 -#define BSIM3v32_MOD_CJSWG 695 -#define BSIM3v32_MOD_JSW 696 - -#define BSIM3v32_MOD_LLC 697 -#define BSIM3v32_MOD_LWC 698 -#define BSIM3v32_MOD_LWLC 699 - -#define BSIM3v32_MOD_WLC 700 -#define BSIM3v32_MOD_WWC 701 -#define BSIM3v32_MOD_WWLC 702 - -/* ACM parameters */ -#define BSIM3v32_MOD_XL 703 -#define BSIM3v32_MOD_XW 704 -#define BSIM3v32_MOD_HDIF 711 -#define BSIM3v32_MOD_LDIF 712 -#define BSIM3v32_MOD_LD 713 -#define BSIM3v32_MOD_RD 714 -#define BSIM3v32_MOD_RS 715 -#define BSIM3v32_MOD_RDC 716 -#define BSIM3v32_MOD_RSC 717 -#define BSIM3v32_MOD_WMLT 718 - -#define BSIM3v32_MOD_LMLT 719 - -/* device questions */ -#define BSIM3v32_DNODE 751 -#define BSIM3v32_GNODE 752 -#define BSIM3v32_SNODE 753 -#define BSIM3v32_BNODE 754 -#define BSIM3v32_DNODEPRIME 755 -#define BSIM3v32_SNODEPRIME 756 -#define BSIM3v32_VBD 757 -#define BSIM3v32_VBS 758 -#define BSIM3v32_VGS 759 -#define BSIM3v32_VDS 760 -#define BSIM3v32_CD 761 -#define BSIM3v32_CBS 762 -#define BSIM3v32_CBD 763 -#define BSIM3v32_GM 764 -#define BSIM3v32_GDS 765 -#define BSIM3v32_GMBS 766 -#define BSIM3v32_GBD 767 -#define BSIM3v32_GBS 768 -#define BSIM3v32_QB 769 -#define BSIM3v32_CQB 770 -#define BSIM3v32_QG 771 -#define BSIM3v32_CQG 772 -#define BSIM3v32_QD 773 -#define BSIM3v32_CQD 774 -#define BSIM3v32_CGG 775 -#define BSIM3v32_CGD 776 -#define BSIM3v32_CGS 777 -#define BSIM3v32_CBG 778 -#define BSIM3v32_CAPBD 779 -#define BSIM3v32_CQBD 780 -#define BSIM3v32_CAPBS 781 -#define BSIM3v32_CQBS 782 -#define BSIM3v32_CDG 783 -#define BSIM3v32_CDD 784 -#define BSIM3v32_CDS 785 -#define BSIM3v32_VON 786 -#define BSIM3v32_VDSAT 787 -#define BSIM3v32_QBS 788 -#define BSIM3v32_QBD 789 -#define BSIM3v32_SOURCECONDUCT 790 -#define BSIM3v32_DRAINCONDUCT 791 -#define BSIM3v32_CBDB 792 -#define BSIM3v32_CBSB 793 - -#define BSIM3v32_MOD_VGS_MAX 801 -#define BSIM3v32_MOD_VGD_MAX 802 -#define BSIM3v32_MOD_VGB_MAX 803 -#define BSIM3v32_MOD_VDS_MAX 804 -#define BSIM3v32_MOD_VBS_MAX 805 -#define BSIM3v32_MOD_VBD_MAX 806 -#define BSIM3v32_MOD_VGSR_MAX 807 -#define BSIM3v32_MOD_VGDR_MAX 808 -#define BSIM3v32_MOD_VGBR_MAX 809 -#define BSIM3v32_MOD_VBSR_MAX 810 -#define BSIM3v32_MOD_VBDR_MAX 811 - -#include "bsim3v32ext.h" - -extern void BSIM3v32evaluate(double,double,double,BSIM3v32instance*,BSIM3v32model*, - double*,double*,double*, double*, double*, double*, double*, - double*, double*, double*, double*, double*, double*, double*, - double*, double*, double*, double*, CKTcircuit*); -extern int BSIM3v32debug(BSIM3v32model*, BSIM3v32instance*, CKTcircuit*, int); -extern int BSIM3v32checkModel(BSIM3v32model*, BSIM3v32instance*, CKTcircuit*); - -#endif /*BSIM3v32*/ diff --git a/src/spicelib/devices/bsim3v32/bsim3v32ext.h b/src/spicelib/devices/bsim3v32/bsim3v32ext.h deleted file mode 100644 index 1612149da..000000000 --- a/src/spicelib/devices/bsim3v32/bsim3v32ext.h +++ /dev/null @@ -1,30 +0,0 @@ -/********** -Copyright 1999 Regents of the University of California. All rights reserved. -Author: 1991 JianHui Huang and Min-Chie Jeng. -Modified by Yuhua Cheng to use BSIM3v3 in Spice3f5 (Jan. 1997) -Modified by Paolo Nenzi 2002 -File: bsim3ext.h -**********/ - -extern int BSIM3v32acLoad(GENmodel *,CKTcircuit*); -extern int BSIM3v32ask(CKTcircuit *,GENinstance*,int,IFvalue*,IFvalue*); -extern int BSIM3v32convTest(GENmodel *,CKTcircuit*); -extern int BSIM3v32getic(GENmodel*,CKTcircuit*); -extern int BSIM3v32load(GENmodel*,CKTcircuit*); -extern int BSIM3v32mAsk(CKTcircuit*,GENmodel *,int, IFvalue*); -extern int BSIM3v32mDelete(GENmodel*); -extern int BSIM3v32mParam(int,IFvalue*,GENmodel*); -extern void BSIM3v32mosCap(CKTcircuit*, double, double, double, double, - double, double, double, double, double, double, double, - double, double, double, double, double, double, double*, - double*, double*, double*, double*, double*, double*, double*, - double*, double*, double*, double*, double*, double*, double*, - double*); -extern int BSIM3v32param(int,IFvalue*,GENinstance*,IFvalue*); -extern int BSIM3v32pzLoad(GENmodel*,CKTcircuit*,SPcomplex*); -extern int BSIM3v32setup(SMPmatrix*,GENmodel*,CKTcircuit*,int*); -extern int BSIM3v32temp(GENmodel*,CKTcircuit*); -extern int BSIM3v32trunc(GENmodel*,CKTcircuit*,double*); -extern int BSIM3v32noise(int,int,GENmodel*,CKTcircuit*,Ndata*,double*); -extern int BSIM3v32unsetup(GENmodel*,CKTcircuit*); -extern int BSIM3v32soaCheck(CKTcircuit *, GENmodel *); diff --git a/src/spicelib/devices/bsim3v32/bsim3v32init.c b/src/spicelib/devices/bsim3v32/bsim3v32init.c deleted file mode 100644 index aaeb71c9b..000000000 --- a/src/spicelib/devices/bsim3v32/bsim3v32init.c +++ /dev/null @@ -1,76 +0,0 @@ -#include "ngspice/config.h" - -#include "ngspice/devdefs.h" - -#include "bsim3v32itf.h" -#include "bsim3v32ext.h" -#include "bsim3v32init.h" - - -SPICEdev BSIM3v32info = { - .DEVpublic = { - .name = "BSIM3v32", - .description = "Berkeley Short Channel IGFET Model Version-3", - .terms = &BSIM3v32nSize, - .numNames = &BSIM3v32nSize, - .termNames = BSIM3v32names, - .numInstanceParms = &BSIM3v32pTSize, - .instanceParms = BSIM3v32pTable, - .numModelParms = &BSIM3v32mPTSize, - .modelParms = BSIM3v32mPTable, - .flags = DEV_DEFAULT, - -#ifdef XSPICE - .cm_func = NULL, - .num_conn = 0, - .conn = NULL, - .num_param = 0, - .param = NULL, - .num_inst_var = 0, - .inst_var = NULL, -#endif - }, - - .DEVparam = BSIM3v32param, - .DEVmodParam = BSIM3v32mParam, - .DEVload = BSIM3v32load, - .DEVsetup = BSIM3v32setup, - .DEVunsetup = BSIM3v32unsetup, - .DEVpzSetup = BSIM3v32setup, - .DEVtemperature = BSIM3v32temp, - .DEVtrunc = BSIM3v32trunc, - .DEVfindBranch = NULL, - .DEVacLoad = BSIM3v32acLoad, - .DEVaccept = NULL, - .DEVdestroy = NULL, - .DEVmodDelete = BSIM3v32mDelete, - .DEVdelete = NULL, - .DEVsetic = BSIM3v32getic, - .DEVask = BSIM3v32ask, - .DEVmodAsk = BSIM3v32mAsk, - .DEVpzLoad = BSIM3v32pzLoad, - .DEVconvTest = BSIM3v32convTest, - .DEVsenSetup = NULL, - .DEVsenLoad = NULL, - .DEVsenUpdate = NULL, - .DEVsenAcLoad = NULL, - .DEVsenPrint = NULL, - .DEVsenTrunc = NULL, - .DEVdisto = NULL, - .DEVnoise = BSIM3v32noise, - .DEVsoaCheck = BSIM3v32soaCheck, - .DEVinstSize = &BSIM3v32iSize, - .DEVmodSize = &BSIM3v32mSize, - -#ifdef CIDER - .DEVdump = NULL, - .DEVacct = NULL, -#endif -}; - - -SPICEdev * -get_bsim3v32_info(void) -{ - return &BSIM3v32info; -} diff --git a/src/spicelib/devices/bsim3v32/bsim3v32init.h b/src/spicelib/devices/bsim3v32/bsim3v32init.h deleted file mode 100644 index 3a4e74c68..000000000 --- a/src/spicelib/devices/bsim3v32/bsim3v32init.h +++ /dev/null @@ -1,13 +0,0 @@ -#ifndef _BSIM3v32INIT_H -#define _BSIM3v32INIT_H - -extern IFparm BSIM3v32pTable[ ]; -extern IFparm BSIM3v32mPTable[ ]; -extern char *BSIM3v32names[ ]; -extern int BSIM3v32pTSize; -extern int BSIM3v32mPTSize; -extern int BSIM3v32nSize; -extern int BSIM3v32iSize; -extern int BSIM3v32mSize; - -#endif diff --git a/src/spicelib/devices/bsim3v32/bsim3v32itf.h b/src/spicelib/devices/bsim3v32/bsim3v32itf.h deleted file mode 100644 index c63bc3690..000000000 --- a/src/spicelib/devices/bsim3v32/bsim3v32itf.h +++ /dev/null @@ -1,13 +0,0 @@ -/********** -Copyright 1999 Regents of the University of California. All rights reserved. -Author: 1991 JianHui Huang and Min-Chie Jeng. -Modified by Paolo Nenzi 2002 -File: bsim3itf.h -**********/ - -#ifndef DEV_BSIM3v32 -#define DEV_BSIM3v32 - -SPICEdev *get_bsim3v32_info(void); - -#endif diff --git a/src/spicelib/devices/bsim4/B4TERMS_OF_USE b/src/spicelib/devices/bsim4/B4TERMS_OF_USE deleted file mode 100644 index 5cc4023bb..000000000 --- a/src/spicelib/devices/bsim4/B4TERMS_OF_USE +++ /dev/null @@ -1,33 +0,0 @@ - -The terms under which the software is provided are as the following. - -Software is distributed as is, completely without warranty or service -support. The University of California and its employees are not liable -for the condition or performance of the software. - -The University owns the copyright but shall not be liable for any -infringement of copyright or other proprietary rights brought by third -parties against the users of the software. - -The University of California hereby disclaims all implied warranties. - -The University of California grants the users the right to modify, copy, -and redistribute the software and documentation, both within the user's -organization and externally, subject to the following restrictions: - -1. The users agree not to charge for the University of California code - itself but may charge for additions, extensions, or support. - -2. In any product based on the software, the users agree to acknowledge - the UC Berkeley BSIM Research Group that developed the software. This - acknowledgment shall appear in the product documentation. - -3. The users agree to obey all U.S. Government restrictions governing - redistribution or export of the software. - -4. The users agree to reproduce any copyright notice which appears on - the software on any copy or modification of such made available - to others. - -Chenming Hu, and Weidong Liu -Mar. 2000 diff --git a/src/spicelib/devices/bsim4/ChangeLog b/src/spicelib/devices/bsim4/ChangeLog deleted file mode 100644 index 5f1ef1717..000000000 --- a/src/spicelib/devices/bsim4/ChangeLog +++ /dev/null @@ -1,15 +0,0 @@ -2001-11-26 Paolo Nenzi - - * *.c *.h: Code cleanups and made Manu import conformant to ngspice - interface. Readded code for multiprocessors. - -2001-11-25 Emmanuel Rouat - - * *.c *.h: Updated to version BSIM4.2.1 - -2000-04-04 Paolo Nenzi - - * *.c, *.h: Initial bsim4 support. Modified all files to conform - to ngspice headers and added paraller architecture - support (please do not use this, it is not supported, - it is included for developers only). diff --git a/src/spicelib/devices/bsim4/Makefile.am b/src/spicelib/devices/bsim4/Makefile.am deleted file mode 100644 index dd8c16572..000000000 --- a/src/spicelib/devices/bsim4/Makefile.am +++ /dev/null @@ -1,37 +0,0 @@ -## Process this file with automake to produce Makefile.in - -noinst_LTLIBRARIES = libbsim4.la - -libbsim4_la_SOURCES = \ - b4.c \ - b4acld.c \ - b4ask.c \ - b4check.c \ - b4cvtest.c \ - b4geo.c \ - b4getic.c \ - b4ld.c \ - b4mask.c \ - b4mdel.c \ - b4mpar.c \ - b4noi.c \ - b4par.c \ - b4pzld.c \ - b4set.c \ - b4soachk.c \ - b4temp.c \ - b4trunc.c \ - bsim4def.h \ - bsim4ext.h \ - bsim4init.c \ - bsim4init.h \ - bsim4itf.h - - - -AM_CPPFLAGS = @AM_CPPFLAGS@ -I$(top_srcdir)/src/include -AM_CFLAGS = $(STATIC) - -MAINTAINERCLEANFILES = Makefile.in - -EXTRA_DIST = B4TERMS_OF_USE diff --git a/src/spicelib/devices/bsim4/b4.c b/src/spicelib/devices/bsim4/b4.c deleted file mode 100644 index 9a12c7413..000000000 --- a/src/spicelib/devices/bsim4/b4.c +++ /dev/null @@ -1,1101 +0,0 @@ -/* ****************************************************************************** - * BSIM4 4.8.1 released by Chetan Kumar Dabhi 2/15/2017 * - * BSIM4 Model Equations * - ****************************************************************************** - - ****************************************************************************** - * Copyright 2017 Regents of the University of California. * - * All rights reserved. * - * * - * Project Director: Prof. Chenming Hu. * - * Authors: Gary W. Ng, Weidong Liu, Xuemei Xi, Mohan Dunga, Wenwei Yang * - * Ali Niknejad, Shivendra Singh Parihar, Chetan Kumar Dabhi * - * Yogesh Singh Chauhan, Sayeef Salahuddin, Chenming Hu * - ****************************************************************************** - - ****************************************************************************** - * CMC In-Code Statement * - * * - * The Developer agrees that the following statement will appear in the * - * model code that has been adopted as a CMC Standard. * - * * - * Software is distributed as is, completely without warranty or service * - * support. The University of California and its employees are not liable * - * for the condition or performance of the software. * - * * - * The University of California owns the copyright and grants users a * - * perpetual, irrevocable, worldwide, non-exclusive, royalty-free license * - * with respect to the software as set forth below. * - * * - * The University of California hereby disclaims all implied warranties. * - * * - * The University of California grants the users the right to modify, * - * copy, and redistribute the software and documentation, both within * - * the user's organization and externally, subject to the following * - * restrictions: * - * * - * 1. The users agree not to charge for the University of California code * - * itself but may charge for additions, extensions, or support. * - * * - * 2. In any product based on the software, the users agree to * - * acknowledge the University of California that developed the * - * software. This acknowledgment shall appear in the product * - * documentation. * - * * - * 3. Redistributions to others of source code and documentation must * - * retain the copyright notice, disclaimer, and list of conditions. * - * * - * 4. Redistributions to others in binary form must reproduce the * - * copyright notice, disclaimer, and list of conditions in the * - * documentation and/or other materials provided with the * - * distribution. * - * * - * Agreed to on ______Feb. 15, 2017______________ * - * * - * By: ____University of California, Berkeley___ * - * ____Chenming Hu__________________________ * - * ____Professor in Graduate School ________ * - * * - ****************************************************************************** */ - -#include "ngspice/ngspice.h" -#include "ngspice/devdefs.h" -#include "bsim4def.h" -#include "ngspice/suffix.h" - -IFparm BSIM4pTable[] = { /* parameters */ -IOP( "l", BSIM4_L, IF_REAL , "Length"), -IOP( "w", BSIM4_W, IF_REAL , "Width"), -IOP( "m", BSIM4_M, IF_REAL , "Separate Parallel multiplier"), -IOP( "nf", BSIM4_NF, IF_REAL , "Number of fingers"), -IOP( "sa", BSIM4_SA, IF_REAL , "distance between OD edge to poly of one side "), -IOP( "sb", BSIM4_SB, IF_REAL , "distance between OD edge to poly of the other side"), -IOP( "sd", BSIM4_SD, IF_REAL , "distance between neighbour fingers"), -IOP( "sca", BSIM4_SCA, IF_REAL , "Integral of the first distribution function for scattered well dopant"), -IOP( "scb", BSIM4_SCB, IF_REAL , "Integral of the second distribution function for scattered well dopant"), -IOP( "scc", BSIM4_SCC, IF_REAL , "Integral of the third distribution function for scattered well dopant"), -IOP( "sc", BSIM4_SC, IF_REAL , "Distance to a single well edge "), -IOP( "min", BSIM4_MIN, IF_INTEGER , "Minimize either D or S"), -IOP( "ad", BSIM4_AD, IF_REAL , "Drain area"), -IOP( "as", BSIM4_AS, IF_REAL , "Source area"), -IOP( "pd", BSIM4_PD, IF_REAL , "Drain perimeter"), -IOP( "ps", BSIM4_PS, IF_REAL , "Source perimeter"), -IOP( "nrd", BSIM4_NRD, IF_REAL , "Number of squares in drain"), -IOP( "nrs", BSIM4_NRS, IF_REAL , "Number of squares in source"), -IOP( "off", BSIM4_OFF, IF_FLAG , "Device is initially off"), -IOP( "rbdb", BSIM4_RBDB, IF_REAL , "Body resistance"), -IOP( "rbsb", BSIM4_RBSB, IF_REAL , "Body resistance"), -IOP( "rbpb", BSIM4_RBPB, IF_REAL , "Body resistance"), -IOP( "rbps", BSIM4_RBPS, IF_REAL , "Body resistance"), -IOP( "rbpd", BSIM4_RBPD, IF_REAL , "Body resistance"), -IOP( "delvto", BSIM4_DELVTO, IF_REAL , "Zero bias threshold voltage variation"), -IOPR( "delvt0", BSIM4_DELVTO, IF_REAL , "Zero bias threshold voltage variation"), -IOP( "mulu0", BSIM4_MULU0, IF_REAL, "Low field mobility multiplier"), -IOP( "xgw", BSIM4_XGW, IF_REAL, "Distance from gate contact center to device edge"), -IOP( "ngcon", BSIM4_NGCON, IF_REAL, "Number of gate contacts"), -IOP( "wnflag", BSIM4_WNFLAG, IF_INTEGER, "W/NF device flag for bin selection"), - -IOP( "trnqsmod", BSIM4_TRNQSMOD, IF_INTEGER, "Transient NQS model selector"), -IOP( "acnqsmod", BSIM4_ACNQSMOD, IF_INTEGER, "AC NQS model selector"), -IOP( "rbodymod", BSIM4_RBODYMOD, IF_INTEGER, "Distributed body R model selector"), -IOP( "rgatemod", BSIM4_RGATEMOD, IF_INTEGER, "Gate resistance model selector"), -IOP( "geomod", BSIM4_GEOMOD, IF_INTEGER, "Geometry dependent parasitics model selector"), -IOP( "rgeomod", BSIM4_RGEOMOD, IF_INTEGER, "S/D resistance and contact model selector"), -IP( "ic", BSIM4_IC, IF_REALVEC , "Vector of DS,GS,BS initial voltages"), -OP( "gmbs", BSIM4_GMBS, IF_REAL, "Gmb"), -OP( "gm", BSIM4_GM, IF_REAL, "Gm"), -OP( "gds", BSIM4_GDS, IF_REAL, "Gds"), -OP( "vdsat", BSIM4_VDSAT, IF_REAL, "Vdsat"), -OP( "vth", BSIM4_VON, IF_REAL, "Vth"), -OP( "id", BSIM4_CD, IF_REAL, "Ids"), -OP( "ibd", BSIM4_CBD, IF_REAL, "Ibd"), -OP( "ibs", BSIM4_CBS, IF_REAL, "Ibs"), -OP( "gbd", BSIM4_GBD, IF_REAL, "gbd"), -OP( "gbs", BSIM4_GBS, IF_REAL, "gbs"), -OP( "isub", BSIM4_CSUB, IF_REAL, "Isub"), -OP( "igidl", BSIM4_IGIDL, IF_REAL, "Igidl"), -OP( "igisl", BSIM4_IGISL, IF_REAL, "Igisl"), -OP( "igs", BSIM4_IGS, IF_REAL, "Igs"), -OP( "igd", BSIM4_IGD, IF_REAL, "Igd"), -OP( "igb", BSIM4_IGB, IF_REAL, "Igb"), -OP( "igcs", BSIM4_IGCS, IF_REAL, "Igcs"), -OP( "igcd", BSIM4_IGCD, IF_REAL, "Igcd"), -OP( "vbs", BSIM4_VBS, IF_REAL, "Vbs"), -OP( "vgs", BSIM4_VGS, IF_REAL, "Vgs"), -OP( "vds", BSIM4_VDS, IF_REAL, "Vds"), -OP( "cgg", BSIM4_CGGB, IF_REAL, "Cggb"), -OP( "cgs", BSIM4_CGSB, IF_REAL, "Cgsb"), -OP( "cgd", BSIM4_CGDB, IF_REAL, "Cgdb"), -OP( "cbg", BSIM4_CBGB, IF_REAL, "Cbgb"), -OP( "cbd", BSIM4_CBDB, IF_REAL, "Cbdb"), -OP( "cbs", BSIM4_CBSB, IF_REAL, "Cbsb"), -OP( "cdg", BSIM4_CDGB, IF_REAL, "Cdgb"), -OP( "cdd", BSIM4_CDDB, IF_REAL, "Cddb"), -OP( "cds", BSIM4_CDSB, IF_REAL, "Cdsb"), -OP( "csg", BSIM4_CSGB, IF_REAL, "Csgb"), -OP( "csd", BSIM4_CSDB, IF_REAL, "Csdb"), -OP( "css", BSIM4_CSSB, IF_REAL, "Cssb"), -OP( "cgb", BSIM4_CGBB, IF_REAL, "Cgbb"), -OP( "cdb", BSIM4_CDBB, IF_REAL, "Cdbb"), -OP( "csb", BSIM4_CSBB, IF_REAL, "Csbb"), -OP( "cbb", BSIM4_CBBB, IF_REAL, "Cbbb"), -OP( "capbd", BSIM4_CAPBD, IF_REAL, "Capbd"), -OP( "capbs", BSIM4_CAPBS, IF_REAL, "Capbs"), -OP( "qg", BSIM4_QG, IF_REAL, "Qgate"), -OP( "qb", BSIM4_QB, IF_REAL, "Qbulk"), -OP( "qd", BSIM4_QD, IF_REAL, "Qdrain"), -OP( "qs", BSIM4_QS, IF_REAL, "Qsource"), -OP( "qinv", BSIM4_QINV, IF_REAL, "Qinversion"), -OP( "qdef", BSIM4_QDEF, IF_REAL, "Qdef"), -OP( "gcrg", BSIM4_GCRG, IF_REAL, "Gcrg"), -OP( "gtau", BSIM4_GTAU, IF_REAL, "Gtau"), -}; - -IFparm BSIM4mPTable[] = { /* model parameters */ -IOP( "cvchargemod", BSIM4_MOD_CVCHARGEMOD, IF_INTEGER, "Capacitance Charge model selector"), -IOP( "capmod", BSIM4_MOD_CAPMOD, IF_INTEGER, "Capacitance model selector"), -IOP( "diomod", BSIM4_MOD_DIOMOD, IF_INTEGER, "Diode IV model selector"), -IOP( "rdsmod", BSIM4_MOD_RDSMOD, IF_INTEGER, "Bias-dependent S/D resistance model selector"), -IOP( "trnqsmod", BSIM4_MOD_TRNQSMOD, IF_INTEGER, "Transient NQS model selector"), -IOP( "acnqsmod", BSIM4_MOD_ACNQSMOD, IF_INTEGER, "AC NQS model selector"), -IOP( "mobmod", BSIM4_MOD_MOBMOD, IF_INTEGER, "Mobility model selector"), -IOP( "rbodymod", BSIM4_MOD_RBODYMOD, IF_INTEGER, "Distributed body R model selector"), -IOP( "rgatemod", BSIM4_MOD_RGATEMOD, IF_INTEGER, "Gate R model selector"), -IOP( "permod", BSIM4_MOD_PERMOD, IF_INTEGER, "Pd and Ps model selector"), -IOP( "geomod", BSIM4_MOD_GEOMOD, IF_INTEGER, "Geometry dependent parasitics model selector"), -IOP( "rgeomod", BSIM4_MOD_RGEOMOD, IF_INTEGER, "S/D resistance and contact model selector"), -IOP( "fnoimod", BSIM4_MOD_FNOIMOD, IF_INTEGER, "Flicker noise model selector"), -IOP( "tnoimod", BSIM4_MOD_TNOIMOD, IF_INTEGER, "Thermal noise model selector"), -IOP( "mtrlmod", BSIM4_MOD_MTRLMOD, IF_INTEGER, "parameter for non-silicon substrate or metal gate selector"), -IOP( "mtrlcompatmod", BSIM4_MOD_MTRLCOMPATMOD, IF_INTEGER, "New Material Mod backward compatibility selector"), -IOP( "igcmod", BSIM4_MOD_IGCMOD, IF_INTEGER, "Gate-to-channel Ig model selector"), -IOP( "igbmod", BSIM4_MOD_IGBMOD, IF_INTEGER, "Gate-to-body Ig model selector"), -IOP( "tempmod", BSIM4_MOD_TEMPMOD, IF_INTEGER, "Temperature model selector"), -IOP( "gidlmod", BSIM4_MOD_GIDLMOD, IF_INTEGER, "parameter for GIDL selector"), /* v4.7 New GIDL/GISL */ -IOP( "paramchk", BSIM4_MOD_PARAMCHK, IF_INTEGER, "Model parameter checking selector"), -IOP( "binunit", BSIM4_MOD_BINUNIT, IF_INTEGER, "Bin unit selector"), -IOP( "version", BSIM4_MOD_VERSION, IF_STRING, "parameter for model version"), -IOP( "eot", BSIM4_MOD_EOT, IF_REAL, "Equivalent gate oxide thickness in meters"), -IOP( "vddeot", BSIM4_MOD_VDDEOT, IF_REAL, "Voltage for extraction of Equivalent gate oxide thickness"), -IOP( "tempeot", BSIM4_MOD_TEMPEOT, IF_REAL, " Temperature for extraction of EOT"), -IOP( "leffeot", BSIM4_MOD_LEFFEOT, IF_REAL, " Effective length for extraction of EOT"), -IOP( "weffeot", BSIM4_MOD_WEFFEOT, IF_REAL, "Effective width for extraction of EOT"), -IOP( "ados", BSIM4_MOD_ADOS, IF_REAL, "Charge centroid parameter"), -IOP( "bdos", BSIM4_MOD_BDOS, IF_REAL, "Charge centroid parameter"), -IOP( "toxe", BSIM4_MOD_TOXE, IF_REAL, "Electrical gate oxide thickness in meters"), -IOP( "toxp", BSIM4_MOD_TOXP, IF_REAL, "Physical gate oxide thickness in meters"), -IOP( "toxm", BSIM4_MOD_TOXM, IF_REAL, "Gate oxide thickness at which parameters are extracted"), -IOP( "toxref", BSIM4_MOD_TOXREF, IF_REAL, "Target tox value"), -IOP( "dtox", BSIM4_MOD_DTOX, IF_REAL, "Defined as (toxe - toxp) "), -IOP( "epsrox", BSIM4_MOD_EPSROX, IF_REAL, "Dielectric constant of the gate oxide relative to vacuum"), -IOP( "cdsc", BSIM4_MOD_CDSC, IF_REAL, "Drain/Source and channel coupling capacitance"), -IOP( "cdscb", BSIM4_MOD_CDSCB, IF_REAL, "Body-bias dependence of cdsc"), -IOP( "cdscd", BSIM4_MOD_CDSCD, IF_REAL, "Drain-bias dependence of cdsc"), -IOP( "cit", BSIM4_MOD_CIT, IF_REAL, "Interface state capacitance"), -IOP( "nfactor", BSIM4_MOD_NFACTOR, IF_REAL, "Subthreshold swing Coefficient"), -IOP( "xj", BSIM4_MOD_XJ, IF_REAL, "Junction depth in meters"), -IOP( "vsat", BSIM4_MOD_VSAT, IF_REAL, "Saturation velocity at tnom"), -IOP( "at", BSIM4_MOD_AT, IF_REAL, "Temperature coefficient of vsat"), -IOP( "a0", BSIM4_MOD_A0, IF_REAL, "Non-uniform depletion width effect coefficient."), -IOP( "ags", BSIM4_MOD_AGS, IF_REAL, "Gate bias coefficient of Abulk."), -IOP( "a1", BSIM4_MOD_A1, IF_REAL, "Non-saturation effect coefficient"), -IOP( "a2", BSIM4_MOD_A2, IF_REAL, "Non-saturation effect coefficient"), -IOP( "keta", BSIM4_MOD_KETA, IF_REAL, "Body-bias coefficient of non-uniform depletion width effect."), -IOP( "phig", BSIM4_MOD_PHIG, IF_REAL, "Work function of gate"), -IOP( "epsrgate", BSIM4_MOD_EPSRGATE, IF_REAL, "Dielectric constant of gate relative to vacuum"), -IOP( "easub",BSIM4_MOD_EASUB, IF_REAL, "Electron affinity of substrate"), -IOP( "epsrsub", BSIM4_MOD_EPSRSUB, IF_REAL, "Dielectric constant of substrate relative to vacuum"), -IOP( "ni0sub", BSIM4_MOD_NI0SUB, IF_REAL, "Intrinsic carrier concentration of substrate at 300.15K"), -IOP( "bg0sub", BSIM4_MOD_BG0SUB, IF_REAL, "Band-gap of substrate at T=0K"), -IOP( "tbgasub", BSIM4_MOD_TBGASUB, IF_REAL, "First parameter of band-gap change due to temperature"), -IOP( "tbgbsub", BSIM4_MOD_TBGBSUB, IF_REAL, "Second parameter of band-gap change due to temperature"), -IOP( "nsub", BSIM4_MOD_NSUB, IF_REAL, "Substrate doping concentration"), -IOP( "ndep", BSIM4_MOD_NDEP, IF_REAL, "Channel doping concentration at the depletion edge"), -IOP( "nsd", BSIM4_MOD_NSD, IF_REAL, "S/D doping concentration"), -IOP( "phin", BSIM4_MOD_PHIN, IF_REAL, "Adjusting parameter for surface potential due to non-uniform vertical doping"), -IOP( "ngate", BSIM4_MOD_NGATE, IF_REAL, "Poly-gate doping concentration"), -IOP( "gamma1", BSIM4_MOD_GAMMA1, IF_REAL, "Vth body coefficient"), -IOP( "gamma2", BSIM4_MOD_GAMMA2, IF_REAL, "Vth body coefficient"), -IOP( "vbx", BSIM4_MOD_VBX, IF_REAL, "Vth transition body Voltage"), -IOP( "vbm", BSIM4_MOD_VBM, IF_REAL, "Maximum body voltage"), - -IOP( "xt", BSIM4_MOD_XT, IF_REAL, "Doping depth"), -IOP( "k1", BSIM4_MOD_K1, IF_REAL, "Bulk effect coefficient 1"), -IOP( "kt1", BSIM4_MOD_KT1, IF_REAL, "Temperature coefficient of Vth"), -IOP( "kt1l", BSIM4_MOD_KT1L, IF_REAL, "Temperature coefficient of Vth"), -IOP( "kt2", BSIM4_MOD_KT2, IF_REAL, "Body-coefficient of kt1"), -IOP( "k2", BSIM4_MOD_K2, IF_REAL, "Bulk effect coefficient 2"), -IOP( "k3", BSIM4_MOD_K3, IF_REAL, "Narrow width effect coefficient"), -IOP( "k3b", BSIM4_MOD_K3B, IF_REAL, "Body effect coefficient of k3"), -IOP( "w0", BSIM4_MOD_W0, IF_REAL, "Narrow width effect parameter"), -IOP( "dvtp0", BSIM4_MOD_DVTP0, IF_REAL, "First parameter for Vth shift due to pocket"), -IOP( "dvtp1", BSIM4_MOD_DVTP1, IF_REAL, "Second parameter for Vth shift due to pocket"), -IOP( "dvtp2", BSIM4_MOD_DVTP2, IF_REAL, "3rd parameter for Vth shift due to pocket"), -IOP( "dvtp3", BSIM4_MOD_DVTP3, IF_REAL, "4th parameter for Vth shift due to pocket"), -IOP( "dvtp4", BSIM4_MOD_DVTP4, IF_REAL, "5th parameter for Vth shift due to pocket"), -IOP( "dvtp5", BSIM4_MOD_DVTP5, IF_REAL, "6th parameter for Vth shift due to pocket"), -IOP( "lpe0", BSIM4_MOD_LPE0, IF_REAL, "Equivalent length of pocket region at zero bias"), -IOP( "lpeb", BSIM4_MOD_LPEB, IF_REAL, "Equivalent length of pocket region accounting for body bias"), -IOP( "dvt0", BSIM4_MOD_DVT0, IF_REAL, "Short channel effect coeff. 0"), -IOP( "dvt1", BSIM4_MOD_DVT1, IF_REAL, "Short channel effect coeff. 1"), -IOP( "dvt2", BSIM4_MOD_DVT2, IF_REAL, "Short channel effect coeff. 2"), -IOP( "dvt0w", BSIM4_MOD_DVT0W, IF_REAL, "Narrow Width coeff. 0"), -IOP( "dvt1w", BSIM4_MOD_DVT1W, IF_REAL, "Narrow Width effect coeff. 1"), -IOP( "dvt2w", BSIM4_MOD_DVT2W, IF_REAL, "Narrow Width effect coeff. 2"), -IOP( "drout", BSIM4_MOD_DROUT, IF_REAL, "DIBL coefficient of output resistance"), -IOP( "dsub", BSIM4_MOD_DSUB, IF_REAL, "DIBL coefficient in the subthreshold region"), -IOP( "vth0", BSIM4_MOD_VTH0, IF_REAL,"Threshold voltage"), -IOPR("vtho", BSIM4_MOD_VTH0, IF_REAL,"Threshold voltage"), -IOP( "ua", BSIM4_MOD_UA, IF_REAL, "Linear gate dependence of mobility"), -IOP( "ua1", BSIM4_MOD_UA1, IF_REAL, "Temperature coefficient of ua"), -IOP( "ub", BSIM4_MOD_UB, IF_REAL, "Quadratic gate dependence of mobility"), -IOP( "ub1", BSIM4_MOD_UB1, IF_REAL, "Temperature coefficient of ub"), -IOP( "uc", BSIM4_MOD_UC, IF_REAL, "Body-bias dependence of mobility"), -IOP( "uc1", BSIM4_MOD_UC1, IF_REAL, "Temperature coefficient of uc"), -IOP( "ud", BSIM4_MOD_UD, IF_REAL, "Coulomb scattering factor of mobility"), -IOP( "ud1", BSIM4_MOD_UD1, IF_REAL, "Temperature coefficient of ud"), -IOP( "up", BSIM4_MOD_UP, IF_REAL, "Channel length linear factor of mobility"), -IOP( "lp", BSIM4_MOD_LP, IF_REAL, "Channel length exponential factor of mobility"), -IOP( "u0", BSIM4_MOD_U0, IF_REAL, "Low-field mobility at Tnom"), -IOP( "eu", BSIM4_MOD_EU, IF_REAL, "Mobility exponent"), -IOP( "ucs", BSIM4_MOD_UCS, IF_REAL, "Colombic scattering exponent"), -IOP( "ute", BSIM4_MOD_UTE, IF_REAL, "Temperature coefficient of mobility"), -IOP( "ucste", BSIM4_MOD_UCSTE, IF_REAL,"Temperature coefficient of colombic mobility"), -IOP( "voff", BSIM4_MOD_VOFF, IF_REAL, "Threshold voltage offset"), -IOP( "minv", BSIM4_MOD_MINV, IF_REAL, "Fitting parameter for moderate inversion in Vgsteff"), -IOP( "minvcv", BSIM4_MOD_MINVCV, IF_REAL, "Fitting parameter for moderate inversion in Vgsteffcv"), -IOP( "voffl", BSIM4_MOD_VOFFL, IF_REAL, "Length dependence parameter for Vth offset"), -IOP( "voffcvl", BSIM4_MOD_VOFFCVL, IF_REAL, "Length dependence parameter for Vth offset in CV"), -IOP( "tnom", BSIM4_MOD_TNOM, IF_REAL, "Parameter measurement temperature"), -IOP( "cgso", BSIM4_MOD_CGSO, IF_REAL, "Gate-source overlap capacitance per width"), -IOP( "cgdo", BSIM4_MOD_CGDO, IF_REAL, "Gate-drain overlap capacitance per width"), -IOP( "cgbo", BSIM4_MOD_CGBO, IF_REAL, "Gate-bulk overlap capacitance per length"), -IOP( "xpart", BSIM4_MOD_XPART, IF_REAL, "Channel charge partitioning"), -IOP( "delta", BSIM4_MOD_DELTA, IF_REAL, "Effective Vds parameter"), -IOP( "rsh", BSIM4_MOD_RSH, IF_REAL, "Source-drain sheet resistance"), -IOP( "rdsw", BSIM4_MOD_RDSW, IF_REAL, "Source-drain resistance per width"), -IOP( "rdswmin", BSIM4_MOD_RDSWMIN, IF_REAL, "Source-drain resistance per width at high Vg"), -IOP( "rsw", BSIM4_MOD_RSW, IF_REAL, "Source resistance per width"), -IOP( "rdw", BSIM4_MOD_RDW, IF_REAL, "Drain resistance per width"), -IOP( "rdwmin", BSIM4_MOD_RDWMIN, IF_REAL, "Drain resistance per width at high Vg"), -IOP( "rswmin", BSIM4_MOD_RSWMIN, IF_REAL, "Source resistance per width at high Vg"), - -IOP( "prwg", BSIM4_MOD_PRWG, IF_REAL, "Gate-bias effect on parasitic resistance "), -IOP( "prwb", BSIM4_MOD_PRWB, IF_REAL, "Body-effect on parasitic resistance "), - -IOP( "prt", BSIM4_MOD_PRT, IF_REAL, "Temperature coefficient of parasitic resistance "), -IOP( "eta0", BSIM4_MOD_ETA0, IF_REAL, "Subthreshold region DIBL coefficient"), -IOP( "etab", BSIM4_MOD_ETAB, IF_REAL, "Subthreshold region DIBL coefficient"), -IOP( "pclm", BSIM4_MOD_PCLM, IF_REAL, "Channel length modulation Coefficient"), -IOP( "pdiblc1", BSIM4_MOD_PDIBL1, IF_REAL, "Drain-induced barrier lowering coefficient"), -IOP( "pdiblc2", BSIM4_MOD_PDIBL2, IF_REAL, "Drain-induced barrier lowering coefficient"), -IOP( "pdiblcb", BSIM4_MOD_PDIBLB, IF_REAL, "Body-effect on drain-induced barrier lowering"), -IOP( "fprout", BSIM4_MOD_FPROUT, IF_REAL, "Rout degradation coefficient for pocket devices"), -IOP( "pdits", BSIM4_MOD_PDITS, IF_REAL, "Coefficient for drain-induced Vth shifts"), -IOP( "pditsl", BSIM4_MOD_PDITSL, IF_REAL, "Length dependence of drain-induced Vth shifts"), -IOP( "pditsd", BSIM4_MOD_PDITSD, IF_REAL, "Vds dependence of drain-induced Vth shifts"), -IOP( "pscbe1", BSIM4_MOD_PSCBE1, IF_REAL, "Substrate current body-effect coefficient"), -IOP( "pscbe2", BSIM4_MOD_PSCBE2, IF_REAL, "Substrate current body-effect coefficient"), -IOP( "pvag", BSIM4_MOD_PVAG, IF_REAL, "Gate dependence of output resistance parameter"), - -IOP( "jss", BSIM4_MOD_JSS, IF_REAL, "Bottom source junction reverse saturation current density"), -IOP( "jsws", BSIM4_MOD_JSWS, IF_REAL, "Isolation edge sidewall source junction reverse saturation current density"), -IOP( "jswgs", BSIM4_MOD_JSWGS, IF_REAL, "Gate edge source junction reverse saturation current density"), -IOP( "pbs", BSIM4_MOD_PBS, IF_REAL, "Source junction built-in potential"), -IOP( "njs", BSIM4_MOD_NJS, IF_REAL, "Source junction emission coefficient"), -IOP( "xtis", BSIM4_MOD_XTIS, IF_REAL, "Source junction current temperature exponent"), -IOP( "mjs", BSIM4_MOD_MJS, IF_REAL, "Source bottom junction capacitance grading coefficient"), -IOP( "pbsws", BSIM4_MOD_PBSWS, IF_REAL, "Source sidewall junction capacitance built in potential"), -IOP( "mjsws", BSIM4_MOD_MJSWS, IF_REAL, "Source sidewall junction capacitance grading coefficient"), -IOP( "pbswgs", BSIM4_MOD_PBSWGS, IF_REAL, "Source (gate side) sidewall junction capacitance built in potential"), -IOP( "mjswgs", BSIM4_MOD_MJSWGS, IF_REAL, "Source (gate side) sidewall junction capacitance grading coefficient"), -IOP( "cjs", BSIM4_MOD_CJS, IF_REAL, "Source bottom junction capacitance per unit area"), -IOP( "cjsws", BSIM4_MOD_CJSWS, IF_REAL, "Source sidewall junction capacitance per unit periphery"), -IOP( "cjswgs", BSIM4_MOD_CJSWGS, IF_REAL, "Source (gate side) sidewall junction capacitance per unit width"), - -IOP( "jsd", BSIM4_MOD_JSD, IF_REAL, "Bottom drain junction reverse saturation current density"), -IOP( "jswd", BSIM4_MOD_JSWD, IF_REAL, "Isolation edge sidewall drain junction reverse saturation current density"), -IOP( "jswgd", BSIM4_MOD_JSWGD, IF_REAL, "Gate edge drain junction reverse saturation current density"), -IOP( "pbd", BSIM4_MOD_PBD, IF_REAL, "Drain junction built-in potential"), -IOP( "njd", BSIM4_MOD_NJD, IF_REAL, "Drain junction emission coefficient"), -IOP( "xtid", BSIM4_MOD_XTID, IF_REAL, "Drainjunction current temperature exponent"), -IOP( "mjd", BSIM4_MOD_MJD, IF_REAL, "Drain bottom junction capacitance grading coefficient"), -IOP( "pbswd", BSIM4_MOD_PBSWD, IF_REAL, "Drain sidewall junction capacitance built in potential"), -IOP( "mjswd", BSIM4_MOD_MJSWD, IF_REAL, "Drain sidewall junction capacitance grading coefficient"), -IOP( "pbswgd", BSIM4_MOD_PBSWGD, IF_REAL, "Drain (gate side) sidewall junction capacitance built in potential"), -IOP( "mjswgd", BSIM4_MOD_MJSWGD, IF_REAL, "Drain (gate side) sidewall junction capacitance grading coefficient"), -IOP( "cjd", BSIM4_MOD_CJD, IF_REAL, "Drain bottom junction capacitance per unit area"), -IOP( "cjswd", BSIM4_MOD_CJSWD, IF_REAL, "Drain sidewall junction capacitance per unit periphery"), -IOP( "cjswgd", BSIM4_MOD_CJSWGD, IF_REAL, "Drain (gate side) sidewall junction capacitance per unit width"), - -IOP( "vfbcv", BSIM4_MOD_VFBCV, IF_REAL, "Flat Band Voltage parameter for capmod=0 only"), -IOP( "vfb", BSIM4_MOD_VFB, IF_REAL, "Flat Band Voltage"), -IOP( "tpb", BSIM4_MOD_TPB, IF_REAL, "Temperature coefficient of pb"), -IOP( "tcj", BSIM4_MOD_TCJ, IF_REAL, "Temperature coefficient of cj"), -IOP( "tpbsw", BSIM4_MOD_TPBSW, IF_REAL, "Temperature coefficient of pbsw"), -IOP( "tcjsw", BSIM4_MOD_TCJSW, IF_REAL, "Temperature coefficient of cjsw"), -IOP( "tpbswg", BSIM4_MOD_TPBSWG, IF_REAL, "Temperature coefficient of pbswg"), -IOP( "tcjswg", BSIM4_MOD_TCJSWG, IF_REAL, "Temperature coefficient of cjswg"), -IOP( "acde", BSIM4_MOD_ACDE, IF_REAL, "Exponential coefficient for finite charge thickness"), -IOP( "moin", BSIM4_MOD_MOIN, IF_REAL, "Coefficient for gate-bias dependent surface potential"), -IOP( "noff", BSIM4_MOD_NOFF, IF_REAL, "C-V turn-on/off parameter"), -IOP( "voffcv", BSIM4_MOD_VOFFCV, IF_REAL, "C-V lateral-shift parameter"), -IOP( "dmcg", BSIM4_MOD_DMCG, IF_REAL, "Distance of Mid-Contact to Gate edge"), -IOP( "dmci", BSIM4_MOD_DMCI, IF_REAL, "Distance of Mid-Contact to Isolation"), -IOP( "dmdg", BSIM4_MOD_DMDG, IF_REAL, "Distance of Mid-Diffusion to Gate edge"), -IOP( "dmcgt", BSIM4_MOD_DMCGT, IF_REAL, "Distance of Mid-Contact to Gate edge in Test structures"), -IOP( "xgw", BSIM4_MOD_XGW, IF_REAL, "Distance from gate contact center to device edge"), -IOP( "xgl", BSIM4_MOD_XGL, IF_REAL, "Variation in Ldrawn"), -IOP( "rshg", BSIM4_MOD_RSHG, IF_REAL, "Gate sheet resistance"), -IOP( "ngcon", BSIM4_MOD_NGCON, IF_REAL, "Number of gate contacts"), -IOP( "xrcrg1", BSIM4_MOD_XRCRG1, IF_REAL, "First fitting parameter the bias-dependent Rg"), -IOP( "xrcrg2", BSIM4_MOD_XRCRG2, IF_REAL, "Second fitting parameter the bias-dependent Rg"), -IOP( "lambda", BSIM4_MOD_LAMBDA, IF_REAL, " Velocity overshoot parameter"), -IOP( "vtl", BSIM4_MOD_VTL, IF_REAL, " thermal velocity"), -IOP( "lc", BSIM4_MOD_LC, IF_REAL, " back scattering parameter"), -IOP( "xn", BSIM4_MOD_XN, IF_REAL, " back scattering parameter"), -IOP( "vfbsdoff", BSIM4_MOD_VFBSDOFF, IF_REAL, "S/D flatband voltage offset"), -IOP( "tvfbsdoff", BSIM4_MOD_TVFBSDOFF, IF_REAL, "Temperature parameter for vfbsdoff"), -IOP( "tvoff", BSIM4_MOD_TVOFF, IF_REAL, "Temperature parameter for voff"), -IOP( "tnfactor", BSIM4_MOD_TNFACTOR, IF_REAL, "Temperature parameter for nfactor"), /* v4.7 Tanvir*/ -IOP( "teta0", BSIM4_MOD_TETA0, IF_REAL, "Temperature parameter for eta0"), /* v4.7 Tanvir*/ -IOP( "tvoffcv", BSIM4_MOD_TVOFFCV, IF_REAL, "Temperature parameter for tvoffcv"), /* v4.7 Tanvir*/ - -IOP( "lintnoi", BSIM4_MOD_LINTNOI, IF_REAL, "lint offset for noise calculation"), -IOP( "lint", BSIM4_MOD_LINT, IF_REAL, "Length reduction parameter"), -IOP( "ll", BSIM4_MOD_LL, IF_REAL, "Length reduction parameter"), -IOP( "llc", BSIM4_MOD_LLC, IF_REAL, "Length reduction parameter for CV"), -IOP( "lln", BSIM4_MOD_LLN, IF_REAL, "Length reduction parameter"), -IOP( "lw", BSIM4_MOD_LW, IF_REAL, "Length reduction parameter"), -IOP( "lwc", BSIM4_MOD_LWC, IF_REAL, "Length reduction parameter for CV"), -IOP( "lwn", BSIM4_MOD_LWN, IF_REAL, "Length reduction parameter"), -IOP( "lwl", BSIM4_MOD_LWL, IF_REAL, "Length reduction parameter"), -IOP( "lwlc", BSIM4_MOD_LWLC, IF_REAL, "Length reduction parameter for CV"), -IOP( "lmin", BSIM4_MOD_LMIN, IF_REAL, "Minimum length for the model"), -IOP( "lmax", BSIM4_MOD_LMAX, IF_REAL, "Maximum length for the model"), - -IOP( "wr", BSIM4_MOD_WR, IF_REAL, "Width dependence of rds"), -IOP( "wint", BSIM4_MOD_WINT, IF_REAL, "Width reduction parameter"), -IOP( "dwg", BSIM4_MOD_DWG, IF_REAL, "Width reduction parameter"), -IOP( "dwb", BSIM4_MOD_DWB, IF_REAL, "Width reduction parameter"), - -IOP( "wl", BSIM4_MOD_WL, IF_REAL, "Width reduction parameter"), -IOP( "wlc", BSIM4_MOD_WLC, IF_REAL, "Width reduction parameter for CV"), -IOP( "wln", BSIM4_MOD_WLN, IF_REAL, "Width reduction parameter"), -IOP( "ww", BSIM4_MOD_WW, IF_REAL, "Width reduction parameter"), -IOP( "wwc", BSIM4_MOD_WWC, IF_REAL, "Width reduction parameter for CV"), -IOP( "wwn", BSIM4_MOD_WWN, IF_REAL, "Width reduction parameter"), -IOP( "wwl", BSIM4_MOD_WWL, IF_REAL, "Width reduction parameter"), -IOP( "wwlc", BSIM4_MOD_WWLC, IF_REAL, "Width reduction parameter for CV"), -IOP( "wmin", BSIM4_MOD_WMIN, IF_REAL, "Minimum width for the model"), -IOP( "wmax", BSIM4_MOD_WMAX, IF_REAL, "Maximum width for the model"), - -IOP( "b0", BSIM4_MOD_B0, IF_REAL, "Abulk narrow width parameter"), -IOP( "b1", BSIM4_MOD_B1, IF_REAL, "Abulk narrow width parameter"), - -IOP( "cgsl", BSIM4_MOD_CGSL, IF_REAL, "New C-V model parameter"), -IOP( "cgdl", BSIM4_MOD_CGDL, IF_REAL, "New C-V model parameter"), -IOP( "ckappas", BSIM4_MOD_CKAPPAS, IF_REAL, "S/G overlap C-V parameter "), -IOP( "ckappad", BSIM4_MOD_CKAPPAD, IF_REAL, "D/G overlap C-V parameter"), -IOP( "cf", BSIM4_MOD_CF, IF_REAL, "Fringe capacitance parameter"), -IOP( "clc", BSIM4_MOD_CLC, IF_REAL, "Vdsat parameter for C-V model"), -IOP( "cle", BSIM4_MOD_CLE, IF_REAL, "Vdsat parameter for C-V model"), -IOP( "dwc", BSIM4_MOD_DWC, IF_REAL, "Delta W for C-V model"), -IOP( "dlc", BSIM4_MOD_DLC, IF_REAL, "Delta L for C-V model"), -IOP( "xw", BSIM4_MOD_XW, IF_REAL, "W offset for channel width due to mask/etch effect"), -IOP( "xl", BSIM4_MOD_XL, IF_REAL, "L offset for channel length due to mask/etch effect"), -IOP( "dlcig", BSIM4_MOD_DLCIG, IF_REAL, "Delta L for Ig model"), -IOP( "dlcigd", BSIM4_MOD_DLCIGD, IF_REAL, "Delta L for Ig model drain side"), -IOP( "dwj", BSIM4_MOD_DWJ, IF_REAL, "Delta W for S/D junctions"), - -IOP( "alpha0", BSIM4_MOD_ALPHA0, IF_REAL, "substrate current model parameter"), -IOP( "alpha1", BSIM4_MOD_ALPHA1, IF_REAL, "substrate current model parameter"), -IOP( "beta0", BSIM4_MOD_BETA0, IF_REAL, "substrate current model parameter"), - -IOP( "agidl", BSIM4_MOD_AGIDL, IF_REAL, "Pre-exponential constant for GIDL"), -IOP( "bgidl", BSIM4_MOD_BGIDL, IF_REAL, "Exponential constant for GIDL"), -IOP( "cgidl", BSIM4_MOD_CGIDL, IF_REAL, "Parameter for body-bias dependence of GIDL"), -IOP( "rgidl", BSIM4_MOD_RGIDL, IF_REAL, "GIDL vg parameter"), /* v4.7 New GIDL/GISL */ -IOP( "kgidl", BSIM4_MOD_KGIDL, IF_REAL, "GIDL vb parameter"), /* v4.7 New GIDL/GISL */ -IOP( "fgidl", BSIM4_MOD_FGIDL, IF_REAL, "GIDL vb parameter"), /* v4.7 New GIDL/GISL */ -IOP( "egidl", BSIM4_MOD_EGIDL, IF_REAL, "Fitting parameter for Bandbending"), -IOP( "agisl", BSIM4_MOD_AGISL, IF_REAL, "Pre-exponential constant for GISL"), -IOP( "bgisl", BSIM4_MOD_BGISL, IF_REAL, "Exponential constant for GISL"), -IOP( "cgisl", BSIM4_MOD_CGISL, IF_REAL, "Parameter for body-bias dependence of GISL"), -IOP( "rgisl", BSIM4_MOD_RGISL, IF_REAL, "GISL vg parameter"), /* v4.7 New GIDL/GISL */ -IOP( "kgisl", BSIM4_MOD_KGISL, IF_REAL, "GISL vb parameter"), /* v4.7 New GIDL/GISL */ -IOP( "fgisl", BSIM4_MOD_FGISL, IF_REAL, "GISL vb parameter"), /* v4.7 New GIDL/GISL */ -IOP( "egisl", BSIM4_MOD_EGISL, IF_REAL, "Fitting parameter for Bandbending"), -IOP( "aigc", BSIM4_MOD_AIGC, IF_REAL, "Parameter for Igc"), -IOP( "bigc", BSIM4_MOD_BIGC, IF_REAL, "Parameter for Igc"), -IOP( "cigc", BSIM4_MOD_CIGC, IF_REAL, "Parameter for Igc"), -IOP( "aigsd", BSIM4_MOD_AIGSD, IF_REAL, "Parameter for Igs,d"), -IOP( "bigsd", BSIM4_MOD_BIGSD, IF_REAL, "Parameter for Igs,d"), -IOP( "cigsd", BSIM4_MOD_CIGSD, IF_REAL, "Parameter for Igs,d"), -IOP( "aigs", BSIM4_MOD_AIGS, IF_REAL, "Parameter for Igs"), -IOP( "bigs", BSIM4_MOD_BIGS, IF_REAL, "Parameter for Igs"), -IOP( "cigs", BSIM4_MOD_CIGS, IF_REAL, "Parameter for Igs"), -IOP( "aigd", BSIM4_MOD_AIGD, IF_REAL, "Parameter for Igd"), -IOP( "bigd", BSIM4_MOD_BIGD, IF_REAL, "Parameter for Igd"), -IOP( "cigd", BSIM4_MOD_CIGD, IF_REAL, "Parameter for Igd"), -IOP( "aigbacc", BSIM4_MOD_AIGBACC, IF_REAL, "Parameter for Igb"), -IOP( "bigbacc", BSIM4_MOD_BIGBACC, IF_REAL, "Parameter for Igb"), -IOP( "cigbacc", BSIM4_MOD_CIGBACC, IF_REAL, "Parameter for Igb"), -IOP( "aigbinv", BSIM4_MOD_AIGBINV, IF_REAL, "Parameter for Igb"), -IOP( "bigbinv", BSIM4_MOD_BIGBINV, IF_REAL, "Parameter for Igb"), -IOP( "cigbinv", BSIM4_MOD_CIGBINV, IF_REAL, "Parameter for Igb"), -IOP( "nigc", BSIM4_MOD_NIGC, IF_REAL, "Parameter for Igc slope"), -IOP( "nigbinv", BSIM4_MOD_NIGBINV, IF_REAL, "Parameter for Igbinv slope"), -IOP( "nigbacc", BSIM4_MOD_NIGBACC, IF_REAL, "Parameter for Igbacc slope"), -IOP( "ntox", BSIM4_MOD_NTOX, IF_REAL, "Exponent for Tox ratio"), -IOP( "eigbinv", BSIM4_MOD_EIGBINV, IF_REAL, "Parameter for the Si bandgap for Igbinv"), -IOP( "pigcd", BSIM4_MOD_PIGCD, IF_REAL, "Parameter for Igc partition"), -IOP( "poxedge", BSIM4_MOD_POXEDGE, IF_REAL, "Factor for the gate edge Tox"), - -IOP( "ijthdfwd", BSIM4_MOD_IJTHDFWD, IF_REAL, "Forward drain diode forward limiting current"), -IOP( "ijthsfwd", BSIM4_MOD_IJTHSFWD, IF_REAL, "Forward source diode forward limiting current"), -IOP( "ijthdrev", BSIM4_MOD_IJTHDREV, IF_REAL, "Reverse drain diode forward limiting current"), -IOP( "ijthsrev", BSIM4_MOD_IJTHSREV, IF_REAL, "Reverse source diode forward limiting current"), -IOP( "xjbvd", BSIM4_MOD_XJBVD, IF_REAL, "Fitting parameter for drain diode breakdown current"), -IOP( "xjbvs", BSIM4_MOD_XJBVS, IF_REAL, "Fitting parameter for source diode breakdown current"), -IOP( "bvd", BSIM4_MOD_BVD, IF_REAL, "Drain diode breakdown voltage"), -IOP( "bvs", BSIM4_MOD_BVS, IF_REAL, "Source diode breakdown voltage"), - -IOP( "jtss", BSIM4_MOD_JTSS, IF_REAL, "Source bottom trap-assisted saturation current density"), -IOP( "jtsd", BSIM4_MOD_JTSD, IF_REAL, "Drain bottom trap-assisted saturation current density"), -IOP( "jtssws", BSIM4_MOD_JTSSWS, IF_REAL, "Source STI sidewall trap-assisted saturation current density"), -IOP( "jtsswd", BSIM4_MOD_JTSSWD, IF_REAL, "Drain STI sidewall trap-assisted saturation current density"), -IOP( "jtsswgs", BSIM4_MOD_JTSSWGS, IF_REAL, "Source gate-edge sidewall trap-assisted saturation current density"), -IOP( "jtsswgd", BSIM4_MOD_JTSSWGD, IF_REAL, "Drain gate-edge sidewall trap-assisted saturation current density"), -IOP( "jtweff", BSIM4_MOD_JTWEFF, IF_REAL, "TAT current width dependence"), -IOP( "njts", BSIM4_MOD_NJTS, IF_REAL, "Non-ideality factor for bottom junction"), -IOP( "njtssw", BSIM4_MOD_NJTSSW, IF_REAL, "Non-ideality factor for STI sidewall junction"), -IOP( "njtsswg", BSIM4_MOD_NJTSSWG, IF_REAL, "Non-ideality factor for gate-edge sidewall junction"), -IOP( "njtsd", BSIM4_MOD_NJTSD, IF_REAL, "Non-ideality factor for bottom junction drain side"), -IOP( "njtsswd", BSIM4_MOD_NJTSSWD, IF_REAL, "Non-ideality factor for STI sidewall junction drain side"), -IOP( "njtsswgd", BSIM4_MOD_NJTSSWGD, IF_REAL, "Non-ideality factor for gate-edge sidewall junction drain side"), -IOP( "xtss", BSIM4_MOD_XTSS, IF_REAL, "Power dependence of JTSS on temperature"), -IOP( "xtsd", BSIM4_MOD_XTSD, IF_REAL, "Power dependence of JTSD on temperature"), -IOP( "xtssws", BSIM4_MOD_XTSSWS, IF_REAL, "Power dependence of JTSSWS on temperature"), -IOP( "xtsswd", BSIM4_MOD_XTSSWD, IF_REAL, "Power dependence of JTSSWD on temperature"), -IOP( "xtsswgs", BSIM4_MOD_XTSSWGS, IF_REAL, "Power dependence of JTSSWGS on temperature"), -IOP( "xtsswgd", BSIM4_MOD_XTSSWGD, IF_REAL, "Power dependence of JTSSWGD on temperature"), -IOP( "tnjts", BSIM4_MOD_TNJTS, IF_REAL, "Temperature coefficient for NJTS"), -IOP( "tnjtssw", BSIM4_MOD_TNJTSSW, IF_REAL, "Temperature coefficient for NJTSSW"), -IOP( "tnjtsswg", BSIM4_MOD_TNJTSSWG, IF_REAL, "Temperature coefficient for NJTSSWG"), -IOP( "tnjtsd", BSIM4_MOD_TNJTSD, IF_REAL, "Temperature coefficient for NJTSD"), -IOP( "tnjtsswd", BSIM4_MOD_TNJTSSWD, IF_REAL, "Temperature coefficient for NJTSSWD"), -IOP( "tnjtsswgd", BSIM4_MOD_TNJTSSWGD, IF_REAL, "Temperature coefficient for NJTSSWGD"), -IOP( "vtss", BSIM4_MOD_VTSS, IF_REAL, "Source bottom trap-assisted voltage dependent parameter"), -IOP( "vtsd", BSIM4_MOD_VTSD, IF_REAL, "Drain bottom trap-assisted voltage dependent parameter"), -IOP( "vtssws", BSIM4_MOD_VTSSWS, IF_REAL, "Source STI sidewall trap-assisted voltage dependent parameter"), -IOP( "vtsswd", BSIM4_MOD_VTSSWD, IF_REAL, "Drain STI sidewall trap-assisted voltage dependent parameter"), -IOP( "vtsswgs", BSIM4_MOD_VTSSWGS, IF_REAL, "Source gate-edge sidewall trap-assisted voltage dependent parameter"), -IOP( "vtsswgd", BSIM4_MOD_VTSSWGD, IF_REAL, "Drain gate-edge sidewall trap-assisted voltage dependent parameter"), - -IOP( "gbmin", BSIM4_MOD_GBMIN, IF_REAL, "Minimum body conductance"), -IOP( "rbdb", BSIM4_MOD_RBDB, IF_REAL, "Resistance between bNode and dbNode"), -IOP( "rbpb", BSIM4_MOD_RBPB, IF_REAL, "Resistance between bNodePrime and bNode"), -IOP( "rbsb", BSIM4_MOD_RBSB, IF_REAL, "Resistance between bNode and sbNode"), -IOP( "rbps", BSIM4_MOD_RBPS, IF_REAL, "Resistance between bNodePrime and sbNode"), -IOP( "rbpd", BSIM4_MOD_RBPD, IF_REAL, "Resistance between bNodePrime and bNode"), - -IOP( "rbps0", BSIM4_MOD_RBPS0, IF_REAL , "Body resistance RBPS scaling"), -IOP( "rbpsl", BSIM4_MOD_RBPSL, IF_REAL , "Body resistance RBPS L scaling"), -IOP( "rbpsw", BSIM4_MOD_RBPSW, IF_REAL , "Body resistance RBPS W scaling"), -IOP( "rbpsnf", BSIM4_MOD_RBPSNF, IF_REAL , "Body resistance RBPS NF scaling"), - -IOP( "rbpd0", BSIM4_MOD_RBPD0, IF_REAL , "Body resistance RBPD scaling"), -IOP( "rbpdl", BSIM4_MOD_RBPDL, IF_REAL , "Body resistance RBPD L scaling"), -IOP( "rbpdw", BSIM4_MOD_RBPDW, IF_REAL , "Body resistance RBPD W scaling"), -IOP( "rbpdnf", BSIM4_MOD_RBPDNF, IF_REAL , "Body resistance RBPD NF scaling"), - -IOP( "rbpbx0", BSIM4_MOD_RBPBX0, IF_REAL , "Body resistance RBPBX scaling"), -IOP( "rbpbxl", BSIM4_MOD_RBPBXL, IF_REAL , "Body resistance RBPBX L scaling"), -IOP( "rbpbxw", BSIM4_MOD_RBPBXW, IF_REAL , "Body resistance RBPBX W scaling"), -IOP( "rbpbxnf", BSIM4_MOD_RBPBXNF, IF_REAL , "Body resistance RBPBX NF scaling"), -IOP( "rbpby0", BSIM4_MOD_RBPBY0, IF_REAL , "Body resistance RBPBY scaling"), -IOP( "rbpbyl", BSIM4_MOD_RBPBYL, IF_REAL , "Body resistance RBPBY L scaling"), -IOP( "rbpbyw", BSIM4_MOD_RBPBYW, IF_REAL , "Body resistance RBPBY W scaling"), -IOP( "rbpbynf", BSIM4_MOD_RBPBYNF, IF_REAL , "Body resistance RBPBY NF scaling"), - -IOP( "rbsbx0", BSIM4_MOD_RBSBX0, IF_REAL , "Body resistance RBSBX scaling"), -IOP( "rbsby0", BSIM4_MOD_RBSBY0, IF_REAL , "Body resistance RBSBY scaling"), -IOP( "rbdbx0", BSIM4_MOD_RBDBX0, IF_REAL , "Body resistance RBDBX scaling"), -IOP( "rbdby0", BSIM4_MOD_RBDBY0, IF_REAL , "Body resistance RBDBY scaling"), - -IOP( "rbsdbxl", BSIM4_MOD_RBSDBXL, IF_REAL , "Body resistance RBSDBX L scaling"), -IOP( "rbsdbxw", BSIM4_MOD_RBSDBXW, IF_REAL , "Body resistance RBSDBX W scaling"), -IOP( "rbsdbxnf", BSIM4_MOD_RBSDBXNF, IF_REAL , "Body resistance RBSDBX NF scaling"), -IOP( "rbsdbyl", BSIM4_MOD_RBSDBYL, IF_REAL , "Body resistance RBSDBY L scaling"), -IOP( "rbsdbyw", BSIM4_MOD_RBSDBYW, IF_REAL , "Body resistance RBSDBY W scaling"), -IOP( "rbsdbynf", BSIM4_MOD_RBSDBYNF, IF_REAL , "Body resistance RBSDBY NF scaling"), - -IOP( "lcdsc", BSIM4_MOD_LCDSC, IF_REAL, "Length dependence of cdsc"), -IOP( "lcdscb", BSIM4_MOD_LCDSCB, IF_REAL, "Length dependence of cdscb"), -IOP( "lcdscd", BSIM4_MOD_LCDSCD, IF_REAL, "Length dependence of cdscd"), -IOP( "lcit", BSIM4_MOD_LCIT, IF_REAL, "Length dependence of cit"), -IOP( "lnfactor", BSIM4_MOD_LNFACTOR, IF_REAL, "Length dependence of nfactor"), -IOP( "lxj", BSIM4_MOD_LXJ, IF_REAL, "Length dependence of xj"), -IOP( "lvsat", BSIM4_MOD_LVSAT, IF_REAL, "Length dependence of vsat"), -IOP( "lat", BSIM4_MOD_LAT, IF_REAL, "Length dependence of at"), -IOP( "la0", BSIM4_MOD_LA0, IF_REAL, "Length dependence of a0"), -IOP( "lags", BSIM4_MOD_LAGS, IF_REAL, "Length dependence of ags"), -IOP( "la1", BSIM4_MOD_LA1, IF_REAL, "Length dependence of a1"), -IOP( "la2", BSIM4_MOD_LA2, IF_REAL, "Length dependence of a2"), -IOP( "lketa", BSIM4_MOD_LKETA, IF_REAL, "Length dependence of keta"), -IOP( "lnsub", BSIM4_MOD_LNSUB, IF_REAL, "Length dependence of nsub"), -IOP( "lndep", BSIM4_MOD_LNDEP, IF_REAL, "Length dependence of ndep"), -IOP( "lnsd", BSIM4_MOD_LNSD, IF_REAL, "Length dependence of nsd"), -IOP( "lphin", BSIM4_MOD_LPHIN, IF_REAL, "Length dependence of phin"), -IOP( "lngate", BSIM4_MOD_LNGATE, IF_REAL, "Length dependence of ngate"), -IOP( "lgamma1", BSIM4_MOD_LGAMMA1, IF_REAL, "Length dependence of gamma1"), -IOP( "lgamma2", BSIM4_MOD_LGAMMA2, IF_REAL, "Length dependence of gamma2"), -IOP( "lvbx", BSIM4_MOD_LVBX, IF_REAL, "Length dependence of vbx"), -IOP( "lvbm", BSIM4_MOD_LVBM, IF_REAL, "Length dependence of vbm"), -IOP( "lxt", BSIM4_MOD_LXT, IF_REAL, "Length dependence of xt"), -IOP( "lk1", BSIM4_MOD_LK1, IF_REAL, "Length dependence of k1"), -IOP( "lkt1", BSIM4_MOD_LKT1, IF_REAL, "Length dependence of kt1"), -IOP( "lkt1l", BSIM4_MOD_LKT1L, IF_REAL, "Length dependence of kt1l"), -IOP( "lkt2", BSIM4_MOD_LKT2, IF_REAL, "Length dependence of kt2"), -IOP( "lk2", BSIM4_MOD_LK2, IF_REAL, "Length dependence of k2"), -IOP( "lk3", BSIM4_MOD_LK3, IF_REAL, "Length dependence of k3"), -IOP( "lk3b", BSIM4_MOD_LK3B, IF_REAL, "Length dependence of k3b"), -IOP( "lw0", BSIM4_MOD_LW0, IF_REAL, "Length dependence of w0"), -IOP( "ldvtp0", BSIM4_MOD_LDVTP0, IF_REAL, "Length dependence of dvtp0"), -IOP( "ldvtp1", BSIM4_MOD_LDVTP1, IF_REAL, "Length dependence of dvtp1"), -IOP( "ldvtp2", BSIM4_MOD_LDVTP2, IF_REAL, "Length dependence of dvtp2"), -IOP( "ldvtp3", BSIM4_MOD_LDVTP3, IF_REAL, "Length dependence of dvtp3"), -IOP( "ldvtp4", BSIM4_MOD_LDVTP4, IF_REAL, "Length dependence of dvtp4"), -IOP( "ldvtp5", BSIM4_MOD_LDVTP5, IF_REAL, "Length dependence of dvtp5"), -IOP( "llpe0", BSIM4_MOD_LLPE0, IF_REAL, "Length dependence of lpe0"), -IOP( "llpeb", BSIM4_MOD_LLPEB, IF_REAL, "Length dependence of lpeb"), -IOP( "ldvt0", BSIM4_MOD_LDVT0, IF_REAL, "Length dependence of dvt0"), -IOP( "ldvt1", BSIM4_MOD_LDVT1, IF_REAL, "Length dependence of dvt1"), -IOP( "ldvt2", BSIM4_MOD_LDVT2, IF_REAL, "Length dependence of dvt2"), -IOP( "ldvt0w", BSIM4_MOD_LDVT0W, IF_REAL, "Length dependence of dvt0w"), -IOP( "ldvt1w", BSIM4_MOD_LDVT1W, IF_REAL, "Length dependence of dvt1w"), -IOP( "ldvt2w", BSIM4_MOD_LDVT2W, IF_REAL, "Length dependence of dvt2w"), -IOP( "ldrout", BSIM4_MOD_LDROUT, IF_REAL, "Length dependence of drout"), -IOP( "ldsub", BSIM4_MOD_LDSUB, IF_REAL, "Length dependence of dsub"), -IOP( "lvth0", BSIM4_MOD_LVTH0, IF_REAL,"Length dependence of vth0"), -IOPR("lvtho", BSIM4_MOD_LVTH0, IF_REAL,"Length dependence of vtho"), -IOP( "lua", BSIM4_MOD_LUA, IF_REAL, "Length dependence of ua"), -IOP( "lua1", BSIM4_MOD_LUA1, IF_REAL, "Length dependence of ua1"), -IOP( "lub", BSIM4_MOD_LUB, IF_REAL, "Length dependence of ub"), -IOP( "lub1", BSIM4_MOD_LUB1, IF_REAL, "Length dependence of ub1"), -IOP( "luc", BSIM4_MOD_LUC, IF_REAL, "Length dependence of uc"), -IOP( "luc1", BSIM4_MOD_LUC1, IF_REAL, "Length dependence of uc1"), -IOP( "lud", BSIM4_MOD_LUD, IF_REAL, "Length dependence of ud"), -IOP( "lud1", BSIM4_MOD_LUD1, IF_REAL, "Length dependence of ud1"), -IOP( "lup", BSIM4_MOD_LUP, IF_REAL, "Length dependence of up"), -IOP( "llp", BSIM4_MOD_LLP, IF_REAL, "Length dependence of lp"), -IOP( "lu0", BSIM4_MOD_LU0, IF_REAL, "Length dependence of u0"), -IOP( "lute", BSIM4_MOD_LUTE, IF_REAL, "Length dependence of ute"), -IOP( "lucste", BSIM4_MOD_LUCSTE, IF_REAL, "Length dependence of ucste"), -IOP( "lvoff", BSIM4_MOD_LVOFF, IF_REAL, "Length dependence of voff"), -IOP( "lminv", BSIM4_MOD_LMINV, IF_REAL, "Length dependence of minv"), -IOP( "lminvcv", BSIM4_MOD_LMINVCV, IF_REAL, "Length dependence of minvcv"), -IOP( "ldelta", BSIM4_MOD_LDELTA, IF_REAL, "Length dependence of delta"), -IOP( "lrdsw", BSIM4_MOD_LRDSW, IF_REAL, "Length dependence of rdsw "), -IOP( "lrsw", BSIM4_MOD_LRSW, IF_REAL, "Length dependence of rsw"), -IOP( "lrdw", BSIM4_MOD_LRDW, IF_REAL, "Length dependence of rdw"), - -IOP( "lprwg", BSIM4_MOD_LPRWG, IF_REAL, "Length dependence of prwg "), -IOP( "lprwb", BSIM4_MOD_LPRWB, IF_REAL, "Length dependence of prwb "), - -IOP( "lprt", BSIM4_MOD_LPRT, IF_REAL, "Length dependence of prt "), -IOP( "leta0", BSIM4_MOD_LETA0, IF_REAL, "Length dependence of eta0"), -IOP( "letab", BSIM4_MOD_LETAB, IF_REAL, "Length dependence of etab"), -IOP( "lpclm", BSIM4_MOD_LPCLM, IF_REAL, "Length dependence of pclm"), -IOP( "lpdiblc1", BSIM4_MOD_LPDIBL1, IF_REAL, "Length dependence of pdiblc1"), -IOP( "lpdiblc2", BSIM4_MOD_LPDIBL2, IF_REAL, "Length dependence of pdiblc2"), -IOP( "lpdiblcb", BSIM4_MOD_LPDIBLB, IF_REAL, "Length dependence of pdiblcb"), -IOP( "lfprout", BSIM4_MOD_LFPROUT, IF_REAL, "Length dependence of pdiblcb"), -IOP( "lpdits", BSIM4_MOD_LPDITS, IF_REAL, "Length dependence of pdits"), -IOP( "lpditsd", BSIM4_MOD_LPDITSD, IF_REAL, "Length dependence of pditsd"), -IOP( "lpscbe1", BSIM4_MOD_LPSCBE1, IF_REAL, "Length dependence of pscbe1"), -IOP( "lpscbe2", BSIM4_MOD_LPSCBE2, IF_REAL, "Length dependence of pscbe2"), -IOP( "lpvag", BSIM4_MOD_LPVAG, IF_REAL, "Length dependence of pvag"), -IOP( "lwr", BSIM4_MOD_LWR, IF_REAL, "Length dependence of wr"), -IOP( "ldwg", BSIM4_MOD_LDWG, IF_REAL, "Length dependence of dwg"), -IOP( "ldwb", BSIM4_MOD_LDWB, IF_REAL, "Length dependence of dwb"), -IOP( "lb0", BSIM4_MOD_LB0, IF_REAL, "Length dependence of b0"), -IOP( "lb1", BSIM4_MOD_LB1, IF_REAL, "Length dependence of b1"), -IOP( "lcgsl", BSIM4_MOD_LCGSL, IF_REAL, "Length dependence of cgsl"), -IOP( "lcgdl", BSIM4_MOD_LCGDL, IF_REAL, "Length dependence of cgdl"), -IOP( "lckappas", BSIM4_MOD_LCKAPPAS, IF_REAL, "Length dependence of ckappas"), -IOP( "lckappad", BSIM4_MOD_LCKAPPAD, IF_REAL, "Length dependence of ckappad"), -IOP( "lcf", BSIM4_MOD_LCF, IF_REAL, "Length dependence of cf"), -IOP( "lclc", BSIM4_MOD_LCLC, IF_REAL, "Length dependence of clc"), -IOP( "lcle", BSIM4_MOD_LCLE, IF_REAL, "Length dependence of cle"), -IOP( "lalpha0", BSIM4_MOD_LALPHA0, IF_REAL, "Length dependence of alpha0"), -IOP( "lalpha1", BSIM4_MOD_LALPHA1, IF_REAL, "Length dependence of alpha1"), -IOP( "lbeta0", BSIM4_MOD_LBETA0, IF_REAL, "Length dependence of beta0"), - -IOP( "lagidl", BSIM4_MOD_LAGIDL, IF_REAL, "Length dependence of agidl"), -IOP( "lbgidl", BSIM4_MOD_LBGIDL, IF_REAL, "Length dependence of bgidl"), -IOP( "lcgidl", BSIM4_MOD_LCGIDL, IF_REAL, "Length dependence of cgidl"), -IOP( "lrgidl", BSIM4_MOD_LRGIDL, IF_REAL, "Length dependence of rgidl"), /* v4.7 New GIDL/GISL */ -IOP( "lkgidl", BSIM4_MOD_LKGIDL, IF_REAL, "Length dependence of kgidl"), /* v4.7 New GIDL/GISL */ -IOP( "lfgidl", BSIM4_MOD_LFGIDL, IF_REAL, "Length dependence of fgidl"), /* v4.7 New GIDL/GISL */ -IOP( "legidl", BSIM4_MOD_LEGIDL, IF_REAL, "Length dependence of egidl"), -IOP( "lagisl", BSIM4_MOD_LAGISL, IF_REAL, "Length dependence of agisl"), -IOP( "lbgisl", BSIM4_MOD_LBGISL, IF_REAL, "Length dependence of bgisl"), -IOP( "lcgisl", BSIM4_MOD_LCGISL, IF_REAL, "Length dependence of cgisl"), -IOP( "lrgisl", BSIM4_MOD_LRGISL, IF_REAL, "Length dependence of rgisl"), /* v4.7 New GIDL/GISL */ -IOP( "lkgisl", BSIM4_MOD_LKGISL, IF_REAL, "Length dependence of kgisl"), /* v4.7 New GIDL/GISL */ -IOP( "lfgisl", BSIM4_MOD_LFGISL, IF_REAL, "Length dependence of fgisl"), /* v4.7 New GIDL/GISL */ -IOP( "legisl", BSIM4_MOD_LEGISL, IF_REAL, "Length dependence of egisl"), -IOP( "laigc", BSIM4_MOD_LAIGC, IF_REAL, "Length dependence of aigc"), -IOP( "lbigc", BSIM4_MOD_LBIGC, IF_REAL, "Length dependence of bigc"), -IOP( "lcigc", BSIM4_MOD_LCIGC, IF_REAL, "Length dependence of cigc"), -IOP( "laigsd", BSIM4_MOD_LAIGSD, IF_REAL, "Length dependence of aigsd"), -IOP( "lbigsd", BSIM4_MOD_LBIGSD, IF_REAL, "Length dependence of bigsd"), -IOP( "lcigsd", BSIM4_MOD_LCIGSD, IF_REAL, "Length dependence of cigsd"), -IOP( "laigs", BSIM4_MOD_LAIGS, IF_REAL, "Length dependence of aigs"), -IOP( "lbigs", BSIM4_MOD_LBIGS, IF_REAL, "Length dependence of bigs"), -IOP( "lcigs", BSIM4_MOD_LCIGS, IF_REAL, "Length dependence of cigs"), -IOP( "laigd", BSIM4_MOD_LAIGD, IF_REAL, "Length dependence of aigd"), -IOP( "lbigd", BSIM4_MOD_LBIGD, IF_REAL, "Length dependence of bigd"), -IOP( "lcigd", BSIM4_MOD_LCIGD, IF_REAL, "Length dependence of cigd"), -IOP( "laigbacc", BSIM4_MOD_LAIGBACC, IF_REAL, "Length dependence of aigbacc"), -IOP( "lbigbacc", BSIM4_MOD_LBIGBACC, IF_REAL, "Length dependence of bigbacc"), -IOP( "lcigbacc", BSIM4_MOD_LCIGBACC, IF_REAL, "Length dependence of cigbacc"), -IOP( "laigbinv", BSIM4_MOD_LAIGBINV, IF_REAL, "Length dependence of aigbinv"), -IOP( "lbigbinv", BSIM4_MOD_LBIGBINV, IF_REAL, "Length dependence of bigbinv"), -IOP( "lcigbinv", BSIM4_MOD_LCIGBINV, IF_REAL, "Length dependence of cigbinv"), -IOP( "lnigc", BSIM4_MOD_LNIGC, IF_REAL, "Length dependence of nigc"), -IOP( "lnigbinv", BSIM4_MOD_LNIGBINV, IF_REAL, "Length dependence of nigbinv"), -IOP( "lnigbacc", BSIM4_MOD_LNIGBACC, IF_REAL, "Length dependence of nigbacc"), -IOP( "lntox", BSIM4_MOD_LNTOX, IF_REAL, "Length dependence of ntox"), -IOP( "leigbinv", BSIM4_MOD_LEIGBINV, IF_REAL, "Length dependence for eigbinv"), -IOP( "lpigcd", BSIM4_MOD_LPIGCD, IF_REAL, "Length dependence for pigcd"), -IOP( "lpoxedge", BSIM4_MOD_LPOXEDGE, IF_REAL, "Length dependence for poxedge"), - -IOP( "lvfbcv", BSIM4_MOD_LVFBCV, IF_REAL, "Length dependence of vfbcv"), -IOP( "lvfb", BSIM4_MOD_LVFB, IF_REAL, "Length dependence of vfb"), -IOP( "lacde", BSIM4_MOD_LACDE, IF_REAL, "Length dependence of acde"), -IOP( "lmoin", BSIM4_MOD_LMOIN, IF_REAL, "Length dependence of moin"), -IOP( "lnoff", BSIM4_MOD_LNOFF, IF_REAL, "Length dependence of noff"), -IOP( "lvoffcv", BSIM4_MOD_LVOFFCV, IF_REAL, "Length dependence of voffcv"), -IOP( "lxrcrg1", BSIM4_MOD_LXRCRG1, IF_REAL, "Length dependence of xrcrg1"), -IOP( "lxrcrg2", BSIM4_MOD_LXRCRG2, IF_REAL, "Length dependence of xrcrg2"), -IOP( "llambda", BSIM4_MOD_LLAMBDA, IF_REAL, "Length dependence of lambda"), -IOP( "lvtl", BSIM4_MOD_LVTL, IF_REAL, " Length dependence of vtl"), -IOP( "lxn", BSIM4_MOD_LXN, IF_REAL, " Length dependence of xn"), -IOP( "leu", BSIM4_MOD_LEU, IF_REAL, " Length dependence of eu"), -IOP( "lucs", BSIM4_MOD_LUCS, IF_REAL, "Length dependence of lucs"), -IOP( "lvfbsdoff", BSIM4_MOD_LVFBSDOFF, IF_REAL, "Length dependence of vfbsdoff"), -IOP( "ltvfbsdoff", BSIM4_MOD_LTVFBSDOFF, IF_REAL, "Length dependence of tvfbsdoff"), -IOP( "ltvoff", BSIM4_MOD_LTVOFF, IF_REAL, "Length dependence of tvoff"), -IOP( "ltnfactor", BSIM4_MOD_LTNFACTOR, IF_REAL, "Length dependence of tnfactor"), /* v4.7 Tanvir*/ -IOP( "lteta0", BSIM4_MOD_LTETA0, IF_REAL, "Length dependence of teta0"), /* v4.7 Tanvir*/ -IOP( "ltvoffcv", BSIM4_MOD_LTVOFFCV, IF_REAL, "Length dependence of tvoffcv"), /* v4.7 Tanvir*/ - -IOP( "wcdsc", BSIM4_MOD_WCDSC, IF_REAL, "Width dependence of cdsc"), -IOP( "wcdscb", BSIM4_MOD_WCDSCB, IF_REAL, "Width dependence of cdscb"), -IOP( "wcdscd", BSIM4_MOD_WCDSCD, IF_REAL, "Width dependence of cdscd"), -IOP( "wcit", BSIM4_MOD_WCIT, IF_REAL, "Width dependence of cit"), -IOP( "wnfactor", BSIM4_MOD_WNFACTOR, IF_REAL, "Width dependence of nfactor"), -IOP( "wxj", BSIM4_MOD_WXJ, IF_REAL, "Width dependence of xj"), -IOP( "wvsat", BSIM4_MOD_WVSAT, IF_REAL, "Width dependence of vsat"), -IOP( "wat", BSIM4_MOD_WAT, IF_REAL, "Width dependence of at"), -IOP( "wa0", BSIM4_MOD_WA0, IF_REAL, "Width dependence of a0"), -IOP( "wags", BSIM4_MOD_WAGS, IF_REAL, "Width dependence of ags"), -IOP( "wa1", BSIM4_MOD_WA1, IF_REAL, "Width dependence of a1"), -IOP( "wa2", BSIM4_MOD_WA2, IF_REAL, "Width dependence of a2"), -IOP( "wketa", BSIM4_MOD_WKETA, IF_REAL, "Width dependence of keta"), -IOP( "wnsub", BSIM4_MOD_WNSUB, IF_REAL, "Width dependence of nsub"), -IOP( "wndep", BSIM4_MOD_WNDEP, IF_REAL, "Width dependence of ndep"), -IOP( "wnsd", BSIM4_MOD_WNSD, IF_REAL, "Width dependence of nsd"), -IOP( "wphin", BSIM4_MOD_WPHIN, IF_REAL, "Width dependence of phin"), -IOP( "wngate", BSIM4_MOD_WNGATE, IF_REAL, "Width dependence of ngate"), -IOP( "wgamma1", BSIM4_MOD_WGAMMA1, IF_REAL, "Width dependence of gamma1"), -IOP( "wgamma2", BSIM4_MOD_WGAMMA2, IF_REAL, "Width dependence of gamma2"), -IOP( "wvbx", BSIM4_MOD_WVBX, IF_REAL, "Width dependence of vbx"), -IOP( "wvbm", BSIM4_MOD_WVBM, IF_REAL, "Width dependence of vbm"), -IOP( "wxt", BSIM4_MOD_WXT, IF_REAL, "Width dependence of xt"), -IOP( "wk1", BSIM4_MOD_WK1, IF_REAL, "Width dependence of k1"), -IOP( "wkt1", BSIM4_MOD_WKT1, IF_REAL, "Width dependence of kt1"), -IOP( "wkt1l", BSIM4_MOD_WKT1L, IF_REAL, "Width dependence of kt1l"), -IOP( "wkt2", BSIM4_MOD_WKT2, IF_REAL, "Width dependence of kt2"), -IOP( "wk2", BSIM4_MOD_WK2, IF_REAL, "Width dependence of k2"), -IOP( "wk3", BSIM4_MOD_WK3, IF_REAL, "Width dependence of k3"), -IOP( "wk3b", BSIM4_MOD_WK3B, IF_REAL, "Width dependence of k3b"), -IOP( "ww0", BSIM4_MOD_WW0, IF_REAL, "Width dependence of w0"), -IOP( "wdvtp0", BSIM4_MOD_WDVTP0, IF_REAL, "Width dependence of dvtp0"), -IOP( "wdvtp1", BSIM4_MOD_WDVTP1, IF_REAL, "Width dependence of dvtp1"), -IOP( "wdvtp2", BSIM4_MOD_WDVTP2, IF_REAL, "Width dependence of dvtp2"), -IOP( "wdvtp3", BSIM4_MOD_WDVTP3, IF_REAL, "Width dependence of dvtp3"), -IOP( "wdvtp4", BSIM4_MOD_WDVTP4, IF_REAL, "Width dependence of dvtp4"), -IOP( "wdvtp5", BSIM4_MOD_WDVTP5, IF_REAL, "Width dependence of dvtp5"), -IOP( "wlpe0", BSIM4_MOD_WLPE0, IF_REAL, "Width dependence of lpe0"), -IOP( "wlpeb", BSIM4_MOD_WLPEB, IF_REAL, "Width dependence of lpeb"), -IOP( "wdvt0", BSIM4_MOD_WDVT0, IF_REAL, "Width dependence of dvt0"), -IOP( "wdvt1", BSIM4_MOD_WDVT1, IF_REAL, "Width dependence of dvt1"), -IOP( "wdvt2", BSIM4_MOD_WDVT2, IF_REAL, "Width dependence of dvt2"), -IOP( "wdvt0w", BSIM4_MOD_WDVT0W, IF_REAL, "Width dependence of dvt0w"), -IOP( "wdvt1w", BSIM4_MOD_WDVT1W, IF_REAL, "Width dependence of dvt1w"), -IOP( "wdvt2w", BSIM4_MOD_WDVT2W, IF_REAL, "Width dependence of dvt2w"), -IOP( "wdrout", BSIM4_MOD_WDROUT, IF_REAL, "Width dependence of drout"), -IOP( "wdsub", BSIM4_MOD_WDSUB, IF_REAL, "Width dependence of dsub"), -IOP( "wvth0", BSIM4_MOD_WVTH0, IF_REAL,"Width dependence of vth0"), -IOPR("wvtho", BSIM4_MOD_WVTH0, IF_REAL,"Width dependence of vtho"), -IOP( "wua", BSIM4_MOD_WUA, IF_REAL, "Width dependence of ua"), -IOP( "wua1", BSIM4_MOD_WUA1, IF_REAL, "Width dependence of ua1"), -IOP( "wub", BSIM4_MOD_WUB, IF_REAL, "Width dependence of ub"), -IOP( "wub1", BSIM4_MOD_WUB1, IF_REAL, "Width dependence of ub1"), -IOP( "wuc", BSIM4_MOD_WUC, IF_REAL, "Width dependence of uc"), -IOP( "wuc1", BSIM4_MOD_WUC1, IF_REAL, "Width dependence of uc1"), -IOP( "wud", BSIM4_MOD_WUD, IF_REAL, "Width dependence of ud"), -IOP( "wud1", BSIM4_MOD_WUD1, IF_REAL, "Width dependence of ud1"), -IOP( "wup", BSIM4_MOD_WUP, IF_REAL, "Width dependence of up"), -IOP( "wlp", BSIM4_MOD_WLP, IF_REAL, "Width dependence of lp"), -IOP( "wu0", BSIM4_MOD_WU0, IF_REAL, "Width dependence of u0"), -IOP( "wute", BSIM4_MOD_WUTE, IF_REAL, "Width dependence of ute"), -IOP( "wucste", BSIM4_MOD_WUCSTE, IF_REAL, "Width dependence of ucste"), -IOP( "wvoff", BSIM4_MOD_WVOFF, IF_REAL, "Width dependence of voff"), -IOP( "wminv", BSIM4_MOD_WMINV, IF_REAL, "Width dependence of minv"), -IOP( "wminvcv", BSIM4_MOD_WMINVCV, IF_REAL, "Width dependence of minvcv"), -IOP( "wdelta", BSIM4_MOD_WDELTA, IF_REAL, "Width dependence of delta"), -IOP( "wrdsw", BSIM4_MOD_WRDSW, IF_REAL, "Width dependence of rdsw "), -IOP( "wrsw", BSIM4_MOD_WRSW, IF_REAL, "Width dependence of rsw"), -IOP( "wrdw", BSIM4_MOD_WRDW, IF_REAL, "Width dependence of rdw"), - -IOP( "wprwg", BSIM4_MOD_WPRWG, IF_REAL, "Width dependence of prwg "), -IOP( "wprwb", BSIM4_MOD_WPRWB, IF_REAL, "Width dependence of prwb "), - -IOP( "wprt", BSIM4_MOD_WPRT, IF_REAL, "Width dependence of prt"), -IOP( "weta0", BSIM4_MOD_WETA0, IF_REAL, "Width dependence of eta0"), -IOP( "wetab", BSIM4_MOD_WETAB, IF_REAL, "Width dependence of etab"), -IOP( "wpclm", BSIM4_MOD_WPCLM, IF_REAL, "Width dependence of pclm"), -IOP( "wpdiblc1", BSIM4_MOD_WPDIBL1, IF_REAL, "Width dependence of pdiblc1"), -IOP( "wpdiblc2", BSIM4_MOD_WPDIBL2, IF_REAL, "Width dependence of pdiblc2"), -IOP( "wpdiblcb", BSIM4_MOD_WPDIBLB, IF_REAL, "Width dependence of pdiblcb"), -IOP( "wfprout", BSIM4_MOD_WFPROUT, IF_REAL, "Width dependence of pdiblcb"), -IOP( "wpdits", BSIM4_MOD_WPDITS, IF_REAL, "Width dependence of pdits"), -IOP( "wpditsd", BSIM4_MOD_WPDITSD, IF_REAL, "Width dependence of pditsd"), -IOP( "wpscbe1", BSIM4_MOD_WPSCBE1, IF_REAL, "Width dependence of pscbe1"), -IOP( "wpscbe2", BSIM4_MOD_WPSCBE2, IF_REAL, "Width dependence of pscbe2"), -IOP( "wpvag", BSIM4_MOD_WPVAG, IF_REAL, "Width dependence of pvag"), -IOP( "wwr", BSIM4_MOD_WWR, IF_REAL, "Width dependence of wr"), -IOP( "wdwg", BSIM4_MOD_WDWG, IF_REAL, "Width dependence of dwg"), -IOP( "wdwb", BSIM4_MOD_WDWB, IF_REAL, "Width dependence of dwb"), -IOP( "wb0", BSIM4_MOD_WB0, IF_REAL, "Width dependence of b0"), -IOP( "wb1", BSIM4_MOD_WB1, IF_REAL, "Width dependence of b1"), -IOP( "wcgsl", BSIM4_MOD_WCGSL, IF_REAL, "Width dependence of cgsl"), -IOP( "wcgdl", BSIM4_MOD_WCGDL, IF_REAL, "Width dependence of cgdl"), -IOP( "wckappas", BSIM4_MOD_WCKAPPAS, IF_REAL, "Width dependence of ckappas"), -IOP( "wckappad", BSIM4_MOD_WCKAPPAD, IF_REAL, "Width dependence of ckappad"), -IOP( "wcf", BSIM4_MOD_WCF, IF_REAL, "Width dependence of cf"), -IOP( "wclc", BSIM4_MOD_WCLC, IF_REAL, "Width dependence of clc"), -IOP( "wcle", BSIM4_MOD_WCLE, IF_REAL, "Width dependence of cle"), -IOP( "walpha0", BSIM4_MOD_WALPHA0, IF_REAL, "Width dependence of alpha0"), -IOP( "walpha1", BSIM4_MOD_WALPHA1, IF_REAL, "Width dependence of alpha1"), -IOP( "wbeta0", BSIM4_MOD_WBETA0, IF_REAL, "Width dependence of beta0"), - -IOP( "wagidl", BSIM4_MOD_WAGIDL, IF_REAL, "Width dependence of agidl"), -IOP( "wbgidl", BSIM4_MOD_WBGIDL, IF_REAL, "Width dependence of bgidl"), -IOP( "wcgidl", BSIM4_MOD_WCGIDL, IF_REAL, "Width dependence of cgidl"), -IOP( "wrgidl", BSIM4_MOD_WRGIDL, IF_REAL, "Width dependence of rgidl"), /* v4.7 New GIDL/GISL */ -IOP( "wkgidl", BSIM4_MOD_WKGIDL, IF_REAL, "Width dependence of kgidl"), /* v4.7 New GIDL/GISL */ -IOP( "wfgidl", BSIM4_MOD_WFGIDL, IF_REAL, "Width dependence of fgidl"), /* v4.7 New GIDL/GISL */ -IOP( "wegidl", BSIM4_MOD_WEGIDL, IF_REAL, "Width dependence of egidl"), -IOP( "wagisl", BSIM4_MOD_WAGISL, IF_REAL, "Width dependence of agisl"), -IOP( "wbgisl", BSIM4_MOD_WBGISL, IF_REAL, "Width dependence of bgisl"), -IOP( "wcgisl", BSIM4_MOD_WCGISL, IF_REAL, "Width dependence of cgisl"), -IOP( "wrgisl", BSIM4_MOD_WRGISL, IF_REAL, "Width dependence of rgisl"), /* v4.7 New GIDL/GISL */ -IOP( "wkgisl", BSIM4_MOD_WKGISL, IF_REAL, "Width dependence of kgisl"), /* v4.7 New GIDL/GISL */ -IOP( "wfgisl", BSIM4_MOD_WFGISL, IF_REAL, "Width dependence of fgisl"), /* v4.7 New GIDL/GISL */ -IOP( "wegisl", BSIM4_MOD_WEGISL, IF_REAL, "Width dependence of egisl"), -IOP( "waigc", BSIM4_MOD_WAIGC, IF_REAL, "Width dependence of aigc"), -IOP( "wbigc", BSIM4_MOD_WBIGC, IF_REAL, "Width dependence of bigc"), -IOP( "wcigc", BSIM4_MOD_WCIGC, IF_REAL, "Width dependence of cigc"), -IOP( "waigsd", BSIM4_MOD_WAIGSD, IF_REAL, "Width dependence of aigsd"), -IOP( "wbigsd", BSIM4_MOD_WBIGSD, IF_REAL, "Width dependence of bigsd"), -IOP( "wcigsd", BSIM4_MOD_WCIGSD, IF_REAL, "Width dependence of cigsd"), -IOP( "waigs", BSIM4_MOD_WAIGS, IF_REAL, "Width dependence of aigs"), -IOP( "wbigs", BSIM4_MOD_WBIGS, IF_REAL, "Width dependence of bigs"), -IOP( "wcigs", BSIM4_MOD_WCIGS, IF_REAL, "Width dependence of cigs"), -IOP( "waigd", BSIM4_MOD_WAIGD, IF_REAL, "Width dependence of aigd"), -IOP( "wbigd", BSIM4_MOD_WBIGD, IF_REAL, "Width dependence of bigd"), -IOP( "wcigd", BSIM4_MOD_WCIGD, IF_REAL, "Width dependence of cigd"), -IOP( "waigbacc", BSIM4_MOD_WAIGBACC, IF_REAL, "Width dependence of aigbacc"), -IOP( "wbigbacc", BSIM4_MOD_WBIGBACC, IF_REAL, "Width dependence of bigbacc"), -IOP( "wcigbacc", BSIM4_MOD_WCIGBACC, IF_REAL, "Width dependence of cigbacc"), -IOP( "waigbinv", BSIM4_MOD_WAIGBINV, IF_REAL, "Width dependence of aigbinv"), -IOP( "wbigbinv", BSIM4_MOD_WBIGBINV, IF_REAL, "Width dependence of bigbinv"), -IOP( "wcigbinv", BSIM4_MOD_WCIGBINV, IF_REAL, "Width dependence of cigbinv"), -IOP( "wnigc", BSIM4_MOD_WNIGC, IF_REAL, "Width dependence of nigc"), -IOP( "wnigbinv", BSIM4_MOD_WNIGBINV, IF_REAL, "Width dependence of nigbinv"), -IOP( "wnigbacc", BSIM4_MOD_WNIGBACC, IF_REAL, "Width dependence of nigbacc"), -IOP( "wntox", BSIM4_MOD_WNTOX, IF_REAL, "Width dependence of ntox"), -IOP( "weigbinv", BSIM4_MOD_WEIGBINV, IF_REAL, "Width dependence for eigbinv"), -IOP( "wpigcd", BSIM4_MOD_WPIGCD, IF_REAL, "Width dependence for pigcd"), -IOP( "wpoxedge", BSIM4_MOD_WPOXEDGE, IF_REAL, "Width dependence for poxedge"), -IOP( "wvfbcv", BSIM4_MOD_WVFBCV, IF_REAL, "Width dependence of vfbcv"), -IOP( "wvfb", BSIM4_MOD_WVFB, IF_REAL, "Width dependence of vfb"), -IOP( "wacde", BSIM4_MOD_WACDE, IF_REAL, "Width dependence of acde"), -IOP( "wmoin", BSIM4_MOD_WMOIN, IF_REAL, "Width dependence of moin"), -IOP( "wnoff", BSIM4_MOD_WNOFF, IF_REAL, "Width dependence of noff"), -IOP( "wvoffcv", BSIM4_MOD_WVOFFCV, IF_REAL, "Width dependence of voffcv"), -IOP( "wxrcrg1", BSIM4_MOD_WXRCRG1, IF_REAL, "Width dependence of xrcrg1"), -IOP( "wxrcrg2", BSIM4_MOD_WXRCRG2, IF_REAL, "Width dependence of xrcrg2"), -IOP( "wlambda", BSIM4_MOD_WLAMBDA, IF_REAL, "Width dependence of lambda"), -IOP( "wvtl", BSIM4_MOD_WVTL, IF_REAL, "Width dependence of vtl"), -IOP( "wxn", BSIM4_MOD_WXN, IF_REAL, "Width dependence of xn"), -IOP( "weu", BSIM4_MOD_WEU, IF_REAL, "Width dependence of eu"), -IOP( "wucs", BSIM4_MOD_WUCS, IF_REAL, "Width dependence of ucs"), -IOP( "wvfbsdoff", BSIM4_MOD_WVFBSDOFF, IF_REAL, "Width dependence of vfbsdoff"), -IOP( "wtvfbsdoff", BSIM4_MOD_WTVFBSDOFF, IF_REAL, "Width dependence of tvfbsdoff"), -IOP( "wtvoff", BSIM4_MOD_WTVOFF, IF_REAL, "Width dependence of tvoff"), -IOP( "wtnfactor", BSIM4_MOD_WTNFACTOR, IF_REAL, "Width dependence of tnfactor"), /* v4.7 Tanvir*/ -IOP( "wteta0", BSIM4_MOD_WTETA0, IF_REAL, "Width dependence of teta0"), /* v4.7 Tanvir*/ -IOP( "wtvoffcv", BSIM4_MOD_WTVOFFCV, IF_REAL, "Width dependence of tvoffcv"), /* v4.7 Tanvir*/ - -IOP( "pcdsc", BSIM4_MOD_PCDSC, IF_REAL, "Cross-term dependence of cdsc"), -IOP( "pcdscb", BSIM4_MOD_PCDSCB, IF_REAL, "Cross-term dependence of cdscb"), -IOP( "pcdscd", BSIM4_MOD_PCDSCD, IF_REAL, "Cross-term dependence of cdscd"), -IOP( "pcit", BSIM4_MOD_PCIT, IF_REAL, "Cross-term dependence of cit"), -IOP( "pnfactor", BSIM4_MOD_PNFACTOR, IF_REAL, "Cross-term dependence of nfactor"), -IOP( "pxj", BSIM4_MOD_PXJ, IF_REAL, "Cross-term dependence of xj"), -IOP( "pvsat", BSIM4_MOD_PVSAT, IF_REAL, "Cross-term dependence of vsat"), -IOP( "pat", BSIM4_MOD_PAT, IF_REAL, "Cross-term dependence of at"), -IOP( "pa0", BSIM4_MOD_PA0, IF_REAL, "Cross-term dependence of a0"), -IOP( "pags", BSIM4_MOD_PAGS, IF_REAL, "Cross-term dependence of ags"), -IOP( "pa1", BSIM4_MOD_PA1, IF_REAL, "Cross-term dependence of a1"), -IOP( "pa2", BSIM4_MOD_PA2, IF_REAL, "Cross-term dependence of a2"), -IOP( "pketa", BSIM4_MOD_PKETA, IF_REAL, "Cross-term dependence of keta"), -IOP( "pnsub", BSIM4_MOD_PNSUB, IF_REAL, "Cross-term dependence of nsub"), -IOP( "pndep", BSIM4_MOD_PNDEP, IF_REAL, "Cross-term dependence of ndep"), -IOP( "pnsd", BSIM4_MOD_PNSD, IF_REAL, "Cross-term dependence of nsd"), -IOP( "pphin", BSIM4_MOD_PPHIN, IF_REAL, "Cross-term dependence of phin"), -IOP( "pngate", BSIM4_MOD_PNGATE, IF_REAL, "Cross-term dependence of ngate"), -IOP( "pgamma1", BSIM4_MOD_PGAMMA1, IF_REAL, "Cross-term dependence of gamma1"), -IOP( "pgamma2", BSIM4_MOD_PGAMMA2, IF_REAL, "Cross-term dependence of gamma2"), -IOP( "pvbx", BSIM4_MOD_PVBX, IF_REAL, "Cross-term dependence of vbx"), -IOP( "pvbm", BSIM4_MOD_PVBM, IF_REAL, "Cross-term dependence of vbm"), -IOP( "pxt", BSIM4_MOD_PXT, IF_REAL, "Cross-term dependence of xt"), -IOP( "pk1", BSIM4_MOD_PK1, IF_REAL, "Cross-term dependence of k1"), -IOP( "pkt1", BSIM4_MOD_PKT1, IF_REAL, "Cross-term dependence of kt1"), -IOP( "pkt1l", BSIM4_MOD_PKT1L, IF_REAL, "Cross-term dependence of kt1l"), -IOP( "pkt2", BSIM4_MOD_PKT2, IF_REAL, "Cross-term dependence of kt2"), -IOP( "pk2", BSIM4_MOD_PK2, IF_REAL, "Cross-term dependence of k2"), -IOP( "pk3", BSIM4_MOD_PK3, IF_REAL, "Cross-term dependence of k3"), -IOP( "pk3b", BSIM4_MOD_PK3B, IF_REAL, "Cross-term dependence of k3b"), -IOP( "pw0", BSIM4_MOD_PW0, IF_REAL, "Cross-term dependence of w0"), -IOP( "pdvtp0", BSIM4_MOD_PDVTP0, IF_REAL, "Cross-term dependence of dvtp0"), -IOP( "pdvtp1", BSIM4_MOD_PDVTP1, IF_REAL, "Cross-term dependence of dvtp1"), -IOP( "pdvtp2", BSIM4_MOD_PDVTP2, IF_REAL, "Cross-term dependence of dvtp2"), -IOP( "pdvtp3", BSIM4_MOD_PDVTP3, IF_REAL, "Cross-term dependence of dvtp3"), -IOP( "pdvtp4", BSIM4_MOD_PDVTP4, IF_REAL, "Cross-term dependence of dvtp4"), -IOP( "pdvtp5", BSIM4_MOD_PDVTP5, IF_REAL, "Cross-term dependence of dvtp5"), -IOP( "plpe0", BSIM4_MOD_PLPE0, IF_REAL, "Cross-term dependence of lpe0"), -IOP( "plpeb", BSIM4_MOD_PLPEB, IF_REAL, "Cross-term dependence of lpeb"), -IOP( "pdvt0", BSIM4_MOD_PDVT0, IF_REAL, "Cross-term dependence of dvt0"), -IOP( "pdvt1", BSIM4_MOD_PDVT1, IF_REAL, "Cross-term dependence of dvt1"), -IOP( "pdvt2", BSIM4_MOD_PDVT2, IF_REAL, "Cross-term dependence of dvt2"), -IOP( "pdvt0w", BSIM4_MOD_PDVT0W, IF_REAL, "Cross-term dependence of dvt0w"), -IOP( "pdvt1w", BSIM4_MOD_PDVT1W, IF_REAL, "Cross-term dependence of dvt1w"), -IOP( "pdvt2w", BSIM4_MOD_PDVT2W, IF_REAL, "Cross-term dependence of dvt2w"), -IOP( "pdrout", BSIM4_MOD_PDROUT, IF_REAL, "Cross-term dependence of drout"), -IOP( "pdsub", BSIM4_MOD_PDSUB, IF_REAL, "Cross-term dependence of dsub"), -IOP( "pvth0", BSIM4_MOD_PVTH0, IF_REAL,"Cross-term dependence of vth0"), -IOPR("pvtho", BSIM4_MOD_PVTH0, IF_REAL,"Cross-term dependence of vtho"), -IOP( "pua", BSIM4_MOD_PUA, IF_REAL, "Cross-term dependence of ua"), -IOP( "pua1", BSIM4_MOD_PUA1, IF_REAL, "Cross-term dependence of ua1"), -IOP( "pub", BSIM4_MOD_PUB, IF_REAL, "Cross-term dependence of ub"), -IOP( "pub1", BSIM4_MOD_PUB1, IF_REAL, "Cross-term dependence of ub1"), -IOP( "puc", BSIM4_MOD_PUC, IF_REAL, "Cross-term dependence of uc"), -IOP( "puc1", BSIM4_MOD_PUC1, IF_REAL, "Cross-term dependence of uc1"), -IOP( "pud", BSIM4_MOD_PUD, IF_REAL, "Cross-term dependence of ud"), -IOP( "pud1", BSIM4_MOD_PUD1, IF_REAL, "Cross-term dependence of ud1"), -IOP( "pup", BSIM4_MOD_PUP, IF_REAL, "Cross-term dependence of up"), -IOP( "plp", BSIM4_MOD_PLP, IF_REAL, "Cross-term dependence of lp"), -IOP( "pu0", BSIM4_MOD_PU0, IF_REAL, "Cross-term dependence of u0"), -IOP( "pute", BSIM4_MOD_PUTE, IF_REAL, "Cross-term dependence of ute"), -IOP( "pucste", BSIM4_MOD_PUCSTE, IF_REAL, "Cross-term dependence of ucste"), -IOP( "pvoff", BSIM4_MOD_PVOFF, IF_REAL, "Cross-term dependence of voff"), -IOP( "pminv", BSIM4_MOD_PMINV, IF_REAL, "Cross-term dependence of minv"), -IOP( "pminvcv", BSIM4_MOD_PMINVCV, IF_REAL, "Cross-term dependence of minvcv"), -IOP( "pdelta", BSIM4_MOD_PDELTA, IF_REAL, "Cross-term dependence of delta"), -IOP( "prdsw", BSIM4_MOD_PRDSW, IF_REAL, "Cross-term dependence of rdsw "), -IOP( "prsw", BSIM4_MOD_PRSW, IF_REAL, "Cross-term dependence of rsw"), -IOP( "prdw", BSIM4_MOD_PRDW, IF_REAL, "Cross-term dependence of rdw"), - -IOP( "pprwg", BSIM4_MOD_PPRWG, IF_REAL, "Cross-term dependence of prwg "), -IOP( "pprwb", BSIM4_MOD_PPRWB, IF_REAL, "Cross-term dependence of prwb "), - -IOP( "pprt", BSIM4_MOD_PPRT, IF_REAL, "Cross-term dependence of prt "), -IOP( "peta0", BSIM4_MOD_PETA0, IF_REAL, "Cross-term dependence of eta0"), -IOP( "petab", BSIM4_MOD_PETAB, IF_REAL, "Cross-term dependence of etab"), -IOP( "ppclm", BSIM4_MOD_PPCLM, IF_REAL, "Cross-term dependence of pclm"), -IOP( "ppdiblc1", BSIM4_MOD_PPDIBL1, IF_REAL, "Cross-term dependence of pdiblc1"), -IOP( "ppdiblc2", BSIM4_MOD_PPDIBL2, IF_REAL, "Cross-term dependence of pdiblc2"), -IOP( "ppdiblcb", BSIM4_MOD_PPDIBLB, IF_REAL, "Cross-term dependence of pdiblcb"), -IOP( "pfprout", BSIM4_MOD_PFPROUT, IF_REAL, "Cross-term dependence of pdiblcb"), -IOP( "ppdits", BSIM4_MOD_PPDITS, IF_REAL, "Cross-term dependence of pdits"), -IOP( "ppditsd", BSIM4_MOD_PPDITSD, IF_REAL, "Cross-term dependence of pditsd"), -IOP( "ppscbe1", BSIM4_MOD_PPSCBE1, IF_REAL, "Cross-term dependence of pscbe1"), -IOP( "ppscbe2", BSIM4_MOD_PPSCBE2, IF_REAL, "Cross-term dependence of pscbe2"), -IOP( "ppvag", BSIM4_MOD_PPVAG, IF_REAL, "Cross-term dependence of pvag"), -IOP( "pwr", BSIM4_MOD_PWR, IF_REAL, "Cross-term dependence of wr"), -IOP( "pdwg", BSIM4_MOD_PDWG, IF_REAL, "Cross-term dependence of dwg"), -IOP( "pdwb", BSIM4_MOD_PDWB, IF_REAL, "Cross-term dependence of dwb"), -IOP( "pb0", BSIM4_MOD_PB0, IF_REAL, "Cross-term dependence of b0"), -IOP( "pb1", BSIM4_MOD_PB1, IF_REAL, "Cross-term dependence of b1"), -IOP( "pcgsl", BSIM4_MOD_PCGSL, IF_REAL, "Cross-term dependence of cgsl"), -IOP( "pcgdl", BSIM4_MOD_PCGDL, IF_REAL, "Cross-term dependence of cgdl"), -IOP( "pckappas", BSIM4_MOD_PCKAPPAS, IF_REAL, "Cross-term dependence of ckappas"), -IOP( "pckappad", BSIM4_MOD_PCKAPPAD, IF_REAL, "Cross-term dependence of ckappad"), -IOP( "pcf", BSIM4_MOD_PCF, IF_REAL, "Cross-term dependence of cf"), -IOP( "pclc", BSIM4_MOD_PCLC, IF_REAL, "Cross-term dependence of clc"), -IOP( "pcle", BSIM4_MOD_PCLE, IF_REAL, "Cross-term dependence of cle"), -IOP( "palpha0", BSIM4_MOD_PALPHA0, IF_REAL, "Cross-term dependence of alpha0"), -IOP( "palpha1", BSIM4_MOD_PALPHA1, IF_REAL, "Cross-term dependence of alpha1"), -IOP( "pbeta0", BSIM4_MOD_PBETA0, IF_REAL, "Cross-term dependence of beta0"), - -IOP( "pagidl", BSIM4_MOD_PAGIDL, IF_REAL, "Cross-term dependence of agidl"), -IOP( "pbgidl", BSIM4_MOD_PBGIDL, IF_REAL, "Cross-term dependence of bgidl"), -IOP( "pcgidl", BSIM4_MOD_PCGIDL, IF_REAL, "Cross-term dependence of cgidl"), -IOP( "prgidl", BSIM4_MOD_PRGIDL, IF_REAL, "Cross-term dependence of rgidl"), /* v4.7 New GIDL/GISL */ -IOP( "pkgidl", BSIM4_MOD_PKGIDL, IF_REAL, "Cross-term dependence of kgidl"), /* v4.7 New GIDL/GISL */ -IOP( "pfgidl", BSIM4_MOD_PFGIDL, IF_REAL, "Cross-term dependence of fgidl"), /* v4.7 New GIDL/GISL */ -IOP( "pegidl", BSIM4_MOD_PEGIDL, IF_REAL, "Cross-term dependence of egidl"), -IOP( "pagisl", BSIM4_MOD_PAGISL, IF_REAL, "Cross-term dependence of agisl"), -IOP( "pbgisl", BSIM4_MOD_PBGISL, IF_REAL, "Cross-term dependence of bgisl"), -IOP( "pcgisl", BSIM4_MOD_PCGISL, IF_REAL, "Cross-term dependence of cgisl"), -IOP( "pegisl", BSIM4_MOD_PEGISL, IF_REAL, "Cross-term dependence of egisl"), -IOP( "prgisl", BSIM4_MOD_PRGISL, IF_REAL, "Cross-term dependence of rgisl"), /* v4.7 New GIDL/GISL */ -IOP( "pkgisl", BSIM4_MOD_PKGISL, IF_REAL, "Cross-term dependence of kgisl"), /* v4.7 New GIDL/GISL */ -IOP( "pfgisl", BSIM4_MOD_PFGISL, IF_REAL, "Cross-term dependence of fgisl"), /* v4.7 New GIDL/GISL */ -IOP( "paigc", BSIM4_MOD_PAIGC, IF_REAL, "Cross-term dependence of aigc"), -IOP( "pbigc", BSIM4_MOD_PBIGC, IF_REAL, "Cross-term dependence of bigc"), -IOP( "pcigc", BSIM4_MOD_PCIGC, IF_REAL, "Cross-term dependence of cigc"), -IOP( "paigsd", BSIM4_MOD_PAIGSD, IF_REAL, "Cross-term dependence of aigsd"), -IOP( "pbigsd", BSIM4_MOD_PBIGSD, IF_REAL, "Cross-term dependence of bigsd"), -IOP( "pcigsd", BSIM4_MOD_PCIGSD, IF_REAL, "Cross-term dependence of cigsd"), -IOP( "paigs", BSIM4_MOD_PAIGS, IF_REAL, "Cross-term dependence of aigs"), -IOP( "pbigs", BSIM4_MOD_PBIGS, IF_REAL, "Cross-term dependence of bigs"), -IOP( "pcigs", BSIM4_MOD_PCIGS, IF_REAL, "Cross-term dependence of cigs"), -IOP( "paigd", BSIM4_MOD_PAIGD, IF_REAL, "Cross-term dependence of aigd"), -IOP( "pbigd", BSIM4_MOD_PBIGD, IF_REAL, "Cross-term dependence of bigd"), -IOP( "pcigd", BSIM4_MOD_PCIGD, IF_REAL, "Cross-term dependence of cigd"), -IOP( "paigbacc", BSIM4_MOD_PAIGBACC, IF_REAL, "Cross-term dependence of aigbacc"), -IOP( "pbigbacc", BSIM4_MOD_PBIGBACC, IF_REAL, "Cross-term dependence of bigbacc"), -IOP( "pcigbacc", BSIM4_MOD_PCIGBACC, IF_REAL, "Cross-term dependence of cigbacc"), -IOP( "paigbinv", BSIM4_MOD_PAIGBINV, IF_REAL, "Cross-term dependence of aigbinv"), -IOP( "pbigbinv", BSIM4_MOD_PBIGBINV, IF_REAL, "Cross-term dependence of bigbinv"), -IOP( "pcigbinv", BSIM4_MOD_PCIGBINV, IF_REAL, "Cross-term dependence of cigbinv"), -IOP( "pnigc", BSIM4_MOD_PNIGC, IF_REAL, "Cross-term dependence of nigc"), -IOP( "pnigbinv", BSIM4_MOD_PNIGBINV, IF_REAL, "Cross-term dependence of nigbinv"), -IOP( "pnigbacc", BSIM4_MOD_PNIGBACC, IF_REAL, "Cross-term dependence of nigbacc"), -IOP( "pntox", BSIM4_MOD_PNTOX, IF_REAL, "Cross-term dependence of ntox"), -IOP( "peigbinv", BSIM4_MOD_PEIGBINV, IF_REAL, "Cross-term dependence for eigbinv"), -IOP( "ppigcd", BSIM4_MOD_PPIGCD, IF_REAL, "Cross-term dependence for pigcd"), -IOP( "ppoxedge", BSIM4_MOD_PPOXEDGE, IF_REAL, "Cross-term dependence for poxedge"), -IOP( "pvfbcv", BSIM4_MOD_PVFBCV, IF_REAL, "Cross-term dependence of vfbcv"), -IOP( "pvfb", BSIM4_MOD_PVFB, IF_REAL, "Cross-term dependence of vfb"), -IOP( "pacde", BSIM4_MOD_PACDE, IF_REAL, "Cross-term dependence of acde"), -IOP( "pmoin", BSIM4_MOD_PMOIN, IF_REAL, "Cross-term dependence of moin"), -IOP( "pnoff", BSIM4_MOD_PNOFF, IF_REAL, "Cross-term dependence of noff"), -IOP( "pvoffcv", BSIM4_MOD_PVOFFCV, IF_REAL, "Cross-term dependence of voffcv"), -IOP( "pxrcrg1", BSIM4_MOD_PXRCRG1, IF_REAL, "Cross-term dependence of xrcrg1"), -IOP( "pxrcrg2", BSIM4_MOD_PXRCRG2, IF_REAL, "Cross-term dependence of xrcrg2"), -IOP( "plambda", BSIM4_MOD_PLAMBDA, IF_REAL, "Cross-term dependence of lambda"), -IOP( "pvtl", BSIM4_MOD_PVTL, IF_REAL, "Cross-term dependence of vtl"), -IOP( "pxn", BSIM4_MOD_PXN, IF_REAL, "Cross-term dependence of xn"), -IOP( "peu", BSIM4_MOD_PEU, IF_REAL, "Cross-term dependence of eu"), -IOP( "pucs", BSIM4_MOD_PUCS, IF_REAL, "Cross-term dependence of ucs"), -IOP( "pvfbsdoff", BSIM4_MOD_PVFBSDOFF, IF_REAL, "Cross-term dependence of vfbsdoff"), -IOP( "ptvfbsdoff", BSIM4_MOD_PTVFBSDOFF, IF_REAL, "Cross-term dependence of tvfbsdoff"), -IOP( "ptvoff", BSIM4_MOD_PTVOFF, IF_REAL, "Cross-term dependence of tvoff"), -IOP( "ptnfactor", BSIM4_MOD_PTNFACTOR, IF_REAL, "Cross-term dependence of tnfactor"), /* v4.7 Tanvir*/ -IOP( "pteta0", BSIM4_MOD_PTETA0, IF_REAL, "Cross-term dependence of teta0"), /* v4.7 Tanvir*/ -IOP( "ptvoffcv", BSIM4_MOD_PTVOFFCV, IF_REAL, "Cross-term dependence of tvoffcv"), /* v4.7 Tanvir*/ - -/* stress effect*/ -IOP( "saref", BSIM4_MOD_SAREF, IF_REAL, "Reference distance between OD edge to poly of one side"), -IOP( "sbref", BSIM4_MOD_SBREF, IF_REAL, "Reference distance between OD edge to poly of the other side"), -IOP( "wlod", BSIM4_MOD_WLOD, IF_REAL, "Width parameter for stress effect"), -IOP( "ku0", BSIM4_MOD_KU0, IF_REAL, "Mobility degradation/enhancement coefficient for LOD"), -IOP( "kvsat", BSIM4_MOD_KVSAT, IF_REAL, "Saturation velocity degradation/enhancement parameter for LOD"), -IOP( "kvth0", BSIM4_MOD_KVTH0, IF_REAL, "Threshold degradation/enhancement parameter for LOD"), -IOP( "tku0", BSIM4_MOD_TKU0, IF_REAL, "Temperature coefficient of KU0"), -IOP( "llodku0", BSIM4_MOD_LLODKU0, IF_REAL, "Length parameter for u0 LOD effect"), -IOP( "wlodku0", BSIM4_MOD_WLODKU0, IF_REAL, "Width parameter for u0 LOD effect"), -IOP( "llodvth", BSIM4_MOD_LLODVTH, IF_REAL, "Length parameter for vth LOD effect"), -IOP( "wlodvth", BSIM4_MOD_WLODVTH, IF_REAL, "Width parameter for vth LOD effect"), -IOP( "lku0", BSIM4_MOD_LKU0, IF_REAL, "Length dependence of ku0"), -IOP( "wku0", BSIM4_MOD_WKU0, IF_REAL, "Width dependence of ku0"), -IOP( "pku0", BSIM4_MOD_PKU0, IF_REAL, "Cross-term dependence of ku0"), -IOP( "lkvth0", BSIM4_MOD_LKVTH0, IF_REAL, "Length dependence of kvth0"), -IOP( "wkvth0", BSIM4_MOD_WKVTH0, IF_REAL, "Width dependence of kvth0"), -IOP( "pkvth0", BSIM4_MOD_PKVTH0, IF_REAL, "Cross-term dependence of kvth0"), -IOP( "stk2", BSIM4_MOD_STK2, IF_REAL, "K2 shift factor related to stress effect on vth"), -IOP( "lodk2", BSIM4_MOD_LODK2, IF_REAL, "K2 shift modification factor for stress effect"), -IOP( "steta0", BSIM4_MOD_STETA0, IF_REAL, "eta0 shift factor related to stress effect on vth"), -IOP( "lodeta0", BSIM4_MOD_LODETA0, IF_REAL, "eta0 shift modification factor for stress effect"), -/* Well Proximity Effect */ -IOP( "web", BSIM4_MOD_WEB, IF_REAL, "Coefficient for SCB"), -IOP( "wec", BSIM4_MOD_WEC, IF_REAL, "Coefficient for SCC"), -IOP( "kvth0we", BSIM4_MOD_KVTH0WE, IF_REAL, "Threshold shift factor for well proximity effect"), -IOP( "k2we", BSIM4_MOD_K2WE, IF_REAL, " K2 shift factor for well proximity effect "), -IOP( "ku0we", BSIM4_MOD_KU0WE, IF_REAL, " Mobility degradation factor for well proximity effect "), -IOP( "scref", BSIM4_MOD_SCREF, IF_REAL, " Reference distance to calculate SCA, SCB and SCC"), -IOP( "wpemod", BSIM4_MOD_WPEMOD, IF_REAL, " Flag for WPE model (WPEMOD=1 to activate this model) "), -IOP( "lkvth0we", BSIM4_MOD_LKVTH0WE, IF_REAL, "Length dependence of kvth0we"), -IOP( "lk2we", BSIM4_MOD_LK2WE, IF_REAL, " Length dependence of k2we "), -IOP( "lku0we", BSIM4_MOD_LKU0WE, IF_REAL, " Length dependence of ku0we "), -IOP( "wkvth0we", BSIM4_MOD_WKVTH0WE, IF_REAL, "Width dependence of kvth0we"), -IOP( "wk2we", BSIM4_MOD_WK2WE, IF_REAL, " Width dependence of k2we "), -IOP( "wku0we", BSIM4_MOD_WKU0WE, IF_REAL, " Width dependence of ku0we "), -IOP( "pkvth0we", BSIM4_MOD_PKVTH0WE, IF_REAL, "Cross-term dependence of kvth0we"), -IOP( "pk2we", BSIM4_MOD_PK2WE, IF_REAL, " Cross-term dependence of k2we "), -IOP( "pku0we", BSIM4_MOD_PKU0WE, IF_REAL, " Cross-term dependence of ku0we "), - -IOP( "noia", BSIM4_MOD_NOIA, IF_REAL, "Flicker noise parameter"), -IOP( "noib", BSIM4_MOD_NOIB, IF_REAL, "Flicker noise parameter"), -IOP( "noic", BSIM4_MOD_NOIC, IF_REAL, "Flicker noise parameter"), -IOP( "tnoia", BSIM4_MOD_TNOIA, IF_REAL, "Thermal noise parameter"), -IOP( "tnoib", BSIM4_MOD_TNOIB, IF_REAL, "Thermal noise parameter"), -IOP( "tnoic", BSIM4_MOD_TNOIC, IF_REAL, "Thermal noise parameter"), -IOP( "rnoia", BSIM4_MOD_RNOIA, IF_REAL, "Thermal noise coefficient"), -IOP( "rnoib", BSIM4_MOD_RNOIB, IF_REAL, "Thermal noise coefficient"), -IOP( "rnoic", BSIM4_MOD_RNOIC, IF_REAL, "Thermal noise coefficient"), -IOP( "ntnoi", BSIM4_MOD_NTNOI, IF_REAL, "Thermal noise parameter"), -IOP( "em", BSIM4_MOD_EM, IF_REAL, "Flicker noise parameter"), -IOP( "ef", BSIM4_MOD_EF, IF_REAL, "Flicker noise frequency exponent"), -IOP( "af", BSIM4_MOD_AF, IF_REAL, "Flicker noise exponent"), -IOP( "kf", BSIM4_MOD_KF, IF_REAL, "Flicker noise coefficient"), - -IOP("vgs_max", BSIM4_MOD_VGS_MAX, IF_REAL, "maximum voltage G-S branch"), -IOP("vgd_max", BSIM4_MOD_VGD_MAX, IF_REAL, "maximum voltage G-D branch"), -IOP("vgb_max", BSIM4_MOD_VGB_MAX, IF_REAL, "maximum voltage G-B branch"), -IOP("vds_max", BSIM4_MOD_VDS_MAX, IF_REAL, "maximum voltage D-S branch"), -IOP("vbs_max", BSIM4_MOD_VBS_MAX, IF_REAL, "maximum voltage B-S branch"), -IOP("vbd_max", BSIM4_MOD_VBD_MAX, IF_REAL, "maximum voltage B-D branch"), -IOP("vgsr_max", BSIM4_MOD_VGSR_MAX, IF_REAL, "maximum voltage G-S branch"), -IOP("vgdr_max", BSIM4_MOD_VGDR_MAX, IF_REAL, "maximum voltage G-D branch"), -IOP("vgbr_max", BSIM4_MOD_VGBR_MAX, IF_REAL, "maximum voltage G-B branch"), -IOP("vbsr_max", BSIM4_MOD_VBSR_MAX, IF_REAL, "maximum voltage B-S branch"), -IOP("vbdr_max", BSIM4_MOD_VBDR_MAX, IF_REAL, "maximum voltage B-D branch"), - -IP( "nmos", BSIM4_MOD_NMOS, IF_FLAG, "Flag to indicate NMOS"), -IP( "pmos", BSIM4_MOD_PMOS, IF_FLAG, "Flag to indicate PMOS"), -}; - -char *BSIM4names[] = { - "Drain", - "Gate", - "Source", - "Bulk", - "Charge" -}; - -int BSIM4nSize = NUMELEMS(BSIM4names); -int BSIM4pTSize = NUMELEMS(BSIM4pTable); -int BSIM4mPTSize = NUMELEMS(BSIM4mPTable); -int BSIM4iSize = sizeof(BSIM4instance); -int BSIM4mSize = sizeof(BSIM4model); diff --git a/src/spicelib/devices/bsim4/b4acld.c b/src/spicelib/devices/bsim4/b4acld.c deleted file mode 100644 index 40b59228d..000000000 --- a/src/spicelib/devices/bsim4/b4acld.c +++ /dev/null @@ -1,720 +0,0 @@ -/* ****************************************************************************** - * BSIM4 4.8.1 released by Chetan Kumar Dabhi 2/15/2017 * - * BSIM4 Model Equations * - ****************************************************************************** - - ****************************************************************************** - * Copyright 2017 Regents of the University of California. * - * All rights reserved. * - * * - * Project Director: Prof. Chenming Hu. * - * Authors: Gary W. Ng, Weidong Liu, Xuemei Xi, Mohan Dunga, Wenwei Yang * - * Ali Niknejad, Shivendra Singh Parihar, Chetan Kumar Dabhi * - * Yogesh Singh Chauhan, Sayeef Salahuddin, Chenming Hu * - ****************************************************************************** - - ****************************************************************************** - * CMC In-Code Statement * - * * - * The Developer agrees that the following statement will appear in the * - * model code that has been adopted as a CMC Standard. * - * * - * Software is distributed as is, completely without warranty or service * - * support. The University of California and its employees are not liable * - * for the condition or performance of the software. * - * * - * The University of California owns the copyright and grants users a * - * perpetual, irrevocable, worldwide, non-exclusive, royalty-free license * - * with respect to the software as set forth below. * - * * - * The University of California hereby disclaims all implied warranties. * - * * - * The University of California grants the users the right to modify, * - * copy, and redistribute the software and documentation, both within * - * the user's organization and externally, subject to the following * - * restrictions: * - * * - * 1. The users agree not to charge for the University of California code * - * itself but may charge for additions, extensions, or support. * - * * - * 2. In any product based on the software, the users agree to * - * acknowledge the University of California that developed the * - * software. This acknowledgment shall appear in the product * - * documentation. * - * * - * 3. Redistributions to others of source code and documentation must * - * retain the copyright notice, disclaimer, and list of conditions. * - * * - * 4. Redistributions to others in binary form must reproduce the * - * copyright notice, disclaimer, and list of conditions in the * - * documentation and/or other materials provided with the * - * distribution. * - * * - * Agreed to on ______Feb. 15, 2017______________ * - * * - * By: ____University of California, Berkeley___ * - * ____Chenming Hu__________________________ * - * ____Professor in Graduate School ________ * - * * - ****************************************************************************** */ - -#include "ngspice/ngspice.h" -#include "ngspice/cktdefs.h" -#include "bsim4def.h" -#include "ngspice/sperror.h" -#include "ngspice/suffix.h" - - -int -BSIM4acLoad( -GENmodel *inModel, -CKTcircuit *ckt) -{ -BSIM4model *model = (BSIM4model*)inModel; -BSIM4instance *here; - -double gjbd, gjbs, geltd, gcrg, gcrgg, gcrgd, gcrgs, gcrgb; -double xcbgb, xcbdb, xcbsb, xcbbb; -double xcggbr, xcgdbr, xcgsbr, xcgbbr, xcggbi, xcgdbi, xcgsbi, xcgbbi; -double Cggr, Cgdr, Cgsr, Cgbr, Cggi, Cgdi, Cgsi, Cgbi; -double xcddbr, xcdgbr, xcdsbr, xcdbbr, xcsdbr, xcsgbr, xcssbr, xcsbbr; -double xcddbi, xcdgbi, xcdsbi, xcdbbi, xcsdbi, xcsgbi, xcssbi, xcsbbi; -double xcdbdb, xcsbsb=0.0, xcgmgmb=0.0, xcgmdb=0.0, xcgmsb=0.0, xcdgmb, xcsgmb; -double xcgmbb=0.0, xcbgmb; -double capbd, capbs, omega; -double gstot, gstotd, gstotg, gstots, gstotb, gspr; -double gdtot, gdtotd, gdtotg, gdtots, gdtotb, gdpr; -double gIstotg, gIstotd, gIstots, gIstotb; -double gIdtotg, gIdtotd, gIdtots, gIdtotb; -double gIbtotg, gIbtotd, gIbtots, gIbtotb; -double gIgtotg, gIgtotd, gIgtots, gIgtotb; -double cgso, cgdo, cgbo; -double gbspsp, gbbdp, gbbsp, gbspg, gbspb; -double gbspdp, gbdpdp, gbdpg, gbdpb, gbdpsp; -double T0=0.0, T1, T2, T3; -double Csg, Csd, Css; -double Cdgr, Cddr, Cdsr, Cdbr, Csgr, Csdr, Cssr, Csbr; -double Cdgi, Cddi, Cdsi, Cdbi, Csgi, Csdi, Cssi, Csbi; -double gmr, gmi, gmbsr, gmbsi, gdsr, gdsi; -double FwdSumr, RevSumr, Gmr, Gmbsr; -double FwdSumi, RevSumi, Gmi, Gmbsi; -struct bsim4SizeDependParam *pParam; -double ggidld, ggidlg, ggidlb, ggislg, ggislb, ggisls; - -double m; - - omega = ckt->CKTomega; - for (; model != NULL; model = BSIM4nextModel(model)) - { for (here = BSIM4instances(model); here!= NULL; - here = BSIM4nextInstance(here)) - { - pParam = here->pParam; - capbd = here->BSIM4capbd; - capbs = here->BSIM4capbs; - cgso = here->BSIM4cgso; - cgdo = here->BSIM4cgdo; - cgbo = pParam->BSIM4cgbo; - - Csd = -(here->BSIM4cddb + here->BSIM4cgdb + here->BSIM4cbdb); - Csg = -(here->BSIM4cdgb + here->BSIM4cggb + here->BSIM4cbgb); - Css = -(here->BSIM4cdsb + here->BSIM4cgsb + here->BSIM4cbsb); - - if (here->BSIM4acnqsMod) - { T0 = omega * here->BSIM4taunet; - T1 = T0 * T0; - T2 = 1.0 / (1.0 + T1); - T3 = T0 * T2; - - gmr = here->BSIM4gm * T2; - gmbsr = here->BSIM4gmbs * T2; - gdsr = here->BSIM4gds * T2; - - gmi = -here->BSIM4gm * T3; - gmbsi = -here->BSIM4gmbs * T3; - gdsi = -here->BSIM4gds * T3; - - Cddr = here->BSIM4cddb * T2; - Cdgr = here->BSIM4cdgb * T2; - Cdsr = here->BSIM4cdsb * T2; - Cdbr = -(Cddr + Cdgr + Cdsr); - - /* WDLiu: Cxyi mulitplied by jomega below, and actually to be of conductance */ - Cddi = here->BSIM4cddb * T3 * omega; - Cdgi = here->BSIM4cdgb * T3 * omega; - Cdsi = here->BSIM4cdsb * T3 * omega; - Cdbi = -(Cddi + Cdgi + Cdsi); - - Csdr = Csd * T2; - Csgr = Csg * T2; - Cssr = Css * T2; - Csbr = -(Csdr + Csgr + Cssr); - - Csdi = Csd * T3 * omega; - Csgi = Csg * T3 * omega; - Cssi = Css * T3 * omega; - Csbi = -(Csdi + Csgi + Cssi); - - Cgdr = -(Cddr + Csdr + here->BSIM4cbdb); - Cggr = -(Cdgr + Csgr + here->BSIM4cbgb); - Cgsr = -(Cdsr + Cssr + here->BSIM4cbsb); - Cgbr = -(Cgdr + Cggr + Cgsr); - - Cgdi = -(Cddi + Csdi); - Cggi = -(Cdgi + Csgi); - Cgsi = -(Cdsi + Cssi); - Cgbi = -(Cgdi + Cggi + Cgsi); - } - else /* QS */ - { gmr = here->BSIM4gm; - gmbsr = here->BSIM4gmbs; - gdsr = here->BSIM4gds; - gmi = gmbsi = gdsi = 0.0; - - Cddr = here->BSIM4cddb; - Cdgr = here->BSIM4cdgb; - Cdsr = here->BSIM4cdsb; - Cdbr = -(Cddr + Cdgr + Cdsr); - Cddi = Cdgi = Cdsi = Cdbi = 0.0; - - Csdr = Csd; - Csgr = Csg; - Cssr = Css; - Csbr = -(Csdr + Csgr + Cssr); - Csdi = Csgi = Cssi = Csbi = 0.0; - - Cgdr = here->BSIM4cgdb; - Cggr = here->BSIM4cggb; - Cgsr = here->BSIM4cgsb; - Cgbr = -(Cgdr + Cggr + Cgsr); - Cgdi = Cggi = Cgsi = Cgbi = 0.0; - } - - - if (here->BSIM4mode >= 0) - { Gmr = gmr; - Gmbsr = gmbsr; - FwdSumr = Gmr + Gmbsr; - RevSumr = 0.0; - Gmi = gmi; - Gmbsi = gmbsi; - FwdSumi = Gmi + Gmbsi; - RevSumi = 0.0; - - gbbdp = -(here->BSIM4gbds); - gbbsp = here->BSIM4gbds + here->BSIM4gbgs + here->BSIM4gbbs; - gbdpg = here->BSIM4gbgs; - gbdpdp = here->BSIM4gbds; - gbdpb = here->BSIM4gbbs; - gbdpsp = -(gbdpg + gbdpdp + gbdpb); - - gbspdp = 0.0; - gbspg = 0.0; - gbspb = 0.0; - gbspsp = 0.0; - - if (model->BSIM4igcMod) - { gIstotg = here->BSIM4gIgsg + here->BSIM4gIgcsg; - gIstotd = here->BSIM4gIgcsd; - gIstots = here->BSIM4gIgss + here->BSIM4gIgcss; - gIstotb = here->BSIM4gIgcsb; - - gIdtotg = here->BSIM4gIgdg + here->BSIM4gIgcdg; - gIdtotd = here->BSIM4gIgdd + here->BSIM4gIgcdd; - gIdtots = here->BSIM4gIgcds; - gIdtotb = here->BSIM4gIgcdb; - } - else - { gIstotg = gIstotd = gIstots = gIstotb = 0.0; - gIdtotg = gIdtotd = gIdtots = gIdtotb = 0.0; - } - - if (model->BSIM4igbMod) - { gIbtotg = here->BSIM4gIgbg; - gIbtotd = here->BSIM4gIgbd; - gIbtots = here->BSIM4gIgbs; - gIbtotb = here->BSIM4gIgbb; - } - else - gIbtotg = gIbtotd = gIbtots = gIbtotb = 0.0; - - if ((model->BSIM4igcMod != 0) || (model->BSIM4igbMod != 0)) - { gIgtotg = gIstotg + gIdtotg + gIbtotg; - gIgtotd = gIstotd + gIdtotd + gIbtotd ; - gIgtots = gIstots + gIdtots + gIbtots; - gIgtotb = gIstotb + gIdtotb + gIbtotb; - } - else - gIgtotg = gIgtotd = gIgtots = gIgtotb = 0.0; - - if (here->BSIM4rgateMod == 2) - T0 = *(ckt->CKTstates[0] + here->BSIM4vges) - - *(ckt->CKTstates[0] + here->BSIM4vgs); - else if (here->BSIM4rgateMod == 3) - T0 = *(ckt->CKTstates[0] + here->BSIM4vgms) - - *(ckt->CKTstates[0] + here->BSIM4vgs); - if (here->BSIM4rgateMod > 1) - { gcrgd = here->BSIM4gcrgd * T0; - gcrgg = here->BSIM4gcrgg * T0; - gcrgs = here->BSIM4gcrgs * T0; - gcrgb = here->BSIM4gcrgb * T0; - gcrgg -= here->BSIM4gcrg; - gcrg = here->BSIM4gcrg; - } - else - gcrg = gcrgd = gcrgg = gcrgs = gcrgb = 0.0; - - if (here->BSIM4rgateMod == 3) - { xcgmgmb = (cgdo + cgso + pParam->BSIM4cgbo) * omega; - xcgmdb = -cgdo * omega; - xcgmsb = -cgso * omega; - xcgmbb = -pParam->BSIM4cgbo * omega; - - xcdgmb = xcgmdb; - xcsgmb = xcgmsb; - xcbgmb = xcgmbb; - - xcggbr = Cggr * omega; - xcgdbr = Cgdr * omega; - xcgsbr = Cgsr * omega; - xcgbbr = -(xcggbr + xcgdbr + xcgsbr); - - xcdgbr = Cdgr * omega; - xcsgbr = Csgr * omega; - xcbgb = here->BSIM4cbgb * omega; - } - else - { xcggbr = (Cggr + cgdo + cgso + pParam->BSIM4cgbo ) * omega; - xcgdbr = (Cgdr - cgdo) * omega; - xcgsbr = (Cgsr - cgso) * omega; - xcgbbr = -(xcggbr + xcgdbr + xcgsbr); - - xcdgbr = (Cdgr - cgdo) * omega; - xcsgbr = (Csgr - cgso) * omega; - xcbgb = (here->BSIM4cbgb - pParam->BSIM4cgbo) * omega; - - xcdgmb = xcsgmb = xcbgmb = 0.0; - } - xcddbr = (Cddr + here->BSIM4capbd + cgdo) * omega; - xcdsbr = Cdsr * omega; - xcsdbr = Csdr * omega; - xcssbr = (here->BSIM4capbs + cgso + Cssr) * omega; - - if (!here->BSIM4rbodyMod) - { xcdbbr = -(xcdgbr + xcddbr + xcdsbr + xcdgmb); - xcsbbr = -(xcsgbr + xcsdbr + xcssbr + xcsgmb); - - xcbdb = (here->BSIM4cbdb - here->BSIM4capbd) * omega; - xcbsb = (here->BSIM4cbsb - here->BSIM4capbs) * omega; - xcdbdb = 0.0; - } - else - { xcdbbr = Cdbr * omega; - xcsbbr = -(xcsgbr + xcsdbr + xcssbr + xcsgmb) - + here->BSIM4capbs * omega; - - xcbdb = here->BSIM4cbdb * omega; - xcbsb = here->BSIM4cbsb * omega; - - xcdbdb = -here->BSIM4capbd * omega; - xcsbsb = -here->BSIM4capbs * omega; - } - xcbbb = -(xcbdb + xcbgb + xcbsb + xcbgmb); - - xcdgbi = Cdgi; - xcsgbi = Csgi; - xcddbi = Cddi; - xcdsbi = Cdsi; - xcsdbi = Csdi; - xcssbi = Cssi; - xcdbbi = Cdbi; - xcsbbi = Csbi; - xcggbi = Cggi; - xcgdbi = Cgdi; - xcgsbi = Cgsi; - xcgbbi = Cgbi; - } - else /* Reverse mode */ - { Gmr = -gmr; - Gmbsr = -gmbsr; - FwdSumr = 0.0; - RevSumr = -(Gmr + Gmbsr); - Gmi = -gmi; - Gmbsi = -gmbsi; - FwdSumi = 0.0; - RevSumi = -(Gmi + Gmbsi); - - gbbsp = -(here->BSIM4gbds); - gbbdp = here->BSIM4gbds + here->BSIM4gbgs + here->BSIM4gbbs; - - gbdpg = 0.0; - gbdpsp = 0.0; - gbdpb = 0.0; - gbdpdp = 0.0; - - gbspg = here->BSIM4gbgs; - gbspsp = here->BSIM4gbds; - gbspb = here->BSIM4gbbs; - gbspdp = -(gbspg + gbspsp + gbspb); - - if (model->BSIM4igcMod) - { gIstotg = here->BSIM4gIgsg + here->BSIM4gIgcdg; - gIstotd = here->BSIM4gIgcds; - gIstots = here->BSIM4gIgss + here->BSIM4gIgcdd; - gIstotb = here->BSIM4gIgcdb; - - gIdtotg = here->BSIM4gIgdg + here->BSIM4gIgcsg; - gIdtotd = here->BSIM4gIgdd + here->BSIM4gIgcss; - gIdtots = here->BSIM4gIgcsd; - gIdtotb = here->BSIM4gIgcsb; - } - else - { gIstotg = gIstotd = gIstots = gIstotb = 0.0; - gIdtotg = gIdtotd = gIdtots = gIdtotb = 0.0; - } - - if (model->BSIM4igbMod) - { gIbtotg = here->BSIM4gIgbg; - gIbtotd = here->BSIM4gIgbs; - gIbtots = here->BSIM4gIgbd; - gIbtotb = here->BSIM4gIgbb; - } - else - gIbtotg = gIbtotd = gIbtots = gIbtotb = 0.0; - - if ((model->BSIM4igcMod != 0) || (model->BSIM4igbMod != 0)) - { gIgtotg = gIstotg + gIdtotg + gIbtotg; - gIgtotd = gIstotd + gIdtotd + gIbtotd ; - gIgtots = gIstots + gIdtots + gIbtots; - gIgtotb = gIstotb + gIdtotb + gIbtotb; - } - else - gIgtotg = gIgtotd = gIgtots = gIgtotb = 0.0; - - if (here->BSIM4rgateMod == 2) - T0 = *(ckt->CKTstates[0] + here->BSIM4vges) - - *(ckt->CKTstates[0] + here->BSIM4vgs); - else if (here->BSIM4rgateMod == 3) - T0 = *(ckt->CKTstates[0] + here->BSIM4vgms) - - *(ckt->CKTstates[0] + here->BSIM4vgs); - if (here->BSIM4rgateMod > 1) - { gcrgd = here->BSIM4gcrgs * T0; - gcrgg = here->BSIM4gcrgg * T0; - gcrgs = here->BSIM4gcrgd * T0; - gcrgb = here->BSIM4gcrgb * T0; - gcrgg -= here->BSIM4gcrg; - gcrg = here->BSIM4gcrg; - } - else - gcrg = gcrgd = gcrgg = gcrgs = gcrgb = 0.0; - - if (here->BSIM4rgateMod == 3) - { xcgmgmb = (cgdo + cgso + pParam->BSIM4cgbo) * omega; - xcgmdb = -cgdo * omega; - xcgmsb = -cgso * omega; - xcgmbb = -pParam->BSIM4cgbo * omega; - - xcdgmb = xcgmdb; - xcsgmb = xcgmsb; - xcbgmb = xcgmbb; - - xcggbr = Cggr * omega; - xcgdbr = Cgsr * omega; - xcgsbr = Cgdr * omega; - xcgbbr = -(xcggbr + xcgdbr + xcgsbr); - - xcdgbr = Csgr * omega; - xcsgbr = Cdgr * omega; - xcbgb = here->BSIM4cbgb * omega; - } - else - { xcggbr = (Cggr + cgdo + cgso + pParam->BSIM4cgbo ) * omega; - xcgdbr = (Cgsr - cgdo) * omega; - xcgsbr = (Cgdr - cgso) * omega; - xcgbbr = -(xcggbr + xcgdbr + xcgsbr); - - xcdgbr = (Csgr - cgdo) * omega; - xcsgbr = (Cdgr - cgso) * omega; - xcbgb = (here->BSIM4cbgb - pParam->BSIM4cgbo) * omega; - - xcdgmb = xcsgmb = xcbgmb = 0.0; - } - xcddbr = (here->BSIM4capbd + cgdo + Cssr) * omega; - xcdsbr = Csdr * omega; - xcsdbr = Cdsr * omega; - xcssbr = (Cddr + here->BSIM4capbs + cgso) * omega; - - if (!here->BSIM4rbodyMod) - { xcdbbr = -(xcdgbr + xcddbr + xcdsbr + xcdgmb); - xcsbbr = -(xcsgbr + xcsdbr + xcssbr + xcsgmb); - - xcbdb = (here->BSIM4cbsb - here->BSIM4capbd) * omega; - xcbsb = (here->BSIM4cbdb - here->BSIM4capbs) * omega; - xcdbdb = 0.0; - } - else - { xcdbbr = -(xcdgbr + xcddbr + xcdsbr + xcdgmb) - + here->BSIM4capbd * omega; - xcsbbr = Cdbr * omega; - - xcbdb = here->BSIM4cbsb * omega; - xcbsb = here->BSIM4cbdb * omega; - xcdbdb = -here->BSIM4capbd * omega; - xcsbsb = -here->BSIM4capbs * omega; - } - xcbbb = -(xcbgb + xcbdb + xcbsb + xcbgmb); - - xcdgbi = Csgi; - xcsgbi = Cdgi; - xcddbi = Cssi; - xcdsbi = Csdi; - xcsdbi = Cdsi; - xcssbi = Cddi; - xcdbbi = Csbi; - xcsbbi = Cdbi; - xcggbi = Cggi; - xcgdbi = Cgsi; - xcgsbi = Cgdi; - xcgbbi = Cgbi; - } - - if (model->BSIM4rdsMod == 1) - { gstot = here->BSIM4gstot; - gstotd = here->BSIM4gstotd; - gstotg = here->BSIM4gstotg; - gstots = here->BSIM4gstots - gstot; - gstotb = here->BSIM4gstotb; - - gdtot = here->BSIM4gdtot; - gdtotd = here->BSIM4gdtotd - gdtot; - gdtotg = here->BSIM4gdtotg; - gdtots = here->BSIM4gdtots; - gdtotb = here->BSIM4gdtotb; - } - else - { gstot = gstotd = gstotg = gstots = gstotb = 0.0; - gdtot = gdtotd = gdtotg = gdtots = gdtotb = 0.0; - } - - - /* - * Loading AC matrix - */ - m = here->BSIM4m; - - if (!model->BSIM4rdsMod) - { gdpr = here->BSIM4drainConductance; - gspr = here->BSIM4sourceConductance; - } - else - gdpr = gspr = 0.0; - - if (!here->BSIM4rbodyMod) - { gjbd = here->BSIM4gbd; - gjbs = here->BSIM4gbs; - } - else - gjbd = gjbs = 0.0; - - geltd = here->BSIM4grgeltd; - - if (here->BSIM4rgateMod == 1) - { *(here->BSIM4GEgePtr) += m * geltd; - *(here->BSIM4GPgePtr) -= m * geltd; - *(here->BSIM4GEgpPtr) -= m * geltd; - - *(here->BSIM4GPgpPtr +1) += m * xcggbr; - *(here->BSIM4GPgpPtr) += m * (geltd + xcggbi + gIgtotg); - *(here->BSIM4GPdpPtr +1) += m * xcgdbr; - *(here->BSIM4GPdpPtr) += m * (xcgdbi + gIgtotd); - *(here->BSIM4GPspPtr +1) += m * xcgsbr; - *(here->BSIM4GPspPtr) += m * (xcgsbi + gIgtots); - *(here->BSIM4GPbpPtr +1) += m * xcgbbr; - *(here->BSIM4GPbpPtr) += m * (xcgbbi + gIgtotb); - } /* WDLiu: gcrg already subtracted from all gcrgg below */ - else if (here->BSIM4rgateMod == 2) - { *(here->BSIM4GEgePtr) += m * gcrg; - *(here->BSIM4GEgpPtr) += m * gcrgg; - *(here->BSIM4GEdpPtr) += m * gcrgd; - *(here->BSIM4GEspPtr) += m * gcrgs; - *(here->BSIM4GEbpPtr) += m * gcrgb; - - *(here->BSIM4GPgePtr) -= m * gcrg; - *(here->BSIM4GPgpPtr +1) += m * xcggbr; - *(here->BSIM4GPgpPtr) -= m * (gcrgg - xcggbi - gIgtotg); - *(here->BSIM4GPdpPtr +1) += m * xcgdbr; - *(here->BSIM4GPdpPtr) -= m * (gcrgd - xcgdbi - gIgtotd); - *(here->BSIM4GPspPtr +1) += m * xcgsbr; - *(here->BSIM4GPspPtr) -= m * (gcrgs - xcgsbi - gIgtots); - *(here->BSIM4GPbpPtr +1) += m * xcgbbr; - *(here->BSIM4GPbpPtr) -= m * (gcrgb - xcgbbi - gIgtotb); - } - else if (here->BSIM4rgateMod == 3) - { *(here->BSIM4GEgePtr) += m * geltd; - *(here->BSIM4GEgmPtr) -= m * geltd; - *(here->BSIM4GMgePtr) -= m * geltd; - *(here->BSIM4GMgmPtr) += m * (geltd + gcrg); - *(here->BSIM4GMgmPtr +1) += m * xcgmgmb; - - *(here->BSIM4GMdpPtr) += m * gcrgd; - *(here->BSIM4GMdpPtr +1) += m * xcgmdb; - *(here->BSIM4GMgpPtr) += m * gcrgg; - *(here->BSIM4GMspPtr) += m * gcrgs; - *(here->BSIM4GMspPtr +1) += m * xcgmsb; - *(here->BSIM4GMbpPtr) += m * gcrgb; - *(here->BSIM4GMbpPtr +1) += m * xcgmbb; - - *(here->BSIM4DPgmPtr +1) += m * xcdgmb; - *(here->BSIM4GPgmPtr) -= m * gcrg; - *(here->BSIM4SPgmPtr +1) += m * xcsgmb; - *(here->BSIM4BPgmPtr +1) += m * xcbgmb; - - *(here->BSIM4GPgpPtr) -= m * (gcrgg - xcggbi - gIgtotg); - *(here->BSIM4GPgpPtr +1) += m * xcggbr; - *(here->BSIM4GPdpPtr) -= m * (gcrgd - xcgdbi - gIgtotd); - *(here->BSIM4GPdpPtr +1) += m * xcgdbr; - *(here->BSIM4GPspPtr) -= m * (gcrgs - xcgsbi - gIgtots); - *(here->BSIM4GPspPtr +1) += m * xcgsbr; - *(here->BSIM4GPbpPtr) -= m * (gcrgb - xcgbbi - gIgtotb); - *(here->BSIM4GPbpPtr +1) += m * xcgbbr; - } - else - { *(here->BSIM4GPgpPtr +1) += m * xcggbr; - *(here->BSIM4GPgpPtr) += m * (xcggbi + gIgtotg); - *(here->BSIM4GPdpPtr +1) += m * xcgdbr; - *(here->BSIM4GPdpPtr) += m * (xcgdbi + gIgtotd); - *(here->BSIM4GPspPtr +1) += m * xcgsbr; - *(here->BSIM4GPspPtr) += m * (xcgsbi + gIgtots); - *(here->BSIM4GPbpPtr +1) += m * xcgbbr; - *(here->BSIM4GPbpPtr) += m * (xcgbbi + gIgtotb); - } - - if (model->BSIM4rdsMod) - { (*(here->BSIM4DgpPtr) += m * gdtotg); - (*(here->BSIM4DspPtr) += m * gdtots); - (*(here->BSIM4DbpPtr) += m * gdtotb); - (*(here->BSIM4SdpPtr) += m * gstotd); - (*(here->BSIM4SgpPtr) += m * gstotg); - (*(here->BSIM4SbpPtr) += m * gstotb); - } - - *(here->BSIM4DPdpPtr +1) += m * (xcddbr + gdsi + RevSumi); - *(here->BSIM4DPdpPtr) += m * (gdpr + xcddbi + gdsr + here->BSIM4gbd - - gdtotd + RevSumr + gbdpdp - gIdtotd); - *(here->BSIM4DPdPtr) -= m * (gdpr + gdtot); - *(here->BSIM4DPgpPtr +1) += m * (xcdgbr + Gmi); - *(here->BSIM4DPgpPtr) += m * (Gmr + xcdgbi - gdtotg + gbdpg - gIdtotg); - *(here->BSIM4DPspPtr +1) += m * (xcdsbr - gdsi - FwdSumi); - *(here->BSIM4DPspPtr) -= m * (gdsr - xcdsbi + FwdSumr + gdtots - gbdpsp + gIdtots); - *(here->BSIM4DPbpPtr +1) += m * (xcdbbr + Gmbsi); - *(here->BSIM4DPbpPtr) -= m * (gjbd + gdtotb - xcdbbi - Gmbsr - gbdpb + gIdtotb); - - *(here->BSIM4DdpPtr) -= m * (gdpr - gdtotd); - *(here->BSIM4DdPtr) += m * (gdpr + gdtot); - - *(here->BSIM4SPdpPtr +1) += m * (xcsdbr - gdsi - RevSumi); - *(here->BSIM4SPdpPtr) -= m * (gdsr - xcsdbi + gstotd + RevSumr - gbspdp + gIstotd); - *(here->BSIM4SPgpPtr +1) += m * (xcsgbr - Gmi); - *(here->BSIM4SPgpPtr) -= m * (Gmr - xcsgbi + gstotg - gbspg + gIstotg); - *(here->BSIM4SPspPtr +1) += m * (xcssbr + gdsi + FwdSumi); - *(here->BSIM4SPspPtr) += m * (gspr + xcssbi + gdsr + here->BSIM4gbs - - gstots + FwdSumr + gbspsp - gIstots); - *(here->BSIM4SPsPtr) -= m * (gspr + gstot); - *(here->BSIM4SPbpPtr +1) += m * (xcsbbr - Gmbsi); - *(here->BSIM4SPbpPtr) -= m * (gjbs + gstotb - xcsbbi + Gmbsr - gbspb + gIstotb); - - *(here->BSIM4SspPtr) -= m * (gspr - gstots); - *(here->BSIM4SsPtr) += m * (gspr + gstot); - - *(here->BSIM4BPdpPtr +1) += m * xcbdb; - *(here->BSIM4BPdpPtr) -= m * (gjbd - gbbdp + gIbtotd); - *(here->BSIM4BPgpPtr +1) += m * xcbgb; - *(here->BSIM4BPgpPtr) -= m * (here->BSIM4gbgs + gIbtotg); - *(here->BSIM4BPspPtr +1) += m * xcbsb; - *(here->BSIM4BPspPtr) -= m * (gjbs - gbbsp + gIbtots); - *(here->BSIM4BPbpPtr +1) += m * xcbbb; - *(here->BSIM4BPbpPtr) += m * (gjbd + gjbs - here->BSIM4gbbs - - gIbtotb); - ggidld = here->BSIM4ggidld; - ggidlg = here->BSIM4ggidlg; - ggidlb = here->BSIM4ggidlb; - ggislg = here->BSIM4ggislg; - ggisls = here->BSIM4ggisls; - ggislb = here->BSIM4ggislb; - - /* stamp gidl */ - (*(here->BSIM4DPdpPtr) += m * ggidld); - (*(here->BSIM4DPgpPtr) += m * ggidlg); - (*(here->BSIM4DPspPtr) -= m * ((ggidlg + ggidld) + ggidlb)); - (*(here->BSIM4DPbpPtr) += m * ggidlb); - (*(here->BSIM4BPdpPtr) -= m * ggidld); - (*(here->BSIM4BPgpPtr) -= m * ggidlg); - (*(here->BSIM4BPspPtr) += m * ((ggidlg + ggidld) + ggidlb)); - (*(here->BSIM4BPbpPtr) -= m * ggidlb); - /* stamp gisl */ - (*(here->BSIM4SPdpPtr) -= m * ((ggisls + ggislg) + ggislb)); - (*(here->BSIM4SPgpPtr) += m * ggislg); - (*(here->BSIM4SPspPtr) += m * ggisls); - (*(here->BSIM4SPbpPtr) += m * ggislb); - (*(here->BSIM4BPdpPtr) += m * ((ggislg + ggisls) + ggislb)); - (*(here->BSIM4BPgpPtr) -= m * ggislg); - (*(here->BSIM4BPspPtr) -= m * ggisls); - (*(here->BSIM4BPbpPtr) -= m * ggislb); - - if (here->BSIM4rbodyMod) - { (*(here->BSIM4DPdbPtr +1) += m * xcdbdb); - (*(here->BSIM4DPdbPtr) -= m * here->BSIM4gbd); - (*(here->BSIM4SPsbPtr +1) += m * xcsbsb); - (*(here->BSIM4SPsbPtr) -= m * here->BSIM4gbs); - - (*(here->BSIM4DBdpPtr +1) += m * xcdbdb); - (*(here->BSIM4DBdpPtr) -= m * here->BSIM4gbd); - (*(here->BSIM4DBdbPtr +1) -= m * xcdbdb); - (*(here->BSIM4DBdbPtr) += m * (here->BSIM4gbd + here->BSIM4grbpd - + here->BSIM4grbdb)); - (*(here->BSIM4DBbpPtr) -= m * here->BSIM4grbpd); - (*(here->BSIM4DBbPtr) -= m * here->BSIM4grbdb); - - (*(here->BSIM4BPdbPtr) -= m * here->BSIM4grbpd); - (*(here->BSIM4BPbPtr) -= m * here->BSIM4grbpb); - (*(here->BSIM4BPsbPtr) -= m * here->BSIM4grbps); - (*(here->BSIM4BPbpPtr) += m * (here->BSIM4grbpd + here->BSIM4grbps - + here->BSIM4grbpb)); - /* WDLiu: (-here->BSIM4gbbs) already added to BPbpPtr */ - - (*(here->BSIM4SBspPtr +1) += m * xcsbsb); - (*(here->BSIM4SBspPtr) -= m * here->BSIM4gbs); - (*(here->BSIM4SBbpPtr) -= m * here->BSIM4grbps); - (*(here->BSIM4SBbPtr) -= m * here->BSIM4grbsb); - (*(here->BSIM4SBsbPtr +1) -= m * xcsbsb); - (*(here->BSIM4SBsbPtr) += m * (here->BSIM4gbs - + here->BSIM4grbps + here->BSIM4grbsb)); - - (*(here->BSIM4BdbPtr) -= m * here->BSIM4grbdb); - (*(here->BSIM4BbpPtr) -= m * here->BSIM4grbpb); - (*(here->BSIM4BsbPtr) -= m * here->BSIM4grbsb); - (*(here->BSIM4BbPtr) += m * (here->BSIM4grbsb + here->BSIM4grbdb - + here->BSIM4grbpb)); - } - - - /* - * WDLiu: The internal charge node generated for transient NQS is not needed for - * AC NQS. The following is not doing a real job, but we have to keep it; - * otherwise a singular AC NQS matrix may occur if the transient NQS is on. - * The charge node is isolated from the instance. - */ - if (here->BSIM4trnqsMod) - { (*(here->BSIM4QqPtr) += m * 1.0); - (*(here->BSIM4QgpPtr) += 0.0); - (*(here->BSIM4QdpPtr) += 0.0); - (*(here->BSIM4QspPtr) += 0.0); - (*(here->BSIM4QbpPtr) += 0.0); - - (*(here->BSIM4DPqPtr) += 0.0); - (*(here->BSIM4SPqPtr) += 0.0); - (*(here->BSIM4GPqPtr) += 0.0); - } - } - } - return(OK); -} diff --git a/src/spicelib/devices/bsim4/b4ask.c b/src/spicelib/devices/bsim4/b4ask.c deleted file mode 100644 index 20926d089..000000000 --- a/src/spicelib/devices/bsim4/b4ask.c +++ /dev/null @@ -1,455 +0,0 @@ -/* ****************************************************************************** - * BSIM4 4.8.1 released by Chetan Kumar Dabhi 2/15/2017 * - * BSIM4 Model Equations * - ****************************************************************************** - - ****************************************************************************** - * Copyright 2017 Regents of the University of California. * - * All rights reserved. * - * * - * Project Director: Prof. Chenming Hu. * - * Authors: Gary W. Ng, Weidong Liu, Xuemei Xi, Mohan Dunga, Wenwei Yang * - * Ali Niknejad, Shivendra Singh Parihar, Chetan Kumar Dabhi * - * Yogesh Singh Chauhan, Sayeef Salahuddin, Chenming Hu * - ****************************************************************************** - - ****************************************************************************** - * CMC In-Code Statement * - * * - * The Developer agrees that the following statement will appear in the * - * model code that has been adopted as a CMC Standard. * - * * - * Software is distributed as is, completely without warranty or service * - * support. The University of California and its employees are not liable * - * for the condition or performance of the software. * - * * - * The University of California owns the copyright and grants users a * - * perpetual, irrevocable, worldwide, non-exclusive, royalty-free license * - * with respect to the software as set forth below. * - * * - * The University of California hereby disclaims all implied warranties. * - * * - * The University of California grants the users the right to modify, * - * copy, and redistribute the software and documentation, both within * - * the user's organization and externally, subject to the following * - * restrictions: * - * * - * 1. The users agree not to charge for the University of California code * - * itself but may charge for additions, extensions, or support. * - * * - * 2. In any product based on the software, the users agree to * - * acknowledge the University of California that developed the * - * software. This acknowledgment shall appear in the product * - * documentation. * - * * - * 3. Redistributions to others of source code and documentation must * - * retain the copyright notice, disclaimer, and list of conditions. * - * * - * 4. Redistributions to others in binary form must reproduce the * - * copyright notice, disclaimer, and list of conditions in the * - * documentation and/or other materials provided with the * - * distribution. * - * * - * Agreed to on ______Feb. 15, 2017______________ * - * * - * By: ____University of California, Berkeley___ * - * ____Chenming Hu__________________________ * - * ____Professor in Graduate School ________ * - * * - ****************************************************************************** */ - -#include "ngspice/ngspice.h" -#include "ngspice/ifsim.h" -#include "ngspice/cktdefs.h" -#include "ngspice/devdefs.h" -#include "bsim4def.h" -#include "ngspice/sperror.h" -#include "ngspice/suffix.h" - -int -BSIM4ask( -CKTcircuit *ckt, -GENinstance *inst, -int which, -IFvalue *value, -IFvalue *select) -{ -BSIM4instance *here = (BSIM4instance*)inst; - - NG_IGNORE(select); - - switch(which) - { case BSIM4_L: - value->rValue = here->BSIM4l; - return(OK); - case BSIM4_W: - value->rValue = here->BSIM4w; - return(OK); - case BSIM4_M: - value->rValue = here->BSIM4m; - return(OK); - case BSIM4_NF: - value->rValue = here->BSIM4nf; - return(OK); - case BSIM4_MIN: - value->iValue = here->BSIM4min; - return(OK); - case BSIM4_AS: - value->rValue = here->BSIM4sourceArea; - return(OK); - case BSIM4_AD: - value->rValue = here->BSIM4drainArea; - return(OK); - case BSIM4_PS: - value->rValue = here->BSIM4sourcePerimeter; - return(OK); - case BSIM4_PD: - value->rValue = here->BSIM4drainPerimeter; - return(OK); - case BSIM4_NRS: - value->rValue = here->BSIM4sourceSquares; - return(OK); - case BSIM4_NRD: - value->rValue = here->BSIM4drainSquares; - return(OK); - case BSIM4_OFF: - value->rValue = here->BSIM4off; - return(OK); - case BSIM4_SA: - value->rValue = here->BSIM4sa ; - return(OK); - case BSIM4_SB: - value->rValue = here->BSIM4sb ; - return(OK); - case BSIM4_SD: - value->rValue = here->BSIM4sd ; - return(OK); - case BSIM4_SCA: - value->rValue = here->BSIM4sca ; - return(OK); - case BSIM4_SCB: - value->rValue = here->BSIM4scb ; - return(OK); - case BSIM4_SCC: - value->rValue = here->BSIM4scc ; - return(OK); - case BSIM4_SC: - value->rValue = here->BSIM4sc ; - return(OK); - - case BSIM4_RBSB: - value->rValue = here->BSIM4rbsb; - return(OK); - case BSIM4_RBDB: - value->rValue = here->BSIM4rbdb; - return(OK); - case BSIM4_RBPB: - value->rValue = here->BSIM4rbpb; - return(OK); - case BSIM4_RBPS: - value->rValue = here->BSIM4rbps; - return(OK); - case BSIM4_RBPD: - value->rValue = here->BSIM4rbpd; - return(OK); - case BSIM4_DELVTO: - value->rValue = here->BSIM4delvto; - return(OK); - case BSIM4_MULU0: - value->rValue = here->BSIM4mulu0; - return(OK); - case BSIM4_WNFLAG: - value->iValue = here->BSIM4wnflag; - return(OK); - case BSIM4_XGW: - value->rValue = here->BSIM4xgw; - return(OK); - case BSIM4_NGCON: - value->rValue = here->BSIM4ngcon; - return(OK); - case BSIM4_TRNQSMOD: - value->iValue = here->BSIM4trnqsMod; - return(OK); - case BSIM4_ACNQSMOD: - value->iValue = here->BSIM4acnqsMod; - return(OK); - case BSIM4_RBODYMOD: - value->iValue = here->BSIM4rbodyMod; - return(OK); - case BSIM4_RGATEMOD: - value->iValue = here->BSIM4rgateMod; - return(OK); - case BSIM4_GEOMOD: - value->iValue = here->BSIM4geoMod; - return(OK); - case BSIM4_RGEOMOD: - value->iValue = here->BSIM4rgeoMod; - return(OK); - case BSIM4_IC_VDS: - value->rValue = here->BSIM4icVDS; - return(OK); - case BSIM4_IC_VGS: - value->rValue = here->BSIM4icVGS; - return(OK); - case BSIM4_IC_VBS: - value->rValue = here->BSIM4icVBS; - return(OK); - case BSIM4_DNODE: - value->iValue = here->BSIM4dNode; - return(OK); - case BSIM4_GNODEEXT: - value->iValue = here->BSIM4gNodeExt; - return(OK); - case BSIM4_SNODE: - value->iValue = here->BSIM4sNode; - return(OK); - case BSIM4_BNODE: - value->iValue = here->BSIM4bNode; - return(OK); - case BSIM4_DNODEPRIME: - value->iValue = here->BSIM4dNodePrime; - return(OK); - case BSIM4_GNODEPRIME: - value->iValue = here->BSIM4gNodePrime; - return(OK); - case BSIM4_GNODEMID: - value->iValue = here->BSIM4gNodeMid; - return(OK); - case BSIM4_SNODEPRIME: - value->iValue = here->BSIM4sNodePrime; - return(OK); - case BSIM4_DBNODE: - value->iValue = here->BSIM4dbNode; - return(OK); - case BSIM4_BNODEPRIME: - value->iValue = here->BSIM4bNodePrime; - return(OK); - case BSIM4_SBNODE: - value->iValue = here->BSIM4sbNode; - return(OK); - case BSIM4_SOURCECONDUCT: - value->rValue = here->BSIM4sourceConductance; - value->rValue *= here->BSIM4m; - return(OK); - case BSIM4_DRAINCONDUCT: - value->rValue = here->BSIM4drainConductance; - value->rValue *= here->BSIM4m; - return(OK); - case BSIM4_VBD: - value->rValue = *(ckt->CKTstate0 + here->BSIM4vbd); - return(OK); - case BSIM4_VBS: - value->rValue = *(ckt->CKTstate0 + here->BSIM4vbs); - return(OK); - case BSIM4_VGS: - value->rValue = *(ckt->CKTstate0 + here->BSIM4vgs); - return(OK); - case BSIM4_VDS: - value->rValue = *(ckt->CKTstate0 + here->BSIM4vds); - return(OK); - case BSIM4_CD: - value->rValue = here->BSIM4cd; - value->rValue *= here->BSIM4m; - return(OK); - case BSIM4_CBS: - value->rValue = here->BSIM4cbs; - value->rValue *= here->BSIM4m; - return(OK); - case BSIM4_CBD: - value->rValue = here->BSIM4cbd; - value->rValue *= here->BSIM4m; - return(OK); - case BSIM4_CSUB: - value->rValue = here->BSIM4csub; - value->rValue *= here->BSIM4m; - return(OK); - case BSIM4_QINV: - value->rValue = here-> BSIM4qinv; - value->rValue *= here->BSIM4m; - return(OK); - case BSIM4_IGIDL: - value->rValue = here->BSIM4Igidl; - value->rValue *= here->BSIM4m; - return(OK); - case BSIM4_IGISL: - value->rValue = here->BSIM4Igisl; - value->rValue *= here->BSIM4m; - return(OK); - case BSIM4_IGS: - value->rValue = here->BSIM4Igs; - value->rValue *= here->BSIM4m; - return(OK); - case BSIM4_IGD: - value->rValue = here->BSIM4Igd; - value->rValue *= here->BSIM4m; - return(OK); - case BSIM4_IGB: - value->rValue = here->BSIM4Igb; - value->rValue *= here->BSIM4m; - return(OK); - case BSIM4_IGCS: - value->rValue = here->BSIM4Igcs; - value->rValue *= here->BSIM4m; - return(OK); - case BSIM4_IGCD: - value->rValue = here->BSIM4Igcd; - value->rValue *= here->BSIM4m; - return(OK); - case BSIM4_GM: - value->rValue = here->BSIM4gm; - value->rValue *= here->BSIM4m; - return(OK); - case BSIM4_GDS: - value->rValue = here->BSIM4gds; - value->rValue *= here->BSIM4m; - return(OK); - case BSIM4_GMBS: - value->rValue = here->BSIM4gmbs; - value->rValue *= here->BSIM4m; - return(OK); - case BSIM4_GBD: - value->rValue = here->BSIM4gbd; - value->rValue *= here->BSIM4m; - return(OK); - case BSIM4_GBS: - value->rValue = here->BSIM4gbs; - value->rValue *= here->BSIM4m; - return(OK); -/* case BSIM4_QB: - value->rValue = *(ckt->CKTstate0 + here->BSIM4qb); - return(OK); */ - case BSIM4_CQB: - value->rValue = *(ckt->CKTstate0 + here->BSIM4cqb); - return(OK); -/* case BSIM4_QG: - value->rValue = *(ckt->CKTstate0 + here->BSIM4qg); - return(OK); */ - case BSIM4_CQG: - value->rValue = *(ckt->CKTstate0 + here->BSIM4cqg); - return(OK); -/* case BSIM4_QD: - value->rValue = *(ckt->CKTstate0 + here->BSIM4qd); - return(OK); */ - case BSIM4_CQD: - value->rValue = *(ckt->CKTstate0 + here->BSIM4cqd); - return(OK); -/* case BSIM4_QS: - value->rValue = *(ckt->CKTstate0 + here->BSIM4qs); - return(OK); */ - case BSIM4_QB: - value->rValue = here->BSIM4qbulk; - value->rValue *= here->BSIM4m; - return(OK); - case BSIM4_QG: - value->rValue = here->BSIM4qgate; - value->rValue *= here->BSIM4m; - return(OK); - case BSIM4_QS: - value->rValue = here->BSIM4qsrc; - value->rValue *= here->BSIM4m; - return(OK); - case BSIM4_QD: - value->rValue = here->BSIM4qdrn; - value->rValue *= here->BSIM4m; - return(OK); - case BSIM4_QDEF: - value->rValue = *(ckt->CKTstate0 + here->BSIM4qdef); - return(OK); - case BSIM4_GCRG: - value->rValue = here->BSIM4gcrg; - value->rValue *= here->BSIM4m; - return(OK); - case BSIM4_GTAU: - value->rValue = here->BSIM4gtau; - value->rValue *= here->BSIM4m; - return(OK); - case BSIM4_CGGB: - value->rValue = here->BSIM4cggb; - value->rValue *= here->BSIM4m; - return(OK); - case BSIM4_CGDB: - value->rValue = here->BSIM4cgdb; - value->rValue *= here->BSIM4m; - return(OK); - case BSIM4_CGSB: - value->rValue = here->BSIM4cgsb; - value->rValue *= here->BSIM4m; - return(OK); - case BSIM4_CDGB: - value->rValue = here->BSIM4cdgb; - value->rValue *= here->BSIM4m; - return(OK); - case BSIM4_CDDB: - value->rValue = here->BSIM4cddb; - value->rValue *= here->BSIM4m; - return(OK); - case BSIM4_CDSB: - value->rValue = here->BSIM4cdsb; - value->rValue *= here->BSIM4m; - return(OK); - case BSIM4_CBGB: - value->rValue = here->BSIM4cbgb; - value->rValue *= here->BSIM4m; - return(OK); - case BSIM4_CBDB: - value->rValue = here->BSIM4cbdb; - value->rValue *= here->BSIM4m; - return(OK); - case BSIM4_CBSB: - value->rValue = here->BSIM4cbsb; - value->rValue *= here->BSIM4m; - return(OK); - case BSIM4_CSGB: - value->rValue = here->BSIM4csgb; - value->rValue *= here->BSIM4m; - return(OK); - case BSIM4_CSDB: - value->rValue = here->BSIM4csdb; - value->rValue *= here->BSIM4m; - return(OK); - case BSIM4_CSSB: - value->rValue = here->BSIM4cssb; - value->rValue *= here->BSIM4m; - return(OK); - case BSIM4_CGBB: - value->rValue = here->BSIM4cgbb; - value->rValue *= here->BSIM4m; - return(OK); - case BSIM4_CDBB: - value->rValue = here->BSIM4cdbb; - value->rValue *= here->BSIM4m; - return(OK); - case BSIM4_CSBB: - value->rValue = here->BSIM4csbb; - value->rValue *= here->BSIM4m; - return(OK); - case BSIM4_CBBB: - value->rValue = here->BSIM4cbbb; - value->rValue *= here->BSIM4m; - return(OK); - case BSIM4_CAPBD: - value->rValue = here->BSIM4capbd; - value->rValue *= here->BSIM4m; - return(OK); - case BSIM4_CAPBS: - value->rValue = here->BSIM4capbs; - value->rValue *= here->BSIM4m; - return(OK); - case BSIM4_VON: - value->rValue = here->BSIM4von; - return(OK); - case BSIM4_VDSAT: - value->rValue = here->BSIM4vdsat; - return(OK); - case BSIM4_QBS: - value->rValue = *(ckt->CKTstate0 + here->BSIM4qbs); - return(OK); - case BSIM4_QBD: - value->rValue = *(ckt->CKTstate0 + here->BSIM4qbd); - return(OK); - default: - return(E_BADPARM); - } - /* NOTREACHED */ -} - diff --git a/src/spicelib/devices/bsim4/b4check.c b/src/spicelib/devices/bsim4/b4check.c deleted file mode 100644 index a01bce5a8..000000000 --- a/src/spicelib/devices/bsim4/b4check.c +++ /dev/null @@ -1,952 +0,0 @@ -/* ****************************************************************************** - * BSIM4 4.8.1 released by Chetan Kumar Dabhi 2/15/2017 * - * BSIM4 Model Equations * - ****************************************************************************** - - ****************************************************************************** - * Copyright 2017 Regents of the University of California. * - * All rights reserved. * - * * - * Project Director: Prof. Chenming Hu. * - * Authors: Gary W. Ng, Weidong Liu, Xuemei Xi, Mohan Dunga, Wenwei Yang * - * Ali Niknejad, Shivendra Singh Parihar, Chetan Kumar Dabhi * - * Yogesh Singh Chauhan, Sayeef Salahuddin, Chenming Hu * - ****************************************************************************** - - ****************************************************************************** - * CMC In-Code Statement * - * * - * The Developer agrees that the following statement will appear in the * - * model code that has been adopted as a CMC Standard. * - * * - * Software is distributed as is, completely without warranty or service * - * support. The University of California and its employees are not liable * - * for the condition or performance of the software. * - * * - * The University of California owns the copyright and grants users a * - * perpetual, irrevocable, worldwide, non-exclusive, royalty-free license * - * with respect to the software as set forth below. * - * * - * The University of California hereby disclaims all implied warranties. * - * * - * The University of California grants the users the right to modify, * - * copy, and redistribute the software and documentation, both within * - * the user's organization and externally, subject to the following * - * restrictions: * - * * - * 1. The users agree not to charge for the University of California code * - * itself but may charge for additions, extensions, or support. * - * * - * 2. In any product based on the software, the users agree to * - * acknowledge the University of California that developed the * - * software. This acknowledgment shall appear in the product * - * documentation. * - * * - * 3. Redistributions to others of source code and documentation must * - * retain the copyright notice, disclaimer, and list of conditions. * - * * - * 4. Redistributions to others in binary form must reproduce the * - * copyright notice, disclaimer, and list of conditions in the * - * documentation and/or other materials provided with the * - * distribution. * - * * - * Agreed to on ______Feb. 15, 2017______________ * - * * - * By: ____University of California, Berkeley___ * - * ____Chenming Hu__________________________ * - * ____Professor in Graduate School ________ * - * * - ****************************************************************************** - * Modified by Holger Vogt, 12/27/2020 - ******************************************************************************/ - -#include "ngspice/ngspice.h" -#include "ngspice/cktdefs.h" -#include "bsim4def.h" -#include "ngspice/trandefs.h" -#include "ngspice/const.h" -#include "ngspice/sperror.h" -#include "ngspice/devdefs.h" -#include "ngspice/suffix.h" -#include "ngspice/wordlist.h" -#include "ngspice/cpextern.h" - - - -/* Check for correctness of the BSIM4.8 parameters: - If parameter excursions are found, put the warning or error message into a wordlist. - Only then open a file bsim4.out and print the data into the file. */ -int -BSIM4checkModel( -BSIM4model *model, -BSIM4instance *here, -CKTcircuit *ckt) -{ - struct bsim4SizeDependParam *pParam; - int Fatal_Flag = 0; - FILE *fplog; - wordlist* wl, *wlstart; - - if (cp_getvar("ng_nomodcheck", CP_BOOL, NULL, 0)) - return(0); - - static char modname[BSIZE_SP]; - size_t mlen = strlen(model->BSIM4modName); - - if (mlen < BSIZE_SP) { - /* Check the model named model->BSIM4modName only once, - because BSIM4checkModel() is called for each instance. */ - if (!strncmp(modname, model->BSIM4modName, mlen)) - return(0); - strcpy(modname, model->BSIM4modName); - } - - pParam = here->pParam; - - wl = wlstart = TMALLOC(wordlist, 1); - wl->wl_prev = NULL; - wl->wl_next = NULL; - wl->wl_word = tprintf("\nChecking parameters for BSIM 4.8 model %s\n", model->BSIM4modName); - - if ((strcmp(model->BSIM4version, "4.8.1")) && (strncmp(model->BSIM4version, "4.81", 4)) && (strncmp(model->BSIM4version, "4.8", 3))) - { - printf("Warning: This model supports BSIM4 version 4.8\n"); - printf("You specified a wrong version number. Working now with BSIM4.8.1\n"); - wl_append_word(&wl, &wl, tprintf("Warning: This model supports BSIM4 version 4.8\n")); - wl_append_word(&wl, &wl, tprintf("You specified a wrong version number. Working now with BSIM4.8.1.\n")); - } - - if ((here->BSIM4rgateMod == 2) || (here->BSIM4rgateMod == 3)) - { if ((here->BSIM4trnqsMod == 1) || (here->BSIM4acnqsMod == 1)) { - wl_append_word(&wl, &wl, tprintf("Warning: You've selected both Rg and charge deficit NQS; select one only.\n")); - } - } - - if (model->BSIM4toxe <= 0.0) - { - wl_append_word(&wl, &wl, tprintf("Fatal: Toxe = %g is not positive.\n", - model->BSIM4toxe)); - Fatal_Flag = 1; - } - - if (model->BSIM4toxp <= 0.0) - { - wl_append_word(&wl, &wl, tprintf("Fatal: Toxp = %g is not positive.\n", model->BSIM4toxp)); - Fatal_Flag = 1; - } - - if (model->BSIM4eot <= 0.0) - { - wl_append_word(&wl, &wl, tprintf("Fatal: EOT = %g is not positive.\n", model->BSIM4eot)); - Fatal_Flag = 1; - } - if (model->BSIM4epsrgate < 0.0) - { - wl_append_word(&wl, &wl, tprintf("Fatal: Epsrgate = %g is not positive.\n", model->BSIM4epsrgate)); - Fatal_Flag = 1; - } - if (model->BSIM4epsrsub < 0.0) - { - wl_append_word(&wl, &wl, tprintf("Fatal: Epsrsub = %g is not positive.\n", model->BSIM4epsrsub)); - Fatal_Flag = 1; - } - if (model->BSIM4easub < 0.0) - { - wl_append_word(&wl, &wl, tprintf("Fatal: Easub = %g is not positive.\n", model->BSIM4easub)); - Fatal_Flag = 1; - } - if (model->BSIM4ni0sub <= 0.0) - { - wl_append_word(&wl, &wl, tprintf("Fatal: Easub = %g is not positive.\n", model->BSIM4ni0sub)); - Fatal_Flag = 1; - } - - if (model->BSIM4toxm <= 0.0) - { - wl_append_word(&wl, &wl, tprintf("Fatal: Toxm = %g is not positive.\n", model->BSIM4toxm)); - Fatal_Flag = 1; - } - if (model->BSIM4toxref <= 0.0) - { - wl_append_word(&wl, &wl, tprintf("Fatal: Toxref = %g is not positive.\n", model->BSIM4toxref)); - Fatal_Flag = 1; - } - - if (pParam->BSIM4lpe0 < -pParam->BSIM4leff) - { - wl_append_word(&wl, &wl, tprintf("Fatal: Lpe0 = %g is less than -Leff.\n", - pParam->BSIM4lpe0)); - Fatal_Flag = 1; - } - if (model->BSIM4lintnoi > pParam->BSIM4leff / 2) - { - wl_append_word(&wl, &wl, tprintf("Fatal: Lintnoi = %g is too large - Leff for noise is negative.\n", - model->BSIM4lintnoi)); - Fatal_Flag = 1; - } - if (pParam->BSIM4lpeb < -pParam->BSIM4leff) - { - wl_append_word(&wl, &wl, tprintf("Fatal: Lpeb = %g is less than -Leff.\n", - pParam->BSIM4lpeb)); - Fatal_Flag = 1; - } - if (pParam->BSIM4ndep <= 0.0) - { - wl_append_word(&wl, &wl, tprintf("Fatal: Ndep = %g is not positive.\n", - pParam->BSIM4ndep)); - Fatal_Flag = 1; - } - if (pParam->BSIM4phi <= 0.0) - { - wl_append_word(&wl, &wl, tprintf("Fatal: Phi = %g is not positive. Please check Phin and Ndep\n", - pParam->BSIM4phi)); - wl_append_word(&wl, &wl, tprintf(" Phin = %g Ndep = %g \n", - pParam->BSIM4phin, pParam->BSIM4ndep)); - Fatal_Flag = 1; - } - if (pParam->BSIM4nsub <= 0.0) - { - wl_append_word(&wl, &wl, tprintf("Fatal: Nsub = %g is not positive.\n", - pParam->BSIM4nsub)); - Fatal_Flag = 1; - } - if (pParam->BSIM4ngate < 0.0) - { - wl_append_word(&wl, &wl, tprintf("Fatal: Ngate = %g Ngate is not positive.\n", - pParam->BSIM4ngate)); - Fatal_Flag = 1; - } - if (pParam->BSIM4ngate > 1.e25) - { - wl_append_word(&wl, &wl, tprintf("Fatal: Ngate = %g Ngate is too high\n", - pParam->BSIM4ngate)); - Fatal_Flag = 1; - } - if (pParam->BSIM4xj <= 0.0) - { - wl_append_word(&wl, &wl, tprintf("Fatal: Xj = %g is not positive.\n", pParam->BSIM4xj)); - Fatal_Flag = 1; - } - - if (pParam->BSIM4dvt1 < 0.0) - { - wl_append_word(&wl, &wl, tprintf("Fatal: Dvt1 = %g is negative.\n", pParam->BSIM4dvt1)); - Fatal_Flag = 1; - } - - if (pParam->BSIM4dvt1w < 0.0) - { - wl_append_word(&wl, &wl, tprintf("Fatal: Dvt1w = %g is negative.\n", pParam->BSIM4dvt1w)); - Fatal_Flag = 1; - } - - if (pParam->BSIM4w0 == -pParam->BSIM4weff) - { - wl_append_word(&wl, &wl, tprintf("Fatal: (W0 + Weff) = 0 causing divided-by-zero.\n")); - Fatal_Flag = 1; - } - - if (pParam->BSIM4dsub < 0.0) - { - wl_append_word(&wl, &wl, tprintf("Fatal: Dsub = %g is negative.\n", pParam->BSIM4dsub)); - Fatal_Flag = 1; - } - if (pParam->BSIM4b1 == -pParam->BSIM4weff) - { - wl_append_word(&wl, &wl, tprintf("Fatal: (B1 + Weff) = 0 causing divided-by-zero.\n")); - Fatal_Flag = 1; - } - if (here->BSIM4u0temp <= 0.0) - { - wl_append_word(&wl, &wl, tprintf("Fatal: u0 at current temperature = %g is not positive.\n", - here->BSIM4u0temp)); - Fatal_Flag = 1; - } - - if (pParam->BSIM4delta < 0.0) - { - wl_append_word(&wl, &wl, tprintf("Fatal: Delta = %g is less than zero.\n", pParam->BSIM4delta)); - Fatal_Flag = 1; - } - - if (here->BSIM4vsattemp <= 0.0) - { - wl_append_word(&wl, &wl, tprintf("Fatal: Vsat at current temperature = %g is not positive.\n", - here->BSIM4vsattemp)); - Fatal_Flag = 1; - } - - if (pParam->BSIM4pclm <= 0.0) - { - wl_append_word(&wl, &wl, tprintf("Fatal: Pclm = %g is not positive.\n", pParam->BSIM4pclm)); - Fatal_Flag = 1; - } - - if (pParam->BSIM4drout < 0.0) - { - wl_append_word(&wl, &wl, tprintf("Fatal: Drout = %g is negative.\n", pParam->BSIM4drout)); - Fatal_Flag = 1; - } - - if (here->BSIM4m <= 0.0) - { - wl_append_word(&wl, &wl, tprintf("Fatal: multiplier = %g is not positive.\n", here->BSIM4m)); - Fatal_Flag = 1; - } - if (here->BSIM4nf < 1.0) - { - wl_append_word(&wl, &wl, tprintf("Fatal: Number of finger = %g is smaller than one.\n", here->BSIM4nf)); - Fatal_Flag = 1; - } - - if ((here->BSIM4sa > 0.0) && (here->BSIM4sb > 0.0) && - ((here->BSIM4nf == 1.0) || ((here->BSIM4nf > 1.0) && (here->BSIM4sd > 0.0)))) - { - if (model->BSIM4saref <= 0.0) - { - wl_append_word(&wl, &wl, tprintf("Fatal: SAref = %g is not positive.\n", model->BSIM4saref)); - Fatal_Flag = 1; - } - if (model->BSIM4sbref <= 0.0) - { - wl_append_word(&wl, &wl, tprintf("Fatal: SBref = %g is not positive.\n", model->BSIM4sbref)); - Fatal_Flag = 1; - } - } - - if ((here->BSIM4l + model->BSIM4xl) <= model->BSIM4xgl) - { - wl_append_word(&wl, &wl, tprintf("Fatal: The parameter xgl must be smaller than Ldrawn+XL.\n")); - Fatal_Flag = 1; - } - if (here->BSIM4ngcon < 1.0) - { - wl_append_word(&wl, &wl, tprintf("Fatal: The parameter ngcon cannot be smaller than one.\n")); - Fatal_Flag = 1; - } - if ((here->BSIM4ngcon != 1.0) && (here->BSIM4ngcon != 2.0)) - { - here->BSIM4ngcon = 1.0; - wl_append_word(&wl, &wl, tprintf("Warning: Ngcon must be equal to one or two; reset to 1.0.\n")); - } - - if (model->BSIM4gbmin < 1.0e-20) - { - wl_append_word(&wl, &wl, tprintf("Warning: Gbmin = %g is too small.\n", model->BSIM4gbmin)); - } - - /* Check saturation parameters */ - if (pParam->BSIM4fprout < 0.0) - { - wl_append_word(&wl, &wl, tprintf("Fatal: fprout = %g is negative.\n", pParam->BSIM4fprout)); - Fatal_Flag = 1; - } - if (pParam->BSIM4pdits < 0.0) - { - wl_append_word(&wl, &wl, tprintf("Fatal: pdits = %g is negative.\n", pParam->BSIM4pdits)); - Fatal_Flag = 1; - } - if (model->BSIM4pditsl < 0.0) - { - wl_append_word(&wl, &wl, tprintf("Fatal: pditsl = %g is negative.\n", model->BSIM4pditsl)); - Fatal_Flag = 1; - } - - /* Check gate current parameters */ - if (model->BSIM4igbMod) { - if (pParam->BSIM4nigbinv <= 0.0) - { - wl_append_word(&wl, &wl, tprintf("Fatal: nigbinv = %g is non-positive.\n", pParam->BSIM4nigbinv)); - Fatal_Flag = 1; - } - if (pParam->BSIM4nigbacc <= 0.0) - { - wl_append_word(&wl, &wl, tprintf("Fatal: nigbacc = %g is non-positive.\n", pParam->BSIM4nigbacc)); - Fatal_Flag = 1; - } - } - if (model->BSIM4igcMod) { - if (pParam->BSIM4nigc <= 0.0) - { - wl_append_word(&wl, &wl, tprintf("Fatal: nigc = %g is non-positive.\n", pParam->BSIM4nigc)); - Fatal_Flag = 1; - } - if (pParam->BSIM4poxedge <= 0.0) - { - wl_append_word(&wl, &wl, tprintf("Fatal: poxedge = %g is non-positive.\n", pParam->BSIM4poxedge)); - Fatal_Flag = 1; - } - if (pParam->BSIM4pigcd <= 0.0) - { - wl_append_word(&wl, &wl, tprintf("Fatal: pigcd = %g is non-positive.\n", pParam->BSIM4pigcd)); - Fatal_Flag = 1; - } - } - - /* Check capacitance parameters */ - if (pParam->BSIM4clc < 0.0) - { - wl_append_word(&wl, &wl, tprintf("Fatal: Clc = %g is negative.\n", pParam->BSIM4clc)); - Fatal_Flag = 1; - } - - /* Check overlap capacitance parameters */ - if (pParam->BSIM4ckappas < 0.02) - { - wl_append_word(&wl, &wl, tprintf("Warning: ckappas = %g is too small.\n", pParam->BSIM4ckappas)); - pParam->BSIM4ckappas = 0.02; - } - if (pParam->BSIM4ckappad < 0.02) - { - wl_append_word(&wl, &wl, tprintf("Warning: ckappad = %g is too small.\n", pParam->BSIM4ckappad)); - pParam->BSIM4ckappad = 0.02; - } - - if (model->BSIM4vtss < 0.0) - { - wl_append_word(&wl, &wl, tprintf("Fatal: Vtss = %g is negative.\n", - model->BSIM4vtss)); - Fatal_Flag = 1; - } - if (model->BSIM4vtsd < 0.0) - { - wl_append_word(&wl, &wl, tprintf("Fatal: Vtsd = %g is negative.\n", - model->BSIM4vtsd)); - Fatal_Flag = 1; - } - if (model->BSIM4vtssws < 0.0) - { - wl_append_word(&wl, &wl, tprintf("Fatal: Vtssws = %g is negative.\n", - model->BSIM4vtssws)); - Fatal_Flag = 1; - } - if (model->BSIM4vtsswd < 0.0) - { - wl_append_word(&wl, &wl, tprintf("Fatal: Vtsswd = %g is negative.\n", - model->BSIM4vtsswd)); - Fatal_Flag = 1; - } - if (model->BSIM4vtsswgs < 0.0) - { - wl_append_word(&wl, &wl, tprintf("Fatal: Vtsswgs = %g is negative.\n", - model->BSIM4vtsswgs)); - Fatal_Flag = 1; - } - if (model->BSIM4vtsswgd < 0.0) - { - wl_append_word(&wl, &wl, tprintf("Fatal: Vtsswgd = %g is negative.\n", - model->BSIM4vtsswgd)); - Fatal_Flag = 1; - } - - - if (model->BSIM4paramChk == 1) - { - /* Check L and W parameters */ - if (pParam->BSIM4leff <= 1.0e-9) - { - wl_append_word(&wl, &wl, tprintf("Warning: Leff = %g <= 1.0e-9. Recommended Leff >= 1e-8 \n", - pParam->BSIM4leff)); - } - - if (pParam->BSIM4leffCV <= 1.0e-9) - { - wl_append_word(&wl, &wl, tprintf("Warning: Leff for CV = %g <= 1.0e-9. Recommended LeffCV >=1e-8 \n", - pParam->BSIM4leffCV)); - } - - if (pParam->BSIM4weff <= 1.0e-9) - { - wl_append_word(&wl, &wl, tprintf("Warning: Weff = %g <= 1.0e-9. Recommended Weff >=1e-7 \n", - pParam->BSIM4weff)); - } - - if (pParam->BSIM4weffCV <= 1.0e-9) - { - wl_append_word(&wl, &wl, tprintf("Warning: Weff for CV = %g <= 1.0e-9. Recommended WeffCV >= 1e-7 \n", - pParam->BSIM4weffCV)); - } - - /* Check threshold voltage parameters */ - if (model->BSIM4toxe < 1.0e-10) - { - wl_append_word(&wl, &wl, tprintf("Warning: Toxe = %g is less than 1A. Recommended Toxe >= 5A\n", model->BSIM4toxe)); - } - if (model->BSIM4toxp < 1.0e-10) - { - wl_append_word(&wl, &wl, tprintf("Warning: Toxp = %g is less than 1A. Recommended Toxp >= 5A\n", model->BSIM4toxp)); - } - if (model->BSIM4toxm < 1.0e-10) - { - wl_append_word(&wl, &wl, tprintf("Warning: Toxm = %g is less than 1A. Recommended Toxm >= 5A\n", model->BSIM4toxm)); - } - - if (pParam->BSIM4ndep <= 1.0e12) - { - wl_append_word(&wl, &wl, tprintf("Warning: Ndep = %g may be too small.\n", - pParam->BSIM4ndep)); - } - else if (pParam->BSIM4ndep >= 1.0e21) - { - wl_append_word(&wl, &wl, tprintf("Warning: Ndep = %g may be too large.\n", - pParam->BSIM4ndep)); - } - - if (pParam->BSIM4nsub <= 1.0e14) - { - wl_append_word(&wl, &wl, tprintf("Warning: Nsub = %g may be too small.\n", - pParam->BSIM4nsub)); - } - else if (pParam->BSIM4nsub >= 1.0e21) - { - wl_append_word(&wl, &wl, tprintf("Warning: Nsub = %g may be too large.\n", - pParam->BSIM4nsub)); - } - - if ((pParam->BSIM4ngate > 0.0) && - (pParam->BSIM4ngate <= 1.e18)) - { - wl_append_word(&wl, &wl, tprintf("Warning: Ngate = %g is less than 1.E18cm^-3.\n", - pParam->BSIM4ngate)); - } - - if (pParam->BSIM4dvt0 < 0.0) - { - wl_append_word(&wl, &wl, tprintf("Warning: Dvt0 = %g is negative.\n", pParam->BSIM4dvt0)); - } - - if (fabs(1.0e-8 / (pParam->BSIM4w0 + pParam->BSIM4weff)) > 10.0) - { - wl_append_word(&wl, &wl, tprintf("Warning: (W0 + Weff) may be too small.\n")); - } - - /* Check subthreshold parameters */ - if (pParam->BSIM4nfactor < 0.0) - { - wl_append_word(&wl, &wl, tprintf("Warning: Nfactor = %g is negative.\n", pParam->BSIM4nfactor)); - } - if (pParam->BSIM4cdsc < 0.0) - { - wl_append_word(&wl, &wl, tprintf("Warning: Cdsc = %g is negative.\n", pParam->BSIM4cdsc)); - } - if (pParam->BSIM4cdscd < 0.0) - { - wl_append_word(&wl, &wl, tprintf("Warning: Cdscd = %g is negative.\n", pParam->BSIM4cdscd)); - } - /* Check DIBL parameters */ - if (here->BSIM4eta0 < 0.0) - { - wl_append_word(&wl, &wl, tprintf("Warning: Eta0 = %g is negative.\n", here->BSIM4eta0)); - } - - /* Check Abulk parameters */ - if (fabs(1.0e-8 / (pParam->BSIM4b1 + pParam->BSIM4weff)) > 10.0) - { - wl_append_word(&wl, &wl, tprintf("Warning: (B1 + Weff) may be too small.\n")); - } - - - /* Check Saturation parameters */ - if (pParam->BSIM4a2 < 0.01) - { - wl_append_word(&wl, &wl, tprintf("Warning: A2 = %g is too small. Set to 0.01.\n", - pParam->BSIM4a2)); - pParam->BSIM4a2 = 0.01; - } - else if (pParam->BSIM4a2 > 1.0) - { - wl_append_word(&wl, &wl, tprintf("Warning: A2 = %g is larger than 1. A2 is set to 1 and A1 is set to 0.\n", - pParam->BSIM4a2)); - pParam->BSIM4a2 = 1.0; - pParam->BSIM4a1 = 0.0; - } - - if (pParam->BSIM4prwg < 0.0) - { - wl_append_word(&wl, &wl, tprintf("Warning: Prwg = %g is negative. Set to zero.\n", - pParam->BSIM4prwg)); - pParam->BSIM4prwg = 0.0; - } - - if (pParam->BSIM4rdsw < 0.0) - { - wl_append_word(&wl, &wl, tprintf("Warning: Rdsw = %g is negative. Set to zero.\n", - pParam->BSIM4rdsw)); - pParam->BSIM4rdsw = 0.0; - pParam->BSIM4rds0 = 0.0; - } - - if (pParam->BSIM4rds0 < 0.0) - { - wl_append_word(&wl, &wl, tprintf("Warning: Rds at current temperature = %g is negative. Set to zero.\n", - pParam->BSIM4rds0)); - pParam->BSIM4rds0 = 0.0; - } - - if (pParam->BSIM4rdswmin < 0.0) - { - wl_append_word(&wl, &wl, tprintf("Warning: Rdswmin at current temperature = %g is negative. Set to zero.\n", - pParam->BSIM4rdswmin)); - pParam->BSIM4rdswmin = 0.0; - } - - if (pParam->BSIM4pscbe2 <= 0.0) - { - wl_append_word(&wl, &wl, tprintf("Warning: Pscbe2 = %g is not positive.\n", pParam->BSIM4pscbe2)); - } - - if (pParam->BSIM4vsattemp < 1.0e3) - { - wl_append_word(&wl, &wl, tprintf("Warning: Vsat at current temperature = %g may be too small.\n", pParam->BSIM4vsattemp)); - } - - if ((model->BSIM4lambdaGiven) && (pParam->BSIM4lambda > 0.0)) - { - if (pParam->BSIM4lambda > 1.0e-9) - { - wl_append_word(&wl, &wl, tprintf("Warning: Lambda = %g may be too large.\n", pParam->BSIM4lambda)); - } - } - - if ((model->BSIM4vtlGiven) && (pParam->BSIM4vtl > 0.0)) - { - if (pParam->BSIM4vtl < 6.0e4) - { - wl_append_word(&wl, &wl, tprintf("Warning: Thermal velocity vtl = %g may be too small.\n", pParam->BSIM4vtl)); - } - - if (pParam->BSIM4xn < 3.0) - { - wl_append_word(&wl, &wl, tprintf("Warning: back scattering coeff xn = %g is too small. Reset to 3.0 \n", pParam->BSIM4xn)); - pParam->BSIM4xn = 3.0; - } - - if (model->BSIM4lc < 0.0) - { - wl_append_word(&wl, &wl, tprintf("Warning: back scattering coeff lc = %g is too small. Reset to 0.0\n", model->BSIM4lc)); - pParam->BSIM4lc = 0.0; - } - } - - if (pParam->BSIM4pdibl1 < 0.0) - { - wl_append_word(&wl, &wl, tprintf("Warning: Pdibl1 = %g is negative.\n", pParam->BSIM4pdibl1)); - } - } - - if (pParam->BSIM4pdibl2 < 0.0) - { - wl_append_word(&wl, &wl, tprintf("Warning: Pdibl2 = %g is negative.\n", pParam->BSIM4pdibl2)); - } - - /* Check stress effect parameters */ - if ((here->BSIM4sa > 0.0) && (here->BSIM4sb > 0.0) && - ((here->BSIM4nf == 1.0) || ((here->BSIM4nf > 1.0) && (here->BSIM4sd > 0.0)))) - { - if (model->BSIM4lodk2 <= 0.0) - { - wl_append_word(&wl, &wl, tprintf("Warning: LODK2 = %g is not positive.\n", model->BSIM4lodk2)); - } - if (model->BSIM4lodeta0 <= 0.0) - { - wl_append_word(&wl, &wl, tprintf("Warning: LODETA0 = %g is not positive.\n", model->BSIM4lodeta0)); - } - } - -/* Check gate resistance parameters */ - if (here->BSIM4rgateMod == 1) - { if (model->BSIM4rshg <= 0.0) - wl_append_word(&wl, &wl, tprintf("Warning: rshg should be positive for rgateMod = 1.\n")); - } - else if (here->BSIM4rgateMod == 2) - { if (model->BSIM4rshg <= 0.0) - wl_append_word(&wl, &wl, tprintf("Warning: rshg <= 0.0 for rgateMod = 2.\n")); - else if (pParam->BSIM4xrcrg1 <= 0.0) - wl_append_word(&wl, &wl, tprintf("Warning: xrcrg1 <= 0.0 for rgateMod = 2.\n")); - } - if (here->BSIM4rgateMod == 3) - { if (model->BSIM4rshg <= 0.0) - wl_append_word(&wl, &wl, tprintf("Warning: rshg should be positive for rgateMod = 3.\n")); - else if (pParam->BSIM4xrcrg1 <= 0.0) - wl_append_word(&wl, &wl, tprintf("Warning: xrcrg1 should be positive for rgateMod = 3.\n")); - } - - /* Check body resistance parameters */ - if (model->BSIM4rbps0 <= 0.0) - { wl_append_word(&wl, &wl, tprintf("Fatal: RBPS0 = %g is not positive.\n", model->BSIM4rbps0)); - Fatal_Flag = 1; - } - if (model->BSIM4rbpd0 <= 0.0) - { wl_append_word(&wl, &wl, tprintf("Fatal: RBPD0 = %g is not positive.\n", model->BSIM4rbpd0)); - Fatal_Flag = 1; - } - if (model->BSIM4rbpbx0 <= 0.0) - { wl_append_word(&wl, &wl, tprintf("Fatal: RBPBX0 = %g is not positive.\n", model->BSIM4rbpbx0)); - Fatal_Flag = 1; - } - if (model->BSIM4rbpby0 <= 0.0) - { wl_append_word(&wl, &wl, tprintf("Fatal: RBPBY0 = %g is not positive.\n", model->BSIM4rbpby0)); - Fatal_Flag = 1; - } - if (model->BSIM4rbdbx0 <= 0.0) - { wl_append_word(&wl, &wl, tprintf("Fatal: RBDBX0 = %g is not positive.\n", model->BSIM4rbdbx0)); - Fatal_Flag = 1; - } - if (model->BSIM4rbdby0 <= 0.0) - { wl_append_word(&wl, &wl, tprintf("Fatal: RBDBY0 = %g is not positive.\n", model->BSIM4rbdby0)); - Fatal_Flag = 1; - } - if (model->BSIM4rbsbx0 <= 0.0) - { wl_append_word(&wl, &wl, tprintf("Fatal: RBSBX0 = %g is not positive.\n", model->BSIM4rbsbx0)); - Fatal_Flag = 1; - } - if (model->BSIM4rbsby0 <= 0.0) - { wl_append_word(&wl, &wl, tprintf("Fatal: RBSBY0 = %g is not positive.\n", model->BSIM4rbsby0)); - Fatal_Flag = 1; - } - - /* Check capacitance parameters */ - if (pParam->BSIM4noff < 0.1) - { - wl_append_word(&wl, &wl, tprintf("Warning: Noff = %g is too small.\n", pParam->BSIM4noff)); - } - - if (pParam->BSIM4voffcv < -0.5) - { - wl_append_word(&wl, &wl, tprintf("Warning: Voffcv = %g is too small.\n", pParam->BSIM4voffcv)); - } - - if (pParam->BSIM4moin < 5.0) - { - wl_append_word(&wl, &wl, tprintf("Warning: Moin = %g is too small.\n", pParam->BSIM4moin)); - } - if (pParam->BSIM4moin > 25.0) - { - wl_append_word(&wl, &wl, tprintf("Warning: Moin = %g is too large.\n", pParam->BSIM4moin)); - } - if (model->BSIM4capMod == 2) { - if (pParam->BSIM4acde < 0.1) - { - wl_append_word(&wl, &wl, tprintf("Warning: Acde = %g is too small.\n", pParam->BSIM4acde)); - } - if (pParam->BSIM4acde > 1.6) - { - wl_append_word(&wl, &wl, tprintf("Warning: Acde = %g is too large.\n", pParam->BSIM4acde)); - } - } - - /* Check overlap capacitance parameters */ - if (model->BSIM4cgdo < 0.0) - { - wl_append_word(&wl, &wl, tprintf("Warning: cgdo = %g is negative. Set to zero.\n", model->BSIM4cgdo)); - model->BSIM4cgdo = 0.0; - } - if (model->BSIM4cgso < 0.0) - { - wl_append_word(&wl, &wl, tprintf("Warning: cgso = %g is negative. Set to zero.\n", model->BSIM4cgso)); - model->BSIM4cgso = 0.0; - } - if (model->BSIM4cgbo < 0.0) - { - wl_append_word(&wl, &wl, tprintf("Warning: cgbo = %g is negative. Set to zero.\n", model->BSIM4cgbo)); - model->BSIM4cgbo = 0.0; - } - if (model->BSIM4tnoiMod == 1){ - wl_append_word(&wl, &wl, tprintf("Warning: TNOIMOD=1 is not supported and may be removed from future version.\n")); - } - - if ((strcmp(model->BSIM4version, "4.8.1")) && (strncmp(model->BSIM4version, "4.81", 4))) { - /* v4.7 */ - if (model->BSIM4tnoiMod == 1 || model->BSIM4tnoiMod == 2) { - if (model->BSIM4tnoia < 0.0) - { - wl_append_word(&wl, &wl, tprintf("Warning: tnoia = %g is negative. Set to zero.\n", model->BSIM4tnoia)); - model->BSIM4tnoia = 0.0; - } - if (model->BSIM4tnoib < 0.0) - { - wl_append_word(&wl, &wl, tprintf("Warning: tnoib = %g is negative. Set to zero.\n", model->BSIM4tnoib)); - model->BSIM4tnoib = 0.0; - } - - if (model->BSIM4rnoia < 0.0) - { - wl_append_word(&wl, &wl, tprintf("Warning: rnoia = %g is negative. Set to zero.\n", model->BSIM4rnoia)); - model->BSIM4rnoia = 0.0; - } - if (model->BSIM4rnoib < 0.0) - { - wl_append_word(&wl, &wl, tprintf("Warning: rnoib = %g is negative. Set to zero.\n", model->BSIM4rnoib)); - model->BSIM4rnoib = 0.0; - } - } - - /* v4.7 */ - if (model->BSIM4tnoiMod == 2) { - if (model->BSIM4tnoic < 0.0) { - wl_append_word(&wl, &wl, tprintf("Warning: tnoic = %g is negative. Set to zero.\n", model->BSIM4tnoic)); - model->BSIM4tnoic = 0.0; - } - if (model->BSIM4rnoic < 0.0) { - wl_append_word(&wl, &wl, tprintf("Warning: rnoic = %g is negative. Set to zero.\n", model->BSIM4rnoic)); - model->BSIM4rnoic = 0.0; - } - } - } - else - { - if (model->BSIM4tnoiMod == 1){ - if (model->BSIM4tnoia < 0.0) { - wl_append_word(&wl, &wl, tprintf("Warning: tnoia = %g is negative. Set to zero.\n", model->BSIM4tnoia)); - model->BSIM4tnoia = 0.0; - } - if (model->BSIM4tnoib < 0.0) { - wl_append_word(&wl, &wl, tprintf("Warning: tnoib = %g is negative. Set to zero.\n", model->BSIM4tnoib)); - model->BSIM4tnoib = 0.0; - } - if (model->BSIM4rnoia < 0.0) { - wl_append_word(&wl, &wl, tprintf("Warning: rnoia = %g is negative. Set to zero.\n", model->BSIM4rnoia)); - model->BSIM4rnoia = 0.0; - } - if (model->BSIM4rnoib < 0.0) { - wl_append_word(&wl, &wl, tprintf("Warning: rnoib = %g is negative. Set to zero.\n", model->BSIM4rnoib)); - model->BSIM4rnoib = 0.0; - } - } - } - - /* Limits of Njs and Njd modified in BSIM4.7 */ - if (model->BSIM4SjctEmissionCoeff < 0.1) { - wl_append_word(&wl, &wl, tprintf("Warning: Njs = %g is less than 0.1. Setting Njs to 0.1.\n", model->BSIM4SjctEmissionCoeff)); - model->BSIM4SjctEmissionCoeff = 0.1; - } - else if (model->BSIM4SjctEmissionCoeff < 0.7) { - wl_append_word(&wl, &wl, tprintf("Warning: Njs = %g is less than 0.7.\n", model->BSIM4SjctEmissionCoeff)); - } - if (model->BSIM4DjctEmissionCoeff < 0.1) - { - wl_append_word(&wl, &wl, tprintf("Warning: Njd = %g is less than 0.1. Setting Njd to 0.1.\n", model->BSIM4DjctEmissionCoeff)); - model->BSIM4DjctEmissionCoeff = 0.1; - } - else if (model->BSIM4DjctEmissionCoeff < 0.7) { - wl_append_word(&wl, &wl, tprintf("Warning: Njd = %g is less than 0.7.\n", model->BSIM4DjctEmissionCoeff)); - } - - if (model->BSIM4njtsstemp < 0.0) { - wl_append_word(&wl, &wl, tprintf("Warning: Njts = %g is negative at temperature = %g.\n", - model->BSIM4njtsstemp, ckt->CKTtemp)); - } - if (model->BSIM4njtsswstemp < 0.0) { - wl_append_word(&wl, &wl, tprintf("Warning: Njtssw = %g is negative at temperature = %g.\n", - model->BSIM4njtsswstemp, ckt->CKTtemp)); - } - if (model->BSIM4njtsswgstemp < 0.0) { - wl_append_word(&wl, &wl, tprintf("Warning: Njtsswg = %g is negative at temperature = %g.\n", - model->BSIM4njtsswgstemp, ckt->CKTtemp)); - } - - if (model->BSIM4njtsdGiven && model->BSIM4njtsdtemp < 0.0) - { - wl_append_word(&wl, &wl, tprintf("Warning: Njtsd = %g is negative at temperature = %g.\n", - model->BSIM4njtsdtemp, ckt->CKTtemp)); - } - if (model->BSIM4njtsswdGiven && model->BSIM4njtsswdtemp < 0.0) - { - wl_append_word(&wl, &wl, tprintf("Warning: Njtsswd = %g is negative at temperature = %g.\n", - model->BSIM4njtsswdtemp, ckt->CKTtemp)); - } - if (model->BSIM4njtsswgdGiven && model->BSIM4njtsswgdtemp < 0.0) - { - wl_append_word(&wl, &wl, tprintf("Warning: Njtsswgd = %g is negative at temperature = %g.\n", - model->BSIM4njtsswgdtemp, ckt->CKTtemp)); - } - - if (model->BSIM4ntnoi < 0.0) - { - wl_append_word(&wl, &wl, tprintf("Warning: ntnoi = %g is negative. Set to zero.\n", model->BSIM4ntnoi)); - model->BSIM4ntnoi = 0.0; - } - - /* diode model */ - if (model->BSIM4SbulkJctBotGradingCoeff >= 0.99) - { - wl_append_word(&wl, &wl, tprintf("Warning: MJS = %g is too big. Set to 0.99.\n", model->BSIM4SbulkJctBotGradingCoeff)); - model->BSIM4SbulkJctBotGradingCoeff = 0.99; - } - if (model->BSIM4SbulkJctSideGradingCoeff >= 0.99) - { - wl_append_word(&wl, &wl, tprintf("Warning: MJSWS = %g is too big. Set to 0.99.\n", model->BSIM4SbulkJctSideGradingCoeff)); - model->BSIM4SbulkJctSideGradingCoeff = 0.99; - } - if (model->BSIM4SbulkJctGateSideGradingCoeff >= 0.99) - { - wl_append_word(&wl, &wl, tprintf("Warning: MJSWGS = %g is too big. Set to 0.99.\n", model->BSIM4SbulkJctGateSideGradingCoeff)); - model->BSIM4SbulkJctGateSideGradingCoeff = 0.99; - } - - if (model->BSIM4DbulkJctBotGradingCoeff >= 0.99) - { - wl_append_word(&wl, &wl, tprintf("Warning: MJD = %g is too big. Set to 0.99.\n", model->BSIM4DbulkJctBotGradingCoeff)); - model->BSIM4DbulkJctBotGradingCoeff = 0.99; - } - if (model->BSIM4DbulkJctSideGradingCoeff >= 0.99) - { - wl_append_word(&wl, &wl, tprintf("Warning: MJSWD = %g is too big. Set to 0.99.\n", model->BSIM4DbulkJctSideGradingCoeff)); - model->BSIM4DbulkJctSideGradingCoeff = 0.99; - } - if (model->BSIM4DbulkJctGateSideGradingCoeff >= 0.99) - { - wl_append_word(&wl, &wl, tprintf("Warning: MJSWGD = %g is too big. Set to 0.99.\n", model->BSIM4DbulkJctGateSideGradingCoeff)); - model->BSIM4DbulkJctGateSideGradingCoeff = 0.99; - } - if (model->BSIM4wpemod == 1) - { - if (model->BSIM4scref <= 0.0) - { - wl_append_word(&wl, &wl, tprintf("Warning: SCREF = %g is not positive. Set to 1e-6.\n", model->BSIM4scref)); - model->BSIM4scref = 1e-6; - } - if (here->BSIM4sca < 0.0) - { - wl_append_word(&wl, &wl, tprintf("Warning: SCA = %g is negative. Set to 0.0.\n", here->BSIM4sca)); - here->BSIM4sca = 0.0; - } - if (here->BSIM4scb < 0.0) - { - wl_append_word(&wl, &wl, tprintf("Warning: SCB = %g is negative. Set to 0.0.\n", here->BSIM4scb)); - here->BSIM4scb = 0.0; - } - if (here->BSIM4scc < 0.0) - { - wl_append_word(&wl, &wl, tprintf("Warning: SCC = %g is negative. Set to 0.0.\n", here->BSIM4scc)); - here->BSIM4scc = 0.0; - } - if (here->BSIM4sc < 0.0) - { - wl_append_word(&wl, &wl, tprintf("Warning: SC = %g is negative. Set to 0.0.\n", here->BSIM4sc)); - here->BSIM4sc = 0.0; - } - } - - if (wlstart->wl_next) { - if ((fplog = fopen("bsim4.out", "w")) != NULL) { - while (wlstart) { - fprintf(fplog, "%s", wlstart->wl_word); - fprintf(stderr, "%s", wlstart->wl_word); - wlstart = wlstart->wl_next; - } - fclose(fplog); - } - else { - while (wlstart) { - fprintf(stderr, "%s", wlstart->wl_word); - wlstart = wlstart->wl_next; - } - } - } - - wl_free(wlstart); - - return(Fatal_Flag); -} - diff --git a/src/spicelib/devices/bsim4/b4cvtest.c b/src/spicelib/devices/bsim4/b4cvtest.c deleted file mode 100644 index 47551ed84..000000000 --- a/src/spicelib/devices/bsim4/b4cvtest.c +++ /dev/null @@ -1,245 +0,0 @@ -/* ****************************************************************************** - * BSIM4 4.8.1 released by Chetan Kumar Dabhi 2/15/2017 * - * BSIM4 Model Equations * - ****************************************************************************** - - ****************************************************************************** - * Copyright 2017 Regents of the University of California. * - * All rights reserved. * - * * - * Project Director: Prof. Chenming Hu. * - * Authors: Gary W. Ng, Weidong Liu, Xuemei Xi, Mohan Dunga, Wenwei Yang * - * Ali Niknejad, Shivendra Singh Parihar, Chetan Kumar Dabhi * - * Yogesh Singh Chauhan, Sayeef Salahuddin, Chenming Hu * - ****************************************************************************** - - ****************************************************************************** - * CMC In-Code Statement * - * * - * The Developer agrees that the following statement will appear in the * - * model code that has been adopted as a CMC Standard. * - * * - * Software is distributed as is, completely without warranty or service * - * support. The University of California and its employees are not liable * - * for the condition or performance of the software. * - * * - * The University of California owns the copyright and grants users a * - * perpetual, irrevocable, worldwide, non-exclusive, royalty-free license * - * with respect to the software as set forth below. * - * * - * The University of California hereby disclaims all implied warranties. * - * * - * The University of California grants the users the right to modify, * - * copy, and redistribute the software and documentation, both within * - * the user's organization and externally, subject to the following * - * restrictions: * - * * - * 1. The users agree not to charge for the University of California code * - * itself but may charge for additions, extensions, or support. * - * * - * 2. In any product based on the software, the users agree to * - * acknowledge the University of California that developed the * - * software. This acknowledgment shall appear in the product * - * documentation. * - * * - * 3. Redistributions to others of source code and documentation must * - * retain the copyright notice, disclaimer, and list of conditions. * - * * - * 4. Redistributions to others in binary form must reproduce the * - * copyright notice, disclaimer, and list of conditions in the * - * documentation and/or other materials provided with the * - * distribution. * - * * - * Agreed to on ______Feb. 15, 2017______________ * - * * - * By: ____University of California, Berkeley___ * - * ____Chenming Hu__________________________ * - * ____Professor in Graduate School ________ * - * * - ****************************************************************************** */ - -#include "ngspice/ngspice.h" -#include "ngspice/cktdefs.h" -#include "bsim4def.h" -#include "ngspice/trandefs.h" -#include "ngspice/const.h" -#include "ngspice/devdefs.h" -#include "ngspice/sperror.h" -#include "ngspice/suffix.h" - - -int -BSIM4convTest( -GENmodel *inModel, -CKTcircuit *ckt) -{ -BSIM4model *model = (BSIM4model*)inModel; -BSIM4instance *here; -double delvbd, delvbs, delvds, delvgd, delvgs; -double delvdbd, delvsbs; -double delvbd_jct, delvbs_jct; -double vds, vgs, vgd, vgdo, vbs, vbd; -double vdbd, vdbs, vsbs; -double cbhat, cdhat, Idtot, Ibtot; -double vses, vdes, vdedo, delvses, delvded, delvdes; -double Isestot, cseshat, Idedtot, cdedhat; -double Igstot, cgshat, Igdtot, cgdhat, Igbtot, cgbhat; -double tol0, tol1, tol2, tol3, tol4, tol5, tol6; - - for (; model != NULL; model = BSIM4nextModel(model)) - { for (here = BSIM4instances(model); here != NULL ; - here=BSIM4nextInstance(here)) - { - vds = model->BSIM4type - * (*(ckt->CKTrhsOld + here->BSIM4dNodePrime) - - *(ckt->CKTrhsOld + here->BSIM4sNodePrime)); - vgs = model->BSIM4type - * (*(ckt->CKTrhsOld + here->BSIM4gNodePrime) - - *(ckt->CKTrhsOld + here->BSIM4sNodePrime)); - vbs = model->BSIM4type - * (*(ckt->CKTrhsOld + here->BSIM4bNodePrime) - - *(ckt->CKTrhsOld + here->BSIM4sNodePrime)); - vdbs = model->BSIM4type - * (*(ckt->CKTrhsOld + here->BSIM4dbNode) - - *(ckt->CKTrhsOld + here->BSIM4sNodePrime)); - vsbs = model->BSIM4type - * (*(ckt->CKTrhsOld + here->BSIM4sbNode) - - *(ckt->CKTrhsOld + here->BSIM4sNodePrime)); - vses = model->BSIM4type - * (*(ckt->CKTrhsOld + here->BSIM4sNode) - - *(ckt->CKTrhsOld + here->BSIM4sNodePrime)); - vdes = model->BSIM4type - * (*(ckt->CKTrhsOld + here->BSIM4dNode) - - *(ckt->CKTrhsOld + here->BSIM4sNodePrime)); - - vgdo = *(ckt->CKTstate0 + here->BSIM4vgs) - - *(ckt->CKTstate0 + here->BSIM4vds); - vbd = vbs - vds; - vdbd = vdbs - vds; - vgd = vgs - vds; - - delvbd = vbd - *(ckt->CKTstate0 + here->BSIM4vbd); - delvdbd = vdbd - *(ckt->CKTstate0 + here->BSIM4vdbd); - delvgd = vgd - vgdo; - - delvds = vds - *(ckt->CKTstate0 + here->BSIM4vds); - delvgs = vgs - *(ckt->CKTstate0 + here->BSIM4vgs); - delvbs = vbs - *(ckt->CKTstate0 + here->BSIM4vbs); - delvsbs = vsbs - *(ckt->CKTstate0 + here->BSIM4vsbs); - - delvses = vses - (*(ckt->CKTstate0 + here->BSIM4vses)); - vdedo = *(ckt->CKTstate0 + here->BSIM4vdes) - - *(ckt->CKTstate0 + here->BSIM4vds); - delvdes = vdes - *(ckt->CKTstate0 + here->BSIM4vdes); - delvded = vdes - vds - vdedo; - - delvbd_jct = (!here->BSIM4rbodyMod) ? delvbd : delvdbd; - delvbs_jct = (!here->BSIM4rbodyMod) ? delvbs : delvsbs; - - if (here->BSIM4mode >= 0) - { Idtot = here->BSIM4cd + here->BSIM4csub - here->BSIM4cbd - + here->BSIM4Igidl; - cdhat = Idtot - here->BSIM4gbd * delvbd_jct - + (here->BSIM4gmbs + here->BSIM4gbbs + here->BSIM4ggidlb) * delvbs - + (here->BSIM4gm + here->BSIM4gbgs + here->BSIM4ggidlg) * delvgs - + (here->BSIM4gds + here->BSIM4gbds + here->BSIM4ggidld) * delvds; - - Igstot = here->BSIM4Igs + here->BSIM4Igcs; - cgshat = Igstot + (here->BSIM4gIgsg + here->BSIM4gIgcsg) * delvgs - + here->BSIM4gIgcsd * delvds + here->BSIM4gIgcsb * delvbs; - - Igdtot = here->BSIM4Igd + here->BSIM4Igcd; - cgdhat = Igdtot + here->BSIM4gIgdg * delvgd + here->BSIM4gIgcdg * delvgs - + here->BSIM4gIgcdd * delvds + here->BSIM4gIgcdb * delvbs; - - Igbtot = here->BSIM4Igb; - cgbhat = here->BSIM4Igb + here->BSIM4gIgbg * delvgs + here->BSIM4gIgbd - * delvds + here->BSIM4gIgbb * delvbs; - } - else - { Idtot = here->BSIM4cd + here->BSIM4cbd - here->BSIM4Igidl; /* bugfix */ - cdhat = Idtot + here->BSIM4gbd * delvbd_jct + here->BSIM4gmbs - * delvbd + here->BSIM4gm * delvgd - - (here->BSIM4gds + here->BSIM4ggidls) * delvds - - here->BSIM4ggidlg * delvgs - here->BSIM4ggidlb * delvbs; - - Igstot = here->BSIM4Igs + here->BSIM4Igcd; - cgshat = Igstot + here->BSIM4gIgsg * delvgs + here->BSIM4gIgcdg * delvgd - - here->BSIM4gIgcdd * delvds + here->BSIM4gIgcdb * delvbd; - - Igdtot = here->BSIM4Igd + here->BSIM4Igcs; - cgdhat = Igdtot + (here->BSIM4gIgdg + here->BSIM4gIgcsg) * delvgd - - here->BSIM4gIgcsd * delvds + here->BSIM4gIgcsb * delvbd; - - Igbtot = here->BSIM4Igb; - cgbhat = here->BSIM4Igb + here->BSIM4gIgbg * delvgd - here->BSIM4gIgbd - * delvds + here->BSIM4gIgbb * delvbd; - } - - Isestot = here->BSIM4gstot * (*(ckt->CKTstate0 + here->BSIM4vses)); - cseshat = Isestot + here->BSIM4gstot * delvses - + here->BSIM4gstotd * delvds + here->BSIM4gstotg * delvgs - + here->BSIM4gstotb * delvbs; - - Idedtot = here->BSIM4gdtot * vdedo; - cdedhat = Idedtot + here->BSIM4gdtot * delvded - + here->BSIM4gdtotd * delvds + here->BSIM4gdtotg * delvgs - + here->BSIM4gdtotb * delvbs; - - /* - * Check convergence - */ - - if ((here->BSIM4off == 0) || (!(ckt->CKTmode & MODEINITFIX))) - { tol0 = ckt->CKTreltol * MAX(fabs(cdhat), fabs(Idtot)) - + ckt->CKTabstol; - tol1 = ckt->CKTreltol * MAX(fabs(cseshat), fabs(Isestot)) - + ckt->CKTabstol; - tol2 = ckt->CKTreltol * MAX(fabs(cdedhat), fabs(Idedtot)) - + ckt->CKTabstol; - tol3 = ckt->CKTreltol * MAX(fabs(cgshat), fabs(Igstot)) - + ckt->CKTabstol; - tol4 = ckt->CKTreltol * MAX(fabs(cgdhat), fabs(Igdtot)) - + ckt->CKTabstol; - tol5 = ckt->CKTreltol * MAX(fabs(cgbhat), fabs(Igbtot)) - + ckt->CKTabstol; - - if ((fabs(cdhat - Idtot) >= tol0) || (fabs(cseshat - Isestot) >= tol1) - || (fabs(cdedhat - Idedtot) >= tol2)) - { ckt->CKTnoncon++; - return(OK); - } - - if ((fabs(cgshat - Igstot) >= tol3) || (fabs(cgdhat - Igdtot) >= tol4) - || (fabs(cgbhat - Igbtot) >= tol5)) - { ckt->CKTnoncon++; - return(OK); - } - - Ibtot = here->BSIM4cbs + here->BSIM4cbd - - here->BSIM4Igidl - here->BSIM4Igisl - here->BSIM4csub; - if (here->BSIM4mode >= 0) - { cbhat = Ibtot + here->BSIM4gbd * delvbd_jct - + here->BSIM4gbs * delvbs_jct - (here->BSIM4gbbs + here->BSIM4ggidlb) - * delvbs - (here->BSIM4gbgs + here->BSIM4ggidlg) * delvgs - - (here->BSIM4gbds + here->BSIM4ggidld) * delvds - - here->BSIM4ggislg * delvgd - here->BSIM4ggislb* delvbd + here->BSIM4ggisls * delvds ; - } - else - { cbhat = Ibtot + here->BSIM4gbs * delvbs_jct + here->BSIM4gbd - * delvbd_jct - (here->BSIM4gbbs + here->BSIM4ggislb) * delvbd - - (here->BSIM4gbgs + here->BSIM4ggislg) * delvgd - + (here->BSIM4gbds + here->BSIM4ggisld - here->BSIM4ggidls) * delvds - - here->BSIM4ggidlg * delvgs - here->BSIM4ggidlb * delvbs; - } - tol6 = ckt->CKTreltol * MAX(fabs(cbhat), - fabs(Ibtot)) + ckt->CKTabstol; - if (fabs(cbhat - Ibtot) > tol6) - { ckt->CKTnoncon++; - return(OK); - } - } - } - } - return(OK); -} diff --git a/src/spicelib/devices/bsim4/b4geo.c b/src/spicelib/devices/bsim4/b4geo.c deleted file mode 100644 index 18314fd9f..000000000 --- a/src/spicelib/devices/bsim4/b4geo.c +++ /dev/null @@ -1,443 +0,0 @@ -/* ****************************************************************************** - * BSIM4 4.8.1 released by Chetan Kumar Dabhi 2/15/2017 * - * BSIM4 Model Equations * - ****************************************************************************** - - ****************************************************************************** - * Copyright 2017 Regents of the University of California. * - * All rights reserved. * - * * - * Project Director: Prof. Chenming Hu. * - * Authors: Gary W. Ng, Weidong Liu, Xuemei Xi, Mohan Dunga, Wenwei Yang * - * Ali Niknejad, Shivendra Singh Parihar, Chetan Kumar Dabhi * - * Yogesh Singh Chauhan, Sayeef Salahuddin, Chenming Hu * - ****************************************************************************** - - ****************************************************************************** - * CMC In-Code Statement * - * * - * The Developer agrees that the following statement will appear in the * - * model code that has been adopted as a CMC Standard. * - * * - * Software is distributed as is, completely without warranty or service * - * support. The University of California and its employees are not liable * - * for the condition or performance of the software. * - * * - * The University of California owns the copyright and grants users a * - * perpetual, irrevocable, worldwide, non-exclusive, royalty-free license * - * with respect to the software as set forth below. * - * * - * The University of California hereby disclaims all implied warranties. * - * * - * The University of California grants the users the right to modify, * - * copy, and redistribute the software and documentation, both within * - * the user's organization and externally, subject to the following * - * restrictions: * - * * - * 1. The users agree not to charge for the University of California code * - * itself but may charge for additions, extensions, or support. * - * * - * 2. In any product based on the software, the users agree to * - * acknowledge the University of California that developed the * - * software. This acknowledgment shall appear in the product * - * documentation. * - * * - * 3. Redistributions to others of source code and documentation must * - * retain the copyright notice, disclaimer, and list of conditions. * - * * - * 4. Redistributions to others in binary form must reproduce the * - * copyright notice, disclaimer, and list of conditions in the * - * documentation and/or other materials provided with the * - * distribution. * - * * - * Agreed to on ______Feb. 15, 2017______________ * - * * - * By: ____University of California, Berkeley___ * - * ____Chenming Hu__________________________ * - * ____Professor in Graduate School ________ * - * * - ****************************************************************************** */ - -#include "ngspice/ngspice.h" -#include "bsim4def.h" - - -/* - * WDLiu: - * This subrutine is a special module to process the geometry dependent - * parasitics for BSIM4, which calculates Ps, Pd, As, Ad, and Rs and Rd - * for multi-fingers and varous GEO and RGEO options. - */ - -static int -BSIM4NumFingerDiff( -double nf, -int minSD, -double *nuIntD, double *nuEndD, double *nuIntS, double *nuEndS) -{ -int NF; - NF = (int)nf; - if ((NF%2) != 0) - { *nuEndD = *nuEndS = 1.0; - *nuIntD = *nuIntS = 2.0 * MAX((nf - 1.0) / 2.0, 0.0); - } - else - { if (minSD == 1) /* minimize # of source */ - { *nuEndD = 2.0; - *nuIntD = 2.0 * MAX((nf / 2.0 - 1.0), 0.0); - *nuEndS = 0.0; - *nuIntS = nf; - } - else - { *nuEndD = 0.0; - *nuIntD = nf; - *nuEndS = 2.0; - *nuIntS = 2.0 * MAX((nf / 2.0 - 1.0), 0.0); - } - } -return 0; -} - - -int -BSIM4PAeffGeo( -double nf, -int geo, int minSD, -double Weffcj, double DMCG, double DMCI, double DMDG, -double *Ps, double *Pd, double *As, double *Ad) -{ -double T0, T1, T2; -double ADiso, ADsha, ADmer, ASiso, ASsha, ASmer; -double PDiso, PDsha, PDmer, PSiso, PSsha, PSmer; -double nuIntD = 0.0, nuEndD = 0.0, nuIntS = 0.0, nuEndS = 0.0; - - if (geo < 9) /* For geo = 9 and 10, the numbers of S/D diffusions already known */ - BSIM4NumFingerDiff(nf, minSD, &nuIntD, &nuEndD, &nuIntS, &nuEndS); - - T0 = DMCG + DMCI; - T1 = DMCG + DMCG; - T2 = DMDG + DMDG; - - PSiso = PDiso = T0 + T0 + Weffcj; - PSsha = PDsha = T1; - PSmer = PDmer = T2; - - ASiso = ADiso = T0 * Weffcj; - ASsha = ADsha = DMCG * Weffcj; - ASmer = ADmer = DMDG * Weffcj; - - switch(geo) - { case 0: - *Ps = nuEndS * PSiso + nuIntS * PSsha; - *Pd = nuEndD * PDiso + nuIntD * PDsha; - *As = nuEndS * ASiso + nuIntS * ASsha; - *Ad = nuEndD * ADiso + nuIntD * ADsha; - break; - case 1: - *Ps = nuEndS * PSiso + nuIntS * PSsha; - *Pd = (nuEndD + nuIntD) * PDsha; - *As = nuEndS * ASiso + nuIntS * ASsha; - *Ad = (nuEndD + nuIntD) * ADsha; - break; - case 2: - *Ps = (nuEndS + nuIntS) * PSsha; - *Pd = nuEndD * PDiso + nuIntD * PDsha; - *As = (nuEndS + nuIntS) * ASsha; - *Ad = nuEndD * ADiso + nuIntD * ADsha; - break; - case 3: - *Ps = (nuEndS + nuIntS) * PSsha; - *Pd = (nuEndD + nuIntD) * PDsha; - *As = (nuEndS + nuIntS) * ASsha; - *Ad = (nuEndD + nuIntD) * ADsha; - break; - case 4: - *Ps = nuEndS * PSiso + nuIntS * PSsha; - *Pd = nuEndD * PDmer + nuIntD * PDsha; - *As = nuEndS * ASiso + nuIntS * ASsha; - *Ad = nuEndD * ADmer + nuIntD * ADsha; - break; - case 5: - *Ps = (nuEndS + nuIntS) * PSsha; - *Pd = nuEndD * PDmer + nuIntD * PDsha; - *As = (nuEndS + nuIntS) * ASsha; - *Ad = nuEndD * ADmer + nuIntD * ADsha; - break; - case 6: - *Ps = nuEndS * PSmer + nuIntS * PSsha; - *Pd = nuEndD * PDiso + nuIntD * PDsha; - *As = nuEndS * ASmer + nuIntS * ASsha; - *Ad = nuEndD * ADiso + nuIntD * ADsha; - break; - case 7: - *Ps = nuEndS * PSmer + nuIntS * PSsha; - *Pd = (nuEndD + nuIntD) * PDsha; - *As = nuEndS * ASmer + nuIntS * ASsha; - *Ad = (nuEndD + nuIntD) * ADsha; - break; - case 8: - *Ps = nuEndS * PSmer + nuIntS * PSsha; - *Pd = nuEndD * PDmer + nuIntD * PDsha; - *As = nuEndS * ASmer + nuIntS * ASsha; - *Ad = nuEndD * ADmer + nuIntD * ADsha; - break; - case 9: /* geo = 9 and 10 happen only when nf = even */ - *Ps = PSiso + (nf - 1.0) * PSsha; - *Pd = nf * PDsha; - *As = ASiso + (nf - 1.0) * ASsha; - *Ad = nf * ADsha; - break; - case 10: - *Ps = nf * PSsha; - *Pd = PDiso + (nf - 1.0) * PDsha; - *As = nf * ASsha; - *Ad = ADiso + (nf - 1.0) * ADsha; - break; - default: - printf("Warning: Specified GEO = %d not matched\n", geo); - } -return 0; -} - - -int -BSIM4RdseffGeo( -double nf, -int geo, int rgeo, int minSD, -double Weffcj, double Rsh, double DMCG, double DMCI, double DMDG, -int Type, -double *Rtot) -{ -double Rint=0.0, Rend = 0.0; -double nuIntD = 0.0, nuEndD = 0.0, nuIntS = 0.0, nuEndS = 0.0; - - if (geo < 9) /* since geo = 9 and 10 only happen when nf = even */ - { BSIM4NumFingerDiff(nf, minSD, &nuIntD, &nuEndD, &nuIntS, &nuEndS); - - /* Internal S/D resistance -- assume shared S or D and all wide contacts */ - if (Type == 1) - { if (nuIntS == 0.0) - Rint = 0.0; - else - Rint = Rsh * DMCG / ( Weffcj * nuIntS); - } - else - { if (nuIntD == 0.0) - Rint = 0.0; - else - Rint = Rsh * DMCG / ( Weffcj * nuIntD); - } - } - - /* End S/D resistance -- geo dependent */ - switch(geo) - { case 0: - if (Type == 1) BSIM4RdsEndIso(Weffcj, Rsh, DMCG, DMCI, DMDG, - nuEndS, rgeo, 1, &Rend); - else BSIM4RdsEndIso(Weffcj, Rsh, DMCG, DMCI, DMDG, - nuEndD, rgeo, 0, &Rend); - break; - case 1: - if (Type == 1) BSIM4RdsEndIso(Weffcj, Rsh, DMCG, DMCI, DMDG, - nuEndS, rgeo, 1, &Rend); - else BSIM4RdsEndSha(Weffcj, Rsh, DMCG, DMCI, DMDG, - nuEndD, rgeo, 0, &Rend); - break; - case 2: - if (Type == 1) BSIM4RdsEndSha(Weffcj, Rsh, DMCG, DMCI, DMDG, - nuEndS, rgeo, 1, &Rend); - else BSIM4RdsEndIso(Weffcj, Rsh, DMCG, DMCI, DMDG, - nuEndD, rgeo, 0, &Rend); - break; - case 3: - if (Type == 1) BSIM4RdsEndSha(Weffcj, Rsh, DMCG, DMCI, DMDG, - nuEndS, rgeo, 1, &Rend); - else BSIM4RdsEndSha(Weffcj, Rsh, DMCG, DMCI, DMDG, - nuEndD, rgeo, 0, &Rend); - break; - case 4: - if (Type == 1) BSIM4RdsEndIso(Weffcj, Rsh, DMCG, DMCI, DMDG, - nuEndS, rgeo, 1, &Rend); - else Rend = Rsh * DMDG / Weffcj; - break; - case 5: - if (Type == 1) BSIM4RdsEndSha(Weffcj, Rsh, DMCG, DMCI, DMDG, - nuEndS, rgeo, 1, &Rend); - else Rend = Rsh * DMDG / (Weffcj * nuEndD); - break; - case 6: - if (Type == 1) Rend = Rsh * DMDG / Weffcj; - else BSIM4RdsEndIso(Weffcj, Rsh, DMCG, DMCI, DMDG, - nuEndD, rgeo, 0, &Rend); - break; - case 7: - if (Type == 1) Rend = Rsh * DMDG / (Weffcj * nuEndS); - else BSIM4RdsEndSha(Weffcj, Rsh, DMCG, DMCI, DMDG, - nuEndD, rgeo, 0, &Rend); - break; - case 8: - Rend = Rsh * DMDG / Weffcj; - break; - case 9: /* all wide contacts assumed for geo = 9 and 10 */ - if (Type == 1) - { Rend = 0.5 * Rsh * DMCG / Weffcj; - if (nf == 2.0) - Rint = 0.0; - else - Rint = Rsh * DMCG / (Weffcj * (nf - 2.0)); - } - else - { Rend = 0.0; - Rint = Rsh * DMCG / (Weffcj * nf); - } - break; - case 10: - if (Type == 1) - { Rend = 0.0; - Rint = Rsh * DMCG / (Weffcj * nf); - } - else - { Rend = 0.5 * Rsh * DMCG / Weffcj;; - if (nf == 2.0) - Rint = 0.0; - else - Rint = Rsh * DMCG / (Weffcj * (nf - 2.0)); - } - break; - default: - printf("Warning: Specified GEO = %d not matched\n", geo); - } - - if (Rint <= 0.0) - *Rtot = Rend; - else if (Rend <= 0.0) - *Rtot = Rint; - else - *Rtot = Rint * Rend / (Rint + Rend); -if(*Rtot==0.0) - printf("Warning: Zero resistance returned from RdseffGeo\n"); -return 0; -} - - -int -BSIM4RdsEndIso( -double Weffcj, double Rsh, double DMCG, double DMCI, double DMDG, -double nuEnd, -int rgeo, int Type, -double *Rend) -{ - NG_IGNORE(DMDG); - - if (Type == 1) - { switch(rgeo) - { case 1: - case 2: - case 5: - if (nuEnd == 0.0) - *Rend = 0.0; - else - *Rend = Rsh * DMCG / (Weffcj * nuEnd); - break; - case 3: - case 4: - case 6: - if ((DMCG + DMCI) == 0.0) - printf("(DMCG + DMCI) can not be equal to zero\n"); - if ((nuEnd == 0.0)||((DMCG+DMCI)==0.0)) - *Rend = 0.0; - else - *Rend = Rsh * Weffcj / (3.0 * nuEnd * (DMCG + DMCI)); - break; - default: - printf("Warning: Specified RGEO = %d not matched\n", rgeo); - } - } - else - { switch(rgeo) - { case 1: - case 3: - case 7: - if (nuEnd == 0.0) - *Rend = 0.0; - else - *Rend = Rsh * DMCG / (Weffcj * nuEnd); - break; - case 2: - case 4: - case 8: - if ((DMCG + DMCI) == 0.0) - printf("(DMCG + DMCI) can not be equal to zero\n"); - if ((nuEnd == 0.0)||((DMCG + DMCI)==0.0)) - *Rend = 0.0; - else - *Rend = Rsh * Weffcj / (3.0 * nuEnd * (DMCG + DMCI)); - break; - default: - printf("Warning: Specified RGEO = %d not matched\n", rgeo); - } - } -return 0; -} - - -int -BSIM4RdsEndSha( -double Weffcj, double Rsh, double DMCG, double DMCI, double DMDG, -double nuEnd, -int rgeo, int Type, -double *Rend) -{ - NG_IGNORE(DMCI); - NG_IGNORE(DMDG); - - if (Type == 1) - { switch(rgeo) - { case 1: - case 2: - case 5: - if (nuEnd == 0.0) - *Rend = 0.0; - else - *Rend = Rsh * DMCG / (Weffcj * nuEnd); - break; - case 3: - case 4: - case 6: - if (DMCG == 0.0) - printf("DMCG can not be equal to zero\n"); - if (nuEnd == 0.0) - *Rend = 0.0; - else - *Rend = Rsh * Weffcj / (6.0 * nuEnd * DMCG); - break; - default: - printf("Warning: Specified RGEO = %d not matched\n", rgeo); - } - } - else - { switch(rgeo) - { case 1: - case 3: - case 7: - if (nuEnd == 0.0) - *Rend = 0.0; - else - *Rend = Rsh * DMCG / (Weffcj * nuEnd); - break; - case 2: - case 4: - case 8: - if (DMCG == 0.0) - printf("DMCG can not be equal to zero\n"); - if (nuEnd == 0.0) - *Rend = 0.0; - else - *Rend = Rsh * Weffcj / (6.0 * nuEnd * DMCG); - break; - default: - printf("Warning: Specified RGEO = %d not matched\n", rgeo); - } - } -return 0; -} diff --git a/src/spicelib/devices/bsim4/b4getic.c b/src/spicelib/devices/bsim4/b4getic.c deleted file mode 100644 index 2a42311fd..000000000 --- a/src/spicelib/devices/bsim4/b4getic.c +++ /dev/null @@ -1,94 +0,0 @@ -/* ****************************************************************************** - * BSIM4 4.8.1 released by Chetan Kumar Dabhi 2/15/2017 * - * BSIM4 Model Equations * - ****************************************************************************** - - ****************************************************************************** - * Copyright 2017 Regents of the University of California. * - * All rights reserved. * - * * - * Project Director: Prof. Chenming Hu. * - * Authors: Gary W. Ng, Weidong Liu, Xuemei Xi, Mohan Dunga, Wenwei Yang * - * Ali Niknejad, Shivendra Singh Parihar, Chetan Kumar Dabhi * - * Yogesh Singh Chauhan, Sayeef Salahuddin, Chenming Hu * - ****************************************************************************** - - ****************************************************************************** - * CMC In-Code Statement * - * * - * The Developer agrees that the following statement will appear in the * - * model code that has been adopted as a CMC Standard. * - * * - * Software is distributed as is, completely without warranty or service * - * support. The University of California and its employees are not liable * - * for the condition or performance of the software. * - * * - * The University of California owns the copyright and grants users a * - * perpetual, irrevocable, worldwide, non-exclusive, royalty-free license * - * with respect to the software as set forth below. * - * * - * The University of California hereby disclaims all implied warranties. * - * * - * The University of California grants the users the right to modify, * - * copy, and redistribute the software and documentation, both within * - * the user's organization and externally, subject to the following * - * restrictions: * - * * - * 1. The users agree not to charge for the University of California code * - * itself but may charge for additions, extensions, or support. * - * * - * 2. In any product based on the software, the users agree to * - * acknowledge the University of California that developed the * - * software. This acknowledgment shall appear in the product * - * documentation. * - * * - * 3. Redistributions to others of source code and documentation must * - * retain the copyright notice, disclaimer, and list of conditions. * - * * - * 4. Redistributions to others in binary form must reproduce the * - * copyright notice, disclaimer, and list of conditions in the * - * documentation and/or other materials provided with the * - * distribution. * - * * - * Agreed to on ______Feb. 15, 2017______________ * - * * - * By: ____University of California, Berkeley___ * - * ____Chenming Hu__________________________ * - * ____Professor in Graduate School ________ * - * * - ****************************************************************************** */ - -#include "ngspice/ngspice.h" -#include "ngspice/cktdefs.h" -#include "bsim4def.h" -#include "ngspice/sperror.h" -#include "ngspice/suffix.h" - - -int -BSIM4getic( -GENmodel *inModel, -CKTcircuit *ckt) -{ -BSIM4model *model = (BSIM4model*)inModel; -BSIM4instance *here; - - for (; model ; model = BSIM4nextModel(model)) - { for (here = BSIM4instances(model); here; here = BSIM4nextInstance(here)) - { - if (!here->BSIM4icVDSGiven) - { here->BSIM4icVDS = *(ckt->CKTrhs + here->BSIM4dNode) - - *(ckt->CKTrhs + here->BSIM4sNode); - } - if (!here->BSIM4icVGSGiven) - { here->BSIM4icVGS = *(ckt->CKTrhs + here->BSIM4gNodeExt) - - *(ckt->CKTrhs + here->BSIM4sNode); - } - if(!here->BSIM4icVBSGiven) - { here->BSIM4icVBS = *(ckt->CKTrhs + here->BSIM4bNode) - - *(ckt->CKTrhs + here->BSIM4sNode); - } - } - } - return(OK); -} diff --git a/src/spicelib/devices/bsim4/b4ld.c b/src/spicelib/devices/bsim4/b4ld.c deleted file mode 100644 index 300231625..000000000 --- a/src/spicelib/devices/bsim4/b4ld.c +++ /dev/null @@ -1,5638 +0,0 @@ -/* ****************************************************************************** - * BSIM4 4.8.1 released by Chetan Kumar Dabhi 2/15/2017 * - * BSIM4 Model Equations * - ****************************************************************************** - - ****************************************************************************** - * Copyright 2017 Regents of the University of California. * - * All rights reserved. * - * * - * Project Director: Prof. Chenming Hu. * - * Authors: Gary W. Ng, Weidong Liu, Xuemei Xi, Mohan Dunga, Wenwei Yang * - * Ali Niknejad, Shivendra Singh Parihar, Chetan Kumar Dabhi * - * Yogesh Singh Chauhan, Sayeef Salahuddin, Chenming Hu * - ****************************************************************************** - - ****************************************************************************** - * CMC In-Code Statement * - * * - * The Developer agrees that the following statement will appear in the * - * model code that has been adopted as a CMC Standard. * - * * - * Software is distributed as is, completely without warranty or service * - * support. The University of California and its employees are not liable * - * for the condition or performance of the software. * - * * - * The University of California owns the copyright and grants users a * - * perpetual, irrevocable, worldwide, non-exclusive, royalty-free license * - * with respect to the software as set forth below. * - * * - * The University of California hereby disclaims all implied warranties. * - * * - * The University of California grants the users the right to modify, * - * copy, and redistribute the software and documentation, both within * - * the user's organization and externally, subject to the following * - * restrictions: * - * * - * 1. The users agree not to charge for the University of California code * - * itself but may charge for additions, extensions, or support. * - * * - * 2. In any product based on the software, the users agree to * - * acknowledge the University of California that developed the * - * software. This acknowledgment shall appear in the product * - * documentation. * - * * - * 3. Redistributions to others of source code and documentation must * - * retain the copyright notice, disclaimer, and list of conditions. * - * * - * 4. Redistributions to others in binary form must reproduce the * - * copyright notice, disclaimer, and list of conditions in the * - * documentation and/or other materials provided with the * - * distribution. * - * * - * Agreed to on ______Feb. 15, 2017______________ * - * * - * By: ____University of California, Berkeley___ * - * ____Chenming Hu__________________________ * - * ____Professor in Graduate School ________ * - * * - ****************************************************************************** */ - -/**** OpenMP support ngspice 06/28/2010 ****/ - -#include "ngspice/ngspice.h" -#include "ngspice/cktdefs.h" -#include "bsim4def.h" -#include "ngspice/trandefs.h" -#include "ngspice/const.h" -#include "ngspice/sperror.h" -#include "ngspice/devdefs.h" -#include "ngspice/suffix.h" - -#define MAX_EXPL 2.688117142e+43 -#define MIN_EXPL 3.720075976e-44 -#define EXPL_THRESHOLD 100.0 - -#define MAX_EXP 5.834617425e14 -#define MIN_EXP 1.713908431e-15 -#define EXP_THRESHOLD 34.0 -#define EPS0 8.85418e-12 -#define EPSSI 1.03594e-10 -#define Charge_q 1.60219e-19 -#define DELTA_1 0.02 -#define DELTA_2 0.02 -#define DELTA_3 0.02 -#define DELTA_4 0.02 -#define MM 3 /* smooth coeff */ -#define DEXP(A,B,C) { \ - if (A > EXP_THRESHOLD) { \ - B = MAX_EXP*(1.0+(A)-EXP_THRESHOLD); \ - C = MAX_EXP; \ - } else if (A < -EXP_THRESHOLD) { \ - B = MIN_EXP; \ - C = 0; \ - } else { \ - B = exp(A); \ - C = B; \ - } \ - } - -#ifdef USE_OMP -int BSIM4LoadOMP(BSIM4instance *here, CKTcircuit *ckt); -void BSIM4LoadRhsMat(GENmodel *inModel, CKTcircuit *ckt); -#endif - -int BSIM4polyDepletion(double phi, double ngate,double epsgate, double coxe, double Vgs, double *Vgs_eff, double *dVgs_eff_dVg); - -int -BSIM4load( -GENmodel *inModel, -CKTcircuit *ckt) -{ -#ifdef USE_OMP - int idx; - BSIM4model *model = (BSIM4model*)inModel; - int error = 0; - BSIM4instance **InstArray; - InstArray = model->BSIM4InstanceArray; - -#pragma omp parallel for - for (idx = 0; idx < model->BSIM4InstCount; idx++) { - BSIM4instance *here = InstArray[idx]; - int local_error = BSIM4LoadOMP(here, ckt); - if (local_error) - error = local_error; - } - - BSIM4LoadRhsMat(inModel, ckt); - - return error; -} - - -int BSIM4LoadOMP(BSIM4instance *here, CKTcircuit *ckt) { -BSIM4model *model = BSIM4modPtr(here); -#else -BSIM4model *model = (BSIM4model*)inModel; -BSIM4instance *here; -#endif -double ceqgstot, dgstot_dvd, dgstot_dvg, dgstot_dvs, dgstot_dvb; -double ceqgdtot, dgdtot_dvd, dgdtot_dvg, dgdtot_dvs, dgdtot_dvb; -double gstot, gstotd, gstotg, gstots, gstotb, gspr, Rs, Rd; -double gdtot, gdtotd, gdtotg, gdtots, gdtotb, gdpr; -double vgs_eff, vgd_eff, dvgs_eff_dvg, dvgd_eff_dvg; -double dRs_dvg, dRd_dvg, dRs_dvb, dRd_dvb; -double dT0_dvg, dT1_dvb, dT3_dvg, dT3_dvb; -double vses, vdes, vdedo, delvses, delvded, delvdes; -double Isestot, cseshat, Idedtot, cdedhat; -#ifndef NEWCONV -double tol0, tol1, tol2, tol3, tol4, tol5, tol6; -#endif - -double geltd, gcrg, gcrgg, gcrgd, gcrgs, gcrgb, ceqgcrg; -double vges, vgms, vgedo, vgmdo, vged, vgmd, delvged, delvgmd; -double delvges, delvgms, vgmb; -double gcgmgmb=0.0, gcgmdb=0.0, gcgmsb=0.0, gcdgmb, gcsgmb; -double gcgmbb=0.0, gcbgmb, qgmb, qgmid=0.0, ceqqgmid; - -double vbd, vbs, vds, vgb, vgd, vgs, vgdo; -#ifndef PREDICTOR -double xfact; -#endif -double vdbs, vdbd, vsbs, vsbdo, vsbd; -double delvdbs, delvdbd, delvsbs; -double delvbd_jct, delvbs_jct, vbs_jct, vbd_jct; - -double SourceSatCurrent, DrainSatCurrent; -double ag0, qgb, von, cbhat, VgstNVt, ExpVgst; -double ceqqb, ceqqd, ceqqg, ceqqjd=0.0, ceqqjs=0.0, ceq, geq; -double cdrain, cdhat, ceqdrn, ceqbd, ceqbs, ceqjd, ceqjs, gjbd, gjbs; -double czbd, czbdsw, czbdswg, czbs, czbssw, czbsswg, evbd, evbs, arg, sarg; -double delvbd, delvbs, delvds, delvgd, delvgs; -double Vfbeff, dVfbeff_dVg, dVfbeff_dVb, V3, V4; -double gcbdb, gcbgb, gcbsb, gcddb, gcdgb, gcdsb, gcgdb, gcggb, gcgsb, gcsdb; -double gcgbb, gcdbb, gcsbb, gcbbb; -double gcdbdb, gcsbsb; -double gcsgb, gcssb, MJD, MJSWD, MJSWGD, MJS, MJSWS, MJSWGS; -double qgate=0.0, qbulk=0.0, qdrn=0.0, qsrc, cqgate, cqbody, cqdrn; -double Vdb, Vds, Vgs, Vbs, Gmbs, FwdSum, RevSum; -double Igidl, Ggidld, Ggidlg, Ggidlb; -double Voxacc=0.0, dVoxacc_dVg=0.0, dVoxacc_dVb=0.0; -double Voxdepinv=0.0, dVoxdepinv_dVg=0.0, dVoxdepinv_dVd=0.0, dVoxdepinv_dVb=0.0; -double VxNVt=0.0, ExpVxNVt, Vaux=0.0, dVaux_dVg=0.0, dVaux_dVd=0.0, dVaux_dVb=0.0; -double Igc, dIgc_dVg, dIgc_dVd, dIgc_dVb; -double Igcs, dIgcs_dVg, dIgcs_dVd, dIgcs_dVb; -double Igcd, dIgcd_dVg, dIgcd_dVd, dIgcd_dVb; -double Igs, dIgs_dVg, dIgs_dVs, Igd, dIgd_dVg, dIgd_dVd; -double Igbacc, dIgbacc_dVg, dIgbacc_dVb; -double Igbinv, dIgbinv_dVg, dIgbinv_dVd, dIgbinv_dVb; -double Pigcd, dPigcd_dVg, dPigcd_dVd, dPigcd_dVb; -double Istoteq, gIstotg, gIstotd, gIstots, gIstotb; -double Idtoteq, gIdtotg, gIdtotd, gIdtots, gIdtotb; -double Ibtoteq, gIbtotg, gIbtotd, gIbtots, gIbtotb; -double Igtoteq, gIgtotg, gIgtotd, gIgtots, gIgtotb; -double Igstot, cgshat, Igdtot, cgdhat, Igbtot, cgbhat; -double Vgs_eff, Vfb=0.0, Vth_NarrowW; -/* double Vgd_eff, dVgd_eff_dVg; v4.7.0 */ -double Phis, dPhis_dVb, sqrtPhis, dsqrtPhis_dVb, Vth, dVth_dVb, dVth_dVd; -double Vgst, dVgst_dVg, dVgst_dVb, dVgs_eff_dVg, Nvtms, Nvtmd; -double Vtm, Vtm0; -double n, dn_dVb, dn_dVd, voffcv, noff, dnoff_dVd, dnoff_dVb; -double V0, CoxWLcen, QovCox, LINK; -double DeltaPhi, dDeltaPhi_dVg, VgDP, dVgDP_dVg; -double Cox, Tox, Tcen, dTcen_dVg, dTcen_dVd, dTcen_dVb; -double Ccen, Coxeff, dCoxeff_dVd, dCoxeff_dVg, dCoxeff_dVb; -double Denomi, dDenomi_dVg, dDenomi_dVd, dDenomi_dVb; -double ueff, dueff_dVg, dueff_dVd, dueff_dVb; -double Esat, Vdsat; -double EsatL, dEsatL_dVg, dEsatL_dVd, dEsatL_dVb; -double dVdsat_dVg, dVdsat_dVb, dVdsat_dVd, Vasat, dAlphaz_dVg, dAlphaz_dVb; -double dVasat_dVg, dVasat_dVb, dVasat_dVd, Va, dVa_dVd, dVa_dVg, dVa_dVb; -double Vbseff, dVbseff_dVb, VbseffCV, dVbseffCV_dVb; -double VgsteffVth, dT11_dVg; -double Arg1, One_Third_CoxWL, Two_Third_CoxWL, Alphaz, CoxWL; -double T0=0.0, dT0_dVg, dT0_dVd, dT0_dVb; -double T1, dT1_dVg, dT1_dVd, dT1_dVb; -double T2, dT2_dVg, dT2_dVd, dT2_dVb; -double T3, dT3_dVg, dT3_dVd, dT3_dVb; -double T4, dT4_dVd, dT4_dVb; -double T5, dT5_dVg, dT5_dVd, dT5_dVb; -double T6, dT6_dVg, dT6_dVd, dT6_dVb; -double T7, dT7_dVg, dT7_dVd, dT7_dVb; -double T8, dT8_dVg, dT8_dVd, dT8_dVb; -double T9, dT9_dVg, dT9_dVd, dT9_dVb; -double T10, dT10_dVg, dT10_dVb, dT10_dVd; -double T11, T12, T13, T14; -double tmp, Abulk, dAbulk_dVb, Abulk0, dAbulk0_dVb; -double Cclm, dCclm_dVg, dCclm_dVd, dCclm_dVb; -double FP, dFP_dVg, PvagTerm, dPvagTerm_dVg, dPvagTerm_dVd, dPvagTerm_dVb; -double VADITS, dVADITS_dVg, dVADITS_dVd; -double Lpe_Vb, dDITS_Sft_dVb, dDITS_Sft_dVd; -double DITS_Sft2, dDITS_Sft2_dVd; /* v4.7 New DITS */ -double VACLM, dVACLM_dVg, dVACLM_dVd, dVACLM_dVb; -double VADIBL, dVADIBL_dVg, dVADIBL_dVd, dVADIBL_dVb; -double Xdep, dXdep_dVb, lt1, dlt1_dVb, ltw, dltw_dVb, Delt_vth, dDelt_vth_dVb; -double Theta0, dTheta0_dVb; -double TempRatio, tmp1, tmp2, tmp3, tmp4; -double DIBL_Sft, dDIBL_Sft_dVd, Lambda, dLambda_dVg; -double Idtot, Ibtot, a1, ScalingFactor; - -double Vgsteff, dVgsteff_dVg, dVgsteff_dVd, dVgsteff_dVb; -double Vdseff, dVdseff_dVg, dVdseff_dVd, dVdseff_dVb; -double VdseffCV, dVdseffCV_dVg, dVdseffCV_dVd, dVdseffCV_dVb; -double diffVds, dAbulk_dVg; -double beta, dbeta_dVg, dbeta_dVd, dbeta_dVb; -double gche, dgche_dVg, dgche_dVd, dgche_dVb; -double fgche1, dfgche1_dVg, dfgche1_dVd, dfgche1_dVb; -double fgche2, dfgche2_dVg, dfgche2_dVd, dfgche2_dVb; -double Idl, dIdl_dVg, dIdl_dVd, dIdl_dVb; -double Idsa, dIdsa_dVg, dIdsa_dVd, dIdsa_dVb; -double Ids, Gm, Gds, Gmb, devbs_dvb, devbd_dvb; -double Isub, Gbd, Gbg, Gbb; -double VASCBE, dVASCBE_dVg, dVASCBE_dVd, dVASCBE_dVb; -double CoxeffWovL; -double Rds, dRds_dVg, dRds_dVb, WVCox, WVCoxRds; -double Vgst2Vtm, VdsatCV; -double Leff, Weff, dWeff_dVg, dWeff_dVb; -double AbulkCV, dAbulkCV_dVb; -double qcheq, qdef, gqdef=0.0, cqdef=0.0, cqcheq=0.0; -double gcqdb=0.0, gcqsb=0.0, gcqgb=0.0, gcqbb=0.0; -double dxpart, sxpart, ggtg, ggtd, ggts, ggtb; -double ddxpart_dVd, ddxpart_dVg, ddxpart_dVb, ddxpart_dVs; -double dsxpart_dVd, dsxpart_dVg, dsxpart_dVb, dsxpart_dVs; -double gbspsp, gbbdp, gbbsp, gbspg, gbspb, gbspdp; -double gbdpdp, gbdpg, gbdpb, gbdpsp; -double qgdo, qgso, cgdo, cgso; -double Cgg, Cgd, Cgb, Cdg, Cdd, Cds; -double Csg, Csd, Css, Csb, Cbg, Cbd, Cbb; -double Cgg1, Cgd1, Cgb1, Cbg1, Cbb1, Cbd1, Qac0, Qsub0; -double dQac0_dVg, dQac0_dVb, dQsub0_dVg, dQsub0_dVd, dQsub0_dVb; -double ggidld, ggidlg, ggidlb, ggislg, ggislb, ggisls; -double Igisl, Ggislg, Ggislb, Ggisls; -double Nvtmrss, Nvtmrssws, Nvtmrsswgs; -double Nvtmrsd, Nvtmrsswd, Nvtmrsswgd; - -double vs, Fsevl, dvs_dVg, dvs_dVd, dvs_dVb, dFsevl_dVg, dFsevl_dVd, dFsevl_dVb; -double vgdx, vgsx, epssub, toxe, epsrox; -struct bsim4SizeDependParam *pParam; -int ByPass, ChargeComputationNeeded, error, Check, Check1, Check2; - -double m; - -ScalingFactor = 1.0e-9; -ChargeComputationNeeded = - ((ckt->CKTmode & (MODEDCTRANCURVE | MODEAC | MODETRAN | MODEINITSMSIG)) || - ((ckt->CKTmode & MODETRANOP) && (ckt->CKTmode & MODEUIC))) - ? 1 : 0; - -#ifndef USE_OMP -for (; model != NULL; model = BSIM4nextModel(model)) -{ for (here = BSIM4instances(model); here != NULL; - here = BSIM4nextInstance(here)) - { -#endif - - Check = Check1 = Check2 = 1; - ByPass = 0; - pParam = here->pParam; - - if ((ckt->CKTmode & MODEINITSMSIG)) - { vds = *(ckt->CKTstate0 + here->BSIM4vds); - vgs = *(ckt->CKTstate0 + here->BSIM4vgs); - vbs = *(ckt->CKTstate0 + here->BSIM4vbs); - vges = *(ckt->CKTstate0 + here->BSIM4vges); - vgms = *(ckt->CKTstate0 + here->BSIM4vgms); - vdbs = *(ckt->CKTstate0 + here->BSIM4vdbs); - vsbs = *(ckt->CKTstate0 + here->BSIM4vsbs); - vses = *(ckt->CKTstate0 + here->BSIM4vses); - vdes = *(ckt->CKTstate0 + here->BSIM4vdes); - - qdef = *(ckt->CKTstate0 + here->BSIM4qdef); - } - else if ((ckt->CKTmode & MODEINITTRAN)) - { vds = *(ckt->CKTstate1 + here->BSIM4vds); - vgs = *(ckt->CKTstate1 + here->BSIM4vgs); - vbs = *(ckt->CKTstate1 + here->BSIM4vbs); - vges = *(ckt->CKTstate1 + here->BSIM4vges); - vgms = *(ckt->CKTstate1 + here->BSIM4vgms); - vdbs = *(ckt->CKTstate1 + here->BSIM4vdbs); - vsbs = *(ckt->CKTstate1 + here->BSIM4vsbs); - vses = *(ckt->CKTstate1 + here->BSIM4vses); - vdes = *(ckt->CKTstate1 + here->BSIM4vdes); - - qdef = *(ckt->CKTstate1 + here->BSIM4qdef); - } - else if ((ckt->CKTmode & MODEINITJCT) && !here->BSIM4off) - { vds = model->BSIM4type * here->BSIM4icVDS; - vgs = vges = vgms = model->BSIM4type * here->BSIM4icVGS; - vbs = vdbs = vsbs = model->BSIM4type * here->BSIM4icVBS; - if (vds > 0.0) - { vdes = vds + 0.01; - vses = -0.01; - } - else if (vds < 0.0) - { vdes = vds - 0.01; - vses = 0.01; - } - else - vdes = vses = 0.0; - - qdef = 0.0; - - if ((vds == 0.0) && (vgs == 0.0) && (vbs == 0.0) && - ((ckt->CKTmode & (MODETRAN | MODEAC|MODEDCOP | - MODEDCTRANCURVE)) || (!(ckt->CKTmode & MODEUIC)))) - { vds = 0.1; - vdes = 0.11; - vses = -0.01; - vgs = vges = vgms = model->BSIM4type - * here->BSIM4vth0 + 0.1; - vbs = vdbs = vsbs = 0.0; - } - } - else if ((ckt->CKTmode & (MODEINITJCT | MODEINITFIX)) && - (here->BSIM4off)) - { vds = vgs = vbs = vges = vgms = 0.0; - vdbs = vsbs = vdes = vses = qdef = 0.0; - } - else - { -#ifndef PREDICTOR - if ((ckt->CKTmode & MODEINITPRED)) - { xfact = ckt->CKTdelta / ckt->CKTdeltaOld[1]; - *(ckt->CKTstate0 + here->BSIM4vds) = - *(ckt->CKTstate1 + here->BSIM4vds); - vds = (1.0 + xfact)* (*(ckt->CKTstate1 + here->BSIM4vds)) - - (xfact * (*(ckt->CKTstate2 + here->BSIM4vds))); - *(ckt->CKTstate0 + here->BSIM4vgs) = - *(ckt->CKTstate1 + here->BSIM4vgs); - vgs = (1.0 + xfact)* (*(ckt->CKTstate1 + here->BSIM4vgs)) - - (xfact * (*(ckt->CKTstate2 + here->BSIM4vgs))); - *(ckt->CKTstate0 + here->BSIM4vges) = - *(ckt->CKTstate1 + here->BSIM4vges); - vges = (1.0 + xfact)* (*(ckt->CKTstate1 + here->BSIM4vges)) - - (xfact * (*(ckt->CKTstate2 + here->BSIM4vges))); - *(ckt->CKTstate0 + here->BSIM4vgms) = - *(ckt->CKTstate1 + here->BSIM4vgms); - vgms = (1.0 + xfact)* (*(ckt->CKTstate1 + here->BSIM4vgms)) - - (xfact * (*(ckt->CKTstate2 + here->BSIM4vgms))); - *(ckt->CKTstate0 + here->BSIM4vbs) = - *(ckt->CKTstate1 + here->BSIM4vbs); - vbs = (1.0 + xfact)* (*(ckt->CKTstate1 + here->BSIM4vbs)) - - (xfact * (*(ckt->CKTstate2 + here->BSIM4vbs))); - *(ckt->CKTstate0 + here->BSIM4vbd) = - *(ckt->CKTstate0 + here->BSIM4vbs) - - *(ckt->CKTstate0 + here->BSIM4vds); - *(ckt->CKTstate0 + here->BSIM4vdbs) = - *(ckt->CKTstate1 + here->BSIM4vdbs); - vdbs = (1.0 + xfact)* (*(ckt->CKTstate1 + here->BSIM4vdbs)) - - (xfact * (*(ckt->CKTstate2 + here->BSIM4vdbs))); - *(ckt->CKTstate0 + here->BSIM4vdbd) = - *(ckt->CKTstate0 + here->BSIM4vdbs) - - *(ckt->CKTstate0 + here->BSIM4vds); - *(ckt->CKTstate0 + here->BSIM4vsbs) = - *(ckt->CKTstate1 + here->BSIM4vsbs); - vsbs = (1.0 + xfact)* (*(ckt->CKTstate1 + here->BSIM4vsbs)) - - (xfact * (*(ckt->CKTstate2 + here->BSIM4vsbs))); - *(ckt->CKTstate0 + here->BSIM4vses) = - *(ckt->CKTstate1 + here->BSIM4vses); - vses = (1.0 + xfact)* (*(ckt->CKTstate1 + here->BSIM4vses)) - - (xfact * (*(ckt->CKTstate2 + here->BSIM4vses))); - *(ckt->CKTstate0 + here->BSIM4vdes) = - *(ckt->CKTstate1 + here->BSIM4vdes); - vdes = (1.0 + xfact)* (*(ckt->CKTstate1 + here->BSIM4vdes)) - - (xfact * (*(ckt->CKTstate2 + here->BSIM4vdes))); - - *(ckt->CKTstate0 + here->BSIM4qdef) = - *(ckt->CKTstate1 + here->BSIM4qdef); - qdef = (1.0 + xfact)* (*(ckt->CKTstate1 + here->BSIM4qdef)) - -(xfact * (*(ckt->CKTstate2 + here->BSIM4qdef))); - } - else - { -#endif /* PREDICTOR */ - vds = model->BSIM4type - * (*(ckt->CKTrhsOld + here->BSIM4dNodePrime) - - *(ckt->CKTrhsOld + here->BSIM4sNodePrime)); - vgs = model->BSIM4type - * (*(ckt->CKTrhsOld + here->BSIM4gNodePrime) - - *(ckt->CKTrhsOld + here->BSIM4sNodePrime)); - vbs = model->BSIM4type - * (*(ckt->CKTrhsOld + here->BSIM4bNodePrime) - - *(ckt->CKTrhsOld + here->BSIM4sNodePrime)); - vges = model->BSIM4type - * (*(ckt->CKTrhsOld + here->BSIM4gNodeExt) - - *(ckt->CKTrhsOld + here->BSIM4sNodePrime)); - vgms = model->BSIM4type - * (*(ckt->CKTrhsOld + here->BSIM4gNodeMid) - - *(ckt->CKTrhsOld + here->BSIM4sNodePrime)); - vdbs = model->BSIM4type - * (*(ckt->CKTrhsOld + here->BSIM4dbNode) - - *(ckt->CKTrhsOld + here->BSIM4sNodePrime)); - vsbs = model->BSIM4type - * (*(ckt->CKTrhsOld + here->BSIM4sbNode) - - *(ckt->CKTrhsOld + here->BSIM4sNodePrime)); - vses = model->BSIM4type - * (*(ckt->CKTrhsOld + here->BSIM4sNode) - - *(ckt->CKTrhsOld + here->BSIM4sNodePrime)); - vdes = model->BSIM4type - * (*(ckt->CKTrhsOld + here->BSIM4dNode) - - *(ckt->CKTrhsOld + here->BSIM4sNodePrime)); - qdef = model->BSIM4type - * (*(ckt->CKTrhsOld + here->BSIM4qNode)); -#ifndef PREDICTOR - } -#endif /* PREDICTOR */ - - vgdo = *(ckt->CKTstate0 + here->BSIM4vgs) - - *(ckt->CKTstate0 + here->BSIM4vds); - vgedo = *(ckt->CKTstate0 + here->BSIM4vges) - - *(ckt->CKTstate0 + here->BSIM4vds); - vgmdo = *(ckt->CKTstate0 + here->BSIM4vgms) - - *(ckt->CKTstate0 + here->BSIM4vds); - - vbd = vbs - vds; - vdbd = vdbs - vds; - vgd = vgs - vds; - vged = vges - vds; - vgmd = vgms - vds; - - delvbd = vbd - *(ckt->CKTstate0 + here->BSIM4vbd); - delvdbd = vdbd - *(ckt->CKTstate0 + here->BSIM4vdbd); - delvgd = vgd - vgdo; - delvged = vged - vgedo; - delvgmd = vgmd - vgmdo; - - delvds = vds - *(ckt->CKTstate0 + here->BSIM4vds); - delvgs = vgs - *(ckt->CKTstate0 + here->BSIM4vgs); - delvges = vges - *(ckt->CKTstate0 + here->BSIM4vges); - delvgms = vgms - *(ckt->CKTstate0 + here->BSIM4vgms); - delvbs = vbs - *(ckt->CKTstate0 + here->BSIM4vbs); - delvdbs = vdbs - *(ckt->CKTstate0 + here->BSIM4vdbs); - delvsbs = vsbs - *(ckt->CKTstate0 + here->BSIM4vsbs); - - delvses = vses - (*(ckt->CKTstate0 + here->BSIM4vses)); - vdedo = *(ckt->CKTstate0 + here->BSIM4vdes) - - *(ckt->CKTstate0 + here->BSIM4vds); - delvdes = vdes - *(ckt->CKTstate0 + here->BSIM4vdes); - delvded = vdes - vds - vdedo; - - delvbd_jct = (!here->BSIM4rbodyMod) ? delvbd : delvdbd; - delvbs_jct = (!here->BSIM4rbodyMod) ? delvbs : delvsbs; - if (here->BSIM4mode >= 0) - { Idtot = here->BSIM4cd + here->BSIM4csub - here->BSIM4cbd - + here->BSIM4Igidl; - cdhat = Idtot - here->BSIM4gbd * delvbd_jct - + (here->BSIM4gmbs + here->BSIM4gbbs + here->BSIM4ggidlb) * delvbs - + (here->BSIM4gm + here->BSIM4gbgs + here->BSIM4ggidlg) * delvgs - + (here->BSIM4gds + here->BSIM4gbds + here->BSIM4ggidld) * delvds; - Ibtot = here->BSIM4cbs + here->BSIM4cbd - - here->BSIM4Igidl - here->BSIM4Igisl - here->BSIM4csub; - cbhat = Ibtot + here->BSIM4gbd * delvbd_jct - + here->BSIM4gbs * delvbs_jct - (here->BSIM4gbbs + here->BSIM4ggidlb) - * delvbs - (here->BSIM4gbgs + here->BSIM4ggidlg) * delvgs - - (here->BSIM4gbds + here->BSIM4ggidld - here->BSIM4ggisls) * delvds - - here->BSIM4ggislg * delvgd - here->BSIM4ggislb* delvbd; - - Igstot = here->BSIM4Igs + here->BSIM4Igcs; - cgshat = Igstot + (here->BSIM4gIgsg + here->BSIM4gIgcsg) * delvgs - + here->BSIM4gIgcsd * delvds + here->BSIM4gIgcsb * delvbs; - - Igdtot = here->BSIM4Igd + here->BSIM4Igcd; - cgdhat = Igdtot + here->BSIM4gIgdg * delvgd + here->BSIM4gIgcdg * delvgs - + here->BSIM4gIgcdd * delvds + here->BSIM4gIgcdb * delvbs; - - Igbtot = here->BSIM4Igb; - cgbhat = here->BSIM4Igb + here->BSIM4gIgbg * delvgs + here->BSIM4gIgbd - * delvds + here->BSIM4gIgbb * delvbs; - } - else - { Idtot = here->BSIM4cd + here->BSIM4cbd - here->BSIM4Igidl; /* bugfix */ - cdhat = Idtot + here->BSIM4gbd * delvbd_jct + here->BSIM4gmbs - * delvbd + here->BSIM4gm * delvgd - - (here->BSIM4gds + here->BSIM4ggidls) * delvds - - here->BSIM4ggidlg * delvgs - here->BSIM4ggidlb * delvbs; - Ibtot = here->BSIM4cbs + here->BSIM4cbd - - here->BSIM4Igidl - here->BSIM4Igisl - here->BSIM4csub; - cbhat = Ibtot + here->BSIM4gbs * delvbs_jct + here->BSIM4gbd - * delvbd_jct - (here->BSIM4gbbs + here->BSIM4ggislb) * delvbd - - (here->BSIM4gbgs + here->BSIM4ggislg) * delvgd - + (here->BSIM4gbds + here->BSIM4ggisld - here->BSIM4ggidls) * delvds - - here->BSIM4ggidlg * delvgs - here->BSIM4ggidlb * delvbs; - - Igstot = here->BSIM4Igs + here->BSIM4Igcd; - cgshat = Igstot + here->BSIM4gIgsg * delvgs + here->BSIM4gIgcdg * delvgd - - here->BSIM4gIgcdd * delvds + here->BSIM4gIgcdb * delvbd; - - Igdtot = here->BSIM4Igd + here->BSIM4Igcs; - cgdhat = Igdtot + (here->BSIM4gIgdg + here->BSIM4gIgcsg) * delvgd - - here->BSIM4gIgcsd * delvds + here->BSIM4gIgcsb * delvbd; - - Igbtot = here->BSIM4Igb; - cgbhat = here->BSIM4Igb + here->BSIM4gIgbg * delvgd - here->BSIM4gIgbd - * delvds + here->BSIM4gIgbb * delvbd; - } - - Isestot = here->BSIM4gstot * (*(ckt->CKTstate0 + here->BSIM4vses)); - cseshat = Isestot + here->BSIM4gstot * delvses - + here->BSIM4gstotd * delvds + here->BSIM4gstotg * delvgs - + here->BSIM4gstotb * delvbs; - - Idedtot = here->BSIM4gdtot * vdedo; - cdedhat = Idedtot + here->BSIM4gdtot * delvded - + here->BSIM4gdtotd * delvds + here->BSIM4gdtotg * delvgs - + here->BSIM4gdtotb * delvbs; - - -#ifndef NOBYPASS - /* Following should be one IF statement, but some C compilers - * can't handle that all at once, so we split it into several - * successive IF's */ - - if ((!(ckt->CKTmode & MODEINITPRED)) && (ckt->CKTbypass)) - if ((fabs(delvds) < (ckt->CKTreltol * MAX(fabs(vds), - fabs(*(ckt->CKTstate0 + here->BSIM4vds))) + ckt->CKTvoltTol))) - if ((fabs(delvgs) < (ckt->CKTreltol * MAX(fabs(vgs), - fabs(*(ckt->CKTstate0 + here->BSIM4vgs))) + ckt->CKTvoltTol))) - if ((fabs(delvbs) < (ckt->CKTreltol * MAX(fabs(vbs), - fabs(*(ckt->CKTstate0 + here->BSIM4vbs))) + ckt->CKTvoltTol))) - if ((fabs(delvbd) < (ckt->CKTreltol * MAX(fabs(vbd), - fabs(*(ckt->CKTstate0 + here->BSIM4vbd))) + ckt->CKTvoltTol))) - if ((here->BSIM4rgateMod == 0) || (here->BSIM4rgateMod == 1) - || (fabs(delvges) < (ckt->CKTreltol * MAX(fabs(vges), - fabs(*(ckt->CKTstate0 + here->BSIM4vges))) + ckt->CKTvoltTol))) - if ((here->BSIM4rgateMod != 3) || (fabs(delvgms) < (ckt->CKTreltol - * MAX(fabs(vgms), fabs(*(ckt->CKTstate0 + here->BSIM4vgms))) - + ckt->CKTvoltTol))) - if ((!here->BSIM4rbodyMod) || (fabs(delvdbs) < (ckt->CKTreltol - * MAX(fabs(vdbs), fabs(*(ckt->CKTstate0 + here->BSIM4vdbs))) - + ckt->CKTvoltTol))) - if ((!here->BSIM4rbodyMod) || (fabs(delvdbd) < (ckt->CKTreltol - * MAX(fabs(vdbd), fabs(*(ckt->CKTstate0 + here->BSIM4vdbd))) - + ckt->CKTvoltTol))) - if ((!here->BSIM4rbodyMod) || (fabs(delvsbs) < (ckt->CKTreltol - * MAX(fabs(vsbs), fabs(*(ckt->CKTstate0 + here->BSIM4vsbs))) - + ckt->CKTvoltTol))) - if ((!model->BSIM4rdsMod) || (fabs(delvses) < (ckt->CKTreltol - * MAX(fabs(vses), fabs(*(ckt->CKTstate0 + here->BSIM4vses))) - + ckt->CKTvoltTol))) - if ((!model->BSIM4rdsMod) || (fabs(delvdes) < (ckt->CKTreltol - * MAX(fabs(vdes), fabs(*(ckt->CKTstate0 + here->BSIM4vdes))) - + ckt->CKTvoltTol))) - if ((fabs(cdhat - Idtot) < ckt->CKTreltol - * MAX(fabs(cdhat), fabs(Idtot)) + ckt->CKTabstol)) - if ((fabs(cbhat - Ibtot) < ckt->CKTreltol - * MAX(fabs(cbhat), fabs(Ibtot)) + ckt->CKTabstol)) - if ((!model->BSIM4igcMod) || ((fabs(cgshat - Igstot) < ckt->CKTreltol - * MAX(fabs(cgshat), fabs(Igstot)) + ckt->CKTabstol))) - if ((!model->BSIM4igcMod) || ((fabs(cgdhat - Igdtot) < ckt->CKTreltol - * MAX(fabs(cgdhat), fabs(Igdtot)) + ckt->CKTabstol))) - if ((!model->BSIM4igbMod) || ((fabs(cgbhat - Igbtot) < ckt->CKTreltol - * MAX(fabs(cgbhat), fabs(Igbtot)) + ckt->CKTabstol))) - if ((!model->BSIM4rdsMod) || ((fabs(cseshat - Isestot) < ckt->CKTreltol - * MAX(fabs(cseshat), fabs(Isestot)) + ckt->CKTabstol))) - if ((!model->BSIM4rdsMod) || ((fabs(cdedhat - Idedtot) < ckt->CKTreltol - * MAX(fabs(cdedhat), fabs(Idedtot)) + ckt->CKTabstol))) - { vds = *(ckt->CKTstate0 + here->BSIM4vds); - vgs = *(ckt->CKTstate0 + here->BSIM4vgs); - vbs = *(ckt->CKTstate0 + here->BSIM4vbs); - vges = *(ckt->CKTstate0 + here->BSIM4vges); - vgms = *(ckt->CKTstate0 + here->BSIM4vgms); - - vbd = *(ckt->CKTstate0 + here->BSIM4vbd); - vdbs = *(ckt->CKTstate0 + here->BSIM4vdbs); - vdbd = *(ckt->CKTstate0 + here->BSIM4vdbd); - vsbs = *(ckt->CKTstate0 + here->BSIM4vsbs); - vses = *(ckt->CKTstate0 + here->BSIM4vses); - vdes = *(ckt->CKTstate0 + here->BSIM4vdes); - - vgd = vgs - vds; - vgb = vgs - vbs; - vged = vges - vds; - vgmd = vgms - vds; - vgmb = vgms - vbs; - - vbs_jct = (!here->BSIM4rbodyMod) ? vbs : vsbs; - vbd_jct = (!here->BSIM4rbodyMod) ? vbd : vdbd; - -/*** qdef should not be kept fixed even if vgs, vds & vbs has converged -**** qdef = *(ckt->CKTstate0 + here->BSIM4qdef); -***/ - cdrain = here->BSIM4cd; - - if ((ckt->CKTmode & (MODETRAN | MODEAC)) || - ((ckt->CKTmode & MODETRANOP) && - (ckt->CKTmode & MODEUIC))) - { ByPass = 1; - - qgate = here->BSIM4qgate; - qbulk = here->BSIM4qbulk; - qdrn = here->BSIM4qdrn; - cgdo = here->BSIM4cgdo; - qgdo = here->BSIM4qgdo; - cgso = here->BSIM4cgso; - qgso = here->BSIM4qgso; - - goto line755; - } - else - goto line850; - } -#endif /*NOBYPASS*/ - - von = here->BSIM4von; - if (*(ckt->CKTstate0 + here->BSIM4vds) >= 0.0) - { vgs = DEVfetlim(vgs, *(ckt->CKTstate0 + here->BSIM4vgs), von); - vds = vgs - vgd; - vds = DEVlimvds(vds, *(ckt->CKTstate0 + here->BSIM4vds)); - vgd = vgs - vds; - if (here->BSIM4rgateMod == 3) - { vges = DEVfetlim(vges, *(ckt->CKTstate0 + here->BSIM4vges), von); - vgms = DEVfetlim(vgms, *(ckt->CKTstate0 + here->BSIM4vgms), von); - vged = vges - vds; - vgmd = vgms - vds; - } - else if ((here->BSIM4rgateMod == 1) || (here->BSIM4rgateMod == 2)) - { vges = DEVfetlim(vges, *(ckt->CKTstate0 + here->BSIM4vges), von); - vged = vges - vds; - } - - if (model->BSIM4rdsMod) - { vdes = DEVlimvds(vdes, *(ckt->CKTstate0 + here->BSIM4vdes)); - vses = -DEVlimvds(-vses, -(*(ckt->CKTstate0 + here->BSIM4vses))); - } - - } - else - { vgd = DEVfetlim(vgd, vgdo, von); - vds = vgs - vgd; - vds = -DEVlimvds(-vds, -(*(ckt->CKTstate0 + here->BSIM4vds))); - vgs = vgd + vds; - - if (here->BSIM4rgateMod == 3) - { vged = DEVfetlim(vged, vgedo, von); - vges = vged + vds; - vgmd = DEVfetlim(vgmd, vgmdo, von); - vgms = vgmd + vds; - } - if ((here->BSIM4rgateMod == 1) || (here->BSIM4rgateMod == 2)) - { vged = DEVfetlim(vged, vgedo, von); - vges = vged + vds; - } - - if (model->BSIM4rdsMod) - { vdes = -DEVlimvds(-vdes, -(*(ckt->CKTstate0 + here->BSIM4vdes))); - vses = DEVlimvds(vses, *(ckt->CKTstate0 + here->BSIM4vses)); - } - } - - if (vds >= 0.0) - { vbs = DEVpnjlim(vbs, *(ckt->CKTstate0 + here->BSIM4vbs), - CONSTvt0, model->BSIM4vcrit, &Check); - vbd = vbs - vds; - if (here->BSIM4rbodyMod) - { vdbs = DEVpnjlim(vdbs, *(ckt->CKTstate0 + here->BSIM4vdbs), - CONSTvt0, model->BSIM4vcrit, &Check1); - vdbd = vdbs - vds; - vsbs = DEVpnjlim(vsbs, *(ckt->CKTstate0 + here->BSIM4vsbs), - CONSTvt0, model->BSIM4vcrit, &Check2); - if ((Check1 == 0) && (Check2 == 0)) - Check = 0; - else - Check = 1; - } - } - else - { vbd = DEVpnjlim(vbd, *(ckt->CKTstate0 + here->BSIM4vbd), - CONSTvt0, model->BSIM4vcrit, &Check); - vbs = vbd + vds; - if (here->BSIM4rbodyMod) - { vdbd = DEVpnjlim(vdbd, *(ckt->CKTstate0 + here->BSIM4vdbd), - CONSTvt0, model->BSIM4vcrit, &Check1); - vdbs = vdbd + vds; - vsbdo = *(ckt->CKTstate0 + here->BSIM4vsbs) - - *(ckt->CKTstate0 + here->BSIM4vds); - vsbd = vsbs - vds; - vsbd = DEVpnjlim(vsbd, vsbdo, CONSTvt0, model->BSIM4vcrit, &Check2); - vsbs = vsbd + vds; - if ((Check1 == 0) && (Check2 == 0)) - Check = 0; - else - Check = 1; - } - } - } - - /* Calculate DC currents and their derivatives */ - vbd = vbs - vds; - vgd = vgs - vds; - vgb = vgs - vbs; - vged = vges - vds; - vgmd = vgms - vds; - vgmb = vgms - vbs; - vdbd = vdbs - vds; - - vbs_jct = (!here->BSIM4rbodyMod) ? vbs : vsbs; - vbd_jct = (!here->BSIM4rbodyMod) ? vbd : vdbd; - - /* Source/drain junction diode DC model begins */ - Nvtms = model->BSIM4vtm * model->BSIM4SjctEmissionCoeff; -/* if ((here->BSIM4Aseff <= 0.0) && (here->BSIM4Pseff <= 0.0)) - { SourceSatCurrent = 1.0e-14; - } v4.7 */ - if ((here->BSIM4Aseff <= 0.0) && (here->BSIM4Pseff <= 0.0)) - { SourceSatCurrent = 0.0; - } - else - { SourceSatCurrent = here->BSIM4Aseff * model->BSIM4SjctTempSatCurDensity - + here->BSIM4Pseff * model->BSIM4SjctSidewallTempSatCurDensity - + pParam->BSIM4weffCJ * here->BSIM4nf - * model->BSIM4SjctGateSidewallTempSatCurDensity; - } - - if (SourceSatCurrent <= 0.0) - { here->BSIM4gbs = ckt->CKTgmin; - here->BSIM4cbs = here->BSIM4gbs * vbs_jct; - } - else - { switch(model->BSIM4dioMod) - { case 0: - evbs = exp(vbs_jct / Nvtms); - T1 = model->BSIM4xjbvs * exp(-(model->BSIM4bvs + vbs_jct) / Nvtms); - /* WDLiu: Magic T1 in this form; different from BSIM4 beta. */ - here->BSIM4gbs = SourceSatCurrent * (evbs + T1) / Nvtms + ckt->CKTgmin; - here->BSIM4cbs = SourceSatCurrent * (evbs + here->BSIM4XExpBVS - - T1 - 1.0) + ckt->CKTgmin * vbs_jct; - break; - case 1: - T2 = vbs_jct / Nvtms; - if (T2 < -EXP_THRESHOLD) - { here->BSIM4gbs = ckt->CKTgmin; - here->BSIM4cbs = SourceSatCurrent * (MIN_EXP - 1.0) - + ckt->CKTgmin * vbs_jct; - } - else if (vbs_jct <= here->BSIM4vjsmFwd) - { evbs = exp(T2); - here->BSIM4gbs = SourceSatCurrent * evbs / Nvtms + ckt->CKTgmin; - here->BSIM4cbs = SourceSatCurrent * (evbs - 1.0) - + ckt->CKTgmin * vbs_jct; - } - else - { T0 = here->BSIM4IVjsmFwd / Nvtms; - here->BSIM4gbs = T0 + ckt->CKTgmin; - here->BSIM4cbs = here->BSIM4IVjsmFwd - SourceSatCurrent + T0 - * (vbs_jct - here->BSIM4vjsmFwd) + ckt->CKTgmin * vbs_jct; - } - break; - case 2: - if (vbs_jct < here->BSIM4vjsmRev) - { T0 = vbs_jct / Nvtms; - if (T0 < -EXP_THRESHOLD) - { evbs = MIN_EXP; - devbs_dvb = 0.0; - } - else - { evbs = exp(T0); - devbs_dvb = evbs / Nvtms; - } - - T1 = evbs - 1.0; - T2 = here->BSIM4IVjsmRev + here->BSIM4SslpRev - * (vbs_jct - here->BSIM4vjsmRev); - here->BSIM4gbs = devbs_dvb * T2 + T1 * here->BSIM4SslpRev + ckt->CKTgmin; - here->BSIM4cbs = T1 * T2 + ckt->CKTgmin * vbs_jct; - } - else if (vbs_jct <= here->BSIM4vjsmFwd) - { T0 = vbs_jct / Nvtms; - if (T0 < -EXP_THRESHOLD) - { evbs = MIN_EXP; - devbs_dvb = 0.0; - } - else - { evbs = exp(T0); - devbs_dvb = evbs / Nvtms; - } - - T1 = (model->BSIM4bvs + vbs_jct) / Nvtms; - if (T1 > EXP_THRESHOLD) - { T2 = MIN_EXP; - T3 = 0.0; - } - else - { T2 = exp(-T1); - T3 = -T2 /Nvtms; - } - here->BSIM4gbs = SourceSatCurrent * (devbs_dvb - model->BSIM4xjbvs * T3) - + ckt->CKTgmin; - here->BSIM4cbs = SourceSatCurrent * (evbs + here->BSIM4XExpBVS - 1.0 - - model->BSIM4xjbvs * T2) + ckt->CKTgmin * vbs_jct; - } - else - { here->BSIM4gbs = here->BSIM4SslpFwd + ckt->CKTgmin; - here->BSIM4cbs = here->BSIM4IVjsmFwd + here->BSIM4SslpFwd * (vbs_jct - - here->BSIM4vjsmFwd) + ckt->CKTgmin * vbs_jct; - } - break; - default: break; - } - } - - Nvtmd = model->BSIM4vtm * model->BSIM4DjctEmissionCoeff; -/* if ((here->BSIM4Adeff <= 0.0) && (here->BSIM4Pdeff <= 0.0)) - { DrainSatCurrent = 1.0e-14; - } v4.7 */ - if ((here->BSIM4Adeff <= 0.0) && (here->BSIM4Pdeff <= 0.0)) - { DrainSatCurrent = 0.0; - } - else - { DrainSatCurrent = here->BSIM4Adeff * model->BSIM4DjctTempSatCurDensity - + here->BSIM4Pdeff * model->BSIM4DjctSidewallTempSatCurDensity - + pParam->BSIM4weffCJ * here->BSIM4nf - * model->BSIM4DjctGateSidewallTempSatCurDensity; - } - - if (DrainSatCurrent <= 0.0) - { here->BSIM4gbd = ckt->CKTgmin; - here->BSIM4cbd = here->BSIM4gbd * vbd_jct; - } - else - { switch(model->BSIM4dioMod) - { case 0: - evbd = exp(vbd_jct / Nvtmd); - T1 = model->BSIM4xjbvd * exp(-(model->BSIM4bvd + vbd_jct) / Nvtmd); - /* WDLiu: Magic T1 in this form; different from BSIM4 beta. */ - here->BSIM4gbd = DrainSatCurrent * (evbd + T1) / Nvtmd + ckt->CKTgmin; - here->BSIM4cbd = DrainSatCurrent * (evbd + here->BSIM4XExpBVD - - T1 - 1.0) + ckt->CKTgmin * vbd_jct; - break; - case 1: - T2 = vbd_jct / Nvtmd; - if (T2 < -EXP_THRESHOLD) - { here->BSIM4gbd = ckt->CKTgmin; - here->BSIM4cbd = DrainSatCurrent * (MIN_EXP - 1.0) - + ckt->CKTgmin * vbd_jct; - } - else if (vbd_jct <= here->BSIM4vjdmFwd) - { evbd = exp(T2); - here->BSIM4gbd = DrainSatCurrent * evbd / Nvtmd + ckt->CKTgmin; - here->BSIM4cbd = DrainSatCurrent * (evbd - 1.0) - + ckt->CKTgmin * vbd_jct; - } - else - { T0 = here->BSIM4IVjdmFwd / Nvtmd; - here->BSIM4gbd = T0 + ckt->CKTgmin; - here->BSIM4cbd = here->BSIM4IVjdmFwd - DrainSatCurrent + T0 - * (vbd_jct - here->BSIM4vjdmFwd) + ckt->CKTgmin * vbd_jct; - } - break; - case 2: - if (vbd_jct < here->BSIM4vjdmRev) - { T0 = vbd_jct / Nvtmd; - if (T0 < -EXP_THRESHOLD) - { evbd = MIN_EXP; - devbd_dvb = 0.0; - } - else - { evbd = exp(T0); - devbd_dvb = evbd / Nvtmd; - } - - T1 = evbd - 1.0; - T2 = here->BSIM4IVjdmRev + here->BSIM4DslpRev - * (vbd_jct - here->BSIM4vjdmRev); - here->BSIM4gbd = devbd_dvb * T2 + T1 * here->BSIM4DslpRev + ckt->CKTgmin; - here->BSIM4cbd = T1 * T2 + ckt->CKTgmin * vbd_jct; - } - else if (vbd_jct <= here->BSIM4vjdmFwd) - { T0 = vbd_jct / Nvtmd; - if (T0 < -EXP_THRESHOLD) - { evbd = MIN_EXP; - devbd_dvb = 0.0; - } - else - { evbd = exp(T0); - devbd_dvb = evbd / Nvtmd; - } - - T1 = (model->BSIM4bvd + vbd_jct) / Nvtmd; - if (T1 > EXP_THRESHOLD) - { T2 = MIN_EXP; - T3 = 0.0; - } - else - { T2 = exp(-T1); - T3 = -T2 /Nvtmd; - } - here->BSIM4gbd = DrainSatCurrent * (devbd_dvb - model->BSIM4xjbvd * T3) - + ckt->CKTgmin; - here->BSIM4cbd = DrainSatCurrent * (evbd + here->BSIM4XExpBVD - 1.0 - - model->BSIM4xjbvd * T2) + ckt->CKTgmin * vbd_jct; - } - else - { here->BSIM4gbd = here->BSIM4DslpFwd + ckt->CKTgmin; - here->BSIM4cbd = here->BSIM4IVjdmFwd + here->BSIM4DslpFwd * (vbd_jct - - here->BSIM4vjdmFwd) + ckt->CKTgmin * vbd_jct; - } - break; - default: break; - } - } - - /* trap-assisted tunneling and recombination current for reverse bias */ - Nvtmrssws = model->BSIM4vtm0 * model->BSIM4njtsswstemp; - Nvtmrsswgs = model->BSIM4vtm0 * model->BSIM4njtsswgstemp; - Nvtmrss = model->BSIM4vtm0 * model->BSIM4njtsstemp; - Nvtmrsswd = model->BSIM4vtm0 * model->BSIM4njtsswdtemp; - Nvtmrsswgd = model->BSIM4vtm0 * model->BSIM4njtsswgdtemp; - Nvtmrsd = model->BSIM4vtm0 * model->BSIM4njtsdtemp; - - if ((model->BSIM4vtss - vbs_jct) < (model->BSIM4vtss * 1e-3)) - { T9 = 1.0e3; - T0 = - vbs_jct / Nvtmrss * T9; - DEXP(T0, T1, T10); - dT1_dVb = T10 / Nvtmrss * T9; - } else { - T9 = 1.0 / (model->BSIM4vtss - vbs_jct); - T0 = -vbs_jct / Nvtmrss * model->BSIM4vtss * T9; - dT0_dVb = model->BSIM4vtss / Nvtmrss * (T9 + vbs_jct * T9 * T9) ; - DEXP(T0, T1, T10); - dT1_dVb = T10 * dT0_dVb; - } - - if ((model->BSIM4vtsd - vbd_jct) < (model->BSIM4vtsd * 1e-3) ) - { T9 = 1.0e3; - T0 = -vbd_jct / Nvtmrsd * T9; - DEXP(T0, T2, T10); - dT2_dVb = T10 / Nvtmrsd * T9; - } else { - T9 = 1.0 / (model->BSIM4vtsd - vbd_jct); - T0 = -vbd_jct / Nvtmrsd * model->BSIM4vtsd * T9; - dT0_dVb = model->BSIM4vtsd / Nvtmrsd * (T9 + vbd_jct * T9 * T9) ; - DEXP(T0, T2, T10); - dT2_dVb = T10 * dT0_dVb; - } - - if ((model->BSIM4vtssws - vbs_jct) < (model->BSIM4vtssws * 1e-3) ) - { T9 = 1.0e3; - T0 = -vbs_jct / Nvtmrssws * T9; - DEXP(T0, T3, T10); - dT3_dVb = T10 / Nvtmrssws * T9; - } else { - T9 = 1.0 / (model->BSIM4vtssws - vbs_jct); - T0 = -vbs_jct / Nvtmrssws * model->BSIM4vtssws * T9; - dT0_dVb = model->BSIM4vtssws / Nvtmrssws * (T9 + vbs_jct * T9 * T9) ; - DEXP(T0, T3, T10); - dT3_dVb = T10 * dT0_dVb; - } - - if ((model->BSIM4vtsswd - vbd_jct) < (model->BSIM4vtsswd * 1e-3) ) - { T9 = 1.0e3; - T0 = -vbd_jct / Nvtmrsswd * T9; - DEXP(T0, T4, T10); - dT4_dVb = T10 / Nvtmrsswd * T9; - } else { - T9 = 1.0 / (model->BSIM4vtsswd - vbd_jct); - T0 = -vbd_jct / Nvtmrsswd * model->BSIM4vtsswd * T9; - dT0_dVb = model->BSIM4vtsswd / Nvtmrsswd * (T9 + vbd_jct * T9 * T9) ; - DEXP(T0, T4, T10); - dT4_dVb = T10 * dT0_dVb; - } - - if ((model->BSIM4vtsswgs - vbs_jct) < (model->BSIM4vtsswgs * 1e-3) ) - { T9 = 1.0e3; - T0 = -vbs_jct / Nvtmrsswgs * T9; - DEXP(T0, T5, T10); - dT5_dVb = T10 / Nvtmrsswgs * T9; - } else { - T9 = 1.0 / (model->BSIM4vtsswgs - vbs_jct); - T0 = -vbs_jct / Nvtmrsswgs * model->BSIM4vtsswgs * T9; - dT0_dVb = model->BSIM4vtsswgs / Nvtmrsswgs * (T9 + vbs_jct * T9 * T9) ; - DEXP(T0, T5, T10); - dT5_dVb = T10 * dT0_dVb; - } - - if ((model->BSIM4vtsswgd - vbd_jct) < (model->BSIM4vtsswgd * 1e-3) ) - { T9 = 1.0e3; - T0 = -vbd_jct / Nvtmrsswgd * T9; - DEXP(T0, T6, T10); - dT6_dVb = T10 / Nvtmrsswgd * T9; - } else { - T9 = 1.0 / (model->BSIM4vtsswgd - vbd_jct); - T0 = -vbd_jct / Nvtmrsswgd * model->BSIM4vtsswgd * T9; - dT0_dVb = model->BSIM4vtsswgd / Nvtmrsswgd * (T9 + vbd_jct * T9 * T9) ; - DEXP(T0, T6, T10); - dT6_dVb = T10 * dT0_dVb; - } - - here->BSIM4gbs += here->BSIM4SjctTempRevSatCur * dT1_dVb - + here->BSIM4SswTempRevSatCur * dT3_dVb - + here->BSIM4SswgTempRevSatCur * dT5_dVb; - here->BSIM4cbs -= here->BSIM4SjctTempRevSatCur * (T1 - 1.0) - + here->BSIM4SswTempRevSatCur * (T3 - 1.0) - + here->BSIM4SswgTempRevSatCur * (T5 - 1.0); - here->BSIM4gbd += here->BSIM4DjctTempRevSatCur * dT2_dVb - + here->BSIM4DswTempRevSatCur * dT4_dVb - + here->BSIM4DswgTempRevSatCur * dT6_dVb; - here->BSIM4cbd -= here->BSIM4DjctTempRevSatCur * (T2 - 1.0) - + here->BSIM4DswTempRevSatCur * (T4 - 1.0) - + here->BSIM4DswgTempRevSatCur * (T6 - 1.0); - - /* End of diode DC model */ - - if (vds >= 0.0) - { here->BSIM4mode = 1; - Vds = vds; - Vgs = vgs; - Vbs = vbs; - Vdb = vds - vbs; /* WDLiu: for GIDL */ - - } - else - { here->BSIM4mode = -1; - Vds = -vds; - Vgs = vgd; - Vbs = vbd; - Vdb = -vbs; - } - - - /* dunga */ - if(model->BSIM4mtrlMod) - { - epsrox = 3.9; - toxe = model->BSIM4eot; - epssub = EPS0 * model->BSIM4epsrsub; - } - else - { - epsrox = model->BSIM4epsrox; - toxe = model->BSIM4toxe; - epssub = EPSSI; - } - - - T0 = Vbs - here->BSIM4vbsc - 0.001; - T1 = sqrt(T0 * T0 - 0.004 * here->BSIM4vbsc); - if (T0 >= 0.0) - { Vbseff = here->BSIM4vbsc + 0.5 * (T0 + T1); - dVbseff_dVb = 0.5 * (1.0 + T0 / T1); - } - else - { T2 = -0.002 / (T1 - T0); - Vbseff = here->BSIM4vbsc * (1.0 + T2); - dVbseff_dVb = T2 * here->BSIM4vbsc / T1; - } - - /* JX: Correction to forward body bias */ - T9 = 0.95 * pParam->BSIM4phi; - T0 = T9 - Vbseff - 0.001; - T1 = sqrt(T0 * T0 + 0.004 * T9); - Vbseff = T9 - 0.5 * (T0 + T1); - dVbseff_dVb *= 0.5 * (1.0 + T0 / T1); - Phis = pParam->BSIM4phi - Vbseff; - dPhis_dVb = -1.0; - sqrtPhis = sqrt(Phis); - dsqrtPhis_dVb = -0.5 / sqrtPhis; - - Xdep = pParam->BSIM4Xdep0 * sqrtPhis / pParam->BSIM4sqrtPhi; - dXdep_dVb = (pParam->BSIM4Xdep0 / pParam->BSIM4sqrtPhi) - * dsqrtPhis_dVb; - - Leff = pParam->BSIM4leff; - Vtm = model->BSIM4vtm; - Vtm0 = model->BSIM4vtm0; - - /* Vth Calculation */ - T3 = sqrt(Xdep); - V0 = pParam->BSIM4vbi - pParam->BSIM4phi; - - T0 = pParam->BSIM4dvt2 * Vbseff; - if (T0 >= - 0.5) - { T1 = 1.0 + T0; - T2 = pParam->BSIM4dvt2; - } - else - { T4 = 1.0 / (3.0 + 8.0 * T0); - T1 = (1.0 + 3.0 * T0) * T4; - T2 = pParam->BSIM4dvt2 * T4 * T4; - } - lt1 = model->BSIM4factor1 * T3 * T1; - dlt1_dVb = model->BSIM4factor1 * (0.5 / T3 * T1 * dXdep_dVb + T3 * T2); - - T0 = pParam->BSIM4dvt2w * Vbseff; - if (T0 >= - 0.5) - { T1 = 1.0 + T0; - T2 = pParam->BSIM4dvt2w; - } - else - { T4 = 1.0 / (3.0 + 8.0 * T0); - T1 = (1.0 + 3.0 * T0) * T4; - T2 = pParam->BSIM4dvt2w * T4 * T4; - } - ltw = model->BSIM4factor1 * T3 * T1; - dltw_dVb = model->BSIM4factor1 * (0.5 / T3 * T1 * dXdep_dVb + T3 * T2); - - T0 = pParam->BSIM4dvt1 * Leff / lt1; - if (T0 < EXP_THRESHOLD) - { T1 = exp(T0); - T2 = T1 - 1.0; - T3 = T2 * T2; - T4 = T3 + 2.0 * T1 * MIN_EXP; - Theta0 = T1 / T4; - dT1_dVb = -T0 * T1 * dlt1_dVb / lt1; - dTheta0_dVb = dT1_dVb * (T4 - 2.0 * T1 * (T2 + MIN_EXP)) / T4 / T4; - } - else - { Theta0 = 1.0 / (MAX_EXP - 2.0); /* 3.0 * MIN_EXP omitted */ - dTheta0_dVb = 0.0; - } - here->BSIM4thetavth = pParam->BSIM4dvt0 * Theta0; - Delt_vth = here->BSIM4thetavth * V0; - dDelt_vth_dVb = pParam->BSIM4dvt0 * dTheta0_dVb * V0; - - T0 = pParam->BSIM4dvt1w * pParam->BSIM4weff * Leff / ltw; - if (T0 < EXP_THRESHOLD) - { T1 = exp(T0); - T2 = T1 - 1.0; - T3 = T2 * T2; - T4 = T3 + 2.0 * T1 * MIN_EXP; - T5 = T1 / T4; - dT1_dVb = -T0 * T1 * dltw_dVb / ltw; - dT5_dVb = dT1_dVb * (T4 - 2.0 * T1 * (T2 + MIN_EXP)) / T4 / T4; - } - else - { T5 = 1.0 / (MAX_EXP - 2.0); /* 3.0 * MIN_EXP omitted */ - dT5_dVb = 0.0; - } - T0 = pParam->BSIM4dvt0w * T5; - T2 = T0 * V0; - dT2_dVb = pParam->BSIM4dvt0w * dT5_dVb * V0; - - TempRatio = ckt->CKTtemp / model->BSIM4tnom - 1.0; - T0 = sqrt(1.0 + pParam->BSIM4lpe0 / Leff); - T1 = pParam->BSIM4k1ox * (T0 - 1.0) * pParam->BSIM4sqrtPhi - + (pParam->BSIM4kt1 + pParam->BSIM4kt1l / Leff - + pParam->BSIM4kt2 * Vbseff) * TempRatio; - Vth_NarrowW = toxe * pParam->BSIM4phi - / (pParam->BSIM4weff + pParam->BSIM4w0); - - T3 = here->BSIM4eta0 + pParam->BSIM4etab * Vbseff; - if (T3 < 1.0e-4) - { T9 = 1.0 / (3.0 - 2.0e4 * T3); - T3 = (2.0e-4 - T3) * T9; - T4 = T9 * T9; - } - else - { T4 = 1.0; - } - dDIBL_Sft_dVd = T3 * pParam->BSIM4theta0vb0; - DIBL_Sft = dDIBL_Sft_dVd * Vds; - - Lpe_Vb = sqrt(1.0 + pParam->BSIM4lpeb / Leff); - - Vth = model->BSIM4type * here->BSIM4vth0 + (pParam->BSIM4k1ox * sqrtPhis - - pParam->BSIM4k1 * pParam->BSIM4sqrtPhi) * Lpe_Vb - - here->BSIM4k2ox * Vbseff - Delt_vth - T2 + (pParam->BSIM4k3 - + pParam->BSIM4k3b * Vbseff) * Vth_NarrowW + T1 - DIBL_Sft; - - dVth_dVb = Lpe_Vb * pParam->BSIM4k1ox * dsqrtPhis_dVb - here->BSIM4k2ox - - dDelt_vth_dVb - dT2_dVb + pParam->BSIM4k3b * Vth_NarrowW - - pParam->BSIM4etab * Vds * pParam->BSIM4theta0vb0 * T4 - + pParam->BSIM4kt2 * TempRatio; - dVth_dVd = -dDIBL_Sft_dVd; - - - /* Calculate n */ - tmp1 = epssub / Xdep; - here->BSIM4nstar = model->BSIM4vtm / Charge_q * (model->BSIM4coxe - + tmp1 + pParam->BSIM4cit); - tmp2 = pParam->BSIM4nfactor * tmp1; - tmp3 = pParam->BSIM4cdsc + pParam->BSIM4cdscb * Vbseff - + pParam->BSIM4cdscd * Vds; - tmp4 = (tmp2 + tmp3 * Theta0 + pParam->BSIM4cit) / model->BSIM4coxe; - if (tmp4 >= -0.5) - { n = 1.0 + tmp4; - dn_dVb = (-tmp2 / Xdep * dXdep_dVb + tmp3 * dTheta0_dVb - + pParam->BSIM4cdscb * Theta0) / model->BSIM4coxe; - dn_dVd = pParam->BSIM4cdscd * Theta0 / model->BSIM4coxe; - } - else - { T0 = 1.0 / (3.0 + 8.0 * tmp4); - n = (1.0 + 3.0 * tmp4) * T0; - T0 *= T0; - dn_dVb = (-tmp2 / Xdep * dXdep_dVb + tmp3 * dTheta0_dVb - + pParam->BSIM4cdscb * Theta0) / model->BSIM4coxe * T0; - dn_dVd = pParam->BSIM4cdscd * Theta0 / model->BSIM4coxe * T0; - } - - - /* Vth correction for Pocket implant */ - if (pParam->BSIM4dvtp0 > 0.0) - { T0 = -pParam->BSIM4dvtp1 * Vds; - if (T0 < -EXP_THRESHOLD) - { T2 = MIN_EXP; - dT2_dVd = 0.0; - } - else - { T2 = exp(T0); - dT2_dVd = -pParam->BSIM4dvtp1 * T2; - } - - T3 = Leff + pParam->BSIM4dvtp0 * (1.0 + T2); - dT3_dVd = pParam->BSIM4dvtp0 * dT2_dVd; - if (model->BSIM4tempMod < 2) - { - T4 = Vtm * log(Leff / T3); - dT4_dVd = -Vtm * dT3_dVd / T3; - } - else - { - T4 = model->BSIM4vtm0 * log(Leff / T3); - dT4_dVd = -model->BSIM4vtm0 * dT3_dVd / T3; - } - dDITS_Sft_dVd = dn_dVd * T4 + n * dT4_dVd; - dDITS_Sft_dVb = T4 * dn_dVb; - - Vth -= n * T4; - dVth_dVd -= dDITS_Sft_dVd; - dVth_dVb -= dDITS_Sft_dVb; - } - - /* v4.7 DITS_SFT2 */ - if ((pParam->BSIM4dvtp4 == 0.0) || (pParam->BSIM4dvtp2factor == 0.0)) { - T0 = 0.0; - DITS_Sft2 = 0.0; - } - else - { - //T0 = exp(2.0 * pParam->BSIM4dvtp4 * Vds); /* beta code */ - T1 = 2.0 * pParam->BSIM4dvtp4 * Vds; - DEXP(T1, T0, T10); - DITS_Sft2 = pParam->BSIM4dvtp2factor * (T0-1) / (T0+1); - //dDITS_Sft2_dVd = pParam->BSIM4dvtp2factor * pParam->BSIM4dvtp4 * 4.0 * T0 / ((T0+1) * (T0+1)); /* beta code */ - dDITS_Sft2_dVd = pParam->BSIM4dvtp2factor * pParam->BSIM4dvtp4 * 4.0 * T10 / ((T0+1) * (T0+1)); - Vth -= DITS_Sft2; - dVth_dVd -= dDITS_Sft2_dVd; - } - - - - here->BSIM4von = Vth; - - - /* Poly Gate Si Depletion Effect */ - T0 = here->BSIM4vfb + pParam->BSIM4phi; - if(model->BSIM4mtrlMod == 0) - T1 = EPSSI; - else - T1 = model->BSIM4epsrgate * EPS0; - - - BSIM4polyDepletion(T0, pParam->BSIM4ngate, T1, model->BSIM4coxe, vgs, &vgs_eff, &dvgs_eff_dvg); - - BSIM4polyDepletion(T0, pParam->BSIM4ngate, T1, model->BSIM4coxe, vgd, &vgd_eff, &dvgd_eff_dvg); - - if(here->BSIM4mode>0) { - Vgs_eff = vgs_eff; - dVgs_eff_dVg = dvgs_eff_dvg; - } else { - Vgs_eff = vgd_eff; - dVgs_eff_dVg = dvgd_eff_dvg; - } - here->BSIM4vgs_eff = vgs_eff; - here->BSIM4vgd_eff = vgd_eff; - here->BSIM4dvgs_eff_dvg = dvgs_eff_dvg; - here->BSIM4dvgd_eff_dvg = dvgd_eff_dvg; - - - Vgst = Vgs_eff - Vth; - - /* Calculate Vgsteff */ - T0 = n * Vtm; - T1 = pParam->BSIM4mstar * Vgst; - T2 = T1 / T0; - if (T2 > EXP_THRESHOLD) - { T10 = T1; - dT10_dVg = pParam->BSIM4mstar * dVgs_eff_dVg; - dT10_dVd = -dVth_dVd * pParam->BSIM4mstar; - dT10_dVb = -dVth_dVb * pParam->BSIM4mstar; - } - else if (T2 < -EXP_THRESHOLD) - { T10 = Vtm * log(1.0 + MIN_EXP); - dT10_dVg = 0.0; - dT10_dVd = T10 * dn_dVd; - dT10_dVb = T10 * dn_dVb; - T10 *= n; - } - else - { ExpVgst = exp(T2); - T3 = Vtm * log(1.0 + ExpVgst); - T10 = n * T3; - dT10_dVg = pParam->BSIM4mstar * ExpVgst / (1.0 + ExpVgst); - dT10_dVb = T3 * dn_dVb - dT10_dVg * (dVth_dVb + Vgst * dn_dVb / n); - dT10_dVd = T3 * dn_dVd - dT10_dVg * (dVth_dVd + Vgst * dn_dVd / n); - dT10_dVg *= dVgs_eff_dVg; - } - - T1 = pParam->BSIM4voffcbn - (1.0 - pParam->BSIM4mstar) * Vgst; - T2 = T1 / T0; - if (T2 < -EXP_THRESHOLD) - { T3 = model->BSIM4coxe * MIN_EXP / pParam->BSIM4cdep0; - T9 = pParam->BSIM4mstar + T3 * n; - dT9_dVg = 0.0; - dT9_dVd = dn_dVd * T3; - dT9_dVb = dn_dVb * T3; - } - else if (T2 > EXP_THRESHOLD) - { T3 = model->BSIM4coxe * MAX_EXP / pParam->BSIM4cdep0; - T9 = pParam->BSIM4mstar + T3 * n; - dT9_dVg = 0.0; - dT9_dVd = dn_dVd * T3; - dT9_dVb = dn_dVb * T3; - } - else - { ExpVgst = exp(T2); - T3 = model->BSIM4coxe / pParam->BSIM4cdep0; - T4 = T3 * ExpVgst; - T5 = T1 * T4 / T0; - T9 = pParam->BSIM4mstar + n * T4; - dT9_dVg = T3 * (pParam->BSIM4mstar - 1.0) * ExpVgst / Vtm; - dT9_dVb = T4 * dn_dVb - dT9_dVg * dVth_dVb - T5 * dn_dVb; - dT9_dVd = T4 * dn_dVd - dT9_dVg * dVth_dVd - T5 * dn_dVd; - dT9_dVg *= dVgs_eff_dVg; - } - here->BSIM4Vgsteff = Vgsteff = T10 / T9; - T11 = T9 * T9; - dVgsteff_dVg = (T9 * dT10_dVg - T10 * dT9_dVg) / T11; - dVgsteff_dVd = (T9 * dT10_dVd - T10 * dT9_dVd) / T11; - dVgsteff_dVb = (T9 * dT10_dVb - T10 * dT9_dVb) / T11; - - /* Calculate Effective Channel Geometry */ - T9 = sqrtPhis - pParam->BSIM4sqrtPhi; - Weff = pParam->BSIM4weff - 2.0 * (pParam->BSIM4dwg * Vgsteff - + pParam->BSIM4dwb * T9); - dWeff_dVg = -2.0 * pParam->BSIM4dwg; - dWeff_dVb = -2.0 * pParam->BSIM4dwb * dsqrtPhis_dVb; - - if (Weff < 2.0e-8) /* to avoid the discontinuity problem due to Weff*/ - { T0 = 1.0 / (6.0e-8 - 2.0 * Weff); - Weff = 2.0e-8 * (4.0e-8 - Weff) * T0; - T0 *= T0 * 4.0e-16; - dWeff_dVg *= T0; - dWeff_dVb *= T0; - } - - if (model->BSIM4rdsMod == 1) - Rds = dRds_dVg = dRds_dVb = 0.0; - else - { T0 = 1.0 + pParam->BSIM4prwg * Vgsteff; - dT0_dVg = -pParam->BSIM4prwg / T0 / T0; - T1 = pParam->BSIM4prwb * T9; - dT1_dVb = pParam->BSIM4prwb * dsqrtPhis_dVb; - - T2 = 1.0 / T0 + T1; - T3 = T2 + sqrt(T2 * T2 + 0.01); /* 0.01 = 4.0 * 0.05 * 0.05 */ - dT3_dVg = 1.0 + T2 / (T3 - T2); - dT3_dVb = dT3_dVg * dT1_dVb; - dT3_dVg *= dT0_dVg; - - T4 = pParam->BSIM4rds0 * 0.5; - Rds = pParam->BSIM4rdswmin + T3 * T4; - dRds_dVg = T4 * dT3_dVg; - dRds_dVb = T4 * dT3_dVb; - - if (Rds > 0.0) - here->BSIM4grdsw = 1.0 / Rds* here->BSIM4nf; /*4.6.2*/ - else - here->BSIM4grdsw = 0.0; - } - - /* Calculate Abulk */ - T9 = 0.5 * pParam->BSIM4k1ox * Lpe_Vb / sqrtPhis; - T1 = T9 + here->BSIM4k2ox - pParam->BSIM4k3b * Vth_NarrowW; - dT1_dVb = -T9 / sqrtPhis * dsqrtPhis_dVb; - - T9 = sqrt(pParam->BSIM4xj * Xdep); - tmp1 = Leff + 2.0 * T9; - T5 = Leff / tmp1; - tmp2 = pParam->BSIM4a0 * T5; - tmp3 = pParam->BSIM4weff + pParam->BSIM4b1; - tmp4 = pParam->BSIM4b0 / tmp3; - T2 = tmp2 + tmp4; - dT2_dVb = -T9 / tmp1 / Xdep * dXdep_dVb; - T6 = T5 * T5; - T7 = T5 * T6; - - Abulk0 = 1.0 + T1 * T2; - dAbulk0_dVb = T1 * tmp2 * dT2_dVb + T2 * dT1_dVb; - - T8 = pParam->BSIM4ags * pParam->BSIM4a0 * T7; - dAbulk_dVg = -T1 * T8; - Abulk = Abulk0 + dAbulk_dVg * Vgsteff; - dAbulk_dVb = dAbulk0_dVb - T8 * Vgsteff * (dT1_dVb - + 3.0 * T1 * dT2_dVb); - - if (Abulk0 < 0.1) /* added to avoid the problems caused by Abulk0 */ - { T9 = 1.0 / (3.0 - 20.0 * Abulk0); - Abulk0 = (0.2 - Abulk0) * T9; - dAbulk0_dVb *= T9 * T9; - } - - if (Abulk < 0.1) - { T9 = 1.0 / (3.0 - 20.0 * Abulk); - Abulk = (0.2 - Abulk) * T9; - T10 = T9 * T9; - dAbulk_dVb *= T10; - dAbulk_dVg *= T10; - } - here->BSIM4Abulk = Abulk; - - T2 = pParam->BSIM4keta * Vbseff; - if (T2 >= -0.9) - { T0 = 1.0 / (1.0 + T2); - dT0_dVb = -pParam->BSIM4keta * T0 * T0; - } - else - { T1 = 1.0 / (0.8 + T2); - T0 = (17.0 + 20.0 * T2) * T1; - dT0_dVb = -pParam->BSIM4keta * T1 * T1; - } - dAbulk_dVg *= T0; - dAbulk_dVb = dAbulk_dVb * T0 + Abulk * dT0_dVb; - dAbulk0_dVb = dAbulk0_dVb * T0 + Abulk0 * dT0_dVb; - Abulk *= T0; - Abulk0 *= T0; - - /* Mobility calculation */ - if (model->BSIM4mtrlMod && model->BSIM4mtrlCompatMod == 0) - T14 = 2.0 * model->BSIM4type *(model->BSIM4phig - model->BSIM4easub - 0.5*model->BSIM4Eg0 + 0.45); - else - T14 = 0.0; - - if (model->BSIM4mobMod == 0) - { T0 = Vgsteff + Vth + Vth - T14; - T2 = pParam->BSIM4ua + pParam->BSIM4uc * Vbseff; - T3 = T0 / toxe; - T12 = sqrt(Vth * Vth + 0.0001); - T9 = 1.0/(Vgsteff + 2*T12); - T10 = T9*toxe; - T8 = pParam->BSIM4ud * T10 * T10 * Vth; - T6 = T8 * Vth; - T5 = T3 * (T2 + pParam->BSIM4ub * T3) + T6; - T7 = - 2.0 * T6 * T9; - T11 = T7 * Vth/T12; - dDenomi_dVg = (T2 + 2.0 * pParam->BSIM4ub * T3) / toxe; - T13 = 2.0 * (dDenomi_dVg + T11 + T8); - dDenomi_dVd = T13 * dVth_dVd; - dDenomi_dVb = T13 * dVth_dVb + pParam->BSIM4uc * T3; - dDenomi_dVg+= T7; - } - else if (model->BSIM4mobMod == 1) - { T0 = Vgsteff + Vth + Vth - T14; - T2 = 1.0 + pParam->BSIM4uc * Vbseff; - T3 = T0 / toxe; - T4 = T3 * (pParam->BSIM4ua + pParam->BSIM4ub * T3); - T12 = sqrt(Vth * Vth + 0.0001); - T9 = 1.0/(Vgsteff + 2*T12); - T10 = T9*toxe; - T8 = pParam->BSIM4ud * T10 * T10 * Vth; - T6 = T8 * Vth; - T5 = T4 * T2 + T6; - T7 = - 2.0 * T6 * T9; - T11 = T7 * Vth/T12; - dDenomi_dVg = (pParam->BSIM4ua + 2.0 * pParam->BSIM4ub * T3) * T2 / toxe; - T13 = 2.0 * (dDenomi_dVg + T11 + T8); - dDenomi_dVd = T13 * dVth_dVd; - dDenomi_dVb = T13 * dVth_dVb + pParam->BSIM4uc * T4; - dDenomi_dVg+= T7; - } - else if (model->BSIM4mobMod == 2) - { T0 = (Vgsteff + here->BSIM4vtfbphi1) / toxe; - T1 = exp(pParam->BSIM4eu * log(T0)); - dT1_dVg = T1 * pParam->BSIM4eu / T0 / toxe; - T2 = pParam->BSIM4ua + pParam->BSIM4uc * Vbseff; - - T12 = sqrt(Vth * Vth + 0.0001); - T9 = 1.0/(Vgsteff + 2*T12); - T10 = T9*toxe; - T8 = pParam->BSIM4ud * T10 * T10 * Vth; - T6 = T8 * Vth; - T5 = T1 * T2 + T6; - T7 = - 2.0 * T6 * T9; - T11 = T7 * Vth/T12; - dDenomi_dVg = T2 * dT1_dVg + T7; - T13 = 2.0 * (T11 + T8); - dDenomi_dVd = T13 * dVth_dVd; - dDenomi_dVb = T13 * dVth_dVb + T1 * pParam->BSIM4uc; - } - else if (model->BSIM4mobMod == 4) /* Synopsys 08/30/2013 add */ - { - T0 = Vgsteff + here->BSIM4vtfbphi1 - T14; - T2 = pParam->BSIM4ua + pParam->BSIM4uc * Vbseff; - T3 = T0 / toxe; - T12 = sqrt(here->BSIM4vtfbphi1*here->BSIM4vtfbphi1 + 0.0001); - T9 = 1.0/(Vgsteff + 2*T12); - T10 = T9*toxe; - T8 = pParam->BSIM4ud * T10 * T10 * here->BSIM4vtfbphi1; - T6 = T8 * here->BSIM4vtfbphi1; - T5 = T3 * (T2 + pParam->BSIM4ub * T3) + T6; - T7 = - 2.0 * T6 * T9; - dDenomi_dVg = (T2 + 2.0 * pParam->BSIM4ub * T3) / toxe; - dDenomi_dVd = 0.0; - dDenomi_dVb = pParam->BSIM4uc * T3; - dDenomi_dVg+= T7; - } - else if (model->BSIM4mobMod == 5) /* Synopsys 08/30/2013 add */ - { - T0 = Vgsteff + here->BSIM4vtfbphi1 - T14; - T2 = 1.0 + pParam->BSIM4uc * Vbseff; - T3 = T0 / toxe; - T4 = T3 * (pParam->BSIM4ua + pParam->BSIM4ub * T3); - T12 = sqrt(here->BSIM4vtfbphi1 * here->BSIM4vtfbphi1 + 0.0001); - T9 = 1.0/(Vgsteff + 2*T12); - T10 = T9*toxe; - T8 = pParam->BSIM4ud * T10 * T10 * here->BSIM4vtfbphi1; - T6 = T8 * here->BSIM4vtfbphi1; - T5 = T4 * T2 + T6; - T7 = - 2.0 * T6 * T9; - dDenomi_dVg = (pParam->BSIM4ua + 2.0 * pParam->BSIM4ub * T3) * T2 - / toxe; - dDenomi_dVd = 0.0; - dDenomi_dVb = pParam->BSIM4uc * T4; - dDenomi_dVg+= T7; - } - else if (model->BSIM4mobMod == 6) /* Synopsys 08/30/2013 modify */ - { T0 = (Vgsteff + here->BSIM4vtfbphi1) / toxe; - T1 = exp(pParam->BSIM4eu * log(T0)); - dT1_dVg = T1 * pParam->BSIM4eu / T0 / toxe; - T2 = pParam->BSIM4ua + pParam->BSIM4uc * Vbseff; - - T12 = sqrt(here->BSIM4vtfbphi1 * here->BSIM4vtfbphi1 + 0.0001); - T9 = 1.0/(Vgsteff + 2*T12); - T10 = T9*toxe; - T8 = pParam->BSIM4ud * T10 * T10 * here->BSIM4vtfbphi1; - T6 = T8 * here->BSIM4vtfbphi1; - T5 = T1 * T2 + T6; - T7 = - 2.0 * T6 * T9; - dDenomi_dVg = T2 * dT1_dVg + T7; - dDenomi_dVd = 0; - dDenomi_dVb = T1 * pParam->BSIM4uc; - } - - /*high K mobility*/ - else - { - - - /*univsersal mobility*/ - T0 = (Vgsteff + here->BSIM4vtfbphi1)* 1.0e-8 / toxe/6.0; - T1 = exp(pParam->BSIM4eu * log(T0)); - dT1_dVg = T1 * pParam->BSIM4eu * 1.0e-8/ T0 / toxe/6.0; - T2 = pParam->BSIM4ua + pParam->BSIM4uc * Vbseff; - - /*Coulombic*/ - VgsteffVth = pParam->BSIM4VgsteffVth; - - T10 = exp(pParam->BSIM4ucs * log(0.5 + 0.5 * Vgsteff/VgsteffVth)); - T11 = pParam->BSIM4ud/T10; - dT11_dVg = - 0.5 * pParam->BSIM4ucs * T11 /(0.5 + 0.5*Vgsteff/VgsteffVth)/VgsteffVth; - - dDenomi_dVg = T2 * dT1_dVg + dT11_dVg; - dDenomi_dVd = 0.0; - dDenomi_dVb = T1 * pParam->BSIM4uc; - - T5 = T1 * T2 + T11; - } - - - - - - if (T5 >= -0.8) - { Denomi = 1.0 + T5; - } - else - { T9 = 1.0 / (7.0 + 10.0 * T5); - Denomi = (0.6 + T5) * T9; - T9 *= T9; - dDenomi_dVg *= T9; - dDenomi_dVd *= T9; - dDenomi_dVb *= T9; - } - - - here->BSIM4ueff = ueff = here->BSIM4u0temp / Denomi; - T9 = -ueff / Denomi; - dueff_dVg = T9 * dDenomi_dVg; - dueff_dVd = T9 * dDenomi_dVd; - dueff_dVb = T9 * dDenomi_dVb; - - /* Saturation Drain Voltage Vdsat */ - WVCox = Weff * here->BSIM4vsattemp * model->BSIM4coxe; - WVCoxRds = WVCox * Rds; - - Esat = 2.0 * here->BSIM4vsattemp / ueff; - here->BSIM4EsatL = EsatL = Esat * Leff; - T0 = -EsatL /ueff; - dEsatL_dVg = T0 * dueff_dVg; - dEsatL_dVd = T0 * dueff_dVd; - dEsatL_dVb = T0 * dueff_dVb; - - /* Sqrt() */ - a1 = pParam->BSIM4a1; - if (a1 == 0.0) - { Lambda = pParam->BSIM4a2; - dLambda_dVg = 0.0; - } - else if (a1 > 0.0) - { T0 = 1.0 - pParam->BSIM4a2; - T1 = T0 - pParam->BSIM4a1 * Vgsteff - 0.0001; - T2 = sqrt(T1 * T1 + 0.0004 * T0); - Lambda = pParam->BSIM4a2 + T0 - 0.5 * (T1 + T2); - dLambda_dVg = 0.5 * pParam->BSIM4a1 * (1.0 + T1 / T2); - } - else - { T1 = pParam->BSIM4a2 + pParam->BSIM4a1 * Vgsteff - 0.0001; - T2 = sqrt(T1 * T1 + 0.0004 * pParam->BSIM4a2); - Lambda = 0.5 * (T1 + T2); - dLambda_dVg = 0.5 * pParam->BSIM4a1 * (1.0 + T1 / T2); - } - - Vgst2Vtm = Vgsteff + 2.0 * Vtm; - if (Rds > 0) - { tmp2 = dRds_dVg / Rds + dWeff_dVg / Weff; - tmp3 = dRds_dVb / Rds + dWeff_dVb / Weff; - } - else - { tmp2 = dWeff_dVg / Weff; - tmp3 = dWeff_dVb / Weff; - } - if ((Rds == 0.0) && (Lambda == 1.0)) - { T0 = 1.0 / (Abulk * EsatL + Vgst2Vtm); - tmp1 = 0.0; - T1 = T0 * T0; - T2 = Vgst2Vtm * T0; - T3 = EsatL * Vgst2Vtm; - Vdsat = T3 * T0; - - dT0_dVg = -(Abulk * dEsatL_dVg + EsatL * dAbulk_dVg + 1.0) * T1; - dT0_dVd = -(Abulk * dEsatL_dVd) * T1; - dT0_dVb = -(Abulk * dEsatL_dVb + dAbulk_dVb * EsatL) * T1; - - dVdsat_dVg = T3 * dT0_dVg + T2 * dEsatL_dVg + EsatL * T0; - dVdsat_dVd = T3 * dT0_dVd + T2 * dEsatL_dVd; - dVdsat_dVb = T3 * dT0_dVb + T2 * dEsatL_dVb; - } - else - { tmp1 = dLambda_dVg / (Lambda * Lambda); - T9 = Abulk * WVCoxRds; - T8 = Abulk * T9; - T7 = Vgst2Vtm * T9; - T6 = Vgst2Vtm * WVCoxRds; - T0 = 2.0 * Abulk * (T9 - 1.0 + 1.0 / Lambda); - dT0_dVg = 2.0 * (T8 * tmp2 - Abulk * tmp1 - + (2.0 * T9 + 1.0 / Lambda - 1.0) * dAbulk_dVg); - - dT0_dVb = 2.0 * (T8 * (2.0 / Abulk * dAbulk_dVb + tmp3) - + (1.0 / Lambda - 1.0) * dAbulk_dVb); - dT0_dVd = 0.0; - T1 = Vgst2Vtm * (2.0 / Lambda - 1.0) + Abulk * EsatL + 3.0 * T7; - - dT1_dVg = (2.0 / Lambda - 1.0) - 2.0 * Vgst2Vtm * tmp1 - + Abulk * dEsatL_dVg + EsatL * dAbulk_dVg + 3.0 * (T9 - + T7 * tmp2 + T6 * dAbulk_dVg); - dT1_dVb = Abulk * dEsatL_dVb + EsatL * dAbulk_dVb - + 3.0 * (T6 * dAbulk_dVb + T7 * tmp3); - dT1_dVd = Abulk * dEsatL_dVd; - - T2 = Vgst2Vtm * (EsatL + 2.0 * T6); - dT2_dVg = EsatL + Vgst2Vtm * dEsatL_dVg - + T6 * (4.0 + 2.0 * Vgst2Vtm * tmp2); - dT2_dVb = Vgst2Vtm * (dEsatL_dVb + 2.0 * T6 * tmp3); - dT2_dVd = Vgst2Vtm * dEsatL_dVd; - - T3 = sqrt(T1 * T1 - 2.0 * T0 * T2); - Vdsat = (T1 - T3) / T0; - - dT3_dVg = (T1 * dT1_dVg - 2.0 * (T0 * dT2_dVg + T2 * dT0_dVg)) - / T3; - dT3_dVd = (T1 * dT1_dVd - 2.0 * (T0 * dT2_dVd + T2 * dT0_dVd)) - / T3; - dT3_dVb = (T1 * dT1_dVb - 2.0 * (T0 * dT2_dVb + T2 * dT0_dVb)) - / T3; - - dVdsat_dVg = (dT1_dVg - (T1 * dT1_dVg - dT0_dVg * T2 - - T0 * dT2_dVg) / T3 - Vdsat * dT0_dVg) / T0; - dVdsat_dVb = (dT1_dVb - (T1 * dT1_dVb - dT0_dVb * T2 - - T0 * dT2_dVb) / T3 - Vdsat * dT0_dVb) / T0; - dVdsat_dVd = (dT1_dVd - (T1 * dT1_dVd - T0 * dT2_dVd) / T3) / T0; - } - here->BSIM4vdsat = Vdsat; - - /* Calculate Vdseff */ - T1 = Vdsat - Vds - pParam->BSIM4delta; - dT1_dVg = dVdsat_dVg; - dT1_dVd = dVdsat_dVd - 1.0; - dT1_dVb = dVdsat_dVb; - - T2 = sqrt(T1 * T1 + 4.0 * pParam->BSIM4delta * Vdsat); - T0 = T1 / T2; - T9 = 2.0 * pParam->BSIM4delta; - T3 = T9 / T2; - dT2_dVg = T0 * dT1_dVg + T3 * dVdsat_dVg; - dT2_dVd = T0 * dT1_dVd + T3 * dVdsat_dVd; - dT2_dVb = T0 * dT1_dVb + T3 * dVdsat_dVb; - - if (T1 >= 0.0) - { Vdseff = Vdsat - 0.5 * (T1 + T2); - dVdseff_dVg = dVdsat_dVg - 0.5 * (dT1_dVg + dT2_dVg); - dVdseff_dVd = dVdsat_dVd - 0.5 * (dT1_dVd + dT2_dVd); - dVdseff_dVb = dVdsat_dVb - 0.5 * (dT1_dVb + dT2_dVb); - } - else - { T4 = T9 / (T2 - T1); - T5 = 1.0 - T4; - T6 = Vdsat * T4 / (T2 - T1); - Vdseff = Vdsat * T5; - dVdseff_dVg = dVdsat_dVg * T5 + T6 * (dT2_dVg - dT1_dVg); - dVdseff_dVd = dVdsat_dVd * T5 + T6 * (dT2_dVd - dT1_dVd); - dVdseff_dVb = dVdsat_dVb * T5 + T6 * (dT2_dVb - dT1_dVb); - } - - if (Vds == 0.0) - { Vdseff = 0.0; - dVdseff_dVg = 0.0; - dVdseff_dVb = 0.0; - } - - if (Vdseff > Vds) - Vdseff = Vds; - diffVds = Vds - Vdseff; - here->BSIM4Vdseff = Vdseff; - - /* Velocity Overshoot */ - if((model->BSIM4lambdaGiven) && (model->BSIM4lambda > 0.0) ) - { - T1 = Leff * ueff; - T2 = pParam->BSIM4lambda / T1; - T3 = -T2 / T1 * Leff; - dT2_dVd = T3 * dueff_dVd; - dT2_dVg = T3 * dueff_dVg; - dT2_dVb = T3 * dueff_dVb; - T5 = 1.0 / (Esat * pParam->BSIM4litl); - T4 = -T5 / EsatL; - dT5_dVg = dEsatL_dVg * T4; - dT5_dVd = dEsatL_dVd * T4; - dT5_dVb = dEsatL_dVb * T4; - T6 = 1.0 + diffVds * T5; - dT6_dVg = dT5_dVg * diffVds - dVdseff_dVg * T5; - dT6_dVd = dT5_dVd * diffVds + (1.0 - dVdseff_dVd) * T5; - dT6_dVb = dT5_dVb * diffVds - dVdseff_dVb * T5; - T7 = 2.0 / (T6 * T6 + 1.0); - T8 = 1.0 - T7; - T9 = T6 * T7 * T7; - dT8_dVg = T9 * dT6_dVg; - dT8_dVd = T9 * dT6_dVd; - dT8_dVb = T9 * dT6_dVb; - T10 = 1.0 + T2 * T8; - dT10_dVg = dT2_dVg * T8 + T2 * dT8_dVg; - dT10_dVd = dT2_dVd * T8 + T2 * dT8_dVd; - dT10_dVb = dT2_dVb * T8 + T2 * dT8_dVb; - if(T10 == 1.0) - dT10_dVg = dT10_dVd = dT10_dVb = 0.0; - - dEsatL_dVg *= T10; - dEsatL_dVg += EsatL * dT10_dVg; - dEsatL_dVd *= T10; - dEsatL_dVd += EsatL * dT10_dVd; - dEsatL_dVb *= T10; - dEsatL_dVb += EsatL * dT10_dVb; - EsatL *= T10; - Esat = EsatL / Leff; /* bugfix by Wenwei Yang (4.6.4) */ - here->BSIM4EsatL = EsatL; - } - - /* Calculate Vasat */ - tmp4 = 1.0 - 0.5 * Abulk * Vdsat / Vgst2Vtm; - T9 = WVCoxRds * Vgsteff; - T8 = T9 / Vgst2Vtm; - T0 = EsatL + Vdsat + 2.0 * T9 * tmp4; - - T7 = 2.0 * WVCoxRds * tmp4; - dT0_dVg = dEsatL_dVg + dVdsat_dVg + T7 * (1.0 + tmp2 * Vgsteff) - - T8 * (Abulk * dVdsat_dVg - Abulk * Vdsat / Vgst2Vtm - + Vdsat * dAbulk_dVg); - - dT0_dVb = dEsatL_dVb + dVdsat_dVb + T7 * tmp3 * Vgsteff - - T8 * (dAbulk_dVb * Vdsat + Abulk * dVdsat_dVb); - dT0_dVd = dEsatL_dVd + dVdsat_dVd - T8 * Abulk * dVdsat_dVd; - - T9 = WVCoxRds * Abulk; - T1 = 2.0 / Lambda - 1.0 + T9; - dT1_dVg = -2.0 * tmp1 + WVCoxRds * (Abulk * tmp2 + dAbulk_dVg); - dT1_dVb = dAbulk_dVb * WVCoxRds + T9 * tmp3; - - Vasat = T0 / T1; - dVasat_dVg = (dT0_dVg - Vasat * dT1_dVg) / T1; - dVasat_dVb = (dT0_dVb - Vasat * dT1_dVb) / T1; - dVasat_dVd = dT0_dVd / T1; - - /* Calculate Idl first */ - - tmp1 = here->BSIM4vtfbphi2; - tmp2 = 2.0e8 * here->BSIM4toxp; - dT0_dVg = 1.0 / tmp2; - T0 = (Vgsteff + tmp1) * dT0_dVg; - - tmp3 = exp(model->BSIM4bdos * 0.7 * log(T0)); - T1 = 1.0 + tmp3; - T2 = model->BSIM4bdos * 0.7 * tmp3 / T0; - Tcen = model->BSIM4ados * 1.9e-9 / T1; - dTcen_dVg = -Tcen * T2 * dT0_dVg / T1; - - Coxeff = epssub * here->BSIM4coxp - / (epssub + here->BSIM4coxp * Tcen); - here->BSIM4Coxeff = Coxeff; - dCoxeff_dVg = -Coxeff * Coxeff * dTcen_dVg / epssub; - - CoxeffWovL = Coxeff * Weff / Leff; - beta = ueff * CoxeffWovL; - T3 = ueff / Leff; - dbeta_dVg = CoxeffWovL * dueff_dVg + T3 - * (Weff * dCoxeff_dVg + Coxeff * dWeff_dVg); - dbeta_dVd = CoxeffWovL * dueff_dVd; - dbeta_dVb = CoxeffWovL * dueff_dVb + T3 * Coxeff * dWeff_dVb; - - here->BSIM4AbovVgst2Vtm = Abulk / Vgst2Vtm; - T0 = 1.0 - 0.5 * Vdseff * here->BSIM4AbovVgst2Vtm; - dT0_dVg = -0.5 * (Abulk * dVdseff_dVg - - Abulk * Vdseff / Vgst2Vtm + Vdseff * dAbulk_dVg) / Vgst2Vtm; - dT0_dVd = -0.5 * Abulk * dVdseff_dVd / Vgst2Vtm; - dT0_dVb = -0.5 * (Abulk * dVdseff_dVb + dAbulk_dVb * Vdseff) - / Vgst2Vtm; - - fgche1 = Vgsteff * T0; - dfgche1_dVg = Vgsteff * dT0_dVg + T0; - dfgche1_dVd = Vgsteff * dT0_dVd; - dfgche1_dVb = Vgsteff * dT0_dVb; - - T9 = Vdseff / EsatL; - fgche2 = 1.0 + T9; - dfgche2_dVg = (dVdseff_dVg - T9 * dEsatL_dVg) / EsatL; - dfgche2_dVd = (dVdseff_dVd - T9 * dEsatL_dVd) / EsatL; - dfgche2_dVb = (dVdseff_dVb - T9 * dEsatL_dVb) / EsatL; - - gche = beta * fgche1 / fgche2; - dgche_dVg = (beta * dfgche1_dVg + fgche1 * dbeta_dVg - - gche * dfgche2_dVg) / fgche2; - dgche_dVd = (beta * dfgche1_dVd + fgche1 * dbeta_dVd - - gche * dfgche2_dVd) / fgche2; - dgche_dVb = (beta * dfgche1_dVb + fgche1 * dbeta_dVb - - gche * dfgche2_dVb) / fgche2; - - T0 = 1.0 + gche * Rds; - Idl = gche / T0; - T1 = (1.0 - Idl * Rds) / T0; - T2 = Idl * Idl; - dIdl_dVg = T1 * dgche_dVg - T2 * dRds_dVg; - dIdl_dVd = T1 * dgche_dVd; - dIdl_dVb = T1 * dgche_dVb - T2 * dRds_dVb; - - /* Calculate degradation factor due to pocket implant */ - - if (pParam->BSIM4fprout <= 0.0) - { FP = 1.0; - dFP_dVg = 0.0; - } - else - { T9 = pParam->BSIM4fprout * sqrt(Leff) / Vgst2Vtm; - FP = 1.0 / (1.0 + T9); - dFP_dVg = FP * FP * T9 / Vgst2Vtm; - } - - /* Calculate VACLM */ - T8 = pParam->BSIM4pvag / EsatL; - T9 = T8 * Vgsteff; - if (T9 > -0.9) - { PvagTerm = 1.0 + T9; - dPvagTerm_dVg = T8 * (1.0 - Vgsteff * dEsatL_dVg / EsatL); - dPvagTerm_dVb = -T9 * dEsatL_dVb / EsatL; - dPvagTerm_dVd = -T9 * dEsatL_dVd / EsatL; - } - else - { T4 = 1.0 / (17.0 + 20.0 * T9); - PvagTerm = (0.8 + T9) * T4; - T4 *= T4; - dPvagTerm_dVg = T8 * (1.0 - Vgsteff * dEsatL_dVg / EsatL) * T4; - T9 *= T4 / EsatL; - dPvagTerm_dVb = -T9 * dEsatL_dVb; - dPvagTerm_dVd = -T9 * dEsatL_dVd; - } - - if ((pParam->BSIM4pclm > MIN_EXP) && (diffVds > 1.0e-10)) - { T0 = 1.0 + Rds * Idl; - dT0_dVg = dRds_dVg * Idl + Rds * dIdl_dVg; - dT0_dVd = Rds * dIdl_dVd; - dT0_dVb = dRds_dVb * Idl + Rds * dIdl_dVb; - - T2 = Vdsat / Esat; - T1 = Leff + T2; - dT1_dVg = (dVdsat_dVg - T2 * dEsatL_dVg / Leff) / Esat; - dT1_dVd = (dVdsat_dVd - T2 * dEsatL_dVd / Leff) / Esat; - dT1_dVb = (dVdsat_dVb - T2 * dEsatL_dVb / Leff) / Esat; - - Cclm = FP * PvagTerm * T0 * T1 / (pParam->BSIM4pclm * pParam->BSIM4litl); - dCclm_dVg = Cclm * (dFP_dVg / FP + dPvagTerm_dVg / PvagTerm - + dT0_dVg / T0 + dT1_dVg / T1); - dCclm_dVb = Cclm * (dPvagTerm_dVb / PvagTerm + dT0_dVb / T0 - + dT1_dVb / T1); - dCclm_dVd = Cclm * (dPvagTerm_dVd / PvagTerm + dT0_dVd / T0 - + dT1_dVd / T1); - VACLM = Cclm * diffVds; - - dVACLM_dVg = dCclm_dVg * diffVds - dVdseff_dVg * Cclm; - dVACLM_dVb = dCclm_dVb * diffVds - dVdseff_dVb * Cclm; - dVACLM_dVd = dCclm_dVd * diffVds + (1.0 - dVdseff_dVd) * Cclm; - } - else - { VACLM = Cclm = MAX_EXP; - dVACLM_dVd = dVACLM_dVg = dVACLM_dVb = 0.0; - dCclm_dVd = dCclm_dVg = dCclm_dVb = 0.0; - } - - /* Calculate VADIBL */ - if (pParam->BSIM4thetaRout > MIN_EXP) - { T8 = Abulk * Vdsat; - T0 = Vgst2Vtm * T8; - dT0_dVg = Vgst2Vtm * Abulk * dVdsat_dVg + T8 - + Vgst2Vtm * Vdsat * dAbulk_dVg; - dT0_dVb = Vgst2Vtm * (dAbulk_dVb * Vdsat + Abulk * dVdsat_dVb); - dT0_dVd = Vgst2Vtm * Abulk * dVdsat_dVd; - - T1 = Vgst2Vtm + T8; - dT1_dVg = 1.0 + Abulk * dVdsat_dVg + Vdsat * dAbulk_dVg; - dT1_dVb = Abulk * dVdsat_dVb + dAbulk_dVb * Vdsat; - dT1_dVd = Abulk * dVdsat_dVd; - - T9 = T1 * T1; - T2 = pParam->BSIM4thetaRout; - VADIBL = (Vgst2Vtm - T0 / T1) / T2; - dVADIBL_dVg = (1.0 - dT0_dVg / T1 + T0 * dT1_dVg / T9) / T2; - dVADIBL_dVb = (-dT0_dVb / T1 + T0 * dT1_dVb / T9) / T2; - dVADIBL_dVd = (-dT0_dVd / T1 + T0 * dT1_dVd / T9) / T2; - - T7 = pParam->BSIM4pdiblb * Vbseff; - if (T7 >= -0.9) - { T3 = 1.0 / (1.0 + T7); - VADIBL *= T3; - dVADIBL_dVg *= T3; - dVADIBL_dVb = (dVADIBL_dVb - VADIBL * pParam->BSIM4pdiblb) - * T3; - dVADIBL_dVd *= T3; - } - else - { T4 = 1.0 / (0.8 + T7); - T3 = (17.0 + 20.0 * T7) * T4; - dVADIBL_dVg *= T3; - dVADIBL_dVb = dVADIBL_dVb * T3 - - VADIBL * pParam->BSIM4pdiblb * T4 * T4; - dVADIBL_dVd *= T3; - VADIBL *= T3; - } - - dVADIBL_dVg = dVADIBL_dVg * PvagTerm + VADIBL * dPvagTerm_dVg; - dVADIBL_dVb = dVADIBL_dVb * PvagTerm + VADIBL * dPvagTerm_dVb; - dVADIBL_dVd = dVADIBL_dVd * PvagTerm + VADIBL * dPvagTerm_dVd; - VADIBL *= PvagTerm; - } - else - { VADIBL = MAX_EXP; - dVADIBL_dVd = dVADIBL_dVg = dVADIBL_dVb = 0.0; - } - - /* Calculate Va */ - Va = Vasat + VACLM; - dVa_dVg = dVasat_dVg + dVACLM_dVg; - dVa_dVb = dVasat_dVb + dVACLM_dVb; - dVa_dVd = dVasat_dVd + dVACLM_dVd; - - /* Calculate VADITS */ - T0 = pParam->BSIM4pditsd * Vds; - if (T0 > EXP_THRESHOLD) - { T1 = MAX_EXP; - dT1_dVd = 0; - } - else - { T1 = exp(T0); - dT1_dVd = T1 * pParam->BSIM4pditsd; - } - - if (pParam->BSIM4pdits > MIN_EXP) - { T2 = 1.0 + model->BSIM4pditsl * Leff; - VADITS = (1.0 + T2 * T1) / pParam->BSIM4pdits; - dVADITS_dVg = VADITS * dFP_dVg; - dVADITS_dVd = FP * T2 * dT1_dVd / pParam->BSIM4pdits; - VADITS *= FP; - } - else - { VADITS = MAX_EXP; - dVADITS_dVg = dVADITS_dVd = 0; - } - - /* Calculate VASCBE */ - if ((pParam->BSIM4pscbe2 > 0.0)&&(pParam->BSIM4pscbe1>=0.0)) /*4.6.2*/ - { if (diffVds > pParam->BSIM4pscbe1 * pParam->BSIM4litl - / EXP_THRESHOLD) - { T0 = pParam->BSIM4pscbe1 * pParam->BSIM4litl / diffVds; - VASCBE = Leff * exp(T0) / pParam->BSIM4pscbe2; - T1 = T0 * VASCBE / diffVds; - dVASCBE_dVg = T1 * dVdseff_dVg; - dVASCBE_dVd = -T1 * (1.0 - dVdseff_dVd); - dVASCBE_dVb = T1 * dVdseff_dVb; - } - else - { VASCBE = MAX_EXP * Leff/pParam->BSIM4pscbe2; - dVASCBE_dVg = dVASCBE_dVd = dVASCBE_dVb = 0.0; - } - } - else - { VASCBE = MAX_EXP; - dVASCBE_dVg = dVASCBE_dVd = dVASCBE_dVb = 0.0; - } - - /* Add DIBL to Ids */ - T9 = diffVds / VADIBL; - T0 = 1.0 + T9; - Idsa = Idl * T0; - dIdsa_dVg = T0 * dIdl_dVg - Idl * (dVdseff_dVg + T9 * dVADIBL_dVg) / VADIBL; - dIdsa_dVd = T0 * dIdl_dVd + Idl - * (1.0 - dVdseff_dVd - T9 * dVADIBL_dVd) / VADIBL; - dIdsa_dVb = T0 * dIdl_dVb - Idl * (dVdseff_dVb + T9 * dVADIBL_dVb) / VADIBL; - - /* Add DITS to Ids */ - T9 = diffVds / VADITS; - T0 = 1.0 + T9; - dIdsa_dVg = T0 * dIdsa_dVg - Idsa * (dVdseff_dVg + T9 * dVADITS_dVg) / VADITS; - dIdsa_dVd = T0 * dIdsa_dVd + Idsa - * (1.0 - dVdseff_dVd - T9 * dVADITS_dVd) / VADITS; - dIdsa_dVb = T0 * dIdsa_dVb - Idsa * dVdseff_dVb / VADITS; - Idsa *= T0; - - /* Add CLM to Ids */ - T0 = log(Va / Vasat); - dT0_dVg = dVa_dVg / Va - dVasat_dVg / Vasat; - dT0_dVb = dVa_dVb / Va - dVasat_dVb / Vasat; - dT0_dVd = dVa_dVd / Va - dVasat_dVd / Vasat; - T1 = T0 / Cclm; - T9 = 1.0 + T1; - dT9_dVg = (dT0_dVg - T1 * dCclm_dVg) / Cclm; - dT9_dVb = (dT0_dVb - T1 * dCclm_dVb) / Cclm; - dT9_dVd = (dT0_dVd - T1 * dCclm_dVd) / Cclm; - - dIdsa_dVg = dIdsa_dVg * T9 + Idsa * dT9_dVg; - dIdsa_dVb = dIdsa_dVb * T9 + Idsa * dT9_dVb; - dIdsa_dVd = dIdsa_dVd * T9 + Idsa * dT9_dVd; - Idsa *= T9; - - /* Substrate current begins */ - tmp = pParam->BSIM4alpha0 + pParam->BSIM4alpha1 * Leff; - if ((tmp <= 0.0) || (pParam->BSIM4beta0 <= 0.0)) - { Isub = Gbd = Gbb = Gbg = 0.0; - } - else - { T2 = tmp / Leff; - if (diffVds > pParam->BSIM4beta0 / EXP_THRESHOLD) - { T0 = -pParam->BSIM4beta0 / diffVds; - T1 = T2 * diffVds * exp(T0); - T3 = T1 / diffVds * (T0 - 1.0); - dT1_dVg = T3 * dVdseff_dVg; - dT1_dVd = T3 * (dVdseff_dVd - 1.0); - dT1_dVb = T3 * dVdseff_dVb; - } - else - { T3 = T2 * MIN_EXP; - T1 = T3 * diffVds; - dT1_dVg = -T3 * dVdseff_dVg; - dT1_dVd = T3 * (1.0 - dVdseff_dVd); - dT1_dVb = -T3 * dVdseff_dVb; - } - T4 = Idsa * Vdseff; - Isub = T1 * T4; - Gbg = T1 * (dIdsa_dVg * Vdseff + Idsa * dVdseff_dVg) - + T4 * dT1_dVg; - Gbd = T1 * (dIdsa_dVd * Vdseff + Idsa * dVdseff_dVd) - + T4 * dT1_dVd; - Gbb = T1 * (dIdsa_dVb * Vdseff + Idsa * dVdseff_dVb) - + T4 * dT1_dVb; - - Gbd += Gbg * dVgsteff_dVd; - Gbb += Gbg * dVgsteff_dVb; - Gbg *= dVgsteff_dVg; - Gbb *= dVbseff_dVb; - } - here->BSIM4csub = Isub; - here->BSIM4gbbs = Gbb; - here->BSIM4gbgs = Gbg; - here->BSIM4gbds = Gbd; - - /* Add SCBE to Ids */ - T9 = diffVds / VASCBE; - T0 = 1.0 + T9; - Ids = Idsa * T0; - - Gm = T0 * dIdsa_dVg - Idsa - * (dVdseff_dVg + T9 * dVASCBE_dVg) / VASCBE; - Gds = T0 * dIdsa_dVd + Idsa - * (1.0 - dVdseff_dVd - T9 * dVASCBE_dVd) / VASCBE; - Gmb = T0 * dIdsa_dVb - Idsa - * (dVdseff_dVb + T9 * dVASCBE_dVb) / VASCBE; - - - tmp1 = Gds + Gm * dVgsteff_dVd; - tmp2 = Gmb + Gm * dVgsteff_dVb; - tmp3 = Gm; - - Gm = (Ids * dVdseff_dVg + Vdseff * tmp3) * dVgsteff_dVg; - Gds = Ids * (dVdseff_dVd + dVdseff_dVg * dVgsteff_dVd) - + Vdseff * tmp1; - Gmb = (Ids * (dVdseff_dVb + dVdseff_dVg * dVgsteff_dVb) - + Vdseff * tmp2) * dVbseff_dVb; - - cdrain = Ids * Vdseff; - - /* Source End Velocity Limit */ - if((model->BSIM4vtlGiven) && (model->BSIM4vtl > 0.0) ) { - T12 = 1.0 / Leff / CoxeffWovL; - T11 = T12 / Vgsteff; - T10 = -T11 / Vgsteff; - vs = cdrain * T11; /* vs */ - dvs_dVg = Gm * T11 + cdrain * T10 * dVgsteff_dVg; - dvs_dVd = Gds * T11 + cdrain * T10 * dVgsteff_dVd; - dvs_dVb = Gmb * T11 + cdrain * T10 * dVgsteff_dVb; - T0 = 2 * MM; - T1 = vs / (pParam->BSIM4vtl * pParam->BSIM4tfactor); - if(T1 > 0.0) - { T2 = 1.0 + exp(T0 * log(T1)); - T3 = (T2 - 1.0) * T0 / vs; - Fsevl = 1.0 / exp(log(T2)/ T0); - dT2_dVg = T3 * dvs_dVg; - dT2_dVd = T3 * dvs_dVd; - dT2_dVb = T3 * dvs_dVb; - T4 = -1.0 / T0 * Fsevl / T2; - dFsevl_dVg = T4 * dT2_dVg; - dFsevl_dVd = T4 * dT2_dVd; - dFsevl_dVb = T4 * dT2_dVb; - } else { - Fsevl = 1.0; - dFsevl_dVg = 0.0; - dFsevl_dVd = 0.0; - dFsevl_dVb = 0.0; - } - Gm *=Fsevl; - Gm += cdrain * dFsevl_dVg; - Gmb *=Fsevl; - Gmb += cdrain * dFsevl_dVb; - Gds *=Fsevl; - Gds += cdrain * dFsevl_dVd; - - cdrain *= Fsevl; - } - - here->BSIM4gds = Gds; - here->BSIM4gm = Gm; - here->BSIM4gmbs = Gmb; - here->BSIM4IdovVds = Ids; - if( here->BSIM4IdovVds <= 1.0e-9) here->BSIM4IdovVds = 1.0e-9; - - /* Calculate Rg */ - if ((here->BSIM4rgateMod > 1) || - (here->BSIM4trnqsMod != 0) || (here->BSIM4acnqsMod != 0)) - { T9 = pParam->BSIM4xrcrg2 * model->BSIM4vtm; - T0 = T9 * beta; - dT0_dVd = (dbeta_dVd + dbeta_dVg * dVgsteff_dVd) * T9; - dT0_dVb = (dbeta_dVb + dbeta_dVg * dVgsteff_dVb) * T9; - dT0_dVg = dbeta_dVg * T9; - - here->BSIM4gcrg = pParam->BSIM4xrcrg1 * ( T0 + Ids); - here->BSIM4gcrgd = pParam->BSIM4xrcrg1 * (dT0_dVd + tmp1); - here->BSIM4gcrgb = pParam->BSIM4xrcrg1 * (dT0_dVb + tmp2) - * dVbseff_dVb; - here->BSIM4gcrgg = pParam->BSIM4xrcrg1 * (dT0_dVg + tmp3) - * dVgsteff_dVg; - - if (here->BSIM4nf != 1.0) - { here->BSIM4gcrg *= here->BSIM4nf; - here->BSIM4gcrgg *= here->BSIM4nf; - here->BSIM4gcrgd *= here->BSIM4nf; - here->BSIM4gcrgb *= here->BSIM4nf; - } - - if (here->BSIM4rgateMod == 2) - { T10 = here->BSIM4grgeltd * here->BSIM4grgeltd; - T11 = here->BSIM4grgeltd + here->BSIM4gcrg; - here->BSIM4gcrg = here->BSIM4grgeltd * here->BSIM4gcrg / T11; - T12 = T10 / T11 / T11; - here->BSIM4gcrgg *= T12; - here->BSIM4gcrgd *= T12; - here->BSIM4gcrgb *= T12; - } - here->BSIM4gcrgs = -(here->BSIM4gcrgg + here->BSIM4gcrgd - + here->BSIM4gcrgb); - } - - - /* Calculate bias-dependent external S/D resistance */ - if (model->BSIM4rdsMod) - { /* Rs(V) */ - T0 = vgs - pParam->BSIM4vfbsd; - T1 = sqrt(T0 * T0 + 1.0e-4); - vgs_eff = 0.5 * (T0 + T1); - dvgs_eff_dvg = vgs_eff / T1; - - T0 = 1.0 + pParam->BSIM4prwg * vgs_eff; - dT0_dvg = -pParam->BSIM4prwg / T0 / T0 * dvgs_eff_dvg; - T1 = -pParam->BSIM4prwb * vbs; - dT1_dvb = -pParam->BSIM4prwb; - - T2 = 1.0 / T0 + T1; - T3 = T2 + sqrt(T2 * T2 + 0.01); - dT3_dvg = T3 / (T3 - T2); - dT3_dvb = dT3_dvg * dT1_dvb; - dT3_dvg *= dT0_dvg; - - T4 = pParam->BSIM4rs0 * 0.5; - Rs = pParam->BSIM4rswmin + T3 * T4; - dRs_dvg = T4 * dT3_dvg; - dRs_dvb = T4 * dT3_dvb; - - T0 = 1.0 + here->BSIM4sourceConductance * Rs; - here->BSIM4gstot = here->BSIM4sourceConductance / T0; - T0 = -here->BSIM4gstot * here->BSIM4gstot; - dgstot_dvd = 0.0; /* place holder */ - dgstot_dvg = T0 * dRs_dvg; - dgstot_dvb = T0 * dRs_dvb; - dgstot_dvs = -(dgstot_dvg + dgstot_dvb + dgstot_dvd); - - /* Rd(V) */ - T0 = vgd - pParam->BSIM4vfbsd; - T1 = sqrt(T0 * T0 + 1.0e-4); - vgd_eff = 0.5 * (T0 + T1); - dvgd_eff_dvg = vgd_eff / T1; - - T0 = 1.0 + pParam->BSIM4prwg * vgd_eff; - dT0_dvg = -pParam->BSIM4prwg / T0 / T0 * dvgd_eff_dvg; - T1 = -pParam->BSIM4prwb * vbd; - dT1_dvb = -pParam->BSIM4prwb; - - T2 = 1.0 / T0 + T1; - T3 = T2 + sqrt(T2 * T2 + 0.01); - dT3_dvg = T3 / (T3 - T2); - dT3_dvb = dT3_dvg * dT1_dvb; - dT3_dvg *= dT0_dvg; - - T4 = pParam->BSIM4rd0 * 0.5; - Rd = pParam->BSIM4rdwmin + T3 * T4; - dRd_dvg = T4 * dT3_dvg; - dRd_dvb = T4 * dT3_dvb; - - T0 = 1.0 + here->BSIM4drainConductance * Rd; - here->BSIM4gdtot = here->BSIM4drainConductance / T0; - T0 = -here->BSIM4gdtot * here->BSIM4gdtot; - dgdtot_dvs = 0.0; - dgdtot_dvg = T0 * dRd_dvg; - dgdtot_dvb = T0 * dRd_dvb; - dgdtot_dvd = -(dgdtot_dvg + dgdtot_dvb + dgdtot_dvs); - - here->BSIM4gstotd = vses * dgstot_dvd; - here->BSIM4gstotg = vses * dgstot_dvg; - here->BSIM4gstots = vses * dgstot_dvs; - here->BSIM4gstotb = vses * dgstot_dvb; - - T2 = vdes - vds; - here->BSIM4gdtotd = T2 * dgdtot_dvd; - here->BSIM4gdtotg = T2 * dgdtot_dvg; - here->BSIM4gdtots = T2 * dgdtot_dvs; - here->BSIM4gdtotb = T2 * dgdtot_dvb; - } - else /* WDLiu: for bypass */ - { here->BSIM4gstot = here->BSIM4gstotd = here->BSIM4gstotg = 0.0; - here->BSIM4gstots = here->BSIM4gstotb = 0.0; - here->BSIM4gdtot = here->BSIM4gdtotd = here->BSIM4gdtotg = 0.0; - here->BSIM4gdtots = here->BSIM4gdtotb = 0.0; - } - - /* GIDL/GISL Models */ - - if(model->BSIM4mtrlMod == 0) - T0 = 3.0 * toxe; - else - T0 = model->BSIM4epsrsub * toxe / epsrox; - - /* Calculate GIDL current */ - - vgs_eff = here->BSIM4vgs_eff; - dvgs_eff_dvg = here->BSIM4dvgs_eff_dvg; - vgd_eff = here->BSIM4vgd_eff; - dvgd_eff_dvg = here->BSIM4dvgd_eff_dvg; - - if (model->BSIM4gidlMod==0){ - - if(model->BSIM4mtrlMod ==0) - T1 = (vds - vgs_eff - pParam->BSIM4egidl ) / T0; - else - T1 = (vds - vgs_eff - pParam->BSIM4egidl + pParam->BSIM4vfbsd) / T0; - - if ((pParam->BSIM4agidl <= 0.0) || (pParam->BSIM4bgidl <= 0.0) - || (T1 <= 0.0) || (pParam->BSIM4cgidl <= 0.0) || (vbd > 0.0)) - Igidl = Ggidld = Ggidlg = Ggidlb = 0.0; - else { - dT1_dVd = 1.0 / T0; - dT1_dVg = -dvgs_eff_dvg * dT1_dVd; - T2 = pParam->BSIM4bgidl / T1; - if (T2 < 100.0) - { Igidl = pParam->BSIM4agidl * pParam->BSIM4weffCJ * T1 * exp(-T2); - T3 = Igidl * (1.0 + T2) / T1; - Ggidld = T3 * dT1_dVd; - Ggidlg = T3 * dT1_dVg; - } - else - { Igidl = pParam->BSIM4agidl * pParam->BSIM4weffCJ * 3.720075976e-44; - Ggidld = Igidl * dT1_dVd; - Ggidlg = Igidl * dT1_dVg; - Igidl *= T1; - } - - T4 = vbd * vbd; - T5 = -vbd * T4; - T6 = pParam->BSIM4cgidl + T5; - T7 = T5 / T6; - T8 = 3.0 * pParam->BSIM4cgidl * T4 / T6 / T6; - Ggidld = Ggidld * T7 + Igidl * T8; - Ggidlg = Ggidlg * T7; - Ggidlb = -Igidl * T8; - Igidl *= T7; - } - here->BSIM4Igidl = Igidl; - here->BSIM4ggidld = Ggidld; - here->BSIM4ggidlg = Ggidlg; - here->BSIM4ggidlb = Ggidlb; - /* Calculate GISL current */ - - if(model->BSIM4mtrlMod ==0) - T1 = (-vds - vgd_eff - pParam->BSIM4egisl ) / T0; - else - T1 = (-vds - vgd_eff - pParam->BSIM4egisl + pParam->BSIM4vfbsd ) / T0; - - if ((pParam->BSIM4agisl <= 0.0) || (pParam->BSIM4bgisl <= 0.0) - || (T1 <= 0.0) || (pParam->BSIM4cgisl <= 0.0) || (vbs > 0.0)) - Igisl = Ggisls = Ggislg = Ggislb = 0.0; - else { - dT1_dVd = 1.0 / T0; - dT1_dVg = -dvgd_eff_dvg * dT1_dVd; - T2 = pParam->BSIM4bgisl / T1; - if (T2 < 100.0) - { Igisl = pParam->BSIM4agisl * pParam->BSIM4weffCJ * T1 * exp(-T2); - T3 = Igisl * (1.0 + T2) / T1; - Ggisls = T3 * dT1_dVd; - Ggislg = T3 * dT1_dVg; - } - else - { Igisl = pParam->BSIM4agisl * pParam->BSIM4weffCJ * 3.720075976e-44; - Ggisls = Igisl * dT1_dVd; - Ggislg = Igisl * dT1_dVg; - Igisl *= T1; - } - - T4 = vbs * vbs; - T5 = -vbs * T4; - T6 = pParam->BSIM4cgisl + T5; - T7 = T5 / T6; - T8 = 3.0 * pParam->BSIM4cgisl * T4 / T6 / T6; - Ggisls = Ggisls * T7 + Igisl * T8; - Ggislg = Ggislg * T7; - Ggislb = -Igisl * T8; - Igisl *= T7; - } - here->BSIM4Igisl = Igisl; - here->BSIM4ggisls = Ggisls; - here->BSIM4ggislg = Ggislg; - here->BSIM4ggislb = Ggislb; - } - else{ - /* v4.7 New Gidl/GISL model */ - - /* GISL */ - if (model->BSIM4mtrlMod==0) - T1 = (-vds - pParam->BSIM4rgisl * vgd_eff - pParam->BSIM4egisl) / T0; - else - T1 = (-vds - pParam->BSIM4rgisl * vgd_eff - pParam->BSIM4egisl + pParam->BSIM4vfbsd) / T0; - - if ((pParam->BSIM4agisl <= 0.0) || - (pParam->BSIM4bgisl <= 0.0) || (T1 <= 0.0) || - (pParam->BSIM4cgisl < 0.0) ) - Igisl = Ggisls = Ggislg = Ggislb = 0.0; - else - { - dT1_dVd = 1 / T0; - dT1_dVg = - pParam->BSIM4rgisl * dT1_dVd * dvgd_eff_dvg; - T2 = pParam->BSIM4bgisl / T1; - if (T2 < EXPL_THRESHOLD) - { - Igisl = pParam->BSIM4weffCJ * pParam->BSIM4agisl * T1 * exp(-T2); - T3 = Igisl / T1 * (T2 + 1); - Ggisls = T3 * dT1_dVd; - Ggislg = T3 * dT1_dVg; - } - else - { - T3 = pParam->BSIM4weffCJ * pParam->BSIM4agisl * MIN_EXPL; - Igisl = T3 * T1 ; - Ggisls = T3 * dT1_dVd; - Ggislg = T3 * dT1_dVg; - - } - T4 = vbs - pParam->BSIM4fgisl; - - if (T4==0) - T5 = EXPL_THRESHOLD; - else - T5 = pParam->BSIM4kgisl / T4; - if (T5BSIM4Igisl = Igisl; - here->BSIM4ggisls = Ggisls; - here->BSIM4ggislg = Ggislg; - here->BSIM4ggislb = Ggislb; - /* End of GISL */ - - /* GIDL */ - if (model->BSIM4mtrlMod==0) - T1 = (vds - pParam->BSIM4rgidl * vgs_eff - pParam->BSIM4egidl) / T0; - else - T1 = (vds - pParam->BSIM4rgidl * vgs_eff - pParam->BSIM4egidl + pParam->BSIM4vfbsd) / T0; - - - - if ((pParam->BSIM4agidl <= 0.0) || - (pParam->BSIM4bgidl <= 0.0) || (T1 <= 0.0) || - (pParam->BSIM4cgidl < 0.0) ) - Igidl = Ggidld = Ggidlg = Ggidlb = 0.0; - else - { - dT1_dVd = 1 / T0; - dT1_dVg = - pParam->BSIM4rgidl * dT1_dVd * dvgs_eff_dvg; - T2 = pParam->BSIM4bgidl / T1; - if (T2 < EXPL_THRESHOLD) - { - Igidl = pParam->BSIM4weffCJ * pParam->BSIM4agidl * T1 * exp(-T2); - T3 = Igidl / T1 * (T2 + 1); - Ggidld = T3 * dT1_dVd; - Ggidlg = T3 * dT1_dVg; - - } else - { - T3 = pParam->BSIM4weffCJ * pParam->BSIM4agidl * MIN_EXPL; - Igidl = T3 * T1 ; - Ggidld = T3 * dT1_dVd; - Ggidlg = T3 * dT1_dVg; - } - T4 = vbd - pParam->BSIM4fgidl; - if (T4==0) - T5 = EXPL_THRESHOLD; - else - T5 = pParam->BSIM4kgidl / T4; - if (T5BSIM4Igidl = Igidl; - here->BSIM4ggidld = Ggidld; - here->BSIM4ggidlg = Ggidlg; - here->BSIM4ggidlb = Ggidlb; - /* End of New GIDL */ - } - /*End of Gidl*/ - - - - /* Calculate gate tunneling current */ - if ((model->BSIM4igcMod != 0) || (model->BSIM4igbMod != 0)) - { Vfb = here->BSIM4vfbzb; - V3 = Vfb - Vgs_eff + Vbseff - DELTA_3; - if (Vfb <= 0.0) - T0 = sqrt(V3 * V3 - 4.0 * DELTA_3 * Vfb); - else - T0 = sqrt(V3 * V3 + 4.0 * DELTA_3 * Vfb); - T1 = 0.5 * (1.0 + V3 / T0); - Vfbeff = Vfb - 0.5 * (V3 + T0); - dVfbeff_dVg = T1 * dVgs_eff_dVg; - dVfbeff_dVb = -T1; /* WDLiu: -No surprise? No. -Good! */ - - Voxacc = Vfb - Vfbeff; - dVoxacc_dVg = -dVfbeff_dVg; - dVoxacc_dVb = -dVfbeff_dVb; - if (Voxacc < 0.0) /* WDLiu: Avoiding numerical instability. */ - Voxacc = dVoxacc_dVg = dVoxacc_dVb = 0.0; - - T0 = 0.5 * pParam->BSIM4k1ox; - T3 = Vgs_eff - Vfbeff - Vbseff - Vgsteff; - if (pParam->BSIM4k1ox == 0.0) - Voxdepinv = dVoxdepinv_dVg = dVoxdepinv_dVd - = dVoxdepinv_dVb = 0.0; - else if (T3 < 0.0) - { Voxdepinv = -T3; - dVoxdepinv_dVg = -dVgs_eff_dVg + dVfbeff_dVg - + dVgsteff_dVg; - dVoxdepinv_dVd = dVgsteff_dVd; - dVoxdepinv_dVb = dVfbeff_dVb + 1.0 + dVgsteff_dVb; - } - else - { T1 = sqrt(T0 * T0 + T3); - T2 = T0 / T1; - Voxdepinv = pParam->BSIM4k1ox * (T1 - T0); - dVoxdepinv_dVg = T2 * (dVgs_eff_dVg - dVfbeff_dVg - - dVgsteff_dVg); - dVoxdepinv_dVd = -T2 * dVgsteff_dVd; - dVoxdepinv_dVb = -T2 * (dVfbeff_dVb + 1.0 + dVgsteff_dVb); - } - - Voxdepinv += Vgsteff; - dVoxdepinv_dVg += dVgsteff_dVg; - dVoxdepinv_dVd += dVgsteff_dVd; - dVoxdepinv_dVb += dVgsteff_dVb; - } - - if(model->BSIM4tempMod < 2) - tmp = Vtm; - else /* model->BSIM4tempMod = 2 , 3*/ - tmp = Vtm0; - if (model->BSIM4igcMod) - { T0 = tmp * pParam->BSIM4nigc; - if(model->BSIM4igcMod == 1) { - VxNVt = (Vgs_eff - model->BSIM4type * here->BSIM4vth0) / T0; - if (VxNVt > EXP_THRESHOLD) - { Vaux = Vgs_eff - model->BSIM4type * here->BSIM4vth0; - dVaux_dVg = dVgs_eff_dVg; - dVaux_dVd = 0.0; - dVaux_dVb = 0.0; - } - } else if (model->BSIM4igcMod == 2) { - VxNVt = (Vgs_eff - here->BSIM4von) / T0; - if (VxNVt > EXP_THRESHOLD) - { Vaux = Vgs_eff - here->BSIM4von; - dVaux_dVg = dVgs_eff_dVg; - dVaux_dVd = -dVth_dVd; - dVaux_dVb = -dVth_dVb; - } - } - if (VxNVt < -EXP_THRESHOLD) - { Vaux = T0 * log(1.0 + MIN_EXP); - dVaux_dVg = dVaux_dVd = dVaux_dVb = 0.0; - } - else if ((VxNVt >= -EXP_THRESHOLD) && (VxNVt <= EXP_THRESHOLD)) - { ExpVxNVt = exp(VxNVt); - Vaux = T0 * log(1.0 + ExpVxNVt); - dVaux_dVg = ExpVxNVt / (1.0 + ExpVxNVt); - if(model->BSIM4igcMod == 1) { - dVaux_dVd = 0.0; - dVaux_dVb = 0.0; - } else if (model->BSIM4igcMod == 2) { - dVaux_dVd = -dVaux_dVg* dVth_dVd; /* Synopsys 08/30/2013 modify */ - dVaux_dVb = -dVaux_dVg* dVth_dVb; /* Synopsys 08/30/2013 modify */ - } - dVaux_dVg *= dVgs_eff_dVg; - } - - T2 = Vgs_eff * Vaux; - dT2_dVg = dVgs_eff_dVg * Vaux + Vgs_eff * dVaux_dVg; - dT2_dVd = Vgs_eff * dVaux_dVd; - dT2_dVb = Vgs_eff * dVaux_dVb; - - T11 = pParam->BSIM4Aechvb; - T12 = pParam->BSIM4Bechvb; - T3 = pParam->BSIM4aigc * pParam->BSIM4cigc - - pParam->BSIM4bigc; - T4 = pParam->BSIM4bigc * pParam->BSIM4cigc; - T5 = T12 * (pParam->BSIM4aigc + T3 * Voxdepinv - - T4 * Voxdepinv * Voxdepinv); - - if (T5 > EXP_THRESHOLD) - { T6 = MAX_EXP; - dT6_dVg = dT6_dVd = dT6_dVb = 0.0; - } - else if (T5 < -EXP_THRESHOLD) - { T6 = MIN_EXP; - dT6_dVg = dT6_dVd = dT6_dVb = 0.0; - } - else - { T6 = exp(T5); - dT6_dVg = T6 * T12 * (T3 - 2.0 * T4 * Voxdepinv); - dT6_dVd = dT6_dVg * dVoxdepinv_dVd; - dT6_dVb = dT6_dVg * dVoxdepinv_dVb; - dT6_dVg *= dVoxdepinv_dVg; - } - - Igc = T11 * T2 * T6; - dIgc_dVg = T11 * (T2 * dT6_dVg + T6 * dT2_dVg); - dIgc_dVd = T11 * (T2 * dT6_dVd + T6 * dT2_dVd); - dIgc_dVb = T11 * (T2 * dT6_dVb + T6 * dT2_dVb); - - if (model->BSIM4pigcdGiven) - { Pigcd = pParam->BSIM4pigcd; - dPigcd_dVg = dPigcd_dVd = dPigcd_dVb = 0.0; - } - else - { /* T11 = pParam->BSIM4Bechvb * toxe; v4.7 */ - T11 = -pParam->BSIM4Bechvb; - T12 = Vgsteff + 1.0e-20; - T13 = T11 / T12 / T12; - T14 = -T13 / T12; - Pigcd = T13 * (1.0 - 0.5 * Vdseff / T12); - dPigcd_dVg = T14 * (2.0 + 0.5 * (dVdseff_dVg - - 3.0 * Vdseff / T12)); - dPigcd_dVd = 0.5 * T14 * dVdseff_dVd; - dPigcd_dVb = 0.5 * T14 * dVdseff_dVb; - } - - T7 = -Pigcd * Vdseff; /* bugfix */ - dT7_dVg = -Vdseff * dPigcd_dVg - Pigcd * dVdseff_dVg; - dT7_dVd = -Vdseff * dPigcd_dVd - Pigcd * dVdseff_dVd + dT7_dVg * dVgsteff_dVd; - dT7_dVb = -Vdseff * dPigcd_dVb - Pigcd * dVdseff_dVb + dT7_dVg * dVgsteff_dVb; - dT7_dVg *= dVgsteff_dVg; - /*dT7_dVb *= dVbseff_dVb;*/ /* Synopsys, 2013/08/30 */ - T8 = T7 * T7 + 2.0e-4; - dT8_dVg = 2.0 * T7; - dT8_dVd = dT8_dVg * dT7_dVd; - dT8_dVb = dT8_dVg * dT7_dVb; - dT8_dVg *= dT7_dVg; - - if (T7 > EXP_THRESHOLD) - { T9 = MAX_EXP; - dT9_dVg = dT9_dVd = dT9_dVb = 0.0; - } - else if (T7 < -EXP_THRESHOLD) - { T9 = MIN_EXP; - dT9_dVg = dT9_dVd = dT9_dVb = 0.0; - } - else - { T9 = exp(T7); - dT9_dVg = T9 * dT7_dVg; - dT9_dVd = T9 * dT7_dVd; - dT9_dVb = T9 * dT7_dVb; - } - - T0 = T8 * T8; - T1 = T9 - 1.0 + 1.0e-4; - T10 = (T1 - T7) / T8; - dT10_dVg = (dT9_dVg - dT7_dVg - T10 * dT8_dVg) / T8; - dT10_dVd = (dT9_dVd - dT7_dVd - T10 * dT8_dVd) / T8; - dT10_dVb = (dT9_dVb - dT7_dVb - T10 * dT8_dVb) / T8; - - Igcs = Igc * T10; - dIgcs_dVg = dIgc_dVg * T10 + Igc * dT10_dVg; - dIgcs_dVd = dIgc_dVd * T10 + Igc * dT10_dVd; - dIgcs_dVb = dIgc_dVb * T10 + Igc * dT10_dVb; - - T1 = T9 - 1.0 - 1.0e-4; - T10 = (T7 * T9 - T1) / T8; - dT10_dVg = (dT7_dVg * T9 + (T7 - 1.0) * dT9_dVg - - T10 * dT8_dVg) / T8; - dT10_dVd = (dT7_dVd * T9 + (T7 - 1.0) * dT9_dVd - - T10 * dT8_dVd) / T8; - dT10_dVb = (dT7_dVb * T9 + (T7 - 1.0) * dT9_dVb - - T10 * dT8_dVb) / T8; - Igcd = Igc * T10; - dIgcd_dVg = dIgc_dVg * T10 + Igc * dT10_dVg; - dIgcd_dVd = dIgc_dVd * T10 + Igc * dT10_dVd; - dIgcd_dVb = dIgc_dVb * T10 + Igc * dT10_dVb; - - here->BSIM4Igcs = Igcs; - here->BSIM4gIgcsg = dIgcs_dVg; - here->BSIM4gIgcsd = dIgcs_dVd; - here->BSIM4gIgcsb = dIgcs_dVb * dVbseff_dVb; - here->BSIM4Igcd = Igcd; - here->BSIM4gIgcdg = dIgcd_dVg; - here->BSIM4gIgcdd = dIgcd_dVd; - here->BSIM4gIgcdb = dIgcd_dVb * dVbseff_dVb; - - T0 = vgs - (pParam->BSIM4vfbsd + pParam->BSIM4vfbsdoff); - vgs_eff = sqrt(T0 * T0 + 1.0e-4); - dvgs_eff_dvg = T0 / vgs_eff; - - T2 = vgs * vgs_eff; - dT2_dVg = vgs * dvgs_eff_dvg + vgs_eff; - T11 = pParam->BSIM4AechvbEdgeS; - T12 = pParam->BSIM4BechvbEdge; - T3 = pParam->BSIM4aigs * pParam->BSIM4cigs - - pParam->BSIM4bigs; - T4 = pParam->BSIM4bigs * pParam->BSIM4cigs; - T5 = T12 * (pParam->BSIM4aigs + T3 * vgs_eff - - T4 * vgs_eff * vgs_eff); - if (T5 > EXP_THRESHOLD) - { T6 = MAX_EXP; - dT6_dVg = 0.0; - } - else if (T5 < -EXP_THRESHOLD) - { T6 = MIN_EXP; - dT6_dVg = 0.0; - } - else - { T6 = exp(T5); - dT6_dVg = T6 * T12 * (T3 - 2.0 * T4 * vgs_eff) - * dvgs_eff_dvg; - } - Igs = T11 * T2 * T6; - dIgs_dVg = T11 * (T2 * dT6_dVg + T6 * dT2_dVg); - dIgs_dVs = -dIgs_dVg; - - - T0 = vgd - (pParam->BSIM4vfbsd + pParam->BSIM4vfbsdoff); - vgd_eff = sqrt(T0 * T0 + 1.0e-4); - dvgd_eff_dvg = T0 / vgd_eff; - - T2 = vgd * vgd_eff; - dT2_dVg = vgd * dvgd_eff_dvg + vgd_eff; - T11 = pParam->BSIM4AechvbEdgeD; - T3 = pParam->BSIM4aigd * pParam->BSIM4cigd - - pParam->BSIM4bigd; - T4 = pParam->BSIM4bigd * pParam->BSIM4cigd; - T5 = T12 * (pParam->BSIM4aigd + T3 * vgd_eff - - T4 * vgd_eff * vgd_eff); - if (T5 > EXP_THRESHOLD) - { T6 = MAX_EXP; - dT6_dVg = 0.0; - } - else if (T5 < -EXP_THRESHOLD) - { T6 = MIN_EXP; - dT6_dVg = 0.0; - } - else - { T6 = exp(T5); - dT6_dVg = T6 * T12 * (T3 - 2.0 * T4 * vgd_eff) - * dvgd_eff_dvg; - } - Igd = T11 * T2 * T6; - dIgd_dVg = T11 * (T2 * dT6_dVg + T6 * dT2_dVg); - dIgd_dVd = -dIgd_dVg; - - here->BSIM4Igs = Igs; - here->BSIM4gIgsg = dIgs_dVg; - here->BSIM4gIgss = dIgs_dVs; - here->BSIM4Igd = Igd; - here->BSIM4gIgdg = dIgd_dVg; - here->BSIM4gIgdd = dIgd_dVd; - } - else - { here->BSIM4Igcs = here->BSIM4gIgcsg = here->BSIM4gIgcsd - = here->BSIM4gIgcsb = 0.0; - here->BSIM4Igcd = here->BSIM4gIgcdg = here->BSIM4gIgcdd - = here->BSIM4gIgcdb = 0.0; - here->BSIM4Igs = here->BSIM4gIgsg = here->BSIM4gIgss = 0.0; - here->BSIM4Igd = here->BSIM4gIgdg = here->BSIM4gIgdd = 0.0; - } - - if (model->BSIM4igbMod) - { T0 = tmp * pParam->BSIM4nigbacc; - T1 = -Vgs_eff + Vbseff + Vfb; - VxNVt = T1 / T0; - if (VxNVt > EXP_THRESHOLD) - { Vaux = T1; - dVaux_dVg = -dVgs_eff_dVg; - dVaux_dVb = 1.0; - } - else if (VxNVt < -EXP_THRESHOLD) - { Vaux = T0 * log(1.0 + MIN_EXP); - dVaux_dVg = dVaux_dVb = 0.0; - } - else - { ExpVxNVt = exp(VxNVt); - Vaux = T0 * log(1.0 + ExpVxNVt); - dVaux_dVb = ExpVxNVt / (1.0 + ExpVxNVt); - dVaux_dVg = -dVaux_dVb * dVgs_eff_dVg; - } - - T2 = (Vgs_eff - Vbseff) * Vaux; - dT2_dVg = dVgs_eff_dVg * Vaux + (Vgs_eff - Vbseff) * dVaux_dVg; - dT2_dVb = -Vaux + (Vgs_eff - Vbseff) * dVaux_dVb; - - T11 = 4.97232e-7 * pParam->BSIM4weff - * pParam->BSIM4leff * pParam->BSIM4ToxRatio; - T12 = -7.45669e11 * toxe; - T3 = pParam->BSIM4aigbacc * pParam->BSIM4cigbacc - - pParam->BSIM4bigbacc; - T4 = pParam->BSIM4bigbacc * pParam->BSIM4cigbacc; - T5 = T12 * (pParam->BSIM4aigbacc + T3 * Voxacc - - T4 * Voxacc * Voxacc); - - if (T5 > EXP_THRESHOLD) - { T6 = MAX_EXP; - dT6_dVg = dT6_dVb = 0.0; - } - else if (T5 < -EXP_THRESHOLD) - { T6 = MIN_EXP; - dT6_dVg = dT6_dVb = 0.0; - } - else - { T6 = exp(T5); - dT6_dVg = T6 * T12 * (T3 - 2.0 * T4 * Voxacc); - dT6_dVb = dT6_dVg * dVoxacc_dVb; - dT6_dVg *= dVoxacc_dVg; - } - - Igbacc = T11 * T2 * T6; - dIgbacc_dVg = T11 * (T2 * dT6_dVg + T6 * dT2_dVg); - dIgbacc_dVb = T11 * (T2 * dT6_dVb + T6 * dT2_dVb); - - - T0 = tmp * pParam->BSIM4nigbinv; - T1 = Voxdepinv - pParam->BSIM4eigbinv; - VxNVt = T1 / T0; - if (VxNVt > EXP_THRESHOLD) - { Vaux = T1; - dVaux_dVg = dVoxdepinv_dVg; - dVaux_dVd = dVoxdepinv_dVd; - dVaux_dVb = dVoxdepinv_dVb; - } - else if (VxNVt < -EXP_THRESHOLD) - { Vaux = T0 * log(1.0 + MIN_EXP); - dVaux_dVg = dVaux_dVd = dVaux_dVb = 0.0; - } - else - { ExpVxNVt = exp(VxNVt); - Vaux = T0 * log(1.0 + ExpVxNVt); - dVaux_dVg = ExpVxNVt / (1.0 + ExpVxNVt); - dVaux_dVd = dVaux_dVg * dVoxdepinv_dVd; - dVaux_dVb = dVaux_dVg * dVoxdepinv_dVb; - dVaux_dVg *= dVoxdepinv_dVg; - } - - T2 = (Vgs_eff - Vbseff) * Vaux; - dT2_dVg = dVgs_eff_dVg * Vaux + (Vgs_eff - Vbseff) * dVaux_dVg; - dT2_dVd = (Vgs_eff - Vbseff) * dVaux_dVd; - dT2_dVb = -Vaux + (Vgs_eff - Vbseff) * dVaux_dVb; - - T11 *= 0.75610; - T12 *= 1.31724; - T3 = pParam->BSIM4aigbinv * pParam->BSIM4cigbinv - - pParam->BSIM4bigbinv; - T4 = pParam->BSIM4bigbinv * pParam->BSIM4cigbinv; - T5 = T12 * (pParam->BSIM4aigbinv + T3 * Voxdepinv - - T4 * Voxdepinv * Voxdepinv); - - if (T5 > EXP_THRESHOLD) - { T6 = MAX_EXP; - dT6_dVg = dT6_dVd = dT6_dVb = 0.0; - } - else if (T5 < -EXP_THRESHOLD) - { T6 = MIN_EXP; - dT6_dVg = dT6_dVd = dT6_dVb = 0.0; - } - else - { T6 = exp(T5); - dT6_dVg = T6 * T12 * (T3 - 2.0 * T4 * Voxdepinv); - dT6_dVd = dT6_dVg * dVoxdepinv_dVd; - dT6_dVb = dT6_dVg * dVoxdepinv_dVb; - dT6_dVg *= dVoxdepinv_dVg; - } - - Igbinv = T11 * T2 * T6; - dIgbinv_dVg = T11 * (T2 * dT6_dVg + T6 * dT2_dVg); - dIgbinv_dVd = T11 * (T2 * dT6_dVd + T6 * dT2_dVd); - dIgbinv_dVb = T11 * (T2 * dT6_dVb + T6 * dT2_dVb); - - here->BSIM4Igb = Igbinv + Igbacc; - here->BSIM4gIgbg = dIgbinv_dVg + dIgbacc_dVg; - here->BSIM4gIgbd = dIgbinv_dVd; - here->BSIM4gIgbb = (dIgbinv_dVb + dIgbacc_dVb) * dVbseff_dVb; - } - else - { here->BSIM4Igb = here->BSIM4gIgbg = here->BSIM4gIgbd - = here->BSIM4gIgbs = here->BSIM4gIgbb = 0.0; - } /* End of Gate current */ - - if (here->BSIM4nf != 1.0) - { cdrain *= here->BSIM4nf; - here->BSIM4gds *= here->BSIM4nf; - here->BSIM4gm *= here->BSIM4nf; - here->BSIM4gmbs *= here->BSIM4nf; - here->BSIM4IdovVds *= here->BSIM4nf; - - here->BSIM4gbbs *= here->BSIM4nf; - here->BSIM4gbgs *= here->BSIM4nf; - here->BSIM4gbds *= here->BSIM4nf; - here->BSIM4csub *= here->BSIM4nf; - - here->BSIM4Igidl *= here->BSIM4nf; - here->BSIM4ggidld *= here->BSIM4nf; - here->BSIM4ggidlg *= here->BSIM4nf; - here->BSIM4ggidlb *= here->BSIM4nf; - - here->BSIM4Igisl *= here->BSIM4nf; - here->BSIM4ggisls *= here->BSIM4nf; - here->BSIM4ggislg *= here->BSIM4nf; - here->BSIM4ggislb *= here->BSIM4nf; - - here->BSIM4Igcs *= here->BSIM4nf; - here->BSIM4gIgcsg *= here->BSIM4nf; - here->BSIM4gIgcsd *= here->BSIM4nf; - here->BSIM4gIgcsb *= here->BSIM4nf; - here->BSIM4Igcd *= here->BSIM4nf; - here->BSIM4gIgcdg *= here->BSIM4nf; - here->BSIM4gIgcdd *= here->BSIM4nf; - here->BSIM4gIgcdb *= here->BSIM4nf; - - here->BSIM4Igs *= here->BSIM4nf; - here->BSIM4gIgsg *= here->BSIM4nf; - here->BSIM4gIgss *= here->BSIM4nf; - here->BSIM4Igd *= here->BSIM4nf; - here->BSIM4gIgdg *= here->BSIM4nf; - here->BSIM4gIgdd *= here->BSIM4nf; - - here->BSIM4Igb *= here->BSIM4nf; - here->BSIM4gIgbg *= here->BSIM4nf; - here->BSIM4gIgbd *= here->BSIM4nf; - here->BSIM4gIgbb *= here->BSIM4nf; - } - - here->BSIM4ggidls = -(here->BSIM4ggidld + here->BSIM4ggidlg - + here->BSIM4ggidlb); - here->BSIM4ggisld = -(here->BSIM4ggisls + here->BSIM4ggislg - + here->BSIM4ggislb); - here->BSIM4gIgbs = -(here->BSIM4gIgbg + here->BSIM4gIgbd - + here->BSIM4gIgbb); - here->BSIM4gIgcss = -(here->BSIM4gIgcsg + here->BSIM4gIgcsd - + here->BSIM4gIgcsb); - here->BSIM4gIgcds = -(here->BSIM4gIgcdg + here->BSIM4gIgcdd - + here->BSIM4gIgcdb); - here->BSIM4cd = cdrain; - - - /* Calculations for noise analysis */ - - if (model->BSIM4tnoiMod == 0) - { Abulk = Abulk0 * pParam->BSIM4abulkCVfactor; - Vdsat = Vgsteff / Abulk; - T0 = Vdsat - Vds - DELTA_4; - T1 = sqrt(T0 * T0 + 4.0 * DELTA_4 * Vdsat); - if (T0 >= 0.0) - Vdseff = Vdsat - 0.5 * (T0 + T1); - else - { T3 = (DELTA_4 + DELTA_4) / (T1 - T0); - T4 = 1.0 - T3; - T5 = Vdsat * T3 / (T1 - T0); - Vdseff = Vdsat * T4; - } - if (Vds == 0.0) - Vdseff = 0.0; - - T0 = Abulk * Vdseff; - T1 = 12.0 * (Vgsteff - 0.5 * T0 + 1.0e-20); - T2 = Vdseff / T1; - T3 = T0 * T2; - here->BSIM4qinv = Coxeff * pParam->BSIM4weffCV * here->BSIM4nf - * pParam->BSIM4leffCV - * (Vgsteff - 0.5 * T0 + Abulk * T3); - } - else if(model->BSIM4tnoiMod == 2) - { - here->BSIM4noiGd0 = here->BSIM4nf * beta * Vgsteff / (1.0 + gche * Rds); - } - - /* - * BSIM4 C-V begins - */ - - if ((model->BSIM4xpart < 0) || (!ChargeComputationNeeded)) - { qgate = qdrn = qsrc = qbulk = 0.0; - here->BSIM4cggb = here->BSIM4cgsb = here->BSIM4cgdb = 0.0; - here->BSIM4cdgb = here->BSIM4cdsb = here->BSIM4cddb = 0.0; - here->BSIM4cbgb = here->BSIM4cbsb = here->BSIM4cbdb = 0.0; - here->BSIM4csgb = here->BSIM4cssb = here->BSIM4csdb = 0.0; - here->BSIM4cgbb = here->BSIM4csbb = here->BSIM4cdbb = here->BSIM4cbbb = 0.0; - here->BSIM4cqdb = here->BSIM4cqsb = here->BSIM4cqgb - = here->BSIM4cqbb = 0.0; - here->BSIM4gtau = 0.0; - goto finished; - } - else if (model->BSIM4capMod == 0) - { - if (Vbseff < 0.0) - { VbseffCV = Vbs; /*4.6.2*/ - dVbseffCV_dVb = 1.0; - } - else - { VbseffCV = pParam->BSIM4phi - Phis; - dVbseffCV_dVb = -dPhis_dVb * dVbseff_dVb; /*4.6.2*/ - } - - Vfb = pParam->BSIM4vfbcv; - Vth = Vfb + pParam->BSIM4phi + pParam->BSIM4k1ox * sqrtPhis; - Vgst = Vgs_eff - Vth; - dVth_dVb = pParam->BSIM4k1ox * dsqrtPhis_dVb *dVbseff_dVb; /*4.6.2*/ - dVgst_dVb = -dVth_dVb; - dVgst_dVg = dVgs_eff_dVg; - - CoxWL = model->BSIM4coxe * pParam->BSIM4weffCV - * pParam->BSIM4leffCV * here->BSIM4nf; - Arg1 = Vgs_eff - VbseffCV - Vfb; - - if (Arg1 <= 0.0) - { qgate = CoxWL * Arg1; - qbulk = -qgate; - qdrn = 0.0; - - here->BSIM4cggb = CoxWL * dVgs_eff_dVg; - here->BSIM4cgdb = 0.0; - here->BSIM4cgsb = CoxWL * (dVbseffCV_dVb - dVgs_eff_dVg); - - here->BSIM4cdgb = 0.0; - here->BSIM4cddb = 0.0; - here->BSIM4cdsb = 0.0; - - here->BSIM4cbgb = -CoxWL * dVgs_eff_dVg; - here->BSIM4cbdb = 0.0; - here->BSIM4cbsb = -here->BSIM4cgsb; - } /* Arg1 <= 0.0, end of accumulation */ - else if (Vgst <= 0.0) - { T1 = 0.5 * pParam->BSIM4k1ox; - T2 = sqrt(T1 * T1 + Arg1); - qgate = CoxWL * pParam->BSIM4k1ox * (T2 - T1); - qbulk = -qgate; - qdrn = 0.0; - - T0 = CoxWL * T1 / T2; - here->BSIM4cggb = T0 * dVgs_eff_dVg; - here->BSIM4cgdb = 0.0; - here->BSIM4cgsb = T0 * (dVbseffCV_dVb - dVgs_eff_dVg); - - here->BSIM4cdgb = 0.0; - here->BSIM4cddb = 0.0; - here->BSIM4cdsb = 0.0; - - here->BSIM4cbgb = -here->BSIM4cggb; - here->BSIM4cbdb = 0.0; - here->BSIM4cbsb = -here->BSIM4cgsb; - } /* Vgst <= 0.0, end of depletion */ - else - { One_Third_CoxWL = CoxWL / 3.0; - Two_Third_CoxWL = 2.0 * One_Third_CoxWL; - - AbulkCV = Abulk0 * pParam->BSIM4abulkCVfactor; - dAbulkCV_dVb = pParam->BSIM4abulkCVfactor * dAbulk0_dVb*dVbseff_dVb; - - dVdsat_dVg = 1.0 / AbulkCV; /*4.6.2*/ - Vdsat = Vgst * dVdsat_dVg; - dVdsat_dVb = - (Vdsat * dAbulkCV_dVb + dVth_dVb)* dVdsat_dVg; - - if (model->BSIM4xpart > 0.5) - { /* 0/100 Charge partition model */ - if (Vdsat <= Vds) - { /* saturation region */ - T1 = Vdsat / 3.0; - qgate = CoxWL * (Vgs_eff - Vfb - - pParam->BSIM4phi - T1); - T2 = -Two_Third_CoxWL * Vgst; - qbulk = -(qgate + T2); - qdrn = 0.0; - - here->BSIM4cggb = One_Third_CoxWL * (3.0 - - dVdsat_dVg) * dVgs_eff_dVg; - T2 = -One_Third_CoxWL * dVdsat_dVb; - here->BSIM4cgsb = -(here->BSIM4cggb + T2); - here->BSIM4cgdb = 0.0; - - here->BSIM4cdgb = 0.0; - here->BSIM4cddb = 0.0; - here->BSIM4cdsb = 0.0; - - here->BSIM4cbgb = -(here->BSIM4cggb - - Two_Third_CoxWL * dVgs_eff_dVg); - T3 = -(T2 + Two_Third_CoxWL * dVth_dVb); - here->BSIM4cbsb = -(here->BSIM4cbgb + T3); - here->BSIM4cbdb = 0.0; - } - else - { /* linear region */ - Alphaz = Vgst / Vdsat; - T1 = 2.0 * Vdsat - Vds; - T2 = Vds / (3.0 * T1); - T3 = T2 * Vds; - T9 = 0.25 * CoxWL; - T4 = T9 * Alphaz; - T7 = 2.0 * Vds - T1 - 3.0 * T3; - T8 = T3 - T1 - 2.0 * Vds; - qgate = CoxWL * (Vgs_eff - Vfb - - pParam->BSIM4phi - 0.5 * (Vds - T3)); - T10 = T4 * T8; - qdrn = T4 * T7; - qbulk = -(qgate + qdrn + T10); - - T5 = T3 / T1; - here->BSIM4cggb = CoxWL * (1.0 - T5 * dVdsat_dVg) - * dVgs_eff_dVg; - T11 = -CoxWL * T5 * dVdsat_dVb; - here->BSIM4cgdb = CoxWL * (T2 - 0.5 + 0.5 * T5); - here->BSIM4cgsb = -(here->BSIM4cggb + T11 - + here->BSIM4cgdb); - T6 = 1.0 / Vdsat; - dAlphaz_dVg = T6 * (1.0 - Alphaz * dVdsat_dVg); - dAlphaz_dVb = -T6 * (dVth_dVb + Alphaz * dVdsat_dVb); - T7 = T9 * T7; - T8 = T9 * T8; - T9 = 2.0 * T4 * (1.0 - 3.0 * T5); - here->BSIM4cdgb = (T7 * dAlphaz_dVg - T9 - * dVdsat_dVg) * dVgs_eff_dVg; - T12 = T7 * dAlphaz_dVb - T9 * dVdsat_dVb; - here->BSIM4cddb = T4 * (3.0 - 6.0 * T2 - 3.0 * T5); - here->BSIM4cdsb = -(here->BSIM4cdgb + T12 - + here->BSIM4cddb); - - T9 = 2.0 * T4 * (1.0 + T5); - T10 = (T8 * dAlphaz_dVg - T9 * dVdsat_dVg) - * dVgs_eff_dVg; - T11 = T8 * dAlphaz_dVb - T9 * dVdsat_dVb; - T12 = T4 * (2.0 * T2 + T5 - 1.0); - T0 = -(T10 + T11 + T12); - - here->BSIM4cbgb = -(here->BSIM4cggb - + here->BSIM4cdgb + T10); - here->BSIM4cbdb = -(here->BSIM4cgdb - + here->BSIM4cddb + T12); - here->BSIM4cbsb = -(here->BSIM4cgsb - + here->BSIM4cdsb + T0); - } - } - else if (model->BSIM4xpart < 0.5) - { /* 40/60 Charge partition model */ - if (Vds >= Vdsat) - { /* saturation region */ - T1 = Vdsat / 3.0; - qgate = CoxWL * (Vgs_eff - Vfb - - pParam->BSIM4phi - T1); - T2 = -Two_Third_CoxWL * Vgst; - qbulk = -(qgate + T2); - qdrn = 0.4 * T2; - - here->BSIM4cggb = One_Third_CoxWL * (3.0 - - dVdsat_dVg) * dVgs_eff_dVg; - T2 = -One_Third_CoxWL * dVdsat_dVb; - here->BSIM4cgsb = -(here->BSIM4cggb + T2); - here->BSIM4cgdb = 0.0; - - T3 = 0.4 * Two_Third_CoxWL; - here->BSIM4cdgb = -T3 * dVgs_eff_dVg; - here->BSIM4cddb = 0.0; - T4 = T3 * dVth_dVb; - here->BSIM4cdsb = -(T4 + here->BSIM4cdgb); - - here->BSIM4cbgb = -(here->BSIM4cggb - - Two_Third_CoxWL * dVgs_eff_dVg); - T3 = -(T2 + Two_Third_CoxWL * dVth_dVb); - here->BSIM4cbsb = -(here->BSIM4cbgb + T3); - here->BSIM4cbdb = 0.0; - } - else - { /* linear region */ - Alphaz = Vgst / Vdsat; - T1 = 2.0 * Vdsat - Vds; - T2 = Vds / (3.0 * T1); - T3 = T2 * Vds; - T9 = 0.25 * CoxWL; - T4 = T9 * Alphaz; - qgate = CoxWL * (Vgs_eff - Vfb - pParam->BSIM4phi - - 0.5 * (Vds - T3)); - - T5 = T3 / T1; - here->BSIM4cggb = CoxWL * (1.0 - T5 * dVdsat_dVg) - * dVgs_eff_dVg; - tmp = -CoxWL * T5 * dVdsat_dVb; - here->BSIM4cgdb = CoxWL * (T2 - 0.5 + 0.5 * T5); - here->BSIM4cgsb = -(here->BSIM4cggb - + here->BSIM4cgdb + tmp); - - T6 = 1.0 / Vdsat; - dAlphaz_dVg = T6 * (1.0 - Alphaz * dVdsat_dVg); - dAlphaz_dVb = -T6 * (dVth_dVb + Alphaz * dVdsat_dVb); - - T6 = 8.0 * Vdsat * Vdsat - 6.0 * Vdsat * Vds - + 1.2 * Vds * Vds; - T8 = T2 / T1; - T7 = Vds - T1 - T8 * T6; - qdrn = T4 * T7; - T7 *= T9; - tmp = T8 / T1; - tmp1 = T4 * (2.0 - 4.0 * tmp * T6 - + T8 * (16.0 * Vdsat - 6.0 * Vds)); - - here->BSIM4cdgb = (T7 * dAlphaz_dVg - tmp1 - * dVdsat_dVg) * dVgs_eff_dVg; - T10 = T7 * dAlphaz_dVb - tmp1 * dVdsat_dVb; - here->BSIM4cddb = T4 * (2.0 - (1.0 / (3.0 * T1 - * T1) + 2.0 * tmp) * T6 + T8 - * (6.0 * Vdsat - 2.4 * Vds)); - here->BSIM4cdsb = -(here->BSIM4cdgb - + T10 + here->BSIM4cddb); - - T7 = 2.0 * (T1 + T3); - qbulk = -(qgate - T4 * T7); - T7 *= T9; - T0 = 4.0 * T4 * (1.0 - T5); - T12 = (-T7 * dAlphaz_dVg - T0 * dVdsat_dVg) * dVgs_eff_dVg - - here->BSIM4cdgb; /*4.6.2*/ - T11 = -T7 * dAlphaz_dVb - T10 - T0 * dVdsat_dVb; - T10 = -4.0 * T4 * (T2 - 0.5 + 0.5 * T5) - - here->BSIM4cddb; - tmp = -(T10 + T11 + T12); - - here->BSIM4cbgb = -(here->BSIM4cggb - + here->BSIM4cdgb + T12); - here->BSIM4cbdb = -(here->BSIM4cgdb - + here->BSIM4cddb + T10); - here->BSIM4cbsb = -(here->BSIM4cgsb - + here->BSIM4cdsb + tmp); - } - } - else - { /* 50/50 partitioning */ - if (Vds >= Vdsat) - { /* saturation region */ - T1 = Vdsat / 3.0; - qgate = CoxWL * (Vgs_eff - Vfb - - pParam->BSIM4phi - T1); - T2 = -Two_Third_CoxWL * Vgst; - qbulk = -(qgate + T2); - qdrn = 0.5 * T2; - - here->BSIM4cggb = One_Third_CoxWL * (3.0 - - dVdsat_dVg) * dVgs_eff_dVg; - T2 = -One_Third_CoxWL * dVdsat_dVb; - here->BSIM4cgsb = -(here->BSIM4cggb + T2); - here->BSIM4cgdb = 0.0; - - here->BSIM4cdgb = -One_Third_CoxWL * dVgs_eff_dVg; - here->BSIM4cddb = 0.0; - T4 = One_Third_CoxWL * dVth_dVb; - here->BSIM4cdsb = -(T4 + here->BSIM4cdgb); - - here->BSIM4cbgb = -(here->BSIM4cggb - - Two_Third_CoxWL * dVgs_eff_dVg); - T3 = -(T2 + Two_Third_CoxWL * dVth_dVb); - here->BSIM4cbsb = -(here->BSIM4cbgb + T3); - here->BSIM4cbdb = 0.0; - } - else - { /* linear region */ - Alphaz = Vgst / Vdsat; - T1 = 2.0 * Vdsat - Vds; - T2 = Vds / (3.0 * T1); - T3 = T2 * Vds; - T9 = 0.25 * CoxWL; - T4 = T9 * Alphaz; - qgate = CoxWL * (Vgs_eff - Vfb - pParam->BSIM4phi - - 0.5 * (Vds - T3)); - - T5 = T3 / T1; - here->BSIM4cggb = CoxWL * (1.0 - T5 * dVdsat_dVg) - * dVgs_eff_dVg; - tmp = -CoxWL * T5 * dVdsat_dVb; - here->BSIM4cgdb = CoxWL * (T2 - 0.5 + 0.5 * T5); - here->BSIM4cgsb = -(here->BSIM4cggb - + here->BSIM4cgdb + tmp); - - T6 = 1.0 / Vdsat; - dAlphaz_dVg = T6 * (1.0 - Alphaz * dVdsat_dVg); - dAlphaz_dVb = -T6 * (dVth_dVb + Alphaz * dVdsat_dVb); - - T7 = T1 + T3; - qdrn = -T4 * T7; - qbulk = - (qgate + qdrn + qdrn); - T7 *= T9; - T0 = T4 * (2.0 * T5 - 2.0); - - here->BSIM4cdgb = (T0 * dVdsat_dVg - T7 - * dAlphaz_dVg) * dVgs_eff_dVg; - T12 = T0 * dVdsat_dVb - T7 * dAlphaz_dVb; - here->BSIM4cddb = T4 * (1.0 - 2.0 * T2 - T5); - here->BSIM4cdsb = -(here->BSIM4cdgb + T12 - + here->BSIM4cddb); - - here->BSIM4cbgb = -(here->BSIM4cggb - + 2.0 * here->BSIM4cdgb); - here->BSIM4cbdb = -(here->BSIM4cgdb - + 2.0 * here->BSIM4cddb); - here->BSIM4cbsb = -(here->BSIM4cgsb - + 2.0 * here->BSIM4cdsb); - } /* end of linear region */ - } /* end of 50/50 partition */ - } /* end of inversion */ - } /* end of capMod=0 */ - else - { if (Vbseff < 0.0) - { VbseffCV = Vbseff; - dVbseffCV_dVb = 1.0; - } - else - { VbseffCV = pParam->BSIM4phi - Phis; - dVbseffCV_dVb = -dPhis_dVb; - } - - CoxWL = model->BSIM4coxe * pParam->BSIM4weffCV - * pParam->BSIM4leffCV * here->BSIM4nf; - - if(model->BSIM4cvchargeMod == 0) - { - /* Seperate VgsteffCV with noff and voffcv */ - noff = n * pParam->BSIM4noff; - dnoff_dVd = pParam->BSIM4noff * dn_dVd; - dnoff_dVb = pParam->BSIM4noff * dn_dVb; - T0 = Vtm * noff; - voffcv = pParam->BSIM4voffcv; - VgstNVt = (Vgst - voffcv) / T0; - - if (VgstNVt > EXP_THRESHOLD) - { - Vgsteff = Vgst - voffcv; - dVgsteff_dVg = dVgs_eff_dVg; - dVgsteff_dVd = -dVth_dVd; - dVgsteff_dVb = -dVth_dVb; - } - else if (VgstNVt < -EXP_THRESHOLD) - { - Vgsteff = T0 * log(1.0 + MIN_EXP); - dVgsteff_dVg = 0.0; - dVgsteff_dVd = Vgsteff / noff; - dVgsteff_dVb = dVgsteff_dVd * dnoff_dVb; - dVgsteff_dVd *= dnoff_dVd; - } - else - { - ExpVgst = exp(VgstNVt); - Vgsteff = T0 * log(1.0 + ExpVgst); - dVgsteff_dVg = ExpVgst / (1.0 + ExpVgst); - dVgsteff_dVd = -dVgsteff_dVg * (dVth_dVd + (Vgst - voffcv) - / noff * dnoff_dVd) + Vgsteff / noff * dnoff_dVd; - dVgsteff_dVb = -dVgsteff_dVg * (dVth_dVb + (Vgst - voffcv) - / noff * dnoff_dVb) + Vgsteff / noff * dnoff_dVb; - dVgsteff_dVg *= dVgs_eff_dVg; - } - /* End of VgsteffCV for cvchargeMod = 0 */ - } - else - { - T0 = n * Vtm; - T1 = pParam->BSIM4mstarcv * Vgst; - T2 = T1 / T0; - if (T2 > EXP_THRESHOLD) - { - T10 = T1; - dT10_dVg = pParam->BSIM4mstarcv * dVgs_eff_dVg; - dT10_dVd = -dVth_dVd * pParam->BSIM4mstarcv; - dT10_dVb = -dVth_dVb * pParam->BSIM4mstarcv; - } - else if (T2 < -EXP_THRESHOLD) - { - T10 = Vtm * log(1.0 + MIN_EXP); - dT10_dVg = 0.0; - dT10_dVd = T10 * dn_dVd; - dT10_dVb = T10 * dn_dVb; - T10 *= n; - } - else - { - ExpVgst = exp(T2); - T3 = Vtm * log(1.0 + ExpVgst); - T10 = n * T3; - dT10_dVg = pParam->BSIM4mstarcv * ExpVgst / (1.0 + ExpVgst); - dT10_dVb = T3 * dn_dVb - dT10_dVg * (dVth_dVb + Vgst * dn_dVb / n); - dT10_dVd = T3 * dn_dVd - dT10_dVg * (dVth_dVd + Vgst * dn_dVd / n); - dT10_dVg *= dVgs_eff_dVg; - } - - T1 = pParam->BSIM4voffcbncv - (1.0 - pParam->BSIM4mstarcv) * Vgst; - T2 = T1 / T0; - if (T2 < -EXP_THRESHOLD) - { - T3 = model->BSIM4coxe * MIN_EXP / pParam->BSIM4cdep0; - T9 = pParam->BSIM4mstarcv + T3 * n; - dT9_dVg = 0.0; - dT9_dVd = dn_dVd * T3; - dT9_dVb = dn_dVb * T3; - } - else if (T2 > EXP_THRESHOLD) - { - T3 = model->BSIM4coxe * MAX_EXP / pParam->BSIM4cdep0; - T9 = pParam->BSIM4mstarcv + T3 * n; - dT9_dVg = 0.0; - dT9_dVd = dn_dVd * T3; - dT9_dVb = dn_dVb * T3; - } - else - { - ExpVgst = exp(T2); - T3 = model->BSIM4coxe / pParam->BSIM4cdep0; - T4 = T3 * ExpVgst; - T5 = T1 * T4 / T0; - T9 = pParam->BSIM4mstarcv + n * T4; - dT9_dVg = T3 * (pParam->BSIM4mstarcv - 1.0) * ExpVgst / Vtm; - dT9_dVb = T4 * dn_dVb - dT9_dVg * dVth_dVb - T5 * dn_dVb; - dT9_dVd = T4 * dn_dVd - dT9_dVg * dVth_dVd - T5 * dn_dVd; - dT9_dVg *= dVgs_eff_dVg; - } - - Vgsteff = T10 / T9; - T11 = T9 * T9; - dVgsteff_dVg = (T9 * dT10_dVg - T10 * dT9_dVg) / T11; - dVgsteff_dVd = (T9 * dT10_dVd - T10 * dT9_dVd) / T11; - dVgsteff_dVb = (T9 * dT10_dVb - T10 * dT9_dVb) / T11; - /* End of VgsteffCV for cvchargeMod = 1 */ - } - - - if (model->BSIM4capMod == 1) - { Vfb = here->BSIM4vfbzb; - V3 = Vfb - Vgs_eff + VbseffCV - DELTA_3; - if (Vfb <= 0.0) - T0 = sqrt(V3 * V3 - 4.0 * DELTA_3 * Vfb); - else - T0 = sqrt(V3 * V3 + 4.0 * DELTA_3 * Vfb); - - T1 = 0.5 * (1.0 + V3 / T0); - Vfbeff = Vfb - 0.5 * (V3 + T0); - dVfbeff_dVg = T1 * dVgs_eff_dVg; - dVfbeff_dVb = -T1 * dVbseffCV_dVb; - Qac0 = CoxWL * (Vfbeff - Vfb); - dQac0_dVg = CoxWL * dVfbeff_dVg; - dQac0_dVb = CoxWL * dVfbeff_dVb; - - T0 = 0.5 * pParam->BSIM4k1ox; - T3 = Vgs_eff - Vfbeff - VbseffCV - Vgsteff; - if (pParam->BSIM4k1ox == 0.0) - { T1 = 0.0; - T2 = 0.0; - } - else if (T3 < 0.0) - { T1 = T0 + T3 / pParam->BSIM4k1ox; - T2 = CoxWL; - } - else - { T1 = sqrt(T0 * T0 + T3); - T2 = CoxWL * T0 / T1; - } - - Qsub0 = CoxWL * pParam->BSIM4k1ox * (T1 - T0); - - dQsub0_dVg = T2 * (dVgs_eff_dVg - dVfbeff_dVg - dVgsteff_dVg); - dQsub0_dVd = -T2 * dVgsteff_dVd; - dQsub0_dVb = -T2 * (dVfbeff_dVb + dVbseffCV_dVb - + dVgsteff_dVb); - - AbulkCV = Abulk0 * pParam->BSIM4abulkCVfactor; - dAbulkCV_dVb = pParam->BSIM4abulkCVfactor * dAbulk0_dVb; - VdsatCV = Vgsteff / AbulkCV; - - T0 = VdsatCV - Vds - DELTA_4; - dT0_dVg = 1.0 / AbulkCV; - dT0_dVb = -VdsatCV * dAbulkCV_dVb / AbulkCV; - T1 = sqrt(T0 * T0 + 4.0 * DELTA_4 * VdsatCV); - dT1_dVg = (T0 + DELTA_4 + DELTA_4) / T1; - dT1_dVd = -T0 / T1; - dT1_dVb = dT1_dVg * dT0_dVb; - dT1_dVg *= dT0_dVg; - if (T0 >= 0.0) - { VdseffCV = VdsatCV - 0.5 * (T0 + T1); - dVdseffCV_dVg = 0.5 * (dT0_dVg - dT1_dVg); - dVdseffCV_dVd = 0.5 * (1.0 - dT1_dVd); - dVdseffCV_dVb = 0.5 * (dT0_dVb - dT1_dVb); - } - else - { T3 = (DELTA_4 + DELTA_4) / (T1 - T0); - T4 = 1.0 - T3; - T5 = VdsatCV * T3 / (T1 - T0); - VdseffCV = VdsatCV * T4; - dVdseffCV_dVg = dT0_dVg * T4 + T5 * (dT1_dVg - dT0_dVg); - dVdseffCV_dVd = T5 * (dT1_dVd + 1.0); - dVdseffCV_dVb = dT0_dVb * (T4 - T5) + T5 * dT1_dVb; - } - - if (Vds == 0.0) - { VdseffCV = 0.0; - dVdseffCV_dVg = 0.0; - dVdseffCV_dVb = 0.0; - } - - T0 = AbulkCV * VdseffCV; - T1 = 12.0 * (Vgsteff - 0.5 * T0 + 1.0e-20); - T2 = VdseffCV / T1; - T3 = T0 * T2; - - T4 = (1.0 - 12.0 * T2 * T2 * AbulkCV); - T5 = (6.0 * T0 * (4.0 * Vgsteff - T0) / (T1 * T1) - 0.5); - T6 = 12.0 * T2 * T2 * Vgsteff; - - qgate = CoxWL * (Vgsteff - 0.5 * VdseffCV + T3); - Cgg1 = CoxWL * (T4 + T5 * dVdseffCV_dVg); - Cgd1 = CoxWL * T5 * dVdseffCV_dVd + Cgg1 * dVgsteff_dVd; - Cgb1 = CoxWL * (T5 * dVdseffCV_dVb + T6 * dAbulkCV_dVb) - + Cgg1 * dVgsteff_dVb; - Cgg1 *= dVgsteff_dVg; - - T7 = 1.0 - AbulkCV; - qbulk = CoxWL * T7 * (0.5 * VdseffCV - T3); - T4 = -T7 * (T4 - 1.0); - T5 = -T7 * T5; - T6 = -(T7 * T6 + (0.5 * VdseffCV - T3)); - Cbg1 = CoxWL * (T4 + T5 * dVdseffCV_dVg); - Cbd1 = CoxWL * T5 * dVdseffCV_dVd + Cbg1 * dVgsteff_dVd; - Cbb1 = CoxWL * (T5 * dVdseffCV_dVb + T6 * dAbulkCV_dVb) - + Cbg1 * dVgsteff_dVb; - Cbg1 *= dVgsteff_dVg; - - if (model->BSIM4xpart > 0.5) - { /* 0/100 Charge petition model */ - T1 = T1 + T1; - qsrc = -CoxWL * (0.5 * Vgsteff + 0.25 * T0 - - T0 * T0 / T1); - T7 = (4.0 * Vgsteff - T0) / (T1 * T1); - T4 = -(0.5 + 24.0 * T0 * T0 / (T1 * T1)); - T5 = -(0.25 * AbulkCV - 12.0 * AbulkCV * T0 * T7); - T6 = -(0.25 * VdseffCV - 12.0 * T0 * VdseffCV * T7); - Csg = CoxWL * (T4 + T5 * dVdseffCV_dVg); - Csd = CoxWL * T5 * dVdseffCV_dVd + Csg * dVgsteff_dVd; - Csb = CoxWL * (T5 * dVdseffCV_dVb + T6 * dAbulkCV_dVb) - + Csg * dVgsteff_dVb; - Csg *= dVgsteff_dVg; - } - else if (model->BSIM4xpart < 0.5) - { /* 40/60 Charge petition model */ - T1 = T1 / 12.0; - T2 = 0.5 * CoxWL / (T1 * T1); - T3 = Vgsteff * (2.0 * T0 * T0 / 3.0 + Vgsteff - * (Vgsteff - 4.0 * T0 / 3.0)) - - 2.0 * T0 * T0 * T0 / 15.0; - qsrc = -T2 * T3; - T7 = 4.0 / 3.0 * Vgsteff * (Vgsteff - T0) - + 0.4 * T0 * T0; - T4 = -2.0 * qsrc / T1 - T2 * (Vgsteff * (3.0 - * Vgsteff - 8.0 * T0 / 3.0) - + 2.0 * T0 * T0 / 3.0); - T5 = (qsrc / T1 + T2 * T7) * AbulkCV; - T6 = (qsrc / T1 * VdseffCV + T2 * T7 * VdseffCV); - Csg = (T4 + T5 * dVdseffCV_dVg); - Csd = T5 * dVdseffCV_dVd + Csg * dVgsteff_dVd; - Csb = (T5 * dVdseffCV_dVb + T6 * dAbulkCV_dVb) - + Csg * dVgsteff_dVb; - Csg *= dVgsteff_dVg; - } - else - { /* 50/50 Charge petition model */ - qsrc = -0.5 * (qgate + qbulk); - Csg = -0.5 * (Cgg1 + Cbg1); - Csb = -0.5 * (Cgb1 + Cbb1); - Csd = -0.5 * (Cgd1 + Cbd1); - } - - qgate += Qac0 + Qsub0; - qbulk -= (Qac0 + Qsub0); - qdrn = -(qgate + qbulk + qsrc); - - Cgg = dQac0_dVg + dQsub0_dVg + Cgg1; - Cgd = dQsub0_dVd + Cgd1; - Cgb = dQac0_dVb + dQsub0_dVb + Cgb1; - - Cbg = Cbg1 - dQac0_dVg - dQsub0_dVg; - Cbd = Cbd1 - dQsub0_dVd; - Cbb = Cbb1 - dQac0_dVb - dQsub0_dVb; - - Cgb *= dVbseff_dVb; - Cbb *= dVbseff_dVb; - Csb *= dVbseff_dVb; - - here->BSIM4cggb = Cgg; - here->BSIM4cgsb = -(Cgg + Cgd + Cgb); - here->BSIM4cgdb = Cgd; - here->BSIM4cdgb = -(Cgg + Cbg + Csg); - here->BSIM4cdsb = (Cgg + Cgd + Cgb + Cbg + Cbd + Cbb - + Csg + Csd + Csb); - here->BSIM4cddb = -(Cgd + Cbd + Csd); - here->BSIM4cbgb = Cbg; - here->BSIM4cbsb = -(Cbg + Cbd + Cbb); - here->BSIM4cbdb = Cbd; - } - - /* Charge-Thickness capMod (CTM) begins */ - else if (model->BSIM4capMod == 2) - { V3 = here->BSIM4vfbzb - Vgs_eff + VbseffCV - DELTA_3; - if (here->BSIM4vfbzb <= 0.0) - T0 = sqrt(V3 * V3 - 4.0 * DELTA_3 * here->BSIM4vfbzb); - else - T0 = sqrt(V3 * V3 + 4.0 * DELTA_3 * here->BSIM4vfbzb); - - T1 = 0.5 * (1.0 + V3 / T0); - Vfbeff = here->BSIM4vfbzb - 0.5 * (V3 + T0); - dVfbeff_dVg = T1 * dVgs_eff_dVg; - dVfbeff_dVb = -T1 * dVbseffCV_dVb; - - Cox = here->BSIM4coxp; - Tox = 1.0e8 * here->BSIM4toxp; - T0 = (Vgs_eff - VbseffCV - here->BSIM4vfbzb) / Tox; - dT0_dVg = dVgs_eff_dVg / Tox; - dT0_dVb = -dVbseffCV_dVb / Tox; - - tmp = T0 * pParam->BSIM4acde; - if ((-EXP_THRESHOLD < tmp) && (tmp < EXP_THRESHOLD)) - { Tcen = pParam->BSIM4ldeb * exp(tmp); - dTcen_dVg = pParam->BSIM4acde * Tcen; - dTcen_dVb = dTcen_dVg * dT0_dVb; - dTcen_dVg *= dT0_dVg; - } - else if (tmp <= -EXP_THRESHOLD) - { Tcen = pParam->BSIM4ldeb * MIN_EXP; - dTcen_dVg = dTcen_dVb = 0.0; - } - else - { Tcen = pParam->BSIM4ldeb * MAX_EXP; - dTcen_dVg = dTcen_dVb = 0.0; - } - - LINK = 1.0e-3 * here->BSIM4toxp; - V3 = pParam->BSIM4ldeb - Tcen - LINK; - V4 = sqrt(V3 * V3 + 4.0 * LINK * pParam->BSIM4ldeb); - Tcen = pParam->BSIM4ldeb - 0.5 * (V3 + V4); - T1 = 0.5 * (1.0 + V3 / V4); - dTcen_dVg *= T1; - dTcen_dVb *= T1; - - Ccen = epssub / Tcen; - T2 = Cox / (Cox + Ccen); - Coxeff = T2 * Ccen; - T3 = -Ccen / Tcen; - dCoxeff_dVg = T2 * T2 * T3; - dCoxeff_dVb = dCoxeff_dVg * dTcen_dVb; - dCoxeff_dVg *= dTcen_dVg; - CoxWLcen = CoxWL * Coxeff / model->BSIM4coxe; - - Qac0 = CoxWLcen * (Vfbeff - here->BSIM4vfbzb); - QovCox = Qac0 / Coxeff; - dQac0_dVg = CoxWLcen * dVfbeff_dVg - + QovCox * dCoxeff_dVg; - dQac0_dVb = CoxWLcen * dVfbeff_dVb - + QovCox * dCoxeff_dVb; - - T0 = 0.5 * pParam->BSIM4k1ox; - T3 = Vgs_eff - Vfbeff - VbseffCV - Vgsteff; - if (pParam->BSIM4k1ox == 0.0) - { T1 = 0.0; - T2 = 0.0; - } - else if (T3 < 0.0) - { T1 = T0 + T3 / pParam->BSIM4k1ox; - T2 = CoxWLcen; - } - else - { T1 = sqrt(T0 * T0 + T3); - T2 = CoxWLcen * T0 / T1; - } - - Qsub0 = CoxWLcen * pParam->BSIM4k1ox * (T1 - T0); - QovCox = Qsub0 / Coxeff; - dQsub0_dVg = T2 * (dVgs_eff_dVg - dVfbeff_dVg - dVgsteff_dVg) - + QovCox * dCoxeff_dVg; - dQsub0_dVd = -T2 * dVgsteff_dVd; - dQsub0_dVb = -T2 * (dVfbeff_dVb + dVbseffCV_dVb + dVgsteff_dVb) - + QovCox * dCoxeff_dVb; - - /* Gate-bias dependent delta Phis begins */ - if (pParam->BSIM4k1ox <= 0.0) - { Denomi = 0.25 * pParam->BSIM4moin * Vtm; - T0 = 0.5 * pParam->BSIM4sqrtPhi; - } - else - { Denomi = pParam->BSIM4moin * Vtm - * pParam->BSIM4k1ox * pParam->BSIM4k1ox; - T0 = pParam->BSIM4k1ox * pParam->BSIM4sqrtPhi; - } - T1 = 2.0 * T0 + Vgsteff; - - DeltaPhi = Vtm * log(1.0 + T1 * Vgsteff / Denomi); - dDeltaPhi_dVg = 2.0 * Vtm * (T1 -T0) / (Denomi + T1 * Vgsteff); - /* End of delta Phis */ - - /* VgDP = Vgsteff - DeltaPhi */ - T0 = Vgsteff - DeltaPhi - 0.001; - dT0_dVg = 1.0 - dDeltaPhi_dVg; - T1 = sqrt(T0 * T0 + Vgsteff * 0.004); - VgDP = 0.5 * (T0 + T1); - dVgDP_dVg = 0.5 * (dT0_dVg + (T0 * dT0_dVg + 0.002) / T1); - - Tox += Tox; /* WDLiu: Tcen reevaluated below due to different Vgsteff */ - T0 = (Vgsteff + here->BSIM4vtfbphi2) / Tox; - tmp = exp(model->BSIM4bdos * 0.7 * log(T0)); - T1 = 1.0 + tmp; - T2 = model->BSIM4bdos * 0.7 * tmp / (T0 * Tox); - Tcen = model->BSIM4ados * 1.9e-9 / T1; - dTcen_dVg = -Tcen * T2 / T1; - dTcen_dVd = dTcen_dVg * dVgsteff_dVd; - dTcen_dVb = dTcen_dVg * dVgsteff_dVb; - dTcen_dVg *= dVgsteff_dVg; - - Ccen = epssub / Tcen; - T0 = Cox / (Cox + Ccen); - Coxeff = T0 * Ccen; - T1 = -Ccen / Tcen; - dCoxeff_dVg = T0 * T0 * T1; - dCoxeff_dVd = dCoxeff_dVg * dTcen_dVd; - dCoxeff_dVb = dCoxeff_dVg * dTcen_dVb; - dCoxeff_dVg *= dTcen_dVg; - CoxWLcen = CoxWL * Coxeff / model->BSIM4coxe; - - AbulkCV = Abulk0 * pParam->BSIM4abulkCVfactor; - dAbulkCV_dVb = pParam->BSIM4abulkCVfactor * dAbulk0_dVb; - VdsatCV = VgDP / AbulkCV; - - T0 = VdsatCV - Vds - DELTA_4; - dT0_dVg = dVgDP_dVg / AbulkCV; - dT0_dVb = -VdsatCV * dAbulkCV_dVb / AbulkCV; - T1 = sqrt(T0 * T0 + 4.0 * DELTA_4 * VdsatCV); - dT1_dVg = (T0 + DELTA_4 + DELTA_4) / T1; - dT1_dVd = -T0 / T1; - dT1_dVb = dT1_dVg * dT0_dVb; - dT1_dVg *= dT0_dVg; - if (T0 >= 0.0) - { VdseffCV = VdsatCV - 0.5 * (T0 + T1); - dVdseffCV_dVg = 0.5 * (dT0_dVg - dT1_dVg); - dVdseffCV_dVd = 0.5 * (1.0 - dT1_dVd); - dVdseffCV_dVb = 0.5 * (dT0_dVb - dT1_dVb); - } - else - { T3 = (DELTA_4 + DELTA_4) / (T1 - T0); - T4 = 1.0 - T3; - T5 = VdsatCV * T3 / (T1 - T0); - VdseffCV = VdsatCV * T4; - dVdseffCV_dVg = dT0_dVg * T4 + T5 * (dT1_dVg - dT0_dVg); - dVdseffCV_dVd = T5 * (dT1_dVd + 1.0); - dVdseffCV_dVb = dT0_dVb * (T4 - T5) + T5 * dT1_dVb; - } - - if (Vds == 0.0) - { VdseffCV = 0.0; - dVdseffCV_dVg = 0.0; - dVdseffCV_dVb = 0.0; - } - - T0 = AbulkCV * VdseffCV; - T1 = VgDP; - T2 = 12.0 * (T1 - 0.5 * T0 + 1.0e-20); - T3 = T0 / T2; - T4 = 1.0 - 12.0 * T3 * T3; - T5 = AbulkCV * (6.0 * T0 * (4.0 * T1 - T0) / (T2 * T2) - 0.5); - T6 = T5 * VdseffCV / AbulkCV; - - qgate = CoxWLcen * (T1 - T0 * (0.5 - T3)); - QovCox = qgate / Coxeff; - Cgg1 = CoxWLcen * (T4 * dVgDP_dVg - + T5 * dVdseffCV_dVg); - Cgd1 = CoxWLcen * T5 * dVdseffCV_dVd + Cgg1 - * dVgsteff_dVd + QovCox * dCoxeff_dVd; - Cgb1 = CoxWLcen * (T5 * dVdseffCV_dVb + T6 * dAbulkCV_dVb) - + Cgg1 * dVgsteff_dVb + QovCox * dCoxeff_dVb; - Cgg1 = Cgg1 * dVgsteff_dVg + QovCox * dCoxeff_dVg; - - - T7 = 1.0 - AbulkCV; - T8 = T2 * T2; - T9 = 12.0 * T7 * T0 * T0 / (T8 * AbulkCV); - T10 = T9 * dVgDP_dVg; - T11 = -T7 * T5 / AbulkCV; - T12 = -(T9 * T1 / AbulkCV + VdseffCV * (0.5 - T0 / T2)); - - qbulk = CoxWLcen * T7 * (0.5 * VdseffCV - T0 * VdseffCV / T2); - QovCox = qbulk / Coxeff; - Cbg1 = CoxWLcen * (T10 + T11 * dVdseffCV_dVg); - Cbd1 = CoxWLcen * T11 * dVdseffCV_dVd + Cbg1 - * dVgsteff_dVd + QovCox * dCoxeff_dVd; - Cbb1 = CoxWLcen * (T11 * dVdseffCV_dVb + T12 * dAbulkCV_dVb) - + Cbg1 * dVgsteff_dVb + QovCox * dCoxeff_dVb; - Cbg1 = Cbg1 * dVgsteff_dVg + QovCox * dCoxeff_dVg; - - if (model->BSIM4xpart > 0.5) - { /* 0/100 partition */ - qsrc = -CoxWLcen * (T1 / 2.0 + T0 / 4.0 - - 0.5 * T0 * T0 / T2); - QovCox = qsrc / Coxeff; - T2 += T2; - T3 = T2 * T2; - T7 = -(0.25 - 12.0 * T0 * (4.0 * T1 - T0) / T3); - T4 = -(0.5 + 24.0 * T0 * T0 / T3) * dVgDP_dVg; - T5 = T7 * AbulkCV; - T6 = T7 * VdseffCV; - - Csg = CoxWLcen * (T4 + T5 * dVdseffCV_dVg); - Csd = CoxWLcen * T5 * dVdseffCV_dVd + Csg * dVgsteff_dVd - + QovCox * dCoxeff_dVd; - Csb = CoxWLcen * (T5 * dVdseffCV_dVb + T6 * dAbulkCV_dVb) - + Csg * dVgsteff_dVb + QovCox * dCoxeff_dVb; - Csg = Csg * dVgsteff_dVg + QovCox * dCoxeff_dVg; - } - else if (model->BSIM4xpart < 0.5) - { /* 40/60 partition */ - T2 = T2 / 12.0; - T3 = 0.5 * CoxWLcen / (T2 * T2); - T4 = T1 * (2.0 * T0 * T0 / 3.0 + T1 * (T1 - 4.0 - * T0 / 3.0)) - 2.0 * T0 * T0 * T0 / 15.0; - qsrc = -T3 * T4; - QovCox = qsrc / Coxeff; - T8 = 4.0 / 3.0 * T1 * (T1 - T0) + 0.4 * T0 * T0; - T5 = -2.0 * qsrc / T2 - T3 * (T1 * (3.0 * T1 - 8.0 - * T0 / 3.0) + 2.0 * T0 * T0 / 3.0); - T6 = AbulkCV * (qsrc / T2 + T3 * T8); - T7 = T6 * VdseffCV / AbulkCV; - - Csg = T5 * dVgDP_dVg + T6 * dVdseffCV_dVg; - Csd = Csg * dVgsteff_dVd + T6 * dVdseffCV_dVd - + QovCox * dCoxeff_dVd; - Csb = Csg * dVgsteff_dVb + T6 * dVdseffCV_dVb - + T7 * dAbulkCV_dVb + QovCox * dCoxeff_dVb; - Csg = Csg * dVgsteff_dVg + QovCox * dCoxeff_dVg; - } - else - { /* 50/50 partition */ - qsrc = -0.5 * qgate; - Csg = -0.5 * Cgg1; - Csd = -0.5 * Cgd1; - Csb = -0.5 * Cgb1; - } - - qgate += Qac0 + Qsub0 - qbulk; - qbulk -= (Qac0 + Qsub0); - qdrn = -(qgate + qbulk + qsrc); - - Cbg = Cbg1 - dQac0_dVg - dQsub0_dVg; - Cbd = Cbd1 - dQsub0_dVd; - Cbb = Cbb1 - dQac0_dVb - dQsub0_dVb; - - Cgg = Cgg1 - Cbg; - Cgd = Cgd1 - Cbd; - Cgb = Cgb1 - Cbb; - - Cgb *= dVbseff_dVb; - Cbb *= dVbseff_dVb; - Csb *= dVbseff_dVb; - - here->BSIM4cggb = Cgg; - here->BSIM4cgsb = -(Cgg + Cgd + Cgb); - here->BSIM4cgdb = Cgd; - here->BSIM4cdgb = -(Cgg + Cbg + Csg); - here->BSIM4cdsb = (Cgg + Cgd + Cgb + Cbg + Cbd + Cbb - + Csg + Csd + Csb); - here->BSIM4cddb = -(Cgd + Cbd + Csd); - here->BSIM4cbgb = Cbg; - here->BSIM4cbsb = -(Cbg + Cbd + Cbb); - here->BSIM4cbdb = Cbd; - } /* End of CTM */ - } - - here->BSIM4csgb = - here->BSIM4cggb - here->BSIM4cdgb - here->BSIM4cbgb; - here->BSIM4csdb = - here->BSIM4cgdb - here->BSIM4cddb - here->BSIM4cbdb; - here->BSIM4cssb = - here->BSIM4cgsb - here->BSIM4cdsb - here->BSIM4cbsb; - here->BSIM4cgbb = - here->BSIM4cgdb - here->BSIM4cggb - here->BSIM4cgsb; - here->BSIM4cdbb = - here->BSIM4cddb - here->BSIM4cdgb - here->BSIM4cdsb; - here->BSIM4cbbb = - here->BSIM4cbgb - here->BSIM4cbdb - here->BSIM4cbsb; - here->BSIM4csbb = - here->BSIM4cgbb - here->BSIM4cdbb - here->BSIM4cbbb; - here->BSIM4qgate = qgate; - here->BSIM4qbulk = qbulk; - here->BSIM4qdrn = qdrn; - here->BSIM4qsrc = -(qgate + qbulk + qdrn); - - /* NQS begins */ - if ((here->BSIM4trnqsMod) || (here->BSIM4acnqsMod)) - { here->BSIM4qchqs = qcheq = -(qbulk + qgate); - here->BSIM4cqgb = -(here->BSIM4cggb + here->BSIM4cbgb); - here->BSIM4cqdb = -(here->BSIM4cgdb + here->BSIM4cbdb); - here->BSIM4cqsb = -(here->BSIM4cgsb + here->BSIM4cbsb); - here->BSIM4cqbb = -(here->BSIM4cqgb + here->BSIM4cqdb - + here->BSIM4cqsb); - - CoxWL = model->BSIM4coxe * pParam->BSIM4weffCV * here->BSIM4nf - * pParam->BSIM4leffCV; - T1 = here->BSIM4gcrg / CoxWL; /* 1 / tau */ - here->BSIM4gtau = T1 * ScalingFactor; - - if (here->BSIM4acnqsMod) - here->BSIM4taunet = 1.0 / T1; - - *(ckt->CKTstate0 + here->BSIM4qcheq) = qcheq; - if (ckt->CKTmode & MODEINITTRAN) - *(ckt->CKTstate1 + here->BSIM4qcheq) = - *(ckt->CKTstate0 + here->BSIM4qcheq); - if (here->BSIM4trnqsMod) - { error = NIintegrate(ckt, &geq, &ceq, 0.0, here->BSIM4qcheq); - if (error) - return(error); - } - } - - -finished: - - /* Calculate junction C-V */ - if (ChargeComputationNeeded) - { czbd = model->BSIM4DunitAreaTempJctCap * here->BSIM4Adeff; /* bug fix */ - czbs = model->BSIM4SunitAreaTempJctCap * here->BSIM4Aseff; - czbdsw = model->BSIM4DunitLengthSidewallTempJctCap * here->BSIM4Pdeff; - czbdswg = model->BSIM4DunitLengthGateSidewallTempJctCap - * pParam->BSIM4weffCJ * here->BSIM4nf; - czbssw = model->BSIM4SunitLengthSidewallTempJctCap * here->BSIM4Pseff; - czbsswg = model->BSIM4SunitLengthGateSidewallTempJctCap - * pParam->BSIM4weffCJ * here->BSIM4nf; - - MJS = model->BSIM4SbulkJctBotGradingCoeff; - MJSWS = model->BSIM4SbulkJctSideGradingCoeff; - MJSWGS = model->BSIM4SbulkJctGateSideGradingCoeff; - - MJD = model->BSIM4DbulkJctBotGradingCoeff; - MJSWD = model->BSIM4DbulkJctSideGradingCoeff; - MJSWGD = model->BSIM4DbulkJctGateSideGradingCoeff; - - /* Source Bulk Junction */ - if (vbs_jct == 0.0) - { *(ckt->CKTstate0 + here->BSIM4qbs) = 0.0; - here->BSIM4capbs = czbs + czbssw + czbsswg; - } - else if (vbs_jct < 0.0) - { if (czbs > 0.0) - { arg = 1.0 - vbs_jct / model->BSIM4PhiBS; - if (MJS == 0.5) - sarg = 1.0 / sqrt(arg); - else - sarg = exp(-MJS * log(arg)); - *(ckt->CKTstate0 + here->BSIM4qbs) = model->BSIM4PhiBS * czbs - * (1.0 - arg * sarg) / (1.0 - MJS); - here->BSIM4capbs = czbs * sarg; - } - else - { *(ckt->CKTstate0 + here->BSIM4qbs) = 0.0; - here->BSIM4capbs = 0.0; - } - if (czbssw > 0.0) - { arg = 1.0 - vbs_jct / model->BSIM4PhiBSWS; - if (MJSWS == 0.5) - sarg = 1.0 / sqrt(arg); - else - sarg = exp(-MJSWS * log(arg)); - *(ckt->CKTstate0 + here->BSIM4qbs) += model->BSIM4PhiBSWS * czbssw - * (1.0 - arg * sarg) / (1.0 - MJSWS); - here->BSIM4capbs += czbssw * sarg; - } - if (czbsswg > 0.0) - { arg = 1.0 - vbs_jct / model->BSIM4PhiBSWGS; - if (MJSWGS == 0.5) - sarg = 1.0 / sqrt(arg); - else - sarg = exp(-MJSWGS * log(arg)); - *(ckt->CKTstate0 + here->BSIM4qbs) += model->BSIM4PhiBSWGS * czbsswg - * (1.0 - arg * sarg) / (1.0 - MJSWGS); - here->BSIM4capbs += czbsswg * sarg; - } - - } - else - { T0 = czbs + czbssw + czbsswg; - T1 = vbs_jct * (czbs * MJS / model->BSIM4PhiBS + czbssw * MJSWS - / model->BSIM4PhiBSWS + czbsswg * MJSWGS / model->BSIM4PhiBSWGS); - *(ckt->CKTstate0 + here->BSIM4qbs) = vbs_jct * (T0 + 0.5 * T1); - here->BSIM4capbs = T0 + T1; - } - - /* Drain Bulk Junction */ - if (vbd_jct == 0.0) - { *(ckt->CKTstate0 + here->BSIM4qbd) = 0.0; - here->BSIM4capbd = czbd + czbdsw + czbdswg; - } - else if (vbd_jct < 0.0) - { if (czbd > 0.0) - { arg = 1.0 - vbd_jct / model->BSIM4PhiBD; - if (MJD == 0.5) - sarg = 1.0 / sqrt(arg); - else - sarg = exp(-MJD * log(arg)); - *(ckt->CKTstate0 + here->BSIM4qbd) = model->BSIM4PhiBD* czbd - * (1.0 - arg * sarg) / (1.0 - MJD); - here->BSIM4capbd = czbd * sarg; - } - else - { *(ckt->CKTstate0 + here->BSIM4qbd) = 0.0; - here->BSIM4capbd = 0.0; - } - if (czbdsw > 0.0) - { arg = 1.0 - vbd_jct / model->BSIM4PhiBSWD; - if (MJSWD == 0.5) - sarg = 1.0 / sqrt(arg); - else - sarg = exp(-MJSWD * log(arg)); - *(ckt->CKTstate0 + here->BSIM4qbd) += model->BSIM4PhiBSWD * czbdsw - * (1.0 - arg * sarg) / (1.0 - MJSWD); - here->BSIM4capbd += czbdsw * sarg; - } - if (czbdswg > 0.0) - { arg = 1.0 - vbd_jct / model->BSIM4PhiBSWGD; - if (MJSWGD == 0.5) - sarg = 1.0 / sqrt(arg); - else - sarg = exp(-MJSWGD * log(arg)); - *(ckt->CKTstate0 + here->BSIM4qbd) += model->BSIM4PhiBSWGD * czbdswg - * (1.0 - arg * sarg) / (1.0 - MJSWGD); - here->BSIM4capbd += czbdswg * sarg; - } - } - else - { T0 = czbd + czbdsw + czbdswg; - T1 = vbd_jct * (czbd * MJD / model->BSIM4PhiBD + czbdsw * MJSWD - / model->BSIM4PhiBSWD + czbdswg * MJSWGD / model->BSIM4PhiBSWGD); - *(ckt->CKTstate0 + here->BSIM4qbd) = vbd_jct * (T0 + 0.5 * T1); - here->BSIM4capbd = T0 + T1; - } - } - - - /* - * check convergence - */ - - if ((here->BSIM4off == 0) || (!(ckt->CKTmode & MODEINITFIX))) - { if (Check == 1) - { ckt->CKTnoncon++; -#ifndef NEWCONV - } - else - { if (here->BSIM4mode >= 0) - { Idtot = here->BSIM4cd + here->BSIM4csub - + here->BSIM4Igidl - here->BSIM4cbd; - } - else - { Idtot = here->BSIM4cd + here->BSIM4cbd - here->BSIM4Igidl; /* bugfix */ - } - tol0 = ckt->CKTreltol * MAX(fabs(cdhat), fabs(Idtot)) - + ckt->CKTabstol; - tol1 = ckt->CKTreltol * MAX(fabs(cseshat), fabs(Isestot)) - + ckt->CKTabstol; - tol2 = ckt->CKTreltol * MAX(fabs(cdedhat), fabs(Idedtot)) - + ckt->CKTabstol; - tol3 = ckt->CKTreltol * MAX(fabs(cgshat), fabs(Igstot)) - + ckt->CKTabstol; - tol4 = ckt->CKTreltol * MAX(fabs(cgdhat), fabs(Igdtot)) - + ckt->CKTabstol; - tol5 = ckt->CKTreltol * MAX(fabs(cgbhat), fabs(Igbtot)) - + ckt->CKTabstol; - if ((fabs(cdhat - Idtot) >= tol0) || (fabs(cseshat - Isestot) >= tol1) - || (fabs(cdedhat - Idedtot) >= tol2)) - { ckt->CKTnoncon++; - } - else if ((fabs(cgshat - Igstot) >= tol3) || (fabs(cgdhat - Igdtot) >= tol4) - || (fabs(cgbhat - Igbtot) >= tol5)) - { ckt->CKTnoncon++; - } - else - { Ibtot = here->BSIM4cbs + here->BSIM4cbd - - here->BSIM4Igidl - here->BSIM4Igisl - here->BSIM4csub; - tol6 = ckt->CKTreltol * MAX(fabs(cbhat), fabs(Ibtot)) - + ckt->CKTabstol; - if (fabs(cbhat - Ibtot) > tol6) - { ckt->CKTnoncon++; - } - } -#endif /* NEWCONV */ - } - } - *(ckt->CKTstate0 + here->BSIM4vds) = vds; - *(ckt->CKTstate0 + here->BSIM4vgs) = vgs; - *(ckt->CKTstate0 + here->BSIM4vbs) = vbs; - *(ckt->CKTstate0 + here->BSIM4vbd) = vbd; - *(ckt->CKTstate0 + here->BSIM4vges) = vges; - *(ckt->CKTstate0 + here->BSIM4vgms) = vgms; - *(ckt->CKTstate0 + here->BSIM4vdbs) = vdbs; - *(ckt->CKTstate0 + here->BSIM4vdbd) = vdbd; - *(ckt->CKTstate0 + here->BSIM4vsbs) = vsbs; - *(ckt->CKTstate0 + here->BSIM4vses) = vses; - *(ckt->CKTstate0 + here->BSIM4vdes) = vdes; - *(ckt->CKTstate0 + here->BSIM4qdef) = qdef; - - - if (!ChargeComputationNeeded) - goto line850; - - if (here->BSIM4rgateMod == 3) - { - vgdx = vgmd; - vgsx = vgms; - } - else /* For rgateMod == 0, 1 and 2 */ - { - vgdx = vgd; - vgsx = vgs; - } - if (model->BSIM4capMod == 0) - { - cgdo = pParam->BSIM4cgdo; - qgdo = pParam->BSIM4cgdo * vgdx; - cgso = pParam->BSIM4cgso; - qgso = pParam->BSIM4cgso * vgsx; - } - else /* For both capMod == 1 and 2 */ - { T0 = vgdx + DELTA_1; - T1 = sqrt(T0 * T0 + 4.0 * DELTA_1); - T2 = 0.5 * (T0 - T1); - - T3 = pParam->BSIM4weffCV * pParam->BSIM4cgdl; - T4 = sqrt(1.0 - 4.0 * T2 / pParam->BSIM4ckappad); - cgdo = pParam->BSIM4cgdo + T3 - T3 * (1.0 - 1.0 / T4) - * (0.5 - 0.5 * T0 / T1); - qgdo = (pParam->BSIM4cgdo + T3) * vgdx - T3 * (T2 - + 0.5 * pParam->BSIM4ckappad * (T4 - 1.0)); - - T0 = vgsx + DELTA_1; - T1 = sqrt(T0 * T0 + 4.0 * DELTA_1); - T2 = 0.5 * (T0 - T1); - T3 = pParam->BSIM4weffCV * pParam->BSIM4cgsl; - T4 = sqrt(1.0 - 4.0 * T2 / pParam->BSIM4ckappas); - cgso = pParam->BSIM4cgso + T3 - T3 * (1.0 - 1.0 / T4) - * (0.5 - 0.5 * T0 / T1); - qgso = (pParam->BSIM4cgso + T3) * vgsx - T3 * (T2 - + 0.5 * pParam->BSIM4ckappas * (T4 - 1.0)); - } - - if (here->BSIM4nf != 1.0) - { cgdo *= here->BSIM4nf; - cgso *= here->BSIM4nf; - qgdo *= here->BSIM4nf; - qgso *= here->BSIM4nf; - } - here->BSIM4cgdo = cgdo; - here->BSIM4qgdo = qgdo; - here->BSIM4cgso = cgso; - here->BSIM4qgso = qgso; - -#ifndef NOBYPASS -line755: -#endif - ag0 = ckt->CKTag[0]; - if (here->BSIM4mode > 0) - { if (here->BSIM4trnqsMod == 0) - { qdrn -= qgdo; - if (here->BSIM4rgateMod == 3) - { gcgmgmb = (cgdo + cgso + pParam->BSIM4cgbo) * ag0; - gcgmdb = -cgdo * ag0; - gcgmsb = -cgso * ag0; - gcgmbb = -pParam->BSIM4cgbo * ag0; - - gcdgmb = gcgmdb; - gcsgmb = gcgmsb; - gcbgmb = gcgmbb; - - gcggb = here->BSIM4cggb * ag0; - gcgdb = here->BSIM4cgdb * ag0; - gcgsb = here->BSIM4cgsb * ag0; - gcgbb = -(gcggb + gcgdb + gcgsb); - - gcdgb = here->BSIM4cdgb * ag0; - gcsgb = -(here->BSIM4cggb + here->BSIM4cbgb - + here->BSIM4cdgb) * ag0; - gcbgb = here->BSIM4cbgb * ag0; - - qgmb = pParam->BSIM4cgbo * vgmb; - qgmid = qgdo + qgso + qgmb; - qbulk -= qgmb; - qsrc = -(qgate + qgmid + qbulk + qdrn); - } - else - { gcggb = (here->BSIM4cggb + cgdo + cgso - + pParam->BSIM4cgbo ) * ag0; - gcgdb = (here->BSIM4cgdb - cgdo) * ag0; - gcgsb = (here->BSIM4cgsb - cgso) * ag0; - gcgbb = -(gcggb + gcgdb + gcgsb); - - gcdgb = (here->BSIM4cdgb - cgdo) * ag0; - gcsgb = -(here->BSIM4cggb + here->BSIM4cbgb - + here->BSIM4cdgb + cgso) * ag0; - gcbgb = (here->BSIM4cbgb - pParam->BSIM4cgbo) * ag0; - - gcdgmb = gcsgmb = gcbgmb = 0.0; - - qgb = pParam->BSIM4cgbo * vgb; - qgate += qgdo + qgso + qgb; - qbulk -= qgb; - qsrc = -(qgate + qbulk + qdrn); - } - gcddb = (here->BSIM4cddb + here->BSIM4capbd + cgdo) * ag0; - gcdsb = here->BSIM4cdsb * ag0; - - gcsdb = -(here->BSIM4cgdb + here->BSIM4cbdb - + here->BSIM4cddb) * ag0; - gcssb = (here->BSIM4capbs + cgso - (here->BSIM4cgsb - + here->BSIM4cbsb + here->BSIM4cdsb)) * ag0; - - if (!here->BSIM4rbodyMod) - { gcdbb = -(gcdgb + gcddb + gcdsb + gcdgmb); - gcsbb = -(gcsgb + gcsdb + gcssb + gcsgmb); - gcbdb = (here->BSIM4cbdb - here->BSIM4capbd) * ag0; - gcbsb = (here->BSIM4cbsb - here->BSIM4capbs) * ag0; - gcdbdb = 0.0; gcsbsb = 0.0; - } - else - { gcdbb = -(here->BSIM4cddb + here->BSIM4cdgb - + here->BSIM4cdsb) * ag0; - gcsbb = -(gcsgb + gcsdb + gcssb + gcsgmb) - + here->BSIM4capbs * ag0; - gcbdb = here->BSIM4cbdb * ag0; - gcbsb = here->BSIM4cbsb * ag0; - - gcdbdb = -here->BSIM4capbd * ag0; - gcsbsb = -here->BSIM4capbs * ag0; - } - gcbbb = -(gcbdb + gcbgb + gcbsb + gcbgmb); - - ggtg = ggtd = ggtb = ggts = 0.0; - sxpart = 0.6; - dxpart = 0.4; - ddxpart_dVd = ddxpart_dVg = ddxpart_dVb = ddxpart_dVs = 0.0; - dsxpart_dVd = dsxpart_dVg = dsxpart_dVb = dsxpart_dVs = 0.0; - } - else - { qcheq = here->BSIM4qchqs; - CoxWL = model->BSIM4coxe * pParam->BSIM4weffCV * here->BSIM4nf - * pParam->BSIM4leffCV; - T0 = qdef * ScalingFactor / CoxWL; - - ggtg = here->BSIM4gtg = T0 * here->BSIM4gcrgg; - ggtd = here->BSIM4gtd = T0 * here->BSIM4gcrgd; - ggts = here->BSIM4gts = T0 * here->BSIM4gcrgs; - ggtb = here->BSIM4gtb = T0 * here->BSIM4gcrgb; - gqdef = ScalingFactor * ag0; - - gcqgb = here->BSIM4cqgb * ag0; - gcqdb = here->BSIM4cqdb * ag0; - gcqsb = here->BSIM4cqsb * ag0; - gcqbb = here->BSIM4cqbb * ag0; - - if (fabs(qcheq) <= 1.0e-5 * CoxWL) - { if (model->BSIM4xpart < 0.5) - { dxpart = 0.4; - } - else if (model->BSIM4xpart > 0.5) - { dxpart = 0.0; - } - else - { dxpart = 0.5; - } - ddxpart_dVd = ddxpart_dVg = ddxpart_dVb - = ddxpart_dVs = 0.0; - } - else - { dxpart = qdrn / qcheq; - Cdd = here->BSIM4cddb; - Csd = -(here->BSIM4cgdb + here->BSIM4cddb - + here->BSIM4cbdb); - ddxpart_dVd = (Cdd - dxpart * (Cdd + Csd)) / qcheq; - Cdg = here->BSIM4cdgb; - Csg = -(here->BSIM4cggb + here->BSIM4cdgb - + here->BSIM4cbgb); - ddxpart_dVg = (Cdg - dxpart * (Cdg + Csg)) / qcheq; - - Cds = here->BSIM4cdsb; - Css = -(here->BSIM4cgsb + here->BSIM4cdsb - + here->BSIM4cbsb); - ddxpart_dVs = (Cds - dxpart * (Cds + Css)) / qcheq; - - ddxpart_dVb = -(ddxpart_dVd + ddxpart_dVg + ddxpart_dVs); - } - sxpart = 1.0 - dxpart; - dsxpart_dVd = -ddxpart_dVd; - dsxpart_dVg = -ddxpart_dVg; - dsxpart_dVs = -ddxpart_dVs; - dsxpart_dVb = -(dsxpart_dVd + dsxpart_dVg + dsxpart_dVs); - - if (here->BSIM4rgateMod == 3) - { gcgmgmb = (cgdo + cgso + pParam->BSIM4cgbo) * ag0; - gcgmdb = -cgdo * ag0; - gcgmsb = -cgso * ag0; - gcgmbb = -pParam->BSIM4cgbo * ag0; - - gcdgmb = gcgmdb; - gcsgmb = gcgmsb; - gcbgmb = gcgmbb; - - gcdgb = gcsgb = gcbgb = 0.0; - gcggb = gcgdb = gcgsb = gcgbb = 0.0; - - qgmb = pParam->BSIM4cgbo * vgmb; - qgmid = qgdo + qgso + qgmb; - qgate = 0.0; - qbulk = -qgmb; - qdrn = -qgdo; - qsrc = -(qgmid + qbulk + qdrn); - } - else - { gcggb = (cgdo + cgso + pParam->BSIM4cgbo ) * ag0; - gcgdb = -cgdo * ag0; - gcgsb = -cgso * ag0; - gcgbb = -pParam->BSIM4cgbo * ag0; - - gcdgb = gcgdb; - gcsgb = gcgsb; - gcbgb = gcgbb; - gcdgmb = gcsgmb = gcbgmb = 0.0; - - qgb = pParam->BSIM4cgbo * vgb; - qgate = qgdo + qgso + qgb; - qbulk = -qgb; - qdrn = -qgdo; - qsrc = -(qgate + qbulk + qdrn); - } - - gcddb = (here->BSIM4capbd + cgdo) * ag0; - gcdsb = gcsdb = 0.0; - gcssb = (here->BSIM4capbs + cgso) * ag0; - - if (!here->BSIM4rbodyMod) - { gcdbb = -(gcdgb + gcddb + gcdgmb); - gcsbb = -(gcsgb + gcssb + gcsgmb); - gcbdb = -here->BSIM4capbd * ag0; - gcbsb = -here->BSIM4capbs * ag0; - gcdbdb = 0.0; gcsbsb = 0.0; - } - else - { gcdbb = gcsbb = gcbdb = gcbsb = 0.0; - gcdbdb = -here->BSIM4capbd * ag0; - gcsbsb = -here->BSIM4capbs * ag0; - } - gcbbb = -(gcbdb + gcbgb + gcbsb + gcbgmb); - } - } - else - { if (here->BSIM4trnqsMod == 0) - { qsrc = qdrn - qgso; - if (here->BSIM4rgateMod == 3) - { gcgmgmb = (cgdo + cgso + pParam->BSIM4cgbo) * ag0; - gcgmdb = -cgdo * ag0; - gcgmsb = -cgso * ag0; - gcgmbb = -pParam->BSIM4cgbo * ag0; - - gcdgmb = gcgmdb; - gcsgmb = gcgmsb; - gcbgmb = gcgmbb; - - gcggb = here->BSIM4cggb * ag0; - gcgdb = here->BSIM4cgsb * ag0; - gcgsb = here->BSIM4cgdb * ag0; - gcgbb = -(gcggb + gcgdb + gcgsb); - - gcdgb = -(here->BSIM4cggb + here->BSIM4cbgb - + here->BSIM4cdgb) * ag0; - gcsgb = here->BSIM4cdgb * ag0; - gcbgb = here->BSIM4cbgb * ag0; - - qgmb = pParam->BSIM4cgbo * vgmb; - qgmid = qgdo + qgso + qgmb; - qbulk -= qgmb; - qdrn = -(qgate + qgmid + qbulk + qsrc); - } - else - { gcggb = (here->BSIM4cggb + cgdo + cgso - + pParam->BSIM4cgbo ) * ag0; - gcgdb = (here->BSIM4cgsb - cgdo) * ag0; - gcgsb = (here->BSIM4cgdb - cgso) * ag0; - gcgbb = -(gcggb + gcgdb + gcgsb); - - gcdgb = -(here->BSIM4cggb + here->BSIM4cbgb - + here->BSIM4cdgb + cgdo) * ag0; - gcsgb = (here->BSIM4cdgb - cgso) * ag0; - gcbgb = (here->BSIM4cbgb - pParam->BSIM4cgbo) * ag0; - - gcdgmb = gcsgmb = gcbgmb = 0.0; - - qgb = pParam->BSIM4cgbo * vgb; - qgate += qgdo + qgso + qgb; - qbulk -= qgb; - qdrn = -(qgate + qbulk + qsrc); - } - gcddb = (here->BSIM4capbd + cgdo - (here->BSIM4cgsb - + here->BSIM4cbsb + here->BSIM4cdsb)) * ag0; - gcdsb = -(here->BSIM4cgdb + here->BSIM4cbdb - + here->BSIM4cddb) * ag0; - - gcsdb = here->BSIM4cdsb * ag0; - gcssb = (here->BSIM4cddb + here->BSIM4capbs + cgso) * ag0; - - if (!here->BSIM4rbodyMod) - { gcdbb = -(gcdgb + gcddb + gcdsb + gcdgmb); - gcsbb = -(gcsgb + gcsdb + gcssb + gcsgmb); - gcbdb = (here->BSIM4cbsb - here->BSIM4capbd) * ag0; - gcbsb = (here->BSIM4cbdb - here->BSIM4capbs) * ag0; - gcdbdb = 0.0; gcsbsb = 0.0; - } - else - { gcdbb = -(gcdgb + gcddb + gcdsb + gcdgmb) - + here->BSIM4capbd * ag0; - gcsbb = -(here->BSIM4cddb + here->BSIM4cdgb - + here->BSIM4cdsb) * ag0; - gcbdb = here->BSIM4cbsb * ag0; - gcbsb = here->BSIM4cbdb * ag0; - gcdbdb = -here->BSIM4capbd * ag0; - gcsbsb = -here->BSIM4capbs * ag0; - } - gcbbb = -(gcbgb + gcbdb + gcbsb + gcbgmb); - - ggtg = ggtd = ggtb = ggts = 0.0; - sxpart = 0.4; - dxpart = 0.6; - ddxpart_dVd = ddxpart_dVg = ddxpart_dVb = ddxpart_dVs = 0.0; - dsxpart_dVd = dsxpart_dVg = dsxpart_dVb = dsxpart_dVs = 0.0; - } - else - { qcheq = here->BSIM4qchqs; - CoxWL = model->BSIM4coxe * pParam->BSIM4weffCV * here->BSIM4nf - * pParam->BSIM4leffCV; - T0 = qdef * ScalingFactor / CoxWL; - ggtg = here->BSIM4gtg = T0 * here->BSIM4gcrgg; - ggts = here->BSIM4gts = T0 * here->BSIM4gcrgd; - ggtd = here->BSIM4gtd = T0 * here->BSIM4gcrgs; - ggtb = here->BSIM4gtb = T0 * here->BSIM4gcrgb; - gqdef = ScalingFactor * ag0; - - gcqgb = here->BSIM4cqgb * ag0; - gcqdb = here->BSIM4cqsb * ag0; - gcqsb = here->BSIM4cqdb * ag0; - gcqbb = here->BSIM4cqbb * ag0; - - if (fabs(qcheq) <= 1.0e-5 * CoxWL) - { if (model->BSIM4xpart < 0.5) - { sxpart = 0.4; - } - else if (model->BSIM4xpart > 0.5) - { sxpart = 0.0; - } - else - { sxpart = 0.5; - } - dsxpart_dVd = dsxpart_dVg = dsxpart_dVb - = dsxpart_dVs = 0.0; - } - else - { sxpart = qdrn / qcheq; - Css = here->BSIM4cddb; - Cds = -(here->BSIM4cgdb + here->BSIM4cddb - + here->BSIM4cbdb); - dsxpart_dVs = (Css - sxpart * (Css + Cds)) / qcheq; - Csg = here->BSIM4cdgb; - Cdg = -(here->BSIM4cggb + here->BSIM4cdgb - + here->BSIM4cbgb); - dsxpart_dVg = (Csg - sxpart * (Csg + Cdg)) / qcheq; - - Csd = here->BSIM4cdsb; - Cdd = -(here->BSIM4cgsb + here->BSIM4cdsb - + here->BSIM4cbsb); - dsxpart_dVd = (Csd - sxpart * (Csd + Cdd)) / qcheq; - - dsxpart_dVb = -(dsxpart_dVd + dsxpart_dVg + dsxpart_dVs); - } - dxpart = 1.0 - sxpart; - ddxpart_dVd = -dsxpart_dVd; - ddxpart_dVg = -dsxpart_dVg; - ddxpart_dVs = -dsxpart_dVs; - ddxpart_dVb = -(ddxpart_dVd + ddxpart_dVg + ddxpart_dVs); - - if (here->BSIM4rgateMod == 3) - { gcgmgmb = (cgdo + cgso + pParam->BSIM4cgbo) * ag0; - gcgmdb = -cgdo * ag0; - gcgmsb = -cgso * ag0; - gcgmbb = -pParam->BSIM4cgbo * ag0; - - gcdgmb = gcgmdb; - gcsgmb = gcgmsb; - gcbgmb = gcgmbb; - - gcdgb = gcsgb = gcbgb = 0.0; - gcggb = gcgdb = gcgsb = gcgbb = 0.0; - - qgmb = pParam->BSIM4cgbo * vgmb; - qgmid = qgdo + qgso + qgmb; - qgate = 0.0; - qbulk = -qgmb; - qdrn = -qgdo; - qsrc = -qgso; - } - else - { gcggb = (cgdo + cgso + pParam->BSIM4cgbo ) * ag0; - gcgdb = -cgdo * ag0; - gcgsb = -cgso * ag0; - gcgbb = -pParam->BSIM4cgbo * ag0; - - gcdgb = gcgdb; - gcsgb = gcgsb; - gcbgb = gcgbb; - gcdgmb = gcsgmb = gcbgmb = 0.0; - - qgb = pParam->BSIM4cgbo * vgb; - qgate = qgdo + qgso + qgb; - qbulk = -qgb; - qdrn = -qgdo; - qsrc = -qgso; - } - - gcddb = (here->BSIM4capbd + cgdo) * ag0; - gcdsb = gcsdb = 0.0; - gcssb = (here->BSIM4capbs + cgso) * ag0; - if (!here->BSIM4rbodyMod) - { gcdbb = -(gcdgb + gcddb + gcdgmb); - gcsbb = -(gcsgb + gcssb + gcsgmb); - gcbdb = -here->BSIM4capbd * ag0; - gcbsb = -here->BSIM4capbs * ag0; - gcdbdb = 0.0; gcsbsb = 0.0; - } - else - { gcdbb = gcsbb = gcbdb = gcbsb = 0.0; - gcdbdb = -here->BSIM4capbd * ag0; - gcsbsb = -here->BSIM4capbs * ag0; - } - gcbbb = -(gcbdb + gcbgb + gcbsb + gcbgmb); - } - } - - - if (here->BSIM4trnqsMod) - { *(ckt->CKTstate0 + here->BSIM4qcdump) = qdef * ScalingFactor; - if (ckt->CKTmode & MODEINITTRAN) - *(ckt->CKTstate1 + here->BSIM4qcdump) = - *(ckt->CKTstate0 + here->BSIM4qcdump); - error = NIintegrate(ckt, &geq, &ceq, 0.0, here->BSIM4qcdump); - if (error) - return(error); - } - - if (ByPass) goto line860; - - *(ckt->CKTstate0 + here->BSIM4qg) = qgate; - *(ckt->CKTstate0 + here->BSIM4qd) = qdrn - - *(ckt->CKTstate0 + here->BSIM4qbd); - *(ckt->CKTstate0 + here->BSIM4qs) = qsrc - - *(ckt->CKTstate0 + here->BSIM4qbs); - if (here->BSIM4rgateMod == 3) - *(ckt->CKTstate0 + here->BSIM4qgmid) = qgmid; - - if (!here->BSIM4rbodyMod) - { *(ckt->CKTstate0 + here->BSIM4qb) = qbulk - + *(ckt->CKTstate0 + here->BSIM4qbd) - + *(ckt->CKTstate0 + here->BSIM4qbs); - } - else - *(ckt->CKTstate0 + here->BSIM4qb) = qbulk; - - - /* Store small signal parameters */ - if (ckt->CKTmode & MODEINITSMSIG) - { goto line1000; - } - - if (!ChargeComputationNeeded) - goto line850; - - /* no integration, if dc sweep, but keep evaluating capacitances */ - if (ckt->CKTmode & MODEDCTRANCURVE) - goto line850; - - if (ckt->CKTmode & MODEINITTRAN) - { *(ckt->CKTstate1 + here->BSIM4qb) = - *(ckt->CKTstate0 + here->BSIM4qb); - *(ckt->CKTstate1 + here->BSIM4qg) = - *(ckt->CKTstate0 + here->BSIM4qg); - *(ckt->CKTstate1 + here->BSIM4qd) = - *(ckt->CKTstate0 + here->BSIM4qd); - if (here->BSIM4rgateMod == 3) - *(ckt->CKTstate1 + here->BSIM4qgmid) = - *(ckt->CKTstate0 + here->BSIM4qgmid); - if (here->BSIM4rbodyMod) - { *(ckt->CKTstate1 + here->BSIM4qbs) = - *(ckt->CKTstate0 + here->BSIM4qbs); - *(ckt->CKTstate1 + here->BSIM4qbd) = - *(ckt->CKTstate0 + here->BSIM4qbd); - } - } - - error = NIintegrate(ckt, &geq, &ceq, 0.0, here->BSIM4qb); - if (error) - return(error); - error = NIintegrate(ckt, &geq, &ceq, 0.0, here->BSIM4qg); - if (error) - return(error); - error = NIintegrate(ckt, &geq, &ceq, 0.0, here->BSIM4qd); - if (error) - return(error); - - if (here->BSIM4rgateMod == 3) - { error = NIintegrate(ckt, &geq, &ceq, 0.0, here->BSIM4qgmid); - if (error) return(error); - } - - if (here->BSIM4rbodyMod) - { error = NIintegrate(ckt, &geq, &ceq, 0.0, here->BSIM4qbs); - if (error) - return(error); - error = NIintegrate(ckt, &geq, &ceq, 0.0, here->BSIM4qbd); - if (error) - return(error); - } - - goto line860; - - -line850: - /* Zero gcap and ceqcap if (!ChargeComputationNeeded) */ - ceqqg = ceqqb = ceqqd = 0.0; - ceqqjd = ceqqjs = 0.0; - cqcheq = cqdef = 0.0; - - gcdgb = gcddb = gcdsb = gcdbb = 0.0; - gcsgb = gcsdb = gcssb = gcsbb = 0.0; - gcggb = gcgdb = gcgsb = gcgbb = 0.0; - gcbdb = gcbgb = gcbsb = gcbbb = 0.0; - - gcgmgmb = gcgmdb = gcgmsb = gcgmbb = 0.0; - gcdgmb = gcsgmb = gcbgmb = ceqqgmid = 0.0; - gcdbdb = gcsbsb = 0.0; - - gqdef = gcqgb = gcqdb = gcqsb = gcqbb = 0.0; - ggtg = ggtd = ggtb = ggts = 0.0; - sxpart = (1.0 - (dxpart = (here->BSIM4mode > 0) ? 0.4 : 0.6)); - ddxpart_dVd = ddxpart_dVg = ddxpart_dVb = ddxpart_dVs = 0.0; - dsxpart_dVd = dsxpart_dVg = dsxpart_dVb = dsxpart_dVs = 0.0; - - if (here->BSIM4trnqsMod) - { CoxWL = model->BSIM4coxe * pParam->BSIM4weffCV * here->BSIM4nf - * pParam->BSIM4leffCV; - T1 = here->BSIM4gcrg / CoxWL; - here->BSIM4gtau = T1 * ScalingFactor; - } - else - here->BSIM4gtau = 0.0; - - goto line900; - - -line860: - /* Calculate equivalent charge current */ - - cqgate = *(ckt->CKTstate0 + here->BSIM4cqg); - cqbody = *(ckt->CKTstate0 + here->BSIM4cqb); - cqdrn = *(ckt->CKTstate0 + here->BSIM4cqd); - - ceqqg = cqgate - gcggb * vgb + gcgdb * vbd + gcgsb * vbs; - ceqqd = cqdrn - gcdgb * vgb - gcdgmb * vgmb + (gcddb + gcdbdb) - * vbd - gcdbdb * vbd_jct + gcdsb * vbs; - ceqqb = cqbody - gcbgb * vgb - gcbgmb * vgmb - + gcbdb * vbd + gcbsb * vbs; - - - if (here->BSIM4rgateMod == 3) - ceqqgmid = *(ckt->CKTstate0 + here->BSIM4cqgmid) - + gcgmdb * vbd + gcgmsb * vbs - gcgmgmb * vgmb; - else - ceqqgmid = 0.0; - - if (here->BSIM4rbodyMod) - { ceqqjs = *(ckt->CKTstate0 + here->BSIM4cqbs) + gcsbsb * vbs_jct; - ceqqjd = *(ckt->CKTstate0 + here->BSIM4cqbd) + gcdbdb * vbd_jct; - } - - if (here->BSIM4trnqsMod) - { T0 = ggtg * vgb - ggtd * vbd - ggts * vbs; - ceqqg += T0; - T1 = qdef * here->BSIM4gtau; - ceqqd -= dxpart * T0 + T1 * (ddxpart_dVg * vgb - ddxpart_dVd - * vbd - ddxpart_dVs * vbs); - cqdef = *(ckt->CKTstate0 + here->BSIM4cqcdump) - gqdef * qdef; - cqcheq = *(ckt->CKTstate0 + here->BSIM4cqcheq) - - (gcqgb * vgb - gcqdb * vbd - gcqsb * vbs) + T0; - } - - if (ckt->CKTmode & MODEINITTRAN) - { *(ckt->CKTstate1 + here->BSIM4cqb) = - *(ckt->CKTstate0 + here->BSIM4cqb); - *(ckt->CKTstate1 + here->BSIM4cqg) = - *(ckt->CKTstate0 + here->BSIM4cqg); - *(ckt->CKTstate1 + here->BSIM4cqd) = - *(ckt->CKTstate0 + here->BSIM4cqd); - - if (here->BSIM4rgateMod == 3) - *(ckt->CKTstate1 + here->BSIM4cqgmid) = - *(ckt->CKTstate0 + here->BSIM4cqgmid); - - if (here->BSIM4rbodyMod) - { *(ckt->CKTstate1 + here->BSIM4cqbs) = - *(ckt->CKTstate0 + here->BSIM4cqbs); - *(ckt->CKTstate1 + here->BSIM4cqbd) = - *(ckt->CKTstate0 + here->BSIM4cqbd); - } - } - - - /* - * Load current vector - */ - -line900: - if (here->BSIM4mode >= 0) - { Gm = here->BSIM4gm; - Gmbs = here->BSIM4gmbs; - FwdSum = Gm + Gmbs; - RevSum = 0.0; - - ceqdrn = model->BSIM4type * (cdrain - here->BSIM4gds * vds - - Gm * vgs - Gmbs * vbs); - ceqbd = model->BSIM4type * (here->BSIM4csub + here->BSIM4Igidl - - (here->BSIM4gbds + here->BSIM4ggidld) * vds - - (here->BSIM4gbgs + here->BSIM4ggidlg) * vgs - - (here->BSIM4gbbs + here->BSIM4ggidlb) * vbs); - ceqbs = model->BSIM4type * (here->BSIM4Igisl + here->BSIM4ggisls * vds - - here->BSIM4ggislg * vgd - here->BSIM4ggislb * vbd); - - gbbdp = -(here->BSIM4gbds); - gbbsp = here->BSIM4gbds + here->BSIM4gbgs + here->BSIM4gbbs; - - gbdpg = here->BSIM4gbgs; - gbdpdp = here->BSIM4gbds; - gbdpb = here->BSIM4gbbs; - gbdpsp = -(gbdpg + gbdpdp + gbdpb); - - gbspg = 0.0; - gbspdp = 0.0; - gbspb = 0.0; - gbspsp = 0.0; - - if (model->BSIM4igcMod) - { gIstotg = here->BSIM4gIgsg + here->BSIM4gIgcsg; - gIstotd = here->BSIM4gIgcsd; - gIstots = here->BSIM4gIgss + here->BSIM4gIgcss; - gIstotb = here->BSIM4gIgcsb; - Istoteq = model->BSIM4type * (here->BSIM4Igs + here->BSIM4Igcs - - gIstotg * vgs - here->BSIM4gIgcsd * vds - - here->BSIM4gIgcsb * vbs); - - gIdtotg = here->BSIM4gIgdg + here->BSIM4gIgcdg; - gIdtotd = here->BSIM4gIgdd + here->BSIM4gIgcdd; - gIdtots = here->BSIM4gIgcds; - gIdtotb = here->BSIM4gIgcdb; - Idtoteq = model->BSIM4type * (here->BSIM4Igd + here->BSIM4Igcd - - here->BSIM4gIgdg * vgd - here->BSIM4gIgcdg * vgs - - here->BSIM4gIgcdd * vds - here->BSIM4gIgcdb * vbs); - } - else - { gIstotg = gIstotd = gIstots = gIstotb = Istoteq = 0.0; - gIdtotg = gIdtotd = gIdtots = gIdtotb = Idtoteq = 0.0; - } - - if (model->BSIM4igbMod) - { gIbtotg = here->BSIM4gIgbg; - gIbtotd = here->BSIM4gIgbd; - gIbtots = here->BSIM4gIgbs; - gIbtotb = here->BSIM4gIgbb; - Ibtoteq = model->BSIM4type * (here->BSIM4Igb - - here->BSIM4gIgbg * vgs - here->BSIM4gIgbd * vds - - here->BSIM4gIgbb * vbs); - } - else - gIbtotg = gIbtotd = gIbtots = gIbtotb = Ibtoteq = 0.0; - - if ((model->BSIM4igcMod != 0) || (model->BSIM4igbMod != 0)) - { gIgtotg = gIstotg + gIdtotg + gIbtotg; - gIgtotd = gIstotd + gIdtotd + gIbtotd ; - gIgtots = gIstots + gIdtots + gIbtots; - gIgtotb = gIstotb + gIdtotb + gIbtotb; - Igtoteq = Istoteq + Idtoteq + Ibtoteq; - } - else - gIgtotg = gIgtotd = gIgtots = gIgtotb = Igtoteq = 0.0; - - - if (here->BSIM4rgateMod == 2) - T0 = vges - vgs; - else if (here->BSIM4rgateMod == 3) - T0 = vgms - vgs; - if (here->BSIM4rgateMod > 1) - { gcrgd = here->BSIM4gcrgd * T0; - gcrgg = here->BSIM4gcrgg * T0; - gcrgs = here->BSIM4gcrgs * T0; - gcrgb = here->BSIM4gcrgb * T0; - ceqgcrg = -(gcrgd * vds + gcrgg * vgs - + gcrgb * vbs); - gcrgg -= here->BSIM4gcrg; - gcrg = here->BSIM4gcrg; - } - else - ceqgcrg = gcrg = gcrgd = gcrgg = gcrgs = gcrgb = 0.0; - } - else - { Gm = -here->BSIM4gm; - Gmbs = -here->BSIM4gmbs; - FwdSum = 0.0; - RevSum = -(Gm + Gmbs); - - ceqdrn = -model->BSIM4type * (cdrain + here->BSIM4gds * vds - + Gm * vgd + Gmbs * vbd); - - ceqbs = model->BSIM4type * (here->BSIM4csub + here->BSIM4Igisl - + (here->BSIM4gbds + here->BSIM4ggisls) * vds - - (here->BSIM4gbgs + here->BSIM4ggislg) * vgd - - (here->BSIM4gbbs + here->BSIM4ggislb) * vbd); - ceqbd = model->BSIM4type * (here->BSIM4Igidl - here->BSIM4ggidld * vds - - here->BSIM4ggidlg * vgs - here->BSIM4ggidlb * vbs); - - gbbsp = -(here->BSIM4gbds); - gbbdp = here->BSIM4gbds + here->BSIM4gbgs + here->BSIM4gbbs; - - gbdpg = 0.0; - gbdpsp = 0.0; - gbdpb = 0.0; - gbdpdp = 0.0; - - gbspg = here->BSIM4gbgs; - gbspsp = here->BSIM4gbds; - gbspb = here->BSIM4gbbs; - gbspdp = -(gbspg + gbspsp + gbspb); - - if (model->BSIM4igcMod) - { gIstotg = here->BSIM4gIgsg + here->BSIM4gIgcdg; - gIstotd = here->BSIM4gIgcds; - gIstots = here->BSIM4gIgss + here->BSIM4gIgcdd; - gIstotb = here->BSIM4gIgcdb; - Istoteq = model->BSIM4type * (here->BSIM4Igs + here->BSIM4Igcd - - here->BSIM4gIgsg * vgs - here->BSIM4gIgcdg * vgd - + here->BSIM4gIgcdd * vds - here->BSIM4gIgcdb * vbd); - - gIdtotg = here->BSIM4gIgdg + here->BSIM4gIgcsg; - gIdtotd = here->BSIM4gIgdd + here->BSIM4gIgcss; - gIdtots = here->BSIM4gIgcsd; - gIdtotb = here->BSIM4gIgcsb; - Idtoteq = model->BSIM4type * (here->BSIM4Igd + here->BSIM4Igcs - - (here->BSIM4gIgdg + here->BSIM4gIgcsg) * vgd - + here->BSIM4gIgcsd * vds - here->BSIM4gIgcsb * vbd); - } - else - { gIstotg = gIstotd = gIstots = gIstotb = Istoteq = 0.0; - gIdtotg = gIdtotd = gIdtots = gIdtotb = Idtoteq = 0.0; - } - - if (model->BSIM4igbMod) - { gIbtotg = here->BSIM4gIgbg; - gIbtotd = here->BSIM4gIgbs; - gIbtots = here->BSIM4gIgbd; - gIbtotb = here->BSIM4gIgbb; - Ibtoteq = model->BSIM4type * (here->BSIM4Igb - - here->BSIM4gIgbg * vgd + here->BSIM4gIgbd * vds - - here->BSIM4gIgbb * vbd); - } - else - gIbtotg = gIbtotd = gIbtots = gIbtotb = Ibtoteq = 0.0; - - if ((model->BSIM4igcMod != 0) || (model->BSIM4igbMod != 0)) - { gIgtotg = gIstotg + gIdtotg + gIbtotg; - gIgtotd = gIstotd + gIdtotd + gIbtotd ; - gIgtots = gIstots + gIdtots + gIbtots; - gIgtotb = gIstotb + gIdtotb + gIbtotb; - Igtoteq = Istoteq + Idtoteq + Ibtoteq; - } - else - gIgtotg = gIgtotd = gIgtots = gIgtotb = Igtoteq = 0.0; - - - if (here->BSIM4rgateMod == 2) - T0 = vges - vgs; - else if (here->BSIM4rgateMod == 3) - T0 = vgms - vgs; - if (here->BSIM4rgateMod > 1) - { gcrgd = here->BSIM4gcrgs * T0; - gcrgg = here->BSIM4gcrgg * T0; - gcrgs = here->BSIM4gcrgd * T0; - gcrgb = here->BSIM4gcrgb * T0; - ceqgcrg = -(gcrgg * vgd - gcrgs * vds - + gcrgb * vbd); - gcrgg -= here->BSIM4gcrg; - gcrg = here->BSIM4gcrg; - } - else - ceqgcrg = gcrg = gcrgd = gcrgg = gcrgs = gcrgb = 0.0; - } - - if (model->BSIM4rdsMod == 1) - { ceqgstot = model->BSIM4type * (here->BSIM4gstotd * vds - + here->BSIM4gstotg * vgs + here->BSIM4gstotb * vbs); - /* WDLiu: ceqgstot flowing away from sNodePrime */ - gstot = here->BSIM4gstot; - gstotd = here->BSIM4gstotd; - gstotg = here->BSIM4gstotg; - gstots = here->BSIM4gstots - gstot; - gstotb = here->BSIM4gstotb; - - ceqgdtot = -model->BSIM4type * (here->BSIM4gdtotd * vds - + here->BSIM4gdtotg * vgs + here->BSIM4gdtotb * vbs); - /* WDLiu: ceqgdtot defined as flowing into dNodePrime */ - gdtot = here->BSIM4gdtot; - gdtotd = here->BSIM4gdtotd - gdtot; - gdtotg = here->BSIM4gdtotg; - gdtots = here->BSIM4gdtots; - gdtotb = here->BSIM4gdtotb; - } - else - { gstot = gstotd = gstotg = gstots = gstotb = ceqgstot = 0.0; - gdtot = gdtotd = gdtotg = gdtots = gdtotb = ceqgdtot = 0.0; - } - - if (model->BSIM4type > 0) - { ceqjs = (here->BSIM4cbs - here->BSIM4gbs * vbs_jct); - ceqjd = (here->BSIM4cbd - here->BSIM4gbd * vbd_jct); - } - else - { ceqjs = -(here->BSIM4cbs - here->BSIM4gbs * vbs_jct); - ceqjd = -(here->BSIM4cbd - here->BSIM4gbd * vbd_jct); - ceqqg = -ceqqg; - ceqqd = -ceqqd; - ceqqb = -ceqqb; - ceqgcrg = -ceqgcrg; - - if (here->BSIM4trnqsMod) - { cqdef = -cqdef; - cqcheq = -cqcheq; - } - - if (here->BSIM4rbodyMod) - { ceqqjs = -ceqqjs; - ceqqjd = -ceqqjd; - } - - if (here->BSIM4rgateMod == 3) - ceqqgmid = -ceqqgmid; - } - - - /* - * Loading RHS - */ - - m = here->BSIM4m; - -#ifdef USE_OMP - here->BSIM4rhsdPrime = m * (ceqjd - ceqbd + ceqgdtot - - ceqdrn - ceqqd + Idtoteq); - here->BSIM4rhsgPrime = m * (ceqqg - ceqgcrg + Igtoteq); - - if (here->BSIM4rgateMod == 2) - here->BSIM4rhsgExt = m * ceqgcrg; - else if (here->BSIM4rgateMod == 3) - here->BSIM4grhsMid = m * (ceqqgmid + ceqgcrg); - - if (!here->BSIM4rbodyMod) - { here->BSIM4rhsbPrime = m * (ceqbd + ceqbs - ceqjd - - ceqjs - ceqqb + Ibtoteq); - here->BSIM4rhssPrime = m * (ceqdrn - ceqbs + ceqjs - + ceqqg + ceqqb + ceqqd + ceqqgmid - ceqgstot + Istoteq); - } - else - { here->BSIM4rhsdb = m * (ceqjd + ceqqjd); - here->BSIM4rhsbPrime = m * (ceqbd + ceqbs - ceqqb + Ibtoteq); - here->BSIM4rhssb = m * (ceqjs + ceqqjs); - here->BSIM4rhssPrime = m * (ceqdrn - ceqbs + ceqjs + ceqqd - + ceqqg + ceqqb + ceqqjd + ceqqjs + ceqqgmid - ceqgstot + Istoteq); - } - - if (model->BSIM4rdsMod) - { here->BSIM4rhsd = m * ceqgdtot; - here->BSIM4rhss = m * ceqgstot; - } - - if (here->BSIM4trnqsMod) - here->BSIM4rhsq = m * (cqcheq - cqdef); -#else - (*(ckt->CKTrhs + here->BSIM4dNodePrime) += m * (ceqjd - ceqbd + ceqgdtot - - ceqdrn - ceqqd + Idtoteq)); - (*(ckt->CKTrhs + here->BSIM4gNodePrime) -= m * (ceqqg - ceqgcrg + Igtoteq)); - - if (here->BSIM4rgateMod == 2) - (*(ckt->CKTrhs + here->BSIM4gNodeExt) -= m * ceqgcrg); - else if (here->BSIM4rgateMod == 3) - (*(ckt->CKTrhs + here->BSIM4gNodeMid) -= m * (ceqqgmid + ceqgcrg)); - - if (!here->BSIM4rbodyMod) - { (*(ckt->CKTrhs + here->BSIM4bNodePrime) += m * (ceqbd + ceqbs - ceqjd - - ceqjs - ceqqb + Ibtoteq)); - (*(ckt->CKTrhs + here->BSIM4sNodePrime) += m * (ceqdrn - ceqbs + ceqjs - + ceqqg + ceqqb + ceqqd + ceqqgmid - ceqgstot + Istoteq)); - } - - else - { (*(ckt->CKTrhs + here->BSIM4dbNode) -= m * (ceqjd + ceqqjd)); - (*(ckt->CKTrhs + here->BSIM4bNodePrime) += m * (ceqbd + ceqbs - ceqqb + Ibtoteq)); - (*(ckt->CKTrhs + here->BSIM4sbNode) -= m * (ceqjs + ceqqjs)); - (*(ckt->CKTrhs + here->BSIM4sNodePrime) += m * (ceqdrn - ceqbs + ceqjs + ceqqd - + ceqqg + ceqqb + ceqqjd + ceqqjs + ceqqgmid - ceqgstot + Istoteq)); - } - - if (model->BSIM4rdsMod) - { (*(ckt->CKTrhs + here->BSIM4dNode) -= m * ceqgdtot); - (*(ckt->CKTrhs + here->BSIM4sNode) += m * ceqgstot); - } - - if (here->BSIM4trnqsMod) - *(ckt->CKTrhs + here->BSIM4qNode) += m * (cqcheq - cqdef); -#endif - - /* - * Loading matrix - */ - - if (!here->BSIM4rbodyMod) - { gjbd = here->BSIM4gbd; - gjbs = here->BSIM4gbs; - } - else - gjbd = gjbs = 0.0; - - if (!model->BSIM4rdsMod) - { gdpr = here->BSIM4drainConductance; - gspr = here->BSIM4sourceConductance; - } - else - gdpr = gspr = 0.0; - - geltd = here->BSIM4grgeltd; - - T1 = qdef * here->BSIM4gtau; -#ifdef USE_OMP - if (here->BSIM4rgateMod == 1) - { here->BSIM4_1 = m * geltd; - here->BSIM4_2 = m * geltd; - here->BSIM4_3 = m * geltd; - here->BSIM4_4 = m * (gcggb + geltd - ggtg + gIgtotg); - here->BSIM4_5 = m * (gcgdb - ggtd + gIgtotd); - here->BSIM4_6 = m * (gcgsb - ggts + gIgtots); - here->BSIM4_7 = m * (gcgbb - ggtb + gIgtotb); - } /* WDLiu: gcrg already subtracted from all gcrgg below */ - else if (here->BSIM4rgateMod == 2) - { here->BSIM4_8 = m * gcrg; - here->BSIM4_9 = m * gcrgg; - here->BSIM4_10 = m * gcrgd; - here->BSIM4_11 = m * gcrgs; - here->BSIM4_12 = m * gcrgb; - - here->BSIM4_13 = m * gcrg; - here->BSIM4_14 = m * (gcggb - gcrgg - ggtg + gIgtotg); - here->BSIM4_15 = m * (gcgdb - gcrgd - ggtd + gIgtotd); - here->BSIM4_16 = m * (gcgsb - gcrgs - ggts + gIgtots); - here->BSIM4_17 = m * (gcgbb - gcrgb - ggtb + gIgtotb); - } - else if (here->BSIM4rgateMod == 3) - { here->BSIM4_18 = m * geltd; - here->BSIM4_19 = m * geltd; - here->BSIM4_20 = m * geltd; - here->BSIM4_21 = m * (geltd + gcrg + gcgmgmb); - - here->BSIM4_22 = m * (gcrgd + gcgmdb); - here->BSIM4_23 = m * gcrgg; - here->BSIM4_24 = m * (gcrgs + gcgmsb); - here->BSIM4_25 = m * (gcrgb + gcgmbb); - - here->BSIM4_26 = m * gcdgmb; - here->BSIM4_27 = m * gcrg; - here->BSIM4_28 = m * gcsgmb; - here->BSIM4_29 = m * gcbgmb; - - here->BSIM4_30 = m * (gcggb - gcrgg - ggtg + gIgtotg); - here->BSIM4_31 = m * (gcgdb - gcrgd - ggtd + gIgtotd); - here->BSIM4_32 = m * (gcgsb - gcrgs - ggts + gIgtots); - here->BSIM4_33 = m * (gcgbb - gcrgb - ggtb + gIgtotb); - } - else - { here->BSIM4_34 = m * (gcggb - ggtg + gIgtotg); - here->BSIM4_35 = m * (gcgdb - ggtd + gIgtotd); - here->BSIM4_36 = m * (gcgsb - ggts + gIgtots); - here->BSIM4_37 = m * (gcgbb - ggtb + gIgtotb); - } - - if (model->BSIM4rdsMod) - { here->BSIM4_38 = m * gdtotg; - here->BSIM4_39 = m * gdtots; - here->BSIM4_40 = m * gdtotb; - here->BSIM4_41 = m * gstotd; - here->BSIM4_42 = m * gstotg; - here->BSIM4_43 = m * gstotb; - } - - here->BSIM4_44 = m * (gdpr + here->BSIM4gds + here->BSIM4gbd + T1 * ddxpart_dVd - - gdtotd + RevSum + gcddb + gbdpdp + dxpart * ggtd - gIdtotd); - here->BSIM4_45 = m * (gdpr + gdtot); - here->BSIM4_46 = m * (Gm + gcdgb - gdtotg + gbdpg - gIdtotg - + dxpart * ggtg + T1 * ddxpart_dVg); - here->BSIM4_47 = m * (here->BSIM4gds + gdtots - dxpart * ggts + gIdtots - - T1 * ddxpart_dVs + FwdSum - gcdsb - gbdpsp); - here->BSIM4_48 = m * (gjbd + gdtotb - Gmbs - gcdbb - gbdpb + gIdtotb - - T1 * ddxpart_dVb - dxpart * ggtb); - - here->BSIM4_49 = m * (gdpr - gdtotd); - here->BSIM4_50 = m * (gdpr + gdtot); - - here->BSIM4_51 = m * (here->BSIM4gds + gstotd + RevSum - gcsdb - gbspdp - - T1 * dsxpart_dVd - sxpart * ggtd + gIstotd); - here->BSIM4_52 = m * (gcsgb - Gm - gstotg + gbspg + sxpart * ggtg - + T1 * dsxpart_dVg - gIstotg); - here->BSIM4_53 = m * (gspr + here->BSIM4gds + here->BSIM4gbs + T1 * dsxpart_dVs - - gstots + FwdSum + gcssb + gbspsp + sxpart * ggts - gIstots); - here->BSIM4_54 = m * (gspr + gstot); - here->BSIM4_55 = m * (gjbs + gstotb + Gmbs - gcsbb - gbspb - sxpart * ggtb - - T1 * dsxpart_dVb + gIstotb); - - here->BSIM4_56 = m * (gspr - gstots); - here->BSIM4_57 = m * (gspr + gstot); - - here->BSIM4_58 = m * (gcbdb - gjbd + gbbdp - gIbtotd); - here->BSIM4_59 = m * (gcbgb - here->BSIM4gbgs - gIbtotg); - here->BSIM4_60 = m * (gcbsb - gjbs + gbbsp - gIbtots); - here->BSIM4_61 = m * (gjbd + gjbs + gcbbb - here->BSIM4gbbs - gIbtotb); - - ggidld = here->BSIM4ggidld; - ggidlg = here->BSIM4ggidlg; - ggidlb = here->BSIM4ggidlb; - ggislg = here->BSIM4ggislg; - ggisls = here->BSIM4ggisls; - ggislb = here->BSIM4ggislb; - - /* stamp gidl */ - here->BSIM4_62 = m * ggidld; - here->BSIM4_63 = m * ggidlg; - here->BSIM4_64 = m * (ggidlg + ggidld + ggidlb); - here->BSIM4_65 = m * ggidlb; - here->BSIM4_66 = m * ggidld; - here->BSIM4_67 = m * ggidlg; - here->BSIM4_68 = m * (ggidlg + ggidld + ggidlb); - here->BSIM4_69 = m * ggidlb; - /* stamp gisl */ - here->BSIM4_70 = m * (ggisls + ggislg + ggislb); - here->BSIM4_71 = m * ggislg; - here->BSIM4_72 = m * ggisls; - here->BSIM4_73 = m * ggislb; - here->BSIM4_74 = m * (ggislg + ggisls + ggislb); - here->BSIM4_75 = m * ggislg; - here->BSIM4_76 = m * ggisls; - here->BSIM4_77 = m * ggislb; - - if (here->BSIM4rbodyMod) - { here->BSIM4_78 = m * (gcdbdb - here->BSIM4gbd); - here->BSIM4_79 = m * (here->BSIM4gbs - gcsbsb); - - here->BSIM4_80 = m * (gcdbdb - here->BSIM4gbd); - here->BSIM4_81 = m * (here->BSIM4gbd - gcdbdb - + here->BSIM4grbpd + here->BSIM4grbdb); - here->BSIM4_82 = m * here->BSIM4grbpd; - here->BSIM4_83 = m * here->BSIM4grbdb; - - here->BSIM4_84 = m * here->BSIM4grbpd; - here->BSIM4_85 = m * here->BSIM4grbpb; - here->BSIM4_86 = m * here->BSIM4grbps; - here->BSIM4_87 = m * (here->BSIM4grbpd + here->BSIM4grbps - + here->BSIM4grbpb); - /* WDLiu: (gcbbb - here->BSIM4gbbs) already added to BPbpPtr */ - - here->BSIM4_88 = m * (gcsbsb - here->BSIM4gbs); - here->BSIM4_89 = m * here->BSIM4grbps; - here->BSIM4_90 = m * here->BSIM4grbsb; - here->BSIM4_91 = m * (here->BSIM4gbs - gcsbsb - + here->BSIM4grbps + here->BSIM4grbsb); - - here->BSIM4_92 = m * here->BSIM4grbdb; - here->BSIM4_93 = m * here->BSIM4grbpb; - here->BSIM4_94 = m * here->BSIM4grbsb; - here->BSIM4_95 = m * (here->BSIM4grbsb + here->BSIM4grbdb - + here->BSIM4grbpb); - } - - if (here->BSIM4trnqsMod) - { here->BSIM4_96 = m * (gqdef + here->BSIM4gtau); - here->BSIM4_97 = m * (ggtg - gcqgb); - here->BSIM4_98 = m * (ggtd - gcqdb); - here->BSIM4_99 = m * (ggts - gcqsb); - here->BSIM4_100 = m * (ggtb - gcqbb); - - here->BSIM4_101 = m * dxpart * here->BSIM4gtau; - here->BSIM4_102 = m * sxpart * here->BSIM4gtau; - here->BSIM4_103 = m * here->BSIM4gtau; - } -#else - if (here->BSIM4rgateMod == 1) - { (*(here->BSIM4GEgePtr) += m * geltd); - (*(here->BSIM4GPgePtr) -= m * geltd); - (*(here->BSIM4GEgpPtr) -= m * geltd); - (*(here->BSIM4GPgpPtr) += m * (gcggb + geltd - ggtg + gIgtotg)); - (*(here->BSIM4GPdpPtr) += m * (gcgdb - ggtd + gIgtotd)); - (*(here->BSIM4GPspPtr) += m * (gcgsb - ggts + gIgtots)); - (*(here->BSIM4GPbpPtr) += m * (gcgbb - ggtb + gIgtotb)); - } /* WDLiu: gcrg already subtracted from all gcrgg below */ - else if (here->BSIM4rgateMod == 2) - { (*(here->BSIM4GEgePtr) += m * gcrg); - (*(here->BSIM4GEgpPtr) += m * gcrgg); - (*(here->BSIM4GEdpPtr) += m * gcrgd); - (*(here->BSIM4GEspPtr) += m * gcrgs); - (*(here->BSIM4GEbpPtr) += m * gcrgb); - - (*(here->BSIM4GPgePtr) -= m * gcrg); - (*(here->BSIM4GPgpPtr) += m * (gcggb - gcrgg - ggtg + gIgtotg)); - (*(here->BSIM4GPdpPtr) += m * (gcgdb - gcrgd - ggtd + gIgtotd)); - (*(here->BSIM4GPspPtr) += m * (gcgsb - gcrgs - ggts + gIgtots)); - (*(here->BSIM4GPbpPtr) += m * (gcgbb - gcrgb - ggtb + gIgtotb)); - } - else if (here->BSIM4rgateMod == 3) - { (*(here->BSIM4GEgePtr) += m * geltd); - (*(here->BSIM4GEgmPtr) -= m * geltd); - (*(here->BSIM4GMgePtr) -= m * geltd); - (*(here->BSIM4GMgmPtr) += m * (geltd + gcrg + gcgmgmb)); - - (*(here->BSIM4GMdpPtr) += m * (gcrgd + gcgmdb)); - (*(here->BSIM4GMgpPtr) += m * gcrgg); - (*(here->BSIM4GMspPtr) += m * (gcrgs + gcgmsb)); - (*(here->BSIM4GMbpPtr) += m * (gcrgb + gcgmbb)); - - (*(here->BSIM4DPgmPtr) += m * gcdgmb); - (*(here->BSIM4GPgmPtr) -= m * gcrg); - (*(here->BSIM4SPgmPtr) += m * gcsgmb); - (*(here->BSIM4BPgmPtr) += m * gcbgmb); - - (*(here->BSIM4GPgpPtr) += m * (gcggb - gcrgg - ggtg + gIgtotg)); - (*(here->BSIM4GPdpPtr) += m * (gcgdb - gcrgd - ggtd + gIgtotd)); - (*(here->BSIM4GPspPtr) += m * (gcgsb - gcrgs - ggts + gIgtots)); - (*(here->BSIM4GPbpPtr) += m * (gcgbb - gcrgb - ggtb + gIgtotb)); - } - else - { (*(here->BSIM4GPgpPtr) += m * (gcggb - ggtg + gIgtotg)); - (*(here->BSIM4GPdpPtr) += m * (gcgdb - ggtd + gIgtotd)); - (*(here->BSIM4GPspPtr) += m * (gcgsb - ggts + gIgtots)); - (*(here->BSIM4GPbpPtr) += m * (gcgbb - ggtb + gIgtotb)); - } - - if (model->BSIM4rdsMod) - { (*(here->BSIM4DgpPtr) += m * gdtotg); - (*(here->BSIM4DspPtr) += m * gdtots); - (*(here->BSIM4DbpPtr) += m * gdtotb); - (*(here->BSIM4SdpPtr) += m * gstotd); - (*(here->BSIM4SgpPtr) += m * gstotg); - (*(here->BSIM4SbpPtr) += m * gstotb); - } - - (*(here->BSIM4DPdpPtr) += m * (gdpr + here->BSIM4gds + here->BSIM4gbd + T1 * ddxpart_dVd - - gdtotd + RevSum + gcddb + gbdpdp + dxpart * ggtd - gIdtotd)); - (*(here->BSIM4DPdPtr) -= m * (gdpr + gdtot)); - (*(here->BSIM4DPgpPtr) += m * (Gm + gcdgb - gdtotg + gbdpg - gIdtotg - + dxpart * ggtg + T1 * ddxpart_dVg)); - (*(here->BSIM4DPspPtr) -= m * (here->BSIM4gds + gdtots - dxpart * ggts + gIdtots - - T1 * ddxpart_dVs + FwdSum - gcdsb - gbdpsp)); - (*(here->BSIM4DPbpPtr) -= m * (gjbd + gdtotb - Gmbs - gcdbb - gbdpb + gIdtotb - - T1 * ddxpart_dVb - dxpart * ggtb)); - - (*(here->BSIM4DdpPtr) -= m * (gdpr - gdtotd)); - (*(here->BSIM4DdPtr) += m * (gdpr + gdtot)); - - (*(here->BSIM4SPdpPtr) -= m * (here->BSIM4gds + gstotd + RevSum - gcsdb - gbspdp - - T1 * dsxpart_dVd - sxpart * ggtd + gIstotd)); - (*(here->BSIM4SPgpPtr) += m * (gcsgb - Gm - gstotg + gbspg + sxpart * ggtg - + T1 * dsxpart_dVg - gIstotg)); - (*(here->BSIM4SPspPtr) += m * (gspr + here->BSIM4gds + here->BSIM4gbs + T1 * dsxpart_dVs - - gstots + FwdSum + gcssb + gbspsp + sxpart * ggts - gIstots)); - (*(here->BSIM4SPsPtr) -= m * (gspr + gstot)); - (*(here->BSIM4SPbpPtr) -= m * (gjbs + gstotb + Gmbs - gcsbb - gbspb - sxpart * ggtb - - T1 * dsxpart_dVb + gIstotb)); - - (*(here->BSIM4SspPtr) -= m * (gspr - gstots)); - (*(here->BSIM4SsPtr) += m * (gspr + gstot)); - - (*(here->BSIM4BPdpPtr) += m * (gcbdb - gjbd + gbbdp - gIbtotd)); - (*(here->BSIM4BPgpPtr) += m * (gcbgb - here->BSIM4gbgs - gIbtotg)); - (*(here->BSIM4BPspPtr) += m * (gcbsb - gjbs + gbbsp - gIbtots)); - (*(here->BSIM4BPbpPtr) += m * (gjbd + gjbs + gcbbb - here->BSIM4gbbs - - gIbtotb)); - - ggidld = here->BSIM4ggidld; - ggidlg = here->BSIM4ggidlg; - ggidlb = here->BSIM4ggidlb; - ggislg = here->BSIM4ggislg; - ggisls = here->BSIM4ggisls; - ggislb = here->BSIM4ggislb; - - /* stamp gidl */ - (*(here->BSIM4DPdpPtr) += m * ggidld); - (*(here->BSIM4DPgpPtr) += m * ggidlg); - (*(here->BSIM4DPspPtr) -= m * (ggidlg + ggidld + ggidlb)); - (*(here->BSIM4DPbpPtr) += m * ggidlb); - (*(here->BSIM4BPdpPtr) -= m * ggidld); - (*(here->BSIM4BPgpPtr) -= m * ggidlg); - (*(here->BSIM4BPspPtr) += m * (ggidlg + ggidld + ggidlb)); - (*(here->BSIM4BPbpPtr) -= m * ggidlb); - /* stamp gisl */ - (*(here->BSIM4SPdpPtr) -= m * (ggisls + ggislg + ggislb)); - (*(here->BSIM4SPgpPtr) += m * ggislg); - (*(here->BSIM4SPspPtr) += m * ggisls); - (*(here->BSIM4SPbpPtr) += m * ggislb); - (*(here->BSIM4BPdpPtr) += m * (ggislg + ggisls + ggislb)); - (*(here->BSIM4BPgpPtr) -= m * ggislg); - (*(here->BSIM4BPspPtr) -= m * ggisls); - (*(here->BSIM4BPbpPtr) -= m * ggislb); - - - if (here->BSIM4rbodyMod) - { (*(here->BSIM4DPdbPtr) += m * (gcdbdb - here->BSIM4gbd)); - (*(here->BSIM4SPsbPtr) -= m * (here->BSIM4gbs - gcsbsb)); - - (*(here->BSIM4DBdpPtr) += m * (gcdbdb - here->BSIM4gbd)); - (*(here->BSIM4DBdbPtr) += m * (here->BSIM4gbd - gcdbdb - + here->BSIM4grbpd + here->BSIM4grbdb)); - (*(here->BSIM4DBbpPtr) -= m * here->BSIM4grbpd); - (*(here->BSIM4DBbPtr) -= m * here->BSIM4grbdb); - - (*(here->BSIM4BPdbPtr) -= m * here->BSIM4grbpd); - (*(here->BSIM4BPbPtr) -= m * here->BSIM4grbpb); - (*(here->BSIM4BPsbPtr) -= m * here->BSIM4grbps); - (*(here->BSIM4BPbpPtr) += m * (here->BSIM4grbpd + here->BSIM4grbps - + here->BSIM4grbpb)); - /* WDLiu: (gcbbb - here->BSIM4gbbs) already added to BPbpPtr */ - - (*(here->BSIM4SBspPtr) += m * (gcsbsb - here->BSIM4gbs)); - (*(here->BSIM4SBbpPtr) -= m * here->BSIM4grbps); - (*(here->BSIM4SBbPtr) -= m * here->BSIM4grbsb); - (*(here->BSIM4SBsbPtr) += m * (here->BSIM4gbs - gcsbsb - + here->BSIM4grbps + here->BSIM4grbsb)); - - (*(here->BSIM4BdbPtr) -= m * here->BSIM4grbdb); - (*(here->BSIM4BbpPtr) -= m * here->BSIM4grbpb); - (*(here->BSIM4BsbPtr) -= m * here->BSIM4grbsb); - (*(here->BSIM4BbPtr) += m * (here->BSIM4grbsb + here->BSIM4grbdb - + here->BSIM4grbpb)); - } - - if (here->BSIM4trnqsMod) - { (*(here->BSIM4QqPtr) += m * (gqdef + here->BSIM4gtau)); - (*(here->BSIM4QgpPtr) += m * (ggtg - gcqgb)); - (*(here->BSIM4QdpPtr) += m * (ggtd - gcqdb)); - (*(here->BSIM4QspPtr) += m * (ggts - gcqsb)); - (*(here->BSIM4QbpPtr) += m * (ggtb - gcqbb)); - - (*(here->BSIM4DPqPtr) += m * dxpart * here->BSIM4gtau); - (*(here->BSIM4SPqPtr) += m * sxpart * here->BSIM4gtau); - (*(here->BSIM4GPqPtr) -= m * here->BSIM4gtau); - } -#endif - -line1000: ; - -#ifndef USE_OMP - } /* End of MOSFET Instance */ -} /* End of Model Instance */ -#endif - -return(OK); -} - -/* function to compute poly depletion effect */ -int BSIM4polyDepletion( - double phi, - double ngate, - double epsgate, - double coxe, - double Vgs, - double *Vgs_eff, - double *dVgs_eff_dVg) -{ - double T1, T2, T3, T4, T5, T6, T7, T8; - - /* Poly Gate Si Depletion Effect */ - if ((ngate > 1.0e18) && - (ngate < 1.0e25) && (Vgs > phi) && (epsgate!=0) - ){ - T1 = 1.0e6 * CHARGE * epsgate * ngate / (coxe * coxe); - T8 = Vgs - phi; - T4 = sqrt(1.0 + 2.0 * T8 / T1); - T2 = 2.0 * T8 / (T4 + 1.0); - T3 = 0.5 * T2 * T2 / T1; /* T3 = Vpoly */ - T7 = 1.12 - T3 - 0.05; - T6 = sqrt(T7 * T7 + 0.224); - T5 = 1.12 - 0.5 * (T7 + T6); - *Vgs_eff = Vgs - T5; - *dVgs_eff_dVg = 1.0 - (0.5 - 0.5 / T4) * (1.0 + T7 / T6); - } - else { - *Vgs_eff = Vgs; - *dVgs_eff_dVg = 1.0; - } - return(0); -} - -#ifdef USE_OMP -void BSIM4LoadRhsMat(GENmodel *inModel, CKTcircuit *ckt) -{ - int InstCount, idx; - BSIM4instance **InstArray; - BSIM4instance *here; - BSIM4model *model = (BSIM4model*)inModel; - - InstArray = model->BSIM4InstanceArray; - InstCount = model->BSIM4InstCount; - - for(idx = 0; idx < InstCount; idx++) { - here = InstArray[idx]; - model = BSIM4modPtr(here); - /* Update b for Ax = b */ - (*(ckt->CKTrhs + here->BSIM4dNodePrime) += here->BSIM4rhsdPrime); - (*(ckt->CKTrhs + here->BSIM4gNodePrime) -= here->BSIM4rhsgPrime); - - if (here->BSIM4rgateMod == 2) - (*(ckt->CKTrhs + here->BSIM4gNodeExt) -= here->BSIM4rhsgExt); - else if (here->BSIM4rgateMod == 3) - (*(ckt->CKTrhs + here->BSIM4gNodeMid) -= here->BSIM4grhsMid); - - if (!here->BSIM4rbodyMod) - { (*(ckt->CKTrhs + here->BSIM4bNodePrime) += here->BSIM4rhsbPrime); - (*(ckt->CKTrhs + here->BSIM4sNodePrime) += here->BSIM4rhssPrime); - } - else - { (*(ckt->CKTrhs + here->BSIM4dbNode) -= here->BSIM4rhsdb); - (*(ckt->CKTrhs + here->BSIM4bNodePrime) += here->BSIM4rhsbPrime); - (*(ckt->CKTrhs + here->BSIM4sbNode) -= here->BSIM4rhssb); - (*(ckt->CKTrhs + here->BSIM4sNodePrime) += here->BSIM4rhssPrime); - } - - if (model->BSIM4rdsMod) - { (*(ckt->CKTrhs + here->BSIM4dNode) -= here->BSIM4rhsd); - (*(ckt->CKTrhs + here->BSIM4sNode) += here->BSIM4rhss); - } - - if (here->BSIM4trnqsMod) - *(ckt->CKTrhs + here->BSIM4qNode) += here->BSIM4rhsq; - - - /* Update A for Ax = b */ - if (here->BSIM4rgateMod == 1) - { (*(here->BSIM4GEgePtr) += here->BSIM4_1); - (*(here->BSIM4GPgePtr) -= here->BSIM4_2); - (*(here->BSIM4GEgpPtr) -= here->BSIM4_3); - (*(here->BSIM4GPgpPtr) += here->BSIM4_4); - (*(here->BSIM4GPdpPtr) += here->BSIM4_5); - (*(here->BSIM4GPspPtr) += here->BSIM4_6); - (*(here->BSIM4GPbpPtr) += here->BSIM4_7); - } - else if (here->BSIM4rgateMod == 2) - { (*(here->BSIM4GEgePtr) += here->BSIM4_8); - (*(here->BSIM4GEgpPtr) += here->BSIM4_9); - (*(here->BSIM4GEdpPtr) += here->BSIM4_10); - (*(here->BSIM4GEspPtr) += here->BSIM4_11); - (*(here->BSIM4GEbpPtr) += here->BSIM4_12); - - (*(here->BSIM4GPgePtr) -= here->BSIM4_13); - (*(here->BSIM4GPgpPtr) += here->BSIM4_14); - (*(here->BSIM4GPdpPtr) += here->BSIM4_15); - (*(here->BSIM4GPspPtr) += here->BSIM4_16); - (*(here->BSIM4GPbpPtr) += here->BSIM4_17); - } - else if (here->BSIM4rgateMod == 3) - { (*(here->BSIM4GEgePtr) += here->BSIM4_18); - (*(here->BSIM4GEgmPtr) -= here->BSIM4_19); - (*(here->BSIM4GMgePtr) -= here->BSIM4_20); - (*(here->BSIM4GMgmPtr) += here->BSIM4_21); - - (*(here->BSIM4GMdpPtr) += here->BSIM4_22); - (*(here->BSIM4GMgpPtr) += here->BSIM4_23); - (*(here->BSIM4GMspPtr) += here->BSIM4_24); - (*(here->BSIM4GMbpPtr) += here->BSIM4_25); - - (*(here->BSIM4DPgmPtr) += here->BSIM4_26); - (*(here->BSIM4GPgmPtr) -= here->BSIM4_27); - (*(here->BSIM4SPgmPtr) += here->BSIM4_28); - (*(here->BSIM4BPgmPtr) += here->BSIM4_29); - - (*(here->BSIM4GPgpPtr) += here->BSIM4_30); - (*(here->BSIM4GPdpPtr) += here->BSIM4_31); - (*(here->BSIM4GPspPtr) += here->BSIM4_32); - (*(here->BSIM4GPbpPtr) += here->BSIM4_33); - } - - - else - { (*(here->BSIM4GPgpPtr) += here->BSIM4_34); - (*(here->BSIM4GPdpPtr) += here->BSIM4_35); - (*(here->BSIM4GPspPtr) += here->BSIM4_36); - (*(here->BSIM4GPbpPtr) += here->BSIM4_37); - } - - - if (model->BSIM4rdsMod) - { (*(here->BSIM4DgpPtr) += here->BSIM4_38); - (*(here->BSIM4DspPtr) += here->BSIM4_39); - (*(here->BSIM4DbpPtr) += here->BSIM4_40); - (*(here->BSIM4SdpPtr) += here->BSIM4_41); - (*(here->BSIM4SgpPtr) += here->BSIM4_42); - (*(here->BSIM4SbpPtr) += here->BSIM4_43); - } - - (*(here->BSIM4DPdpPtr) += here->BSIM4_44); - (*(here->BSIM4DPdPtr) -= here->BSIM4_45); - (*(here->BSIM4DPgpPtr) += here->BSIM4_46); - (*(here->BSIM4DPspPtr) -= here->BSIM4_47); - (*(here->BSIM4DPbpPtr) -= here->BSIM4_48); - - (*(here->BSIM4DdpPtr) -= here->BSIM4_49); - (*(here->BSIM4DdPtr) += here->BSIM4_50); - - (*(here->BSIM4SPdpPtr) -= here->BSIM4_51); - (*(here->BSIM4SPgpPtr) += here->BSIM4_52); - (*(here->BSIM4SPspPtr) += here->BSIM4_53); - (*(here->BSIM4SPsPtr) -= here->BSIM4_54); - (*(here->BSIM4SPbpPtr) -= here->BSIM4_55); - - (*(here->BSIM4SspPtr) -= here->BSIM4_56); - (*(here->BSIM4SsPtr) += here->BSIM4_57); - - (*(here->BSIM4BPdpPtr) += here->BSIM4_58); - (*(here->BSIM4BPgpPtr) += here->BSIM4_59); - (*(here->BSIM4BPspPtr) += here->BSIM4_60); - (*(here->BSIM4BPbpPtr) += here->BSIM4_61); - - /* stamp gidl */ - (*(here->BSIM4DPdpPtr) += here->BSIM4_62); - (*(here->BSIM4DPgpPtr) += here->BSIM4_63); - (*(here->BSIM4DPspPtr) -= here->BSIM4_64); - (*(here->BSIM4DPbpPtr) += here->BSIM4_65); - (*(here->BSIM4BPdpPtr) -= here->BSIM4_66); - (*(here->BSIM4BPgpPtr) -= here->BSIM4_67); - (*(here->BSIM4BPspPtr) += here->BSIM4_68); - (*(here->BSIM4BPbpPtr) -= here->BSIM4_69); - /* stamp gisl */ - (*(here->BSIM4SPdpPtr) -= here->BSIM4_70); - (*(here->BSIM4SPgpPtr) += here->BSIM4_71); - (*(here->BSIM4SPspPtr) += here->BSIM4_72); - (*(here->BSIM4SPbpPtr) += here->BSIM4_73); - (*(here->BSIM4BPdpPtr) += here->BSIM4_74); - (*(here->BSIM4BPgpPtr) -= here->BSIM4_75); - (*(here->BSIM4BPspPtr) -= here->BSIM4_76); - (*(here->BSIM4BPbpPtr) -= here->BSIM4_77); - - - if (here->BSIM4rbodyMod) - { (*(here->BSIM4DPdbPtr) += here->BSIM4_78); - (*(here->BSIM4SPsbPtr) -= here->BSIM4_79); - - (*(here->BSIM4DBdpPtr) += here->BSIM4_80); - (*(here->BSIM4DBdbPtr) += here->BSIM4_81); - (*(here->BSIM4DBbpPtr) -= here->BSIM4_82); - (*(here->BSIM4DBbPtr) -= here->BSIM4_83); - - (*(here->BSIM4BPdbPtr) -= here->BSIM4_84); - (*(here->BSIM4BPbPtr) -= here->BSIM4_85); - (*(here->BSIM4BPsbPtr) -= here->BSIM4_86); - (*(here->BSIM4BPbpPtr) += here->BSIM4_87); - - (*(here->BSIM4SBspPtr) += here->BSIM4_88); - (*(here->BSIM4SBbpPtr) -= here->BSIM4_89); - (*(here->BSIM4SBbPtr) -= here->BSIM4_90); - (*(here->BSIM4SBsbPtr) += here->BSIM4_91); - - (*(here->BSIM4BdbPtr) -= here->BSIM4_92); - (*(here->BSIM4BbpPtr) -= here->BSIM4_93); - (*(here->BSIM4BsbPtr) -= here->BSIM4_94); - (*(here->BSIM4BbPtr) += here->BSIM4_95); - } - - if (here->BSIM4trnqsMod) - { (*(here->BSIM4QqPtr) += here->BSIM4_96); - (*(here->BSIM4QgpPtr) += here->BSIM4_97); - (*(here->BSIM4QdpPtr) += here->BSIM4_98); - (*(here->BSIM4QspPtr) += here->BSIM4_99); - (*(here->BSIM4QbpPtr) += here->BSIM4_100); - - (*(here->BSIM4DPqPtr) += here->BSIM4_101); - (*(here->BSIM4SPqPtr) += here->BSIM4_102); - (*(here->BSIM4GPqPtr) -= here->BSIM4_103); - } - } -} - -#endif diff --git a/src/spicelib/devices/bsim4/b4mask.c b/src/spicelib/devices/bsim4/b4mask.c deleted file mode 100644 index 8e802cc30..000000000 --- a/src/spicelib/devices/bsim4/b4mask.c +++ /dev/null @@ -1,2777 +0,0 @@ -/* ****************************************************************************** - * BSIM4 4.8.1 released by Chetan Kumar Dabhi 2/15/2017 * - * BSIM4 Model Equations * - ****************************************************************************** - - ****************************************************************************** - * Copyright 2017 Regents of the University of California. * - * All rights reserved. * - * * - * Project Director: Prof. Chenming Hu. * - * Authors: Gary W. Ng, Weidong Liu, Xuemei Xi, Mohan Dunga, Wenwei Yang * - * Ali Niknejad, Shivendra Singh Parihar, Chetan Kumar Dabhi * - * Yogesh Singh Chauhan, Sayeef Salahuddin, Chenming Hu * - ****************************************************************************** - - ****************************************************************************** - * CMC In-Code Statement * - * * - * The Developer agrees that the following statement will appear in the * - * model code that has been adopted as a CMC Standard. * - * * - * Software is distributed as is, completely without warranty or service * - * support. The University of California and its employees are not liable * - * for the condition or performance of the software. * - * * - * The University of California owns the copyright and grants users a * - * perpetual, irrevocable, worldwide, non-exclusive, royalty-free license * - * with respect to the software as set forth below. * - * * - * The University of California hereby disclaims all implied warranties. * - * * - * The University of California grants the users the right to modify, * - * copy, and redistribute the software and documentation, both within * - * the user's organization and externally, subject to the following * - * restrictions: * - * * - * 1. The users agree not to charge for the University of California code * - * itself but may charge for additions, extensions, or support. * - * * - * 2. In any product based on the software, the users agree to * - * acknowledge the University of California that developed the * - * software. This acknowledgment shall appear in the product * - * documentation. * - * * - * 3. Redistributions to others of source code and documentation must * - * retain the copyright notice, disclaimer, and list of conditions. * - * * - * 4. Redistributions to others in binary form must reproduce the * - * copyright notice, disclaimer, and list of conditions in the * - * documentation and/or other materials provided with the * - * distribution. * - * * - * Agreed to on ______Feb. 15, 2017______________ * - * * - * By: ____University of California, Berkeley___ * - * ____Chenming Hu__________________________ * - * ____Professor in Graduate School ________ * - * * - ****************************************************************************** */ - -#include "ngspice/ngspice.h" -#include "ngspice/ifsim.h" -#include "ngspice/cktdefs.h" -#include "ngspice/devdefs.h" -#include "bsim4def.h" -#include "ngspice/sperror.h" -#include "ngspice/suffix.h" - -int -BSIM4mAsk( -CKTcircuit *ckt, -GENmodel *inst, -int which, -IFvalue *value) -{ - BSIM4model *model = (BSIM4model *)inst; - - NG_IGNORE(ckt); - - switch(which) - { case BSIM4_MOD_MOBMOD : - value->iValue = model->BSIM4mobMod; - return(OK); - case BSIM4_MOD_PARAMCHK : - value->iValue = model->BSIM4paramChk; - return(OK); - case BSIM4_MOD_BINUNIT : - value->iValue = model->BSIM4binUnit; - return(OK); - case BSIM4_MOD_CVCHARGEMOD : - value->iValue = model->BSIM4cvchargeMod; - return(OK); - case BSIM4_MOD_CAPMOD : - value->iValue = model->BSIM4capMod; - return(OK); - case BSIM4_MOD_DIOMOD : - value->iValue = model->BSIM4dioMod; - return(OK); - case BSIM4_MOD_TRNQSMOD : - value->iValue = model->BSIM4trnqsMod; - return(OK); - case BSIM4_MOD_ACNQSMOD : - value->iValue = model->BSIM4acnqsMod; - return(OK); - case BSIM4_MOD_FNOIMOD : - value->iValue = model->BSIM4fnoiMod; - return(OK); - case BSIM4_MOD_TNOIMOD : - value->iValue = model->BSIM4tnoiMod; - return(OK); - case BSIM4_MOD_RDSMOD : - value->iValue = model->BSIM4rdsMod; - return(OK); - case BSIM4_MOD_RBODYMOD : - value->iValue = model->BSIM4rbodyMod; - return(OK); - case BSIM4_MOD_RGATEMOD : - value->iValue = model->BSIM4rgateMod; - return(OK); - case BSIM4_MOD_PERMOD : - value->iValue = model->BSIM4perMod; - return(OK); - case BSIM4_MOD_GEOMOD : - value->iValue = model->BSIM4geoMod; - return(OK); - case BSIM4_MOD_RGEOMOD : - value->iValue = model->BSIM4rgeoMod; - return(OK); - case BSIM4_MOD_MTRLMOD : - value->iValue = model->BSIM4mtrlMod; - return(OK); - case BSIM4_MOD_GIDLMOD : /* v4.7 New GIDL/GISL*/ - value->iValue = model->BSIM4gidlMod; - return(OK); - case BSIM4_MOD_MTRLCOMPATMOD : - value->iValue = model->BSIM4mtrlCompatMod; - return(OK); - case BSIM4_MOD_IGCMOD : - value->iValue = model->BSIM4igcMod; - return(OK); - case BSIM4_MOD_IGBMOD : - value->iValue = model->BSIM4igbMod; - return(OK); - case BSIM4_MOD_TEMPMOD : - value->iValue = model->BSIM4tempMod; - return(OK); - - case BSIM4_MOD_VERSION : - value->sValue = model->BSIM4version; - return(OK); - case BSIM4_MOD_TOXREF : - value->rValue = model->BSIM4toxref; - return(OK); - case BSIM4_MOD_EOT : - value->rValue = model->BSIM4eot; - return(OK); - case BSIM4_MOD_VDDEOT : - value->rValue = model->BSIM4vddeot; - return(OK); - case BSIM4_MOD_TEMPEOT : - value->rValue = model->BSIM4tempeot; - return(OK); - case BSIM4_MOD_LEFFEOT : - value->rValue = model->BSIM4leffeot; - return(OK); - case BSIM4_MOD_WEFFEOT : - value->rValue = model->BSIM4weffeot; - return(OK); - case BSIM4_MOD_ADOS : - value->rValue = model->BSIM4ados; - return(OK); - case BSIM4_MOD_BDOS : - value->rValue = model->BSIM4bdos; - return(OK); - case BSIM4_MOD_TOXE : - value->rValue = model->BSIM4toxe; - return(OK); - case BSIM4_MOD_TOXP : - value->rValue = model->BSIM4toxp; - return(OK); - case BSIM4_MOD_TOXM : - value->rValue = model->BSIM4toxm; - return(OK); - case BSIM4_MOD_DTOX : - value->rValue = model->BSIM4dtox; - return(OK); - case BSIM4_MOD_EPSROX : - value->rValue = model->BSIM4epsrox; - return(OK); - case BSIM4_MOD_CDSC : - value->rValue = model->BSIM4cdsc; - return(OK); - case BSIM4_MOD_CDSCB : - value->rValue = model->BSIM4cdscb; - return(OK); - - case BSIM4_MOD_CDSCD : - value->rValue = model->BSIM4cdscd; - return(OK); - - case BSIM4_MOD_CIT : - value->rValue = model->BSIM4cit; - return(OK); - case BSIM4_MOD_NFACTOR : - value->rValue = model->BSIM4nfactor; - return(OK); - case BSIM4_MOD_XJ: - value->rValue = model->BSIM4xj; - return(OK); - case BSIM4_MOD_VSAT: - value->rValue = model->BSIM4vsat; - return(OK); - case BSIM4_MOD_VTL: - value->rValue = model->BSIM4vtl; - return(OK); - case BSIM4_MOD_XN: - value->rValue = model->BSIM4xn; - return(OK); - case BSIM4_MOD_LC: - value->rValue = model->BSIM4lc; - return(OK); - case BSIM4_MOD_LAMBDA: - value->rValue = model->BSIM4lambda; - return(OK); - case BSIM4_MOD_AT: - value->rValue = model->BSIM4at; - return(OK); - case BSIM4_MOD_A0: - value->rValue = model->BSIM4a0; - return(OK); - - case BSIM4_MOD_AGS: - value->rValue = model->BSIM4ags; - return(OK); - - case BSIM4_MOD_A1: - value->rValue = model->BSIM4a1; - return(OK); - case BSIM4_MOD_A2: - value->rValue = model->BSIM4a2; - return(OK); - case BSIM4_MOD_KETA: - value->rValue = model->BSIM4keta; - return(OK); - case BSIM4_MOD_NSUB: - value->rValue = model->BSIM4nsub; - return(OK); - case BSIM4_MOD_PHIG: - value->rValue = model->BSIM4phig; - return(OK); - case BSIM4_MOD_EPSRGATE: - value->rValue = model->BSIM4epsrgate; - return(OK); - case BSIM4_MOD_EASUB: - value->rValue = model->BSIM4easub; - return(OK); - case BSIM4_MOD_EPSRSUB: - value->rValue = model->BSIM4epsrsub; - return(OK); - case BSIM4_MOD_NI0SUB: - value->rValue = model->BSIM4ni0sub; - return(OK); - case BSIM4_MOD_BG0SUB: - value->rValue = model->BSIM4bg0sub; - return(OK); - case BSIM4_MOD_TBGASUB: - value->rValue = model->BSIM4tbgasub; - return(OK); - case BSIM4_MOD_TBGBSUB: - value->rValue = model->BSIM4tbgbsub; - return(OK); - case BSIM4_MOD_NDEP: - value->rValue = model->BSIM4ndep; - return(OK); - case BSIM4_MOD_NSD: - value->rValue = model->BSIM4nsd; - return(OK); - case BSIM4_MOD_NGATE: - value->rValue = model->BSIM4ngate; - return(OK); - case BSIM4_MOD_GAMMA1: - value->rValue = model->BSIM4gamma1; - return(OK); - case BSIM4_MOD_GAMMA2: - value->rValue = model->BSIM4gamma2; - return(OK); - case BSIM4_MOD_VBX: - value->rValue = model->BSIM4vbx; - return(OK); - case BSIM4_MOD_VBM: - value->rValue = model->BSIM4vbm; - return(OK); - case BSIM4_MOD_XT: - value->rValue = model->BSIM4xt; - return(OK); - case BSIM4_MOD_K1: - value->rValue = model->BSIM4k1; - return(OK); - case BSIM4_MOD_KT1: - value->rValue = model->BSIM4kt1; - return(OK); - case BSIM4_MOD_KT1L: - value->rValue = model->BSIM4kt1l; - return(OK); - case BSIM4_MOD_KT2 : - value->rValue = model->BSIM4kt2; - return(OK); - case BSIM4_MOD_K2 : - value->rValue = model->BSIM4k2; - return(OK); - case BSIM4_MOD_K3: - value->rValue = model->BSIM4k3; - return(OK); - case BSIM4_MOD_K3B: - value->rValue = model->BSIM4k3b; - return(OK); - case BSIM4_MOD_W0: - value->rValue = model->BSIM4w0; - return(OK); - case BSIM4_MOD_LPE0: - value->rValue = model->BSIM4lpe0; - return(OK); - case BSIM4_MOD_LPEB: - value->rValue = model->BSIM4lpeb; - return(OK); - case BSIM4_MOD_DVTP0: - value->rValue = model->BSIM4dvtp0; - return(OK); - case BSIM4_MOD_DVTP1: - value->rValue = model->BSIM4dvtp1; - return(OK); - case BSIM4_MOD_DVTP2: - value->rValue = model->BSIM4dvtp2; /* New DIBL/Rout */ - return(OK); - case BSIM4_MOD_DVTP3: - value->rValue = model->BSIM4dvtp3; - return(OK); - case BSIM4_MOD_DVTP4: - value->rValue = model->BSIM4dvtp4; - return(OK); - case BSIM4_MOD_DVTP5: - value->rValue = model->BSIM4dvtp5; - return(OK); - case BSIM4_MOD_DVT0 : - value->rValue = model->BSIM4dvt0; - return(OK); - case BSIM4_MOD_DVT1 : - value->rValue = model->BSIM4dvt1; - return(OK); - case BSIM4_MOD_DVT2 : - value->rValue = model->BSIM4dvt2; - return(OK); - case BSIM4_MOD_DVT0W : - value->rValue = model->BSIM4dvt0w; - return(OK); - case BSIM4_MOD_DVT1W : - value->rValue = model->BSIM4dvt1w; - return(OK); - case BSIM4_MOD_DVT2W : - value->rValue = model->BSIM4dvt2w; - return(OK); - case BSIM4_MOD_DROUT : - value->rValue = model->BSIM4drout; - return(OK); - case BSIM4_MOD_DSUB : - value->rValue = model->BSIM4dsub; - return(OK); - case BSIM4_MOD_VTH0: - value->rValue = model->BSIM4vth0; - return(OK); - case BSIM4_MOD_EU: - value->rValue = model->BSIM4eu; - return(OK); - case BSIM4_MOD_UCS: - value->rValue = model->BSIM4ucs; - return(OK); - case BSIM4_MOD_UA: - value->rValue = model->BSIM4ua; - return(OK); - case BSIM4_MOD_UA1: - value->rValue = model->BSIM4ua1; - return(OK); - case BSIM4_MOD_UB: - value->rValue = model->BSIM4ub; - return(OK); - case BSIM4_MOD_UB1: - value->rValue = model->BSIM4ub1; - return(OK); - case BSIM4_MOD_UC: - value->rValue = model->BSIM4uc; - return(OK); - case BSIM4_MOD_UC1: - value->rValue = model->BSIM4uc1; - return(OK); - case BSIM4_MOD_UD: - value->rValue = model->BSIM4ud; - return(OK); - case BSIM4_MOD_UD1: - value->rValue = model->BSIM4ud1; - return(OK); - case BSIM4_MOD_UP: - value->rValue = model->BSIM4up; - return(OK); - case BSIM4_MOD_LP: - value->rValue = model->BSIM4lp; - return(OK); - case BSIM4_MOD_U0: - value->rValue = model->BSIM4u0; - return(OK); - case BSIM4_MOD_UTE: - value->rValue = model->BSIM4ute; - return(OK); - case BSIM4_MOD_UCSTE: - value->rValue = model->BSIM4ucste; - return(OK); - case BSIM4_MOD_VOFF: - value->rValue = model->BSIM4voff; - return(OK); - case BSIM4_MOD_TVOFF: - value->rValue = model->BSIM4tvoff; - return(OK); - case BSIM4_MOD_TNFACTOR: /* v4.7 temp dep of leakage current */ - value->rValue = model->BSIM4tnfactor; - return(OK); - case BSIM4_MOD_TETA0: /* v4.7 temp dep of leakage current */ - value->rValue = model->BSIM4teta0; - return(OK); - case BSIM4_MOD_TVOFFCV: /* v4.7 temp dep of leakage current */ - value->rValue = model->BSIM4tvoffcv; - return(OK); - case BSIM4_MOD_VFBSDOFF: - value->rValue = model->BSIM4vfbsdoff; - return(OK); - case BSIM4_MOD_TVFBSDOFF: - value->rValue = model->BSIM4tvfbsdoff; - return(OK); - case BSIM4_MOD_VOFFL: - value->rValue = model->BSIM4voffl; - return(OK); - case BSIM4_MOD_VOFFCVL: - value->rValue = model->BSIM4voffcvl; - return(OK); - case BSIM4_MOD_MINV: - value->rValue = model->BSIM4minv; - return(OK); - case BSIM4_MOD_MINVCV: - value->rValue = model->BSIM4minvcv; - return(OK); - case BSIM4_MOD_FPROUT: - value->rValue = model->BSIM4fprout; - return(OK); - case BSIM4_MOD_PDITS: - value->rValue = model->BSIM4pdits; - return(OK); - case BSIM4_MOD_PDITSD: - value->rValue = model->BSIM4pditsd; - return(OK); - case BSIM4_MOD_PDITSL: - value->rValue = model->BSIM4pditsl; - return(OK); - case BSIM4_MOD_DELTA: - value->rValue = model->BSIM4delta; - return(OK); - case BSIM4_MOD_RDSW: - value->rValue = model->BSIM4rdsw; - return(OK); - case BSIM4_MOD_RDSWMIN: - value->rValue = model->BSIM4rdswmin; - return(OK); - case BSIM4_MOD_RDWMIN: - value->rValue = model->BSIM4rdwmin; - return(OK); - case BSIM4_MOD_RSWMIN: - value->rValue = model->BSIM4rswmin; - return(OK); - case BSIM4_MOD_RDW: - value->rValue = model->BSIM4rdw; - return(OK); - case BSIM4_MOD_RSW: - value->rValue = model->BSIM4rsw; - return(OK); - case BSIM4_MOD_PRWG: - value->rValue = model->BSIM4prwg; - return(OK); - case BSIM4_MOD_PRWB: - value->rValue = model->BSIM4prwb; - return(OK); - case BSIM4_MOD_PRT: - value->rValue = model->BSIM4prt; - return(OK); - case BSIM4_MOD_ETA0: - value->rValue = model->BSIM4eta0; - return(OK); - case BSIM4_MOD_ETAB: - value->rValue = model->BSIM4etab; - return(OK); - case BSIM4_MOD_PCLM: - value->rValue = model->BSIM4pclm; - return(OK); - case BSIM4_MOD_PDIBL1: - value->rValue = model->BSIM4pdibl1; - return(OK); - case BSIM4_MOD_PDIBL2: - value->rValue = model->BSIM4pdibl2; - return(OK); - case BSIM4_MOD_PDIBLB: - value->rValue = model->BSIM4pdiblb; - return(OK); - case BSIM4_MOD_PSCBE1: - value->rValue = model->BSIM4pscbe1; - return(OK); - case BSIM4_MOD_PSCBE2: - value->rValue = model->BSIM4pscbe2; - return(OK); - case BSIM4_MOD_PVAG: - value->rValue = model->BSIM4pvag; - return(OK); - case BSIM4_MOD_WR: - value->rValue = model->BSIM4wr; - return(OK); - case BSIM4_MOD_DWG: - value->rValue = model->BSIM4dwg; - return(OK); - case BSIM4_MOD_DWB: - value->rValue = model->BSIM4dwb; - return(OK); - case BSIM4_MOD_B0: - value->rValue = model->BSIM4b0; - return(OK); - case BSIM4_MOD_B1: - value->rValue = model->BSIM4b1; - return(OK); - case BSIM4_MOD_ALPHA0: - value->rValue = model->BSIM4alpha0; - return(OK); - case BSIM4_MOD_ALPHA1: - value->rValue = model->BSIM4alpha1; - return(OK); - case BSIM4_MOD_BETA0: - value->rValue = model->BSIM4beta0; - return(OK); - case BSIM4_MOD_AGIDL: - value->rValue = model->BSIM4agidl; - return(OK); - case BSIM4_MOD_BGIDL: - value->rValue = model->BSIM4bgidl; - return(OK); - case BSIM4_MOD_CGIDL: - value->rValue = model->BSIM4cgidl; - return(OK); - case BSIM4_MOD_EGIDL: - value->rValue = model->BSIM4egidl; - return(OK); - case BSIM4_MOD_FGIDL: /* v4.7 New GIDL/GISL*/ - value->rValue = model->BSIM4fgidl; - return(OK); - case BSIM4_MOD_KGIDL: /* v4.7 New GIDL/GISL*/ - value->rValue = model->BSIM4kgidl; - return(OK); - case BSIM4_MOD_RGIDL: /* v4.7 New GIDL/GISL*/ - value->rValue = model->BSIM4rgidl; - return(OK); - case BSIM4_MOD_AGISL: - value->rValue = model->BSIM4agisl; - return(OK); - case BSIM4_MOD_BGISL: - value->rValue = model->BSIM4bgisl; - return(OK); - case BSIM4_MOD_CGISL: - value->rValue = model->BSIM4cgisl; - return(OK); - case BSIM4_MOD_EGISL: - value->rValue = model->BSIM4egisl; - return(OK); - case BSIM4_MOD_FGISL: /* v4.7 New GIDL/GISL*/ - value->rValue = model->BSIM4fgisl; - return(OK); - case BSIM4_MOD_KGISL: /* v4.7 New GIDL/GISL*/ - value->rValue = model->BSIM4kgisl; - return(OK); - case BSIM4_MOD_RGISL: /* v4.7 New GIDL/GISL*/ - value->rValue = model->BSIM4rgisl; - return(OK); - case BSIM4_MOD_AIGC: - value->rValue = model->BSIM4aigc; - return(OK); - case BSIM4_MOD_BIGC: - value->rValue = model->BSIM4bigc; - return(OK); - case BSIM4_MOD_CIGC: - value->rValue = model->BSIM4cigc; - return(OK); - case BSIM4_MOD_AIGSD: - value->rValue = model->BSIM4aigsd; - return(OK); - case BSIM4_MOD_BIGSD: - value->rValue = model->BSIM4bigsd; - return(OK); - case BSIM4_MOD_CIGSD: - value->rValue = model->BSIM4cigsd; - return(OK); - case BSIM4_MOD_AIGS: - value->rValue = model->BSIM4aigs; - return(OK); - case BSIM4_MOD_BIGS: - value->rValue = model->BSIM4bigs; - return(OK); - case BSIM4_MOD_CIGS: - value->rValue = model->BSIM4cigs; - return(OK); - case BSIM4_MOD_AIGD: - value->rValue = model->BSIM4aigd; - return(OK); - case BSIM4_MOD_BIGD: - value->rValue = model->BSIM4bigd; - return(OK); - case BSIM4_MOD_CIGD: - value->rValue = model->BSIM4cigd; - return(OK); - case BSIM4_MOD_AIGBACC: - value->rValue = model->BSIM4aigbacc; - return(OK); - case BSIM4_MOD_BIGBACC: - value->rValue = model->BSIM4bigbacc; - return(OK); - case BSIM4_MOD_CIGBACC: - value->rValue = model->BSIM4cigbacc; - return(OK); - case BSIM4_MOD_AIGBINV: - value->rValue = model->BSIM4aigbinv; - return(OK); - case BSIM4_MOD_BIGBINV: - value->rValue = model->BSIM4bigbinv; - return(OK); - case BSIM4_MOD_CIGBINV: - value->rValue = model->BSIM4cigbinv; - return(OK); - case BSIM4_MOD_NIGC: - value->rValue = model->BSIM4nigc; - return(OK); - case BSIM4_MOD_NIGBACC: - value->rValue = model->BSIM4nigbacc; - return(OK); - case BSIM4_MOD_NIGBINV: - value->rValue = model->BSIM4nigbinv; - return(OK); - case BSIM4_MOD_NTOX: - value->rValue = model->BSIM4ntox; - return(OK); - case BSIM4_MOD_EIGBINV: - value->rValue = model->BSIM4eigbinv; - return(OK); - case BSIM4_MOD_PIGCD: - value->rValue = model->BSIM4pigcd; - return(OK); - case BSIM4_MOD_POXEDGE: - value->rValue = model->BSIM4poxedge; - return(OK); - case BSIM4_MOD_PHIN: - value->rValue = model->BSIM4phin; - return(OK); - case BSIM4_MOD_XRCRG1: - value->rValue = model->BSIM4xrcrg1; - return(OK); - case BSIM4_MOD_XRCRG2: - value->rValue = model->BSIM4xrcrg2; - return(OK); - case BSIM4_MOD_TNOIA: - value->rValue = model->BSIM4tnoia; - return(OK); - case BSIM4_MOD_TNOIB: - value->rValue = model->BSIM4tnoib; - return(OK); - case BSIM4_MOD_TNOIC: - value->rValue = model->BSIM4tnoic; - return(OK); - case BSIM4_MOD_RNOIA: - value->rValue = model->BSIM4rnoia; - return(OK); - case BSIM4_MOD_RNOIB: - value->rValue = model->BSIM4rnoib; - return(OK); - case BSIM4_MOD_RNOIC: - value->rValue = model->BSIM4rnoic; - return(OK); - case BSIM4_MOD_NTNOI: - value->rValue = model->BSIM4ntnoi; - return(OK); - case BSIM4_MOD_IJTHDFWD: - value->rValue = model->BSIM4ijthdfwd; - return(OK); - case BSIM4_MOD_IJTHSFWD: - value->rValue = model->BSIM4ijthsfwd; - return(OK); - case BSIM4_MOD_IJTHDREV: - value->rValue = model->BSIM4ijthdrev; - return(OK); - case BSIM4_MOD_IJTHSREV: - value->rValue = model->BSIM4ijthsrev; - return(OK); - case BSIM4_MOD_XJBVD: - value->rValue = model->BSIM4xjbvd; - return(OK); - case BSIM4_MOD_XJBVS: - value->rValue = model->BSIM4xjbvs; - return(OK); - case BSIM4_MOD_BVD: - value->rValue = model->BSIM4bvd; - return(OK); - case BSIM4_MOD_BVS: - value->rValue = model->BSIM4bvs; - return(OK); - case BSIM4_MOD_VFB: - value->rValue = model->BSIM4vfb; - return(OK); - - case BSIM4_MOD_JTSS: - value->rValue = model->BSIM4jtss; - return(OK); - case BSIM4_MOD_JTSD: - value->rValue = model->BSIM4jtsd; - return(OK); - case BSIM4_MOD_JTSSWS: - value->rValue = model->BSIM4jtssws; - return(OK); - case BSIM4_MOD_JTSSWD: - value->rValue = model->BSIM4jtsswd; - return(OK); - case BSIM4_MOD_JTSSWGS: - value->rValue = model->BSIM4jtsswgs; - return(OK); - case BSIM4_MOD_JTSSWGD: - value->rValue = model->BSIM4jtsswgd; - return(OK); - case BSIM4_MOD_JTWEFF: - value->rValue = model->BSIM4jtweff; - return(OK); - case BSIM4_MOD_NJTS: - value->rValue = model->BSIM4njts; - return(OK); - case BSIM4_MOD_NJTSSW: - value->rValue = model->BSIM4njtssw; - return(OK); - case BSIM4_MOD_NJTSSWG: - value->rValue = model->BSIM4njtsswg; - return(OK); - case BSIM4_MOD_NJTSD: - value->rValue = model->BSIM4njtsd; - return(OK); - case BSIM4_MOD_NJTSSWD: - value->rValue = model->BSIM4njtsswd; - return(OK); - case BSIM4_MOD_NJTSSWGD: - value->rValue = model->BSIM4njtsswgd; - return(OK); - case BSIM4_MOD_XTSS: - value->rValue = model->BSIM4xtss; - return(OK); - case BSIM4_MOD_XTSD: - value->rValue = model->BSIM4xtsd; - return(OK); - case BSIM4_MOD_XTSSWS: - value->rValue = model->BSIM4xtssws; - return(OK); - case BSIM4_MOD_XTSSWD: - value->rValue = model->BSIM4xtsswd; - return(OK); - case BSIM4_MOD_XTSSWGS: - value->rValue = model->BSIM4xtsswgs; - return(OK); - case BSIM4_MOD_XTSSWGD: - value->rValue = model->BSIM4xtsswgd; - return(OK); - case BSIM4_MOD_TNJTS: - value->rValue = model->BSIM4tnjts; - return(OK); - case BSIM4_MOD_TNJTSSW: - value->rValue = model->BSIM4tnjtssw; - return(OK); - case BSIM4_MOD_TNJTSSWG: - value->rValue = model->BSIM4tnjtsswg; - return(OK); - case BSIM4_MOD_TNJTSD: - value->rValue = model->BSIM4tnjtsd; - return(OK); - case BSIM4_MOD_TNJTSSWD: - value->rValue = model->BSIM4tnjtsswd; - return(OK); - case BSIM4_MOD_TNJTSSWGD: - value->rValue = model->BSIM4tnjtsswgd; - return(OK); - case BSIM4_MOD_VTSS: - value->rValue = model->BSIM4vtss; - return(OK); - case BSIM4_MOD_VTSD: - value->rValue = model->BSIM4vtsd; - return(OK); - case BSIM4_MOD_VTSSWS: - value->rValue = model->BSIM4vtssws; - return(OK); - case BSIM4_MOD_VTSSWD: - value->rValue = model->BSIM4vtsswd; - return(OK); - case BSIM4_MOD_VTSSWGS: - value->rValue = model->BSIM4vtsswgs; - return(OK); - case BSIM4_MOD_VTSSWGD: - value->rValue = model->BSIM4vtsswgd; - return(OK); - - case BSIM4_MOD_GBMIN: - value->rValue = model->BSIM4gbmin; - return(OK); - case BSIM4_MOD_RBDB: - value->rValue = model->BSIM4rbdb; - return(OK); - case BSIM4_MOD_RBPB: - value->rValue = model->BSIM4rbpb; - return(OK); - case BSIM4_MOD_RBSB: - value->rValue = model->BSIM4rbsb; - return(OK); - case BSIM4_MOD_RBPS: - value->rValue = model->BSIM4rbps; - return(OK); - case BSIM4_MOD_RBPD: - value->rValue = model->BSIM4rbpd; - return(OK); - - case BSIM4_MOD_RBPS0: - value->rValue = model->BSIM4rbps0; - return(OK); - case BSIM4_MOD_RBPSL: - value->rValue = model->BSIM4rbpsl; - return(OK); - case BSIM4_MOD_RBPSW: - value->rValue = model->BSIM4rbpsw; - return(OK); - case BSIM4_MOD_RBPSNF: - value->rValue = model->BSIM4rbpsnf; - return(OK); - case BSIM4_MOD_RBPD0: - value->rValue = model->BSIM4rbpd0; - return(OK); - case BSIM4_MOD_RBPDL: - value->rValue = model->BSIM4rbpdl; - return(OK); - case BSIM4_MOD_RBPDW: - value->rValue = model->BSIM4rbpdw; - return(OK); - case BSIM4_MOD_RBPDNF: - value->rValue = model->BSIM4rbpdnf; - return(OK); - case BSIM4_MOD_RBPBX0: - value->rValue = model->BSIM4rbpbx0; - return(OK); - case BSIM4_MOD_RBPBXL: - value->rValue = model->BSIM4rbpbxl; - return(OK); - case BSIM4_MOD_RBPBXW: - value->rValue = model->BSIM4rbpbxw; - return(OK); - case BSIM4_MOD_RBPBXNF: - value->rValue = model->BSIM4rbpbxnf; - return(OK); - case BSIM4_MOD_RBPBY0: - value->rValue = model->BSIM4rbpby0; - return(OK); - case BSIM4_MOD_RBPBYL: - value->rValue = model->BSIM4rbpbyl; - return(OK); - case BSIM4_MOD_RBPBYW: - value->rValue = model->BSIM4rbpbyw; - return(OK); - case BSIM4_MOD_RBPBYNF: - value->rValue = model->BSIM4rbpbynf; - return(OK); - - case BSIM4_MOD_RBSBX0: - value->rValue = model->BSIM4rbsbx0; - return(OK); - case BSIM4_MOD_RBSBY0: - value->rValue = model->BSIM4rbsby0; - return(OK); - case BSIM4_MOD_RBDBX0: - value->rValue = model->BSIM4rbdbx0; - return(OK); - case BSIM4_MOD_RBDBY0: - value->rValue = model->BSIM4rbdby0; - return(OK); - case BSIM4_MOD_RBSDBXL: - value->rValue = model->BSIM4rbsdbxl; - return(OK); - case BSIM4_MOD_RBSDBXW: - value->rValue = model->BSIM4rbsdbxw; - return(OK); - case BSIM4_MOD_RBSDBXNF: - value->rValue = model->BSIM4rbsdbxnf; - return(OK); - case BSIM4_MOD_RBSDBYL: - value->rValue = model->BSIM4rbsdbyl; - return(OK); - case BSIM4_MOD_RBSDBYW: - value->rValue = model->BSIM4rbsdbyw; - return(OK); - case BSIM4_MOD_RBSDBYNF: - value->rValue = model->BSIM4rbsdbynf; - return(OK); - - - case BSIM4_MOD_CGSL: - value->rValue = model->BSIM4cgsl; - return(OK); - case BSIM4_MOD_CGDL: - value->rValue = model->BSIM4cgdl; - return(OK); - case BSIM4_MOD_CKAPPAS: - value->rValue = model->BSIM4ckappas; - return(OK); - case BSIM4_MOD_CKAPPAD: - value->rValue = model->BSIM4ckappad; - return(OK); - case BSIM4_MOD_CF: - value->rValue = model->BSIM4cf; - return(OK); - case BSIM4_MOD_CLC: - value->rValue = model->BSIM4clc; - return(OK); - case BSIM4_MOD_CLE: - value->rValue = model->BSIM4cle; - return(OK); - case BSIM4_MOD_DWC: - value->rValue = model->BSIM4dwc; - return(OK); - case BSIM4_MOD_DLC: - value->rValue = model->BSIM4dlc; - return(OK); - case BSIM4_MOD_XW: - value->rValue = model->BSIM4xw; - return(OK); - case BSIM4_MOD_XL: - value->rValue = model->BSIM4xl; - return(OK); - case BSIM4_MOD_DLCIG: - value->rValue = model->BSIM4dlcig; - return(OK); - case BSIM4_MOD_DLCIGD: - value->rValue = model->BSIM4dlcigd; - return(OK); - case BSIM4_MOD_DWJ: - value->rValue = model->BSIM4dwj; - return(OK); - case BSIM4_MOD_VFBCV: - value->rValue = model->BSIM4vfbcv; - return(OK); - case BSIM4_MOD_ACDE: - value->rValue = model->BSIM4acde; - return(OK); - case BSIM4_MOD_MOIN: - value->rValue = model->BSIM4moin; - return(OK); - case BSIM4_MOD_NOFF: - value->rValue = model->BSIM4noff; - return(OK); - case BSIM4_MOD_VOFFCV: - value->rValue = model->BSIM4voffcv; - return(OK); - case BSIM4_MOD_DMCG: - value->rValue = model->BSIM4dmcg; - return(OK); - case BSIM4_MOD_DMCI: - value->rValue = model->BSIM4dmci; - return(OK); - case BSIM4_MOD_DMDG: - value->rValue = model->BSIM4dmdg; - return(OK); - case BSIM4_MOD_DMCGT: - value->rValue = model->BSIM4dmcgt; - return(OK); - case BSIM4_MOD_XGW: - value->rValue = model->BSIM4xgw; - return(OK); - case BSIM4_MOD_XGL: - value->rValue = model->BSIM4xgl; - return(OK); - case BSIM4_MOD_RSHG: - value->rValue = model->BSIM4rshg; - return(OK); - case BSIM4_MOD_NGCON: - value->rValue = model->BSIM4ngcon; - return(OK); - case BSIM4_MOD_TCJ: - value->rValue = model->BSIM4tcj; - return(OK); - case BSIM4_MOD_TPB: - value->rValue = model->BSIM4tpb; - return(OK); - case BSIM4_MOD_TCJSW: - value->rValue = model->BSIM4tcjsw; - return(OK); - case BSIM4_MOD_TPBSW: - value->rValue = model->BSIM4tpbsw; - return(OK); - case BSIM4_MOD_TCJSWG: - value->rValue = model->BSIM4tcjswg; - return(OK); - case BSIM4_MOD_TPBSWG: - value->rValue = model->BSIM4tpbswg; - return(OK); - - /* Length dependence */ - case BSIM4_MOD_LCDSC : - value->rValue = model->BSIM4lcdsc; - return(OK); - case BSIM4_MOD_LCDSCB : - value->rValue = model->BSIM4lcdscb; - return(OK); - case BSIM4_MOD_LCDSCD : - value->rValue = model->BSIM4lcdscd; - return(OK); - case BSIM4_MOD_LCIT : - value->rValue = model->BSIM4lcit; - return(OK); - case BSIM4_MOD_LNFACTOR : - value->rValue = model->BSIM4lnfactor; - return(OK); - case BSIM4_MOD_LXJ: - value->rValue = model->BSIM4lxj; - return(OK); - case BSIM4_MOD_LVSAT: - value->rValue = model->BSIM4lvsat; - return(OK); - case BSIM4_MOD_LAT: - value->rValue = model->BSIM4lat; - return(OK); - case BSIM4_MOD_LA0: - value->rValue = model->BSIM4la0; - return(OK); - case BSIM4_MOD_LAGS: - value->rValue = model->BSIM4lags; - return(OK); - case BSIM4_MOD_LA1: - value->rValue = model->BSIM4la1; - return(OK); - case BSIM4_MOD_LA2: - value->rValue = model->BSIM4la2; - return(OK); - case BSIM4_MOD_LKETA: - value->rValue = model->BSIM4lketa; - return(OK); - case BSIM4_MOD_LNSUB: - value->rValue = model->BSIM4lnsub; - return(OK); - case BSIM4_MOD_LNDEP: - value->rValue = model->BSIM4lndep; - return(OK); - case BSIM4_MOD_LNSD: - value->rValue = model->BSIM4lnsd; - return(OK); - case BSIM4_MOD_LNGATE: - value->rValue = model->BSIM4lngate; - return(OK); - case BSIM4_MOD_LGAMMA1: - value->rValue = model->BSIM4lgamma1; - return(OK); - case BSIM4_MOD_LGAMMA2: - value->rValue = model->BSIM4lgamma2; - return(OK); - case BSIM4_MOD_LVBX: - value->rValue = model->BSIM4lvbx; - return(OK); - case BSIM4_MOD_LVBM: - value->rValue = model->BSIM4lvbm; - return(OK); - case BSIM4_MOD_LXT: - value->rValue = model->BSIM4lxt; - return(OK); - case BSIM4_MOD_LK1: - value->rValue = model->BSIM4lk1; - return(OK); - case BSIM4_MOD_LKT1: - value->rValue = model->BSIM4lkt1; - return(OK); - case BSIM4_MOD_LKT1L: - value->rValue = model->BSIM4lkt1l; - return(OK); - case BSIM4_MOD_LKT2 : - value->rValue = model->BSIM4lkt2; - return(OK); - case BSIM4_MOD_LK2 : - value->rValue = model->BSIM4lk2; - return(OK); - case BSIM4_MOD_LK3: - value->rValue = model->BSIM4lk3; - return(OK); - case BSIM4_MOD_LK3B: - value->rValue = model->BSIM4lk3b; - return(OK); - case BSIM4_MOD_LW0: - value->rValue = model->BSIM4lw0; - return(OK); - case BSIM4_MOD_LLPE0: - value->rValue = model->BSIM4llpe0; - return(OK); - case BSIM4_MOD_LLPEB: - value->rValue = model->BSIM4llpeb; - return(OK); - case BSIM4_MOD_LDVTP0: - value->rValue = model->BSIM4ldvtp0; - return(OK); - case BSIM4_MOD_LDVTP1: - value->rValue = model->BSIM4ldvtp1; - return(OK); - case BSIM4_MOD_LDVTP2: - value->rValue = model->BSIM4ldvtp2; /* New DIBL/Rout */ - return(OK); - case BSIM4_MOD_LDVTP3: - value->rValue = model->BSIM4ldvtp3; - return(OK); - case BSIM4_MOD_LDVTP4: - value->rValue = model->BSIM4ldvtp4; - return(OK); - case BSIM4_MOD_LDVTP5: - value->rValue = model->BSIM4ldvtp5; - return(OK); - case BSIM4_MOD_LDVT0: - value->rValue = model->BSIM4ldvt0; - return(OK); - case BSIM4_MOD_LDVT1 : - value->rValue = model->BSIM4ldvt1; - return(OK); - case BSIM4_MOD_LDVT2 : - value->rValue = model->BSIM4ldvt2; - return(OK); - case BSIM4_MOD_LDVT0W : - value->rValue = model->BSIM4ldvt0w; - return(OK); - case BSIM4_MOD_LDVT1W : - value->rValue = model->BSIM4ldvt1w; - return(OK); - case BSIM4_MOD_LDVT2W : - value->rValue = model->BSIM4ldvt2w; - return(OK); - case BSIM4_MOD_LDROUT : - value->rValue = model->BSIM4ldrout; - return(OK); - case BSIM4_MOD_LDSUB : - value->rValue = model->BSIM4ldsub; - return(OK); - case BSIM4_MOD_LVTH0: - value->rValue = model->BSIM4lvth0; - return(OK); - case BSIM4_MOD_LUA: - value->rValue = model->BSIM4lua; - return(OK); - case BSIM4_MOD_LUA1: - value->rValue = model->BSIM4lua1; - return(OK); - case BSIM4_MOD_LUB: - value->rValue = model->BSIM4lub; - return(OK); - case BSIM4_MOD_LUB1: - value->rValue = model->BSIM4lub1; - return(OK); - case BSIM4_MOD_LUC: - value->rValue = model->BSIM4luc; - return(OK); - case BSIM4_MOD_LUC1: - value->rValue = model->BSIM4luc1; - return(OK); - case BSIM4_MOD_LUD: - value->rValue = model->BSIM4lud; - return(OK); - case BSIM4_MOD_LUD1: - value->rValue = model->BSIM4lud1; - return(OK); - case BSIM4_MOD_LUP: - value->rValue = model->BSIM4lup; - return(OK); - case BSIM4_MOD_LLP: - value->rValue = model->BSIM4llp; - return(OK); - case BSIM4_MOD_LU0: - value->rValue = model->BSIM4lu0; - return(OK); - case BSIM4_MOD_LUTE: - value->rValue = model->BSIM4lute; - return(OK); - case BSIM4_MOD_LUCSTE: - value->rValue = model->BSIM4lucste; - return(OK); - case BSIM4_MOD_LVOFF: - value->rValue = model->BSIM4lvoff; - return(OK); - case BSIM4_MOD_LTVOFF: - value->rValue = model->BSIM4ltvoff; - return(OK); - case BSIM4_MOD_LTNFACTOR: /* v4.7 temp dep of leakage current */ - value->rValue = model->BSIM4ltnfactor; - return(OK); - case BSIM4_MOD_LTETA0: /* v4.7 temp dep of leakage current */ - value->rValue = model->BSIM4lteta0; - return(OK); - case BSIM4_MOD_LTVOFFCV: /* v4.7 temp dep of leakage current */ - value->rValue = model->BSIM4ltvoffcv; - return(OK); - case BSIM4_MOD_LMINV: - value->rValue = model->BSIM4lminv; - return(OK); - case BSIM4_MOD_LMINVCV: - value->rValue = model->BSIM4lminvcv; - return(OK); - case BSIM4_MOD_LFPROUT: - value->rValue = model->BSIM4lfprout; - return(OK); - case BSIM4_MOD_LPDITS: - value->rValue = model->BSIM4lpdits; - return(OK); - case BSIM4_MOD_LPDITSD: - value->rValue = model->BSIM4lpditsd; - return(OK); - case BSIM4_MOD_LDELTA: - value->rValue = model->BSIM4ldelta; - return(OK); - case BSIM4_MOD_LRDSW: - value->rValue = model->BSIM4lrdsw; - return(OK); - case BSIM4_MOD_LRDW: - value->rValue = model->BSIM4lrdw; - return(OK); - case BSIM4_MOD_LRSW: - value->rValue = model->BSIM4lrsw; - return(OK); - case BSIM4_MOD_LPRWB: - value->rValue = model->BSIM4lprwb; - return(OK); - case BSIM4_MOD_LPRWG: - value->rValue = model->BSIM4lprwg; - return(OK); - case BSIM4_MOD_LPRT: - value->rValue = model->BSIM4lprt; - return(OK); - case BSIM4_MOD_LETA0: - value->rValue = model->BSIM4leta0; - return(OK); - case BSIM4_MOD_LETAB: - value->rValue = model->BSIM4letab; - return(OK); - case BSIM4_MOD_LPCLM: - value->rValue = model->BSIM4lpclm; - return(OK); - case BSIM4_MOD_LPDIBL1: - value->rValue = model->BSIM4lpdibl1; - return(OK); - case BSIM4_MOD_LPDIBL2: - value->rValue = model->BSIM4lpdibl2; - return(OK); - case BSIM4_MOD_LPDIBLB: - value->rValue = model->BSIM4lpdiblb; - return(OK); - case BSIM4_MOD_LPSCBE1: - value->rValue = model->BSIM4lpscbe1; - return(OK); - case BSIM4_MOD_LPSCBE2: - value->rValue = model->BSIM4lpscbe2; - return(OK); - case BSIM4_MOD_LPVAG: - value->rValue = model->BSIM4lpvag; - return(OK); - case BSIM4_MOD_LWR: - value->rValue = model->BSIM4lwr; - return(OK); - case BSIM4_MOD_LDWG: - value->rValue = model->BSIM4ldwg; - return(OK); - case BSIM4_MOD_LDWB: - value->rValue = model->BSIM4ldwb; - return(OK); - case BSIM4_MOD_LB0: - value->rValue = model->BSIM4lb0; - return(OK); - case BSIM4_MOD_LB1: - value->rValue = model->BSIM4lb1; - return(OK); - case BSIM4_MOD_LALPHA0: - value->rValue = model->BSIM4lalpha0; - return(OK); - case BSIM4_MOD_LALPHA1: - value->rValue = model->BSIM4lalpha1; - return(OK); - case BSIM4_MOD_LBETA0: - value->rValue = model->BSIM4lbeta0; - return(OK); - case BSIM4_MOD_LAGIDL: - value->rValue = model->BSIM4lagidl; - return(OK); - case BSIM4_MOD_LBGIDL: - value->rValue = model->BSIM4lbgidl; - return(OK); - case BSIM4_MOD_LCGIDL: - value->rValue = model->BSIM4lcgidl; - return(OK); - case BSIM4_MOD_LEGIDL: - value->rValue = model->BSIM4legidl; - return(OK); - case BSIM4_MOD_LFGIDL: /* v4.7 New GIDL/GISL*/ - value->rValue = model->BSIM4lfgidl; - return(OK); - case BSIM4_MOD_LKGIDL: /* v4.7 New GIDL/GISL*/ - value->rValue = model->BSIM4lkgidl; - return(OK); - case BSIM4_MOD_LRGIDL: /* v4.7 New GIDL/GISL*/ - value->rValue = model->BSIM4lrgidl; - return(OK); - case BSIM4_MOD_LAGISL: - value->rValue = model->BSIM4lagisl; - return(OK); - case BSIM4_MOD_LBGISL: - value->rValue = model->BSIM4lbgisl; - return(OK); - case BSIM4_MOD_LCGISL: - value->rValue = model->BSIM4lcgisl; - return(OK); - case BSIM4_MOD_LEGISL: - value->rValue = model->BSIM4legisl; - return(OK); - case BSIM4_MOD_LFGISL: /* v4.7 New GIDL/GISL*/ - value->rValue = model->BSIM4lfgisl; - return(OK); - case BSIM4_MOD_LKGISL: /* v4.7 New GIDL/GISL*/ - value->rValue = model->BSIM4lkgisl; - return(OK); - case BSIM4_MOD_LRGISL: /* v4.7 New GIDL/GISL*/ - value->rValue = model->BSIM4lrgisl; - return(OK); - case BSIM4_MOD_LAIGC: - value->rValue = model->BSIM4laigc; - return(OK); - case BSIM4_MOD_LBIGC: - value->rValue = model->BSIM4lbigc; - return(OK); - case BSIM4_MOD_LCIGC: - value->rValue = model->BSIM4lcigc; - return(OK); - case BSIM4_MOD_LAIGSD: - value->rValue = model->BSIM4laigsd; - return(OK); - case BSIM4_MOD_LBIGSD: - value->rValue = model->BSIM4lbigsd; - return(OK); - case BSIM4_MOD_LCIGSD: - value->rValue = model->BSIM4lcigsd; - return(OK); - case BSIM4_MOD_LAIGS: - value->rValue = model->BSIM4laigs; - return(OK); - case BSIM4_MOD_LBIGS: - value->rValue = model->BSIM4lbigs; - return(OK); - case BSIM4_MOD_LCIGS: - value->rValue = model->BSIM4lcigs; - return(OK); - case BSIM4_MOD_LAIGD: - value->rValue = model->BSIM4laigd; - return(OK); - case BSIM4_MOD_LBIGD: - value->rValue = model->BSIM4lbigd; - return(OK); - case BSIM4_MOD_LCIGD: - value->rValue = model->BSIM4lcigd; - return(OK); - case BSIM4_MOD_LAIGBACC: - value->rValue = model->BSIM4laigbacc; - return(OK); - case BSIM4_MOD_LBIGBACC: - value->rValue = model->BSIM4lbigbacc; - return(OK); - case BSIM4_MOD_LCIGBACC: - value->rValue = model->BSIM4lcigbacc; - return(OK); - case BSIM4_MOD_LAIGBINV: - value->rValue = model->BSIM4laigbinv; - return(OK); - case BSIM4_MOD_LBIGBINV: - value->rValue = model->BSIM4lbigbinv; - return(OK); - case BSIM4_MOD_LCIGBINV: - value->rValue = model->BSIM4lcigbinv; - return(OK); - case BSIM4_MOD_LNIGC: - value->rValue = model->BSIM4lnigc; - return(OK); - case BSIM4_MOD_LNIGBACC: - value->rValue = model->BSIM4lnigbacc; - return(OK); - case BSIM4_MOD_LNIGBINV: - value->rValue = model->BSIM4lnigbinv; - return(OK); - case BSIM4_MOD_LNTOX: - value->rValue = model->BSIM4lntox; - return(OK); - case BSIM4_MOD_LEIGBINV: - value->rValue = model->BSIM4leigbinv; - return(OK); - case BSIM4_MOD_LPIGCD: - value->rValue = model->BSIM4lpigcd; - return(OK); - case BSIM4_MOD_LPOXEDGE: - value->rValue = model->BSIM4lpoxedge; - return(OK); - case BSIM4_MOD_LPHIN: - value->rValue = model->BSIM4lphin; - return(OK); - case BSIM4_MOD_LXRCRG1: - value->rValue = model->BSIM4lxrcrg1; - return(OK); - case BSIM4_MOD_LXRCRG2: - value->rValue = model->BSIM4lxrcrg2; - return(OK); - case BSIM4_MOD_LEU: - value->rValue = model->BSIM4leu; - return(OK); - case BSIM4_MOD_LUCS: - value->rValue = model->BSIM4lucs; - return(OK); - case BSIM4_MOD_LVFB: - value->rValue = model->BSIM4lvfb; - return(OK); - - case BSIM4_MOD_LCGSL: - value->rValue = model->BSIM4lcgsl; - return(OK); - case BSIM4_MOD_LCGDL: - value->rValue = model->BSIM4lcgdl; - return(OK); - case BSIM4_MOD_LCKAPPAS: - value->rValue = model->BSIM4lckappas; - return(OK); - case BSIM4_MOD_LCKAPPAD: - value->rValue = model->BSIM4lckappad; - return(OK); - case BSIM4_MOD_LCF: - value->rValue = model->BSIM4lcf; - return(OK); - case BSIM4_MOD_LCLC: - value->rValue = model->BSIM4lclc; - return(OK); - case BSIM4_MOD_LCLE: - value->rValue = model->BSIM4lcle; - return(OK); - case BSIM4_MOD_LVFBCV: - value->rValue = model->BSIM4lvfbcv; - return(OK); - case BSIM4_MOD_LACDE: - value->rValue = model->BSIM4lacde; - return(OK); - case BSIM4_MOD_LMOIN: - value->rValue = model->BSIM4lmoin; - return(OK); - case BSIM4_MOD_LNOFF: - value->rValue = model->BSIM4lnoff; - return(OK); - case BSIM4_MOD_LVOFFCV: - value->rValue = model->BSIM4lvoffcv; - return(OK); - case BSIM4_MOD_LVFBSDOFF: - value->rValue = model->BSIM4lvfbsdoff; - return(OK); - case BSIM4_MOD_LTVFBSDOFF: - value->rValue = model->BSIM4ltvfbsdoff; - return(OK); - - case BSIM4_MOD_LLAMBDA: - value->rValue = model->BSIM4llambda; - return(OK); - case BSIM4_MOD_LVTL: - value->rValue = model->BSIM4lvtl; - return(OK); - case BSIM4_MOD_LXN: - value->rValue = model->BSIM4lxn; - return(OK); - - /* Width dependence */ - case BSIM4_MOD_WCDSC : - value->rValue = model->BSIM4wcdsc; - return(OK); - case BSIM4_MOD_WCDSCB : - value->rValue = model->BSIM4wcdscb; - return(OK); - case BSIM4_MOD_WCDSCD : - value->rValue = model->BSIM4wcdscd; - return(OK); - case BSIM4_MOD_WCIT : - value->rValue = model->BSIM4wcit; - return(OK); - case BSIM4_MOD_WNFACTOR : - value->rValue = model->BSIM4wnfactor; - return(OK); - case BSIM4_MOD_WXJ: - value->rValue = model->BSIM4wxj; - return(OK); - case BSIM4_MOD_WVSAT: - value->rValue = model->BSIM4wvsat; - return(OK); - case BSIM4_MOD_WAT: - value->rValue = model->BSIM4wat; - return(OK); - case BSIM4_MOD_WA0: - value->rValue = model->BSIM4wa0; - return(OK); - case BSIM4_MOD_WAGS: - value->rValue = model->BSIM4wags; - return(OK); - case BSIM4_MOD_WA1: - value->rValue = model->BSIM4wa1; - return(OK); - case BSIM4_MOD_WA2: - value->rValue = model->BSIM4wa2; - return(OK); - case BSIM4_MOD_WKETA: - value->rValue = model->BSIM4wketa; - return(OK); - case BSIM4_MOD_WNSUB: - value->rValue = model->BSIM4wnsub; - return(OK); - case BSIM4_MOD_WNDEP: - value->rValue = model->BSIM4wndep; - return(OK); - case BSIM4_MOD_WNSD: - value->rValue = model->BSIM4wnsd; - return(OK); - case BSIM4_MOD_WNGATE: - value->rValue = model->BSIM4wngate; - return(OK); - case BSIM4_MOD_WGAMMA1: - value->rValue = model->BSIM4wgamma1; - return(OK); - case BSIM4_MOD_WGAMMA2: - value->rValue = model->BSIM4wgamma2; - return(OK); - case BSIM4_MOD_WVBX: - value->rValue = model->BSIM4wvbx; - return(OK); - case BSIM4_MOD_WVBM: - value->rValue = model->BSIM4wvbm; - return(OK); - case BSIM4_MOD_WXT: - value->rValue = model->BSIM4wxt; - return(OK); - case BSIM4_MOD_WK1: - value->rValue = model->BSIM4wk1; - return(OK); - case BSIM4_MOD_WKT1: - value->rValue = model->BSIM4wkt1; - return(OK); - case BSIM4_MOD_WKT1L: - value->rValue = model->BSIM4wkt1l; - return(OK); - case BSIM4_MOD_WKT2 : - value->rValue = model->BSIM4wkt2; - return(OK); - case BSIM4_MOD_WK2 : - value->rValue = model->BSIM4wk2; - return(OK); - case BSIM4_MOD_WK3: - value->rValue = model->BSIM4wk3; - return(OK); - case BSIM4_MOD_WK3B: - value->rValue = model->BSIM4wk3b; - return(OK); - case BSIM4_MOD_WW0: - value->rValue = model->BSIM4ww0; - return(OK); - case BSIM4_MOD_WLPE0: - value->rValue = model->BSIM4wlpe0; - return(OK); - case BSIM4_MOD_WDVTP0: - value->rValue = model->BSIM4wdvtp0; - return(OK); - case BSIM4_MOD_WDVTP1: - value->rValue = model->BSIM4wdvtp1; - return(OK); - case BSIM4_MOD_WDVTP2: - value->rValue = model->BSIM4wdvtp2; /* New DIBL/Rout */ - return(OK); - case BSIM4_MOD_WDVTP3: - value->rValue = model->BSIM4wdvtp3; - return(OK); - case BSIM4_MOD_WDVTP4: - value->rValue = model->BSIM4wdvtp4; - return(OK); - case BSIM4_MOD_WDVTP5: - value->rValue = model->BSIM4wdvtp5; - return(OK); - case BSIM4_MOD_WLPEB: - value->rValue = model->BSIM4wlpeb; - return(OK); - case BSIM4_MOD_WDVT0: - value->rValue = model->BSIM4wdvt0; - return(OK); - case BSIM4_MOD_WDVT1 : - value->rValue = model->BSIM4wdvt1; - return(OK); - case BSIM4_MOD_WDVT2 : - value->rValue = model->BSIM4wdvt2; - return(OK); - case BSIM4_MOD_WDVT0W : - value->rValue = model->BSIM4wdvt0w; - return(OK); - case BSIM4_MOD_WDVT1W : - value->rValue = model->BSIM4wdvt1w; - return(OK); - case BSIM4_MOD_WDVT2W : - value->rValue = model->BSIM4wdvt2w; - return(OK); - case BSIM4_MOD_WDROUT : - value->rValue = model->BSIM4wdrout; - return(OK); - case BSIM4_MOD_WDSUB : - value->rValue = model->BSIM4wdsub; - return(OK); - case BSIM4_MOD_WVTH0: - value->rValue = model->BSIM4wvth0; - return(OK); - case BSIM4_MOD_WUA: - value->rValue = model->BSIM4wua; - return(OK); - case BSIM4_MOD_WUA1: - value->rValue = model->BSIM4wua1; - return(OK); - case BSIM4_MOD_WUB: - value->rValue = model->BSIM4wub; - return(OK); - case BSIM4_MOD_WUB1: - value->rValue = model->BSIM4wub1; - return(OK); - case BSIM4_MOD_WUC: - value->rValue = model->BSIM4wuc; - return(OK); - case BSIM4_MOD_WUC1: - value->rValue = model->BSIM4wuc1; - return(OK); - case BSIM4_MOD_WUD: - value->rValue = model->BSIM4wud; - return(OK); - case BSIM4_MOD_WUD1: - value->rValue = model->BSIM4wud1; - return(OK); - case BSIM4_MOD_WUP: - value->rValue = model->BSIM4wup; - return(OK); - case BSIM4_MOD_WLP: - value->rValue = model->BSIM4wlp; - return(OK); - case BSIM4_MOD_WU0: - value->rValue = model->BSIM4wu0; - return(OK); - case BSIM4_MOD_WUTE: - value->rValue = model->BSIM4wute; - return(OK); - case BSIM4_MOD_WUCSTE: - value->rValue = model->BSIM4wucste; - return(OK); - case BSIM4_MOD_WVOFF: - value->rValue = model->BSIM4wvoff; - return(OK); - case BSIM4_MOD_WTVOFF: - value->rValue = model->BSIM4wtvoff; - return(OK); - case BSIM4_MOD_WTNFACTOR: /* v4.7 temp dep of leakage current */ - value->rValue = model->BSIM4wtnfactor; - return(OK); - case BSIM4_MOD_WTETA0: /* v4.7 temp dep of leakage current */ - value->rValue = model->BSIM4wteta0; - return(OK); - case BSIM4_MOD_WTVOFFCV: /* v4.7 temp dep of leakage current */ - value->rValue = model->BSIM4wtvoffcv; - return(OK); - case BSIM4_MOD_WMINV: - value->rValue = model->BSIM4wminv; - return(OK); - case BSIM4_MOD_WMINVCV: - value->rValue = model->BSIM4wminvcv; - return(OK); - case BSIM4_MOD_WFPROUT: - value->rValue = model->BSIM4wfprout; - return(OK); - case BSIM4_MOD_WPDITS: - value->rValue = model->BSIM4wpdits; - return(OK); - case BSIM4_MOD_WPDITSD: - value->rValue = model->BSIM4wpditsd; - return(OK); - case BSIM4_MOD_WDELTA: - value->rValue = model->BSIM4wdelta; - return(OK); - case BSIM4_MOD_WRDSW: - value->rValue = model->BSIM4wrdsw; - return(OK); - case BSIM4_MOD_WRDW: - value->rValue = model->BSIM4wrdw; - return(OK); - case BSIM4_MOD_WRSW: - value->rValue = model->BSIM4wrsw; - return(OK); - case BSIM4_MOD_WPRWB: - value->rValue = model->BSIM4wprwb; - return(OK); - case BSIM4_MOD_WPRWG: - value->rValue = model->BSIM4wprwg; - return(OK); - case BSIM4_MOD_WPRT: - value->rValue = model->BSIM4wprt; - return(OK); - case BSIM4_MOD_WETA0: - value->rValue = model->BSIM4weta0; - return(OK); - case BSIM4_MOD_WETAB: - value->rValue = model->BSIM4wetab; - return(OK); - case BSIM4_MOD_WPCLM: - value->rValue = model->BSIM4wpclm; - return(OK); - case BSIM4_MOD_WPDIBL1: - value->rValue = model->BSIM4wpdibl1; - return(OK); - case BSIM4_MOD_WPDIBL2: - value->rValue = model->BSIM4wpdibl2; - return(OK); - case BSIM4_MOD_WPDIBLB: - value->rValue = model->BSIM4wpdiblb; - return(OK); - case BSIM4_MOD_WPSCBE1: - value->rValue = model->BSIM4wpscbe1; - return(OK); - case BSIM4_MOD_WPSCBE2: - value->rValue = model->BSIM4wpscbe2; - return(OK); - case BSIM4_MOD_WPVAG: - value->rValue = model->BSIM4wpvag; - return(OK); - case BSIM4_MOD_WWR: - value->rValue = model->BSIM4wwr; - return(OK); - case BSIM4_MOD_WDWG: - value->rValue = model->BSIM4wdwg; - return(OK); - case BSIM4_MOD_WDWB: - value->rValue = model->BSIM4wdwb; - return(OK); - case BSIM4_MOD_WB0: - value->rValue = model->BSIM4wb0; - return(OK); - case BSIM4_MOD_WB1: - value->rValue = model->BSIM4wb1; - return(OK); - case BSIM4_MOD_WALPHA0: - value->rValue = model->BSIM4walpha0; - return(OK); - case BSIM4_MOD_WALPHA1: - value->rValue = model->BSIM4walpha1; - return(OK); - case BSIM4_MOD_WBETA0: - value->rValue = model->BSIM4wbeta0; - return(OK); - case BSIM4_MOD_WAGIDL: - value->rValue = model->BSIM4wagidl; - return(OK); - case BSIM4_MOD_WBGIDL: - value->rValue = model->BSIM4wbgidl; - return(OK); - case BSIM4_MOD_WCGIDL: - value->rValue = model->BSIM4wcgidl; - return(OK); - case BSIM4_MOD_WEGIDL: - value->rValue = model->BSIM4wegidl; - return(OK); - case BSIM4_MOD_WFGIDL: /* v4.7 New GIDL/GISL*/ - value->rValue = model->BSIM4wfgidl; - return(OK); - case BSIM4_MOD_WKGIDL: /* v4.7 New GIDL/GISL*/ - value->rValue = model->BSIM4wkgidl; - return(OK); - case BSIM4_MOD_WRGIDL: /* v4.7 New GIDL/GISL*/ - value->rValue = model->BSIM4wrgidl; - return(OK); - case BSIM4_MOD_WAGISL: - value->rValue = model->BSIM4wagisl; - return(OK); - case BSIM4_MOD_WBGISL: - value->rValue = model->BSIM4wbgisl; - return(OK); - case BSIM4_MOD_WCGISL: - value->rValue = model->BSIM4wcgisl; - return(OK); - case BSIM4_MOD_WEGISL: - value->rValue = model->BSIM4wegisl; - return(OK); - case BSIM4_MOD_WFGISL: /* v4.7 New GIDL/GISL*/ - value->rValue = model->BSIM4wfgisl; - return(OK); - case BSIM4_MOD_WKGISL: /* v4.7 New GIDL/GISL*/ - value->rValue = model->BSIM4wkgisl; - return(OK); - case BSIM4_MOD_WRGISL: /* v4.7 New GIDL/GISL*/ - value->rValue = model->BSIM4wrgisl; - return(OK); - case BSIM4_MOD_WAIGC: - value->rValue = model->BSIM4waigc; - return(OK); - case BSIM4_MOD_WBIGC: - value->rValue = model->BSIM4wbigc; - return(OK); - case BSIM4_MOD_WCIGC: - value->rValue = model->BSIM4wcigc; - return(OK); - case BSIM4_MOD_WAIGSD: - value->rValue = model->BSIM4waigsd; - return(OK); - case BSIM4_MOD_WBIGSD: - value->rValue = model->BSIM4wbigsd; - return(OK); - case BSIM4_MOD_WCIGSD: - value->rValue = model->BSIM4wcigsd; - return(OK); - case BSIM4_MOD_WAIGS: - value->rValue = model->BSIM4waigs; - return(OK); - case BSIM4_MOD_WBIGS: - value->rValue = model->BSIM4wbigs; - return(OK); - case BSIM4_MOD_WCIGS: - value->rValue = model->BSIM4wcigs; - return(OK); - case BSIM4_MOD_WAIGD: - value->rValue = model->BSIM4waigd; - return(OK); - case BSIM4_MOD_WBIGD: - value->rValue = model->BSIM4wbigd; - return(OK); - case BSIM4_MOD_WCIGD: - value->rValue = model->BSIM4wcigd; - return(OK); - case BSIM4_MOD_WAIGBACC: - value->rValue = model->BSIM4waigbacc; - return(OK); - case BSIM4_MOD_WBIGBACC: - value->rValue = model->BSIM4wbigbacc; - return(OK); - case BSIM4_MOD_WCIGBACC: - value->rValue = model->BSIM4wcigbacc; - return(OK); - case BSIM4_MOD_WAIGBINV: - value->rValue = model->BSIM4waigbinv; - return(OK); - case BSIM4_MOD_WBIGBINV: - value->rValue = model->BSIM4wbigbinv; - return(OK); - case BSIM4_MOD_WCIGBINV: - value->rValue = model->BSIM4wcigbinv; - return(OK); - case BSIM4_MOD_WNIGC: - value->rValue = model->BSIM4wnigc; - return(OK); - case BSIM4_MOD_WNIGBACC: - value->rValue = model->BSIM4wnigbacc; - return(OK); - case BSIM4_MOD_WNIGBINV: - value->rValue = model->BSIM4wnigbinv; - return(OK); - case BSIM4_MOD_WNTOX: - value->rValue = model->BSIM4wntox; - return(OK); - case BSIM4_MOD_WEIGBINV: - value->rValue = model->BSIM4weigbinv; - return(OK); - case BSIM4_MOD_WPIGCD: - value->rValue = model->BSIM4wpigcd; - return(OK); - case BSIM4_MOD_WPOXEDGE: - value->rValue = model->BSIM4wpoxedge; - return(OK); - case BSIM4_MOD_WPHIN: - value->rValue = model->BSIM4wphin; - return(OK); - case BSIM4_MOD_WXRCRG1: - value->rValue = model->BSIM4wxrcrg1; - return(OK); - case BSIM4_MOD_WXRCRG2: - value->rValue = model->BSIM4wxrcrg2; - return(OK); - case BSIM4_MOD_WEU: - value->rValue = model->BSIM4weu; - return(OK); - case BSIM4_MOD_WUCS: - value->rValue = model->BSIM4wucs; - return(OK); - case BSIM4_MOD_WVFB: - value->rValue = model->BSIM4wvfb; - return(OK); - - case BSIM4_MOD_WCGSL: - value->rValue = model->BSIM4wcgsl; - return(OK); - case BSIM4_MOD_WCGDL: - value->rValue = model->BSIM4wcgdl; - return(OK); - case BSIM4_MOD_WCKAPPAS: - value->rValue = model->BSIM4wckappas; - return(OK); - case BSIM4_MOD_WCKAPPAD: - value->rValue = model->BSIM4wckappad; - return(OK); - case BSIM4_MOD_WCF: - value->rValue = model->BSIM4wcf; - return(OK); - case BSIM4_MOD_WCLC: - value->rValue = model->BSIM4wclc; - return(OK); - case BSIM4_MOD_WCLE: - value->rValue = model->BSIM4wcle; - return(OK); - case BSIM4_MOD_WVFBCV: - value->rValue = model->BSIM4wvfbcv; - return(OK); - case BSIM4_MOD_WACDE: - value->rValue = model->BSIM4wacde; - return(OK); - case BSIM4_MOD_WMOIN: - value->rValue = model->BSIM4wmoin; - return(OK); - case BSIM4_MOD_WNOFF: - value->rValue = model->BSIM4wnoff; - return(OK); - case BSIM4_MOD_WVOFFCV: - value->rValue = model->BSIM4wvoffcv; - return(OK); - case BSIM4_MOD_WVFBSDOFF: - value->rValue = model->BSIM4wvfbsdoff; - return(OK); - case BSIM4_MOD_WTVFBSDOFF: - value->rValue = model->BSIM4wtvfbsdoff; - return(OK); - - case BSIM4_MOD_WLAMBDA: - value->rValue = model->BSIM4wlambda; - return(OK); - case BSIM4_MOD_WVTL: - value->rValue = model->BSIM4wvtl; - return(OK); - case BSIM4_MOD_WXN: - value->rValue = model->BSIM4wxn; - return(OK); - - /* Cross-term dependence */ - case BSIM4_MOD_PCDSC : - value->rValue = model->BSIM4pcdsc; - return(OK); - case BSIM4_MOD_PCDSCB : - value->rValue = model->BSIM4pcdscb; - return(OK); - case BSIM4_MOD_PCDSCD : - value->rValue = model->BSIM4pcdscd; - return(OK); - case BSIM4_MOD_PCIT : - value->rValue = model->BSIM4pcit; - return(OK); - case BSIM4_MOD_PNFACTOR : - value->rValue = model->BSIM4pnfactor; - return(OK); - case BSIM4_MOD_PXJ: - value->rValue = model->BSIM4pxj; - return(OK); - case BSIM4_MOD_PVSAT: - value->rValue = model->BSIM4pvsat; - return(OK); - case BSIM4_MOD_PAT: - value->rValue = model->BSIM4pat; - return(OK); - case BSIM4_MOD_PA0: - value->rValue = model->BSIM4pa0; - return(OK); - case BSIM4_MOD_PAGS: - value->rValue = model->BSIM4pags; - return(OK); - case BSIM4_MOD_PA1: - value->rValue = model->BSIM4pa1; - return(OK); - case BSIM4_MOD_PA2: - value->rValue = model->BSIM4pa2; - return(OK); - case BSIM4_MOD_PKETA: - value->rValue = model->BSIM4pketa; - return(OK); - case BSIM4_MOD_PNSUB: - value->rValue = model->BSIM4pnsub; - return(OK); - case BSIM4_MOD_PNDEP: - value->rValue = model->BSIM4pndep; - return(OK); - case BSIM4_MOD_PNSD: - value->rValue = model->BSIM4pnsd; - return(OK); - case BSIM4_MOD_PNGATE: - value->rValue = model->BSIM4pngate; - return(OK); - case BSIM4_MOD_PGAMMA1: - value->rValue = model->BSIM4pgamma1; - return(OK); - case BSIM4_MOD_PGAMMA2: - value->rValue = model->BSIM4pgamma2; - return(OK); - case BSIM4_MOD_PVBX: - value->rValue = model->BSIM4pvbx; - return(OK); - case BSIM4_MOD_PVBM: - value->rValue = model->BSIM4pvbm; - return(OK); - case BSIM4_MOD_PXT: - value->rValue = model->BSIM4pxt; - return(OK); - case BSIM4_MOD_PK1: - value->rValue = model->BSIM4pk1; - return(OK); - case BSIM4_MOD_PKT1: - value->rValue = model->BSIM4pkt1; - return(OK); - case BSIM4_MOD_PKT1L: - value->rValue = model->BSIM4pkt1l; - return(OK); - case BSIM4_MOD_PKT2 : - value->rValue = model->BSIM4pkt2; - return(OK); - case BSIM4_MOD_PK2 : - value->rValue = model->BSIM4pk2; - return(OK); - case BSIM4_MOD_PK3: - value->rValue = model->BSIM4pk3; - return(OK); - case BSIM4_MOD_PK3B: - value->rValue = model->BSIM4pk3b; - return(OK); - case BSIM4_MOD_PW0: - value->rValue = model->BSIM4pw0; - return(OK); - case BSIM4_MOD_PLPE0: - value->rValue = model->BSIM4plpe0; - return(OK); - case BSIM4_MOD_PLPEB: - value->rValue = model->BSIM4plpeb; - return(OK); - case BSIM4_MOD_PDVTP0: - value->rValue = model->BSIM4pdvtp0; - return(OK); - case BSIM4_MOD_PDVTP1: - value->rValue = model->BSIM4pdvtp1; - return(OK); - case BSIM4_MOD_PDVTP2: - value->rValue = model->BSIM4pdvtp2; /* New DIBL/Rout */ - return(OK); - case BSIM4_MOD_PDVTP3: - value->rValue = model->BSIM4pdvtp3; - return(OK); - case BSIM4_MOD_PDVTP4: - value->rValue = model->BSIM4pdvtp4; - return(OK); - case BSIM4_MOD_PDVTP5: - value->rValue = model->BSIM4pdvtp5; - return(OK); - case BSIM4_MOD_PDVT0 : - value->rValue = model->BSIM4pdvt0; - return(OK); - case BSIM4_MOD_PDVT1 : - value->rValue = model->BSIM4pdvt1; - return(OK); - case BSIM4_MOD_PDVT2 : - value->rValue = model->BSIM4pdvt2; - return(OK); - case BSIM4_MOD_PDVT0W : - value->rValue = model->BSIM4pdvt0w; - return(OK); - case BSIM4_MOD_PDVT1W : - value->rValue = model->BSIM4pdvt1w; - return(OK); - case BSIM4_MOD_PDVT2W : - value->rValue = model->BSIM4pdvt2w; - return(OK); - case BSIM4_MOD_PDROUT : - value->rValue = model->BSIM4pdrout; - return(OK); - case BSIM4_MOD_PDSUB : - value->rValue = model->BSIM4pdsub; - return(OK); - case BSIM4_MOD_PVTH0: - value->rValue = model->BSIM4pvth0; - return(OK); - case BSIM4_MOD_PUA: - value->rValue = model->BSIM4pua; - return(OK); - case BSIM4_MOD_PUA1: - value->rValue = model->BSIM4pua1; - return(OK); - case BSIM4_MOD_PUB: - value->rValue = model->BSIM4pub; - return(OK); - case BSIM4_MOD_PUB1: - value->rValue = model->BSIM4pub1; - return(OK); - case BSIM4_MOD_PUC: - value->rValue = model->BSIM4puc; - return(OK); - case BSIM4_MOD_PUC1: - value->rValue = model->BSIM4puc1; - return(OK); - case BSIM4_MOD_PUD: - value->rValue = model->BSIM4pud; - return(OK); - case BSIM4_MOD_PUD1: - value->rValue = model->BSIM4pud1; - return(OK); - case BSIM4_MOD_PUP: - value->rValue = model->BSIM4pup; - return(OK); - case BSIM4_MOD_PLP: - value->rValue = model->BSIM4plp; - return(OK); - case BSIM4_MOD_PU0: - value->rValue = model->BSIM4pu0; - return(OK); - case BSIM4_MOD_PUTE: - value->rValue = model->BSIM4pute; - return(OK); - case BSIM4_MOD_PUCSTE: - value->rValue = model->BSIM4pucste; - return(OK); - case BSIM4_MOD_PVOFF: - value->rValue = model->BSIM4pvoff; - return(OK); - case BSIM4_MOD_PTVOFF: - value->rValue = model->BSIM4ptvoff; - return(OK); - case BSIM4_MOD_PTNFACTOR: /* v4.7 temp dep of leakage current */ - value->rValue = model->BSIM4ptnfactor; - return(OK); - case BSIM4_MOD_PTETA0: /* v4.7 temp dep of leakage current */ - value->rValue = model->BSIM4pteta0; - return(OK); - case BSIM4_MOD_PTVOFFCV: /* v4.7 temp dep of leakage current */ - value->rValue = model->BSIM4ptvoffcv; - return(OK); - case BSIM4_MOD_PMINV: - value->rValue = model->BSIM4pminv; - return(OK); - case BSIM4_MOD_PMINVCV: - value->rValue = model->BSIM4pminvcv; - return(OK); - case BSIM4_MOD_PFPROUT: - value->rValue = model->BSIM4pfprout; - return(OK); - case BSIM4_MOD_PPDITS: - value->rValue = model->BSIM4ppdits; - return(OK); - case BSIM4_MOD_PPDITSD: - value->rValue = model->BSIM4ppditsd; - return(OK); - case BSIM4_MOD_PDELTA: - value->rValue = model->BSIM4pdelta; - return(OK); - case BSIM4_MOD_PRDSW: - value->rValue = model->BSIM4prdsw; - return(OK); - case BSIM4_MOD_PRDW: - value->rValue = model->BSIM4prdw; - return(OK); - case BSIM4_MOD_PRSW: - value->rValue = model->BSIM4prsw; - return(OK); - case BSIM4_MOD_PPRWB: - value->rValue = model->BSIM4pprwb; - return(OK); - case BSIM4_MOD_PPRWG: - value->rValue = model->BSIM4pprwg; - return(OK); - case BSIM4_MOD_PPRT: - value->rValue = model->BSIM4pprt; - return(OK); - case BSIM4_MOD_PETA0: - value->rValue = model->BSIM4peta0; - return(OK); - case BSIM4_MOD_PETAB: - value->rValue = model->BSIM4petab; - return(OK); - case BSIM4_MOD_PPCLM: - value->rValue = model->BSIM4ppclm; - return(OK); - case BSIM4_MOD_PPDIBL1: - value->rValue = model->BSIM4ppdibl1; - return(OK); - case BSIM4_MOD_PPDIBL2: - value->rValue = model->BSIM4ppdibl2; - return(OK); - case BSIM4_MOD_PPDIBLB: - value->rValue = model->BSIM4ppdiblb; - return(OK); - case BSIM4_MOD_PPSCBE1: - value->rValue = model->BSIM4ppscbe1; - return(OK); - case BSIM4_MOD_PPSCBE2: - value->rValue = model->BSIM4ppscbe2; - return(OK); - case BSIM4_MOD_PPVAG: - value->rValue = model->BSIM4ppvag; - return(OK); - case BSIM4_MOD_PWR: - value->rValue = model->BSIM4pwr; - return(OK); - case BSIM4_MOD_PDWG: - value->rValue = model->BSIM4pdwg; - return(OK); - case BSIM4_MOD_PDWB: - value->rValue = model->BSIM4pdwb; - return(OK); - case BSIM4_MOD_PB0: - value->rValue = model->BSIM4pb0; - return(OK); - case BSIM4_MOD_PB1: - value->rValue = model->BSIM4pb1; - return(OK); - case BSIM4_MOD_PALPHA0: - value->rValue = model->BSIM4palpha0; - return(OK); - case BSIM4_MOD_PALPHA1: - value->rValue = model->BSIM4palpha1; - return(OK); - case BSIM4_MOD_PBETA0: - value->rValue = model->BSIM4pbeta0; - return(OK); - case BSIM4_MOD_PAGIDL: - value->rValue = model->BSIM4pagidl; - return(OK); - case BSIM4_MOD_PBGIDL: - value->rValue = model->BSIM4pbgidl; - return(OK); - case BSIM4_MOD_PCGIDL: - value->rValue = model->BSIM4pcgidl; - return(OK); - case BSIM4_MOD_PEGIDL: - value->rValue = model->BSIM4pegidl; - return(OK); - case BSIM4_MOD_PFGIDL: /* v4.7 New GIDL/GISL*/ - value->rValue = model->BSIM4pfgidl; - return(OK); - case BSIM4_MOD_PKGIDL: /* v4.7 New GIDL/GISL*/ - value->rValue = model->BSIM4pkgidl; - return(OK); - case BSIM4_MOD_PRGIDL: /* v4.7 New GIDL/GISL*/ - value->rValue = model->BSIM4prgidl; - return(OK); - case BSIM4_MOD_PAGISL: - value->rValue = model->BSIM4pagisl; - return(OK); - case BSIM4_MOD_PBGISL: - value->rValue = model->BSIM4pbgisl; - return(OK); - case BSIM4_MOD_PCGISL: - value->rValue = model->BSIM4pcgisl; - return(OK); - case BSIM4_MOD_PEGISL: - value->rValue = model->BSIM4pegisl; - return(OK); - case BSIM4_MOD_PFGISL: /* v4.7 New GIDL/GISL*/ - value->rValue = model->BSIM4pfgisl; - return(OK); - case BSIM4_MOD_PKGISL: /* v4.7 New GIDL/GISL*/ - value->rValue = model->BSIM4pkgisl; - return(OK); - case BSIM4_MOD_PRGISL: /* v4.7 New GIDL/GISL*/ - value->rValue = model->BSIM4prgisl; - return(OK); - case BSIM4_MOD_PAIGC: - value->rValue = model->BSIM4paigc; - return(OK); - case BSIM4_MOD_PBIGC: - value->rValue = model->BSIM4pbigc; - return(OK); - case BSIM4_MOD_PCIGC: - value->rValue = model->BSIM4pcigc; - return(OK); - case BSIM4_MOD_PAIGSD: - value->rValue = model->BSIM4paigsd; - return(OK); - case BSIM4_MOD_PBIGSD: - value->rValue = model->BSIM4pbigsd; - return(OK); - case BSIM4_MOD_PCIGSD: - value->rValue = model->BSIM4pcigsd; - return(OK); - case BSIM4_MOD_PAIGS: - value->rValue = model->BSIM4paigs; - return(OK); - case BSIM4_MOD_PBIGS: - value->rValue = model->BSIM4pbigs; - return(OK); - case BSIM4_MOD_PCIGS: - value->rValue = model->BSIM4pcigs; - return(OK); - case BSIM4_MOD_PAIGD: - value->rValue = model->BSIM4paigd; - return(OK); - case BSIM4_MOD_PBIGD: - value->rValue = model->BSIM4pbigd; - return(OK); - case BSIM4_MOD_PCIGD: - value->rValue = model->BSIM4pcigd; - return(OK); - case BSIM4_MOD_PAIGBACC: - value->rValue = model->BSIM4paigbacc; - return(OK); - case BSIM4_MOD_PBIGBACC: - value->rValue = model->BSIM4pbigbacc; - return(OK); - case BSIM4_MOD_PCIGBACC: - value->rValue = model->BSIM4pcigbacc; - return(OK); - case BSIM4_MOD_PAIGBINV: - value->rValue = model->BSIM4paigbinv; - return(OK); - case BSIM4_MOD_PBIGBINV: - value->rValue = model->BSIM4pbigbinv; - return(OK); - case BSIM4_MOD_PCIGBINV: - value->rValue = model->BSIM4pcigbinv; - return(OK); - case BSIM4_MOD_PNIGC: - value->rValue = model->BSIM4pnigc; - return(OK); - case BSIM4_MOD_PNIGBACC: - value->rValue = model->BSIM4pnigbacc; - return(OK); - case BSIM4_MOD_PNIGBINV: - value->rValue = model->BSIM4pnigbinv; - return(OK); - case BSIM4_MOD_PNTOX: - value->rValue = model->BSIM4pntox; - return(OK); - case BSIM4_MOD_PEIGBINV: - value->rValue = model->BSIM4peigbinv; - return(OK); - case BSIM4_MOD_PPIGCD: - value->rValue = model->BSIM4ppigcd; - return(OK); - case BSIM4_MOD_PPOXEDGE: - value->rValue = model->BSIM4ppoxedge; - return(OK); - case BSIM4_MOD_PPHIN: - value->rValue = model->BSIM4pphin; - return(OK); - case BSIM4_MOD_PXRCRG1: - value->rValue = model->BSIM4pxrcrg1; - return(OK); - case BSIM4_MOD_PXRCRG2: - value->rValue = model->BSIM4pxrcrg2; - return(OK); - case BSIM4_MOD_PEU: - value->rValue = model->BSIM4peu; - return(OK); - case BSIM4_MOD_PUCS: - value->rValue = model->BSIM4pucs; - return(OK); - case BSIM4_MOD_PVFB: - value->rValue = model->BSIM4pvfb; - return(OK); - - case BSIM4_MOD_PCGSL: - value->rValue = model->BSIM4pcgsl; - return(OK); - case BSIM4_MOD_PCGDL: - value->rValue = model->BSIM4pcgdl; - return(OK); - case BSIM4_MOD_PCKAPPAS: - value->rValue = model->BSIM4pckappas; - return(OK); - case BSIM4_MOD_PCKAPPAD: - value->rValue = model->BSIM4pckappad; - return(OK); - case BSIM4_MOD_PCF: - value->rValue = model->BSIM4pcf; - return(OK); - case BSIM4_MOD_PCLC: - value->rValue = model->BSIM4pclc; - return(OK); - case BSIM4_MOD_PCLE: - value->rValue = model->BSIM4pcle; - return(OK); - case BSIM4_MOD_PVFBCV: - value->rValue = model->BSIM4pvfbcv; - return(OK); - case BSIM4_MOD_PACDE: - value->rValue = model->BSIM4pacde; - return(OK); - case BSIM4_MOD_PMOIN: - value->rValue = model->BSIM4pmoin; - return(OK); - case BSIM4_MOD_PNOFF: - value->rValue = model->BSIM4pnoff; - return(OK); - case BSIM4_MOD_PVOFFCV: - value->rValue = model->BSIM4pvoffcv; - return(OK); - case BSIM4_MOD_PVFBSDOFF: - value->rValue = model->BSIM4pvfbsdoff; - return(OK); - case BSIM4_MOD_PTVFBSDOFF: - value->rValue = model->BSIM4ptvfbsdoff; - return(OK); - - case BSIM4_MOD_PLAMBDA: - value->rValue = model->BSIM4plambda; - return(OK); - case BSIM4_MOD_PVTL: - value->rValue = model->BSIM4pvtl; - return(OK); - case BSIM4_MOD_PXN: - value->rValue = model->BSIM4pxn; - return(OK); - - case BSIM4_MOD_TNOM : - value->rValue = model->BSIM4tnom; - return(OK); - case BSIM4_MOD_CGSO: - value->rValue = model->BSIM4cgso; - return(OK); - case BSIM4_MOD_CGDO: - value->rValue = model->BSIM4cgdo; - return(OK); - case BSIM4_MOD_CGBO: - value->rValue = model->BSIM4cgbo; - return(OK); - case BSIM4_MOD_XPART: - value->rValue = model->BSIM4xpart; - return(OK); - case BSIM4_MOD_RSH: - value->rValue = model->BSIM4sheetResistance; - return(OK); - case BSIM4_MOD_JSS: - value->rValue = model->BSIM4SjctSatCurDensity; - return(OK); - case BSIM4_MOD_JSWS: - value->rValue = model->BSIM4SjctSidewallSatCurDensity; - return(OK); - case BSIM4_MOD_JSWGS: - value->rValue = model->BSIM4SjctGateSidewallSatCurDensity; - return(OK); - case BSIM4_MOD_PBS: - value->rValue = model->BSIM4SbulkJctPotential; - return(OK); - case BSIM4_MOD_MJS: - value->rValue = model->BSIM4SbulkJctBotGradingCoeff; - return(OK); - case BSIM4_MOD_PBSWS: - value->rValue = model->BSIM4SsidewallJctPotential; - return(OK); - case BSIM4_MOD_MJSWS: - value->rValue = model->BSIM4SbulkJctSideGradingCoeff; - return(OK); - case BSIM4_MOD_CJS: - value->rValue = model->BSIM4SunitAreaJctCap; - return(OK); - case BSIM4_MOD_CJSWS: - value->rValue = model->BSIM4SunitLengthSidewallJctCap; - return(OK); - case BSIM4_MOD_PBSWGS: - value->rValue = model->BSIM4SGatesidewallJctPotential; - return(OK); - case BSIM4_MOD_MJSWGS: - value->rValue = model->BSIM4SbulkJctGateSideGradingCoeff; - return(OK); - case BSIM4_MOD_CJSWGS: - value->rValue = model->BSIM4SunitLengthGateSidewallJctCap; - return(OK); - case BSIM4_MOD_NJS: - value->rValue = model->BSIM4SjctEmissionCoeff; - return(OK); - case BSIM4_MOD_XTIS: - value->rValue = model->BSIM4SjctTempExponent; - return(OK); - case BSIM4_MOD_JSD: - value->rValue = model->BSIM4DjctSatCurDensity; - return(OK); - case BSIM4_MOD_JSWD: - value->rValue = model->BSIM4DjctSidewallSatCurDensity; - return(OK); - case BSIM4_MOD_JSWGD: - value->rValue = model->BSIM4DjctGateSidewallSatCurDensity; - return(OK); - case BSIM4_MOD_PBD: - value->rValue = model->BSIM4DbulkJctPotential; - return(OK); - case BSIM4_MOD_MJD: - value->rValue = model->BSIM4DbulkJctBotGradingCoeff; - return(OK); - case BSIM4_MOD_PBSWD: - value->rValue = model->BSIM4DsidewallJctPotential; - return(OK); - case BSIM4_MOD_MJSWD: - value->rValue = model->BSIM4DbulkJctSideGradingCoeff; - return(OK); - case BSIM4_MOD_CJD: - value->rValue = model->BSIM4DunitAreaJctCap; - return(OK); - case BSIM4_MOD_CJSWD: - value->rValue = model->BSIM4DunitLengthSidewallJctCap; - return(OK); - case BSIM4_MOD_PBSWGD: - value->rValue = model->BSIM4DGatesidewallJctPotential; - return(OK); - case BSIM4_MOD_MJSWGD: - value->rValue = model->BSIM4DbulkJctGateSideGradingCoeff; - return(OK); - case BSIM4_MOD_CJSWGD: - value->rValue = model->BSIM4DunitLengthGateSidewallJctCap; - return(OK); - case BSIM4_MOD_NJD: - value->rValue = model->BSIM4DjctEmissionCoeff; - return(OK); - case BSIM4_MOD_XTID: - value->rValue = model->BSIM4DjctTempExponent; - return(OK); - case BSIM4_MOD_LINTNOI: - value->rValue = model->BSIM4lintnoi; - return(OK); - case BSIM4_MOD_LINT: - value->rValue = model->BSIM4Lint; - return(OK); - case BSIM4_MOD_LL: - value->rValue = model->BSIM4Ll; - return(OK); - case BSIM4_MOD_LLC: - value->rValue = model->BSIM4Llc; - return(OK); - case BSIM4_MOD_LLN: - value->rValue = model->BSIM4Lln; - return(OK); - case BSIM4_MOD_LW: - value->rValue = model->BSIM4Lw; - return(OK); - case BSIM4_MOD_LWC: - value->rValue = model->BSIM4Lwc; - return(OK); - case BSIM4_MOD_LWN: - value->rValue = model->BSIM4Lwn; - return(OK); - case BSIM4_MOD_LWL: - value->rValue = model->BSIM4Lwl; - return(OK); - case BSIM4_MOD_LWLC: - value->rValue = model->BSIM4Lwlc; - return(OK); - case BSIM4_MOD_LMIN: - value->rValue = model->BSIM4Lmin; - return(OK); - case BSIM4_MOD_LMAX: - value->rValue = model->BSIM4Lmax; - return(OK); - case BSIM4_MOD_WINT: - value->rValue = model->BSIM4Wint; - return(OK); - case BSIM4_MOD_WL: - value->rValue = model->BSIM4Wl; - return(OK); - case BSIM4_MOD_WLC: - value->rValue = model->BSIM4Wlc; - return(OK); - case BSIM4_MOD_WLN: - value->rValue = model->BSIM4Wln; - return(OK); - case BSIM4_MOD_WW: - value->rValue = model->BSIM4Ww; - return(OK); - case BSIM4_MOD_WWC: - value->rValue = model->BSIM4Wwc; - return(OK); - case BSIM4_MOD_WWN: - value->rValue = model->BSIM4Wwn; - return(OK); - case BSIM4_MOD_WWL: - value->rValue = model->BSIM4Wwl; - return(OK); - case BSIM4_MOD_WWLC: - value->rValue = model->BSIM4Wwlc; - return(OK); - case BSIM4_MOD_WMIN: - value->rValue = model->BSIM4Wmin; - return(OK); - case BSIM4_MOD_WMAX: - value->rValue = model->BSIM4Wmax; - return(OK); - - /* stress effect */ - case BSIM4_MOD_SAREF: - value->rValue = model->BSIM4saref; - return(OK); - case BSIM4_MOD_SBREF: - value->rValue = model->BSIM4sbref; - return(OK); - case BSIM4_MOD_WLOD: - value->rValue = model->BSIM4wlod; - return(OK); - case BSIM4_MOD_KU0: - value->rValue = model->BSIM4ku0; - return(OK); - case BSIM4_MOD_KVSAT: - value->rValue = model->BSIM4kvsat; - return(OK); - case BSIM4_MOD_KVTH0: - value->rValue = model->BSIM4kvth0; - return(OK); - case BSIM4_MOD_TKU0: - value->rValue = model->BSIM4tku0; - return(OK); - case BSIM4_MOD_LLODKU0: - value->rValue = model->BSIM4llodku0; - return(OK); - case BSIM4_MOD_WLODKU0: - value->rValue = model->BSIM4wlodku0; - return(OK); - case BSIM4_MOD_LLODVTH: - value->rValue = model->BSIM4llodvth; - return(OK); - case BSIM4_MOD_WLODVTH: - value->rValue = model->BSIM4wlodvth; - return(OK); - case BSIM4_MOD_LKU0: - value->rValue = model->BSIM4lku0; - return(OK); - case BSIM4_MOD_WKU0: - value->rValue = model->BSIM4wku0; - return(OK); - case BSIM4_MOD_PKU0: - value->rValue = model->BSIM4pku0; - return(OK); - case BSIM4_MOD_LKVTH0: - value->rValue = model->BSIM4lkvth0; - return(OK); - case BSIM4_MOD_WKVTH0: - value->rValue = model->BSIM4wkvth0; - return(OK); - case BSIM4_MOD_PKVTH0: - value->rValue = model->BSIM4pkvth0; - return(OK); - case BSIM4_MOD_STK2: - value->rValue = model->BSIM4stk2; - return(OK); - case BSIM4_MOD_LODK2: - value->rValue = model->BSIM4lodk2; - return(OK); - case BSIM4_MOD_STETA0: - value->rValue = model->BSIM4steta0; - return(OK); - case BSIM4_MOD_LODETA0: - value->rValue = model->BSIM4lodeta0; - return(OK); - - /* Well Proximity Effect */ - case BSIM4_MOD_WEB: - value->rValue = model->BSIM4web; - return(OK); - case BSIM4_MOD_WEC: - value->rValue = model->BSIM4wec; - return(OK); - case BSIM4_MOD_KVTH0WE: - value->rValue = model->BSIM4kvth0we; - return(OK); - case BSIM4_MOD_K2WE: - value->rValue = model->BSIM4k2we; - return(OK); - case BSIM4_MOD_KU0WE: - value->rValue = model->BSIM4ku0we; - return(OK); - case BSIM4_MOD_SCREF: - value->rValue = model->BSIM4scref; - return(OK); - case BSIM4_MOD_WPEMOD: - value->rValue = model->BSIM4wpemod; - return(OK); - case BSIM4_MOD_LKVTH0WE: - value->rValue = model->BSIM4lkvth0we; - return(OK); - case BSIM4_MOD_LK2WE: - value->rValue = model->BSIM4lk2we; - return(OK); - case BSIM4_MOD_LKU0WE: - value->rValue = model->BSIM4lku0we; - return(OK); - case BSIM4_MOD_WKVTH0WE: - value->rValue = model->BSIM4wkvth0we; - return(OK); - case BSIM4_MOD_WK2WE: - value->rValue = model->BSIM4wk2we; - return(OK); - case BSIM4_MOD_WKU0WE: - value->rValue = model->BSIM4wku0we; - return(OK); - case BSIM4_MOD_PKVTH0WE: - value->rValue = model->BSIM4pkvth0we; - return(OK); - case BSIM4_MOD_PK2WE: - value->rValue = model->BSIM4pk2we; - return(OK); - case BSIM4_MOD_PKU0WE: - value->rValue = model->BSIM4pku0we; - return(OK); - - case BSIM4_MOD_NOIA: - value->rValue = model->BSIM4oxideTrapDensityA; - return(OK); - case BSIM4_MOD_NOIB: - value->rValue = model->BSIM4oxideTrapDensityB; - return(OK); - case BSIM4_MOD_NOIC: - value->rValue = model->BSIM4oxideTrapDensityC; - return(OK); - case BSIM4_MOD_EM: - value->rValue = model->BSIM4em; - return(OK); - case BSIM4_MOD_EF: - value->rValue = model->BSIM4ef; - return(OK); - case BSIM4_MOD_AF: - value->rValue = model->BSIM4af; - return(OK); - case BSIM4_MOD_KF: - value->rValue = model->BSIM4kf; - return(OK); - - case BSIM4_MOD_VGS_MAX: - value->rValue = model->BSIM4vgsMax; - return(OK); - case BSIM4_MOD_VGD_MAX: - value->rValue = model->BSIM4vgdMax; - return(OK); - case BSIM4_MOD_VGB_MAX: - value->rValue = model->BSIM4vgbMax; - return(OK); - case BSIM4_MOD_VDS_MAX: - value->rValue = model->BSIM4vdsMax; - return(OK); - case BSIM4_MOD_VBS_MAX: - value->rValue = model->BSIM4vbsMax; - return(OK); - case BSIM4_MOD_VBD_MAX: - value->rValue = model->BSIM4vbdMax; - return(OK); - case BSIM4_MOD_VGSR_MAX: - value->rValue = model->BSIM4vgsrMax; - return(OK); - case BSIM4_MOD_VGDR_MAX: - value->rValue = model->BSIM4vgdrMax; - return(OK); - case BSIM4_MOD_VGBR_MAX: - value->rValue = model->BSIM4vgbrMax; - return(OK); - case BSIM4_MOD_VBSR_MAX: - value->rValue = model->BSIM4vbsrMax; - return(OK); - case BSIM4_MOD_VBDR_MAX: - value->rValue = model->BSIM4vbdrMax; - return(OK); - - default: - return(E_BADPARM); - } - /* NOTREACHED */ -} - - - diff --git a/src/spicelib/devices/bsim4/b4mdel.c b/src/spicelib/devices/bsim4/b4mdel.c deleted file mode 100644 index 5acc6e375..000000000 --- a/src/spicelib/devices/bsim4/b4mdel.c +++ /dev/null @@ -1,86 +0,0 @@ -/* ****************************************************************************** - * BSIM4 4.8.1 released by Chetan Kumar Dabhi 2/15/2017 * - * BSIM4 Model Equations * - ****************************************************************************** - - ****************************************************************************** - * Copyright 2017 Regents of the University of California. * - * All rights reserved. * - * * - * Project Director: Prof. Chenming Hu. * - * Authors: Gary W. Ng, Weidong Liu, Xuemei Xi, Mohan Dunga, Wenwei Yang * - * Ali Niknejad, Shivendra Singh Parihar, Chetan Kumar Dabhi * - * Yogesh Singh Chauhan, Sayeef Salahuddin, Chenming Hu * - ****************************************************************************** - - ****************************************************************************** - * CMC In-Code Statement * - * * - * The Developer agrees that the following statement will appear in the * - * model code that has been adopted as a CMC Standard. * - * * - * Software is distributed as is, completely without warranty or service * - * support. The University of California and its employees are not liable * - * for the condition or performance of the software. * - * * - * The University of California owns the copyright and grants users a * - * perpetual, irrevocable, worldwide, non-exclusive, royalty-free license * - * with respect to the software as set forth below. * - * * - * The University of California hereby disclaims all implied warranties. * - * * - * The University of California grants the users the right to modify, * - * copy, and redistribute the software and documentation, both within * - * the user's organization and externally, subject to the following * - * restrictions: * - * * - * 1. The users agree not to charge for the University of California code * - * itself but may charge for additions, extensions, or support. * - * * - * 2. In any product based on the software, the users agree to * - * acknowledge the University of California that developed the * - * software. This acknowledgment shall appear in the product * - * documentation. * - * * - * 3. Redistributions to others of source code and documentation must * - * retain the copyright notice, disclaimer, and list of conditions. * - * * - * 4. Redistributions to others in binary form must reproduce the * - * copyright notice, disclaimer, and list of conditions in the * - * documentation and/or other materials provided with the * - * distribution. * - * * - * Agreed to on ______Feb. 15, 2017______________ * - * * - * By: ____University of California, Berkeley___ * - * ____Chenming Hu__________________________ * - * ____Professor in Graduate School ________ * - * * - ****************************************************************************** */ - -#include "ngspice/ngspice.h" -#include "bsim4def.h" -#include "ngspice/sperror.h" -#include "ngspice/suffix.h" - - -int -BSIM4mDelete(GENmodel *gen_model) -{ - BSIM4model *model = (BSIM4model *) gen_model; - -#ifdef USE_OMP - FREE(model->BSIM4InstanceArray); -#endif - - struct bsim4SizeDependParam *p = model->pSizeDependParamKnot; - while (p) { - struct bsim4SizeDependParam *next_p = p->pNext; - FREE(p); - p = next_p; - } - - FREE(model->BSIM4version); - - return OK; -} diff --git a/src/spicelib/devices/bsim4/b4mpar.c b/src/spicelib/devices/bsim4/b4mpar.c deleted file mode 100644 index e7e47ad2d..000000000 --- a/src/spicelib/devices/bsim4/b4mpar.c +++ /dev/null @@ -1,3706 +0,0 @@ -/* ****************************************************************************** - * BSIM4 4.8.1 released by Chetan Kumar Dabhi 2/15/2017 * - * BSIM4 Model Equations * - ****************************************************************************** - - ****************************************************************************** - * Copyright 2017 Regents of the University of California. * - * All rights reserved. * - * * - * Project Director: Prof. Chenming Hu. * - * Authors: Gary W. Ng, Weidong Liu, Xuemei Xi, Mohan Dunga, Wenwei Yang * - * Ali Niknejad, Shivendra Singh Parihar, Chetan Kumar Dabhi * - * Yogesh Singh Chauhan, Sayeef Salahuddin, Chenming Hu * - ****************************************************************************** - - ****************************************************************************** - * CMC In-Code Statement * - * * - * The Developer agrees that the following statement will appear in the * - * model code that has been adopted as a CMC Standard. * - * * - * Software is distributed as is, completely without warranty or service * - * support. The University of California and its employees are not liable * - * for the condition or performance of the software. * - * * - * The University of California owns the copyright and grants users a * - * perpetual, irrevocable, worldwide, non-exclusive, royalty-free license * - * with respect to the software as set forth below. * - * * - * The University of California hereby disclaims all implied warranties. * - * * - * The University of California grants the users the right to modify, * - * copy, and redistribute the software and documentation, both within * - * the user's organization and externally, subject to the following * - * restrictions: * - * * - * 1. The users agree not to charge for the University of California code * - * itself but may charge for additions, extensions, or support. * - * * - * 2. In any product based on the software, the users agree to * - * acknowledge the University of California that developed the * - * software. This acknowledgment shall appear in the product * - * documentation. * - * * - * 3. Redistributions to others of source code and documentation must * - * retain the copyright notice, disclaimer, and list of conditions. * - * * - * 4. Redistributions to others in binary form must reproduce the * - * copyright notice, disclaimer, and list of conditions in the * - * documentation and/or other materials provided with the * - * distribution. * - * * - * Agreed to on ______Feb. 15, 2017______________ * - * * - * By: ____University of California, Berkeley___ * - * ____Chenming Hu__________________________ * - * ____Professor in Graduate School ________ * - * * - ****************************************************************************** */ - -#include "ngspice/ngspice.h" -#include "bsim4def.h" -#include "ngspice/ifsim.h" -#include "ngspice/sperror.h" -#include "ngspice/suffix.h" -#include "ngspice/const.h" - -int -BSIM4mParam( -int param, -IFvalue *value, -GENmodel *inMod) -{ - BSIM4model *mod = (BSIM4model*)inMod; - switch(param) - { case BSIM4_MOD_MOBMOD : - mod->BSIM4mobMod = value->iValue; - mod->BSIM4mobModGiven = TRUE; - break; - case BSIM4_MOD_BINUNIT : - mod->BSIM4binUnit = value->iValue; - mod->BSIM4binUnitGiven = TRUE; - break; - case BSIM4_MOD_PARAMCHK : - mod->BSIM4paramChk = value->iValue; - mod->BSIM4paramChkGiven = TRUE; - break; - case BSIM4_MOD_CVCHARGEMOD : - mod->BSIM4cvchargeMod = value->iValue; - mod->BSIM4cvchargeModGiven = TRUE; - break; - case BSIM4_MOD_CAPMOD : - mod->BSIM4capMod = value->iValue; - mod->BSIM4capModGiven = TRUE; - break; - case BSIM4_MOD_DIOMOD : - mod->BSIM4dioMod = value->iValue; - mod->BSIM4dioModGiven = TRUE; - break; - case BSIM4_MOD_RDSMOD : - mod->BSIM4rdsMod = value->iValue; - mod->BSIM4rdsModGiven = TRUE; - break; - case BSIM4_MOD_TRNQSMOD : - mod->BSIM4trnqsMod = value->iValue; - mod->BSIM4trnqsModGiven = TRUE; - break; - case BSIM4_MOD_ACNQSMOD : - mod->BSIM4acnqsMod = value->iValue; - mod->BSIM4acnqsModGiven = TRUE; - break; - case BSIM4_MOD_RBODYMOD : - mod->BSIM4rbodyMod = value->iValue; - mod->BSIM4rbodyModGiven = TRUE; - break; - case BSIM4_MOD_RGATEMOD : - mod->BSIM4rgateMod = value->iValue; - mod->BSIM4rgateModGiven = TRUE; - break; - case BSIM4_MOD_PERMOD : - mod->BSIM4perMod = value->iValue; - mod->BSIM4perModGiven = TRUE; - break; - case BSIM4_MOD_GEOMOD : - mod->BSIM4geoMod = value->iValue; - mod->BSIM4geoModGiven = TRUE; - break; - case BSIM4_MOD_RGEOMOD : - mod->BSIM4rgeoMod = value->iValue; - mod->BSIM4rgeoModGiven = TRUE; - break; - case BSIM4_MOD_FNOIMOD : - mod->BSIM4fnoiMod = value->iValue; - mod->BSIM4fnoiModGiven = TRUE; - break; - case BSIM4_MOD_TNOIMOD : - mod->BSIM4tnoiMod = value->iValue; - mod->BSIM4tnoiModGiven = TRUE; - break; - case BSIM4_MOD_MTRLMOD : - mod->BSIM4mtrlMod = value->iValue; - mod->BSIM4mtrlModGiven = TRUE; - break; - case BSIM4_MOD_MTRLCOMPATMOD : - mod->BSIM4mtrlCompatMod = value->iValue; - mod->BSIM4mtrlCompatModGiven = TRUE; - break; - case BSIM4_MOD_GIDLMOD : /* v4.7 New GIDL/GISL */ - mod->BSIM4gidlMod = value->iValue; - mod->BSIM4gidlModGiven = TRUE; - break; - case BSIM4_MOD_IGCMOD : - mod->BSIM4igcMod = value->iValue; - mod->BSIM4igcModGiven = TRUE; - break; - case BSIM4_MOD_IGBMOD : - mod->BSIM4igbMod = value->iValue; - mod->BSIM4igbModGiven = TRUE; - break; - case BSIM4_MOD_TEMPMOD : - mod->BSIM4tempMod = value->iValue; - mod->BSIM4tempModGiven = TRUE; - break; - - case BSIM4_MOD_VERSION : - mod->BSIM4version = value->sValue; - mod->BSIM4versionGiven = TRUE; - break; - case BSIM4_MOD_TOXREF : - mod->BSIM4toxref = value->rValue; - mod->BSIM4toxrefGiven = TRUE; - break; - case BSIM4_MOD_EOT : - mod->BSIM4eot = value->rValue; - mod->BSIM4eotGiven = TRUE; - break; - case BSIM4_MOD_VDDEOT : - mod->BSIM4vddeot = value->rValue; - mod->BSIM4vddeotGiven = TRUE; - break; - case BSIM4_MOD_TEMPEOT : - mod->BSIM4tempeot = value->rValue; - mod->BSIM4tempeotGiven = TRUE; - break; - case BSIM4_MOD_LEFFEOT : - mod->BSIM4leffeot = value->rValue; - mod->BSIM4leffeotGiven = TRUE; - break; - case BSIM4_MOD_WEFFEOT : - mod->BSIM4weffeot = value->rValue; - mod->BSIM4weffeotGiven = TRUE; - break; - case BSIM4_MOD_ADOS : - mod->BSIM4ados = value->rValue; - mod->BSIM4adosGiven = TRUE; - break; - case BSIM4_MOD_BDOS : - mod->BSIM4bdos = value->rValue; - mod->BSIM4bdosGiven = TRUE; - break; - case BSIM4_MOD_TOXE : - mod->BSIM4toxe = value->rValue; - mod->BSIM4toxeGiven = TRUE; - break; - case BSIM4_MOD_TOXP : - mod->BSIM4toxp = value->rValue; - mod->BSIM4toxpGiven = TRUE; - break; - case BSIM4_MOD_TOXM : - mod->BSIM4toxm = value->rValue; - mod->BSIM4toxmGiven = TRUE; - break; - case BSIM4_MOD_DTOX : - mod->BSIM4dtox = value->rValue; - mod->BSIM4dtoxGiven = TRUE; - break; - case BSIM4_MOD_EPSROX : - mod->BSIM4epsrox = value->rValue; - mod->BSIM4epsroxGiven = TRUE; - break; - - case BSIM4_MOD_CDSC : - mod->BSIM4cdsc = value->rValue; - mod->BSIM4cdscGiven = TRUE; - break; - case BSIM4_MOD_CDSCB : - mod->BSIM4cdscb = value->rValue; - mod->BSIM4cdscbGiven = TRUE; - break; - - case BSIM4_MOD_CDSCD : - mod->BSIM4cdscd = value->rValue; - mod->BSIM4cdscdGiven = TRUE; - break; - - case BSIM4_MOD_CIT : - mod->BSIM4cit = value->rValue; - mod->BSIM4citGiven = TRUE; - break; - case BSIM4_MOD_NFACTOR : - mod->BSIM4nfactor = value->rValue; - mod->BSIM4nfactorGiven = TRUE; - break; - case BSIM4_MOD_XJ: - mod->BSIM4xj = value->rValue; - mod->BSIM4xjGiven = TRUE; - break; - case BSIM4_MOD_VSAT: - mod->BSIM4vsat = value->rValue; - mod->BSIM4vsatGiven = TRUE; - break; - case BSIM4_MOD_A0: - mod->BSIM4a0 = value->rValue; - mod->BSIM4a0Given = TRUE; - break; - - case BSIM4_MOD_AGS: - mod->BSIM4ags= value->rValue; - mod->BSIM4agsGiven = TRUE; - break; - - case BSIM4_MOD_A1: - mod->BSIM4a1 = value->rValue; - mod->BSIM4a1Given = TRUE; - break; - case BSIM4_MOD_A2: - mod->BSIM4a2 = value->rValue; - mod->BSIM4a2Given = TRUE; - break; - case BSIM4_MOD_AT: - mod->BSIM4at = value->rValue; - mod->BSIM4atGiven = TRUE; - break; - case BSIM4_MOD_KETA: - mod->BSIM4keta = value->rValue; - mod->BSIM4ketaGiven = TRUE; - break; - case BSIM4_MOD_NSUB: - mod->BSIM4nsub = value->rValue; - mod->BSIM4nsubGiven = TRUE; - break; - case BSIM4_MOD_PHIG: - mod->BSIM4phig = value->rValue; - mod->BSIM4phigGiven = TRUE; - break; - case BSIM4_MOD_EPSRGATE: - mod->BSIM4epsrgate = value->rValue; - mod->BSIM4epsrgateGiven = TRUE; - break; - case BSIM4_MOD_EASUB: - mod->BSIM4easub = value->rValue; - mod->BSIM4easubGiven = TRUE; - break; - case BSIM4_MOD_EPSRSUB: - mod->BSIM4epsrsub = value->rValue; - mod->BSIM4epsrsubGiven = TRUE; - break; - case BSIM4_MOD_NI0SUB: - mod->BSIM4ni0sub = value->rValue; - mod->BSIM4ni0subGiven = TRUE; - break; - case BSIM4_MOD_BG0SUB: - mod->BSIM4bg0sub = value->rValue; - mod->BSIM4bg0subGiven = TRUE; - break; - case BSIM4_MOD_TBGASUB: - mod->BSIM4tbgasub = value->rValue; - mod->BSIM4tbgasubGiven = TRUE; - break; - case BSIM4_MOD_TBGBSUB: - mod->BSIM4tbgbsub = value->rValue; - mod->BSIM4tbgbsubGiven = TRUE; - break; - case BSIM4_MOD_NDEP: - mod->BSIM4ndep = value->rValue; - mod->BSIM4ndepGiven = TRUE; - if (mod->BSIM4ndep > 1.0e20) - mod->BSIM4ndep *= 1.0e-6; - break; - case BSIM4_MOD_NSD: - mod->BSIM4nsd = value->rValue; - mod->BSIM4nsdGiven = TRUE; - if (mod->BSIM4nsd > 1.000001e24) - mod->BSIM4nsd *= 1.0e-6; - break; - case BSIM4_MOD_NGATE: - mod->BSIM4ngate = value->rValue; - mod->BSIM4ngateGiven = TRUE; - if (mod->BSIM4ngate > 1.000001e24) - mod->BSIM4ngate *= 1.0e-6; - break; - case BSIM4_MOD_GAMMA1: - mod->BSIM4gamma1 = value->rValue; - mod->BSIM4gamma1Given = TRUE; - break; - case BSIM4_MOD_GAMMA2: - mod->BSIM4gamma2 = value->rValue; - mod->BSIM4gamma2Given = TRUE; - break; - case BSIM4_MOD_VBX: - mod->BSIM4vbx = value->rValue; - mod->BSIM4vbxGiven = TRUE; - break; - case BSIM4_MOD_VBM: - mod->BSIM4vbm = value->rValue; - mod->BSIM4vbmGiven = TRUE; - break; - case BSIM4_MOD_XT: - mod->BSIM4xt = value->rValue; - mod->BSIM4xtGiven = TRUE; - break; - case BSIM4_MOD_K1: - mod->BSIM4k1 = value->rValue; - mod->BSIM4k1Given = TRUE; - break; - case BSIM4_MOD_KT1: - mod->BSIM4kt1 = value->rValue; - mod->BSIM4kt1Given = TRUE; - break; - case BSIM4_MOD_KT1L: - mod->BSIM4kt1l = value->rValue; - mod->BSIM4kt1lGiven = TRUE; - break; - case BSIM4_MOD_KT2: - mod->BSIM4kt2 = value->rValue; - mod->BSIM4kt2Given = TRUE; - break; - case BSIM4_MOD_K2: - mod->BSIM4k2 = value->rValue; - mod->BSIM4k2Given = TRUE; - break; - case BSIM4_MOD_K3: - mod->BSIM4k3 = value->rValue; - mod->BSIM4k3Given = TRUE; - break; - case BSIM4_MOD_K3B: - mod->BSIM4k3b = value->rValue; - mod->BSIM4k3bGiven = TRUE; - break; - case BSIM4_MOD_LPE0: - mod->BSIM4lpe0 = value->rValue; - mod->BSIM4lpe0Given = TRUE; - break; - case BSIM4_MOD_LPEB: - mod->BSIM4lpeb = value->rValue; - mod->BSIM4lpebGiven = TRUE; - break; - case BSIM4_MOD_DVTP0: - mod->BSIM4dvtp0 = value->rValue; - mod->BSIM4dvtp0Given = TRUE; - break; - case BSIM4_MOD_DVTP1: - mod->BSIM4dvtp1 = value->rValue; - mod->BSIM4dvtp1Given = TRUE; - break; - case BSIM4_MOD_DVTP2: /* New DIBL/Rout */ - mod->BSIM4dvtp2 = value->rValue; - mod->BSIM4dvtp2Given = TRUE; - break; - case BSIM4_MOD_DVTP3: - mod->BSIM4dvtp3 = value->rValue; - mod->BSIM4dvtp3Given = TRUE; - break; - case BSIM4_MOD_DVTP4: - mod->BSIM4dvtp4 = value->rValue; - mod->BSIM4dvtp4Given = TRUE; - break; - case BSIM4_MOD_DVTP5: - mod->BSIM4dvtp5 = value->rValue; - mod->BSIM4dvtp5Given = TRUE; - break; - case BSIM4_MOD_W0: - mod->BSIM4w0 = value->rValue; - mod->BSIM4w0Given = TRUE; - break; - case BSIM4_MOD_DVT0: - mod->BSIM4dvt0 = value->rValue; - mod->BSIM4dvt0Given = TRUE; - break; - case BSIM4_MOD_DVT1: - mod->BSIM4dvt1 = value->rValue; - mod->BSIM4dvt1Given = TRUE; - break; - case BSIM4_MOD_DVT2: - mod->BSIM4dvt2 = value->rValue; - mod->BSIM4dvt2Given = TRUE; - break; - case BSIM4_MOD_DVT0W: - mod->BSIM4dvt0w = value->rValue; - mod->BSIM4dvt0wGiven = TRUE; - break; - case BSIM4_MOD_DVT1W: - mod->BSIM4dvt1w = value->rValue; - mod->BSIM4dvt1wGiven = TRUE; - break; - case BSIM4_MOD_DVT2W: - mod->BSIM4dvt2w = value->rValue; - mod->BSIM4dvt2wGiven = TRUE; - break; - case BSIM4_MOD_DROUT: - mod->BSIM4drout = value->rValue; - mod->BSIM4droutGiven = TRUE; - break; - case BSIM4_MOD_DSUB: - mod->BSIM4dsub = value->rValue; - mod->BSIM4dsubGiven = TRUE; - break; - case BSIM4_MOD_VTH0: - mod->BSIM4vth0 = value->rValue; - mod->BSIM4vth0Given = TRUE; - break; - case BSIM4_MOD_EU: - mod->BSIM4eu = value->rValue; - mod->BSIM4euGiven = TRUE; - break; - case BSIM4_MOD_UCS: - mod->BSIM4ucs = value->rValue; - mod->BSIM4ucsGiven = TRUE; - break; - case BSIM4_MOD_UA: - mod->BSIM4ua = value->rValue; - mod->BSIM4uaGiven = TRUE; - break; - case BSIM4_MOD_UA1: - mod->BSIM4ua1 = value->rValue; - mod->BSIM4ua1Given = TRUE; - break; - case BSIM4_MOD_UB: - mod->BSIM4ub = value->rValue; - mod->BSIM4ubGiven = TRUE; - break; - case BSIM4_MOD_UB1: - mod->BSIM4ub1 = value->rValue; - mod->BSIM4ub1Given = TRUE; - break; - case BSIM4_MOD_UC: - mod->BSIM4uc = value->rValue; - mod->BSIM4ucGiven = TRUE; - break; - case BSIM4_MOD_UC1: - mod->BSIM4uc1 = value->rValue; - mod->BSIM4uc1Given = TRUE; - break; - case BSIM4_MOD_U0 : - mod->BSIM4u0 = value->rValue; - mod->BSIM4u0Given = TRUE; - break; - case BSIM4_MOD_UTE : - mod->BSIM4ute = value->rValue; - mod->BSIM4uteGiven = TRUE; - break; - case BSIM4_MOD_UCSTE : - mod->BSIM4ucste = value->rValue; - mod->BSIM4ucsteGiven = TRUE; - break; - case BSIM4_MOD_UD: - mod->BSIM4ud = value->rValue; - mod->BSIM4udGiven = TRUE; - break; - case BSIM4_MOD_UD1: - mod->BSIM4ud1 = value->rValue; - mod->BSIM4ud1Given = TRUE; - break; - case BSIM4_MOD_UP: - mod->BSIM4up = value->rValue; - mod->BSIM4upGiven = TRUE; - break; - case BSIM4_MOD_LP: - mod->BSIM4lp = value->rValue; - mod->BSIM4lpGiven = TRUE; - break; - case BSIM4_MOD_LUD: - mod->BSIM4lud = value->rValue; - mod->BSIM4ludGiven = TRUE; - break; - case BSIM4_MOD_LUD1: - mod->BSIM4lud1 = value->rValue; - mod->BSIM4lud1Given = TRUE; - break; - case BSIM4_MOD_LUP: - mod->BSIM4lup = value->rValue; - mod->BSIM4lupGiven = TRUE; - break; - case BSIM4_MOD_LLP: - mod->BSIM4llp = value->rValue; - mod->BSIM4llpGiven = TRUE; - break; - case BSIM4_MOD_WUD: - mod->BSIM4wud = value->rValue; - mod->BSIM4wudGiven = TRUE; - break; - case BSIM4_MOD_WUD1: - mod->BSIM4wud1 = value->rValue; - mod->BSIM4wud1Given = TRUE; - break; - case BSIM4_MOD_WUP: - mod->BSIM4wup = value->rValue; - mod->BSIM4wupGiven = TRUE; - break; - case BSIM4_MOD_WLP: - mod->BSIM4wlp = value->rValue; - mod->BSIM4wlpGiven = TRUE; - break; - case BSIM4_MOD_PUD: - mod->BSIM4pud = value->rValue; - mod->BSIM4pudGiven = TRUE; - break; - case BSIM4_MOD_PUD1: - mod->BSIM4pud1 = value->rValue; - mod->BSIM4pud1Given = TRUE; - break; - case BSIM4_MOD_PUP: - mod->BSIM4pup = value->rValue; - mod->BSIM4pupGiven = TRUE; - break; - case BSIM4_MOD_PLP: - mod->BSIM4plp = value->rValue; - mod->BSIM4plpGiven = TRUE; - break; - - - case BSIM4_MOD_VOFF: - mod->BSIM4voff = value->rValue; - mod->BSIM4voffGiven = TRUE; - break; - case BSIM4_MOD_TVOFF: - mod->BSIM4tvoff = value->rValue; - mod->BSIM4tvoffGiven = TRUE; - break; - case BSIM4_MOD_TNFACTOR: /* v4.7 temp dep of leakage current */ - mod->BSIM4tnfactor = value->rValue; - mod->BSIM4tnfactorGiven = TRUE; - break; - case BSIM4_MOD_TETA0: /* v4.7 temp dep of leakage current */ - mod->BSIM4teta0 = value->rValue; - mod->BSIM4teta0Given = TRUE; - break; - case BSIM4_MOD_TVOFFCV: /* v4.7 temp dep of leakage current */ - mod->BSIM4tvoffcv = value->rValue; - mod->BSIM4tvoffcvGiven = TRUE; - break; - case BSIM4_MOD_VOFFL: - mod->BSIM4voffl = value->rValue; - mod->BSIM4vofflGiven = TRUE; - break; - case BSIM4_MOD_VOFFCVL: - mod->BSIM4voffcvl = value->rValue; - mod->BSIM4voffcvlGiven = TRUE; - break; - case BSIM4_MOD_MINV: - mod->BSIM4minv = value->rValue; - mod->BSIM4minvGiven = TRUE; - break; - case BSIM4_MOD_MINVCV: - mod->BSIM4minvcv = value->rValue; - mod->BSIM4minvcvGiven = TRUE; - break; - case BSIM4_MOD_FPROUT: - mod->BSIM4fprout = value->rValue; - mod->BSIM4fproutGiven = TRUE; - break; - case BSIM4_MOD_PDITS: - mod->BSIM4pdits = value->rValue; - mod->BSIM4pditsGiven = TRUE; - break; - case BSIM4_MOD_PDITSD: - mod->BSIM4pditsd = value->rValue; - mod->BSIM4pditsdGiven = TRUE; - break; - case BSIM4_MOD_PDITSL: - mod->BSIM4pditsl = value->rValue; - mod->BSIM4pditslGiven = TRUE; - break; - case BSIM4_MOD_DELTA : - mod->BSIM4delta = value->rValue; - mod->BSIM4deltaGiven = TRUE; - break; - case BSIM4_MOD_RDSW: - mod->BSIM4rdsw = value->rValue; - mod->BSIM4rdswGiven = TRUE; - break; - case BSIM4_MOD_RDSWMIN: - mod->BSIM4rdswmin = value->rValue; - mod->BSIM4rdswminGiven = TRUE; - break; - case BSIM4_MOD_RDWMIN: - mod->BSIM4rdwmin = value->rValue; - mod->BSIM4rdwminGiven = TRUE; - break; - case BSIM4_MOD_RSWMIN: - mod->BSIM4rswmin = value->rValue; - mod->BSIM4rswminGiven = TRUE; - break; - case BSIM4_MOD_RDW: - mod->BSIM4rdw = value->rValue; - mod->BSIM4rdwGiven = TRUE; - break; - case BSIM4_MOD_RSW: - mod->BSIM4rsw = value->rValue; - mod->BSIM4rswGiven = TRUE; - break; - case BSIM4_MOD_PRWG: - mod->BSIM4prwg = value->rValue; - mod->BSIM4prwgGiven = TRUE; - break; - case BSIM4_MOD_PRWB: - mod->BSIM4prwb = value->rValue; - mod->BSIM4prwbGiven = TRUE; - break; - case BSIM4_MOD_PRT: - mod->BSIM4prt = value->rValue; - mod->BSIM4prtGiven = TRUE; - break; - case BSIM4_MOD_ETA0: - mod->BSIM4eta0 = value->rValue; - mod->BSIM4eta0Given = TRUE; - break; - case BSIM4_MOD_ETAB: - mod->BSIM4etab = value->rValue; - mod->BSIM4etabGiven = TRUE; - break; - case BSIM4_MOD_PCLM: - mod->BSIM4pclm = value->rValue; - mod->BSIM4pclmGiven = TRUE; - break; - case BSIM4_MOD_PDIBL1: - mod->BSIM4pdibl1 = value->rValue; - mod->BSIM4pdibl1Given = TRUE; - break; - case BSIM4_MOD_PDIBL2: - mod->BSIM4pdibl2 = value->rValue; - mod->BSIM4pdibl2Given = TRUE; - break; - case BSIM4_MOD_PDIBLB: - mod->BSIM4pdiblb = value->rValue; - mod->BSIM4pdiblbGiven = TRUE; - break; - case BSIM4_MOD_PSCBE1: - mod->BSIM4pscbe1 = value->rValue; - mod->BSIM4pscbe1Given = TRUE; - break; - case BSIM4_MOD_PSCBE2: - mod->BSIM4pscbe2 = value->rValue; - mod->BSIM4pscbe2Given = TRUE; - break; - case BSIM4_MOD_PVAG: - mod->BSIM4pvag = value->rValue; - mod->BSIM4pvagGiven = TRUE; - break; - case BSIM4_MOD_WR : - mod->BSIM4wr = value->rValue; - mod->BSIM4wrGiven = TRUE; - break; - case BSIM4_MOD_DWG : - mod->BSIM4dwg = value->rValue; - mod->BSIM4dwgGiven = TRUE; - break; - case BSIM4_MOD_DWB : - mod->BSIM4dwb = value->rValue; - mod->BSIM4dwbGiven = TRUE; - break; - case BSIM4_MOD_B0 : - mod->BSIM4b0 = value->rValue; - mod->BSIM4b0Given = TRUE; - break; - case BSIM4_MOD_B1 : - mod->BSIM4b1 = value->rValue; - mod->BSIM4b1Given = TRUE; - break; - case BSIM4_MOD_ALPHA0 : - mod->BSIM4alpha0 = value->rValue; - mod->BSIM4alpha0Given = TRUE; - break; - case BSIM4_MOD_ALPHA1 : - mod->BSIM4alpha1 = value->rValue; - mod->BSIM4alpha1Given = TRUE; - break; - case BSIM4_MOD_PHIN : - mod->BSIM4phin = value->rValue; - mod->BSIM4phinGiven = TRUE; - break; - case BSIM4_MOD_AGIDL : - mod->BSIM4agidl = value->rValue; - mod->BSIM4agidlGiven = TRUE; - break; - case BSIM4_MOD_BGIDL : - mod->BSIM4bgidl = value->rValue; - mod->BSIM4bgidlGiven = TRUE; - break; - case BSIM4_MOD_CGIDL : - mod->BSIM4cgidl = value->rValue; - mod->BSIM4cgidlGiven = TRUE; - break; - case BSIM4_MOD_EGIDL : - mod->BSIM4egidl = value->rValue; - mod->BSIM4egidlGiven = TRUE; - break; - case BSIM4_MOD_FGIDL : /* v4.7 New GIDL/GISL */ - mod->BSIM4fgidl = value->rValue; - mod->BSIM4fgidlGiven = TRUE; - break; - case BSIM4_MOD_KGIDL : /* v4.7 New GIDL/GISL */ - mod->BSIM4kgidl = value->rValue; - mod->BSIM4kgidlGiven = TRUE; - break; - case BSIM4_MOD_RGIDL : /* v4.7 New GIDL/GISL */ - mod->BSIM4rgidl = value->rValue; - mod->BSIM4rgidlGiven = TRUE; - break; - case BSIM4_MOD_AGISL : - mod->BSIM4agisl = value->rValue; - mod->BSIM4agislGiven = TRUE; - break; - case BSIM4_MOD_BGISL : - mod->BSIM4bgisl = value->rValue; - mod->BSIM4bgislGiven = TRUE; - break; - case BSIM4_MOD_CGISL : - mod->BSIM4cgisl = value->rValue; - mod->BSIM4cgislGiven = TRUE; - break; - case BSIM4_MOD_EGISL : - mod->BSIM4egisl = value->rValue; - mod->BSIM4egislGiven = TRUE; - break; - case BSIM4_MOD_FGISL : /* v4.7 New GIDL/GISL */ - mod->BSIM4fgisl = value->rValue; - mod->BSIM4fgislGiven = TRUE; - break; - case BSIM4_MOD_KGISL : /* v4.7 New GIDL/GISL */ - mod->BSIM4kgisl = value->rValue; - mod->BSIM4kgislGiven = TRUE; - break; - case BSIM4_MOD_RGISL : /* v4.7 New GIDL/GISL */ - mod->BSIM4rgisl = value->rValue; - mod->BSIM4rgislGiven = TRUE; - break; - case BSIM4_MOD_AIGC : - mod->BSIM4aigc = value->rValue; - mod->BSIM4aigcGiven = TRUE; - break; - case BSIM4_MOD_BIGC : - mod->BSIM4bigc = value->rValue; - mod->BSIM4bigcGiven = TRUE; - break; - case BSIM4_MOD_CIGC : - mod->BSIM4cigc = value->rValue; - mod->BSIM4cigcGiven = TRUE; - break; - case BSIM4_MOD_AIGSD : - mod->BSIM4aigsd = value->rValue; - mod->BSIM4aigsdGiven = TRUE; - break; - case BSIM4_MOD_BIGSD : - mod->BSIM4bigsd = value->rValue; - mod->BSIM4bigsdGiven = TRUE; - break; - case BSIM4_MOD_CIGSD : - mod->BSIM4cigsd = value->rValue; - mod->BSIM4cigsdGiven = TRUE; - break; - case BSIM4_MOD_AIGS : - mod->BSIM4aigs = value->rValue; - mod->BSIM4aigsGiven = TRUE; - break; - case BSIM4_MOD_BIGS : - mod->BSIM4bigs = value->rValue; - mod->BSIM4bigsGiven = TRUE; - break; - case BSIM4_MOD_CIGS : - mod->BSIM4cigs = value->rValue; - mod->BSIM4cigsGiven = TRUE; - break; - case BSIM4_MOD_AIGD : - mod->BSIM4aigd = value->rValue; - mod->BSIM4aigdGiven = TRUE; - break; - case BSIM4_MOD_BIGD : - mod->BSIM4bigd = value->rValue; - mod->BSIM4bigdGiven = TRUE; - break; - case BSIM4_MOD_CIGD : - mod->BSIM4cigd = value->rValue; - mod->BSIM4cigdGiven = TRUE; - break; - case BSIM4_MOD_AIGBACC : - mod->BSIM4aigbacc = value->rValue; - mod->BSIM4aigbaccGiven = TRUE; - break; - case BSIM4_MOD_BIGBACC : - mod->BSIM4bigbacc = value->rValue; - mod->BSIM4bigbaccGiven = TRUE; - break; - case BSIM4_MOD_CIGBACC : - mod->BSIM4cigbacc = value->rValue; - mod->BSIM4cigbaccGiven = TRUE; - break; - case BSIM4_MOD_AIGBINV : - mod->BSIM4aigbinv = value->rValue; - mod->BSIM4aigbinvGiven = TRUE; - break; - case BSIM4_MOD_BIGBINV : - mod->BSIM4bigbinv = value->rValue; - mod->BSIM4bigbinvGiven = TRUE; - break; - case BSIM4_MOD_CIGBINV : - mod->BSIM4cigbinv = value->rValue; - mod->BSIM4cigbinvGiven = TRUE; - break; - case BSIM4_MOD_NIGC : - mod->BSIM4nigc = value->rValue; - mod->BSIM4nigcGiven = TRUE; - break; - case BSIM4_MOD_NIGBINV : - mod->BSIM4nigbinv = value->rValue; - mod->BSIM4nigbinvGiven = TRUE; - break; - case BSIM4_MOD_NIGBACC : - mod->BSIM4nigbacc = value->rValue; - mod->BSIM4nigbaccGiven = TRUE; - break; - case BSIM4_MOD_NTOX : - mod->BSIM4ntox = value->rValue; - mod->BSIM4ntoxGiven = TRUE; - break; - case BSIM4_MOD_EIGBINV : - mod->BSIM4eigbinv = value->rValue; - mod->BSIM4eigbinvGiven = TRUE; - break; - case BSIM4_MOD_PIGCD : - mod->BSIM4pigcd = value->rValue; - mod->BSIM4pigcdGiven = TRUE; - break; - case BSIM4_MOD_POXEDGE : - mod->BSIM4poxedge = value->rValue; - mod->BSIM4poxedgeGiven = TRUE; - break; - case BSIM4_MOD_XRCRG1 : - mod->BSIM4xrcrg1 = value->rValue; - mod->BSIM4xrcrg1Given = TRUE; - break; - case BSIM4_MOD_XRCRG2 : - mod->BSIM4xrcrg2 = value->rValue; - mod->BSIM4xrcrg2Given = TRUE; - break; - case BSIM4_MOD_LAMBDA : - mod->BSIM4lambda = value->rValue; - mod->BSIM4lambdaGiven = TRUE; - break; - case BSIM4_MOD_VTL : - mod->BSIM4vtl = value->rValue; - mod->BSIM4vtlGiven = TRUE; - break; - case BSIM4_MOD_XN: - mod->BSIM4xn = value->rValue; - mod->BSIM4xnGiven = TRUE; - break; - case BSIM4_MOD_LC: - mod->BSIM4lc = value->rValue; - mod->BSIM4lcGiven = TRUE; - break; - case BSIM4_MOD_TNOIA : - mod->BSIM4tnoia = value->rValue; - mod->BSIM4tnoiaGiven = TRUE; - break; - case BSIM4_MOD_TNOIB : - mod->BSIM4tnoib = value->rValue; - mod->BSIM4tnoibGiven = TRUE; - break; - case BSIM4_MOD_TNOIC : - mod->BSIM4tnoic = value->rValue; - mod->BSIM4tnoicGiven = TRUE; - break; - case BSIM4_MOD_RNOIA : - mod->BSIM4rnoia = value->rValue; - mod->BSIM4rnoiaGiven = TRUE; - break; - case BSIM4_MOD_RNOIB : - mod->BSIM4rnoib = value->rValue; - mod->BSIM4rnoibGiven = TRUE; - break; - case BSIM4_MOD_RNOIC : - mod->BSIM4rnoic = value->rValue; - mod->BSIM4rnoicGiven = TRUE; - break; - case BSIM4_MOD_NTNOI : - mod->BSIM4ntnoi = value->rValue; - mod->BSIM4ntnoiGiven = TRUE; - break; - case BSIM4_MOD_VFBSDOFF: - mod->BSIM4vfbsdoff = value->rValue; - mod->BSIM4vfbsdoffGiven = TRUE; - break; - case BSIM4_MOD_TVFBSDOFF: - mod->BSIM4tvfbsdoff = value->rValue; - mod->BSIM4tvfbsdoffGiven = TRUE; - break; - case BSIM4_MOD_LINTNOI: - mod->BSIM4lintnoi = value->rValue; - mod->BSIM4lintnoiGiven = TRUE; - break; - - /* stress effect */ - case BSIM4_MOD_SAREF : - mod->BSIM4saref = value->rValue; - mod->BSIM4sarefGiven = TRUE; - break; - case BSIM4_MOD_SBREF : - mod->BSIM4sbref = value->rValue; - mod->BSIM4sbrefGiven = TRUE; - break; - case BSIM4_MOD_WLOD : - mod->BSIM4wlod = value->rValue; - mod->BSIM4wlodGiven = TRUE; - break; - case BSIM4_MOD_KU0 : - mod->BSIM4ku0 = value->rValue; - mod->BSIM4ku0Given = TRUE; - break; - case BSIM4_MOD_KVSAT : - mod->BSIM4kvsat = value->rValue; - mod->BSIM4kvsatGiven = TRUE; - break; - case BSIM4_MOD_KVTH0 : - mod->BSIM4kvth0 = value->rValue; - mod->BSIM4kvth0Given = TRUE; - break; - case BSIM4_MOD_TKU0 : - mod->BSIM4tku0 = value->rValue; - mod->BSIM4tku0Given = TRUE; - break; - case BSIM4_MOD_LLODKU0 : - mod->BSIM4llodku0 = value->rValue; - mod->BSIM4llodku0Given = TRUE; - break; - case BSIM4_MOD_WLODKU0 : - mod->BSIM4wlodku0 = value->rValue; - mod->BSIM4wlodku0Given = TRUE; - break; - case BSIM4_MOD_LLODVTH : - mod->BSIM4llodvth = value->rValue; - mod->BSIM4llodvthGiven = TRUE; - break; - case BSIM4_MOD_WLODVTH : - mod->BSIM4wlodvth = value->rValue; - mod->BSIM4wlodvthGiven = TRUE; - break; - case BSIM4_MOD_LKU0 : - mod->BSIM4lku0 = value->rValue; - mod->BSIM4lku0Given = TRUE; - break; - case BSIM4_MOD_WKU0 : - mod->BSIM4wku0 = value->rValue; - mod->BSIM4wku0Given = TRUE; - break; - case BSIM4_MOD_PKU0 : - mod->BSIM4pku0 = value->rValue; - mod->BSIM4pku0Given = TRUE; - break; - case BSIM4_MOD_LKVTH0 : - mod->BSIM4lkvth0 = value->rValue; - mod->BSIM4lkvth0Given = TRUE; - break; - case BSIM4_MOD_WKVTH0 : - mod->BSIM4wkvth0 = value->rValue; - mod->BSIM4wkvth0Given = TRUE; - break; - case BSIM4_MOD_PKVTH0 : - mod->BSIM4pkvth0 = value->rValue; - mod->BSIM4pkvth0Given = TRUE; - break; - case BSIM4_MOD_STK2 : - mod->BSIM4stk2 = value->rValue; - mod->BSIM4stk2Given = TRUE; - break; - case BSIM4_MOD_LODK2 : - mod->BSIM4lodk2 = value->rValue; - mod->BSIM4lodk2Given = TRUE; - break; - case BSIM4_MOD_STETA0 : - mod->BSIM4steta0 = value->rValue; - mod->BSIM4steta0Given = TRUE; - break; - case BSIM4_MOD_LODETA0 : - mod->BSIM4lodeta0 = value->rValue; - mod->BSIM4lodeta0Given = TRUE; - break; - - case BSIM4_MOD_WEB : - mod->BSIM4web = value->rValue; - mod->BSIM4webGiven = TRUE; - break; - case BSIM4_MOD_WEC : - mod->BSIM4wec = value->rValue; - mod->BSIM4wecGiven = TRUE; - break; - case BSIM4_MOD_KVTH0WE : - mod->BSIM4kvth0we = value->rValue; - mod->BSIM4kvth0weGiven = TRUE; - break; - case BSIM4_MOD_K2WE : - mod->BSIM4k2we = value->rValue; - mod->BSIM4k2weGiven = TRUE; - break; - case BSIM4_MOD_KU0WE : - mod->BSIM4ku0we = value->rValue; - mod->BSIM4ku0weGiven = TRUE; - break; - case BSIM4_MOD_SCREF : - mod->BSIM4scref = value->rValue; - mod->BSIM4screfGiven = TRUE; - break; - case BSIM4_MOD_WPEMOD : - mod->BSIM4wpemod = value->rValue; - mod->BSIM4wpemodGiven = TRUE; - break; - case BSIM4_MOD_LKVTH0WE : - mod->BSIM4lkvth0we = value->rValue; - mod->BSIM4lkvth0weGiven = TRUE; - break; - case BSIM4_MOD_LK2WE : - mod->BSIM4lk2we = value->rValue; - mod->BSIM4lk2weGiven = TRUE; - break; - case BSIM4_MOD_LKU0WE : - mod->BSIM4lku0we = value->rValue; - mod->BSIM4lku0weGiven = TRUE; - break; - case BSIM4_MOD_WKVTH0WE : - mod->BSIM4wkvth0we = value->rValue; - mod->BSIM4wkvth0weGiven = TRUE; - break; - case BSIM4_MOD_WK2WE : - mod->BSIM4wk2we = value->rValue; - mod->BSIM4wk2weGiven = TRUE; - break; - case BSIM4_MOD_WKU0WE : - mod->BSIM4wku0we = value->rValue; - mod->BSIM4wku0weGiven = TRUE; - break; - case BSIM4_MOD_PKVTH0WE : - mod->BSIM4pkvth0we = value->rValue; - mod->BSIM4pkvth0weGiven = TRUE; - break; - case BSIM4_MOD_PK2WE : - mod->BSIM4pk2we = value->rValue; - mod->BSIM4pk2weGiven = TRUE; - break; - case BSIM4_MOD_PKU0WE : - mod->BSIM4pku0we = value->rValue; - mod->BSIM4pku0weGiven = TRUE; - break; - - case BSIM4_MOD_BETA0 : - mod->BSIM4beta0 = value->rValue; - mod->BSIM4beta0Given = TRUE; - break; - case BSIM4_MOD_IJTHDFWD : - mod->BSIM4ijthdfwd = value->rValue; - mod->BSIM4ijthdfwdGiven = TRUE; - break; - case BSIM4_MOD_IJTHSFWD : - mod->BSIM4ijthsfwd = value->rValue; - mod->BSIM4ijthsfwdGiven = TRUE; - break; - case BSIM4_MOD_IJTHDREV : - mod->BSIM4ijthdrev = value->rValue; - mod->BSIM4ijthdrevGiven = TRUE; - break; - case BSIM4_MOD_IJTHSREV : - mod->BSIM4ijthsrev = value->rValue; - mod->BSIM4ijthsrevGiven = TRUE; - break; - case BSIM4_MOD_XJBVD : - mod->BSIM4xjbvd = value->rValue; - mod->BSIM4xjbvdGiven = TRUE; - break; - case BSIM4_MOD_XJBVS : - mod->BSIM4xjbvs = value->rValue; - mod->BSIM4xjbvsGiven = TRUE; - break; - case BSIM4_MOD_BVD : - mod->BSIM4bvd = value->rValue; - mod->BSIM4bvdGiven = TRUE; - break; - case BSIM4_MOD_BVS : - mod->BSIM4bvs = value->rValue; - mod->BSIM4bvsGiven = TRUE; - break; - - /* reverse diode */ - case BSIM4_MOD_JTSS : - mod->BSIM4jtss = value->rValue; - mod->BSIM4jtssGiven = TRUE; - break; - case BSIM4_MOD_JTSD : - mod->BSIM4jtsd = value->rValue; - mod->BSIM4jtsdGiven = TRUE; - break; - case BSIM4_MOD_JTSSWS : - mod->BSIM4jtssws = value->rValue; - mod->BSIM4jtsswsGiven = TRUE; - break; - case BSIM4_MOD_JTSSWD : - mod->BSIM4jtsswd = value->rValue; - mod->BSIM4jtsswdGiven = TRUE; - break; - case BSIM4_MOD_JTSSWGS : - mod->BSIM4jtsswgs = value->rValue; - mod->BSIM4jtsswgsGiven = TRUE; - break; - case BSIM4_MOD_JTSSWGD : - mod->BSIM4jtsswgd = value->rValue; - mod->BSIM4jtsswgdGiven = TRUE; - break; - case BSIM4_MOD_JTWEFF : - mod->BSIM4jtweff = value->rValue; - mod->BSIM4jtweffGiven = TRUE; - break; - case BSIM4_MOD_NJTS : - mod->BSIM4njts = value->rValue; - mod->BSIM4njtsGiven = TRUE; - break; - case BSIM4_MOD_NJTSSW : - mod->BSIM4njtssw = value->rValue; - mod->BSIM4njtsswGiven = TRUE; - break; - case BSIM4_MOD_NJTSSWG : - mod->BSIM4njtsswg = value->rValue; - mod->BSIM4njtsswgGiven = TRUE; - break; - case BSIM4_MOD_NJTSD : - mod->BSIM4njtsd = value->rValue; - mod->BSIM4njtsdGiven = TRUE; - break; - case BSIM4_MOD_NJTSSWD : - mod->BSIM4njtsswd = value->rValue; - mod->BSIM4njtsswdGiven = TRUE; - break; - case BSIM4_MOD_NJTSSWGD : - mod->BSIM4njtsswgd = value->rValue; - mod->BSIM4njtsswgdGiven = TRUE; - break; - case BSIM4_MOD_XTSS : - mod->BSIM4xtss = value->rValue; - mod->BSIM4xtssGiven = TRUE; - break; - case BSIM4_MOD_XTSD : - mod->BSIM4xtsd = value->rValue; - mod->BSIM4xtsdGiven = TRUE; - break; - case BSIM4_MOD_XTSSWS : - mod->BSIM4xtssws = value->rValue; - mod->BSIM4xtsswsGiven = TRUE; - break; - case BSIM4_MOD_XTSSWD : - mod->BSIM4xtsswd = value->rValue; - mod->BSIM4xtsswdGiven = TRUE; - break; - case BSIM4_MOD_XTSSWGS : - mod->BSIM4xtsswgs = value->rValue; - mod->BSIM4xtsswgsGiven = TRUE; - break; - case BSIM4_MOD_XTSSWGD : - mod->BSIM4xtsswgd = value->rValue; - mod->BSIM4xtsswgdGiven = TRUE; - break; - case BSIM4_MOD_TNJTS : - mod->BSIM4tnjts = value->rValue; - mod->BSIM4tnjtsGiven = TRUE; - break; - case BSIM4_MOD_TNJTSSW : - mod->BSIM4tnjtssw = value->rValue; - mod->BSIM4tnjtsswGiven = TRUE; - break; - case BSIM4_MOD_TNJTSSWG : - mod->BSIM4tnjtsswg = value->rValue; - mod->BSIM4tnjtsswgGiven = TRUE; - break; - case BSIM4_MOD_TNJTSD : - mod->BSIM4tnjtsd = value->rValue; - mod->BSIM4tnjtsdGiven = TRUE; - break; - case BSIM4_MOD_TNJTSSWD : - mod->BSIM4tnjtsswd = value->rValue; - mod->BSIM4tnjtsswdGiven = TRUE; - break; - case BSIM4_MOD_TNJTSSWGD : - mod->BSIM4tnjtsswgd = value->rValue; - mod->BSIM4tnjtsswgdGiven = TRUE; - break; - case BSIM4_MOD_VTSS : - mod->BSIM4vtss = value->rValue; - mod->BSIM4vtssGiven = TRUE; - break; - case BSIM4_MOD_VTSD : - mod->BSIM4vtsd = value->rValue; - mod->BSIM4vtsdGiven = TRUE; - break; - case BSIM4_MOD_VTSSWS : - mod->BSIM4vtssws = value->rValue; - mod->BSIM4vtsswsGiven = TRUE; - break; - case BSIM4_MOD_VTSSWD : - mod->BSIM4vtsswd = value->rValue; - mod->BSIM4vtsswdGiven = TRUE; - break; - case BSIM4_MOD_VTSSWGS : - mod->BSIM4vtsswgs = value->rValue; - mod->BSIM4vtsswgsGiven = TRUE; - break; - case BSIM4_MOD_VTSSWGD : - mod->BSIM4vtsswgd = value->rValue; - mod->BSIM4vtsswgdGiven = TRUE; - break; - - case BSIM4_MOD_VFB : - mod->BSIM4vfb = value->rValue; - mod->BSIM4vfbGiven = TRUE; - break; - - case BSIM4_MOD_GBMIN : - mod->BSIM4gbmin = value->rValue; - mod->BSIM4gbminGiven = TRUE; - break; - case BSIM4_MOD_RBDB : - mod->BSIM4rbdb = value->rValue; - mod->BSIM4rbdbGiven = TRUE; - break; - case BSIM4_MOD_RBPB : - mod->BSIM4rbpb = value->rValue; - mod->BSIM4rbpbGiven = TRUE; - break; - case BSIM4_MOD_RBSB : - mod->BSIM4rbsb = value->rValue; - mod->BSIM4rbsbGiven = TRUE; - break; - case BSIM4_MOD_RBPS : - mod->BSIM4rbps = value->rValue; - mod->BSIM4rbpsGiven = TRUE; - break; - case BSIM4_MOD_RBPD : - mod->BSIM4rbpd = value->rValue; - mod->BSIM4rbpdGiven = TRUE; - break; - - case BSIM4_MOD_RBPS0 : - mod->BSIM4rbps0 = value->rValue; - mod->BSIM4rbps0Given = TRUE; - break; - case BSIM4_MOD_RBPSL : - mod->BSIM4rbpsl = value->rValue; - mod->BSIM4rbpslGiven = TRUE; - break; - case BSIM4_MOD_RBPSW : - mod->BSIM4rbpsw = value->rValue; - mod->BSIM4rbpswGiven = TRUE; - break; - case BSIM4_MOD_RBPSNF : - mod->BSIM4rbpsnf = value->rValue; - mod->BSIM4rbpsnfGiven = TRUE; - break; - - case BSIM4_MOD_RBPD0 : - mod->BSIM4rbpd0 = value->rValue; - mod->BSIM4rbpd0Given = TRUE; - break; - case BSIM4_MOD_RBPDL : - mod->BSIM4rbpdl = value->rValue; - mod->BSIM4rbpdlGiven = TRUE; - break; - case BSIM4_MOD_RBPDW : - mod->BSIM4rbpdw = value->rValue; - mod->BSIM4rbpdwGiven = TRUE; - break; - case BSIM4_MOD_RBPDNF : - mod->BSIM4rbpdnf = value->rValue; - mod->BSIM4rbpdnfGiven = TRUE; - break; - - case BSIM4_MOD_RBPBX0 : - mod->BSIM4rbpbx0 = value->rValue; - mod->BSIM4rbpbx0Given = TRUE; - break; - case BSIM4_MOD_RBPBXL : - mod->BSIM4rbpbxl = value->rValue; - mod->BSIM4rbpbxlGiven = TRUE; - break; - case BSIM4_MOD_RBPBXW : - mod->BSIM4rbpbxw = value->rValue; - mod->BSIM4rbpbxwGiven = TRUE; - break; - case BSIM4_MOD_RBPBXNF : - mod->BSIM4rbpbxnf = value->rValue; - mod->BSIM4rbpbxnfGiven = TRUE; - break; - case BSIM4_MOD_RBPBY0 : - mod->BSIM4rbpby0 = value->rValue; - mod->BSIM4rbpby0Given = TRUE; - break; - case BSIM4_MOD_RBPBYL : - mod->BSIM4rbpbyl = value->rValue; - mod->BSIM4rbpbylGiven = TRUE; - break; - case BSIM4_MOD_RBPBYW : - mod->BSIM4rbpbyw = value->rValue; - mod->BSIM4rbpbywGiven = TRUE; - break; - case BSIM4_MOD_RBPBYNF : - mod->BSIM4rbpbynf = value->rValue; - mod->BSIM4rbpbynfGiven = TRUE; - break; - case BSIM4_MOD_RBSBX0 : - mod->BSIM4rbsbx0 = value->rValue; - mod->BSIM4rbsbx0Given = TRUE; - break; - case BSIM4_MOD_RBSBY0 : - mod->BSIM4rbsby0 = value->rValue; - mod->BSIM4rbsby0Given = TRUE; - break; - case BSIM4_MOD_RBDBX0 : - mod->BSIM4rbdbx0 = value->rValue; - mod->BSIM4rbdbx0Given = TRUE; - break; - case BSIM4_MOD_RBDBY0 : - mod->BSIM4rbdby0 = value->rValue; - mod->BSIM4rbdby0Given = TRUE; - break; - - - case BSIM4_MOD_RBSDBXL : - mod->BSIM4rbsdbxl = value->rValue; - mod->BSIM4rbsdbxlGiven = TRUE; - break; - case BSIM4_MOD_RBSDBXW : - mod->BSIM4rbsdbxw = value->rValue; - mod->BSIM4rbsdbxwGiven = TRUE; - break; - case BSIM4_MOD_RBSDBXNF : - mod->BSIM4rbsdbxnf = value->rValue; - mod->BSIM4rbsdbxnfGiven = TRUE; - break; - case BSIM4_MOD_RBSDBYL : - mod->BSIM4rbsdbyl = value->rValue; - mod->BSIM4rbsdbylGiven = TRUE; - break; - case BSIM4_MOD_RBSDBYW : - mod->BSIM4rbsdbyw = value->rValue; - mod->BSIM4rbsdbywGiven = TRUE; - break; - case BSIM4_MOD_RBSDBYNF : - mod->BSIM4rbsdbynf = value->rValue; - mod->BSIM4rbsdbynfGiven = TRUE; - break; - - case BSIM4_MOD_CGSL : - mod->BSIM4cgsl = value->rValue; - mod->BSIM4cgslGiven = TRUE; - break; - case BSIM4_MOD_CGDL : - mod->BSIM4cgdl = value->rValue; - mod->BSIM4cgdlGiven = TRUE; - break; - case BSIM4_MOD_CKAPPAS : - mod->BSIM4ckappas = value->rValue; - mod->BSIM4ckappasGiven = TRUE; - break; - case BSIM4_MOD_CKAPPAD : - mod->BSIM4ckappad = value->rValue; - mod->BSIM4ckappadGiven = TRUE; - break; - case BSIM4_MOD_CF : - mod->BSIM4cf = value->rValue; - mod->BSIM4cfGiven = TRUE; - break; - case BSIM4_MOD_CLC : - mod->BSIM4clc = value->rValue; - mod->BSIM4clcGiven = TRUE; - break; - case BSIM4_MOD_CLE : - mod->BSIM4cle = value->rValue; - mod->BSIM4cleGiven = TRUE; - break; - case BSIM4_MOD_DWC : - mod->BSIM4dwc = value->rValue; - mod->BSIM4dwcGiven = TRUE; - break; - case BSIM4_MOD_DLC : - mod->BSIM4dlc = value->rValue; - mod->BSIM4dlcGiven = TRUE; - break; - case BSIM4_MOD_XW : - mod->BSIM4xw = value->rValue; - mod->BSIM4xwGiven = TRUE; - break; - case BSIM4_MOD_XL : - mod->BSIM4xl = value->rValue; - mod->BSIM4xlGiven = TRUE; - break; - case BSIM4_MOD_DLCIG : - mod->BSIM4dlcig = value->rValue; - mod->BSIM4dlcigGiven = TRUE; - break; - case BSIM4_MOD_DLCIGD : - mod->BSIM4dlcigd = value->rValue; - mod->BSIM4dlcigdGiven = TRUE; - break; - case BSIM4_MOD_DWJ : - mod->BSIM4dwj = value->rValue; - mod->BSIM4dwjGiven = TRUE; - break; - case BSIM4_MOD_VFBCV : - mod->BSIM4vfbcv = value->rValue; - mod->BSIM4vfbcvGiven = TRUE; - break; - case BSIM4_MOD_ACDE : - mod->BSIM4acde = value->rValue; - mod->BSIM4acdeGiven = TRUE; - break; - case BSIM4_MOD_MOIN : - mod->BSIM4moin = value->rValue; - mod->BSIM4moinGiven = TRUE; - break; - case BSIM4_MOD_NOFF : - mod->BSIM4noff = value->rValue; - mod->BSIM4noffGiven = TRUE; - break; - case BSIM4_MOD_VOFFCV : - mod->BSIM4voffcv = value->rValue; - mod->BSIM4voffcvGiven = TRUE; - break; - case BSIM4_MOD_DMCG : - mod->BSIM4dmcg = value->rValue; - mod->BSIM4dmcgGiven = TRUE; - break; - case BSIM4_MOD_DMCI : - mod->BSIM4dmci = value->rValue; - mod->BSIM4dmciGiven = TRUE; - break; - case BSIM4_MOD_DMDG : - mod->BSIM4dmdg = value->rValue; - mod->BSIM4dmdgGiven = TRUE; - break; - case BSIM4_MOD_DMCGT : - mod->BSIM4dmcgt = value->rValue; - mod->BSIM4dmcgtGiven = TRUE; - break; - case BSIM4_MOD_XGW : - mod->BSIM4xgw = value->rValue; - mod->BSIM4xgwGiven = TRUE; - break; - case BSIM4_MOD_XGL : - mod->BSIM4xgl = value->rValue; - mod->BSIM4xglGiven = TRUE; - break; - case BSIM4_MOD_RSHG : - mod->BSIM4rshg = value->rValue; - mod->BSIM4rshgGiven = TRUE; - break; - case BSIM4_MOD_NGCON : - mod->BSIM4ngcon = value->rValue; - mod->BSIM4ngconGiven = TRUE; - break; - case BSIM4_MOD_TCJ : - mod->BSIM4tcj = value->rValue; - mod->BSIM4tcjGiven = TRUE; - break; - case BSIM4_MOD_TPB : - mod->BSIM4tpb = value->rValue; - mod->BSIM4tpbGiven = TRUE; - break; - case BSIM4_MOD_TCJSW : - mod->BSIM4tcjsw = value->rValue; - mod->BSIM4tcjswGiven = TRUE; - break; - case BSIM4_MOD_TPBSW : - mod->BSIM4tpbsw = value->rValue; - mod->BSIM4tpbswGiven = TRUE; - break; - case BSIM4_MOD_TCJSWG : - mod->BSIM4tcjswg = value->rValue; - mod->BSIM4tcjswgGiven = TRUE; - break; - case BSIM4_MOD_TPBSWG : - mod->BSIM4tpbswg = value->rValue; - mod->BSIM4tpbswgGiven = TRUE; - break; - - /* Length dependence */ - case BSIM4_MOD_LCDSC : - mod->BSIM4lcdsc = value->rValue; - mod->BSIM4lcdscGiven = TRUE; - break; - - - case BSIM4_MOD_LCDSCB : - mod->BSIM4lcdscb = value->rValue; - mod->BSIM4lcdscbGiven = TRUE; - break; - case BSIM4_MOD_LCDSCD : - mod->BSIM4lcdscd = value->rValue; - mod->BSIM4lcdscdGiven = TRUE; - break; - case BSIM4_MOD_LCIT : - mod->BSIM4lcit = value->rValue; - mod->BSIM4lcitGiven = TRUE; - break; - case BSIM4_MOD_LNFACTOR : - mod->BSIM4lnfactor = value->rValue; - mod->BSIM4lnfactorGiven = TRUE; - break; - case BSIM4_MOD_LXJ: - mod->BSIM4lxj = value->rValue; - mod->BSIM4lxjGiven = TRUE; - break; - case BSIM4_MOD_LVSAT: - mod->BSIM4lvsat = value->rValue; - mod->BSIM4lvsatGiven = TRUE; - break; - - - case BSIM4_MOD_LA0: - mod->BSIM4la0 = value->rValue; - mod->BSIM4la0Given = TRUE; - break; - case BSIM4_MOD_LAGS: - mod->BSIM4lags = value->rValue; - mod->BSIM4lagsGiven = TRUE; - break; - case BSIM4_MOD_LA1: - mod->BSIM4la1 = value->rValue; - mod->BSIM4la1Given = TRUE; - break; - case BSIM4_MOD_LA2: - mod->BSIM4la2 = value->rValue; - mod->BSIM4la2Given = TRUE; - break; - case BSIM4_MOD_LAT: - mod->BSIM4lat = value->rValue; - mod->BSIM4latGiven = TRUE; - break; - case BSIM4_MOD_LKETA: - mod->BSIM4lketa = value->rValue; - mod->BSIM4lketaGiven = TRUE; - break; - case BSIM4_MOD_LNSUB: - mod->BSIM4lnsub = value->rValue; - mod->BSIM4lnsubGiven = TRUE; - break; - case BSIM4_MOD_LNDEP: - mod->BSIM4lndep = value->rValue; - mod->BSIM4lndepGiven = TRUE; - if (mod->BSIM4lndep > 1.0e20) - mod->BSIM4lndep *= 1.0e-6; - break; - case BSIM4_MOD_LNSD: - mod->BSIM4lnsd = value->rValue; - mod->BSIM4lnsdGiven = TRUE; - if (mod->BSIM4lnsd > 1.0e23) - mod->BSIM4lnsd *= 1.0e-6; - break; - case BSIM4_MOD_LNGATE: - mod->BSIM4lngate = value->rValue; - mod->BSIM4lngateGiven = TRUE; - if (mod->BSIM4lngate > 1.0e23) - mod->BSIM4lngate *= 1.0e-6; - break; - case BSIM4_MOD_LGAMMA1: - mod->BSIM4lgamma1 = value->rValue; - mod->BSIM4lgamma1Given = TRUE; - break; - case BSIM4_MOD_LGAMMA2: - mod->BSIM4lgamma2 = value->rValue; - mod->BSIM4lgamma2Given = TRUE; - break; - case BSIM4_MOD_LVBX: - mod->BSIM4lvbx = value->rValue; - mod->BSIM4lvbxGiven = TRUE; - break; - case BSIM4_MOD_LVBM: - mod->BSIM4lvbm = value->rValue; - mod->BSIM4lvbmGiven = TRUE; - break; - case BSIM4_MOD_LXT: - mod->BSIM4lxt = value->rValue; - mod->BSIM4lxtGiven = TRUE; - break; - case BSIM4_MOD_LK1: - mod->BSIM4lk1 = value->rValue; - mod->BSIM4lk1Given = TRUE; - break; - case BSIM4_MOD_LKT1: - mod->BSIM4lkt1 = value->rValue; - mod->BSIM4lkt1Given = TRUE; - break; - case BSIM4_MOD_LKT1L: - mod->BSIM4lkt1l = value->rValue; - mod->BSIM4lkt1lGiven = TRUE; - break; - case BSIM4_MOD_LKT2: - mod->BSIM4lkt2 = value->rValue; - mod->BSIM4lkt2Given = TRUE; - break; - case BSIM4_MOD_LK2: - mod->BSIM4lk2 = value->rValue; - mod->BSIM4lk2Given = TRUE; - break; - case BSIM4_MOD_LK3: - mod->BSIM4lk3 = value->rValue; - mod->BSIM4lk3Given = TRUE; - break; - case BSIM4_MOD_LK3B: - mod->BSIM4lk3b = value->rValue; - mod->BSIM4lk3bGiven = TRUE; - break; - case BSIM4_MOD_LLPE0: - mod->BSIM4llpe0 = value->rValue; - mod->BSIM4llpe0Given = TRUE; - break; - case BSIM4_MOD_LLPEB: - mod->BSIM4llpeb = value->rValue; - mod->BSIM4llpebGiven = TRUE; - break; - case BSIM4_MOD_LDVTP0: - mod->BSIM4ldvtp0 = value->rValue; - mod->BSIM4ldvtp0Given = TRUE; - break; - case BSIM4_MOD_LDVTP1: - mod->BSIM4ldvtp1 = value->rValue; - mod->BSIM4ldvtp1Given = TRUE; - break; - case BSIM4_MOD_LDVTP2: /* New DIBL/Rout */ - mod->BSIM4ldvtp2 = value->rValue; - mod->BSIM4ldvtp2Given = TRUE; - break; - case BSIM4_MOD_LDVTP3: - mod->BSIM4ldvtp3 = value->rValue; - mod->BSIM4ldvtp3Given = TRUE; - break; - case BSIM4_MOD_LDVTP4: - mod->BSIM4ldvtp4 = value->rValue; - mod->BSIM4ldvtp4Given = TRUE; - break; - case BSIM4_MOD_LDVTP5: - mod->BSIM4ldvtp5 = value->rValue; - mod->BSIM4ldvtp5Given = TRUE; - break; - case BSIM4_MOD_LW0: - mod->BSIM4lw0 = value->rValue; - mod->BSIM4lw0Given = TRUE; - break; - case BSIM4_MOD_LDVT0: - mod->BSIM4ldvt0 = value->rValue; - mod->BSIM4ldvt0Given = TRUE; - break; - case BSIM4_MOD_LDVT1: - mod->BSIM4ldvt1 = value->rValue; - mod->BSIM4ldvt1Given = TRUE; - break; - case BSIM4_MOD_LDVT2: - mod->BSIM4ldvt2 = value->rValue; - mod->BSIM4ldvt2Given = TRUE; - break; - case BSIM4_MOD_LDVT0W: - mod->BSIM4ldvt0w = value->rValue; - mod->BSIM4ldvt0wGiven = TRUE; - break; - case BSIM4_MOD_LDVT1W: - mod->BSIM4ldvt1w = value->rValue; - mod->BSIM4ldvt1wGiven = TRUE; - break; - case BSIM4_MOD_LDVT2W: - mod->BSIM4ldvt2w = value->rValue; - mod->BSIM4ldvt2wGiven = TRUE; - break; - case BSIM4_MOD_LDROUT: - mod->BSIM4ldrout = value->rValue; - mod->BSIM4ldroutGiven = TRUE; - break; - case BSIM4_MOD_LDSUB: - mod->BSIM4ldsub = value->rValue; - mod->BSIM4ldsubGiven = TRUE; - break; - case BSIM4_MOD_LVTH0: - mod->BSIM4lvth0 = value->rValue; - mod->BSIM4lvth0Given = TRUE; - break; - case BSIM4_MOD_LUA: - mod->BSIM4lua = value->rValue; - mod->BSIM4luaGiven = TRUE; - break; - case BSIM4_MOD_LUA1: - mod->BSIM4lua1 = value->rValue; - mod->BSIM4lua1Given = TRUE; - break; - case BSIM4_MOD_LUB: - mod->BSIM4lub = value->rValue; - mod->BSIM4lubGiven = TRUE; - break; - case BSIM4_MOD_LUB1: - mod->BSIM4lub1 = value->rValue; - mod->BSIM4lub1Given = TRUE; - break; - case BSIM4_MOD_LUC: - mod->BSIM4luc = value->rValue; - mod->BSIM4lucGiven = TRUE; - break; - case BSIM4_MOD_LUC1: - mod->BSIM4luc1 = value->rValue; - mod->BSIM4luc1Given = TRUE; - break; - case BSIM4_MOD_LU0 : - mod->BSIM4lu0 = value->rValue; - mod->BSIM4lu0Given = TRUE; - break; - case BSIM4_MOD_LUTE : - mod->BSIM4lute = value->rValue; - mod->BSIM4luteGiven = TRUE; - break; - case BSIM4_MOD_LUCSTE : - mod->BSIM4lucste = value->rValue; - mod->BSIM4lucsteGiven = TRUE; - break; - case BSIM4_MOD_LVOFF: - mod->BSIM4lvoff = value->rValue; - mod->BSIM4lvoffGiven = TRUE; - break; - case BSIM4_MOD_LTVOFF: - mod->BSIM4ltvoff = value->rValue; - mod->BSIM4ltvoffGiven = TRUE; - break; - case BSIM4_MOD_LTNFACTOR: /* v4.7 temp dep of leakage current */ - mod->BSIM4ltnfactor = value->rValue; - mod->BSIM4ltnfactorGiven = TRUE; - break; - case BSIM4_MOD_LTETA0: /* v4.7 temp dep of leakage current */ - mod->BSIM4lteta0 = value->rValue; - mod->BSIM4lteta0Given = TRUE; - break; - case BSIM4_MOD_LTVOFFCV: /* v4.7 temp dep of leakage current */ - mod->BSIM4ltvoffcv = value->rValue; - mod->BSIM4ltvoffcvGiven = TRUE; - break; - case BSIM4_MOD_LMINV: - mod->BSIM4lminv = value->rValue; - mod->BSIM4lminvGiven = TRUE; - break; - case BSIM4_MOD_LMINVCV: - mod->BSIM4lminvcv = value->rValue; - mod->BSIM4lminvcvGiven = TRUE; - break; - case BSIM4_MOD_LFPROUT: - mod->BSIM4lfprout = value->rValue; - mod->BSIM4lfproutGiven = TRUE; - break; - case BSIM4_MOD_LPDITS: - mod->BSIM4lpdits = value->rValue; - mod->BSIM4lpditsGiven = TRUE; - break; - case BSIM4_MOD_LPDITSD: - mod->BSIM4lpditsd = value->rValue; - mod->BSIM4lpditsdGiven = TRUE; - break; - case BSIM4_MOD_LDELTA : - mod->BSIM4ldelta = value->rValue; - mod->BSIM4ldeltaGiven = TRUE; - break; - case BSIM4_MOD_LRDSW: - mod->BSIM4lrdsw = value->rValue; - mod->BSIM4lrdswGiven = TRUE; - break; - case BSIM4_MOD_LRDW: - mod->BSIM4lrdw = value->rValue; - mod->BSIM4lrdwGiven = TRUE; - break; - case BSIM4_MOD_LRSW: - mod->BSIM4lrsw = value->rValue; - mod->BSIM4lrswGiven = TRUE; - break; - case BSIM4_MOD_LPRWB: - mod->BSIM4lprwb = value->rValue; - mod->BSIM4lprwbGiven = TRUE; - break; - case BSIM4_MOD_LPRWG: - mod->BSIM4lprwg = value->rValue; - mod->BSIM4lprwgGiven = TRUE; - break; - case BSIM4_MOD_LPRT: - mod->BSIM4lprt = value->rValue; - mod->BSIM4lprtGiven = TRUE; - break; - case BSIM4_MOD_LETA0: - mod->BSIM4leta0 = value->rValue; - mod->BSIM4leta0Given = TRUE; - break; - case BSIM4_MOD_LETAB: - mod->BSIM4letab = value->rValue; - mod->BSIM4letabGiven = TRUE; - break; - case BSIM4_MOD_LPCLM: - mod->BSIM4lpclm = value->rValue; - mod->BSIM4lpclmGiven = TRUE; - break; - case BSIM4_MOD_LPDIBL1: - mod->BSIM4lpdibl1 = value->rValue; - mod->BSIM4lpdibl1Given = TRUE; - break; - case BSIM4_MOD_LPDIBL2: - mod->BSIM4lpdibl2 = value->rValue; - mod->BSIM4lpdibl2Given = TRUE; - break; - case BSIM4_MOD_LPDIBLB: - mod->BSIM4lpdiblb = value->rValue; - mod->BSIM4lpdiblbGiven = TRUE; - break; - case BSIM4_MOD_LPSCBE1: - mod->BSIM4lpscbe1 = value->rValue; - mod->BSIM4lpscbe1Given = TRUE; - break; - case BSIM4_MOD_LPSCBE2: - mod->BSIM4lpscbe2 = value->rValue; - mod->BSIM4lpscbe2Given = TRUE; - break; - case BSIM4_MOD_LPVAG: - mod->BSIM4lpvag = value->rValue; - mod->BSIM4lpvagGiven = TRUE; - break; - case BSIM4_MOD_LWR : - mod->BSIM4lwr = value->rValue; - mod->BSIM4lwrGiven = TRUE; - break; - case BSIM4_MOD_LDWG : - mod->BSIM4ldwg = value->rValue; - mod->BSIM4ldwgGiven = TRUE; - break; - case BSIM4_MOD_LDWB : - mod->BSIM4ldwb = value->rValue; - mod->BSIM4ldwbGiven = TRUE; - break; - case BSIM4_MOD_LB0 : - mod->BSIM4lb0 = value->rValue; - mod->BSIM4lb0Given = TRUE; - break; - case BSIM4_MOD_LB1 : - mod->BSIM4lb1 = value->rValue; - mod->BSIM4lb1Given = TRUE; - break; - case BSIM4_MOD_LALPHA0 : - mod->BSIM4lalpha0 = value->rValue; - mod->BSIM4lalpha0Given = TRUE; - break; - case BSIM4_MOD_LALPHA1 : - mod->BSIM4lalpha1 = value->rValue; - mod->BSIM4lalpha1Given = TRUE; - break; - case BSIM4_MOD_LBETA0 : - mod->BSIM4lbeta0 = value->rValue; - mod->BSIM4lbeta0Given = TRUE; - break; - case BSIM4_MOD_LPHIN : - mod->BSIM4lphin = value->rValue; - mod->BSIM4lphinGiven = TRUE; - break; - case BSIM4_MOD_LAGIDL : - mod->BSIM4lagidl = value->rValue; - mod->BSIM4lagidlGiven = TRUE; - break; - case BSIM4_MOD_LBGIDL : - mod->BSIM4lbgidl = value->rValue; - mod->BSIM4lbgidlGiven = TRUE; - break; - case BSIM4_MOD_LCGIDL : - mod->BSIM4lcgidl = value->rValue; - mod->BSIM4lcgidlGiven = TRUE; - break; - case BSIM4_MOD_LEGIDL : - mod->BSIM4legidl = value->rValue; - mod->BSIM4legidlGiven = TRUE; - break; - case BSIM4_MOD_LFGIDL : /* v4.7 New GIDL/GISL */ - mod->BSIM4lfgidl = value->rValue; - mod->BSIM4lfgidlGiven = TRUE; - break; - case BSIM4_MOD_LKGIDL : /* v4.7 New GIDL/GISL */ - mod->BSIM4lkgidl = value->rValue; - mod->BSIM4lkgidlGiven = TRUE; - break; - case BSIM4_MOD_LRGIDL : /* v4.7 New GIDL/GISL */ - mod->BSIM4lrgidl = value->rValue; - mod->BSIM4lrgidlGiven = TRUE; - break; - case BSIM4_MOD_LAGISL : - mod->BSIM4lagisl = value->rValue; - mod->BSIM4lagislGiven = TRUE; - break; - case BSIM4_MOD_LBGISL : - mod->BSIM4lbgisl = value->rValue; - mod->BSIM4lbgislGiven = TRUE; - break; - case BSIM4_MOD_LCGISL : - mod->BSIM4lcgisl = value->rValue; - mod->BSIM4lcgislGiven = TRUE; - break; - case BSIM4_MOD_LEGISL : - mod->BSIM4legisl = value->rValue; - mod->BSIM4legislGiven = TRUE; - break; - case BSIM4_MOD_LFGISL : /* v4.7 New GIDL/GISL */ - mod->BSIM4lfgisl = value->rValue; - mod->BSIM4lfgislGiven = TRUE; - break; - case BSIM4_MOD_LKGISL : /* v4.7 New GIDL/GISL */ - mod->BSIM4lkgisl = value->rValue; - mod->BSIM4lkgislGiven = TRUE; - break; - case BSIM4_MOD_LRGISL : /* v4.7 New GIDL/GISL */ - mod->BSIM4lrgisl = value->rValue; - mod->BSIM4lrgislGiven = TRUE; - break; - case BSIM4_MOD_LAIGC : - mod->BSIM4laigc = value->rValue; - mod->BSIM4laigcGiven = TRUE; - break; - case BSIM4_MOD_LBIGC : - mod->BSIM4lbigc = value->rValue; - mod->BSIM4lbigcGiven = TRUE; - break; - case BSIM4_MOD_LCIGC : - mod->BSIM4lcigc = value->rValue; - mod->BSIM4lcigcGiven = TRUE; - break; - case BSIM4_MOD_LAIGSD : - mod->BSIM4laigsd = value->rValue; - mod->BSIM4laigsdGiven = TRUE; - break; - case BSIM4_MOD_LBIGSD : - mod->BSIM4lbigsd = value->rValue; - mod->BSIM4lbigsdGiven = TRUE; - break; - case BSIM4_MOD_LCIGSD : - mod->BSIM4lcigsd = value->rValue; - mod->BSIM4lcigsdGiven = TRUE; - break; - case BSIM4_MOD_LAIGS : - mod->BSIM4laigs = value->rValue; - mod->BSIM4laigsGiven = TRUE; - break; - case BSIM4_MOD_LBIGS : - mod->BSIM4lbigs = value->rValue; - mod->BSIM4lbigsGiven = TRUE; - break; - case BSIM4_MOD_LCIGS : - mod->BSIM4lcigs = value->rValue; - mod->BSIM4lcigsGiven = TRUE; - break; - case BSIM4_MOD_LAIGD : - mod->BSIM4laigd = value->rValue; - mod->BSIM4laigdGiven = TRUE; - break; - case BSIM4_MOD_LBIGD : - mod->BSIM4lbigd = value->rValue; - mod->BSIM4lbigdGiven = TRUE; - break; - case BSIM4_MOD_LCIGD : - mod->BSIM4lcigd = value->rValue; - mod->BSIM4lcigdGiven = TRUE; - break; - case BSIM4_MOD_LAIGBACC : - mod->BSIM4laigbacc = value->rValue; - mod->BSIM4laigbaccGiven = TRUE; - break; - case BSIM4_MOD_LBIGBACC : - mod->BSIM4lbigbacc = value->rValue; - mod->BSIM4lbigbaccGiven = TRUE; - break; - case BSIM4_MOD_LCIGBACC : - mod->BSIM4lcigbacc = value->rValue; - mod->BSIM4lcigbaccGiven = TRUE; - break; - case BSIM4_MOD_LAIGBINV : - mod->BSIM4laigbinv = value->rValue; - mod->BSIM4laigbinvGiven = TRUE; - break; - case BSIM4_MOD_LBIGBINV : - mod->BSIM4lbigbinv = value->rValue; - mod->BSIM4lbigbinvGiven = TRUE; - break; - case BSIM4_MOD_LCIGBINV : - mod->BSIM4lcigbinv = value->rValue; - mod->BSIM4lcigbinvGiven = TRUE; - break; - case BSIM4_MOD_LNIGC : - mod->BSIM4lnigc = value->rValue; - mod->BSIM4lnigcGiven = TRUE; - break; - case BSIM4_MOD_LNIGBINV : - mod->BSIM4lnigbinv = value->rValue; - mod->BSIM4lnigbinvGiven = TRUE; - break; - case BSIM4_MOD_LNIGBACC : - mod->BSIM4lnigbacc = value->rValue; - mod->BSIM4lnigbaccGiven = TRUE; - break; - case BSIM4_MOD_LNTOX : - mod->BSIM4lntox = value->rValue; - mod->BSIM4lntoxGiven = TRUE; - break; - case BSIM4_MOD_LEIGBINV : - mod->BSIM4leigbinv = value->rValue; - mod->BSIM4leigbinvGiven = TRUE; - break; - case BSIM4_MOD_LPIGCD : - mod->BSIM4lpigcd = value->rValue; - mod->BSIM4lpigcdGiven = TRUE; - break; - case BSIM4_MOD_LPOXEDGE : - mod->BSIM4lpoxedge = value->rValue; - mod->BSIM4lpoxedgeGiven = TRUE; - break; - case BSIM4_MOD_LXRCRG1 : - mod->BSIM4lxrcrg1 = value->rValue; - mod->BSIM4lxrcrg1Given = TRUE; - break; - case BSIM4_MOD_LXRCRG2 : - mod->BSIM4lxrcrg2 = value->rValue; - mod->BSIM4lxrcrg2Given = TRUE; - break; - case BSIM4_MOD_LLAMBDA : - mod->BSIM4llambda = value->rValue; - mod->BSIM4llambdaGiven = TRUE; - break; - case BSIM4_MOD_LVTL : - mod->BSIM4lvtl = value->rValue; - mod->BSIM4lvtlGiven = TRUE; - break; - case BSIM4_MOD_LXN: - mod->BSIM4lxn = value->rValue; - mod->BSIM4lxnGiven = TRUE; - break; - case BSIM4_MOD_LVFBSDOFF: - mod->BSIM4lvfbsdoff = value->rValue; - mod->BSIM4lvfbsdoffGiven = TRUE; - break; - case BSIM4_MOD_LTVFBSDOFF: - mod->BSIM4ltvfbsdoff = value->rValue; - mod->BSIM4ltvfbsdoffGiven = TRUE; - break; - case BSIM4_MOD_LEU : - mod->BSIM4leu = value->rValue; - mod->BSIM4leuGiven = TRUE; - break; - case BSIM4_MOD_LUCS : - mod->BSIM4lucs = value->rValue; - mod->BSIM4lucsGiven = TRUE; - break; - case BSIM4_MOD_LVFB : - mod->BSIM4lvfb = value->rValue; - mod->BSIM4lvfbGiven = TRUE; - break; - case BSIM4_MOD_LCGSL : - mod->BSIM4lcgsl = value->rValue; - mod->BSIM4lcgslGiven = TRUE; - break; - case BSIM4_MOD_LCGDL : - mod->BSIM4lcgdl = value->rValue; - mod->BSIM4lcgdlGiven = TRUE; - break; - case BSIM4_MOD_LCKAPPAS : - mod->BSIM4lckappas = value->rValue; - mod->BSIM4lckappasGiven = TRUE; - break; - case BSIM4_MOD_LCKAPPAD : - mod->BSIM4lckappad = value->rValue; - mod->BSIM4lckappadGiven = TRUE; - break; - case BSIM4_MOD_LCF : - mod->BSIM4lcf = value->rValue; - mod->BSIM4lcfGiven = TRUE; - break; - case BSIM4_MOD_LCLC : - mod->BSIM4lclc = value->rValue; - mod->BSIM4lclcGiven = TRUE; - break; - case BSIM4_MOD_LCLE : - mod->BSIM4lcle = value->rValue; - mod->BSIM4lcleGiven = TRUE; - break; - case BSIM4_MOD_LVFBCV : - mod->BSIM4lvfbcv = value->rValue; - mod->BSIM4lvfbcvGiven = TRUE; - break; - case BSIM4_MOD_LACDE : - mod->BSIM4lacde = value->rValue; - mod->BSIM4lacdeGiven = TRUE; - break; - case BSIM4_MOD_LMOIN : - mod->BSIM4lmoin = value->rValue; - mod->BSIM4lmoinGiven = TRUE; - break; - case BSIM4_MOD_LNOFF : - mod->BSIM4lnoff = value->rValue; - mod->BSIM4lnoffGiven = TRUE; - break; - case BSIM4_MOD_LVOFFCV : - mod->BSIM4lvoffcv = value->rValue; - mod->BSIM4lvoffcvGiven = TRUE; - break; - - /* Width dependence */ - case BSIM4_MOD_WCDSC : - mod->BSIM4wcdsc = value->rValue; - mod->BSIM4wcdscGiven = TRUE; - break; - - - case BSIM4_MOD_WCDSCB : - mod->BSIM4wcdscb = value->rValue; - mod->BSIM4wcdscbGiven = TRUE; - break; - case BSIM4_MOD_WCDSCD : - mod->BSIM4wcdscd = value->rValue; - mod->BSIM4wcdscdGiven = TRUE; - break; - case BSIM4_MOD_WCIT : - mod->BSIM4wcit = value->rValue; - mod->BSIM4wcitGiven = TRUE; - break; - case BSIM4_MOD_WNFACTOR : - mod->BSIM4wnfactor = value->rValue; - mod->BSIM4wnfactorGiven = TRUE; - break; - case BSIM4_MOD_WXJ: - mod->BSIM4wxj = value->rValue; - mod->BSIM4wxjGiven = TRUE; - break; - case BSIM4_MOD_WVSAT: - mod->BSIM4wvsat = value->rValue; - mod->BSIM4wvsatGiven = TRUE; - break; - - - case BSIM4_MOD_WA0: - mod->BSIM4wa0 = value->rValue; - mod->BSIM4wa0Given = TRUE; - break; - case BSIM4_MOD_WAGS: - mod->BSIM4wags = value->rValue; - mod->BSIM4wagsGiven = TRUE; - break; - case BSIM4_MOD_WA1: - mod->BSIM4wa1 = value->rValue; - mod->BSIM4wa1Given = TRUE; - break; - case BSIM4_MOD_WA2: - mod->BSIM4wa2 = value->rValue; - mod->BSIM4wa2Given = TRUE; - break; - case BSIM4_MOD_WAT: - mod->BSIM4wat = value->rValue; - mod->BSIM4watGiven = TRUE; - break; - case BSIM4_MOD_WKETA: - mod->BSIM4wketa = value->rValue; - mod->BSIM4wketaGiven = TRUE; - break; - case BSIM4_MOD_WNSUB: - mod->BSIM4wnsub = value->rValue; - mod->BSIM4wnsubGiven = TRUE; - break; - case BSIM4_MOD_WNDEP: - mod->BSIM4wndep = value->rValue; - mod->BSIM4wndepGiven = TRUE; - if (mod->BSIM4wndep > 1.0e20) - mod->BSIM4wndep *= 1.0e-6; - break; - case BSIM4_MOD_WNSD: - mod->BSIM4wnsd = value->rValue; - mod->BSIM4wnsdGiven = TRUE; - if (mod->BSIM4wnsd > 1.0e23) - mod->BSIM4wnsd *= 1.0e-6; - break; - case BSIM4_MOD_WNGATE: - mod->BSIM4wngate = value->rValue; - mod->BSIM4wngateGiven = TRUE; - if (mod->BSIM4wngate > 1.0e23) - mod->BSIM4wngate *= 1.0e-6; - break; - case BSIM4_MOD_WGAMMA1: - mod->BSIM4wgamma1 = value->rValue; - mod->BSIM4wgamma1Given = TRUE; - break; - case BSIM4_MOD_WGAMMA2: - mod->BSIM4wgamma2 = value->rValue; - mod->BSIM4wgamma2Given = TRUE; - break; - case BSIM4_MOD_WVBX: - mod->BSIM4wvbx = value->rValue; - mod->BSIM4wvbxGiven = TRUE; - break; - case BSIM4_MOD_WVBM: - mod->BSIM4wvbm = value->rValue; - mod->BSIM4wvbmGiven = TRUE; - break; - case BSIM4_MOD_WXT: - mod->BSIM4wxt = value->rValue; - mod->BSIM4wxtGiven = TRUE; - break; - case BSIM4_MOD_WK1: - mod->BSIM4wk1 = value->rValue; - mod->BSIM4wk1Given = TRUE; - break; - case BSIM4_MOD_WKT1: - mod->BSIM4wkt1 = value->rValue; - mod->BSIM4wkt1Given = TRUE; - break; - case BSIM4_MOD_WKT1L: - mod->BSIM4wkt1l = value->rValue; - mod->BSIM4wkt1lGiven = TRUE; - break; - case BSIM4_MOD_WKT2: - mod->BSIM4wkt2 = value->rValue; - mod->BSIM4wkt2Given = TRUE; - break; - case BSIM4_MOD_WK2: - mod->BSIM4wk2 = value->rValue; - mod->BSIM4wk2Given = TRUE; - break; - case BSIM4_MOD_WK3: - mod->BSIM4wk3 = value->rValue; - mod->BSIM4wk3Given = TRUE; - break; - case BSIM4_MOD_WK3B: - mod->BSIM4wk3b = value->rValue; - mod->BSIM4wk3bGiven = TRUE; - break; - case BSIM4_MOD_WLPE0: - mod->BSIM4wlpe0 = value->rValue; - mod->BSIM4wlpe0Given = TRUE; - break; - case BSIM4_MOD_WLPEB: - mod->BSIM4wlpeb = value->rValue; - mod->BSIM4wlpebGiven = TRUE; - break; - case BSIM4_MOD_WDVTP0: - mod->BSIM4wdvtp0 = value->rValue; - mod->BSIM4wdvtp0Given = TRUE; - break; - case BSIM4_MOD_WDVTP1: - mod->BSIM4wdvtp1 = value->rValue; - mod->BSIM4wdvtp1Given = TRUE; - break; - case BSIM4_MOD_WDVTP2: /* New DIBL/Rout */ - mod->BSIM4wdvtp2 = value->rValue; - mod->BSIM4wdvtp2Given = TRUE; - break; - case BSIM4_MOD_WDVTP3: - mod->BSIM4wdvtp3 = value->rValue; - mod->BSIM4wdvtp3Given = TRUE; - break; - case BSIM4_MOD_WDVTP4: - mod->BSIM4wdvtp4 = value->rValue; - mod->BSIM4wdvtp4Given = TRUE; - break; - case BSIM4_MOD_WDVTP5: - mod->BSIM4wdvtp5 = value->rValue; - mod->BSIM4wdvtp5Given = TRUE; - break; - case BSIM4_MOD_WW0: - mod->BSIM4ww0 = value->rValue; - mod->BSIM4ww0Given = TRUE; - break; - case BSIM4_MOD_WDVT0: - mod->BSIM4wdvt0 = value->rValue; - mod->BSIM4wdvt0Given = TRUE; - break; - case BSIM4_MOD_WDVT1: - mod->BSIM4wdvt1 = value->rValue; - mod->BSIM4wdvt1Given = TRUE; - break; - case BSIM4_MOD_WDVT2: - mod->BSIM4wdvt2 = value->rValue; - mod->BSIM4wdvt2Given = TRUE; - break; - case BSIM4_MOD_WDVT0W: - mod->BSIM4wdvt0w = value->rValue; - mod->BSIM4wdvt0wGiven = TRUE; - break; - case BSIM4_MOD_WDVT1W: - mod->BSIM4wdvt1w = value->rValue; - mod->BSIM4wdvt1wGiven = TRUE; - break; - case BSIM4_MOD_WDVT2W: - mod->BSIM4wdvt2w = value->rValue; - mod->BSIM4wdvt2wGiven = TRUE; - break; - case BSIM4_MOD_WDROUT: - mod->BSIM4wdrout = value->rValue; - mod->BSIM4wdroutGiven = TRUE; - break; - case BSIM4_MOD_WDSUB: - mod->BSIM4wdsub = value->rValue; - mod->BSIM4wdsubGiven = TRUE; - break; - case BSIM4_MOD_WVTH0: - mod->BSIM4wvth0 = value->rValue; - mod->BSIM4wvth0Given = TRUE; - break; - case BSIM4_MOD_WUA: - mod->BSIM4wua = value->rValue; - mod->BSIM4wuaGiven = TRUE; - break; - case BSIM4_MOD_WUA1: - mod->BSIM4wua1 = value->rValue; - mod->BSIM4wua1Given = TRUE; - break; - case BSIM4_MOD_WUB: - mod->BSIM4wub = value->rValue; - mod->BSIM4wubGiven = TRUE; - break; - case BSIM4_MOD_WUB1: - mod->BSIM4wub1 = value->rValue; - mod->BSIM4wub1Given = TRUE; - break; - case BSIM4_MOD_WUC: - mod->BSIM4wuc = value->rValue; - mod->BSIM4wucGiven = TRUE; - break; - case BSIM4_MOD_WUC1: - mod->BSIM4wuc1 = value->rValue; - mod->BSIM4wuc1Given = TRUE; - break; - case BSIM4_MOD_WU0 : - mod->BSIM4wu0 = value->rValue; - mod->BSIM4wu0Given = TRUE; - break; - case BSIM4_MOD_WUTE : - mod->BSIM4wute = value->rValue; - mod->BSIM4wuteGiven = TRUE; - break; - case BSIM4_MOD_WUCSTE : - mod->BSIM4wucste = value->rValue; - mod->BSIM4wucsteGiven = TRUE; - break; - case BSIM4_MOD_WVOFF: - mod->BSIM4wvoff = value->rValue; - mod->BSIM4wvoffGiven = TRUE; - break; - case BSIM4_MOD_WTVOFF: - mod->BSIM4wtvoff = value->rValue; - mod->BSIM4wtvoffGiven = TRUE; - break; - case BSIM4_MOD_WTNFACTOR: /* v4.7 temp dep of leakage current */ - mod->BSIM4wtnfactor = value->rValue; - mod->BSIM4wtnfactorGiven = TRUE; - break; - case BSIM4_MOD_WTETA0: /* v4.7 temp dep of leakage current */ - mod->BSIM4wteta0 = value->rValue; - mod->BSIM4wteta0Given = TRUE; - break; - case BSIM4_MOD_WTVOFFCV: /* v4.7 temp dep of leakage current */ - mod->BSIM4wtvoffcv = value->rValue; - mod->BSIM4wtvoffcvGiven = TRUE; - break; - case BSIM4_MOD_WMINV: - mod->BSIM4wminv = value->rValue; - mod->BSIM4wminvGiven = TRUE; - break; - case BSIM4_MOD_WMINVCV: - mod->BSIM4wminvcv = value->rValue; - mod->BSIM4wminvcvGiven = TRUE; - break; - case BSIM4_MOD_WFPROUT: - mod->BSIM4wfprout = value->rValue; - mod->BSIM4wfproutGiven = TRUE; - break; - case BSIM4_MOD_WPDITS: - mod->BSIM4wpdits = value->rValue; - mod->BSIM4wpditsGiven = TRUE; - break; - case BSIM4_MOD_WPDITSD: - mod->BSIM4wpditsd = value->rValue; - mod->BSIM4wpditsdGiven = TRUE; - break; - case BSIM4_MOD_WDELTA : - mod->BSIM4wdelta = value->rValue; - mod->BSIM4wdeltaGiven = TRUE; - break; - case BSIM4_MOD_WRDSW: - mod->BSIM4wrdsw = value->rValue; - mod->BSIM4wrdswGiven = TRUE; - break; - case BSIM4_MOD_WRDW: - mod->BSIM4wrdw = value->rValue; - mod->BSIM4wrdwGiven = TRUE; - break; - case BSIM4_MOD_WRSW: - mod->BSIM4wrsw = value->rValue; - mod->BSIM4wrswGiven = TRUE; - break; - case BSIM4_MOD_WPRWB: - mod->BSIM4wprwb = value->rValue; - mod->BSIM4wprwbGiven = TRUE; - break; - case BSIM4_MOD_WPRWG: - mod->BSIM4wprwg = value->rValue; - mod->BSIM4wprwgGiven = TRUE; - break; - case BSIM4_MOD_WPRT: - mod->BSIM4wprt = value->rValue; - mod->BSIM4wprtGiven = TRUE; - break; - case BSIM4_MOD_WETA0: - mod->BSIM4weta0 = value->rValue; - mod->BSIM4weta0Given = TRUE; - break; - case BSIM4_MOD_WETAB: - mod->BSIM4wetab = value->rValue; - mod->BSIM4wetabGiven = TRUE; - break; - case BSIM4_MOD_WPCLM: - mod->BSIM4wpclm = value->rValue; - mod->BSIM4wpclmGiven = TRUE; - break; - case BSIM4_MOD_WPDIBL1: - mod->BSIM4wpdibl1 = value->rValue; - mod->BSIM4wpdibl1Given = TRUE; - break; - case BSIM4_MOD_WPDIBL2: - mod->BSIM4wpdibl2 = value->rValue; - mod->BSIM4wpdibl2Given = TRUE; - break; - case BSIM4_MOD_WPDIBLB: - mod->BSIM4wpdiblb = value->rValue; - mod->BSIM4wpdiblbGiven = TRUE; - break; - case BSIM4_MOD_WPSCBE1: - mod->BSIM4wpscbe1 = value->rValue; - mod->BSIM4wpscbe1Given = TRUE; - break; - case BSIM4_MOD_WPSCBE2: - mod->BSIM4wpscbe2 = value->rValue; - mod->BSIM4wpscbe2Given = TRUE; - break; - case BSIM4_MOD_WPVAG: - mod->BSIM4wpvag = value->rValue; - mod->BSIM4wpvagGiven = TRUE; - break; - case BSIM4_MOD_WWR : - mod->BSIM4wwr = value->rValue; - mod->BSIM4wwrGiven = TRUE; - break; - case BSIM4_MOD_WDWG : - mod->BSIM4wdwg = value->rValue; - mod->BSIM4wdwgGiven = TRUE; - break; - case BSIM4_MOD_WDWB : - mod->BSIM4wdwb = value->rValue; - mod->BSIM4wdwbGiven = TRUE; - break; - case BSIM4_MOD_WB0 : - mod->BSIM4wb0 = value->rValue; - mod->BSIM4wb0Given = TRUE; - break; - case BSIM4_MOD_WB1 : - mod->BSIM4wb1 = value->rValue; - mod->BSIM4wb1Given = TRUE; - break; - case BSIM4_MOD_WALPHA0 : - mod->BSIM4walpha0 = value->rValue; - mod->BSIM4walpha0Given = TRUE; - break; - case BSIM4_MOD_WALPHA1 : - mod->BSIM4walpha1 = value->rValue; - mod->BSIM4walpha1Given = TRUE; - break; - case BSIM4_MOD_WBETA0 : - mod->BSIM4wbeta0 = value->rValue; - mod->BSIM4wbeta0Given = TRUE; - break; - case BSIM4_MOD_WPHIN : - mod->BSIM4wphin = value->rValue; - mod->BSIM4wphinGiven = TRUE; - break; - case BSIM4_MOD_WAGIDL : - mod->BSIM4wagidl = value->rValue; - mod->BSIM4wagidlGiven = TRUE; - break; - case BSIM4_MOD_WBGIDL : - mod->BSIM4wbgidl = value->rValue; - mod->BSIM4wbgidlGiven = TRUE; - break; - case BSIM4_MOD_WCGIDL : - mod->BSIM4wcgidl = value->rValue; - mod->BSIM4wcgidlGiven = TRUE; - break; - case BSIM4_MOD_WEGIDL : - mod->BSIM4wegidl = value->rValue; - mod->BSIM4wegidlGiven = TRUE; - break; - case BSIM4_MOD_WFGIDL : /* v4.7 New GIDL/GISL */ - mod->BSIM4wfgidl = value->rValue; - mod->BSIM4wfgidlGiven = TRUE; - break; - case BSIM4_MOD_WKGIDL : /* v4.7 New GIDL/GISL */ - mod->BSIM4wkgidl = value->rValue; - mod->BSIM4wkgidlGiven = TRUE; - break; - case BSIM4_MOD_WRGIDL : /* v4.7 New GIDL/GISL */ - mod->BSIM4wrgidl = value->rValue; - mod->BSIM4wrgidlGiven = TRUE; - break; - case BSIM4_MOD_WAGISL : - mod->BSIM4wagisl = value->rValue; - mod->BSIM4wagislGiven = TRUE; - break; - case BSIM4_MOD_WBGISL : - mod->BSIM4wbgisl = value->rValue; - mod->BSIM4wbgislGiven = TRUE; - break; - case BSIM4_MOD_WCGISL : - mod->BSIM4wcgisl = value->rValue; - mod->BSIM4wcgislGiven = TRUE; - break; - case BSIM4_MOD_WEGISL : - mod->BSIM4wegisl = value->rValue; - mod->BSIM4wegislGiven = TRUE; - break; - case BSIM4_MOD_WFGISL : /* v4.7 New GIDL/GISL */ - mod->BSIM4wfgisl = value->rValue; - mod->BSIM4wfgislGiven = TRUE; - break; - case BSIM4_MOD_WKGISL : /* v4.7 New GIDL/GISL */ - mod->BSIM4wkgisl = value->rValue; - mod->BSIM4wkgislGiven = TRUE; - break; - case BSIM4_MOD_WRGISL : /* v4.7 New GIDL/GISL */ - mod->BSIM4wrgisl = value->rValue; - mod->BSIM4wrgislGiven = TRUE; - break; - case BSIM4_MOD_WAIGC : - mod->BSIM4waigc = value->rValue; - mod->BSIM4waigcGiven = TRUE; - break; - case BSIM4_MOD_WBIGC : - mod->BSIM4wbigc = value->rValue; - mod->BSIM4wbigcGiven = TRUE; - break; - case BSIM4_MOD_WCIGC : - mod->BSIM4wcigc = value->rValue; - mod->BSIM4wcigcGiven = TRUE; - break; - case BSIM4_MOD_WAIGSD : - mod->BSIM4waigsd = value->rValue; - mod->BSIM4waigsdGiven = TRUE; - break; - case BSIM4_MOD_WBIGSD : - mod->BSIM4wbigsd = value->rValue; - mod->BSIM4wbigsdGiven = TRUE; - break; - case BSIM4_MOD_WCIGSD : - mod->BSIM4wcigsd = value->rValue; - mod->BSIM4wcigsdGiven = TRUE; - break; - case BSIM4_MOD_WAIGS : - mod->BSIM4waigs = value->rValue; - mod->BSIM4waigsGiven = TRUE; - break; - case BSIM4_MOD_WBIGS : - mod->BSIM4wbigs = value->rValue; - mod->BSIM4wbigsGiven = TRUE; - break; - case BSIM4_MOD_WCIGS : - mod->BSIM4wcigs = value->rValue; - mod->BSIM4wcigsGiven = TRUE; - break; - case BSIM4_MOD_WAIGD : - mod->BSIM4waigd = value->rValue; - mod->BSIM4waigdGiven = TRUE; - break; - case BSIM4_MOD_WBIGD : - mod->BSIM4wbigd = value->rValue; - mod->BSIM4wbigdGiven = TRUE; - break; - case BSIM4_MOD_WCIGD : - mod->BSIM4wcigd = value->rValue; - mod->BSIM4wcigdGiven = TRUE; - break; - case BSIM4_MOD_WAIGBACC : - mod->BSIM4waigbacc = value->rValue; - mod->BSIM4waigbaccGiven = TRUE; - break; - case BSIM4_MOD_WBIGBACC : - mod->BSIM4wbigbacc = value->rValue; - mod->BSIM4wbigbaccGiven = TRUE; - break; - case BSIM4_MOD_WCIGBACC : - mod->BSIM4wcigbacc = value->rValue; - mod->BSIM4wcigbaccGiven = TRUE; - break; - case BSIM4_MOD_WAIGBINV : - mod->BSIM4waigbinv = value->rValue; - mod->BSIM4waigbinvGiven = TRUE; - break; - case BSIM4_MOD_WBIGBINV : - mod->BSIM4wbigbinv = value->rValue; - mod->BSIM4wbigbinvGiven = TRUE; - break; - case BSIM4_MOD_WCIGBINV : - mod->BSIM4wcigbinv = value->rValue; - mod->BSIM4wcigbinvGiven = TRUE; - break; - case BSIM4_MOD_WNIGC : - mod->BSIM4wnigc = value->rValue; - mod->BSIM4wnigcGiven = TRUE; - break; - case BSIM4_MOD_WNIGBINV : - mod->BSIM4wnigbinv = value->rValue; - mod->BSIM4wnigbinvGiven = TRUE; - break; - case BSIM4_MOD_WNIGBACC : - mod->BSIM4wnigbacc = value->rValue; - mod->BSIM4wnigbaccGiven = TRUE; - break; - case BSIM4_MOD_WNTOX : - mod->BSIM4wntox = value->rValue; - mod->BSIM4wntoxGiven = TRUE; - break; - case BSIM4_MOD_WEIGBINV : - mod->BSIM4weigbinv = value->rValue; - mod->BSIM4weigbinvGiven = TRUE; - break; - case BSIM4_MOD_WPIGCD : - mod->BSIM4wpigcd = value->rValue; - mod->BSIM4wpigcdGiven = TRUE; - break; - case BSIM4_MOD_WPOXEDGE : - mod->BSIM4wpoxedge = value->rValue; - mod->BSIM4wpoxedgeGiven = TRUE; - break; - case BSIM4_MOD_WXRCRG1 : - mod->BSIM4wxrcrg1 = value->rValue; - mod->BSIM4wxrcrg1Given = TRUE; - break; - case BSIM4_MOD_WXRCRG2 : - mod->BSIM4wxrcrg2 = value->rValue; - mod->BSIM4wxrcrg2Given = TRUE; - break; - case BSIM4_MOD_WLAMBDA : - mod->BSIM4wlambda = value->rValue; - mod->BSIM4wlambdaGiven = TRUE; - break; - case BSIM4_MOD_WVTL : - mod->BSIM4wvtl = value->rValue; - mod->BSIM4wvtlGiven = TRUE; - break; - case BSIM4_MOD_WXN: - mod->BSIM4wxn = value->rValue; - mod->BSIM4wxnGiven = TRUE; - break; - case BSIM4_MOD_WVFBSDOFF: - mod->BSIM4wvfbsdoff = value->rValue; - mod->BSIM4wvfbsdoffGiven = TRUE; - break; - case BSIM4_MOD_WTVFBSDOFF: - mod->BSIM4wtvfbsdoff = value->rValue; - mod->BSIM4wtvfbsdoffGiven = TRUE; - break; - case BSIM4_MOD_WEU : - mod->BSIM4weu = value->rValue; - mod->BSIM4weuGiven = TRUE; - break; - case BSIM4_MOD_WUCS : - mod->BSIM4wucs = value->rValue; - mod->BSIM4wucsGiven = TRUE; - break; - case BSIM4_MOD_WVFB : - mod->BSIM4wvfb = value->rValue; - mod->BSIM4wvfbGiven = TRUE; - break; - case BSIM4_MOD_WCGSL : - mod->BSIM4wcgsl = value->rValue; - mod->BSIM4wcgslGiven = TRUE; - break; - case BSIM4_MOD_WCGDL : - mod->BSIM4wcgdl = value->rValue; - mod->BSIM4wcgdlGiven = TRUE; - break; - case BSIM4_MOD_WCKAPPAS : - mod->BSIM4wckappas = value->rValue; - mod->BSIM4wckappasGiven = TRUE; - break; - case BSIM4_MOD_WCKAPPAD : - mod->BSIM4wckappad = value->rValue; - mod->BSIM4wckappadGiven = TRUE; - break; - case BSIM4_MOD_WCF : - mod->BSIM4wcf = value->rValue; - mod->BSIM4wcfGiven = TRUE; - break; - case BSIM4_MOD_WCLC : - mod->BSIM4wclc = value->rValue; - mod->BSIM4wclcGiven = TRUE; - break; - case BSIM4_MOD_WCLE : - mod->BSIM4wcle = value->rValue; - mod->BSIM4wcleGiven = TRUE; - break; - case BSIM4_MOD_WVFBCV : - mod->BSIM4wvfbcv = value->rValue; - mod->BSIM4wvfbcvGiven = TRUE; - break; - case BSIM4_MOD_WACDE : - mod->BSIM4wacde = value->rValue; - mod->BSIM4wacdeGiven = TRUE; - break; - case BSIM4_MOD_WMOIN : - mod->BSIM4wmoin = value->rValue; - mod->BSIM4wmoinGiven = TRUE; - break; - case BSIM4_MOD_WNOFF : - mod->BSIM4wnoff = value->rValue; - mod->BSIM4wnoffGiven = TRUE; - break; - case BSIM4_MOD_WVOFFCV : - mod->BSIM4wvoffcv = value->rValue; - mod->BSIM4wvoffcvGiven = TRUE; - break; - - /* Cross-term dependence */ - case BSIM4_MOD_PCDSC : - mod->BSIM4pcdsc = value->rValue; - mod->BSIM4pcdscGiven = TRUE; - break; - - - case BSIM4_MOD_PCDSCB : - mod->BSIM4pcdscb = value->rValue; - mod->BSIM4pcdscbGiven = TRUE; - break; - case BSIM4_MOD_PCDSCD : - mod->BSIM4pcdscd = value->rValue; - mod->BSIM4pcdscdGiven = TRUE; - break; - case BSIM4_MOD_PCIT : - mod->BSIM4pcit = value->rValue; - mod->BSIM4pcitGiven = TRUE; - break; - case BSIM4_MOD_PNFACTOR : - mod->BSIM4pnfactor = value->rValue; - mod->BSIM4pnfactorGiven = TRUE; - break; - case BSIM4_MOD_PXJ: - mod->BSIM4pxj = value->rValue; - mod->BSIM4pxjGiven = TRUE; - break; - case BSIM4_MOD_PVSAT: - mod->BSIM4pvsat = value->rValue; - mod->BSIM4pvsatGiven = TRUE; - break; - - - case BSIM4_MOD_PA0: - mod->BSIM4pa0 = value->rValue; - mod->BSIM4pa0Given = TRUE; - break; - case BSIM4_MOD_PAGS: - mod->BSIM4pags = value->rValue; - mod->BSIM4pagsGiven = TRUE; - break; - case BSIM4_MOD_PA1: - mod->BSIM4pa1 = value->rValue; - mod->BSIM4pa1Given = TRUE; - break; - case BSIM4_MOD_PA2: - mod->BSIM4pa2 = value->rValue; - mod->BSIM4pa2Given = TRUE; - break; - case BSIM4_MOD_PAT: - mod->BSIM4pat = value->rValue; - mod->BSIM4patGiven = TRUE; - break; - case BSIM4_MOD_PKETA: - mod->BSIM4pketa = value->rValue; - mod->BSIM4pketaGiven = TRUE; - break; - case BSIM4_MOD_PNSUB: - mod->BSIM4pnsub = value->rValue; - mod->BSIM4pnsubGiven = TRUE; - break; - case BSIM4_MOD_PNDEP: - mod->BSIM4pndep = value->rValue; - mod->BSIM4pndepGiven = TRUE; - if (mod->BSIM4pndep > 1.0e20) - mod->BSIM4pndep *= 1.0e-6; - break; - case BSIM4_MOD_PNSD: - mod->BSIM4pnsd = value->rValue; - mod->BSIM4pnsdGiven = TRUE; - if (mod->BSIM4pnsd > 1.0e23) - mod->BSIM4pnsd *= 1.0e-6; - break; - case BSIM4_MOD_PNGATE: - mod->BSIM4pngate = value->rValue; - mod->BSIM4pngateGiven = TRUE; - if (mod->BSIM4pngate > 1.0e23) - mod->BSIM4pngate *= 1.0e-6; - break; - case BSIM4_MOD_PGAMMA1: - mod->BSIM4pgamma1 = value->rValue; - mod->BSIM4pgamma1Given = TRUE; - break; - case BSIM4_MOD_PGAMMA2: - mod->BSIM4pgamma2 = value->rValue; - mod->BSIM4pgamma2Given = TRUE; - break; - case BSIM4_MOD_PVBX: - mod->BSIM4pvbx = value->rValue; - mod->BSIM4pvbxGiven = TRUE; - break; - case BSIM4_MOD_PVBM: - mod->BSIM4pvbm = value->rValue; - mod->BSIM4pvbmGiven = TRUE; - break; - case BSIM4_MOD_PXT: - mod->BSIM4pxt = value->rValue; - mod->BSIM4pxtGiven = TRUE; - break; - case BSIM4_MOD_PK1: - mod->BSIM4pk1 = value->rValue; - mod->BSIM4pk1Given = TRUE; - break; - case BSIM4_MOD_PKT1: - mod->BSIM4pkt1 = value->rValue; - mod->BSIM4pkt1Given = TRUE; - break; - case BSIM4_MOD_PKT1L: - mod->BSIM4pkt1l = value->rValue; - mod->BSIM4pkt1lGiven = TRUE; - break; - case BSIM4_MOD_PKT2: - mod->BSIM4pkt2 = value->rValue; - mod->BSIM4pkt2Given = TRUE; - break; - case BSIM4_MOD_PK2: - mod->BSIM4pk2 = value->rValue; - mod->BSIM4pk2Given = TRUE; - break; - case BSIM4_MOD_PK3: - mod->BSIM4pk3 = value->rValue; - mod->BSIM4pk3Given = TRUE; - break; - case BSIM4_MOD_PK3B: - mod->BSIM4pk3b = value->rValue; - mod->BSIM4pk3bGiven = TRUE; - break; - case BSIM4_MOD_PLPE0: - mod->BSIM4plpe0 = value->rValue; - mod->BSIM4plpe0Given = TRUE; - break; - case BSIM4_MOD_PLPEB: - mod->BSIM4plpeb = value->rValue; - mod->BSIM4plpebGiven = TRUE; - break; - case BSIM4_MOD_PDVTP0: - mod->BSIM4pdvtp0 = value->rValue; - mod->BSIM4pdvtp0Given = TRUE; - break; - case BSIM4_MOD_PDVTP1: - mod->BSIM4pdvtp1 = value->rValue; - mod->BSIM4pdvtp1Given = TRUE; - break; - case BSIM4_MOD_PDVTP2: /* New DIBL/Rout */ - mod->BSIM4pdvtp2 = value->rValue; - mod->BSIM4pdvtp2Given = TRUE; - break; - case BSIM4_MOD_PDVTP3: - mod->BSIM4pdvtp3 = value->rValue; - mod->BSIM4pdvtp3Given = TRUE; - break; - case BSIM4_MOD_PDVTP4: - mod->BSIM4pdvtp4 = value->rValue; - mod->BSIM4pdvtp4Given = TRUE; - break; - case BSIM4_MOD_PDVTP5: - mod->BSIM4pdvtp5 = value->rValue; - mod->BSIM4pdvtp5Given = TRUE; - break; - case BSIM4_MOD_PW0: - mod->BSIM4pw0 = value->rValue; - mod->BSIM4pw0Given = TRUE; - break; - case BSIM4_MOD_PDVT0: - mod->BSIM4pdvt0 = value->rValue; - mod->BSIM4pdvt0Given = TRUE; - break; - case BSIM4_MOD_PDVT1: - mod->BSIM4pdvt1 = value->rValue; - mod->BSIM4pdvt1Given = TRUE; - break; - case BSIM4_MOD_PDVT2: - mod->BSIM4pdvt2 = value->rValue; - mod->BSIM4pdvt2Given = TRUE; - break; - case BSIM4_MOD_PDVT0W: - mod->BSIM4pdvt0w = value->rValue; - mod->BSIM4pdvt0wGiven = TRUE; - break; - case BSIM4_MOD_PDVT1W: - mod->BSIM4pdvt1w = value->rValue; - mod->BSIM4pdvt1wGiven = TRUE; - break; - case BSIM4_MOD_PDVT2W: - mod->BSIM4pdvt2w = value->rValue; - mod->BSIM4pdvt2wGiven = TRUE; - break; - case BSIM4_MOD_PDROUT: - mod->BSIM4pdrout = value->rValue; - mod->BSIM4pdroutGiven = TRUE; - break; - case BSIM4_MOD_PDSUB: - mod->BSIM4pdsub = value->rValue; - mod->BSIM4pdsubGiven = TRUE; - break; - case BSIM4_MOD_PVTH0: - mod->BSIM4pvth0 = value->rValue; - mod->BSIM4pvth0Given = TRUE; - break; - case BSIM4_MOD_PUA: - mod->BSIM4pua = value->rValue; - mod->BSIM4puaGiven = TRUE; - break; - case BSIM4_MOD_PUA1: - mod->BSIM4pua1 = value->rValue; - mod->BSIM4pua1Given = TRUE; - break; - case BSIM4_MOD_PUB: - mod->BSIM4pub = value->rValue; - mod->BSIM4pubGiven = TRUE; - break; - case BSIM4_MOD_PUB1: - mod->BSIM4pub1 = value->rValue; - mod->BSIM4pub1Given = TRUE; - break; - case BSIM4_MOD_PUC: - mod->BSIM4puc = value->rValue; - mod->BSIM4pucGiven = TRUE; - break; - case BSIM4_MOD_PUC1: - mod->BSIM4puc1 = value->rValue; - mod->BSIM4puc1Given = TRUE; - break; - case BSIM4_MOD_PU0 : - mod->BSIM4pu0 = value->rValue; - mod->BSIM4pu0Given = TRUE; - break; - case BSIM4_MOD_PUTE : - mod->BSIM4pute = value->rValue; - mod->BSIM4puteGiven = TRUE; - break; - case BSIM4_MOD_PUCSTE : - mod->BSIM4pucste = value->rValue; - mod->BSIM4pucsteGiven = TRUE; - break; - case BSIM4_MOD_PVOFF: - mod->BSIM4pvoff = value->rValue; - mod->BSIM4pvoffGiven = TRUE; - break; - case BSIM4_MOD_PTVOFF: - mod->BSIM4ptvoff = value->rValue; - mod->BSIM4ptvoffGiven = TRUE; - break; - case BSIM4_MOD_PTNFACTOR: /* v4.7 temp dep of leakage current */ - mod->BSIM4ptnfactor = value->rValue; - mod->BSIM4ptnfactorGiven = TRUE; - break; - case BSIM4_MOD_PTETA0: /* v4.7 temp dep of leakage current */ - mod->BSIM4pteta0 = value->rValue; - mod->BSIM4pteta0Given = TRUE; - break; - case BSIM4_MOD_PTVOFFCV: /* v4.7 temp dep of leakage current */ - mod->BSIM4ptvoffcv = value->rValue; - mod->BSIM4ptvoffcvGiven = TRUE; - break; - case BSIM4_MOD_PMINV: - mod->BSIM4pminv = value->rValue; - mod->BSIM4pminvGiven = TRUE; - break; - case BSIM4_MOD_PMINVCV: - mod->BSIM4pminvcv = value->rValue; - mod->BSIM4pminvcvGiven = TRUE; - break; - case BSIM4_MOD_PFPROUT: - mod->BSIM4pfprout = value->rValue; - mod->BSIM4pfproutGiven = TRUE; - break; - case BSIM4_MOD_PPDITS: - mod->BSIM4ppdits = value->rValue; - mod->BSIM4ppditsGiven = TRUE; - break; - case BSIM4_MOD_PPDITSD: - mod->BSIM4ppditsd = value->rValue; - mod->BSIM4ppditsdGiven = TRUE; - break; - case BSIM4_MOD_PDELTA : - mod->BSIM4pdelta = value->rValue; - mod->BSIM4pdeltaGiven = TRUE; - break; - case BSIM4_MOD_PRDSW: - mod->BSIM4prdsw = value->rValue; - mod->BSIM4prdswGiven = TRUE; - break; - case BSIM4_MOD_PRDW: - mod->BSIM4prdw = value->rValue; - mod->BSIM4prdwGiven = TRUE; - break; - case BSIM4_MOD_PRSW: - mod->BSIM4prsw = value->rValue; - mod->BSIM4prswGiven = TRUE; - break; - case BSIM4_MOD_PPRWB: - mod->BSIM4pprwb = value->rValue; - mod->BSIM4pprwbGiven = TRUE; - break; - case BSIM4_MOD_PPRWG: - mod->BSIM4pprwg = value->rValue; - mod->BSIM4pprwgGiven = TRUE; - break; - case BSIM4_MOD_PPRT: - mod->BSIM4pprt = value->rValue; - mod->BSIM4pprtGiven = TRUE; - break; - case BSIM4_MOD_PETA0: - mod->BSIM4peta0 = value->rValue; - mod->BSIM4peta0Given = TRUE; - break; - case BSIM4_MOD_PETAB: - mod->BSIM4petab = value->rValue; - mod->BSIM4petabGiven = TRUE; - break; - case BSIM4_MOD_PPCLM: - mod->BSIM4ppclm = value->rValue; - mod->BSIM4ppclmGiven = TRUE; - break; - case BSIM4_MOD_PPDIBL1: - mod->BSIM4ppdibl1 = value->rValue; - mod->BSIM4ppdibl1Given = TRUE; - break; - case BSIM4_MOD_PPDIBL2: - mod->BSIM4ppdibl2 = value->rValue; - mod->BSIM4ppdibl2Given = TRUE; - break; - case BSIM4_MOD_PPDIBLB: - mod->BSIM4ppdiblb = value->rValue; - mod->BSIM4ppdiblbGiven = TRUE; - break; - case BSIM4_MOD_PPSCBE1: - mod->BSIM4ppscbe1 = value->rValue; - mod->BSIM4ppscbe1Given = TRUE; - break; - case BSIM4_MOD_PPSCBE2: - mod->BSIM4ppscbe2 = value->rValue; - mod->BSIM4ppscbe2Given = TRUE; - break; - case BSIM4_MOD_PPVAG: - mod->BSIM4ppvag = value->rValue; - mod->BSIM4ppvagGiven = TRUE; - break; - case BSIM4_MOD_PWR : - mod->BSIM4pwr = value->rValue; - mod->BSIM4pwrGiven = TRUE; - break; - case BSIM4_MOD_PDWG : - mod->BSIM4pdwg = value->rValue; - mod->BSIM4pdwgGiven = TRUE; - break; - case BSIM4_MOD_PDWB : - mod->BSIM4pdwb = value->rValue; - mod->BSIM4pdwbGiven = TRUE; - break; - case BSIM4_MOD_PB0 : - mod->BSIM4pb0 = value->rValue; - mod->BSIM4pb0Given = TRUE; - break; - case BSIM4_MOD_PB1 : - mod->BSIM4pb1 = value->rValue; - mod->BSIM4pb1Given = TRUE; - break; - case BSIM4_MOD_PALPHA0 : - mod->BSIM4palpha0 = value->rValue; - mod->BSIM4palpha0Given = TRUE; - break; - case BSIM4_MOD_PALPHA1 : - mod->BSIM4palpha1 = value->rValue; - mod->BSIM4palpha1Given = TRUE; - break; - case BSIM4_MOD_PBETA0 : - mod->BSIM4pbeta0 = value->rValue; - mod->BSIM4pbeta0Given = TRUE; - break; - case BSIM4_MOD_PPHIN : - mod->BSIM4pphin = value->rValue; - mod->BSIM4pphinGiven = TRUE; - break; - case BSIM4_MOD_PAGIDL : - mod->BSIM4pagidl = value->rValue; - mod->BSIM4pagidlGiven = TRUE; - break; - case BSIM4_MOD_PBGIDL : - mod->BSIM4pbgidl = value->rValue; - mod->BSIM4pbgidlGiven = TRUE; - break; - case BSIM4_MOD_PCGIDL : - mod->BSIM4pcgidl = value->rValue; - mod->BSIM4pcgidlGiven = TRUE; - break; - case BSIM4_MOD_PEGIDL : - mod->BSIM4pegidl = value->rValue; - mod->BSIM4pegidlGiven = TRUE; - break; - case BSIM4_MOD_PFGIDL : /* v4.7 New GIDL/GISL */ - mod->BSIM4pfgidl = value->rValue; - mod->BSIM4pfgidlGiven = TRUE; - break; - case BSIM4_MOD_PKGIDL : /* v4.7 New GIDL/GISL */ - mod->BSIM4pkgidl = value->rValue; - mod->BSIM4pkgidlGiven = TRUE; - break; - case BSIM4_MOD_PRGIDL : /* v4.7 New GIDL/GISL */ - mod->BSIM4prgidl = value->rValue; - mod->BSIM4prgidlGiven = TRUE; - break; - case BSIM4_MOD_PAGISL : - mod->BSIM4pagisl = value->rValue; - mod->BSIM4pagislGiven = TRUE; - break; - case BSIM4_MOD_PBGISL : - mod->BSIM4pbgisl = value->rValue; - mod->BSIM4pbgislGiven = TRUE; - break; - case BSIM4_MOD_PCGISL : - mod->BSIM4pcgisl = value->rValue; - mod->BSIM4pcgislGiven = TRUE; - break; - case BSIM4_MOD_PEGISL : - mod->BSIM4pegisl = value->rValue; - mod->BSIM4pegislGiven = TRUE; - break; - case BSIM4_MOD_PFGISL : /* v4.7 New GIDL/GISL */ - mod->BSIM4pfgisl = value->rValue; - mod->BSIM4pfgislGiven = TRUE; - break; - case BSIM4_MOD_PKGISL : /* v4.7 New GIDL/GISL */ - mod->BSIM4pkgisl = value->rValue; - mod->BSIM4pkgislGiven = TRUE; - break; - case BSIM4_MOD_PRGISL : /* v4.7 New GIDL/GISL */ - mod->BSIM4prgisl = value->rValue; - mod->BSIM4prgislGiven = TRUE; - break; - case BSIM4_MOD_PAIGC : - mod->BSIM4paigc = value->rValue; - mod->BSIM4paigcGiven = TRUE; - break; - case BSIM4_MOD_PBIGC : - mod->BSIM4pbigc = value->rValue; - mod->BSIM4pbigcGiven = TRUE; - break; - case BSIM4_MOD_PCIGC : - mod->BSIM4pcigc = value->rValue; - mod->BSIM4pcigcGiven = TRUE; - break; - case BSIM4_MOD_PAIGSD : - mod->BSIM4paigsd = value->rValue; - mod->BSIM4paigsdGiven = TRUE; - break; - case BSIM4_MOD_PBIGSD : - mod->BSIM4pbigsd = value->rValue; - mod->BSIM4pbigsdGiven = TRUE; - break; - case BSIM4_MOD_PCIGSD : - mod->BSIM4pcigsd = value->rValue; - mod->BSIM4pcigsdGiven = TRUE; - break; - case BSIM4_MOD_PAIGS : - mod->BSIM4paigs = value->rValue; - mod->BSIM4paigsGiven = TRUE; - break; - case BSIM4_MOD_PBIGS : - mod->BSIM4pbigs = value->rValue; - mod->BSIM4pbigsGiven = TRUE; - break; - case BSIM4_MOD_PCIGS : - mod->BSIM4pcigs = value->rValue; - mod->BSIM4pcigsGiven = TRUE; - break; - case BSIM4_MOD_PAIGD : - mod->BSIM4paigd = value->rValue; - mod->BSIM4paigdGiven = TRUE; - break; - case BSIM4_MOD_PBIGD : - mod->BSIM4pbigd = value->rValue; - mod->BSIM4pbigdGiven = TRUE; - break; - case BSIM4_MOD_PCIGD : - mod->BSIM4pcigd = value->rValue; - mod->BSIM4pcigdGiven = TRUE; - break; - case BSIM4_MOD_PAIGBACC : - mod->BSIM4paigbacc = value->rValue; - mod->BSIM4paigbaccGiven = TRUE; - break; - case BSIM4_MOD_PBIGBACC : - mod->BSIM4pbigbacc = value->rValue; - mod->BSIM4pbigbaccGiven = TRUE; - break; - case BSIM4_MOD_PCIGBACC : - mod->BSIM4pcigbacc = value->rValue; - mod->BSIM4pcigbaccGiven = TRUE; - break; - case BSIM4_MOD_PAIGBINV : - mod->BSIM4paigbinv = value->rValue; - mod->BSIM4paigbinvGiven = TRUE; - break; - case BSIM4_MOD_PBIGBINV : - mod->BSIM4pbigbinv = value->rValue; - mod->BSIM4pbigbinvGiven = TRUE; - break; - case BSIM4_MOD_PCIGBINV : - mod->BSIM4pcigbinv = value->rValue; - mod->BSIM4pcigbinvGiven = TRUE; - break; - case BSIM4_MOD_PNIGC : - mod->BSIM4pnigc = value->rValue; - mod->BSIM4pnigcGiven = TRUE; - break; - case BSIM4_MOD_PNIGBINV : - mod->BSIM4pnigbinv = value->rValue; - mod->BSIM4pnigbinvGiven = TRUE; - break; - case BSIM4_MOD_PNIGBACC : - mod->BSIM4pnigbacc = value->rValue; - mod->BSIM4pnigbaccGiven = TRUE; - break; - case BSIM4_MOD_PNTOX : - mod->BSIM4pntox = value->rValue; - mod->BSIM4pntoxGiven = TRUE; - break; - case BSIM4_MOD_PEIGBINV : - mod->BSIM4peigbinv = value->rValue; - mod->BSIM4peigbinvGiven = TRUE; - break; - case BSIM4_MOD_PPIGCD : - mod->BSIM4ppigcd = value->rValue; - mod->BSIM4ppigcdGiven = TRUE; - break; - case BSIM4_MOD_PPOXEDGE : - mod->BSIM4ppoxedge = value->rValue; - mod->BSIM4ppoxedgeGiven = TRUE; - break; - case BSIM4_MOD_PXRCRG1 : - mod->BSIM4pxrcrg1 = value->rValue; - mod->BSIM4pxrcrg1Given = TRUE; - break; - case BSIM4_MOD_PXRCRG2 : - mod->BSIM4pxrcrg2 = value->rValue; - mod->BSIM4pxrcrg2Given = TRUE; - break; - case BSIM4_MOD_PLAMBDA : - mod->BSIM4plambda = value->rValue; - mod->BSIM4plambdaGiven = TRUE; - break; - case BSIM4_MOD_PVTL : - mod->BSIM4pvtl = value->rValue; - mod->BSIM4pvtlGiven = TRUE; - break; - case BSIM4_MOD_PXN: - mod->BSIM4pxn = value->rValue; - mod->BSIM4pxnGiven = TRUE; - break; - case BSIM4_MOD_PVFBSDOFF: - mod->BSIM4pvfbsdoff = value->rValue; - mod->BSIM4pvfbsdoffGiven = TRUE; - break; - case BSIM4_MOD_PTVFBSDOFF: - mod->BSIM4ptvfbsdoff = value->rValue; - mod->BSIM4ptvfbsdoffGiven = TRUE; - break; - case BSIM4_MOD_PEU : - mod->BSIM4peu = value->rValue; - mod->BSIM4peuGiven = TRUE; - break; - case BSIM4_MOD_PUCS : - mod->BSIM4pucs = value->rValue; - mod->BSIM4pucsGiven = TRUE; - break; - case BSIM4_MOD_PVFB : - mod->BSIM4pvfb = value->rValue; - mod->BSIM4pvfbGiven = TRUE; - break; - case BSIM4_MOD_PCGSL : - mod->BSIM4pcgsl = value->rValue; - mod->BSIM4pcgslGiven = TRUE; - break; - case BSIM4_MOD_PCGDL : - mod->BSIM4pcgdl = value->rValue; - mod->BSIM4pcgdlGiven = TRUE; - break; - case BSIM4_MOD_PCKAPPAS : - mod->BSIM4pckappas = value->rValue; - mod->BSIM4pckappasGiven = TRUE; - break; - case BSIM4_MOD_PCKAPPAD : - mod->BSIM4pckappad = value->rValue; - mod->BSIM4pckappadGiven = TRUE; - break; - case BSIM4_MOD_PCF : - mod->BSIM4pcf = value->rValue; - mod->BSIM4pcfGiven = TRUE; - break; - case BSIM4_MOD_PCLC : - mod->BSIM4pclc = value->rValue; - mod->BSIM4pclcGiven = TRUE; - break; - case BSIM4_MOD_PCLE : - mod->BSIM4pcle = value->rValue; - mod->BSIM4pcleGiven = TRUE; - break; - case BSIM4_MOD_PVFBCV : - mod->BSIM4pvfbcv = value->rValue; - mod->BSIM4pvfbcvGiven = TRUE; - break; - case BSIM4_MOD_PACDE : - mod->BSIM4pacde = value->rValue; - mod->BSIM4pacdeGiven = TRUE; - break; - case BSIM4_MOD_PMOIN : - mod->BSIM4pmoin = value->rValue; - mod->BSIM4pmoinGiven = TRUE; - break; - case BSIM4_MOD_PNOFF : - mod->BSIM4pnoff = value->rValue; - mod->BSIM4pnoffGiven = TRUE; - break; - case BSIM4_MOD_PVOFFCV : - mod->BSIM4pvoffcv = value->rValue; - mod->BSIM4pvoffcvGiven = TRUE; - break; - - case BSIM4_MOD_TNOM : - mod->BSIM4tnom = value->rValue + CONSTCtoK; - mod->BSIM4tnomGiven = TRUE; - break; - case BSIM4_MOD_CGSO : - mod->BSIM4cgso = value->rValue; - mod->BSIM4cgsoGiven = TRUE; - break; - case BSIM4_MOD_CGDO : - mod->BSIM4cgdo = value->rValue; - mod->BSIM4cgdoGiven = TRUE; - break; - case BSIM4_MOD_CGBO : - mod->BSIM4cgbo = value->rValue; - mod->BSIM4cgboGiven = TRUE; - break; - case BSIM4_MOD_XPART : - mod->BSIM4xpart = value->rValue; - mod->BSIM4xpartGiven = TRUE; - break; - case BSIM4_MOD_RSH : - mod->BSIM4sheetResistance = value->rValue; - mod->BSIM4sheetResistanceGiven = TRUE; - break; - case BSIM4_MOD_JSS : - mod->BSIM4SjctSatCurDensity = value->rValue; - mod->BSIM4SjctSatCurDensityGiven = TRUE; - break; - case BSIM4_MOD_JSWS : - mod->BSIM4SjctSidewallSatCurDensity = value->rValue; - mod->BSIM4SjctSidewallSatCurDensityGiven = TRUE; - break; - case BSIM4_MOD_JSWGS : - mod->BSIM4SjctGateSidewallSatCurDensity = value->rValue; - mod->BSIM4SjctGateSidewallSatCurDensityGiven = TRUE; - break; - case BSIM4_MOD_PBS : - mod->BSIM4SbulkJctPotential = value->rValue; - mod->BSIM4SbulkJctPotentialGiven = TRUE; - break; - case BSIM4_MOD_MJS : - mod->BSIM4SbulkJctBotGradingCoeff = value->rValue; - mod->BSIM4SbulkJctBotGradingCoeffGiven = TRUE; - break; - case BSIM4_MOD_PBSWS : - mod->BSIM4SsidewallJctPotential = value->rValue; - mod->BSIM4SsidewallJctPotentialGiven = TRUE; - break; - case BSIM4_MOD_MJSWS : - mod->BSIM4SbulkJctSideGradingCoeff = value->rValue; - mod->BSIM4SbulkJctSideGradingCoeffGiven = TRUE; - break; - case BSIM4_MOD_CJS : - mod->BSIM4SunitAreaJctCap = value->rValue; - mod->BSIM4SunitAreaJctCapGiven = TRUE; - break; - case BSIM4_MOD_CJSWS : - mod->BSIM4SunitLengthSidewallJctCap = value->rValue; - mod->BSIM4SunitLengthSidewallJctCapGiven = TRUE; - break; - case BSIM4_MOD_NJS : - mod->BSIM4SjctEmissionCoeff = value->rValue; - mod->BSIM4SjctEmissionCoeffGiven = TRUE; - break; - case BSIM4_MOD_PBSWGS : - mod->BSIM4SGatesidewallJctPotential = value->rValue; - mod->BSIM4SGatesidewallJctPotentialGiven = TRUE; - break; - case BSIM4_MOD_MJSWGS : - mod->BSIM4SbulkJctGateSideGradingCoeff = value->rValue; - mod->BSIM4SbulkJctGateSideGradingCoeffGiven = TRUE; - break; - case BSIM4_MOD_CJSWGS : - mod->BSIM4SunitLengthGateSidewallJctCap = value->rValue; - mod->BSIM4SunitLengthGateSidewallJctCapGiven = TRUE; - break; - case BSIM4_MOD_XTIS : - mod->BSIM4SjctTempExponent = value->rValue; - mod->BSIM4SjctTempExponentGiven = TRUE; - break; - case BSIM4_MOD_JSD : - mod->BSIM4DjctSatCurDensity = value->rValue; - mod->BSIM4DjctSatCurDensityGiven = TRUE; - break; - case BSIM4_MOD_JSWD : - mod->BSIM4DjctSidewallSatCurDensity = value->rValue; - mod->BSIM4DjctSidewallSatCurDensityGiven = TRUE; - break; - case BSIM4_MOD_JSWGD : - mod->BSIM4DjctGateSidewallSatCurDensity = value->rValue; - mod->BSIM4DjctGateSidewallSatCurDensityGiven = TRUE; - break; - case BSIM4_MOD_PBD : - mod->BSIM4DbulkJctPotential = value->rValue; - mod->BSIM4DbulkJctPotentialGiven = TRUE; - break; - case BSIM4_MOD_MJD : - mod->BSIM4DbulkJctBotGradingCoeff = value->rValue; - mod->BSIM4DbulkJctBotGradingCoeffGiven = TRUE; - break; - case BSIM4_MOD_PBSWD : - mod->BSIM4DsidewallJctPotential = value->rValue; - mod->BSIM4DsidewallJctPotentialGiven = TRUE; - break; - case BSIM4_MOD_MJSWD : - mod->BSIM4DbulkJctSideGradingCoeff = value->rValue; - mod->BSIM4DbulkJctSideGradingCoeffGiven = TRUE; - break; - case BSIM4_MOD_CJD : - mod->BSIM4DunitAreaJctCap = value->rValue; - mod->BSIM4DunitAreaJctCapGiven = TRUE; - break; - case BSIM4_MOD_CJSWD : - mod->BSIM4DunitLengthSidewallJctCap = value->rValue; - mod->BSIM4DunitLengthSidewallJctCapGiven = TRUE; - break; - case BSIM4_MOD_NJD : - mod->BSIM4DjctEmissionCoeff = value->rValue; - mod->BSIM4DjctEmissionCoeffGiven = TRUE; - break; - case BSIM4_MOD_PBSWGD : - mod->BSIM4DGatesidewallJctPotential = value->rValue; - mod->BSIM4DGatesidewallJctPotentialGiven = TRUE; - break; - case BSIM4_MOD_MJSWGD : - mod->BSIM4DbulkJctGateSideGradingCoeff = value->rValue; - mod->BSIM4DbulkJctGateSideGradingCoeffGiven = TRUE; - break; - case BSIM4_MOD_CJSWGD : - mod->BSIM4DunitLengthGateSidewallJctCap = value->rValue; - mod->BSIM4DunitLengthGateSidewallJctCapGiven = TRUE; - break; - case BSIM4_MOD_XTID : - mod->BSIM4DjctTempExponent = value->rValue; - mod->BSIM4DjctTempExponentGiven = TRUE; - break; - case BSIM4_MOD_LINT : - mod->BSIM4Lint = value->rValue; - mod->BSIM4LintGiven = TRUE; - break; - case BSIM4_MOD_LL : - mod->BSIM4Ll = value->rValue; - mod->BSIM4LlGiven = TRUE; - break; - case BSIM4_MOD_LLC : - mod->BSIM4Llc = value->rValue; - mod->BSIM4LlcGiven = TRUE; - break; - case BSIM4_MOD_LLN : - mod->BSIM4Lln = value->rValue; - mod->BSIM4LlnGiven = TRUE; - break; - case BSIM4_MOD_LW : - mod->BSIM4Lw = value->rValue; - mod->BSIM4LwGiven = TRUE; - break; - case BSIM4_MOD_LWC : - mod->BSIM4Lwc = value->rValue; - mod->BSIM4LwcGiven = TRUE; - break; - case BSIM4_MOD_LWN : - mod->BSIM4Lwn = value->rValue; - mod->BSIM4LwnGiven = TRUE; - break; - case BSIM4_MOD_LWL : - mod->BSIM4Lwl = value->rValue; - mod->BSIM4LwlGiven = TRUE; - break; - case BSIM4_MOD_LWLC : - mod->BSIM4Lwlc = value->rValue; - mod->BSIM4LwlcGiven = TRUE; - break; - case BSIM4_MOD_LMIN : - mod->BSIM4Lmin = value->rValue; - mod->BSIM4LminGiven = TRUE; - break; - case BSIM4_MOD_LMAX : - mod->BSIM4Lmax = value->rValue; - mod->BSIM4LmaxGiven = TRUE; - break; - case BSIM4_MOD_WINT : - mod->BSIM4Wint = value->rValue; - mod->BSIM4WintGiven = TRUE; - break; - case BSIM4_MOD_WL : - mod->BSIM4Wl = value->rValue; - mod->BSIM4WlGiven = TRUE; - break; - case BSIM4_MOD_WLC : - mod->BSIM4Wlc = value->rValue; - mod->BSIM4WlcGiven = TRUE; - break; - case BSIM4_MOD_WLN : - mod->BSIM4Wln = value->rValue; - mod->BSIM4WlnGiven = TRUE; - break; - case BSIM4_MOD_WW : - mod->BSIM4Ww = value->rValue; - mod->BSIM4WwGiven = TRUE; - break; - case BSIM4_MOD_WWC : - mod->BSIM4Wwc = value->rValue; - mod->BSIM4WwcGiven = TRUE; - break; - case BSIM4_MOD_WWN : - mod->BSIM4Wwn = value->rValue; - mod->BSIM4WwnGiven = TRUE; - break; - case BSIM4_MOD_WWL : - mod->BSIM4Wwl = value->rValue; - mod->BSIM4WwlGiven = TRUE; - break; - case BSIM4_MOD_WWLC : - mod->BSIM4Wwlc = value->rValue; - mod->BSIM4WwlcGiven = TRUE; - break; - case BSIM4_MOD_WMIN : - mod->BSIM4Wmin = value->rValue; - mod->BSIM4WminGiven = TRUE; - break; - case BSIM4_MOD_WMAX : - mod->BSIM4Wmax = value->rValue; - mod->BSIM4WmaxGiven = TRUE; - break; - - case BSIM4_MOD_NOIA : - mod->BSIM4oxideTrapDensityA = value->rValue; - mod->BSIM4oxideTrapDensityAGiven = TRUE; - break; - case BSIM4_MOD_NOIB : - mod->BSIM4oxideTrapDensityB = value->rValue; - mod->BSIM4oxideTrapDensityBGiven = TRUE; - break; - case BSIM4_MOD_NOIC : - mod->BSIM4oxideTrapDensityC = value->rValue; - mod->BSIM4oxideTrapDensityCGiven = TRUE; - break; - case BSIM4_MOD_EM : - mod->BSIM4em = value->rValue; - mod->BSIM4emGiven = TRUE; - break; - case BSIM4_MOD_EF : - mod->BSIM4ef = value->rValue; - mod->BSIM4efGiven = TRUE; - break; - case BSIM4_MOD_AF : - mod->BSIM4af = value->rValue; - mod->BSIM4afGiven = TRUE; - break; - case BSIM4_MOD_KF : - mod->BSIM4kf = value->rValue; - mod->BSIM4kfGiven = TRUE; - break; - - case BSIM4_MOD_VGS_MAX: - mod->BSIM4vgsMax = value->rValue; - mod->BSIM4vgsMaxGiven = TRUE; - break; - case BSIM4_MOD_VGD_MAX: - mod->BSIM4vgdMax = value->rValue; - mod->BSIM4vgdMaxGiven = TRUE; - break; - case BSIM4_MOD_VGB_MAX: - mod->BSIM4vgbMax = value->rValue; - mod->BSIM4vgbMaxGiven = TRUE; - break; - case BSIM4_MOD_VDS_MAX: - mod->BSIM4vdsMax = value->rValue; - mod->BSIM4vdsMaxGiven = TRUE; - break; - case BSIM4_MOD_VBS_MAX: - mod->BSIM4vbsMax = value->rValue; - mod->BSIM4vbsMaxGiven = TRUE; - break; - case BSIM4_MOD_VBD_MAX: - mod->BSIM4vbdMax = value->rValue; - mod->BSIM4vbdMaxGiven = TRUE; - break; - case BSIM4_MOD_VGSR_MAX: - mod->BSIM4vgsrMax = value->rValue; - mod->BSIM4vgsrMaxGiven = TRUE; - break; - case BSIM4_MOD_VGDR_MAX: - mod->BSIM4vgdrMax = value->rValue; - mod->BSIM4vgdrMaxGiven = TRUE; - break; - case BSIM4_MOD_VGBR_MAX: - mod->BSIM4vgbrMax = value->rValue; - mod->BSIM4vgbrMaxGiven = TRUE; - break; - case BSIM4_MOD_VBSR_MAX: - mod->BSIM4vbsrMax = value->rValue; - mod->BSIM4vbsrMaxGiven = TRUE; - break; - case BSIM4_MOD_VBDR_MAX: - mod->BSIM4vbdrMax = value->rValue; - mod->BSIM4vbdrMaxGiven = TRUE; - break; - - case BSIM4_MOD_NMOS : - if(value->iValue) { - mod->BSIM4type = 1; - mod->BSIM4typeGiven = TRUE; - } - break; - case BSIM4_MOD_PMOS : - if(value->iValue) { - mod->BSIM4type = - 1; - mod->BSIM4typeGiven = TRUE; - } - break; - default: - return(E_BADPARM); - } - return(OK); -} - - diff --git a/src/spicelib/devices/bsim4/b4noi.c b/src/spicelib/devices/bsim4/b4noi.c deleted file mode 100644 index 816d0288d..000000000 --- a/src/spicelib/devices/bsim4/b4noi.c +++ /dev/null @@ -1,721 +0,0 @@ -/* ****************************************************************************** - * BSIM4 4.8.1 released by Chetan Kumar Dabhi 2/15/2017 * - * BSIM4 Model Equations * - ****************************************************************************** - - ****************************************************************************** - * Copyright 2017 Regents of the University of California. * - * All rights reserved. * - * * - * Project Director: Prof. Chenming Hu. * - * Authors: Gary W. Ng, Weidong Liu, Xuemei Xi, Mohan Dunga, Wenwei Yang * - * Ali Niknejad, Shivendra Singh Parihar, Chetan Kumar Dabhi * - * Yogesh Singh Chauhan, Sayeef Salahuddin, Chenming Hu * - ****************************************************************************** - - ****************************************************************************** - * CMC In-Code Statement * - * * - * The Developer agrees that the following statement will appear in the * - * model code that has been adopted as a CMC Standard. * - * * - * Software is distributed as is, completely without warranty or service * - * support. The University of California and its employees are not liable * - * for the condition or performance of the software. * - * * - * The University of California owns the copyright and grants users a * - * perpetual, irrevocable, worldwide, non-exclusive, royalty-free license * - * with respect to the software as set forth below. * - * * - * The University of California hereby disclaims all implied warranties. * - * * - * The University of California grants the users the right to modify, * - * copy, and redistribute the software and documentation, both within * - * the user's organization and externally, subject to the following * - * restrictions: * - * * - * 1. The users agree not to charge for the University of California code * - * itself but may charge for additions, extensions, or support. * - * * - * 2. In any product based on the software, the users agree to * - * acknowledge the University of California that developed the * - * software. This acknowledgment shall appear in the product * - * documentation. * - * * - * 3. Redistributions to others of source code and documentation must * - * retain the copyright notice, disclaimer, and list of conditions. * - * * - * 4. Redistributions to others in binary form must reproduce the * - * copyright notice, disclaimer, and list of conditions in the * - * documentation and/or other materials provided with the * - * distribution. * - * * - * Agreed to on ______Feb. 15, 2017______________ * - * * - * By: ____University of California, Berkeley___ * - * ____Chenming Hu__________________________ * - * ____Professor in Graduate School ________ * - * * - ****************************************************************************** */ - -#include "ngspice/ngspice.h" -#include "bsim4def.h" -#include "ngspice/cktdefs.h" -#include "ngspice/iferrmsg.h" -#include "ngspice/noisedef.h" -#include "ngspice/suffix.h" -#include "ngspice/const.h" - - -/* - * WDL: 1/f noise model has been smoothed out and enhanced with - * bulk charge effect as well as physical N* equ. and necessary - * conversion into the SI unit system. - */ - -static double -Eval1ovFNoise( -double Vds, -BSIM4model *model, -BSIM4instance *here, -double freq, double temp) -{ -struct bsim4SizeDependParam *pParam; -double cd, esat, DelClm, EffFreq, N0, Nl, Leff, Leffsq; -double T0=0.0, T1, T2, T3, T4, T5, T6, T7, T8, T9, Ssi; - - pParam = here->pParam; - cd = fabs(here->BSIM4cd); - Leff = pParam->BSIM4leff - 2.0 * model->BSIM4lintnoi; - Leffsq = Leff * Leff; - esat = 2.0 * here->BSIM4vsattemp / here->BSIM4ueff; - if(model->BSIM4em<=0.0) DelClm = 0.0; /* flicker noise modified -JX */ - else { - T0 = ((((Vds - here->BSIM4Vdseff) / pParam->BSIM4litl) - + model->BSIM4em) / esat); - DelClm = pParam->BSIM4litl * log (MAX(T0, N_MINLOG)); - if (DelClm < 0.0) DelClm = 0.0; /* bugfix */ - } - EffFreq = pow(freq, model->BSIM4ef); - T1 = CHARGE * CHARGE * CONSTboltz * cd * temp * here->BSIM4ueff; - T2 = 1.0e10 * EffFreq * here->BSIM4Abulk * model->BSIM4coxe * Leffsq; - N0 = model->BSIM4coxe * here->BSIM4Vgsteff / CHARGE; - Nl = model->BSIM4coxe * here->BSIM4Vgsteff - * (1.0 - here->BSIM4AbovVgst2Vtm * here->BSIM4Vdseff) / CHARGE; - - T3 = model->BSIM4oxideTrapDensityA - * log(MAX(((N0 + here->BSIM4nstar) / (Nl + here->BSIM4nstar)), N_MINLOG)); - T4 = model->BSIM4oxideTrapDensityB * (N0 - Nl); - T5 = model->BSIM4oxideTrapDensityC * 0.5 * (N0 * N0 - Nl * Nl); - - T6 = CONSTboltz * temp * cd * cd; - T7 = 1.0e10 * EffFreq * Leffsq * pParam->BSIM4weff * here->BSIM4nf; - T8 = model->BSIM4oxideTrapDensityA + model->BSIM4oxideTrapDensityB * Nl - + model->BSIM4oxideTrapDensityC * Nl * Nl; - T9 = (Nl + here->BSIM4nstar) * (Nl + here->BSIM4nstar); - Ssi = T1 / T2 * (T3 + T4 + T5) + T6 / T7 * DelClm * T8 / T9; - return Ssi; -} - - -int -BSIM4noise ( -int mode, int operation, -GENmodel *inModel, -CKTcircuit *ckt, -Ndata *data, -double *OnDens) -{ -NOISEAN *job = (NOISEAN *) ckt->CKTcurJob; - -BSIM4model *model = (BSIM4model *)inModel; -BSIM4instance *here; -struct bsim4SizeDependParam *pParam; -double tempOnoise; -double tempInoise; -double noizDens[BSIM4NSRCS]; -double lnNdens[BSIM4NSRCS]; - -double T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11; -double Vds, Ssi, Swi; -double tmp=0.0, gdpr, gspr, npart_theta=0.0, npart_beta=0.0, igsquare, bodymode; - -/* tnoiMod=2 (v4.7) */ -double eta, Leff, Lvsat, gamma, delta, epsilon, GammaGd0=0.0; -double npart_c, sigrat=0.0, C0, omega, ctnoi=0.0; - -int i; - -double m; - - /* define the names of the noise sources */ - static char *BSIM4nNames[BSIM4NSRCS] = - { /* Note that we have to keep the order */ - ".rd", /* noise due to rd */ - ".rs", /* noise due to rs */ - ".rg", /* noise due to rgeltd */ - ".rbps", /* noise due to rbps */ - ".rbpd", /* noise due to rbpd */ - ".rbpb", /* noise due to rbpb */ - ".rbsb", /* noise due to rbsb */ - ".rbdb", /* noise due to rbdb */ - ".id", /* noise due to id (for tnoiMod2: uncorrelated portion only) */ - ".1overf", /* flicker (1/f) noise */ - ".igs", /* shot noise due to IGS */ - ".igd", /* shot noise due to IGD */ - ".igb", /* shot noise due to IGB */ - ".corl", /* contribution of correlated drain and induced gate noise */ - "" /* total transistor noise */ - }; - - for (; model != NULL; model = BSIM4nextModel(model)) - { - if(model->BSIM4tnoiMod != 2) { - noizDens[BSIM4CORLNOIZ] = 0.0; - lnNdens[BSIM4CORLNOIZ] = N_MINLOG; - } - for (here = BSIM4instances(model); here != NULL; - here = BSIM4nextInstance(here)) - { pParam = here->pParam; - switch (operation) - { case N_OPEN: - /* see if we have to to produce a summary report */ - /* if so, name all the noise generators */ - - if (job->NStpsSm != 0) - { switch (mode) - { case N_DENS: - for (i = 0; i < BSIM4NSRCS; i++) - { NOISE_ADD_OUTVAR(ckt, data, "onoise.%s%s", here->BSIM4name, BSIM4nNames[i]); - } - break; - case INT_NOIZ: - for (i = 0; i < BSIM4NSRCS; i++) - { NOISE_ADD_OUTVAR(ckt, data, "onoise_total.%s%s", here->BSIM4name, BSIM4nNames[i]); - NOISE_ADD_OUTVAR(ckt, data, "inoise_total.%s%s", here->BSIM4name, BSIM4nNames[i]); - } - break; - } - } - break; - case N_CALC: - m = here->BSIM4m; - switch (mode) - { case N_DENS: - if (model->BSIM4tnoiMod == 0) - { if (model->BSIM4rdsMod == 0) - { gspr = here->BSIM4sourceConductance; - gdpr = here->BSIM4drainConductance; - if (here->BSIM4grdsw > 0.0) - tmp = 1.0 / here->BSIM4grdsw; /* tmp used below */ - else - tmp = 0.0; - } - else - { gspr = here->BSIM4gstot; - gdpr = here->BSIM4gdtot; - tmp = 0.0; - } - } - else if(model->BSIM4tnoiMod == 1) - { T5 = here->BSIM4Vgsteff / here->BSIM4EsatL; - T5 *= T5; - npart_beta = model->BSIM4rnoia * (1.0 + T5 - * model->BSIM4tnoia * pParam->BSIM4leff); - npart_theta = model->BSIM4rnoib * (1.0 + T5 - * model->BSIM4tnoib * pParam->BSIM4leff); - if(npart_theta > 0.9) - npart_theta = 0.9; - if(npart_theta > 0.9 * npart_beta) - npart_theta = 0.9 * npart_beta; //4.6.2 - - if (model->BSIM4rdsMod == 0) - { gspr = here->BSIM4sourceConductance; - gdpr = here->BSIM4drainConductance; - } - else - { gspr = here->BSIM4gstot; - gdpr = here->BSIM4gdtot; - } - - if ((*(ckt->CKTstates[0] + here->BSIM4vds)) >= 0.0) - gspr = gspr * (1.0 + npart_theta * npart_theta * gspr - / here->BSIM4IdovVds); - else - gdpr = gdpr * (1.0 + npart_theta * npart_theta * gdpr - / here->BSIM4IdovVds); - } - else - { /* tnoiMod=2 (v4.7) */ - - if (model->BSIM4rdsMod == 0) - { gspr = here->BSIM4sourceConductance; - gdpr = here->BSIM4drainConductance; - } - else - { gspr = here->BSIM4gstot; - gdpr = here->BSIM4gdtot; - } - - } - - NevalSrc(&noizDens[BSIM4RDNOIZ], - &lnNdens[BSIM4RDNOIZ], ckt, THERMNOISE, - here->BSIM4dNodePrime, here->BSIM4dNode, - gdpr * m); - - NevalSrc(&noizDens[BSIM4RSNOIZ], - &lnNdens[BSIM4RSNOIZ], ckt, THERMNOISE, - here->BSIM4sNodePrime, here->BSIM4sNode, - gspr * m); - - - if (here->BSIM4rgateMod == 1) - { NevalSrc(&noizDens[BSIM4RGNOIZ], - &lnNdens[BSIM4RGNOIZ], ckt, THERMNOISE, - here->BSIM4gNodePrime, here->BSIM4gNodeExt, - here->BSIM4grgeltd * m); - } - else if (here->BSIM4rgateMod == 2) - { - T0 = 1.0 + here->BSIM4grgeltd/here->BSIM4gcrg; - T1 = T0 * T0; - NevalSrc(&noizDens[BSIM4RGNOIZ], - &lnNdens[BSIM4RGNOIZ], ckt, THERMNOISE, - here->BSIM4gNodePrime, here->BSIM4gNodeExt, - here->BSIM4grgeltd * m / T1); - } - else if (here->BSIM4rgateMod == 3) - { NevalSrc(&noizDens[BSIM4RGNOIZ], - &lnNdens[BSIM4RGNOIZ], ckt, THERMNOISE, - here->BSIM4gNodeMid, here->BSIM4gNodeExt, - here->BSIM4grgeltd * m); - } - else - { noizDens[BSIM4RGNOIZ] = 0.0; - lnNdens[BSIM4RGNOIZ] = - log(MAX(noizDens[BSIM4RGNOIZ], N_MINLOG)); - } - - bodymode = 5; - if (here->BSIM4rbodyMod == 2) - { if( ( !model->BSIM4rbps0Given) || - ( !model->BSIM4rbpd0Given) ) - bodymode = 1; - else - if( (!model->BSIM4rbsbx0Given && !model->BSIM4rbsby0Given) || - (!model->BSIM4rbdbx0Given && !model->BSIM4rbdby0Given) ) - bodymode = 3; - } - - if (here->BSIM4rbodyMod) - { - if(bodymode == 5) - { - NevalSrc(&noizDens[BSIM4RBPSNOIZ], - &lnNdens[BSIM4RBPSNOIZ], ckt, THERMNOISE, - here->BSIM4bNodePrime, here->BSIM4sbNode, - here->BSIM4grbps * m); - NevalSrc(&noizDens[BSIM4RBPDNOIZ], - &lnNdens[BSIM4RBPDNOIZ], ckt, THERMNOISE, - here->BSIM4bNodePrime, here->BSIM4dbNode, - here->BSIM4grbpd * m); - NevalSrc(&noizDens[BSIM4RBPBNOIZ], - &lnNdens[BSIM4RBPBNOIZ], ckt, THERMNOISE, - here->BSIM4bNodePrime, here->BSIM4bNode, - here->BSIM4grbpb * m); - NevalSrc(&noizDens[BSIM4RBSBNOIZ], - &lnNdens[BSIM4RBSBNOIZ], ckt, THERMNOISE, - here->BSIM4bNode, here->BSIM4sbNode, - here->BSIM4grbsb * m); - NevalSrc(&noizDens[BSIM4RBDBNOIZ], - &lnNdens[BSIM4RBDBNOIZ], ckt, THERMNOISE, - here->BSIM4bNode, here->BSIM4dbNode, - here->BSIM4grbdb * m); - } - if(bodymode == 3) - { - NevalSrc(&noizDens[BSIM4RBPSNOIZ], - &lnNdens[BSIM4RBPSNOIZ], ckt, THERMNOISE, - here->BSIM4bNodePrime, here->BSIM4sbNode, - here->BSIM4grbps * m); - NevalSrc(&noizDens[BSIM4RBPDNOIZ], - &lnNdens[BSIM4RBPDNOIZ], ckt, THERMNOISE, - here->BSIM4bNodePrime, here->BSIM4dbNode, - here->BSIM4grbpd * m); - NevalSrc(&noizDens[BSIM4RBPBNOIZ], - &lnNdens[BSIM4RBPBNOIZ], ckt, THERMNOISE, - here->BSIM4bNodePrime, here->BSIM4bNode, - here->BSIM4grbpb * m); - noizDens[BSIM4RBSBNOIZ] = noizDens[BSIM4RBDBNOIZ] = 0.0; - lnNdens[BSIM4RBSBNOIZ] = - log(MAX(noizDens[BSIM4RBSBNOIZ], N_MINLOG)); - lnNdens[BSIM4RBDBNOIZ] = - log(MAX(noizDens[BSIM4RBDBNOIZ], N_MINLOG)); - } - if(bodymode == 1) - { - NevalSrc(&noizDens[BSIM4RBPBNOIZ], - &lnNdens[BSIM4RBPBNOIZ], ckt, THERMNOISE, - here->BSIM4bNodePrime, here->BSIM4bNode, - here->BSIM4grbpb * m); - noizDens[BSIM4RBPSNOIZ] = noizDens[BSIM4RBPDNOIZ] = 0.0; - noizDens[BSIM4RBSBNOIZ] = noizDens[BSIM4RBDBNOIZ] = 0.0; - lnNdens[BSIM4RBPSNOIZ] = - log(MAX(noizDens[BSIM4RBPSNOIZ], N_MINLOG)); - lnNdens[BSIM4RBPDNOIZ] = - log(MAX(noizDens[BSIM4RBPDNOIZ], N_MINLOG)); - lnNdens[BSIM4RBSBNOIZ] = - log(MAX(noizDens[BSIM4RBSBNOIZ], N_MINLOG)); - lnNdens[BSIM4RBDBNOIZ] = - log(MAX(noizDens[BSIM4RBDBNOIZ], N_MINLOG)); - } - } - else - { noizDens[BSIM4RBPSNOIZ] = noizDens[BSIM4RBPDNOIZ] = 0.0; - noizDens[BSIM4RBPBNOIZ] = 0.0; - noizDens[BSIM4RBSBNOIZ] = noizDens[BSIM4RBDBNOIZ] = 0.0; - lnNdens[BSIM4RBPSNOIZ] = - log(MAX(noizDens[BSIM4RBPSNOIZ], N_MINLOG)); - lnNdens[BSIM4RBPDNOIZ] = - log(MAX(noizDens[BSIM4RBPDNOIZ], N_MINLOG)); - lnNdens[BSIM4RBPBNOIZ] = - log(MAX(noizDens[BSIM4RBPBNOIZ], N_MINLOG)); - lnNdens[BSIM4RBSBNOIZ] = - log(MAX(noizDens[BSIM4RBSBNOIZ], N_MINLOG)); - lnNdens[BSIM4RBDBNOIZ] = - log(MAX(noizDens[BSIM4RBDBNOIZ], N_MINLOG)); - } - - if(model->BSIM4tnoiMod == 2) - { - eta = 1.0 - here->BSIM4Vdseff * here->BSIM4AbovVgst2Vtm; - T0 = 1.0 - eta; - T1 = 1.0 + eta; - T2 = T1 + 2.0 * here->BSIM4Abulk * model->BSIM4vtm / here->BSIM4Vgsteff; - Leff = pParam->BSIM4leff; - Lvsat = Leff * (1.0 + here->BSIM4Vdseff / here->BSIM4EsatL); - T6 = Leff / Lvsat; - /*Unwanted code for T5 commented*/ - /*T5 = here->BSIM4Vgsteff / here->BSIM4EsatL; - T5 = T5 * T5; - */ - gamma = T6 * (0.5 * T1 + T0 * T0 / (6.0 * T2)); - T3 = T2 * T2; - T4 = T0 * T0; - T5 = T3 * T3; - delta = (T1 / T3 - (5.0 * T1 + T2) * T4 / (15.0 * T5) + T4 * T4 / (9.0 * T5 * T2)) / (6.0 * T6 * T6 * T6); - T7 = T0 / T2; - epsilon = (T7 - T7 * T7 * T7 / 3.0) / (6.0 * T6); - - T8 = here->BSIM4Vgsteff / here->BSIM4EsatL; - T8 *= T8; - if ((strcmp(model->BSIM4version, "4.8.1")) && (strncmp(model->BSIM4version, "4.81", 4))) { - npart_c = model->BSIM4rnoic * (1.0 + T8 - * model->BSIM4tnoic * Leff); - ctnoi = epsilon / sqrt(gamma * delta) - * (2.5316 * npart_c); - - npart_beta = model->BSIM4rnoia * (1.0 + T8 - * model->BSIM4tnoia * Leff); - npart_theta = model->BSIM4rnoib * (1.0 + T8 - * model->BSIM4tnoib * Leff); - gamma = gamma * (3.0 * npart_beta * npart_beta); - delta = delta * (3.75 * npart_theta * npart_theta); - - GammaGd0 = gamma * here->BSIM4noiGd0; - C0 = here->BSIM4Coxeff * pParam->BSIM4weffCV * here->BSIM4nf * pParam->BSIM4leffCV; - T0 = C0 / here->BSIM4noiGd0; - sigrat = T0 * sqrt(delta / gamma); - } - else - { - npart_c = model->BSIM4rnoic * (1.0 + T8 - * model->BSIM4tnoic * Leff); - /* Limits added for rnoia, rnoib, rnoic, tnoia, tnoib and tnoic in BSIM4.8.1 */ - T9 = gamma * delta ; - if (T9 > 0) - ctnoi = epsilon / sqrt( gamma * delta) * (2.5316 * npart_c); - else - ctnoi = 1.0 ; - if (ctnoi > 1) - ctnoi=1; - if (ctnoi < 0) - ctnoi=0; - - npart_beta = model->BSIM4rnoia * (1.0 + T8 - * model->BSIM4tnoia * Leff); - npart_theta = model->BSIM4rnoib * (1.0 + T8 - * model->BSIM4tnoib * Leff); - gamma = gamma * (3.0 * npart_beta * npart_beta); - delta = delta * (3.75 * npart_theta * npart_theta); - - GammaGd0 = gamma * here->BSIM4noiGd0; - C0 = here->BSIM4Coxeff * pParam->BSIM4weffCV * here->BSIM4nf * pParam->BSIM4leffCV; - T0 = C0 / here->BSIM4noiGd0; - - if (gamma > 0 && delta > 0) - sigrat = T0 * sqrt(delta / gamma); - else - sigrat = 0.0; - } - } - - switch(model->BSIM4tnoiMod) - { case 0: - if ((strcmp(model->BSIM4version, "4.8.1")) && (strncmp(model->BSIM4version, "4.81", 4))) { - T0 = here->BSIM4ueff * fabs(here->BSIM4qinv); - T1 = T0 * tmp + pParam->BSIM4leff - * pParam->BSIM4leff; - NevalSrc(&noizDens[BSIM4IDNOIZ], - &lnNdens[BSIM4IDNOIZ], ckt, - THERMNOISE, here->BSIM4dNodePrime, - here->BSIM4sNodePrime, - (T0 / T1) * model->BSIM4ntnoi * m); - } - else - { - T0 = here->BSIM4ueff * fabs(here->BSIM4qinv); - T1 = T0 * tmp + pParam->BSIM4leff - * pParam->BSIM4leff; - NevalSrc(&noizDens[BSIM4IDNOIZ], - &lnNdens[BSIM4IDNOIZ], ckt, - THERMNOISE, here->BSIM4dNodePrime, - here->BSIM4sNodePrime, - (T0 / T1) * model->BSIM4ntnoi * m); - - noizDens[BSIM4CORLNOIZ] = 0.0; - lnNdens[BSIM4CORLNOIZ] = log(MAX(noizDens[BSIM4CORLNOIZ], N_MINLOG)); - } - break; - case 1: - if ((strcmp(model->BSIM4version, "4.8.1")) && (strncmp(model->BSIM4version, "4.81", 4))) { - T0 = here->BSIM4gm + here->BSIM4gmbs + here->BSIM4gds; - T0 *= T0; - igsquare = npart_theta * npart_theta * T0 / here->BSIM4IdovVds; - T1 = npart_beta * (here->BSIM4gm - + here->BSIM4gmbs) + here->BSIM4gds; - T2 = T1 * T1 / here->BSIM4IdovVds; - NevalSrc(&noizDens[BSIM4IDNOIZ], - &lnNdens[BSIM4IDNOIZ], ckt, - THERMNOISE, here->BSIM4dNodePrime, - here->BSIM4sNodePrime, (T2 - igsquare) * m); - } - else - { - T0 = here->BSIM4gm + here->BSIM4gmbs + here->BSIM4gds; - T0 *= T0; - igsquare = npart_theta * npart_theta * T0 / here->BSIM4IdovVds; - T1 = npart_beta * (here->BSIM4gm - + here->BSIM4gmbs) + here->BSIM4gds; - T2 = T1 * T1 / here->BSIM4IdovVds; - NevalSrc(&noizDens[BSIM4IDNOIZ], - &lnNdens[BSIM4IDNOIZ], ckt, - THERMNOISE, here->BSIM4dNodePrime, - here->BSIM4sNodePrime, (T2 - igsquare) * m); - - noizDens[BSIM4CORLNOIZ] = 0.0; - lnNdens[BSIM4CORLNOIZ] = log(MAX(noizDens[BSIM4CORLNOIZ], N_MINLOG)); - } - break; - case 2: - T2 = GammaGd0; - T3 = ctnoi * ctnoi; - T4 = 1.0 - T3; - NevalSrc(&noizDens[BSIM4IDNOIZ], - &lnNdens[BSIM4IDNOIZ], ckt, - THERMNOISE, here->BSIM4dNodePrime, - here->BSIM4sNodePrime, T2 * T4 * m); - - /* Evaluate output noise due to two correlated noise sources */ - omega = 2.0 * M_PI * data->freq; - T5 = omega * sigrat; - T6 = T5 * T5; - T7 = T6 / (1.0 + T6); - - if (here->BSIM4mode >= 0) { - NevalSrc2(&noizDens[BSIM4CORLNOIZ], - &lnNdens[BSIM4CORLNOIZ], ckt, - THERMNOISE, here->BSIM4dNodePrime, - here->BSIM4sNodePrime, T2 * T3 * m, - here->BSIM4gNodePrime, - here->BSIM4sNodePrime, - T2 * T7 * m, 0.5 * M_PI); - } - else - { - NevalSrc2(&noizDens[BSIM4CORLNOIZ], - &lnNdens[BSIM4CORLNOIZ], ckt, - THERMNOISE, here->BSIM4sNodePrime, - here->BSIM4dNodePrime, T2 * T3 * m, - here->BSIM4gNodePrime, - here->BSIM4dNodePrime, - T2 * T7 * m, 0.5 * M_PI); - } - break; - } - - NevalSrc(&noizDens[BSIM4FLNOIZ], (double*) NULL, - ckt, N_GAIN, here->BSIM4dNodePrime, - here->BSIM4sNodePrime, (double) 0.0); - - switch(model->BSIM4fnoiMod) - { case 0: - noizDens[BSIM4FLNOIZ] *= m * model->BSIM4kf - * exp(model->BSIM4af - * log(MAX(fabs(here->BSIM4cd), - N_MINLOG))) - / (pow(data->freq, model->BSIM4ef) - * pParam->BSIM4leff - * pParam->BSIM4leff - * model->BSIM4coxe); - break; - case 1: - Vds = *(ckt->CKTstates[0] + here->BSIM4vds); - if (Vds < 0.0) - Vds = -Vds; - - Ssi = Eval1ovFNoise(Vds, model, here, - data->freq, ckt->CKTtemp); - T10 = model->BSIM4oxideTrapDensityA - * CONSTboltz * ckt->CKTtemp; - T11 = pParam->BSIM4weff * here->BSIM4nf * pParam->BSIM4leff - * pow(data->freq, model->BSIM4ef) * 1.0e10 - * here->BSIM4nstar * here->BSIM4nstar; - Swi = T10 / T11 * here->BSIM4cd - * here->BSIM4cd; - T1 = Swi + Ssi; - if (T1 > 0.0) - noizDens[BSIM4FLNOIZ] *= m * (Ssi * Swi) / T1; - else - noizDens[BSIM4FLNOIZ] *= 0.0; - break; - } - - lnNdens[BSIM4FLNOIZ] = - log(MAX(noizDens[BSIM4FLNOIZ], N_MINLOG)); - - - if(here->BSIM4mode >= 0) { /* bugfix */ - NevalSrc(&noizDens[BSIM4IGSNOIZ], - &lnNdens[BSIM4IGSNOIZ], ckt, SHOTNOISE, - here->BSIM4gNodePrime, here->BSIM4sNodePrime, - m * (here->BSIM4Igs + here->BSIM4Igcs)); - NevalSrc(&noizDens[BSIM4IGDNOIZ], - &lnNdens[BSIM4IGDNOIZ], ckt, SHOTNOISE, - here->BSIM4gNodePrime, here->BSIM4dNodePrime, - m * (here->BSIM4Igd + here->BSIM4Igcd)); - } else { - NevalSrc(&noizDens[BSIM4IGSNOIZ], - &lnNdens[BSIM4IGSNOIZ], ckt, SHOTNOISE, - here->BSIM4gNodePrime, here->BSIM4sNodePrime, - m * (here->BSIM4Igs + here->BSIM4Igcd)); - NevalSrc(&noizDens[BSIM4IGDNOIZ], - &lnNdens[BSIM4IGDNOIZ], ckt, SHOTNOISE, - here->BSIM4gNodePrime, here->BSIM4dNodePrime, - m * (here->BSIM4Igd + here->BSIM4Igcs)); - } - NevalSrc(&noizDens[BSIM4IGBNOIZ], - &lnNdens[BSIM4IGBNOIZ], ckt, SHOTNOISE, - here->BSIM4gNodePrime, here->BSIM4bNodePrime, - m * here->BSIM4Igb); - - - noizDens[BSIM4TOTNOIZ] = noizDens[BSIM4RDNOIZ] - + noizDens[BSIM4RSNOIZ] + noizDens[BSIM4RGNOIZ] - + noizDens[BSIM4RBPSNOIZ] + noizDens[BSIM4RBPDNOIZ] - + noizDens[BSIM4RBPBNOIZ] - + noizDens[BSIM4RBSBNOIZ] + noizDens[BSIM4RBDBNOIZ] - + noizDens[BSIM4IDNOIZ] + noizDens[BSIM4FLNOIZ] - + noizDens[BSIM4IGSNOIZ] + noizDens[BSIM4IGDNOIZ] - + noizDens[BSIM4IGBNOIZ] + noizDens[BSIM4CORLNOIZ]; - lnNdens[BSIM4TOTNOIZ] = - log(MAX(noizDens[BSIM4TOTNOIZ], N_MINLOG)); - - *OnDens += noizDens[BSIM4TOTNOIZ]; - - if (data->delFreq == 0.0) - { /* if we haven't done any previous - integration, we need to initialize our - "history" variables. - */ - - for (i = 0; i < BSIM4NSRCS; i++) - { here->BSIM4nVar[LNLSTDENS][i] = - lnNdens[i]; - } - - /* clear out our integration variables - if it's the first pass - */ - if (data->freq == - job->NstartFreq) - { for (i = 0; i < BSIM4NSRCS; i++) - { here->BSIM4nVar[OUTNOIZ][i] = 0.0; - here->BSIM4nVar[INNOIZ][i] = 0.0; - } - } - } - else - { /* data->delFreq != 0.0, - we have to integrate. - */ - for (i = 0; i < BSIM4NSRCS; i++) - { if (i != BSIM4TOTNOIZ) - { tempOnoise = Nintegrate(noizDens[i], - lnNdens[i], - here->BSIM4nVar[LNLSTDENS][i], - data); - tempInoise = Nintegrate(noizDens[i] - * data->GainSqInv, lnNdens[i] - + data->lnGainInv, - here->BSIM4nVar[LNLSTDENS][i] - + data->lnGainInv, data); - here->BSIM4nVar[LNLSTDENS][i] = - lnNdens[i]; - data->outNoiz += tempOnoise; - data->inNoise += tempInoise; - if (job->NStpsSm != 0) - { here->BSIM4nVar[OUTNOIZ][i] - += tempOnoise; - here->BSIM4nVar[OUTNOIZ][BSIM4TOTNOIZ] - += tempOnoise; - here->BSIM4nVar[INNOIZ][i] - += tempInoise; - here->BSIM4nVar[INNOIZ][BSIM4TOTNOIZ] - += tempInoise; - } - } - } - } - if (data->prtSummary) - { for (i = 0; i < BSIM4NSRCS; i++) - { /* print a summary report */ - data->outpVector[data->outNumber++] - = noizDens[i]; - } - } - break; - case INT_NOIZ: - /* already calculated, just output */ - if (job->NStpsSm != 0) - { for (i = 0; i < BSIM4NSRCS; i++) - { data->outpVector[data->outNumber++] - = here->BSIM4nVar[OUTNOIZ][i]; - data->outpVector[data->outNumber++] - = here->BSIM4nVar[INNOIZ][i]; - } - } - break; - } - break; - case N_CLOSE: - /* do nothing, the main calling routine will close */ - return (OK); - break; /* the plots */ - } /* switch (operation) */ - } /* for here */ - } /* for model */ - - return(OK); -} diff --git a/src/spicelib/devices/bsim4/b4par.c b/src/spicelib/devices/bsim4/b4par.c deleted file mode 100644 index d0515ef8b..000000000 --- a/src/spicelib/devices/bsim4/b4par.c +++ /dev/null @@ -1,260 +0,0 @@ -/* ****************************************************************************** - * BSIM4 4.8.1 released by Chetan Kumar Dabhi 2/15/2017 * - * BSIM4 Model Equations * - ****************************************************************************** - - ****************************************************************************** - * Copyright 2017 Regents of the University of California. * - * All rights reserved. * - * * - * Project Director: Prof. Chenming Hu. * - * Authors: Gary W. Ng, Weidong Liu, Xuemei Xi, Mohan Dunga, Wenwei Yang * - * Ali Niknejad, Shivendra Singh Parihar, Chetan Kumar Dabhi * - * Yogesh Singh Chauhan, Sayeef Salahuddin, Chenming Hu * - ****************************************************************************** - - ****************************************************************************** - * CMC In-Code Statement * - * * - * The Developer agrees that the following statement will appear in the * - * model code that has been adopted as a CMC Standard. * - * * - * Software is distributed as is, completely without warranty or service * - * support. The University of California and its employees are not liable * - * for the condition or performance of the software. * - * * - * The University of California owns the copyright and grants users a * - * perpetual, irrevocable, worldwide, non-exclusive, royalty-free license * - * with respect to the software as set forth below. * - * * - * The University of California hereby disclaims all implied warranties. * - * * - * The University of California grants the users the right to modify, * - * copy, and redistribute the software and documentation, both within * - * the user's organization and externally, subject to the following * - * restrictions: * - * * - * 1. The users agree not to charge for the University of California code * - * itself but may charge for additions, extensions, or support. * - * * - * 2. In any product based on the software, the users agree to * - * acknowledge the University of California that developed the * - * software. This acknowledgment shall appear in the product * - * documentation. * - * * - * 3. Redistributions to others of source code and documentation must * - * retain the copyright notice, disclaimer, and list of conditions. * - * * - * 4. Redistributions to others in binary form must reproduce the * - * copyright notice, disclaimer, and list of conditions in the * - * documentation and/or other materials provided with the * - * distribution. * - * * - * Agreed to on ______Feb. 15, 2017______________ * - * * - * By: ____University of California, Berkeley___ * - * ____Chenming Hu__________________________ * - * ____Professor in Graduate School ________ * - * * - ****************************************************************************** */ - -#include "ngspice/ngspice.h" -#include "ngspice/ifsim.h" -#include "bsim4def.h" -#include "ngspice/sperror.h" -#include "ngspice/suffix.h" -#include "ngspice/fteext.h" - -int -BSIM4param( -int param, -IFvalue *value, -GENinstance *inst, -IFvalue *select) -{ - double scale; - - BSIM4instance *here = (BSIM4instance*)inst; - - NG_IGNORE(select); - - if (!cp_getvar("scale", CP_REAL, &scale, 0)) - scale = 1; - - switch (param) { - case BSIM4_W: - here->BSIM4w = value->rValue * scale; - here->BSIM4wGiven = TRUE; - break; - case BSIM4_L: - here->BSIM4l = value->rValue * scale; - here->BSIM4lGiven = TRUE; - break; - case BSIM4_M: - here->BSIM4m = value->rValue; - here->BSIM4mGiven = TRUE; - break; - case BSIM4_NF: - here->BSIM4nf = value->rValue; - here->BSIM4nfGiven = TRUE; - break; - case BSIM4_MIN: - here->BSIM4min = value->iValue; - here->BSIM4minGiven = TRUE; - break; - case BSIM4_AS: - here->BSIM4sourceArea = value->rValue * scale * scale; - here->BSIM4sourceAreaGiven = TRUE; - break; - case BSIM4_AD: - here->BSIM4drainArea = value->rValue * scale * scale; - here->BSIM4drainAreaGiven = TRUE; - break; - case BSIM4_PS: - here->BSIM4sourcePerimeter = value->rValue * scale; - here->BSIM4sourcePerimeterGiven = TRUE; - break; - case BSIM4_PD: - here->BSIM4drainPerimeter = value->rValue * scale; - here->BSIM4drainPerimeterGiven = TRUE; - break; - case BSIM4_NRS: - here->BSIM4sourceSquares = value->rValue; - here->BSIM4sourceSquaresGiven = TRUE; - break; - case BSIM4_NRD: - here->BSIM4drainSquares = value->rValue; - here->BSIM4drainSquaresGiven = TRUE; - break; - case BSIM4_OFF: - here->BSIM4off = value->iValue; - break; - case BSIM4_SA: - here->BSIM4sa = value->rValue; - here->BSIM4saGiven = TRUE; - break; - case BSIM4_SB: - here->BSIM4sb = value->rValue; - here->BSIM4sbGiven = TRUE; - break; - case BSIM4_SD: - here->BSIM4sd = value->rValue; - here->BSIM4sdGiven = TRUE; - break; - case BSIM4_SCA: - here->BSIM4sca = value->rValue; - here->BSIM4scaGiven = TRUE; - break; - case BSIM4_SCB: - here->BSIM4scb = value->rValue; - here->BSIM4scbGiven = TRUE; - break; - case BSIM4_SCC: - here->BSIM4scc = value->rValue; - here->BSIM4sccGiven = TRUE; - break; - case BSIM4_SC: - here->BSIM4sc = value->rValue; - here->BSIM4scGiven = TRUE; - break; - case BSIM4_RBSB: - here->BSIM4rbsb = value->rValue; - here->BSIM4rbsbGiven = TRUE; - break; - case BSIM4_RBDB: - here->BSIM4rbdb = value->rValue; - here->BSIM4rbdbGiven = TRUE; - break; - case BSIM4_RBPB: - here->BSIM4rbpb = value->rValue; - here->BSIM4rbpbGiven = TRUE; - break; - case BSIM4_RBPS: - here->BSIM4rbps = value->rValue; - here->BSIM4rbpsGiven = TRUE; - break; - case BSIM4_RBPD: - here->BSIM4rbpd = value->rValue; - here->BSIM4rbpdGiven = TRUE; - break; - case BSIM4_DELVTO: - here->BSIM4delvto = value->rValue; - here->BSIM4delvtoGiven = TRUE; - break; - case BSIM4_MULU0: - here->BSIM4mulu0 = value->rValue; - here->BSIM4mulu0Given = TRUE; - break; - case BSIM4_WNFLAG: - here->BSIM4wnflag = value->iValue; - here->BSIM4wnflagGiven = TRUE; - break; - case BSIM4_XGW: - here->BSIM4xgw = value->rValue; - here->BSIM4xgwGiven = TRUE; - break; - case BSIM4_NGCON: - here->BSIM4ngcon = value->rValue; - here->BSIM4ngconGiven = TRUE; - break; - case BSIM4_TRNQSMOD: - here->BSIM4trnqsMod = value->iValue; - here->BSIM4trnqsModGiven = TRUE; - break; - case BSIM4_ACNQSMOD: - here->BSIM4acnqsMod = value->iValue; - here->BSIM4acnqsModGiven = TRUE; - break; - case BSIM4_RBODYMOD: - here->BSIM4rbodyMod = value->iValue; - here->BSIM4rbodyModGiven = TRUE; - break; - case BSIM4_RGATEMOD: - here->BSIM4rgateMod = value->iValue; - here->BSIM4rgateModGiven = TRUE; - break; - case BSIM4_GEOMOD: - here->BSIM4geoMod = value->iValue; - here->BSIM4geoModGiven = TRUE; - break; - case BSIM4_RGEOMOD: - here->BSIM4rgeoMod = value->iValue; - here->BSIM4rgeoModGiven = TRUE; - break; - case BSIM4_IC_VDS: - here->BSIM4icVDS = value->rValue; - here->BSIM4icVDSGiven = TRUE; - break; - case BSIM4_IC_VGS: - here->BSIM4icVGS = value->rValue; - here->BSIM4icVGSGiven = TRUE; - break; - case BSIM4_IC_VBS: - here->BSIM4icVBS = value->rValue; - here->BSIM4icVBSGiven = TRUE; - break; - case BSIM4_IC: - /* FALLTHROUGH added to suppress GCC warning due to - * -Wimplicit-fallthrough flag */ - switch (value->v.numValue) { - case 3: - here->BSIM4icVBS = *(value->v.vec.rVec+2); - here->BSIM4icVBSGiven = TRUE; - /* FALLTHROUGH */ - case 2: - here->BSIM4icVGS = *(value->v.vec.rVec+1); - here->BSIM4icVGSGiven = TRUE; - /* FALLTHROUGH */ - case 1: - here->BSIM4icVDS = *(value->v.vec.rVec); - here->BSIM4icVDSGiven = TRUE; - break; - default: - return(E_BADPARM); - } - break; - default: - return(E_BADPARM); - } - return(OK); -} diff --git a/src/spicelib/devices/bsim4/b4pzld.c b/src/spicelib/devices/bsim4/b4pzld.c deleted file mode 100644 index 379d7cd1e..000000000 --- a/src/spicelib/devices/bsim4/b4pzld.c +++ /dev/null @@ -1,806 +0,0 @@ -/* ****************************************************************************** - * BSIM4 4.8.1 released by Chetan Kumar Dabhi 2/15/2017 * - * BSIM4 Model Equations * - ****************************************************************************** - - ****************************************************************************** - * Copyright 2017 Regents of the University of California. * - * All rights reserved. * - * * - * Project Director: Prof. Chenming Hu. * - * Authors: Gary W. Ng, Weidong Liu, Xuemei Xi, Mohan Dunga, Wenwei Yang * - * Ali Niknejad, Shivendra Singh Parihar, Chetan Kumar Dabhi * - * Yogesh Singh Chauhan, Sayeef Salahuddin, Chenming Hu * - ****************************************************************************** - - ****************************************************************************** - * CMC In-Code Statement * - * * - * The Developer agrees that the following statement will appear in the * - * model code that has been adopted as a CMC Standard. * - * * - * Software is distributed as is, completely without warranty or service * - * support. The University of California and its employees are not liable * - * for the condition or performance of the software. * - * * - * The University of California owns the copyright and grants users a * - * perpetual, irrevocable, worldwide, non-exclusive, royalty-free license * - * with respect to the software as set forth below. * - * * - * The University of California hereby disclaims all implied warranties. * - * * - * The University of California grants the users the right to modify, * - * copy, and redistribute the software and documentation, both within * - * the user's organization and externally, subject to the following * - * restrictions: * - * * - * 1. The users agree not to charge for the University of California code * - * itself but may charge for additions, extensions, or support. * - * * - * 2. In any product based on the software, the users agree to * - * acknowledge the University of California that developed the * - * software. This acknowledgment shall appear in the product * - * documentation. * - * * - * 3. Redistributions to others of source code and documentation must * - * retain the copyright notice, disclaimer, and list of conditions. * - * * - * 4. Redistributions to others in binary form must reproduce the * - * copyright notice, disclaimer, and list of conditions in the * - * documentation and/or other materials provided with the * - * distribution. * - * * - * Agreed to on ______Feb. 15, 2017______________ * - * * - * By: ____University of California, Berkeley___ * - * ____Chenming Hu__________________________ * - * ____Professor in Graduate School ________ * - * * - ****************************************************************************** */ - -#include "ngspice/ngspice.h" -#include "ngspice/cktdefs.h" -#include "ngspice/complex.h" -#include "ngspice/sperror.h" -#include "bsim4def.h" -#include "ngspice/suffix.h" - -int -BSIM4pzLoad( -GENmodel *inModel, -CKTcircuit *ckt, -SPcomplex *s) -{ -BSIM4model *model = (BSIM4model*)inModel; -BSIM4instance *here; - -double gjbd, gjbs, geltd, gcrg, gcrgg, gcrgd, gcrgs, gcrgb; -double xcggb, xcgdb, xcgsb, xcgbb, xcbgb, xcbdb, xcbsb, xcbbb; -double xcdgb, xcddb, xcdsb, xcdbb, xcsgb, xcsdb, xcssb, xcsbb; -double gds, capbd, capbs, FwdSum, RevSum, Gm, Gmbs; -double gstot, gstotd, gstotg, gstots, gstotb, gspr; -double gdtot, gdtotd, gdtotg, gdtots, gdtotb, gdpr; -double gIstotg, gIstotd, gIstots, gIstotb; -double gIdtotg, gIdtotd, gIdtots, gIdtotb; -double gIbtotg, gIbtotd, gIbtots, gIbtotb; -double gIgtotg, gIgtotd, gIgtots, gIgtotb; -double cgso, cgdo, cgbo; -double xcdbdb=0.0, xcsbsb=0.0, xcgmgmb=0.0, xcgmdb=0.0, xcgmsb=0.0, xcdgmb=0.0, xcsgmb=0.0; -double xcgmbb=0.0, xcbgmb=0.0; -double dxpart, sxpart, xgtg, xgtd, xgts, xgtb, xcqgb=0.0, xcqdb=0.0, xcqsb=0.0, xcqbb=0.0; -double gbspsp, gbbdp, gbbsp, gbspg, gbspb; -double gbspdp, gbdpdp, gbdpg, gbdpb, gbdpsp; -double ddxpart_dVd, ddxpart_dVg, ddxpart_dVb, ddxpart_dVs; -double dsxpart_dVd, dsxpart_dVg, dsxpart_dVb, dsxpart_dVs; -double T0=0.0, T1, CoxWL, qcheq, Cdg, Cdd, Cds, Csg, Csd, Css; -double ScalingFactor = 1.0e-9; -struct bsim4SizeDependParam *pParam; -double ggidld, ggidlg, ggidlb, ggislg, ggislb, ggisls; - -double m; - - for (; model != NULL; model = BSIM4nextModel(model)) - { for (here = BSIM4instances(model); here!= NULL; - here = BSIM4nextInstance(here)) - { - pParam = here->pParam; - capbd = here->BSIM4capbd; - capbs = here->BSIM4capbs; - cgso = here->BSIM4cgso; - cgdo = here->BSIM4cgdo; - cgbo = pParam->BSIM4cgbo; - - if (here->BSIM4mode >= 0) - { Gm = here->BSIM4gm; - Gmbs = here->BSIM4gmbs; - FwdSum = Gm + Gmbs; - RevSum = 0.0; - - gbbdp = -(here->BSIM4gbds); - gbbsp = here->BSIM4gbds + here->BSIM4gbgs + here->BSIM4gbbs; - gbdpg = here->BSIM4gbgs; - gbdpdp = here->BSIM4gbds; - gbdpb = here->BSIM4gbbs; - gbdpsp = -(gbdpg + gbdpdp + gbdpb); - - gbspdp = 0.0; - gbspg = 0.0; - gbspb = 0.0; - gbspsp = 0.0; - - if (model->BSIM4igcMod) - { gIstotg = here->BSIM4gIgsg + here->BSIM4gIgcsg; - gIstotd = here->BSIM4gIgcsd; - gIstots = here->BSIM4gIgss + here->BSIM4gIgcss; - gIstotb = here->BSIM4gIgcsb; - - gIdtotg = here->BSIM4gIgdg + here->BSIM4gIgcdg; - gIdtotd = here->BSIM4gIgdd + here->BSIM4gIgcdd; - gIdtots = here->BSIM4gIgcds; - gIdtotb = here->BSIM4gIgcdb; - } - else - { gIstotg = gIstotd = gIstots = gIstotb = 0.0; - gIdtotg = gIdtotd = gIdtots = gIdtotb = 0.0; - } - - if (model->BSIM4igbMod) - { gIbtotg = here->BSIM4gIgbg; - gIbtotd = here->BSIM4gIgbd; - gIbtots = here->BSIM4gIgbs; - gIbtotb = here->BSIM4gIgbb; - } - else - gIbtotg = gIbtotd = gIbtots = gIbtotb = 0.0; - - if ((model->BSIM4igcMod != 0) || (model->BSIM4igbMod != 0)) - { gIgtotg = gIstotg + gIdtotg + gIbtotg; - gIgtotd = gIstotd + gIdtotd + gIbtotd ; - gIgtots = gIstots + gIdtots + gIbtots; - gIgtotb = gIstotb + gIdtotb + gIbtotb; - } - else - gIgtotg = gIgtotd = gIgtots = gIgtotb = 0.0; - - if (here->BSIM4rgateMod == 2) - T0 = *(ckt->CKTstates[0] + here->BSIM4vges) - - *(ckt->CKTstates[0] + here->BSIM4vgs); - else if (here->BSIM4rgateMod == 3) - T0 = *(ckt->CKTstates[0] + here->BSIM4vgms) - - *(ckt->CKTstates[0] + here->BSIM4vgs); - if (here->BSIM4rgateMod > 1) - { gcrgd = here->BSIM4gcrgd * T0; - gcrgg = here->BSIM4gcrgg * T0; - gcrgs = here->BSIM4gcrgs * T0; - gcrgb = here->BSIM4gcrgb * T0; - gcrgg -= here->BSIM4gcrg; - gcrg = here->BSIM4gcrg; - } - else - gcrg = gcrgd = gcrgg = gcrgs = gcrgb = 0.0; - - if (here->BSIM4acnqsMod == 0) - { if (here->BSIM4rgateMod == 3) - { xcgmgmb = cgdo + cgso + pParam->BSIM4cgbo; - xcgmdb = -cgdo; - xcgmsb = -cgso; - xcgmbb = -pParam->BSIM4cgbo; - - xcdgmb = xcgmdb; - xcsgmb = xcgmsb; - xcbgmb = xcgmbb; - - xcggb = here->BSIM4cggb; - xcgdb = here->BSIM4cgdb; - xcgsb = here->BSIM4cgsb; - xcgbb = -(xcggb + xcgdb + xcgsb); - - xcdgb = here->BSIM4cdgb; - xcsgb = -(here->BSIM4cggb + here->BSIM4cbgb - + here->BSIM4cdgb); - xcbgb = here->BSIM4cbgb; - } - else - { xcggb = here->BSIM4cggb + cgdo + cgso - + pParam->BSIM4cgbo; - xcgdb = here->BSIM4cgdb - cgdo; - xcgsb = here->BSIM4cgsb - cgso; - xcgbb = -(xcggb + xcgdb + xcgsb); - - xcdgb = here->BSIM4cdgb - cgdo; - xcsgb = -(here->BSIM4cggb + here->BSIM4cbgb - + here->BSIM4cdgb + cgso); - xcbgb = here->BSIM4cbgb - pParam->BSIM4cgbo; - - xcdgmb = xcsgmb = xcbgmb = 0.0; - } - xcddb = here->BSIM4cddb + here->BSIM4capbd + cgdo; - xcdsb = here->BSIM4cdsb; - - xcsdb = -(here->BSIM4cgdb + here->BSIM4cbdb - + here->BSIM4cddb); - xcssb = here->BSIM4capbs + cgso - (here->BSIM4cgsb - + here->BSIM4cbsb + here->BSIM4cdsb); - - if (!here->BSIM4rbodyMod) - { xcdbb = -(xcdgb + xcddb + xcdsb + xcdgmb); - xcsbb = -(xcsgb + xcsdb + xcssb + xcsgmb); - xcbdb = here->BSIM4cbdb - here->BSIM4capbd; - xcbsb = here->BSIM4cbsb - here->BSIM4capbs; - xcdbdb = 0.0; - } - else - { xcdbb = -(here->BSIM4cddb + here->BSIM4cdgb - + here->BSIM4cdsb); - xcsbb = -(xcsgb + xcsdb + xcssb + xcsgmb) - + here->BSIM4capbs; - xcbdb = here->BSIM4cbdb; - xcbsb = here->BSIM4cbsb; - - xcdbdb = -here->BSIM4capbd; - xcsbsb = -here->BSIM4capbs; - } - xcbbb = -(xcbdb + xcbgb + xcbsb + xcbgmb); - - xgtg = xgtd = xgts = xgtb = 0.0; - sxpart = 0.6; - dxpart = 0.4; - ddxpart_dVd = ddxpart_dVg = ddxpart_dVb - = ddxpart_dVs = 0.0; - dsxpart_dVd = dsxpart_dVg = dsxpart_dVb - = dsxpart_dVs = 0.0; - } - else - { xcggb = xcgdb = xcgsb = xcgbb = 0.0; - xcbgb = xcbdb = xcbsb = xcbbb = 0.0; - xcdgb = xcddb = xcdsb = xcdbb = 0.0; - xcsgb = xcsdb = xcssb = xcsbb = 0.0; - - xgtg = here->BSIM4gtg; - xgtd = here->BSIM4gtd; - xgts = here->BSIM4gts; - xgtb = here->BSIM4gtb; - - xcqgb = here->BSIM4cqgb; - xcqdb = here->BSIM4cqdb; - xcqsb = here->BSIM4cqsb; - xcqbb = here->BSIM4cqbb; - - CoxWL = model->BSIM4coxe * here->pParam->BSIM4weffCV - * here->BSIM4nf * here->pParam->BSIM4leffCV; - qcheq = -(here->BSIM4qgate + here->BSIM4qbulk); - if (fabs(qcheq) <= 1.0e-5 * CoxWL) - { if (model->BSIM4xpart < 0.5) - { dxpart = 0.4; - } - else if (model->BSIM4xpart > 0.5) - { dxpart = 0.0; - } - else - { dxpart = 0.5; - } - ddxpart_dVd = ddxpart_dVg = ddxpart_dVb - = ddxpart_dVs = 0.0; - } - else - { dxpart = here->BSIM4qdrn / qcheq; - Cdd = here->BSIM4cddb; - Csd = -(here->BSIM4cgdb + here->BSIM4cddb - + here->BSIM4cbdb); - ddxpart_dVd = (Cdd - dxpart * (Cdd + Csd)) / qcheq; - Cdg = here->BSIM4cdgb; - Csg = -(here->BSIM4cggb + here->BSIM4cdgb - + here->BSIM4cbgb); - ddxpart_dVg = (Cdg - dxpart * (Cdg + Csg)) / qcheq; - - Cds = here->BSIM4cdsb; - Css = -(here->BSIM4cgsb + here->BSIM4cdsb - + here->BSIM4cbsb); - ddxpart_dVs = (Cds - dxpart * (Cds + Css)) / qcheq; - - ddxpart_dVb = -(ddxpart_dVd + ddxpart_dVg - + ddxpart_dVs); - } - sxpart = 1.0 - dxpart; - dsxpart_dVd = -ddxpart_dVd; - dsxpart_dVg = -ddxpart_dVg; - dsxpart_dVs = -ddxpart_dVs; - dsxpart_dVb = -(dsxpart_dVd + dsxpart_dVg + dsxpart_dVs); - } - } - else - { Gm = -here->BSIM4gm; - Gmbs = -here->BSIM4gmbs; - FwdSum = 0.0; - RevSum = -(Gm + Gmbs); - - gbbsp = -(here->BSIM4gbds); - gbbdp = here->BSIM4gbds + here->BSIM4gbgs + here->BSIM4gbbs; - - gbdpg = 0.0; - gbdpsp = 0.0; - gbdpb = 0.0; - gbdpdp = 0.0; - - gbspg = here->BSIM4gbgs; - gbspsp = here->BSIM4gbds; - gbspb = here->BSIM4gbbs; - gbspdp = -(gbspg + gbspsp + gbspb); - - if (model->BSIM4igcMod) - { gIstotg = here->BSIM4gIgsg + here->BSIM4gIgcdg; - gIstotd = here->BSIM4gIgcds; - gIstots = here->BSIM4gIgss + here->BSIM4gIgcdd; - gIstotb = here->BSIM4gIgcdb; - - gIdtotg = here->BSIM4gIgdg + here->BSIM4gIgcsg; - gIdtotd = here->BSIM4gIgdd + here->BSIM4gIgcss; - gIdtots = here->BSIM4gIgcsd; - gIdtotb = here->BSIM4gIgcsb; - } - else - { gIstotg = gIstotd = gIstots = gIstotb = 0.0; - gIdtotg = gIdtotd = gIdtots = gIdtotb = 0.0; - } - - if (model->BSIM4igbMod) - { gIbtotg = here->BSIM4gIgbg; - gIbtotd = here->BSIM4gIgbs; - gIbtots = here->BSIM4gIgbd; - gIbtotb = here->BSIM4gIgbb; - } - else - gIbtotg = gIbtotd = gIbtots = gIbtotb = 0.0; - - if ((model->BSIM4igcMod != 0) || (model->BSIM4igbMod != 0)) - { gIgtotg = gIstotg + gIdtotg + gIbtotg; - gIgtotd = gIstotd + gIdtotd + gIbtotd ; - gIgtots = gIstots + gIdtots + gIbtots; - gIgtotb = gIstotb + gIdtotb + gIbtotb; - } - else - gIgtotg = gIgtotd = gIgtots = gIgtotb = 0.0; - - if (here->BSIM4rgateMod == 2) - T0 = *(ckt->CKTstates[0] + here->BSIM4vges) - - *(ckt->CKTstates[0] + here->BSIM4vgs); - else if (here->BSIM4rgateMod == 3) - T0 = *(ckt->CKTstates[0] + here->BSIM4vgms) - - *(ckt->CKTstates[0] + here->BSIM4vgs); - if (here->BSIM4rgateMod > 1) - { gcrgd = here->BSIM4gcrgs * T0; - gcrgg = here->BSIM4gcrgg * T0; - gcrgs = here->BSIM4gcrgd * T0; - gcrgb = here->BSIM4gcrgb * T0; - gcrgg -= here->BSIM4gcrg; - gcrg = here->BSIM4gcrg; - } - else - gcrg = gcrgd = gcrgg = gcrgs = gcrgb = 0.0; - - if (here->BSIM4acnqsMod == 0) - { if (here->BSIM4rgateMod == 3) - { xcgmgmb = cgdo + cgso + pParam->BSIM4cgbo; - xcgmdb = -cgdo; - xcgmsb = -cgso; - xcgmbb = -pParam->BSIM4cgbo; - - xcdgmb = xcgmdb; - xcsgmb = xcgmsb; - xcbgmb = xcgmbb; - - xcggb = here->BSIM4cggb; - xcgdb = here->BSIM4cgsb; - xcgsb = here->BSIM4cgdb; - xcgbb = -(xcggb + xcgdb + xcgsb); - - xcdgb = -(here->BSIM4cggb + here->BSIM4cbgb - + here->BSIM4cdgb); - xcsgb = here->BSIM4cdgb; - xcbgb = here->BSIM4cbgb; - } - else - { xcggb = here->BSIM4cggb + cgdo + cgso - + pParam->BSIM4cgbo; - xcgdb = here->BSIM4cgsb - cgdo; - xcgsb = here->BSIM4cgdb - cgso; - xcgbb = -(xcggb + xcgdb + xcgsb); - - xcdgb = -(here->BSIM4cggb + here->BSIM4cbgb - + here->BSIM4cdgb + cgdo); - xcsgb = here->BSIM4cdgb - cgso; - xcbgb = here->BSIM4cbgb - pParam->BSIM4cgbo; - - xcdgmb = xcsgmb = xcbgmb = 0.0; - } - xcddb = here->BSIM4capbd + cgdo - (here->BSIM4cgsb - + here->BSIM4cbsb + here->BSIM4cdsb); - xcdsb = -(here->BSIM4cgdb + here->BSIM4cbdb - + here->BSIM4cddb); - - xcsdb = here->BSIM4cdsb; - xcssb = here->BSIM4cddb + here->BSIM4capbs + cgso; - - if (!here->BSIM4rbodyMod) - { xcdbb = -(xcdgb + xcddb + xcdsb + xcdgmb); - xcsbb = -(xcsgb + xcsdb + xcssb + xcsgmb); - xcbdb = here->BSIM4cbsb - here->BSIM4capbd; - xcbsb = here->BSIM4cbdb - here->BSIM4capbs; - xcdbdb = 0.0; - } - else - { xcdbb = -(xcdgb + xcddb + xcdsb + xcdgmb) - + here->BSIM4capbd; - xcsbb = -(here->BSIM4cddb + here->BSIM4cdgb - + here->BSIM4cdsb); - xcbdb = here->BSIM4cbsb; - xcbsb = here->BSIM4cbdb; - xcdbdb = -here->BSIM4capbd; - xcsbsb = -here->BSIM4capbs; - } - xcbbb = -(xcbgb + xcbdb + xcbsb + xcbgmb); - - xgtg = xgtd = xgts = xgtb = 0.0; - sxpart = 0.4; - dxpart = 0.6; - ddxpart_dVd = ddxpart_dVg = ddxpart_dVb - = ddxpart_dVs = 0.0; - dsxpart_dVd = dsxpart_dVg = dsxpart_dVb - = dsxpart_dVs = 0.0; - } - else - { xcggb = xcgdb = xcgsb = xcgbb = 0.0; - xcbgb = xcbdb = xcbsb = xcbbb = 0.0; - xcdgb = xcddb = xcdsb = xcdbb = 0.0; - xcsgb = xcsdb = xcssb = xcsbb = 0.0; - - xgtg = here->BSIM4gtg; - xgtd = here->BSIM4gts; - xgts = here->BSIM4gtd; - xgtb = here->BSIM4gtb; - - xcqgb = here->BSIM4cqgb; - xcqdb = here->BSIM4cqsb; - xcqsb = here->BSIM4cqdb; - xcqbb = here->BSIM4cqbb; - - CoxWL = model->BSIM4coxe * here->pParam->BSIM4weffCV - * here->BSIM4nf * here->pParam->BSIM4leffCV; - qcheq = -(here->BSIM4qgate + here->BSIM4qbulk); - if (fabs(qcheq) <= 1.0e-5 * CoxWL) - { if (model->BSIM4xpart < 0.5) - { sxpart = 0.4; - } - else if (model->BSIM4xpart > 0.5) - { sxpart = 0.0; - } - else - { sxpart = 0.5; - } - dsxpart_dVd = dsxpart_dVg = dsxpart_dVb - = dsxpart_dVs = 0.0; - } - else - { sxpart = here->BSIM4qdrn / qcheq; - Css = here->BSIM4cddb; - Cds = -(here->BSIM4cgdb + here->BSIM4cddb - + here->BSIM4cbdb); - dsxpart_dVs = (Css - sxpart * (Css + Cds)) / qcheq; - Csg = here->BSIM4cdgb; - Cdg = -(here->BSIM4cggb + here->BSIM4cdgb - + here->BSIM4cbgb); - dsxpart_dVg = (Csg - sxpart * (Csg + Cdg)) / qcheq; - - Csd = here->BSIM4cdsb; - Cdd = -(here->BSIM4cgsb + here->BSIM4cdsb - + here->BSIM4cbsb); - dsxpart_dVd = (Csd - sxpart * (Csd + Cdd)) / qcheq; - - dsxpart_dVb = -(dsxpart_dVd + dsxpart_dVg - + dsxpart_dVs); - } - dxpart = 1.0 - sxpart; - ddxpart_dVd = -dsxpart_dVd; - ddxpart_dVg = -dsxpart_dVg; - ddxpart_dVs = -dsxpart_dVs; - ddxpart_dVb = -(ddxpart_dVd + ddxpart_dVg + ddxpart_dVs); - } - } - - if (model->BSIM4rdsMod == 1) - { gstot = here->BSIM4gstot; - gstotd = here->BSIM4gstotd; - gstotg = here->BSIM4gstotg; - gstots = here->BSIM4gstots - gstot; - gstotb = here->BSIM4gstotb; - - gdtot = here->BSIM4gdtot; - gdtotd = here->BSIM4gdtotd - gdtot; - gdtotg = here->BSIM4gdtotg; - gdtots = here->BSIM4gdtots; - gdtotb = here->BSIM4gdtotb; - } - else - { gstot = gstotd = gstotg = gstots = gstotb = 0.0; - gdtot = gdtotd = gdtotg = gdtots = gdtotb = 0.0; - } - - - T1 = *(ckt->CKTstate0 + here->BSIM4qdef) * here->BSIM4gtau; - gds = here->BSIM4gds; - - /* - * Loading PZ matrix - */ - m = here->BSIM4m; - - if (!model->BSIM4rdsMod) - { gdpr = here->BSIM4drainConductance; - gspr = here->BSIM4sourceConductance; - } - else - gdpr = gspr = 0.0; - - if (!here->BSIM4rbodyMod) - { gjbd = here->BSIM4gbd; - gjbs = here->BSIM4gbs; - } - else - gjbd = gjbs = 0.0; - - geltd = here->BSIM4grgeltd; - - if (here->BSIM4rgateMod == 1) - { *(here->BSIM4GEgePtr) += m * geltd; - *(here->BSIM4GPgePtr) -= m * geltd; - *(here->BSIM4GEgpPtr) -= m * geltd; - - *(here->BSIM4GPgpPtr ) += m * xcggb * s->real; - *(here->BSIM4GPgpPtr +1) += m * xcggb * s->imag; - *(here->BSIM4GPgpPtr) += m * (geltd - xgtg + gIgtotg); - *(here->BSIM4GPdpPtr ) += m * xcgdb * s->real; - *(here->BSIM4GPdpPtr +1) += m * xcgdb * s->imag; - *(here->BSIM4GPdpPtr) -= m * (xgtd - gIgtotd); - *(here->BSIM4GPspPtr ) += m * xcgsb * s->real; - *(here->BSIM4GPspPtr +1) += m * xcgsb * s->imag; - *(here->BSIM4GPspPtr) -= m * (xgts - gIgtots); - *(here->BSIM4GPbpPtr ) += m * xcgbb * s->real; - *(here->BSIM4GPbpPtr +1) += m * xcgbb * s->imag; - *(here->BSIM4GPbpPtr) -= m * (xgtb - gIgtotb); - } - else if (here->BSIM4rgateMod == 2) - { *(here->BSIM4GEgePtr) += m * gcrg; - *(here->BSIM4GEgpPtr) += m * gcrgg; - *(here->BSIM4GEdpPtr) += m * gcrgd; - *(here->BSIM4GEspPtr) += m * gcrgs; - *(here->BSIM4GEbpPtr) += m * gcrgb; - - *(here->BSIM4GPgePtr) -= m * gcrg; - *(here->BSIM4GPgpPtr ) += m * xcggb * s->real; - *(here->BSIM4GPgpPtr +1) += m * xcggb * s->imag; - *(here->BSIM4GPgpPtr) -= m * (gcrgg + xgtg - gIgtotg); - *(here->BSIM4GPdpPtr ) += m * xcgdb * s->real; - *(here->BSIM4GPdpPtr +1) += m * xcgdb * s->imag; - *(here->BSIM4GPdpPtr) -= m * (gcrgd + xgtd - gIgtotd); - *(here->BSIM4GPspPtr ) += m * xcgsb * s->real; - *(here->BSIM4GPspPtr +1) += m * xcgsb * s->imag; - *(here->BSIM4GPspPtr) -= m * (gcrgs + xgts - gIgtots); - *(here->BSIM4GPbpPtr ) += m * xcgbb * s->real; - *(here->BSIM4GPbpPtr +1) += m * xcgbb * s->imag; - *(here->BSIM4GPbpPtr) -= m * (gcrgb + xgtb - gIgtotb); - } - else if (here->BSIM4rgateMod == 3) - { *(here->BSIM4GEgePtr) += m * geltd; - *(here->BSIM4GEgmPtr) -= m * geltd; - *(here->BSIM4GMgePtr) -= m * geltd; - *(here->BSIM4GMgmPtr) += m * (geltd + gcrg); - *(here->BSIM4GMgmPtr ) += m * xcgmgmb * s->real; - *(here->BSIM4GMgmPtr +1) += m * xcgmgmb * s->imag; - - *(here->BSIM4GMdpPtr) += m * gcrgd; - *(here->BSIM4GMdpPtr ) += m * xcgmdb * s->real; - *(here->BSIM4GMdpPtr +1) += m * xcgmdb * s->imag; - *(here->BSIM4GMgpPtr) += m * gcrgg; - *(here->BSIM4GMspPtr) += m * gcrgs; - *(here->BSIM4GMspPtr ) += m * xcgmsb * s->real; - *(here->BSIM4GMspPtr +1) += m * xcgmsb * s->imag; - *(here->BSIM4GMbpPtr) += m * gcrgb; - *(here->BSIM4GMbpPtr ) += m * xcgmbb * s->real; - *(here->BSIM4GMbpPtr +1) += m * xcgmbb * s->imag; - - *(here->BSIM4DPgmPtr ) += m * xcdgmb * s->real; - *(here->BSIM4DPgmPtr +1) += m * xcdgmb * s->imag; - *(here->BSIM4GPgmPtr) -= m * gcrg; - *(here->BSIM4SPgmPtr ) += m * xcsgmb * s->real; - *(here->BSIM4SPgmPtr +1) += m * xcsgmb * s->imag; - *(here->BSIM4BPgmPtr ) += m * xcbgmb * s->real; - *(here->BSIM4BPgmPtr +1) += m * xcbgmb * s->imag; - - *(here->BSIM4GPgpPtr) -= m * (gcrgg + xgtg - gIgtotg); - *(here->BSIM4GPgpPtr ) += m * xcggb * s->real; - *(here->BSIM4GPgpPtr +1) += m * xcggb * s->imag; - *(here->BSIM4GPdpPtr) -= m * (gcrgd + xgtd - gIgtotd); - *(here->BSIM4GPdpPtr ) += m * xcgdb * s->real; - *(here->BSIM4GPdpPtr +1) += m * xcgdb * s->imag; - *(here->BSIM4GPspPtr) -= m * (gcrgs + xgts - gIgtots); - *(here->BSIM4GPspPtr ) += m * xcgsb * s->real; - *(here->BSIM4GPspPtr +1) += m * xcgsb * s->imag; - *(here->BSIM4GPbpPtr) -= m * (gcrgb + xgtb - gIgtotb); - *(here->BSIM4GPbpPtr ) += m * xcgbb * s->real; - *(here->BSIM4GPbpPtr +1) += m * xcgbb * s->imag; - } - else - { *(here->BSIM4GPdpPtr ) += m * xcgdb * s->real; - *(here->BSIM4GPdpPtr +1) += m * xcgdb * s->imag; - *(here->BSIM4GPdpPtr) -= m * (xgtd - gIgtotd); - *(here->BSIM4GPgpPtr ) += m * xcggb * s->real; - *(here->BSIM4GPgpPtr +1) += m * xcggb * s->imag; - *(here->BSIM4GPgpPtr) -= m * (xgtg - gIgtotg); - *(here->BSIM4GPspPtr ) += m * xcgsb * s->real; - *(here->BSIM4GPspPtr +1) += m * xcgsb * s->imag; - *(here->BSIM4GPspPtr) -= m * (xgts - gIgtots); - *(here->BSIM4GPbpPtr ) += m * xcgbb * s->real; - *(here->BSIM4GPbpPtr +1) += m * xcgbb * s->imag; - *(here->BSIM4GPbpPtr) -= m * (xgtb - gIgtotb); - } - - if (model->BSIM4rdsMod) - { (*(here->BSIM4DgpPtr) += m * gdtotg); - (*(here->BSIM4DspPtr) += m * gdtots); - (*(here->BSIM4DbpPtr) += m * gdtotb); - (*(here->BSIM4SdpPtr) += m * gstotd); - (*(here->BSIM4SgpPtr) += m * gstotg); - (*(here->BSIM4SbpPtr) += m * gstotb); - } - - *(here->BSIM4DPdpPtr ) += m * xcddb * s->real; - *(here->BSIM4DPdpPtr +1) += m * xcddb * s->imag; - *(here->BSIM4DPdpPtr) += m * (gdpr + gds + here->BSIM4gbd - - gdtotd + RevSum + gbdpdp - gIdtotd - + dxpart * xgtd + T1 * ddxpart_dVd); - *(here->BSIM4DPdPtr) -= m * (gdpr + gdtot); - *(here->BSIM4DPgpPtr ) += m * xcdgb * s->real; - *(here->BSIM4DPgpPtr +1) += m * xcdgb * s->imag; - *(here->BSIM4DPgpPtr) += m * (Gm - gdtotg + gbdpg - gIdtotg - + T1 * ddxpart_dVg + dxpart * xgtg); - *(here->BSIM4DPspPtr ) += m * xcdsb * s->real; - *(here->BSIM4DPspPtr +1) += m * xcdsb * s->imag; - *(here->BSIM4DPspPtr) -= m * (gds + FwdSum + gdtots - gbdpsp + gIdtots - - T1 * ddxpart_dVs - dxpart * xgts); - *(here->BSIM4DPbpPtr ) += m * xcdbb * s->real; - *(here->BSIM4DPbpPtr +1) += m * xcdbb * s->imag; - *(here->BSIM4DPbpPtr) -= m * (gjbd + gdtotb - Gmbs - gbdpb + gIdtotb - - T1 * ddxpart_dVb - dxpart * xgtb); - - *(here->BSIM4DdpPtr) -= m * (gdpr - gdtotd); - *(here->BSIM4DdPtr) += m * (gdpr + gdtot); - - *(here->BSIM4SPdpPtr ) += m * xcsdb * s->real; - *(here->BSIM4SPdpPtr +1) += m * xcsdb * s->imag; - *(here->BSIM4SPdpPtr) -= m * (gds + gstotd + RevSum - gbspdp + gIstotd - - T1 * dsxpart_dVd - sxpart * xgtd); - *(here->BSIM4SPgpPtr ) += m * xcsgb * s->real; - *(here->BSIM4SPgpPtr +1) += m * xcsgb * s->imag; - *(here->BSIM4SPgpPtr) -= m * (Gm + gstotg - gbspg + gIstotg - - T1 * dsxpart_dVg - sxpart * xgtg); - *(here->BSIM4SPspPtr ) += m * xcssb * s->real; - *(here->BSIM4SPspPtr +1) += m * xcssb * s->imag; - *(here->BSIM4SPspPtr) += m * (gspr + gds + here->BSIM4gbs - gIstots - - gstots + FwdSum + gbspsp - + sxpart * xgts + T1 * dsxpart_dVs); - *(here->BSIM4SPsPtr) -= m * (gspr + gstot); - *(here->BSIM4SPbpPtr ) += m * xcsbb * s->real; - *(here->BSIM4SPbpPtr +1) += m * xcsbb * s->imag; - *(here->BSIM4SPbpPtr) -= m * (gjbs + gstotb + Gmbs - gbspb + gIstotb - - T1 * dsxpart_dVb - sxpart * xgtb); - - *(here->BSIM4SspPtr) -= m * (gspr - gstots); - *(here->BSIM4SsPtr) += m * (gspr + gstot); - - *(here->BSIM4BPdpPtr ) += m * xcbdb * s->real; - *(here->BSIM4BPdpPtr +1) += m * xcbdb * s->imag; - *(here->BSIM4BPdpPtr) -= m * (gjbd - gbbdp + gIbtotd); - *(here->BSIM4BPgpPtr ) += m * xcbgb * s->real; - *(here->BSIM4BPgpPtr +1) += m * xcbgb * s->imag; - *(here->BSIM4BPgpPtr) -= m * (here->BSIM4gbgs + gIbtotg); - *(here->BSIM4BPspPtr ) += m * xcbsb * s->real; - *(here->BSIM4BPspPtr +1) += m * xcbsb * s->imag; - *(here->BSIM4BPspPtr) -= m * (gjbs - gbbsp + gIbtots); - *(here->BSIM4BPbpPtr ) += m * xcbbb * s->real; - *(here->BSIM4BPbpPtr +1) += m * xcbbb * s->imag; - *(here->BSIM4BPbpPtr) += m * (gjbd + gjbs - here->BSIM4gbbs - - gIbtotb); - ggidld = here->BSIM4ggidld; - ggidlg = here->BSIM4ggidlg; - ggidlb = here->BSIM4ggidlb; - ggislg = here->BSIM4ggislg; - ggisls = here->BSIM4ggisls; - ggislb = here->BSIM4ggislb; - - /* stamp gidl */ - (*(here->BSIM4DPdpPtr) += m * ggidld); - (*(here->BSIM4DPgpPtr) += m * ggidlg); - (*(here->BSIM4DPspPtr) -= m * ((ggidlg + ggidld) + ggidlb)); - (*(here->BSIM4DPbpPtr) += m * ggidlb); - (*(here->BSIM4BPdpPtr) -= m * ggidld); - (*(here->BSIM4BPgpPtr) -= m * ggidlg); - (*(here->BSIM4BPspPtr) += m * ((ggidlg + ggidld) + ggidlb)); - (*(here->BSIM4BPbpPtr) -= m * ggidlb); - /* stamp gisl */ - (*(here->BSIM4SPdpPtr) -= m * ((ggisls + ggislg) + ggislb)); - (*(here->BSIM4SPgpPtr) += m * ggislg); - (*(here->BSIM4SPspPtr) += m * ggisls); - (*(here->BSIM4SPbpPtr) += m * ggislb); - (*(here->BSIM4BPdpPtr) += m * ((ggislg + ggisls) + ggislb)); - (*(here->BSIM4BPgpPtr) -= m * ggislg); - (*(here->BSIM4BPspPtr) -= m * ggisls); - (*(here->BSIM4BPbpPtr) -= m * ggislb); - - if (here->BSIM4rbodyMod) - { (*(here->BSIM4DPdbPtr ) += m * xcdbdb * s->real); - (*(here->BSIM4DPdbPtr +1) += m * xcdbdb * s->imag); - (*(here->BSIM4DPdbPtr) -= m * here->BSIM4gbd); - (*(here->BSIM4SPsbPtr ) += m * xcsbsb * s->real); - (*(here->BSIM4SPsbPtr +1) += m * xcsbsb * s->imag); - (*(here->BSIM4SPsbPtr) -= m * here->BSIM4gbs); - - (*(here->BSIM4DBdpPtr ) += m * xcdbdb * s->real); - (*(here->BSIM4DBdpPtr +1) += m * xcdbdb * s->imag); - (*(here->BSIM4DBdpPtr) -= m * here->BSIM4gbd); - (*(here->BSIM4DBdbPtr ) -= m * xcdbdb * s->real); - (*(here->BSIM4DBdbPtr +1) -= m * xcdbdb * s->imag); - (*(here->BSIM4DBdbPtr) += m * (here->BSIM4gbd + here->BSIM4grbpd - + here->BSIM4grbdb)); - (*(here->BSIM4DBbpPtr) -= m * here->BSIM4grbpd); - (*(here->BSIM4DBbPtr) -= m * here->BSIM4grbdb); - - (*(here->BSIM4BPdbPtr) -= m * here->BSIM4grbpd); - (*(here->BSIM4BPbPtr) -= m * here->BSIM4grbpb); - (*(here->BSIM4BPsbPtr) -= m * here->BSIM4grbps); - (*(here->BSIM4BPbpPtr) += m * (here->BSIM4grbpd + here->BSIM4grbps - + here->BSIM4grbpb)); - /* WDL: (-here->BSIM4gbbs) already added to BPbpPtr */ - - (*(here->BSIM4SBspPtr ) += m * xcsbsb * s->real); - (*(here->BSIM4SBspPtr +1) += m * xcsbsb * s->imag); - (*(here->BSIM4SBspPtr) -= m * here->BSIM4gbs); - (*(here->BSIM4SBbpPtr) -= m * here->BSIM4grbps); - (*(here->BSIM4SBbPtr) -= m * here->BSIM4grbsb); - (*(here->BSIM4SBsbPtr ) -= m * xcsbsb * s->real); - (*(here->BSIM4SBsbPtr +1) -= m * xcsbsb * s->imag); - (*(here->BSIM4SBsbPtr) += m * (here->BSIM4gbs - + here->BSIM4grbps + here->BSIM4grbsb)); - - (*(here->BSIM4BdbPtr) -= m * here->BSIM4grbdb); - (*(here->BSIM4BbpPtr) -= m * here->BSIM4grbpb); - (*(here->BSIM4BsbPtr) -= m * here->BSIM4grbsb); - (*(here->BSIM4BbPtr) += m * (here->BSIM4grbsb + here->BSIM4grbdb - + here->BSIM4grbpb)); - } - - if (here->BSIM4acnqsMod) - { *(here->BSIM4QqPtr ) += m * s->real * ScalingFactor; - *(here->BSIM4QqPtr +1) += m * s->imag * ScalingFactor; - *(here->BSIM4QgpPtr ) -= m * xcqgb * s->real; - *(here->BSIM4QgpPtr +1) -= m * xcqgb * s->imag; - *(here->BSIM4QdpPtr ) -= m * xcqdb * s->real; - *(here->BSIM4QdpPtr +1) -= m * xcqdb * s->imag; - *(here->BSIM4QbpPtr ) -= m * xcqbb * s->real; - *(here->BSIM4QbpPtr +1) -= m * xcqbb * s->imag; - *(here->BSIM4QspPtr ) -= m * xcqsb * s->real; - *(here->BSIM4QspPtr +1) -= m * xcqsb * s->imag; - - *(here->BSIM4GPqPtr) -= m * here->BSIM4gtau; - *(here->BSIM4DPqPtr) += m * dxpart * here->BSIM4gtau; - *(here->BSIM4SPqPtr) += m * sxpart * here->BSIM4gtau; - - *(here->BSIM4QqPtr) += m * here->BSIM4gtau; - *(here->BSIM4QgpPtr) += m * xgtg; - *(here->BSIM4QdpPtr) += m * xgtd; - *(here->BSIM4QbpPtr) += m * xgtb; - *(here->BSIM4QspPtr) += m * xgts; - } - } - } - return(OK); -} diff --git a/src/spicelib/devices/bsim4/b4set.c b/src/spicelib/devices/bsim4/b4set.c deleted file mode 100644 index c721d8d8c..000000000 --- a/src/spicelib/devices/bsim4/b4set.c +++ /dev/null @@ -1,2817 +0,0 @@ -/* ****************************************************************************** - * BSIM4 4.8.1 released by Chetan Kumar Dabhi 2/15/2017 * - * BSIM4 Model Equations * - ****************************************************************************** - - ****************************************************************************** - * Copyright 2017 Regents of the University of California. * - * All rights reserved. * - * * - * Project Director: Prof. Chenming Hu. * - * Authors: Gary W. Ng, Weidong Liu, Xuemei Xi, Mohan Dunga, Wenwei Yang * - * Ali Niknejad, Shivendra Singh Parihar, Chetan Kumar Dabhi * - * Yogesh Singh Chauhan, Sayeef Salahuddin, Chenming Hu * - ****************************************************************************** - - ****************************************************************************** - * CMC In-Code Statement * - * * - * The Developer agrees that the following statement will appear in the * - * model code that has been adopted as a CMC Standard. * - * * - * Software is distributed as is, completely without warranty or service * - * support. The University of California and its employees are not liable * - * for the condition or performance of the software. * - * * - * The University of California owns the copyright and grants users a * - * perpetual, irrevocable, worldwide, non-exclusive, royalty-free license * - * with respect to the software as set forth below. * - * * - * The University of California hereby disclaims all implied warranties. * - * * - * The University of California grants the users the right to modify, * - * copy, and redistribute the software and documentation, both within * - * the user's organization and externally, subject to the following * - * restrictions: * - * * - * 1. The users agree not to charge for the University of California code * - * itself but may charge for additions, extensions, or support. * - * * - * 2. In any product based on the software, the users agree to * - * acknowledge the University of California that developed the * - * software. This acknowledgment shall appear in the product * - * documentation. * - * * - * 3. Redistributions to others of source code and documentation must * - * retain the copyright notice, disclaimer, and list of conditions. * - * * - * 4. Redistributions to others in binary form must reproduce the * - * copyright notice, disclaimer, and list of conditions in the * - * documentation and/or other materials provided with the * - * distribution. * - * * - * Agreed to on ______Feb. 15, 2017______________ * - * * - * By: ____University of California, Berkeley___ * - * ____Chenming Hu__________________________ * - * ____Professor in Graduate School ________ * - * * - ****************************************************************************** */ - -#include "ngspice/ngspice.h" -#include "ngspice/jobdefs.h" -#include "ngspice/ftedefs.h" -#include "ngspice/smpdefs.h" -#include "ngspice/cktdefs.h" -#include "bsim4def.h" -#include "ngspice/const.h" -#include "ngspice/sperror.h" -#include "ngspice/suffix.h" - -#ifdef USE_OMP -#include "ngspice/cpextern.h" -#endif - -#define MAX_EXP 5.834617425e14 -#define MIN_EXP 1.713908431e-15 -#define EXP_THRESHOLD 34.0 -#define EPS0 8.85418e-12 -#define EPSSI 1.03594e-10 -#define PI 3.141592654 -#define Charge_q 1.60219e-19 - -int -BSIM4setup( -SMPmatrix *matrix, -GENmodel *inModel, -CKTcircuit *ckt, -int *states) -{ -BSIM4model *model = (BSIM4model*)inModel; -BSIM4instance *here; -int error; -CKTnode *tmp; -int noiseAnalGiven = 0, createNode; /* Criteria for new node creation */ -double Rtot, DMCGeff, DMCIeff, DMDGeff; -JOB *job; - -#ifdef USE_OMP -int idx, InstCount; -BSIM4instance **InstArray; -#endif - - /* Search for a noise analysis request */ - for (job = ((TSKtask *)ft_curckt->ci_curTask)->jobs;job;job = job->JOBnextJob) { - if(strcmp(job->JOBname,"Noise Analysis")==0) { - noiseAnalGiven = 1; - break; - } - } - - /* loop through all the BSIM4 device models */ - for( ; model != NULL; model = BSIM4nextModel(model)) - { /* process defaults of model parameters */ - if (!model->BSIM4typeGiven) - model->BSIM4type = NMOS; - - if (!model->BSIM4mobModGiven) - model->BSIM4mobMod = 0; - else if ((model->BSIM4mobMod != 0) && (model->BSIM4mobMod != 1)&& (model->BSIM4mobMod != 2)&& (model->BSIM4mobMod != 3) - && (model->BSIM4mobMod != 4) && (model->BSIM4mobMod != 5) && (model->BSIM4mobMod != 6)) /* Synopsys 08/30/2013 modify */ - { model->BSIM4mobMod = 0; - printf("Warning: mobMod has been set to its default value: 0.\n"); - } - - if (!model->BSIM4binUnitGiven) - model->BSIM4binUnit = 1; - if (!model->BSIM4paramChkGiven) - model->BSIM4paramChk = 1; - - if (!model->BSIM4dioModGiven) - model->BSIM4dioMod = 1; - else if ((model->BSIM4dioMod != 0) && (model->BSIM4dioMod != 1) - && (model->BSIM4dioMod != 2)) - { model->BSIM4dioMod = 1; - printf("Warning: dioMod has been set to its default value: 1.\n"); - } - - if (!model->BSIM4cvchargeModGiven) - model->BSIM4cvchargeMod = 0; - if (!model->BSIM4capModGiven) - model->BSIM4capMod = 2; - else if ((model->BSIM4capMod != 0) && (model->BSIM4capMod != 1) - && (model->BSIM4capMod != 2)) - { model->BSIM4capMod = 2; - printf("Warning: capMod has been set to its default value: 2.\n"); - } - - if (!model->BSIM4rdsModGiven) - model->BSIM4rdsMod = 0; - else if ((model->BSIM4rdsMod != 0) && (model->BSIM4rdsMod != 1)) - { model->BSIM4rdsMod = 0; - printf("Warning: rdsMod has been set to its default value: 0.\n"); - } - if (!model->BSIM4rbodyModGiven) - model->BSIM4rbodyMod = 0; - else if ((model->BSIM4rbodyMod != 0) && (model->BSIM4rbodyMod != 1) && (model->BSIM4rbodyMod != 2)) - { model->BSIM4rbodyMod = 0; - printf("Warning: rbodyMod has been set to its default value: 0.\n"); - } - - if (!model->BSIM4rgateModGiven) - model->BSIM4rgateMod = 0; - else if ((model->BSIM4rgateMod != 0) && (model->BSIM4rgateMod != 1) - && (model->BSIM4rgateMod != 2) && (model->BSIM4rgateMod != 3)) - { model->BSIM4rgateMod = 0; - printf("Warning: rgateMod has been set to its default value: 0.\n"); - } - - if (!model->BSIM4perModGiven) - model->BSIM4perMod = 1; - else if ((model->BSIM4perMod != 0) && (model->BSIM4perMod != 1)) - { model->BSIM4perMod = 1; - printf("Warning: perMod has been set to its default value: 1.\n"); - } - - if (!model->BSIM4geoModGiven) - model->BSIM4geoMod = 0; - - if (!model->BSIM4rgeoModGiven) - model->BSIM4rgeoMod = 0; - else if ((model->BSIM4rgeoMod != 0) && (model->BSIM4rgeoMod != 1)) - { model->BSIM4rgeoMod = 1; - printf("Warning: rgeoMod has been set to its default value: 1.\n"); - } - if (!model->BSIM4fnoiModGiven) - model->BSIM4fnoiMod = 1; - else if ((model->BSIM4fnoiMod != 0) && (model->BSIM4fnoiMod != 1)) - { model->BSIM4fnoiMod = 1; - printf("Warning: fnoiMod has been set to its default value: 1.\n"); - } - if (!model->BSIM4tnoiModGiven) - model->BSIM4tnoiMod = 0; /* WDLiu: tnoiMod=1 needs to set internal S/D nodes */ - else if ((model->BSIM4tnoiMod != 0) && (model->BSIM4tnoiMod != 1) && (model->BSIM4tnoiMod != 2)) /* v4.7 */ - { model->BSIM4tnoiMod = 0; - printf("Warning: tnoiMod has been set to its default value: 0.\n"); - } - - if (!model->BSIM4trnqsModGiven) - model->BSIM4trnqsMod = 0; - else if ((model->BSIM4trnqsMod != 0) && (model->BSIM4trnqsMod != 1)) - { model->BSIM4trnqsMod = 0; - printf("Warning: trnqsMod has been set to its default value: 0.\n"); - } - if (!model->BSIM4acnqsModGiven) - model->BSIM4acnqsMod = 0; - else if ((model->BSIM4acnqsMod != 0) && (model->BSIM4acnqsMod != 1)) - { model->BSIM4acnqsMod = 0; - printf("Warning: acnqsMod has been set to its default value: 0.\n"); - } - - if (!model->BSIM4mtrlModGiven) - model->BSIM4mtrlMod = 0; - else if((model->BSIM4mtrlMod != 0) && (model->BSIM4mtrlMod != 1)) - { - model->BSIM4mtrlMod = 0; - printf("Warning: mtrlMod has been set to its default value: 0.\n"); - } - if (!model->BSIM4mtrlCompatModGiven) - model->BSIM4mtrlCompatMod = 0; - else if((model->BSIM4mtrlCompatMod != 0) && (model->BSIM4mtrlCompatMod != 1)) - { - model->BSIM4mtrlCompatMod = 0; - printf("Warning: mtrlCompatMod has been set to its default value: 0.\n"); - } - - if (!model->BSIM4igcModGiven) - model->BSIM4igcMod = 0; - else if ((model->BSIM4igcMod != 0) && (model->BSIM4igcMod != 1) - && (model->BSIM4igcMod != 2)) - { model->BSIM4igcMod = 0; - printf("Warning: igcMod has been set to its default value: 0.\n"); - } - if (!model->BSIM4igbModGiven) - model->BSIM4igbMod = 0; - else if ((model->BSIM4igbMod != 0) && (model->BSIM4igbMod != 1)) - { model->BSIM4igbMod = 0; - printf("Warning: igbMod has been set to its default value: 0.\n"); - } - if (!model->BSIM4tempModGiven) - model->BSIM4tempMod = 0; - else if ((model->BSIM4tempMod != 0) && (model->BSIM4tempMod != 1) - && (model->BSIM4tempMod != 2) && (model->BSIM4tempMod != 3)) - { model->BSIM4tempMod = 0; - printf("Warning: tempMod has been set to its default value: 0.\n"); - } - - if (!model->BSIM4versionGiven) - model->BSIM4version = copy("4.8.1"); - if (!model->BSIM4toxrefGiven) - model->BSIM4toxref = 30.0e-10; - if (!model->BSIM4eotGiven) - model->BSIM4eot = 15.0e-10; - if (!model->BSIM4vddeotGiven) - model->BSIM4vddeot = (model->BSIM4type == NMOS) ? 1.5 : -1.5; - if (!model->BSIM4tempeotGiven) - model->BSIM4tempeot = 300.15; - if (!model->BSIM4leffeotGiven) - model->BSIM4leffeot = 1; - if (!model->BSIM4weffeotGiven) - model->BSIM4weffeot = 10; - if (!model->BSIM4adosGiven) - model->BSIM4ados = 1.0; - if (!model->BSIM4bdosGiven) - model->BSIM4bdos = 1.0; - if (!model->BSIM4toxeGiven) - model->BSIM4toxe = 30.0e-10; - if (!model->BSIM4toxpGiven) - model->BSIM4toxp = model->BSIM4toxe; - if (!model->BSIM4toxmGiven) - model->BSIM4toxm = model->BSIM4toxe; - if (!model->BSIM4dtoxGiven) - model->BSIM4dtox = 0.0; - if (!model->BSIM4epsroxGiven) - model->BSIM4epsrox = 3.9; - - if (!model->BSIM4cdscGiven) - model->BSIM4cdsc = 2.4e-4; /* unit Q/V/m^2 */ - if (!model->BSIM4cdscbGiven) - model->BSIM4cdscb = 0.0; /* unit Q/V/m^2 */ - if (!model->BSIM4cdscdGiven) - model->BSIM4cdscd = 0.0; /* unit Q/V/m^2 */ - if (!model->BSIM4citGiven) - model->BSIM4cit = 0.0; /* unit Q/V/m^2 */ - if (!model->BSIM4nfactorGiven) - model->BSIM4nfactor = 1.0; - if (!model->BSIM4xjGiven) - model->BSIM4xj = .15e-6; - if (!model->BSIM4vsatGiven) - model->BSIM4vsat = 8.0e4; /* unit m/s */ - if (!model->BSIM4atGiven) - model->BSIM4at = 3.3e4; /* unit m/s */ - if (!model->BSIM4a0Given) - model->BSIM4a0 = 1.0; - if (!model->BSIM4agsGiven) - model->BSIM4ags = 0.0; - if (!model->BSIM4a1Given) - model->BSIM4a1 = 0.0; - if (!model->BSIM4a2Given) - model->BSIM4a2 = 1.0; - if (!model->BSIM4ketaGiven) - model->BSIM4keta = -0.047; /* unit / V */ - if (!model->BSIM4nsubGiven) - model->BSIM4nsub = 6.0e16; /* unit 1/cm3 */ - if (!model->BSIM4phigGiven) - model->BSIM4phig = 4.05; - if (!model->BSIM4epsrgateGiven) - model->BSIM4epsrgate = 11.7; - if (!model->BSIM4easubGiven) - model->BSIM4easub = 4.05; - if (!model->BSIM4epsrsubGiven) - model->BSIM4epsrsub = 11.7; - if (!model->BSIM4ni0subGiven) - model->BSIM4ni0sub = 1.45e10; /* unit 1/cm3 */ - if (!model->BSIM4bg0subGiven) - model->BSIM4bg0sub = 1.16; /* unit eV */ - if (!model->BSIM4tbgasubGiven) - model->BSIM4tbgasub = 7.02e-4; - if (!model->BSIM4tbgbsubGiven) - model->BSIM4tbgbsub = 1108.0; - if (!model->BSIM4ndepGiven) - model->BSIM4ndep = 1.7e17; /* unit 1/cm3 */ - if (!model->BSIM4nsdGiven) - model->BSIM4nsd = 1.0e20; /* unit 1/cm3 */ - if (!model->BSIM4phinGiven) - model->BSIM4phin = 0.0; /* unit V */ - if (!model->BSIM4ngateGiven) - model->BSIM4ngate = 0; /* unit 1/cm3 */ - if (!model->BSIM4vbmGiven) - model->BSIM4vbm = -3.0; - if (!model->BSIM4xtGiven) - model->BSIM4xt = 1.55e-7; - if (!model->BSIM4kt1Given) - model->BSIM4kt1 = -0.11; /* unit V */ - if (!model->BSIM4kt1lGiven) - model->BSIM4kt1l = 0.0; /* unit V*m */ - if (!model->BSIM4kt2Given) - model->BSIM4kt2 = 0.022; /* No unit */ - if (!model->BSIM4k3Given) - model->BSIM4k3 = 80.0; - if (!model->BSIM4k3bGiven) - model->BSIM4k3b = 0.0; - if (!model->BSIM4w0Given) - model->BSIM4w0 = 2.5e-6; - if (!model->BSIM4lpe0Given) - model->BSIM4lpe0 = 1.74e-7; - if (!model->BSIM4lpebGiven) - model->BSIM4lpeb = 0.0; - if (!model->BSIM4dvtp0Given) - model->BSIM4dvtp0 = 0.0; - if (!model->BSIM4dvtp1Given) - model->BSIM4dvtp1 = 0.0; - if (!model->BSIM4dvtp2Given) /* New DIBL/Rout */ - model->BSIM4dvtp2 = 0.0; - if (!model->BSIM4dvtp3Given) - model->BSIM4dvtp3 = 0.0; - if (!model->BSIM4dvtp4Given) - model->BSIM4dvtp4 = 0.0; - if (!model->BSIM4dvtp5Given) - model->BSIM4dvtp5 = 0.0; - if (!model->BSIM4dvt0Given) - model->BSIM4dvt0 = 2.2; - if (!model->BSIM4dvt1Given) - model->BSIM4dvt1 = 0.53; - if (!model->BSIM4dvt2Given) - model->BSIM4dvt2 = -0.032; /* unit 1 / V */ - - if (!model->BSIM4dvt0wGiven) - model->BSIM4dvt0w = 0.0; - if (!model->BSIM4dvt1wGiven) - model->BSIM4dvt1w = 5.3e6; - if (!model->BSIM4dvt2wGiven) - model->BSIM4dvt2w = -0.032; - - if (!model->BSIM4droutGiven) - model->BSIM4drout = 0.56; - if (!model->BSIM4dsubGiven) - model->BSIM4dsub = model->BSIM4drout; - if (!model->BSIM4vth0Given) - model->BSIM4vth0 = (model->BSIM4type == NMOS) ? 0.7 : -0.7; - if (!model->BSIM4vfbGiven) - model->BSIM4vfb = -1.0; - if (!model->BSIM4euGiven) - model->BSIM4eu = (model->BSIM4type == NMOS) ? 1.67 : 1.0; - if (!model->BSIM4ucsGiven) - model->BSIM4ucs = (model->BSIM4type == NMOS) ? 1.67 : 1.0; - if ((strcmp(model->BSIM4version, "4.8.1")) && (strncmp(model->BSIM4version, "4.81", 4))) - { - if (!model->BSIM4uaGiven) - model->BSIM4ua = ((model->BSIM4mobMod == 2)) ? 1.0e-15 : 1.0e-9; /* unit m/V */ - if (!model->BSIM4ucGiven) - model->BSIM4uc = (model->BSIM4mobMod == 1) ? -0.0465 : -0.0465e-9; - if (!model->BSIM4uc1Given) - model->BSIM4uc1 = (model->BSIM4mobMod == 1) ? -0.056 : -0.056e-9; - } - else - { - if (!model->BSIM4uaGiven) - model->BSIM4ua = ((model->BSIM4mobMod == 2 || model->BSIM4mobMod == 6)) ? 1.0e-15 : 1.0e-9; /* unit m/V */ - /*printf("warning:ua=%g",model->BSIM4ua);*/ - if (!model->BSIM4ucGiven) - model->BSIM4uc = (model->BSIM4mobMod == 1 || model->BSIM4mobMod == 5) ? -0.0465 : -0.0465e-9; - if (!model->BSIM4uc1Given) - model->BSIM4uc1 = (model->BSIM4mobMod == 1 || model->BSIM4mobMod == 5) ? -0.056 : -0.056e-9; - } - if (!model->BSIM4ua1Given) - model->BSIM4ua1 = 1.0e-9; /* unit m/V */ - if (!model->BSIM4ubGiven) - model->BSIM4ub = 1.0e-19; /* unit (m/V)**2 */ - if (!model->BSIM4ub1Given) - model->BSIM4ub1 = -1.0e-18; /* unit (m/V)**2 */ - if (!model->BSIM4udGiven) - model->BSIM4ud = 0.0; /* unit m**(-2) */ - if (!model->BSIM4ud1Given) - model->BSIM4ud1 = 0.0; - if (!model->BSIM4upGiven) - model->BSIM4up = 0.0; - if (!model->BSIM4lpGiven) - model->BSIM4lp = 1.0e-8; - if (!model->BSIM4u0Given) - model->BSIM4u0 = (model->BSIM4type == NMOS) ? 0.067 : 0.025; - if (!model->BSIM4uteGiven) - model->BSIM4ute = -1.5; - if (!model->BSIM4ucsteGiven) - model->BSIM4ucste = -4.775e-3; - if (!model->BSIM4voffGiven) - model->BSIM4voff = -0.08; - if (!model->BSIM4vofflGiven) - model->BSIM4voffl = 0.0; - if (!model->BSIM4voffcvlGiven) - model->BSIM4voffcvl = 0.0; - if (!model->BSIM4minvGiven) - model->BSIM4minv = 0.0; - if (!model->BSIM4minvcvGiven) - model->BSIM4minvcv = 0.0; - if (!model->BSIM4fproutGiven) - model->BSIM4fprout = 0.0; - if (!model->BSIM4pditsGiven) - model->BSIM4pdits = 0.0; - if (!model->BSIM4pditsdGiven) - model->BSIM4pditsd = 0.0; - if (!model->BSIM4pditslGiven) - model->BSIM4pditsl = 0.0; - if (!model->BSIM4deltaGiven) - model->BSIM4delta = 0.01; - if (!model->BSIM4rdswminGiven) - model->BSIM4rdswmin = 0.0; - if (!model->BSIM4rdwminGiven) - model->BSIM4rdwmin = 0.0; - if (!model->BSIM4rswminGiven) - model->BSIM4rswmin = 0.0; - if (!model->BSIM4rdswGiven) - model->BSIM4rdsw = 200.0; /* in ohm*um */ - if (!model->BSIM4rdwGiven) - model->BSIM4rdw = 100.0; - if (!model->BSIM4rswGiven) - model->BSIM4rsw = 100.0; - if (!model->BSIM4prwgGiven) - model->BSIM4prwg = 1.0; /* in 1/V */ - if (!model->BSIM4prwbGiven) - model->BSIM4prwb = 0.0; - if (!model->BSIM4prtGiven) - model->BSIM4prt = 0.0; - if (!model->BSIM4eta0Given) - model->BSIM4eta0 = 0.08; /* no unit */ - if (!model->BSIM4etabGiven) - model->BSIM4etab = -0.07; /* unit 1/V */ - if (!model->BSIM4pclmGiven) - model->BSIM4pclm = 1.3; /* no unit */ - if (!model->BSIM4pdibl1Given) - model->BSIM4pdibl1 = 0.39; /* no unit */ - if (!model->BSIM4pdibl2Given) - model->BSIM4pdibl2 = 0.0086; /* no unit */ - if (!model->BSIM4pdiblbGiven) - model->BSIM4pdiblb = 0.0; /* 1/V */ - if (!model->BSIM4pscbe1Given) - model->BSIM4pscbe1 = 4.24e8; - if (!model->BSIM4pscbe2Given) - model->BSIM4pscbe2 = 1.0e-5; - if (!model->BSIM4pvagGiven) - model->BSIM4pvag = 0.0; - if (!model->BSIM4wrGiven) - model->BSIM4wr = 1.0; - if (!model->BSIM4dwgGiven) - model->BSIM4dwg = 0.0; - if (!model->BSIM4dwbGiven) - model->BSIM4dwb = 0.0; - if (!model->BSIM4b0Given) - model->BSIM4b0 = 0.0; - if (!model->BSIM4b1Given) - model->BSIM4b1 = 0.0; - if (!model->BSIM4alpha0Given) - model->BSIM4alpha0 = 0.0; - if (!model->BSIM4alpha1Given) - model->BSIM4alpha1 = 0.0; - if (!model->BSIM4beta0Given) - model->BSIM4beta0 = 0.0; - if (!model->BSIM4gidlModGiven) - model->BSIM4gidlMod = 0; /* v4.7 New GIDL/GISL */ - if (!model->BSIM4agidlGiven) - model->BSIM4agidl = 0.0; - if (!model->BSIM4bgidlGiven) - model->BSIM4bgidl = 2.3e9; /* V/m */ - if (!model->BSIM4cgidlGiven) - model->BSIM4cgidl = 0.5; /* V^3 */ - if (!model->BSIM4egidlGiven) - model->BSIM4egidl = 0.8; /* V */ - if (!model->BSIM4rgidlGiven) /* v4.7 New GIDL/GISL */ - model->BSIM4rgidl = 1.0; - if (!model->BSIM4kgidlGiven) /* v4.7 New GIDL/GISL */ - model->BSIM4kgidl = 0.0; - if (!model->BSIM4fgidlGiven) /* v4.7 New GIDL/GISL */ - /*model->BSIM4fgidl = 0.0;*/ - /* Default value of fgdil set to 1 in BSIM4.8.0*/ - model->BSIM4fgidl = 1.0; - - /*if (!model->BSIM4agislGiven) - { - if (model->BSIM4agidlGiven) - model->BSIM4agisl = model->BSIM4agidl; - else - model->BSIM4agisl = 0.0; - }*/ - - /*Default value of agidl being 0, agisl set as follows */ - - /*if (!model->BSIM4bgislGiven) - { - if (model->BSIM4bgidlGiven) - model->BSIM4bgisl = model->BSIM4bgidl; - else - model->BSIM4bgisl = 2.3e9; - }*/ - - /*Default value of bgidl being 2.3e9, bgisl set as follows */ - - /*if (!model->BSIM4cgislGiven) - { - if (model->BSIM4cgidlGiven) - model->BSIM4cgisl = model->BSIM4cgidl; - else - model->BSIM4cgisl = 0.5; - }*/ - - /*Default value of cgidl being 0.5, cgisl set as follows */ - - /*if (!model->BSIM4egislGiven) - { - if (model->BSIM4egidlGiven) - model->BSIM4egisl = model->BSIM4egidl; - else - model->BSIM4egisl = 0.8; - }*/ - - /*Default value of agisl, bgisl, cgisl, egisl, rgisl, kgisl, and fgisl are set as follows */ - if (!model->BSIM4agislGiven) - model->BSIM4agisl = model->BSIM4agidl; - if (!model->BSIM4bgislGiven) - model->BSIM4bgisl = model->BSIM4bgidl; - if (!model->BSIM4cgislGiven) - model->BSIM4cgisl = model->BSIM4cgidl; - if (!model->BSIM4egislGiven) - model->BSIM4egisl = model->BSIM4egidl; - if (!model->BSIM4rgislGiven) /* v4.7 New GIDL/GISL */ - model->BSIM4rgisl = model->BSIM4rgidl; - if (!model->BSIM4kgislGiven) /* v4.7 New GIDL/GISL */ - model->BSIM4kgisl = model->BSIM4kgidl; - if (!model->BSIM4fgislGiven) /* v4.7 New GIDL/GISL */ - model->BSIM4fgisl = model->BSIM4fgidl; - if (!model->BSIM4aigcGiven) - model->BSIM4aigc = (model->BSIM4type == NMOS) ? 1.36e-2 : 9.80e-3; - if (!model->BSIM4bigcGiven) - model->BSIM4bigc = (model->BSIM4type == NMOS) ? 1.71e-3 : 7.59e-4; - if (!model->BSIM4cigcGiven) - model->BSIM4cigc = (model->BSIM4type == NMOS) ? 0.075 : 0.03; - if (model->BSIM4aigsdGiven) - { - model->BSIM4aigs = model->BSIM4aigd = model->BSIM4aigsd; - } - else - { - model->BSIM4aigsd = (model->BSIM4type == NMOS) ? 1.36e-2 : 9.80e-3; - if (!model->BSIM4aigsGiven) - model->BSIM4aigs = (model->BSIM4type == NMOS) ? 1.36e-2 : 9.80e-3; - if (!model->BSIM4aigdGiven) - model->BSIM4aigd = (model->BSIM4type == NMOS) ? 1.36e-2 : 9.80e-3; - } - if (model->BSIM4bigsdGiven) - { - model->BSIM4bigs = model->BSIM4bigd = model->BSIM4bigsd; - } - else - { - model->BSIM4bigsd = (model->BSIM4type == NMOS) ? 1.71e-3 : 7.59e-4; - if (!model->BSIM4bigsGiven) - model->BSIM4bigs = (model->BSIM4type == NMOS) ? 1.71e-3 : 7.59e-4; - if (!model->BSIM4bigdGiven) - model->BSIM4bigd = (model->BSIM4type == NMOS) ? 1.71e-3 : 7.59e-4; - } - if (model->BSIM4cigsdGiven) - { - model->BSIM4cigs = model->BSIM4cigd = model->BSIM4cigsd; - } - else - { - model->BSIM4cigsd = (model->BSIM4type == NMOS) ? 0.075 : 0.03; - if (!model->BSIM4cigsGiven) - model->BSIM4cigs = (model->BSIM4type == NMOS) ? 0.075 : 0.03; - if (!model->BSIM4cigdGiven) - model->BSIM4cigd = (model->BSIM4type == NMOS) ? 0.075 : 0.03; - } - if (!model->BSIM4aigbaccGiven) - model->BSIM4aigbacc = 1.36e-2; - if (!model->BSIM4bigbaccGiven) - model->BSIM4bigbacc = 1.71e-3; - if (!model->BSIM4cigbaccGiven) - model->BSIM4cigbacc = 0.075; - if (!model->BSIM4aigbinvGiven) - model->BSIM4aigbinv = 1.11e-2; - if (!model->BSIM4bigbinvGiven) - model->BSIM4bigbinv = 9.49e-4; - if (!model->BSIM4cigbinvGiven) - model->BSIM4cigbinv = 0.006; - if (!model->BSIM4nigcGiven) - model->BSIM4nigc = 1.0; - if (!model->BSIM4nigbinvGiven) - model->BSIM4nigbinv = 3.0; - if (!model->BSIM4nigbaccGiven) - model->BSIM4nigbacc = 1.0; - if (!model->BSIM4ntoxGiven) - model->BSIM4ntox = 1.0; - if (!model->BSIM4eigbinvGiven) - model->BSIM4eigbinv = 1.1; - if (!model->BSIM4pigcdGiven) - model->BSIM4pigcd = 1.0; - if (!model->BSIM4poxedgeGiven) - model->BSIM4poxedge = 1.0; - if (!model->BSIM4xrcrg1Given) - model->BSIM4xrcrg1 = 12.0; - if (!model->BSIM4xrcrg2Given) - model->BSIM4xrcrg2 = 1.0; - if (!model->BSIM4ijthsfwdGiven) - model->BSIM4ijthsfwd = 0.1; /* unit A */ - if (!model->BSIM4ijthdfwdGiven) - model->BSIM4ijthdfwd = model->BSIM4ijthsfwd; - if (!model->BSIM4ijthsrevGiven) - model->BSIM4ijthsrev = 0.1; /* unit A */ - if (!model->BSIM4ijthdrevGiven) - model->BSIM4ijthdrev = model->BSIM4ijthsrev; - if (!model->BSIM4tnoiaGiven) - model->BSIM4tnoia = 1.5; - if (!model->BSIM4tnoibGiven) - model->BSIM4tnoib = 3.5; - if (!model->BSIM4tnoicGiven) - model->BSIM4tnoic = 0.0; - if (!model->BSIM4rnoiaGiven) - model->BSIM4rnoia = 0.577; - if (!model->BSIM4rnoibGiven) - model->BSIM4rnoib = 0.5164; - if (!model->BSIM4rnoicGiven) - model->BSIM4rnoic = 0.395; - if (!model->BSIM4ntnoiGiven) - model->BSIM4ntnoi = 1.0; - if (!model->BSIM4lambdaGiven) - model->BSIM4lambda = 0.0; - if (!model->BSIM4vtlGiven) - model->BSIM4vtl = 2.0e5; /* unit m/s */ - if (!model->BSIM4xnGiven) - model->BSIM4xn = 3.0; - if (!model->BSIM4lcGiven) - model->BSIM4lc = 5.0e-9; - if (!model->BSIM4vfbsdoffGiven) - model->BSIM4vfbsdoff = 0.0; /* unit v */ - if (!model->BSIM4tvfbsdoffGiven) - model->BSIM4tvfbsdoff = 0.0; - if (!model->BSIM4tvoffGiven) - model->BSIM4tvoff = 0.0; - if (!model->BSIM4tnfactorGiven) /* v4.7 temp dep of leakage current */ - model->BSIM4tnfactor = 0.0; - if (!model->BSIM4teta0Given) /* v4.7 temp dep of leakage current */ - model->BSIM4teta0 = 0.0; - if (!model->BSIM4tvoffcvGiven) /* v4.7 temp dep of leakage current */ - model->BSIM4tvoffcv = 0.0; - - if (!model->BSIM4lintnoiGiven) - model->BSIM4lintnoi = 0.0; /* unit m */ - - if (!model->BSIM4xjbvsGiven) - model->BSIM4xjbvs = 1.0; /* no unit */ - if (!model->BSIM4xjbvdGiven) - model->BSIM4xjbvd = model->BSIM4xjbvs; - if (!model->BSIM4bvsGiven) - model->BSIM4bvs = 10.0; /* V */ - if (!model->BSIM4bvdGiven) - model->BSIM4bvd = model->BSIM4bvs; - - if (!model->BSIM4gbminGiven) - model->BSIM4gbmin = 1.0e-12; /* in mho */ - if (!model->BSIM4rbdbGiven) - model->BSIM4rbdb = 50.0; /* in ohm */ - if (!model->BSIM4rbpbGiven) - model->BSIM4rbpb = 50.0; - if (!model->BSIM4rbsbGiven) - model->BSIM4rbsb = 50.0; - if (!model->BSIM4rbpsGiven) - model->BSIM4rbps = 50.0; - if (!model->BSIM4rbpdGiven) - model->BSIM4rbpd = 50.0; - - if (!model->BSIM4rbps0Given) - model->BSIM4rbps0 = 50.0; - if (!model->BSIM4rbpslGiven) - model->BSIM4rbpsl = 0.0; - if (!model->BSIM4rbpswGiven) - model->BSIM4rbpsw = 0.0; - if (!model->BSIM4rbpsnfGiven) - model->BSIM4rbpsnf = 0.0; - - if (!model->BSIM4rbpd0Given) - model->BSIM4rbpd0 = 50.0; - if (!model->BSIM4rbpdlGiven) - model->BSIM4rbpdl = 0.0; - if (!model->BSIM4rbpdwGiven) - model->BSIM4rbpdw = 0.0; - if (!model->BSIM4rbpdnfGiven) - model->BSIM4rbpdnf = 0.0; - - if (!model->BSIM4rbpbx0Given) - model->BSIM4rbpbx0 = 100.0; - if (!model->BSIM4rbpbxlGiven) - model->BSIM4rbpbxl = 0.0; - if (!model->BSIM4rbpbxwGiven) - model->BSIM4rbpbxw = 0.0; - if (!model->BSIM4rbpbxnfGiven) - model->BSIM4rbpbxnf = 0.0; - if (!model->BSIM4rbpby0Given) - model->BSIM4rbpby0 = 100.0; - if (!model->BSIM4rbpbylGiven) - model->BSIM4rbpbyl = 0.0; - if (!model->BSIM4rbpbywGiven) - model->BSIM4rbpbyw = 0.0; - if (!model->BSIM4rbpbynfGiven) - model->BSIM4rbpbynf = 0.0; - - - if (!model->BSIM4rbsbx0Given) - model->BSIM4rbsbx0 = 100.0; - if (!model->BSIM4rbsby0Given) - model->BSIM4rbsby0 = 100.0; - if (!model->BSIM4rbdbx0Given) - model->BSIM4rbdbx0 = 100.0; - if (!model->BSIM4rbdby0Given) - model->BSIM4rbdby0 = 100.0; - - - if (!model->BSIM4rbsdbxlGiven) - model->BSIM4rbsdbxl = 0.0; - if (!model->BSIM4rbsdbxwGiven) - model->BSIM4rbsdbxw = 0.0; - if (!model->BSIM4rbsdbxnfGiven) - model->BSIM4rbsdbxnf = 0.0; - if (!model->BSIM4rbsdbylGiven) - model->BSIM4rbsdbyl = 0.0; - if (!model->BSIM4rbsdbywGiven) - model->BSIM4rbsdbyw = 0.0; - if (!model->BSIM4rbsdbynfGiven) - model->BSIM4rbsdbynf = 0.0; - - if (!model->BSIM4cgslGiven) - model->BSIM4cgsl = 0.0; - if (!model->BSIM4cgdlGiven) - model->BSIM4cgdl = 0.0; - if (!model->BSIM4ckappasGiven) - model->BSIM4ckappas = 0.6; - if (!model->BSIM4ckappadGiven) - model->BSIM4ckappad = model->BSIM4ckappas; - if (!model->BSIM4clcGiven) - model->BSIM4clc = 0.1e-6; - if (!model->BSIM4cleGiven) - model->BSIM4cle = 0.6; - if (!model->BSIM4vfbcvGiven) - model->BSIM4vfbcv = -1.0; - if (!model->BSIM4acdeGiven) - model->BSIM4acde = 1.0; - if (!model->BSIM4moinGiven) - model->BSIM4moin = 15.0; - if (!model->BSIM4noffGiven) - model->BSIM4noff = 1.0; - if (!model->BSIM4voffcvGiven) - model->BSIM4voffcv = 0.0; - if (!model->BSIM4dmcgGiven) - model->BSIM4dmcg = 0.0; - if (!model->BSIM4dmciGiven) - model->BSIM4dmci = model->BSIM4dmcg; - if (!model->BSIM4dmdgGiven) - model->BSIM4dmdg = 0.0; - if (!model->BSIM4dmcgtGiven) - model->BSIM4dmcgt = 0.0; - if (!model->BSIM4xgwGiven) - model->BSIM4xgw = 0.0; - if (!model->BSIM4xglGiven) - model->BSIM4xgl = 0.0; - if (!model->BSIM4rshgGiven) - model->BSIM4rshg = 0.1; - if (!model->BSIM4ngconGiven) - model->BSIM4ngcon = 1.0; - if (!model->BSIM4tcjGiven) - model->BSIM4tcj = 0.0; - if (!model->BSIM4tpbGiven) - model->BSIM4tpb = 0.0; - if (!model->BSIM4tcjswGiven) - model->BSIM4tcjsw = 0.0; - if (!model->BSIM4tpbswGiven) - model->BSIM4tpbsw = 0.0; - if (!model->BSIM4tcjswgGiven) - model->BSIM4tcjswg = 0.0; - if (!model->BSIM4tpbswgGiven) - model->BSIM4tpbswg = 0.0; - - /* Length dependence */ - if (!model->BSIM4lcdscGiven) - model->BSIM4lcdsc = 0.0; - if (!model->BSIM4lcdscbGiven) - model->BSIM4lcdscb = 0.0; - if (!model->BSIM4lcdscdGiven) - model->BSIM4lcdscd = 0.0; - if (!model->BSIM4lcitGiven) - model->BSIM4lcit = 0.0; - if (!model->BSIM4lnfactorGiven) - model->BSIM4lnfactor = 0.0; - if (!model->BSIM4lxjGiven) - model->BSIM4lxj = 0.0; - if (!model->BSIM4lvsatGiven) - model->BSIM4lvsat = 0.0; - if (!model->BSIM4latGiven) - model->BSIM4lat = 0.0; - if (!model->BSIM4la0Given) - model->BSIM4la0 = 0.0; - if (!model->BSIM4lagsGiven) - model->BSIM4lags = 0.0; - if (!model->BSIM4la1Given) - model->BSIM4la1 = 0.0; - if (!model->BSIM4la2Given) - model->BSIM4la2 = 0.0; - if (!model->BSIM4lketaGiven) - model->BSIM4lketa = 0.0; - if (!model->BSIM4lnsubGiven) - model->BSIM4lnsub = 0.0; - if (!model->BSIM4lndepGiven) - model->BSIM4lndep = 0.0; - if (!model->BSIM4lnsdGiven) - model->BSIM4lnsd = 0.0; - if (!model->BSIM4lphinGiven) - model->BSIM4lphin = 0.0; - if (!model->BSIM4lngateGiven) - model->BSIM4lngate = 0.0; - if (!model->BSIM4lvbmGiven) - model->BSIM4lvbm = 0.0; - if (!model->BSIM4lxtGiven) - model->BSIM4lxt = 0.0; - if (!model->BSIM4lk1Given) - model->BSIM4lk1 = 0.0; - if (!model->BSIM4lkt1Given) - model->BSIM4lkt1 = 0.0; - if (!model->BSIM4lkt1lGiven) - model->BSIM4lkt1l = 0.0; - if (!model->BSIM4lkt2Given) - model->BSIM4lkt2 = 0.0; - if (!model->BSIM4lk2Given) - model->BSIM4lk2 = 0.0; - if (!model->BSIM4lk3Given) - model->BSIM4lk3 = 0.0; - if (!model->BSIM4lk3bGiven) - model->BSIM4lk3b = 0.0; - if (!model->BSIM4lw0Given) - model->BSIM4lw0 = 0.0; - if (!model->BSIM4llpe0Given) - model->BSIM4llpe0 = 0.0; - if (!model->BSIM4llpebGiven) - model->BSIM4llpeb = 0.0; - if (!model->BSIM4ldvtp0Given) - model->BSIM4ldvtp0 = 0.0; - if (!model->BSIM4ldvtp1Given) - model->BSIM4ldvtp1 = 0.0; - if (!model->BSIM4ldvtp2Given) /* New DIBL/Rout */ - model->BSIM4ldvtp2 = 0.0; - if (!model->BSIM4ldvtp3Given) - model->BSIM4ldvtp3 = 0.0; - if (!model->BSIM4ldvtp4Given) - model->BSIM4ldvtp4 = 0.0; - if (!model->BSIM4ldvtp5Given) - model->BSIM4ldvtp5 = 0.0; - if (!model->BSIM4ldvt0Given) - model->BSIM4ldvt0 = 0.0; - if (!model->BSIM4ldvt1Given) - model->BSIM4ldvt1 = 0.0; - if (!model->BSIM4ldvt2Given) - model->BSIM4ldvt2 = 0.0; - if (!model->BSIM4ldvt0wGiven) - model->BSIM4ldvt0w = 0.0; - if (!model->BSIM4ldvt1wGiven) - model->BSIM4ldvt1w = 0.0; - if (!model->BSIM4ldvt2wGiven) - model->BSIM4ldvt2w = 0.0; - if (!model->BSIM4ldroutGiven) - model->BSIM4ldrout = 0.0; - if (!model->BSIM4ldsubGiven) - model->BSIM4ldsub = 0.0; - if (!model->BSIM4lvth0Given) - model->BSIM4lvth0 = 0.0; - if (!model->BSIM4luaGiven) - model->BSIM4lua = 0.0; - if (!model->BSIM4lua1Given) - model->BSIM4lua1 = 0.0; - if (!model->BSIM4lubGiven) - model->BSIM4lub = 0.0; - if (!model->BSIM4lub1Given) - model->BSIM4lub1 = 0.0; - if (!model->BSIM4lucGiven) - model->BSIM4luc = 0.0; - if (!model->BSIM4luc1Given) - model->BSIM4luc1 = 0.0; - if (!model->BSIM4ludGiven) - model->BSIM4lud = 0.0; - if (!model->BSIM4lud1Given) - model->BSIM4lud1 = 0.0; - if (!model->BSIM4lupGiven) - model->BSIM4lup = 0.0; - if (!model->BSIM4llpGiven) - model->BSIM4llp = 0.0; - if (!model->BSIM4lu0Given) - model->BSIM4lu0 = 0.0; - if (!model->BSIM4luteGiven) - model->BSIM4lute = 0.0; - if (!model->BSIM4lucsteGiven) - model->BSIM4lucste = 0.0; - if (!model->BSIM4lvoffGiven) - model->BSIM4lvoff = 0.0; - if (!model->BSIM4lminvGiven) - model->BSIM4lminv = 0.0; - if (!model->BSIM4lminvcvGiven) - model->BSIM4lminvcv = 0.0; - if (!model->BSIM4lfproutGiven) - model->BSIM4lfprout = 0.0; - if (!model->BSIM4lpditsGiven) - model->BSIM4lpdits = 0.0; - if (!model->BSIM4lpditsdGiven) - model->BSIM4lpditsd = 0.0; - if (!model->BSIM4ldeltaGiven) - model->BSIM4ldelta = 0.0; - if (!model->BSIM4lrdswGiven) - model->BSIM4lrdsw = 0.0; - if (!model->BSIM4lrdwGiven) - model->BSIM4lrdw = 0.0; - if (!model->BSIM4lrswGiven) - model->BSIM4lrsw = 0.0; - if (!model->BSIM4lprwbGiven) - model->BSIM4lprwb = 0.0; - if (!model->BSIM4lprwgGiven) - model->BSIM4lprwg = 0.0; - if (!model->BSIM4lprtGiven) - model->BSIM4lprt = 0.0; - if (!model->BSIM4leta0Given) - model->BSIM4leta0 = 0.0; - if (!model->BSIM4letabGiven) - model->BSIM4letab = -0.0; - if (!model->BSIM4lpclmGiven) - model->BSIM4lpclm = 0.0; - if (!model->BSIM4lpdibl1Given) - model->BSIM4lpdibl1 = 0.0; - if (!model->BSIM4lpdibl2Given) - model->BSIM4lpdibl2 = 0.0; - if (!model->BSIM4lpdiblbGiven) - model->BSIM4lpdiblb = 0.0; - if (!model->BSIM4lpscbe1Given) - model->BSIM4lpscbe1 = 0.0; - if (!model->BSIM4lpscbe2Given) - model->BSIM4lpscbe2 = 0.0; - if (!model->BSIM4lpvagGiven) - model->BSIM4lpvag = 0.0; - if (!model->BSIM4lwrGiven) - model->BSIM4lwr = 0.0; - if (!model->BSIM4ldwgGiven) - model->BSIM4ldwg = 0.0; - if (!model->BSIM4ldwbGiven) - model->BSIM4ldwb = 0.0; - if (!model->BSIM4lb0Given) - model->BSIM4lb0 = 0.0; - if (!model->BSIM4lb1Given) - model->BSIM4lb1 = 0.0; - if (!model->BSIM4lalpha0Given) - model->BSIM4lalpha0 = 0.0; - if (!model->BSIM4lalpha1Given) - model->BSIM4lalpha1 = 0.0; - if (!model->BSIM4lbeta0Given) - model->BSIM4lbeta0 = 0.0; - if (!model->BSIM4lagidlGiven) - model->BSIM4lagidl = 0.0; - if (!model->BSIM4lbgidlGiven) - model->BSIM4lbgidl = 0.0; - if (!model->BSIM4lcgidlGiven) - model->BSIM4lcgidl = 0.0; - if (!model->BSIM4legidlGiven) - model->BSIM4legidl = 0.0; - if (!model->BSIM4lrgidlGiven) /* v4.7 New GIDL/GISL */ - model->BSIM4lrgidl = 0.0; - if (!model->BSIM4lkgidlGiven) /* v4.7 New GIDL/GISL */ - model->BSIM4lkgidl = 0.0; - if (!model->BSIM4lfgidlGiven) /* v4.7 New GIDL/GISL */ - model->BSIM4lfgidl = 0.0; - /*if (!model->BSIM4lagislGiven) - { - if (model->BSIM4lagidlGiven) - model->BSIM4lagisl = model->BSIM4lagidl; - else - model->BSIM4lagisl = 0.0; - } - if (!model->BSIM4lbgislGiven) - { - if (model->BSIM4lbgidlGiven) - model->BSIM4lbgisl = model->BSIM4lbgidl; - else - model->BSIM4lbgisl = 0.0; - } - if (!model->BSIM4lcgislGiven) - { - if (model->BSIM4lcgidlGiven) - model->BSIM4lcgisl = model->BSIM4lcgidl; - else - model->BSIM4lcgisl = 0.0; - } - if (!model->BSIM4legislGiven) - { - if (model->BSIM4legidlGiven) - model->BSIM4legisl = model->BSIM4legidl; - else - model->BSIM4legisl = 0.0; - }*/ - /*if (!model->BSIM4lrgislGiven) - { - if (model->BSIM4lrgidlGiven) - model->BSIM4lrgisl = model->BSIM4lrgidl; - } - if (!model->BSIM4lkgislGiven) - { - if (model->BSIM4lkgidlGiven) - model->BSIM4lkgisl = model->BSIM4lkgidl; - } - if (!model->BSIM4lfgislGiven) - { - if (model->BSIM4lfgidlGiven) - model->BSIM4lfgisl = model->BSIM4lfgidl; - }*/ - - /*Default value of lagisl, lbgisl, lcgisl, legisl, lrgisl, lkgisl, and lfgisl are set as follows */ - if (!model->BSIM4lagislGiven) - model->BSIM4lagisl = model->BSIM4lagidl; - if (!model->BSIM4lbgislGiven) - model->BSIM4lbgisl = model->BSIM4lbgidl; - if (!model->BSIM4lcgislGiven) - model->BSIM4lcgisl = model->BSIM4lcgidl; - if (!model->BSIM4legislGiven) - model->BSIM4legisl = model->BSIM4legidl; - if (!model->BSIM4lrgislGiven) /* v4.7 New GIDL/GISL */ - model->BSIM4lrgisl = model->BSIM4lrgidl; - if (!model->BSIM4lkgislGiven) /* v4.7 New GIDL/GISL */ - model->BSIM4lkgisl = model->BSIM4lkgidl; - if (!model->BSIM4lfgislGiven) /* v4.7 New GIDL/GISL */ - model->BSIM4lfgisl = model->BSIM4lfgidl; - - if (!model->BSIM4laigcGiven) - model->BSIM4laigc = 0.0; - if (!model->BSIM4lbigcGiven) - model->BSIM4lbigc = 0.0; - if (!model->BSIM4lcigcGiven) - model->BSIM4lcigc = 0.0; - if (!model->BSIM4aigsdGiven && (model->BSIM4aigsGiven || model->BSIM4aigdGiven)) - { - if (!model->BSIM4laigsGiven) - model->BSIM4laigs = 0.0; - if (!model->BSIM4laigdGiven) - model->BSIM4laigd = 0.0; - } - else - { - if (!model->BSIM4laigsdGiven) - model->BSIM4laigsd = 0.0; - model->BSIM4laigs = model->BSIM4laigd = model->BSIM4laigsd; - } - if (!model->BSIM4bigsdGiven && (model->BSIM4bigsGiven || model->BSIM4bigdGiven)) - { - if (!model->BSIM4lbigsGiven) - model->BSIM4lbigs = 0.0; - if (!model->BSIM4lbigdGiven) - model->BSIM4lbigd = 0.0; - } - else - { - if (!model->BSIM4lbigsdGiven) - model->BSIM4lbigsd = 0.0; - model->BSIM4lbigs = model->BSIM4lbigd = model->BSIM4lbigsd; - } - if (!model->BSIM4cigsdGiven && (model->BSIM4cigsGiven || model->BSIM4cigdGiven)) - { - if (!model->BSIM4lcigsGiven) - model->BSIM4lcigs = 0.0; - if (!model->BSIM4lcigdGiven) - model->BSIM4lcigd = 0.0; - } - else - { - if (!model->BSIM4lcigsdGiven) - model->BSIM4lcigsd = 0.0; - model->BSIM4lcigs = model->BSIM4lcigd = model->BSIM4lcigsd; - } - if (!model->BSIM4laigbaccGiven) - model->BSIM4laigbacc = 0.0; - if (!model->BSIM4lbigbaccGiven) - model->BSIM4lbigbacc = 0.0; - if (!model->BSIM4lcigbaccGiven) - model->BSIM4lcigbacc = 0.0; - if (!model->BSIM4laigbinvGiven) - model->BSIM4laigbinv = 0.0; - if (!model->BSIM4lbigbinvGiven) - model->BSIM4lbigbinv = 0.0; - if (!model->BSIM4lcigbinvGiven) - model->BSIM4lcigbinv = 0.0; - if (!model->BSIM4lnigcGiven) - model->BSIM4lnigc = 0.0; - if (!model->BSIM4lnigbinvGiven) - model->BSIM4lnigbinv = 0.0; - if (!model->BSIM4lnigbaccGiven) - model->BSIM4lnigbacc = 0.0; - if (!model->BSIM4lntoxGiven) - model->BSIM4lntox = 0.0; - if (!model->BSIM4leigbinvGiven) - model->BSIM4leigbinv = 0.0; - if (!model->BSIM4lpigcdGiven) - model->BSIM4lpigcd = 0.0; - if (!model->BSIM4lpoxedgeGiven) - model->BSIM4lpoxedge = 0.0; - if (!model->BSIM4lxrcrg1Given) - model->BSIM4lxrcrg1 = 0.0; - if (!model->BSIM4lxrcrg2Given) - model->BSIM4lxrcrg2 = 0.0; - if (!model->BSIM4leuGiven) - model->BSIM4leu = 0.0; - if (!model->BSIM4lucsGiven) - model->BSIM4lucs = 0.0; - if (!model->BSIM4lvfbGiven) - model->BSIM4lvfb = 0.0; - if (!model->BSIM4llambdaGiven) - model->BSIM4llambda = 0.0; - if (!model->BSIM4lvtlGiven) - model->BSIM4lvtl = 0.0; - if (!model->BSIM4lxnGiven) - model->BSIM4lxn = 0.0; - if (!model->BSIM4lvfbsdoffGiven) - model->BSIM4lvfbsdoff = 0.0; - if (!model->BSIM4ltvfbsdoffGiven) - model->BSIM4ltvfbsdoff = 0.0; - if (!model->BSIM4ltvoffGiven) - model->BSIM4ltvoff = 0.0; - if (!model->BSIM4ltnfactorGiven) /* v4.7 temp dep of leakage current */ - model->BSIM4ltnfactor = 0.0; - if (!model->BSIM4lteta0Given) /* v4.7 temp dep of leakage current */ - model->BSIM4lteta0 = 0.0; - if (!model->BSIM4ltvoffcvGiven) /* v4.7 temp dep of leakage current */ - model->BSIM4ltvoffcv = 0.0; - - - if (!model->BSIM4lcgslGiven) - model->BSIM4lcgsl = 0.0; - if (!model->BSIM4lcgdlGiven) - model->BSIM4lcgdl = 0.0; - if (!model->BSIM4lckappasGiven) - model->BSIM4lckappas = 0.0; - if (!model->BSIM4lckappadGiven) - model->BSIM4lckappad = 0.0; - if (!model->BSIM4lclcGiven) - model->BSIM4lclc = 0.0; - if (!model->BSIM4lcleGiven) - model->BSIM4lcle = 0.0; - if (!model->BSIM4lcfGiven) - model->BSIM4lcf = 0.0; - if (!model->BSIM4lvfbcvGiven) - model->BSIM4lvfbcv = 0.0; - if (!model->BSIM4lacdeGiven) - model->BSIM4lacde = 0.0; - if (!model->BSIM4lmoinGiven) - model->BSIM4lmoin = 0.0; - if (!model->BSIM4lnoffGiven) - model->BSIM4lnoff = 0.0; - if (!model->BSIM4lvoffcvGiven) - model->BSIM4lvoffcv = 0.0; - - /* Width dependence */ - if (!model->BSIM4wcdscGiven) - model->BSIM4wcdsc = 0.0; - if (!model->BSIM4wcdscbGiven) - model->BSIM4wcdscb = 0.0; - if (!model->BSIM4wcdscdGiven) - model->BSIM4wcdscd = 0.0; - if (!model->BSIM4wcitGiven) - model->BSIM4wcit = 0.0; - if (!model->BSIM4wnfactorGiven) - model->BSIM4wnfactor = 0.0; - if (!model->BSIM4wxjGiven) - model->BSIM4wxj = 0.0; - if (!model->BSIM4wvsatGiven) - model->BSIM4wvsat = 0.0; - if (!model->BSIM4watGiven) - model->BSIM4wat = 0.0; - if (!model->BSIM4wa0Given) - model->BSIM4wa0 = 0.0; - if (!model->BSIM4wagsGiven) - model->BSIM4wags = 0.0; - if (!model->BSIM4wa1Given) - model->BSIM4wa1 = 0.0; - if (!model->BSIM4wa2Given) - model->BSIM4wa2 = 0.0; - if (!model->BSIM4wketaGiven) - model->BSIM4wketa = 0.0; - if (!model->BSIM4wnsubGiven) - model->BSIM4wnsub = 0.0; - if (!model->BSIM4wndepGiven) - model->BSIM4wndep = 0.0; - if (!model->BSIM4wnsdGiven) - model->BSIM4wnsd = 0.0; - if (!model->BSIM4wphinGiven) - model->BSIM4wphin = 0.0; - if (!model->BSIM4wngateGiven) - model->BSIM4wngate = 0.0; - if (!model->BSIM4wvbmGiven) - model->BSIM4wvbm = 0.0; - if (!model->BSIM4wxtGiven) - model->BSIM4wxt = 0.0; - if (!model->BSIM4wk1Given) - model->BSIM4wk1 = 0.0; - if (!model->BSIM4wkt1Given) - model->BSIM4wkt1 = 0.0; - if (!model->BSIM4wkt1lGiven) - model->BSIM4wkt1l = 0.0; - if (!model->BSIM4wkt2Given) - model->BSIM4wkt2 = 0.0; - if (!model->BSIM4wk2Given) - model->BSIM4wk2 = 0.0; - if (!model->BSIM4wk3Given) - model->BSIM4wk3 = 0.0; - if (!model->BSIM4wk3bGiven) - model->BSIM4wk3b = 0.0; - if (!model->BSIM4ww0Given) - model->BSIM4ww0 = 0.0; - if (!model->BSIM4wlpe0Given) - model->BSIM4wlpe0 = 0.0; - if (!model->BSIM4wlpebGiven) - model->BSIM4wlpeb = 0.0; - if (!model->BSIM4wdvtp0Given) - model->BSIM4wdvtp0 = 0.0; - if (!model->BSIM4wdvtp1Given) - model->BSIM4wdvtp1 = 0.0; - if (!model->BSIM4wdvtp2Given) /* New DIBL/Rout */ - model->BSIM4wdvtp2 = 0.0; - if (!model->BSIM4wdvtp3Given) - model->BSIM4wdvtp3 = 0.0; - if (!model->BSIM4wdvtp4Given) - model->BSIM4wdvtp4 = 0.0; - if (!model->BSIM4wdvtp5Given) - model->BSIM4wdvtp5 = 0.0; - if (!model->BSIM4wdvt0Given) - model->BSIM4wdvt0 = 0.0; - if (!model->BSIM4wdvt1Given) - model->BSIM4wdvt1 = 0.0; - if (!model->BSIM4wdvt2Given) - model->BSIM4wdvt2 = 0.0; - if (!model->BSIM4wdvt0wGiven) - model->BSIM4wdvt0w = 0.0; - if (!model->BSIM4wdvt1wGiven) - model->BSIM4wdvt1w = 0.0; - if (!model->BSIM4wdvt2wGiven) - model->BSIM4wdvt2w = 0.0; - if (!model->BSIM4wdroutGiven) - model->BSIM4wdrout = 0.0; - if (!model->BSIM4wdsubGiven) - model->BSIM4wdsub = 0.0; - if (!model->BSIM4wvth0Given) - model->BSIM4wvth0 = 0.0; - if (!model->BSIM4wuaGiven) - model->BSIM4wua = 0.0; - if (!model->BSIM4wua1Given) - model->BSIM4wua1 = 0.0; - if (!model->BSIM4wubGiven) - model->BSIM4wub = 0.0; - if (!model->BSIM4wub1Given) - model->BSIM4wub1 = 0.0; - if (!model->BSIM4wucGiven) - model->BSIM4wuc = 0.0; - if (!model->BSIM4wuc1Given) - model->BSIM4wuc1 = 0.0; - if (!model->BSIM4wudGiven) - model->BSIM4wud = 0.0; - if (!model->BSIM4wud1Given) - model->BSIM4wud1 = 0.0; - if (!model->BSIM4wupGiven) - model->BSIM4wup = 0.0; - if (!model->BSIM4wlpGiven) - model->BSIM4wlp = 0.0; - if (!model->BSIM4wu0Given) - model->BSIM4wu0 = 0.0; - if (!model->BSIM4wuteGiven) - model->BSIM4wute = 0.0; - if (!model->BSIM4wucsteGiven) - model->BSIM4wucste = 0.0; - if (!model->BSIM4wvoffGiven) - model->BSIM4wvoff = 0.0; - if (!model->BSIM4wminvGiven) - model->BSIM4wminv = 0.0; - if (!model->BSIM4wminvcvGiven) - model->BSIM4wminvcv = 0.0; - if (!model->BSIM4wfproutGiven) - model->BSIM4wfprout = 0.0; - if (!model->BSIM4wpditsGiven) - model->BSIM4wpdits = 0.0; - if (!model->BSIM4wpditsdGiven) - model->BSIM4wpditsd = 0.0; - if (!model->BSIM4wdeltaGiven) - model->BSIM4wdelta = 0.0; - if (!model->BSIM4wrdswGiven) - model->BSIM4wrdsw = 0.0; - if (!model->BSIM4wrdwGiven) - model->BSIM4wrdw = 0.0; - if (!model->BSIM4wrswGiven) - model->BSIM4wrsw = 0.0; - if (!model->BSIM4wprwbGiven) - model->BSIM4wprwb = 0.0; - if (!model->BSIM4wprwgGiven) - model->BSIM4wprwg = 0.0; - if (!model->BSIM4wprtGiven) - model->BSIM4wprt = 0.0; - if (!model->BSIM4weta0Given) - model->BSIM4weta0 = 0.0; - if (!model->BSIM4wetabGiven) - model->BSIM4wetab = 0.0; - if (!model->BSIM4wpclmGiven) - model->BSIM4wpclm = 0.0; - if (!model->BSIM4wpdibl1Given) - model->BSIM4wpdibl1 = 0.0; - if (!model->BSIM4wpdibl2Given) - model->BSIM4wpdibl2 = 0.0; - if (!model->BSIM4wpdiblbGiven) - model->BSIM4wpdiblb = 0.0; - if (!model->BSIM4wpscbe1Given) - model->BSIM4wpscbe1 = 0.0; - if (!model->BSIM4wpscbe2Given) - model->BSIM4wpscbe2 = 0.0; - if (!model->BSIM4wpvagGiven) - model->BSIM4wpvag = 0.0; - if (!model->BSIM4wwrGiven) - model->BSIM4wwr = 0.0; - if (!model->BSIM4wdwgGiven) - model->BSIM4wdwg = 0.0; - if (!model->BSIM4wdwbGiven) - model->BSIM4wdwb = 0.0; - if (!model->BSIM4wb0Given) - model->BSIM4wb0 = 0.0; - if (!model->BSIM4wb1Given) - model->BSIM4wb1 = 0.0; - if (!model->BSIM4walpha0Given) - model->BSIM4walpha0 = 0.0; - if (!model->BSIM4walpha1Given) - model->BSIM4walpha1 = 0.0; - if (!model->BSIM4wbeta0Given) - model->BSIM4wbeta0 = 0.0; - if (!model->BSIM4wagidlGiven) - model->BSIM4wagidl = 0.0; - if (!model->BSIM4wbgidlGiven) - model->BSIM4wbgidl = 0.0; - if (!model->BSIM4wcgidlGiven) - model->BSIM4wcgidl = 0.0; - if (!model->BSIM4wegidlGiven) - model->BSIM4wegidl = 0.0; - if (!model->BSIM4wrgidlGiven) /* v4.7 New GIDL/GISL */ - model->BSIM4wrgidl = 0.0; - if (!model->BSIM4wkgidlGiven) /* v4.7 New GIDL/GISL */ - model->BSIM4wkgidl = 0.0; - if (!model->BSIM4wfgidlGiven) /* v4.7 New GIDL/GISL */ - model->BSIM4wfgidl = 0.0; - - /*if (!model->BSIM4wagislGiven) - { - if (model->BSIM4wagidlGiven) - model->BSIM4wagisl = model->BSIM4wagidl; - else - model->BSIM4wagisl = 0.0; - } - if (!model->BSIM4wbgislGiven) - { - if (model->BSIM4wbgidlGiven) - model->BSIM4wbgisl = model->BSIM4wbgidl; - else - model->BSIM4wbgisl = 0.0; - } - if (!model->BSIM4wcgislGiven) - { - if (model->BSIM4wcgidlGiven) - model->BSIM4wcgisl = model->BSIM4wcgidl; - else - model->BSIM4wcgisl = 0.0; - } - if (!model->BSIM4wegislGiven) - { - if (model->BSIM4wegidlGiven) - model->BSIM4wegisl = model->BSIM4wegidl; - else - model->BSIM4wegisl = 0.0; - }*/ - /*if (!model->BSIM4wrgislGiven) - { - if (model->BSIM4wrgidlGiven) - model->BSIM4wrgisl = model->BSIM4wrgidl; - } - if (!model->BSIM4wkgislGiven) - { - if (model->BSIM4wkgidlGiven) - model->BSIM4wkgisl = model->BSIM4wkgidl; - } - if (!model->BSIM4wfgislGiven) - { - if (model->BSIM4wfgidlGiven) - model->BSIM4wfgisl = model->BSIM4wfgidl; - }*/ - - /*Default value of wagisl, wbgisl, wcgisl, wegisl, wrgisl, wkgisl, and wfgisl are set as follows */ - if (!model->BSIM4wagislGiven) - model->BSIM4wagisl = model->BSIM4wagidl; - if (!model->BSIM4wbgislGiven) - model->BSIM4wbgisl = model->BSIM4wbgidl; - if (!model->BSIM4wcgislGiven) - model->BSIM4wcgisl = model->BSIM4wcgidl; - if (!model->BSIM4wegislGiven) - model->BSIM4wegisl = model->BSIM4wegidl; - if (!model->BSIM4wrgislGiven) /* v4.7 New GIDL/GISL */ - model->BSIM4wrgisl = model->BSIM4wrgidl; - if (!model->BSIM4wkgislGiven) /* v4.7 New GIDL/GISL */ - model->BSIM4wkgisl = model->BSIM4wkgidl; - if (!model->BSIM4wfgislGiven) /* v4.7 New GIDL/GISL */ - model->BSIM4wfgisl = model->BSIM4wfgidl; - - if (!model->BSIM4waigcGiven) - model->BSIM4waigc = 0.0; - if (!model->BSIM4wbigcGiven) - model->BSIM4wbigc = 0.0; - if (!model->BSIM4wcigcGiven) - model->BSIM4wcigc = 0.0; - if (!model->BSIM4aigsdGiven && (model->BSIM4aigsGiven || model->BSIM4aigdGiven)) - { - if (!model->BSIM4waigsGiven) - model->BSIM4waigs = 0.0; - if (!model->BSIM4waigdGiven) - model->BSIM4waigd = 0.0; - } - else - { - if (!model->BSIM4waigsdGiven) - model->BSIM4waigsd = 0.0; - model->BSIM4waigs = model->BSIM4waigd = model->BSIM4waigsd; - } - if (!model->BSIM4bigsdGiven && (model->BSIM4bigsGiven || model->BSIM4bigdGiven)) - { - if (!model->BSIM4wbigsGiven) - model->BSIM4wbigs = 0.0; - if (!model->BSIM4wbigdGiven) - model->BSIM4wbigd = 0.0; - } - else - { - if (!model->BSIM4wbigsdGiven) - model->BSIM4wbigsd = 0.0; - model->BSIM4wbigs = model->BSIM4wbigd = model->BSIM4wbigsd; - } - if (!model->BSIM4cigsdGiven && (model->BSIM4cigsGiven || model->BSIM4cigdGiven)) - { - if (!model->BSIM4wcigsGiven) - model->BSIM4wcigs = 0.0; - if (!model->BSIM4wcigdGiven) - model->BSIM4wcigd = 0.0; - } - else - { - if (!model->BSIM4wcigsdGiven) - model->BSIM4wcigsd = 0.0; - model->BSIM4wcigs = model->BSIM4wcigd = model->BSIM4wcigsd; - } - if (!model->BSIM4waigbaccGiven) - model->BSIM4waigbacc = 0.0; - if (!model->BSIM4wbigbaccGiven) - model->BSIM4wbigbacc = 0.0; - if (!model->BSIM4wcigbaccGiven) - model->BSIM4wcigbacc = 0.0; - if (!model->BSIM4waigbinvGiven) - model->BSIM4waigbinv = 0.0; - if (!model->BSIM4wbigbinvGiven) - model->BSIM4wbigbinv = 0.0; - if (!model->BSIM4wcigbinvGiven) - model->BSIM4wcigbinv = 0.0; - if (!model->BSIM4wnigcGiven) - model->BSIM4wnigc = 0.0; - if (!model->BSIM4wnigbinvGiven) - model->BSIM4wnigbinv = 0.0; - if (!model->BSIM4wnigbaccGiven) - model->BSIM4wnigbacc = 0.0; - if (!model->BSIM4wntoxGiven) - model->BSIM4wntox = 0.0; - if (!model->BSIM4weigbinvGiven) - model->BSIM4weigbinv = 0.0; - if (!model->BSIM4wpigcdGiven) - model->BSIM4wpigcd = 0.0; - if (!model->BSIM4wpoxedgeGiven) - model->BSIM4wpoxedge = 0.0; - if (!model->BSIM4wxrcrg1Given) - model->BSIM4wxrcrg1 = 0.0; - if (!model->BSIM4wxrcrg2Given) - model->BSIM4wxrcrg2 = 0.0; - if (!model->BSIM4weuGiven) - model->BSIM4weu = 0.0; - if (!model->BSIM4wucsGiven) - model->BSIM4wucs = 0.0; - if (!model->BSIM4wvfbGiven) - model->BSIM4wvfb = 0.0; - if (!model->BSIM4wlambdaGiven) - model->BSIM4wlambda = 0.0; - if (!model->BSIM4wvtlGiven) - model->BSIM4wvtl = 0.0; - if (!model->BSIM4wxnGiven) - model->BSIM4wxn = 0.0; - if (!model->BSIM4wvfbsdoffGiven) - model->BSIM4wvfbsdoff = 0.0; - if (!model->BSIM4wtvfbsdoffGiven) - model->BSIM4wtvfbsdoff = 0.0; - if (!model->BSIM4wtvoffGiven) - model->BSIM4wtvoff = 0.0; - if (!model->BSIM4wtnfactorGiven) /* v4.7 temp dep of leakage current */ - model->BSIM4wtnfactor = 0.0; - if (!model->BSIM4wteta0Given) /* v4.7 temp dep of leakage current */ - model->BSIM4wteta0 = 0.0; - if (!model->BSIM4wtvoffcvGiven) /* v4.7 temp dep of leakage current */ - model->BSIM4wtvoffcv = 0.0; - - if (!model->BSIM4wcgslGiven) - model->BSIM4wcgsl = 0.0; - if (!model->BSIM4wcgdlGiven) - model->BSIM4wcgdl = 0.0; - if (!model->BSIM4wckappasGiven) - model->BSIM4wckappas = 0.0; - if (!model->BSIM4wckappadGiven) - model->BSIM4wckappad = 0.0; - if (!model->BSIM4wcfGiven) - model->BSIM4wcf = 0.0; - if (!model->BSIM4wclcGiven) - model->BSIM4wclc = 0.0; - if (!model->BSIM4wcleGiven) - model->BSIM4wcle = 0.0; - if (!model->BSIM4wvfbcvGiven) - model->BSIM4wvfbcv = 0.0; - if (!model->BSIM4wacdeGiven) - model->BSIM4wacde = 0.0; - if (!model->BSIM4wmoinGiven) - model->BSIM4wmoin = 0.0; - if (!model->BSIM4wnoffGiven) - model->BSIM4wnoff = 0.0; - if (!model->BSIM4wvoffcvGiven) - model->BSIM4wvoffcv = 0.0; - - /* Cross-term dependence */ - if (!model->BSIM4pcdscGiven) - model->BSIM4pcdsc = 0.0; - if (!model->BSIM4pcdscbGiven) - model->BSIM4pcdscb = 0.0; - if (!model->BSIM4pcdscdGiven) - model->BSIM4pcdscd = 0.0; - if (!model->BSIM4pcitGiven) - model->BSIM4pcit = 0.0; - if (!model->BSIM4pnfactorGiven) - model->BSIM4pnfactor = 0.0; - if (!model->BSIM4pxjGiven) - model->BSIM4pxj = 0.0; - if (!model->BSIM4pvsatGiven) - model->BSIM4pvsat = 0.0; - if (!model->BSIM4patGiven) - model->BSIM4pat = 0.0; - if (!model->BSIM4pa0Given) - model->BSIM4pa0 = 0.0; - - if (!model->BSIM4pagsGiven) - model->BSIM4pags = 0.0; - if (!model->BSIM4pa1Given) - model->BSIM4pa1 = 0.0; - if (!model->BSIM4pa2Given) - model->BSIM4pa2 = 0.0; - if (!model->BSIM4pketaGiven) - model->BSIM4pketa = 0.0; - if (!model->BSIM4pnsubGiven) - model->BSIM4pnsub = 0.0; - if (!model->BSIM4pndepGiven) - model->BSIM4pndep = 0.0; - if (!model->BSIM4pnsdGiven) - model->BSIM4pnsd = 0.0; - if (!model->BSIM4pphinGiven) - model->BSIM4pphin = 0.0; - if (!model->BSIM4pngateGiven) - model->BSIM4pngate = 0.0; - if (!model->BSIM4pvbmGiven) - model->BSIM4pvbm = 0.0; - if (!model->BSIM4pxtGiven) - model->BSIM4pxt = 0.0; - if (!model->BSIM4pk1Given) - model->BSIM4pk1 = 0.0; - if (!model->BSIM4pkt1Given) - model->BSIM4pkt1 = 0.0; - if (!model->BSIM4pkt1lGiven) - model->BSIM4pkt1l = 0.0; - if (!model->BSIM4pk2Given) - model->BSIM4pk2 = 0.0; - if (!model->BSIM4pkt2Given) - model->BSIM4pkt2 = 0.0; - if (!model->BSIM4pk3Given) - model->BSIM4pk3 = 0.0; - if (!model->BSIM4pk3bGiven) - model->BSIM4pk3b = 0.0; - if (!model->BSIM4pw0Given) - model->BSIM4pw0 = 0.0; - if (!model->BSIM4plpe0Given) - model->BSIM4plpe0 = 0.0; - if (!model->BSIM4plpebGiven) - model->BSIM4plpeb = 0.0; - if (!model->BSIM4pdvtp0Given) - model->BSIM4pdvtp0 = 0.0; - if (!model->BSIM4pdvtp1Given) - model->BSIM4pdvtp1 = 0.0; - if (!model->BSIM4pdvtp2Given) /* New DIBL/Rout */ - model->BSIM4pdvtp2 = 0.0; - if (!model->BSIM4pdvtp3Given) - model->BSIM4pdvtp3 = 0.0; - if (!model->BSIM4pdvtp4Given) - model->BSIM4pdvtp4 = 0.0; - if (!model->BSIM4pdvtp5Given) - model->BSIM4pdvtp5 = 0.0; - if (!model->BSIM4pdvt0Given) - model->BSIM4pdvt0 = 0.0; - if (!model->BSIM4pdvt1Given) - model->BSIM4pdvt1 = 0.0; - if (!model->BSIM4pdvt2Given) - model->BSIM4pdvt2 = 0.0; - if (!model->BSIM4pdvt0wGiven) - model->BSIM4pdvt0w = 0.0; - if (!model->BSIM4pdvt1wGiven) - model->BSIM4pdvt1w = 0.0; - if (!model->BSIM4pdvt2wGiven) - model->BSIM4pdvt2w = 0.0; - if (!model->BSIM4pdroutGiven) - model->BSIM4pdrout = 0.0; - if (!model->BSIM4pdsubGiven) - model->BSIM4pdsub = 0.0; - if (!model->BSIM4pvth0Given) - model->BSIM4pvth0 = 0.0; - if (!model->BSIM4puaGiven) - model->BSIM4pua = 0.0; - if (!model->BSIM4pua1Given) - model->BSIM4pua1 = 0.0; - if (!model->BSIM4pubGiven) - model->BSIM4pub = 0.0; - if (!model->BSIM4pub1Given) - model->BSIM4pub1 = 0.0; - if (!model->BSIM4pucGiven) - model->BSIM4puc = 0.0; - if (!model->BSIM4puc1Given) - model->BSIM4puc1 = 0.0; - if (!model->BSIM4pudGiven) - model->BSIM4pud = 0.0; - if (!model->BSIM4pud1Given) - model->BSIM4pud1 = 0.0; - if (!model->BSIM4pupGiven) - model->BSIM4pup = 0.0; - if (!model->BSIM4plpGiven) - model->BSIM4plp = 0.0; - if (!model->BSIM4pu0Given) - model->BSIM4pu0 = 0.0; - if (!model->BSIM4puteGiven) - model->BSIM4pute = 0.0; - if (!model->BSIM4pucsteGiven) - model->BSIM4pucste = 0.0; - if (!model->BSIM4pvoffGiven) - model->BSIM4pvoff = 0.0; - if (!model->BSIM4pminvGiven) - model->BSIM4pminv = 0.0; - if (!model->BSIM4pminvcvGiven) - model->BSIM4pminvcv = 0.0; - if (!model->BSIM4pfproutGiven) - model->BSIM4pfprout = 0.0; - if (!model->BSIM4ppditsGiven) - model->BSIM4ppdits = 0.0; - if (!model->BSIM4ppditsdGiven) - model->BSIM4ppditsd = 0.0; - if (!model->BSIM4pdeltaGiven) - model->BSIM4pdelta = 0.0; - if (!model->BSIM4prdswGiven) - model->BSIM4prdsw = 0.0; - if (!model->BSIM4prdwGiven) - model->BSIM4prdw = 0.0; - if (!model->BSIM4prswGiven) - model->BSIM4prsw = 0.0; - if (!model->BSIM4pprwbGiven) - model->BSIM4pprwb = 0.0; - if (!model->BSIM4pprwgGiven) - model->BSIM4pprwg = 0.0; - if (!model->BSIM4pprtGiven) - model->BSIM4pprt = 0.0; - if (!model->BSIM4peta0Given) - model->BSIM4peta0 = 0.0; - if (!model->BSIM4petabGiven) - model->BSIM4petab = 0.0; - if (!model->BSIM4ppclmGiven) - model->BSIM4ppclm = 0.0; - if (!model->BSIM4ppdibl1Given) - model->BSIM4ppdibl1 = 0.0; - if (!model->BSIM4ppdibl2Given) - model->BSIM4ppdibl2 = 0.0; - if (!model->BSIM4ppdiblbGiven) - model->BSIM4ppdiblb = 0.0; - if (!model->BSIM4ppscbe1Given) - model->BSIM4ppscbe1 = 0.0; - if (!model->BSIM4ppscbe2Given) - model->BSIM4ppscbe2 = 0.0; - if (!model->BSIM4ppvagGiven) - model->BSIM4ppvag = 0.0; - if (!model->BSIM4pwrGiven) - model->BSIM4pwr = 0.0; - if (!model->BSIM4pdwgGiven) - model->BSIM4pdwg = 0.0; - if (!model->BSIM4pdwbGiven) - model->BSIM4pdwb = 0.0; - if (!model->BSIM4pb0Given) - model->BSIM4pb0 = 0.0; - if (!model->BSIM4pb1Given) - model->BSIM4pb1 = 0.0; - if (!model->BSIM4palpha0Given) - model->BSIM4palpha0 = 0.0; - if (!model->BSIM4palpha1Given) - model->BSIM4palpha1 = 0.0; - if (!model->BSIM4pbeta0Given) - model->BSIM4pbeta0 = 0.0; - if (!model->BSIM4pagidlGiven) - model->BSIM4pagidl = 0.0; - if (!model->BSIM4pbgidlGiven) - model->BSIM4pbgidl = 0.0; - if (!model->BSIM4pcgidlGiven) - model->BSIM4pcgidl = 0.0; - if (!model->BSIM4pegidlGiven) - model->BSIM4pegidl = 0.0; - if (!model->BSIM4prgidlGiven) /* v4.7 New GIDL/GISL */ - model->BSIM4prgidl = 0.0; - if (!model->BSIM4pkgidlGiven) /* v4.7 New GIDL/GISL */ - model->BSIM4pkgidl = 0.0; - if (!model->BSIM4pfgidlGiven) /* v4.7 New GIDL/GISL */ - model->BSIM4pfgidl = 0.0; - - /*if (!model->BSIM4pagislGiven) - { - if (model->BSIM4pagidlGiven) - model->BSIM4pagisl = model->BSIM4pagidl; - else - model->BSIM4pagisl = 0.0; - } - if (!model->BSIM4pbgislGiven) - { - if (model->BSIM4pbgidlGiven) - model->BSIM4pbgisl = model->BSIM4pbgidl; - else - model->BSIM4pbgisl = 0.0; - } - if (!model->BSIM4pcgislGiven) - { - if (model->BSIM4pcgidlGiven) - model->BSIM4pcgisl = model->BSIM4pcgidl; - else - model->BSIM4pcgisl = 0.0; - } - if (!model->BSIM4pegislGiven) - { - if (model->BSIM4pegidlGiven) - model->BSIM4pegisl = model->BSIM4pegidl; - else - model->BSIM4pegisl = 0.0; - }*/ - - /*if (!model->BSIM4prgislGiven) - { - if (model->BSIM4prgidlGiven) - model->BSIM4prgisl = model->BSIM4prgidl; - } - if (!model->BSIM4pkgislGiven) - { - if (model->BSIM4pkgidlGiven) - model->BSIM4pkgisl = model->BSIM4pkgidl; - } - if (!model->BSIM4pfgislGiven) - { - if (model->BSIM4pfgidlGiven) - model->BSIM4pfgisl = model->BSIM4pfgidl; - }*/ - - /*Default value of pagisl, pbgisl, pcgisl, pegisl, prgisl, pkgisl, and pfgisl are set as follows */ - if (!model->BSIM4pagislGiven) - model->BSIM4pagisl = model->BSIM4pagidl; - if (!model->BSIM4pbgislGiven) - model->BSIM4pbgisl = model->BSIM4pbgidl; - if (!model->BSIM4pcgislGiven) - model->BSIM4pcgisl = model->BSIM4pcgidl; - if (!model->BSIM4pegislGiven) - model->BSIM4pegisl = model->BSIM4pegidl; - if (!model->BSIM4prgislGiven) /* v4.7 New GIDL/GISL */ - model->BSIM4prgisl = model->BSIM4prgidl; - if (!model->BSIM4pkgislGiven) /* v4.7 New GIDL/GISL */ - model->BSIM4pkgisl = model->BSIM4pkgidl; - if (!model->BSIM4pfgislGiven) /* v4.7 New GIDL/GISL */ - model->BSIM4pfgisl = model->BSIM4pfgidl; - if (!model->BSIM4paigcGiven) - model->BSIM4paigc = 0.0; - if (!model->BSIM4pbigcGiven) - model->BSIM4pbigc = 0.0; - if (!model->BSIM4pcigcGiven) - model->BSIM4pcigc = 0.0; - if (!model->BSIM4aigsdGiven && (model->BSIM4aigsGiven || model->BSIM4aigdGiven)) - { - if (!model->BSIM4paigsGiven) - model->BSIM4paigs = 0.0; - if (!model->BSIM4paigdGiven) - model->BSIM4paigd = 0.0; - } - else - { - if (!model->BSIM4paigsdGiven) - model->BSIM4paigsd = 0.0; - model->BSIM4paigs = model->BSIM4paigd = model->BSIM4paigsd; - } - if (!model->BSIM4bigsdGiven && (model->BSIM4bigsGiven || model->BSIM4bigdGiven)) - { - if (!model->BSIM4pbigsGiven) - model->BSIM4pbigs = 0.0; - if (!model->BSIM4pbigdGiven) - model->BSIM4pbigd = 0.0; - } - else - { - if (!model->BSIM4pbigsdGiven) - model->BSIM4pbigsd = 0.0; - model->BSIM4pbigs = model->BSIM4pbigd = model->BSIM4pbigsd; - } - if (!model->BSIM4cigsdGiven && (model->BSIM4cigsGiven || model->BSIM4cigdGiven)) - { - if (!model->BSIM4pcigsGiven) - model->BSIM4pcigs = 0.0; - if (!model->BSIM4pcigdGiven) - model->BSIM4pcigd = 0.0; - } - else - { - if (!model->BSIM4pcigsdGiven) - model->BSIM4pcigsd = 0.0; - model->BSIM4pcigs = model->BSIM4pcigd = model->BSIM4pcigsd; - } - if (!model->BSIM4paigbaccGiven) - model->BSIM4paigbacc = 0.0; - if (!model->BSIM4pbigbaccGiven) - model->BSIM4pbigbacc = 0.0; - if (!model->BSIM4pcigbaccGiven) - model->BSIM4pcigbacc = 0.0; - if (!model->BSIM4paigbinvGiven) - model->BSIM4paigbinv = 0.0; - if (!model->BSIM4pbigbinvGiven) - model->BSIM4pbigbinv = 0.0; - if (!model->BSIM4pcigbinvGiven) - model->BSIM4pcigbinv = 0.0; - if (!model->BSIM4pnigcGiven) - model->BSIM4pnigc = 0.0; - if (!model->BSIM4pnigbinvGiven) - model->BSIM4pnigbinv = 0.0; - if (!model->BSIM4pnigbaccGiven) - model->BSIM4pnigbacc = 0.0; - if (!model->BSIM4pntoxGiven) - model->BSIM4pntox = 0.0; - if (!model->BSIM4peigbinvGiven) - model->BSIM4peigbinv = 0.0; - if (!model->BSIM4ppigcdGiven) - model->BSIM4ppigcd = 0.0; - if (!model->BSIM4ppoxedgeGiven) - model->BSIM4ppoxedge = 0.0; - if (!model->BSIM4pxrcrg1Given) - model->BSIM4pxrcrg1 = 0.0; - if (!model->BSIM4pxrcrg2Given) - model->BSIM4pxrcrg2 = 0.0; - if (!model->BSIM4peuGiven) - model->BSIM4peu = 0.0; - if (!model->BSIM4pucsGiven) - model->BSIM4pucs = 0.0; - if (!model->BSIM4pvfbGiven) - model->BSIM4pvfb = 0.0; - if (!model->BSIM4plambdaGiven) - model->BSIM4plambda = 0.0; - if (!model->BSIM4pvtlGiven) - model->BSIM4pvtl = 0.0; - if (!model->BSIM4pxnGiven) - model->BSIM4pxn = 0.0; - if (!model->BSIM4pvfbsdoffGiven) - model->BSIM4pvfbsdoff = 0.0; - if (!model->BSIM4ptvfbsdoffGiven) - model->BSIM4ptvfbsdoff = 0.0; - if (!model->BSIM4ptvoffGiven) - model->BSIM4ptvoff = 0.0; - if (!model->BSIM4ptnfactorGiven) /* v4.7 temp dep of leakage current */ - model->BSIM4ptnfactor = 0.0; - if (!model->BSIM4pteta0Given) /* v4.7 temp dep of leakage current */ - model->BSIM4pteta0 = 0.0; - if (!model->BSIM4ptvoffcvGiven) /* v4.7 temp dep of leakage current */ - model->BSIM4ptvoffcv = 0.0; - - if (!model->BSIM4pcgslGiven) - model->BSIM4pcgsl = 0.0; - if (!model->BSIM4pcgdlGiven) - model->BSIM4pcgdl = 0.0; - if (!model->BSIM4pckappasGiven) - model->BSIM4pckappas = 0.0; - if (!model->BSIM4pckappadGiven) - model->BSIM4pckappad = 0.0; - if (!model->BSIM4pcfGiven) - model->BSIM4pcf = 0.0; - if (!model->BSIM4pclcGiven) - model->BSIM4pclc = 0.0; - if (!model->BSIM4pcleGiven) - model->BSIM4pcle = 0.0; - if (!model->BSIM4pvfbcvGiven) - model->BSIM4pvfbcv = 0.0; - if (!model->BSIM4pacdeGiven) - model->BSIM4pacde = 0.0; - if (!model->BSIM4pmoinGiven) - model->BSIM4pmoin = 0.0; - if (!model->BSIM4pnoffGiven) - model->BSIM4pnoff = 0.0; - if (!model->BSIM4pvoffcvGiven) - model->BSIM4pvoffcv = 0.0; - - if (!model->BSIM4gamma1Given) - model->BSIM4gamma1 = 0.0; - if (!model->BSIM4lgamma1Given) - model->BSIM4lgamma1 = 0.0; - if (!model->BSIM4wgamma1Given) - model->BSIM4wgamma1 = 0.0; - if (!model->BSIM4pgamma1Given) - model->BSIM4pgamma1 = 0.0; - if (!model->BSIM4gamma2Given) - model->BSIM4gamma2 = 0.0; - if (!model->BSIM4lgamma2Given) - model->BSIM4lgamma2 = 0.0; - if (!model->BSIM4wgamma2Given) - model->BSIM4wgamma2 = 0.0; - if (!model->BSIM4pgamma2Given) - model->BSIM4pgamma2 = 0.0; - if (!model->BSIM4vbxGiven) - model->BSIM4vbx = 0.0; - if (!model->BSIM4lvbxGiven) - model->BSIM4lvbx = 0.0; - if (!model->BSIM4wvbxGiven) - model->BSIM4wvbx = 0.0; - if (!model->BSIM4pvbxGiven) - model->BSIM4pvbx = 0.0; - - /* unit degree celcius */ - if (!model->BSIM4tnomGiven) - model->BSIM4tnom = ckt->CKTnomTemp; - if (!model->BSIM4LintGiven) - model->BSIM4Lint = 0.0; - if (!model->BSIM4LlGiven) - model->BSIM4Ll = 0.0; - if (!model->BSIM4LlcGiven) - model->BSIM4Llc = model->BSIM4Ll; - if (!model->BSIM4LlnGiven) - model->BSIM4Lln = 1.0; - if (!model->BSIM4LwGiven) - model->BSIM4Lw = 0.0; - if (!model->BSIM4LwcGiven) - model->BSIM4Lwc = model->BSIM4Lw; - if (!model->BSIM4LwnGiven) - model->BSIM4Lwn = 1.0; - if (!model->BSIM4LwlGiven) - model->BSIM4Lwl = 0.0; - if (!model->BSIM4LwlcGiven) - model->BSIM4Lwlc = model->BSIM4Lwl; - if (!model->BSIM4LminGiven) - model->BSIM4Lmin = 0.0; - if (!model->BSIM4LmaxGiven) - model->BSIM4Lmax = 1.0; - if (!model->BSIM4WintGiven) - model->BSIM4Wint = 0.0; - if (!model->BSIM4WlGiven) - model->BSIM4Wl = 0.0; - if (!model->BSIM4WlcGiven) - model->BSIM4Wlc = model->BSIM4Wl; - if (!model->BSIM4WlnGiven) - model->BSIM4Wln = 1.0; - if (!model->BSIM4WwGiven) - model->BSIM4Ww = 0.0; - if (!model->BSIM4WwcGiven) - model->BSIM4Wwc = model->BSIM4Ww; - if (!model->BSIM4WwnGiven) - model->BSIM4Wwn = 1.0; - if (!model->BSIM4WwlGiven) - model->BSIM4Wwl = 0.0; - if (!model->BSIM4WwlcGiven) - model->BSIM4Wwlc = model->BSIM4Wwl; - if (!model->BSIM4WminGiven) - model->BSIM4Wmin = 0.0; - if (!model->BSIM4WmaxGiven) - model->BSIM4Wmax = 1.0; - if (!model->BSIM4dwcGiven) - model->BSIM4dwc = model->BSIM4Wint; - if (!model->BSIM4dlcGiven) - model->BSIM4dlc = model->BSIM4Lint; - if (!model->BSIM4xlGiven) - model->BSIM4xl = 0.0; - if (!model->BSIM4xwGiven) - model->BSIM4xw = 0.0; - if (!model->BSIM4dlcigGiven) - model->BSIM4dlcig = model->BSIM4Lint; - if (!model->BSIM4dlcigdGiven) - { - if (model->BSIM4dlcigGiven) - model->BSIM4dlcigd = model->BSIM4dlcig; - else - model->BSIM4dlcigd = model->BSIM4Lint; - } - if (!model->BSIM4dwjGiven) - model->BSIM4dwj = model->BSIM4dwc; - if (!model->BSIM4cfGiven) - model->BSIM4cf = 2.0 * model->BSIM4epsrox * EPS0 / PI - * log(1.0 + 0.4e-6 / model->BSIM4toxe); - - if (!model->BSIM4xpartGiven) - model->BSIM4xpart = 0.0; - if (!model->BSIM4sheetResistanceGiven) - model->BSIM4sheetResistance = 0.0; - - if (!model->BSIM4SunitAreaJctCapGiven) - model->BSIM4SunitAreaJctCap = 5.0E-4; - if (!model->BSIM4DunitAreaJctCapGiven) - model->BSIM4DunitAreaJctCap = model->BSIM4SunitAreaJctCap; - if (!model->BSIM4SunitLengthSidewallJctCapGiven) - model->BSIM4SunitLengthSidewallJctCap = 5.0E-10; - if (!model->BSIM4DunitLengthSidewallJctCapGiven) - model->BSIM4DunitLengthSidewallJctCap = model->BSIM4SunitLengthSidewallJctCap; - if (!model->BSIM4SunitLengthGateSidewallJctCapGiven) - model->BSIM4SunitLengthGateSidewallJctCap = model->BSIM4SunitLengthSidewallJctCap ; - if (!model->BSIM4DunitLengthGateSidewallJctCapGiven) - model->BSIM4DunitLengthGateSidewallJctCap = model->BSIM4SunitLengthGateSidewallJctCap; - if (!model->BSIM4SjctSatCurDensityGiven) - model->BSIM4SjctSatCurDensity = 1.0E-4; - if (!model->BSIM4DjctSatCurDensityGiven) - model->BSIM4DjctSatCurDensity = model->BSIM4SjctSatCurDensity; - if (!model->BSIM4SjctSidewallSatCurDensityGiven) - model->BSIM4SjctSidewallSatCurDensity = 0.0; - if (!model->BSIM4DjctSidewallSatCurDensityGiven) - model->BSIM4DjctSidewallSatCurDensity = model->BSIM4SjctSidewallSatCurDensity; - if (!model->BSIM4SjctGateSidewallSatCurDensityGiven) - model->BSIM4SjctGateSidewallSatCurDensity = 0.0; - if (!model->BSIM4DjctGateSidewallSatCurDensityGiven) - model->BSIM4DjctGateSidewallSatCurDensity = model->BSIM4SjctGateSidewallSatCurDensity; - if (!model->BSIM4SbulkJctPotentialGiven) - model->BSIM4SbulkJctPotential = 1.0; - if (!model->BSIM4DbulkJctPotentialGiven) - model->BSIM4DbulkJctPotential = model->BSIM4SbulkJctPotential; - if (!model->BSIM4SsidewallJctPotentialGiven) - model->BSIM4SsidewallJctPotential = 1.0; - if (!model->BSIM4DsidewallJctPotentialGiven) - model->BSIM4DsidewallJctPotential = model->BSIM4SsidewallJctPotential; - if (!model->BSIM4SGatesidewallJctPotentialGiven) - model->BSIM4SGatesidewallJctPotential = model->BSIM4SsidewallJctPotential; - if (!model->BSIM4DGatesidewallJctPotentialGiven) - model->BSIM4DGatesidewallJctPotential = model->BSIM4SGatesidewallJctPotential; - if (!model->BSIM4SbulkJctBotGradingCoeffGiven) - model->BSIM4SbulkJctBotGradingCoeff = 0.5; - if (!model->BSIM4DbulkJctBotGradingCoeffGiven) - model->BSIM4DbulkJctBotGradingCoeff = model->BSIM4SbulkJctBotGradingCoeff; - if (!model->BSIM4SbulkJctSideGradingCoeffGiven) - model->BSIM4SbulkJctSideGradingCoeff = 0.33; - if (!model->BSIM4DbulkJctSideGradingCoeffGiven) - model->BSIM4DbulkJctSideGradingCoeff = model->BSIM4SbulkJctSideGradingCoeff; - if (!model->BSIM4SbulkJctGateSideGradingCoeffGiven) - model->BSIM4SbulkJctGateSideGradingCoeff = model->BSIM4SbulkJctSideGradingCoeff; - if (!model->BSIM4DbulkJctGateSideGradingCoeffGiven) - model->BSIM4DbulkJctGateSideGradingCoeff = model->BSIM4SbulkJctGateSideGradingCoeff; - if (!model->BSIM4SjctEmissionCoeffGiven) - model->BSIM4SjctEmissionCoeff = 1.0; - if (!model->BSIM4DjctEmissionCoeffGiven) - model->BSIM4DjctEmissionCoeff = model->BSIM4SjctEmissionCoeff; - if (!model->BSIM4SjctTempExponentGiven) - model->BSIM4SjctTempExponent = 3.0; - if (!model->BSIM4DjctTempExponentGiven) - model->BSIM4DjctTempExponent = model->BSIM4SjctTempExponent; - - if (!model->BSIM4jtssGiven) - model->BSIM4jtss = 0.0; - if (!model->BSIM4jtsdGiven) - model->BSIM4jtsd = model->BSIM4jtss; - if (!model->BSIM4jtsswsGiven) - model->BSIM4jtssws = 0.0; - if (!model->BSIM4jtsswdGiven) - model->BSIM4jtsswd = model->BSIM4jtssws; - if (!model->BSIM4jtsswgsGiven) - model->BSIM4jtsswgs = 0.0; - if (!model->BSIM4jtsswgdGiven) - model->BSIM4jtsswgd = model->BSIM4jtsswgs; - if (!model->BSIM4jtweffGiven) - model->BSIM4jtweff = 0.0; - if (!model->BSIM4njtsGiven) - model->BSIM4njts = 20.0; - if (!model->BSIM4njtsswGiven) - model->BSIM4njtssw = 20.0; - if (!model->BSIM4njtsswgGiven) - model->BSIM4njtsswg = 20.0; - if (!model->BSIM4njtsdGiven) - { - if (model->BSIM4njtsGiven) - model->BSIM4njtsd = model->BSIM4njts; - else - model->BSIM4njtsd = 20.0; - } - if (!model->BSIM4njtsswdGiven) - { - if (model->BSIM4njtsswGiven) - model->BSIM4njtsswd = model->BSIM4njtssw; - else - model->BSIM4njtsswd = 20.0; - } - if (!model->BSIM4njtsswgdGiven) - { - if (model->BSIM4njtsswgGiven) - model->BSIM4njtsswgd = model->BSIM4njtsswg; - else - model->BSIM4njtsswgd = 20.0; - } - if (!model->BSIM4xtssGiven) - model->BSIM4xtss = 0.02; - if (!model->BSIM4xtsdGiven) - model->BSIM4xtsd = model->BSIM4xtss; - if (!model->BSIM4xtsswsGiven) - model->BSIM4xtssws = 0.02; - if (!model->BSIM4xtsswdGiven) - model->BSIM4xtsswd = model->BSIM4xtssws; - if (!model->BSIM4xtsswgsGiven) - model->BSIM4xtsswgs = 0.02; - if (!model->BSIM4xtsswgdGiven) - model->BSIM4xtsswgd = model->BSIM4xtsswgs; - if (!model->BSIM4tnjtsGiven) - model->BSIM4tnjts = 0.0; - if (!model->BSIM4tnjtsswGiven) - model->BSIM4tnjtssw = 0.0; - if (!model->BSIM4tnjtsswgGiven) - model->BSIM4tnjtsswg = 0.0; - if (!model->BSIM4tnjtsdGiven) - { - if (model->BSIM4tnjtsGiven) - model->BSIM4tnjtsd = model->BSIM4tnjts; - else - model->BSIM4tnjtsd = 0.0; - } - if (!model->BSIM4tnjtsswdGiven) - { - if (model->BSIM4tnjtsswGiven) - model->BSIM4tnjtsswd = model->BSIM4tnjtssw; - else - model->BSIM4tnjtsswd = 0.0; - } - if (!model->BSIM4tnjtsswgdGiven) - { - if (model->BSIM4tnjtsswgGiven) - model->BSIM4tnjtsswgd = model->BSIM4tnjtsswg; - else - model->BSIM4tnjtsswgd = 0.0; - } - if (!model->BSIM4vtssGiven) - model->BSIM4vtss = 10.0; - if (!model->BSIM4vtsdGiven) - model->BSIM4vtsd = model->BSIM4vtss; - if (!model->BSIM4vtsswsGiven) - model->BSIM4vtssws = 10.0; - if (!model->BSIM4vtsswdGiven) - model->BSIM4vtsswd = model->BSIM4vtssws; - if (!model->BSIM4vtsswgsGiven) - model->BSIM4vtsswgs = 10.0; - if (!model->BSIM4vtsswgdGiven) - model->BSIM4vtsswgd = model->BSIM4vtsswgs; - - if (!model->BSIM4oxideTrapDensityAGiven) - { if (model->BSIM4type == NMOS) - model->BSIM4oxideTrapDensityA = 6.25e41; - else - model->BSIM4oxideTrapDensityA= 6.188e40; - } - if (!model->BSIM4oxideTrapDensityBGiven) - { if (model->BSIM4type == NMOS) - model->BSIM4oxideTrapDensityB = 3.125e26; - else - model->BSIM4oxideTrapDensityB = 1.5e25; - } - if (!model->BSIM4oxideTrapDensityCGiven) - model->BSIM4oxideTrapDensityC = 8.75e9; - if (!model->BSIM4emGiven) - model->BSIM4em = 4.1e7; /* V/m */ - if (!model->BSIM4efGiven) - model->BSIM4ef = 1.0; - if (!model->BSIM4afGiven) - model->BSIM4af = 1.0; - if (!model->BSIM4kfGiven) - model->BSIM4kf = 0.0; - - if (!model->BSIM4vgsMaxGiven) - model->BSIM4vgsMax = 1e99; - if (!model->BSIM4vgdMaxGiven) - model->BSIM4vgdMax = 1e99; - if (!model->BSIM4vgbMaxGiven) - model->BSIM4vgbMax = 1e99; - if (!model->BSIM4vdsMaxGiven) - model->BSIM4vdsMax = 1e99; - if (!model->BSIM4vbsMaxGiven) - model->BSIM4vbsMax = 1e99; - if (!model->BSIM4vbdMaxGiven) - model->BSIM4vbdMax = 1e99; - if (!model->BSIM4vgsrMaxGiven) - model->BSIM4vgsrMax = 1e99; - if (!model->BSIM4vgdrMaxGiven) - model->BSIM4vgdrMax = 1e99; - if (!model->BSIM4vgbrMaxGiven) - model->BSIM4vgbrMax = 1e99; - if (!model->BSIM4vbsrMaxGiven) - model->BSIM4vbsrMax = 1e99; - if (!model->BSIM4vbdrMaxGiven) - model->BSIM4vbdrMax = 1e99; - - /* stress effect */ - if (!model->BSIM4sarefGiven) - model->BSIM4saref = 1e-6; /* m */ - if (!model->BSIM4sbrefGiven) - model->BSIM4sbref = 1e-6; /* m */ - if (!model->BSIM4wlodGiven) - model->BSIM4wlod = 0; /* m */ - if (!model->BSIM4ku0Given) - model->BSIM4ku0 = 0; /* 1/m */ - if (!model->BSIM4kvsatGiven) - model->BSIM4kvsat = 0; - if (!model->BSIM4kvth0Given) /* m */ - model->BSIM4kvth0 = 0; - if (!model->BSIM4tku0Given) - model->BSIM4tku0 = 0; - if (!model->BSIM4llodku0Given) - model->BSIM4llodku0 = 0; - if (!model->BSIM4wlodku0Given) - model->BSIM4wlodku0 = 0; - if (!model->BSIM4llodvthGiven) - model->BSIM4llodvth = 0; - if (!model->BSIM4wlodvthGiven) - model->BSIM4wlodvth = 0; - if (!model->BSIM4lku0Given) - model->BSIM4lku0 = 0; - if (!model->BSIM4wku0Given) - model->BSIM4wku0 = 0; - if (!model->BSIM4pku0Given) - model->BSIM4pku0 = 0; - if (!model->BSIM4lkvth0Given) - model->BSIM4lkvth0 = 0; - if (!model->BSIM4wkvth0Given) - model->BSIM4wkvth0 = 0; - if (!model->BSIM4pkvth0Given) - model->BSIM4pkvth0 = 0; - if (!model->BSIM4stk2Given) - model->BSIM4stk2 = 0; - if (!model->BSIM4lodk2Given) - model->BSIM4lodk2 = 1.0; - if (!model->BSIM4steta0Given) - model->BSIM4steta0 = 0; - if (!model->BSIM4lodeta0Given) - model->BSIM4lodeta0 = 1.0; - - /* Well Proximity Effect */ - if (!model->BSIM4webGiven) - model->BSIM4web = 0.0; - if (!model->BSIM4wecGiven) - model->BSIM4wec = 0.0; - if (!model->BSIM4kvth0weGiven) - model->BSIM4kvth0we = 0.0; - if (!model->BSIM4k2weGiven) - model->BSIM4k2we = 0.0; - if (!model->BSIM4ku0weGiven) - model->BSIM4ku0we = 0.0; - if (!model->BSIM4screfGiven) - model->BSIM4scref = 1.0E-6; /* m */ - if (!model->BSIM4wpemodGiven) - model->BSIM4wpemod = 0; - else if ((model->BSIM4wpemod != 0) && (model->BSIM4wpemod != 1)) - { model->BSIM4wpemod = 0; - printf("Warning: wpemod has been set to its default value: 0.\n"); - } - if (!model->BSIM4lkvth0weGiven) - model->BSIM4lkvth0we = 0; - if (!model->BSIM4lk2weGiven) - model->BSIM4lk2we = 0; - if (!model->BSIM4lku0weGiven) - model->BSIM4lku0we = 0; - if (!model->BSIM4wkvth0weGiven) - model->BSIM4wkvth0we = 0; - if (!model->BSIM4wk2weGiven) - model->BSIM4wk2we = 0; - if (!model->BSIM4wku0weGiven) - model->BSIM4wku0we = 0; - if (!model->BSIM4pkvth0weGiven) - model->BSIM4pkvth0we = 0; - if (!model->BSIM4pk2weGiven) - model->BSIM4pk2we = 0; - if (!model->BSIM4pku0weGiven) - model->BSIM4pku0we = 0; - - DMCGeff = model->BSIM4dmcg - model->BSIM4dmcgt; - DMCIeff = model->BSIM4dmci; - DMDGeff = model->BSIM4dmdg - model->BSIM4dmcgt; - - /* - * End processing models and begin to loop - * through all the instances of the model - */ - - for (here = BSIM4instances(model); here != NULL ; - here=BSIM4nextInstance(here)) - { - /* allocate a chunk of the state vector */ - here->BSIM4states = *states; - *states += BSIM4numStates; - - /* perform the parameter defaulting */ - if (!here->BSIM4lGiven) - here->BSIM4l = 5.0e-6; - if (!here->BSIM4wGiven) - here->BSIM4w = 5.0e-6; - if (!here->BSIM4mGiven) - here->BSIM4m = 1.0; - if (!here->BSIM4nfGiven) - here->BSIM4nf = 1.0; - if (!here->BSIM4minGiven) - here->BSIM4min = 0; /* integer */ - if (!here->BSIM4icVDSGiven) - here->BSIM4icVDS = 0.0; - if (!here->BSIM4icVGSGiven) - here->BSIM4icVGS = 0.0; - if (!here->BSIM4icVBSGiven) - here->BSIM4icVBS = 0.0; - if (!here->BSIM4drainAreaGiven) - here->BSIM4drainArea = 0.0; - if (!here->BSIM4drainPerimeterGiven) - here->BSIM4drainPerimeter = 0.0; - if (!here->BSIM4drainSquaresGiven) - here->BSIM4drainSquares = 1.0; - if (!here->BSIM4sourceAreaGiven) - here->BSIM4sourceArea = 0.0; - if (!here->BSIM4sourcePerimeterGiven) - here->BSIM4sourcePerimeter = 0.0; - if (!here->BSIM4sourceSquaresGiven) - here->BSIM4sourceSquares = 1.0; - - if (!here->BSIM4rbdbGiven) - here->BSIM4rbdb = model->BSIM4rbdb; /* in ohm */ - if (!here->BSIM4rbsbGiven) - here->BSIM4rbsb = model->BSIM4rbsb; - if (!here->BSIM4rbpbGiven) - here->BSIM4rbpb = model->BSIM4rbpb; - if (!here->BSIM4rbpsGiven) - here->BSIM4rbps = model->BSIM4rbps; - if (!here->BSIM4rbpdGiven) - here->BSIM4rbpd = model->BSIM4rbpd; - if (!here->BSIM4delvtoGiven) - here->BSIM4delvto = 0.0; - if (!here->BSIM4mulu0Given) - here->BSIM4mulu0 = 1.0; - if (!here->BSIM4xgwGiven) - here->BSIM4xgw = model->BSIM4xgw; - if (!here->BSIM4ngconGiven) - here->BSIM4ngcon = model->BSIM4ngcon; - - - /* Process instance model selectors, some - * may override their global counterparts - */ - if (!here->BSIM4rbodyModGiven) - here->BSIM4rbodyMod = model->BSIM4rbodyMod; - else if ((here->BSIM4rbodyMod != 0) && (here->BSIM4rbodyMod != 1) && (here->BSIM4rbodyMod != 2)) - { here->BSIM4rbodyMod = model->BSIM4rbodyMod; - printf("Warning: rbodyMod has been set to its global value %d.\n", - model->BSIM4rbodyMod); - } - - if (!here->BSIM4rgateModGiven) - here->BSIM4rgateMod = model->BSIM4rgateMod; - else if ((here->BSIM4rgateMod != 0) && (here->BSIM4rgateMod != 1) - && (here->BSIM4rgateMod != 2) && (here->BSIM4rgateMod != 3)) - { here->BSIM4rgateMod = model->BSIM4rgateMod; - printf("Warning: rgateMod has been set to its global value %d.\n", - model->BSIM4rgateMod); - } - - if (!here->BSIM4geoModGiven) - here->BSIM4geoMod = model->BSIM4geoMod; - - if (!here->BSIM4rgeoModGiven) - here->BSIM4rgeoMod = model->BSIM4rgeoMod; - else if ((here->BSIM4rgeoMod != 0) && (here->BSIM4rgeoMod != 1)) - { here->BSIM4rgeoMod = model->BSIM4rgeoMod; - printf("Warning: rgeoMod has been set to its global value %d.\n", - model->BSIM4rgeoMod); - } - - if (!here->BSIM4trnqsModGiven) - here->BSIM4trnqsMod = model->BSIM4trnqsMod; - else if ((here->BSIM4trnqsMod != 0) && (here->BSIM4trnqsMod != 1)) - { here->BSIM4trnqsMod = model->BSIM4trnqsMod; - printf("Warning: trnqsMod has been set to its global value %d.\n", - model->BSIM4trnqsMod); - } - - if (!here->BSIM4acnqsModGiven) - here->BSIM4acnqsMod = model->BSIM4acnqsMod; - else if ((here->BSIM4acnqsMod != 0) && (here->BSIM4acnqsMod != 1)) - { here->BSIM4acnqsMod = model->BSIM4acnqsMod; - printf("Warning: acnqsMod has been set to its global value %d.\n", - model->BSIM4acnqsMod); - } - - /* stress effect */ - if (!here->BSIM4saGiven) - here->BSIM4sa = 0.0; - if (!here->BSIM4sbGiven) - here->BSIM4sb = 0.0; - if (!here->BSIM4sdGiven) - here->BSIM4sd = 2 * model->BSIM4dmcg; - /* Well Proximity Effect */ - if (!here->BSIM4scaGiven) - here->BSIM4sca = 0.0; - if (!here->BSIM4scbGiven) - here->BSIM4scb = 0.0; - if (!here->BSIM4sccGiven) - here->BSIM4scc = 0.0; - if (!here->BSIM4scGiven) - here->BSIM4sc = 0.0; /* m */ - - /* process drain series resistance */ - createNode = 0; - if ( (model->BSIM4rdsMod != 0) - || (model->BSIM4tnoiMod == 1 && noiseAnalGiven)) - { - createNode = 1; - } else if (model->BSIM4sheetResistance > 0) - { - if (here->BSIM4drainSquaresGiven - && here->BSIM4drainSquares > 0) - { - createNode = 1; - } else if (!here->BSIM4drainSquaresGiven - && (here->BSIM4rgeoMod != 0)) - { - BSIM4RdseffGeo(here->BSIM4nf*here->BSIM4m, here->BSIM4geoMod, - here->BSIM4rgeoMod, here->BSIM4min, - here->BSIM4w, model->BSIM4sheetResistance, - DMCGeff, DMCIeff, DMDGeff, 0, &Rtot); - if(Rtot > 0) - createNode = 1; - } - } - if ( createNode != 0 ) - { if ( here->BSIM4dNodePrime == 0 ) - { error = CKTmkVolt(ckt,&tmp,here->BSIM4name,"drain"); - if(error) return(error); - here->BSIM4dNodePrime = tmp->number; - if (ckt->CKTcopyNodesets) { - CKTnode *tmpNode; - IFuid tmpName; - if (CKTinst2Node(ckt,here,1,&tmpNode,&tmpName)==OK) { - if (tmpNode->nsGiven) { - tmp->nodeset=tmpNode->nodeset; - tmp->nsGiven=tmpNode->nsGiven; - } - } - } - } - } - else - { here->BSIM4dNodePrime = here->BSIM4dNode; - } - - /* process source series resistance */ - createNode = 0; - if ( (model->BSIM4rdsMod != 0) - || (model->BSIM4tnoiMod == 1 && noiseAnalGiven)) - { - createNode = 1; - } else if (model->BSIM4sheetResistance > 0) - { - if (here->BSIM4sourceSquaresGiven - && here->BSIM4sourceSquares > 0) - { - createNode = 1; - } else if (!here->BSIM4sourceSquaresGiven - && (here->BSIM4rgeoMod != 0)) - { - BSIM4RdseffGeo(here->BSIM4nf*here->BSIM4m, here->BSIM4geoMod, - here->BSIM4rgeoMod, here->BSIM4min, - here->BSIM4w, model->BSIM4sheetResistance, - DMCGeff, DMCIeff, DMDGeff, 1, &Rtot); - if(Rtot > 0) - createNode = 1; - } - } - if ( createNode != 0 ) - { if ( here->BSIM4sNodePrime == 0 ) - { error = CKTmkVolt(ckt,&tmp,here->BSIM4name,"source"); - if(error) return(error); - here->BSIM4sNodePrime = tmp->number; - if (ckt->CKTcopyNodesets) { - CKTnode *tmpNode; - IFuid tmpName; - if (CKTinst2Node(ckt,here,3,&tmpNode,&tmpName)==OK) { - if (tmpNode->nsGiven) { - tmp->nodeset=tmpNode->nodeset; - tmp->nsGiven=tmpNode->nsGiven; - } - } - } - } - } - else - here->BSIM4sNodePrime = here->BSIM4sNode; - - if ( here->BSIM4rgateMod > 0 ) - { if ( here->BSIM4gNodePrime == 0 ) - { error = CKTmkVolt(ckt,&tmp,here->BSIM4name,"gate"); - if(error) return(error); - here->BSIM4gNodePrime = tmp->number; - if (ckt->CKTcopyNodesets) { - CKTnode *tmpNode; - IFuid tmpName; - if (CKTinst2Node(ckt,here,2,&tmpNode,&tmpName)==OK) { - if (tmpNode->nsGiven) { - tmp->nodeset=tmpNode->nodeset; - tmp->nsGiven=tmpNode->nsGiven; - } - } - } - } - } - else - here->BSIM4gNodePrime = here->BSIM4gNodeExt; - - if ( here->BSIM4rgateMod == 3 ) - { if ( here->BSIM4gNodeMid == 0 ) - { error = CKTmkVolt(ckt,&tmp,here->BSIM4name,"midgate"); - if(error) return(error); - here->BSIM4gNodeMid = tmp->number; - } - } - else - here->BSIM4gNodeMid = here->BSIM4gNodeExt; - - - /* internal body nodes for body resistance model */ - if ((here->BSIM4rbodyMod ==1) || (here->BSIM4rbodyMod ==2)) - { if (here->BSIM4dbNode == 0) - { error = CKTmkVolt(ckt,&tmp,here->BSIM4name,"dbody"); - if(error) return(error); - here->BSIM4dbNode = tmp->number; - } - if (here->BSIM4bNodePrime == 0) - { error = CKTmkVolt(ckt,&tmp,here->BSIM4name,"body"); - if(error) return(error); - here->BSIM4bNodePrime = tmp->number; - if (ckt->CKTcopyNodesets) { - CKTnode *tmpNode; - IFuid tmpName; - if (CKTinst2Node(ckt,here,4,&tmpNode,&tmpName)==OK) { - if (tmpNode->nsGiven) { - tmp->nodeset=tmpNode->nodeset; - tmp->nsGiven=tmpNode->nsGiven; - } - } - } - } - if (here->BSIM4sbNode == 0) - { error = CKTmkVolt(ckt,&tmp,here->BSIM4name,"sbody"); - if(error) return(error); - here->BSIM4sbNode = tmp->number; - } - } - else - here->BSIM4dbNode = here->BSIM4bNodePrime = here->BSIM4sbNode - = here->BSIM4bNode; - - /* NQS node */ - if ( here->BSIM4trnqsMod ) - { if ( here->BSIM4qNode == 0 ) - { error = CKTmkVolt(ckt,&tmp,here->BSIM4name,"charge"); - if(error) return(error); - here->BSIM4qNode = tmp->number; - } - } - else - here->BSIM4qNode = 0; - - -/* set Sparse Matrix Pointers - * macro to make elements with built-in out-of-memory test */ -#define TSTALLOC(ptr,first,second) \ -do { if((here->ptr = SMPmakeElt(matrix,here->first,here->second))==(double *)NULL){\ - return(E_NOMEM);\ -} } while(0) - - TSTALLOC(BSIM4DPbpPtr, BSIM4dNodePrime, BSIM4bNodePrime); - TSTALLOC(BSIM4GPbpPtr, BSIM4gNodePrime, BSIM4bNodePrime); - TSTALLOC(BSIM4SPbpPtr, BSIM4sNodePrime, BSIM4bNodePrime); - - TSTALLOC(BSIM4BPdpPtr, BSIM4bNodePrime, BSIM4dNodePrime); - TSTALLOC(BSIM4BPgpPtr, BSIM4bNodePrime, BSIM4gNodePrime); - TSTALLOC(BSIM4BPspPtr, BSIM4bNodePrime, BSIM4sNodePrime); - TSTALLOC(BSIM4BPbpPtr, BSIM4bNodePrime, BSIM4bNodePrime); - - TSTALLOC(BSIM4DdPtr, BSIM4dNode, BSIM4dNode); - TSTALLOC(BSIM4GPgpPtr, BSIM4gNodePrime, BSIM4gNodePrime); - TSTALLOC(BSIM4SsPtr, BSIM4sNode, BSIM4sNode); - TSTALLOC(BSIM4DPdpPtr, BSIM4dNodePrime, BSIM4dNodePrime); - TSTALLOC(BSIM4SPspPtr, BSIM4sNodePrime, BSIM4sNodePrime); - TSTALLOC(BSIM4DdpPtr, BSIM4dNode, BSIM4dNodePrime); - TSTALLOC(BSIM4GPdpPtr, BSIM4gNodePrime, BSIM4dNodePrime); - TSTALLOC(BSIM4GPspPtr, BSIM4gNodePrime, BSIM4sNodePrime); - TSTALLOC(BSIM4SspPtr, BSIM4sNode, BSIM4sNodePrime); - TSTALLOC(BSIM4DPspPtr, BSIM4dNodePrime, BSIM4sNodePrime); - TSTALLOC(BSIM4DPdPtr, BSIM4dNodePrime, BSIM4dNode); - TSTALLOC(BSIM4DPgpPtr, BSIM4dNodePrime, BSIM4gNodePrime); - TSTALLOC(BSIM4SPgpPtr, BSIM4sNodePrime, BSIM4gNodePrime); - TSTALLOC(BSIM4SPsPtr, BSIM4sNodePrime, BSIM4sNode); - TSTALLOC(BSIM4SPdpPtr, BSIM4sNodePrime, BSIM4dNodePrime); - - TSTALLOC(BSIM4QqPtr, BSIM4qNode, BSIM4qNode); - TSTALLOC(BSIM4QbpPtr, BSIM4qNode, BSIM4bNodePrime) ; - TSTALLOC(BSIM4QdpPtr, BSIM4qNode, BSIM4dNodePrime); - TSTALLOC(BSIM4QspPtr, BSIM4qNode, BSIM4sNodePrime); - TSTALLOC(BSIM4QgpPtr, BSIM4qNode, BSIM4gNodePrime); - TSTALLOC(BSIM4DPqPtr, BSIM4dNodePrime, BSIM4qNode); - TSTALLOC(BSIM4SPqPtr, BSIM4sNodePrime, BSIM4qNode); - TSTALLOC(BSIM4GPqPtr, BSIM4gNodePrime, BSIM4qNode); - - if (here->BSIM4rgateMod != 0) - { TSTALLOC(BSIM4GEgePtr, BSIM4gNodeExt, BSIM4gNodeExt); - TSTALLOC(BSIM4GEgpPtr, BSIM4gNodeExt, BSIM4gNodePrime); - TSTALLOC(BSIM4GPgePtr, BSIM4gNodePrime, BSIM4gNodeExt); - TSTALLOC(BSIM4GEdpPtr, BSIM4gNodeExt, BSIM4dNodePrime); - TSTALLOC(BSIM4GEspPtr, BSIM4gNodeExt, BSIM4sNodePrime); - TSTALLOC(BSIM4GEbpPtr, BSIM4gNodeExt, BSIM4bNodePrime); - TSTALLOC(BSIM4GMdpPtr, BSIM4gNodeMid, BSIM4dNodePrime); - TSTALLOC(BSIM4GMgpPtr, BSIM4gNodeMid, BSIM4gNodePrime); - TSTALLOC(BSIM4GMgmPtr, BSIM4gNodeMid, BSIM4gNodeMid); - TSTALLOC(BSIM4GMgePtr, BSIM4gNodeMid, BSIM4gNodeExt); - TSTALLOC(BSIM4GMspPtr, BSIM4gNodeMid, BSIM4sNodePrime); - TSTALLOC(BSIM4GMbpPtr, BSIM4gNodeMid, BSIM4bNodePrime); - TSTALLOC(BSIM4DPgmPtr, BSIM4dNodePrime, BSIM4gNodeMid); - TSTALLOC(BSIM4GPgmPtr, BSIM4gNodePrime, BSIM4gNodeMid); - TSTALLOC(BSIM4GEgmPtr, BSIM4gNodeExt, BSIM4gNodeMid); - TSTALLOC(BSIM4SPgmPtr, BSIM4sNodePrime, BSIM4gNodeMid); - TSTALLOC(BSIM4BPgmPtr, BSIM4bNodePrime, BSIM4gNodeMid); - } - - if ((here->BSIM4rbodyMod ==1) || (here->BSIM4rbodyMod ==2)) - { TSTALLOC(BSIM4DPdbPtr, BSIM4dNodePrime, BSIM4dbNode); - TSTALLOC(BSIM4SPsbPtr, BSIM4sNodePrime, BSIM4sbNode); - - TSTALLOC(BSIM4DBdpPtr, BSIM4dbNode, BSIM4dNodePrime); - TSTALLOC(BSIM4DBdbPtr, BSIM4dbNode, BSIM4dbNode); - TSTALLOC(BSIM4DBbpPtr, BSIM4dbNode, BSIM4bNodePrime); - TSTALLOC(BSIM4DBbPtr, BSIM4dbNode, BSIM4bNode); - - TSTALLOC(BSIM4BPdbPtr, BSIM4bNodePrime, BSIM4dbNode); - TSTALLOC(BSIM4BPbPtr, BSIM4bNodePrime, BSIM4bNode); - TSTALLOC(BSIM4BPsbPtr, BSIM4bNodePrime, BSIM4sbNode); - - TSTALLOC(BSIM4SBspPtr, BSIM4sbNode, BSIM4sNodePrime); - TSTALLOC(BSIM4SBbpPtr, BSIM4sbNode, BSIM4bNodePrime); - TSTALLOC(BSIM4SBbPtr, BSIM4sbNode, BSIM4bNode); - TSTALLOC(BSIM4SBsbPtr, BSIM4sbNode, BSIM4sbNode); - - TSTALLOC(BSIM4BdbPtr, BSIM4bNode, BSIM4dbNode); - TSTALLOC(BSIM4BbpPtr, BSIM4bNode, BSIM4bNodePrime); - TSTALLOC(BSIM4BsbPtr, BSIM4bNode, BSIM4sbNode); - TSTALLOC(BSIM4BbPtr, BSIM4bNode, BSIM4bNode); - } - - if (model->BSIM4rdsMod) - { TSTALLOC(BSIM4DgpPtr, BSIM4dNode, BSIM4gNodePrime); - TSTALLOC(BSIM4DspPtr, BSIM4dNode, BSIM4sNodePrime); - TSTALLOC(BSIM4DbpPtr, BSIM4dNode, BSIM4bNodePrime); - TSTALLOC(BSIM4SdpPtr, BSIM4sNode, BSIM4dNodePrime); - TSTALLOC(BSIM4SgpPtr, BSIM4sNode, BSIM4gNodePrime); - TSTALLOC(BSIM4SbpPtr, BSIM4sNode, BSIM4bNodePrime); - } - } - } - -#ifdef USE_OMP - InstCount = 0; - model = (BSIM4model*)inModel; - /* loop through all the BSIM4 device models - to count the number of instances */ - - for( ; model != NULL; model = BSIM4nextModel(model)) - { - /* loop through all the instances of the model */ - for (here = BSIM4instances(model); here != NULL ; - here=BSIM4nextInstance(here)) - { - InstCount++; - } - model->BSIM4InstCount = 0; - model->BSIM4InstanceArray = NULL; - } - InstArray = TMALLOC(BSIM4instance*, InstCount); - model = (BSIM4model*)inModel; - /* store this in the first model only */ - model->BSIM4InstCount = InstCount; - model->BSIM4InstanceArray = InstArray; - idx = 0; - for( ; model != NULL; model = BSIM4nextModel(model)) - { - /* loop through all the instances of the model */ - for (here = BSIM4instances(model); here != NULL ; - here=BSIM4nextInstance(here)) - { - InstArray[idx] = here; - idx++; - } - } -#endif - - return(OK); -} - -int -BSIM4unsetup( -GENmodel *inModel, -CKTcircuit *ckt) -{ -#ifndef HAS_BATCHSIM - BSIM4model *model; - BSIM4instance *here; - -#ifdef USE_OMP - model = (BSIM4model*)inModel; - tfree(model->BSIM4InstanceArray); -#endif - - for (model = (BSIM4model *)inModel; model != NULL; - model = BSIM4nextModel(model)) - { - for (here = BSIM4instances(model); here != NULL; - here=BSIM4nextInstance(here)) - { - if (here->BSIM4qNode > 0) - CKTdltNNum(ckt, here->BSIM4qNode); - here->BSIM4qNode = 0; - - if (here->BSIM4sbNode > 0 && - here->BSIM4sbNode != here->BSIM4bNode) - CKTdltNNum(ckt, here->BSIM4sbNode); - here->BSIM4sbNode = 0; - - if (here->BSIM4bNodePrime > 0 && - here->BSIM4bNodePrime != here->BSIM4bNode) - CKTdltNNum(ckt, here->BSIM4bNodePrime); - here->BSIM4bNodePrime = 0; - - if (here->BSIM4dbNode > 0 && - here->BSIM4dbNode != here->BSIM4bNode) - CKTdltNNum(ckt, here->BSIM4dbNode); - here->BSIM4dbNode = 0; - - if (here->BSIM4gNodeMid > 0 && - here->BSIM4gNodeMid != here->BSIM4gNodeExt) - CKTdltNNum(ckt, here->BSIM4gNodeMid); - here->BSIM4gNodeMid = 0; - - if (here->BSIM4gNodePrime > 0 && - here->BSIM4gNodePrime != here->BSIM4gNodeExt) - CKTdltNNum(ckt, here->BSIM4gNodePrime); - here->BSIM4gNodePrime = 0; - - if (here->BSIM4sNodePrime > 0 - && here->BSIM4sNodePrime != here->BSIM4sNode) - CKTdltNNum(ckt, here->BSIM4sNodePrime); - here->BSIM4sNodePrime = 0; - - if (here->BSIM4dNodePrime > 0 - && here->BSIM4dNodePrime != here->BSIM4dNode) - CKTdltNNum(ckt, here->BSIM4dNodePrime); - here->BSIM4dNodePrime = 0; - } - } -#endif - return OK; -} diff --git a/src/spicelib/devices/bsim4/b4soachk.c b/src/spicelib/devices/bsim4/b4soachk.c deleted file mode 100644 index 8af08a64e..000000000 --- a/src/spicelib/devices/bsim4/b4soachk.c +++ /dev/null @@ -1,341 +0,0 @@ -/********** -Copyright 2013 Dietmar Warning. All rights reserved. -Author: 2013 Dietmar Warning -**********/ - -#include "ngspice/ngspice.h" -#include "ngspice/cktdefs.h" -#include "bsim4def.h" -#include "ngspice/trandefs.h" -#include "ngspice/sperror.h" -#include "ngspice/suffix.h" -#include "ngspice/cpdefs.h" - - -int -BSIM4soaCheck(CKTcircuit *ckt, GENmodel *inModel) -{ - BSIM4model *model = (BSIM4model *) inModel; - BSIM4instance *here; - double vgs, vgd, vgb, vds, vbs, vbd; /* actual mos voltages */ - int maxwarns; - static int warns_vgs = 0, warns_vgd = 0, warns_vgb = 0, warns_vds = 0, warns_vbs = 0, warns_vbd = 0; - - if (!ckt) { - warns_vgs = 0; - warns_vgd = 0; - warns_vgb = 0; - warns_vds = 0; - warns_vbs = 0; - warns_vbd = 0; - return OK; - } - - maxwarns = ckt->CKTsoaMaxWarns; - - for (; model; model = BSIM4nextModel(model)) { - - for (here = BSIM4instances(model); here; here = BSIM4nextInstance(here)) { - - vgs = ckt->CKTrhsOld [here->BSIM4gNodePrime] - - ckt->CKTrhsOld [here->BSIM4sNodePrime]; - - vgd = ckt->CKTrhsOld [here->BSIM4gNodePrime] - - ckt->CKTrhsOld [here->BSIM4dNodePrime]; - - vgb = ckt->CKTrhsOld [here->BSIM4gNodePrime] - - ckt->CKTrhsOld [here->BSIM4bNodePrime]; - - vds = ckt->CKTrhsOld [here->BSIM4dNodePrime] - - ckt->CKTrhsOld [here->BSIM4sNodePrime]; - - vbs = ckt->CKTrhsOld [here->BSIM4bNodePrime] - - ckt->CKTrhsOld [here->BSIM4sNodePrime]; - - vbd = ckt->CKTrhsOld [here->BSIM4bNodePrime] - - ckt->CKTrhsOld [here->BSIM4dNodePrime]; - - if (!model->BSIM4vgsrMaxGiven) { - if (fabs(vgs) > model->BSIM4vgsMax) - if (warns_vgs < maxwarns) { - soa_printf(ckt, (GENinstance*) here, - "Vgs=%g has exceeded Vgs_max=%g\n", - vgs, model->BSIM4vgsMax); - warns_vgs++; - } - if (!model->BSIM4vgbMaxGiven) { - if (fabs(vgb) > model->BSIM4vgsMax) - if (warns_vgb < maxwarns) { - soa_printf(ckt, (GENinstance*) here, - "Vgb=%g has exceeded Vgs_max=%g\n", - vgb, model->BSIM4vgsMax); - warns_vgb++; - } - } else { - if (fabs(vgb) > model->BSIM4vgbMax) - if (warns_vgb < maxwarns) { - soa_printf(ckt, (GENinstance*) here, - "Vgb=%g has exceeded Vgb_max=%g\n", - vgb, model->BSIM4vgbMax); - warns_vgb++; - } - } - } else { - if (model->BSIM4type > 0) { - if (vgs > model->BSIM4vgsMax) - if (warns_vgs < maxwarns) { - soa_printf(ckt, (GENinstance*) here, - "Vgs=%g has exceeded Vgs_max=%g\n", - vgs, model->BSIM4vgsMax); - warns_vgs++; - } - if (-1*vgs > model->BSIM4vgsrMax) - if (warns_vgs < maxwarns) { - soa_printf(ckt, (GENinstance*) here, - "Vgs=%g has exceeded Vgsr_max=%g\n", - vgs, model->BSIM4vgsrMax); - warns_vgs++; - } - } else { - if (vgs > model->BSIM4vgsrMax) - if (warns_vgs < maxwarns) { - soa_printf(ckt, (GENinstance*) here, - "Vgs=%g has exceeded Vgsr_max=%g\n", - vgs, model->BSIM4vgsrMax); - warns_vgs++; - } - if (-1*vgs > model->BSIM4vgsMax) - if (warns_vgs < maxwarns) { - soa_printf(ckt, (GENinstance*) here, - "Vgs=%g has exceeded Vgs_max=%g\n", - vgs, model->BSIM4vgsMax); - warns_vgs++; - } - } - } - - if (!model->BSIM4vgdrMaxGiven) { - if (fabs(vgd) > model->BSIM4vgdMax) - if (warns_vgd < maxwarns) { - soa_printf(ckt, (GENinstance*) here, - "Vgd=%g has exceeded Vgd_max=%g\n", - vgd, model->BSIM4vgdMax); - warns_vgd++; - } - } else { - if (model->BSIM4type > 0) { - if (vgd > model->BSIM4vgdMax) - if (warns_vgd < maxwarns) { - soa_printf(ckt, (GENinstance*) here, - "Vgd=%g has exceeded Vgd_max=%g\n", - vgd, model->BSIM4vgdMax); - warns_vgd++; - } - if (-1*vgd > model->BSIM4vgdrMax) - if (warns_vgd < maxwarns) { - soa_printf(ckt, (GENinstance*) here, - "Vgd=%g has exceeded Vgdr_max=%g\n", - vgd, model->BSIM4vgdrMax); - warns_vgd++; - } - } else { - if (vgd > model->BSIM4vgdrMax) - if (warns_vgd < maxwarns) { - soa_printf(ckt, (GENinstance*) here, - "Vgd=%g has exceeded Vgdr_max=%g\n", - vgd, model->BSIM4vgdrMax); - warns_vgd++; - } - if (-1*vgd > model->BSIM4vgdMax) - if (warns_vgd < maxwarns) { - soa_printf(ckt, (GENinstance*) here, - "Vgd=%g has exceeded Vgd_max=%g\n", - vgd, model->BSIM4vgdMax); - warns_vgd++; - } - } - } - - if (fabs(vds) > model->BSIM4vdsMax) - if (warns_vds < maxwarns) { - soa_printf(ckt, (GENinstance*) here, - "Vds=%g has exceeded Vds_max=%g\n", - vds, model->BSIM4vdsMax); - warns_vds++; - } - - if (!model->BSIM4vgbrMaxGiven) { - if (fabs(vgb) > model->BSIM4vgbMax) - if (warns_vgb < maxwarns) { - soa_printf(ckt, (GENinstance*) here, - "Vgb=%g has exceeded Vgb_max=%g\n", - vgb, model->BSIM4vgbMax); - warns_vgb++; - } - } else { - if (model->BSIM4type > 0) { - if (vgb > model->BSIM4vgbMax) - if (warns_vgb < maxwarns) { - soa_printf(ckt, (GENinstance*) here, - "Vgb=%g has exceeded Vgb_max=%g\n", - vgb, model->BSIM4vgbMax); - warns_vgb++; - } - if (-1*vgb > model->BSIM4vgbrMax) - if (warns_vgb < maxwarns) { - soa_printf(ckt, (GENinstance*) here, - "Vgb=%g has exceeded Vgbr_max=%g\n", - vgb, model->BSIM4vgbrMax); - warns_vgb++; - } - } else { - if (vgb > model->BSIM4vgbrMax) - if (warns_vgb < maxwarns) { - soa_printf(ckt, (GENinstance*) here, - "Vgb=%g has exceeded Vgbr_max=%g\n", - vgb, model->BSIM4vgbrMax); - warns_vgb++; - } - if (-1*vgb > model->BSIM4vgbMax) - if (warns_vgb < maxwarns) { - soa_printf(ckt, (GENinstance*) here, - "Vgb=%g has exceeded Vgb_max=%g\n", - vgb, model->BSIM4vgbMax); - warns_vgb++; - } - } - } - - if (!model->BSIM4vbsrMaxGiven) { - if (!model->BSIM4vbsMaxGiven) { - if (fabs(vbs) > model->BSIM4vbdMax) - if (warns_vbs < maxwarns) { - soa_printf(ckt, (GENinstance*) here, - "Vbs=%g has exceeded Vbd_max=%g\n", - vbs, model->BSIM4vbdMax); - warns_vbs++; - } - } else { - if (fabs(vbs) > model->BSIM4vbsMax) - if (warns_vbs < maxwarns) { - soa_printf(ckt, (GENinstance*) here, - "Vbs=%g has exceeded Vbs_max=%g\n", - vbs, model->BSIM4vbsMax); - warns_vbs++; - } - } - } else { - if (!model->BSIM4vbsMaxGiven) { - if (model->BSIM4type > 0) { - if (vbs > model->BSIM4vbdMax) - if (warns_vbs < maxwarns) { - soa_printf(ckt, (GENinstance*) here, - "Vbs=%g has exceeded Vbd_max=%g\n", - vbs, model->BSIM4vbdMax); - warns_vbs++; - } - if (-1*vbs > model->BSIM4vbsrMax) - if (warns_vbs < maxwarns) { - soa_printf(ckt, (GENinstance*) here, - "Vbs=%g has exceeded Vbsr_max=%g\n", - vbs, model->BSIM4vbsrMax); - warns_vbs++; - } - } else { - if (vbs > model->BSIM4vbsrMax) - if (warns_vbs < maxwarns) { - soa_printf(ckt, (GENinstance*) here, - "Vbs=%g has exceeded Vbsr_max=%g\n", - vbs, model->BSIM4vbsrMax); - warns_vbs++; - } - if (-1*vbs > model->BSIM4vbdMax) - if (warns_vbs < maxwarns) { - soa_printf(ckt, (GENinstance*) here, - "Vbs=%g has exceeded Vbd_max=%g\n", - vbs, model->BSIM4vbdMax); - warns_vbs++; - } - } - } else { - if (model->BSIM4type > 0) { - if (vbs > model->BSIM4vbsMax) - if (warns_vbs < maxwarns) { - soa_printf(ckt, (GENinstance*) here, - "Vbs=%g has exceeded Vbs_max=%g\n", - vbs, model->BSIM4vbsMax); - warns_vbs++; - } - if (-1*vbs > model->BSIM4vbsrMax) - if (warns_vbs < maxwarns) { - soa_printf(ckt, (GENinstance*) here, - "Vbs=%g has exceeded Vbsr_max=%g\n", - vbs, model->BSIM4vbsrMax); - warns_vbs++; - } - } else { - if (vbs > model->BSIM4vbsrMax) - if (warns_vbs < maxwarns) { - soa_printf(ckt, (GENinstance*) here, - "Vbs=%g has exceeded Vbsr_max=%g\n", - vbs, model->BSIM4vbsrMax); - warns_vbs++; - } - if (-1*vbs > model->BSIM4vbsMax) - if (warns_vbs < maxwarns) { - soa_printf(ckt, (GENinstance*) here, - "Vbs=%g has exceeded Vbs_max=%g\n", - vbs, model->BSIM4vbsMax); - warns_vbs++; - } - } - } - } - - if (!model->BSIM4vbdrMaxGiven) { - if (fabs(vbd) > model->BSIM4vbdMax) - if (warns_vbd < maxwarns) { - soa_printf(ckt, (GENinstance*) here, - "Vbd=%g has exceeded Vbd_max=%g\n", - vbd, model->BSIM4vbdMax); - warns_vbd++; - } - } else { - if (model->BSIM4type > 0) { - if (vbd > model->BSIM4vbdMax) - if (warns_vbd < maxwarns) { - soa_printf(ckt, (GENinstance*) here, - "Vbd=%g has exceeded Vbd_max=%g\n", - vbd, model->BSIM4vbdMax); - warns_vbd++; - } - if (-1*vbd > model->BSIM4vbdrMax) - if (warns_vbd < maxwarns) { - soa_printf(ckt, (GENinstance*) here, - "Vbd=%g has exceeded Vbdr_max=%g\n", - vbd, model->BSIM4vbdrMax); - warns_vbd++; - } - } else { - if (vbd > model->BSIM4vbdrMax) - if (warns_vbd < maxwarns) { - soa_printf(ckt, (GENinstance*) here, - "Vbd=%g has exceeded Vbdr_max=%g\n", - vbd, model->BSIM4vbdrMax); - warns_vbd++; - } - if (-1*vbd > model->BSIM4vbdMax) - if (warns_vbd < maxwarns) { - soa_printf(ckt, (GENinstance*) here, - "Vbd=%g has exceeded Vbd_max=%g\n", - vbd, model->BSIM4vbdMax); - warns_vbd++; - } - } - } - - } - } - - return OK; -} diff --git a/src/spicelib/devices/bsim4/b4temp.c b/src/spicelib/devices/bsim4/b4temp.c deleted file mode 100644 index e2afea53c..000000000 --- a/src/spicelib/devices/bsim4/b4temp.c +++ /dev/null @@ -1,2417 +0,0 @@ -/* ****************************************************************************** - * BSIM4 4.8.1 released by Chetan Kumar Dabhi 2/15/2017 * - * BSIM4 Model Equations * - ****************************************************************************** - - ****************************************************************************** - * Copyright 2017 Regents of the University of California. * - * All rights reserved. * - * * - * Project Director: Prof. Chenming Hu. * - * Authors: Gary W. Ng, Weidong Liu, Xuemei Xi, Mohan Dunga, Wenwei Yang * - * Ali Niknejad, Shivendra Singh Parihar, Chetan Kumar Dabhi * - * Yogesh Singh Chauhan, Sayeef Salahuddin, Chenming Hu * - ****************************************************************************** - - ****************************************************************************** - * CMC In-Code Statement * - * * - * The Developer agrees that the following statement will appear in the * - * model code that has been adopted as a CMC Standard. * - * * - * Software is distributed as is, completely without warranty or service * - * support. The University of California and its employees are not liable * - * for the condition or performance of the software. * - * * - * The University of California owns the copyright and grants users a * - * perpetual, irrevocable, worldwide, non-exclusive, royalty-free license * - * with respect to the software as set forth below. * - * * - * The University of California hereby disclaims all implied warranties. * - * * - * The University of California grants the users the right to modify, * - * copy, and redistribute the software and documentation, both within * - * the user's organization and externally, subject to the following * - * restrictions: * - * * - * 1. The users agree not to charge for the University of California code * - * itself but may charge for additions, extensions, or support. * - * * - * 2. In any product based on the software, the users agree to * - * acknowledge the University of California that developed the * - * software. This acknowledgment shall appear in the product * - * documentation. * - * * - * 3. Redistributions to others of source code and documentation must * - * retain the copyright notice, disclaimer, and list of conditions. * - * * - * 4. Redistributions to others in binary form must reproduce the * - * copyright notice, disclaimer, and list of conditions in the * - * documentation and/or other materials provided with the * - * distribution. * - * * - * Agreed to on ______Feb. 15, 2017______________ * - * * - * By: ____University of California, Berkeley___ * - * ____Chenming Hu__________________________ * - * ____Professor in Graduate School ________ * - * * - ****************************************************************************** */ - -#include "ngspice/ngspice.h" -#include "ngspice/smpdefs.h" -#include "ngspice/cktdefs.h" -#include "bsim4def.h" -#include "ngspice/const.h" -#include "ngspice/sperror.h" -#include "ngspice/suffix.h" - -#define Kb 1.3806226e-23 -#define KboQ 8.617087e-5 -#define EPS0 8.85418e-12 -#define EPSSI 1.03594e-10 -#define PI 3.141592654 -#define MAX_EXP 5.834617425e14 -#define MIN_EXP 1.713908431e-15 -#define EXP_THRESHOLD 34.0 -#define Charge_q 1.60219e-19 -#define DELTA 1.0E-9 -#define DEXP(A,B) { \ - if (A > EXP_THRESHOLD) { \ - B = MAX_EXP*(1.0+(A)-EXP_THRESHOLD); \ - } else if (A < -EXP_THRESHOLD) { \ - B = MIN_EXP; \ - } else { \ - B = exp(A); \ - } \ - } - -static int -BSIM4DioIjthVjmEval( -double Nvtm, double Ijth, double Isb, double XExpBV, -double *Vjm) -{ -double Tb, Tc, EVjmovNv; - - Tc = XExpBV; - Tb = 1.0 + Ijth / Isb - Tc; - EVjmovNv = 0.5 * (Tb + sqrt(Tb * Tb + 4.0 * Tc)); - *Vjm = Nvtm * log(EVjmovNv); - -return 0; -} - - -int -BSIM4temp( -GENmodel *inModel, -CKTcircuit *ckt) -{ -BSIM4model *model = (BSIM4model*) inModel; -BSIM4instance *here; -struct bsim4SizeDependParam *pSizeDependParamKnot, *pLastKnot, *pParam=NULL; -double tmp, tmp1, tmp2, tmp3, Eg, Eg0, ni, epssub; -double T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, Lnew=0.0, Wnew; -double delTemp, Temp, TRatio, Inv_L, Inv_W, Inv_LW, Vtm0, Tnom; -double dumPs, dumPd, dumAs, dumAd, PowWeffWr; -double DMCGeff, DMCIeff, DMDGeff; -double Nvtms, Nvtmd, SourceSatCurrent, DrainSatCurrent; -double T10, T11; -double Inv_saref, Inv_sbref, Inv_sa, Inv_sb, rho, Ldrn, dvth0_lod; -double W_tmp, Inv_ODeff, OD_offset, dk2_lod, deta0_lod; -double lnl, lnw, lnnf, rbpbx, rbpby, rbsbx, rbsby, rbdbx, rbdby,bodymode; -double kvsat, wlod, sceff, Wdrn; -double V0, lt1, ltw, Theta0, Delt_vth, Vth_NarrowW, Lpe_Vb, Vth; -double n,n0, Vgsteff, Vgs_eff, niter, toxpf, toxpi, Tcen, toxe, epsrox, vddeot; -double vtfbphi2eot, phieot, TempRatioeot, Vtm0eot, Vtmeot,vbieot; - -int Size_Not_Found, i; - - /* loop through all the BSIM4 device models */ - for (; model != NULL; model = BSIM4nextModel(model)) - { Temp = ckt->CKTtemp; - if (model->BSIM4SbulkJctPotential < 0.1) - { model->BSIM4SbulkJctPotential = 0.1; - fprintf(stderr, "Given pbs is less than 0.1. Pbs is set to 0.1.\n"); - } - if (model->BSIM4SsidewallJctPotential < 0.1) - { model->BSIM4SsidewallJctPotential = 0.1; - fprintf(stderr, "Given pbsws is less than 0.1. Pbsws is set to 0.1.\n"); - } - if (model->BSIM4SGatesidewallJctPotential < 0.1) - { model->BSIM4SGatesidewallJctPotential = 0.1; - fprintf(stderr, "Given pbswgs is less than 0.1. Pbswgs is set to 0.1.\n"); - } - - if (model->BSIM4DbulkJctPotential < 0.1) - { model->BSIM4DbulkJctPotential = 0.1; - fprintf(stderr, "Given pbd is less than 0.1. Pbd is set to 0.1.\n"); - } - if (model->BSIM4DsidewallJctPotential < 0.1) - { model->BSIM4DsidewallJctPotential = 0.1; - fprintf(stderr, "Given pbswd is less than 0.1. Pbswd is set to 0.1.\n"); - } - if (model->BSIM4DGatesidewallJctPotential < 0.1) - { model->BSIM4DGatesidewallJctPotential = 0.1; - fprintf(stderr, "Given pbswgd is less than 0.1. Pbswgd is set to 0.1.\n"); - } - - if(model->BSIM4mtrlMod == 0) - { - if ((model->BSIM4toxeGiven) && (model->BSIM4toxpGiven) && (model->BSIM4dtoxGiven) - && (model->BSIM4toxe != (model->BSIM4toxp + model->BSIM4dtox))) - printf("Warning: toxe, toxp and dtox all given and toxe != toxp + dtox; dtox ignored.\n"); - else if ((model->BSIM4toxeGiven) && (!model->BSIM4toxpGiven)) - model->BSIM4toxp = model->BSIM4toxe - model->BSIM4dtox; - else if ((!model->BSIM4toxeGiven) && (model->BSIM4toxpGiven)){ - model->BSIM4toxe = model->BSIM4toxp + model->BSIM4dtox; - if (!model->BSIM4toxmGiven) /* v4.7 */ - model->BSIM4toxm = model->BSIM4toxe; - } - } - else if(model->BSIM4mtrlCompatMod != 0) /* v4.7 */ - { - T0 = model->BSIM4epsrox / 3.9; - if ((model->BSIM4eotGiven) && (model->BSIM4toxpGiven) && (model->BSIM4dtoxGiven) - && (ABS(model->BSIM4eot * T0 - (model->BSIM4toxp + model->BSIM4dtox)) > 1.0e-20)) - { - printf("Warning: eot, toxp and dtox all given and eot * EPSROX / 3.9 != toxp + dtox; dtox ignored.\n"); - } - else if ((model->BSIM4eotGiven) && (!model->BSIM4toxpGiven)) - model->BSIM4toxp = T0 * model->BSIM4eot - model->BSIM4dtox; - else if ((!model->BSIM4eotGiven) && (model->BSIM4toxpGiven)){ - model->BSIM4eot = (model->BSIM4toxp + model->BSIM4dtox) / T0; - if (!model->BSIM4toxmGiven) - model->BSIM4toxm = model->BSIM4eot; - } - } - - if(model->BSIM4mtrlMod) - { - epsrox = 3.9; - toxe = model->BSIM4eot; - epssub = EPS0 * model->BSIM4epsrsub; - } - else - { - epsrox = model->BSIM4epsrox; - toxe = model->BSIM4toxe; - epssub = EPSSI; - } - - - model->BSIM4coxe = epsrox * EPS0 / toxe; - if(model->BSIM4mtrlMod == 0 || model->BSIM4mtrlCompatMod != 0) - model->BSIM4coxp = model->BSIM4epsrox * EPS0 / model->BSIM4toxp; - - if (!model->BSIM4cgdoGiven) - { if (model->BSIM4dlcGiven && (model->BSIM4dlc > 0.0)) - model->BSIM4cgdo = model->BSIM4dlc * model->BSIM4coxe - - model->BSIM4cgdl ; - else - model->BSIM4cgdo = 0.6 * model->BSIM4xj * model->BSIM4coxe; - } - if (!model->BSIM4cgsoGiven) - { if (model->BSIM4dlcGiven && (model->BSIM4dlc > 0.0)) - model->BSIM4cgso = model->BSIM4dlc * model->BSIM4coxe - - model->BSIM4cgsl ; - else - model->BSIM4cgso = 0.6 * model->BSIM4xj * model->BSIM4coxe; - } - if (!model->BSIM4cgboGiven) - model->BSIM4cgbo = 2.0 * model->BSIM4dwc * model->BSIM4coxe; - - struct bsim4SizeDependParam *p = model->pSizeDependParamKnot; - while (p) { - struct bsim4SizeDependParam *next_p = p->pNext; - FREE(p); - p = next_p; - } - model->pSizeDependParamKnot = NULL; - pLastKnot = NULL; - - Tnom = model->BSIM4tnom; - TRatio = Temp / Tnom; - - model->BSIM4vcrit = CONSTvt0 * log(CONSTvt0 / (CONSTroot2 * 1.0e-14)); - model->BSIM4factor1 = sqrt(epssub / (epsrox * EPS0)* toxe); - - Vtm0 = model->BSIM4vtm0 = KboQ * Tnom; - - if(model->BSIM4mtrlMod==0) - { - Eg0 = 1.16 - 7.02e-4 * Tnom * Tnom / (Tnom + 1108.0); - ni = 1.45e10 * (Tnom / 300.15) * sqrt(Tnom / 300.15) - * exp(21.5565981 - Eg0 / (2.0 * Vtm0)); - } - else - { - Eg0 = model->BSIM4bg0sub - model->BSIM4tbgasub * Tnom * Tnom - / (Tnom + model->BSIM4tbgbsub); - T0 = model->BSIM4bg0sub - model->BSIM4tbgasub * 90090.0225 - / (300.15 + model->BSIM4tbgbsub); - ni = model->BSIM4ni0sub * (Tnom / 300.15) * sqrt(Tnom / 300.15) - * exp((T0 - Eg0) / (2.0 * Vtm0)); - } - - model->BSIM4Eg0 = Eg0; - model->BSIM4vtm = KboQ * Temp; - if(model->BSIM4mtrlMod == 0) - Eg = 1.16 - 7.02e-4 * Temp * Temp / (Temp + 1108.0); - else - Eg = model->BSIM4bg0sub - model->BSIM4tbgasub * Temp * Temp - / (Temp + model->BSIM4tbgbsub); - if (Temp != Tnom) - { T0 = Eg0 / Vtm0 - Eg / model->BSIM4vtm; - T1 = log(Temp / Tnom); - T2 = T0 + model->BSIM4SjctTempExponent * T1; - T3 = exp(T2 / model->BSIM4SjctEmissionCoeff); - model->BSIM4SjctTempSatCurDensity = model->BSIM4SjctSatCurDensity - * T3; - model->BSIM4SjctSidewallTempSatCurDensity - = model->BSIM4SjctSidewallSatCurDensity * T3; - model->BSIM4SjctGateSidewallTempSatCurDensity - = model->BSIM4SjctGateSidewallSatCurDensity * T3; - - T2 = T0 + model->BSIM4DjctTempExponent * T1; - T3 = exp(T2 / model->BSIM4DjctEmissionCoeff); - model->BSIM4DjctTempSatCurDensity = model->BSIM4DjctSatCurDensity - * T3; - model->BSIM4DjctSidewallTempSatCurDensity - = model->BSIM4DjctSidewallSatCurDensity * T3; - model->BSIM4DjctGateSidewallTempSatCurDensity - = model->BSIM4DjctGateSidewallSatCurDensity * T3; - } - else - { model->BSIM4SjctTempSatCurDensity = model->BSIM4SjctSatCurDensity; - model->BSIM4SjctSidewallTempSatCurDensity - = model->BSIM4SjctSidewallSatCurDensity; - model->BSIM4SjctGateSidewallTempSatCurDensity - = model->BSIM4SjctGateSidewallSatCurDensity; - model->BSIM4DjctTempSatCurDensity = model->BSIM4DjctSatCurDensity; - model->BSIM4DjctSidewallTempSatCurDensity - = model->BSIM4DjctSidewallSatCurDensity; - model->BSIM4DjctGateSidewallTempSatCurDensity - = model->BSIM4DjctGateSidewallSatCurDensity; - } - - if (model->BSIM4SjctTempSatCurDensity < 0.0) - model->BSIM4SjctTempSatCurDensity = 0.0; - if (model->BSIM4SjctSidewallTempSatCurDensity < 0.0) - model->BSIM4SjctSidewallTempSatCurDensity = 0.0; - if (model->BSIM4SjctGateSidewallTempSatCurDensity < 0.0) - model->BSIM4SjctGateSidewallTempSatCurDensity = 0.0; - if (model->BSIM4DjctTempSatCurDensity < 0.0) - model->BSIM4DjctTempSatCurDensity = 0.0; - if (model->BSIM4DjctSidewallTempSatCurDensity < 0.0) - model->BSIM4DjctSidewallTempSatCurDensity = 0.0; - if (model->BSIM4DjctGateSidewallTempSatCurDensity < 0.0) - model->BSIM4DjctGateSidewallTempSatCurDensity = 0.0; - - /* Temperature dependence of D/B and S/B diode capacitance begins */ - delTemp = ckt->CKTtemp - model->BSIM4tnom; - T0 = model->BSIM4tcj * delTemp; - if (T0 >= -1.0) - { model->BSIM4SunitAreaTempJctCap = model->BSIM4SunitAreaJctCap *(1.0 + T0); /*bug_fix -JX */ - model->BSIM4DunitAreaTempJctCap = model->BSIM4DunitAreaJctCap *(1.0 + T0); - } - else - { if (model->BSIM4SunitAreaJctCap > 0.0) - { model->BSIM4SunitAreaTempJctCap = 0.0; - fprintf(stderr, "Temperature effect has caused cjs to be negative. Cjs is clamped to zero.\n"); - } - if (model->BSIM4DunitAreaJctCap > 0.0) - { model->BSIM4DunitAreaTempJctCap = 0.0; - fprintf(stderr, "Temperature effect has caused cjd to be negative. Cjd is clamped to zero.\n"); - } - } - T0 = model->BSIM4tcjsw * delTemp; - if (model->BSIM4SunitLengthSidewallJctCap < 0.0)/*4.6.2*/ - {model->BSIM4SunitLengthSidewallJctCap = 0.0; - fprintf(stderr, "CJSWS is negative. Cjsws is clamped to zero.\n");} - if (model->BSIM4DunitLengthSidewallJctCap < 0.0) - {model->BSIM4DunitLengthSidewallJctCap = 0.0; - fprintf(stderr, "CJSWD is negative. Cjswd is clamped to zero.\n");} - if (T0 >= -1.0) - { model->BSIM4SunitLengthSidewallTempJctCap = model->BSIM4SunitLengthSidewallJctCap *(1.0 + T0); - model->BSIM4DunitLengthSidewallTempJctCap = model->BSIM4DunitLengthSidewallJctCap *(1.0 + T0); - } - else - { if (model->BSIM4SunitLengthSidewallJctCap > 0.0) - { model->BSIM4SunitLengthSidewallTempJctCap = 0.0; - fprintf(stderr, "Temperature effect has caused cjsws to be negative. Cjsws is clamped to zero.\n"); - } - if (model->BSIM4DunitLengthSidewallJctCap > 0.0) - { model->BSIM4DunitLengthSidewallTempJctCap = 0.0; - fprintf(stderr, "Temperature effect has caused cjswd to be negative. Cjswd is clamped to zero.\n"); - } - } - T0 = model->BSIM4tcjswg * delTemp; - if (T0 >= -1.0) - { model->BSIM4SunitLengthGateSidewallTempJctCap = model->BSIM4SunitLengthGateSidewallJctCap *(1.0 + T0); - model->BSIM4DunitLengthGateSidewallTempJctCap = model->BSIM4DunitLengthGateSidewallJctCap *(1.0 + T0); - } - else - { if (model->BSIM4SunitLengthGateSidewallJctCap > 0.0) - { model->BSIM4SunitLengthGateSidewallTempJctCap = 0.0; - fprintf(stderr, "Temperature effect has caused cjswgs to be negative. Cjswgs is clamped to zero.\n"); - } - if (model->BSIM4DunitLengthGateSidewallJctCap > 0.0) - { model->BSIM4DunitLengthGateSidewallTempJctCap = 0.0; - fprintf(stderr, "Temperature effect has caused cjswgd to be negative. Cjswgd is clamped to zero.\n"); - } - } - - model->BSIM4PhiBS = model->BSIM4SbulkJctPotential - - model->BSIM4tpb * delTemp; - if (model->BSIM4PhiBS < 0.01) - { model->BSIM4PhiBS = 0.01; - fprintf(stderr, "Temperature effect has caused pbs to be less than 0.01. Pbs is clamped to 0.01.\n"); - } - model->BSIM4PhiBD = model->BSIM4DbulkJctPotential - - model->BSIM4tpb * delTemp; - if (model->BSIM4PhiBD < 0.01) - { model->BSIM4PhiBD = 0.01; - fprintf(stderr, "Temperature effect has caused pbd to be less than 0.01. Pbd is clamped to 0.01.\n"); - } - - model->BSIM4PhiBSWS = model->BSIM4SsidewallJctPotential - - model->BSIM4tpbsw * delTemp; - if (model->BSIM4PhiBSWS <= 0.01) - { model->BSIM4PhiBSWS = 0.01; - fprintf(stderr, "Temperature effect has caused pbsws to be less than 0.01. Pbsws is clamped to 0.01.\n"); - } - model->BSIM4PhiBSWD = model->BSIM4DsidewallJctPotential - - model->BSIM4tpbsw * delTemp; - if (model->BSIM4PhiBSWD <= 0.01) - { model->BSIM4PhiBSWD = 0.01; - fprintf(stderr, "Temperature effect has caused pbswd to be less than 0.01. Pbswd is clamped to 0.01.\n"); - } - - model->BSIM4PhiBSWGS = model->BSIM4SGatesidewallJctPotential - - model->BSIM4tpbswg * delTemp; - if (model->BSIM4PhiBSWGS <= 0.01) - { model->BSIM4PhiBSWGS = 0.01; - fprintf(stderr, "Temperature effect has caused pbswgs to be less than 0.01. Pbswgs is clamped to 0.01.\n"); - } - model->BSIM4PhiBSWGD = model->BSIM4DGatesidewallJctPotential - - model->BSIM4tpbswg * delTemp; - if (model->BSIM4PhiBSWGD <= 0.01) - { model->BSIM4PhiBSWGD = 0.01; - fprintf(stderr, "Temperature effect has caused pbswgd to be less than 0.01. Pbswgd is clamped to 0.01.\n"); - } /* End of junction capacitance */ - - - if (model->BSIM4ijthdfwd <= 0.0) - { model->BSIM4ijthdfwd = 0.0; - fprintf(stderr, "Ijthdfwd reset to %g.\n", model->BSIM4ijthdfwd); - } - if (model->BSIM4ijthsfwd <= 0.0) - { model->BSIM4ijthsfwd = 0.0; - fprintf(stderr, "Ijthsfwd reset to %g.\n", model->BSIM4ijthsfwd); - } - if (model->BSIM4ijthdrev <= 0.0) - { model->BSIM4ijthdrev = 0.0; - fprintf(stderr, "Ijthdrev reset to %g.\n", model->BSIM4ijthdrev); - } - if (model->BSIM4ijthsrev <= 0.0) - { model->BSIM4ijthsrev = 0.0; - fprintf(stderr, "Ijthsrev reset to %g.\n", model->BSIM4ijthsrev); - } - - if ((model->BSIM4xjbvd <= 0.0) && (model->BSIM4dioMod == 2)) - { model->BSIM4xjbvd = 0.0; - fprintf(stderr, "Xjbvd reset to %g.\n", model->BSIM4xjbvd); - } - else if ((model->BSIM4xjbvd < 0.0) && (model->BSIM4dioMod == 0)) - { model->BSIM4xjbvd = 0.0; - fprintf(stderr, "Xjbvd reset to %g.\n", model->BSIM4xjbvd); - } - - if (model->BSIM4bvd <= 0.0) /*4.6.2*/ - { model->BSIM4bvd = 0.0; - fprintf(stderr, "BVD reset to %g.\n", model->BSIM4bvd); - } - - if ((model->BSIM4xjbvs <= 0.0) && (model->BSIM4dioMod == 2)) - { model->BSIM4xjbvs = 0.0; - fprintf(stderr, "Xjbvs reset to %g.\n", model->BSIM4xjbvs); - } - else if ((model->BSIM4xjbvs < 0.0) && (model->BSIM4dioMod == 0)) - { model->BSIM4xjbvs = 0.0; - fprintf(stderr, "Xjbvs reset to %g.\n", model->BSIM4xjbvs); - } - - if (model->BSIM4bvs <= 0.0) - { model->BSIM4bvs = 0.0; - fprintf(stderr, "BVS reset to %g.\n", model->BSIM4bvs); - } - - - /* loop through all the instances of the model */ - for (here = BSIM4instances(model); here != NULL; - here = BSIM4nextInstance(here)) - { - pSizeDependParamKnot = model->pSizeDependParamKnot; - Size_Not_Found = 1; - while ((pSizeDependParamKnot != NULL) && Size_Not_Found) - { if ((here->BSIM4l == pSizeDependParamKnot->Length) - && (here->BSIM4w == pSizeDependParamKnot->Width) - && (here->BSIM4nf == pSizeDependParamKnot->NFinger)) - { Size_Not_Found = 0; - here->pParam = pSizeDependParamKnot; - pParam = here->pParam; /*bug-fix */ - } - else - { pLastKnot = pSizeDependParamKnot; - pSizeDependParamKnot = pSizeDependParamKnot->pNext; - } - } - - /* stress effect */ - Ldrn = here->BSIM4l; - Wdrn = here->BSIM4w / here->BSIM4nf; - - if (Size_Not_Found) - { pParam = TMALLOC(struct bsim4SizeDependParam, 1); - if (pLastKnot == NULL) - model->pSizeDependParamKnot = pParam; - else - pLastKnot->pNext = pParam; - pParam->pNext = NULL; - here->pParam = pParam; - - pParam->Length = here->BSIM4l; - pParam->Width = here->BSIM4w; - pParam->NFinger = here->BSIM4nf; - Lnew = here->BSIM4l + model->BSIM4xl ; - Wnew = here->BSIM4w / here->BSIM4nf + model->BSIM4xw; - - T0 = pow(Lnew, model->BSIM4Lln); - T1 = pow(Wnew, model->BSIM4Lwn); - tmp1 = model->BSIM4Ll / T0 + model->BSIM4Lw / T1 - + model->BSIM4Lwl / (T0 * T1); - pParam->BSIM4dl = model->BSIM4Lint + tmp1; - tmp2 = model->BSIM4Llc / T0 + model->BSIM4Lwc / T1 - + model->BSIM4Lwlc / (T0 * T1); - pParam->BSIM4dlc = model->BSIM4dlc + tmp2; - - T2 = pow(Lnew, model->BSIM4Wln); - T3 = pow(Wnew, model->BSIM4Wwn); - tmp1 = model->BSIM4Wl / T2 + model->BSIM4Ww / T3 - + model->BSIM4Wwl / (T2 * T3); - pParam->BSIM4dw = model->BSIM4Wint + tmp1; - tmp2 = model->BSIM4Wlc / T2 + model->BSIM4Wwc / T3 - + model->BSIM4Wwlc / (T2 * T3); - pParam->BSIM4dwc = model->BSIM4dwc + tmp2; - pParam->BSIM4dwj = model->BSIM4dwj + tmp2; - - pParam->BSIM4leff = Lnew - 2.0 * pParam->BSIM4dl; - if (pParam->BSIM4leff <= 0.0) - { - SPfrontEnd->IFerrorf(ERR_FATAL, - "BSIM4: mosfet %s, model %s: Effective channel length <= 0", - model->BSIM4modName, here->BSIM4name); - return(E_BADPARM); - } - - pParam->BSIM4weff = Wnew - 2.0 * pParam->BSIM4dw; - if (pParam->BSIM4weff <= 0.0) - { - SPfrontEnd->IFerrorf(ERR_FATAL, - "BSIM4: mosfet %s, model %s: Effective channel width <= 0", - model->BSIM4modName, here->BSIM4name); - return(E_BADPARM); - } - - pParam->BSIM4leffCV = Lnew - 2.0 * pParam->BSIM4dlc; - if (pParam->BSIM4leffCV <= 0.0) - { - SPfrontEnd->IFerrorf(ERR_FATAL, - "BSIM4: mosfet %s, model %s: Effective channel length for C-V <= 0", - model->BSIM4modName, here->BSIM4name); - return(E_BADPARM); - } - - pParam->BSIM4weffCV = Wnew - 2.0 * pParam->BSIM4dwc; - if (pParam->BSIM4weffCV <= 0.0) - { - SPfrontEnd->IFerrorf(ERR_FATAL, - "BSIM4: mosfet %s, model %s: Effective channel width for C-V <= 0", - model->BSIM4modName, here->BSIM4name); - return(E_BADPARM); - } - - pParam->BSIM4weffCJ = Wnew - 2.0 * pParam->BSIM4dwj; - if (pParam->BSIM4weffCJ <= 0.0) - { - SPfrontEnd->IFerrorf(ERR_FATAL, - "BSIM4: mosfet %s, model %s: Effective channel width for S/D junctions <= 0", - model->BSIM4modName, here->BSIM4name); - return(E_BADPARM); - } - - - if (model->BSIM4binUnit == 1) - { Inv_L = 1.0e-6 / pParam->BSIM4leff; - Inv_W = 1.0e-6 / pParam->BSIM4weff; - Inv_LW = 1.0e-12 / (pParam->BSIM4leff - * pParam->BSIM4weff); - } - else - { Inv_L = 1.0 / pParam->BSIM4leff; - Inv_W = 1.0 / pParam->BSIM4weff; - Inv_LW = 1.0 / (pParam->BSIM4leff - * pParam->BSIM4weff); - } - pParam->BSIM4cdsc = model->BSIM4cdsc - + model->BSIM4lcdsc * Inv_L - + model->BSIM4wcdsc * Inv_W - + model->BSIM4pcdsc * Inv_LW; - pParam->BSIM4cdscb = model->BSIM4cdscb - + model->BSIM4lcdscb * Inv_L - + model->BSIM4wcdscb * Inv_W - + model->BSIM4pcdscb * Inv_LW; - - pParam->BSIM4cdscd = model->BSIM4cdscd - + model->BSIM4lcdscd * Inv_L - + model->BSIM4wcdscd * Inv_W - + model->BSIM4pcdscd * Inv_LW; - - pParam->BSIM4cit = model->BSIM4cit - + model->BSIM4lcit * Inv_L - + model->BSIM4wcit * Inv_W - + model->BSIM4pcit * Inv_LW; - pParam->BSIM4nfactor = model->BSIM4nfactor - + model->BSIM4lnfactor * Inv_L - + model->BSIM4wnfactor * Inv_W - + model->BSIM4pnfactor * Inv_LW; - pParam->BSIM4tnfactor = model->BSIM4tnfactor /* v4.7 */ - + model->BSIM4ltnfactor * Inv_L - + model->BSIM4wtnfactor * Inv_W - + model->BSIM4ptnfactor * Inv_LW; - pParam->BSIM4xj = model->BSIM4xj - + model->BSIM4lxj * Inv_L - + model->BSIM4wxj * Inv_W - + model->BSIM4pxj * Inv_LW; - pParam->BSIM4vsat = model->BSIM4vsat - + model->BSIM4lvsat * Inv_L - + model->BSIM4wvsat * Inv_W - + model->BSIM4pvsat * Inv_LW; - pParam->BSIM4at = model->BSIM4at - + model->BSIM4lat * Inv_L - + model->BSIM4wat * Inv_W - + model->BSIM4pat * Inv_LW; - pParam->BSIM4a0 = model->BSIM4a0 - + model->BSIM4la0 * Inv_L - + model->BSIM4wa0 * Inv_W - + model->BSIM4pa0 * Inv_LW; - - pParam->BSIM4ags = model->BSIM4ags - + model->BSIM4lags * Inv_L - + model->BSIM4wags * Inv_W - + model->BSIM4pags * Inv_LW; - - pParam->BSIM4a1 = model->BSIM4a1 - + model->BSIM4la1 * Inv_L - + model->BSIM4wa1 * Inv_W - + model->BSIM4pa1 * Inv_LW; - pParam->BSIM4a2 = model->BSIM4a2 - + model->BSIM4la2 * Inv_L - + model->BSIM4wa2 * Inv_W - + model->BSIM4pa2 * Inv_LW; - pParam->BSIM4keta = model->BSIM4keta - + model->BSIM4lketa * Inv_L - + model->BSIM4wketa * Inv_W - + model->BSIM4pketa * Inv_LW; - pParam->BSIM4nsub = model->BSIM4nsub - + model->BSIM4lnsub * Inv_L - + model->BSIM4wnsub * Inv_W - + model->BSIM4pnsub * Inv_LW; - pParam->BSIM4ndep = model->BSIM4ndep - + model->BSIM4lndep * Inv_L - + model->BSIM4wndep * Inv_W - + model->BSIM4pndep * Inv_LW; - pParam->BSIM4nsd = model->BSIM4nsd - + model->BSIM4lnsd * Inv_L - + model->BSIM4wnsd * Inv_W - + model->BSIM4pnsd * Inv_LW; - pParam->BSIM4phin = model->BSIM4phin - + model->BSIM4lphin * Inv_L - + model->BSIM4wphin * Inv_W - + model->BSIM4pphin * Inv_LW; - pParam->BSIM4ngate = model->BSIM4ngate - + model->BSIM4lngate * Inv_L - + model->BSIM4wngate * Inv_W - + model->BSIM4pngate * Inv_LW; - pParam->BSIM4gamma1 = model->BSIM4gamma1 - + model->BSIM4lgamma1 * Inv_L - + model->BSIM4wgamma1 * Inv_W - + model->BSIM4pgamma1 * Inv_LW; - pParam->BSIM4gamma2 = model->BSIM4gamma2 - + model->BSIM4lgamma2 * Inv_L - + model->BSIM4wgamma2 * Inv_W - + model->BSIM4pgamma2 * Inv_LW; - pParam->BSIM4vbx = model->BSIM4vbx - + model->BSIM4lvbx * Inv_L - + model->BSIM4wvbx * Inv_W - + model->BSIM4pvbx * Inv_LW; - pParam->BSIM4vbm = model->BSIM4vbm - + model->BSIM4lvbm * Inv_L - + model->BSIM4wvbm * Inv_W - + model->BSIM4pvbm * Inv_LW; - pParam->BSIM4xt = model->BSIM4xt - + model->BSIM4lxt * Inv_L - + model->BSIM4wxt * Inv_W - + model->BSIM4pxt * Inv_LW; - pParam->BSIM4vfb = model->BSIM4vfb - + model->BSIM4lvfb * Inv_L - + model->BSIM4wvfb * Inv_W - + model->BSIM4pvfb * Inv_LW; - pParam->BSIM4k1 = model->BSIM4k1 - + model->BSIM4lk1 * Inv_L - + model->BSIM4wk1 * Inv_W - + model->BSIM4pk1 * Inv_LW; - pParam->BSIM4kt1 = model->BSIM4kt1 - + model->BSIM4lkt1 * Inv_L - + model->BSIM4wkt1 * Inv_W - + model->BSIM4pkt1 * Inv_LW; - pParam->BSIM4kt1l = model->BSIM4kt1l - + model->BSIM4lkt1l * Inv_L - + model->BSIM4wkt1l * Inv_W - + model->BSIM4pkt1l * Inv_LW; - pParam->BSIM4k2 = model->BSIM4k2 - + model->BSIM4lk2 * Inv_L - + model->BSIM4wk2 * Inv_W - + model->BSIM4pk2 * Inv_LW; - pParam->BSIM4kt2 = model->BSIM4kt2 - + model->BSIM4lkt2 * Inv_L - + model->BSIM4wkt2 * Inv_W - + model->BSIM4pkt2 * Inv_LW; - pParam->BSIM4k3 = model->BSIM4k3 - + model->BSIM4lk3 * Inv_L - + model->BSIM4wk3 * Inv_W - + model->BSIM4pk3 * Inv_LW; - pParam->BSIM4k3b = model->BSIM4k3b - + model->BSIM4lk3b * Inv_L - + model->BSIM4wk3b * Inv_W - + model->BSIM4pk3b * Inv_LW; - pParam->BSIM4w0 = model->BSIM4w0 - + model->BSIM4lw0 * Inv_L - + model->BSIM4ww0 * Inv_W - + model->BSIM4pw0 * Inv_LW; - pParam->BSIM4lpe0 = model->BSIM4lpe0 - + model->BSIM4llpe0 * Inv_L - + model->BSIM4wlpe0 * Inv_W - + model->BSIM4plpe0 * Inv_LW; - pParam->BSIM4lpeb = model->BSIM4lpeb - + model->BSIM4llpeb * Inv_L - + model->BSIM4wlpeb * Inv_W - + model->BSIM4plpeb * Inv_LW; - pParam->BSIM4dvtp0 = model->BSIM4dvtp0 - + model->BSIM4ldvtp0 * Inv_L - + model->BSIM4wdvtp0 * Inv_W - + model->BSIM4pdvtp0 * Inv_LW; - pParam->BSIM4dvtp1 = model->BSIM4dvtp1 - + model->BSIM4ldvtp1 * Inv_L - + model->BSIM4wdvtp1 * Inv_W - + model->BSIM4pdvtp1 * Inv_LW; - pParam->BSIM4dvtp2 = model->BSIM4dvtp2 /* v4.7 */ - + model->BSIM4ldvtp2 * Inv_L - + model->BSIM4wdvtp2 * Inv_W - + model->BSIM4pdvtp2 * Inv_LW; - pParam->BSIM4dvtp3 = model->BSIM4dvtp3 /* v4.7 */ - + model->BSIM4ldvtp3 * Inv_L - + model->BSIM4wdvtp3 * Inv_W - + model->BSIM4pdvtp3 * Inv_LW; - pParam->BSIM4dvtp4 = model->BSIM4dvtp4 /* v4.7 */ - + model->BSIM4ldvtp4 * Inv_L - + model->BSIM4wdvtp4 * Inv_W - + model->BSIM4pdvtp4 * Inv_LW; - pParam->BSIM4dvtp5 = model->BSIM4dvtp5 /* v4.7 */ - + model->BSIM4ldvtp5 * Inv_L - + model->BSIM4wdvtp5 * Inv_W - + model->BSIM4pdvtp5 * Inv_LW; - pParam->BSIM4dvt0 = model->BSIM4dvt0 - + model->BSIM4ldvt0 * Inv_L - + model->BSIM4wdvt0 * Inv_W - + model->BSIM4pdvt0 * Inv_LW; - pParam->BSIM4dvt1 = model->BSIM4dvt1 - + model->BSIM4ldvt1 * Inv_L - + model->BSIM4wdvt1 * Inv_W - + model->BSIM4pdvt1 * Inv_LW; - pParam->BSIM4dvt2 = model->BSIM4dvt2 - + model->BSIM4ldvt2 * Inv_L - + model->BSIM4wdvt2 * Inv_W - + model->BSIM4pdvt2 * Inv_LW; - pParam->BSIM4dvt0w = model->BSIM4dvt0w - + model->BSIM4ldvt0w * Inv_L - + model->BSIM4wdvt0w * Inv_W - + model->BSIM4pdvt0w * Inv_LW; - pParam->BSIM4dvt1w = model->BSIM4dvt1w - + model->BSIM4ldvt1w * Inv_L - + model->BSIM4wdvt1w * Inv_W - + model->BSIM4pdvt1w * Inv_LW; - pParam->BSIM4dvt2w = model->BSIM4dvt2w - + model->BSIM4ldvt2w * Inv_L - + model->BSIM4wdvt2w * Inv_W - + model->BSIM4pdvt2w * Inv_LW; - pParam->BSIM4drout = model->BSIM4drout - + model->BSIM4ldrout * Inv_L - + model->BSIM4wdrout * Inv_W - + model->BSIM4pdrout * Inv_LW; - pParam->BSIM4dsub = model->BSIM4dsub - + model->BSIM4ldsub * Inv_L - + model->BSIM4wdsub * Inv_W - + model->BSIM4pdsub * Inv_LW; - pParam->BSIM4vth0 = model->BSIM4vth0 - + model->BSIM4lvth0 * Inv_L - + model->BSIM4wvth0 * Inv_W - + model->BSIM4pvth0 * Inv_LW; - pParam->BSIM4ua = model->BSIM4ua - + model->BSIM4lua * Inv_L - + model->BSIM4wua * Inv_W - + model->BSIM4pua * Inv_LW; - pParam->BSIM4ua1 = model->BSIM4ua1 - + model->BSIM4lua1 * Inv_L - + model->BSIM4wua1 * Inv_W - + model->BSIM4pua1 * Inv_LW; - pParam->BSIM4ub = model->BSIM4ub - + model->BSIM4lub * Inv_L - + model->BSIM4wub * Inv_W - + model->BSIM4pub * Inv_LW; - pParam->BSIM4ub1 = model->BSIM4ub1 - + model->BSIM4lub1 * Inv_L - + model->BSIM4wub1 * Inv_W - + model->BSIM4pub1 * Inv_LW; - pParam->BSIM4uc = model->BSIM4uc - + model->BSIM4luc * Inv_L - + model->BSIM4wuc * Inv_W - + model->BSIM4puc * Inv_LW; - pParam->BSIM4uc1 = model->BSIM4uc1 - + model->BSIM4luc1 * Inv_L - + model->BSIM4wuc1 * Inv_W - + model->BSIM4puc1 * Inv_LW; - pParam->BSIM4ud = model->BSIM4ud - + model->BSIM4lud * Inv_L - + model->BSIM4wud * Inv_W - + model->BSIM4pud * Inv_LW; - pParam->BSIM4ud1 = model->BSIM4ud1 - + model->BSIM4lud1 * Inv_L - + model->BSIM4wud1 * Inv_W - + model->BSIM4pud1 * Inv_LW; - pParam->BSIM4up = model->BSIM4up - + model->BSIM4lup * Inv_L - + model->BSIM4wup * Inv_W - + model->BSIM4pup * Inv_LW; - pParam->BSIM4lp = model->BSIM4lp - + model->BSIM4llp * Inv_L - + model->BSIM4wlp * Inv_W - + model->BSIM4plp * Inv_LW; - pParam->BSIM4eu = model->BSIM4eu - + model->BSIM4leu * Inv_L - + model->BSIM4weu * Inv_W - + model->BSIM4peu * Inv_LW; - pParam->BSIM4u0 = model->BSIM4u0 - + model->BSIM4lu0 * Inv_L - + model->BSIM4wu0 * Inv_W - + model->BSIM4pu0 * Inv_LW; - pParam->BSIM4ute = model->BSIM4ute - + model->BSIM4lute * Inv_L - + model->BSIM4wute * Inv_W - + model->BSIM4pute * Inv_LW; - /*high k mobility*/ - pParam->BSIM4ucs = model->BSIM4ucs - + model->BSIM4lucs * Inv_L - + model->BSIM4wucs * Inv_W - + model->BSIM4pucs * Inv_LW; - pParam->BSIM4ucste = model->BSIM4ucste - + model->BSIM4lucste * Inv_L - + model->BSIM4wucste * Inv_W - + model->BSIM4pucste * Inv_LW; - - pParam->BSIM4voff = model->BSIM4voff - + model->BSIM4lvoff * Inv_L - + model->BSIM4wvoff * Inv_W - + model->BSIM4pvoff * Inv_LW; - pParam->BSIM4tvoff = model->BSIM4tvoff - + model->BSIM4ltvoff * Inv_L - + model->BSIM4wtvoff * Inv_W - + model->BSIM4ptvoff * Inv_LW; - pParam->BSIM4minv = model->BSIM4minv - + model->BSIM4lminv * Inv_L - + model->BSIM4wminv * Inv_W - + model->BSIM4pminv * Inv_LW; - pParam->BSIM4minvcv = model->BSIM4minvcv - + model->BSIM4lminvcv * Inv_L - + model->BSIM4wminvcv * Inv_W - + model->BSIM4pminvcv * Inv_LW; - pParam->BSIM4fprout = model->BSIM4fprout - + model->BSIM4lfprout * Inv_L - + model->BSIM4wfprout * Inv_W - + model->BSIM4pfprout * Inv_LW; - pParam->BSIM4pdits = model->BSIM4pdits - + model->BSIM4lpdits * Inv_L - + model->BSIM4wpdits * Inv_W - + model->BSIM4ppdits * Inv_LW; - pParam->BSIM4pditsd = model->BSIM4pditsd - + model->BSIM4lpditsd * Inv_L - + model->BSIM4wpditsd * Inv_W - + model->BSIM4ppditsd * Inv_LW; - pParam->BSIM4delta = model->BSIM4delta - + model->BSIM4ldelta * Inv_L - + model->BSIM4wdelta * Inv_W - + model->BSIM4pdelta * Inv_LW; - pParam->BSIM4rdsw = model->BSIM4rdsw - + model->BSIM4lrdsw * Inv_L - + model->BSIM4wrdsw * Inv_W - + model->BSIM4prdsw * Inv_LW; - pParam->BSIM4rdw = model->BSIM4rdw - + model->BSIM4lrdw * Inv_L - + model->BSIM4wrdw * Inv_W - + model->BSIM4prdw * Inv_LW; - pParam->BSIM4rsw = model->BSIM4rsw - + model->BSIM4lrsw * Inv_L - + model->BSIM4wrsw * Inv_W - + model->BSIM4prsw * Inv_LW; - pParam->BSIM4prwg = model->BSIM4prwg - + model->BSIM4lprwg * Inv_L - + model->BSIM4wprwg * Inv_W - + model->BSIM4pprwg * Inv_LW; - pParam->BSIM4prwb = model->BSIM4prwb - + model->BSIM4lprwb * Inv_L - + model->BSIM4wprwb * Inv_W - + model->BSIM4pprwb * Inv_LW; - pParam->BSIM4prt = model->BSIM4prt - + model->BSIM4lprt * Inv_L - + model->BSIM4wprt * Inv_W - + model->BSIM4pprt * Inv_LW; - pParam->BSIM4eta0 = model->BSIM4eta0 - + model->BSIM4leta0 * Inv_L - + model->BSIM4weta0 * Inv_W - + model->BSIM4peta0 * Inv_LW; - pParam->BSIM4teta0 = model->BSIM4teta0 /* v4.7 */ - + model->BSIM4lteta0 * Inv_L - + model->BSIM4wteta0 * Inv_W - + model->BSIM4pteta0 * Inv_LW; - pParam->BSIM4tvoffcv = model->BSIM4tvoffcv /* v4.8.0 */ - + model->BSIM4ltvoffcv * Inv_L - + model->BSIM4wtvoffcv * Inv_W - + model->BSIM4ptvoffcv * Inv_LW; - pParam->BSIM4etab = model->BSIM4etab - + model->BSIM4letab * Inv_L - + model->BSIM4wetab * Inv_W - + model->BSIM4petab * Inv_LW; - pParam->BSIM4pclm = model->BSIM4pclm - + model->BSIM4lpclm * Inv_L - + model->BSIM4wpclm * Inv_W - + model->BSIM4ppclm * Inv_LW; - pParam->BSIM4pdibl1 = model->BSIM4pdibl1 - + model->BSIM4lpdibl1 * Inv_L - + model->BSIM4wpdibl1 * Inv_W - + model->BSIM4ppdibl1 * Inv_LW; - pParam->BSIM4pdibl2 = model->BSIM4pdibl2 - + model->BSIM4lpdibl2 * Inv_L - + model->BSIM4wpdibl2 * Inv_W - + model->BSIM4ppdibl2 * Inv_LW; - pParam->BSIM4pdiblb = model->BSIM4pdiblb - + model->BSIM4lpdiblb * Inv_L - + model->BSIM4wpdiblb * Inv_W - + model->BSIM4ppdiblb * Inv_LW; - pParam->BSIM4pscbe1 = model->BSIM4pscbe1 - + model->BSIM4lpscbe1 * Inv_L - + model->BSIM4wpscbe1 * Inv_W - + model->BSIM4ppscbe1 * Inv_LW; - pParam->BSIM4pscbe2 = model->BSIM4pscbe2 - + model->BSIM4lpscbe2 * Inv_L - + model->BSIM4wpscbe2 * Inv_W - + model->BSIM4ppscbe2 * Inv_LW; - pParam->BSIM4pvag = model->BSIM4pvag - + model->BSIM4lpvag * Inv_L - + model->BSIM4wpvag * Inv_W - + model->BSIM4ppvag * Inv_LW; - pParam->BSIM4wr = model->BSIM4wr - + model->BSIM4lwr * Inv_L - + model->BSIM4wwr * Inv_W - + model->BSIM4pwr * Inv_LW; - pParam->BSIM4dwg = model->BSIM4dwg - + model->BSIM4ldwg * Inv_L - + model->BSIM4wdwg * Inv_W - + model->BSIM4pdwg * Inv_LW; - pParam->BSIM4dwb = model->BSIM4dwb - + model->BSIM4ldwb * Inv_L - + model->BSIM4wdwb * Inv_W - + model->BSIM4pdwb * Inv_LW; - pParam->BSIM4b0 = model->BSIM4b0 - + model->BSIM4lb0 * Inv_L - + model->BSIM4wb0 * Inv_W - + model->BSIM4pb0 * Inv_LW; - pParam->BSIM4b1 = model->BSIM4b1 - + model->BSIM4lb1 * Inv_L - + model->BSIM4wb1 * Inv_W - + model->BSIM4pb1 * Inv_LW; - pParam->BSIM4alpha0 = model->BSIM4alpha0 - + model->BSIM4lalpha0 * Inv_L - + model->BSIM4walpha0 * Inv_W - + model->BSIM4palpha0 * Inv_LW; - pParam->BSIM4alpha1 = model->BSIM4alpha1 - + model->BSIM4lalpha1 * Inv_L - + model->BSIM4walpha1 * Inv_W - + model->BSIM4palpha1 * Inv_LW; - pParam->BSIM4beta0 = model->BSIM4beta0 - + model->BSIM4lbeta0 * Inv_L - + model->BSIM4wbeta0 * Inv_W - + model->BSIM4pbeta0 * Inv_LW; - pParam->BSIM4agidl = model->BSIM4agidl - + model->BSIM4lagidl * Inv_L - + model->BSIM4wagidl * Inv_W - + model->BSIM4pagidl * Inv_LW; - pParam->BSIM4bgidl = model->BSIM4bgidl - + model->BSIM4lbgidl * Inv_L - + model->BSIM4wbgidl * Inv_W - + model->BSIM4pbgidl * Inv_LW; - pParam->BSIM4cgidl = model->BSIM4cgidl - + model->BSIM4lcgidl * Inv_L - + model->BSIM4wcgidl * Inv_W - + model->BSIM4pcgidl * Inv_LW; - pParam->BSIM4egidl = model->BSIM4egidl - + model->BSIM4legidl * Inv_L - + model->BSIM4wegidl * Inv_W - + model->BSIM4pegidl * Inv_LW; - pParam->BSIM4rgidl = model->BSIM4rgidl /* v4.7 New GIDL/GISL */ - + model->BSIM4lrgidl * Inv_L - + model->BSIM4wrgidl * Inv_W - + model->BSIM4prgidl * Inv_LW; - pParam->BSIM4kgidl = model->BSIM4kgidl /* v4.7 New GIDL/GISL */ - + model->BSIM4lkgidl * Inv_L - + model->BSIM4wkgidl * Inv_W - + model->BSIM4pkgidl * Inv_LW; - pParam->BSIM4fgidl = model->BSIM4fgidl /* v4.7 New GIDL/GISL */ - + model->BSIM4lfgidl * Inv_L - + model->BSIM4wfgidl * Inv_W - + model->BSIM4pfgidl * Inv_LW; - pParam->BSIM4agisl = model->BSIM4agisl - + model->BSIM4lagisl * Inv_L - + model->BSIM4wagisl * Inv_W - + model->BSIM4pagisl * Inv_LW; - pParam->BSIM4bgisl = model->BSIM4bgisl - + model->BSIM4lbgisl * Inv_L - + model->BSIM4wbgisl * Inv_W - + model->BSIM4pbgisl * Inv_LW; - pParam->BSIM4cgisl = model->BSIM4cgisl - + model->BSIM4lcgisl * Inv_L - + model->BSIM4wcgisl * Inv_W - + model->BSIM4pcgisl * Inv_LW; - pParam->BSIM4egisl = model->BSIM4egisl - + model->BSIM4legisl * Inv_L - + model->BSIM4wegisl * Inv_W - + model->BSIM4pegisl * Inv_LW; - pParam->BSIM4rgisl = model->BSIM4rgisl /* v4.7 New GIDL/GISL */ - + model->BSIM4lrgisl * Inv_L - + model->BSIM4wrgisl * Inv_W - + model->BSIM4prgisl * Inv_LW; - pParam->BSIM4kgisl = model->BSIM4kgisl /* v4.7 New GIDL/GISL */ - + model->BSIM4lkgisl * Inv_L - + model->BSIM4wkgisl * Inv_W - + model->BSIM4pkgisl * Inv_LW; - pParam->BSIM4fgisl = model->BSIM4fgisl /* v4.7 New GIDL/GISL */ - + model->BSIM4lfgisl * Inv_L - + model->BSIM4wfgisl * Inv_W - + model->BSIM4pfgisl * Inv_LW; - pParam->BSIM4aigc = model->BSIM4aigc - + model->BSIM4laigc * Inv_L - + model->BSIM4waigc * Inv_W - + model->BSIM4paigc * Inv_LW; - pParam->BSIM4bigc = model->BSIM4bigc - + model->BSIM4lbigc * Inv_L - + model->BSIM4wbigc * Inv_W - + model->BSIM4pbigc * Inv_LW; - pParam->BSIM4cigc = model->BSIM4cigc - + model->BSIM4lcigc * Inv_L - + model->BSIM4wcigc * Inv_W - + model->BSIM4pcigc * Inv_LW; - pParam->BSIM4aigsd = model->BSIM4aigsd - + model->BSIM4laigsd * Inv_L - + model->BSIM4waigsd * Inv_W - + model->BSIM4paigsd * Inv_LW; - pParam->BSIM4bigsd = model->BSIM4bigsd - + model->BSIM4lbigsd * Inv_L - + model->BSIM4wbigsd * Inv_W - + model->BSIM4pbigsd * Inv_LW; - pParam->BSIM4cigsd = model->BSIM4cigsd - + model->BSIM4lcigsd * Inv_L - + model->BSIM4wcigsd * Inv_W - + model->BSIM4pcigsd * Inv_LW; - pParam->BSIM4aigs = model->BSIM4aigs - + model->BSIM4laigs * Inv_L - + model->BSIM4waigs * Inv_W - + model->BSIM4paigs * Inv_LW; - pParam->BSIM4bigs = model->BSIM4bigs - + model->BSIM4lbigs * Inv_L - + model->BSIM4wbigs * Inv_W - + model->BSIM4pbigs * Inv_LW; - pParam->BSIM4cigs = model->BSIM4cigs - + model->BSIM4lcigs * Inv_L - + model->BSIM4wcigs * Inv_W - + model->BSIM4pcigs * Inv_LW; - pParam->BSIM4aigd = model->BSIM4aigd - + model->BSIM4laigd * Inv_L - + model->BSIM4waigd * Inv_W - + model->BSIM4paigd * Inv_LW; - pParam->BSIM4bigd = model->BSIM4bigd - + model->BSIM4lbigd * Inv_L - + model->BSIM4wbigd * Inv_W - + model->BSIM4pbigd * Inv_LW; - pParam->BSIM4cigd = model->BSIM4cigd - + model->BSIM4lcigd * Inv_L - + model->BSIM4wcigd * Inv_W - + model->BSIM4pcigd * Inv_LW; - pParam->BSIM4aigbacc = model->BSIM4aigbacc - + model->BSIM4laigbacc * Inv_L - + model->BSIM4waigbacc * Inv_W - + model->BSIM4paigbacc * Inv_LW; - pParam->BSIM4bigbacc = model->BSIM4bigbacc - + model->BSIM4lbigbacc * Inv_L - + model->BSIM4wbigbacc * Inv_W - + model->BSIM4pbigbacc * Inv_LW; - pParam->BSIM4cigbacc = model->BSIM4cigbacc - + model->BSIM4lcigbacc * Inv_L - + model->BSIM4wcigbacc * Inv_W - + model->BSIM4pcigbacc * Inv_LW; - pParam->BSIM4aigbinv = model->BSIM4aigbinv - + model->BSIM4laigbinv * Inv_L - + model->BSIM4waigbinv * Inv_W - + model->BSIM4paigbinv * Inv_LW; - pParam->BSIM4bigbinv = model->BSIM4bigbinv - + model->BSIM4lbigbinv * Inv_L - + model->BSIM4wbigbinv * Inv_W - + model->BSIM4pbigbinv * Inv_LW; - pParam->BSIM4cigbinv = model->BSIM4cigbinv - + model->BSIM4lcigbinv * Inv_L - + model->BSIM4wcigbinv * Inv_W - + model->BSIM4pcigbinv * Inv_LW; - pParam->BSIM4nigc = model->BSIM4nigc - + model->BSIM4lnigc * Inv_L - + model->BSIM4wnigc * Inv_W - + model->BSIM4pnigc * Inv_LW; - pParam->BSIM4nigbacc = model->BSIM4nigbacc - + model->BSIM4lnigbacc * Inv_L - + model->BSIM4wnigbacc * Inv_W - + model->BSIM4pnigbacc * Inv_LW; - pParam->BSIM4nigbinv = model->BSIM4nigbinv - + model->BSIM4lnigbinv * Inv_L - + model->BSIM4wnigbinv * Inv_W - + model->BSIM4pnigbinv * Inv_LW; - pParam->BSIM4ntox = model->BSIM4ntox - + model->BSIM4lntox * Inv_L - + model->BSIM4wntox * Inv_W - + model->BSIM4pntox * Inv_LW; - pParam->BSIM4eigbinv = model->BSIM4eigbinv - + model->BSIM4leigbinv * Inv_L - + model->BSIM4weigbinv * Inv_W - + model->BSIM4peigbinv * Inv_LW; - pParam->BSIM4pigcd = model->BSIM4pigcd - + model->BSIM4lpigcd * Inv_L - + model->BSIM4wpigcd * Inv_W - + model->BSIM4ppigcd * Inv_LW; - pParam->BSIM4poxedge = model->BSIM4poxedge - + model->BSIM4lpoxedge * Inv_L - + model->BSIM4wpoxedge * Inv_W - + model->BSIM4ppoxedge * Inv_LW; - pParam->BSIM4xrcrg1 = model->BSIM4xrcrg1 - + model->BSIM4lxrcrg1 * Inv_L - + model->BSIM4wxrcrg1 * Inv_W - + model->BSIM4pxrcrg1 * Inv_LW; - pParam->BSIM4xrcrg2 = model->BSIM4xrcrg2 - + model->BSIM4lxrcrg2 * Inv_L - + model->BSIM4wxrcrg2 * Inv_W - + model->BSIM4pxrcrg2 * Inv_LW; - pParam->BSIM4lambda = model->BSIM4lambda - + model->BSIM4llambda * Inv_L - + model->BSIM4wlambda * Inv_W - + model->BSIM4plambda * Inv_LW; - pParam->BSIM4vtl = model->BSIM4vtl - + model->BSIM4lvtl * Inv_L - + model->BSIM4wvtl * Inv_W - + model->BSIM4pvtl * Inv_LW; - pParam->BSIM4xn = model->BSIM4xn - + model->BSIM4lxn * Inv_L - + model->BSIM4wxn * Inv_W - + model->BSIM4pxn * Inv_LW; - pParam->BSIM4vfbsdoff = model->BSIM4vfbsdoff - + model->BSIM4lvfbsdoff * Inv_L - + model->BSIM4wvfbsdoff * Inv_W - + model->BSIM4pvfbsdoff * Inv_LW; - pParam->BSIM4tvfbsdoff = model->BSIM4tvfbsdoff - + model->BSIM4ltvfbsdoff * Inv_L - + model->BSIM4wtvfbsdoff * Inv_W - + model->BSIM4ptvfbsdoff * Inv_LW; - - pParam->BSIM4cgsl = model->BSIM4cgsl - + model->BSIM4lcgsl * Inv_L - + model->BSIM4wcgsl * Inv_W - + model->BSIM4pcgsl * Inv_LW; - pParam->BSIM4cgdl = model->BSIM4cgdl - + model->BSIM4lcgdl * Inv_L - + model->BSIM4wcgdl * Inv_W - + model->BSIM4pcgdl * Inv_LW; - pParam->BSIM4ckappas = model->BSIM4ckappas - + model->BSIM4lckappas * Inv_L - + model->BSIM4wckappas * Inv_W - + model->BSIM4pckappas * Inv_LW; - pParam->BSIM4ckappad = model->BSIM4ckappad - + model->BSIM4lckappad * Inv_L - + model->BSIM4wckappad * Inv_W - + model->BSIM4pckappad * Inv_LW; - pParam->BSIM4cf = model->BSIM4cf - + model->BSIM4lcf * Inv_L - + model->BSIM4wcf * Inv_W - + model->BSIM4pcf * Inv_LW; - pParam->BSIM4clc = model->BSIM4clc - + model->BSIM4lclc * Inv_L - + model->BSIM4wclc * Inv_W - + model->BSIM4pclc * Inv_LW; - pParam->BSIM4cle = model->BSIM4cle - + model->BSIM4lcle * Inv_L - + model->BSIM4wcle * Inv_W - + model->BSIM4pcle * Inv_LW; - pParam->BSIM4vfbcv = model->BSIM4vfbcv - + model->BSIM4lvfbcv * Inv_L - + model->BSIM4wvfbcv * Inv_W - + model->BSIM4pvfbcv * Inv_LW; - pParam->BSIM4acde = model->BSIM4acde - + model->BSIM4lacde * Inv_L - + model->BSIM4wacde * Inv_W - + model->BSIM4pacde * Inv_LW; - pParam->BSIM4moin = model->BSIM4moin - + model->BSIM4lmoin * Inv_L - + model->BSIM4wmoin * Inv_W - + model->BSIM4pmoin * Inv_LW; - pParam->BSIM4noff = model->BSIM4noff - + model->BSIM4lnoff * Inv_L - + model->BSIM4wnoff * Inv_W - + model->BSIM4pnoff * Inv_LW; - pParam->BSIM4voffcv = model->BSIM4voffcv - + model->BSIM4lvoffcv * Inv_L - + model->BSIM4wvoffcv * Inv_W - + model->BSIM4pvoffcv * Inv_LW; - pParam->BSIM4kvth0we = model->BSIM4kvth0we - + model->BSIM4lkvth0we * Inv_L - + model->BSIM4wkvth0we * Inv_W - + model->BSIM4pkvth0we * Inv_LW; - pParam->BSIM4k2we = model->BSIM4k2we - + model->BSIM4lk2we * Inv_L - + model->BSIM4wk2we * Inv_W - + model->BSIM4pk2we * Inv_LW; - pParam->BSIM4ku0we = model->BSIM4ku0we - + model->BSIM4lku0we * Inv_L - + model->BSIM4wku0we * Inv_W - + model->BSIM4pku0we * Inv_LW; - - pParam->BSIM4abulkCVfactor = 1.0 + pow((pParam->BSIM4clc - / pParam->BSIM4leffCV), - pParam->BSIM4cle); - - T0 = (TRatio - 1.0); - - PowWeffWr = pow(pParam->BSIM4weffCJ * 1.0e6, pParam->BSIM4wr) * here->BSIM4nf; - - T1 = T2 = T3 = T4 = 0.0; - pParam->BSIM4ucs = pParam->BSIM4ucs * pow(TRatio, pParam->BSIM4ucste); - if(model->BSIM4tempMod == 0) - { - pParam->BSIM4ua = pParam->BSIM4ua + pParam->BSIM4ua1 * T0; - pParam->BSIM4ub = pParam->BSIM4ub + pParam->BSIM4ub1 * T0; - pParam->BSIM4uc = pParam->BSIM4uc + pParam->BSIM4uc1 * T0; - pParam->BSIM4ud = pParam->BSIM4ud + pParam->BSIM4ud1 * T0; - pParam->BSIM4vsattemp = pParam->BSIM4vsat - pParam->BSIM4at * T0; - T10 = pParam->BSIM4prt * T0; - if(model->BSIM4rdsMod) - { - /* External Rd(V) */ - T1 = pParam->BSIM4rdw + T10; - T2 = model->BSIM4rdwmin + T10; - /* External Rs(V) */ - T3 = pParam->BSIM4rsw + T10; - T4 = model->BSIM4rswmin + T10; - } - /* Internal Rds(V) in IV */ - pParam->BSIM4rds0 = (pParam->BSIM4rdsw + T10) - * here->BSIM4nf / PowWeffWr; - pParam->BSIM4rdswmin = (model->BSIM4rdswmin + T10) - * here->BSIM4nf / PowWeffWr; - } - else - { - if (model->BSIM4tempMod == 3) - { - pParam->BSIM4ua = pParam->BSIM4ua * pow(TRatio, pParam->BSIM4ua1) ; - pParam->BSIM4ub = pParam->BSIM4ub * pow(TRatio, pParam->BSIM4ub1); - pParam->BSIM4uc = pParam->BSIM4uc * pow(TRatio, pParam->BSIM4uc1); - pParam->BSIM4ud = pParam->BSIM4ud * pow(TRatio, pParam->BSIM4ud1); - } - else - { - /* tempMod = 1, 2 */ - pParam->BSIM4ua = pParam->BSIM4ua * (1.0 + pParam->BSIM4ua1 * delTemp) ; - pParam->BSIM4ub = pParam->BSIM4ub * (1.0 + pParam->BSIM4ub1 * delTemp); - pParam->BSIM4uc = pParam->BSIM4uc * (1.0 + pParam->BSIM4uc1 * delTemp); - pParam->BSIM4ud = pParam->BSIM4ud * (1.0 + pParam->BSIM4ud1 * delTemp); - } - pParam->BSIM4vsattemp = pParam->BSIM4vsat * (1.0 - pParam->BSIM4at * delTemp); - T10 = 1.0 + pParam->BSIM4prt * delTemp; - if(model->BSIM4rdsMod) - { - /* External Rd(V) */ - T1 = pParam->BSIM4rdw * T10; - T2 = model->BSIM4rdwmin * T10; - - /* External Rs(V) */ - T3 = pParam->BSIM4rsw * T10; - T4 = model->BSIM4rswmin * T10; - } - /* Internal Rds(V) in IV */ - pParam->BSIM4rds0 = pParam->BSIM4rdsw * T10 * here->BSIM4nf / PowWeffWr; - pParam->BSIM4rdswmin = model->BSIM4rdswmin * T10 * here->BSIM4nf / PowWeffWr; - } - - if (T1 < 0.0) - { T1 = 0.0; - printf("Warning: Rdw at current temperature is negative; set to 0.\n"); - } - if (T2 < 0.0) - { T2 = 0.0; - printf("Warning: Rdwmin at current temperature is negative; set to 0.\n"); - } - pParam->BSIM4rd0 = T1 / PowWeffWr; - pParam->BSIM4rdwmin = T2 / PowWeffWr; - if (T3 < 0.0) - { T3 = 0.0; - printf("Warning: Rsw at current temperature is negative; set to 0.\n"); - } - if (T4 < 0.0) - { T4 = 0.0; - printf("Warning: Rswmin at current temperature is negative; set to 0.\n"); - } - pParam->BSIM4rs0 = T3 / PowWeffWr; - pParam->BSIM4rswmin = T4 / PowWeffWr; - - if (pParam->BSIM4u0 > 1.0) - pParam->BSIM4u0 = pParam->BSIM4u0 / 1.0e4; - - /* mobility channel length dependence */ - T5 = 1.0 - pParam->BSIM4up * exp( - pParam->BSIM4leff / pParam->BSIM4lp); - pParam->BSIM4u0temp = pParam->BSIM4u0 * T5 - * pow(TRatio, pParam->BSIM4ute); - if (pParam->BSIM4eu < 0.0) - { pParam->BSIM4eu = 0.0; - printf("Warning: eu has been negative; reset to 0.0.\n"); - } - if (pParam->BSIM4ucs < 0.0) - { pParam->BSIM4ucs = 0.0; - printf("Warning: ucs has been negative; reset to 0.0.\n"); - } - - pParam->BSIM4vfbsdoff = pParam->BSIM4vfbsdoff * (1.0 + pParam->BSIM4tvfbsdoff * delTemp); - pParam->BSIM4voff = pParam->BSIM4voff * (1.0 + pParam->BSIM4tvoff * delTemp); - - pParam->BSIM4nfactor = pParam->BSIM4nfactor + pParam->BSIM4tnfactor * delTemp / Tnom; /* v4.7 temp dep of leakage currents */ - pParam->BSIM4voffcv = pParam->BSIM4voffcv * (1.0 + pParam->BSIM4tvoffcv * delTemp); /* v4.7 temp dep of leakage currents */ - pParam->BSIM4eta0 = pParam->BSIM4eta0 + pParam->BSIM4teta0 * delTemp / Tnom; /* v4.7 temp dep of leakage currents */ - - /* Source End Velocity Limit */ - if((model->BSIM4vtlGiven) && (model->BSIM4vtl > 0.0) ) - { - if(model->BSIM4lc < 0.0) pParam->BSIM4lc = 0.0; - else pParam->BSIM4lc = model->BSIM4lc ; - T0 = pParam->BSIM4leff / (pParam->BSIM4xn * pParam->BSIM4leff + pParam->BSIM4lc); - pParam->BSIM4tfactor = (1.0 - T0) / (1.0 + T0 ); - } - - pParam->BSIM4cgdo = (model->BSIM4cgdo + pParam->BSIM4cf) - * pParam->BSIM4weffCV; - pParam->BSIM4cgso = (model->BSIM4cgso + pParam->BSIM4cf) - * pParam->BSIM4weffCV; - pParam->BSIM4cgbo = model->BSIM4cgbo * pParam->BSIM4leffCV * here->BSIM4nf; - - if (!model->BSIM4ndepGiven && model->BSIM4gamma1Given) - { T0 = pParam->BSIM4gamma1 * model->BSIM4coxe; - pParam->BSIM4ndep = 3.01248e22 * T0 * T0; - } - - pParam->BSIM4phi = Vtm0 * log(pParam->BSIM4ndep / ni) - + pParam->BSIM4phin + 0.4; - - pParam->BSIM4sqrtPhi = sqrt(pParam->BSIM4phi); - pParam->BSIM4phis3 = pParam->BSIM4sqrtPhi * pParam->BSIM4phi; - - pParam->BSIM4Xdep0 = sqrt(2.0 * epssub / (Charge_q - * pParam->BSIM4ndep * 1.0e6)) - * pParam->BSIM4sqrtPhi; - pParam->BSIM4sqrtXdep0 = sqrt(pParam->BSIM4Xdep0); - - if(model->BSIM4mtrlMod == 0) - pParam->BSIM4litl = sqrt(3.0 * 3.9 / epsrox * pParam->BSIM4xj * toxe); - else - pParam->BSIM4litl = sqrt(model->BSIM4epsrsub/epsrox * pParam->BSIM4xj * toxe); - - pParam->BSIM4vbi = Vtm0 * log(pParam->BSIM4nsd - * pParam->BSIM4ndep / (ni * ni)); - - if (model->BSIM4mtrlMod == 0) - { - if (pParam->BSIM4ngate > 0.0) - { pParam->BSIM4vfbsd = Vtm0 * log(pParam->BSIM4ngate - / pParam->BSIM4nsd); - } - else - pParam->BSIM4vfbsd = 0.0; - } - else - { - T0 = Vtm0 * log(pParam->BSIM4nsd/ni); - T1 = 0.5 * Eg0; - if(T0 > T1) - T0 = T1; - T2 = model->BSIM4easub + T1 - model->BSIM4type * T0; - pParam->BSIM4vfbsd = model->BSIM4phig - T2; - } - - pParam->BSIM4cdep0 = sqrt(Charge_q * epssub - * pParam->BSIM4ndep * 1.0e6 / 2.0 - / pParam->BSIM4phi); - - pParam->BSIM4ToxRatio = exp(pParam->BSIM4ntox - * log(model->BSIM4toxref / toxe)) - / toxe / toxe; - pParam->BSIM4ToxRatioEdge = exp(pParam->BSIM4ntox - * log(model->BSIM4toxref - / (toxe * pParam->BSIM4poxedge))) - / toxe / toxe - / pParam->BSIM4poxedge / pParam->BSIM4poxedge; - pParam->BSIM4Aechvb = (model->BSIM4type == NMOS) ? 4.97232e-7 : 3.42537e-7; - pParam->BSIM4Bechvb = (model->BSIM4type == NMOS) ? 7.45669e11 : 1.16645e12; - - if ((strcmp(model->BSIM4version, "4.8.1")) && (strncmp(model->BSIM4version, "4.81", 4))) - { - pParam->BSIM4AechvbEdgeS = pParam->BSIM4Aechvb * pParam->BSIM4weff - * model->BSIM4dlcig * pParam->BSIM4ToxRatioEdge; - pParam->BSIM4AechvbEdgeD = pParam->BSIM4Aechvb * pParam->BSIM4weff - * model->BSIM4dlcigd * pParam->BSIM4ToxRatioEdge; - } - else - { - if (model->BSIM4dlcig < 0.0) - { - printf("Warning: dlcig = %g is negative. Set to zero.\n", model->BSIM4dlcig); - model->BSIM4dlcig = 0.0; - } - pParam->BSIM4AechvbEdgeS = pParam->BSIM4Aechvb * pParam->BSIM4weff - * model->BSIM4dlcig * pParam->BSIM4ToxRatioEdge; - if (model->BSIM4dlcigd < 0.0) - { - printf("Warning: dlcigd = %g is negative. Set to zero.\n", model->BSIM4dlcigd); - model->BSIM4dlcigd = 0.0; - } - pParam->BSIM4AechvbEdgeD = pParam->BSIM4Aechvb * pParam->BSIM4weff - * model->BSIM4dlcigd * pParam->BSIM4ToxRatioEdge; - } - - pParam->BSIM4BechvbEdge = -pParam->BSIM4Bechvb - * toxe * pParam->BSIM4poxedge; - pParam->BSIM4Aechvb *= pParam->BSIM4weff * pParam->BSIM4leff - * pParam->BSIM4ToxRatio; - pParam->BSIM4Bechvb *= -toxe; - - - pParam->BSIM4mstar = 0.5 + atan(pParam->BSIM4minv) / PI; - pParam->BSIM4mstarcv = 0.5 + atan(pParam->BSIM4minvcv) / PI; - pParam->BSIM4voffcbn = pParam->BSIM4voff + model->BSIM4voffl / pParam->BSIM4leff; - pParam->BSIM4voffcbncv = pParam->BSIM4voffcv + model->BSIM4voffcvl / pParam->BSIM4leff; - - pParam->BSIM4ldeb = sqrt(epssub * Vtm0 / (Charge_q - * pParam->BSIM4ndep * 1.0e6)) / 3.0; - pParam->BSIM4acde *= pow((pParam->BSIM4ndep / 2.0e16), -0.25); - - - if (model->BSIM4k1Given || model->BSIM4k2Given) - { if (!model->BSIM4k1Given) - { - if ((!ckt->CKTcurJob) || (ckt->CKTcurJob->JOBtype < 9)) /* don't print in sensitivity */ - fprintf(stdout, "Warning: k1 should be specified with k2.\n"); - pParam->BSIM4k1 = 0.53; - } - if (!model->BSIM4k2Given) - { - if ((!ckt->CKTcurJob) || (ckt->CKTcurJob->JOBtype < 9)) /* don't print in sensitivity */ - fprintf(stdout, "Warning: k2 should be specified with k1.\n"); - pParam->BSIM4k2 = -0.0186; - } - if ((!ckt->CKTcurJob) || (ckt->CKTcurJob->JOBtype < 9)) { /* don't print in sensitivity */ - if (model->BSIM4nsubGiven) - fprintf(stdout, "Warning: nsub is ignored because k1 or k2 is given.\n"); - if (model->BSIM4xtGiven) - fprintf(stdout, "Warning: xt is ignored because k1 or k2 is given.\n"); - if (model->BSIM4vbxGiven) - fprintf(stdout, "Warning: vbx is ignored because k1 or k2 is given.\n"); - if (model->BSIM4gamma1Given) - fprintf(stdout, "Warning: gamma1 is ignored because k1 or k2 is given.\n"); - if (model->BSIM4gamma2Given) - fprintf(stdout, "Warning: gamma2 is ignored because k1 or k2 is given.\n"); - } - } - else - { if (!model->BSIM4vbxGiven) - pParam->BSIM4vbx = pParam->BSIM4phi - 7.7348e-4 - * pParam->BSIM4ndep - * pParam->BSIM4xt * pParam->BSIM4xt; - if (pParam->BSIM4vbx > 0.0) - pParam->BSIM4vbx = -pParam->BSIM4vbx; - if (pParam->BSIM4vbm > 0.0) - pParam->BSIM4vbm = -pParam->BSIM4vbm; - - if (!model->BSIM4gamma1Given) - pParam->BSIM4gamma1 = 5.753e-12 - * sqrt(pParam->BSIM4ndep) - / model->BSIM4coxe; - if (!model->BSIM4gamma2Given) - pParam->BSIM4gamma2 = 5.753e-12 - * sqrt(pParam->BSIM4nsub) - / model->BSIM4coxe; - - T0 = pParam->BSIM4gamma1 - pParam->BSIM4gamma2; - T1 = sqrt(pParam->BSIM4phi - pParam->BSIM4vbx) - - pParam->BSIM4sqrtPhi; - T2 = sqrt(pParam->BSIM4phi * (pParam->BSIM4phi - - pParam->BSIM4vbm)) - pParam->BSIM4phi; - pParam->BSIM4k2 = T0 * T1 / (2.0 * T2 + pParam->BSIM4vbm); - pParam->BSIM4k1 = pParam->BSIM4gamma2 - 2.0 - * pParam->BSIM4k2 * sqrt(pParam->BSIM4phi - - pParam->BSIM4vbm); - } - - if (!model->BSIM4vfbGiven) - { - if (model->BSIM4vth0Given) - { pParam->BSIM4vfb = model->BSIM4type * pParam->BSIM4vth0 - - pParam->BSIM4phi - pParam->BSIM4k1 - * pParam->BSIM4sqrtPhi; - } - else - { - if ((model->BSIM4mtrlMod) && (model->BSIM4phigGiven) && - (model->BSIM4nsubGiven)) - { - T0 = Vtm0 * log(pParam->BSIM4nsub/ni); - T1 = 0.5 * Eg0; - if(T0 > T1) - T0 = T1; - T2 = model->BSIM4easub + T1 + model->BSIM4type * T0; - pParam->BSIM4vfb = model->BSIM4phig - T2; - } - else - { - pParam->BSIM4vfb = -1.0; - } - } - } - if (!model->BSIM4vth0Given) - { pParam->BSIM4vth0 = model->BSIM4type * (pParam->BSIM4vfb - + pParam->BSIM4phi + pParam->BSIM4k1 - * pParam->BSIM4sqrtPhi); - } - - pParam->BSIM4k1ox = pParam->BSIM4k1 * toxe - / model->BSIM4toxm; - - tmp = sqrt(epssub / (epsrox * EPS0) * toxe * pParam->BSIM4Xdep0); - T0 = pParam->BSIM4dsub * pParam->BSIM4leff / tmp; - if (T0 < EXP_THRESHOLD) - { T1 = exp(T0); - T2 = T1 - 1.0; - T3 = T2 * T2; - T4 = T3 + 2.0 * T1 * MIN_EXP; - pParam->BSIM4theta0vb0 = T1 / T4; - } - else - pParam->BSIM4theta0vb0 = 1.0 / (MAX_EXP - 2.0); - - T0 = pParam->BSIM4drout * pParam->BSIM4leff / tmp; - if (T0 < EXP_THRESHOLD) - { T1 = exp(T0); - T2 = T1 - 1.0; - T3 = T2 * T2; - T4 = T3 + 2.0 * T1 * MIN_EXP; - T5 = T1 / T4; - } - else - T5 = 1.0 / (MAX_EXP - 2.0); /* 3.0 * MIN_EXP omitted */ - pParam->BSIM4thetaRout = pParam->BSIM4pdibl1 * T5 - + pParam->BSIM4pdibl2; - - tmp = sqrt(pParam->BSIM4Xdep0); - tmp1 = pParam->BSIM4vbi - pParam->BSIM4phi; - tmp2 = model->BSIM4factor1 * tmp; - - T0 = pParam->BSIM4dvt1w * pParam->BSIM4weff - * pParam->BSIM4leff / tmp2; - if (T0 < EXP_THRESHOLD) - { T1 = exp(T0); - T2 = T1 - 1.0; - T3 = T2 * T2; - T4 = T3 + 2.0 * T1 * MIN_EXP; - T8 = T1 / T4; - } - else - T8 = 1.0 / (MAX_EXP - 2.0); - T0 = pParam->BSIM4dvt0w * T8; - T8 = T0 * tmp1; - - T0 = pParam->BSIM4dvt1 * pParam->BSIM4leff / tmp2; - if (T0 < EXP_THRESHOLD) - { T1 = exp(T0); - T2 = T1 - 1.0; - T3 = T2 * T2; - T4 = T3 + 2.0 * T1 * MIN_EXP; - T9 = T1 / T4; - } - else - T9 = 1.0 / (MAX_EXP - 2.0); - T9 = pParam->BSIM4dvt0 * T9 * tmp1; - - T4 = toxe * pParam->BSIM4phi - / (pParam->BSIM4weff + pParam->BSIM4w0); - - T0 = sqrt(1.0 + pParam->BSIM4lpe0 / pParam->BSIM4leff); - if((model->BSIM4tempMod == 1) || (model->BSIM4tempMod == 0)) - T3 = (pParam->BSIM4kt1 + pParam->BSIM4kt1l / pParam->BSIM4leff) - * (TRatio - 1.0); - if((model->BSIM4tempMod == 2)||(model->BSIM4tempMod == 3)) - T3 = - pParam->BSIM4kt1 * (TRatio - 1.0); - - T5 = pParam->BSIM4k1ox * (T0 - 1.0) * pParam->BSIM4sqrtPhi - + T3; - pParam->BSIM4vfbzbfactor = - T8 - T9 + pParam->BSIM4k3 * T4 + T5 - - pParam->BSIM4phi - pParam->BSIM4k1 * pParam->BSIM4sqrtPhi; - - /* stress effect */ - - wlod = model->BSIM4wlod; - if (model->BSIM4wlod < 0.0) - { fprintf(stderr, "Warning: WLOD = %g is less than 0. 0.0 is used\n",model->BSIM4wlod); - wlod = 0.0; - } - T0 = pow(Lnew, model->BSIM4llodku0); - W_tmp = Wnew + wlod; - T1 = pow(W_tmp, model->BSIM4wlodku0); - tmp1 = model->BSIM4lku0 / T0 + model->BSIM4wku0 / T1 - + model->BSIM4pku0 / (T0 * T1); - pParam->BSIM4ku0 = 1.0 + tmp1; - - T0 = pow(Lnew, model->BSIM4llodvth); - T1 = pow(W_tmp, model->BSIM4wlodvth); - tmp1 = model->BSIM4lkvth0 / T0 + model->BSIM4wkvth0 / T1 - + model->BSIM4pkvth0 / (T0 * T1); - pParam->BSIM4kvth0 = 1.0 + tmp1; - pParam->BSIM4kvth0 = sqrt(pParam->BSIM4kvth0*pParam->BSIM4kvth0 + DELTA); - - T0 = (TRatio - 1.0); - pParam->BSIM4ku0temp = pParam->BSIM4ku0 * (1.0 + model->BSIM4tku0 *T0) + DELTA; - - Inv_saref = 1.0/(model->BSIM4saref + 0.5*Ldrn); - Inv_sbref = 1.0/(model->BSIM4sbref + 0.5*Ldrn); - pParam->BSIM4inv_od_ref = Inv_saref + Inv_sbref; - pParam->BSIM4rho_ref = model->BSIM4ku0 / pParam->BSIM4ku0temp * pParam->BSIM4inv_od_ref; - - /*high k*/ - /*Calculate VgsteffVth for mobMod=3*/ - if(model->BSIM4mobMod==3) - { /*Calculate n @ Vbs=Vds=0*/ - lt1 = model->BSIM4factor1* pParam->BSIM4sqrtXdep0; - T0 = pParam->BSIM4dvt1 * pParam->BSIM4leff / lt1; - if (T0 < EXP_THRESHOLD) - { - T1 = exp(T0); - T2 = T1 - 1.0; - T3 = T2 * T2; - T4 = T3 + 2.0 * T1 * MIN_EXP; - Theta0 = T1 / T4; - } - else - Theta0 = 1.0 / (MAX_EXP - 2.0); - - tmp1 = epssub / pParam->BSIM4Xdep0; - tmp2 = pParam->BSIM4nfactor * tmp1; - tmp3 = (tmp2 + pParam->BSIM4cdsc * Theta0 + pParam->BSIM4cit) / model->BSIM4coxe; - if (tmp3 >= -0.5) - n0 = 1.0 + tmp3; - else - { - T0 = 1.0 / (3.0 + 8.0 * tmp3); - n0 = (1.0 + 3.0 * tmp3) * T0; - } - - T0 = n0 * model->BSIM4vtm; - T1 = pParam->BSIM4voffcbn; - T2 = T1/T0; - if (T2 < -EXP_THRESHOLD) - { T3 = model->BSIM4coxe * MIN_EXP / pParam->BSIM4cdep0; - T4 = pParam->BSIM4mstar + T3 * n0; - } - else if (T2 > EXP_THRESHOLD) - { T3 = model->BSIM4coxe * MAX_EXP / pParam->BSIM4cdep0; - T4 = pParam->BSIM4mstar + T3 * n0; - } - else - { T3 = exp(T2)* model->BSIM4coxe / pParam->BSIM4cdep0; - T4 = pParam->BSIM4mstar + T3 * n0; - } - pParam->BSIM4VgsteffVth = T0 * log(2.0)/T4; - } - - /* New DITS term added in 4.7 */ - T0 = -pParam->BSIM4dvtp3 * log(pParam->BSIM4leff); - DEXP(T0, T1); - pParam->BSIM4dvtp2factor = pParam->BSIM4dvtp5 + pParam->BSIM4dvtp2 * T1; - - } /* End of SizeNotFound */ - - /* stress effect */ - if( (here->BSIM4sa > 0.0) && (here->BSIM4sb > 0.0) && - ((here->BSIM4nf == 1.0) || ((here->BSIM4nf > 1.0) && (here->BSIM4sd > 0.0))) ) - { Inv_sa = 0; - Inv_sb = 0; - - kvsat = model->BSIM4kvsat; - if (model->BSIM4kvsat < -1.0 ) - { fprintf(stderr, "Warning: KVSAT = %g is too small; -1.0 is used.\n",model->BSIM4kvsat); - kvsat = -1.0; - } - if (model->BSIM4kvsat > 1.0) - { fprintf(stderr, "Warning: KVSAT = %g is too big; 1.0 is used.\n",model->BSIM4kvsat); - kvsat = 1.0; - } - - for(i = 0; i < here->BSIM4nf; i++){ - T0 = 1.0 / here->BSIM4nf / (here->BSIM4sa + 0.5*Ldrn + i * (here->BSIM4sd +Ldrn)); - T1 = 1.0 / here->BSIM4nf / (here->BSIM4sb + 0.5*Ldrn + i * (here->BSIM4sd +Ldrn)); - Inv_sa += T0; - Inv_sb += T1; - } - Inv_ODeff = Inv_sa + Inv_sb; - rho = model->BSIM4ku0 / pParam->BSIM4ku0temp * Inv_ODeff; - T0 = (1.0 + rho)/(1.0 + pParam->BSIM4rho_ref); - here->BSIM4u0temp = pParam->BSIM4u0temp * T0; - - T1 = (1.0 + kvsat * rho)/(1.0 + kvsat * pParam->BSIM4rho_ref); - here->BSIM4vsattemp = pParam->BSIM4vsattemp * T1; - - OD_offset = Inv_ODeff - pParam->BSIM4inv_od_ref; - dvth0_lod = model->BSIM4kvth0 / pParam->BSIM4kvth0 * OD_offset; - dk2_lod = model->BSIM4stk2 / pow(pParam->BSIM4kvth0, model->BSIM4lodk2) * - OD_offset; - deta0_lod = model->BSIM4steta0 / pow(pParam->BSIM4kvth0, model->BSIM4lodeta0) * - OD_offset; - here->BSIM4vth0 = pParam->BSIM4vth0 + dvth0_lod; - - here->BSIM4eta0 = pParam->BSIM4eta0 + deta0_lod; - here->BSIM4k2 = pParam->BSIM4k2 + dk2_lod; - } else { - here->BSIM4u0temp = pParam->BSIM4u0temp; - here->BSIM4vth0 = pParam->BSIM4vth0; - here->BSIM4vsattemp = pParam->BSIM4vsattemp; - here->BSIM4eta0 = pParam->BSIM4eta0; - here->BSIM4k2 = pParam->BSIM4k2; - } - - /* Well Proximity Effect */ - if (model->BSIM4wpemod) - { if( (!here->BSIM4scaGiven) && (!here->BSIM4scbGiven) && (!here->BSIM4sccGiven) ) - { if((here->BSIM4scGiven) && (here->BSIM4sc > 0.0) ) - { T1 = here->BSIM4sc + Wdrn; - T2 = 1.0 / model->BSIM4scref; - here->BSIM4sca = model->BSIM4scref * model->BSIM4scref - / (here->BSIM4sc * T1); - here->BSIM4scb = ( (0.1 * here->BSIM4sc + 0.01 * model->BSIM4scref) - * exp(-10.0 * here->BSIM4sc * T2) - - (0.1 * T1 + 0.01 * model->BSIM4scref) - * exp(-10.0 * T1 * T2) ) / Wdrn; - here->BSIM4scc = ( (0.05 * here->BSIM4sc + 0.0025 * model->BSIM4scref) - * exp(-20.0 * here->BSIM4sc * T2) - - (0.05 * T1 + 0.0025 * model->BSIM4scref) - * exp(-20.0 * T1 * T2) ) / Wdrn; - } else { - fprintf(stderr, "Warning: No WPE as none of SCA, SCB, SCC, SC is given and/or SC not positive.\n"); - } - } - - if (here->BSIM4sca < 0.0) - { - printf("Warning: SCA = %g is negative. Set to 0.0.\n", here->BSIM4sca); - here->BSIM4sca = 0.0; - } - if (here->BSIM4scb < 0.0) - { - printf("Warning: SCB = %g is negative. Set to 0.0.\n", here->BSIM4scb); - here->BSIM4scb = 0.0; - } - if (here->BSIM4scc < 0.0) - { - printf("Warning: SCC = %g is negative. Set to 0.0.\n", here->BSIM4scc); - here->BSIM4scc = 0.0; - } - if (here->BSIM4sc < 0.0) - { - printf("Warning: SC = %g is negative. Set to 0.0.\n", here->BSIM4sc); - here->BSIM4sc = 0.0; - } - /*4.6.2*/ - sceff = here->BSIM4sca + model->BSIM4web * here->BSIM4scb - + model->BSIM4wec * here->BSIM4scc; - here->BSIM4vth0 += pParam->BSIM4kvth0we * sceff; - here->BSIM4k2 += pParam->BSIM4k2we * sceff; - T3 = 1.0 + pParam->BSIM4ku0we * sceff; - if (T3 <= 0.0) - { T3 = 0.0; - fprintf(stderr, "Warning: ku0we = %g is negatively too high. Negative mobility! \n", pParam->BSIM4ku0we); - } - here->BSIM4u0temp *= T3; - } - - /* adding delvto */ - here->BSIM4vth0 += here->BSIM4delvto; - here->BSIM4vfb = pParam->BSIM4vfb + model->BSIM4type * here->BSIM4delvto; - - /* low field mobility multiplier */ - here->BSIM4u0temp = pParam->BSIM4u0temp * here->BSIM4mulu0; - - /* Instance variables calculation */ - T3 = model->BSIM4type * here->BSIM4vth0 - - here->BSIM4vfb - pParam->BSIM4phi; - T4 = T3 + T3; - T5 = 2.5 * T3; - here->BSIM4vtfbphi1 = (model->BSIM4type == NMOS) ? T4 : T5; - if (here->BSIM4vtfbphi1 < 0.0) - here->BSIM4vtfbphi1 = 0.0; - - here->BSIM4vtfbphi2 = 4.0 * T3; - if (here->BSIM4vtfbphi2 < 0.0) - here->BSIM4vtfbphi2 = 0.0; - - if (here->BSIM4k2 < 0.0) - { T0 = 0.5 * pParam->BSIM4k1 / here->BSIM4k2; - here->BSIM4vbsc = 0.9 * (pParam->BSIM4phi - T0 * T0); - if (here->BSIM4vbsc > -3.0) - here->BSIM4vbsc = -3.0; - else if (here->BSIM4vbsc < -30.0) - here->BSIM4vbsc = -30.0; - } - else - here->BSIM4vbsc = -30.0; - if (here->BSIM4vbsc > pParam->BSIM4vbm) - here->BSIM4vbsc = pParam->BSIM4vbm; - here->BSIM4k2ox = here->BSIM4k2 * toxe - / model->BSIM4toxm; - - here->BSIM4vfbzb = pParam->BSIM4vfbzbfactor - + model->BSIM4type * here->BSIM4vth0 ; - - here->BSIM4cgso = pParam->BSIM4cgso; - here->BSIM4cgdo = pParam->BSIM4cgdo; - - lnl = log(pParam->BSIM4leff * 1.0e6); - lnw = log(pParam->BSIM4weff * 1.0e6); - lnnf = log(here->BSIM4nf); - - bodymode = 5; - if( ( !model->BSIM4rbps0Given) || - ( !model->BSIM4rbpd0Given) ) - bodymode = 1; - else - if( (!model->BSIM4rbsbx0Given && !model->BSIM4rbsby0Given) || - (!model->BSIM4rbdbx0Given && !model->BSIM4rbdby0Given) ) - bodymode = 3; - - if(here->BSIM4rbodyMod == 2) - { - if (bodymode == 5) - { - /*rbsbx = exp( log(model->BSIM4rbsbx0) + model->BSIM4rbsdbxl * lnl + - model->BSIM4rbsdbxw * lnw + model->BSIM4rbsdbxnf * lnnf ); - rbsby = exp( log(model->BSIM4rbsby0) + model->BSIM4rbsdbyl * lnl + - model->BSIM4rbsdbyw * lnw + model->BSIM4rbsdbynf * lnnf ); - */ - rbsbx = model->BSIM4rbsbx0 * exp( model->BSIM4rbsdbxl * lnl + - model->BSIM4rbsdbxw * lnw + model->BSIM4rbsdbxnf * lnnf ); - rbsby = model->BSIM4rbsby0 * exp( model->BSIM4rbsdbyl * lnl + - model->BSIM4rbsdbyw * lnw + model->BSIM4rbsdbynf * lnnf ); - here->BSIM4rbsb = rbsbx * rbsby / (rbsbx + rbsby); - - - /*rbdbx = exp( log(model->BSIM4rbdbx0) + model->BSIM4rbsdbxl * lnl + - model->BSIM4rbsdbxw * lnw + model->BSIM4rbsdbxnf * lnnf ); - rbdby = exp( log(model->BSIM4rbdby0) + model->BSIM4rbsdbyl * lnl + - model->BSIM4rbsdbyw * lnw + model->BSIM4rbsdbynf * lnnf ); - */ - - rbdbx = model->BSIM4rbdbx0 * exp( model->BSIM4rbsdbxl * lnl + - model->BSIM4rbsdbxw * lnw + model->BSIM4rbsdbxnf * lnnf ); - rbdby = model->BSIM4rbdby0 * exp( model->BSIM4rbsdbyl * lnl + - model->BSIM4rbsdbyw * lnw + model->BSIM4rbsdbynf * lnnf ); - - here->BSIM4rbdb = rbdbx * rbdby / (rbdbx + rbdby); - } - - if ((bodymode == 3)|| (bodymode == 5)) - { - /*here->BSIM4rbps = exp( log(model->BSIM4rbps0) + model->BSIM4rbpsl * lnl + - model->BSIM4rbpsw * lnw + model->BSIM4rbpsnf * lnnf ); - here->BSIM4rbpd = exp( log(model->BSIM4rbpd0) + model->BSIM4rbpdl * lnl + - model->BSIM4rbpdw * lnw + model->BSIM4rbpdnf * lnnf ); - */ - here->BSIM4rbps = model->BSIM4rbps0 * exp( model->BSIM4rbpsl * lnl + - model->BSIM4rbpsw * lnw + model->BSIM4rbpsnf * lnnf ); - here->BSIM4rbpd = model->BSIM4rbpd0 * exp( model->BSIM4rbpdl * lnl + - model->BSIM4rbpdw * lnw + model->BSIM4rbpdnf * lnnf ); - - } - - /*rbpbx = exp( log(model->BSIM4rbpbx0) + model->BSIM4rbpbxl * lnl + - model->BSIM4rbpbxw * lnw + model->BSIM4rbpbxnf * lnnf ); - rbpby = exp( log(model->BSIM4rbpby0) + model->BSIM4rbpbyl * lnl + - model->BSIM4rbpbyw * lnw + model->BSIM4rbpbynf * lnnf ); - */ - rbpbx = model->BSIM4rbpbx0 * exp( model->BSIM4rbpbxl * lnl + - model->BSIM4rbpbxw * lnw + model->BSIM4rbpbxnf * lnnf ); - rbpby = model->BSIM4rbpby0 * exp( model->BSIM4rbpbyl * lnl + - model->BSIM4rbpbyw * lnw + model->BSIM4rbpbynf * lnnf ); - - here->BSIM4rbpb = rbpbx*rbpby/(rbpbx + rbpby); - } - - if ((here->BSIM4rbodyMod == 1 ) || ((here->BSIM4rbodyMod == 2 ) && (bodymode == 5)) ) - { if (here->BSIM4rbdb < 1.0e-3) - here->BSIM4grbdb = 1.0e3; /* in mho */ - else - here->BSIM4grbdb = model->BSIM4gbmin + 1.0 / here->BSIM4rbdb; - if (here->BSIM4rbpb < 1.0e-3) - here->BSIM4grbpb = 1.0e3; - else - here->BSIM4grbpb = model->BSIM4gbmin + 1.0 / here->BSIM4rbpb; - if (here->BSIM4rbps < 1.0e-3) - here->BSIM4grbps = 1.0e3; - else - here->BSIM4grbps = model->BSIM4gbmin + 1.0 / here->BSIM4rbps; - if (here->BSIM4rbsb < 1.0e-3) - here->BSIM4grbsb = 1.0e3; - else - here->BSIM4grbsb = model->BSIM4gbmin + 1.0 / here->BSIM4rbsb; - if (here->BSIM4rbpd < 1.0e-3) - here->BSIM4grbpd = 1.0e3; - else - here->BSIM4grbpd = model->BSIM4gbmin + 1.0 / here->BSIM4rbpd; - - } - - if((here->BSIM4rbodyMod == 2) && (bodymode == 3)) - { - here->BSIM4grbdb = here->BSIM4grbsb = model->BSIM4gbmin; - if (here->BSIM4rbpb < 1.0e-3) - here->BSIM4grbpb = 1.0e3; - else - here->BSIM4grbpb = model->BSIM4gbmin + 1.0 / here->BSIM4rbpb; - if (here->BSIM4rbps < 1.0e-3) - here->BSIM4grbps = 1.0e3; - else - here->BSIM4grbps = model->BSIM4gbmin + 1.0 / here->BSIM4rbps; - if (here->BSIM4rbpd < 1.0e-3) - here->BSIM4grbpd = 1.0e3; - else - here->BSIM4grbpd = model->BSIM4gbmin + 1.0 / here->BSIM4rbpd; - } - - if((here->BSIM4rbodyMod == 2) && (bodymode == 1)) - { - here->BSIM4grbdb = here->BSIM4grbsb = model->BSIM4gbmin; - here->BSIM4grbps = here->BSIM4grbpd = 1.0e3; - if (here->BSIM4rbpb < 1.0e-3) - here->BSIM4grbpb = 1.0e3; - else - here->BSIM4grbpb = model->BSIM4gbmin + 1.0 / here->BSIM4rbpb; - } - - - /* - * Process geomertry dependent parasitics - */ - - here->BSIM4grgeltd = model->BSIM4rshg * (here->BSIM4xgw - + pParam->BSIM4weffCJ / 3.0 / here->BSIM4ngcon) / - (here->BSIM4ngcon * here->BSIM4nf * - (Lnew - model->BSIM4xgl)); - if (here->BSIM4grgeltd > 0.0) - here->BSIM4grgeltd = 1.0 / here->BSIM4grgeltd; - else - { here->BSIM4grgeltd = 1.0e3; /* mho */ - if (here->BSIM4rgateMod != 0) - printf("Warning: The gate conductance reset to 1.0e3 mho.\n"); - } - - DMCGeff = model->BSIM4dmcg - model->BSIM4dmcgt; - DMCIeff = model->BSIM4dmci; - DMDGeff = model->BSIM4dmdg - model->BSIM4dmcgt; - -/* if (here->BSIM4sourcePerimeterGiven) - { if (model->BSIM4perMod == 0) - here->BSIM4Pseff = here->BSIM4sourcePerimeter; - else - here->BSIM4Pseff = here->BSIM4sourcePerimeter - - pParam->BSIM4weffCJ * here->BSIM4nf; - } - else - BSIM4PAeffGeo(here->BSIM4nf, here->BSIM4geoMod, here->BSIM4min, - pParam->BSIM4weffCJ, DMCGeff, DMCIeff, DMDGeff, - &(here->BSIM4Pseff), &dumPd, &dumAs, &dumAd); - if (here->BSIM4Pseff < 0.0) /4.6.2/ - here->BSIM4Pseff = 0.0; */ - - /* New Diode Model v4.7*/ - if (here->BSIM4sourcePerimeterGiven) - { /* given */ - if (here->BSIM4sourcePerimeter == 0.0) - here->BSIM4Pseff = 0.0; - else if (here->BSIM4sourcePerimeter < 0.0) - { - printf("Warning: Source Perimeter is specified as negative, it is set to zero.\n"); - here->BSIM4Pseff = 0.0; - } else - { - if (model->BSIM4perMod == 0) - here->BSIM4Pseff = here->BSIM4sourcePerimeter; - else - here->BSIM4Pseff = here->BSIM4sourcePerimeter - - pParam->BSIM4weffCJ * here->BSIM4nf; - } - } else /* not given */ - BSIM4PAeffGeo(here->BSIM4nf, here->BSIM4geoMod, here->BSIM4min, - pParam->BSIM4weffCJ, DMCGeff, DMCIeff, DMDGeff, - &(here->BSIM4Pseff), &dumPd, &dumAs, &dumAd); - - if (here->BSIM4Pseff < 0.0){ /* v4.7 final check */ - here->BSIM4Pseff = 0.0; - printf("Warning: Pseff is negative, it is set to zero.\n"); - } - /* if (here->BSIM4drainPerimeterGiven) - { if (model->BSIM4perMod == 0) - here->BSIM4Pdeff = here->BSIM4drainPerimeter; - else - here->BSIM4Pdeff = here->BSIM4drainPerimeter - - pParam->BSIM4weffCJ * here->BSIM4nf; - } - else - BSIM4PAeffGeo(here->BSIM4nf, here->BSIM4geoMod, here->BSIM4min, - pParam->BSIM4weffCJ, DMCGeff, DMCIeff, DMDGeff, - &dumPs, &(here->BSIM4Pdeff), &dumAs, &dumAd); - if (here->BSIM4Pdeff < 0.0) /4.6.2/ - here->BSIM4Pdeff = 0.0; */ - - if (here->BSIM4drainPerimeterGiven) - { /* given */ - if (here->BSIM4drainPerimeter == 0.0) - here->BSIM4Pdeff = 0.0; - else if (here->BSIM4drainPerimeter < 0.0) - { - printf("Warning: Drain Perimeter is specified as negative, it is set to zero.\n"); - here->BSIM4Pdeff = 0.0; - } else - { - if (model->BSIM4perMod == 0) - here->BSIM4Pdeff = here->BSIM4drainPerimeter; - else - here->BSIM4Pdeff = here->BSIM4drainPerimeter - - pParam->BSIM4weffCJ * here->BSIM4nf; - } - } else /* not given */ - BSIM4PAeffGeo(here->BSIM4nf, here->BSIM4geoMod, here->BSIM4min, - pParam->BSIM4weffCJ, DMCGeff, DMCIeff, DMDGeff, - &dumPs, &(here->BSIM4Pdeff), &dumAs, &dumAd); - - if (here->BSIM4Pdeff < 0.0){ - here->BSIM4Pdeff = 0.0; /*New Diode v4.7*/ - printf("Warning: Pdeff is negative, it is set to zero.\n"); - } - if (here->BSIM4sourceAreaGiven) - here->BSIM4Aseff = here->BSIM4sourceArea; - else - BSIM4PAeffGeo(here->BSIM4nf, here->BSIM4geoMod, here->BSIM4min, - pParam->BSIM4weffCJ, DMCGeff, DMCIeff, DMDGeff, - &dumPs, &dumPd, &(here->BSIM4Aseff), &dumAd); - if (here->BSIM4Aseff < 0.0){ - here->BSIM4Aseff = 0.0; /* v4.7 */ - printf("Warning: Aseff is negative, it is set to zero.\n"); - } - if (here->BSIM4drainAreaGiven) - here->BSIM4Adeff = here->BSIM4drainArea; - else - BSIM4PAeffGeo(here->BSIM4nf, here->BSIM4geoMod, here->BSIM4min, - pParam->BSIM4weffCJ, DMCGeff, DMCIeff, DMDGeff, - &dumPs, &dumPd, &dumAs, &(here->BSIM4Adeff)); - if (here->BSIM4Adeff < 0.0){ - here->BSIM4Adeff = 0.0; /* v4.7 */ - printf("Warning: Adeff is negative, it is set to zero.\n"); - } - /* Processing S/D resistance and conductance below */ - if(here->BSIM4sNodePrime != here->BSIM4sNode) - { - here->BSIM4sourceConductance = 0.0; - if(here->BSIM4sourceSquaresGiven) - { - here->BSIM4sourceConductance = model->BSIM4sheetResistance - * here->BSIM4sourceSquares; - } else if (here->BSIM4rgeoMod > 0) - { - BSIM4RdseffGeo(here->BSIM4nf, here->BSIM4geoMod, - here->BSIM4rgeoMod, here->BSIM4min, - pParam->BSIM4weffCJ, model->BSIM4sheetResistance, - DMCGeff, DMCIeff, DMDGeff, 1, &(here->BSIM4sourceConductance)); - } else - { - here->BSIM4sourceConductance = 0.0; - } - - if (here->BSIM4sourceConductance > 0.0) - here->BSIM4sourceConductance = 1.0 - / here->BSIM4sourceConductance; - else - { - here->BSIM4sourceConductance = 1.0e3; /* mho */ - printf ("Warning: Source conductance reset to 1.0e3 mho.\n"); - } - } else - { - here->BSIM4sourceConductance = 0.0; - } - - if(here->BSIM4dNodePrime != here->BSIM4dNode) - { - here->BSIM4drainConductance = 0.0; - if(here->BSIM4drainSquaresGiven) - { - here->BSIM4drainConductance = model->BSIM4sheetResistance - * here->BSIM4drainSquares; - } else if (here->BSIM4rgeoMod > 0) - { - BSIM4RdseffGeo(here->BSIM4nf, here->BSIM4geoMod, - here->BSIM4rgeoMod, here->BSIM4min, - pParam->BSIM4weffCJ, model->BSIM4sheetResistance, - DMCGeff, DMCIeff, DMDGeff, 0, &(here->BSIM4drainConductance)); - } else - { - here->BSIM4drainConductance = 0.0; - } - - if (here->BSIM4drainConductance > 0.0) - here->BSIM4drainConductance = 1.0 - / here->BSIM4drainConductance; - else - { - here->BSIM4drainConductance = 1.0e3; /* mho */ - printf ("Warning: Drain conductance reset to 1.0e3 mho.\n"); - } - } else - { - here->BSIM4drainConductance = 0.0; - } - - /* End of Rsd processing */ - - - Nvtms = model->BSIM4vtm * model->BSIM4SjctEmissionCoeff; - if ((here->BSIM4Aseff <= 0.0) && (here->BSIM4Pseff <= 0.0)) - { SourceSatCurrent = 0.0; /* v4.7 */ - /* SourceSatCurrent = 1.0e-14; */ - } - else - { SourceSatCurrent = here->BSIM4Aseff * model->BSIM4SjctTempSatCurDensity - + here->BSIM4Pseff * model->BSIM4SjctSidewallTempSatCurDensity - + pParam->BSIM4weffCJ * here->BSIM4nf - * model->BSIM4SjctGateSidewallTempSatCurDensity; - } - if (SourceSatCurrent > 0.0) - { switch(model->BSIM4dioMod) - { case 0: - if ((model->BSIM4bvs / Nvtms) > EXP_THRESHOLD) - here->BSIM4XExpBVS = model->BSIM4xjbvs * MIN_EXP; - else - here->BSIM4XExpBVS = model->BSIM4xjbvs * exp(-model->BSIM4bvs / Nvtms); - break; - case 1: - BSIM4DioIjthVjmEval(Nvtms, model->BSIM4ijthsfwd, SourceSatCurrent, - 0.0, &(here->BSIM4vjsmFwd)); - here->BSIM4IVjsmFwd = SourceSatCurrent * exp(here->BSIM4vjsmFwd / Nvtms); - break; - case 2: - if ((model->BSIM4bvs / Nvtms) > EXP_THRESHOLD) - { here->BSIM4XExpBVS = model->BSIM4xjbvs * MIN_EXP; - tmp = MIN_EXP; - } - else - { here->BSIM4XExpBVS = exp(-model->BSIM4bvs / Nvtms); - tmp = here->BSIM4XExpBVS; - here->BSIM4XExpBVS *= model->BSIM4xjbvs; - } - - BSIM4DioIjthVjmEval(Nvtms, model->BSIM4ijthsfwd, SourceSatCurrent, - here->BSIM4XExpBVS, &(here->BSIM4vjsmFwd)); - T0 = exp(here->BSIM4vjsmFwd / Nvtms); - here->BSIM4IVjsmFwd = SourceSatCurrent * (T0 - here->BSIM4XExpBVS / T0 - + here->BSIM4XExpBVS - 1.0); - here->BSIM4SslpFwd = SourceSatCurrent - * (T0 + here->BSIM4XExpBVS / T0) / Nvtms; - - T2 = model->BSIM4ijthsrev / SourceSatCurrent; - if (T2 < 1.0) - { T2 = 10.0; - fprintf(stderr, "Warning: ijthsrev too small and set to 10 times IsbSat.\n"); - } - here->BSIM4vjsmRev = -model->BSIM4bvs - - Nvtms * log((T2 - 1.0) / model->BSIM4xjbvs); - T1 = model->BSIM4xjbvs * exp(-(model->BSIM4bvs - + here->BSIM4vjsmRev) / Nvtms); - here->BSIM4IVjsmRev = SourceSatCurrent * (1.0 + T1); - here->BSIM4SslpRev = -SourceSatCurrent * T1 / Nvtms; - break; - default: - printf("Specified dioMod = %d not matched\n", model->BSIM4dioMod); - } - } - - Nvtmd = model->BSIM4vtm * model->BSIM4DjctEmissionCoeff; - if ((here->BSIM4Adeff <= 0.0) && (here->BSIM4Pdeff <= 0.0)) - { /* DrainSatCurrent = 1.0e-14; v4.7 */ - DrainSatCurrent = 0.0; - } - else - { DrainSatCurrent = here->BSIM4Adeff * model->BSIM4DjctTempSatCurDensity - + here->BSIM4Pdeff * model->BSIM4DjctSidewallTempSatCurDensity - + pParam->BSIM4weffCJ * here->BSIM4nf - * model->BSIM4DjctGateSidewallTempSatCurDensity; - } - if (DrainSatCurrent > 0.0) - { switch(model->BSIM4dioMod) - { case 0: - if ((model->BSIM4bvd / Nvtmd) > EXP_THRESHOLD) - here->BSIM4XExpBVD = model->BSIM4xjbvd * MIN_EXP; - else - here->BSIM4XExpBVD = model->BSIM4xjbvd * exp(-model->BSIM4bvd / Nvtmd); - break; - case 1: - BSIM4DioIjthVjmEval(Nvtmd, model->BSIM4ijthdfwd, DrainSatCurrent, - 0.0, &(here->BSIM4vjdmFwd)); - here->BSIM4IVjdmFwd = DrainSatCurrent * exp(here->BSIM4vjdmFwd / Nvtmd); - break; - case 2: - if ((model->BSIM4bvd / Nvtmd) > EXP_THRESHOLD) - { here->BSIM4XExpBVD = model->BSIM4xjbvd * MIN_EXP; - tmp = MIN_EXP; - } - else - { here->BSIM4XExpBVD = exp(-model->BSIM4bvd / Nvtmd); - tmp = here->BSIM4XExpBVD; - here->BSIM4XExpBVD *= model->BSIM4xjbvd; - } - - BSIM4DioIjthVjmEval(Nvtmd, model->BSIM4ijthdfwd, DrainSatCurrent, - here->BSIM4XExpBVD, &(here->BSIM4vjdmFwd)); - T0 = exp(here->BSIM4vjdmFwd / Nvtmd); - here->BSIM4IVjdmFwd = DrainSatCurrent * (T0 - here->BSIM4XExpBVD / T0 - + here->BSIM4XExpBVD - 1.0); - here->BSIM4DslpFwd = DrainSatCurrent - * (T0 + here->BSIM4XExpBVD / T0) / Nvtmd; - - T2 = model->BSIM4ijthdrev / DrainSatCurrent; - if (T2 < 1.0) - { T2 = 10.0; - fprintf(stderr, "Warning: ijthdrev too small and set to 10 times IdbSat.\n"); - } - here->BSIM4vjdmRev = -model->BSIM4bvd - - Nvtmd * log((T2 - 1.0) / model->BSIM4xjbvd); /* bugfix */ - T1 = model->BSIM4xjbvd * exp(-(model->BSIM4bvd - + here->BSIM4vjdmRev) / Nvtmd); - here->BSIM4IVjdmRev = DrainSatCurrent * (1.0 + T1); - here->BSIM4DslpRev = -DrainSatCurrent * T1 / Nvtmd; - break; - default: - printf("Specified dioMod = %d not matched\n", model->BSIM4dioMod); - } - } - - /* GEDL current reverse bias */ - T0 = (TRatio - 1.0); - model->BSIM4njtsstemp = model->BSIM4njts * (1.0 + model->BSIM4tnjts * T0); - model->BSIM4njtsswstemp = model->BSIM4njtssw * (1.0 + model->BSIM4tnjtssw * T0); - model->BSIM4njtsswgstemp = model->BSIM4njtsswg * (1.0 + model->BSIM4tnjtsswg * T0); - model->BSIM4njtsdtemp = model->BSIM4njtsd * (1.0 + model->BSIM4tnjtsd * T0); - model->BSIM4njtsswdtemp = model->BSIM4njtsswd * (1.0 + model->BSIM4tnjtsswd * T0); - model->BSIM4njtsswgdtemp = model->BSIM4njtsswgd * (1.0 + model->BSIM4tnjtsswgd * T0); - T7 = Eg0 / model->BSIM4vtm * T0; - T9 = model->BSIM4xtss * T7; - DEXP(T9, T1); - T9 = model->BSIM4xtsd * T7; - DEXP(T9, T2); - T9 = model->BSIM4xtssws * T7; - DEXP(T9, T3); - T9 = model->BSIM4xtsswd * T7; - DEXP(T9, T4); - T9 = model->BSIM4xtsswgs * T7; - DEXP(T9, T5); - T9 = model->BSIM4xtsswgd * T7; - DEXP(T9, T6); - /*IBM TAT*/ - if(model->BSIM4jtweff < 0.0) - { model->BSIM4jtweff = 0.0; - fprintf(stderr, "TAT width dependence effect is negative. Jtweff is clamped to zero.\n"); - } - T11 = sqrt(model->BSIM4jtweff / pParam->BSIM4weffCJ) + 1.0; - - T10 = pParam->BSIM4weffCJ * here->BSIM4nf; - here->BSIM4SjctTempRevSatCur = T1 * here->BSIM4Aseff * model->BSIM4jtss; - here->BSIM4DjctTempRevSatCur = T2 * here->BSIM4Adeff * model->BSIM4jtsd; - here->BSIM4SswTempRevSatCur = T3 * here->BSIM4Pseff * model->BSIM4jtssws; - here->BSIM4DswTempRevSatCur = T4 * here->BSIM4Pdeff * model->BSIM4jtsswd; - here->BSIM4SswgTempRevSatCur = T5 * T10 * T11 * model->BSIM4jtsswgs; - here->BSIM4DswgTempRevSatCur = T6 * T10 * T11 * model->BSIM4jtsswgd; - - if(model->BSIM4mtrlMod != 0 && model->BSIM4mtrlCompatMod == 0) - { - /* Calculate TOXP from EOT */ - /* Calculate Vgs_eff @ Vgs = VDD with Poly Depletion Effect */ - Vtm0eot = KboQ * model->BSIM4tempeot; - Vtmeot = Vtm0eot; - vbieot = Vtm0eot * log(pParam->BSIM4nsd - * pParam->BSIM4ndep / (ni * ni)); - phieot = Vtm0eot * log(pParam->BSIM4ndep / ni) - + pParam->BSIM4phin + 0.4; - tmp2 = here->BSIM4vfb + phieot; - vddeot = model->BSIM4type * model->BSIM4vddeot; - T0 = model->BSIM4epsrgate * EPS0; - if ((pParam->BSIM4ngate > 1.0e18) && (pParam->BSIM4ngate < 1.0e25) - && (vddeot > tmp2) && (T0!=0)) - { - T1 = 1.0e6 * CHARGE * T0 * pParam->BSIM4ngate / - (model->BSIM4coxe * model->BSIM4coxe); - T8 = vddeot - tmp2; - T4 = sqrt(1.0 + 2.0 * T8 / T1); - T2 = 2.0 * T8 / (T4 + 1.0); - T3 = 0.5 * T2 * T2 / T1; - T7 = 1.12 - T3 - 0.05; - T6 = sqrt(T7 * T7 + 0.224); - T5 = 1.12 - 0.5 * (T7 + T6); - Vgs_eff = vddeot - T5; - } - else - Vgs_eff = vddeot; - - /* Calculate Vth @ Vds=Vbs=0 */ - - V0 = vbieot - phieot; - lt1 = model->BSIM4factor1* pParam->BSIM4sqrtXdep0; - ltw = lt1; - T0 = pParam->BSIM4dvt1 * model->BSIM4leffeot / lt1; - if (T0 < EXP_THRESHOLD) - { - T1 = exp(T0); - T2 = T1 - 1.0; - T3 = T2 * T2; - T4 = T3 + 2.0 * T1 * MIN_EXP; - Theta0 = T1 / T4; - } - else - Theta0 = 1.0 / (MAX_EXP - 2.0); - Delt_vth = pParam->BSIM4dvt0 * Theta0 * V0; - T0 = pParam->BSIM4dvt1w * model->BSIM4weffeot * model->BSIM4leffeot / ltw; - if (T0 < EXP_THRESHOLD) - { T1 = exp(T0); - T2 = T1 - 1.0; - T3 = T2 * T2; - T4 = T3 + 2.0 * T1 * MIN_EXP; - T5 = T1 / T4; - } - else - T5 = 1.0 / (MAX_EXP - 2.0); /* 3.0 * MIN_EXP omitted */ - T2 = pParam->BSIM4dvt0w * T5 * V0; - TempRatioeot = model->BSIM4tempeot / model->BSIM4tnom - 1.0; - T0 = sqrt(1.0 + pParam->BSIM4lpe0 / model->BSIM4leffeot); - T1 = pParam->BSIM4k1ox * (T0 - 1.0) * sqrt(phieot) - + (pParam->BSIM4kt1 + pParam->BSIM4kt1l / model->BSIM4leffeot) * TempRatioeot; - Vth_NarrowW = toxe * phieot - / (model->BSIM4weffeot + pParam->BSIM4w0); - Lpe_Vb = sqrt(1.0 + pParam->BSIM4lpeb / model->BSIM4leffeot); - Vth = model->BSIM4type * here->BSIM4vth0 + - (pParam->BSIM4k1ox - pParam->BSIM4k1)*sqrt(phieot)*Lpe_Vb - - Delt_vth - T2 + pParam->BSIM4k3 * Vth_NarrowW + T1; - - /* Calculate n */ - tmp1 = epssub / pParam->BSIM4Xdep0; - tmp2 = pParam->BSIM4nfactor * tmp1; - tmp3 = (tmp2 + pParam->BSIM4cdsc * Theta0 + pParam->BSIM4cit) / model->BSIM4coxe; - if (tmp3 >= -0.5) - n = 1.0 + tmp3; - else - { - T0 = 1.0 / (3.0 + 8.0 * tmp3); - n = (1.0 + 3.0 * tmp3) * T0; - } - - - /* Vth correction for Pocket implant */ - if (pParam->BSIM4dvtp0 > 0.0) - { - T3 = model->BSIM4leffeot + pParam->BSIM4dvtp0 * 2.0; - if (model->BSIM4tempMod < 2) - T4 = Vtmeot * log(model->BSIM4leffeot / T3); - else - T4 = Vtm0eot * log(model->BSIM4leffeot / T3); - Vth -= n * T4; - } - Vgsteff = Vgs_eff-Vth; - /* calculating Toxp */ - T3 = model->BSIM4type * here->BSIM4vth0 - - here->BSIM4vfb - phieot; - T4 = T3 + T3; - T5 = 2.5 * T3; - - vtfbphi2eot = 4.0 * T3; - if (vtfbphi2eot < 0.0) - vtfbphi2eot = 0.0; - - - niter = 0; - toxpf = toxe; - do - { - toxpi = toxpf; - tmp2 = 2.0e8 * toxpf; - T0 = (Vgsteff + vtfbphi2eot) / tmp2; - T1 = 1.0 + exp(model->BSIM4bdos * 0.7 * log(T0)); - Tcen = model->BSIM4ados * 1.9e-9 / T1; - toxpf = toxe - epsrox/model->BSIM4epsrsub * Tcen; - niter++; - } while ((niter<=4)&&(ABS(toxpf-toxpi)>1e-12)); - here->BSIM4toxp = toxpf; - here->BSIM4coxp = epsrox * EPS0 / here->BSIM4toxp; - } else { - here->BSIM4toxp = model->BSIM4toxp; - here->BSIM4coxp = model->BSIM4coxp; - } - - if (BSIM4checkModel(model, here, ckt)) - { - SPfrontEnd->IFerrorf(ERR_FATAL, - "detected during BSIM4.8.1 parameter checking for \n model %s of device instance %s\n", model->BSIM4modName, here->BSIM4name); - return(E_BADPARM); - } - } /* End instance */ - } - return(OK); -} diff --git a/src/spicelib/devices/bsim4/b4trunc.c b/src/spicelib/devices/bsim4/b4trunc.c deleted file mode 100644 index 3d4ec53ba..000000000 --- a/src/spicelib/devices/bsim4/b4trunc.c +++ /dev/null @@ -1,108 +0,0 @@ -/* ****************************************************************************** - * BSIM4 4.8.1 released by Chetan Kumar Dabhi 2/15/2017 * - * BSIM4 Model Equations * - ****************************************************************************** - - ****************************************************************************** - * Copyright 2017 Regents of the University of California. * - * All rights reserved. * - * * - * Project Director: Prof. Chenming Hu. * - * Authors: Gary W. Ng, Weidong Liu, Xuemei Xi, Mohan Dunga, Wenwei Yang * - * Ali Niknejad, Shivendra Singh Parihar, Chetan Kumar Dabhi * - * Yogesh Singh Chauhan, Sayeef Salahuddin, Chenming Hu * - ****************************************************************************** - - ****************************************************************************** - * CMC In-Code Statement * - * * - * The Developer agrees that the following statement will appear in the * - * model code that has been adopted as a CMC Standard. * - * * - * Software is distributed as is, completely without warranty or service * - * support. The University of California and its employees are not liable * - * for the condition or performance of the software. * - * * - * The University of California owns the copyright and grants users a * - * perpetual, irrevocable, worldwide, non-exclusive, royalty-free license * - * with respect to the software as set forth below. * - * * - * The University of California hereby disclaims all implied warranties. * - * * - * The University of California grants the users the right to modify, * - * copy, and redistribute the software and documentation, both within * - * the user's organization and externally, subject to the following * - * restrictions: * - * * - * 1. The users agree not to charge for the University of California code * - * itself but may charge for additions, extensions, or support. * - * * - * 2. In any product based on the software, the users agree to * - * acknowledge the University of California that developed the * - * software. This acknowledgment shall appear in the product * - * documentation. * - * * - * 3. Redistributions to others of source code and documentation must * - * retain the copyright notice, disclaimer, and list of conditions. * - * * - * 4. Redistributions to others in binary form must reproduce the * - * copyright notice, disclaimer, and list of conditions in the * - * documentation and/or other materials provided with the * - * distribution. * - * * - * Agreed to on ______Feb. 15, 2017______________ * - * * - * By: ____University of California, Berkeley___ * - * ____Chenming Hu__________________________ * - * ____Professor in Graduate School ________ * - * * - ****************************************************************************** */ - -#include "ngspice/ngspice.h" -#include "ngspice/cktdefs.h" -#include "bsim4def.h" -#include "ngspice/sperror.h" -#include "ngspice/suffix.h" - - -int -BSIM4trunc( -GENmodel *inModel, -CKTcircuit *ckt, -double *timeStep) -{ -BSIM4model *model = (BSIM4model*)inModel; -BSIM4instance *here; - -#ifdef STEPDEBUG - double debugtemp; -#endif /* STEPDEBUG */ - - for (; model != NULL; model = BSIM4nextModel(model)) - { for (here = BSIM4instances(model); here != NULL; - here = BSIM4nextInstance(here)) - { -#ifdef STEPDEBUG - debugtemp = *timeStep; -#endif /* STEPDEBUG */ - CKTterr(here->BSIM4qb,ckt,timeStep); - CKTterr(here->BSIM4qg,ckt,timeStep); - CKTterr(here->BSIM4qd,ckt,timeStep); - if (here->BSIM4trnqsMod) - CKTterr(here->BSIM4qcdump,ckt,timeStep); - if (here->BSIM4rbodyMod) - { CKTterr(here->BSIM4qbs,ckt,timeStep); - CKTterr(here->BSIM4qbd,ckt,timeStep); - } - if (here->BSIM4rgateMod == 3) - CKTterr(here->BSIM4qgmid,ckt,timeStep); -#ifdef STEPDEBUG - if(debugtemp != *timeStep) - { printf("device %s reduces step from %g to %g\n", - here->BSIM4name,debugtemp,*timeStep); - } -#endif /* STEPDEBUG */ - } - } - return(OK); -} diff --git a/src/spicelib/devices/bsim4/bsim4def.h b/src/spicelib/devices/bsim4/bsim4def.h deleted file mode 100644 index 9afba6144..000000000 --- a/src/spicelib/devices/bsim4/bsim4def.h +++ /dev/null @@ -1,3845 +0,0 @@ -/* ****************************************************************************** - * BSIM4 4.8.1 released by Chetan Kumar Dabhi 2/15/2017 * - * BSIM4 Model Equations * - ****************************************************************************** - - ****************************************************************************** - * Copyright 2017 Regents of the University of California. * - * All rights reserved. * - * * - * Project Director: Prof. Chenming Hu. * - * Authors: Gary W. Ng, Weidong Liu, Xuemei Xi, Mohan Dunga, Wenwei Yang * - * Ali Niknejad, Shivendra Singh Parihar, Chetan Kumar Dabhi * - * Yogesh Singh Chauhan, Sayeef Salahuddin, Chenming Hu * - ****************************************************************************** - - ****************************************************************************** - * CMC In-Code Statement * - * * - * The Developer agrees that the following statement will appear in the * - * model code that has been adopted as a CMC Standard. * - * * - * Software is distributed as is, completely without warranty or service * - * support. The University of California and its employees are not liable * - * for the condition or performance of the software. * - * * - * The University of California owns the copyright and grants users a * - * perpetual, irrevocable, worldwide, non-exclusive, royalty-free license * - * with respect to the software as set forth below. * - * * - * The University of California hereby disclaims all implied warranties. * - * * - * The University of California grants the users the right to modify, * - * copy, and redistribute the software and documentation, both within * - * the user's organization and externally, subject to the following * - * restrictions: * - * * - * 1. The users agree not to charge for the University of California code * - * itself but may charge for additions, extensions, or support. * - * * - * 2. In any product based on the software, the users agree to * - * acknowledge the University of California that developed the * - * software. This acknowledgment shall appear in the product * - * documentation. * - * * - * 3. Redistributions to others of source code and documentation must * - * retain the copyright notice, disclaimer, and list of conditions. * - * * - * 4. Redistributions to others in binary form must reproduce the * - * copyright notice, disclaimer, and list of conditions in the * - * documentation and/or other materials provided with the * - * distribution. * - * * - * Agreed to on ______Feb. 15, 2017______________ * - * * - * By: ____University of California, Berkeley___ * - * ____Chenming Hu__________________________ * - * ____Professor in Graduate School ________ * - * * - ****************************************************************************** */ - -#ifndef BSIM4 -#define BSIM4 - -#include "ngspice/ifsim.h" -#include "ngspice/gendefs.h" -#include "ngspice/cktdefs.h" -#include "ngspice/complex.h" -#include "ngspice/noisedef.h" - -typedef struct sBSIM4instance -{ - - struct GENinstance gen; - -#define BSIM4modPtr(inst) ((struct sBSIM4model *)((inst)->gen.GENmodPtr)) -#define BSIM4nextInstance(inst) ((struct sBSIM4instance *)((inst)->gen.GENnextInstance)) -#define BSIM4name gen.GENname -#define BSIM4states gen.GENstate - - const int BSIM4dNode; - const int BSIM4gNodeExt; - const int BSIM4sNode; - const int BSIM4bNode; - int BSIM4dNodePrime; - int BSIM4gNodePrime; - int BSIM4gNodeMid; - int BSIM4sNodePrime; - int BSIM4bNodePrime; - int BSIM4dbNode; - int BSIM4sbNode; - int BSIM4qNode; - - double BSIM4ueff; - double BSIM4thetavth; - double BSIM4von; - double BSIM4vdsat; - double BSIM4cgdo; - double BSIM4qgdo; - double BSIM4cgso; - double BSIM4qgso; - double BSIM4grbsb; - double BSIM4grbdb; - double BSIM4grbpb; - double BSIM4grbps; - double BSIM4grbpd; - - double BSIM4vjsmFwd; - double BSIM4vjsmRev; - double BSIM4vjdmFwd; - double BSIM4vjdmRev; - double BSIM4XExpBVS; - double BSIM4XExpBVD; - double BSIM4SslpFwd; - double BSIM4SslpRev; - double BSIM4DslpFwd; - double BSIM4DslpRev; - double BSIM4IVjsmFwd; - double BSIM4IVjsmRev; - double BSIM4IVjdmFwd; - double BSIM4IVjdmRev; - - double BSIM4grgeltd; - double BSIM4Pseff; - double BSIM4Pdeff; - double BSIM4Aseff; - double BSIM4Adeff; - - double BSIM4l; - double BSIM4w; - double BSIM4drainArea; - double BSIM4sourceArea; - double BSIM4drainSquares; - double BSIM4sourceSquares; - double BSIM4drainPerimeter; - double BSIM4sourcePerimeter; - double BSIM4sourceConductance; - double BSIM4drainConductance; - /* stress effect instance param */ - double BSIM4sa; - double BSIM4sb; - double BSIM4sd; - double BSIM4sca; - double BSIM4scb; - double BSIM4scc; - double BSIM4sc; - - double BSIM4rbdb; - double BSIM4rbsb; - double BSIM4rbpb; - double BSIM4rbps; - double BSIM4rbpd; - - double BSIM4delvto; - double BSIM4mulu0; - int BSIM4wnflag; - double BSIM4xgw; - double BSIM4ngcon; - - /* added here to account stress effect instance dependence */ - double BSIM4u0temp; - double BSIM4vsattemp; - double BSIM4vth0; - double BSIM4vfb; - double BSIM4vfbzb; - double BSIM4vtfbphi1; - double BSIM4vtfbphi2; - double BSIM4k2; - double BSIM4vbsc; - double BSIM4k2ox; - double BSIM4eta0; - double BSIM4toxp; - double BSIM4coxp; - - double BSIM4icVDS; - double BSIM4icVGS; - double BSIM4icVBS; - double BSIM4m; - double BSIM4nf; - int BSIM4off; - int BSIM4mode; - int BSIM4trnqsMod; - int BSIM4acnqsMod; - int BSIM4rbodyMod; - int BSIM4rgateMod; - int BSIM4geoMod; - int BSIM4rgeoMod; - int BSIM4min; - - - /* OP point */ - double BSIM4Vgsteff; - double BSIM4vgs_eff; - double BSIM4vgd_eff; - double BSIM4dvgs_eff_dvg; - double BSIM4dvgd_eff_dvg; - double BSIM4Vdseff; - double BSIM4nstar; - double BSIM4Abulk; - double BSIM4EsatL; - double BSIM4AbovVgst2Vtm; - double BSIM4qinv; - double BSIM4cd; - double BSIM4cbs; - double BSIM4cbd; - double BSIM4csub; - double BSIM4Igidl; - double BSIM4Igisl; - double BSIM4gm; - double BSIM4gds; - double BSIM4gmbs; - double BSIM4gbd; - double BSIM4gbs; - double BSIM4noiGd0; /* tnoiMod=2 (v4.7) */ - double BSIM4Coxeff; - - double BSIM4gbbs; - double BSIM4gbgs; - double BSIM4gbds; - double BSIM4ggidld; - double BSIM4ggidlg; - double BSIM4ggidls; - double BSIM4ggidlb; - double BSIM4ggisld; - double BSIM4ggislg; - double BSIM4ggisls; - double BSIM4ggislb; - - double BSIM4Igcs; - double BSIM4gIgcsg; - double BSIM4gIgcsd; - double BSIM4gIgcss; - double BSIM4gIgcsb; - double BSIM4Igcd; - double BSIM4gIgcdg; - double BSIM4gIgcdd; - double BSIM4gIgcds; - double BSIM4gIgcdb; - - double BSIM4Igs; - double BSIM4gIgsg; - double BSIM4gIgss; - double BSIM4Igd; - double BSIM4gIgdg; - double BSIM4gIgdd; - - double BSIM4Igb; - double BSIM4gIgbg; - double BSIM4gIgbd; - double BSIM4gIgbs; - double BSIM4gIgbb; - - double BSIM4grdsw; - double BSIM4IdovVds; - double BSIM4gcrg; - double BSIM4gcrgd; - double BSIM4gcrgg; - double BSIM4gcrgs; - double BSIM4gcrgb; - - double BSIM4gstot; - double BSIM4gstotd; - double BSIM4gstotg; - double BSIM4gstots; - double BSIM4gstotb; - - double BSIM4gdtot; - double BSIM4gdtotd; - double BSIM4gdtotg; - double BSIM4gdtots; - double BSIM4gdtotb; - - double BSIM4cggb; - double BSIM4cgdb; - double BSIM4cgsb; - double BSIM4cbgb; - double BSIM4cbdb; - double BSIM4cbsb; - double BSIM4cdgb; - double BSIM4cddb; - double BSIM4cdsb; - double BSIM4csgb; - double BSIM4csdb; - double BSIM4cssb; - double BSIM4cgbb; - double BSIM4cdbb; - double BSIM4csbb; - double BSIM4cbbb; - double BSIM4capbd; - double BSIM4capbs; - - double BSIM4cqgb; - double BSIM4cqdb; - double BSIM4cqsb; - double BSIM4cqbb; - - double BSIM4qgate; - double BSIM4qbulk; - double BSIM4qdrn; - double BSIM4qsrc; - double BSIM4qdef; - - double BSIM4qchqs; - double BSIM4taunet; - double BSIM4gtau; - double BSIM4gtg; - double BSIM4gtd; - double BSIM4gts; - double BSIM4gtb; - double BSIM4SjctTempRevSatCur; - double BSIM4DjctTempRevSatCur; - double BSIM4SswTempRevSatCur; - double BSIM4DswTempRevSatCur; - double BSIM4SswgTempRevSatCur; - double BSIM4DswgTempRevSatCur; - - struct bsim4SizeDependParam *pParam; - - unsigned BSIM4lGiven :1; - unsigned BSIM4wGiven :1; - unsigned BSIM4mGiven :1; - unsigned BSIM4nfGiven :1; - unsigned BSIM4minGiven :1; - unsigned BSIM4drainAreaGiven :1; - unsigned BSIM4sourceAreaGiven :1; - unsigned BSIM4drainSquaresGiven :1; - unsigned BSIM4sourceSquaresGiven :1; - unsigned BSIM4drainPerimeterGiven :1; - unsigned BSIM4sourcePerimeterGiven :1; - unsigned BSIM4saGiven :1; - unsigned BSIM4sbGiven :1; - unsigned BSIM4sdGiven :1; - unsigned BSIM4scaGiven :1; - unsigned BSIM4scbGiven :1; - unsigned BSIM4sccGiven :1; - unsigned BSIM4scGiven :1; - unsigned BSIM4rbdbGiven :1; - unsigned BSIM4rbsbGiven :1; - unsigned BSIM4rbpbGiven :1; - unsigned BSIM4rbpdGiven :1; - unsigned BSIM4rbpsGiven :1; - unsigned BSIM4delvtoGiven :1; - unsigned BSIM4mulu0Given :1; - unsigned BSIM4wnflagGiven :1; - unsigned BSIM4xgwGiven :1; - unsigned BSIM4ngconGiven :1; - unsigned BSIM4icVDSGiven :1; - unsigned BSIM4icVGSGiven :1; - unsigned BSIM4icVBSGiven :1; - unsigned BSIM4trnqsModGiven :1; - unsigned BSIM4acnqsModGiven :1; - unsigned BSIM4rbodyModGiven :1; - unsigned BSIM4rgateModGiven :1; - unsigned BSIM4geoModGiven :1; - unsigned BSIM4rgeoModGiven :1; - - - double *BSIM4DPdPtr; - double *BSIM4DPdpPtr; - double *BSIM4DPgpPtr; - double *BSIM4DPgmPtr; - double *BSIM4DPspPtr; - double *BSIM4DPbpPtr; - double *BSIM4DPdbPtr; - - double *BSIM4DdPtr; - double *BSIM4DdpPtr; - - double *BSIM4GPdpPtr; - double *BSIM4GPgpPtr; - double *BSIM4GPgmPtr; - double *BSIM4GPgePtr; - double *BSIM4GPspPtr; - double *BSIM4GPbpPtr; - - double *BSIM4GMdpPtr; - double *BSIM4GMgpPtr; - double *BSIM4GMgmPtr; - double *BSIM4GMgePtr; - double *BSIM4GMspPtr; - double *BSIM4GMbpPtr; - - double *BSIM4GEdpPtr; - double *BSIM4GEgpPtr; - double *BSIM4GEgmPtr; - double *BSIM4GEgePtr; - double *BSIM4GEspPtr; - double *BSIM4GEbpPtr; - - double *BSIM4SPdpPtr; - double *BSIM4SPgpPtr; - double *BSIM4SPgmPtr; - double *BSIM4SPsPtr; - double *BSIM4SPspPtr; - double *BSIM4SPbpPtr; - double *BSIM4SPsbPtr; - - double *BSIM4SspPtr; - double *BSIM4SsPtr; - - double *BSIM4BPdpPtr; - double *BSIM4BPgpPtr; - double *BSIM4BPgmPtr; - double *BSIM4BPspPtr; - double *BSIM4BPdbPtr; - double *BSIM4BPbPtr; - double *BSIM4BPsbPtr; - double *BSIM4BPbpPtr; - - double *BSIM4DBdpPtr; - double *BSIM4DBdbPtr; - double *BSIM4DBbpPtr; - double *BSIM4DBbPtr; - - double *BSIM4SBspPtr; - double *BSIM4SBbpPtr; - double *BSIM4SBbPtr; - double *BSIM4SBsbPtr; - - double *BSIM4BdbPtr; - double *BSIM4BbpPtr; - double *BSIM4BsbPtr; - double *BSIM4BbPtr; - - double *BSIM4DgpPtr; - double *BSIM4DspPtr; - double *BSIM4DbpPtr; - double *BSIM4SdpPtr; - double *BSIM4SgpPtr; - double *BSIM4SbpPtr; - - double *BSIM4QdpPtr; - double *BSIM4QgpPtr; - double *BSIM4QspPtr; - double *BSIM4QbpPtr; - double *BSIM4QqPtr; - double *BSIM4DPqPtr; - double *BSIM4GPqPtr; - double *BSIM4SPqPtr; - -#ifdef USE_OMP - /* per instance storage of results, to update matrix at a later stge */ - double BSIM4rhsdPrime; - double BSIM4rhsgPrime; - double BSIM4rhsgExt; - double BSIM4grhsMid; - double BSIM4rhsbPrime; - double BSIM4rhssPrime; - double BSIM4rhsdb; - double BSIM4rhssb; - double BSIM4rhsd; - double BSIM4rhss; - double BSIM4rhsq; - - double BSIM4_1; - double BSIM4_2; - double BSIM4_3; - double BSIM4_4; - double BSIM4_5; - double BSIM4_6; - double BSIM4_7; - double BSIM4_8; - double BSIM4_9; - double BSIM4_10; - double BSIM4_11; - double BSIM4_12; - double BSIM4_13; - double BSIM4_14; - double BSIM4_15; - double BSIM4_16; - double BSIM4_17; - double BSIM4_18; - double BSIM4_19; - double BSIM4_20; - double BSIM4_21; - double BSIM4_22; - double BSIM4_23; - double BSIM4_24; - double BSIM4_25; - double BSIM4_26; - double BSIM4_27; - double BSIM4_28; - double BSIM4_29; - double BSIM4_30; - double BSIM4_31; - double BSIM4_32; - double BSIM4_33; - double BSIM4_34; - double BSIM4_35; - double BSIM4_36; - double BSIM4_37; - double BSIM4_38; - double BSIM4_39; - double BSIM4_40; - double BSIM4_41; - double BSIM4_42; - double BSIM4_43; - double BSIM4_44; - double BSIM4_45; - double BSIM4_46; - double BSIM4_47; - double BSIM4_48; - double BSIM4_49; - double BSIM4_50; - double BSIM4_51; - double BSIM4_52; - double BSIM4_53; - double BSIM4_54; - double BSIM4_55; - double BSIM4_56; - double BSIM4_57; - double BSIM4_58; - double BSIM4_59; - double BSIM4_60; - double BSIM4_61; - double BSIM4_62; - double BSIM4_63; - double BSIM4_64; - double BSIM4_65; - double BSIM4_66; - double BSIM4_67; - double BSIM4_68; - double BSIM4_69; - double BSIM4_70; - double BSIM4_71; - double BSIM4_72; - double BSIM4_73; - double BSIM4_74; - double BSIM4_75; - double BSIM4_76; - double BSIM4_77; - double BSIM4_78; - double BSIM4_79; - double BSIM4_80; - double BSIM4_81; - double BSIM4_82; - double BSIM4_83; - double BSIM4_84; - double BSIM4_85; - double BSIM4_86; - double BSIM4_87; - double BSIM4_88; - double BSIM4_89; - double BSIM4_90; - double BSIM4_91; - double BSIM4_92; - double BSIM4_93; - double BSIM4_94; - double BSIM4_95; - double BSIM4_96; - double BSIM4_97; - double BSIM4_98; - double BSIM4_99; - double BSIM4_100; - double BSIM4_101; - double BSIM4_102; - double BSIM4_103; -#endif - -#define BSIM4vbd BSIM4states+ 0 -#define BSIM4vbs BSIM4states+ 1 -#define BSIM4vgs BSIM4states+ 2 -#define BSIM4vds BSIM4states+ 3 -#define BSIM4vdbs BSIM4states+ 4 -#define BSIM4vdbd BSIM4states+ 5 -#define BSIM4vsbs BSIM4states+ 6 -#define BSIM4vges BSIM4states+ 7 -#define BSIM4vgms BSIM4states+ 8 -#define BSIM4vses BSIM4states+ 9 -#define BSIM4vdes BSIM4states+ 10 - -#define BSIM4qb BSIM4states+ 11 -#define BSIM4cqb BSIM4states+ 12 -#define BSIM4qg BSIM4states+ 13 -#define BSIM4cqg BSIM4states+ 14 -#define BSIM4qd BSIM4states+ 15 -#define BSIM4cqd BSIM4states+ 16 -#define BSIM4qgmid BSIM4states+ 17 -#define BSIM4cqgmid BSIM4states+ 18 - -#define BSIM4qbs BSIM4states+ 19 -#define BSIM4cqbs BSIM4states+ 20 -#define BSIM4qbd BSIM4states+ 21 -#define BSIM4cqbd BSIM4states+ 22 - -#define BSIM4qcheq BSIM4states+ 23 -#define BSIM4cqcheq BSIM4states+ 24 -#define BSIM4qcdump BSIM4states+ 25 -#define BSIM4cqcdump BSIM4states+ 26 -#define BSIM4qdef BSIM4states+ 27 -#define BSIM4qs BSIM4states+ 28 - -#define BSIM4numStates 29 - - -/* indices to the array of BSIM4 NOISE SOURCES */ - -#define BSIM4RDNOIZ 0 -#define BSIM4RSNOIZ 1 -#define BSIM4RGNOIZ 2 -#define BSIM4RBPSNOIZ 3 -#define BSIM4RBPDNOIZ 4 -#define BSIM4RBPBNOIZ 5 -#define BSIM4RBSBNOIZ 6 -#define BSIM4RBDBNOIZ 7 -#define BSIM4IDNOIZ 8 -#define BSIM4FLNOIZ 9 -#define BSIM4IGSNOIZ 10 -#define BSIM4IGDNOIZ 11 -#define BSIM4IGBNOIZ 12 -#define BSIM4CORLNOIZ 13 -#define BSIM4TOTNOIZ 14 - -#define BSIM4NSRCS 15 /* Number of BSIM4 noise sources */ - -#ifndef NONOISE - double BSIM4nVar[NSTATVARS][BSIM4NSRCS]; -#else /* NONOISE */ - double **BSIM4nVar; -#endif /* NONOISE */ - -} BSIM4instance ; - -struct bsim4SizeDependParam -{ - double Width; - double Length; - double NFinger; - - double BSIM4cdsc; - double BSIM4cdscb; - double BSIM4cdscd; - double BSIM4cit; - double BSIM4nfactor; - double BSIM4xj; - double BSIM4vsat; - double BSIM4at; - double BSIM4a0; - double BSIM4ags; - double BSIM4a1; - double BSIM4a2; - double BSIM4keta; - double BSIM4nsub; - double BSIM4ndep; - double BSIM4nsd; - double BSIM4phin; - double BSIM4ngate; - double BSIM4gamma1; - double BSIM4gamma2; - double BSIM4vbx; - double BSIM4vbi; - double BSIM4vbm; - double BSIM4xt; - double BSIM4phi; - double BSIM4litl; - double BSIM4k1; - double BSIM4kt1; - double BSIM4kt1l; - double BSIM4kt2; - double BSIM4k2; - double BSIM4k3; - double BSIM4k3b; - double BSIM4w0; - double BSIM4dvtp0; - double BSIM4dvtp1; - double BSIM4dvtp2; /* New DIBL/Rout */ - double BSIM4dvtp3; - double BSIM4dvtp4; - double BSIM4dvtp5; - double BSIM4lpe0; - double BSIM4lpeb; - double BSIM4dvt0; - double BSIM4dvt1; - double BSIM4dvt2; - double BSIM4dvt0w; - double BSIM4dvt1w; - double BSIM4dvt2w; - double BSIM4drout; - double BSIM4dsub; - double BSIM4vth0; - double BSIM4ua; - double BSIM4ua1; - double BSIM4ub; - double BSIM4ub1; - double BSIM4uc; - double BSIM4uc1; - double BSIM4ud; - double BSIM4ud1; - double BSIM4up; - double BSIM4lp; - double BSIM4u0; - double BSIM4eu; - double BSIM4ucs; - double BSIM4ute; - double BSIM4ucste; - double BSIM4voff; - double BSIM4tvoff; - double BSIM4tnfactor; /* v4.7 Temp dep of leakage current */ - double BSIM4teta0; /* v4.7 temp dep of leakage current */ - double BSIM4tvoffcv; /* v4.7 temp dep of leakage current */ - double BSIM4minv; - double BSIM4minvcv; - double BSIM4vfb; - double BSIM4delta; - double BSIM4rdsw; - double BSIM4rds0; - double BSIM4rs0; - double BSIM4rd0; - double BSIM4rsw; - double BSIM4rdw; - double BSIM4prwg; - double BSIM4prwb; - double BSIM4prt; - double BSIM4eta0; - double BSIM4etab; - double BSIM4pclm; - double BSIM4pdibl1; - double BSIM4pdibl2; - double BSIM4pdiblb; - double BSIM4fprout; - double BSIM4pdits; - double BSIM4pditsd; - double BSIM4pscbe1; - double BSIM4pscbe2; - double BSIM4pvag; - double BSIM4wr; - double BSIM4dwg; - double BSIM4dwb; - double BSIM4b0; - double BSIM4b1; - double BSIM4alpha0; - double BSIM4alpha1; - double BSIM4beta0; - double BSIM4agidl; - double BSIM4bgidl; - double BSIM4cgidl; - double BSIM4egidl; - double BSIM4fgidl; /* v4.7 New GIDL/GISL */ - double BSIM4kgidl; /* v4.7 New GIDL/GISL */ - double BSIM4rgidl; /* v4.7 New GIDL/GISL */ - double BSIM4agisl; - double BSIM4bgisl; - double BSIM4cgisl; - double BSIM4egisl; - double BSIM4fgisl; /* v4.7 New GIDL/GISL */ - double BSIM4kgisl; /* v4.7 New GIDL/GISL */ - double BSIM4rgisl; /* v4.7 New GIDL/GISL */ - double BSIM4aigc; - double BSIM4bigc; - double BSIM4cigc; - double BSIM4aigsd; - double BSIM4bigsd; - double BSIM4cigsd; - double BSIM4aigs; - double BSIM4bigs; - double BSIM4cigs; - double BSIM4aigd; - double BSIM4bigd; - double BSIM4cigd; - double BSIM4aigbacc; - double BSIM4bigbacc; - double BSIM4cigbacc; - double BSIM4aigbinv; - double BSIM4bigbinv; - double BSIM4cigbinv; - double BSIM4nigc; - double BSIM4nigbacc; - double BSIM4nigbinv; - double BSIM4ntox; - double BSIM4eigbinv; - double BSIM4pigcd; - double BSIM4poxedge; - double BSIM4xrcrg1; - double BSIM4xrcrg2; - double BSIM4lambda; /* overshoot */ - double BSIM4vtl; /* thermal velocity limit */ - double BSIM4xn; /* back scattering parameter */ - double BSIM4lc; /* back scattering parameter */ - double BSIM4tfactor; /* ballistic transportation factor */ - double BSIM4vfbsdoff; /* S/D flatband offset voltage */ - double BSIM4tvfbsdoff; - -/* added for stress effect */ - double BSIM4ku0; - double BSIM4kvth0; - double BSIM4ku0temp; - double BSIM4rho_ref; - double BSIM4inv_od_ref; -/* added for well proximity effect */ - double BSIM4kvth0we; - double BSIM4k2we; - double BSIM4ku0we; - - /* CV model */ - double BSIM4cgsl; - double BSIM4cgdl; - double BSIM4ckappas; - double BSIM4ckappad; - double BSIM4cf; - double BSIM4clc; - double BSIM4cle; - double BSIM4vfbcv; - double BSIM4noff; - double BSIM4voffcv; - double BSIM4acde; - double BSIM4moin; - -/* Pre-calculated constants */ - - double BSIM4dw; - double BSIM4dl; - double BSIM4leff; - double BSIM4weff; - - double BSIM4dwc; - double BSIM4dlc; - double BSIM4dwj; - double BSIM4leffCV; - double BSIM4weffCV; - double BSIM4weffCJ; - double BSIM4abulkCVfactor; - double BSIM4cgso; - double BSIM4cgdo; - double BSIM4cgbo; - - double BSIM4u0temp; - double BSIM4vsattemp; - double BSIM4sqrtPhi; - double BSIM4phis3; - double BSIM4Xdep0; - double BSIM4sqrtXdep0; - double BSIM4theta0vb0; - double BSIM4thetaRout; - double BSIM4mstar; - double BSIM4VgsteffVth; - double BSIM4mstarcv; - double BSIM4voffcbn; - double BSIM4voffcbncv; - double BSIM4rdswmin; - double BSIM4rdwmin; - double BSIM4rswmin; - double BSIM4vfbsd; - - double BSIM4cof1; - double BSIM4cof2; - double BSIM4cof3; - double BSIM4cof4; - double BSIM4cdep0; - double BSIM4ToxRatio; - double BSIM4Aechvb; - double BSIM4Bechvb; - double BSIM4ToxRatioEdge; - double BSIM4AechvbEdgeS; - double BSIM4AechvbEdgeD; - double BSIM4BechvbEdge; - double BSIM4ldeb; - double BSIM4k1ox; - double BSIM4k2ox; - double BSIM4vfbzbfactor; - double BSIM4dvtp2factor; /* v4.7 */ - struct bsim4SizeDependParam *pNext; -}; - - -typedef struct sBSIM4model -{ - - struct GENmodel gen; - -#define BSIM4modType gen.GENmodType -#define BSIM4nextModel(inst) ((struct sBSIM4model *)((inst)->gen.GENnextModel)) -#define BSIM4instances(inst) ((BSIM4instance *)((inst)->gen.GENinstances)) -#define BSIM4modName gen.GENmodName - - int BSIM4type; - - int BSIM4mobMod; - int BSIM4cvchargeMod; - int BSIM4capMod; - int BSIM4dioMod; - int BSIM4trnqsMod; - int BSIM4acnqsMod; - int BSIM4fnoiMod; - int BSIM4tnoiMod; - int BSIM4rdsMod; - int BSIM4rbodyMod; - int BSIM4rgateMod; - int BSIM4perMod; - int BSIM4geoMod; - int BSIM4rgeoMod; - int BSIM4mtrlMod; - int BSIM4mtrlCompatMod; /* v4.7 */ - int BSIM4gidlMod; /* v4.7 New GIDL/GISL */ - int BSIM4igcMod; - int BSIM4igbMod; - int BSIM4tempMod; - int BSIM4binUnit; - int BSIM4paramChk; - char *BSIM4version; - double BSIM4eot; - double BSIM4vddeot; - double BSIM4tempeot; - double BSIM4leffeot; - double BSIM4weffeot; - double BSIM4ados; - double BSIM4bdos; - double BSIM4toxe; - double BSIM4toxp; - double BSIM4toxm; - double BSIM4dtox; - double BSIM4epsrox; - double BSIM4cdsc; - double BSIM4cdscb; - double BSIM4cdscd; - double BSIM4cit; - double BSIM4nfactor; - double BSIM4xj; - double BSIM4vsat; - double BSIM4at; - double BSIM4a0; - double BSIM4ags; - double BSIM4a1; - double BSIM4a2; - double BSIM4keta; - double BSIM4nsub; - double BSIM4phig; - double BSIM4epsrgate; - double BSIM4easub; - double BSIM4epsrsub; - double BSIM4ni0sub; - double BSIM4bg0sub; - double BSIM4tbgasub; - double BSIM4tbgbsub; - double BSIM4ndep; - double BSIM4nsd; - double BSIM4phin; - double BSIM4ngate; - double BSIM4gamma1; - double BSIM4gamma2; - double BSIM4vbx; - double BSIM4vbm; - double BSIM4xt; - double BSIM4k1; - double BSIM4kt1; - double BSIM4kt1l; - double BSIM4kt2; - double BSIM4k2; - double BSIM4k3; - double BSIM4k3b; - double BSIM4w0; - double BSIM4dvtp0; - double BSIM4dvtp1; - double BSIM4dvtp2; /* New DIBL/Rout */ - double BSIM4dvtp3; - double BSIM4dvtp4; - double BSIM4dvtp5; - double BSIM4lpe0; - double BSIM4lpeb; - double BSIM4dvt0; - double BSIM4dvt1; - double BSIM4dvt2; - double BSIM4dvt0w; - double BSIM4dvt1w; - double BSIM4dvt2w; - double BSIM4drout; - double BSIM4dsub; - double BSIM4vth0; - double BSIM4eu; - double BSIM4ucs; - double BSIM4ua; - double BSIM4ua1; - double BSIM4ub; - double BSIM4ub1; - double BSIM4uc; - double BSIM4uc1; - double BSIM4ud; - double BSIM4ud1; - double BSIM4up; - double BSIM4lp; - double BSIM4u0; - double BSIM4ute; - double BSIM4ucste; - double BSIM4voff; - double BSIM4tvoff; - double BSIM4tnfactor; /* v4.7 Temp dep of leakage current */ - double BSIM4teta0; /* v4.7 temp dep of leakage current */ - double BSIM4tvoffcv; /* v4.7 temp dep of leakage current */ - double BSIM4minv; - double BSIM4minvcv; - double BSIM4voffl; - double BSIM4voffcvl; - double BSIM4delta; - double BSIM4rdsw; - double BSIM4rdswmin; - double BSIM4rdwmin; - double BSIM4rswmin; - double BSIM4rsw; - double BSIM4rdw; - double BSIM4prwg; - double BSIM4prwb; - double BSIM4prt; - double BSIM4eta0; - double BSIM4etab; - double BSIM4pclm; - double BSIM4pdibl1; - double BSIM4pdibl2; - double BSIM4pdiblb; - double BSIM4fprout; - double BSIM4pdits; - double BSIM4pditsd; - double BSIM4pditsl; - double BSIM4pscbe1; - double BSIM4pscbe2; - double BSIM4pvag; - double BSIM4wr; - double BSIM4dwg; - double BSIM4dwb; - double BSIM4b0; - double BSIM4b1; - double BSIM4alpha0; - double BSIM4alpha1; - double BSIM4beta0; - double BSIM4agidl; - double BSIM4bgidl; - double BSIM4cgidl; - double BSIM4egidl; - double BSIM4fgidl; /* v4.7 New GIDL/GISL */ - double BSIM4kgidl; /* v4.7 New GIDL/GISL */ - double BSIM4rgidl; /* v4.7 New GIDL/GISL */ - double BSIM4agisl; - double BSIM4bgisl; - double BSIM4cgisl; - double BSIM4egisl; - double BSIM4fgisl; /* v4.7 New GIDL/GISL */ - double BSIM4kgisl; /* v4.7 New GIDL/GISL */ - double BSIM4rgisl; /* v4.7 New GIDL/GISL */ - double BSIM4aigc; - double BSIM4bigc; - double BSIM4cigc; - double BSIM4aigsd; - double BSIM4bigsd; - double BSIM4cigsd; - double BSIM4aigs; - double BSIM4bigs; - double BSIM4cigs; - double BSIM4aigd; - double BSIM4bigd; - double BSIM4cigd; - double BSIM4aigbacc; - double BSIM4bigbacc; - double BSIM4cigbacc; - double BSIM4aigbinv; - double BSIM4bigbinv; - double BSIM4cigbinv; - double BSIM4nigc; - double BSIM4nigbacc; - double BSIM4nigbinv; - double BSIM4ntox; - double BSIM4eigbinv; - double BSIM4pigcd; - double BSIM4poxedge; - double BSIM4toxref; - double BSIM4ijthdfwd; - double BSIM4ijthsfwd; - double BSIM4ijthdrev; - double BSIM4ijthsrev; - double BSIM4xjbvd; - double BSIM4xjbvs; - double BSIM4bvd; - double BSIM4bvs; - - double BSIM4jtss; - double BSIM4jtsd; - double BSIM4jtssws; - double BSIM4jtsswd; - double BSIM4jtsswgs; - double BSIM4jtsswgd; - double BSIM4jtweff; - double BSIM4njts; - double BSIM4njtssw; - double BSIM4njtsswg; - double BSIM4njtsd; - double BSIM4njtsswd; - double BSIM4njtsswgd; - double BSIM4xtss; - double BSIM4xtsd; - double BSIM4xtssws; - double BSIM4xtsswd; - double BSIM4xtsswgs; - double BSIM4xtsswgd; - double BSIM4tnjts; - double BSIM4tnjtssw; - double BSIM4tnjtsswg; - double BSIM4tnjtsd; - double BSIM4tnjtsswd; - double BSIM4tnjtsswgd; - double BSIM4vtss; - double BSIM4vtsd; - double BSIM4vtssws; - double BSIM4vtsswd; - double BSIM4vtsswgs; - double BSIM4vtsswgd; - - double BSIM4xrcrg1; - double BSIM4xrcrg2; - double BSIM4lambda; - double BSIM4vtl; - double BSIM4lc; - double BSIM4xn; - double BSIM4vfbsdoff; /* S/D flatband offset voltage */ - double BSIM4lintnoi; /* lint offset for noise calculation */ - double BSIM4tvfbsdoff; - - double BSIM4vfb; - double BSIM4gbmin; - double BSIM4rbdb; - double BSIM4rbsb; - double BSIM4rbpb; - double BSIM4rbps; - double BSIM4rbpd; - - double BSIM4rbps0; - double BSIM4rbpsl; - double BSIM4rbpsw; - double BSIM4rbpsnf; - - double BSIM4rbpd0; - double BSIM4rbpdl; - double BSIM4rbpdw; - double BSIM4rbpdnf; - - double BSIM4rbpbx0; - double BSIM4rbpbxl; - double BSIM4rbpbxw; - double BSIM4rbpbxnf; - double BSIM4rbpby0; - double BSIM4rbpbyl; - double BSIM4rbpbyw; - double BSIM4rbpbynf; - - double BSIM4rbsbx0; - double BSIM4rbsby0; - double BSIM4rbdbx0; - double BSIM4rbdby0; - - double BSIM4rbsdbxl; - double BSIM4rbsdbxw; - double BSIM4rbsdbxnf; - double BSIM4rbsdbyl; - double BSIM4rbsdbyw; - double BSIM4rbsdbynf; - - double BSIM4tnoia; - double BSIM4tnoib; - double BSIM4tnoic; - double BSIM4rnoia; - double BSIM4rnoib; - double BSIM4rnoic; - double BSIM4ntnoi; - - /* CV model and Parasitics */ - double BSIM4cgsl; - double BSIM4cgdl; - double BSIM4ckappas; - double BSIM4ckappad; - double BSIM4cf; - double BSIM4vfbcv; - double BSIM4clc; - double BSIM4cle; - double BSIM4dwc; - double BSIM4dlc; - double BSIM4xw; - double BSIM4xl; - double BSIM4dlcig; - double BSIM4dlcigd; - double BSIM4dwj; - double BSIM4noff; - double BSIM4voffcv; - double BSIM4acde; - double BSIM4moin; - double BSIM4tcj; - double BSIM4tcjsw; - double BSIM4tcjswg; - double BSIM4tpb; - double BSIM4tpbsw; - double BSIM4tpbswg; - double BSIM4dmcg; - double BSIM4dmci; - double BSIM4dmdg; - double BSIM4dmcgt; - double BSIM4xgw; - double BSIM4xgl; - double BSIM4rshg; - double BSIM4ngcon; - - /* Length Dependence */ - double BSIM4lcdsc; - double BSIM4lcdscb; - double BSIM4lcdscd; - double BSIM4lcit; - double BSIM4lnfactor; - double BSIM4lxj; - double BSIM4lvsat; - double BSIM4lat; - double BSIM4la0; - double BSIM4lags; - double BSIM4la1; - double BSIM4la2; - double BSIM4lketa; - double BSIM4lnsub; - double BSIM4lndep; - double BSIM4lnsd; - double BSIM4lphin; - double BSIM4lngate; - double BSIM4lgamma1; - double BSIM4lgamma2; - double BSIM4lvbx; - double BSIM4lvbm; - double BSIM4lxt; - double BSIM4lk1; - double BSIM4lkt1; - double BSIM4lkt1l; - double BSIM4lkt2; - double BSIM4lk2; - double BSIM4lk3; - double BSIM4lk3b; - double BSIM4lw0; - double BSIM4ldvtp0; - double BSIM4ldvtp1; - double BSIM4ldvtp2; /* New DIBL/Rout */ - double BSIM4ldvtp3; - double BSIM4ldvtp4; - double BSIM4ldvtp5; - double BSIM4llpe0; - double BSIM4llpeb; - double BSIM4ldvt0; - double BSIM4ldvt1; - double BSIM4ldvt2; - double BSIM4ldvt0w; - double BSIM4ldvt1w; - double BSIM4ldvt2w; - double BSIM4ldrout; - double BSIM4ldsub; - double BSIM4lvth0; - double BSIM4lua; - double BSIM4lua1; - double BSIM4lub; - double BSIM4lub1; - double BSIM4luc; - double BSIM4luc1; - double BSIM4lud; - double BSIM4lud1; - double BSIM4lup; - double BSIM4llp; - double BSIM4lu0; - double BSIM4leu; - double BSIM4lucs; - double BSIM4lute; - double BSIM4lucste; - double BSIM4lvoff; - double BSIM4ltvoff; - double BSIM4ltnfactor; /* v4.7 Temp dep of leakage current */ - double BSIM4lteta0; /* v4.7 temp dep of leakage current */ - double BSIM4ltvoffcv; /* v4.7 temp dep of leakage current */ - double BSIM4lminv; - double BSIM4lminvcv; - double BSIM4ldelta; - double BSIM4lrdsw; - double BSIM4lrsw; - double BSIM4lrdw; - double BSIM4lprwg; - double BSIM4lprwb; - double BSIM4lprt; - double BSIM4leta0; - double BSIM4letab; - double BSIM4lpclm; - double BSIM4lpdibl1; - double BSIM4lpdibl2; - double BSIM4lpdiblb; - double BSIM4lfprout; - double BSIM4lpdits; - double BSIM4lpditsd; - double BSIM4lpscbe1; - double BSIM4lpscbe2; - double BSIM4lpvag; - double BSIM4lwr; - double BSIM4ldwg; - double BSIM4ldwb; - double BSIM4lb0; - double BSIM4lb1; - double BSIM4lalpha0; - double BSIM4lalpha1; - double BSIM4lbeta0; - double BSIM4lvfb; - double BSIM4lagidl; - double BSIM4lbgidl; - double BSIM4lcgidl; - double BSIM4legidl; - double BSIM4lfgidl; /* v4.7 New GIDL/GISL */ - double BSIM4lkgidl; /* v4.7 New GIDL/GISL */ - double BSIM4lrgidl; /* v4.7 New GIDL/GISL */ - double BSIM4lagisl; - double BSIM4lbgisl; - double BSIM4lcgisl; - double BSIM4legisl; - double BSIM4lfgisl; /* v4.7 New GIDL/GISL */ - double BSIM4lkgisl; /* v4.7 New GIDL/GISL */ - double BSIM4lrgisl; /* v4.7 New GIDL/GISL */ - double BSIM4laigc; - double BSIM4lbigc; - double BSIM4lcigc; - double BSIM4laigsd; - double BSIM4lbigsd; - double BSIM4lcigsd; - double BSIM4laigs; - double BSIM4lbigs; - double BSIM4lcigs; - double BSIM4laigd; - double BSIM4lbigd; - double BSIM4lcigd; - double BSIM4laigbacc; - double BSIM4lbigbacc; - double BSIM4lcigbacc; - double BSIM4laigbinv; - double BSIM4lbigbinv; - double BSIM4lcigbinv; - double BSIM4lnigc; - double BSIM4lnigbacc; - double BSIM4lnigbinv; - double BSIM4lntox; - double BSIM4leigbinv; - double BSIM4lpigcd; - double BSIM4lpoxedge; - double BSIM4lxrcrg1; - double BSIM4lxrcrg2; - double BSIM4llambda; - double BSIM4lvtl; - double BSIM4lxn; - double BSIM4lvfbsdoff; - double BSIM4ltvfbsdoff; - - /* CV model */ - double BSIM4lcgsl; - double BSIM4lcgdl; - double BSIM4lckappas; - double BSIM4lckappad; - double BSIM4lcf; - double BSIM4lclc; - double BSIM4lcle; - double BSIM4lvfbcv; - double BSIM4lnoff; - double BSIM4lvoffcv; - double BSIM4lacde; - double BSIM4lmoin; - - /* Width Dependence */ - double BSIM4wcdsc; - double BSIM4wcdscb; - double BSIM4wcdscd; - double BSIM4wcit; - double BSIM4wnfactor; - double BSIM4wxj; - double BSIM4wvsat; - double BSIM4wat; - double BSIM4wa0; - double BSIM4wags; - double BSIM4wa1; - double BSIM4wa2; - double BSIM4wketa; - double BSIM4wnsub; - double BSIM4wndep; - double BSIM4wnsd; - double BSIM4wphin; - double BSIM4wngate; - double BSIM4wgamma1; - double BSIM4wgamma2; - double BSIM4wvbx; - double BSIM4wvbm; - double BSIM4wxt; - double BSIM4wk1; - double BSIM4wkt1; - double BSIM4wkt1l; - double BSIM4wkt2; - double BSIM4wk2; - double BSIM4wk3; - double BSIM4wk3b; - double BSIM4ww0; - double BSIM4wdvtp0; - double BSIM4wdvtp1; - double BSIM4wdvtp2; /* New DIBL/Rout */ - double BSIM4wdvtp3; - double BSIM4wdvtp4; - double BSIM4wdvtp5; - double BSIM4wlpe0; - double BSIM4wlpeb; - double BSIM4wdvt0; - double BSIM4wdvt1; - double BSIM4wdvt2; - double BSIM4wdvt0w; - double BSIM4wdvt1w; - double BSIM4wdvt2w; - double BSIM4wdrout; - double BSIM4wdsub; - double BSIM4wvth0; - double BSIM4wua; - double BSIM4wua1; - double BSIM4wub; - double BSIM4wub1; - double BSIM4wuc; - double BSIM4wuc1; - double BSIM4wud; - double BSIM4wud1; - double BSIM4wup; - double BSIM4wlp; - double BSIM4wu0; - double BSIM4weu; - double BSIM4wucs; - double BSIM4wute; - double BSIM4wucste; - double BSIM4wvoff; - double BSIM4wtvoff; - double BSIM4wtnfactor; /* v4.7 Temp dep of leakage current */ - double BSIM4wteta0; /* v4.7 temp dep of leakage current */ - double BSIM4wtvoffcv; /* v4.7 temp dep of leakage current */ - double BSIM4wminv; - double BSIM4wminvcv; - double BSIM4wdelta; - double BSIM4wrdsw; - double BSIM4wrsw; - double BSIM4wrdw; - double BSIM4wprwg; - double BSIM4wprwb; - double BSIM4wprt; - double BSIM4weta0; - double BSIM4wetab; - double BSIM4wpclm; - double BSIM4wpdibl1; - double BSIM4wpdibl2; - double BSIM4wpdiblb; - double BSIM4wfprout; - double BSIM4wpdits; - double BSIM4wpditsd; - double BSIM4wpscbe1; - double BSIM4wpscbe2; - double BSIM4wpvag; - double BSIM4wwr; - double BSIM4wdwg; - double BSIM4wdwb; - double BSIM4wb0; - double BSIM4wb1; - double BSIM4walpha0; - double BSIM4walpha1; - double BSIM4wbeta0; - double BSIM4wvfb; - double BSIM4wagidl; - double BSIM4wbgidl; - double BSIM4wcgidl; - double BSIM4wegidl; - double BSIM4wfgidl; /* v4.7 New GIDL/GISL */ - double BSIM4wkgidl; /* v4.7 New GIDL/GISL */ - double BSIM4wrgidl; /* v4.7 New GIDL/GISL */ - double BSIM4wagisl; - double BSIM4wbgisl; - double BSIM4wcgisl; - double BSIM4wegisl; - double BSIM4wfgisl; /* v4.7 New GIDL/GISL */ - double BSIM4wkgisl; /* v4.7 New GIDL/GISL */ - double BSIM4wrgisl; /* v4.7 New GIDL/GISL */ - double BSIM4waigc; - double BSIM4wbigc; - double BSIM4wcigc; - double BSIM4waigsd; - double BSIM4wbigsd; - double BSIM4wcigsd; - double BSIM4waigs; - double BSIM4wbigs; - double BSIM4wcigs; - double BSIM4waigd; - double BSIM4wbigd; - double BSIM4wcigd; - double BSIM4waigbacc; - double BSIM4wbigbacc; - double BSIM4wcigbacc; - double BSIM4waigbinv; - double BSIM4wbigbinv; - double BSIM4wcigbinv; - double BSIM4wnigc; - double BSIM4wnigbacc; - double BSIM4wnigbinv; - double BSIM4wntox; - double BSIM4weigbinv; - double BSIM4wpigcd; - double BSIM4wpoxedge; - double BSIM4wxrcrg1; - double BSIM4wxrcrg2; - double BSIM4wlambda; - double BSIM4wvtl; - double BSIM4wxn; - double BSIM4wvfbsdoff; - double BSIM4wtvfbsdoff; - - /* CV model */ - double BSIM4wcgsl; - double BSIM4wcgdl; - double BSIM4wckappas; - double BSIM4wckappad; - double BSIM4wcf; - double BSIM4wclc; - double BSIM4wcle; - double BSIM4wvfbcv; - double BSIM4wnoff; - double BSIM4wvoffcv; - double BSIM4wacde; - double BSIM4wmoin; - - /* Cross-term Dependence */ - double BSIM4pcdsc; - double BSIM4pcdscb; - double BSIM4pcdscd; - double BSIM4pcit; - double BSIM4pnfactor; - double BSIM4pxj; - double BSIM4pvsat; - double BSIM4pat; - double BSIM4pa0; - double BSIM4pags; - double BSIM4pa1; - double BSIM4pa2; - double BSIM4pketa; - double BSIM4pnsub; - double BSIM4pndep; - double BSIM4pnsd; - double BSIM4pphin; - double BSIM4pngate; - double BSIM4pgamma1; - double BSIM4pgamma2; - double BSIM4pvbx; - double BSIM4pvbm; - double BSIM4pxt; - double BSIM4pk1; - double BSIM4pkt1; - double BSIM4pkt1l; - double BSIM4pkt2; - double BSIM4pk2; - double BSIM4pk3; - double BSIM4pk3b; - double BSIM4pw0; - double BSIM4pdvtp0; - double BSIM4pdvtp1; - double BSIM4pdvtp2; /* New DIBL/Rout */ - double BSIM4pdvtp3; - double BSIM4pdvtp4; - double BSIM4pdvtp5; - double BSIM4plpe0; - double BSIM4plpeb; - double BSIM4pdvt0; - double BSIM4pdvt1; - double BSIM4pdvt2; - double BSIM4pdvt0w; - double BSIM4pdvt1w; - double BSIM4pdvt2w; - double BSIM4pdrout; - double BSIM4pdsub; - double BSIM4pvth0; - double BSIM4pua; - double BSIM4pua1; - double BSIM4pub; - double BSIM4pub1; - double BSIM4puc; - double BSIM4puc1; - double BSIM4pud; - double BSIM4pud1; - double BSIM4pup; - double BSIM4plp; - double BSIM4pu0; - double BSIM4peu; - double BSIM4pucs; - double BSIM4pute; - double BSIM4pucste; - double BSIM4pvoff; - double BSIM4ptvoff; - double BSIM4ptnfactor; /* v4.7 Temp dep of leakage current */ - double BSIM4pteta0; /* v4.7 temp dep of leakage current */ - double BSIM4ptvoffcv; /* v4.7 temp dep of leakage current */ - double BSIM4pminv; - double BSIM4pminvcv; - double BSIM4pdelta; - double BSIM4prdsw; - double BSIM4prsw; - double BSIM4prdw; - double BSIM4pprwg; - double BSIM4pprwb; - double BSIM4pprt; - double BSIM4peta0; - double BSIM4petab; - double BSIM4ppclm; - double BSIM4ppdibl1; - double BSIM4ppdibl2; - double BSIM4ppdiblb; - double BSIM4pfprout; - double BSIM4ppdits; - double BSIM4ppditsd; - double BSIM4ppscbe1; - double BSIM4ppscbe2; - double BSIM4ppvag; - double BSIM4pwr; - double BSIM4pdwg; - double BSIM4pdwb; - double BSIM4pb0; - double BSIM4pb1; - double BSIM4palpha0; - double BSIM4palpha1; - double BSIM4pbeta0; - double BSIM4pvfb; - double BSIM4pagidl; - double BSIM4pbgidl; - double BSIM4pcgidl; - double BSIM4pegidl; - double BSIM4pfgidl; /* v4.7 New GIDL/GISL */ - double BSIM4pkgidl; /* v4.7 New GIDL/GISL */ - double BSIM4prgidl; /* v4.7 New GIDL/GISL */ - double BSIM4pagisl; - double BSIM4pbgisl; - double BSIM4pcgisl; - double BSIM4pegisl; - double BSIM4pfgisl; /* v4.7 New GIDL/GISL */ - double BSIM4pkgisl; /* v4.7 New GIDL/GISL */ - double BSIM4prgisl; /* v4.7 New GIDL/GISL */ - double BSIM4paigc; - double BSIM4pbigc; - double BSIM4pcigc; - double BSIM4paigsd; - double BSIM4pbigsd; - double BSIM4pcigsd; - double BSIM4paigs; - double BSIM4pbigs; - double BSIM4pcigs; - double BSIM4paigd; - double BSIM4pbigd; - double BSIM4pcigd; - double BSIM4paigbacc; - double BSIM4pbigbacc; - double BSIM4pcigbacc; - double BSIM4paigbinv; - double BSIM4pbigbinv; - double BSIM4pcigbinv; - double BSIM4pnigc; - double BSIM4pnigbacc; - double BSIM4pnigbinv; - double BSIM4pntox; - double BSIM4peigbinv; - double BSIM4ppigcd; - double BSIM4ppoxedge; - double BSIM4pxrcrg1; - double BSIM4pxrcrg2; - double BSIM4plambda; - double BSIM4pvtl; - double BSIM4pxn; - double BSIM4pvfbsdoff; - double BSIM4ptvfbsdoff; - - /* CV model */ - double BSIM4pcgsl; - double BSIM4pcgdl; - double BSIM4pckappas; - double BSIM4pckappad; - double BSIM4pcf; - double BSIM4pclc; - double BSIM4pcle; - double BSIM4pvfbcv; - double BSIM4pnoff; - double BSIM4pvoffcv; - double BSIM4pacde; - double BSIM4pmoin; - - double BSIM4tnom; - double BSIM4cgso; - double BSIM4cgdo; - double BSIM4cgbo; - double BSIM4xpart; - double BSIM4cFringOut; - double BSIM4cFringMax; - - double BSIM4sheetResistance; - double BSIM4SjctSatCurDensity; - double BSIM4DjctSatCurDensity; - double BSIM4SjctSidewallSatCurDensity; - double BSIM4DjctSidewallSatCurDensity; - double BSIM4SjctGateSidewallSatCurDensity; - double BSIM4DjctGateSidewallSatCurDensity; - double BSIM4SbulkJctPotential; - double BSIM4DbulkJctPotential; - double BSIM4SbulkJctBotGradingCoeff; - double BSIM4DbulkJctBotGradingCoeff; - double BSIM4SbulkJctSideGradingCoeff; - double BSIM4DbulkJctSideGradingCoeff; - double BSIM4SbulkJctGateSideGradingCoeff; - double BSIM4DbulkJctGateSideGradingCoeff; - double BSIM4SsidewallJctPotential; - double BSIM4DsidewallJctPotential; - double BSIM4SGatesidewallJctPotential; - double BSIM4DGatesidewallJctPotential; - double BSIM4SunitAreaJctCap; - double BSIM4DunitAreaJctCap; - double BSIM4SunitLengthSidewallJctCap; - double BSIM4DunitLengthSidewallJctCap; - double BSIM4SunitLengthGateSidewallJctCap; - double BSIM4DunitLengthGateSidewallJctCap; - double BSIM4SjctEmissionCoeff; - double BSIM4DjctEmissionCoeff; - double BSIM4SjctTempExponent; - double BSIM4DjctTempExponent; - double BSIM4njtsstemp; - double BSIM4njtsswstemp; - double BSIM4njtsswgstemp; - double BSIM4njtsdtemp; - double BSIM4njtsswdtemp; - double BSIM4njtsswgdtemp; - - double BSIM4Lint; - double BSIM4Ll; - double BSIM4Llc; - double BSIM4Lln; - double BSIM4Lw; - double BSIM4Lwc; - double BSIM4Lwn; - double BSIM4Lwl; - double BSIM4Lwlc; - double BSIM4Lmin; - double BSIM4Lmax; - - double BSIM4Wint; - double BSIM4Wl; - double BSIM4Wlc; - double BSIM4Wln; - double BSIM4Ww; - double BSIM4Wwc; - double BSIM4Wwn; - double BSIM4Wwl; - double BSIM4Wwlc; - double BSIM4Wmin; - double BSIM4Wmax; - - /* added for stress effect */ - double BSIM4saref; - double BSIM4sbref; - double BSIM4wlod; - double BSIM4ku0; - double BSIM4kvsat; - double BSIM4kvth0; - double BSIM4tku0; - double BSIM4llodku0; - double BSIM4wlodku0; - double BSIM4llodvth; - double BSIM4wlodvth; - double BSIM4lku0; - double BSIM4wku0; - double BSIM4pku0; - double BSIM4lkvth0; - double BSIM4wkvth0; - double BSIM4pkvth0; - double BSIM4stk2; - double BSIM4lodk2; - double BSIM4steta0; - double BSIM4lodeta0; - - double BSIM4web; - double BSIM4wec; - double BSIM4kvth0we; - double BSIM4k2we; - double BSIM4ku0we; - double BSIM4scref; - double BSIM4wpemod; - double BSIM4lkvth0we; - double BSIM4lk2we; - double BSIM4lku0we; - double BSIM4wkvth0we; - double BSIM4wk2we; - double BSIM4wku0we; - double BSIM4pkvth0we; - double BSIM4pk2we; - double BSIM4pku0we; - -/* Pre-calculated constants - * move to size-dependent param */ - double BSIM4Eg0; - double BSIM4vtm; - double BSIM4vtm0; - double BSIM4coxe; - double BSIM4coxp; - double BSIM4cof1; - double BSIM4cof2; - double BSIM4cof3; - double BSIM4cof4; - double BSIM4vcrit; - double BSIM4factor1; - double BSIM4PhiBS; - double BSIM4PhiBSWS; - double BSIM4PhiBSWGS; - double BSIM4SjctTempSatCurDensity; - double BSIM4SjctSidewallTempSatCurDensity; - double BSIM4SjctGateSidewallTempSatCurDensity; - double BSIM4PhiBD; - double BSIM4PhiBSWD; - double BSIM4PhiBSWGD; - double BSIM4DjctTempSatCurDensity; - double BSIM4DjctSidewallTempSatCurDensity; - double BSIM4DjctGateSidewallTempSatCurDensity; - double BSIM4SunitAreaTempJctCap; - double BSIM4DunitAreaTempJctCap; - double BSIM4SunitLengthSidewallTempJctCap; - double BSIM4DunitLengthSidewallTempJctCap; - double BSIM4SunitLengthGateSidewallTempJctCap; - double BSIM4DunitLengthGateSidewallTempJctCap; - - double BSIM4oxideTrapDensityA; - double BSIM4oxideTrapDensityB; - double BSIM4oxideTrapDensityC; - double BSIM4em; - double BSIM4ef; - double BSIM4af; - double BSIM4kf; - - double BSIM4vgsMax; - double BSIM4vgdMax; - double BSIM4vgbMax; - double BSIM4vdsMax; - double BSIM4vbsMax; - double BSIM4vbdMax; - double BSIM4vgsrMax; - double BSIM4vgdrMax; - double BSIM4vgbrMax; - double BSIM4vbsrMax; - double BSIM4vbdrMax; - - struct bsim4SizeDependParam *pSizeDependParamKnot; - -#ifdef USE_OMP - int BSIM4InstCount; - struct sBSIM4instance **BSIM4InstanceArray; -#endif - - /* Flags */ - unsigned BSIM4mobModGiven :1; - unsigned BSIM4binUnitGiven :1; - unsigned BSIM4cvchargeModGiven :1; - unsigned BSIM4capModGiven :1; - unsigned BSIM4dioModGiven :1; - unsigned BSIM4rdsModGiven :1; - unsigned BSIM4rbodyModGiven :1; - unsigned BSIM4rgateModGiven :1; - unsigned BSIM4perModGiven :1; - unsigned BSIM4geoModGiven :1; - unsigned BSIM4rgeoModGiven :1; - unsigned BSIM4paramChkGiven :1; - unsigned BSIM4trnqsModGiven :1; - unsigned BSIM4acnqsModGiven :1; - unsigned BSIM4fnoiModGiven :1; - unsigned BSIM4tnoiModGiven :1; - unsigned BSIM4mtrlModGiven :1; - unsigned BSIM4mtrlCompatModGiven :1; - unsigned BSIM4gidlModGiven :1; /* v4.7 New GIDL/GISL */ - unsigned BSIM4igcModGiven :1; - unsigned BSIM4igbModGiven :1; - unsigned BSIM4tempModGiven :1; - unsigned BSIM4typeGiven :1; - unsigned BSIM4toxrefGiven :1; - unsigned BSIM4eotGiven :1; - unsigned BSIM4vddeotGiven :1; - unsigned BSIM4tempeotGiven :1; - unsigned BSIM4leffeotGiven :1; - unsigned BSIM4weffeotGiven :1; - unsigned BSIM4adosGiven :1; - unsigned BSIM4bdosGiven :1; - unsigned BSIM4toxeGiven :1; - unsigned BSIM4toxpGiven :1; - unsigned BSIM4toxmGiven :1; - unsigned BSIM4dtoxGiven :1; - unsigned BSIM4epsroxGiven :1; - unsigned BSIM4versionGiven :1; - unsigned BSIM4cdscGiven :1; - unsigned BSIM4cdscbGiven :1; - unsigned BSIM4cdscdGiven :1; - unsigned BSIM4citGiven :1; - unsigned BSIM4nfactorGiven :1; - unsigned BSIM4xjGiven :1; - unsigned BSIM4vsatGiven :1; - unsigned BSIM4atGiven :1; - unsigned BSIM4a0Given :1; - unsigned BSIM4agsGiven :1; - unsigned BSIM4a1Given :1; - unsigned BSIM4a2Given :1; - unsigned BSIM4ketaGiven :1; - unsigned BSIM4nsubGiven :1; - unsigned BSIM4phigGiven :1; - unsigned BSIM4epsrgateGiven :1; - unsigned BSIM4easubGiven :1; - unsigned BSIM4epsrsubGiven :1; - unsigned BSIM4ni0subGiven :1; - unsigned BSIM4bg0subGiven :1; - unsigned BSIM4tbgasubGiven :1; - unsigned BSIM4tbgbsubGiven :1; - unsigned BSIM4ndepGiven :1; - unsigned BSIM4nsdGiven :1; - unsigned BSIM4phinGiven :1; - unsigned BSIM4ngateGiven :1; - unsigned BSIM4gamma1Given :1; - unsigned BSIM4gamma2Given :1; - unsigned BSIM4vbxGiven :1; - unsigned BSIM4vbmGiven :1; - unsigned BSIM4xtGiven :1; - unsigned BSIM4k1Given :1; - unsigned BSIM4kt1Given :1; - unsigned BSIM4kt1lGiven :1; - unsigned BSIM4kt2Given :1; - unsigned BSIM4k2Given :1; - unsigned BSIM4k3Given :1; - unsigned BSIM4k3bGiven :1; - unsigned BSIM4w0Given :1; - unsigned BSIM4dvtp0Given :1; - unsigned BSIM4dvtp1Given :1; - unsigned BSIM4dvtp2Given :1; /* New DIBL/Rout */ - unsigned BSIM4dvtp3Given :1; - unsigned BSIM4dvtp4Given :1; - unsigned BSIM4dvtp5Given :1; - unsigned BSIM4lpe0Given :1; - unsigned BSIM4lpebGiven :1; - unsigned BSIM4dvt0Given :1; - unsigned BSIM4dvt1Given :1; - unsigned BSIM4dvt2Given :1; - unsigned BSIM4dvt0wGiven :1; - unsigned BSIM4dvt1wGiven :1; - unsigned BSIM4dvt2wGiven :1; - unsigned BSIM4droutGiven :1; - unsigned BSIM4dsubGiven :1; - unsigned BSIM4vth0Given :1; - unsigned BSIM4euGiven :1; - unsigned BSIM4ucsGiven :1; - unsigned BSIM4uaGiven :1; - unsigned BSIM4ua1Given :1; - unsigned BSIM4ubGiven :1; - unsigned BSIM4ub1Given :1; - unsigned BSIM4ucGiven :1; - unsigned BSIM4uc1Given :1; - unsigned BSIM4udGiven :1; - unsigned BSIM4ud1Given :1; - unsigned BSIM4upGiven :1; - unsigned BSIM4lpGiven :1; - unsigned BSIM4u0Given :1; - unsigned BSIM4uteGiven :1; - unsigned BSIM4ucsteGiven :1; - unsigned BSIM4voffGiven :1; - unsigned BSIM4tvoffGiven :1; - unsigned BSIM4tnfactorGiven :1; /* v4.7 Temp dep of leakage current */ - unsigned BSIM4teta0Given :1; /* v4.7 temp dep of leakage current */ - unsigned BSIM4tvoffcvGiven :1; /* v4.7 temp dep of leakage current */ - unsigned BSIM4vofflGiven :1; - unsigned BSIM4voffcvlGiven :1; - unsigned BSIM4minvGiven :1; - unsigned BSIM4minvcvGiven :1; - unsigned BSIM4rdswGiven :1; - unsigned BSIM4rdswminGiven :1; - unsigned BSIM4rdwminGiven :1; - unsigned BSIM4rswminGiven :1; - unsigned BSIM4rswGiven :1; - unsigned BSIM4rdwGiven :1; - unsigned BSIM4prwgGiven :1; - unsigned BSIM4prwbGiven :1; - unsigned BSIM4prtGiven :1; - unsigned BSIM4eta0Given :1; - unsigned BSIM4etabGiven :1; - unsigned BSIM4pclmGiven :1; - unsigned BSIM4pdibl1Given :1; - unsigned BSIM4pdibl2Given :1; - unsigned BSIM4pdiblbGiven :1; - unsigned BSIM4fproutGiven :1; - unsigned BSIM4pditsGiven :1; - unsigned BSIM4pditsdGiven :1; - unsigned BSIM4pditslGiven :1; - unsigned BSIM4pscbe1Given :1; - unsigned BSIM4pscbe2Given :1; - unsigned BSIM4pvagGiven :1; - unsigned BSIM4deltaGiven :1; - unsigned BSIM4wrGiven :1; - unsigned BSIM4dwgGiven :1; - unsigned BSIM4dwbGiven :1; - unsigned BSIM4b0Given :1; - unsigned BSIM4b1Given :1; - unsigned BSIM4alpha0Given :1; - unsigned BSIM4alpha1Given :1; - unsigned BSIM4beta0Given :1; - unsigned BSIM4agidlGiven :1; - unsigned BSIM4bgidlGiven :1; - unsigned BSIM4cgidlGiven :1; - unsigned BSIM4egidlGiven :1; - unsigned BSIM4fgidlGiven :1; /* v4.7 New GIDL/GISL */ - unsigned BSIM4kgidlGiven :1; /* v4.7 New GIDL/GISL */ - unsigned BSIM4rgidlGiven :1; /* v4.7 New GIDL/GISL */ - unsigned BSIM4agislGiven :1; - unsigned BSIM4bgislGiven :1; - unsigned BSIM4cgislGiven :1; - unsigned BSIM4egislGiven :1; - unsigned BSIM4fgislGiven :1; /* v4.7 New GIDL/GISL */ - unsigned BSIM4kgislGiven :1; /* v4.7 New GIDL/GISL */ - unsigned BSIM4rgislGiven :1; /* v4.7 New GIDL/GISL */ - unsigned BSIM4aigcGiven :1; - unsigned BSIM4bigcGiven :1; - unsigned BSIM4cigcGiven :1; - unsigned BSIM4aigsdGiven :1; - unsigned BSIM4bigsdGiven :1; - unsigned BSIM4cigsdGiven :1; - unsigned BSIM4aigsGiven :1; - unsigned BSIM4bigsGiven :1; - unsigned BSIM4cigsGiven :1; - unsigned BSIM4aigdGiven :1; - unsigned BSIM4bigdGiven :1; - unsigned BSIM4cigdGiven :1; - unsigned BSIM4aigbaccGiven :1; - unsigned BSIM4bigbaccGiven :1; - unsigned BSIM4cigbaccGiven :1; - unsigned BSIM4aigbinvGiven :1; - unsigned BSIM4bigbinvGiven :1; - unsigned BSIM4cigbinvGiven :1; - unsigned BSIM4nigcGiven :1; - unsigned BSIM4nigbinvGiven :1; - unsigned BSIM4nigbaccGiven :1; - unsigned BSIM4ntoxGiven :1; - unsigned BSIM4eigbinvGiven :1; - unsigned BSIM4pigcdGiven :1; - unsigned BSIM4poxedgeGiven :1; - unsigned BSIM4ijthdfwdGiven :1; - unsigned BSIM4ijthsfwdGiven :1; - unsigned BSIM4ijthdrevGiven :1; - unsigned BSIM4ijthsrevGiven :1; - unsigned BSIM4xjbvdGiven :1; - unsigned BSIM4xjbvsGiven :1; - unsigned BSIM4bvdGiven :1; - unsigned BSIM4bvsGiven :1; - - unsigned BSIM4jtssGiven :1; - unsigned BSIM4jtsdGiven :1; - unsigned BSIM4jtsswsGiven :1; - unsigned BSIM4jtsswdGiven :1; - unsigned BSIM4jtsswgsGiven :1; - unsigned BSIM4jtsswgdGiven :1; - unsigned BSIM4jtweffGiven :1; - unsigned BSIM4njtsGiven :1; - unsigned BSIM4njtsswGiven :1; - unsigned BSIM4njtsswgGiven :1; - unsigned BSIM4njtsdGiven :1; - unsigned BSIM4njtsswdGiven :1; - unsigned BSIM4njtsswgdGiven :1; - unsigned BSIM4xtssGiven :1; - unsigned BSIM4xtsdGiven :1; - unsigned BSIM4xtsswsGiven :1; - unsigned BSIM4xtsswdGiven :1; - unsigned BSIM4xtsswgsGiven :1; - unsigned BSIM4xtsswgdGiven :1; - unsigned BSIM4tnjtsGiven :1; - unsigned BSIM4tnjtsswGiven :1; - unsigned BSIM4tnjtsswgGiven :1; - unsigned BSIM4tnjtsdGiven :1; - unsigned BSIM4tnjtsswdGiven :1; - unsigned BSIM4tnjtsswgdGiven :1; - unsigned BSIM4vtssGiven :1; - unsigned BSIM4vtsdGiven :1; - unsigned BSIM4vtsswsGiven :1; - unsigned BSIM4vtsswdGiven :1; - unsigned BSIM4vtsswgsGiven :1; - unsigned BSIM4vtsswgdGiven :1; - - unsigned BSIM4vfbGiven :1; - unsigned BSIM4gbminGiven :1; - unsigned BSIM4rbdbGiven :1; - unsigned BSIM4rbsbGiven :1; - unsigned BSIM4rbpsGiven :1; - unsigned BSIM4rbpdGiven :1; - unsigned BSIM4rbpbGiven :1; - - unsigned BSIM4rbps0Given :1; - unsigned BSIM4rbpslGiven :1; - unsigned BSIM4rbpswGiven :1; - unsigned BSIM4rbpsnfGiven :1; - - unsigned BSIM4rbpd0Given :1; - unsigned BSIM4rbpdlGiven :1; - unsigned BSIM4rbpdwGiven :1; - unsigned BSIM4rbpdnfGiven :1; - - unsigned BSIM4rbpbx0Given :1; - unsigned BSIM4rbpbxlGiven :1; - unsigned BSIM4rbpbxwGiven :1; - unsigned BSIM4rbpbxnfGiven :1; - unsigned BSIM4rbpby0Given :1; - unsigned BSIM4rbpbylGiven :1; - unsigned BSIM4rbpbywGiven :1; - unsigned BSIM4rbpbynfGiven :1; - - unsigned BSIM4rbsbx0Given :1; - unsigned BSIM4rbsby0Given :1; - unsigned BSIM4rbdbx0Given :1; - unsigned BSIM4rbdby0Given :1; - - unsigned BSIM4rbsdbxlGiven :1; - unsigned BSIM4rbsdbxwGiven :1; - unsigned BSIM4rbsdbxnfGiven :1; - unsigned BSIM4rbsdbylGiven :1; - unsigned BSIM4rbsdbywGiven :1; - unsigned BSIM4rbsdbynfGiven :1; - - unsigned BSIM4xrcrg1Given :1; - unsigned BSIM4xrcrg2Given :1; - unsigned BSIM4tnoiaGiven :1; - unsigned BSIM4tnoibGiven :1; - unsigned BSIM4tnoicGiven :1; - unsigned BSIM4rnoiaGiven :1; - unsigned BSIM4rnoibGiven :1; - unsigned BSIM4rnoicGiven :1; - unsigned BSIM4ntnoiGiven :1; - - unsigned BSIM4lambdaGiven :1; - unsigned BSIM4vtlGiven :1; - unsigned BSIM4lcGiven :1; - unsigned BSIM4xnGiven :1; - unsigned BSIM4vfbsdoffGiven :1; - unsigned BSIM4lintnoiGiven :1; - unsigned BSIM4tvfbsdoffGiven :1; - - /* CV model and parasitics */ - unsigned BSIM4cgslGiven :1; - unsigned BSIM4cgdlGiven :1; - unsigned BSIM4ckappasGiven :1; - unsigned BSIM4ckappadGiven :1; - unsigned BSIM4cfGiven :1; - unsigned BSIM4vfbcvGiven :1; - unsigned BSIM4clcGiven :1; - unsigned BSIM4cleGiven :1; - unsigned BSIM4dwcGiven :1; - unsigned BSIM4dlcGiven :1; - unsigned BSIM4xwGiven :1; - unsigned BSIM4xlGiven :1; - unsigned BSIM4dlcigGiven :1; - unsigned BSIM4dlcigdGiven :1; - unsigned BSIM4dwjGiven :1; - unsigned BSIM4noffGiven :1; - unsigned BSIM4voffcvGiven :1; - unsigned BSIM4acdeGiven :1; - unsigned BSIM4moinGiven :1; - unsigned BSIM4tcjGiven :1; - unsigned BSIM4tcjswGiven :1; - unsigned BSIM4tcjswgGiven :1; - unsigned BSIM4tpbGiven :1; - unsigned BSIM4tpbswGiven :1; - unsigned BSIM4tpbswgGiven :1; - unsigned BSIM4dmcgGiven :1; - unsigned BSIM4dmciGiven :1; - unsigned BSIM4dmdgGiven :1; - unsigned BSIM4dmcgtGiven :1; - unsigned BSIM4xgwGiven :1; - unsigned BSIM4xglGiven :1; - unsigned BSIM4rshgGiven :1; - unsigned BSIM4ngconGiven :1; - - - /* Length dependence */ - unsigned BSIM4lcdscGiven :1; - unsigned BSIM4lcdscbGiven :1; - unsigned BSIM4lcdscdGiven :1; - unsigned BSIM4lcitGiven :1; - unsigned BSIM4lnfactorGiven :1; - unsigned BSIM4lxjGiven :1; - unsigned BSIM4lvsatGiven :1; - unsigned BSIM4latGiven :1; - unsigned BSIM4la0Given :1; - unsigned BSIM4lagsGiven :1; - unsigned BSIM4la1Given :1; - unsigned BSIM4la2Given :1; - unsigned BSIM4lketaGiven :1; - unsigned BSIM4lnsubGiven :1; - unsigned BSIM4lndepGiven :1; - unsigned BSIM4lnsdGiven :1; - unsigned BSIM4lphinGiven :1; - unsigned BSIM4lngateGiven :1; - unsigned BSIM4lgamma1Given :1; - unsigned BSIM4lgamma2Given :1; - unsigned BSIM4lvbxGiven :1; - unsigned BSIM4lvbmGiven :1; - unsigned BSIM4lxtGiven :1; - unsigned BSIM4lk1Given :1; - unsigned BSIM4lkt1Given :1; - unsigned BSIM4lkt1lGiven :1; - unsigned BSIM4lkt2Given :1; - unsigned BSIM4lk2Given :1; - unsigned BSIM4lk3Given :1; - unsigned BSIM4lk3bGiven :1; - unsigned BSIM4lw0Given :1; - unsigned BSIM4ldvtp0Given :1; - unsigned BSIM4ldvtp1Given :1; - unsigned BSIM4ldvtp2Given :1; /* New DIBL/Rout */ - unsigned BSIM4ldvtp3Given :1; - unsigned BSIM4ldvtp4Given :1; - unsigned BSIM4ldvtp5Given :1; - unsigned BSIM4llpe0Given :1; - unsigned BSIM4llpebGiven :1; - unsigned BSIM4ldvt0Given :1; - unsigned BSIM4ldvt1Given :1; - unsigned BSIM4ldvt2Given :1; - unsigned BSIM4ldvt0wGiven :1; - unsigned BSIM4ldvt1wGiven :1; - unsigned BSIM4ldvt2wGiven :1; - unsigned BSIM4ldroutGiven :1; - unsigned BSIM4ldsubGiven :1; - unsigned BSIM4lvth0Given :1; - unsigned BSIM4luaGiven :1; - unsigned BSIM4lua1Given :1; - unsigned BSIM4lubGiven :1; - unsigned BSIM4lub1Given :1; - unsigned BSIM4lucGiven :1; - unsigned BSIM4luc1Given :1; - unsigned BSIM4ludGiven :1; - unsigned BSIM4lud1Given :1; - unsigned BSIM4lupGiven :1; - unsigned BSIM4llpGiven :1; - unsigned BSIM4lu0Given :1; - unsigned BSIM4leuGiven :1; - unsigned BSIM4lucsGiven :1; - unsigned BSIM4luteGiven :1; - unsigned BSIM4lucsteGiven :1; - unsigned BSIM4lvoffGiven :1; - unsigned BSIM4ltvoffGiven :1; - unsigned BSIM4ltnfactorGiven :1; /* v4.7 Temp dep of leakage current */ - unsigned BSIM4lteta0Given :1; /* v4.7 temp dep of leakage current */ - unsigned BSIM4ltvoffcvGiven :1; /* v4.7 temp dep of leakage current */ - unsigned BSIM4lminvGiven :1; - unsigned BSIM4lminvcvGiven :1; - unsigned BSIM4lrdswGiven :1; - unsigned BSIM4lrswGiven :1; - unsigned BSIM4lrdwGiven :1; - unsigned BSIM4lprwgGiven :1; - unsigned BSIM4lprwbGiven :1; - unsigned BSIM4lprtGiven :1; - unsigned BSIM4leta0Given :1; - unsigned BSIM4letabGiven :1; - unsigned BSIM4lpclmGiven :1; - unsigned BSIM4lpdibl1Given :1; - unsigned BSIM4lpdibl2Given :1; - unsigned BSIM4lpdiblbGiven :1; - unsigned BSIM4lfproutGiven :1; - unsigned BSIM4lpditsGiven :1; - unsigned BSIM4lpditsdGiven :1; - unsigned BSIM4lpscbe1Given :1; - unsigned BSIM4lpscbe2Given :1; - unsigned BSIM4lpvagGiven :1; - unsigned BSIM4ldeltaGiven :1; - unsigned BSIM4lwrGiven :1; - unsigned BSIM4ldwgGiven :1; - unsigned BSIM4ldwbGiven :1; - unsigned BSIM4lb0Given :1; - unsigned BSIM4lb1Given :1; - unsigned BSIM4lalpha0Given :1; - unsigned BSIM4lalpha1Given :1; - unsigned BSIM4lbeta0Given :1; - unsigned BSIM4lvfbGiven :1; - unsigned BSIM4lagidlGiven :1; - unsigned BSIM4lbgidlGiven :1; - unsigned BSIM4lcgidlGiven :1; - unsigned BSIM4legidlGiven :1; - unsigned BSIM4lfgidlGiven :1; /* v4.7 New GIDL/GISL */ - unsigned BSIM4lkgidlGiven :1; /* v4.7 New GIDL/GISL */ - unsigned BSIM4lrgidlGiven :1; /* v4.7 New GIDL/GISL */ - unsigned BSIM4lagislGiven :1; - unsigned BSIM4lbgislGiven :1; - unsigned BSIM4lcgislGiven :1; - unsigned BSIM4legislGiven :1; - unsigned BSIM4lfgislGiven :1; /* v4.7 New GIDL/GISL */ - unsigned BSIM4lkgislGiven :1; /* v4.7 New GIDL/GISL */ - unsigned BSIM4lrgislGiven :1; /* v4.7 New GIDL/GISL */ - unsigned BSIM4laigcGiven :1; - unsigned BSIM4lbigcGiven :1; - unsigned BSIM4lcigcGiven :1; - unsigned BSIM4laigsdGiven :1; - unsigned BSIM4lbigsdGiven :1; - unsigned BSIM4lcigsdGiven :1; - unsigned BSIM4laigsGiven :1; - unsigned BSIM4lbigsGiven :1; - unsigned BSIM4lcigsGiven :1; - unsigned BSIM4laigdGiven :1; - unsigned BSIM4lbigdGiven :1; - unsigned BSIM4lcigdGiven :1; - unsigned BSIM4laigbaccGiven :1; - unsigned BSIM4lbigbaccGiven :1; - unsigned BSIM4lcigbaccGiven :1; - unsigned BSIM4laigbinvGiven :1; - unsigned BSIM4lbigbinvGiven :1; - unsigned BSIM4lcigbinvGiven :1; - unsigned BSIM4lnigcGiven :1; - unsigned BSIM4lnigbinvGiven :1; - unsigned BSIM4lnigbaccGiven :1; - unsigned BSIM4lntoxGiven :1; - unsigned BSIM4leigbinvGiven :1; - unsigned BSIM4lpigcdGiven :1; - unsigned BSIM4lpoxedgeGiven :1; - unsigned BSIM4lxrcrg1Given :1; - unsigned BSIM4lxrcrg2Given :1; - unsigned BSIM4llambdaGiven :1; - unsigned BSIM4lvtlGiven :1; - unsigned BSIM4lxnGiven :1; - unsigned BSIM4lvfbsdoffGiven :1; - unsigned BSIM4ltvfbsdoffGiven :1; - - /* CV model */ - unsigned BSIM4lcgslGiven :1; - unsigned BSIM4lcgdlGiven :1; - unsigned BSIM4lckappasGiven :1; - unsigned BSIM4lckappadGiven :1; - unsigned BSIM4lcfGiven :1; - unsigned BSIM4lclcGiven :1; - unsigned BSIM4lcleGiven :1; - unsigned BSIM4lvfbcvGiven :1; - unsigned BSIM4lnoffGiven :1; - unsigned BSIM4lvoffcvGiven :1; - unsigned BSIM4lacdeGiven :1; - unsigned BSIM4lmoinGiven :1; - - /* Width dependence */ - unsigned BSIM4wcdscGiven :1; - unsigned BSIM4wcdscbGiven :1; - unsigned BSIM4wcdscdGiven :1; - unsigned BSIM4wcitGiven :1; - unsigned BSIM4wnfactorGiven :1; - unsigned BSIM4wxjGiven :1; - unsigned BSIM4wvsatGiven :1; - unsigned BSIM4watGiven :1; - unsigned BSIM4wa0Given :1; - unsigned BSIM4wagsGiven :1; - unsigned BSIM4wa1Given :1; - unsigned BSIM4wa2Given :1; - unsigned BSIM4wketaGiven :1; - unsigned BSIM4wnsubGiven :1; - unsigned BSIM4wndepGiven :1; - unsigned BSIM4wnsdGiven :1; - unsigned BSIM4wphinGiven :1; - unsigned BSIM4wngateGiven :1; - unsigned BSIM4wgamma1Given :1; - unsigned BSIM4wgamma2Given :1; - unsigned BSIM4wvbxGiven :1; - unsigned BSIM4wvbmGiven :1; - unsigned BSIM4wxtGiven :1; - unsigned BSIM4wk1Given :1; - unsigned BSIM4wkt1Given :1; - unsigned BSIM4wkt1lGiven :1; - unsigned BSIM4wkt2Given :1; - unsigned BSIM4wk2Given :1; - unsigned BSIM4wk3Given :1; - unsigned BSIM4wk3bGiven :1; - unsigned BSIM4ww0Given :1; - unsigned BSIM4wdvtp0Given :1; - unsigned BSIM4wdvtp1Given :1; - unsigned BSIM4wdvtp2Given :1; /* New DIBL/Rout */ - unsigned BSIM4wdvtp3Given :1; - unsigned BSIM4wdvtp4Given :1; - unsigned BSIM4wdvtp5Given :1; - unsigned BSIM4wlpe0Given :1; - unsigned BSIM4wlpebGiven :1; - unsigned BSIM4wdvt0Given :1; - unsigned BSIM4wdvt1Given :1; - unsigned BSIM4wdvt2Given :1; - unsigned BSIM4wdvt0wGiven :1; - unsigned BSIM4wdvt1wGiven :1; - unsigned BSIM4wdvt2wGiven :1; - unsigned BSIM4wdroutGiven :1; - unsigned BSIM4wdsubGiven :1; - unsigned BSIM4wvth0Given :1; - unsigned BSIM4wuaGiven :1; - unsigned BSIM4wua1Given :1; - unsigned BSIM4wubGiven :1; - unsigned BSIM4wub1Given :1; - unsigned BSIM4wucGiven :1; - unsigned BSIM4wuc1Given :1; - unsigned BSIM4wudGiven :1; - unsigned BSIM4wud1Given :1; - unsigned BSIM4wupGiven :1; - unsigned BSIM4wlpGiven :1; - unsigned BSIM4wu0Given :1; - unsigned BSIM4weuGiven :1; - unsigned BSIM4wucsGiven :1; - unsigned BSIM4wuteGiven :1; - unsigned BSIM4wucsteGiven :1; - unsigned BSIM4wvoffGiven :1; - unsigned BSIM4wtvoffGiven :1; - unsigned BSIM4wtnfactorGiven :1; /* v4.7 Temp dep of leakage current */ - unsigned BSIM4wteta0Given :1; /* v4.7 temp dep of leakage current */ - unsigned BSIM4wtvoffcvGiven :1; /* v4.7 temp dep of leakage current */ - unsigned BSIM4wminvGiven :1; - unsigned BSIM4wminvcvGiven :1; - unsigned BSIM4wrdswGiven :1; - unsigned BSIM4wrswGiven :1; - unsigned BSIM4wrdwGiven :1; - unsigned BSIM4wprwgGiven :1; - unsigned BSIM4wprwbGiven :1; - unsigned BSIM4wprtGiven :1; - unsigned BSIM4weta0Given :1; - unsigned BSIM4wetabGiven :1; - unsigned BSIM4wpclmGiven :1; - unsigned BSIM4wpdibl1Given :1; - unsigned BSIM4wpdibl2Given :1; - unsigned BSIM4wpdiblbGiven :1; - unsigned BSIM4wfproutGiven :1; - unsigned BSIM4wpditsGiven :1; - unsigned BSIM4wpditsdGiven :1; - unsigned BSIM4wpscbe1Given :1; - unsigned BSIM4wpscbe2Given :1; - unsigned BSIM4wpvagGiven :1; - unsigned BSIM4wdeltaGiven :1; - unsigned BSIM4wwrGiven :1; - unsigned BSIM4wdwgGiven :1; - unsigned BSIM4wdwbGiven :1; - unsigned BSIM4wb0Given :1; - unsigned BSIM4wb1Given :1; - unsigned BSIM4walpha0Given :1; - unsigned BSIM4walpha1Given :1; - unsigned BSIM4wbeta0Given :1; - unsigned BSIM4wvfbGiven :1; - unsigned BSIM4wagidlGiven :1; - unsigned BSIM4wbgidlGiven :1; - unsigned BSIM4wcgidlGiven :1; - unsigned BSIM4wegidlGiven :1; - unsigned BSIM4wfgidlGiven :1; /* v4.7 New GIDL/GISL */ - unsigned BSIM4wkgidlGiven :1; /* v4.7 New GIDL/GISL */ - unsigned BSIM4wrgidlGiven :1; /* v4.7 New GIDL/GISL */ - unsigned BSIM4wagislGiven :1; - unsigned BSIM4wbgislGiven :1; - unsigned BSIM4wcgislGiven :1; - unsigned BSIM4wegislGiven :1; - unsigned BSIM4wfgislGiven :1; /* v4.7 New GIDL/GISL */ - unsigned BSIM4wkgislGiven :1; /* v4.7 New GIDL/GISL */ - unsigned BSIM4wrgislGiven :1; /* v4.7 New GIDL/GISL */ - unsigned BSIM4waigcGiven :1; - unsigned BSIM4wbigcGiven :1; - unsigned BSIM4wcigcGiven :1; - unsigned BSIM4waigsdGiven :1; - unsigned BSIM4wbigsdGiven :1; - unsigned BSIM4wcigsdGiven :1; - unsigned BSIM4waigsGiven :1; - unsigned BSIM4wbigsGiven :1; - unsigned BSIM4wcigsGiven :1; - unsigned BSIM4waigdGiven :1; - unsigned BSIM4wbigdGiven :1; - unsigned BSIM4wcigdGiven :1; - unsigned BSIM4waigbaccGiven :1; - unsigned BSIM4wbigbaccGiven :1; - unsigned BSIM4wcigbaccGiven :1; - unsigned BSIM4waigbinvGiven :1; - unsigned BSIM4wbigbinvGiven :1; - unsigned BSIM4wcigbinvGiven :1; - unsigned BSIM4wnigcGiven :1; - unsigned BSIM4wnigbinvGiven :1; - unsigned BSIM4wnigbaccGiven :1; - unsigned BSIM4wntoxGiven :1; - unsigned BSIM4weigbinvGiven :1; - unsigned BSIM4wpigcdGiven :1; - unsigned BSIM4wpoxedgeGiven :1; - unsigned BSIM4wxrcrg1Given :1; - unsigned BSIM4wxrcrg2Given :1; - unsigned BSIM4wlambdaGiven :1; - unsigned BSIM4wvtlGiven :1; - unsigned BSIM4wxnGiven :1; - unsigned BSIM4wvfbsdoffGiven :1; - unsigned BSIM4wtvfbsdoffGiven :1; - - /* CV model */ - unsigned BSIM4wcgslGiven :1; - unsigned BSIM4wcgdlGiven :1; - unsigned BSIM4wckappasGiven :1; - unsigned BSIM4wckappadGiven :1; - unsigned BSIM4wcfGiven :1; - unsigned BSIM4wclcGiven :1; - unsigned BSIM4wcleGiven :1; - unsigned BSIM4wvfbcvGiven :1; - unsigned BSIM4wnoffGiven :1; - unsigned BSIM4wvoffcvGiven :1; - unsigned BSIM4wacdeGiven :1; - unsigned BSIM4wmoinGiven :1; - - /* Cross-term dependence */ - unsigned BSIM4pcdscGiven :1; - unsigned BSIM4pcdscbGiven :1; - unsigned BSIM4pcdscdGiven :1; - unsigned BSIM4pcitGiven :1; - unsigned BSIM4pnfactorGiven :1; - unsigned BSIM4pxjGiven :1; - unsigned BSIM4pvsatGiven :1; - unsigned BSIM4patGiven :1; - unsigned BSIM4pa0Given :1; - unsigned BSIM4pagsGiven :1; - unsigned BSIM4pa1Given :1; - unsigned BSIM4pa2Given :1; - unsigned BSIM4pketaGiven :1; - unsigned BSIM4pnsubGiven :1; - unsigned BSIM4pndepGiven :1; - unsigned BSIM4pnsdGiven :1; - unsigned BSIM4pphinGiven :1; - unsigned BSIM4pngateGiven :1; - unsigned BSIM4pgamma1Given :1; - unsigned BSIM4pgamma2Given :1; - unsigned BSIM4pvbxGiven :1; - unsigned BSIM4pvbmGiven :1; - unsigned BSIM4pxtGiven :1; - unsigned BSIM4pk1Given :1; - unsigned BSIM4pkt1Given :1; - unsigned BSIM4pkt1lGiven :1; - unsigned BSIM4pkt2Given :1; - unsigned BSIM4pk2Given :1; - unsigned BSIM4pk3Given :1; - unsigned BSIM4pk3bGiven :1; - unsigned BSIM4pw0Given :1; - unsigned BSIM4pdvtp0Given :1; - unsigned BSIM4pdvtp1Given :1; - unsigned BSIM4pdvtp2Given :1; /* New DIBL/Rout */ - unsigned BSIM4pdvtp3Given :1; - unsigned BSIM4pdvtp4Given :1; - unsigned BSIM4pdvtp5Given :1; - unsigned BSIM4plpe0Given :1; - unsigned BSIM4plpebGiven :1; - unsigned BSIM4pdvt0Given :1; - unsigned BSIM4pdvt1Given :1; - unsigned BSIM4pdvt2Given :1; - unsigned BSIM4pdvt0wGiven :1; - unsigned BSIM4pdvt1wGiven :1; - unsigned BSIM4pdvt2wGiven :1; - unsigned BSIM4pdroutGiven :1; - unsigned BSIM4pdsubGiven :1; - unsigned BSIM4pvth0Given :1; - unsigned BSIM4puaGiven :1; - unsigned BSIM4pua1Given :1; - unsigned BSIM4pubGiven :1; - unsigned BSIM4pub1Given :1; - unsigned BSIM4pucGiven :1; - unsigned BSIM4puc1Given :1; - unsigned BSIM4pudGiven :1; - unsigned BSIM4pud1Given :1; - unsigned BSIM4pupGiven :1; - unsigned BSIM4plpGiven :1; - unsigned BSIM4pu0Given :1; - unsigned BSIM4peuGiven :1; - unsigned BSIM4pucsGiven :1; - unsigned BSIM4puteGiven :1; - unsigned BSIM4pucsteGiven :1; - unsigned BSIM4pvoffGiven :1; - unsigned BSIM4ptvoffGiven :1; - unsigned BSIM4ptnfactorGiven :1; /* v4.7 Temp dep of leakage current */ - unsigned BSIM4pteta0Given :1; /* v4.7 temp dep of leakage current */ - unsigned BSIM4ptvoffcvGiven :1; /* v4.7 temp dep of leakage current */ - unsigned BSIM4pminvGiven :1; - unsigned BSIM4pminvcvGiven :1; - unsigned BSIM4prdswGiven :1; - unsigned BSIM4prswGiven :1; - unsigned BSIM4prdwGiven :1; - unsigned BSIM4pprwgGiven :1; - unsigned BSIM4pprwbGiven :1; - unsigned BSIM4pprtGiven :1; - unsigned BSIM4peta0Given :1; - unsigned BSIM4petabGiven :1; - unsigned BSIM4ppclmGiven :1; - unsigned BSIM4ppdibl1Given :1; - unsigned BSIM4ppdibl2Given :1; - unsigned BSIM4ppdiblbGiven :1; - unsigned BSIM4pfproutGiven :1; - unsigned BSIM4ppditsGiven :1; - unsigned BSIM4ppditsdGiven :1; - unsigned BSIM4ppscbe1Given :1; - unsigned BSIM4ppscbe2Given :1; - unsigned BSIM4ppvagGiven :1; - unsigned BSIM4pdeltaGiven :1; - unsigned BSIM4pwrGiven :1; - unsigned BSIM4pdwgGiven :1; - unsigned BSIM4pdwbGiven :1; - unsigned BSIM4pb0Given :1; - unsigned BSIM4pb1Given :1; - unsigned BSIM4palpha0Given :1; - unsigned BSIM4palpha1Given :1; - unsigned BSIM4pbeta0Given :1; - unsigned BSIM4pvfbGiven :1; - unsigned BSIM4pagidlGiven :1; - unsigned BSIM4pbgidlGiven :1; - unsigned BSIM4pcgidlGiven :1; - unsigned BSIM4pegidlGiven :1; - unsigned BSIM4pfgidlGiven :1; /* v4.7 New GIDL/GISL */ - unsigned BSIM4pkgidlGiven :1; /* v4.7 New GIDL/GISL */ - unsigned BSIM4prgidlGiven :1; /* v4.7 New GIDL/GISL */ - unsigned BSIM4pagislGiven :1; - unsigned BSIM4pbgislGiven :1; - unsigned BSIM4pcgislGiven :1; - unsigned BSIM4pegislGiven :1; - unsigned BSIM4pfgislGiven :1; /* v4.7 New GIDL/GISL */ - unsigned BSIM4pkgislGiven :1; /* v4.7 New GIDL/GISL */ - unsigned BSIM4prgislGiven :1; /* v4.7 New GIDL/GISL */ - unsigned BSIM4paigcGiven :1; - unsigned BSIM4pbigcGiven :1; - unsigned BSIM4pcigcGiven :1; - unsigned BSIM4paigsdGiven :1; - unsigned BSIM4pbigsdGiven :1; - unsigned BSIM4pcigsdGiven :1; - unsigned BSIM4paigsGiven :1; - unsigned BSIM4pbigsGiven :1; - unsigned BSIM4pcigsGiven :1; - unsigned BSIM4paigdGiven :1; - unsigned BSIM4pbigdGiven :1; - unsigned BSIM4pcigdGiven :1; - unsigned BSIM4paigbaccGiven :1; - unsigned BSIM4pbigbaccGiven :1; - unsigned BSIM4pcigbaccGiven :1; - unsigned BSIM4paigbinvGiven :1; - unsigned BSIM4pbigbinvGiven :1; - unsigned BSIM4pcigbinvGiven :1; - unsigned BSIM4pnigcGiven :1; - unsigned BSIM4pnigbinvGiven :1; - unsigned BSIM4pnigbaccGiven :1; - unsigned BSIM4pntoxGiven :1; - unsigned BSIM4peigbinvGiven :1; - unsigned BSIM4ppigcdGiven :1; - unsigned BSIM4ppoxedgeGiven :1; - unsigned BSIM4pxrcrg1Given :1; - unsigned BSIM4pxrcrg2Given :1; - unsigned BSIM4plambdaGiven :1; - unsigned BSIM4pvtlGiven :1; - unsigned BSIM4pxnGiven :1; - unsigned BSIM4pvfbsdoffGiven :1; - unsigned BSIM4ptvfbsdoffGiven :1; - - /* CV model */ - unsigned BSIM4pcgslGiven :1; - unsigned BSIM4pcgdlGiven :1; - unsigned BSIM4pckappasGiven :1; - unsigned BSIM4pckappadGiven :1; - unsigned BSIM4pcfGiven :1; - unsigned BSIM4pclcGiven :1; - unsigned BSIM4pcleGiven :1; - unsigned BSIM4pvfbcvGiven :1; - unsigned BSIM4pnoffGiven :1; - unsigned BSIM4pvoffcvGiven :1; - unsigned BSIM4pacdeGiven :1; - unsigned BSIM4pmoinGiven :1; - - unsigned BSIM4useFringeGiven :1; - - unsigned BSIM4tnomGiven :1; - unsigned BSIM4cgsoGiven :1; - unsigned BSIM4cgdoGiven :1; - unsigned BSIM4cgboGiven :1; - unsigned BSIM4xpartGiven :1; - unsigned BSIM4sheetResistanceGiven :1; - - unsigned BSIM4SjctSatCurDensityGiven :1; - unsigned BSIM4SjctSidewallSatCurDensityGiven :1; - unsigned BSIM4SjctGateSidewallSatCurDensityGiven :1; - unsigned BSIM4SbulkJctPotentialGiven :1; - unsigned BSIM4SbulkJctBotGradingCoeffGiven :1; - unsigned BSIM4SsidewallJctPotentialGiven :1; - unsigned BSIM4SGatesidewallJctPotentialGiven :1; - unsigned BSIM4SbulkJctSideGradingCoeffGiven :1; - unsigned BSIM4SunitAreaJctCapGiven :1; - unsigned BSIM4SunitLengthSidewallJctCapGiven :1; - unsigned BSIM4SbulkJctGateSideGradingCoeffGiven :1; - unsigned BSIM4SunitLengthGateSidewallJctCapGiven :1; - unsigned BSIM4SjctEmissionCoeffGiven :1; - unsigned BSIM4SjctTempExponentGiven :1; - - unsigned BSIM4DjctSatCurDensityGiven :1; - unsigned BSIM4DjctSidewallSatCurDensityGiven :1; - unsigned BSIM4DjctGateSidewallSatCurDensityGiven :1; - unsigned BSIM4DbulkJctPotentialGiven :1; - unsigned BSIM4DbulkJctBotGradingCoeffGiven :1; - unsigned BSIM4DsidewallJctPotentialGiven :1; - unsigned BSIM4DGatesidewallJctPotentialGiven :1; - unsigned BSIM4DbulkJctSideGradingCoeffGiven :1; - unsigned BSIM4DunitAreaJctCapGiven :1; - unsigned BSIM4DunitLengthSidewallJctCapGiven :1; - unsigned BSIM4DbulkJctGateSideGradingCoeffGiven :1; - unsigned BSIM4DunitLengthGateSidewallJctCapGiven :1; - unsigned BSIM4DjctEmissionCoeffGiven :1; - unsigned BSIM4DjctTempExponentGiven :1; - - unsigned BSIM4oxideTrapDensityAGiven :1; - unsigned BSIM4oxideTrapDensityBGiven :1; - unsigned BSIM4oxideTrapDensityCGiven :1; - unsigned BSIM4emGiven :1; - unsigned BSIM4efGiven :1; - unsigned BSIM4afGiven :1; - unsigned BSIM4kfGiven :1; - - unsigned BSIM4vgsMaxGiven :1; - unsigned BSIM4vgdMaxGiven :1; - unsigned BSIM4vgbMaxGiven :1; - unsigned BSIM4vdsMaxGiven :1; - unsigned BSIM4vbsMaxGiven :1; - unsigned BSIM4vbdMaxGiven :1; - unsigned BSIM4vgsrMaxGiven :1; - unsigned BSIM4vgdrMaxGiven :1; - unsigned BSIM4vgbrMaxGiven :1; - unsigned BSIM4vbsrMaxGiven :1; - unsigned BSIM4vbdrMaxGiven :1; - - unsigned BSIM4LintGiven :1; - unsigned BSIM4LlGiven :1; - unsigned BSIM4LlcGiven :1; - unsigned BSIM4LlnGiven :1; - unsigned BSIM4LwGiven :1; - unsigned BSIM4LwcGiven :1; - unsigned BSIM4LwnGiven :1; - unsigned BSIM4LwlGiven :1; - unsigned BSIM4LwlcGiven :1; - unsigned BSIM4LminGiven :1; - unsigned BSIM4LmaxGiven :1; - - unsigned BSIM4WintGiven :1; - unsigned BSIM4WlGiven :1; - unsigned BSIM4WlcGiven :1; - unsigned BSIM4WlnGiven :1; - unsigned BSIM4WwGiven :1; - unsigned BSIM4WwcGiven :1; - unsigned BSIM4WwnGiven :1; - unsigned BSIM4WwlGiven :1; - unsigned BSIM4WwlcGiven :1; - unsigned BSIM4WminGiven :1; - unsigned BSIM4WmaxGiven :1; - - /* added for stress effect */ - unsigned BSIM4sarefGiven :1; - unsigned BSIM4sbrefGiven :1; - unsigned BSIM4wlodGiven :1; - unsigned BSIM4ku0Given :1; - unsigned BSIM4kvsatGiven :1; - unsigned BSIM4kvth0Given :1; - unsigned BSIM4tku0Given :1; - unsigned BSIM4llodku0Given :1; - unsigned BSIM4wlodku0Given :1; - unsigned BSIM4llodvthGiven :1; - unsigned BSIM4wlodvthGiven :1; - unsigned BSIM4lku0Given :1; - unsigned BSIM4wku0Given :1; - unsigned BSIM4pku0Given :1; - unsigned BSIM4lkvth0Given :1; - unsigned BSIM4wkvth0Given :1; - unsigned BSIM4pkvth0Given :1; - unsigned BSIM4stk2Given :1; - unsigned BSIM4lodk2Given :1; - unsigned BSIM4steta0Given :1; - unsigned BSIM4lodeta0Given :1; - - unsigned BSIM4webGiven :1; - unsigned BSIM4wecGiven :1; - unsigned BSIM4kvth0weGiven :1; - unsigned BSIM4k2weGiven :1; - unsigned BSIM4ku0weGiven :1; - unsigned BSIM4screfGiven :1; - unsigned BSIM4wpemodGiven :1; - unsigned BSIM4lkvth0weGiven :1; - unsigned BSIM4lk2weGiven :1; - unsigned BSIM4lku0weGiven :1; - unsigned BSIM4wkvth0weGiven :1; - unsigned BSIM4wk2weGiven :1; - unsigned BSIM4wku0weGiven :1; - unsigned BSIM4pkvth0weGiven :1; - unsigned BSIM4pk2weGiven :1; - unsigned BSIM4pku0weGiven :1; - - -} BSIM4model; - - -#ifndef NMOS -#define NMOS 1 -#define PMOS -1 -#endif /*NMOS*/ - - -/* Instance parameters */ -#define BSIM4_W 1 -#define BSIM4_L 2 -#define BSIM4_AS 3 -#define BSIM4_AD 4 -#define BSIM4_PS 5 -#define BSIM4_PD 6 -#define BSIM4_NRS 7 -#define BSIM4_NRD 8 -#define BSIM4_OFF 9 -#define BSIM4_IC 10 -#define BSIM4_IC_VDS 11 -#define BSIM4_IC_VGS 12 -#define BSIM4_IC_VBS 13 -#define BSIM4_TRNQSMOD 14 -#define BSIM4_RBODYMOD 15 -#define BSIM4_RGATEMOD 16 -#define BSIM4_GEOMOD 17 -#define BSIM4_RGEOMOD 18 -#define BSIM4_NF 19 -#define BSIM4_MIN 20 -#define BSIM4_ACNQSMOD 22 -#define BSIM4_RBDB 23 -#define BSIM4_RBSB 24 -#define BSIM4_RBPB 25 -#define BSIM4_RBPS 26 -#define BSIM4_RBPD 27 -#define BSIM4_SA 28 -#define BSIM4_SB 29 -#define BSIM4_SD 30 -#define BSIM4_DELVTO 31 -#define BSIM4_XGW 32 -#define BSIM4_NGCON 33 -#define BSIM4_SCA 34 -#define BSIM4_SCB 35 -#define BSIM4_SCC 36 -#define BSIM4_SC 37 -#define BSIM4_M 38 -#define BSIM4_MULU0 39 -#define BSIM4_WNFLAG 40 - -/* Global parameters */ -#define BSIM4_MOD_TEMPEOT 65 -#define BSIM4_MOD_LEFFEOT 66 -#define BSIM4_MOD_WEFFEOT 67 -#define BSIM4_MOD_UCSTE 68 -#define BSIM4_MOD_LUCSTE 69 -#define BSIM4_MOD_WUCSTE 70 -#define BSIM4_MOD_PUCSTE 71 -#define BSIM4_MOD_UCS 72 -#define BSIM4_MOD_LUCS 73 -#define BSIM4_MOD_WUCS 74 -#define BSIM4_MOD_PUCS 75 -#define BSIM4_MOD_CVCHARGEMOD 76 -#define BSIM4_MOD_ADOS 77 -#define BSIM4_MOD_BDOS 78 -#define BSIM4_MOD_TEMPMOD 79 -#define BSIM4_MOD_MTRLMOD 80 -#define BSIM4_MOD_IGCMOD 81 -#define BSIM4_MOD_IGBMOD 82 -#define BSIM4_MOD_ACNQSMOD 83 -#define BSIM4_MOD_FNOIMOD 84 -#define BSIM4_MOD_RDSMOD 85 -#define BSIM4_MOD_DIOMOD 86 -#define BSIM4_MOD_PERMOD 87 -#define BSIM4_MOD_GEOMOD 88 -#define BSIM4_MOD_RGEOMOD 89 -#define BSIM4_MOD_RGATEMOD 90 -#define BSIM4_MOD_RBODYMOD 91 -#define BSIM4_MOD_CAPMOD 92 -#define BSIM4_MOD_TRNQSMOD 93 -#define BSIM4_MOD_MOBMOD 94 -#define BSIM4_MOD_TNOIMOD 95 -#define BSIM4_MOD_EOT 96 -#define BSIM4_MOD_VDDEOT 97 -#define BSIM4_MOD_TOXE 98 -#define BSIM4_MOD_CDSC 99 -#define BSIM4_MOD_CDSCB 100 -#define BSIM4_MOD_CIT 101 -#define BSIM4_MOD_NFACTOR 102 -#define BSIM4_MOD_XJ 103 -#define BSIM4_MOD_VSAT 104 -#define BSIM4_MOD_AT 105 -#define BSIM4_MOD_A0 106 -#define BSIM4_MOD_A1 107 -#define BSIM4_MOD_A2 108 -#define BSIM4_MOD_KETA 109 -#define BSIM4_MOD_NSUB 110 -#define BSIM4_MOD_PHIG 111 -#define BSIM4_MOD_EPSRGATE 112 -#define BSIM4_MOD_EASUB 113 -#define BSIM4_MOD_EPSRSUB 114 -#define BSIM4_MOD_NI0SUB 115 -#define BSIM4_MOD_BG0SUB 116 -#define BSIM4_MOD_TBGASUB 117 -#define BSIM4_MOD_TBGBSUB 118 -#define BSIM4_MOD_NDEP 119 -#define BSIM4_MOD_NGATE 120 -#define BSIM4_MOD_GAMMA1 121 -#define BSIM4_MOD_GAMMA2 122 -#define BSIM4_MOD_VBX 123 -#define BSIM4_MOD_BINUNIT 124 -#define BSIM4_MOD_VBM 125 -#define BSIM4_MOD_XT 126 -#define BSIM4_MOD_K1 129 -#define BSIM4_MOD_KT1 130 -#define BSIM4_MOD_KT1L 131 -#define BSIM4_MOD_K2 132 -#define BSIM4_MOD_KT2 133 -#define BSIM4_MOD_K3 134 -#define BSIM4_MOD_K3B 135 -#define BSIM4_MOD_W0 136 -#define BSIM4_MOD_LPE0 137 -#define BSIM4_MOD_DVT0 138 -#define BSIM4_MOD_DVT1 139 -#define BSIM4_MOD_DVT2 140 -#define BSIM4_MOD_DVT0W 141 -#define BSIM4_MOD_DVT1W 142 -#define BSIM4_MOD_DVT2W 143 -#define BSIM4_MOD_DROUT 144 -#define BSIM4_MOD_DSUB 145 -#define BSIM4_MOD_VTH0 146 -#define BSIM4_MOD_UA 147 -#define BSIM4_MOD_UA1 148 -#define BSIM4_MOD_UB 149 -#define BSIM4_MOD_UB1 150 -#define BSIM4_MOD_UC 151 -#define BSIM4_MOD_UC1 152 -#define BSIM4_MOD_U0 153 -#define BSIM4_MOD_UTE 154 -#define BSIM4_MOD_VOFF 155 -#define BSIM4_MOD_DELTA 156 -#define BSIM4_MOD_RDSW 157 -#define BSIM4_MOD_PRT 158 -#define BSIM4_MOD_LDD 159 -#define BSIM4_MOD_ETA 160 -#define BSIM4_MOD_ETA0 161 -#define BSIM4_MOD_ETAB 162 -#define BSIM4_MOD_PCLM 163 -#define BSIM4_MOD_PDIBL1 164 -#define BSIM4_MOD_PDIBL2 165 -#define BSIM4_MOD_PSCBE1 166 -#define BSIM4_MOD_PSCBE2 167 -#define BSIM4_MOD_PVAG 168 -#define BSIM4_MOD_WR 169 -#define BSIM4_MOD_DWG 170 -#define BSIM4_MOD_DWB 171 -#define BSIM4_MOD_B0 172 -#define BSIM4_MOD_B1 173 -#define BSIM4_MOD_ALPHA0 174 -#define BSIM4_MOD_BETA0 175 -#define BSIM4_MOD_PDIBLB 178 -#define BSIM4_MOD_PRWG 179 -#define BSIM4_MOD_PRWB 180 -#define BSIM4_MOD_CDSCD 181 -#define BSIM4_MOD_AGS 182 -#define BSIM4_MOD_FRINGE 184 -#define BSIM4_MOD_CGSL 186 -#define BSIM4_MOD_CGDL 187 -#define BSIM4_MOD_CKAPPAS 188 -#define BSIM4_MOD_CF 189 -#define BSIM4_MOD_CLC 190 -#define BSIM4_MOD_CLE 191 -#define BSIM4_MOD_PARAMCHK 192 -#define BSIM4_MOD_VERSION 193 -#define BSIM4_MOD_VFBCV 194 -#define BSIM4_MOD_ACDE 195 -#define BSIM4_MOD_MOIN 196 -#define BSIM4_MOD_NOFF 197 -#define BSIM4_MOD_IJTHDFWD 198 -#define BSIM4_MOD_ALPHA1 199 -#define BSIM4_MOD_VFB 200 -#define BSIM4_MOD_TOXM 201 -#define BSIM4_MOD_TCJ 202 -#define BSIM4_MOD_TCJSW 203 -#define BSIM4_MOD_TCJSWG 204 -#define BSIM4_MOD_TPB 205 -#define BSIM4_MOD_TPBSW 206 -#define BSIM4_MOD_TPBSWG 207 -#define BSIM4_MOD_VOFFCV 208 -#define BSIM4_MOD_GBMIN 209 -#define BSIM4_MOD_RBDB 210 -#define BSIM4_MOD_RBSB 211 -#define BSIM4_MOD_RBPB 212 -#define BSIM4_MOD_RBPS 213 -#define BSIM4_MOD_RBPD 214 -#define BSIM4_MOD_DMCG 215 -#define BSIM4_MOD_DMCI 216 -#define BSIM4_MOD_DMDG 217 -#define BSIM4_MOD_XGW 218 -#define BSIM4_MOD_XGL 219 -#define BSIM4_MOD_RSHG 220 -#define BSIM4_MOD_NGCON 221 -#define BSIM4_MOD_AGIDL 222 -#define BSIM4_MOD_BGIDL 223 -#define BSIM4_MOD_EGIDL 224 -#define BSIM4_MOD_IJTHSFWD 225 -#define BSIM4_MOD_XJBVD 226 -#define BSIM4_MOD_XJBVS 227 -#define BSIM4_MOD_BVD 228 -#define BSIM4_MOD_BVS 229 -#define BSIM4_MOD_TOXP 230 -#define BSIM4_MOD_DTOX 231 -#define BSIM4_MOD_XRCRG1 232 -#define BSIM4_MOD_XRCRG2 233 -#define BSIM4_MOD_EU 234 -#define BSIM4_MOD_IJTHSREV 235 -#define BSIM4_MOD_IJTHDREV 236 -#define BSIM4_MOD_MINV 237 -#define BSIM4_MOD_VOFFL 238 -#define BSIM4_MOD_PDITS 239 -#define BSIM4_MOD_PDITSD 240 -#define BSIM4_MOD_PDITSL 241 -#define BSIM4_MOD_TNOIA 242 -#define BSIM4_MOD_TNOIB 243 -#define BSIM4_MOD_NTNOI 244 -#define BSIM4_MOD_FPROUT 245 -#define BSIM4_MOD_LPEB 246 -#define BSIM4_MOD_DVTP0 247 -#define BSIM4_MOD_DVTP1 248 -#define BSIM4_MOD_CGIDL 249 -#define BSIM4_MOD_PHIN 250 -#define BSIM4_MOD_RDSWMIN 251 -#define BSIM4_MOD_RSW 252 -#define BSIM4_MOD_RDW 253 -#define BSIM4_MOD_RDWMIN 254 -#define BSIM4_MOD_RSWMIN 255 -#define BSIM4_MOD_NSD 256 -#define BSIM4_MOD_CKAPPAD 257 -#define BSIM4_MOD_DMCGT 258 -#define BSIM4_MOD_AIGC 259 -#define BSIM4_MOD_BIGC 260 -#define BSIM4_MOD_CIGC 261 -#define BSIM4_MOD_AIGBACC 262 -#define BSIM4_MOD_BIGBACC 263 -#define BSIM4_MOD_CIGBACC 264 -#define BSIM4_MOD_AIGBINV 265 -#define BSIM4_MOD_BIGBINV 266 -#define BSIM4_MOD_CIGBINV 267 -#define BSIM4_MOD_NIGC 268 -#define BSIM4_MOD_NIGBACC 269 -#define BSIM4_MOD_NIGBINV 270 -#define BSIM4_MOD_NTOX 271 -#define BSIM4_MOD_TOXREF 272 -#define BSIM4_MOD_EIGBINV 273 -#define BSIM4_MOD_PIGCD 274 -#define BSIM4_MOD_POXEDGE 275 -#define BSIM4_MOD_EPSROX 276 -#define BSIM4_MOD_AIGSD 277 -#define BSIM4_MOD_BIGSD 278 -#define BSIM4_MOD_CIGSD 279 -#define BSIM4_MOD_JSWGS 280 -#define BSIM4_MOD_JSWGD 281 -#define BSIM4_MOD_LAMBDA 282 -#define BSIM4_MOD_VTL 283 -#define BSIM4_MOD_LC 284 -#define BSIM4_MOD_XN 285 -#define BSIM4_MOD_RNOIA 286 -#define BSIM4_MOD_RNOIB 287 -#define BSIM4_MOD_VFBSDOFF 288 -#define BSIM4_MOD_LINTNOI 289 -#define BSIM4_MOD_UD 290 -#define BSIM4_MOD_UD1 291 -#define BSIM4_MOD_UP 292 -#define BSIM4_MOD_LP 293 -#define BSIM4_MOD_TVOFF 294 -#define BSIM4_MOD_TVFBSDOFF 295 -#define BSIM4_MOD_MINVCV 296 -#define BSIM4_MOD_VOFFCVL 297 -#define BSIM4_MOD_MTRLCOMPATMOD 380 - -/* Length dependence */ -#define BSIM4_MOD_LCDSC 301 -#define BSIM4_MOD_LCDSCB 302 -#define BSIM4_MOD_LCIT 303 -#define BSIM4_MOD_LNFACTOR 304 -#define BSIM4_MOD_LXJ 305 -#define BSIM4_MOD_LVSAT 306 -#define BSIM4_MOD_LAT 307 -#define BSIM4_MOD_LA0 308 -#define BSIM4_MOD_LA1 309 -#define BSIM4_MOD_LA2 310 -#define BSIM4_MOD_LKETA 311 -#define BSIM4_MOD_LNSUB 312 -#define BSIM4_MOD_LNDEP 313 -#define BSIM4_MOD_LNGATE 315 -#define BSIM4_MOD_LGAMMA1 316 -#define BSIM4_MOD_LGAMMA2 317 -#define BSIM4_MOD_LVBX 318 -#define BSIM4_MOD_LVBM 320 -#define BSIM4_MOD_LXT 322 -#define BSIM4_MOD_LK1 325 -#define BSIM4_MOD_LKT1 326 -#define BSIM4_MOD_LKT1L 327 -#define BSIM4_MOD_LK2 328 -#define BSIM4_MOD_LKT2 329 -#define BSIM4_MOD_LK3 330 -#define BSIM4_MOD_LK3B 331 -#define BSIM4_MOD_LW0 332 -#define BSIM4_MOD_LLPE0 333 -#define BSIM4_MOD_LDVT0 334 -#define BSIM4_MOD_LDVT1 335 -#define BSIM4_MOD_LDVT2 336 -#define BSIM4_MOD_LDVT0W 337 -#define BSIM4_MOD_LDVT1W 338 -#define BSIM4_MOD_LDVT2W 339 -#define BSIM4_MOD_LDROUT 340 -#define BSIM4_MOD_LDSUB 341 -#define BSIM4_MOD_LVTH0 342 -#define BSIM4_MOD_LUA 343 -#define BSIM4_MOD_LUA1 344 -#define BSIM4_MOD_LUB 345 -#define BSIM4_MOD_LUB1 346 -#define BSIM4_MOD_LUC 347 -#define BSIM4_MOD_LUC1 348 -#define BSIM4_MOD_LU0 349 -#define BSIM4_MOD_LUTE 350 -#define BSIM4_MOD_LVOFF 351 -#define BSIM4_MOD_LDELTA 352 -#define BSIM4_MOD_LRDSW 353 -#define BSIM4_MOD_LPRT 354 -#define BSIM4_MOD_LLDD 355 -#define BSIM4_MOD_LETA 356 -#define BSIM4_MOD_LETA0 357 -#define BSIM4_MOD_LETAB 358 -#define BSIM4_MOD_LPCLM 359 -#define BSIM4_MOD_LPDIBL1 360 -#define BSIM4_MOD_LPDIBL2 361 -#define BSIM4_MOD_LPSCBE1 362 -#define BSIM4_MOD_LPSCBE2 363 -#define BSIM4_MOD_LPVAG 364 -#define BSIM4_MOD_LWR 365 -#define BSIM4_MOD_LDWG 366 -#define BSIM4_MOD_LDWB 367 -#define BSIM4_MOD_LB0 368 -#define BSIM4_MOD_LB1 369 -#define BSIM4_MOD_LALPHA0 370 -#define BSIM4_MOD_LBETA0 371 -#define BSIM4_MOD_LPDIBLB 374 -#define BSIM4_MOD_LPRWG 375 -#define BSIM4_MOD_LPRWB 376 -#define BSIM4_MOD_LCDSCD 377 -#define BSIM4_MOD_LAGS 378 - -#define BSIM4_MOD_LFRINGE 381 -#define BSIM4_MOD_LCGSL 383 -#define BSIM4_MOD_LCGDL 384 -#define BSIM4_MOD_LCKAPPAS 385 -#define BSIM4_MOD_LCF 386 -#define BSIM4_MOD_LCLC 387 -#define BSIM4_MOD_LCLE 388 -#define BSIM4_MOD_LVFBCV 389 -#define BSIM4_MOD_LACDE 390 -#define BSIM4_MOD_LMOIN 391 -#define BSIM4_MOD_LNOFF 392 -#define BSIM4_MOD_LALPHA1 394 -#define BSIM4_MOD_LVFB 395 -#define BSIM4_MOD_LVOFFCV 396 -#define BSIM4_MOD_LAGIDL 397 -#define BSIM4_MOD_LBGIDL 398 -#define BSIM4_MOD_LEGIDL 399 -#define BSIM4_MOD_LXRCRG1 400 -#define BSIM4_MOD_LXRCRG2 401 -#define BSIM4_MOD_LEU 402 -#define BSIM4_MOD_LMINV 403 -#define BSIM4_MOD_LPDITS 404 -#define BSIM4_MOD_LPDITSD 405 -#define BSIM4_MOD_LFPROUT 406 -#define BSIM4_MOD_LLPEB 407 -#define BSIM4_MOD_LDVTP0 408 -#define BSIM4_MOD_LDVTP1 409 -#define BSIM4_MOD_LCGIDL 410 -#define BSIM4_MOD_LPHIN 411 -#define BSIM4_MOD_LRSW 412 -#define BSIM4_MOD_LRDW 413 -#define BSIM4_MOD_LNSD 414 -#define BSIM4_MOD_LCKAPPAD 415 -#define BSIM4_MOD_LAIGC 416 -#define BSIM4_MOD_LBIGC 417 -#define BSIM4_MOD_LCIGC 418 -#define BSIM4_MOD_LAIGBACC 419 -#define BSIM4_MOD_LBIGBACC 420 -#define BSIM4_MOD_LCIGBACC 421 -#define BSIM4_MOD_LAIGBINV 422 -#define BSIM4_MOD_LBIGBINV 423 -#define BSIM4_MOD_LCIGBINV 424 -#define BSIM4_MOD_LNIGC 425 -#define BSIM4_MOD_LNIGBACC 426 -#define BSIM4_MOD_LNIGBINV 427 -#define BSIM4_MOD_LNTOX 428 -#define BSIM4_MOD_LEIGBINV 429 -#define BSIM4_MOD_LPIGCD 430 -#define BSIM4_MOD_LPOXEDGE 431 -#define BSIM4_MOD_LAIGSD 432 -#define BSIM4_MOD_LBIGSD 433 -#define BSIM4_MOD_LCIGSD 434 - -#define BSIM4_MOD_LLAMBDA 435 -#define BSIM4_MOD_LVTL 436 -#define BSIM4_MOD_LXN 437 -#define BSIM4_MOD_LVFBSDOFF 438 -#define BSIM4_MOD_LUD 439 -#define BSIM4_MOD_LUD1 440 -#define BSIM4_MOD_LUP 441 -#define BSIM4_MOD_LLP 442 -#define BSIM4_MOD_LMINVCV 443 - -#define BSIM4_MOD_FGIDL 444 /* v4.7 New GIDL/GISL*/ -#define BSIM4_MOD_KGIDL 445 /* v4.7 New GIDL/GISL*/ -#define BSIM4_MOD_RGIDL 446 /* v4.7 New GIDL/GISL*/ -#define BSIM4_MOD_FGISL 447 /* v4.7 New GIDL/GISL*/ -#define BSIM4_MOD_KGISL 448 /* v4.7 New GIDL/GISL*/ -#define BSIM4_MOD_RGISL 449 /* v4.7 New GIDL/GISL*/ -#define BSIM4_MOD_LFGIDL 450 /* v4.7 New GIDL/GISL*/ -#define BSIM4_MOD_LKGIDL 451 /* v4.7 New GIDL/GISL*/ -#define BSIM4_MOD_LRGIDL 452 /* v4.7 New GIDL/GISL*/ -#define BSIM4_MOD_LFGISL 453 /* v4.7 New GIDL/GISL*/ -#define BSIM4_MOD_LKGISL 454 /* v4.7 New GIDL/GISL*/ -#define BSIM4_MOD_LRGISL 455 /* v4.7 New GIDL/GISL*/ -#define BSIM4_MOD_WFGIDL 456 /* v4.7 New GIDL/GISL*/ -#define BSIM4_MOD_WKGIDL 457 /* v4.7 New GIDL/GISL*/ -#define BSIM4_MOD_WRGIDL 458 /* v4.7 New GIDL/GISL*/ -#define BSIM4_MOD_WFGISL 459 /* v4.7 New GIDL/GISL*/ -#define BSIM4_MOD_WKGISL 460 /* v4.7 New GIDL/GISL*/ -#define BSIM4_MOD_WRGISL 461 /* v4.7 New GIDL/GISL*/ -#define BSIM4_MOD_PFGIDL 462 /* v4.7 New GIDL/GISL*/ -#define BSIM4_MOD_PKGIDL 463 /* v4.7 New GIDL/GISL*/ -#define BSIM4_MOD_PRGIDL 464 /* v4.7 New GIDL/GISL*/ -#define BSIM4_MOD_PFGISL 465 /* v4.7 New GIDL/GISL*/ -#define BSIM4_MOD_PKGISL 466 /* v4.7 New GIDL/GISL*/ -#define BSIM4_MOD_PRGISL 467 /* v4.7 New GIDL/GISL*/ -#define BSIM4_MOD_GIDLMOD 379 /* v4.7 New GIDL/GISL*/ -#define BSIM4_MOD_DVTP2 468 /* v4.7 NEW DIBL/Rout*/ -#define BSIM4_MOD_DVTP3 469 /* v4.7 NEW DIBL/Rout*/ -#define BSIM4_MOD_DVTP4 470 /* v4.7 NEW DIBL/Rout*/ -#define BSIM4_MOD_DVTP5 471 /* v4.7 NEW DIBL/Rout*/ -#define BSIM4_MOD_LDVTP2 472 /* v4.7 NEW DIBL/Rout*/ -#define BSIM4_MOD_LDVTP3 473 /* v4.7 NEW DIBL/Rout*/ -#define BSIM4_MOD_LDVTP4 474 /* v4.7 NEW DIBL/Rout*/ -#define BSIM4_MOD_LDVTP5 475 /* v4.7 NEW DIBL/Rout*/ -#define BSIM4_MOD_WDVTP2 476 /* v4.7 NEW DIBL/Rout*/ -#define BSIM4_MOD_WDVTP3 477 /* v4.7 NEW DIBL/Rout*/ -#define BSIM4_MOD_WDVTP4 478 /* v4.7 NEW DIBL/Rout*/ -#define BSIM4_MOD_WDVTP5 479 /* v4.7 NEW DIBL/Rout*/ -#define BSIM4_MOD_PDVTP2 480 /* v4.7 NEW DIBL/Rout*/ -#define BSIM4_MOD_PDVTP3 298 /* v4.7 NEW DIBL/Rout*/ -#define BSIM4_MOD_PDVTP4 299 /* v4.7 NEW DIBL/Rout*/ -#define BSIM4_MOD_PDVTP5 300 /* v4.7 NEW DIBL/Rout*/ - -/* Width dependence */ -#define BSIM4_MOD_WCDSC 481 -#define BSIM4_MOD_WCDSCB 482 -#define BSIM4_MOD_WCIT 483 -#define BSIM4_MOD_WNFACTOR 484 -#define BSIM4_MOD_WXJ 485 -#define BSIM4_MOD_WVSAT 486 -#define BSIM4_MOD_WAT 487 -#define BSIM4_MOD_WA0 488 -#define BSIM4_MOD_WA1 489 -#define BSIM4_MOD_WA2 490 -#define BSIM4_MOD_WKETA 491 -#define BSIM4_MOD_WNSUB 492 -#define BSIM4_MOD_WNDEP 493 -#define BSIM4_MOD_WNGATE 495 -#define BSIM4_MOD_WGAMMA1 496 -#define BSIM4_MOD_WGAMMA2 497 -#define BSIM4_MOD_WVBX 498 -#define BSIM4_MOD_WVBM 500 -#define BSIM4_MOD_WXT 502 -#define BSIM4_MOD_WK1 505 -#define BSIM4_MOD_WKT1 506 -#define BSIM4_MOD_WKT1L 507 -#define BSIM4_MOD_WK2 508 -#define BSIM4_MOD_WKT2 509 -#define BSIM4_MOD_WK3 510 -#define BSIM4_MOD_WK3B 511 -#define BSIM4_MOD_WW0 512 -#define BSIM4_MOD_WLPE0 513 -#define BSIM4_MOD_WDVT0 514 -#define BSIM4_MOD_WDVT1 515 -#define BSIM4_MOD_WDVT2 516 -#define BSIM4_MOD_WDVT0W 517 -#define BSIM4_MOD_WDVT1W 518 -#define BSIM4_MOD_WDVT2W 519 -#define BSIM4_MOD_WDROUT 520 -#define BSIM4_MOD_WDSUB 521 -#define BSIM4_MOD_WVTH0 522 -#define BSIM4_MOD_WUA 523 -#define BSIM4_MOD_WUA1 524 -#define BSIM4_MOD_WUB 525 -#define BSIM4_MOD_WUB1 526 -#define BSIM4_MOD_WUC 527 -#define BSIM4_MOD_WUC1 528 -#define BSIM4_MOD_WU0 529 -#define BSIM4_MOD_WUTE 530 -#define BSIM4_MOD_WVOFF 531 -#define BSIM4_MOD_WDELTA 532 -#define BSIM4_MOD_WRDSW 533 -#define BSIM4_MOD_WPRT 534 -#define BSIM4_MOD_WLDD 535 -#define BSIM4_MOD_WETA 536 -#define BSIM4_MOD_WETA0 537 -#define BSIM4_MOD_WETAB 538 -#define BSIM4_MOD_WPCLM 539 -#define BSIM4_MOD_WPDIBL1 540 -#define BSIM4_MOD_WPDIBL2 541 -#define BSIM4_MOD_WPSCBE1 542 -#define BSIM4_MOD_WPSCBE2 543 -#define BSIM4_MOD_WPVAG 544 -#define BSIM4_MOD_WWR 545 -#define BSIM4_MOD_WDWG 546 -#define BSIM4_MOD_WDWB 547 -#define BSIM4_MOD_WB0 548 -#define BSIM4_MOD_WB1 549 -#define BSIM4_MOD_WALPHA0 550 -#define BSIM4_MOD_WBETA0 551 -#define BSIM4_MOD_WPDIBLB 554 -#define BSIM4_MOD_WPRWG 555 -#define BSIM4_MOD_WPRWB 556 -#define BSIM4_MOD_WCDSCD 557 -#define BSIM4_MOD_WAGS 558 - -#define BSIM4_MOD_WFRINGE 561 -#define BSIM4_MOD_WCGSL 563 -#define BSIM4_MOD_WCGDL 564 -#define BSIM4_MOD_WCKAPPAS 565 -#define BSIM4_MOD_WCF 566 -#define BSIM4_MOD_WCLC 567 -#define BSIM4_MOD_WCLE 568 -#define BSIM4_MOD_WVFBCV 569 -#define BSIM4_MOD_WACDE 570 -#define BSIM4_MOD_WMOIN 571 -#define BSIM4_MOD_WNOFF 572 -#define BSIM4_MOD_WALPHA1 574 -#define BSIM4_MOD_WVFB 575 -#define BSIM4_MOD_WVOFFCV 576 -#define BSIM4_MOD_WAGIDL 577 -#define BSIM4_MOD_WBGIDL 578 -#define BSIM4_MOD_WEGIDL 579 -#define BSIM4_MOD_WXRCRG1 580 -#define BSIM4_MOD_WXRCRG2 581 -#define BSIM4_MOD_WEU 582 -#define BSIM4_MOD_WMINV 583 -#define BSIM4_MOD_WPDITS 584 -#define BSIM4_MOD_WPDITSD 585 -#define BSIM4_MOD_WFPROUT 586 -#define BSIM4_MOD_WLPEB 587 -#define BSIM4_MOD_WDVTP0 588 -#define BSIM4_MOD_WDVTP1 589 -#define BSIM4_MOD_WCGIDL 590 -#define BSIM4_MOD_WPHIN 591 -#define BSIM4_MOD_WRSW 592 -#define BSIM4_MOD_WRDW 593 -#define BSIM4_MOD_WNSD 594 -#define BSIM4_MOD_WCKAPPAD 595 -#define BSIM4_MOD_WAIGC 596 -#define BSIM4_MOD_WBIGC 597 -#define BSIM4_MOD_WCIGC 598 -#define BSIM4_MOD_WAIGBACC 599 -#define BSIM4_MOD_WBIGBACC 600 -#define BSIM4_MOD_WCIGBACC 601 -#define BSIM4_MOD_WAIGBINV 602 -#define BSIM4_MOD_WBIGBINV 603 -#define BSIM4_MOD_WCIGBINV 604 -#define BSIM4_MOD_WNIGC 605 -#define BSIM4_MOD_WNIGBACC 606 -#define BSIM4_MOD_WNIGBINV 607 -#define BSIM4_MOD_WNTOX 608 -#define BSIM4_MOD_WEIGBINV 609 -#define BSIM4_MOD_WPIGCD 610 -#define BSIM4_MOD_WPOXEDGE 611 -#define BSIM4_MOD_WAIGSD 612 -#define BSIM4_MOD_WBIGSD 613 -#define BSIM4_MOD_WCIGSD 614 -#define BSIM4_MOD_WLAMBDA 615 -#define BSIM4_MOD_WVTL 616 -#define BSIM4_MOD_WXN 617 -#define BSIM4_MOD_WVFBSDOFF 618 -#define BSIM4_MOD_WUD 619 -#define BSIM4_MOD_WUD1 620 -#define BSIM4_MOD_WUP 621 -#define BSIM4_MOD_WLP 622 -#define BSIM4_MOD_WMINVCV 623 - -/* Cross-term dependence */ -#define BSIM4_MOD_PCDSC 661 -#define BSIM4_MOD_PCDSCB 662 -#define BSIM4_MOD_PCIT 663 -#define BSIM4_MOD_PNFACTOR 664 -#define BSIM4_MOD_PXJ 665 -#define BSIM4_MOD_PVSAT 666 -#define BSIM4_MOD_PAT 667 -#define BSIM4_MOD_PA0 668 -#define BSIM4_MOD_PA1 669 -#define BSIM4_MOD_PA2 670 -#define BSIM4_MOD_PKETA 671 -#define BSIM4_MOD_PNSUB 672 -#define BSIM4_MOD_PNDEP 673 -#define BSIM4_MOD_PNGATE 675 -#define BSIM4_MOD_PGAMMA1 676 -#define BSIM4_MOD_PGAMMA2 677 -#define BSIM4_MOD_PVBX 678 - -#define BSIM4_MOD_PVBM 680 - -#define BSIM4_MOD_PXT 682 -#define BSIM4_MOD_PK1 685 -#define BSIM4_MOD_PKT1 686 -#define BSIM4_MOD_PKT1L 687 -#define BSIM4_MOD_PK2 688 -#define BSIM4_MOD_PKT2 689 -#define BSIM4_MOD_PK3 690 -#define BSIM4_MOD_PK3B 691 -#define BSIM4_MOD_PW0 692 -#define BSIM4_MOD_PLPE0 693 - -#define BSIM4_MOD_PDVT0 694 -#define BSIM4_MOD_PDVT1 695 -#define BSIM4_MOD_PDVT2 696 - -#define BSIM4_MOD_PDVT0W 697 -#define BSIM4_MOD_PDVT1W 698 -#define BSIM4_MOD_PDVT2W 699 - -#define BSIM4_MOD_PDROUT 700 -#define BSIM4_MOD_PDSUB 701 -#define BSIM4_MOD_PVTH0 702 -#define BSIM4_MOD_PUA 703 -#define BSIM4_MOD_PUA1 704 -#define BSIM4_MOD_PUB 705 -#define BSIM4_MOD_PUB1 706 -#define BSIM4_MOD_PUC 707 -#define BSIM4_MOD_PUC1 708 -#define BSIM4_MOD_PU0 709 -#define BSIM4_MOD_PUTE 710 -#define BSIM4_MOD_PVOFF 711 -#define BSIM4_MOD_PDELTA 712 -#define BSIM4_MOD_PRDSW 713 -#define BSIM4_MOD_PPRT 714 -#define BSIM4_MOD_PLDD 715 -#define BSIM4_MOD_PETA 716 -#define BSIM4_MOD_PETA0 717 -#define BSIM4_MOD_PETAB 718 -#define BSIM4_MOD_PPCLM 719 -#define BSIM4_MOD_PPDIBL1 720 -#define BSIM4_MOD_PPDIBL2 721 -#define BSIM4_MOD_PPSCBE1 722 -#define BSIM4_MOD_PPSCBE2 723 -#define BSIM4_MOD_PPVAG 724 -#define BSIM4_MOD_PWR 725 -#define BSIM4_MOD_PDWG 726 -#define BSIM4_MOD_PDWB 727 -#define BSIM4_MOD_PB0 728 -#define BSIM4_MOD_PB1 729 -#define BSIM4_MOD_PALPHA0 730 -#define BSIM4_MOD_PBETA0 731 -#define BSIM4_MOD_PPDIBLB 734 - -#define BSIM4_MOD_PPRWG 735 -#define BSIM4_MOD_PPRWB 736 - -#define BSIM4_MOD_PCDSCD 737 -#define BSIM4_MOD_PAGS 738 - -#define BSIM4_MOD_PFRINGE 741 -#define BSIM4_MOD_PCGSL 743 -#define BSIM4_MOD_PCGDL 744 -#define BSIM4_MOD_PCKAPPAS 745 -#define BSIM4_MOD_PCF 746 -#define BSIM4_MOD_PCLC 747 -#define BSIM4_MOD_PCLE 748 -#define BSIM4_MOD_PVFBCV 749 -#define BSIM4_MOD_PACDE 750 -#define BSIM4_MOD_PMOIN 751 -#define BSIM4_MOD_PNOFF 752 -#define BSIM4_MOD_PALPHA1 754 -#define BSIM4_MOD_PVFB 755 -#define BSIM4_MOD_PVOFFCV 756 -#define BSIM4_MOD_PAGIDL 757 -#define BSIM4_MOD_PBGIDL 758 -#define BSIM4_MOD_PEGIDL 759 -#define BSIM4_MOD_PXRCRG1 760 -#define BSIM4_MOD_PXRCRG2 761 -#define BSIM4_MOD_PEU 762 -#define BSIM4_MOD_PMINV 763 -#define BSIM4_MOD_PPDITS 764 -#define BSIM4_MOD_PPDITSD 765 -#define BSIM4_MOD_PFPROUT 766 -#define BSIM4_MOD_PLPEB 767 -#define BSIM4_MOD_PDVTP0 768 -#define BSIM4_MOD_PDVTP1 769 -#define BSIM4_MOD_PCGIDL 770 -#define BSIM4_MOD_PPHIN 771 -#define BSIM4_MOD_PRSW 772 -#define BSIM4_MOD_PRDW 773 -#define BSIM4_MOD_PNSD 774 -#define BSIM4_MOD_PCKAPPAD 775 -#define BSIM4_MOD_PAIGC 776 -#define BSIM4_MOD_PBIGC 777 -#define BSIM4_MOD_PCIGC 778 -#define BSIM4_MOD_PAIGBACC 779 -#define BSIM4_MOD_PBIGBACC 780 -#define BSIM4_MOD_PCIGBACC 781 -#define BSIM4_MOD_PAIGBINV 782 -#define BSIM4_MOD_PBIGBINV 783 -#define BSIM4_MOD_PCIGBINV 784 -#define BSIM4_MOD_PNIGC 785 -#define BSIM4_MOD_PNIGBACC 786 -#define BSIM4_MOD_PNIGBINV 787 -#define BSIM4_MOD_PNTOX 788 -#define BSIM4_MOD_PEIGBINV 789 -#define BSIM4_MOD_PPIGCD 790 -#define BSIM4_MOD_PPOXEDGE 791 -#define BSIM4_MOD_PAIGSD 792 -#define BSIM4_MOD_PBIGSD 793 -#define BSIM4_MOD_PCIGSD 794 - -#define BSIM4_MOD_SAREF 795 -#define BSIM4_MOD_SBREF 796 -#define BSIM4_MOD_KU0 797 -#define BSIM4_MOD_KVSAT 798 -#define BSIM4_MOD_TKU0 799 -#define BSIM4_MOD_LLODKU0 800 -#define BSIM4_MOD_WLODKU0 801 -#define BSIM4_MOD_LLODVTH 802 -#define BSIM4_MOD_WLODVTH 803 -#define BSIM4_MOD_LKU0 804 -#define BSIM4_MOD_WKU0 805 -#define BSIM4_MOD_PKU0 806 -#define BSIM4_MOD_KVTH0 807 -#define BSIM4_MOD_LKVTH0 808 -#define BSIM4_MOD_WKVTH0 809 -#define BSIM4_MOD_PKVTH0 810 -#define BSIM4_MOD_WLOD 811 -#define BSIM4_MOD_STK2 812 -#define BSIM4_MOD_LODK2 813 -#define BSIM4_MOD_STETA0 814 -#define BSIM4_MOD_LODETA0 815 - -#define BSIM4_MOD_WEB 816 -#define BSIM4_MOD_WEC 817 -#define BSIM4_MOD_KVTH0WE 818 -#define BSIM4_MOD_K2WE 819 -#define BSIM4_MOD_KU0WE 820 -#define BSIM4_MOD_SCREF 821 -#define BSIM4_MOD_WPEMOD 822 -#define BSIM4_MOD_PMINVCV 823 - -#define BSIM4_MOD_PLAMBDA 825 -#define BSIM4_MOD_PVTL 826 -#define BSIM4_MOD_PXN 827 -#define BSIM4_MOD_PVFBSDOFF 828 - -#define BSIM4_MOD_TNOM 831 -#define BSIM4_MOD_CGSO 832 -#define BSIM4_MOD_CGDO 833 -#define BSIM4_MOD_CGBO 834 -#define BSIM4_MOD_XPART 835 -#define BSIM4_MOD_RSH 836 -#define BSIM4_MOD_JSS 837 -#define BSIM4_MOD_PBS 838 -#define BSIM4_MOD_MJS 839 -#define BSIM4_MOD_PBSWS 840 -#define BSIM4_MOD_MJSWS 841 -#define BSIM4_MOD_CJS 842 -#define BSIM4_MOD_CJSWS 843 -#define BSIM4_MOD_NMOS 844 -#define BSIM4_MOD_PMOS 845 -#define BSIM4_MOD_NOIA 846 -#define BSIM4_MOD_NOIB 847 -#define BSIM4_MOD_NOIC 848 -#define BSIM4_MOD_LINT 849 -#define BSIM4_MOD_LL 850 -#define BSIM4_MOD_LLN 851 -#define BSIM4_MOD_LW 852 -#define BSIM4_MOD_LWN 853 -#define BSIM4_MOD_LWL 854 -#define BSIM4_MOD_LMIN 855 -#define BSIM4_MOD_LMAX 856 -#define BSIM4_MOD_WINT 857 -#define BSIM4_MOD_WL 858 -#define BSIM4_MOD_WLN 859 -#define BSIM4_MOD_WW 860 -#define BSIM4_MOD_WWN 861 -#define BSIM4_MOD_WWL 862 -#define BSIM4_MOD_WMIN 863 -#define BSIM4_MOD_WMAX 864 -#define BSIM4_MOD_DWC 865 -#define BSIM4_MOD_DLC 866 -#define BSIM4_MOD_XL 867 -#define BSIM4_MOD_XW 868 -#define BSIM4_MOD_EM 869 -#define BSIM4_MOD_EF 870 -#define BSIM4_MOD_AF 871 -#define BSIM4_MOD_KF 872 -#define BSIM4_MOD_NJS 873 -#define BSIM4_MOD_XTIS 874 -#define BSIM4_MOD_PBSWGS 875 -#define BSIM4_MOD_MJSWGS 876 -#define BSIM4_MOD_CJSWGS 877 -#define BSIM4_MOD_JSWS 878 -#define BSIM4_MOD_LLC 879 -#define BSIM4_MOD_LWC 880 -#define BSIM4_MOD_LWLC 881 -#define BSIM4_MOD_WLC 882 -#define BSIM4_MOD_WWC 883 -#define BSIM4_MOD_WWLC 884 -#define BSIM4_MOD_DWJ 885 -#define BSIM4_MOD_JSD 886 -#define BSIM4_MOD_PBD 887 -#define BSIM4_MOD_MJD 888 -#define BSIM4_MOD_PBSWD 889 -#define BSIM4_MOD_MJSWD 890 -#define BSIM4_MOD_CJD 891 -#define BSIM4_MOD_CJSWD 892 -#define BSIM4_MOD_NJD 893 -#define BSIM4_MOD_XTID 894 -#define BSIM4_MOD_PBSWGD 895 -#define BSIM4_MOD_MJSWGD 896 -#define BSIM4_MOD_CJSWGD 897 -#define BSIM4_MOD_JSWD 898 -#define BSIM4_MOD_DLCIG 899 - -/* trap-assisted tunneling */ - -#define BSIM4_MOD_JTSS 900 -#define BSIM4_MOD_JTSD 901 -#define BSIM4_MOD_JTSSWS 902 -#define BSIM4_MOD_JTSSWD 903 -#define BSIM4_MOD_JTSSWGS 904 -#define BSIM4_MOD_JTSSWGD 905 -#define BSIM4_MOD_NJTS 906 -#define BSIM4_MOD_NJTSSW 907 -#define BSIM4_MOD_NJTSSWG 908 -#define BSIM4_MOD_XTSS 909 -#define BSIM4_MOD_XTSD 910 -#define BSIM4_MOD_XTSSWS 911 -#define BSIM4_MOD_XTSSWD 912 -#define BSIM4_MOD_XTSSWGS 913 -#define BSIM4_MOD_XTSSWGD 914 -#define BSIM4_MOD_TNJTS 915 -#define BSIM4_MOD_TNJTSSW 916 -#define BSIM4_MOD_TNJTSSWG 917 -#define BSIM4_MOD_VTSS 918 -#define BSIM4_MOD_VTSD 919 -#define BSIM4_MOD_VTSSWS 920 -#define BSIM4_MOD_VTSSWD 921 -#define BSIM4_MOD_VTSSWGS 922 -#define BSIM4_MOD_VTSSWGD 923 -#define BSIM4_MOD_PUD 924 -#define BSIM4_MOD_PUD1 925 -#define BSIM4_MOD_PUP 926 -#define BSIM4_MOD_PLP 927 -#define BSIM4_MOD_JTWEFF 928 - -/* device questions */ -#define BSIM4_DNODE 945 -#define BSIM4_GNODEEXT 946 -#define BSIM4_SNODE 947 -#define BSIM4_BNODE 948 -#define BSIM4_DNODEPRIME 949 -#define BSIM4_GNODEPRIME 950 -#define BSIM4_GNODEMIDE 951 -#define BSIM4_GNODEMID 952 -#define BSIM4_SNODEPRIME 953 -#define BSIM4_BNODEPRIME 954 -#define BSIM4_DBNODE 955 -#define BSIM4_SBNODE 956 -#define BSIM4_VBD 957 -#define BSIM4_VBS 958 -#define BSIM4_VGS 959 -#define BSIM4_VDS 960 -#define BSIM4_CD 961 -#define BSIM4_CBS 962 -#define BSIM4_CBD 963 -#define BSIM4_GM 964 -#define BSIM4_GDS 965 -#define BSIM4_GMBS 966 -#define BSIM4_GBD 967 -#define BSIM4_GBS 968 -#define BSIM4_QB 969 -#define BSIM4_CQB 970 -#define BSIM4_QG 971 -#define BSIM4_CQG 972 -#define BSIM4_QD 973 -#define BSIM4_CQD 974 -#define BSIM4_CGGB 975 -#define BSIM4_CGDB 976 -#define BSIM4_CGSB 977 -#define BSIM4_CBGB 978 -#define BSIM4_CAPBD 979 -#define BSIM4_CQBD 980 -#define BSIM4_CAPBS 981 -#define BSIM4_CQBS 982 -#define BSIM4_CDGB 983 -#define BSIM4_CDDB 984 -#define BSIM4_CDSB 985 -#define BSIM4_VON 986 -#define BSIM4_VDSAT 987 -#define BSIM4_QBS 988 -#define BSIM4_QBD 989 -#define BSIM4_SOURCECONDUCT 990 -#define BSIM4_DRAINCONDUCT 991 -#define BSIM4_CBDB 992 -#define BSIM4_CBSB 993 -#define BSIM4_CSUB 994 -#define BSIM4_QINV 995 -#define BSIM4_IGIDL 996 -#define BSIM4_CSGB 997 -#define BSIM4_CSDB 998 -#define BSIM4_CSSB 999 -#define BSIM4_CGBB 1000 -#define BSIM4_CDBB 1001 -#define BSIM4_CSBB 1002 -#define BSIM4_CBBB 1003 -#define BSIM4_QS 1004 -#define BSIM4_IGISL 1005 -#define BSIM4_IGS 1006 -#define BSIM4_IGD 1007 -#define BSIM4_IGB 1008 -#define BSIM4_IGCS 1009 -#define BSIM4_IGCD 1010 -#define BSIM4_QDEF 1011 -#define BSIM4_DELVT0 1012 -#define BSIM4_GCRG 1013 -#define BSIM4_GTAU 1014 - -#define BSIM4_MOD_LTVOFF 1051 -#define BSIM4_MOD_LTVFBSDOFF 1052 -#define BSIM4_MOD_WTVOFF 1053 -#define BSIM4_MOD_WTVFBSDOFF 1054 -#define BSIM4_MOD_PTVOFF 1055 -#define BSIM4_MOD_PTVFBSDOFF 1056 - -#define BSIM4_MOD_LKVTH0WE 1061 -#define BSIM4_MOD_LK2WE 1062 -#define BSIM4_MOD_LKU0WE 1063 -#define BSIM4_MOD_WKVTH0WE 1064 -#define BSIM4_MOD_WK2WE 1065 -#define BSIM4_MOD_WKU0WE 1066 -#define BSIM4_MOD_PKVTH0WE 1067 -#define BSIM4_MOD_PK2WE 1068 -#define BSIM4_MOD_PKU0WE 1069 - -#define BSIM4_MOD_RBPS0 1101 -#define BSIM4_MOD_RBPSL 1102 -#define BSIM4_MOD_RBPSW 1103 -#define BSIM4_MOD_RBPSNF 1104 -#define BSIM4_MOD_RBPD0 1105 -#define BSIM4_MOD_RBPDL 1106 -#define BSIM4_MOD_RBPDW 1107 -#define BSIM4_MOD_RBPDNF 1108 - -#define BSIM4_MOD_RBPBX0 1109 -#define BSIM4_MOD_RBPBXL 1110 -#define BSIM4_MOD_RBPBXW 1111 -#define BSIM4_MOD_RBPBXNF 1112 -#define BSIM4_MOD_RBPBY0 1113 -#define BSIM4_MOD_RBPBYL 1114 -#define BSIM4_MOD_RBPBYW 1115 -#define BSIM4_MOD_RBPBYNF 1116 - -#define BSIM4_MOD_RBSBX0 1117 -#define BSIM4_MOD_RBSBY0 1118 -#define BSIM4_MOD_RBDBX0 1119 -#define BSIM4_MOD_RBDBY0 1120 - -#define BSIM4_MOD_RBSDBXL 1121 -#define BSIM4_MOD_RBSDBXW 1122 -#define BSIM4_MOD_RBSDBXNF 1123 -#define BSIM4_MOD_RBSDBYL 1124 -#define BSIM4_MOD_RBSDBYW 1125 -#define BSIM4_MOD_RBSDBYNF 1126 - -#define BSIM4_MOD_AGISL 1200 -#define BSIM4_MOD_BGISL 1201 -#define BSIM4_MOD_EGISL 1202 -#define BSIM4_MOD_CGISL 1203 -#define BSIM4_MOD_LAGISL 1204 -#define BSIM4_MOD_LBGISL 1205 -#define BSIM4_MOD_LEGISL 1206 -#define BSIM4_MOD_LCGISL 1207 -#define BSIM4_MOD_WAGISL 1208 -#define BSIM4_MOD_WBGISL 1209 -#define BSIM4_MOD_WEGISL 1210 -#define BSIM4_MOD_WCGISL 1211 -#define BSIM4_MOD_PAGISL 1212 -#define BSIM4_MOD_PBGISL 1213 -#define BSIM4_MOD_PEGISL 1214 -#define BSIM4_MOD_PCGISL 1215 - -#define BSIM4_MOD_AIGS 1220 -#define BSIM4_MOD_BIGS 1221 -#define BSIM4_MOD_CIGS 1222 -#define BSIM4_MOD_LAIGS 1223 -#define BSIM4_MOD_LBIGS 1224 -#define BSIM4_MOD_LCIGS 1225 -#define BSIM4_MOD_WAIGS 1226 -#define BSIM4_MOD_WBIGS 1227 -#define BSIM4_MOD_WCIGS 1228 -#define BSIM4_MOD_PAIGS 1229 -#define BSIM4_MOD_PBIGS 1230 -#define BSIM4_MOD_PCIGS 1231 -#define BSIM4_MOD_AIGD 1232 -#define BSIM4_MOD_BIGD 1233 -#define BSIM4_MOD_CIGD 1234 -#define BSIM4_MOD_LAIGD 1235 -#define BSIM4_MOD_LBIGD 1236 -#define BSIM4_MOD_LCIGD 1237 -#define BSIM4_MOD_WAIGD 1238 -#define BSIM4_MOD_WBIGD 1239 -#define BSIM4_MOD_WCIGD 1240 -#define BSIM4_MOD_PAIGD 1241 -#define BSIM4_MOD_PBIGD 1242 -#define BSIM4_MOD_PCIGD 1243 -#define BSIM4_MOD_DLCIGD 1244 - -#define BSIM4_MOD_NJTSD 1250 -#define BSIM4_MOD_NJTSSWD 1251 -#define BSIM4_MOD_NJTSSWGD 1252 -#define BSIM4_MOD_TNJTSD 1253 -#define BSIM4_MOD_TNJTSSWD 1254 -#define BSIM4_MOD_TNJTSSWGD 1255 - -/* v4.7 temp dep of leakage current */ - -#define BSIM4_MOD_TNFACTOR 1256 -#define BSIM4_MOD_TETA0 1257 -#define BSIM4_MOD_TVOFFCV 1258 -#define BSIM4_MOD_LTNFACTOR 1260 -#define BSIM4_MOD_LTETA0 1261 -#define BSIM4_MOD_LTVOFFCV 1262 -#define BSIM4_MOD_WTNFACTOR 1264 -#define BSIM4_MOD_WTETA0 1265 -#define BSIM4_MOD_WTVOFFCV 1266 -#define BSIM4_MOD_PTNFACTOR 1268 -#define BSIM4_MOD_PTETA0 1269 -#define BSIM4_MOD_PTVOFFCV 1270 - -/* tnoiMod=2 (v4.7) */ -#define BSIM4_MOD_TNOIC 1272 -#define BSIM4_MOD_RNOIC 1273 - -#define BSIM4_MOD_VGS_MAX 1301 -#define BSIM4_MOD_VGD_MAX 1302 -#define BSIM4_MOD_VGB_MAX 1303 -#define BSIM4_MOD_VDS_MAX 1304 -#define BSIM4_MOD_VBS_MAX 1305 -#define BSIM4_MOD_VBD_MAX 1306 -#define BSIM4_MOD_VGSR_MAX 1307 -#define BSIM4_MOD_VGDR_MAX 1308 -#define BSIM4_MOD_VGBR_MAX 1309 -#define BSIM4_MOD_VBSR_MAX 1310 -#define BSIM4_MOD_VBDR_MAX 1311 - -#include "bsim4ext.h" - -extern void BSIM4evaluate(double,double,double,BSIM4instance*,BSIM4model*, - double*,double*,double*, double*, double*, double*, double*, - double*, double*, double*, double*, double*, double*, double*, - double*, double*, double*, double*, CKTcircuit*); -extern int BSIM4debug(BSIM4model*, BSIM4instance*, CKTcircuit*, int); -extern int BSIM4checkModel(BSIM4model*, BSIM4instance*, CKTcircuit*); -extern int BSIM4PAeffGeo(double, int, int, double, double, double, double, double *, double *, double *, double *); -extern int BSIM4RdseffGeo(double, int, int, int, double, double, double, double, double, int, double *); -extern int BSIM4RdsEndIso(double, double, double, double, double, double, int, int, double *); -extern int BSIM4RdsEndSha(double, double, double, double, double, double, int, int, double *); - -#endif /*BSIM4*/ diff --git a/src/spicelib/devices/bsim4/bsim4ext.h b/src/spicelib/devices/bsim4/bsim4ext.h deleted file mode 100644 index 810144cc4..000000000 --- a/src/spicelib/devices/bsim4/bsim4ext.h +++ /dev/null @@ -1,82 +0,0 @@ -/* ****************************************************************************** - * BSIM4 4.8.1 released by Chetan Kumar Dabhi 2/15/2017 * - * BSIM4 Model Equations * - ****************************************************************************** - - ****************************************************************************** - * Copyright 2017 Regents of the University of California. * - * All rights reserved. * - * * - * Project Director: Prof. Chenming Hu. * - * Authors: Gary W. Ng, Weidong Liu, Xuemei Xi, Mohan Dunga, Wenwei Yang * - * Ali Niknejad, Shivendra Singh Parihar, Chetan Kumar Dabhi * - * Yogesh Singh Chauhan, Sayeef Salahuddin, Chenming Hu * - ****************************************************************************** - - ****************************************************************************** - * CMC In-Code Statement * - * * - * The Developer agrees that the following statement will appear in the * - * model code that has been adopted as a CMC Standard. * - * * - * Software is distributed as is, completely without warranty or service * - * support. The University of California and its employees are not liable * - * for the condition or performance of the software. * - * * - * The University of California owns the copyright and grants users a * - * perpetual, irrevocable, worldwide, non-exclusive, royalty-free license * - * with respect to the software as set forth below. * - * * - * The University of California hereby disclaims all implied warranties. * - * * - * The University of California grants the users the right to modify, * - * copy, and redistribute the software and documentation, both within * - * the user's organization and externally, subject to the following * - * restrictions: * - * * - * 1. The users agree not to charge for the University of California code * - * itself but may charge for additions, extensions, or support. * - * * - * 2. In any product based on the software, the users agree to * - * acknowledge the University of California that developed the * - * software. This acknowledgment shall appear in the product * - * documentation. * - * * - * 3. Redistributions to others of source code and documentation must * - * retain the copyright notice, disclaimer, and list of conditions. * - * * - * 4. Redistributions to others in binary form must reproduce the * - * copyright notice, disclaimer, and list of conditions in the * - * documentation and/or other materials provided with the * - * distribution. * - * * - * Agreed to on ______Feb. 15, 2017______________ * - * * - * By: ____University of California, Berkeley___ * - * ____Chenming Hu__________________________ * - * ____Professor in Graduate School ________ * - * * - ****************************************************************************** */ - -extern int BSIM4acLoad(GENmodel *,CKTcircuit*); -extern int BSIM4ask(CKTcircuit *,GENinstance*,int,IFvalue*,IFvalue*); -extern int BSIM4convTest(GENmodel *,CKTcircuit*); -extern int BSIM4getic(GENmodel*,CKTcircuit*); -extern int BSIM4load(GENmodel*,CKTcircuit*); -extern int BSIM4mAsk(CKTcircuit*,GENmodel *,int, IFvalue*); -extern int BSIM4mDelete(GENmodel*); -extern int BSIM4mParam(int,IFvalue*,GENmodel*); -extern void BSIM4mosCap(CKTcircuit*, double, double, double, double, - double, double, double, double, double, double, double, - double, double, double, double, double, double, double*, - double*, double*, double*, double*, double*, double*, double*, - double*, double*, double*, double*, double*, double*, double*, - double*); -extern int BSIM4param(int,IFvalue*,GENinstance*,IFvalue*); -extern int BSIM4pzLoad(GENmodel*,CKTcircuit*,SPcomplex*); -extern int BSIM4setup(SMPmatrix*,GENmodel*,CKTcircuit*,int*); -extern int BSIM4temp(GENmodel*,CKTcircuit*); -extern int BSIM4trunc(GENmodel*,CKTcircuit*,double*); -extern int BSIM4noise(int,int,GENmodel*,CKTcircuit*,Ndata*,double*); -extern int BSIM4unsetup(GENmodel*,CKTcircuit*); -extern int BSIM4soaCheck(CKTcircuit *, GENmodel *); diff --git a/src/spicelib/devices/bsim4/bsim4init.c b/src/spicelib/devices/bsim4/bsim4init.c deleted file mode 100644 index 3f2156752..000000000 --- a/src/spicelib/devices/bsim4/bsim4init.c +++ /dev/null @@ -1,76 +0,0 @@ -#include "ngspice/config.h" - -#include "ngspice/devdefs.h" - -#include "bsim4itf.h" -#include "bsim4ext.h" -#include "bsim4init.h" - - -SPICEdev BSIM4info = { - .DEVpublic = { - .name = "BSIM4", - .description = "Berkeley Short Channel IGFET Model-4", - .terms = &BSIM4nSize, - .numNames = &BSIM4nSize, - .termNames = BSIM4names, - .numInstanceParms = &BSIM4pTSize, - .instanceParms = BSIM4pTable, - .numModelParms = &BSIM4mPTSize, - .modelParms = BSIM4mPTable, - .flags = DEV_DEFAULT, - -#ifdef XSPICE - .cm_func = NULL, - .num_conn = 0, - .conn = NULL, - .num_param = 0, - .param = NULL, - .num_inst_var = 0, - .inst_var = NULL, -#endif - }, - - .DEVparam = BSIM4param, - .DEVmodParam = BSIM4mParam, - .DEVload = BSIM4load, - .DEVsetup = BSIM4setup, - .DEVunsetup = BSIM4unsetup, - .DEVpzSetup = BSIM4setup, - .DEVtemperature = BSIM4temp, - .DEVtrunc = BSIM4trunc, - .DEVfindBranch = NULL, - .DEVacLoad = BSIM4acLoad, - .DEVaccept = NULL, - .DEVdestroy = NULL, - .DEVmodDelete = BSIM4mDelete, - .DEVdelete = NULL, - .DEVsetic = BSIM4getic, - .DEVask = BSIM4ask, - .DEVmodAsk = BSIM4mAsk, - .DEVpzLoad = BSIM4pzLoad, - .DEVconvTest = BSIM4convTest, - .DEVsenSetup = NULL, - .DEVsenLoad = NULL, - .DEVsenUpdate = NULL, - .DEVsenAcLoad = NULL, - .DEVsenPrint = NULL, - .DEVsenTrunc = NULL, - .DEVdisto = NULL, - .DEVnoise = BSIM4noise, - .DEVsoaCheck = BSIM4soaCheck, - .DEVinstSize = &BSIM4iSize, - .DEVmodSize = &BSIM4mSize, - -#ifdef CIDER - .DEVdump = NULL, - .DEVacct = NULL, -#endif -}; - - -SPICEdev * -get_bsim4_info(void) -{ - return &BSIM4info; -} diff --git a/src/spicelib/devices/bsim4/bsim4init.h b/src/spicelib/devices/bsim4/bsim4init.h deleted file mode 100644 index 11faee141..000000000 --- a/src/spicelib/devices/bsim4/bsim4init.h +++ /dev/null @@ -1,13 +0,0 @@ -#ifndef _BSIM4INIT_H -#define _BSIM4INIT_H - -extern IFparm BSIM4pTable[ ]; -extern IFparm BSIM4mPTable[ ]; -extern char *BSIM4names[ ]; -extern int BSIM4pTSize; -extern int BSIM4mPTSize; -extern int BSIM4nSize; -extern int BSIM4iSize; -extern int BSIM4mSize; - -#endif diff --git a/src/spicelib/devices/bsim4/bsim4itf.h b/src/spicelib/devices/bsim4/bsim4itf.h deleted file mode 100644 index 7d485aec1..000000000 --- a/src/spicelib/devices/bsim4/bsim4itf.h +++ /dev/null @@ -1,66 +0,0 @@ -/* ****************************************************************************** - * BSIM4 4.8.1 released by Chetan Kumar Dabhi 2/15/2017 * - * BSIM4 Model Equations * - ****************************************************************************** - - ****************************************************************************** - * Copyright 2017 Regents of the University of California. * - * All rights reserved. * - * * - * Project Director: Prof. Chenming Hu. * - * Authors: Gary W. Ng, Weidong Liu, Xuemei Xi, Mohan Dunga, Wenwei Yang * - * Ali Niknejad, Shivendra Singh Parihar, Chetan Kumar Dabhi * - * Yogesh Singh Chauhan, Sayeef Salahuddin, Chenming Hu * - ****************************************************************************** - - ****************************************************************************** - * CMC In-Code Statement * - * * - * The Developer agrees that the following statement will appear in the * - * model code that has been adopted as a CMC Standard. * - * * - * Software is distributed as is, completely without warranty or service * - * support. The University of California and its employees are not liable * - * for the condition or performance of the software. * - * * - * The University of California owns the copyright and grants users a * - * perpetual, irrevocable, worldwide, non-exclusive, royalty-free license * - * with respect to the software as set forth below. * - * * - * The University of California hereby disclaims all implied warranties. * - * * - * The University of California grants the users the right to modify, * - * copy, and redistribute the software and documentation, both within * - * the user's organization and externally, subject to the following * - * restrictions: * - * * - * 1. The users agree not to charge for the University of California code * - * itself but may charge for additions, extensions, or support. * - * * - * 2. In any product based on the software, the users agree to * - * acknowledge the University of California that developed the * - * software. This acknowledgment shall appear in the product * - * documentation. * - * * - * 3. Redistributions to others of source code and documentation must * - * retain the copyright notice, disclaimer, and list of conditions. * - * * - * 4. Redistributions to others in binary form must reproduce the * - * copyright notice, disclaimer, and list of conditions in the * - * documentation and/or other materials provided with the * - * distribution. * - * * - * Agreed to on ______Feb. 15, 2017______________ * - * * - * By: ____University of California, Berkeley___ * - * ____Chenming Hu__________________________ * - * ____Professor in Graduate School ________ * - * * - ****************************************************************************** */ - -#ifndef DEV_BSIM4 -#define DEV_BSIM4 - -SPICEdev *get_bsim4_info(void); - -#endif diff --git a/src/spicelib/devices/bsim4v5/B4TERMS_OF_USE b/src/spicelib/devices/bsim4v5/B4TERMS_OF_USE deleted file mode 100644 index 42d4bfe4e..000000000 --- a/src/spicelib/devices/bsim4v5/B4TERMS_OF_USE +++ /dev/null @@ -1,33 +0,0 @@ - -The terms under which the software is provided are as the following. - -Software is distributed as is, completely without warranty or service -support. The University of California and its employees are not liable -for the condition or performance of the software. - -The University owns the copyright but shall not be liable for any -infringement of copyright or other proprietary rights brought by third -parties against the users of the software. - -The University of California hereby disclaims all implied warranties. - -The University of California grants the users the right to modify, copy, -and redistribute the software and documentation, both within the user's -organization and externally, subject to the following restrictions: - -1. The users agree not to charge for the University of California code - itself but may charge for additions, extensions, or support. - -2. In any product based on the software, the users agree to acknowledge - the UC Berkeley BSIM Research Group that developed the software. This - acknowledgment shall appear in the product documentation. - -3. The users agree to obey all U.S. Government restrictions governing - redistribution or export of the software. - -4. The users agree to reproduce any copyright notice which appears on - the software on any copy or modification of such made available - to others. - -Chenming Hu, and Jane Xuemei Xi -April. 2003 diff --git a/src/spicelib/devices/bsim4v5/Makefile.am b/src/spicelib/devices/bsim4v5/Makefile.am deleted file mode 100644 index d10334644..000000000 --- a/src/spicelib/devices/bsim4v5/Makefile.am +++ /dev/null @@ -1,37 +0,0 @@ -## Process this file with automake to produce Makefile.in - -noinst_LTLIBRARIES = libbsim4v5.la - -libbsim4v5_la_SOURCES = \ - b4v5.c \ - b4v5acld.c \ - b4v5ask.c \ - b4v5check.c \ - b4v5cvtest.c \ - b4v5geo.c \ - b4v5getic.c \ - b4v5ld.c \ - b4v5mask.c \ - b4v5mdel.c \ - b4v5mpar.c \ - b4v5noi.c \ - b4v5par.c \ - b4v5pzld.c \ - b4v5set.c \ - b4v5soachk.c \ - b4v5temp.c \ - b4v5trunc.c \ - bsim4v5def.h \ - bsim4v5ext.h \ - bsim4v5init.c \ - bsim4v5init.h \ - bsim4v5itf.h - - - -AM_CPPFLAGS = @AM_CPPFLAGS@ -I$(top_srcdir)/src/include -AM_CFLAGS = $(STATIC) - -MAINTAINERCLEANFILES = Makefile.in - -EXTRA_DIST = B4TERMS_OF_USE diff --git a/src/spicelib/devices/bsim4v5/b4v5.c b/src/spicelib/devices/bsim4v5/b4v5.c deleted file mode 100644 index 686b0f1e8..000000000 --- a/src/spicelib/devices/bsim4v5/b4v5.c +++ /dev/null @@ -1,922 +0,0 @@ -/**** BSIM4.5.0 Released by Xuemei (Jane) Xi 07/29/2005 ****/ - -/********** - * Copyright 2005 Regents of the University of California. All rights reserved. - * File: b4.c of BSIM4.5.0. - * Author: 2000 Weidong Liu - * Authors: 2001- Xuemei Xi, Mohan Dunga, Ali Niknejad, Chenming Hu. - * Project Director: Prof. Chenming Hu. - * Modified by Xuemei Xi, 04/06/2001. - * Modified by Xuemei Xi, 10/05/2001. - * Modified by Xuemei Xi, 11/15/2002. - * Modified by Xuemei Xi, 05/09/2003. - * Modified by Xuemei Xi, 03/04/2004. - * Modified by Xuemei Xi, Mohan Dunga, 07/29/2005. - **********/ - -#include "ngspice/ngspice.h" -#include "ngspice/devdefs.h" -#include "bsim4v5def.h" -#include "ngspice/suffix.h" - -IFparm BSIM4v5pTable[] = { /* parameters */ -IOP( "l", BSIM4v5_L, IF_REAL , "Length"), -IOP( "w", BSIM4v5_W, IF_REAL , "Width"), -IOP( "m", BSIM4v5_M, IF_REAL , "Separate Parallel multiplier"), -IOP( "nf", BSIM4v5_NF, IF_REAL , "Number of fingers"), -IOP( "sa", BSIM4v5_SA, IF_REAL , "distance between OD edge to poly of one side "), -IOP( "sb", BSIM4v5_SB, IF_REAL , "distance between OD edge to poly of the other side"), -IOP( "sd", BSIM4v5_SD, IF_REAL , "distance between neighbour fingers"), -IOP( "sca", BSIM4v5_SCA, IF_REAL , "Integral of the first distribution function for scattered well dopant"), -IOP( "scb", BSIM4v5_SCB, IF_REAL , "Integral of the second distribution function for scattered well dopant"), -IOP( "scc", BSIM4v5_SCC, IF_REAL , "Integral of the third distribution function for scattered well dopant"), -IOP( "sc", BSIM4v5_SC, IF_REAL , "Distance to a single well edge "), -IOP( "min", BSIM4v5_MIN, IF_INTEGER , "Minimize either D or S"), -IOP( "ad", BSIM4v5_AD, IF_REAL , "Drain area"), -IOP( "as", BSIM4v5_AS, IF_REAL , "Source area"), -IOP( "pd", BSIM4v5_PD, IF_REAL , "Drain perimeter"), -IOP( "ps", BSIM4v5_PS, IF_REAL , "Source perimeter"), -IOP( "nrd", BSIM4v5_NRD, IF_REAL , "Number of squares in drain"), -IOP( "nrs", BSIM4v5_NRS, IF_REAL , "Number of squares in source"), -IOP( "off", BSIM4v5_OFF, IF_FLAG , "Device is initially off"), -IOP( "rbdb", BSIM4v5_RBDB, IF_REAL , "Body resistance"), -IOP( "rbsb", BSIM4v5_RBSB, IF_REAL , "Body resistance"), -IOP( "rbpb", BSIM4v5_RBPB, IF_REAL , "Body resistance"), -IOP( "rbps", BSIM4v5_RBPS, IF_REAL , "Body resistance"), -IOP( "rbpd", BSIM4v5_RBPD, IF_REAL , "Body resistance"), -IOP( "delvto", BSIM4v5_DELVTO, IF_REAL , "Zero bias threshold voltage variation"), -IOPR( "delvt0", BSIM4v5_DELVTO, IF_REAL , "Zero bias threshold voltage variation"), -IOP( "xgw", BSIM4v5_XGW, IF_REAL, "Distance from gate contact center to device edge"), -IOP( "ngcon", BSIM4v5_NGCON, IF_REAL, "Number of gate contacts"), - - -IOP( "trnqsmod", BSIM4v5_TRNQSMOD, IF_INTEGER, "Transient NQS model selector"), -IOP( "acnqsmod", BSIM4v5_ACNQSMOD, IF_INTEGER, "AC NQS model selector"), -IOP( "rbodymod", BSIM4v5_RBODYMOD, IF_INTEGER, "Distributed body R model selector"), -IOP( "rgatemod", BSIM4v5_RGATEMOD, IF_INTEGER, "Gate resistance model selector"), -IOP( "geomod", BSIM4v5_GEOMOD, IF_INTEGER, "Geometry dependent parasitics model selector"), -IOP( "rgeomod", BSIM4v5_RGEOMOD, IF_INTEGER, "S/D resistance and contact model selector"), -IP( "ic", BSIM4v5_IC, IF_REALVEC , "Vector of DS,GS,BS initial voltages"), -OP( "gmbs", BSIM4v5_GMBS, IF_REAL, "Gmb"), -OP( "gm", BSIM4v5_GM, IF_REAL, "Gm"), -OP( "gds", BSIM4v5_GDS, IF_REAL, "Gds"), -OP( "vdsat", BSIM4v5_VDSAT, IF_REAL, "Vdsat"), -OP( "vth", BSIM4v5_VON, IF_REAL, "Vth"), -OP( "id", BSIM4v5_CD, IF_REAL, "Ids"), -OP( "ibd", BSIM4v5_CBD, IF_REAL, "Ibd"), -OP( "ibs", BSIM4v5_CBS, IF_REAL, "Ibs"), -OP( "gbd", BSIM4v5_GBD, IF_REAL, "gbd"), -OP( "gbs", BSIM4v5_GBS, IF_REAL, "gbs"), -OP( "isub", BSIM4v5_CSUB, IF_REAL, "Isub"), -OP( "igidl", BSIM4v5_IGIDL, IF_REAL, "Igidl"), -OP( "igisl", BSIM4v5_IGISL, IF_REAL, "Igisl"), -OP( "igs", BSIM4v5_IGS, IF_REAL, "Igs"), -OP( "igd", BSIM4v5_IGD, IF_REAL, "Igd"), -OP( "igb", BSIM4v5_IGB, IF_REAL, "Igb"), -OP( "igcs", BSIM4v5_IGCS, IF_REAL, "Igcs"), -OP( "igcd", BSIM4v5_IGCD, IF_REAL, "Igcd"), -OP( "vbs", BSIM4v5_VBS, IF_REAL, "Vbs"), -OP( "vgs", BSIM4v5_VGS, IF_REAL, "Vgs"), -OP( "vds", BSIM4v5_VDS, IF_REAL, "Vds"), -OP( "cgg", BSIM4v5_CGGB, IF_REAL, "Cggb"), -OP( "cgs", BSIM4v5_CGSB, IF_REAL, "Cgsb"), -OP( "cgd", BSIM4v5_CGDB, IF_REAL, "Cgdb"), -OP( "cbg", BSIM4v5_CBGB, IF_REAL, "Cbgb"), -OP( "cbd", BSIM4v5_CBDB, IF_REAL, "Cbdb"), -OP( "cbs", BSIM4v5_CBSB, IF_REAL, "Cbsb"), -OP( "cdg", BSIM4v5_CDGB, IF_REAL, "Cdgb"), -OP( "cdd", BSIM4v5_CDDB, IF_REAL, "Cddb"), -OP( "cds", BSIM4v5_CDSB, IF_REAL, "Cdsb"), -OP( "csg", BSIM4v5_CSGB, IF_REAL, "Csgb"), -OP( "csd", BSIM4v5_CSDB, IF_REAL, "Csdb"), -OP( "css", BSIM4v5_CSSB, IF_REAL, "Cssb"), -OP( "cgb", BSIM4v5_CGBB, IF_REAL, "Cgbb"), -OP( "cdb", BSIM4v5_CDBB, IF_REAL, "Cdbb"), -OP( "csb", BSIM4v5_CSBB, IF_REAL, "Csbb"), -OP( "cbb", BSIM4v5_CBBB, IF_REAL, "Cbbb"), -OP( "capbd", BSIM4v5_CAPBD, IF_REAL, "Capbd"), -OP( "capbs", BSIM4v5_CAPBS, IF_REAL, "Capbs"), -OP( "qg", BSIM4v5_QG, IF_REAL, "Qgate"), -OP( "qb", BSIM4v5_QB, IF_REAL, "Qbulk"), -OP( "qd", BSIM4v5_QD, IF_REAL, "Qdrain"), -OP( "qs", BSIM4v5_QS, IF_REAL, "Qsource"), -OP( "qinv", BSIM4v5_QINV, IF_REAL, "Qinversion"), -OP( "qdef", BSIM4v5_QDEF, IF_REAL, "Qdef"), -OP( "gcrg", BSIM4v5_GCRG, IF_REAL, "Gcrg"), -OP( "gtau", BSIM4v5_GTAU, IF_REAL, "Gtau"), -}; - -IFparm BSIM4v5mPTable[] = { /* model parameters */ -IOP( "capmod", BSIM4v5_MOD_CAPMOD, IF_INTEGER, "Capacitance model selector"), -IOP( "diomod", BSIM4v5_MOD_DIOMOD, IF_INTEGER, "Diode IV model selector"), -IOP( "rdsmod", BSIM4v5_MOD_RDSMOD, IF_INTEGER, "Bias-dependent S/D resistance model selector"), -IOP( "trnqsmod", BSIM4v5_MOD_TRNQSMOD, IF_INTEGER, "Transient NQS model selector"), -IOP( "acnqsmod", BSIM4v5_MOD_ACNQSMOD, IF_INTEGER, "AC NQS model selector"), -IOP( "mobmod", BSIM4v5_MOD_MOBMOD, IF_INTEGER, "Mobility model selector"), -IOP( "rbodymod", BSIM4v5_MOD_RBODYMOD, IF_INTEGER, "Distributed body R model selector"), -IOP( "rgatemod", BSIM4v5_MOD_RGATEMOD, IF_INTEGER, "Gate R model selector"), -IOP( "permod", BSIM4v5_MOD_PERMOD, IF_INTEGER, "Pd and Ps model selector"), -IOP( "geomod", BSIM4v5_MOD_GEOMOD, IF_INTEGER, "Geometry dependent parasitics model selector"), -IOP( "rgeomod", BSIM4v5_MOD_RGEOMOD, IF_INTEGER, "S/D resistance and contact model selector"), -IOP( "fnoimod", BSIM4v5_MOD_FNOIMOD, IF_INTEGER, "Flicker noise model selector"), -IOP( "tnoimod", BSIM4v5_MOD_TNOIMOD, IF_INTEGER, "Thermal noise model selector"), -IOP( "igcmod", BSIM4v5_MOD_IGCMOD, IF_INTEGER, "Gate-to-channel Ig model selector"), -IOP( "igbmod", BSIM4v5_MOD_IGBMOD, IF_INTEGER, "Gate-to-body Ig model selector"), -IOP( "tempmod", BSIM4v5_MOD_TEMPMOD, IF_INTEGER, "Temperature model selector"), -IOP( "paramchk", BSIM4v5_MOD_PARAMCHK, IF_INTEGER, "Model parameter checking selector"), -IOP( "binunit", BSIM4v5_MOD_BINUNIT, IF_INTEGER, "Bin unit selector"), -IOP( "version", BSIM4v5_MOD_VERSION, IF_STRING, "parameter for model version"), -IOP( "toxe", BSIM4v5_MOD_TOXE, IF_REAL, "Electrical gate oxide thickness in meters"), -IOP( "toxp", BSIM4v5_MOD_TOXP, IF_REAL, "Physical gate oxide thickness in meters"), -IOP( "toxm", BSIM4v5_MOD_TOXM, IF_REAL, "Gate oxide thickness at which parameters are extracted"), -IOP( "toxref", BSIM4v5_MOD_TOXREF, IF_REAL, "Target tox value"), -IOP( "dtox", BSIM4v5_MOD_DTOX, IF_REAL, "Defined as (toxe - toxp) "), -IOP( "epsrox", BSIM4v5_MOD_EPSROX, IF_REAL, "Dielectric constant of the gate oxide relative to vacuum"), -IOP( "cdsc", BSIM4v5_MOD_CDSC, IF_REAL, "Drain/Source and channel coupling capacitance"), -IOP( "cdscb", BSIM4v5_MOD_CDSCB, IF_REAL, "Body-bias dependence of cdsc"), -IOP( "cdscd", BSIM4v5_MOD_CDSCD, IF_REAL, "Drain-bias dependence of cdsc"), -IOP( "cit", BSIM4v5_MOD_CIT, IF_REAL, "Interface state capacitance"), -IOP( "nfactor", BSIM4v5_MOD_NFACTOR, IF_REAL, "Subthreshold swing Coefficient"), -IOP( "xj", BSIM4v5_MOD_XJ, IF_REAL, "Junction depth in meters"), -IOP( "vsat", BSIM4v5_MOD_VSAT, IF_REAL, "Saturation velocity at tnom"), -IOP( "at", BSIM4v5_MOD_AT, IF_REAL, "Temperature coefficient of vsat"), -IOP( "a0", BSIM4v5_MOD_A0, IF_REAL, "Non-uniform depletion width effect coefficient."), -IOP( "ags", BSIM4v5_MOD_AGS, IF_REAL, "Gate bias coefficient of Abulk."), -IOP( "a1", BSIM4v5_MOD_A1, IF_REAL, "Non-saturation effect coefficient"), -IOP( "a2", BSIM4v5_MOD_A2, IF_REAL, "Non-saturation effect coefficient"), -IOP( "keta", BSIM4v5_MOD_KETA, IF_REAL, "Body-bias coefficient of non-uniform depletion width effect."), -IOP( "nsub", BSIM4v5_MOD_NSUB, IF_REAL, "Substrate doping concentration"), -IOP( "ndep", BSIM4v5_MOD_NDEP, IF_REAL, "Channel doping concentration at the depletion edge"), -IOP( "nsd", BSIM4v5_MOD_NSD, IF_REAL, "S/D doping concentration"), -IOP( "phin", BSIM4v5_MOD_PHIN, IF_REAL, "Adjusting parameter for surface potential due to non-uniform vertical doping"), -IOP( "ngate", BSIM4v5_MOD_NGATE, IF_REAL, "Poly-gate doping concentration"), -IOP( "gamma1", BSIM4v5_MOD_GAMMA1, IF_REAL, "Vth body coefficient"), -IOP( "gamma2", BSIM4v5_MOD_GAMMA2, IF_REAL, "Vth body coefficient"), -IOP( "vbx", BSIM4v5_MOD_VBX, IF_REAL, "Vth transition body Voltage"), -IOP( "vbm", BSIM4v5_MOD_VBM, IF_REAL, "Maximum body voltage"), - -IOP( "xt", BSIM4v5_MOD_XT, IF_REAL, "Doping depth"), -IOP( "k1", BSIM4v5_MOD_K1, IF_REAL, "Bulk effect coefficient 1"), -IOP( "kt1", BSIM4v5_MOD_KT1, IF_REAL, "Temperature coefficient of Vth"), -IOP( "kt1l", BSIM4v5_MOD_KT1L, IF_REAL, "Temperature coefficient of Vth"), -IOP( "kt2", BSIM4v5_MOD_KT2, IF_REAL, "Body-coefficient of kt1"), -IOP( "k2", BSIM4v5_MOD_K2, IF_REAL, "Bulk effect coefficient 2"), -IOP( "k3", BSIM4v5_MOD_K3, IF_REAL, "Narrow width effect coefficient"), -IOP( "k3b", BSIM4v5_MOD_K3B, IF_REAL, "Body effect coefficient of k3"), -IOP( "w0", BSIM4v5_MOD_W0, IF_REAL, "Narrow width effect parameter"), -IOP( "dvtp0", BSIM4v5_MOD_DVTP0, IF_REAL, "First parameter for Vth shift due to pocket"), -IOP( "dvtp1", BSIM4v5_MOD_DVTP1, IF_REAL, "Second parameter for Vth shift due to pocket"), -IOP( "lpe0", BSIM4v5_MOD_LPE0, IF_REAL, "Equivalent length of pocket region at zero bias"), -IOP( "lpeb", BSIM4v5_MOD_LPEB, IF_REAL, "Equivalent length of pocket region accounting for body bias"), -IOP( "dvt0", BSIM4v5_MOD_DVT0, IF_REAL, "Short channel effect coeff. 0"), -IOP( "dvt1", BSIM4v5_MOD_DVT1, IF_REAL, "Short channel effect coeff. 1"), -IOP( "dvt2", BSIM4v5_MOD_DVT2, IF_REAL, "Short channel effect coeff. 2"), -IOP( "dvt0w", BSIM4v5_MOD_DVT0W, IF_REAL, "Narrow Width coeff. 0"), -IOP( "dvt1w", BSIM4v5_MOD_DVT1W, IF_REAL, "Narrow Width effect coeff. 1"), -IOP( "dvt2w", BSIM4v5_MOD_DVT2W, IF_REAL, "Narrow Width effect coeff. 2"), -IOP( "drout", BSIM4v5_MOD_DROUT, IF_REAL, "DIBL coefficient of output resistance"), -IOP( "dsub", BSIM4v5_MOD_DSUB, IF_REAL, "DIBL coefficient in the subthreshold region"), -IOP( "vth0", BSIM4v5_MOD_VTH0, IF_REAL,"Threshold voltage"), -IOPR("vtho", BSIM4v5_MOD_VTH0, IF_REAL,"Threshold voltage"), -IOP( "ua", BSIM4v5_MOD_UA, IF_REAL, "Linear gate dependence of mobility"), -IOP( "ua1", BSIM4v5_MOD_UA1, IF_REAL, "Temperature coefficient of ua"), -IOP( "ub", BSIM4v5_MOD_UB, IF_REAL, "Quadratic gate dependence of mobility"), -IOP( "ub1", BSIM4v5_MOD_UB1, IF_REAL, "Temperature coefficient of ub"), -IOP( "uc", BSIM4v5_MOD_UC, IF_REAL, "Body-bias dependence of mobility"), -IOP( "uc1", BSIM4v5_MOD_UC1, IF_REAL, "Temperature coefficient of uc"), -IOP( "ud", BSIM4v5_MOD_UD, IF_REAL, "Coulomb scattering factor of mobility"), -IOP( "ud1", BSIM4v5_MOD_UD1, IF_REAL, "Temperature coefficient of ud"), -IOP( "up", BSIM4v5_MOD_UP, IF_REAL, "Channel length linear factor of mobility"), -IOP( "lp", BSIM4v5_MOD_LP, IF_REAL, "Channel length exponential factor of mobility"), -IOP( "u0", BSIM4v5_MOD_U0, IF_REAL, "Low-field mobility at Tnom"), -IOP( "eu", BSIM4v5_MOD_EU, IF_REAL, "Mobility exponent"), -IOP( "ute", BSIM4v5_MOD_UTE, IF_REAL, "Temperature coefficient of mobility"), -IOP( "voff", BSIM4v5_MOD_VOFF, IF_REAL, "Threshold voltage offset"), -IOP( "minv", BSIM4v5_MOD_MINV, IF_REAL, "Fitting parameter for moderate invversion in Vgsteff"), -IOP( "voffl", BSIM4v5_MOD_VOFFL, IF_REAL, "Length dependence parameter for Vth offset"), -IOP( "tnom", BSIM4v5_MOD_TNOM, IF_REAL, "Parameter measurement temperature"), -IOP( "cgso", BSIM4v5_MOD_CGSO, IF_REAL, "Gate-source overlap capacitance per width"), -IOP( "cgdo", BSIM4v5_MOD_CGDO, IF_REAL, "Gate-drain overlap capacitance per width"), -IOP( "cgbo", BSIM4v5_MOD_CGBO, IF_REAL, "Gate-bulk overlap capacitance per length"), -IOP( "xpart", BSIM4v5_MOD_XPART, IF_REAL, "Channel charge partitioning"), -IOP( "delta", BSIM4v5_MOD_DELTA, IF_REAL, "Effective Vds parameter"), -IOP( "rsh", BSIM4v5_MOD_RSH, IF_REAL, "Source-drain sheet resistance"), -IOP( "rdsw", BSIM4v5_MOD_RDSW, IF_REAL, "Source-drain resistance per width"), -IOP( "rdswmin", BSIM4v5_MOD_RDSWMIN, IF_REAL, "Source-drain resistance per width at high Vg"), -IOP( "rsw", BSIM4v5_MOD_RSW, IF_REAL, "Source resistance per width"), -IOP( "rdw", BSIM4v5_MOD_RDW, IF_REAL, "Drain resistance per width"), -IOP( "rdwmin", BSIM4v5_MOD_RDWMIN, IF_REAL, "Drain resistance per width at high Vg"), -IOP( "rswmin", BSIM4v5_MOD_RSWMIN, IF_REAL, "Source resistance per width at high Vg"), - -IOP( "prwg", BSIM4v5_MOD_PRWG, IF_REAL, "Gate-bias effect on parasitic resistance "), -IOP( "prwb", BSIM4v5_MOD_PRWB, IF_REAL, "Body-effect on parasitic resistance "), - -IOP( "prt", BSIM4v5_MOD_PRT, IF_REAL, "Temperature coefficient of parasitic resistance "), -IOP( "eta0", BSIM4v5_MOD_ETA0, IF_REAL, "Subthreshold region DIBL coefficient"), -IOP( "etab", BSIM4v5_MOD_ETAB, IF_REAL, "Subthreshold region DIBL coefficient"), -IOP( "pclm", BSIM4v5_MOD_PCLM, IF_REAL, "Channel length modulation Coefficient"), -IOP( "pdiblc1", BSIM4v5_MOD_PDIBL1, IF_REAL, "Drain-induced barrier lowering coefficient"), -IOP( "pdiblc2", BSIM4v5_MOD_PDIBL2, IF_REAL, "Drain-induced barrier lowering coefficient"), -IOP( "pdiblcb", BSIM4v5_MOD_PDIBLB, IF_REAL, "Body-effect on drain-induced barrier lowering"), -IOP( "fprout", BSIM4v5_MOD_FPROUT, IF_REAL, "Rout degradation coefficient for pocket devices"), -IOP( "pdits", BSIM4v5_MOD_PDITS, IF_REAL, "Coefficient for drain-induced Vth shifts"), -IOP( "pditsl", BSIM4v5_MOD_PDITSL, IF_REAL, "Length dependence of drain-induced Vth shifts"), -IOP( "pditsd", BSIM4v5_MOD_PDITSD, IF_REAL, "Vds dependence of drain-induced Vth shifts"), -IOP( "pscbe1", BSIM4v5_MOD_PSCBE1, IF_REAL, "Substrate current body-effect coefficient"), -IOP( "pscbe2", BSIM4v5_MOD_PSCBE2, IF_REAL, "Substrate current body-effect coefficient"), -IOP( "pvag", BSIM4v5_MOD_PVAG, IF_REAL, "Gate dependence of output resistance parameter"), - -IOP( "jss", BSIM4v5_MOD_JSS, IF_REAL, "Bottom source junction reverse saturation current density"), -IOP( "jsws", BSIM4v5_MOD_JSWS, IF_REAL, "Isolation edge sidewall source junction reverse saturation current density"), -IOP( "jswgs", BSIM4v5_MOD_JSWGS, IF_REAL, "Gate edge source junction reverse saturation current density"), -IOP( "pbs", BSIM4v5_MOD_PBS, IF_REAL, "Source junction built-in potential"), -IOP( "njs", BSIM4v5_MOD_NJS, IF_REAL, "Source junction emission coefficient"), -IOP( "xtis", BSIM4v5_MOD_XTIS, IF_REAL, "Source junction current temperature exponent"), -IOP( "mjs", BSIM4v5_MOD_MJS, IF_REAL, "Source bottom junction capacitance grading coefficient"), -IOP( "pbsws", BSIM4v5_MOD_PBSWS, IF_REAL, "Source sidewall junction capacitance built in potential"), -IOP( "mjsws", BSIM4v5_MOD_MJSWS, IF_REAL, "Source sidewall junction capacitance grading coefficient"), -IOP( "pbswgs", BSIM4v5_MOD_PBSWGS, IF_REAL, "Source (gate side) sidewall junction capacitance built in potential"), -IOP( "mjswgs", BSIM4v5_MOD_MJSWGS, IF_REAL, "Source (gate side) sidewall junction capacitance grading coefficient"), -IOP( "cjs", BSIM4v5_MOD_CJS, IF_REAL, "Source bottom junction capacitance per unit area"), -IOP( "cjsws", BSIM4v5_MOD_CJSWS, IF_REAL, "Source sidewall junction capacitance per unit periphery"), -IOP( "cjswgs", BSIM4v5_MOD_CJSWGS, IF_REAL, "Source (gate side) sidewall junction capacitance per unit width"), - -IOP( "jsd", BSIM4v5_MOD_JSD, IF_REAL, "Bottom drain junction reverse saturation current density"), -IOP( "jswd", BSIM4v5_MOD_JSWD, IF_REAL, "Isolation edge sidewall drain junction reverse saturation current density"), -IOP( "jswgd", BSIM4v5_MOD_JSWGD, IF_REAL, "Gate edge drain junction reverse saturation current density"), -IOP( "pbd", BSIM4v5_MOD_PBD, IF_REAL, "Drain junction built-in potential"), -IOP( "njd", BSIM4v5_MOD_NJD, IF_REAL, "Drain junction emission coefficient"), -IOP( "xtid", BSIM4v5_MOD_XTID, IF_REAL, "Drainjunction current temperature exponent"), -IOP( "mjd", BSIM4v5_MOD_MJD, IF_REAL, "Drain bottom junction capacitance grading coefficient"), -IOP( "pbswd", BSIM4v5_MOD_PBSWD, IF_REAL, "Drain sidewall junction capacitance built in potential"), -IOP( "mjswd", BSIM4v5_MOD_MJSWD, IF_REAL, "Drain sidewall junction capacitance grading coefficient"), -IOP( "pbswgd", BSIM4v5_MOD_PBSWGD, IF_REAL, "Drain (gate side) sidewall junction capacitance built in potential"), -IOP( "mjswgd", BSIM4v5_MOD_MJSWGD, IF_REAL, "Drain (gate side) sidewall junction capacitance grading coefficient"), -IOP( "cjd", BSIM4v5_MOD_CJD, IF_REAL, "Drain bottom junction capacitance per unit area"), -IOP( "cjswd", BSIM4v5_MOD_CJSWD, IF_REAL, "Drain sidewall junction capacitance per unit periphery"), -IOP( "cjswgd", BSIM4v5_MOD_CJSWGD, IF_REAL, "Drain (gate side) sidewall junction capacitance per unit width"), - -IOP( "vfbcv", BSIM4v5_MOD_VFBCV, IF_REAL, "Flat Band Voltage parameter for capmod=0 only"), -IOP( "vfb", BSIM4v5_MOD_VFB, IF_REAL, "Flat Band Voltage"), -IOP( "tpb", BSIM4v5_MOD_TPB, IF_REAL, "Temperature coefficient of pb"), -IOP( "tcj", BSIM4v5_MOD_TCJ, IF_REAL, "Temperature coefficient of cj"), -IOP( "tpbsw", BSIM4v5_MOD_TPBSW, IF_REAL, "Temperature coefficient of pbsw"), -IOP( "tcjsw", BSIM4v5_MOD_TCJSW, IF_REAL, "Temperature coefficient of cjsw"), -IOP( "tpbswg", BSIM4v5_MOD_TPBSWG, IF_REAL, "Temperature coefficient of pbswg"), -IOP( "tcjswg", BSIM4v5_MOD_TCJSWG, IF_REAL, "Temperature coefficient of cjswg"), -IOP( "acde", BSIM4v5_MOD_ACDE, IF_REAL, "Exponential coefficient for finite charge thickness"), -IOP( "moin", BSIM4v5_MOD_MOIN, IF_REAL, "Coefficient for gate-bias dependent surface potential"), -IOP( "noff", BSIM4v5_MOD_NOFF, IF_REAL, "C-V turn-on/off parameter"), -IOP( "voffcv", BSIM4v5_MOD_VOFFCV, IF_REAL, "C-V lateral-shift parameter"), -IOP( "dmcg", BSIM4v5_MOD_DMCG, IF_REAL, "Distance of Mid-Contact to Gate edge"), -IOP( "dmci", BSIM4v5_MOD_DMCI, IF_REAL, "Distance of Mid-Contact to Isolation"), -IOP( "dmdg", BSIM4v5_MOD_DMDG, IF_REAL, "Distance of Mid-Diffusion to Gate edge"), -IOP( "dmcgt", BSIM4v5_MOD_DMCGT, IF_REAL, "Distance of Mid-Contact to Gate edge in Test structures"), -IOP( "xgw", BSIM4v5_MOD_XGW, IF_REAL, "Distance from gate contact center to device edge"), -IOP( "xgl", BSIM4v5_MOD_XGL, IF_REAL, "Variation in Ldrawn"), -IOP( "rshg", BSIM4v5_MOD_RSHG, IF_REAL, "Gate sheet resistance"), -IOP( "ngcon", BSIM4v5_MOD_NGCON, IF_REAL, "Number of gate contacts"), -IOP( "xrcrg1", BSIM4v5_MOD_XRCRG1, IF_REAL, "First fitting parameter the bias-dependent Rg"), -IOP( "xrcrg2", BSIM4v5_MOD_XRCRG2, IF_REAL, "Second fitting parameter the bias-dependent Rg"), -IOP( "lambda", BSIM4v5_MOD_LAMBDA, IF_REAL, " Velocity overshoot parameter"), -IOP( "vtl", BSIM4v5_MOD_VTL, IF_REAL, " thermal velocity"), -IOP( "lc", BSIM4v5_MOD_LC, IF_REAL, " back scattering parameter"), -IOP( "xn", BSIM4v5_MOD_XN, IF_REAL, " back scattering parameter"), -IOP( "vfbsdoff", BSIM4v5_MOD_VFBSDOFF, IF_REAL, "S/D flatband voltage offset"), -IOP( "tvfbsdoff", BSIM4v5_MOD_TVFBSDOFF, IF_REAL, "Temperature parameter for vfbsdoff"), -IOP( "tvoff", BSIM4v5_MOD_TVOFF, IF_REAL, "Temperature parameter for voff"), - -IOP( "lintnoi", BSIM4v5_MOD_LINTNOI, IF_REAL, "lint offset for noise calculation"), -IOP( "lint", BSIM4v5_MOD_LINT, IF_REAL, "Length reduction parameter"), -IOP( "ll", BSIM4v5_MOD_LL, IF_REAL, "Length reduction parameter"), -IOP( "llc", BSIM4v5_MOD_LLC, IF_REAL, "Length reduction parameter for CV"), -IOP( "lln", BSIM4v5_MOD_LLN, IF_REAL, "Length reduction parameter"), -IOP( "lw", BSIM4v5_MOD_LW, IF_REAL, "Length reduction parameter"), -IOP( "lwc", BSIM4v5_MOD_LWC, IF_REAL, "Length reduction parameter for CV"), -IOP( "lwn", BSIM4v5_MOD_LWN, IF_REAL, "Length reduction parameter"), -IOP( "lwl", BSIM4v5_MOD_LWL, IF_REAL, "Length reduction parameter"), -IOP( "lwlc", BSIM4v5_MOD_LWLC, IF_REAL, "Length reduction parameter for CV"), -IOP( "lmin", BSIM4v5_MOD_LMIN, IF_REAL, "Minimum length for the model"), -IOP( "lmax", BSIM4v5_MOD_LMAX, IF_REAL, "Maximum length for the model"), - -IOP( "wr", BSIM4v5_MOD_WR, IF_REAL, "Width dependence of rds"), -IOP( "wint", BSIM4v5_MOD_WINT, IF_REAL, "Width reduction parameter"), -IOP( "dwg", BSIM4v5_MOD_DWG, IF_REAL, "Width reduction parameter"), -IOP( "dwb", BSIM4v5_MOD_DWB, IF_REAL, "Width reduction parameter"), - -IOP( "wl", BSIM4v5_MOD_WL, IF_REAL, "Width reduction parameter"), -IOP( "wlc", BSIM4v5_MOD_WLC, IF_REAL, "Width reduction parameter for CV"), -IOP( "wln", BSIM4v5_MOD_WLN, IF_REAL, "Width reduction parameter"), -IOP( "ww", BSIM4v5_MOD_WW, IF_REAL, "Width reduction parameter"), -IOP( "wwc", BSIM4v5_MOD_WWC, IF_REAL, "Width reduction parameter for CV"), -IOP( "wwn", BSIM4v5_MOD_WWN, IF_REAL, "Width reduction parameter"), -IOP( "wwl", BSIM4v5_MOD_WWL, IF_REAL, "Width reduction parameter"), -IOP( "wwlc", BSIM4v5_MOD_WWLC, IF_REAL, "Width reduction parameter for CV"), -IOP( "wmin", BSIM4v5_MOD_WMIN, IF_REAL, "Minimum width for the model"), -IOP( "wmax", BSIM4v5_MOD_WMAX, IF_REAL, "Maximum width for the model"), - -IOP( "b0", BSIM4v5_MOD_B0, IF_REAL, "Abulk narrow width parameter"), -IOP( "b1", BSIM4v5_MOD_B1, IF_REAL, "Abulk narrow width parameter"), - -IOP( "cgsl", BSIM4v5_MOD_CGSL, IF_REAL, "New C-V model parameter"), -IOP( "cgdl", BSIM4v5_MOD_CGDL, IF_REAL, "New C-V model parameter"), -IOP( "ckappas", BSIM4v5_MOD_CKAPPAS, IF_REAL, "S/G overlap C-V parameter "), -IOP( "ckappad", BSIM4v5_MOD_CKAPPAD, IF_REAL, "D/G overlap C-V parameter"), -IOP( "cf", BSIM4v5_MOD_CF, IF_REAL, "Fringe capacitance parameter"), -IOP( "clc", BSIM4v5_MOD_CLC, IF_REAL, "Vdsat parameter for C-V model"), -IOP( "cle", BSIM4v5_MOD_CLE, IF_REAL, "Vdsat parameter for C-V model"), -IOP( "dwc", BSIM4v5_MOD_DWC, IF_REAL, "Delta W for C-V model"), -IOP( "dlc", BSIM4v5_MOD_DLC, IF_REAL, "Delta L for C-V model"), -IOP( "xw", BSIM4v5_MOD_XW, IF_REAL, "W offset for channel width due to mask/etch effect"), -IOP( "xl", BSIM4v5_MOD_XL, IF_REAL, "L offset for channel length due to mask/etch effect"), -IOP( "dlcig", BSIM4v5_MOD_DLCIG, IF_REAL, "Delta L for Ig model"), -IOP( "dwj", BSIM4v5_MOD_DWJ, IF_REAL, "Delta W for S/D junctions"), - -IOP( "alpha0", BSIM4v5_MOD_ALPHA0, IF_REAL, "substrate current model parameter"), -IOP( "alpha1", BSIM4v5_MOD_ALPHA1, IF_REAL, "substrate current model parameter"), -IOP( "beta0", BSIM4v5_MOD_BETA0, IF_REAL, "substrate current model parameter"), - -IOP( "agidl", BSIM4v5_MOD_AGIDL, IF_REAL, "Pre-exponential constant for GIDL"), -IOP( "bgidl", BSIM4v5_MOD_BGIDL, IF_REAL, "Exponential constant for GIDL"), -IOP( "cgidl", BSIM4v5_MOD_CGIDL, IF_REAL, "Parameter for body-bias dependence of GIDL"), -IOP( "egidl", BSIM4v5_MOD_EGIDL, IF_REAL, "Fitting parameter for Bandbending"), -IOP( "aigc", BSIM4v5_MOD_AIGC, IF_REAL, "Parameter for Igc"), -IOP( "bigc", BSIM4v5_MOD_BIGC, IF_REAL, "Parameter for Igc"), -IOP( "cigc", BSIM4v5_MOD_CIGC, IF_REAL, "Parameter for Igc"), -IOP( "aigsd", BSIM4v5_MOD_AIGSD, IF_REAL, "Parameter for Igs,d"), -IOP( "bigsd", BSIM4v5_MOD_BIGSD, IF_REAL, "Parameter for Igs,d"), -IOP( "cigsd", BSIM4v5_MOD_CIGSD, IF_REAL, "Parameter for Igs,d"), -IOP( "aigbacc", BSIM4v5_MOD_AIGBACC, IF_REAL, "Parameter for Igb"), -IOP( "bigbacc", BSIM4v5_MOD_BIGBACC, IF_REAL, "Parameter for Igb"), -IOP( "cigbacc", BSIM4v5_MOD_CIGBACC, IF_REAL, "Parameter for Igb"), -IOP( "aigbinv", BSIM4v5_MOD_AIGBINV, IF_REAL, "Parameter for Igb"), -IOP( "bigbinv", BSIM4v5_MOD_BIGBINV, IF_REAL, "Parameter for Igb"), -IOP( "cigbinv", BSIM4v5_MOD_CIGBINV, IF_REAL, "Parameter for Igb"), -IOP( "nigc", BSIM4v5_MOD_NIGC, IF_REAL, "Parameter for Igc slope"), -IOP( "nigbinv", BSIM4v5_MOD_NIGBINV, IF_REAL, "Parameter for Igbinv slope"), -IOP( "nigbacc", BSIM4v5_MOD_NIGBACC, IF_REAL, "Parameter for Igbacc slope"), -IOP( "ntox", BSIM4v5_MOD_NTOX, IF_REAL, "Exponent for Tox ratio"), -IOP( "eigbinv", BSIM4v5_MOD_EIGBINV, IF_REAL, "Parameter for the Si bandgap for Igbinv"), -IOP( "pigcd", BSIM4v5_MOD_PIGCD, IF_REAL, "Parameter for Igc partition"), -IOP( "poxedge", BSIM4v5_MOD_POXEDGE, IF_REAL, "Factor for the gate edge Tox"), - -IOP( "ijthdfwd", BSIM4v5_MOD_IJTHDFWD, IF_REAL, "Forward drain diode forward limiting current"), -IOP( "ijthsfwd", BSIM4v5_MOD_IJTHSFWD, IF_REAL, "Forward source diode forward limiting current"), -IOP( "ijthdrev", BSIM4v5_MOD_IJTHDREV, IF_REAL, "Reverse drain diode forward limiting current"), -IOP( "ijthsrev", BSIM4v5_MOD_IJTHSREV, IF_REAL, "Reverse source diode forward limiting current"), -IOP( "xjbvd", BSIM4v5_MOD_XJBVD, IF_REAL, "Fitting parameter for drain diode breakdown current"), -IOP( "xjbvs", BSIM4v5_MOD_XJBVS, IF_REAL, "Fitting parameter for source diode breakdown current"), -IOP( "bvd", BSIM4v5_MOD_BVD, IF_REAL, "Drain diode breakdown voltage"), -IOP( "bvs", BSIM4v5_MOD_BVS, IF_REAL, "Source diode breakdown voltage"), - -IOP( "jtss", BSIM4v5_MOD_JTSS, IF_REAL, "Source bottom trap-assisted saturation current density"), -IOP( "jtsd", BSIM4v5_MOD_JTSD, IF_REAL, "Drain bottom trap-assisted saturation current density"), -IOP( "jtssws", BSIM4v5_MOD_JTSSWS, IF_REAL, "Source STI sidewall trap-assisted saturation current density"), -IOP( "jtsswd", BSIM4v5_MOD_JTSSWD, IF_REAL, "Drain STI sidewall trap-assisted saturation current density"), -IOP( "jtsswgs", BSIM4v5_MOD_JTSSWGS, IF_REAL, "Source gate-edge sidewall trap-assisted saturation current density"), -IOP( "jtsswgd", BSIM4v5_MOD_JTSSWGD, IF_REAL, "Drain gate-edge sidewall trap-assisted saturation current density"), -IOP( "njts", BSIM4v5_MOD_NJTS, IF_REAL, "Non-ideality factor for bottom junction"), -IOP( "njtssw", BSIM4v5_MOD_NJTSSW, IF_REAL, "Non-ideality factor for STI sidewall junction"), -IOP( "njtsswg", BSIM4v5_MOD_NJTSSWG, IF_REAL, "Non-ideality factor for gate-edge sidewall junction"), -IOP( "xtss", BSIM4v5_MOD_XTSS, IF_REAL, "Power dependence of JTSS on temperature"), -IOP( "xtsd", BSIM4v5_MOD_XTSD, IF_REAL, "Power dependence of JTSD on temperature"), -IOP( "xtssws", BSIM4v5_MOD_XTSSWS, IF_REAL, "Power dependence of JTSSWS on temperature"), -IOP( "xtsswd", BSIM4v5_MOD_XTSSWD, IF_REAL, "Power dependence of JTSSWD on temperature"), -IOP( "xtsswgs", BSIM4v5_MOD_XTSSWGS, IF_REAL, "Power dependence of JTSSWGS on temperature"), -IOP( "xtsswgd", BSIM4v5_MOD_XTSSWGD, IF_REAL, "Power dependence of JTSSWGD on temperature"), -IOP( "tnjts", BSIM4v5_MOD_TNJTS, IF_REAL, "Temperature coefficient for NJTS"), -IOP( "tnjtssw", BSIM4v5_MOD_TNJTSSW, IF_REAL, "Temperature coefficient for NJTSSW"), -IOP( "tnjtsswg", BSIM4v5_MOD_TNJTSSWG, IF_REAL, "Temperature coefficient for NJTSSWG"), -IOP( "vtss", BSIM4v5_MOD_VTSS, IF_REAL, "Source bottom trap-assisted voltage dependent parameter"), -IOP( "vtsd", BSIM4v5_MOD_VTSD, IF_REAL, "Drain bottom trap-assisted voltage dependent parameter"), -IOP( "vtssws", BSIM4v5_MOD_VTSSWS, IF_REAL, "Source STI sidewall trap-assisted voltage dependent parameter"), -IOP( "vtsswd", BSIM4v5_MOD_VTSSWD, IF_REAL, "Drain STI sidewall trap-assisted voltage dependent parameter"), -IOP( "vtsswgs", BSIM4v5_MOD_VTSSWGS, IF_REAL, "Source gate-edge sidewall trap-assisted voltage dependent parameter"), -IOP( "vtsswgd", BSIM4v5_MOD_VTSSWGD, IF_REAL, "Drain gate-edge sidewall trap-assisted voltage dependent parameter"), - -IOP( "gbmin", BSIM4v5_MOD_GBMIN, IF_REAL, "Minimum body conductance"), -IOP( "rbdb", BSIM4v5_MOD_RBDB, IF_REAL, "Resistance between bNode and dbNode"), -IOP( "rbpb", BSIM4v5_MOD_RBPB, IF_REAL, "Resistance between bNodePrime and bNode"), -IOP( "rbsb", BSIM4v5_MOD_RBSB, IF_REAL, "Resistance between bNode and sbNode"), -IOP( "rbps", BSIM4v5_MOD_RBPS, IF_REAL, "Resistance between bNodePrime and sbNode"), -IOP( "rbpd", BSIM4v5_MOD_RBPD, IF_REAL, "Resistance between bNodePrime and bNode"), - -IOP( "rbps0", BSIM4v5_MOD_RBPS0, IF_REAL , "Body resistance RBPS scaling"), -IOP( "rbpsl", BSIM4v5_MOD_RBPSL, IF_REAL , "Body resistance RBPS L scaling"), -IOP( "rbpsw", BSIM4v5_MOD_RBPSW, IF_REAL , "Body resistance RBPS W scaling"), -IOP( "rbpsnf", BSIM4v5_MOD_RBPSNF, IF_REAL , "Body resistance RBPS NF scaling"), - -IOP( "rbpd0", BSIM4v5_MOD_RBPD0, IF_REAL , "Body resistance RBPD scaling"), -IOP( "rbpdl", BSIM4v5_MOD_RBPDL, IF_REAL , "Body resistance RBPD L scaling"), -IOP( "rbpdw", BSIM4v5_MOD_RBPDW, IF_REAL , "Body resistance RBPD W scaling"), -IOP( "rbpdnf", BSIM4v5_MOD_RBPDNF, IF_REAL , "Body resistance RBPD NF scaling"), - -IOP( "rbpbx0", BSIM4v5_MOD_RBPBX0, IF_REAL , "Body resistance RBPBX scaling"), -IOP( "rbpbxl", BSIM4v5_MOD_RBPBXL, IF_REAL , "Body resistance RBPBX L scaling"), -IOP( "rbpbxw", BSIM4v5_MOD_RBPBXW, IF_REAL , "Body resistance RBPBX W scaling"), -IOP( "rbpbxnf", BSIM4v5_MOD_RBPBXNF, IF_REAL , "Body resistance RBPBX NF scaling"), -IOP( "rbpby0", BSIM4v5_MOD_RBPBY0, IF_REAL , "Body resistance RBPBY scaling"), -IOP( "rbpbyl", BSIM4v5_MOD_RBPBYL, IF_REAL , "Body resistance RBPBY L scaling"), -IOP( "rbpbyw", BSIM4v5_MOD_RBPBYW, IF_REAL , "Body resistance RBPBY W scaling"), -IOP( "rbpbynf", BSIM4v5_MOD_RBPBYNF, IF_REAL , "Body resistance RBPBY NF scaling"), - -IOP( "rbsbx0", BSIM4v5_MOD_RBSBX0, IF_REAL , "Body resistance RBSBX scaling"), -IOP( "rbsby0", BSIM4v5_MOD_RBSBY0, IF_REAL , "Body resistance RBSBY scaling"), -IOP( "rbdbx0", BSIM4v5_MOD_RBDBX0, IF_REAL , "Body resistance RBDBX scaling"), -IOP( "rbdby0", BSIM4v5_MOD_RBDBY0, IF_REAL , "Body resistance RBDBY scaling"), - -IOP( "rbsdbxl", BSIM4v5_MOD_RBSDBXL, IF_REAL , "Body resistance RBSDBX L scaling"), -IOP( "rbsdbxw", BSIM4v5_MOD_RBSDBXW, IF_REAL , "Body resistance RBSDBX W scaling"), -IOP( "rbsdbxnf", BSIM4v5_MOD_RBSDBXNF, IF_REAL , "Body resistance RBSDBX NF scaling"), -IOP( "rbsdbyl", BSIM4v5_MOD_RBSDBYL, IF_REAL , "Body resistance RBSDBY L scaling"), -IOP( "rbsdbyw", BSIM4v5_MOD_RBSDBYW, IF_REAL , "Body resistance RBSDBY W scaling"), -IOP( "rbsdbynf", BSIM4v5_MOD_RBSDBYNF, IF_REAL , "Body resistance RBSDBY NF scaling"), - -IOP( "lcdsc", BSIM4v5_MOD_LCDSC, IF_REAL, "Length dependence of cdsc"), -IOP( "lcdscb", BSIM4v5_MOD_LCDSCB, IF_REAL, "Length dependence of cdscb"), -IOP( "lcdscd", BSIM4v5_MOD_LCDSCD, IF_REAL, "Length dependence of cdscd"), -IOP( "lcit", BSIM4v5_MOD_LCIT, IF_REAL, "Length dependence of cit"), -IOP( "lnfactor", BSIM4v5_MOD_LNFACTOR, IF_REAL, "Length dependence of nfactor"), -IOP( "lxj", BSIM4v5_MOD_LXJ, IF_REAL, "Length dependence of xj"), -IOP( "lvsat", BSIM4v5_MOD_LVSAT, IF_REAL, "Length dependence of vsat"), -IOP( "lat", BSIM4v5_MOD_LAT, IF_REAL, "Length dependence of at"), -IOP( "la0", BSIM4v5_MOD_LA0, IF_REAL, "Length dependence of a0"), -IOP( "lags", BSIM4v5_MOD_LAGS, IF_REAL, "Length dependence of ags"), -IOP( "la1", BSIM4v5_MOD_LA1, IF_REAL, "Length dependence of a1"), -IOP( "la2", BSIM4v5_MOD_LA2, IF_REAL, "Length dependence of a2"), -IOP( "lketa", BSIM4v5_MOD_LKETA, IF_REAL, "Length dependence of keta"), -IOP( "lnsub", BSIM4v5_MOD_LNSUB, IF_REAL, "Length dependence of nsub"), -IOP( "lndep", BSIM4v5_MOD_LNDEP, IF_REAL, "Length dependence of ndep"), -IOP( "lnsd", BSIM4v5_MOD_LNSD, IF_REAL, "Length dependence of nsd"), -IOP( "lphin", BSIM4v5_MOD_LPHIN, IF_REAL, "Length dependence of phin"), -IOP( "lngate", BSIM4v5_MOD_LNGATE, IF_REAL, "Length dependence of ngate"), -IOP( "lgamma1", BSIM4v5_MOD_LGAMMA1, IF_REAL, "Length dependence of gamma1"), -IOP( "lgamma2", BSIM4v5_MOD_LGAMMA2, IF_REAL, "Length dependence of gamma2"), -IOP( "lvbx", BSIM4v5_MOD_LVBX, IF_REAL, "Length dependence of vbx"), -IOP( "lvbm", BSIM4v5_MOD_LVBM, IF_REAL, "Length dependence of vbm"), -IOP( "lxt", BSIM4v5_MOD_LXT, IF_REAL, "Length dependence of xt"), -IOP( "lk1", BSIM4v5_MOD_LK1, IF_REAL, "Length dependence of k1"), -IOP( "lkt1", BSIM4v5_MOD_LKT1, IF_REAL, "Length dependence of kt1"), -IOP( "lkt1l", BSIM4v5_MOD_LKT1L, IF_REAL, "Length dependence of kt1l"), -IOP( "lkt2", BSIM4v5_MOD_LKT2, IF_REAL, "Length dependence of kt2"), -IOP( "lk2", BSIM4v5_MOD_LK2, IF_REAL, "Length dependence of k2"), -IOP( "lk3", BSIM4v5_MOD_LK3, IF_REAL, "Length dependence of k3"), -IOP( "lk3b", BSIM4v5_MOD_LK3B, IF_REAL, "Length dependence of k3b"), -IOP( "lw0", BSIM4v5_MOD_LW0, IF_REAL, "Length dependence of w0"), -IOP( "ldvtp0", BSIM4v5_MOD_LDVTP0, IF_REAL, "Length dependence of dvtp0"), -IOP( "ldvtp1", BSIM4v5_MOD_LDVTP1, IF_REAL, "Length dependence of dvtp1"), -IOP( "llpe0", BSIM4v5_MOD_LLPE0, IF_REAL, "Length dependence of lpe0"), -IOP( "llpeb", BSIM4v5_MOD_LLPEB, IF_REAL, "Length dependence of lpeb"), -IOP( "ldvt0", BSIM4v5_MOD_LDVT0, IF_REAL, "Length dependence of dvt0"), -IOP( "ldvt1", BSIM4v5_MOD_LDVT1, IF_REAL, "Length dependence of dvt1"), -IOP( "ldvt2", BSIM4v5_MOD_LDVT2, IF_REAL, "Length dependence of dvt2"), -IOP( "ldvt0w", BSIM4v5_MOD_LDVT0W, IF_REAL, "Length dependence of dvt0w"), -IOP( "ldvt1w", BSIM4v5_MOD_LDVT1W, IF_REAL, "Length dependence of dvt1w"), -IOP( "ldvt2w", BSIM4v5_MOD_LDVT2W, IF_REAL, "Length dependence of dvt2w"), -IOP( "ldrout", BSIM4v5_MOD_LDROUT, IF_REAL, "Length dependence of drout"), -IOP( "ldsub", BSIM4v5_MOD_LDSUB, IF_REAL, "Length dependence of dsub"), -IOP( "lvth0", BSIM4v5_MOD_LVTH0, IF_REAL,"Length dependence of vth0"), -IOPR("lvtho", BSIM4v5_MOD_LVTH0, IF_REAL,"Length dependence of vtho"), -IOP( "lua", BSIM4v5_MOD_LUA, IF_REAL, "Length dependence of ua"), -IOP( "lua1", BSIM4v5_MOD_LUA1, IF_REAL, "Length dependence of ua1"), -IOP( "lub", BSIM4v5_MOD_LUB, IF_REAL, "Length dependence of ub"), -IOP( "lub1", BSIM4v5_MOD_LUB1, IF_REAL, "Length dependence of ub1"), -IOP( "luc", BSIM4v5_MOD_LUC, IF_REAL, "Length dependence of uc"), -IOP( "luc1", BSIM4v5_MOD_LUC1, IF_REAL, "Length dependence of uc1"), -IOP( "lud", BSIM4v5_MOD_LUD, IF_REAL, "Length dependence of ud"), -IOP( "lud1", BSIM4v5_MOD_LUD1, IF_REAL, "Length dependence of ud1"), -IOP( "lup", BSIM4v5_MOD_LUP, IF_REAL, "Length dependence of up"), -IOP( "llp", BSIM4v5_MOD_LLP, IF_REAL, "Length dependence of lp"), -IOP( "lu0", BSIM4v5_MOD_LU0, IF_REAL, "Length dependence of u0"), -IOP( "lute", BSIM4v5_MOD_LUTE, IF_REAL, "Length dependence of ute"), -IOP( "lvoff", BSIM4v5_MOD_LVOFF, IF_REAL, "Length dependence of voff"), -IOP( "lminv", BSIM4v5_MOD_LMINV, IF_REAL, "Length dependence of minv"), -IOP( "ldelta", BSIM4v5_MOD_LDELTA, IF_REAL, "Length dependence of delta"), -IOP( "lrdsw", BSIM4v5_MOD_LRDSW, IF_REAL, "Length dependence of rdsw "), -IOP( "lrsw", BSIM4v5_MOD_LRSW, IF_REAL, "Length dependence of rsw"), -IOP( "lrdw", BSIM4v5_MOD_LRDW, IF_REAL, "Length dependence of rdw"), - -IOP( "lprwg", BSIM4v5_MOD_LPRWG, IF_REAL, "Length dependence of prwg "), -IOP( "lprwb", BSIM4v5_MOD_LPRWB, IF_REAL, "Length dependence of prwb "), - -IOP( "lprt", BSIM4v5_MOD_LPRT, IF_REAL, "Length dependence of prt "), -IOP( "leta0", BSIM4v5_MOD_LETA0, IF_REAL, "Length dependence of eta0"), -IOP( "letab", BSIM4v5_MOD_LETAB, IF_REAL, "Length dependence of etab"), -IOP( "lpclm", BSIM4v5_MOD_LPCLM, IF_REAL, "Length dependence of pclm"), -IOP( "lpdiblc1", BSIM4v5_MOD_LPDIBL1, IF_REAL, "Length dependence of pdiblc1"), -IOP( "lpdiblc2", BSIM4v5_MOD_LPDIBL2, IF_REAL, "Length dependence of pdiblc2"), -IOP( "lpdiblcb", BSIM4v5_MOD_LPDIBLB, IF_REAL, "Length dependence of pdiblcb"), -IOP( "lfprout", BSIM4v5_MOD_LFPROUT, IF_REAL, "Length dependence of pdiblcb"), -IOP( "lpdits", BSIM4v5_MOD_LPDITS, IF_REAL, "Length dependence of pdits"), -IOP( "lpditsd", BSIM4v5_MOD_LPDITSD, IF_REAL, "Length dependence of pditsd"), -IOP( "lpscbe1", BSIM4v5_MOD_LPSCBE1, IF_REAL, "Length dependence of pscbe1"), -IOP( "lpscbe2", BSIM4v5_MOD_LPSCBE2, IF_REAL, "Length dependence of pscbe2"), -IOP( "lpvag", BSIM4v5_MOD_LPVAG, IF_REAL, "Length dependence of pvag"), -IOP( "lwr", BSIM4v5_MOD_LWR, IF_REAL, "Length dependence of wr"), -IOP( "ldwg", BSIM4v5_MOD_LDWG, IF_REAL, "Length dependence of dwg"), -IOP( "ldwb", BSIM4v5_MOD_LDWB, IF_REAL, "Length dependence of dwb"), -IOP( "lb0", BSIM4v5_MOD_LB0, IF_REAL, "Length dependence of b0"), -IOP( "lb1", BSIM4v5_MOD_LB1, IF_REAL, "Length dependence of b1"), -IOP( "lcgsl", BSIM4v5_MOD_LCGSL, IF_REAL, "Length dependence of cgsl"), -IOP( "lcgdl", BSIM4v5_MOD_LCGDL, IF_REAL, "Length dependence of cgdl"), -IOP( "lckappas", BSIM4v5_MOD_LCKAPPAS, IF_REAL, "Length dependence of ckappas"), -IOP( "lckappad", BSIM4v5_MOD_LCKAPPAD, IF_REAL, "Length dependence of ckappad"), -IOP( "lcf", BSIM4v5_MOD_LCF, IF_REAL, "Length dependence of cf"), -IOP( "lclc", BSIM4v5_MOD_LCLC, IF_REAL, "Length dependence of clc"), -IOP( "lcle", BSIM4v5_MOD_LCLE, IF_REAL, "Length dependence of cle"), -IOP( "lalpha0", BSIM4v5_MOD_LALPHA0, IF_REAL, "Length dependence of alpha0"), -IOP( "lalpha1", BSIM4v5_MOD_LALPHA1, IF_REAL, "Length dependence of alpha1"), -IOP( "lbeta0", BSIM4v5_MOD_LBETA0, IF_REAL, "Length dependence of beta0"), - -IOP( "lagidl", BSIM4v5_MOD_LAGIDL, IF_REAL, "Length dependence of agidl"), -IOP( "lbgidl", BSIM4v5_MOD_LBGIDL, IF_REAL, "Length dependence of bgidl"), -IOP( "lcgidl", BSIM4v5_MOD_LCGIDL, IF_REAL, "Length dependence of cgidl"), -IOP( "legidl", BSIM4v5_MOD_LEGIDL, IF_REAL, "Length dependence of egidl"), -IOP( "laigc", BSIM4v5_MOD_LAIGC, IF_REAL, "Length dependence of aigc"), -IOP( "lbigc", BSIM4v5_MOD_LBIGC, IF_REAL, "Length dependence of bigc"), -IOP( "lcigc", BSIM4v5_MOD_LCIGC, IF_REAL, "Length dependence of cigc"), -IOP( "laigsd", BSIM4v5_MOD_LAIGSD, IF_REAL, "Length dependence of aigsd"), -IOP( "lbigsd", BSIM4v5_MOD_LBIGSD, IF_REAL, "Length dependence of bigsd"), -IOP( "lcigsd", BSIM4v5_MOD_LCIGSD, IF_REAL, "Length dependence of cigsd"), -IOP( "laigbacc", BSIM4v5_MOD_LAIGBACC, IF_REAL, "Length dependence of aigbacc"), -IOP( "lbigbacc", BSIM4v5_MOD_LBIGBACC, IF_REAL, "Length dependence of bigbacc"), -IOP( "lcigbacc", BSIM4v5_MOD_LCIGBACC, IF_REAL, "Length dependence of cigbacc"), -IOP( "laigbinv", BSIM4v5_MOD_LAIGBINV, IF_REAL, "Length dependence of aigbinv"), -IOP( "lbigbinv", BSIM4v5_MOD_LBIGBINV, IF_REAL, "Length dependence of bigbinv"), -IOP( "lcigbinv", BSIM4v5_MOD_LCIGBINV, IF_REAL, "Length dependence of cigbinv"), -IOP( "lnigc", BSIM4v5_MOD_LNIGC, IF_REAL, "Length dependence of nigc"), -IOP( "lnigbinv", BSIM4v5_MOD_LNIGBINV, IF_REAL, "Length dependence of nigbinv"), -IOP( "lnigbacc", BSIM4v5_MOD_LNIGBACC, IF_REAL, "Length dependence of nigbacc"), -IOP( "lntox", BSIM4v5_MOD_LNTOX, IF_REAL, "Length dependence of ntox"), -IOP( "leigbinv", BSIM4v5_MOD_LEIGBINV, IF_REAL, "Length dependence for eigbinv"), -IOP( "lpigcd", BSIM4v5_MOD_LPIGCD, IF_REAL, "Length dependence for pigcd"), -IOP( "lpoxedge", BSIM4v5_MOD_LPOXEDGE, IF_REAL, "Length dependence for poxedge"), - -IOP( "lvfbcv", BSIM4v5_MOD_LVFBCV, IF_REAL, "Length dependence of vfbcv"), -IOP( "lvfb", BSIM4v5_MOD_LVFB, IF_REAL, "Length dependence of vfb"), -IOP( "lacde", BSIM4v5_MOD_LACDE, IF_REAL, "Length dependence of acde"), -IOP( "lmoin", BSIM4v5_MOD_LMOIN, IF_REAL, "Length dependence of moin"), -IOP( "lnoff", BSIM4v5_MOD_LNOFF, IF_REAL, "Length dependence of noff"), -IOP( "lvoffcv", BSIM4v5_MOD_LVOFFCV, IF_REAL, "Length dependence of voffcv"), -IOP( "lxrcrg1", BSIM4v5_MOD_LXRCRG1, IF_REAL, "Length dependence of xrcrg1"), -IOP( "lxrcrg2", BSIM4v5_MOD_LXRCRG2, IF_REAL, "Length dependence of xrcrg2"), -IOP( "llambda", BSIM4v5_MOD_LLAMBDA, IF_REAL, "Length dependence of lambda"), -IOP( "lvtl", BSIM4v5_MOD_LVTL, IF_REAL, " Length dependence of vtl"), -IOP( "lxn", BSIM4v5_MOD_LXN, IF_REAL, " Length dependence of xn"), -IOP( "leu", BSIM4v5_MOD_LEU, IF_REAL, " Length dependence of eu"), -IOP( "lvfbsdoff", BSIM4v5_MOD_LVFBSDOFF, IF_REAL, "Length dependence of vfbsdoff"), -IOP( "ltvfbsdoff", BSIM4v5_MOD_LTVFBSDOFF, IF_REAL, "Length dependence of tvfbsdoff"), -IOP( "ltvoff", BSIM4v5_MOD_LTVOFF, IF_REAL, "Length dependence of tvoff"), - -IOP( "wcdsc", BSIM4v5_MOD_WCDSC, IF_REAL, "Width dependence of cdsc"), -IOP( "wcdscb", BSIM4v5_MOD_WCDSCB, IF_REAL, "Width dependence of cdscb"), -IOP( "wcdscd", BSIM4v5_MOD_WCDSCD, IF_REAL, "Width dependence of cdscd"), -IOP( "wcit", BSIM4v5_MOD_WCIT, IF_REAL, "Width dependence of cit"), -IOP( "wnfactor", BSIM4v5_MOD_WNFACTOR, IF_REAL, "Width dependence of nfactor"), -IOP( "wxj", BSIM4v5_MOD_WXJ, IF_REAL, "Width dependence of xj"), -IOP( "wvsat", BSIM4v5_MOD_WVSAT, IF_REAL, "Width dependence of vsat"), -IOP( "wat", BSIM4v5_MOD_WAT, IF_REAL, "Width dependence of at"), -IOP( "wa0", BSIM4v5_MOD_WA0, IF_REAL, "Width dependence of a0"), -IOP( "wags", BSIM4v5_MOD_WAGS, IF_REAL, "Width dependence of ags"), -IOP( "wa1", BSIM4v5_MOD_WA1, IF_REAL, "Width dependence of a1"), -IOP( "wa2", BSIM4v5_MOD_WA2, IF_REAL, "Width dependence of a2"), -IOP( "wketa", BSIM4v5_MOD_WKETA, IF_REAL, "Width dependence of keta"), -IOP( "wnsub", BSIM4v5_MOD_WNSUB, IF_REAL, "Width dependence of nsub"), -IOP( "wndep", BSIM4v5_MOD_WNDEP, IF_REAL, "Width dependence of ndep"), -IOP( "wnsd", BSIM4v5_MOD_WNSD, IF_REAL, "Width dependence of nsd"), -IOP( "wphin", BSIM4v5_MOD_WPHIN, IF_REAL, "Width dependence of phin"), -IOP( "wngate", BSIM4v5_MOD_WNGATE, IF_REAL, "Width dependence of ngate"), -IOP( "wgamma1", BSIM4v5_MOD_WGAMMA1, IF_REAL, "Width dependence of gamma1"), -IOP( "wgamma2", BSIM4v5_MOD_WGAMMA2, IF_REAL, "Width dependence of gamma2"), -IOP( "wvbx", BSIM4v5_MOD_WVBX, IF_REAL, "Width dependence of vbx"), -IOP( "wvbm", BSIM4v5_MOD_WVBM, IF_REAL, "Width dependence of vbm"), -IOP( "wxt", BSIM4v5_MOD_WXT, IF_REAL, "Width dependence of xt"), -IOP( "wk1", BSIM4v5_MOD_WK1, IF_REAL, "Width dependence of k1"), -IOP( "wkt1", BSIM4v5_MOD_WKT1, IF_REAL, "Width dependence of kt1"), -IOP( "wkt1l", BSIM4v5_MOD_WKT1L, IF_REAL, "Width dependence of kt1l"), -IOP( "wkt2", BSIM4v5_MOD_WKT2, IF_REAL, "Width dependence of kt2"), -IOP( "wk2", BSIM4v5_MOD_WK2, IF_REAL, "Width dependence of k2"), -IOP( "wk3", BSIM4v5_MOD_WK3, IF_REAL, "Width dependence of k3"), -IOP( "wk3b", BSIM4v5_MOD_WK3B, IF_REAL, "Width dependence of k3b"), -IOP( "ww0", BSIM4v5_MOD_WW0, IF_REAL, "Width dependence of w0"), -IOP( "wdvtp0", BSIM4v5_MOD_WDVTP0, IF_REAL, "Width dependence of dvtp0"), -IOP( "wdvtp1", BSIM4v5_MOD_WDVTP1, IF_REAL, "Width dependence of dvtp1"), -IOP( "wlpe0", BSIM4v5_MOD_WLPE0, IF_REAL, "Width dependence of lpe0"), -IOP( "wlpeb", BSIM4v5_MOD_WLPEB, IF_REAL, "Width dependence of lpeb"), -IOP( "wdvt0", BSIM4v5_MOD_WDVT0, IF_REAL, "Width dependence of dvt0"), -IOP( "wdvt1", BSIM4v5_MOD_WDVT1, IF_REAL, "Width dependence of dvt1"), -IOP( "wdvt2", BSIM4v5_MOD_WDVT2, IF_REAL, "Width dependence of dvt2"), -IOP( "wdvt0w", BSIM4v5_MOD_WDVT0W, IF_REAL, "Width dependence of dvt0w"), -IOP( "wdvt1w", BSIM4v5_MOD_WDVT1W, IF_REAL, "Width dependence of dvt1w"), -IOP( "wdvt2w", BSIM4v5_MOD_WDVT2W, IF_REAL, "Width dependence of dvt2w"), -IOP( "wdrout", BSIM4v5_MOD_WDROUT, IF_REAL, "Width dependence of drout"), -IOP( "wdsub", BSIM4v5_MOD_WDSUB, IF_REAL, "Width dependence of dsub"), -IOP( "wvth0", BSIM4v5_MOD_WVTH0, IF_REAL,"Width dependence of vth0"), -IOPR("wvtho", BSIM4v5_MOD_WVTH0, IF_REAL,"Width dependence of vtho"), -IOP( "wua", BSIM4v5_MOD_WUA, IF_REAL, "Width dependence of ua"), -IOP( "wua1", BSIM4v5_MOD_WUA1, IF_REAL, "Width dependence of ua1"), -IOP( "wub", BSIM4v5_MOD_WUB, IF_REAL, "Width dependence of ub"), -IOP( "wub1", BSIM4v5_MOD_WUB1, IF_REAL, "Width dependence of ub1"), -IOP( "wuc", BSIM4v5_MOD_WUC, IF_REAL, "Width dependence of uc"), -IOP( "wuc1", BSIM4v5_MOD_WUC1, IF_REAL, "Width dependence of uc1"), -IOP( "wud", BSIM4v5_MOD_WUD, IF_REAL, "Width dependence of ud"), -IOP( "wud1", BSIM4v5_MOD_WUD1, IF_REAL, "Width dependence of ud1"), -IOP( "wup", BSIM4v5_MOD_WUP, IF_REAL, "Width dependence of up"), -IOP( "wlp", BSIM4v5_MOD_WLP, IF_REAL, "Width dependence of lp"), -IOP( "wu0", BSIM4v5_MOD_WU0, IF_REAL, "Width dependence of u0"), -IOP( "wute", BSIM4v5_MOD_WUTE, IF_REAL, "Width dependence of ute"), -IOP( "wvoff", BSIM4v5_MOD_WVOFF, IF_REAL, "Width dependence of voff"), -IOP( "wminv", BSIM4v5_MOD_WMINV, IF_REAL, "Width dependence of minv"), -IOP( "wdelta", BSIM4v5_MOD_WDELTA, IF_REAL, "Width dependence of delta"), -IOP( "wrdsw", BSIM4v5_MOD_WRDSW, IF_REAL, "Width dependence of rdsw "), -IOP( "wrsw", BSIM4v5_MOD_WRSW, IF_REAL, "Width dependence of rsw"), -IOP( "wrdw", BSIM4v5_MOD_WRDW, IF_REAL, "Width dependence of rdw"), - -IOP( "wprwg", BSIM4v5_MOD_WPRWG, IF_REAL, "Width dependence of prwg "), -IOP( "wprwb", BSIM4v5_MOD_WPRWB, IF_REAL, "Width dependence of prwb "), - -IOP( "wprt", BSIM4v5_MOD_WPRT, IF_REAL, "Width dependence of prt"), -IOP( "weta0", BSIM4v5_MOD_WETA0, IF_REAL, "Width dependence of eta0"), -IOP( "wetab", BSIM4v5_MOD_WETAB, IF_REAL, "Width dependence of etab"), -IOP( "wpclm", BSIM4v5_MOD_WPCLM, IF_REAL, "Width dependence of pclm"), -IOP( "wpdiblc1", BSIM4v5_MOD_WPDIBL1, IF_REAL, "Width dependence of pdiblc1"), -IOP( "wpdiblc2", BSIM4v5_MOD_WPDIBL2, IF_REAL, "Width dependence of pdiblc2"), -IOP( "wpdiblcb", BSIM4v5_MOD_WPDIBLB, IF_REAL, "Width dependence of pdiblcb"), -IOP( "wfprout", BSIM4v5_MOD_WFPROUT, IF_REAL, "Width dependence of pdiblcb"), -IOP( "wpdits", BSIM4v5_MOD_WPDITS, IF_REAL, "Width dependence of pdits"), -IOP( "wpditsd", BSIM4v5_MOD_WPDITSD, IF_REAL, "Width dependence of pditsd"), -IOP( "wpscbe1", BSIM4v5_MOD_WPSCBE1, IF_REAL, "Width dependence of pscbe1"), -IOP( "wpscbe2", BSIM4v5_MOD_WPSCBE2, IF_REAL, "Width dependence of pscbe2"), -IOP( "wpvag", BSIM4v5_MOD_WPVAG, IF_REAL, "Width dependence of pvag"), -IOP( "wwr", BSIM4v5_MOD_WWR, IF_REAL, "Width dependence of wr"), -IOP( "wdwg", BSIM4v5_MOD_WDWG, IF_REAL, "Width dependence of dwg"), -IOP( "wdwb", BSIM4v5_MOD_WDWB, IF_REAL, "Width dependence of dwb"), -IOP( "wb0", BSIM4v5_MOD_WB0, IF_REAL, "Width dependence of b0"), -IOP( "wb1", BSIM4v5_MOD_WB1, IF_REAL, "Width dependence of b1"), -IOP( "wcgsl", BSIM4v5_MOD_WCGSL, IF_REAL, "Width dependence of cgsl"), -IOP( "wcgdl", BSIM4v5_MOD_WCGDL, IF_REAL, "Width dependence of cgdl"), -IOP( "wckappas", BSIM4v5_MOD_WCKAPPAS, IF_REAL, "Width dependence of ckappas"), -IOP( "wckappad", BSIM4v5_MOD_WCKAPPAD, IF_REAL, "Width dependence of ckappad"), -IOP( "wcf", BSIM4v5_MOD_WCF, IF_REAL, "Width dependence of cf"), -IOP( "wclc", BSIM4v5_MOD_WCLC, IF_REAL, "Width dependence of clc"), -IOP( "wcle", BSIM4v5_MOD_WCLE, IF_REAL, "Width dependence of cle"), -IOP( "walpha0", BSIM4v5_MOD_WALPHA0, IF_REAL, "Width dependence of alpha0"), -IOP( "walpha1", BSIM4v5_MOD_WALPHA1, IF_REAL, "Width dependence of alpha1"), -IOP( "wbeta0", BSIM4v5_MOD_WBETA0, IF_REAL, "Width dependence of beta0"), - -IOP( "wagidl", BSIM4v5_MOD_WAGIDL, IF_REAL, "Width dependence of agidl"), -IOP( "wbgidl", BSIM4v5_MOD_WBGIDL, IF_REAL, "Width dependence of bgidl"), -IOP( "wcgidl", BSIM4v5_MOD_WCGIDL, IF_REAL, "Width dependence of cgidl"), -IOP( "wegidl", BSIM4v5_MOD_WEGIDL, IF_REAL, "Width dependence of egidl"), -IOP( "waigc", BSIM4v5_MOD_WAIGC, IF_REAL, "Width dependence of aigc"), -IOP( "wbigc", BSIM4v5_MOD_WBIGC, IF_REAL, "Width dependence of bigc"), -IOP( "wcigc", BSIM4v5_MOD_WCIGC, IF_REAL, "Width dependence of cigc"), -IOP( "waigsd", BSIM4v5_MOD_WAIGSD, IF_REAL, "Width dependence of aigsd"), -IOP( "wbigsd", BSIM4v5_MOD_WBIGSD, IF_REAL, "Width dependence of bigsd"), -IOP( "wcigsd", BSIM4v5_MOD_WCIGSD, IF_REAL, "Width dependence of cigsd"), -IOP( "waigbacc", BSIM4v5_MOD_WAIGBACC, IF_REAL, "Width dependence of aigbacc"), -IOP( "wbigbacc", BSIM4v5_MOD_WBIGBACC, IF_REAL, "Width dependence of bigbacc"), -IOP( "wcigbacc", BSIM4v5_MOD_WCIGBACC, IF_REAL, "Width dependence of cigbacc"), -IOP( "waigbinv", BSIM4v5_MOD_WAIGBINV, IF_REAL, "Width dependence of aigbinv"), -IOP( "wbigbinv", BSIM4v5_MOD_WBIGBINV, IF_REAL, "Width dependence of bigbinv"), -IOP( "wcigbinv", BSIM4v5_MOD_WCIGBINV, IF_REAL, "Width dependence of cigbinv"), -IOP( "wnigc", BSIM4v5_MOD_WNIGC, IF_REAL, "Width dependence of nigc"), -IOP( "wnigbinv", BSIM4v5_MOD_WNIGBINV, IF_REAL, "Width dependence of nigbinv"), -IOP( "wnigbacc", BSIM4v5_MOD_WNIGBACC, IF_REAL, "Width dependence of nigbacc"), -IOP( "wntox", BSIM4v5_MOD_WNTOX, IF_REAL, "Width dependence of ntox"), -IOP( "weigbinv", BSIM4v5_MOD_WEIGBINV, IF_REAL, "Width dependence for eigbinv"), -IOP( "wpigcd", BSIM4v5_MOD_WPIGCD, IF_REAL, "Width dependence for pigcd"), -IOP( "wpoxedge", BSIM4v5_MOD_WPOXEDGE, IF_REAL, "Width dependence for poxedge"), -IOP( "wvfbcv", BSIM4v5_MOD_WVFBCV, IF_REAL, "Width dependence of vfbcv"), -IOP( "wvfb", BSIM4v5_MOD_WVFB, IF_REAL, "Width dependence of vfb"), -IOP( "wacde", BSIM4v5_MOD_WACDE, IF_REAL, "Width dependence of acde"), -IOP( "wmoin", BSIM4v5_MOD_WMOIN, IF_REAL, "Width dependence of moin"), -IOP( "wnoff", BSIM4v5_MOD_WNOFF, IF_REAL, "Width dependence of noff"), -IOP( "wvoffcv", BSIM4v5_MOD_WVOFFCV, IF_REAL, "Width dependence of voffcv"), -IOP( "wxrcrg1", BSIM4v5_MOD_WXRCRG1, IF_REAL, "Width dependence of xrcrg1"), -IOP( "wxrcrg2", BSIM4v5_MOD_WXRCRG2, IF_REAL, "Width dependence of xrcrg2"), -IOP( "wlambda", BSIM4v5_MOD_WLAMBDA, IF_REAL, "Width dependence of lambda"), -IOP( "wvtl", BSIM4v5_MOD_WVTL, IF_REAL, "Width dependence of vtl"), -IOP( "wxn", BSIM4v5_MOD_WXN, IF_REAL, "Width dependence of xn"), -IOP( "weu", BSIM4v5_MOD_WEU, IF_REAL, "Width dependence of eu"), -IOP( "wvfbsdoff", BSIM4v5_MOD_WVFBSDOFF, IF_REAL, "Width dependence of vfbsdoff"), -IOP( "wtvfbsdoff", BSIM4v5_MOD_WTVFBSDOFF, IF_REAL, "Width dependence of tvfbsdoff"), -IOP( "wtvoff", BSIM4v5_MOD_WTVOFF, IF_REAL, "Width dependence of tvoff"), - -IOP( "pcdsc", BSIM4v5_MOD_PCDSC, IF_REAL, "Cross-term dependence of cdsc"), -IOP( "pcdscb", BSIM4v5_MOD_PCDSCB, IF_REAL, "Cross-term dependence of cdscb"), -IOP( "pcdscd", BSIM4v5_MOD_PCDSCD, IF_REAL, "Cross-term dependence of cdscd"), -IOP( "pcit", BSIM4v5_MOD_PCIT, IF_REAL, "Cross-term dependence of cit"), -IOP( "pnfactor", BSIM4v5_MOD_PNFACTOR, IF_REAL, "Cross-term dependence of nfactor"), -IOP( "pxj", BSIM4v5_MOD_PXJ, IF_REAL, "Cross-term dependence of xj"), -IOP( "pvsat", BSIM4v5_MOD_PVSAT, IF_REAL, "Cross-term dependence of vsat"), -IOP( "pat", BSIM4v5_MOD_PAT, IF_REAL, "Cross-term dependence of at"), -IOP( "pa0", BSIM4v5_MOD_PA0, IF_REAL, "Cross-term dependence of a0"), -IOP( "pags", BSIM4v5_MOD_PAGS, IF_REAL, "Cross-term dependence of ags"), -IOP( "pa1", BSIM4v5_MOD_PA1, IF_REAL, "Cross-term dependence of a1"), -IOP( "pa2", BSIM4v5_MOD_PA2, IF_REAL, "Cross-term dependence of a2"), -IOP( "pketa", BSIM4v5_MOD_PKETA, IF_REAL, "Cross-term dependence of keta"), -IOP( "pnsub", BSIM4v5_MOD_PNSUB, IF_REAL, "Cross-term dependence of nsub"), -IOP( "pndep", BSIM4v5_MOD_PNDEP, IF_REAL, "Cross-term dependence of ndep"), -IOP( "pnsd", BSIM4v5_MOD_PNSD, IF_REAL, "Cross-term dependence of nsd"), -IOP( "pphin", BSIM4v5_MOD_PPHIN, IF_REAL, "Cross-term dependence of phin"), -IOP( "pngate", BSIM4v5_MOD_PNGATE, IF_REAL, "Cross-term dependence of ngate"), -IOP( "pgamma1", BSIM4v5_MOD_PGAMMA1, IF_REAL, "Cross-term dependence of gamma1"), -IOP( "pgamma2", BSIM4v5_MOD_PGAMMA2, IF_REAL, "Cross-term dependence of gamma2"), -IOP( "pvbx", BSIM4v5_MOD_PVBX, IF_REAL, "Cross-term dependence of vbx"), -IOP( "pvbm", BSIM4v5_MOD_PVBM, IF_REAL, "Cross-term dependence of vbm"), -IOP( "pxt", BSIM4v5_MOD_PXT, IF_REAL, "Cross-term dependence of xt"), -IOP( "pk1", BSIM4v5_MOD_PK1, IF_REAL, "Cross-term dependence of k1"), -IOP( "pkt1", BSIM4v5_MOD_PKT1, IF_REAL, "Cross-term dependence of kt1"), -IOP( "pkt1l", BSIM4v5_MOD_PKT1L, IF_REAL, "Cross-term dependence of kt1l"), -IOP( "pkt2", BSIM4v5_MOD_PKT2, IF_REAL, "Cross-term dependence of kt2"), -IOP( "pk2", BSIM4v5_MOD_PK2, IF_REAL, "Cross-term dependence of k2"), -IOP( "pk3", BSIM4v5_MOD_PK3, IF_REAL, "Cross-term dependence of k3"), -IOP( "pk3b", BSIM4v5_MOD_PK3B, IF_REAL, "Cross-term dependence of k3b"), -IOP( "pw0", BSIM4v5_MOD_PW0, IF_REAL, "Cross-term dependence of w0"), -IOP( "pdvtp0", BSIM4v5_MOD_PDVTP0, IF_REAL, "Cross-term dependence of dvtp0"), -IOP( "pdvtp1", BSIM4v5_MOD_PDVTP1, IF_REAL, "Cross-term dependence of dvtp1"), -IOP( "plpe0", BSIM4v5_MOD_PLPE0, IF_REAL, "Cross-term dependence of lpe0"), -IOP( "plpeb", BSIM4v5_MOD_PLPEB, IF_REAL, "Cross-term dependence of lpeb"), -IOP( "pdvt0", BSIM4v5_MOD_PDVT0, IF_REAL, "Cross-term dependence of dvt0"), -IOP( "pdvt1", BSIM4v5_MOD_PDVT1, IF_REAL, "Cross-term dependence of dvt1"), -IOP( "pdvt2", BSIM4v5_MOD_PDVT2, IF_REAL, "Cross-term dependence of dvt2"), -IOP( "pdvt0w", BSIM4v5_MOD_PDVT0W, IF_REAL, "Cross-term dependence of dvt0w"), -IOP( "pdvt1w", BSIM4v5_MOD_PDVT1W, IF_REAL, "Cross-term dependence of dvt1w"), -IOP( "pdvt2w", BSIM4v5_MOD_PDVT2W, IF_REAL, "Cross-term dependence of dvt2w"), -IOP( "pdrout", BSIM4v5_MOD_PDROUT, IF_REAL, "Cross-term dependence of drout"), -IOP( "pdsub", BSIM4v5_MOD_PDSUB, IF_REAL, "Cross-term dependence of dsub"), -IOP( "pvth0", BSIM4v5_MOD_PVTH0, IF_REAL,"Cross-term dependence of vth0"), -IOPR("pvtho", BSIM4v5_MOD_PVTH0, IF_REAL,"Cross-term dependence of vtho"), -IOP( "pua", BSIM4v5_MOD_PUA, IF_REAL, "Cross-term dependence of ua"), -IOP( "pua1", BSIM4v5_MOD_PUA1, IF_REAL, "Cross-term dependence of ua1"), -IOP( "pub", BSIM4v5_MOD_PUB, IF_REAL, "Cross-term dependence of ub"), -IOP( "pub1", BSIM4v5_MOD_PUB1, IF_REAL, "Cross-term dependence of ub1"), -IOP( "puc", BSIM4v5_MOD_PUC, IF_REAL, "Cross-term dependence of uc"), -IOP( "puc1", BSIM4v5_MOD_PUC1, IF_REAL, "Cross-term dependence of uc1"), -IOP( "pud", BSIM4v5_MOD_PUD, IF_REAL, "Cross-term dependence of ud"), -IOP( "pud1", BSIM4v5_MOD_PUD1, IF_REAL, "Cross-term dependence of ud1"), -IOP( "pup", BSIM4v5_MOD_PUP, IF_REAL, "Cross-term dependence of up"), -IOP( "plp", BSIM4v5_MOD_PLP, IF_REAL, "Cross-term dependence of lp"), -IOP( "pu0", BSIM4v5_MOD_PU0, IF_REAL, "Cross-term dependence of u0"), -IOP( "pute", BSIM4v5_MOD_PUTE, IF_REAL, "Cross-term dependence of ute"), -IOP( "pvoff", BSIM4v5_MOD_PVOFF, IF_REAL, "Cross-term dependence of voff"), -IOP( "pminv", BSIM4v5_MOD_PMINV, IF_REAL, "Cross-term dependence of minv"), -IOP( "pdelta", BSIM4v5_MOD_PDELTA, IF_REAL, "Cross-term dependence of delta"), -IOP( "prdsw", BSIM4v5_MOD_PRDSW, IF_REAL, "Cross-term dependence of rdsw "), -IOP( "prsw", BSIM4v5_MOD_PRSW, IF_REAL, "Cross-term dependence of rsw"), -IOP( "prdw", BSIM4v5_MOD_PRDW, IF_REAL, "Cross-term dependence of rdw"), - -IOP( "pprwg", BSIM4v5_MOD_PPRWG, IF_REAL, "Cross-term dependence of prwg "), -IOP( "pprwb", BSIM4v5_MOD_PPRWB, IF_REAL, "Cross-term dependence of prwb "), - -IOP( "pprt", BSIM4v5_MOD_PPRT, IF_REAL, "Cross-term dependence of prt "), -IOP( "peta0", BSIM4v5_MOD_PETA0, IF_REAL, "Cross-term dependence of eta0"), -IOP( "petab", BSIM4v5_MOD_PETAB, IF_REAL, "Cross-term dependence of etab"), -IOP( "ppclm", BSIM4v5_MOD_PPCLM, IF_REAL, "Cross-term dependence of pclm"), -IOP( "ppdiblc1", BSIM4v5_MOD_PPDIBL1, IF_REAL, "Cross-term dependence of pdiblc1"), -IOP( "ppdiblc2", BSIM4v5_MOD_PPDIBL2, IF_REAL, "Cross-term dependence of pdiblc2"), -IOP( "ppdiblcb", BSIM4v5_MOD_PPDIBLB, IF_REAL, "Cross-term dependence of pdiblcb"), -IOP( "pfprout", BSIM4v5_MOD_PFPROUT, IF_REAL, "Cross-term dependence of pdiblcb"), -IOP( "ppdits", BSIM4v5_MOD_PPDITS, IF_REAL, "Cross-term dependence of pdits"), -IOP( "ppditsd", BSIM4v5_MOD_PPDITSD, IF_REAL, "Cross-term dependence of pditsd"), -IOP( "ppscbe1", BSIM4v5_MOD_PPSCBE1, IF_REAL, "Cross-term dependence of pscbe1"), -IOP( "ppscbe2", BSIM4v5_MOD_PPSCBE2, IF_REAL, "Cross-term dependence of pscbe2"), -IOP( "ppvag", BSIM4v5_MOD_PPVAG, IF_REAL, "Cross-term dependence of pvag"), -IOP( "pwr", BSIM4v5_MOD_PWR, IF_REAL, "Cross-term dependence of wr"), -IOP( "pdwg", BSIM4v5_MOD_PDWG, IF_REAL, "Cross-term dependence of dwg"), -IOP( "pdwb", BSIM4v5_MOD_PDWB, IF_REAL, "Cross-term dependence of dwb"), -IOP( "pb0", BSIM4v5_MOD_PB0, IF_REAL, "Cross-term dependence of b0"), -IOP( "pb1", BSIM4v5_MOD_PB1, IF_REAL, "Cross-term dependence of b1"), -IOP( "pcgsl", BSIM4v5_MOD_PCGSL, IF_REAL, "Cross-term dependence of cgsl"), -IOP( "pcgdl", BSIM4v5_MOD_PCGDL, IF_REAL, "Cross-term dependence of cgdl"), -IOP( "pckappas", BSIM4v5_MOD_PCKAPPAS, IF_REAL, "Cross-term dependence of ckappas"), -IOP( "pckappad", BSIM4v5_MOD_PCKAPPAD, IF_REAL, "Cross-term dependence of ckappad"), -IOP( "pcf", BSIM4v5_MOD_PCF, IF_REAL, "Cross-term dependence of cf"), -IOP( "pclc", BSIM4v5_MOD_PCLC, IF_REAL, "Cross-term dependence of clc"), -IOP( "pcle", BSIM4v5_MOD_PCLE, IF_REAL, "Cross-term dependence of cle"), -IOP( "palpha0", BSIM4v5_MOD_PALPHA0, IF_REAL, "Cross-term dependence of alpha0"), -IOP( "palpha1", BSIM4v5_MOD_PALPHA1, IF_REAL, "Cross-term dependence of alpha1"), -IOP( "pbeta0", BSIM4v5_MOD_PBETA0, IF_REAL, "Cross-term dependence of beta0"), - -IOP( "pagidl", BSIM4v5_MOD_PAGIDL, IF_REAL, "Cross-term dependence of agidl"), -IOP( "pbgidl", BSIM4v5_MOD_PBGIDL, IF_REAL, "Cross-term dependence of bgidl"), -IOP( "pcgidl", BSIM4v5_MOD_PCGIDL, IF_REAL, "Cross-term dependence of cgidl"), -IOP( "pegidl", BSIM4v5_MOD_PEGIDL, IF_REAL, "Cross-term dependence of egidl"), -IOP( "paigc", BSIM4v5_MOD_PAIGC, IF_REAL, "Cross-term dependence of aigc"), -IOP( "pbigc", BSIM4v5_MOD_PBIGC, IF_REAL, "Cross-term dependence of bigc"), -IOP( "pcigc", BSIM4v5_MOD_PCIGC, IF_REAL, "Cross-term dependence of cigc"), -IOP( "paigsd", BSIM4v5_MOD_PAIGSD, IF_REAL, "Cross-term dependence of aigsd"), -IOP( "pbigsd", BSIM4v5_MOD_PBIGSD, IF_REAL, "Cross-term dependence of bigsd"), -IOP( "pcigsd", BSIM4v5_MOD_PCIGSD, IF_REAL, "Cross-term dependence of cigsd"), -IOP( "paigbacc", BSIM4v5_MOD_PAIGBACC, IF_REAL, "Cross-term dependence of aigbacc"), -IOP( "pbigbacc", BSIM4v5_MOD_PBIGBACC, IF_REAL, "Cross-term dependence of bigbacc"), -IOP( "pcigbacc", BSIM4v5_MOD_PCIGBACC, IF_REAL, "Cross-term dependence of cigbacc"), -IOP( "paigbinv", BSIM4v5_MOD_PAIGBINV, IF_REAL, "Cross-term dependence of aigbinv"), -IOP( "pbigbinv", BSIM4v5_MOD_PBIGBINV, IF_REAL, "Cross-term dependence of bigbinv"), -IOP( "pcigbinv", BSIM4v5_MOD_PCIGBINV, IF_REAL, "Cross-term dependence of cigbinv"), -IOP( "pnigc", BSIM4v5_MOD_PNIGC, IF_REAL, "Cross-term dependence of nigc"), -IOP( "pnigbinv", BSIM4v5_MOD_PNIGBINV, IF_REAL, "Cross-term dependence of nigbinv"), -IOP( "pnigbacc", BSIM4v5_MOD_PNIGBACC, IF_REAL, "Cross-term dependence of nigbacc"), -IOP( "pntox", BSIM4v5_MOD_PNTOX, IF_REAL, "Cross-term dependence of ntox"), -IOP( "peigbinv", BSIM4v5_MOD_PEIGBINV, IF_REAL, "Cross-term dependence for eigbinv"), -IOP( "ppigcd", BSIM4v5_MOD_PPIGCD, IF_REAL, "Cross-term dependence for pigcd"), -IOP( "ppoxedge", BSIM4v5_MOD_PPOXEDGE, IF_REAL, "Cross-term dependence for poxedge"), -IOP( "pvfbcv", BSIM4v5_MOD_PVFBCV, IF_REAL, "Cross-term dependence of vfbcv"), -IOP( "pvfb", BSIM4v5_MOD_PVFB, IF_REAL, "Cross-term dependence of vfb"), -IOP( "pacde", BSIM4v5_MOD_PACDE, IF_REAL, "Cross-term dependence of acde"), -IOP( "pmoin", BSIM4v5_MOD_PMOIN, IF_REAL, "Cross-term dependence of moin"), -IOP( "pnoff", BSIM4v5_MOD_PNOFF, IF_REAL, "Cross-term dependence of noff"), -IOP( "pvoffcv", BSIM4v5_MOD_PVOFFCV, IF_REAL, "Cross-term dependence of voffcv"), -IOP( "pxrcrg1", BSIM4v5_MOD_PXRCRG1, IF_REAL, "Cross-term dependence of xrcrg1"), -IOP( "pxrcrg2", BSIM4v5_MOD_PXRCRG2, IF_REAL, "Cross-term dependence of xrcrg2"), -IOP( "plambda", BSIM4v5_MOD_PLAMBDA, IF_REAL, "Cross-term dependence of lambda"), -IOP( "pvtl", BSIM4v5_MOD_PVTL, IF_REAL, "Cross-term dependence of vtl"), -IOP( "pxn", BSIM4v5_MOD_PXN, IF_REAL, "Cross-term dependence of xn"), -IOP( "peu", BSIM4v5_MOD_PEU, IF_REAL, "Cross-term dependence of eu"), -IOP( "pvfbsdoff", BSIM4v5_MOD_PVFBSDOFF, IF_REAL, "Cross-term dependence of vfbsdoff"), -IOP( "ptvfbsdoff", BSIM4v5_MOD_PTVFBSDOFF, IF_REAL, "Cross-term dependence of tvfbsdoff"), -IOP( "ptvoff", BSIM4v5_MOD_PTVOFF, IF_REAL, "Cross-term dependence of tvoff"), - -/* stress effect*/ -IOP( "saref", BSIM4v5_MOD_SAREF, IF_REAL, "Reference distance between OD edge to poly of one side"), -IOP( "sbref", BSIM4v5_MOD_SBREF, IF_REAL, "Reference distance between OD edge to poly of the other side"), -IOP( "wlod", BSIM4v5_MOD_WLOD, IF_REAL, "Width parameter for stress effect"), -IOP( "ku0", BSIM4v5_MOD_KU0, IF_REAL, "Mobility degradation/enhancement coefficient for LOD"), -IOP( "kvsat", BSIM4v5_MOD_KVSAT, IF_REAL, "Saturation velocity degradation/enhancement parameter for LOD"), -IOP( "kvth0", BSIM4v5_MOD_KVTH0, IF_REAL, "Threshold degradation/enhancement parameter for LOD"), -IOP( "tku0", BSIM4v5_MOD_TKU0, IF_REAL, "Temperature coefficient of KU0"), -IOP( "llodku0", BSIM4v5_MOD_LLODKU0, IF_REAL, "Length parameter for u0 LOD effect"), -IOP( "wlodku0", BSIM4v5_MOD_WLODKU0, IF_REAL, "Width parameter for u0 LOD effect"), -IOP( "llodvth", BSIM4v5_MOD_LLODVTH, IF_REAL, "Length parameter for vth LOD effect"), -IOP( "wlodvth", BSIM4v5_MOD_WLODVTH, IF_REAL, "Width parameter for vth LOD effect"), -IOP( "lku0", BSIM4v5_MOD_LKU0, IF_REAL, "Length dependence of ku0"), -IOP( "wku0", BSIM4v5_MOD_WKU0, IF_REAL, "Width dependence of ku0"), -IOP( "pku0", BSIM4v5_MOD_PKU0, IF_REAL, "Cross-term dependence of ku0"), -IOP( "lkvth0", BSIM4v5_MOD_LKVTH0, IF_REAL, "Length dependence of kvth0"), -IOP( "wkvth0", BSIM4v5_MOD_WKVTH0, IF_REAL, "Width dependence of kvth0"), -IOP( "pkvth0", BSIM4v5_MOD_PKVTH0, IF_REAL, "Cross-term dependence of kvth0"), -IOP( "stk2", BSIM4v5_MOD_STK2, IF_REAL, "K2 shift factor related to stress effect on vth"), -IOP( "lodk2", BSIM4v5_MOD_LODK2, IF_REAL, "K2 shift modification factor for stress effect"), -IOP( "steta0", BSIM4v5_MOD_STETA0, IF_REAL, "eta0 shift factor related to stress effect on vth"), -IOP( "lodeta0", BSIM4v5_MOD_LODETA0, IF_REAL, "eta0 shift modification factor for stress effect"), -/* Well Proximity Effect */ -IOP( "web", BSIM4v5_MOD_WEB, IF_REAL, "Coefficient for SCB"), -IOP( "wec", BSIM4v5_MOD_WEC, IF_REAL, "Coefficient for SCC"), -IOP( "kvth0we", BSIM4v5_MOD_KVTH0WE, IF_REAL, "Threshold shift factor for well proximity effect"), -IOP( "k2we", BSIM4v5_MOD_K2WE, IF_REAL, " K2 shift factor for well proximity effect "), -IOP( "ku0we", BSIM4v5_MOD_KU0WE, IF_REAL, " Mobility degradation factor for well proximity effect "), -IOP( "scref", BSIM4v5_MOD_SCREF, IF_REAL, " Reference distance to calculate SCA, SCB and SCC"), -IOP( "wpemod", BSIM4v5_MOD_WPEMOD, IF_REAL, " Flag for WPE model (WPEMOD=1 to activate this model) "), -IOP( "lkvth0we", BSIM4v5_MOD_LKVTH0WE, IF_REAL, "Length dependence of kvth0we"), -IOP( "lk2we", BSIM4v5_MOD_LK2WE, IF_REAL, " Length dependence of k2we "), -IOP( "lku0we", BSIM4v5_MOD_LKU0WE, IF_REAL, " Length dependence of ku0we "), -IOP( "wkvth0we", BSIM4v5_MOD_WKVTH0WE, IF_REAL, "Width dependence of kvth0we"), -IOP( "wk2we", BSIM4v5_MOD_WK2WE, IF_REAL, " Width dependence of k2we "), -IOP( "wku0we", BSIM4v5_MOD_WKU0WE, IF_REAL, " Width dependence of ku0we "), -IOP( "pkvth0we", BSIM4v5_MOD_PKVTH0WE, IF_REAL, "Cross-term dependence of kvth0we"), -IOP( "pk2we", BSIM4v5_MOD_PK2WE, IF_REAL, " Cross-term dependence of k2we "), -IOP( "pku0we", BSIM4v5_MOD_PKU0WE, IF_REAL, " Cross-term dependence of ku0we "), - -IOP( "noia", BSIM4v5_MOD_NOIA, IF_REAL, "Flicker noise parameter"), -IOP( "noib", BSIM4v5_MOD_NOIB, IF_REAL, "Flicker noise parameter"), -IOP( "noic", BSIM4v5_MOD_NOIC, IF_REAL, "Flicker noise parameter"), -IOP( "tnoia", BSIM4v5_MOD_TNOIA, IF_REAL, "Thermal noise parameter"), -IOP( "tnoib", BSIM4v5_MOD_TNOIB, IF_REAL, "Thermal noise parameter"), -IOP( "rnoia", BSIM4v5_MOD_RNOIA, IF_REAL, "Thermal noise coefficient"), -IOP( "rnoib", BSIM4v5_MOD_RNOIB, IF_REAL, "Thermal noise coefficient"), -IOP( "ntnoi", BSIM4v5_MOD_NTNOI, IF_REAL, "Thermal noise parameter"), -IOP( "em", BSIM4v5_MOD_EM, IF_REAL, "Flicker noise parameter"), -IOP( "ef", BSIM4v5_MOD_EF, IF_REAL, "Flicker noise frequency exponent"), -IOP( "af", BSIM4v5_MOD_AF, IF_REAL, "Flicker noise exponent"), -IOP( "kf", BSIM4v5_MOD_KF, IF_REAL, "Flicker noise coefficient"), - -IOP("vgs_max", BSIM4v5_MOD_VGS_MAX, IF_REAL, "maximum voltage G-S branch"), -IOP("vgd_max", BSIM4v5_MOD_VGD_MAX, IF_REAL, "maximum voltage G-D branch"), -IOP("vgb_max", BSIM4v5_MOD_VGB_MAX, IF_REAL, "maximum voltage G-B branch"), -IOP("vds_max", BSIM4v5_MOD_VDS_MAX, IF_REAL, "maximum voltage D-S branch"), -IOP("vbs_max", BSIM4v5_MOD_VBS_MAX, IF_REAL, "maximum voltage B-S branch"), -IOP("vbd_max", BSIM4v5_MOD_VBD_MAX, IF_REAL, "maximum voltage B-D branch"), -IOP("vgsr_max", BSIM4v5_MOD_VGSR_MAX, IF_REAL, "maximum voltage G-S branch"), -IOP("vgdr_max", BSIM4v5_MOD_VGDR_MAX, IF_REAL, "maximum voltage G-D branch"), -IOP("vgbr_max", BSIM4v5_MOD_VGBR_MAX, IF_REAL, "maximum voltage G-B branch"), -IOP("vbsr_max", BSIM4v5_MOD_VBSR_MAX, IF_REAL, "maximum voltage B-S branch"), -IOP("vbdr_max", BSIM4v5_MOD_VBDR_MAX, IF_REAL, "maximum voltage B-D branch"), - -IP( "nmos", BSIM4v5_MOD_NMOS, IF_FLAG, "Flag to indicate NMOS"), -IP( "pmos", BSIM4v5_MOD_PMOS, IF_FLAG, "Flag to indicate PMOS"), -}; - -char *BSIM4v5names[] = { - "Drain", - "Gate", - "Source", - "Bulk", - "Charge" -}; - -int BSIM4v5nSize = NUMELEMS(BSIM4v5names); -int BSIM4v5pTSize = NUMELEMS(BSIM4v5pTable); -int BSIM4v5mPTSize = NUMELEMS(BSIM4v5mPTable); -int BSIM4v5iSize = sizeof(BSIM4v5instance); -int BSIM4v5mSize = sizeof(BSIM4v5model); diff --git a/src/spicelib/devices/bsim4v5/b4v5acld.c b/src/spicelib/devices/bsim4v5/b4v5acld.c deleted file mode 100644 index 190e70b80..000000000 --- a/src/spicelib/devices/bsim4v5/b4v5acld.c +++ /dev/null @@ -1,672 +0,0 @@ -/**** BSIM4.5.0 Released by Xuemei (Jane) Xi 07/29/2005 ****/ - -/********** - * Copyright 2005 Regents of the University of California. All rights reserved. - * File: b4acld.c of BSIM4.5.0. - * Author: 2000 Weidong Liu - * Authors: 2001- Xuemei Xi, Mohan Dunga, Ali Niknejad, Chenming Hu. - * Project Director: Prof. Chenming Hu. - * Modified by Xuemei Xi, 10/05/2001. - **********/ - -#include "ngspice/ngspice.h" -#include "ngspice/cktdefs.h" -#include "bsim4v5def.h" -#include "ngspice/sperror.h" -#include "ngspice/suffix.h" - - -int -BSIM4v5acLoad( -GENmodel *inModel, -CKTcircuit *ckt) -{ -BSIM4v5model *model = (BSIM4v5model*)inModel; -BSIM4v5instance *here; - -double gjbd, gjbs, geltd, gcrg, gcrgg, gcrgd, gcrgs, gcrgb; -double xcbgb, xcbdb, xcbsb, xcbbb; -double xcggbr, xcgdbr, xcgsbr, xcgbbr, xcggbi, xcgdbi, xcgsbi, xcgbbi; -double Cggr, Cgdr, Cgsr, Cgbr, Cggi, Cgdi, Cgsi, Cgbi; -double xcddbr, xcdgbr, xcdsbr, xcdbbr, xcsdbr, xcsgbr, xcssbr, xcsbbr; -double xcddbi, xcdgbi, xcdsbi, xcdbbi, xcsdbi, xcsgbi, xcssbi, xcsbbi; -double xcdbdb, xcsbsb=0.0, xcgmgmb=0.0, xcgmdb=0.0, xcgmsb=0.0, xcdgmb, xcsgmb; -double xcgmbb=0.0, xcbgmb; -double capbd, capbs, omega; -double gstot, gstotd, gstotg, gstots, gstotb, gspr; -double gdtot, gdtotd, gdtotg, gdtots, gdtotb, gdpr; -double gIstotg, gIstotd, gIstots, gIstotb; -double gIdtotg, gIdtotd, gIdtots, gIdtotb; -double gIbtotg, gIbtotd, gIbtots, gIbtotb; -double gIgtotg, gIgtotd, gIgtots, gIgtotb; -double cgso, cgdo, cgbo; -double gbspsp, gbbdp, gbbsp, gbspg, gbspb; -double gbspdp, gbdpdp, gbdpg, gbdpb, gbdpsp; -double T0=0.0, T1, T2, T3; -double Csg, Csd, Css; -double Cdgr, Cddr, Cdsr, Cdbr, Csgr, Csdr, Cssr, Csbr; -double Cdgi, Cddi, Cdsi, Cdbi, Csgi, Csdi, Cssi, Csbi; -double gmr, gmi, gmbsr, gmbsi, gdsr, gdsi; -double FwdSumr, RevSumr, Gmr, Gmbsr; -double FwdSumi, RevSumi, Gmi, Gmbsi; -struct bsim4v5SizeDependParam *pParam; -double ggidld, ggidlg, ggidlb, ggislg, ggislb, ggisls; - -double m; - - omega = ckt->CKTomega; - for (; model != NULL; model = BSIM4v5nextModel(model)) - { for (here = BSIM4v5instances(model); here!= NULL; - here = BSIM4v5nextInstance(here)) - { - pParam = here->pParam; - capbd = here->BSIM4v5capbd; - capbs = here->BSIM4v5capbs; - cgso = here->BSIM4v5cgso; - cgdo = here->BSIM4v5cgdo; - cgbo = pParam->BSIM4v5cgbo; - - Csd = -(here->BSIM4v5cddb + here->BSIM4v5cgdb + here->BSIM4v5cbdb); - Csg = -(here->BSIM4v5cdgb + here->BSIM4v5cggb + here->BSIM4v5cbgb); - Css = -(here->BSIM4v5cdsb + here->BSIM4v5cgsb + here->BSIM4v5cbsb); - - if (here->BSIM4v5acnqsMod) - { T0 = omega * here->BSIM4v5taunet; - T1 = T0 * T0; - T2 = 1.0 / (1.0 + T1); - T3 = T0 * T2; - - gmr = here->BSIM4v5gm * T2; - gmbsr = here->BSIM4v5gmbs * T2; - gdsr = here->BSIM4v5gds * T2; - - gmi = -here->BSIM4v5gm * T3; - gmbsi = -here->BSIM4v5gmbs * T3; - gdsi = -here->BSIM4v5gds * T3; - - Cddr = here->BSIM4v5cddb * T2; - Cdgr = here->BSIM4v5cdgb * T2; - Cdsr = here->BSIM4v5cdsb * T2; - Cdbr = -(Cddr + Cdgr + Cdsr); - - /* WDLiu: Cxyi mulitplied by jomega below, and actually to be of conductance */ - Cddi = here->BSIM4v5cddb * T3 * omega; - Cdgi = here->BSIM4v5cdgb * T3 * omega; - Cdsi = here->BSIM4v5cdsb * T3 * omega; - Cdbi = -(Cddi + Cdgi + Cdsi); - - Csdr = Csd * T2; - Csgr = Csg * T2; - Cssr = Css * T2; - Csbr = -(Csdr + Csgr + Cssr); - - Csdi = Csd * T3 * omega; - Csgi = Csg * T3 * omega; - Cssi = Css * T3 * omega; - Csbi = -(Csdi + Csgi + Cssi); - - Cgdr = -(Cddr + Csdr + here->BSIM4v5cbdb); - Cggr = -(Cdgr + Csgr + here->BSIM4v5cbgb); - Cgsr = -(Cdsr + Cssr + here->BSIM4v5cbsb); - Cgbr = -(Cgdr + Cggr + Cgsr); - - Cgdi = -(Cddi + Csdi); - Cggi = -(Cdgi + Csgi); - Cgsi = -(Cdsi + Cssi); - Cgbi = -(Cgdi + Cggi + Cgsi); - } - else /* QS */ - { gmr = here->BSIM4v5gm; - gmbsr = here->BSIM4v5gmbs; - gdsr = here->BSIM4v5gds; - gmi = gmbsi = gdsi = 0.0; - - Cddr = here->BSIM4v5cddb; - Cdgr = here->BSIM4v5cdgb; - Cdsr = here->BSIM4v5cdsb; - Cdbr = -(Cddr + Cdgr + Cdsr); - Cddi = Cdgi = Cdsi = Cdbi = 0.0; - - Csdr = Csd; - Csgr = Csg; - Cssr = Css; - Csbr = -(Csdr + Csgr + Cssr); - Csdi = Csgi = Cssi = Csbi = 0.0; - - Cgdr = here->BSIM4v5cgdb; - Cggr = here->BSIM4v5cggb; - Cgsr = here->BSIM4v5cgsb; - Cgbr = -(Cgdr + Cggr + Cgsr); - Cgdi = Cggi = Cgsi = Cgbi = 0.0; - } - - - if (here->BSIM4v5mode >= 0) - { Gmr = gmr; - Gmbsr = gmbsr; - FwdSumr = Gmr + Gmbsr; - RevSumr = 0.0; - Gmi = gmi; - Gmbsi = gmbsi; - FwdSumi = Gmi + Gmbsi; - RevSumi = 0.0; - - gbbdp = -(here->BSIM4v5gbds); - gbbsp = here->BSIM4v5gbds + here->BSIM4v5gbgs + here->BSIM4v5gbbs; - gbdpg = here->BSIM4v5gbgs; - gbdpdp = here->BSIM4v5gbds; - gbdpb = here->BSIM4v5gbbs; - gbdpsp = -(gbdpg + gbdpdp + gbdpb); - - gbspdp = 0.0; - gbspg = 0.0; - gbspb = 0.0; - gbspsp = 0.0; - - if (model->BSIM4v5igcMod) - { gIstotg = here->BSIM4v5gIgsg + here->BSIM4v5gIgcsg; - gIstotd = here->BSIM4v5gIgcsd; - gIstots = here->BSIM4v5gIgss + here->BSIM4v5gIgcss; - gIstotb = here->BSIM4v5gIgcsb; - - gIdtotg = here->BSIM4v5gIgdg + here->BSIM4v5gIgcdg; - gIdtotd = here->BSIM4v5gIgdd + here->BSIM4v5gIgcdd; - gIdtots = here->BSIM4v5gIgcds; - gIdtotb = here->BSIM4v5gIgcdb; - } - else - { gIstotg = gIstotd = gIstots = gIstotb = 0.0; - gIdtotg = gIdtotd = gIdtots = gIdtotb = 0.0; - } - - if (model->BSIM4v5igbMod) - { gIbtotg = here->BSIM4v5gIgbg; - gIbtotd = here->BSIM4v5gIgbd; - gIbtots = here->BSIM4v5gIgbs; - gIbtotb = here->BSIM4v5gIgbb; - } - else - gIbtotg = gIbtotd = gIbtots = gIbtotb = 0.0; - - if ((model->BSIM4v5igcMod != 0) || (model->BSIM4v5igbMod != 0)) - { gIgtotg = gIstotg + gIdtotg + gIbtotg; - gIgtotd = gIstotd + gIdtotd + gIbtotd ; - gIgtots = gIstots + gIdtots + gIbtots; - gIgtotb = gIstotb + gIdtotb + gIbtotb; - } - else - gIgtotg = gIgtotd = gIgtots = gIgtotb = 0.0; - - if (here->BSIM4v5rgateMod == 2) - T0 = *(ckt->CKTstates[0] + here->BSIM4v5vges) - - *(ckt->CKTstates[0] + here->BSIM4v5vgs); - else if (here->BSIM4v5rgateMod == 3) - T0 = *(ckt->CKTstates[0] + here->BSIM4v5vgms) - - *(ckt->CKTstates[0] + here->BSIM4v5vgs); - if (here->BSIM4v5rgateMod > 1) - { gcrgd = here->BSIM4v5gcrgd * T0; - gcrgg = here->BSIM4v5gcrgg * T0; - gcrgs = here->BSIM4v5gcrgs * T0; - gcrgb = here->BSIM4v5gcrgb * T0; - gcrgg -= here->BSIM4v5gcrg; - gcrg = here->BSIM4v5gcrg; - } - else - gcrg = gcrgd = gcrgg = gcrgs = gcrgb = 0.0; - - if (here->BSIM4v5rgateMod == 3) - { xcgmgmb = (cgdo + cgso + pParam->BSIM4v5cgbo) * omega; - xcgmdb = -cgdo * omega; - xcgmsb = -cgso * omega; - xcgmbb = -pParam->BSIM4v5cgbo * omega; - - xcdgmb = xcgmdb; - xcsgmb = xcgmsb; - xcbgmb = xcgmbb; - - xcggbr = Cggr * omega; - xcgdbr = Cgdr * omega; - xcgsbr = Cgsr * omega; - xcgbbr = -(xcggbr + xcgdbr + xcgsbr); - - xcdgbr = Cdgr * omega; - xcsgbr = Csgr * omega; - xcbgb = here->BSIM4v5cbgb * omega; - } - else - { xcggbr = (Cggr + cgdo + cgso + pParam->BSIM4v5cgbo ) * omega; - xcgdbr = (Cgdr - cgdo) * omega; - xcgsbr = (Cgsr - cgso) * omega; - xcgbbr = -(xcggbr + xcgdbr + xcgsbr); - - xcdgbr = (Cdgr - cgdo) * omega; - xcsgbr = (Csgr - cgso) * omega; - xcbgb = (here->BSIM4v5cbgb - pParam->BSIM4v5cgbo) * omega; - - xcdgmb = xcsgmb = xcbgmb = 0.0; - } - xcddbr = (Cddr + here->BSIM4v5capbd + cgdo) * omega; - xcdsbr = Cdsr * omega; - xcsdbr = Csdr * omega; - xcssbr = (here->BSIM4v5capbs + cgso + Cssr) * omega; - - if (!here->BSIM4v5rbodyMod) - { xcdbbr = -(xcdgbr + xcddbr + xcdsbr + xcdgmb); - xcsbbr = -(xcsgbr + xcsdbr + xcssbr + xcsgmb); - - xcbdb = (here->BSIM4v5cbdb - here->BSIM4v5capbd) * omega; - xcbsb = (here->BSIM4v5cbsb - here->BSIM4v5capbs) * omega; - xcdbdb = 0.0; - } - else - { xcdbbr = Cdbr * omega; - xcsbbr = -(xcsgbr + xcsdbr + xcssbr + xcsgmb) - + here->BSIM4v5capbs * omega; - - xcbdb = here->BSIM4v5cbdb * omega; - xcbsb = here->BSIM4v5cbsb * omega; - - xcdbdb = -here->BSIM4v5capbd * omega; - xcsbsb = -here->BSIM4v5capbs * omega; - } - xcbbb = -(xcbdb + xcbgb + xcbsb + xcbgmb); - - xcdgbi = Cdgi; - xcsgbi = Csgi; - xcddbi = Cddi; - xcdsbi = Cdsi; - xcsdbi = Csdi; - xcssbi = Cssi; - xcdbbi = Cdbi; - xcsbbi = Csbi; - xcggbi = Cggi; - xcgdbi = Cgdi; - xcgsbi = Cgsi; - xcgbbi = Cgbi; - } - else /* Reverse mode */ - { Gmr = -gmr; - Gmbsr = -gmbsr; - FwdSumr = 0.0; - RevSumr = -(Gmr + Gmbsr); - Gmi = -gmi; - Gmbsi = -gmbsi; - FwdSumi = 0.0; - RevSumi = -(Gmi + Gmbsi); - - gbbsp = -(here->BSIM4v5gbds); - gbbdp = here->BSIM4v5gbds + here->BSIM4v5gbgs + here->BSIM4v5gbbs; - - gbdpg = 0.0; - gbdpsp = 0.0; - gbdpb = 0.0; - gbdpdp = 0.0; - - gbspg = here->BSIM4v5gbgs; - gbspsp = here->BSIM4v5gbds; - gbspb = here->BSIM4v5gbbs; - gbspdp = -(gbspg + gbspsp + gbspb); - - if (model->BSIM4v5igcMod) - { gIstotg = here->BSIM4v5gIgsg + here->BSIM4v5gIgcdg; - gIstotd = here->BSIM4v5gIgcds; - gIstots = here->BSIM4v5gIgss + here->BSIM4v5gIgcdd; - gIstotb = here->BSIM4v5gIgcdb; - - gIdtotg = here->BSIM4v5gIgdg + here->BSIM4v5gIgcsg; - gIdtotd = here->BSIM4v5gIgdd + here->BSIM4v5gIgcss; - gIdtots = here->BSIM4v5gIgcsd; - gIdtotb = here->BSIM4v5gIgcsb; - } - else - { gIstotg = gIstotd = gIstots = gIstotb = 0.0; - gIdtotg = gIdtotd = gIdtots = gIdtotb = 0.0; - } - - if (model->BSIM4v5igbMod) - { gIbtotg = here->BSIM4v5gIgbg; - gIbtotd = here->BSIM4v5gIgbs; - gIbtots = here->BSIM4v5gIgbd; - gIbtotb = here->BSIM4v5gIgbb; - } - else - gIbtotg = gIbtotd = gIbtots = gIbtotb = 0.0; - - if ((model->BSIM4v5igcMod != 0) || (model->BSIM4v5igbMod != 0)) - { gIgtotg = gIstotg + gIdtotg + gIbtotg; - gIgtotd = gIstotd + gIdtotd + gIbtotd ; - gIgtots = gIstots + gIdtots + gIbtots; - gIgtotb = gIstotb + gIdtotb + gIbtotb; - } - else - gIgtotg = gIgtotd = gIgtots = gIgtotb = 0.0; - - if (here->BSIM4v5rgateMod == 2) - T0 = *(ckt->CKTstates[0] + here->BSIM4v5vges) - - *(ckt->CKTstates[0] + here->BSIM4v5vgs); - else if (here->BSIM4v5rgateMod == 3) - T0 = *(ckt->CKTstates[0] + here->BSIM4v5vgms) - - *(ckt->CKTstates[0] + here->BSIM4v5vgs); - if (here->BSIM4v5rgateMod > 1) - { gcrgd = here->BSIM4v5gcrgs * T0; - gcrgg = here->BSIM4v5gcrgg * T0; - gcrgs = here->BSIM4v5gcrgd * T0; - gcrgb = here->BSIM4v5gcrgb * T0; - gcrgg -= here->BSIM4v5gcrg; - gcrg = here->BSIM4v5gcrg; - } - else - gcrg = gcrgd = gcrgg = gcrgs = gcrgb = 0.0; - - if (here->BSIM4v5rgateMod == 3) - { xcgmgmb = (cgdo + cgso + pParam->BSIM4v5cgbo) * omega; - xcgmdb = -cgdo * omega; - xcgmsb = -cgso * omega; - xcgmbb = -pParam->BSIM4v5cgbo * omega; - - xcdgmb = xcgmdb; - xcsgmb = xcgmsb; - xcbgmb = xcgmbb; - - xcggbr = Cggr * omega; - xcgdbr = Cgsr * omega; - xcgsbr = Cgdr * omega; - xcgbbr = -(xcggbr + xcgdbr + xcgsbr); - - xcdgbr = Csgr * omega; - xcsgbr = Cdgr * omega; - xcbgb = here->BSIM4v5cbgb * omega; - } - else - { xcggbr = (Cggr + cgdo + cgso + pParam->BSIM4v5cgbo ) * omega; - xcgdbr = (Cgsr - cgdo) * omega; - xcgsbr = (Cgdr - cgso) * omega; - xcgbbr = -(xcggbr + xcgdbr + xcgsbr); - - xcdgbr = (Csgr - cgdo) * omega; - xcsgbr = (Cdgr - cgso) * omega; - xcbgb = (here->BSIM4v5cbgb - pParam->BSIM4v5cgbo) * omega; - - xcdgmb = xcsgmb = xcbgmb = 0.0; - } - xcddbr = (here->BSIM4v5capbd + cgdo + Cssr) * omega; - xcdsbr = Csdr * omega; - xcsdbr = Cdsr * omega; - xcssbr = (Cddr + here->BSIM4v5capbs + cgso) * omega; - - if (!here->BSIM4v5rbodyMod) - { xcdbbr = -(xcdgbr + xcddbr + xcdsbr + xcdgmb); - xcsbbr = -(xcsgbr + xcsdbr + xcssbr + xcsgmb); - - xcbdb = (here->BSIM4v5cbsb - here->BSIM4v5capbd) * omega; - xcbsb = (here->BSIM4v5cbdb - here->BSIM4v5capbs) * omega; - xcdbdb = 0.0; - } - else - { xcdbbr = -(xcdgbr + xcddbr + xcdsbr + xcdgmb) - + here->BSIM4v5capbd * omega; - xcsbbr = Cdbr * omega; - - xcbdb = here->BSIM4v5cbsb * omega; - xcbsb = here->BSIM4v5cbdb * omega; - xcdbdb = -here->BSIM4v5capbd * omega; - xcsbsb = -here->BSIM4v5capbs * omega; - } - xcbbb = -(xcbgb + xcbdb + xcbsb + xcbgmb); - - xcdgbi = Csgi; - xcsgbi = Cdgi; - xcddbi = Cssi; - xcdsbi = Csdi; - xcsdbi = Cdsi; - xcssbi = Cddi; - xcdbbi = Csbi; - xcsbbi = Cdbi; - xcggbi = Cggi; - xcgdbi = Cgsi; - xcgsbi = Cgdi; - xcgbbi = Cgbi; - } - - if (model->BSIM4v5rdsMod == 1) - { gstot = here->BSIM4v5gstot; - gstotd = here->BSIM4v5gstotd; - gstotg = here->BSIM4v5gstotg; - gstots = here->BSIM4v5gstots - gstot; - gstotb = here->BSIM4v5gstotb; - - gdtot = here->BSIM4v5gdtot; - gdtotd = here->BSIM4v5gdtotd - gdtot; - gdtotg = here->BSIM4v5gdtotg; - gdtots = here->BSIM4v5gdtots; - gdtotb = here->BSIM4v5gdtotb; - } - else - { gstot = gstotd = gstotg = gstots = gstotb = 0.0; - gdtot = gdtotd = gdtotg = gdtots = gdtotb = 0.0; - } - - - /* - * Loading AC matrix - */ - - m = here->BSIM4v5m; - - if (!model->BSIM4v5rdsMod) - { gdpr = here->BSIM4v5drainConductance; - gspr = here->BSIM4v5sourceConductance; - } - else - gdpr = gspr = 0.0; - - if (!here->BSIM4v5rbodyMod) - { gjbd = here->BSIM4v5gbd; - gjbs = here->BSIM4v5gbs; - } - else - gjbd = gjbs = 0.0; - - geltd = here->BSIM4v5grgeltd; - - if (here->BSIM4v5rgateMod == 1) - { *(here->BSIM4v5GEgePtr) += m * geltd; - *(here->BSIM4v5GPgePtr) -= m * geltd; - *(here->BSIM4v5GEgpPtr) -= m * geltd; - - *(here->BSIM4v5GPgpPtr +1) += m * xcggbr; - *(here->BSIM4v5GPgpPtr) += m * (geltd + xcggbi + gIgtotg); - *(here->BSIM4v5GPdpPtr +1) += m * xcgdbr; - *(here->BSIM4v5GPdpPtr) += m * (xcgdbi + gIgtotd); - *(here->BSIM4v5GPspPtr +1) += m * xcgsbr; - *(here->BSIM4v5GPspPtr) += m * (xcgsbi + gIgtots); - *(here->BSIM4v5GPbpPtr +1) += m * xcgbbr; - *(here->BSIM4v5GPbpPtr) += m * (xcgbbi + gIgtotb); - } /* WDLiu: gcrg already subtracted from all gcrgg below */ - else if (here->BSIM4v5rgateMod == 2) - { *(here->BSIM4v5GEgePtr) += m * gcrg; - *(here->BSIM4v5GEgpPtr) += m * gcrgg; - *(here->BSIM4v5GEdpPtr) += m * gcrgd; - *(here->BSIM4v5GEspPtr) += m * gcrgs; - *(here->BSIM4v5GEbpPtr) += m * gcrgb; - - *(here->BSIM4v5GPgePtr) -= m * gcrg; - *(here->BSIM4v5GPgpPtr +1) += m * xcggbr; - *(here->BSIM4v5GPgpPtr) -= m * (gcrgg - xcggbi - gIgtotg); - *(here->BSIM4v5GPdpPtr +1) += m * xcgdbr; - *(here->BSIM4v5GPdpPtr) -= m * (gcrgd - xcgdbi - gIgtotd); - *(here->BSIM4v5GPspPtr +1) += m * xcgsbr; - *(here->BSIM4v5GPspPtr) -= m * (gcrgs - xcgsbi - gIgtots); - *(here->BSIM4v5GPbpPtr +1) += m * xcgbbr; - *(here->BSIM4v5GPbpPtr) -= m * (gcrgb - xcgbbi - gIgtotb); - } - else if (here->BSIM4v5rgateMod == 3) - { *(here->BSIM4v5GEgePtr) += m * geltd; - *(here->BSIM4v5GEgmPtr) -= m * geltd; - *(here->BSIM4v5GMgePtr) -= m * geltd; - *(here->BSIM4v5GMgmPtr) += m * (geltd + gcrg); - *(here->BSIM4v5GMgmPtr +1) += m * xcgmgmb; - - *(here->BSIM4v5GMdpPtr) += m * gcrgd; - *(here->BSIM4v5GMdpPtr +1) += m * xcgmdb; - *(here->BSIM4v5GMgpPtr) += m * gcrgg; - *(here->BSIM4v5GMspPtr) += m * gcrgs; - *(here->BSIM4v5GMspPtr +1) += m * xcgmsb; - *(here->BSIM4v5GMbpPtr) += m * gcrgb; - *(here->BSIM4v5GMbpPtr +1) += m * xcgmbb; - - *(here->BSIM4v5DPgmPtr +1) += m * xcdgmb; - *(here->BSIM4v5GPgmPtr) -= m * gcrg; - *(here->BSIM4v5SPgmPtr +1) += m * xcsgmb; - *(here->BSIM4v5BPgmPtr +1) += m * xcbgmb; - - *(here->BSIM4v5GPgpPtr) -= m * (gcrgg - xcggbi - gIgtotg); - *(here->BSIM4v5GPgpPtr +1) += m * xcggbr; - *(here->BSIM4v5GPdpPtr) -= m * (gcrgd - xcgdbi - gIgtotd); - *(here->BSIM4v5GPdpPtr +1) += m * xcgdbr; - *(here->BSIM4v5GPspPtr) -= m * (gcrgs - xcgsbi - gIgtots); - *(here->BSIM4v5GPspPtr +1) += m * xcgsbr; - *(here->BSIM4v5GPbpPtr) -= m * (gcrgb - xcgbbi - gIgtotb); - *(here->BSIM4v5GPbpPtr +1) += m * xcgbbr; - } - else - { *(here->BSIM4v5GPgpPtr +1) += m * xcggbr; - *(here->BSIM4v5GPgpPtr) += m * (xcggbi + gIgtotg); - *(here->BSIM4v5GPdpPtr +1) += m * xcgdbr; - *(here->BSIM4v5GPdpPtr) += m * (xcgdbi + gIgtotd); - *(here->BSIM4v5GPspPtr +1) += m * xcgsbr; - *(here->BSIM4v5GPspPtr) += m * (xcgsbi + gIgtots); - *(here->BSIM4v5GPbpPtr +1) += m * xcgbbr; - *(here->BSIM4v5GPbpPtr) += m * (xcgbbi + gIgtotb); - } - - if (model->BSIM4v5rdsMod) - { (*(here->BSIM4v5DgpPtr) += m * gdtotg); - (*(here->BSIM4v5DspPtr) += m * gdtots); - (*(here->BSIM4v5DbpPtr) += m * gdtotb); - (*(here->BSIM4v5SdpPtr) += m * gstotd); - (*(here->BSIM4v5SgpPtr) += m * gstotg); - (*(here->BSIM4v5SbpPtr) += m * gstotb); - } - - *(here->BSIM4v5DPdpPtr +1) += m * (xcddbr + gdsi + RevSumi); - *(here->BSIM4v5DPdpPtr) += m * (gdpr + xcddbi + gdsr + here->BSIM4v5gbd - - gdtotd + RevSumr + gbdpdp - gIdtotd); - *(here->BSIM4v5DPdPtr) -= m * (gdpr + gdtot); - *(here->BSIM4v5DPgpPtr +1) += m * (xcdgbr + Gmi); - *(here->BSIM4v5DPgpPtr) += m * (Gmr + xcdgbi - gdtotg + gbdpg - gIdtotg); - *(here->BSIM4v5DPspPtr +1) += m * (xcdsbr - gdsi - FwdSumi); - *(here->BSIM4v5DPspPtr) -= m * (gdsr - xcdsbi + FwdSumr + gdtots - gbdpsp + gIdtots); - *(here->BSIM4v5DPbpPtr +1) += m * (xcdbbr + Gmbsi); - *(here->BSIM4v5DPbpPtr) -= m * (gjbd + gdtotb - xcdbbi - Gmbsr - gbdpb + gIdtotb); - - *(here->BSIM4v5DdpPtr) -= m * (gdpr - gdtotd); - *(here->BSIM4v5DdPtr) += m * (gdpr + gdtot); - - *(here->BSIM4v5SPdpPtr +1) += m * (xcsdbr - gdsi - RevSumi); - *(here->BSIM4v5SPdpPtr) -= m * (gdsr - xcsdbi + gstotd + RevSumr - gbspdp + gIstotd); - *(here->BSIM4v5SPgpPtr +1) += m * (xcsgbr - Gmi); - *(here->BSIM4v5SPgpPtr) -= m * (Gmr - xcsgbi + gstotg - gbspg + gIstotg); - *(here->BSIM4v5SPspPtr +1) += m * (xcssbr + gdsi + FwdSumi); - *(here->BSIM4v5SPspPtr) += m * (gspr + xcssbi + gdsr + here->BSIM4v5gbs - - gstots + FwdSumr + gbspsp - gIstots); - *(here->BSIM4v5SPsPtr) -= m * (gspr + gstot); - *(here->BSIM4v5SPbpPtr +1) += m * (xcsbbr - Gmbsi); - *(here->BSIM4v5SPbpPtr) -= m * (gjbs + gstotb - xcsbbi + Gmbsr - gbspb + gIstotb); - - *(here->BSIM4v5SspPtr) -= m * (gspr - gstots); - *(here->BSIM4v5SsPtr) += m * (gspr + gstot); - - *(here->BSIM4v5BPdpPtr +1) += m * xcbdb; - *(here->BSIM4v5BPdpPtr) -= m * (gjbd - gbbdp + gIbtotd); - *(here->BSIM4v5BPgpPtr +1) += m * xcbgb; - *(here->BSIM4v5BPgpPtr) -= m * (here->BSIM4v5gbgs + gIbtotg); - *(here->BSIM4v5BPspPtr +1) += m * xcbsb; - *(here->BSIM4v5BPspPtr) -= m * (gjbs - gbbsp + gIbtots); - *(here->BSIM4v5BPbpPtr +1) += m * xcbbb; - *(here->BSIM4v5BPbpPtr) += m * (gjbd + gjbs - here->BSIM4v5gbbs - - gIbtotb); - ggidld = here->BSIM4v5ggidld; - ggidlg = here->BSIM4v5ggidlg; - ggidlb = here->BSIM4v5ggidlb; - ggislg = here->BSIM4v5ggislg; - ggisls = here->BSIM4v5ggisls; - ggislb = here->BSIM4v5ggislb; - - /* stamp gidl */ - (*(here->BSIM4v5DPdpPtr) += m * ggidld); - (*(here->BSIM4v5DPgpPtr) += m * ggidlg); - (*(here->BSIM4v5DPspPtr) -= m * ((ggidlg + ggidld) + ggidlb)); - (*(here->BSIM4v5DPbpPtr) += m * ggidlb); - (*(here->BSIM4v5BPdpPtr) -= m * ggidld); - (*(here->BSIM4v5BPgpPtr) -= m * ggidlg); - (*(here->BSIM4v5BPspPtr) += m * ((ggidlg + ggidld) + ggidlb)); - (*(here->BSIM4v5BPbpPtr) -= m * ggidlb); - /* stamp gisl */ - (*(here->BSIM4v5SPdpPtr) -= m * ((ggisls + ggislg) + ggislb)); - (*(here->BSIM4v5SPgpPtr) += m * ggislg); - (*(here->BSIM4v5SPspPtr) += m * ggisls); - (*(here->BSIM4v5SPbpPtr) += m * ggislb); - (*(here->BSIM4v5BPdpPtr) += m * ((ggislg + ggisls) + ggislb)); - (*(here->BSIM4v5BPgpPtr) -= m * ggislg); - (*(here->BSIM4v5BPspPtr) -= m * ggisls); - (*(here->BSIM4v5BPbpPtr) -= m * ggislb); - - if (here->BSIM4v5rbodyMod) - { (*(here->BSIM4v5DPdbPtr +1) += m * xcdbdb); - (*(here->BSIM4v5DPdbPtr) -= m * here->BSIM4v5gbd); - (*(here->BSIM4v5SPsbPtr +1) += m * xcsbsb); - (*(here->BSIM4v5SPsbPtr) -= m * here->BSIM4v5gbs); - - (*(here->BSIM4v5DBdpPtr +1) += m * xcdbdb); - (*(here->BSIM4v5DBdpPtr) -= m * here->BSIM4v5gbd); - (*(here->BSIM4v5DBdbPtr +1) -= m * xcdbdb); - (*(here->BSIM4v5DBdbPtr) += m * (here->BSIM4v5gbd + here->BSIM4v5grbpd - + here->BSIM4v5grbdb)); - (*(here->BSIM4v5DBbpPtr) -= m * here->BSIM4v5grbpd); - (*(here->BSIM4v5DBbPtr) -= m * here->BSIM4v5grbdb); - - (*(here->BSIM4v5BPdbPtr) -= m * here->BSIM4v5grbpd); - (*(here->BSIM4v5BPbPtr) -= m * here->BSIM4v5grbpb); - (*(here->BSIM4v5BPsbPtr) -= m * here->BSIM4v5grbps); - (*(here->BSIM4v5BPbpPtr) += m * (here->BSIM4v5grbpd + here->BSIM4v5grbps - + here->BSIM4v5grbpb)); - /* WDLiu: (-here->BSIM4v5gbbs) already added to BPbpPtr */ - - (*(here->BSIM4v5SBspPtr +1) += m * xcsbsb); - (*(here->BSIM4v5SBspPtr) -= m * here->BSIM4v5gbs); - (*(here->BSIM4v5SBbpPtr) -= m * here->BSIM4v5grbps); - (*(here->BSIM4v5SBbPtr) -= m * here->BSIM4v5grbsb); - (*(here->BSIM4v5SBsbPtr +1) -= m * xcsbsb); - (*(here->BSIM4v5SBsbPtr) += m * (here->BSIM4v5gbs - + here->BSIM4v5grbps + here->BSIM4v5grbsb)); - - (*(here->BSIM4v5BdbPtr) -= m * here->BSIM4v5grbdb); - (*(here->BSIM4v5BbpPtr) -= m * here->BSIM4v5grbpb); - (*(here->BSIM4v5BsbPtr) -= m * here->BSIM4v5grbsb); - (*(here->BSIM4v5BbPtr) += m * (here->BSIM4v5grbsb + here->BSIM4v5grbdb - + here->BSIM4v5grbpb)); - } - - - /* - * WDLiu: The internal charge node generated for transient NQS is not needed for - * AC NQS. The following is not doing a real job, but we have to keep it; - * otherwise a singular AC NQS matrix may occur if the transient NQS is on. - * The charge node is isolated from the instance. - */ - if (here->BSIM4v5trnqsMod) - { (*(here->BSIM4v5QqPtr) += m * 1.0); - (*(here->BSIM4v5QgpPtr) += 0.0); - (*(here->BSIM4v5QdpPtr) += 0.0); - (*(here->BSIM4v5QspPtr) += 0.0); - (*(here->BSIM4v5QbpPtr) += 0.0); - - (*(here->BSIM4v5DPqPtr) += 0.0); - (*(here->BSIM4v5SPqPtr) += 0.0); - (*(here->BSIM4v5GPqPtr) += 0.0); - } - } - } - return(OK); -} diff --git a/src/spicelib/devices/bsim4v5/b4v5ask.c b/src/spicelib/devices/bsim4v5/b4v5ask.c deleted file mode 100644 index 79db3e3c6..000000000 --- a/src/spicelib/devices/bsim4v5/b4v5ask.c +++ /dev/null @@ -1,403 +0,0 @@ -/**** BSIM4.5.0 Released by Xuemei (Jane) Xi 07/27/2005 ****/ - -/********** - * Copyright 2005 Regents of the University of California. All rights reserved. - * File: b4ask.c of BSIM4.5.0. - * Author: 2000 Weidong Liu - * Authors: 2001- Xuemei Xi, Mohan Dunga, Ali Niknejad, Chenming Hu. - * Project Director: Prof. Chenming Hu. - * Modified by Xuemei Xi, 04/06/2001. - * Modified by Xuemei Xi, 10/05/2001. - * Modified by Xuemei Xi, 05/09/2003. - * Modified by Xuemei Xi, Mohan Dunga, 07/29/2005. - **********/ - -#include "ngspice/ngspice.h" -#include "ngspice/ifsim.h" -#include "ngspice/cktdefs.h" -#include "ngspice/devdefs.h" -#include "bsim4v5def.h" -#include "ngspice/sperror.h" -#include "ngspice/suffix.h" - -int -BSIM4v5ask( -CKTcircuit *ckt, -GENinstance *inst, -int which, -IFvalue *value, -IFvalue *select) -{ -BSIM4v5instance *here = (BSIM4v5instance*)inst; - - NG_IGNORE(select); - - switch(which) - { case BSIM4v5_L: - value->rValue = here->BSIM4v5l; - return(OK); - case BSIM4v5_W: - value->rValue = here->BSIM4v5w; - return(OK); - case BSIM4v5_M: - value->rValue = here->BSIM4v5m; - return(OK); - case BSIM4v5_NF: - value->rValue = here->BSIM4v5nf; - return(OK); - case BSIM4v5_MIN: - value->iValue = here->BSIM4v5min; - return(OK); - case BSIM4v5_AS: - value->rValue = here->BSIM4v5sourceArea; - return(OK); - case BSIM4v5_AD: - value->rValue = here->BSIM4v5drainArea; - return(OK); - case BSIM4v5_PS: - value->rValue = here->BSIM4v5sourcePerimeter; - return(OK); - case BSIM4v5_PD: - value->rValue = here->BSIM4v5drainPerimeter; - return(OK); - case BSIM4v5_NRS: - value->rValue = here->BSIM4v5sourceSquares; - return(OK); - case BSIM4v5_NRD: - value->rValue = here->BSIM4v5drainSquares; - return(OK); - case BSIM4v5_OFF: - value->rValue = here->BSIM4v5off; - return(OK); - case BSIM4v5_SA: - value->rValue = here->BSIM4v5sa ; - return(OK); - case BSIM4v5_SB: - value->rValue = here->BSIM4v5sb ; - return(OK); - case BSIM4v5_SD: - value->rValue = here->BSIM4v5sd ; - return(OK); - case BSIM4v5_SCA: - value->rValue = here->BSIM4v5sca ; - return(OK); - case BSIM4v5_SCB: - value->rValue = here->BSIM4v5scb ; - return(OK); - case BSIM4v5_SCC: - value->rValue = here->BSIM4v5scc ; - return(OK); - case BSIM4v5_SC: - value->rValue = here->BSIM4v5sc ; - return(OK); - - case BSIM4v5_RBSB: - value->rValue = here->BSIM4v5rbsb; - return(OK); - case BSIM4v5_RBDB: - value->rValue = here->BSIM4v5rbdb; - return(OK); - case BSIM4v5_RBPB: - value->rValue = here->BSIM4v5rbpb; - return(OK); - case BSIM4v5_RBPS: - value->rValue = here->BSIM4v5rbps; - return(OK); - case BSIM4v5_RBPD: - value->rValue = here->BSIM4v5rbpd; - return(OK); - case BSIM4v5_DELVTO: - value->rValue = here->BSIM4v5delvto; - return(OK); - case BSIM4v5_XGW: - value->rValue = here->BSIM4v5xgw; - return(OK); - case BSIM4v5_NGCON: - value->rValue = here->BSIM4v5ngcon; - return(OK); - case BSIM4v5_TRNQSMOD: - value->iValue = here->BSIM4v5trnqsMod; - return(OK); - case BSIM4v5_ACNQSMOD: - value->iValue = here->BSIM4v5acnqsMod; - return(OK); - case BSIM4v5_RBODYMOD: - value->iValue = here->BSIM4v5rbodyMod; - return(OK); - case BSIM4v5_RGATEMOD: - value->iValue = here->BSIM4v5rgateMod; - return(OK); - case BSIM4v5_GEOMOD: - value->iValue = here->BSIM4v5geoMod; - return(OK); - case BSIM4v5_RGEOMOD: - value->iValue = here->BSIM4v5rgeoMod; - return(OK); - case BSIM4v5_IC_VDS: - value->rValue = here->BSIM4v5icVDS; - return(OK); - case BSIM4v5_IC_VGS: - value->rValue = here->BSIM4v5icVGS; - return(OK); - case BSIM4v5_IC_VBS: - value->rValue = here->BSIM4v5icVBS; - return(OK); - case BSIM4v5_DNODE: - value->iValue = here->BSIM4v5dNode; - return(OK); - case BSIM4v5_GNODEEXT: - value->iValue = here->BSIM4v5gNodeExt; - return(OK); - case BSIM4v5_SNODE: - value->iValue = here->BSIM4v5sNode; - return(OK); - case BSIM4v5_BNODE: - value->iValue = here->BSIM4v5bNode; - return(OK); - case BSIM4v5_DNODEPRIME: - value->iValue = here->BSIM4v5dNodePrime; - return(OK); - case BSIM4v5_GNODEPRIME: - value->iValue = here->BSIM4v5gNodePrime; - return(OK); - case BSIM4v5_GNODEMID: - value->iValue = here->BSIM4v5gNodeMid; - return(OK); - case BSIM4v5_SNODEPRIME: - value->iValue = here->BSIM4v5sNodePrime; - return(OK); - case BSIM4v5_DBNODE: - value->iValue = here->BSIM4v5dbNode; - return(OK); - case BSIM4v5_BNODEPRIME: - value->iValue = here->BSIM4v5bNodePrime; - return(OK); - case BSIM4v5_SBNODE: - value->iValue = here->BSIM4v5sbNode; - return(OK); - case BSIM4v5_SOURCECONDUCT: - value->rValue = here->BSIM4v5sourceConductance; - value->rValue *= here->BSIM4v5m; - return(OK); - case BSIM4v5_DRAINCONDUCT: - value->rValue = here->BSIM4v5drainConductance; - value->rValue *= here->BSIM4v5m; - return(OK); - case BSIM4v5_VBD: - value->rValue = *(ckt->CKTstate0 + here->BSIM4v5vbd); - return(OK); - case BSIM4v5_VBS: - value->rValue = *(ckt->CKTstate0 + here->BSIM4v5vbs); - return(OK); - case BSIM4v5_VGS: - value->rValue = *(ckt->CKTstate0 + here->BSIM4v5vgs); - return(OK); - case BSIM4v5_VDS: - value->rValue = *(ckt->CKTstate0 + here->BSIM4v5vds); - return(OK); - case BSIM4v5_CD: - value->rValue = here->BSIM4v5cd; - value->rValue *= here->BSIM4v5m; - return(OK); - case BSIM4v5_CBS: - value->rValue = here->BSIM4v5cbs; - value->rValue *= here->BSIM4v5m; - return(OK); - case BSIM4v5_CBD: - value->rValue = here->BSIM4v5cbd; - value->rValue *= here->BSIM4v5m; - return(OK); - case BSIM4v5_CSUB: - value->rValue = here->BSIM4v5csub; - value->rValue *= here->BSIM4v5m; - return(OK); - case BSIM4v5_QINV: - value->rValue = here-> BSIM4v5qinv; - value->rValue *= here->BSIM4v5m; - return(OK); - case BSIM4v5_IGIDL: - value->rValue = here->BSIM4v5Igidl; - value->rValue *= here->BSIM4v5m; - return(OK); - case BSIM4v5_IGISL: - value->rValue = here->BSIM4v5Igisl; - value->rValue *= here->BSIM4v5m; - return(OK); - case BSIM4v5_IGS: - value->rValue = here->BSIM4v5Igs; - value->rValue *= here->BSIM4v5m; - return(OK); - case BSIM4v5_IGD: - value->rValue = here->BSIM4v5Igd; - value->rValue *= here->BSIM4v5m; - return(OK); - case BSIM4v5_IGB: - value->rValue = here->BSIM4v5Igb; - value->rValue *= here->BSIM4v5m; - return(OK); - case BSIM4v5_IGCS: - value->rValue = here->BSIM4v5Igcs; - value->rValue *= here->BSIM4v5m; - return(OK); - case BSIM4v5_IGCD: - value->rValue = here->BSIM4v5Igcd; - value->rValue *= here->BSIM4v5m; - return(OK); - case BSIM4v5_GM: - value->rValue = here->BSIM4v5gm; - value->rValue *= here->BSIM4v5m; - return(OK); - case BSIM4v5_GDS: - value->rValue = here->BSIM4v5gds; - value->rValue *= here->BSIM4v5m; - return(OK); - case BSIM4v5_GMBS: - value->rValue = here->BSIM4v5gmbs; - value->rValue *= here->BSIM4v5m; - return(OK); - case BSIM4v5_GBD: - value->rValue = here->BSIM4v5gbd; - value->rValue *= here->BSIM4v5m; - return(OK); - case BSIM4v5_GBS: - value->rValue = here->BSIM4v5gbs; - value->rValue *= here->BSIM4v5m; - return(OK); -/* case BSIM4v5_QB: - value->rValue = *(ckt->CKTstate0 + here->BSIM4v5qb); - return(OK); */ - case BSIM4v5_CQB: - value->rValue = *(ckt->CKTstate0 + here->BSIM4v5cqb); - return(OK); -/* case BSIM4v5_QG: - value->rValue = *(ckt->CKTstate0 + here->BSIM4v5qg); - return(OK); */ - case BSIM4v5_CQG: - value->rValue = *(ckt->CKTstate0 + here->BSIM4v5cqg); - return(OK); -/* case BSIM4v5_QD: - value->rValue = *(ckt->CKTstate0 + here->BSIM4v5qd); - return(OK); */ - case BSIM4v5_CQD: - value->rValue = *(ckt->CKTstate0 + here->BSIM4v5cqd); - return(OK); -/* case BSIM4v5_QS: - value->rValue = *(ckt->CKTstate0 + here->BSIM4v5qs); - return(OK); */ - case BSIM4v5_QB: - value->rValue = here->BSIM4v5qbulk; - value->rValue *= here->BSIM4v5m; - return(OK); - case BSIM4v5_QG: - value->rValue = here->BSIM4v5qgate; - value->rValue *= here->BSIM4v5m; - return(OK); - case BSIM4v5_QS: - value->rValue = here->BSIM4v5qsrc; - value->rValue *= here->BSIM4v5m; - return(OK); - case BSIM4v5_QD: - value->rValue = here->BSIM4v5qdrn; - value->rValue *= here->BSIM4v5m; - return(OK); - case BSIM4v5_QDEF: - value->rValue = *(ckt->CKTstate0 + here->BSIM4v5qdef); - return(OK); - case BSIM4v5_GCRG: - value->rValue = here->BSIM4v5gcrg; - value->rValue *= here->BSIM4v5m; - return(OK); - case BSIM4v5_GTAU: - value->rValue = here->BSIM4v5gtau; - value->rValue *= here->BSIM4v5m; - return(OK); - case BSIM4v5_CGGB: - value->rValue = here->BSIM4v5cggb; - value->rValue *= here->BSIM4v5m; - return(OK); - case BSIM4v5_CGDB: - value->rValue = here->BSIM4v5cgdb; - value->rValue *= here->BSIM4v5m; - return(OK); - case BSIM4v5_CGSB: - value->rValue = here->BSIM4v5cgsb; - value->rValue *= here->BSIM4v5m; - return(OK); - case BSIM4v5_CDGB: - value->rValue = here->BSIM4v5cdgb; - value->rValue *= here->BSIM4v5m; - return(OK); - case BSIM4v5_CDDB: - value->rValue = here->BSIM4v5cddb; - value->rValue *= here->BSIM4v5m; - return(OK); - case BSIM4v5_CDSB: - value->rValue = here->BSIM4v5cdsb; - value->rValue *= here->BSIM4v5m; - return(OK); - case BSIM4v5_CBGB: - value->rValue = here->BSIM4v5cbgb; - value->rValue *= here->BSIM4v5m; - return(OK); - case BSIM4v5_CBDB: - value->rValue = here->BSIM4v5cbdb; - value->rValue *= here->BSIM4v5m; - return(OK); - case BSIM4v5_CBSB: - value->rValue = here->BSIM4v5cbsb; - value->rValue *= here->BSIM4v5m; - return(OK); - case BSIM4v5_CSGB: - value->rValue = here->BSIM4v5csgb; - value->rValue *= here->BSIM4v5m; - return(OK); - case BSIM4v5_CSDB: - value->rValue = here->BSIM4v5csdb; - value->rValue *= here->BSIM4v5m; - return(OK); - case BSIM4v5_CSSB: - value->rValue = here->BSIM4v5cssb; - value->rValue *= here->BSIM4v5m; - return(OK); - case BSIM4v5_CGBB: - value->rValue = here->BSIM4v5cgbb; - value->rValue *= here->BSIM4v5m; - return(OK); - case BSIM4v5_CDBB: - value->rValue = here->BSIM4v5cdbb; - value->rValue *= here->BSIM4v5m; - return(OK); - case BSIM4v5_CSBB: - value->rValue = here->BSIM4v5csbb; - value->rValue *= here->BSIM4v5m; - return(OK); - case BSIM4v5_CBBB: - value->rValue = here->BSIM4v5cbbb; - value->rValue *= here->BSIM4v5m; - return(OK); - case BSIM4v5_CAPBD: - value->rValue = here->BSIM4v5capbd; - value->rValue *= here->BSIM4v5m; - return(OK); - case BSIM4v5_CAPBS: - value->rValue = here->BSIM4v5capbs; - value->rValue *= here->BSIM4v5m; - return(OK); - case BSIM4v5_VON: - value->rValue = here->BSIM4v5von; - return(OK); - case BSIM4v5_VDSAT: - value->rValue = here->BSIM4v5vdsat; - return(OK); - case BSIM4v5_QBS: - value->rValue = *(ckt->CKTstate0 + here->BSIM4v5qbs); - return(OK); - case BSIM4v5_QBD: - value->rValue = *(ckt->CKTstate0 + here->BSIM4v5qbd); - return(OK); - default: - return(E_BADPARM); - } - /* NOTREACHED */ -} - diff --git a/src/spicelib/devices/bsim4v5/b4v5check.c b/src/spicelib/devices/bsim4v5/b4v5check.c deleted file mode 100644 index 1caf03190..000000000 --- a/src/spicelib/devices/bsim4v5/b4v5check.c +++ /dev/null @@ -1,796 +0,0 @@ -/**** BSIM4.5.0 Released by Xuemei (Jane) Xi 07/29/2005 ****/ - -/********** - * Copyright 2005 Regents of the University of California. All rights reserved. - * File: b4check.c of BSIM4.5.0. - * Author: 2000 Weidong Liu - * Authors: 2001- Xuemei Xi, Mohan Dunga, Ali Niknejad, Chenming Hu. - * Project Director: Prof. Chenming Hu. - * Modified by Xuemei Xi, 04/06/2001. - * Modified by Xuemei Xi, 10/05/2001. - * Modified by Xuemei Xi, 11/15/2002. - * Modified by Xuemei Xi, 05/09/2003. - * Modified by Xuemei Xi, 03/04/2004. - * Modified by Xuemei Xi, 07/29/2005. - * Modified by Holger Vogt, 12/21/2020. - **********/ - -#include "ngspice/ngspice.h" -#include "ngspice/cktdefs.h" -#include "bsim4v5def.h" -#include "ngspice/trandefs.h" -#include "ngspice/const.h" -#include "ngspice/sperror.h" -#include "ngspice/devdefs.h" -#include "ngspice/suffix.h" -#include "ngspice/wordlist.h" -#include "ngspice/cpextern.h" - -/* Check for correctness of the BSIM4.5 parameters: - If parameter excursions are found, put the warning or error message into a wordlist. - Only then open a file bsim4v5.out and print the data into the file. */ -int -BSIM4v5checkModel( -BSIM4v5model *model, -BSIM4v5instance *here, -CKTcircuit *ckt) -{ - struct bsim4v5SizeDependParam *pParam; - int Fatal_Flag = 0; - FILE *fplog; - wordlist* wl, *wlstart; - - if (cp_getvar("ng_nomodcheck", CP_BOOL, NULL, 0)) - return(0); - - static char modname[BSIZE_SP]; - size_t mlen = strlen(model->BSIM4v5modName); - - if (mlen < BSIZE_SP) { - /* Check the model named model->BSIM4v5modName only once, - because BSIM4v5checkModel() is called for each instance. */ - if (!strncmp(modname, model->BSIM4v5modName, mlen)) - return(0); - strcpy(modname, model->BSIM4v5modName); - } - - pParam = here->pParam; - - wl = wlstart = TMALLOC(wordlist, 1); - wl->wl_prev = NULL; - wl->wl_next = NULL; - wl->wl_word = tprintf("\nChecking parameters for BSIM 4.5 model %s\n", model->BSIM4v5modName); - - if ((strcmp(model->BSIM4v5version, "4.5.0")) && (strncmp(model->BSIM4v5version, "4.50", 4)) && (strncmp(model->BSIM4v5version, "4.5", 3)) - && (strcmp(model->BSIM4v5version, "4.4.0")) && (strncmp(model->BSIM4v5version, "4.40", 4)) && (strncmp(model->BSIM4v5version, "4.4", 3)) - && (strcmp(model->BSIM4v5version, "4.3.0")) && (strncmp(model->BSIM4v5version, "4.30", 4)) && (strncmp(model->BSIM4v5version, "4.3", 3)) - && (strcmp(model->BSIM4v5version, "4.2.0")) && (strncmp(model->BSIM4v5version, "4.20", 4)) && (strncmp(model->BSIM4v5version, "4.2", 3)) - && (strcmp(model->BSIM4v5version, "4.1.0")) && (strncmp(model->BSIM4v5version, "4.10", 4)) && (strncmp(model->BSIM4v5version, "4.1", 3)) - && (strcmp(model->BSIM4v5version, "4.0.0")) && (strncmp(model->BSIM4v5version, "4.00", 4)) && (strncmp(model->BSIM4v5version, "4.0", 3))) - { - printf("Warning: This model supports BSIM4 versions 4.0, 4.1, 4.2, 4.3, 4.4, 4.5\n"); - printf("You specified a wrong version number. Working now with BSIM4v5\n"); - wl_append_word(&wl, &wl, tprintf("Warning: This model supports BSIM4 versions 4.0, 4.1, 4.2, 4.3, 4.4, 4.5\n")); - wl_append_word(&wl, &wl, tprintf("You specified a wrong version number. Working now with BSIM4v5.\n")); - } - - if ((here->BSIM4v5rgateMod == 2) || (here->BSIM4v5rgateMod == 3)) - { if ((here->BSIM4v5trnqsMod == 1) || (here->BSIM4v5acnqsMod == 1)) { - wl_append_word(&wl, &wl, tprintf("Warning: You've selected both Rg and charge deficit NQS; select one only.\n")); - } - } - - if (model->BSIM4v5toxe <= 0.0) - { - wl_append_word(&wl, &wl, tprintf("Fatal: Toxe = %g is not positive.\n", - model->BSIM4v5toxe)); - Fatal_Flag = 1; - } - - if (model->BSIM4v5toxp <= 0.0) - { - wl_append_word(&wl, &wl, tprintf("Fatal: Toxp = %g is not positive.\n", model->BSIM4v5toxp)); - Fatal_Flag = 1; - } - - if (model->BSIM4v5toxm <= 0.0) - { - wl_append_word(&wl, &wl, tprintf("Fatal: Toxm = %g is not positive.\n", model->BSIM4v5toxm)); - Fatal_Flag = 1; - } - - if (model->BSIM4v5toxref <= 0.0) - { - wl_append_word(&wl, &wl, tprintf("Fatal: Toxref = %g is not positive.\n", model->BSIM4v5toxref)); - Fatal_Flag = 1; - } - - - - if (pParam->BSIM4v5lpe0 < -pParam->BSIM4v5leff) - { - wl_append_word(&wl, &wl, tprintf("Fatal: Lpe0 = %g is less than -Leff.\n", - pParam->BSIM4v5lpe0)); - Fatal_Flag = 1; - } - if (model->BSIM4v5lintnoi > pParam->BSIM4v5leff / 2) - { - wl_append_word(&wl, &wl, tprintf("Fatal: Lintnoi = %g is too large - Leff for noise is negative.\n", - model->BSIM4v5lintnoi)); - Fatal_Flag = 1; - } - if (pParam->BSIM4v5lpeb < -pParam->BSIM4v5leff) - { - wl_append_word(&wl, &wl, tprintf("Fatal: Lpeb = %g is less than -Leff.\n", - pParam->BSIM4v5lpeb)); - Fatal_Flag = 1; - } - if (pParam->BSIM4v5ndep <= 0.0) - { - wl_append_word(&wl, &wl, tprintf("Fatal: Ndep = %g is not positive.\n", - pParam->BSIM4v5ndep)); - Fatal_Flag = 1; - } - if (pParam->BSIM4v5phi <= 0.0) - { - wl_append_word(&wl, &wl, tprintf("Fatal: Phi = %g is not positive. Please check Phin and Ndep\n", - pParam->BSIM4v5phi)); - wl_append_word(&wl, &wl, tprintf(" Phin = %g Ndep = %g \n", - pParam->BSIM4v5phin, pParam->BSIM4v5ndep)); - Fatal_Flag = 1; - } - if (pParam->BSIM4v5nsub <= 0.0) - { - wl_append_word(&wl, &wl, tprintf("Fatal: Nsub = %g is not positive.\n", - pParam->BSIM4v5nsub)); - Fatal_Flag = 1; - } - if (pParam->BSIM4v5ngate < 0.0) - { - wl_append_word(&wl, &wl, tprintf("Fatal: Ngate = %g Ngate is not positive.\n", - pParam->BSIM4v5ngate)); - Fatal_Flag = 1; - } - if (pParam->BSIM4v5ngate > 1.e25) - { - wl_append_word(&wl, &wl, tprintf("Fatal: Ngate = %g Ngate is too high\n", - pParam->BSIM4v5ngate)); - Fatal_Flag = 1; - } - if (pParam->BSIM4v5xj <= 0.0) - { - wl_append_word(&wl, &wl, tprintf("Fatal: Xj = %g is not positive.\n", pParam->BSIM4v5xj)); - Fatal_Flag = 1; - } - - if (pParam->BSIM4v5dvt1 < 0.0) - { - wl_append_word(&wl, &wl, tprintf("Fatal: Dvt1 = %g is negative.\n", pParam->BSIM4v5dvt1)); - Fatal_Flag = 1; - } - - if (pParam->BSIM4v5dvt1w < 0.0) - { - wl_append_word(&wl, &wl, tprintf("Fatal: Dvt1w = %g is negative.\n", pParam->BSIM4v5dvt1w)); - Fatal_Flag = 1; - } - - if (pParam->BSIM4v5w0 == -pParam->BSIM4v5weff) - { - wl_append_word(&wl, &wl, tprintf("Fatal: (W0 + Weff) = 0 causing divided-by-zero.\n")); - Fatal_Flag = 1; - } - - if (pParam->BSIM4v5dsub < 0.0) - { - wl_append_word(&wl, &wl, tprintf("Fatal: Dsub = %g is negative.\n", pParam->BSIM4v5dsub)); - Fatal_Flag = 1; - } - if (pParam->BSIM4v5b1 == -pParam->BSIM4v5weff) - { - wl_append_word(&wl, &wl, tprintf("Fatal: (B1 + Weff) = 0 causing divided-by-zero.\n")); - Fatal_Flag = 1; - } - if (here->BSIM4v5u0temp <= 0.0) - { - wl_append_word(&wl, &wl, tprintf("Fatal: u0 at current temperature = %g is not positive.\n", - here->BSIM4v5u0temp)); - Fatal_Flag = 1; - } - - if (pParam->BSIM4v5delta < 0.0) - { - wl_append_word(&wl, &wl, tprintf("Fatal: Delta = %g is less than zero.\n", pParam->BSIM4v5delta)); - Fatal_Flag = 1; - } - - if (here->BSIM4v5vsattemp <= 0.0) - { - wl_append_word(&wl, &wl, tprintf("Fatal: Vsat at current temperature = %g is not positive.\n", - here->BSIM4v5vsattemp)); - Fatal_Flag = 1; - } - - if (pParam->BSIM4v5pclm <= 0.0) - { - wl_append_word(&wl, &wl, tprintf("Fatal: Pclm = %g is not positive.\n", pParam->BSIM4v5pclm)); - Fatal_Flag = 1; - } - - if (pParam->BSIM4v5drout < 0.0) - { - wl_append_word(&wl, &wl, tprintf("Fatal: Drout = %g is negative.\n", pParam->BSIM4v5drout)); - Fatal_Flag = 1; - } - - if (here->BSIM4v5m <= 0.0) - { - wl_append_word(&wl, &wl, tprintf("Fatal: multiplier = %g is not positive.\n", here->BSIM4v5m)); - Fatal_Flag = 1; - } - if (here->BSIM4v5nf < 1.0) - { - wl_append_word(&wl, &wl, tprintf("Fatal: Number of finger = %g is smaller than one.\n", here->BSIM4v5nf)); - Fatal_Flag = 1; - } - - if ((here->BSIM4v5sa > 0.0) && (here->BSIM4v5sb > 0.0) && - ((here->BSIM4v5nf == 1.0) || ((here->BSIM4v5nf > 1.0) && (here->BSIM4v5sd > 0.0)))) - { - if (model->BSIM4v5saref <= 0.0) - { - wl_append_word(&wl, &wl, tprintf("Fatal: SAref = %g is not positive.\n", model->BSIM4v5saref)); - Fatal_Flag = 1; - } - if (model->BSIM4v5sbref <= 0.0) - { - wl_append_word(&wl, &wl, tprintf("Fatal: SBref = %g is not positive.\n", model->BSIM4v5sbref)); - Fatal_Flag = 1; - } - } - - if ((here->BSIM4v5l + model->BSIM4v5xl) <= model->BSIM4v5xgl) - { - wl_append_word(&wl, &wl, tprintf("Fatal: The parameter xgl must be smaller than Ldrawn+XL.\n")); - Fatal_Flag = 1; - } - if (here->BSIM4v5ngcon < 1.0) - { - wl_append_word(&wl, &wl, tprintf("Fatal: The parameter ngcon cannot be smaller than one.\n")); - Fatal_Flag = 1; - } - if ((here->BSIM4v5ngcon != 1.0) && (here->BSIM4v5ngcon != 2.0)) - { - here->BSIM4v5ngcon = 1.0; - wl_append_word(&wl, &wl, tprintf("Warning: Ngcon must be equal to one or two; reset to 1.0.\n")); - } - - if (model->BSIM4v5gbmin < 1.0e-20) - { - wl_append_word(&wl, &wl, tprintf("Warning: Gbmin = %g is too small.\n", model->BSIM4v5gbmin)); - } - - /* Check saturation parameters */ - if (pParam->BSIM4v5fprout < 0.0) - { - wl_append_word(&wl, &wl, tprintf("Fatal: fprout = %g is negative.\n", pParam->BSIM4v5fprout)); - Fatal_Flag = 1; - } - if (pParam->BSIM4v5pdits < 0.0) - { - wl_append_word(&wl, &wl, tprintf("Fatal: pdits = %g is negative.\n", pParam->BSIM4v5pdits)); - Fatal_Flag = 1; - } - if (model->BSIM4v5pditsl < 0.0) - { - wl_append_word(&wl, &wl, tprintf("Fatal: pditsl = %g is negative.\n", model->BSIM4v5pditsl)); - Fatal_Flag = 1; - } - - /* Check gate current parameters */ - if (model->BSIM4v5igbMod) { - if (pParam->BSIM4v5nigbinv <= 0.0) - { - wl_append_word(&wl, &wl, tprintf("Fatal: nigbinv = %g is non-positive.\n", pParam->BSIM4v5nigbinv)); - Fatal_Flag = 1; - } - if (pParam->BSIM4v5nigbacc <= 0.0) - { - wl_append_word(&wl, &wl, tprintf("Fatal: nigbacc = %g is non-positive.\n", pParam->BSIM4v5nigbacc)); - Fatal_Flag = 1; - } - } - if (model->BSIM4v5igcMod) { - if (pParam->BSIM4v5nigc <= 0.0) - { - wl_append_word(&wl, &wl, tprintf("Fatal: nigc = %g is non-positive.\n", pParam->BSIM4v5nigc)); - Fatal_Flag = 1; - } - if (pParam->BSIM4v5poxedge <= 0.0) - { - wl_append_word(&wl, &wl, tprintf("Fatal: poxedge = %g is non-positive.\n", pParam->BSIM4v5poxedge)); - Fatal_Flag = 1; - } - if (pParam->BSIM4v5pigcd <= 0.0) - { - wl_append_word(&wl, &wl, tprintf("Fatal: pigcd = %g is non-positive.\n", pParam->BSIM4v5pigcd)); - Fatal_Flag = 1; - } - } - - /* Check capacitance parameters */ - if (pParam->BSIM4v5clc < 0.0) - { - wl_append_word(&wl, &wl, tprintf("Fatal: Clc = %g is negative.\n", pParam->BSIM4v5clc)); - Fatal_Flag = 1; - } - - /* Check overlap capacitance parameters */ - if (pParam->BSIM4v5ckappas < 0.02) - { - wl_append_word(&wl, &wl, tprintf("Warning: ckappas = %g is too small.\n", pParam->BSIM4v5ckappas)); - pParam->BSIM4v5ckappas = 0.02; - } - if (pParam->BSIM4v5ckappad < 0.02) - { - wl_append_word(&wl, &wl, tprintf("Warning: ckappad = %g is too small.\n", pParam->BSIM4v5ckappad)); - pParam->BSIM4v5ckappad = 0.02; - } - - if (model->BSIM4v5vtss < 0.0) - { - wl_append_word(&wl, &wl, tprintf("Fatal: Vtss = %g is negative.\n", - model->BSIM4v5vtss)); - Fatal_Flag = 1; - } - if (model->BSIM4v5vtsd < 0.0) - { - wl_append_word(&wl, &wl, tprintf("Fatal: Vtsd = %g is negative.\n", - model->BSIM4v5vtsd)); - Fatal_Flag = 1; - } - if (model->BSIM4v5vtssws < 0.0) - { - wl_append_word(&wl, &wl, tprintf("Fatal: Vtssws = %g is negative.\n", - model->BSIM4v5vtssws)); - Fatal_Flag = 1; - } - if (model->BSIM4v5vtsswd < 0.0) - { - wl_append_word(&wl, &wl, tprintf("Fatal: Vtsswd = %g is negative.\n", - model->BSIM4v5vtsswd)); - Fatal_Flag = 1; - } - if (model->BSIM4v5vtsswgs < 0.0) - { - wl_append_word(&wl, &wl, tprintf("Fatal: Vtsswgs = %g is negative.\n", - model->BSIM4v5vtsswgs)); - Fatal_Flag = 1; - } - if (model->BSIM4v5vtsswgd < 0.0) - { - wl_append_word(&wl, &wl, tprintf("Fatal: Vtsswgd = %g is negative.\n", - model->BSIM4v5vtsswgd)); - Fatal_Flag = 1; - } - - - if (model->BSIM4v5paramChk == 1) - { - /* Check L and W parameters */ - if (pParam->BSIM4v5leff <= 1.0e-9) - { - wl_append_word(&wl, &wl, tprintf("Warning: Leff = %g <= 1.0e-9. Recommended Leff >= 1e-8 \n", - pParam->BSIM4v5leff)); - } - - if (pParam->BSIM4v5leffCV <= 1.0e-9) - { - wl_append_word(&wl, &wl, tprintf("Warning: Leff for CV = %g <= 1.0e-9. Recommended LeffCV >=1e-8 \n", - pParam->BSIM4v5leffCV)); - } - - if (pParam->BSIM4v5weff <= 1.0e-9) - { - wl_append_word(&wl, &wl, tprintf("Warning: Weff = %g <= 1.0e-9. Recommended Weff >=1e-7 \n", - pParam->BSIM4v5weff)); - } - - if (pParam->BSIM4v5weffCV <= 1.0e-9) - { - wl_append_word(&wl, &wl, tprintf("Warning: Weff for CV = %g <= 1.0e-9. Recommended WeffCV >= 1e-7 \n", - pParam->BSIM4v5weffCV)); - } - - /* Check threshold voltage parameters */ - if (model->BSIM4v5toxe < 1.0e-10) - { - wl_append_word(&wl, &wl, tprintf("Warning: Toxe = %g is less than 1A. Recommended Toxe >= 5A\n", model->BSIM4v5toxe)); - } - if (model->BSIM4v5toxp < 1.0e-10) - { - wl_append_word(&wl, &wl, tprintf("Warning: Toxp = %g is less than 1A. Recommended Toxp >= 5A\n", model->BSIM4v5toxp)); - } - if (model->BSIM4v5toxm < 1.0e-10) - { - wl_append_word(&wl, &wl, tprintf("Warning: Toxm = %g is less than 1A. Recommended Toxm >= 5A\n", model->BSIM4v5toxm)); - } - - if (pParam->BSIM4v5ndep <= 1.0e12) - { - wl_append_word(&wl, &wl, tprintf("Warning: Ndep = %g may be too small.\n", - pParam->BSIM4v5ndep)); - } - else if (pParam->BSIM4v5ndep >= 1.0e21) - { - wl_append_word(&wl, &wl, tprintf("Warning: Ndep = %g may be too large.\n", - pParam->BSIM4v5ndep)); - } - - if (pParam->BSIM4v5nsub <= 1.0e14) - { - wl_append_word(&wl, &wl, tprintf("Warning: Nsub = %g may be too small.\n", - pParam->BSIM4v5nsub)); - } - else if (pParam->BSIM4v5nsub >= 1.0e21) - { - wl_append_word(&wl, &wl, tprintf("Warning: Nsub = %g may be too large.\n", - pParam->BSIM4v5nsub)); - } - - if ((pParam->BSIM4v5ngate > 0.0) && - (pParam->BSIM4v5ngate <= 1.e18)) - { - wl_append_word(&wl, &wl, tprintf("Warning: Ngate = %g is less than 1.E18cm^-3.\n", - pParam->BSIM4v5ngate)); - } - - if (pParam->BSIM4v5dvt0 < 0.0) - { - wl_append_word(&wl, &wl, tprintf("Warning: Dvt0 = %g is negative.\n", pParam->BSIM4v5dvt0)); - } - - if (fabs(1.0e-8 / (pParam->BSIM4v5w0 + pParam->BSIM4v5weff)) > 10.0) - { - wl_append_word(&wl, &wl, tprintf("Warning: (W0 + Weff) may be too small.\n")); - } - - /* Check subthreshold parameters */ - if (pParam->BSIM4v5nfactor < 0.0) - { - wl_append_word(&wl, &wl, tprintf("Warning: Nfactor = %g is negative.\n", pParam->BSIM4v5nfactor)); - } - if (pParam->BSIM4v5cdsc < 0.0) - { - wl_append_word(&wl, &wl, tprintf("Warning: Cdsc = %g is negative.\n", pParam->BSIM4v5cdsc)); - } - if (pParam->BSIM4v5cdscd < 0.0) - { - wl_append_word(&wl, &wl, tprintf("Warning: Cdscd = %g is negative.\n", pParam->BSIM4v5cdscd)); - } - /* Check DIBL parameters */ - if (here->BSIM4v5eta0 < 0.0) - { - wl_append_word(&wl, &wl, tprintf("Warning: Eta0 = %g is negative.\n", here->BSIM4v5eta0)); - } - - /* Check Abulk parameters */ - if (fabs(1.0e-8 / (pParam->BSIM4v5b1 + pParam->BSIM4v5weff)) > 10.0) - { - wl_append_word(&wl, &wl, tprintf("Warning: (B1 + Weff) may be too small.\n")); - } - - - /* Check Saturation parameters */ - if (pParam->BSIM4v5a2 < 0.01) - { - wl_append_word(&wl, &wl, tprintf("Warning: A2 = %g is too small. Set to 0.01.\n", - pParam->BSIM4v5a2)); - pParam->BSIM4v5a2 = 0.01; - } - else if (pParam->BSIM4v5a2 > 1.0) - { - wl_append_word(&wl, &wl, tprintf("Warning: A2 = %g is larger than 1. A2 is set to 1 and A1 is set to 0.\n", - pParam->BSIM4v5a2)); - pParam->BSIM4v5a2 = 1.0; - pParam->BSIM4v5a1 = 0.0; - } - - if (pParam->BSIM4v5prwg < 0.0) - { - wl_append_word(&wl, &wl, tprintf("Warning: Prwg = %g is negative. Set to zero.\n", - pParam->BSIM4v5prwg)); - pParam->BSIM4v5prwg = 0.0; - } - - if (pParam->BSIM4v5rdsw < 0.0) - { - wl_append_word(&wl, &wl, tprintf("Warning: Rdsw = %g is negative. Set to zero.\n", - pParam->BSIM4v5rdsw)); - pParam->BSIM4v5rdsw = 0.0; - pParam->BSIM4v5rds0 = 0.0; - } - - if (pParam->BSIM4v5rds0 < 0.0) - { - wl_append_word(&wl, &wl, tprintf("Warning: Rds at current temperature = %g is negative. Set to zero.\n", - pParam->BSIM4v5rds0)); - pParam->BSIM4v5rds0 = 0.0; - } - - if (pParam->BSIM4v5rdswmin < 0.0) - { - wl_append_word(&wl, &wl, tprintf("Warning: Rdswmin at current temperature = %g is negative. Set to zero.\n", - pParam->BSIM4v5rdswmin)); - pParam->BSIM4v5rdswmin = 0.0; - } - - if (pParam->BSIM4v5pscbe2 <= 0.0) - { - wl_append_word(&wl, &wl, tprintf("Warning: Pscbe2 = %g is not positive.\n", pParam->BSIM4v5pscbe2)); - } - - if (pParam->BSIM4v5vsattemp < 1.0e3) - { - wl_append_word(&wl, &wl, tprintf("Warning: Vsat at current temperature = %g may be too small.\n", pParam->BSIM4v5vsattemp)); - } - - if ((model->BSIM4v5lambdaGiven) && (pParam->BSIM4v5lambda > 0.0)) - { - if (pParam->BSIM4v5lambda > 1.0e-9) - { - wl_append_word(&wl, &wl, tprintf("Warning: Lambda = %g may be too large.\n", pParam->BSIM4v5lambda)); - } - } - - if ((model->BSIM4v5vtlGiven) && (pParam->BSIM4v5vtl > 0.0)) - { - if (pParam->BSIM4v5vtl < 6.0e4) - { - wl_append_word(&wl, &wl, tprintf("Warning: Thermal velocity vtl = %g may be too small.\n", pParam->BSIM4v5vtl)); - } - - if (pParam->BSIM4v5xn < 3.0) - { - wl_append_word(&wl, &wl, tprintf("Warning: back scattering coeff xn = %g is too small. Reset to 3.0 \n", pParam->BSIM4v5xn)); - pParam->BSIM4v5xn = 3.0; - } - - if (model->BSIM4v5lc < 0.0) - { - wl_append_word(&wl, &wl, tprintf("Warning: back scattering coeff lc = %g is too small. Reset to 0.0\n", model->BSIM4v5lc)); - pParam->BSIM4v5lc = 0.0; - } - } - - if (pParam->BSIM4v5pdibl1 < 0.0) - { - wl_append_word(&wl, &wl, tprintf("Warning: Pdibl1 = %g is negative.\n", pParam->BSIM4v5pdibl1)); - } - } - - if (pParam->BSIM4v5pdibl2 < 0.0) - { - wl_append_word(&wl, &wl, tprintf("Warning: Pdibl2 = %g is negative.\n", pParam->BSIM4v5pdibl2)); - } - - /* Check stress effect parameters */ - if ((here->BSIM4v5sa > 0.0) && (here->BSIM4v5sb > 0.0) && - ((here->BSIM4v5nf == 1.0) || ((here->BSIM4v5nf > 1.0) && (here->BSIM4v5sd > 0.0)))) - { - if (model->BSIM4v5lodk2 <= 0.0) - { - wl_append_word(&wl, &wl, tprintf("Warning: LODK2 = %g is not positive.\n", model->BSIM4v5lodk2)); - } - if (model->BSIM4v5lodeta0 <= 0.0) - { - wl_append_word(&wl, &wl, tprintf("Warning: LODETA0 = %g is not positive.\n", model->BSIM4v5lodeta0)); - } - } - - /* Check gate resistance parameters */ - if (here->BSIM4v5rgateMod == 1) - { - if (model->BSIM4v5rshg <= 0.0) - wl_append_word(&wl, &wl, tprintf("Warning: rshg should be positive for rgateMod = 1.\n")); - } - else if (here->BSIM4v5rgateMod == 2) - { - if (model->BSIM4v5rshg <= 0.0) - wl_append_word(&wl, &wl, tprintf("Warning: rshg <= 0.0 for rgateMod = 2.\n")); - else if (pParam->BSIM4v5xrcrg1 <= 0.0) - wl_append_word(&wl, &wl, tprintf("Warning: xrcrg1 <= 0.0 for rgateMod = 2.\n")); - } - if (here->BSIM4v5rgateMod == 3) - { - if (model->BSIM4v5rshg <= 0.0) - wl_append_word(&wl, &wl, tprintf("Warning: rshg should be positive for rgateMod = 3.\n")); - else if (pParam->BSIM4v5xrcrg1 <= 0.0) - wl_append_word(&wl, &wl, tprintf("Warning: xrcrg1 should be positive for rgateMod = 3.\n")); - } - - /* Check capacitance parameters */ - if (pParam->BSIM4v5noff < 0.1) - { - wl_append_word(&wl, &wl, tprintf("Warning: Noff = %g is too small.\n", pParam->BSIM4v5noff)); - } - - if (pParam->BSIM4v5voffcv < -0.5) - { - wl_append_word(&wl, &wl, tprintf("Warning: Voffcv = %g is too small.\n", pParam->BSIM4v5voffcv)); - } - - if (pParam->BSIM4v5moin < 5.0) - { - wl_append_word(&wl, &wl, tprintf("Warning: Moin = %g is too small.\n", pParam->BSIM4v5moin)); - } - if (pParam->BSIM4v5moin > 25.0) - { - wl_append_word(&wl, &wl, tprintf("Warning: Moin = %g is too large.\n", pParam->BSIM4v5moin)); - } - if (model->BSIM4v5capMod == 2) { - if (pParam->BSIM4v5acde < 0.1) - { - wl_append_word(&wl, &wl, tprintf("Warning: Acde = %g is too small.\n", pParam->BSIM4v5acde)); - } - if (pParam->BSIM4v5acde > 1.6) - { - wl_append_word(&wl, &wl, tprintf("Warning: Acde = %g is too large.\n", pParam->BSIM4v5acde)); - } - } - - /* Check overlap capacitance parameters */ - if (model->BSIM4v5cgdo < 0.0) - { - wl_append_word(&wl, &wl, tprintf("Warning: cgdo = %g is negative. Set to zero.\n", model->BSIM4v5cgdo)); - model->BSIM4v5cgdo = 0.0; - } - if (model->BSIM4v5cgso < 0.0) - { - wl_append_word(&wl, &wl, tprintf("Warning: cgso = %g is negative. Set to zero.\n", model->BSIM4v5cgso)); - model->BSIM4v5cgso = 0.0; - } - if (model->BSIM4v5cgbo < 0.0) - { - wl_append_word(&wl, &wl, tprintf("Warning: cgbo = %g is negative. Set to zero.\n", model->BSIM4v5cgbo)); - model->BSIM4v5cgbo = 0.0; - } - if (model->BSIM4v5tnoiMod == 1) { - if (model->BSIM4v5tnoia < 0.0) - { - wl_append_word(&wl, &wl, tprintf("Warning: tnoia = %g is negative. Set to zero.\n", model->BSIM4v5tnoia)); - model->BSIM4v5tnoia = 0.0; - } - if (model->BSIM4v5tnoib < 0.0) - { - wl_append_word(&wl, &wl, tprintf("Warning: tnoib = %g is negative. Set to zero.\n", model->BSIM4v5tnoib)); - model->BSIM4v5tnoib = 0.0; - } - - if (model->BSIM4v5rnoia < 0.0) - { - wl_append_word(&wl, &wl, tprintf("Warning: rnoia = %g is negative. Set to zero.\n", model->BSIM4v5rnoia)); - model->BSIM4v5rnoia = 0.0; - } - if (model->BSIM4v5rnoib < 0.0) - { - wl_append_word(&wl, &wl, tprintf("Warning: rnoib = %g is negative. Set to zero.\n", model->BSIM4v5rnoib)); - model->BSIM4v5rnoib = 0.0; - } - } - - if (model->BSIM4v5SjctEmissionCoeff < 0.0) - { - wl_append_word(&wl, &wl, tprintf("Warning: Njs = %g is negative.\n", - model->BSIM4v5SjctEmissionCoeff)); - } - if (model->BSIM4v5DjctEmissionCoeff < 0.0) - { - wl_append_word(&wl, &wl, tprintf("Warning: Njd = %g is negative.\n", - model->BSIM4v5DjctEmissionCoeff)); - } - if (model->BSIM4v5njtstemp < 0.0) - { - wl_append_word(&wl, &wl, tprintf("Warning: Njts = %g is negative at temperature = %g.\n", - model->BSIM4v5njtstemp, ckt->CKTtemp)); - } - if (model->BSIM4v5njtsswtemp < 0.0) - { - wl_append_word(&wl, &wl, tprintf("Warning: Njtssw = %g is negative at temperature = %g.\n", - model->BSIM4v5njtsswtemp, ckt->CKTtemp)); - } - if (model->BSIM4v5njtsswgtemp < 0.0) - { - wl_append_word(&wl, &wl, tprintf("Warning: Njtsswg = %g is negative at temperature = %g.\n", - model->BSIM4v5njtsswgtemp, ckt->CKTtemp)); - } - if (model->BSIM4v5ntnoi < 0.0) - { - wl_append_word(&wl, &wl, tprintf("Warning: ntnoi = %g is negative. Set to zero.\n", model->BSIM4v5ntnoi)); - model->BSIM4v5ntnoi = 0.0; - } - - /* diode model */ - if (model->BSIM4v5SbulkJctBotGradingCoeff >= 0.99) - { - wl_append_word(&wl, &wl, tprintf("Warning: MJS = %g is too big. Set to 0.99.\n", model->BSIM4v5SbulkJctBotGradingCoeff)); - model->BSIM4v5SbulkJctBotGradingCoeff = 0.99; - } - if (model->BSIM4v5SbulkJctSideGradingCoeff >= 0.99) - { - wl_append_word(&wl, &wl, tprintf("Warning: MJSWS = %g is too big. Set to 0.99.\n", model->BSIM4v5SbulkJctSideGradingCoeff)); - model->BSIM4v5SbulkJctSideGradingCoeff = 0.99; - } - if (model->BSIM4v5SbulkJctGateSideGradingCoeff >= 0.99) - { - wl_append_word(&wl, &wl, tprintf("Warning: MJSWGS = %g is too big. Set to 0.99.\n", model->BSIM4v5SbulkJctGateSideGradingCoeff)); - model->BSIM4v5SbulkJctGateSideGradingCoeff = 0.99; - } - - if (model->BSIM4v5DbulkJctBotGradingCoeff >= 0.99) - { - wl_append_word(&wl, &wl, tprintf("Warning: MJD = %g is too big. Set to 0.99.\n", model->BSIM4v5DbulkJctBotGradingCoeff)); - model->BSIM4v5DbulkJctBotGradingCoeff = 0.99; - } - if (model->BSIM4v5DbulkJctSideGradingCoeff >= 0.99) - { - wl_append_word(&wl, &wl, tprintf("Warning: MJSWD = %g is too big. Set to 0.99.\n", model->BSIM4v5DbulkJctSideGradingCoeff)); - model->BSIM4v5DbulkJctSideGradingCoeff = 0.99; - } - if (model->BSIM4v5DbulkJctGateSideGradingCoeff >= 0.99) - { - wl_append_word(&wl, &wl, tprintf("Warning: MJSWGD = %g is too big. Set to 0.99.\n", model->BSIM4v5DbulkJctGateSideGradingCoeff)); - model->BSIM4v5DbulkJctGateSideGradingCoeff = 0.99; - } - if (model->BSIM4v5wpemod == 1) - { - if (model->BSIM4v5scref <= 0.0) - { - wl_append_word(&wl, &wl, tprintf("Warning: SCREF = %g is not positive. Set to 1e-6.\n", model->BSIM4v5scref)); - model->BSIM4v5scref = 1e-6; - } - if (here->BSIM4v5sca < 0.0) - { - wl_append_word(&wl, &wl, tprintf("Warning: SCA = %g is negative. Set to 0.0.\n", here->BSIM4v5sca)); - here->BSIM4v5sca = 0.0; - } - if (here->BSIM4v5scb < 0.0) - { - wl_append_word(&wl, &wl, tprintf("Warning: SCB = %g is negative. Set to 0.0.\n", here->BSIM4v5scb)); - here->BSIM4v5scb = 0.0; - } - if (here->BSIM4v5scc < 0.0) - { - wl_append_word(&wl, &wl, tprintf("Warning: SCC = %g is negative. Set to 0.0.\n", here->BSIM4v5scc)); - here->BSIM4v5scc = 0.0; - } - if (here->BSIM4v5sc < 0.0) - { - wl_append_word(&wl, &wl, tprintf("Warning: SC = %g is negative. Set to 0.0.\n", here->BSIM4v5sc)); - here->BSIM4v5sc = 0.0; - } - } - - wordlist* wlfree = wlstart; - if (wlstart->wl_next) { - if ((fplog = fopen("bsim4v5.out", "w")) != NULL) { - while (wlstart) { - fprintf(fplog, "%s", wlstart->wl_word); - fprintf(stderr, "%s", wlstart->wl_word); - wlstart = wlstart->wl_next; - } - fclose(fplog); - } - else { - while (wlstart) { - fprintf(stderr, "%s", wlstart->wl_word); - wlstart = wlstart->wl_next; - } - } - } - - wl_free(wlfree); - - return(Fatal_Flag); -} - diff --git a/src/spicelib/devices/bsim4v5/b4v5cvtest.c b/src/spicelib/devices/bsim4v5/b4v5cvtest.c deleted file mode 100644 index b807b57b6..000000000 --- a/src/spicelib/devices/bsim4v5/b4v5cvtest.c +++ /dev/null @@ -1,198 +0,0 @@ -/**** BSIM4.5.0 Released by Xuemei (Jane) Xi 07/29/2005 ****/ - -/********** - * Copyright 2005 Regents of the University of California. All rights reserved. - * File: b4cvtest.c of BSIM4.5.0. - * Author: 2000 Weidong Liu - * Authors: 2001- Xuemei Xi, Mohan Dunga, Ali Niknejad, Chenming Hu. - * Project Director: Prof. Chenming Hu. - * Modified by Xuemei Xi, 04/06/2001. - * Modified by Xuemei Xi, 10/05/2001. - * Modified by Xuemei Xi, 05/09/2003. - **********/ - -#include "ngspice/ngspice.h" -#include "ngspice/cktdefs.h" -#include "bsim4v5def.h" -#include "ngspice/trandefs.h" -#include "ngspice/const.h" -#include "ngspice/devdefs.h" -#include "ngspice/sperror.h" -#include "ngspice/suffix.h" - - -int -BSIM4v5convTest( -GENmodel *inModel, -CKTcircuit *ckt) -{ -BSIM4v5model *model = (BSIM4v5model*)inModel; -BSIM4v5instance *here; -double delvbd, delvbs, delvds, delvgd, delvgs; -double delvdbd, delvsbs; -double delvbd_jct, delvbs_jct; -double vds, vgs, vgd, vgdo, vbs, vbd; -double vdbd, vdbs, vsbs; -double cbhat, cdhat, Idtot, Ibtot; -double vses, vdes, vdedo, delvses, delvded, delvdes; -double Isestot, cseshat, Idedtot, cdedhat; -double Igstot, cgshat, Igdtot, cgdhat, Igbtot, cgbhat; -double tol0, tol1, tol2, tol3, tol4, tol5, tol6; - - for (; model != NULL; model = BSIM4v5nextModel(model)) - { for (here = BSIM4v5instances(model); here != NULL ; - here=BSIM4v5nextInstance(here)) - { - vds = model->BSIM4v5type - * (*(ckt->CKTrhsOld + here->BSIM4v5dNodePrime) - - *(ckt->CKTrhsOld + here->BSIM4v5sNodePrime)); - vgs = model->BSIM4v5type - * (*(ckt->CKTrhsOld + here->BSIM4v5gNodePrime) - - *(ckt->CKTrhsOld + here->BSIM4v5sNodePrime)); - vbs = model->BSIM4v5type - * (*(ckt->CKTrhsOld + here->BSIM4v5bNodePrime) - - *(ckt->CKTrhsOld + here->BSIM4v5sNodePrime)); - vdbs = model->BSIM4v5type - * (*(ckt->CKTrhsOld + here->BSIM4v5dbNode) - - *(ckt->CKTrhsOld + here->BSIM4v5sNodePrime)); - vsbs = model->BSIM4v5type - * (*(ckt->CKTrhsOld + here->BSIM4v5sbNode) - - *(ckt->CKTrhsOld + here->BSIM4v5sNodePrime)); - vses = model->BSIM4v5type - * (*(ckt->CKTrhsOld + here->BSIM4v5sNode) - - *(ckt->CKTrhsOld + here->BSIM4v5sNodePrime)); - vdes = model->BSIM4v5type - * (*(ckt->CKTrhsOld + here->BSIM4v5dNode) - - *(ckt->CKTrhsOld + here->BSIM4v5sNodePrime)); - - vgdo = *(ckt->CKTstate0 + here->BSIM4v5vgs) - - *(ckt->CKTstate0 + here->BSIM4v5vds); - vbd = vbs - vds; - vdbd = vdbs - vds; - vgd = vgs - vds; - - delvbd = vbd - *(ckt->CKTstate0 + here->BSIM4v5vbd); - delvdbd = vdbd - *(ckt->CKTstate0 + here->BSIM4v5vdbd); - delvgd = vgd - vgdo; - - delvds = vds - *(ckt->CKTstate0 + here->BSIM4v5vds); - delvgs = vgs - *(ckt->CKTstate0 + here->BSIM4v5vgs); - delvbs = vbs - *(ckt->CKTstate0 + here->BSIM4v5vbs); - delvsbs = vsbs - *(ckt->CKTstate0 + here->BSIM4v5vsbs); - - delvses = vses - (*(ckt->CKTstate0 + here->BSIM4v5vses)); - vdedo = *(ckt->CKTstate0 + here->BSIM4v5vdes) - - *(ckt->CKTstate0 + here->BSIM4v5vds); - delvdes = vdes - *(ckt->CKTstate0 + here->BSIM4v5vdes); - delvded = vdes - vds - vdedo; - - delvbd_jct = (!here->BSIM4v5rbodyMod) ? delvbd : delvdbd; - delvbs_jct = (!here->BSIM4v5rbodyMod) ? delvbs : delvsbs; - - if (here->BSIM4v5mode >= 0) - { Idtot = here->BSIM4v5cd + here->BSIM4v5csub - here->BSIM4v5cbd - + here->BSIM4v5Igidl; - cdhat = Idtot - here->BSIM4v5gbd * delvbd_jct - + (here->BSIM4v5gmbs + here->BSIM4v5gbbs + here->BSIM4v5ggidlb) * delvbs - + (here->BSIM4v5gm + here->BSIM4v5gbgs + here->BSIM4v5ggidlg) * delvgs - + (here->BSIM4v5gds + here->BSIM4v5gbds + here->BSIM4v5ggidld) * delvds; - - Igstot = here->BSIM4v5Igs + here->BSIM4v5Igcs; - cgshat = Igstot + (here->BSIM4v5gIgsg + here->BSIM4v5gIgcsg) * delvgs - + here->BSIM4v5gIgcsd * delvds + here->BSIM4v5gIgcsb * delvbs; - - Igdtot = here->BSIM4v5Igd + here->BSIM4v5Igcd; - cgdhat = Igdtot + here->BSIM4v5gIgdg * delvgd + here->BSIM4v5gIgcdg * delvgs - + here->BSIM4v5gIgcdd * delvds + here->BSIM4v5gIgcdb * delvbs; - - Igbtot = here->BSIM4v5Igb; - cgbhat = here->BSIM4v5Igb + here->BSIM4v5gIgbg * delvgs + here->BSIM4v5gIgbd - * delvds + here->BSIM4v5gIgbb * delvbs; - } - else - { Idtot = here->BSIM4v5cd + here->BSIM4v5cbd - here->BSIM4v5Igidl; /* bugfix */ - cdhat = Idtot + here->BSIM4v5gbd * delvbd_jct + here->BSIM4v5gmbs - * delvbd + here->BSIM4v5gm * delvgd - - (here->BSIM4v5gds + here->BSIM4v5ggidls) * delvds - - here->BSIM4v5ggidlg * delvgs - here->BSIM4v5ggidlb * delvbs; - - Igstot = here->BSIM4v5Igs + here->BSIM4v5Igcd; - cgshat = Igstot + here->BSIM4v5gIgsg * delvgs + here->BSIM4v5gIgcdg * delvgd - - here->BSIM4v5gIgcdd * delvds + here->BSIM4v5gIgcdb * delvbd; - - Igdtot = here->BSIM4v5Igd + here->BSIM4v5Igcs; - cgdhat = Igdtot + (here->BSIM4v5gIgdg + here->BSIM4v5gIgcsg) * delvgd - - here->BSIM4v5gIgcsd * delvds + here->BSIM4v5gIgcsb * delvbd; - - Igbtot = here->BSIM4v5Igb; - cgbhat = here->BSIM4v5Igb + here->BSIM4v5gIgbg * delvgd - here->BSIM4v5gIgbd - * delvds + here->BSIM4v5gIgbb * delvbd; - } - - Isestot = here->BSIM4v5gstot * (*(ckt->CKTstate0 + here->BSIM4v5vses)); - cseshat = Isestot + here->BSIM4v5gstot * delvses - + here->BSIM4v5gstotd * delvds + here->BSIM4v5gstotg * delvgs - + here->BSIM4v5gstotb * delvbs; - - Idedtot = here->BSIM4v5gdtot * vdedo; - cdedhat = Idedtot + here->BSIM4v5gdtot * delvded - + here->BSIM4v5gdtotd * delvds + here->BSIM4v5gdtotg * delvgs - + here->BSIM4v5gdtotb * delvbs; - - /* - * Check convergence - */ - - if ((here->BSIM4v5off == 0) || (!(ckt->CKTmode & MODEINITFIX))) - { tol0 = ckt->CKTreltol * MAX(fabs(cdhat), fabs(Idtot)) - + ckt->CKTabstol; - tol1 = ckt->CKTreltol * MAX(fabs(cseshat), fabs(Isestot)) - + ckt->CKTabstol; - tol2 = ckt->CKTreltol * MAX(fabs(cdedhat), fabs(Idedtot)) - + ckt->CKTabstol; - tol3 = ckt->CKTreltol * MAX(fabs(cgshat), fabs(Igstot)) - + ckt->CKTabstol; - tol4 = ckt->CKTreltol * MAX(fabs(cgdhat), fabs(Igdtot)) - + ckt->CKTabstol; - tol5 = ckt->CKTreltol * MAX(fabs(cgbhat), fabs(Igbtot)) - + ckt->CKTabstol; - - if ((fabs(cdhat - Idtot) >= tol0) || (fabs(cseshat - Isestot) >= tol1) - || (fabs(cdedhat - Idedtot) >= tol2)) - { ckt->CKTnoncon++; - return(OK); - } - - if ((fabs(cgshat - Igstot) >= tol3) || (fabs(cgdhat - Igdtot) >= tol4) - || (fabs(cgbhat - Igbtot) >= tol5)) - { ckt->CKTnoncon++; - return(OK); - } - - Ibtot = here->BSIM4v5cbs + here->BSIM4v5cbd - - here->BSIM4v5Igidl - here->BSIM4v5Igisl - here->BSIM4v5csub; - if (here->BSIM4v5mode >= 0) - { cbhat = Ibtot + here->BSIM4v5gbd * delvbd_jct - + here->BSIM4v5gbs * delvbs_jct - (here->BSIM4v5gbbs + here->BSIM4v5ggidlb) - * delvbs - (here->BSIM4v5gbgs + here->BSIM4v5ggidlg) * delvgs - - (here->BSIM4v5gbds + here->BSIM4v5ggidld) * delvds - - here->BSIM4v5ggislg * delvgd - here->BSIM4v5ggislb* delvbd + here->BSIM4v5ggisls * delvds ; - } - else - { cbhat = Ibtot + here->BSIM4v5gbs * delvbs_jct + here->BSIM4v5gbd - * delvbd_jct - (here->BSIM4v5gbbs + here->BSIM4v5ggislb) * delvbd - - (here->BSIM4v5gbgs + here->BSIM4v5ggislg) * delvgd - + (here->BSIM4v5gbds + here->BSIM4v5ggisld - here->BSIM4v5ggidls) * delvds - - here->BSIM4v5ggidlg * delvgs - here->BSIM4v5ggidlb * delvbs; - } - tol6 = ckt->CKTreltol * MAX(fabs(cbhat), - fabs(Ibtot)) + ckt->CKTabstol; - if (fabs(cbhat - Ibtot) > tol6) - { ckt->CKTnoncon++; - return(OK); - } - } - } - } - return(OK); -} diff --git a/src/spicelib/devices/bsim4v5/b4v5geo.c b/src/spicelib/devices/bsim4v5/b4v5geo.c deleted file mode 100644 index 801c3521e..000000000 --- a/src/spicelib/devices/bsim4v5/b4v5geo.c +++ /dev/null @@ -1,397 +0,0 @@ -/**** BSIM4.5.0 Released by Xuemei (Jane) Xi 07/29/2005 ****/ - -/********** - * Copyright 2005 Regents of the University of California. All rights reserved. - * File: b4geo.c of BSIM4.5.0. - * Author: 2000 Weidong Liu - * Authors: 2001- Xuemei Xi, Mohan Dunga, Ali Niknejad, Chenming Hu. - * Project Director: Prof. Chenming Hu. - **********/ - -#include "ngspice/ngspice.h" -#include "bsim4v5def.h" - -/* - * WDLiu: - * This subrutine is a special module to process the geometry dependent - * parasitics for BSIM4v5, which calculates Ps, Pd, As, Ad, and Rs and Rd - * for multi-fingers and varous GEO and RGEO options. - */ - -int -BSIM4v5RdsEndIso(double, double, double, double, double, double, int, int, double *); -int -BSIM4v5RdsEndSha(double, double, double, double, double, double, int, int, double *); - -static int -BSIM4v5NumFingerDiff( -double nf, -int minSD, -double *nuIntD, double *nuEndD, double *nuIntS, double *nuEndS) -{ -int NF; - NF = (int)nf; - if ((NF%2) != 0) - { *nuEndD = *nuEndS = 1.0; - *nuIntD = *nuIntS = 2.0 * MAX((nf - 1.0) / 2.0, 0.0); - } - else - { if (minSD == 1) /* minimize # of source */ - { *nuEndD = 2.0; - *nuIntD = 2.0 * MAX((nf / 2.0 - 1.0), 0.0); - *nuEndS = 0.0; - *nuIntS = nf; - } - else - { *nuEndD = 0.0; - *nuIntD = nf; - *nuEndS = 2.0; - *nuIntS = 2.0 * MAX((nf / 2.0 - 1.0), 0.0); - } - } -return 0; -} - - -int -BSIM4v5PAeffGeo( -double nf, -int geo, int minSD, -double Weffcj, double DMCG, double DMCI, double DMDG, -double *Ps, double *Pd, double *As, double *Ad) -{ -double T0, T1, T2; -double ADiso, ADsha, ADmer, ASiso, ASsha, ASmer; -double PDiso, PDsha, PDmer, PSiso, PSsha, PSmer; -double nuIntD = 0.0, nuEndD = 0.0, nuIntS = 0.0, nuEndS = 0.0; - - if (geo < 9) /* For geo = 9 and 10, the numbers of S/D diffusions already known */ - BSIM4v5NumFingerDiff(nf, minSD, &nuIntD, &nuEndD, &nuIntS, &nuEndS); - - T0 = DMCG + DMCI; - T1 = DMCG + DMCG; - T2 = DMDG + DMDG; - - PSiso = PDiso = T0 + T0 + Weffcj; - PSsha = PDsha = T1; - PSmer = PDmer = T2; - - ASiso = ADiso = T0 * Weffcj; - ASsha = ADsha = DMCG * Weffcj; - ASmer = ADmer = DMDG * Weffcj; - - switch(geo) - { case 0: - *Ps = nuEndS * PSiso + nuIntS * PSsha; - *Pd = nuEndD * PDiso + nuIntD * PDsha; - *As = nuEndS * ASiso + nuIntS * ASsha; - *Ad = nuEndD * ADiso + nuIntD * ADsha; - break; - case 1: - *Ps = nuEndS * PSiso + nuIntS * PSsha; - *Pd = (nuEndD + nuIntD) * PDsha; - *As = nuEndS * ASiso + nuIntS * ASsha; - *Ad = (nuEndD + nuIntD) * ADsha; - break; - case 2: - *Ps = (nuEndS + nuIntS) * PSsha; - *Pd = nuEndD * PDiso + nuIntD * PDsha; - *As = (nuEndS + nuIntS) * ASsha; - *Ad = nuEndD * ADiso + nuIntD * ADsha; - break; - case 3: - *Ps = (nuEndS + nuIntS) * PSsha; - *Pd = (nuEndD + nuIntD) * PDsha; - *As = (nuEndS + nuIntS) * ASsha; - *Ad = (nuEndD + nuIntD) * ADsha; - break; - case 4: - *Ps = nuEndS * PSiso + nuIntS * PSsha; - *Pd = nuEndD * PDmer + nuIntD * PDsha; - *As = nuEndS * ASiso + nuIntS * ASsha; - *Ad = nuEndD * ADmer + nuIntD * ADsha; - break; - case 5: - *Ps = (nuEndS + nuIntS) * PSsha; - *Pd = nuEndD * PDmer + nuIntD * PDsha; - *As = (nuEndS + nuIntS) * ASsha; - *Ad = nuEndD * ADmer + nuIntD * ADsha; - break; - case 6: - *Ps = nuEndS * PSmer + nuIntS * PSsha; - *Pd = nuEndD * PDiso + nuIntD * PDsha; - *As = nuEndS * ASmer + nuIntS * ASsha; - *Ad = nuEndD * ADiso + nuIntD * ADsha; - break; - case 7: - *Ps = nuEndS * PSmer + nuIntS * PSsha; - *Pd = (nuEndD + nuIntD) * PDsha; - *As = nuEndS * ASmer + nuIntS * ASsha; - *Ad = (nuEndD + nuIntD) * ADsha; - break; - case 8: - *Ps = nuEndS * PSmer + nuIntS * PSsha; - *Pd = nuEndD * PDmer + nuIntD * PDsha; - *As = nuEndS * ASmer + nuIntS * ASsha; - *Ad = nuEndD * ADmer + nuIntD * ADsha; - break; - case 9: /* geo = 9 and 10 happen only when nf = even */ - *Ps = PSiso + (nf - 1.0) * PSsha; - *Pd = nf * PDsha; - *As = ASiso + (nf - 1.0) * ASsha; - *Ad = nf * ADsha; - break; - case 10: - *Ps = nf * PSsha; - *Pd = PDiso + (nf - 1.0) * PDsha; - *As = nf * ASsha; - *Ad = ADiso + (nf - 1.0) * ADsha; - break; - default: - printf("Warning: Specified GEO = %d not matched\n", geo); - } -return 0; -} - - -int -BSIM4v5RdseffGeo( -double nf, -int geo, int rgeo, int minSD, -double Weffcj, double Rsh, double DMCG, double DMCI, double DMDG, -int Type, -double *Rtot) -{ -double Rint=0.0, Rend = 0.0; -double nuIntD = 0.0, nuEndD = 0.0, nuIntS = 0.0, nuEndS = 0.0; - - if (geo < 9) /* since geo = 9 and 10 only happen when nf = even */ - { BSIM4v5NumFingerDiff(nf, minSD, &nuIntD, &nuEndD, &nuIntS, &nuEndS); - - /* Internal S/D resistance -- assume shared S or D and all wide contacts */ - if (Type == 1) - { if (nuIntS == 0.0) - Rint = 0.0; - else - Rint = Rsh * DMCG / ( Weffcj * nuIntS); - } - else - { if (nuIntD == 0.0) - Rint = 0.0; - else - Rint = Rsh * DMCG / ( Weffcj * nuIntD); - } - } - - /* End S/D resistance -- geo dependent */ - switch(geo) - { case 0: - if (Type == 1) BSIM4v5RdsEndIso(Weffcj, Rsh, DMCG, DMCI, DMDG, - nuEndS, rgeo, 1, &Rend); - else BSIM4v5RdsEndIso(Weffcj, Rsh, DMCG, DMCI, DMDG, - nuEndD, rgeo, 0, &Rend); - break; - case 1: - if (Type == 1) BSIM4v5RdsEndIso(Weffcj, Rsh, DMCG, DMCI, DMDG, - nuEndS, rgeo, 1, &Rend); - else BSIM4v5RdsEndSha(Weffcj, Rsh, DMCG, DMCI, DMDG, - nuEndD, rgeo, 0, &Rend); - break; - case 2: - if (Type == 1) BSIM4v5RdsEndSha(Weffcj, Rsh, DMCG, DMCI, DMDG, - nuEndS, rgeo, 1, &Rend); - else BSIM4v5RdsEndIso(Weffcj, Rsh, DMCG, DMCI, DMDG, - nuEndD, rgeo, 0, &Rend); - break; - case 3: - if (Type == 1) BSIM4v5RdsEndSha(Weffcj, Rsh, DMCG, DMCI, DMDG, - nuEndS, rgeo, 1, &Rend); - else BSIM4v5RdsEndSha(Weffcj, Rsh, DMCG, DMCI, DMDG, - nuEndD, rgeo, 0, &Rend); - break; - case 4: - if (Type == 1) BSIM4v5RdsEndIso(Weffcj, Rsh, DMCG, DMCI, DMDG, - nuEndS, rgeo, 1, &Rend); - else Rend = Rsh * DMDG / Weffcj; - break; - case 5: - if (Type == 1) BSIM4v5RdsEndSha(Weffcj, Rsh, DMCG, DMCI, DMDG, - nuEndS, rgeo, 1, &Rend); - else Rend = Rsh * DMDG / (Weffcj * nuEndD); - break; - case 6: - if (Type == 1) Rend = Rsh * DMDG / Weffcj; - else BSIM4v5RdsEndIso(Weffcj, Rsh, DMCG, DMCI, DMDG, - nuEndD, rgeo, 0, &Rend); - break; - case 7: - if (Type == 1) Rend = Rsh * DMDG / (Weffcj * nuEndS); - else BSIM4v5RdsEndSha(Weffcj, Rsh, DMCG, DMCI, DMDG, - nuEndD, rgeo, 0, &Rend); - break; - case 8: - Rend = Rsh * DMDG / Weffcj; - break; - case 9: /* all wide contacts assumed for geo = 9 and 10 */ - if (Type == 1) - { Rend = 0.5 * Rsh * DMCG / Weffcj; - if (nf == 2.0) - Rint = 0.0; - else - Rint = Rsh * DMCG / (Weffcj * (nf - 2.0)); - } - else - { Rend = 0.0; - Rint = Rsh * DMCG / (Weffcj * nf); - } - break; - case 10: - if (Type == 1) - { Rend = 0.0; - Rint = Rsh * DMCG / (Weffcj * nf); - } - else - { Rend = 0.5 * Rsh * DMCG / Weffcj;; - if (nf == 2.0) - Rint = 0.0; - else - Rint = Rsh * DMCG / (Weffcj * (nf - 2.0)); - } - break; - default: - printf("Warning: Specified GEO = %d not matched\n", geo); - } - - if (Rint <= 0.0) - *Rtot = Rend; - else if (Rend <= 0.0) - *Rtot = Rint; - else - *Rtot = Rint * Rend / (Rint + Rend); -if(*Rtot==0.0) - printf("Warning: Zero resistance returned from RdseffGeo\n"); -return 0; -} - - -int -BSIM4v5RdsEndIso( -double Weffcj, double Rsh, double DMCG, double DMCI, double DMDG, -double nuEnd, -int rgeo, int Type, -double *Rend) -{ - NG_IGNORE(DMDG); - - if (Type == 1) - { switch(rgeo) - { case 1: - case 2: - case 5: - if (nuEnd == 0.0) - *Rend = 0.0; - else - *Rend = Rsh * DMCG / (Weffcj * nuEnd); - break; - case 3: - case 4: - case 6: - if ((DMCG + DMCI) == 0.0) - printf("(DMCG + DMCI) can not be equal to zero\n"); - if (nuEnd == 0.0) - *Rend = 0.0; - else - *Rend = Rsh * Weffcj / (3.0 * nuEnd * (DMCG + DMCI)); - break; - default: - printf("Warning: Specified RGEO = %d not matched\n", rgeo); - } - } - else - { switch(rgeo) - { case 1: - case 3: - case 7: - if (nuEnd == 0.0) - *Rend = 0.0; - else - *Rend = Rsh * DMCG / (Weffcj * nuEnd); - break; - case 2: - case 4: - case 8: - if ((DMCG + DMCI) == 0.0) - printf("(DMCG + DMCI) can not be equal to zero\n"); - if (nuEnd == 0.0) - *Rend = 0.0; - else - *Rend = Rsh * Weffcj / (3.0 * nuEnd * (DMCG + DMCI)); - break; - default: - printf("Warning: Specified RGEO = %d not matched\n", rgeo); - } - } -return 0; -} - - -int -BSIM4v5RdsEndSha( -double Weffcj, double Rsh, double DMCG, double DMCI, double DMDG, -double nuEnd, -int rgeo, int Type, -double *Rend) -{ - NG_IGNORE(DMCI); - NG_IGNORE(DMDG); - - if (Type == 1) - { switch(rgeo) - { case 1: - case 2: - case 5: - if (nuEnd == 0.0) - *Rend = 0.0; - else - *Rend = Rsh * DMCG / (Weffcj * nuEnd); - break; - case 3: - case 4: - case 6: - if (DMCG == 0.0) - printf("DMCG can not be equal to zero\n"); - if (nuEnd == 0.0) - *Rend = 0.0; - else - *Rend = Rsh * Weffcj / (6.0 * nuEnd * DMCG); - break; - default: - printf("Warning: Specified RGEO = %d not matched\n", rgeo); - } - } - else - { switch(rgeo) - { case 1: - case 3: - case 7: - if (nuEnd == 0.0) - *Rend = 0.0; - else - *Rend = Rsh * DMCG / (Weffcj * nuEnd); - break; - case 2: - case 4: - case 8: - if (DMCG == 0.0) - printf("DMCG can not be equal to zero\n"); - if (nuEnd == 0.0) - *Rend = 0.0; - else - *Rend = Rsh * Weffcj / (6.0 * nuEnd * DMCG); - break; - default: - printf("Warning: Specified RGEO = %d not matched\n", rgeo); - } - } -return 0; -} diff --git a/src/spicelib/devices/bsim4v5/b4v5getic.c b/src/spicelib/devices/bsim4v5/b4v5getic.c deleted file mode 100644 index d4a6a9702..000000000 --- a/src/spicelib/devices/bsim4v5/b4v5getic.c +++ /dev/null @@ -1,44 +0,0 @@ -/**** BSIM4.5.0 Released by Xuemei (Jane) Xi 07/29/2005 ****/ - -/********** - * Copyright 2005 Regents of the University of California. All rights reserved. - * File: b4getic.c of BSIM4.5.0. - * Author: 2000 Weidong Liu - * Authors: 2001- Xuemei Xi, Mohan Dunga, Ali Niknejad, Chenming Hu. - * Project Director: Prof. Chenming Hu. - **********/ - -#include "ngspice/ngspice.h" -#include "ngspice/cktdefs.h" -#include "bsim4v5def.h" -#include "ngspice/sperror.h" -#include "ngspice/suffix.h" - - -int -BSIM4v5getic( -GENmodel *inModel, -CKTcircuit *ckt) -{ -BSIM4v5model *model = (BSIM4v5model*)inModel; -BSIM4v5instance *here; - - for (; model ; model = BSIM4v5nextModel(model)) - { for (here = BSIM4v5instances(model); here; here = BSIM4v5nextInstance(here)) - { - if (!here->BSIM4v5icVDSGiven) - { here->BSIM4v5icVDS = *(ckt->CKTrhs + here->BSIM4v5dNode) - - *(ckt->CKTrhs + here->BSIM4v5sNode); - } - if (!here->BSIM4v5icVGSGiven) - { here->BSIM4v5icVGS = *(ckt->CKTrhs + here->BSIM4v5gNodeExt) - - *(ckt->CKTrhs + here->BSIM4v5sNode); - } - if(!here->BSIM4v5icVBSGiven) - { here->BSIM4v5icVBS = *(ckt->CKTrhs + here->BSIM4v5bNode) - - *(ckt->CKTrhs + here->BSIM4v5sNode); - } - } - } - return(OK); -} diff --git a/src/spicelib/devices/bsim4v5/b4v5ld.c b/src/spicelib/devices/bsim4v5/b4v5ld.c deleted file mode 100644 index d2ebca478..000000000 --- a/src/spicelib/devices/bsim4v5/b4v5ld.c +++ /dev/null @@ -1,5212 +0,0 @@ -/**** BSIM4.5.0 Released by Xuemei (Jane) Xi 07/29/2005 ****/ - -/********** - * Copyright 2005 Regents of the University of California. All rights reserved. - * File: b4ld.c of BSIM4.5.0. - * Author: 2000 Weidong Liu - * Authors: 2001- Xuemei Xi, Mohan Dunga, Ali Niknejad, Chenming Hu. - * Project Director: Prof. Chenming Hu. - * Modified by Xuemei Xi, 04/06/2001. - * Modified by Xuemei Xi, 10/05/2001. - * Modified by Xuemei Xi, 11/15/2002. - * Modified by Xuemei Xi, 05/09/2003. - * Modified by Xuemei Xi, 02/06/2004. - * Modified by Xuemei Xi, Mohan Dunga, 07/29/2005. - **********/ - -#include "ngspice/ngspice.h" -#include "ngspice/cktdefs.h" -#include "bsim4v5def.h" -#include "ngspice/trandefs.h" -#include "ngspice/const.h" -#include "ngspice/sperror.h" -#include "ngspice/devdefs.h" -#include "ngspice/suffix.h" -/* -#define MAX_EXP 2.688117142e+43 -#define MIN_EXP 3.720075976e-44 -#define EXP_THRESHOLD 100.0 -*/ -#define MAX_EXP 5.834617425e14 -#define MIN_EXP 1.713908431e-15 -#define EXP_THRESHOLD 34.0 -#define EPSSI 1.03594e-10 -#define Charge_q 1.60219e-19 -#define DELTA_1 0.02 -#define DELTA_2 0.02 -#define DELTA_3 0.02 -#define DELTA_4 0.02 -#define MM 3 /* smooth coeff */ -#define DEXP(A,B,C) { \ - if (A > EXP_THRESHOLD) { \ - B = MAX_EXP*(1.0+(A)-EXP_THRESHOLD); \ - C = MAX_EXP; \ - } else if (A < -EXP_THRESHOLD) { \ - B = MIN_EXP; \ - C = 0; \ - } else { \ - B = exp(A); \ - C = B; \ - } \ - } - -#ifdef USE_OMP -int BSIM4v5LoadOMP(BSIM4v5instance *here, CKTcircuit *ckt); -void BSIM4v5LoadRhsMat(GENmodel *inModel, CKTcircuit *ckt); -#endif - -int BSIM4v5polyDepletion(double phi, double ngate,double coxe, double Vgs, double *Vgs_eff, double *dVgs_eff_dVg); - -int -BSIM4v5load( -GENmodel *inModel, -CKTcircuit *ckt) -{ -#ifdef USE_OMP - int idx; - BSIM4v5model *model = (BSIM4v5model*)inModel; - int error = 0; - BSIM4v5instance **InstArray; - InstArray = model->BSIM4v5InstanceArray; - -#pragma omp parallel for - for (idx = 0; idx < model->BSIM4v5InstCount; idx++) { - BSIM4v5instance *here = InstArray[idx]; - int local_error = BSIM4v5LoadOMP(here, ckt); - if (local_error) - error = local_error; - } - - BSIM4v5LoadRhsMat(inModel, ckt); - - return error; -} - - -int BSIM4v5LoadOMP(BSIM4v5instance *here, CKTcircuit *ckt) { -BSIM4v5model *model = BSIM4v5modPtr(here); -#else -BSIM4v5model *model = (BSIM4v5model*)inModel; -BSIM4v5instance *here; -#endif - -double ceqgstot, dgstot_dvd, dgstot_dvg, dgstot_dvs, dgstot_dvb; -double ceqgdtot, dgdtot_dvd, dgdtot_dvg, dgdtot_dvs, dgdtot_dvb; -double gstot, gstotd, gstotg, gstots, gstotb, gspr, Rs, Rd; -double gdtot, gdtotd, gdtotg, gdtots, gdtotb, gdpr; -double vgs_eff, vgd_eff, dvgs_eff_dvg, dvgd_eff_dvg; -double dRs_dvg, dRd_dvg, dRs_dvb, dRd_dvb; -double dT0_dvg, dT1_dvb, dT3_dvg, dT3_dvb; -double vses, vdes, vdedo, delvses, delvded, delvdes; -double Isestot=0.0, cseshat=0.0, Idedtot=0.0, cdedhat=0.0; -#ifndef NEWCONV -double tol0, tol1, tol2, tol3, tol4, tol5, tol6; -#endif - -double geltd, gcrg, gcrgg, gcrgd, gcrgs, gcrgb, ceqgcrg; -double vges, vgms, vgedo, vgmdo, vged, vgmd, delvged, delvgmd; -double delvges, delvgms, vgmb; -double gcgmgmb=0.0, gcgmdb=0.0, gcgmsb=0.0, gcdgmb, gcsgmb; -double gcgmbb=0.0, gcbgmb, qgmb, qgmid=0.0, ceqqgmid; - -double vbd, vbs, vds, vgb, vgd, vgs, vgdo; -#ifndef PREDICTOR -double xfact; -#endif -double vdbs, vdbd, vsbs, vsbdo, vsbd; -double delvdbs, delvdbd, delvsbs; -double delvbd_jct, delvbs_jct, vbs_jct, vbd_jct; - -double SourceSatCurrent, DrainSatCurrent; -double ag0, qgb, von, cbhat=0.0, VgstNVt, ExpVgst; -double ceqqb, ceqqd, ceqqg, ceqqjd=0.0, ceqqjs=0.0, ceq, geq; -double cdrain, cdhat=0.0, ceqdrn, ceqbd, ceqbs, ceqjd, ceqjs, gjbd, gjbs; -double czbd, czbdsw, czbdswg, czbs, czbssw, czbsswg, evbd, evbs, arg, sarg; -double delvbd, delvbs, delvds, delvgd, delvgs; -double Vfbeff, dVfbeff_dVg, dVfbeff_dVb, V3, V4; -double gcbdb, gcbgb, gcbsb, gcddb, gcdgb, gcdsb, gcgdb, gcggb, gcgsb, gcsdb; -double gcgbb, gcdbb, gcsbb, gcbbb; -double gcdbdb, gcsbsb; -double gcsgb, gcssb, MJD, MJSWD, MJSWGD, MJS, MJSWS, MJSWGS; -double qgate=0.0, qbulk=0.0, qdrn=0.0, qsrc, cqgate, cqbody, cqdrn; -double Vdb, Vds, Vgs, Vbs, Gmbs, FwdSum, RevSum; -double Igidl, Ggidld, Ggidlg, Ggidlb; -double Voxacc=0.0, dVoxacc_dVg=0.0, dVoxacc_dVb=0.0; -double Voxdepinv=0.0, dVoxdepinv_dVg=0.0, dVoxdepinv_dVd=0.0, dVoxdepinv_dVb=0.0; -double VxNVt=0.0, ExpVxNVt, Vaux=0.0, dVaux_dVg=0.0, dVaux_dVd=0.0, dVaux_dVb=0.0; -double Igc, dIgc_dVg, dIgc_dVd, dIgc_dVb; -double Igcs, dIgcs_dVg, dIgcs_dVd, dIgcs_dVb; -double Igcd, dIgcd_dVg, dIgcd_dVd, dIgcd_dVb; -double Igs, dIgs_dVg, dIgs_dVs, Igd, dIgd_dVg, dIgd_dVd; -double Igbacc, dIgbacc_dVg, dIgbacc_dVb; -double Igbinv, dIgbinv_dVg, dIgbinv_dVd, dIgbinv_dVb; -double Pigcd, dPigcd_dVg, dPigcd_dVd, dPigcd_dVb; -double Istoteq, gIstotg, gIstotd, gIstots, gIstotb; -double Idtoteq, gIdtotg, gIdtotd, gIdtots, gIdtotb; -double Ibtoteq, gIbtotg, gIbtotd, gIbtots, gIbtotb; -double Igtoteq, gIgtotg, gIgtotd, gIgtots, gIgtotb; -double Igstot=0.0, cgshat=0.0, Igdtot=0.0, cgdhat=0.0, Igbtot=0.0, cgbhat=0.0; -double Vgs_eff, Vfb=0.0, Vth_NarrowW; -double Phis, dPhis_dVb, sqrtPhis, dsqrtPhis_dVb, Vth, dVth_dVb, dVth_dVd; -double Vgst, dVgst_dVg, dVgst_dVb, dVgs_eff_dVg, Nvtms, Nvtmd; -double Vtm, Vtm0; -double n, dn_dVb, dn_dVd, voffcv, noff, dnoff_dVd, dnoff_dVb; -double V0, CoxWLcen, QovCox, LINK; -double DeltaPhi, dDeltaPhi_dVg, VgDP, dVgDP_dVg; -double Cox, Tox, Tcen, dTcen_dVg, dTcen_dVd, dTcen_dVb; -double Ccen, Coxeff, dCoxeff_dVd, dCoxeff_dVg, dCoxeff_dVb; -double Denomi, dDenomi_dVg, dDenomi_dVd, dDenomi_dVb; -double ueff, dueff_dVg, dueff_dVd, dueff_dVb; -double Esat, Vdsat; -double EsatL, dEsatL_dVg, dEsatL_dVd, dEsatL_dVb; -double dVdsat_dVg, dVdsat_dVb, dVdsat_dVd, Vasat, dAlphaz_dVg, dAlphaz_dVb; -double dVasat_dVg, dVasat_dVb, dVasat_dVd, Va, dVa_dVd, dVa_dVg, dVa_dVb; -double Vbseff, dVbseff_dVb, VbseffCV, dVbseffCV_dVb; -double Arg1, One_Third_CoxWL, Two_Third_CoxWL, Alphaz, CoxWL; -double T0=0.0, dT0_dVg, dT0_dVd, dT0_dVb; -double T1, dT1_dVg, dT1_dVd, dT1_dVb; -double T2, dT2_dVg, dT2_dVd, dT2_dVb; -double T3, dT3_dVg, dT3_dVd, dT3_dVb; -double T4, dT4_dVd, dT4_dVb; -double T5, dT5_dVg, dT5_dVd, dT5_dVb; -double T6, dT6_dVg, dT6_dVd, dT6_dVb; -double T7, dT7_dVg, dT7_dVd, dT7_dVb; -double T8, dT8_dVg, dT8_dVd, dT8_dVb; -double T9, dT9_dVg, dT9_dVd, dT9_dVb; -double T10, dT10_dVg, dT10_dVb, dT10_dVd; -double T11, T12, T13, T14; -double tmp, Abulk, dAbulk_dVb, Abulk0, dAbulk0_dVb; -double Cclm, dCclm_dVg, dCclm_dVd, dCclm_dVb; -double FP, dFP_dVg, PvagTerm, dPvagTerm_dVg, dPvagTerm_dVd, dPvagTerm_dVb; -double VADITS, dVADITS_dVg, dVADITS_dVd; -double Lpe_Vb, dDITS_Sft_dVb, dDITS_Sft_dVd; -double VACLM, dVACLM_dVg, dVACLM_dVd, dVACLM_dVb; -double VADIBL, dVADIBL_dVg, dVADIBL_dVd, dVADIBL_dVb; -double Xdep, dXdep_dVb, lt1, dlt1_dVb, ltw, dltw_dVb, Delt_vth, dDelt_vth_dVb; -double Theta0, dTheta0_dVb; -double TempRatio, tmp1, tmp2, tmp3, tmp4; -double DIBL_Sft, dDIBL_Sft_dVd, Lambda, dLambda_dVg; -double Idtot, Ibtot, a1, ScalingFactor; - -double Vgsteff, dVgsteff_dVg, dVgsteff_dVd, dVgsteff_dVb; -double Vdseff, dVdseff_dVg, dVdseff_dVd, dVdseff_dVb; -double VdseffCV, dVdseffCV_dVg, dVdseffCV_dVd, dVdseffCV_dVb; -double diffVds, dAbulk_dVg; -double beta, dbeta_dVg, dbeta_dVd, dbeta_dVb; -double gche, dgche_dVg, dgche_dVd, dgche_dVb; -double fgche1, dfgche1_dVg, dfgche1_dVd, dfgche1_dVb; -double fgche2, dfgche2_dVg, dfgche2_dVd, dfgche2_dVb; -double Idl, dIdl_dVg, dIdl_dVd, dIdl_dVb; -double Idsa, dIdsa_dVg, dIdsa_dVd, dIdsa_dVb; -double Ids, Gm, Gds, Gmb, devbs_dvb, devbd_dvb; -double Isub, Gbd, Gbg, Gbb; -double VASCBE, dVASCBE_dVg, dVASCBE_dVd, dVASCBE_dVb; -double CoxeffWovL; -double Rds, dRds_dVg, dRds_dVb, WVCox, WVCoxRds; -double Vgst2Vtm, VdsatCV; -double Leff, Weff, dWeff_dVg, dWeff_dVb; -double AbulkCV, dAbulkCV_dVb; -double qcheq, qdef, gqdef=0.0, cqdef=0.0, cqcheq=0.0; -double gcqdb=0.0, gcqsb=0.0, gcqgb=0.0, gcqbb=0.0; -double dxpart, sxpart, ggtg, ggtd, ggts, ggtb; -double ddxpart_dVd, ddxpart_dVg, ddxpart_dVb, ddxpart_dVs; -double dsxpart_dVd, dsxpart_dVg, dsxpart_dVb, dsxpart_dVs; -double gbspsp, gbbdp, gbbsp, gbspg, gbspb, gbspdp; -double gbdpdp, gbdpg, gbdpb, gbdpsp; -double qgdo, qgso, cgdo, cgso; -double Cgg, Cgd, Cgb, Cdg, Cdd, Cds; -double Csg, Csd, Css, Csb, Cbg, Cbd, Cbb; -double Cgg1, Cgb1, Cgd1, Cbg1, Cbb1, Cbd1, Qac0, Qsub0; -double dQac0_dVg, dQac0_dVb, dQsub0_dVg, dQsub0_dVd, dQsub0_dVb; -double ggidld, ggidlg, ggidlb, ggislg, ggislb, ggisls; -double Igisl, Ggislg, Ggislb, Ggisls; -double Nvtmrs, Nvtmrssw, Nvtmrsswg; - -double vs, Fsevl, dvs_dVg, dvs_dVd, dvs_dVb, dFsevl_dVg, dFsevl_dVd, dFsevl_dVb; -double vgdx, vgsx; -struct bsim4v5SizeDependParam *pParam; -int ByPass, ChargeComputationNeeded, error, Check, Check1, Check2; - - double m; - -ScalingFactor = 1.0e-9; -ChargeComputationNeeded = - ((ckt->CKTmode & (MODEDCTRANCURVE | MODEAC | MODETRAN | MODEINITSMSIG)) || - ((ckt->CKTmode & MODETRANOP) && (ckt->CKTmode & MODEUIC))) - ? 1 : 0; - -#ifndef USE_OMP -for (; model != NULL; model = BSIM4v5nextModel(model)) -{ for (here = BSIM4v5instances(model); here != NULL; - here = BSIM4v5nextInstance(here)) - { -#endif - - Check = Check1 = Check2 = 1; - ByPass = 0; - pParam = here->pParam; - - if ((ckt->CKTmode & MODEINITSMSIG)) - { vds = *(ckt->CKTstate0 + here->BSIM4v5vds); - vgs = *(ckt->CKTstate0 + here->BSIM4v5vgs); - vbs = *(ckt->CKTstate0 + here->BSIM4v5vbs); - vges = *(ckt->CKTstate0 + here->BSIM4v5vges); - vgms = *(ckt->CKTstate0 + here->BSIM4v5vgms); - vdbs = *(ckt->CKTstate0 + here->BSIM4v5vdbs); - vsbs = *(ckt->CKTstate0 + here->BSIM4v5vsbs); - vses = *(ckt->CKTstate0 + here->BSIM4v5vses); - vdes = *(ckt->CKTstate0 + here->BSIM4v5vdes); - - qdef = *(ckt->CKTstate0 + here->BSIM4v5qdef); - } - else if ((ckt->CKTmode & MODEINITTRAN)) - { vds = *(ckt->CKTstate1 + here->BSIM4v5vds); - vgs = *(ckt->CKTstate1 + here->BSIM4v5vgs); - vbs = *(ckt->CKTstate1 + here->BSIM4v5vbs); - vges = *(ckt->CKTstate1 + here->BSIM4v5vges); - vgms = *(ckt->CKTstate1 + here->BSIM4v5vgms); - vdbs = *(ckt->CKTstate1 + here->BSIM4v5vdbs); - vsbs = *(ckt->CKTstate1 + here->BSIM4v5vsbs); - vses = *(ckt->CKTstate1 + here->BSIM4v5vses); - vdes = *(ckt->CKTstate1 + here->BSIM4v5vdes); - - qdef = *(ckt->CKTstate1 + here->BSIM4v5qdef); - } - else if ((ckt->CKTmode & MODEINITJCT) && !here->BSIM4v5off) - { vds = model->BSIM4v5type * here->BSIM4v5icVDS; - vgs = vges = vgms = model->BSIM4v5type * here->BSIM4v5icVGS; - vbs = vdbs = vsbs = model->BSIM4v5type * here->BSIM4v5icVBS; - if (vds > 0.0) - { vdes = vds + 0.01; - vses = -0.01; - } - else if (vds < 0.0) - { vdes = vds - 0.01; - vses = 0.01; - } - else - vdes = vses = 0.0; - - qdef = 0.0; - - if ((vds == 0.0) && (vgs == 0.0) && (vbs == 0.0) && - ((ckt->CKTmode & (MODETRAN | MODEAC|MODEDCOP | - MODEDCTRANCURVE)) || (!(ckt->CKTmode & MODEUIC)))) - { vds = 0.1; - vdes = 0.11; - vses = -0.01; - vgs = vges = vgms = model->BSIM4v5type - * here->BSIM4v5vth0 + 0.1; - vbs = vdbs = vsbs = 0.0; - } - } - else if ((ckt->CKTmode & (MODEINITJCT | MODEINITFIX)) && - (here->BSIM4v5off)) - { vds = vgs = vbs = vges = vgms = 0.0; - vdbs = vsbs = vdes = vses = qdef = 0.0; - } - else - { -#ifndef PREDICTOR - if ((ckt->CKTmode & MODEINITPRED)) - { xfact = ckt->CKTdelta / ckt->CKTdeltaOld[1]; - *(ckt->CKTstate0 + here->BSIM4v5vds) = - *(ckt->CKTstate1 + here->BSIM4v5vds); - vds = (1.0 + xfact)* (*(ckt->CKTstate1 + here->BSIM4v5vds)) - - (xfact * (*(ckt->CKTstate2 + here->BSIM4v5vds))); - *(ckt->CKTstate0 + here->BSIM4v5vgs) = - *(ckt->CKTstate1 + here->BSIM4v5vgs); - vgs = (1.0 + xfact)* (*(ckt->CKTstate1 + here->BSIM4v5vgs)) - - (xfact * (*(ckt->CKTstate2 + here->BSIM4v5vgs))); - *(ckt->CKTstate0 + here->BSIM4v5vges) = - *(ckt->CKTstate1 + here->BSIM4v5vges); - vges = (1.0 + xfact)* (*(ckt->CKTstate1 + here->BSIM4v5vges)) - - (xfact * (*(ckt->CKTstate2 + here->BSIM4v5vges))); - *(ckt->CKTstate0 + here->BSIM4v5vgms) = - *(ckt->CKTstate1 + here->BSIM4v5vgms); - vgms = (1.0 + xfact)* (*(ckt->CKTstate1 + here->BSIM4v5vgms)) - - (xfact * (*(ckt->CKTstate2 + here->BSIM4v5vgms))); - *(ckt->CKTstate0 + here->BSIM4v5vbs) = - *(ckt->CKTstate1 + here->BSIM4v5vbs); - vbs = (1.0 + xfact)* (*(ckt->CKTstate1 + here->BSIM4v5vbs)) - - (xfact * (*(ckt->CKTstate2 + here->BSIM4v5vbs))); - *(ckt->CKTstate0 + here->BSIM4v5vbd) = - *(ckt->CKTstate0 + here->BSIM4v5vbs) - - *(ckt->CKTstate0 + here->BSIM4v5vds); - *(ckt->CKTstate0 + here->BSIM4v5vdbs) = - *(ckt->CKTstate1 + here->BSIM4v5vdbs); - vdbs = (1.0 + xfact)* (*(ckt->CKTstate1 + here->BSIM4v5vdbs)) - - (xfact * (*(ckt->CKTstate2 + here->BSIM4v5vdbs))); - *(ckt->CKTstate0 + here->BSIM4v5vdbd) = - *(ckt->CKTstate0 + here->BSIM4v5vdbs) - - *(ckt->CKTstate0 + here->BSIM4v5vds); - *(ckt->CKTstate0 + here->BSIM4v5vsbs) = - *(ckt->CKTstate1 + here->BSIM4v5vsbs); - vsbs = (1.0 + xfact)* (*(ckt->CKTstate1 + here->BSIM4v5vsbs)) - - (xfact * (*(ckt->CKTstate2 + here->BSIM4v5vsbs))); - *(ckt->CKTstate0 + here->BSIM4v5vses) = - *(ckt->CKTstate1 + here->BSIM4v5vses); - vses = (1.0 + xfact)* (*(ckt->CKTstate1 + here->BSIM4v5vses)) - - (xfact * (*(ckt->CKTstate2 + here->BSIM4v5vses))); - *(ckt->CKTstate0 + here->BSIM4v5vdes) = - *(ckt->CKTstate1 + here->BSIM4v5vdes); - vdes = (1.0 + xfact)* (*(ckt->CKTstate1 + here->BSIM4v5vdes)) - - (xfact * (*(ckt->CKTstate2 + here->BSIM4v5vdes))); - - *(ckt->CKTstate0 + here->BSIM4v5qdef) = - *(ckt->CKTstate1 + here->BSIM4v5qdef); - qdef = (1.0 + xfact)* (*(ckt->CKTstate1 + here->BSIM4v5qdef)) - -(xfact * (*(ckt->CKTstate2 + here->BSIM4v5qdef))); - } - else - { -#endif /* PREDICTOR */ - vds = model->BSIM4v5type - * (*(ckt->CKTrhsOld + here->BSIM4v5dNodePrime) - - *(ckt->CKTrhsOld + here->BSIM4v5sNodePrime)); - vgs = model->BSIM4v5type - * (*(ckt->CKTrhsOld + here->BSIM4v5gNodePrime) - - *(ckt->CKTrhsOld + here->BSIM4v5sNodePrime)); - vbs = model->BSIM4v5type - * (*(ckt->CKTrhsOld + here->BSIM4v5bNodePrime) - - *(ckt->CKTrhsOld + here->BSIM4v5sNodePrime)); - vges = model->BSIM4v5type - * (*(ckt->CKTrhsOld + here->BSIM4v5gNodeExt) - - *(ckt->CKTrhsOld + here->BSIM4v5sNodePrime)); - vgms = model->BSIM4v5type - * (*(ckt->CKTrhsOld + here->BSIM4v5gNodeMid) - - *(ckt->CKTrhsOld + here->BSIM4v5sNodePrime)); - vdbs = model->BSIM4v5type - * (*(ckt->CKTrhsOld + here->BSIM4v5dbNode) - - *(ckt->CKTrhsOld + here->BSIM4v5sNodePrime)); - vsbs = model->BSIM4v5type - * (*(ckt->CKTrhsOld + here->BSIM4v5sbNode) - - *(ckt->CKTrhsOld + here->BSIM4v5sNodePrime)); - vses = model->BSIM4v5type - * (*(ckt->CKTrhsOld + here->BSIM4v5sNode) - - *(ckt->CKTrhsOld + here->BSIM4v5sNodePrime)); - vdes = model->BSIM4v5type - * (*(ckt->CKTrhsOld + here->BSIM4v5dNode) - - *(ckt->CKTrhsOld + here->BSIM4v5sNodePrime)); - qdef = model->BSIM4v5type - * (*(ckt->CKTrhsOld + here->BSIM4v5qNode)); -#ifndef PREDICTOR - } -#endif /* PREDICTOR */ - - vgdo = *(ckt->CKTstate0 + here->BSIM4v5vgs) - - *(ckt->CKTstate0 + here->BSIM4v5vds); - vgedo = *(ckt->CKTstate0 + here->BSIM4v5vges) - - *(ckt->CKTstate0 + here->BSIM4v5vds); - vgmdo = *(ckt->CKTstate0 + here->BSIM4v5vgms) - - *(ckt->CKTstate0 + here->BSIM4v5vds); - - vbd = vbs - vds; - vdbd = vdbs - vds; - vgd = vgs - vds; - vged = vges - vds; - vgmd = vgms - vds; - - delvbd = vbd - *(ckt->CKTstate0 + here->BSIM4v5vbd); - delvdbd = vdbd - *(ckt->CKTstate0 + here->BSIM4v5vdbd); - delvgd = vgd - vgdo; - delvged = vged - vgedo; - delvgmd = vgmd - vgmdo; - - delvds = vds - *(ckt->CKTstate0 + here->BSIM4v5vds); - delvgs = vgs - *(ckt->CKTstate0 + here->BSIM4v5vgs); - delvges = vges - *(ckt->CKTstate0 + here->BSIM4v5vges); - delvgms = vgms - *(ckt->CKTstate0 + here->BSIM4v5vgms); - delvbs = vbs - *(ckt->CKTstate0 + here->BSIM4v5vbs); - delvdbs = vdbs - *(ckt->CKTstate0 + here->BSIM4v5vdbs); - delvsbs = vsbs - *(ckt->CKTstate0 + here->BSIM4v5vsbs); - - delvses = vses - (*(ckt->CKTstate0 + here->BSIM4v5vses)); - vdedo = *(ckt->CKTstate0 + here->BSIM4v5vdes) - - *(ckt->CKTstate0 + here->BSIM4v5vds); - delvdes = vdes - *(ckt->CKTstate0 + here->BSIM4v5vdes); - delvded = vdes - vds - vdedo; - - delvbd_jct = (!here->BSIM4v5rbodyMod) ? delvbd : delvdbd; - delvbs_jct = (!here->BSIM4v5rbodyMod) ? delvbs : delvsbs; - if (here->BSIM4v5mode >= 0) - { Idtot = here->BSIM4v5cd + here->BSIM4v5csub - here->BSIM4v5cbd - + here->BSIM4v5Igidl; - cdhat = Idtot - here->BSIM4v5gbd * delvbd_jct - + (here->BSIM4v5gmbs + here->BSIM4v5gbbs + here->BSIM4v5ggidlb) * delvbs - + (here->BSIM4v5gm + here->BSIM4v5gbgs + here->BSIM4v5ggidlg) * delvgs - + (here->BSIM4v5gds + here->BSIM4v5gbds + here->BSIM4v5ggidld) * delvds; - Ibtot = here->BSIM4v5cbs + here->BSIM4v5cbd - - here->BSIM4v5Igidl - here->BSIM4v5Igisl - here->BSIM4v5csub; - cbhat = Ibtot + here->BSIM4v5gbd * delvbd_jct - + here->BSIM4v5gbs * delvbs_jct - (here->BSIM4v5gbbs + here->BSIM4v5ggidlb) - * delvbs - (here->BSIM4v5gbgs + here->BSIM4v5ggidlg) * delvgs - - (here->BSIM4v5gbds + here->BSIM4v5ggidld - here->BSIM4v5ggisls) * delvds - - here->BSIM4v5ggislg * delvgd - here->BSIM4v5ggislb* delvbd; - - Igstot = here->BSIM4v5Igs + here->BSIM4v5Igcs; - cgshat = Igstot + (here->BSIM4v5gIgsg + here->BSIM4v5gIgcsg) * delvgs - + here->BSIM4v5gIgcsd * delvds + here->BSIM4v5gIgcsb * delvbs; - - Igdtot = here->BSIM4v5Igd + here->BSIM4v5Igcd; - cgdhat = Igdtot + here->BSIM4v5gIgdg * delvgd + here->BSIM4v5gIgcdg * delvgs - + here->BSIM4v5gIgcdd * delvds + here->BSIM4v5gIgcdb * delvbs; - - Igbtot = here->BSIM4v5Igb; - cgbhat = here->BSIM4v5Igb + here->BSIM4v5gIgbg * delvgs + here->BSIM4v5gIgbd - * delvds + here->BSIM4v5gIgbb * delvbs; - } - else - { Idtot = here->BSIM4v5cd + here->BSIM4v5cbd - here->BSIM4v5Igidl; /* bugfix */ - cdhat = Idtot + here->BSIM4v5gbd * delvbd_jct + here->BSIM4v5gmbs - * delvbd + here->BSIM4v5gm * delvgd - - (here->BSIM4v5gds + here->BSIM4v5ggidls) * delvds - - here->BSIM4v5ggidlg * delvgs - here->BSIM4v5ggidlb * delvbs; - Ibtot = here->BSIM4v5cbs + here->BSIM4v5cbd - - here->BSIM4v5Igidl - here->BSIM4v5Igisl - here->BSIM4v5csub; - cbhat = Ibtot + here->BSIM4v5gbs * delvbs_jct + here->BSIM4v5gbd - * delvbd_jct - (here->BSIM4v5gbbs + here->BSIM4v5ggislb) * delvbd - - (here->BSIM4v5gbgs + here->BSIM4v5ggislg) * delvgd - + (here->BSIM4v5gbds + here->BSIM4v5ggisld - here->BSIM4v5ggidls) * delvds - - here->BSIM4v5ggidlg * delvgs - here->BSIM4v5ggidlb * delvbs; - - Igstot = here->BSIM4v5Igs + here->BSIM4v5Igcd; - cgshat = Igstot + here->BSIM4v5gIgsg * delvgs + here->BSIM4v5gIgcdg * delvgd - - here->BSIM4v5gIgcdd * delvds + here->BSIM4v5gIgcdb * delvbd; - - Igdtot = here->BSIM4v5Igd + here->BSIM4v5Igcs; - cgdhat = Igdtot + (here->BSIM4v5gIgdg + here->BSIM4v5gIgcsg) * delvgd - - here->BSIM4v5gIgcsd * delvds + here->BSIM4v5gIgcsb * delvbd; - - Igbtot = here->BSIM4v5Igb; - cgbhat = here->BSIM4v5Igb + here->BSIM4v5gIgbg * delvgd - here->BSIM4v5gIgbd - * delvds + here->BSIM4v5gIgbb * delvbd; - } - - Isestot = here->BSIM4v5gstot * (*(ckt->CKTstate0 + here->BSIM4v5vses)); - cseshat = Isestot + here->BSIM4v5gstot * delvses - + here->BSIM4v5gstotd * delvds + here->BSIM4v5gstotg * delvgs - + here->BSIM4v5gstotb * delvbs; - - Idedtot = here->BSIM4v5gdtot * vdedo; - cdedhat = Idedtot + here->BSIM4v5gdtot * delvded - + here->BSIM4v5gdtotd * delvds + here->BSIM4v5gdtotg * delvgs - + here->BSIM4v5gdtotb * delvbs; - - -#ifndef NOBYPASS - /* Following should be one IF statement, but some C compilers - * can't handle that all at once, so we split it into several - * successive IF's */ - - if ((!(ckt->CKTmode & MODEINITPRED)) && (ckt->CKTbypass)) - if ((fabs(delvds) < (ckt->CKTreltol * MAX(fabs(vds), - fabs(*(ckt->CKTstate0 + here->BSIM4v5vds))) + ckt->CKTvoltTol))) - if ((fabs(delvgs) < (ckt->CKTreltol * MAX(fabs(vgs), - fabs(*(ckt->CKTstate0 + here->BSIM4v5vgs))) + ckt->CKTvoltTol))) - if ((fabs(delvbs) < (ckt->CKTreltol * MAX(fabs(vbs), - fabs(*(ckt->CKTstate0 + here->BSIM4v5vbs))) + ckt->CKTvoltTol))) - if ((fabs(delvbd) < (ckt->CKTreltol * MAX(fabs(vbd), - fabs(*(ckt->CKTstate0 + here->BSIM4v5vbd))) + ckt->CKTvoltTol))) - if ((here->BSIM4v5rgateMod == 0) || (here->BSIM4v5rgateMod == 1) - || (fabs(delvges) < (ckt->CKTreltol * MAX(fabs(vges), - fabs(*(ckt->CKTstate0 + here->BSIM4v5vges))) + ckt->CKTvoltTol))) - if ((here->BSIM4v5rgateMod != 3) || (fabs(delvgms) < (ckt->CKTreltol - * MAX(fabs(vgms), fabs(*(ckt->CKTstate0 + here->BSIM4v5vgms))) - + ckt->CKTvoltTol))) - if ((!here->BSIM4v5rbodyMod) || (fabs(delvdbs) < (ckt->CKTreltol - * MAX(fabs(vdbs), fabs(*(ckt->CKTstate0 + here->BSIM4v5vdbs))) - + ckt->CKTvoltTol))) - if ((!here->BSIM4v5rbodyMod) || (fabs(delvdbd) < (ckt->CKTreltol - * MAX(fabs(vdbd), fabs(*(ckt->CKTstate0 + here->BSIM4v5vdbd))) - + ckt->CKTvoltTol))) - if ((!here->BSIM4v5rbodyMod) || (fabs(delvsbs) < (ckt->CKTreltol - * MAX(fabs(vsbs), fabs(*(ckt->CKTstate0 + here->BSIM4v5vsbs))) - + ckt->CKTvoltTol))) - if ((!model->BSIM4v5rdsMod) || (fabs(delvses) < (ckt->CKTreltol - * MAX(fabs(vses), fabs(*(ckt->CKTstate0 + here->BSIM4v5vses))) - + ckt->CKTvoltTol))) - if ((!model->BSIM4v5rdsMod) || (fabs(delvdes) < (ckt->CKTreltol - * MAX(fabs(vdes), fabs(*(ckt->CKTstate0 + here->BSIM4v5vdes))) - + ckt->CKTvoltTol))) - if ((fabs(cdhat - Idtot) < ckt->CKTreltol - * MAX(fabs(cdhat), fabs(Idtot)) + ckt->CKTabstol)) - if ((fabs(cbhat - Ibtot) < ckt->CKTreltol - * MAX(fabs(cbhat), fabs(Ibtot)) + ckt->CKTabstol)) - if ((!model->BSIM4v5igcMod) || ((fabs(cgshat - Igstot) < ckt->CKTreltol - * MAX(fabs(cgshat), fabs(Igstot)) + ckt->CKTabstol))) - if ((!model->BSIM4v5igcMod) || ((fabs(cgdhat - Igdtot) < ckt->CKTreltol - * MAX(fabs(cgdhat), fabs(Igdtot)) + ckt->CKTabstol))) - if ((!model->BSIM4v5igbMod) || ((fabs(cgbhat - Igbtot) < ckt->CKTreltol - * MAX(fabs(cgbhat), fabs(Igbtot)) + ckt->CKTabstol))) - if ((!model->BSIM4v5rdsMod) || ((fabs(cseshat - Isestot) < ckt->CKTreltol - * MAX(fabs(cseshat), fabs(Isestot)) + ckt->CKTabstol))) - if ((!model->BSIM4v5rdsMod) || ((fabs(cdedhat - Idedtot) < ckt->CKTreltol - * MAX(fabs(cdedhat), fabs(Idedtot)) + ckt->CKTabstol))) - { vds = *(ckt->CKTstate0 + here->BSIM4v5vds); - vgs = *(ckt->CKTstate0 + here->BSIM4v5vgs); - vbs = *(ckt->CKTstate0 + here->BSIM4v5vbs); - vges = *(ckt->CKTstate0 + here->BSIM4v5vges); - vgms = *(ckt->CKTstate0 + here->BSIM4v5vgms); - - vbd = *(ckt->CKTstate0 + here->BSIM4v5vbd); - vdbs = *(ckt->CKTstate0 + here->BSIM4v5vdbs); - vdbd = *(ckt->CKTstate0 + here->BSIM4v5vdbd); - vsbs = *(ckt->CKTstate0 + here->BSIM4v5vsbs); - vses = *(ckt->CKTstate0 + here->BSIM4v5vses); - vdes = *(ckt->CKTstate0 + here->BSIM4v5vdes); - - vgd = vgs - vds; - vgb = vgs - vbs; - vged = vges - vds; - vgmd = vgms - vds; - vgmb = vgms - vbs; - - vbs_jct = (!here->BSIM4v5rbodyMod) ? vbs : vsbs; - vbd_jct = (!here->BSIM4v5rbodyMod) ? vbd : vdbd; - -/*** qdef should not be kept fixed even if vgs, vds & vbs has converged -**** qdef = *(ckt->CKTstate0 + here->BSIM4v5qdef); -***/ - cdrain = here->BSIM4v5cd; - - if ((ckt->CKTmode & (MODETRAN | MODEAC)) || - ((ckt->CKTmode & MODETRANOP) && - (ckt->CKTmode & MODEUIC))) - { ByPass = 1; - - qgate = here->BSIM4v5qgate; - qbulk = here->BSIM4v5qbulk; - qdrn = here->BSIM4v5qdrn; - cgdo = here->BSIM4v5cgdo; - qgdo = here->BSIM4v5qgdo; - cgso = here->BSIM4v5cgso; - qgso = here->BSIM4v5qgso; - - goto line755; - } - else - goto line850; - } -#endif /*NOBYPASS*/ - - von = here->BSIM4v5von; - if (*(ckt->CKTstate0 + here->BSIM4v5vds) >= 0.0) - { vgs = DEVfetlim(vgs, *(ckt->CKTstate0 + here->BSIM4v5vgs), von); - vds = vgs - vgd; - vds = DEVlimvds(vds, *(ckt->CKTstate0 + here->BSIM4v5vds)); - vgd = vgs - vds; - if (here->BSIM4v5rgateMod == 3) - { vges = DEVfetlim(vges, *(ckt->CKTstate0 + here->BSIM4v5vges), von); - vgms = DEVfetlim(vgms, *(ckt->CKTstate0 + here->BSIM4v5vgms), von); - vged = vges - vds; - vgmd = vgms - vds; - } - else if ((here->BSIM4v5rgateMod == 1) || (here->BSIM4v5rgateMod == 2)) - { vges = DEVfetlim(vges, *(ckt->CKTstate0 + here->BSIM4v5vges), von); - vged = vges - vds; - } - - if (model->BSIM4v5rdsMod) - { vdes = DEVlimvds(vdes, *(ckt->CKTstate0 + here->BSIM4v5vdes)); - vses = -DEVlimvds(-vses, -(*(ckt->CKTstate0 + here->BSIM4v5vses))); - } - - } - else - { vgd = DEVfetlim(vgd, vgdo, von); - vds = vgs - vgd; - vds = -DEVlimvds(-vds, -(*(ckt->CKTstate0 + here->BSIM4v5vds))); - vgs = vgd + vds; - - if (here->BSIM4v5rgateMod == 3) - { vged = DEVfetlim(vged, vgedo, von); - vges = vged + vds; - vgmd = DEVfetlim(vgmd, vgmdo, von); - vgms = vgmd + vds; - } - if ((here->BSIM4v5rgateMod == 1) || (here->BSIM4v5rgateMod == 2)) - { vged = DEVfetlim(vged, vgedo, von); - vges = vged + vds; - } - - if (model->BSIM4v5rdsMod) - { vdes = -DEVlimvds(-vdes, -(*(ckt->CKTstate0 + here->BSIM4v5vdes))); - vses = DEVlimvds(vses, *(ckt->CKTstate0 + here->BSIM4v5vses)); - } - } - - if (vds >= 0.0) - { vbs = DEVpnjlim(vbs, *(ckt->CKTstate0 + here->BSIM4v5vbs), - CONSTvt0, model->BSIM4v5vcrit, &Check); - vbd = vbs - vds; - if (here->BSIM4v5rbodyMod) - { vdbs = DEVpnjlim(vdbs, *(ckt->CKTstate0 + here->BSIM4v5vdbs), - CONSTvt0, model->BSIM4v5vcrit, &Check1); - vdbd = vdbs - vds; - vsbs = DEVpnjlim(vsbs, *(ckt->CKTstate0 + here->BSIM4v5vsbs), - CONSTvt0, model->BSIM4v5vcrit, &Check2); - if ((Check1 == 0) && (Check2 == 0)) - Check = 0; - else - Check = 1; - } - } - else - { vbd = DEVpnjlim(vbd, *(ckt->CKTstate0 + here->BSIM4v5vbd), - CONSTvt0, model->BSIM4v5vcrit, &Check); - vbs = vbd + vds; - if (here->BSIM4v5rbodyMod) - { vdbd = DEVpnjlim(vdbd, *(ckt->CKTstate0 + here->BSIM4v5vdbd), - CONSTvt0, model->BSIM4v5vcrit, &Check1); - vdbs = vdbd + vds; - vsbdo = *(ckt->CKTstate0 + here->BSIM4v5vsbs) - - *(ckt->CKTstate0 + here->BSIM4v5vds); - vsbd = vsbs - vds; - vsbd = DEVpnjlim(vsbd, vsbdo, CONSTvt0, model->BSIM4v5vcrit, &Check2); - vsbs = vsbd + vds; - if ((Check1 == 0) && (Check2 == 0)) - Check = 0; - else - Check = 1; - } - } - } - - /* Calculate DC currents and their derivatives */ - vbd = vbs - vds; - vgd = vgs - vds; - vgb = vgs - vbs; - vged = vges - vds; - vgmd = vgms - vds; - vgmb = vgms - vbs; - vdbd = vdbs - vds; - - vbs_jct = (!here->BSIM4v5rbodyMod) ? vbs : vsbs; - vbd_jct = (!here->BSIM4v5rbodyMod) ? vbd : vdbd; - - /* Source/drain junction diode DC model begins */ - Nvtms = model->BSIM4v5vtm * model->BSIM4v5SjctEmissionCoeff; - if ((here->BSIM4v5Aseff <= 0.0) && (here->BSIM4v5Pseff <= 0.0)) - { SourceSatCurrent = 1.0e-14; - } - else - { SourceSatCurrent = here->BSIM4v5Aseff * model->BSIM4v5SjctTempSatCurDensity - + here->BSIM4v5Pseff * model->BSIM4v5SjctSidewallTempSatCurDensity - + pParam->BSIM4v5weffCJ * here->BSIM4v5nf - * model->BSIM4v5SjctGateSidewallTempSatCurDensity; - } - - if (SourceSatCurrent <= 0.0) - { here->BSIM4v5gbs = ckt->CKTgmin; - here->BSIM4v5cbs = here->BSIM4v5gbs * vbs_jct; - } - else - { switch(model->BSIM4v5dioMod) - { case 0: - evbs = exp(vbs_jct / Nvtms); - T1 = model->BSIM4v5xjbvs * exp(-(model->BSIM4v5bvs + vbs_jct) / Nvtms); - /* WDLiu: Magic T1 in this form; different from BSIM4v5 beta. */ - here->BSIM4v5gbs = SourceSatCurrent * (evbs + T1) / Nvtms + ckt->CKTgmin; - here->BSIM4v5cbs = SourceSatCurrent * (evbs + here->BSIM4v5XExpBVS - - T1 - 1.0) + ckt->CKTgmin * vbs_jct; - break; - case 1: - T2 = vbs_jct / Nvtms; - if (T2 < -EXP_THRESHOLD) - { here->BSIM4v5gbs = ckt->CKTgmin; - here->BSIM4v5cbs = SourceSatCurrent * (MIN_EXP - 1.0) - + ckt->CKTgmin * vbs_jct; - } - else if (vbs_jct <= here->BSIM4v5vjsmFwd) - { evbs = exp(T2); - here->BSIM4v5gbs = SourceSatCurrent * evbs / Nvtms + ckt->CKTgmin; - here->BSIM4v5cbs = SourceSatCurrent * (evbs - 1.0) - + ckt->CKTgmin * vbs_jct; - } - else - { T0 = here->BSIM4v5IVjsmFwd / Nvtms; - here->BSIM4v5gbs = T0 + ckt->CKTgmin; - here->BSIM4v5cbs = here->BSIM4v5IVjsmFwd - SourceSatCurrent + T0 - * (vbs_jct - here->BSIM4v5vjsmFwd) + ckt->CKTgmin * vbs_jct; - } - break; - case 2: - if (vbs_jct < here->BSIM4v5vjsmRev) - { T0 = vbs_jct / Nvtms; - if (T0 < -EXP_THRESHOLD) - { evbs = MIN_EXP; - devbs_dvb = 0.0; - } - else - { evbs = exp(T0); - devbs_dvb = evbs / Nvtms; - } - - T1 = evbs - 1.0; - T2 = here->BSIM4v5IVjsmRev + here->BSIM4v5SslpRev - * (vbs_jct - here->BSIM4v5vjsmRev); - here->BSIM4v5gbs = devbs_dvb * T2 + T1 * here->BSIM4v5SslpRev + ckt->CKTgmin; - here->BSIM4v5cbs = T1 * T2 + ckt->CKTgmin * vbs_jct; - } - else if (vbs_jct <= here->BSIM4v5vjsmFwd) - { T0 = vbs_jct / Nvtms; - if (T0 < -EXP_THRESHOLD) - { evbs = MIN_EXP; - devbs_dvb = 0.0; - } - else - { evbs = exp(T0); - devbs_dvb = evbs / Nvtms; - } - - T1 = (model->BSIM4v5bvs + vbs_jct) / Nvtms; - if (T1 > EXP_THRESHOLD) - { T2 = MIN_EXP; - T3 = 0.0; - } - else - { T2 = exp(-T1); - T3 = -T2 /Nvtms; - } - here->BSIM4v5gbs = SourceSatCurrent * (devbs_dvb - model->BSIM4v5xjbvs * T3) - + ckt->CKTgmin; - here->BSIM4v5cbs = SourceSatCurrent * (evbs + here->BSIM4v5XExpBVS - 1.0 - - model->BSIM4v5xjbvs * T2) + ckt->CKTgmin * vbs_jct; - } - else - { here->BSIM4v5gbs = here->BSIM4v5SslpFwd + ckt->CKTgmin; - here->BSIM4v5cbs = here->BSIM4v5IVjsmFwd + here->BSIM4v5SslpFwd * (vbs_jct - - here->BSIM4v5vjsmFwd) + ckt->CKTgmin * vbs_jct; - } - break; - default: break; - } - } - - Nvtmd = model->BSIM4v5vtm * model->BSIM4v5DjctEmissionCoeff; - if ((here->BSIM4v5Adeff <= 0.0) && (here->BSIM4v5Pdeff <= 0.0)) - { DrainSatCurrent = 1.0e-14; - } - else - { DrainSatCurrent = here->BSIM4v5Adeff * model->BSIM4v5DjctTempSatCurDensity - + here->BSIM4v5Pdeff * model->BSIM4v5DjctSidewallTempSatCurDensity - + pParam->BSIM4v5weffCJ * here->BSIM4v5nf - * model->BSIM4v5DjctGateSidewallTempSatCurDensity; - } - - if (DrainSatCurrent <= 0.0) - { here->BSIM4v5gbd = ckt->CKTgmin; - here->BSIM4v5cbd = here->BSIM4v5gbd * vbd_jct; - } - else - { switch(model->BSIM4v5dioMod) - { case 0: - evbd = exp(vbd_jct / Nvtmd); - T1 = model->BSIM4v5xjbvd * exp(-(model->BSIM4v5bvd + vbd_jct) / Nvtmd); - /* WDLiu: Magic T1 in this form; different from BSIM4v5 beta. */ - here->BSIM4v5gbd = DrainSatCurrent * (evbd + T1) / Nvtmd + ckt->CKTgmin; - here->BSIM4v5cbd = DrainSatCurrent * (evbd + here->BSIM4v5XExpBVD - - T1 - 1.0) + ckt->CKTgmin * vbd_jct; - break; - case 1: - T2 = vbd_jct / Nvtmd; - if (T2 < -EXP_THRESHOLD) - { here->BSIM4v5gbd = ckt->CKTgmin; - here->BSIM4v5cbd = DrainSatCurrent * (MIN_EXP - 1.0) - + ckt->CKTgmin * vbd_jct; - } - else if (vbd_jct <= here->BSIM4v5vjdmFwd) - { evbd = exp(T2); - here->BSIM4v5gbd = DrainSatCurrent * evbd / Nvtmd + ckt->CKTgmin; - here->BSIM4v5cbd = DrainSatCurrent * (evbd - 1.0) - + ckt->CKTgmin * vbd_jct; - } - else - { T0 = here->BSIM4v5IVjdmFwd / Nvtmd; - here->BSIM4v5gbd = T0 + ckt->CKTgmin; - here->BSIM4v5cbd = here->BSIM4v5IVjdmFwd - DrainSatCurrent + T0 - * (vbd_jct - here->BSIM4v5vjdmFwd) + ckt->CKTgmin * vbd_jct; - } - break; - case 2: - if (vbd_jct < here->BSIM4v5vjdmRev) - { T0 = vbd_jct / Nvtmd; - if (T0 < -EXP_THRESHOLD) - { evbd = MIN_EXP; - devbd_dvb = 0.0; - } - else - { evbd = exp(T0); - devbd_dvb = evbd / Nvtmd; - } - - T1 = evbd - 1.0; - T2 = here->BSIM4v5IVjdmRev + here->BSIM4v5DslpRev - * (vbd_jct - here->BSIM4v5vjdmRev); - here->BSIM4v5gbd = devbd_dvb * T2 + T1 * here->BSIM4v5DslpRev + ckt->CKTgmin; - here->BSIM4v5cbd = T1 * T2 + ckt->CKTgmin * vbd_jct; - } - else if (vbd_jct <= here->BSIM4v5vjdmFwd) - { T0 = vbd_jct / Nvtmd; - if (T0 < -EXP_THRESHOLD) - { evbd = MIN_EXP; - devbd_dvb = 0.0; - } - else - { evbd = exp(T0); - devbd_dvb = evbd / Nvtmd; - } - - T1 = (model->BSIM4v5bvd + vbd_jct) / Nvtmd; - if (T1 > EXP_THRESHOLD) - { T2 = MIN_EXP; - T3 = 0.0; - } - else - { T2 = exp(-T1); - T3 = -T2 /Nvtmd; - } - here->BSIM4v5gbd = DrainSatCurrent * (devbd_dvb - model->BSIM4v5xjbvd * T3) - + ckt->CKTgmin; - here->BSIM4v5cbd = DrainSatCurrent * (evbd + here->BSIM4v5XExpBVD - 1.0 - - model->BSIM4v5xjbvd * T2) + ckt->CKTgmin * vbd_jct; - } - else - { here->BSIM4v5gbd = here->BSIM4v5DslpFwd + ckt->CKTgmin; - here->BSIM4v5cbd = here->BSIM4v5IVjdmFwd + here->BSIM4v5DslpFwd * (vbd_jct - - here->BSIM4v5vjdmFwd) + ckt->CKTgmin * vbd_jct; - } - break; - default: break; - } - } - - /* trap-assisted tunneling and recombination current for reverse bias */ - Nvtmrssw = model->BSIM4v5vtm0 * model->BSIM4v5njtsswtemp; - Nvtmrsswg = model->BSIM4v5vtm0 * model->BSIM4v5njtsswgtemp; - Nvtmrs = model->BSIM4v5vtm0 * model->BSIM4v5njtstemp; - - if ((model->BSIM4v5vtss - vbs_jct) < (model->BSIM4v5vtss * 1e-3)) - { T9 = 1.0e3; - T0 = - vbs_jct / Nvtmrs * T9; - DEXP(T0, T1, T10); - dT1_dVb = T10 / Nvtmrs * T9; - } else { - T9 = 1.0 / (model->BSIM4v5vtss - vbs_jct); - T0 = -vbs_jct / Nvtmrs * model->BSIM4v5vtss * T9; - dT0_dVb = model->BSIM4v5vtss / Nvtmrs * (T9 + vbs_jct * T9 * T9) ; - DEXP(T0, T1, T10); - dT1_dVb = T10 * dT0_dVb; - } - - if ((model->BSIM4v5vtsd - vbd_jct) < (model->BSIM4v5vtsd * 1e-3) ) - { T9 = 1.0e3; - T0 = -vbd_jct / Nvtmrs * T9; - DEXP(T0, T2, T10); - dT2_dVb = T10 / Nvtmrs * T9; - } else { - T9 = 1.0 / (model->BSIM4v5vtsd - vbd_jct); - T0 = -vbd_jct / Nvtmrs * model->BSIM4v5vtsd * T9; - dT0_dVb = model->BSIM4v5vtsd / Nvtmrs * (T9 + vbd_jct * T9 * T9) ; - DEXP(T0, T2, T10); - dT2_dVb = T10 * dT0_dVb; - } - - if ((model->BSIM4v5vtssws - vbs_jct) < (model->BSIM4v5vtssws * 1e-3) ) - { T9 = 1.0e3; - T0 = -vbs_jct / Nvtmrssw * T9; - DEXP(T0, T3, T10); - dT3_dVb = T10 / Nvtmrssw * T9; - } else { - T9 = 1.0 / (model->BSIM4v5vtssws - vbs_jct); - T0 = -vbs_jct / Nvtmrssw * model->BSIM4v5vtssws * T9; - dT0_dVb = model->BSIM4v5vtssws / Nvtmrssw * (T9 + vbs_jct * T9 * T9) ; - DEXP(T0, T3, T10); - dT3_dVb = T10 * dT0_dVb; - } - - if ((model->BSIM4v5vtsswd - vbd_jct) < (model->BSIM4v5vtsswd * 1e-3) ) - { T9 = 1.0e3; - T0 = -vbd_jct / Nvtmrssw * T9; - DEXP(T0, T4, T10); - dT4_dVb = T10 / Nvtmrssw * T9; - } else { - T9 = 1.0 / (model->BSIM4v5vtsswd - vbd_jct); - T0 = -vbd_jct / Nvtmrssw * model->BSIM4v5vtsswd * T9; - dT0_dVb = model->BSIM4v5vtsswd / Nvtmrssw * (T9 + vbd_jct * T9 * T9) ; - DEXP(T0, T4, T10); - dT4_dVb = T10 * dT0_dVb; - } - - if ((model->BSIM4v5vtsswgs - vbs_jct) < (model->BSIM4v5vtsswgs * 1e-3) ) - { T9 = 1.0e3; - T0 = -vbs_jct / Nvtmrsswg * T9; - DEXP(T0, T5, T10); - dT5_dVb = T10 / Nvtmrsswg * T9; - } else { - T9 = 1.0 / (model->BSIM4v5vtsswgs - vbs_jct); - T0 = -vbs_jct / Nvtmrsswg * model->BSIM4v5vtsswgs * T9; - dT0_dVb = model->BSIM4v5vtsswgs / Nvtmrsswg * (T9 + vbs_jct * T9 * T9) ; - DEXP(T0, T5, T10); - dT5_dVb = T10 * dT0_dVb; - } - - if ((model->BSIM4v5vtsswgd - vbd_jct) < (model->BSIM4v5vtsswgd * 1e-3) ) - { T9 = 1.0e3; - T0 = -vbd_jct / Nvtmrsswg * T9; - DEXP(T0, T6, T10); - dT6_dVb = T10 / Nvtmrsswg * T9; - } else { - T9 = 1.0 / (model->BSIM4v5vtsswgd - vbd_jct); - T0 = -vbd_jct / Nvtmrsswg * model->BSIM4v5vtsswgd * T9; - dT0_dVb = model->BSIM4v5vtsswgd / Nvtmrsswg * (T9 + vbd_jct * T9 * T9) ; - DEXP(T0, T6, T10); - dT6_dVb = T10 * dT0_dVb; - } - - here->BSIM4v5gbs += here->BSIM4v5SjctTempRevSatCur * dT1_dVb - + here->BSIM4v5SswTempRevSatCur * dT3_dVb - + here->BSIM4v5SswgTempRevSatCur * dT5_dVb; - here->BSIM4v5cbs -= here->BSIM4v5SjctTempRevSatCur * (T1 - 1.0) - + here->BSIM4v5SswTempRevSatCur * (T3 - 1.0) - + here->BSIM4v5SswgTempRevSatCur * (T5 - 1.0); - here->BSIM4v5gbd += here->BSIM4v5DjctTempRevSatCur * dT2_dVb - + here->BSIM4v5DswTempRevSatCur * dT4_dVb - + here->BSIM4v5DswgTempRevSatCur * dT6_dVb; - here->BSIM4v5cbd -= here->BSIM4v5DjctTempRevSatCur * (T2 - 1.0) - + here->BSIM4v5DswTempRevSatCur * (T4 - 1.0) - + here->BSIM4v5DswgTempRevSatCur * (T6 - 1.0); - - /* End of diode DC model */ - - if (vds >= 0.0) - { here->BSIM4v5mode = 1; - Vds = vds; - Vgs = vgs; - Vbs = vbs; - Vdb = vds - vbs; /* WDLiu: for GIDL */ - } - else - { here->BSIM4v5mode = -1; - Vds = -vds; - Vgs = vgd; - Vbs = vbd; - Vdb = -vbs; - } - - T0 = Vbs - here->BSIM4v5vbsc - 0.001; - T1 = sqrt(T0 * T0 - 0.004 * here->BSIM4v5vbsc); - if (T0 >= 0.0) - { Vbseff = here->BSIM4v5vbsc + 0.5 * (T0 + T1); - dVbseff_dVb = 0.5 * (1.0 + T0 / T1); - } - else - { T2 = -0.002 / (T1 - T0); - Vbseff = here->BSIM4v5vbsc * (1.0 + T2); - dVbseff_dVb = T2 * here->BSIM4v5vbsc / T1; - } - - /* JX: Correction to forward body bias */ - T9 = 0.95 * pParam->BSIM4v5phi; - T0 = T9 - Vbseff - 0.001; - T1 = sqrt(T0 * T0 + 0.004 * T9); - Vbseff = T9 - 0.5 * (T0 + T1); - dVbseff_dVb *= 0.5 * (1.0 + T0 / T1); - - Phis = pParam->BSIM4v5phi - Vbseff; - dPhis_dVb = -1.0; - sqrtPhis = sqrt(Phis); - dsqrtPhis_dVb = -0.5 / sqrtPhis; - - Xdep = pParam->BSIM4v5Xdep0 * sqrtPhis / pParam->BSIM4v5sqrtPhi; - dXdep_dVb = (pParam->BSIM4v5Xdep0 / pParam->BSIM4v5sqrtPhi) - * dsqrtPhis_dVb; - - Leff = pParam->BSIM4v5leff; - Vtm = model->BSIM4v5vtm; - Vtm0 = model->BSIM4v5vtm0; - - /* Vth Calculation */ - T3 = sqrt(Xdep); - V0 = pParam->BSIM4v5vbi - pParam->BSIM4v5phi; - - T0 = pParam->BSIM4v5dvt2 * Vbseff; - if (T0 >= - 0.5) - { T1 = 1.0 + T0; - T2 = pParam->BSIM4v5dvt2; - } - else - { T4 = 1.0 / (3.0 + 8.0 * T0); - T1 = (1.0 + 3.0 * T0) * T4; - T2 = pParam->BSIM4v5dvt2 * T4 * T4; - } - lt1 = model->BSIM4v5factor1 * T3 * T1; - dlt1_dVb = model->BSIM4v5factor1 * (0.5 / T3 * T1 * dXdep_dVb + T3 * T2); - - T0 = pParam->BSIM4v5dvt2w * Vbseff; - if (T0 >= - 0.5) - { T1 = 1.0 + T0; - T2 = pParam->BSIM4v5dvt2w; - } - else - { T4 = 1.0 / (3.0 + 8.0 * T0); - T1 = (1.0 + 3.0 * T0) * T4; - T2 = pParam->BSIM4v5dvt2w * T4 * T4; - } - ltw = model->BSIM4v5factor1 * T3 * T1; - dltw_dVb = model->BSIM4v5factor1 * (0.5 / T3 * T1 * dXdep_dVb + T3 * T2); - - T0 = pParam->BSIM4v5dvt1 * Leff / lt1; - if (T0 < EXP_THRESHOLD) - { T1 = exp(T0); - T2 = T1 - 1.0; - T3 = T2 * T2; - T4 = T3 + 2.0 * T1 * MIN_EXP; - Theta0 = T1 / T4; - dT1_dVb = -T0 * T1 * dlt1_dVb / lt1; - dTheta0_dVb = dT1_dVb * (T4 - 2.0 * T1 * (T2 + MIN_EXP)) / T4 / T4; - } - else - { Theta0 = 1.0 / (MAX_EXP - 2.0); /* 3.0 * MIN_EXP omitted */ - dTheta0_dVb = 0.0; - } - here->BSIM4v5thetavth = pParam->BSIM4v5dvt0 * Theta0; - Delt_vth = here->BSIM4v5thetavth * V0; - dDelt_vth_dVb = pParam->BSIM4v5dvt0 * dTheta0_dVb * V0; - - T0 = pParam->BSIM4v5dvt1w * pParam->BSIM4v5weff * Leff / ltw; - if (T0 < EXP_THRESHOLD) - { T1 = exp(T0); - T2 = T1 - 1.0; - T3 = T2 * T2; - T4 = T3 + 2.0 * T1 * MIN_EXP; - T5 = T1 / T4; - dT1_dVb = -T0 * T1 * dltw_dVb / ltw; - dT5_dVb = dT1_dVb * (T4 - 2.0 * T1 * (T2 + MIN_EXP)) / T4 / T4; - } - else - { T5 = 1.0 / (MAX_EXP - 2.0); /* 3.0 * MIN_EXP omitted */ - dT5_dVb = 0.0; - } - T0 = pParam->BSIM4v5dvt0w * T5; - T2 = T0 * V0; - dT2_dVb = pParam->BSIM4v5dvt0w * dT5_dVb * V0; - - TempRatio = ckt->CKTtemp / model->BSIM4v5tnom - 1.0; - T0 = sqrt(1.0 + pParam->BSIM4v5lpe0 / Leff); - T1 = pParam->BSIM4v5k1ox * (T0 - 1.0) * pParam->BSIM4v5sqrtPhi - + (pParam->BSIM4v5kt1 + pParam->BSIM4v5kt1l / Leff - + pParam->BSIM4v5kt2 * Vbseff) * TempRatio; - Vth_NarrowW = model->BSIM4v5toxe * pParam->BSIM4v5phi - / (pParam->BSIM4v5weff + pParam->BSIM4v5w0); - - T3 = here->BSIM4v5eta0 + pParam->BSIM4v5etab * Vbseff; - if (T3 < 1.0e-4) - { T9 = 1.0 / (3.0 - 2.0e4 * T3); - T3 = (2.0e-4 - T3) * T9; - T4 = T9 * T9; - } - else - { T4 = 1.0; - } - dDIBL_Sft_dVd = T3 * pParam->BSIM4v5theta0vb0; - DIBL_Sft = dDIBL_Sft_dVd * Vds; - - Lpe_Vb = sqrt(1.0 + pParam->BSIM4v5lpeb / Leff); - - Vth = model->BSIM4v5type * here->BSIM4v5vth0 + (pParam->BSIM4v5k1ox * sqrtPhis - - pParam->BSIM4v5k1 * pParam->BSIM4v5sqrtPhi) * Lpe_Vb - - here->BSIM4v5k2ox * Vbseff - Delt_vth - T2 + (pParam->BSIM4v5k3 - + pParam->BSIM4v5k3b * Vbseff) * Vth_NarrowW + T1 - DIBL_Sft; - - dVth_dVb = Lpe_Vb * pParam->BSIM4v5k1ox * dsqrtPhis_dVb - here->BSIM4v5k2ox - - dDelt_vth_dVb - dT2_dVb + pParam->BSIM4v5k3b * Vth_NarrowW - - pParam->BSIM4v5etab * Vds * pParam->BSIM4v5theta0vb0 * T4 - + pParam->BSIM4v5kt2 * TempRatio; - dVth_dVd = -dDIBL_Sft_dVd; - - - /* Calculate n */ - tmp1 = EPSSI / Xdep; - here->BSIM4v5nstar = model->BSIM4v5vtm / Charge_q * (model->BSIM4v5coxe - + tmp1 + pParam->BSIM4v5cit); - tmp2 = pParam->BSIM4v5nfactor * tmp1; - tmp3 = pParam->BSIM4v5cdsc + pParam->BSIM4v5cdscb * Vbseff - + pParam->BSIM4v5cdscd * Vds; - tmp4 = (tmp2 + tmp3 * Theta0 + pParam->BSIM4v5cit) / model->BSIM4v5coxe; - if (tmp4 >= -0.5) - { n = 1.0 + tmp4; - dn_dVb = (-tmp2 / Xdep * dXdep_dVb + tmp3 * dTheta0_dVb - + pParam->BSIM4v5cdscb * Theta0) / model->BSIM4v5coxe; - dn_dVd = pParam->BSIM4v5cdscd * Theta0 / model->BSIM4v5coxe; - } - else - { T0 = 1.0 / (3.0 + 8.0 * tmp4); - n = (1.0 + 3.0 * tmp4) * T0; - T0 *= T0; - dn_dVb = (-tmp2 / Xdep * dXdep_dVb + tmp3 * dTheta0_dVb - + pParam->BSIM4v5cdscb * Theta0) / model->BSIM4v5coxe * T0; - dn_dVd = pParam->BSIM4v5cdscd * Theta0 / model->BSIM4v5coxe * T0; - } - - - /* Vth correction for Pocket implant */ - if (pParam->BSIM4v5dvtp0 > 0.0) - { T0 = -pParam->BSIM4v5dvtp1 * Vds; - if (T0 < -EXP_THRESHOLD) - { T2 = MIN_EXP; - dT2_dVd = 0.0; - } - else - { T2 = exp(T0); - dT2_dVd = -pParam->BSIM4v5dvtp1 * T2; - } - - T3 = Leff + pParam->BSIM4v5dvtp0 * (1.0 + T2); - dT3_dVd = pParam->BSIM4v5dvtp0 * dT2_dVd; - if (model->BSIM4v5tempMod < 2) - { - T4 = Vtm * log(Leff / T3); - dT4_dVd = -Vtm * dT3_dVd / T3; - } - else - { - T4 = model->BSIM4v5vtm0 * log(Leff / T3); - dT4_dVd = -model->BSIM4v5vtm0 * dT3_dVd / T3; - } - dDITS_Sft_dVd = dn_dVd * T4 + n * dT4_dVd; - dDITS_Sft_dVb = T4 * dn_dVb; - - Vth -= n * T4; - dVth_dVd -= dDITS_Sft_dVd; - dVth_dVb -= dDITS_Sft_dVb; - } - here->BSIM4v5von = Vth; - - - /* Poly Gate Si Depletion Effect */ - T0 = here->BSIM4v5vfb + pParam->BSIM4v5phi; - - BSIM4v5polyDepletion(T0, pParam->BSIM4v5ngate, model->BSIM4v5coxe, vgs, &vgs_eff, &dvgs_eff_dvg); - - BSIM4v5polyDepletion(T0, pParam->BSIM4v5ngate, model->BSIM4v5coxe, vgd, &vgd_eff, &dvgd_eff_dvg); - - if(here->BSIM4v5mode>0) { - Vgs_eff = vgs_eff; - dVgs_eff_dVg = dvgs_eff_dvg; - } else { - Vgs_eff = vgd_eff; - dVgs_eff_dVg = dvgd_eff_dvg; - } - here->BSIM4v5vgs_eff = vgs_eff; - here->BSIM4v5vgd_eff = vgd_eff; - here->BSIM4v5dvgs_eff_dvg = dvgs_eff_dvg; - here->BSIM4v5dvgd_eff_dvg = dvgd_eff_dvg; - - - Vgst = Vgs_eff - Vth; - - /* Calculate Vgsteff */ - T0 = n * Vtm; - T1 = pParam->BSIM4v5mstar * Vgst; - T2 = T1 / T0; - if (T2 > EXP_THRESHOLD) - { T10 = T1; - dT10_dVg = pParam->BSIM4v5mstar * dVgs_eff_dVg; - dT10_dVd = -dVth_dVd * pParam->BSIM4v5mstar; - dT10_dVb = -dVth_dVb * pParam->BSIM4v5mstar; - } - else if (T2 < -EXP_THRESHOLD) - { T10 = Vtm * log(1.0 + MIN_EXP); - dT10_dVg = 0.0; - dT10_dVd = T10 * dn_dVd; - dT10_dVb = T10 * dn_dVb; - T10 *= n; - } - else - { ExpVgst = exp(T2); - T3 = Vtm * log(1.0 + ExpVgst); - T10 = n * T3; - dT10_dVg = pParam->BSIM4v5mstar * ExpVgst / (1.0 + ExpVgst); - dT10_dVb = T3 * dn_dVb - dT10_dVg * (dVth_dVb + Vgst * dn_dVb / n); - dT10_dVd = T3 * dn_dVd - dT10_dVg * (dVth_dVd + Vgst * dn_dVd / n); - dT10_dVg *= dVgs_eff_dVg; - } - - T1 = pParam->BSIM4v5voffcbn - (1.0 - pParam->BSIM4v5mstar) * Vgst; - T2 = T1 / T0; - if (T2 < -EXP_THRESHOLD) - { T3 = model->BSIM4v5coxe * MIN_EXP / pParam->BSIM4v5cdep0; - T9 = pParam->BSIM4v5mstar + T3 * n; - dT9_dVg = 0.0; - dT9_dVd = dn_dVd * T3; - dT9_dVb = dn_dVb * T3; - } - else if (T2 > EXP_THRESHOLD) - { T3 = model->BSIM4v5coxe * MAX_EXP / pParam->BSIM4v5cdep0; - T9 = pParam->BSIM4v5mstar + T3 * n; - dT9_dVg = 0.0; - dT9_dVd = dn_dVd * T3; - dT9_dVb = dn_dVb * T3; - } - else - { ExpVgst = exp(T2); - T3 = model->BSIM4v5coxe / pParam->BSIM4v5cdep0; - T4 = T3 * ExpVgst; - T5 = T1 * T4 / T0; - T9 = pParam->BSIM4v5mstar + n * T4; - dT9_dVg = T3 * (pParam->BSIM4v5mstar - 1.0) * ExpVgst / Vtm; - dT9_dVb = T4 * dn_dVb - dT9_dVg * dVth_dVb - T5 * dn_dVb; - dT9_dVd = T4 * dn_dVd - dT9_dVg * dVth_dVd - T5 * dn_dVd; - dT9_dVg *= dVgs_eff_dVg; - } - - here->BSIM4v5Vgsteff = Vgsteff = T10 / T9; - T11 = T9 * T9; - dVgsteff_dVg = (T9 * dT10_dVg - T10 * dT9_dVg) / T11; - dVgsteff_dVd = (T9 * dT10_dVd - T10 * dT9_dVd) / T11; - dVgsteff_dVb = (T9 * dT10_dVb - T10 * dT9_dVb) / T11; - - /* Calculate Effective Channel Geometry */ - T9 = sqrtPhis - pParam->BSIM4v5sqrtPhi; - Weff = pParam->BSIM4v5weff - 2.0 * (pParam->BSIM4v5dwg * Vgsteff - + pParam->BSIM4v5dwb * T9); - dWeff_dVg = -2.0 * pParam->BSIM4v5dwg; - dWeff_dVb = -2.0 * pParam->BSIM4v5dwb * dsqrtPhis_dVb; - - if (Weff < 2.0e-8) /* to avoid the discontinuity problem due to Weff*/ - { T0 = 1.0 / (6.0e-8 - 2.0 * Weff); - Weff = 2.0e-8 * (4.0e-8 - Weff) * T0; - T0 *= T0 * 4.0e-16; - dWeff_dVg *= T0; - dWeff_dVb *= T0; - } - - if (model->BSIM4v5rdsMod == 1) - Rds = dRds_dVg = dRds_dVb = 0.0; - else - { T0 = 1.0 + pParam->BSIM4v5prwg * Vgsteff; - dT0_dVg = -pParam->BSIM4v5prwg / T0 / T0; - T1 = pParam->BSIM4v5prwb * T9; - dT1_dVb = pParam->BSIM4v5prwb * dsqrtPhis_dVb; - - T2 = 1.0 / T0 + T1; - T3 = T2 + sqrt(T2 * T2 + 0.01); /* 0.01 = 4.0 * 0.05 * 0.05 */ - dT3_dVg = 1.0 + T2 / (T3 - T2); - dT3_dVb = dT3_dVg * dT1_dVb; - dT3_dVg *= dT0_dVg; - - T4 = pParam->BSIM4v5rds0 * 0.5; - Rds = pParam->BSIM4v5rdswmin + T3 * T4; - dRds_dVg = T4 * dT3_dVg; - dRds_dVb = T4 * dT3_dVb; - - if (Rds > 0.0) - here->BSIM4v5grdsw = 1.0 / Rds; - else - here->BSIM4v5grdsw = 0.0; - } - - /* Calculate Abulk */ - T9 = 0.5 * pParam->BSIM4v5k1ox * Lpe_Vb / sqrtPhis; - T1 = T9 + here->BSIM4v5k2ox - pParam->BSIM4v5k3b * Vth_NarrowW; - dT1_dVb = -T9 / sqrtPhis * dsqrtPhis_dVb; - - T9 = sqrt(pParam->BSIM4v5xj * Xdep); - tmp1 = Leff + 2.0 * T9; - T5 = Leff / tmp1; - tmp2 = pParam->BSIM4v5a0 * T5; - tmp3 = pParam->BSIM4v5weff + pParam->BSIM4v5b1; - tmp4 = pParam->BSIM4v5b0 / tmp3; - T2 = tmp2 + tmp4; - dT2_dVb = -T9 / tmp1 / Xdep * dXdep_dVb; - T6 = T5 * T5; - T7 = T5 * T6; - - Abulk0 = 1.0 + T1 * T2; - dAbulk0_dVb = T1 * tmp2 * dT2_dVb + T2 * dT1_dVb; - - T8 = pParam->BSIM4v5ags * pParam->BSIM4v5a0 * T7; - dAbulk_dVg = -T1 * T8; - Abulk = Abulk0 + dAbulk_dVg * Vgsteff; - dAbulk_dVb = dAbulk0_dVb - T8 * Vgsteff * (dT1_dVb - + 3.0 * T1 * dT2_dVb); - - if (Abulk0 < 0.1) /* added to avoid the problems caused by Abulk0 */ - { T9 = 1.0 / (3.0 - 20.0 * Abulk0); - Abulk0 = (0.2 - Abulk0) * T9; - dAbulk0_dVb *= T9 * T9; - } - - if (Abulk < 0.1) - { T9 = 1.0 / (3.0 - 20.0 * Abulk); - Abulk = (0.2 - Abulk) * T9; - T10 = T9 * T9; - dAbulk_dVb *= T10; - dAbulk_dVg *= T10; - } - here->BSIM4v5Abulk = Abulk; - - T2 = pParam->BSIM4v5keta * Vbseff; - if (T2 >= -0.9) - { T0 = 1.0 / (1.0 + T2); - dT0_dVb = -pParam->BSIM4v5keta * T0 * T0; - } - else - { T1 = 1.0 / (0.8 + T2); - T0 = (17.0 + 20.0 * T2) * T1; - dT0_dVb = -pParam->BSIM4v5keta * T1 * T1; - } - dAbulk_dVg *= T0; - dAbulk_dVb = dAbulk_dVb * T0 + Abulk * dT0_dVb; - dAbulk0_dVb = dAbulk0_dVb * T0 + Abulk0 * dT0_dVb; - Abulk *= T0; - Abulk0 *= T0; - - /* Mobility calculation */ - if (model->BSIM4v5mobMod == 0) - { T0 = Vgsteff + Vth + Vth; - T2 = pParam->BSIM4v5ua + pParam->BSIM4v5uc * Vbseff; - T3 = T0 / model->BSIM4v5toxe; - T6 = pParam->BSIM4v5ud / T3 / T3 * Vth * Vth; - T5 = T3 * (T2 + pParam->BSIM4v5ub * T3) + T6; - T7 = - 2.0 * T6 / T0; - dDenomi_dVg = (T2 + 2.0 * pParam->BSIM4v5ub * T3) / model->BSIM4v5toxe + T7; - dDenomi_dVd = dDenomi_dVg * 2.0 * dVth_dVd; - dDenomi_dVb = dDenomi_dVg * 2.0 * dVth_dVb + pParam->BSIM4v5uc * T3; - } - else if (model->BSIM4v5mobMod == 1) - { T0 = Vgsteff + Vth + Vth; - T2 = 1.0 + pParam->BSIM4v5uc * Vbseff; - T3 = T0 / model->BSIM4v5toxe; - T4 = T3 * (pParam->BSIM4v5ua + pParam->BSIM4v5ub * T3); - T6 = pParam->BSIM4v5ud / T3 / T3 * Vth * Vth; - T5 = T4 * T2 + T6; - T7 = - 2.0 * T6 / T0; - dDenomi_dVg = (pParam->BSIM4v5ua + 2.0 * pParam->BSIM4v5ub * T3) * T2 - / model->BSIM4v5toxe + T7; - dDenomi_dVd = dDenomi_dVg * 2.0 * dVth_dVd; - dDenomi_dVb = dDenomi_dVg * 2.0 * dVth_dVb + pParam->BSIM4v5uc * T4; - } - else - { T0 = (Vgsteff + here->BSIM4v5vtfbphi1) / model->BSIM4v5toxe; - T1 = exp(pParam->BSIM4v5eu * log(T0)); - dT1_dVg = T1 * pParam->BSIM4v5eu / T0 / model->BSIM4v5toxe; - T2 = pParam->BSIM4v5ua + pParam->BSIM4v5uc * Vbseff; - T3 = T0 / model->BSIM4v5toxe; - T6 = pParam->BSIM4v5ud / T3 / T3 * Vth * Vth; - T5 = T1 * T2 + T6; - T7 = - 2.0 * T6 / T0; - dDenomi_dVg = T2 * dT1_dVg + T7; - dDenomi_dVd = 0.0; - dDenomi_dVb = T1 * pParam->BSIM4v5uc; - } - - if (T5 >= -0.8) - { Denomi = 1.0 + T5; - } - else - { T9 = 1.0 / (7.0 + 10.0 * T5); - Denomi = (0.6 + T5) * T9; - T9 *= T9; - dDenomi_dVg *= T9; - dDenomi_dVd *= T9; - dDenomi_dVb *= T9; - } - - here->BSIM4v5ueff = ueff = here->BSIM4v5u0temp / Denomi; - T9 = -ueff / Denomi; - dueff_dVg = T9 * dDenomi_dVg; - dueff_dVd = T9 * dDenomi_dVd; - dueff_dVb = T9 * dDenomi_dVb; - - /* Saturation Drain Voltage Vdsat */ - WVCox = Weff * here->BSIM4v5vsattemp * model->BSIM4v5coxe; - WVCoxRds = WVCox * Rds; - - Esat = 2.0 * here->BSIM4v5vsattemp / ueff; - here->BSIM4v5EsatL = EsatL = Esat * Leff; - T0 = -EsatL /ueff; - dEsatL_dVg = T0 * dueff_dVg; - dEsatL_dVd = T0 * dueff_dVd; - dEsatL_dVb = T0 * dueff_dVb; - - /* Sqrt() */ - a1 = pParam->BSIM4v5a1; - if (a1 == 0.0) - { Lambda = pParam->BSIM4v5a2; - dLambda_dVg = 0.0; - } - else if (a1 > 0.0) - { T0 = 1.0 - pParam->BSIM4v5a2; - T1 = T0 - pParam->BSIM4v5a1 * Vgsteff - 0.0001; - T2 = sqrt(T1 * T1 + 0.0004 * T0); - Lambda = pParam->BSIM4v5a2 + T0 - 0.5 * (T1 + T2); - dLambda_dVg = 0.5 * pParam->BSIM4v5a1 * (1.0 + T1 / T2); - } - else - { T1 = pParam->BSIM4v5a2 + pParam->BSIM4v5a1 * Vgsteff - 0.0001; - T2 = sqrt(T1 * T1 + 0.0004 * pParam->BSIM4v5a2); - Lambda = 0.5 * (T1 + T2); - dLambda_dVg = 0.5 * pParam->BSIM4v5a1 * (1.0 + T1 / T2); - } - - Vgst2Vtm = Vgsteff + 2.0 * Vtm; - if (Rds > 0) - { tmp2 = dRds_dVg / Rds + dWeff_dVg / Weff; - tmp3 = dRds_dVb / Rds + dWeff_dVb / Weff; - } - else - { tmp2 = dWeff_dVg / Weff; - tmp3 = dWeff_dVb / Weff; - } - if ((Rds == 0.0) && (Lambda == 1.0)) - { T0 = 1.0 / (Abulk * EsatL + Vgst2Vtm); - tmp1 = 0.0; - T1 = T0 * T0; - T2 = Vgst2Vtm * T0; - T3 = EsatL * Vgst2Vtm; - Vdsat = T3 * T0; - - dT0_dVg = -(Abulk * dEsatL_dVg + EsatL * dAbulk_dVg + 1.0) * T1; - dT0_dVd = -(Abulk * dEsatL_dVd) * T1; - dT0_dVb = -(Abulk * dEsatL_dVb + dAbulk_dVb * EsatL) * T1; - - dVdsat_dVg = T3 * dT0_dVg + T2 * dEsatL_dVg + EsatL * T0; - dVdsat_dVd = T3 * dT0_dVd + T2 * dEsatL_dVd; - dVdsat_dVb = T3 * dT0_dVb + T2 * dEsatL_dVb; - } - else - { tmp1 = dLambda_dVg / (Lambda * Lambda); - T9 = Abulk * WVCoxRds; - T8 = Abulk * T9; - T7 = Vgst2Vtm * T9; - T6 = Vgst2Vtm * WVCoxRds; - T0 = 2.0 * Abulk * (T9 - 1.0 + 1.0 / Lambda); - dT0_dVg = 2.0 * (T8 * tmp2 - Abulk * tmp1 - + (2.0 * T9 + 1.0 / Lambda - 1.0) * dAbulk_dVg); - - dT0_dVb = 2.0 * (T8 * (2.0 / Abulk * dAbulk_dVb + tmp3) - + (1.0 / Lambda - 1.0) * dAbulk_dVb); - dT0_dVd = 0.0; - T1 = Vgst2Vtm * (2.0 / Lambda - 1.0) + Abulk * EsatL + 3.0 * T7; - - dT1_dVg = (2.0 / Lambda - 1.0) - 2.0 * Vgst2Vtm * tmp1 - + Abulk * dEsatL_dVg + EsatL * dAbulk_dVg + 3.0 * (T9 - + T7 * tmp2 + T6 * dAbulk_dVg); - dT1_dVb = Abulk * dEsatL_dVb + EsatL * dAbulk_dVb - + 3.0 * (T6 * dAbulk_dVb + T7 * tmp3); - dT1_dVd = Abulk * dEsatL_dVd; - - T2 = Vgst2Vtm * (EsatL + 2.0 * T6); - dT2_dVg = EsatL + Vgst2Vtm * dEsatL_dVg - + T6 * (4.0 + 2.0 * Vgst2Vtm * tmp2); - dT2_dVb = Vgst2Vtm * (dEsatL_dVb + 2.0 * T6 * tmp3); - dT2_dVd = Vgst2Vtm * dEsatL_dVd; - - T3 = sqrt(T1 * T1 - 2.0 * T0 * T2); - Vdsat = (T1 - T3) / T0; - - dT3_dVg = (T1 * dT1_dVg - 2.0 * (T0 * dT2_dVg + T2 * dT0_dVg)) - / T3; - dT3_dVd = (T1 * dT1_dVd - 2.0 * (T0 * dT2_dVd + T2 * dT0_dVd)) - / T3; - dT3_dVb = (T1 * dT1_dVb - 2.0 * (T0 * dT2_dVb + T2 * dT0_dVb)) - / T3; - - dVdsat_dVg = (dT1_dVg - (T1 * dT1_dVg - dT0_dVg * T2 - - T0 * dT2_dVg) / T3 - Vdsat * dT0_dVg) / T0; - dVdsat_dVb = (dT1_dVb - (T1 * dT1_dVb - dT0_dVb * T2 - - T0 * dT2_dVb) / T3 - Vdsat * dT0_dVb) / T0; - dVdsat_dVd = (dT1_dVd - (T1 * dT1_dVd - T0 * dT2_dVd) / T3) / T0; - } - here->BSIM4v5vdsat = Vdsat; - - /* Calculate Vdseff */ - T1 = Vdsat - Vds - pParam->BSIM4v5delta; - dT1_dVg = dVdsat_dVg; - dT1_dVd = dVdsat_dVd - 1.0; - dT1_dVb = dVdsat_dVb; - - T2 = sqrt(T1 * T1 + 4.0 * pParam->BSIM4v5delta * Vdsat); - T0 = T1 / T2; - T9 = 2.0 * pParam->BSIM4v5delta; - T3 = T9 / T2; - dT2_dVg = T0 * dT1_dVg + T3 * dVdsat_dVg; - dT2_dVd = T0 * dT1_dVd + T3 * dVdsat_dVd; - dT2_dVb = T0 * dT1_dVb + T3 * dVdsat_dVb; - - if (T1 >= 0.0) - { Vdseff = Vdsat - 0.5 * (T1 + T2); - dVdseff_dVg = dVdsat_dVg - 0.5 * (dT1_dVg + dT2_dVg); - dVdseff_dVd = dVdsat_dVd - 0.5 * (dT1_dVd + dT2_dVd); - dVdseff_dVb = dVdsat_dVb - 0.5 * (dT1_dVb + dT2_dVb); - } - else - { T4 = T9 / (T2 - T1); - T5 = 1.0 - T4; - T6 = Vdsat * T4 / (T2 - T1); - Vdseff = Vdsat * T5; - dVdseff_dVg = dVdsat_dVg * T5 + T6 * (dT2_dVg - dT1_dVg); - dVdseff_dVd = dVdsat_dVd * T5 + T6 * (dT2_dVd - dT1_dVd); - dVdseff_dVb = dVdsat_dVb * T5 + T6 * (dT2_dVb - dT1_dVb); - } - - if (Vds == 0.0) - { Vdseff = 0.0; - dVdseff_dVg = 0.0; - dVdseff_dVb = 0.0; - } - - if (Vdseff > Vds) - Vdseff = Vds; - diffVds = Vds - Vdseff; - here->BSIM4v5Vdseff = Vdseff; - - /* Velocity Overshoot */ - if((model->BSIM4v5lambdaGiven) && (model->BSIM4v5lambda > 0.0) ) - { - T1 = Leff * ueff; - T2 = pParam->BSIM4v5lambda / T1; - T3 = -T2 / T1 * Leff; - dT2_dVd = T3 * dueff_dVd; - dT2_dVg = T3 * dueff_dVg; - dT2_dVb = T3 * dueff_dVb; - T5 = 1.0 / (Esat * pParam->BSIM4v5litl); - T4 = -T5 / EsatL; - dT5_dVg = dEsatL_dVg * T4; - dT5_dVd = dEsatL_dVd * T4; - dT5_dVb = dEsatL_dVb * T4; - T6 = 1.0 + diffVds * T5; - dT6_dVg = dT5_dVg * diffVds - dVdseff_dVg * T5; - dT6_dVd = dT5_dVd * diffVds + (1.0 - dVdseff_dVd) * T5; - dT6_dVb = dT5_dVb * diffVds - dVdseff_dVb * T5; - T7 = 2.0 / (T6 * T6 + 1.0); - T8 = 1.0 - T7; - T9 = T6 * T7 * T7; - dT8_dVg = T9 * dT6_dVg; - dT8_dVd = T9 * dT6_dVd; - dT8_dVb = T9 * dT6_dVb; - T10 = 1.0 + T2 * T8; - dT10_dVg = dT2_dVg * T8 + T2 * dT8_dVg; - dT10_dVd = dT2_dVd * T8 + T2 * dT8_dVd; - dT10_dVb = dT2_dVb * T8 + T2 * dT8_dVb; - if(T10 == 1.0) - dT10_dVg = dT10_dVd = dT10_dVb = 0.0; - - dEsatL_dVg *= T10; - dEsatL_dVg += EsatL * dT10_dVg; - dEsatL_dVd *= T10; - dEsatL_dVd += EsatL * dT10_dVd; - dEsatL_dVb *= T10; - dEsatL_dVb += EsatL * dT10_dVb; - EsatL *= T10; - here->BSIM4v5EsatL = EsatL; - } - - /* Calculate Vasat */ - tmp4 = 1.0 - 0.5 * Abulk * Vdsat / Vgst2Vtm; - T9 = WVCoxRds * Vgsteff; - T8 = T9 / Vgst2Vtm; - T0 = EsatL + Vdsat + 2.0 * T9 * tmp4; - - T7 = 2.0 * WVCoxRds * tmp4; - dT0_dVg = dEsatL_dVg + dVdsat_dVg + T7 * (1.0 + tmp2 * Vgsteff) - - T8 * (Abulk * dVdsat_dVg - Abulk * Vdsat / Vgst2Vtm - + Vdsat * dAbulk_dVg); - - dT0_dVb = dEsatL_dVb + dVdsat_dVb + T7 * tmp3 * Vgsteff - - T8 * (dAbulk_dVb * Vdsat + Abulk * dVdsat_dVb); - dT0_dVd = dEsatL_dVd + dVdsat_dVd - T8 * Abulk * dVdsat_dVd; - - T9 = WVCoxRds * Abulk; - T1 = 2.0 / Lambda - 1.0 + T9; - dT1_dVg = -2.0 * tmp1 + WVCoxRds * (Abulk * tmp2 + dAbulk_dVg); - dT1_dVb = dAbulk_dVb * WVCoxRds + T9 * tmp3; - - Vasat = T0 / T1; - dVasat_dVg = (dT0_dVg - Vasat * dT1_dVg) / T1; - dVasat_dVb = (dT0_dVb - Vasat * dT1_dVb) / T1; - dVasat_dVd = dT0_dVd / T1; - - /* Calculate Idl first */ - tmp1 = here->BSIM4v5vtfbphi2; - tmp2 = 2.0e8 * model->BSIM4v5toxp; - dT0_dVg = 1.0 / tmp2; - T0 = (Vgsteff + tmp1) * dT0_dVg; - - tmp3 = exp(0.7 * log(T0)); - T1 = 1.0 + tmp3; - T2 = 0.7 * tmp3 / T0; - Tcen = 1.9e-9 / T1; - dTcen_dVg = -Tcen * T2 * dT0_dVg / T1; - - Coxeff = EPSSI * model->BSIM4v5coxp - / (EPSSI + model->BSIM4v5coxp * Tcen); - dCoxeff_dVg = -Coxeff * Coxeff * dTcen_dVg / EPSSI; - - CoxeffWovL = Coxeff * Weff / Leff; - beta = ueff * CoxeffWovL; - T3 = ueff / Leff; - dbeta_dVg = CoxeffWovL * dueff_dVg + T3 - * (Weff * dCoxeff_dVg + Coxeff * dWeff_dVg); - dbeta_dVd = CoxeffWovL * dueff_dVd; - dbeta_dVb = CoxeffWovL * dueff_dVb + T3 * Coxeff * dWeff_dVb; - - here->BSIM4v5AbovVgst2Vtm = Abulk / Vgst2Vtm; - T0 = 1.0 - 0.5 * Vdseff * here->BSIM4v5AbovVgst2Vtm; - dT0_dVg = -0.5 * (Abulk * dVdseff_dVg - - Abulk * Vdseff / Vgst2Vtm + Vdseff * dAbulk_dVg) / Vgst2Vtm; - dT0_dVd = -0.5 * Abulk * dVdseff_dVd / Vgst2Vtm; - dT0_dVb = -0.5 * (Abulk * dVdseff_dVb + dAbulk_dVb * Vdseff) - / Vgst2Vtm; - - fgche1 = Vgsteff * T0; - dfgche1_dVg = Vgsteff * dT0_dVg + T0; - dfgche1_dVd = Vgsteff * dT0_dVd; - dfgche1_dVb = Vgsteff * dT0_dVb; - - T9 = Vdseff / EsatL; - fgche2 = 1.0 + T9; - dfgche2_dVg = (dVdseff_dVg - T9 * dEsatL_dVg) / EsatL; - dfgche2_dVd = (dVdseff_dVd - T9 * dEsatL_dVd) / EsatL; - dfgche2_dVb = (dVdseff_dVb - T9 * dEsatL_dVb) / EsatL; - - gche = beta * fgche1 / fgche2; - dgche_dVg = (beta * dfgche1_dVg + fgche1 * dbeta_dVg - - gche * dfgche2_dVg) / fgche2; - dgche_dVd = (beta * dfgche1_dVd + fgche1 * dbeta_dVd - - gche * dfgche2_dVd) / fgche2; - dgche_dVb = (beta * dfgche1_dVb + fgche1 * dbeta_dVb - - gche * dfgche2_dVb) / fgche2; - - T0 = 1.0 + gche * Rds; - Idl = gche / T0; - T1 = (1.0 - Idl * Rds) / T0; - T2 = Idl * Idl; - dIdl_dVg = T1 * dgche_dVg - T2 * dRds_dVg; - dIdl_dVd = T1 * dgche_dVd; - dIdl_dVb = T1 * dgche_dVb - T2 * dRds_dVb; - - /* Calculate degradation factor due to pocket implant */ - - if (pParam->BSIM4v5fprout <= 0.0) - { FP = 1.0; - dFP_dVg = 0.0; - } - else - { T9 = pParam->BSIM4v5fprout * sqrt(Leff) / Vgst2Vtm; - FP = 1.0 / (1.0 + T9); - dFP_dVg = FP * FP * T9 / Vgst2Vtm; - } - - /* Calculate VACLM */ - T8 = pParam->BSIM4v5pvag / EsatL; - T9 = T8 * Vgsteff; - if (T9 > -0.9) - { PvagTerm = 1.0 + T9; - dPvagTerm_dVg = T8 * (1.0 - Vgsteff * dEsatL_dVg / EsatL); - dPvagTerm_dVb = -T9 * dEsatL_dVb / EsatL; - dPvagTerm_dVd = -T9 * dEsatL_dVd / EsatL; - } - else - { T4 = 1.0 / (17.0 + 20.0 * T9); - PvagTerm = (0.8 + T9) * T4; - T4 *= T4; - dPvagTerm_dVg = T8 * (1.0 - Vgsteff * dEsatL_dVg / EsatL) * T4; - T9 *= T4 / EsatL; - dPvagTerm_dVb = -T9 * dEsatL_dVb; - dPvagTerm_dVd = -T9 * dEsatL_dVd; - } - - if ((pParam->BSIM4v5pclm > MIN_EXP) && (diffVds > 1.0e-10)) - { T0 = 1.0 + Rds * Idl; - dT0_dVg = dRds_dVg * Idl + Rds * dIdl_dVg; - dT0_dVd = Rds * dIdl_dVd; - dT0_dVb = dRds_dVb * Idl + Rds * dIdl_dVb; - - T2 = Vdsat / Esat; - T1 = Leff + T2; - dT1_dVg = (dVdsat_dVg - T2 * dEsatL_dVg / Leff) / Esat; - dT1_dVd = (dVdsat_dVd - T2 * dEsatL_dVd / Leff) / Esat; - dT1_dVb = (dVdsat_dVb - T2 * dEsatL_dVb / Leff) / Esat; - - Cclm = FP * PvagTerm * T0 * T1 / (pParam->BSIM4v5pclm * pParam->BSIM4v5litl); - dCclm_dVg = Cclm * (dFP_dVg / FP + dPvagTerm_dVg / PvagTerm - + dT0_dVg / T0 + dT1_dVg / T1); - dCclm_dVb = Cclm * (dPvagTerm_dVb / PvagTerm + dT0_dVb / T0 - + dT1_dVb / T1); - dCclm_dVd = Cclm * (dPvagTerm_dVd / PvagTerm + dT0_dVd / T0 - + dT1_dVd / T1); - VACLM = Cclm * diffVds; - - dVACLM_dVg = dCclm_dVg * diffVds - dVdseff_dVg * Cclm; - dVACLM_dVb = dCclm_dVb * diffVds - dVdseff_dVb * Cclm; - dVACLM_dVd = dCclm_dVd * diffVds + (1.0 - dVdseff_dVd) * Cclm; - } - else - { VACLM = Cclm = MAX_EXP; - dVACLM_dVd = dVACLM_dVg = dVACLM_dVb = 0.0; - dCclm_dVd = dCclm_dVg = dCclm_dVb = 0.0; - } - - /* Calculate VADIBL */ - if (pParam->BSIM4v5thetaRout > MIN_EXP) - { T8 = Abulk * Vdsat; - T0 = Vgst2Vtm * T8; - dT0_dVg = Vgst2Vtm * Abulk * dVdsat_dVg + T8 - + Vgst2Vtm * Vdsat * dAbulk_dVg; - dT0_dVb = Vgst2Vtm * (dAbulk_dVb * Vdsat + Abulk * dVdsat_dVb); - dT0_dVd = Vgst2Vtm * Abulk * dVdsat_dVd; - - T1 = Vgst2Vtm + T8; - dT1_dVg = 1.0 + Abulk * dVdsat_dVg + Vdsat * dAbulk_dVg; - dT1_dVb = Abulk * dVdsat_dVb + dAbulk_dVb * Vdsat; - dT1_dVd = Abulk * dVdsat_dVd; - - T9 = T1 * T1; - T2 = pParam->BSIM4v5thetaRout; - VADIBL = (Vgst2Vtm - T0 / T1) / T2; - dVADIBL_dVg = (1.0 - dT0_dVg / T1 + T0 * dT1_dVg / T9) / T2; - dVADIBL_dVb = (-dT0_dVb / T1 + T0 * dT1_dVb / T9) / T2; - dVADIBL_dVd = (-dT0_dVd / T1 + T0 * dT1_dVd / T9) / T2; - - T7 = pParam->BSIM4v5pdiblb * Vbseff; - if (T7 >= -0.9) - { T3 = 1.0 / (1.0 + T7); - VADIBL *= T3; - dVADIBL_dVg *= T3; - dVADIBL_dVb = (dVADIBL_dVb - VADIBL * pParam->BSIM4v5pdiblb) - * T3; - dVADIBL_dVd *= T3; - } - else - { T4 = 1.0 / (0.8 + T7); - T3 = (17.0 + 20.0 * T7) * T4; - dVADIBL_dVg *= T3; - dVADIBL_dVb = dVADIBL_dVb * T3 - - VADIBL * pParam->BSIM4v5pdiblb * T4 * T4; - dVADIBL_dVd *= T3; - VADIBL *= T3; - } - - dVADIBL_dVg = dVADIBL_dVg * PvagTerm + VADIBL * dPvagTerm_dVg; - dVADIBL_dVb = dVADIBL_dVb * PvagTerm + VADIBL * dPvagTerm_dVb; - dVADIBL_dVd = dVADIBL_dVd * PvagTerm + VADIBL * dPvagTerm_dVd; - VADIBL *= PvagTerm; - } - else - { VADIBL = MAX_EXP; - dVADIBL_dVd = dVADIBL_dVg = dVADIBL_dVb = 0.0; - } - - /* Calculate Va */ - Va = Vasat + VACLM; - dVa_dVg = dVasat_dVg + dVACLM_dVg; - dVa_dVb = dVasat_dVb + dVACLM_dVb; - dVa_dVd = dVasat_dVd + dVACLM_dVd; - - /* Calculate VADITS */ - T0 = pParam->BSIM4v5pditsd * Vds; - if (T0 > EXP_THRESHOLD) - { T1 = MAX_EXP; - dT1_dVd = 0; - } - else - { T1 = exp(T0); - dT1_dVd = T1 * pParam->BSIM4v5pditsd; - } - - if (pParam->BSIM4v5pdits > MIN_EXP) - { T2 = 1.0 + model->BSIM4v5pditsl * Leff; - VADITS = (1.0 + T2 * T1) / pParam->BSIM4v5pdits; - dVADITS_dVg = VADITS * dFP_dVg; - dVADITS_dVd = FP * T2 * dT1_dVd / pParam->BSIM4v5pdits; - VADITS *= FP; - } - else - { VADITS = MAX_EXP; - dVADITS_dVg = dVADITS_dVd = 0; - } - - /* Calculate VASCBE */ - if (pParam->BSIM4v5pscbe2 > 0.0) - { if (diffVds > pParam->BSIM4v5pscbe1 * pParam->BSIM4v5litl - / EXP_THRESHOLD) - { T0 = pParam->BSIM4v5pscbe1 * pParam->BSIM4v5litl / diffVds; - VASCBE = Leff * exp(T0) / pParam->BSIM4v5pscbe2; - T1 = T0 * VASCBE / diffVds; - dVASCBE_dVg = T1 * dVdseff_dVg; - dVASCBE_dVd = -T1 * (1.0 - dVdseff_dVd); - dVASCBE_dVb = T1 * dVdseff_dVb; - } - else - { VASCBE = MAX_EXP * Leff/pParam->BSIM4v5pscbe2; - dVASCBE_dVg = dVASCBE_dVd = dVASCBE_dVb = 0.0; - } - } - else - { VASCBE = MAX_EXP; - dVASCBE_dVg = dVASCBE_dVd = dVASCBE_dVb = 0.0; - } - - /* Add DIBL to Ids */ - T9 = diffVds / VADIBL; - T0 = 1.0 + T9; - Idsa = Idl * T0; - dIdsa_dVg = T0 * dIdl_dVg - Idl * (dVdseff_dVg + T9 * dVADIBL_dVg) / VADIBL; - dIdsa_dVd = T0 * dIdl_dVd + Idl - * (1.0 - dVdseff_dVd - T9 * dVADIBL_dVd) / VADIBL; - dIdsa_dVb = T0 * dIdl_dVb - Idl * (dVdseff_dVb + T9 * dVADIBL_dVb) / VADIBL; - - /* Add DITS to Ids */ - T9 = diffVds / VADITS; - T0 = 1.0 + T9; - dIdsa_dVg = T0 * dIdsa_dVg - Idsa * (dVdseff_dVg + T9 * dVADITS_dVg) / VADITS; - dIdsa_dVd = T0 * dIdsa_dVd + Idsa - * (1.0 - dVdseff_dVd - T9 * dVADITS_dVd) / VADITS; - dIdsa_dVb = T0 * dIdsa_dVb - Idsa * dVdseff_dVb / VADITS; - Idsa *= T0; - - /* Add CLM to Ids */ - T0 = log(Va / Vasat); - dT0_dVg = dVa_dVg / Va - dVasat_dVg / Vasat; - dT0_dVb = dVa_dVb / Va - dVasat_dVb / Vasat; - dT0_dVd = dVa_dVd / Va - dVasat_dVd / Vasat; - T1 = T0 / Cclm; - T9 = 1.0 + T1; - dT9_dVg = (dT0_dVg - T1 * dCclm_dVg) / Cclm; - dT9_dVb = (dT0_dVb - T1 * dCclm_dVb) / Cclm; - dT9_dVd = (dT0_dVd - T1 * dCclm_dVd) / Cclm; - - dIdsa_dVg = dIdsa_dVg * T9 + Idsa * dT9_dVg; - dIdsa_dVb = dIdsa_dVb * T9 + Idsa * dT9_dVb; - dIdsa_dVd = dIdsa_dVd * T9 + Idsa * dT9_dVd; - Idsa *= T9; - - /* Substrate current begins */ - tmp = pParam->BSIM4v5alpha0 + pParam->BSIM4v5alpha1 * Leff; - if ((tmp <= 0.0) || (pParam->BSIM4v5beta0 <= 0.0)) - { Isub = Gbd = Gbb = Gbg = 0.0; - } - else - { T2 = tmp / Leff; - if (diffVds > pParam->BSIM4v5beta0 / EXP_THRESHOLD) - { T0 = -pParam->BSIM4v5beta0 / diffVds; - T1 = T2 * diffVds * exp(T0); - T3 = T1 / diffVds * (T0 - 1.0); - dT1_dVg = T3 * dVdseff_dVg; - dT1_dVd = T3 * (dVdseff_dVd - 1.0); - dT1_dVb = T3 * dVdseff_dVb; - } - else - { T3 = T2 * MIN_EXP; - T1 = T3 * diffVds; - dT1_dVg = -T3 * dVdseff_dVg; - dT1_dVd = T3 * (1.0 - dVdseff_dVd); - dT1_dVb = -T3 * dVdseff_dVb; - } - T4 = Idsa * Vdseff; - Isub = T1 * T4; - Gbg = T1 * (dIdsa_dVg * Vdseff + Idsa * dVdseff_dVg) - + T4 * dT1_dVg; - Gbd = T1 * (dIdsa_dVd * Vdseff + Idsa * dVdseff_dVd) - + T4 * dT1_dVd; - Gbb = T1 * (dIdsa_dVb * Vdseff + Idsa * dVdseff_dVb) - + T4 * dT1_dVb; - - Gbd += Gbg * dVgsteff_dVd; - Gbb += Gbg * dVgsteff_dVb; - Gbg *= dVgsteff_dVg; - Gbb *= dVbseff_dVb; - } - here->BSIM4v5csub = Isub; - here->BSIM4v5gbbs = Gbb; - here->BSIM4v5gbgs = Gbg; - here->BSIM4v5gbds = Gbd; - - /* Add SCBE to Ids */ - T9 = diffVds / VASCBE; - T0 = 1.0 + T9; - Ids = Idsa * T0; - - Gm = T0 * dIdsa_dVg - Idsa - * (dVdseff_dVg + T9 * dVASCBE_dVg) / VASCBE; - Gds = T0 * dIdsa_dVd + Idsa - * (1.0 - dVdseff_dVd - T9 * dVASCBE_dVd) / VASCBE; - Gmb = T0 * dIdsa_dVb - Idsa - * (dVdseff_dVb + T9 * dVASCBE_dVb) / VASCBE; - - - tmp1 = Gds + Gm * dVgsteff_dVd; - tmp2 = Gmb + Gm * dVgsteff_dVb; - tmp3 = Gm; - - Gm = (Ids * dVdseff_dVg + Vdseff * tmp3) * dVgsteff_dVg; - Gds = Ids * (dVdseff_dVd + dVdseff_dVg * dVgsteff_dVd) - + Vdseff * tmp1; - Gmb = (Ids * (dVdseff_dVb + dVdseff_dVg * dVgsteff_dVb) - + Vdseff * tmp2) * dVbseff_dVb; - - cdrain = Ids * Vdseff; - - /* Source End Velocity Limit */ - if((model->BSIM4v5vtlGiven) && (model->BSIM4v5vtl > 0.0) ) { - T12 = 1.0 / Leff / CoxeffWovL; - T11 = T12 / Vgsteff; - T10 = -T11 / Vgsteff; - vs = cdrain * T11; /* vs */ - dvs_dVg = Gm * T11 + cdrain * T10 * dVgsteff_dVg; - dvs_dVd = Gds * T11 + cdrain * T10 * dVgsteff_dVd; - dvs_dVb = Gmb * T11 + cdrain * T10 * dVgsteff_dVb; - T0 = 2 * MM; - T1 = vs / (pParam->BSIM4v5vtl * pParam->BSIM4v5tfactor); - if(T1 > 0.0) - { T2 = 1.0 + exp(T0 * log(T1)); - T3 = (T2 - 1.0) * T0 / vs; - Fsevl = 1.0 / exp(log(T2)/ T0); - dT2_dVg = T3 * dvs_dVg; - dT2_dVd = T3 * dvs_dVd; - dT2_dVb = T3 * dvs_dVb; - T4 = -1.0 / T0 * Fsevl / T2; - dFsevl_dVg = T4 * dT2_dVg; - dFsevl_dVd = T4 * dT2_dVd; - dFsevl_dVb = T4 * dT2_dVb; - } else { - Fsevl = 1.0; - dFsevl_dVg = 0.0; - dFsevl_dVd = 0.0; - dFsevl_dVb = 0.0; - } - Gm *=Fsevl; - Gm += cdrain * dFsevl_dVg; - Gmb *=Fsevl; - Gmb += cdrain * dFsevl_dVb; - Gds *=Fsevl; - Gds += cdrain * dFsevl_dVd; - - cdrain *= Fsevl; - } - - here->BSIM4v5gds = Gds; - here->BSIM4v5gm = Gm; - here->BSIM4v5gmbs = Gmb; - here->BSIM4v5IdovVds = Ids; - if( here->BSIM4v5IdovVds <= 1.0e-9) here->BSIM4v5IdovVds = 1.0e-9; - - /* Calculate Rg */ - if ((here->BSIM4v5rgateMod > 1) || - (here->BSIM4v5trnqsMod != 0) || (here->BSIM4v5acnqsMod != 0)) - { T9 = pParam->BSIM4v5xrcrg2 * model->BSIM4v5vtm; - T0 = T9 * beta; - dT0_dVd = (dbeta_dVd + dbeta_dVg * dVgsteff_dVd) * T9; - dT0_dVb = (dbeta_dVb + dbeta_dVg * dVgsteff_dVb) * T9; - dT0_dVg = dbeta_dVg * T9; - - here->BSIM4v5gcrg = pParam->BSIM4v5xrcrg1 * ( T0 + Ids); - here->BSIM4v5gcrgd = pParam->BSIM4v5xrcrg1 * (dT0_dVd + tmp1); - here->BSIM4v5gcrgb = pParam->BSIM4v5xrcrg1 * (dT0_dVb + tmp2) - * dVbseff_dVb; - here->BSIM4v5gcrgg = pParam->BSIM4v5xrcrg1 * (dT0_dVg + tmp3) - * dVgsteff_dVg; - - if (here->BSIM4v5nf != 1.0) - { here->BSIM4v5gcrg *= here->BSIM4v5nf; - here->BSIM4v5gcrgg *= here->BSIM4v5nf; - here->BSIM4v5gcrgd *= here->BSIM4v5nf; - here->BSIM4v5gcrgb *= here->BSIM4v5nf; - } - - if (here->BSIM4v5rgateMod == 2) - { T10 = here->BSIM4v5grgeltd * here->BSIM4v5grgeltd; - T11 = here->BSIM4v5grgeltd + here->BSIM4v5gcrg; - here->BSIM4v5gcrg = here->BSIM4v5grgeltd * here->BSIM4v5gcrg / T11; - T12 = T10 / T11 / T11; - here->BSIM4v5gcrgg *= T12; - here->BSIM4v5gcrgd *= T12; - here->BSIM4v5gcrgb *= T12; - } - here->BSIM4v5gcrgs = -(here->BSIM4v5gcrgg + here->BSIM4v5gcrgd - + here->BSIM4v5gcrgb); - } - - - /* Calculate bias-dependent external S/D resistance */ - if (model->BSIM4v5rdsMod) - { /* Rs(V) */ - T0 = vgs - pParam->BSIM4v5vfbsd; - T1 = sqrt(T0 * T0 + 1.0e-4); - vgs_eff = 0.5 * (T0 + T1); - dvgs_eff_dvg = vgs_eff / T1; - - T0 = 1.0 + pParam->BSIM4v5prwg * vgs_eff; - dT0_dvg = -pParam->BSIM4v5prwg / T0 / T0 * dvgs_eff_dvg; - T1 = -pParam->BSIM4v5prwb * vbs; - dT1_dvb = -pParam->BSIM4v5prwb; - - T2 = 1.0 / T0 + T1; - T3 = T2 + sqrt(T2 * T2 + 0.01); - dT3_dvg = T3 / (T3 - T2); - dT3_dvb = dT3_dvg * dT1_dvb; - dT3_dvg *= dT0_dvg; - - T4 = pParam->BSIM4v5rs0 * 0.5; - Rs = pParam->BSIM4v5rswmin + T3 * T4; - dRs_dvg = T4 * dT3_dvg; - dRs_dvb = T4 * dT3_dvb; - - T0 = 1.0 + here->BSIM4v5sourceConductance * Rs; - here->BSIM4v5gstot = here->BSIM4v5sourceConductance / T0; - T0 = -here->BSIM4v5gstot * here->BSIM4v5gstot; - dgstot_dvd = 0.0; /* place holder */ - dgstot_dvg = T0 * dRs_dvg; - dgstot_dvb = T0 * dRs_dvb; - dgstot_dvs = -(dgstot_dvg + dgstot_dvb + dgstot_dvd); - - /* Rd(V) */ - T0 = vgd - pParam->BSIM4v5vfbsd; - T1 = sqrt(T0 * T0 + 1.0e-4); - vgd_eff = 0.5 * (T0 + T1); - dvgd_eff_dvg = vgd_eff / T1; - - T0 = 1.0 + pParam->BSIM4v5prwg * vgd_eff; - dT0_dvg = -pParam->BSIM4v5prwg / T0 / T0 * dvgd_eff_dvg; - T1 = -pParam->BSIM4v5prwb * vbd; - dT1_dvb = -pParam->BSIM4v5prwb; - - T2 = 1.0 / T0 + T1; - T3 = T2 + sqrt(T2 * T2 + 0.01); - dT3_dvg = T3 / (T3 - T2); - dT3_dvb = dT3_dvg * dT1_dvb; - dT3_dvg *= dT0_dvg; - - T4 = pParam->BSIM4v5rd0 * 0.5; - Rd = pParam->BSIM4v5rdwmin + T3 * T4; - dRd_dvg = T4 * dT3_dvg; - dRd_dvb = T4 * dT3_dvb; - - T0 = 1.0 + here->BSIM4v5drainConductance * Rd; - here->BSIM4v5gdtot = here->BSIM4v5drainConductance / T0; - T0 = -here->BSIM4v5gdtot * here->BSIM4v5gdtot; - dgdtot_dvs = 0.0; - dgdtot_dvg = T0 * dRd_dvg; - dgdtot_dvb = T0 * dRd_dvb; - dgdtot_dvd = -(dgdtot_dvg + dgdtot_dvb + dgdtot_dvs); - - here->BSIM4v5gstotd = vses * dgstot_dvd; - here->BSIM4v5gstotg = vses * dgstot_dvg; - here->BSIM4v5gstots = vses * dgstot_dvs; - here->BSIM4v5gstotb = vses * dgstot_dvb; - - T2 = vdes - vds; - here->BSIM4v5gdtotd = T2 * dgdtot_dvd; - here->BSIM4v5gdtotg = T2 * dgdtot_dvg; - here->BSIM4v5gdtots = T2 * dgdtot_dvs; - here->BSIM4v5gdtotb = T2 * dgdtot_dvb; - } - else /* WDLiu: for bypass */ - { here->BSIM4v5gstot = here->BSIM4v5gstotd = here->BSIM4v5gstotg = 0.0; - here->BSIM4v5gstots = here->BSIM4v5gstotb = 0.0; - here->BSIM4v5gdtot = here->BSIM4v5gdtotd = here->BSIM4v5gdtotg = 0.0; - here->BSIM4v5gdtots = here->BSIM4v5gdtotb = 0.0; - } - - /* Calculate GIDL current */ - vgs_eff = here->BSIM4v5vgs_eff; - dvgs_eff_dvg = here->BSIM4v5dvgs_eff_dvg; - T0 = 3.0 * model->BSIM4v5toxe; - - T1 = (vds - vgs_eff - pParam->BSIM4v5egidl ) / T0; - if ((pParam->BSIM4v5agidl <= 0.0) || (pParam->BSIM4v5bgidl <= 0.0) - || (T1 <= 0.0) || (pParam->BSIM4v5cgidl <= 0.0) || (vbd > 0.0)) - Igidl = Ggidld = Ggidlg = Ggidlb = 0.0; - else { - dT1_dVd = 1.0 / T0; - dT1_dVg = -dvgs_eff_dvg * dT1_dVd; - T2 = pParam->BSIM4v5bgidl / T1; - if (T2 < 100.0) - { Igidl = pParam->BSIM4v5agidl * pParam->BSIM4v5weffCJ * T1 * exp(-T2); - T3 = Igidl * (1.0 + T2) / T1; - Ggidld = T3 * dT1_dVd; - Ggidlg = T3 * dT1_dVg; - } - else - { Igidl = pParam->BSIM4v5agidl * pParam->BSIM4v5weffCJ * 3.720075976e-44; - Ggidld = Igidl * dT1_dVd; - Ggidlg = Igidl * dT1_dVg; - Igidl *= T1; - } - - T4 = vbd * vbd; - T5 = -vbd * T4; - T6 = pParam->BSIM4v5cgidl + T5; - T7 = T5 / T6; - T8 = 3.0 * pParam->BSIM4v5cgidl * T4 / T6 / T6; - Ggidld = Ggidld * T7 + Igidl * T8; - Ggidlg = Ggidlg * T7; - Ggidlb = -Igidl * T8; - Igidl *= T7; - } - here->BSIM4v5Igidl = Igidl; - here->BSIM4v5ggidld = Ggidld; - here->BSIM4v5ggidlg = Ggidlg; - here->BSIM4v5ggidlb = Ggidlb; - - /* Calculate GISL current */ - vgd_eff = here->BSIM4v5vgd_eff; - dvgd_eff_dvg = here->BSIM4v5dvgd_eff_dvg; - - T1 = (-vds - vgd_eff - pParam->BSIM4v5egidl ) / T0; - - if ((pParam->BSIM4v5agidl <= 0.0) || (pParam->BSIM4v5bgidl <= 0.0) - || (T1 <= 0.0) || (pParam->BSIM4v5cgidl <= 0.0) || (vbs > 0.0)) - Igisl = Ggisls = Ggislg = Ggislb = 0.0; - else { - dT1_dVd = 1.0 / T0; - dT1_dVg = -dvgd_eff_dvg * dT1_dVd; - T2 = pParam->BSIM4v5bgidl / T1; - if (T2 < 100.0) - { Igisl = pParam->BSIM4v5agidl * pParam->BSIM4v5weffCJ * T1 * exp(-T2); - T3 = Igisl * (1.0 + T2) / T1; - Ggisls = T3 * dT1_dVd; - Ggislg = T3 * dT1_dVg; - } - else - { Igisl = pParam->BSIM4v5agidl * pParam->BSIM4v5weffCJ * 3.720075976e-44; - Ggisls = Igisl * dT1_dVd; - Ggislg = Igisl * dT1_dVg; - Igisl *= T1; - } - - T4 = vbs * vbs; - T5 = -vbs * T4; - T6 = pParam->BSIM4v5cgidl + T5; - T7 = T5 / T6; - T8 = 3.0 * pParam->BSIM4v5cgidl * T4 / T6 / T6; - Ggisls = Ggisls * T7 + Igisl * T8; - Ggislg = Ggislg * T7; - Ggislb = -Igisl * T8; - Igisl *= T7; - } - here->BSIM4v5Igisl = Igisl; - here->BSIM4v5ggisls = Ggisls; - here->BSIM4v5ggislg = Ggislg; - here->BSIM4v5ggislb = Ggislb; - - - /* Calculate gate tunneling current */ - if ((model->BSIM4v5igcMod != 0) || (model->BSIM4v5igbMod != 0)) - { Vfb = here->BSIM4v5vfbzb; - V3 = Vfb - Vgs_eff + Vbseff - DELTA_3; - if (Vfb <= 0.0) - T0 = sqrt(V3 * V3 - 4.0 * DELTA_3 * Vfb); - else - T0 = sqrt(V3 * V3 + 4.0 * DELTA_3 * Vfb); - T1 = 0.5 * (1.0 + V3 / T0); - Vfbeff = Vfb - 0.5 * (V3 + T0); - dVfbeff_dVg = T1 * dVgs_eff_dVg; - dVfbeff_dVb = -T1; /* WDLiu: -No surprise? No. -Good! */ - - Voxacc = Vfb - Vfbeff; - dVoxacc_dVg = -dVfbeff_dVg; - dVoxacc_dVb = -dVfbeff_dVb; - if (Voxacc < 0.0) /* WDLiu: Avoiding numerical instability. */ - Voxacc = dVoxacc_dVg = dVoxacc_dVb = 0.0; - - T0 = 0.5 * pParam->BSIM4v5k1ox; - T3 = Vgs_eff - Vfbeff - Vbseff - Vgsteff; - if (pParam->BSIM4v5k1ox == 0.0) - Voxdepinv = dVoxdepinv_dVg = dVoxdepinv_dVd - = dVoxdepinv_dVb = 0.0; - else if (T3 < 0.0) - { Voxdepinv = -T3; - dVoxdepinv_dVg = -dVgs_eff_dVg + dVfbeff_dVg - + dVgsteff_dVg; - dVoxdepinv_dVd = dVgsteff_dVd; - dVoxdepinv_dVb = dVfbeff_dVb + 1.0 + dVgsteff_dVb; - } - else - { T1 = sqrt(T0 * T0 + T3); - T2 = T0 / T1; - Voxdepinv = pParam->BSIM4v5k1ox * (T1 - T0); - dVoxdepinv_dVg = T2 * (dVgs_eff_dVg - dVfbeff_dVg - - dVgsteff_dVg); - dVoxdepinv_dVd = -T2 * dVgsteff_dVd; - dVoxdepinv_dVb = -T2 * (dVfbeff_dVb + 1.0 + dVgsteff_dVb); - } - - Voxdepinv += Vgsteff; - dVoxdepinv_dVg += dVgsteff_dVg; - dVoxdepinv_dVd += dVgsteff_dVd; - dVoxdepinv_dVb += dVgsteff_dVb; - } - - if(model->BSIM4v5tempMod < 2) - tmp = Vtm; - else /* model->BSIM4v5tempMod = 2 */ - tmp = Vtm0; - if (model->BSIM4v5igcMod) - { T0 = tmp * pParam->BSIM4v5nigc; - if(model->BSIM4v5igcMod == 1) { - VxNVt = (Vgs_eff - model->BSIM4v5type * here->BSIM4v5vth0) / T0; - if (VxNVt > EXP_THRESHOLD) - { Vaux = Vgs_eff - model->BSIM4v5type * here->BSIM4v5vth0; - dVaux_dVg = dVgs_eff_dVg; - dVaux_dVd = 0.0; - dVaux_dVb = 0.0; - } - } else if (model->BSIM4v5igcMod == 2) { - VxNVt = (Vgs_eff - here->BSIM4v5von) / T0; - if (VxNVt > EXP_THRESHOLD) - { Vaux = Vgs_eff - here->BSIM4v5von; - dVaux_dVg = dVgs_eff_dVg; - dVaux_dVd = -dVth_dVd; - dVaux_dVb = -dVth_dVb; - } - } - if (VxNVt < -EXP_THRESHOLD) - { Vaux = T0 * log(1.0 + MIN_EXP); - dVaux_dVg = dVaux_dVd = dVaux_dVb = 0.0; - } - else if ((VxNVt >= -EXP_THRESHOLD) && (VxNVt <= EXP_THRESHOLD)) - { ExpVxNVt = exp(VxNVt); - Vaux = T0 * log(1.0 + ExpVxNVt); - dVaux_dVg = ExpVxNVt / (1.0 + ExpVxNVt); - if(model->BSIM4v5igcMod == 1) { - dVaux_dVd = 0.0; - dVaux_dVb = 0.0; - } else if (model->BSIM4v5igcMod == 2) { - dVaux_dVd = -dVgs_eff_dVg * dVth_dVd; - dVaux_dVb = -dVgs_eff_dVg * dVth_dVb; - } - dVaux_dVg *= dVgs_eff_dVg; - } - - T2 = Vgs_eff * Vaux; - dT2_dVg = dVgs_eff_dVg * Vaux + Vgs_eff * dVaux_dVg; - dT2_dVd = Vgs_eff * dVaux_dVd; - dT2_dVb = Vgs_eff * dVaux_dVb; - - T11 = pParam->BSIM4v5Aechvb; - T12 = pParam->BSIM4v5Bechvb; - T3 = pParam->BSIM4v5aigc * pParam->BSIM4v5cigc - - pParam->BSIM4v5bigc; - T4 = pParam->BSIM4v5bigc * pParam->BSIM4v5cigc; - T5 = T12 * (pParam->BSIM4v5aigc + T3 * Voxdepinv - - T4 * Voxdepinv * Voxdepinv); - - if (T5 > EXP_THRESHOLD) - { T6 = MAX_EXP; - dT6_dVg = dT6_dVd = dT6_dVb = 0.0; - } - else if (T5 < -EXP_THRESHOLD) - { T6 = MIN_EXP; - dT6_dVg = dT6_dVd = dT6_dVb = 0.0; - } - else - { T6 = exp(T5); - dT6_dVg = T6 * T12 * (T3 - 2.0 * T4 * Voxdepinv); - dT6_dVd = dT6_dVg * dVoxdepinv_dVd; - dT6_dVb = dT6_dVg * dVoxdepinv_dVb; - dT6_dVg *= dVoxdepinv_dVg; - } - - Igc = T11 * T2 * T6; - dIgc_dVg = T11 * (T2 * dT6_dVg + T6 * dT2_dVg); - dIgc_dVd = T11 * (T2 * dT6_dVd + T6 * dT2_dVd); - dIgc_dVb = T11 * (T2 * dT6_dVb + T6 * dT2_dVb); - - if (model->BSIM4v5pigcdGiven) - { Pigcd = pParam->BSIM4v5pigcd; - dPigcd_dVg = dPigcd_dVd = dPigcd_dVb = 0.0; - } - else - { T11 = pParam->BSIM4v5Bechvb * model->BSIM4v5toxe; - T12 = Vgsteff + 1.0e-20; - T13 = T11 / T12 / T12; - T14 = -T13 / T12; - Pigcd = T13 * (1.0 - 0.5 * Vdseff / T12); - dPigcd_dVg = T14 * (2.0 + 0.5 * (dVdseff_dVg - - 3.0 * Vdseff / T12)); - dPigcd_dVd = 0.5 * T14 * dVdseff_dVd; - dPigcd_dVb = 0.5 * T14 * dVdseff_dVb; - } - - T7 = -Pigcd * Vdseff; /* bugfix */ - dT7_dVg = -Vdseff * dPigcd_dVg - Pigcd * dVdseff_dVg; - dT7_dVd = -Vdseff * dPigcd_dVd - Pigcd * dVdseff_dVd + dT7_dVg * dVgsteff_dVd; - dT7_dVb = -Vdseff * dPigcd_dVb - Pigcd * dVdseff_dVb + dT7_dVg * dVgsteff_dVb; - dT7_dVg *= dVgsteff_dVg; - dT7_dVb *= dVbseff_dVb; - T8 = T7 * T7 + 2.0e-4; - dT8_dVg = 2.0 * T7; - dT8_dVd = dT8_dVg * dT7_dVd; - dT8_dVb = dT8_dVg * dT7_dVb; - dT8_dVg *= dT7_dVg; - - if (T7 > EXP_THRESHOLD) - { T9 = MAX_EXP; - dT9_dVg = dT9_dVd = dT9_dVb = 0.0; - } - else if (T7 < -EXP_THRESHOLD) - { T9 = MIN_EXP; - dT9_dVg = dT9_dVd = dT9_dVb = 0.0; - } - else - { T9 = exp(T7); - dT9_dVg = T9 * dT7_dVg; - dT9_dVd = T9 * dT7_dVd; - dT9_dVb = T9 * dT7_dVb; - } - - T0 = T8 * T8; - T1 = T9 - 1.0 + 1.0e-4; - T10 = (T1 - T7) / T8; - dT10_dVg = (dT9_dVg - dT7_dVg - T10 * dT8_dVg) / T8; - dT10_dVd = (dT9_dVd - dT7_dVd - T10 * dT8_dVd) / T8; - dT10_dVb = (dT9_dVb - dT7_dVb - T10 * dT8_dVb) / T8; - - Igcs = Igc * T10; - dIgcs_dVg = dIgc_dVg * T10 + Igc * dT10_dVg; - dIgcs_dVd = dIgc_dVd * T10 + Igc * dT10_dVd; - dIgcs_dVb = dIgc_dVb * T10 + Igc * dT10_dVb; - - T1 = T9 - 1.0 - 1.0e-4; - T10 = (T7 * T9 - T1) / T8; - dT10_dVg = (dT7_dVg * T9 + (T7 - 1.0) * dT9_dVg - - T10 * dT8_dVg) / T8; - dT10_dVd = (dT7_dVd * T9 + (T7 - 1.0) * dT9_dVd - - T10 * dT8_dVd) / T8; - dT10_dVb = (dT7_dVb * T9 + (T7 - 1.0) * dT9_dVb - - T10 * dT8_dVb) / T8; - Igcd = Igc * T10; - dIgcd_dVg = dIgc_dVg * T10 + Igc * dT10_dVg; - dIgcd_dVd = dIgc_dVd * T10 + Igc * dT10_dVd; - dIgcd_dVb = dIgc_dVb * T10 + Igc * dT10_dVb; - - here->BSIM4v5Igcs = Igcs; - here->BSIM4v5gIgcsg = dIgcs_dVg; - here->BSIM4v5gIgcsd = dIgcs_dVd; - here->BSIM4v5gIgcsb = dIgcs_dVb * dVbseff_dVb; - here->BSIM4v5Igcd = Igcd; - here->BSIM4v5gIgcdg = dIgcd_dVg; - here->BSIM4v5gIgcdd = dIgcd_dVd; - here->BSIM4v5gIgcdb = dIgcd_dVb * dVbseff_dVb; - - T0 = vgs - (pParam->BSIM4v5vfbsd + pParam->BSIM4v5vfbsdoff); - vgs_eff = sqrt(T0 * T0 + 1.0e-4); - dvgs_eff_dvg = T0 / vgs_eff; - - T2 = vgs * vgs_eff; - dT2_dVg = vgs * dvgs_eff_dvg + vgs_eff; - T11 = pParam->BSIM4v5AechvbEdge; - T12 = pParam->BSIM4v5BechvbEdge; - T3 = pParam->BSIM4v5aigsd * pParam->BSIM4v5cigsd - - pParam->BSIM4v5bigsd; - T4 = pParam->BSIM4v5bigsd * pParam->BSIM4v5cigsd; - T5 = T12 * (pParam->BSIM4v5aigsd + T3 * vgs_eff - - T4 * vgs_eff * vgs_eff); - if (T5 > EXP_THRESHOLD) - { T6 = MAX_EXP; - dT6_dVg = 0.0; - } - else if (T5 < -EXP_THRESHOLD) - { T6 = MIN_EXP; - dT6_dVg = 0.0; - } - else - { T6 = exp(T5); - dT6_dVg = T6 * T12 * (T3 - 2.0 * T4 * vgs_eff) - * dvgs_eff_dvg; - } - Igs = T11 * T2 * T6; - dIgs_dVg = T11 * (T2 * dT6_dVg + T6 * dT2_dVg); - dIgs_dVs = -dIgs_dVg; - - - T0 = vgd - (pParam->BSIM4v5vfbsd + pParam->BSIM4v5vfbsdoff); - vgd_eff = sqrt(T0 * T0 + 1.0e-4); - dvgd_eff_dvg = T0 / vgd_eff; - - T2 = vgd * vgd_eff; - dT2_dVg = vgd * dvgd_eff_dvg + vgd_eff; - T5 = T12 * (pParam->BSIM4v5aigsd + T3 * vgd_eff - - T4 * vgd_eff * vgd_eff); - if (T5 > EXP_THRESHOLD) - { T6 = MAX_EXP; - dT6_dVg = 0.0; - } - else if (T5 < -EXP_THRESHOLD) - { T6 = MIN_EXP; - dT6_dVg = 0.0; - } - else - { T6 = exp(T5); - dT6_dVg = T6 * T12 * (T3 - 2.0 * T4 * vgd_eff) - * dvgd_eff_dvg; - } - Igd = T11 * T2 * T6; - dIgd_dVg = T11 * (T2 * dT6_dVg + T6 * dT2_dVg); - dIgd_dVd = -dIgd_dVg; - - here->BSIM4v5Igs = Igs; - here->BSIM4v5gIgsg = dIgs_dVg; - here->BSIM4v5gIgss = dIgs_dVs; - here->BSIM4v5Igd = Igd; - here->BSIM4v5gIgdg = dIgd_dVg; - here->BSIM4v5gIgdd = dIgd_dVd; - } - else - { here->BSIM4v5Igcs = here->BSIM4v5gIgcsg = here->BSIM4v5gIgcsd - = here->BSIM4v5gIgcsb = 0.0; - here->BSIM4v5Igcd = here->BSIM4v5gIgcdg = here->BSIM4v5gIgcdd - = here->BSIM4v5gIgcdb = 0.0; - here->BSIM4v5Igs = here->BSIM4v5gIgsg = here->BSIM4v5gIgss = 0.0; - here->BSIM4v5Igd = here->BSIM4v5gIgdg = here->BSIM4v5gIgdd = 0.0; - } - - if (model->BSIM4v5igbMod) - { T0 = tmp * pParam->BSIM4v5nigbacc; - T1 = -Vgs_eff + Vbseff + Vfb; - VxNVt = T1 / T0; - if (VxNVt > EXP_THRESHOLD) - { Vaux = T1; - dVaux_dVg = -dVgs_eff_dVg; - dVaux_dVb = 1.0; - } - else if (VxNVt < -EXP_THRESHOLD) - { Vaux = T0 * log(1.0 + MIN_EXP); - dVaux_dVg = dVaux_dVb = 0.0; - } - else - { ExpVxNVt = exp(VxNVt); - Vaux = T0 * log(1.0 + ExpVxNVt); - dVaux_dVb = ExpVxNVt / (1.0 + ExpVxNVt); - dVaux_dVg = -dVaux_dVb * dVgs_eff_dVg; - } - - T2 = (Vgs_eff - Vbseff) * Vaux; - dT2_dVg = dVgs_eff_dVg * Vaux + (Vgs_eff - Vbseff) * dVaux_dVg; - dT2_dVb = -Vaux + (Vgs_eff - Vbseff) * dVaux_dVb; - - T11 = 4.97232e-7 * pParam->BSIM4v5weff - * pParam->BSIM4v5leff * pParam->BSIM4v5ToxRatio; - T12 = -7.45669e11 * model->BSIM4v5toxe; - T3 = pParam->BSIM4v5aigbacc * pParam->BSIM4v5cigbacc - - pParam->BSIM4v5bigbacc; - T4 = pParam->BSIM4v5bigbacc * pParam->BSIM4v5cigbacc; - T5 = T12 * (pParam->BSIM4v5aigbacc + T3 * Voxacc - - T4 * Voxacc * Voxacc); - - if (T5 > EXP_THRESHOLD) - { T6 = MAX_EXP; - dT6_dVg = dT6_dVb = 0.0; - } - else if (T5 < -EXP_THRESHOLD) - { T6 = MIN_EXP; - dT6_dVg = dT6_dVb = 0.0; - } - else - { T6 = exp(T5); - dT6_dVg = T6 * T12 * (T3 - 2.0 * T4 * Voxacc); - dT6_dVb = dT6_dVg * dVoxacc_dVb; - dT6_dVg *= dVoxacc_dVg; - } - - Igbacc = T11 * T2 * T6; - dIgbacc_dVg = T11 * (T2 * dT6_dVg + T6 * dT2_dVg); - dIgbacc_dVb = T11 * (T2 * dT6_dVb + T6 * dT2_dVb); - - - T0 = tmp * pParam->BSIM4v5nigbinv; - T1 = Voxdepinv - pParam->BSIM4v5eigbinv; - VxNVt = T1 / T0; - if (VxNVt > EXP_THRESHOLD) - { Vaux = T1; - dVaux_dVg = dVoxdepinv_dVg; - dVaux_dVd = dVoxdepinv_dVd; - dVaux_dVb = dVoxdepinv_dVb; - } - else if (VxNVt < -EXP_THRESHOLD) - { Vaux = T0 * log(1.0 + MIN_EXP); - dVaux_dVg = dVaux_dVd = dVaux_dVb = 0.0; - } - else - { ExpVxNVt = exp(VxNVt); - Vaux = T0 * log(1.0 + ExpVxNVt); - dVaux_dVg = ExpVxNVt / (1.0 + ExpVxNVt); - dVaux_dVd = dVaux_dVg * dVoxdepinv_dVd; - dVaux_dVb = dVaux_dVg * dVoxdepinv_dVb; - dVaux_dVg *= dVoxdepinv_dVg; - } - - T2 = (Vgs_eff - Vbseff) * Vaux; - dT2_dVg = dVgs_eff_dVg * Vaux + (Vgs_eff - Vbseff) * dVaux_dVg; - dT2_dVd = (Vgs_eff - Vbseff) * dVaux_dVd; - dT2_dVb = -Vaux + (Vgs_eff - Vbseff) * dVaux_dVb; - - T11 *= 0.75610; - T12 *= 1.31724; - T3 = pParam->BSIM4v5aigbinv * pParam->BSIM4v5cigbinv - - pParam->BSIM4v5bigbinv; - T4 = pParam->BSIM4v5bigbinv * pParam->BSIM4v5cigbinv; - T5 = T12 * (pParam->BSIM4v5aigbinv + T3 * Voxdepinv - - T4 * Voxdepinv * Voxdepinv); - - if (T5 > EXP_THRESHOLD) - { T6 = MAX_EXP; - dT6_dVg = dT6_dVd = dT6_dVb = 0.0; - } - else if (T5 < -EXP_THRESHOLD) - { T6 = MIN_EXP; - dT6_dVg = dT6_dVd = dT6_dVb = 0.0; - } - else - { T6 = exp(T5); - dT6_dVg = T6 * T12 * (T3 - 2.0 * T4 * Voxdepinv); - dT6_dVd = dT6_dVg * dVoxdepinv_dVd; - dT6_dVb = dT6_dVg * dVoxdepinv_dVb; - dT6_dVg *= dVoxdepinv_dVg; - } - - Igbinv = T11 * T2 * T6; - dIgbinv_dVg = T11 * (T2 * dT6_dVg + T6 * dT2_dVg); - dIgbinv_dVd = T11 * (T2 * dT6_dVd + T6 * dT2_dVd); - dIgbinv_dVb = T11 * (T2 * dT6_dVb + T6 * dT2_dVb); - - here->BSIM4v5Igb = Igbinv + Igbacc; - here->BSIM4v5gIgbg = dIgbinv_dVg + dIgbacc_dVg; - here->BSIM4v5gIgbd = dIgbinv_dVd; - here->BSIM4v5gIgbb = (dIgbinv_dVb + dIgbacc_dVb) * dVbseff_dVb; - } - else - { here->BSIM4v5Igb = here->BSIM4v5gIgbg = here->BSIM4v5gIgbd - = here->BSIM4v5gIgbs = here->BSIM4v5gIgbb = 0.0; - } /* End of Gate current */ - - if (here->BSIM4v5nf != 1.0) - { cdrain *= here->BSIM4v5nf; - here->BSIM4v5gds *= here->BSIM4v5nf; - here->BSIM4v5gm *= here->BSIM4v5nf; - here->BSIM4v5gmbs *= here->BSIM4v5nf; - here->BSIM4v5IdovVds *= here->BSIM4v5nf; - - here->BSIM4v5gbbs *= here->BSIM4v5nf; - here->BSIM4v5gbgs *= here->BSIM4v5nf; - here->BSIM4v5gbds *= here->BSIM4v5nf; - here->BSIM4v5csub *= here->BSIM4v5nf; - - here->BSIM4v5Igidl *= here->BSIM4v5nf; - here->BSIM4v5ggidld *= here->BSIM4v5nf; - here->BSIM4v5ggidlg *= here->BSIM4v5nf; - here->BSIM4v5ggidlb *= here->BSIM4v5nf; - - here->BSIM4v5Igisl *= here->BSIM4v5nf; - here->BSIM4v5ggisls *= here->BSIM4v5nf; - here->BSIM4v5ggislg *= here->BSIM4v5nf; - here->BSIM4v5ggislb *= here->BSIM4v5nf; - - here->BSIM4v5Igcs *= here->BSIM4v5nf; - here->BSIM4v5gIgcsg *= here->BSIM4v5nf; - here->BSIM4v5gIgcsd *= here->BSIM4v5nf; - here->BSIM4v5gIgcsb *= here->BSIM4v5nf; - here->BSIM4v5Igcd *= here->BSIM4v5nf; - here->BSIM4v5gIgcdg *= here->BSIM4v5nf; - here->BSIM4v5gIgcdd *= here->BSIM4v5nf; - here->BSIM4v5gIgcdb *= here->BSIM4v5nf; - - here->BSIM4v5Igs *= here->BSIM4v5nf; - here->BSIM4v5gIgsg *= here->BSIM4v5nf; - here->BSIM4v5gIgss *= here->BSIM4v5nf; - here->BSIM4v5Igd *= here->BSIM4v5nf; - here->BSIM4v5gIgdg *= here->BSIM4v5nf; - here->BSIM4v5gIgdd *= here->BSIM4v5nf; - - here->BSIM4v5Igb *= here->BSIM4v5nf; - here->BSIM4v5gIgbg *= here->BSIM4v5nf; - here->BSIM4v5gIgbd *= here->BSIM4v5nf; - here->BSIM4v5gIgbb *= here->BSIM4v5nf; - } - - here->BSIM4v5ggidls = -(here->BSIM4v5ggidld + here->BSIM4v5ggidlg - + here->BSIM4v5ggidlb); - here->BSIM4v5ggisld = -(here->BSIM4v5ggisls + here->BSIM4v5ggislg - + here->BSIM4v5ggislb); - here->BSIM4v5gIgbs = -(here->BSIM4v5gIgbg + here->BSIM4v5gIgbd - + here->BSIM4v5gIgbb); - here->BSIM4v5gIgcss = -(here->BSIM4v5gIgcsg + here->BSIM4v5gIgcsd - + here->BSIM4v5gIgcsb); - here->BSIM4v5gIgcds = -(here->BSIM4v5gIgcdg + here->BSIM4v5gIgcdd - + here->BSIM4v5gIgcdb); - here->BSIM4v5cd = cdrain; - - - if (model->BSIM4v5tnoiMod == 0) - { Abulk = Abulk0 * pParam->BSIM4v5abulkCVfactor; - Vdsat = Vgsteff / Abulk; - T0 = Vdsat - Vds - DELTA_4; - T1 = sqrt(T0 * T0 + 4.0 * DELTA_4 * Vdsat); - if (T0 >= 0.0) - Vdseff = Vdsat - 0.5 * (T0 + T1); - else - { T3 = (DELTA_4 + DELTA_4) / (T1 - T0); - T4 = 1.0 - T3; - T5 = Vdsat * T3 / (T1 - T0); - Vdseff = Vdsat * T4; - } - if (Vds == 0.0) - Vdseff = 0.0; - - T0 = Abulk * Vdseff; - T1 = 12.0 * (Vgsteff - 0.5 * T0 + 1.0e-20); - T2 = Vdseff / T1; - T3 = T0 * T2; - here->BSIM4v5qinv = Coxeff * pParam->BSIM4v5weffCV * here->BSIM4v5nf - * pParam->BSIM4v5leffCV - * (Vgsteff - 0.5 * T0 + Abulk * T3); - } - - /* - * BSIM4v5 C-V begins - */ - - if ((model->BSIM4v5xpart < 0) || (!ChargeComputationNeeded)) - { qgate = qdrn = qsrc = qbulk = 0.0; - here->BSIM4v5cggb = here->BSIM4v5cgsb = here->BSIM4v5cgdb = 0.0; - here->BSIM4v5cdgb = here->BSIM4v5cdsb = here->BSIM4v5cddb = 0.0; - here->BSIM4v5cbgb = here->BSIM4v5cbsb = here->BSIM4v5cbdb = 0.0; - here->BSIM4v5csgb = here->BSIM4v5cssb = here->BSIM4v5csdb = 0.0; - here->BSIM4v5cgbb = here->BSIM4v5csbb = here->BSIM4v5cdbb = here->BSIM4v5cbbb = 0.0; - here->BSIM4v5cqdb = here->BSIM4v5cqsb = here->BSIM4v5cqgb - = here->BSIM4v5cqbb = 0.0; - here->BSIM4v5gtau = 0.0; - goto finished; - } - else if (model->BSIM4v5capMod == 0) - { - if (Vbseff < 0.0) - { Vbseff = Vbs; - dVbseff_dVb = 1.0; - } - else - { Vbseff = pParam->BSIM4v5phi - Phis; - dVbseff_dVb = -dPhis_dVb; - } - - Vfb = pParam->BSIM4v5vfbcv; - Vth = Vfb + pParam->BSIM4v5phi + pParam->BSIM4v5k1ox * sqrtPhis; - Vgst = Vgs_eff - Vth; - dVth_dVb = pParam->BSIM4v5k1ox * dsqrtPhis_dVb; - dVgst_dVb = -dVth_dVb; - dVgst_dVg = dVgs_eff_dVg; - - CoxWL = model->BSIM4v5coxe * pParam->BSIM4v5weffCV - * pParam->BSIM4v5leffCV * here->BSIM4v5nf; - Arg1 = Vgs_eff - Vbseff - Vfb; - - if (Arg1 <= 0.0) - { qgate = CoxWL * Arg1; - qbulk = -qgate; - qdrn = 0.0; - - here->BSIM4v5cggb = CoxWL * dVgs_eff_dVg; - here->BSIM4v5cgdb = 0.0; - here->BSIM4v5cgsb = CoxWL * (dVbseff_dVb - dVgs_eff_dVg); - - here->BSIM4v5cdgb = 0.0; - here->BSIM4v5cddb = 0.0; - here->BSIM4v5cdsb = 0.0; - - here->BSIM4v5cbgb = -CoxWL * dVgs_eff_dVg; - here->BSIM4v5cbdb = 0.0; - here->BSIM4v5cbsb = -here->BSIM4v5cgsb; - } /* Arg1 <= 0.0, end of accumulation */ - else if (Vgst <= 0.0) - { T1 = 0.5 * pParam->BSIM4v5k1ox; - T2 = sqrt(T1 * T1 + Arg1); - qgate = CoxWL * pParam->BSIM4v5k1ox * (T2 - T1); - qbulk = -qgate; - qdrn = 0.0; - - T0 = CoxWL * T1 / T2; - here->BSIM4v5cggb = T0 * dVgs_eff_dVg; - here->BSIM4v5cgdb = 0.0; - here->BSIM4v5cgsb = T0 * (dVbseff_dVb - dVgs_eff_dVg); - - here->BSIM4v5cdgb = 0.0; - here->BSIM4v5cddb = 0.0; - here->BSIM4v5cdsb = 0.0; - - here->BSIM4v5cbgb = -here->BSIM4v5cggb; - here->BSIM4v5cbdb = 0.0; - here->BSIM4v5cbsb = -here->BSIM4v5cgsb; - } /* Vgst <= 0.0, end of depletion */ - else - { One_Third_CoxWL = CoxWL / 3.0; - Two_Third_CoxWL = 2.0 * One_Third_CoxWL; - - AbulkCV = Abulk0 * pParam->BSIM4v5abulkCVfactor; - dAbulkCV_dVb = pParam->BSIM4v5abulkCVfactor * dAbulk0_dVb; - Vdsat = Vgst / AbulkCV; - dVdsat_dVg = dVgs_eff_dVg / AbulkCV; - dVdsat_dVb = - (Vdsat * dAbulkCV_dVb + dVth_dVb)/ AbulkCV; - - if (model->BSIM4v5xpart > 0.5) - { /* 0/100 Charge partition model */ - if (Vdsat <= Vds) - { /* saturation region */ - T1 = Vdsat / 3.0; - qgate = CoxWL * (Vgs_eff - Vfb - - pParam->BSIM4v5phi - T1); - T2 = -Two_Third_CoxWL * Vgst; - qbulk = -(qgate + T2); - qdrn = 0.0; - - here->BSIM4v5cggb = One_Third_CoxWL * (3.0 - - dVdsat_dVg) * dVgs_eff_dVg; - T2 = -One_Third_CoxWL * dVdsat_dVb; - here->BSIM4v5cgsb = -(here->BSIM4v5cggb + T2); - here->BSIM4v5cgdb = 0.0; - - here->BSIM4v5cdgb = 0.0; - here->BSIM4v5cddb = 0.0; - here->BSIM4v5cdsb = 0.0; - - here->BSIM4v5cbgb = -(here->BSIM4v5cggb - - Two_Third_CoxWL * dVgs_eff_dVg); - T3 = -(T2 + Two_Third_CoxWL * dVth_dVb); - here->BSIM4v5cbsb = -(here->BSIM4v5cbgb + T3); - here->BSIM4v5cbdb = 0.0; - } - else - { /* linear region */ - Alphaz = Vgst / Vdsat; - T1 = 2.0 * Vdsat - Vds; - T2 = Vds / (3.0 * T1); - T3 = T2 * Vds; - T9 = 0.25 * CoxWL; - T4 = T9 * Alphaz; - T7 = 2.0 * Vds - T1 - 3.0 * T3; - T8 = T3 - T1 - 2.0 * Vds; - qgate = CoxWL * (Vgs_eff - Vfb - - pParam->BSIM4v5phi - 0.5 * (Vds - T3)); - T10 = T4 * T8; - qdrn = T4 * T7; - qbulk = -(qgate + qdrn + T10); - - T5 = T3 / T1; - here->BSIM4v5cggb = CoxWL * (1.0 - T5 * dVdsat_dVg) - * dVgs_eff_dVg; - T11 = -CoxWL * T5 * dVdsat_dVb; - here->BSIM4v5cgdb = CoxWL * (T2 - 0.5 + 0.5 * T5); - here->BSIM4v5cgsb = -(here->BSIM4v5cggb + T11 - + here->BSIM4v5cgdb); - T6 = 1.0 / Vdsat; - dAlphaz_dVg = T6 * (1.0 - Alphaz * dVdsat_dVg); - dAlphaz_dVb = -T6 * (dVth_dVb + Alphaz * dVdsat_dVb); - T7 = T9 * T7; - T8 = T9 * T8; - T9 = 2.0 * T4 * (1.0 - 3.0 * T5); - here->BSIM4v5cdgb = (T7 * dAlphaz_dVg - T9 - * dVdsat_dVg) * dVgs_eff_dVg; - T12 = T7 * dAlphaz_dVb - T9 * dVdsat_dVb; - here->BSIM4v5cddb = T4 * (3.0 - 6.0 * T2 - 3.0 * T5); - here->BSIM4v5cdsb = -(here->BSIM4v5cdgb + T12 - + here->BSIM4v5cddb); - - T9 = 2.0 * T4 * (1.0 + T5); - T10 = (T8 * dAlphaz_dVg - T9 * dVdsat_dVg) - * dVgs_eff_dVg; - T11 = T8 * dAlphaz_dVb - T9 * dVdsat_dVb; - T12 = T4 * (2.0 * T2 + T5 - 1.0); - T0 = -(T10 + T11 + T12); - - here->BSIM4v5cbgb = -(here->BSIM4v5cggb - + here->BSIM4v5cdgb + T10); - here->BSIM4v5cbdb = -(here->BSIM4v5cgdb - + here->BSIM4v5cddb + T12); - here->BSIM4v5cbsb = -(here->BSIM4v5cgsb - + here->BSIM4v5cdsb + T0); - } - } - else if (model->BSIM4v5xpart < 0.5) - { /* 40/60 Charge partition model */ - if (Vds >= Vdsat) - { /* saturation region */ - T1 = Vdsat / 3.0; - qgate = CoxWL * (Vgs_eff - Vfb - - pParam->BSIM4v5phi - T1); - T2 = -Two_Third_CoxWL * Vgst; - qbulk = -(qgate + T2); - qdrn = 0.4 * T2; - - here->BSIM4v5cggb = One_Third_CoxWL * (3.0 - - dVdsat_dVg) * dVgs_eff_dVg; - T2 = -One_Third_CoxWL * dVdsat_dVb; - here->BSIM4v5cgsb = -(here->BSIM4v5cggb + T2); - here->BSIM4v5cgdb = 0.0; - - T3 = 0.4 * Two_Third_CoxWL; - here->BSIM4v5cdgb = -T3 * dVgs_eff_dVg; - here->BSIM4v5cddb = 0.0; - T4 = T3 * dVth_dVb; - here->BSIM4v5cdsb = -(T4 + here->BSIM4v5cdgb); - - here->BSIM4v5cbgb = -(here->BSIM4v5cggb - - Two_Third_CoxWL * dVgs_eff_dVg); - T3 = -(T2 + Two_Third_CoxWL * dVth_dVb); - here->BSIM4v5cbsb = -(here->BSIM4v5cbgb + T3); - here->BSIM4v5cbdb = 0.0; - } - else - { /* linear region */ - Alphaz = Vgst / Vdsat; - T1 = 2.0 * Vdsat - Vds; - T2 = Vds / (3.0 * T1); - T3 = T2 * Vds; - T9 = 0.25 * CoxWL; - T4 = T9 * Alphaz; - qgate = CoxWL * (Vgs_eff - Vfb - pParam->BSIM4v5phi - - 0.5 * (Vds - T3)); - - T5 = T3 / T1; - here->BSIM4v5cggb = CoxWL * (1.0 - T5 * dVdsat_dVg) - * dVgs_eff_dVg; - tmp = -CoxWL * T5 * dVdsat_dVb; - here->BSIM4v5cgdb = CoxWL * (T2 - 0.5 + 0.5 * T5); - here->BSIM4v5cgsb = -(here->BSIM4v5cggb - + here->BSIM4v5cgdb + tmp); - - T6 = 1.0 / Vdsat; - dAlphaz_dVg = T6 * (1.0 - Alphaz * dVdsat_dVg); - dAlphaz_dVb = -T6 * (dVth_dVb + Alphaz * dVdsat_dVb); - - T6 = 8.0 * Vdsat * Vdsat - 6.0 * Vdsat * Vds - + 1.2 * Vds * Vds; - T8 = T2 / T1; - T7 = Vds - T1 - T8 * T6; - qdrn = T4 * T7; - T7 *= T9; - tmp = T8 / T1; - tmp1 = T4 * (2.0 - 4.0 * tmp * T6 - + T8 * (16.0 * Vdsat - 6.0 * Vds)); - - here->BSIM4v5cdgb = (T7 * dAlphaz_dVg - tmp1 - * dVdsat_dVg) * dVgs_eff_dVg; - T10 = T7 * dAlphaz_dVb - tmp1 * dVdsat_dVb; - here->BSIM4v5cddb = T4 * (2.0 - (1.0 / (3.0 * T1 - * T1) + 2.0 * tmp) * T6 + T8 - * (6.0 * Vdsat - 2.4 * Vds)); - here->BSIM4v5cdsb = -(here->BSIM4v5cdgb - + T10 + here->BSIM4v5cddb); - - T7 = 2.0 * (T1 + T3); - qbulk = -(qgate - T4 * T7); - T7 *= T9; - T0 = 4.0 * T4 * (1.0 - T5); - T12 = (-T7 * dAlphaz_dVg - here->BSIM4v5cdgb - - T0 * dVdsat_dVg) * dVgs_eff_dVg; - T11 = -T7 * dAlphaz_dVb - T10 - T0 * dVdsat_dVb; - T10 = -4.0 * T4 * (T2 - 0.5 + 0.5 * T5) - - here->BSIM4v5cddb; - tmp = -(T10 + T11 + T12); - - here->BSIM4v5cbgb = -(here->BSIM4v5cggb - + here->BSIM4v5cdgb + T12); - here->BSIM4v5cbdb = -(here->BSIM4v5cgdb - + here->BSIM4v5cddb + T10); - here->BSIM4v5cbsb = -(here->BSIM4v5cgsb - + here->BSIM4v5cdsb + tmp); - } - } - else - { /* 50/50 partitioning */ - if (Vds >= Vdsat) - { /* saturation region */ - T1 = Vdsat / 3.0; - qgate = CoxWL * (Vgs_eff - Vfb - - pParam->BSIM4v5phi - T1); - T2 = -Two_Third_CoxWL * Vgst; - qbulk = -(qgate + T2); - qdrn = 0.5 * T2; - - here->BSIM4v5cggb = One_Third_CoxWL * (3.0 - - dVdsat_dVg) * dVgs_eff_dVg; - T2 = -One_Third_CoxWL * dVdsat_dVb; - here->BSIM4v5cgsb = -(here->BSIM4v5cggb + T2); - here->BSIM4v5cgdb = 0.0; - - here->BSIM4v5cdgb = -One_Third_CoxWL * dVgs_eff_dVg; - here->BSIM4v5cddb = 0.0; - T4 = One_Third_CoxWL * dVth_dVb; - here->BSIM4v5cdsb = -(T4 + here->BSIM4v5cdgb); - - here->BSIM4v5cbgb = -(here->BSIM4v5cggb - - Two_Third_CoxWL * dVgs_eff_dVg); - T3 = -(T2 + Two_Third_CoxWL * dVth_dVb); - here->BSIM4v5cbsb = -(here->BSIM4v5cbgb + T3); - here->BSIM4v5cbdb = 0.0; - } - else - { /* linear region */ - Alphaz = Vgst / Vdsat; - T1 = 2.0 * Vdsat - Vds; - T2 = Vds / (3.0 * T1); - T3 = T2 * Vds; - T9 = 0.25 * CoxWL; - T4 = T9 * Alphaz; - qgate = CoxWL * (Vgs_eff - Vfb - pParam->BSIM4v5phi - - 0.5 * (Vds - T3)); - - T5 = T3 / T1; - here->BSIM4v5cggb = CoxWL * (1.0 - T5 * dVdsat_dVg) - * dVgs_eff_dVg; - tmp = -CoxWL * T5 * dVdsat_dVb; - here->BSIM4v5cgdb = CoxWL * (T2 - 0.5 + 0.5 * T5); - here->BSIM4v5cgsb = -(here->BSIM4v5cggb - + here->BSIM4v5cgdb + tmp); - - T6 = 1.0 / Vdsat; - dAlphaz_dVg = T6 * (1.0 - Alphaz * dVdsat_dVg); - dAlphaz_dVb = -T6 * (dVth_dVb + Alphaz * dVdsat_dVb); - - T7 = T1 + T3; - qdrn = -T4 * T7; - qbulk = - (qgate + qdrn + qdrn); - T7 *= T9; - T0 = T4 * (2.0 * T5 - 2.0); - - here->BSIM4v5cdgb = (T0 * dVdsat_dVg - T7 - * dAlphaz_dVg) * dVgs_eff_dVg; - T12 = T0 * dVdsat_dVb - T7 * dAlphaz_dVb; - here->BSIM4v5cddb = T4 * (1.0 - 2.0 * T2 - T5); - here->BSIM4v5cdsb = -(here->BSIM4v5cdgb + T12 - + here->BSIM4v5cddb); - - here->BSIM4v5cbgb = -(here->BSIM4v5cggb - + 2.0 * here->BSIM4v5cdgb); - here->BSIM4v5cbdb = -(here->BSIM4v5cgdb - + 2.0 * here->BSIM4v5cddb); - here->BSIM4v5cbsb = -(here->BSIM4v5cgsb - + 2.0 * here->BSIM4v5cdsb); - } /* end of linear region */ - } /* end of 50/50 partition */ - } /* end of inversion */ - } /* end of capMod=0 */ - else - { if (Vbseff < 0.0) - { VbseffCV = Vbseff; - dVbseffCV_dVb = 1.0; - } - else - { VbseffCV = pParam->BSIM4v5phi - Phis; - dVbseffCV_dVb = -dPhis_dVb; - } - - CoxWL = model->BSIM4v5coxe * pParam->BSIM4v5weffCV - * pParam->BSIM4v5leffCV * here->BSIM4v5nf; - - /* Seperate VgsteffCV with noff and voffcv */ - noff = n * pParam->BSIM4v5noff; - dnoff_dVd = pParam->BSIM4v5noff * dn_dVd; - dnoff_dVb = pParam->BSIM4v5noff * dn_dVb; - T0 = Vtm * noff; - voffcv = pParam->BSIM4v5voffcv; - VgstNVt = (Vgst - voffcv) / T0; - - if (VgstNVt > EXP_THRESHOLD) - { Vgsteff = Vgst - voffcv; - dVgsteff_dVg = dVgs_eff_dVg; - dVgsteff_dVd = -dVth_dVd; - dVgsteff_dVb = -dVth_dVb; - } - else if (VgstNVt < -EXP_THRESHOLD) - { Vgsteff = T0 * log(1.0 + MIN_EXP); - dVgsteff_dVg = 0.0; - dVgsteff_dVd = Vgsteff / noff; - dVgsteff_dVb = dVgsteff_dVd * dnoff_dVb; - dVgsteff_dVd *= dnoff_dVd; - } - else - { ExpVgst = exp(VgstNVt); - Vgsteff = T0 * log(1.0 + ExpVgst); - dVgsteff_dVg = ExpVgst / (1.0 + ExpVgst); - dVgsteff_dVd = -dVgsteff_dVg * (dVth_dVd + (Vgst - voffcv) - / noff * dnoff_dVd) + Vgsteff / noff * dnoff_dVd; - dVgsteff_dVb = -dVgsteff_dVg * (dVth_dVb + (Vgst - voffcv) - / noff * dnoff_dVb) + Vgsteff / noff * dnoff_dVb; - dVgsteff_dVg *= dVgs_eff_dVg; - } /* End of VgsteffCV */ - - - if (model->BSIM4v5capMod == 1) - { Vfb = here->BSIM4v5vfbzb; - V3 = Vfb - Vgs_eff + VbseffCV - DELTA_3; - if (Vfb <= 0.0) - T0 = sqrt(V3 * V3 - 4.0 * DELTA_3 * Vfb); - else - T0 = sqrt(V3 * V3 + 4.0 * DELTA_3 * Vfb); - - T1 = 0.5 * (1.0 + V3 / T0); - Vfbeff = Vfb - 0.5 * (V3 + T0); - dVfbeff_dVg = T1 * dVgs_eff_dVg; - dVfbeff_dVb = -T1 * dVbseffCV_dVb; - Qac0 = CoxWL * (Vfbeff - Vfb); - dQac0_dVg = CoxWL * dVfbeff_dVg; - dQac0_dVb = CoxWL * dVfbeff_dVb; - - T0 = 0.5 * pParam->BSIM4v5k1ox; - T3 = Vgs_eff - Vfbeff - VbseffCV - Vgsteff; - if (pParam->BSIM4v5k1ox == 0.0) - { T1 = 0.0; - T2 = 0.0; - } - else if (T3 < 0.0) - { T1 = T0 + T3 / pParam->BSIM4v5k1ox; - T2 = CoxWL; - } - else - { T1 = sqrt(T0 * T0 + T3); - T2 = CoxWL * T0 / T1; - } - - Qsub0 = CoxWL * pParam->BSIM4v5k1ox * (T1 - T0); - - dQsub0_dVg = T2 * (dVgs_eff_dVg - dVfbeff_dVg - dVgsteff_dVg); - dQsub0_dVd = -T2 * dVgsteff_dVd; - dQsub0_dVb = -T2 * (dVfbeff_dVb + dVbseffCV_dVb - + dVgsteff_dVb); - - AbulkCV = Abulk0 * pParam->BSIM4v5abulkCVfactor; - dAbulkCV_dVb = pParam->BSIM4v5abulkCVfactor * dAbulk0_dVb; - VdsatCV = Vgsteff / AbulkCV; - - T0 = VdsatCV - Vds - DELTA_4; - dT0_dVg = 1.0 / AbulkCV; - dT0_dVb = -VdsatCV * dAbulkCV_dVb / AbulkCV; - T1 = sqrt(T0 * T0 + 4.0 * DELTA_4 * VdsatCV); - dT1_dVg = (T0 + DELTA_4 + DELTA_4) / T1; - dT1_dVd = -T0 / T1; - dT1_dVb = dT1_dVg * dT0_dVb; - dT1_dVg *= dT0_dVg; - if (T0 >= 0.0) - { VdseffCV = VdsatCV - 0.5 * (T0 + T1); - dVdseffCV_dVg = 0.5 * (dT0_dVg - dT1_dVg); - dVdseffCV_dVd = 0.5 * (1.0 - dT1_dVd); - dVdseffCV_dVb = 0.5 * (dT0_dVb - dT1_dVb); - } - else - { T3 = (DELTA_4 + DELTA_4) / (T1 - T0); - T4 = 1.0 - T3; - T5 = VdsatCV * T3 / (T1 - T0); - VdseffCV = VdsatCV * T4; - dVdseffCV_dVg = dT0_dVg * T4 + T5 * (dT1_dVg - dT0_dVg); - dVdseffCV_dVd = T5 * (dT1_dVd + 1.0); - dVdseffCV_dVb = dT0_dVb * (1.0 - T5) + T5 * dT1_dVb; - } - - if (Vds == 0.0) - { VdseffCV = 0.0; - dVdseffCV_dVg = 0.0; - dVdseffCV_dVb = 0.0; - } - - T0 = AbulkCV * VdseffCV; - T1 = 12.0 * (Vgsteff - 0.5 * T0 + 1.0e-20); - T2 = VdseffCV / T1; - T3 = T0 * T2; - - T4 = (1.0 - 12.0 * T2 * T2 * AbulkCV); - T5 = (6.0 * T0 * (4.0 * Vgsteff - T0) / (T1 * T1) - 0.5); - T6 = 12.0 * T2 * T2 * Vgsteff; - - qgate = CoxWL * (Vgsteff - 0.5 * VdseffCV + T3); - Cgg1 = CoxWL * (T4 + T5 * dVdseffCV_dVg); - Cgd1 = CoxWL * T5 * dVdseffCV_dVd + Cgg1 * dVgsteff_dVd; - Cgb1 = CoxWL * (T5 * dVdseffCV_dVb + T6 * dAbulkCV_dVb) - + Cgg1 * dVgsteff_dVb; - Cgg1 *= dVgsteff_dVg; - - T7 = 1.0 - AbulkCV; - qbulk = CoxWL * T7 * (0.5 * VdseffCV - T3); - T4 = -T7 * (T4 - 1.0); - T5 = -T7 * T5; - T6 = -(T7 * T6 + (0.5 * VdseffCV - T3)); - Cbg1 = CoxWL * (T4 + T5 * dVdseffCV_dVg); - Cbd1 = CoxWL * T5 * dVdseffCV_dVd + Cbg1 * dVgsteff_dVd; - Cbb1 = CoxWL * (T5 * dVdseffCV_dVb + T6 * dAbulkCV_dVb) - + Cbg1 * dVgsteff_dVb; - Cbg1 *= dVgsteff_dVg; - - if (model->BSIM4v5xpart > 0.5) - { /* 0/100 Charge petition model */ - T1 = T1 + T1; - qsrc = -CoxWL * (0.5 * Vgsteff + 0.25 * T0 - - T0 * T0 / T1); - T7 = (4.0 * Vgsteff - T0) / (T1 * T1); - T4 = -(0.5 + 24.0 * T0 * T0 / (T1 * T1)); - T5 = -(0.25 * AbulkCV - 12.0 * AbulkCV * T0 * T7); - T6 = -(0.25 * VdseffCV - 12.0 * T0 * VdseffCV * T7); - Csg = CoxWL * (T4 + T5 * dVdseffCV_dVg); - Csd = CoxWL * T5 * dVdseffCV_dVd + Csg * dVgsteff_dVd; - Csb = CoxWL * (T5 * dVdseffCV_dVb + T6 * dAbulkCV_dVb) - + Csg * dVgsteff_dVb; - Csg *= dVgsteff_dVg; - } - else if (model->BSIM4v5xpart < 0.5) - { /* 40/60 Charge petition model */ - T1 = T1 / 12.0; - T2 = 0.5 * CoxWL / (T1 * T1); - T3 = Vgsteff * (2.0 * T0 * T0 / 3.0 + Vgsteff - * (Vgsteff - 4.0 * T0 / 3.0)) - - 2.0 * T0 * T0 * T0 / 15.0; - qsrc = -T2 * T3; - T7 = 4.0 / 3.0 * Vgsteff * (Vgsteff - T0) - + 0.4 * T0 * T0; - T4 = -2.0 * qsrc / T1 - T2 * (Vgsteff * (3.0 - * Vgsteff - 8.0 * T0 / 3.0) - + 2.0 * T0 * T0 / 3.0); - T5 = (qsrc / T1 + T2 * T7) * AbulkCV; - T6 = (qsrc / T1 * VdseffCV + T2 * T7 * VdseffCV); - Csg = (T4 + T5 * dVdseffCV_dVg); - Csd = T5 * dVdseffCV_dVd + Csg * dVgsteff_dVd; - Csb = (T5 * dVdseffCV_dVb + T6 * dAbulkCV_dVb) - + Csg * dVgsteff_dVb; - Csg *= dVgsteff_dVg; - } - else - { /* 50/50 Charge petition model */ - qsrc = -0.5 * (qgate + qbulk); - Csg = -0.5 * (Cgg1 + Cbg1); - Csb = -0.5 * (Cgb1 + Cbb1); - Csd = -0.5 * (Cgd1 + Cbd1); - } - - qgate += Qac0 + Qsub0; - qbulk -= (Qac0 + Qsub0); - qdrn = -(qgate + qbulk + qsrc); - - Cgg = dQac0_dVg + dQsub0_dVg + Cgg1; - Cgd = dQsub0_dVd + Cgd1; - Cgb = dQac0_dVb + dQsub0_dVb + Cgb1; - - Cbg = Cbg1 - dQac0_dVg - dQsub0_dVg; - Cbd = Cbd1 - dQsub0_dVd; - Cbb = Cbb1 - dQac0_dVb - dQsub0_dVb; - - Cgb *= dVbseff_dVb; - Cbb *= dVbseff_dVb; - Csb *= dVbseff_dVb; - - here->BSIM4v5cggb = Cgg; - here->BSIM4v5cgsb = -(Cgg + Cgd + Cgb); - here->BSIM4v5cgdb = Cgd; - here->BSIM4v5cdgb = -(Cgg + Cbg + Csg); - here->BSIM4v5cdsb = (Cgg + Cgd + Cgb + Cbg + Cbd + Cbb - + Csg + Csd + Csb); - here->BSIM4v5cddb = -(Cgd + Cbd + Csd); - here->BSIM4v5cbgb = Cbg; - here->BSIM4v5cbsb = -(Cbg + Cbd + Cbb); - here->BSIM4v5cbdb = Cbd; - } - - /* Charge-Thickness capMod (CTM) begins */ - else if (model->BSIM4v5capMod == 2) - { V3 = here->BSIM4v5vfbzb - Vgs_eff + VbseffCV - DELTA_3; - if (here->BSIM4v5vfbzb <= 0.0) - T0 = sqrt(V3 * V3 - 4.0 * DELTA_3 * here->BSIM4v5vfbzb); - else - T0 = sqrt(V3 * V3 + 4.0 * DELTA_3 * here->BSIM4v5vfbzb); - - T1 = 0.5 * (1.0 + V3 / T0); - Vfbeff = here->BSIM4v5vfbzb - 0.5 * (V3 + T0); - dVfbeff_dVg = T1 * dVgs_eff_dVg; - dVfbeff_dVb = -T1 * dVbseffCV_dVb; - - Cox = model->BSIM4v5coxp; - Tox = 1.0e8 * model->BSIM4v5toxp; - T0 = (Vgs_eff - VbseffCV - here->BSIM4v5vfbzb) / Tox; - dT0_dVg = dVgs_eff_dVg / Tox; - dT0_dVb = -dVbseffCV_dVb / Tox; - - tmp = T0 * pParam->BSIM4v5acde; - if ((-EXP_THRESHOLD < tmp) && (tmp < EXP_THRESHOLD)) - { Tcen = pParam->BSIM4v5ldeb * exp(tmp); - dTcen_dVg = pParam->BSIM4v5acde * Tcen; - dTcen_dVb = dTcen_dVg * dT0_dVb; - dTcen_dVg *= dT0_dVg; - } - else if (tmp <= -EXP_THRESHOLD) - { Tcen = pParam->BSIM4v5ldeb * MIN_EXP; - dTcen_dVg = dTcen_dVb = 0.0; - } - else - { Tcen = pParam->BSIM4v5ldeb * MAX_EXP; - dTcen_dVg = dTcen_dVb = 0.0; - } - - LINK = 1.0e-3 * model->BSIM4v5toxp; - V3 = pParam->BSIM4v5ldeb - Tcen - LINK; - V4 = sqrt(V3 * V3 + 4.0 * LINK * pParam->BSIM4v5ldeb); - Tcen = pParam->BSIM4v5ldeb - 0.5 * (V3 + V4); - T1 = 0.5 * (1.0 + V3 / V4); - dTcen_dVg *= T1; - dTcen_dVb *= T1; - - Ccen = EPSSI / Tcen; - T2 = Cox / (Cox + Ccen); - Coxeff = T2 * Ccen; - T3 = -Ccen / Tcen; - dCoxeff_dVg = T2 * T2 * T3; - dCoxeff_dVb = dCoxeff_dVg * dTcen_dVb; - dCoxeff_dVg *= dTcen_dVg; - CoxWLcen = CoxWL * Coxeff / model->BSIM4v5coxe; - - Qac0 = CoxWLcen * (Vfbeff - here->BSIM4v5vfbzb); - QovCox = Qac0 / Coxeff; - dQac0_dVg = CoxWLcen * dVfbeff_dVg - + QovCox * dCoxeff_dVg; - dQac0_dVb = CoxWLcen * dVfbeff_dVb - + QovCox * dCoxeff_dVb; - - T0 = 0.5 * pParam->BSIM4v5k1ox; - T3 = Vgs_eff - Vfbeff - VbseffCV - Vgsteff; - if (pParam->BSIM4v5k1ox == 0.0) - { T1 = 0.0; - T2 = 0.0; - } - else if (T3 < 0.0) - { T1 = T0 + T3 / pParam->BSIM4v5k1ox; - T2 = CoxWLcen; - } - else - { T1 = sqrt(T0 * T0 + T3); - T2 = CoxWLcen * T0 / T1; - } - - Qsub0 = CoxWLcen * pParam->BSIM4v5k1ox * (T1 - T0); - QovCox = Qsub0 / Coxeff; - dQsub0_dVg = T2 * (dVgs_eff_dVg - dVfbeff_dVg - dVgsteff_dVg) - + QovCox * dCoxeff_dVg; - dQsub0_dVd = -T2 * dVgsteff_dVd; - dQsub0_dVb = -T2 * (dVfbeff_dVb + dVbseffCV_dVb + dVgsteff_dVb) - + QovCox * dCoxeff_dVb; - - /* Gate-bias dependent delta Phis begins */ - if (pParam->BSIM4v5k1ox <= 0.0) - { Denomi = 0.25 * pParam->BSIM4v5moin * Vtm; - T0 = 0.5 * pParam->BSIM4v5sqrtPhi; - } - else - { Denomi = pParam->BSIM4v5moin * Vtm - * pParam->BSIM4v5k1ox * pParam->BSIM4v5k1ox; - T0 = pParam->BSIM4v5k1ox * pParam->BSIM4v5sqrtPhi; - } - T1 = 2.0 * T0 + Vgsteff; - - DeltaPhi = Vtm * log(1.0 + T1 * Vgsteff / Denomi); - dDeltaPhi_dVg = 2.0 * Vtm * (T1 -T0) / (Denomi + T1 * Vgsteff); - /* End of delta Phis */ - - /* VgDP = Vgsteff - DeltaPhi */ - T0 = Vgsteff - DeltaPhi - 0.001; - dT0_dVg = 1.0 - dDeltaPhi_dVg; - T1 = sqrt(T0 * T0 + Vgsteff * 0.004); - VgDP = 0.5 * (T0 + T1); - dVgDP_dVg = 0.5 * (dT0_dVg + (T0 * dT0_dVg + 0.002) / T1); - - Tox += Tox; /* WDLiu: Tcen reevaluated below due to different Vgsteff */ - T0 = (Vgsteff + here->BSIM4v5vtfbphi2) / Tox; - tmp = exp(0.7 * log(T0)); - T1 = 1.0 + tmp; - T2 = 0.7 * tmp / (T0 * Tox); - Tcen = 1.9e-9 / T1; - dTcen_dVg = -Tcen * T2 / T1; - dTcen_dVd = dTcen_dVg * dVgsteff_dVd; - dTcen_dVb = dTcen_dVg * dVgsteff_dVb; - dTcen_dVg *= dVgsteff_dVg; - - Ccen = EPSSI / Tcen; - T0 = Cox / (Cox + Ccen); - Coxeff = T0 * Ccen; - T1 = -Ccen / Tcen; - dCoxeff_dVg = T0 * T0 * T1; - dCoxeff_dVd = dCoxeff_dVg * dTcen_dVd; - dCoxeff_dVb = dCoxeff_dVg * dTcen_dVb; - dCoxeff_dVg *= dTcen_dVg; - CoxWLcen = CoxWL * Coxeff / model->BSIM4v5coxe; - - AbulkCV = Abulk0 * pParam->BSIM4v5abulkCVfactor; - dAbulkCV_dVb = pParam->BSIM4v5abulkCVfactor * dAbulk0_dVb; - VdsatCV = VgDP / AbulkCV; - - T0 = VdsatCV - Vds - DELTA_4; - dT0_dVg = dVgDP_dVg / AbulkCV; - dT0_dVb = -VdsatCV * dAbulkCV_dVb / AbulkCV; - T1 = sqrt(T0 * T0 + 4.0 * DELTA_4 * VdsatCV); - dT1_dVg = (T0 + DELTA_4 + DELTA_4) / T1; - dT1_dVd = -T0 / T1; - dT1_dVb = dT1_dVg * dT0_dVb; - dT1_dVg *= dT0_dVg; - if (T0 >= 0.0) - { VdseffCV = VdsatCV - 0.5 * (T0 + T1); - dVdseffCV_dVg = 0.5 * (dT0_dVg - dT1_dVg); - dVdseffCV_dVd = 0.5 * (1.0 - dT1_dVd); - dVdseffCV_dVb = 0.5 * (dT0_dVb - dT1_dVb); - } - else - { T3 = (DELTA_4 + DELTA_4) / (T1 - T0); - T4 = 1.0 - T3; - T5 = VdsatCV * T3 / (T1 - T0); - VdseffCV = VdsatCV * T4; - dVdseffCV_dVg = dT0_dVg * T4 + T5 * (dT1_dVg - dT0_dVg); - dVdseffCV_dVd = T5 * (dT1_dVd + 1.0); - dVdseffCV_dVb = dT0_dVb * (1.0 - T5) + T5 * dT1_dVb; - } - - if (Vds == 0.0) - { VdseffCV = 0.0; - dVdseffCV_dVg = 0.0; - dVdseffCV_dVb = 0.0; - } - - T0 = AbulkCV * VdseffCV; - T1 = VgDP; - T2 = 12.0 * (T1 - 0.5 * T0 + 1.0e-20); - T3 = T0 / T2; - T4 = 1.0 - 12.0 * T3 * T3; - T5 = AbulkCV * (6.0 * T0 * (4.0 * T1 - T0) / (T2 * T2) - 0.5); - T6 = T5 * VdseffCV / AbulkCV; - - qgate = CoxWLcen * (T1 - T0 * (0.5 - T3)); - QovCox = qgate / Coxeff; - Cgg1 = CoxWLcen * (T4 * dVgDP_dVg - + T5 * dVdseffCV_dVg); - Cgd1 = CoxWLcen * T5 * dVdseffCV_dVd + Cgg1 - * dVgsteff_dVd + QovCox * dCoxeff_dVd; - Cgb1 = CoxWLcen * (T5 * dVdseffCV_dVb + T6 * dAbulkCV_dVb) - + Cgg1 * dVgsteff_dVb + QovCox * dCoxeff_dVb; - Cgg1 = Cgg1 * dVgsteff_dVg + QovCox * dCoxeff_dVg; - - - T7 = 1.0 - AbulkCV; - T8 = T2 * T2; - T9 = 12.0 * T7 * T0 * T0 / (T8 * AbulkCV); - T10 = T9 * dVgDP_dVg; - T11 = -T7 * T5 / AbulkCV; - T12 = -(T9 * T1 / AbulkCV + VdseffCV * (0.5 - T0 / T2)); - - qbulk = CoxWLcen * T7 * (0.5 * VdseffCV - T0 * VdseffCV / T2); - QovCox = qbulk / Coxeff; - Cbg1 = CoxWLcen * (T10 + T11 * dVdseffCV_dVg); - Cbd1 = CoxWLcen * T11 * dVdseffCV_dVd + Cbg1 - * dVgsteff_dVd + QovCox * dCoxeff_dVd; - Cbb1 = CoxWLcen * (T11 * dVdseffCV_dVb + T12 * dAbulkCV_dVb) - + Cbg1 * dVgsteff_dVb + QovCox * dCoxeff_dVb; - Cbg1 = Cbg1 * dVgsteff_dVg + QovCox * dCoxeff_dVg; - - if (model->BSIM4v5xpart > 0.5) - { /* 0/100 partition */ - qsrc = -CoxWLcen * (T1 / 2.0 + T0 / 4.0 - - 0.5 * T0 * T0 / T2); - QovCox = qsrc / Coxeff; - T2 += T2; - T3 = T2 * T2; - T7 = -(0.25 - 12.0 * T0 * (4.0 * T1 - T0) / T3); - T4 = -(0.5 + 24.0 * T0 * T0 / T3) * dVgDP_dVg; - T5 = T7 * AbulkCV; - T6 = T7 * VdseffCV; - - Csg = CoxWLcen * (T4 + T5 * dVdseffCV_dVg); - Csd = CoxWLcen * T5 * dVdseffCV_dVd + Csg * dVgsteff_dVd - + QovCox * dCoxeff_dVd; - Csb = CoxWLcen * (T5 * dVdseffCV_dVb + T6 * dAbulkCV_dVb) - + Csg * dVgsteff_dVb + QovCox * dCoxeff_dVb; - Csg = Csg * dVgsteff_dVg + QovCox * dCoxeff_dVg; - } - else if (model->BSIM4v5xpart < 0.5) - { /* 40/60 partition */ - T2 = T2 / 12.0; - T3 = 0.5 * CoxWLcen / (T2 * T2); - T4 = T1 * (2.0 * T0 * T0 / 3.0 + T1 * (T1 - 4.0 - * T0 / 3.0)) - 2.0 * T0 * T0 * T0 / 15.0; - qsrc = -T3 * T4; - QovCox = qsrc / Coxeff; - T8 = 4.0 / 3.0 * T1 * (T1 - T0) + 0.4 * T0 * T0; - T5 = -2.0 * qsrc / T2 - T3 * (T1 * (3.0 * T1 - 8.0 - * T0 / 3.0) + 2.0 * T0 * T0 / 3.0); - T6 = AbulkCV * (qsrc / T2 + T3 * T8); - T7 = T6 * VdseffCV / AbulkCV; - - Csg = T5 * dVgDP_dVg + T6 * dVdseffCV_dVg; - Csd = Csg * dVgsteff_dVd + T6 * dVdseffCV_dVd - + QovCox * dCoxeff_dVd; - Csb = Csg * dVgsteff_dVb + T6 * dVdseffCV_dVb - + T7 * dAbulkCV_dVb + QovCox * dCoxeff_dVb; - Csg = Csg * dVgsteff_dVg + QovCox * dCoxeff_dVg; - } - else - { /* 50/50 partition */ - qsrc = -0.5 * qgate; - Csg = -0.5 * Cgg1; - Csd = -0.5 * Cgd1; - Csb = -0.5 * Cgb1; - } - - qgate += Qac0 + Qsub0 - qbulk; - qbulk -= (Qac0 + Qsub0); - qdrn = -(qgate + qbulk + qsrc); - - Cbg = Cbg1 - dQac0_dVg - dQsub0_dVg; - Cbd = Cbd1 - dQsub0_dVd; - Cbb = Cbb1 - dQac0_dVb - dQsub0_dVb; - - Cgg = Cgg1 - Cbg; - Cgd = Cgd1 - Cbd; - Cgb = Cgb1 - Cbb; - - Cgb *= dVbseff_dVb; - Cbb *= dVbseff_dVb; - Csb *= dVbseff_dVb; - - here->BSIM4v5cggb = Cgg; - here->BSIM4v5cgsb = -(Cgg + Cgd + Cgb); - here->BSIM4v5cgdb = Cgd; - here->BSIM4v5cdgb = -(Cgg + Cbg + Csg); - here->BSIM4v5cdsb = (Cgg + Cgd + Cgb + Cbg + Cbd + Cbb - + Csg + Csd + Csb); - here->BSIM4v5cddb = -(Cgd + Cbd + Csd); - here->BSIM4v5cbgb = Cbg; - here->BSIM4v5cbsb = -(Cbg + Cbd + Cbb); - here->BSIM4v5cbdb = Cbd; - } /* End of CTM */ - } - - here->BSIM4v5csgb = - here->BSIM4v5cggb - here->BSIM4v5cdgb - here->BSIM4v5cbgb; - here->BSIM4v5csdb = - here->BSIM4v5cgdb - here->BSIM4v5cddb - here->BSIM4v5cbdb; - here->BSIM4v5cssb = - here->BSIM4v5cgsb - here->BSIM4v5cdsb - here->BSIM4v5cbsb; - here->BSIM4v5cgbb = - here->BSIM4v5cgdb - here->BSIM4v5cggb - here->BSIM4v5cgsb; - here->BSIM4v5cdbb = - here->BSIM4v5cddb - here->BSIM4v5cdgb - here->BSIM4v5cdsb; - here->BSIM4v5cbbb = - here->BSIM4v5cbgb - here->BSIM4v5cbdb - here->BSIM4v5cbsb; - here->BSIM4v5csbb = - here->BSIM4v5cgbb - here->BSIM4v5cdbb - here->BSIM4v5cbbb; - here->BSIM4v5qgate = qgate; - here->BSIM4v5qbulk = qbulk; - here->BSIM4v5qdrn = qdrn; - here->BSIM4v5qsrc = -(qgate + qbulk + qdrn); - - /* NQS begins */ - if ((here->BSIM4v5trnqsMod) || (here->BSIM4v5acnqsMod)) - { here->BSIM4v5qchqs = qcheq = -(qbulk + qgate); - here->BSIM4v5cqgb = -(here->BSIM4v5cggb + here->BSIM4v5cbgb); - here->BSIM4v5cqdb = -(here->BSIM4v5cgdb + here->BSIM4v5cbdb); - here->BSIM4v5cqsb = -(here->BSIM4v5cgsb + here->BSIM4v5cbsb); - here->BSIM4v5cqbb = -(here->BSIM4v5cqgb + here->BSIM4v5cqdb - + here->BSIM4v5cqsb); - - CoxWL = model->BSIM4v5coxe * pParam->BSIM4v5weffCV * here->BSIM4v5nf - * pParam->BSIM4v5leffCV; - T1 = here->BSIM4v5gcrg / CoxWL; /* 1 / tau */ - here->BSIM4v5gtau = T1 * ScalingFactor; - - if (here->BSIM4v5acnqsMod) - here->BSIM4v5taunet = 1.0 / T1; - - *(ckt->CKTstate0 + here->BSIM4v5qcheq) = qcheq; - if (ckt->CKTmode & MODEINITTRAN) - *(ckt->CKTstate1 + here->BSIM4v5qcheq) = - *(ckt->CKTstate0 + here->BSIM4v5qcheq); - if (here->BSIM4v5trnqsMod) - { error = NIintegrate(ckt, &geq, &ceq, 0.0, here->BSIM4v5qcheq); - if (error) - return(error); - } - } - - -finished: - - /* Calculate junction C-V */ - if (ChargeComputationNeeded) - { czbd = model->BSIM4v5DunitAreaTempJctCap * here->BSIM4v5Adeff; /* bug fix */ - czbs = model->BSIM4v5SunitAreaTempJctCap * here->BSIM4v5Aseff; - czbdsw = model->BSIM4v5DunitLengthSidewallTempJctCap * here->BSIM4v5Pdeff; - czbdswg = model->BSIM4v5DunitLengthGateSidewallTempJctCap - * pParam->BSIM4v5weffCJ * here->BSIM4v5nf; - czbssw = model->BSIM4v5SunitLengthSidewallTempJctCap * here->BSIM4v5Pseff; - czbsswg = model->BSIM4v5SunitLengthGateSidewallTempJctCap - * pParam->BSIM4v5weffCJ * here->BSIM4v5nf; - - MJS = model->BSIM4v5SbulkJctBotGradingCoeff; - MJSWS = model->BSIM4v5SbulkJctSideGradingCoeff; - MJSWGS = model->BSIM4v5SbulkJctGateSideGradingCoeff; - - MJD = model->BSIM4v5DbulkJctBotGradingCoeff; - MJSWD = model->BSIM4v5DbulkJctSideGradingCoeff; - MJSWGD = model->BSIM4v5DbulkJctGateSideGradingCoeff; - - /* Source Bulk Junction */ - if (vbs_jct == 0.0) - { *(ckt->CKTstate0 + here->BSIM4v5qbs) = 0.0; - here->BSIM4v5capbs = czbs + czbssw + czbsswg; - } - else if (vbs_jct < 0.0) - { if (czbs > 0.0) - { arg = 1.0 - vbs_jct / model->BSIM4v5PhiBS; - if (MJS == 0.5) - sarg = 1.0 / sqrt(arg); - else - sarg = exp(-MJS * log(arg)); - *(ckt->CKTstate0 + here->BSIM4v5qbs) = model->BSIM4v5PhiBS * czbs - * (1.0 - arg * sarg) / (1.0 - MJS); - here->BSIM4v5capbs = czbs * sarg; - } - else - { *(ckt->CKTstate0 + here->BSIM4v5qbs) = 0.0; - here->BSIM4v5capbs = 0.0; - } - if (czbssw > 0.0) - { arg = 1.0 - vbs_jct / model->BSIM4v5PhiBSWS; - if (MJSWS == 0.5) - sarg = 1.0 / sqrt(arg); - else - sarg = exp(-MJSWS * log(arg)); - *(ckt->CKTstate0 + here->BSIM4v5qbs) += model->BSIM4v5PhiBSWS * czbssw - * (1.0 - arg * sarg) / (1.0 - MJSWS); - here->BSIM4v5capbs += czbssw * sarg; - } - if (czbsswg > 0.0) - { arg = 1.0 - vbs_jct / model->BSIM4v5PhiBSWGS; - if (MJSWGS == 0.5) - sarg = 1.0 / sqrt(arg); - else - sarg = exp(-MJSWGS * log(arg)); - *(ckt->CKTstate0 + here->BSIM4v5qbs) += model->BSIM4v5PhiBSWGS * czbsswg - * (1.0 - arg * sarg) / (1.0 - MJSWGS); - here->BSIM4v5capbs += czbsswg * sarg; - } - - } - else - { T0 = czbs + czbssw + czbsswg; - T1 = vbs_jct * (czbs * MJS / model->BSIM4v5PhiBS + czbssw * MJSWS - / model->BSIM4v5PhiBSWS + czbsswg * MJSWGS / model->BSIM4v5PhiBSWGS); - *(ckt->CKTstate0 + here->BSIM4v5qbs) = vbs_jct * (T0 + 0.5 * T1); - here->BSIM4v5capbs = T0 + T1; - } - - /* Drain Bulk Junction */ - if (vbd_jct == 0.0) - { *(ckt->CKTstate0 + here->BSIM4v5qbd) = 0.0; - here->BSIM4v5capbd = czbd + czbdsw + czbdswg; - } - else if (vbd_jct < 0.0) - { if (czbd > 0.0) - { arg = 1.0 - vbd_jct / model->BSIM4v5PhiBD; - if (MJD == 0.5) - sarg = 1.0 / sqrt(arg); - else - sarg = exp(-MJD * log(arg)); - *(ckt->CKTstate0 + here->BSIM4v5qbd) = model->BSIM4v5PhiBD* czbd - * (1.0 - arg * sarg) / (1.0 - MJD); - here->BSIM4v5capbd = czbd * sarg; - } - else - { *(ckt->CKTstate0 + here->BSIM4v5qbd) = 0.0; - here->BSIM4v5capbd = 0.0; - } - if (czbdsw > 0.0) - { arg = 1.0 - vbd_jct / model->BSIM4v5PhiBSWD; - if (MJSWD == 0.5) - sarg = 1.0 / sqrt(arg); - else - sarg = exp(-MJSWD * log(arg)); - *(ckt->CKTstate0 + here->BSIM4v5qbd) += model->BSIM4v5PhiBSWD * czbdsw - * (1.0 - arg * sarg) / (1.0 - MJSWD); - here->BSIM4v5capbd += czbdsw * sarg; - } - if (czbdswg > 0.0) - { arg = 1.0 - vbd_jct / model->BSIM4v5PhiBSWGD; - if (MJSWGD == 0.5) - sarg = 1.0 / sqrt(arg); - else - sarg = exp(-MJSWGD * log(arg)); - *(ckt->CKTstate0 + here->BSIM4v5qbd) += model->BSIM4v5PhiBSWGD * czbdswg - * (1.0 - arg * sarg) / (1.0 - MJSWGD); - here->BSIM4v5capbd += czbdswg * sarg; - } - } - else - { T0 = czbd + czbdsw + czbdswg; - T1 = vbd_jct * (czbd * MJD / model->BSIM4v5PhiBD + czbdsw * MJSWD - / model->BSIM4v5PhiBSWD + czbdswg * MJSWGD / model->BSIM4v5PhiBSWGD); - *(ckt->CKTstate0 + here->BSIM4v5qbd) = vbd_jct * (T0 + 0.5 * T1); - here->BSIM4v5capbd = T0 + T1; - } - } - - - /* - * check convergence - */ - - if ((here->BSIM4v5off == 0) || (!(ckt->CKTmode & MODEINITFIX))) - { if (Check == 1) - { ckt->CKTnoncon++; -#ifndef NEWCONV - } - else - { if (here->BSIM4v5mode >= 0) - { Idtot = here->BSIM4v5cd + here->BSIM4v5csub - + here->BSIM4v5Igidl - here->BSIM4v5cbd; - } - else - { Idtot = here->BSIM4v5cd + here->BSIM4v5cbd - here->BSIM4v5Igidl; /* bugfix */ - } - tol0 = ckt->CKTreltol * MAX(fabs(cdhat), fabs(Idtot)) - + ckt->CKTabstol; - tol1 = ckt->CKTreltol * MAX(fabs(cseshat), fabs(Isestot)) - + ckt->CKTabstol; - tol2 = ckt->CKTreltol * MAX(fabs(cdedhat), fabs(Idedtot)) - + ckt->CKTabstol; - tol3 = ckt->CKTreltol * MAX(fabs(cgshat), fabs(Igstot)) - + ckt->CKTabstol; - tol4 = ckt->CKTreltol * MAX(fabs(cgdhat), fabs(Igdtot)) - + ckt->CKTabstol; - tol5 = ckt->CKTreltol * MAX(fabs(cgbhat), fabs(Igbtot)) - + ckt->CKTabstol; - if ((fabs(cdhat - Idtot) >= tol0) || (fabs(cseshat - Isestot) >= tol1) - || (fabs(cdedhat - Idedtot) >= tol2)) - { ckt->CKTnoncon++; - } - else if ((fabs(cgshat - Igstot) >= tol3) || (fabs(cgdhat - Igdtot) >= tol4) - || (fabs(cgbhat - Igbtot) >= tol5)) - { ckt->CKTnoncon++; - } - else - { Ibtot = here->BSIM4v5cbs + here->BSIM4v5cbd - - here->BSIM4v5Igidl - here->BSIM4v5Igisl - here->BSIM4v5csub; - tol6 = ckt->CKTreltol * MAX(fabs(cbhat), fabs(Ibtot)) - + ckt->CKTabstol; - if (fabs(cbhat - Ibtot) > tol6) - { ckt->CKTnoncon++; - } - } -#endif /* NEWCONV */ - } - } - *(ckt->CKTstate0 + here->BSIM4v5vds) = vds; - *(ckt->CKTstate0 + here->BSIM4v5vgs) = vgs; - *(ckt->CKTstate0 + here->BSIM4v5vbs) = vbs; - *(ckt->CKTstate0 + here->BSIM4v5vbd) = vbd; - *(ckt->CKTstate0 + here->BSIM4v5vges) = vges; - *(ckt->CKTstate0 + here->BSIM4v5vgms) = vgms; - *(ckt->CKTstate0 + here->BSIM4v5vdbs) = vdbs; - *(ckt->CKTstate0 + here->BSIM4v5vdbd) = vdbd; - *(ckt->CKTstate0 + here->BSIM4v5vsbs) = vsbs; - *(ckt->CKTstate0 + here->BSIM4v5vses) = vses; - *(ckt->CKTstate0 + here->BSIM4v5vdes) = vdes; - *(ckt->CKTstate0 + here->BSIM4v5qdef) = qdef; - - - if (!ChargeComputationNeeded) - goto line850; - - if (here->BSIM4v5rgateMod == 3) - { - vgdx = vgmd; - vgsx = vgms; - } - else /* For rgateMod == 0, 1 and 2 */ - { - vgdx = vgd; - vgsx = vgs; - } - if (model->BSIM4v5capMod == 0) - { - cgdo = pParam->BSIM4v5cgdo; - qgdo = pParam->BSIM4v5cgdo * vgdx; - cgso = pParam->BSIM4v5cgso; - qgso = pParam->BSIM4v5cgso * vgsx; - } - else /* For both capMod == 1 and 2 */ - { T0 = vgdx + DELTA_1; - T1 = sqrt(T0 * T0 + 4.0 * DELTA_1); - T2 = 0.5 * (T0 - T1); - - T3 = pParam->BSIM4v5weffCV * pParam->BSIM4v5cgdl; - T4 = sqrt(1.0 - 4.0 * T2 / pParam->BSIM4v5ckappad); - cgdo = pParam->BSIM4v5cgdo + T3 - T3 * (1.0 - 1.0 / T4) - * (0.5 - 0.5 * T0 / T1); - qgdo = (pParam->BSIM4v5cgdo + T3) * vgdx - T3 * (T2 - + 0.5 * pParam->BSIM4v5ckappad * (T4 - 1.0)); - - T0 = vgsx + DELTA_1; - T1 = sqrt(T0 * T0 + 4.0 * DELTA_1); - T2 = 0.5 * (T0 - T1); - T3 = pParam->BSIM4v5weffCV * pParam->BSIM4v5cgsl; - T4 = sqrt(1.0 - 4.0 * T2 / pParam->BSIM4v5ckappas); - cgso = pParam->BSIM4v5cgso + T3 - T3 * (1.0 - 1.0 / T4) - * (0.5 - 0.5 * T0 / T1); - qgso = (pParam->BSIM4v5cgso + T3) * vgsx - T3 * (T2 - + 0.5 * pParam->BSIM4v5ckappas * (T4 - 1.0)); - } - - if (here->BSIM4v5nf != 1.0) - { cgdo *= here->BSIM4v5nf; - cgso *= here->BSIM4v5nf; - qgdo *= here->BSIM4v5nf; - qgso *= here->BSIM4v5nf; - } - here->BSIM4v5cgdo = cgdo; - here->BSIM4v5qgdo = qgdo; - here->BSIM4v5cgso = cgso; - here->BSIM4v5qgso = qgso; - -#ifndef NOBYPASS -line755: -#endif - ag0 = ckt->CKTag[0]; - if (here->BSIM4v5mode > 0) - { if (here->BSIM4v5trnqsMod == 0) - { qdrn -= qgdo; - if (here->BSIM4v5rgateMod == 3) - { gcgmgmb = (cgdo + cgso + pParam->BSIM4v5cgbo) * ag0; - gcgmdb = -cgdo * ag0; - gcgmsb = -cgso * ag0; - gcgmbb = -pParam->BSIM4v5cgbo * ag0; - - gcdgmb = gcgmdb; - gcsgmb = gcgmsb; - gcbgmb = gcgmbb; - - gcggb = here->BSIM4v5cggb * ag0; - gcgdb = here->BSIM4v5cgdb * ag0; - gcgsb = here->BSIM4v5cgsb * ag0; - gcgbb = -(gcggb + gcgdb + gcgsb); - - gcdgb = here->BSIM4v5cdgb * ag0; - gcsgb = -(here->BSIM4v5cggb + here->BSIM4v5cbgb - + here->BSIM4v5cdgb) * ag0; - gcbgb = here->BSIM4v5cbgb * ag0; - - qgmb = pParam->BSIM4v5cgbo * vgmb; - qgmid = qgdo + qgso + qgmb; - qbulk -= qgmb; - qsrc = -(qgate + qgmid + qbulk + qdrn); - } - else - { gcggb = (here->BSIM4v5cggb + cgdo + cgso - + pParam->BSIM4v5cgbo ) * ag0; - gcgdb = (here->BSIM4v5cgdb - cgdo) * ag0; - gcgsb = (here->BSIM4v5cgsb - cgso) * ag0; - gcgbb = -(gcggb + gcgdb + gcgsb); - - gcdgb = (here->BSIM4v5cdgb - cgdo) * ag0; - gcsgb = -(here->BSIM4v5cggb + here->BSIM4v5cbgb - + here->BSIM4v5cdgb + cgso) * ag0; - gcbgb = (here->BSIM4v5cbgb - pParam->BSIM4v5cgbo) * ag0; - - gcdgmb = gcsgmb = gcbgmb = 0.0; - - qgb = pParam->BSIM4v5cgbo * vgb; - qgate += qgdo + qgso + qgb; - qbulk -= qgb; - qsrc = -(qgate + qbulk + qdrn); - } - gcddb = (here->BSIM4v5cddb + here->BSIM4v5capbd + cgdo) * ag0; - gcdsb = here->BSIM4v5cdsb * ag0; - - gcsdb = -(here->BSIM4v5cgdb + here->BSIM4v5cbdb - + here->BSIM4v5cddb) * ag0; - gcssb = (here->BSIM4v5capbs + cgso - (here->BSIM4v5cgsb - + here->BSIM4v5cbsb + here->BSIM4v5cdsb)) * ag0; - - if (!here->BSIM4v5rbodyMod) - { gcdbb = -(gcdgb + gcddb + gcdsb + gcdgmb); - gcsbb = -(gcsgb + gcsdb + gcssb + gcsgmb); - gcbdb = (here->BSIM4v5cbdb - here->BSIM4v5capbd) * ag0; - gcbsb = (here->BSIM4v5cbsb - here->BSIM4v5capbs) * ag0; - gcdbdb = 0.0; gcsbsb = 0.0; - } - else - { gcdbb = -(here->BSIM4v5cddb + here->BSIM4v5cdgb - + here->BSIM4v5cdsb) * ag0; - gcsbb = -(gcsgb + gcsdb + gcssb + gcsgmb) - + here->BSIM4v5capbs * ag0; - gcbdb = here->BSIM4v5cbdb * ag0; - gcbsb = here->BSIM4v5cbsb * ag0; - - gcdbdb = -here->BSIM4v5capbd * ag0; - gcsbsb = -here->BSIM4v5capbs * ag0; - } - gcbbb = -(gcbdb + gcbgb + gcbsb + gcbgmb); - - ggtg = ggtd = ggtb = ggts = 0.0; - sxpart = 0.6; - dxpart = 0.4; - ddxpart_dVd = ddxpart_dVg = ddxpart_dVb = ddxpart_dVs = 0.0; - dsxpart_dVd = dsxpart_dVg = dsxpart_dVb = dsxpart_dVs = 0.0; - } - else - { qcheq = here->BSIM4v5qchqs; - CoxWL = model->BSIM4v5coxe * pParam->BSIM4v5weffCV * here->BSIM4v5nf - * pParam->BSIM4v5leffCV; - T0 = qdef * ScalingFactor / CoxWL; - - ggtg = here->BSIM4v5gtg = T0 * here->BSIM4v5gcrgg; - ggtd = here->BSIM4v5gtd = T0 * here->BSIM4v5gcrgd; - ggts = here->BSIM4v5gts = T0 * here->BSIM4v5gcrgs; - ggtb = here->BSIM4v5gtb = T0 * here->BSIM4v5gcrgb; - gqdef = ScalingFactor * ag0; - - gcqgb = here->BSIM4v5cqgb * ag0; - gcqdb = here->BSIM4v5cqdb * ag0; - gcqsb = here->BSIM4v5cqsb * ag0; - gcqbb = here->BSIM4v5cqbb * ag0; - - if (fabs(qcheq) <= 1.0e-5 * CoxWL) - { if (model->BSIM4v5xpart < 0.5) - { dxpart = 0.4; - } - else if (model->BSIM4v5xpart > 0.5) - { dxpart = 0.0; - } - else - { dxpart = 0.5; - } - ddxpart_dVd = ddxpart_dVg = ddxpart_dVb - = ddxpart_dVs = 0.0; - } - else - { dxpart = qdrn / qcheq; - Cdd = here->BSIM4v5cddb; - Csd = -(here->BSIM4v5cgdb + here->BSIM4v5cddb - + here->BSIM4v5cbdb); - ddxpart_dVd = (Cdd - dxpart * (Cdd + Csd)) / qcheq; - Cdg = here->BSIM4v5cdgb; - Csg = -(here->BSIM4v5cggb + here->BSIM4v5cdgb - + here->BSIM4v5cbgb); - ddxpart_dVg = (Cdg - dxpart * (Cdg + Csg)) / qcheq; - - Cds = here->BSIM4v5cdsb; - Css = -(here->BSIM4v5cgsb + here->BSIM4v5cdsb - + here->BSIM4v5cbsb); - ddxpart_dVs = (Cds - dxpart * (Cds + Css)) / qcheq; - - ddxpart_dVb = -(ddxpart_dVd + ddxpart_dVg + ddxpart_dVs); - } - sxpart = 1.0 - dxpart; - dsxpart_dVd = -ddxpart_dVd; - dsxpart_dVg = -ddxpart_dVg; - dsxpart_dVs = -ddxpart_dVs; - dsxpart_dVb = -(dsxpart_dVd + dsxpart_dVg + dsxpart_dVs); - - if (here->BSIM4v5rgateMod == 3) - { gcgmgmb = (cgdo + cgso + pParam->BSIM4v5cgbo) * ag0; - gcgmdb = -cgdo * ag0; - gcgmsb = -cgso * ag0; - gcgmbb = -pParam->BSIM4v5cgbo * ag0; - - gcdgmb = gcgmdb; - gcsgmb = gcgmsb; - gcbgmb = gcgmbb; - - gcdgb = gcsgb = gcbgb = 0.0; - gcggb = gcgdb = gcgsb = gcgbb = 0.0; - - qgmb = pParam->BSIM4v5cgbo * vgmb; - qgmid = qgdo + qgso + qgmb; - qgate = 0.0; - qbulk = -qgmb; - qdrn = -qgdo; - qsrc = -(qgmid + qbulk + qdrn); - } - else - { gcggb = (cgdo + cgso + pParam->BSIM4v5cgbo ) * ag0; - gcgdb = -cgdo * ag0; - gcgsb = -cgso * ag0; - gcgbb = -pParam->BSIM4v5cgbo * ag0; - - gcdgb = gcgdb; - gcsgb = gcgsb; - gcbgb = gcgbb; - gcdgmb = gcsgmb = gcbgmb = 0.0; - - qgb = pParam->BSIM4v5cgbo * vgb; - qgate = qgdo + qgso + qgb; - qbulk = -qgb; - qdrn = -qgdo; - qsrc = -(qgate + qbulk + qdrn); - } - - gcddb = (here->BSIM4v5capbd + cgdo) * ag0; - gcdsb = gcsdb = 0.0; - gcssb = (here->BSIM4v5capbs + cgso) * ag0; - - if (!here->BSIM4v5rbodyMod) - { gcdbb = -(gcdgb + gcddb + gcdgmb); - gcsbb = -(gcsgb + gcssb + gcsgmb); - gcbdb = -here->BSIM4v5capbd * ag0; - gcbsb = -here->BSIM4v5capbs * ag0; - gcdbdb = 0.0; gcsbsb = 0.0; - } - else - { gcdbb = gcsbb = gcbdb = gcbsb = 0.0; - gcdbdb = -here->BSIM4v5capbd * ag0; - gcsbsb = -here->BSIM4v5capbs * ag0; - } - gcbbb = -(gcbdb + gcbgb + gcbsb + gcbgmb); - } - } - else - { if (here->BSIM4v5trnqsMod == 0) - { qsrc = qdrn - qgso; - if (here->BSIM4v5rgateMod == 3) - { gcgmgmb = (cgdo + cgso + pParam->BSIM4v5cgbo) * ag0; - gcgmdb = -cgdo * ag0; - gcgmsb = -cgso * ag0; - gcgmbb = -pParam->BSIM4v5cgbo * ag0; - - gcdgmb = gcgmdb; - gcsgmb = gcgmsb; - gcbgmb = gcgmbb; - - gcggb = here->BSIM4v5cggb * ag0; - gcgdb = here->BSIM4v5cgsb * ag0; - gcgsb = here->BSIM4v5cgdb * ag0; - gcgbb = -(gcggb + gcgdb + gcgsb); - - gcdgb = -(here->BSIM4v5cggb + here->BSIM4v5cbgb - + here->BSIM4v5cdgb) * ag0; - gcsgb = here->BSIM4v5cdgb * ag0; - gcbgb = here->BSIM4v5cbgb * ag0; - - qgmb = pParam->BSIM4v5cgbo * vgmb; - qgmid = qgdo + qgso + qgmb; - qbulk -= qgmb; - qdrn = -(qgate + qgmid + qbulk + qsrc); - } - else - { gcggb = (here->BSIM4v5cggb + cgdo + cgso - + pParam->BSIM4v5cgbo ) * ag0; - gcgdb = (here->BSIM4v5cgsb - cgdo) * ag0; - gcgsb = (here->BSIM4v5cgdb - cgso) * ag0; - gcgbb = -(gcggb + gcgdb + gcgsb); - - gcdgb = -(here->BSIM4v5cggb + here->BSIM4v5cbgb - + here->BSIM4v5cdgb + cgdo) * ag0; - gcsgb = (here->BSIM4v5cdgb - cgso) * ag0; - gcbgb = (here->BSIM4v5cbgb - pParam->BSIM4v5cgbo) * ag0; - - gcdgmb = gcsgmb = gcbgmb = 0.0; - - qgb = pParam->BSIM4v5cgbo * vgb; - qgate += qgdo + qgso + qgb; - qbulk -= qgb; - qdrn = -(qgate + qbulk + qsrc); - } - gcddb = (here->BSIM4v5capbd + cgdo - (here->BSIM4v5cgsb - + here->BSIM4v5cbsb + here->BSIM4v5cdsb)) * ag0; - gcdsb = -(here->BSIM4v5cgdb + here->BSIM4v5cbdb - + here->BSIM4v5cddb) * ag0; - - gcsdb = here->BSIM4v5cdsb * ag0; - gcssb = (here->BSIM4v5cddb + here->BSIM4v5capbs + cgso) * ag0; - - if (!here->BSIM4v5rbodyMod) - { gcdbb = -(gcdgb + gcddb + gcdsb + gcdgmb); - gcsbb = -(gcsgb + gcsdb + gcssb + gcsgmb); - gcbdb = (here->BSIM4v5cbsb - here->BSIM4v5capbd) * ag0; - gcbsb = (here->BSIM4v5cbdb - here->BSIM4v5capbs) * ag0; - gcdbdb = 0.0; gcsbsb = 0.0; - } - else - { gcdbb = -(gcdgb + gcddb + gcdsb + gcdgmb) - + here->BSIM4v5capbd * ag0; - gcsbb = -(here->BSIM4v5cddb + here->BSIM4v5cdgb - + here->BSIM4v5cdsb) * ag0; - gcbdb = here->BSIM4v5cbsb * ag0; - gcbsb = here->BSIM4v5cbdb * ag0; - gcdbdb = -here->BSIM4v5capbd * ag0; - gcsbsb = -here->BSIM4v5capbs * ag0; - } - gcbbb = -(gcbgb + gcbdb + gcbsb + gcbgmb); - - ggtg = ggtd = ggtb = ggts = 0.0; - sxpart = 0.4; - dxpart = 0.6; - ddxpart_dVd = ddxpart_dVg = ddxpart_dVb = ddxpart_dVs = 0.0; - dsxpart_dVd = dsxpart_dVg = dsxpart_dVb = dsxpart_dVs = 0.0; - } - else - { qcheq = here->BSIM4v5qchqs; - CoxWL = model->BSIM4v5coxe * pParam->BSIM4v5weffCV * here->BSIM4v5nf - * pParam->BSIM4v5leffCV; - T0 = qdef * ScalingFactor / CoxWL; - ggtg = here->BSIM4v5gtg = T0 * here->BSIM4v5gcrgg; - ggts = here->BSIM4v5gts = T0 * here->BSIM4v5gcrgd; - ggtd = here->BSIM4v5gtd = T0 * here->BSIM4v5gcrgs; - ggtb = here->BSIM4v5gtb = T0 * here->BSIM4v5gcrgb; - gqdef = ScalingFactor * ag0; - - gcqgb = here->BSIM4v5cqgb * ag0; - gcqdb = here->BSIM4v5cqsb * ag0; - gcqsb = here->BSIM4v5cqdb * ag0; - gcqbb = here->BSIM4v5cqbb * ag0; - - if (fabs(qcheq) <= 1.0e-5 * CoxWL) - { if (model->BSIM4v5xpart < 0.5) - { sxpart = 0.4; - } - else if (model->BSIM4v5xpart > 0.5) - { sxpart = 0.0; - } - else - { sxpart = 0.5; - } - dsxpart_dVd = dsxpart_dVg = dsxpart_dVb - = dsxpart_dVs = 0.0; - } - else - { sxpart = qdrn / qcheq; - Css = here->BSIM4v5cddb; - Cds = -(here->BSIM4v5cgdb + here->BSIM4v5cddb - + here->BSIM4v5cbdb); - dsxpart_dVs = (Css - sxpart * (Css + Cds)) / qcheq; - Csg = here->BSIM4v5cdgb; - Cdg = -(here->BSIM4v5cggb + here->BSIM4v5cdgb - + here->BSIM4v5cbgb); - dsxpart_dVg = (Csg - sxpart * (Csg + Cdg)) / qcheq; - - Csd = here->BSIM4v5cdsb; - Cdd = -(here->BSIM4v5cgsb + here->BSIM4v5cdsb - + here->BSIM4v5cbsb); - dsxpart_dVd = (Csd - sxpart * (Csd + Cdd)) / qcheq; - - dsxpart_dVb = -(dsxpart_dVd + dsxpart_dVg + dsxpart_dVs); - } - dxpart = 1.0 - sxpart; - ddxpart_dVd = -dsxpart_dVd; - ddxpart_dVg = -dsxpart_dVg; - ddxpart_dVs = -dsxpart_dVs; - ddxpart_dVb = -(ddxpart_dVd + ddxpart_dVg + ddxpart_dVs); - - if (here->BSIM4v5rgateMod == 3) - { gcgmgmb = (cgdo + cgso + pParam->BSIM4v5cgbo) * ag0; - gcgmdb = -cgdo * ag0; - gcgmsb = -cgso * ag0; - gcgmbb = -pParam->BSIM4v5cgbo * ag0; - - gcdgmb = gcgmdb; - gcsgmb = gcgmsb; - gcbgmb = gcgmbb; - - gcdgb = gcsgb = gcbgb = 0.0; - gcggb = gcgdb = gcgsb = gcgbb = 0.0; - - qgmb = pParam->BSIM4v5cgbo * vgmb; - qgmid = qgdo + qgso + qgmb; - qgate = 0.0; - qbulk = -qgmb; - qdrn = -qgdo; - qsrc = -qgso; - } - else - { gcggb = (cgdo + cgso + pParam->BSIM4v5cgbo ) * ag0; - gcgdb = -cgdo * ag0; - gcgsb = -cgso * ag0; - gcgbb = -pParam->BSIM4v5cgbo * ag0; - - gcdgb = gcgdb; - gcsgb = gcgsb; - gcbgb = gcgbb; - gcdgmb = gcsgmb = gcbgmb = 0.0; - - qgb = pParam->BSIM4v5cgbo * vgb; - qgate = qgdo + qgso + qgb; - qbulk = -qgb; - qdrn = -qgdo; - qsrc = -qgso; - } - - gcddb = (here->BSIM4v5capbd + cgdo) * ag0; - gcdsb = gcsdb = 0.0; - gcssb = (here->BSIM4v5capbs + cgso) * ag0; - if (!here->BSIM4v5rbodyMod) - { gcdbb = -(gcdgb + gcddb + gcdgmb); - gcsbb = -(gcsgb + gcssb + gcsgmb); - gcbdb = -here->BSIM4v5capbd * ag0; - gcbsb = -here->BSIM4v5capbs * ag0; - gcdbdb = 0.0; gcsbsb = 0.0; - } - else - { gcdbb = gcsbb = gcbdb = gcbsb = 0.0; - gcdbdb = -here->BSIM4v5capbd * ag0; - gcsbsb = -here->BSIM4v5capbs * ag0; - } - gcbbb = -(gcbdb + gcbgb + gcbsb + gcbgmb); - } - } - - - if (here->BSIM4v5trnqsMod) - { *(ckt->CKTstate0 + here->BSIM4v5qcdump) = qdef * ScalingFactor; - if (ckt->CKTmode & MODEINITTRAN) - *(ckt->CKTstate1 + here->BSIM4v5qcdump) = - *(ckt->CKTstate0 + here->BSIM4v5qcdump); - error = NIintegrate(ckt, &geq, &ceq, 0.0, here->BSIM4v5qcdump); - if (error) - return(error); - } - - if (ByPass) goto line860; - - *(ckt->CKTstate0 + here->BSIM4v5qg) = qgate; - *(ckt->CKTstate0 + here->BSIM4v5qd) = qdrn - - *(ckt->CKTstate0 + here->BSIM4v5qbd); - *(ckt->CKTstate0 + here->BSIM4v5qs) = qsrc - - *(ckt->CKTstate0 + here->BSIM4v5qbs); - if (here->BSIM4v5rgateMod == 3) - *(ckt->CKTstate0 + here->BSIM4v5qgmid) = qgmid; - - if (!here->BSIM4v5rbodyMod) - { *(ckt->CKTstate0 + here->BSIM4v5qb) = qbulk - + *(ckt->CKTstate0 + here->BSIM4v5qbd) - + *(ckt->CKTstate0 + here->BSIM4v5qbs); - } - else - *(ckt->CKTstate0 + here->BSIM4v5qb) = qbulk; - - - /* Store small signal parameters */ - if (ckt->CKTmode & MODEINITSMSIG) - { goto line1000; - } - - if (!ChargeComputationNeeded) - goto line850; - - /* no integration, if dc sweep, but keep evaluating capacitances */ - if (ckt->CKTmode & MODEDCTRANCURVE) - goto line850; - - if (ckt->CKTmode & MODEINITTRAN) - { *(ckt->CKTstate1 + here->BSIM4v5qb) = - *(ckt->CKTstate0 + here->BSIM4v5qb); - *(ckt->CKTstate1 + here->BSIM4v5qg) = - *(ckt->CKTstate0 + here->BSIM4v5qg); - *(ckt->CKTstate1 + here->BSIM4v5qd) = - *(ckt->CKTstate0 + here->BSIM4v5qd); - if (here->BSIM4v5rgateMod == 3) - *(ckt->CKTstate1 + here->BSIM4v5qgmid) = - *(ckt->CKTstate0 + here->BSIM4v5qgmid); - if (here->BSIM4v5rbodyMod) - { *(ckt->CKTstate1 + here->BSIM4v5qbs) = - *(ckt->CKTstate0 + here->BSIM4v5qbs); - *(ckt->CKTstate1 + here->BSIM4v5qbd) = - *(ckt->CKTstate0 + here->BSIM4v5qbd); - } - } - - error = NIintegrate(ckt, &geq, &ceq, 0.0, here->BSIM4v5qb); - if (error) - return(error); - error = NIintegrate(ckt, &geq, &ceq, 0.0, here->BSIM4v5qg); - if (error) - return(error); - error = NIintegrate(ckt, &geq, &ceq, 0.0, here->BSIM4v5qd); - if (error) - return(error); - - if (here->BSIM4v5rgateMod == 3) - { error = NIintegrate(ckt, &geq, &ceq, 0.0, here->BSIM4v5qgmid); - if (error) return(error); - } - - if (here->BSIM4v5rbodyMod) - { error = NIintegrate(ckt, &geq, &ceq, 0.0, here->BSIM4v5qbs); - if (error) - return(error); - error = NIintegrate(ckt, &geq, &ceq, 0.0, here->BSIM4v5qbd); - if (error) - return(error); - } - - goto line860; - - -line850: - /* Zero gcap and ceqcap if (!ChargeComputationNeeded) */ - ceqqg = ceqqb = ceqqd = 0.0; - ceqqjd = ceqqjs = 0.0; - cqcheq = cqdef = 0.0; - - gcdgb = gcddb = gcdsb = gcdbb = 0.0; - gcsgb = gcsdb = gcssb = gcsbb = 0.0; - gcggb = gcgdb = gcgsb = gcgbb = 0.0; - gcbdb = gcbgb = gcbsb = gcbbb = 0.0; - - gcgmgmb = gcgmdb = gcgmsb = gcgmbb = 0.0; - gcdgmb = gcsgmb = gcbgmb = ceqqgmid = 0.0; - gcdbdb = gcsbsb = 0.0; - - gqdef = gcqgb = gcqdb = gcqsb = gcqbb = 0.0; - ggtg = ggtd = ggtb = ggts = 0.0; - sxpart = (1.0 - (dxpart = (here->BSIM4v5mode > 0) ? 0.4 : 0.6)); - ddxpart_dVd = ddxpart_dVg = ddxpart_dVb = ddxpart_dVs = 0.0; - dsxpart_dVd = dsxpart_dVg = dsxpart_dVb = dsxpart_dVs = 0.0; - - if (here->BSIM4v5trnqsMod) - { CoxWL = model->BSIM4v5coxe * pParam->BSIM4v5weffCV * here->BSIM4v5nf - * pParam->BSIM4v5leffCV; - T1 = here->BSIM4v5gcrg / CoxWL; - here->BSIM4v5gtau = T1 * ScalingFactor; - } - else - here->BSIM4v5gtau = 0.0; - - goto line900; - - -line860: - /* Calculate equivalent charge current */ - - cqgate = *(ckt->CKTstate0 + here->BSIM4v5cqg); - cqbody = *(ckt->CKTstate0 + here->BSIM4v5cqb); - cqdrn = *(ckt->CKTstate0 + here->BSIM4v5cqd); - - ceqqg = cqgate - gcggb * vgb + gcgdb * vbd + gcgsb * vbs; - ceqqd = cqdrn - gcdgb * vgb - gcdgmb * vgmb + (gcddb + gcdbdb) - * vbd - gcdbdb * vbd_jct + gcdsb * vbs; - ceqqb = cqbody - gcbgb * vgb - gcbgmb * vgmb - + gcbdb * vbd + gcbsb * vbs; - - - if (here->BSIM4v5rgateMod == 3) - ceqqgmid = *(ckt->CKTstate0 + here->BSIM4v5cqgmid) - + gcgmdb * vbd + gcgmsb * vbs - gcgmgmb * vgmb; - else - ceqqgmid = 0.0; - - if (here->BSIM4v5rbodyMod) - { ceqqjs = *(ckt->CKTstate0 + here->BSIM4v5cqbs) + gcsbsb * vbs_jct; - ceqqjd = *(ckt->CKTstate0 + here->BSIM4v5cqbd) + gcdbdb * vbd_jct; - } - - if (here->BSIM4v5trnqsMod) - { T0 = ggtg * vgb - ggtd * vbd - ggts * vbs; - ceqqg += T0; - T1 = qdef * here->BSIM4v5gtau; - ceqqd -= dxpart * T0 + T1 * (ddxpart_dVg * vgb - ddxpart_dVd - * vbd - ddxpart_dVs * vbs); - cqdef = *(ckt->CKTstate0 + here->BSIM4v5cqcdump) - gqdef * qdef; - cqcheq = *(ckt->CKTstate0 + here->BSIM4v5cqcheq) - - (gcqgb * vgb - gcqdb * vbd - gcqsb * vbs) + T0; - } - - if (ckt->CKTmode & MODEINITTRAN) - { *(ckt->CKTstate1 + here->BSIM4v5cqb) = - *(ckt->CKTstate0 + here->BSIM4v5cqb); - *(ckt->CKTstate1 + here->BSIM4v5cqg) = - *(ckt->CKTstate0 + here->BSIM4v5cqg); - *(ckt->CKTstate1 + here->BSIM4v5cqd) = - *(ckt->CKTstate0 + here->BSIM4v5cqd); - - if (here->BSIM4v5rgateMod == 3) - *(ckt->CKTstate1 + here->BSIM4v5cqgmid) = - *(ckt->CKTstate0 + here->BSIM4v5cqgmid); - - if (here->BSIM4v5rbodyMod) - { *(ckt->CKTstate1 + here->BSIM4v5cqbs) = - *(ckt->CKTstate0 + here->BSIM4v5cqbs); - *(ckt->CKTstate1 + here->BSIM4v5cqbd) = - *(ckt->CKTstate0 + here->BSIM4v5cqbd); - } - } - - - /* - * Load current vector - */ - -line900: - if (here->BSIM4v5mode >= 0) - { Gm = here->BSIM4v5gm; - Gmbs = here->BSIM4v5gmbs; - FwdSum = Gm + Gmbs; - RevSum = 0.0; - - ceqdrn = model->BSIM4v5type * (cdrain - here->BSIM4v5gds * vds - - Gm * vgs - Gmbs * vbs); - ceqbd = model->BSIM4v5type * (here->BSIM4v5csub + here->BSIM4v5Igidl - - (here->BSIM4v5gbds + here->BSIM4v5ggidld) * vds - - (here->BSIM4v5gbgs + here->BSIM4v5ggidlg) * vgs - - (here->BSIM4v5gbbs + here->BSIM4v5ggidlb) * vbs); - ceqbs = model->BSIM4v5type * (here->BSIM4v5Igisl + here->BSIM4v5ggisls * vds - - here->BSIM4v5ggislg * vgd - here->BSIM4v5ggislb * vbd); - - gbbdp = -(here->BSIM4v5gbds); - gbbsp = here->BSIM4v5gbds + here->BSIM4v5gbgs + here->BSIM4v5gbbs; - - gbdpg = here->BSIM4v5gbgs; - gbdpdp = here->BSIM4v5gbds; - gbdpb = here->BSIM4v5gbbs; - gbdpsp = -(gbdpg + gbdpdp + gbdpb); - - gbspg = 0.0; - gbspdp = 0.0; - gbspb = 0.0; - gbspsp = 0.0; - - if (model->BSIM4v5igcMod) - { gIstotg = here->BSIM4v5gIgsg + here->BSIM4v5gIgcsg; - gIstotd = here->BSIM4v5gIgcsd; - gIstots = here->BSIM4v5gIgss + here->BSIM4v5gIgcss; - gIstotb = here->BSIM4v5gIgcsb; - Istoteq = model->BSIM4v5type * (here->BSIM4v5Igs + here->BSIM4v5Igcs - - gIstotg * vgs - here->BSIM4v5gIgcsd * vds - - here->BSIM4v5gIgcsb * vbs); - - gIdtotg = here->BSIM4v5gIgdg + here->BSIM4v5gIgcdg; - gIdtotd = here->BSIM4v5gIgdd + here->BSIM4v5gIgcdd; - gIdtots = here->BSIM4v5gIgcds; - gIdtotb = here->BSIM4v5gIgcdb; - Idtoteq = model->BSIM4v5type * (here->BSIM4v5Igd + here->BSIM4v5Igcd - - here->BSIM4v5gIgdg * vgd - here->BSIM4v5gIgcdg * vgs - - here->BSIM4v5gIgcdd * vds - here->BSIM4v5gIgcdb * vbs); - } - else - { gIstotg = gIstotd = gIstots = gIstotb = Istoteq = 0.0; - gIdtotg = gIdtotd = gIdtots = gIdtotb = Idtoteq = 0.0; - } - - if (model->BSIM4v5igbMod) - { gIbtotg = here->BSIM4v5gIgbg; - gIbtotd = here->BSIM4v5gIgbd; - gIbtots = here->BSIM4v5gIgbs; - gIbtotb = here->BSIM4v5gIgbb; - Ibtoteq = model->BSIM4v5type * (here->BSIM4v5Igb - - here->BSIM4v5gIgbg * vgs - here->BSIM4v5gIgbd * vds - - here->BSIM4v5gIgbb * vbs); - } - else - gIbtotg = gIbtotd = gIbtots = gIbtotb = Ibtoteq = 0.0; - - if ((model->BSIM4v5igcMod != 0) || (model->BSIM4v5igbMod != 0)) - { gIgtotg = gIstotg + gIdtotg + gIbtotg; - gIgtotd = gIstotd + gIdtotd + gIbtotd ; - gIgtots = gIstots + gIdtots + gIbtots; - gIgtotb = gIstotb + gIdtotb + gIbtotb; - Igtoteq = Istoteq + Idtoteq + Ibtoteq; - } - else - gIgtotg = gIgtotd = gIgtots = gIgtotb = Igtoteq = 0.0; - - - if (here->BSIM4v5rgateMod == 2) - T0 = vges - vgs; - else if (here->BSIM4v5rgateMod == 3) - T0 = vgms - vgs; - if (here->BSIM4v5rgateMod > 1) - { gcrgd = here->BSIM4v5gcrgd * T0; - gcrgg = here->BSIM4v5gcrgg * T0; - gcrgs = here->BSIM4v5gcrgs * T0; - gcrgb = here->BSIM4v5gcrgb * T0; - ceqgcrg = -(gcrgd * vds + gcrgg * vgs - + gcrgb * vbs); - gcrgg -= here->BSIM4v5gcrg; - gcrg = here->BSIM4v5gcrg; - } - else - ceqgcrg = gcrg = gcrgd = gcrgg = gcrgs = gcrgb = 0.0; - } - else - { Gm = -here->BSIM4v5gm; - Gmbs = -here->BSIM4v5gmbs; - FwdSum = 0.0; - RevSum = -(Gm + Gmbs); - - ceqdrn = -model->BSIM4v5type * (cdrain + here->BSIM4v5gds * vds - + Gm * vgd + Gmbs * vbd); - - ceqbs = model->BSIM4v5type * (here->BSIM4v5csub + here->BSIM4v5Igisl - + (here->BSIM4v5gbds + here->BSIM4v5ggisls) * vds - - (here->BSIM4v5gbgs + here->BSIM4v5ggislg) * vgd - - (here->BSIM4v5gbbs + here->BSIM4v5ggislb) * vbd); - ceqbd = model->BSIM4v5type * (here->BSIM4v5Igidl - here->BSIM4v5ggidld * vds - - here->BSIM4v5ggidlg * vgs - here->BSIM4v5ggidlb * vbs); - - gbbsp = -(here->BSIM4v5gbds); - gbbdp = here->BSIM4v5gbds + here->BSIM4v5gbgs + here->BSIM4v5gbbs; - - gbdpg = 0.0; - gbdpsp = 0.0; - gbdpb = 0.0; - gbdpdp = 0.0; - - gbspg = here->BSIM4v5gbgs; - gbspsp = here->BSIM4v5gbds; - gbspb = here->BSIM4v5gbbs; - gbspdp = -(gbspg + gbspsp + gbspb); - - if (model->BSIM4v5igcMod) - { gIstotg = here->BSIM4v5gIgsg + here->BSIM4v5gIgcdg; - gIstotd = here->BSIM4v5gIgcds; - gIstots = here->BSIM4v5gIgss + here->BSIM4v5gIgcdd; - gIstotb = here->BSIM4v5gIgcdb; - Istoteq = model->BSIM4v5type * (here->BSIM4v5Igs + here->BSIM4v5Igcd - - here->BSIM4v5gIgsg * vgs - here->BSIM4v5gIgcdg * vgd - + here->BSIM4v5gIgcdd * vds - here->BSIM4v5gIgcdb * vbd); - - gIdtotg = here->BSIM4v5gIgdg + here->BSIM4v5gIgcsg; - gIdtotd = here->BSIM4v5gIgdd + here->BSIM4v5gIgcss; - gIdtots = here->BSIM4v5gIgcsd; - gIdtotb = here->BSIM4v5gIgcsb; - Idtoteq = model->BSIM4v5type * (here->BSIM4v5Igd + here->BSIM4v5Igcs - - (here->BSIM4v5gIgdg + here->BSIM4v5gIgcsg) * vgd - + here->BSIM4v5gIgcsd * vds - here->BSIM4v5gIgcsb * vbd); - } - else - { gIstotg = gIstotd = gIstots = gIstotb = Istoteq = 0.0; - gIdtotg = gIdtotd = gIdtots = gIdtotb = Idtoteq = 0.0; - } - - if (model->BSIM4v5igbMod) - { gIbtotg = here->BSIM4v5gIgbg; - gIbtotd = here->BSIM4v5gIgbs; - gIbtots = here->BSIM4v5gIgbd; - gIbtotb = here->BSIM4v5gIgbb; - Ibtoteq = model->BSIM4v5type * (here->BSIM4v5Igb - - here->BSIM4v5gIgbg * vgd + here->BSIM4v5gIgbd * vds - - here->BSIM4v5gIgbb * vbd); - } - else - gIbtotg = gIbtotd = gIbtots = gIbtotb = Ibtoteq = 0.0; - - if ((model->BSIM4v5igcMod != 0) || (model->BSIM4v5igbMod != 0)) - { gIgtotg = gIstotg + gIdtotg + gIbtotg; - gIgtotd = gIstotd + gIdtotd + gIbtotd ; - gIgtots = gIstots + gIdtots + gIbtots; - gIgtotb = gIstotb + gIdtotb + gIbtotb; - Igtoteq = Istoteq + Idtoteq + Ibtoteq; - } - else - gIgtotg = gIgtotd = gIgtots = gIgtotb = Igtoteq = 0.0; - - - if (here->BSIM4v5rgateMod == 2) - T0 = vges - vgs; - else if (here->BSIM4v5rgateMod == 3) - T0 = vgms - vgs; - if (here->BSIM4v5rgateMod > 1) - { gcrgd = here->BSIM4v5gcrgs * T0; - gcrgg = here->BSIM4v5gcrgg * T0; - gcrgs = here->BSIM4v5gcrgd * T0; - gcrgb = here->BSIM4v5gcrgb * T0; - ceqgcrg = -(gcrgg * vgd - gcrgs * vds - + gcrgb * vbd); - gcrgg -= here->BSIM4v5gcrg; - gcrg = here->BSIM4v5gcrg; - } - else - ceqgcrg = gcrg = gcrgd = gcrgg = gcrgs = gcrgb = 0.0; - } - - if (model->BSIM4v5rdsMod == 1) - { ceqgstot = model->BSIM4v5type * (here->BSIM4v5gstotd * vds - + here->BSIM4v5gstotg * vgs + here->BSIM4v5gstotb * vbs); - /* WDLiu: ceqgstot flowing away from sNodePrime */ - gstot = here->BSIM4v5gstot; - gstotd = here->BSIM4v5gstotd; - gstotg = here->BSIM4v5gstotg; - gstots = here->BSIM4v5gstots - gstot; - gstotb = here->BSIM4v5gstotb; - - ceqgdtot = -model->BSIM4v5type * (here->BSIM4v5gdtotd * vds - + here->BSIM4v5gdtotg * vgs + here->BSIM4v5gdtotb * vbs); - /* WDLiu: ceqgdtot defined as flowing into dNodePrime */ - gdtot = here->BSIM4v5gdtot; - gdtotd = here->BSIM4v5gdtotd - gdtot; - gdtotg = here->BSIM4v5gdtotg; - gdtots = here->BSIM4v5gdtots; - gdtotb = here->BSIM4v5gdtotb; - } - else - { gstot = gstotd = gstotg = gstots = gstotb = ceqgstot = 0.0; - gdtot = gdtotd = gdtotg = gdtots = gdtotb = ceqgdtot = 0.0; - } - - if (model->BSIM4v5type > 0) - { ceqjs = (here->BSIM4v5cbs - here->BSIM4v5gbs * vbs_jct); - ceqjd = (here->BSIM4v5cbd - here->BSIM4v5gbd * vbd_jct); - } - else - { ceqjs = -(here->BSIM4v5cbs - here->BSIM4v5gbs * vbs_jct); - ceqjd = -(here->BSIM4v5cbd - here->BSIM4v5gbd * vbd_jct); - ceqqg = -ceqqg; - ceqqd = -ceqqd; - ceqqb = -ceqqb; - ceqgcrg = -ceqgcrg; - - if (here->BSIM4v5trnqsMod) - { cqdef = -cqdef; - cqcheq = -cqcheq; - } - - if (here->BSIM4v5rbodyMod) - { ceqqjs = -ceqqjs; - ceqqjd = -ceqqjd; - } - - if (here->BSIM4v5rgateMod == 3) - ceqqgmid = -ceqqgmid; - } - - - /* - * Loading RHS - */ - - m = here->BSIM4v5m; - -#ifdef USE_OMP - here->BSIM4v5rhsdPrime = m * (ceqjd - ceqbd + ceqgdtot - - ceqdrn - ceqqd + Idtoteq); - here->BSIM4v5rhsgPrime = m * (ceqqg - ceqgcrg + Igtoteq); - - if (here->BSIM4v5rgateMod == 2) - here->BSIM4v5rhsgExt = m * ceqgcrg; - else if (here->BSIM4v5rgateMod == 3) - here->BSIM4v5grhsMid = m * (ceqqgmid + ceqgcrg); - - if (!here->BSIM4v5rbodyMod) - { here->BSIM4v5rhsbPrime = m * (ceqbd + ceqbs - ceqjd - - ceqjs - ceqqb + Ibtoteq); - here->BSIM4v5rhssPrime = m * (ceqdrn - ceqbs + ceqjs - + ceqqg + ceqqb + ceqqd + ceqqgmid - ceqgstot + Istoteq); - } - else - { here->BSIM4v5rhsdb = m * (ceqjd + ceqqjd); - here->BSIM4v5rhsbPrime = m * (ceqbd + ceqbs - ceqqb + Ibtoteq); - here->BSIM4v5rhssb = m * (ceqjs + ceqqjs); - here->BSIM4v5rhssPrime = m * (ceqdrn - ceqbs + ceqjs + ceqqd - + ceqqg + ceqqb + ceqqjd + ceqqjs + ceqqgmid - ceqgstot + Istoteq); - } - - if (model->BSIM4v5rdsMod) - { here->BSIM4v5rhsd = m * ceqgdtot; - here->BSIM4v5rhss = m * ceqgstot; - } - - if (here->BSIM4v5trnqsMod) - here->BSIM4v5rhsq = m * (cqcheq - cqdef); -#else - (*(ckt->CKTrhs + here->BSIM4v5dNodePrime) += m * (ceqjd - ceqbd + ceqgdtot - - ceqdrn - ceqqd + Idtoteq)); - (*(ckt->CKTrhs + here->BSIM4v5gNodePrime) -= m * (ceqqg - ceqgcrg + Igtoteq)); - - if (here->BSIM4v5rgateMod == 2) - (*(ckt->CKTrhs + here->BSIM4v5gNodeExt) -= m * ceqgcrg); - else if (here->BSIM4v5rgateMod == 3) - (*(ckt->CKTrhs + here->BSIM4v5gNodeMid) -= m * (ceqqgmid + ceqgcrg)); - - if (!here->BSIM4v5rbodyMod) - { (*(ckt->CKTrhs + here->BSIM4v5bNodePrime) += m * (ceqbd + ceqbs - ceqjd - - ceqjs - ceqqb + Ibtoteq)); - (*(ckt->CKTrhs + here->BSIM4v5sNodePrime) += m * (ceqdrn - ceqbs + ceqjs - + ceqqg + ceqqb + ceqqd + ceqqgmid - ceqgstot + Istoteq)); - } - else - { (*(ckt->CKTrhs + here->BSIM4v5dbNode) -= m * (ceqjd + ceqqjd)); - (*(ckt->CKTrhs + here->BSIM4v5bNodePrime) += m * (ceqbd + ceqbs - ceqqb + Ibtoteq)); - (*(ckt->CKTrhs + here->BSIM4v5sbNode) -= m * (ceqjs + ceqqjs)); - (*(ckt->CKTrhs + here->BSIM4v5sNodePrime) += m * (ceqdrn - ceqbs + ceqjs + ceqqd - + ceqqg + ceqqb + ceqqjd + ceqqjs + ceqqgmid - ceqgstot + Istoteq)); - } - - if (model->BSIM4v5rdsMod) - { (*(ckt->CKTrhs + here->BSIM4v5dNode) -= m * ceqgdtot); - (*(ckt->CKTrhs + here->BSIM4v5sNode) += m * ceqgstot); - } - - if (here->BSIM4v5trnqsMod) - *(ckt->CKTrhs + here->BSIM4v5qNode) += m * (cqcheq - cqdef); -#endif - - - /* - * Loading matrix - */ - - if (!here->BSIM4v5rbodyMod) - { gjbd = here->BSIM4v5gbd; - gjbs = here->BSIM4v5gbs; - } - else - gjbd = gjbs = 0.0; - - if (!model->BSIM4v5rdsMod) - { gdpr = here->BSIM4v5drainConductance; - gspr = here->BSIM4v5sourceConductance; - } - else - gdpr = gspr = 0.0; - - geltd = here->BSIM4v5grgeltd; - - T1 = qdef * here->BSIM4v5gtau; - -#ifdef USE_OMP - if (here->BSIM4v5rgateMod == 1) - { here->BSIM4v5_1 = m * geltd; - here->BSIM4v5_2 = m * geltd; - here->BSIM4v5_3 = m * geltd; - here->BSIM4v5_4 = m * (gcggb + geltd - ggtg + gIgtotg); - here->BSIM4v5_5 = m * (gcgdb - ggtd + gIgtotd); - here->BSIM4v5_6 = m * (gcgsb - ggts + gIgtots); - here->BSIM4v5_7 = m * (gcgbb - ggtb + gIgtotb); - } /* WDLiu: gcrg already subtracted from all gcrgg below */ - else if (here->BSIM4v5rgateMod == 2) - { here->BSIM4v5_8 = m * gcrg; - here->BSIM4v5_9 = m * gcrgg; - here->BSIM4v5_10 = m * gcrgd; - here->BSIM4v5_11 = m * gcrgs; - here->BSIM4v5_12 = m * gcrgb; - - here->BSIM4v5_13 = m * gcrg; - here->BSIM4v5_14 = m * (gcggb - gcrgg - ggtg + gIgtotg); - here->BSIM4v5_15 = m * (gcgdb - gcrgd - ggtd + gIgtotd); - here->BSIM4v5_16 = m * (gcgsb - gcrgs - ggts + gIgtots); - here->BSIM4v5_17 = m * (gcgbb - gcrgb - ggtb + gIgtotb); - } - else if (here->BSIM4v5rgateMod == 3) - { here->BSIM4v5_18 = m * geltd; - here->BSIM4v5_19 = m * geltd; - here->BSIM4v5_20 = m * geltd; - here->BSIM4v5_21 = m * (geltd + gcrg + gcgmgmb); - - here->BSIM4v5_22 = m * (gcrgd + gcgmdb); - here->BSIM4v5_23 = m * gcrgg; - here->BSIM4v5_24 = m * (gcrgs + gcgmsb); - here->BSIM4v5_25 = m * (gcrgb + gcgmbb); - - here->BSIM4v5_26 = m * gcdgmb; - here->BSIM4v5_27 = m * gcrg; - here->BSIM4v5_28 = m * gcsgmb; - here->BSIM4v5_29 = m * gcbgmb; - - here->BSIM4v5_30 = m * (gcggb - gcrgg - ggtg + gIgtotg); - here->BSIM4v5_31 = m * (gcgdb - gcrgd - ggtd + gIgtotd); - here->BSIM4v5_32 = m * (gcgsb - gcrgs - ggts + gIgtots); - here->BSIM4v5_33 = m * (gcgbb - gcrgb - ggtb + gIgtotb); - } - else - { here->BSIM4v5_34 = m * (gcggb - ggtg + gIgtotg); - here->BSIM4v5_35 = m * (gcgdb - ggtd + gIgtotd); - here->BSIM4v5_36 = m * (gcgsb - ggts + gIgtots); - here->BSIM4v5_37 = m * (gcgbb - ggtb + gIgtotb); - } - - if (model->BSIM4v5rdsMod) - { here->BSIM4v5_38 = m * gdtotg; - here->BSIM4v5_39 = m * gdtots; - here->BSIM4v5_40 = m * gdtotb; - here->BSIM4v5_41 = m * gstotd; - here->BSIM4v5_42 = m * gstotg; - here->BSIM4v5_43 = m * gstotb; - } - - here->BSIM4v5_44 = m * (gdpr + here->BSIM4v5gds + here->BSIM4v5gbd + T1 * ddxpart_dVd - - gdtotd + RevSum + gcddb + gbdpdp + dxpart * ggtd - gIdtotd); - here->BSIM4v5_45 = m * (gdpr + gdtot); - here->BSIM4v5_46 = m * (Gm + gcdgb - gdtotg + gbdpg - gIdtotg - + dxpart * ggtg + T1 * ddxpart_dVg); - here->BSIM4v5_47 = m * (here->BSIM4v5gds + gdtots - dxpart * ggts + gIdtots - - T1 * ddxpart_dVs + FwdSum - gcdsb - gbdpsp); - here->BSIM4v5_48 = m * (gjbd + gdtotb - Gmbs - gcdbb - gbdpb + gIdtotb - - T1 * ddxpart_dVb - dxpart * ggtb); - - here->BSIM4v5_49 = m * (gdpr - gdtotd); - here->BSIM4v5_50 = m * (gdpr + gdtot); - - here->BSIM4v5_51 = m * (here->BSIM4v5gds + gstotd + RevSum - gcsdb - gbspdp - - T1 * dsxpart_dVd - sxpart * ggtd + gIstotd); - here->BSIM4v5_52 = m * (gcsgb - Gm - gstotg + gbspg + sxpart * ggtg - + T1 * dsxpart_dVg - gIstotg); - here->BSIM4v5_53 = m * (gspr + here->BSIM4v5gds + here->BSIM4v5gbs + T1 * dsxpart_dVs - - gstots + FwdSum + gcssb + gbspsp + sxpart * ggts - gIstots); - here->BSIM4v5_54 = m * (gspr + gstot); - here->BSIM4v5_55 = m * (gjbs + gstotb + Gmbs - gcsbb - gbspb - sxpart * ggtb - - T1 * dsxpart_dVb + gIstotb); - - here->BSIM4v5_56 = m * (gspr - gstots); - here->BSIM4v5_57 = m * (gspr + gstot); - - here->BSIM4v5_58 = m * (gcbdb - gjbd + gbbdp - gIbtotd); - here->BSIM4v5_59 = m * (gcbgb - here->BSIM4v5gbgs - gIbtotg); - here->BSIM4v5_60 = m * (gcbsb - gjbs + gbbsp - gIbtots); - here->BSIM4v5_61 = m * (gjbd + gjbs + gcbbb - here->BSIM4v5gbbs - gIbtotb); - - ggidld = here->BSIM4v5ggidld; - ggidlg = here->BSIM4v5ggidlg; - ggidlb = here->BSIM4v5ggidlb; - ggislg = here->BSIM4v5ggislg; - ggisls = here->BSIM4v5ggisls; - ggislb = here->BSIM4v5ggislb; - - /* stamp gidl */ - here->BSIM4v5_62 = m * ggidld; - here->BSIM4v5_63 = m * ggidlg; - here->BSIM4v5_64 = m * (ggidlg + ggidld + ggidlb); - here->BSIM4v5_65 = m * ggidlb; - here->BSIM4v5_66 = m * ggidld; - here->BSIM4v5_67 = m * ggidlg; - here->BSIM4v5_68 = m * (ggidlg + ggidld + ggidlb); - here->BSIM4v5_69 = m * ggidlb; - /* stamp gisl */ - here->BSIM4v5_70 = m * (ggisls + ggislg + ggislb); - here->BSIM4v5_71 = m * ggislg; - here->BSIM4v5_72 = m * ggisls; - here->BSIM4v5_73 = m * ggislb; - here->BSIM4v5_74 = m * (ggislg + ggisls + ggislb); - here->BSIM4v5_75 = m * ggislg; - here->BSIM4v5_76 = m * ggisls; - here->BSIM4v5_77 = m * ggislb; - - if (here->BSIM4v5rbodyMod) - { here->BSIM4v5_78 = m * (gcdbdb - here->BSIM4v5gbd); - here->BSIM4v5_79 = m * (here->BSIM4v5gbs - gcsbsb); - - here->BSIM4v5_80 = m * (gcdbdb - here->BSIM4v5gbd); - here->BSIM4v5_81 = m * (here->BSIM4v5gbd - gcdbdb - + here->BSIM4v5grbpd + here->BSIM4v5grbdb); - here->BSIM4v5_82 = m * here->BSIM4v5grbpd; - here->BSIM4v5_83 = m * here->BSIM4v5grbdb; - - here->BSIM4v5_84 = m * here->BSIM4v5grbpd; - here->BSIM4v5_85 = m * here->BSIM4v5grbpb; - here->BSIM4v5_86 = m * here->BSIM4v5grbps; - here->BSIM4v5_87 = m * (here->BSIM4v5grbpd + here->BSIM4v5grbps - + here->BSIM4v5grbpb); - /* WDLiu: (gcbbb - here->BSIM4v5gbbs) already added to BPbpPtr */ - - here->BSIM4v5_88 = m * (gcsbsb - here->BSIM4v5gbs); - here->BSIM4v5_89 = m * here->BSIM4v5grbps; - here->BSIM4v5_90 = m * here->BSIM4v5grbsb; - here->BSIM4v5_91 = m * (here->BSIM4v5gbs - gcsbsb - + here->BSIM4v5grbps + here->BSIM4v5grbsb); - - here->BSIM4v5_92 = m * here->BSIM4v5grbdb; - here->BSIM4v5_93 = m * here->BSIM4v5grbpb; - here->BSIM4v5_94 = m * here->BSIM4v5grbsb; - here->BSIM4v5_95 = m * (here->BSIM4v5grbsb + here->BSIM4v5grbdb - + here->BSIM4v5grbpb); - } - - if (here->BSIM4v5trnqsMod) - { here->BSIM4v5_96 = m * (gqdef + here->BSIM4v5gtau); - here->BSIM4v5_97 = m * (ggtg - gcqgb); - here->BSIM4v5_98 = m * (ggtd - gcqdb); - here->BSIM4v5_99 = m * (ggts - gcqsb); - here->BSIM4v5_100 = m * (ggtb - gcqbb); - - here->BSIM4v5_101 = m * dxpart * here->BSIM4v5gtau; - here->BSIM4v5_102 = m * sxpart * here->BSIM4v5gtau; - here->BSIM4v5_103 = m * here->BSIM4v5gtau; - } -#else - if (here->BSIM4v5rgateMod == 1) - { (*(here->BSIM4v5GEgePtr) += m * geltd); - (*(here->BSIM4v5GPgePtr) -= m * geltd); - (*(here->BSIM4v5GEgpPtr) -= m * geltd); - (*(here->BSIM4v5GPgpPtr) += m * (gcggb + geltd - ggtg + gIgtotg)); - (*(here->BSIM4v5GPdpPtr) += m * (gcgdb - ggtd + gIgtotd)); - (*(here->BSIM4v5GPspPtr) += m * (gcgsb - ggts + gIgtots)); - (*(here->BSIM4v5GPbpPtr) += m * (gcgbb - ggtb + gIgtotb)); - } /* WDLiu: gcrg already subtracted from all gcrgg below */ - else if (here->BSIM4v5rgateMod == 2) - { (*(here->BSIM4v5GEgePtr) += m * gcrg); - (*(here->BSIM4v5GEgpPtr) += m * gcrgg); - (*(here->BSIM4v5GEdpPtr) += m * gcrgd); - (*(here->BSIM4v5GEspPtr) += m * gcrgs); - (*(here->BSIM4v5GEbpPtr) += m * gcrgb); - - (*(here->BSIM4v5GPgePtr) -= m * gcrg); - (*(here->BSIM4v5GPgpPtr) += m * (gcggb - gcrgg - ggtg + gIgtotg)); - (*(here->BSIM4v5GPdpPtr) += m * (gcgdb - gcrgd - ggtd + gIgtotd)); - (*(here->BSIM4v5GPspPtr) += m * (gcgsb - gcrgs - ggts + gIgtots)); - (*(here->BSIM4v5GPbpPtr) += m * (gcgbb - gcrgb - ggtb + gIgtotb)); - } - else if (here->BSIM4v5rgateMod == 3) - { (*(here->BSIM4v5GEgePtr) += m * geltd); - (*(here->BSIM4v5GEgmPtr) -= m * geltd); - (*(here->BSIM4v5GMgePtr) -= m * geltd); - (*(here->BSIM4v5GMgmPtr) += m * (geltd + gcrg + gcgmgmb)); - - (*(here->BSIM4v5GMdpPtr) += m * (gcrgd + gcgmdb)); - (*(here->BSIM4v5GMgpPtr) += m * gcrgg); - (*(here->BSIM4v5GMspPtr) += m * (gcrgs + gcgmsb)); - (*(here->BSIM4v5GMbpPtr) += m * (gcrgb + gcgmbb)); - - (*(here->BSIM4v5DPgmPtr) += m * gcdgmb); - (*(here->BSIM4v5GPgmPtr) -= m * gcrg); - (*(here->BSIM4v5SPgmPtr) += m * gcsgmb); - (*(here->BSIM4v5BPgmPtr) += m * gcbgmb); - - (*(here->BSIM4v5GPgpPtr) += m * (gcggb - gcrgg - ggtg + gIgtotg)); - (*(here->BSIM4v5GPdpPtr) += m * (gcgdb - gcrgd - ggtd + gIgtotd)); - (*(here->BSIM4v5GPspPtr) += m * (gcgsb - gcrgs - ggts + gIgtots)); - (*(here->BSIM4v5GPbpPtr) += m * (gcgbb - gcrgb - ggtb + gIgtotb)); - } - else - { (*(here->BSIM4v5GPgpPtr) += m * (gcggb - ggtg + gIgtotg)); - (*(here->BSIM4v5GPdpPtr) += m * (gcgdb - ggtd + gIgtotd)); - (*(here->BSIM4v5GPspPtr) += m * (gcgsb - ggts + gIgtots)); - (*(here->BSIM4v5GPbpPtr) += m * (gcgbb - ggtb + gIgtotb)); - } - - if (model->BSIM4v5rdsMod) - { (*(here->BSIM4v5DgpPtr) += m * gdtotg); - (*(here->BSIM4v5DspPtr) += m * gdtots); - (*(here->BSIM4v5DbpPtr) += m * gdtotb); - (*(here->BSIM4v5SdpPtr) += m * gstotd); - (*(here->BSIM4v5SgpPtr) += m * gstotg); - (*(here->BSIM4v5SbpPtr) += m * gstotb); - } - - (*(here->BSIM4v5DPdpPtr) += m * (gdpr + here->BSIM4v5gds + here->BSIM4v5gbd + T1 * ddxpart_dVd - - gdtotd + RevSum + gcddb + gbdpdp + dxpart * ggtd - gIdtotd)); - (*(here->BSIM4v5DPdPtr) -= m * (gdpr + gdtot)); - (*(here->BSIM4v5DPgpPtr) += m * (Gm + gcdgb - gdtotg + gbdpg - gIdtotg - + dxpart * ggtg + T1 * ddxpart_dVg)); - (*(here->BSIM4v5DPspPtr) -= m * (here->BSIM4v5gds + gdtots - dxpart * ggts + gIdtots - - T1 * ddxpart_dVs + FwdSum - gcdsb - gbdpsp)); - (*(here->BSIM4v5DPbpPtr) -= m * (gjbd + gdtotb - Gmbs - gcdbb - gbdpb + gIdtotb - - T1 * ddxpart_dVb - dxpart * ggtb)); - - (*(here->BSIM4v5DdpPtr) -= m * (gdpr - gdtotd)); - (*(here->BSIM4v5DdPtr) += m * (gdpr + gdtot)); - - (*(here->BSIM4v5SPdpPtr) -= m * (here->BSIM4v5gds + gstotd + RevSum - gcsdb - gbspdp - - T1 * dsxpart_dVd - sxpart * ggtd + gIstotd)); - (*(here->BSIM4v5SPgpPtr) += m * (gcsgb - Gm - gstotg + gbspg + sxpart * ggtg - + T1 * dsxpart_dVg - gIstotg)); - (*(here->BSIM4v5SPspPtr) += m * (gspr + here->BSIM4v5gds + here->BSIM4v5gbs + T1 * dsxpart_dVs - - gstots + FwdSum + gcssb + gbspsp + sxpart * ggts - gIstots)); - (*(here->BSIM4v5SPsPtr) -= m * (gspr + gstot)); - (*(here->BSIM4v5SPbpPtr) -= m * (gjbs + gstotb + Gmbs - gcsbb - gbspb - sxpart * ggtb - - T1 * dsxpart_dVb + gIstotb)); - - (*(here->BSIM4v5SspPtr) -= m * (gspr - gstots)); - (*(here->BSIM4v5SsPtr) += m * (gspr + gstot)); - - (*(here->BSIM4v5BPdpPtr) += m * (gcbdb - gjbd + gbbdp - gIbtotd)); - (*(here->BSIM4v5BPgpPtr) += m * (gcbgb - here->BSIM4v5gbgs - gIbtotg)); - (*(here->BSIM4v5BPspPtr) += m * (gcbsb - gjbs + gbbsp - gIbtots)); - (*(here->BSIM4v5BPbpPtr) += m * (gjbd + gjbs + gcbbb - here->BSIM4v5gbbs - - gIbtotb)); - - ggidld = here->BSIM4v5ggidld; - ggidlg = here->BSIM4v5ggidlg; - ggidlb = here->BSIM4v5ggidlb; - ggislg = here->BSIM4v5ggislg; - ggisls = here->BSIM4v5ggisls; - ggislb = here->BSIM4v5ggislb; - - /* stamp gidl */ - (*(here->BSIM4v5DPdpPtr) += m * ggidld); - (*(here->BSIM4v5DPgpPtr) += m * ggidlg); - (*(here->BSIM4v5DPspPtr) -= m * (ggidlg + ggidld + ggidlb)); - (*(here->BSIM4v5DPbpPtr) += m * ggidlb); - (*(here->BSIM4v5BPdpPtr) -= m * ggidld); - (*(here->BSIM4v5BPgpPtr) -= m * ggidlg); - (*(here->BSIM4v5BPspPtr) += m * (ggidlg + ggidld + ggidlb)); - (*(here->BSIM4v5BPbpPtr) -= m * ggidlb); - /* stamp gisl */ - (*(here->BSIM4v5SPdpPtr) -= m * (ggisls + ggislg + ggislb)); - (*(here->BSIM4v5SPgpPtr) += m * ggislg); - (*(here->BSIM4v5SPspPtr) += m * ggisls); - (*(here->BSIM4v5SPbpPtr) += m * ggislb); - (*(here->BSIM4v5BPdpPtr) += m * (ggislg + ggisls + ggislb)); - (*(here->BSIM4v5BPgpPtr) -= m * ggislg); - (*(here->BSIM4v5BPspPtr) -= m * ggisls); - (*(here->BSIM4v5BPbpPtr) -= m * ggislb); - - - if (here->BSIM4v5rbodyMod) - { (*(here->BSIM4v5DPdbPtr) += m * (gcdbdb - here->BSIM4v5gbd)); - (*(here->BSIM4v5SPsbPtr) -= m * (here->BSIM4v5gbs - gcsbsb)); - - (*(here->BSIM4v5DBdpPtr) += m * (gcdbdb - here->BSIM4v5gbd)); - (*(here->BSIM4v5DBdbPtr) += m * (here->BSIM4v5gbd - gcdbdb - + here->BSIM4v5grbpd + here->BSIM4v5grbdb)); - (*(here->BSIM4v5DBbpPtr) -= m * here->BSIM4v5grbpd); - (*(here->BSIM4v5DBbPtr) -= m * here->BSIM4v5grbdb); - - (*(here->BSIM4v5BPdbPtr) -= m * here->BSIM4v5grbpd); - (*(here->BSIM4v5BPbPtr) -= m * here->BSIM4v5grbpb); - (*(here->BSIM4v5BPsbPtr) -= m * here->BSIM4v5grbps); - (*(here->BSIM4v5BPbpPtr) += m * (here->BSIM4v5grbpd + here->BSIM4v5grbps - + here->BSIM4v5grbpb)); - /* WDLiu: (gcbbb - here->BSIM4v5gbbs) already added to BPbpPtr */ - - (*(here->BSIM4v5SBspPtr) += m * (gcsbsb - here->BSIM4v5gbs)); - (*(here->BSIM4v5SBbpPtr) -= m * here->BSIM4v5grbps); - (*(here->BSIM4v5SBbPtr) -= m * here->BSIM4v5grbsb); - (*(here->BSIM4v5SBsbPtr) += m * (here->BSIM4v5gbs - gcsbsb - + here->BSIM4v5grbps + here->BSIM4v5grbsb)); - - (*(here->BSIM4v5BdbPtr) -= m * here->BSIM4v5grbdb); - (*(here->BSIM4v5BbpPtr) -= m * here->BSIM4v5grbpb); - (*(here->BSIM4v5BsbPtr) -= m * here->BSIM4v5grbsb); - (*(here->BSIM4v5BbPtr) += m * (here->BSIM4v5grbsb + here->BSIM4v5grbdb - + here->BSIM4v5grbpb)); - } - - if (here->BSIM4v5trnqsMod) - { (*(here->BSIM4v5QqPtr) += m * (gqdef + here->BSIM4v5gtau)); - (*(here->BSIM4v5QgpPtr) += m * (ggtg - gcqgb)); - (*(here->BSIM4v5QdpPtr) += m * (ggtd - gcqdb)); - (*(here->BSIM4v5QspPtr) += m * (ggts - gcqsb)); - (*(here->BSIM4v5QbpPtr) += m * (ggtb - gcqbb)); - - (*(here->BSIM4v5DPqPtr) += m * dxpart * here->BSIM4v5gtau); - (*(here->BSIM4v5SPqPtr) += m * sxpart * here->BSIM4v5gtau); - (*(here->BSIM4v5GPqPtr) -= m * here->BSIM4v5gtau); - } -#endif - -line1000: ; - -#ifndef USE_OMP - } /* End of MOSFET Instance */ -} /* End of Model Instance */ -#endif - -return(OK); -} - - -#ifdef USE_OMP -void BSIM4v5LoadRhsMat(GENmodel *inModel, CKTcircuit *ckt) -{ - int InstCount, idx; - BSIM4v5instance **InstArray; - BSIM4v5instance *here; - BSIM4v5model *model = (BSIM4v5model*)inModel; - - InstArray = model->BSIM4v5InstanceArray; - InstCount = model->BSIM4v5InstCount; - - for(idx = 0; idx < InstCount; idx++) { - here = InstArray[idx]; - model = BSIM4v5modPtr(here); - /* Update b for Ax = b */ - (*(ckt->CKTrhs + here->BSIM4v5dNodePrime) += here->BSIM4v5rhsdPrime); - (*(ckt->CKTrhs + here->BSIM4v5gNodePrime) -= here->BSIM4v5rhsgPrime); - - if (here->BSIM4v5rgateMod == 2) - (*(ckt->CKTrhs + here->BSIM4v5gNodeExt) -= here->BSIM4v5rhsgExt); - else if (here->BSIM4v5rgateMod == 3) - (*(ckt->CKTrhs + here->BSIM4v5gNodeMid) -= here->BSIM4v5grhsMid); - - if (!here->BSIM4v5rbodyMod) - { (*(ckt->CKTrhs + here->BSIM4v5bNodePrime) += here->BSIM4v5rhsbPrime); - (*(ckt->CKTrhs + here->BSIM4v5sNodePrime) += here->BSIM4v5rhssPrime); - } - else - { (*(ckt->CKTrhs + here->BSIM4v5dbNode) -= here->BSIM4v5rhsdb); - (*(ckt->CKTrhs + here->BSIM4v5bNodePrime) += here->BSIM4v5rhsbPrime); - (*(ckt->CKTrhs + here->BSIM4v5sbNode) -= here->BSIM4v5rhssb); - (*(ckt->CKTrhs + here->BSIM4v5sNodePrime) += here->BSIM4v5rhssPrime); - } - - if (model->BSIM4v5rdsMod) - { (*(ckt->CKTrhs + here->BSIM4v5dNode) -= here->BSIM4v5rhsd); - (*(ckt->CKTrhs + here->BSIM4v5sNode) += here->BSIM4v5rhss); - } - - if (here->BSIM4v5trnqsMod) - *(ckt->CKTrhs + here->BSIM4v5qNode) += here->BSIM4v5rhsq; - - - /* Update A for Ax = b */ - if (here->BSIM4v5rgateMod == 1) - { (*(here->BSIM4v5GEgePtr) += here->BSIM4v5_1); - (*(here->BSIM4v5GPgePtr) -= here->BSIM4v5_2); - (*(here->BSIM4v5GEgpPtr) -= here->BSIM4v5_3); - (*(here->BSIM4v5GPgpPtr) += here->BSIM4v5_4); - (*(here->BSIM4v5GPdpPtr) += here->BSIM4v5_5); - (*(here->BSIM4v5GPspPtr) += here->BSIM4v5_6); - (*(here->BSIM4v5GPbpPtr) += here->BSIM4v5_7); - } - else if (here->BSIM4v5rgateMod == 2) - { (*(here->BSIM4v5GEgePtr) += here->BSIM4v5_8); - (*(here->BSIM4v5GEgpPtr) += here->BSIM4v5_9); - (*(here->BSIM4v5GEdpPtr) += here->BSIM4v5_10); - (*(here->BSIM4v5GEspPtr) += here->BSIM4v5_11); - (*(here->BSIM4v5GEbpPtr) += here->BSIM4v5_12); - - (*(here->BSIM4v5GPgePtr) -= here->BSIM4v5_13); - (*(here->BSIM4v5GPgpPtr) += here->BSIM4v5_14); - (*(here->BSIM4v5GPdpPtr) += here->BSIM4v5_15); - (*(here->BSIM4v5GPspPtr) += here->BSIM4v5_16); - (*(here->BSIM4v5GPbpPtr) += here->BSIM4v5_17); - } - else if (here->BSIM4v5rgateMod == 3) - { (*(here->BSIM4v5GEgePtr) += here->BSIM4v5_18); - (*(here->BSIM4v5GEgmPtr) -= here->BSIM4v5_19); - (*(here->BSIM4v5GMgePtr) -= here->BSIM4v5_20); - (*(here->BSIM4v5GMgmPtr) += here->BSIM4v5_21); - - (*(here->BSIM4v5GMdpPtr) += here->BSIM4v5_22); - (*(here->BSIM4v5GMgpPtr) += here->BSIM4v5_23); - (*(here->BSIM4v5GMspPtr) += here->BSIM4v5_24); - (*(here->BSIM4v5GMbpPtr) += here->BSIM4v5_25); - - (*(here->BSIM4v5DPgmPtr) += here->BSIM4v5_26); - (*(here->BSIM4v5GPgmPtr) -= here->BSIM4v5_27); - (*(here->BSIM4v5SPgmPtr) += here->BSIM4v5_28); - (*(here->BSIM4v5BPgmPtr) += here->BSIM4v5_29); - - (*(here->BSIM4v5GPgpPtr) += here->BSIM4v5_30); - (*(here->BSIM4v5GPdpPtr) += here->BSIM4v5_31); - (*(here->BSIM4v5GPspPtr) += here->BSIM4v5_32); - (*(here->BSIM4v5GPbpPtr) += here->BSIM4v5_33); - } - - - else - { (*(here->BSIM4v5GPgpPtr) += here->BSIM4v5_34); - (*(here->BSIM4v5GPdpPtr) += here->BSIM4v5_35); - (*(here->BSIM4v5GPspPtr) += here->BSIM4v5_36); - (*(here->BSIM4v5GPbpPtr) += here->BSIM4v5_37); - } - - - if (model->BSIM4v5rdsMod) - { (*(here->BSIM4v5DgpPtr) += here->BSIM4v5_38); - (*(here->BSIM4v5DspPtr) += here->BSIM4v5_39); - (*(here->BSIM4v5DbpPtr) += here->BSIM4v5_40); - (*(here->BSIM4v5SdpPtr) += here->BSIM4v5_41); - (*(here->BSIM4v5SgpPtr) += here->BSIM4v5_42); - (*(here->BSIM4v5SbpPtr) += here->BSIM4v5_43); - } - - (*(here->BSIM4v5DPdpPtr) += here->BSIM4v5_44); - (*(here->BSIM4v5DPdPtr) -= here->BSIM4v5_45); - (*(here->BSIM4v5DPgpPtr) += here->BSIM4v5_46); - (*(here->BSIM4v5DPspPtr) -= here->BSIM4v5_47); - (*(here->BSIM4v5DPbpPtr) -= here->BSIM4v5_48); - - (*(here->BSIM4v5DdpPtr) -= here->BSIM4v5_49); - (*(here->BSIM4v5DdPtr) += here->BSIM4v5_50); - - (*(here->BSIM4v5SPdpPtr) -= here->BSIM4v5_51); - (*(here->BSIM4v5SPgpPtr) += here->BSIM4v5_52); - (*(here->BSIM4v5SPspPtr) += here->BSIM4v5_53); - (*(here->BSIM4v5SPsPtr) -= here->BSIM4v5_54); - (*(here->BSIM4v5SPbpPtr) -= here->BSIM4v5_55); - - (*(here->BSIM4v5SspPtr) -= here->BSIM4v5_56); - (*(here->BSIM4v5SsPtr) += here->BSIM4v5_57); - - (*(here->BSIM4v5BPdpPtr) += here->BSIM4v5_58); - (*(here->BSIM4v5BPgpPtr) += here->BSIM4v5_59); - (*(here->BSIM4v5BPspPtr) += here->BSIM4v5_60); - (*(here->BSIM4v5BPbpPtr) += here->BSIM4v5_61); - - /* stamp gidl */ - (*(here->BSIM4v5DPdpPtr) += here->BSIM4v5_62); - (*(here->BSIM4v5DPgpPtr) += here->BSIM4v5_63); - (*(here->BSIM4v5DPspPtr) -= here->BSIM4v5_64); - (*(here->BSIM4v5DPbpPtr) += here->BSIM4v5_65); - (*(here->BSIM4v5BPdpPtr) -= here->BSIM4v5_66); - (*(here->BSIM4v5BPgpPtr) -= here->BSIM4v5_67); - (*(here->BSIM4v5BPspPtr) += here->BSIM4v5_68); - (*(here->BSIM4v5BPbpPtr) -= here->BSIM4v5_69); - /* stamp gisl */ - (*(here->BSIM4v5SPdpPtr) -= here->BSIM4v5_70); - (*(here->BSIM4v5SPgpPtr) += here->BSIM4v5_71); - (*(here->BSIM4v5SPspPtr) += here->BSIM4v5_72); - (*(here->BSIM4v5SPbpPtr) += here->BSIM4v5_73); - (*(here->BSIM4v5BPdpPtr) += here->BSIM4v5_74); - (*(here->BSIM4v5BPgpPtr) -= here->BSIM4v5_75); - (*(here->BSIM4v5BPspPtr) -= here->BSIM4v5_76); - (*(here->BSIM4v5BPbpPtr) -= here->BSIM4v5_77); - - - if (here->BSIM4v5rbodyMod) - { (*(here->BSIM4v5DPdbPtr) += here->BSIM4v5_78); - (*(here->BSIM4v5SPsbPtr) -= here->BSIM4v5_79); - - (*(here->BSIM4v5DBdpPtr) += here->BSIM4v5_80); - (*(here->BSIM4v5DBdbPtr) += here->BSIM4v5_81); - (*(here->BSIM4v5DBbpPtr) -= here->BSIM4v5_82); - (*(here->BSIM4v5DBbPtr) -= here->BSIM4v5_83); - - (*(here->BSIM4v5BPdbPtr) -= here->BSIM4v5_84); - (*(here->BSIM4v5BPbPtr) -= here->BSIM4v5_85); - (*(here->BSIM4v5BPsbPtr) -= here->BSIM4v5_86); - (*(here->BSIM4v5BPbpPtr) += here->BSIM4v5_87); - - (*(here->BSIM4v5SBspPtr) += here->BSIM4v5_88); - (*(here->BSIM4v5SBbpPtr) -= here->BSIM4v5_89); - (*(here->BSIM4v5SBbPtr) -= here->BSIM4v5_90); - (*(here->BSIM4v5SBsbPtr) += here->BSIM4v5_91); - - (*(here->BSIM4v5BdbPtr) -= here->BSIM4v5_92); - (*(here->BSIM4v5BbpPtr) -= here->BSIM4v5_93); - (*(here->BSIM4v5BsbPtr) -= here->BSIM4v5_94); - (*(here->BSIM4v5BbPtr) += here->BSIM4v5_95); - } - - if (here->BSIM4v5trnqsMod) - { (*(here->BSIM4v5QqPtr) += here->BSIM4v5_96); - (*(here->BSIM4v5QgpPtr) += here->BSIM4v5_97); - (*(here->BSIM4v5QdpPtr) += here->BSIM4v5_98); - (*(here->BSIM4v5QspPtr) += here->BSIM4v5_99); - (*(here->BSIM4v5QbpPtr) += here->BSIM4v5_100); - - (*(here->BSIM4v5DPqPtr) += here->BSIM4v5_101); - (*(here->BSIM4v5SPqPtr) += here->BSIM4v5_102); - (*(here->BSIM4v5GPqPtr) -= here->BSIM4v5_103); - } - } -} - -#endif - - -/* function to compute poly depletion effect */ -int BSIM4v5polyDepletion( - double phi, - double ngate, - double coxe, - double Vgs, - double *Vgs_eff, - double *dVgs_eff_dVg) -{ - double T1, T2, T3, T4, T5, T6, T7, T8; - - /* Poly Gate Si Depletion Effect */ - if ((ngate > 1.0e18) && - (ngate < 1.0e25) && (Vgs > phi)) { - T1 = 1.0e6 * CHARGE * EPSSI * ngate / (coxe * coxe); - T8 = Vgs - phi; - T4 = sqrt(1.0 + 2.0 * T8 / T1); - T2 = 2.0 * T8 / (T4 + 1.0); - T3 = 0.5 * T2 * T2 / T1; /* T3 = Vpoly */ - T7 = 1.12 - T3 - 0.05; - T6 = sqrt(T7 * T7 + 0.224); - T5 = 1.12 - 0.5 * (T7 + T6); - *Vgs_eff = Vgs - T5; - *dVgs_eff_dVg = 1.0 - (0.5 - 0.5 / T4) * (1.0 + T7 / T6); - } - else { - *Vgs_eff = Vgs; - *dVgs_eff_dVg = 1.0; - } - return(0); -} diff --git a/src/spicelib/devices/bsim4v5/b4v5mask.c b/src/spicelib/devices/bsim4v5/b4v5mask.c deleted file mode 100644 index 421bee27a..000000000 --- a/src/spicelib/devices/bsim4v5/b4v5mask.c +++ /dev/null @@ -1,2298 +0,0 @@ -/**** BSIM4.5.0 Released by Xuemei (Jane) Xi 07/29/2005 ****/ - -/********** - * Copyright 2005 Regents of the University of California. All rights reserved. - * File: b4mask.c of BSIM4.5.0. - * Author: 2000 Weidong Liu - * Authors: 2001- Xuemei Xi, Mohan Dunga, Ali Niknejad, Chenming Hu. - * Project Director: Prof. Chenming Hu. - * Modified by Xuemei Xi, 04/06/2001. - * Modified by Xuemei Xi, 10/05/2001. - * Modified by Xuemei Xi, 11/15/2002. - * Modified by Xuemei Xi, 05/09/2003. - * Modified by Xuemei Xi, Mohan Dunga, 07/29/2005. - **********/ - - -#include "ngspice/ngspice.h" -#include "ngspice/ifsim.h" -#include "ngspice/cktdefs.h" -#include "ngspice/devdefs.h" -#include "bsim4v5def.h" -#include "ngspice/sperror.h" -#include "ngspice/suffix.h" - -int -BSIM4v5mAsk( -CKTcircuit *ckt, -GENmodel *inst, -int which, -IFvalue *value) -{ - BSIM4v5model *model = (BSIM4v5model *)inst; - - NG_IGNORE(ckt); - - switch(which) - { case BSIM4v5_MOD_MOBMOD : - value->iValue = model->BSIM4v5mobMod; - return(OK); - case BSIM4v5_MOD_PARAMCHK : - value->iValue = model->BSIM4v5paramChk; - return(OK); - case BSIM4v5_MOD_BINUNIT : - value->iValue = model->BSIM4v5binUnit; - return(OK); - case BSIM4v5_MOD_CAPMOD : - value->iValue = model->BSIM4v5capMod; - return(OK); - case BSIM4v5_MOD_DIOMOD : - value->iValue = model->BSIM4v5dioMod; - return(OK); - case BSIM4v5_MOD_TRNQSMOD : - value->iValue = model->BSIM4v5trnqsMod; - return(OK); - case BSIM4v5_MOD_ACNQSMOD : - value->iValue = model->BSIM4v5acnqsMod; - return(OK); - case BSIM4v5_MOD_FNOIMOD : - value->iValue = model->BSIM4v5fnoiMod; - return(OK); - case BSIM4v5_MOD_TNOIMOD : - value->iValue = model->BSIM4v5tnoiMod; - return(OK); - case BSIM4v5_MOD_RDSMOD : - value->iValue = model->BSIM4v5rdsMod; - return(OK); - case BSIM4v5_MOD_RBODYMOD : - value->iValue = model->BSIM4v5rbodyMod; - return(OK); - case BSIM4v5_MOD_RGATEMOD : - value->iValue = model->BSIM4v5rgateMod; - return(OK); - case BSIM4v5_MOD_PERMOD : - value->iValue = model->BSIM4v5perMod; - return(OK); - case BSIM4v5_MOD_GEOMOD : - value->iValue = model->BSIM4v5geoMod; - return(OK); - case BSIM4v5_MOD_RGEOMOD : - value->iValue = model->BSIM4v5rgeoMod; - return(OK); - case BSIM4v5_MOD_IGCMOD : - value->iValue = model->BSIM4v5igcMod; - return(OK); - case BSIM4v5_MOD_IGBMOD : - value->iValue = model->BSIM4v5igbMod; - return(OK); - case BSIM4v5_MOD_TEMPMOD : - value->iValue = model->BSIM4v5tempMod; - return(OK); - - case BSIM4v5_MOD_VERSION : - value->sValue = model->BSIM4v5version; - return(OK); - case BSIM4v5_MOD_TOXREF : - value->rValue = model->BSIM4v5toxref; - return(OK); - case BSIM4v5_MOD_TOXE : - value->rValue = model->BSIM4v5toxe; - return(OK); - case BSIM4v5_MOD_TOXP : - value->rValue = model->BSIM4v5toxp; - return(OK); - case BSIM4v5_MOD_TOXM : - value->rValue = model->BSIM4v5toxm; - return(OK); - case BSIM4v5_MOD_DTOX : - value->rValue = model->BSIM4v5dtox; - return(OK); - case BSIM4v5_MOD_EPSROX : - value->rValue = model->BSIM4v5epsrox; - return(OK); - case BSIM4v5_MOD_CDSC : - value->rValue = model->BSIM4v5cdsc; - return(OK); - case BSIM4v5_MOD_CDSCB : - value->rValue = model->BSIM4v5cdscb; - return(OK); - - case BSIM4v5_MOD_CDSCD : - value->rValue = model->BSIM4v5cdscd; - return(OK); - - case BSIM4v5_MOD_CIT : - value->rValue = model->BSIM4v5cit; - return(OK); - case BSIM4v5_MOD_NFACTOR : - value->rValue = model->BSIM4v5nfactor; - return(OK); - case BSIM4v5_MOD_XJ: - value->rValue = model->BSIM4v5xj; - return(OK); - case BSIM4v5_MOD_VSAT: - value->rValue = model->BSIM4v5vsat; - return(OK); - case BSIM4v5_MOD_VTL: - value->rValue = model->BSIM4v5vtl; - return(OK); - case BSIM4v5_MOD_XN: - value->rValue = model->BSIM4v5xn; - return(OK); - case BSIM4v5_MOD_LC: - value->rValue = model->BSIM4v5lc; - return(OK); - case BSIM4v5_MOD_LAMBDA: - value->rValue = model->BSIM4v5lambda; - return(OK); - case BSIM4v5_MOD_AT: - value->rValue = model->BSIM4v5at; - return(OK); - case BSIM4v5_MOD_A0: - value->rValue = model->BSIM4v5a0; - return(OK); - - case BSIM4v5_MOD_AGS: - value->rValue = model->BSIM4v5ags; - return(OK); - - case BSIM4v5_MOD_A1: - value->rValue = model->BSIM4v5a1; - return(OK); - case BSIM4v5_MOD_A2: - value->rValue = model->BSIM4v5a2; - return(OK); - case BSIM4v5_MOD_KETA: - value->rValue = model->BSIM4v5keta; - return(OK); - case BSIM4v5_MOD_NSUB: - value->rValue = model->BSIM4v5nsub; - return(OK); - case BSIM4v5_MOD_NDEP: - value->rValue = model->BSIM4v5ndep; - return(OK); - case BSIM4v5_MOD_NSD: - value->rValue = model->BSIM4v5nsd; - return(OK); - case BSIM4v5_MOD_NGATE: - value->rValue = model->BSIM4v5ngate; - return(OK); - case BSIM4v5_MOD_GAMMA1: - value->rValue = model->BSIM4v5gamma1; - return(OK); - case BSIM4v5_MOD_GAMMA2: - value->rValue = model->BSIM4v5gamma2; - return(OK); - case BSIM4v5_MOD_VBX: - value->rValue = model->BSIM4v5vbx; - return(OK); - case BSIM4v5_MOD_VBM: - value->rValue = model->BSIM4v5vbm; - return(OK); - case BSIM4v5_MOD_XT: - value->rValue = model->BSIM4v5xt; - return(OK); - case BSIM4v5_MOD_K1: - value->rValue = model->BSIM4v5k1; - return(OK); - case BSIM4v5_MOD_KT1: - value->rValue = model->BSIM4v5kt1; - return(OK); - case BSIM4v5_MOD_KT1L: - value->rValue = model->BSIM4v5kt1l; - return(OK); - case BSIM4v5_MOD_KT2 : - value->rValue = model->BSIM4v5kt2; - return(OK); - case BSIM4v5_MOD_K2 : - value->rValue = model->BSIM4v5k2; - return(OK); - case BSIM4v5_MOD_K3: - value->rValue = model->BSIM4v5k3; - return(OK); - case BSIM4v5_MOD_K3B: - value->rValue = model->BSIM4v5k3b; - return(OK); - case BSIM4v5_MOD_W0: - value->rValue = model->BSIM4v5w0; - return(OK); - case BSIM4v5_MOD_LPE0: - value->rValue = model->BSIM4v5lpe0; - return(OK); - case BSIM4v5_MOD_LPEB: - value->rValue = model->BSIM4v5lpeb; - return(OK); - case BSIM4v5_MOD_DVTP0: - value->rValue = model->BSIM4v5dvtp0; - return(OK); - case BSIM4v5_MOD_DVTP1: - value->rValue = model->BSIM4v5dvtp1; - return(OK); - case BSIM4v5_MOD_DVT0 : - value->rValue = model->BSIM4v5dvt0; - return(OK); - case BSIM4v5_MOD_DVT1 : - value->rValue = model->BSIM4v5dvt1; - return(OK); - case BSIM4v5_MOD_DVT2 : - value->rValue = model->BSIM4v5dvt2; - return(OK); - case BSIM4v5_MOD_DVT0W : - value->rValue = model->BSIM4v5dvt0w; - return(OK); - case BSIM4v5_MOD_DVT1W : - value->rValue = model->BSIM4v5dvt1w; - return(OK); - case BSIM4v5_MOD_DVT2W : - value->rValue = model->BSIM4v5dvt2w; - return(OK); - case BSIM4v5_MOD_DROUT : - value->rValue = model->BSIM4v5drout; - return(OK); - case BSIM4v5_MOD_DSUB : - value->rValue = model->BSIM4v5dsub; - return(OK); - case BSIM4v5_MOD_VTH0: - value->rValue = model->BSIM4v5vth0; - return(OK); - case BSIM4v5_MOD_EU: - value->rValue = model->BSIM4v5eu; - return(OK); - case BSIM4v5_MOD_UA: - value->rValue = model->BSIM4v5ua; - return(OK); - case BSIM4v5_MOD_UA1: - value->rValue = model->BSIM4v5ua1; - return(OK); - case BSIM4v5_MOD_UB: - value->rValue = model->BSIM4v5ub; - return(OK); - case BSIM4v5_MOD_UB1: - value->rValue = model->BSIM4v5ub1; - return(OK); - case BSIM4v5_MOD_UC: - value->rValue = model->BSIM4v5uc; - return(OK); - case BSIM4v5_MOD_UC1: - value->rValue = model->BSIM4v5uc1; - return(OK); - case BSIM4v5_MOD_UD: - value->rValue = model->BSIM4v5ud; - return(OK); - case BSIM4v5_MOD_UD1: - value->rValue = model->BSIM4v5ud1; - return(OK); - case BSIM4v5_MOD_UP: - value->rValue = model->BSIM4v5up; - return(OK); - case BSIM4v5_MOD_LP: - value->rValue = model->BSIM4v5lp; - return(OK); - case BSIM4v5_MOD_U0: - value->rValue = model->BSIM4v5u0; - return(OK); - case BSIM4v5_MOD_UTE: - value->rValue = model->BSIM4v5ute; - return(OK); - case BSIM4v5_MOD_VOFF: - value->rValue = model->BSIM4v5voff; - return(OK); - case BSIM4v5_MOD_TVOFF: - value->rValue = model->BSIM4v5tvoff; - return(OK); - case BSIM4v5_MOD_VFBSDOFF: - value->rValue = model->BSIM4v5vfbsdoff; - return(OK); - case BSIM4v5_MOD_TVFBSDOFF: - value->rValue = model->BSIM4v5tvfbsdoff; - return(OK); - case BSIM4v5_MOD_VOFFL: - value->rValue = model->BSIM4v5voffl; - return(OK); - case BSIM4v5_MOD_MINV: - value->rValue = model->BSIM4v5minv; - return(OK); - case BSIM4v5_MOD_FPROUT: - value->rValue = model->BSIM4v5fprout; - return(OK); - case BSIM4v5_MOD_PDITS: - value->rValue = model->BSIM4v5pdits; - return(OK); - case BSIM4v5_MOD_PDITSD: - value->rValue = model->BSIM4v5pditsd; - return(OK); - case BSIM4v5_MOD_PDITSL: - value->rValue = model->BSIM4v5pditsl; - return(OK); - case BSIM4v5_MOD_DELTA: - value->rValue = model->BSIM4v5delta; - return(OK); - case BSIM4v5_MOD_RDSW: - value->rValue = model->BSIM4v5rdsw; - return(OK); - case BSIM4v5_MOD_RDSWMIN: - value->rValue = model->BSIM4v5rdswmin; - return(OK); - case BSIM4v5_MOD_RDWMIN: - value->rValue = model->BSIM4v5rdwmin; - return(OK); - case BSIM4v5_MOD_RSWMIN: - value->rValue = model->BSIM4v5rswmin; - return(OK); - case BSIM4v5_MOD_RDW: - value->rValue = model->BSIM4v5rdw; - return(OK); - case BSIM4v5_MOD_RSW: - value->rValue = model->BSIM4v5rsw; - return(OK); - case BSIM4v5_MOD_PRWG: - value->rValue = model->BSIM4v5prwg; - return(OK); - case BSIM4v5_MOD_PRWB: - value->rValue = model->BSIM4v5prwb; - return(OK); - case BSIM4v5_MOD_PRT: - value->rValue = model->BSIM4v5prt; - return(OK); - case BSIM4v5_MOD_ETA0: - value->rValue = model->BSIM4v5eta0; - return(OK); - case BSIM4v5_MOD_ETAB: - value->rValue = model->BSIM4v5etab; - return(OK); - case BSIM4v5_MOD_PCLM: - value->rValue = model->BSIM4v5pclm; - return(OK); - case BSIM4v5_MOD_PDIBL1: - value->rValue = model->BSIM4v5pdibl1; - return(OK); - case BSIM4v5_MOD_PDIBL2: - value->rValue = model->BSIM4v5pdibl2; - return(OK); - case BSIM4v5_MOD_PDIBLB: - value->rValue = model->BSIM4v5pdiblb; - return(OK); - case BSIM4v5_MOD_PSCBE1: - value->rValue = model->BSIM4v5pscbe1; - return(OK); - case BSIM4v5_MOD_PSCBE2: - value->rValue = model->BSIM4v5pscbe2; - return(OK); - case BSIM4v5_MOD_PVAG: - value->rValue = model->BSIM4v5pvag; - return(OK); - case BSIM4v5_MOD_WR: - value->rValue = model->BSIM4v5wr; - return(OK); - case BSIM4v5_MOD_DWG: - value->rValue = model->BSIM4v5dwg; - return(OK); - case BSIM4v5_MOD_DWB: - value->rValue = model->BSIM4v5dwb; - return(OK); - case BSIM4v5_MOD_B0: - value->rValue = model->BSIM4v5b0; - return(OK); - case BSIM4v5_MOD_B1: - value->rValue = model->BSIM4v5b1; - return(OK); - case BSIM4v5_MOD_ALPHA0: - value->rValue = model->BSIM4v5alpha0; - return(OK); - case BSIM4v5_MOD_ALPHA1: - value->rValue = model->BSIM4v5alpha1; - return(OK); - case BSIM4v5_MOD_BETA0: - value->rValue = model->BSIM4v5beta0; - return(OK); - case BSIM4v5_MOD_AGIDL: - value->rValue = model->BSIM4v5agidl; - return(OK); - case BSIM4v5_MOD_BGIDL: - value->rValue = model->BSIM4v5bgidl; - return(OK); - case BSIM4v5_MOD_CGIDL: - value->rValue = model->BSIM4v5cgidl; - return(OK); - case BSIM4v5_MOD_EGIDL: - value->rValue = model->BSIM4v5egidl; - return(OK); - case BSIM4v5_MOD_AIGC: - value->rValue = model->BSIM4v5aigc; - return(OK); - case BSIM4v5_MOD_BIGC: - value->rValue = model->BSIM4v5bigc; - return(OK); - case BSIM4v5_MOD_CIGC: - value->rValue = model->BSIM4v5cigc; - return(OK); - case BSIM4v5_MOD_AIGSD: - value->rValue = model->BSIM4v5aigsd; - return(OK); - case BSIM4v5_MOD_BIGSD: - value->rValue = model->BSIM4v5bigsd; - return(OK); - case BSIM4v5_MOD_CIGSD: - value->rValue = model->BSIM4v5cigsd; - return(OK); - case BSIM4v5_MOD_AIGBACC: - value->rValue = model->BSIM4v5aigbacc; - return(OK); - case BSIM4v5_MOD_BIGBACC: - value->rValue = model->BSIM4v5bigbacc; - return(OK); - case BSIM4v5_MOD_CIGBACC: - value->rValue = model->BSIM4v5cigbacc; - return(OK); - case BSIM4v5_MOD_AIGBINV: - value->rValue = model->BSIM4v5aigbinv; - return(OK); - case BSIM4v5_MOD_BIGBINV: - value->rValue = model->BSIM4v5bigbinv; - return(OK); - case BSIM4v5_MOD_CIGBINV: - value->rValue = model->BSIM4v5cigbinv; - return(OK); - case BSIM4v5_MOD_NIGC: - value->rValue = model->BSIM4v5nigc; - return(OK); - case BSIM4v5_MOD_NIGBACC: - value->rValue = model->BSIM4v5nigbacc; - return(OK); - case BSIM4v5_MOD_NIGBINV: - value->rValue = model->BSIM4v5nigbinv; - return(OK); - case BSIM4v5_MOD_NTOX: - value->rValue = model->BSIM4v5ntox; - return(OK); - case BSIM4v5_MOD_EIGBINV: - value->rValue = model->BSIM4v5eigbinv; - return(OK); - case BSIM4v5_MOD_PIGCD: - value->rValue = model->BSIM4v5pigcd; - return(OK); - case BSIM4v5_MOD_POXEDGE: - value->rValue = model->BSIM4v5poxedge; - return(OK); - case BSIM4v5_MOD_PHIN: - value->rValue = model->BSIM4v5phin; - return(OK); - case BSIM4v5_MOD_XRCRG1: - value->rValue = model->BSIM4v5xrcrg1; - return(OK); - case BSIM4v5_MOD_XRCRG2: - value->rValue = model->BSIM4v5xrcrg2; - return(OK); - case BSIM4v5_MOD_TNOIA: - value->rValue = model->BSIM4v5tnoia; - return(OK); - case BSIM4v5_MOD_TNOIB: - value->rValue = model->BSIM4v5tnoib; - return(OK); - case BSIM4v5_MOD_RNOIA: - value->rValue = model->BSIM4v5rnoia; - return(OK); - case BSIM4v5_MOD_RNOIB: - value->rValue = model->BSIM4v5rnoib; - return(OK); - case BSIM4v5_MOD_NTNOI: - value->rValue = model->BSIM4v5ntnoi; - return(OK); - case BSIM4v5_MOD_IJTHDFWD: - value->rValue = model->BSIM4v5ijthdfwd; - return(OK); - case BSIM4v5_MOD_IJTHSFWD: - value->rValue = model->BSIM4v5ijthsfwd; - return(OK); - case BSIM4v5_MOD_IJTHDREV: - value->rValue = model->BSIM4v5ijthdrev; - return(OK); - case BSIM4v5_MOD_IJTHSREV: - value->rValue = model->BSIM4v5ijthsrev; - return(OK); - case BSIM4v5_MOD_XJBVD: - value->rValue = model->BSIM4v5xjbvd; - return(OK); - case BSIM4v5_MOD_XJBVS: - value->rValue = model->BSIM4v5xjbvs; - return(OK); - case BSIM4v5_MOD_BVD: - value->rValue = model->BSIM4v5bvd; - return(OK); - case BSIM4v5_MOD_BVS: - value->rValue = model->BSIM4v5bvs; - return(OK); - case BSIM4v5_MOD_VFB: - value->rValue = model->BSIM4v5vfb; - return(OK); - - case BSIM4v5_MOD_JTSS: - value->rValue = model->BSIM4v5jtss; - return(OK); - case BSIM4v5_MOD_JTSD: - value->rValue = model->BSIM4v5jtsd; - return(OK); - case BSIM4v5_MOD_JTSSWS: - value->rValue = model->BSIM4v5jtssws; - return(OK); - case BSIM4v5_MOD_JTSSWD: - value->rValue = model->BSIM4v5jtsswd; - return(OK); - case BSIM4v5_MOD_JTSSWGS: - value->rValue = model->BSIM4v5jtsswgs; - return(OK); - case BSIM4v5_MOD_JTSSWGD: - value->rValue = model->BSIM4v5jtsswgd; - return(OK); - case BSIM4v5_MOD_NJTS: - value->rValue = model->BSIM4v5njts; - return(OK); - case BSIM4v5_MOD_NJTSSW: - value->rValue = model->BSIM4v5njtssw; - return(OK); - case BSIM4v5_MOD_NJTSSWG: - value->rValue = model->BSIM4v5njtsswg; - return(OK); - case BSIM4v5_MOD_XTSS: - value->rValue = model->BSIM4v5xtss; - return(OK); - case BSIM4v5_MOD_XTSD: - value->rValue = model->BSIM4v5xtsd; - return(OK); - case BSIM4v5_MOD_XTSSWS: - value->rValue = model->BSIM4v5xtssws; - return(OK); - case BSIM4v5_MOD_XTSSWD: - value->rValue = model->BSIM4v5xtsswd; - return(OK); - case BSIM4v5_MOD_XTSSWGS: - value->rValue = model->BSIM4v5xtsswgs; - return(OK); - case BSIM4v5_MOD_XTSSWGD: - value->rValue = model->BSIM4v5xtsswgd; - return(OK); - case BSIM4v5_MOD_TNJTS: - value->rValue = model->BSIM4v5tnjts; - return(OK); - case BSIM4v5_MOD_TNJTSSW: - value->rValue = model->BSIM4v5tnjtssw; - return(OK); - case BSIM4v5_MOD_TNJTSSWG: - value->rValue = model->BSIM4v5tnjtsswg; - return(OK); - case BSIM4v5_MOD_VTSS: - value->rValue = model->BSIM4v5vtss; - return(OK); - case BSIM4v5_MOD_VTSD: - value->rValue = model->BSIM4v5vtsd; - return(OK); - case BSIM4v5_MOD_VTSSWS: - value->rValue = model->BSIM4v5vtssws; - return(OK); - case BSIM4v5_MOD_VTSSWD: - value->rValue = model->BSIM4v5vtsswd; - return(OK); - case BSIM4v5_MOD_VTSSWGS: - value->rValue = model->BSIM4v5vtsswgs; - return(OK); - case BSIM4v5_MOD_VTSSWGD: - value->rValue = model->BSIM4v5vtsswgd; - return(OK); - - case BSIM4v5_MOD_GBMIN: - value->rValue = model->BSIM4v5gbmin; - return(OK); - case BSIM4v5_MOD_RBDB: - value->rValue = model->BSIM4v5rbdb; - return(OK); - case BSIM4v5_MOD_RBPB: - value->rValue = model->BSIM4v5rbpb; - return(OK); - case BSIM4v5_MOD_RBSB: - value->rValue = model->BSIM4v5rbsb; - return(OK); - case BSIM4v5_MOD_RBPS: - value->rValue = model->BSIM4v5rbps; - return(OK); - case BSIM4v5_MOD_RBPD: - value->rValue = model->BSIM4v5rbpd; - return(OK); - - case BSIM4v5_MOD_RBPS0: - value->rValue = model->BSIM4v5rbps0; - return(OK); - case BSIM4v5_MOD_RBPSL: - value->rValue = model->BSIM4v5rbpsl; - return(OK); - case BSIM4v5_MOD_RBPSW: - value->rValue = model->BSIM4v5rbpsw; - return(OK); - case BSIM4v5_MOD_RBPSNF: - value->rValue = model->BSIM4v5rbpsnf; - return(OK); - case BSIM4v5_MOD_RBPD0: - value->rValue = model->BSIM4v5rbpd0; - return(OK); - case BSIM4v5_MOD_RBPDL: - value->rValue = model->BSIM4v5rbpdl; - return(OK); - case BSIM4v5_MOD_RBPDW: - value->rValue = model->BSIM4v5rbpdw; - return(OK); - case BSIM4v5_MOD_RBPDNF: - value->rValue = model->BSIM4v5rbpdnf; - return(OK); - case BSIM4v5_MOD_RBPBX0: - value->rValue = model->BSIM4v5rbpbx0; - return(OK); - case BSIM4v5_MOD_RBPBXL: - value->rValue = model->BSIM4v5rbpbxl; - return(OK); - case BSIM4v5_MOD_RBPBXW: - value->rValue = model->BSIM4v5rbpbxw; - return(OK); - case BSIM4v5_MOD_RBPBXNF: - value->rValue = model->BSIM4v5rbpbxnf; - return(OK); - case BSIM4v5_MOD_RBPBY0: - value->rValue = model->BSIM4v5rbpby0; - return(OK); - case BSIM4v5_MOD_RBPBYL: - value->rValue = model->BSIM4v5rbpbyl; - return(OK); - case BSIM4v5_MOD_RBPBYW: - value->rValue = model->BSIM4v5rbpbyw; - return(OK); - case BSIM4v5_MOD_RBPBYNF: - value->rValue = model->BSIM4v5rbpbynf; - return(OK); - - case BSIM4v5_MOD_RBSBX0: - value->rValue = model->BSIM4v5rbsbx0; - return(OK); - case BSIM4v5_MOD_RBSBY0: - value->rValue = model->BSIM4v5rbsby0; - return(OK); - case BSIM4v5_MOD_RBDBX0: - value->rValue = model->BSIM4v5rbdbx0; - return(OK); - case BSIM4v5_MOD_RBDBY0: - value->rValue = model->BSIM4v5rbdby0; - return(OK); - case BSIM4v5_MOD_RBSDBXL: - value->rValue = model->BSIM4v5rbsdbxl; - return(OK); - case BSIM4v5_MOD_RBSDBXW: - value->rValue = model->BSIM4v5rbsdbxw; - return(OK); - case BSIM4v5_MOD_RBSDBXNF: - value->rValue = model->BSIM4v5rbsdbxnf; - return(OK); - case BSIM4v5_MOD_RBSDBYL: - value->rValue = model->BSIM4v5rbsdbyl; - return(OK); - case BSIM4v5_MOD_RBSDBYW: - value->rValue = model->BSIM4v5rbsdbyw; - return(OK); - case BSIM4v5_MOD_RBSDBYNF: - value->rValue = model->BSIM4v5rbsdbynf; - return(OK); - - - case BSIM4v5_MOD_CGSL: - value->rValue = model->BSIM4v5cgsl; - return(OK); - case BSIM4v5_MOD_CGDL: - value->rValue = model->BSIM4v5cgdl; - return(OK); - case BSIM4v5_MOD_CKAPPAS: - value->rValue = model->BSIM4v5ckappas; - return(OK); - case BSIM4v5_MOD_CKAPPAD: - value->rValue = model->BSIM4v5ckappad; - return(OK); - case BSIM4v5_MOD_CF: - value->rValue = model->BSIM4v5cf; - return(OK); - case BSIM4v5_MOD_CLC: - value->rValue = model->BSIM4v5clc; - return(OK); - case BSIM4v5_MOD_CLE: - value->rValue = model->BSIM4v5cle; - return(OK); - case BSIM4v5_MOD_DWC: - value->rValue = model->BSIM4v5dwc; - return(OK); - case BSIM4v5_MOD_DLC: - value->rValue = model->BSIM4v5dlc; - return(OK); - case BSIM4v5_MOD_XW: - value->rValue = model->BSIM4v5xw; - return(OK); - case BSIM4v5_MOD_XL: - value->rValue = model->BSIM4v5xl; - return(OK); - case BSIM4v5_MOD_DLCIG: - value->rValue = model->BSIM4v5dlcig; - return(OK); - case BSIM4v5_MOD_DWJ: - value->rValue = model->BSIM4v5dwj; - return(OK); - case BSIM4v5_MOD_VFBCV: - value->rValue = model->BSIM4v5vfbcv; - return(OK); - case BSIM4v5_MOD_ACDE: - value->rValue = model->BSIM4v5acde; - return(OK); - case BSIM4v5_MOD_MOIN: - value->rValue = model->BSIM4v5moin; - return(OK); - case BSIM4v5_MOD_NOFF: - value->rValue = model->BSIM4v5noff; - return(OK); - case BSIM4v5_MOD_VOFFCV: - value->rValue = model->BSIM4v5voffcv; - return(OK); - case BSIM4v5_MOD_DMCG: - value->rValue = model->BSIM4v5dmcg; - return(OK); - case BSIM4v5_MOD_DMCI: - value->rValue = model->BSIM4v5dmci; - return(OK); - case BSIM4v5_MOD_DMDG: - value->rValue = model->BSIM4v5dmdg; - return(OK); - case BSIM4v5_MOD_DMCGT: - value->rValue = model->BSIM4v5dmcgt; - return(OK); - case BSIM4v5_MOD_XGW: - value->rValue = model->BSIM4v5xgw; - return(OK); - case BSIM4v5_MOD_XGL: - value->rValue = model->BSIM4v5xgl; - return(OK); - case BSIM4v5_MOD_RSHG: - value->rValue = model->BSIM4v5rshg; - return(OK); - case BSIM4v5_MOD_NGCON: - value->rValue = model->BSIM4v5ngcon; - return(OK); - case BSIM4v5_MOD_TCJ: - value->rValue = model->BSIM4v5tcj; - return(OK); - case BSIM4v5_MOD_TPB: - value->rValue = model->BSIM4v5tpb; - return(OK); - case BSIM4v5_MOD_TCJSW: - value->rValue = model->BSIM4v5tcjsw; - return(OK); - case BSIM4v5_MOD_TPBSW: - value->rValue = model->BSIM4v5tpbsw; - return(OK); - case BSIM4v5_MOD_TCJSWG: - value->rValue = model->BSIM4v5tcjswg; - return(OK); - case BSIM4v5_MOD_TPBSWG: - value->rValue = model->BSIM4v5tpbswg; - return(OK); - - /* Length dependence */ - case BSIM4v5_MOD_LCDSC : - value->rValue = model->BSIM4v5lcdsc; - return(OK); - case BSIM4v5_MOD_LCDSCB : - value->rValue = model->BSIM4v5lcdscb; - return(OK); - case BSIM4v5_MOD_LCDSCD : - value->rValue = model->BSIM4v5lcdscd; - return(OK); - case BSIM4v5_MOD_LCIT : - value->rValue = model->BSIM4v5lcit; - return(OK); - case BSIM4v5_MOD_LNFACTOR : - value->rValue = model->BSIM4v5lnfactor; - return(OK); - case BSIM4v5_MOD_LXJ: - value->rValue = model->BSIM4v5lxj; - return(OK); - case BSIM4v5_MOD_LVSAT: - value->rValue = model->BSIM4v5lvsat; - return(OK); - case BSIM4v5_MOD_LAT: - value->rValue = model->BSIM4v5lat; - return(OK); - case BSIM4v5_MOD_LA0: - value->rValue = model->BSIM4v5la0; - return(OK); - case BSIM4v5_MOD_LAGS: - value->rValue = model->BSIM4v5lags; - return(OK); - case BSIM4v5_MOD_LA1: - value->rValue = model->BSIM4v5la1; - return(OK); - case BSIM4v5_MOD_LA2: - value->rValue = model->BSIM4v5la2; - return(OK); - case BSIM4v5_MOD_LKETA: - value->rValue = model->BSIM4v5lketa; - return(OK); - case BSIM4v5_MOD_LNSUB: - value->rValue = model->BSIM4v5lnsub; - return(OK); - case BSIM4v5_MOD_LNDEP: - value->rValue = model->BSIM4v5lndep; - return(OK); - case BSIM4v5_MOD_LNSD: - value->rValue = model->BSIM4v5lnsd; - return(OK); - case BSIM4v5_MOD_LNGATE: - value->rValue = model->BSIM4v5lngate; - return(OK); - case BSIM4v5_MOD_LGAMMA1: - value->rValue = model->BSIM4v5lgamma1; - return(OK); - case BSIM4v5_MOD_LGAMMA2: - value->rValue = model->BSIM4v5lgamma2; - return(OK); - case BSIM4v5_MOD_LVBX: - value->rValue = model->BSIM4v5lvbx; - return(OK); - case BSIM4v5_MOD_LVBM: - value->rValue = model->BSIM4v5lvbm; - return(OK); - case BSIM4v5_MOD_LXT: - value->rValue = model->BSIM4v5lxt; - return(OK); - case BSIM4v5_MOD_LK1: - value->rValue = model->BSIM4v5lk1; - return(OK); - case BSIM4v5_MOD_LKT1: - value->rValue = model->BSIM4v5lkt1; - return(OK); - case BSIM4v5_MOD_LKT1L: - value->rValue = model->BSIM4v5lkt1l; - return(OK); - case BSIM4v5_MOD_LKT2 : - value->rValue = model->BSIM4v5lkt2; - return(OK); - case BSIM4v5_MOD_LK2 : - value->rValue = model->BSIM4v5lk2; - return(OK); - case BSIM4v5_MOD_LK3: - value->rValue = model->BSIM4v5lk3; - return(OK); - case BSIM4v5_MOD_LK3B: - value->rValue = model->BSIM4v5lk3b; - return(OK); - case BSIM4v5_MOD_LW0: - value->rValue = model->BSIM4v5lw0; - return(OK); - case BSIM4v5_MOD_LLPE0: - value->rValue = model->BSIM4v5llpe0; - return(OK); - case BSIM4v5_MOD_LLPEB: - value->rValue = model->BSIM4v5llpeb; - return(OK); - case BSIM4v5_MOD_LDVTP0: - value->rValue = model->BSIM4v5ldvtp0; - return(OK); - case BSIM4v5_MOD_LDVTP1: - value->rValue = model->BSIM4v5ldvtp1; - return(OK); - case BSIM4v5_MOD_LDVT0: - value->rValue = model->BSIM4v5ldvt0; - return(OK); - case BSIM4v5_MOD_LDVT1 : - value->rValue = model->BSIM4v5ldvt1; - return(OK); - case BSIM4v5_MOD_LDVT2 : - value->rValue = model->BSIM4v5ldvt2; - return(OK); - case BSIM4v5_MOD_LDVT0W : - value->rValue = model->BSIM4v5ldvt0w; - return(OK); - case BSIM4v5_MOD_LDVT1W : - value->rValue = model->BSIM4v5ldvt1w; - return(OK); - case BSIM4v5_MOD_LDVT2W : - value->rValue = model->BSIM4v5ldvt2w; - return(OK); - case BSIM4v5_MOD_LDROUT : - value->rValue = model->BSIM4v5ldrout; - return(OK); - case BSIM4v5_MOD_LDSUB : - value->rValue = model->BSIM4v5ldsub; - return(OK); - case BSIM4v5_MOD_LVTH0: - value->rValue = model->BSIM4v5lvth0; - return(OK); - case BSIM4v5_MOD_LUA: - value->rValue = model->BSIM4v5lua; - return(OK); - case BSIM4v5_MOD_LUA1: - value->rValue = model->BSIM4v5lua1; - return(OK); - case BSIM4v5_MOD_LUB: - value->rValue = model->BSIM4v5lub; - return(OK); - case BSIM4v5_MOD_LUB1: - value->rValue = model->BSIM4v5lub1; - return(OK); - case BSIM4v5_MOD_LUC: - value->rValue = model->BSIM4v5luc; - return(OK); - case BSIM4v5_MOD_LUC1: - value->rValue = model->BSIM4v5luc1; - return(OK); - case BSIM4v5_MOD_LUD: - value->rValue = model->BSIM4v5lud; - return(OK); - case BSIM4v5_MOD_LUD1: - value->rValue = model->BSIM4v5lud1; - return(OK); - case BSIM4v5_MOD_LUP: - value->rValue = model->BSIM4v5lup; - return(OK); - case BSIM4v5_MOD_LLP: - value->rValue = model->BSIM4v5llp; - return(OK); - case BSIM4v5_MOD_LU0: - value->rValue = model->BSIM4v5lu0; - return(OK); - case BSIM4v5_MOD_LUTE: - value->rValue = model->BSIM4v5lute; - return(OK); - case BSIM4v5_MOD_LVOFF: - value->rValue = model->BSIM4v5lvoff; - return(OK); - case BSIM4v5_MOD_LTVOFF: - value->rValue = model->BSIM4v5ltvoff; - return(OK); - case BSIM4v5_MOD_LMINV: - value->rValue = model->BSIM4v5lminv; - return(OK); - case BSIM4v5_MOD_LFPROUT: - value->rValue = model->BSIM4v5lfprout; - return(OK); - case BSIM4v5_MOD_LPDITS: - value->rValue = model->BSIM4v5lpdits; - return(OK); - case BSIM4v5_MOD_LPDITSD: - value->rValue = model->BSIM4v5lpditsd; - return(OK); - case BSIM4v5_MOD_LDELTA: - value->rValue = model->BSIM4v5ldelta; - return(OK); - case BSIM4v5_MOD_LRDSW: - value->rValue = model->BSIM4v5lrdsw; - return(OK); - case BSIM4v5_MOD_LRDW: - value->rValue = model->BSIM4v5lrdw; - return(OK); - case BSIM4v5_MOD_LRSW: - value->rValue = model->BSIM4v5lrsw; - return(OK); - case BSIM4v5_MOD_LPRWB: - value->rValue = model->BSIM4v5lprwb; - return(OK); - case BSIM4v5_MOD_LPRWG: - value->rValue = model->BSIM4v5lprwg; - return(OK); - case BSIM4v5_MOD_LPRT: - value->rValue = model->BSIM4v5lprt; - return(OK); - case BSIM4v5_MOD_LETA0: - value->rValue = model->BSIM4v5leta0; - return(OK); - case BSIM4v5_MOD_LETAB: - value->rValue = model->BSIM4v5letab; - return(OK); - case BSIM4v5_MOD_LPCLM: - value->rValue = model->BSIM4v5lpclm; - return(OK); - case BSIM4v5_MOD_LPDIBL1: - value->rValue = model->BSIM4v5lpdibl1; - return(OK); - case BSIM4v5_MOD_LPDIBL2: - value->rValue = model->BSIM4v5lpdibl2; - return(OK); - case BSIM4v5_MOD_LPDIBLB: - value->rValue = model->BSIM4v5lpdiblb; - return(OK); - case BSIM4v5_MOD_LPSCBE1: - value->rValue = model->BSIM4v5lpscbe1; - return(OK); - case BSIM4v5_MOD_LPSCBE2: - value->rValue = model->BSIM4v5lpscbe2; - return(OK); - case BSIM4v5_MOD_LPVAG: - value->rValue = model->BSIM4v5lpvag; - return(OK); - case BSIM4v5_MOD_LWR: - value->rValue = model->BSIM4v5lwr; - return(OK); - case BSIM4v5_MOD_LDWG: - value->rValue = model->BSIM4v5ldwg; - return(OK); - case BSIM4v5_MOD_LDWB: - value->rValue = model->BSIM4v5ldwb; - return(OK); - case BSIM4v5_MOD_LB0: - value->rValue = model->BSIM4v5lb0; - return(OK); - case BSIM4v5_MOD_LB1: - value->rValue = model->BSIM4v5lb1; - return(OK); - case BSIM4v5_MOD_LALPHA0: - value->rValue = model->BSIM4v5lalpha0; - return(OK); - case BSIM4v5_MOD_LALPHA1: - value->rValue = model->BSIM4v5lalpha1; - return(OK); - case BSIM4v5_MOD_LBETA0: - value->rValue = model->BSIM4v5lbeta0; - return(OK); - case BSIM4v5_MOD_LAGIDL: - value->rValue = model->BSIM4v5lagidl; - return(OK); - case BSIM4v5_MOD_LBGIDL: - value->rValue = model->BSIM4v5lbgidl; - return(OK); - case BSIM4v5_MOD_LCGIDL: - value->rValue = model->BSIM4v5lcgidl; - return(OK); - case BSIM4v5_MOD_LEGIDL: - value->rValue = model->BSIM4v5legidl; - return(OK); - case BSIM4v5_MOD_LAIGC: - value->rValue = model->BSIM4v5laigc; - return(OK); - case BSIM4v5_MOD_LBIGC: - value->rValue = model->BSIM4v5lbigc; - return(OK); - case BSIM4v5_MOD_LCIGC: - value->rValue = model->BSIM4v5lcigc; - return(OK); - case BSIM4v5_MOD_LAIGSD: - value->rValue = model->BSIM4v5laigsd; - return(OK); - case BSIM4v5_MOD_LBIGSD: - value->rValue = model->BSIM4v5lbigsd; - return(OK); - case BSIM4v5_MOD_LCIGSD: - value->rValue = model->BSIM4v5lcigsd; - return(OK); - case BSIM4v5_MOD_LAIGBACC: - value->rValue = model->BSIM4v5laigbacc; - return(OK); - case BSIM4v5_MOD_LBIGBACC: - value->rValue = model->BSIM4v5lbigbacc; - return(OK); - case BSIM4v5_MOD_LCIGBACC: - value->rValue = model->BSIM4v5lcigbacc; - return(OK); - case BSIM4v5_MOD_LAIGBINV: - value->rValue = model->BSIM4v5laigbinv; - return(OK); - case BSIM4v5_MOD_LBIGBINV: - value->rValue = model->BSIM4v5lbigbinv; - return(OK); - case BSIM4v5_MOD_LCIGBINV: - value->rValue = model->BSIM4v5lcigbinv; - return(OK); - case BSIM4v5_MOD_LNIGC: - value->rValue = model->BSIM4v5lnigc; - return(OK); - case BSIM4v5_MOD_LNIGBACC: - value->rValue = model->BSIM4v5lnigbacc; - return(OK); - case BSIM4v5_MOD_LNIGBINV: - value->rValue = model->BSIM4v5lnigbinv; - return(OK); - case BSIM4v5_MOD_LNTOX: - value->rValue = model->BSIM4v5lntox; - return(OK); - case BSIM4v5_MOD_LEIGBINV: - value->rValue = model->BSIM4v5leigbinv; - return(OK); - case BSIM4v5_MOD_LPIGCD: - value->rValue = model->BSIM4v5lpigcd; - return(OK); - case BSIM4v5_MOD_LPOXEDGE: - value->rValue = model->BSIM4v5lpoxedge; - return(OK); - case BSIM4v5_MOD_LPHIN: - value->rValue = model->BSIM4v5lphin; - return(OK); - case BSIM4v5_MOD_LXRCRG1: - value->rValue = model->BSIM4v5lxrcrg1; - return(OK); - case BSIM4v5_MOD_LXRCRG2: - value->rValue = model->BSIM4v5lxrcrg2; - return(OK); - case BSIM4v5_MOD_LEU: - value->rValue = model->BSIM4v5leu; - return(OK); - case BSIM4v5_MOD_LVFB: - value->rValue = model->BSIM4v5lvfb; - return(OK); - - case BSIM4v5_MOD_LCGSL: - value->rValue = model->BSIM4v5lcgsl; - return(OK); - case BSIM4v5_MOD_LCGDL: - value->rValue = model->BSIM4v5lcgdl; - return(OK); - case BSIM4v5_MOD_LCKAPPAS: - value->rValue = model->BSIM4v5lckappas; - return(OK); - case BSIM4v5_MOD_LCKAPPAD: - value->rValue = model->BSIM4v5lckappad; - return(OK); - case BSIM4v5_MOD_LCF: - value->rValue = model->BSIM4v5lcf; - return(OK); - case BSIM4v5_MOD_LCLC: - value->rValue = model->BSIM4v5lclc; - return(OK); - case BSIM4v5_MOD_LCLE: - value->rValue = model->BSIM4v5lcle; - return(OK); - case BSIM4v5_MOD_LVFBCV: - value->rValue = model->BSIM4v5lvfbcv; - return(OK); - case BSIM4v5_MOD_LACDE: - value->rValue = model->BSIM4v5lacde; - return(OK); - case BSIM4v5_MOD_LMOIN: - value->rValue = model->BSIM4v5lmoin; - return(OK); - case BSIM4v5_MOD_LNOFF: - value->rValue = model->BSIM4v5lnoff; - return(OK); - case BSIM4v5_MOD_LVOFFCV: - value->rValue = model->BSIM4v5lvoffcv; - return(OK); - case BSIM4v5_MOD_LVFBSDOFF: - value->rValue = model->BSIM4v5lvfbsdoff; - return(OK); - case BSIM4v5_MOD_LTVFBSDOFF: - value->rValue = model->BSIM4v5ltvfbsdoff; - return(OK); - - /* Width dependence */ - case BSIM4v5_MOD_WCDSC : - value->rValue = model->BSIM4v5wcdsc; - return(OK); - case BSIM4v5_MOD_WCDSCB : - value->rValue = model->BSIM4v5wcdscb; - return(OK); - case BSIM4v5_MOD_WCDSCD : - value->rValue = model->BSIM4v5wcdscd; - return(OK); - case BSIM4v5_MOD_WCIT : - value->rValue = model->BSIM4v5wcit; - return(OK); - case BSIM4v5_MOD_WNFACTOR : - value->rValue = model->BSIM4v5wnfactor; - return(OK); - case BSIM4v5_MOD_WXJ: - value->rValue = model->BSIM4v5wxj; - return(OK); - case BSIM4v5_MOD_WVSAT: - value->rValue = model->BSIM4v5wvsat; - return(OK); - case BSIM4v5_MOD_WAT: - value->rValue = model->BSIM4v5wat; - return(OK); - case BSIM4v5_MOD_WA0: - value->rValue = model->BSIM4v5wa0; - return(OK); - case BSIM4v5_MOD_WAGS: - value->rValue = model->BSIM4v5wags; - return(OK); - case BSIM4v5_MOD_WA1: - value->rValue = model->BSIM4v5wa1; - return(OK); - case BSIM4v5_MOD_WA2: - value->rValue = model->BSIM4v5wa2; - return(OK); - case BSIM4v5_MOD_WKETA: - value->rValue = model->BSIM4v5wketa; - return(OK); - case BSIM4v5_MOD_WNSUB: - value->rValue = model->BSIM4v5wnsub; - return(OK); - case BSIM4v5_MOD_WNDEP: - value->rValue = model->BSIM4v5wndep; - return(OK); - case BSIM4v5_MOD_WNSD: - value->rValue = model->BSIM4v5wnsd; - return(OK); - case BSIM4v5_MOD_WNGATE: - value->rValue = model->BSIM4v5wngate; - return(OK); - case BSIM4v5_MOD_WGAMMA1: - value->rValue = model->BSIM4v5wgamma1; - return(OK); - case BSIM4v5_MOD_WGAMMA2: - value->rValue = model->BSIM4v5wgamma2; - return(OK); - case BSIM4v5_MOD_WVBX: - value->rValue = model->BSIM4v5wvbx; - return(OK); - case BSIM4v5_MOD_WVBM: - value->rValue = model->BSIM4v5wvbm; - return(OK); - case BSIM4v5_MOD_WXT: - value->rValue = model->BSIM4v5wxt; - return(OK); - case BSIM4v5_MOD_WK1: - value->rValue = model->BSIM4v5wk1; - return(OK); - case BSIM4v5_MOD_WKT1: - value->rValue = model->BSIM4v5wkt1; - return(OK); - case BSIM4v5_MOD_WKT1L: - value->rValue = model->BSIM4v5wkt1l; - return(OK); - case BSIM4v5_MOD_WKT2 : - value->rValue = model->BSIM4v5wkt2; - return(OK); - case BSIM4v5_MOD_WK2 : - value->rValue = model->BSIM4v5wk2; - return(OK); - case BSIM4v5_MOD_WK3: - value->rValue = model->BSIM4v5wk3; - return(OK); - case BSIM4v5_MOD_WK3B: - value->rValue = model->BSIM4v5wk3b; - return(OK); - case BSIM4v5_MOD_WW0: - value->rValue = model->BSIM4v5ww0; - return(OK); - case BSIM4v5_MOD_WLPE0: - value->rValue = model->BSIM4v5wlpe0; - return(OK); - case BSIM4v5_MOD_WDVTP0: - value->rValue = model->BSIM4v5wdvtp0; - return(OK); - case BSIM4v5_MOD_WDVTP1: - value->rValue = model->BSIM4v5wdvtp1; - return(OK); - case BSIM4v5_MOD_WLPEB: - value->rValue = model->BSIM4v5wlpeb; - return(OK); - case BSIM4v5_MOD_WDVT0: - value->rValue = model->BSIM4v5wdvt0; - return(OK); - case BSIM4v5_MOD_WDVT1 : - value->rValue = model->BSIM4v5wdvt1; - return(OK); - case BSIM4v5_MOD_WDVT2 : - value->rValue = model->BSIM4v5wdvt2; - return(OK); - case BSIM4v5_MOD_WDVT0W : - value->rValue = model->BSIM4v5wdvt0w; - return(OK); - case BSIM4v5_MOD_WDVT1W : - value->rValue = model->BSIM4v5wdvt1w; - return(OK); - case BSIM4v5_MOD_WDVT2W : - value->rValue = model->BSIM4v5wdvt2w; - return(OK); - case BSIM4v5_MOD_WDROUT : - value->rValue = model->BSIM4v5wdrout; - return(OK); - case BSIM4v5_MOD_WDSUB : - value->rValue = model->BSIM4v5wdsub; - return(OK); - case BSIM4v5_MOD_WVTH0: - value->rValue = model->BSIM4v5wvth0; - return(OK); - case BSIM4v5_MOD_WUA: - value->rValue = model->BSIM4v5wua; - return(OK); - case BSIM4v5_MOD_WUA1: - value->rValue = model->BSIM4v5wua1; - return(OK); - case BSIM4v5_MOD_WUB: - value->rValue = model->BSIM4v5wub; - return(OK); - case BSIM4v5_MOD_WUB1: - value->rValue = model->BSIM4v5wub1; - return(OK); - case BSIM4v5_MOD_WUC: - value->rValue = model->BSIM4v5wuc; - return(OK); - case BSIM4v5_MOD_WUC1: - value->rValue = model->BSIM4v5wuc1; - return(OK); - case BSIM4v5_MOD_WUD: - value->rValue = model->BSIM4v5wud; - return(OK); - case BSIM4v5_MOD_WUD1: - value->rValue = model->BSIM4v5wud1; - return(OK); - case BSIM4v5_MOD_WUP: - value->rValue = model->BSIM4v5wup; - return(OK); - case BSIM4v5_MOD_WLP: - value->rValue = model->BSIM4v5wlp; - return(OK); - case BSIM4v5_MOD_WU0: - value->rValue = model->BSIM4v5wu0; - return(OK); - case BSIM4v5_MOD_WUTE: - value->rValue = model->BSIM4v5wute; - return(OK); - case BSIM4v5_MOD_WVOFF: - value->rValue = model->BSIM4v5wvoff; - return(OK); - case BSIM4v5_MOD_WTVOFF: - value->rValue = model->BSIM4v5wtvoff; - return(OK); - case BSIM4v5_MOD_WMINV: - value->rValue = model->BSIM4v5wminv; - return(OK); - case BSIM4v5_MOD_WFPROUT: - value->rValue = model->BSIM4v5wfprout; - return(OK); - case BSIM4v5_MOD_WPDITS: - value->rValue = model->BSIM4v5wpdits; - return(OK); - case BSIM4v5_MOD_WPDITSD: - value->rValue = model->BSIM4v5wpditsd; - return(OK); - case BSIM4v5_MOD_WDELTA: - value->rValue = model->BSIM4v5wdelta; - return(OK); - case BSIM4v5_MOD_WRDSW: - value->rValue = model->BSIM4v5wrdsw; - return(OK); - case BSIM4v5_MOD_WRDW: - value->rValue = model->BSIM4v5wrdw; - return(OK); - case BSIM4v5_MOD_WRSW: - value->rValue = model->BSIM4v5wrsw; - return(OK); - case BSIM4v5_MOD_WPRWB: - value->rValue = model->BSIM4v5wprwb; - return(OK); - case BSIM4v5_MOD_WPRWG: - value->rValue = model->BSIM4v5wprwg; - return(OK); - case BSIM4v5_MOD_WPRT: - value->rValue = model->BSIM4v5wprt; - return(OK); - case BSIM4v5_MOD_WETA0: - value->rValue = model->BSIM4v5weta0; - return(OK); - case BSIM4v5_MOD_WETAB: - value->rValue = model->BSIM4v5wetab; - return(OK); - case BSIM4v5_MOD_WPCLM: - value->rValue = model->BSIM4v5wpclm; - return(OK); - case BSIM4v5_MOD_WPDIBL1: - value->rValue = model->BSIM4v5wpdibl1; - return(OK); - case BSIM4v5_MOD_WPDIBL2: - value->rValue = model->BSIM4v5wpdibl2; - return(OK); - case BSIM4v5_MOD_WPDIBLB: - value->rValue = model->BSIM4v5wpdiblb; - return(OK); - case BSIM4v5_MOD_WPSCBE1: - value->rValue = model->BSIM4v5wpscbe1; - return(OK); - case BSIM4v5_MOD_WPSCBE2: - value->rValue = model->BSIM4v5wpscbe2; - return(OK); - case BSIM4v5_MOD_WPVAG: - value->rValue = model->BSIM4v5wpvag; - return(OK); - case BSIM4v5_MOD_WWR: - value->rValue = model->BSIM4v5wwr; - return(OK); - case BSIM4v5_MOD_WDWG: - value->rValue = model->BSIM4v5wdwg; - return(OK); - case BSIM4v5_MOD_WDWB: - value->rValue = model->BSIM4v5wdwb; - return(OK); - case BSIM4v5_MOD_WB0: - value->rValue = model->BSIM4v5wb0; - return(OK); - case BSIM4v5_MOD_WB1: - value->rValue = model->BSIM4v5wb1; - return(OK); - case BSIM4v5_MOD_WALPHA0: - value->rValue = model->BSIM4v5walpha0; - return(OK); - case BSIM4v5_MOD_WALPHA1: - value->rValue = model->BSIM4v5walpha1; - return(OK); - case BSIM4v5_MOD_WBETA0: - value->rValue = model->BSIM4v5wbeta0; - return(OK); - case BSIM4v5_MOD_WAGIDL: - value->rValue = model->BSIM4v5wagidl; - return(OK); - case BSIM4v5_MOD_WBGIDL: - value->rValue = model->BSIM4v5wbgidl; - return(OK); - case BSIM4v5_MOD_WCGIDL: - value->rValue = model->BSIM4v5wcgidl; - return(OK); - case BSIM4v5_MOD_WEGIDL: - value->rValue = model->BSIM4v5wegidl; - return(OK); - case BSIM4v5_MOD_WAIGC: - value->rValue = model->BSIM4v5waigc; - return(OK); - case BSIM4v5_MOD_WBIGC: - value->rValue = model->BSIM4v5wbigc; - return(OK); - case BSIM4v5_MOD_WCIGC: - value->rValue = model->BSIM4v5wcigc; - return(OK); - case BSIM4v5_MOD_WAIGSD: - value->rValue = model->BSIM4v5waigsd; - return(OK); - case BSIM4v5_MOD_WBIGSD: - value->rValue = model->BSIM4v5wbigsd; - return(OK); - case BSIM4v5_MOD_WCIGSD: - value->rValue = model->BSIM4v5wcigsd; - return(OK); - case BSIM4v5_MOD_WAIGBACC: - value->rValue = model->BSIM4v5waigbacc; - return(OK); - case BSIM4v5_MOD_WBIGBACC: - value->rValue = model->BSIM4v5wbigbacc; - return(OK); - case BSIM4v5_MOD_WCIGBACC: - value->rValue = model->BSIM4v5wcigbacc; - return(OK); - case BSIM4v5_MOD_WAIGBINV: - value->rValue = model->BSIM4v5waigbinv; - return(OK); - case BSIM4v5_MOD_WBIGBINV: - value->rValue = model->BSIM4v5wbigbinv; - return(OK); - case BSIM4v5_MOD_WCIGBINV: - value->rValue = model->BSIM4v5wcigbinv; - return(OK); - case BSIM4v5_MOD_WNIGC: - value->rValue = model->BSIM4v5wnigc; - return(OK); - case BSIM4v5_MOD_WNIGBACC: - value->rValue = model->BSIM4v5wnigbacc; - return(OK); - case BSIM4v5_MOD_WNIGBINV: - value->rValue = model->BSIM4v5wnigbinv; - return(OK); - case BSIM4v5_MOD_WNTOX: - value->rValue = model->BSIM4v5wntox; - return(OK); - case BSIM4v5_MOD_WEIGBINV: - value->rValue = model->BSIM4v5weigbinv; - return(OK); - case BSIM4v5_MOD_WPIGCD: - value->rValue = model->BSIM4v5wpigcd; - return(OK); - case BSIM4v5_MOD_WPOXEDGE: - value->rValue = model->BSIM4v5wpoxedge; - return(OK); - case BSIM4v5_MOD_WPHIN: - value->rValue = model->BSIM4v5wphin; - return(OK); - case BSIM4v5_MOD_WXRCRG1: - value->rValue = model->BSIM4v5wxrcrg1; - return(OK); - case BSIM4v5_MOD_WXRCRG2: - value->rValue = model->BSIM4v5wxrcrg2; - return(OK); - case BSIM4v5_MOD_WEU: - value->rValue = model->BSIM4v5weu; - return(OK); - case BSIM4v5_MOD_WVFB: - value->rValue = model->BSIM4v5wvfb; - return(OK); - - case BSIM4v5_MOD_WCGSL: - value->rValue = model->BSIM4v5wcgsl; - return(OK); - case BSIM4v5_MOD_WCGDL: - value->rValue = model->BSIM4v5wcgdl; - return(OK); - case BSIM4v5_MOD_WCKAPPAS: - value->rValue = model->BSIM4v5wckappas; - return(OK); - case BSIM4v5_MOD_WCKAPPAD: - value->rValue = model->BSIM4v5wckappad; - return(OK); - case BSIM4v5_MOD_WCF: - value->rValue = model->BSIM4v5wcf; - return(OK); - case BSIM4v5_MOD_WCLC: - value->rValue = model->BSIM4v5wclc; - return(OK); - case BSIM4v5_MOD_WCLE: - value->rValue = model->BSIM4v5wcle; - return(OK); - case BSIM4v5_MOD_WVFBCV: - value->rValue = model->BSIM4v5wvfbcv; - return(OK); - case BSIM4v5_MOD_WACDE: - value->rValue = model->BSIM4v5wacde; - return(OK); - case BSIM4v5_MOD_WMOIN: - value->rValue = model->BSIM4v5wmoin; - return(OK); - case BSIM4v5_MOD_WNOFF: - value->rValue = model->BSIM4v5wnoff; - return(OK); - case BSIM4v5_MOD_WVOFFCV: - value->rValue = model->BSIM4v5wvoffcv; - return(OK); - case BSIM4v5_MOD_WVFBSDOFF: - value->rValue = model->BSIM4v5wvfbsdoff; - return(OK); - case BSIM4v5_MOD_WTVFBSDOFF: - value->rValue = model->BSIM4v5wtvfbsdoff; - return(OK); - - /* Cross-term dependence */ - case BSIM4v5_MOD_PCDSC : - value->rValue = model->BSIM4v5pcdsc; - return(OK); - case BSIM4v5_MOD_PCDSCB : - value->rValue = model->BSIM4v5pcdscb; - return(OK); - case BSIM4v5_MOD_PCDSCD : - value->rValue = model->BSIM4v5pcdscd; - return(OK); - case BSIM4v5_MOD_PCIT : - value->rValue = model->BSIM4v5pcit; - return(OK); - case BSIM4v5_MOD_PNFACTOR : - value->rValue = model->BSIM4v5pnfactor; - return(OK); - case BSIM4v5_MOD_PXJ: - value->rValue = model->BSIM4v5pxj; - return(OK); - case BSIM4v5_MOD_PVSAT: - value->rValue = model->BSIM4v5pvsat; - return(OK); - case BSIM4v5_MOD_PAT: - value->rValue = model->BSIM4v5pat; - return(OK); - case BSIM4v5_MOD_PA0: - value->rValue = model->BSIM4v5pa0; - return(OK); - case BSIM4v5_MOD_PAGS: - value->rValue = model->BSIM4v5pags; - return(OK); - case BSIM4v5_MOD_PA1: - value->rValue = model->BSIM4v5pa1; - return(OK); - case BSIM4v5_MOD_PA2: - value->rValue = model->BSIM4v5pa2; - return(OK); - case BSIM4v5_MOD_PKETA: - value->rValue = model->BSIM4v5pketa; - return(OK); - case BSIM4v5_MOD_PNSUB: - value->rValue = model->BSIM4v5pnsub; - return(OK); - case BSIM4v5_MOD_PNDEP: - value->rValue = model->BSIM4v5pndep; - return(OK); - case BSIM4v5_MOD_PNSD: - value->rValue = model->BSIM4v5pnsd; - return(OK); - case BSIM4v5_MOD_PNGATE: - value->rValue = model->BSIM4v5pngate; - return(OK); - case BSIM4v5_MOD_PGAMMA1: - value->rValue = model->BSIM4v5pgamma1; - return(OK); - case BSIM4v5_MOD_PGAMMA2: - value->rValue = model->BSIM4v5pgamma2; - return(OK); - case BSIM4v5_MOD_PVBX: - value->rValue = model->BSIM4v5pvbx; - return(OK); - case BSIM4v5_MOD_PVBM: - value->rValue = model->BSIM4v5pvbm; - return(OK); - case BSIM4v5_MOD_PXT: - value->rValue = model->BSIM4v5pxt; - return(OK); - case BSIM4v5_MOD_PK1: - value->rValue = model->BSIM4v5pk1; - return(OK); - case BSIM4v5_MOD_PKT1: - value->rValue = model->BSIM4v5pkt1; - return(OK); - case BSIM4v5_MOD_PKT1L: - value->rValue = model->BSIM4v5pkt1l; - return(OK); - case BSIM4v5_MOD_PKT2 : - value->rValue = model->BSIM4v5pkt2; - return(OK); - case BSIM4v5_MOD_PK2 : - value->rValue = model->BSIM4v5pk2; - return(OK); - case BSIM4v5_MOD_PK3: - value->rValue = model->BSIM4v5pk3; - return(OK); - case BSIM4v5_MOD_PK3B: - value->rValue = model->BSIM4v5pk3b; - return(OK); - case BSIM4v5_MOD_PW0: - value->rValue = model->BSIM4v5pw0; - return(OK); - case BSIM4v5_MOD_PLPE0: - value->rValue = model->BSIM4v5plpe0; - return(OK); - case BSIM4v5_MOD_PLPEB: - value->rValue = model->BSIM4v5plpeb; - return(OK); - case BSIM4v5_MOD_PDVTP0: - value->rValue = model->BSIM4v5pdvtp0; - return(OK); - case BSIM4v5_MOD_PDVTP1: - value->rValue = model->BSIM4v5pdvtp1; - return(OK); - case BSIM4v5_MOD_PDVT0 : - value->rValue = model->BSIM4v5pdvt0; - return(OK); - case BSIM4v5_MOD_PDVT1 : - value->rValue = model->BSIM4v5pdvt1; - return(OK); - case BSIM4v5_MOD_PDVT2 : - value->rValue = model->BSIM4v5pdvt2; - return(OK); - case BSIM4v5_MOD_PDVT0W : - value->rValue = model->BSIM4v5pdvt0w; - return(OK); - case BSIM4v5_MOD_PDVT1W : - value->rValue = model->BSIM4v5pdvt1w; - return(OK); - case BSIM4v5_MOD_PDVT2W : - value->rValue = model->BSIM4v5pdvt2w; - return(OK); - case BSIM4v5_MOD_PDROUT : - value->rValue = model->BSIM4v5pdrout; - return(OK); - case BSIM4v5_MOD_PDSUB : - value->rValue = model->BSIM4v5pdsub; - return(OK); - case BSIM4v5_MOD_PVTH0: - value->rValue = model->BSIM4v5pvth0; - return(OK); - case BSIM4v5_MOD_PUA: - value->rValue = model->BSIM4v5pua; - return(OK); - case BSIM4v5_MOD_PUA1: - value->rValue = model->BSIM4v5pua1; - return(OK); - case BSIM4v5_MOD_PUB: - value->rValue = model->BSIM4v5pub; - return(OK); - case BSIM4v5_MOD_PUB1: - value->rValue = model->BSIM4v5pub1; - return(OK); - case BSIM4v5_MOD_PUC: - value->rValue = model->BSIM4v5puc; - return(OK); - case BSIM4v5_MOD_PUC1: - value->rValue = model->BSIM4v5puc1; - return(OK); - case BSIM4v5_MOD_PUD: - value->rValue = model->BSIM4v5pud; - return(OK); - case BSIM4v5_MOD_PUD1: - value->rValue = model->BSIM4v5pud1; - return(OK); - case BSIM4v5_MOD_PUP: - value->rValue = model->BSIM4v5pup; - return(OK); - case BSIM4v5_MOD_PLP: - value->rValue = model->BSIM4v5plp; - return(OK); - case BSIM4v5_MOD_PU0: - value->rValue = model->BSIM4v5pu0; - return(OK); - case BSIM4v5_MOD_PUTE: - value->rValue = model->BSIM4v5pute; - return(OK); - case BSIM4v5_MOD_PVOFF: - value->rValue = model->BSIM4v5pvoff; - return(OK); - case BSIM4v5_MOD_PTVOFF: - value->rValue = model->BSIM4v5ptvoff; - return(OK); - case BSIM4v5_MOD_PMINV: - value->rValue = model->BSIM4v5pminv; - return(OK); - case BSIM4v5_MOD_PFPROUT: - value->rValue = model->BSIM4v5pfprout; - return(OK); - case BSIM4v5_MOD_PPDITS: - value->rValue = model->BSIM4v5ppdits; - return(OK); - case BSIM4v5_MOD_PPDITSD: - value->rValue = model->BSIM4v5ppditsd; - return(OK); - case BSIM4v5_MOD_PDELTA: - value->rValue = model->BSIM4v5pdelta; - return(OK); - case BSIM4v5_MOD_PRDSW: - value->rValue = model->BSIM4v5prdsw; - return(OK); - case BSIM4v5_MOD_PRDW: - value->rValue = model->BSIM4v5prdw; - return(OK); - case BSIM4v5_MOD_PRSW: - value->rValue = model->BSIM4v5prsw; - return(OK); - case BSIM4v5_MOD_PPRWB: - value->rValue = model->BSIM4v5pprwb; - return(OK); - case BSIM4v5_MOD_PPRWG: - value->rValue = model->BSIM4v5pprwg; - return(OK); - case BSIM4v5_MOD_PPRT: - value->rValue = model->BSIM4v5pprt; - return(OK); - case BSIM4v5_MOD_PETA0: - value->rValue = model->BSIM4v5peta0; - return(OK); - case BSIM4v5_MOD_PETAB: - value->rValue = model->BSIM4v5petab; - return(OK); - case BSIM4v5_MOD_PPCLM: - value->rValue = model->BSIM4v5ppclm; - return(OK); - case BSIM4v5_MOD_PPDIBL1: - value->rValue = model->BSIM4v5ppdibl1; - return(OK); - case BSIM4v5_MOD_PPDIBL2: - value->rValue = model->BSIM4v5ppdibl2; - return(OK); - case BSIM4v5_MOD_PPDIBLB: - value->rValue = model->BSIM4v5ppdiblb; - return(OK); - case BSIM4v5_MOD_PPSCBE1: - value->rValue = model->BSIM4v5ppscbe1; - return(OK); - case BSIM4v5_MOD_PPSCBE2: - value->rValue = model->BSIM4v5ppscbe2; - return(OK); - case BSIM4v5_MOD_PPVAG: - value->rValue = model->BSIM4v5ppvag; - return(OK); - case BSIM4v5_MOD_PWR: - value->rValue = model->BSIM4v5pwr; - return(OK); - case BSIM4v5_MOD_PDWG: - value->rValue = model->BSIM4v5pdwg; - return(OK); - case BSIM4v5_MOD_PDWB: - value->rValue = model->BSIM4v5pdwb; - return(OK); - case BSIM4v5_MOD_PB0: - value->rValue = model->BSIM4v5pb0; - return(OK); - case BSIM4v5_MOD_PB1: - value->rValue = model->BSIM4v5pb1; - return(OK); - case BSIM4v5_MOD_PALPHA0: - value->rValue = model->BSIM4v5palpha0; - return(OK); - case BSIM4v5_MOD_PALPHA1: - value->rValue = model->BSIM4v5palpha1; - return(OK); - case BSIM4v5_MOD_PBETA0: - value->rValue = model->BSIM4v5pbeta0; - return(OK); - case BSIM4v5_MOD_PAGIDL: - value->rValue = model->BSIM4v5pagidl; - return(OK); - case BSIM4v5_MOD_PBGIDL: - value->rValue = model->BSIM4v5pbgidl; - return(OK); - case BSIM4v5_MOD_PCGIDL: - value->rValue = model->BSIM4v5pcgidl; - return(OK); - case BSIM4v5_MOD_PEGIDL: - value->rValue = model->BSIM4v5pegidl; - return(OK); - case BSIM4v5_MOD_PAIGC: - value->rValue = model->BSIM4v5paigc; - return(OK); - case BSIM4v5_MOD_PBIGC: - value->rValue = model->BSIM4v5pbigc; - return(OK); - case BSIM4v5_MOD_PCIGC: - value->rValue = model->BSIM4v5pcigc; - return(OK); - case BSIM4v5_MOD_PAIGSD: - value->rValue = model->BSIM4v5paigsd; - return(OK); - case BSIM4v5_MOD_PBIGSD: - value->rValue = model->BSIM4v5pbigsd; - return(OK); - case BSIM4v5_MOD_PCIGSD: - value->rValue = model->BSIM4v5pcigsd; - return(OK); - case BSIM4v5_MOD_PAIGBACC: - value->rValue = model->BSIM4v5paigbacc; - return(OK); - case BSIM4v5_MOD_PBIGBACC: - value->rValue = model->BSIM4v5pbigbacc; - return(OK); - case BSIM4v5_MOD_PCIGBACC: - value->rValue = model->BSIM4v5pcigbacc; - return(OK); - case BSIM4v5_MOD_PAIGBINV: - value->rValue = model->BSIM4v5paigbinv; - return(OK); - case BSIM4v5_MOD_PBIGBINV: - value->rValue = model->BSIM4v5pbigbinv; - return(OK); - case BSIM4v5_MOD_PCIGBINV: - value->rValue = model->BSIM4v5pcigbinv; - return(OK); - case BSIM4v5_MOD_PNIGC: - value->rValue = model->BSIM4v5pnigc; - return(OK); - case BSIM4v5_MOD_PNIGBACC: - value->rValue = model->BSIM4v5pnigbacc; - return(OK); - case BSIM4v5_MOD_PNIGBINV: - value->rValue = model->BSIM4v5pnigbinv; - return(OK); - case BSIM4v5_MOD_PNTOX: - value->rValue = model->BSIM4v5pntox; - return(OK); - case BSIM4v5_MOD_PEIGBINV: - value->rValue = model->BSIM4v5peigbinv; - return(OK); - case BSIM4v5_MOD_PPIGCD: - value->rValue = model->BSIM4v5ppigcd; - return(OK); - case BSIM4v5_MOD_PPOXEDGE: - value->rValue = model->BSIM4v5ppoxedge; - return(OK); - case BSIM4v5_MOD_PPHIN: - value->rValue = model->BSIM4v5pphin; - return(OK); - case BSIM4v5_MOD_PXRCRG1: - value->rValue = model->BSIM4v5pxrcrg1; - return(OK); - case BSIM4v5_MOD_PXRCRG2: - value->rValue = model->BSIM4v5pxrcrg2; - return(OK); - case BSIM4v5_MOD_PEU: - value->rValue = model->BSIM4v5peu; - return(OK); - case BSIM4v5_MOD_PVFB: - value->rValue = model->BSIM4v5pvfb; - return(OK); - - case BSIM4v5_MOD_PCGSL: - value->rValue = model->BSIM4v5pcgsl; - return(OK); - case BSIM4v5_MOD_PCGDL: - value->rValue = model->BSIM4v5pcgdl; - return(OK); - case BSIM4v5_MOD_PCKAPPAS: - value->rValue = model->BSIM4v5pckappas; - return(OK); - case BSIM4v5_MOD_PCKAPPAD: - value->rValue = model->BSIM4v5pckappad; - return(OK); - case BSIM4v5_MOD_PCF: - value->rValue = model->BSIM4v5pcf; - return(OK); - case BSIM4v5_MOD_PCLC: - value->rValue = model->BSIM4v5pclc; - return(OK); - case BSIM4v5_MOD_PCLE: - value->rValue = model->BSIM4v5pcle; - return(OK); - case BSIM4v5_MOD_PVFBCV: - value->rValue = model->BSIM4v5pvfbcv; - return(OK); - case BSIM4v5_MOD_PACDE: - value->rValue = model->BSIM4v5pacde; - return(OK); - case BSIM4v5_MOD_PMOIN: - value->rValue = model->BSIM4v5pmoin; - return(OK); - case BSIM4v5_MOD_PNOFF: - value->rValue = model->BSIM4v5pnoff; - return(OK); - case BSIM4v5_MOD_PVOFFCV: - value->rValue = model->BSIM4v5pvoffcv; - return(OK); - case BSIM4v5_MOD_PVFBSDOFF: - value->rValue = model->BSIM4v5pvfbsdoff; - return(OK); - case BSIM4v5_MOD_PTVFBSDOFF: - value->rValue = model->BSIM4v5ptvfbsdoff; - return(OK); - - case BSIM4v5_MOD_TNOM : - value->rValue = model->BSIM4v5tnom; - return(OK); - case BSIM4v5_MOD_CGSO: - value->rValue = model->BSIM4v5cgso; - return(OK); - case BSIM4v5_MOD_CGDO: - value->rValue = model->BSIM4v5cgdo; - return(OK); - case BSIM4v5_MOD_CGBO: - value->rValue = model->BSIM4v5cgbo; - return(OK); - case BSIM4v5_MOD_XPART: - value->rValue = model->BSIM4v5xpart; - return(OK); - case BSIM4v5_MOD_RSH: - value->rValue = model->BSIM4v5sheetResistance; - return(OK); - case BSIM4v5_MOD_JSS: - value->rValue = model->BSIM4v5SjctSatCurDensity; - return(OK); - case BSIM4v5_MOD_JSWS: - value->rValue = model->BSIM4v5SjctSidewallSatCurDensity; - return(OK); - case BSIM4v5_MOD_JSWGS: - value->rValue = model->BSIM4v5SjctGateSidewallSatCurDensity; - return(OK); - case BSIM4v5_MOD_PBS: - value->rValue = model->BSIM4v5SbulkJctPotential; - return(OK); - case BSIM4v5_MOD_MJS: - value->rValue = model->BSIM4v5SbulkJctBotGradingCoeff; - return(OK); - case BSIM4v5_MOD_PBSWS: - value->rValue = model->BSIM4v5SsidewallJctPotential; - return(OK); - case BSIM4v5_MOD_MJSWS: - value->rValue = model->BSIM4v5SbulkJctSideGradingCoeff; - return(OK); - case BSIM4v5_MOD_CJS: - value->rValue = model->BSIM4v5SunitAreaJctCap; - return(OK); - case BSIM4v5_MOD_CJSWS: - value->rValue = model->BSIM4v5SunitLengthSidewallJctCap; - return(OK); - case BSIM4v5_MOD_PBSWGS: - value->rValue = model->BSIM4v5SGatesidewallJctPotential; - return(OK); - case BSIM4v5_MOD_MJSWGS: - value->rValue = model->BSIM4v5SbulkJctGateSideGradingCoeff; - return(OK); - case BSIM4v5_MOD_CJSWGS: - value->rValue = model->BSIM4v5SunitLengthGateSidewallJctCap; - return(OK); - case BSIM4v5_MOD_NJS: - value->rValue = model->BSIM4v5SjctEmissionCoeff; - return(OK); - case BSIM4v5_MOD_XTIS: - value->rValue = model->BSIM4v5SjctTempExponent; - return(OK); - case BSIM4v5_MOD_JSD: - value->rValue = model->BSIM4v5DjctSatCurDensity; - return(OK); - case BSIM4v5_MOD_JSWD: - value->rValue = model->BSIM4v5DjctSidewallSatCurDensity; - return(OK); - case BSIM4v5_MOD_JSWGD: - value->rValue = model->BSIM4v5DjctGateSidewallSatCurDensity; - return(OK); - case BSIM4v5_MOD_PBD: - value->rValue = model->BSIM4v5DbulkJctPotential; - return(OK); - case BSIM4v5_MOD_MJD: - value->rValue = model->BSIM4v5DbulkJctBotGradingCoeff; - return(OK); - case BSIM4v5_MOD_PBSWD: - value->rValue = model->BSIM4v5DsidewallJctPotential; - return(OK); - case BSIM4v5_MOD_MJSWD: - value->rValue = model->BSIM4v5DbulkJctSideGradingCoeff; - return(OK); - case BSIM4v5_MOD_CJD: - value->rValue = model->BSIM4v5DunitAreaJctCap; - return(OK); - case BSIM4v5_MOD_CJSWD: - value->rValue = model->BSIM4v5DunitLengthSidewallJctCap; - return(OK); - case BSIM4v5_MOD_PBSWGD: - value->rValue = model->BSIM4v5DGatesidewallJctPotential; - return(OK); - case BSIM4v5_MOD_MJSWGD: - value->rValue = model->BSIM4v5DbulkJctGateSideGradingCoeff; - return(OK); - case BSIM4v5_MOD_CJSWGD: - value->rValue = model->BSIM4v5DunitLengthGateSidewallJctCap; - return(OK); - case BSIM4v5_MOD_NJD: - value->rValue = model->BSIM4v5DjctEmissionCoeff; - return(OK); - case BSIM4v5_MOD_XTID: - value->rValue = model->BSIM4v5DjctTempExponent; - return(OK); - case BSIM4v5_MOD_LINT: - value->rValue = model->BSIM4v5Lint; - return(OK); - case BSIM4v5_MOD_LL: - value->rValue = model->BSIM4v5Ll; - return(OK); - case BSIM4v5_MOD_LLC: - value->rValue = model->BSIM4v5Llc; - return(OK); - case BSIM4v5_MOD_LLN: - value->rValue = model->BSIM4v5Lln; - return(OK); - case BSIM4v5_MOD_LW: - value->rValue = model->BSIM4v5Lw; - return(OK); - case BSIM4v5_MOD_LWC: - value->rValue = model->BSIM4v5Lwc; - return(OK); - case BSIM4v5_MOD_LWN: - value->rValue = model->BSIM4v5Lwn; - return(OK); - case BSIM4v5_MOD_LWL: - value->rValue = model->BSIM4v5Lwl; - return(OK); - case BSIM4v5_MOD_LWLC: - value->rValue = model->BSIM4v5Lwlc; - return(OK); - case BSIM4v5_MOD_LMIN: - value->rValue = model->BSIM4v5Lmin; - return(OK); - case BSIM4v5_MOD_LMAX: - value->rValue = model->BSIM4v5Lmax; - return(OK); - case BSIM4v5_MOD_WINT: - value->rValue = model->BSIM4v5Wint; - return(OK); - case BSIM4v5_MOD_WL: - value->rValue = model->BSIM4v5Wl; - return(OK); - case BSIM4v5_MOD_WLC: - value->rValue = model->BSIM4v5Wlc; - return(OK); - case BSIM4v5_MOD_WLN: - value->rValue = model->BSIM4v5Wln; - return(OK); - case BSIM4v5_MOD_WW: - value->rValue = model->BSIM4v5Ww; - return(OK); - case BSIM4v5_MOD_WWC: - value->rValue = model->BSIM4v5Wwc; - return(OK); - case BSIM4v5_MOD_WWN: - value->rValue = model->BSIM4v5Wwn; - return(OK); - case BSIM4v5_MOD_WWL: - value->rValue = model->BSIM4v5Wwl; - return(OK); - case BSIM4v5_MOD_WWLC: - value->rValue = model->BSIM4v5Wwlc; - return(OK); - case BSIM4v5_MOD_WMIN: - value->rValue = model->BSIM4v5Wmin; - return(OK); - case BSIM4v5_MOD_WMAX: - value->rValue = model->BSIM4v5Wmax; - return(OK); - - /* stress effect */ - case BSIM4v5_MOD_SAREF: - value->rValue = model->BSIM4v5saref; - return(OK); - case BSIM4v5_MOD_SBREF: - value->rValue = model->BSIM4v5sbref; - return(OK); - case BSIM4v5_MOD_WLOD: - value->rValue = model->BSIM4v5wlod; - return(OK); - case BSIM4v5_MOD_KU0: - value->rValue = model->BSIM4v5ku0; - return(OK); - case BSIM4v5_MOD_KVSAT: - value->rValue = model->BSIM4v5kvsat; - return(OK); - case BSIM4v5_MOD_KVTH0: - value->rValue = model->BSIM4v5kvth0; - return(OK); - case BSIM4v5_MOD_TKU0: - value->rValue = model->BSIM4v5tku0; - return(OK); - case BSIM4v5_MOD_LLODKU0: - value->rValue = model->BSIM4v5llodku0; - return(OK); - case BSIM4v5_MOD_WLODKU0: - value->rValue = model->BSIM4v5wlodku0; - return(OK); - case BSIM4v5_MOD_LLODVTH: - value->rValue = model->BSIM4v5llodvth; - return(OK); - case BSIM4v5_MOD_WLODVTH: - value->rValue = model->BSIM4v5wlodvth; - return(OK); - case BSIM4v5_MOD_LKU0: - value->rValue = model->BSIM4v5lku0; - return(OK); - case BSIM4v5_MOD_WKU0: - value->rValue = model->BSIM4v5wku0; - return(OK); - case BSIM4v5_MOD_PKU0: - value->rValue = model->BSIM4v5pku0; - return(OK); - case BSIM4v5_MOD_LKVTH0: - value->rValue = model->BSIM4v5lkvth0; - return(OK); - case BSIM4v5_MOD_WKVTH0: - value->rValue = model->BSIM4v5wkvth0; - return(OK); - case BSIM4v5_MOD_PKVTH0: - value->rValue = model->BSIM4v5pkvth0; - return(OK); - case BSIM4v5_MOD_STK2: - value->rValue = model->BSIM4v5stk2; - return(OK); - case BSIM4v5_MOD_LODK2: - value->rValue = model->BSIM4v5lodk2; - return(OK); - case BSIM4v5_MOD_STETA0: - value->rValue = model->BSIM4v5steta0; - return(OK); - case BSIM4v5_MOD_LODETA0: - value->rValue = model->BSIM4v5lodeta0; - return(OK); - - /* Well Proximity Effect */ - case BSIM4v5_MOD_WEB: - value->rValue = model->BSIM4v5web; - return(OK); - case BSIM4v5_MOD_WEC: - value->rValue = model->BSIM4v5wec; - return(OK); - case BSIM4v5_MOD_KVTH0WE: - value->rValue = model->BSIM4v5kvth0we; - return(OK); - case BSIM4v5_MOD_K2WE: - value->rValue = model->BSIM4v5k2we; - return(OK); - case BSIM4v5_MOD_KU0WE: - value->rValue = model->BSIM4v5ku0we; - return(OK); - case BSIM4v5_MOD_SCREF: - value->rValue = model->BSIM4v5scref; - return(OK); - case BSIM4v5_MOD_WPEMOD: - value->rValue = model->BSIM4v5wpemod; - return(OK); - case BSIM4v5_MOD_LKVTH0WE: - value->rValue = model->BSIM4v5lkvth0we; - return(OK); - case BSIM4v5_MOD_LK2WE: - value->rValue = model->BSIM4v5lk2we; - return(OK); - case BSIM4v5_MOD_LKU0WE: - value->rValue = model->BSIM4v5lku0we; - return(OK); - case BSIM4v5_MOD_WKVTH0WE: - value->rValue = model->BSIM4v5wkvth0we; - return(OK); - case BSIM4v5_MOD_WK2WE: - value->rValue = model->BSIM4v5wk2we; - return(OK); - case BSIM4v5_MOD_WKU0WE: - value->rValue = model->BSIM4v5wku0we; - return(OK); - case BSIM4v5_MOD_PKVTH0WE: - value->rValue = model->BSIM4v5pkvth0we; - return(OK); - case BSIM4v5_MOD_PK2WE: - value->rValue = model->BSIM4v5pk2we; - return(OK); - case BSIM4v5_MOD_PKU0WE: - value->rValue = model->BSIM4v5pku0we; - return(OK); - - case BSIM4v5_MOD_NOIA: - value->rValue = model->BSIM4v5oxideTrapDensityA; - return(OK); - case BSIM4v5_MOD_NOIB: - value->rValue = model->BSIM4v5oxideTrapDensityB; - return(OK); - case BSIM4v5_MOD_NOIC: - value->rValue = model->BSIM4v5oxideTrapDensityC; - return(OK); - case BSIM4v5_MOD_EM: - value->rValue = model->BSIM4v5em; - return(OK); - case BSIM4v5_MOD_EF: - value->rValue = model->BSIM4v5ef; - return(OK); - case BSIM4v5_MOD_AF: - value->rValue = model->BSIM4v5af; - return(OK); - case BSIM4v5_MOD_KF: - value->rValue = model->BSIM4v5kf; - return(OK); - - case BSIM4v5_MOD_VGS_MAX: - value->rValue = model->BSIM4v5vgsMax; - return(OK); - case BSIM4v5_MOD_VGD_MAX: - value->rValue = model->BSIM4v5vgdMax; - return(OK); - case BSIM4v5_MOD_VGB_MAX: - value->rValue = model->BSIM4v5vgbMax; - return(OK); - case BSIM4v5_MOD_VDS_MAX: - value->rValue = model->BSIM4v5vdsMax; - return(OK); - case BSIM4v5_MOD_VBS_MAX: - value->rValue = model->BSIM4v5vbsMax; - return(OK); - case BSIM4v5_MOD_VBD_MAX: - value->rValue = model->BSIM4v5vbdMax; - return(OK); - case BSIM4v5_MOD_VGSR_MAX: - value->rValue = model->BSIM4v5vgsrMax; - return(OK); - case BSIM4v5_MOD_VGDR_MAX: - value->rValue = model->BSIM4v5vgdrMax; - return(OK); - case BSIM4v5_MOD_VGBR_MAX: - value->rValue = model->BSIM4v5vgbrMax; - return(OK); - case BSIM4v5_MOD_VBSR_MAX: - value->rValue = model->BSIM4v5vbsrMax; - return(OK); - case BSIM4v5_MOD_VBDR_MAX: - value->rValue = model->BSIM4v5vbdrMax; - return(OK); - - default: - return(E_BADPARM); - } - /* NOTREACHED */ -} - - - diff --git a/src/spicelib/devices/bsim4v5/b4v5mdel.c b/src/spicelib/devices/bsim4v5/b4v5mdel.c deleted file mode 100644 index 6de1fdfa5..000000000 --- a/src/spicelib/devices/bsim4v5/b4v5mdel.c +++ /dev/null @@ -1,36 +0,0 @@ -/**** BSIM4.5.0 Released by Xuemei (Jane) Xi 07/29/2005 ****/ - -/********** - * Copyright 2005 Regents of the University of California. All rights reserved. - * File: b4mdel.c of BSIM4.5.0. - * Author: 2000 Weidong Liu - * Authors: 2001- Xuemei Xi, Mohan Dunga, Ali Niknejad, Chenming Hu. - * Project Director: Prof. Chenming Hu. - **********/ - -#include "ngspice/ngspice.h" -#include "bsim4v5def.h" -#include "ngspice/sperror.h" -#include "ngspice/suffix.h" - - -int -BSIM4v5mDelete(GENmodel *gen_model) -{ - BSIM4v5model *model = (BSIM4v5model*) gen_model; - -#ifdef USE_OMP - FREE(model->BSIM4v5InstanceArray); -#endif - - struct bsim4v5SizeDependParam *p = model->pSizeDependParamKnot; - while (p) { - struct bsim4v5SizeDependParam *next_p = p->pNext; - FREE(p); - p = next_p; - } - - FREE(model->BSIM4v5version); - - return OK; -} diff --git a/src/spicelib/devices/bsim4v5/b4v5mpar.c b/src/spicelib/devices/bsim4v5/b4v5mpar.c deleted file mode 100644 index 47542ecbd..000000000 --- a/src/spicelib/devices/bsim4v5/b4v5mpar.c +++ /dev/null @@ -1,3129 +0,0 @@ -/**** BSIM4.5.0 Released by Xuemei (Jane) Xi 07/29/2005 ****/ - -/********** - * Copyright 2005 Regents of the University of California. All rights reserved. - * File: b4mpar.c of BSIM4.5.0. - * Author: 2000 Weidong Liu - * Authors: 2001- Xuemei Xi, Mohan Dunga, Ali Niknejad, Chenming Hu. - * Project Director: Prof. Chenming Hu. - * Modified by Xuemei Xi, 04/06/2001. - * Modified by Xuemei Xi, 10/05/2001. - * Modified by Xuemei Xi, 11/15/2002. - * Modified by Xuemei Xi, 05/09/2003. - * Modified by Xuemei Xi, 03/04/2004. - * Modified by Xuemei Xi, Mohan Dunga, 07/29/2005. - **********/ - -#include "ngspice/ngspice.h" -#include "bsim4v5def.h" -#include "ngspice/ifsim.h" -#include "ngspice/sperror.h" -#include "ngspice/suffix.h" -#include "ngspice/const.h" - -int -BSIM4v5mParam( -int param, -IFvalue *value, -GENmodel *inMod) -{ - BSIM4v5model *mod = (BSIM4v5model*)inMod; - switch(param) - { case BSIM4v5_MOD_MOBMOD : - mod->BSIM4v5mobMod = value->iValue; - mod->BSIM4v5mobModGiven = TRUE; - break; - case BSIM4v5_MOD_BINUNIT : - mod->BSIM4v5binUnit = value->iValue; - mod->BSIM4v5binUnitGiven = TRUE; - break; - case BSIM4v5_MOD_PARAMCHK : - mod->BSIM4v5paramChk = value->iValue; - mod->BSIM4v5paramChkGiven = TRUE; - break; - case BSIM4v5_MOD_CAPMOD : - mod->BSIM4v5capMod = value->iValue; - mod->BSIM4v5capModGiven = TRUE; - break; - case BSIM4v5_MOD_DIOMOD : - mod->BSIM4v5dioMod = value->iValue; - mod->BSIM4v5dioModGiven = TRUE; - break; - case BSIM4v5_MOD_RDSMOD : - mod->BSIM4v5rdsMod = value->iValue; - mod->BSIM4v5rdsModGiven = TRUE; - break; - case BSIM4v5_MOD_TRNQSMOD : - mod->BSIM4v5trnqsMod = value->iValue; - mod->BSIM4v5trnqsModGiven = TRUE; - break; - case BSIM4v5_MOD_ACNQSMOD : - mod->BSIM4v5acnqsMod = value->iValue; - mod->BSIM4v5acnqsModGiven = TRUE; - break; - case BSIM4v5_MOD_RBODYMOD : - mod->BSIM4v5rbodyMod = value->iValue; - mod->BSIM4v5rbodyModGiven = TRUE; - break; - case BSIM4v5_MOD_RGATEMOD : - mod->BSIM4v5rgateMod = value->iValue; - mod->BSIM4v5rgateModGiven = TRUE; - break; - case BSIM4v5_MOD_PERMOD : - mod->BSIM4v5perMod = value->iValue; - mod->BSIM4v5perModGiven = TRUE; - break; - case BSIM4v5_MOD_GEOMOD : - mod->BSIM4v5geoMod = value->iValue; - mod->BSIM4v5geoModGiven = TRUE; - break; - case BSIM4v5_MOD_RGEOMOD : - mod->BSIM4v5rgeoMod = value->iValue; - mod->BSIM4v5rgeoModGiven = TRUE; - break; - case BSIM4v5_MOD_FNOIMOD : - mod->BSIM4v5fnoiMod = value->iValue; - mod->BSIM4v5fnoiModGiven = TRUE; - break; - case BSIM4v5_MOD_TNOIMOD : - mod->BSIM4v5tnoiMod = value->iValue; - mod->BSIM4v5tnoiModGiven = TRUE; - break; - case BSIM4v5_MOD_IGCMOD : - mod->BSIM4v5igcMod = value->iValue; - mod->BSIM4v5igcModGiven = TRUE; - break; - case BSIM4v5_MOD_IGBMOD : - mod->BSIM4v5igbMod = value->iValue; - mod->BSIM4v5igbModGiven = TRUE; - break; - case BSIM4v5_MOD_TEMPMOD : - mod->BSIM4v5tempMod = value->iValue; - mod->BSIM4v5tempModGiven = TRUE; - break; - - case BSIM4v5_MOD_VERSION : - if (mod->BSIM4v5version) - free(mod->BSIM4v5version); - mod->BSIM4v5version = value->sValue; - mod->BSIM4v5versionGiven = TRUE; - break; - case BSIM4v5_MOD_TOXREF : - mod->BSIM4v5toxref = value->rValue; - mod->BSIM4v5toxrefGiven = TRUE; - break; - case BSIM4v5_MOD_TOXE : - mod->BSIM4v5toxe = value->rValue; - mod->BSIM4v5toxeGiven = TRUE; - break; - case BSIM4v5_MOD_TOXP : - mod->BSIM4v5toxp = value->rValue; - mod->BSIM4v5toxpGiven = TRUE; - break; - case BSIM4v5_MOD_TOXM : - mod->BSIM4v5toxm = value->rValue; - mod->BSIM4v5toxmGiven = TRUE; - break; - case BSIM4v5_MOD_DTOX : - mod->BSIM4v5dtox = value->rValue; - mod->BSIM4v5dtoxGiven = TRUE; - break; - case BSIM4v5_MOD_EPSROX : - mod->BSIM4v5epsrox = value->rValue; - mod->BSIM4v5epsroxGiven = TRUE; - break; - - case BSIM4v5_MOD_CDSC : - mod->BSIM4v5cdsc = value->rValue; - mod->BSIM4v5cdscGiven = TRUE; - break; - case BSIM4v5_MOD_CDSCB : - mod->BSIM4v5cdscb = value->rValue; - mod->BSIM4v5cdscbGiven = TRUE; - break; - - case BSIM4v5_MOD_CDSCD : - mod->BSIM4v5cdscd = value->rValue; - mod->BSIM4v5cdscdGiven = TRUE; - break; - - case BSIM4v5_MOD_CIT : - mod->BSIM4v5cit = value->rValue; - mod->BSIM4v5citGiven = TRUE; - break; - case BSIM4v5_MOD_NFACTOR : - mod->BSIM4v5nfactor = value->rValue; - mod->BSIM4v5nfactorGiven = TRUE; - break; - case BSIM4v5_MOD_XJ: - mod->BSIM4v5xj = value->rValue; - mod->BSIM4v5xjGiven = TRUE; - break; - case BSIM4v5_MOD_VSAT: - mod->BSIM4v5vsat = value->rValue; - mod->BSIM4v5vsatGiven = TRUE; - break; - case BSIM4v5_MOD_A0: - mod->BSIM4v5a0 = value->rValue; - mod->BSIM4v5a0Given = TRUE; - break; - - case BSIM4v5_MOD_AGS: - mod->BSIM4v5ags= value->rValue; - mod->BSIM4v5agsGiven = TRUE; - break; - - case BSIM4v5_MOD_A1: - mod->BSIM4v5a1 = value->rValue; - mod->BSIM4v5a1Given = TRUE; - break; - case BSIM4v5_MOD_A2: - mod->BSIM4v5a2 = value->rValue; - mod->BSIM4v5a2Given = TRUE; - break; - case BSIM4v5_MOD_AT: - mod->BSIM4v5at = value->rValue; - mod->BSIM4v5atGiven = TRUE; - break; - case BSIM4v5_MOD_KETA: - mod->BSIM4v5keta = value->rValue; - mod->BSIM4v5ketaGiven = TRUE; - break; - case BSIM4v5_MOD_NSUB: - mod->BSIM4v5nsub = value->rValue; - mod->BSIM4v5nsubGiven = TRUE; - break; - case BSIM4v5_MOD_NDEP: - mod->BSIM4v5ndep = value->rValue; - mod->BSIM4v5ndepGiven = TRUE; - if (mod->BSIM4v5ndep > 1.0e20) - mod->BSIM4v5ndep *= 1.0e-6; - break; - case BSIM4v5_MOD_NSD: - mod->BSIM4v5nsd = value->rValue; - mod->BSIM4v5nsdGiven = TRUE; - if (mod->BSIM4v5nsd > 1.000001e24) - mod->BSIM4v5nsd *= 1.0e-6; - break; - case BSIM4v5_MOD_NGATE: - mod->BSIM4v5ngate = value->rValue; - mod->BSIM4v5ngateGiven = TRUE; - if (mod->BSIM4v5ngate > 1.000001e24) - mod->BSIM4v5ngate *= 1.0e-6; - break; - case BSIM4v5_MOD_GAMMA1: - mod->BSIM4v5gamma1 = value->rValue; - mod->BSIM4v5gamma1Given = TRUE; - break; - case BSIM4v5_MOD_GAMMA2: - mod->BSIM4v5gamma2 = value->rValue; - mod->BSIM4v5gamma2Given = TRUE; - break; - case BSIM4v5_MOD_VBX: - mod->BSIM4v5vbx = value->rValue; - mod->BSIM4v5vbxGiven = TRUE; - break; - case BSIM4v5_MOD_VBM: - mod->BSIM4v5vbm = value->rValue; - mod->BSIM4v5vbmGiven = TRUE; - break; - case BSIM4v5_MOD_XT: - mod->BSIM4v5xt = value->rValue; - mod->BSIM4v5xtGiven = TRUE; - break; - case BSIM4v5_MOD_K1: - mod->BSIM4v5k1 = value->rValue; - mod->BSIM4v5k1Given = TRUE; - break; - case BSIM4v5_MOD_KT1: - mod->BSIM4v5kt1 = value->rValue; - mod->BSIM4v5kt1Given = TRUE; - break; - case BSIM4v5_MOD_KT1L: - mod->BSIM4v5kt1l = value->rValue; - mod->BSIM4v5kt1lGiven = TRUE; - break; - case BSIM4v5_MOD_KT2: - mod->BSIM4v5kt2 = value->rValue; - mod->BSIM4v5kt2Given = TRUE; - break; - case BSIM4v5_MOD_K2: - mod->BSIM4v5k2 = value->rValue; - mod->BSIM4v5k2Given = TRUE; - break; - case BSIM4v5_MOD_K3: - mod->BSIM4v5k3 = value->rValue; - mod->BSIM4v5k3Given = TRUE; - break; - case BSIM4v5_MOD_K3B: - mod->BSIM4v5k3b = value->rValue; - mod->BSIM4v5k3bGiven = TRUE; - break; - case BSIM4v5_MOD_LPE0: - mod->BSIM4v5lpe0 = value->rValue; - mod->BSIM4v5lpe0Given = TRUE; - break; - case BSIM4v5_MOD_LPEB: - mod->BSIM4v5lpeb = value->rValue; - mod->BSIM4v5lpebGiven = TRUE; - break; - case BSIM4v5_MOD_DVTP0: - mod->BSIM4v5dvtp0 = value->rValue; - mod->BSIM4v5dvtp0Given = TRUE; - break; - case BSIM4v5_MOD_DVTP1: - mod->BSIM4v5dvtp1 = value->rValue; - mod->BSIM4v5dvtp1Given = TRUE; - break; - case BSIM4v5_MOD_W0: - mod->BSIM4v5w0 = value->rValue; - mod->BSIM4v5w0Given = TRUE; - break; - case BSIM4v5_MOD_DVT0: - mod->BSIM4v5dvt0 = value->rValue; - mod->BSIM4v5dvt0Given = TRUE; - break; - case BSIM4v5_MOD_DVT1: - mod->BSIM4v5dvt1 = value->rValue; - mod->BSIM4v5dvt1Given = TRUE; - break; - case BSIM4v5_MOD_DVT2: - mod->BSIM4v5dvt2 = value->rValue; - mod->BSIM4v5dvt2Given = TRUE; - break; - case BSIM4v5_MOD_DVT0W: - mod->BSIM4v5dvt0w = value->rValue; - mod->BSIM4v5dvt0wGiven = TRUE; - break; - case BSIM4v5_MOD_DVT1W: - mod->BSIM4v5dvt1w = value->rValue; - mod->BSIM4v5dvt1wGiven = TRUE; - break; - case BSIM4v5_MOD_DVT2W: - mod->BSIM4v5dvt2w = value->rValue; - mod->BSIM4v5dvt2wGiven = TRUE; - break; - case BSIM4v5_MOD_DROUT: - mod->BSIM4v5drout = value->rValue; - mod->BSIM4v5droutGiven = TRUE; - break; - case BSIM4v5_MOD_DSUB: - mod->BSIM4v5dsub = value->rValue; - mod->BSIM4v5dsubGiven = TRUE; - break; - case BSIM4v5_MOD_VTH0: - mod->BSIM4v5vth0 = value->rValue; - mod->BSIM4v5vth0Given = TRUE; - break; - case BSIM4v5_MOD_EU: - mod->BSIM4v5eu = value->rValue; - mod->BSIM4v5euGiven = TRUE; - break; - case BSIM4v5_MOD_UA: - mod->BSIM4v5ua = value->rValue; - mod->BSIM4v5uaGiven = TRUE; - break; - case BSIM4v5_MOD_UA1: - mod->BSIM4v5ua1 = value->rValue; - mod->BSIM4v5ua1Given = TRUE; - break; - case BSIM4v5_MOD_UB: - mod->BSIM4v5ub = value->rValue; - mod->BSIM4v5ubGiven = TRUE; - break; - case BSIM4v5_MOD_UB1: - mod->BSIM4v5ub1 = value->rValue; - mod->BSIM4v5ub1Given = TRUE; - break; - case BSIM4v5_MOD_UC: - mod->BSIM4v5uc = value->rValue; - mod->BSIM4v5ucGiven = TRUE; - break; - case BSIM4v5_MOD_UC1: - mod->BSIM4v5uc1 = value->rValue; - mod->BSIM4v5uc1Given = TRUE; - break; - case BSIM4v5_MOD_U0 : - mod->BSIM4v5u0 = value->rValue; - mod->BSIM4v5u0Given = TRUE; - break; - case BSIM4v5_MOD_UTE : - mod->BSIM4v5ute = value->rValue; - mod->BSIM4v5uteGiven = TRUE; - break; - - case BSIM4v5_MOD_UD: - mod->BSIM4v5ud = value->rValue; - mod->BSIM4v5udGiven = TRUE; - break; - case BSIM4v5_MOD_UD1: - mod->BSIM4v5ud1 = value->rValue; - mod->BSIM4v5ud1Given = TRUE; - break; - case BSIM4v5_MOD_UP: - mod->BSIM4v5up = value->rValue; - mod->BSIM4v5upGiven = TRUE; - break; - case BSIM4v5_MOD_LP: - mod->BSIM4v5lp = value->rValue; - mod->BSIM4v5lpGiven = TRUE; - break; - case BSIM4v5_MOD_LUD: - mod->BSIM4v5lud = value->rValue; - mod->BSIM4v5ludGiven = TRUE; - break; - case BSIM4v5_MOD_LUD1: - mod->BSIM4v5lud1 = value->rValue; - mod->BSIM4v5lud1Given = TRUE; - break; - case BSIM4v5_MOD_LUP: - mod->BSIM4v5lup = value->rValue; - mod->BSIM4v5lupGiven = TRUE; - break; - case BSIM4v5_MOD_LLP: - mod->BSIM4v5llp = value->rValue; - mod->BSIM4v5llpGiven = TRUE; - break; - case BSIM4v5_MOD_WUD: - mod->BSIM4v5wud = value->rValue; - mod->BSIM4v5wudGiven = TRUE; - break; - case BSIM4v5_MOD_WUD1: - mod->BSIM4v5wud1 = value->rValue; - mod->BSIM4v5wud1Given = TRUE; - break; - case BSIM4v5_MOD_WUP: - mod->BSIM4v5wup = value->rValue; - mod->BSIM4v5wupGiven = TRUE; - break; - case BSIM4v5_MOD_WLP: - mod->BSIM4v5wlp = value->rValue; - mod->BSIM4v5wlpGiven = TRUE; - break; - case BSIM4v5_MOD_PUD: - mod->BSIM4v5pud = value->rValue; - mod->BSIM4v5pudGiven = TRUE; - break; - case BSIM4v5_MOD_PUD1: - mod->BSIM4v5pud1 = value->rValue; - mod->BSIM4v5pud1Given = TRUE; - break; - case BSIM4v5_MOD_PUP: - mod->BSIM4v5pup = value->rValue; - mod->BSIM4v5pupGiven = TRUE; - break; - case BSIM4v5_MOD_PLP: - mod->BSIM4v5plp = value->rValue; - mod->BSIM4v5plpGiven = TRUE; - break; - - - case BSIM4v5_MOD_VOFF: - mod->BSIM4v5voff = value->rValue; - mod->BSIM4v5voffGiven = TRUE; - break; - case BSIM4v5_MOD_TVOFF: - mod->BSIM4v5tvoff = value->rValue; - mod->BSIM4v5tvoffGiven = TRUE; - break; - case BSIM4v5_MOD_VOFFL: - mod->BSIM4v5voffl = value->rValue; - mod->BSIM4v5vofflGiven = TRUE; - break; - case BSIM4v5_MOD_MINV: - mod->BSIM4v5minv = value->rValue; - mod->BSIM4v5minvGiven = TRUE; - break; - case BSIM4v5_MOD_FPROUT: - mod->BSIM4v5fprout = value->rValue; - mod->BSIM4v5fproutGiven = TRUE; - break; - case BSIM4v5_MOD_PDITS: - mod->BSIM4v5pdits = value->rValue; - mod->BSIM4v5pditsGiven = TRUE; - break; - case BSIM4v5_MOD_PDITSD: - mod->BSIM4v5pditsd = value->rValue; - mod->BSIM4v5pditsdGiven = TRUE; - break; - case BSIM4v5_MOD_PDITSL: - mod->BSIM4v5pditsl = value->rValue; - mod->BSIM4v5pditslGiven = TRUE; - break; - case BSIM4v5_MOD_DELTA : - mod->BSIM4v5delta = value->rValue; - mod->BSIM4v5deltaGiven = TRUE; - break; - case BSIM4v5_MOD_RDSW: - mod->BSIM4v5rdsw = value->rValue; - mod->BSIM4v5rdswGiven = TRUE; - break; - case BSIM4v5_MOD_RDSWMIN: - mod->BSIM4v5rdswmin = value->rValue; - mod->BSIM4v5rdswminGiven = TRUE; - break; - case BSIM4v5_MOD_RDWMIN: - mod->BSIM4v5rdwmin = value->rValue; - mod->BSIM4v5rdwminGiven = TRUE; - break; - case BSIM4v5_MOD_RSWMIN: - mod->BSIM4v5rswmin = value->rValue; - mod->BSIM4v5rswminGiven = TRUE; - break; - case BSIM4v5_MOD_RDW: - mod->BSIM4v5rdw = value->rValue; - mod->BSIM4v5rdwGiven = TRUE; - break; - case BSIM4v5_MOD_RSW: - mod->BSIM4v5rsw = value->rValue; - mod->BSIM4v5rswGiven = TRUE; - break; - case BSIM4v5_MOD_PRWG: - mod->BSIM4v5prwg = value->rValue; - mod->BSIM4v5prwgGiven = TRUE; - break; - case BSIM4v5_MOD_PRWB: - mod->BSIM4v5prwb = value->rValue; - mod->BSIM4v5prwbGiven = TRUE; - break; - case BSIM4v5_MOD_PRT: - mod->BSIM4v5prt = value->rValue; - mod->BSIM4v5prtGiven = TRUE; - break; - case BSIM4v5_MOD_ETA0: - mod->BSIM4v5eta0 = value->rValue; - mod->BSIM4v5eta0Given = TRUE; - break; - case BSIM4v5_MOD_ETAB: - mod->BSIM4v5etab = value->rValue; - mod->BSIM4v5etabGiven = TRUE; - break; - case BSIM4v5_MOD_PCLM: - mod->BSIM4v5pclm = value->rValue; - mod->BSIM4v5pclmGiven = TRUE; - break; - case BSIM4v5_MOD_PDIBL1: - mod->BSIM4v5pdibl1 = value->rValue; - mod->BSIM4v5pdibl1Given = TRUE; - break; - case BSIM4v5_MOD_PDIBL2: - mod->BSIM4v5pdibl2 = value->rValue; - mod->BSIM4v5pdibl2Given = TRUE; - break; - case BSIM4v5_MOD_PDIBLB: - mod->BSIM4v5pdiblb = value->rValue; - mod->BSIM4v5pdiblbGiven = TRUE; - break; - case BSIM4v5_MOD_PSCBE1: - mod->BSIM4v5pscbe1 = value->rValue; - mod->BSIM4v5pscbe1Given = TRUE; - break; - case BSIM4v5_MOD_PSCBE2: - mod->BSIM4v5pscbe2 = value->rValue; - mod->BSIM4v5pscbe2Given = TRUE; - break; - case BSIM4v5_MOD_PVAG: - mod->BSIM4v5pvag = value->rValue; - mod->BSIM4v5pvagGiven = TRUE; - break; - case BSIM4v5_MOD_WR : - mod->BSIM4v5wr = value->rValue; - mod->BSIM4v5wrGiven = TRUE; - break; - case BSIM4v5_MOD_DWG : - mod->BSIM4v5dwg = value->rValue; - mod->BSIM4v5dwgGiven = TRUE; - break; - case BSIM4v5_MOD_DWB : - mod->BSIM4v5dwb = value->rValue; - mod->BSIM4v5dwbGiven = TRUE; - break; - case BSIM4v5_MOD_B0 : - mod->BSIM4v5b0 = value->rValue; - mod->BSIM4v5b0Given = TRUE; - break; - case BSIM4v5_MOD_B1 : - mod->BSIM4v5b1 = value->rValue; - mod->BSIM4v5b1Given = TRUE; - break; - case BSIM4v5_MOD_ALPHA0 : - mod->BSIM4v5alpha0 = value->rValue; - mod->BSIM4v5alpha0Given = TRUE; - break; - case BSIM4v5_MOD_ALPHA1 : - mod->BSIM4v5alpha1 = value->rValue; - mod->BSIM4v5alpha1Given = TRUE; - break; - case BSIM4v5_MOD_AGIDL : - mod->BSIM4v5agidl = value->rValue; - mod->BSIM4v5agidlGiven = TRUE; - break; - case BSIM4v5_MOD_BGIDL : - mod->BSIM4v5bgidl = value->rValue; - mod->BSIM4v5bgidlGiven = TRUE; - break; - case BSIM4v5_MOD_CGIDL : - mod->BSIM4v5cgidl = value->rValue; - mod->BSIM4v5cgidlGiven = TRUE; - break; - case BSIM4v5_MOD_PHIN : - mod->BSIM4v5phin = value->rValue; - mod->BSIM4v5phinGiven = TRUE; - break; - case BSIM4v5_MOD_EGIDL : - mod->BSIM4v5egidl = value->rValue; - mod->BSIM4v5egidlGiven = TRUE; - break; - case BSIM4v5_MOD_AIGC : - mod->BSIM4v5aigc = value->rValue; - mod->BSIM4v5aigcGiven = TRUE; - break; - case BSIM4v5_MOD_BIGC : - mod->BSIM4v5bigc = value->rValue; - mod->BSIM4v5bigcGiven = TRUE; - break; - case BSIM4v5_MOD_CIGC : - mod->BSIM4v5cigc = value->rValue; - mod->BSIM4v5cigcGiven = TRUE; - break; - case BSIM4v5_MOD_AIGSD : - mod->BSIM4v5aigsd = value->rValue; - mod->BSIM4v5aigsdGiven = TRUE; - break; - case BSIM4v5_MOD_BIGSD : - mod->BSIM4v5bigsd = value->rValue; - mod->BSIM4v5bigsdGiven = TRUE; - break; - case BSIM4v5_MOD_CIGSD : - mod->BSIM4v5cigsd = value->rValue; - mod->BSIM4v5cigsdGiven = TRUE; - break; - case BSIM4v5_MOD_AIGBACC : - mod->BSIM4v5aigbacc = value->rValue; - mod->BSIM4v5aigbaccGiven = TRUE; - break; - case BSIM4v5_MOD_BIGBACC : - mod->BSIM4v5bigbacc = value->rValue; - mod->BSIM4v5bigbaccGiven = TRUE; - break; - case BSIM4v5_MOD_CIGBACC : - mod->BSIM4v5cigbacc = value->rValue; - mod->BSIM4v5cigbaccGiven = TRUE; - break; - case BSIM4v5_MOD_AIGBINV : - mod->BSIM4v5aigbinv = value->rValue; - mod->BSIM4v5aigbinvGiven = TRUE; - break; - case BSIM4v5_MOD_BIGBINV : - mod->BSIM4v5bigbinv = value->rValue; - mod->BSIM4v5bigbinvGiven = TRUE; - break; - case BSIM4v5_MOD_CIGBINV : - mod->BSIM4v5cigbinv = value->rValue; - mod->BSIM4v5cigbinvGiven = TRUE; - break; - case BSIM4v5_MOD_NIGC : - mod->BSIM4v5nigc = value->rValue; - mod->BSIM4v5nigcGiven = TRUE; - break; - case BSIM4v5_MOD_NIGBINV : - mod->BSIM4v5nigbinv = value->rValue; - mod->BSIM4v5nigbinvGiven = TRUE; - break; - case BSIM4v5_MOD_NIGBACC : - mod->BSIM4v5nigbacc = value->rValue; - mod->BSIM4v5nigbaccGiven = TRUE; - break; - case BSIM4v5_MOD_NTOX : - mod->BSIM4v5ntox = value->rValue; - mod->BSIM4v5ntoxGiven = TRUE; - break; - case BSIM4v5_MOD_EIGBINV : - mod->BSIM4v5eigbinv = value->rValue; - mod->BSIM4v5eigbinvGiven = TRUE; - break; - case BSIM4v5_MOD_PIGCD : - mod->BSIM4v5pigcd = value->rValue; - mod->BSIM4v5pigcdGiven = TRUE; - break; - case BSIM4v5_MOD_POXEDGE : - mod->BSIM4v5poxedge = value->rValue; - mod->BSIM4v5poxedgeGiven = TRUE; - break; - case BSIM4v5_MOD_XRCRG1 : - mod->BSIM4v5xrcrg1 = value->rValue; - mod->BSIM4v5xrcrg1Given = TRUE; - break; - case BSIM4v5_MOD_XRCRG2 : - mod->BSIM4v5xrcrg2 = value->rValue; - mod->BSIM4v5xrcrg2Given = TRUE; - break; - case BSIM4v5_MOD_LAMBDA : - mod->BSIM4v5lambda = value->rValue; - mod->BSIM4v5lambdaGiven = TRUE; - break; - case BSIM4v5_MOD_VTL : - mod->BSIM4v5vtl = value->rValue; - mod->BSIM4v5vtlGiven = TRUE; - break; - case BSIM4v5_MOD_XN: - mod->BSIM4v5xn = value->rValue; - mod->BSIM4v5xnGiven = TRUE; - break; - case BSIM4v5_MOD_LC: - mod->BSIM4v5lc = value->rValue; - mod->BSIM4v5lcGiven = TRUE; - break; - case BSIM4v5_MOD_TNOIA : - mod->BSIM4v5tnoia = value->rValue; - mod->BSIM4v5tnoiaGiven = TRUE; - break; - case BSIM4v5_MOD_TNOIB : - mod->BSIM4v5tnoib = value->rValue; - mod->BSIM4v5tnoibGiven = TRUE; - break; - case BSIM4v5_MOD_RNOIA : - mod->BSIM4v5rnoia = value->rValue; - mod->BSIM4v5rnoiaGiven = TRUE; - break; - case BSIM4v5_MOD_RNOIB : - mod->BSIM4v5rnoib = value->rValue; - mod->BSIM4v5rnoibGiven = TRUE; - break; - case BSIM4v5_MOD_NTNOI : - mod->BSIM4v5ntnoi = value->rValue; - mod->BSIM4v5ntnoiGiven = TRUE; - break; - case BSIM4v5_MOD_VFBSDOFF: - mod->BSIM4v5vfbsdoff = value->rValue; - mod->BSIM4v5vfbsdoffGiven = TRUE; - break; - case BSIM4v5_MOD_TVFBSDOFF: - mod->BSIM4v5tvfbsdoff = value->rValue; - mod->BSIM4v5tvfbsdoffGiven = TRUE; - break; - case BSIM4v5_MOD_LINTNOI: - mod->BSIM4v5lintnoi = value->rValue; - mod->BSIM4v5lintnoiGiven = TRUE; - break; - - /* stress effect */ - case BSIM4v5_MOD_SAREF : - mod->BSIM4v5saref = value->rValue; - mod->BSIM4v5sarefGiven = TRUE; - break; - case BSIM4v5_MOD_SBREF : - mod->BSIM4v5sbref = value->rValue; - mod->BSIM4v5sbrefGiven = TRUE; - break; - case BSIM4v5_MOD_WLOD : - mod->BSIM4v5wlod = value->rValue; - mod->BSIM4v5wlodGiven = TRUE; - break; - case BSIM4v5_MOD_KU0 : - mod->BSIM4v5ku0 = value->rValue; - mod->BSIM4v5ku0Given = TRUE; - break; - case BSIM4v5_MOD_KVSAT : - mod->BSIM4v5kvsat = value->rValue; - mod->BSIM4v5kvsatGiven = TRUE; - break; - case BSIM4v5_MOD_KVTH0 : - mod->BSIM4v5kvth0 = value->rValue; - mod->BSIM4v5kvth0Given = TRUE; - break; - case BSIM4v5_MOD_TKU0 : - mod->BSIM4v5tku0 = value->rValue; - mod->BSIM4v5tku0Given = TRUE; - break; - case BSIM4v5_MOD_LLODKU0 : - mod->BSIM4v5llodku0 = value->rValue; - mod->BSIM4v5llodku0Given = TRUE; - break; - case BSIM4v5_MOD_WLODKU0 : - mod->BSIM4v5wlodku0 = value->rValue; - mod->BSIM4v5wlodku0Given = TRUE; - break; - case BSIM4v5_MOD_LLODVTH : - mod->BSIM4v5llodvth = value->rValue; - mod->BSIM4v5llodvthGiven = TRUE; - break; - case BSIM4v5_MOD_WLODVTH : - mod->BSIM4v5wlodvth = value->rValue; - mod->BSIM4v5wlodvthGiven = TRUE; - break; - case BSIM4v5_MOD_LKU0 : - mod->BSIM4v5lku0 = value->rValue; - mod->BSIM4v5lku0Given = TRUE; - break; - case BSIM4v5_MOD_WKU0 : - mod->BSIM4v5wku0 = value->rValue; - mod->BSIM4v5wku0Given = TRUE; - break; - case BSIM4v5_MOD_PKU0 : - mod->BSIM4v5pku0 = value->rValue; - mod->BSIM4v5pku0Given = TRUE; - break; - case BSIM4v5_MOD_LKVTH0 : - mod->BSIM4v5lkvth0 = value->rValue; - mod->BSIM4v5lkvth0Given = TRUE; - break; - case BSIM4v5_MOD_WKVTH0 : - mod->BSIM4v5wkvth0 = value->rValue; - mod->BSIM4v5wkvth0Given = TRUE; - break; - case BSIM4v5_MOD_PKVTH0 : - mod->BSIM4v5pkvth0 = value->rValue; - mod->BSIM4v5pkvth0Given = TRUE; - break; - case BSIM4v5_MOD_STK2 : - mod->BSIM4v5stk2 = value->rValue; - mod->BSIM4v5stk2Given = TRUE; - break; - case BSIM4v5_MOD_LODK2 : - mod->BSIM4v5lodk2 = value->rValue; - mod->BSIM4v5lodk2Given = TRUE; - break; - case BSIM4v5_MOD_STETA0 : - mod->BSIM4v5steta0 = value->rValue; - mod->BSIM4v5steta0Given = TRUE; - break; - case BSIM4v5_MOD_LODETA0 : - mod->BSIM4v5lodeta0 = value->rValue; - mod->BSIM4v5lodeta0Given = TRUE; - break; - - case BSIM4v5_MOD_WEB : - mod->BSIM4v5web = value->rValue; - mod->BSIM4v5webGiven = TRUE; - break; - case BSIM4v5_MOD_WEC : - mod->BSIM4v5wec = value->rValue; - mod->BSIM4v5wecGiven = TRUE; - break; - case BSIM4v5_MOD_KVTH0WE : - mod->BSIM4v5kvth0we = value->rValue; - mod->BSIM4v5kvth0weGiven = TRUE; - break; - case BSIM4v5_MOD_K2WE : - mod->BSIM4v5k2we = value->rValue; - mod->BSIM4v5k2weGiven = TRUE; - break; - case BSIM4v5_MOD_KU0WE : - mod->BSIM4v5ku0we = value->rValue; - mod->BSIM4v5ku0weGiven = TRUE; - break; - case BSIM4v5_MOD_SCREF : - mod->BSIM4v5scref = value->rValue; - mod->BSIM4v5screfGiven = TRUE; - break; - case BSIM4v5_MOD_WPEMOD : - mod->BSIM4v5wpemod = value->rValue; - mod->BSIM4v5wpemodGiven = TRUE; - break; - case BSIM4v5_MOD_LKVTH0WE : - mod->BSIM4v5lkvth0we = value->rValue; - mod->BSIM4v5lkvth0weGiven = TRUE; - break; - case BSIM4v5_MOD_LK2WE : - mod->BSIM4v5lk2we = value->rValue; - mod->BSIM4v5lk2weGiven = TRUE; - break; - case BSIM4v5_MOD_LKU0WE : - mod->BSIM4v5lku0we = value->rValue; - mod->BSIM4v5lku0weGiven = TRUE; - break; - case BSIM4v5_MOD_WKVTH0WE : - mod->BSIM4v5wkvth0we = value->rValue; - mod->BSIM4v5wkvth0weGiven = TRUE; - break; - case BSIM4v5_MOD_WK2WE : - mod->BSIM4v5wk2we = value->rValue; - mod->BSIM4v5wk2weGiven = TRUE; - break; - case BSIM4v5_MOD_WKU0WE : - mod->BSIM4v5wku0we = value->rValue; - mod->BSIM4v5wku0weGiven = TRUE; - break; - case BSIM4v5_MOD_PKVTH0WE : - mod->BSIM4v5pkvth0we = value->rValue; - mod->BSIM4v5pkvth0weGiven = TRUE; - break; - case BSIM4v5_MOD_PK2WE : - mod->BSIM4v5pk2we = value->rValue; - mod->BSIM4v5pk2weGiven = TRUE; - break; - case BSIM4v5_MOD_PKU0WE : - mod->BSIM4v5pku0we = value->rValue; - mod->BSIM4v5pku0weGiven = TRUE; - break; - - case BSIM4v5_MOD_BETA0 : - mod->BSIM4v5beta0 = value->rValue; - mod->BSIM4v5beta0Given = TRUE; - break; - case BSIM4v5_MOD_IJTHDFWD : - mod->BSIM4v5ijthdfwd = value->rValue; - mod->BSIM4v5ijthdfwdGiven = TRUE; - break; - case BSIM4v5_MOD_IJTHSFWD : - mod->BSIM4v5ijthsfwd = value->rValue; - mod->BSIM4v5ijthsfwdGiven = TRUE; - break; - case BSIM4v5_MOD_IJTHDREV : - mod->BSIM4v5ijthdrev = value->rValue; - mod->BSIM4v5ijthdrevGiven = TRUE; - break; - case BSIM4v5_MOD_IJTHSREV : - mod->BSIM4v5ijthsrev = value->rValue; - mod->BSIM4v5ijthsrevGiven = TRUE; - break; - case BSIM4v5_MOD_XJBVD : - mod->BSIM4v5xjbvd = value->rValue; - mod->BSIM4v5xjbvdGiven = TRUE; - break; - case BSIM4v5_MOD_XJBVS : - mod->BSIM4v5xjbvs = value->rValue; - mod->BSIM4v5xjbvsGiven = TRUE; - break; - case BSIM4v5_MOD_BVD : - mod->BSIM4v5bvd = value->rValue; - mod->BSIM4v5bvdGiven = TRUE; - break; - case BSIM4v5_MOD_BVS : - mod->BSIM4v5bvs = value->rValue; - mod->BSIM4v5bvsGiven = TRUE; - break; - - /* reverse diode */ - case BSIM4v5_MOD_JTSS : - mod->BSIM4v5jtss = value->rValue; - mod->BSIM4v5jtssGiven = TRUE; - break; - case BSIM4v5_MOD_JTSD : - mod->BSIM4v5jtsd = value->rValue; - mod->BSIM4v5jtsdGiven = TRUE; - break; - case BSIM4v5_MOD_JTSSWS : - mod->BSIM4v5jtssws = value->rValue; - mod->BSIM4v5jtsswsGiven = TRUE; - break; - case BSIM4v5_MOD_JTSSWD : - mod->BSIM4v5jtsswd = value->rValue; - mod->BSIM4v5jtsswdGiven = TRUE; - break; - case BSIM4v5_MOD_JTSSWGS : - mod->BSIM4v5jtsswgs = value->rValue; - mod->BSIM4v5jtsswgsGiven = TRUE; - break; - case BSIM4v5_MOD_JTSSWGD : - mod->BSIM4v5jtsswgd = value->rValue; - mod->BSIM4v5jtsswgdGiven = TRUE; - break; - case BSIM4v5_MOD_NJTS : - mod->BSIM4v5njts = value->rValue; - mod->BSIM4v5njtsGiven = TRUE; - break; - case BSIM4v5_MOD_NJTSSW : - mod->BSIM4v5njtssw = value->rValue; - mod->BSIM4v5njtsswGiven = TRUE; - break; - case BSIM4v5_MOD_NJTSSWG : - mod->BSIM4v5njtsswg = value->rValue; - mod->BSIM4v5njtsswgGiven = TRUE; - break; - case BSIM4v5_MOD_XTSS : - mod->BSIM4v5xtss = value->rValue; - mod->BSIM4v5xtssGiven = TRUE; - break; - case BSIM4v5_MOD_XTSD : - mod->BSIM4v5xtsd = value->rValue; - mod->BSIM4v5xtsdGiven = TRUE; - break; - case BSIM4v5_MOD_XTSSWS : - mod->BSIM4v5xtssws = value->rValue; - mod->BSIM4v5xtsswsGiven = TRUE; - break; - case BSIM4v5_MOD_XTSSWD : - mod->BSIM4v5xtsswd = value->rValue; - mod->BSIM4v5xtsswdGiven = TRUE; - break; - case BSIM4v5_MOD_XTSSWGS : - mod->BSIM4v5xtsswgs = value->rValue; - mod->BSIM4v5xtsswgsGiven = TRUE; - break; - case BSIM4v5_MOD_XTSSWGD : - mod->BSIM4v5xtsswgd = value->rValue; - mod->BSIM4v5xtsswgdGiven = TRUE; - break; - case BSIM4v5_MOD_TNJTS : - mod->BSIM4v5tnjts = value->rValue; - mod->BSIM4v5tnjtsGiven = TRUE; - break; - case BSIM4v5_MOD_TNJTSSW : - mod->BSIM4v5tnjtssw = value->rValue; - mod->BSIM4v5tnjtsswGiven = TRUE; - break; - case BSIM4v5_MOD_TNJTSSWG : - mod->BSIM4v5tnjtsswg = value->rValue; - mod->BSIM4v5tnjtsswgGiven = TRUE; - break; - case BSIM4v5_MOD_VTSS : - mod->BSIM4v5vtss = value->rValue; - mod->BSIM4v5vtssGiven = TRUE; - break; - case BSIM4v5_MOD_VTSD : - mod->BSIM4v5vtsd = value->rValue; - mod->BSIM4v5vtsdGiven = TRUE; - break; - case BSIM4v5_MOD_VTSSWS : - mod->BSIM4v5vtssws = value->rValue; - mod->BSIM4v5vtsswsGiven = TRUE; - break; - case BSIM4v5_MOD_VTSSWD : - mod->BSIM4v5vtsswd = value->rValue; - mod->BSIM4v5vtsswdGiven = TRUE; - break; - case BSIM4v5_MOD_VTSSWGS : - mod->BSIM4v5vtsswgs = value->rValue; - mod->BSIM4v5vtsswgsGiven = TRUE; - break; - case BSIM4v5_MOD_VTSSWGD : - mod->BSIM4v5vtsswgd = value->rValue; - mod->BSIM4v5vtsswgdGiven = TRUE; - break; - - case BSIM4v5_MOD_VFB : - mod->BSIM4v5vfb = value->rValue; - mod->BSIM4v5vfbGiven = TRUE; - break; - - case BSIM4v5_MOD_GBMIN : - mod->BSIM4v5gbmin = value->rValue; - mod->BSIM4v5gbminGiven = TRUE; - break; - case BSIM4v5_MOD_RBDB : - mod->BSIM4v5rbdb = value->rValue; - mod->BSIM4v5rbdbGiven = TRUE; - break; - case BSIM4v5_MOD_RBPB : - mod->BSIM4v5rbpb = value->rValue; - mod->BSIM4v5rbpbGiven = TRUE; - break; - case BSIM4v5_MOD_RBSB : - mod->BSIM4v5rbsb = value->rValue; - mod->BSIM4v5rbsbGiven = TRUE; - break; - case BSIM4v5_MOD_RBPS : - mod->BSIM4v5rbps = value->rValue; - mod->BSIM4v5rbpsGiven = TRUE; - break; - case BSIM4v5_MOD_RBPD : - mod->BSIM4v5rbpd = value->rValue; - mod->BSIM4v5rbpdGiven = TRUE; - break; - - case BSIM4v5_MOD_RBPS0 : - mod->BSIM4v5rbps0 = value->rValue; - mod->BSIM4v5rbps0Given = TRUE; - break; - case BSIM4v5_MOD_RBPSL : - mod->BSIM4v5rbpsl = value->rValue; - mod->BSIM4v5rbpslGiven = TRUE; - break; - case BSIM4v5_MOD_RBPSW : - mod->BSIM4v5rbpsw = value->rValue; - mod->BSIM4v5rbpswGiven = TRUE; - break; - case BSIM4v5_MOD_RBPSNF : - mod->BSIM4v5rbpsnf = value->rValue; - mod->BSIM4v5rbpsnfGiven = TRUE; - break; - - case BSIM4v5_MOD_RBPD0 : - mod->BSIM4v5rbpd0 = value->rValue; - mod->BSIM4v5rbpd0Given = TRUE; - break; - case BSIM4v5_MOD_RBPDL : - mod->BSIM4v5rbpdl = value->rValue; - mod->BSIM4v5rbpdlGiven = TRUE; - break; - case BSIM4v5_MOD_RBPDW : - mod->BSIM4v5rbpdw = value->rValue; - mod->BSIM4v5rbpdwGiven = TRUE; - break; - case BSIM4v5_MOD_RBPDNF : - mod->BSIM4v5rbpdnf = value->rValue; - mod->BSIM4v5rbpdnfGiven = TRUE; - break; - - case BSIM4v5_MOD_RBPBX0 : - mod->BSIM4v5rbpbx0 = value->rValue; - mod->BSIM4v5rbpbx0Given = TRUE; - break; - case BSIM4v5_MOD_RBPBXL : - mod->BSIM4v5rbpbxl = value->rValue; - mod->BSIM4v5rbpbxlGiven = TRUE; - break; - case BSIM4v5_MOD_RBPBXW : - mod->BSIM4v5rbpbxw = value->rValue; - mod->BSIM4v5rbpbxwGiven = TRUE; - break; - case BSIM4v5_MOD_RBPBXNF : - mod->BSIM4v5rbpbxnf = value->rValue; - mod->BSIM4v5rbpbxnfGiven = TRUE; - break; - case BSIM4v5_MOD_RBPBY0 : - mod->BSIM4v5rbpby0 = value->rValue; - mod->BSIM4v5rbpby0Given = TRUE; - break; - case BSIM4v5_MOD_RBPBYL : - mod->BSIM4v5rbpbyl = value->rValue; - mod->BSIM4v5rbpbylGiven = TRUE; - break; - case BSIM4v5_MOD_RBPBYW : - mod->BSIM4v5rbpbyw = value->rValue; - mod->BSIM4v5rbpbywGiven = TRUE; - break; - case BSIM4v5_MOD_RBPBYNF : - mod->BSIM4v5rbpbynf = value->rValue; - mod->BSIM4v5rbpbynfGiven = TRUE; - break; - case BSIM4v5_MOD_RBSBX0 : - mod->BSIM4v5rbsbx0 = value->rValue; - mod->BSIM4v5rbsbx0Given = TRUE; - break; - case BSIM4v5_MOD_RBSBY0 : - mod->BSIM4v5rbsby0 = value->rValue; - mod->BSIM4v5rbsby0Given = TRUE; - break; - case BSIM4v5_MOD_RBDBX0 : - mod->BSIM4v5rbdbx0 = value->rValue; - mod->BSIM4v5rbdbx0Given = TRUE; - break; - case BSIM4v5_MOD_RBDBY0 : - mod->BSIM4v5rbdby0 = value->rValue; - mod->BSIM4v5rbdby0Given = TRUE; - break; - - - case BSIM4v5_MOD_RBSDBXL : - mod->BSIM4v5rbsdbxl = value->rValue; - mod->BSIM4v5rbsdbxlGiven = TRUE; - break; - case BSIM4v5_MOD_RBSDBXW : - mod->BSIM4v5rbsdbxw = value->rValue; - mod->BSIM4v5rbsdbxwGiven = TRUE; - break; - case BSIM4v5_MOD_RBSDBXNF : - mod->BSIM4v5rbsdbxnf = value->rValue; - mod->BSIM4v5rbsdbxnfGiven = TRUE; - break; - case BSIM4v5_MOD_RBSDBYL : - mod->BSIM4v5rbsdbyl = value->rValue; - mod->BSIM4v5rbsdbylGiven = TRUE; - break; - case BSIM4v5_MOD_RBSDBYW : - mod->BSIM4v5rbsdbyw = value->rValue; - mod->BSIM4v5rbsdbywGiven = TRUE; - break; - case BSIM4v5_MOD_RBSDBYNF : - mod->BSIM4v5rbsdbynf = value->rValue; - mod->BSIM4v5rbsdbynfGiven = TRUE; - break; - - case BSIM4v5_MOD_CGSL : - mod->BSIM4v5cgsl = value->rValue; - mod->BSIM4v5cgslGiven = TRUE; - break; - case BSIM4v5_MOD_CGDL : - mod->BSIM4v5cgdl = value->rValue; - mod->BSIM4v5cgdlGiven = TRUE; - break; - case BSIM4v5_MOD_CKAPPAS : - mod->BSIM4v5ckappas = value->rValue; - mod->BSIM4v5ckappasGiven = TRUE; - break; - case BSIM4v5_MOD_CKAPPAD : - mod->BSIM4v5ckappad = value->rValue; - mod->BSIM4v5ckappadGiven = TRUE; - break; - case BSIM4v5_MOD_CF : - mod->BSIM4v5cf = value->rValue; - mod->BSIM4v5cfGiven = TRUE; - break; - case BSIM4v5_MOD_CLC : - mod->BSIM4v5clc = value->rValue; - mod->BSIM4v5clcGiven = TRUE; - break; - case BSIM4v5_MOD_CLE : - mod->BSIM4v5cle = value->rValue; - mod->BSIM4v5cleGiven = TRUE; - break; - case BSIM4v5_MOD_DWC : - mod->BSIM4v5dwc = value->rValue; - mod->BSIM4v5dwcGiven = TRUE; - break; - case BSIM4v5_MOD_DLC : - mod->BSIM4v5dlc = value->rValue; - mod->BSIM4v5dlcGiven = TRUE; - break; - case BSIM4v5_MOD_XW : - mod->BSIM4v5xw = value->rValue; - mod->BSIM4v5xwGiven = TRUE; - break; - case BSIM4v5_MOD_XL : - mod->BSIM4v5xl = value->rValue; - mod->BSIM4v5xlGiven = TRUE; - break; - case BSIM4v5_MOD_DLCIG : - mod->BSIM4v5dlcig = value->rValue; - mod->BSIM4v5dlcigGiven = TRUE; - break; - case BSIM4v5_MOD_DWJ : - mod->BSIM4v5dwj = value->rValue; - mod->BSIM4v5dwjGiven = TRUE; - break; - case BSIM4v5_MOD_VFBCV : - mod->BSIM4v5vfbcv = value->rValue; - mod->BSIM4v5vfbcvGiven = TRUE; - break; - case BSIM4v5_MOD_ACDE : - mod->BSIM4v5acde = value->rValue; - mod->BSIM4v5acdeGiven = TRUE; - break; - case BSIM4v5_MOD_MOIN : - mod->BSIM4v5moin = value->rValue; - mod->BSIM4v5moinGiven = TRUE; - break; - case BSIM4v5_MOD_NOFF : - mod->BSIM4v5noff = value->rValue; - mod->BSIM4v5noffGiven = TRUE; - break; - case BSIM4v5_MOD_VOFFCV : - mod->BSIM4v5voffcv = value->rValue; - mod->BSIM4v5voffcvGiven = TRUE; - break; - case BSIM4v5_MOD_DMCG : - mod->BSIM4v5dmcg = value->rValue; - mod->BSIM4v5dmcgGiven = TRUE; - break; - case BSIM4v5_MOD_DMCI : - mod->BSIM4v5dmci = value->rValue; - mod->BSIM4v5dmciGiven = TRUE; - break; - case BSIM4v5_MOD_DMDG : - mod->BSIM4v5dmdg = value->rValue; - mod->BSIM4v5dmdgGiven = TRUE; - break; - case BSIM4v5_MOD_DMCGT : - mod->BSIM4v5dmcgt = value->rValue; - mod->BSIM4v5dmcgtGiven = TRUE; - break; - case BSIM4v5_MOD_XGW : - mod->BSIM4v5xgw = value->rValue; - mod->BSIM4v5xgwGiven = TRUE; - break; - case BSIM4v5_MOD_XGL : - mod->BSIM4v5xgl = value->rValue; - mod->BSIM4v5xglGiven = TRUE; - break; - case BSIM4v5_MOD_RSHG : - mod->BSIM4v5rshg = value->rValue; - mod->BSIM4v5rshgGiven = TRUE; - break; - case BSIM4v5_MOD_NGCON : - mod->BSIM4v5ngcon = value->rValue; - mod->BSIM4v5ngconGiven = TRUE; - break; - case BSIM4v5_MOD_TCJ : - mod->BSIM4v5tcj = value->rValue; - mod->BSIM4v5tcjGiven = TRUE; - break; - case BSIM4v5_MOD_TPB : - mod->BSIM4v5tpb = value->rValue; - mod->BSIM4v5tpbGiven = TRUE; - break; - case BSIM4v5_MOD_TCJSW : - mod->BSIM4v5tcjsw = value->rValue; - mod->BSIM4v5tcjswGiven = TRUE; - break; - case BSIM4v5_MOD_TPBSW : - mod->BSIM4v5tpbsw = value->rValue; - mod->BSIM4v5tpbswGiven = TRUE; - break; - case BSIM4v5_MOD_TCJSWG : - mod->BSIM4v5tcjswg = value->rValue; - mod->BSIM4v5tcjswgGiven = TRUE; - break; - case BSIM4v5_MOD_TPBSWG : - mod->BSIM4v5tpbswg = value->rValue; - mod->BSIM4v5tpbswgGiven = TRUE; - break; - - /* Length dependence */ - case BSIM4v5_MOD_LCDSC : - mod->BSIM4v5lcdsc = value->rValue; - mod->BSIM4v5lcdscGiven = TRUE; - break; - - - case BSIM4v5_MOD_LCDSCB : - mod->BSIM4v5lcdscb = value->rValue; - mod->BSIM4v5lcdscbGiven = TRUE; - break; - case BSIM4v5_MOD_LCDSCD : - mod->BSIM4v5lcdscd = value->rValue; - mod->BSIM4v5lcdscdGiven = TRUE; - break; - case BSIM4v5_MOD_LCIT : - mod->BSIM4v5lcit = value->rValue; - mod->BSIM4v5lcitGiven = TRUE; - break; - case BSIM4v5_MOD_LNFACTOR : - mod->BSIM4v5lnfactor = value->rValue; - mod->BSIM4v5lnfactorGiven = TRUE; - break; - case BSIM4v5_MOD_LXJ: - mod->BSIM4v5lxj = value->rValue; - mod->BSIM4v5lxjGiven = TRUE; - break; - case BSIM4v5_MOD_LVSAT: - mod->BSIM4v5lvsat = value->rValue; - mod->BSIM4v5lvsatGiven = TRUE; - break; - - - case BSIM4v5_MOD_LA0: - mod->BSIM4v5la0 = value->rValue; - mod->BSIM4v5la0Given = TRUE; - break; - case BSIM4v5_MOD_LAGS: - mod->BSIM4v5lags = value->rValue; - mod->BSIM4v5lagsGiven = TRUE; - break; - case BSIM4v5_MOD_LA1: - mod->BSIM4v5la1 = value->rValue; - mod->BSIM4v5la1Given = TRUE; - break; - case BSIM4v5_MOD_LA2: - mod->BSIM4v5la2 = value->rValue; - mod->BSIM4v5la2Given = TRUE; - break; - case BSIM4v5_MOD_LAT: - mod->BSIM4v5lat = value->rValue; - mod->BSIM4v5latGiven = TRUE; - break; - case BSIM4v5_MOD_LKETA: - mod->BSIM4v5lketa = value->rValue; - mod->BSIM4v5lketaGiven = TRUE; - break; - case BSIM4v5_MOD_LNSUB: - mod->BSIM4v5lnsub = value->rValue; - mod->BSIM4v5lnsubGiven = TRUE; - break; - case BSIM4v5_MOD_LNDEP: - mod->BSIM4v5lndep = value->rValue; - mod->BSIM4v5lndepGiven = TRUE; - if (mod->BSIM4v5lndep > 1.0e20) - mod->BSIM4v5lndep *= 1.0e-6; - break; - case BSIM4v5_MOD_LNSD: - mod->BSIM4v5lnsd = value->rValue; - mod->BSIM4v5lnsdGiven = TRUE; - if (mod->BSIM4v5lnsd > 1.0e23) - mod->BSIM4v5lnsd *= 1.0e-6; - break; - case BSIM4v5_MOD_LNGATE: - mod->BSIM4v5lngate = value->rValue; - mod->BSIM4v5lngateGiven = TRUE; - if (mod->BSIM4v5lngate > 1.0e23) - mod->BSIM4v5lngate *= 1.0e-6; - break; - case BSIM4v5_MOD_LGAMMA1: - mod->BSIM4v5lgamma1 = value->rValue; - mod->BSIM4v5lgamma1Given = TRUE; - break; - case BSIM4v5_MOD_LGAMMA2: - mod->BSIM4v5lgamma2 = value->rValue; - mod->BSIM4v5lgamma2Given = TRUE; - break; - case BSIM4v5_MOD_LVBX: - mod->BSIM4v5lvbx = value->rValue; - mod->BSIM4v5lvbxGiven = TRUE; - break; - case BSIM4v5_MOD_LVBM: - mod->BSIM4v5lvbm = value->rValue; - mod->BSIM4v5lvbmGiven = TRUE; - break; - case BSIM4v5_MOD_LXT: - mod->BSIM4v5lxt = value->rValue; - mod->BSIM4v5lxtGiven = TRUE; - break; - case BSIM4v5_MOD_LK1: - mod->BSIM4v5lk1 = value->rValue; - mod->BSIM4v5lk1Given = TRUE; - break; - case BSIM4v5_MOD_LKT1: - mod->BSIM4v5lkt1 = value->rValue; - mod->BSIM4v5lkt1Given = TRUE; - break; - case BSIM4v5_MOD_LKT1L: - mod->BSIM4v5lkt1l = value->rValue; - mod->BSIM4v5lkt1lGiven = TRUE; - break; - case BSIM4v5_MOD_LKT2: - mod->BSIM4v5lkt2 = value->rValue; - mod->BSIM4v5lkt2Given = TRUE; - break; - case BSIM4v5_MOD_LK2: - mod->BSIM4v5lk2 = value->rValue; - mod->BSIM4v5lk2Given = TRUE; - break; - case BSIM4v5_MOD_LK3: - mod->BSIM4v5lk3 = value->rValue; - mod->BSIM4v5lk3Given = TRUE; - break; - case BSIM4v5_MOD_LK3B: - mod->BSIM4v5lk3b = value->rValue; - mod->BSIM4v5lk3bGiven = TRUE; - break; - case BSIM4v5_MOD_LLPE0: - mod->BSIM4v5llpe0 = value->rValue; - mod->BSIM4v5llpe0Given = TRUE; - break; - case BSIM4v5_MOD_LLPEB: - mod->BSIM4v5llpeb = value->rValue; - mod->BSIM4v5llpebGiven = TRUE; - break; - case BSIM4v5_MOD_LDVTP0: - mod->BSIM4v5ldvtp0 = value->rValue; - mod->BSIM4v5ldvtp0Given = TRUE; - break; - case BSIM4v5_MOD_LDVTP1: - mod->BSIM4v5ldvtp1 = value->rValue; - mod->BSIM4v5ldvtp1Given = TRUE; - break; - case BSIM4v5_MOD_LW0: - mod->BSIM4v5lw0 = value->rValue; - mod->BSIM4v5lw0Given = TRUE; - break; - case BSIM4v5_MOD_LDVT0: - mod->BSIM4v5ldvt0 = value->rValue; - mod->BSIM4v5ldvt0Given = TRUE; - break; - case BSIM4v5_MOD_LDVT1: - mod->BSIM4v5ldvt1 = value->rValue; - mod->BSIM4v5ldvt1Given = TRUE; - break; - case BSIM4v5_MOD_LDVT2: - mod->BSIM4v5ldvt2 = value->rValue; - mod->BSIM4v5ldvt2Given = TRUE; - break; - case BSIM4v5_MOD_LDVT0W: - mod->BSIM4v5ldvt0w = value->rValue; - mod->BSIM4v5ldvt0wGiven = TRUE; - break; - case BSIM4v5_MOD_LDVT1W: - mod->BSIM4v5ldvt1w = value->rValue; - mod->BSIM4v5ldvt1wGiven = TRUE; - break; - case BSIM4v5_MOD_LDVT2W: - mod->BSIM4v5ldvt2w = value->rValue; - mod->BSIM4v5ldvt2wGiven = TRUE; - break; - case BSIM4v5_MOD_LDROUT: - mod->BSIM4v5ldrout = value->rValue; - mod->BSIM4v5ldroutGiven = TRUE; - break; - case BSIM4v5_MOD_LDSUB: - mod->BSIM4v5ldsub = value->rValue; - mod->BSIM4v5ldsubGiven = TRUE; - break; - case BSIM4v5_MOD_LVTH0: - mod->BSIM4v5lvth0 = value->rValue; - mod->BSIM4v5lvth0Given = TRUE; - break; - case BSIM4v5_MOD_LUA: - mod->BSIM4v5lua = value->rValue; - mod->BSIM4v5luaGiven = TRUE; - break; - case BSIM4v5_MOD_LUA1: - mod->BSIM4v5lua1 = value->rValue; - mod->BSIM4v5lua1Given = TRUE; - break; - case BSIM4v5_MOD_LUB: - mod->BSIM4v5lub = value->rValue; - mod->BSIM4v5lubGiven = TRUE; - break; - case BSIM4v5_MOD_LUB1: - mod->BSIM4v5lub1 = value->rValue; - mod->BSIM4v5lub1Given = TRUE; - break; - case BSIM4v5_MOD_LUC: - mod->BSIM4v5luc = value->rValue; - mod->BSIM4v5lucGiven = TRUE; - break; - case BSIM4v5_MOD_LUC1: - mod->BSIM4v5luc1 = value->rValue; - mod->BSIM4v5luc1Given = TRUE; - break; - case BSIM4v5_MOD_LU0 : - mod->BSIM4v5lu0 = value->rValue; - mod->BSIM4v5lu0Given = TRUE; - break; - case BSIM4v5_MOD_LUTE : - mod->BSIM4v5lute = value->rValue; - mod->BSIM4v5luteGiven = TRUE; - break; - case BSIM4v5_MOD_LVOFF: - mod->BSIM4v5lvoff = value->rValue; - mod->BSIM4v5lvoffGiven = TRUE; - break; - case BSIM4v5_MOD_LTVOFF: - mod->BSIM4v5ltvoff = value->rValue; - mod->BSIM4v5ltvoffGiven = TRUE; - break; - case BSIM4v5_MOD_LMINV: - mod->BSIM4v5lminv = value->rValue; - mod->BSIM4v5lminvGiven = TRUE; - break; - case BSIM4v5_MOD_LFPROUT: - mod->BSIM4v5lfprout = value->rValue; - mod->BSIM4v5lfproutGiven = TRUE; - break; - case BSIM4v5_MOD_LPDITS: - mod->BSIM4v5lpdits = value->rValue; - mod->BSIM4v5lpditsGiven = TRUE; - break; - case BSIM4v5_MOD_LPDITSD: - mod->BSIM4v5lpditsd = value->rValue; - mod->BSIM4v5lpditsdGiven = TRUE; - break; - case BSIM4v5_MOD_LDELTA : - mod->BSIM4v5ldelta = value->rValue; - mod->BSIM4v5ldeltaGiven = TRUE; - break; - case BSIM4v5_MOD_LRDSW: - mod->BSIM4v5lrdsw = value->rValue; - mod->BSIM4v5lrdswGiven = TRUE; - break; - case BSIM4v5_MOD_LRDW: - mod->BSIM4v5lrdw = value->rValue; - mod->BSIM4v5lrdwGiven = TRUE; - break; - case BSIM4v5_MOD_LRSW: - mod->BSIM4v5lrsw = value->rValue; - mod->BSIM4v5lrswGiven = TRUE; - break; - case BSIM4v5_MOD_LPRWB: - mod->BSIM4v5lprwb = value->rValue; - mod->BSIM4v5lprwbGiven = TRUE; - break; - case BSIM4v5_MOD_LPRWG: - mod->BSIM4v5lprwg = value->rValue; - mod->BSIM4v5lprwgGiven = TRUE; - break; - case BSIM4v5_MOD_LPRT: - mod->BSIM4v5lprt = value->rValue; - mod->BSIM4v5lprtGiven = TRUE; - break; - case BSIM4v5_MOD_LETA0: - mod->BSIM4v5leta0 = value->rValue; - mod->BSIM4v5leta0Given = TRUE; - break; - case BSIM4v5_MOD_LETAB: - mod->BSIM4v5letab = value->rValue; - mod->BSIM4v5letabGiven = TRUE; - break; - case BSIM4v5_MOD_LPCLM: - mod->BSIM4v5lpclm = value->rValue; - mod->BSIM4v5lpclmGiven = TRUE; - break; - case BSIM4v5_MOD_LPDIBL1: - mod->BSIM4v5lpdibl1 = value->rValue; - mod->BSIM4v5lpdibl1Given = TRUE; - break; - case BSIM4v5_MOD_LPDIBL2: - mod->BSIM4v5lpdibl2 = value->rValue; - mod->BSIM4v5lpdibl2Given = TRUE; - break; - case BSIM4v5_MOD_LPDIBLB: - mod->BSIM4v5lpdiblb = value->rValue; - mod->BSIM4v5lpdiblbGiven = TRUE; - break; - case BSIM4v5_MOD_LPSCBE1: - mod->BSIM4v5lpscbe1 = value->rValue; - mod->BSIM4v5lpscbe1Given = TRUE; - break; - case BSIM4v5_MOD_LPSCBE2: - mod->BSIM4v5lpscbe2 = value->rValue; - mod->BSIM4v5lpscbe2Given = TRUE; - break; - case BSIM4v5_MOD_LPVAG: - mod->BSIM4v5lpvag = value->rValue; - mod->BSIM4v5lpvagGiven = TRUE; - break; - case BSIM4v5_MOD_LWR : - mod->BSIM4v5lwr = value->rValue; - mod->BSIM4v5lwrGiven = TRUE; - break; - case BSIM4v5_MOD_LDWG : - mod->BSIM4v5ldwg = value->rValue; - mod->BSIM4v5ldwgGiven = TRUE; - break; - case BSIM4v5_MOD_LDWB : - mod->BSIM4v5ldwb = value->rValue; - mod->BSIM4v5ldwbGiven = TRUE; - break; - case BSIM4v5_MOD_LB0 : - mod->BSIM4v5lb0 = value->rValue; - mod->BSIM4v5lb0Given = TRUE; - break; - case BSIM4v5_MOD_LB1 : - mod->BSIM4v5lb1 = value->rValue; - mod->BSIM4v5lb1Given = TRUE; - break; - case BSIM4v5_MOD_LALPHA0 : - mod->BSIM4v5lalpha0 = value->rValue; - mod->BSIM4v5lalpha0Given = TRUE; - break; - case BSIM4v5_MOD_LALPHA1 : - mod->BSIM4v5lalpha1 = value->rValue; - mod->BSIM4v5lalpha1Given = TRUE; - break; - case BSIM4v5_MOD_LBETA0 : - mod->BSIM4v5lbeta0 = value->rValue; - mod->BSIM4v5lbeta0Given = TRUE; - break; - case BSIM4v5_MOD_LAGIDL : - mod->BSIM4v5lagidl = value->rValue; - mod->BSIM4v5lagidlGiven = TRUE; - break; - case BSIM4v5_MOD_LBGIDL : - mod->BSIM4v5lbgidl = value->rValue; - mod->BSIM4v5lbgidlGiven = TRUE; - break; - case BSIM4v5_MOD_LCGIDL : - mod->BSIM4v5lcgidl = value->rValue; - mod->BSIM4v5lcgidlGiven = TRUE; - break; - case BSIM4v5_MOD_LPHIN : - mod->BSIM4v5lphin = value->rValue; - mod->BSIM4v5lphinGiven = TRUE; - break; - case BSIM4v5_MOD_LEGIDL : - mod->BSIM4v5legidl = value->rValue; - mod->BSIM4v5legidlGiven = TRUE; - break; - case BSIM4v5_MOD_LAIGC : - mod->BSIM4v5laigc = value->rValue; - mod->BSIM4v5laigcGiven = TRUE; - break; - case BSIM4v5_MOD_LBIGC : - mod->BSIM4v5lbigc = value->rValue; - mod->BSIM4v5lbigcGiven = TRUE; - break; - case BSIM4v5_MOD_LCIGC : - mod->BSIM4v5lcigc = value->rValue; - mod->BSIM4v5lcigcGiven = TRUE; - break; - case BSIM4v5_MOD_LAIGSD : - mod->BSIM4v5laigsd = value->rValue; - mod->BSIM4v5laigsdGiven = TRUE; - break; - case BSIM4v5_MOD_LBIGSD : - mod->BSIM4v5lbigsd = value->rValue; - mod->BSIM4v5lbigsdGiven = TRUE; - break; - case BSIM4v5_MOD_LCIGSD : - mod->BSIM4v5lcigsd = value->rValue; - mod->BSIM4v5lcigsdGiven = TRUE; - break; - case BSIM4v5_MOD_LAIGBACC : - mod->BSIM4v5laigbacc = value->rValue; - mod->BSIM4v5laigbaccGiven = TRUE; - break; - case BSIM4v5_MOD_LBIGBACC : - mod->BSIM4v5lbigbacc = value->rValue; - mod->BSIM4v5lbigbaccGiven = TRUE; - break; - case BSIM4v5_MOD_LCIGBACC : - mod->BSIM4v5lcigbacc = value->rValue; - mod->BSIM4v5lcigbaccGiven = TRUE; - break; - case BSIM4v5_MOD_LAIGBINV : - mod->BSIM4v5laigbinv = value->rValue; - mod->BSIM4v5laigbinvGiven = TRUE; - break; - case BSIM4v5_MOD_LBIGBINV : - mod->BSIM4v5lbigbinv = value->rValue; - mod->BSIM4v5lbigbinvGiven = TRUE; - break; - case BSIM4v5_MOD_LCIGBINV : - mod->BSIM4v5lcigbinv = value->rValue; - mod->BSIM4v5lcigbinvGiven = TRUE; - break; - case BSIM4v5_MOD_LNIGC : - mod->BSIM4v5lnigc = value->rValue; - mod->BSIM4v5lnigcGiven = TRUE; - break; - case BSIM4v5_MOD_LNIGBINV : - mod->BSIM4v5lnigbinv = value->rValue; - mod->BSIM4v5lnigbinvGiven = TRUE; - break; - case BSIM4v5_MOD_LNIGBACC : - mod->BSIM4v5lnigbacc = value->rValue; - mod->BSIM4v5lnigbaccGiven = TRUE; - break; - case BSIM4v5_MOD_LNTOX : - mod->BSIM4v5lntox = value->rValue; - mod->BSIM4v5lntoxGiven = TRUE; - break; - case BSIM4v5_MOD_LEIGBINV : - mod->BSIM4v5leigbinv = value->rValue; - mod->BSIM4v5leigbinvGiven = TRUE; - break; - case BSIM4v5_MOD_LPIGCD : - mod->BSIM4v5lpigcd = value->rValue; - mod->BSIM4v5lpigcdGiven = TRUE; - break; - case BSIM4v5_MOD_LPOXEDGE : - mod->BSIM4v5lpoxedge = value->rValue; - mod->BSIM4v5lpoxedgeGiven = TRUE; - break; - case BSIM4v5_MOD_LXRCRG1 : - mod->BSIM4v5lxrcrg1 = value->rValue; - mod->BSIM4v5lxrcrg1Given = TRUE; - break; - case BSIM4v5_MOD_LXRCRG2 : - mod->BSIM4v5lxrcrg2 = value->rValue; - mod->BSIM4v5lxrcrg2Given = TRUE; - break; - case BSIM4v5_MOD_LLAMBDA : - mod->BSIM4v5llambda = value->rValue; - mod->BSIM4v5llambdaGiven = TRUE; - break; - case BSIM4v5_MOD_LVTL : - mod->BSIM4v5lvtl = value->rValue; - mod->BSIM4v5lvtlGiven = TRUE; - break; - case BSIM4v5_MOD_LXN: - mod->BSIM4v5lxn = value->rValue; - mod->BSIM4v5lxnGiven = TRUE; - break; - case BSIM4v5_MOD_LVFBSDOFF: - mod->BSIM4v5lvfbsdoff = value->rValue; - mod->BSIM4v5lvfbsdoffGiven = TRUE; - break; - case BSIM4v5_MOD_LTVFBSDOFF: - mod->BSIM4v5ltvfbsdoff = value->rValue; - mod->BSIM4v5ltvfbsdoffGiven = TRUE; - break; - case BSIM4v5_MOD_LEU : - mod->BSIM4v5leu = value->rValue; - mod->BSIM4v5leuGiven = TRUE; - break; - case BSIM4v5_MOD_LVFB : - mod->BSIM4v5lvfb = value->rValue; - mod->BSIM4v5lvfbGiven = TRUE; - break; - case BSIM4v5_MOD_LCGSL : - mod->BSIM4v5lcgsl = value->rValue; - mod->BSIM4v5lcgslGiven = TRUE; - break; - case BSIM4v5_MOD_LCGDL : - mod->BSIM4v5lcgdl = value->rValue; - mod->BSIM4v5lcgdlGiven = TRUE; - break; - case BSIM4v5_MOD_LCKAPPAS : - mod->BSIM4v5lckappas = value->rValue; - mod->BSIM4v5lckappasGiven = TRUE; - break; - case BSIM4v5_MOD_LCKAPPAD : - mod->BSIM4v5lckappad = value->rValue; - mod->BSIM4v5lckappadGiven = TRUE; - break; - case BSIM4v5_MOD_LCF : - mod->BSIM4v5lcf = value->rValue; - mod->BSIM4v5lcfGiven = TRUE; - break; - case BSIM4v5_MOD_LCLC : - mod->BSIM4v5lclc = value->rValue; - mod->BSIM4v5lclcGiven = TRUE; - break; - case BSIM4v5_MOD_LCLE : - mod->BSIM4v5lcle = value->rValue; - mod->BSIM4v5lcleGiven = TRUE; - break; - case BSIM4v5_MOD_LVFBCV : - mod->BSIM4v5lvfbcv = value->rValue; - mod->BSIM4v5lvfbcvGiven = TRUE; - break; - case BSIM4v5_MOD_LACDE : - mod->BSIM4v5lacde = value->rValue; - mod->BSIM4v5lacdeGiven = TRUE; - break; - case BSIM4v5_MOD_LMOIN : - mod->BSIM4v5lmoin = value->rValue; - mod->BSIM4v5lmoinGiven = TRUE; - break; - case BSIM4v5_MOD_LNOFF : - mod->BSIM4v5lnoff = value->rValue; - mod->BSIM4v5lnoffGiven = TRUE; - break; - case BSIM4v5_MOD_LVOFFCV : - mod->BSIM4v5lvoffcv = value->rValue; - mod->BSIM4v5lvoffcvGiven = TRUE; - break; - - /* Width dependence */ - case BSIM4v5_MOD_WCDSC : - mod->BSIM4v5wcdsc = value->rValue; - mod->BSIM4v5wcdscGiven = TRUE; - break; - - - case BSIM4v5_MOD_WCDSCB : - mod->BSIM4v5wcdscb = value->rValue; - mod->BSIM4v5wcdscbGiven = TRUE; - break; - case BSIM4v5_MOD_WCDSCD : - mod->BSIM4v5wcdscd = value->rValue; - mod->BSIM4v5wcdscdGiven = TRUE; - break; - case BSIM4v5_MOD_WCIT : - mod->BSIM4v5wcit = value->rValue; - mod->BSIM4v5wcitGiven = TRUE; - break; - case BSIM4v5_MOD_WNFACTOR : - mod->BSIM4v5wnfactor = value->rValue; - mod->BSIM4v5wnfactorGiven = TRUE; - break; - case BSIM4v5_MOD_WXJ: - mod->BSIM4v5wxj = value->rValue; - mod->BSIM4v5wxjGiven = TRUE; - break; - case BSIM4v5_MOD_WVSAT: - mod->BSIM4v5wvsat = value->rValue; - mod->BSIM4v5wvsatGiven = TRUE; - break; - - - case BSIM4v5_MOD_WA0: - mod->BSIM4v5wa0 = value->rValue; - mod->BSIM4v5wa0Given = TRUE; - break; - case BSIM4v5_MOD_WAGS: - mod->BSIM4v5wags = value->rValue; - mod->BSIM4v5wagsGiven = TRUE; - break; - case BSIM4v5_MOD_WA1: - mod->BSIM4v5wa1 = value->rValue; - mod->BSIM4v5wa1Given = TRUE; - break; - case BSIM4v5_MOD_WA2: - mod->BSIM4v5wa2 = value->rValue; - mod->BSIM4v5wa2Given = TRUE; - break; - case BSIM4v5_MOD_WAT: - mod->BSIM4v5wat = value->rValue; - mod->BSIM4v5watGiven = TRUE; - break; - case BSIM4v5_MOD_WKETA: - mod->BSIM4v5wketa = value->rValue; - mod->BSIM4v5wketaGiven = TRUE; - break; - case BSIM4v5_MOD_WNSUB: - mod->BSIM4v5wnsub = value->rValue; - mod->BSIM4v5wnsubGiven = TRUE; - break; - case BSIM4v5_MOD_WNDEP: - mod->BSIM4v5wndep = value->rValue; - mod->BSIM4v5wndepGiven = TRUE; - if (mod->BSIM4v5wndep > 1.0e20) - mod->BSIM4v5wndep *= 1.0e-6; - break; - case BSIM4v5_MOD_WNSD: - mod->BSIM4v5wnsd = value->rValue; - mod->BSIM4v5wnsdGiven = TRUE; - if (mod->BSIM4v5wnsd > 1.0e23) - mod->BSIM4v5wnsd *= 1.0e-6; - break; - case BSIM4v5_MOD_WNGATE: - mod->BSIM4v5wngate = value->rValue; - mod->BSIM4v5wngateGiven = TRUE; - if (mod->BSIM4v5wngate > 1.0e23) - mod->BSIM4v5wngate *= 1.0e-6; - break; - case BSIM4v5_MOD_WGAMMA1: - mod->BSIM4v5wgamma1 = value->rValue; - mod->BSIM4v5wgamma1Given = TRUE; - break; - case BSIM4v5_MOD_WGAMMA2: - mod->BSIM4v5wgamma2 = value->rValue; - mod->BSIM4v5wgamma2Given = TRUE; - break; - case BSIM4v5_MOD_WVBX: - mod->BSIM4v5wvbx = value->rValue; - mod->BSIM4v5wvbxGiven = TRUE; - break; - case BSIM4v5_MOD_WVBM: - mod->BSIM4v5wvbm = value->rValue; - mod->BSIM4v5wvbmGiven = TRUE; - break; - case BSIM4v5_MOD_WXT: - mod->BSIM4v5wxt = value->rValue; - mod->BSIM4v5wxtGiven = TRUE; - break; - case BSIM4v5_MOD_WK1: - mod->BSIM4v5wk1 = value->rValue; - mod->BSIM4v5wk1Given = TRUE; - break; - case BSIM4v5_MOD_WKT1: - mod->BSIM4v5wkt1 = value->rValue; - mod->BSIM4v5wkt1Given = TRUE; - break; - case BSIM4v5_MOD_WKT1L: - mod->BSIM4v5wkt1l = value->rValue; - mod->BSIM4v5wkt1lGiven = TRUE; - break; - case BSIM4v5_MOD_WKT2: - mod->BSIM4v5wkt2 = value->rValue; - mod->BSIM4v5wkt2Given = TRUE; - break; - case BSIM4v5_MOD_WK2: - mod->BSIM4v5wk2 = value->rValue; - mod->BSIM4v5wk2Given = TRUE; - break; - case BSIM4v5_MOD_WK3: - mod->BSIM4v5wk3 = value->rValue; - mod->BSIM4v5wk3Given = TRUE; - break; - case BSIM4v5_MOD_WK3B: - mod->BSIM4v5wk3b = value->rValue; - mod->BSIM4v5wk3bGiven = TRUE; - break; - case BSIM4v5_MOD_WLPE0: - mod->BSIM4v5wlpe0 = value->rValue; - mod->BSIM4v5wlpe0Given = TRUE; - break; - case BSIM4v5_MOD_WLPEB: - mod->BSIM4v5wlpeb = value->rValue; - mod->BSIM4v5wlpebGiven = TRUE; - break; - case BSIM4v5_MOD_WDVTP0: - mod->BSIM4v5wdvtp0 = value->rValue; - mod->BSIM4v5wdvtp0Given = TRUE; - break; - case BSIM4v5_MOD_WDVTP1: - mod->BSIM4v5wdvtp1 = value->rValue; - mod->BSIM4v5wdvtp1Given = TRUE; - break; - case BSIM4v5_MOD_WW0: - mod->BSIM4v5ww0 = value->rValue; - mod->BSIM4v5ww0Given = TRUE; - break; - case BSIM4v5_MOD_WDVT0: - mod->BSIM4v5wdvt0 = value->rValue; - mod->BSIM4v5wdvt0Given = TRUE; - break; - case BSIM4v5_MOD_WDVT1: - mod->BSIM4v5wdvt1 = value->rValue; - mod->BSIM4v5wdvt1Given = TRUE; - break; - case BSIM4v5_MOD_WDVT2: - mod->BSIM4v5wdvt2 = value->rValue; - mod->BSIM4v5wdvt2Given = TRUE; - break; - case BSIM4v5_MOD_WDVT0W: - mod->BSIM4v5wdvt0w = value->rValue; - mod->BSIM4v5wdvt0wGiven = TRUE; - break; - case BSIM4v5_MOD_WDVT1W: - mod->BSIM4v5wdvt1w = value->rValue; - mod->BSIM4v5wdvt1wGiven = TRUE; - break; - case BSIM4v5_MOD_WDVT2W: - mod->BSIM4v5wdvt2w = value->rValue; - mod->BSIM4v5wdvt2wGiven = TRUE; - break; - case BSIM4v5_MOD_WDROUT: - mod->BSIM4v5wdrout = value->rValue; - mod->BSIM4v5wdroutGiven = TRUE; - break; - case BSIM4v5_MOD_WDSUB: - mod->BSIM4v5wdsub = value->rValue; - mod->BSIM4v5wdsubGiven = TRUE; - break; - case BSIM4v5_MOD_WVTH0: - mod->BSIM4v5wvth0 = value->rValue; - mod->BSIM4v5wvth0Given = TRUE; - break; - case BSIM4v5_MOD_WUA: - mod->BSIM4v5wua = value->rValue; - mod->BSIM4v5wuaGiven = TRUE; - break; - case BSIM4v5_MOD_WUA1: - mod->BSIM4v5wua1 = value->rValue; - mod->BSIM4v5wua1Given = TRUE; - break; - case BSIM4v5_MOD_WUB: - mod->BSIM4v5wub = value->rValue; - mod->BSIM4v5wubGiven = TRUE; - break; - case BSIM4v5_MOD_WUB1: - mod->BSIM4v5wub1 = value->rValue; - mod->BSIM4v5wub1Given = TRUE; - break; - case BSIM4v5_MOD_WUC: - mod->BSIM4v5wuc = value->rValue; - mod->BSIM4v5wucGiven = TRUE; - break; - case BSIM4v5_MOD_WUC1: - mod->BSIM4v5wuc1 = value->rValue; - mod->BSIM4v5wuc1Given = TRUE; - break; - case BSIM4v5_MOD_WU0 : - mod->BSIM4v5wu0 = value->rValue; - mod->BSIM4v5wu0Given = TRUE; - break; - case BSIM4v5_MOD_WUTE : - mod->BSIM4v5wute = value->rValue; - mod->BSIM4v5wuteGiven = TRUE; - break; - case BSIM4v5_MOD_WVOFF: - mod->BSIM4v5wvoff = value->rValue; - mod->BSIM4v5wvoffGiven = TRUE; - break; - case BSIM4v5_MOD_WTVOFF: - mod->BSIM4v5wtvoff = value->rValue; - mod->BSIM4v5wtvoffGiven = TRUE; - break; - case BSIM4v5_MOD_WMINV: - mod->BSIM4v5wminv = value->rValue; - mod->BSIM4v5wminvGiven = TRUE; - break; - case BSIM4v5_MOD_WFPROUT: - mod->BSIM4v5wfprout = value->rValue; - mod->BSIM4v5wfproutGiven = TRUE; - break; - case BSIM4v5_MOD_WPDITS: - mod->BSIM4v5wpdits = value->rValue; - mod->BSIM4v5wpditsGiven = TRUE; - break; - case BSIM4v5_MOD_WPDITSD: - mod->BSIM4v5wpditsd = value->rValue; - mod->BSIM4v5wpditsdGiven = TRUE; - break; - case BSIM4v5_MOD_WDELTA : - mod->BSIM4v5wdelta = value->rValue; - mod->BSIM4v5wdeltaGiven = TRUE; - break; - case BSIM4v5_MOD_WRDSW: - mod->BSIM4v5wrdsw = value->rValue; - mod->BSIM4v5wrdswGiven = TRUE; - break; - case BSIM4v5_MOD_WRDW: - mod->BSIM4v5wrdw = value->rValue; - mod->BSIM4v5wrdwGiven = TRUE; - break; - case BSIM4v5_MOD_WRSW: - mod->BSIM4v5wrsw = value->rValue; - mod->BSIM4v5wrswGiven = TRUE; - break; - case BSIM4v5_MOD_WPRWB: - mod->BSIM4v5wprwb = value->rValue; - mod->BSIM4v5wprwbGiven = TRUE; - break; - case BSIM4v5_MOD_WPRWG: - mod->BSIM4v5wprwg = value->rValue; - mod->BSIM4v5wprwgGiven = TRUE; - break; - case BSIM4v5_MOD_WPRT: - mod->BSIM4v5wprt = value->rValue; - mod->BSIM4v5wprtGiven = TRUE; - break; - case BSIM4v5_MOD_WETA0: - mod->BSIM4v5weta0 = value->rValue; - mod->BSIM4v5weta0Given = TRUE; - break; - case BSIM4v5_MOD_WETAB: - mod->BSIM4v5wetab = value->rValue; - mod->BSIM4v5wetabGiven = TRUE; - break; - case BSIM4v5_MOD_WPCLM: - mod->BSIM4v5wpclm = value->rValue; - mod->BSIM4v5wpclmGiven = TRUE; - break; - case BSIM4v5_MOD_WPDIBL1: - mod->BSIM4v5wpdibl1 = value->rValue; - mod->BSIM4v5wpdibl1Given = TRUE; - break; - case BSIM4v5_MOD_WPDIBL2: - mod->BSIM4v5wpdibl2 = value->rValue; - mod->BSIM4v5wpdibl2Given = TRUE; - break; - case BSIM4v5_MOD_WPDIBLB: - mod->BSIM4v5wpdiblb = value->rValue; - mod->BSIM4v5wpdiblbGiven = TRUE; - break; - case BSIM4v5_MOD_WPSCBE1: - mod->BSIM4v5wpscbe1 = value->rValue; - mod->BSIM4v5wpscbe1Given = TRUE; - break; - case BSIM4v5_MOD_WPSCBE2: - mod->BSIM4v5wpscbe2 = value->rValue; - mod->BSIM4v5wpscbe2Given = TRUE; - break; - case BSIM4v5_MOD_WPVAG: - mod->BSIM4v5wpvag = value->rValue; - mod->BSIM4v5wpvagGiven = TRUE; - break; - case BSIM4v5_MOD_WWR : - mod->BSIM4v5wwr = value->rValue; - mod->BSIM4v5wwrGiven = TRUE; - break; - case BSIM4v5_MOD_WDWG : - mod->BSIM4v5wdwg = value->rValue; - mod->BSIM4v5wdwgGiven = TRUE; - break; - case BSIM4v5_MOD_WDWB : - mod->BSIM4v5wdwb = value->rValue; - mod->BSIM4v5wdwbGiven = TRUE; - break; - case BSIM4v5_MOD_WB0 : - mod->BSIM4v5wb0 = value->rValue; - mod->BSIM4v5wb0Given = TRUE; - break; - case BSIM4v5_MOD_WB1 : - mod->BSIM4v5wb1 = value->rValue; - mod->BSIM4v5wb1Given = TRUE; - break; - case BSIM4v5_MOD_WALPHA0 : - mod->BSIM4v5walpha0 = value->rValue; - mod->BSIM4v5walpha0Given = TRUE; - break; - case BSIM4v5_MOD_WALPHA1 : - mod->BSIM4v5walpha1 = value->rValue; - mod->BSIM4v5walpha1Given = TRUE; - break; - case BSIM4v5_MOD_WBETA0 : - mod->BSIM4v5wbeta0 = value->rValue; - mod->BSIM4v5wbeta0Given = TRUE; - break; - case BSIM4v5_MOD_WAGIDL : - mod->BSIM4v5wagidl = value->rValue; - mod->BSIM4v5wagidlGiven = TRUE; - break; - case BSIM4v5_MOD_WBGIDL : - mod->BSIM4v5wbgidl = value->rValue; - mod->BSIM4v5wbgidlGiven = TRUE; - break; - case BSIM4v5_MOD_WCGIDL : - mod->BSIM4v5wcgidl = value->rValue; - mod->BSIM4v5wcgidlGiven = TRUE; - break; - case BSIM4v5_MOD_WPHIN : - mod->BSIM4v5wphin = value->rValue; - mod->BSIM4v5wphinGiven = TRUE; - break; - case BSIM4v5_MOD_WEGIDL : - mod->BSIM4v5wegidl = value->rValue; - mod->BSIM4v5wegidlGiven = TRUE; - break; - case BSIM4v5_MOD_WAIGC : - mod->BSIM4v5waigc = value->rValue; - mod->BSIM4v5waigcGiven = TRUE; - break; - case BSIM4v5_MOD_WBIGC : - mod->BSIM4v5wbigc = value->rValue; - mod->BSIM4v5wbigcGiven = TRUE; - break; - case BSIM4v5_MOD_WCIGC : - mod->BSIM4v5wcigc = value->rValue; - mod->BSIM4v5wcigcGiven = TRUE; - break; - case BSIM4v5_MOD_WAIGSD : - mod->BSIM4v5waigsd = value->rValue; - mod->BSIM4v5waigsdGiven = TRUE; - break; - case BSIM4v5_MOD_WBIGSD : - mod->BSIM4v5wbigsd = value->rValue; - mod->BSIM4v5wbigsdGiven = TRUE; - break; - case BSIM4v5_MOD_WCIGSD : - mod->BSIM4v5wcigsd = value->rValue; - mod->BSIM4v5wcigsdGiven = TRUE; - break; - case BSIM4v5_MOD_WAIGBACC : - mod->BSIM4v5waigbacc = value->rValue; - mod->BSIM4v5waigbaccGiven = TRUE; - break; - case BSIM4v5_MOD_WBIGBACC : - mod->BSIM4v5wbigbacc = value->rValue; - mod->BSIM4v5wbigbaccGiven = TRUE; - break; - case BSIM4v5_MOD_WCIGBACC : - mod->BSIM4v5wcigbacc = value->rValue; - mod->BSIM4v5wcigbaccGiven = TRUE; - break; - case BSIM4v5_MOD_WAIGBINV : - mod->BSIM4v5waigbinv = value->rValue; - mod->BSIM4v5waigbinvGiven = TRUE; - break; - case BSIM4v5_MOD_WBIGBINV : - mod->BSIM4v5wbigbinv = value->rValue; - mod->BSIM4v5wbigbinvGiven = TRUE; - break; - case BSIM4v5_MOD_WCIGBINV : - mod->BSIM4v5wcigbinv = value->rValue; - mod->BSIM4v5wcigbinvGiven = TRUE; - break; - case BSIM4v5_MOD_WNIGC : - mod->BSIM4v5wnigc = value->rValue; - mod->BSIM4v5wnigcGiven = TRUE; - break; - case BSIM4v5_MOD_WNIGBINV : - mod->BSIM4v5wnigbinv = value->rValue; - mod->BSIM4v5wnigbinvGiven = TRUE; - break; - case BSIM4v5_MOD_WNIGBACC : - mod->BSIM4v5wnigbacc = value->rValue; - mod->BSIM4v5wnigbaccGiven = TRUE; - break; - case BSIM4v5_MOD_WNTOX : - mod->BSIM4v5wntox = value->rValue; - mod->BSIM4v5wntoxGiven = TRUE; - break; - case BSIM4v5_MOD_WEIGBINV : - mod->BSIM4v5weigbinv = value->rValue; - mod->BSIM4v5weigbinvGiven = TRUE; - break; - case BSIM4v5_MOD_WPIGCD : - mod->BSIM4v5wpigcd = value->rValue; - mod->BSIM4v5wpigcdGiven = TRUE; - break; - case BSIM4v5_MOD_WPOXEDGE : - mod->BSIM4v5wpoxedge = value->rValue; - mod->BSIM4v5wpoxedgeGiven = TRUE; - break; - case BSIM4v5_MOD_WXRCRG1 : - mod->BSIM4v5wxrcrg1 = value->rValue; - mod->BSIM4v5wxrcrg1Given = TRUE; - break; - case BSIM4v5_MOD_WXRCRG2 : - mod->BSIM4v5wxrcrg2 = value->rValue; - mod->BSIM4v5wxrcrg2Given = TRUE; - break; - case BSIM4v5_MOD_WLAMBDA : - mod->BSIM4v5wlambda = value->rValue; - mod->BSIM4v5wlambdaGiven = TRUE; - break; - case BSIM4v5_MOD_WVTL : - mod->BSIM4v5wvtl = value->rValue; - mod->BSIM4v5wvtlGiven = TRUE; - break; - case BSIM4v5_MOD_WXN: - mod->BSIM4v5wxn = value->rValue; - mod->BSIM4v5wxnGiven = TRUE; - break; - case BSIM4v5_MOD_WVFBSDOFF: - mod->BSIM4v5wvfbsdoff = value->rValue; - mod->BSIM4v5wvfbsdoffGiven = TRUE; - break; - case BSIM4v5_MOD_WTVFBSDOFF: - mod->BSIM4v5wtvfbsdoff = value->rValue; - mod->BSIM4v5wtvfbsdoffGiven = TRUE; - break; - case BSIM4v5_MOD_WEU : - mod->BSIM4v5weu = value->rValue; - mod->BSIM4v5weuGiven = TRUE; - break; - case BSIM4v5_MOD_WVFB : - mod->BSIM4v5wvfb = value->rValue; - mod->BSIM4v5wvfbGiven = TRUE; - break; - case BSIM4v5_MOD_WCGSL : - mod->BSIM4v5wcgsl = value->rValue; - mod->BSIM4v5wcgslGiven = TRUE; - break; - case BSIM4v5_MOD_WCGDL : - mod->BSIM4v5wcgdl = value->rValue; - mod->BSIM4v5wcgdlGiven = TRUE; - break; - case BSIM4v5_MOD_WCKAPPAS : - mod->BSIM4v5wckappas = value->rValue; - mod->BSIM4v5wckappasGiven = TRUE; - break; - case BSIM4v5_MOD_WCKAPPAD : - mod->BSIM4v5wckappad = value->rValue; - mod->BSIM4v5wckappadGiven = TRUE; - break; - case BSIM4v5_MOD_WCF : - mod->BSIM4v5wcf = value->rValue; - mod->BSIM4v5wcfGiven = TRUE; - break; - case BSIM4v5_MOD_WCLC : - mod->BSIM4v5wclc = value->rValue; - mod->BSIM4v5wclcGiven = TRUE; - break; - case BSIM4v5_MOD_WCLE : - mod->BSIM4v5wcle = value->rValue; - mod->BSIM4v5wcleGiven = TRUE; - break; - case BSIM4v5_MOD_WVFBCV : - mod->BSIM4v5wvfbcv = value->rValue; - mod->BSIM4v5wvfbcvGiven = TRUE; - break; - case BSIM4v5_MOD_WACDE : - mod->BSIM4v5wacde = value->rValue; - mod->BSIM4v5wacdeGiven = TRUE; - break; - case BSIM4v5_MOD_WMOIN : - mod->BSIM4v5wmoin = value->rValue; - mod->BSIM4v5wmoinGiven = TRUE; - break; - case BSIM4v5_MOD_WNOFF : - mod->BSIM4v5wnoff = value->rValue; - mod->BSIM4v5wnoffGiven = TRUE; - break; - case BSIM4v5_MOD_WVOFFCV : - mod->BSIM4v5wvoffcv = value->rValue; - mod->BSIM4v5wvoffcvGiven = TRUE; - break; - - /* Cross-term dependence */ - case BSIM4v5_MOD_PCDSC : - mod->BSIM4v5pcdsc = value->rValue; - mod->BSIM4v5pcdscGiven = TRUE; - break; - - - case BSIM4v5_MOD_PCDSCB : - mod->BSIM4v5pcdscb = value->rValue; - mod->BSIM4v5pcdscbGiven = TRUE; - break; - case BSIM4v5_MOD_PCDSCD : - mod->BSIM4v5pcdscd = value->rValue; - mod->BSIM4v5pcdscdGiven = TRUE; - break; - case BSIM4v5_MOD_PCIT : - mod->BSIM4v5pcit = value->rValue; - mod->BSIM4v5pcitGiven = TRUE; - break; - case BSIM4v5_MOD_PNFACTOR : - mod->BSIM4v5pnfactor = value->rValue; - mod->BSIM4v5pnfactorGiven = TRUE; - break; - case BSIM4v5_MOD_PXJ: - mod->BSIM4v5pxj = value->rValue; - mod->BSIM4v5pxjGiven = TRUE; - break; - case BSIM4v5_MOD_PVSAT: - mod->BSIM4v5pvsat = value->rValue; - mod->BSIM4v5pvsatGiven = TRUE; - break; - - - case BSIM4v5_MOD_PA0: - mod->BSIM4v5pa0 = value->rValue; - mod->BSIM4v5pa0Given = TRUE; - break; - case BSIM4v5_MOD_PAGS: - mod->BSIM4v5pags = value->rValue; - mod->BSIM4v5pagsGiven = TRUE; - break; - case BSIM4v5_MOD_PA1: - mod->BSIM4v5pa1 = value->rValue; - mod->BSIM4v5pa1Given = TRUE; - break; - case BSIM4v5_MOD_PA2: - mod->BSIM4v5pa2 = value->rValue; - mod->BSIM4v5pa2Given = TRUE; - break; - case BSIM4v5_MOD_PAT: - mod->BSIM4v5pat = value->rValue; - mod->BSIM4v5patGiven = TRUE; - break; - case BSIM4v5_MOD_PKETA: - mod->BSIM4v5pketa = value->rValue; - mod->BSIM4v5pketaGiven = TRUE; - break; - case BSIM4v5_MOD_PNSUB: - mod->BSIM4v5pnsub = value->rValue; - mod->BSIM4v5pnsubGiven = TRUE; - break; - case BSIM4v5_MOD_PNDEP: - mod->BSIM4v5pndep = value->rValue; - mod->BSIM4v5pndepGiven = TRUE; - if (mod->BSIM4v5pndep > 1.0e20) - mod->BSIM4v5pndep *= 1.0e-6; - break; - case BSIM4v5_MOD_PNSD: - mod->BSIM4v5pnsd = value->rValue; - mod->BSIM4v5pnsdGiven = TRUE; - if (mod->BSIM4v5pnsd > 1.0e23) - mod->BSIM4v5pnsd *= 1.0e-6; - break; - case BSIM4v5_MOD_PNGATE: - mod->BSIM4v5pngate = value->rValue; - mod->BSIM4v5pngateGiven = TRUE; - if (mod->BSIM4v5pngate > 1.0e23) - mod->BSIM4v5pngate *= 1.0e-6; - break; - case BSIM4v5_MOD_PGAMMA1: - mod->BSIM4v5pgamma1 = value->rValue; - mod->BSIM4v5pgamma1Given = TRUE; - break; - case BSIM4v5_MOD_PGAMMA2: - mod->BSIM4v5pgamma2 = value->rValue; - mod->BSIM4v5pgamma2Given = TRUE; - break; - case BSIM4v5_MOD_PVBX: - mod->BSIM4v5pvbx = value->rValue; - mod->BSIM4v5pvbxGiven = TRUE; - break; - case BSIM4v5_MOD_PVBM: - mod->BSIM4v5pvbm = value->rValue; - mod->BSIM4v5pvbmGiven = TRUE; - break; - case BSIM4v5_MOD_PXT: - mod->BSIM4v5pxt = value->rValue; - mod->BSIM4v5pxtGiven = TRUE; - break; - case BSIM4v5_MOD_PK1: - mod->BSIM4v5pk1 = value->rValue; - mod->BSIM4v5pk1Given = TRUE; - break; - case BSIM4v5_MOD_PKT1: - mod->BSIM4v5pkt1 = value->rValue; - mod->BSIM4v5pkt1Given = TRUE; - break; - case BSIM4v5_MOD_PKT1L: - mod->BSIM4v5pkt1l = value->rValue; - mod->BSIM4v5pkt1lGiven = TRUE; - break; - case BSIM4v5_MOD_PKT2: - mod->BSIM4v5pkt2 = value->rValue; - mod->BSIM4v5pkt2Given = TRUE; - break; - case BSIM4v5_MOD_PK2: - mod->BSIM4v5pk2 = value->rValue; - mod->BSIM4v5pk2Given = TRUE; - break; - case BSIM4v5_MOD_PK3: - mod->BSIM4v5pk3 = value->rValue; - mod->BSIM4v5pk3Given = TRUE; - break; - case BSIM4v5_MOD_PK3B: - mod->BSIM4v5pk3b = value->rValue; - mod->BSIM4v5pk3bGiven = TRUE; - break; - case BSIM4v5_MOD_PLPE0: - mod->BSIM4v5plpe0 = value->rValue; - mod->BSIM4v5plpe0Given = TRUE; - break; - case BSIM4v5_MOD_PLPEB: - mod->BSIM4v5plpeb = value->rValue; - mod->BSIM4v5plpebGiven = TRUE; - break; - case BSIM4v5_MOD_PDVTP0: - mod->BSIM4v5pdvtp0 = value->rValue; - mod->BSIM4v5pdvtp0Given = TRUE; - break; - case BSIM4v5_MOD_PDVTP1: - mod->BSIM4v5pdvtp1 = value->rValue; - mod->BSIM4v5pdvtp1Given = TRUE; - break; - case BSIM4v5_MOD_PW0: - mod->BSIM4v5pw0 = value->rValue; - mod->BSIM4v5pw0Given = TRUE; - break; - case BSIM4v5_MOD_PDVT0: - mod->BSIM4v5pdvt0 = value->rValue; - mod->BSIM4v5pdvt0Given = TRUE; - break; - case BSIM4v5_MOD_PDVT1: - mod->BSIM4v5pdvt1 = value->rValue; - mod->BSIM4v5pdvt1Given = TRUE; - break; - case BSIM4v5_MOD_PDVT2: - mod->BSIM4v5pdvt2 = value->rValue; - mod->BSIM4v5pdvt2Given = TRUE; - break; - case BSIM4v5_MOD_PDVT0W: - mod->BSIM4v5pdvt0w = value->rValue; - mod->BSIM4v5pdvt0wGiven = TRUE; - break; - case BSIM4v5_MOD_PDVT1W: - mod->BSIM4v5pdvt1w = value->rValue; - mod->BSIM4v5pdvt1wGiven = TRUE; - break; - case BSIM4v5_MOD_PDVT2W: - mod->BSIM4v5pdvt2w = value->rValue; - mod->BSIM4v5pdvt2wGiven = TRUE; - break; - case BSIM4v5_MOD_PDROUT: - mod->BSIM4v5pdrout = value->rValue; - mod->BSIM4v5pdroutGiven = TRUE; - break; - case BSIM4v5_MOD_PDSUB: - mod->BSIM4v5pdsub = value->rValue; - mod->BSIM4v5pdsubGiven = TRUE; - break; - case BSIM4v5_MOD_PVTH0: - mod->BSIM4v5pvth0 = value->rValue; - mod->BSIM4v5pvth0Given = TRUE; - break; - case BSIM4v5_MOD_PUA: - mod->BSIM4v5pua = value->rValue; - mod->BSIM4v5puaGiven = TRUE; - break; - case BSIM4v5_MOD_PUA1: - mod->BSIM4v5pua1 = value->rValue; - mod->BSIM4v5pua1Given = TRUE; - break; - case BSIM4v5_MOD_PUB: - mod->BSIM4v5pub = value->rValue; - mod->BSIM4v5pubGiven = TRUE; - break; - case BSIM4v5_MOD_PUB1: - mod->BSIM4v5pub1 = value->rValue; - mod->BSIM4v5pub1Given = TRUE; - break; - case BSIM4v5_MOD_PUC: - mod->BSIM4v5puc = value->rValue; - mod->BSIM4v5pucGiven = TRUE; - break; - case BSIM4v5_MOD_PUC1: - mod->BSIM4v5puc1 = value->rValue; - mod->BSIM4v5puc1Given = TRUE; - break; - case BSIM4v5_MOD_PU0 : - mod->BSIM4v5pu0 = value->rValue; - mod->BSIM4v5pu0Given = TRUE; - break; - case BSIM4v5_MOD_PUTE : - mod->BSIM4v5pute = value->rValue; - mod->BSIM4v5puteGiven = TRUE; - break; - case BSIM4v5_MOD_PVOFF: - mod->BSIM4v5pvoff = value->rValue; - mod->BSIM4v5pvoffGiven = TRUE; - break; - case BSIM4v5_MOD_PTVOFF: - mod->BSIM4v5ptvoff = value->rValue; - mod->BSIM4v5ptvoffGiven = TRUE; - break; - case BSIM4v5_MOD_PMINV: - mod->BSIM4v5pminv = value->rValue; - mod->BSIM4v5pminvGiven = TRUE; - break; - case BSIM4v5_MOD_PFPROUT: - mod->BSIM4v5pfprout = value->rValue; - mod->BSIM4v5pfproutGiven = TRUE; - break; - case BSIM4v5_MOD_PPDITS: - mod->BSIM4v5ppdits = value->rValue; - mod->BSIM4v5ppditsGiven = TRUE; - break; - case BSIM4v5_MOD_PPDITSD: - mod->BSIM4v5ppditsd = value->rValue; - mod->BSIM4v5ppditsdGiven = TRUE; - break; - case BSIM4v5_MOD_PDELTA : - mod->BSIM4v5pdelta = value->rValue; - mod->BSIM4v5pdeltaGiven = TRUE; - break; - case BSIM4v5_MOD_PRDSW: - mod->BSIM4v5prdsw = value->rValue; - mod->BSIM4v5prdswGiven = TRUE; - break; - case BSIM4v5_MOD_PRDW: - mod->BSIM4v5prdw = value->rValue; - mod->BSIM4v5prdwGiven = TRUE; - break; - case BSIM4v5_MOD_PRSW: - mod->BSIM4v5prsw = value->rValue; - mod->BSIM4v5prswGiven = TRUE; - break; - case BSIM4v5_MOD_PPRWB: - mod->BSIM4v5pprwb = value->rValue; - mod->BSIM4v5pprwbGiven = TRUE; - break; - case BSIM4v5_MOD_PPRWG: - mod->BSIM4v5pprwg = value->rValue; - mod->BSIM4v5pprwgGiven = TRUE; - break; - case BSIM4v5_MOD_PPRT: - mod->BSIM4v5pprt = value->rValue; - mod->BSIM4v5pprtGiven = TRUE; - break; - case BSIM4v5_MOD_PETA0: - mod->BSIM4v5peta0 = value->rValue; - mod->BSIM4v5peta0Given = TRUE; - break; - case BSIM4v5_MOD_PETAB: - mod->BSIM4v5petab = value->rValue; - mod->BSIM4v5petabGiven = TRUE; - break; - case BSIM4v5_MOD_PPCLM: - mod->BSIM4v5ppclm = value->rValue; - mod->BSIM4v5ppclmGiven = TRUE; - break; - case BSIM4v5_MOD_PPDIBL1: - mod->BSIM4v5ppdibl1 = value->rValue; - mod->BSIM4v5ppdibl1Given = TRUE; - break; - case BSIM4v5_MOD_PPDIBL2: - mod->BSIM4v5ppdibl2 = value->rValue; - mod->BSIM4v5ppdibl2Given = TRUE; - break; - case BSIM4v5_MOD_PPDIBLB: - mod->BSIM4v5ppdiblb = value->rValue; - mod->BSIM4v5ppdiblbGiven = TRUE; - break; - case BSIM4v5_MOD_PPSCBE1: - mod->BSIM4v5ppscbe1 = value->rValue; - mod->BSIM4v5ppscbe1Given = TRUE; - break; - case BSIM4v5_MOD_PPSCBE2: - mod->BSIM4v5ppscbe2 = value->rValue; - mod->BSIM4v5ppscbe2Given = TRUE; - break; - case BSIM4v5_MOD_PPVAG: - mod->BSIM4v5ppvag = value->rValue; - mod->BSIM4v5ppvagGiven = TRUE; - break; - case BSIM4v5_MOD_PWR : - mod->BSIM4v5pwr = value->rValue; - mod->BSIM4v5pwrGiven = TRUE; - break; - case BSIM4v5_MOD_PDWG : - mod->BSIM4v5pdwg = value->rValue; - mod->BSIM4v5pdwgGiven = TRUE; - break; - case BSIM4v5_MOD_PDWB : - mod->BSIM4v5pdwb = value->rValue; - mod->BSIM4v5pdwbGiven = TRUE; - break; - case BSIM4v5_MOD_PB0 : - mod->BSIM4v5pb0 = value->rValue; - mod->BSIM4v5pb0Given = TRUE; - break; - case BSIM4v5_MOD_PB1 : - mod->BSIM4v5pb1 = value->rValue; - mod->BSIM4v5pb1Given = TRUE; - break; - case BSIM4v5_MOD_PALPHA0 : - mod->BSIM4v5palpha0 = value->rValue; - mod->BSIM4v5palpha0Given = TRUE; - break; - case BSIM4v5_MOD_PALPHA1 : - mod->BSIM4v5palpha1 = value->rValue; - mod->BSIM4v5palpha1Given = TRUE; - break; - case BSIM4v5_MOD_PBETA0 : - mod->BSIM4v5pbeta0 = value->rValue; - mod->BSIM4v5pbeta0Given = TRUE; - break; - case BSIM4v5_MOD_PAGIDL : - mod->BSIM4v5pagidl = value->rValue; - mod->BSIM4v5pagidlGiven = TRUE; - break; - case BSIM4v5_MOD_PBGIDL : - mod->BSIM4v5pbgidl = value->rValue; - mod->BSIM4v5pbgidlGiven = TRUE; - break; - case BSIM4v5_MOD_PCGIDL : - mod->BSIM4v5pcgidl = value->rValue; - mod->BSIM4v5pcgidlGiven = TRUE; - break; - case BSIM4v5_MOD_PPHIN : - mod->BSIM4v5pphin = value->rValue; - mod->BSIM4v5pphinGiven = TRUE; - break; - case BSIM4v5_MOD_PEGIDL : - mod->BSIM4v5pegidl = value->rValue; - mod->BSIM4v5pegidlGiven = TRUE; - break; - case BSIM4v5_MOD_PAIGC : - mod->BSIM4v5paigc = value->rValue; - mod->BSIM4v5paigcGiven = TRUE; - break; - case BSIM4v5_MOD_PBIGC : - mod->BSIM4v5pbigc = value->rValue; - mod->BSIM4v5pbigcGiven = TRUE; - break; - case BSIM4v5_MOD_PCIGC : - mod->BSIM4v5pcigc = value->rValue; - mod->BSIM4v5pcigcGiven = TRUE; - break; - case BSIM4v5_MOD_PAIGSD : - mod->BSIM4v5paigsd = value->rValue; - mod->BSIM4v5paigsdGiven = TRUE; - break; - case BSIM4v5_MOD_PBIGSD : - mod->BSIM4v5pbigsd = value->rValue; - mod->BSIM4v5pbigsdGiven = TRUE; - break; - case BSIM4v5_MOD_PCIGSD : - mod->BSIM4v5pcigsd = value->rValue; - mod->BSIM4v5pcigsdGiven = TRUE; - break; - case BSIM4v5_MOD_PAIGBACC : - mod->BSIM4v5paigbacc = value->rValue; - mod->BSIM4v5paigbaccGiven = TRUE; - break; - case BSIM4v5_MOD_PBIGBACC : - mod->BSIM4v5pbigbacc = value->rValue; - mod->BSIM4v5pbigbaccGiven = TRUE; - break; - case BSIM4v5_MOD_PCIGBACC : - mod->BSIM4v5pcigbacc = value->rValue; - mod->BSIM4v5pcigbaccGiven = TRUE; - break; - case BSIM4v5_MOD_PAIGBINV : - mod->BSIM4v5paigbinv = value->rValue; - mod->BSIM4v5paigbinvGiven = TRUE; - break; - case BSIM4v5_MOD_PBIGBINV : - mod->BSIM4v5pbigbinv = value->rValue; - mod->BSIM4v5pbigbinvGiven = TRUE; - break; - case BSIM4v5_MOD_PCIGBINV : - mod->BSIM4v5pcigbinv = value->rValue; - mod->BSIM4v5pcigbinvGiven = TRUE; - break; - case BSIM4v5_MOD_PNIGC : - mod->BSIM4v5pnigc = value->rValue; - mod->BSIM4v5pnigcGiven = TRUE; - break; - case BSIM4v5_MOD_PNIGBINV : - mod->BSIM4v5pnigbinv = value->rValue; - mod->BSIM4v5pnigbinvGiven = TRUE; - break; - case BSIM4v5_MOD_PNIGBACC : - mod->BSIM4v5pnigbacc = value->rValue; - mod->BSIM4v5pnigbaccGiven = TRUE; - break; - case BSIM4v5_MOD_PNTOX : - mod->BSIM4v5pntox = value->rValue; - mod->BSIM4v5pntoxGiven = TRUE; - break; - case BSIM4v5_MOD_PEIGBINV : - mod->BSIM4v5peigbinv = value->rValue; - mod->BSIM4v5peigbinvGiven = TRUE; - break; - case BSIM4v5_MOD_PPIGCD : - mod->BSIM4v5ppigcd = value->rValue; - mod->BSIM4v5ppigcdGiven = TRUE; - break; - case BSIM4v5_MOD_PPOXEDGE : - mod->BSIM4v5ppoxedge = value->rValue; - mod->BSIM4v5ppoxedgeGiven = TRUE; - break; - case BSIM4v5_MOD_PXRCRG1 : - mod->BSIM4v5pxrcrg1 = value->rValue; - mod->BSIM4v5pxrcrg1Given = TRUE; - break; - case BSIM4v5_MOD_PXRCRG2 : - mod->BSIM4v5pxrcrg2 = value->rValue; - mod->BSIM4v5pxrcrg2Given = TRUE; - break; - case BSIM4v5_MOD_PLAMBDA : - mod->BSIM4v5plambda = value->rValue; - mod->BSIM4v5plambdaGiven = TRUE; - break; - case BSIM4v5_MOD_PVTL : - mod->BSIM4v5pvtl = value->rValue; - mod->BSIM4v5pvtlGiven = TRUE; - break; - case BSIM4v5_MOD_PXN: - mod->BSIM4v5pxn = value->rValue; - mod->BSIM4v5pxnGiven = TRUE; - break; - case BSIM4v5_MOD_PVFBSDOFF: - mod->BSIM4v5pvfbsdoff = value->rValue; - mod->BSIM4v5pvfbsdoffGiven = TRUE; - break; - case BSIM4v5_MOD_PTVFBSDOFF: - mod->BSIM4v5ptvfbsdoff = value->rValue; - mod->BSIM4v5ptvfbsdoffGiven = TRUE; - break; - case BSIM4v5_MOD_PEU : - mod->BSIM4v5peu = value->rValue; - mod->BSIM4v5peuGiven = TRUE; - break; - case BSIM4v5_MOD_PVFB : - mod->BSIM4v5pvfb = value->rValue; - mod->BSIM4v5pvfbGiven = TRUE; - break; - case BSIM4v5_MOD_PCGSL : - mod->BSIM4v5pcgsl = value->rValue; - mod->BSIM4v5pcgslGiven = TRUE; - break; - case BSIM4v5_MOD_PCGDL : - mod->BSIM4v5pcgdl = value->rValue; - mod->BSIM4v5pcgdlGiven = TRUE; - break; - case BSIM4v5_MOD_PCKAPPAS : - mod->BSIM4v5pckappas = value->rValue; - mod->BSIM4v5pckappasGiven = TRUE; - break; - case BSIM4v5_MOD_PCKAPPAD : - mod->BSIM4v5pckappad = value->rValue; - mod->BSIM4v5pckappadGiven = TRUE; - break; - case BSIM4v5_MOD_PCF : - mod->BSIM4v5pcf = value->rValue; - mod->BSIM4v5pcfGiven = TRUE; - break; - case BSIM4v5_MOD_PCLC : - mod->BSIM4v5pclc = value->rValue; - mod->BSIM4v5pclcGiven = TRUE; - break; - case BSIM4v5_MOD_PCLE : - mod->BSIM4v5pcle = value->rValue; - mod->BSIM4v5pcleGiven = TRUE; - break; - case BSIM4v5_MOD_PVFBCV : - mod->BSIM4v5pvfbcv = value->rValue; - mod->BSIM4v5pvfbcvGiven = TRUE; - break; - case BSIM4v5_MOD_PACDE : - mod->BSIM4v5pacde = value->rValue; - mod->BSIM4v5pacdeGiven = TRUE; - break; - case BSIM4v5_MOD_PMOIN : - mod->BSIM4v5pmoin = value->rValue; - mod->BSIM4v5pmoinGiven = TRUE; - break; - case BSIM4v5_MOD_PNOFF : - mod->BSIM4v5pnoff = value->rValue; - mod->BSIM4v5pnoffGiven = TRUE; - break; - case BSIM4v5_MOD_PVOFFCV : - mod->BSIM4v5pvoffcv = value->rValue; - mod->BSIM4v5pvoffcvGiven = TRUE; - break; - - case BSIM4v5_MOD_TNOM : - mod->BSIM4v5tnom = value->rValue + CONSTCtoK; - mod->BSIM4v5tnomGiven = TRUE; - break; - case BSIM4v5_MOD_CGSO : - mod->BSIM4v5cgso = value->rValue; - mod->BSIM4v5cgsoGiven = TRUE; - break; - case BSIM4v5_MOD_CGDO : - mod->BSIM4v5cgdo = value->rValue; - mod->BSIM4v5cgdoGiven = TRUE; - break; - case BSIM4v5_MOD_CGBO : - mod->BSIM4v5cgbo = value->rValue; - mod->BSIM4v5cgboGiven = TRUE; - break; - case BSIM4v5_MOD_XPART : - mod->BSIM4v5xpart = value->rValue; - mod->BSIM4v5xpartGiven = TRUE; - break; - case BSIM4v5_MOD_RSH : - mod->BSIM4v5sheetResistance = value->rValue; - mod->BSIM4v5sheetResistanceGiven = TRUE; - break; - case BSIM4v5_MOD_JSS : - mod->BSIM4v5SjctSatCurDensity = value->rValue; - mod->BSIM4v5SjctSatCurDensityGiven = TRUE; - break; - case BSIM4v5_MOD_JSWS : - mod->BSIM4v5SjctSidewallSatCurDensity = value->rValue; - mod->BSIM4v5SjctSidewallSatCurDensityGiven = TRUE; - break; - case BSIM4v5_MOD_JSWGS : - mod->BSIM4v5SjctGateSidewallSatCurDensity = value->rValue; - mod->BSIM4v5SjctGateSidewallSatCurDensityGiven = TRUE; - break; - case BSIM4v5_MOD_PBS : - mod->BSIM4v5SbulkJctPotential = value->rValue; - mod->BSIM4v5SbulkJctPotentialGiven = TRUE; - break; - case BSIM4v5_MOD_MJS : - mod->BSIM4v5SbulkJctBotGradingCoeff = value->rValue; - mod->BSIM4v5SbulkJctBotGradingCoeffGiven = TRUE; - break; - case BSIM4v5_MOD_PBSWS : - mod->BSIM4v5SsidewallJctPotential = value->rValue; - mod->BSIM4v5SsidewallJctPotentialGiven = TRUE; - break; - case BSIM4v5_MOD_MJSWS : - mod->BSIM4v5SbulkJctSideGradingCoeff = value->rValue; - mod->BSIM4v5SbulkJctSideGradingCoeffGiven = TRUE; - break; - case BSIM4v5_MOD_CJS : - mod->BSIM4v5SunitAreaJctCap = value->rValue; - mod->BSIM4v5SunitAreaJctCapGiven = TRUE; - break; - case BSIM4v5_MOD_CJSWS : - mod->BSIM4v5SunitLengthSidewallJctCap = value->rValue; - mod->BSIM4v5SunitLengthSidewallJctCapGiven = TRUE; - break; - case BSIM4v5_MOD_NJS : - mod->BSIM4v5SjctEmissionCoeff = value->rValue; - mod->BSIM4v5SjctEmissionCoeffGiven = TRUE; - break; - case BSIM4v5_MOD_PBSWGS : - mod->BSIM4v5SGatesidewallJctPotential = value->rValue; - mod->BSIM4v5SGatesidewallJctPotentialGiven = TRUE; - break; - case BSIM4v5_MOD_MJSWGS : - mod->BSIM4v5SbulkJctGateSideGradingCoeff = value->rValue; - mod->BSIM4v5SbulkJctGateSideGradingCoeffGiven = TRUE; - break; - case BSIM4v5_MOD_CJSWGS : - mod->BSIM4v5SunitLengthGateSidewallJctCap = value->rValue; - mod->BSIM4v5SunitLengthGateSidewallJctCapGiven = TRUE; - break; - case BSIM4v5_MOD_XTIS : - mod->BSIM4v5SjctTempExponent = value->rValue; - mod->BSIM4v5SjctTempExponentGiven = TRUE; - break; - case BSIM4v5_MOD_JSD : - mod->BSIM4v5DjctSatCurDensity = value->rValue; - mod->BSIM4v5DjctSatCurDensityGiven = TRUE; - break; - case BSIM4v5_MOD_JSWD : - mod->BSIM4v5DjctSidewallSatCurDensity = value->rValue; - mod->BSIM4v5DjctSidewallSatCurDensityGiven = TRUE; - break; - case BSIM4v5_MOD_JSWGD : - mod->BSIM4v5DjctGateSidewallSatCurDensity = value->rValue; - mod->BSIM4v5DjctGateSidewallSatCurDensityGiven = TRUE; - break; - case BSIM4v5_MOD_PBD : - mod->BSIM4v5DbulkJctPotential = value->rValue; - mod->BSIM4v5DbulkJctPotentialGiven = TRUE; - break; - case BSIM4v5_MOD_MJD : - mod->BSIM4v5DbulkJctBotGradingCoeff = value->rValue; - mod->BSIM4v5DbulkJctBotGradingCoeffGiven = TRUE; - break; - case BSIM4v5_MOD_PBSWD : - mod->BSIM4v5DsidewallJctPotential = value->rValue; - mod->BSIM4v5DsidewallJctPotentialGiven = TRUE; - break; - case BSIM4v5_MOD_MJSWD : - mod->BSIM4v5DbulkJctSideGradingCoeff = value->rValue; - mod->BSIM4v5DbulkJctSideGradingCoeffGiven = TRUE; - break; - case BSIM4v5_MOD_CJD : - mod->BSIM4v5DunitAreaJctCap = value->rValue; - mod->BSIM4v5DunitAreaJctCapGiven = TRUE; - break; - case BSIM4v5_MOD_CJSWD : - mod->BSIM4v5DunitLengthSidewallJctCap = value->rValue; - mod->BSIM4v5DunitLengthSidewallJctCapGiven = TRUE; - break; - case BSIM4v5_MOD_NJD : - mod->BSIM4v5DjctEmissionCoeff = value->rValue; - mod->BSIM4v5DjctEmissionCoeffGiven = TRUE; - break; - case BSIM4v5_MOD_PBSWGD : - mod->BSIM4v5DGatesidewallJctPotential = value->rValue; - mod->BSIM4v5DGatesidewallJctPotentialGiven = TRUE; - break; - case BSIM4v5_MOD_MJSWGD : - mod->BSIM4v5DbulkJctGateSideGradingCoeff = value->rValue; - mod->BSIM4v5DbulkJctGateSideGradingCoeffGiven = TRUE; - break; - case BSIM4v5_MOD_CJSWGD : - mod->BSIM4v5DunitLengthGateSidewallJctCap = value->rValue; - mod->BSIM4v5DunitLengthGateSidewallJctCapGiven = TRUE; - break; - case BSIM4v5_MOD_XTID : - mod->BSIM4v5DjctTempExponent = value->rValue; - mod->BSIM4v5DjctTempExponentGiven = TRUE; - break; - case BSIM4v5_MOD_LINT : - mod->BSIM4v5Lint = value->rValue; - mod->BSIM4v5LintGiven = TRUE; - break; - case BSIM4v5_MOD_LL : - mod->BSIM4v5Ll = value->rValue; - mod->BSIM4v5LlGiven = TRUE; - break; - case BSIM4v5_MOD_LLC : - mod->BSIM4v5Llc = value->rValue; - mod->BSIM4v5LlcGiven = TRUE; - break; - case BSIM4v5_MOD_LLN : - mod->BSIM4v5Lln = value->rValue; - mod->BSIM4v5LlnGiven = TRUE; - break; - case BSIM4v5_MOD_LW : - mod->BSIM4v5Lw = value->rValue; - mod->BSIM4v5LwGiven = TRUE; - break; - case BSIM4v5_MOD_LWC : - mod->BSIM4v5Lwc = value->rValue; - mod->BSIM4v5LwcGiven = TRUE; - break; - case BSIM4v5_MOD_LWN : - mod->BSIM4v5Lwn = value->rValue; - mod->BSIM4v5LwnGiven = TRUE; - break; - case BSIM4v5_MOD_LWL : - mod->BSIM4v5Lwl = value->rValue; - mod->BSIM4v5LwlGiven = TRUE; - break; - case BSIM4v5_MOD_LWLC : - mod->BSIM4v5Lwlc = value->rValue; - mod->BSIM4v5LwlcGiven = TRUE; - break; - case BSIM4v5_MOD_LMIN : - mod->BSIM4v5Lmin = value->rValue; - mod->BSIM4v5LminGiven = TRUE; - break; - case BSIM4v5_MOD_LMAX : - mod->BSIM4v5Lmax = value->rValue; - mod->BSIM4v5LmaxGiven = TRUE; - break; - case BSIM4v5_MOD_WINT : - mod->BSIM4v5Wint = value->rValue; - mod->BSIM4v5WintGiven = TRUE; - break; - case BSIM4v5_MOD_WL : - mod->BSIM4v5Wl = value->rValue; - mod->BSIM4v5WlGiven = TRUE; - break; - case BSIM4v5_MOD_WLC : - mod->BSIM4v5Wlc = value->rValue; - mod->BSIM4v5WlcGiven = TRUE; - break; - case BSIM4v5_MOD_WLN : - mod->BSIM4v5Wln = value->rValue; - mod->BSIM4v5WlnGiven = TRUE; - break; - case BSIM4v5_MOD_WW : - mod->BSIM4v5Ww = value->rValue; - mod->BSIM4v5WwGiven = TRUE; - break; - case BSIM4v5_MOD_WWC : - mod->BSIM4v5Wwc = value->rValue; - mod->BSIM4v5WwcGiven = TRUE; - break; - case BSIM4v5_MOD_WWN : - mod->BSIM4v5Wwn = value->rValue; - mod->BSIM4v5WwnGiven = TRUE; - break; - case BSIM4v5_MOD_WWL : - mod->BSIM4v5Wwl = value->rValue; - mod->BSIM4v5WwlGiven = TRUE; - break; - case BSIM4v5_MOD_WWLC : - mod->BSIM4v5Wwlc = value->rValue; - mod->BSIM4v5WwlcGiven = TRUE; - break; - case BSIM4v5_MOD_WMIN : - mod->BSIM4v5Wmin = value->rValue; - mod->BSIM4v5WminGiven = TRUE; - break; - case BSIM4v5_MOD_WMAX : - mod->BSIM4v5Wmax = value->rValue; - mod->BSIM4v5WmaxGiven = TRUE; - break; - - case BSIM4v5_MOD_NOIA : - mod->BSIM4v5oxideTrapDensityA = value->rValue; - mod->BSIM4v5oxideTrapDensityAGiven = TRUE; - break; - case BSIM4v5_MOD_NOIB : - mod->BSIM4v5oxideTrapDensityB = value->rValue; - mod->BSIM4v5oxideTrapDensityBGiven = TRUE; - break; - case BSIM4v5_MOD_NOIC : - mod->BSIM4v5oxideTrapDensityC = value->rValue; - mod->BSIM4v5oxideTrapDensityCGiven = TRUE; - break; - case BSIM4v5_MOD_EM : - mod->BSIM4v5em = value->rValue; - mod->BSIM4v5emGiven = TRUE; - break; - case BSIM4v5_MOD_EF : - mod->BSIM4v5ef = value->rValue; - mod->BSIM4v5efGiven = TRUE; - break; - case BSIM4v5_MOD_AF : - mod->BSIM4v5af = value->rValue; - mod->BSIM4v5afGiven = TRUE; - break; - case BSIM4v5_MOD_KF : - mod->BSIM4v5kf = value->rValue; - mod->BSIM4v5kfGiven = TRUE; - break; - - case BSIM4v5_MOD_VGS_MAX: - mod->BSIM4v5vgsMax = value->rValue; - mod->BSIM4v5vgsMaxGiven = TRUE; - break; - case BSIM4v5_MOD_VGD_MAX: - mod->BSIM4v5vgdMax = value->rValue; - mod->BSIM4v5vgdMaxGiven = TRUE; - break; - case BSIM4v5_MOD_VGB_MAX: - mod->BSIM4v5vgbMax = value->rValue; - mod->BSIM4v5vgbMaxGiven = TRUE; - break; - case BSIM4v5_MOD_VDS_MAX: - mod->BSIM4v5vdsMax = value->rValue; - mod->BSIM4v5vdsMaxGiven = TRUE; - break; - case BSIM4v5_MOD_VBS_MAX: - mod->BSIM4v5vbsMax = value->rValue; - mod->BSIM4v5vbsMaxGiven = TRUE; - break; - case BSIM4v5_MOD_VBD_MAX: - mod->BSIM4v5vbdMax = value->rValue; - mod->BSIM4v5vbdMaxGiven = TRUE; - break; - case BSIM4v5_MOD_VGSR_MAX: - mod->BSIM4v5vgsrMax = value->rValue; - mod->BSIM4v5vgsrMaxGiven = TRUE; - break; - case BSIM4v5_MOD_VGDR_MAX: - mod->BSIM4v5vgdrMax = value->rValue; - mod->BSIM4v5vgdrMaxGiven = TRUE; - break; - case BSIM4v5_MOD_VGBR_MAX: - mod->BSIM4v5vgbrMax = value->rValue; - mod->BSIM4v5vgbrMaxGiven = TRUE; - break; - case BSIM4v5_MOD_VBSR_MAX: - mod->BSIM4v5vbsrMax = value->rValue; - mod->BSIM4v5vbsrMaxGiven = TRUE; - break; - case BSIM4v5_MOD_VBDR_MAX: - mod->BSIM4v5vbdrMax = value->rValue; - mod->BSIM4v5vbdrMaxGiven = TRUE; - break; - - case BSIM4v5_MOD_NMOS : - if(value->iValue) { - mod->BSIM4v5type = 1; - mod->BSIM4v5typeGiven = TRUE; - } - break; - case BSIM4v5_MOD_PMOS : - if(value->iValue) { - mod->BSIM4v5type = - 1; - mod->BSIM4v5typeGiven = TRUE; - } - break; - default: - return(E_BADPARM); - } - return(OK); -} - - diff --git a/src/spicelib/devices/bsim4v5/b4v5noi.c b/src/spicelib/devices/bsim4v5/b4v5noi.c deleted file mode 100644 index c56e2d246..000000000 --- a/src/spicelib/devices/bsim4v5/b4v5noi.c +++ /dev/null @@ -1,499 +0,0 @@ -/**** BSIM4.5.0 Released by Xuemei (Jane) Xi 07/29/2005 ****/ - -/********** - * Copyright 2005 Regents of the University of California. All rights reserved. - * File: b4noi.c of BSIM4.5.0. - * Author: 2000 Weidong Liu - * Authors: 2001- Xuemei Xi, Mohan Dunga, Ali Niknejad, Chenming Hu. - * Project Director: Prof. Chenming Hu. - * Modified by Xuemei Xi, 04/06/2001. - * Modified by Xuemei Xi, 10/05/2001. - * Modified by Xuemei Xi, 11/15/2002. - * Modified by Xuemei Xi, 05/09/2003. - * Modified by Xuemei Xi, 03/04/2004. - * Modified by Xuemei Xi, 07/29/2005. - **********/ - -#include "ngspice/ngspice.h" -#include "bsim4v5def.h" -#include "ngspice/cktdefs.h" -#include "ngspice/iferrmsg.h" -#include "ngspice/noisedef.h" -#include "ngspice/suffix.h" -#include "ngspice/const.h" - - -/* - * WDL: 1/f noise model has been smoothed out and enhanced with - * bulk charge effect as well as physical N* equ. and necessary - * conversion into the SI unit system. - */ - -static double -BSIM4v5Eval1ovFNoise( -double Vds, -BSIM4v5model *model, -BSIM4v5instance *here, -double freq, double temp) -{ -struct bsim4v5SizeDependParam *pParam; -double cd, esat, DelClm, EffFreq, N0, Nl, Leff, Leffsq; -double T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, Ssi; - - pParam = here->pParam; - cd = fabs(here->BSIM4v5cd); - Leff = pParam->BSIM4v5leff - 2.0 * model->BSIM4v5lintnoi; - Leffsq = Leff * Leff; - esat = 2.0 * here->BSIM4v5vsattemp / here->BSIM4v5ueff; - if(model->BSIM4v5em<=0.0) DelClm = 0.0; /* flicker noise modified -JX */ - else { - T0 = ((((Vds - here->BSIM4v5Vdseff) / pParam->BSIM4v5litl) - + model->BSIM4v5em) / esat); - DelClm = pParam->BSIM4v5litl * log (MAX(T0, N_MINLOG)); - if (DelClm < 0.0) DelClm = 0.0; /* bugfix */ - } - EffFreq = pow(freq, model->BSIM4v5ef); - T1 = CHARGE * CHARGE * CONSTboltz * cd * temp * here->BSIM4v5ueff; - T2 = 1.0e10 * EffFreq * here->BSIM4v5Abulk * model->BSIM4v5coxe * Leffsq; - N0 = model->BSIM4v5coxe * here->BSIM4v5Vgsteff / CHARGE; - Nl = model->BSIM4v5coxe * here->BSIM4v5Vgsteff - * (1.0 - here->BSIM4v5AbovVgst2Vtm * here->BSIM4v5Vdseff) / CHARGE; - - T3 = model->BSIM4v5oxideTrapDensityA - * log(MAX(((N0 + here->BSIM4v5nstar) / (Nl + here->BSIM4v5nstar)), N_MINLOG)); - T4 = model->BSIM4v5oxideTrapDensityB * (N0 - Nl); - T5 = model->BSIM4v5oxideTrapDensityC * 0.5 * (N0 * N0 - Nl * Nl); - - T6 = CONSTboltz * temp * cd * cd; - T7 = 1.0e10 * EffFreq * Leffsq * pParam->BSIM4v5weff * here->BSIM4v5nf; - T8 = model->BSIM4v5oxideTrapDensityA + model->BSIM4v5oxideTrapDensityB * Nl - + model->BSIM4v5oxideTrapDensityC * Nl * Nl; - T9 = (Nl + here->BSIM4v5nstar) * (Nl + here->BSIM4v5nstar); - Ssi = T1 / T2 * (T3 + T4 + T5) + T6 / T7 * DelClm * T8 / T9; - return Ssi; -} - - -int -BSIM4v5noise ( -int mode, int operation, -GENmodel *inModel, -CKTcircuit *ckt, -Ndata *data, -double *OnDens) -{ -NOISEAN *job = (NOISEAN *) ckt->CKTcurJob; - -BSIM4v5model *model = (BSIM4v5model *)inModel; -BSIM4v5instance *here; -struct bsim4v5SizeDependParam *pParam; -double tempOnoise; -double tempInoise; -double noizDens[BSIM4v5NSRCS]; -double lnNdens[BSIM4v5NSRCS]; - -double T0, T1, T2, T5, T10, T11; -double Vds, Ssi, Swi; -double tmp=0.0, gdpr, gspr, npart_theta=0.0, npart_beta=0.0, igsquare, bodymode; - -double m; - -int i; - - /* define the names of the noise sources */ - static char *BSIM4v5nNames[BSIM4v5NSRCS] = - { /* Note that we have to keep the order */ - ".rd", /* noise due to rd */ - ".rs", /* noise due to rs */ - ".rg", /* noise due to rgeltd */ - ".rbps", /* noise due to rbps */ - ".rbpd", /* noise due to rbpd */ - ".rbpb", /* noise due to rbpb */ - ".rbsb", /* noise due to rbsb */ - ".rbdb", /* noise due to rbdb */ - ".id", /* noise due to id */ - ".1overf", /* flicker (1/f) noise */ - ".igs", /* shot noise due to IGS */ - ".igd", /* shot noise due to IGD */ - ".igb", /* shot noise due to IGB */ - "" /* total transistor noise */ - }; - - for (; model != NULL; model = BSIM4v5nextModel(model)) - { for (here = BSIM4v5instances(model); here != NULL; - here = BSIM4v5nextInstance(here)) - { pParam = here->pParam; - switch (operation) - { case N_OPEN: - /* see if we have to to produce a summary report */ - /* if so, name all the noise generators */ - - if (job->NStpsSm != 0) - { switch (mode) - { case N_DENS: - for (i = 0; i < BSIM4v5NSRCS; i++) - { NOISE_ADD_OUTVAR(ckt, data, "onoise.%s%s", here->BSIM4v5name, BSIM4v5nNames[i]); - } - break; - case INT_NOIZ: - for (i = 0; i < BSIM4v5NSRCS; i++) - { NOISE_ADD_OUTVAR(ckt, data, "onoise_total.%s%s", here->BSIM4v5name, BSIM4v5nNames[i]); - NOISE_ADD_OUTVAR(ckt, data, "inoise_total.%s%s", here->BSIM4v5name, BSIM4v5nNames[i]); - } - break; - } - } - break; - case N_CALC: - m = here->BSIM4v5m; - switch (mode) - { case N_DENS: - if (model->BSIM4v5tnoiMod == 0) - { if (model->BSIM4v5rdsMod == 0) - { gspr = here->BSIM4v5sourceConductance; - gdpr = here->BSIM4v5drainConductance; - if (here->BSIM4v5grdsw > 0.0) - tmp = 1.0 / here->BSIM4v5grdsw; /* tmp used below */ - else - tmp = 0.0; - } - else - { gspr = here->BSIM4v5gstot; - gdpr = here->BSIM4v5gdtot; - tmp = 0.0; - } - } - else - { T5 = here->BSIM4v5Vgsteff / here->BSIM4v5EsatL; - T5 *= T5; - npart_beta = model->BSIM4v5rnoia * (1.0 + T5 - * model->BSIM4v5tnoia * pParam->BSIM4v5leff); - npart_theta = model->BSIM4v5rnoib * (1.0 + T5 - * model->BSIM4v5tnoib * pParam->BSIM4v5leff); - - if (model->BSIM4v5rdsMod == 0) - { gspr = here->BSIM4v5sourceConductance; - gdpr = here->BSIM4v5drainConductance; - } - else - { gspr = here->BSIM4v5gstot; - gdpr = here->BSIM4v5gdtot; - } - - if ((*(ckt->CKTstates[0] + here->BSIM4v5vds)) >= 0.0) - gspr = gspr / (1.0 + npart_theta * npart_theta * gspr - / here->BSIM4v5IdovVds); /* bugfix */ - else - gdpr = gdpr / (1.0 + npart_theta * npart_theta * gdpr - / here->BSIM4v5IdovVds); - } - - NevalSrc(&noizDens[BSIM4v5RDNOIZ], - &lnNdens[BSIM4v5RDNOIZ], ckt, THERMNOISE, - here->BSIM4v5dNodePrime, here->BSIM4v5dNode, - gdpr * m); - - NevalSrc(&noizDens[BSIM4v5RSNOIZ], - &lnNdens[BSIM4v5RSNOIZ], ckt, THERMNOISE, - here->BSIM4v5sNodePrime, here->BSIM4v5sNode, - gspr * m); - - - if ((here->BSIM4v5rgateMod == 1) || (here->BSIM4v5rgateMod == 2)) - { NevalSrc(&noizDens[BSIM4v5RGNOIZ], - &lnNdens[BSIM4v5RGNOIZ], ckt, THERMNOISE, - here->BSIM4v5gNodePrime, here->BSIM4v5gNodeExt, - here->BSIM4v5grgeltd * m); - } - else if (here->BSIM4v5rgateMod == 3) - { NevalSrc(&noizDens[BSIM4v5RGNOIZ], - &lnNdens[BSIM4v5RGNOIZ], ckt, THERMNOISE, - here->BSIM4v5gNodeMid, here->BSIM4v5gNodeExt, - here->BSIM4v5grgeltd * m); - } - else - { noizDens[BSIM4v5RGNOIZ] = 0.0; - lnNdens[BSIM4v5RGNOIZ] = - log(MAX(noizDens[BSIM4v5RGNOIZ], N_MINLOG)); - } - - bodymode = 5; - if (here->BSIM4v5rbodyMod == 2) - { if( ( !model->BSIM4v5rbps0Given) || - ( !model->BSIM4v5rbpd0Given) ) - bodymode = 1; - else - if( (!model->BSIM4v5rbsbx0Given && !model->BSIM4v5rbsby0Given) || - (!model->BSIM4v5rbdbx0Given && !model->BSIM4v5rbdby0Given) ) - bodymode = 3; - } - - if (here->BSIM4v5rbodyMod) - { - if(bodymode == 5) - { - NevalSrc(&noizDens[BSIM4v5RBPSNOIZ], - &lnNdens[BSIM4v5RBPSNOIZ], ckt, THERMNOISE, - here->BSIM4v5bNodePrime, here->BSIM4v5sbNode, - here->BSIM4v5grbps * m); - NevalSrc(&noizDens[BSIM4v5RBPDNOIZ], - &lnNdens[BSIM4v5RBPDNOIZ], ckt, THERMNOISE, - here->BSIM4v5bNodePrime, here->BSIM4v5dbNode, - here->BSIM4v5grbpd * m); - NevalSrc(&noizDens[BSIM4v5RBPBNOIZ], - &lnNdens[BSIM4v5RBPBNOIZ], ckt, THERMNOISE, - here->BSIM4v5bNodePrime, here->BSIM4v5bNode, - here->BSIM4v5grbpb * m); - NevalSrc(&noizDens[BSIM4v5RBSBNOIZ], - &lnNdens[BSIM4v5RBSBNOIZ], ckt, THERMNOISE, - here->BSIM4v5bNode, here->BSIM4v5sbNode, - here->BSIM4v5grbsb * m); - NevalSrc(&noizDens[BSIM4v5RBDBNOIZ], - &lnNdens[BSIM4v5RBDBNOIZ], ckt, THERMNOISE, - here->BSIM4v5bNode, here->BSIM4v5dbNode, - here->BSIM4v5grbdb * m); - } - if(bodymode == 3) - { - NevalSrc(&noizDens[BSIM4v5RBPSNOIZ], - &lnNdens[BSIM4v5RBPSNOIZ], ckt, THERMNOISE, - here->BSIM4v5bNodePrime, here->BSIM4v5sbNode, - here->BSIM4v5grbps * m); - NevalSrc(&noizDens[BSIM4v5RBPDNOIZ], - &lnNdens[BSIM4v5RBPDNOIZ], ckt, THERMNOISE, - here->BSIM4v5bNodePrime, here->BSIM4v5dbNode, - here->BSIM4v5grbpd * m); - NevalSrc(&noizDens[BSIM4v5RBPBNOIZ], - &lnNdens[BSIM4v5RBPBNOIZ], ckt, THERMNOISE, - here->BSIM4v5bNodePrime, here->BSIM4v5bNode, - here->BSIM4v5grbpb * m); - noizDens[BSIM4v5RBSBNOIZ] = noizDens[BSIM4v5RBDBNOIZ] = 0.0; - lnNdens[BSIM4v5RBSBNOIZ] = - log(MAX(noizDens[BSIM4v5RBSBNOIZ], N_MINLOG)); - lnNdens[BSIM4v5RBDBNOIZ] = - log(MAX(noizDens[BSIM4v5RBDBNOIZ], N_MINLOG)); - } - if(bodymode == 1) - { - NevalSrc(&noizDens[BSIM4v5RBPBNOIZ], - &lnNdens[BSIM4v5RBPBNOIZ], ckt, THERMNOISE, - here->BSIM4v5bNodePrime, here->BSIM4v5bNode, - here->BSIM4v5grbpb * m); - noizDens[BSIM4v5RBPSNOIZ] = noizDens[BSIM4v5RBPDNOIZ] = 0.0; - noizDens[BSIM4v5RBSBNOIZ] = noizDens[BSIM4v5RBDBNOIZ] = 0.0; - lnNdens[BSIM4v5RBPSNOIZ] = - log(MAX(noizDens[BSIM4v5RBPSNOIZ], N_MINLOG)); - lnNdens[BSIM4v5RBPDNOIZ] = - log(MAX(noizDens[BSIM4v5RBPDNOIZ], N_MINLOG)); - lnNdens[BSIM4v5RBSBNOIZ] = - log(MAX(noizDens[BSIM4v5RBSBNOIZ], N_MINLOG)); - lnNdens[BSIM4v5RBDBNOIZ] = - log(MAX(noizDens[BSIM4v5RBDBNOIZ], N_MINLOG)); - } - } - else - { noizDens[BSIM4v5RBPSNOIZ] = noizDens[BSIM4v5RBPDNOIZ] = 0.0; - noizDens[BSIM4v5RBPBNOIZ] = 0.0; - noizDens[BSIM4v5RBSBNOIZ] = noizDens[BSIM4v5RBDBNOIZ] = 0.0; - lnNdens[BSIM4v5RBPSNOIZ] = - log(MAX(noizDens[BSIM4v5RBPSNOIZ], N_MINLOG)); - lnNdens[BSIM4v5RBPDNOIZ] = - log(MAX(noizDens[BSIM4v5RBPDNOIZ], N_MINLOG)); - lnNdens[BSIM4v5RBPBNOIZ] = - log(MAX(noizDens[BSIM4v5RBPBNOIZ], N_MINLOG)); - lnNdens[BSIM4v5RBSBNOIZ] = - log(MAX(noizDens[BSIM4v5RBSBNOIZ], N_MINLOG)); - lnNdens[BSIM4v5RBDBNOIZ] = - log(MAX(noizDens[BSIM4v5RBDBNOIZ], N_MINLOG)); - } - - - switch(model->BSIM4v5tnoiMod) - { case 0: - T0 = here->BSIM4v5ueff * fabs(here->BSIM4v5qinv); - T1 = T0 * tmp + pParam->BSIM4v5leff - * pParam->BSIM4v5leff; - NevalSrc(&noizDens[BSIM4v5IDNOIZ], - &lnNdens[BSIM4v5IDNOIZ], ckt, - THERMNOISE, here->BSIM4v5dNodePrime, - here->BSIM4v5sNodePrime, - m * (T0 / T1) * model->BSIM4v5ntnoi); - break; - case 1: - T0 = here->BSIM4v5gm + here->BSIM4v5gmbs + here->BSIM4v5gds; - T0 *= T0; - igsquare = npart_theta * npart_theta * T0 / here->BSIM4v5IdovVds; - T1 = npart_beta * (here->BSIM4v5gm - + here->BSIM4v5gmbs) + here->BSIM4v5gds; - T2 = T1 * T1 / here->BSIM4v5IdovVds; - NevalSrc(&noizDens[BSIM4v5IDNOIZ], - &lnNdens[BSIM4v5IDNOIZ], ckt, - THERMNOISE, here->BSIM4v5dNodePrime, - here->BSIM4v5sNodePrime, m * (T2 - igsquare)); - break; - } - - NevalSrc(&noizDens[BSIM4v5FLNOIZ], NULL, - ckt, N_GAIN, here->BSIM4v5dNodePrime, - here->BSIM4v5sNodePrime, (double) 0.0); - - switch(model->BSIM4v5fnoiMod) - { case 0: - noizDens[BSIM4v5FLNOIZ] *= m * model->BSIM4v5kf - * exp(model->BSIM4v5af - * log(MAX(fabs(here->BSIM4v5cd), - N_MINLOG))) - / (pow(data->freq, model->BSIM4v5ef) - * pParam->BSIM4v5leff - * pParam->BSIM4v5leff - * model->BSIM4v5coxe); - break; - case 1: - Vds = *(ckt->CKTstates[0] + here->BSIM4v5vds); - if (Vds < 0.0) - Vds = -Vds; - - Ssi = BSIM4v5Eval1ovFNoise(Vds, model, here, - data->freq, ckt->CKTtemp); - T10 = model->BSIM4v5oxideTrapDensityA - * CONSTboltz * ckt->CKTtemp; - T11 = pParam->BSIM4v5weff * here->BSIM4v5nf * pParam->BSIM4v5leff - * pow(data->freq, model->BSIM4v5ef) * 1.0e10 - * here->BSIM4v5nstar * here->BSIM4v5nstar; - Swi = T10 / T11 * here->BSIM4v5cd - * here->BSIM4v5cd; - T1 = Swi + Ssi; - if (T1 > 0.0) - noizDens[BSIM4v5FLNOIZ] *= m * (Ssi * Swi) / T1; - else - noizDens[BSIM4v5FLNOIZ] *= 0.0; - break; - } - - lnNdens[BSIM4v5FLNOIZ] = - log(MAX(noizDens[BSIM4v5FLNOIZ], N_MINLOG)); - - - if(here->BSIM4v5mode >= 0) { /* bugfix */ - NevalSrc(&noizDens[BSIM4v5IGSNOIZ], - &lnNdens[BSIM4v5IGSNOIZ], ckt, SHOTNOISE, - here->BSIM4v5gNodePrime, here->BSIM4v5sNodePrime, - m * (here->BSIM4v5Igs + here->BSIM4v5Igcs)); - NevalSrc(&noizDens[BSIM4v5IGDNOIZ], - &lnNdens[BSIM4v5IGDNOIZ], ckt, SHOTNOISE, - here->BSIM4v5gNodePrime, here->BSIM4v5dNodePrime, - m * (here->BSIM4v5Igd + here->BSIM4v5Igcd)); - } else { - NevalSrc(&noizDens[BSIM4v5IGSNOIZ], - &lnNdens[BSIM4v5IGSNOIZ], ckt, SHOTNOISE, - here->BSIM4v5gNodePrime, here->BSIM4v5sNodePrime, - m * (here->BSIM4v5Igs + here->BSIM4v5Igcd)); - NevalSrc(&noizDens[BSIM4v5IGDNOIZ], - &lnNdens[BSIM4v5IGDNOIZ], ckt, SHOTNOISE, - here->BSIM4v5gNodePrime, here->BSIM4v5dNodePrime, - m * (here->BSIM4v5Igd + here->BSIM4v5Igcs)); - } - NevalSrc(&noizDens[BSIM4v5IGBNOIZ], - &lnNdens[BSIM4v5IGBNOIZ], ckt, SHOTNOISE, - here->BSIM4v5gNodePrime, here->BSIM4v5bNodePrime, - m * here->BSIM4v5Igb); - - - noizDens[BSIM4v5TOTNOIZ] = noizDens[BSIM4v5RDNOIZ] - + noizDens[BSIM4v5RSNOIZ] + noizDens[BSIM4v5RGNOIZ] - + noizDens[BSIM4v5RBPSNOIZ] + noizDens[BSIM4v5RBPDNOIZ] - + noizDens[BSIM4v5RBPBNOIZ] - + noizDens[BSIM4v5RBSBNOIZ] + noizDens[BSIM4v5RBDBNOIZ] - + noizDens[BSIM4v5IDNOIZ] + noizDens[BSIM4v5FLNOIZ] - + noizDens[BSIM4v5IGSNOIZ] + noizDens[BSIM4v5IGDNOIZ] - + noizDens[BSIM4v5IGBNOIZ]; - lnNdens[BSIM4v5TOTNOIZ] = - log(MAX(noizDens[BSIM4v5TOTNOIZ], N_MINLOG)); - - *OnDens += noizDens[BSIM4v5TOTNOIZ]; - - if (data->delFreq == 0.0) - { /* if we haven't done any previous - integration, we need to initialize our - "history" variables. - */ - - for (i = 0; i < BSIM4v5NSRCS; i++) - { here->BSIM4v5nVar[LNLSTDENS][i] = - lnNdens[i]; - } - - /* clear out our integration variables - if it's the first pass - */ - if (data->freq == - job->NstartFreq) - { for (i = 0; i < BSIM4v5NSRCS; i++) - { here->BSIM4v5nVar[OUTNOIZ][i] = 0.0; - here->BSIM4v5nVar[INNOIZ][i] = 0.0; - } - } - } - else - { /* data->delFreq != 0.0, - we have to integrate. - */ - for (i = 0; i < BSIM4v5NSRCS; i++) - { if (i != BSIM4v5TOTNOIZ) - { tempOnoise = Nintegrate(noizDens[i], - lnNdens[i], - here->BSIM4v5nVar[LNLSTDENS][i], - data); - tempInoise = Nintegrate(noizDens[i] - * data->GainSqInv, lnNdens[i] - + data->lnGainInv, - here->BSIM4v5nVar[LNLSTDENS][i] - + data->lnGainInv, data); - here->BSIM4v5nVar[LNLSTDENS][i] = - lnNdens[i]; - data->outNoiz += tempOnoise; - data->inNoise += tempInoise; - if (job->NStpsSm != 0) - { here->BSIM4v5nVar[OUTNOIZ][i] - += tempOnoise; - here->BSIM4v5nVar[OUTNOIZ][BSIM4v5TOTNOIZ] - += tempOnoise; - here->BSIM4v5nVar[INNOIZ][i] - += tempInoise; - here->BSIM4v5nVar[INNOIZ][BSIM4v5TOTNOIZ] - += tempInoise; - } - } - } - } - if (data->prtSummary) - { for (i = 0; i < BSIM4v5NSRCS; i++) - { /* print a summary report */ - data->outpVector[data->outNumber++] - = noizDens[i]; - } - } - break; - case INT_NOIZ: - /* already calculated, just output */ - if (job->NStpsSm != 0) - { for (i = 0; i < BSIM4v5NSRCS; i++) - { data->outpVector[data->outNumber++] - = here->BSIM4v5nVar[OUTNOIZ][i]; - data->outpVector[data->outNumber++] - = here->BSIM4v5nVar[INNOIZ][i]; - } - } - break; - } - break; - case N_CLOSE: - /* do nothing, the main calling routine will close */ - return (OK); - break; /* the plots */ - } /* switch (operation) */ - } /* for here */ - } /* for model */ - - return(OK); -} diff --git a/src/spicelib/devices/bsim4v5/b4v5par.c b/src/spicelib/devices/bsim4v5/b4v5par.c deleted file mode 100644 index e62b7f660..000000000 --- a/src/spicelib/devices/bsim4v5/b4v5par.c +++ /dev/null @@ -1,206 +0,0 @@ -/**** BSIM4.5.0 Released by Xuemei (Jane) Xi 07/29/2005 ****/ - -/********** - * Copyright 2004 Regents of the University of California. All rights reserved. - * File: b4par.c of BSIM4.5.0. - * Author: 2000 Weidong Liu - * Authors: 2001- Xuemei Xi, Mohan Dunga, Ali Niknejad, Chenming Hu. - * Project Director: Prof. Chenming Hu. - * Modified by Xuemei Xi, 04/06/2001. - * Modified by Xuemei Xi, 11/15/2002. - * Modified by Xuemei Xi, 05/09/2003. - * Modified by Xuemei Xi, Mohan Dunga, 07/29/2005. -**********/ - -#include "ngspice/ngspice.h" -#include "ngspice/ifsim.h" -#include "bsim4v5def.h" -#include "ngspice/sperror.h" -#include "ngspice/suffix.h" -#include "ngspice/fteext.h" - -int -BSIM4v5param( -int param, -IFvalue *value, -GENinstance *inst, -IFvalue *select) -{ - double scale; - - BSIM4v5instance *here = (BSIM4v5instance*)inst; - - NG_IGNORE(select); - - if (!cp_getvar("scale", CP_REAL, &scale, 0)) - scale = 1; - - switch (param) { - case BSIM4v5_W: - here->BSIM4v5w = value->rValue*scale; - here->BSIM4v5wGiven = TRUE; - break; - case BSIM4v5_L: - here->BSIM4v5l = value->rValue*scale; - here->BSIM4v5lGiven = TRUE; - break; - case BSIM4v5_M: - here->BSIM4v5m = value->rValue; - here->BSIM4v5mGiven = TRUE; - break; - case BSIM4v5_NF: - here->BSIM4v5nf = value->rValue; - here->BSIM4v5nfGiven = TRUE; - break; - case BSIM4v5_MIN: - here->BSIM4v5min = value->iValue; - here->BSIM4v5minGiven = TRUE; - break; - case BSIM4v5_AS: - here->BSIM4v5sourceArea = value->rValue*scale*scale; - here->BSIM4v5sourceAreaGiven = TRUE; - break; - case BSIM4v5_AD: - here->BSIM4v5drainArea = value->rValue*scale*scale; - here->BSIM4v5drainAreaGiven = TRUE; - break; - case BSIM4v5_PS: - here->BSIM4v5sourcePerimeter = value->rValue*scale; - here->BSIM4v5sourcePerimeterGiven = TRUE; - break; - case BSIM4v5_PD: - here->BSIM4v5drainPerimeter = value->rValue*scale; - here->BSIM4v5drainPerimeterGiven = TRUE; - break; - case BSIM4v5_NRS: - here->BSIM4v5sourceSquares = value->rValue; - here->BSIM4v5sourceSquaresGiven = TRUE; - break; - case BSIM4v5_NRD: - here->BSIM4v5drainSquares = value->rValue; - here->BSIM4v5drainSquaresGiven = TRUE; - break; - case BSIM4v5_OFF: - here->BSIM4v5off = value->iValue; - break; - case BSIM4v5_SA: - here->BSIM4v5sa = value->rValue*scale; - here->BSIM4v5saGiven = TRUE; - break; - case BSIM4v5_SB: - here->BSIM4v5sb = value->rValue*scale; - here->BSIM4v5sbGiven = TRUE; - break; - case BSIM4v5_SD: - here->BSIM4v5sd = value->rValue*scale; - here->BSIM4v5sdGiven = TRUE; - break; - case BSIM4v5_SCA: - here->BSIM4v5sca = value->rValue; - here->BSIM4v5scaGiven = TRUE; - break; - case BSIM4v5_SCB: - here->BSIM4v5scb = value->rValue; - here->BSIM4v5scbGiven = TRUE; - break; - case BSIM4v5_SCC: - here->BSIM4v5scc = value->rValue; - here->BSIM4v5sccGiven = TRUE; - break; - case BSIM4v5_SC: - here->BSIM4v5sc = value->rValue*scale; - here->BSIM4v5scGiven = TRUE; - break; - case BSIM4v5_RBSB: - here->BSIM4v5rbsb = value->rValue; - here->BSIM4v5rbsbGiven = TRUE; - break; - case BSIM4v5_RBDB: - here->BSIM4v5rbdb = value->rValue; - here->BSIM4v5rbdbGiven = TRUE; - break; - case BSIM4v5_RBPB: - here->BSIM4v5rbpb = value->rValue; - here->BSIM4v5rbpbGiven = TRUE; - break; - case BSIM4v5_RBPS: - here->BSIM4v5rbps = value->rValue; - here->BSIM4v5rbpsGiven = TRUE; - break; - case BSIM4v5_RBPD: - here->BSIM4v5rbpd = value->rValue; - here->BSIM4v5rbpdGiven = TRUE; - break; - case BSIM4v5_DELVTO: - here->BSIM4v5delvto = value->rValue; - here->BSIM4v5delvtoGiven = TRUE; - break; - case BSIM4v5_XGW: - here->BSIM4v5xgw = value->rValue; - here->BSIM4v5xgwGiven = TRUE; - break; - case BSIM4v5_NGCON: - here->BSIM4v5ngcon = value->rValue; - here->BSIM4v5ngconGiven = TRUE; - break; - case BSIM4v5_TRNQSMOD: - here->BSIM4v5trnqsMod = value->iValue; - here->BSIM4v5trnqsModGiven = TRUE; - break; - case BSIM4v5_ACNQSMOD: - here->BSIM4v5acnqsMod = value->iValue; - here->BSIM4v5acnqsModGiven = TRUE; - break; - case BSIM4v5_RBODYMOD: - here->BSIM4v5rbodyMod = value->iValue; - here->BSIM4v5rbodyModGiven = TRUE; - break; - case BSIM4v5_RGATEMOD: - here->BSIM4v5rgateMod = value->iValue; - here->BSIM4v5rgateModGiven = TRUE; - break; - case BSIM4v5_GEOMOD: - here->BSIM4v5geoMod = value->iValue; - here->BSIM4v5geoModGiven = TRUE; - break; - case BSIM4v5_RGEOMOD: - here->BSIM4v5rgeoMod = value->iValue; - here->BSIM4v5rgeoModGiven = TRUE; - break; - case BSIM4v5_IC_VDS: - here->BSIM4v5icVDS = value->rValue; - here->BSIM4v5icVDSGiven = TRUE; - break; - case BSIM4v5_IC_VGS: - here->BSIM4v5icVGS = value->rValue; - here->BSIM4v5icVGSGiven = TRUE; - break; - case BSIM4v5_IC_VBS: - here->BSIM4v5icVBS = value->rValue; - here->BSIM4v5icVBSGiven = TRUE; - break; - case BSIM4v5_IC: - /* FALLTHROUGH added to suppress GCC warning due to - * -Wimplicit-fallthrough flag */ - switch (value->v.numValue) { - case 3: - here->BSIM4v5icVBS = *(value->v.vec.rVec+2); - here->BSIM4v5icVBSGiven = TRUE; - /* FALLTHROUGH */ - case 2: - here->BSIM4v5icVGS = *(value->v.vec.rVec+1); - here->BSIM4v5icVGSGiven = TRUE; - /* FALLTHROUGH */ - case 1: - here->BSIM4v5icVDS = *(value->v.vec.rVec); - here->BSIM4v5icVDSGiven = TRUE; - break; - default: - return(E_BADPARM); - } - break; - default: - return(E_BADPARM); - } - return(OK); -} diff --git a/src/spicelib/devices/bsim4v5/b4v5pzld.c b/src/spicelib/devices/bsim4v5/b4v5pzld.c deleted file mode 100644 index 808349bbe..000000000 --- a/src/spicelib/devices/bsim4v5/b4v5pzld.c +++ /dev/null @@ -1,758 +0,0 @@ -/**** BSIM4.5.0 Released by Xuemei (Jane) Xi 07/29/2005 ****/ - -/********** - * Copyright 2005 Regents of the University of California. All rights reserved. - * File: b4pzld.c of BSIM4.5.0. - * Author: 2000 Weidong Liu - * Authors: 2001- Xuemei Xi, Mohan Dunga, Ali Niknejad, Chenming Hu. - * Project Director: Prof. Chenming Hu. - * Modified by Xuemei Xi, 10/05/2001. - **********/ - -#include "ngspice/ngspice.h" -#include "ngspice/cktdefs.h" -#include "ngspice/complex.h" -#include "ngspice/sperror.h" -#include "bsim4v5def.h" -#include "ngspice/suffix.h" - -int -BSIM4v5pzLoad( -GENmodel *inModel, -CKTcircuit *ckt, -SPcomplex *s) -{ -BSIM4v5model *model = (BSIM4v5model*)inModel; -BSIM4v5instance *here; - -double gjbd, gjbs, geltd, gcrg, gcrgg, gcrgd, gcrgs, gcrgb; -double xcggb, xcgdb, xcgsb, xcgbb, xcbgb, xcbdb, xcbsb, xcbbb; -double xcdgb, xcddb, xcdsb, xcdbb, xcsgb, xcsdb, xcssb, xcsbb; -double gds, capbd, capbs, FwdSum, RevSum, Gm, Gmbs; -double gstot, gstotd, gstotg, gstots, gstotb, gspr; -double gdtot, gdtotd, gdtotg, gdtots, gdtotb, gdpr; -double gIstotg, gIstotd, gIstots, gIstotb; -double gIdtotg, gIdtotd, gIdtots, gIdtotb; -double gIbtotg, gIbtotd, gIbtots, gIbtotb; -double gIgtotg, gIgtotd, gIgtots, gIgtotb; -double cgso, cgdo, cgbo; -double xcdbdb=0.0, xcsbsb=0.0, xcgmgmb=0.0, xcgmdb=0.0, xcgmsb=0.0, xcdgmb=0.0, xcsgmb=0.0; -double xcgmbb=0.0, xcbgmb=0.0; -double dxpart, sxpart, xgtg, xgtd, xgts, xgtb, xcqgb=0.0, xcqdb=0.0, xcqsb=0.0, xcqbb=0.0; -double gbspsp, gbbdp, gbbsp, gbspg, gbspb; -double gbspdp, gbdpdp, gbdpg, gbdpb, gbdpsp; -double ddxpart_dVd, ddxpart_dVg, ddxpart_dVb, ddxpart_dVs; -double dsxpart_dVd, dsxpart_dVg, dsxpart_dVb, dsxpart_dVs; -double T0=0.0, T1, CoxWL, qcheq, Cdg, Cdd, Cds, Csg, Csd, Css; -double ScalingFactor = 1.0e-9; -struct bsim4v5SizeDependParam *pParam; -double ggidld, ggidlg, ggidlb, ggislg, ggislb, ggisls; - -double m; - - for (; model != NULL; model = BSIM4v5nextModel(model)) - { for (here = BSIM4v5instances(model); here!= NULL; - here = BSIM4v5nextInstance(here)) - { - pParam = here->pParam; - capbd = here->BSIM4v5capbd; - capbs = here->BSIM4v5capbs; - cgso = here->BSIM4v5cgso; - cgdo = here->BSIM4v5cgdo; - cgbo = pParam->BSIM4v5cgbo; - - if (here->BSIM4v5mode >= 0) - { Gm = here->BSIM4v5gm; - Gmbs = here->BSIM4v5gmbs; - FwdSum = Gm + Gmbs; - RevSum = 0.0; - - gbbdp = -(here->BSIM4v5gbds); - gbbsp = here->BSIM4v5gbds + here->BSIM4v5gbgs + here->BSIM4v5gbbs; - gbdpg = here->BSIM4v5gbgs; - gbdpdp = here->BSIM4v5gbds; - gbdpb = here->BSIM4v5gbbs; - gbdpsp = -(gbdpg + gbdpdp + gbdpb); - - gbspdp = 0.0; - gbspg = 0.0; - gbspb = 0.0; - gbspsp = 0.0; - - if (model->BSIM4v5igcMod) - { gIstotg = here->BSIM4v5gIgsg + here->BSIM4v5gIgcsg; - gIstotd = here->BSIM4v5gIgcsd; - gIstots = here->BSIM4v5gIgss + here->BSIM4v5gIgcss; - gIstotb = here->BSIM4v5gIgcsb; - - gIdtotg = here->BSIM4v5gIgdg + here->BSIM4v5gIgcdg; - gIdtotd = here->BSIM4v5gIgdd + here->BSIM4v5gIgcdd; - gIdtots = here->BSIM4v5gIgcds; - gIdtotb = here->BSIM4v5gIgcdb; - } - else - { gIstotg = gIstotd = gIstots = gIstotb = 0.0; - gIdtotg = gIdtotd = gIdtots = gIdtotb = 0.0; - } - - if (model->BSIM4v5igbMod) - { gIbtotg = here->BSIM4v5gIgbg; - gIbtotd = here->BSIM4v5gIgbd; - gIbtots = here->BSIM4v5gIgbs; - gIbtotb = here->BSIM4v5gIgbb; - } - else - gIbtotg = gIbtotd = gIbtots = gIbtotb = 0.0; - - if ((model->BSIM4v5igcMod != 0) || (model->BSIM4v5igbMod != 0)) - { gIgtotg = gIstotg + gIdtotg + gIbtotg; - gIgtotd = gIstotd + gIdtotd + gIbtotd ; - gIgtots = gIstots + gIdtots + gIbtots; - gIgtotb = gIstotb + gIdtotb + gIbtotb; - } - else - gIgtotg = gIgtotd = gIgtots = gIgtotb = 0.0; - - if (here->BSIM4v5rgateMod == 2) - T0 = *(ckt->CKTstates[0] + here->BSIM4v5vges) - - *(ckt->CKTstates[0] + here->BSIM4v5vgs); - else if (here->BSIM4v5rgateMod == 3) - T0 = *(ckt->CKTstates[0] + here->BSIM4v5vgms) - - *(ckt->CKTstates[0] + here->BSIM4v5vgs); - if (here->BSIM4v5rgateMod > 1) - { gcrgd = here->BSIM4v5gcrgd * T0; - gcrgg = here->BSIM4v5gcrgg * T0; - gcrgs = here->BSIM4v5gcrgs * T0; - gcrgb = here->BSIM4v5gcrgb * T0; - gcrgg -= here->BSIM4v5gcrg; - gcrg = here->BSIM4v5gcrg; - } - else - gcrg = gcrgd = gcrgg = gcrgs = gcrgb = 0.0; - - if (here->BSIM4v5acnqsMod == 0) - { if (here->BSIM4v5rgateMod == 3) - { xcgmgmb = cgdo + cgso + pParam->BSIM4v5cgbo; - xcgmdb = -cgdo; - xcgmsb = -cgso; - xcgmbb = -pParam->BSIM4v5cgbo; - - xcdgmb = xcgmdb; - xcsgmb = xcgmsb; - xcbgmb = xcgmbb; - - xcggb = here->BSIM4v5cggb; - xcgdb = here->BSIM4v5cgdb; - xcgsb = here->BSIM4v5cgsb; - xcgbb = -(xcggb + xcgdb + xcgsb); - - xcdgb = here->BSIM4v5cdgb; - xcsgb = -(here->BSIM4v5cggb + here->BSIM4v5cbgb - + here->BSIM4v5cdgb); - xcbgb = here->BSIM4v5cbgb; - } - else - { xcggb = here->BSIM4v5cggb + cgdo + cgso - + pParam->BSIM4v5cgbo; - xcgdb = here->BSIM4v5cgdb - cgdo; - xcgsb = here->BSIM4v5cgsb - cgso; - xcgbb = -(xcggb + xcgdb + xcgsb); - - xcdgb = here->BSIM4v5cdgb - cgdo; - xcsgb = -(here->BSIM4v5cggb + here->BSIM4v5cbgb - + here->BSIM4v5cdgb + cgso); - xcbgb = here->BSIM4v5cbgb - pParam->BSIM4v5cgbo; - - xcdgmb = xcsgmb = xcbgmb = 0.0; - } - xcddb = here->BSIM4v5cddb + here->BSIM4v5capbd + cgdo; - xcdsb = here->BSIM4v5cdsb; - - xcsdb = -(here->BSIM4v5cgdb + here->BSIM4v5cbdb - + here->BSIM4v5cddb); - xcssb = here->BSIM4v5capbs + cgso - (here->BSIM4v5cgsb - + here->BSIM4v5cbsb + here->BSIM4v5cdsb); - - if (!here->BSIM4v5rbodyMod) - { xcdbb = -(xcdgb + xcddb + xcdsb + xcdgmb); - xcsbb = -(xcsgb + xcsdb + xcssb + xcsgmb); - xcbdb = here->BSIM4v5cbdb - here->BSIM4v5capbd; - xcbsb = here->BSIM4v5cbsb - here->BSIM4v5capbs; - xcdbdb = 0.0; - } - else - { xcdbb = -(here->BSIM4v5cddb + here->BSIM4v5cdgb - + here->BSIM4v5cdsb); - xcsbb = -(xcsgb + xcsdb + xcssb + xcsgmb) - + here->BSIM4v5capbs; - xcbdb = here->BSIM4v5cbdb; - xcbsb = here->BSIM4v5cbsb; - - xcdbdb = -here->BSIM4v5capbd; - xcsbsb = -here->BSIM4v5capbs; - } - xcbbb = -(xcbdb + xcbgb + xcbsb + xcbgmb); - - xgtg = xgtd = xgts = xgtb = 0.0; - sxpart = 0.6; - dxpart = 0.4; - ddxpart_dVd = ddxpart_dVg = ddxpart_dVb - = ddxpart_dVs = 0.0; - dsxpart_dVd = dsxpart_dVg = dsxpart_dVb - = dsxpart_dVs = 0.0; - } - else - { xcggb = xcgdb = xcgsb = xcgbb = 0.0; - xcbgb = xcbdb = xcbsb = xcbbb = 0.0; - xcdgb = xcddb = xcdsb = xcdbb = 0.0; - xcsgb = xcsdb = xcssb = xcsbb = 0.0; - - xgtg = here->BSIM4v5gtg; - xgtd = here->BSIM4v5gtd; - xgts = here->BSIM4v5gts; - xgtb = here->BSIM4v5gtb; - - xcqgb = here->BSIM4v5cqgb; - xcqdb = here->BSIM4v5cqdb; - xcqsb = here->BSIM4v5cqsb; - xcqbb = here->BSIM4v5cqbb; - - CoxWL = model->BSIM4v5coxe * here->pParam->BSIM4v5weffCV - * here->BSIM4v5nf * here->pParam->BSIM4v5leffCV; - qcheq = -(here->BSIM4v5qgate + here->BSIM4v5qbulk); - if (fabs(qcheq) <= 1.0e-5 * CoxWL) - { if (model->BSIM4v5xpart < 0.5) - { dxpart = 0.4; - } - else if (model->BSIM4v5xpart > 0.5) - { dxpart = 0.0; - } - else - { dxpart = 0.5; - } - ddxpart_dVd = ddxpart_dVg = ddxpart_dVb - = ddxpart_dVs = 0.0; - } - else - { dxpart = here->BSIM4v5qdrn / qcheq; - Cdd = here->BSIM4v5cddb; - Csd = -(here->BSIM4v5cgdb + here->BSIM4v5cddb - + here->BSIM4v5cbdb); - ddxpart_dVd = (Cdd - dxpart * (Cdd + Csd)) / qcheq; - Cdg = here->BSIM4v5cdgb; - Csg = -(here->BSIM4v5cggb + here->BSIM4v5cdgb - + here->BSIM4v5cbgb); - ddxpart_dVg = (Cdg - dxpart * (Cdg + Csg)) / qcheq; - - Cds = here->BSIM4v5cdsb; - Css = -(here->BSIM4v5cgsb + here->BSIM4v5cdsb - + here->BSIM4v5cbsb); - ddxpart_dVs = (Cds - dxpart * (Cds + Css)) / qcheq; - - ddxpart_dVb = -(ddxpart_dVd + ddxpart_dVg - + ddxpart_dVs); - } - sxpart = 1.0 - dxpart; - dsxpart_dVd = -ddxpart_dVd; - dsxpart_dVg = -ddxpart_dVg; - dsxpart_dVs = -ddxpart_dVs; - dsxpart_dVb = -(dsxpart_dVd + dsxpart_dVg + dsxpart_dVs); - } - } - else - { Gm = -here->BSIM4v5gm; - Gmbs = -here->BSIM4v5gmbs; - FwdSum = 0.0; - RevSum = -(Gm + Gmbs); - - gbbsp = -(here->BSIM4v5gbds); - gbbdp = here->BSIM4v5gbds + here->BSIM4v5gbgs + here->BSIM4v5gbbs; - - gbdpg = 0.0; - gbdpsp = 0.0; - gbdpb = 0.0; - gbdpdp = 0.0; - - gbspg = here->BSIM4v5gbgs; - gbspsp = here->BSIM4v5gbds; - gbspb = here->BSIM4v5gbbs; - gbspdp = -(gbspg + gbspsp + gbspb); - - if (model->BSIM4v5igcMod) - { gIstotg = here->BSIM4v5gIgsg + here->BSIM4v5gIgcdg; - gIstotd = here->BSIM4v5gIgcds; - gIstots = here->BSIM4v5gIgss + here->BSIM4v5gIgcdd; - gIstotb = here->BSIM4v5gIgcdb; - - gIdtotg = here->BSIM4v5gIgdg + here->BSIM4v5gIgcsg; - gIdtotd = here->BSIM4v5gIgdd + here->BSIM4v5gIgcss; - gIdtots = here->BSIM4v5gIgcsd; - gIdtotb = here->BSIM4v5gIgcsb; - } - else - { gIstotg = gIstotd = gIstots = gIstotb = 0.0; - gIdtotg = gIdtotd = gIdtots = gIdtotb = 0.0; - } - - if (model->BSIM4v5igbMod) - { gIbtotg = here->BSIM4v5gIgbg; - gIbtotd = here->BSIM4v5gIgbs; - gIbtots = here->BSIM4v5gIgbd; - gIbtotb = here->BSIM4v5gIgbb; - } - else - gIbtotg = gIbtotd = gIbtots = gIbtotb = 0.0; - - if ((model->BSIM4v5igcMod != 0) || (model->BSIM4v5igbMod != 0)) - { gIgtotg = gIstotg + gIdtotg + gIbtotg; - gIgtotd = gIstotd + gIdtotd + gIbtotd ; - gIgtots = gIstots + gIdtots + gIbtots; - gIgtotb = gIstotb + gIdtotb + gIbtotb; - } - else - gIgtotg = gIgtotd = gIgtots = gIgtotb = 0.0; - - if (here->BSIM4v5rgateMod == 2) - T0 = *(ckt->CKTstates[0] + here->BSIM4v5vges) - - *(ckt->CKTstates[0] + here->BSIM4v5vgs); - else if (here->BSIM4v5rgateMod == 3) - T0 = *(ckt->CKTstates[0] + here->BSIM4v5vgms) - - *(ckt->CKTstates[0] + here->BSIM4v5vgs); - if (here->BSIM4v5rgateMod > 1) - { gcrgd = here->BSIM4v5gcrgs * T0; - gcrgg = here->BSIM4v5gcrgg * T0; - gcrgs = here->BSIM4v5gcrgd * T0; - gcrgb = here->BSIM4v5gcrgb * T0; - gcrgg -= here->BSIM4v5gcrg; - gcrg = here->BSIM4v5gcrg; - } - else - gcrg = gcrgd = gcrgg = gcrgs = gcrgb = 0.0; - - if (here->BSIM4v5acnqsMod == 0) - { if (here->BSIM4v5rgateMod == 3) - { xcgmgmb = cgdo + cgso + pParam->BSIM4v5cgbo; - xcgmdb = -cgdo; - xcgmsb = -cgso; - xcgmbb = -pParam->BSIM4v5cgbo; - - xcdgmb = xcgmdb; - xcsgmb = xcgmsb; - xcbgmb = xcgmbb; - - xcggb = here->BSIM4v5cggb; - xcgdb = here->BSIM4v5cgsb; - xcgsb = here->BSIM4v5cgdb; - xcgbb = -(xcggb + xcgdb + xcgsb); - - xcdgb = -(here->BSIM4v5cggb + here->BSIM4v5cbgb - + here->BSIM4v5cdgb); - xcsgb = here->BSIM4v5cdgb; - xcbgb = here->BSIM4v5cbgb; - } - else - { xcggb = here->BSIM4v5cggb + cgdo + cgso - + pParam->BSIM4v5cgbo; - xcgdb = here->BSIM4v5cgsb - cgdo; - xcgsb = here->BSIM4v5cgdb - cgso; - xcgbb = -(xcggb + xcgdb + xcgsb); - - xcdgb = -(here->BSIM4v5cggb + here->BSIM4v5cbgb - + here->BSIM4v5cdgb + cgdo); - xcsgb = here->BSIM4v5cdgb - cgso; - xcbgb = here->BSIM4v5cbgb - pParam->BSIM4v5cgbo; - - xcdgmb = xcsgmb = xcbgmb = 0.0; - } - xcddb = here->BSIM4v5capbd + cgdo - (here->BSIM4v5cgsb - + here->BSIM4v5cbsb + here->BSIM4v5cdsb); - xcdsb = -(here->BSIM4v5cgdb + here->BSIM4v5cbdb - + here->BSIM4v5cddb); - - xcsdb = here->BSIM4v5cdsb; - xcssb = here->BSIM4v5cddb + here->BSIM4v5capbs + cgso; - - if (!here->BSIM4v5rbodyMod) - { xcdbb = -(xcdgb + xcddb + xcdsb + xcdgmb); - xcsbb = -(xcsgb + xcsdb + xcssb + xcsgmb); - xcbdb = here->BSIM4v5cbsb - here->BSIM4v5capbd; - xcbsb = here->BSIM4v5cbdb - here->BSIM4v5capbs; - xcdbdb = 0.0; - } - else - { xcdbb = -(xcdgb + xcddb + xcdsb + xcdgmb) - + here->BSIM4v5capbd; - xcsbb = -(here->BSIM4v5cddb + here->BSIM4v5cdgb - + here->BSIM4v5cdsb); - xcbdb = here->BSIM4v5cbsb; - xcbsb = here->BSIM4v5cbdb; - xcdbdb = -here->BSIM4v5capbd; - xcsbsb = -here->BSIM4v5capbs; - } - xcbbb = -(xcbgb + xcbdb + xcbsb + xcbgmb); - - xgtg = xgtd = xgts = xgtb = 0.0; - sxpart = 0.4; - dxpart = 0.6; - ddxpart_dVd = ddxpart_dVg = ddxpart_dVb - = ddxpart_dVs = 0.0; - dsxpart_dVd = dsxpart_dVg = dsxpart_dVb - = dsxpart_dVs = 0.0; - } - else - { xcggb = xcgdb = xcgsb = xcgbb = 0.0; - xcbgb = xcbdb = xcbsb = xcbbb = 0.0; - xcdgb = xcddb = xcdsb = xcdbb = 0.0; - xcsgb = xcsdb = xcssb = xcsbb = 0.0; - - xgtg = here->BSIM4v5gtg; - xgtd = here->BSIM4v5gts; - xgts = here->BSIM4v5gtd; - xgtb = here->BSIM4v5gtb; - - xcqgb = here->BSIM4v5cqgb; - xcqdb = here->BSIM4v5cqsb; - xcqsb = here->BSIM4v5cqdb; - xcqbb = here->BSIM4v5cqbb; - - CoxWL = model->BSIM4v5coxe * here->pParam->BSIM4v5weffCV - * here->BSIM4v5nf * here->pParam->BSIM4v5leffCV; - qcheq = -(here->BSIM4v5qgate + here->BSIM4v5qbulk); - if (fabs(qcheq) <= 1.0e-5 * CoxWL) - { if (model->BSIM4v5xpart < 0.5) - { sxpart = 0.4; - } - else if (model->BSIM4v5xpart > 0.5) - { sxpart = 0.0; - } - else - { sxpart = 0.5; - } - dsxpart_dVd = dsxpart_dVg = dsxpart_dVb - = dsxpart_dVs = 0.0; - } - else - { sxpart = here->BSIM4v5qdrn / qcheq; - Css = here->BSIM4v5cddb; - Cds = -(here->BSIM4v5cgdb + here->BSIM4v5cddb - + here->BSIM4v5cbdb); - dsxpart_dVs = (Css - sxpart * (Css + Cds)) / qcheq; - Csg = here->BSIM4v5cdgb; - Cdg = -(here->BSIM4v5cggb + here->BSIM4v5cdgb - + here->BSIM4v5cbgb); - dsxpart_dVg = (Csg - sxpart * (Csg + Cdg)) / qcheq; - - Csd = here->BSIM4v5cdsb; - Cdd = -(here->BSIM4v5cgsb + here->BSIM4v5cdsb - + here->BSIM4v5cbsb); - dsxpart_dVd = (Csd - sxpart * (Csd + Cdd)) / qcheq; - - dsxpart_dVb = -(dsxpart_dVd + dsxpart_dVg - + dsxpart_dVs); - } - dxpart = 1.0 - sxpart; - ddxpart_dVd = -dsxpart_dVd; - ddxpart_dVg = -dsxpart_dVg; - ddxpart_dVs = -dsxpart_dVs; - ddxpart_dVb = -(ddxpart_dVd + ddxpart_dVg + ddxpart_dVs); - } - } - - if (model->BSIM4v5rdsMod == 1) - { gstot = here->BSIM4v5gstot; - gstotd = here->BSIM4v5gstotd; - gstotg = here->BSIM4v5gstotg; - gstots = here->BSIM4v5gstots - gstot; - gstotb = here->BSIM4v5gstotb; - - gdtot = here->BSIM4v5gdtot; - gdtotd = here->BSIM4v5gdtotd - gdtot; - gdtotg = here->BSIM4v5gdtotg; - gdtots = here->BSIM4v5gdtots; - gdtotb = here->BSIM4v5gdtotb; - } - else - { gstot = gstotd = gstotg = gstots = gstotb = 0.0; - gdtot = gdtotd = gdtotg = gdtots = gdtotb = 0.0; - } - - - T1 = *(ckt->CKTstate0 + here->BSIM4v5qdef) * here->BSIM4v5gtau; - gds = here->BSIM4v5gds; - - /* - * Loading PZ matrix - */ - - m = here->BSIM4v5m; - - if (!model->BSIM4v5rdsMod) - { gdpr = here->BSIM4v5drainConductance; - gspr = here->BSIM4v5sourceConductance; - } - else - gdpr = gspr = 0.0; - - if (!here->BSIM4v5rbodyMod) - { gjbd = here->BSIM4v5gbd; - gjbs = here->BSIM4v5gbs; - } - else - gjbd = gjbs = 0.0; - - geltd = here->BSIM4v5grgeltd; - - if (here->BSIM4v5rgateMod == 1) - { *(here->BSIM4v5GEgePtr) += m * geltd; - *(here->BSIM4v5GPgePtr) -= m * geltd; - *(here->BSIM4v5GEgpPtr) -= m * geltd; - - *(here->BSIM4v5GPgpPtr ) += m * xcggb * s->real; - *(here->BSIM4v5GPgpPtr +1) += m * xcggb * s->imag; - *(here->BSIM4v5GPgpPtr) += m * (geltd - xgtg + gIgtotg); - *(here->BSIM4v5GPdpPtr ) += m * xcgdb * s->real; - *(here->BSIM4v5GPdpPtr +1) += m * xcgdb * s->imag; - *(here->BSIM4v5GPdpPtr) -= m * (xgtd - gIgtotd); - *(here->BSIM4v5GPspPtr ) += m * xcgsb * s->real; - *(here->BSIM4v5GPspPtr +1) += m * xcgsb * s->imag; - *(here->BSIM4v5GPspPtr) -= m * (xgts - gIgtots); - *(here->BSIM4v5GPbpPtr ) += m * xcgbb * s->real; - *(here->BSIM4v5GPbpPtr +1) += m * xcgbb * s->imag; - *(here->BSIM4v5GPbpPtr) -= m * (xgtb - gIgtotb); - } - else if (here->BSIM4v5rgateMod == 2) - { *(here->BSIM4v5GEgePtr) += m * gcrg; - *(here->BSIM4v5GEgpPtr) += m * gcrgg; - *(here->BSIM4v5GEdpPtr) += m * gcrgd; - *(here->BSIM4v5GEspPtr) += m * gcrgs; - *(here->BSIM4v5GEbpPtr) += m * gcrgb; - - *(here->BSIM4v5GPgePtr) -= m * gcrg; - *(here->BSIM4v5GPgpPtr ) += m * xcggb * s->real; - *(here->BSIM4v5GPgpPtr +1) += m * xcggb * s->imag; - *(here->BSIM4v5GPgpPtr) -= m * (gcrgg + xgtg - gIgtotg); - *(here->BSIM4v5GPdpPtr ) += m * xcgdb * s->real; - *(here->BSIM4v5GPdpPtr +1) += m * xcgdb * s->imag; - *(here->BSIM4v5GPdpPtr) -= m * (gcrgd + xgtd - gIgtotd); - *(here->BSIM4v5GPspPtr ) += m * xcgsb * s->real; - *(here->BSIM4v5GPspPtr +1) += m * xcgsb * s->imag; - *(here->BSIM4v5GPspPtr) -= m * (gcrgs + xgts - gIgtots); - *(here->BSIM4v5GPbpPtr ) += m * xcgbb * s->real; - *(here->BSIM4v5GPbpPtr +1) += m * xcgbb * s->imag; - *(here->BSIM4v5GPbpPtr) -= m * (gcrgb + xgtb - gIgtotb); - } - else if (here->BSIM4v5rgateMod == 3) - { *(here->BSIM4v5GEgePtr) += m * geltd; - *(here->BSIM4v5GEgmPtr) -= m * geltd; - *(here->BSIM4v5GMgePtr) -= m * geltd; - *(here->BSIM4v5GMgmPtr) += m * (geltd + gcrg); - *(here->BSIM4v5GMgmPtr ) += m * xcgmgmb * s->real; - *(here->BSIM4v5GMgmPtr +1) += m * xcgmgmb * s->imag; - - *(here->BSIM4v5GMdpPtr) += m * gcrgd; - *(here->BSIM4v5GMdpPtr ) += m * xcgmdb * s->real; - *(here->BSIM4v5GMdpPtr +1) += m * xcgmdb * s->imag; - *(here->BSIM4v5GMgpPtr) += m * gcrgg; - *(here->BSIM4v5GMspPtr) += m * gcrgs; - *(here->BSIM4v5GMspPtr ) += m * xcgmsb * s->real; - *(here->BSIM4v5GMspPtr +1) += m * xcgmsb * s->imag; - *(here->BSIM4v5GMbpPtr) += m * gcrgb; - *(here->BSIM4v5GMbpPtr ) += m * xcgmbb * s->real; - *(here->BSIM4v5GMbpPtr +1) += m * xcgmbb * s->imag; - - *(here->BSIM4v5DPgmPtr ) += m * xcdgmb * s->real; - *(here->BSIM4v5DPgmPtr +1) += m * xcdgmb * s->imag; - *(here->BSIM4v5GPgmPtr) -= m * gcrg; - *(here->BSIM4v5SPgmPtr ) += m * xcsgmb * s->real; - *(here->BSIM4v5SPgmPtr +1) += m * xcsgmb * s->imag; - *(here->BSIM4v5BPgmPtr ) += m * xcbgmb * s->real; - *(here->BSIM4v5BPgmPtr +1) += m * xcbgmb * s->imag; - - *(here->BSIM4v5GPgpPtr) -= m * (gcrgg + xgtg - gIgtotg); - *(here->BSIM4v5GPgpPtr ) += m * xcggb * s->real; - *(here->BSIM4v5GPgpPtr +1) += m * xcggb * s->imag; - *(here->BSIM4v5GPdpPtr) -= m * (gcrgd + xgtd - gIgtotd); - *(here->BSIM4v5GPdpPtr ) += m * xcgdb * s->real; - *(here->BSIM4v5GPdpPtr +1) += m * xcgdb * s->imag; - *(here->BSIM4v5GPspPtr) -= m * (gcrgs + xgts - gIgtots); - *(here->BSIM4v5GPspPtr ) += m * xcgsb * s->real; - *(here->BSIM4v5GPspPtr +1) += m * xcgsb * s->imag; - *(here->BSIM4v5GPbpPtr) -= m * (gcrgb + xgtb - gIgtotb); - *(here->BSIM4v5GPbpPtr ) += m * xcgbb * s->real; - *(here->BSIM4v5GPbpPtr +1) += m * xcgbb * s->imag; - } - else - { *(here->BSIM4v5GPdpPtr ) += m * xcgdb * s->real; - *(here->BSIM4v5GPdpPtr +1) += m * xcgdb * s->imag; - *(here->BSIM4v5GPdpPtr) -= m * (xgtd - gIgtotd); - *(here->BSIM4v5GPgpPtr ) += m * xcggb * s->real; - *(here->BSIM4v5GPgpPtr +1) += m * xcggb * s->imag; - *(here->BSIM4v5GPgpPtr) -= m * (xgtg - gIgtotg); - *(here->BSIM4v5GPspPtr ) += m * xcgsb * s->real; - *(here->BSIM4v5GPspPtr +1) += m * xcgsb * s->imag; - *(here->BSIM4v5GPspPtr) -= m * (xgts - gIgtots); - *(here->BSIM4v5GPbpPtr ) += m * xcgbb * s->real; - *(here->BSIM4v5GPbpPtr +1) += m * xcgbb * s->imag; - *(here->BSIM4v5GPbpPtr) -= m * (xgtb - gIgtotb); - } - - if (model->BSIM4v5rdsMod) - { (*(here->BSIM4v5DgpPtr) += m * gdtotg); - (*(here->BSIM4v5DspPtr) += m * gdtots); - (*(here->BSIM4v5DbpPtr) += m * gdtotb); - (*(here->BSIM4v5SdpPtr) += m * gstotd); - (*(here->BSIM4v5SgpPtr) += m * gstotg); - (*(here->BSIM4v5SbpPtr) += m * gstotb); - } - - *(here->BSIM4v5DPdpPtr ) += m * xcddb * s->real; - *(here->BSIM4v5DPdpPtr +1) += m * xcddb * s->imag; - *(here->BSIM4v5DPdpPtr) += m * (gdpr + gds + here->BSIM4v5gbd - - gdtotd + RevSum + gbdpdp - gIdtotd - + dxpart * xgtd + T1 * ddxpart_dVd); - *(here->BSIM4v5DPdPtr) -= m * (gdpr + gdtot); - *(here->BSIM4v5DPgpPtr ) += m * xcdgb * s->real; - *(here->BSIM4v5DPgpPtr +1) += m * xcdgb * s->imag; - *(here->BSIM4v5DPgpPtr) += m * (Gm - gdtotg + gbdpg - gIdtotg - + T1 * ddxpart_dVg + dxpart * xgtg); - *(here->BSIM4v5DPspPtr ) += m * xcdsb * s->real; - *(here->BSIM4v5DPspPtr +1) += m * xcdsb * s->imag; - *(here->BSIM4v5DPspPtr) -= m * (gds + FwdSum + gdtots - gbdpsp + gIdtots - - T1 * ddxpart_dVs - dxpart * xgts); - *(here->BSIM4v5DPbpPtr ) += m * xcdbb * s->real; - *(here->BSIM4v5DPbpPtr +1) += m * xcdbb * s->imag; - *(here->BSIM4v5DPbpPtr) -= m * (gjbd + gdtotb - Gmbs - gbdpb + gIdtotb - - T1 * ddxpart_dVb - dxpart * xgtb); - - *(here->BSIM4v5DdpPtr) -= m * (gdpr - gdtotd); - *(here->BSIM4v5DdPtr) += m * (gdpr + gdtot); - - *(here->BSIM4v5SPdpPtr ) += m * xcsdb * s->real; - *(here->BSIM4v5SPdpPtr +1) += m * xcsdb * s->imag; - *(here->BSIM4v5SPdpPtr) -= m * (gds + gstotd + RevSum - gbspdp + gIstotd - - T1 * dsxpart_dVd - sxpart * xgtd); - *(here->BSIM4v5SPgpPtr ) += m * xcsgb * s->real; - *(here->BSIM4v5SPgpPtr +1) += m * xcsgb * s->imag; - *(here->BSIM4v5SPgpPtr) -= m * (Gm + gstotg - gbspg + gIstotg - - T1 * dsxpart_dVg - sxpart * xgtg); - *(here->BSIM4v5SPspPtr ) += m * xcssb * s->real; - *(here->BSIM4v5SPspPtr +1) += m * xcssb * s->imag; - *(here->BSIM4v5SPspPtr) += m * (gspr + gds + here->BSIM4v5gbs - gIstots - - gstots + FwdSum + gbspsp - + sxpart * xgts + T1 * dsxpart_dVs); - *(here->BSIM4v5SPsPtr) -= m * (gspr + gstot); - *(here->BSIM4v5SPbpPtr ) += m * xcsbb * s->real; - *(here->BSIM4v5SPbpPtr +1) += m * xcsbb * s->imag; - *(here->BSIM4v5SPbpPtr) -= m * (gjbs + gstotb + Gmbs - gbspb + gIstotb - - T1 * dsxpart_dVb - sxpart * xgtb); - - *(here->BSIM4v5SspPtr) -= m * (gspr - gstots); - *(here->BSIM4v5SsPtr) += m * (gspr + gstot); - - *(here->BSIM4v5BPdpPtr ) += m * xcbdb * s->real; - *(here->BSIM4v5BPdpPtr +1) += m * xcbdb * s->imag; - *(here->BSIM4v5BPdpPtr) -= m * (gjbd - gbbdp + gIbtotd); - *(here->BSIM4v5BPgpPtr ) += m * xcbgb * s->real; - *(here->BSIM4v5BPgpPtr +1) += m * xcbgb * s->imag; - *(here->BSIM4v5BPgpPtr) -= m * (here->BSIM4v5gbgs + gIbtotg); - *(here->BSIM4v5BPspPtr ) += m * xcbsb * s->real; - *(here->BSIM4v5BPspPtr +1) += m * xcbsb * s->imag; - *(here->BSIM4v5BPspPtr) -= m * (gjbs - gbbsp + gIbtots); - *(here->BSIM4v5BPbpPtr ) += m * xcbbb * s->real; - *(here->BSIM4v5BPbpPtr +1) += m * xcbbb * s->imag; - *(here->BSIM4v5BPbpPtr) += m * (gjbd + gjbs - here->BSIM4v5gbbs - - gIbtotb); - ggidld = here->BSIM4v5ggidld; - ggidlg = here->BSIM4v5ggidlg; - ggidlb = here->BSIM4v5ggidlb; - ggislg = here->BSIM4v5ggislg; - ggisls = here->BSIM4v5ggisls; - ggislb = here->BSIM4v5ggislb; - - /* stamp gidl */ - (*(here->BSIM4v5DPdpPtr) += m * ggidld); - (*(here->BSIM4v5DPgpPtr) += m * ggidlg); - (*(here->BSIM4v5DPspPtr) -= m * ((ggidlg + ggidld) + ggidlb)); - (*(here->BSIM4v5DPbpPtr) += m * ggidlb); - (*(here->BSIM4v5BPdpPtr) -= m * ggidld); - (*(here->BSIM4v5BPgpPtr) -= m * ggidlg); - (*(here->BSIM4v5BPspPtr) += m * ((ggidlg + ggidld) + ggidlb)); - (*(here->BSIM4v5BPbpPtr) -= m * ggidlb); - /* stamp gisl */ - (*(here->BSIM4v5SPdpPtr) -= m * ((ggisls + ggislg) + ggislb)); - (*(here->BSIM4v5SPgpPtr) += m * ggislg); - (*(here->BSIM4v5SPspPtr) += m * ggisls); - (*(here->BSIM4v5SPbpPtr) += m * ggislb); - (*(here->BSIM4v5BPdpPtr) += m * ((ggislg + ggisls) + ggislb)); - (*(here->BSIM4v5BPgpPtr) -= m * ggislg); - (*(here->BSIM4v5BPspPtr) -= m * ggisls); - (*(here->BSIM4v5BPbpPtr) -= m * ggislb); - - if (here->BSIM4v5rbodyMod) - { (*(here->BSIM4v5DPdbPtr ) += m * xcdbdb * s->real); - (*(here->BSIM4v5DPdbPtr +1) += m * xcdbdb * s->imag); - (*(here->BSIM4v5DPdbPtr) -= m * here->BSIM4v5gbd); - (*(here->BSIM4v5SPsbPtr ) += m * xcsbsb * s->real); - (*(here->BSIM4v5SPsbPtr +1) += m * xcsbsb * s->imag); - (*(here->BSIM4v5SPsbPtr) -= m * here->BSIM4v5gbs); - - (*(here->BSIM4v5DBdpPtr ) += m * xcdbdb * s->real); - (*(here->BSIM4v5DBdpPtr +1) += m * xcdbdb * s->imag); - (*(here->BSIM4v5DBdpPtr) -= m * here->BSIM4v5gbd); - (*(here->BSIM4v5DBdbPtr ) -= m * xcdbdb * s->real); - (*(here->BSIM4v5DBdbPtr +1) -= m * xcdbdb * s->imag); - (*(here->BSIM4v5DBdbPtr) += m * (here->BSIM4v5gbd + here->BSIM4v5grbpd - + here->BSIM4v5grbdb)); - (*(here->BSIM4v5DBbpPtr) -= m * here->BSIM4v5grbpd); - (*(here->BSIM4v5DBbPtr) -= m * here->BSIM4v5grbdb); - - (*(here->BSIM4v5BPdbPtr) -= m * here->BSIM4v5grbpd); - (*(here->BSIM4v5BPbPtr) -= m * here->BSIM4v5grbpb); - (*(here->BSIM4v5BPsbPtr) -= m * here->BSIM4v5grbps); - (*(here->BSIM4v5BPbpPtr) += m * (here->BSIM4v5grbpd + here->BSIM4v5grbps - + here->BSIM4v5grbpb)); - /* WDL: (-here->BSIM4v5gbbs) already added to BPbpPtr */ - - (*(here->BSIM4v5SBspPtr ) += m * xcsbsb * s->real); - (*(here->BSIM4v5SBspPtr +1) += m * xcsbsb * s->imag); - (*(here->BSIM4v5SBspPtr) -= m * here->BSIM4v5gbs); - (*(here->BSIM4v5SBbpPtr) -= m * here->BSIM4v5grbps); - (*(here->BSIM4v5SBbPtr) -= m * here->BSIM4v5grbsb); - (*(here->BSIM4v5SBsbPtr ) -= m * xcsbsb * s->real); - (*(here->BSIM4v5SBsbPtr +1) -= m * xcsbsb * s->imag); - (*(here->BSIM4v5SBsbPtr) += m * (here->BSIM4v5gbs - + here->BSIM4v5grbps + here->BSIM4v5grbsb)); - - (*(here->BSIM4v5BdbPtr) -= m * here->BSIM4v5grbdb); - (*(here->BSIM4v5BbpPtr) -= m * here->BSIM4v5grbpb); - (*(here->BSIM4v5BsbPtr) -= m * here->BSIM4v5grbsb); - (*(here->BSIM4v5BbPtr) += m * (here->BSIM4v5grbsb + here->BSIM4v5grbdb - + here->BSIM4v5grbpb)); - } - - if (here->BSIM4v5acnqsMod) - { *(here->BSIM4v5QqPtr ) += m * s->real * ScalingFactor; - *(here->BSIM4v5QqPtr +1) += m * s->imag * ScalingFactor; - *(here->BSIM4v5QgpPtr ) -= m * xcqgb * s->real; - *(here->BSIM4v5QgpPtr +1) -= m * xcqgb * s->imag; - *(here->BSIM4v5QdpPtr ) -= m * xcqdb * s->real; - *(here->BSIM4v5QdpPtr +1) -= m * xcqdb * s->imag; - *(here->BSIM4v5QbpPtr ) -= m * xcqbb * s->real; - *(here->BSIM4v5QbpPtr +1) -= m * xcqbb * s->imag; - *(here->BSIM4v5QspPtr ) -= m * xcqsb * s->real; - *(here->BSIM4v5QspPtr +1) -= m * xcqsb * s->imag; - - *(here->BSIM4v5GPqPtr) -= m * here->BSIM4v5gtau; - *(here->BSIM4v5DPqPtr) += m * dxpart * here->BSIM4v5gtau; - *(here->BSIM4v5SPqPtr) += m * sxpart * here->BSIM4v5gtau; - - *(here->BSIM4v5QqPtr) += m * here->BSIM4v5gtau; - *(here->BSIM4v5QgpPtr) += m * xgtg; - *(here->BSIM4v5QdpPtr) += m * xgtd; - *(here->BSIM4v5QbpPtr) += m * xgtb; - *(here->BSIM4v5QspPtr) += m * xgts; - } - } - } - return(OK); -} diff --git a/src/spicelib/devices/bsim4v5/b4v5set.c b/src/spicelib/devices/bsim4v5/b4v5set.c deleted file mode 100644 index 36bfbf553..000000000 --- a/src/spicelib/devices/bsim4v5/b4v5set.c +++ /dev/null @@ -1,2194 +0,0 @@ -/**** BSIM4.5.0 Released by Xuemei (Jane) Xi 07/29/2005 ****/ - -/********** - * Copyright 2005 Regents of the University of California. All rights reserved. - * File: b4set.c of BSIM4.5.0. - * Author: 2000 Weidong Liu - * Authors: 2001- Xuemei Xi, Mohan Dunga, Ali Niknejad, Chenming Hu. - * Project Director: Prof. Chenming Hu. - * Modified by Xuemei Xi, 04/06/2001. - * Modified by Xuemei Xi, 10/05/2001. - * Modified by Xuemei Xi, 11/15/2002. - * Modified by Xuemei Xi, 05/09/2003. - * Modified by Xuemei Xi, 03/04/2004. - * Modified by Xuemei Xi, Mohan Dunga, 07/29/2005. -**********/ - -#include "ngspice/ngspice.h" -#include "ngspice/jobdefs.h" -#include "ngspice/ftedefs.h" -#include "ngspice/smpdefs.h" -#include "ngspice/cktdefs.h" -#include "bsim4v5def.h" -#include "ngspice/const.h" -#include "ngspice/sperror.h" -#include "ngspice/suffix.h" - -#ifdef USE_OMP -#include "ngspice/cpextern.h" -#endif - -#define MAX_EXP 5.834617425e14 -#define MIN_EXP 1.713908431e-15 -#define EXP_THRESHOLD 34.0 -#define EPS0 8.85418e-12 -#define EPSSI 1.03594e-10 -#define PI 3.141592654 -#define Charge_q 1.60219e-19 - - -int -BSIM4v5setup( -SMPmatrix *matrix, -GENmodel *inModel, -CKTcircuit *ckt, -int *states) -{ -BSIM4v5model *model = (BSIM4v5model*)inModel; -BSIM4v5instance *here; -int error; -CKTnode *tmp; -int noiseAnalGiven = 0, createNode; /* Criteria for new node creation */ -double Rtot, DMCGeff, DMCIeff, DMDGeff; -JOB *job; - -#ifdef USE_OMP -int idx, InstCount; -BSIM4v5instance **InstArray; -#endif - - /* Search for a noise analysis request */ - for (job = ft_curckt->ci_curTask->jobs; job; job = job->JOBnextJob) { - if(strcmp(job->JOBname,"Noise Analysis")==0) { - noiseAnalGiven = 1; - break; - } - } - - /* loop through all the BSIM4v5 device models */ - for( ; model != NULL; model = BSIM4v5nextModel(model)) - { /* process defaults of model parameters */ - if (!model->BSIM4v5typeGiven) - model->BSIM4v5type = NMOS; - - if (!model->BSIM4v5mobModGiven) - model->BSIM4v5mobMod = 0; - else if ((model->BSIM4v5mobMod != 0) && (model->BSIM4v5mobMod != 1) - && (model->BSIM4v5mobMod != 2)) - { model->BSIM4v5mobMod = 0; - printf("Warning: mobMod has been set to its default value: 0.\n"); - } - - if (!model->BSIM4v5binUnitGiven) - model->BSIM4v5binUnit = 1; - if (!model->BSIM4v5paramChkGiven) - model->BSIM4v5paramChk = 1; - - if (!model->BSIM4v5dioModGiven) - model->BSIM4v5dioMod = 1; - else if ((model->BSIM4v5dioMod != 0) && (model->BSIM4v5dioMod != 1) - && (model->BSIM4v5dioMod != 2)) - { model->BSIM4v5dioMod = 1; - printf("Warning: dioMod has been set to its default value: 1.\n"); - } - - if (!model->BSIM4v5capModGiven) - model->BSIM4v5capMod = 2; - else if ((model->BSIM4v5capMod != 0) && (model->BSIM4v5capMod != 1) - && (model->BSIM4v5capMod != 2)) - { model->BSIM4v5capMod = 2; - printf("Warning: capMod has been set to its default value: 2.\n"); - } - - if (!model->BSIM4v5rdsModGiven) - model->BSIM4v5rdsMod = 0; - else if ((model->BSIM4v5rdsMod != 0) && (model->BSIM4v5rdsMod != 1)) - { model->BSIM4v5rdsMod = 0; - printf("Warning: rdsMod has been set to its default value: 0.\n"); - } - if (!model->BSIM4v5rbodyModGiven) - model->BSIM4v5rbodyMod = 0; - else if ((model->BSIM4v5rbodyMod != 0) && (model->BSIM4v5rbodyMod != 1) && (model->BSIM4v5rbodyMod != 2)) - { model->BSIM4v5rbodyMod = 0; - printf("Warning: rbodyMod has been set to its default value: 0.\n"); - } - - if (!model->BSIM4v5rgateModGiven) - model->BSIM4v5rgateMod = 0; - else if ((model->BSIM4v5rgateMod != 0) && (model->BSIM4v5rgateMod != 1) - && (model->BSIM4v5rgateMod != 2) && (model->BSIM4v5rgateMod != 3)) - { model->BSIM4v5rgateMod = 0; - printf("Warning: rgateMod has been set to its default value: 0.\n"); - } - - if (!model->BSIM4v5perModGiven) - model->BSIM4v5perMod = 1; - else if ((model->BSIM4v5perMod != 0) && (model->BSIM4v5perMod != 1)) - { model->BSIM4v5perMod = 1; - printf("Warning: perMod has been set to its default value: 1.\n"); - } - - if (!model->BSIM4v5geoModGiven) - model->BSIM4v5geoMod = 0; - - if (!model->BSIM4v5rgeoModGiven) - model->BSIM4v5rgeoMod = 0; - else if ((model->BSIM4v5rgeoMod != 0) && (model->BSIM4v5rgeoMod != 1)) - { model->BSIM4v5rgeoMod = 1; - printf("Warning: rgeoMod has been set to its default value: 1.\n"); - } - - if (!model->BSIM4v5fnoiModGiven) - model->BSIM4v5fnoiMod = 1; - else if ((model->BSIM4v5fnoiMod != 0) && (model->BSIM4v5fnoiMod != 1)) - { model->BSIM4v5fnoiMod = 1; - printf("Warning: fnoiMod has been set to its default value: 1.\n"); - } - if (!model->BSIM4v5tnoiModGiven) - model->BSIM4v5tnoiMod = 0; /* WDLiu: tnoiMod=1 needs to set internal S/D nodes */ - else if ((model->BSIM4v5tnoiMod != 0) && (model->BSIM4v5tnoiMod != 1)) - { model->BSIM4v5tnoiMod = 0; - printf("Warning: tnoiMod has been set to its default value: 0.\n"); - } - - if (!model->BSIM4v5trnqsModGiven) - model->BSIM4v5trnqsMod = 0; - else if ((model->BSIM4v5trnqsMod != 0) && (model->BSIM4v5trnqsMod != 1)) - { model->BSIM4v5trnqsMod = 0; - printf("Warning: trnqsMod has been set to its default value: 0.\n"); - } - if (!model->BSIM4v5acnqsModGiven) - model->BSIM4v5acnqsMod = 0; - else if ((model->BSIM4v5acnqsMod != 0) && (model->BSIM4v5acnqsMod != 1)) - { model->BSIM4v5acnqsMod = 0; - printf("Warning: acnqsMod has been set to its default value: 0.\n"); - } - - if (!model->BSIM4v5igcModGiven) - model->BSIM4v5igcMod = 0; - else if ((model->BSIM4v5igcMod != 0) && (model->BSIM4v5igcMod != 1) - && (model->BSIM4v5igcMod != 2)) - { model->BSIM4v5igcMod = 0; - printf("Warning: igcMod has been set to its default value: 0.\n"); - } - if (!model->BSIM4v5igbModGiven) - model->BSIM4v5igbMod = 0; - else if ((model->BSIM4v5igbMod != 0) && (model->BSIM4v5igbMod != 1)) - { model->BSIM4v5igbMod = 0; - printf("Warning: igbMod has been set to its default value: 0.\n"); - } - if (!model->BSIM4v5tempModGiven) - model->BSIM4v5tempMod = 0; - else if ((model->BSIM4v5tempMod != 0) && (model->BSIM4v5tempMod != 1) - && (model->BSIM4v5tempMod != 2)) - { model->BSIM4v5tempMod = 0; - printf("Warning: tempMod has been set to its default value: 0.\n"); - } - - if (!model->BSIM4v5versionGiven) - model->BSIM4v5version = "4.5.0"; - if (!model->BSIM4v5toxrefGiven) - model->BSIM4v5toxref = 30.0e-10; - if (!model->BSIM4v5toxeGiven) - model->BSIM4v5toxe = 30.0e-10; - if (!model->BSIM4v5toxpGiven) - model->BSIM4v5toxp = model->BSIM4v5toxe; - if (!model->BSIM4v5toxmGiven) - model->BSIM4v5toxm = model->BSIM4v5toxe; - if (!model->BSIM4v5dtoxGiven) - model->BSIM4v5dtox = 0.0; - if (!model->BSIM4v5epsroxGiven) - model->BSIM4v5epsrox = 3.9; - - if (!model->BSIM4v5cdscGiven) - model->BSIM4v5cdsc = 2.4e-4; /* unit Q/V/m^2 */ - if (!model->BSIM4v5cdscbGiven) - model->BSIM4v5cdscb = 0.0; /* unit Q/V/m^2 */ - if (!model->BSIM4v5cdscdGiven) - model->BSIM4v5cdscd = 0.0; /* unit Q/V/m^2 */ - if (!model->BSIM4v5citGiven) - model->BSIM4v5cit = 0.0; /* unit Q/V/m^2 */ - if (!model->BSIM4v5nfactorGiven) - model->BSIM4v5nfactor = 1.0; - if (!model->BSIM4v5xjGiven) - model->BSIM4v5xj = .15e-6; - if (!model->BSIM4v5vsatGiven) - model->BSIM4v5vsat = 8.0e4; /* unit m/s */ - if (!model->BSIM4v5atGiven) - model->BSIM4v5at = 3.3e4; /* unit m/s */ - if (!model->BSIM4v5a0Given) - model->BSIM4v5a0 = 1.0; - if (!model->BSIM4v5agsGiven) - model->BSIM4v5ags = 0.0; - if (!model->BSIM4v5a1Given) - model->BSIM4v5a1 = 0.0; - if (!model->BSIM4v5a2Given) - model->BSIM4v5a2 = 1.0; - if (!model->BSIM4v5ketaGiven) - model->BSIM4v5keta = -0.047; /* unit / V */ - if (!model->BSIM4v5nsubGiven) - model->BSIM4v5nsub = 6.0e16; /* unit 1/cm3 */ - if (!model->BSIM4v5ndepGiven) - model->BSIM4v5ndep = 1.7e17; /* unit 1/cm3 */ - if (!model->BSIM4v5nsdGiven) - model->BSIM4v5nsd = 1.0e20; /* unit 1/cm3 */ - if (!model->BSIM4v5phinGiven) - model->BSIM4v5phin = 0.0; /* unit V */ - if (!model->BSIM4v5ngateGiven) - model->BSIM4v5ngate = 0; /* unit 1/cm3 */ - if (!model->BSIM4v5vbmGiven) - model->BSIM4v5vbm = -3.0; - if (!model->BSIM4v5xtGiven) - model->BSIM4v5xt = 1.55e-7; - if (!model->BSIM4v5kt1Given) - model->BSIM4v5kt1 = -0.11; /* unit V */ - if (!model->BSIM4v5kt1lGiven) - model->BSIM4v5kt1l = 0.0; /* unit V*m */ - if (!model->BSIM4v5kt2Given) - model->BSIM4v5kt2 = 0.022; /* No unit */ - if (!model->BSIM4v5k3Given) - model->BSIM4v5k3 = 80.0; - if (!model->BSIM4v5k3bGiven) - model->BSIM4v5k3b = 0.0; - if (!model->BSIM4v5w0Given) - model->BSIM4v5w0 = 2.5e-6; - if (!model->BSIM4v5lpe0Given) - model->BSIM4v5lpe0 = 1.74e-7; - if (!model->BSIM4v5lpebGiven) - model->BSIM4v5lpeb = 0.0; - if (!model->BSIM4v5dvtp0Given) - model->BSIM4v5dvtp0 = 0.0; - if (!model->BSIM4v5dvtp1Given) - model->BSIM4v5dvtp1 = 0.0; - if (!model->BSIM4v5dvt0Given) - model->BSIM4v5dvt0 = 2.2; - if (!model->BSIM4v5dvt1Given) - model->BSIM4v5dvt1 = 0.53; - if (!model->BSIM4v5dvt2Given) - model->BSIM4v5dvt2 = -0.032; /* unit 1 / V */ - - if (!model->BSIM4v5dvt0wGiven) - model->BSIM4v5dvt0w = 0.0; - if (!model->BSIM4v5dvt1wGiven) - model->BSIM4v5dvt1w = 5.3e6; - if (!model->BSIM4v5dvt2wGiven) - model->BSIM4v5dvt2w = -0.032; - - if (!model->BSIM4v5droutGiven) - model->BSIM4v5drout = 0.56; - if (!model->BSIM4v5dsubGiven) - model->BSIM4v5dsub = model->BSIM4v5drout; - if (!model->BSIM4v5vth0Given) - model->BSIM4v5vth0 = (model->BSIM4v5type == NMOS) ? 0.7 : -0.7; - if (!model->BSIM4v5euGiven) - model->BSIM4v5eu = (model->BSIM4v5type == NMOS) ? 1.67 : 1.0;; - if (!model->BSIM4v5uaGiven) - model->BSIM4v5ua = (model->BSIM4v5mobMod == 2) ? 1.0e-15 : 1.0e-9; /* unit m/V */ - if (!model->BSIM4v5ua1Given) - model->BSIM4v5ua1 = 1.0e-9; /* unit m/V */ - if (!model->BSIM4v5ubGiven) - model->BSIM4v5ub = 1.0e-19; /* unit (m/V)**2 */ - if (!model->BSIM4v5ub1Given) - model->BSIM4v5ub1 = -1.0e-18; /* unit (m/V)**2 */ - if (!model->BSIM4v5ucGiven) - model->BSIM4v5uc = (model->BSIM4v5mobMod == 1) ? -0.0465 : -0.0465e-9; - if (!model->BSIM4v5uc1Given) - model->BSIM4v5uc1 = (model->BSIM4v5mobMod == 1) ? -0.056 : -0.056e-9; - if (!model->BSIM4v5udGiven) - model->BSIM4v5ud = 1.0e14; /* unit m**(-2) */ - if (!model->BSIM4v5ud1Given) - model->BSIM4v5ud1 = 0.0; - if (!model->BSIM4v5upGiven) - model->BSIM4v5up = 0.0; - if (!model->BSIM4v5lpGiven) - model->BSIM4v5lp = 1.0e-8; - if (!model->BSIM4v5u0Given) - model->BSIM4v5u0 = (model->BSIM4v5type == NMOS) ? 0.067 : 0.025; - if (!model->BSIM4v5uteGiven) - model->BSIM4v5ute = -1.5; - if (!model->BSIM4v5voffGiven) - model->BSIM4v5voff = -0.08; - if (!model->BSIM4v5vofflGiven) - model->BSIM4v5voffl = 0.0; - if (!model->BSIM4v5minvGiven) - model->BSIM4v5minv = 0.0; - if (!model->BSIM4v5fproutGiven) - model->BSIM4v5fprout = 0.0; - if (!model->BSIM4v5pditsGiven) - model->BSIM4v5pdits = 0.0; - if (!model->BSIM4v5pditsdGiven) - model->BSIM4v5pditsd = 0.0; - if (!model->BSIM4v5pditslGiven) - model->BSIM4v5pditsl = 0.0; - if (!model->BSIM4v5deltaGiven) - model->BSIM4v5delta = 0.01; - if (!model->BSIM4v5rdswminGiven) - model->BSIM4v5rdswmin = 0.0; - if (!model->BSIM4v5rdwminGiven) - model->BSIM4v5rdwmin = 0.0; - if (!model->BSIM4v5rswminGiven) - model->BSIM4v5rswmin = 0.0; - if (!model->BSIM4v5rdswGiven) - model->BSIM4v5rdsw = 200.0; /* in ohm*um */ - if (!model->BSIM4v5rdwGiven) - model->BSIM4v5rdw = 100.0; - if (!model->BSIM4v5rswGiven) - model->BSIM4v5rsw = 100.0; - if (!model->BSIM4v5prwgGiven) - model->BSIM4v5prwg = 1.0; /* in 1/V */ - if (!model->BSIM4v5prwbGiven) - model->BSIM4v5prwb = 0.0; - if (!model->BSIM4v5prtGiven) - model->BSIM4v5prt = 0.0; - if (!model->BSIM4v5eta0Given) - model->BSIM4v5eta0 = 0.08; /* no unit */ - if (!model->BSIM4v5etabGiven) - model->BSIM4v5etab = -0.07; /* unit 1/V */ - if (!model->BSIM4v5pclmGiven) - model->BSIM4v5pclm = 1.3; /* no unit */ - if (!model->BSIM4v5pdibl1Given) - model->BSIM4v5pdibl1 = 0.39; /* no unit */ - if (!model->BSIM4v5pdibl2Given) - model->BSIM4v5pdibl2 = 0.0086; /* no unit */ - if (!model->BSIM4v5pdiblbGiven) - model->BSIM4v5pdiblb = 0.0; /* 1/V */ - if (!model->BSIM4v5pscbe1Given) - model->BSIM4v5pscbe1 = 4.24e8; - if (!model->BSIM4v5pscbe2Given) - model->BSIM4v5pscbe2 = 1.0e-5; - if (!model->BSIM4v5pvagGiven) - model->BSIM4v5pvag = 0.0; - if (!model->BSIM4v5wrGiven) - model->BSIM4v5wr = 1.0; - if (!model->BSIM4v5dwgGiven) - model->BSIM4v5dwg = 0.0; - if (!model->BSIM4v5dwbGiven) - model->BSIM4v5dwb = 0.0; - if (!model->BSIM4v5b0Given) - model->BSIM4v5b0 = 0.0; - if (!model->BSIM4v5b1Given) - model->BSIM4v5b1 = 0.0; - if (!model->BSIM4v5alpha0Given) - model->BSIM4v5alpha0 = 0.0; - if (!model->BSIM4v5alpha1Given) - model->BSIM4v5alpha1 = 0.0; - if (!model->BSIM4v5beta0Given) - model->BSIM4v5beta0 = 0.0; - if (!model->BSIM4v5agidlGiven) - model->BSIM4v5agidl = 0.0; - if (!model->BSIM4v5bgidlGiven) - model->BSIM4v5bgidl = 2.3e9; /* V/m */ - if (!model->BSIM4v5cgidlGiven) - model->BSIM4v5cgidl = 0.5; /* V^3 */ - if (!model->BSIM4v5egidlGiven) - model->BSIM4v5egidl = 0.8; /* V */ - if (!model->BSIM4v5aigcGiven) - model->BSIM4v5aigc = (model->BSIM4v5type == NMOS) ? 1.36e-2 : 9.80e-3; - if (!model->BSIM4v5bigcGiven) - model->BSIM4v5bigc = (model->BSIM4v5type == NMOS) ? 1.71e-3 : 7.59e-4; - if (!model->BSIM4v5cigcGiven) - model->BSIM4v5cigc = (model->BSIM4v5type == NMOS) ? 0.075 : 0.03; - if (!model->BSIM4v5aigsdGiven) - model->BSIM4v5aigsd = (model->BSIM4v5type == NMOS) ? 1.36e-2 : 9.80e-3; - if (!model->BSIM4v5bigsdGiven) - model->BSIM4v5bigsd = (model->BSIM4v5type == NMOS) ? 1.71e-3 : 7.59e-4; - if (!model->BSIM4v5cigsdGiven) - model->BSIM4v5cigsd = (model->BSIM4v5type == NMOS) ? 0.075 : 0.03; - if (!model->BSIM4v5aigbaccGiven) - model->BSIM4v5aigbacc = 1.36e-2; - if (!model->BSIM4v5bigbaccGiven) - model->BSIM4v5bigbacc = 1.71e-3; - if (!model->BSIM4v5cigbaccGiven) - model->BSIM4v5cigbacc = 0.075; - if (!model->BSIM4v5aigbinvGiven) - model->BSIM4v5aigbinv = 1.11e-2; - if (!model->BSIM4v5bigbinvGiven) - model->BSIM4v5bigbinv = 9.49e-4; - if (!model->BSIM4v5cigbinvGiven) - model->BSIM4v5cigbinv = 0.006; - if (!model->BSIM4v5nigcGiven) - model->BSIM4v5nigc = 1.0; - if (!model->BSIM4v5nigbinvGiven) - model->BSIM4v5nigbinv = 3.0; - if (!model->BSIM4v5nigbaccGiven) - model->BSIM4v5nigbacc = 1.0; - if (!model->BSIM4v5ntoxGiven) - model->BSIM4v5ntox = 1.0; - if (!model->BSIM4v5eigbinvGiven) - model->BSIM4v5eigbinv = 1.1; - if (!model->BSIM4v5pigcdGiven) - model->BSIM4v5pigcd = 1.0; - if (!model->BSIM4v5poxedgeGiven) - model->BSIM4v5poxedge = 1.0; - if (!model->BSIM4v5xrcrg1Given) - model->BSIM4v5xrcrg1 = 12.0; - if (!model->BSIM4v5xrcrg2Given) - model->BSIM4v5xrcrg2 = 1.0; - if (!model->BSIM4v5ijthsfwdGiven) - model->BSIM4v5ijthsfwd = 0.1; /* unit A */ - if (!model->BSIM4v5ijthdfwdGiven) - model->BSIM4v5ijthdfwd = model->BSIM4v5ijthsfwd; - if (!model->BSIM4v5ijthsrevGiven) - model->BSIM4v5ijthsrev = 0.1; /* unit A */ - if (!model->BSIM4v5ijthdrevGiven) - model->BSIM4v5ijthdrev = model->BSIM4v5ijthsrev; - if (!model->BSIM4v5tnoiaGiven) - model->BSIM4v5tnoia = 1.5; - if (!model->BSIM4v5tnoibGiven) - model->BSIM4v5tnoib = 3.5; - if (!model->BSIM4v5rnoiaGiven) - model->BSIM4v5rnoia = 0.577; - if (!model->BSIM4v5rnoibGiven) - model->BSIM4v5rnoib = 0.5164; - if (!model->BSIM4v5ntnoiGiven) - model->BSIM4v5ntnoi = 1.0; - if (!model->BSIM4v5lambdaGiven) - model->BSIM4v5lambda = 0.0; - if (!model->BSIM4v5vtlGiven) - model->BSIM4v5vtl = 2.0e5; /* unit m/s */ - if (!model->BSIM4v5xnGiven) - model->BSIM4v5xn = 3.0; - if (!model->BSIM4v5lcGiven) - model->BSIM4v5lc = 5.0e-9; - if (!model->BSIM4v5vfbsdoffGiven) - model->BSIM4v5vfbsdoff = 0.0; /* unit v */ - if (!model->BSIM4v5tvfbsdoffGiven) - model->BSIM4v5tvfbsdoff = 0.0; - if (!model->BSIM4v5tvoffGiven) - model->BSIM4v5tvoff = 0.0; - - if (!model->BSIM4v5lintnoiGiven) - model->BSIM4v5lintnoi = 0.0; /* unit m */ - - if (!model->BSIM4v5xjbvsGiven) - model->BSIM4v5xjbvs = 1.0; /* no unit */ - if (!model->BSIM4v5xjbvdGiven) - model->BSIM4v5xjbvd = model->BSIM4v5xjbvs; - if (!model->BSIM4v5bvsGiven) - model->BSIM4v5bvs = 10.0; /* V */ - if (!model->BSIM4v5bvdGiven) - model->BSIM4v5bvd = model->BSIM4v5bvs; - - if (!model->BSIM4v5gbminGiven) - model->BSIM4v5gbmin = 1.0e-12; /* in mho */ - if (!model->BSIM4v5rbdbGiven) - model->BSIM4v5rbdb = 50.0; /* in ohm */ - if (!model->BSIM4v5rbpbGiven) - model->BSIM4v5rbpb = 50.0; - if (!model->BSIM4v5rbsbGiven) - model->BSIM4v5rbsb = 50.0; - if (!model->BSIM4v5rbpsGiven) - model->BSIM4v5rbps = 50.0; - if (!model->BSIM4v5rbpdGiven) - model->BSIM4v5rbpd = 50.0; - - if (!model->BSIM4v5rbps0Given) - model->BSIM4v5rbps0 = 50.0; - if (!model->BSIM4v5rbpslGiven) - model->BSIM4v5rbpsl = 0.0; - if (!model->BSIM4v5rbpswGiven) - model->BSIM4v5rbpsw = 0.0; - if (!model->BSIM4v5rbpsnfGiven) - model->BSIM4v5rbpsnf = 0.0; - - if (!model->BSIM4v5rbpd0Given) - model->BSIM4v5rbpd0 = 50.0; - if (!model->BSIM4v5rbpdlGiven) - model->BSIM4v5rbpdl = 0.0; - if (!model->BSIM4v5rbpdwGiven) - model->BSIM4v5rbpdw = 0.0; - if (!model->BSIM4v5rbpdnfGiven) - model->BSIM4v5rbpdnf = 0.0; - - if (!model->BSIM4v5rbpbx0Given) - model->BSIM4v5rbpbx0 = 100.0; - if (!model->BSIM4v5rbpbxlGiven) - model->BSIM4v5rbpbxl = 0.0; - if (!model->BSIM4v5rbpbxwGiven) - model->BSIM4v5rbpbxw = 0.0; - if (!model->BSIM4v5rbpbxnfGiven) - model->BSIM4v5rbpbxnf = 0.0; - if (!model->BSIM4v5rbpby0Given) - model->BSIM4v5rbpby0 = 100.0; - if (!model->BSIM4v5rbpbylGiven) - model->BSIM4v5rbpbyl = 0.0; - if (!model->BSIM4v5rbpbywGiven) - model->BSIM4v5rbpbyw = 0.0; - if (!model->BSIM4v5rbpbynfGiven) - model->BSIM4v5rbpbynf = 0.0; - - - if (!model->BSIM4v5rbsbx0Given) - model->BSIM4v5rbsbx0 = 100.0; - if (!model->BSIM4v5rbsby0Given) - model->BSIM4v5rbsby0 = 100.0; - if (!model->BSIM4v5rbdbx0Given) - model->BSIM4v5rbdbx0 = 100.0; - if (!model->BSIM4v5rbdby0Given) - model->BSIM4v5rbdby0 = 100.0; - - - if (!model->BSIM4v5rbsdbxlGiven) - model->BSIM4v5rbsdbxl = 0.0; - if (!model->BSIM4v5rbsdbxwGiven) - model->BSIM4v5rbsdbxw = 0.0; - if (!model->BSIM4v5rbsdbxnfGiven) - model->BSIM4v5rbsdbxnf = 0.0; - if (!model->BSIM4v5rbsdbylGiven) - model->BSIM4v5rbsdbyl = 0.0; - if (!model->BSIM4v5rbsdbywGiven) - model->BSIM4v5rbsdbyw = 0.0; - if (!model->BSIM4v5rbsdbynfGiven) - model->BSIM4v5rbsdbynf = 0.0; - - if (!model->BSIM4v5cgslGiven) - model->BSIM4v5cgsl = 0.0; - if (!model->BSIM4v5cgdlGiven) - model->BSIM4v5cgdl = 0.0; - if (!model->BSIM4v5ckappasGiven) - model->BSIM4v5ckappas = 0.6; - if (!model->BSIM4v5ckappadGiven) - model->BSIM4v5ckappad = model->BSIM4v5ckappas; - if (!model->BSIM4v5clcGiven) - model->BSIM4v5clc = 0.1e-6; - if (!model->BSIM4v5cleGiven) - model->BSIM4v5cle = 0.6; - if (!model->BSIM4v5vfbcvGiven) - model->BSIM4v5vfbcv = -1.0; - if (!model->BSIM4v5acdeGiven) - model->BSIM4v5acde = 1.0; - if (!model->BSIM4v5moinGiven) - model->BSIM4v5moin = 15.0; - if (!model->BSIM4v5noffGiven) - model->BSIM4v5noff = 1.0; - if (!model->BSIM4v5voffcvGiven) - model->BSIM4v5voffcv = 0.0; - if (!model->BSIM4v5dmcgGiven) - model->BSIM4v5dmcg = 0.0; - if (!model->BSIM4v5dmciGiven) - model->BSIM4v5dmci = model->BSIM4v5dmcg; - if (!model->BSIM4v5dmdgGiven) - model->BSIM4v5dmdg = 0.0; - if (!model->BSIM4v5dmcgtGiven) - model->BSIM4v5dmcgt = 0.0; - if (!model->BSIM4v5xgwGiven) - model->BSIM4v5xgw = 0.0; - if (!model->BSIM4v5xglGiven) - model->BSIM4v5xgl = 0.0; - if (!model->BSIM4v5rshgGiven) - model->BSIM4v5rshg = 0.1; - if (!model->BSIM4v5ngconGiven) - model->BSIM4v5ngcon = 1.0; - if (!model->BSIM4v5tcjGiven) - model->BSIM4v5tcj = 0.0; - if (!model->BSIM4v5tpbGiven) - model->BSIM4v5tpb = 0.0; - if (!model->BSIM4v5tcjswGiven) - model->BSIM4v5tcjsw = 0.0; - if (!model->BSIM4v5tpbswGiven) - model->BSIM4v5tpbsw = 0.0; - if (!model->BSIM4v5tcjswgGiven) - model->BSIM4v5tcjswg = 0.0; - if (!model->BSIM4v5tpbswgGiven) - model->BSIM4v5tpbswg = 0.0; - - /* Length dependence */ - if (!model->BSIM4v5lcdscGiven) - model->BSIM4v5lcdsc = 0.0; - if (!model->BSIM4v5lcdscbGiven) - model->BSIM4v5lcdscb = 0.0; - if (!model->BSIM4v5lcdscdGiven) - model->BSIM4v5lcdscd = 0.0; - if (!model->BSIM4v5lcitGiven) - model->BSIM4v5lcit = 0.0; - if (!model->BSIM4v5lnfactorGiven) - model->BSIM4v5lnfactor = 0.0; - if (!model->BSIM4v5lxjGiven) - model->BSIM4v5lxj = 0.0; - if (!model->BSIM4v5lvsatGiven) - model->BSIM4v5lvsat = 0.0; - if (!model->BSIM4v5latGiven) - model->BSIM4v5lat = 0.0; - if (!model->BSIM4v5la0Given) - model->BSIM4v5la0 = 0.0; - if (!model->BSIM4v5lagsGiven) - model->BSIM4v5lags = 0.0; - if (!model->BSIM4v5la1Given) - model->BSIM4v5la1 = 0.0; - if (!model->BSIM4v5la2Given) - model->BSIM4v5la2 = 0.0; - if (!model->BSIM4v5lketaGiven) - model->BSIM4v5lketa = 0.0; - if (!model->BSIM4v5lnsubGiven) - model->BSIM4v5lnsub = 0.0; - if (!model->BSIM4v5lndepGiven) - model->BSIM4v5lndep = 0.0; - if (!model->BSIM4v5lnsdGiven) - model->BSIM4v5lnsd = 0.0; - if (!model->BSIM4v5lphinGiven) - model->BSIM4v5lphin = 0.0; - if (!model->BSIM4v5lngateGiven) - model->BSIM4v5lngate = 0.0; - if (!model->BSIM4v5lvbmGiven) - model->BSIM4v5lvbm = 0.0; - if (!model->BSIM4v5lxtGiven) - model->BSIM4v5lxt = 0.0; - if (!model->BSIM4v5lkt1Given) - model->BSIM4v5lkt1 = 0.0; - if (!model->BSIM4v5lkt1lGiven) - model->BSIM4v5lkt1l = 0.0; - if (!model->BSIM4v5lkt2Given) - model->BSIM4v5lkt2 = 0.0; - if (!model->BSIM4v5lk3Given) - model->BSIM4v5lk3 = 0.0; - if (!model->BSIM4v5lk3bGiven) - model->BSIM4v5lk3b = 0.0; - if (!model->BSIM4v5lw0Given) - model->BSIM4v5lw0 = 0.0; - if (!model->BSIM4v5llpe0Given) - model->BSIM4v5llpe0 = 0.0; - if (!model->BSIM4v5llpebGiven) - model->BSIM4v5llpeb = 0.0; - if (!model->BSIM4v5ldvtp0Given) - model->BSIM4v5ldvtp0 = 0.0; - if (!model->BSIM4v5ldvtp1Given) - model->BSIM4v5ldvtp1 = 0.0; - if (!model->BSIM4v5ldvt0Given) - model->BSIM4v5ldvt0 = 0.0; - if (!model->BSIM4v5ldvt1Given) - model->BSIM4v5ldvt1 = 0.0; - if (!model->BSIM4v5ldvt2Given) - model->BSIM4v5ldvt2 = 0.0; - if (!model->BSIM4v5ldvt0wGiven) - model->BSIM4v5ldvt0w = 0.0; - if (!model->BSIM4v5ldvt1wGiven) - model->BSIM4v5ldvt1w = 0.0; - if (!model->BSIM4v5ldvt2wGiven) - model->BSIM4v5ldvt2w = 0.0; - if (!model->BSIM4v5ldroutGiven) - model->BSIM4v5ldrout = 0.0; - if (!model->BSIM4v5ldsubGiven) - model->BSIM4v5ldsub = 0.0; - if (!model->BSIM4v5lvth0Given) - model->BSIM4v5lvth0 = 0.0; - if (!model->BSIM4v5luaGiven) - model->BSIM4v5lua = 0.0; - if (!model->BSIM4v5lua1Given) - model->BSIM4v5lua1 = 0.0; - if (!model->BSIM4v5lubGiven) - model->BSIM4v5lub = 0.0; - if (!model->BSIM4v5lub1Given) - model->BSIM4v5lub1 = 0.0; - if (!model->BSIM4v5lucGiven) - model->BSIM4v5luc = 0.0; - if (!model->BSIM4v5luc1Given) - model->BSIM4v5luc1 = 0.0; - if (!model->BSIM4v5ludGiven) - model->BSIM4v5lud = 0.0; - if (!model->BSIM4v5lud1Given) - model->BSIM4v5lud1 = 0.0; - if (!model->BSIM4v5lupGiven) - model->BSIM4v5lup = 0.0; - if (!model->BSIM4v5llpGiven) - model->BSIM4v5llp = 0.0; - if (!model->BSIM4v5lu0Given) - model->BSIM4v5lu0 = 0.0; - if (!model->BSIM4v5luteGiven) - model->BSIM4v5lute = 0.0; - if (!model->BSIM4v5lvoffGiven) - model->BSIM4v5lvoff = 0.0; - if (!model->BSIM4v5lminvGiven) - model->BSIM4v5lminv = 0.0; - if (!model->BSIM4v5lfproutGiven) - model->BSIM4v5lfprout = 0.0; - if (!model->BSIM4v5lpditsGiven) - model->BSIM4v5lpdits = 0.0; - if (!model->BSIM4v5lpditsdGiven) - model->BSIM4v5lpditsd = 0.0; - if (!model->BSIM4v5ldeltaGiven) - model->BSIM4v5ldelta = 0.0; - if (!model->BSIM4v5lrdswGiven) - model->BSIM4v5lrdsw = 0.0; - if (!model->BSIM4v5lrdwGiven) - model->BSIM4v5lrdw = 0.0; - if (!model->BSIM4v5lrswGiven) - model->BSIM4v5lrsw = 0.0; - if (!model->BSIM4v5lprwbGiven) - model->BSIM4v5lprwb = 0.0; - if (!model->BSIM4v5lprwgGiven) - model->BSIM4v5lprwg = 0.0; - if (!model->BSIM4v5lprtGiven) - model->BSIM4v5lprt = 0.0; - if (!model->BSIM4v5leta0Given) - model->BSIM4v5leta0 = 0.0; - if (!model->BSIM4v5letabGiven) - model->BSIM4v5letab = -0.0; - if (!model->BSIM4v5lpclmGiven) - model->BSIM4v5lpclm = 0.0; - if (!model->BSIM4v5lpdibl1Given) - model->BSIM4v5lpdibl1 = 0.0; - if (!model->BSIM4v5lpdibl2Given) - model->BSIM4v5lpdibl2 = 0.0; - if (!model->BSIM4v5lpdiblbGiven) - model->BSIM4v5lpdiblb = 0.0; - if (!model->BSIM4v5lpscbe1Given) - model->BSIM4v5lpscbe1 = 0.0; - if (!model->BSIM4v5lpscbe2Given) - model->BSIM4v5lpscbe2 = 0.0; - if (!model->BSIM4v5lpvagGiven) - model->BSIM4v5lpvag = 0.0; - if (!model->BSIM4v5lwrGiven) - model->BSIM4v5lwr = 0.0; - if (!model->BSIM4v5ldwgGiven) - model->BSIM4v5ldwg = 0.0; - if (!model->BSIM4v5ldwbGiven) - model->BSIM4v5ldwb = 0.0; - if (!model->BSIM4v5lb0Given) - model->BSIM4v5lb0 = 0.0; - if (!model->BSIM4v5lb1Given) - model->BSIM4v5lb1 = 0.0; - if (!model->BSIM4v5lalpha0Given) - model->BSIM4v5lalpha0 = 0.0; - if (!model->BSIM4v5lalpha1Given) - model->BSIM4v5lalpha1 = 0.0; - if (!model->BSIM4v5lbeta0Given) - model->BSIM4v5lbeta0 = 0.0; - if (!model->BSIM4v5lagidlGiven) - model->BSIM4v5lagidl = 0.0; - if (!model->BSIM4v5lbgidlGiven) - model->BSIM4v5lbgidl = 0.0; - if (!model->BSIM4v5lcgidlGiven) - model->BSIM4v5lcgidl = 0.0; - if (!model->BSIM4v5legidlGiven) - model->BSIM4v5legidl = 0.0; - if (!model->BSIM4v5laigcGiven) - model->BSIM4v5laigc = 0.0; - if (!model->BSIM4v5lbigcGiven) - model->BSIM4v5lbigc = 0.0; - if (!model->BSIM4v5lcigcGiven) - model->BSIM4v5lcigc = 0.0; - if (!model->BSIM4v5laigsdGiven) - model->BSIM4v5laigsd = 0.0; - if (!model->BSIM4v5lbigsdGiven) - model->BSIM4v5lbigsd = 0.0; - if (!model->BSIM4v5lcigsdGiven) - model->BSIM4v5lcigsd = 0.0; - if (!model->BSIM4v5laigbaccGiven) - model->BSIM4v5laigbacc = 0.0; - if (!model->BSIM4v5lbigbaccGiven) - model->BSIM4v5lbigbacc = 0.0; - if (!model->BSIM4v5lcigbaccGiven) - model->BSIM4v5lcigbacc = 0.0; - if (!model->BSIM4v5laigbinvGiven) - model->BSIM4v5laigbinv = 0.0; - if (!model->BSIM4v5lbigbinvGiven) - model->BSIM4v5lbigbinv = 0.0; - if (!model->BSIM4v5lcigbinvGiven) - model->BSIM4v5lcigbinv = 0.0; - if (!model->BSIM4v5lnigcGiven) - model->BSIM4v5lnigc = 0.0; - if (!model->BSIM4v5lnigbinvGiven) - model->BSIM4v5lnigbinv = 0.0; - if (!model->BSIM4v5lnigbaccGiven) - model->BSIM4v5lnigbacc = 0.0; - if (!model->BSIM4v5lntoxGiven) - model->BSIM4v5lntox = 0.0; - if (!model->BSIM4v5leigbinvGiven) - model->BSIM4v5leigbinv = 0.0; - if (!model->BSIM4v5lpigcdGiven) - model->BSIM4v5lpigcd = 0.0; - if (!model->BSIM4v5lpoxedgeGiven) - model->BSIM4v5lpoxedge = 0.0; - if (!model->BSIM4v5lxrcrg1Given) - model->BSIM4v5lxrcrg1 = 0.0; - if (!model->BSIM4v5lxrcrg2Given) - model->BSIM4v5lxrcrg2 = 0.0; - if (!model->BSIM4v5leuGiven) - model->BSIM4v5leu = 0.0; - if (!model->BSIM4v5lvfbGiven) - model->BSIM4v5lvfb = 0.0; - if (!model->BSIM4v5llambdaGiven) - model->BSIM4v5llambda = 0.0; - if (!model->BSIM4v5lvtlGiven) - model->BSIM4v5lvtl = 0.0; - if (!model->BSIM4v5lxnGiven) - model->BSIM4v5lxn = 0.0; - if (!model->BSIM4v5lvfbsdoffGiven) - model->BSIM4v5lvfbsdoff = 0.0; - if (!model->BSIM4v5ltvfbsdoffGiven) - model->BSIM4v5ltvfbsdoff = 0.0; - if (!model->BSIM4v5ltvoffGiven) - model->BSIM4v5ltvoff = 0.0; - - - if (!model->BSIM4v5lcgslGiven) - model->BSIM4v5lcgsl = 0.0; - if (!model->BSIM4v5lcgdlGiven) - model->BSIM4v5lcgdl = 0.0; - if (!model->BSIM4v5lckappasGiven) - model->BSIM4v5lckappas = 0.0; - if (!model->BSIM4v5lckappadGiven) - model->BSIM4v5lckappad = 0.0; - if (!model->BSIM4v5lclcGiven) - model->BSIM4v5lclc = 0.0; - if (!model->BSIM4v5lcleGiven) - model->BSIM4v5lcle = 0.0; - if (!model->BSIM4v5lcfGiven) - model->BSIM4v5lcf = 0.0; - if (!model->BSIM4v5lvfbcvGiven) - model->BSIM4v5lvfbcv = 0.0; - if (!model->BSIM4v5lacdeGiven) - model->BSIM4v5lacde = 0.0; - if (!model->BSIM4v5lmoinGiven) - model->BSIM4v5lmoin = 0.0; - if (!model->BSIM4v5lnoffGiven) - model->BSIM4v5lnoff = 0.0; - if (!model->BSIM4v5lvoffcvGiven) - model->BSIM4v5lvoffcv = 0.0; - - /* Width dependence */ - if (!model->BSIM4v5wcdscGiven) - model->BSIM4v5wcdsc = 0.0; - if (!model->BSIM4v5wcdscbGiven) - model->BSIM4v5wcdscb = 0.0; - if (!model->BSIM4v5wcdscdGiven) - model->BSIM4v5wcdscd = 0.0; - if (!model->BSIM4v5wcitGiven) - model->BSIM4v5wcit = 0.0; - if (!model->BSIM4v5wnfactorGiven) - model->BSIM4v5wnfactor = 0.0; - if (!model->BSIM4v5wxjGiven) - model->BSIM4v5wxj = 0.0; - if (!model->BSIM4v5wvsatGiven) - model->BSIM4v5wvsat = 0.0; - if (!model->BSIM4v5watGiven) - model->BSIM4v5wat = 0.0; - if (!model->BSIM4v5wa0Given) - model->BSIM4v5wa0 = 0.0; - if (!model->BSIM4v5wagsGiven) - model->BSIM4v5wags = 0.0; - if (!model->BSIM4v5wa1Given) - model->BSIM4v5wa1 = 0.0; - if (!model->BSIM4v5wa2Given) - model->BSIM4v5wa2 = 0.0; - if (!model->BSIM4v5wketaGiven) - model->BSIM4v5wketa = 0.0; - if (!model->BSIM4v5wnsubGiven) - model->BSIM4v5wnsub = 0.0; - if (!model->BSIM4v5wndepGiven) - model->BSIM4v5wndep = 0.0; - if (!model->BSIM4v5wnsdGiven) - model->BSIM4v5wnsd = 0.0; - if (!model->BSIM4v5wphinGiven) - model->BSIM4v5wphin = 0.0; - if (!model->BSIM4v5wngateGiven) - model->BSIM4v5wngate = 0.0; - if (!model->BSIM4v5wvbmGiven) - model->BSIM4v5wvbm = 0.0; - if (!model->BSIM4v5wxtGiven) - model->BSIM4v5wxt = 0.0; - if (!model->BSIM4v5wkt1Given) - model->BSIM4v5wkt1 = 0.0; - if (!model->BSIM4v5wkt1lGiven) - model->BSIM4v5wkt1l = 0.0; - if (!model->BSIM4v5wkt2Given) - model->BSIM4v5wkt2 = 0.0; - if (!model->BSIM4v5wk3Given) - model->BSIM4v5wk3 = 0.0; - if (!model->BSIM4v5wk3bGiven) - model->BSIM4v5wk3b = 0.0; - if (!model->BSIM4v5ww0Given) - model->BSIM4v5ww0 = 0.0; - if (!model->BSIM4v5wlpe0Given) - model->BSIM4v5wlpe0 = 0.0; - if (!model->BSIM4v5wlpebGiven) - model->BSIM4v5wlpeb = 0.0; - if (!model->BSIM4v5wdvtp0Given) - model->BSIM4v5wdvtp0 = 0.0; - if (!model->BSIM4v5wdvtp1Given) - model->BSIM4v5wdvtp1 = 0.0; - if (!model->BSIM4v5wdvt0Given) - model->BSIM4v5wdvt0 = 0.0; - if (!model->BSIM4v5wdvt1Given) - model->BSIM4v5wdvt1 = 0.0; - if (!model->BSIM4v5wdvt2Given) - model->BSIM4v5wdvt2 = 0.0; - if (!model->BSIM4v5wdvt0wGiven) - model->BSIM4v5wdvt0w = 0.0; - if (!model->BSIM4v5wdvt1wGiven) - model->BSIM4v5wdvt1w = 0.0; - if (!model->BSIM4v5wdvt2wGiven) - model->BSIM4v5wdvt2w = 0.0; - if (!model->BSIM4v5wdroutGiven) - model->BSIM4v5wdrout = 0.0; - if (!model->BSIM4v5wdsubGiven) - model->BSIM4v5wdsub = 0.0; - if (!model->BSIM4v5wvth0Given) - model->BSIM4v5wvth0 = 0.0; - if (!model->BSIM4v5wuaGiven) - model->BSIM4v5wua = 0.0; - if (!model->BSIM4v5wua1Given) - model->BSIM4v5wua1 = 0.0; - if (!model->BSIM4v5wubGiven) - model->BSIM4v5wub = 0.0; - if (!model->BSIM4v5wub1Given) - model->BSIM4v5wub1 = 0.0; - if (!model->BSIM4v5wucGiven) - model->BSIM4v5wuc = 0.0; - if (!model->BSIM4v5wuc1Given) - model->BSIM4v5wuc1 = 0.0; - if (!model->BSIM4v5wudGiven) - model->BSIM4v5wud = 0.0; - if (!model->BSIM4v5wud1Given) - model->BSIM4v5wud1 = 0.0; - if (!model->BSIM4v5wupGiven) - model->BSIM4v5wup = 0.0; - if (!model->BSIM4v5wlpGiven) - model->BSIM4v5wlp = 0.0; - if (!model->BSIM4v5wu0Given) - model->BSIM4v5wu0 = 0.0; - if (!model->BSIM4v5wuteGiven) - model->BSIM4v5wute = 0.0; - if (!model->BSIM4v5wvoffGiven) - model->BSIM4v5wvoff = 0.0; - if (!model->BSIM4v5wminvGiven) - model->BSIM4v5wminv = 0.0; - if (!model->BSIM4v5wfproutGiven) - model->BSIM4v5wfprout = 0.0; - if (!model->BSIM4v5wpditsGiven) - model->BSIM4v5wpdits = 0.0; - if (!model->BSIM4v5wpditsdGiven) - model->BSIM4v5wpditsd = 0.0; - if (!model->BSIM4v5wdeltaGiven) - model->BSIM4v5wdelta = 0.0; - if (!model->BSIM4v5wrdswGiven) - model->BSIM4v5wrdsw = 0.0; - if (!model->BSIM4v5wrdwGiven) - model->BSIM4v5wrdw = 0.0; - if (!model->BSIM4v5wrswGiven) - model->BSIM4v5wrsw = 0.0; - if (!model->BSIM4v5wprwbGiven) - model->BSIM4v5wprwb = 0.0; - if (!model->BSIM4v5wprwgGiven) - model->BSIM4v5wprwg = 0.0; - if (!model->BSIM4v5wprtGiven) - model->BSIM4v5wprt = 0.0; - if (!model->BSIM4v5weta0Given) - model->BSIM4v5weta0 = 0.0; - if (!model->BSIM4v5wetabGiven) - model->BSIM4v5wetab = 0.0; - if (!model->BSIM4v5wpclmGiven) - model->BSIM4v5wpclm = 0.0; - if (!model->BSIM4v5wpdibl1Given) - model->BSIM4v5wpdibl1 = 0.0; - if (!model->BSIM4v5wpdibl2Given) - model->BSIM4v5wpdibl2 = 0.0; - if (!model->BSIM4v5wpdiblbGiven) - model->BSIM4v5wpdiblb = 0.0; - if (!model->BSIM4v5wpscbe1Given) - model->BSIM4v5wpscbe1 = 0.0; - if (!model->BSIM4v5wpscbe2Given) - model->BSIM4v5wpscbe2 = 0.0; - if (!model->BSIM4v5wpvagGiven) - model->BSIM4v5wpvag = 0.0; - if (!model->BSIM4v5wwrGiven) - model->BSIM4v5wwr = 0.0; - if (!model->BSIM4v5wdwgGiven) - model->BSIM4v5wdwg = 0.0; - if (!model->BSIM4v5wdwbGiven) - model->BSIM4v5wdwb = 0.0; - if (!model->BSIM4v5wb0Given) - model->BSIM4v5wb0 = 0.0; - if (!model->BSIM4v5wb1Given) - model->BSIM4v5wb1 = 0.0; - if (!model->BSIM4v5walpha0Given) - model->BSIM4v5walpha0 = 0.0; - if (!model->BSIM4v5walpha1Given) - model->BSIM4v5walpha1 = 0.0; - if (!model->BSIM4v5wbeta0Given) - model->BSIM4v5wbeta0 = 0.0; - if (!model->BSIM4v5wagidlGiven) - model->BSIM4v5wagidl = 0.0; - if (!model->BSIM4v5wbgidlGiven) - model->BSIM4v5wbgidl = 0.0; - if (!model->BSIM4v5wcgidlGiven) - model->BSIM4v5wcgidl = 0.0; - if (!model->BSIM4v5wegidlGiven) - model->BSIM4v5wegidl = 0.0; - if (!model->BSIM4v5waigcGiven) - model->BSIM4v5waigc = 0.0; - if (!model->BSIM4v5wbigcGiven) - model->BSIM4v5wbigc = 0.0; - if (!model->BSIM4v5wcigcGiven) - model->BSIM4v5wcigc = 0.0; - if (!model->BSIM4v5waigsdGiven) - model->BSIM4v5waigsd = 0.0; - if (!model->BSIM4v5wbigsdGiven) - model->BSIM4v5wbigsd = 0.0; - if (!model->BSIM4v5wcigsdGiven) - model->BSIM4v5wcigsd = 0.0; - if (!model->BSIM4v5waigbaccGiven) - model->BSIM4v5waigbacc = 0.0; - if (!model->BSIM4v5wbigbaccGiven) - model->BSIM4v5wbigbacc = 0.0; - if (!model->BSIM4v5wcigbaccGiven) - model->BSIM4v5wcigbacc = 0.0; - if (!model->BSIM4v5waigbinvGiven) - model->BSIM4v5waigbinv = 0.0; - if (!model->BSIM4v5wbigbinvGiven) - model->BSIM4v5wbigbinv = 0.0; - if (!model->BSIM4v5wcigbinvGiven) - model->BSIM4v5wcigbinv = 0.0; - if (!model->BSIM4v5wnigcGiven) - model->BSIM4v5wnigc = 0.0; - if (!model->BSIM4v5wnigbinvGiven) - model->BSIM4v5wnigbinv = 0.0; - if (!model->BSIM4v5wnigbaccGiven) - model->BSIM4v5wnigbacc = 0.0; - if (!model->BSIM4v5wntoxGiven) - model->BSIM4v5wntox = 0.0; - if (!model->BSIM4v5weigbinvGiven) - model->BSIM4v5weigbinv = 0.0; - if (!model->BSIM4v5wpigcdGiven) - model->BSIM4v5wpigcd = 0.0; - if (!model->BSIM4v5wpoxedgeGiven) - model->BSIM4v5wpoxedge = 0.0; - if (!model->BSIM4v5wxrcrg1Given) - model->BSIM4v5wxrcrg1 = 0.0; - if (!model->BSIM4v5wxrcrg2Given) - model->BSIM4v5wxrcrg2 = 0.0; - if (!model->BSIM4v5weuGiven) - model->BSIM4v5weu = 0.0; - if (!model->BSIM4v5wvfbGiven) - model->BSIM4v5wvfb = 0.0; - if (!model->BSIM4v5wlambdaGiven) - model->BSIM4v5wlambda = 0.0; - if (!model->BSIM4v5wvtlGiven) - model->BSIM4v5wvtl = 0.0; - if (!model->BSIM4v5wxnGiven) - model->BSIM4v5wxn = 0.0; - if (!model->BSIM4v5wvfbsdoffGiven) - model->BSIM4v5wvfbsdoff = 0.0; - if (!model->BSIM4v5wtvfbsdoffGiven) - model->BSIM4v5wtvfbsdoff = 0.0; - if (!model->BSIM4v5wtvoffGiven) - model->BSIM4v5wtvoff = 0.0; - - if (!model->BSIM4v5wcgslGiven) - model->BSIM4v5wcgsl = 0.0; - if (!model->BSIM4v5wcgdlGiven) - model->BSIM4v5wcgdl = 0.0; - if (!model->BSIM4v5wckappasGiven) - model->BSIM4v5wckappas = 0.0; - if (!model->BSIM4v5wckappadGiven) - model->BSIM4v5wckappad = 0.0; - if (!model->BSIM4v5wcfGiven) - model->BSIM4v5wcf = 0.0; - if (!model->BSIM4v5wclcGiven) - model->BSIM4v5wclc = 0.0; - if (!model->BSIM4v5wcleGiven) - model->BSIM4v5wcle = 0.0; - if (!model->BSIM4v5wvfbcvGiven) - model->BSIM4v5wvfbcv = 0.0; - if (!model->BSIM4v5wacdeGiven) - model->BSIM4v5wacde = 0.0; - if (!model->BSIM4v5wmoinGiven) - model->BSIM4v5wmoin = 0.0; - if (!model->BSIM4v5wnoffGiven) - model->BSIM4v5wnoff = 0.0; - if (!model->BSIM4v5wvoffcvGiven) - model->BSIM4v5wvoffcv = 0.0; - - /* Cross-term dependence */ - if (!model->BSIM4v5pcdscGiven) - model->BSIM4v5pcdsc = 0.0; - if (!model->BSIM4v5pcdscbGiven) - model->BSIM4v5pcdscb = 0.0; - if (!model->BSIM4v5pcdscdGiven) - model->BSIM4v5pcdscd = 0.0; - if (!model->BSIM4v5pcitGiven) - model->BSIM4v5pcit = 0.0; - if (!model->BSIM4v5pnfactorGiven) - model->BSIM4v5pnfactor = 0.0; - if (!model->BSIM4v5pxjGiven) - model->BSIM4v5pxj = 0.0; - if (!model->BSIM4v5pvsatGiven) - model->BSIM4v5pvsat = 0.0; - if (!model->BSIM4v5patGiven) - model->BSIM4v5pat = 0.0; - if (!model->BSIM4v5pa0Given) - model->BSIM4v5pa0 = 0.0; - - if (!model->BSIM4v5pagsGiven) - model->BSIM4v5pags = 0.0; - if (!model->BSIM4v5pa1Given) - model->BSIM4v5pa1 = 0.0; - if (!model->BSIM4v5pa2Given) - model->BSIM4v5pa2 = 0.0; - if (!model->BSIM4v5pketaGiven) - model->BSIM4v5pketa = 0.0; - if (!model->BSIM4v5pnsubGiven) - model->BSIM4v5pnsub = 0.0; - if (!model->BSIM4v5pndepGiven) - model->BSIM4v5pndep = 0.0; - if (!model->BSIM4v5pnsdGiven) - model->BSIM4v5pnsd = 0.0; - if (!model->BSIM4v5pphinGiven) - model->BSIM4v5pphin = 0.0; - if (!model->BSIM4v5pngateGiven) - model->BSIM4v5pngate = 0.0; - if (!model->BSIM4v5pvbmGiven) - model->BSIM4v5pvbm = 0.0; - if (!model->BSIM4v5pxtGiven) - model->BSIM4v5pxt = 0.0; - if (!model->BSIM4v5pkt1Given) - model->BSIM4v5pkt1 = 0.0; - if (!model->BSIM4v5pkt1lGiven) - model->BSIM4v5pkt1l = 0.0; - if (!model->BSIM4v5pkt2Given) - model->BSIM4v5pkt2 = 0.0; - if (!model->BSIM4v5pk3Given) - model->BSIM4v5pk3 = 0.0; - if (!model->BSIM4v5pk3bGiven) - model->BSIM4v5pk3b = 0.0; - if (!model->BSIM4v5pw0Given) - model->BSIM4v5pw0 = 0.0; - if (!model->BSIM4v5plpe0Given) - model->BSIM4v5plpe0 = 0.0; - if (!model->BSIM4v5plpebGiven) - model->BSIM4v5plpeb = 0.0; - if (!model->BSIM4v5pdvtp0Given) - model->BSIM4v5pdvtp0 = 0.0; - if (!model->BSIM4v5pdvtp1Given) - model->BSIM4v5pdvtp1 = 0.0; - if (!model->BSIM4v5pdvt0Given) - model->BSIM4v5pdvt0 = 0.0; - if (!model->BSIM4v5pdvt1Given) - model->BSIM4v5pdvt1 = 0.0; - if (!model->BSIM4v5pdvt2Given) - model->BSIM4v5pdvt2 = 0.0; - if (!model->BSIM4v5pdvt0wGiven) - model->BSIM4v5pdvt0w = 0.0; - if (!model->BSIM4v5pdvt1wGiven) - model->BSIM4v5pdvt1w = 0.0; - if (!model->BSIM4v5pdvt2wGiven) - model->BSIM4v5pdvt2w = 0.0; - if (!model->BSIM4v5pdroutGiven) - model->BSIM4v5pdrout = 0.0; - if (!model->BSIM4v5pdsubGiven) - model->BSIM4v5pdsub = 0.0; - if (!model->BSIM4v5pvth0Given) - model->BSIM4v5pvth0 = 0.0; - if (!model->BSIM4v5puaGiven) - model->BSIM4v5pua = 0.0; - if (!model->BSIM4v5pua1Given) - model->BSIM4v5pua1 = 0.0; - if (!model->BSIM4v5pubGiven) - model->BSIM4v5pub = 0.0; - if (!model->BSIM4v5pub1Given) - model->BSIM4v5pub1 = 0.0; - if (!model->BSIM4v5pucGiven) - model->BSIM4v5puc = 0.0; - if (!model->BSIM4v5puc1Given) - model->BSIM4v5puc1 = 0.0; - if (!model->BSIM4v5pudGiven) - model->BSIM4v5pud = 0.0; - if (!model->BSIM4v5pud1Given) - model->BSIM4v5pud1 = 0.0; - if (!model->BSIM4v5pupGiven) - model->BSIM4v5pup = 0.0; - if (!model->BSIM4v5plpGiven) - model->BSIM4v5plp = 0.0; - if (!model->BSIM4v5pu0Given) - model->BSIM4v5pu0 = 0.0; - if (!model->BSIM4v5puteGiven) - model->BSIM4v5pute = 0.0; - if (!model->BSIM4v5pvoffGiven) - model->BSIM4v5pvoff = 0.0; - if (!model->BSIM4v5pminvGiven) - model->BSIM4v5pminv = 0.0; - if (!model->BSIM4v5pfproutGiven) - model->BSIM4v5pfprout = 0.0; - if (!model->BSIM4v5ppditsGiven) - model->BSIM4v5ppdits = 0.0; - if (!model->BSIM4v5ppditsdGiven) - model->BSIM4v5ppditsd = 0.0; - if (!model->BSIM4v5pdeltaGiven) - model->BSIM4v5pdelta = 0.0; - if (!model->BSIM4v5prdswGiven) - model->BSIM4v5prdsw = 0.0; - if (!model->BSIM4v5prdwGiven) - model->BSIM4v5prdw = 0.0; - if (!model->BSIM4v5prswGiven) - model->BSIM4v5prsw = 0.0; - if (!model->BSIM4v5pprwbGiven) - model->BSIM4v5pprwb = 0.0; - if (!model->BSIM4v5pprwgGiven) - model->BSIM4v5pprwg = 0.0; - if (!model->BSIM4v5pprtGiven) - model->BSIM4v5pprt = 0.0; - if (!model->BSIM4v5peta0Given) - model->BSIM4v5peta0 = 0.0; - if (!model->BSIM4v5petabGiven) - model->BSIM4v5petab = 0.0; - if (!model->BSIM4v5ppclmGiven) - model->BSIM4v5ppclm = 0.0; - if (!model->BSIM4v5ppdibl1Given) - model->BSIM4v5ppdibl1 = 0.0; - if (!model->BSIM4v5ppdibl2Given) - model->BSIM4v5ppdibl2 = 0.0; - if (!model->BSIM4v5ppdiblbGiven) - model->BSIM4v5ppdiblb = 0.0; - if (!model->BSIM4v5ppscbe1Given) - model->BSIM4v5ppscbe1 = 0.0; - if (!model->BSIM4v5ppscbe2Given) - model->BSIM4v5ppscbe2 = 0.0; - if (!model->BSIM4v5ppvagGiven) - model->BSIM4v5ppvag = 0.0; - if (!model->BSIM4v5pwrGiven) - model->BSIM4v5pwr = 0.0; - if (!model->BSIM4v5pdwgGiven) - model->BSIM4v5pdwg = 0.0; - if (!model->BSIM4v5pdwbGiven) - model->BSIM4v5pdwb = 0.0; - if (!model->BSIM4v5pb0Given) - model->BSIM4v5pb0 = 0.0; - if (!model->BSIM4v5pb1Given) - model->BSIM4v5pb1 = 0.0; - if (!model->BSIM4v5palpha0Given) - model->BSIM4v5palpha0 = 0.0; - if (!model->BSIM4v5palpha1Given) - model->BSIM4v5palpha1 = 0.0; - if (!model->BSIM4v5pbeta0Given) - model->BSIM4v5pbeta0 = 0.0; - if (!model->BSIM4v5pagidlGiven) - model->BSIM4v5pagidl = 0.0; - if (!model->BSIM4v5pbgidlGiven) - model->BSIM4v5pbgidl = 0.0; - if (!model->BSIM4v5pcgidlGiven) - model->BSIM4v5pcgidl = 0.0; - if (!model->BSIM4v5pegidlGiven) - model->BSIM4v5pegidl = 0.0; - if (!model->BSIM4v5paigcGiven) - model->BSIM4v5paigc = 0.0; - if (!model->BSIM4v5pbigcGiven) - model->BSIM4v5pbigc = 0.0; - if (!model->BSIM4v5pcigcGiven) - model->BSIM4v5pcigc = 0.0; - if (!model->BSIM4v5paigsdGiven) - model->BSIM4v5paigsd = 0.0; - if (!model->BSIM4v5pbigsdGiven) - model->BSIM4v5pbigsd = 0.0; - if (!model->BSIM4v5pcigsdGiven) - model->BSIM4v5pcigsd = 0.0; - if (!model->BSIM4v5paigbaccGiven) - model->BSIM4v5paigbacc = 0.0; - if (!model->BSIM4v5pbigbaccGiven) - model->BSIM4v5pbigbacc = 0.0; - if (!model->BSIM4v5pcigbaccGiven) - model->BSIM4v5pcigbacc = 0.0; - if (!model->BSIM4v5paigbinvGiven) - model->BSIM4v5paigbinv = 0.0; - if (!model->BSIM4v5pbigbinvGiven) - model->BSIM4v5pbigbinv = 0.0; - if (!model->BSIM4v5pcigbinvGiven) - model->BSIM4v5pcigbinv = 0.0; - if (!model->BSIM4v5pnigcGiven) - model->BSIM4v5pnigc = 0.0; - if (!model->BSIM4v5pnigbinvGiven) - model->BSIM4v5pnigbinv = 0.0; - if (!model->BSIM4v5pnigbaccGiven) - model->BSIM4v5pnigbacc = 0.0; - if (!model->BSIM4v5pntoxGiven) - model->BSIM4v5pntox = 0.0; - if (!model->BSIM4v5peigbinvGiven) - model->BSIM4v5peigbinv = 0.0; - if (!model->BSIM4v5ppigcdGiven) - model->BSIM4v5ppigcd = 0.0; - if (!model->BSIM4v5ppoxedgeGiven) - model->BSIM4v5ppoxedge = 0.0; - if (!model->BSIM4v5pxrcrg1Given) - model->BSIM4v5pxrcrg1 = 0.0; - if (!model->BSIM4v5pxrcrg2Given) - model->BSIM4v5pxrcrg2 = 0.0; - if (!model->BSIM4v5peuGiven) - model->BSIM4v5peu = 0.0; - if (!model->BSIM4v5pvfbGiven) - model->BSIM4v5pvfb = 0.0; - if (!model->BSIM4v5plambdaGiven) - model->BSIM4v5plambda = 0.0; - if (!model->BSIM4v5pvtlGiven) - model->BSIM4v5pvtl = 0.0; - if (!model->BSIM4v5pxnGiven) - model->BSIM4v5pxn = 0.0; - if (!model->BSIM4v5pvfbsdoffGiven) - model->BSIM4v5pvfbsdoff = 0.0; - if (!model->BSIM4v5ptvfbsdoffGiven) - model->BSIM4v5ptvfbsdoff = 0.0; - if (!model->BSIM4v5ptvoffGiven) - model->BSIM4v5ptvoff = 0.0; - - if (!model->BSIM4v5pcgslGiven) - model->BSIM4v5pcgsl = 0.0; - if (!model->BSIM4v5pcgdlGiven) - model->BSIM4v5pcgdl = 0.0; - if (!model->BSIM4v5pckappasGiven) - model->BSIM4v5pckappas = 0.0; - if (!model->BSIM4v5pckappadGiven) - model->BSIM4v5pckappad = 0.0; - if (!model->BSIM4v5pcfGiven) - model->BSIM4v5pcf = 0.0; - if (!model->BSIM4v5pclcGiven) - model->BSIM4v5pclc = 0.0; - if (!model->BSIM4v5pcleGiven) - model->BSIM4v5pcle = 0.0; - if (!model->BSIM4v5pvfbcvGiven) - model->BSIM4v5pvfbcv = 0.0; - if (!model->BSIM4v5pacdeGiven) - model->BSIM4v5pacde = 0.0; - if (!model->BSIM4v5pmoinGiven) - model->BSIM4v5pmoin = 0.0; - if (!model->BSIM4v5pnoffGiven) - model->BSIM4v5pnoff = 0.0; - if (!model->BSIM4v5pvoffcvGiven) - model->BSIM4v5pvoffcv = 0.0; - - if (!model->BSIM4v5gamma1Given) - model->BSIM4v5gamma1 = 0.0; - if (!model->BSIM4v5lgamma1Given) - model->BSIM4v5lgamma1 = 0.0; - if (!model->BSIM4v5wgamma1Given) - model->BSIM4v5wgamma1 = 0.0; - if (!model->BSIM4v5pgamma1Given) - model->BSIM4v5pgamma1 = 0.0; - if (!model->BSIM4v5gamma2Given) - model->BSIM4v5gamma2 = 0.0; - if (!model->BSIM4v5lgamma2Given) - model->BSIM4v5lgamma2 = 0.0; - if (!model->BSIM4v5wgamma2Given) - model->BSIM4v5wgamma2 = 0.0; - if (!model->BSIM4v5pgamma2Given) - model->BSIM4v5pgamma2 = 0.0; - if (!model->BSIM4v5vbxGiven) - model->BSIM4v5vbx = 0.0; - if (!model->BSIM4v5lvbxGiven) - model->BSIM4v5lvbx = 0.0; - if (!model->BSIM4v5wvbxGiven) - model->BSIM4v5wvbx = 0.0; - if (!model->BSIM4v5pvbxGiven) - model->BSIM4v5pvbx = 0.0; - - /* unit degree celcius */ - if (!model->BSIM4v5tnomGiven) - model->BSIM4v5tnom = ckt->CKTnomTemp; - if (!model->BSIM4v5LintGiven) - model->BSIM4v5Lint = 0.0; - if (!model->BSIM4v5LlGiven) - model->BSIM4v5Ll = 0.0; - if (!model->BSIM4v5LlcGiven) - model->BSIM4v5Llc = model->BSIM4v5Ll; - if (!model->BSIM4v5LlnGiven) - model->BSIM4v5Lln = 1.0; - if (!model->BSIM4v5LwGiven) - model->BSIM4v5Lw = 0.0; - if (!model->BSIM4v5LwcGiven) - model->BSIM4v5Lwc = model->BSIM4v5Lw; - if (!model->BSIM4v5LwnGiven) - model->BSIM4v5Lwn = 1.0; - if (!model->BSIM4v5LwlGiven) - model->BSIM4v5Lwl = 0.0; - if (!model->BSIM4v5LwlcGiven) - model->BSIM4v5Lwlc = model->BSIM4v5Lwl; - if (!model->BSIM4v5LminGiven) - model->BSIM4v5Lmin = 0.0; - if (!model->BSIM4v5LmaxGiven) - model->BSIM4v5Lmax = 1.0; - if (!model->BSIM4v5WintGiven) - model->BSIM4v5Wint = 0.0; - if (!model->BSIM4v5WlGiven) - model->BSIM4v5Wl = 0.0; - if (!model->BSIM4v5WlcGiven) - model->BSIM4v5Wlc = model->BSIM4v5Wl; - if (!model->BSIM4v5WlnGiven) - model->BSIM4v5Wln = 1.0; - if (!model->BSIM4v5WwGiven) - model->BSIM4v5Ww = 0.0; - if (!model->BSIM4v5WwcGiven) - model->BSIM4v5Wwc = model->BSIM4v5Ww; - if (!model->BSIM4v5WwnGiven) - model->BSIM4v5Wwn = 1.0; - if (!model->BSIM4v5WwlGiven) - model->BSIM4v5Wwl = 0.0; - if (!model->BSIM4v5WwlcGiven) - model->BSIM4v5Wwlc = model->BSIM4v5Wwl; - if (!model->BSIM4v5WminGiven) - model->BSIM4v5Wmin = 0.0; - if (!model->BSIM4v5WmaxGiven) - model->BSIM4v5Wmax = 1.0; - if (!model->BSIM4v5dwcGiven) - model->BSIM4v5dwc = model->BSIM4v5Wint; - if (!model->BSIM4v5dlcGiven) - model->BSIM4v5dlc = model->BSIM4v5Lint; - if (!model->BSIM4v5xlGiven) - model->BSIM4v5xl = 0.0; - if (!model->BSIM4v5xwGiven) - model->BSIM4v5xw = 0.0; - if (!model->BSIM4v5dlcigGiven) - model->BSIM4v5dlcig = model->BSIM4v5Lint; - if (!model->BSIM4v5dwjGiven) - model->BSIM4v5dwj = model->BSIM4v5dwc; - if (!model->BSIM4v5cfGiven) - model->BSIM4v5cf = 2.0 * model->BSIM4v5epsrox * EPS0 / PI - * log(1.0 + 0.4e-6 / model->BSIM4v5toxe); - - if (!model->BSIM4v5xpartGiven) - model->BSIM4v5xpart = 0.0; - if (!model->BSIM4v5sheetResistanceGiven) - model->BSIM4v5sheetResistance = 0.0; - - if (!model->BSIM4v5SunitAreaJctCapGiven) - model->BSIM4v5SunitAreaJctCap = 5.0E-4; - if (!model->BSIM4v5DunitAreaJctCapGiven) - model->BSIM4v5DunitAreaJctCap = model->BSIM4v5SunitAreaJctCap; - if (!model->BSIM4v5SunitLengthSidewallJctCapGiven) - model->BSIM4v5SunitLengthSidewallJctCap = 5.0E-10; - if (!model->BSIM4v5DunitLengthSidewallJctCapGiven) - model->BSIM4v5DunitLengthSidewallJctCap = model->BSIM4v5SunitLengthSidewallJctCap; - if (!model->BSIM4v5SunitLengthGateSidewallJctCapGiven) - model->BSIM4v5SunitLengthGateSidewallJctCap = model->BSIM4v5SunitLengthSidewallJctCap ; - if (!model->BSIM4v5DunitLengthGateSidewallJctCapGiven) - model->BSIM4v5DunitLengthGateSidewallJctCap = model->BSIM4v5SunitLengthGateSidewallJctCap; - if (!model->BSIM4v5SjctSatCurDensityGiven) - model->BSIM4v5SjctSatCurDensity = 1.0E-4; - if (!model->BSIM4v5DjctSatCurDensityGiven) - model->BSIM4v5DjctSatCurDensity = model->BSIM4v5SjctSatCurDensity; - if (!model->BSIM4v5SjctSidewallSatCurDensityGiven) - model->BSIM4v5SjctSidewallSatCurDensity = 0.0; - if (!model->BSIM4v5DjctSidewallSatCurDensityGiven) - model->BSIM4v5DjctSidewallSatCurDensity = model->BSIM4v5SjctSidewallSatCurDensity; - if (!model->BSIM4v5SjctGateSidewallSatCurDensityGiven) - model->BSIM4v5SjctGateSidewallSatCurDensity = 0.0; - if (!model->BSIM4v5DjctGateSidewallSatCurDensityGiven) - model->BSIM4v5DjctGateSidewallSatCurDensity = model->BSIM4v5SjctGateSidewallSatCurDensity; - if (!model->BSIM4v5SbulkJctPotentialGiven) - model->BSIM4v5SbulkJctPotential = 1.0; - if (!model->BSIM4v5DbulkJctPotentialGiven) - model->BSIM4v5DbulkJctPotential = model->BSIM4v5SbulkJctPotential; - if (!model->BSIM4v5SsidewallJctPotentialGiven) - model->BSIM4v5SsidewallJctPotential = 1.0; - if (!model->BSIM4v5DsidewallJctPotentialGiven) - model->BSIM4v5DsidewallJctPotential = model->BSIM4v5SsidewallJctPotential; - if (!model->BSIM4v5SGatesidewallJctPotentialGiven) - model->BSIM4v5SGatesidewallJctPotential = model->BSIM4v5SsidewallJctPotential; - if (!model->BSIM4v5DGatesidewallJctPotentialGiven) - model->BSIM4v5DGatesidewallJctPotential = model->BSIM4v5SGatesidewallJctPotential; - if (!model->BSIM4v5SbulkJctBotGradingCoeffGiven) - model->BSIM4v5SbulkJctBotGradingCoeff = 0.5; - if (!model->BSIM4v5DbulkJctBotGradingCoeffGiven) - model->BSIM4v5DbulkJctBotGradingCoeff = model->BSIM4v5SbulkJctBotGradingCoeff; - if (!model->BSIM4v5SbulkJctSideGradingCoeffGiven) - model->BSIM4v5SbulkJctSideGradingCoeff = 0.33; - if (!model->BSIM4v5DbulkJctSideGradingCoeffGiven) - model->BSIM4v5DbulkJctSideGradingCoeff = model->BSIM4v5SbulkJctSideGradingCoeff; - if (!model->BSIM4v5SbulkJctGateSideGradingCoeffGiven) - model->BSIM4v5SbulkJctGateSideGradingCoeff = model->BSIM4v5SbulkJctSideGradingCoeff; - if (!model->BSIM4v5DbulkJctGateSideGradingCoeffGiven) - model->BSIM4v5DbulkJctGateSideGradingCoeff = model->BSIM4v5SbulkJctGateSideGradingCoeff; - if (!model->BSIM4v5SjctEmissionCoeffGiven) - model->BSIM4v5SjctEmissionCoeff = 1.0; - if (!model->BSIM4v5DjctEmissionCoeffGiven) - model->BSIM4v5DjctEmissionCoeff = model->BSIM4v5SjctEmissionCoeff; - if (!model->BSIM4v5SjctTempExponentGiven) - model->BSIM4v5SjctTempExponent = 3.0; - if (!model->BSIM4v5DjctTempExponentGiven) - model->BSIM4v5DjctTempExponent = model->BSIM4v5SjctTempExponent; - - if (!model->BSIM4v5jtssGiven) - model->BSIM4v5jtss = 0.0; - if (!model->BSIM4v5jtsdGiven) - model->BSIM4v5jtsd = model->BSIM4v5jtss; - if (!model->BSIM4v5jtsswsGiven) - model->BSIM4v5jtssws = 0.0; - if (!model->BSIM4v5jtsswdGiven) - model->BSIM4v5jtsswd = model->BSIM4v5jtssws; - if (!model->BSIM4v5jtsswgsGiven) - model->BSIM4v5jtsswgs = 0.0; - if (!model->BSIM4v5jtsswgdGiven) - model->BSIM4v5jtsswgd = model->BSIM4v5jtsswgs; - if (!model->BSIM4v5njtsGiven) - model->BSIM4v5njts = 20.0; - if (!model->BSIM4v5njtsswGiven) - model->BSIM4v5njtssw = 20.0; - if (!model->BSIM4v5njtsswgGiven) - model->BSIM4v5njtsswg = 20.0; - if (!model->BSIM4v5xtssGiven) - model->BSIM4v5xtss = 0.02; - if (!model->BSIM4v5xtsdGiven) - model->BSIM4v5xtsd = model->BSIM4v5xtss; - if (!model->BSIM4v5xtsswsGiven) - model->BSIM4v5xtssws = 0.02; - if (!model->BSIM4v5xtsswdGiven) - model->BSIM4v5xtsswd = model->BSIM4v5xtssws; - if (!model->BSIM4v5xtsswgsGiven) - model->BSIM4v5xtsswgs = 0.02; - if (!model->BSIM4v5xtsswgdGiven) - model->BSIM4v5xtsswgd = model->BSIM4v5xtsswgs; - if (!model->BSIM4v5tnjtsGiven) - model->BSIM4v5tnjts = 0.0; - if (!model->BSIM4v5tnjtsswGiven) - model->BSIM4v5tnjtssw = 0.0; - if (!model->BSIM4v5tnjtsswgGiven) - model->BSIM4v5tnjtsswg = 0.0; - if (!model->BSIM4v5vtssGiven) - model->BSIM4v5vtss = 10.0; - if (!model->BSIM4v5vtsdGiven) - model->BSIM4v5vtsd = model->BSIM4v5vtss; - if (!model->BSIM4v5vtsswsGiven) - model->BSIM4v5vtssws = 10.0; - if (!model->BSIM4v5vtsswdGiven) - model->BSIM4v5vtsswd = model->BSIM4v5vtssws; - if (!model->BSIM4v5vtsswgsGiven) - model->BSIM4v5vtsswgs = 10.0; - if (!model->BSIM4v5vtsswgdGiven) - model->BSIM4v5vtsswgd = model->BSIM4v5vtsswgs; - - if (!model->BSIM4v5oxideTrapDensityAGiven) - { if (model->BSIM4v5type == NMOS) - model->BSIM4v5oxideTrapDensityA = 6.25e41; - else - model->BSIM4v5oxideTrapDensityA= 6.188e40; - } - if (!model->BSIM4v5oxideTrapDensityBGiven) - { if (model->BSIM4v5type == NMOS) - model->BSIM4v5oxideTrapDensityB = 3.125e26; - else - model->BSIM4v5oxideTrapDensityB = 1.5e25; - } - if (!model->BSIM4v5oxideTrapDensityCGiven) - model->BSIM4v5oxideTrapDensityC = 8.75e9; - if (!model->BSIM4v5emGiven) - model->BSIM4v5em = 4.1e7; /* V/m */ - if (!model->BSIM4v5efGiven) - model->BSIM4v5ef = 1.0; - if (!model->BSIM4v5afGiven) - model->BSIM4v5af = 1.0; - if (!model->BSIM4v5kfGiven) - model->BSIM4v5kf = 0.0; - - if (!model->BSIM4v5vgsMaxGiven) - model->BSIM4v5vgsMax = 1e99; - if (!model->BSIM4v5vgdMaxGiven) - model->BSIM4v5vgdMax = 1e99; - if (!model->BSIM4v5vgbMaxGiven) - model->BSIM4v5vgbMax = 1e99; - if (!model->BSIM4v5vdsMaxGiven) - model->BSIM4v5vdsMax = 1e99; - if (!model->BSIM4v5vbsMaxGiven) - model->BSIM4v5vbsMax = 1e99; - if (!model->BSIM4v5vbdMaxGiven) - model->BSIM4v5vbdMax = 1e99; - if (!model->BSIM4v5vgsrMaxGiven) - model->BSIM4v5vgsrMax = 1e99; - if (!model->BSIM4v5vgdrMaxGiven) - model->BSIM4v5vgdrMax = 1e99; - if (!model->BSIM4v5vgbrMaxGiven) - model->BSIM4v5vgbrMax = 1e99; - if (!model->BSIM4v5vbsrMaxGiven) - model->BSIM4v5vbsrMax = 1e99; - if (!model->BSIM4v5vbdrMaxGiven) - model->BSIM4v5vbdrMax = 1e99; - - /* stress effect */ - if (!model->BSIM4v5sarefGiven) - model->BSIM4v5saref = 1e-6; /* m */ - if (!model->BSIM4v5sbrefGiven) - model->BSIM4v5sbref = 1e-6; /* m */ - if (!model->BSIM4v5wlodGiven) - model->BSIM4v5wlod = 0; /* m */ - if (!model->BSIM4v5ku0Given) - model->BSIM4v5ku0 = 0; /* 1/m */ - if (!model->BSIM4v5kvsatGiven) - model->BSIM4v5kvsat = 0; - if (!model->BSIM4v5kvth0Given) /* m */ - model->BSIM4v5kvth0 = 0; - if (!model->BSIM4v5tku0Given) - model->BSIM4v5tku0 = 0; - if (!model->BSIM4v5llodku0Given) - model->BSIM4v5llodku0 = 0; - if (!model->BSIM4v5wlodku0Given) - model->BSIM4v5wlodku0 = 0; - if (!model->BSIM4v5llodvthGiven) - model->BSIM4v5llodvth = 0; - if (!model->BSIM4v5wlodvthGiven) - model->BSIM4v5wlodvth = 0; - if (!model->BSIM4v5lku0Given) - model->BSIM4v5lku0 = 0; - if (!model->BSIM4v5wku0Given) - model->BSIM4v5wku0 = 0; - if (!model->BSIM4v5pku0Given) - model->BSIM4v5pku0 = 0; - if (!model->BSIM4v5lkvth0Given) - model->BSIM4v5lkvth0 = 0; - if (!model->BSIM4v5wkvth0Given) - model->BSIM4v5wkvth0 = 0; - if (!model->BSIM4v5pkvth0Given) - model->BSIM4v5pkvth0 = 0; - if (!model->BSIM4v5stk2Given) - model->BSIM4v5stk2 = 0; - if (!model->BSIM4v5lodk2Given) - model->BSIM4v5lodk2 = 1.0; - if (!model->BSIM4v5steta0Given) - model->BSIM4v5steta0 = 0; - if (!model->BSIM4v5lodeta0Given) - model->BSIM4v5lodeta0 = 1.0; - - /* Well Proximity Effect */ - if (!model->BSIM4v5webGiven) - model->BSIM4v5web = 0.0; - if (!model->BSIM4v5wecGiven) - model->BSIM4v5wec = 0.0; - if (!model->BSIM4v5kvth0weGiven) - model->BSIM4v5kvth0we = 0.0; - if (!model->BSIM4v5k2weGiven) - model->BSIM4v5k2we = 0.0; - if (!model->BSIM4v5ku0weGiven) - model->BSIM4v5ku0we = 0.0; - if (!model->BSIM4v5screfGiven) - model->BSIM4v5scref = 1.0E-6; /* m */ - if (!model->BSIM4v5wpemodGiven) - model->BSIM4v5wpemod = 0; - else if ((model->BSIM4v5wpemod != 0) && (model->BSIM4v5wpemod != 1)) - { model->BSIM4v5wpemod = 0; - printf("Warning: wpemod has been set to its default value: 0.\n"); - } - if (!model->BSIM4v5lkvth0weGiven) - model->BSIM4v5lkvth0we = 0; - if (!model->BSIM4v5lk2weGiven) - model->BSIM4v5lk2we = 0; - if (!model->BSIM4v5lku0weGiven) - model->BSIM4v5lku0we = 0; - if (!model->BSIM4v5wkvth0weGiven) - model->BSIM4v5wkvth0we = 0; - if (!model->BSIM4v5wk2weGiven) - model->BSIM4v5wk2we = 0; - if (!model->BSIM4v5wku0weGiven) - model->BSIM4v5wku0we = 0; - if (!model->BSIM4v5pkvth0weGiven) - model->BSIM4v5pkvth0we = 0; - if (!model->BSIM4v5pk2weGiven) - model->BSIM4v5pk2we = 0; - if (!model->BSIM4v5pku0weGiven) - model->BSIM4v5pku0we = 0; - - DMCGeff = model->BSIM4v5dmcg - model->BSIM4v5dmcgt; - DMCIeff = model->BSIM4v5dmci; - DMDGeff = model->BSIM4v5dmdg - model->BSIM4v5dmcgt; - - /* - * End processing models and begin to loop - * through all the instances of the model - */ - - for (here = BSIM4v5instances(model); here != NULL ; - here=BSIM4v5nextInstance(here)) - { - /* allocate a chunk of the state vector */ - here->BSIM4v5states = *states; - *states += BSIM4v5numStates; - - /* perform the parameter defaulting */ - if (!here->BSIM4v5lGiven) - here->BSIM4v5l = 5.0e-6; - if (!here->BSIM4v5wGiven) - here->BSIM4v5w = 5.0e-6; - if (!here->BSIM4v5mGiven) - here->BSIM4v5m = 1.0; - if (!here->BSIM4v5nfGiven) - here->BSIM4v5nf = 1.0; - if (!here->BSIM4v5minGiven) - here->BSIM4v5min = 0; /* integer */ - if (!here->BSIM4v5icVDSGiven) - here->BSIM4v5icVDS = 0.0; - if (!here->BSIM4v5icVGSGiven) - here->BSIM4v5icVGS = 0.0; - if (!here->BSIM4v5icVBSGiven) - here->BSIM4v5icVBS = 0.0; - if (!here->BSIM4v5drainAreaGiven) - here->BSIM4v5drainArea = 0.0; - if (!here->BSIM4v5drainPerimeterGiven) - here->BSIM4v5drainPerimeter = 0.0; - if (!here->BSIM4v5drainSquaresGiven) - here->BSIM4v5drainSquares = 1.0; - if (!here->BSIM4v5sourceAreaGiven) - here->BSIM4v5sourceArea = 0.0; - if (!here->BSIM4v5sourcePerimeterGiven) - here->BSIM4v5sourcePerimeter = 0.0; - if (!here->BSIM4v5sourceSquaresGiven) - here->BSIM4v5sourceSquares = 1.0; - - if (!here->BSIM4v5saGiven) - here->BSIM4v5sa = 0.0; - if (!here->BSIM4v5sbGiven) - here->BSIM4v5sb = 0.0; - if (!here->BSIM4v5sdGiven) - here->BSIM4v5sd = 0.0; - - if (!here->BSIM4v5rbdbGiven) - here->BSIM4v5rbdb = model->BSIM4v5rbdb; /* in ohm */ - if (!here->BSIM4v5rbsbGiven) - here->BSIM4v5rbsb = model->BSIM4v5rbsb; - if (!here->BSIM4v5rbpbGiven) - here->BSIM4v5rbpb = model->BSIM4v5rbpb; - if (!here->BSIM4v5rbpsGiven) - here->BSIM4v5rbps = model->BSIM4v5rbps; - if (!here->BSIM4v5rbpdGiven) - here->BSIM4v5rbpd = model->BSIM4v5rbpd; - if (!here->BSIM4v5delvtoGiven) - here->BSIM4v5delvto = 0.0; - if (!here->BSIM4v5xgwGiven) - here->BSIM4v5xgw = model->BSIM4v5xgw; - if (!here->BSIM4v5ngconGiven) - here->BSIM4v5ngcon = model->BSIM4v5ngcon; - - - /* Process instance model selectors, some - * may override their global counterparts - */ - if (!here->BSIM4v5rbodyModGiven) - here->BSIM4v5rbodyMod = model->BSIM4v5rbodyMod; - else if ((here->BSIM4v5rbodyMod != 0) && (here->BSIM4v5rbodyMod != 1) && (here->BSIM4v5rbodyMod != 2)) - { here->BSIM4v5rbodyMod = model->BSIM4v5rbodyMod; - printf("Warning: rbodyMod has been set to its global value %d.\n", - model->BSIM4v5rbodyMod); - } - - if (!here->BSIM4v5rgateModGiven) - here->BSIM4v5rgateMod = model->BSIM4v5rgateMod; - else if ((here->BSIM4v5rgateMod != 0) && (here->BSIM4v5rgateMod != 1) - && (here->BSIM4v5rgateMod != 2) && (here->BSIM4v5rgateMod != 3)) - { here->BSIM4v5rgateMod = model->BSIM4v5rgateMod; - printf("Warning: rgateMod has been set to its global value %d.\n", - model->BSIM4v5rgateMod); - } - - if (!here->BSIM4v5geoModGiven) - here->BSIM4v5geoMod = model->BSIM4v5geoMod; - - if (!here->BSIM4v5rgeoModGiven) - here->BSIM4v5rgeoMod = model->BSIM4v5rgeoMod; - else if ((here->BSIM4v5rgeoMod != 0) && (here->BSIM4v5rgeoMod != 1)) - { here->BSIM4v5rgeoMod = model->BSIM4v5rgeoMod; - printf("Warning: rgeoMod has been set to its global value %d.\n", - model->BSIM4v5rgeoMod); - } - if (!here->BSIM4v5trnqsModGiven) - here->BSIM4v5trnqsMod = model->BSIM4v5trnqsMod; - else if ((here->BSIM4v5trnqsMod != 0) && (here->BSIM4v5trnqsMod != 1)) - { here->BSIM4v5trnqsMod = model->BSIM4v5trnqsMod; - printf("Warning: trnqsMod has been set to its global value %d.\n", - model->BSIM4v5trnqsMod); - } - - if (!here->BSIM4v5acnqsModGiven) - here->BSIM4v5acnqsMod = model->BSIM4v5acnqsMod; - else if ((here->BSIM4v5acnqsMod != 0) && (here->BSIM4v5acnqsMod != 1)) - { here->BSIM4v5acnqsMod = model->BSIM4v5acnqsMod; - printf("Warning: acnqsMod has been set to its global value %d.\n", - model->BSIM4v5acnqsMod); - } - - /* stress effect */ - if (!here->BSIM4v5saGiven) - here->BSIM4v5sa = 0.0; - if (!here->BSIM4v5sbGiven) - here->BSIM4v5sb = 0.0; - if (!here->BSIM4v5sdGiven) - here->BSIM4v5sd = 2 * model->BSIM4v5dmcg; - /* Well Proximity Effect */ - if (!here->BSIM4v5scaGiven) - here->BSIM4v5sca = 0.0; - if (!here->BSIM4v5scbGiven) - here->BSIM4v5scb = 0.0; - if (!here->BSIM4v5sccGiven) - here->BSIM4v5scc = 0.0; - if (!here->BSIM4v5scGiven) - here->BSIM4v5sc = 0.0; /* m */ - - /* process drain series resistance */ - createNode = 0; - if ( (model->BSIM4v5rdsMod != 0) - || (model->BSIM4v5tnoiMod != 0 && noiseAnalGiven)) - { - createNode = 1; - } else if (model->BSIM4v5sheetResistance > 0) - { - if (here->BSIM4v5drainSquaresGiven - && here->BSIM4v5drainSquares > 0) - { - createNode = 1; - } else if (!here->BSIM4v5drainSquaresGiven - && (here->BSIM4v5rgeoMod != 0)) - { - BSIM4v5RdseffGeo(here->BSIM4v5nf*here->BSIM4v5m, here->BSIM4v5geoMod, - here->BSIM4v5rgeoMod, here->BSIM4v5min, - here->BSIM4v5w, model->BSIM4v5sheetResistance, - DMCGeff, DMCIeff, DMDGeff, 0, &Rtot); - if(Rtot > 0) - createNode = 1; - } - } - if ( createNode != 0 ) - { if (here->BSIM4v5dNodePrime == 0) - { error = CKTmkVolt(ckt,&tmp,here->BSIM4v5name,"drain"); - if(error) return(error); - here->BSIM4v5dNodePrime = tmp->number; - - if (ckt->CKTcopyNodesets) { - CKTnode *tmpNode; - IFuid tmpName; - if (CKTinst2Node(ckt,here,1,&tmpNode,&tmpName)==OK) { - if (tmpNode->nsGiven) { - tmp->nodeset=tmpNode->nodeset; - tmp->nsGiven=tmpNode->nsGiven; - } - } - -} - - } - } - else - { here->BSIM4v5dNodePrime = here->BSIM4v5dNode; - } - - /* process source series resistance */ - createNode = 0; - if ( (model->BSIM4v5rdsMod != 0) - || (model->BSIM4v5tnoiMod != 0 && noiseAnalGiven)) - { - createNode = 1; - } else if (model->BSIM4v5sheetResistance > 0) - { - if (here->BSIM4v5sourceSquaresGiven - && here->BSIM4v5sourceSquares > 0) - { - createNode = 1; - } else if (!here->BSIM4v5sourceSquaresGiven - && (here->BSIM4v5rgeoMod != 0)) - { - BSIM4v5RdseffGeo(here->BSIM4v5nf*here->BSIM4v5m, here->BSIM4v5geoMod, - here->BSIM4v5rgeoMod, here->BSIM4v5min, - here->BSIM4v5w, model->BSIM4v5sheetResistance, - DMCGeff, DMCIeff, DMDGeff, 1, &Rtot); - if(Rtot > 0) - createNode = 1; - } - } - if ( createNode != 0 ) - { if (here->BSIM4v5sNodePrime == 0) - { error = CKTmkVolt(ckt,&tmp,here->BSIM4v5name,"source"); - if(error) return(error); - here->BSIM4v5sNodePrime = tmp->number; - - if (ckt->CKTcopyNodesets) { - CKTnode *tmpNode; - IFuid tmpName; - if (CKTinst2Node(ckt,here,3,&tmpNode,&tmpName)==OK) { - if (tmpNode->nsGiven) { - tmp->nodeset=tmpNode->nodeset; - tmp->nsGiven=tmpNode->nsGiven; - } - } - } - - } - } - else - here->BSIM4v5sNodePrime = here->BSIM4v5sNode; - - if (here->BSIM4v5rgateMod > 0) - { if (here->BSIM4v5gNodePrime == 0) - { error = CKTmkVolt(ckt,&tmp,here->BSIM4v5name,"gate"); - if(error) return(error); - here->BSIM4v5gNodePrime = tmp->number; - - if (ckt->CKTcopyNodesets) { - CKTnode *tmpNode; - IFuid tmpName; - if (CKTinst2Node(ckt,here,2,&tmpNode,&tmpName)==OK) { - if (tmpNode->nsGiven) { - tmp->nodeset=tmpNode->nodeset; - tmp->nsGiven=tmpNode->nsGiven; - } - } - } - - } - } - else - here->BSIM4v5gNodePrime = here->BSIM4v5gNodeExt; - - if (here->BSIM4v5rgateMod == 3) - { if (here->BSIM4v5gNodeMid == 0) - { error = CKTmkVolt(ckt,&tmp,here->BSIM4v5name,"midgate"); - if(error) return(error); - here->BSIM4v5gNodeMid = tmp->number; - } - } - else - here->BSIM4v5gNodeMid = here->BSIM4v5gNodeExt; - - - /* internal body nodes for body resistance model */ - if ((here->BSIM4v5rbodyMod ==1) || (here->BSIM4v5rbodyMod ==2)) - { if (here->BSIM4v5dbNode == 0) - { error = CKTmkVolt(ckt,&tmp,here->BSIM4v5name,"dbody"); - if(error) return(error); - here->BSIM4v5dbNode = tmp->number; - - if (ckt->CKTcopyNodesets) { - CKTnode *tmpNode; - IFuid tmpName; - if (CKTinst2Node(ckt,here,4,&tmpNode,&tmpName)==OK) { - if (tmpNode->nsGiven) { - tmp->nodeset=tmpNode->nodeset; - tmp->nsGiven=tmpNode->nsGiven; - } - } - } - } - if (here->BSIM4v5bNodePrime == 0) - { error = CKTmkVolt(ckt,&tmp,here->BSIM4v5name,"body"); - if(error) return(error); - here->BSIM4v5bNodePrime = tmp->number; - } - if (here->BSIM4v5sbNode == 0) - { error = CKTmkVolt(ckt,&tmp,here->BSIM4v5name,"sbody"); - if(error) return(error); - here->BSIM4v5sbNode = tmp->number; - } - } - else - here->BSIM4v5dbNode = here->BSIM4v5bNodePrime = here->BSIM4v5sbNode - = here->BSIM4v5bNode; - - /* NQS node */ - if (here->BSIM4v5trnqsMod) - { if (here->BSIM4v5qNode == 0) - { error = CKTmkVolt(ckt,&tmp,here->BSIM4v5name,"charge"); - if(error) return(error); - here->BSIM4v5qNode = tmp->number; - - if (ckt->CKTcopyNodesets) { - CKTnode *tmpNode; - IFuid tmpName; - if (CKTinst2Node(ckt,here,5,&tmpNode,&tmpName)==OK) { - if (tmpNode->nsGiven) { - tmp->nodeset=tmpNode->nodeset; - tmp->nsGiven=tmpNode->nsGiven; - } - } - } - } - } - else - here->BSIM4v5qNode = 0; - -/* set Sparse Matrix Pointers - * macro to make elements with built-in out-of-memory test */ -#define TSTALLOC(ptr,first,second) \ -do { if((here->ptr = SMPmakeElt(matrix, here->first, here->second)) == NULL){\ - return(E_NOMEM);\ -} } while(0) - - TSTALLOC(BSIM4v5DPbpPtr, BSIM4v5dNodePrime, BSIM4v5bNodePrime); - TSTALLOC(BSIM4v5GPbpPtr, BSIM4v5gNodePrime, BSIM4v5bNodePrime); - TSTALLOC(BSIM4v5SPbpPtr, BSIM4v5sNodePrime, BSIM4v5bNodePrime); - - TSTALLOC(BSIM4v5BPdpPtr, BSIM4v5bNodePrime, BSIM4v5dNodePrime); - TSTALLOC(BSIM4v5BPgpPtr, BSIM4v5bNodePrime, BSIM4v5gNodePrime); - TSTALLOC(BSIM4v5BPspPtr, BSIM4v5bNodePrime, BSIM4v5sNodePrime); - TSTALLOC(BSIM4v5BPbpPtr, BSIM4v5bNodePrime, BSIM4v5bNodePrime); - - TSTALLOC(BSIM4v5DdPtr, BSIM4v5dNode, BSIM4v5dNode); - TSTALLOC(BSIM4v5GPgpPtr, BSIM4v5gNodePrime, BSIM4v5gNodePrime); - TSTALLOC(BSIM4v5SsPtr, BSIM4v5sNode, BSIM4v5sNode); - TSTALLOC(BSIM4v5DPdpPtr, BSIM4v5dNodePrime, BSIM4v5dNodePrime); - TSTALLOC(BSIM4v5SPspPtr, BSIM4v5sNodePrime, BSIM4v5sNodePrime); - TSTALLOC(BSIM4v5DdpPtr, BSIM4v5dNode, BSIM4v5dNodePrime); - TSTALLOC(BSIM4v5GPdpPtr, BSIM4v5gNodePrime, BSIM4v5dNodePrime); - TSTALLOC(BSIM4v5GPspPtr, BSIM4v5gNodePrime, BSIM4v5sNodePrime); - TSTALLOC(BSIM4v5SspPtr, BSIM4v5sNode, BSIM4v5sNodePrime); - TSTALLOC(BSIM4v5DPspPtr, BSIM4v5dNodePrime, BSIM4v5sNodePrime); - TSTALLOC(BSIM4v5DPdPtr, BSIM4v5dNodePrime, BSIM4v5dNode); - TSTALLOC(BSIM4v5DPgpPtr, BSIM4v5dNodePrime, BSIM4v5gNodePrime); - TSTALLOC(BSIM4v5SPgpPtr, BSIM4v5sNodePrime, BSIM4v5gNodePrime); - TSTALLOC(BSIM4v5SPsPtr, BSIM4v5sNodePrime, BSIM4v5sNode); - TSTALLOC(BSIM4v5SPdpPtr, BSIM4v5sNodePrime, BSIM4v5dNodePrime); - - TSTALLOC(BSIM4v5QqPtr, BSIM4v5qNode, BSIM4v5qNode); - TSTALLOC(BSIM4v5QbpPtr, BSIM4v5qNode, BSIM4v5bNodePrime) ; - TSTALLOC(BSIM4v5QdpPtr, BSIM4v5qNode, BSIM4v5dNodePrime); - TSTALLOC(BSIM4v5QspPtr, BSIM4v5qNode, BSIM4v5sNodePrime); - TSTALLOC(BSIM4v5QgpPtr, BSIM4v5qNode, BSIM4v5gNodePrime); - TSTALLOC(BSIM4v5DPqPtr, BSIM4v5dNodePrime, BSIM4v5qNode); - TSTALLOC(BSIM4v5SPqPtr, BSIM4v5sNodePrime, BSIM4v5qNode); - TSTALLOC(BSIM4v5GPqPtr, BSIM4v5gNodePrime, BSIM4v5qNode); - - if (here->BSIM4v5rgateMod != 0) - { TSTALLOC(BSIM4v5GEgePtr, BSIM4v5gNodeExt, BSIM4v5gNodeExt); - TSTALLOC(BSIM4v5GEgpPtr, BSIM4v5gNodeExt, BSIM4v5gNodePrime); - TSTALLOC(BSIM4v5GPgePtr, BSIM4v5gNodePrime, BSIM4v5gNodeExt); - TSTALLOC(BSIM4v5GEdpPtr, BSIM4v5gNodeExt, BSIM4v5dNodePrime); - TSTALLOC(BSIM4v5GEspPtr, BSIM4v5gNodeExt, BSIM4v5sNodePrime); - TSTALLOC(BSIM4v5GEbpPtr, BSIM4v5gNodeExt, BSIM4v5bNodePrime); - - TSTALLOC(BSIM4v5GMdpPtr, BSIM4v5gNodeMid, BSIM4v5dNodePrime); - TSTALLOC(BSIM4v5GMgpPtr, BSIM4v5gNodeMid, BSIM4v5gNodePrime); - TSTALLOC(BSIM4v5GMgmPtr, BSIM4v5gNodeMid, BSIM4v5gNodeMid); - TSTALLOC(BSIM4v5GMgePtr, BSIM4v5gNodeMid, BSIM4v5gNodeExt); - TSTALLOC(BSIM4v5GMspPtr, BSIM4v5gNodeMid, BSIM4v5sNodePrime); - TSTALLOC(BSIM4v5GMbpPtr, BSIM4v5gNodeMid, BSIM4v5bNodePrime); - TSTALLOC(BSIM4v5DPgmPtr, BSIM4v5dNodePrime, BSIM4v5gNodeMid); - TSTALLOC(BSIM4v5GPgmPtr, BSIM4v5gNodePrime, BSIM4v5gNodeMid); - TSTALLOC(BSIM4v5GEgmPtr, BSIM4v5gNodeExt, BSIM4v5gNodeMid); - TSTALLOC(BSIM4v5SPgmPtr, BSIM4v5sNodePrime, BSIM4v5gNodeMid); - TSTALLOC(BSIM4v5BPgmPtr, BSIM4v5bNodePrime, BSIM4v5gNodeMid); - } - - if ((here->BSIM4v5rbodyMod ==1) || (here->BSIM4v5rbodyMod ==2)) - { TSTALLOC(BSIM4v5DPdbPtr, BSIM4v5dNodePrime, BSIM4v5dbNode); - TSTALLOC(BSIM4v5SPsbPtr, BSIM4v5sNodePrime, BSIM4v5sbNode); - - TSTALLOC(BSIM4v5DBdpPtr, BSIM4v5dbNode, BSIM4v5dNodePrime); - TSTALLOC(BSIM4v5DBdbPtr, BSIM4v5dbNode, BSIM4v5dbNode); - TSTALLOC(BSIM4v5DBbpPtr, BSIM4v5dbNode, BSIM4v5bNodePrime); - TSTALLOC(BSIM4v5DBbPtr, BSIM4v5dbNode, BSIM4v5bNode); - - TSTALLOC(BSIM4v5BPdbPtr, BSIM4v5bNodePrime, BSIM4v5dbNode); - TSTALLOC(BSIM4v5BPbPtr, BSIM4v5bNodePrime, BSIM4v5bNode); - TSTALLOC(BSIM4v5BPsbPtr, BSIM4v5bNodePrime, BSIM4v5sbNode); - - TSTALLOC(BSIM4v5SBspPtr, BSIM4v5sbNode, BSIM4v5sNodePrime); - TSTALLOC(BSIM4v5SBbpPtr, BSIM4v5sbNode, BSIM4v5bNodePrime); - TSTALLOC(BSIM4v5SBbPtr, BSIM4v5sbNode, BSIM4v5bNode); - TSTALLOC(BSIM4v5SBsbPtr, BSIM4v5sbNode, BSIM4v5sbNode); - - TSTALLOC(BSIM4v5BdbPtr, BSIM4v5bNode, BSIM4v5dbNode); - TSTALLOC(BSIM4v5BbpPtr, BSIM4v5bNode, BSIM4v5bNodePrime); - TSTALLOC(BSIM4v5BsbPtr, BSIM4v5bNode, BSIM4v5sbNode); - TSTALLOC(BSIM4v5BbPtr, BSIM4v5bNode, BSIM4v5bNode); - } - - if (model->BSIM4v5rdsMod) - { TSTALLOC(BSIM4v5DgpPtr, BSIM4v5dNode, BSIM4v5gNodePrime); - TSTALLOC(BSIM4v5DspPtr, BSIM4v5dNode, BSIM4v5sNodePrime); - TSTALLOC(BSIM4v5DbpPtr, BSIM4v5dNode, BSIM4v5bNodePrime); - TSTALLOC(BSIM4v5SdpPtr, BSIM4v5sNode, BSIM4v5dNodePrime); - TSTALLOC(BSIM4v5SgpPtr, BSIM4v5sNode, BSIM4v5gNodePrime); - TSTALLOC(BSIM4v5SbpPtr, BSIM4v5sNode, BSIM4v5bNodePrime); - } - } - } - -#ifdef USE_OMP - InstCount = 0; - model = (BSIM4v5model*)inModel; - /* loop through all the BSIM4v6 device models - to count the number of instances */ - - for (; model != NULL; model = BSIM4v5nextModel(model)) - { - /* loop through all the instances of the model */ - for (here = BSIM4v5instances(model); here != NULL; - here = BSIM4v5nextInstance(here)) - { - InstCount++; - } - model->BSIM4v5InstCount = 0; - model->BSIM4v5InstanceArray = NULL; - } - InstArray = TMALLOC(BSIM4v5instance*, InstCount); - model = (BSIM4v5model*)inModel; - /* store this in the first model only */ - model->BSIM4v5InstCount = InstCount; - model->BSIM4v5InstanceArray = InstArray; - idx = 0; - for (; model != NULL; model = BSIM4v5nextModel(model)) - { - /* loop through all the instances of the model */ - for (here = BSIM4v5instances(model); here != NULL; - here = BSIM4v5nextInstance(here)) - { - InstArray[idx] = here; - idx++; - } - } -#endif - - return(OK); -} - -int -BSIM4v5unsetup( - GENmodel *inModel, - CKTcircuit *ckt) -{ -#ifndef HAS_BATCHSIM - BSIM4v5model *model; - BSIM4v5instance *here; - -#ifdef USE_OMP - model = (BSIM4v5model*)inModel; - tfree(model->BSIM4v5InstanceArray); -#endif - - for (model = (BSIM4v5model *)inModel; model != NULL; - model = BSIM4v5nextModel(model)) - { - for (here = BSIM4v5instances(model); here != NULL; - here=BSIM4v5nextInstance(here)) - { - if (here->BSIM4v5qNode > 0) - CKTdltNNum(ckt, here->BSIM4v5qNode); - here->BSIM4v5qNode = 0; - - if (here->BSIM4v5sbNode > 0 && - here->BSIM4v5sbNode != here->BSIM4v5bNode) - CKTdltNNum(ckt, here->BSIM4v5sbNode); - here->BSIM4v5sbNode = 0; - - if (here->BSIM4v5bNodePrime > 0 && - here->BSIM4v5bNodePrime != here->BSIM4v5bNode) - CKTdltNNum(ckt, here->BSIM4v5bNodePrime); - here->BSIM4v5bNodePrime = 0; - - if (here->BSIM4v5dbNode > 0 && - here->BSIM4v5dbNode != here->BSIM4v5bNode) - CKTdltNNum(ckt, here->BSIM4v5dbNode); - here->BSIM4v5dbNode = 0; - - if (here->BSIM4v5gNodeMid > 0 && - here->BSIM4v5gNodeMid != here->BSIM4v5gNodeExt) - CKTdltNNum(ckt, here->BSIM4v5gNodeMid); - here->BSIM4v5gNodeMid = 0; - - if (here->BSIM4v5gNodePrime > 0 && - here->BSIM4v5gNodePrime != here->BSIM4v5gNodeExt) - CKTdltNNum(ckt, here->BSIM4v5gNodePrime); - here->BSIM4v5gNodePrime = 0; - - if (here->BSIM4v5sNodePrime > 0 - && here->BSIM4v5sNodePrime != here->BSIM4v5sNode) - CKTdltNNum(ckt, here->BSIM4v5sNodePrime); - here->BSIM4v5sNodePrime = 0; - - if (here->BSIM4v5dNodePrime > 0 - && here->BSIM4v5dNodePrime != here->BSIM4v5dNode) - CKTdltNNum(ckt, here->BSIM4v5dNodePrime); - here->BSIM4v5dNodePrime = 0; - } - } -#endif - return OK; -} diff --git a/src/spicelib/devices/bsim4v5/b4v5soachk.c b/src/spicelib/devices/bsim4v5/b4v5soachk.c deleted file mode 100644 index 43cfbdb88..000000000 --- a/src/spicelib/devices/bsim4v5/b4v5soachk.c +++ /dev/null @@ -1,341 +0,0 @@ -/********** -Copyright 2013 Dietmar Warning. All rights reserved. -Author: 2013 Dietmar Warning -**********/ - -#include "ngspice/ngspice.h" -#include "ngspice/cktdefs.h" -#include "bsim4v5def.h" -#include "ngspice/trandefs.h" -#include "ngspice/sperror.h" -#include "ngspice/suffix.h" -#include "ngspice/cpdefs.h" - - -int -BSIM4v5soaCheck(CKTcircuit *ckt, GENmodel *inModel) -{ - BSIM4v5model *model = (BSIM4v5model *) inModel; - BSIM4v5instance *here; - double vgs, vgd, vgb, vds, vbs, vbd; /* actual mos voltages */ - int maxwarns; - static int warns_vgs = 0, warns_vgd = 0, warns_vgb = 0, warns_vds = 0, warns_vbs = 0, warns_vbd = 0; - - if (!ckt) { - warns_vgs = 0; - warns_vgd = 0; - warns_vgb = 0; - warns_vds = 0; - warns_vbs = 0; - warns_vbd = 0; - return OK; - } - - maxwarns = ckt->CKTsoaMaxWarns; - - for (; model; model = BSIM4v5nextModel(model)) { - - for (here = BSIM4v5instances(model); here; here = BSIM4v5nextInstance(here)) { - - vgs = ckt->CKTrhsOld [here->BSIM4v5gNodePrime] - - ckt->CKTrhsOld [here->BSIM4v5sNodePrime]; - - vgd = ckt->CKTrhsOld [here->BSIM4v5gNodePrime] - - ckt->CKTrhsOld [here->BSIM4v5dNodePrime]; - - vgb = ckt->CKTrhsOld [here->BSIM4v5gNodePrime] - - ckt->CKTrhsOld [here->BSIM4v5bNodePrime]; - - vds = ckt->CKTrhsOld [here->BSIM4v5dNodePrime] - - ckt->CKTrhsOld [here->BSIM4v5sNodePrime]; - - vbs = ckt->CKTrhsOld [here->BSIM4v5bNodePrime] - - ckt->CKTrhsOld [here->BSIM4v5sNodePrime]; - - vbd = ckt->CKTrhsOld [here->BSIM4v5bNodePrime] - - ckt->CKTrhsOld [here->BSIM4v5dNodePrime]; - - if (!model->BSIM4v5vgsrMaxGiven) { - if (fabs(vgs) > model->BSIM4v5vgsMax) - if (warns_vgs < maxwarns) { - soa_printf(ckt, (GENinstance*) here, - "Vgs=%g has exceeded Vgs_max=%g\n", - vgs, model->BSIM4v5vgsMax); - warns_vgs++; - } - if (!model->BSIM4v5vgbMaxGiven) { - if (fabs(vgb) > model->BSIM4v5vgsMax) - if (warns_vgb < maxwarns) { - soa_printf(ckt, (GENinstance*) here, - "Vgb=%g has exceeded Vgs_max=%g\n", - vgb, model->BSIM4v5vgsMax); - warns_vgb++; - } - } else { - if (fabs(vgb) > model->BSIM4v5vgbMax) - if (warns_vgb < maxwarns) { - soa_printf(ckt, (GENinstance*) here, - "Vgb=%g has exceeded Vgb_max=%g\n", - vgb, model->BSIM4v5vgbMax); - warns_vgb++; - } - } - } else { - if (model->BSIM4v5type > 0) { - if (vgs > model->BSIM4v5vgsMax) - if (warns_vgs < maxwarns) { - soa_printf(ckt, (GENinstance*) here, - "Vgs=%g has exceeded Vgs_max=%g\n", - vgs, model->BSIM4v5vgsMax); - warns_vgs++; - } - if (-1*vgs > model->BSIM4v5vgsrMax) - if (warns_vgs < maxwarns) { - soa_printf(ckt, (GENinstance*) here, - "Vgs=%g has exceeded Vgsr_max=%g\n", - vgs, model->BSIM4v5vgsrMax); - warns_vgs++; - } - } else { - if (vgs > model->BSIM4v5vgsrMax) - if (warns_vgs < maxwarns) { - soa_printf(ckt, (GENinstance*) here, - "Vgs=%g has exceeded Vgsr_max=%g\n", - vgs, model->BSIM4v5vgsrMax); - warns_vgs++; - } - if (-1*vgs > model->BSIM4v5vgsMax) - if (warns_vgs < maxwarns) { - soa_printf(ckt, (GENinstance*) here, - "Vgs=%g has exceeded Vgs_max=%g\n", - vgs, model->BSIM4v5vgsMax); - warns_vgs++; - } - } - } - - if (!model->BSIM4v5vgdrMaxGiven) { - if (fabs(vgd) > model->BSIM4v5vgdMax) - if (warns_vgd < maxwarns) { - soa_printf(ckt, (GENinstance*) here, - "Vgd=%g has exceeded Vgd_max=%g\n", - vgd, model->BSIM4v5vgdMax); - warns_vgd++; - } - } else { - if (model->BSIM4v5type > 0) { - if (vgd > model->BSIM4v5vgdMax) - if (warns_vgd < maxwarns) { - soa_printf(ckt, (GENinstance*) here, - "Vgd=%g has exceeded Vgd_max=%g\n", - vgd, model->BSIM4v5vgdMax); - warns_vgd++; - } - if (-1*vgd > model->BSIM4v5vgdrMax) - if (warns_vgd < maxwarns) { - soa_printf(ckt, (GENinstance*) here, - "Vgd=%g has exceeded Vgdr_max=%g\n", - vgd, model->BSIM4v5vgdrMax); - warns_vgd++; - } - } else { - if (vgd > model->BSIM4v5vgdrMax) - if (warns_vgd < maxwarns) { - soa_printf(ckt, (GENinstance*) here, - "Vgd=%g has exceeded Vgdr_max=%g\n", - vgd, model->BSIM4v5vgdrMax); - warns_vgd++; - } - if (-1*vgd > model->BSIM4v5vgdMax) - if (warns_vgd < maxwarns) { - soa_printf(ckt, (GENinstance*) here, - "Vgd=%g has exceeded Vgd_max=%g\n", - vgd, model->BSIM4v5vgdMax); - warns_vgd++; - } - } - } - - if (fabs(vds) > model->BSIM4v5vdsMax) - if (warns_vds < maxwarns) { - soa_printf(ckt, (GENinstance*) here, - "Vds=%g has exceeded Vds_max=%g\n", - vds, model->BSIM4v5vdsMax); - warns_vds++; - } - - if (!model->BSIM4v5vgbrMaxGiven) { - if (fabs(vgb) > model->BSIM4v5vgbMax) - if (warns_vgb < maxwarns) { - soa_printf(ckt, (GENinstance*) here, - "Vgb=%g has exceeded Vgb_max=%g\n", - vgb, model->BSIM4v5vgbMax); - warns_vgb++; - } - } else { - if (model->BSIM4v5type > 0) { - if (vgb > model->BSIM4v5vgbMax) - if (warns_vgb < maxwarns) { - soa_printf(ckt, (GENinstance*) here, - "Vgb=%g has exceeded Vgb_max=%g\n", - vgb, model->BSIM4v5vgbMax); - warns_vgb++; - } - if (-1*vgb > model->BSIM4v5vgbrMax) - if (warns_vgb < maxwarns) { - soa_printf(ckt, (GENinstance*) here, - "Vgb=%g has exceeded Vgbr_max=%g\n", - vgb, model->BSIM4v5vgbrMax); - warns_vgb++; - } - } else { - if (vgb > model->BSIM4v5vgbrMax) - if (warns_vgb < maxwarns) { - soa_printf(ckt, (GENinstance*) here, - "Vgb=%g has exceeded Vgbr_max=%g\n", - vgb, model->BSIM4v5vgbrMax); - warns_vgb++; - } - if (-1*vgb > model->BSIM4v5vgbMax) - if (warns_vgb < maxwarns) { - soa_printf(ckt, (GENinstance*) here, - "Vgb=%g has exceeded Vgb_max=%g\n", - vgb, model->BSIM4v5vgbMax); - warns_vgb++; - } - } - } - - if (!model->BSIM4v5vbsrMaxGiven) { - if (!model->BSIM4v5vbsMaxGiven) { - if (fabs(vbs) > model->BSIM4v5vbdMax) - if (warns_vbs < maxwarns) { - soa_printf(ckt, (GENinstance*) here, - "Vbs=%g has exceeded Vbd_max=%g\n", - vbs, model->BSIM4v5vbdMax); - warns_vbs++; - } - } else { - if (fabs(vbs) > model->BSIM4v5vbsMax) - if (warns_vbs < maxwarns) { - soa_printf(ckt, (GENinstance*) here, - "Vbs=%g has exceeded Vbs_max=%g\n", - vbs, model->BSIM4v5vbsMax); - warns_vbs++; - } - } - } else { - if (!model->BSIM4v5vbsMaxGiven) { - if (model->BSIM4v5type > 0) { - if (vbs > model->BSIM4v5vbdMax) - if (warns_vbs < maxwarns) { - soa_printf(ckt, (GENinstance*) here, - "Vbs=%g has exceeded Vbd_max=%g\n", - vbs, model->BSIM4v5vbdMax); - warns_vbs++; - } - if (-1*vbs > model->BSIM4v5vbsrMax) - if (warns_vbs < maxwarns) { - soa_printf(ckt, (GENinstance*) here, - "Vbs=%g has exceeded Vbsr_max=%g\n", - vbs, model->BSIM4v5vbsrMax); - warns_vbs++; - } - } else { - if (vbs > model->BSIM4v5vbsrMax) - if (warns_vbs < maxwarns) { - soa_printf(ckt, (GENinstance*) here, - "Vbs=%g has exceeded Vbsr_max=%g\n", - vbs, model->BSIM4v5vbsrMax); - warns_vbs++; - } - if (-1*vbs > model->BSIM4v5vbdMax) - if (warns_vbs < maxwarns) { - soa_printf(ckt, (GENinstance*) here, - "Vbs=%g has exceeded Vbd_max=%g\n", - vbs, model->BSIM4v5vbdMax); - warns_vbs++; - } - } - } else { - if (model->BSIM4v5type > 0) { - if (vbs > model->BSIM4v5vbsMax) - if (warns_vbs < maxwarns) { - soa_printf(ckt, (GENinstance*) here, - "Vbs=%g has exceeded Vbs_max=%g\n", - vbs, model->BSIM4v5vbsMax); - warns_vbs++; - } - if (-1*vbs > model->BSIM4v5vbsrMax) - if (warns_vbs < maxwarns) { - soa_printf(ckt, (GENinstance*) here, - "Vbs=%g has exceeded Vbsr_max=%g\n", - vbs, model->BSIM4v5vbsrMax); - warns_vbs++; - } - } else { - if (vbs > model->BSIM4v5vbsrMax) - if (warns_vbs < maxwarns) { - soa_printf(ckt, (GENinstance*) here, - "Vbs=%g has exceeded Vbsr_max=%g\n", - vbs, model->BSIM4v5vbsrMax); - warns_vbs++; - } - if (-1*vbs > model->BSIM4v5vbsMax) - if (warns_vbs < maxwarns) { - soa_printf(ckt, (GENinstance*) here, - "Vbs=%g has exceeded Vbs_max=%g\n", - vbs, model->BSIM4v5vbsMax); - warns_vbs++; - } - } - } - } - - if (!model->BSIM4v5vbdrMaxGiven) { - if (fabs(vbd) > model->BSIM4v5vbdMax) - if (warns_vbd < maxwarns) { - soa_printf(ckt, (GENinstance*) here, - "Vbd=%g has exceeded Vbd_max=%g\n", - vbd, model->BSIM4v5vbdMax); - warns_vbd++; - } - } else { - if (model->BSIM4v5type > 0) { - if (vbd > model->BSIM4v5vbdMax) - if (warns_vbd < maxwarns) { - soa_printf(ckt, (GENinstance*) here, - "Vbd=%g has exceeded Vbd_max=%g\n", - vbd, model->BSIM4v5vbdMax); - warns_vbd++; - } - if (-1*vbd > model->BSIM4v5vbdrMax) - if (warns_vbd < maxwarns) { - soa_printf(ckt, (GENinstance*) here, - "Vbd=%g has exceeded Vbdr_max=%g\n", - vbd, model->BSIM4v5vbdrMax); - warns_vbd++; - } - } else { - if (vbd > model->BSIM4v5vbdrMax) - if (warns_vbd < maxwarns) { - soa_printf(ckt, (GENinstance*) here, - "Vbd=%g has exceeded Vbdr_max=%g\n", - vbd, model->BSIM4v5vbdrMax); - warns_vbd++; - } - if (-1*vbd > model->BSIM4v5vbdMax) - if (warns_vbd < maxwarns) { - soa_printf(ckt, (GENinstance*) here, - "Vbd=%g has exceeded Vbd_max=%g\n", - vbd, model->BSIM4v5vbdMax); - warns_vbd++; - } - } - } - - } - } - - return OK; -} diff --git a/src/spicelib/devices/bsim4v5/b4v5temp.c b/src/spicelib/devices/bsim4v5/b4v5temp.c deleted file mode 100644 index 5b9b6bbde..000000000 --- a/src/spicelib/devices/bsim4v5/b4v5temp.c +++ /dev/null @@ -1,1831 +0,0 @@ -/**** BSIM4.5.0 Released by Xuemei (Jane) Xi 07/29/2005 ****/ - -/********** - * Copyright 2005 Regents of the University of California. All rights reserved. - * File: b4temp.c of BSIM4.5.0. - * Author: 2000 Weidong Liu - * Authors: 2001- Xuemei Xi, Mohan Dunga, Ali Niknejad, Chenming Hu. - * Project Director: Prof. Chenming Hu. - * Modified by Xuemei Xi, 04/06/2001. - * Modified by Xuemei Xi, 10/05/2001. - * Modified by Xuemei Xi, 11/15/2002. - * Modified by Xuemei Xi, 05/09/2003. - * Modified by Xuemei Xi, 03/04/2004. - * Modified by Xuemei Xi, Mohan Dunga, 07/29/2005. - **********/ - -#include "ngspice/ngspice.h" -#include "ngspice/smpdefs.h" -#include "ngspice/cktdefs.h" -#include "bsim4v5def.h" -#include "ngspice/const.h" -#include "ngspice/sperror.h" -#include "ngspice/suffix.h" - -#define Kb 1.3806226e-23 -#define KboQ 8.617087e-5 -#define EPS0 8.85418e-12 -#define EPSSI 1.03594e-10 -#define PI 3.141592654 -#define MAX_EXP 5.834617425e14 -#define MIN_EXP 1.713908431e-15 -#define EXP_THRESHOLD 34.0 -#define Charge_q 1.60219e-19 -#define DELTA 1.0E-9 -#define DEXP(A,B) { \ - if (A > EXP_THRESHOLD) { \ - B = MAX_EXP*(1.0+(A)-EXP_THRESHOLD); \ - } else if (A < -EXP_THRESHOLD) { \ - B = MIN_EXP; \ - } else { \ - B = exp(A); \ - } \ - } - - - -static int -BSIM4v5DioIjthVjmEval( -double Nvtm, double Ijth, double Isb, double XExpBV, -double *Vjm) -{ -double Tb, Tc, EVjmovNv; - - Tc = XExpBV; - Tb = 1.0 + Ijth / Isb - Tc; - EVjmovNv = 0.5 * (Tb + sqrt(Tb * Tb + 4.0 * Tc)); - *Vjm = Nvtm * log(EVjmovNv); - -return 0; -} - - -int -BSIM4v5temp( -GENmodel *inModel, -CKTcircuit *ckt) -{ -BSIM4v5model *model = (BSIM4v5model*) inModel; -BSIM4v5instance *here; -struct bsim4v5SizeDependParam *pSizeDependParamKnot, *pLastKnot, *pParam = NULL; -double tmp, tmp1, tmp2, Eg, Eg0, ni; -double T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, Lnew=0.0, Wnew; -double delTemp, Temp, TRatio, Inv_L, Inv_W, Inv_LW, Vtm0, Tnom; -double dumPs, dumPd, dumAs, dumAd, PowWeffWr; -double DMCGeff, DMCIeff, DMDGeff; -double Nvtms, Nvtmd, SourceSatCurrent, DrainSatCurrent; -double T10; -double Inv_saref, Inv_sbref, Inv_sa, Inv_sb, rho, Ldrn, dvth0_lod; -double W_tmp, Inv_ODeff, OD_offset, dk2_lod, deta0_lod; -double lnl, lnw, lnnf, rbpbx, rbpby, rbsbx, rbsby, rbdbx, rbdby,bodymode; -double kvsat, wlod, sceff, Wdrn; - -int Size_Not_Found, i; - - /* loop through all the BSIM4v5 device models */ - for (; model != NULL; model = BSIM4v5nextModel(model)) - { Temp = ckt->CKTtemp; - if (model->BSIM4v5SbulkJctPotential < 0.1) - { model->BSIM4v5SbulkJctPotential = 0.1; - fprintf(stderr, "Given pbs is less than 0.1. Pbs is set to 0.1.\n"); - } - if (model->BSIM4v5SsidewallJctPotential < 0.1) - { model->BSIM4v5SsidewallJctPotential = 0.1; - fprintf(stderr, "Given pbsws is less than 0.1. Pbsws is set to 0.1.\n"); - } - if (model->BSIM4v5SGatesidewallJctPotential < 0.1) - { model->BSIM4v5SGatesidewallJctPotential = 0.1; - fprintf(stderr, "Given pbswgs is less than 0.1. Pbswgs is set to 0.1.\n"); - } - - if (model->BSIM4v5DbulkJctPotential < 0.1) - { model->BSIM4v5DbulkJctPotential = 0.1; - fprintf(stderr, "Given pbd is less than 0.1. Pbd is set to 0.1.\n"); - } - if (model->BSIM4v5DsidewallJctPotential < 0.1) - { model->BSIM4v5DsidewallJctPotential = 0.1; - fprintf(stderr, "Given pbswd is less than 0.1. Pbswd is set to 0.1.\n"); - } - if (model->BSIM4v5DGatesidewallJctPotential < 0.1) - { model->BSIM4v5DGatesidewallJctPotential = 0.1; - fprintf(stderr, "Given pbswgd is less than 0.1. Pbswgd is set to 0.1.\n"); - } - - if ((model->BSIM4v5toxeGiven) && (model->BSIM4v5toxpGiven) && (model->BSIM4v5dtoxGiven) - && (model->BSIM4v5toxe != (model->BSIM4v5toxp + model->BSIM4v5dtox))) - printf("Warning: toxe, toxp and dtox all given and toxe != toxp + dtox; dtox ignored.\n"); - else if ((model->BSIM4v5toxeGiven) && (!model->BSIM4v5toxpGiven)) - model->BSIM4v5toxp = model->BSIM4v5toxe - model->BSIM4v5dtox; - else if ((!model->BSIM4v5toxeGiven) && (model->BSIM4v5toxpGiven)) - model->BSIM4v5toxe = model->BSIM4v5toxp + model->BSIM4v5dtox; - - model->BSIM4v5coxe = model->BSIM4v5epsrox * EPS0 / model->BSIM4v5toxe; - model->BSIM4v5coxp = model->BSIM4v5epsrox * EPS0 / model->BSIM4v5toxp; - - if (!model->BSIM4v5cgdoGiven) - { if (model->BSIM4v5dlcGiven && (model->BSIM4v5dlc > 0.0)) - model->BSIM4v5cgdo = model->BSIM4v5dlc * model->BSIM4v5coxe - - model->BSIM4v5cgdl ; - else - model->BSIM4v5cgdo = 0.6 * model->BSIM4v5xj * model->BSIM4v5coxe; - } - if (!model->BSIM4v5cgsoGiven) - { if (model->BSIM4v5dlcGiven && (model->BSIM4v5dlc > 0.0)) - model->BSIM4v5cgso = model->BSIM4v5dlc * model->BSIM4v5coxe - - model->BSIM4v5cgsl ; - else - model->BSIM4v5cgso = 0.6 * model->BSIM4v5xj * model->BSIM4v5coxe; - } - if (!model->BSIM4v5cgboGiven) - model->BSIM4v5cgbo = 2.0 * model->BSIM4v5dwc * model->BSIM4v5coxe; - - struct bsim4v5SizeDependParam *p = model->pSizeDependParamKnot; - while (p) { - struct bsim4v5SizeDependParam *next_p = p->pNext; - FREE(p); - p = next_p; - } - model->pSizeDependParamKnot = NULL; - pLastKnot = NULL; - - Tnom = model->BSIM4v5tnom; - TRatio = Temp / Tnom; - - model->BSIM4v5vcrit = CONSTvt0 * log(CONSTvt0 / (CONSTroot2 * 1.0e-14)); - model->BSIM4v5factor1 = sqrt(EPSSI / (model->BSIM4v5epsrox * EPS0) - * model->BSIM4v5toxe); - - Vtm0 = model->BSIM4v5vtm0 = KboQ * Tnom; - Eg0 = 1.16 - 7.02e-4 * Tnom * Tnom / (Tnom + 1108.0); - ni = 1.45e10 * (Tnom / 300.15) * sqrt(Tnom / 300.15) - * exp(21.5565981 - Eg0 / (2.0 * Vtm0)); - - model->BSIM4v5vtm = KboQ * Temp; - Eg = 1.16 - 7.02e-4 * Temp * Temp / (Temp + 1108.0); - if (Temp != Tnom) - { T0 = Eg0 / Vtm0 - Eg / model->BSIM4v5vtm; - T1 = log(Temp / Tnom); - T2 = T0 + model->BSIM4v5SjctTempExponent * T1; - T3 = exp(T2 / model->BSIM4v5SjctEmissionCoeff); - model->BSIM4v5SjctTempSatCurDensity = model->BSIM4v5SjctSatCurDensity - * T3; - model->BSIM4v5SjctSidewallTempSatCurDensity - = model->BSIM4v5SjctSidewallSatCurDensity * T3; - model->BSIM4v5SjctGateSidewallTempSatCurDensity - = model->BSIM4v5SjctGateSidewallSatCurDensity * T3; - - T2 = T0 + model->BSIM4v5DjctTempExponent * T1; - T3 = exp(T2 / model->BSIM4v5DjctEmissionCoeff); - model->BSIM4v5DjctTempSatCurDensity = model->BSIM4v5DjctSatCurDensity - * T3; - model->BSIM4v5DjctSidewallTempSatCurDensity - = model->BSIM4v5DjctSidewallSatCurDensity * T3; - model->BSIM4v5DjctGateSidewallTempSatCurDensity - = model->BSIM4v5DjctGateSidewallSatCurDensity * T3; - } - else - { model->BSIM4v5SjctTempSatCurDensity = model->BSIM4v5SjctSatCurDensity; - model->BSIM4v5SjctSidewallTempSatCurDensity - = model->BSIM4v5SjctSidewallSatCurDensity; - model->BSIM4v5SjctGateSidewallTempSatCurDensity - = model->BSIM4v5SjctGateSidewallSatCurDensity; - model->BSIM4v5DjctTempSatCurDensity = model->BSIM4v5DjctSatCurDensity; - model->BSIM4v5DjctSidewallTempSatCurDensity - = model->BSIM4v5DjctSidewallSatCurDensity; - model->BSIM4v5DjctGateSidewallTempSatCurDensity - = model->BSIM4v5DjctGateSidewallSatCurDensity; - } - - if (model->BSIM4v5SjctTempSatCurDensity < 0.0) - model->BSIM4v5SjctTempSatCurDensity = 0.0; - if (model->BSIM4v5SjctSidewallTempSatCurDensity < 0.0) - model->BSIM4v5SjctSidewallTempSatCurDensity = 0.0; - if (model->BSIM4v5SjctGateSidewallTempSatCurDensity < 0.0) - model->BSIM4v5SjctGateSidewallTempSatCurDensity = 0.0; - if (model->BSIM4v5DjctTempSatCurDensity < 0.0) - model->BSIM4v5DjctTempSatCurDensity = 0.0; - if (model->BSIM4v5DjctSidewallTempSatCurDensity < 0.0) - model->BSIM4v5DjctSidewallTempSatCurDensity = 0.0; - if (model->BSIM4v5DjctGateSidewallTempSatCurDensity < 0.0) - model->BSIM4v5DjctGateSidewallTempSatCurDensity = 0.0; - - /* Temperature dependence of D/B and S/B diode capacitance begins */ - delTemp = ckt->CKTtemp - model->BSIM4v5tnom; - T0 = model->BSIM4v5tcj * delTemp; - if (T0 >= -1.0) - { model->BSIM4v5SunitAreaTempJctCap = model->BSIM4v5SunitAreaJctCap *(1.0 + T0); /*bug_fix -JX */ - model->BSIM4v5DunitAreaTempJctCap = model->BSIM4v5DunitAreaJctCap *(1.0 + T0); - } - else - { if (model->BSIM4v5SunitAreaJctCap > 0.0) - { model->BSIM4v5SunitAreaTempJctCap = 0.0; - fprintf(stderr, "Temperature effect has caused cjs to be negative. Cjs is clamped to zero.\n"); - } - if (model->BSIM4v5DunitAreaJctCap > 0.0) - { model->BSIM4v5DunitAreaTempJctCap = 0.0; - fprintf(stderr, "Temperature effect has caused cjd to be negative. Cjd is clamped to zero.\n"); - } - } - T0 = model->BSIM4v5tcjsw * delTemp; - if (T0 >= -1.0) - { model->BSIM4v5SunitLengthSidewallTempJctCap = model->BSIM4v5SunitLengthSidewallJctCap *(1.0 + T0); - model->BSIM4v5DunitLengthSidewallTempJctCap = model->BSIM4v5DunitLengthSidewallJctCap *(1.0 + T0); - } - else - { if (model->BSIM4v5SunitLengthSidewallJctCap > 0.0) - { model->BSIM4v5SunitLengthSidewallTempJctCap = 0.0; - fprintf(stderr, "Temperature effect has caused cjsws to be negative. Cjsws is clamped to zero.\n"); - } - if (model->BSIM4v5DunitLengthSidewallJctCap > 0.0) - { model->BSIM4v5DunitLengthSidewallTempJctCap = 0.0; - fprintf(stderr, "Temperature effect has caused cjswd to be negative. Cjswd is clamped to zero.\n"); - } - } - T0 = model->BSIM4v5tcjswg * delTemp; - if (T0 >= -1.0) - { model->BSIM4v5SunitLengthGateSidewallTempJctCap = model->BSIM4v5SunitLengthGateSidewallJctCap *(1.0 + T0); - model->BSIM4v5DunitLengthGateSidewallTempJctCap = model->BSIM4v5DunitLengthGateSidewallJctCap *(1.0 + T0); - } - else - { if (model->BSIM4v5SunitLengthGateSidewallJctCap > 0.0) - { model->BSIM4v5SunitLengthGateSidewallTempJctCap = 0.0; - fprintf(stderr, "Temperature effect has caused cjswgs to be negative. Cjswgs is clamped to zero.\n"); - } - if (model->BSIM4v5DunitLengthGateSidewallJctCap > 0.0) - { model->BSIM4v5DunitLengthGateSidewallTempJctCap = 0.0; - fprintf(stderr, "Temperature effect has caused cjswgd to be negative. Cjswgd is clamped to zero.\n"); - } - } - - model->BSIM4v5PhiBS = model->BSIM4v5SbulkJctPotential - - model->BSIM4v5tpb * delTemp; - if (model->BSIM4v5PhiBS < 0.01) - { model->BSIM4v5PhiBS = 0.01; - fprintf(stderr, "Temperature effect has caused pbs to be less than 0.01. Pbs is clamped to 0.01.\n"); - } - model->BSIM4v5PhiBD = model->BSIM4v5DbulkJctPotential - - model->BSIM4v5tpb * delTemp; - if (model->BSIM4v5PhiBD < 0.01) - { model->BSIM4v5PhiBD = 0.01; - fprintf(stderr, "Temperature effect has caused pbd to be less than 0.01. Pbd is clamped to 0.01.\n"); - } - - model->BSIM4v5PhiBSWS = model->BSIM4v5SsidewallJctPotential - - model->BSIM4v5tpbsw * delTemp; - if (model->BSIM4v5PhiBSWS <= 0.01) - { model->BSIM4v5PhiBSWS = 0.01; - fprintf(stderr, "Temperature effect has caused pbsws to be less than 0.01. Pbsws is clamped to 0.01.\n"); - } - model->BSIM4v5PhiBSWD = model->BSIM4v5DsidewallJctPotential - - model->BSIM4v5tpbsw * delTemp; - if (model->BSIM4v5PhiBSWD <= 0.01) - { model->BSIM4v5PhiBSWD = 0.01; - fprintf(stderr, "Temperature effect has caused pbswd to be less than 0.01. Pbswd is clamped to 0.01.\n"); - } - - model->BSIM4v5PhiBSWGS = model->BSIM4v5SGatesidewallJctPotential - - model->BSIM4v5tpbswg * delTemp; - if (model->BSIM4v5PhiBSWGS <= 0.01) - { model->BSIM4v5PhiBSWGS = 0.01; - fprintf(stderr, "Temperature effect has caused pbswgs to be less than 0.01. Pbswgs is clamped to 0.01.\n"); - } - model->BSIM4v5PhiBSWGD = model->BSIM4v5DGatesidewallJctPotential - - model->BSIM4v5tpbswg * delTemp; - if (model->BSIM4v5PhiBSWGD <= 0.01) - { model->BSIM4v5PhiBSWGD = 0.01; - fprintf(stderr, "Temperature effect has caused pbswgd to be less than 0.01. Pbswgd is clamped to 0.01.\n"); - } /* End of junction capacitance */ - - - if (model->BSIM4v5ijthdfwd <= 0.0) - { model->BSIM4v5ijthdfwd = 0.1; - fprintf(stderr, "Ijthdfwd reset to %g.\n", model->BSIM4v5ijthdfwd); - } - if (model->BSIM4v5ijthsfwd <= 0.0) - { model->BSIM4v5ijthsfwd = 0.1; - fprintf(stderr, "Ijthsfwd reset to %g.\n", model->BSIM4v5ijthsfwd); - } - if (model->BSIM4v5ijthdrev <= 0.0) - { model->BSIM4v5ijthdrev = 0.1; - fprintf(stderr, "Ijthdrev reset to %g.\n", model->BSIM4v5ijthdrev); - } - if (model->BSIM4v5ijthsrev <= 0.0) - { model->BSIM4v5ijthsrev = 0.1; - fprintf(stderr, "Ijthsrev reset to %g.\n", model->BSIM4v5ijthsrev); - } - - if ((model->BSIM4v5xjbvd <= 0.0) && (model->BSIM4v5dioMod == 2)) - { model->BSIM4v5xjbvd = 1.0; - fprintf(stderr, "Xjbvd reset to %g.\n", model->BSIM4v5xjbvd); - } - else if ((model->BSIM4v5xjbvd < 0.0) && (model->BSIM4v5dioMod == 0)) - { model->BSIM4v5xjbvd = 1.0; - fprintf(stderr, "Xjbvd reset to %g.\n", model->BSIM4v5xjbvd); - } - - if (model->BSIM4v5bvd <= 0.0) - { model->BSIM4v5bvd = 10.0; - fprintf(stderr, "BVD reset to %g.\n", model->BSIM4v5bvd); - } - - if ((model->BSIM4v5xjbvs <= 0.0) && (model->BSIM4v5dioMod == 2)) - { model->BSIM4v5xjbvs = 1.0; - fprintf(stderr, "Xjbvs reset to %g.\n", model->BSIM4v5xjbvs); - } - else if ((model->BSIM4v5xjbvs < 0.0) && (model->BSIM4v5dioMod == 0)) - { model->BSIM4v5xjbvs = 1.0; - fprintf(stderr, "Xjbvs reset to %g.\n", model->BSIM4v5xjbvs); - } - - if (model->BSIM4v5bvs <= 0.0) - { model->BSIM4v5bvs = 10.0; - fprintf(stderr, "BVS reset to %g.\n", model->BSIM4v5bvs); - } - - - /* loop through all the instances of the model */ - for (here = BSIM4v5instances(model); here != NULL; - here = BSIM4v5nextInstance(here)) - { - pSizeDependParamKnot = model->pSizeDependParamKnot; - Size_Not_Found = 1; - while ((pSizeDependParamKnot != NULL) && Size_Not_Found) - { if ((here->BSIM4v5l == pSizeDependParamKnot->Length) - && (here->BSIM4v5w == pSizeDependParamKnot->Width) - && (here->BSIM4v5nf == pSizeDependParamKnot->NFinger)) - { Size_Not_Found = 0; - here->pParam = pSizeDependParamKnot; - pParam = here->pParam; /*bug-fix */ - } - else - { pLastKnot = pSizeDependParamKnot; - pSizeDependParamKnot = pSizeDependParamKnot->pNext; - } - } - - /* stress effect */ - Ldrn = here->BSIM4v5l; - Wdrn = here->BSIM4v5w / here->BSIM4v5nf; - - if (Size_Not_Found) - { pParam = TMALLOC(struct bsim4v5SizeDependParam, 1); - if (pLastKnot == NULL) - model->pSizeDependParamKnot = pParam; - else - pLastKnot->pNext = pParam; - pParam->pNext = NULL; - here->pParam = pParam; - - pParam->Length = here->BSIM4v5l; - pParam->Width = here->BSIM4v5w; - pParam->NFinger = here->BSIM4v5nf; - Lnew = here->BSIM4v5l + model->BSIM4v5xl ; - Wnew = here->BSIM4v5w / here->BSIM4v5nf + model->BSIM4v5xw; - - T0 = pow(Lnew, model->BSIM4v5Lln); - T1 = pow(Wnew, model->BSIM4v5Lwn); - tmp1 = model->BSIM4v5Ll / T0 + model->BSIM4v5Lw / T1 - + model->BSIM4v5Lwl / (T0 * T1); - pParam->BSIM4v5dl = model->BSIM4v5Lint + tmp1; - tmp2 = model->BSIM4v5Llc / T0 + model->BSIM4v5Lwc / T1 - + model->BSIM4v5Lwlc / (T0 * T1); - pParam->BSIM4v5dlc = model->BSIM4v5dlc + tmp2; - - T2 = pow(Lnew, model->BSIM4v5Wln); - T3 = pow(Wnew, model->BSIM4v5Wwn); - tmp1 = model->BSIM4v5Wl / T2 + model->BSIM4v5Ww / T3 - + model->BSIM4v5Wwl / (T2 * T3); - pParam->BSIM4v5dw = model->BSIM4v5Wint + tmp1; - tmp2 = model->BSIM4v5Wlc / T2 + model->BSIM4v5Wwc / T3 - + model->BSIM4v5Wwlc / (T2 * T3); - pParam->BSIM4v5dwc = model->BSIM4v5dwc + tmp2; - pParam->BSIM4v5dwj = model->BSIM4v5dwj + tmp2; - - pParam->BSIM4v5leff = Lnew - 2.0 * pParam->BSIM4v5dl; - if (pParam->BSIM4v5leff <= 0.0) - { - SPfrontEnd->IFerrorf (ERR_FATAL, - "BSIM4v5: mosfet %s, model %s: Effective channel length <= 0", - model->BSIM4v5modName, here->BSIM4v5name); - return(E_BADPARM); - } - - pParam->BSIM4v5weff = Wnew - 2.0 * pParam->BSIM4v5dw; - if (pParam->BSIM4v5weff <= 0.0) - { - SPfrontEnd->IFerrorf (ERR_FATAL, - "BSIM4v5: mosfet %s, model %s: Effective channel width <= 0", - model->BSIM4v5modName, here->BSIM4v5name); - return(E_BADPARM); - } - - pParam->BSIM4v5leffCV = Lnew - 2.0 * pParam->BSIM4v5dlc; - if (pParam->BSIM4v5leffCV <= 0.0) - { - SPfrontEnd->IFerrorf (ERR_FATAL, - "BSIM4v5: mosfet %s, model %s: Effective channel length for C-V <= 0", - model->BSIM4v5modName, here->BSIM4v5name); - return(E_BADPARM); - } - - pParam->BSIM4v5weffCV = Wnew - 2.0 * pParam->BSIM4v5dwc; - if (pParam->BSIM4v5weffCV <= 0.0) - { - SPfrontEnd->IFerrorf (ERR_FATAL, - "BSIM4v5: mosfet %s, model %s: Effective channel width for C-V <= 0", - model->BSIM4v5modName, here->BSIM4v5name); - return(E_BADPARM); - } - - pParam->BSIM4v5weffCJ = Wnew - 2.0 * pParam->BSIM4v5dwj; - if (pParam->BSIM4v5weffCJ <= 0.0) - { - SPfrontEnd->IFerrorf (ERR_FATAL, - "BSIM4v5: mosfet %s, model %s: Effective channel width for S/D junctions <= 0", - model->BSIM4v5modName, here->BSIM4v5name); - return(E_BADPARM); - } - - - if (model->BSIM4v5binUnit == 1) - { Inv_L = 1.0e-6 / pParam->BSIM4v5leff; - Inv_W = 1.0e-6 / pParam->BSIM4v5weff; - Inv_LW = 1.0e-12 / (pParam->BSIM4v5leff - * pParam->BSIM4v5weff); - } - else - { Inv_L = 1.0 / pParam->BSIM4v5leff; - Inv_W = 1.0 / pParam->BSIM4v5weff; - Inv_LW = 1.0 / (pParam->BSIM4v5leff - * pParam->BSIM4v5weff); - } - pParam->BSIM4v5cdsc = model->BSIM4v5cdsc - + model->BSIM4v5lcdsc * Inv_L - + model->BSIM4v5wcdsc * Inv_W - + model->BSIM4v5pcdsc * Inv_LW; - pParam->BSIM4v5cdscb = model->BSIM4v5cdscb - + model->BSIM4v5lcdscb * Inv_L - + model->BSIM4v5wcdscb * Inv_W - + model->BSIM4v5pcdscb * Inv_LW; - - pParam->BSIM4v5cdscd = model->BSIM4v5cdscd - + model->BSIM4v5lcdscd * Inv_L - + model->BSIM4v5wcdscd * Inv_W - + model->BSIM4v5pcdscd * Inv_LW; - - pParam->BSIM4v5cit = model->BSIM4v5cit - + model->BSIM4v5lcit * Inv_L - + model->BSIM4v5wcit * Inv_W - + model->BSIM4v5pcit * Inv_LW; - pParam->BSIM4v5nfactor = model->BSIM4v5nfactor - + model->BSIM4v5lnfactor * Inv_L - + model->BSIM4v5wnfactor * Inv_W - + model->BSIM4v5pnfactor * Inv_LW; - pParam->BSIM4v5xj = model->BSIM4v5xj - + model->BSIM4v5lxj * Inv_L - + model->BSIM4v5wxj * Inv_W - + model->BSIM4v5pxj * Inv_LW; - pParam->BSIM4v5vsat = model->BSIM4v5vsat - + model->BSIM4v5lvsat * Inv_L - + model->BSIM4v5wvsat * Inv_W - + model->BSIM4v5pvsat * Inv_LW; - pParam->BSIM4v5at = model->BSIM4v5at - + model->BSIM4v5lat * Inv_L - + model->BSIM4v5wat * Inv_W - + model->BSIM4v5pat * Inv_LW; - pParam->BSIM4v5a0 = model->BSIM4v5a0 - + model->BSIM4v5la0 * Inv_L - + model->BSIM4v5wa0 * Inv_W - + model->BSIM4v5pa0 * Inv_LW; - - pParam->BSIM4v5ags = model->BSIM4v5ags - + model->BSIM4v5lags * Inv_L - + model->BSIM4v5wags * Inv_W - + model->BSIM4v5pags * Inv_LW; - - pParam->BSIM4v5a1 = model->BSIM4v5a1 - + model->BSIM4v5la1 * Inv_L - + model->BSIM4v5wa1 * Inv_W - + model->BSIM4v5pa1 * Inv_LW; - pParam->BSIM4v5a2 = model->BSIM4v5a2 - + model->BSIM4v5la2 * Inv_L - + model->BSIM4v5wa2 * Inv_W - + model->BSIM4v5pa2 * Inv_LW; - pParam->BSIM4v5keta = model->BSIM4v5keta - + model->BSIM4v5lketa * Inv_L - + model->BSIM4v5wketa * Inv_W - + model->BSIM4v5pketa * Inv_LW; - pParam->BSIM4v5nsub = model->BSIM4v5nsub - + model->BSIM4v5lnsub * Inv_L - + model->BSIM4v5wnsub * Inv_W - + model->BSIM4v5pnsub * Inv_LW; - pParam->BSIM4v5ndep = model->BSIM4v5ndep - + model->BSIM4v5lndep * Inv_L - + model->BSIM4v5wndep * Inv_W - + model->BSIM4v5pndep * Inv_LW; - pParam->BSIM4v5nsd = model->BSIM4v5nsd - + model->BSIM4v5lnsd * Inv_L - + model->BSIM4v5wnsd * Inv_W - + model->BSIM4v5pnsd * Inv_LW; - pParam->BSIM4v5phin = model->BSIM4v5phin - + model->BSIM4v5lphin * Inv_L - + model->BSIM4v5wphin * Inv_W - + model->BSIM4v5pphin * Inv_LW; - pParam->BSIM4v5ngate = model->BSIM4v5ngate - + model->BSIM4v5lngate * Inv_L - + model->BSIM4v5wngate * Inv_W - + model->BSIM4v5pngate * Inv_LW; - pParam->BSIM4v5gamma1 = model->BSIM4v5gamma1 - + model->BSIM4v5lgamma1 * Inv_L - + model->BSIM4v5wgamma1 * Inv_W - + model->BSIM4v5pgamma1 * Inv_LW; - pParam->BSIM4v5gamma2 = model->BSIM4v5gamma2 - + model->BSIM4v5lgamma2 * Inv_L - + model->BSIM4v5wgamma2 * Inv_W - + model->BSIM4v5pgamma2 * Inv_LW; - pParam->BSIM4v5vbx = model->BSIM4v5vbx - + model->BSIM4v5lvbx * Inv_L - + model->BSIM4v5wvbx * Inv_W - + model->BSIM4v5pvbx * Inv_LW; - pParam->BSIM4v5vbm = model->BSIM4v5vbm - + model->BSIM4v5lvbm * Inv_L - + model->BSIM4v5wvbm * Inv_W - + model->BSIM4v5pvbm * Inv_LW; - pParam->BSIM4v5xt = model->BSIM4v5xt - + model->BSIM4v5lxt * Inv_L - + model->BSIM4v5wxt * Inv_W - + model->BSIM4v5pxt * Inv_LW; - pParam->BSIM4v5vfb = model->BSIM4v5vfb - + model->BSIM4v5lvfb * Inv_L - + model->BSIM4v5wvfb * Inv_W - + model->BSIM4v5pvfb * Inv_LW; - pParam->BSIM4v5k1 = model->BSIM4v5k1 - + model->BSIM4v5lk1 * Inv_L - + model->BSIM4v5wk1 * Inv_W - + model->BSIM4v5pk1 * Inv_LW; - pParam->BSIM4v5kt1 = model->BSIM4v5kt1 - + model->BSIM4v5lkt1 * Inv_L - + model->BSIM4v5wkt1 * Inv_W - + model->BSIM4v5pkt1 * Inv_LW; - pParam->BSIM4v5kt1l = model->BSIM4v5kt1l - + model->BSIM4v5lkt1l * Inv_L - + model->BSIM4v5wkt1l * Inv_W - + model->BSIM4v5pkt1l * Inv_LW; - pParam->BSIM4v5k2 = model->BSIM4v5k2 - + model->BSIM4v5lk2 * Inv_L - + model->BSIM4v5wk2 * Inv_W - + model->BSIM4v5pk2 * Inv_LW; - pParam->BSIM4v5kt2 = model->BSIM4v5kt2 - + model->BSIM4v5lkt2 * Inv_L - + model->BSIM4v5wkt2 * Inv_W - + model->BSIM4v5pkt2 * Inv_LW; - pParam->BSIM4v5k3 = model->BSIM4v5k3 - + model->BSIM4v5lk3 * Inv_L - + model->BSIM4v5wk3 * Inv_W - + model->BSIM4v5pk3 * Inv_LW; - pParam->BSIM4v5k3b = model->BSIM4v5k3b - + model->BSIM4v5lk3b * Inv_L - + model->BSIM4v5wk3b * Inv_W - + model->BSIM4v5pk3b * Inv_LW; - pParam->BSIM4v5w0 = model->BSIM4v5w0 - + model->BSIM4v5lw0 * Inv_L - + model->BSIM4v5ww0 * Inv_W - + model->BSIM4v5pw0 * Inv_LW; - pParam->BSIM4v5lpe0 = model->BSIM4v5lpe0 - + model->BSIM4v5llpe0 * Inv_L - + model->BSIM4v5wlpe0 * Inv_W - + model->BSIM4v5plpe0 * Inv_LW; - pParam->BSIM4v5lpeb = model->BSIM4v5lpeb - + model->BSIM4v5llpeb * Inv_L - + model->BSIM4v5wlpeb * Inv_W - + model->BSIM4v5plpeb * Inv_LW; - pParam->BSIM4v5dvtp0 = model->BSIM4v5dvtp0 - + model->BSIM4v5ldvtp0 * Inv_L - + model->BSIM4v5wdvtp0 * Inv_W - + model->BSIM4v5pdvtp0 * Inv_LW; - pParam->BSIM4v5dvtp1 = model->BSIM4v5dvtp1 - + model->BSIM4v5ldvtp1 * Inv_L - + model->BSIM4v5wdvtp1 * Inv_W - + model->BSIM4v5pdvtp1 * Inv_LW; - pParam->BSIM4v5dvt0 = model->BSIM4v5dvt0 - + model->BSIM4v5ldvt0 * Inv_L - + model->BSIM4v5wdvt0 * Inv_W - + model->BSIM4v5pdvt0 * Inv_LW; - pParam->BSIM4v5dvt1 = model->BSIM4v5dvt1 - + model->BSIM4v5ldvt1 * Inv_L - + model->BSIM4v5wdvt1 * Inv_W - + model->BSIM4v5pdvt1 * Inv_LW; - pParam->BSIM4v5dvt2 = model->BSIM4v5dvt2 - + model->BSIM4v5ldvt2 * Inv_L - + model->BSIM4v5wdvt2 * Inv_W - + model->BSIM4v5pdvt2 * Inv_LW; - pParam->BSIM4v5dvt0w = model->BSIM4v5dvt0w - + model->BSIM4v5ldvt0w * Inv_L - + model->BSIM4v5wdvt0w * Inv_W - + model->BSIM4v5pdvt0w * Inv_LW; - pParam->BSIM4v5dvt1w = model->BSIM4v5dvt1w - + model->BSIM4v5ldvt1w * Inv_L - + model->BSIM4v5wdvt1w * Inv_W - + model->BSIM4v5pdvt1w * Inv_LW; - pParam->BSIM4v5dvt2w = model->BSIM4v5dvt2w - + model->BSIM4v5ldvt2w * Inv_L - + model->BSIM4v5wdvt2w * Inv_W - + model->BSIM4v5pdvt2w * Inv_LW; - pParam->BSIM4v5drout = model->BSIM4v5drout - + model->BSIM4v5ldrout * Inv_L - + model->BSIM4v5wdrout * Inv_W - + model->BSIM4v5pdrout * Inv_LW; - pParam->BSIM4v5dsub = model->BSIM4v5dsub - + model->BSIM4v5ldsub * Inv_L - + model->BSIM4v5wdsub * Inv_W - + model->BSIM4v5pdsub * Inv_LW; - pParam->BSIM4v5vth0 = model->BSIM4v5vth0 - + model->BSIM4v5lvth0 * Inv_L - + model->BSIM4v5wvth0 * Inv_W - + model->BSIM4v5pvth0 * Inv_LW; - pParam->BSIM4v5ua = model->BSIM4v5ua - + model->BSIM4v5lua * Inv_L - + model->BSIM4v5wua * Inv_W - + model->BSIM4v5pua * Inv_LW; - pParam->BSIM4v5ua1 = model->BSIM4v5ua1 - + model->BSIM4v5lua1 * Inv_L - + model->BSIM4v5wua1 * Inv_W - + model->BSIM4v5pua1 * Inv_LW; - pParam->BSIM4v5ub = model->BSIM4v5ub - + model->BSIM4v5lub * Inv_L - + model->BSIM4v5wub * Inv_W - + model->BSIM4v5pub * Inv_LW; - pParam->BSIM4v5ub1 = model->BSIM4v5ub1 - + model->BSIM4v5lub1 * Inv_L - + model->BSIM4v5wub1 * Inv_W - + model->BSIM4v5pub1 * Inv_LW; - pParam->BSIM4v5uc = model->BSIM4v5uc - + model->BSIM4v5luc * Inv_L - + model->BSIM4v5wuc * Inv_W - + model->BSIM4v5puc * Inv_LW; - pParam->BSIM4v5uc1 = model->BSIM4v5uc1 - + model->BSIM4v5luc1 * Inv_L - + model->BSIM4v5wuc1 * Inv_W - + model->BSIM4v5puc1 * Inv_LW; - pParam->BSIM4v5ud = model->BSIM4v5ud - + model->BSIM4v5lud * Inv_L - + model->BSIM4v5wud * Inv_W - + model->BSIM4v5pud * Inv_LW; - pParam->BSIM4v5ud1 = model->BSIM4v5ud1 - + model->BSIM4v5lud1 * Inv_L - + model->BSIM4v5wud1 * Inv_W - + model->BSIM4v5pud1 * Inv_LW; - pParam->BSIM4v5up = model->BSIM4v5up - + model->BSIM4v5lup * Inv_L - + model->BSIM4v5wup * Inv_W - + model->BSIM4v5pup * Inv_LW; - pParam->BSIM4v5lp = model->BSIM4v5lp - + model->BSIM4v5llp * Inv_L - + model->BSIM4v5wlp * Inv_W - + model->BSIM4v5plp * Inv_LW; - pParam->BSIM4v5eu = model->BSIM4v5eu - + model->BSIM4v5leu * Inv_L - + model->BSIM4v5weu * Inv_W - + model->BSIM4v5peu * Inv_LW; - pParam->BSIM4v5u0 = model->BSIM4v5u0 - + model->BSIM4v5lu0 * Inv_L - + model->BSIM4v5wu0 * Inv_W - + model->BSIM4v5pu0 * Inv_LW; - pParam->BSIM4v5ute = model->BSIM4v5ute - + model->BSIM4v5lute * Inv_L - + model->BSIM4v5wute * Inv_W - + model->BSIM4v5pute * Inv_LW; - pParam->BSIM4v5voff = model->BSIM4v5voff - + model->BSIM4v5lvoff * Inv_L - + model->BSIM4v5wvoff * Inv_W - + model->BSIM4v5pvoff * Inv_LW; - pParam->BSIM4v5tvoff = model->BSIM4v5tvoff - + model->BSIM4v5ltvoff * Inv_L - + model->BSIM4v5wtvoff * Inv_W - + model->BSIM4v5ptvoff * Inv_LW; - pParam->BSIM4v5minv = model->BSIM4v5minv - + model->BSIM4v5lminv * Inv_L - + model->BSIM4v5wminv * Inv_W - + model->BSIM4v5pminv * Inv_LW; - pParam->BSIM4v5fprout = model->BSIM4v5fprout - + model->BSIM4v5lfprout * Inv_L - + model->BSIM4v5wfprout * Inv_W - + model->BSIM4v5pfprout * Inv_LW; - pParam->BSIM4v5pdits = model->BSIM4v5pdits - + model->BSIM4v5lpdits * Inv_L - + model->BSIM4v5wpdits * Inv_W - + model->BSIM4v5ppdits * Inv_LW; - pParam->BSIM4v5pditsd = model->BSIM4v5pditsd - + model->BSIM4v5lpditsd * Inv_L - + model->BSIM4v5wpditsd * Inv_W - + model->BSIM4v5ppditsd * Inv_LW; - pParam->BSIM4v5delta = model->BSIM4v5delta - + model->BSIM4v5ldelta * Inv_L - + model->BSIM4v5wdelta * Inv_W - + model->BSIM4v5pdelta * Inv_LW; - pParam->BSIM4v5rdsw = model->BSIM4v5rdsw - + model->BSIM4v5lrdsw * Inv_L - + model->BSIM4v5wrdsw * Inv_W - + model->BSIM4v5prdsw * Inv_LW; - pParam->BSIM4v5rdw = model->BSIM4v5rdw - + model->BSIM4v5lrdw * Inv_L - + model->BSIM4v5wrdw * Inv_W - + model->BSIM4v5prdw * Inv_LW; - pParam->BSIM4v5rsw = model->BSIM4v5rsw - + model->BSIM4v5lrsw * Inv_L - + model->BSIM4v5wrsw * Inv_W - + model->BSIM4v5prsw * Inv_LW; - pParam->BSIM4v5prwg = model->BSIM4v5prwg - + model->BSIM4v5lprwg * Inv_L - + model->BSIM4v5wprwg * Inv_W - + model->BSIM4v5pprwg * Inv_LW; - pParam->BSIM4v5prwb = model->BSIM4v5prwb - + model->BSIM4v5lprwb * Inv_L - + model->BSIM4v5wprwb * Inv_W - + model->BSIM4v5pprwb * Inv_LW; - pParam->BSIM4v5prt = model->BSIM4v5prt - + model->BSIM4v5lprt * Inv_L - + model->BSIM4v5wprt * Inv_W - + model->BSIM4v5pprt * Inv_LW; - pParam->BSIM4v5eta0 = model->BSIM4v5eta0 - + model->BSIM4v5leta0 * Inv_L - + model->BSIM4v5weta0 * Inv_W - + model->BSIM4v5peta0 * Inv_LW; - pParam->BSIM4v5etab = model->BSIM4v5etab - + model->BSIM4v5letab * Inv_L - + model->BSIM4v5wetab * Inv_W - + model->BSIM4v5petab * Inv_LW; - pParam->BSIM4v5pclm = model->BSIM4v5pclm - + model->BSIM4v5lpclm * Inv_L - + model->BSIM4v5wpclm * Inv_W - + model->BSIM4v5ppclm * Inv_LW; - pParam->BSIM4v5pdibl1 = model->BSIM4v5pdibl1 - + model->BSIM4v5lpdibl1 * Inv_L - + model->BSIM4v5wpdibl1 * Inv_W - + model->BSIM4v5ppdibl1 * Inv_LW; - pParam->BSIM4v5pdibl2 = model->BSIM4v5pdibl2 - + model->BSIM4v5lpdibl2 * Inv_L - + model->BSIM4v5wpdibl2 * Inv_W - + model->BSIM4v5ppdibl2 * Inv_LW; - pParam->BSIM4v5pdiblb = model->BSIM4v5pdiblb - + model->BSIM4v5lpdiblb * Inv_L - + model->BSIM4v5wpdiblb * Inv_W - + model->BSIM4v5ppdiblb * Inv_LW; - pParam->BSIM4v5pscbe1 = model->BSIM4v5pscbe1 - + model->BSIM4v5lpscbe1 * Inv_L - + model->BSIM4v5wpscbe1 * Inv_W - + model->BSIM4v5ppscbe1 * Inv_LW; - pParam->BSIM4v5pscbe2 = model->BSIM4v5pscbe2 - + model->BSIM4v5lpscbe2 * Inv_L - + model->BSIM4v5wpscbe2 * Inv_W - + model->BSIM4v5ppscbe2 * Inv_LW; - pParam->BSIM4v5pvag = model->BSIM4v5pvag - + model->BSIM4v5lpvag * Inv_L - + model->BSIM4v5wpvag * Inv_W - + model->BSIM4v5ppvag * Inv_LW; - pParam->BSIM4v5wr = model->BSIM4v5wr - + model->BSIM4v5lwr * Inv_L - + model->BSIM4v5wwr * Inv_W - + model->BSIM4v5pwr * Inv_LW; - pParam->BSIM4v5dwg = model->BSIM4v5dwg - + model->BSIM4v5ldwg * Inv_L - + model->BSIM4v5wdwg * Inv_W - + model->BSIM4v5pdwg * Inv_LW; - pParam->BSIM4v5dwb = model->BSIM4v5dwb - + model->BSIM4v5ldwb * Inv_L - + model->BSIM4v5wdwb * Inv_W - + model->BSIM4v5pdwb * Inv_LW; - pParam->BSIM4v5b0 = model->BSIM4v5b0 - + model->BSIM4v5lb0 * Inv_L - + model->BSIM4v5wb0 * Inv_W - + model->BSIM4v5pb0 * Inv_LW; - pParam->BSIM4v5b1 = model->BSIM4v5b1 - + model->BSIM4v5lb1 * Inv_L - + model->BSIM4v5wb1 * Inv_W - + model->BSIM4v5pb1 * Inv_LW; - pParam->BSIM4v5alpha0 = model->BSIM4v5alpha0 - + model->BSIM4v5lalpha0 * Inv_L - + model->BSIM4v5walpha0 * Inv_W - + model->BSIM4v5palpha0 * Inv_LW; - pParam->BSIM4v5alpha1 = model->BSIM4v5alpha1 - + model->BSIM4v5lalpha1 * Inv_L - + model->BSIM4v5walpha1 * Inv_W - + model->BSIM4v5palpha1 * Inv_LW; - pParam->BSIM4v5beta0 = model->BSIM4v5beta0 - + model->BSIM4v5lbeta0 * Inv_L - + model->BSIM4v5wbeta0 * Inv_W - + model->BSIM4v5pbeta0 * Inv_LW; - pParam->BSIM4v5agidl = model->BSIM4v5agidl - + model->BSIM4v5lagidl * Inv_L - + model->BSIM4v5wagidl * Inv_W - + model->BSIM4v5pagidl * Inv_LW; - pParam->BSIM4v5bgidl = model->BSIM4v5bgidl - + model->BSIM4v5lbgidl * Inv_L - + model->BSIM4v5wbgidl * Inv_W - + model->BSIM4v5pbgidl * Inv_LW; - pParam->BSIM4v5cgidl = model->BSIM4v5cgidl - + model->BSIM4v5lcgidl * Inv_L - + model->BSIM4v5wcgidl * Inv_W - + model->BSIM4v5pcgidl * Inv_LW; - pParam->BSIM4v5egidl = model->BSIM4v5egidl - + model->BSIM4v5legidl * Inv_L - + model->BSIM4v5wegidl * Inv_W - + model->BSIM4v5pegidl * Inv_LW; - pParam->BSIM4v5aigc = model->BSIM4v5aigc - + model->BSIM4v5laigc * Inv_L - + model->BSIM4v5waigc * Inv_W - + model->BSIM4v5paigc * Inv_LW; - pParam->BSIM4v5bigc = model->BSIM4v5bigc - + model->BSIM4v5lbigc * Inv_L - + model->BSIM4v5wbigc * Inv_W - + model->BSIM4v5pbigc * Inv_LW; - pParam->BSIM4v5cigc = model->BSIM4v5cigc - + model->BSIM4v5lcigc * Inv_L - + model->BSIM4v5wcigc * Inv_W - + model->BSIM4v5pcigc * Inv_LW; - pParam->BSIM4v5aigsd = model->BSIM4v5aigsd - + model->BSIM4v5laigsd * Inv_L - + model->BSIM4v5waigsd * Inv_W - + model->BSIM4v5paigsd * Inv_LW; - pParam->BSIM4v5bigsd = model->BSIM4v5bigsd - + model->BSIM4v5lbigsd * Inv_L - + model->BSIM4v5wbigsd * Inv_W - + model->BSIM4v5pbigsd * Inv_LW; - pParam->BSIM4v5cigsd = model->BSIM4v5cigsd - + model->BSIM4v5lcigsd * Inv_L - + model->BSIM4v5wcigsd * Inv_W - + model->BSIM4v5pcigsd * Inv_LW; - pParam->BSIM4v5aigbacc = model->BSIM4v5aigbacc - + model->BSIM4v5laigbacc * Inv_L - + model->BSIM4v5waigbacc * Inv_W - + model->BSIM4v5paigbacc * Inv_LW; - pParam->BSIM4v5bigbacc = model->BSIM4v5bigbacc - + model->BSIM4v5lbigbacc * Inv_L - + model->BSIM4v5wbigbacc * Inv_W - + model->BSIM4v5pbigbacc * Inv_LW; - pParam->BSIM4v5cigbacc = model->BSIM4v5cigbacc - + model->BSIM4v5lcigbacc * Inv_L - + model->BSIM4v5wcigbacc * Inv_W - + model->BSIM4v5pcigbacc * Inv_LW; - pParam->BSIM4v5aigbinv = model->BSIM4v5aigbinv - + model->BSIM4v5laigbinv * Inv_L - + model->BSIM4v5waigbinv * Inv_W - + model->BSIM4v5paigbinv * Inv_LW; - pParam->BSIM4v5bigbinv = model->BSIM4v5bigbinv - + model->BSIM4v5lbigbinv * Inv_L - + model->BSIM4v5wbigbinv * Inv_W - + model->BSIM4v5pbigbinv * Inv_LW; - pParam->BSIM4v5cigbinv = model->BSIM4v5cigbinv - + model->BSIM4v5lcigbinv * Inv_L - + model->BSIM4v5wcigbinv * Inv_W - + model->BSIM4v5pcigbinv * Inv_LW; - pParam->BSIM4v5nigc = model->BSIM4v5nigc - + model->BSIM4v5lnigc * Inv_L - + model->BSIM4v5wnigc * Inv_W - + model->BSIM4v5pnigc * Inv_LW; - pParam->BSIM4v5nigbacc = model->BSIM4v5nigbacc - + model->BSIM4v5lnigbacc * Inv_L - + model->BSIM4v5wnigbacc * Inv_W - + model->BSIM4v5pnigbacc * Inv_LW; - pParam->BSIM4v5nigbinv = model->BSIM4v5nigbinv - + model->BSIM4v5lnigbinv * Inv_L - + model->BSIM4v5wnigbinv * Inv_W - + model->BSIM4v5pnigbinv * Inv_LW; - pParam->BSIM4v5ntox = model->BSIM4v5ntox - + model->BSIM4v5lntox * Inv_L - + model->BSIM4v5wntox * Inv_W - + model->BSIM4v5pntox * Inv_LW; - pParam->BSIM4v5eigbinv = model->BSIM4v5eigbinv - + model->BSIM4v5leigbinv * Inv_L - + model->BSIM4v5weigbinv * Inv_W - + model->BSIM4v5peigbinv * Inv_LW; - pParam->BSIM4v5pigcd = model->BSIM4v5pigcd - + model->BSIM4v5lpigcd * Inv_L - + model->BSIM4v5wpigcd * Inv_W - + model->BSIM4v5ppigcd * Inv_LW; - pParam->BSIM4v5poxedge = model->BSIM4v5poxedge - + model->BSIM4v5lpoxedge * Inv_L - + model->BSIM4v5wpoxedge * Inv_W - + model->BSIM4v5ppoxedge * Inv_LW; - pParam->BSIM4v5xrcrg1 = model->BSIM4v5xrcrg1 - + model->BSIM4v5lxrcrg1 * Inv_L - + model->BSIM4v5wxrcrg1 * Inv_W - + model->BSIM4v5pxrcrg1 * Inv_LW; - pParam->BSIM4v5xrcrg2 = model->BSIM4v5xrcrg2 - + model->BSIM4v5lxrcrg2 * Inv_L - + model->BSIM4v5wxrcrg2 * Inv_W - + model->BSIM4v5pxrcrg2 * Inv_LW; - pParam->BSIM4v5lambda = model->BSIM4v5lambda - + model->BSIM4v5llambda * Inv_L - + model->BSIM4v5wlambda * Inv_W - + model->BSIM4v5plambda * Inv_LW; - pParam->BSIM4v5vtl = model->BSIM4v5vtl - + model->BSIM4v5lvtl * Inv_L - + model->BSIM4v5wvtl * Inv_W - + model->BSIM4v5pvtl * Inv_LW; - pParam->BSIM4v5xn = model->BSIM4v5xn - + model->BSIM4v5lxn * Inv_L - + model->BSIM4v5wxn * Inv_W - + model->BSIM4v5pxn * Inv_LW; - pParam->BSIM4v5vfbsdoff = model->BSIM4v5vfbsdoff - + model->BSIM4v5lvfbsdoff * Inv_L - + model->BSIM4v5wvfbsdoff * Inv_W - + model->BSIM4v5pvfbsdoff * Inv_LW; - pParam->BSIM4v5tvfbsdoff = model->BSIM4v5tvfbsdoff - + model->BSIM4v5ltvfbsdoff * Inv_L - + model->BSIM4v5wtvfbsdoff * Inv_W - + model->BSIM4v5ptvfbsdoff * Inv_LW; - - pParam->BSIM4v5cgsl = model->BSIM4v5cgsl - + model->BSIM4v5lcgsl * Inv_L - + model->BSIM4v5wcgsl * Inv_W - + model->BSIM4v5pcgsl * Inv_LW; - pParam->BSIM4v5cgdl = model->BSIM4v5cgdl - + model->BSIM4v5lcgdl * Inv_L - + model->BSIM4v5wcgdl * Inv_W - + model->BSIM4v5pcgdl * Inv_LW; - pParam->BSIM4v5ckappas = model->BSIM4v5ckappas - + model->BSIM4v5lckappas * Inv_L - + model->BSIM4v5wckappas * Inv_W - + model->BSIM4v5pckappas * Inv_LW; - pParam->BSIM4v5ckappad = model->BSIM4v5ckappad - + model->BSIM4v5lckappad * Inv_L - + model->BSIM4v5wckappad * Inv_W - + model->BSIM4v5pckappad * Inv_LW; - pParam->BSIM4v5cf = model->BSIM4v5cf - + model->BSIM4v5lcf * Inv_L - + model->BSIM4v5wcf * Inv_W - + model->BSIM4v5pcf * Inv_LW; - pParam->BSIM4v5clc = model->BSIM4v5clc - + model->BSIM4v5lclc * Inv_L - + model->BSIM4v5wclc * Inv_W - + model->BSIM4v5pclc * Inv_LW; - pParam->BSIM4v5cle = model->BSIM4v5cle - + model->BSIM4v5lcle * Inv_L - + model->BSIM4v5wcle * Inv_W - + model->BSIM4v5pcle * Inv_LW; - pParam->BSIM4v5vfbcv = model->BSIM4v5vfbcv - + model->BSIM4v5lvfbcv * Inv_L - + model->BSIM4v5wvfbcv * Inv_W - + model->BSIM4v5pvfbcv * Inv_LW; - pParam->BSIM4v5acde = model->BSIM4v5acde - + model->BSIM4v5lacde * Inv_L - + model->BSIM4v5wacde * Inv_W - + model->BSIM4v5pacde * Inv_LW; - pParam->BSIM4v5moin = model->BSIM4v5moin - + model->BSIM4v5lmoin * Inv_L - + model->BSIM4v5wmoin * Inv_W - + model->BSIM4v5pmoin * Inv_LW; - pParam->BSIM4v5noff = model->BSIM4v5noff - + model->BSIM4v5lnoff * Inv_L - + model->BSIM4v5wnoff * Inv_W - + model->BSIM4v5pnoff * Inv_LW; - pParam->BSIM4v5voffcv = model->BSIM4v5voffcv - + model->BSIM4v5lvoffcv * Inv_L - + model->BSIM4v5wvoffcv * Inv_W - + model->BSIM4v5pvoffcv * Inv_LW; - pParam->BSIM4v5kvth0we = model->BSIM4v5kvth0we - + model->BSIM4v5lkvth0we * Inv_L - + model->BSIM4v5wkvth0we * Inv_W - + model->BSIM4v5pkvth0we * Inv_LW; - pParam->BSIM4v5k2we = model->BSIM4v5k2we - + model->BSIM4v5lk2we * Inv_L - + model->BSIM4v5wk2we * Inv_W - + model->BSIM4v5pk2we * Inv_LW; - pParam->BSIM4v5ku0we = model->BSIM4v5ku0we - + model->BSIM4v5lku0we * Inv_L - + model->BSIM4v5wku0we * Inv_W - + model->BSIM4v5pku0we * Inv_LW; - - pParam->BSIM4v5abulkCVfactor = 1.0 + pow((pParam->BSIM4v5clc - / pParam->BSIM4v5leffCV), - pParam->BSIM4v5cle); - - T0 = (TRatio - 1.0); - - PowWeffWr = pow(pParam->BSIM4v5weffCJ * 1.0e6, pParam->BSIM4v5wr) * here->BSIM4v5nf; - - T1 = T2 = T3 = T4 = 0.0; - if(model->BSIM4v5tempMod == 0) { - pParam->BSIM4v5ua = pParam->BSIM4v5ua + pParam->BSIM4v5ua1 * T0; - pParam->BSIM4v5ub = pParam->BSIM4v5ub + pParam->BSIM4v5ub1 * T0; - pParam->BSIM4v5uc = pParam->BSIM4v5uc + pParam->BSIM4v5uc1 * T0; - pParam->BSIM4v5ud = pParam->BSIM4v5ud + pParam->BSIM4v5ud1 * T0; - pParam->BSIM4v5vsattemp = pParam->BSIM4v5vsat - pParam->BSIM4v5at * T0; - T10 = pParam->BSIM4v5prt * T0; - if(model->BSIM4v5rdsMod) { - /* External Rd(V) */ - T1 = pParam->BSIM4v5rdw + T10; - T2 = model->BSIM4v5rdwmin + T10; - /* External Rs(V) */ - T3 = pParam->BSIM4v5rsw + T10; - T4 = model->BSIM4v5rswmin + T10; - } - /* Internal Rds(V) in IV */ - pParam->BSIM4v5rds0 = (pParam->BSIM4v5rdsw + T10) - * here->BSIM4v5nf / PowWeffWr; - pParam->BSIM4v5rdswmin = (model->BSIM4v5rdswmin + T10) - * here->BSIM4v5nf / PowWeffWr; - } else { /* tempMod = 1, 2 */ - pParam->BSIM4v5ua = pParam->BSIM4v5ua * (1.0 + pParam->BSIM4v5ua1 * delTemp) ; - pParam->BSIM4v5ub = pParam->BSIM4v5ub * (1.0 + pParam->BSIM4v5ub1 * delTemp); - pParam->BSIM4v5uc = pParam->BSIM4v5uc * (1.0 + pParam->BSIM4v5uc1 * delTemp); - pParam->BSIM4v5ud = pParam->BSIM4v5ud * (1.0 + pParam->BSIM4v5ud1 * delTemp); - pParam->BSIM4v5vsattemp = pParam->BSIM4v5vsat * (1.0 - pParam->BSIM4v5at * delTemp); - T10 = 1.0 + pParam->BSIM4v5prt * delTemp; - if(model->BSIM4v5rdsMod) { - /* External Rd(V) */ - T1 = pParam->BSIM4v5rdw * T10; - T2 = model->BSIM4v5rdwmin * T10; - /* External Rs(V) */ - T3 = pParam->BSIM4v5rsw * T10; - T4 = model->BSIM4v5rswmin * T10; - } - /* Internal Rds(V) in IV */ - pParam->BSIM4v5rds0 = pParam->BSIM4v5rdsw * T10 * here->BSIM4v5nf / PowWeffWr; - pParam->BSIM4v5rdswmin = model->BSIM4v5rdswmin * T10 * here->BSIM4v5nf / PowWeffWr; - } - if (T1 < 0.0) - { T1 = 0.0; - printf("Warning: Rdw at current temperature is negative; set to 0.\n"); - } - if (T2 < 0.0) - { T2 = 0.0; - printf("Warning: Rdwmin at current temperature is negative; set to 0.\n"); - } - pParam->BSIM4v5rd0 = T1 / PowWeffWr; - pParam->BSIM4v5rdwmin = T2 / PowWeffWr; - if (T3 < 0.0) - { T3 = 0.0; - printf("Warning: Rsw at current temperature is negative; set to 0.\n"); - } - if (T4 < 0.0) - { T4 = 0.0; - printf("Warning: Rswmin at current temperature is negative; set to 0.\n"); - } - pParam->BSIM4v5rs0 = T3 / PowWeffWr; - pParam->BSIM4v5rswmin = T4 / PowWeffWr; - - if (pParam->BSIM4v5u0 > 1.0) - pParam->BSIM4v5u0 = pParam->BSIM4v5u0 / 1.0e4; - - /* mobility channel length dependence */ - T5 = 1.0 - pParam->BSIM4v5up * exp( - pParam->BSIM4v5leff / pParam->BSIM4v5lp); - pParam->BSIM4v5u0temp = pParam->BSIM4v5u0 * T5 - * pow(TRatio, pParam->BSIM4v5ute); - if (pParam->BSIM4v5eu < 0.0) - { pParam->BSIM4v5eu = 0.0; - printf("Warning: eu has been negative; reset to 0.0.\n"); - } - - pParam->BSIM4v5vfbsdoff = pParam->BSIM4v5vfbsdoff * (1.0 + pParam->BSIM4v5tvfbsdoff * delTemp); - pParam->BSIM4v5voff = pParam->BSIM4v5voff * (1.0 + pParam->BSIM4v5tvoff * delTemp); - - /* Source End Velocity Limit */ - if((model->BSIM4v5vtlGiven) && (model->BSIM4v5vtl > 0.0) ) - { - if(model->BSIM4v5lc < 0.0) pParam->BSIM4v5lc = 0.0; - else pParam->BSIM4v5lc = model->BSIM4v5lc ; - T0 = pParam->BSIM4v5leff / (pParam->BSIM4v5xn * pParam->BSIM4v5leff + pParam->BSIM4v5lc); - pParam->BSIM4v5tfactor = (1.0 - T0) / (1.0 + T0 ); - } - - pParam->BSIM4v5cgdo = (model->BSIM4v5cgdo + pParam->BSIM4v5cf) - * pParam->BSIM4v5weffCV; - pParam->BSIM4v5cgso = (model->BSIM4v5cgso + pParam->BSIM4v5cf) - * pParam->BSIM4v5weffCV; - pParam->BSIM4v5cgbo = model->BSIM4v5cgbo * pParam->BSIM4v5leffCV * here->BSIM4v5nf; - - if (!model->BSIM4v5ndepGiven && model->BSIM4v5gamma1Given) - { T0 = pParam->BSIM4v5gamma1 * model->BSIM4v5coxe; - pParam->BSIM4v5ndep = 3.01248e22 * T0 * T0; - } - - pParam->BSIM4v5phi = Vtm0 * log(pParam->BSIM4v5ndep / ni) - + pParam->BSIM4v5phin + 0.4; - - pParam->BSIM4v5sqrtPhi = sqrt(pParam->BSIM4v5phi); - pParam->BSIM4v5phis3 = pParam->BSIM4v5sqrtPhi * pParam->BSIM4v5phi; - - pParam->BSIM4v5Xdep0 = sqrt(2.0 * EPSSI / (Charge_q - * pParam->BSIM4v5ndep * 1.0e6)) - * pParam->BSIM4v5sqrtPhi; - pParam->BSIM4v5sqrtXdep0 = sqrt(pParam->BSIM4v5Xdep0); - pParam->BSIM4v5litl = sqrt(3.0 * pParam->BSIM4v5xj - * model->BSIM4v5toxe); - pParam->BSIM4v5vbi = Vtm0 * log(pParam->BSIM4v5nsd - * pParam->BSIM4v5ndep / (ni * ni)); - - if (pParam->BSIM4v5ngate > 0.0) - { pParam->BSIM4v5vfbsd = Vtm0 * log(pParam->BSIM4v5ngate - / pParam->BSIM4v5nsd); - } - else - pParam->BSIM4v5vfbsd = 0.0; - - pParam->BSIM4v5cdep0 = sqrt(Charge_q * EPSSI - * pParam->BSIM4v5ndep * 1.0e6 / 2.0 - / pParam->BSIM4v5phi); - - pParam->BSIM4v5ToxRatio = exp(pParam->BSIM4v5ntox - * log(model->BSIM4v5toxref / model->BSIM4v5toxe)) - / model->BSIM4v5toxe / model->BSIM4v5toxe; - pParam->BSIM4v5ToxRatioEdge = exp(pParam->BSIM4v5ntox - * log(model->BSIM4v5toxref - / (model->BSIM4v5toxe * pParam->BSIM4v5poxedge))) - / model->BSIM4v5toxe / model->BSIM4v5toxe - / pParam->BSIM4v5poxedge / pParam->BSIM4v5poxedge; - pParam->BSIM4v5Aechvb = (model->BSIM4v5type == NMOS) ? 4.97232e-7 : 3.42537e-7; - pParam->BSIM4v5Bechvb = (model->BSIM4v5type == NMOS) ? 7.45669e11 : 1.16645e12; - pParam->BSIM4v5AechvbEdge = pParam->BSIM4v5Aechvb * pParam->BSIM4v5weff - * model->BSIM4v5dlcig * pParam->BSIM4v5ToxRatioEdge; - pParam->BSIM4v5BechvbEdge = -pParam->BSIM4v5Bechvb - * model->BSIM4v5toxe * pParam->BSIM4v5poxedge; - pParam->BSIM4v5Aechvb *= pParam->BSIM4v5weff * pParam->BSIM4v5leff - * pParam->BSIM4v5ToxRatio; - pParam->BSIM4v5Bechvb *= -model->BSIM4v5toxe; - - - pParam->BSIM4v5mstar = 0.5 + atan(pParam->BSIM4v5minv) / PI; - pParam->BSIM4v5voffcbn = pParam->BSIM4v5voff + model->BSIM4v5voffl / pParam->BSIM4v5leff; - - pParam->BSIM4v5ldeb = sqrt(EPSSI * Vtm0 / (Charge_q - * pParam->BSIM4v5ndep * 1.0e6)) / 3.0; - pParam->BSIM4v5acde *= pow((pParam->BSIM4v5ndep / 2.0e16), -0.25); - - - if (model->BSIM4v5k1Given || model->BSIM4v5k2Given) - { if (!model->BSIM4v5k1Given) - { - if ((!ckt->CKTcurJob) || (ckt->CKTcurJob->JOBtype < 9)) /* don't print in sensitivity */ - fprintf(stdout, "Warning: k1 should be specified with k2.\n"); - pParam->BSIM4v5k1 = 0.53; - } - if (!model->BSIM4v5k2Given) - { - if ((!ckt->CKTcurJob) || (ckt->CKTcurJob->JOBtype < 9)) /* don't print in sensitivity */ - fprintf(stdout, "Warning: k2 should be specified with k1.\n"); - pParam->BSIM4v5k2 = -0.0186; - } - if ((!ckt->CKTcurJob) || (ckt->CKTcurJob->JOBtype < 9)) { /* don't print in sensitivity */ - if (model->BSIM4v5nsubGiven) - fprintf(stdout, "Warning: nsub is ignored because k1 or k2 is given.\n"); - if (model->BSIM4v5xtGiven) - fprintf(stdout, "Warning: xt is ignored because k1 or k2 is given.\n"); - if (model->BSIM4v5vbxGiven) - fprintf(stdout, "Warning: vbx is ignored because k1 or k2 is given.\n"); - if (model->BSIM4v5gamma1Given) - fprintf(stdout, "Warning: gamma1 is ignored because k1 or k2 is given.\n"); - if (model->BSIM4v5gamma2Given) - fprintf(stdout, "Warning: gamma2 is ignored because k1 or k2 is given.\n"); - } - } - else - { if (!model->BSIM4v5vbxGiven) - pParam->BSIM4v5vbx = pParam->BSIM4v5phi - 7.7348e-4 - * pParam->BSIM4v5ndep - * pParam->BSIM4v5xt * pParam->BSIM4v5xt; - if (pParam->BSIM4v5vbx > 0.0) - pParam->BSIM4v5vbx = -pParam->BSIM4v5vbx; - if (pParam->BSIM4v5vbm > 0.0) - pParam->BSIM4v5vbm = -pParam->BSIM4v5vbm; - - if (!model->BSIM4v5gamma1Given) - pParam->BSIM4v5gamma1 = 5.753e-12 - * sqrt(pParam->BSIM4v5ndep) - / model->BSIM4v5coxe; - if (!model->BSIM4v5gamma2Given) - pParam->BSIM4v5gamma2 = 5.753e-12 - * sqrt(pParam->BSIM4v5nsub) - / model->BSIM4v5coxe; - - T0 = pParam->BSIM4v5gamma1 - pParam->BSIM4v5gamma2; - T1 = sqrt(pParam->BSIM4v5phi - pParam->BSIM4v5vbx) - - pParam->BSIM4v5sqrtPhi; - T2 = sqrt(pParam->BSIM4v5phi * (pParam->BSIM4v5phi - - pParam->BSIM4v5vbm)) - pParam->BSIM4v5phi; - pParam->BSIM4v5k2 = T0 * T1 / (2.0 * T2 + pParam->BSIM4v5vbm); - pParam->BSIM4v5k1 = pParam->BSIM4v5gamma2 - 2.0 - * pParam->BSIM4v5k2 * sqrt(pParam->BSIM4v5phi - - pParam->BSIM4v5vbm); - } - - if (!model->BSIM4v5vfbGiven) - { if (model->BSIM4v5vth0Given) - { pParam->BSIM4v5vfb = model->BSIM4v5type * pParam->BSIM4v5vth0 - - pParam->BSIM4v5phi - pParam->BSIM4v5k1 - * pParam->BSIM4v5sqrtPhi; - } - else - { pParam->BSIM4v5vfb = -1.0; - } - } - if (!model->BSIM4v5vth0Given) - { pParam->BSIM4v5vth0 = model->BSIM4v5type * (pParam->BSIM4v5vfb - + pParam->BSIM4v5phi + pParam->BSIM4v5k1 - * pParam->BSIM4v5sqrtPhi); - } - - pParam->BSIM4v5k1ox = pParam->BSIM4v5k1 * model->BSIM4v5toxe - / model->BSIM4v5toxm; - - tmp = sqrt(EPSSI / (model->BSIM4v5epsrox * EPS0) - * model->BSIM4v5toxe * pParam->BSIM4v5Xdep0); - T0 = pParam->BSIM4v5dsub * pParam->BSIM4v5leff / tmp; - if (T0 < EXP_THRESHOLD) - { T1 = exp(T0); - T2 = T1 - 1.0; - T3 = T2 * T2; - T4 = T3 + 2.0 * T1 * MIN_EXP; - pParam->BSIM4v5theta0vb0 = T1 / T4; - } - else - pParam->BSIM4v5theta0vb0 = 1.0 / (MAX_EXP - 2.0); - - T0 = pParam->BSIM4v5drout * pParam->BSIM4v5leff / tmp; - if (T0 < EXP_THRESHOLD) - { T1 = exp(T0); - T2 = T1 - 1.0; - T3 = T2 * T2; - T4 = T3 + 2.0 * T1 * MIN_EXP; - T5 = T1 / T4; - } - else - T5 = 1.0 / (MAX_EXP - 2.0); /* 3.0 * MIN_EXP omitted */ - pParam->BSIM4v5thetaRout = pParam->BSIM4v5pdibl1 * T5 - + pParam->BSIM4v5pdibl2; - - tmp = sqrt(pParam->BSIM4v5Xdep0); - tmp1 = pParam->BSIM4v5vbi - pParam->BSIM4v5phi; - tmp2 = model->BSIM4v5factor1 * tmp; - - T0 = pParam->BSIM4v5dvt1w * pParam->BSIM4v5weff - * pParam->BSIM4v5leff / tmp2; - if (T0 < EXP_THRESHOLD) - { T1 = exp(T0); - T2 = T1 - 1.0; - T3 = T2 * T2; - T4 = T3 + 2.0 * T1 * MIN_EXP; - T8 = T1 / T4; - } - else - T8 = 1.0 / (MAX_EXP - 2.0); - T0 = pParam->BSIM4v5dvt0w * T8; - T8 = T0 * tmp1; - - T0 = pParam->BSIM4v5dvt1 * pParam->BSIM4v5leff / tmp2; - if (T0 < EXP_THRESHOLD) - { T1 = exp(T0); - T2 = T1 - 1.0; - T3 = T2 * T2; - T4 = T3 + 2.0 * T1 * MIN_EXP; - T9 = T1 / T4; - } - else - T9 = 1.0 / (MAX_EXP - 2.0); - T9 = pParam->BSIM4v5dvt0 * T9 * tmp1; - - T4 = model->BSIM4v5toxe * pParam->BSIM4v5phi - / (pParam->BSIM4v5weff + pParam->BSIM4v5w0); - - T0 = sqrt(1.0 + pParam->BSIM4v5lpe0 / pParam->BSIM4v5leff); - if((model->BSIM4v5tempMod == 1) || (model->BSIM4v5tempMod == 0)) - T3 = (pParam->BSIM4v5kt1 + pParam->BSIM4v5kt1l / pParam->BSIM4v5leff) - * (TRatio - 1.0); - if(model->BSIM4v5tempMod == 2) - T3 = - pParam->BSIM4v5kt1 * (TRatio - 1.0); - - T5 = pParam->BSIM4v5k1ox * (T0 - 1.0) * pParam->BSIM4v5sqrtPhi - + T3; - pParam->BSIM4v5vfbzbfactor = - T8 - T9 + pParam->BSIM4v5k3 * T4 + T5 - - pParam->BSIM4v5phi - pParam->BSIM4v5k1 * pParam->BSIM4v5sqrtPhi; - - /* stress effect */ - - wlod = model->BSIM4v5wlod; - if (model->BSIM4v5wlod < 0.0) - { fprintf(stderr, "Warning: WLOD = %g is less than 0. 0.0 is used\n",model->BSIM4v5wlod); - wlod = 0.0; - } - T0 = pow(Lnew, model->BSIM4v5llodku0); - W_tmp = Wnew + wlod; - T1 = pow(W_tmp, model->BSIM4v5wlodku0); - tmp1 = model->BSIM4v5lku0 / T0 + model->BSIM4v5wku0 / T1 - + model->BSIM4v5pku0 / (T0 * T1); - pParam->BSIM4v5ku0 = 1.0 + tmp1; - - T0 = pow(Lnew, model->BSIM4v5llodvth); - T1 = pow(W_tmp, model->BSIM4v5wlodvth); - tmp1 = model->BSIM4v5lkvth0 / T0 + model->BSIM4v5wkvth0 / T1 - + model->BSIM4v5pkvth0 / (T0 * T1); - pParam->BSIM4v5kvth0 = 1.0 + tmp1; - pParam->BSIM4v5kvth0 = sqrt(pParam->BSIM4v5kvth0*pParam->BSIM4v5kvth0 + DELTA); - - T0 = (TRatio - 1.0); - pParam->BSIM4v5ku0temp = pParam->BSIM4v5ku0 * (1.0 + model->BSIM4v5tku0 *T0) + DELTA; - - Inv_saref = 1.0/(model->BSIM4v5saref + 0.5*Ldrn); - Inv_sbref = 1.0/(model->BSIM4v5sbref + 0.5*Ldrn); - pParam->BSIM4v5inv_od_ref = Inv_saref + Inv_sbref; - pParam->BSIM4v5rho_ref = model->BSIM4v5ku0 / pParam->BSIM4v5ku0temp * pParam->BSIM4v5inv_od_ref; - - } /* End of SizeNotFound */ - - /* stress effect */ - if( (here->BSIM4v5sa > 0.0) && (here->BSIM4v5sb > 0.0) && - ((here->BSIM4v5nf == 1.0) || ((here->BSIM4v5nf > 1.0) && (here->BSIM4v5sd > 0.0))) ) - { Inv_sa = 0; - Inv_sb = 0; - - kvsat = model->BSIM4v5kvsat; - if (model->BSIM4v5kvsat < -1.0 ) - { fprintf(stderr, "Warning: KVSAT = %g is too small; -1.0 is used.\n",model->BSIM4v5kvsat); - kvsat = -1.0; - } - if (model->BSIM4v5kvsat > 1.0) - { fprintf(stderr, "Warning: KVSAT = %g is too big; 1.0 is used.\n",model->BSIM4v5kvsat); - kvsat = 1.0; - } - - for(i = 0; i < here->BSIM4v5nf; i++){ - T0 = 1.0 / here->BSIM4v5nf / (here->BSIM4v5sa + 0.5*Ldrn + i * (here->BSIM4v5sd +Ldrn)); - T1 = 1.0 / here->BSIM4v5nf / (here->BSIM4v5sb + 0.5*Ldrn + i * (here->BSIM4v5sd +Ldrn)); - Inv_sa += T0; - Inv_sb += T1; - } - Inv_ODeff = Inv_sa + Inv_sb; - rho = model->BSIM4v5ku0 / pParam->BSIM4v5ku0temp * Inv_ODeff; - T0 = (1.0 + rho)/(1.0 + pParam->BSIM4v5rho_ref); - here->BSIM4v5u0temp = pParam->BSIM4v5u0temp * T0; - - T1 = (1.0 + kvsat * rho)/(1.0 + kvsat * pParam->BSIM4v5rho_ref); - here->BSIM4v5vsattemp = pParam->BSIM4v5vsattemp * T1; - - OD_offset = Inv_ODeff - pParam->BSIM4v5inv_od_ref; - dvth0_lod = model->BSIM4v5kvth0 / pParam->BSIM4v5kvth0 * OD_offset; - dk2_lod = model->BSIM4v5stk2 / pow(pParam->BSIM4v5kvth0, model->BSIM4v5lodk2) * - OD_offset; - deta0_lod = model->BSIM4v5steta0 / pow(pParam->BSIM4v5kvth0, model->BSIM4v5lodeta0) * - OD_offset; - here->BSIM4v5vth0 = pParam->BSIM4v5vth0 + dvth0_lod; - - here->BSIM4v5eta0 = pParam->BSIM4v5eta0 + deta0_lod; - here->BSIM4v5k2 = pParam->BSIM4v5k2 + dk2_lod; - } else { - here->BSIM4v5u0temp = pParam->BSIM4v5u0temp; - here->BSIM4v5vth0 = pParam->BSIM4v5vth0; - here->BSIM4v5vsattemp = pParam->BSIM4v5vsattemp; - here->BSIM4v5eta0 = pParam->BSIM4v5eta0; - here->BSIM4v5k2 = pParam->BSIM4v5k2; - } - - /* Well Proximity Effect */ - if (model->BSIM4v5wpemod) - { if( (!here->BSIM4v5scaGiven) && (!here->BSIM4v5scbGiven) && (!here->BSIM4v5sccGiven) ) - { if((here->BSIM4v5scGiven) && (here->BSIM4v5sc > 0.0) ) - { T1 = here->BSIM4v5sc + Wdrn; - T2 = 1.0 / model->BSIM4v5scref; - here->BSIM4v5sca = model->BSIM4v5scref * model->BSIM4v5scref - / (here->BSIM4v5sc * T1); - here->BSIM4v5scb = ( (0.1 * here->BSIM4v5sc + 0.01 * model->BSIM4v5scref) - * exp(-10.0 * here->BSIM4v5sc * T2) - - (0.1 * T1 + 0.01 * model->BSIM4v5scref) - * exp(-10.0 * T1 * T2) ) / Wdrn; - here->BSIM4v5scc = ( (0.05 * here->BSIM4v5sc + 0.0025 * model->BSIM4v5scref) - * exp(-20.0 * here->BSIM4v5sc * T2) - - (0.05 * T1 + 0.0025 * model->BSIM4v5scref) - * exp(-20.0 * T1 * T2) ) / Wdrn; - } else { - //fprintf(stderr, "Warning: No WPE as none of SCA, SCB, SCC, SC is given and/or SC not positive.\n"); - } - } - sceff = here->BSIM4v5sca + model->BSIM4v5web * here->BSIM4v5scb - + model->BSIM4v5wec * here->BSIM4v5scc; - here->BSIM4v5vth0 += pParam->BSIM4v5kvth0we * sceff; - here->BSIM4v5k2 += pParam->BSIM4v5k2we * sceff; - T3 = 1.0 + pParam->BSIM4v5ku0we * sceff; - if (T3 <= 0.0) - { - fprintf(stderr, "Warning: ku0we = %g is negatively too high. Negative mobility! \n", T3); - T3 = 0.0; - } - here->BSIM4v5u0temp *= T3; - } - - /* adding delvto */ - here->BSIM4v5vth0 += here->BSIM4v5delvto; - here->BSIM4v5vfb = pParam->BSIM4v5vfb + model->BSIM4v5type * here->BSIM4v5delvto; - - /* Instance variables calculation */ - T3 = model->BSIM4v5type * here->BSIM4v5vth0 - - here->BSIM4v5vfb - pParam->BSIM4v5phi; - T4 = T3 + T3; - T5 = 2.5 * T3; - here->BSIM4v5vtfbphi1 = (model->BSIM4v5type == NMOS) ? T4 : T5; - if (here->BSIM4v5vtfbphi1 < 0.0) - here->BSIM4v5vtfbphi1 = 0.0; - - here->BSIM4v5vtfbphi2 = 4.0 * T3; - if (here->BSIM4v5vtfbphi2 < 0.0) - here->BSIM4v5vtfbphi2 = 0.0; - - if (here->BSIM4v5k2 < 0.0) - { T0 = 0.5 * pParam->BSIM4v5k1 / here->BSIM4v5k2; - here->BSIM4v5vbsc = 0.9 * (pParam->BSIM4v5phi - T0 * T0); - if (here->BSIM4v5vbsc > -3.0) - here->BSIM4v5vbsc = -3.0; - else if (here->BSIM4v5vbsc < -30.0) - here->BSIM4v5vbsc = -30.0; - } - else - here->BSIM4v5vbsc = -30.0; - if (here->BSIM4v5vbsc > pParam->BSIM4v5vbm) - here->BSIM4v5vbsc = pParam->BSIM4v5vbm; - here->BSIM4v5k2ox = here->BSIM4v5k2 * model->BSIM4v5toxe - / model->BSIM4v5toxm; - - here->BSIM4v5vfbzb = pParam->BSIM4v5vfbzbfactor - + model->BSIM4v5type * here->BSIM4v5vth0 ; - - here->BSIM4v5cgso = pParam->BSIM4v5cgso; - here->BSIM4v5cgdo = pParam->BSIM4v5cgdo; - - lnl = log(pParam->BSIM4v5leff * 1.0e6); - lnw = log(pParam->BSIM4v5weff * 1.0e6); - lnnf = log(here->BSIM4v5nf); - - bodymode = 5; - if( ( !model->BSIM4v5rbps0Given) || - ( !model->BSIM4v5rbpd0Given) ) - bodymode = 1; - else - if( (!model->BSIM4v5rbsbx0Given && !model->BSIM4v5rbsby0Given) || - (!model->BSIM4v5rbdbx0Given && !model->BSIM4v5rbdby0Given) ) - bodymode = 3; - - if(here->BSIM4v5rbodyMod == 2) - { - if (bodymode == 5) - { - rbsbx = exp( log(model->BSIM4v5rbsbx0) + model->BSIM4v5rbsdbxl * lnl + - model->BSIM4v5rbsdbxw * lnw + model->BSIM4v5rbsdbxnf * lnnf ); - rbsby = exp( log(model->BSIM4v5rbsby0) + model->BSIM4v5rbsdbyl * lnl + - model->BSIM4v5rbsdbyw * lnw + model->BSIM4v5rbsdbynf * lnnf ); - here->BSIM4v5rbsb = rbsbx * rbsby / (rbsbx + rbsby); - - - rbdbx = exp( log(model->BSIM4v5rbdbx0) + model->BSIM4v5rbsdbxl * lnl + - model->BSIM4v5rbsdbxw * lnw + model->BSIM4v5rbsdbxnf * lnnf ); - rbdby = exp( log(model->BSIM4v5rbdby0) + model->BSIM4v5rbsdbyl * lnl + - model->BSIM4v5rbsdbyw * lnw + model->BSIM4v5rbsdbynf * lnnf ); - here->BSIM4v5rbdb = rbdbx * rbdby / (rbdbx + rbdby); - } - - if ((bodymode == 3)|| (bodymode == 5)) - { - here->BSIM4v5rbps = exp( log(model->BSIM4v5rbps0) + model->BSIM4v5rbpsl * lnl + - model->BSIM4v5rbpsw * lnw + model->BSIM4v5rbpsnf * lnnf ); - here->BSIM4v5rbpd = exp( log(model->BSIM4v5rbpd0) + model->BSIM4v5rbpdl * lnl + - model->BSIM4v5rbpdw * lnw + model->BSIM4v5rbpdnf * lnnf ); - } - - rbpbx = exp( log(model->BSIM4v5rbpbx0) + model->BSIM4v5rbpbxl * lnl + - model->BSIM4v5rbpbxw * lnw + model->BSIM4v5rbpbxnf * lnnf ); - rbpby = exp( log(model->BSIM4v5rbpby0) + model->BSIM4v5rbpbyl * lnl + - model->BSIM4v5rbpbyw * lnw + model->BSIM4v5rbpbynf * lnnf ); - here->BSIM4v5rbpb = rbpbx*rbpby/(rbpbx + rbpby); - } - - - if ((here->BSIM4v5rbodyMod == 1 ) || ((here->BSIM4v5rbodyMod == 2 ) && (bodymode == 5)) ) - { if (here->BSIM4v5rbdb < 1.0e-3) - here->BSIM4v5grbdb = 1.0e3; /* in mho */ - else - here->BSIM4v5grbdb = model->BSIM4v5gbmin + 1.0 / here->BSIM4v5rbdb; - if (here->BSIM4v5rbpb < 1.0e-3) - here->BSIM4v5grbpb = 1.0e3; - else - here->BSIM4v5grbpb = model->BSIM4v5gbmin + 1.0 / here->BSIM4v5rbpb; - if (here->BSIM4v5rbps < 1.0e-3) - here->BSIM4v5grbps = 1.0e3; - else - here->BSIM4v5grbps = model->BSIM4v5gbmin + 1.0 / here->BSIM4v5rbps; - if (here->BSIM4v5rbsb < 1.0e-3) - here->BSIM4v5grbsb = 1.0e3; - else - here->BSIM4v5grbsb = model->BSIM4v5gbmin + 1.0 / here->BSIM4v5rbsb; - if (here->BSIM4v5rbpd < 1.0e-3) - here->BSIM4v5grbpd = 1.0e3; - else - here->BSIM4v5grbpd = model->BSIM4v5gbmin + 1.0 / here->BSIM4v5rbpd; - - } - - if((here->BSIM4v5rbodyMod == 2) && (bodymode == 3)) - { - here->BSIM4v5grbdb = here->BSIM4v5grbsb = model->BSIM4v5gbmin; - if (here->BSIM4v5rbpb < 1.0e-3) - here->BSIM4v5grbpb = 1.0e3; - else - here->BSIM4v5grbpb = model->BSIM4v5gbmin + 1.0 / here->BSIM4v5rbpb; - if (here->BSIM4v5rbps < 1.0e-3) - here->BSIM4v5grbps = 1.0e3; - else - here->BSIM4v5grbps = model->BSIM4v5gbmin + 1.0 / here->BSIM4v5rbps; - if (here->BSIM4v5rbpd < 1.0e-3) - here->BSIM4v5grbpd = 1.0e3; - else - here->BSIM4v5grbpd = model->BSIM4v5gbmin + 1.0 / here->BSIM4v5rbpd; - } - - if((here->BSIM4v5rbodyMod == 2) && (bodymode == 1)) - { - here->BSIM4v5grbdb = here->BSIM4v5grbsb = model->BSIM4v5gbmin; - here->BSIM4v5grbps = here->BSIM4v5grbpd = 1.0e3; - if (here->BSIM4v5rbpb < 1.0e-3) - here->BSIM4v5grbpb = 1.0e3; - else - here->BSIM4v5grbpb = model->BSIM4v5gbmin + 1.0 / here->BSIM4v5rbpb; - } - - - /* - * Process geomertry dependent parasitics - */ - - here->BSIM4v5grgeltd = model->BSIM4v5rshg * (here->BSIM4v5xgw - + pParam->BSIM4v5weffCJ / 3.0 / here->BSIM4v5ngcon) / - (here->BSIM4v5ngcon * here->BSIM4v5nf * - (Lnew - model->BSIM4v5xgl)); - if (here->BSIM4v5grgeltd > 0.0) - here->BSIM4v5grgeltd = 1.0 / here->BSIM4v5grgeltd; - else - { here->BSIM4v5grgeltd = 1.0e3; /* mho */ - if (here->BSIM4v5rgateMod != 0) - printf("Warning: The gate conductance reset to 1.0e3 mho.\n"); - } - - DMCGeff = model->BSIM4v5dmcg - model->BSIM4v5dmcgt; - DMCIeff = model->BSIM4v5dmci; - DMDGeff = model->BSIM4v5dmdg - model->BSIM4v5dmcgt; - - if (here->BSIM4v5sourcePerimeterGiven) - { if (model->BSIM4v5perMod == 0) - here->BSIM4v5Pseff = here->BSIM4v5sourcePerimeter; - else - here->BSIM4v5Pseff = here->BSIM4v5sourcePerimeter - - pParam->BSIM4v5weffCJ * here->BSIM4v5nf; - } - else - BSIM4v5PAeffGeo(here->BSIM4v5nf, here->BSIM4v5geoMod, here->BSIM4v5min, - pParam->BSIM4v5weffCJ, DMCGeff, DMCIeff, DMDGeff, - &(here->BSIM4v5Pseff), &dumPd, &dumAs, &dumAd); - - if (here->BSIM4v5drainPerimeterGiven) - { if (model->BSIM4v5perMod == 0) - here->BSIM4v5Pdeff = here->BSIM4v5drainPerimeter; - else - here->BSIM4v5Pdeff = here->BSIM4v5drainPerimeter - - pParam->BSIM4v5weffCJ * here->BSIM4v5nf; - } - else - BSIM4v5PAeffGeo(here->BSIM4v5nf, here->BSIM4v5geoMod, here->BSIM4v5min, - pParam->BSIM4v5weffCJ, DMCGeff, DMCIeff, DMDGeff, - &dumPs, &(here->BSIM4v5Pdeff), &dumAs, &dumAd); - - if (here->BSIM4v5sourceAreaGiven) - here->BSIM4v5Aseff = here->BSIM4v5sourceArea; - else - BSIM4v5PAeffGeo(here->BSIM4v5nf, here->BSIM4v5geoMod, here->BSIM4v5min, - pParam->BSIM4v5weffCJ, DMCGeff, DMCIeff, DMDGeff, - &dumPs, &dumPd, &(here->BSIM4v5Aseff), &dumAd); - - if (here->BSIM4v5drainAreaGiven) - here->BSIM4v5Adeff = here->BSIM4v5drainArea; - else - BSIM4v5PAeffGeo(here->BSIM4v5nf, here->BSIM4v5geoMod, here->BSIM4v5min, - pParam->BSIM4v5weffCJ, DMCGeff, DMCIeff, DMDGeff, - &dumPs, &dumPd, &dumAs, &(here->BSIM4v5Adeff)); - - /* Processing S/D resistance and conductance below */ - if(here->BSIM4v5sNodePrime != here->BSIM4v5sNode) - { - here->BSIM4v5sourceConductance = 0.0; - if(here->BSIM4v5sourceSquaresGiven) - { - here->BSIM4v5sourceConductance = model->BSIM4v5sheetResistance - * here->BSIM4v5sourceSquares; - } else if (here->BSIM4v5rgeoMod > 0) - { - BSIM4v5RdseffGeo(here->BSIM4v5nf, here->BSIM4v5geoMod, - here->BSIM4v5rgeoMod, here->BSIM4v5min, - pParam->BSIM4v5weffCJ, model->BSIM4v5sheetResistance, - DMCGeff, DMCIeff, DMDGeff, 1, &(here->BSIM4v5sourceConductance)); - } else - { - here->BSIM4v5sourceConductance = 0.0; - } - - if (here->BSIM4v5sourceConductance > 0.0) - here->BSIM4v5sourceConductance = 1.0 - / here->BSIM4v5sourceConductance; - else - { - here->BSIM4v5sourceConductance = 1.0e3; /* mho */ - printf ("Warning: Source conductance reset to 1.0e3 mho.\n"); - } - } else - { - here->BSIM4v5sourceConductance = 0.0; - } - - if(here->BSIM4v5dNodePrime != here->BSIM4v5dNode) - { - here->BSIM4v5drainConductance = 0.0; - if(here->BSIM4v5drainSquaresGiven) - { - here->BSIM4v5drainConductance = model->BSIM4v5sheetResistance - * here->BSIM4v5drainSquares; - } else if (here->BSIM4v5rgeoMod > 0) - { - BSIM4v5RdseffGeo(here->BSIM4v5nf, here->BSIM4v5geoMod, - here->BSIM4v5rgeoMod, here->BSIM4v5min, - pParam->BSIM4v5weffCJ, model->BSIM4v5sheetResistance, - DMCGeff, DMCIeff, DMDGeff, 0, &(here->BSIM4v5drainConductance)); - } else - { - here->BSIM4v5drainConductance = 0.0; - } - - if (here->BSIM4v5drainConductance > 0.0) - here->BSIM4v5drainConductance = 1.0 - / here->BSIM4v5drainConductance; - else - { - here->BSIM4v5drainConductance = 1.0e3; /* mho */ - printf ("Warning: Drain conductance reset to 1.0e3 mho.\n"); - } - } else - { - here->BSIM4v5drainConductance = 0.0; - } - - /* End of Rsd processing */ - - - Nvtms = model->BSIM4v5vtm * model->BSIM4v5SjctEmissionCoeff; - if ((here->BSIM4v5Aseff <= 0.0) && (here->BSIM4v5Pseff <= 0.0)) - { SourceSatCurrent = 1.0e-14; - } - else - { SourceSatCurrent = here->BSIM4v5Aseff * model->BSIM4v5SjctTempSatCurDensity - + here->BSIM4v5Pseff * model->BSIM4v5SjctSidewallTempSatCurDensity - + pParam->BSIM4v5weffCJ * here->BSIM4v5nf - * model->BSIM4v5SjctGateSidewallTempSatCurDensity; - } - if (SourceSatCurrent > 0.0) - { switch(model->BSIM4v5dioMod) - { case 0: - if ((model->BSIM4v5bvs / Nvtms) > EXP_THRESHOLD) - here->BSIM4v5XExpBVS = model->BSIM4v5xjbvs * MIN_EXP; - else - here->BSIM4v5XExpBVS = model->BSIM4v5xjbvs * exp(-model->BSIM4v5bvs / Nvtms); - break; - case 1: - BSIM4v5DioIjthVjmEval(Nvtms, model->BSIM4v5ijthsfwd, SourceSatCurrent, - 0.0, &(here->BSIM4v5vjsmFwd)); - here->BSIM4v5IVjsmFwd = SourceSatCurrent * exp(here->BSIM4v5vjsmFwd / Nvtms); - break; - case 2: - if ((model->BSIM4v5bvs / Nvtms) > EXP_THRESHOLD) - { here->BSIM4v5XExpBVS = model->BSIM4v5xjbvs * MIN_EXP; - tmp = MIN_EXP; - } - else - { here->BSIM4v5XExpBVS = exp(-model->BSIM4v5bvs / Nvtms); - tmp = here->BSIM4v5XExpBVS; - here->BSIM4v5XExpBVS *= model->BSIM4v5xjbvs; - } - - BSIM4v5DioIjthVjmEval(Nvtms, model->BSIM4v5ijthsfwd, SourceSatCurrent, - here->BSIM4v5XExpBVS, &(here->BSIM4v5vjsmFwd)); - T0 = exp(here->BSIM4v5vjsmFwd / Nvtms); - here->BSIM4v5IVjsmFwd = SourceSatCurrent * (T0 - here->BSIM4v5XExpBVS / T0 - + here->BSIM4v5XExpBVS - 1.0); - here->BSIM4v5SslpFwd = SourceSatCurrent - * (T0 + here->BSIM4v5XExpBVS / T0) / Nvtms; - - T2 = model->BSIM4v5ijthsrev / SourceSatCurrent; - if (T2 < 1.0) - { T2 = 10.0; - fprintf(stderr, "Warning: ijthsrev too small and set to 10 times IsbSat.\n"); - } - here->BSIM4v5vjsmRev = -model->BSIM4v5bvs - - Nvtms * log((T2 - 1.0) / model->BSIM4v5xjbvs); - T1 = model->BSIM4v5xjbvs * exp(-(model->BSIM4v5bvs - + here->BSIM4v5vjsmRev) / Nvtms); - here->BSIM4v5IVjsmRev = SourceSatCurrent * (1.0 + T1); - here->BSIM4v5SslpRev = -SourceSatCurrent * T1 / Nvtms; - break; - default: - printf("Specified dioMod = %d not matched\n", model->BSIM4v5dioMod); - } - } - - Nvtmd = model->BSIM4v5vtm * model->BSIM4v5DjctEmissionCoeff; - if ((here->BSIM4v5Adeff <= 0.0) && (here->BSIM4v5Pdeff <= 0.0)) - { DrainSatCurrent = 1.0e-14; - } - else - { DrainSatCurrent = here->BSIM4v5Adeff * model->BSIM4v5DjctTempSatCurDensity - + here->BSIM4v5Pdeff * model->BSIM4v5DjctSidewallTempSatCurDensity - + pParam->BSIM4v5weffCJ * here->BSIM4v5nf - * model->BSIM4v5DjctGateSidewallTempSatCurDensity; - } - if (DrainSatCurrent > 0.0) - { switch(model->BSIM4v5dioMod) - { case 0: - if ((model->BSIM4v5bvd / Nvtmd) > EXP_THRESHOLD) - here->BSIM4v5XExpBVD = model->BSIM4v5xjbvd * MIN_EXP; - else - here->BSIM4v5XExpBVD = model->BSIM4v5xjbvd * exp(-model->BSIM4v5bvd / Nvtmd); - break; - case 1: - BSIM4v5DioIjthVjmEval(Nvtmd, model->BSIM4v5ijthdfwd, DrainSatCurrent, - 0.0, &(here->BSIM4v5vjdmFwd)); - here->BSIM4v5IVjdmFwd = DrainSatCurrent * exp(here->BSIM4v5vjdmFwd / Nvtmd); - break; - case 2: - if ((model->BSIM4v5bvd / Nvtmd) > EXP_THRESHOLD) - { here->BSIM4v5XExpBVD = model->BSIM4v5xjbvd * MIN_EXP; - tmp = MIN_EXP; - } - else - { here->BSIM4v5XExpBVD = exp(-model->BSIM4v5bvd / Nvtmd); - tmp = here->BSIM4v5XExpBVD; - here->BSIM4v5XExpBVD *= model->BSIM4v5xjbvd; - } - - BSIM4v5DioIjthVjmEval(Nvtmd, model->BSIM4v5ijthdfwd, DrainSatCurrent, - here->BSIM4v5XExpBVD, &(here->BSIM4v5vjdmFwd)); - T0 = exp(here->BSIM4v5vjdmFwd / Nvtmd); - here->BSIM4v5IVjdmFwd = DrainSatCurrent * (T0 - here->BSIM4v5XExpBVD / T0 - + here->BSIM4v5XExpBVD - 1.0); - here->BSIM4v5DslpFwd = DrainSatCurrent - * (T0 + here->BSIM4v5XExpBVD / T0) / Nvtmd; - - T2 = model->BSIM4v5ijthdrev / DrainSatCurrent; - if (T2 < 1.0) - { T2 = 10.0; - fprintf(stderr, "Warning: ijthdrev too small and set to 10 times IdbSat.\n"); - } - here->BSIM4v5vjdmRev = -model->BSIM4v5bvd - - Nvtmd * log((T2 - 1.0) / model->BSIM4v5xjbvd); /* bugfix */ - T1 = model->BSIM4v5xjbvd * exp(-(model->BSIM4v5bvd - + here->BSIM4v5vjdmRev) / Nvtmd); - here->BSIM4v5IVjdmRev = DrainSatCurrent * (1.0 + T1); - here->BSIM4v5DslpRev = -DrainSatCurrent * T1 / Nvtmd; - break; - default: - printf("Specified dioMod = %d not matched\n", model->BSIM4v5dioMod); - } - } - - /* GEDL current reverse bias */ - T0 = (TRatio - 1.0); - model->BSIM4v5njtstemp = model->BSIM4v5njts * (1.0 + model->BSIM4v5tnjts * T0); - model->BSIM4v5njtsswtemp = model->BSIM4v5njtssw * (1.0 + model->BSIM4v5tnjtssw * T0); - model->BSIM4v5njtsswgtemp = model->BSIM4v5njtsswg * (1.0 + model->BSIM4v5tnjtsswg * T0); - T7 = Eg0 / model->BSIM4v5vtm * T0; - T9 = model->BSIM4v5xtss * T7; - DEXP(T9, T1); - T9 = model->BSIM4v5xtsd * T7; - DEXP(T9, T2); - T9 = model->BSIM4v5xtssws * T7; - DEXP(T9, T3); - T9 = model->BSIM4v5xtsswd * T7; - DEXP(T9, T4); - T9 = model->BSIM4v5xtsswgs * T7; - DEXP(T9, T5); - T9 = model->BSIM4v5xtsswgd * T7; - DEXP(T9, T6); - - T10 = pParam->BSIM4v5weffCJ * here->BSIM4v5nf; - here->BSIM4v5SjctTempRevSatCur = T1 * here->BSIM4v5Aseff * model->BSIM4v5jtss; - here->BSIM4v5DjctTempRevSatCur = T2 * here->BSIM4v5Adeff * model->BSIM4v5jtsd; - here->BSIM4v5SswTempRevSatCur = T3 * here->BSIM4v5Pseff * model->BSIM4v5jtssws; - here->BSIM4v5DswTempRevSatCur = T4 * here->BSIM4v5Pdeff * model->BSIM4v5jtsswd; - here->BSIM4v5SswgTempRevSatCur = T5 * T10 * model->BSIM4v5jtsswgs; - here->BSIM4v5DswgTempRevSatCur = T6 * T10 * model->BSIM4v5jtsswgd; - - - if (BSIM4v5checkModel(model, here, ckt)) - { - SPfrontEnd->IFerrorf (ERR_FATAL, - "detected during BSIM4v5.5.0 parameter checking for \n model %s of device instance %s\n", model->BSIM4v5modName, here->BSIM4v5name); - return(E_BADPARM); - } - } /* End instance */ - } - return(OK); -} diff --git a/src/spicelib/devices/bsim4v5/b4v5trunc.c b/src/spicelib/devices/bsim4v5/b4v5trunc.c deleted file mode 100644 index 38fd89423..000000000 --- a/src/spicelib/devices/bsim4v5/b4v5trunc.c +++ /dev/null @@ -1,59 +0,0 @@ -/**** BSIM4.5.0 Released by Xuemei (Jane) Xi 07/29/2005 ****/ - -/********** - * Copyright 2004 Regents of the University of California. All rights reserved. - * File: b4trunc.c of BSIM4.5.0. - * Author: 2000 Weidong Liu - * Authors: 2001- Xuemei Xi, Mohan Dunga, Ali Niknejad, Chenming Hu. - * Project Director: Prof. Chenming Hu. - **********/ - -#include "ngspice/ngspice.h" -#include "ngspice/cktdefs.h" -#include "bsim4v5def.h" -#include "ngspice/sperror.h" -#include "ngspice/suffix.h" - - -int -BSIM4v5trunc( -GENmodel *inModel, -CKTcircuit *ckt, -double *timeStep) -{ -BSIM4v5model *model = (BSIM4v5model*)inModel; -BSIM4v5instance *here; - -#ifdef STEPDEBUG - double debugtemp; -#endif /* STEPDEBUG */ - - for (; model != NULL; model = BSIM4v5nextModel(model)) - { for (here = BSIM4v5instances(model); here != NULL; - here = BSIM4v5nextInstance(here)) - { - -#ifdef STEPDEBUG - debugtemp = *timeStep; -#endif /* STEPDEBUG */ - CKTterr(here->BSIM4v5qb,ckt,timeStep); - CKTterr(here->BSIM4v5qg,ckt,timeStep); - CKTterr(here->BSIM4v5qd,ckt,timeStep); - if (here->BSIM4v5trnqsMod) - CKTterr(here->BSIM4v5qcdump,ckt,timeStep); - if (here->BSIM4v5rbodyMod) - { CKTterr(here->BSIM4v5qbs,ckt,timeStep); - CKTterr(here->BSIM4v5qbd,ckt,timeStep); - } - if (here->BSIM4v5rgateMod == 3) - CKTterr(here->BSIM4v5qgmid,ckt,timeStep); -#ifdef STEPDEBUG - if(debugtemp != *timeStep) - { printf("device %s reduces step from %g to %g\n", - here->BSIM4v5name,debugtemp,*timeStep); - } -#endif /* STEPDEBUG */ - } - } - return(OK); -} diff --git a/src/spicelib/devices/bsim4v5/bsim4v5def.h b/src/spicelib/devices/bsim4v5/bsim4v5def.h deleted file mode 100644 index 443be7b02..000000000 --- a/src/spicelib/devices/bsim4v5/bsim4v5def.h +++ /dev/null @@ -1,3346 +0,0 @@ -/********** -Copyright 2005 Regents of the University of California. All rights reserved. -Author: 2000 Weidong Liu. -Modified by Xuemei Xi, 11/15/2002. -Modified by Xuemei Xi, 05/09/2003. -Modified by Xuemei Xi, 03/04/2004. -Modified by Xuemei Xi, Mohan Dunga, 09/24/2004. -Modified by Xuemei Xi, 07/29/2005. -File: bsim4v5def.h -**********/ - -#ifndef BSIM4V5 -#define BSIM4V5 - -#include "ngspice/ifsim.h" -#include "ngspice/gendefs.h" -#include "ngspice/cktdefs.h" -#include "ngspice/complex.h" -#include "ngspice/noisedef.h" - -typedef struct sBSIM4v5instance -{ - - struct GENinstance gen; - -#define BSIM4v5modPtr(inst) ((struct sBSIM4v5model *)((inst)->gen.GENmodPtr)) -#define BSIM4v5nextInstance(inst) ((struct sBSIM4v5instance *)((inst)->gen.GENnextInstance)) -#define BSIM4v5name gen.GENname -#define BSIM4v5states gen.GENstate - - const int BSIM4v5dNode; - const int BSIM4v5gNodeExt; - const int BSIM4v5sNode; - const int BSIM4v5bNode; - int BSIM4v5dNodePrime; - int BSIM4v5gNodePrime; - int BSIM4v5gNodeMid; - int BSIM4v5sNodePrime; - int BSIM4v5bNodePrime; - int BSIM4v5dbNode; - int BSIM4v5sbNode; - int BSIM4v5qNode; - - double BSIM4v5ueff; - double BSIM4v5thetavth; - double BSIM4v5von; - double BSIM4v5vdsat; - double BSIM4v5cgdo; - double BSIM4v5qgdo; - double BSIM4v5cgso; - double BSIM4v5qgso; - double BSIM4v5grbsb; - double BSIM4v5grbdb; - double BSIM4v5grbpb; - double BSIM4v5grbps; - double BSIM4v5grbpd; - - double BSIM4v5vjsmFwd; - double BSIM4v5vjsmRev; - double BSIM4v5vjdmFwd; - double BSIM4v5vjdmRev; - double BSIM4v5XExpBVS; - double BSIM4v5XExpBVD; - double BSIM4v5SslpFwd; - double BSIM4v5SslpRev; - double BSIM4v5DslpFwd; - double BSIM4v5DslpRev; - double BSIM4v5IVjsmFwd; - double BSIM4v5IVjsmRev; - double BSIM4v5IVjdmFwd; - double BSIM4v5IVjdmRev; - - double BSIM4v5grgeltd; - double BSIM4v5Pseff; - double BSIM4v5Pdeff; - double BSIM4v5Aseff; - double BSIM4v5Adeff; - - double BSIM4v5l; - double BSIM4v5w; - double BSIM4v5drainArea; - double BSIM4v5sourceArea; - double BSIM4v5drainSquares; - double BSIM4v5sourceSquares; - double BSIM4v5drainPerimeter; - double BSIM4v5sourcePerimeter; - double BSIM4v5sourceConductance; - double BSIM4v5drainConductance; - /* stress effect instance param */ - double BSIM4v5sa; - double BSIM4v5sb; - double BSIM4v5sd; - double BSIM4v5sca; - double BSIM4v5scb; - double BSIM4v5scc; - double BSIM4v5sc; - - double BSIM4v5rbdb; - double BSIM4v5rbsb; - double BSIM4v5rbpb; - double BSIM4v5rbps; - double BSIM4v5rbpd; - - double BSIM4v5delvto; - double BSIM4v5xgw; - double BSIM4v5ngcon; - - /* added here to account stress effect instance dependence */ - double BSIM4v5u0temp; - double BSIM4v5vsattemp; - double BSIM4v5vth0; - double BSIM4v5vfb; - double BSIM4v5vfbzb; - double BSIM4v5vtfbphi1; - double BSIM4v5vtfbphi2; - double BSIM4v5k2; - double BSIM4v5vbsc; - double BSIM4v5k2ox; - double BSIM4v5eta0; - - double BSIM4v5icVDS; - double BSIM4v5icVGS; - double BSIM4v5icVBS; - double BSIM4v5nf; - double BSIM4v5m; - int BSIM4v5off; - int BSIM4v5mode; - int BSIM4v5trnqsMod; - int BSIM4v5acnqsMod; - int BSIM4v5rbodyMod; - int BSIM4v5rgateMod; - int BSIM4v5geoMod; - int BSIM4v5rgeoMod; - int BSIM4v5min; - - - /* OP point */ - double BSIM4v5Vgsteff; - double BSIM4v5vgs_eff; - double BSIM4v5vgd_eff; - double BSIM4v5dvgs_eff_dvg; - double BSIM4v5dvgd_eff_dvg; - double BSIM4v5Vdseff; - double BSIM4v5nstar; - double BSIM4v5Abulk; - double BSIM4v5EsatL; - double BSIM4v5AbovVgst2Vtm; - double BSIM4v5qinv; - double BSIM4v5cd; - double BSIM4v5cbs; - double BSIM4v5cbd; - double BSIM4v5csub; - double BSIM4v5Igidl; - double BSIM4v5Igisl; - double BSIM4v5gm; - double BSIM4v5gds; - double BSIM4v5gmbs; - double BSIM4v5gbd; - double BSIM4v5gbs; - - double BSIM4v5gbbs; - double BSIM4v5gbgs; - double BSIM4v5gbds; - double BSIM4v5ggidld; - double BSIM4v5ggidlg; - double BSIM4v5ggidls; - double BSIM4v5ggidlb; - double BSIM4v5ggisld; - double BSIM4v5ggislg; - double BSIM4v5ggisls; - double BSIM4v5ggislb; - - double BSIM4v5Igcs; - double BSIM4v5gIgcsg; - double BSIM4v5gIgcsd; - double BSIM4v5gIgcss; - double BSIM4v5gIgcsb; - double BSIM4v5Igcd; - double BSIM4v5gIgcdg; - double BSIM4v5gIgcdd; - double BSIM4v5gIgcds; - double BSIM4v5gIgcdb; - - double BSIM4v5Igs; - double BSIM4v5gIgsg; - double BSIM4v5gIgss; - double BSIM4v5Igd; - double BSIM4v5gIgdg; - double BSIM4v5gIgdd; - - double BSIM4v5Igb; - double BSIM4v5gIgbg; - double BSIM4v5gIgbd; - double BSIM4v5gIgbs; - double BSIM4v5gIgbb; - - double BSIM4v5grdsw; - double BSIM4v5IdovVds; - double BSIM4v5gcrg; - double BSIM4v5gcrgd; - double BSIM4v5gcrgg; - double BSIM4v5gcrgs; - double BSIM4v5gcrgb; - - double BSIM4v5gstot; - double BSIM4v5gstotd; - double BSIM4v5gstotg; - double BSIM4v5gstots; - double BSIM4v5gstotb; - - double BSIM4v5gdtot; - double BSIM4v5gdtotd; - double BSIM4v5gdtotg; - double BSIM4v5gdtots; - double BSIM4v5gdtotb; - - double BSIM4v5cggb; - double BSIM4v5cgdb; - double BSIM4v5cgsb; - double BSIM4v5cbgb; - double BSIM4v5cbdb; - double BSIM4v5cbsb; - double BSIM4v5cdgb; - double BSIM4v5cddb; - double BSIM4v5cdsb; - double BSIM4v5csgb; - double BSIM4v5csdb; - double BSIM4v5cssb; - double BSIM4v5cgbb; - double BSIM4v5cdbb; - double BSIM4v5csbb; - double BSIM4v5cbbb; - double BSIM4v5capbd; - double BSIM4v5capbs; - - double BSIM4v5cqgb; - double BSIM4v5cqdb; - double BSIM4v5cqsb; - double BSIM4v5cqbb; - - double BSIM4v5qgate; - double BSIM4v5qbulk; - double BSIM4v5qdrn; - double BSIM4v5qsrc; - double BSIM4v5qdef; - - double BSIM4v5qchqs; - double BSIM4v5taunet; - double BSIM4v5gtau; - double BSIM4v5gtg; - double BSIM4v5gtd; - double BSIM4v5gts; - double BSIM4v5gtb; - double BSIM4v5SjctTempRevSatCur; - double BSIM4v5DjctTempRevSatCur; - double BSIM4v5SswTempRevSatCur; - double BSIM4v5DswTempRevSatCur; - double BSIM4v5SswgTempRevSatCur; - double BSIM4v5DswgTempRevSatCur; - - struct bsim4v5SizeDependParam *pParam; - - unsigned BSIM4v5lGiven :1; - unsigned BSIM4v5wGiven :1; - unsigned BSIM4v5mGiven :1; - unsigned BSIM4v5nfGiven :1; - unsigned BSIM4v5minGiven :1; - unsigned BSIM4v5drainAreaGiven :1; - unsigned BSIM4v5sourceAreaGiven :1; - unsigned BSIM4v5drainSquaresGiven :1; - unsigned BSIM4v5sourceSquaresGiven :1; - unsigned BSIM4v5drainPerimeterGiven :1; - unsigned BSIM4v5sourcePerimeterGiven :1; - unsigned BSIM4v5saGiven :1; - unsigned BSIM4v5sbGiven :1; - unsigned BSIM4v5sdGiven :1; - unsigned BSIM4v5scaGiven :1; - unsigned BSIM4v5scbGiven :1; - unsigned BSIM4v5sccGiven :1; - unsigned BSIM4v5scGiven :1; - unsigned BSIM4v5rbdbGiven :1; - unsigned BSIM4v5rbsbGiven :1; - unsigned BSIM4v5rbpbGiven :1; - unsigned BSIM4v5rbpdGiven :1; - unsigned BSIM4v5rbpsGiven :1; - unsigned BSIM4v5delvtoGiven :1; - unsigned BSIM4v5xgwGiven :1; - unsigned BSIM4v5ngconGiven :1; - unsigned BSIM4v5icVDSGiven :1; - unsigned BSIM4v5icVGSGiven :1; - unsigned BSIM4v5icVBSGiven :1; - unsigned BSIM4v5trnqsModGiven :1; - unsigned BSIM4v5acnqsModGiven :1; - unsigned BSIM4v5rbodyModGiven :1; - unsigned BSIM4v5rgateModGiven :1; - unsigned BSIM4v5geoModGiven :1; - unsigned BSIM4v5rgeoModGiven :1; - - - double *BSIM4v5DPdPtr; - double *BSIM4v5DPdpPtr; - double *BSIM4v5DPgpPtr; - double *BSIM4v5DPgmPtr; - double *BSIM4v5DPspPtr; - double *BSIM4v5DPbpPtr; - double *BSIM4v5DPdbPtr; - - double *BSIM4v5DdPtr; - double *BSIM4v5DdpPtr; - - double *BSIM4v5GPdpPtr; - double *BSIM4v5GPgpPtr; - double *BSIM4v5GPgmPtr; - double *BSIM4v5GPgePtr; - double *BSIM4v5GPspPtr; - double *BSIM4v5GPbpPtr; - - double *BSIM4v5GMdpPtr; - double *BSIM4v5GMgpPtr; - double *BSIM4v5GMgmPtr; - double *BSIM4v5GMgePtr; - double *BSIM4v5GMspPtr; - double *BSIM4v5GMbpPtr; - - double *BSIM4v5GEdpPtr; - double *BSIM4v5GEgpPtr; - double *BSIM4v5GEgmPtr; - double *BSIM4v5GEgePtr; - double *BSIM4v5GEspPtr; - double *BSIM4v5GEbpPtr; - - double *BSIM4v5SPdpPtr; - double *BSIM4v5SPgpPtr; - double *BSIM4v5SPgmPtr; - double *BSIM4v5SPsPtr; - double *BSIM4v5SPspPtr; - double *BSIM4v5SPbpPtr; - double *BSIM4v5SPsbPtr; - - double *BSIM4v5SspPtr; - double *BSIM4v5SsPtr; - - double *BSIM4v5BPdpPtr; - double *BSIM4v5BPgpPtr; - double *BSIM4v5BPgmPtr; - double *BSIM4v5BPspPtr; - double *BSIM4v5BPdbPtr; - double *BSIM4v5BPbPtr; - double *BSIM4v5BPsbPtr; - double *BSIM4v5BPbpPtr; - - double *BSIM4v5DBdpPtr; - double *BSIM4v5DBdbPtr; - double *BSIM4v5DBbpPtr; - double *BSIM4v5DBbPtr; - - double *BSIM4v5SBspPtr; - double *BSIM4v5SBbpPtr; - double *BSIM4v5SBbPtr; - double *BSIM4v5SBsbPtr; - - double *BSIM4v5BdbPtr; - double *BSIM4v5BbpPtr; - double *BSIM4v5BsbPtr; - double *BSIM4v5BbPtr; - - double *BSIM4v5DgpPtr; - double *BSIM4v5DspPtr; - double *BSIM4v5DbpPtr; - double *BSIM4v5SdpPtr; - double *BSIM4v5SgpPtr; - double *BSIM4v5SbpPtr; - - double *BSIM4v5QdpPtr; - double *BSIM4v5QgpPtr; - double *BSIM4v5QspPtr; - double *BSIM4v5QbpPtr; - double *BSIM4v5QqPtr; - double *BSIM4v5DPqPtr; - double *BSIM4v5GPqPtr; - double *BSIM4v5SPqPtr; - -#ifdef USE_OMP - /* per instance storage of results, to update matrix at a later stge */ - double BSIM4v5rhsdPrime; - double BSIM4v5rhsgPrime; - double BSIM4v5rhsgExt; - double BSIM4v5grhsMid; - double BSIM4v5rhsbPrime; - double BSIM4v5rhssPrime; - double BSIM4v5rhsdb; - double BSIM4v5rhssb; - double BSIM4v5rhsd; - double BSIM4v5rhss; - double BSIM4v5rhsq; - - double BSIM4v5_1; - double BSIM4v5_2; - double BSIM4v5_3; - double BSIM4v5_4; - double BSIM4v5_5; - double BSIM4v5_6; - double BSIM4v5_7; - double BSIM4v5_8; - double BSIM4v5_9; - double BSIM4v5_10; - double BSIM4v5_11; - double BSIM4v5_12; - double BSIM4v5_13; - double BSIM4v5_14; - double BSIM4v5_15; - double BSIM4v5_16; - double BSIM4v5_17; - double BSIM4v5_18; - double BSIM4v5_19; - double BSIM4v5_20; - double BSIM4v5_21; - double BSIM4v5_22; - double BSIM4v5_23; - double BSIM4v5_24; - double BSIM4v5_25; - double BSIM4v5_26; - double BSIM4v5_27; - double BSIM4v5_28; - double BSIM4v5_29; - double BSIM4v5_30; - double BSIM4v5_31; - double BSIM4v5_32; - double BSIM4v5_33; - double BSIM4v5_34; - double BSIM4v5_35; - double BSIM4v5_36; - double BSIM4v5_37; - double BSIM4v5_38; - double BSIM4v5_39; - double BSIM4v5_40; - double BSIM4v5_41; - double BSIM4v5_42; - double BSIM4v5_43; - double BSIM4v5_44; - double BSIM4v5_45; - double BSIM4v5_46; - double BSIM4v5_47; - double BSIM4v5_48; - double BSIM4v5_49; - double BSIM4v5_50; - double BSIM4v5_51; - double BSIM4v5_52; - double BSIM4v5_53; - double BSIM4v5_54; - double BSIM4v5_55; - double BSIM4v5_56; - double BSIM4v5_57; - double BSIM4v5_58; - double BSIM4v5_59; - double BSIM4v5_60; - double BSIM4v5_61; - double BSIM4v5_62; - double BSIM4v5_63; - double BSIM4v5_64; - double BSIM4v5_65; - double BSIM4v5_66; - double BSIM4v5_67; - double BSIM4v5_68; - double BSIM4v5_69; - double BSIM4v5_70; - double BSIM4v5_71; - double BSIM4v5_72; - double BSIM4v5_73; - double BSIM4v5_74; - double BSIM4v5_75; - double BSIM4v5_76; - double BSIM4v5_77; - double BSIM4v5_78; - double BSIM4v5_79; - double BSIM4v5_80; - double BSIM4v5_81; - double BSIM4v5_82; - double BSIM4v5_83; - double BSIM4v5_84; - double BSIM4v5_85; - double BSIM4v5_86; - double BSIM4v5_87; - double BSIM4v5_88; - double BSIM4v5_89; - double BSIM4v5_90; - double BSIM4v5_91; - double BSIM4v5_92; - double BSIM4v5_93; - double BSIM4v5_94; - double BSIM4v5_95; - double BSIM4v5_96; - double BSIM4v5_97; - double BSIM4v5_98; - double BSIM4v5_99; - double BSIM4v5_100; - double BSIM4v5_101; - double BSIM4v5_102; - double BSIM4v5_103; - -#endif - -#define BSIM4v5vbd BSIM4v5states+ 0 -#define BSIM4v5vbs BSIM4v5states+ 1 -#define BSIM4v5vgs BSIM4v5states+ 2 -#define BSIM4v5vds BSIM4v5states+ 3 -#define BSIM4v5vdbs BSIM4v5states+ 4 -#define BSIM4v5vdbd BSIM4v5states+ 5 -#define BSIM4v5vsbs BSIM4v5states+ 6 -#define BSIM4v5vges BSIM4v5states+ 7 -#define BSIM4v5vgms BSIM4v5states+ 8 -#define BSIM4v5vses BSIM4v5states+ 9 -#define BSIM4v5vdes BSIM4v5states+ 10 - -#define BSIM4v5qb BSIM4v5states+ 11 -#define BSIM4v5cqb BSIM4v5states+ 12 -#define BSIM4v5qg BSIM4v5states+ 13 -#define BSIM4v5cqg BSIM4v5states+ 14 -#define BSIM4v5qd BSIM4v5states+ 15 -#define BSIM4v5cqd BSIM4v5states+ 16 -#define BSIM4v5qgmid BSIM4v5states+ 17 -#define BSIM4v5cqgmid BSIM4v5states+ 18 - -#define BSIM4v5qbs BSIM4v5states+ 19 -#define BSIM4v5cqbs BSIM4v5states+ 20 -#define BSIM4v5qbd BSIM4v5states+ 21 -#define BSIM4v5cqbd BSIM4v5states+ 22 - -#define BSIM4v5qcheq BSIM4v5states+ 23 -#define BSIM4v5cqcheq BSIM4v5states+ 24 -#define BSIM4v5qcdump BSIM4v5states+ 25 -#define BSIM4v5cqcdump BSIM4v5states+ 26 -#define BSIM4v5qdef BSIM4v5states+ 27 -#define BSIM4v5qs BSIM4v5states+ 28 - -#define BSIM4v5numStates 29 - - -/* indices to the array of BSIM4v5 NOISE SOURCES */ - -#define BSIM4v5RDNOIZ 0 -#define BSIM4v5RSNOIZ 1 -#define BSIM4v5RGNOIZ 2 -#define BSIM4v5RBPSNOIZ 3 -#define BSIM4v5RBPDNOIZ 4 -#define BSIM4v5RBPBNOIZ 5 -#define BSIM4v5RBSBNOIZ 6 -#define BSIM4v5RBDBNOIZ 7 -#define BSIM4v5IDNOIZ 8 -#define BSIM4v5FLNOIZ 9 -#define BSIM4v5IGSNOIZ 10 -#define BSIM4v5IGDNOIZ 11 -#define BSIM4v5IGBNOIZ 12 -#define BSIM4v5TOTNOIZ 13 - -#define BSIM4v5NSRCS 14 /* Number of BSIM4v5 noise sources */ - -#ifndef NONOISE - double BSIM4v5nVar[NSTATVARS][BSIM4v5NSRCS]; -#else /* NONOISE */ - double **BSIM4v5nVar; -#endif /* NONOISE */ - -} BSIM4v5instance ; - -struct bsim4v5SizeDependParam -{ - double Width; - double Length; - double NFinger; - - double BSIM4v5cdsc; - double BSIM4v5cdscb; - double BSIM4v5cdscd; - double BSIM4v5cit; - double BSIM4v5nfactor; - double BSIM4v5xj; - double BSIM4v5vsat; - double BSIM4v5at; - double BSIM4v5a0; - double BSIM4v5ags; - double BSIM4v5a1; - double BSIM4v5a2; - double BSIM4v5keta; - double BSIM4v5nsub; - double BSIM4v5ndep; - double BSIM4v5nsd; - double BSIM4v5phin; - double BSIM4v5ngate; - double BSIM4v5gamma1; - double BSIM4v5gamma2; - double BSIM4v5vbx; - double BSIM4v5vbi; - double BSIM4v5vbm; - double BSIM4v5xt; - double BSIM4v5phi; - double BSIM4v5litl; - double BSIM4v5k1; - double BSIM4v5kt1; - double BSIM4v5kt1l; - double BSIM4v5kt2; - double BSIM4v5k2; - double BSIM4v5k3; - double BSIM4v5k3b; - double BSIM4v5w0; - double BSIM4v5dvtp0; - double BSIM4v5dvtp1; - double BSIM4v5lpe0; - double BSIM4v5lpeb; - double BSIM4v5dvt0; - double BSIM4v5dvt1; - double BSIM4v5dvt2; - double BSIM4v5dvt0w; - double BSIM4v5dvt1w; - double BSIM4v5dvt2w; - double BSIM4v5drout; - double BSIM4v5dsub; - double BSIM4v5vth0; - double BSIM4v5ua; - double BSIM4v5ua1; - double BSIM4v5ub; - double BSIM4v5ub1; - double BSIM4v5uc; - double BSIM4v5uc1; - double BSIM4v5ud; - double BSIM4v5ud1; - double BSIM4v5up; - double BSIM4v5lp; - double BSIM4v5u0; - double BSIM4v5eu; - double BSIM4v5ute; - double BSIM4v5voff; - double BSIM4v5tvoff; - double BSIM4v5minv; - double BSIM4v5vfb; - double BSIM4v5delta; - double BSIM4v5rdsw; - double BSIM4v5rds0; - double BSIM4v5rs0; - double BSIM4v5rd0; - double BSIM4v5rsw; - double BSIM4v5rdw; - double BSIM4v5prwg; - double BSIM4v5prwb; - double BSIM4v5prt; - double BSIM4v5eta0; - double BSIM4v5etab; - double BSIM4v5pclm; - double BSIM4v5pdibl1; - double BSIM4v5pdibl2; - double BSIM4v5pdiblb; - double BSIM4v5fprout; - double BSIM4v5pdits; - double BSIM4v5pditsd; - double BSIM4v5pscbe1; - double BSIM4v5pscbe2; - double BSIM4v5pvag; - double BSIM4v5wr; - double BSIM4v5dwg; - double BSIM4v5dwb; - double BSIM4v5b0; - double BSIM4v5b1; - double BSIM4v5alpha0; - double BSIM4v5alpha1; - double BSIM4v5beta0; - double BSIM4v5agidl; - double BSIM4v5bgidl; - double BSIM4v5cgidl; - double BSIM4v5egidl; - double BSIM4v5aigc; - double BSIM4v5bigc; - double BSIM4v5cigc; - double BSIM4v5aigsd; - double BSIM4v5bigsd; - double BSIM4v5cigsd; - double BSIM4v5aigbacc; - double BSIM4v5bigbacc; - double BSIM4v5cigbacc; - double BSIM4v5aigbinv; - double BSIM4v5bigbinv; - double BSIM4v5cigbinv; - double BSIM4v5nigc; - double BSIM4v5nigbacc; - double BSIM4v5nigbinv; - double BSIM4v5ntox; - double BSIM4v5eigbinv; - double BSIM4v5pigcd; - double BSIM4v5poxedge; - double BSIM4v5xrcrg1; - double BSIM4v5xrcrg2; - double BSIM4v5lambda; /* overshoot */ - double BSIM4v5vtl; /* thermal velocity limit */ - double BSIM4v5xn; /* back scattering parameter */ - double BSIM4v5lc; /* back scattering parameter */ - double BSIM4v5tfactor; /* ballistic transportation factor */ - double BSIM4v5vfbsdoff; /* S/D flatband offset voltage */ - double BSIM4v5tvfbsdoff; - -/* added for stress effect */ - double BSIM4v5ku0; - double BSIM4v5kvth0; - double BSIM4v5ku0temp; - double BSIM4v5rho_ref; - double BSIM4v5inv_od_ref; -/* added for well proximity effect */ - double BSIM4v5kvth0we; - double BSIM4v5k2we; - double BSIM4v5ku0we; - - /* CV model */ - double BSIM4v5cgsl; - double BSIM4v5cgdl; - double BSIM4v5ckappas; - double BSIM4v5ckappad; - double BSIM4v5cf; - double BSIM4v5clc; - double BSIM4v5cle; - double BSIM4v5vfbcv; - double BSIM4v5noff; - double BSIM4v5voffcv; - double BSIM4v5acde; - double BSIM4v5moin; - -/* Pre-calculated constants */ - - double BSIM4v5dw; - double BSIM4v5dl; - double BSIM4v5leff; - double BSIM4v5weff; - - double BSIM4v5dwc; - double BSIM4v5dlc; - double BSIM4v5dlcig; - double BSIM4v5dwj; - double BSIM4v5leffCV; - double BSIM4v5weffCV; - double BSIM4v5weffCJ; - double BSIM4v5abulkCVfactor; - double BSIM4v5cgso; - double BSIM4v5cgdo; - double BSIM4v5cgbo; - - double BSIM4v5u0temp; - double BSIM4v5vsattemp; - double BSIM4v5sqrtPhi; - double BSIM4v5phis3; - double BSIM4v5Xdep0; - double BSIM4v5sqrtXdep0; - double BSIM4v5theta0vb0; - double BSIM4v5thetaRout; - double BSIM4v5mstar; - double BSIM4v5voffcbn; - double BSIM4v5rdswmin; - double BSIM4v5rdwmin; - double BSIM4v5rswmin; - double BSIM4v5vfbsd; - - double BSIM4v5cof1; - double BSIM4v5cof2; - double BSIM4v5cof3; - double BSIM4v5cof4; - double BSIM4v5cdep0; - double BSIM4v5ToxRatio; - double BSIM4v5Aechvb; - double BSIM4v5Bechvb; - double BSIM4v5ToxRatioEdge; - double BSIM4v5AechvbEdge; - double BSIM4v5BechvbEdge; - double BSIM4v5ldeb; - double BSIM4v5k1ox; - double BSIM4v5k2ox; - double BSIM4v5vfbzbfactor; - - - struct bsim4v5SizeDependParam *pNext; -}; - - -typedef struct sBSIM4v5model -{ - - struct GENmodel gen; - -#define BSIM4v5modType gen.GENmodType -#define BSIM4v5nextModel(inst) ((struct sBSIM4v5model *)((inst)->gen.GENnextModel)) -#define BSIM4v5instances(inst) ((BSIM4v5instance *)((inst)->gen.GENinstances)) -#define BSIM4v5modName gen.GENmodName - - int BSIM4v5type; - - int BSIM4v5mobMod; - int BSIM4v5capMod; - int BSIM4v5dioMod; - int BSIM4v5trnqsMod; - int BSIM4v5acnqsMod; - int BSIM4v5fnoiMod; - int BSIM4v5tnoiMod; - int BSIM4v5rdsMod; - int BSIM4v5rbodyMod; - int BSIM4v5rgateMod; - int BSIM4v5perMod; - int BSIM4v5geoMod; - int BSIM4v5rgeoMod; - int BSIM4v5igcMod; - int BSIM4v5igbMod; - int BSIM4v5tempMod; - int BSIM4v5binUnit; - int BSIM4v5paramChk; - char *BSIM4v5version; - double BSIM4v5toxe; - double BSIM4v5toxp; - double BSIM4v5toxm; - double BSIM4v5dtox; - double BSIM4v5epsrox; - double BSIM4v5cdsc; - double BSIM4v5cdscb; - double BSIM4v5cdscd; - double BSIM4v5cit; - double BSIM4v5nfactor; - double BSIM4v5xj; - double BSIM4v5vsat; - double BSIM4v5at; - double BSIM4v5a0; - double BSIM4v5ags; - double BSIM4v5a1; - double BSIM4v5a2; - double BSIM4v5keta; - double BSIM4v5nsub; - double BSIM4v5ndep; - double BSIM4v5nsd; - double BSIM4v5phin; - double BSIM4v5ngate; - double BSIM4v5gamma1; - double BSIM4v5gamma2; - double BSIM4v5vbx; - double BSIM4v5vbm; - double BSIM4v5xt; - double BSIM4v5k1; - double BSIM4v5kt1; - double BSIM4v5kt1l; - double BSIM4v5kt2; - double BSIM4v5k2; - double BSIM4v5k3; - double BSIM4v5k3b; - double BSIM4v5w0; - double BSIM4v5dvtp0; - double BSIM4v5dvtp1; - double BSIM4v5lpe0; - double BSIM4v5lpeb; - double BSIM4v5dvt0; - double BSIM4v5dvt1; - double BSIM4v5dvt2; - double BSIM4v5dvt0w; - double BSIM4v5dvt1w; - double BSIM4v5dvt2w; - double BSIM4v5drout; - double BSIM4v5dsub; - double BSIM4v5vth0; - double BSIM4v5eu; - double BSIM4v5ua; - double BSIM4v5ua1; - double BSIM4v5ub; - double BSIM4v5ub1; - double BSIM4v5uc; - double BSIM4v5uc1; - double BSIM4v5ud; - double BSIM4v5ud1; - double BSIM4v5up; - double BSIM4v5lp; - double BSIM4v5u0; - double BSIM4v5ute; - double BSIM4v5voff; - double BSIM4v5tvoff; - double BSIM4v5minv; - double BSIM4v5voffl; - double BSIM4v5delta; - double BSIM4v5rdsw; - double BSIM4v5rdswmin; - double BSIM4v5rdwmin; - double BSIM4v5rswmin; - double BSIM4v5rsw; - double BSIM4v5rdw; - double BSIM4v5prwg; - double BSIM4v5prwb; - double BSIM4v5prt; - double BSIM4v5eta0; - double BSIM4v5etab; - double BSIM4v5pclm; - double BSIM4v5pdibl1; - double BSIM4v5pdibl2; - double BSIM4v5pdiblb; - double BSIM4v5fprout; - double BSIM4v5pdits; - double BSIM4v5pditsd; - double BSIM4v5pditsl; - double BSIM4v5pscbe1; - double BSIM4v5pscbe2; - double BSIM4v5pvag; - double BSIM4v5wr; - double BSIM4v5dwg; - double BSIM4v5dwb; - double BSIM4v5b0; - double BSIM4v5b1; - double BSIM4v5alpha0; - double BSIM4v5alpha1; - double BSIM4v5beta0; - double BSIM4v5agidl; - double BSIM4v5bgidl; - double BSIM4v5cgidl; - double BSIM4v5egidl; - double BSIM4v5aigc; - double BSIM4v5bigc; - double BSIM4v5cigc; - double BSIM4v5aigsd; - double BSIM4v5bigsd; - double BSIM4v5cigsd; - double BSIM4v5aigbacc; - double BSIM4v5bigbacc; - double BSIM4v5cigbacc; - double BSIM4v5aigbinv; - double BSIM4v5bigbinv; - double BSIM4v5cigbinv; - double BSIM4v5nigc; - double BSIM4v5nigbacc; - double BSIM4v5nigbinv; - double BSIM4v5ntox; - double BSIM4v5eigbinv; - double BSIM4v5pigcd; - double BSIM4v5poxedge; - double BSIM4v5toxref; - double BSIM4v5ijthdfwd; - double BSIM4v5ijthsfwd; - double BSIM4v5ijthdrev; - double BSIM4v5ijthsrev; - double BSIM4v5xjbvd; - double BSIM4v5xjbvs; - double BSIM4v5bvd; - double BSIM4v5bvs; - - double BSIM4v5jtss; - double BSIM4v5jtsd; - double BSIM4v5jtssws; - double BSIM4v5jtsswd; - double BSIM4v5jtsswgs; - double BSIM4v5jtsswgd; - double BSIM4v5njts; - double BSIM4v5njtssw; - double BSIM4v5njtsswg; - double BSIM4v5xtss; - double BSIM4v5xtsd; - double BSIM4v5xtssws; - double BSIM4v5xtsswd; - double BSIM4v5xtsswgs; - double BSIM4v5xtsswgd; - double BSIM4v5tnjts; - double BSIM4v5tnjtssw; - double BSIM4v5tnjtsswg; - double BSIM4v5vtss; - double BSIM4v5vtsd; - double BSIM4v5vtssws; - double BSIM4v5vtsswd; - double BSIM4v5vtsswgs; - double BSIM4v5vtsswgd; - - double BSIM4v5xrcrg1; - double BSIM4v5xrcrg2; - double BSIM4v5lambda; - double BSIM4v5vtl; - double BSIM4v5lc; - double BSIM4v5xn; - double BSIM4v5vfbsdoff; /* S/D flatband offset voltage */ - double BSIM4v5lintnoi; /* lint offset for noise calculation */ - double BSIM4v5tvfbsdoff; - - double BSIM4v5vfb; - double BSIM4v5gbmin; - double BSIM4v5rbdb; - double BSIM4v5rbsb; - double BSIM4v5rbpb; - double BSIM4v5rbps; - double BSIM4v5rbpd; - - double BSIM4v5rbps0; - double BSIM4v5rbpsl; - double BSIM4v5rbpsw; - double BSIM4v5rbpsnf; - - double BSIM4v5rbpd0; - double BSIM4v5rbpdl; - double BSIM4v5rbpdw; - double BSIM4v5rbpdnf; - - double BSIM4v5rbpbx0; - double BSIM4v5rbpbxl; - double BSIM4v5rbpbxw; - double BSIM4v5rbpbxnf; - double BSIM4v5rbpby0; - double BSIM4v5rbpbyl; - double BSIM4v5rbpbyw; - double BSIM4v5rbpbynf; - - double BSIM4v5rbsbx0; - double BSIM4v5rbsby0; - double BSIM4v5rbdbx0; - double BSIM4v5rbdby0; - - double BSIM4v5rbsdbxl; - double BSIM4v5rbsdbxw; - double BSIM4v5rbsdbxnf; - double BSIM4v5rbsdbyl; - double BSIM4v5rbsdbyw; - double BSIM4v5rbsdbynf; - - double BSIM4v5tnoia; - double BSIM4v5tnoib; - double BSIM4v5rnoia; - double BSIM4v5rnoib; - double BSIM4v5ntnoi; - - /* CV model and Parasitics */ - double BSIM4v5cgsl; - double BSIM4v5cgdl; - double BSIM4v5ckappas; - double BSIM4v5ckappad; - double BSIM4v5cf; - double BSIM4v5vfbcv; - double BSIM4v5clc; - double BSIM4v5cle; - double BSIM4v5dwc; - double BSIM4v5dlc; - double BSIM4v5xw; - double BSIM4v5xl; - double BSIM4v5dlcig; - double BSIM4v5dwj; - double BSIM4v5noff; - double BSIM4v5voffcv; - double BSIM4v5acde; - double BSIM4v5moin; - double BSIM4v5tcj; - double BSIM4v5tcjsw; - double BSIM4v5tcjswg; - double BSIM4v5tpb; - double BSIM4v5tpbsw; - double BSIM4v5tpbswg; - double BSIM4v5dmcg; - double BSIM4v5dmci; - double BSIM4v5dmdg; - double BSIM4v5dmcgt; - double BSIM4v5xgw; - double BSIM4v5xgl; - double BSIM4v5rshg; - double BSIM4v5ngcon; - - /* Length Dependence */ - double BSIM4v5lcdsc; - double BSIM4v5lcdscb; - double BSIM4v5lcdscd; - double BSIM4v5lcit; - double BSIM4v5lnfactor; - double BSIM4v5lxj; - double BSIM4v5lvsat; - double BSIM4v5lat; - double BSIM4v5la0; - double BSIM4v5lags; - double BSIM4v5la1; - double BSIM4v5la2; - double BSIM4v5lketa; - double BSIM4v5lnsub; - double BSIM4v5lndep; - double BSIM4v5lnsd; - double BSIM4v5lphin; - double BSIM4v5lngate; - double BSIM4v5lgamma1; - double BSIM4v5lgamma2; - double BSIM4v5lvbx; - double BSIM4v5lvbm; - double BSIM4v5lxt; - double BSIM4v5lk1; - double BSIM4v5lkt1; - double BSIM4v5lkt1l; - double BSIM4v5lkt2; - double BSIM4v5lk2; - double BSIM4v5lk3; - double BSIM4v5lk3b; - double BSIM4v5lw0; - double BSIM4v5ldvtp0; - double BSIM4v5ldvtp1; - double BSIM4v5llpe0; - double BSIM4v5llpeb; - double BSIM4v5ldvt0; - double BSIM4v5ldvt1; - double BSIM4v5ldvt2; - double BSIM4v5ldvt0w; - double BSIM4v5ldvt1w; - double BSIM4v5ldvt2w; - double BSIM4v5ldrout; - double BSIM4v5ldsub; - double BSIM4v5lvth0; - double BSIM4v5lua; - double BSIM4v5lua1; - double BSIM4v5lub; - double BSIM4v5lub1; - double BSIM4v5luc; - double BSIM4v5luc1; - double BSIM4v5lud; - double BSIM4v5lud1; - double BSIM4v5lup; - double BSIM4v5llp; - double BSIM4v5lu0; - double BSIM4v5leu; - double BSIM4v5lute; - double BSIM4v5lvoff; - double BSIM4v5ltvoff; - double BSIM4v5lminv; - double BSIM4v5ldelta; - double BSIM4v5lrdsw; - double BSIM4v5lrsw; - double BSIM4v5lrdw; - double BSIM4v5lprwg; - double BSIM4v5lprwb; - double BSIM4v5lprt; - double BSIM4v5leta0; - double BSIM4v5letab; - double BSIM4v5lpclm; - double BSIM4v5lpdibl1; - double BSIM4v5lpdibl2; - double BSIM4v5lpdiblb; - double BSIM4v5lfprout; - double BSIM4v5lpdits; - double BSIM4v5lpditsd; - double BSIM4v5lpscbe1; - double BSIM4v5lpscbe2; - double BSIM4v5lpvag; - double BSIM4v5lwr; - double BSIM4v5ldwg; - double BSIM4v5ldwb; - double BSIM4v5lb0; - double BSIM4v5lb1; - double BSIM4v5lalpha0; - double BSIM4v5lalpha1; - double BSIM4v5lbeta0; - double BSIM4v5lvfb; - double BSIM4v5lagidl; - double BSIM4v5lbgidl; - double BSIM4v5lcgidl; - double BSIM4v5legidl; - double BSIM4v5laigc; - double BSIM4v5lbigc; - double BSIM4v5lcigc; - double BSIM4v5laigsd; - double BSIM4v5lbigsd; - double BSIM4v5lcigsd; - double BSIM4v5laigbacc; - double BSIM4v5lbigbacc; - double BSIM4v5lcigbacc; - double BSIM4v5laigbinv; - double BSIM4v5lbigbinv; - double BSIM4v5lcigbinv; - double BSIM4v5lnigc; - double BSIM4v5lnigbacc; - double BSIM4v5lnigbinv; - double BSIM4v5lntox; - double BSIM4v5leigbinv; - double BSIM4v5lpigcd; - double BSIM4v5lpoxedge; - double BSIM4v5lxrcrg1; - double BSIM4v5lxrcrg2; - double BSIM4v5llambda; - double BSIM4v5lvtl; - double BSIM4v5lxn; - double BSIM4v5lvfbsdoff; - double BSIM4v5ltvfbsdoff; - - /* CV model */ - double BSIM4v5lcgsl; - double BSIM4v5lcgdl; - double BSIM4v5lckappas; - double BSIM4v5lckappad; - double BSIM4v5lcf; - double BSIM4v5lclc; - double BSIM4v5lcle; - double BSIM4v5lvfbcv; - double BSIM4v5lnoff; - double BSIM4v5lvoffcv; - double BSIM4v5lacde; - double BSIM4v5lmoin; - - /* Width Dependence */ - double BSIM4v5wcdsc; - double BSIM4v5wcdscb; - double BSIM4v5wcdscd; - double BSIM4v5wcit; - double BSIM4v5wnfactor; - double BSIM4v5wxj; - double BSIM4v5wvsat; - double BSIM4v5wat; - double BSIM4v5wa0; - double BSIM4v5wags; - double BSIM4v5wa1; - double BSIM4v5wa2; - double BSIM4v5wketa; - double BSIM4v5wnsub; - double BSIM4v5wndep; - double BSIM4v5wnsd; - double BSIM4v5wphin; - double BSIM4v5wngate; - double BSIM4v5wgamma1; - double BSIM4v5wgamma2; - double BSIM4v5wvbx; - double BSIM4v5wvbm; - double BSIM4v5wxt; - double BSIM4v5wk1; - double BSIM4v5wkt1; - double BSIM4v5wkt1l; - double BSIM4v5wkt2; - double BSIM4v5wk2; - double BSIM4v5wk3; - double BSIM4v5wk3b; - double BSIM4v5ww0; - double BSIM4v5wdvtp0; - double BSIM4v5wdvtp1; - double BSIM4v5wlpe0; - double BSIM4v5wlpeb; - double BSIM4v5wdvt0; - double BSIM4v5wdvt1; - double BSIM4v5wdvt2; - double BSIM4v5wdvt0w; - double BSIM4v5wdvt1w; - double BSIM4v5wdvt2w; - double BSIM4v5wdrout; - double BSIM4v5wdsub; - double BSIM4v5wvth0; - double BSIM4v5wua; - double BSIM4v5wua1; - double BSIM4v5wub; - double BSIM4v5wub1; - double BSIM4v5wuc; - double BSIM4v5wuc1; - double BSIM4v5wud; - double BSIM4v5wud1; - double BSIM4v5wup; - double BSIM4v5wlp; - double BSIM4v5wu0; - double BSIM4v5weu; - double BSIM4v5wute; - double BSIM4v5wvoff; - double BSIM4v5wtvoff; - double BSIM4v5wminv; - double BSIM4v5wdelta; - double BSIM4v5wrdsw; - double BSIM4v5wrsw; - double BSIM4v5wrdw; - double BSIM4v5wprwg; - double BSIM4v5wprwb; - double BSIM4v5wprt; - double BSIM4v5weta0; - double BSIM4v5wetab; - double BSIM4v5wpclm; - double BSIM4v5wpdibl1; - double BSIM4v5wpdibl2; - double BSIM4v5wpdiblb; - double BSIM4v5wfprout; - double BSIM4v5wpdits; - double BSIM4v5wpditsd; - double BSIM4v5wpscbe1; - double BSIM4v5wpscbe2; - double BSIM4v5wpvag; - double BSIM4v5wwr; - double BSIM4v5wdwg; - double BSIM4v5wdwb; - double BSIM4v5wb0; - double BSIM4v5wb1; - double BSIM4v5walpha0; - double BSIM4v5walpha1; - double BSIM4v5wbeta0; - double BSIM4v5wvfb; - double BSIM4v5wagidl; - double BSIM4v5wbgidl; - double BSIM4v5wcgidl; - double BSIM4v5wegidl; - double BSIM4v5waigc; - double BSIM4v5wbigc; - double BSIM4v5wcigc; - double BSIM4v5waigsd; - double BSIM4v5wbigsd; - double BSIM4v5wcigsd; - double BSIM4v5waigbacc; - double BSIM4v5wbigbacc; - double BSIM4v5wcigbacc; - double BSIM4v5waigbinv; - double BSIM4v5wbigbinv; - double BSIM4v5wcigbinv; - double BSIM4v5wnigc; - double BSIM4v5wnigbacc; - double BSIM4v5wnigbinv; - double BSIM4v5wntox; - double BSIM4v5weigbinv; - double BSIM4v5wpigcd; - double BSIM4v5wpoxedge; - double BSIM4v5wxrcrg1; - double BSIM4v5wxrcrg2; - double BSIM4v5wlambda; - double BSIM4v5wvtl; - double BSIM4v5wxn; - double BSIM4v5wvfbsdoff; - double BSIM4v5wtvfbsdoff; - - /* CV model */ - double BSIM4v5wcgsl; - double BSIM4v5wcgdl; - double BSIM4v5wckappas; - double BSIM4v5wckappad; - double BSIM4v5wcf; - double BSIM4v5wclc; - double BSIM4v5wcle; - double BSIM4v5wvfbcv; - double BSIM4v5wnoff; - double BSIM4v5wvoffcv; - double BSIM4v5wacde; - double BSIM4v5wmoin; - - /* Cross-term Dependence */ - double BSIM4v5pcdsc; - double BSIM4v5pcdscb; - double BSIM4v5pcdscd; - double BSIM4v5pcit; - double BSIM4v5pnfactor; - double BSIM4v5pxj; - double BSIM4v5pvsat; - double BSIM4v5pat; - double BSIM4v5pa0; - double BSIM4v5pags; - double BSIM4v5pa1; - double BSIM4v5pa2; - double BSIM4v5pketa; - double BSIM4v5pnsub; - double BSIM4v5pndep; - double BSIM4v5pnsd; - double BSIM4v5pphin; - double BSIM4v5pngate; - double BSIM4v5pgamma1; - double BSIM4v5pgamma2; - double BSIM4v5pvbx; - double BSIM4v5pvbm; - double BSIM4v5pxt; - double BSIM4v5pk1; - double BSIM4v5pkt1; - double BSIM4v5pkt1l; - double BSIM4v5pkt2; - double BSIM4v5pk2; - double BSIM4v5pk3; - double BSIM4v5pk3b; - double BSIM4v5pw0; - double BSIM4v5pdvtp0; - double BSIM4v5pdvtp1; - double BSIM4v5plpe0; - double BSIM4v5plpeb; - double BSIM4v5pdvt0; - double BSIM4v5pdvt1; - double BSIM4v5pdvt2; - double BSIM4v5pdvt0w; - double BSIM4v5pdvt1w; - double BSIM4v5pdvt2w; - double BSIM4v5pdrout; - double BSIM4v5pdsub; - double BSIM4v5pvth0; - double BSIM4v5pua; - double BSIM4v5pua1; - double BSIM4v5pub; - double BSIM4v5pub1; - double BSIM4v5puc; - double BSIM4v5puc1; - double BSIM4v5pud; - double BSIM4v5pud1; - double BSIM4v5pup; - double BSIM4v5plp; - double BSIM4v5pu0; - double BSIM4v5peu; - double BSIM4v5pute; - double BSIM4v5pvoff; - double BSIM4v5ptvoff; - double BSIM4v5pminv; - double BSIM4v5pdelta; - double BSIM4v5prdsw; - double BSIM4v5prsw; - double BSIM4v5prdw; - double BSIM4v5pprwg; - double BSIM4v5pprwb; - double BSIM4v5pprt; - double BSIM4v5peta0; - double BSIM4v5petab; - double BSIM4v5ppclm; - double BSIM4v5ppdibl1; - double BSIM4v5ppdibl2; - double BSIM4v5ppdiblb; - double BSIM4v5pfprout; - double BSIM4v5ppdits; - double BSIM4v5ppditsd; - double BSIM4v5ppscbe1; - double BSIM4v5ppscbe2; - double BSIM4v5ppvag; - double BSIM4v5pwr; - double BSIM4v5pdwg; - double BSIM4v5pdwb; - double BSIM4v5pb0; - double BSIM4v5pb1; - double BSIM4v5palpha0; - double BSIM4v5palpha1; - double BSIM4v5pbeta0; - double BSIM4v5pvfb; - double BSIM4v5pagidl; - double BSIM4v5pbgidl; - double BSIM4v5pcgidl; - double BSIM4v5pegidl; - double BSIM4v5paigc; - double BSIM4v5pbigc; - double BSIM4v5pcigc; - double BSIM4v5paigsd; - double BSIM4v5pbigsd; - double BSIM4v5pcigsd; - double BSIM4v5paigbacc; - double BSIM4v5pbigbacc; - double BSIM4v5pcigbacc; - double BSIM4v5paigbinv; - double BSIM4v5pbigbinv; - double BSIM4v5pcigbinv; - double BSIM4v5pnigc; - double BSIM4v5pnigbacc; - double BSIM4v5pnigbinv; - double BSIM4v5pntox; - double BSIM4v5peigbinv; - double BSIM4v5ppigcd; - double BSIM4v5ppoxedge; - double BSIM4v5pxrcrg1; - double BSIM4v5pxrcrg2; - double BSIM4v5plambda; - double BSIM4v5pvtl; - double BSIM4v5pxn; - double BSIM4v5pvfbsdoff; - double BSIM4v5ptvfbsdoff; - - /* CV model */ - double BSIM4v5pcgsl; - double BSIM4v5pcgdl; - double BSIM4v5pckappas; - double BSIM4v5pckappad; - double BSIM4v5pcf; - double BSIM4v5pclc; - double BSIM4v5pcle; - double BSIM4v5pvfbcv; - double BSIM4v5pnoff; - double BSIM4v5pvoffcv; - double BSIM4v5pacde; - double BSIM4v5pmoin; - - double BSIM4v5tnom; - double BSIM4v5cgso; - double BSIM4v5cgdo; - double BSIM4v5cgbo; - double BSIM4v5xpart; - double BSIM4v5cFringOut; - double BSIM4v5cFringMax; - - double BSIM4v5sheetResistance; - double BSIM4v5SjctSatCurDensity; - double BSIM4v5DjctSatCurDensity; - double BSIM4v5SjctSidewallSatCurDensity; - double BSIM4v5DjctSidewallSatCurDensity; - double BSIM4v5SjctGateSidewallSatCurDensity; - double BSIM4v5DjctGateSidewallSatCurDensity; - double BSIM4v5SbulkJctPotential; - double BSIM4v5DbulkJctPotential; - double BSIM4v5SbulkJctBotGradingCoeff; - double BSIM4v5DbulkJctBotGradingCoeff; - double BSIM4v5SbulkJctSideGradingCoeff; - double BSIM4v5DbulkJctSideGradingCoeff; - double BSIM4v5SbulkJctGateSideGradingCoeff; - double BSIM4v5DbulkJctGateSideGradingCoeff; - double BSIM4v5SsidewallJctPotential; - double BSIM4v5DsidewallJctPotential; - double BSIM4v5SGatesidewallJctPotential; - double BSIM4v5DGatesidewallJctPotential; - double BSIM4v5SunitAreaJctCap; - double BSIM4v5DunitAreaJctCap; - double BSIM4v5SunitLengthSidewallJctCap; - double BSIM4v5DunitLengthSidewallJctCap; - double BSIM4v5SunitLengthGateSidewallJctCap; - double BSIM4v5DunitLengthGateSidewallJctCap; - double BSIM4v5SjctEmissionCoeff; - double BSIM4v5DjctEmissionCoeff; - double BSIM4v5SjctTempExponent; - double BSIM4v5DjctTempExponent; - double BSIM4v5njtstemp; - double BSIM4v5njtsswtemp; - double BSIM4v5njtsswgtemp; - - double BSIM4v5Lint; - double BSIM4v5Ll; - double BSIM4v5Llc; - double BSIM4v5Lln; - double BSIM4v5Lw; - double BSIM4v5Lwc; - double BSIM4v5Lwn; - double BSIM4v5Lwl; - double BSIM4v5Lwlc; - double BSIM4v5Lmin; - double BSIM4v5Lmax; - - double BSIM4v5Wint; - double BSIM4v5Wl; - double BSIM4v5Wlc; - double BSIM4v5Wln; - double BSIM4v5Ww; - double BSIM4v5Wwc; - double BSIM4v5Wwn; - double BSIM4v5Wwl; - double BSIM4v5Wwlc; - double BSIM4v5Wmin; - double BSIM4v5Wmax; - - /* added for stress effect */ - double BSIM4v5saref; - double BSIM4v5sbref; - double BSIM4v5wlod; - double BSIM4v5ku0; - double BSIM4v5kvsat; - double BSIM4v5kvth0; - double BSIM4v5tku0; - double BSIM4v5llodku0; - double BSIM4v5wlodku0; - double BSIM4v5llodvth; - double BSIM4v5wlodvth; - double BSIM4v5lku0; - double BSIM4v5wku0; - double BSIM4v5pku0; - double BSIM4v5lkvth0; - double BSIM4v5wkvth0; - double BSIM4v5pkvth0; - double BSIM4v5stk2; - double BSIM4v5lodk2; - double BSIM4v5steta0; - double BSIM4v5lodeta0; - - double BSIM4v5web; - double BSIM4v5wec; - double BSIM4v5kvth0we; - double BSIM4v5k2we; - double BSIM4v5ku0we; - double BSIM4v5scref; - double BSIM4v5wpemod; - double BSIM4v5lkvth0we; - double BSIM4v5lk2we; - double BSIM4v5lku0we; - double BSIM4v5wkvth0we; - double BSIM4v5wk2we; - double BSIM4v5wku0we; - double BSIM4v5pkvth0we; - double BSIM4v5pk2we; - double BSIM4v5pku0we; - -/* Pre-calculated constants - * move to size-dependent param */ - double BSIM4v5vtm; - double BSIM4v5vtm0; - double BSIM4v5coxe; - double BSIM4v5coxp; - double BSIM4v5cof1; - double BSIM4v5cof2; - double BSIM4v5cof3; - double BSIM4v5cof4; - double BSIM4v5vcrit; - double BSIM4v5factor1; - double BSIM4v5PhiBS; - double BSIM4v5PhiBSWS; - double BSIM4v5PhiBSWGS; - double BSIM4v5SjctTempSatCurDensity; - double BSIM4v5SjctSidewallTempSatCurDensity; - double BSIM4v5SjctGateSidewallTempSatCurDensity; - double BSIM4v5PhiBD; - double BSIM4v5PhiBSWD; - double BSIM4v5PhiBSWGD; - double BSIM4v5DjctTempSatCurDensity; - double BSIM4v5DjctSidewallTempSatCurDensity; - double BSIM4v5DjctGateSidewallTempSatCurDensity; - double BSIM4v5SunitAreaTempJctCap; - double BSIM4v5DunitAreaTempJctCap; - double BSIM4v5SunitLengthSidewallTempJctCap; - double BSIM4v5DunitLengthSidewallTempJctCap; - double BSIM4v5SunitLengthGateSidewallTempJctCap; - double BSIM4v5DunitLengthGateSidewallTempJctCap; - - double BSIM4v5oxideTrapDensityA; - double BSIM4v5oxideTrapDensityB; - double BSIM4v5oxideTrapDensityC; - double BSIM4v5em; - double BSIM4v5ef; - double BSIM4v5af; - double BSIM4v5kf; - - double BSIM4v5vgsMax; - double BSIM4v5vgdMax; - double BSIM4v5vgbMax; - double BSIM4v5vdsMax; - double BSIM4v5vbsMax; - double BSIM4v5vbdMax; - double BSIM4v5vgsrMax; - double BSIM4v5vgdrMax; - double BSIM4v5vgbrMax; - double BSIM4v5vbsrMax; - double BSIM4v5vbdrMax; - - struct bsim4v5SizeDependParam *pSizeDependParamKnot; - -#ifdef USE_OMP - int BSIM4v5InstCount; - struct sBSIM4v5instance **BSIM4v5InstanceArray; -#endif - - /* Flags */ - unsigned BSIM4v5rgeomodGiven :1; - unsigned BSIM4v5stimodGiven :1; - unsigned BSIM4v5sa0Given :1; - unsigned BSIM4v5sb0Given :1; - - unsigned BSIM4v5mobModGiven :1; - unsigned BSIM4v5binUnitGiven :1; - unsigned BSIM4v5capModGiven :1; - unsigned BSIM4v5dioModGiven :1; - unsigned BSIM4v5rdsModGiven :1; - unsigned BSIM4v5rbodyModGiven :1; - unsigned BSIM4v5rgateModGiven :1; - unsigned BSIM4v5perModGiven :1; - unsigned BSIM4v5geoModGiven :1; - unsigned BSIM4v5rgeoModGiven :1; - unsigned BSIM4v5paramChkGiven :1; - unsigned BSIM4v5trnqsModGiven :1; - unsigned BSIM4v5acnqsModGiven :1; - unsigned BSIM4v5fnoiModGiven :1; - unsigned BSIM4v5tnoiModGiven :1; - unsigned BSIM4v5igcModGiven :1; - unsigned BSIM4v5igbModGiven :1; - unsigned BSIM4v5tempModGiven :1; - unsigned BSIM4v5typeGiven :1; - unsigned BSIM4v5toxrefGiven :1; - unsigned BSIM4v5toxeGiven :1; - unsigned BSIM4v5toxpGiven :1; - unsigned BSIM4v5toxmGiven :1; - unsigned BSIM4v5dtoxGiven :1; - unsigned BSIM4v5epsroxGiven :1; - unsigned BSIM4v5versionGiven :1; - unsigned BSIM4v5cdscGiven :1; - unsigned BSIM4v5cdscbGiven :1; - unsigned BSIM4v5cdscdGiven :1; - unsigned BSIM4v5citGiven :1; - unsigned BSIM4v5nfactorGiven :1; - unsigned BSIM4v5xjGiven :1; - unsigned BSIM4v5vsatGiven :1; - unsigned BSIM4v5atGiven :1; - unsigned BSIM4v5a0Given :1; - unsigned BSIM4v5agsGiven :1; - unsigned BSIM4v5a1Given :1; - unsigned BSIM4v5a2Given :1; - unsigned BSIM4v5ketaGiven :1; - unsigned BSIM4v5nsubGiven :1; - unsigned BSIM4v5ndepGiven :1; - unsigned BSIM4v5nsdGiven :1; - unsigned BSIM4v5phinGiven :1; - unsigned BSIM4v5ngateGiven :1; - unsigned BSIM4v5gamma1Given :1; - unsigned BSIM4v5gamma2Given :1; - unsigned BSIM4v5vbxGiven :1; - unsigned BSIM4v5vbmGiven :1; - unsigned BSIM4v5xtGiven :1; - unsigned BSIM4v5k1Given :1; - unsigned BSIM4v5kt1Given :1; - unsigned BSIM4v5kt1lGiven :1; - unsigned BSIM4v5kt2Given :1; - unsigned BSIM4v5k2Given :1; - unsigned BSIM4v5k3Given :1; - unsigned BSIM4v5k3bGiven :1; - unsigned BSIM4v5w0Given :1; - unsigned BSIM4v5dvtp0Given :1; - unsigned BSIM4v5dvtp1Given :1; - unsigned BSIM4v5lpe0Given :1; - unsigned BSIM4v5lpebGiven :1; - unsigned BSIM4v5dvt0Given :1; - unsigned BSIM4v5dvt1Given :1; - unsigned BSIM4v5dvt2Given :1; - unsigned BSIM4v5dvt0wGiven :1; - unsigned BSIM4v5dvt1wGiven :1; - unsigned BSIM4v5dvt2wGiven :1; - unsigned BSIM4v5droutGiven :1; - unsigned BSIM4v5dsubGiven :1; - unsigned BSIM4v5vth0Given :1; - unsigned BSIM4v5euGiven :1; - unsigned BSIM4v5uaGiven :1; - unsigned BSIM4v5ua1Given :1; - unsigned BSIM4v5ubGiven :1; - unsigned BSIM4v5ub1Given :1; - unsigned BSIM4v5ucGiven :1; - unsigned BSIM4v5uc1Given :1; - unsigned BSIM4v5udGiven :1; - unsigned BSIM4v5ud1Given :1; - unsigned BSIM4v5upGiven :1; - unsigned BSIM4v5lpGiven :1; - unsigned BSIM4v5u0Given :1; - unsigned BSIM4v5uteGiven :1; - unsigned BSIM4v5voffGiven :1; - unsigned BSIM4v5tvoffGiven :1; - unsigned BSIM4v5vofflGiven :1; - unsigned BSIM4v5minvGiven :1; - unsigned BSIM4v5rdswGiven :1; - unsigned BSIM4v5rdswminGiven :1; - unsigned BSIM4v5rdwminGiven :1; - unsigned BSIM4v5rswminGiven :1; - unsigned BSIM4v5rswGiven :1; - unsigned BSIM4v5rdwGiven :1; - unsigned BSIM4v5prwgGiven :1; - unsigned BSIM4v5prwbGiven :1; - unsigned BSIM4v5prtGiven :1; - unsigned BSIM4v5eta0Given :1; - unsigned BSIM4v5etabGiven :1; - unsigned BSIM4v5pclmGiven :1; - unsigned BSIM4v5pdibl1Given :1; - unsigned BSIM4v5pdibl2Given :1; - unsigned BSIM4v5pdiblbGiven :1; - unsigned BSIM4v5fproutGiven :1; - unsigned BSIM4v5pditsGiven :1; - unsigned BSIM4v5pditsdGiven :1; - unsigned BSIM4v5pditslGiven :1; - unsigned BSIM4v5pscbe1Given :1; - unsigned BSIM4v5pscbe2Given :1; - unsigned BSIM4v5pvagGiven :1; - unsigned BSIM4v5deltaGiven :1; - unsigned BSIM4v5wrGiven :1; - unsigned BSIM4v5dwgGiven :1; - unsigned BSIM4v5dwbGiven :1; - unsigned BSIM4v5b0Given :1; - unsigned BSIM4v5b1Given :1; - unsigned BSIM4v5alpha0Given :1; - unsigned BSIM4v5alpha1Given :1; - unsigned BSIM4v5beta0Given :1; - unsigned BSIM4v5agidlGiven :1; - unsigned BSIM4v5bgidlGiven :1; - unsigned BSIM4v5cgidlGiven :1; - unsigned BSIM4v5egidlGiven :1; - unsigned BSIM4v5aigcGiven :1; - unsigned BSIM4v5bigcGiven :1; - unsigned BSIM4v5cigcGiven :1; - unsigned BSIM4v5aigsdGiven :1; - unsigned BSIM4v5bigsdGiven :1; - unsigned BSIM4v5cigsdGiven :1; - unsigned BSIM4v5aigbaccGiven :1; - unsigned BSIM4v5bigbaccGiven :1; - unsigned BSIM4v5cigbaccGiven :1; - unsigned BSIM4v5aigbinvGiven :1; - unsigned BSIM4v5bigbinvGiven :1; - unsigned BSIM4v5cigbinvGiven :1; - unsigned BSIM4v5nigcGiven :1; - unsigned BSIM4v5nigbinvGiven :1; - unsigned BSIM4v5nigbaccGiven :1; - unsigned BSIM4v5ntoxGiven :1; - unsigned BSIM4v5eigbinvGiven :1; - unsigned BSIM4v5pigcdGiven :1; - unsigned BSIM4v5poxedgeGiven :1; - unsigned BSIM4v5ijthdfwdGiven :1; - unsigned BSIM4v5ijthsfwdGiven :1; - unsigned BSIM4v5ijthdrevGiven :1; - unsigned BSIM4v5ijthsrevGiven :1; - unsigned BSIM4v5xjbvdGiven :1; - unsigned BSIM4v5xjbvsGiven :1; - unsigned BSIM4v5bvdGiven :1; - unsigned BSIM4v5bvsGiven :1; - - unsigned BSIM4v5jtssGiven :1; - unsigned BSIM4v5jtsdGiven :1; - unsigned BSIM4v5jtsswsGiven :1; - unsigned BSIM4v5jtsswdGiven :1; - unsigned BSIM4v5jtsswgsGiven :1; - unsigned BSIM4v5jtsswgdGiven :1; - unsigned BSIM4v5njtsGiven :1; - unsigned BSIM4v5njtsswGiven :1; - unsigned BSIM4v5njtsswgGiven :1; - unsigned BSIM4v5xtssGiven :1; - unsigned BSIM4v5xtsdGiven :1; - unsigned BSIM4v5xtsswsGiven :1; - unsigned BSIM4v5xtsswdGiven :1; - unsigned BSIM4v5xtsswgsGiven :1; - unsigned BSIM4v5xtsswgdGiven :1; - unsigned BSIM4v5tnjtsGiven :1; - unsigned BSIM4v5tnjtsswGiven :1; - unsigned BSIM4v5tnjtsswgGiven :1; - unsigned BSIM4v5vtssGiven :1; - unsigned BSIM4v5vtsdGiven :1; - unsigned BSIM4v5vtsswsGiven :1; - unsigned BSIM4v5vtsswdGiven :1; - unsigned BSIM4v5vtsswgsGiven :1; - unsigned BSIM4v5vtsswgdGiven :1; - - unsigned BSIM4v5vfbGiven :1; - unsigned BSIM4v5gbminGiven :1; - unsigned BSIM4v5rbdbGiven :1; - unsigned BSIM4v5rbsbGiven :1; - unsigned BSIM4v5rbpsGiven :1; - unsigned BSIM4v5rbpdGiven :1; - unsigned BSIM4v5rbpbGiven :1; - - unsigned BSIM4v5rbps0Given :1; - unsigned BSIM4v5rbpslGiven :1; - unsigned BSIM4v5rbpswGiven :1; - unsigned BSIM4v5rbpsnfGiven :1; - - unsigned BSIM4v5rbpd0Given :1; - unsigned BSIM4v5rbpdlGiven :1; - unsigned BSIM4v5rbpdwGiven :1; - unsigned BSIM4v5rbpdnfGiven :1; - - unsigned BSIM4v5rbpbx0Given :1; - unsigned BSIM4v5rbpbxlGiven :1; - unsigned BSIM4v5rbpbxwGiven :1; - unsigned BSIM4v5rbpbxnfGiven :1; - unsigned BSIM4v5rbpby0Given :1; - unsigned BSIM4v5rbpbylGiven :1; - unsigned BSIM4v5rbpbywGiven :1; - unsigned BSIM4v5rbpbynfGiven :1; - - unsigned BSIM4v5rbsbx0Given :1; - unsigned BSIM4v5rbsby0Given :1; - unsigned BSIM4v5rbdbx0Given :1; - unsigned BSIM4v5rbdby0Given :1; - - unsigned BSIM4v5rbsdbxlGiven :1; - unsigned BSIM4v5rbsdbxwGiven :1; - unsigned BSIM4v5rbsdbxnfGiven :1; - unsigned BSIM4v5rbsdbylGiven :1; - unsigned BSIM4v5rbsdbywGiven :1; - unsigned BSIM4v5rbsdbynfGiven :1; - - unsigned BSIM4v5xrcrg1Given :1; - unsigned BSIM4v5xrcrg2Given :1; - unsigned BSIM4v5tnoiaGiven :1; - unsigned BSIM4v5tnoibGiven :1; - unsigned BSIM4v5rnoiaGiven :1; - unsigned BSIM4v5rnoibGiven :1; - unsigned BSIM4v5ntnoiGiven :1; - - unsigned BSIM4v5lambdaGiven :1; - unsigned BSIM4v5vtlGiven :1; - unsigned BSIM4v5lcGiven :1; - unsigned BSIM4v5xnGiven :1; - unsigned BSIM4v5vfbsdoffGiven :1; - unsigned BSIM4v5lintnoiGiven :1; - unsigned BSIM4v5tvfbsdoffGiven :1; - - /* CV model and parasitics */ - unsigned BSIM4v5cgslGiven :1; - unsigned BSIM4v5cgdlGiven :1; - unsigned BSIM4v5ckappasGiven :1; - unsigned BSIM4v5ckappadGiven :1; - unsigned BSIM4v5cfGiven :1; - unsigned BSIM4v5vfbcvGiven :1; - unsigned BSIM4v5clcGiven :1; - unsigned BSIM4v5cleGiven :1; - unsigned BSIM4v5dwcGiven :1; - unsigned BSIM4v5dlcGiven :1; - unsigned BSIM4v5xwGiven :1; - unsigned BSIM4v5xlGiven :1; - unsigned BSIM4v5dlcigGiven :1; - unsigned BSIM4v5dwjGiven :1; - unsigned BSIM4v5noffGiven :1; - unsigned BSIM4v5voffcvGiven :1; - unsigned BSIM4v5acdeGiven :1; - unsigned BSIM4v5moinGiven :1; - unsigned BSIM4v5tcjGiven :1; - unsigned BSIM4v5tcjswGiven :1; - unsigned BSIM4v5tcjswgGiven :1; - unsigned BSIM4v5tpbGiven :1; - unsigned BSIM4v5tpbswGiven :1; - unsigned BSIM4v5tpbswgGiven :1; - unsigned BSIM4v5dmcgGiven :1; - unsigned BSIM4v5dmciGiven :1; - unsigned BSIM4v5dmdgGiven :1; - unsigned BSIM4v5dmcgtGiven :1; - unsigned BSIM4v5xgwGiven :1; - unsigned BSIM4v5xglGiven :1; - unsigned BSIM4v5rshgGiven :1; - unsigned BSIM4v5ngconGiven :1; - - - /* Length dependence */ - unsigned BSIM4v5lcdscGiven :1; - unsigned BSIM4v5lcdscbGiven :1; - unsigned BSIM4v5lcdscdGiven :1; - unsigned BSIM4v5lcitGiven :1; - unsigned BSIM4v5lnfactorGiven :1; - unsigned BSIM4v5lxjGiven :1; - unsigned BSIM4v5lvsatGiven :1; - unsigned BSIM4v5latGiven :1; - unsigned BSIM4v5la0Given :1; - unsigned BSIM4v5lagsGiven :1; - unsigned BSIM4v5la1Given :1; - unsigned BSIM4v5la2Given :1; - unsigned BSIM4v5lketaGiven :1; - unsigned BSIM4v5lnsubGiven :1; - unsigned BSIM4v5lndepGiven :1; - unsigned BSIM4v5lnsdGiven :1; - unsigned BSIM4v5lphinGiven :1; - unsigned BSIM4v5lngateGiven :1; - unsigned BSIM4v5lgamma1Given :1; - unsigned BSIM4v5lgamma2Given :1; - unsigned BSIM4v5lvbxGiven :1; - unsigned BSIM4v5lvbmGiven :1; - unsigned BSIM4v5lxtGiven :1; - unsigned BSIM4v5lk1Given :1; - unsigned BSIM4v5lkt1Given :1; - unsigned BSIM4v5lkt1lGiven :1; - unsigned BSIM4v5lkt2Given :1; - unsigned BSIM4v5lk2Given :1; - unsigned BSIM4v5lk3Given :1; - unsigned BSIM4v5lk3bGiven :1; - unsigned BSIM4v5lw0Given :1; - unsigned BSIM4v5ldvtp0Given :1; - unsigned BSIM4v5ldvtp1Given :1; - unsigned BSIM4v5llpe0Given :1; - unsigned BSIM4v5llpebGiven :1; - unsigned BSIM4v5ldvt0Given :1; - unsigned BSIM4v5ldvt1Given :1; - unsigned BSIM4v5ldvt2Given :1; - unsigned BSIM4v5ldvt0wGiven :1; - unsigned BSIM4v5ldvt1wGiven :1; - unsigned BSIM4v5ldvt2wGiven :1; - unsigned BSIM4v5ldroutGiven :1; - unsigned BSIM4v5ldsubGiven :1; - unsigned BSIM4v5lvth0Given :1; - unsigned BSIM4v5luaGiven :1; - unsigned BSIM4v5lua1Given :1; - unsigned BSIM4v5lubGiven :1; - unsigned BSIM4v5lub1Given :1; - unsigned BSIM4v5lucGiven :1; - unsigned BSIM4v5luc1Given :1; - unsigned BSIM4v5ludGiven :1; - unsigned BSIM4v5lud1Given :1; - unsigned BSIM4v5lupGiven :1; - unsigned BSIM4v5llpGiven :1; - unsigned BSIM4v5lu0Given :1; - unsigned BSIM4v5leuGiven :1; - unsigned BSIM4v5luteGiven :1; - unsigned BSIM4v5lvoffGiven :1; - unsigned BSIM4v5ltvoffGiven :1; - unsigned BSIM4v5lminvGiven :1; - unsigned BSIM4v5lrdswGiven :1; - unsigned BSIM4v5lrswGiven :1; - unsigned BSIM4v5lrdwGiven :1; - unsigned BSIM4v5lprwgGiven :1; - unsigned BSIM4v5lprwbGiven :1; - unsigned BSIM4v5lprtGiven :1; - unsigned BSIM4v5leta0Given :1; - unsigned BSIM4v5letabGiven :1; - unsigned BSIM4v5lpclmGiven :1; - unsigned BSIM4v5lpdibl1Given :1; - unsigned BSIM4v5lpdibl2Given :1; - unsigned BSIM4v5lpdiblbGiven :1; - unsigned BSIM4v5lfproutGiven :1; - unsigned BSIM4v5lpditsGiven :1; - unsigned BSIM4v5lpditsdGiven :1; - unsigned BSIM4v5lpscbe1Given :1; - unsigned BSIM4v5lpscbe2Given :1; - unsigned BSIM4v5lpvagGiven :1; - unsigned BSIM4v5ldeltaGiven :1; - unsigned BSIM4v5lwrGiven :1; - unsigned BSIM4v5ldwgGiven :1; - unsigned BSIM4v5ldwbGiven :1; - unsigned BSIM4v5lb0Given :1; - unsigned BSIM4v5lb1Given :1; - unsigned BSIM4v5lalpha0Given :1; - unsigned BSIM4v5lalpha1Given :1; - unsigned BSIM4v5lbeta0Given :1; - unsigned BSIM4v5lvfbGiven :1; - unsigned BSIM4v5lagidlGiven :1; - unsigned BSIM4v5lbgidlGiven :1; - unsigned BSIM4v5lcgidlGiven :1; - unsigned BSIM4v5legidlGiven :1; - unsigned BSIM4v5laigcGiven :1; - unsigned BSIM4v5lbigcGiven :1; - unsigned BSIM4v5lcigcGiven :1; - unsigned BSIM4v5laigsdGiven :1; - unsigned BSIM4v5lbigsdGiven :1; - unsigned BSIM4v5lcigsdGiven :1; - unsigned BSIM4v5laigbaccGiven :1; - unsigned BSIM4v5lbigbaccGiven :1; - unsigned BSIM4v5lcigbaccGiven :1; - unsigned BSIM4v5laigbinvGiven :1; - unsigned BSIM4v5lbigbinvGiven :1; - unsigned BSIM4v5lcigbinvGiven :1; - unsigned BSIM4v5lnigcGiven :1; - unsigned BSIM4v5lnigbinvGiven :1; - unsigned BSIM4v5lnigbaccGiven :1; - unsigned BSIM4v5lntoxGiven :1; - unsigned BSIM4v5leigbinvGiven :1; - unsigned BSIM4v5lpigcdGiven :1; - unsigned BSIM4v5lpoxedgeGiven :1; - unsigned BSIM4v5lxrcrg1Given :1; - unsigned BSIM4v5lxrcrg2Given :1; - unsigned BSIM4v5llambdaGiven :1; - unsigned BSIM4v5lvtlGiven :1; - unsigned BSIM4v5lxnGiven :1; - unsigned BSIM4v5lvfbsdoffGiven :1; - unsigned BSIM4v5ltvfbsdoffGiven :1; - - /* CV model */ - unsigned BSIM4v5lcgslGiven :1; - unsigned BSIM4v5lcgdlGiven :1; - unsigned BSIM4v5lckappasGiven :1; - unsigned BSIM4v5lckappadGiven :1; - unsigned BSIM4v5lcfGiven :1; - unsigned BSIM4v5lclcGiven :1; - unsigned BSIM4v5lcleGiven :1; - unsigned BSIM4v5lvfbcvGiven :1; - unsigned BSIM4v5lnoffGiven :1; - unsigned BSIM4v5lvoffcvGiven :1; - unsigned BSIM4v5lacdeGiven :1; - unsigned BSIM4v5lmoinGiven :1; - - /* Width dependence */ - unsigned BSIM4v5wcdscGiven :1; - unsigned BSIM4v5wcdscbGiven :1; - unsigned BSIM4v5wcdscdGiven :1; - unsigned BSIM4v5wcitGiven :1; - unsigned BSIM4v5wnfactorGiven :1; - unsigned BSIM4v5wxjGiven :1; - unsigned BSIM4v5wvsatGiven :1; - unsigned BSIM4v5watGiven :1; - unsigned BSIM4v5wa0Given :1; - unsigned BSIM4v5wagsGiven :1; - unsigned BSIM4v5wa1Given :1; - unsigned BSIM4v5wa2Given :1; - unsigned BSIM4v5wketaGiven :1; - unsigned BSIM4v5wnsubGiven :1; - unsigned BSIM4v5wndepGiven :1; - unsigned BSIM4v5wnsdGiven :1; - unsigned BSIM4v5wphinGiven :1; - unsigned BSIM4v5wngateGiven :1; - unsigned BSIM4v5wgamma1Given :1; - unsigned BSIM4v5wgamma2Given :1; - unsigned BSIM4v5wvbxGiven :1; - unsigned BSIM4v5wvbmGiven :1; - unsigned BSIM4v5wxtGiven :1; - unsigned BSIM4v5wk1Given :1; - unsigned BSIM4v5wkt1Given :1; - unsigned BSIM4v5wkt1lGiven :1; - unsigned BSIM4v5wkt2Given :1; - unsigned BSIM4v5wk2Given :1; - unsigned BSIM4v5wk3Given :1; - unsigned BSIM4v5wk3bGiven :1; - unsigned BSIM4v5ww0Given :1; - unsigned BSIM4v5wdvtp0Given :1; - unsigned BSIM4v5wdvtp1Given :1; - unsigned BSIM4v5wlpe0Given :1; - unsigned BSIM4v5wlpebGiven :1; - unsigned BSIM4v5wdvt0Given :1; - unsigned BSIM4v5wdvt1Given :1; - unsigned BSIM4v5wdvt2Given :1; - unsigned BSIM4v5wdvt0wGiven :1; - unsigned BSIM4v5wdvt1wGiven :1; - unsigned BSIM4v5wdvt2wGiven :1; - unsigned BSIM4v5wdroutGiven :1; - unsigned BSIM4v5wdsubGiven :1; - unsigned BSIM4v5wvth0Given :1; - unsigned BSIM4v5wuaGiven :1; - unsigned BSIM4v5wua1Given :1; - unsigned BSIM4v5wubGiven :1; - unsigned BSIM4v5wub1Given :1; - unsigned BSIM4v5wucGiven :1; - unsigned BSIM4v5wuc1Given :1; - unsigned BSIM4v5wudGiven :1; - unsigned BSIM4v5wud1Given :1; - unsigned BSIM4v5wupGiven :1; - unsigned BSIM4v5wlpGiven :1; - unsigned BSIM4v5wu0Given :1; - unsigned BSIM4v5weuGiven :1; - unsigned BSIM4v5wuteGiven :1; - unsigned BSIM4v5wvoffGiven :1; - unsigned BSIM4v5wtvoffGiven :1; - unsigned BSIM4v5wminvGiven :1; - unsigned BSIM4v5wrdswGiven :1; - unsigned BSIM4v5wrswGiven :1; - unsigned BSIM4v5wrdwGiven :1; - unsigned BSIM4v5wprwgGiven :1; - unsigned BSIM4v5wprwbGiven :1; - unsigned BSIM4v5wprtGiven :1; - unsigned BSIM4v5weta0Given :1; - unsigned BSIM4v5wetabGiven :1; - unsigned BSIM4v5wpclmGiven :1; - unsigned BSIM4v5wpdibl1Given :1; - unsigned BSIM4v5wpdibl2Given :1; - unsigned BSIM4v5wpdiblbGiven :1; - unsigned BSIM4v5wfproutGiven :1; - unsigned BSIM4v5wpditsGiven :1; - unsigned BSIM4v5wpditsdGiven :1; - unsigned BSIM4v5wpscbe1Given :1; - unsigned BSIM4v5wpscbe2Given :1; - unsigned BSIM4v5wpvagGiven :1; - unsigned BSIM4v5wdeltaGiven :1; - unsigned BSIM4v5wwrGiven :1; - unsigned BSIM4v5wdwgGiven :1; - unsigned BSIM4v5wdwbGiven :1; - unsigned BSIM4v5wb0Given :1; - unsigned BSIM4v5wb1Given :1; - unsigned BSIM4v5walpha0Given :1; - unsigned BSIM4v5walpha1Given :1; - unsigned BSIM4v5wbeta0Given :1; - unsigned BSIM4v5wvfbGiven :1; - unsigned BSIM4v5wagidlGiven :1; - unsigned BSIM4v5wbgidlGiven :1; - unsigned BSIM4v5wcgidlGiven :1; - unsigned BSIM4v5wegidlGiven :1; - unsigned BSIM4v5waigcGiven :1; - unsigned BSIM4v5wbigcGiven :1; - unsigned BSIM4v5wcigcGiven :1; - unsigned BSIM4v5waigsdGiven :1; - unsigned BSIM4v5wbigsdGiven :1; - unsigned BSIM4v5wcigsdGiven :1; - unsigned BSIM4v5waigbaccGiven :1; - unsigned BSIM4v5wbigbaccGiven :1; - unsigned BSIM4v5wcigbaccGiven :1; - unsigned BSIM4v5waigbinvGiven :1; - unsigned BSIM4v5wbigbinvGiven :1; - unsigned BSIM4v5wcigbinvGiven :1; - unsigned BSIM4v5wnigcGiven :1; - unsigned BSIM4v5wnigbinvGiven :1; - unsigned BSIM4v5wnigbaccGiven :1; - unsigned BSIM4v5wntoxGiven :1; - unsigned BSIM4v5weigbinvGiven :1; - unsigned BSIM4v5wpigcdGiven :1; - unsigned BSIM4v5wpoxedgeGiven :1; - unsigned BSIM4v5wxrcrg1Given :1; - unsigned BSIM4v5wxrcrg2Given :1; - unsigned BSIM4v5wlambdaGiven :1; - unsigned BSIM4v5wvtlGiven :1; - unsigned BSIM4v5wxnGiven :1; - unsigned BSIM4v5wvfbsdoffGiven :1; - unsigned BSIM4v5wtvfbsdoffGiven :1; - - /* CV model */ - unsigned BSIM4v5wcgslGiven :1; - unsigned BSIM4v5wcgdlGiven :1; - unsigned BSIM4v5wckappasGiven :1; - unsigned BSIM4v5wckappadGiven :1; - unsigned BSIM4v5wcfGiven :1; - unsigned BSIM4v5wclcGiven :1; - unsigned BSIM4v5wcleGiven :1; - unsigned BSIM4v5wvfbcvGiven :1; - unsigned BSIM4v5wnoffGiven :1; - unsigned BSIM4v5wvoffcvGiven :1; - unsigned BSIM4v5wacdeGiven :1; - unsigned BSIM4v5wmoinGiven :1; - - /* Cross-term dependence */ - unsigned BSIM4v5pcdscGiven :1; - unsigned BSIM4v5pcdscbGiven :1; - unsigned BSIM4v5pcdscdGiven :1; - unsigned BSIM4v5pcitGiven :1; - unsigned BSIM4v5pnfactorGiven :1; - unsigned BSIM4v5pxjGiven :1; - unsigned BSIM4v5pvsatGiven :1; - unsigned BSIM4v5patGiven :1; - unsigned BSIM4v5pa0Given :1; - unsigned BSIM4v5pagsGiven :1; - unsigned BSIM4v5pa1Given :1; - unsigned BSIM4v5pa2Given :1; - unsigned BSIM4v5pketaGiven :1; - unsigned BSIM4v5pnsubGiven :1; - unsigned BSIM4v5pndepGiven :1; - unsigned BSIM4v5pnsdGiven :1; - unsigned BSIM4v5pphinGiven :1; - unsigned BSIM4v5pngateGiven :1; - unsigned BSIM4v5pgamma1Given :1; - unsigned BSIM4v5pgamma2Given :1; - unsigned BSIM4v5pvbxGiven :1; - unsigned BSIM4v5pvbmGiven :1; - unsigned BSIM4v5pxtGiven :1; - unsigned BSIM4v5pk1Given :1; - unsigned BSIM4v5pkt1Given :1; - unsigned BSIM4v5pkt1lGiven :1; - unsigned BSIM4v5pkt2Given :1; - unsigned BSIM4v5pk2Given :1; - unsigned BSIM4v5pk3Given :1; - unsigned BSIM4v5pk3bGiven :1; - unsigned BSIM4v5pw0Given :1; - unsigned BSIM4v5pdvtp0Given :1; - unsigned BSIM4v5pdvtp1Given :1; - unsigned BSIM4v5plpe0Given :1; - unsigned BSIM4v5plpebGiven :1; - unsigned BSIM4v5pdvt0Given :1; - unsigned BSIM4v5pdvt1Given :1; - unsigned BSIM4v5pdvt2Given :1; - unsigned BSIM4v5pdvt0wGiven :1; - unsigned BSIM4v5pdvt1wGiven :1; - unsigned BSIM4v5pdvt2wGiven :1; - unsigned BSIM4v5pdroutGiven :1; - unsigned BSIM4v5pdsubGiven :1; - unsigned BSIM4v5pvth0Given :1; - unsigned BSIM4v5puaGiven :1; - unsigned BSIM4v5pua1Given :1; - unsigned BSIM4v5pubGiven :1; - unsigned BSIM4v5pub1Given :1; - unsigned BSIM4v5pucGiven :1; - unsigned BSIM4v5puc1Given :1; - unsigned BSIM4v5pudGiven :1; - unsigned BSIM4v5pud1Given :1; - unsigned BSIM4v5pupGiven :1; - unsigned BSIM4v5plpGiven :1; - unsigned BSIM4v5pu0Given :1; - unsigned BSIM4v5peuGiven :1; - unsigned BSIM4v5puteGiven :1; - unsigned BSIM4v5pvoffGiven :1; - unsigned BSIM4v5ptvoffGiven :1; - unsigned BSIM4v5pminvGiven :1; - unsigned BSIM4v5prdswGiven :1; - unsigned BSIM4v5prswGiven :1; - unsigned BSIM4v5prdwGiven :1; - unsigned BSIM4v5pprwgGiven :1; - unsigned BSIM4v5pprwbGiven :1; - unsigned BSIM4v5pprtGiven :1; - unsigned BSIM4v5peta0Given :1; - unsigned BSIM4v5petabGiven :1; - unsigned BSIM4v5ppclmGiven :1; - unsigned BSIM4v5ppdibl1Given :1; - unsigned BSIM4v5ppdibl2Given :1; - unsigned BSIM4v5ppdiblbGiven :1; - unsigned BSIM4v5pfproutGiven :1; - unsigned BSIM4v5ppditsGiven :1; - unsigned BSIM4v5ppditsdGiven :1; - unsigned BSIM4v5ppscbe1Given :1; - unsigned BSIM4v5ppscbe2Given :1; - unsigned BSIM4v5ppvagGiven :1; - unsigned BSIM4v5pdeltaGiven :1; - unsigned BSIM4v5pwrGiven :1; - unsigned BSIM4v5pdwgGiven :1; - unsigned BSIM4v5pdwbGiven :1; - unsigned BSIM4v5pb0Given :1; - unsigned BSIM4v5pb1Given :1; - unsigned BSIM4v5palpha0Given :1; - unsigned BSIM4v5palpha1Given :1; - unsigned BSIM4v5pbeta0Given :1; - unsigned BSIM4v5pvfbGiven :1; - unsigned BSIM4v5pagidlGiven :1; - unsigned BSIM4v5pbgidlGiven :1; - unsigned BSIM4v5pcgidlGiven :1; - unsigned BSIM4v5pegidlGiven :1; - unsigned BSIM4v5paigcGiven :1; - unsigned BSIM4v5pbigcGiven :1; - unsigned BSIM4v5pcigcGiven :1; - unsigned BSIM4v5paigsdGiven :1; - unsigned BSIM4v5pbigsdGiven :1; - unsigned BSIM4v5pcigsdGiven :1; - unsigned BSIM4v5paigbaccGiven :1; - unsigned BSIM4v5pbigbaccGiven :1; - unsigned BSIM4v5pcigbaccGiven :1; - unsigned BSIM4v5paigbinvGiven :1; - unsigned BSIM4v5pbigbinvGiven :1; - unsigned BSIM4v5pcigbinvGiven :1; - unsigned BSIM4v5pnigcGiven :1; - unsigned BSIM4v5pnigbinvGiven :1; - unsigned BSIM4v5pnigbaccGiven :1; - unsigned BSIM4v5pntoxGiven :1; - unsigned BSIM4v5peigbinvGiven :1; - unsigned BSIM4v5ppigcdGiven :1; - unsigned BSIM4v5ppoxedgeGiven :1; - unsigned BSIM4v5pxrcrg1Given :1; - unsigned BSIM4v5pxrcrg2Given :1; - unsigned BSIM4v5plambdaGiven :1; - unsigned BSIM4v5pvtlGiven :1; - unsigned BSIM4v5pxnGiven :1; - unsigned BSIM4v5pvfbsdoffGiven :1; - unsigned BSIM4v5ptvfbsdoffGiven :1; - - /* CV model */ - unsigned BSIM4v5pcgslGiven :1; - unsigned BSIM4v5pcgdlGiven :1; - unsigned BSIM4v5pckappasGiven :1; - unsigned BSIM4v5pckappadGiven :1; - unsigned BSIM4v5pcfGiven :1; - unsigned BSIM4v5pclcGiven :1; - unsigned BSIM4v5pcleGiven :1; - unsigned BSIM4v5pvfbcvGiven :1; - unsigned BSIM4v5pnoffGiven :1; - unsigned BSIM4v5pvoffcvGiven :1; - unsigned BSIM4v5pacdeGiven :1; - unsigned BSIM4v5pmoinGiven :1; - - unsigned BSIM4v5useFringeGiven :1; - - unsigned BSIM4v5tnomGiven :1; - unsigned BSIM4v5cgsoGiven :1; - unsigned BSIM4v5cgdoGiven :1; - unsigned BSIM4v5cgboGiven :1; - unsigned BSIM4v5xpartGiven :1; - unsigned BSIM4v5sheetResistanceGiven :1; - - unsigned BSIM4v5SjctSatCurDensityGiven :1; - unsigned BSIM4v5SjctSidewallSatCurDensityGiven :1; - unsigned BSIM4v5SjctGateSidewallSatCurDensityGiven :1; - unsigned BSIM4v5SbulkJctPotentialGiven :1; - unsigned BSIM4v5SbulkJctBotGradingCoeffGiven :1; - unsigned BSIM4v5SsidewallJctPotentialGiven :1; - unsigned BSIM4v5SGatesidewallJctPotentialGiven :1; - unsigned BSIM4v5SbulkJctSideGradingCoeffGiven :1; - unsigned BSIM4v5SunitAreaJctCapGiven :1; - unsigned BSIM4v5SunitLengthSidewallJctCapGiven :1; - unsigned BSIM4v5SbulkJctGateSideGradingCoeffGiven :1; - unsigned BSIM4v5SunitLengthGateSidewallJctCapGiven :1; - unsigned BSIM4v5SjctEmissionCoeffGiven :1; - unsigned BSIM4v5SjctTempExponentGiven :1; - - unsigned BSIM4v5DjctSatCurDensityGiven :1; - unsigned BSIM4v5DjctSidewallSatCurDensityGiven :1; - unsigned BSIM4v5DjctGateSidewallSatCurDensityGiven :1; - unsigned BSIM4v5DbulkJctPotentialGiven :1; - unsigned BSIM4v5DbulkJctBotGradingCoeffGiven :1; - unsigned BSIM4v5DsidewallJctPotentialGiven :1; - unsigned BSIM4v5DGatesidewallJctPotentialGiven :1; - unsigned BSIM4v5DbulkJctSideGradingCoeffGiven :1; - unsigned BSIM4v5DunitAreaJctCapGiven :1; - unsigned BSIM4v5DunitLengthSidewallJctCapGiven :1; - unsigned BSIM4v5DbulkJctGateSideGradingCoeffGiven :1; - unsigned BSIM4v5DunitLengthGateSidewallJctCapGiven :1; - unsigned BSIM4v5DjctEmissionCoeffGiven :1; - unsigned BSIM4v5DjctTempExponentGiven :1; - - unsigned BSIM4v5oxideTrapDensityAGiven :1; - unsigned BSIM4v5oxideTrapDensityBGiven :1; - unsigned BSIM4v5oxideTrapDensityCGiven :1; - unsigned BSIM4v5emGiven :1; - unsigned BSIM4v5efGiven :1; - unsigned BSIM4v5afGiven :1; - unsigned BSIM4v5kfGiven :1; - - unsigned BSIM4v5vgsMaxGiven :1; - unsigned BSIM4v5vgdMaxGiven :1; - unsigned BSIM4v5vgbMaxGiven :1; - unsigned BSIM4v5vdsMaxGiven :1; - unsigned BSIM4v5vbsMaxGiven :1; - unsigned BSIM4v5vbdMaxGiven :1; - unsigned BSIM4v5vgsrMaxGiven :1; - unsigned BSIM4v5vgdrMaxGiven :1; - unsigned BSIM4v5vgbrMaxGiven :1; - unsigned BSIM4v5vbsrMaxGiven :1; - unsigned BSIM4v5vbdrMaxGiven :1; - - unsigned BSIM4v5LintGiven :1; - unsigned BSIM4v5LlGiven :1; - unsigned BSIM4v5LlcGiven :1; - unsigned BSIM4v5LlnGiven :1; - unsigned BSIM4v5LwGiven :1; - unsigned BSIM4v5LwcGiven :1; - unsigned BSIM4v5LwnGiven :1; - unsigned BSIM4v5LwlGiven :1; - unsigned BSIM4v5LwlcGiven :1; - unsigned BSIM4v5LminGiven :1; - unsigned BSIM4v5LmaxGiven :1; - - unsigned BSIM4v5WintGiven :1; - unsigned BSIM4v5WlGiven :1; - unsigned BSIM4v5WlcGiven :1; - unsigned BSIM4v5WlnGiven :1; - unsigned BSIM4v5WwGiven :1; - unsigned BSIM4v5WwcGiven :1; - unsigned BSIM4v5WwnGiven :1; - unsigned BSIM4v5WwlGiven :1; - unsigned BSIM4v5WwlcGiven :1; - unsigned BSIM4v5WminGiven :1; - unsigned BSIM4v5WmaxGiven :1; - - /* added for stress effect */ - unsigned BSIM4v5sarefGiven :1; - unsigned BSIM4v5sbrefGiven :1; - unsigned BSIM4v5wlodGiven :1; - unsigned BSIM4v5ku0Given :1; - unsigned BSIM4v5kvsatGiven :1; - unsigned BSIM4v5kvth0Given :1; - unsigned BSIM4v5tku0Given :1; - unsigned BSIM4v5llodku0Given :1; - unsigned BSIM4v5wlodku0Given :1; - unsigned BSIM4v5llodvthGiven :1; - unsigned BSIM4v5wlodvthGiven :1; - unsigned BSIM4v5lku0Given :1; - unsigned BSIM4v5wku0Given :1; - unsigned BSIM4v5pku0Given :1; - unsigned BSIM4v5lkvth0Given :1; - unsigned BSIM4v5wkvth0Given :1; - unsigned BSIM4v5pkvth0Given :1; - unsigned BSIM4v5stk2Given :1; - unsigned BSIM4v5lodk2Given :1; - unsigned BSIM4v5steta0Given :1; - unsigned BSIM4v5lodeta0Given :1; - - unsigned BSIM4v5webGiven :1; - unsigned BSIM4v5wecGiven :1; - unsigned BSIM4v5kvth0weGiven :1; - unsigned BSIM4v5k2weGiven :1; - unsigned BSIM4v5ku0weGiven :1; - unsigned BSIM4v5screfGiven :1; - unsigned BSIM4v5wpemodGiven :1; - unsigned BSIM4v5lkvth0weGiven :1; - unsigned BSIM4v5lk2weGiven :1; - unsigned BSIM4v5lku0weGiven :1; - unsigned BSIM4v5wkvth0weGiven :1; - unsigned BSIM4v5wk2weGiven :1; - unsigned BSIM4v5wku0weGiven :1; - unsigned BSIM4v5pkvth0weGiven :1; - unsigned BSIM4v5pk2weGiven :1; - unsigned BSIM4v5pku0weGiven :1; - - -} BSIM4v5model; - - -#ifndef NMOS -#define NMOS 1 -#define PMOS -1 -#endif /*NMOS*/ - - -/* Instance parameters */ -#define BSIM4v5_W 1 -#define BSIM4v5_L 2 -#define BSIM4v5_AS 3 -#define BSIM4v5_AD 4 -#define BSIM4v5_PS 5 -#define BSIM4v5_PD 6 -#define BSIM4v5_NRS 7 -#define BSIM4v5_NRD 8 -#define BSIM4v5_OFF 9 -#define BSIM4v5_IC 10 -#define BSIM4v5_IC_VDS 11 -#define BSIM4v5_IC_VGS 12 -#define BSIM4v5_IC_VBS 13 -#define BSIM4v5_TRNQSMOD 14 -#define BSIM4v5_RBODYMOD 15 -#define BSIM4v5_RGATEMOD 16 -#define BSIM4v5_GEOMOD 17 -#define BSIM4v5_RGEOMOD 18 -#define BSIM4v5_NF 19 -#define BSIM4v5_MIN 20 -#define BSIM4v5_ACNQSMOD 22 -#define BSIM4v5_RBDB 23 -#define BSIM4v5_RBSB 24 -#define BSIM4v5_RBPB 25 -#define BSIM4v5_RBPS 26 -#define BSIM4v5_RBPD 27 -#define BSIM4v5_SA 28 -#define BSIM4v5_SB 29 -#define BSIM4v5_SD 30 -#define BSIM4v5_DELVTO 31 -#define BSIM4v5_XGW 32 -#define BSIM4v5_NGCON 33 -#define BSIM4v5_SCA 34 -#define BSIM4v5_SCB 35 -#define BSIM4v5_SCC 36 -#define BSIM4v5_SC 37 -#define BSIM4v5_M 38 - -/* Global parameters */ -#define BSIM4v5_MOD_TEMPMOD 89 -#define BSIM4v5_MOD_IGCMOD 90 -#define BSIM4v5_MOD_IGBMOD 91 -#define BSIM4v5_MOD_ACNQSMOD 92 -#define BSIM4v5_MOD_FNOIMOD 93 -#define BSIM4v5_MOD_RDSMOD 94 -#define BSIM4v5_MOD_DIOMOD 95 -#define BSIM4v5_MOD_PERMOD 96 -#define BSIM4v5_MOD_GEOMOD 97 -#define BSIM4v5_MOD_RGEOMOD 98 -#define BSIM4v5_MOD_RGATEMOD 99 -#define BSIM4v5_MOD_RBODYMOD 100 -#define BSIM4v5_MOD_CAPMOD 101 -#define BSIM4v5_MOD_TRNQSMOD 102 -#define BSIM4v5_MOD_MOBMOD 103 -#define BSIM4v5_MOD_TNOIMOD 104 -#define BSIM4v5_MOD_TOXE 105 -#define BSIM4v5_MOD_CDSC 106 -#define BSIM4v5_MOD_CDSCB 107 -#define BSIM4v5_MOD_CIT 108 -#define BSIM4v5_MOD_NFACTOR 109 -#define BSIM4v5_MOD_XJ 110 -#define BSIM4v5_MOD_VSAT 111 -#define BSIM4v5_MOD_AT 112 -#define BSIM4v5_MOD_A0 113 -#define BSIM4v5_MOD_A1 114 -#define BSIM4v5_MOD_A2 115 -#define BSIM4v5_MOD_KETA 116 -#define BSIM4v5_MOD_NSUB 117 -#define BSIM4v5_MOD_NDEP 118 -#define BSIM4v5_MOD_NGATE 120 -#define BSIM4v5_MOD_GAMMA1 121 -#define BSIM4v5_MOD_GAMMA2 122 -#define BSIM4v5_MOD_VBX 123 -#define BSIM4v5_MOD_BINUNIT 124 -#define BSIM4v5_MOD_VBM 125 -#define BSIM4v5_MOD_XT 126 -#define BSIM4v5_MOD_K1 129 -#define BSIM4v5_MOD_KT1 130 -#define BSIM4v5_MOD_KT1L 131 -#define BSIM4v5_MOD_K2 132 -#define BSIM4v5_MOD_KT2 133 -#define BSIM4v5_MOD_K3 134 -#define BSIM4v5_MOD_K3B 135 -#define BSIM4v5_MOD_W0 136 -#define BSIM4v5_MOD_LPE0 137 -#define BSIM4v5_MOD_DVT0 138 -#define BSIM4v5_MOD_DVT1 139 -#define BSIM4v5_MOD_DVT2 140 -#define BSIM4v5_MOD_DVT0W 141 -#define BSIM4v5_MOD_DVT1W 142 -#define BSIM4v5_MOD_DVT2W 143 -#define BSIM4v5_MOD_DROUT 144 -#define BSIM4v5_MOD_DSUB 145 -#define BSIM4v5_MOD_VTH0 146 -#define BSIM4v5_MOD_UA 147 -#define BSIM4v5_MOD_UA1 148 -#define BSIM4v5_MOD_UB 149 -#define BSIM4v5_MOD_UB1 150 -#define BSIM4v5_MOD_UC 151 -#define BSIM4v5_MOD_UC1 152 -#define BSIM4v5_MOD_U0 153 -#define BSIM4v5_MOD_UTE 154 -#define BSIM4v5_MOD_VOFF 155 -#define BSIM4v5_MOD_DELTA 156 -#define BSIM4v5_MOD_RDSW 157 -#define BSIM4v5_MOD_PRT 158 -#define BSIM4v5_MOD_LDD 159 -#define BSIM4v5_MOD_ETA 160 -#define BSIM4v5_MOD_ETA0 161 -#define BSIM4v5_MOD_ETAB 162 -#define BSIM4v5_MOD_PCLM 163 -#define BSIM4v5_MOD_PDIBL1 164 -#define BSIM4v5_MOD_PDIBL2 165 -#define BSIM4v5_MOD_PSCBE1 166 -#define BSIM4v5_MOD_PSCBE2 167 -#define BSIM4v5_MOD_PVAG 168 -#define BSIM4v5_MOD_WR 169 -#define BSIM4v5_MOD_DWG 170 -#define BSIM4v5_MOD_DWB 171 -#define BSIM4v5_MOD_B0 172 -#define BSIM4v5_MOD_B1 173 -#define BSIM4v5_MOD_ALPHA0 174 -#define BSIM4v5_MOD_BETA0 175 -#define BSIM4v5_MOD_PDIBLB 178 -#define BSIM4v5_MOD_PRWG 179 -#define BSIM4v5_MOD_PRWB 180 -#define BSIM4v5_MOD_CDSCD 181 -#define BSIM4v5_MOD_AGS 182 -#define BSIM4v5_MOD_FRINGE 184 -#define BSIM4v5_MOD_CGSL 186 -#define BSIM4v5_MOD_CGDL 187 -#define BSIM4v5_MOD_CKAPPAS 188 -#define BSIM4v5_MOD_CF 189 -#define BSIM4v5_MOD_CLC 190 -#define BSIM4v5_MOD_CLE 191 -#define BSIM4v5_MOD_PARAMCHK 192 -#define BSIM4v5_MOD_VERSION 193 -#define BSIM4v5_MOD_VFBCV 194 -#define BSIM4v5_MOD_ACDE 195 -#define BSIM4v5_MOD_MOIN 196 -#define BSIM4v5_MOD_NOFF 197 -#define BSIM4v5_MOD_IJTHDFWD 198 -#define BSIM4v5_MOD_ALPHA1 199 -#define BSIM4v5_MOD_VFB 200 -#define BSIM4v5_MOD_TOXM 201 -#define BSIM4v5_MOD_TCJ 202 -#define BSIM4v5_MOD_TCJSW 203 -#define BSIM4v5_MOD_TCJSWG 204 -#define BSIM4v5_MOD_TPB 205 -#define BSIM4v5_MOD_TPBSW 206 -#define BSIM4v5_MOD_TPBSWG 207 -#define BSIM4v5_MOD_VOFFCV 208 -#define BSIM4v5_MOD_GBMIN 209 -#define BSIM4v5_MOD_RBDB 210 -#define BSIM4v5_MOD_RBSB 211 -#define BSIM4v5_MOD_RBPB 212 -#define BSIM4v5_MOD_RBPS 213 -#define BSIM4v5_MOD_RBPD 214 -#define BSIM4v5_MOD_DMCG 215 -#define BSIM4v5_MOD_DMCI 216 -#define BSIM4v5_MOD_DMDG 217 -#define BSIM4v5_MOD_XGW 218 -#define BSIM4v5_MOD_XGL 219 -#define BSIM4v5_MOD_RSHG 220 -#define BSIM4v5_MOD_NGCON 221 -#define BSIM4v5_MOD_AGIDL 222 -#define BSIM4v5_MOD_BGIDL 223 -#define BSIM4v5_MOD_EGIDL 224 -#define BSIM4v5_MOD_IJTHSFWD 225 -#define BSIM4v5_MOD_XJBVD 226 -#define BSIM4v5_MOD_XJBVS 227 -#define BSIM4v5_MOD_BVD 228 -#define BSIM4v5_MOD_BVS 229 -#define BSIM4v5_MOD_TOXP 230 -#define BSIM4v5_MOD_DTOX 231 -#define BSIM4v5_MOD_XRCRG1 232 -#define BSIM4v5_MOD_XRCRG2 233 -#define BSIM4v5_MOD_EU 234 -#define BSIM4v5_MOD_IJTHSREV 235 -#define BSIM4v5_MOD_IJTHDREV 236 -#define BSIM4v5_MOD_MINV 237 -#define BSIM4v5_MOD_VOFFL 238 -#define BSIM4v5_MOD_PDITS 239 -#define BSIM4v5_MOD_PDITSD 240 -#define BSIM4v5_MOD_PDITSL 241 -#define BSIM4v5_MOD_TNOIA 242 -#define BSIM4v5_MOD_TNOIB 243 -#define BSIM4v5_MOD_NTNOI 244 -#define BSIM4v5_MOD_FPROUT 245 -#define BSIM4v5_MOD_LPEB 246 -#define BSIM4v5_MOD_DVTP0 247 -#define BSIM4v5_MOD_DVTP1 248 -#define BSIM4v5_MOD_CGIDL 249 -#define BSIM4v5_MOD_PHIN 250 -#define BSIM4v5_MOD_RDSWMIN 251 -#define BSIM4v5_MOD_RSW 252 -#define BSIM4v5_MOD_RDW 253 -#define BSIM4v5_MOD_RDWMIN 254 -#define BSIM4v5_MOD_RSWMIN 255 -#define BSIM4v5_MOD_NSD 256 -#define BSIM4v5_MOD_CKAPPAD 257 -#define BSIM4v5_MOD_DMCGT 258 -#define BSIM4v5_MOD_AIGC 259 -#define BSIM4v5_MOD_BIGC 260 -#define BSIM4v5_MOD_CIGC 261 -#define BSIM4v5_MOD_AIGBACC 262 -#define BSIM4v5_MOD_BIGBACC 263 -#define BSIM4v5_MOD_CIGBACC 264 -#define BSIM4v5_MOD_AIGBINV 265 -#define BSIM4v5_MOD_BIGBINV 266 -#define BSIM4v5_MOD_CIGBINV 267 -#define BSIM4v5_MOD_NIGC 268 -#define BSIM4v5_MOD_NIGBACC 269 -#define BSIM4v5_MOD_NIGBINV 270 -#define BSIM4v5_MOD_NTOX 271 -#define BSIM4v5_MOD_TOXREF 272 -#define BSIM4v5_MOD_EIGBINV 273 -#define BSIM4v5_MOD_PIGCD 274 -#define BSIM4v5_MOD_POXEDGE 275 -#define BSIM4v5_MOD_EPSROX 276 -#define BSIM4v5_MOD_AIGSD 277 -#define BSIM4v5_MOD_BIGSD 278 -#define BSIM4v5_MOD_CIGSD 279 -#define BSIM4v5_MOD_JSWGS 280 -#define BSIM4v5_MOD_JSWGD 281 -#define BSIM4v5_MOD_LAMBDA 282 -#define BSIM4v5_MOD_VTL 283 -#define BSIM4v5_MOD_LC 284 -#define BSIM4v5_MOD_XN 285 -#define BSIM4v5_MOD_RNOIA 286 -#define BSIM4v5_MOD_RNOIB 287 -#define BSIM4v5_MOD_VFBSDOFF 288 -#define BSIM4v5_MOD_LINTNOI 289 -#define BSIM4v5_MOD_UD 290 -#define BSIM4v5_MOD_UD1 291 -#define BSIM4v5_MOD_UP 292 -#define BSIM4v5_MOD_LP 293 -#define BSIM4v5_MOD_TVOFF 294 -#define BSIM4v5_MOD_TVFBSDOFF 295 - -/* Length dependence */ -#define BSIM4v5_MOD_LCDSC 301 -#define BSIM4v5_MOD_LCDSCB 302 -#define BSIM4v5_MOD_LCIT 303 -#define BSIM4v5_MOD_LNFACTOR 304 -#define BSIM4v5_MOD_LXJ 305 -#define BSIM4v5_MOD_LVSAT 306 -#define BSIM4v5_MOD_LAT 307 -#define BSIM4v5_MOD_LA0 308 -#define BSIM4v5_MOD_LA1 309 -#define BSIM4v5_MOD_LA2 310 -#define BSIM4v5_MOD_LKETA 311 -#define BSIM4v5_MOD_LNSUB 312 -#define BSIM4v5_MOD_LNDEP 313 -#define BSIM4v5_MOD_LNGATE 315 -#define BSIM4v5_MOD_LGAMMA1 316 -#define BSIM4v5_MOD_LGAMMA2 317 -#define BSIM4v5_MOD_LVBX 318 -#define BSIM4v5_MOD_LVBM 320 -#define BSIM4v5_MOD_LXT 322 -#define BSIM4v5_MOD_LK1 325 -#define BSIM4v5_MOD_LKT1 326 -#define BSIM4v5_MOD_LKT1L 327 -#define BSIM4v5_MOD_LK2 328 -#define BSIM4v5_MOD_LKT2 329 -#define BSIM4v5_MOD_LK3 330 -#define BSIM4v5_MOD_LK3B 331 -#define BSIM4v5_MOD_LW0 332 -#define BSIM4v5_MOD_LLPE0 333 -#define BSIM4v5_MOD_LDVT0 334 -#define BSIM4v5_MOD_LDVT1 335 -#define BSIM4v5_MOD_LDVT2 336 -#define BSIM4v5_MOD_LDVT0W 337 -#define BSIM4v5_MOD_LDVT1W 338 -#define BSIM4v5_MOD_LDVT2W 339 -#define BSIM4v5_MOD_LDROUT 340 -#define BSIM4v5_MOD_LDSUB 341 -#define BSIM4v5_MOD_LVTH0 342 -#define BSIM4v5_MOD_LUA 343 -#define BSIM4v5_MOD_LUA1 344 -#define BSIM4v5_MOD_LUB 345 -#define BSIM4v5_MOD_LUB1 346 -#define BSIM4v5_MOD_LUC 347 -#define BSIM4v5_MOD_LUC1 348 -#define BSIM4v5_MOD_LU0 349 -#define BSIM4v5_MOD_LUTE 350 -#define BSIM4v5_MOD_LVOFF 351 -#define BSIM4v5_MOD_LDELTA 352 -#define BSIM4v5_MOD_LRDSW 353 -#define BSIM4v5_MOD_LPRT 354 -#define BSIM4v5_MOD_LLDD 355 -#define BSIM4v5_MOD_LETA 356 -#define BSIM4v5_MOD_LETA0 357 -#define BSIM4v5_MOD_LETAB 358 -#define BSIM4v5_MOD_LPCLM 359 -#define BSIM4v5_MOD_LPDIBL1 360 -#define BSIM4v5_MOD_LPDIBL2 361 -#define BSIM4v5_MOD_LPSCBE1 362 -#define BSIM4v5_MOD_LPSCBE2 363 -#define BSIM4v5_MOD_LPVAG 364 -#define BSIM4v5_MOD_LWR 365 -#define BSIM4v5_MOD_LDWG 366 -#define BSIM4v5_MOD_LDWB 367 -#define BSIM4v5_MOD_LB0 368 -#define BSIM4v5_MOD_LB1 369 -#define BSIM4v5_MOD_LALPHA0 370 -#define BSIM4v5_MOD_LBETA0 371 -#define BSIM4v5_MOD_LPDIBLB 374 -#define BSIM4v5_MOD_LPRWG 375 -#define BSIM4v5_MOD_LPRWB 376 -#define BSIM4v5_MOD_LCDSCD 377 -#define BSIM4v5_MOD_LAGS 378 - -#define BSIM4v5_MOD_LFRINGE 381 -#define BSIM4v5_MOD_LCGSL 383 -#define BSIM4v5_MOD_LCGDL 384 -#define BSIM4v5_MOD_LCKAPPAS 385 -#define BSIM4v5_MOD_LCF 386 -#define BSIM4v5_MOD_LCLC 387 -#define BSIM4v5_MOD_LCLE 388 -#define BSIM4v5_MOD_LVFBCV 389 -#define BSIM4v5_MOD_LACDE 390 -#define BSIM4v5_MOD_LMOIN 391 -#define BSIM4v5_MOD_LNOFF 392 -#define BSIM4v5_MOD_LALPHA1 394 -#define BSIM4v5_MOD_LVFB 395 -#define BSIM4v5_MOD_LVOFFCV 396 -#define BSIM4v5_MOD_LAGIDL 397 -#define BSIM4v5_MOD_LBGIDL 398 -#define BSIM4v5_MOD_LEGIDL 399 -#define BSIM4v5_MOD_LXRCRG1 400 -#define BSIM4v5_MOD_LXRCRG2 401 -#define BSIM4v5_MOD_LEU 402 -#define BSIM4v5_MOD_LMINV 403 -#define BSIM4v5_MOD_LPDITS 404 -#define BSIM4v5_MOD_LPDITSD 405 -#define BSIM4v5_MOD_LFPROUT 406 -#define BSIM4v5_MOD_LLPEB 407 -#define BSIM4v5_MOD_LDVTP0 408 -#define BSIM4v5_MOD_LDVTP1 409 -#define BSIM4v5_MOD_LCGIDL 410 -#define BSIM4v5_MOD_LPHIN 411 -#define BSIM4v5_MOD_LRSW 412 -#define BSIM4v5_MOD_LRDW 413 -#define BSIM4v5_MOD_LNSD 414 -#define BSIM4v5_MOD_LCKAPPAD 415 -#define BSIM4v5_MOD_LAIGC 416 -#define BSIM4v5_MOD_LBIGC 417 -#define BSIM4v5_MOD_LCIGC 418 -#define BSIM4v5_MOD_LAIGBACC 419 -#define BSIM4v5_MOD_LBIGBACC 420 -#define BSIM4v5_MOD_LCIGBACC 421 -#define BSIM4v5_MOD_LAIGBINV 422 -#define BSIM4v5_MOD_LBIGBINV 423 -#define BSIM4v5_MOD_LCIGBINV 424 -#define BSIM4v5_MOD_LNIGC 425 -#define BSIM4v5_MOD_LNIGBACC 426 -#define BSIM4v5_MOD_LNIGBINV 427 -#define BSIM4v5_MOD_LNTOX 428 -#define BSIM4v5_MOD_LEIGBINV 429 -#define BSIM4v5_MOD_LPIGCD 430 -#define BSIM4v5_MOD_LPOXEDGE 431 -#define BSIM4v5_MOD_LAIGSD 432 -#define BSIM4v5_MOD_LBIGSD 433 -#define BSIM4v5_MOD_LCIGSD 434 - -#define BSIM4v5_MOD_LLAMBDA 435 -#define BSIM4v5_MOD_LVTL 436 -#define BSIM4v5_MOD_LXN 437 -#define BSIM4v5_MOD_LVFBSDOFF 438 -#define BSIM4v5_MOD_LUD 439 -#define BSIM4v5_MOD_LUD1 440 -#define BSIM4v5_MOD_LUP 441 -#define BSIM4v5_MOD_LLP 442 - -/* Width dependence */ -#define BSIM4v5_MOD_WCDSC 481 -#define BSIM4v5_MOD_WCDSCB 482 -#define BSIM4v5_MOD_WCIT 483 -#define BSIM4v5_MOD_WNFACTOR 484 -#define BSIM4v5_MOD_WXJ 485 -#define BSIM4v5_MOD_WVSAT 486 -#define BSIM4v5_MOD_WAT 487 -#define BSIM4v5_MOD_WA0 488 -#define BSIM4v5_MOD_WA1 489 -#define BSIM4v5_MOD_WA2 490 -#define BSIM4v5_MOD_WKETA 491 -#define BSIM4v5_MOD_WNSUB 492 -#define BSIM4v5_MOD_WNDEP 493 -#define BSIM4v5_MOD_WNGATE 495 -#define BSIM4v5_MOD_WGAMMA1 496 -#define BSIM4v5_MOD_WGAMMA2 497 -#define BSIM4v5_MOD_WVBX 498 -#define BSIM4v5_MOD_WVBM 500 -#define BSIM4v5_MOD_WXT 502 -#define BSIM4v5_MOD_WK1 505 -#define BSIM4v5_MOD_WKT1 506 -#define BSIM4v5_MOD_WKT1L 507 -#define BSIM4v5_MOD_WK2 508 -#define BSIM4v5_MOD_WKT2 509 -#define BSIM4v5_MOD_WK3 510 -#define BSIM4v5_MOD_WK3B 511 -#define BSIM4v5_MOD_WW0 512 -#define BSIM4v5_MOD_WLPE0 513 -#define BSIM4v5_MOD_WDVT0 514 -#define BSIM4v5_MOD_WDVT1 515 -#define BSIM4v5_MOD_WDVT2 516 -#define BSIM4v5_MOD_WDVT0W 517 -#define BSIM4v5_MOD_WDVT1W 518 -#define BSIM4v5_MOD_WDVT2W 519 -#define BSIM4v5_MOD_WDROUT 520 -#define BSIM4v5_MOD_WDSUB 521 -#define BSIM4v5_MOD_WVTH0 522 -#define BSIM4v5_MOD_WUA 523 -#define BSIM4v5_MOD_WUA1 524 -#define BSIM4v5_MOD_WUB 525 -#define BSIM4v5_MOD_WUB1 526 -#define BSIM4v5_MOD_WUC 527 -#define BSIM4v5_MOD_WUC1 528 -#define BSIM4v5_MOD_WU0 529 -#define BSIM4v5_MOD_WUTE 530 -#define BSIM4v5_MOD_WVOFF 531 -#define BSIM4v5_MOD_WDELTA 532 -#define BSIM4v5_MOD_WRDSW 533 -#define BSIM4v5_MOD_WPRT 534 -#define BSIM4v5_MOD_WLDD 535 -#define BSIM4v5_MOD_WETA 536 -#define BSIM4v5_MOD_WETA0 537 -#define BSIM4v5_MOD_WETAB 538 -#define BSIM4v5_MOD_WPCLM 539 -#define BSIM4v5_MOD_WPDIBL1 540 -#define BSIM4v5_MOD_WPDIBL2 541 -#define BSIM4v5_MOD_WPSCBE1 542 -#define BSIM4v5_MOD_WPSCBE2 543 -#define BSIM4v5_MOD_WPVAG 544 -#define BSIM4v5_MOD_WWR 545 -#define BSIM4v5_MOD_WDWG 546 -#define BSIM4v5_MOD_WDWB 547 -#define BSIM4v5_MOD_WB0 548 -#define BSIM4v5_MOD_WB1 549 -#define BSIM4v5_MOD_WALPHA0 550 -#define BSIM4v5_MOD_WBETA0 551 -#define BSIM4v5_MOD_WPDIBLB 554 -#define BSIM4v5_MOD_WPRWG 555 -#define BSIM4v5_MOD_WPRWB 556 -#define BSIM4v5_MOD_WCDSCD 557 -#define BSIM4v5_MOD_WAGS 558 - -#define BSIM4v5_MOD_WFRINGE 561 -#define BSIM4v5_MOD_WCGSL 563 -#define BSIM4v5_MOD_WCGDL 564 -#define BSIM4v5_MOD_WCKAPPAS 565 -#define BSIM4v5_MOD_WCF 566 -#define BSIM4v5_MOD_WCLC 567 -#define BSIM4v5_MOD_WCLE 568 -#define BSIM4v5_MOD_WVFBCV 569 -#define BSIM4v5_MOD_WACDE 570 -#define BSIM4v5_MOD_WMOIN 571 -#define BSIM4v5_MOD_WNOFF 572 -#define BSIM4v5_MOD_WALPHA1 574 -#define BSIM4v5_MOD_WVFB 575 -#define BSIM4v5_MOD_WVOFFCV 576 -#define BSIM4v5_MOD_WAGIDL 577 -#define BSIM4v5_MOD_WBGIDL 578 -#define BSIM4v5_MOD_WEGIDL 579 -#define BSIM4v5_MOD_WXRCRG1 580 -#define BSIM4v5_MOD_WXRCRG2 581 -#define BSIM4v5_MOD_WEU 582 -#define BSIM4v5_MOD_WMINV 583 -#define BSIM4v5_MOD_WPDITS 584 -#define BSIM4v5_MOD_WPDITSD 585 -#define BSIM4v5_MOD_WFPROUT 586 -#define BSIM4v5_MOD_WLPEB 587 -#define BSIM4v5_MOD_WDVTP0 588 -#define BSIM4v5_MOD_WDVTP1 589 -#define BSIM4v5_MOD_WCGIDL 590 -#define BSIM4v5_MOD_WPHIN 591 -#define BSIM4v5_MOD_WRSW 592 -#define BSIM4v5_MOD_WRDW 593 -#define BSIM4v5_MOD_WNSD 594 -#define BSIM4v5_MOD_WCKAPPAD 595 -#define BSIM4v5_MOD_WAIGC 596 -#define BSIM4v5_MOD_WBIGC 597 -#define BSIM4v5_MOD_WCIGC 598 -#define BSIM4v5_MOD_WAIGBACC 599 -#define BSIM4v5_MOD_WBIGBACC 600 -#define BSIM4v5_MOD_WCIGBACC 601 -#define BSIM4v5_MOD_WAIGBINV 602 -#define BSIM4v5_MOD_WBIGBINV 603 -#define BSIM4v5_MOD_WCIGBINV 604 -#define BSIM4v5_MOD_WNIGC 605 -#define BSIM4v5_MOD_WNIGBACC 606 -#define BSIM4v5_MOD_WNIGBINV 607 -#define BSIM4v5_MOD_WNTOX 608 -#define BSIM4v5_MOD_WEIGBINV 609 -#define BSIM4v5_MOD_WPIGCD 610 -#define BSIM4v5_MOD_WPOXEDGE 611 -#define BSIM4v5_MOD_WAIGSD 612 -#define BSIM4v5_MOD_WBIGSD 613 -#define BSIM4v5_MOD_WCIGSD 614 -#define BSIM4v5_MOD_WLAMBDA 615 -#define BSIM4v5_MOD_WVTL 616 -#define BSIM4v5_MOD_WXN 617 -#define BSIM4v5_MOD_WVFBSDOFF 618 -#define BSIM4v5_MOD_WUD 619 -#define BSIM4v5_MOD_WUD1 620 -#define BSIM4v5_MOD_WUP 621 -#define BSIM4v5_MOD_WLP 622 - -/* Cross-term dependence */ -#define BSIM4v5_MOD_PCDSC 661 -#define BSIM4v5_MOD_PCDSCB 662 -#define BSIM4v5_MOD_PCIT 663 -#define BSIM4v5_MOD_PNFACTOR 664 -#define BSIM4v5_MOD_PXJ 665 -#define BSIM4v5_MOD_PVSAT 666 -#define BSIM4v5_MOD_PAT 667 -#define BSIM4v5_MOD_PA0 668 -#define BSIM4v5_MOD_PA1 669 -#define BSIM4v5_MOD_PA2 670 -#define BSIM4v5_MOD_PKETA 671 -#define BSIM4v5_MOD_PNSUB 672 -#define BSIM4v5_MOD_PNDEP 673 -#define BSIM4v5_MOD_PNGATE 675 -#define BSIM4v5_MOD_PGAMMA1 676 -#define BSIM4v5_MOD_PGAMMA2 677 -#define BSIM4v5_MOD_PVBX 678 - -#define BSIM4v5_MOD_PVBM 680 - -#define BSIM4v5_MOD_PXT 682 -#define BSIM4v5_MOD_PK1 685 -#define BSIM4v5_MOD_PKT1 686 -#define BSIM4v5_MOD_PKT1L 687 -#define BSIM4v5_MOD_PK2 688 -#define BSIM4v5_MOD_PKT2 689 -#define BSIM4v5_MOD_PK3 690 -#define BSIM4v5_MOD_PK3B 691 -#define BSIM4v5_MOD_PW0 692 -#define BSIM4v5_MOD_PLPE0 693 - -#define BSIM4v5_MOD_PDVT0 694 -#define BSIM4v5_MOD_PDVT1 695 -#define BSIM4v5_MOD_PDVT2 696 - -#define BSIM4v5_MOD_PDVT0W 697 -#define BSIM4v5_MOD_PDVT1W 698 -#define BSIM4v5_MOD_PDVT2W 699 - -#define BSIM4v5_MOD_PDROUT 700 -#define BSIM4v5_MOD_PDSUB 701 -#define BSIM4v5_MOD_PVTH0 702 -#define BSIM4v5_MOD_PUA 703 -#define BSIM4v5_MOD_PUA1 704 -#define BSIM4v5_MOD_PUB 705 -#define BSIM4v5_MOD_PUB1 706 -#define BSIM4v5_MOD_PUC 707 -#define BSIM4v5_MOD_PUC1 708 -#define BSIM4v5_MOD_PU0 709 -#define BSIM4v5_MOD_PUTE 710 -#define BSIM4v5_MOD_PVOFF 711 -#define BSIM4v5_MOD_PDELTA 712 -#define BSIM4v5_MOD_PRDSW 713 -#define BSIM4v5_MOD_PPRT 714 -#define BSIM4v5_MOD_PLDD 715 -#define BSIM4v5_MOD_PETA 716 -#define BSIM4v5_MOD_PETA0 717 -#define BSIM4v5_MOD_PETAB 718 -#define BSIM4v5_MOD_PPCLM 719 -#define BSIM4v5_MOD_PPDIBL1 720 -#define BSIM4v5_MOD_PPDIBL2 721 -#define BSIM4v5_MOD_PPSCBE1 722 -#define BSIM4v5_MOD_PPSCBE2 723 -#define BSIM4v5_MOD_PPVAG 724 -#define BSIM4v5_MOD_PWR 725 -#define BSIM4v5_MOD_PDWG 726 -#define BSIM4v5_MOD_PDWB 727 -#define BSIM4v5_MOD_PB0 728 -#define BSIM4v5_MOD_PB1 729 -#define BSIM4v5_MOD_PALPHA0 730 -#define BSIM4v5_MOD_PBETA0 731 -#define BSIM4v5_MOD_PPDIBLB 734 - -#define BSIM4v5_MOD_PPRWG 735 -#define BSIM4v5_MOD_PPRWB 736 - -#define BSIM4v5_MOD_PCDSCD 737 -#define BSIM4v5_MOD_PAGS 738 - -#define BSIM4v5_MOD_PFRINGE 741 -#define BSIM4v5_MOD_PCGSL 743 -#define BSIM4v5_MOD_PCGDL 744 -#define BSIM4v5_MOD_PCKAPPAS 745 -#define BSIM4v5_MOD_PCF 746 -#define BSIM4v5_MOD_PCLC 747 -#define BSIM4v5_MOD_PCLE 748 -#define BSIM4v5_MOD_PVFBCV 749 -#define BSIM4v5_MOD_PACDE 750 -#define BSIM4v5_MOD_PMOIN 751 -#define BSIM4v5_MOD_PNOFF 752 -#define BSIM4v5_MOD_PALPHA1 754 -#define BSIM4v5_MOD_PVFB 755 -#define BSIM4v5_MOD_PVOFFCV 756 -#define BSIM4v5_MOD_PAGIDL 757 -#define BSIM4v5_MOD_PBGIDL 758 -#define BSIM4v5_MOD_PEGIDL 759 -#define BSIM4v5_MOD_PXRCRG1 760 -#define BSIM4v5_MOD_PXRCRG2 761 -#define BSIM4v5_MOD_PEU 762 -#define BSIM4v5_MOD_PMINV 763 -#define BSIM4v5_MOD_PPDITS 764 -#define BSIM4v5_MOD_PPDITSD 765 -#define BSIM4v5_MOD_PFPROUT 766 -#define BSIM4v5_MOD_PLPEB 767 -#define BSIM4v5_MOD_PDVTP0 768 -#define BSIM4v5_MOD_PDVTP1 769 -#define BSIM4v5_MOD_PCGIDL 770 -#define BSIM4v5_MOD_PPHIN 771 -#define BSIM4v5_MOD_PRSW 772 -#define BSIM4v5_MOD_PRDW 773 -#define BSIM4v5_MOD_PNSD 774 -#define BSIM4v5_MOD_PCKAPPAD 775 -#define BSIM4v5_MOD_PAIGC 776 -#define BSIM4v5_MOD_PBIGC 777 -#define BSIM4v5_MOD_PCIGC 778 -#define BSIM4v5_MOD_PAIGBACC 779 -#define BSIM4v5_MOD_PBIGBACC 780 -#define BSIM4v5_MOD_PCIGBACC 781 -#define BSIM4v5_MOD_PAIGBINV 782 -#define BSIM4v5_MOD_PBIGBINV 783 -#define BSIM4v5_MOD_PCIGBINV 784 -#define BSIM4v5_MOD_PNIGC 785 -#define BSIM4v5_MOD_PNIGBACC 786 -#define BSIM4v5_MOD_PNIGBINV 787 -#define BSIM4v5_MOD_PNTOX 788 -#define BSIM4v5_MOD_PEIGBINV 789 -#define BSIM4v5_MOD_PPIGCD 790 -#define BSIM4v5_MOD_PPOXEDGE 791 -#define BSIM4v5_MOD_PAIGSD 792 -#define BSIM4v5_MOD_PBIGSD 793 -#define BSIM4v5_MOD_PCIGSD 794 - -#define BSIM4v5_MOD_SAREF 795 -#define BSIM4v5_MOD_SBREF 796 -#define BSIM4v5_MOD_KU0 797 -#define BSIM4v5_MOD_KVSAT 798 -#define BSIM4v5_MOD_TKU0 799 -#define BSIM4v5_MOD_LLODKU0 800 -#define BSIM4v5_MOD_WLODKU0 801 -#define BSIM4v5_MOD_LLODVTH 802 -#define BSIM4v5_MOD_WLODVTH 803 -#define BSIM4v5_MOD_LKU0 804 -#define BSIM4v5_MOD_WKU0 805 -#define BSIM4v5_MOD_PKU0 806 -#define BSIM4v5_MOD_KVTH0 807 -#define BSIM4v5_MOD_LKVTH0 808 -#define BSIM4v5_MOD_WKVTH0 809 -#define BSIM4v5_MOD_PKVTH0 810 -#define BSIM4v5_MOD_WLOD 811 -#define BSIM4v5_MOD_STK2 812 -#define BSIM4v5_MOD_LODK2 813 -#define BSIM4v5_MOD_STETA0 814 -#define BSIM4v5_MOD_LODETA0 815 - -#define BSIM4v5_MOD_WEB 816 -#define BSIM4v5_MOD_WEC 817 -#define BSIM4v5_MOD_KVTH0WE 818 -#define BSIM4v5_MOD_K2WE 819 -#define BSIM4v5_MOD_KU0WE 820 -#define BSIM4v5_MOD_SCREF 821 -#define BSIM4v5_MOD_WPEMOD 822 - -#define BSIM4v5_MOD_PLAMBDA 825 -#define BSIM4v5_MOD_PVTL 826 -#define BSIM4v5_MOD_PXN 827 -#define BSIM4v5_MOD_PVFBSDOFF 828 - -#define BSIM4v5_MOD_TNOM 831 -#define BSIM4v5_MOD_CGSO 832 -#define BSIM4v5_MOD_CGDO 833 -#define BSIM4v5_MOD_CGBO 834 -#define BSIM4v5_MOD_XPART 835 -#define BSIM4v5_MOD_RSH 836 -#define BSIM4v5_MOD_JSS 837 -#define BSIM4v5_MOD_PBS 838 -#define BSIM4v5_MOD_MJS 839 -#define BSIM4v5_MOD_PBSWS 840 -#define BSIM4v5_MOD_MJSWS 841 -#define BSIM4v5_MOD_CJS 842 -#define BSIM4v5_MOD_CJSWS 843 -#define BSIM4v5_MOD_NMOS 844 -#define BSIM4v5_MOD_PMOS 845 -#define BSIM4v5_MOD_NOIA 846 -#define BSIM4v5_MOD_NOIB 847 -#define BSIM4v5_MOD_NOIC 848 -#define BSIM4v5_MOD_LINT 849 -#define BSIM4v5_MOD_LL 850 -#define BSIM4v5_MOD_LLN 851 -#define BSIM4v5_MOD_LW 852 -#define BSIM4v5_MOD_LWN 853 -#define BSIM4v5_MOD_LWL 854 -#define BSIM4v5_MOD_LMIN 855 -#define BSIM4v5_MOD_LMAX 856 -#define BSIM4v5_MOD_WINT 857 -#define BSIM4v5_MOD_WL 858 -#define BSIM4v5_MOD_WLN 859 -#define BSIM4v5_MOD_WW 860 -#define BSIM4v5_MOD_WWN 861 -#define BSIM4v5_MOD_WWL 862 -#define BSIM4v5_MOD_WMIN 863 -#define BSIM4v5_MOD_WMAX 864 -#define BSIM4v5_MOD_DWC 865 -#define BSIM4v5_MOD_DLC 866 -#define BSIM4v5_MOD_XL 867 -#define BSIM4v5_MOD_XW 868 -#define BSIM4v5_MOD_EM 869 -#define BSIM4v5_MOD_EF 870 -#define BSIM4v5_MOD_AF 871 -#define BSIM4v5_MOD_KF 872 -#define BSIM4v5_MOD_NJS 873 -#define BSIM4v5_MOD_XTIS 874 -#define BSIM4v5_MOD_PBSWGS 875 -#define BSIM4v5_MOD_MJSWGS 876 -#define BSIM4v5_MOD_CJSWGS 877 -#define BSIM4v5_MOD_JSWS 878 -#define BSIM4v5_MOD_LLC 879 -#define BSIM4v5_MOD_LWC 880 -#define BSIM4v5_MOD_LWLC 881 -#define BSIM4v5_MOD_WLC 882 -#define BSIM4v5_MOD_WWC 883 -#define BSIM4v5_MOD_WWLC 884 -#define BSIM4v5_MOD_DWJ 885 -#define BSIM4v5_MOD_JSD 886 -#define BSIM4v5_MOD_PBD 887 -#define BSIM4v5_MOD_MJD 888 -#define BSIM4v5_MOD_PBSWD 889 -#define BSIM4v5_MOD_MJSWD 890 -#define BSIM4v5_MOD_CJD 891 -#define BSIM4v5_MOD_CJSWD 892 -#define BSIM4v5_MOD_NJD 893 -#define BSIM4v5_MOD_XTID 894 -#define BSIM4v5_MOD_PBSWGD 895 -#define BSIM4v5_MOD_MJSWGD 896 -#define BSIM4v5_MOD_CJSWGD 897 -#define BSIM4v5_MOD_JSWD 898 -#define BSIM4v5_MOD_DLCIG 899 - -/* trap-assisted tunneling */ - -#define BSIM4v5_MOD_JTSS 900 -#define BSIM4v5_MOD_JTSD 901 -#define BSIM4v5_MOD_JTSSWS 902 -#define BSIM4v5_MOD_JTSSWD 903 -#define BSIM4v5_MOD_JTSSWGS 904 -#define BSIM4v5_MOD_JTSSWGD 905 -#define BSIM4v5_MOD_NJTS 906 -#define BSIM4v5_MOD_NJTSSW 907 -#define BSIM4v5_MOD_NJTSSWG 908 -#define BSIM4v5_MOD_XTSS 909 -#define BSIM4v5_MOD_XTSD 910 -#define BSIM4v5_MOD_XTSSWS 911 -#define BSIM4v5_MOD_XTSSWD 912 -#define BSIM4v5_MOD_XTSSWGS 913 -#define BSIM4v5_MOD_XTSSWGD 914 -#define BSIM4v5_MOD_TNJTS 915 -#define BSIM4v5_MOD_TNJTSSW 916 -#define BSIM4v5_MOD_TNJTSSWG 917 -#define BSIM4v5_MOD_VTSS 918 -#define BSIM4v5_MOD_VTSD 919 -#define BSIM4v5_MOD_VTSSWS 920 -#define BSIM4v5_MOD_VTSSWD 921 -#define BSIM4v5_MOD_VTSSWGS 922 -#define BSIM4v5_MOD_VTSSWGD 923 -#define BSIM4v5_MOD_PUD 924 -#define BSIM4v5_MOD_PUD1 925 -#define BSIM4v5_MOD_PUP 926 -#define BSIM4v5_MOD_PLP 927 - -/* device questions */ -#define BSIM4v5_DNODE 945 -#define BSIM4v5_GNODEEXT 946 -#define BSIM4v5_SNODE 947 -#define BSIM4v5_BNODE 948 -#define BSIM4v5_DNODEPRIME 949 -#define BSIM4v5_GNODEPRIME 950 -#define BSIM4v5_GNODEMIDE 951 -#define BSIM4v5_GNODEMID 952 -#define BSIM4v5_SNODEPRIME 953 -#define BSIM4v5_BNODEPRIME 954 -#define BSIM4v5_DBNODE 955 -#define BSIM4v5_SBNODE 956 -#define BSIM4v5_VBD 957 -#define BSIM4v5_VBS 958 -#define BSIM4v5_VGS 959 -#define BSIM4v5_VDS 960 -#define BSIM4v5_CD 961 -#define BSIM4v5_CBS 962 -#define BSIM4v5_CBD 963 -#define BSIM4v5_GM 964 -#define BSIM4v5_GDS 965 -#define BSIM4v5_GMBS 966 -#define BSIM4v5_GBD 967 -#define BSIM4v5_GBS 968 -#define BSIM4v5_QB 969 -#define BSIM4v5_CQB 970 -#define BSIM4v5_QG 971 -#define BSIM4v5_CQG 972 -#define BSIM4v5_QD 973 -#define BSIM4v5_CQD 974 -#define BSIM4v5_CGGB 975 -#define BSIM4v5_CGDB 976 -#define BSIM4v5_CGSB 977 -#define BSIM4v5_CBGB 978 -#define BSIM4v5_CAPBD 979 -#define BSIM4v5_CQBD 980 -#define BSIM4v5_CAPBS 981 -#define BSIM4v5_CQBS 982 -#define BSIM4v5_CDGB 983 -#define BSIM4v5_CDDB 984 -#define BSIM4v5_CDSB 985 -#define BSIM4v5_VON 986 -#define BSIM4v5_VDSAT 987 -#define BSIM4v5_QBS 988 -#define BSIM4v5_QBD 989 -#define BSIM4v5_SOURCECONDUCT 990 -#define BSIM4v5_DRAINCONDUCT 991 -#define BSIM4v5_CBDB 992 -#define BSIM4v5_CBSB 993 -#define BSIM4v5_CSUB 994 -#define BSIM4v5_QINV 995 -#define BSIM4v5_IGIDL 996 -#define BSIM4v5_CSGB 997 -#define BSIM4v5_CSDB 998 -#define BSIM4v5_CSSB 999 -#define BSIM4v5_CGBB 1000 -#define BSIM4v5_CDBB 1001 -#define BSIM4v5_CSBB 1002 -#define BSIM4v5_CBBB 1003 -#define BSIM4v5_QS 1004 -#define BSIM4v5_IGISL 1005 -#define BSIM4v5_IGS 1006 -#define BSIM4v5_IGD 1007 -#define BSIM4v5_IGB 1008 -#define BSIM4v5_IGCS 1009 -#define BSIM4v5_IGCD 1010 -#define BSIM4v5_QDEF 1011 -#define BSIM4v5_DELVT0 1012 -#define BSIM4v5_GCRG 1013 -#define BSIM4v5_GTAU 1014 - -#define BSIM4v5_MOD_LTVOFF 1051 -#define BSIM4v5_MOD_LTVFBSDOFF 1052 -#define BSIM4v5_MOD_WTVOFF 1053 -#define BSIM4v5_MOD_WTVFBSDOFF 1054 -#define BSIM4v5_MOD_PTVOFF 1055 -#define BSIM4v5_MOD_PTVFBSDOFF 1056 - -#define BSIM4v5_MOD_LKVTH0WE 1061 -#define BSIM4v5_MOD_LK2WE 1062 -#define BSIM4v5_MOD_LKU0WE 1063 -#define BSIM4v5_MOD_WKVTH0WE 1064 -#define BSIM4v5_MOD_WK2WE 1065 -#define BSIM4v5_MOD_WKU0WE 1066 -#define BSIM4v5_MOD_PKVTH0WE 1067 -#define BSIM4v5_MOD_PK2WE 1068 -#define BSIM4v5_MOD_PKU0WE 1069 - -#define BSIM4v5_MOD_RBPS0 1101 -#define BSIM4v5_MOD_RBPSL 1102 -#define BSIM4v5_MOD_RBPSW 1103 -#define BSIM4v5_MOD_RBPSNF 1104 -#define BSIM4v5_MOD_RBPD0 1105 -#define BSIM4v5_MOD_RBPDL 1106 -#define BSIM4v5_MOD_RBPDW 1107 -#define BSIM4v5_MOD_RBPDNF 1108 - -#define BSIM4v5_MOD_RBPBX0 1109 -#define BSIM4v5_MOD_RBPBXL 1110 -#define BSIM4v5_MOD_RBPBXW 1111 -#define BSIM4v5_MOD_RBPBXNF 1112 -#define BSIM4v5_MOD_RBPBY0 1113 -#define BSIM4v5_MOD_RBPBYL 1114 -#define BSIM4v5_MOD_RBPBYW 1115 -#define BSIM4v5_MOD_RBPBYNF 1116 - -#define BSIM4v5_MOD_RBSBX0 1117 -#define BSIM4v5_MOD_RBSBY0 1118 -#define BSIM4v5_MOD_RBDBX0 1119 -#define BSIM4v5_MOD_RBDBY0 1120 - -#define BSIM4v5_MOD_RBSDBXL 1121 -#define BSIM4v5_MOD_RBSDBXW 1122 -#define BSIM4v5_MOD_RBSDBXNF 1123 -#define BSIM4v5_MOD_RBSDBYL 1124 -#define BSIM4v5_MOD_RBSDBYW 1125 -#define BSIM4v5_MOD_RBSDBYNF 1126 - -#define BSIM4v5_MOD_VGS_MAX 1201 -#define BSIM4v5_MOD_VGD_MAX 1202 -#define BSIM4v5_MOD_VGB_MAX 1203 -#define BSIM4v5_MOD_VDS_MAX 1204 -#define BSIM4v5_MOD_VBS_MAX 1205 -#define BSIM4v5_MOD_VBD_MAX 1206 -#define BSIM4v5_MOD_VGSR_MAX 1207 -#define BSIM4v5_MOD_VGDR_MAX 1208 -#define BSIM4v5_MOD_VGBR_MAX 1209 -#define BSIM4v5_MOD_VBSR_MAX 1210 -#define BSIM4v5_MOD_VBDR_MAX 1211 - -#include "bsim4v5ext.h" - -extern void BSIM4v5evaluate(double,double,double,BSIM4v5instance*,BSIM4v5model*, - double*,double*,double*, double*, double*, double*, double*, - double*, double*, double*, double*, double*, double*, double*, - double*, double*, double*, double*, CKTcircuit*); -extern int BSIM4v5debug(BSIM4v5model*, BSIM4v5instance*, CKTcircuit*, int); -extern int BSIM4v5checkModel(BSIM4v5model*, BSIM4v5instance*, CKTcircuit*); -extern int BSIM4v5PAeffGeo(double, int, int, double, double, double, double, double *, double *, double *, double *); -extern int BSIM4v5RdseffGeo(double, int, int, int, double, double, double, double, double, int, double *); - -#endif /*BSIM4v5*/ diff --git a/src/spicelib/devices/bsim4v5/bsim4v5ext.h b/src/spicelib/devices/bsim4v5/bsim4v5ext.h deleted file mode 100644 index 04248e6a8..000000000 --- a/src/spicelib/devices/bsim4v5/bsim4v5ext.h +++ /dev/null @@ -1,29 +0,0 @@ -/********** -Copyright 2004 Regents of the University of California. All rights reserved. -Author: 2000 Weidong Liu -Author: 2001- Xuemei Xi -File: bsim4v5ext.h -**********/ - -extern int BSIM4v5acLoad(GENmodel *,CKTcircuit*); -extern int BSIM4v5ask(CKTcircuit *,GENinstance*,int,IFvalue*,IFvalue*); -extern int BSIM4v5convTest(GENmodel *,CKTcircuit*); -extern int BSIM4v5getic(GENmodel*,CKTcircuit*); -extern int BSIM4v5load(GENmodel*,CKTcircuit*); -extern int BSIM4v5mAsk(CKTcircuit*,GENmodel *,int, IFvalue*); -extern int BSIM4v5mDelete(GENmodel*); -extern int BSIM4v5mParam(int,IFvalue*,GENmodel*); -extern void BSIM4v5mosCap(CKTcircuit*, double, double, double, double, - double, double, double, double, double, double, double, - double, double, double, double, double, double, double*, - double*, double*, double*, double*, double*, double*, double*, - double*, double*, double*, double*, double*, double*, double*, - double*); -extern int BSIM4v5param(int,IFvalue*,GENinstance*,IFvalue*); -extern int BSIM4v5pzLoad(GENmodel*,CKTcircuit*,SPcomplex*); -extern int BSIM4v5setup(SMPmatrix*,GENmodel*,CKTcircuit*,int*); -extern int BSIM4v5temp(GENmodel*,CKTcircuit*); -extern int BSIM4v5trunc(GENmodel*,CKTcircuit*,double*); -extern int BSIM4v5noise(int,int,GENmodel*,CKTcircuit*,Ndata*,double*); -extern int BSIM4v5unsetup(GENmodel*,CKTcircuit*); -extern int BSIM4v5soaCheck(CKTcircuit *, GENmodel *); diff --git a/src/spicelib/devices/bsim4v5/bsim4v5init.c b/src/spicelib/devices/bsim4v5/bsim4v5init.c deleted file mode 100644 index 4d09e2ee0..000000000 --- a/src/spicelib/devices/bsim4v5/bsim4v5init.c +++ /dev/null @@ -1,76 +0,0 @@ -#include "ngspice/config.h" - -#include "ngspice/devdefs.h" - -#include "bsim4v5itf.h" -#include "bsim4v5ext.h" -#include "bsim4v5init.h" - - -SPICEdev BSIM4v5info = { - .DEVpublic = { - .name = "BSIM4v5", - .description = "Berkeley Short Channel IGFET Model-4", - .terms = &BSIM4v5nSize, - .numNames = &BSIM4v5nSize, - .termNames = BSIM4v5names, - .numInstanceParms = &BSIM4v5pTSize, - .instanceParms = BSIM4v5pTable, - .numModelParms = &BSIM4v5mPTSize, - .modelParms = BSIM4v5mPTable, - .flags = DEV_DEFAULT, - -#ifdef XSPICE - .cm_func = NULL, - .num_conn = 0, - .conn = NULL, - .num_param = 0, - .param = NULL, - .num_inst_var = 0, - .inst_var = NULL, -#endif - }, - - .DEVparam = BSIM4v5param, - .DEVmodParam = BSIM4v5mParam, - .DEVload = BSIM4v5load, - .DEVsetup = BSIM4v5setup, - .DEVunsetup = BSIM4v5unsetup, - .DEVpzSetup = BSIM4v5setup, - .DEVtemperature = BSIM4v5temp, - .DEVtrunc = BSIM4v5trunc, - .DEVfindBranch = NULL, - .DEVacLoad = BSIM4v5acLoad, - .DEVaccept = NULL, - .DEVdestroy = NULL, - .DEVmodDelete = BSIM4v5mDelete, - .DEVdelete = NULL, - .DEVsetic = BSIM4v5getic, - .DEVask = BSIM4v5ask, - .DEVmodAsk = BSIM4v5mAsk, - .DEVpzLoad = BSIM4v5pzLoad, - .DEVconvTest = BSIM4v5convTest, - .DEVsenSetup = NULL, - .DEVsenLoad = NULL, - .DEVsenUpdate = NULL, - .DEVsenAcLoad = NULL, - .DEVsenPrint = NULL, - .DEVsenTrunc = NULL, - .DEVdisto = NULL, - .DEVnoise = BSIM4v5noise, - .DEVsoaCheck = BSIM4v5soaCheck, - .DEVinstSize = &BSIM4v5iSize, - .DEVmodSize = &BSIM4v5mSize, - -#ifdef CIDER - .DEVdump = NULL, - .DEVacct = NULL, -#endif -}; - - -SPICEdev * -get_bsim4v5_info(void) -{ - return &BSIM4v5info; -} diff --git a/src/spicelib/devices/bsim4v5/bsim4v5init.h b/src/spicelib/devices/bsim4v5/bsim4v5init.h deleted file mode 100644 index e05d5e9be..000000000 --- a/src/spicelib/devices/bsim4v5/bsim4v5init.h +++ /dev/null @@ -1,13 +0,0 @@ -#ifndef _BSIM4V5INIT_H -#define _BSIM4V5INIT_H - -extern IFparm BSIM4v5pTable[ ]; -extern IFparm BSIM4v5mPTable[ ]; -extern char *BSIM4v5names[ ]; -extern int BSIM4v5pTSize; -extern int BSIM4v5mPTSize; -extern int BSIM4v5nSize; -extern int BSIM4v5iSize; -extern int BSIM4v5mSize; - -#endif diff --git a/src/spicelib/devices/bsim4v5/bsim4v5itf.h b/src/spicelib/devices/bsim4v5/bsim4v5itf.h deleted file mode 100644 index 7bbd91304..000000000 --- a/src/spicelib/devices/bsim4v5/bsim4v5itf.h +++ /dev/null @@ -1,13 +0,0 @@ -/********** -Copyright 2004 Regents of the University of California. All rights reserved. -Author: 2000 Weidong Liu. -Author: 2001- Xuemei Xi -File: bsim4v5itf.h -**********/ - -#ifndef DEV_BSIM4V5 -#define DEV_BSIM4V5 - -SPICEdev *get_bsim4v5_info(void); - -#endif diff --git a/src/spicelib/devices/bsim4v6/B4TERMS_OF_USE b/src/spicelib/devices/bsim4v6/B4TERMS_OF_USE deleted file mode 100644 index 5cc4023bb..000000000 --- a/src/spicelib/devices/bsim4v6/B4TERMS_OF_USE +++ /dev/null @@ -1,33 +0,0 @@ - -The terms under which the software is provided are as the following. - -Software is distributed as is, completely without warranty or service -support. The University of California and its employees are not liable -for the condition or performance of the software. - -The University owns the copyright but shall not be liable for any -infringement of copyright or other proprietary rights brought by third -parties against the users of the software. - -The University of California hereby disclaims all implied warranties. - -The University of California grants the users the right to modify, copy, -and redistribute the software and documentation, both within the user's -organization and externally, subject to the following restrictions: - -1. The users agree not to charge for the University of California code - itself but may charge for additions, extensions, or support. - -2. In any product based on the software, the users agree to acknowledge - the UC Berkeley BSIM Research Group that developed the software. This - acknowledgment shall appear in the product documentation. - -3. The users agree to obey all U.S. Government restrictions governing - redistribution or export of the software. - -4. The users agree to reproduce any copyright notice which appears on - the software on any copy or modification of such made available - to others. - -Chenming Hu, and Weidong Liu -Mar. 2000 diff --git a/src/spicelib/devices/bsim4v6/Makefile.am b/src/spicelib/devices/bsim4v6/Makefile.am deleted file mode 100644 index 21f116802..000000000 --- a/src/spicelib/devices/bsim4v6/Makefile.am +++ /dev/null @@ -1,37 +0,0 @@ -## Process this file with automake to produce Makefile.in - -noinst_LTLIBRARIES = libbsim4v6.la - -libbsim4v6_la_SOURCES = \ - b4v6.c \ - b4v6acld.c \ - b4v6ask.c \ - b4v6check.c \ - b4v6cvtest.c \ - b4v6geo.c \ - b4v6getic.c \ - b4v6ld.c \ - b4v6mask.c \ - b4v6mdel.c \ - b4v6mpar.c \ - b4v6noi.c \ - b4v6par.c \ - b4v6pzld.c \ - b4v6set.c \ - b4v6soachk.c \ - b4v6temp.c \ - b4v6trunc.c \ - bsim4v6def.h \ - bsim4v6ext.h \ - bsim4v6init.c \ - bsim4v6init.h \ - bsim4v6itf.h - - - -AM_CPPFLAGS = @AM_CPPFLAGS@ -I$(top_srcdir)/src/include -AM_CFLAGS = $(STATIC) - -MAINTAINERCLEANFILES = Makefile.in - -EXTRA_DIST = B4TERMS_OF_USE diff --git a/src/spicelib/devices/bsim4v6/b4v6.c b/src/spicelib/devices/bsim4v6/b4v6.c deleted file mode 100644 index 9853707c9..000000000 --- a/src/spicelib/devices/bsim4v6/b4v6.c +++ /dev/null @@ -1,1006 +0,0 @@ -/**** BSIM4.6.2 Released by Wenwei Yang 07/31/2008 ****/ - -/********** - * Copyright 2006 Regents of the University of California. All rights reserved. - * File: b4.c of BSIM4.6.2. - * Author: 2000 Weidong Liu - * Authors: 2001- Xuemei Xi, Mohan Dunga, Ali Niknejad, Chenming Hu. - * Authors: 2006- Mohan Dunga, Ali Niknejad, Chenming Hu - * Authors: 2007- Mohan Dunga, Wenwei Yang, Ali Niknejad, Chenming Hu - * Authors: 2008- Wenwei Yang, Ali Niknejad, Chenming Hu - * Project Director: Prof. Chenming Hu. - * Modified by Xuemei Xi, 04/06/2001. - * Modified by Xuemei Xi, 10/05/2001. - * Modified by Xuemei Xi, 11/15/2002. - * Modified by Xuemei Xi, 05/09/2003. - * Modified by Xuemei Xi, 03/04/2004. - * Modified by Xuemei Xi, Mohan Dunga, 07/29/2005. - * Modified by Mohan Dunga, 12/13/2006. - * Modified by Mohan Dunga, Wenwei Yang, 05/18/2007. - * Modified by Wenwei Yang, 07/31/2008. - **********/ - -#include "ngspice/ngspice.h" -#include "ngspice/devdefs.h" -#include "bsim4v6def.h" -#include "ngspice/suffix.h" - -IFparm BSIM4v6pTable[] = { /* parameters */ -IOP( "l", BSIM4v6_L, IF_REAL , "Length"), -IOP( "w", BSIM4v6_W, IF_REAL , "Width"), -IOP( "m", BSIM4v6_M, IF_REAL , "Separate Parallel multiplier"), -IOP( "nf", BSIM4v6_NF, IF_REAL , "Number of fingers"), -IOP( "sa", BSIM4v6_SA, IF_REAL , "distance between OD edge to poly of one side "), -IOP( "sb", BSIM4v6_SB, IF_REAL , "distance between OD edge to poly of the other side"), -IOP( "sd", BSIM4v6_SD, IF_REAL , "distance between neighbour fingers"), -IOP( "sca", BSIM4v6_SCA, IF_REAL , "Integral of the first distribution function for scattered well dopant"), -IOP( "scb", BSIM4v6_SCB, IF_REAL , "Integral of the second distribution function for scattered well dopant"), -IOP( "scc", BSIM4v6_SCC, IF_REAL , "Integral of the third distribution function for scattered well dopant"), -IOP( "sc", BSIM4v6_SC, IF_REAL , "Distance to a single well edge "), -IOP( "min", BSIM4v6_MIN, IF_INTEGER , "Minimize either D or S"), -IOP( "ad", BSIM4v6_AD, IF_REAL , "Drain area"), -IOP( "as", BSIM4v6_AS, IF_REAL , "Source area"), -IOP( "pd", BSIM4v6_PD, IF_REAL , "Drain perimeter"), -IOP( "ps", BSIM4v6_PS, IF_REAL , "Source perimeter"), -IOP( "nrd", BSIM4v6_NRD, IF_REAL , "Number of squares in drain"), -IOP( "nrs", BSIM4v6_NRS, IF_REAL , "Number of squares in source"), -IOP( "off", BSIM4v6_OFF, IF_FLAG , "Device is initially off"), -IOP( "rbdb", BSIM4v6_RBDB, IF_REAL , "Body resistance"), -IOP( "rbsb", BSIM4v6_RBSB, IF_REAL , "Body resistance"), -IOP( "rbpb", BSIM4v6_RBPB, IF_REAL , "Body resistance"), -IOP( "rbps", BSIM4v6_RBPS, IF_REAL , "Body resistance"), -IOP( "rbpd", BSIM4v6_RBPD, IF_REAL , "Body resistance"), -IOP( "delvto", BSIM4v6_DELVTO, IF_REAL , "Zero bias threshold voltage variation"), -IOPR( "delvt0", BSIM4v6_DELVTO, IF_REAL , "Zero bias threshold voltage variation"), -IOP( "xgw", BSIM4v6_XGW, IF_REAL, "Distance from gate contact center to device edge"), -IOP( "ngcon", BSIM4v6_NGCON, IF_REAL, "Number of gate contacts"), - - -IOP( "trnqsmod", BSIM4v6_TRNQSMOD, IF_INTEGER, "Transient NQS model selector"), -IOP( "acnqsmod", BSIM4v6_ACNQSMOD, IF_INTEGER, "AC NQS model selector"), -IOP( "rbodymod", BSIM4v6_RBODYMOD, IF_INTEGER, "Distributed body R model selector"), -IOP( "rgatemod", BSIM4v6_RGATEMOD, IF_INTEGER, "Gate resistance model selector"), -IOP( "geomod", BSIM4v6_GEOMOD, IF_INTEGER, "Geometry dependent parasitics model selector"), -IOP( "rgeomod", BSIM4v6_RGEOMOD, IF_INTEGER, "S/D resistance and contact model selector"), -IP( "ic", BSIM4v6_IC, IF_REALVEC , "Vector of DS,GS,BS initial voltages"), -OP( "gmbs", BSIM4v6_GMBS, IF_REAL, "Gmb"), -OP( "gm", BSIM4v6_GM, IF_REAL, "Gm"), -OP( "gds", BSIM4v6_GDS, IF_REAL, "Gds"), -OP( "vdsat", BSIM4v6_VDSAT, IF_REAL, "Vdsat"), -OP( "vth", BSIM4v6_VON, IF_REAL, "Vth"), -OP( "id", BSIM4v6_CD, IF_REAL, "Ids"), -OP( "ibd", BSIM4v6_CBD, IF_REAL, "Ibd"), -OP( "ibs", BSIM4v6_CBS, IF_REAL, "Ibs"), -OP( "gbd", BSIM4v6_GBD, IF_REAL, "gbd"), -OP( "gbs", BSIM4v6_GBS, IF_REAL, "gbs"), -OP( "isub", BSIM4v6_CSUB, IF_REAL, "Isub"), -OP( "igidl", BSIM4v6_IGIDL, IF_REAL, "Igidl"), -OP( "igisl", BSIM4v6_IGISL, IF_REAL, "Igisl"), -OP( "igs", BSIM4v6_IGS, IF_REAL, "Igs"), -OP( "igd", BSIM4v6_IGD, IF_REAL, "Igd"), -OP( "igb", BSIM4v6_IGB, IF_REAL, "Igb"), -OP( "igcs", BSIM4v6_IGCS, IF_REAL, "Igcs"), -OP( "igcd", BSIM4v6_IGCD, IF_REAL, "Igcd"), -OP( "vbs", BSIM4v6_VBS, IF_REAL, "Vbs"), -OP( "vgs", BSIM4v6_VGS, IF_REAL, "Vgs"), -OP( "vds", BSIM4v6_VDS, IF_REAL, "Vds"), -OP( "cgg", BSIM4v6_CGGB, IF_REAL, "Cggb"), -OP( "cgs", BSIM4v6_CGSB, IF_REAL, "Cgsb"), -OP( "cgd", BSIM4v6_CGDB, IF_REAL, "Cgdb"), -OP( "cbg", BSIM4v6_CBGB, IF_REAL, "Cbgb"), -OP( "cbd", BSIM4v6_CBDB, IF_REAL, "Cbdb"), -OP( "cbs", BSIM4v6_CBSB, IF_REAL, "Cbsb"), -OP( "cdg", BSIM4v6_CDGB, IF_REAL, "Cdgb"), -OP( "cdd", BSIM4v6_CDDB, IF_REAL, "Cddb"), -OP( "cds", BSIM4v6_CDSB, IF_REAL, "Cdsb"), -OP( "csg", BSIM4v6_CSGB, IF_REAL, "Csgb"), -OP( "csd", BSIM4v6_CSDB, IF_REAL, "Csdb"), -OP( "css", BSIM4v6_CSSB, IF_REAL, "Cssb"), -OP( "cgb", BSIM4v6_CGBB, IF_REAL, "Cgbb"), -OP( "cdb", BSIM4v6_CDBB, IF_REAL, "Cdbb"), -OP( "csb", BSIM4v6_CSBB, IF_REAL, "Csbb"), -OP( "cbb", BSIM4v6_CBBB, IF_REAL, "Cbbb"), -OP( "capbd", BSIM4v6_CAPBD, IF_REAL, "Capbd"), -OP( "capbs", BSIM4v6_CAPBS, IF_REAL, "Capbs"), -OP( "qg", BSIM4v6_QG, IF_REAL, "Qgate"), -OP( "qb", BSIM4v6_QB, IF_REAL, "Qbulk"), -OP( "qd", BSIM4v6_QD, IF_REAL, "Qdrain"), -OP( "qs", BSIM4v6_QS, IF_REAL, "Qsource"), -OP( "qinv", BSIM4v6_QINV, IF_REAL, "Qinversion"), -OP( "qdef", BSIM4v6_QDEF, IF_REAL, "Qdef"), -OP( "gcrg", BSIM4v6_GCRG, IF_REAL, "Gcrg"), -OP( "gtau", BSIM4v6_GTAU, IF_REAL, "Gtau"), -}; - -IFparm BSIM4v6mPTable[] = { /* model parameters */ -IOP( "cvchargemod", BSIM4v6_MOD_CVCHARGEMOD, IF_INTEGER, "Capacitance Charge model selector"), -IOP( "capmod", BSIM4v6_MOD_CAPMOD, IF_INTEGER, "Capacitance model selector"), -IOP( "diomod", BSIM4v6_MOD_DIOMOD, IF_INTEGER, "Diode IV model selector"), -IOP( "rdsmod", BSIM4v6_MOD_RDSMOD, IF_INTEGER, "Bias-dependent S/D resistance model selector"), -IOP( "trnqsmod", BSIM4v6_MOD_TRNQSMOD, IF_INTEGER, "Transient NQS model selector"), -IOP( "acnqsmod", BSIM4v6_MOD_ACNQSMOD, IF_INTEGER, "AC NQS model selector"), -IOP( "mobmod", BSIM4v6_MOD_MOBMOD, IF_INTEGER, "Mobility model selector"), -IOP( "rbodymod", BSIM4v6_MOD_RBODYMOD, IF_INTEGER, "Distributed body R model selector"), -IOP( "rgatemod", BSIM4v6_MOD_RGATEMOD, IF_INTEGER, "Gate R model selector"), -IOP( "permod", BSIM4v6_MOD_PERMOD, IF_INTEGER, "Pd and Ps model selector"), -IOP( "geomod", BSIM4v6_MOD_GEOMOD, IF_INTEGER, "Geometry dependent parasitics model selector"), -IOP( "rgeomod", BSIM4v6_MOD_RGEOMOD, IF_INTEGER, "S/D resistance and contact model selector"), -IOP( "fnoimod", BSIM4v6_MOD_FNOIMOD, IF_INTEGER, "Flicker noise model selector"), -IOP( "tnoimod", BSIM4v6_MOD_TNOIMOD, IF_INTEGER, "Thermal noise model selector"), -IOP( "mtrlmod", BSIM4v6_MOD_MTRLMOD, IF_INTEGER, "parameter for non-silicon substrate or metal gate selector"), -IOP( "igcmod", BSIM4v6_MOD_IGCMOD, IF_INTEGER, "Gate-to-channel Ig model selector"), -IOP( "igbmod", BSIM4v6_MOD_IGBMOD, IF_INTEGER, "Gate-to-body Ig model selector"), -IOP( "tempmod", BSIM4v6_MOD_TEMPMOD, IF_INTEGER, "Temperature model selector"), -IOP( "paramchk", BSIM4v6_MOD_PARAMCHK, IF_INTEGER, "Model parameter checking selector"), -IOP( "binunit", BSIM4v6_MOD_BINUNIT, IF_INTEGER, "Bin unit selector"), -IOP( "version", BSIM4v6_MOD_VERSION, IF_STRING, "parameter for model version"), -IOP( "eot", BSIM4v6_MOD_EOT, IF_REAL, "Equivalent gate oxide thickness in meters"), -IOP( "vddeot", BSIM4v6_MOD_VDDEOT, IF_REAL, "Voltage for extraction of Equivalent gate oxide thickness"), -IOP( "tempeot", BSIM4v6_MOD_TEMPEOT, IF_REAL, " Temperature for extraction of EOT"), -IOP( "leffeot", BSIM4v6_MOD_LEFFEOT, IF_REAL, " Effective length for extraction of EOT"), -IOP( "weffeot", BSIM4v6_MOD_WEFFEOT, IF_REAL, "Effective width for extraction of EOT"), -IOP( "ados", BSIM4v6_MOD_ADOS, IF_REAL, "Charge centroid parameter"), -IOP( "bdos", BSIM4v6_MOD_BDOS, IF_REAL, "Charge centroid parameter"), -IOP( "toxe", BSIM4v6_MOD_TOXE, IF_REAL, "Electrical gate oxide thickness in meters"), -IOP( "toxp", BSIM4v6_MOD_TOXP, IF_REAL, "Physical gate oxide thickness in meters"), -IOP( "toxm", BSIM4v6_MOD_TOXM, IF_REAL, "Gate oxide thickness at which parameters are extracted"), -IOP( "toxref", BSIM4v6_MOD_TOXREF, IF_REAL, "Target tox value"), -IOP( "dtox", BSIM4v6_MOD_DTOX, IF_REAL, "Defined as (toxe - toxp) "), -IOP( "epsrox", BSIM4v6_MOD_EPSROX, IF_REAL, "Dielectric constant of the gate oxide relative to vacuum"), -IOP( "cdsc", BSIM4v6_MOD_CDSC, IF_REAL, "Drain/Source and channel coupling capacitance"), -IOP( "cdscb", BSIM4v6_MOD_CDSCB, IF_REAL, "Body-bias dependence of cdsc"), -IOP( "cdscd", BSIM4v6_MOD_CDSCD, IF_REAL, "Drain-bias dependence of cdsc"), -IOP( "cit", BSIM4v6_MOD_CIT, IF_REAL, "Interface state capacitance"), -IOP( "nfactor", BSIM4v6_MOD_NFACTOR, IF_REAL, "Subthreshold swing Coefficient"), -IOP( "xj", BSIM4v6_MOD_XJ, IF_REAL, "Junction depth in meters"), -IOP( "vsat", BSIM4v6_MOD_VSAT, IF_REAL, "Saturation velocity at tnom"), -IOP( "at", BSIM4v6_MOD_AT, IF_REAL, "Temperature coefficient of vsat"), -IOP( "a0", BSIM4v6_MOD_A0, IF_REAL, "Non-uniform depletion width effect coefficient."), -IOP( "ags", BSIM4v6_MOD_AGS, IF_REAL, "Gate bias coefficient of Abulk."), -IOP( "a1", BSIM4v6_MOD_A1, IF_REAL, "Non-saturation effect coefficient"), -IOP( "a2", BSIM4v6_MOD_A2, IF_REAL, "Non-saturation effect coefficient"), -IOP( "keta", BSIM4v6_MOD_KETA, IF_REAL, "Body-bias coefficient of non-uniform depletion width effect."), -IOP( "phig", BSIM4v6_MOD_PHIG, IF_REAL, "Work function of gate"), -IOP( "epsrgate", BSIM4v6_MOD_EPSRGATE, IF_REAL, "Dielectric constant of gate relative to vacuum"), -IOP( "easub",BSIM4v6_MOD_EASUB, IF_REAL, "Electron affinity of substrate"), -IOP( "epsrsub", BSIM4v6_MOD_EPSRSUB, IF_REAL, "Dielectric constant of substrate relative to vacuum"), -IOP( "ni0sub", BSIM4v6_MOD_NI0SUB, IF_REAL, "Intrinsic carrier concentration of substrate at 300.15K"), -IOP( "bg0sub", BSIM4v6_MOD_BG0SUB, IF_REAL, "Band-gap of substrate at T=0K"), -IOP( "tbgasub", BSIM4v6_MOD_TBGASUB, IF_REAL, "First parameter of band-gap change due to temperature"), -IOP( "tbgbsub", BSIM4v6_MOD_TBGBSUB, IF_REAL, "Second parameter of band-gap change due to temperature"), -IOP( "nsub", BSIM4v6_MOD_NSUB, IF_REAL, "Substrate doping concentration"), -IOP( "ndep", BSIM4v6_MOD_NDEP, IF_REAL, "Channel doping concentration at the depletion edge"), -IOP( "nsd", BSIM4v6_MOD_NSD, IF_REAL, "S/D doping concentration"), -IOP( "phin", BSIM4v6_MOD_PHIN, IF_REAL, "Adjusting parameter for surface potential due to non-uniform vertical doping"), -IOP( "ngate", BSIM4v6_MOD_NGATE, IF_REAL, "Poly-gate doping concentration"), -IOP( "gamma1", BSIM4v6_MOD_GAMMA1, IF_REAL, "Vth body coefficient"), -IOP( "gamma2", BSIM4v6_MOD_GAMMA2, IF_REAL, "Vth body coefficient"), -IOP( "vbx", BSIM4v6_MOD_VBX, IF_REAL, "Vth transition body Voltage"), -IOP( "vbm", BSIM4v6_MOD_VBM, IF_REAL, "Maximum body voltage"), - -IOP( "xt", BSIM4v6_MOD_XT, IF_REAL, "Doping depth"), -IOP( "k1", BSIM4v6_MOD_K1, IF_REAL, "Bulk effect coefficient 1"), -IOP( "kt1", BSIM4v6_MOD_KT1, IF_REAL, "Temperature coefficient of Vth"), -IOP( "kt1l", BSIM4v6_MOD_KT1L, IF_REAL, "Temperature coefficient of Vth"), -IOP( "kt2", BSIM4v6_MOD_KT2, IF_REAL, "Body-coefficient of kt1"), -IOP( "k2", BSIM4v6_MOD_K2, IF_REAL, "Bulk effect coefficient 2"), -IOP( "k3", BSIM4v6_MOD_K3, IF_REAL, "Narrow width effect coefficient"), -IOP( "k3b", BSIM4v6_MOD_K3B, IF_REAL, "Body effect coefficient of k3"), -IOP( "w0", BSIM4v6_MOD_W0, IF_REAL, "Narrow width effect parameter"), -IOP( "dvtp0", BSIM4v6_MOD_DVTP0, IF_REAL, "First parameter for Vth shift due to pocket"), -IOP( "dvtp1", BSIM4v6_MOD_DVTP1, IF_REAL, "Second parameter for Vth shift due to pocket"), -IOP( "lpe0", BSIM4v6_MOD_LPE0, IF_REAL, "Equivalent length of pocket region at zero bias"), -IOP( "lpeb", BSIM4v6_MOD_LPEB, IF_REAL, "Equivalent length of pocket region accounting for body bias"), -IOP( "dvt0", BSIM4v6_MOD_DVT0, IF_REAL, "Short channel effect coeff. 0"), -IOP( "dvt1", BSIM4v6_MOD_DVT1, IF_REAL, "Short channel effect coeff. 1"), -IOP( "dvt2", BSIM4v6_MOD_DVT2, IF_REAL, "Short channel effect coeff. 2"), -IOP( "dvt0w", BSIM4v6_MOD_DVT0W, IF_REAL, "Narrow Width coeff. 0"), -IOP( "dvt1w", BSIM4v6_MOD_DVT1W, IF_REAL, "Narrow Width effect coeff. 1"), -IOP( "dvt2w", BSIM4v6_MOD_DVT2W, IF_REAL, "Narrow Width effect coeff. 2"), -IOP( "drout", BSIM4v6_MOD_DROUT, IF_REAL, "DIBL coefficient of output resistance"), -IOP( "dsub", BSIM4v6_MOD_DSUB, IF_REAL, "DIBL coefficient in the subthreshold region"), -IOP( "vth0", BSIM4v6_MOD_VTH0, IF_REAL,"Threshold voltage"), -IOPR("vtho", BSIM4v6_MOD_VTH0, IF_REAL,"Threshold voltage"), -IOP( "ua", BSIM4v6_MOD_UA, IF_REAL, "Linear gate dependence of mobility"), -IOP( "ua1", BSIM4v6_MOD_UA1, IF_REAL, "Temperature coefficient of ua"), -IOP( "ub", BSIM4v6_MOD_UB, IF_REAL, "Quadratic gate dependence of mobility"), -IOP( "ub1", BSIM4v6_MOD_UB1, IF_REAL, "Temperature coefficient of ub"), -IOP( "uc", BSIM4v6_MOD_UC, IF_REAL, "Body-bias dependence of mobility"), -IOP( "uc1", BSIM4v6_MOD_UC1, IF_REAL, "Temperature coefficient of uc"), -IOP( "ud", BSIM4v6_MOD_UD, IF_REAL, "Coulomb scattering factor of mobility"), -IOP( "ud1", BSIM4v6_MOD_UD1, IF_REAL, "Temperature coefficient of ud"), -IOP( "up", BSIM4v6_MOD_UP, IF_REAL, "Channel length linear factor of mobility"), -IOP( "lp", BSIM4v6_MOD_LP, IF_REAL, "Channel length exponential factor of mobility"), -IOP( "u0", BSIM4v6_MOD_U0, IF_REAL, "Low-field mobility at Tnom"), -IOP( "eu", BSIM4v6_MOD_EU, IF_REAL, "Mobility exponent"), -IOP( "ucs", BSIM4v6_MOD_UCS, IF_REAL, "Colombic scattering exponent"), -IOP( "ute", BSIM4v6_MOD_UTE, IF_REAL, "Temperature coefficient of mobility"), -IOP( "ucste", BSIM4v6_MOD_UCSTE, IF_REAL,"Temperature coefficient of colombic mobility"), -IOP( "voff", BSIM4v6_MOD_VOFF, IF_REAL, "Threshold voltage offset"), -IOP( "minv", BSIM4v6_MOD_MINV, IF_REAL, "Fitting parameter for moderate inversion in Vgsteff"), -IOP( "minvcv", BSIM4v6_MOD_MINVCV, IF_REAL, "Fitting parameter for moderate inversion in Vgsteffcv"), -IOP( "voffl", BSIM4v6_MOD_VOFFL, IF_REAL, "Length dependence parameter for Vth offset"), -IOP( "voffcvl", BSIM4v6_MOD_VOFFCVL, IF_REAL, "Length dependence parameter for Vth offset in CV"), -IOP( "tnom", BSIM4v6_MOD_TNOM, IF_REAL, "Parameter measurement temperature"), -IOP( "cgso", BSIM4v6_MOD_CGSO, IF_REAL, "Gate-source overlap capacitance per width"), -IOP( "cgdo", BSIM4v6_MOD_CGDO, IF_REAL, "Gate-drain overlap capacitance per width"), -IOP( "cgbo", BSIM4v6_MOD_CGBO, IF_REAL, "Gate-bulk overlap capacitance per length"), -IOP( "xpart", BSIM4v6_MOD_XPART, IF_REAL, "Channel charge partitioning"), -IOP( "delta", BSIM4v6_MOD_DELTA, IF_REAL, "Effective Vds parameter"), -IOP( "rsh", BSIM4v6_MOD_RSH, IF_REAL, "Source-drain sheet resistance"), -IOP( "rdsw", BSIM4v6_MOD_RDSW, IF_REAL, "Source-drain resistance per width"), -IOP( "rdswmin", BSIM4v6_MOD_RDSWMIN, IF_REAL, "Source-drain resistance per width at high Vg"), -IOP( "rsw", BSIM4v6_MOD_RSW, IF_REAL, "Source resistance per width"), -IOP( "rdw", BSIM4v6_MOD_RDW, IF_REAL, "Drain resistance per width"), -IOP( "rdwmin", BSIM4v6_MOD_RDWMIN, IF_REAL, "Drain resistance per width at high Vg"), -IOP( "rswmin", BSIM4v6_MOD_RSWMIN, IF_REAL, "Source resistance per width at high Vg"), - -IOP( "prwg", BSIM4v6_MOD_PRWG, IF_REAL, "Gate-bias effect on parasitic resistance "), -IOP( "prwb", BSIM4v6_MOD_PRWB, IF_REAL, "Body-effect on parasitic resistance "), - -IOP( "prt", BSIM4v6_MOD_PRT, IF_REAL, "Temperature coefficient of parasitic resistance "), -IOP( "eta0", BSIM4v6_MOD_ETA0, IF_REAL, "Subthreshold region DIBL coefficient"), -IOP( "etab", BSIM4v6_MOD_ETAB, IF_REAL, "Subthreshold region DIBL coefficient"), -IOP( "pclm", BSIM4v6_MOD_PCLM, IF_REAL, "Channel length modulation Coefficient"), -IOP( "pdiblc1", BSIM4v6_MOD_PDIBL1, IF_REAL, "Drain-induced barrier lowering coefficient"), -IOP( "pdiblc2", BSIM4v6_MOD_PDIBL2, IF_REAL, "Drain-induced barrier lowering coefficient"), -IOP( "pdiblcb", BSIM4v6_MOD_PDIBLB, IF_REAL, "Body-effect on drain-induced barrier lowering"), -IOP( "fprout", BSIM4v6_MOD_FPROUT, IF_REAL, "Rout degradation coefficient for pocket devices"), -IOP( "pdits", BSIM4v6_MOD_PDITS, IF_REAL, "Coefficient for drain-induced Vth shifts"), -IOP( "pditsl", BSIM4v6_MOD_PDITSL, IF_REAL, "Length dependence of drain-induced Vth shifts"), -IOP( "pditsd", BSIM4v6_MOD_PDITSD, IF_REAL, "Vds dependence of drain-induced Vth shifts"), -IOP( "pscbe1", BSIM4v6_MOD_PSCBE1, IF_REAL, "Substrate current body-effect coefficient"), -IOP( "pscbe2", BSIM4v6_MOD_PSCBE2, IF_REAL, "Substrate current body-effect coefficient"), -IOP( "pvag", BSIM4v6_MOD_PVAG, IF_REAL, "Gate dependence of output resistance parameter"), - -IOP( "jss", BSIM4v6_MOD_JSS, IF_REAL, "Bottom source junction reverse saturation current density"), -IOP( "jsws", BSIM4v6_MOD_JSWS, IF_REAL, "Isolation edge sidewall source junction reverse saturation current density"), -IOP( "jswgs", BSIM4v6_MOD_JSWGS, IF_REAL, "Gate edge source junction reverse saturation current density"), -IOP( "pbs", BSIM4v6_MOD_PBS, IF_REAL, "Source junction built-in potential"), -IOP( "njs", BSIM4v6_MOD_NJS, IF_REAL, "Source junction emission coefficient"), -IOP( "xtis", BSIM4v6_MOD_XTIS, IF_REAL, "Source junction current temperature exponent"), -IOP( "mjs", BSIM4v6_MOD_MJS, IF_REAL, "Source bottom junction capacitance grading coefficient"), -IOP( "pbsws", BSIM4v6_MOD_PBSWS, IF_REAL, "Source sidewall junction capacitance built in potential"), -IOP( "mjsws", BSIM4v6_MOD_MJSWS, IF_REAL, "Source sidewall junction capacitance grading coefficient"), -IOP( "pbswgs", BSIM4v6_MOD_PBSWGS, IF_REAL, "Source (gate side) sidewall junction capacitance built in potential"), -IOP( "mjswgs", BSIM4v6_MOD_MJSWGS, IF_REAL, "Source (gate side) sidewall junction capacitance grading coefficient"), -IOP( "cjs", BSIM4v6_MOD_CJS, IF_REAL, "Source bottom junction capacitance per unit area"), -IOP( "cjsws", BSIM4v6_MOD_CJSWS, IF_REAL, "Source sidewall junction capacitance per unit periphery"), -IOP( "cjswgs", BSIM4v6_MOD_CJSWGS, IF_REAL, "Source (gate side) sidewall junction capacitance per unit width"), - -IOP( "jsd", BSIM4v6_MOD_JSD, IF_REAL, "Bottom drain junction reverse saturation current density"), -IOP( "jswd", BSIM4v6_MOD_JSWD, IF_REAL, "Isolation edge sidewall drain junction reverse saturation current density"), -IOP( "jswgd", BSIM4v6_MOD_JSWGD, IF_REAL, "Gate edge drain junction reverse saturation current density"), -IOP( "pbd", BSIM4v6_MOD_PBD, IF_REAL, "Drain junction built-in potential"), -IOP( "njd", BSIM4v6_MOD_NJD, IF_REAL, "Drain junction emission coefficient"), -IOP( "xtid", BSIM4v6_MOD_XTID, IF_REAL, "Drainjunction current temperature exponent"), -IOP( "mjd", BSIM4v6_MOD_MJD, IF_REAL, "Drain bottom junction capacitance grading coefficient"), -IOP( "pbswd", BSIM4v6_MOD_PBSWD, IF_REAL, "Drain sidewall junction capacitance built in potential"), -IOP( "mjswd", BSIM4v6_MOD_MJSWD, IF_REAL, "Drain sidewall junction capacitance grading coefficient"), -IOP( "pbswgd", BSIM4v6_MOD_PBSWGD, IF_REAL, "Drain (gate side) sidewall junction capacitance built in potential"), -IOP( "mjswgd", BSIM4v6_MOD_MJSWGD, IF_REAL, "Drain (gate side) sidewall junction capacitance grading coefficient"), -IOP( "cjd", BSIM4v6_MOD_CJD, IF_REAL, "Drain bottom junction capacitance per unit area"), -IOP( "cjswd", BSIM4v6_MOD_CJSWD, IF_REAL, "Drain sidewall junction capacitance per unit periphery"), -IOP( "cjswgd", BSIM4v6_MOD_CJSWGD, IF_REAL, "Drain (gate side) sidewall junction capacitance per unit width"), - -IOP( "vfbcv", BSIM4v6_MOD_VFBCV, IF_REAL, "Flat Band Voltage parameter for capmod=0 only"), -IOP( "vfb", BSIM4v6_MOD_VFB, IF_REAL, "Flat Band Voltage"), -IOP( "tpb", BSIM4v6_MOD_TPB, IF_REAL, "Temperature coefficient of pb"), -IOP( "tcj", BSIM4v6_MOD_TCJ, IF_REAL, "Temperature coefficient of cj"), -IOP( "tpbsw", BSIM4v6_MOD_TPBSW, IF_REAL, "Temperature coefficient of pbsw"), -IOP( "tcjsw", BSIM4v6_MOD_TCJSW, IF_REAL, "Temperature coefficient of cjsw"), -IOP( "tpbswg", BSIM4v6_MOD_TPBSWG, IF_REAL, "Temperature coefficient of pbswg"), -IOP( "tcjswg", BSIM4v6_MOD_TCJSWG, IF_REAL, "Temperature coefficient of cjswg"), -IOP( "acde", BSIM4v6_MOD_ACDE, IF_REAL, "Exponential coefficient for finite charge thickness"), -IOP( "moin", BSIM4v6_MOD_MOIN, IF_REAL, "Coefficient for gate-bias dependent surface potential"), -IOP( "noff", BSIM4v6_MOD_NOFF, IF_REAL, "C-V turn-on/off parameter"), -IOP( "voffcv", BSIM4v6_MOD_VOFFCV, IF_REAL, "C-V lateral-shift parameter"), -IOP( "dmcg", BSIM4v6_MOD_DMCG, IF_REAL, "Distance of Mid-Contact to Gate edge"), -IOP( "dmci", BSIM4v6_MOD_DMCI, IF_REAL, "Distance of Mid-Contact to Isolation"), -IOP( "dmdg", BSIM4v6_MOD_DMDG, IF_REAL, "Distance of Mid-Diffusion to Gate edge"), -IOP( "dmcgt", BSIM4v6_MOD_DMCGT, IF_REAL, "Distance of Mid-Contact to Gate edge in Test structures"), -IOP( "xgw", BSIM4v6_MOD_XGW, IF_REAL, "Distance from gate contact center to device edge"), -IOP( "xgl", BSIM4v6_MOD_XGL, IF_REAL, "Variation in Ldrawn"), -IOP( "rshg", BSIM4v6_MOD_RSHG, IF_REAL, "Gate sheet resistance"), -IOP( "ngcon", BSIM4v6_MOD_NGCON, IF_REAL, "Number of gate contacts"), -IOP( "xrcrg1", BSIM4v6_MOD_XRCRG1, IF_REAL, "First fitting parameter the bias-dependent Rg"), -IOP( "xrcrg2", BSIM4v6_MOD_XRCRG2, IF_REAL, "Second fitting parameter the bias-dependent Rg"), -IOP( "lambda", BSIM4v6_MOD_LAMBDA, IF_REAL, " Velocity overshoot parameter"), -IOP( "vtl", BSIM4v6_MOD_VTL, IF_REAL, " thermal velocity"), -IOP( "lc", BSIM4v6_MOD_LC, IF_REAL, " back scattering parameter"), -IOP( "xn", BSIM4v6_MOD_XN, IF_REAL, " back scattering parameter"), -IOP( "vfbsdoff", BSIM4v6_MOD_VFBSDOFF, IF_REAL, "S/D flatband voltage offset"), -IOP( "tvfbsdoff", BSIM4v6_MOD_TVFBSDOFF, IF_REAL, "Temperature parameter for vfbsdoff"), -IOP( "tvoff", BSIM4v6_MOD_TVOFF, IF_REAL, "Temperature parameter for voff"), - -IOP( "lintnoi", BSIM4v6_MOD_LINTNOI, IF_REAL, "lint offset for noise calculation"), -IOP( "lint", BSIM4v6_MOD_LINT, IF_REAL, "Length reduction parameter"), -IOP( "ll", BSIM4v6_MOD_LL, IF_REAL, "Length reduction parameter"), -IOP( "llc", BSIM4v6_MOD_LLC, IF_REAL, "Length reduction parameter for CV"), -IOP( "lln", BSIM4v6_MOD_LLN, IF_REAL, "Length reduction parameter"), -IOP( "lw", BSIM4v6_MOD_LW, IF_REAL, "Length reduction parameter"), -IOP( "lwc", BSIM4v6_MOD_LWC, IF_REAL, "Length reduction parameter for CV"), -IOP( "lwn", BSIM4v6_MOD_LWN, IF_REAL, "Length reduction parameter"), -IOP( "lwl", BSIM4v6_MOD_LWL, IF_REAL, "Length reduction parameter"), -IOP( "lwlc", BSIM4v6_MOD_LWLC, IF_REAL, "Length reduction parameter for CV"), -IOP( "lmin", BSIM4v6_MOD_LMIN, IF_REAL, "Minimum length for the model"), -IOP( "lmax", BSIM4v6_MOD_LMAX, IF_REAL, "Maximum length for the model"), - -IOP( "wr", BSIM4v6_MOD_WR, IF_REAL, "Width dependence of rds"), -IOP( "wint", BSIM4v6_MOD_WINT, IF_REAL, "Width reduction parameter"), -IOP( "dwg", BSIM4v6_MOD_DWG, IF_REAL, "Width reduction parameter"), -IOP( "dwb", BSIM4v6_MOD_DWB, IF_REAL, "Width reduction parameter"), - -IOP( "wl", BSIM4v6_MOD_WL, IF_REAL, "Width reduction parameter"), -IOP( "wlc", BSIM4v6_MOD_WLC, IF_REAL, "Width reduction parameter for CV"), -IOP( "wln", BSIM4v6_MOD_WLN, IF_REAL, "Width reduction parameter"), -IOP( "ww", BSIM4v6_MOD_WW, IF_REAL, "Width reduction parameter"), -IOP( "wwc", BSIM4v6_MOD_WWC, IF_REAL, "Width reduction parameter for CV"), -IOP( "wwn", BSIM4v6_MOD_WWN, IF_REAL, "Width reduction parameter"), -IOP( "wwl", BSIM4v6_MOD_WWL, IF_REAL, "Width reduction parameter"), -IOP( "wwlc", BSIM4v6_MOD_WWLC, IF_REAL, "Width reduction parameter for CV"), -IOP( "wmin", BSIM4v6_MOD_WMIN, IF_REAL, "Minimum width for the model"), -IOP( "wmax", BSIM4v6_MOD_WMAX, IF_REAL, "Maximum width for the model"), - -IOP( "b0", BSIM4v6_MOD_B0, IF_REAL, "Abulk narrow width parameter"), -IOP( "b1", BSIM4v6_MOD_B1, IF_REAL, "Abulk narrow width parameter"), - -IOP( "cgsl", BSIM4v6_MOD_CGSL, IF_REAL, "New C-V model parameter"), -IOP( "cgdl", BSIM4v6_MOD_CGDL, IF_REAL, "New C-V model parameter"), -IOP( "ckappas", BSIM4v6_MOD_CKAPPAS, IF_REAL, "S/G overlap C-V parameter "), -IOP( "ckappad", BSIM4v6_MOD_CKAPPAD, IF_REAL, "D/G overlap C-V parameter"), -IOP( "cf", BSIM4v6_MOD_CF, IF_REAL, "Fringe capacitance parameter"), -IOP( "clc", BSIM4v6_MOD_CLC, IF_REAL, "Vdsat parameter for C-V model"), -IOP( "cle", BSIM4v6_MOD_CLE, IF_REAL, "Vdsat parameter for C-V model"), -IOP( "dwc", BSIM4v6_MOD_DWC, IF_REAL, "Delta W for C-V model"), -IOP( "dlc", BSIM4v6_MOD_DLC, IF_REAL, "Delta L for C-V model"), -IOP( "xw", BSIM4v6_MOD_XW, IF_REAL, "W offset for channel width due to mask/etch effect"), -IOP( "xl", BSIM4v6_MOD_XL, IF_REAL, "L offset for channel length due to mask/etch effect"), -IOP( "dlcig", BSIM4v6_MOD_DLCIG, IF_REAL, "Delta L for Ig model"), -IOP( "dlcigd", BSIM4v6_MOD_DLCIGD, IF_REAL, "Delta L for Ig model drain side"), -IOP( "dwj", BSIM4v6_MOD_DWJ, IF_REAL, "Delta W for S/D junctions"), - -IOP( "alpha0", BSIM4v6_MOD_ALPHA0, IF_REAL, "substrate current model parameter"), -IOP( "alpha1", BSIM4v6_MOD_ALPHA1, IF_REAL, "substrate current model parameter"), -IOP( "beta0", BSIM4v6_MOD_BETA0, IF_REAL, "substrate current model parameter"), - -IOP( "agidl", BSIM4v6_MOD_AGIDL, IF_REAL, "Pre-exponential constant for GIDL"), -IOP( "bgidl", BSIM4v6_MOD_BGIDL, IF_REAL, "Exponential constant for GIDL"), -IOP( "cgidl", BSIM4v6_MOD_CGIDL, IF_REAL, "Parameter for body-bias dependence of GIDL"), -IOP( "egidl", BSIM4v6_MOD_EGIDL, IF_REAL, "Fitting parameter for Bandbending"), -IOP( "agisl", BSIM4v6_MOD_AGISL, IF_REAL, "Pre-exponential constant for GISL"), -IOP( "bgisl", BSIM4v6_MOD_BGISL, IF_REAL, "Exponential constant for GISL"), -IOP( "cgisl", BSIM4v6_MOD_CGISL, IF_REAL, "Parameter for body-bias dependence of GISL"), -IOP( "egisl", BSIM4v6_MOD_EGISL, IF_REAL, "Fitting parameter for Bandbending"), -IOP( "aigc", BSIM4v6_MOD_AIGC, IF_REAL, "Parameter for Igc"), -IOP( "bigc", BSIM4v6_MOD_BIGC, IF_REAL, "Parameter for Igc"), -IOP( "cigc", BSIM4v6_MOD_CIGC, IF_REAL, "Parameter for Igc"), -IOP( "aigsd", BSIM4v6_MOD_AIGSD, IF_REAL, "Parameter for Igs,d"), -IOP( "bigsd", BSIM4v6_MOD_BIGSD, IF_REAL, "Parameter for Igs,d"), -IOP( "cigsd", BSIM4v6_MOD_CIGSD, IF_REAL, "Parameter for Igs,d"), -IOP( "aigs", BSIM4v6_MOD_AIGS, IF_REAL, "Parameter for Igs"), -IOP( "bigs", BSIM4v6_MOD_BIGS, IF_REAL, "Parameter for Igs"), -IOP( "cigs", BSIM4v6_MOD_CIGS, IF_REAL, "Parameter for Igs"), -IOP( "aigd", BSIM4v6_MOD_AIGD, IF_REAL, "Parameter for Igd"), -IOP( "bigd", BSIM4v6_MOD_BIGD, IF_REAL, "Parameter for Igd"), -IOP( "cigd", BSIM4v6_MOD_CIGD, IF_REAL, "Parameter for Igd"), -IOP( "aigbacc", BSIM4v6_MOD_AIGBACC, IF_REAL, "Parameter for Igb"), -IOP( "bigbacc", BSIM4v6_MOD_BIGBACC, IF_REAL, "Parameter for Igb"), -IOP( "cigbacc", BSIM4v6_MOD_CIGBACC, IF_REAL, "Parameter for Igb"), -IOP( "aigbinv", BSIM4v6_MOD_AIGBINV, IF_REAL, "Parameter for Igb"), -IOP( "bigbinv", BSIM4v6_MOD_BIGBINV, IF_REAL, "Parameter for Igb"), -IOP( "cigbinv", BSIM4v6_MOD_CIGBINV, IF_REAL, "Parameter for Igb"), -IOP( "nigc", BSIM4v6_MOD_NIGC, IF_REAL, "Parameter for Igc slope"), -IOP( "nigbinv", BSIM4v6_MOD_NIGBINV, IF_REAL, "Parameter for Igbinv slope"), -IOP( "nigbacc", BSIM4v6_MOD_NIGBACC, IF_REAL, "Parameter for Igbacc slope"), -IOP( "ntox", BSIM4v6_MOD_NTOX, IF_REAL, "Exponent for Tox ratio"), -IOP( "eigbinv", BSIM4v6_MOD_EIGBINV, IF_REAL, "Parameter for the Si bandgap for Igbinv"), -IOP( "pigcd", BSIM4v6_MOD_PIGCD, IF_REAL, "Parameter for Igc partition"), -IOP( "poxedge", BSIM4v6_MOD_POXEDGE, IF_REAL, "Factor for the gate edge Tox"), - -IOP( "ijthdfwd", BSIM4v6_MOD_IJTHDFWD, IF_REAL, "Forward drain diode forward limiting current"), -IOP( "ijthsfwd", BSIM4v6_MOD_IJTHSFWD, IF_REAL, "Forward source diode forward limiting current"), -IOP( "ijthdrev", BSIM4v6_MOD_IJTHDREV, IF_REAL, "Reverse drain diode forward limiting current"), -IOP( "ijthsrev", BSIM4v6_MOD_IJTHSREV, IF_REAL, "Reverse source diode forward limiting current"), -IOP( "xjbvd", BSIM4v6_MOD_XJBVD, IF_REAL, "Fitting parameter for drain diode breakdown current"), -IOP( "xjbvs", BSIM4v6_MOD_XJBVS, IF_REAL, "Fitting parameter for source diode breakdown current"), -IOP( "bvd", BSIM4v6_MOD_BVD, IF_REAL, "Drain diode breakdown voltage"), -IOP( "bvs", BSIM4v6_MOD_BVS, IF_REAL, "Source diode breakdown voltage"), - -IOP( "jtss", BSIM4v6_MOD_JTSS, IF_REAL, "Source bottom trap-assisted saturation current density"), -IOP( "jtsd", BSIM4v6_MOD_JTSD, IF_REAL, "Drain bottom trap-assisted saturation current density"), -IOP( "jtssws", BSIM4v6_MOD_JTSSWS, IF_REAL, "Source STI sidewall trap-assisted saturation current density"), -IOP( "jtsswd", BSIM4v6_MOD_JTSSWD, IF_REAL, "Drain STI sidewall trap-assisted saturation current density"), -IOP( "jtsswgs", BSIM4v6_MOD_JTSSWGS, IF_REAL, "Source gate-edge sidewall trap-assisted saturation current density"), -IOP( "jtsswgd", BSIM4v6_MOD_JTSSWGD, IF_REAL, "Drain gate-edge sidewall trap-assisted saturation current density"), -IOP( "jtweff", BSIM4v6_MOD_JTWEFF, IF_REAL, "TAT current width dependence"), -IOP( "njts", BSIM4v6_MOD_NJTS, IF_REAL, "Non-ideality factor for bottom junction"), -IOP( "njtssw", BSIM4v6_MOD_NJTSSW, IF_REAL, "Non-ideality factor for STI sidewall junction"), -IOP( "njtsswg", BSIM4v6_MOD_NJTSSWG, IF_REAL, "Non-ideality factor for gate-edge sidewall junction"), -IOP( "njtsd", BSIM4v6_MOD_NJTSD, IF_REAL, "Non-ideality factor for bottom junction drain side"), -IOP( "njtsswd", BSIM4v6_MOD_NJTSSWD, IF_REAL, "Non-ideality factor for STI sidewall junction drain side"), -IOP( "njtsswgd", BSIM4v6_MOD_NJTSSWGD, IF_REAL, "Non-ideality factor for gate-edge sidewall junction drain side"), -IOP( "xtss", BSIM4v6_MOD_XTSS, IF_REAL, "Power dependence of JTSS on temperature"), -IOP( "xtsd", BSIM4v6_MOD_XTSD, IF_REAL, "Power dependence of JTSD on temperature"), -IOP( "xtssws", BSIM4v6_MOD_XTSSWS, IF_REAL, "Power dependence of JTSSWS on temperature"), -IOP( "xtsswd", BSIM4v6_MOD_XTSSWD, IF_REAL, "Power dependence of JTSSWD on temperature"), -IOP( "xtsswgs", BSIM4v6_MOD_XTSSWGS, IF_REAL, "Power dependence of JTSSWGS on temperature"), -IOP( "xtsswgd", BSIM4v6_MOD_XTSSWGD, IF_REAL, "Power dependence of JTSSWGD on temperature"), -IOP( "tnjts", BSIM4v6_MOD_TNJTS, IF_REAL, "Temperature coefficient for NJTS"), -IOP( "tnjtssw", BSIM4v6_MOD_TNJTSSW, IF_REAL, "Temperature coefficient for NJTSSW"), -IOP( "tnjtsswg", BSIM4v6_MOD_TNJTSSWG, IF_REAL, "Temperature coefficient for NJTSSWG"), -IOP( "tnjtsd", BSIM4v6_MOD_TNJTSD, IF_REAL, "Temperature coefficient for NJTSD"), -IOP( "tnjtsswd", BSIM4v6_MOD_TNJTSSWD, IF_REAL, "Temperature coefficient for NJTSSWD"), -IOP( "tnjtsswgd", BSIM4v6_MOD_TNJTSSWGD, IF_REAL, "Temperature coefficient for NJTSSWGD"), -IOP( "vtss", BSIM4v6_MOD_VTSS, IF_REAL, "Source bottom trap-assisted voltage dependent parameter"), -IOP( "vtsd", BSIM4v6_MOD_VTSD, IF_REAL, "Drain bottom trap-assisted voltage dependent parameter"), -IOP( "vtssws", BSIM4v6_MOD_VTSSWS, IF_REAL, "Source STI sidewall trap-assisted voltage dependent parameter"), -IOP( "vtsswd", BSIM4v6_MOD_VTSSWD, IF_REAL, "Drain STI sidewall trap-assisted voltage dependent parameter"), -IOP( "vtsswgs", BSIM4v6_MOD_VTSSWGS, IF_REAL, "Source gate-edge sidewall trap-assisted voltage dependent parameter"), -IOP( "vtsswgd", BSIM4v6_MOD_VTSSWGD, IF_REAL, "Drain gate-edge sidewall trap-assisted voltage dependent parameter"), - -IOP( "gbmin", BSIM4v6_MOD_GBMIN, IF_REAL, "Minimum body conductance"), -IOP( "rbdb", BSIM4v6_MOD_RBDB, IF_REAL, "Resistance between bNode and dbNode"), -IOP( "rbpb", BSIM4v6_MOD_RBPB, IF_REAL, "Resistance between bNodePrime and bNode"), -IOP( "rbsb", BSIM4v6_MOD_RBSB, IF_REAL, "Resistance between bNode and sbNode"), -IOP( "rbps", BSIM4v6_MOD_RBPS, IF_REAL, "Resistance between bNodePrime and sbNode"), -IOP( "rbpd", BSIM4v6_MOD_RBPD, IF_REAL, "Resistance between bNodePrime and bNode"), - -IOP( "rbps0", BSIM4v6_MOD_RBPS0, IF_REAL , "Body resistance RBPS scaling"), -IOP( "rbpsl", BSIM4v6_MOD_RBPSL, IF_REAL , "Body resistance RBPS L scaling"), -IOP( "rbpsw", BSIM4v6_MOD_RBPSW, IF_REAL , "Body resistance RBPS W scaling"), -IOP( "rbpsnf", BSIM4v6_MOD_RBPSNF, IF_REAL , "Body resistance RBPS NF scaling"), - -IOP( "rbpd0", BSIM4v6_MOD_RBPD0, IF_REAL , "Body resistance RBPD scaling"), -IOP( "rbpdl", BSIM4v6_MOD_RBPDL, IF_REAL , "Body resistance RBPD L scaling"), -IOP( "rbpdw", BSIM4v6_MOD_RBPDW, IF_REAL , "Body resistance RBPD W scaling"), -IOP( "rbpdnf", BSIM4v6_MOD_RBPDNF, IF_REAL , "Body resistance RBPD NF scaling"), - -IOP( "rbpbx0", BSIM4v6_MOD_RBPBX0, IF_REAL , "Body resistance RBPBX scaling"), -IOP( "rbpbxl", BSIM4v6_MOD_RBPBXL, IF_REAL , "Body resistance RBPBX L scaling"), -IOP( "rbpbxw", BSIM4v6_MOD_RBPBXW, IF_REAL , "Body resistance RBPBX W scaling"), -IOP( "rbpbxnf", BSIM4v6_MOD_RBPBXNF, IF_REAL , "Body resistance RBPBX NF scaling"), -IOP( "rbpby0", BSIM4v6_MOD_RBPBY0, IF_REAL , "Body resistance RBPBY scaling"), -IOP( "rbpbyl", BSIM4v6_MOD_RBPBYL, IF_REAL , "Body resistance RBPBY L scaling"), -IOP( "rbpbyw", BSIM4v6_MOD_RBPBYW, IF_REAL , "Body resistance RBPBY W scaling"), -IOP( "rbpbynf", BSIM4v6_MOD_RBPBYNF, IF_REAL , "Body resistance RBPBY NF scaling"), - -IOP( "rbsbx0", BSIM4v6_MOD_RBSBX0, IF_REAL , "Body resistance RBSBX scaling"), -IOP( "rbsby0", BSIM4v6_MOD_RBSBY0, IF_REAL , "Body resistance RBSBY scaling"), -IOP( "rbdbx0", BSIM4v6_MOD_RBDBX0, IF_REAL , "Body resistance RBDBX scaling"), -IOP( "rbdby0", BSIM4v6_MOD_RBDBY0, IF_REAL , "Body resistance RBDBY scaling"), - -IOP( "rbsdbxl", BSIM4v6_MOD_RBSDBXL, IF_REAL , "Body resistance RBSDBX L scaling"), -IOP( "rbsdbxw", BSIM4v6_MOD_RBSDBXW, IF_REAL , "Body resistance RBSDBX W scaling"), -IOP( "rbsdbxnf", BSIM4v6_MOD_RBSDBXNF, IF_REAL , "Body resistance RBSDBX NF scaling"), -IOP( "rbsdbyl", BSIM4v6_MOD_RBSDBYL, IF_REAL , "Body resistance RBSDBY L scaling"), -IOP( "rbsdbyw", BSIM4v6_MOD_RBSDBYW, IF_REAL , "Body resistance RBSDBY W scaling"), -IOP( "rbsdbynf", BSIM4v6_MOD_RBSDBYNF, IF_REAL , "Body resistance RBSDBY NF scaling"), - -IOP( "lcdsc", BSIM4v6_MOD_LCDSC, IF_REAL, "Length dependence of cdsc"), -IOP( "lcdscb", BSIM4v6_MOD_LCDSCB, IF_REAL, "Length dependence of cdscb"), -IOP( "lcdscd", BSIM4v6_MOD_LCDSCD, IF_REAL, "Length dependence of cdscd"), -IOP( "lcit", BSIM4v6_MOD_LCIT, IF_REAL, "Length dependence of cit"), -IOP( "lnfactor", BSIM4v6_MOD_LNFACTOR, IF_REAL, "Length dependence of nfactor"), -IOP( "lxj", BSIM4v6_MOD_LXJ, IF_REAL, "Length dependence of xj"), -IOP( "lvsat", BSIM4v6_MOD_LVSAT, IF_REAL, "Length dependence of vsat"), -IOP( "lat", BSIM4v6_MOD_LAT, IF_REAL, "Length dependence of at"), -IOP( "la0", BSIM4v6_MOD_LA0, IF_REAL, "Length dependence of a0"), -IOP( "lags", BSIM4v6_MOD_LAGS, IF_REAL, "Length dependence of ags"), -IOP( "la1", BSIM4v6_MOD_LA1, IF_REAL, "Length dependence of a1"), -IOP( "la2", BSIM4v6_MOD_LA2, IF_REAL, "Length dependence of a2"), -IOP( "lketa", BSIM4v6_MOD_LKETA, IF_REAL, "Length dependence of keta"), -IOP( "lnsub", BSIM4v6_MOD_LNSUB, IF_REAL, "Length dependence of nsub"), -IOP( "lndep", BSIM4v6_MOD_LNDEP, IF_REAL, "Length dependence of ndep"), -IOP( "lnsd", BSIM4v6_MOD_LNSD, IF_REAL, "Length dependence of nsd"), -IOP( "lphin", BSIM4v6_MOD_LPHIN, IF_REAL, "Length dependence of phin"), -IOP( "lngate", BSIM4v6_MOD_LNGATE, IF_REAL, "Length dependence of ngate"), -IOP( "lgamma1", BSIM4v6_MOD_LGAMMA1, IF_REAL, "Length dependence of gamma1"), -IOP( "lgamma2", BSIM4v6_MOD_LGAMMA2, IF_REAL, "Length dependence of gamma2"), -IOP( "lvbx", BSIM4v6_MOD_LVBX, IF_REAL, "Length dependence of vbx"), -IOP( "lvbm", BSIM4v6_MOD_LVBM, IF_REAL, "Length dependence of vbm"), -IOP( "lxt", BSIM4v6_MOD_LXT, IF_REAL, "Length dependence of xt"), -IOP( "lk1", BSIM4v6_MOD_LK1, IF_REAL, "Length dependence of k1"), -IOP( "lkt1", BSIM4v6_MOD_LKT1, IF_REAL, "Length dependence of kt1"), -IOP( "lkt1l", BSIM4v6_MOD_LKT1L, IF_REAL, "Length dependence of kt1l"), -IOP( "lkt2", BSIM4v6_MOD_LKT2, IF_REAL, "Length dependence of kt2"), -IOP( "lk2", BSIM4v6_MOD_LK2, IF_REAL, "Length dependence of k2"), -IOP( "lk3", BSIM4v6_MOD_LK3, IF_REAL, "Length dependence of k3"), -IOP( "lk3b", BSIM4v6_MOD_LK3B, IF_REAL, "Length dependence of k3b"), -IOP( "lw0", BSIM4v6_MOD_LW0, IF_REAL, "Length dependence of w0"), -IOP( "ldvtp0", BSIM4v6_MOD_LDVTP0, IF_REAL, "Length dependence of dvtp0"), -IOP( "ldvtp1", BSIM4v6_MOD_LDVTP1, IF_REAL, "Length dependence of dvtp1"), -IOP( "llpe0", BSIM4v6_MOD_LLPE0, IF_REAL, "Length dependence of lpe0"), -IOP( "llpeb", BSIM4v6_MOD_LLPEB, IF_REAL, "Length dependence of lpeb"), -IOP( "ldvt0", BSIM4v6_MOD_LDVT0, IF_REAL, "Length dependence of dvt0"), -IOP( "ldvt1", BSIM4v6_MOD_LDVT1, IF_REAL, "Length dependence of dvt1"), -IOP( "ldvt2", BSIM4v6_MOD_LDVT2, IF_REAL, "Length dependence of dvt2"), -IOP( "ldvt0w", BSIM4v6_MOD_LDVT0W, IF_REAL, "Length dependence of dvt0w"), -IOP( "ldvt1w", BSIM4v6_MOD_LDVT1W, IF_REAL, "Length dependence of dvt1w"), -IOP( "ldvt2w", BSIM4v6_MOD_LDVT2W, IF_REAL, "Length dependence of dvt2w"), -IOP( "ldrout", BSIM4v6_MOD_LDROUT, IF_REAL, "Length dependence of drout"), -IOP( "ldsub", BSIM4v6_MOD_LDSUB, IF_REAL, "Length dependence of dsub"), -IOP( "lvth0", BSIM4v6_MOD_LVTH0, IF_REAL,"Length dependence of vth0"), -IOPR("lvtho", BSIM4v6_MOD_LVTH0, IF_REAL,"Length dependence of vtho"), -IOP( "lua", BSIM4v6_MOD_LUA, IF_REAL, "Length dependence of ua"), -IOP( "lua1", BSIM4v6_MOD_LUA1, IF_REAL, "Length dependence of ua1"), -IOP( "lub", BSIM4v6_MOD_LUB, IF_REAL, "Length dependence of ub"), -IOP( "lub1", BSIM4v6_MOD_LUB1, IF_REAL, "Length dependence of ub1"), -IOP( "luc", BSIM4v6_MOD_LUC, IF_REAL, "Length dependence of uc"), -IOP( "luc1", BSIM4v6_MOD_LUC1, IF_REAL, "Length dependence of uc1"), -IOP( "lud", BSIM4v6_MOD_LUD, IF_REAL, "Length dependence of ud"), -IOP( "lud1", BSIM4v6_MOD_LUD1, IF_REAL, "Length dependence of ud1"), -IOP( "lup", BSIM4v6_MOD_LUP, IF_REAL, "Length dependence of up"), -IOP( "llp", BSIM4v6_MOD_LLP, IF_REAL, "Length dependence of lp"), -IOP( "lu0", BSIM4v6_MOD_LU0, IF_REAL, "Length dependence of u0"), -IOP( "lute", BSIM4v6_MOD_LUTE, IF_REAL, "Length dependence of ute"), -IOP( "lucste", BSIM4v6_MOD_LUCSTE, IF_REAL, "Length dependence of ucste"), -IOP( "lvoff", BSIM4v6_MOD_LVOFF, IF_REAL, "Length dependence of voff"), -IOP( "lminv", BSIM4v6_MOD_LMINV, IF_REAL, "Length dependence of minv"), -IOP( "lminvcv", BSIM4v6_MOD_LMINVCV, IF_REAL, "Length dependence of minvcv"), -IOP( "ldelta", BSIM4v6_MOD_LDELTA, IF_REAL, "Length dependence of delta"), -IOP( "lrdsw", BSIM4v6_MOD_LRDSW, IF_REAL, "Length dependence of rdsw "), -IOP( "lrsw", BSIM4v6_MOD_LRSW, IF_REAL, "Length dependence of rsw"), -IOP( "lrdw", BSIM4v6_MOD_LRDW, IF_REAL, "Length dependence of rdw"), - -IOP( "lprwg", BSIM4v6_MOD_LPRWG, IF_REAL, "Length dependence of prwg "), -IOP( "lprwb", BSIM4v6_MOD_LPRWB, IF_REAL, "Length dependence of prwb "), - -IOP( "lprt", BSIM4v6_MOD_LPRT, IF_REAL, "Length dependence of prt "), -IOP( "leta0", BSIM4v6_MOD_LETA0, IF_REAL, "Length dependence of eta0"), -IOP( "letab", BSIM4v6_MOD_LETAB, IF_REAL, "Length dependence of etab"), -IOP( "lpclm", BSIM4v6_MOD_LPCLM, IF_REAL, "Length dependence of pclm"), -IOP( "lpdiblc1", BSIM4v6_MOD_LPDIBL1, IF_REAL, "Length dependence of pdiblc1"), -IOP( "lpdiblc2", BSIM4v6_MOD_LPDIBL2, IF_REAL, "Length dependence of pdiblc2"), -IOP( "lpdiblcb", BSIM4v6_MOD_LPDIBLB, IF_REAL, "Length dependence of pdiblcb"), -IOP( "lfprout", BSIM4v6_MOD_LFPROUT, IF_REAL, "Length dependence of pdiblcb"), -IOP( "lpdits", BSIM4v6_MOD_LPDITS, IF_REAL, "Length dependence of pdits"), -IOP( "lpditsd", BSIM4v6_MOD_LPDITSD, IF_REAL, "Length dependence of pditsd"), -IOP( "lpscbe1", BSIM4v6_MOD_LPSCBE1, IF_REAL, "Length dependence of pscbe1"), -IOP( "lpscbe2", BSIM4v6_MOD_LPSCBE2, IF_REAL, "Length dependence of pscbe2"), -IOP( "lpvag", BSIM4v6_MOD_LPVAG, IF_REAL, "Length dependence of pvag"), -IOP( "lwr", BSIM4v6_MOD_LWR, IF_REAL, "Length dependence of wr"), -IOP( "ldwg", BSIM4v6_MOD_LDWG, IF_REAL, "Length dependence of dwg"), -IOP( "ldwb", BSIM4v6_MOD_LDWB, IF_REAL, "Length dependence of dwb"), -IOP( "lb0", BSIM4v6_MOD_LB0, IF_REAL, "Length dependence of b0"), -IOP( "lb1", BSIM4v6_MOD_LB1, IF_REAL, "Length dependence of b1"), -IOP( "lcgsl", BSIM4v6_MOD_LCGSL, IF_REAL, "Length dependence of cgsl"), -IOP( "lcgdl", BSIM4v6_MOD_LCGDL, IF_REAL, "Length dependence of cgdl"), -IOP( "lckappas", BSIM4v6_MOD_LCKAPPAS, IF_REAL, "Length dependence of ckappas"), -IOP( "lckappad", BSIM4v6_MOD_LCKAPPAD, IF_REAL, "Length dependence of ckappad"), -IOP( "lcf", BSIM4v6_MOD_LCF, IF_REAL, "Length dependence of cf"), -IOP( "lclc", BSIM4v6_MOD_LCLC, IF_REAL, "Length dependence of clc"), -IOP( "lcle", BSIM4v6_MOD_LCLE, IF_REAL, "Length dependence of cle"), -IOP( "lalpha0", BSIM4v6_MOD_LALPHA0, IF_REAL, "Length dependence of alpha0"), -IOP( "lalpha1", BSIM4v6_MOD_LALPHA1, IF_REAL, "Length dependence of alpha1"), -IOP( "lbeta0", BSIM4v6_MOD_LBETA0, IF_REAL, "Length dependence of beta0"), - -IOP( "lagidl", BSIM4v6_MOD_LAGIDL, IF_REAL, "Length dependence of agidl"), -IOP( "lbgidl", BSIM4v6_MOD_LBGIDL, IF_REAL, "Length dependence of bgidl"), -IOP( "lcgidl", BSIM4v6_MOD_LCGIDL, IF_REAL, "Length dependence of cgidl"), -IOP( "legidl", BSIM4v6_MOD_LEGIDL, IF_REAL, "Length dependence of egidl"), -IOP( "lagisl", BSIM4v6_MOD_LAGISL, IF_REAL, "Length dependence of agisl"), -IOP( "lbgisl", BSIM4v6_MOD_LBGISL, IF_REAL, "Length dependence of bgisl"), -IOP( "lcgisl", BSIM4v6_MOD_LCGISL, IF_REAL, "Length dependence of cgisl"), -IOP( "legisl", BSIM4v6_MOD_LEGISL, IF_REAL, "Length dependence of egisl"), -IOP( "laigc", BSIM4v6_MOD_LAIGC, IF_REAL, "Length dependence of aigc"), -IOP( "lbigc", BSIM4v6_MOD_LBIGC, IF_REAL, "Length dependence of bigc"), -IOP( "lcigc", BSIM4v6_MOD_LCIGC, IF_REAL, "Length dependence of cigc"), -IOP( "laigsd", BSIM4v6_MOD_LAIGSD, IF_REAL, "Length dependence of aigsd"), -IOP( "lbigsd", BSIM4v6_MOD_LBIGSD, IF_REAL, "Length dependence of bigsd"), -IOP( "lcigsd", BSIM4v6_MOD_LCIGSD, IF_REAL, "Length dependence of cigsd"), -IOP( "laigs", BSIM4v6_MOD_LAIGS, IF_REAL, "Length dependence of aigs"), -IOP( "lbigs", BSIM4v6_MOD_LBIGS, IF_REAL, "Length dependence of bigs"), -IOP( "lcigs", BSIM4v6_MOD_LCIGS, IF_REAL, "Length dependence of cigs"), -IOP( "laigd", BSIM4v6_MOD_LAIGD, IF_REAL, "Length dependence of aigd"), -IOP( "lbigd", BSIM4v6_MOD_LBIGD, IF_REAL, "Length dependence of bigd"), -IOP( "lcigd", BSIM4v6_MOD_LCIGD, IF_REAL, "Length dependence of cigd"), -IOP( "laigbacc", BSIM4v6_MOD_LAIGBACC, IF_REAL, "Length dependence of aigbacc"), -IOP( "lbigbacc", BSIM4v6_MOD_LBIGBACC, IF_REAL, "Length dependence of bigbacc"), -IOP( "lcigbacc", BSIM4v6_MOD_LCIGBACC, IF_REAL, "Length dependence of cigbacc"), -IOP( "laigbinv", BSIM4v6_MOD_LAIGBINV, IF_REAL, "Length dependence of aigbinv"), -IOP( "lbigbinv", BSIM4v6_MOD_LBIGBINV, IF_REAL, "Length dependence of bigbinv"), -IOP( "lcigbinv", BSIM4v6_MOD_LCIGBINV, IF_REAL, "Length dependence of cigbinv"), -IOP( "lnigc", BSIM4v6_MOD_LNIGC, IF_REAL, "Length dependence of nigc"), -IOP( "lnigbinv", BSIM4v6_MOD_LNIGBINV, IF_REAL, "Length dependence of nigbinv"), -IOP( "lnigbacc", BSIM4v6_MOD_LNIGBACC, IF_REAL, "Length dependence of nigbacc"), -IOP( "lntox", BSIM4v6_MOD_LNTOX, IF_REAL, "Length dependence of ntox"), -IOP( "leigbinv", BSIM4v6_MOD_LEIGBINV, IF_REAL, "Length dependence for eigbinv"), -IOP( "lpigcd", BSIM4v6_MOD_LPIGCD, IF_REAL, "Length dependence for pigcd"), -IOP( "lpoxedge", BSIM4v6_MOD_LPOXEDGE, IF_REAL, "Length dependence for poxedge"), - -IOP( "lvfbcv", BSIM4v6_MOD_LVFBCV, IF_REAL, "Length dependence of vfbcv"), -IOP( "lvfb", BSIM4v6_MOD_LVFB, IF_REAL, "Length dependence of vfb"), -IOP( "lacde", BSIM4v6_MOD_LACDE, IF_REAL, "Length dependence of acde"), -IOP( "lmoin", BSIM4v6_MOD_LMOIN, IF_REAL, "Length dependence of moin"), -IOP( "lnoff", BSIM4v6_MOD_LNOFF, IF_REAL, "Length dependence of noff"), -IOP( "lvoffcv", BSIM4v6_MOD_LVOFFCV, IF_REAL, "Length dependence of voffcv"), -IOP( "lxrcrg1", BSIM4v6_MOD_LXRCRG1, IF_REAL, "Length dependence of xrcrg1"), -IOP( "lxrcrg2", BSIM4v6_MOD_LXRCRG2, IF_REAL, "Length dependence of xrcrg2"), -IOP( "llambda", BSIM4v6_MOD_LLAMBDA, IF_REAL, "Length dependence of lambda"), -IOP( "lvtl", BSIM4v6_MOD_LVTL, IF_REAL, " Length dependence of vtl"), -IOP( "lxn", BSIM4v6_MOD_LXN, IF_REAL, " Length dependence of xn"), -IOP( "leu", BSIM4v6_MOD_LEU, IF_REAL, " Length dependence of eu"), -IOP( "lucs", BSIM4v6_MOD_LUCS, IF_REAL, "Length dependence of lucs"), -IOP( "lvfbsdoff", BSIM4v6_MOD_LVFBSDOFF, IF_REAL, "Length dependence of vfbsdoff"), -IOP( "ltvfbsdoff", BSIM4v6_MOD_LTVFBSDOFF, IF_REAL, "Length dependence of tvfbsdoff"), -IOP( "ltvoff", BSIM4v6_MOD_LTVOFF, IF_REAL, "Length dependence of tvoff"), - -IOP( "wcdsc", BSIM4v6_MOD_WCDSC, IF_REAL, "Width dependence of cdsc"), -IOP( "wcdscb", BSIM4v6_MOD_WCDSCB, IF_REAL, "Width dependence of cdscb"), -IOP( "wcdscd", BSIM4v6_MOD_WCDSCD, IF_REAL, "Width dependence of cdscd"), -IOP( "wcit", BSIM4v6_MOD_WCIT, IF_REAL, "Width dependence of cit"), -IOP( "wnfactor", BSIM4v6_MOD_WNFACTOR, IF_REAL, "Width dependence of nfactor"), -IOP( "wxj", BSIM4v6_MOD_WXJ, IF_REAL, "Width dependence of xj"), -IOP( "wvsat", BSIM4v6_MOD_WVSAT, IF_REAL, "Width dependence of vsat"), -IOP( "wat", BSIM4v6_MOD_WAT, IF_REAL, "Width dependence of at"), -IOP( "wa0", BSIM4v6_MOD_WA0, IF_REAL, "Width dependence of a0"), -IOP( "wags", BSIM4v6_MOD_WAGS, IF_REAL, "Width dependence of ags"), -IOP( "wa1", BSIM4v6_MOD_WA1, IF_REAL, "Width dependence of a1"), -IOP( "wa2", BSIM4v6_MOD_WA2, IF_REAL, "Width dependence of a2"), -IOP( "wketa", BSIM4v6_MOD_WKETA, IF_REAL, "Width dependence of keta"), -IOP( "wnsub", BSIM4v6_MOD_WNSUB, IF_REAL, "Width dependence of nsub"), -IOP( "wndep", BSIM4v6_MOD_WNDEP, IF_REAL, "Width dependence of ndep"), -IOP( "wnsd", BSIM4v6_MOD_WNSD, IF_REAL, "Width dependence of nsd"), -IOP( "wphin", BSIM4v6_MOD_WPHIN, IF_REAL, "Width dependence of phin"), -IOP( "wngate", BSIM4v6_MOD_WNGATE, IF_REAL, "Width dependence of ngate"), -IOP( "wgamma1", BSIM4v6_MOD_WGAMMA1, IF_REAL, "Width dependence of gamma1"), -IOP( "wgamma2", BSIM4v6_MOD_WGAMMA2, IF_REAL, "Width dependence of gamma2"), -IOP( "wvbx", BSIM4v6_MOD_WVBX, IF_REAL, "Width dependence of vbx"), -IOP( "wvbm", BSIM4v6_MOD_WVBM, IF_REAL, "Width dependence of vbm"), -IOP( "wxt", BSIM4v6_MOD_WXT, IF_REAL, "Width dependence of xt"), -IOP( "wk1", BSIM4v6_MOD_WK1, IF_REAL, "Width dependence of k1"), -IOP( "wkt1", BSIM4v6_MOD_WKT1, IF_REAL, "Width dependence of kt1"), -IOP( "wkt1l", BSIM4v6_MOD_WKT1L, IF_REAL, "Width dependence of kt1l"), -IOP( "wkt2", BSIM4v6_MOD_WKT2, IF_REAL, "Width dependence of kt2"), -IOP( "wk2", BSIM4v6_MOD_WK2, IF_REAL, "Width dependence of k2"), -IOP( "wk3", BSIM4v6_MOD_WK3, IF_REAL, "Width dependence of k3"), -IOP( "wk3b", BSIM4v6_MOD_WK3B, IF_REAL, "Width dependence of k3b"), -IOP( "ww0", BSIM4v6_MOD_WW0, IF_REAL, "Width dependence of w0"), -IOP( "wdvtp0", BSIM4v6_MOD_WDVTP0, IF_REAL, "Width dependence of dvtp0"), -IOP( "wdvtp1", BSIM4v6_MOD_WDVTP1, IF_REAL, "Width dependence of dvtp1"), -IOP( "wlpe0", BSIM4v6_MOD_WLPE0, IF_REAL, "Width dependence of lpe0"), -IOP( "wlpeb", BSIM4v6_MOD_WLPEB, IF_REAL, "Width dependence of lpeb"), -IOP( "wdvt0", BSIM4v6_MOD_WDVT0, IF_REAL, "Width dependence of dvt0"), -IOP( "wdvt1", BSIM4v6_MOD_WDVT1, IF_REAL, "Width dependence of dvt1"), -IOP( "wdvt2", BSIM4v6_MOD_WDVT2, IF_REAL, "Width dependence of dvt2"), -IOP( "wdvt0w", BSIM4v6_MOD_WDVT0W, IF_REAL, "Width dependence of dvt0w"), -IOP( "wdvt1w", BSIM4v6_MOD_WDVT1W, IF_REAL, "Width dependence of dvt1w"), -IOP( "wdvt2w", BSIM4v6_MOD_WDVT2W, IF_REAL, "Width dependence of dvt2w"), -IOP( "wdrout", BSIM4v6_MOD_WDROUT, IF_REAL, "Width dependence of drout"), -IOP( "wdsub", BSIM4v6_MOD_WDSUB, IF_REAL, "Width dependence of dsub"), -IOP( "wvth0", BSIM4v6_MOD_WVTH0, IF_REAL,"Width dependence of vth0"), -IOPR("wvtho", BSIM4v6_MOD_WVTH0, IF_REAL,"Width dependence of vtho"), -IOP( "wua", BSIM4v6_MOD_WUA, IF_REAL, "Width dependence of ua"), -IOP( "wua1", BSIM4v6_MOD_WUA1, IF_REAL, "Width dependence of ua1"), -IOP( "wub", BSIM4v6_MOD_WUB, IF_REAL, "Width dependence of ub"), -IOP( "wub1", BSIM4v6_MOD_WUB1, IF_REAL, "Width dependence of ub1"), -IOP( "wuc", BSIM4v6_MOD_WUC, IF_REAL, "Width dependence of uc"), -IOP( "wuc1", BSIM4v6_MOD_WUC1, IF_REAL, "Width dependence of uc1"), -IOP( "wud", BSIM4v6_MOD_WUD, IF_REAL, "Width dependence of ud"), -IOP( "wud1", BSIM4v6_MOD_WUD1, IF_REAL, "Width dependence of ud1"), -IOP( "wup", BSIM4v6_MOD_WUP, IF_REAL, "Width dependence of up"), -IOP( "wlp", BSIM4v6_MOD_WLP, IF_REAL, "Width dependence of lp"), -IOP( "wu0", BSIM4v6_MOD_WU0, IF_REAL, "Width dependence of u0"), -IOP( "wute", BSIM4v6_MOD_WUTE, IF_REAL, "Width dependence of ute"), -IOP( "wucste", BSIM4v6_MOD_WUCSTE, IF_REAL, "Width dependence of ucste"), -IOP( "wvoff", BSIM4v6_MOD_WVOFF, IF_REAL, "Width dependence of voff"), -IOP( "wminv", BSIM4v6_MOD_WMINV, IF_REAL, "Width dependence of minv"), -IOP( "wminvcv", BSIM4v6_MOD_WMINVCV, IF_REAL, "Width dependence of minvcv"), -IOP( "wdelta", BSIM4v6_MOD_WDELTA, IF_REAL, "Width dependence of delta"), -IOP( "wrdsw", BSIM4v6_MOD_WRDSW, IF_REAL, "Width dependence of rdsw "), -IOP( "wrsw", BSIM4v6_MOD_WRSW, IF_REAL, "Width dependence of rsw"), -IOP( "wrdw", BSIM4v6_MOD_WRDW, IF_REAL, "Width dependence of rdw"), - -IOP( "wprwg", BSIM4v6_MOD_WPRWG, IF_REAL, "Width dependence of prwg "), -IOP( "wprwb", BSIM4v6_MOD_WPRWB, IF_REAL, "Width dependence of prwb "), - -IOP( "wprt", BSIM4v6_MOD_WPRT, IF_REAL, "Width dependence of prt"), -IOP( "weta0", BSIM4v6_MOD_WETA0, IF_REAL, "Width dependence of eta0"), -IOP( "wetab", BSIM4v6_MOD_WETAB, IF_REAL, "Width dependence of etab"), -IOP( "wpclm", BSIM4v6_MOD_WPCLM, IF_REAL, "Width dependence of pclm"), -IOP( "wpdiblc1", BSIM4v6_MOD_WPDIBL1, IF_REAL, "Width dependence of pdiblc1"), -IOP( "wpdiblc2", BSIM4v6_MOD_WPDIBL2, IF_REAL, "Width dependence of pdiblc2"), -IOP( "wpdiblcb", BSIM4v6_MOD_WPDIBLB, IF_REAL, "Width dependence of pdiblcb"), -IOP( "wfprout", BSIM4v6_MOD_WFPROUT, IF_REAL, "Width dependence of pdiblcb"), -IOP( "wpdits", BSIM4v6_MOD_WPDITS, IF_REAL, "Width dependence of pdits"), -IOP( "wpditsd", BSIM4v6_MOD_WPDITSD, IF_REAL, "Width dependence of pditsd"), -IOP( "wpscbe1", BSIM4v6_MOD_WPSCBE1, IF_REAL, "Width dependence of pscbe1"), -IOP( "wpscbe2", BSIM4v6_MOD_WPSCBE2, IF_REAL, "Width dependence of pscbe2"), -IOP( "wpvag", BSIM4v6_MOD_WPVAG, IF_REAL, "Width dependence of pvag"), -IOP( "wwr", BSIM4v6_MOD_WWR, IF_REAL, "Width dependence of wr"), -IOP( "wdwg", BSIM4v6_MOD_WDWG, IF_REAL, "Width dependence of dwg"), -IOP( "wdwb", BSIM4v6_MOD_WDWB, IF_REAL, "Width dependence of dwb"), -IOP( "wb0", BSIM4v6_MOD_WB0, IF_REAL, "Width dependence of b0"), -IOP( "wb1", BSIM4v6_MOD_WB1, IF_REAL, "Width dependence of b1"), -IOP( "wcgsl", BSIM4v6_MOD_WCGSL, IF_REAL, "Width dependence of cgsl"), -IOP( "wcgdl", BSIM4v6_MOD_WCGDL, IF_REAL, "Width dependence of cgdl"), -IOP( "wckappas", BSIM4v6_MOD_WCKAPPAS, IF_REAL, "Width dependence of ckappas"), -IOP( "wckappad", BSIM4v6_MOD_WCKAPPAD, IF_REAL, "Width dependence of ckappad"), -IOP( "wcf", BSIM4v6_MOD_WCF, IF_REAL, "Width dependence of cf"), -IOP( "wclc", BSIM4v6_MOD_WCLC, IF_REAL, "Width dependence of clc"), -IOP( "wcle", BSIM4v6_MOD_WCLE, IF_REAL, "Width dependence of cle"), -IOP( "walpha0", BSIM4v6_MOD_WALPHA0, IF_REAL, "Width dependence of alpha0"), -IOP( "walpha1", BSIM4v6_MOD_WALPHA1, IF_REAL, "Width dependence of alpha1"), -IOP( "wbeta0", BSIM4v6_MOD_WBETA0, IF_REAL, "Width dependence of beta0"), - -IOP( "wagidl", BSIM4v6_MOD_WAGIDL, IF_REAL, "Width dependence of agidl"), -IOP( "wbgidl", BSIM4v6_MOD_WBGIDL, IF_REAL, "Width dependence of bgidl"), -IOP( "wcgidl", BSIM4v6_MOD_WCGIDL, IF_REAL, "Width dependence of cgidl"), -IOP( "wegidl", BSIM4v6_MOD_WEGIDL, IF_REAL, "Width dependence of egidl"), -IOP( "wagisl", BSIM4v6_MOD_WAGISL, IF_REAL, "Width dependence of agisl"), -IOP( "wbgisl", BSIM4v6_MOD_WBGISL, IF_REAL, "Width dependence of bgisl"), -IOP( "wcgisl", BSIM4v6_MOD_WCGISL, IF_REAL, "Width dependence of cgisl"), -IOP( "wegisl", BSIM4v6_MOD_WEGISL, IF_REAL, "Width dependence of egisl"), -IOP( "waigc", BSIM4v6_MOD_WAIGC, IF_REAL, "Width dependence of aigc"), -IOP( "wbigc", BSIM4v6_MOD_WBIGC, IF_REAL, "Width dependence of bigc"), -IOP( "wcigc", BSIM4v6_MOD_WCIGC, IF_REAL, "Width dependence of cigc"), -IOP( "waigsd", BSIM4v6_MOD_WAIGSD, IF_REAL, "Width dependence of aigsd"), -IOP( "wbigsd", BSIM4v6_MOD_WBIGSD, IF_REAL, "Width dependence of bigsd"), -IOP( "wcigsd", BSIM4v6_MOD_WCIGSD, IF_REAL, "Width dependence of cigsd"), -IOP( "waigs", BSIM4v6_MOD_WAIGS, IF_REAL, "Width dependence of aigs"), -IOP( "wbigs", BSIM4v6_MOD_WBIGS, IF_REAL, "Width dependence of bigs"), -IOP( "wcigs", BSIM4v6_MOD_WCIGS, IF_REAL, "Width dependence of cigs"), -IOP( "waigd", BSIM4v6_MOD_WAIGD, IF_REAL, "Width dependence of aigd"), -IOP( "wbigd", BSIM4v6_MOD_WBIGD, IF_REAL, "Width dependence of bigd"), -IOP( "wcigd", BSIM4v6_MOD_WCIGD, IF_REAL, "Width dependence of cigd"), -IOP( "waigbacc", BSIM4v6_MOD_WAIGBACC, IF_REAL, "Width dependence of aigbacc"), -IOP( "wbigbacc", BSIM4v6_MOD_WBIGBACC, IF_REAL, "Width dependence of bigbacc"), -IOP( "wcigbacc", BSIM4v6_MOD_WCIGBACC, IF_REAL, "Width dependence of cigbacc"), -IOP( "waigbinv", BSIM4v6_MOD_WAIGBINV, IF_REAL, "Width dependence of aigbinv"), -IOP( "wbigbinv", BSIM4v6_MOD_WBIGBINV, IF_REAL, "Width dependence of bigbinv"), -IOP( "wcigbinv", BSIM4v6_MOD_WCIGBINV, IF_REAL, "Width dependence of cigbinv"), -IOP( "wnigc", BSIM4v6_MOD_WNIGC, IF_REAL, "Width dependence of nigc"), -IOP( "wnigbinv", BSIM4v6_MOD_WNIGBINV, IF_REAL, "Width dependence of nigbinv"), -IOP( "wnigbacc", BSIM4v6_MOD_WNIGBACC, IF_REAL, "Width dependence of nigbacc"), -IOP( "wntox", BSIM4v6_MOD_WNTOX, IF_REAL, "Width dependence of ntox"), -IOP( "weigbinv", BSIM4v6_MOD_WEIGBINV, IF_REAL, "Width dependence for eigbinv"), -IOP( "wpigcd", BSIM4v6_MOD_WPIGCD, IF_REAL, "Width dependence for pigcd"), -IOP( "wpoxedge", BSIM4v6_MOD_WPOXEDGE, IF_REAL, "Width dependence for poxedge"), -IOP( "wvfbcv", BSIM4v6_MOD_WVFBCV, IF_REAL, "Width dependence of vfbcv"), -IOP( "wvfb", BSIM4v6_MOD_WVFB, IF_REAL, "Width dependence of vfb"), -IOP( "wacde", BSIM4v6_MOD_WACDE, IF_REAL, "Width dependence of acde"), -IOP( "wmoin", BSIM4v6_MOD_WMOIN, IF_REAL, "Width dependence of moin"), -IOP( "wnoff", BSIM4v6_MOD_WNOFF, IF_REAL, "Width dependence of noff"), -IOP( "wvoffcv", BSIM4v6_MOD_WVOFFCV, IF_REAL, "Width dependence of voffcv"), -IOP( "wxrcrg1", BSIM4v6_MOD_WXRCRG1, IF_REAL, "Width dependence of xrcrg1"), -IOP( "wxrcrg2", BSIM4v6_MOD_WXRCRG2, IF_REAL, "Width dependence of xrcrg2"), -IOP( "wlambda", BSIM4v6_MOD_WLAMBDA, IF_REAL, "Width dependence of lambda"), -IOP( "wvtl", BSIM4v6_MOD_WVTL, IF_REAL, "Width dependence of vtl"), -IOP( "wxn", BSIM4v6_MOD_WXN, IF_REAL, "Width dependence of xn"), -IOP( "weu", BSIM4v6_MOD_WEU, IF_REAL, "Width dependence of eu"), -IOP( "wucs", BSIM4v6_MOD_WUCS, IF_REAL, "Width dependence of ucs"), -IOP( "wvfbsdoff", BSIM4v6_MOD_WVFBSDOFF, IF_REAL, "Width dependence of vfbsdoff"), -IOP( "wtvfbsdoff", BSIM4v6_MOD_WTVFBSDOFF, IF_REAL, "Width dependence of tvfbsdoff"), -IOP( "wtvoff", BSIM4v6_MOD_WTVOFF, IF_REAL, "Width dependence of tvoff"), - -IOP( "pcdsc", BSIM4v6_MOD_PCDSC, IF_REAL, "Cross-term dependence of cdsc"), -IOP( "pcdscb", BSIM4v6_MOD_PCDSCB, IF_REAL, "Cross-term dependence of cdscb"), -IOP( "pcdscd", BSIM4v6_MOD_PCDSCD, IF_REAL, "Cross-term dependence of cdscd"), -IOP( "pcit", BSIM4v6_MOD_PCIT, IF_REAL, "Cross-term dependence of cit"), -IOP( "pnfactor", BSIM4v6_MOD_PNFACTOR, IF_REAL, "Cross-term dependence of nfactor"), -IOP( "pxj", BSIM4v6_MOD_PXJ, IF_REAL, "Cross-term dependence of xj"), -IOP( "pvsat", BSIM4v6_MOD_PVSAT, IF_REAL, "Cross-term dependence of vsat"), -IOP( "pat", BSIM4v6_MOD_PAT, IF_REAL, "Cross-term dependence of at"), -IOP( "pa0", BSIM4v6_MOD_PA0, IF_REAL, "Cross-term dependence of a0"), -IOP( "pags", BSIM4v6_MOD_PAGS, IF_REAL, "Cross-term dependence of ags"), -IOP( "pa1", BSIM4v6_MOD_PA1, IF_REAL, "Cross-term dependence of a1"), -IOP( "pa2", BSIM4v6_MOD_PA2, IF_REAL, "Cross-term dependence of a2"), -IOP( "pketa", BSIM4v6_MOD_PKETA, IF_REAL, "Cross-term dependence of keta"), -IOP( "pnsub", BSIM4v6_MOD_PNSUB, IF_REAL, "Cross-term dependence of nsub"), -IOP( "pndep", BSIM4v6_MOD_PNDEP, IF_REAL, "Cross-term dependence of ndep"), -IOP( "pnsd", BSIM4v6_MOD_PNSD, IF_REAL, "Cross-term dependence of nsd"), -IOP( "pphin", BSIM4v6_MOD_PPHIN, IF_REAL, "Cross-term dependence of phin"), -IOP( "pngate", BSIM4v6_MOD_PNGATE, IF_REAL, "Cross-term dependence of ngate"), -IOP( "pgamma1", BSIM4v6_MOD_PGAMMA1, IF_REAL, "Cross-term dependence of gamma1"), -IOP( "pgamma2", BSIM4v6_MOD_PGAMMA2, IF_REAL, "Cross-term dependence of gamma2"), -IOP( "pvbx", BSIM4v6_MOD_PVBX, IF_REAL, "Cross-term dependence of vbx"), -IOP( "pvbm", BSIM4v6_MOD_PVBM, IF_REAL, "Cross-term dependence of vbm"), -IOP( "pxt", BSIM4v6_MOD_PXT, IF_REAL, "Cross-term dependence of xt"), -IOP( "pk1", BSIM4v6_MOD_PK1, IF_REAL, "Cross-term dependence of k1"), -IOP( "pkt1", BSIM4v6_MOD_PKT1, IF_REAL, "Cross-term dependence of kt1"), -IOP( "pkt1l", BSIM4v6_MOD_PKT1L, IF_REAL, "Cross-term dependence of kt1l"), -IOP( "pkt2", BSIM4v6_MOD_PKT2, IF_REAL, "Cross-term dependence of kt2"), -IOP( "pk2", BSIM4v6_MOD_PK2, IF_REAL, "Cross-term dependence of k2"), -IOP( "pk3", BSIM4v6_MOD_PK3, IF_REAL, "Cross-term dependence of k3"), -IOP( "pk3b", BSIM4v6_MOD_PK3B, IF_REAL, "Cross-term dependence of k3b"), -IOP( "pw0", BSIM4v6_MOD_PW0, IF_REAL, "Cross-term dependence of w0"), -IOP( "pdvtp0", BSIM4v6_MOD_PDVTP0, IF_REAL, "Cross-term dependence of dvtp0"), -IOP( "pdvtp1", BSIM4v6_MOD_PDVTP1, IF_REAL, "Cross-term dependence of dvtp1"), -IOP( "plpe0", BSIM4v6_MOD_PLPE0, IF_REAL, "Cross-term dependence of lpe0"), -IOP( "plpeb", BSIM4v6_MOD_PLPEB, IF_REAL, "Cross-term dependence of lpeb"), -IOP( "pdvt0", BSIM4v6_MOD_PDVT0, IF_REAL, "Cross-term dependence of dvt0"), -IOP( "pdvt1", BSIM4v6_MOD_PDVT1, IF_REAL, "Cross-term dependence of dvt1"), -IOP( "pdvt2", BSIM4v6_MOD_PDVT2, IF_REAL, "Cross-term dependence of dvt2"), -IOP( "pdvt0w", BSIM4v6_MOD_PDVT0W, IF_REAL, "Cross-term dependence of dvt0w"), -IOP( "pdvt1w", BSIM4v6_MOD_PDVT1W, IF_REAL, "Cross-term dependence of dvt1w"), -IOP( "pdvt2w", BSIM4v6_MOD_PDVT2W, IF_REAL, "Cross-term dependence of dvt2w"), -IOP( "pdrout", BSIM4v6_MOD_PDROUT, IF_REAL, "Cross-term dependence of drout"), -IOP( "pdsub", BSIM4v6_MOD_PDSUB, IF_REAL, "Cross-term dependence of dsub"), -IOP( "pvth0", BSIM4v6_MOD_PVTH0, IF_REAL,"Cross-term dependence of vth0"), -IOPR("pvtho", BSIM4v6_MOD_PVTH0, IF_REAL,"Cross-term dependence of vtho"), -IOP( "pua", BSIM4v6_MOD_PUA, IF_REAL, "Cross-term dependence of ua"), -IOP( "pua1", BSIM4v6_MOD_PUA1, IF_REAL, "Cross-term dependence of ua1"), -IOP( "pub", BSIM4v6_MOD_PUB, IF_REAL, "Cross-term dependence of ub"), -IOP( "pub1", BSIM4v6_MOD_PUB1, IF_REAL, "Cross-term dependence of ub1"), -IOP( "puc", BSIM4v6_MOD_PUC, IF_REAL, "Cross-term dependence of uc"), -IOP( "puc1", BSIM4v6_MOD_PUC1, IF_REAL, "Cross-term dependence of uc1"), -IOP( "pud", BSIM4v6_MOD_PUD, IF_REAL, "Cross-term dependence of ud"), -IOP( "pud1", BSIM4v6_MOD_PUD1, IF_REAL, "Cross-term dependence of ud1"), -IOP( "pup", BSIM4v6_MOD_PUP, IF_REAL, "Cross-term dependence of up"), -IOP( "plp", BSIM4v6_MOD_PLP, IF_REAL, "Cross-term dependence of lp"), -IOP( "pu0", BSIM4v6_MOD_PU0, IF_REAL, "Cross-term dependence of u0"), -IOP( "pute", BSIM4v6_MOD_PUTE, IF_REAL, "Cross-term dependence of ute"), -IOP( "pucste", BSIM4v6_MOD_PUCSTE, IF_REAL, "Cross-term dependence of ucste"), -IOP( "pvoff", BSIM4v6_MOD_PVOFF, IF_REAL, "Cross-term dependence of voff"), -IOP( "pminv", BSIM4v6_MOD_PMINV, IF_REAL, "Cross-term dependence of minv"), -IOP( "pminvcv", BSIM4v6_MOD_PMINVCV, IF_REAL, "Cross-term dependence of minvcv"), -IOP( "pdelta", BSIM4v6_MOD_PDELTA, IF_REAL, "Cross-term dependence of delta"), -IOP( "prdsw", BSIM4v6_MOD_PRDSW, IF_REAL, "Cross-term dependence of rdsw "), -IOP( "prsw", BSIM4v6_MOD_PRSW, IF_REAL, "Cross-term dependence of rsw"), -IOP( "prdw", BSIM4v6_MOD_PRDW, IF_REAL, "Cross-term dependence of rdw"), - -IOP( "pprwg", BSIM4v6_MOD_PPRWG, IF_REAL, "Cross-term dependence of prwg "), -IOP( "pprwb", BSIM4v6_MOD_PPRWB, IF_REAL, "Cross-term dependence of prwb "), - -IOP( "pprt", BSIM4v6_MOD_PPRT, IF_REAL, "Cross-term dependence of prt "), -IOP( "peta0", BSIM4v6_MOD_PETA0, IF_REAL, "Cross-term dependence of eta0"), -IOP( "petab", BSIM4v6_MOD_PETAB, IF_REAL, "Cross-term dependence of etab"), -IOP( "ppclm", BSIM4v6_MOD_PPCLM, IF_REAL, "Cross-term dependence of pclm"), -IOP( "ppdiblc1", BSIM4v6_MOD_PPDIBL1, IF_REAL, "Cross-term dependence of pdiblc1"), -IOP( "ppdiblc2", BSIM4v6_MOD_PPDIBL2, IF_REAL, "Cross-term dependence of pdiblc2"), -IOP( "ppdiblcb", BSIM4v6_MOD_PPDIBLB, IF_REAL, "Cross-term dependence of pdiblcb"), -IOP( "pfprout", BSIM4v6_MOD_PFPROUT, IF_REAL, "Cross-term dependence of pdiblcb"), -IOP( "ppdits", BSIM4v6_MOD_PPDITS, IF_REAL, "Cross-term dependence of pdits"), -IOP( "ppditsd", BSIM4v6_MOD_PPDITSD, IF_REAL, "Cross-term dependence of pditsd"), -IOP( "ppscbe1", BSIM4v6_MOD_PPSCBE1, IF_REAL, "Cross-term dependence of pscbe1"), -IOP( "ppscbe2", BSIM4v6_MOD_PPSCBE2, IF_REAL, "Cross-term dependence of pscbe2"), -IOP( "ppvag", BSIM4v6_MOD_PPVAG, IF_REAL, "Cross-term dependence of pvag"), -IOP( "pwr", BSIM4v6_MOD_PWR, IF_REAL, "Cross-term dependence of wr"), -IOP( "pdwg", BSIM4v6_MOD_PDWG, IF_REAL, "Cross-term dependence of dwg"), -IOP( "pdwb", BSIM4v6_MOD_PDWB, IF_REAL, "Cross-term dependence of dwb"), -IOP( "pb0", BSIM4v6_MOD_PB0, IF_REAL, "Cross-term dependence of b0"), -IOP( "pb1", BSIM4v6_MOD_PB1, IF_REAL, "Cross-term dependence of b1"), -IOP( "pcgsl", BSIM4v6_MOD_PCGSL, IF_REAL, "Cross-term dependence of cgsl"), -IOP( "pcgdl", BSIM4v6_MOD_PCGDL, IF_REAL, "Cross-term dependence of cgdl"), -IOP( "pckappas", BSIM4v6_MOD_PCKAPPAS, IF_REAL, "Cross-term dependence of ckappas"), -IOP( "pckappad", BSIM4v6_MOD_PCKAPPAD, IF_REAL, "Cross-term dependence of ckappad"), -IOP( "pcf", BSIM4v6_MOD_PCF, IF_REAL, "Cross-term dependence of cf"), -IOP( "pclc", BSIM4v6_MOD_PCLC, IF_REAL, "Cross-term dependence of clc"), -IOP( "pcle", BSIM4v6_MOD_PCLE, IF_REAL, "Cross-term dependence of cle"), -IOP( "palpha0", BSIM4v6_MOD_PALPHA0, IF_REAL, "Cross-term dependence of alpha0"), -IOP( "palpha1", BSIM4v6_MOD_PALPHA1, IF_REAL, "Cross-term dependence of alpha1"), -IOP( "pbeta0", BSIM4v6_MOD_PBETA0, IF_REAL, "Cross-term dependence of beta0"), - -IOP( "pagidl", BSIM4v6_MOD_PAGIDL, IF_REAL, "Cross-term dependence of agidl"), -IOP( "pbgidl", BSIM4v6_MOD_PBGIDL, IF_REAL, "Cross-term dependence of bgidl"), -IOP( "pcgidl", BSIM4v6_MOD_PCGIDL, IF_REAL, "Cross-term dependence of cgidl"), -IOP( "pegidl", BSIM4v6_MOD_PEGIDL, IF_REAL, "Cross-term dependence of egidl"), -IOP( "pagisl", BSIM4v6_MOD_PAGISL, IF_REAL, "Cross-term dependence of agisl"), -IOP( "pbgisl", BSIM4v6_MOD_PBGISL, IF_REAL, "Cross-term dependence of bgisl"), -IOP( "pcgisl", BSIM4v6_MOD_PCGISL, IF_REAL, "Cross-term dependence of cgisl"), -IOP( "pegisl", BSIM4v6_MOD_PEGISL, IF_REAL, "Cross-term dependence of egisl"), -IOP( "paigc", BSIM4v6_MOD_PAIGC, IF_REAL, "Cross-term dependence of aigc"), -IOP( "pbigc", BSIM4v6_MOD_PBIGC, IF_REAL, "Cross-term dependence of bigc"), -IOP( "pcigc", BSIM4v6_MOD_PCIGC, IF_REAL, "Cross-term dependence of cigc"), -IOP( "paigsd", BSIM4v6_MOD_PAIGSD, IF_REAL, "Cross-term dependence of aigsd"), -IOP( "pbigsd", BSIM4v6_MOD_PBIGSD, IF_REAL, "Cross-term dependence of bigsd"), -IOP( "pcigsd", BSIM4v6_MOD_PCIGSD, IF_REAL, "Cross-term dependence of cigsd"), -IOP( "paigs", BSIM4v6_MOD_PAIGS, IF_REAL, "Cross-term dependence of aigs"), -IOP( "pbigs", BSIM4v6_MOD_PBIGS, IF_REAL, "Cross-term dependence of bigs"), -IOP( "pcigs", BSIM4v6_MOD_PCIGS, IF_REAL, "Cross-term dependence of cigs"), -IOP( "paigd", BSIM4v6_MOD_PAIGD, IF_REAL, "Cross-term dependence of aigd"), -IOP( "pbigd", BSIM4v6_MOD_PBIGD, IF_REAL, "Cross-term dependence of bigd"), -IOP( "pcigd", BSIM4v6_MOD_PCIGD, IF_REAL, "Cross-term dependence of cigd"), -IOP( "paigbacc", BSIM4v6_MOD_PAIGBACC, IF_REAL, "Cross-term dependence of aigbacc"), -IOP( "pbigbacc", BSIM4v6_MOD_PBIGBACC, IF_REAL, "Cross-term dependence of bigbacc"), -IOP( "pcigbacc", BSIM4v6_MOD_PCIGBACC, IF_REAL, "Cross-term dependence of cigbacc"), -IOP( "paigbinv", BSIM4v6_MOD_PAIGBINV, IF_REAL, "Cross-term dependence of aigbinv"), -IOP( "pbigbinv", BSIM4v6_MOD_PBIGBINV, IF_REAL, "Cross-term dependence of bigbinv"), -IOP( "pcigbinv", BSIM4v6_MOD_PCIGBINV, IF_REAL, "Cross-term dependence of cigbinv"), -IOP( "pnigc", BSIM4v6_MOD_PNIGC, IF_REAL, "Cross-term dependence of nigc"), -IOP( "pnigbinv", BSIM4v6_MOD_PNIGBINV, IF_REAL, "Cross-term dependence of nigbinv"), -IOP( "pnigbacc", BSIM4v6_MOD_PNIGBACC, IF_REAL, "Cross-term dependence of nigbacc"), -IOP( "pntox", BSIM4v6_MOD_PNTOX, IF_REAL, "Cross-term dependence of ntox"), -IOP( "peigbinv", BSIM4v6_MOD_PEIGBINV, IF_REAL, "Cross-term dependence for eigbinv"), -IOP( "ppigcd", BSIM4v6_MOD_PPIGCD, IF_REAL, "Cross-term dependence for pigcd"), -IOP( "ppoxedge", BSIM4v6_MOD_PPOXEDGE, IF_REAL, "Cross-term dependence for poxedge"), -IOP( "pvfbcv", BSIM4v6_MOD_PVFBCV, IF_REAL, "Cross-term dependence of vfbcv"), -IOP( "pvfb", BSIM4v6_MOD_PVFB, IF_REAL, "Cross-term dependence of vfb"), -IOP( "pacde", BSIM4v6_MOD_PACDE, IF_REAL, "Cross-term dependence of acde"), -IOP( "pmoin", BSIM4v6_MOD_PMOIN, IF_REAL, "Cross-term dependence of moin"), -IOP( "pnoff", BSIM4v6_MOD_PNOFF, IF_REAL, "Cross-term dependence of noff"), -IOP( "pvoffcv", BSIM4v6_MOD_PVOFFCV, IF_REAL, "Cross-term dependence of voffcv"), -IOP( "pxrcrg1", BSIM4v6_MOD_PXRCRG1, IF_REAL, "Cross-term dependence of xrcrg1"), -IOP( "pxrcrg2", BSIM4v6_MOD_PXRCRG2, IF_REAL, "Cross-term dependence of xrcrg2"), -IOP( "plambda", BSIM4v6_MOD_PLAMBDA, IF_REAL, "Cross-term dependence of lambda"), -IOP( "pvtl", BSIM4v6_MOD_PVTL, IF_REAL, "Cross-term dependence of vtl"), -IOP( "pxn", BSIM4v6_MOD_PXN, IF_REAL, "Cross-term dependence of xn"), -IOP( "peu", BSIM4v6_MOD_PEU, IF_REAL, "Cross-term dependence of eu"), -IOP( "pucs", BSIM4v6_MOD_PUCS, IF_REAL, "Cross-term dependence of ucs"), -IOP( "pvfbsdoff", BSIM4v6_MOD_PVFBSDOFF, IF_REAL, "Cross-term dependence of vfbsdoff"), -IOP( "ptvfbsdoff", BSIM4v6_MOD_PTVFBSDOFF, IF_REAL, "Cross-term dependence of tvfbsdoff"), -IOP( "ptvoff", BSIM4v6_MOD_PTVOFF, IF_REAL, "Cross-term dependence of tvoff"), - -/* stress effect*/ -IOP( "saref", BSIM4v6_MOD_SAREF, IF_REAL, "Reference distance between OD edge to poly of one side"), -IOP( "sbref", BSIM4v6_MOD_SBREF, IF_REAL, "Reference distance between OD edge to poly of the other side"), -IOP( "wlod", BSIM4v6_MOD_WLOD, IF_REAL, "Width parameter for stress effect"), -IOP( "ku0", BSIM4v6_MOD_KU0, IF_REAL, "Mobility degradation/enhancement coefficient for LOD"), -IOP( "kvsat", BSIM4v6_MOD_KVSAT, IF_REAL, "Saturation velocity degradation/enhancement parameter for LOD"), -IOP( "kvth0", BSIM4v6_MOD_KVTH0, IF_REAL, "Threshold degradation/enhancement parameter for LOD"), -IOP( "tku0", BSIM4v6_MOD_TKU0, IF_REAL, "Temperature coefficient of KU0"), -IOP( "llodku0", BSIM4v6_MOD_LLODKU0, IF_REAL, "Length parameter for u0 LOD effect"), -IOP( "wlodku0", BSIM4v6_MOD_WLODKU0, IF_REAL, "Width parameter for u0 LOD effect"), -IOP( "llodvth", BSIM4v6_MOD_LLODVTH, IF_REAL, "Length parameter for vth LOD effect"), -IOP( "wlodvth", BSIM4v6_MOD_WLODVTH, IF_REAL, "Width parameter for vth LOD effect"), -IOP( "lku0", BSIM4v6_MOD_LKU0, IF_REAL, "Length dependence of ku0"), -IOP( "wku0", BSIM4v6_MOD_WKU0, IF_REAL, "Width dependence of ku0"), -IOP( "pku0", BSIM4v6_MOD_PKU0, IF_REAL, "Cross-term dependence of ku0"), -IOP( "lkvth0", BSIM4v6_MOD_LKVTH0, IF_REAL, "Length dependence of kvth0"), -IOP( "wkvth0", BSIM4v6_MOD_WKVTH0, IF_REAL, "Width dependence of kvth0"), -IOP( "pkvth0", BSIM4v6_MOD_PKVTH0, IF_REAL, "Cross-term dependence of kvth0"), -IOP( "stk2", BSIM4v6_MOD_STK2, IF_REAL, "K2 shift factor related to stress effect on vth"), -IOP( "lodk2", BSIM4v6_MOD_LODK2, IF_REAL, "K2 shift modification factor for stress effect"), -IOP( "steta0", BSIM4v6_MOD_STETA0, IF_REAL, "eta0 shift factor related to stress effect on vth"), -IOP( "lodeta0", BSIM4v6_MOD_LODETA0, IF_REAL, "eta0 shift modification factor for stress effect"), -/* Well Proximity Effect */ -IOP( "web", BSIM4v6_MOD_WEB, IF_REAL, "Coefficient for SCB"), -IOP( "wec", BSIM4v6_MOD_WEC, IF_REAL, "Coefficient for SCC"), -IOP( "kvth0we", BSIM4v6_MOD_KVTH0WE, IF_REAL, "Threshold shift factor for well proximity effect"), -IOP( "k2we", BSIM4v6_MOD_K2WE, IF_REAL, " K2 shift factor for well proximity effect "), -IOP( "ku0we", BSIM4v6_MOD_KU0WE, IF_REAL, " Mobility degradation factor for well proximity effect "), -IOP( "scref", BSIM4v6_MOD_SCREF, IF_REAL, " Reference distance to calculate SCA, SCB and SCC"), -IOP( "wpemod", BSIM4v6_MOD_WPEMOD, IF_REAL, " Flag for WPE model (WPEMOD=1 to activate this model) "), -IOP( "lkvth0we", BSIM4v6_MOD_LKVTH0WE, IF_REAL, "Length dependence of kvth0we"), -IOP( "lk2we", BSIM4v6_MOD_LK2WE, IF_REAL, " Length dependence of k2we "), -IOP( "lku0we", BSIM4v6_MOD_LKU0WE, IF_REAL, " Length dependence of ku0we "), -IOP( "wkvth0we", BSIM4v6_MOD_WKVTH0WE, IF_REAL, "Width dependence of kvth0we"), -IOP( "wk2we", BSIM4v6_MOD_WK2WE, IF_REAL, " Width dependence of k2we "), -IOP( "wku0we", BSIM4v6_MOD_WKU0WE, IF_REAL, " Width dependence of ku0we "), -IOP( "pkvth0we", BSIM4v6_MOD_PKVTH0WE, IF_REAL, "Cross-term dependence of kvth0we"), -IOP( "pk2we", BSIM4v6_MOD_PK2WE, IF_REAL, " Cross-term dependence of k2we "), -IOP( "pku0we", BSIM4v6_MOD_PKU0WE, IF_REAL, " Cross-term dependence of ku0we "), - -IOP( "noia", BSIM4v6_MOD_NOIA, IF_REAL, "Flicker noise parameter"), -IOP( "noib", BSIM4v6_MOD_NOIB, IF_REAL, "Flicker noise parameter"), -IOP( "noic", BSIM4v6_MOD_NOIC, IF_REAL, "Flicker noise parameter"), -IOP( "tnoia", BSIM4v6_MOD_TNOIA, IF_REAL, "Thermal noise parameter"), -IOP( "tnoib", BSIM4v6_MOD_TNOIB, IF_REAL, "Thermal noise parameter"), -IOP( "rnoia", BSIM4v6_MOD_RNOIA, IF_REAL, "Thermal noise coefficient"), -IOP( "rnoib", BSIM4v6_MOD_RNOIB, IF_REAL, "Thermal noise coefficient"), -IOP( "ntnoi", BSIM4v6_MOD_NTNOI, IF_REAL, "Thermal noise parameter"), -IOP( "em", BSIM4v6_MOD_EM, IF_REAL, "Flicker noise parameter"), -IOP( "ef", BSIM4v6_MOD_EF, IF_REAL, "Flicker noise frequency exponent"), -IOP( "af", BSIM4v6_MOD_AF, IF_REAL, "Flicker noise exponent"), -IOP( "kf", BSIM4v6_MOD_KF, IF_REAL, "Flicker noise coefficient"), - -IOP("vgs_max", BSIM4v6_MOD_VGS_MAX, IF_REAL, "maximum voltage G-S branch"), -IOP("vgd_max", BSIM4v6_MOD_VGD_MAX, IF_REAL, "maximum voltage G-D branch"), -IOP("vgb_max", BSIM4v6_MOD_VGB_MAX, IF_REAL, "maximum voltage G-B branch"), -IOP("vds_max", BSIM4v6_MOD_VDS_MAX, IF_REAL, "maximum voltage D-S branch"), -IOP("vbs_max", BSIM4v6_MOD_VBS_MAX, IF_REAL, "maximum voltage B-S branch"), -IOP("vbd_max", BSIM4v6_MOD_VBD_MAX, IF_REAL, "maximum voltage B-D branch"), -IOP("vgsr_max", BSIM4v6_MOD_VGSR_MAX, IF_REAL, "maximum voltage G-S branch"), -IOP("vgdr_max", BSIM4v6_MOD_VGDR_MAX, IF_REAL, "maximum voltage G-D branch"), -IOP("vgbr_max", BSIM4v6_MOD_VGBR_MAX, IF_REAL, "maximum voltage G-B branch"), -IOP("vbsr_max", BSIM4v6_MOD_VBSR_MAX, IF_REAL, "maximum voltage B-S branch"), -IOP("vbdr_max", BSIM4v6_MOD_VBDR_MAX, IF_REAL, "maximum voltage B-D branch"), - -IP( "nmos", BSIM4v6_MOD_NMOS, IF_FLAG, "Flag to indicate NMOS"), -IP( "pmos", BSIM4v6_MOD_PMOS, IF_FLAG, "Flag to indicate PMOS"), -}; - -char *BSIM4v6names[] = { - "Drain", - "Gate", - "Source", - "Bulk", - "Charge" -}; - -int BSIM4v6nSize = NUMELEMS(BSIM4v6names); -int BSIM4v6pTSize = NUMELEMS(BSIM4v6pTable); -int BSIM4v6mPTSize = NUMELEMS(BSIM4v6mPTable); -int BSIM4v6iSize = sizeof(BSIM4v6instance); -int BSIM4v6mSize = sizeof(BSIM4v6model); diff --git a/src/spicelib/devices/bsim4v6/b4v6acld.c b/src/spicelib/devices/bsim4v6/b4v6acld.c deleted file mode 100644 index 25cf0b82c..000000000 --- a/src/spicelib/devices/bsim4v6/b4v6acld.c +++ /dev/null @@ -1,673 +0,0 @@ -/**** BSIM4.6.2 Released by Wenwei Yang 07/31/2008 ****/ - -/********** - * Copyright 2006 Regents of the University of California. All rights reserved. - * File: b4acld.c of BSIM4.6.2. - * Author: 2000 Weidong Liu - * Authors: 2001- Xuemei Xi, Mohan Dunga, Ali Niknejad, Chenming Hu. - * Authors: 2006- Mohan Dunga, Ali Niknejad, Chenming Hu - * Authors: 2007- Mohan Dunga, Wenwei Yang, Ali Niknejad, Chenming Hu - * Project Director: Prof. Chenming Hu. - * Modified by Xuemei Xi, 10/05/2001. - **********/ - -#include "ngspice/ngspice.h" -#include "ngspice/cktdefs.h" -#include "bsim4v6def.h" -#include "ngspice/sperror.h" -#include "ngspice/suffix.h" - - -int -BSIM4v6acLoad( -GENmodel *inModel, -CKTcircuit *ckt) -{ -BSIM4v6model *model = (BSIM4v6model*)inModel; -BSIM4v6instance *here; - -double gjbd, gjbs, geltd, gcrg, gcrgg, gcrgd, gcrgs, gcrgb; -double xcbgb, xcbdb, xcbsb, xcbbb; -double xcggbr, xcgdbr, xcgsbr, xcgbbr, xcggbi, xcgdbi, xcgsbi, xcgbbi; -double Cggr, Cgdr, Cgsr, Cgbr, Cggi, Cgdi, Cgsi, Cgbi; -double xcddbr, xcdgbr, xcdsbr, xcdbbr, xcsdbr, xcsgbr, xcssbr, xcsbbr; -double xcddbi, xcdgbi, xcdsbi, xcdbbi, xcsdbi, xcsgbi, xcssbi, xcsbbi; -double xcdbdb, xcsbsb=0.0, xcgmgmb=0.0, xcgmdb=0.0, xcgmsb=0.0, xcdgmb, xcsgmb; -double xcgmbb=0.0, xcbgmb; -double capbd, capbs, omega; -double gstot, gstotd, gstotg, gstots, gstotb, gspr; -double gdtot, gdtotd, gdtotg, gdtots, gdtotb, gdpr; -double gIstotg, gIstotd, gIstots, gIstotb; -double gIdtotg, gIdtotd, gIdtots, gIdtotb; -double gIbtotg, gIbtotd, gIbtots, gIbtotb; -double gIgtotg, gIgtotd, gIgtots, gIgtotb; -double cgso, cgdo, cgbo; -double gbspsp, gbbdp, gbbsp, gbspg, gbspb; -double gbspdp, gbdpdp, gbdpg, gbdpb, gbdpsp; -double T0=0.0, T1, T2, T3; -double Csg, Csd, Css; -double Cdgr, Cddr, Cdsr, Cdbr, Csgr, Csdr, Cssr, Csbr; -double Cdgi, Cddi, Cdsi, Cdbi, Csgi, Csdi, Cssi, Csbi; -double gmr, gmi, gmbsr, gmbsi, gdsr, gdsi; -double FwdSumr, RevSumr, Gmr, Gmbsr; -double FwdSumi, RevSumi, Gmi, Gmbsi; -struct bsim4v6SizeDependParam *pParam; -double ggidld, ggidlg, ggidlb, ggislg, ggislb, ggisls; - -double m; - - omega = ckt->CKTomega; - for (; model != NULL; model = BSIM4v6nextModel(model)) - { for (here = BSIM4v6instances(model); here!= NULL; - here = BSIM4v6nextInstance(here)) - { - pParam = here->pParam; - capbd = here->BSIM4v6capbd; - capbs = here->BSIM4v6capbs; - cgso = here->BSIM4v6cgso; - cgdo = here->BSIM4v6cgdo; - cgbo = pParam->BSIM4v6cgbo; - - Csd = -(here->BSIM4v6cddb + here->BSIM4v6cgdb + here->BSIM4v6cbdb); - Csg = -(here->BSIM4v6cdgb + here->BSIM4v6cggb + here->BSIM4v6cbgb); - Css = -(here->BSIM4v6cdsb + here->BSIM4v6cgsb + here->BSIM4v6cbsb); - - if (here->BSIM4v6acnqsMod) - { T0 = omega * here->BSIM4v6taunet; - T1 = T0 * T0; - T2 = 1.0 / (1.0 + T1); - T3 = T0 * T2; - - gmr = here->BSIM4v6gm * T2; - gmbsr = here->BSIM4v6gmbs * T2; - gdsr = here->BSIM4v6gds * T2; - - gmi = -here->BSIM4v6gm * T3; - gmbsi = -here->BSIM4v6gmbs * T3; - gdsi = -here->BSIM4v6gds * T3; - - Cddr = here->BSIM4v6cddb * T2; - Cdgr = here->BSIM4v6cdgb * T2; - Cdsr = here->BSIM4v6cdsb * T2; - Cdbr = -(Cddr + Cdgr + Cdsr); - - /* WDLiu: Cxyi mulitplied by jomega below, and actually to be of conductance */ - Cddi = here->BSIM4v6cddb * T3 * omega; - Cdgi = here->BSIM4v6cdgb * T3 * omega; - Cdsi = here->BSIM4v6cdsb * T3 * omega; - Cdbi = -(Cddi + Cdgi + Cdsi); - - Csdr = Csd * T2; - Csgr = Csg * T2; - Cssr = Css * T2; - Csbr = -(Csdr + Csgr + Cssr); - - Csdi = Csd * T3 * omega; - Csgi = Csg * T3 * omega; - Cssi = Css * T3 * omega; - Csbi = -(Csdi + Csgi + Cssi); - - Cgdr = -(Cddr + Csdr + here->BSIM4v6cbdb); - Cggr = -(Cdgr + Csgr + here->BSIM4v6cbgb); - Cgsr = -(Cdsr + Cssr + here->BSIM4v6cbsb); - Cgbr = -(Cgdr + Cggr + Cgsr); - - Cgdi = -(Cddi + Csdi); - Cggi = -(Cdgi + Csgi); - Cgsi = -(Cdsi + Cssi); - Cgbi = -(Cgdi + Cggi + Cgsi); - } - else /* QS */ - { gmr = here->BSIM4v6gm; - gmbsr = here->BSIM4v6gmbs; - gdsr = here->BSIM4v6gds; - gmi = gmbsi = gdsi = 0.0; - - Cddr = here->BSIM4v6cddb; - Cdgr = here->BSIM4v6cdgb; - Cdsr = here->BSIM4v6cdsb; - Cdbr = -(Cddr + Cdgr + Cdsr); - Cddi = Cdgi = Cdsi = Cdbi = 0.0; - - Csdr = Csd; - Csgr = Csg; - Cssr = Css; - Csbr = -(Csdr + Csgr + Cssr); - Csdi = Csgi = Cssi = Csbi = 0.0; - - Cgdr = here->BSIM4v6cgdb; - Cggr = here->BSIM4v6cggb; - Cgsr = here->BSIM4v6cgsb; - Cgbr = -(Cgdr + Cggr + Cgsr); - Cgdi = Cggi = Cgsi = Cgbi = 0.0; - } - - - if (here->BSIM4v6mode >= 0) - { Gmr = gmr; - Gmbsr = gmbsr; - FwdSumr = Gmr + Gmbsr; - RevSumr = 0.0; - Gmi = gmi; - Gmbsi = gmbsi; - FwdSumi = Gmi + Gmbsi; - RevSumi = 0.0; - - gbbdp = -(here->BSIM4v6gbds); - gbbsp = here->BSIM4v6gbds + here->BSIM4v6gbgs + here->BSIM4v6gbbs; - gbdpg = here->BSIM4v6gbgs; - gbdpdp = here->BSIM4v6gbds; - gbdpb = here->BSIM4v6gbbs; - gbdpsp = -(gbdpg + gbdpdp + gbdpb); - - gbspdp = 0.0; - gbspg = 0.0; - gbspb = 0.0; - gbspsp = 0.0; - - if (model->BSIM4v6igcMod) - { gIstotg = here->BSIM4v6gIgsg + here->BSIM4v6gIgcsg; - gIstotd = here->BSIM4v6gIgcsd; - gIstots = here->BSIM4v6gIgss + here->BSIM4v6gIgcss; - gIstotb = here->BSIM4v6gIgcsb; - - gIdtotg = here->BSIM4v6gIgdg + here->BSIM4v6gIgcdg; - gIdtotd = here->BSIM4v6gIgdd + here->BSIM4v6gIgcdd; - gIdtots = here->BSIM4v6gIgcds; - gIdtotb = here->BSIM4v6gIgcdb; - } - else - { gIstotg = gIstotd = gIstots = gIstotb = 0.0; - gIdtotg = gIdtotd = gIdtots = gIdtotb = 0.0; - } - - if (model->BSIM4v6igbMod) - { gIbtotg = here->BSIM4v6gIgbg; - gIbtotd = here->BSIM4v6gIgbd; - gIbtots = here->BSIM4v6gIgbs; - gIbtotb = here->BSIM4v6gIgbb; - } - else - gIbtotg = gIbtotd = gIbtots = gIbtotb = 0.0; - - if ((model->BSIM4v6igcMod != 0) || (model->BSIM4v6igbMod != 0)) - { gIgtotg = gIstotg + gIdtotg + gIbtotg; - gIgtotd = gIstotd + gIdtotd + gIbtotd ; - gIgtots = gIstots + gIdtots + gIbtots; - gIgtotb = gIstotb + gIdtotb + gIbtotb; - } - else - gIgtotg = gIgtotd = gIgtots = gIgtotb = 0.0; - - if (here->BSIM4v6rgateMod == 2) - T0 = *(ckt->CKTstates[0] + here->BSIM4v6vges) - - *(ckt->CKTstates[0] + here->BSIM4v6vgs); - else if (here->BSIM4v6rgateMod == 3) - T0 = *(ckt->CKTstates[0] + here->BSIM4v6vgms) - - *(ckt->CKTstates[0] + here->BSIM4v6vgs); - if (here->BSIM4v6rgateMod > 1) - { gcrgd = here->BSIM4v6gcrgd * T0; - gcrgg = here->BSIM4v6gcrgg * T0; - gcrgs = here->BSIM4v6gcrgs * T0; - gcrgb = here->BSIM4v6gcrgb * T0; - gcrgg -= here->BSIM4v6gcrg; - gcrg = here->BSIM4v6gcrg; - } - else - gcrg = gcrgd = gcrgg = gcrgs = gcrgb = 0.0; - - if (here->BSIM4v6rgateMod == 3) - { xcgmgmb = (cgdo + cgso + pParam->BSIM4v6cgbo) * omega; - xcgmdb = -cgdo * omega; - xcgmsb = -cgso * omega; - xcgmbb = -pParam->BSIM4v6cgbo * omega; - - xcdgmb = xcgmdb; - xcsgmb = xcgmsb; - xcbgmb = xcgmbb; - - xcggbr = Cggr * omega; - xcgdbr = Cgdr * omega; - xcgsbr = Cgsr * omega; - xcgbbr = -(xcggbr + xcgdbr + xcgsbr); - - xcdgbr = Cdgr * omega; - xcsgbr = Csgr * omega; - xcbgb = here->BSIM4v6cbgb * omega; - } - else - { xcggbr = (Cggr + cgdo + cgso + pParam->BSIM4v6cgbo ) * omega; - xcgdbr = (Cgdr - cgdo) * omega; - xcgsbr = (Cgsr - cgso) * omega; - xcgbbr = -(xcggbr + xcgdbr + xcgsbr); - - xcdgbr = (Cdgr - cgdo) * omega; - xcsgbr = (Csgr - cgso) * omega; - xcbgb = (here->BSIM4v6cbgb - pParam->BSIM4v6cgbo) * omega; - - xcdgmb = xcsgmb = xcbgmb = 0.0; - } - xcddbr = (Cddr + here->BSIM4v6capbd + cgdo) * omega; - xcdsbr = Cdsr * omega; - xcsdbr = Csdr * omega; - xcssbr = (here->BSIM4v6capbs + cgso + Cssr) * omega; - - if (!here->BSIM4v6rbodyMod) - { xcdbbr = -(xcdgbr + xcddbr + xcdsbr + xcdgmb); - xcsbbr = -(xcsgbr + xcsdbr + xcssbr + xcsgmb); - - xcbdb = (here->BSIM4v6cbdb - here->BSIM4v6capbd) * omega; - xcbsb = (here->BSIM4v6cbsb - here->BSIM4v6capbs) * omega; - xcdbdb = 0.0; - } - else - { xcdbbr = Cdbr * omega; - xcsbbr = -(xcsgbr + xcsdbr + xcssbr + xcsgmb) - + here->BSIM4v6capbs * omega; - - xcbdb = here->BSIM4v6cbdb * omega; - xcbsb = here->BSIM4v6cbsb * omega; - - xcdbdb = -here->BSIM4v6capbd * omega; - xcsbsb = -here->BSIM4v6capbs * omega; - } - xcbbb = -(xcbdb + xcbgb + xcbsb + xcbgmb); - - xcdgbi = Cdgi; - xcsgbi = Csgi; - xcddbi = Cddi; - xcdsbi = Cdsi; - xcsdbi = Csdi; - xcssbi = Cssi; - xcdbbi = Cdbi; - xcsbbi = Csbi; - xcggbi = Cggi; - xcgdbi = Cgdi; - xcgsbi = Cgsi; - xcgbbi = Cgbi; - } - else /* Reverse mode */ - { Gmr = -gmr; - Gmbsr = -gmbsr; - FwdSumr = 0.0; - RevSumr = -(Gmr + Gmbsr); - Gmi = -gmi; - Gmbsi = -gmbsi; - FwdSumi = 0.0; - RevSumi = -(Gmi + Gmbsi); - - gbbsp = -(here->BSIM4v6gbds); - gbbdp = here->BSIM4v6gbds + here->BSIM4v6gbgs + here->BSIM4v6gbbs; - - gbdpg = 0.0; - gbdpsp = 0.0; - gbdpb = 0.0; - gbdpdp = 0.0; - - gbspg = here->BSIM4v6gbgs; - gbspsp = here->BSIM4v6gbds; - gbspb = here->BSIM4v6gbbs; - gbspdp = -(gbspg + gbspsp + gbspb); - - if (model->BSIM4v6igcMod) - { gIstotg = here->BSIM4v6gIgsg + here->BSIM4v6gIgcdg; - gIstotd = here->BSIM4v6gIgcds; - gIstots = here->BSIM4v6gIgss + here->BSIM4v6gIgcdd; - gIstotb = here->BSIM4v6gIgcdb; - - gIdtotg = here->BSIM4v6gIgdg + here->BSIM4v6gIgcsg; - gIdtotd = here->BSIM4v6gIgdd + here->BSIM4v6gIgcss; - gIdtots = here->BSIM4v6gIgcsd; - gIdtotb = here->BSIM4v6gIgcsb; - } - else - { gIstotg = gIstotd = gIstots = gIstotb = 0.0; - gIdtotg = gIdtotd = gIdtots = gIdtotb = 0.0; - } - - if (model->BSIM4v6igbMod) - { gIbtotg = here->BSIM4v6gIgbg; - gIbtotd = here->BSIM4v6gIgbs; - gIbtots = here->BSIM4v6gIgbd; - gIbtotb = here->BSIM4v6gIgbb; - } - else - gIbtotg = gIbtotd = gIbtots = gIbtotb = 0.0; - - if ((model->BSIM4v6igcMod != 0) || (model->BSIM4v6igbMod != 0)) - { gIgtotg = gIstotg + gIdtotg + gIbtotg; - gIgtotd = gIstotd + gIdtotd + gIbtotd ; - gIgtots = gIstots + gIdtots + gIbtots; - gIgtotb = gIstotb + gIdtotb + gIbtotb; - } - else - gIgtotg = gIgtotd = gIgtots = gIgtotb = 0.0; - - if (here->BSIM4v6rgateMod == 2) - T0 = *(ckt->CKTstates[0] + here->BSIM4v6vges) - - *(ckt->CKTstates[0] + here->BSIM4v6vgs); - else if (here->BSIM4v6rgateMod == 3) - T0 = *(ckt->CKTstates[0] + here->BSIM4v6vgms) - - *(ckt->CKTstates[0] + here->BSIM4v6vgs); - if (here->BSIM4v6rgateMod > 1) - { gcrgd = here->BSIM4v6gcrgs * T0; - gcrgg = here->BSIM4v6gcrgg * T0; - gcrgs = here->BSIM4v6gcrgd * T0; - gcrgb = here->BSIM4v6gcrgb * T0; - gcrgg -= here->BSIM4v6gcrg; - gcrg = here->BSIM4v6gcrg; - } - else - gcrg = gcrgd = gcrgg = gcrgs = gcrgb = 0.0; - - if (here->BSIM4v6rgateMod == 3) - { xcgmgmb = (cgdo + cgso + pParam->BSIM4v6cgbo) * omega; - xcgmdb = -cgdo * omega; - xcgmsb = -cgso * omega; - xcgmbb = -pParam->BSIM4v6cgbo * omega; - - xcdgmb = xcgmdb; - xcsgmb = xcgmsb; - xcbgmb = xcgmbb; - - xcggbr = Cggr * omega; - xcgdbr = Cgsr * omega; - xcgsbr = Cgdr * omega; - xcgbbr = -(xcggbr + xcgdbr + xcgsbr); - - xcdgbr = Csgr * omega; - xcsgbr = Cdgr * omega; - xcbgb = here->BSIM4v6cbgb * omega; - } - else - { xcggbr = (Cggr + cgdo + cgso + pParam->BSIM4v6cgbo ) * omega; - xcgdbr = (Cgsr - cgdo) * omega; - xcgsbr = (Cgdr - cgso) * omega; - xcgbbr = -(xcggbr + xcgdbr + xcgsbr); - - xcdgbr = (Csgr - cgdo) * omega; - xcsgbr = (Cdgr - cgso) * omega; - xcbgb = (here->BSIM4v6cbgb - pParam->BSIM4v6cgbo) * omega; - - xcdgmb = xcsgmb = xcbgmb = 0.0; - } - xcddbr = (here->BSIM4v6capbd + cgdo + Cssr) * omega; - xcdsbr = Csdr * omega; - xcsdbr = Cdsr * omega; - xcssbr = (Cddr + here->BSIM4v6capbs + cgso) * omega; - - if (!here->BSIM4v6rbodyMod) - { xcdbbr = -(xcdgbr + xcddbr + xcdsbr + xcdgmb); - xcsbbr = -(xcsgbr + xcsdbr + xcssbr + xcsgmb); - - xcbdb = (here->BSIM4v6cbsb - here->BSIM4v6capbd) * omega; - xcbsb = (here->BSIM4v6cbdb - here->BSIM4v6capbs) * omega; - xcdbdb = 0.0; - } - else - { xcdbbr = -(xcdgbr + xcddbr + xcdsbr + xcdgmb) - + here->BSIM4v6capbd * omega; - xcsbbr = Cdbr * omega; - - xcbdb = here->BSIM4v6cbsb * omega; - xcbsb = here->BSIM4v6cbdb * omega; - xcdbdb = -here->BSIM4v6capbd * omega; - xcsbsb = -here->BSIM4v6capbs * omega; - } - xcbbb = -(xcbgb + xcbdb + xcbsb + xcbgmb); - - xcdgbi = Csgi; - xcsgbi = Cdgi; - xcddbi = Cssi; - xcdsbi = Csdi; - xcsdbi = Cdsi; - xcssbi = Cddi; - xcdbbi = Csbi; - xcsbbi = Cdbi; - xcggbi = Cggi; - xcgdbi = Cgsi; - xcgsbi = Cgdi; - xcgbbi = Cgbi; - } - - if (model->BSIM4v6rdsMod == 1) - { gstot = here->BSIM4v6gstot; - gstotd = here->BSIM4v6gstotd; - gstotg = here->BSIM4v6gstotg; - gstots = here->BSIM4v6gstots - gstot; - gstotb = here->BSIM4v6gstotb; - - gdtot = here->BSIM4v6gdtot; - gdtotd = here->BSIM4v6gdtotd - gdtot; - gdtotg = here->BSIM4v6gdtotg; - gdtots = here->BSIM4v6gdtots; - gdtotb = here->BSIM4v6gdtotb; - } - else - { gstot = gstotd = gstotg = gstots = gstotb = 0.0; - gdtot = gdtotd = gdtotg = gdtots = gdtotb = 0.0; - } - - - /* - * Loading AC matrix - */ - m = here->BSIM4v6m; - - if (!model->BSIM4v6rdsMod) - { gdpr = here->BSIM4v6drainConductance; - gspr = here->BSIM4v6sourceConductance; - } - else - gdpr = gspr = 0.0; - - if (!here->BSIM4v6rbodyMod) - { gjbd = here->BSIM4v6gbd; - gjbs = here->BSIM4v6gbs; - } - else - gjbd = gjbs = 0.0; - - geltd = here->BSIM4v6grgeltd; - - if (here->BSIM4v6rgateMod == 1) - { *(here->BSIM4v6GEgePtr) += m * geltd; - *(here->BSIM4v6GPgePtr) -= m * geltd; - *(here->BSIM4v6GEgpPtr) -= m * geltd; - - *(here->BSIM4v6GPgpPtr +1) += m * xcggbr; - *(here->BSIM4v6GPgpPtr) += m * (geltd + xcggbi + gIgtotg); - *(here->BSIM4v6GPdpPtr +1) += m * xcgdbr; - *(here->BSIM4v6GPdpPtr) += m * (xcgdbi + gIgtotd); - *(here->BSIM4v6GPspPtr +1) += m * xcgsbr; - *(here->BSIM4v6GPspPtr) += m * (xcgsbi + gIgtots); - *(here->BSIM4v6GPbpPtr +1) += m * xcgbbr; - *(here->BSIM4v6GPbpPtr) += m * (xcgbbi + gIgtotb); - } /* WDLiu: gcrg already subtracted from all gcrgg below */ - else if (here->BSIM4v6rgateMod == 2) - { *(here->BSIM4v6GEgePtr) += m * gcrg; - *(here->BSIM4v6GEgpPtr) += m * gcrgg; - *(here->BSIM4v6GEdpPtr) += m * gcrgd; - *(here->BSIM4v6GEspPtr) += m * gcrgs; - *(here->BSIM4v6GEbpPtr) += m * gcrgb; - - *(here->BSIM4v6GPgePtr) -= m * gcrg; - *(here->BSIM4v6GPgpPtr +1) += m * xcggbr; - *(here->BSIM4v6GPgpPtr) -= m * (gcrgg - xcggbi - gIgtotg); - *(here->BSIM4v6GPdpPtr +1) += m * xcgdbr; - *(here->BSIM4v6GPdpPtr) -= m * (gcrgd - xcgdbi - gIgtotd); - *(here->BSIM4v6GPspPtr +1) += m * xcgsbr; - *(here->BSIM4v6GPspPtr) -= m * (gcrgs - xcgsbi - gIgtots); - *(here->BSIM4v6GPbpPtr +1) += m * xcgbbr; - *(here->BSIM4v6GPbpPtr) -= m * (gcrgb - xcgbbi - gIgtotb); - } - else if (here->BSIM4v6rgateMod == 3) - { *(here->BSIM4v6GEgePtr) += m * geltd; - *(here->BSIM4v6GEgmPtr) -= m * geltd; - *(here->BSIM4v6GMgePtr) -= m * geltd; - *(here->BSIM4v6GMgmPtr) += m * (geltd + gcrg); - *(here->BSIM4v6GMgmPtr +1) += m * xcgmgmb; - - *(here->BSIM4v6GMdpPtr) += m * gcrgd; - *(here->BSIM4v6GMdpPtr +1) += m * xcgmdb; - *(here->BSIM4v6GMgpPtr) += m * gcrgg; - *(here->BSIM4v6GMspPtr) += m * gcrgs; - *(here->BSIM4v6GMspPtr +1) += m * xcgmsb; - *(here->BSIM4v6GMbpPtr) += m * gcrgb; - *(here->BSIM4v6GMbpPtr +1) += m * xcgmbb; - - *(here->BSIM4v6DPgmPtr +1) += m * xcdgmb; - *(here->BSIM4v6GPgmPtr) -= m * gcrg; - *(here->BSIM4v6SPgmPtr +1) += m * xcsgmb; - *(here->BSIM4v6BPgmPtr +1) += m * xcbgmb; - - *(here->BSIM4v6GPgpPtr) -= m * (gcrgg - xcggbi - gIgtotg); - *(here->BSIM4v6GPgpPtr +1) += m * xcggbr; - *(here->BSIM4v6GPdpPtr) -= m * (gcrgd - xcgdbi - gIgtotd); - *(here->BSIM4v6GPdpPtr +1) += m * xcgdbr; - *(here->BSIM4v6GPspPtr) -= m * (gcrgs - xcgsbi - gIgtots); - *(here->BSIM4v6GPspPtr +1) += m * xcgsbr; - *(here->BSIM4v6GPbpPtr) -= m * (gcrgb - xcgbbi - gIgtotb); - *(here->BSIM4v6GPbpPtr +1) += m * xcgbbr; - } - else - { *(here->BSIM4v6GPgpPtr +1) += m * xcggbr; - *(here->BSIM4v6GPgpPtr) += m * (xcggbi + gIgtotg); - *(here->BSIM4v6GPdpPtr +1) += m * xcgdbr; - *(here->BSIM4v6GPdpPtr) += m * (xcgdbi + gIgtotd); - *(here->BSIM4v6GPspPtr +1) += m * xcgsbr; - *(here->BSIM4v6GPspPtr) += m * (xcgsbi + gIgtots); - *(here->BSIM4v6GPbpPtr +1) += m * xcgbbr; - *(here->BSIM4v6GPbpPtr) += m * (xcgbbi + gIgtotb); - } - - if (model->BSIM4v6rdsMod) - { (*(here->BSIM4v6DgpPtr) += m * gdtotg); - (*(here->BSIM4v6DspPtr) += m * gdtots); - (*(here->BSIM4v6DbpPtr) += m * gdtotb); - (*(here->BSIM4v6SdpPtr) += m * gstotd); - (*(here->BSIM4v6SgpPtr) += m * gstotg); - (*(here->BSIM4v6SbpPtr) += m * gstotb); - } - - *(here->BSIM4v6DPdpPtr +1) += m * (xcddbr + gdsi + RevSumi); - *(here->BSIM4v6DPdpPtr) += m * (gdpr + xcddbi + gdsr + here->BSIM4v6gbd - - gdtotd + RevSumr + gbdpdp - gIdtotd); - *(here->BSIM4v6DPdPtr) -= m * (gdpr + gdtot); - *(here->BSIM4v6DPgpPtr +1) += m * (xcdgbr + Gmi); - *(here->BSIM4v6DPgpPtr) += m * (Gmr + xcdgbi - gdtotg + gbdpg - gIdtotg); - *(here->BSIM4v6DPspPtr +1) += m * (xcdsbr - gdsi - FwdSumi); - *(here->BSIM4v6DPspPtr) -= m * (gdsr - xcdsbi + FwdSumr + gdtots - gbdpsp + gIdtots); - *(here->BSIM4v6DPbpPtr +1) += m * (xcdbbr + Gmbsi); - *(here->BSIM4v6DPbpPtr) -= m * (gjbd + gdtotb - xcdbbi - Gmbsr - gbdpb + gIdtotb); - - *(here->BSIM4v6DdpPtr) -= m * (gdpr - gdtotd); - *(here->BSIM4v6DdPtr) += m * (gdpr + gdtot); - - *(here->BSIM4v6SPdpPtr +1) += m * (xcsdbr - gdsi - RevSumi); - *(here->BSIM4v6SPdpPtr) -= m * (gdsr - xcsdbi + gstotd + RevSumr - gbspdp + gIstotd); - *(here->BSIM4v6SPgpPtr +1) += m * (xcsgbr - Gmi); - *(here->BSIM4v6SPgpPtr) -= m * (Gmr - xcsgbi + gstotg - gbspg + gIstotg); - *(here->BSIM4v6SPspPtr +1) += m * (xcssbr + gdsi + FwdSumi); - *(here->BSIM4v6SPspPtr) += m * (gspr + xcssbi + gdsr + here->BSIM4v6gbs - - gstots + FwdSumr + gbspsp - gIstots); - *(here->BSIM4v6SPsPtr) -= m * (gspr + gstot); - *(here->BSIM4v6SPbpPtr +1) += m * (xcsbbr - Gmbsi); - *(here->BSIM4v6SPbpPtr) -= m * (gjbs + gstotb - xcsbbi + Gmbsr - gbspb + gIstotb); - - *(here->BSIM4v6SspPtr) -= m * (gspr - gstots); - *(here->BSIM4v6SsPtr) += m * (gspr + gstot); - - *(here->BSIM4v6BPdpPtr +1) += m * xcbdb; - *(here->BSIM4v6BPdpPtr) -= m * (gjbd - gbbdp + gIbtotd); - *(here->BSIM4v6BPgpPtr +1) += m * xcbgb; - *(here->BSIM4v6BPgpPtr) -= m * (here->BSIM4v6gbgs + gIbtotg); - *(here->BSIM4v6BPspPtr +1) += m * xcbsb; - *(here->BSIM4v6BPspPtr) -= m * (gjbs - gbbsp + gIbtots); - *(here->BSIM4v6BPbpPtr +1) += m * xcbbb; - *(here->BSIM4v6BPbpPtr) += m * (gjbd + gjbs - here->BSIM4v6gbbs - - gIbtotb); - ggidld = here->BSIM4v6ggidld; - ggidlg = here->BSIM4v6ggidlg; - ggidlb = here->BSIM4v6ggidlb; - ggislg = here->BSIM4v6ggislg; - ggisls = here->BSIM4v6ggisls; - ggislb = here->BSIM4v6ggislb; - - /* stamp gidl */ - (*(here->BSIM4v6DPdpPtr) += m * ggidld); - (*(here->BSIM4v6DPgpPtr) += m * ggidlg); - (*(here->BSIM4v6DPspPtr) -= m * ((ggidlg + ggidld) + ggidlb)); - (*(here->BSIM4v6DPbpPtr) += m * ggidlb); - (*(here->BSIM4v6BPdpPtr) -= m * ggidld); - (*(here->BSIM4v6BPgpPtr) -= m * ggidlg); - (*(here->BSIM4v6BPspPtr) += m * ((ggidlg + ggidld) + ggidlb)); - (*(here->BSIM4v6BPbpPtr) -= m * ggidlb); - /* stamp gisl */ - (*(here->BSIM4v6SPdpPtr) -= m * ((ggisls + ggislg) + ggislb)); - (*(here->BSIM4v6SPgpPtr) += m * ggislg); - (*(here->BSIM4v6SPspPtr) += m * ggisls); - (*(here->BSIM4v6SPbpPtr) += m * ggislb); - (*(here->BSIM4v6BPdpPtr) += m * ((ggislg + ggisls) + ggislb)); - (*(here->BSIM4v6BPgpPtr) -= m * ggislg); - (*(here->BSIM4v6BPspPtr) -= m * ggisls); - (*(here->BSIM4v6BPbpPtr) -= m * ggislb); - - if (here->BSIM4v6rbodyMod) - { (*(here->BSIM4v6DPdbPtr +1) += m * xcdbdb); - (*(here->BSIM4v6DPdbPtr) -= m * here->BSIM4v6gbd); - (*(here->BSIM4v6SPsbPtr +1) += m * xcsbsb); - (*(here->BSIM4v6SPsbPtr) -= m * here->BSIM4v6gbs); - - (*(here->BSIM4v6DBdpPtr +1) += m * xcdbdb); - (*(here->BSIM4v6DBdpPtr) -= m * here->BSIM4v6gbd); - (*(here->BSIM4v6DBdbPtr +1) -= m * xcdbdb); - (*(here->BSIM4v6DBdbPtr) += m * (here->BSIM4v6gbd + here->BSIM4v6grbpd - + here->BSIM4v6grbdb)); - (*(here->BSIM4v6DBbpPtr) -= m * here->BSIM4v6grbpd); - (*(here->BSIM4v6DBbPtr) -= m * here->BSIM4v6grbdb); - - (*(here->BSIM4v6BPdbPtr) -= m * here->BSIM4v6grbpd); - (*(here->BSIM4v6BPbPtr) -= m * here->BSIM4v6grbpb); - (*(here->BSIM4v6BPsbPtr) -= m * here->BSIM4v6grbps); - (*(here->BSIM4v6BPbpPtr) += m * (here->BSIM4v6grbpd + here->BSIM4v6grbps - + here->BSIM4v6grbpb)); - /* WDLiu: (-here->BSIM4v6gbbs) already added to BPbpPtr */ - - (*(here->BSIM4v6SBspPtr +1) += m * xcsbsb); - (*(here->BSIM4v6SBspPtr) -= m * here->BSIM4v6gbs); - (*(here->BSIM4v6SBbpPtr) -= m * here->BSIM4v6grbps); - (*(here->BSIM4v6SBbPtr) -= m * here->BSIM4v6grbsb); - (*(here->BSIM4v6SBsbPtr +1) -= m * xcsbsb); - (*(here->BSIM4v6SBsbPtr) += m * (here->BSIM4v6gbs - + here->BSIM4v6grbps + here->BSIM4v6grbsb)); - - (*(here->BSIM4v6BdbPtr) -= m * here->BSIM4v6grbdb); - (*(here->BSIM4v6BbpPtr) -= m * here->BSIM4v6grbpb); - (*(here->BSIM4v6BsbPtr) -= m * here->BSIM4v6grbsb); - (*(here->BSIM4v6BbPtr) += m * (here->BSIM4v6grbsb + here->BSIM4v6grbdb - + here->BSIM4v6grbpb)); - } - - - /* - * WDLiu: The internal charge node generated for transient NQS is not needed for - * AC NQS. The following is not doing a real job, but we have to keep it; - * otherwise a singular AC NQS matrix may occur if the transient NQS is on. - * The charge node is isolated from the instance. - */ - if (here->BSIM4v6trnqsMod) - { (*(here->BSIM4v6QqPtr) += m * 1.0); - (*(here->BSIM4v6QgpPtr) += 0.0); - (*(here->BSIM4v6QdpPtr) += 0.0); - (*(here->BSIM4v6QspPtr) += 0.0); - (*(here->BSIM4v6QbpPtr) += 0.0); - - (*(here->BSIM4v6DPqPtr) += 0.0); - (*(here->BSIM4v6SPqPtr) += 0.0); - (*(here->BSIM4v6GPqPtr) += 0.0); - } - } - } - return(OK); -} diff --git a/src/spicelib/devices/bsim4v6/b4v6ask.c b/src/spicelib/devices/bsim4v6/b4v6ask.c deleted file mode 100644 index 54a99278a..000000000 --- a/src/spicelib/devices/bsim4v6/b4v6ask.c +++ /dev/null @@ -1,404 +0,0 @@ -/**** BSIM4.6.2 Released by Wenwei Yang 07/31/2008 ****/ - -/********** - * Copyright 2006 Regents of the University of California. All rights reserved. - * File: b4ask.c of BSIM4.6.2. - * Author: 2000 Weidong Liu - * Authors: 2001- Xuemei Xi, Mohan Dunga, Ali Niknejad, Chenming Hu. - * Authors: 2006- Mohan Dunga, Ali Niknejad, Chenming Hu - * Authors: 2007- Mohan Dunga, Wenwei Yang, Ali Niknejad, Chenming Hu - * Project Director: Prof. Chenming Hu. - * Modified by Xuemei Xi, 04/06/2001. - * Modified by Xuemei Xi, 10/05/2001. - * Modified by Xuemei Xi, 05/09/2003. - * Modified by Xuemei Xi, Mohan Dunga, 07/29/2005. - **********/ - -#include "ngspice/ngspice.h" -#include "ngspice/ifsim.h" -#include "ngspice/cktdefs.h" -#include "ngspice/devdefs.h" -#include "bsim4v6def.h" -#include "ngspice/sperror.h" -#include "ngspice/suffix.h" - -int -BSIM4v6ask( -CKTcircuit *ckt, -GENinstance *inst, -int which, -IFvalue *value, -IFvalue *select) -{ -BSIM4v6instance *here = (BSIM4v6instance*)inst; - - NG_IGNORE(select); - - switch(which) - { case BSIM4v6_L: - value->rValue = here->BSIM4v6l; - return(OK); - case BSIM4v6_W: - value->rValue = here->BSIM4v6w; - return(OK); - case BSIM4v6_M: - value->rValue = here->BSIM4v6m; - return(OK); - case BSIM4v6_NF: - value->rValue = here->BSIM4v6nf; - return(OK); - case BSIM4v6_MIN: - value->iValue = here->BSIM4v6min; - return(OK); - case BSIM4v6_AS: - value->rValue = here->BSIM4v6sourceArea; - return(OK); - case BSIM4v6_AD: - value->rValue = here->BSIM4v6drainArea; - return(OK); - case BSIM4v6_PS: - value->rValue = here->BSIM4v6sourcePerimeter; - return(OK); - case BSIM4v6_PD: - value->rValue = here->BSIM4v6drainPerimeter; - return(OK); - case BSIM4v6_NRS: - value->rValue = here->BSIM4v6sourceSquares; - return(OK); - case BSIM4v6_NRD: - value->rValue = here->BSIM4v6drainSquares; - return(OK); - case BSIM4v6_OFF: - value->rValue = here->BSIM4v6off; - return(OK); - case BSIM4v6_SA: - value->rValue = here->BSIM4v6sa ; - return(OK); - case BSIM4v6_SB: - value->rValue = here->BSIM4v6sb ; - return(OK); - case BSIM4v6_SD: - value->rValue = here->BSIM4v6sd ; - return(OK); - case BSIM4v6_SCA: - value->rValue = here->BSIM4v6sca ; - return(OK); - case BSIM4v6_SCB: - value->rValue = here->BSIM4v6scb ; - return(OK); - case BSIM4v6_SCC: - value->rValue = here->BSIM4v6scc ; - return(OK); - case BSIM4v6_SC: - value->rValue = here->BSIM4v6sc ; - return(OK); - - case BSIM4v6_RBSB: - value->rValue = here->BSIM4v6rbsb; - return(OK); - case BSIM4v6_RBDB: - value->rValue = here->BSIM4v6rbdb; - return(OK); - case BSIM4v6_RBPB: - value->rValue = here->BSIM4v6rbpb; - return(OK); - case BSIM4v6_RBPS: - value->rValue = here->BSIM4v6rbps; - return(OK); - case BSIM4v6_RBPD: - value->rValue = here->BSIM4v6rbpd; - return(OK); - case BSIM4v6_DELVTO: - value->rValue = here->BSIM4v6delvto; - return(OK); - case BSIM4v6_XGW: - value->rValue = here->BSIM4v6xgw; - return(OK); - case BSIM4v6_NGCON: - value->rValue = here->BSIM4v6ngcon; - return(OK); - case BSIM4v6_TRNQSMOD: - value->iValue = here->BSIM4v6trnqsMod; - return(OK); - case BSIM4v6_ACNQSMOD: - value->iValue = here->BSIM4v6acnqsMod; - return(OK); - case BSIM4v6_RBODYMOD: - value->iValue = here->BSIM4v6rbodyMod; - return(OK); - case BSIM4v6_RGATEMOD: - value->iValue = here->BSIM4v6rgateMod; - return(OK); - case BSIM4v6_GEOMOD: - value->iValue = here->BSIM4v6geoMod; - return(OK); - case BSIM4v6_RGEOMOD: - value->iValue = here->BSIM4v6rgeoMod; - return(OK); - case BSIM4v6_IC_VDS: - value->rValue = here->BSIM4v6icVDS; - return(OK); - case BSIM4v6_IC_VGS: - value->rValue = here->BSIM4v6icVGS; - return(OK); - case BSIM4v6_IC_VBS: - value->rValue = here->BSIM4v6icVBS; - return(OK); - case BSIM4v6_DNODE: - value->iValue = here->BSIM4v6dNode; - return(OK); - case BSIM4v6_GNODEEXT: - value->iValue = here->BSIM4v6gNodeExt; - return(OK); - case BSIM4v6_SNODE: - value->iValue = here->BSIM4v6sNode; - return(OK); - case BSIM4v6_BNODE: - value->iValue = here->BSIM4v6bNode; - return(OK); - case BSIM4v6_DNODEPRIME: - value->iValue = here->BSIM4v6dNodePrime; - return(OK); - case BSIM4v6_GNODEPRIME: - value->iValue = here->BSIM4v6gNodePrime; - return(OK); - case BSIM4v6_GNODEMID: - value->iValue = here->BSIM4v6gNodeMid; - return(OK); - case BSIM4v6_SNODEPRIME: - value->iValue = here->BSIM4v6sNodePrime; - return(OK); - case BSIM4v6_DBNODE: - value->iValue = here->BSIM4v6dbNode; - return(OK); - case BSIM4v6_BNODEPRIME: - value->iValue = here->BSIM4v6bNodePrime; - return(OK); - case BSIM4v6_SBNODE: - value->iValue = here->BSIM4v6sbNode; - return(OK); - case BSIM4v6_SOURCECONDUCT: - value->rValue = here->BSIM4v6sourceConductance; - value->rValue *= here->BSIM4v6m; - return(OK); - case BSIM4v6_DRAINCONDUCT: - value->rValue = here->BSIM4v6drainConductance; - value->rValue *= here->BSIM4v6m; - return(OK); - case BSIM4v6_VBD: - value->rValue = *(ckt->CKTstate0 + here->BSIM4v6vbd); - return(OK); - case BSIM4v6_VBS: - value->rValue = *(ckt->CKTstate0 + here->BSIM4v6vbs); - return(OK); - case BSIM4v6_VGS: - value->rValue = *(ckt->CKTstate0 + here->BSIM4v6vgs); - return(OK); - case BSIM4v6_VDS: - value->rValue = *(ckt->CKTstate0 + here->BSIM4v6vds); - return(OK); - case BSIM4v6_CD: - value->rValue = here->BSIM4v6cd; - value->rValue *= here->BSIM4v6m; - return(OK); - case BSIM4v6_CBS: - value->rValue = here->BSIM4v6cbs; - value->rValue *= here->BSIM4v6m; - return(OK); - case BSIM4v6_CBD: - value->rValue = here->BSIM4v6cbd; - value->rValue *= here->BSIM4v6m; - return(OK); - case BSIM4v6_CSUB: - value->rValue = here->BSIM4v6csub; - value->rValue *= here->BSIM4v6m; - return(OK); - case BSIM4v6_QINV: - value->rValue = here-> BSIM4v6qinv; - value->rValue *= here->BSIM4v6m; - return(OK); - case BSIM4v6_IGIDL: - value->rValue = here->BSIM4v6Igidl; - value->rValue *= here->BSIM4v6m; - return(OK); - case BSIM4v6_IGISL: - value->rValue = here->BSIM4v6Igisl; - value->rValue *= here->BSIM4v6m; - return(OK); - case BSIM4v6_IGS: - value->rValue = here->BSIM4v6Igs; - value->rValue *= here->BSIM4v6m; - return(OK); - case BSIM4v6_IGD: - value->rValue = here->BSIM4v6Igd; - value->rValue *= here->BSIM4v6m; - return(OK); - case BSIM4v6_IGB: - value->rValue = here->BSIM4v6Igb; - value->rValue *= here->BSIM4v6m; - return(OK); - case BSIM4v6_IGCS: - value->rValue = here->BSIM4v6Igcs; - value->rValue *= here->BSIM4v6m; - return(OK); - case BSIM4v6_IGCD: - value->rValue = here->BSIM4v6Igcd; - value->rValue *= here->BSIM4v6m; - return(OK); - case BSIM4v6_GM: - value->rValue = here->BSIM4v6gm; - value->rValue *= here->BSIM4v6m; - return(OK); - case BSIM4v6_GDS: - value->rValue = here->BSIM4v6gds; - value->rValue *= here->BSIM4v6m; - return(OK); - case BSIM4v6_GMBS: - value->rValue = here->BSIM4v6gmbs; - value->rValue *= here->BSIM4v6m; - return(OK); - case BSIM4v6_GBD: - value->rValue = here->BSIM4v6gbd; - value->rValue *= here->BSIM4v6m; - return(OK); - case BSIM4v6_GBS: - value->rValue = here->BSIM4v6gbs; - value->rValue *= here->BSIM4v6m; - return(OK); -/* case BSIM4v6_QB: - value->rValue = *(ckt->CKTstate0 + here->BSIM4v6qb); - return(OK); */ - case BSIM4v6_CQB: - value->rValue = *(ckt->CKTstate0 + here->BSIM4v6cqb); - return(OK); -/* case BSIM4v6_QG: - value->rValue = *(ckt->CKTstate0 + here->BSIM4v6qg); - return(OK); */ - case BSIM4v6_CQG: - value->rValue = *(ckt->CKTstate0 + here->BSIM4v6cqg); - return(OK); -/* case BSIM4v6_QD: - value->rValue = *(ckt->CKTstate0 + here->BSIM4v6qd); - return(OK); */ - case BSIM4v6_CQD: - value->rValue = *(ckt->CKTstate0 + here->BSIM4v6cqd); - return(OK); -/* case BSIM4v6_QS: - value->rValue = *(ckt->CKTstate0 + here->BSIM4v6qs); - return(OK); */ - case BSIM4v6_QB: - value->rValue = here->BSIM4v6qbulk; - value->rValue *= here->BSIM4v6m; - return(OK); - case BSIM4v6_QG: - value->rValue = here->BSIM4v6qgate; - value->rValue *= here->BSIM4v6m; - return(OK); - case BSIM4v6_QS: - value->rValue = here->BSIM4v6qsrc; - value->rValue *= here->BSIM4v6m; - return(OK); - case BSIM4v6_QD: - value->rValue = here->BSIM4v6qdrn; - value->rValue *= here->BSIM4v6m; - return(OK); - case BSIM4v6_QDEF: - value->rValue = *(ckt->CKTstate0 + here->BSIM4v6qdef); - return(OK); - case BSIM4v6_GCRG: - value->rValue = here->BSIM4v6gcrg; - value->rValue *= here->BSIM4v6m; - return(OK); - case BSIM4v6_GTAU: - value->rValue = here->BSIM4v6gtau; - return(OK); - case BSIM4v6_CGGB: - value->rValue = here->BSIM4v6cggb; - value->rValue *= here->BSIM4v6m; - return(OK); - case BSIM4v6_CGDB: - value->rValue = here->BSIM4v6cgdb; - value->rValue *= here->BSIM4v6m; - return(OK); - case BSIM4v6_CGSB: - value->rValue = here->BSIM4v6cgsb; - value->rValue *= here->BSIM4v6m; - return(OK); - case BSIM4v6_CDGB: - value->rValue = here->BSIM4v6cdgb; - value->rValue *= here->BSIM4v6m; - return(OK); - case BSIM4v6_CDDB: - value->rValue = here->BSIM4v6cddb; - value->rValue *= here->BSIM4v6m; - return(OK); - case BSIM4v6_CDSB: - value->rValue = here->BSIM4v6cdsb; - value->rValue *= here->BSIM4v6m; - return(OK); - case BSIM4v6_CBGB: - value->rValue = here->BSIM4v6cbgb; - value->rValue *= here->BSIM4v6m; - return(OK); - case BSIM4v6_CBDB: - value->rValue = here->BSIM4v6cbdb; - value->rValue *= here->BSIM4v6m; - return(OK); - case BSIM4v6_CBSB: - value->rValue = here->BSIM4v6cbsb; - value->rValue *= here->BSIM4v6m; - return(OK); - case BSIM4v6_CSGB: - value->rValue = here->BSIM4v6csgb; - value->rValue *= here->BSIM4v6m; - return(OK); - case BSIM4v6_CSDB: - value->rValue = here->BSIM4v6csdb; - value->rValue *= here->BSIM4v6m; - return(OK); - case BSIM4v6_CSSB: - value->rValue = here->BSIM4v6cssb; - value->rValue *= here->BSIM4v6m; - return(OK); - case BSIM4v6_CGBB: - value->rValue = here->BSIM4v6cgbb; - value->rValue *= here->BSIM4v6m; - return(OK); - case BSIM4v6_CDBB: - value->rValue = here->BSIM4v6cdbb; - value->rValue *= here->BSIM4v6m; - return(OK); - case BSIM4v6_CSBB: - value->rValue = here->BSIM4v6csbb; - value->rValue *= here->BSIM4v6m; - return(OK); - case BSIM4v6_CBBB: - value->rValue = here->BSIM4v6cbbb; - value->rValue *= here->BSIM4v6m; - return(OK); - case BSIM4v6_CAPBD: - value->rValue = here->BSIM4v6capbd; - value->rValue *= here->BSIM4v6m; - return(OK); - case BSIM4v6_CAPBS: - value->rValue = here->BSIM4v6capbs; - value->rValue *= here->BSIM4v6m; - return(OK); - case BSIM4v6_VON: - value->rValue = here->BSIM4v6von; - return(OK); - case BSIM4v6_VDSAT: - value->rValue = here->BSIM4v6vdsat; - return(OK); - case BSIM4v6_QBS: - value->rValue = *(ckt->CKTstate0 + here->BSIM4v6qbs); - return(OK); - case BSIM4v6_QBD: - value->rValue = *(ckt->CKTstate0 + here->BSIM4v6qbd); - return(OK); - default: - return(E_BADPARM); - } - /* NOTREACHED */ -} - diff --git a/src/spicelib/devices/bsim4v6/b4v6check.c b/src/spicelib/devices/bsim4v6/b4v6check.c deleted file mode 100644 index d78af90be..000000000 --- a/src/spicelib/devices/bsim4v6/b4v6check.c +++ /dev/null @@ -1,822 +0,0 @@ -/**** BSIM4.6.2 Released by Wenwei Yang 07/31/2008 ****/ -/**** BSIM4.6.5 Update ngspice 09/22/2009 ****/ -/********** - * Copyright 2006 Regents of the University of California. All rights reserved. - * File: b4check.c of BSIM4.6.1. - * Author: 2000 Weidong Liu - * Authors: 2001- Xuemei Xi, Mohan Dunga, Ali Niknejad, Chenming Hu. - * Authors: 2006- Mohan Dunga, Ali Niknejad, Chenming Hu - * Authors: 2007- Mohan Dunga, Wenwei Yang, Ali Niknejad, Chenming Hu - * Project Director: Prof. Chenming Hu. - * Modified by Xuemei Xi, 04/06/2001. - * Modified by Xuemei Xi, 10/05/2001. - * Modified by Xuemei Xi, 11/15/2002. - * Modified by Xuemei Xi, 05/09/2003. - * Modified by Xuemei Xi, 03/04/2004. - * Modified by Xuemei Xi, 07/29/2005. - * Modified by Mohan Dunga, 12/13/2006 - * Modified by Mohan Dunga, Wenwei Yang, 05/18/2007. - * Modified by Wenwei Yang, 07/31/2008 . - * Modified by Holger Vogt, 12/27/2020. - **********/ - -#include "ngspice/ngspice.h" -#include "ngspice/cktdefs.h" -#include "bsim4v6def.h" -#include "ngspice/trandefs.h" -#include "ngspice/const.h" -#include "ngspice/sperror.h" -#include "ngspice/devdefs.h" -#include "ngspice/suffix.h" -#include "ngspice/wordlist.h" -#include "ngspice/cpextern.h" - - - -/* Check for correctness of the BSIM4.5 parameters: - If parameter excursions are found, put the warning or error message into a wordlist. - Only then open a file bsim4v6.out and print the data into the file. */ -int -BSIM4v6checkModel( -BSIM4v6model *model, -BSIM4v6instance *here, -CKTcircuit *ckt) -{ - struct bsim4v6SizeDependParam *pParam; - int Fatal_Flag = 0; - FILE *fplog; - wordlist* wl, *wlstart; - - pParam = here->pParam; - - if (cp_getvar("ng_nomodcheck", CP_BOOL, NULL, 0)) - return(0); - - wl = wlstart = TMALLOC(wordlist, 1); - wl->wl_prev = NULL; - wl->wl_next = NULL; - wl->wl_word = tprintf("\nChecking parameters for BSIM 4.5 model %s\n", model->BSIM4v6modName); - - if ((here->BSIM4v6rgateMod == 2) || (here->BSIM4v6rgateMod == 3)) - { if ((here->BSIM4v6trnqsMod == 1) || (here->BSIM4v6acnqsMod == 1)) { - wl_append_word(&wl, &wl, tprintf("Warning: You've selected both Rg and charge deficit NQS; select one only.\n")); - } - } - - if (model->BSIM4v6toxe <= 0.0) - { - wl_append_word(&wl, &wl, tprintf("Fatal: Toxe = %g is not positive.\n", - model->BSIM4v6toxe)); - Fatal_Flag = 1; - } - - if (model->BSIM4v6toxp <= 0.0) - { - wl_append_word(&wl, &wl, tprintf("Fatal: Toxp = %g is not positive.\n", model->BSIM4v6toxp)); - Fatal_Flag = 1; - } - - if (model->BSIM4v6eot <= 0.0) - { - wl_append_word(&wl, &wl, tprintf("Fatal: EOT = %g is not positive.\n", model->BSIM4v6eot)); - Fatal_Flag = 1; - } - if (model->BSIM4v6epsrgate < 0.0) - { - wl_append_word(&wl, &wl, tprintf("Fatal: Epsrgate = %g is not positive.\n", model->BSIM4v6epsrgate)); - Fatal_Flag = 1; - } - if (model->BSIM4v6epsrsub < 0.0) - { - wl_append_word(&wl, &wl, tprintf("Fatal: Epsrsub = %g is not positive.\n", model->BSIM4v6epsrsub)); - Fatal_Flag = 1; - } - if (model->BSIM4v6easub < 0.0) - { - wl_append_word(&wl, &wl, tprintf("Fatal: Easub = %g is not positive.\n", model->BSIM4v6easub)); - Fatal_Flag = 1; - } - if (model->BSIM4v6ni0sub <= 0.0) - { - wl_append_word(&wl, &wl, tprintf("Fatal: Easub = %g is not positive.\n", model->BSIM4v6ni0sub)); - Fatal_Flag = 1; - } - - if (model->BSIM4v6toxm <= 0.0) - { - wl_append_word(&wl, &wl, tprintf("Fatal: Toxm = %g is not positive.\n", model->BSIM4v6toxm)); - Fatal_Flag = 1; - } - if (model->BSIM4v6toxref <= 0.0) - { - wl_append_word(&wl, &wl, tprintf("Fatal: Toxref = %g is not positive.\n", model->BSIM4v6toxref)); - Fatal_Flag = 1; - } - - if (pParam->BSIM4v6lpe0 < -pParam->BSIM4v6leff) - { - wl_append_word(&wl, &wl, tprintf("Fatal: Lpe0 = %g is less than -Leff.\n", - pParam->BSIM4v6lpe0)); - Fatal_Flag = 1; - } - if (model->BSIM4v6lintnoi > pParam->BSIM4v6leff / 2) - { - wl_append_word(&wl, &wl, tprintf("Fatal: Lintnoi = %g is too large - Leff for noise is negative.\n", - model->BSIM4v6lintnoi)); - Fatal_Flag = 1; - } - if (pParam->BSIM4v6lpeb < -pParam->BSIM4v6leff) - { - wl_append_word(&wl, &wl, tprintf("Fatal: Lpeb = %g is less than -Leff.\n", - pParam->BSIM4v6lpeb)); - Fatal_Flag = 1; - } - if (pParam->BSIM4v6ndep <= 0.0) - { - wl_append_word(&wl, &wl, tprintf("Fatal: Ndep = %g is not positive.\n", - pParam->BSIM4v6ndep)); - Fatal_Flag = 1; - } - if (pParam->BSIM4v6phi <= 0.0) - { - wl_append_word(&wl, &wl, tprintf("Fatal: Phi = %g is not positive. Please check Phin and Ndep\n", - pParam->BSIM4v6phi)); - wl_append_word(&wl, &wl, tprintf(" Phin = %g Ndep = %g \n", - pParam->BSIM4v6phin, pParam->BSIM4v6ndep)); - Fatal_Flag = 1; - } - if (pParam->BSIM4v6nsub <= 0.0) - { - wl_append_word(&wl, &wl, tprintf("Fatal: Nsub = %g is not positive.\n", - pParam->BSIM4v6nsub)); - Fatal_Flag = 1; - } - if (pParam->BSIM4v6ngate < 0.0) - { - wl_append_word(&wl, &wl, tprintf("Fatal: Ngate = %g Ngate is not positive.\n", - pParam->BSIM4v6ngate)); - Fatal_Flag = 1; - } - if (pParam->BSIM4v6ngate > 1.e25) - { - wl_append_word(&wl, &wl, tprintf("Fatal: Ngate = %g Ngate is too high\n", - pParam->BSIM4v6ngate)); - Fatal_Flag = 1; - } - if (pParam->BSIM4v6xj <= 0.0) - { - wl_append_word(&wl, &wl, tprintf("Fatal: Xj = %g is not positive.\n", pParam->BSIM4v6xj)); - Fatal_Flag = 1; - } - - if (pParam->BSIM4v6dvt1 < 0.0) - { - wl_append_word(&wl, &wl, tprintf("Fatal: Dvt1 = %g is negative.\n", pParam->BSIM4v6dvt1)); - Fatal_Flag = 1; - } - - if (pParam->BSIM4v6dvt1w < 0.0) - { - wl_append_word(&wl, &wl, tprintf("Fatal: Dvt1w = %g is negative.\n", pParam->BSIM4v6dvt1w)); - Fatal_Flag = 1; - } - - if (pParam->BSIM4v6w0 == -pParam->BSIM4v6weff) - { - wl_append_word(&wl, &wl, tprintf("Fatal: (W0 + Weff) = 0 causing divided-by-zero.\n")); - Fatal_Flag = 1; - } - - if (pParam->BSIM4v6dsub < 0.0) - { - wl_append_word(&wl, &wl, tprintf("Fatal: Dsub = %g is negative.\n", pParam->BSIM4v6dsub)); - Fatal_Flag = 1; - } - if (pParam->BSIM4v6b1 == -pParam->BSIM4v6weff) - { - wl_append_word(&wl, &wl, tprintf("Fatal: (B1 + Weff) = 0 causing divided-by-zero.\n")); - Fatal_Flag = 1; - } - if (here->BSIM4v6u0temp <= 0.0) - { - wl_append_word(&wl, &wl, tprintf("Fatal: u0 at current temperature = %g is not positive.\n", - here->BSIM4v6u0temp)); - Fatal_Flag = 1; - } - - if (pParam->BSIM4v6delta < 0.0) - { - wl_append_word(&wl, &wl, tprintf("Fatal: Delta = %g is less than zero.\n", pParam->BSIM4v6delta)); - Fatal_Flag = 1; - } - - if (here->BSIM4v6vsattemp <= 0.0) - { - wl_append_word(&wl, &wl, tprintf("Fatal: Vsat at current temperature = %g is not positive.\n", - here->BSIM4v6vsattemp)); - Fatal_Flag = 1; - } - - if (pParam->BSIM4v6pclm <= 0.0) - { - wl_append_word(&wl, &wl, tprintf("Fatal: Pclm = %g is not positive.\n", pParam->BSIM4v6pclm)); - Fatal_Flag = 1; - } - - if (pParam->BSIM4v6drout < 0.0) - { - wl_append_word(&wl, &wl, tprintf("Fatal: Drout = %g is negative.\n", pParam->BSIM4v6drout)); - Fatal_Flag = 1; - } - - if (here->BSIM4v6m <= 0.0) - { - wl_append_word(&wl, &wl, tprintf("Fatal: multiplier = %g is not positive.\n", here->BSIM4v6m)); - Fatal_Flag = 1; - } - if (here->BSIM4v6nf < 1.0) - { - wl_append_word(&wl, &wl, tprintf("Fatal: Number of finger = %g is smaller than one.\n", here->BSIM4v6nf)); - Fatal_Flag = 1; - } - - if ((here->BSIM4v6sa > 0.0) && (here->BSIM4v6sb > 0.0) && - ((here->BSIM4v6nf == 1.0) || ((here->BSIM4v6nf > 1.0) && (here->BSIM4v6sd > 0.0)))) - { - if (model->BSIM4v6saref <= 0.0) - { - wl_append_word(&wl, &wl, tprintf("Fatal: SAref = %g is not positive.\n", model->BSIM4v6saref)); - Fatal_Flag = 1; - } - if (model->BSIM4v6sbref <= 0.0) - { - wl_append_word(&wl, &wl, tprintf("Fatal: SBref = %g is not positive.\n", model->BSIM4v6sbref)); - Fatal_Flag = 1; - } - } - - if ((here->BSIM4v6l + model->BSIM4v6xl) <= model->BSIM4v6xgl) - { - wl_append_word(&wl, &wl, tprintf("Fatal: The parameter xgl must be smaller than Ldrawn+XL.\n")); - Fatal_Flag = 1; - } - if (here->BSIM4v6ngcon < 1.0) - { - wl_append_word(&wl, &wl, tprintf("Fatal: The parameter ngcon cannot be smaller than one.\n")); - Fatal_Flag = 1; - } - if ((here->BSIM4v6ngcon != 1.0) && (here->BSIM4v6ngcon != 2.0)) - { - here->BSIM4v6ngcon = 1.0; - wl_append_word(&wl, &wl, tprintf("Warning: Ngcon must be equal to one or two; reset to 1.0.\n")); - } - - if (model->BSIM4v6gbmin < 1.0e-20) - { - wl_append_word(&wl, &wl, tprintf("Warning: Gbmin = %g is too small.\n", model->BSIM4v6gbmin)); - } - - /* Check saturation parameters */ - if (pParam->BSIM4v6fprout < 0.0) - { - wl_append_word(&wl, &wl, tprintf("Fatal: fprout = %g is negative.\n", pParam->BSIM4v6fprout)); - Fatal_Flag = 1; - } - if (pParam->BSIM4v6pdits < 0.0) - { - wl_append_word(&wl, &wl, tprintf("Fatal: pdits = %g is negative.\n", pParam->BSIM4v6pdits)); - Fatal_Flag = 1; - } - if (model->BSIM4v6pditsl < 0.0) - { - wl_append_word(&wl, &wl, tprintf("Fatal: pditsl = %g is negative.\n", model->BSIM4v6pditsl)); - Fatal_Flag = 1; - } - - /* Check gate current parameters */ - if (model->BSIM4v6igbMod) { - if (pParam->BSIM4v6nigbinv <= 0.0) - { - wl_append_word(&wl, &wl, tprintf("Fatal: nigbinv = %g is non-positive.\n", pParam->BSIM4v6nigbinv)); - Fatal_Flag = 1; - } - if (pParam->BSIM4v6nigbacc <= 0.0) - { - wl_append_word(&wl, &wl, tprintf("Fatal: nigbacc = %g is non-positive.\n", pParam->BSIM4v6nigbacc)); - Fatal_Flag = 1; - } - } - if (model->BSIM4v6igcMod) { - if (pParam->BSIM4v6nigc <= 0.0) - { - wl_append_word(&wl, &wl, tprintf("Fatal: nigc = %g is non-positive.\n", pParam->BSIM4v6nigc)); - Fatal_Flag = 1; - } - if (pParam->BSIM4v6poxedge <= 0.0) - { - wl_append_word(&wl, &wl, tprintf("Fatal: poxedge = %g is non-positive.\n", pParam->BSIM4v6poxedge)); - Fatal_Flag = 1; - } - if (pParam->BSIM4v6pigcd <= 0.0) - { - wl_append_word(&wl, &wl, tprintf("Fatal: pigcd = %g is non-positive.\n", pParam->BSIM4v6pigcd)); - Fatal_Flag = 1; - } - } - - /* Check capacitance parameters */ - if (pParam->BSIM4v6clc < 0.0) - { - wl_append_word(&wl, &wl, tprintf("Fatal: Clc = %g is negative.\n", pParam->BSIM4v6clc)); - Fatal_Flag = 1; - } - - /* Check overlap capacitance parameters */ - if (pParam->BSIM4v6ckappas < 0.02) - { - wl_append_word(&wl, &wl, tprintf("Warning: ckappas = %g is too small.\n", pParam->BSIM4v6ckappas)); - pParam->BSIM4v6ckappas = 0.02; - } - if (pParam->BSIM4v6ckappad < 0.02) - { - wl_append_word(&wl, &wl, tprintf("Warning: ckappad = %g is too small.\n", pParam->BSIM4v6ckappad)); - pParam->BSIM4v6ckappad = 0.02; - } - - if (model->BSIM4v6vtss < 0.0) - { - wl_append_word(&wl, &wl, tprintf("Fatal: Vtss = %g is negative.\n", - model->BSIM4v6vtss)); - Fatal_Flag = 1; - } - if (model->BSIM4v6vtsd < 0.0) - { - wl_append_word(&wl, &wl, tprintf("Fatal: Vtsd = %g is negative.\n", - model->BSIM4v6vtsd)); - Fatal_Flag = 1; - } - if (model->BSIM4v6vtssws < 0.0) - { - wl_append_word(&wl, &wl, tprintf("Fatal: Vtssws = %g is negative.\n", - model->BSIM4v6vtssws)); - Fatal_Flag = 1; - } - if (model->BSIM4v6vtsswd < 0.0) - { - wl_append_word(&wl, &wl, tprintf("Fatal: Vtsswd = %g is negative.\n", - model->BSIM4v6vtsswd)); - Fatal_Flag = 1; - } - if (model->BSIM4v6vtsswgs < 0.0) - { - wl_append_word(&wl, &wl, tprintf("Fatal: Vtsswgs = %g is negative.\n", - model->BSIM4v6vtsswgs)); - Fatal_Flag = 1; - } - if (model->BSIM4v6vtsswgd < 0.0) - { - wl_append_word(&wl, &wl, tprintf("Fatal: Vtsswgd = %g is negative.\n", - model->BSIM4v6vtsswgd)); - Fatal_Flag = 1; - } - - - if (model->BSIM4v6paramChk == 1) - { - /* Check L and W parameters */ - if (pParam->BSIM4v6leff <= 1.0e-9) - { - wl_append_word(&wl, &wl, tprintf("Warning: Leff = %g <= 1.0e-9. Recommended Leff >= 1e-8 \n", - pParam->BSIM4v6leff)); - } - - if (pParam->BSIM4v6leffCV <= 1.0e-9) - { - wl_append_word(&wl, &wl, tprintf("Warning: Leff for CV = %g <= 1.0e-9. Recommended LeffCV >=1e-8 \n", - pParam->BSIM4v6leffCV)); - } - - if (pParam->BSIM4v6weff <= 1.0e-9) - { - wl_append_word(&wl, &wl, tprintf("Warning: Weff = %g <= 1.0e-9. Recommended Weff >=1e-7 \n", - pParam->BSIM4v6weff)); - } - - if (pParam->BSIM4v6weffCV <= 1.0e-9) - { - wl_append_word(&wl, &wl, tprintf("Warning: Weff for CV = %g <= 1.0e-9. Recommended WeffCV >= 1e-7 \n", - pParam->BSIM4v6weffCV)); - } - - /* Check threshold voltage parameters */ - if (model->BSIM4v6toxe < 1.0e-10) - { - wl_append_word(&wl, &wl, tprintf("Warning: Toxe = %g is less than 1A. Recommended Toxe >= 5A\n", model->BSIM4v6toxe)); - } - if (model->BSIM4v6toxp < 1.0e-10) - { - wl_append_word(&wl, &wl, tprintf("Warning: Toxp = %g is less than 1A. Recommended Toxp >= 5A\n", model->BSIM4v6toxp)); - } - if (model->BSIM4v6toxm < 1.0e-10) - { - wl_append_word(&wl, &wl, tprintf("Warning: Toxm = %g is less than 1A. Recommended Toxm >= 5A\n", model->BSIM4v6toxm)); - } - - if (pParam->BSIM4v6ndep <= 1.0e12) - { - wl_append_word(&wl, &wl, tprintf("Warning: Ndep = %g may be too small.\n", - pParam->BSIM4v6ndep)); - } - else if (pParam->BSIM4v6ndep >= 1.0e21) - { - wl_append_word(&wl, &wl, tprintf("Warning: Ndep = %g may be too large.\n", - pParam->BSIM4v6ndep)); - } - - if (pParam->BSIM4v6nsub <= 1.0e14) - { - wl_append_word(&wl, &wl, tprintf("Warning: Nsub = %g may be too small.\n", - pParam->BSIM4v6nsub)); - } - else if (pParam->BSIM4v6nsub >= 1.0e21) - { - wl_append_word(&wl, &wl, tprintf("Warning: Nsub = %g may be too large.\n", - pParam->BSIM4v6nsub)); - } - - if ((pParam->BSIM4v6ngate > 0.0) && - (pParam->BSIM4v6ngate <= 1.e18)) - { - wl_append_word(&wl, &wl, tprintf("Warning: Ngate = %g is less than 1.E18cm^-3.\n", - pParam->BSIM4v6ngate)); - } - - if (pParam->BSIM4v6dvt0 < 0.0) - { - wl_append_word(&wl, &wl, tprintf("Warning: Dvt0 = %g is negative.\n", pParam->BSIM4v6dvt0)); - } - - if (fabs(1.0e-8 / (pParam->BSIM4v6w0 + pParam->BSIM4v6weff)) > 10.0) - { - wl_append_word(&wl, &wl, tprintf("Warning: (W0 + Weff) may be too small.\n")); - } - - /* Check subthreshold parameters */ - if (pParam->BSIM4v6nfactor < 0.0) - { - wl_append_word(&wl, &wl, tprintf("Warning: Nfactor = %g is negative.\n", pParam->BSIM4v6nfactor)); - } - if (pParam->BSIM4v6cdsc < 0.0) - { - wl_append_word(&wl, &wl, tprintf("Warning: Cdsc = %g is negative.\n", pParam->BSIM4v6cdsc)); - } - if (pParam->BSIM4v6cdscd < 0.0) - { - wl_append_word(&wl, &wl, tprintf("Warning: Cdscd = %g is negative.\n", pParam->BSIM4v6cdscd)); - } - /* Check DIBL parameters */ - if (here->BSIM4v6eta0 < 0.0) - { - wl_append_word(&wl, &wl, tprintf("Warning: Eta0 = %g is negative.\n", here->BSIM4v6eta0)); - } - - /* Check Abulk parameters */ - if (fabs(1.0e-8 / (pParam->BSIM4v6b1 + pParam->BSIM4v6weff)) > 10.0) - { - wl_append_word(&wl, &wl, tprintf("Warning: (B1 + Weff) may be too small.\n")); - } - - - /* Check Saturation parameters */ - if (pParam->BSIM4v6a2 < 0.01) - { - wl_append_word(&wl, &wl, tprintf("Warning: A2 = %g is too small. Set to 0.01.\n", - pParam->BSIM4v6a2)); - pParam->BSIM4v6a2 = 0.01; - } - else if (pParam->BSIM4v6a2 > 1.0) - { - wl_append_word(&wl, &wl, tprintf("Warning: A2 = %g is larger than 1. A2 is set to 1 and A1 is set to 0.\n", - pParam->BSIM4v6a2)); - pParam->BSIM4v6a2 = 1.0; - pParam->BSIM4v6a1 = 0.0; - } - - if (pParam->BSIM4v6prwg < 0.0) - { - wl_append_word(&wl, &wl, tprintf("Warning: Prwg = %g is negative. Set to zero.\n", - pParam->BSIM4v6prwg)); - pParam->BSIM4v6prwg = 0.0; - } - - if (pParam->BSIM4v6rdsw < 0.0) - { - wl_append_word(&wl, &wl, tprintf("Warning: Rdsw = %g is negative. Set to zero.\n", - pParam->BSIM4v6rdsw)); - pParam->BSIM4v6rdsw = 0.0; - pParam->BSIM4v6rds0 = 0.0; - } - - if (pParam->BSIM4v6rds0 < 0.0) - { - wl_append_word(&wl, &wl, tprintf("Warning: Rds at current temperature = %g is negative. Set to zero.\n", - pParam->BSIM4v6rds0)); - pParam->BSIM4v6rds0 = 0.0; - } - - if (pParam->BSIM4v6rdswmin < 0.0) - { - wl_append_word(&wl, &wl, tprintf("Warning: Rdswmin at current temperature = %g is negative. Set to zero.\n", - pParam->BSIM4v6rdswmin)); - pParam->BSIM4v6rdswmin = 0.0; - } - - if (pParam->BSIM4v6pscbe2 <= 0.0) - { - wl_append_word(&wl, &wl, tprintf("Warning: Pscbe2 = %g is not positive.\n", pParam->BSIM4v6pscbe2)); - } - - if (pParam->BSIM4v6vsattemp < 1.0e3) - { - wl_append_word(&wl, &wl, tprintf("Warning: Vsat at current temperature = %g may be too small.\n", pParam->BSIM4v6vsattemp)); - } - - if ((model->BSIM4v6lambdaGiven) && (pParam->BSIM4v6lambda > 0.0)) - { - if (pParam->BSIM4v6lambda > 1.0e-9) - { - wl_append_word(&wl, &wl, tprintf("Warning: Lambda = %g may be too large.\n", pParam->BSIM4v6lambda)); - } - } - - if ((model->BSIM4v6vtlGiven) && (pParam->BSIM4v6vtl > 0.0)) - { - if (pParam->BSIM4v6vtl < 6.0e4) - { - wl_append_word(&wl, &wl, tprintf("Warning: Thermal velocity vtl = %g may be too small.\n", pParam->BSIM4v6vtl)); - } - - if (pParam->BSIM4v6xn < 3.0) - { - wl_append_word(&wl, &wl, tprintf("Warning: back scattering coeff xn = %g is too small. Reset to 3.0 \n", pParam->BSIM4v6xn)); - pParam->BSIM4v6xn = 3.0; - } - - if (model->BSIM4v6lc < 0.0) - { - wl_append_word(&wl, &wl, tprintf("Warning: back scattering coeff lc = %g is too small. Reset to 0.0\n", model->BSIM4v6lc)); - pParam->BSIM4v6lc = 0.0; - } - } - - if (pParam->BSIM4v6pdibl1 < 0.0) - { - wl_append_word(&wl, &wl, tprintf("Warning: Pdibl1 = %g is negative.\n", pParam->BSIM4v6pdibl1)); - } - } - - if (pParam->BSIM4v6pdibl2 < 0.0) - { - wl_append_word(&wl, &wl, tprintf("Warning: Pdibl2 = %g is negative.\n", pParam->BSIM4v6pdibl2)); - } - - /* Check stress effect parameters */ - if ((here->BSIM4v6sa > 0.0) && (here->BSIM4v6sb > 0.0) && - ((here->BSIM4v6nf == 1.0) || ((here->BSIM4v6nf > 1.0) && (here->BSIM4v6sd > 0.0)))) - { - if (model->BSIM4v6lodk2 <= 0.0) - { - wl_append_word(&wl, &wl, tprintf("Warning: LODK2 = %g is not positive.\n", model->BSIM4v6lodk2)); - } - if (model->BSIM4v6lodeta0 <= 0.0) - { - wl_append_word(&wl, &wl, tprintf("Warning: LODETA0 = %g is not positive.\n", model->BSIM4v6lodeta0)); - } - } - - /* Check gate resistance parameters */ - if (here->BSIM4v6rgateMod == 1) - { - if (model->BSIM4v6rshg <= 0.0) - wl_append_word(&wl, &wl, tprintf("Warning: rshg should be positive for rgateMod = 1.\n")); - } - else if (here->BSIM4v6rgateMod == 2) - { - if (model->BSIM4v6rshg <= 0.0) - wl_append_word(&wl, &wl, tprintf("Warning: rshg <= 0.0 for rgateMod = 2.\n")); - else if (pParam->BSIM4v6xrcrg1 <= 0.0) - wl_append_word(&wl, &wl, tprintf("Warning: xrcrg1 <= 0.0 for rgateMod = 2.\n")); - } - if (here->BSIM4v6rgateMod == 3) - { - if (model->BSIM4v6rshg <= 0.0) - wl_append_word(&wl, &wl, tprintf("Warning: rshg should be positive for rgateMod = 3.\n")); - else if (pParam->BSIM4v6xrcrg1 <= 0.0) - wl_append_word(&wl, &wl, tprintf("Warning: xrcrg1 should be positive for rgateMod = 3.\n")); - } - - /* Check capacitance parameters */ - if (pParam->BSIM4v6noff < 0.1) - { - wl_append_word(&wl, &wl, tprintf("Warning: Noff = %g is too small.\n", pParam->BSIM4v6noff)); - } - - if (pParam->BSIM4v6voffcv < -0.5) - { - wl_append_word(&wl, &wl, tprintf("Warning: Voffcv = %g is too small.\n", pParam->BSIM4v6voffcv)); - } - - if (pParam->BSIM4v6moin < 5.0) - { - wl_append_word(&wl, &wl, tprintf("Warning: Moin = %g is too small.\n", pParam->BSIM4v6moin)); - } - if (pParam->BSIM4v6moin > 25.0) - { - wl_append_word(&wl, &wl, tprintf("Warning: Moin = %g is too large.\n", pParam->BSIM4v6moin)); - } - if (model->BSIM4v6capMod == 2) { - if (pParam->BSIM4v6acde < 0.1) - { - wl_append_word(&wl, &wl, tprintf("Warning: Acde = %g is too small.\n", pParam->BSIM4v6acde)); - } - if (pParam->BSIM4v6acde > 1.6) - { - wl_append_word(&wl, &wl, tprintf("Warning: Acde = %g is too large.\n", pParam->BSIM4v6acde)); - } - } - - /* Check overlap capacitance parameters */ - if (model->BSIM4v6cgdo < 0.0) - { - wl_append_word(&wl, &wl, tprintf("Warning: cgdo = %g is negative. Set to zero.\n", model->BSIM4v6cgdo)); - model->BSIM4v6cgdo = 0.0; - } - if (model->BSIM4v6cgso < 0.0) - { - wl_append_word(&wl, &wl, tprintf("Warning: cgso = %g is negative. Set to zero.\n", model->BSIM4v6cgso)); - model->BSIM4v6cgso = 0.0; - } - if (model->BSIM4v6cgbo < 0.0) - { - wl_append_word(&wl, &wl, tprintf("Warning: cgbo = %g is negative. Set to zero.\n", model->BSIM4v6cgbo)); - model->BSIM4v6cgbo = 0.0; - } - if (model->BSIM4v6tnoiMod == 1) { - if (model->BSIM4v6tnoia < 0.0) - { - wl_append_word(&wl, &wl, tprintf("Warning: tnoia = %g is negative. Set to zero.\n", model->BSIM4v6tnoia)); - model->BSIM4v6tnoia = 0.0; - } - if (model->BSIM4v6tnoib < 0.0) - { - wl_append_word(&wl, &wl, tprintf("Warning: tnoib = %g is negative. Set to zero.\n", model->BSIM4v6tnoib)); - model->BSIM4v6tnoib = 0.0; - } - - if (model->BSIM4v6rnoia < 0.0) - { - wl_append_word(&wl, &wl, tprintf("Warning: rnoia = %g is negative. Set to zero.\n", model->BSIM4v6rnoia)); - model->BSIM4v6rnoia = 0.0; - } - if (model->BSIM4v6rnoib < 0.0) - { - wl_append_word(&wl, &wl, tprintf("Warning: rnoib = %g is negative. Set to zero.\n", model->BSIM4v6rnoib)); - model->BSIM4v6rnoib = 0.0; - } - } - - if (model->BSIM4v6SjctEmissionCoeff < 0.0) - { - wl_append_word(&wl, &wl, tprintf("Warning: Njs = %g is negative.\n", - model->BSIM4v6SjctEmissionCoeff)); - } - if (model->BSIM4v6DjctEmissionCoeff < 0.0) - { - wl_append_word(&wl, &wl, tprintf("Warning: Njd = %g is negative.\n", - model->BSIM4v6DjctEmissionCoeff)); - } - if (model->BSIM4v6njts < 0.0) - { - wl_append_word(&wl, &wl, tprintf("Warning: Njts = %g is negative at temperature = %g.\n", - model->BSIM4v6njts, ckt->CKTtemp)); - } - if (model->BSIM4v6njtssw < 0.0) - { - wl_append_word(&wl, &wl, tprintf("Warning: Njtssw = %g is negative at temperature = %g.\n", - model->BSIM4v6njtssw, ckt->CKTtemp)); - } - if (model->BSIM4v6njtsswg < 0.0) - { - wl_append_word(&wl, &wl, tprintf("Warning: Njtsswg = %g is negative at temperature = %g.\n", - model->BSIM4v6njtsswg, ckt->CKTtemp)); - } - if (model->BSIM4v6njtsdGiven && model->BSIM4v6njtsdtemp < 0.0) - { - wl_append_word(&wl, &wl, tprintf("Warning: Njtsd = %g is negative at temperature = %g.\n", - model->BSIM4v6njtsdtemp, ckt->CKTtemp)); - } - if (model->BSIM4v6njtsswdGiven && model->BSIM4v6njtsswdtemp < 0.0) - { - wl_append_word(&wl, &wl, tprintf("Warning: Njtsswd = %g is negative at temperature = %g.\n", - model->BSIM4v6njtsswdtemp, ckt->CKTtemp)); - } - if (model->BSIM4v6njtsswgdGiven && model->BSIM4v6njtsswgdtemp < 0.0) - { - wl_append_word(&wl, &wl, tprintf("Warning: Njtsswgd = %g is negative at temperature = %g.\n", - model->BSIM4v6njtsswgdtemp, ckt->CKTtemp)); - } - - if (model->BSIM4v6ntnoi < 0.0) - { - wl_append_word(&wl, &wl, tprintf("Warning: ntnoi = %g is negative. Set to zero.\n", model->BSIM4v6ntnoi)); - model->BSIM4v6ntnoi = 0.0; - } - - /* diode model */ - if (model->BSIM4v6SbulkJctBotGradingCoeff >= 0.99) - { - wl_append_word(&wl, &wl, tprintf("Warning: MJS = %g is too big. Set to 0.99.\n", model->BSIM4v6SbulkJctBotGradingCoeff)); - model->BSIM4v6SbulkJctBotGradingCoeff = 0.99; - } - if (model->BSIM4v6SbulkJctSideGradingCoeff >= 0.99) - { - wl_append_word(&wl, &wl, tprintf("Warning: MJSWS = %g is too big. Set to 0.99.\n", model->BSIM4v6SbulkJctSideGradingCoeff)); - model->BSIM4v6SbulkJctSideGradingCoeff = 0.99; - } - if (model->BSIM4v6SbulkJctGateSideGradingCoeff >= 0.99) - { - wl_append_word(&wl, &wl, tprintf("Warning: MJSWGS = %g is too big. Set to 0.99.\n", model->BSIM4v6SbulkJctGateSideGradingCoeff)); - model->BSIM4v6SbulkJctGateSideGradingCoeff = 0.99; - } - - if (model->BSIM4v6DbulkJctBotGradingCoeff >= 0.99) - { - wl_append_word(&wl, &wl, tprintf("Warning: MJD = %g is too big. Set to 0.99.\n", model->BSIM4v6DbulkJctBotGradingCoeff)); - model->BSIM4v6DbulkJctBotGradingCoeff = 0.99; - } - if (model->BSIM4v6DbulkJctSideGradingCoeff >= 0.99) - { - wl_append_word(&wl, &wl, tprintf("Warning: MJSWD = %g is too big. Set to 0.99.\n", model->BSIM4v6DbulkJctSideGradingCoeff)); - model->BSIM4v6DbulkJctSideGradingCoeff = 0.99; - } - if (model->BSIM4v6DbulkJctGateSideGradingCoeff >= 0.99) - { - wl_append_word(&wl, &wl, tprintf("Warning: MJSWGD = %g is too big. Set to 0.99.\n", model->BSIM4v6DbulkJctGateSideGradingCoeff)); - model->BSIM4v6DbulkJctGateSideGradingCoeff = 0.99; - } - if (model->BSIM4v6wpemod == 1) - { - if (model->BSIM4v6scref <= 0.0) - { - wl_append_word(&wl, &wl, tprintf("Warning: SCREF = %g is not positive. Set to 1e-6.\n", model->BSIM4v6scref)); - model->BSIM4v6scref = 1e-6; - } - if (here->BSIM4v6sca < 0.0) - { - wl_append_word(&wl, &wl, tprintf("Warning: SCA = %g is negative. Set to 0.0.\n", here->BSIM4v6sca)); - here->BSIM4v6sca = 0.0; - } - if (here->BSIM4v6scb < 0.0) - { - wl_append_word(&wl, &wl, tprintf("Warning: SCB = %g is negative. Set to 0.0.\n", here->BSIM4v6scb)); - here->BSIM4v6scb = 0.0; - } - if (here->BSIM4v6scc < 0.0) - { - wl_append_word(&wl, &wl, tprintf("Warning: SCC = %g is negative. Set to 0.0.\n", here->BSIM4v6scc)); - here->BSIM4v6scc = 0.0; - } - if (here->BSIM4v6sc < 0.0) - { - wl_append_word(&wl, &wl, tprintf("Warning: SC = %g is negative. Set to 0.0.\n", here->BSIM4v6sc)); - here->BSIM4v6sc = 0.0; - } - } - - if (wlstart->wl_next) { - if ((fplog = fopen("bsim4v6.out", "w")) != NULL) { - while (wlstart) { - fprintf(fplog, "%s", wlstart->wl_word); - fprintf(stderr, "%s", wlstart->wl_word); - wlstart = wlstart->wl_next; - } - fclose(fplog); - } - else { - while (wlstart) { - fprintf(stderr, "%s", wlstart->wl_word); - wlstart = wlstart->wl_next; - } - } - } - - wl_free(wlstart); - - if ((strcmp(model->BSIM4v6version, "4.6.5")) && (strncmp(model->BSIM4v6version, "4.60", 4)) && (strncmp(model->BSIM4v6version, "4.6", 3))) - { - printf("Warning: This model is BSIM4.6.5; you specified a wrong version number '%s'.\n", model->BSIM4v6version); - } - - return(Fatal_Flag); -} - diff --git a/src/spicelib/devices/bsim4v6/b4v6cvtest.c b/src/spicelib/devices/bsim4v6/b4v6cvtest.c deleted file mode 100644 index 765ce4e2e..000000000 --- a/src/spicelib/devices/bsim4v6/b4v6cvtest.c +++ /dev/null @@ -1,200 +0,0 @@ -/**** BSIM4.6.2 Released by Wenwei Yang 04/05/2008 ****/ - -/********** - * Copyright 2006 Regents of the University of California. All rights reserved. - * File: b4cvtest.c of BSIM4.6.2. - * Author: 2000 Weidong Liu - * Authors: 2001- Xuemei Xi, Mohan Dunga, Ali Niknejad, Chenming Hu. - * Authors: 2006- Mohan Dunga, Ali Niknejad, Chenming Hu - * Authors: 2007- Mohan Dunga, Wenwei Yang, Ali Niknejad, Chenming Hu - * Project Director: Prof. Chenming Hu. - * Modified by Xuemei Xi, 04/06/2001. - * Modified by Xuemei Xi, 10/05/2001. - * Modified by Xuemei Xi, 05/09/2003. - **********/ - -#include "ngspice/ngspice.h" -#include "ngspice/cktdefs.h" -#include "bsim4v6def.h" -#include "ngspice/trandefs.h" -#include "ngspice/const.h" -#include "ngspice/devdefs.h" -#include "ngspice/sperror.h" -#include "ngspice/suffix.h" - - -int -BSIM4v6convTest( -GENmodel *inModel, -CKTcircuit *ckt) -{ -BSIM4v6model *model = (BSIM4v6model*)inModel; -BSIM4v6instance *here; -double delvbd, delvbs, delvds, delvgd, delvgs; -double delvdbd, delvsbs; -double delvbd_jct, delvbs_jct; -double vds, vgs, vgd, vgdo, vbs, vbd; -double vdbd, vdbs, vsbs; -double cbhat, cdhat, Idtot, Ibtot; -double vses, vdes, vdedo, delvses, delvded, delvdes; -double Isestot, cseshat, Idedtot, cdedhat; -double Igstot, cgshat, Igdtot, cgdhat, Igbtot, cgbhat; -double tol0, tol1, tol2, tol3, tol4, tol5, tol6; - - for (; model != NULL; model = BSIM4v6nextModel(model)) - { for (here = BSIM4v6instances(model); here != NULL ; - here=BSIM4v6nextInstance(here)) - { - vds = model->BSIM4v6type - * (*(ckt->CKTrhsOld + here->BSIM4v6dNodePrime) - - *(ckt->CKTrhsOld + here->BSIM4v6sNodePrime)); - vgs = model->BSIM4v6type - * (*(ckt->CKTrhsOld + here->BSIM4v6gNodePrime) - - *(ckt->CKTrhsOld + here->BSIM4v6sNodePrime)); - vbs = model->BSIM4v6type - * (*(ckt->CKTrhsOld + here->BSIM4v6bNodePrime) - - *(ckt->CKTrhsOld + here->BSIM4v6sNodePrime)); - vdbs = model->BSIM4v6type - * (*(ckt->CKTrhsOld + here->BSIM4v6dbNode) - - *(ckt->CKTrhsOld + here->BSIM4v6sNodePrime)); - vsbs = model->BSIM4v6type - * (*(ckt->CKTrhsOld + here->BSIM4v6sbNode) - - *(ckt->CKTrhsOld + here->BSIM4v6sNodePrime)); - vses = model->BSIM4v6type - * (*(ckt->CKTrhsOld + here->BSIM4v6sNode) - - *(ckt->CKTrhsOld + here->BSIM4v6sNodePrime)); - vdes = model->BSIM4v6type - * (*(ckt->CKTrhsOld + here->BSIM4v6dNode) - - *(ckt->CKTrhsOld + here->BSIM4v6sNodePrime)); - - vgdo = *(ckt->CKTstate0 + here->BSIM4v6vgs) - - *(ckt->CKTstate0 + here->BSIM4v6vds); - vbd = vbs - vds; - vdbd = vdbs - vds; - vgd = vgs - vds; - - delvbd = vbd - *(ckt->CKTstate0 + here->BSIM4v6vbd); - delvdbd = vdbd - *(ckt->CKTstate0 + here->BSIM4v6vdbd); - delvgd = vgd - vgdo; - - delvds = vds - *(ckt->CKTstate0 + here->BSIM4v6vds); - delvgs = vgs - *(ckt->CKTstate0 + here->BSIM4v6vgs); - delvbs = vbs - *(ckt->CKTstate0 + here->BSIM4v6vbs); - delvsbs = vsbs - *(ckt->CKTstate0 + here->BSIM4v6vsbs); - - delvses = vses - (*(ckt->CKTstate0 + here->BSIM4v6vses)); - vdedo = *(ckt->CKTstate0 + here->BSIM4v6vdes) - - *(ckt->CKTstate0 + here->BSIM4v6vds); - delvdes = vdes - *(ckt->CKTstate0 + here->BSIM4v6vdes); - delvded = vdes - vds - vdedo; - - delvbd_jct = (!here->BSIM4v6rbodyMod) ? delvbd : delvdbd; - delvbs_jct = (!here->BSIM4v6rbodyMod) ? delvbs : delvsbs; - - if (here->BSIM4v6mode >= 0) - { Idtot = here->BSIM4v6cd + here->BSIM4v6csub - here->BSIM4v6cbd - + here->BSIM4v6Igidl; - cdhat = Idtot - here->BSIM4v6gbd * delvbd_jct - + (here->BSIM4v6gmbs + here->BSIM4v6gbbs + here->BSIM4v6ggidlb) * delvbs - + (here->BSIM4v6gm + here->BSIM4v6gbgs + here->BSIM4v6ggidlg) * delvgs - + (here->BSIM4v6gds + here->BSIM4v6gbds + here->BSIM4v6ggidld) * delvds; - - Igstot = here->BSIM4v6Igs + here->BSIM4v6Igcs; - cgshat = Igstot + (here->BSIM4v6gIgsg + here->BSIM4v6gIgcsg) * delvgs - + here->BSIM4v6gIgcsd * delvds + here->BSIM4v6gIgcsb * delvbs; - - Igdtot = here->BSIM4v6Igd + here->BSIM4v6Igcd; - cgdhat = Igdtot + here->BSIM4v6gIgdg * delvgd + here->BSIM4v6gIgcdg * delvgs - + here->BSIM4v6gIgcdd * delvds + here->BSIM4v6gIgcdb * delvbs; - - Igbtot = here->BSIM4v6Igb; - cgbhat = here->BSIM4v6Igb + here->BSIM4v6gIgbg * delvgs + here->BSIM4v6gIgbd - * delvds + here->BSIM4v6gIgbb * delvbs; - } - else - { Idtot = here->BSIM4v6cd + here->BSIM4v6cbd - here->BSIM4v6Igidl; /* bugfix */ - cdhat = Idtot + here->BSIM4v6gbd * delvbd_jct + here->BSIM4v6gmbs - * delvbd + here->BSIM4v6gm * delvgd - - (here->BSIM4v6gds + here->BSIM4v6ggidls) * delvds - - here->BSIM4v6ggidlg * delvgs - here->BSIM4v6ggidlb * delvbs; - - Igstot = here->BSIM4v6Igs + here->BSIM4v6Igcd; - cgshat = Igstot + here->BSIM4v6gIgsg * delvgs + here->BSIM4v6gIgcdg * delvgd - - here->BSIM4v6gIgcdd * delvds + here->BSIM4v6gIgcdb * delvbd; - - Igdtot = here->BSIM4v6Igd + here->BSIM4v6Igcs; - cgdhat = Igdtot + (here->BSIM4v6gIgdg + here->BSIM4v6gIgcsg) * delvgd - - here->BSIM4v6gIgcsd * delvds + here->BSIM4v6gIgcsb * delvbd; - - Igbtot = here->BSIM4v6Igb; - cgbhat = here->BSIM4v6Igb + here->BSIM4v6gIgbg * delvgd - here->BSIM4v6gIgbd - * delvds + here->BSIM4v6gIgbb * delvbd; - } - - Isestot = here->BSIM4v6gstot * (*(ckt->CKTstate0 + here->BSIM4v6vses)); - cseshat = Isestot + here->BSIM4v6gstot * delvses - + here->BSIM4v6gstotd * delvds + here->BSIM4v6gstotg * delvgs - + here->BSIM4v6gstotb * delvbs; - - Idedtot = here->BSIM4v6gdtot * vdedo; - cdedhat = Idedtot + here->BSIM4v6gdtot * delvded - + here->BSIM4v6gdtotd * delvds + here->BSIM4v6gdtotg * delvgs - + here->BSIM4v6gdtotb * delvbs; - - /* - * Check convergence - */ - - if ((here->BSIM4v6off == 0) || (!(ckt->CKTmode & MODEINITFIX))) - { tol0 = ckt->CKTreltol * MAX(fabs(cdhat), fabs(Idtot)) - + ckt->CKTabstol; - tol1 = ckt->CKTreltol * MAX(fabs(cseshat), fabs(Isestot)) - + ckt->CKTabstol; - tol2 = ckt->CKTreltol * MAX(fabs(cdedhat), fabs(Idedtot)) - + ckt->CKTabstol; - tol3 = ckt->CKTreltol * MAX(fabs(cgshat), fabs(Igstot)) - + ckt->CKTabstol; - tol4 = ckt->CKTreltol * MAX(fabs(cgdhat), fabs(Igdtot)) - + ckt->CKTabstol; - tol5 = ckt->CKTreltol * MAX(fabs(cgbhat), fabs(Igbtot)) - + ckt->CKTabstol; - - if ((fabs(cdhat - Idtot) >= tol0) || (fabs(cseshat - Isestot) >= tol1) - || (fabs(cdedhat - Idedtot) >= tol2)) - { ckt->CKTnoncon++; - return(OK); - } - - if ((fabs(cgshat - Igstot) >= tol3) || (fabs(cgdhat - Igdtot) >= tol4) - || (fabs(cgbhat - Igbtot) >= tol5)) - { ckt->CKTnoncon++; - return(OK); - } - - Ibtot = here->BSIM4v6cbs + here->BSIM4v6cbd - - here->BSIM4v6Igidl - here->BSIM4v6Igisl - here->BSIM4v6csub; - if (here->BSIM4v6mode >= 0) - { cbhat = Ibtot + here->BSIM4v6gbd * delvbd_jct - + here->BSIM4v6gbs * delvbs_jct - (here->BSIM4v6gbbs + here->BSIM4v6ggidlb) - * delvbs - (here->BSIM4v6gbgs + here->BSIM4v6ggidlg) * delvgs - - (here->BSIM4v6gbds + here->BSIM4v6ggidld) * delvds - - here->BSIM4v6ggislg * delvgd - here->BSIM4v6ggislb* delvbd + here->BSIM4v6ggisls * delvds ; - } - else - { cbhat = Ibtot + here->BSIM4v6gbs * delvbs_jct + here->BSIM4v6gbd - * delvbd_jct - (here->BSIM4v6gbbs + here->BSIM4v6ggislb) * delvbd - - (here->BSIM4v6gbgs + here->BSIM4v6ggislg) * delvgd - + (here->BSIM4v6gbds + here->BSIM4v6ggisld - here->BSIM4v6ggidls) * delvds - - here->BSIM4v6ggidlg * delvgs - here->BSIM4v6ggidlb * delvbs; - } - tol6 = ckt->CKTreltol * MAX(fabs(cbhat), - fabs(Ibtot)) + ckt->CKTabstol; - if (fabs(cbhat - Ibtot) > tol6) - { ckt->CKTnoncon++; - return(OK); - } - } - } - } - return(OK); -} diff --git a/src/spicelib/devices/bsim4v6/b4v6geo.c b/src/spicelib/devices/bsim4v6/b4v6geo.c deleted file mode 100644 index 3c888af8a..000000000 --- a/src/spicelib/devices/bsim4v6/b4v6geo.c +++ /dev/null @@ -1,379 +0,0 @@ -/**** BSIM4.6.2 Released by Wenwei Yang 07/31/2008 ****/ - -/********** - * Copyright 2006 Regents of the University of California. All rights reserved. - * File: b4geo.c of BSIM4.6.2. - * Author: 2000 Weidong Liu - * Authors: 2001- Xuemei Xi, Mohan Dunga, Ali Niknejad, Chenming Hu. - * Authors: 2006- Mohan Dunga, Ali Niknejad, Chenming Hu - * Authors: 2007- Mohan Dunga, Wenwei Yang, Ali Niknejad, Chenming Hu - * Project Director: Prof. Chenming Hu. - **********/ - -#include "ngspice/ngspice.h" -#include "bsim4v6def.h" - -/* - * WDLiu: - * This subrutine is a special module to process the geometry dependent - * parasitics for BSIM4v6, which calculates Ps, Pd, As, Ad, and Rs and Rd - * for multi-fingers and varous GEO and RGEO options. - */ - -int -BSIM4v6RdsEndIso(double, double, double, double, double, double, int, int, double *); -int -BSIM4v6RdsEndSha(double, double, double, double, double, double, int, int, double *); - -static int -BSIM4v6NumFingerDiff(double nf, int minSD, double *nuIntD, double *nuEndD, double *nuIntS, double *nuEndS) -{ -int NF; - NF = (int)nf; - if ((NF%2) != 0) - { *nuEndD = *nuEndS = 1.0; - *nuIntD = *nuIntS = 2.0 * MAX((nf - 1.0) / 2.0, 0.0); - } - else - { if (minSD == 1) /* minimize # of source */ - { *nuEndD = 2.0; - *nuIntD = 2.0 * MAX((nf / 2.0 - 1.0), 0.0); - *nuEndS = 0.0; - *nuIntS = nf; - } - else - { *nuEndD = 0.0; - *nuIntD = nf; - *nuEndS = 2.0; - *nuIntS = 2.0 * MAX((nf / 2.0 - 1.0), 0.0); - } - } -return 0; -} - - -int -BSIM4v6PAeffGeo(double nf, int geo, int minSD, double Weffcj, double DMCG, double DMCI, double DMDG, double *Ps, double *Pd, double *As, double *Ad) -{ -double T0, T1, T2; -double ADiso, ADsha, ADmer, ASiso, ASsha, ASmer; -double PDiso, PDsha, PDmer, PSiso, PSsha, PSmer; -double nuIntD = 0.0, nuEndD = 0.0, nuIntS = 0.0, nuEndS = 0.0; - - if (geo < 9) /* For geo = 9 and 10, the numbers of S/D diffusions already known */ - BSIM4v6NumFingerDiff(nf, minSD, &nuIntD, &nuEndD, &nuIntS, &nuEndS); - - T0 = DMCG + DMCI; - T1 = DMCG + DMCG; - T2 = DMDG + DMDG; - - PSiso = PDiso = T0 + T0 + Weffcj; - PSsha = PDsha = T1; - PSmer = PDmer = T2; - - ASiso = ADiso = T0 * Weffcj; - ASsha = ADsha = DMCG * Weffcj; - ASmer = ADmer = DMDG * Weffcj; - - switch(geo) - { case 0: - *Ps = nuEndS * PSiso + nuIntS * PSsha; - *Pd = nuEndD * PDiso + nuIntD * PDsha; - *As = nuEndS * ASiso + nuIntS * ASsha; - *Ad = nuEndD * ADiso + nuIntD * ADsha; - break; - case 1: - *Ps = nuEndS * PSiso + nuIntS * PSsha; - *Pd = (nuEndD + nuIntD) * PDsha; - *As = nuEndS * ASiso + nuIntS * ASsha; - *Ad = (nuEndD + nuIntD) * ADsha; - break; - case 2: - *Ps = (nuEndS + nuIntS) * PSsha; - *Pd = nuEndD * PDiso + nuIntD * PDsha; - *As = (nuEndS + nuIntS) * ASsha; - *Ad = nuEndD * ADiso + nuIntD * ADsha; - break; - case 3: - *Ps = (nuEndS + nuIntS) * PSsha; - *Pd = (nuEndD + nuIntD) * PDsha; - *As = (nuEndS + nuIntS) * ASsha; - *Ad = (nuEndD + nuIntD) * ADsha; - break; - case 4: - *Ps = nuEndS * PSiso + nuIntS * PSsha; - *Pd = nuEndD * PDmer + nuIntD * PDsha; - *As = nuEndS * ASiso + nuIntS * ASsha; - *Ad = nuEndD * ADmer + nuIntD * ADsha; - break; - case 5: - *Ps = (nuEndS + nuIntS) * PSsha; - *Pd = nuEndD * PDmer + nuIntD * PDsha; - *As = (nuEndS + nuIntS) * ASsha; - *Ad = nuEndD * ADmer + nuIntD * ADsha; - break; - case 6: - *Ps = nuEndS * PSmer + nuIntS * PSsha; - *Pd = nuEndD * PDiso + nuIntD * PDsha; - *As = nuEndS * ASmer + nuIntS * ASsha; - *Ad = nuEndD * ADiso + nuIntD * ADsha; - break; - case 7: - *Ps = nuEndS * PSmer + nuIntS * PSsha; - *Pd = (nuEndD + nuIntD) * PDsha; - *As = nuEndS * ASmer + nuIntS * ASsha; - *Ad = (nuEndD + nuIntD) * ADsha; - break; - case 8: - *Ps = nuEndS * PSmer + nuIntS * PSsha; - *Pd = nuEndD * PDmer + nuIntD * PDsha; - *As = nuEndS * ASmer + nuIntS * ASsha; - *Ad = nuEndD * ADmer + nuIntD * ADsha; - break; - case 9: /* geo = 9 and 10 happen only when nf = even */ - *Ps = PSiso + (nf - 1.0) * PSsha; - *Pd = nf * PDsha; - *As = ASiso + (nf - 1.0) * ASsha; - *Ad = nf * ADsha; - break; - case 10: - *Ps = nf * PSsha; - *Pd = PDiso + (nf - 1.0) * PDsha; - *As = nf * ASsha; - *Ad = ADiso + (nf - 1.0) * ADsha; - break; - default: - printf("Warning: Specified GEO = %d not matched\n", geo); - } -return 0; -} - - -int -BSIM4v6RdseffGeo(double nf, int geo, int rgeo, int minSD, double Weffcj, double Rsh, double DMCG, double DMCI, double DMDG, int Type, double *Rtot) -{ -double Rint = 0.0, Rend = 0.0; -double nuIntD = 0.0, nuEndD = 0.0, nuIntS = 0.0, nuEndS = 0.0; - - if (geo < 9) /* since geo = 9 and 10 only happen when nf = even */ - { BSIM4v6NumFingerDiff(nf, minSD, &nuIntD, &nuEndD, &nuIntS, &nuEndS); - - /* Internal S/D resistance -- assume shared S or D and all wide contacts */ - if (Type == 1) - { if (nuIntS == 0.0) - Rint = 0.0; - else - Rint = Rsh * DMCG / ( Weffcj * nuIntS); - } - else - { if (nuIntD == 0.0) - Rint = 0.0; - else - Rint = Rsh * DMCG / ( Weffcj * nuIntD); - } - } - - /* End S/D resistance -- geo dependent */ - switch(geo) - { case 0: - if (Type == 1) BSIM4v6RdsEndIso(Weffcj, Rsh, DMCG, DMCI, DMDG, - nuEndS, rgeo, 1, &Rend); - else BSIM4v6RdsEndIso(Weffcj, Rsh, DMCG, DMCI, DMDG, - nuEndD, rgeo, 0, &Rend); - break; - case 1: - if (Type == 1) BSIM4v6RdsEndIso(Weffcj, Rsh, DMCG, DMCI, DMDG, - nuEndS, rgeo, 1, &Rend); - else BSIM4v6RdsEndSha(Weffcj, Rsh, DMCG, DMCI, DMDG, - nuEndD, rgeo, 0, &Rend); - break; - case 2: - if (Type == 1) BSIM4v6RdsEndSha(Weffcj, Rsh, DMCG, DMCI, DMDG, - nuEndS, rgeo, 1, &Rend); - else BSIM4v6RdsEndIso(Weffcj, Rsh, DMCG, DMCI, DMDG, - nuEndD, rgeo, 0, &Rend); - break; - case 3: - if (Type == 1) BSIM4v6RdsEndSha(Weffcj, Rsh, DMCG, DMCI, DMDG, - nuEndS, rgeo, 1, &Rend); - else BSIM4v6RdsEndSha(Weffcj, Rsh, DMCG, DMCI, DMDG, - nuEndD, rgeo, 0, &Rend); - break; - case 4: - if (Type == 1) BSIM4v6RdsEndIso(Weffcj, Rsh, DMCG, DMCI, DMDG, - nuEndS, rgeo, 1, &Rend); - else Rend = Rsh * DMDG / Weffcj; - break; - case 5: - if (Type == 1) BSIM4v6RdsEndSha(Weffcj, Rsh, DMCG, DMCI, DMDG, - nuEndS, rgeo, 1, &Rend); - else Rend = Rsh * DMDG / (Weffcj * nuEndD); - break; - case 6: - if (Type == 1) Rend = Rsh * DMDG / Weffcj; - else BSIM4v6RdsEndIso(Weffcj, Rsh, DMCG, DMCI, DMDG, - nuEndD, rgeo, 0, &Rend); - break; - case 7: - if (Type == 1) Rend = Rsh * DMDG / (Weffcj * nuEndS); - else BSIM4v6RdsEndSha(Weffcj, Rsh, DMCG, DMCI, DMDG, - nuEndD, rgeo, 0, &Rend); - break; - case 8: - Rend = Rsh * DMDG / Weffcj; - break; - case 9: /* all wide contacts assumed for geo = 9 and 10 */ - if (Type == 1) - { Rend = 0.5 * Rsh * DMCG / Weffcj; - if (nf == 2.0) - Rint = 0.0; - else - Rint = Rsh * DMCG / (Weffcj * (nf - 2.0)); - } - else - { Rend = 0.0; - Rint = Rsh * DMCG / (Weffcj * nf); - } - break; - case 10: - if (Type == 1) - { Rend = 0.0; - Rint = Rsh * DMCG / (Weffcj * nf); - } - else - { Rend = 0.5 * Rsh * DMCG / Weffcj;; - if (nf == 2.0) - Rint = 0.0; - else - Rint = Rsh * DMCG / (Weffcj * (nf - 2.0)); - } - break; - default: - printf("Warning: Specified GEO = %d not matched\n", geo); - } - - if (Rint <= 0.0) - *Rtot = Rend; - else if (Rend <= 0.0) - *Rtot = Rint; - else - *Rtot = Rint * Rend / (Rint + Rend); -if(*Rtot==0.0) - printf("Warning: Zero resistance returned from RdseffGeo\n"); -return 0; -} - - -int -BSIM4v6RdsEndIso(double Weffcj, double Rsh, double DMCG, double DMCI, double DMDG, double nuEnd, int rgeo, int Type, double *Rend) -{ - NG_IGNORE(DMDG); - - if (Type == 1) - { switch(rgeo) - { case 1: - case 2: - case 5: - if (nuEnd == 0.0) - *Rend = 0.0; - else - *Rend = Rsh * DMCG / (Weffcj * nuEnd); - break; - case 3: - case 4: - case 6: - if ((DMCG + DMCI) == 0.0) - printf("(DMCG + DMCI) can not be equal to zero\n"); - if ((nuEnd == 0.0)||((DMCG+DMCI)==0.0)) - *Rend = 0.0; - else - *Rend = Rsh * Weffcj / (3.0 * nuEnd * (DMCG + DMCI)); - break; - default: - printf("Warning: Specified RGEO = %d not matched\n", rgeo); - } - } - else - { switch(rgeo) - { case 1: - case 3: - case 7: - if (nuEnd == 0.0) - *Rend = 0.0; - else - *Rend = Rsh * DMCG / (Weffcj * nuEnd); - break; - case 2: - case 4: - case 8: - if ((DMCG + DMCI) == 0.0) - printf("(DMCG + DMCI) can not be equal to zero\n"); - if ((nuEnd == 0.0)||((DMCG + DMCI)==0.0)) - *Rend = 0.0; - else - *Rend = Rsh * Weffcj / (3.0 * nuEnd * (DMCG + DMCI)); - break; - default: - printf("Warning: Specified RGEO = %d not matched\n", rgeo); - } - } -return 0; -} - - -int -BSIM4v6RdsEndSha(double Weffcj, double Rsh, double DMCG, double DMCI, double DMDG, double nuEnd, int rgeo, int Type, double *Rend) -{ - NG_IGNORE(DMCI); - NG_IGNORE(DMDG); - - if (Type == 1) - { switch(rgeo) - { case 1: - case 2: - case 5: - if (nuEnd == 0.0) - *Rend = 0.0; - else - *Rend = Rsh * DMCG / (Weffcj * nuEnd); - break; - case 3: - case 4: - case 6: - if (DMCG == 0.0) - printf("DMCG can not be equal to zero\n"); - if (nuEnd == 0.0) - *Rend = 0.0; - else - *Rend = Rsh * Weffcj / (6.0 * nuEnd * DMCG); - break; - default: - printf("Warning: Specified RGEO = %d not matched\n", rgeo); - } - } - else - { switch(rgeo) - { case 1: - case 3: - case 7: - if (nuEnd == 0.0) - *Rend = 0.0; - else - *Rend = Rsh * DMCG / (Weffcj * nuEnd); - break; - case 2: - case 4: - case 8: - if (DMCG == 0.0) - printf("DMCG can not be equal to zero\n"); - if (nuEnd == 0.0) - *Rend = 0.0; - else - *Rend = Rsh * Weffcj / (6.0 * nuEnd * DMCG); - break; - default: - printf("Warning: Specified RGEO = %d not matched\n", rgeo); - } - } -return 0; -} diff --git a/src/spicelib/devices/bsim4v6/b4v6getic.c b/src/spicelib/devices/bsim4v6/b4v6getic.c deleted file mode 100644 index f6dc246dd..000000000 --- a/src/spicelib/devices/bsim4v6/b4v6getic.c +++ /dev/null @@ -1,46 +0,0 @@ -/**** BSIM4.6.2 Released by Wenwei Yang 07/31/2008****/ - -/********** - * Copyright 2006 Regents of the University of California. All rights reserved. - * File: b4getic.c of BSIM4.6.2. - * Author: 2000 Weidong Liu - * Authors: 2001- Xuemei Xi, Mohan Dunga, Ali Niknejad, Chenming Hu. - * Authors: 2006- Mohan Dunga, Ali Niknejad, Chenming Hu - * Authors: 2007- Mohan Dunga, Wenwei Yang, Ali Niknejad, Chenming Hu - * Project Director: Prof. Chenming Hu. - **********/ - -#include "ngspice/ngspice.h" -#include "ngspice/cktdefs.h" -#include "bsim4v6def.h" -#include "ngspice/sperror.h" -#include "ngspice/suffix.h" - - -int -BSIM4v6getic( -GENmodel *inModel, -CKTcircuit *ckt) -{ -BSIM4v6model *model = (BSIM4v6model*)inModel; -BSIM4v6instance *here; - - for (; model ; model = BSIM4v6nextModel(model)) - { for (here = BSIM4v6instances(model); here; here = BSIM4v6nextInstance(here)) - { - if (!here->BSIM4v6icVDSGiven) - { here->BSIM4v6icVDS = *(ckt->CKTrhs + here->BSIM4v6dNode) - - *(ckt->CKTrhs + here->BSIM4v6sNode); - } - if (!here->BSIM4v6icVGSGiven) - { here->BSIM4v6icVGS = *(ckt->CKTrhs + here->BSIM4v6gNodeExt) - - *(ckt->CKTrhs + here->BSIM4v6sNode); - } - if(!here->BSIM4v6icVBSGiven) - { here->BSIM4v6icVBS = *(ckt->CKTrhs + here->BSIM4v6bNode) - - *(ckt->CKTrhs + here->BSIM4v6sNode); - } - } - } - return(OK); -} diff --git a/src/spicelib/devices/bsim4v6/b4v6ld.c b/src/spicelib/devices/bsim4v6/b4v6ld.c deleted file mode 100644 index c5bb49f9d..000000000 --- a/src/spicelib/devices/bsim4v6/b4v6ld.c +++ /dev/null @@ -1,5388 +0,0 @@ -/**** BSIM4.6.2 Released by Wenwei Yang 07/31/2008****/ -/**** BSIM4.6.5 Update ngspice 09/22/2009 ****/ -/**** OpenMP support ngspice 06/28/2010 ****/ -/********** - * Copyright 2006 Regents of the University of California. All rights reserved. - * File: b4ld.c of BSIM4.6.2. - * Author: 2000 Weidong Liu - * Authors: 2001- Xuemei Xi, Mohan Dunga, Ali Niknejad, Chenming Hu. - * Authors: 2006- Mohan Dunga, Ali Niknejad, Chenming Hu - * Authors: 2007- Mohan Dunga, Wenwei Yang, Ali Niknejad, Chenming Hu - * Authors: 2008- Wenwei Yang, Ali Niknejad, Chenming Hu - * Project Director: Prof. Chenming Hu. - * Modified by Xuemei Xi, 04/06/2001. - * Modified by Xuemei Xi, 10/05/2001. - * Modified by Xuemei Xi, 11/15/2002. - * Modified by Xuemei Xi, 05/09/2003. - * Modified by Xuemei Xi, 03/04/2004. - * Modified by Xuemei Xi, Mohan Dunga, 07/29/2005. - * Modified by Mohan Dunga, 12/13/2006. - * Modified by Mohan Dunga, Wenwei Yang, 05/18/2007. - * Modified by Wenwei Yang, 07/31/2008. - **********/ - - -#include "ngspice/ngspice.h" -#include "ngspice/cktdefs.h" -#include "bsim4v6def.h" -#include "ngspice/trandefs.h" -#include "ngspice/const.h" -#include "ngspice/sperror.h" -#include "ngspice/devdefs.h" -#include "ngspice/suffix.h" - -/* -#define MAX_EXP 2.688117142e+43 -#define MIN_EXP 3.720075976e-44 -#define EXP_THRESHOLD 100.0 -*/ -#define MAX_EXP 5.834617425e14 -#define MIN_EXP 1.713908431e-15 -#define EXP_THRESHOLD 34.0 -#define EPS0 8.85418e-12 -#define EPSSI 1.03594e-10 -#define Charge_q 1.60219e-19 -#define DELTA_1 0.02 -#define DELTA_2 0.02 -#define DELTA_3 0.02 -#define DELTA_4 0.02 -#define MM 3 /* smooth coeff */ -#define DEXP(A,B,C) { \ - if (A > EXP_THRESHOLD) { \ - B = MAX_EXP*(1.0+(A)-EXP_THRESHOLD); \ - C = MAX_EXP; \ - } else if (A < -EXP_THRESHOLD) { \ - B = MIN_EXP; \ - C = 0; \ - } else { \ - B = exp(A); \ - C = B; \ - } \ - } - - -#ifdef USE_OMP -int BSIM4v6LoadOMP(BSIM4v6instance *here, CKTcircuit *ckt); -void BSIM4v6LoadRhsMat(GENmodel *inModel, CKTcircuit *ckt); -#endif - -int BSIM4v6polyDepletion(double phi, double ngate,double epsgate, double coxe, double Vgs, double *Vgs_eff, double *dVgs_eff_dVg); - -int -BSIM4v6load( -GENmodel *inModel, -CKTcircuit *ckt) -{ -#ifdef USE_OMP - int idx; - BSIM4v6model *model = (BSIM4v6model*)inModel; - int error = 0; - BSIM4v6instance **InstArray; - InstArray = model->BSIM4v6InstanceArray; - -#pragma omp parallel for - for (idx = 0; idx < model->BSIM4v6InstCount; idx++) { - BSIM4v6instance *here = InstArray[idx]; - int local_error = BSIM4v6LoadOMP(here, ckt); - if (local_error) - error = local_error; - } - - BSIM4v6LoadRhsMat(inModel, ckt); - - return error; -} - - -int BSIM4v6LoadOMP(BSIM4v6instance *here, CKTcircuit *ckt) { -BSIM4v6model *model = BSIM4v6modPtr(here); -#else -BSIM4v6model *model = (BSIM4v6model*)inModel; -BSIM4v6instance *here; -#endif -double ceqgstot, dgstot_dvd, dgstot_dvg, dgstot_dvs, dgstot_dvb; -double ceqgdtot, dgdtot_dvd, dgdtot_dvg, dgdtot_dvs, dgdtot_dvb; -double gstot, gstotd, gstotg, gstots, gstotb, gspr, Rs, Rd; -double gdtot, gdtotd, gdtotg, gdtots, gdtotb, gdpr; -double vgs_eff, vgd_eff, dvgs_eff_dvg, dvgd_eff_dvg; -double dRs_dvg, dRd_dvg, dRs_dvb, dRd_dvb; -double dT0_dvg, dT1_dvb, dT3_dvg, dT3_dvb; -double vses, vdes, vdedo, delvses, delvded, delvdes; -double Isestot=0.0, cseshat=0.0, Idedtot=0.0, cdedhat=0.0; -#ifndef NEWCONV -double tol0, tol1, tol2, tol3, tol4, tol5, tol6; -#endif - -double geltd, gcrg, gcrgg, gcrgd, gcrgs, gcrgb, ceqgcrg; -double vges, vgms, vgedo, vgmdo, vged, vgmd, delvged, delvgmd; -double delvges, delvgms, vgmb; -double gcgmgmb=0.0, gcgmdb=0.0, gcgmsb=0.0, gcdgmb, gcsgmb; -double gcgmbb=0.0, gcbgmb, qgmb, qgmid=0.0, ceqqgmid; - -double vbd, vbs, vds, vgb, vgd, vgs, vgdo; -#ifndef PREDICTOR -double xfact; -#endif -double vdbs, vdbd, vsbs, vsbdo, vsbd; -double delvdbs, delvdbd, delvsbs; -double delvbd_jct, delvbs_jct, vbs_jct, vbd_jct; - -double SourceSatCurrent, DrainSatCurrent; -double ag0, qgb, von, cbhat=0.0, VgstNVt, ExpVgst; -double ceqqb, ceqqd, ceqqg, ceqqjd=0.0, ceqqjs=0.0, ceq, geq; -double cdrain, cdhat=0.0, ceqdrn, ceqbd, ceqbs, ceqjd, ceqjs, gjbd, gjbs; -double czbd, czbdsw, czbdswg, czbs, czbssw, czbsswg, evbd, evbs, arg, sarg; -double delvbd, delvbs, delvds, delvgd, delvgs; -double Vfbeff, dVfbeff_dVg, dVfbeff_dVb, V3, V4; -double gcbdb, gcbgb, gcbsb, gcddb, gcdgb, gcdsb, gcgdb, gcggb, gcgsb, gcsdb; -double gcgbb, gcdbb, gcsbb, gcbbb; -double gcdbdb, gcsbsb; -double gcsgb, gcssb, MJD, MJSWD, MJSWGD, MJS, MJSWS, MJSWGS; -double qgate=0.0, qbulk=0.0, qdrn=0.0, qsrc, cqgate, cqbody, cqdrn; -double Vdb, Vds, Vgs, Vbs, Gmbs, FwdSum, RevSum; -double Igidl, Ggidld, Ggidlg, Ggidlb; -double Voxacc=0.0, dVoxacc_dVg=0.0, dVoxacc_dVb=0.0; -double Voxdepinv=0.0, dVoxdepinv_dVg=0.0, dVoxdepinv_dVd=0.0, dVoxdepinv_dVb=0.0; -double VxNVt=0.0, ExpVxNVt, Vaux=0.0, dVaux_dVg=0.0, dVaux_dVd=0.0, dVaux_dVb=0.0; -double Igc, dIgc_dVg, dIgc_dVd, dIgc_dVb; -double Igcs, dIgcs_dVg, dIgcs_dVd, dIgcs_dVb; -double Igcd, dIgcd_dVg, dIgcd_dVd, dIgcd_dVb; -double Igs, dIgs_dVg, dIgs_dVs, Igd, dIgd_dVg, dIgd_dVd; -double Igbacc, dIgbacc_dVg, dIgbacc_dVb; -double Igbinv, dIgbinv_dVg, dIgbinv_dVd, dIgbinv_dVb; -double Pigcd, dPigcd_dVg, dPigcd_dVd, dPigcd_dVb; -double Istoteq, gIstotg, gIstotd, gIstots, gIstotb; -double Idtoteq, gIdtotg, gIdtotd, gIdtots, gIdtotb; -double Ibtoteq, gIbtotg, gIbtotd, gIbtots, gIbtotb; -double Igtoteq, gIgtotg, gIgtotd, gIgtots, gIgtotb; -double Igstot=0.0, cgshat=0.0, Igdtot=0.0, cgdhat=0.0, Igbtot=0.0, cgbhat=0.0; -double Vgs_eff, Vfb=0.0, Vth_NarrowW; -double Phis, dPhis_dVb, sqrtPhis, dsqrtPhis_dVb, Vth, dVth_dVb, dVth_dVd; -double Vgst, dVgst_dVg, dVgst_dVb, dVgs_eff_dVg, Nvtms, Nvtmd; -double Vtm, Vtm0; -double n, dn_dVb, dn_dVd, voffcv, noff, dnoff_dVd, dnoff_dVb; -double V0, CoxWLcen, QovCox, LINK; -double DeltaPhi, dDeltaPhi_dVg, VgDP, dVgDP_dVg; -double Cox, Tox, Tcen, dTcen_dVg, dTcen_dVd, dTcen_dVb; -double Ccen, Coxeff, dCoxeff_dVd, dCoxeff_dVg, dCoxeff_dVb; -double Denomi, dDenomi_dVg, dDenomi_dVd, dDenomi_dVb; -double ueff, dueff_dVg, dueff_dVd, dueff_dVb; -double Esat, Vdsat; -double EsatL, dEsatL_dVg, dEsatL_dVd, dEsatL_dVb; -double dVdsat_dVg, dVdsat_dVb, dVdsat_dVd, Vasat, dAlphaz_dVg, dAlphaz_dVb; -double dVasat_dVg, dVasat_dVb, dVasat_dVd, Va, dVa_dVd, dVa_dVg, dVa_dVb; -double Vbseff, dVbseff_dVb, VbseffCV, dVbseffCV_dVb; -double VgsteffVth, dT11_dVg; -double Arg1, One_Third_CoxWL, Two_Third_CoxWL, Alphaz, CoxWL; -double T0=0.0, dT0_dVg, dT0_dVd, dT0_dVb; -double T1, dT1_dVg, dT1_dVd, dT1_dVb; -double T2, dT2_dVg, dT2_dVd, dT2_dVb; -double T3, dT3_dVg, dT3_dVd, dT3_dVb; -double T4, dT4_dVd, dT4_dVb; -double T5, dT5_dVg, dT5_dVd, dT5_dVb; -double T6, dT6_dVg, dT6_dVd, dT6_dVb; -double T7, dT7_dVg, dT7_dVd, dT7_dVb; -double T8, dT8_dVg, dT8_dVd, dT8_dVb; -double T9, dT9_dVg, dT9_dVd, dT9_dVb; -double T10, dT10_dVg, dT10_dVb, dT10_dVd; -double T11, T12, T13, T14; -double tmp, Abulk, dAbulk_dVb, Abulk0, dAbulk0_dVb; -double Cclm, dCclm_dVg, dCclm_dVd, dCclm_dVb; -double FP, dFP_dVg, PvagTerm, dPvagTerm_dVg, dPvagTerm_dVd, dPvagTerm_dVb; -double VADITS, dVADITS_dVg, dVADITS_dVd; -double Lpe_Vb, dDITS_Sft_dVb, dDITS_Sft_dVd; -double VACLM, dVACLM_dVg, dVACLM_dVd, dVACLM_dVb; -double VADIBL, dVADIBL_dVg, dVADIBL_dVd, dVADIBL_dVb; -double Xdep, dXdep_dVb, lt1, dlt1_dVb, ltw, dltw_dVb, Delt_vth, dDelt_vth_dVb; -double Theta0, dTheta0_dVb; -double TempRatio, tmp1, tmp2, tmp3, tmp4; -double DIBL_Sft, dDIBL_Sft_dVd, Lambda, dLambda_dVg; -double Idtot, Ibtot, a1, ScalingFactor; - -double Vgsteff, dVgsteff_dVg, dVgsteff_dVd, dVgsteff_dVb; -double Vdseff, dVdseff_dVg, dVdseff_dVd, dVdseff_dVb; -double VdseffCV, dVdseffCV_dVg, dVdseffCV_dVd, dVdseffCV_dVb; -double diffVds, dAbulk_dVg; -double beta, dbeta_dVg, dbeta_dVd, dbeta_dVb; -double gche, dgche_dVg, dgche_dVd, dgche_dVb; -double fgche1, dfgche1_dVg, dfgche1_dVd, dfgche1_dVb; -double fgche2, dfgche2_dVg, dfgche2_dVd, dfgche2_dVb; -double Idl, dIdl_dVg, dIdl_dVd, dIdl_dVb; -double Idsa, dIdsa_dVg, dIdsa_dVd, dIdsa_dVb; -double Ids, Gm, Gds, Gmb, devbs_dvb, devbd_dvb; -double Isub, Gbd, Gbg, Gbb; -double VASCBE, dVASCBE_dVg, dVASCBE_dVd, dVASCBE_dVb; -double CoxeffWovL; -double Rds, dRds_dVg, dRds_dVb, WVCox, WVCoxRds; -double Vgst2Vtm, VdsatCV; -double Leff, Weff, dWeff_dVg, dWeff_dVb; -double AbulkCV, dAbulkCV_dVb; -double qcheq, qdef, gqdef=0.0, cqdef=0.0, cqcheq=0.0; -double gcqdb=0.0, gcqsb=0.0, gcqgb=0.0, gcqbb=0.0; -double dxpart, sxpart, ggtg, ggtd, ggts, ggtb; -double ddxpart_dVd, ddxpart_dVg, ddxpart_dVb, ddxpart_dVs; -double dsxpart_dVd, dsxpart_dVg, dsxpart_dVb, dsxpart_dVs; -double gbspsp, gbbdp, gbbsp, gbspg, gbspb, gbspdp; -double gbdpdp, gbdpg, gbdpb, gbdpsp; -double qgdo, qgso, cgdo, cgso; -double Cgg, Cgd, Cgb, Cdg, Cdd, Cds; -double Csg, Csd, Css, Csb, Cbg, Cbd, Cbb; -double Cgg1, Cgb1, Cgd1, Cbg1, Cbb1, Cbd1, Qac0, Qsub0; -double dQac0_dVg, dQac0_dVb, dQsub0_dVg, dQsub0_dVd, dQsub0_dVb; -double ggidld, ggidlg, ggidlb, ggislg, ggislb, ggisls; -double Igisl, Ggislg, Ggislb, Ggisls; -double Nvtmrss, Nvtmrssws, Nvtmrsswgs; -double Nvtmrsd, Nvtmrsswd, Nvtmrsswgd; - -double vs, Fsevl, dvs_dVg, dvs_dVd, dvs_dVb, dFsevl_dVg, dFsevl_dVd, dFsevl_dVb; -double vgdx, vgsx, epssub, toxe, epsrox; -struct bsim4v6SizeDependParam *pParam; -int ByPass, ChargeComputationNeeded, error, Check, Check1, Check2; - -double m; - -ScalingFactor = 1.0e-9; -ChargeComputationNeeded = - ((ckt->CKTmode & (MODEAC | MODETRAN | MODEINITSMSIG)) || - ((ckt->CKTmode & MODETRANOP) && (ckt->CKTmode & MODEUIC))) - ? 1 : 0; - -#ifndef USE_OMP -for (; model != NULL; model = BSIM4v6nextModel(model)) -{ for (here = BSIM4v6instances(model); here != NULL; - here = BSIM4v6nextInstance(here)) - { -#endif - - Check = Check1 = Check2 = 1; - ByPass = 0; - pParam = here->pParam; - - if ((ckt->CKTmode & MODEINITSMSIG)) - { vds = *(ckt->CKTstate0 + here->BSIM4v6vds); - vgs = *(ckt->CKTstate0 + here->BSIM4v6vgs); - vbs = *(ckt->CKTstate0 + here->BSIM4v6vbs); - vges = *(ckt->CKTstate0 + here->BSIM4v6vges); - vgms = *(ckt->CKTstate0 + here->BSIM4v6vgms); - vdbs = *(ckt->CKTstate0 + here->BSIM4v6vdbs); - vsbs = *(ckt->CKTstate0 + here->BSIM4v6vsbs); - vses = *(ckt->CKTstate0 + here->BSIM4v6vses); - vdes = *(ckt->CKTstate0 + here->BSIM4v6vdes); - - qdef = *(ckt->CKTstate0 + here->BSIM4v6qdef); - } - else if ((ckt->CKTmode & MODEINITTRAN)) - { vds = *(ckt->CKTstate1 + here->BSIM4v6vds); - vgs = *(ckt->CKTstate1 + here->BSIM4v6vgs); - vbs = *(ckt->CKTstate1 + here->BSIM4v6vbs); - vges = *(ckt->CKTstate1 + here->BSIM4v6vges); - vgms = *(ckt->CKTstate1 + here->BSIM4v6vgms); - vdbs = *(ckt->CKTstate1 + here->BSIM4v6vdbs); - vsbs = *(ckt->CKTstate1 + here->BSIM4v6vsbs); - vses = *(ckt->CKTstate1 + here->BSIM4v6vses); - vdes = *(ckt->CKTstate1 + here->BSIM4v6vdes); - - qdef = *(ckt->CKTstate1 + here->BSIM4v6qdef); - } - else if ((ckt->CKTmode & MODEINITJCT) && !here->BSIM4v6off) - { vds = model->BSIM4v6type * here->BSIM4v6icVDS; - vgs = vges = vgms = model->BSIM4v6type * here->BSIM4v6icVGS; - vbs = vdbs = vsbs = model->BSIM4v6type * here->BSIM4v6icVBS; - if (vds > 0.0) - { vdes = vds + 0.01; - vses = -0.01; - } - else if (vds < 0.0) - { vdes = vds - 0.01; - vses = 0.01; - } - else - vdes = vses = 0.0; - - qdef = 0.0; - - if ((vds == 0.0) && (vgs == 0.0) && (vbs == 0.0) && - ((ckt->CKTmode & (MODETRAN | MODEAC|MODEDCOP | - MODEDCTRANCURVE)) || (!(ckt->CKTmode & MODEUIC)))) - { vds = 0.1; - vdes = 0.11; - vses = -0.01; - vgs = vges = vgms = model->BSIM4v6type - * here->BSIM4v6vth0 + 0.1; - vbs = vdbs = vsbs = 0.0; - } - } - else if ((ckt->CKTmode & (MODEINITJCT | MODEINITFIX)) && - (here->BSIM4v6off)) - { vds = vgs = vbs = vges = vgms = 0.0; - vdbs = vsbs = vdes = vses = qdef = 0.0; - } - else - { -#ifndef PREDICTOR - if ((ckt->CKTmode & MODEINITPRED)) - { xfact = ckt->CKTdelta / ckt->CKTdeltaOld[1]; - *(ckt->CKTstate0 + here->BSIM4v6vds) = - *(ckt->CKTstate1 + here->BSIM4v6vds); - vds = (1.0 + xfact)* (*(ckt->CKTstate1 + here->BSIM4v6vds)) - - (xfact * (*(ckt->CKTstate2 + here->BSIM4v6vds))); - *(ckt->CKTstate0 + here->BSIM4v6vgs) = - *(ckt->CKTstate1 + here->BSIM4v6vgs); - vgs = (1.0 + xfact)* (*(ckt->CKTstate1 + here->BSIM4v6vgs)) - - (xfact * (*(ckt->CKTstate2 + here->BSIM4v6vgs))); - *(ckt->CKTstate0 + here->BSIM4v6vges) = - *(ckt->CKTstate1 + here->BSIM4v6vges); - vges = (1.0 + xfact)* (*(ckt->CKTstate1 + here->BSIM4v6vges)) - - (xfact * (*(ckt->CKTstate2 + here->BSIM4v6vges))); - *(ckt->CKTstate0 + here->BSIM4v6vgms) = - *(ckt->CKTstate1 + here->BSIM4v6vgms); - vgms = (1.0 + xfact)* (*(ckt->CKTstate1 + here->BSIM4v6vgms)) - - (xfact * (*(ckt->CKTstate2 + here->BSIM4v6vgms))); - *(ckt->CKTstate0 + here->BSIM4v6vbs) = - *(ckt->CKTstate1 + here->BSIM4v6vbs); - vbs = (1.0 + xfact)* (*(ckt->CKTstate1 + here->BSIM4v6vbs)) - - (xfact * (*(ckt->CKTstate2 + here->BSIM4v6vbs))); - *(ckt->CKTstate0 + here->BSIM4v6vbd) = - *(ckt->CKTstate0 + here->BSIM4v6vbs) - - *(ckt->CKTstate0 + here->BSIM4v6vds); - *(ckt->CKTstate0 + here->BSIM4v6vdbs) = - *(ckt->CKTstate1 + here->BSIM4v6vdbs); - vdbs = (1.0 + xfact)* (*(ckt->CKTstate1 + here->BSIM4v6vdbs)) - - (xfact * (*(ckt->CKTstate2 + here->BSIM4v6vdbs))); - *(ckt->CKTstate0 + here->BSIM4v6vdbd) = - *(ckt->CKTstate0 + here->BSIM4v6vdbs) - - *(ckt->CKTstate0 + here->BSIM4v6vds); - *(ckt->CKTstate0 + here->BSIM4v6vsbs) = - *(ckt->CKTstate1 + here->BSIM4v6vsbs); - vsbs = (1.0 + xfact)* (*(ckt->CKTstate1 + here->BSIM4v6vsbs)) - - (xfact * (*(ckt->CKTstate2 + here->BSIM4v6vsbs))); - *(ckt->CKTstate0 + here->BSIM4v6vses) = - *(ckt->CKTstate1 + here->BSIM4v6vses); - vses = (1.0 + xfact)* (*(ckt->CKTstate1 + here->BSIM4v6vses)) - - (xfact * (*(ckt->CKTstate2 + here->BSIM4v6vses))); - *(ckt->CKTstate0 + here->BSIM4v6vdes) = - *(ckt->CKTstate1 + here->BSIM4v6vdes); - vdes = (1.0 + xfact)* (*(ckt->CKTstate1 + here->BSIM4v6vdes)) - - (xfact * (*(ckt->CKTstate2 + here->BSIM4v6vdes))); - - *(ckt->CKTstate0 + here->BSIM4v6qdef) = - *(ckt->CKTstate1 + here->BSIM4v6qdef); - qdef = (1.0 + xfact)* (*(ckt->CKTstate1 + here->BSIM4v6qdef)) - -(xfact * (*(ckt->CKTstate2 + here->BSIM4v6qdef))); - } - else - { -#endif /* PREDICTOR */ - vds = model->BSIM4v6type - * (*(ckt->CKTrhsOld + here->BSIM4v6dNodePrime) - - *(ckt->CKTrhsOld + here->BSIM4v6sNodePrime)); - vgs = model->BSIM4v6type - * (*(ckt->CKTrhsOld + here->BSIM4v6gNodePrime) - - *(ckt->CKTrhsOld + here->BSIM4v6sNodePrime)); - vbs = model->BSIM4v6type - * (*(ckt->CKTrhsOld + here->BSIM4v6bNodePrime) - - *(ckt->CKTrhsOld + here->BSIM4v6sNodePrime)); - vges = model->BSIM4v6type - * (*(ckt->CKTrhsOld + here->BSIM4v6gNodeExt) - - *(ckt->CKTrhsOld + here->BSIM4v6sNodePrime)); - vgms = model->BSIM4v6type - * (*(ckt->CKTrhsOld + here->BSIM4v6gNodeMid) - - *(ckt->CKTrhsOld + here->BSIM4v6sNodePrime)); - vdbs = model->BSIM4v6type - * (*(ckt->CKTrhsOld + here->BSIM4v6dbNode) - - *(ckt->CKTrhsOld + here->BSIM4v6sNodePrime)); - vsbs = model->BSIM4v6type - * (*(ckt->CKTrhsOld + here->BSIM4v6sbNode) - - *(ckt->CKTrhsOld + here->BSIM4v6sNodePrime)); - vses = model->BSIM4v6type - * (*(ckt->CKTrhsOld + here->BSIM4v6sNode) - - *(ckt->CKTrhsOld + here->BSIM4v6sNodePrime)); - vdes = model->BSIM4v6type - * (*(ckt->CKTrhsOld + here->BSIM4v6dNode) - - *(ckt->CKTrhsOld + here->BSIM4v6sNodePrime)); - qdef = model->BSIM4v6type - * (*(ckt->CKTrhsOld + here->BSIM4v6qNode)); -#ifndef PREDICTOR - } -#endif /* PREDICTOR */ - - vgdo = *(ckt->CKTstate0 + here->BSIM4v6vgs) - - *(ckt->CKTstate0 + here->BSIM4v6vds); - vgedo = *(ckt->CKTstate0 + here->BSIM4v6vges) - - *(ckt->CKTstate0 + here->BSIM4v6vds); - vgmdo = *(ckt->CKTstate0 + here->BSIM4v6vgms) - - *(ckt->CKTstate0 + here->BSIM4v6vds); - - vbd = vbs - vds; - vdbd = vdbs - vds; - vgd = vgs - vds; - vged = vges - vds; - vgmd = vgms - vds; - - delvbd = vbd - *(ckt->CKTstate0 + here->BSIM4v6vbd); - delvdbd = vdbd - *(ckt->CKTstate0 + here->BSIM4v6vdbd); - delvgd = vgd - vgdo; - delvged = vged - vgedo; - delvgmd = vgmd - vgmdo; - - delvds = vds - *(ckt->CKTstate0 + here->BSIM4v6vds); - delvgs = vgs - *(ckt->CKTstate0 + here->BSIM4v6vgs); - delvges = vges - *(ckt->CKTstate0 + here->BSIM4v6vges); - delvgms = vgms - *(ckt->CKTstate0 + here->BSIM4v6vgms); - delvbs = vbs - *(ckt->CKTstate0 + here->BSIM4v6vbs); - delvdbs = vdbs - *(ckt->CKTstate0 + here->BSIM4v6vdbs); - delvsbs = vsbs - *(ckt->CKTstate0 + here->BSIM4v6vsbs); - - delvses = vses - (*(ckt->CKTstate0 + here->BSIM4v6vses)); - vdedo = *(ckt->CKTstate0 + here->BSIM4v6vdes) - - *(ckt->CKTstate0 + here->BSIM4v6vds); - delvdes = vdes - *(ckt->CKTstate0 + here->BSIM4v6vdes); - delvded = vdes - vds - vdedo; - - delvbd_jct = (!here->BSIM4v6rbodyMod) ? delvbd : delvdbd; - delvbs_jct = (!here->BSIM4v6rbodyMod) ? delvbs : delvsbs; - if (here->BSIM4v6mode >= 0) - { Idtot = here->BSIM4v6cd + here->BSIM4v6csub - here->BSIM4v6cbd - + here->BSIM4v6Igidl; - cdhat = Idtot - here->BSIM4v6gbd * delvbd_jct - + (here->BSIM4v6gmbs + here->BSIM4v6gbbs + here->BSIM4v6ggidlb) * delvbs - + (here->BSIM4v6gm + here->BSIM4v6gbgs + here->BSIM4v6ggidlg) * delvgs - + (here->BSIM4v6gds + here->BSIM4v6gbds + here->BSIM4v6ggidld) * delvds; - Ibtot = here->BSIM4v6cbs + here->BSIM4v6cbd - - here->BSIM4v6Igidl - here->BSIM4v6Igisl - here->BSIM4v6csub; - cbhat = Ibtot + here->BSIM4v6gbd * delvbd_jct - + here->BSIM4v6gbs * delvbs_jct - (here->BSIM4v6gbbs + here->BSIM4v6ggidlb) - * delvbs - (here->BSIM4v6gbgs + here->BSIM4v6ggidlg) * delvgs - - (here->BSIM4v6gbds + here->BSIM4v6ggidld - here->BSIM4v6ggisls) * delvds - - here->BSIM4v6ggislg * delvgd - here->BSIM4v6ggislb* delvbd; - - Igstot = here->BSIM4v6Igs + here->BSIM4v6Igcs; - cgshat = Igstot + (here->BSIM4v6gIgsg + here->BSIM4v6gIgcsg) * delvgs - + here->BSIM4v6gIgcsd * delvds + here->BSIM4v6gIgcsb * delvbs; - - Igdtot = here->BSIM4v6Igd + here->BSIM4v6Igcd; - cgdhat = Igdtot + here->BSIM4v6gIgdg * delvgd + here->BSIM4v6gIgcdg * delvgs - + here->BSIM4v6gIgcdd * delvds + here->BSIM4v6gIgcdb * delvbs; - - Igbtot = here->BSIM4v6Igb; - cgbhat = here->BSIM4v6Igb + here->BSIM4v6gIgbg * delvgs + here->BSIM4v6gIgbd - * delvds + here->BSIM4v6gIgbb * delvbs; - } - else - { Idtot = here->BSIM4v6cd + here->BSIM4v6cbd - here->BSIM4v6Igidl; /* bugfix */ - cdhat = Idtot + here->BSIM4v6gbd * delvbd_jct + here->BSIM4v6gmbs - * delvbd + here->BSIM4v6gm * delvgd - - (here->BSIM4v6gds + here->BSIM4v6ggidls) * delvds - - here->BSIM4v6ggidlg * delvgs - here->BSIM4v6ggidlb * delvbs; - Ibtot = here->BSIM4v6cbs + here->BSIM4v6cbd - - here->BSIM4v6Igidl - here->BSIM4v6Igisl - here->BSIM4v6csub; - cbhat = Ibtot + here->BSIM4v6gbs * delvbs_jct + here->BSIM4v6gbd - * delvbd_jct - (here->BSIM4v6gbbs + here->BSIM4v6ggislb) * delvbd - - (here->BSIM4v6gbgs + here->BSIM4v6ggislg) * delvgd - + (here->BSIM4v6gbds + here->BSIM4v6ggisld - here->BSIM4v6ggidls) * delvds - - here->BSIM4v6ggidlg * delvgs - here->BSIM4v6ggidlb * delvbs; - - Igstot = here->BSIM4v6Igs + here->BSIM4v6Igcd; - cgshat = Igstot + here->BSIM4v6gIgsg * delvgs + here->BSIM4v6gIgcdg * delvgd - - here->BSIM4v6gIgcdd * delvds + here->BSIM4v6gIgcdb * delvbd; - - Igdtot = here->BSIM4v6Igd + here->BSIM4v6Igcs; - cgdhat = Igdtot + (here->BSIM4v6gIgdg + here->BSIM4v6gIgcsg) * delvgd - - here->BSIM4v6gIgcsd * delvds + here->BSIM4v6gIgcsb * delvbd; - - Igbtot = here->BSIM4v6Igb; - cgbhat = here->BSIM4v6Igb + here->BSIM4v6gIgbg * delvgd - here->BSIM4v6gIgbd - * delvds + here->BSIM4v6gIgbb * delvbd; - } - - Isestot = here->BSIM4v6gstot * (*(ckt->CKTstate0 + here->BSIM4v6vses)); - cseshat = Isestot + here->BSIM4v6gstot * delvses - + here->BSIM4v6gstotd * delvds + here->BSIM4v6gstotg * delvgs - + here->BSIM4v6gstotb * delvbs; - - Idedtot = here->BSIM4v6gdtot * vdedo; - cdedhat = Idedtot + here->BSIM4v6gdtot * delvded - + here->BSIM4v6gdtotd * delvds + here->BSIM4v6gdtotg * delvgs - + here->BSIM4v6gdtotb * delvbs; - - -#ifndef NOBYPASS - /* Following should be one IF statement, but some C compilers - * can't handle that all at once, so we split it into several - * successive IF's */ - - if ((!(ckt->CKTmode & MODEINITPRED)) && (ckt->CKTbypass)) - if ((fabs(delvds) < (ckt->CKTreltol * MAX(fabs(vds), - fabs(*(ckt->CKTstate0 + here->BSIM4v6vds))) + ckt->CKTvoltTol))) - if ((fabs(delvgs) < (ckt->CKTreltol * MAX(fabs(vgs), - fabs(*(ckt->CKTstate0 + here->BSIM4v6vgs))) + ckt->CKTvoltTol))) - if ((fabs(delvbs) < (ckt->CKTreltol * MAX(fabs(vbs), - fabs(*(ckt->CKTstate0 + here->BSIM4v6vbs))) + ckt->CKTvoltTol))) - if ((fabs(delvbd) < (ckt->CKTreltol * MAX(fabs(vbd), - fabs(*(ckt->CKTstate0 + here->BSIM4v6vbd))) + ckt->CKTvoltTol))) - if ((here->BSIM4v6rgateMod == 0) || (here->BSIM4v6rgateMod == 1) - || (fabs(delvges) < (ckt->CKTreltol * MAX(fabs(vges), - fabs(*(ckt->CKTstate0 + here->BSIM4v6vges))) + ckt->CKTvoltTol))) - if ((here->BSIM4v6rgateMod != 3) || (fabs(delvgms) < (ckt->CKTreltol - * MAX(fabs(vgms), fabs(*(ckt->CKTstate0 + here->BSIM4v6vgms))) - + ckt->CKTvoltTol))) - if ((!here->BSIM4v6rbodyMod) || (fabs(delvdbs) < (ckt->CKTreltol - * MAX(fabs(vdbs), fabs(*(ckt->CKTstate0 + here->BSIM4v6vdbs))) - + ckt->CKTvoltTol))) - if ((!here->BSIM4v6rbodyMod) || (fabs(delvdbd) < (ckt->CKTreltol - * MAX(fabs(vdbd), fabs(*(ckt->CKTstate0 + here->BSIM4v6vdbd))) - + ckt->CKTvoltTol))) - if ((!here->BSIM4v6rbodyMod) || (fabs(delvsbs) < (ckt->CKTreltol - * MAX(fabs(vsbs), fabs(*(ckt->CKTstate0 + here->BSIM4v6vsbs))) - + ckt->CKTvoltTol))) - if ((!model->BSIM4v6rdsMod) || (fabs(delvses) < (ckt->CKTreltol - * MAX(fabs(vses), fabs(*(ckt->CKTstate0 + here->BSIM4v6vses))) - + ckt->CKTvoltTol))) - if ((!model->BSIM4v6rdsMod) || (fabs(delvdes) < (ckt->CKTreltol - * MAX(fabs(vdes), fabs(*(ckt->CKTstate0 + here->BSIM4v6vdes))) - + ckt->CKTvoltTol))) - if ((fabs(cdhat - Idtot) < ckt->CKTreltol - * MAX(fabs(cdhat), fabs(Idtot)) + ckt->CKTabstol)) - if ((fabs(cbhat - Ibtot) < ckt->CKTreltol - * MAX(fabs(cbhat), fabs(Ibtot)) + ckt->CKTabstol)) - if ((!model->BSIM4v6igcMod) || ((fabs(cgshat - Igstot) < ckt->CKTreltol - * MAX(fabs(cgshat), fabs(Igstot)) + ckt->CKTabstol))) - if ((!model->BSIM4v6igcMod) || ((fabs(cgdhat - Igdtot) < ckt->CKTreltol - * MAX(fabs(cgdhat), fabs(Igdtot)) + ckt->CKTabstol))) - if ((!model->BSIM4v6igbMod) || ((fabs(cgbhat - Igbtot) < ckt->CKTreltol - * MAX(fabs(cgbhat), fabs(Igbtot)) + ckt->CKTabstol))) - if ((!model->BSIM4v6rdsMod) || ((fabs(cseshat - Isestot) < ckt->CKTreltol - * MAX(fabs(cseshat), fabs(Isestot)) + ckt->CKTabstol))) - if ((!model->BSIM4v6rdsMod) || ((fabs(cdedhat - Idedtot) < ckt->CKTreltol - * MAX(fabs(cdedhat), fabs(Idedtot)) + ckt->CKTabstol))) - { vds = *(ckt->CKTstate0 + here->BSIM4v6vds); - vgs = *(ckt->CKTstate0 + here->BSIM4v6vgs); - vbs = *(ckt->CKTstate0 + here->BSIM4v6vbs); - vges = *(ckt->CKTstate0 + here->BSIM4v6vges); - vgms = *(ckt->CKTstate0 + here->BSIM4v6vgms); - - vbd = *(ckt->CKTstate0 + here->BSIM4v6vbd); - vdbs = *(ckt->CKTstate0 + here->BSIM4v6vdbs); - vdbd = *(ckt->CKTstate0 + here->BSIM4v6vdbd); - vsbs = *(ckt->CKTstate0 + here->BSIM4v6vsbs); - vses = *(ckt->CKTstate0 + here->BSIM4v6vses); - vdes = *(ckt->CKTstate0 + here->BSIM4v6vdes); - - vgd = vgs - vds; - vgb = vgs - vbs; - vged = vges - vds; - vgmd = vgms - vds; - vgmb = vgms - vbs; - - vbs_jct = (!here->BSIM4v6rbodyMod) ? vbs : vsbs; - vbd_jct = (!here->BSIM4v6rbodyMod) ? vbd : vdbd; - -/*** qdef should not be kept fixed even if vgs, vds & vbs has converged -**** qdef = *(ckt->CKTstate0 + here->BSIM4v6qdef); -***/ - cdrain = here->BSIM4v6cd; - - if ((ckt->CKTmode & (MODETRAN | MODEAC)) || - ((ckt->CKTmode & MODETRANOP) && - (ckt->CKTmode & MODEUIC))) - { ByPass = 1; - - qgate = here->BSIM4v6qgate; - qbulk = here->BSIM4v6qbulk; - qdrn = here->BSIM4v6qdrn; - cgdo = here->BSIM4v6cgdo; - qgdo = here->BSIM4v6qgdo; - cgso = here->BSIM4v6cgso; - qgso = here->BSIM4v6qgso; - - goto line755; - } - else - goto line850; - } -#endif /*NOBYPASS*/ - - von = here->BSIM4v6von; - if (*(ckt->CKTstate0 + here->BSIM4v6vds) >= 0.0) - { vgs = DEVfetlim(vgs, *(ckt->CKTstate0 + here->BSIM4v6vgs), von); - vds = vgs - vgd; - vds = DEVlimvds(vds, *(ckt->CKTstate0 + here->BSIM4v6vds)); - vgd = vgs - vds; - if (here->BSIM4v6rgateMod == 3) - { vges = DEVfetlim(vges, *(ckt->CKTstate0 + here->BSIM4v6vges), von); - vgms = DEVfetlim(vgms, *(ckt->CKTstate0 + here->BSIM4v6vgms), von); - vged = vges - vds; - vgmd = vgms - vds; - } - else if ((here->BSIM4v6rgateMod == 1) || (here->BSIM4v6rgateMod == 2)) - { vges = DEVfetlim(vges, *(ckt->CKTstate0 + here->BSIM4v6vges), von); - vged = vges - vds; - } - - if (model->BSIM4v6rdsMod) - { vdes = DEVlimvds(vdes, *(ckt->CKTstate0 + here->BSIM4v6vdes)); - vses = -DEVlimvds(-vses, -(*(ckt->CKTstate0 + here->BSIM4v6vses))); - } - - } - else - { vgd = DEVfetlim(vgd, vgdo, von); - vds = vgs - vgd; - vds = -DEVlimvds(-vds, -(*(ckt->CKTstate0 + here->BSIM4v6vds))); - vgs = vgd + vds; - - if (here->BSIM4v6rgateMod == 3) - { vged = DEVfetlim(vged, vgedo, von); - vges = vged + vds; - vgmd = DEVfetlim(vgmd, vgmdo, von); - vgms = vgmd + vds; - } - if ((here->BSIM4v6rgateMod == 1) || (here->BSIM4v6rgateMod == 2)) - { vged = DEVfetlim(vged, vgedo, von); - vges = vged + vds; - } - - if (model->BSIM4v6rdsMod) - { vdes = -DEVlimvds(-vdes, -(*(ckt->CKTstate0 + here->BSIM4v6vdes))); - vses = DEVlimvds(vses, *(ckt->CKTstate0 + here->BSIM4v6vses)); - } - } - - if (vds >= 0.0) - { vbs = DEVpnjlim(vbs, *(ckt->CKTstate0 + here->BSIM4v6vbs), - CONSTvt0, model->BSIM4v6vcrit, &Check); - vbd = vbs - vds; - if (here->BSIM4v6rbodyMod) - { vdbs = DEVpnjlim(vdbs, *(ckt->CKTstate0 + here->BSIM4v6vdbs), - CONSTvt0, model->BSIM4v6vcrit, &Check1); - vdbd = vdbs - vds; - vsbs = DEVpnjlim(vsbs, *(ckt->CKTstate0 + here->BSIM4v6vsbs), - CONSTvt0, model->BSIM4v6vcrit, &Check2); - if ((Check1 == 0) && (Check2 == 0)) - Check = 0; - else - Check = 1; - } - } - else - { vbd = DEVpnjlim(vbd, *(ckt->CKTstate0 + here->BSIM4v6vbd), - CONSTvt0, model->BSIM4v6vcrit, &Check); - vbs = vbd + vds; - if (here->BSIM4v6rbodyMod) - { vdbd = DEVpnjlim(vdbd, *(ckt->CKTstate0 + here->BSIM4v6vdbd), - CONSTvt0, model->BSIM4v6vcrit, &Check1); - vdbs = vdbd + vds; - vsbdo = *(ckt->CKTstate0 + here->BSIM4v6vsbs) - - *(ckt->CKTstate0 + here->BSIM4v6vds); - vsbd = vsbs - vds; - vsbd = DEVpnjlim(vsbd, vsbdo, CONSTvt0, model->BSIM4v6vcrit, &Check2); - vsbs = vsbd + vds; - if ((Check1 == 0) && (Check2 == 0)) - Check = 0; - else - Check = 1; - } - } - } - - /* Calculate DC currents and their derivatives */ - vbd = vbs - vds; - vgd = vgs - vds; - vgb = vgs - vbs; - vged = vges - vds; - vgmd = vgms - vds; - vgmb = vgms - vbs; - vdbd = vdbs - vds; - - vbs_jct = (!here->BSIM4v6rbodyMod) ? vbs : vsbs; - vbd_jct = (!here->BSIM4v6rbodyMod) ? vbd : vdbd; - - /* Source/drain junction diode DC model begins */ - Nvtms = model->BSIM4v6vtm * model->BSIM4v6SjctEmissionCoeff; - if ((here->BSIM4v6Aseff <= 0.0) && (here->BSIM4v6Pseff <= 0.0)) - { SourceSatCurrent = 0.0; - } - else - { SourceSatCurrent = here->BSIM4v6Aseff * model->BSIM4v6SjctTempSatCurDensity - + here->BSIM4v6Pseff * model->BSIM4v6SjctSidewallTempSatCurDensity - + pParam->BSIM4v6weffCJ * here->BSIM4v6nf - * model->BSIM4v6SjctGateSidewallTempSatCurDensity; - } - - if (SourceSatCurrent <= 0.0) - { here->BSIM4v6gbs = ckt->CKTgmin; - here->BSIM4v6cbs = here->BSIM4v6gbs * vbs_jct; - } - else - { switch(model->BSIM4v6dioMod) - { case 0: - evbs = exp(vbs_jct / Nvtms); - T1 = model->BSIM4v6xjbvs * exp(-(model->BSIM4v6bvs + vbs_jct) / Nvtms); - /* WDLiu: Magic T1 in this form; different from BSIM4v6 beta. */ - here->BSIM4v6gbs = SourceSatCurrent * (evbs + T1) / Nvtms + ckt->CKTgmin; - here->BSIM4v6cbs = SourceSatCurrent * (evbs + here->BSIM4v6XExpBVS - - T1 - 1.0) + ckt->CKTgmin * vbs_jct; - break; - case 1: - T2 = vbs_jct / Nvtms; - if (T2 < -EXP_THRESHOLD) - { here->BSIM4v6gbs = ckt->CKTgmin; - here->BSIM4v6cbs = SourceSatCurrent * (MIN_EXP - 1.0) - + ckt->CKTgmin * vbs_jct; - } - else if (vbs_jct <= here->BSIM4v6vjsmFwd) - { evbs = exp(T2); - here->BSIM4v6gbs = SourceSatCurrent * evbs / Nvtms + ckt->CKTgmin; - here->BSIM4v6cbs = SourceSatCurrent * (evbs - 1.0) - + ckt->CKTgmin * vbs_jct; - } - else - { T0 = here->BSIM4v6IVjsmFwd / Nvtms; - here->BSIM4v6gbs = T0 + ckt->CKTgmin; - here->BSIM4v6cbs = here->BSIM4v6IVjsmFwd - SourceSatCurrent + T0 - * (vbs_jct - here->BSIM4v6vjsmFwd) + ckt->CKTgmin * vbs_jct; - } - break; - case 2: - if (vbs_jct < here->BSIM4v6vjsmRev) - { T0 = vbs_jct / Nvtms; - if (T0 < -EXP_THRESHOLD) - { evbs = MIN_EXP; - devbs_dvb = 0.0; - } - else - { evbs = exp(T0); - devbs_dvb = evbs / Nvtms; - } - - T1 = evbs - 1.0; - T2 = here->BSIM4v6IVjsmRev + here->BSIM4v6SslpRev - * (vbs_jct - here->BSIM4v6vjsmRev); - here->BSIM4v6gbs = devbs_dvb * T2 + T1 * here->BSIM4v6SslpRev + ckt->CKTgmin; - here->BSIM4v6cbs = T1 * T2 + ckt->CKTgmin * vbs_jct; - } - else if (vbs_jct <= here->BSIM4v6vjsmFwd) - { T0 = vbs_jct / Nvtms; - if (T0 < -EXP_THRESHOLD) - { evbs = MIN_EXP; - devbs_dvb = 0.0; - } - else - { evbs = exp(T0); - devbs_dvb = evbs / Nvtms; - } - - T1 = (model->BSIM4v6bvs + vbs_jct) / Nvtms; - if (T1 > EXP_THRESHOLD) - { T2 = MIN_EXP; - T3 = 0.0; - } - else - { T2 = exp(-T1); - T3 = -T2 /Nvtms; - } - here->BSIM4v6gbs = SourceSatCurrent * (devbs_dvb - model->BSIM4v6xjbvs * T3) - + ckt->CKTgmin; - here->BSIM4v6cbs = SourceSatCurrent * (evbs + here->BSIM4v6XExpBVS - 1.0 - - model->BSIM4v6xjbvs * T2) + ckt->CKTgmin * vbs_jct; - } - else - { here->BSIM4v6gbs = here->BSIM4v6SslpFwd + ckt->CKTgmin; - here->BSIM4v6cbs = here->BSIM4v6IVjsmFwd + here->BSIM4v6SslpFwd * (vbs_jct - - here->BSIM4v6vjsmFwd) + ckt->CKTgmin * vbs_jct; - } - break; - default: break; - } - } - - Nvtmd = model->BSIM4v6vtm * model->BSIM4v6DjctEmissionCoeff; - if ((here->BSIM4v6Adeff <= 0.0) && (here->BSIM4v6Pdeff <= 0.0)) - { DrainSatCurrent = 0.0; - } - else - { DrainSatCurrent = here->BSIM4v6Adeff * model->BSIM4v6DjctTempSatCurDensity - + here->BSIM4v6Pdeff * model->BSIM4v6DjctSidewallTempSatCurDensity - + pParam->BSIM4v6weffCJ * here->BSIM4v6nf - * model->BSIM4v6DjctGateSidewallTempSatCurDensity; - } - - if (DrainSatCurrent <= 0.0) - { here->BSIM4v6gbd = ckt->CKTgmin; - here->BSIM4v6cbd = here->BSIM4v6gbd * vbd_jct; - } - else - { switch(model->BSIM4v6dioMod) - { case 0: - evbd = exp(vbd_jct / Nvtmd); - T1 = model->BSIM4v6xjbvd * exp(-(model->BSIM4v6bvd + vbd_jct) / Nvtmd); - /* WDLiu: Magic T1 in this form; different from BSIM4v6 beta. */ - here->BSIM4v6gbd = DrainSatCurrent * (evbd + T1) / Nvtmd + ckt->CKTgmin; - here->BSIM4v6cbd = DrainSatCurrent * (evbd + here->BSIM4v6XExpBVD - - T1 - 1.0) + ckt->CKTgmin * vbd_jct; - break; - case 1: - T2 = vbd_jct / Nvtmd; - if (T2 < -EXP_THRESHOLD) - { here->BSIM4v6gbd = ckt->CKTgmin; - here->BSIM4v6cbd = DrainSatCurrent * (MIN_EXP - 1.0) - + ckt->CKTgmin * vbd_jct; - } - else if (vbd_jct <= here->BSIM4v6vjdmFwd) - { evbd = exp(T2); - here->BSIM4v6gbd = DrainSatCurrent * evbd / Nvtmd + ckt->CKTgmin; - here->BSIM4v6cbd = DrainSatCurrent * (evbd - 1.0) - + ckt->CKTgmin * vbd_jct; - } - else - { T0 = here->BSIM4v6IVjdmFwd / Nvtmd; - here->BSIM4v6gbd = T0 + ckt->CKTgmin; - here->BSIM4v6cbd = here->BSIM4v6IVjdmFwd - DrainSatCurrent + T0 - * (vbd_jct - here->BSIM4v6vjdmFwd) + ckt->CKTgmin * vbd_jct; - } - break; - case 2: - if (vbd_jct < here->BSIM4v6vjdmRev) - { T0 = vbd_jct / Nvtmd; - if (T0 < -EXP_THRESHOLD) - { evbd = MIN_EXP; - devbd_dvb = 0.0; - } - else - { evbd = exp(T0); - devbd_dvb = evbd / Nvtmd; - } - - T1 = evbd - 1.0; - T2 = here->BSIM4v6IVjdmRev + here->BSIM4v6DslpRev - * (vbd_jct - here->BSIM4v6vjdmRev); - here->BSIM4v6gbd = devbd_dvb * T2 + T1 * here->BSIM4v6DslpRev + ckt->CKTgmin; - here->BSIM4v6cbd = T1 * T2 + ckt->CKTgmin * vbd_jct; - } - else if (vbd_jct <= here->BSIM4v6vjdmFwd) - { T0 = vbd_jct / Nvtmd; - if (T0 < -EXP_THRESHOLD) - { evbd = MIN_EXP; - devbd_dvb = 0.0; - } - else - { evbd = exp(T0); - devbd_dvb = evbd / Nvtmd; - } - - T1 = (model->BSIM4v6bvd + vbd_jct) / Nvtmd; - if (T1 > EXP_THRESHOLD) - { T2 = MIN_EXP; - T3 = 0.0; - } - else - { T2 = exp(-T1); - T3 = -T2 /Nvtmd; - } - here->BSIM4v6gbd = DrainSatCurrent * (devbd_dvb - model->BSIM4v6xjbvd * T3) - + ckt->CKTgmin; - here->BSIM4v6cbd = DrainSatCurrent * (evbd + here->BSIM4v6XExpBVD - 1.0 - - model->BSIM4v6xjbvd * T2) + ckt->CKTgmin * vbd_jct; - } - else - { here->BSIM4v6gbd = here->BSIM4v6DslpFwd + ckt->CKTgmin; - here->BSIM4v6cbd = here->BSIM4v6IVjdmFwd + here->BSIM4v6DslpFwd * (vbd_jct - - here->BSIM4v6vjdmFwd) + ckt->CKTgmin * vbd_jct; - } - break; - default: break; - } - } - - /* trap-assisted tunneling and recombination current for reverse bias */ - Nvtmrssws = model->BSIM4v6vtm0 * model->BSIM4v6njtsswstemp; - Nvtmrsswgs = model->BSIM4v6vtm0 * model->BSIM4v6njtsswgstemp; - Nvtmrss = model->BSIM4v6vtm0 * model->BSIM4v6njtsstemp; - Nvtmrsswd = model->BSIM4v6vtm0 * model->BSIM4v6njtsswdtemp; - Nvtmrsswgd = model->BSIM4v6vtm0 * model->BSIM4v6njtsswgdtemp; - Nvtmrsd = model->BSIM4v6vtm0 * model->BSIM4v6njtsdtemp; - - if ((model->BSIM4v6vtss - vbs_jct) < (model->BSIM4v6vtss * 1e-3)) - { T9 = 1.0e3; - T0 = - vbs_jct / Nvtmrss * T9; - DEXP(T0, T1, T10); - dT1_dVb = T10 / Nvtmrss * T9; - } else { - T9 = 1.0 / (model->BSIM4v6vtss - vbs_jct); - T0 = -vbs_jct / Nvtmrss * model->BSIM4v6vtss * T9; - dT0_dVb = model->BSIM4v6vtss / Nvtmrss * (T9 + vbs_jct * T9 * T9) ; - DEXP(T0, T1, T10); - dT1_dVb = T10 * dT0_dVb; - } - - if ((model->BSIM4v6vtsd - vbd_jct) < (model->BSIM4v6vtsd * 1e-3) ) - { T9 = 1.0e3; - T0 = -vbd_jct / Nvtmrsd * T9; - DEXP(T0, T2, T10); - dT2_dVb = T10 / Nvtmrsd * T9; - } else { - T9 = 1.0 / (model->BSIM4v6vtsd - vbd_jct); - T0 = -vbd_jct / Nvtmrsd * model->BSIM4v6vtsd * T9; - dT0_dVb = model->BSIM4v6vtsd / Nvtmrsd * (T9 + vbd_jct * T9 * T9) ; - DEXP(T0, T2, T10); - dT2_dVb = T10 * dT0_dVb; - } - - if ((model->BSIM4v6vtssws - vbs_jct) < (model->BSIM4v6vtssws * 1e-3) ) - { T9 = 1.0e3; - T0 = -vbs_jct / Nvtmrssws * T9; - DEXP(T0, T3, T10); - dT3_dVb = T10 / Nvtmrssws * T9; - } else { - T9 = 1.0 / (model->BSIM4v6vtssws - vbs_jct); - T0 = -vbs_jct / Nvtmrssws * model->BSIM4v6vtssws * T9; - dT0_dVb = model->BSIM4v6vtssws / Nvtmrssws * (T9 + vbs_jct * T9 * T9) ; - DEXP(T0, T3, T10); - dT3_dVb = T10 * dT0_dVb; - } - - if ((model->BSIM4v6vtsswd - vbd_jct) < (model->BSIM4v6vtsswd * 1e-3) ) - { T9 = 1.0e3; - T0 = -vbd_jct / Nvtmrsswd * T9; - DEXP(T0, T4, T10); - dT4_dVb = T10 / Nvtmrsswd * T9; - } else { - T9 = 1.0 / (model->BSIM4v6vtsswd - vbd_jct); - T0 = -vbd_jct / Nvtmrsswd * model->BSIM4v6vtsswd * T9; - dT0_dVb = model->BSIM4v6vtsswd / Nvtmrsswd * (T9 + vbd_jct * T9 * T9) ; - DEXP(T0, T4, T10); - dT4_dVb = T10 * dT0_dVb; - } - - if ((model->BSIM4v6vtsswgs - vbs_jct) < (model->BSIM4v6vtsswgs * 1e-3) ) - { T9 = 1.0e3; - T0 = -vbs_jct / Nvtmrsswgs * T9; - DEXP(T0, T5, T10); - dT5_dVb = T10 / Nvtmrsswgs * T9; - } else { - T9 = 1.0 / (model->BSIM4v6vtsswgs - vbs_jct); - T0 = -vbs_jct / Nvtmrsswgs * model->BSIM4v6vtsswgs * T9; - dT0_dVb = model->BSIM4v6vtsswgs / Nvtmrsswgs * (T9 + vbs_jct * T9 * T9) ; - DEXP(T0, T5, T10); - dT5_dVb = T10 * dT0_dVb; - } - - if ((model->BSIM4v6vtsswgd - vbd_jct) < (model->BSIM4v6vtsswgd * 1e-3) ) - { T9 = 1.0e3; - T0 = -vbd_jct / Nvtmrsswgd * T9; - DEXP(T0, T6, T10); - dT6_dVb = T10 / Nvtmrsswgd * T9; - } else { - T9 = 1.0 / (model->BSIM4v6vtsswgd - vbd_jct); - T0 = -vbd_jct / Nvtmrsswgd * model->BSIM4v6vtsswgd * T9; - dT0_dVb = model->BSIM4v6vtsswgd / Nvtmrsswgd * (T9 + vbd_jct * T9 * T9) ; - DEXP(T0, T6, T10); - dT6_dVb = T10 * dT0_dVb; - } - - here->BSIM4v6gbs += here->BSIM4v6SjctTempRevSatCur * dT1_dVb - + here->BSIM4v6SswTempRevSatCur * dT3_dVb - + here->BSIM4v6SswgTempRevSatCur * dT5_dVb; - here->BSIM4v6cbs -= here->BSIM4v6SjctTempRevSatCur * (T1 - 1.0) - + here->BSIM4v6SswTempRevSatCur * (T3 - 1.0) - + here->BSIM4v6SswgTempRevSatCur * (T5 - 1.0); - here->BSIM4v6gbd += here->BSIM4v6DjctTempRevSatCur * dT2_dVb - + here->BSIM4v6DswTempRevSatCur * dT4_dVb - + here->BSIM4v6DswgTempRevSatCur * dT6_dVb; - here->BSIM4v6cbd -= here->BSIM4v6DjctTempRevSatCur * (T2 - 1.0) - + here->BSIM4v6DswTempRevSatCur * (T4 - 1.0) - + here->BSIM4v6DswgTempRevSatCur * (T6 - 1.0); - - /* End of diode DC model */ - - if (vds >= 0.0) - { here->BSIM4v6mode = 1; - Vds = vds; - Vgs = vgs; - Vbs = vbs; - Vdb = vds - vbs; /* WDLiu: for GIDL */ - } - else - { here->BSIM4v6mode = -1; - Vds = -vds; - Vgs = vgd; - Vbs = vbd; - Vdb = -vbs; - } - - - /* dunga */ - if(model->BSIM4v6mtrlMod) - { - epsrox = 3.9; - toxe = model->BSIM4v6eot; - epssub = EPS0 * model->BSIM4v6epsrsub; - } - else - { - epsrox = model->BSIM4v6epsrox; - toxe = model->BSIM4v6toxe; - epssub = EPSSI; - } - - - T0 = Vbs - here->BSIM4v6vbsc - 0.001; - T1 = sqrt(T0 * T0 - 0.004 * here->BSIM4v6vbsc); - if (T0 >= 0.0) - { Vbseff = here->BSIM4v6vbsc + 0.5 * (T0 + T1); - dVbseff_dVb = 0.5 * (1.0 + T0 / T1); - } - else - { T2 = -0.002 / (T1 - T0); - Vbseff = here->BSIM4v6vbsc * (1.0 + T2); - dVbseff_dVb = T2 * here->BSIM4v6vbsc / T1; - } - - /* JX: Correction to forward body bias */ - T9 = 0.95 * pParam->BSIM4v6phi; - T0 = T9 - Vbseff - 0.001; - T1 = sqrt(T0 * T0 + 0.004 * T9); - Vbseff = T9 - 0.5 * (T0 + T1); - dVbseff_dVb *= 0.5 * (1.0 + T0 / T1); - Phis = pParam->BSIM4v6phi - Vbseff; - dPhis_dVb = -1.0; - sqrtPhis = sqrt(Phis); - dsqrtPhis_dVb = -0.5 / sqrtPhis; - - Xdep = pParam->BSIM4v6Xdep0 * sqrtPhis / pParam->BSIM4v6sqrtPhi; - dXdep_dVb = (pParam->BSIM4v6Xdep0 / pParam->BSIM4v6sqrtPhi) - * dsqrtPhis_dVb; - - Leff = pParam->BSIM4v6leff; - Vtm = model->BSIM4v6vtm; - Vtm0 = model->BSIM4v6vtm0; - - /* Vth Calculation */ - T3 = sqrt(Xdep); - V0 = pParam->BSIM4v6vbi - pParam->BSIM4v6phi; - - T0 = pParam->BSIM4v6dvt2 * Vbseff; - if (T0 >= - 0.5) - { T1 = 1.0 + T0; - T2 = pParam->BSIM4v6dvt2; - } - else - { T4 = 1.0 / (3.0 + 8.0 * T0); - T1 = (1.0 + 3.0 * T0) * T4; - T2 = pParam->BSIM4v6dvt2 * T4 * T4; - } - lt1 = model->BSIM4v6factor1 * T3 * T1; - dlt1_dVb = model->BSIM4v6factor1 * (0.5 / T3 * T1 * dXdep_dVb + T3 * T2); - - T0 = pParam->BSIM4v6dvt2w * Vbseff; - if (T0 >= - 0.5) - { T1 = 1.0 + T0; - T2 = pParam->BSIM4v6dvt2w; - } - else - { T4 = 1.0 / (3.0 + 8.0 * T0); - T1 = (1.0 + 3.0 * T0) * T4; - T2 = pParam->BSIM4v6dvt2w * T4 * T4; - } - ltw = model->BSIM4v6factor1 * T3 * T1; - dltw_dVb = model->BSIM4v6factor1 * (0.5 / T3 * T1 * dXdep_dVb + T3 * T2); - - T0 = pParam->BSIM4v6dvt1 * Leff / lt1; - if (T0 < EXP_THRESHOLD) - { T1 = exp(T0); - T2 = T1 - 1.0; - T3 = T2 * T2; - T4 = T3 + 2.0 * T1 * MIN_EXP; - Theta0 = T1 / T4; - dT1_dVb = -T0 * T1 * dlt1_dVb / lt1; - dTheta0_dVb = dT1_dVb * (T4 - 2.0 * T1 * (T2 + MIN_EXP)) / T4 / T4; - } - else - { Theta0 = 1.0 / (MAX_EXP - 2.0); /* 3.0 * MIN_EXP omitted */ - dTheta0_dVb = 0.0; - } - here->BSIM4v6thetavth = pParam->BSIM4v6dvt0 * Theta0; - Delt_vth = here->BSIM4v6thetavth * V0; - dDelt_vth_dVb = pParam->BSIM4v6dvt0 * dTheta0_dVb * V0; - - T0 = pParam->BSIM4v6dvt1w * pParam->BSIM4v6weff * Leff / ltw; - if (T0 < EXP_THRESHOLD) - { T1 = exp(T0); - T2 = T1 - 1.0; - T3 = T2 * T2; - T4 = T3 + 2.0 * T1 * MIN_EXP; - T5 = T1 / T4; - dT1_dVb = -T0 * T1 * dltw_dVb / ltw; - dT5_dVb = dT1_dVb * (T4 - 2.0 * T1 * (T2 + MIN_EXP)) / T4 / T4; - } - else - { T5 = 1.0 / (MAX_EXP - 2.0); /* 3.0 * MIN_EXP omitted */ - dT5_dVb = 0.0; - } - T0 = pParam->BSIM4v6dvt0w * T5; - T2 = T0 * V0; - dT2_dVb = pParam->BSIM4v6dvt0w * dT5_dVb * V0; - - TempRatio = ckt->CKTtemp / model->BSIM4v6tnom - 1.0; - T0 = sqrt(1.0 + pParam->BSIM4v6lpe0 / Leff); - T1 = pParam->BSIM4v6k1ox * (T0 - 1.0) * pParam->BSIM4v6sqrtPhi - + (pParam->BSIM4v6kt1 + pParam->BSIM4v6kt1l / Leff - + pParam->BSIM4v6kt2 * Vbseff) * TempRatio; - Vth_NarrowW = toxe * pParam->BSIM4v6phi - / (pParam->BSIM4v6weff + pParam->BSIM4v6w0); - - T3 = here->BSIM4v6eta0 + pParam->BSIM4v6etab * Vbseff; - if (T3 < 1.0e-4) - { T9 = 1.0 / (3.0 - 2.0e4 * T3); - T3 = (2.0e-4 - T3) * T9; - T4 = T9 * T9; - } - else - { T4 = 1.0; - } - dDIBL_Sft_dVd = T3 * pParam->BSIM4v6theta0vb0; - DIBL_Sft = dDIBL_Sft_dVd * Vds; - - Lpe_Vb = sqrt(1.0 + pParam->BSIM4v6lpeb / Leff); - - Vth = model->BSIM4v6type * here->BSIM4v6vth0 + (pParam->BSIM4v6k1ox * sqrtPhis - - pParam->BSIM4v6k1 * pParam->BSIM4v6sqrtPhi) * Lpe_Vb - - here->BSIM4v6k2ox * Vbseff - Delt_vth - T2 + (pParam->BSIM4v6k3 - + pParam->BSIM4v6k3b * Vbseff) * Vth_NarrowW + T1 - DIBL_Sft; - - dVth_dVb = Lpe_Vb * pParam->BSIM4v6k1ox * dsqrtPhis_dVb - here->BSIM4v6k2ox - - dDelt_vth_dVb - dT2_dVb + pParam->BSIM4v6k3b * Vth_NarrowW - - pParam->BSIM4v6etab * Vds * pParam->BSIM4v6theta0vb0 * T4 - + pParam->BSIM4v6kt2 * TempRatio; - dVth_dVd = -dDIBL_Sft_dVd; - - - /* Calculate n */ - tmp1 = epssub / Xdep; - here->BSIM4v6nstar = model->BSIM4v6vtm / Charge_q * (model->BSIM4v6coxe - + tmp1 + pParam->BSIM4v6cit); - tmp2 = pParam->BSIM4v6nfactor * tmp1; - tmp3 = pParam->BSIM4v6cdsc + pParam->BSIM4v6cdscb * Vbseff - + pParam->BSIM4v6cdscd * Vds; - tmp4 = (tmp2 + tmp3 * Theta0 + pParam->BSIM4v6cit) / model->BSIM4v6coxe; - if (tmp4 >= -0.5) - { n = 1.0 + tmp4; - dn_dVb = (-tmp2 / Xdep * dXdep_dVb + tmp3 * dTheta0_dVb - + pParam->BSIM4v6cdscb * Theta0) / model->BSIM4v6coxe; - dn_dVd = pParam->BSIM4v6cdscd * Theta0 / model->BSIM4v6coxe; - } - else - { T0 = 1.0 / (3.0 + 8.0 * tmp4); - n = (1.0 + 3.0 * tmp4) * T0; - T0 *= T0; - dn_dVb = (-tmp2 / Xdep * dXdep_dVb + tmp3 * dTheta0_dVb - + pParam->BSIM4v6cdscb * Theta0) / model->BSIM4v6coxe * T0; - dn_dVd = pParam->BSIM4v6cdscd * Theta0 / model->BSIM4v6coxe * T0; - } - - - /* Vth correction for Pocket implant */ - if (pParam->BSIM4v6dvtp0 > 0.0) - { T0 = -pParam->BSIM4v6dvtp1 * Vds; - if (T0 < -EXP_THRESHOLD) - { T2 = MIN_EXP; - dT2_dVd = 0.0; - } - else - { T2 = exp(T0); - dT2_dVd = -pParam->BSIM4v6dvtp1 * T2; - } - - T3 = Leff + pParam->BSIM4v6dvtp0 * (1.0 + T2); - dT3_dVd = pParam->BSIM4v6dvtp0 * dT2_dVd; - if (model->BSIM4v6tempMod < 2) - { - T4 = Vtm * log(Leff / T3); - dT4_dVd = -Vtm * dT3_dVd / T3; - } - else - { - T4 = model->BSIM4v6vtm0 * log(Leff / T3); - dT4_dVd = -model->BSIM4v6vtm0 * dT3_dVd / T3; - } - dDITS_Sft_dVd = dn_dVd * T4 + n * dT4_dVd; - dDITS_Sft_dVb = T4 * dn_dVb; - - Vth -= n * T4; - dVth_dVd -= dDITS_Sft_dVd; - dVth_dVb -= dDITS_Sft_dVb; - } - here->BSIM4v6von = Vth; - - - /* Poly Gate Si Depletion Effect */ - T0 = here->BSIM4v6vfb + pParam->BSIM4v6phi; - if(model->BSIM4v6mtrlMod == 0) - T1 = EPSSI; - else - T1 = model->BSIM4v6epsrgate * EPS0; - - - BSIM4v6polyDepletion(T0, pParam->BSIM4v6ngate, T1, model->BSIM4v6coxe, vgs, &vgs_eff, &dvgs_eff_dvg); - - BSIM4v6polyDepletion(T0, pParam->BSIM4v6ngate, T1, model->BSIM4v6coxe, vgd, &vgd_eff, &dvgd_eff_dvg); - - if(here->BSIM4v6mode>0) { - Vgs_eff = vgs_eff; - dVgs_eff_dVg = dvgs_eff_dvg; - } else { - Vgs_eff = vgd_eff; - dVgs_eff_dVg = dvgd_eff_dvg; - } - here->BSIM4v6vgs_eff = vgs_eff; - here->BSIM4v6vgd_eff = vgd_eff; - here->BSIM4v6dvgs_eff_dvg = dvgs_eff_dvg; - here->BSIM4v6dvgd_eff_dvg = dvgd_eff_dvg; - - - Vgst = Vgs_eff - Vth; - - /* Calculate Vgsteff */ - T0 = n * Vtm; - T1 = pParam->BSIM4v6mstar * Vgst; - T2 = T1 / T0; - if (T2 > EXP_THRESHOLD) - { T10 = T1; - dT10_dVg = pParam->BSIM4v6mstar * dVgs_eff_dVg; - dT10_dVd = -dVth_dVd * pParam->BSIM4v6mstar; - dT10_dVb = -dVth_dVb * pParam->BSIM4v6mstar; - } - else if (T2 < -EXP_THRESHOLD) - { T10 = Vtm * log(1.0 + MIN_EXP); - dT10_dVg = 0.0; - dT10_dVd = T10 * dn_dVd; - dT10_dVb = T10 * dn_dVb; - T10 *= n; - } - else - { ExpVgst = exp(T2); - T3 = Vtm * log(1.0 + ExpVgst); - T10 = n * T3; - dT10_dVg = pParam->BSIM4v6mstar * ExpVgst / (1.0 + ExpVgst); - dT10_dVb = T3 * dn_dVb - dT10_dVg * (dVth_dVb + Vgst * dn_dVb / n); - dT10_dVd = T3 * dn_dVd - dT10_dVg * (dVth_dVd + Vgst * dn_dVd / n); - dT10_dVg *= dVgs_eff_dVg; - } - - T1 = pParam->BSIM4v6voffcbn - (1.0 - pParam->BSIM4v6mstar) * Vgst; - T2 = T1 / T0; - if (T2 < -EXP_THRESHOLD) - { T3 = model->BSIM4v6coxe * MIN_EXP / pParam->BSIM4v6cdep0; - T9 = pParam->BSIM4v6mstar + T3 * n; - dT9_dVg = 0.0; - dT9_dVd = dn_dVd * T3; - dT9_dVb = dn_dVb * T3; - } - else if (T2 > EXP_THRESHOLD) - { T3 = model->BSIM4v6coxe * MAX_EXP / pParam->BSIM4v6cdep0; - T9 = pParam->BSIM4v6mstar + T3 * n; - dT9_dVg = 0.0; - dT9_dVd = dn_dVd * T3; - dT9_dVb = dn_dVb * T3; - } - else - { ExpVgst = exp(T2); - T3 = model->BSIM4v6coxe / pParam->BSIM4v6cdep0; - T4 = T3 * ExpVgst; - T5 = T1 * T4 / T0; - T9 = pParam->BSIM4v6mstar + n * T4; - dT9_dVg = T3 * (pParam->BSIM4v6mstar - 1.0) * ExpVgst / Vtm; - dT9_dVb = T4 * dn_dVb - dT9_dVg * dVth_dVb - T5 * dn_dVb; - dT9_dVd = T4 * dn_dVd - dT9_dVg * dVth_dVd - T5 * dn_dVd; - dT9_dVg *= dVgs_eff_dVg; - } - - here->BSIM4v6Vgsteff = Vgsteff = T10 / T9; - T11 = T9 * T9; - dVgsteff_dVg = (T9 * dT10_dVg - T10 * dT9_dVg) / T11; - dVgsteff_dVd = (T9 * dT10_dVd - T10 * dT9_dVd) / T11; - dVgsteff_dVb = (T9 * dT10_dVb - T10 * dT9_dVb) / T11; - - /* Calculate Effective Channel Geometry */ - T9 = sqrtPhis - pParam->BSIM4v6sqrtPhi; - Weff = pParam->BSIM4v6weff - 2.0 * (pParam->BSIM4v6dwg * Vgsteff - + pParam->BSIM4v6dwb * T9); - dWeff_dVg = -2.0 * pParam->BSIM4v6dwg; - dWeff_dVb = -2.0 * pParam->BSIM4v6dwb * dsqrtPhis_dVb; - - if (Weff < 2.0e-8) /* to avoid the discontinuity problem due to Weff*/ - { T0 = 1.0 / (6.0e-8 - 2.0 * Weff); - Weff = 2.0e-8 * (4.0e-8 - Weff) * T0; - T0 *= T0 * 4.0e-16; - dWeff_dVg *= T0; - dWeff_dVb *= T0; - } - - if (model->BSIM4v6rdsMod == 1) - Rds = dRds_dVg = dRds_dVb = 0.0; - else - { T0 = 1.0 + pParam->BSIM4v6prwg * Vgsteff; - dT0_dVg = -pParam->BSIM4v6prwg / T0 / T0; - T1 = pParam->BSIM4v6prwb * T9; - dT1_dVb = pParam->BSIM4v6prwb * dsqrtPhis_dVb; - - T2 = 1.0 / T0 + T1; - T3 = T2 + sqrt(T2 * T2 + 0.01); /* 0.01 = 4.0 * 0.05 * 0.05 */ - dT3_dVg = 1.0 + T2 / (T3 - T2); - dT3_dVb = dT3_dVg * dT1_dVb; - dT3_dVg *= dT0_dVg; - - T4 = pParam->BSIM4v6rds0 * 0.5; - Rds = pParam->BSIM4v6rdswmin + T3 * T4; - dRds_dVg = T4 * dT3_dVg; - dRds_dVb = T4 * dT3_dVb; - - if (Rds > 0.0) - here->BSIM4v6grdsw = 1.0 / Rds* here->BSIM4v6nf; /*4.6.2*/ - else - here->BSIM4v6grdsw = 0.0; - } - - /* Calculate Abulk */ - T9 = 0.5 * pParam->BSIM4v6k1ox * Lpe_Vb / sqrtPhis; - T1 = T9 + here->BSIM4v6k2ox - pParam->BSIM4v6k3b * Vth_NarrowW; - dT1_dVb = -T9 / sqrtPhis * dsqrtPhis_dVb; - - T9 = sqrt(pParam->BSIM4v6xj * Xdep); - tmp1 = Leff + 2.0 * T9; - T5 = Leff / tmp1; - tmp2 = pParam->BSIM4v6a0 * T5; - tmp3 = pParam->BSIM4v6weff + pParam->BSIM4v6b1; - tmp4 = pParam->BSIM4v6b0 / tmp3; - T2 = tmp2 + tmp4; - dT2_dVb = -T9 / tmp1 / Xdep * dXdep_dVb; - T6 = T5 * T5; - T7 = T5 * T6; - - Abulk0 = 1.0 + T1 * T2; - dAbulk0_dVb = T1 * tmp2 * dT2_dVb + T2 * dT1_dVb; - - T8 = pParam->BSIM4v6ags * pParam->BSIM4v6a0 * T7; - dAbulk_dVg = -T1 * T8; - Abulk = Abulk0 + dAbulk_dVg * Vgsteff; - dAbulk_dVb = dAbulk0_dVb - T8 * Vgsteff * (dT1_dVb - + 3.0 * T1 * dT2_dVb); - - if (Abulk0 < 0.1) /* added to avoid the problems caused by Abulk0 */ - { T9 = 1.0 / (3.0 - 20.0 * Abulk0); - Abulk0 = (0.2 - Abulk0) * T9; - dAbulk0_dVb *= T9 * T9; - } - - if (Abulk < 0.1) - { T9 = 1.0 / (3.0 - 20.0 * Abulk); - Abulk = (0.2 - Abulk) * T9; - T10 = T9 * T9; - dAbulk_dVb *= T10; - dAbulk_dVg *= T10; - } - here->BSIM4v6Abulk = Abulk; - - T2 = pParam->BSIM4v6keta * Vbseff; - if (T2 >= -0.9) - { T0 = 1.0 / (1.0 + T2); - dT0_dVb = -pParam->BSIM4v6keta * T0 * T0; - } - else - { T1 = 1.0 / (0.8 + T2); - T0 = (17.0 + 20.0 * T2) * T1; - dT0_dVb = -pParam->BSIM4v6keta * T1 * T1; - } - dAbulk_dVg *= T0; - dAbulk_dVb = dAbulk_dVb * T0 + Abulk * dT0_dVb; - dAbulk0_dVb = dAbulk0_dVb * T0 + Abulk0 * dT0_dVb; - Abulk *= T0; - Abulk0 *= T0; - - /* Mobility calculation */ - if (model->BSIM4v6mtrlMod) - T14 = 2.0 * model->BSIM4v6type *(model->BSIM4v6phig - model->BSIM4v6easub - 0.5*model->BSIM4v6Eg0 + 0.45); - else - T14 = 0.0; - - if (model->BSIM4v6mobMod == 0) - { T0 = Vgsteff + Vth + Vth - T14; - T2 = pParam->BSIM4v6ua + pParam->BSIM4v6uc * Vbseff; - T3 = T0 / toxe; - T12 = sqrt(Vth * Vth + 0.0001); - T9 = 1.0/(Vgsteff + 2*T12); - T10 = T9*toxe; - T8 = pParam->BSIM4v6ud * T10 * T10 * Vth; - T6 = T8 * Vth; - T5 = T3 * (T2 + pParam->BSIM4v6ub * T3) + T6; - T7 = - 2.0 * T6 * T9; - T11 = T7 * Vth/T12; - dDenomi_dVg = (T2 + 2.0 * pParam->BSIM4v6ub * T3) / toxe; - T13 = 2.0 * (dDenomi_dVg + T11 + T8); - dDenomi_dVd = T13 * dVth_dVd; - dDenomi_dVb = T13 * dVth_dVb + pParam->BSIM4v6uc * T3; - dDenomi_dVg+= T7; - } - else if (model->BSIM4v6mobMod == 1) - { T0 = Vgsteff + Vth + Vth - T14; - T2 = 1.0 + pParam->BSIM4v6uc * Vbseff; - T3 = T0 / toxe; - T4 = T3 * (pParam->BSIM4v6ua + pParam->BSIM4v6ub * T3); - T12 = sqrt(Vth * Vth + 0.0001); - T9 = 1.0/(Vgsteff + 2*T12); - T10 = T9*toxe; - T8 = pParam->BSIM4v6ud * T10 * T10 * Vth; - T6 = T8 * Vth; - T5 = T4 * T2 + T6; - T7 = - 2.0 * T6 * T9; - T11 = T7 * Vth/T12; - dDenomi_dVg = (pParam->BSIM4v6ua + 2.0 * pParam->BSIM4v6ub * T3) * T2 / toxe; - T13 = 2.0 * (dDenomi_dVg + T11 + T8); - dDenomi_dVd = T13 * dVth_dVd; - dDenomi_dVb = T13 * dVth_dVb + pParam->BSIM4v6uc * T4; - dDenomi_dVg+= T7; - } - else if (model->BSIM4v6mobMod == 2) - { T0 = (Vgsteff + here->BSIM4v6vtfbphi1) / toxe; - T1 = exp(pParam->BSIM4v6eu * log(T0)); - dT1_dVg = T1 * pParam->BSIM4v6eu / T0 / toxe; - T2 = pParam->BSIM4v6ua + pParam->BSIM4v6uc * Vbseff; - T3 = T0 / toxe; /*Do we need it?*/ - - T12 = sqrt(Vth * Vth + 0.0001); - T9 = 1.0/(Vgsteff + 2*T12); - T10 = T9*toxe; - T8 = pParam->BSIM4v6ud * T10 * T10 * Vth; - T6 = T8 * Vth; - T5 = T1 * T2 + T6; - T7 = - 2.0 * T6 * T9; - T11 = T7 * Vth/T12; - dDenomi_dVg = T2 * dT1_dVg + T7; - T13 = 2.0 * (T11 + T8); - dDenomi_dVd = T13 * dVth_dVd; - dDenomi_dVb = T13 * dVth_dVb + T1 * pParam->BSIM4v6uc; - } - /*high K mobility*/ - else - { - - - /*univsersal mobility*/ - T0 = (Vgsteff + here->BSIM4v6vtfbphi1)* 1.0e-8 / toxe/6.0; - T1 = exp(pParam->BSIM4v6eu * log(T0)); - dT1_dVg = T1 * pParam->BSIM4v6eu * 1.0e-8/ T0 / toxe/6.0; - T2 = pParam->BSIM4v6ua + pParam->BSIM4v6uc * Vbseff; - - /*Coulombic*/ - VgsteffVth = pParam->BSIM4v6VgsteffVth; - - T10 = exp(pParam->BSIM4v6ucs * log(0.5 + 0.5 * Vgsteff/VgsteffVth)); - T11 = pParam->BSIM4v6ud/T10; - dT11_dVg = - 0.5 * pParam->BSIM4v6ucs * T11 /(0.5 + 0.5*Vgsteff/VgsteffVth)/VgsteffVth; - - dDenomi_dVg = T2 * dT1_dVg + dT11_dVg; - dDenomi_dVd = 0.0; - dDenomi_dVb = T1 * pParam->BSIM4v6uc; - - T5 = T1 * T2 + T11; - } - - - - - - if (T5 >= -0.8) - { Denomi = 1.0 + T5; - } - else - { T9 = 1.0 / (7.0 + 10.0 * T5); - Denomi = (0.6 + T5) * T9; - T9 *= T9; - dDenomi_dVg *= T9; - dDenomi_dVd *= T9; - dDenomi_dVb *= T9; - } - - - here->BSIM4v6ueff = ueff = here->BSIM4v6u0temp / Denomi; - T9 = -ueff / Denomi; - dueff_dVg = T9 * dDenomi_dVg; - dueff_dVd = T9 * dDenomi_dVd; - dueff_dVb = T9 * dDenomi_dVb; - - /* Saturation Drain Voltage Vdsat */ - WVCox = Weff * here->BSIM4v6vsattemp * model->BSIM4v6coxe; - WVCoxRds = WVCox * Rds; - - Esat = 2.0 * here->BSIM4v6vsattemp / ueff; - here->BSIM4v6EsatL = EsatL = Esat * Leff; - T0 = -EsatL /ueff; - dEsatL_dVg = T0 * dueff_dVg; - dEsatL_dVd = T0 * dueff_dVd; - dEsatL_dVb = T0 * dueff_dVb; - - /* Sqrt() */ - a1 = pParam->BSIM4v6a1; - if (a1 == 0.0) - { Lambda = pParam->BSIM4v6a2; - dLambda_dVg = 0.0; - } - else if (a1 > 0.0) - { T0 = 1.0 - pParam->BSIM4v6a2; - T1 = T0 - pParam->BSIM4v6a1 * Vgsteff - 0.0001; - T2 = sqrt(T1 * T1 + 0.0004 * T0); - Lambda = pParam->BSIM4v6a2 + T0 - 0.5 * (T1 + T2); - dLambda_dVg = 0.5 * pParam->BSIM4v6a1 * (1.0 + T1 / T2); - } - else - { T1 = pParam->BSIM4v6a2 + pParam->BSIM4v6a1 * Vgsteff - 0.0001; - T2 = sqrt(T1 * T1 + 0.0004 * pParam->BSIM4v6a2); - Lambda = 0.5 * (T1 + T2); - dLambda_dVg = 0.5 * pParam->BSIM4v6a1 * (1.0 + T1 / T2); - } - - Vgst2Vtm = Vgsteff + 2.0 * Vtm; - if (Rds > 0) - { tmp2 = dRds_dVg / Rds + dWeff_dVg / Weff; - tmp3 = dRds_dVb / Rds + dWeff_dVb / Weff; - } - else - { tmp2 = dWeff_dVg / Weff; - tmp3 = dWeff_dVb / Weff; - } - if ((Rds == 0.0) && (Lambda == 1.0)) - { T0 = 1.0 / (Abulk * EsatL + Vgst2Vtm); - tmp1 = 0.0; - T1 = T0 * T0; - T2 = Vgst2Vtm * T0; - T3 = EsatL * Vgst2Vtm; - Vdsat = T3 * T0; - - dT0_dVg = -(Abulk * dEsatL_dVg + EsatL * dAbulk_dVg + 1.0) * T1; - dT0_dVd = -(Abulk * dEsatL_dVd) * T1; - dT0_dVb = -(Abulk * dEsatL_dVb + dAbulk_dVb * EsatL) * T1; - - dVdsat_dVg = T3 * dT0_dVg + T2 * dEsatL_dVg + EsatL * T0; - dVdsat_dVd = T3 * dT0_dVd + T2 * dEsatL_dVd; - dVdsat_dVb = T3 * dT0_dVb + T2 * dEsatL_dVb; - } - else - { tmp1 = dLambda_dVg / (Lambda * Lambda); - T9 = Abulk * WVCoxRds; - T8 = Abulk * T9; - T7 = Vgst2Vtm * T9; - T6 = Vgst2Vtm * WVCoxRds; - T0 = 2.0 * Abulk * (T9 - 1.0 + 1.0 / Lambda); - dT0_dVg = 2.0 * (T8 * tmp2 - Abulk * tmp1 - + (2.0 * T9 + 1.0 / Lambda - 1.0) * dAbulk_dVg); - - dT0_dVb = 2.0 * (T8 * (2.0 / Abulk * dAbulk_dVb + tmp3) - + (1.0 / Lambda - 1.0) * dAbulk_dVb); - dT0_dVd = 0.0; - T1 = Vgst2Vtm * (2.0 / Lambda - 1.0) + Abulk * EsatL + 3.0 * T7; - - dT1_dVg = (2.0 / Lambda - 1.0) - 2.0 * Vgst2Vtm * tmp1 - + Abulk * dEsatL_dVg + EsatL * dAbulk_dVg + 3.0 * (T9 - + T7 * tmp2 + T6 * dAbulk_dVg); - dT1_dVb = Abulk * dEsatL_dVb + EsatL * dAbulk_dVb - + 3.0 * (T6 * dAbulk_dVb + T7 * tmp3); - dT1_dVd = Abulk * dEsatL_dVd; - - T2 = Vgst2Vtm * (EsatL + 2.0 * T6); - dT2_dVg = EsatL + Vgst2Vtm * dEsatL_dVg - + T6 * (4.0 + 2.0 * Vgst2Vtm * tmp2); - dT2_dVb = Vgst2Vtm * (dEsatL_dVb + 2.0 * T6 * tmp3); - dT2_dVd = Vgst2Vtm * dEsatL_dVd; - - T3 = sqrt(T1 * T1 - 2.0 * T0 * T2); - Vdsat = (T1 - T3) / T0; - - dT3_dVg = (T1 * dT1_dVg - 2.0 * (T0 * dT2_dVg + T2 * dT0_dVg)) - / T3; - dT3_dVd = (T1 * dT1_dVd - 2.0 * (T0 * dT2_dVd + T2 * dT0_dVd)) - / T3; - dT3_dVb = (T1 * dT1_dVb - 2.0 * (T0 * dT2_dVb + T2 * dT0_dVb)) - / T3; - - dVdsat_dVg = (dT1_dVg - (T1 * dT1_dVg - dT0_dVg * T2 - - T0 * dT2_dVg) / T3 - Vdsat * dT0_dVg) / T0; - dVdsat_dVb = (dT1_dVb - (T1 * dT1_dVb - dT0_dVb * T2 - - T0 * dT2_dVb) / T3 - Vdsat * dT0_dVb) / T0; - dVdsat_dVd = (dT1_dVd - (T1 * dT1_dVd - T0 * dT2_dVd) / T3) / T0; - } - here->BSIM4v6vdsat = Vdsat; - - /* Calculate Vdseff */ - T1 = Vdsat - Vds - pParam->BSIM4v6delta; - dT1_dVg = dVdsat_dVg; - dT1_dVd = dVdsat_dVd - 1.0; - dT1_dVb = dVdsat_dVb; - - T2 = sqrt(T1 * T1 + 4.0 * pParam->BSIM4v6delta * Vdsat); - T0 = T1 / T2; - T9 = 2.0 * pParam->BSIM4v6delta; - T3 = T9 / T2; - dT2_dVg = T0 * dT1_dVg + T3 * dVdsat_dVg; - dT2_dVd = T0 * dT1_dVd + T3 * dVdsat_dVd; - dT2_dVb = T0 * dT1_dVb + T3 * dVdsat_dVb; - - if (T1 >= 0.0) - { Vdseff = Vdsat - 0.5 * (T1 + T2); - dVdseff_dVg = dVdsat_dVg - 0.5 * (dT1_dVg + dT2_dVg); - dVdseff_dVd = dVdsat_dVd - 0.5 * (dT1_dVd + dT2_dVd); - dVdseff_dVb = dVdsat_dVb - 0.5 * (dT1_dVb + dT2_dVb); - } - else - { T4 = T9 / (T2 - T1); - T5 = 1.0 - T4; - T6 = Vdsat * T4 / (T2 - T1); - Vdseff = Vdsat * T5; - dVdseff_dVg = dVdsat_dVg * T5 + T6 * (dT2_dVg - dT1_dVg); - dVdseff_dVd = dVdsat_dVd * T5 + T6 * (dT2_dVd - dT1_dVd); - dVdseff_dVb = dVdsat_dVb * T5 + T6 * (dT2_dVb - dT1_dVb); - } - - if (Vds == 0.0) - { Vdseff = 0.0; - dVdseff_dVg = 0.0; - dVdseff_dVb = 0.0; - } - - if (Vdseff > Vds) - Vdseff = Vds; - diffVds = Vds - Vdseff; - here->BSIM4v6Vdseff = Vdseff; - - /* Velocity Overshoot */ - if((model->BSIM4v6lambdaGiven) && (model->BSIM4v6lambda > 0.0) ) - { - T1 = Leff * ueff; - T2 = pParam->BSIM4v6lambda / T1; - T3 = -T2 / T1 * Leff; - dT2_dVd = T3 * dueff_dVd; - dT2_dVg = T3 * dueff_dVg; - dT2_dVb = T3 * dueff_dVb; - T5 = 1.0 / (Esat * pParam->BSIM4v6litl); - T4 = -T5 / EsatL; - dT5_dVg = dEsatL_dVg * T4; - dT5_dVd = dEsatL_dVd * T4; - dT5_dVb = dEsatL_dVb * T4; - T6 = 1.0 + diffVds * T5; - dT6_dVg = dT5_dVg * diffVds - dVdseff_dVg * T5; - dT6_dVd = dT5_dVd * diffVds + (1.0 - dVdseff_dVd) * T5; - dT6_dVb = dT5_dVb * diffVds - dVdseff_dVb * T5; - T7 = 2.0 / (T6 * T6 + 1.0); - T8 = 1.0 - T7; - T9 = T6 * T7 * T7; - dT8_dVg = T9 * dT6_dVg; - dT8_dVd = T9 * dT6_dVd; - dT8_dVb = T9 * dT6_dVb; - T10 = 1.0 + T2 * T8; - dT10_dVg = dT2_dVg * T8 + T2 * dT8_dVg; - dT10_dVd = dT2_dVd * T8 + T2 * dT8_dVd; - dT10_dVb = dT2_dVb * T8 + T2 * dT8_dVb; - if(T10 == 1.0) - dT10_dVg = dT10_dVd = dT10_dVb = 0.0; - - dEsatL_dVg *= T10; - dEsatL_dVg += EsatL * dT10_dVg; - dEsatL_dVd *= T10; - dEsatL_dVd += EsatL * dT10_dVd; - dEsatL_dVb *= T10; - dEsatL_dVb += EsatL * dT10_dVb; - EsatL *= T10; - Esat = EsatL / Leff; /* bugfix by Wenwei Yang (4.6.4) */ - here->BSIM4v6EsatL = EsatL; - } - - /* Calculate Vasat */ - tmp4 = 1.0 - 0.5 * Abulk * Vdsat / Vgst2Vtm; - T9 = WVCoxRds * Vgsteff; - T8 = T9 / Vgst2Vtm; - T0 = EsatL + Vdsat + 2.0 * T9 * tmp4; - - T7 = 2.0 * WVCoxRds * tmp4; - dT0_dVg = dEsatL_dVg + dVdsat_dVg + T7 * (1.0 + tmp2 * Vgsteff) - - T8 * (Abulk * dVdsat_dVg - Abulk * Vdsat / Vgst2Vtm - + Vdsat * dAbulk_dVg); - - dT0_dVb = dEsatL_dVb + dVdsat_dVb + T7 * tmp3 * Vgsteff - - T8 * (dAbulk_dVb * Vdsat + Abulk * dVdsat_dVb); - dT0_dVd = dEsatL_dVd + dVdsat_dVd - T8 * Abulk * dVdsat_dVd; - - T9 = WVCoxRds * Abulk; - T1 = 2.0 / Lambda - 1.0 + T9; - dT1_dVg = -2.0 * tmp1 + WVCoxRds * (Abulk * tmp2 + dAbulk_dVg); - dT1_dVb = dAbulk_dVb * WVCoxRds + T9 * tmp3; - - Vasat = T0 / T1; - dVasat_dVg = (dT0_dVg - Vasat * dT1_dVg) / T1; - dVasat_dVb = (dT0_dVb - Vasat * dT1_dVb) / T1; - dVasat_dVd = dT0_dVd / T1; - - /* Calculate Idl first */ - - tmp1 = here->BSIM4v6vtfbphi2; - tmp2 = 2.0e8 * model->BSIM4v6toxp; - dT0_dVg = 1.0 / tmp2; - T0 = (Vgsteff + tmp1) * dT0_dVg; - - tmp3 = exp(model->BSIM4v6bdos * 0.7 * log(T0)); - T1 = 1.0 + tmp3; - T2 = model->BSIM4v6bdos * 0.7 * tmp3 / T0; - Tcen = model->BSIM4v6ados * 1.9e-9 / T1; - dTcen_dVg = -Tcen * T2 * dT0_dVg / T1; - - Coxeff = epssub * model->BSIM4v6coxp - / (epssub + model->BSIM4v6coxp * Tcen); - dCoxeff_dVg = -Coxeff * Coxeff * dTcen_dVg / epssub; - - CoxeffWovL = Coxeff * Weff / Leff; - beta = ueff * CoxeffWovL; - T3 = ueff / Leff; - dbeta_dVg = CoxeffWovL * dueff_dVg + T3 - * (Weff * dCoxeff_dVg + Coxeff * dWeff_dVg); - dbeta_dVd = CoxeffWovL * dueff_dVd; - dbeta_dVb = CoxeffWovL * dueff_dVb + T3 * Coxeff * dWeff_dVb; - - here->BSIM4v6AbovVgst2Vtm = Abulk / Vgst2Vtm; - T0 = 1.0 - 0.5 * Vdseff * here->BSIM4v6AbovVgst2Vtm; - dT0_dVg = -0.5 * (Abulk * dVdseff_dVg - - Abulk * Vdseff / Vgst2Vtm + Vdseff * dAbulk_dVg) / Vgst2Vtm; - dT0_dVd = -0.5 * Abulk * dVdseff_dVd / Vgst2Vtm; - dT0_dVb = -0.5 * (Abulk * dVdseff_dVb + dAbulk_dVb * Vdseff) - / Vgst2Vtm; - - fgche1 = Vgsteff * T0; - dfgche1_dVg = Vgsteff * dT0_dVg + T0; - dfgche1_dVd = Vgsteff * dT0_dVd; - dfgche1_dVb = Vgsteff * dT0_dVb; - - T9 = Vdseff / EsatL; - fgche2 = 1.0 + T9; - dfgche2_dVg = (dVdseff_dVg - T9 * dEsatL_dVg) / EsatL; - dfgche2_dVd = (dVdseff_dVd - T9 * dEsatL_dVd) / EsatL; - dfgche2_dVb = (dVdseff_dVb - T9 * dEsatL_dVb) / EsatL; - - gche = beta * fgche1 / fgche2; - dgche_dVg = (beta * dfgche1_dVg + fgche1 * dbeta_dVg - - gche * dfgche2_dVg) / fgche2; - dgche_dVd = (beta * dfgche1_dVd + fgche1 * dbeta_dVd - - gche * dfgche2_dVd) / fgche2; - dgche_dVb = (beta * dfgche1_dVb + fgche1 * dbeta_dVb - - gche * dfgche2_dVb) / fgche2; - - T0 = 1.0 + gche * Rds; - Idl = gche / T0; - T1 = (1.0 - Idl * Rds) / T0; - T2 = Idl * Idl; - dIdl_dVg = T1 * dgche_dVg - T2 * dRds_dVg; - dIdl_dVd = T1 * dgche_dVd; - dIdl_dVb = T1 * dgche_dVb - T2 * dRds_dVb; - - /* Calculate degradation factor due to pocket implant */ - - if (pParam->BSIM4v6fprout <= 0.0) - { FP = 1.0; - dFP_dVg = 0.0; - } - else - { T9 = pParam->BSIM4v6fprout * sqrt(Leff) / Vgst2Vtm; - FP = 1.0 / (1.0 + T9); - dFP_dVg = FP * FP * T9 / Vgst2Vtm; - } - - /* Calculate VACLM */ - T8 = pParam->BSIM4v6pvag / EsatL; - T9 = T8 * Vgsteff; - if (T9 > -0.9) - { PvagTerm = 1.0 + T9; - dPvagTerm_dVg = T8 * (1.0 - Vgsteff * dEsatL_dVg / EsatL); - dPvagTerm_dVb = -T9 * dEsatL_dVb / EsatL; - dPvagTerm_dVd = -T9 * dEsatL_dVd / EsatL; - } - else - { T4 = 1.0 / (17.0 + 20.0 * T9); - PvagTerm = (0.8 + T9) * T4; - T4 *= T4; - dPvagTerm_dVg = T8 * (1.0 - Vgsteff * dEsatL_dVg / EsatL) * T4; - T9 *= T4 / EsatL; - dPvagTerm_dVb = -T9 * dEsatL_dVb; - dPvagTerm_dVd = -T9 * dEsatL_dVd; - } - - if ((pParam->BSIM4v6pclm > MIN_EXP) && (diffVds > 1.0e-10)) - { T0 = 1.0 + Rds * Idl; - dT0_dVg = dRds_dVg * Idl + Rds * dIdl_dVg; - dT0_dVd = Rds * dIdl_dVd; - dT0_dVb = dRds_dVb * Idl + Rds * dIdl_dVb; - - T2 = Vdsat / Esat; - T1 = Leff + T2; - dT1_dVg = (dVdsat_dVg - T2 * dEsatL_dVg / Leff) / Esat; - dT1_dVd = (dVdsat_dVd - T2 * dEsatL_dVd / Leff) / Esat; - dT1_dVb = (dVdsat_dVb - T2 * dEsatL_dVb / Leff) / Esat; - - Cclm = FP * PvagTerm * T0 * T1 / (pParam->BSIM4v6pclm * pParam->BSIM4v6litl); - dCclm_dVg = Cclm * (dFP_dVg / FP + dPvagTerm_dVg / PvagTerm - + dT0_dVg / T0 + dT1_dVg / T1); - dCclm_dVb = Cclm * (dPvagTerm_dVb / PvagTerm + dT0_dVb / T0 - + dT1_dVb / T1); - dCclm_dVd = Cclm * (dPvagTerm_dVd / PvagTerm + dT0_dVd / T0 - + dT1_dVd / T1); - VACLM = Cclm * diffVds; - - dVACLM_dVg = dCclm_dVg * diffVds - dVdseff_dVg * Cclm; - dVACLM_dVb = dCclm_dVb * diffVds - dVdseff_dVb * Cclm; - dVACLM_dVd = dCclm_dVd * diffVds + (1.0 - dVdseff_dVd) * Cclm; - } - else - { VACLM = Cclm = MAX_EXP; - dVACLM_dVd = dVACLM_dVg = dVACLM_dVb = 0.0; - dCclm_dVd = dCclm_dVg = dCclm_dVb = 0.0; - } - - /* Calculate VADIBL */ - if (pParam->BSIM4v6thetaRout > MIN_EXP) - { T8 = Abulk * Vdsat; - T0 = Vgst2Vtm * T8; - dT0_dVg = Vgst2Vtm * Abulk * dVdsat_dVg + T8 - + Vgst2Vtm * Vdsat * dAbulk_dVg; - dT0_dVb = Vgst2Vtm * (dAbulk_dVb * Vdsat + Abulk * dVdsat_dVb); - dT0_dVd = Vgst2Vtm * Abulk * dVdsat_dVd; - - T1 = Vgst2Vtm + T8; - dT1_dVg = 1.0 + Abulk * dVdsat_dVg + Vdsat * dAbulk_dVg; - dT1_dVb = Abulk * dVdsat_dVb + dAbulk_dVb * Vdsat; - dT1_dVd = Abulk * dVdsat_dVd; - - T9 = T1 * T1; - T2 = pParam->BSIM4v6thetaRout; - VADIBL = (Vgst2Vtm - T0 / T1) / T2; - dVADIBL_dVg = (1.0 - dT0_dVg / T1 + T0 * dT1_dVg / T9) / T2; - dVADIBL_dVb = (-dT0_dVb / T1 + T0 * dT1_dVb / T9) / T2; - dVADIBL_dVd = (-dT0_dVd / T1 + T0 * dT1_dVd / T9) / T2; - - T7 = pParam->BSIM4v6pdiblb * Vbseff; - if (T7 >= -0.9) - { T3 = 1.0 / (1.0 + T7); - VADIBL *= T3; - dVADIBL_dVg *= T3; - dVADIBL_dVb = (dVADIBL_dVb - VADIBL * pParam->BSIM4v6pdiblb) - * T3; - dVADIBL_dVd *= T3; - } - else - { T4 = 1.0 / (0.8 + T7); - T3 = (17.0 + 20.0 * T7) * T4; - dVADIBL_dVg *= T3; - dVADIBL_dVb = dVADIBL_dVb * T3 - - VADIBL * pParam->BSIM4v6pdiblb * T4 * T4; - dVADIBL_dVd *= T3; - VADIBL *= T3; - } - - dVADIBL_dVg = dVADIBL_dVg * PvagTerm + VADIBL * dPvagTerm_dVg; - dVADIBL_dVb = dVADIBL_dVb * PvagTerm + VADIBL * dPvagTerm_dVb; - dVADIBL_dVd = dVADIBL_dVd * PvagTerm + VADIBL * dPvagTerm_dVd; - VADIBL *= PvagTerm; - } - else - { VADIBL = MAX_EXP; - dVADIBL_dVd = dVADIBL_dVg = dVADIBL_dVb = 0.0; - } - - /* Calculate Va */ - Va = Vasat + VACLM; - dVa_dVg = dVasat_dVg + dVACLM_dVg; - dVa_dVb = dVasat_dVb + dVACLM_dVb; - dVa_dVd = dVasat_dVd + dVACLM_dVd; - - /* Calculate VADITS */ - T0 = pParam->BSIM4v6pditsd * Vds; - if (T0 > EXP_THRESHOLD) - { T1 = MAX_EXP; - dT1_dVd = 0; - } - else - { T1 = exp(T0); - dT1_dVd = T1 * pParam->BSIM4v6pditsd; - } - - if (pParam->BSIM4v6pdits > MIN_EXP) - { T2 = 1.0 + model->BSIM4v6pditsl * Leff; - VADITS = (1.0 + T2 * T1) / pParam->BSIM4v6pdits; - dVADITS_dVg = VADITS * dFP_dVg; - dVADITS_dVd = FP * T2 * dT1_dVd / pParam->BSIM4v6pdits; - VADITS *= FP; - } - else - { VADITS = MAX_EXP; - dVADITS_dVg = dVADITS_dVd = 0; - } - - /* Calculate VASCBE */ - if ((pParam->BSIM4v6pscbe2 > 0.0)&&(pParam->BSIM4v6pscbe1>=0.0)) /*4.6.2*/ - { if (diffVds > pParam->BSIM4v6pscbe1 * pParam->BSIM4v6litl - / EXP_THRESHOLD) - { T0 = pParam->BSIM4v6pscbe1 * pParam->BSIM4v6litl / diffVds; - VASCBE = Leff * exp(T0) / pParam->BSIM4v6pscbe2; - T1 = T0 * VASCBE / diffVds; - dVASCBE_dVg = T1 * dVdseff_dVg; - dVASCBE_dVd = -T1 * (1.0 - dVdseff_dVd); - dVASCBE_dVb = T1 * dVdseff_dVb; - } - else - { VASCBE = MAX_EXP * Leff/pParam->BSIM4v6pscbe2; - dVASCBE_dVg = dVASCBE_dVd = dVASCBE_dVb = 0.0; - } - } - else - { VASCBE = MAX_EXP; - dVASCBE_dVg = dVASCBE_dVd = dVASCBE_dVb = 0.0; - } - - /* Add DIBL to Ids */ - T9 = diffVds / VADIBL; - T0 = 1.0 + T9; - Idsa = Idl * T0; - dIdsa_dVg = T0 * dIdl_dVg - Idl * (dVdseff_dVg + T9 * dVADIBL_dVg) / VADIBL; - dIdsa_dVd = T0 * dIdl_dVd + Idl - * (1.0 - dVdseff_dVd - T9 * dVADIBL_dVd) / VADIBL; - dIdsa_dVb = T0 * dIdl_dVb - Idl * (dVdseff_dVb + T9 * dVADIBL_dVb) / VADIBL; - - /* Add DITS to Ids */ - T9 = diffVds / VADITS; - T0 = 1.0 + T9; - dIdsa_dVg = T0 * dIdsa_dVg - Idsa * (dVdseff_dVg + T9 * dVADITS_dVg) / VADITS; - dIdsa_dVd = T0 * dIdsa_dVd + Idsa - * (1.0 - dVdseff_dVd - T9 * dVADITS_dVd) / VADITS; - dIdsa_dVb = T0 * dIdsa_dVb - Idsa * dVdseff_dVb / VADITS; - Idsa *= T0; - - /* Add CLM to Ids */ - T0 = log(Va / Vasat); - dT0_dVg = dVa_dVg / Va - dVasat_dVg / Vasat; - dT0_dVb = dVa_dVb / Va - dVasat_dVb / Vasat; - dT0_dVd = dVa_dVd / Va - dVasat_dVd / Vasat; - T1 = T0 / Cclm; - T9 = 1.0 + T1; - dT9_dVg = (dT0_dVg - T1 * dCclm_dVg) / Cclm; - dT9_dVb = (dT0_dVb - T1 * dCclm_dVb) / Cclm; - dT9_dVd = (dT0_dVd - T1 * dCclm_dVd) / Cclm; - - dIdsa_dVg = dIdsa_dVg * T9 + Idsa * dT9_dVg; - dIdsa_dVb = dIdsa_dVb * T9 + Idsa * dT9_dVb; - dIdsa_dVd = dIdsa_dVd * T9 + Idsa * dT9_dVd; - Idsa *= T9; - - /* Substrate current begins */ - tmp = pParam->BSIM4v6alpha0 + pParam->BSIM4v6alpha1 * Leff; - if ((tmp <= 0.0) || (pParam->BSIM4v6beta0 <= 0.0)) - { Isub = Gbd = Gbb = Gbg = 0.0; - } - else - { T2 = tmp / Leff; - if (diffVds > pParam->BSIM4v6beta0 / EXP_THRESHOLD) - { T0 = -pParam->BSIM4v6beta0 / diffVds; - T1 = T2 * diffVds * exp(T0); - T3 = T1 / diffVds * (T0 - 1.0); - dT1_dVg = T3 * dVdseff_dVg; - dT1_dVd = T3 * (dVdseff_dVd - 1.0); - dT1_dVb = T3 * dVdseff_dVb; - } - else - { T3 = T2 * MIN_EXP; - T1 = T3 * diffVds; - dT1_dVg = -T3 * dVdseff_dVg; - dT1_dVd = T3 * (1.0 - dVdseff_dVd); - dT1_dVb = -T3 * dVdseff_dVb; - } - T4 = Idsa * Vdseff; - Isub = T1 * T4; - Gbg = T1 * (dIdsa_dVg * Vdseff + Idsa * dVdseff_dVg) - + T4 * dT1_dVg; - Gbd = T1 * (dIdsa_dVd * Vdseff + Idsa * dVdseff_dVd) - + T4 * dT1_dVd; - Gbb = T1 * (dIdsa_dVb * Vdseff + Idsa * dVdseff_dVb) - + T4 * dT1_dVb; - - Gbd += Gbg * dVgsteff_dVd; - Gbb += Gbg * dVgsteff_dVb; - Gbg *= dVgsteff_dVg; - Gbb *= dVbseff_dVb; - } - here->BSIM4v6csub = Isub; - here->BSIM4v6gbbs = Gbb; - here->BSIM4v6gbgs = Gbg; - here->BSIM4v6gbds = Gbd; - - /* Add SCBE to Ids */ - T9 = diffVds / VASCBE; - T0 = 1.0 + T9; - Ids = Idsa * T0; - - Gm = T0 * dIdsa_dVg - Idsa - * (dVdseff_dVg + T9 * dVASCBE_dVg) / VASCBE; - Gds = T0 * dIdsa_dVd + Idsa - * (1.0 - dVdseff_dVd - T9 * dVASCBE_dVd) / VASCBE; - Gmb = T0 * dIdsa_dVb - Idsa - * (dVdseff_dVb + T9 * dVASCBE_dVb) / VASCBE; - - - tmp1 = Gds + Gm * dVgsteff_dVd; - tmp2 = Gmb + Gm * dVgsteff_dVb; - tmp3 = Gm; - - Gm = (Ids * dVdseff_dVg + Vdseff * tmp3) * dVgsteff_dVg; - Gds = Ids * (dVdseff_dVd + dVdseff_dVg * dVgsteff_dVd) - + Vdseff * tmp1; - Gmb = (Ids * (dVdseff_dVb + dVdseff_dVg * dVgsteff_dVb) - + Vdseff * tmp2) * dVbseff_dVb; - - cdrain = Ids * Vdseff; - - /* Source End Velocity Limit */ - if((model->BSIM4v6vtlGiven) && (model->BSIM4v6vtl > 0.0) ) { - T12 = 1.0 / Leff / CoxeffWovL; - T11 = T12 / Vgsteff; - T10 = -T11 / Vgsteff; - vs = cdrain * T11; /* vs */ - dvs_dVg = Gm * T11 + cdrain * T10 * dVgsteff_dVg; - dvs_dVd = Gds * T11 + cdrain * T10 * dVgsteff_dVd; - dvs_dVb = Gmb * T11 + cdrain * T10 * dVgsteff_dVb; - T0 = 2 * MM; - T1 = vs / (pParam->BSIM4v6vtl * pParam->BSIM4v6tfactor); - if(T1 > 0.0) - { T2 = 1.0 + exp(T0 * log(T1)); - T3 = (T2 - 1.0) * T0 / vs; - Fsevl = 1.0 / exp(log(T2)/ T0); - dT2_dVg = T3 * dvs_dVg; - dT2_dVd = T3 * dvs_dVd; - dT2_dVb = T3 * dvs_dVb; - T4 = -1.0 / T0 * Fsevl / T2; - dFsevl_dVg = T4 * dT2_dVg; - dFsevl_dVd = T4 * dT2_dVd; - dFsevl_dVb = T4 * dT2_dVb; - } else { - Fsevl = 1.0; - dFsevl_dVg = 0.0; - dFsevl_dVd = 0.0; - dFsevl_dVb = 0.0; - } - Gm *=Fsevl; - Gm += cdrain * dFsevl_dVg; - Gmb *=Fsevl; - Gmb += cdrain * dFsevl_dVb; - Gds *=Fsevl; - Gds += cdrain * dFsevl_dVd; - - cdrain *= Fsevl; - } - - here->BSIM4v6gds = Gds; - here->BSIM4v6gm = Gm; - here->BSIM4v6gmbs = Gmb; - here->BSIM4v6IdovVds = Ids; - if( here->BSIM4v6IdovVds <= 1.0e-9) here->BSIM4v6IdovVds = 1.0e-9; - - /* Calculate Rg */ - if ((here->BSIM4v6rgateMod > 1) || - (here->BSIM4v6trnqsMod != 0) || (here->BSIM4v6acnqsMod != 0)) - { T9 = pParam->BSIM4v6xrcrg2 * model->BSIM4v6vtm; - T0 = T9 * beta; - dT0_dVd = (dbeta_dVd + dbeta_dVg * dVgsteff_dVd) * T9; - dT0_dVb = (dbeta_dVb + dbeta_dVg * dVgsteff_dVb) * T9; - dT0_dVg = dbeta_dVg * T9; - - here->BSIM4v6gcrg = pParam->BSIM4v6xrcrg1 * ( T0 + Ids); - here->BSIM4v6gcrgd = pParam->BSIM4v6xrcrg1 * (dT0_dVd + tmp1); - here->BSIM4v6gcrgb = pParam->BSIM4v6xrcrg1 * (dT0_dVb + tmp2) - * dVbseff_dVb; - here->BSIM4v6gcrgg = pParam->BSIM4v6xrcrg1 * (dT0_dVg + tmp3) - * dVgsteff_dVg; - - if (here->BSIM4v6nf != 1.0) - { here->BSIM4v6gcrg *= here->BSIM4v6nf; - here->BSIM4v6gcrgg *= here->BSIM4v6nf; - here->BSIM4v6gcrgd *= here->BSIM4v6nf; - here->BSIM4v6gcrgb *= here->BSIM4v6nf; - } - - if (here->BSIM4v6rgateMod == 2) - { T10 = here->BSIM4v6grgeltd * here->BSIM4v6grgeltd; - T11 = here->BSIM4v6grgeltd + here->BSIM4v6gcrg; - here->BSIM4v6gcrg = here->BSIM4v6grgeltd * here->BSIM4v6gcrg / T11; - T12 = T10 / T11 / T11; - here->BSIM4v6gcrgg *= T12; - here->BSIM4v6gcrgd *= T12; - here->BSIM4v6gcrgb *= T12; - } - here->BSIM4v6gcrgs = -(here->BSIM4v6gcrgg + here->BSIM4v6gcrgd - + here->BSIM4v6gcrgb); - } - - - /* Calculate bias-dependent external S/D resistance */ - if (model->BSIM4v6rdsMod) - { /* Rs(V) */ - T0 = vgs - pParam->BSIM4v6vfbsd; - T1 = sqrt(T0 * T0 + 1.0e-4); - vgs_eff = 0.5 * (T0 + T1); - dvgs_eff_dvg = vgs_eff / T1; - - T0 = 1.0 + pParam->BSIM4v6prwg * vgs_eff; - dT0_dvg = -pParam->BSIM4v6prwg / T0 / T0 * dvgs_eff_dvg; - T1 = -pParam->BSIM4v6prwb * vbs; - dT1_dvb = -pParam->BSIM4v6prwb; - - T2 = 1.0 / T0 + T1; - T3 = T2 + sqrt(T2 * T2 + 0.01); - dT3_dvg = T3 / (T3 - T2); - dT3_dvb = dT3_dvg * dT1_dvb; - dT3_dvg *= dT0_dvg; - - T4 = pParam->BSIM4v6rs0 * 0.5; - Rs = pParam->BSIM4v6rswmin + T3 * T4; - dRs_dvg = T4 * dT3_dvg; - dRs_dvb = T4 * dT3_dvb; - - T0 = 1.0 + here->BSIM4v6sourceConductance * Rs; - here->BSIM4v6gstot = here->BSIM4v6sourceConductance / T0; - T0 = -here->BSIM4v6gstot * here->BSIM4v6gstot; - dgstot_dvd = 0.0; /* place holder */ - dgstot_dvg = T0 * dRs_dvg; - dgstot_dvb = T0 * dRs_dvb; - dgstot_dvs = -(dgstot_dvg + dgstot_dvb + dgstot_dvd); - - /* Rd(V) */ - T0 = vgd - pParam->BSIM4v6vfbsd; - T1 = sqrt(T0 * T0 + 1.0e-4); - vgd_eff = 0.5 * (T0 + T1); - dvgd_eff_dvg = vgd_eff / T1; - - T0 = 1.0 + pParam->BSIM4v6prwg * vgd_eff; - dT0_dvg = -pParam->BSIM4v6prwg / T0 / T0 * dvgd_eff_dvg; - T1 = -pParam->BSIM4v6prwb * vbd; - dT1_dvb = -pParam->BSIM4v6prwb; - - T2 = 1.0 / T0 + T1; - T3 = T2 + sqrt(T2 * T2 + 0.01); - dT3_dvg = T3 / (T3 - T2); - dT3_dvb = dT3_dvg * dT1_dvb; - dT3_dvg *= dT0_dvg; - - T4 = pParam->BSIM4v6rd0 * 0.5; - Rd = pParam->BSIM4v6rdwmin + T3 * T4; - dRd_dvg = T4 * dT3_dvg; - dRd_dvb = T4 * dT3_dvb; - - T0 = 1.0 + here->BSIM4v6drainConductance * Rd; - here->BSIM4v6gdtot = here->BSIM4v6drainConductance / T0; - T0 = -here->BSIM4v6gdtot * here->BSIM4v6gdtot; - dgdtot_dvs = 0.0; - dgdtot_dvg = T0 * dRd_dvg; - dgdtot_dvb = T0 * dRd_dvb; - dgdtot_dvd = -(dgdtot_dvg + dgdtot_dvb + dgdtot_dvs); - - here->BSIM4v6gstotd = vses * dgstot_dvd; - here->BSIM4v6gstotg = vses * dgstot_dvg; - here->BSIM4v6gstots = vses * dgstot_dvs; - here->BSIM4v6gstotb = vses * dgstot_dvb; - - T2 = vdes - vds; - here->BSIM4v6gdtotd = T2 * dgdtot_dvd; - here->BSIM4v6gdtotg = T2 * dgdtot_dvg; - here->BSIM4v6gdtots = T2 * dgdtot_dvs; - here->BSIM4v6gdtotb = T2 * dgdtot_dvb; - } - else /* WDLiu: for bypass */ - { here->BSIM4v6gstot = here->BSIM4v6gstotd = here->BSIM4v6gstotg = 0.0; - here->BSIM4v6gstots = here->BSIM4v6gstotb = 0.0; - here->BSIM4v6gdtot = here->BSIM4v6gdtotd = here->BSIM4v6gdtotg = 0.0; - here->BSIM4v6gdtots = here->BSIM4v6gdtotb = 0.0; - } - - /* Calculate GIDL current */ - vgs_eff = here->BSIM4v6vgs_eff; - dvgs_eff_dvg = here->BSIM4v6dvgs_eff_dvg; - if(model->BSIM4v6mtrlMod == 0) - T0 = 3.0 * toxe; - else - T0 = model->BSIM4v6epsrsub * toxe / epsrox; - - if(model->BSIM4v6mtrlMod ==0) - T1 = (vds - vgs_eff - pParam->BSIM4v6egidl ) / T0; - else - T1 = (vds - vgs_eff - pParam->BSIM4v6egidl + pParam->BSIM4v6vfbsd) / T0; - if ((pParam->BSIM4v6agidl <= 0.0) || (pParam->BSIM4v6bgidl <= 0.0) - || (T1 <= 0.0) || (pParam->BSIM4v6cgidl <= 0.0) || (vbd > 0.0)) - Igidl = Ggidld = Ggidlg = Ggidlb = 0.0; - else { - dT1_dVd = 1.0 / T0; - dT1_dVg = -dvgs_eff_dvg * dT1_dVd; - T2 = pParam->BSIM4v6bgidl / T1; - if (T2 < 100.0) - { Igidl = pParam->BSIM4v6agidl * pParam->BSIM4v6weffCJ * T1 * exp(-T2); - T3 = Igidl * (1.0 + T2) / T1; - Ggidld = T3 * dT1_dVd; - Ggidlg = T3 * dT1_dVg; - } - else - { Igidl = pParam->BSIM4v6agidl * pParam->BSIM4v6weffCJ * 3.720075976e-44; - Ggidld = Igidl * dT1_dVd; - Ggidlg = Igidl * dT1_dVg; - Igidl *= T1; - } - - T4 = vbd * vbd; - T5 = -vbd * T4; - T6 = pParam->BSIM4v6cgidl + T5; - T7 = T5 / T6; - T8 = 3.0 * pParam->BSIM4v6cgidl * T4 / T6 / T6; - Ggidld = Ggidld * T7 + Igidl * T8; - Ggidlg = Ggidlg * T7; - Ggidlb = -Igidl * T8; - Igidl *= T7; - } - here->BSIM4v6Igidl = Igidl; - here->BSIM4v6ggidld = Ggidld; - here->BSIM4v6ggidlg = Ggidlg; - here->BSIM4v6ggidlb = Ggidlb; - - /* Calculate GISL current */ - vgd_eff = here->BSIM4v6vgd_eff; - dvgd_eff_dvg = here->BSIM4v6dvgd_eff_dvg; - - if(model->BSIM4v6mtrlMod ==0) - T1 = (-vds - vgd_eff - pParam->BSIM4v6egisl ) / T0; - else - T1 = (-vds - vgd_eff - pParam->BSIM4v6egisl + pParam->BSIM4v6vfbsd ) / T0; - - if ((pParam->BSIM4v6agisl <= 0.0) || (pParam->BSIM4v6bgisl <= 0.0) - || (T1 <= 0.0) || (pParam->BSIM4v6cgisl <= 0.0) || (vbs > 0.0)) - Igisl = Ggisls = Ggislg = Ggislb = 0.0; - else { - dT1_dVd = 1.0 / T0; - dT1_dVg = -dvgd_eff_dvg * dT1_dVd; - T2 = pParam->BSIM4v6bgisl / T1; - if (T2 < 100.0) - { Igisl = pParam->BSIM4v6agisl * pParam->BSIM4v6weffCJ * T1 * exp(-T2); - T3 = Igisl * (1.0 + T2) / T1; - Ggisls = T3 * dT1_dVd; - Ggislg = T3 * dT1_dVg; - } - else - { Igisl = pParam->BSIM4v6agisl * pParam->BSIM4v6weffCJ * 3.720075976e-44; - Ggisls = Igisl * dT1_dVd; - Ggislg = Igisl * dT1_dVg; - Igisl *= T1; - } - - T4 = vbs * vbs; - T5 = -vbs * T4; - T6 = pParam->BSIM4v6cgisl + T5; - T7 = T5 / T6; - T8 = 3.0 * pParam->BSIM4v6cgisl * T4 / T6 / T6; - Ggisls = Ggisls * T7 + Igisl * T8; - Ggislg = Ggislg * T7; - Ggislb = -Igisl * T8; - Igisl *= T7; - } - here->BSIM4v6Igisl = Igisl; - here->BSIM4v6ggisls = Ggisls; - here->BSIM4v6ggislg = Ggislg; - here->BSIM4v6ggislb = Ggislb; - - - /* Calculate gate tunneling current */ - if ((model->BSIM4v6igcMod != 0) || (model->BSIM4v6igbMod != 0)) - { Vfb = here->BSIM4v6vfbzb; - V3 = Vfb - Vgs_eff + Vbseff - DELTA_3; - if (Vfb <= 0.0) - T0 = sqrt(V3 * V3 - 4.0 * DELTA_3 * Vfb); - else - T0 = sqrt(V3 * V3 + 4.0 * DELTA_3 * Vfb); - T1 = 0.5 * (1.0 + V3 / T0); - Vfbeff = Vfb - 0.5 * (V3 + T0); - dVfbeff_dVg = T1 * dVgs_eff_dVg; - dVfbeff_dVb = -T1; /* WDLiu: -No surprise? No. -Good! */ - - Voxacc = Vfb - Vfbeff; - dVoxacc_dVg = -dVfbeff_dVg; - dVoxacc_dVb = -dVfbeff_dVb; - if (Voxacc < 0.0) /* WDLiu: Avoiding numerical instability. */ - Voxacc = dVoxacc_dVg = dVoxacc_dVb = 0.0; - - T0 = 0.5 * pParam->BSIM4v6k1ox; - T3 = Vgs_eff - Vfbeff - Vbseff - Vgsteff; - if (pParam->BSIM4v6k1ox == 0.0) - Voxdepinv = dVoxdepinv_dVg = dVoxdepinv_dVd - = dVoxdepinv_dVb = 0.0; - else if (T3 < 0.0) - { Voxdepinv = -T3; - dVoxdepinv_dVg = -dVgs_eff_dVg + dVfbeff_dVg - + dVgsteff_dVg; - dVoxdepinv_dVd = dVgsteff_dVd; - dVoxdepinv_dVb = dVfbeff_dVb + 1.0 + dVgsteff_dVb; - } - else - { T1 = sqrt(T0 * T0 + T3); - T2 = T0 / T1; - Voxdepinv = pParam->BSIM4v6k1ox * (T1 - T0); - dVoxdepinv_dVg = T2 * (dVgs_eff_dVg - dVfbeff_dVg - - dVgsteff_dVg); - dVoxdepinv_dVd = -T2 * dVgsteff_dVd; - dVoxdepinv_dVb = -T2 * (dVfbeff_dVb + 1.0 + dVgsteff_dVb); - } - - Voxdepinv += Vgsteff; - dVoxdepinv_dVg += dVgsteff_dVg; - dVoxdepinv_dVd += dVgsteff_dVd; - dVoxdepinv_dVb += dVgsteff_dVb; - } - - if(model->BSIM4v6tempMod < 2) - tmp = Vtm; - else /* model->BSIM4v6tempMod = 2 , 3*/ - tmp = Vtm0; - if (model->BSIM4v6igcMod) - { T0 = tmp * pParam->BSIM4v6nigc; - if(model->BSIM4v6igcMod == 1) { - VxNVt = (Vgs_eff - model->BSIM4v6type * here->BSIM4v6vth0) / T0; - if (VxNVt > EXP_THRESHOLD) - { Vaux = Vgs_eff - model->BSIM4v6type * here->BSIM4v6vth0; - dVaux_dVg = dVgs_eff_dVg; - dVaux_dVd = 0.0; - dVaux_dVb = 0.0; - } - } else if (model->BSIM4v6igcMod == 2) { - VxNVt = (Vgs_eff - here->BSIM4v6von) / T0; - if (VxNVt > EXP_THRESHOLD) - { Vaux = Vgs_eff - here->BSIM4v6von; - dVaux_dVg = dVgs_eff_dVg; - dVaux_dVd = -dVth_dVd; - dVaux_dVb = -dVth_dVb; - } - } - if (VxNVt < -EXP_THRESHOLD) - { Vaux = T0 * log(1.0 + MIN_EXP); - dVaux_dVg = dVaux_dVd = dVaux_dVb = 0.0; - } - else if ((VxNVt >= -EXP_THRESHOLD) && (VxNVt <= EXP_THRESHOLD)) - { ExpVxNVt = exp(VxNVt); - Vaux = T0 * log(1.0 + ExpVxNVt); - dVaux_dVg = ExpVxNVt / (1.0 + ExpVxNVt); - if(model->BSIM4v6igcMod == 1) { - dVaux_dVd = 0.0; - dVaux_dVb = 0.0; - } else if (model->BSIM4v6igcMod == 2) { - dVaux_dVd = -dVgs_eff_dVg * dVth_dVd; - dVaux_dVb = -dVgs_eff_dVg * dVth_dVb; - } - dVaux_dVg *= dVgs_eff_dVg; - } - - T2 = Vgs_eff * Vaux; - dT2_dVg = dVgs_eff_dVg * Vaux + Vgs_eff * dVaux_dVg; - dT2_dVd = Vgs_eff * dVaux_dVd; - dT2_dVb = Vgs_eff * dVaux_dVb; - - T11 = pParam->BSIM4v6Aechvb; - T12 = pParam->BSIM4v6Bechvb; - T3 = pParam->BSIM4v6aigc * pParam->BSIM4v6cigc - - pParam->BSIM4v6bigc; - T4 = pParam->BSIM4v6bigc * pParam->BSIM4v6cigc; - T5 = T12 * (pParam->BSIM4v6aigc + T3 * Voxdepinv - - T4 * Voxdepinv * Voxdepinv); - - if (T5 > EXP_THRESHOLD) - { T6 = MAX_EXP; - dT6_dVg = dT6_dVd = dT6_dVb = 0.0; - } - else if (T5 < -EXP_THRESHOLD) - { T6 = MIN_EXP; - dT6_dVg = dT6_dVd = dT6_dVb = 0.0; - } - else - { T6 = exp(T5); - dT6_dVg = T6 * T12 * (T3 - 2.0 * T4 * Voxdepinv); - dT6_dVd = dT6_dVg * dVoxdepinv_dVd; - dT6_dVb = dT6_dVg * dVoxdepinv_dVb; - dT6_dVg *= dVoxdepinv_dVg; - } - - Igc = T11 * T2 * T6; - dIgc_dVg = T11 * (T2 * dT6_dVg + T6 * dT2_dVg); - dIgc_dVd = T11 * (T2 * dT6_dVd + T6 * dT2_dVd); - dIgc_dVb = T11 * (T2 * dT6_dVb + T6 * dT2_dVb); - - if (model->BSIM4v6pigcdGiven) - { Pigcd = pParam->BSIM4v6pigcd; - dPigcd_dVg = dPigcd_dVd = dPigcd_dVb = 0.0; - } - else - { T11 = pParam->BSIM4v6Bechvb * toxe; - T12 = Vgsteff + 1.0e-20; - T13 = T11 / T12 / T12; - T14 = -T13 / T12; - Pigcd = T13 * (1.0 - 0.5 * Vdseff / T12); - dPigcd_dVg = T14 * (2.0 + 0.5 * (dVdseff_dVg - - 3.0 * Vdseff / T12)); - dPigcd_dVd = 0.5 * T14 * dVdseff_dVd; - dPigcd_dVb = 0.5 * T14 * dVdseff_dVb; - } - - T7 = -Pigcd * Vdseff; /* bugfix */ - dT7_dVg = -Vdseff * dPigcd_dVg - Pigcd * dVdseff_dVg; - dT7_dVd = -Vdseff * dPigcd_dVd - Pigcd * dVdseff_dVd + dT7_dVg * dVgsteff_dVd; - dT7_dVb = -Vdseff * dPigcd_dVb - Pigcd * dVdseff_dVb + dT7_dVg * dVgsteff_dVb; - dT7_dVg *= dVgsteff_dVg; - dT7_dVb *= dVbseff_dVb; - T8 = T7 * T7 + 2.0e-4; - dT8_dVg = 2.0 * T7; - dT8_dVd = dT8_dVg * dT7_dVd; - dT8_dVb = dT8_dVg * dT7_dVb; - dT8_dVg *= dT7_dVg; - - if (T7 > EXP_THRESHOLD) - { T9 = MAX_EXP; - dT9_dVg = dT9_dVd = dT9_dVb = 0.0; - } - else if (T7 < -EXP_THRESHOLD) - { T9 = MIN_EXP; - dT9_dVg = dT9_dVd = dT9_dVb = 0.0; - } - else - { T9 = exp(T7); - dT9_dVg = T9 * dT7_dVg; - dT9_dVd = T9 * dT7_dVd; - dT9_dVb = T9 * dT7_dVb; - } - - T0 = T8 * T8; - T1 = T9 - 1.0 + 1.0e-4; - T10 = (T1 - T7) / T8; - dT10_dVg = (dT9_dVg - dT7_dVg - T10 * dT8_dVg) / T8; - dT10_dVd = (dT9_dVd - dT7_dVd - T10 * dT8_dVd) / T8; - dT10_dVb = (dT9_dVb - dT7_dVb - T10 * dT8_dVb) / T8; - - Igcs = Igc * T10; - dIgcs_dVg = dIgc_dVg * T10 + Igc * dT10_dVg; - dIgcs_dVd = dIgc_dVd * T10 + Igc * dT10_dVd; - dIgcs_dVb = dIgc_dVb * T10 + Igc * dT10_dVb; - - T1 = T9 - 1.0 - 1.0e-4; - T10 = (T7 * T9 - T1) / T8; - dT10_dVg = (dT7_dVg * T9 + (T7 - 1.0) * dT9_dVg - - T10 * dT8_dVg) / T8; - dT10_dVd = (dT7_dVd * T9 + (T7 - 1.0) * dT9_dVd - - T10 * dT8_dVd) / T8; - dT10_dVb = (dT7_dVb * T9 + (T7 - 1.0) * dT9_dVb - - T10 * dT8_dVb) / T8; - Igcd = Igc * T10; - dIgcd_dVg = dIgc_dVg * T10 + Igc * dT10_dVg; - dIgcd_dVd = dIgc_dVd * T10 + Igc * dT10_dVd; - dIgcd_dVb = dIgc_dVb * T10 + Igc * dT10_dVb; - - here->BSIM4v6Igcs = Igcs; - here->BSIM4v6gIgcsg = dIgcs_dVg; - here->BSIM4v6gIgcsd = dIgcs_dVd; - here->BSIM4v6gIgcsb = dIgcs_dVb * dVbseff_dVb; - here->BSIM4v6Igcd = Igcd; - here->BSIM4v6gIgcdg = dIgcd_dVg; - here->BSIM4v6gIgcdd = dIgcd_dVd; - here->BSIM4v6gIgcdb = dIgcd_dVb * dVbseff_dVb; - - T0 = vgs - (pParam->BSIM4v6vfbsd + pParam->BSIM4v6vfbsdoff); - vgs_eff = sqrt(T0 * T0 + 1.0e-4); - dvgs_eff_dvg = T0 / vgs_eff; - - T2 = vgs * vgs_eff; - dT2_dVg = vgs * dvgs_eff_dvg + vgs_eff; - T11 = pParam->BSIM4v6AechvbEdgeS; - T12 = pParam->BSIM4v6BechvbEdge; - T3 = pParam->BSIM4v6aigs * pParam->BSIM4v6cigs - - pParam->BSIM4v6bigs; - T4 = pParam->BSIM4v6bigs * pParam->BSIM4v6cigs; - T5 = T12 * (pParam->BSIM4v6aigs + T3 * vgs_eff - - T4 * vgs_eff * vgs_eff); - if (T5 > EXP_THRESHOLD) - { T6 = MAX_EXP; - dT6_dVg = 0.0; - } - else if (T5 < -EXP_THRESHOLD) - { T6 = MIN_EXP; - dT6_dVg = 0.0; - } - else - { T6 = exp(T5); - dT6_dVg = T6 * T12 * (T3 - 2.0 * T4 * vgs_eff) - * dvgs_eff_dvg; - } - Igs = T11 * T2 * T6; - dIgs_dVg = T11 * (T2 * dT6_dVg + T6 * dT2_dVg); - dIgs_dVs = -dIgs_dVg; - - - T0 = vgd - (pParam->BSIM4v6vfbsd + pParam->BSIM4v6vfbsdoff); - vgd_eff = sqrt(T0 * T0 + 1.0e-4); - dvgd_eff_dvg = T0 / vgd_eff; - - T2 = vgd * vgd_eff; - dT2_dVg = vgd * dvgd_eff_dvg + vgd_eff; - T11 = pParam->BSIM4v6AechvbEdgeD; - T3 = pParam->BSIM4v6aigd * pParam->BSIM4v6cigd - - pParam->BSIM4v6bigd; - T4 = pParam->BSIM4v6bigd * pParam->BSIM4v6cigd; - T5 = T12 * (pParam->BSIM4v6aigd + T3 * vgd_eff - - T4 * vgd_eff * vgd_eff); - if (T5 > EXP_THRESHOLD) - { T6 = MAX_EXP; - dT6_dVg = 0.0; - } - else if (T5 < -EXP_THRESHOLD) - { T6 = MIN_EXP; - dT6_dVg = 0.0; - } - else - { T6 = exp(T5); - dT6_dVg = T6 * T12 * (T3 - 2.0 * T4 * vgd_eff) - * dvgd_eff_dvg; - } - Igd = T11 * T2 * T6; - dIgd_dVg = T11 * (T2 * dT6_dVg + T6 * dT2_dVg); - dIgd_dVd = -dIgd_dVg; - - here->BSIM4v6Igs = Igs; - here->BSIM4v6gIgsg = dIgs_dVg; - here->BSIM4v6gIgss = dIgs_dVs; - here->BSIM4v6Igd = Igd; - here->BSIM4v6gIgdg = dIgd_dVg; - here->BSIM4v6gIgdd = dIgd_dVd; - } - else - { here->BSIM4v6Igcs = here->BSIM4v6gIgcsg = here->BSIM4v6gIgcsd - = here->BSIM4v6gIgcsb = 0.0; - here->BSIM4v6Igcd = here->BSIM4v6gIgcdg = here->BSIM4v6gIgcdd - = here->BSIM4v6gIgcdb = 0.0; - here->BSIM4v6Igs = here->BSIM4v6gIgsg = here->BSIM4v6gIgss = 0.0; - here->BSIM4v6Igd = here->BSIM4v6gIgdg = here->BSIM4v6gIgdd = 0.0; - } - - if (model->BSIM4v6igbMod) - { T0 = tmp * pParam->BSIM4v6nigbacc; - T1 = -Vgs_eff + Vbseff + Vfb; - VxNVt = T1 / T0; - if (VxNVt > EXP_THRESHOLD) - { Vaux = T1; - dVaux_dVg = -dVgs_eff_dVg; - dVaux_dVb = 1.0; - } - else if (VxNVt < -EXP_THRESHOLD) - { Vaux = T0 * log(1.0 + MIN_EXP); - dVaux_dVg = dVaux_dVb = 0.0; - } - else - { ExpVxNVt = exp(VxNVt); - Vaux = T0 * log(1.0 + ExpVxNVt); - dVaux_dVb = ExpVxNVt / (1.0 + ExpVxNVt); - dVaux_dVg = -dVaux_dVb * dVgs_eff_dVg; - } - - T2 = (Vgs_eff - Vbseff) * Vaux; - dT2_dVg = dVgs_eff_dVg * Vaux + (Vgs_eff - Vbseff) * dVaux_dVg; - dT2_dVb = -Vaux + (Vgs_eff - Vbseff) * dVaux_dVb; - - T11 = 4.97232e-7 * pParam->BSIM4v6weff - * pParam->BSIM4v6leff * pParam->BSIM4v6ToxRatio; - T12 = -7.45669e11 * toxe; - T3 = pParam->BSIM4v6aigbacc * pParam->BSIM4v6cigbacc - - pParam->BSIM4v6bigbacc; - T4 = pParam->BSIM4v6bigbacc * pParam->BSIM4v6cigbacc; - T5 = T12 * (pParam->BSIM4v6aigbacc + T3 * Voxacc - - T4 * Voxacc * Voxacc); - - if (T5 > EXP_THRESHOLD) - { T6 = MAX_EXP; - dT6_dVg = dT6_dVb = 0.0; - } - else if (T5 < -EXP_THRESHOLD) - { T6 = MIN_EXP; - dT6_dVg = dT6_dVb = 0.0; - } - else - { T6 = exp(T5); - dT6_dVg = T6 * T12 * (T3 - 2.0 * T4 * Voxacc); - dT6_dVb = dT6_dVg * dVoxacc_dVb; - dT6_dVg *= dVoxacc_dVg; - } - - Igbacc = T11 * T2 * T6; - dIgbacc_dVg = T11 * (T2 * dT6_dVg + T6 * dT2_dVg); - dIgbacc_dVb = T11 * (T2 * dT6_dVb + T6 * dT2_dVb); - - - T0 = tmp * pParam->BSIM4v6nigbinv; - T1 = Voxdepinv - pParam->BSIM4v6eigbinv; - VxNVt = T1 / T0; - if (VxNVt > EXP_THRESHOLD) - { Vaux = T1; - dVaux_dVg = dVoxdepinv_dVg; - dVaux_dVd = dVoxdepinv_dVd; - dVaux_dVb = dVoxdepinv_dVb; - } - else if (VxNVt < -EXP_THRESHOLD) - { Vaux = T0 * log(1.0 + MIN_EXP); - dVaux_dVg = dVaux_dVd = dVaux_dVb = 0.0; - } - else - { ExpVxNVt = exp(VxNVt); - Vaux = T0 * log(1.0 + ExpVxNVt); - dVaux_dVg = ExpVxNVt / (1.0 + ExpVxNVt); - dVaux_dVd = dVaux_dVg * dVoxdepinv_dVd; - dVaux_dVb = dVaux_dVg * dVoxdepinv_dVb; - dVaux_dVg *= dVoxdepinv_dVg; - } - - T2 = (Vgs_eff - Vbseff) * Vaux; - dT2_dVg = dVgs_eff_dVg * Vaux + (Vgs_eff - Vbseff) * dVaux_dVg; - dT2_dVd = (Vgs_eff - Vbseff) * dVaux_dVd; - dT2_dVb = -Vaux + (Vgs_eff - Vbseff) * dVaux_dVb; - - T11 *= 0.75610; - T12 *= 1.31724; - T3 = pParam->BSIM4v6aigbinv * pParam->BSIM4v6cigbinv - - pParam->BSIM4v6bigbinv; - T4 = pParam->BSIM4v6bigbinv * pParam->BSIM4v6cigbinv; - T5 = T12 * (pParam->BSIM4v6aigbinv + T3 * Voxdepinv - - T4 * Voxdepinv * Voxdepinv); - - if (T5 > EXP_THRESHOLD) - { T6 = MAX_EXP; - dT6_dVg = dT6_dVd = dT6_dVb = 0.0; - } - else if (T5 < -EXP_THRESHOLD) - { T6 = MIN_EXP; - dT6_dVg = dT6_dVd = dT6_dVb = 0.0; - } - else - { T6 = exp(T5); - dT6_dVg = T6 * T12 * (T3 - 2.0 * T4 * Voxdepinv); - dT6_dVd = dT6_dVg * dVoxdepinv_dVd; - dT6_dVb = dT6_dVg * dVoxdepinv_dVb; - dT6_dVg *= dVoxdepinv_dVg; - } - - Igbinv = T11 * T2 * T6; - dIgbinv_dVg = T11 * (T2 * dT6_dVg + T6 * dT2_dVg); - dIgbinv_dVd = T11 * (T2 * dT6_dVd + T6 * dT2_dVd); - dIgbinv_dVb = T11 * (T2 * dT6_dVb + T6 * dT2_dVb); - - here->BSIM4v6Igb = Igbinv + Igbacc; - here->BSIM4v6gIgbg = dIgbinv_dVg + dIgbacc_dVg; - here->BSIM4v6gIgbd = dIgbinv_dVd; - here->BSIM4v6gIgbb = (dIgbinv_dVb + dIgbacc_dVb) * dVbseff_dVb; - } - else - { here->BSIM4v6Igb = here->BSIM4v6gIgbg = here->BSIM4v6gIgbd - = here->BSIM4v6gIgbs = here->BSIM4v6gIgbb = 0.0; - } /* End of Gate current */ - - if (here->BSIM4v6nf != 1.0) - { cdrain *= here->BSIM4v6nf; - here->BSIM4v6gds *= here->BSIM4v6nf; - here->BSIM4v6gm *= here->BSIM4v6nf; - here->BSIM4v6gmbs *= here->BSIM4v6nf; - here->BSIM4v6IdovVds *= here->BSIM4v6nf; - - here->BSIM4v6gbbs *= here->BSIM4v6nf; - here->BSIM4v6gbgs *= here->BSIM4v6nf; - here->BSIM4v6gbds *= here->BSIM4v6nf; - here->BSIM4v6csub *= here->BSIM4v6nf; - - here->BSIM4v6Igidl *= here->BSIM4v6nf; - here->BSIM4v6ggidld *= here->BSIM4v6nf; - here->BSIM4v6ggidlg *= here->BSIM4v6nf; - here->BSIM4v6ggidlb *= here->BSIM4v6nf; - - here->BSIM4v6Igisl *= here->BSIM4v6nf; - here->BSIM4v6ggisls *= here->BSIM4v6nf; - here->BSIM4v6ggislg *= here->BSIM4v6nf; - here->BSIM4v6ggislb *= here->BSIM4v6nf; - - here->BSIM4v6Igcs *= here->BSIM4v6nf; - here->BSIM4v6gIgcsg *= here->BSIM4v6nf; - here->BSIM4v6gIgcsd *= here->BSIM4v6nf; - here->BSIM4v6gIgcsb *= here->BSIM4v6nf; - here->BSIM4v6Igcd *= here->BSIM4v6nf; - here->BSIM4v6gIgcdg *= here->BSIM4v6nf; - here->BSIM4v6gIgcdd *= here->BSIM4v6nf; - here->BSIM4v6gIgcdb *= here->BSIM4v6nf; - - here->BSIM4v6Igs *= here->BSIM4v6nf; - here->BSIM4v6gIgsg *= here->BSIM4v6nf; - here->BSIM4v6gIgss *= here->BSIM4v6nf; - here->BSIM4v6Igd *= here->BSIM4v6nf; - here->BSIM4v6gIgdg *= here->BSIM4v6nf; - here->BSIM4v6gIgdd *= here->BSIM4v6nf; - - here->BSIM4v6Igb *= here->BSIM4v6nf; - here->BSIM4v6gIgbg *= here->BSIM4v6nf; - here->BSIM4v6gIgbd *= here->BSIM4v6nf; - here->BSIM4v6gIgbb *= here->BSIM4v6nf; - } - - here->BSIM4v6ggidls = -(here->BSIM4v6ggidld + here->BSIM4v6ggidlg - + here->BSIM4v6ggidlb); - here->BSIM4v6ggisld = -(here->BSIM4v6ggisls + here->BSIM4v6ggislg - + here->BSIM4v6ggislb); - here->BSIM4v6gIgbs = -(here->BSIM4v6gIgbg + here->BSIM4v6gIgbd - + here->BSIM4v6gIgbb); - here->BSIM4v6gIgcss = -(here->BSIM4v6gIgcsg + here->BSIM4v6gIgcsd - + here->BSIM4v6gIgcsb); - here->BSIM4v6gIgcds = -(here->BSIM4v6gIgcdg + here->BSIM4v6gIgcdd - + here->BSIM4v6gIgcdb); - here->BSIM4v6cd = cdrain; - - - if (model->BSIM4v6tnoiMod == 0) - { Abulk = Abulk0 * pParam->BSIM4v6abulkCVfactor; - Vdsat = Vgsteff / Abulk; - T0 = Vdsat - Vds - DELTA_4; - T1 = sqrt(T0 * T0 + 4.0 * DELTA_4 * Vdsat); - if (T0 >= 0.0) - Vdseff = Vdsat - 0.5 * (T0 + T1); - else - { T3 = (DELTA_4 + DELTA_4) / (T1 - T0); - T4 = 1.0 - T3; - T5 = Vdsat * T3 / (T1 - T0); - Vdseff = Vdsat * T4; - } - if (Vds == 0.0) - Vdseff = 0.0; - - T0 = Abulk * Vdseff; - T1 = 12.0 * (Vgsteff - 0.5 * T0 + 1.0e-20); - T2 = Vdseff / T1; - T3 = T0 * T2; - here->BSIM4v6qinv = Coxeff * pParam->BSIM4v6weffCV * here->BSIM4v6nf - * pParam->BSIM4v6leffCV - * (Vgsteff - 0.5 * T0 + Abulk * T3); - } - - /* - * BSIM4v6 C-V begins - */ - - if ((model->BSIM4v6xpart < 0) || (!ChargeComputationNeeded)) - { qgate = qdrn = qsrc = qbulk = 0.0; - here->BSIM4v6cggb = here->BSIM4v6cgsb = here->BSIM4v6cgdb = 0.0; - here->BSIM4v6cdgb = here->BSIM4v6cdsb = here->BSIM4v6cddb = 0.0; - here->BSIM4v6cbgb = here->BSIM4v6cbsb = here->BSIM4v6cbdb = 0.0; - here->BSIM4v6csgb = here->BSIM4v6cssb = here->BSIM4v6csdb = 0.0; - here->BSIM4v6cgbb = here->BSIM4v6csbb = here->BSIM4v6cdbb = here->BSIM4v6cbbb = 0.0; - here->BSIM4v6cqdb = here->BSIM4v6cqsb = here->BSIM4v6cqgb - = here->BSIM4v6cqbb = 0.0; - here->BSIM4v6gtau = 0.0; - goto finished; - } - else if (model->BSIM4v6capMod == 0) - { - if (Vbseff < 0.0) - { VbseffCV = Vbs; /*4.6.2*/ - dVbseffCV_dVb = 1.0; - } - else - { VbseffCV = pParam->BSIM4v6phi - Phis; - dVbseffCV_dVb = -dPhis_dVb * dVbseff_dVb; /*4.6.2*/ - } - - Vfb = pParam->BSIM4v6vfbcv; - Vth = Vfb + pParam->BSIM4v6phi + pParam->BSIM4v6k1ox * sqrtPhis; - Vgst = Vgs_eff - Vth; - dVth_dVb = pParam->BSIM4v6k1ox * dsqrtPhis_dVb *dVbseff_dVb; /*4.6.2*/ - dVgst_dVb = -dVth_dVb; - dVgst_dVg = dVgs_eff_dVg; - - CoxWL = model->BSIM4v6coxe * pParam->BSIM4v6weffCV - * pParam->BSIM4v6leffCV * here->BSIM4v6nf; - Arg1 = Vgs_eff - VbseffCV - Vfb; - - if (Arg1 <= 0.0) - { qgate = CoxWL * Arg1; - qbulk = -qgate; - qdrn = 0.0; - - here->BSIM4v6cggb = CoxWL * dVgs_eff_dVg; - here->BSIM4v6cgdb = 0.0; - here->BSIM4v6cgsb = CoxWL * (dVbseffCV_dVb - dVgs_eff_dVg); - - here->BSIM4v6cdgb = 0.0; - here->BSIM4v6cddb = 0.0; - here->BSIM4v6cdsb = 0.0; - - here->BSIM4v6cbgb = -CoxWL * dVgs_eff_dVg; - here->BSIM4v6cbdb = 0.0; - here->BSIM4v6cbsb = -here->BSIM4v6cgsb; - } /* Arg1 <= 0.0, end of accumulation */ - else if (Vgst <= 0.0) - { T1 = 0.5 * pParam->BSIM4v6k1ox; - T2 = sqrt(T1 * T1 + Arg1); - qgate = CoxWL * pParam->BSIM4v6k1ox * (T2 - T1); - qbulk = -qgate; - qdrn = 0.0; - - T0 = CoxWL * T1 / T2; - here->BSIM4v6cggb = T0 * dVgs_eff_dVg; - here->BSIM4v6cgdb = 0.0; - here->BSIM4v6cgsb = T0 * (dVbseffCV_dVb - dVgs_eff_dVg); - - here->BSIM4v6cdgb = 0.0; - here->BSIM4v6cddb = 0.0; - here->BSIM4v6cdsb = 0.0; - - here->BSIM4v6cbgb = -here->BSIM4v6cggb; - here->BSIM4v6cbdb = 0.0; - here->BSIM4v6cbsb = -here->BSIM4v6cgsb; - } /* Vgst <= 0.0, end of depletion */ - else - { One_Third_CoxWL = CoxWL / 3.0; - Two_Third_CoxWL = 2.0 * One_Third_CoxWL; - - AbulkCV = Abulk0 * pParam->BSIM4v6abulkCVfactor; - dAbulkCV_dVb = pParam->BSIM4v6abulkCVfactor * dAbulk0_dVb*dVbseff_dVb; - - dVdsat_dVg = 1.0 / AbulkCV; /*4.6.2*/ - Vdsat = Vgst * dVdsat_dVg; - dVdsat_dVb = - (Vdsat * dAbulkCV_dVb + dVth_dVb)* dVdsat_dVg; - - if (model->BSIM4v6xpart > 0.5) - { /* 0/100 Charge partition model */ - if (Vdsat <= Vds) - { /* saturation region */ - T1 = Vdsat / 3.0; - qgate = CoxWL * (Vgs_eff - Vfb - - pParam->BSIM4v6phi - T1); - T2 = -Two_Third_CoxWL * Vgst; - qbulk = -(qgate + T2); - qdrn = 0.0; - - here->BSIM4v6cggb = One_Third_CoxWL * (3.0 - - dVdsat_dVg) * dVgs_eff_dVg; - T2 = -One_Third_CoxWL * dVdsat_dVb; - here->BSIM4v6cgsb = -(here->BSIM4v6cggb + T2); - here->BSIM4v6cgdb = 0.0; - - here->BSIM4v6cdgb = 0.0; - here->BSIM4v6cddb = 0.0; - here->BSIM4v6cdsb = 0.0; - - here->BSIM4v6cbgb = -(here->BSIM4v6cggb - - Two_Third_CoxWL * dVgs_eff_dVg); - T3 = -(T2 + Two_Third_CoxWL * dVth_dVb); - here->BSIM4v6cbsb = -(here->BSIM4v6cbgb + T3); - here->BSIM4v6cbdb = 0.0; - } - else - { /* linear region */ - Alphaz = Vgst / Vdsat; - T1 = 2.0 * Vdsat - Vds; - T2 = Vds / (3.0 * T1); - T3 = T2 * Vds; - T9 = 0.25 * CoxWL; - T4 = T9 * Alphaz; - T7 = 2.0 * Vds - T1 - 3.0 * T3; - T8 = T3 - T1 - 2.0 * Vds; - qgate = CoxWL * (Vgs_eff - Vfb - - pParam->BSIM4v6phi - 0.5 * (Vds - T3)); - T10 = T4 * T8; - qdrn = T4 * T7; - qbulk = -(qgate + qdrn + T10); - - T5 = T3 / T1; - here->BSIM4v6cggb = CoxWL * (1.0 - T5 * dVdsat_dVg) - * dVgs_eff_dVg; - T11 = -CoxWL * T5 * dVdsat_dVb; - here->BSIM4v6cgdb = CoxWL * (T2 - 0.5 + 0.5 * T5); - here->BSIM4v6cgsb = -(here->BSIM4v6cggb + T11 - + here->BSIM4v6cgdb); - T6 = 1.0 / Vdsat; - dAlphaz_dVg = T6 * (1.0 - Alphaz * dVdsat_dVg); - dAlphaz_dVb = -T6 * (dVth_dVb + Alphaz * dVdsat_dVb); - T7 = T9 * T7; - T8 = T9 * T8; - T9 = 2.0 * T4 * (1.0 - 3.0 * T5); - here->BSIM4v6cdgb = (T7 * dAlphaz_dVg - T9 - * dVdsat_dVg) * dVgs_eff_dVg; - T12 = T7 * dAlphaz_dVb - T9 * dVdsat_dVb; - here->BSIM4v6cddb = T4 * (3.0 - 6.0 * T2 - 3.0 * T5); - here->BSIM4v6cdsb = -(here->BSIM4v6cdgb + T12 - + here->BSIM4v6cddb); - - T9 = 2.0 * T4 * (1.0 + T5); - T10 = (T8 * dAlphaz_dVg - T9 * dVdsat_dVg) - * dVgs_eff_dVg; - T11 = T8 * dAlphaz_dVb - T9 * dVdsat_dVb; - T12 = T4 * (2.0 * T2 + T5 - 1.0); - T0 = -(T10 + T11 + T12); - - here->BSIM4v6cbgb = -(here->BSIM4v6cggb - + here->BSIM4v6cdgb + T10); - here->BSIM4v6cbdb = -(here->BSIM4v6cgdb - + here->BSIM4v6cddb + T12); - here->BSIM4v6cbsb = -(here->BSIM4v6cgsb - + here->BSIM4v6cdsb + T0); - } - } - else if (model->BSIM4v6xpart < 0.5) - { /* 40/60 Charge partition model */ - if (Vds >= Vdsat) - { /* saturation region */ - T1 = Vdsat / 3.0; - qgate = CoxWL * (Vgs_eff - Vfb - - pParam->BSIM4v6phi - T1); - T2 = -Two_Third_CoxWL * Vgst; - qbulk = -(qgate + T2); - qdrn = 0.4 * T2; - - here->BSIM4v6cggb = One_Third_CoxWL * (3.0 - - dVdsat_dVg) * dVgs_eff_dVg; - T2 = -One_Third_CoxWL * dVdsat_dVb; - here->BSIM4v6cgsb = -(here->BSIM4v6cggb + T2); - here->BSIM4v6cgdb = 0.0; - - T3 = 0.4 * Two_Third_CoxWL; - here->BSIM4v6cdgb = -T3 * dVgs_eff_dVg; - here->BSIM4v6cddb = 0.0; - T4 = T3 * dVth_dVb; - here->BSIM4v6cdsb = -(T4 + here->BSIM4v6cdgb); - - here->BSIM4v6cbgb = -(here->BSIM4v6cggb - - Two_Third_CoxWL * dVgs_eff_dVg); - T3 = -(T2 + Two_Third_CoxWL * dVth_dVb); - here->BSIM4v6cbsb = -(here->BSIM4v6cbgb + T3); - here->BSIM4v6cbdb = 0.0; - } - else - { /* linear region */ - Alphaz = Vgst / Vdsat; - T1 = 2.0 * Vdsat - Vds; - T2 = Vds / (3.0 * T1); - T3 = T2 * Vds; - T9 = 0.25 * CoxWL; - T4 = T9 * Alphaz; - qgate = CoxWL * (Vgs_eff - Vfb - pParam->BSIM4v6phi - - 0.5 * (Vds - T3)); - - T5 = T3 / T1; - here->BSIM4v6cggb = CoxWL * (1.0 - T5 * dVdsat_dVg) - * dVgs_eff_dVg; - tmp = -CoxWL * T5 * dVdsat_dVb; - here->BSIM4v6cgdb = CoxWL * (T2 - 0.5 + 0.5 * T5); - here->BSIM4v6cgsb = -(here->BSIM4v6cggb - + here->BSIM4v6cgdb + tmp); - - T6 = 1.0 / Vdsat; - dAlphaz_dVg = T6 * (1.0 - Alphaz * dVdsat_dVg); - dAlphaz_dVb = -T6 * (dVth_dVb + Alphaz * dVdsat_dVb); - - T6 = 8.0 * Vdsat * Vdsat - 6.0 * Vdsat * Vds - + 1.2 * Vds * Vds; - T8 = T2 / T1; - T7 = Vds - T1 - T8 * T6; - qdrn = T4 * T7; - T7 *= T9; - tmp = T8 / T1; - tmp1 = T4 * (2.0 - 4.0 * tmp * T6 - + T8 * (16.0 * Vdsat - 6.0 * Vds)); - - here->BSIM4v6cdgb = (T7 * dAlphaz_dVg - tmp1 - * dVdsat_dVg) * dVgs_eff_dVg; - T10 = T7 * dAlphaz_dVb - tmp1 * dVdsat_dVb; - here->BSIM4v6cddb = T4 * (2.0 - (1.0 / (3.0 * T1 - * T1) + 2.0 * tmp) * T6 + T8 - * (6.0 * Vdsat - 2.4 * Vds)); - here->BSIM4v6cdsb = -(here->BSIM4v6cdgb - + T10 + here->BSIM4v6cddb); - - T7 = 2.0 * (T1 + T3); - qbulk = -(qgate - T4 * T7); - T7 *= T9; - T0 = 4.0 * T4 * (1.0 - T5); - T12 = (-T7 * dAlphaz_dVg - T0 * dVdsat_dVg) * dVgs_eff_dVg - - here->BSIM4v6cdgb; /*4.6.2*/ - T11 = -T7 * dAlphaz_dVb - T10 - T0 * dVdsat_dVb; - T10 = -4.0 * T4 * (T2 - 0.5 + 0.5 * T5) - - here->BSIM4v6cddb; - tmp = -(T10 + T11 + T12); - - here->BSIM4v6cbgb = -(here->BSIM4v6cggb - + here->BSIM4v6cdgb + T12); - here->BSIM4v6cbdb = -(here->BSIM4v6cgdb - + here->BSIM4v6cddb + T10); - here->BSIM4v6cbsb = -(here->BSIM4v6cgsb - + here->BSIM4v6cdsb + tmp); - } - } - else - { /* 50/50 partitioning */ - if (Vds >= Vdsat) - { /* saturation region */ - T1 = Vdsat / 3.0; - qgate = CoxWL * (Vgs_eff - Vfb - - pParam->BSIM4v6phi - T1); - T2 = -Two_Third_CoxWL * Vgst; - qbulk = -(qgate + T2); - qdrn = 0.5 * T2; - - here->BSIM4v6cggb = One_Third_CoxWL * (3.0 - - dVdsat_dVg) * dVgs_eff_dVg; - T2 = -One_Third_CoxWL * dVdsat_dVb; - here->BSIM4v6cgsb = -(here->BSIM4v6cggb + T2); - here->BSIM4v6cgdb = 0.0; - - here->BSIM4v6cdgb = -One_Third_CoxWL * dVgs_eff_dVg; - here->BSIM4v6cddb = 0.0; - T4 = One_Third_CoxWL * dVth_dVb; - here->BSIM4v6cdsb = -(T4 + here->BSIM4v6cdgb); - - here->BSIM4v6cbgb = -(here->BSIM4v6cggb - - Two_Third_CoxWL * dVgs_eff_dVg); - T3 = -(T2 + Two_Third_CoxWL * dVth_dVb); - here->BSIM4v6cbsb = -(here->BSIM4v6cbgb + T3); - here->BSIM4v6cbdb = 0.0; - } - else - { /* linear region */ - Alphaz = Vgst / Vdsat; - T1 = 2.0 * Vdsat - Vds; - T2 = Vds / (3.0 * T1); - T3 = T2 * Vds; - T9 = 0.25 * CoxWL; - T4 = T9 * Alphaz; - qgate = CoxWL * (Vgs_eff - Vfb - pParam->BSIM4v6phi - - 0.5 * (Vds - T3)); - - T5 = T3 / T1; - here->BSIM4v6cggb = CoxWL * (1.0 - T5 * dVdsat_dVg) - * dVgs_eff_dVg; - tmp = -CoxWL * T5 * dVdsat_dVb; - here->BSIM4v6cgdb = CoxWL * (T2 - 0.5 + 0.5 * T5); - here->BSIM4v6cgsb = -(here->BSIM4v6cggb - + here->BSIM4v6cgdb + tmp); - - T6 = 1.0 / Vdsat; - dAlphaz_dVg = T6 * (1.0 - Alphaz * dVdsat_dVg); - dAlphaz_dVb = -T6 * (dVth_dVb + Alphaz * dVdsat_dVb); - - T7 = T1 + T3; - qdrn = -T4 * T7; - qbulk = - (qgate + qdrn + qdrn); - T7 *= T9; - T0 = T4 * (2.0 * T5 - 2.0); - - here->BSIM4v6cdgb = (T0 * dVdsat_dVg - T7 - * dAlphaz_dVg) * dVgs_eff_dVg; - T12 = T0 * dVdsat_dVb - T7 * dAlphaz_dVb; - here->BSIM4v6cddb = T4 * (1.0 - 2.0 * T2 - T5); - here->BSIM4v6cdsb = -(here->BSIM4v6cdgb + T12 - + here->BSIM4v6cddb); - - here->BSIM4v6cbgb = -(here->BSIM4v6cggb - + 2.0 * here->BSIM4v6cdgb); - here->BSIM4v6cbdb = -(here->BSIM4v6cgdb - + 2.0 * here->BSIM4v6cddb); - here->BSIM4v6cbsb = -(here->BSIM4v6cgsb - + 2.0 * here->BSIM4v6cdsb); - } /* end of linear region */ - } /* end of 50/50 partition */ - } /* end of inversion */ - } /* end of capMod=0 */ - else - { if (Vbseff < 0.0) - { VbseffCV = Vbseff; - dVbseffCV_dVb = 1.0; - } - else - { VbseffCV = pParam->BSIM4v6phi - Phis; - dVbseffCV_dVb = -dPhis_dVb; - } - - CoxWL = model->BSIM4v6coxe * pParam->BSIM4v6weffCV - * pParam->BSIM4v6leffCV * here->BSIM4v6nf; - - if(model->BSIM4v6cvchargeMod == 0) - { - /* Seperate VgsteffCV with noff and voffcv */ - noff = n * pParam->BSIM4v6noff; - dnoff_dVd = pParam->BSIM4v6noff * dn_dVd; - dnoff_dVb = pParam->BSIM4v6noff * dn_dVb; - T0 = Vtm * noff; - voffcv = pParam->BSIM4v6voffcv; - VgstNVt = (Vgst - voffcv) / T0; - - if (VgstNVt > EXP_THRESHOLD) - { - Vgsteff = Vgst - voffcv; - dVgsteff_dVg = dVgs_eff_dVg; - dVgsteff_dVd = -dVth_dVd; - dVgsteff_dVb = -dVth_dVb; - } - else if (VgstNVt < -EXP_THRESHOLD) - { - Vgsteff = T0 * log(1.0 + MIN_EXP); - dVgsteff_dVg = 0.0; - dVgsteff_dVd = Vgsteff / noff; - dVgsteff_dVb = dVgsteff_dVd * dnoff_dVb; - dVgsteff_dVd *= dnoff_dVd; - } - else - { - ExpVgst = exp(VgstNVt); - Vgsteff = T0 * log(1.0 + ExpVgst); - dVgsteff_dVg = ExpVgst / (1.0 + ExpVgst); - dVgsteff_dVd = -dVgsteff_dVg * (dVth_dVd + (Vgst - voffcv) - / noff * dnoff_dVd) + Vgsteff / noff * dnoff_dVd; - dVgsteff_dVb = -dVgsteff_dVg * (dVth_dVb + (Vgst - voffcv) - / noff * dnoff_dVb) + Vgsteff / noff * dnoff_dVb; - dVgsteff_dVg *= dVgs_eff_dVg; - } - /* End of VgsteffCV for cvchargeMod = 0 */ - } - else - { - T0 = n * Vtm; - T1 = pParam->BSIM4v6mstarcv * Vgst; - T2 = T1 / T0; - if (T2 > EXP_THRESHOLD) - { - T10 = T1; - dT10_dVg = pParam->BSIM4v6mstarcv * dVgs_eff_dVg; - dT10_dVd = -dVth_dVd * pParam->BSIM4v6mstarcv; - dT10_dVb = -dVth_dVb * pParam->BSIM4v6mstarcv; - } - else if (T2 < -EXP_THRESHOLD) - { - T10 = Vtm * log(1.0 + MIN_EXP); - dT10_dVg = 0.0; - dT10_dVd = T10 * dn_dVd; - dT10_dVb = T10 * dn_dVb; - T10 *= n; - } - else - { - ExpVgst = exp(T2); - T3 = Vtm * log(1.0 + ExpVgst); - T10 = n * T3; - dT10_dVg = pParam->BSIM4v6mstarcv * ExpVgst / (1.0 + ExpVgst); - dT10_dVb = T3 * dn_dVb - dT10_dVg * (dVth_dVb + Vgst * dn_dVb / n); - dT10_dVd = T3 * dn_dVd - dT10_dVg * (dVth_dVd + Vgst * dn_dVd / n); - dT10_dVg *= dVgs_eff_dVg; - } - - T1 = pParam->BSIM4v6voffcbncv - (1.0 - pParam->BSIM4v6mstarcv) * Vgst; - T2 = T1 / T0; - if (T2 < -EXP_THRESHOLD) - { - T3 = model->BSIM4v6coxe * MIN_EXP / pParam->BSIM4v6cdep0; - T9 = pParam->BSIM4v6mstarcv + T3 * n; - dT9_dVg = 0.0; - dT9_dVd = dn_dVd * T3; - dT9_dVb = dn_dVb * T3; - } - else if (T2 > EXP_THRESHOLD) - { - T3 = model->BSIM4v6coxe * MAX_EXP / pParam->BSIM4v6cdep0; - T9 = pParam->BSIM4v6mstarcv + T3 * n; - dT9_dVg = 0.0; - dT9_dVd = dn_dVd * T3; - dT9_dVb = dn_dVb * T3; - } - else - { - ExpVgst = exp(T2); - T3 = model->BSIM4v6coxe / pParam->BSIM4v6cdep0; - T4 = T3 * ExpVgst; - T5 = T1 * T4 / T0; - T9 = pParam->BSIM4v6mstarcv + n * T4; - dT9_dVg = T3 * (pParam->BSIM4v6mstarcv - 1.0) * ExpVgst / Vtm; - dT9_dVb = T4 * dn_dVb - dT9_dVg * dVth_dVb - T5 * dn_dVb; - dT9_dVd = T4 * dn_dVd - dT9_dVg * dVth_dVd - T5 * dn_dVd; - dT9_dVg *= dVgs_eff_dVg; - } - - Vgsteff = T10 / T9; - T11 = T9 * T9; - dVgsteff_dVg = (T9 * dT10_dVg - T10 * dT9_dVg) / T11; - dVgsteff_dVd = (T9 * dT10_dVd - T10 * dT9_dVd) / T11; - dVgsteff_dVb = (T9 * dT10_dVb - T10 * dT9_dVb) / T11; - /* End of VgsteffCV for cvchargeMod = 1 */ - } - - - if (model->BSIM4v6capMod == 1) - { Vfb = here->BSIM4v6vfbzb; - V3 = Vfb - Vgs_eff + VbseffCV - DELTA_3; - if (Vfb <= 0.0) - T0 = sqrt(V3 * V3 - 4.0 * DELTA_3 * Vfb); - else - T0 = sqrt(V3 * V3 + 4.0 * DELTA_3 * Vfb); - - T1 = 0.5 * (1.0 + V3 / T0); - Vfbeff = Vfb - 0.5 * (V3 + T0); - dVfbeff_dVg = T1 * dVgs_eff_dVg; - dVfbeff_dVb = -T1 * dVbseffCV_dVb; - Qac0 = CoxWL * (Vfbeff - Vfb); - dQac0_dVg = CoxWL * dVfbeff_dVg; - dQac0_dVb = CoxWL * dVfbeff_dVb; - - T0 = 0.5 * pParam->BSIM4v6k1ox; - T3 = Vgs_eff - Vfbeff - VbseffCV - Vgsteff; - if (pParam->BSIM4v6k1ox == 0.0) - { T1 = 0.0; - T2 = 0.0; - } - else if (T3 < 0.0) - { T1 = T0 + T3 / pParam->BSIM4v6k1ox; - T2 = CoxWL; - } - else - { T1 = sqrt(T0 * T0 + T3); - T2 = CoxWL * T0 / T1; - } - - Qsub0 = CoxWL * pParam->BSIM4v6k1ox * (T1 - T0); - - dQsub0_dVg = T2 * (dVgs_eff_dVg - dVfbeff_dVg - dVgsteff_dVg); - dQsub0_dVd = -T2 * dVgsteff_dVd; - dQsub0_dVb = -T2 * (dVfbeff_dVb + dVbseffCV_dVb - + dVgsteff_dVb); - - AbulkCV = Abulk0 * pParam->BSIM4v6abulkCVfactor; - dAbulkCV_dVb = pParam->BSIM4v6abulkCVfactor * dAbulk0_dVb; - VdsatCV = Vgsteff / AbulkCV; - - T0 = VdsatCV - Vds - DELTA_4; - dT0_dVg = 1.0 / AbulkCV; - dT0_dVb = -VdsatCV * dAbulkCV_dVb / AbulkCV; - T1 = sqrt(T0 * T0 + 4.0 * DELTA_4 * VdsatCV); - dT1_dVg = (T0 + DELTA_4 + DELTA_4) / T1; - dT1_dVd = -T0 / T1; - dT1_dVb = dT1_dVg * dT0_dVb; - dT1_dVg *= dT0_dVg; - if (T0 >= 0.0) - { VdseffCV = VdsatCV - 0.5 * (T0 + T1); - dVdseffCV_dVg = 0.5 * (dT0_dVg - dT1_dVg); - dVdseffCV_dVd = 0.5 * (1.0 - dT1_dVd); - dVdseffCV_dVb = 0.5 * (dT0_dVb - dT1_dVb); - } - else - { T3 = (DELTA_4 + DELTA_4) / (T1 - T0); - T4 = 1.0 - T3; - T5 = VdsatCV * T3 / (T1 - T0); - VdseffCV = VdsatCV * T4; - dVdseffCV_dVg = dT0_dVg * T4 + T5 * (dT1_dVg - dT0_dVg); - dVdseffCV_dVd = T5 * (dT1_dVd + 1.0); - dVdseffCV_dVb = dT0_dVb * (T4 - T5) + T5 * dT1_dVb; - } - - if (Vds == 0.0) - { VdseffCV = 0.0; - dVdseffCV_dVg = 0.0; - dVdseffCV_dVb = 0.0; - } - - T0 = AbulkCV * VdseffCV; - T1 = 12.0 * (Vgsteff - 0.5 * T0 + 1.0e-20); - T2 = VdseffCV / T1; - T3 = T0 * T2; - - T4 = (1.0 - 12.0 * T2 * T2 * AbulkCV); - T5 = (6.0 * T0 * (4.0 * Vgsteff - T0) / (T1 * T1) - 0.5); - T6 = 12.0 * T2 * T2 * Vgsteff; - - qgate = CoxWL * (Vgsteff - 0.5 * VdseffCV + T3); - Cgg1 = CoxWL * (T4 + T5 * dVdseffCV_dVg); - Cgd1 = CoxWL * T5 * dVdseffCV_dVd + Cgg1 * dVgsteff_dVd; - Cgb1 = CoxWL * (T5 * dVdseffCV_dVb + T6 * dAbulkCV_dVb) - + Cgg1 * dVgsteff_dVb; - Cgg1 *= dVgsteff_dVg; - - T7 = 1.0 - AbulkCV; - qbulk = CoxWL * T7 * (0.5 * VdseffCV - T3); - T4 = -T7 * (T4 - 1.0); - T5 = -T7 * T5; - T6 = -(T7 * T6 + (0.5 * VdseffCV - T3)); - Cbg1 = CoxWL * (T4 + T5 * dVdseffCV_dVg); - Cbd1 = CoxWL * T5 * dVdseffCV_dVd + Cbg1 * dVgsteff_dVd; - Cbb1 = CoxWL * (T5 * dVdseffCV_dVb + T6 * dAbulkCV_dVb) - + Cbg1 * dVgsteff_dVb; - Cbg1 *= dVgsteff_dVg; - - if (model->BSIM4v6xpart > 0.5) - { /* 0/100 Charge petition model */ - T1 = T1 + T1; - qsrc = -CoxWL * (0.5 * Vgsteff + 0.25 * T0 - - T0 * T0 / T1); - T7 = (4.0 * Vgsteff - T0) / (T1 * T1); - T4 = -(0.5 + 24.0 * T0 * T0 / (T1 * T1)); - T5 = -(0.25 * AbulkCV - 12.0 * AbulkCV * T0 * T7); - T6 = -(0.25 * VdseffCV - 12.0 * T0 * VdseffCV * T7); - Csg = CoxWL * (T4 + T5 * dVdseffCV_dVg); - Csd = CoxWL * T5 * dVdseffCV_dVd + Csg * dVgsteff_dVd; - Csb = CoxWL * (T5 * dVdseffCV_dVb + T6 * dAbulkCV_dVb) - + Csg * dVgsteff_dVb; - Csg *= dVgsteff_dVg; - } - else if (model->BSIM4v6xpart < 0.5) - { /* 40/60 Charge petition model */ - T1 = T1 / 12.0; - T2 = 0.5 * CoxWL / (T1 * T1); - T3 = Vgsteff * (2.0 * T0 * T0 / 3.0 + Vgsteff - * (Vgsteff - 4.0 * T0 / 3.0)) - - 2.0 * T0 * T0 * T0 / 15.0; - qsrc = -T2 * T3; - T7 = 4.0 / 3.0 * Vgsteff * (Vgsteff - T0) - + 0.4 * T0 * T0; - T4 = -2.0 * qsrc / T1 - T2 * (Vgsteff * (3.0 - * Vgsteff - 8.0 * T0 / 3.0) - + 2.0 * T0 * T0 / 3.0); - T5 = (qsrc / T1 + T2 * T7) * AbulkCV; - T6 = (qsrc / T1 * VdseffCV + T2 * T7 * VdseffCV); - Csg = (T4 + T5 * dVdseffCV_dVg); - Csd = T5 * dVdseffCV_dVd + Csg * dVgsteff_dVd; - Csb = (T5 * dVdseffCV_dVb + T6 * dAbulkCV_dVb) - + Csg * dVgsteff_dVb; - Csg *= dVgsteff_dVg; - } - else - { /* 50/50 Charge petition model */ - qsrc = -0.5 * (qgate + qbulk); - Csg = -0.5 * (Cgg1 + Cbg1); - Csb = -0.5 * (Cgb1 + Cbb1); - Csd = -0.5 * (Cgd1 + Cbd1); - } - - qgate += Qac0 + Qsub0; - qbulk -= (Qac0 + Qsub0); - qdrn = -(qgate + qbulk + qsrc); - - Cgg = dQac0_dVg + dQsub0_dVg + Cgg1; - Cgd = dQsub0_dVd + Cgd1; - Cgb = dQac0_dVb + dQsub0_dVb + Cgb1; - - Cbg = Cbg1 - dQac0_dVg - dQsub0_dVg; - Cbd = Cbd1 - dQsub0_dVd; - Cbb = Cbb1 - dQac0_dVb - dQsub0_dVb; - - Cgb *= dVbseff_dVb; - Cbb *= dVbseff_dVb; - Csb *= dVbseff_dVb; - - here->BSIM4v6cggb = Cgg; - here->BSIM4v6cgsb = -(Cgg + Cgd + Cgb); - here->BSIM4v6cgdb = Cgd; - here->BSIM4v6cdgb = -(Cgg + Cbg + Csg); - here->BSIM4v6cdsb = (Cgg + Cgd + Cgb + Cbg + Cbd + Cbb - + Csg + Csd + Csb); - here->BSIM4v6cddb = -(Cgd + Cbd + Csd); - here->BSIM4v6cbgb = Cbg; - here->BSIM4v6cbsb = -(Cbg + Cbd + Cbb); - here->BSIM4v6cbdb = Cbd; - } - - /* Charge-Thickness capMod (CTM) begins */ - else if (model->BSIM4v6capMod == 2) - { V3 = here->BSIM4v6vfbzb - Vgs_eff + VbseffCV - DELTA_3; - if (here->BSIM4v6vfbzb <= 0.0) - T0 = sqrt(V3 * V3 - 4.0 * DELTA_3 * here->BSIM4v6vfbzb); - else - T0 = sqrt(V3 * V3 + 4.0 * DELTA_3 * here->BSIM4v6vfbzb); - - T1 = 0.5 * (1.0 + V3 / T0); - Vfbeff = here->BSIM4v6vfbzb - 0.5 * (V3 + T0); - dVfbeff_dVg = T1 * dVgs_eff_dVg; - dVfbeff_dVb = -T1 * dVbseffCV_dVb; - - Cox = model->BSIM4v6coxp; - Tox = 1.0e8 * model->BSIM4v6toxp; - T0 = (Vgs_eff - VbseffCV - here->BSIM4v6vfbzb) / Tox; - dT0_dVg = dVgs_eff_dVg / Tox; - dT0_dVb = -dVbseffCV_dVb / Tox; - - tmp = T0 * pParam->BSIM4v6acde; - if ((-EXP_THRESHOLD < tmp) && (tmp < EXP_THRESHOLD)) - { Tcen = pParam->BSIM4v6ldeb * exp(tmp); - dTcen_dVg = pParam->BSIM4v6acde * Tcen; - dTcen_dVb = dTcen_dVg * dT0_dVb; - dTcen_dVg *= dT0_dVg; - } - else if (tmp <= -EXP_THRESHOLD) - { Tcen = pParam->BSIM4v6ldeb * MIN_EXP; - dTcen_dVg = dTcen_dVb = 0.0; - } - else - { Tcen = pParam->BSIM4v6ldeb * MAX_EXP; - dTcen_dVg = dTcen_dVb = 0.0; - } - - LINK = 1.0e-3 * model->BSIM4v6toxp; - V3 = pParam->BSIM4v6ldeb - Tcen - LINK; - V4 = sqrt(V3 * V3 + 4.0 * LINK * pParam->BSIM4v6ldeb); - Tcen = pParam->BSIM4v6ldeb - 0.5 * (V3 + V4); - T1 = 0.5 * (1.0 + V3 / V4); - dTcen_dVg *= T1; - dTcen_dVb *= T1; - - Ccen = epssub / Tcen; - T2 = Cox / (Cox + Ccen); - Coxeff = T2 * Ccen; - T3 = -Ccen / Tcen; - dCoxeff_dVg = T2 * T2 * T3; - dCoxeff_dVb = dCoxeff_dVg * dTcen_dVb; - dCoxeff_dVg *= dTcen_dVg; - CoxWLcen = CoxWL * Coxeff / model->BSIM4v6coxe; - - Qac0 = CoxWLcen * (Vfbeff - here->BSIM4v6vfbzb); - QovCox = Qac0 / Coxeff; - dQac0_dVg = CoxWLcen * dVfbeff_dVg - + QovCox * dCoxeff_dVg; - dQac0_dVb = CoxWLcen * dVfbeff_dVb - + QovCox * dCoxeff_dVb; - - T0 = 0.5 * pParam->BSIM4v6k1ox; - T3 = Vgs_eff - Vfbeff - VbseffCV - Vgsteff; - if (pParam->BSIM4v6k1ox == 0.0) - { T1 = 0.0; - T2 = 0.0; - } - else if (T3 < 0.0) - { T1 = T0 + T3 / pParam->BSIM4v6k1ox; - T2 = CoxWLcen; - } - else - { T1 = sqrt(T0 * T0 + T3); - T2 = CoxWLcen * T0 / T1; - } - - Qsub0 = CoxWLcen * pParam->BSIM4v6k1ox * (T1 - T0); - QovCox = Qsub0 / Coxeff; - dQsub0_dVg = T2 * (dVgs_eff_dVg - dVfbeff_dVg - dVgsteff_dVg) - + QovCox * dCoxeff_dVg; - dQsub0_dVd = -T2 * dVgsteff_dVd; - dQsub0_dVb = -T2 * (dVfbeff_dVb + dVbseffCV_dVb + dVgsteff_dVb) - + QovCox * dCoxeff_dVb; - - /* Gate-bias dependent delta Phis begins */ - if (pParam->BSIM4v6k1ox <= 0.0) - { Denomi = 0.25 * pParam->BSIM4v6moin * Vtm; - T0 = 0.5 * pParam->BSIM4v6sqrtPhi; - } - else - { Denomi = pParam->BSIM4v6moin * Vtm - * pParam->BSIM4v6k1ox * pParam->BSIM4v6k1ox; - T0 = pParam->BSIM4v6k1ox * pParam->BSIM4v6sqrtPhi; - } - T1 = 2.0 * T0 + Vgsteff; - - DeltaPhi = Vtm * log(1.0 + T1 * Vgsteff / Denomi); - dDeltaPhi_dVg = 2.0 * Vtm * (T1 -T0) / (Denomi + T1 * Vgsteff); - /* End of delta Phis */ - - /* VgDP = Vgsteff - DeltaPhi */ - T0 = Vgsteff - DeltaPhi - 0.001; - dT0_dVg = 1.0 - dDeltaPhi_dVg; - T1 = sqrt(T0 * T0 + Vgsteff * 0.004); - VgDP = 0.5 * (T0 + T1); - dVgDP_dVg = 0.5 * (dT0_dVg + (T0 * dT0_dVg + 0.002) / T1); - - Tox += Tox; /* WDLiu: Tcen reevaluated below due to different Vgsteff */ - T0 = (Vgsteff + here->BSIM4v6vtfbphi2) / Tox; - tmp = exp(model->BSIM4v6bdos * 0.7 * log(T0)); - T1 = 1.0 + tmp; - T2 = model->BSIM4v6bdos * 0.7 * tmp / (T0 * Tox); - Tcen = model->BSIM4v6ados * 1.9e-9 / T1; - dTcen_dVg = -Tcen * T2 / T1; - dTcen_dVd = dTcen_dVg * dVgsteff_dVd; - dTcen_dVb = dTcen_dVg * dVgsteff_dVb; - dTcen_dVg *= dVgsteff_dVg; - - Ccen = epssub / Tcen; - T0 = Cox / (Cox + Ccen); - Coxeff = T0 * Ccen; - T1 = -Ccen / Tcen; - dCoxeff_dVg = T0 * T0 * T1; - dCoxeff_dVd = dCoxeff_dVg * dTcen_dVd; - dCoxeff_dVb = dCoxeff_dVg * dTcen_dVb; - dCoxeff_dVg *= dTcen_dVg; - CoxWLcen = CoxWL * Coxeff / model->BSIM4v6coxe; - - AbulkCV = Abulk0 * pParam->BSIM4v6abulkCVfactor; - dAbulkCV_dVb = pParam->BSIM4v6abulkCVfactor * dAbulk0_dVb; - VdsatCV = VgDP / AbulkCV; - - T0 = VdsatCV - Vds - DELTA_4; - dT0_dVg = dVgDP_dVg / AbulkCV; - dT0_dVb = -VdsatCV * dAbulkCV_dVb / AbulkCV; - T1 = sqrt(T0 * T0 + 4.0 * DELTA_4 * VdsatCV); - dT1_dVg = (T0 + DELTA_4 + DELTA_4) / T1; - dT1_dVd = -T0 / T1; - dT1_dVb = dT1_dVg * dT0_dVb; - dT1_dVg *= dT0_dVg; - if (T0 >= 0.0) - { VdseffCV = VdsatCV - 0.5 * (T0 + T1); - dVdseffCV_dVg = 0.5 * (dT0_dVg - dT1_dVg); - dVdseffCV_dVd = 0.5 * (1.0 - dT1_dVd); - dVdseffCV_dVb = 0.5 * (dT0_dVb - dT1_dVb); - } - else - { T3 = (DELTA_4 + DELTA_4) / (T1 - T0); - T4 = 1.0 - T3; - T5 = VdsatCV * T3 / (T1 - T0); - VdseffCV = VdsatCV * T4; - dVdseffCV_dVg = dT0_dVg * T4 + T5 * (dT1_dVg - dT0_dVg); - dVdseffCV_dVd = T5 * (dT1_dVd + 1.0); - dVdseffCV_dVb = dT0_dVb * (T4 - T5) + T5 * dT1_dVb; - } - - if (Vds == 0.0) - { VdseffCV = 0.0; - dVdseffCV_dVg = 0.0; - dVdseffCV_dVb = 0.0; - } - - T0 = AbulkCV * VdseffCV; - T1 = VgDP; - T2 = 12.0 * (T1 - 0.5 * T0 + 1.0e-20); - T3 = T0 / T2; - T4 = 1.0 - 12.0 * T3 * T3; - T5 = AbulkCV * (6.0 * T0 * (4.0 * T1 - T0) / (T2 * T2) - 0.5); - T6 = T5 * VdseffCV / AbulkCV; - - qgate = CoxWLcen * (T1 - T0 * (0.5 - T3)); - QovCox = qgate / Coxeff; - Cgg1 = CoxWLcen * (T4 * dVgDP_dVg - + T5 * dVdseffCV_dVg); - Cgd1 = CoxWLcen * T5 * dVdseffCV_dVd + Cgg1 - * dVgsteff_dVd + QovCox * dCoxeff_dVd; - Cgb1 = CoxWLcen * (T5 * dVdseffCV_dVb + T6 * dAbulkCV_dVb) - + Cgg1 * dVgsteff_dVb + QovCox * dCoxeff_dVb; - Cgg1 = Cgg1 * dVgsteff_dVg + QovCox * dCoxeff_dVg; - - - T7 = 1.0 - AbulkCV; - T8 = T2 * T2; - T9 = 12.0 * T7 * T0 * T0 / (T8 * AbulkCV); - T10 = T9 * dVgDP_dVg; - T11 = -T7 * T5 / AbulkCV; - T12 = -(T9 * T1 / AbulkCV + VdseffCV * (0.5 - T0 / T2)); - - qbulk = CoxWLcen * T7 * (0.5 * VdseffCV - T0 * VdseffCV / T2); - QovCox = qbulk / Coxeff; - Cbg1 = CoxWLcen * (T10 + T11 * dVdseffCV_dVg); - Cbd1 = CoxWLcen * T11 * dVdseffCV_dVd + Cbg1 - * dVgsteff_dVd + QovCox * dCoxeff_dVd; - Cbb1 = CoxWLcen * (T11 * dVdseffCV_dVb + T12 * dAbulkCV_dVb) - + Cbg1 * dVgsteff_dVb + QovCox * dCoxeff_dVb; - Cbg1 = Cbg1 * dVgsteff_dVg + QovCox * dCoxeff_dVg; - - if (model->BSIM4v6xpart > 0.5) - { /* 0/100 partition */ - qsrc = -CoxWLcen * (T1 / 2.0 + T0 / 4.0 - - 0.5 * T0 * T0 / T2); - QovCox = qsrc / Coxeff; - T2 += T2; - T3 = T2 * T2; - T7 = -(0.25 - 12.0 * T0 * (4.0 * T1 - T0) / T3); - T4 = -(0.5 + 24.0 * T0 * T0 / T3) * dVgDP_dVg; - T5 = T7 * AbulkCV; - T6 = T7 * VdseffCV; - - Csg = CoxWLcen * (T4 + T5 * dVdseffCV_dVg); - Csd = CoxWLcen * T5 * dVdseffCV_dVd + Csg * dVgsteff_dVd - + QovCox * dCoxeff_dVd; - Csb = CoxWLcen * (T5 * dVdseffCV_dVb + T6 * dAbulkCV_dVb) - + Csg * dVgsteff_dVb + QovCox * dCoxeff_dVb; - Csg = Csg * dVgsteff_dVg + QovCox * dCoxeff_dVg; - } - else if (model->BSIM4v6xpart < 0.5) - { /* 40/60 partition */ - T2 = T2 / 12.0; - T3 = 0.5 * CoxWLcen / (T2 * T2); - T4 = T1 * (2.0 * T0 * T0 / 3.0 + T1 * (T1 - 4.0 - * T0 / 3.0)) - 2.0 * T0 * T0 * T0 / 15.0; - qsrc = -T3 * T4; - QovCox = qsrc / Coxeff; - T8 = 4.0 / 3.0 * T1 * (T1 - T0) + 0.4 * T0 * T0; - T5 = -2.0 * qsrc / T2 - T3 * (T1 * (3.0 * T1 - 8.0 - * T0 / 3.0) + 2.0 * T0 * T0 / 3.0); - T6 = AbulkCV * (qsrc / T2 + T3 * T8); - T7 = T6 * VdseffCV / AbulkCV; - - Csg = T5 * dVgDP_dVg + T6 * dVdseffCV_dVg; - Csd = Csg * dVgsteff_dVd + T6 * dVdseffCV_dVd - + QovCox * dCoxeff_dVd; - Csb = Csg * dVgsteff_dVb + T6 * dVdseffCV_dVb - + T7 * dAbulkCV_dVb + QovCox * dCoxeff_dVb; - Csg = Csg * dVgsteff_dVg + QovCox * dCoxeff_dVg; - } - else - { /* 50/50 partition */ - qsrc = -0.5 * qgate; - Csg = -0.5 * Cgg1; - Csd = -0.5 * Cgd1; - Csb = -0.5 * Cgb1; - } - - qgate += Qac0 + Qsub0 - qbulk; - qbulk -= (Qac0 + Qsub0); - qdrn = -(qgate + qbulk + qsrc); - - Cbg = Cbg1 - dQac0_dVg - dQsub0_dVg; - Cbd = Cbd1 - dQsub0_dVd; - Cbb = Cbb1 - dQac0_dVb - dQsub0_dVb; - - Cgg = Cgg1 - Cbg; - Cgd = Cgd1 - Cbd; - Cgb = Cgb1 - Cbb; - - Cgb *= dVbseff_dVb; - Cbb *= dVbseff_dVb; - Csb *= dVbseff_dVb; - - here->BSIM4v6cggb = Cgg; - here->BSIM4v6cgsb = -(Cgg + Cgd + Cgb); - here->BSIM4v6cgdb = Cgd; - here->BSIM4v6cdgb = -(Cgg + Cbg + Csg); - here->BSIM4v6cdsb = (Cgg + Cgd + Cgb + Cbg + Cbd + Cbb - + Csg + Csd + Csb); - here->BSIM4v6cddb = -(Cgd + Cbd + Csd); - here->BSIM4v6cbgb = Cbg; - here->BSIM4v6cbsb = -(Cbg + Cbd + Cbb); - here->BSIM4v6cbdb = Cbd; - } /* End of CTM */ - } - - here->BSIM4v6csgb = - here->BSIM4v6cggb - here->BSIM4v6cdgb - here->BSIM4v6cbgb; - here->BSIM4v6csdb = - here->BSIM4v6cgdb - here->BSIM4v6cddb - here->BSIM4v6cbdb; - here->BSIM4v6cssb = - here->BSIM4v6cgsb - here->BSIM4v6cdsb - here->BSIM4v6cbsb; - here->BSIM4v6cgbb = - here->BSIM4v6cgdb - here->BSIM4v6cggb - here->BSIM4v6cgsb; - here->BSIM4v6cdbb = - here->BSIM4v6cddb - here->BSIM4v6cdgb - here->BSIM4v6cdsb; - here->BSIM4v6cbbb = - here->BSIM4v6cbgb - here->BSIM4v6cbdb - here->BSIM4v6cbsb; - here->BSIM4v6csbb = - here->BSIM4v6cgbb - here->BSIM4v6cdbb - here->BSIM4v6cbbb; - here->BSIM4v6qgate = qgate; - here->BSIM4v6qbulk = qbulk; - here->BSIM4v6qdrn = qdrn; - here->BSIM4v6qsrc = -(qgate + qbulk + qdrn); - - /* NQS begins */ - if ((here->BSIM4v6trnqsMod) || (here->BSIM4v6acnqsMod)) - { here->BSIM4v6qchqs = qcheq = -(qbulk + qgate); - here->BSIM4v6cqgb = -(here->BSIM4v6cggb + here->BSIM4v6cbgb); - here->BSIM4v6cqdb = -(here->BSIM4v6cgdb + here->BSIM4v6cbdb); - here->BSIM4v6cqsb = -(here->BSIM4v6cgsb + here->BSIM4v6cbsb); - here->BSIM4v6cqbb = -(here->BSIM4v6cqgb + here->BSIM4v6cqdb - + here->BSIM4v6cqsb); - - CoxWL = model->BSIM4v6coxe * pParam->BSIM4v6weffCV * here->BSIM4v6nf - * pParam->BSIM4v6leffCV; - T1 = here->BSIM4v6gcrg / CoxWL; /* 1 / tau */ - here->BSIM4v6gtau = T1 * ScalingFactor; - - if (here->BSIM4v6acnqsMod) - here->BSIM4v6taunet = 1.0 / T1; - - *(ckt->CKTstate0 + here->BSIM4v6qcheq) = qcheq; - if (ckt->CKTmode & MODEINITTRAN) - *(ckt->CKTstate1 + here->BSIM4v6qcheq) = - *(ckt->CKTstate0 + here->BSIM4v6qcheq); - if (here->BSIM4v6trnqsMod) - { error = NIintegrate(ckt, &geq, &ceq, 0.0, here->BSIM4v6qcheq); - if (error) - return(error); - } - } - - -finished: - - /* Calculate junction C-V */ - if (ChargeComputationNeeded) - { czbd = model->BSIM4v6DunitAreaTempJctCap * here->BSIM4v6Adeff; /* bug fix */ - czbs = model->BSIM4v6SunitAreaTempJctCap * here->BSIM4v6Aseff; - czbdsw = model->BSIM4v6DunitLengthSidewallTempJctCap * here->BSIM4v6Pdeff; - czbdswg = model->BSIM4v6DunitLengthGateSidewallTempJctCap - * pParam->BSIM4v6weffCJ * here->BSIM4v6nf; - czbssw = model->BSIM4v6SunitLengthSidewallTempJctCap * here->BSIM4v6Pseff; - czbsswg = model->BSIM4v6SunitLengthGateSidewallTempJctCap - * pParam->BSIM4v6weffCJ * here->BSIM4v6nf; - - MJS = model->BSIM4v6SbulkJctBotGradingCoeff; - MJSWS = model->BSIM4v6SbulkJctSideGradingCoeff; - MJSWGS = model->BSIM4v6SbulkJctGateSideGradingCoeff; - - MJD = model->BSIM4v6DbulkJctBotGradingCoeff; - MJSWD = model->BSIM4v6DbulkJctSideGradingCoeff; - MJSWGD = model->BSIM4v6DbulkJctGateSideGradingCoeff; - - /* Source Bulk Junction */ - if (vbs_jct == 0.0) - { *(ckt->CKTstate0 + here->BSIM4v6qbs) = 0.0; - here->BSIM4v6capbs = czbs + czbssw + czbsswg; - } - else if (vbs_jct < 0.0) - { if (czbs > 0.0) - { arg = 1.0 - vbs_jct / model->BSIM4v6PhiBS; - if (MJS == 0.5) - sarg = 1.0 / sqrt(arg); - else - sarg = exp(-MJS * log(arg)); - *(ckt->CKTstate0 + here->BSIM4v6qbs) = model->BSIM4v6PhiBS * czbs - * (1.0 - arg * sarg) / (1.0 - MJS); - here->BSIM4v6capbs = czbs * sarg; - } - else - { *(ckt->CKTstate0 + here->BSIM4v6qbs) = 0.0; - here->BSIM4v6capbs = 0.0; - } - if (czbssw > 0.0) - { arg = 1.0 - vbs_jct / model->BSIM4v6PhiBSWS; - if (MJSWS == 0.5) - sarg = 1.0 / sqrt(arg); - else - sarg = exp(-MJSWS * log(arg)); - *(ckt->CKTstate0 + here->BSIM4v6qbs) += model->BSIM4v6PhiBSWS * czbssw - * (1.0 - arg * sarg) / (1.0 - MJSWS); - here->BSIM4v6capbs += czbssw * sarg; - } - if (czbsswg > 0.0) - { arg = 1.0 - vbs_jct / model->BSIM4v6PhiBSWGS; - if (MJSWGS == 0.5) - sarg = 1.0 / sqrt(arg); - else - sarg = exp(-MJSWGS * log(arg)); - *(ckt->CKTstate0 + here->BSIM4v6qbs) += model->BSIM4v6PhiBSWGS * czbsswg - * (1.0 - arg * sarg) / (1.0 - MJSWGS); - here->BSIM4v6capbs += czbsswg * sarg; - } - - } - else - { T0 = czbs + czbssw + czbsswg; - T1 = vbs_jct * (czbs * MJS / model->BSIM4v6PhiBS + czbssw * MJSWS - / model->BSIM4v6PhiBSWS + czbsswg * MJSWGS / model->BSIM4v6PhiBSWGS); - *(ckt->CKTstate0 + here->BSIM4v6qbs) = vbs_jct * (T0 + 0.5 * T1); - here->BSIM4v6capbs = T0 + T1; - } - - /* Drain Bulk Junction */ - if (vbd_jct == 0.0) - { *(ckt->CKTstate0 + here->BSIM4v6qbd) = 0.0; - here->BSIM4v6capbd = czbd + czbdsw + czbdswg; - } - else if (vbd_jct < 0.0) - { if (czbd > 0.0) - { arg = 1.0 - vbd_jct / model->BSIM4v6PhiBD; - if (MJD == 0.5) - sarg = 1.0 / sqrt(arg); - else - sarg = exp(-MJD * log(arg)); - *(ckt->CKTstate0 + here->BSIM4v6qbd) = model->BSIM4v6PhiBD* czbd - * (1.0 - arg * sarg) / (1.0 - MJD); - here->BSIM4v6capbd = czbd * sarg; - } - else - { *(ckt->CKTstate0 + here->BSIM4v6qbd) = 0.0; - here->BSIM4v6capbd = 0.0; - } - if (czbdsw > 0.0) - { arg = 1.0 - vbd_jct / model->BSIM4v6PhiBSWD; - if (MJSWD == 0.5) - sarg = 1.0 / sqrt(arg); - else - sarg = exp(-MJSWD * log(arg)); - *(ckt->CKTstate0 + here->BSIM4v6qbd) += model->BSIM4v6PhiBSWD * czbdsw - * (1.0 - arg * sarg) / (1.0 - MJSWD); - here->BSIM4v6capbd += czbdsw * sarg; - } - if (czbdswg > 0.0) - { arg = 1.0 - vbd_jct / model->BSIM4v6PhiBSWGD; - if (MJSWGD == 0.5) - sarg = 1.0 / sqrt(arg); - else - sarg = exp(-MJSWGD * log(arg)); - *(ckt->CKTstate0 + here->BSIM4v6qbd) += model->BSIM4v6PhiBSWGD * czbdswg - * (1.0 - arg * sarg) / (1.0 - MJSWGD); - here->BSIM4v6capbd += czbdswg * sarg; - } - } - else - { T0 = czbd + czbdsw + czbdswg; - T1 = vbd_jct * (czbd * MJD / model->BSIM4v6PhiBD + czbdsw * MJSWD - / model->BSIM4v6PhiBSWD + czbdswg * MJSWGD / model->BSIM4v6PhiBSWGD); - *(ckt->CKTstate0 + here->BSIM4v6qbd) = vbd_jct * (T0 + 0.5 * T1); - here->BSIM4v6capbd = T0 + T1; - } - } - - - /* - * check convergence - */ - - if ((here->BSIM4v6off == 0) || (!(ckt->CKTmode & MODEINITFIX))) - { if (Check == 1) - { ckt->CKTnoncon++; -#ifndef NEWCONV - } - else - { if (here->BSIM4v6mode >= 0) - { Idtot = here->BSIM4v6cd + here->BSIM4v6csub - + here->BSIM4v6Igidl - here->BSIM4v6cbd; - } - else - { Idtot = here->BSIM4v6cd + here->BSIM4v6cbd - here->BSIM4v6Igidl; /* bugfix */ - } - tol0 = ckt->CKTreltol * MAX(fabs(cdhat), fabs(Idtot)) - + ckt->CKTabstol; - tol1 = ckt->CKTreltol * MAX(fabs(cseshat), fabs(Isestot)) - + ckt->CKTabstol; - tol2 = ckt->CKTreltol * MAX(fabs(cdedhat), fabs(Idedtot)) - + ckt->CKTabstol; - tol3 = ckt->CKTreltol * MAX(fabs(cgshat), fabs(Igstot)) - + ckt->CKTabstol; - tol4 = ckt->CKTreltol * MAX(fabs(cgdhat), fabs(Igdtot)) - + ckt->CKTabstol; - tol5 = ckt->CKTreltol * MAX(fabs(cgbhat), fabs(Igbtot)) - + ckt->CKTabstol; - if ((fabs(cdhat - Idtot) >= tol0) || (fabs(cseshat - Isestot) >= tol1) - || (fabs(cdedhat - Idedtot) >= tol2)) - { ckt->CKTnoncon++; - } - else if ((fabs(cgshat - Igstot) >= tol3) || (fabs(cgdhat - Igdtot) >= tol4) - || (fabs(cgbhat - Igbtot) >= tol5)) - { ckt->CKTnoncon++; - } - else - { Ibtot = here->BSIM4v6cbs + here->BSIM4v6cbd - - here->BSIM4v6Igidl - here->BSIM4v6Igisl - here->BSIM4v6csub; - tol6 = ckt->CKTreltol * MAX(fabs(cbhat), fabs(Ibtot)) - + ckt->CKTabstol; - if (fabs(cbhat - Ibtot) > tol6) - { ckt->CKTnoncon++; - } - } -#endif /* NEWCONV */ - } - } - *(ckt->CKTstate0 + here->BSIM4v6vds) = vds; - *(ckt->CKTstate0 + here->BSIM4v6vgs) = vgs; - *(ckt->CKTstate0 + here->BSIM4v6vbs) = vbs; - *(ckt->CKTstate0 + here->BSIM4v6vbd) = vbd; - *(ckt->CKTstate0 + here->BSIM4v6vges) = vges; - *(ckt->CKTstate0 + here->BSIM4v6vgms) = vgms; - *(ckt->CKTstate0 + here->BSIM4v6vdbs) = vdbs; - *(ckt->CKTstate0 + here->BSIM4v6vdbd) = vdbd; - *(ckt->CKTstate0 + here->BSIM4v6vsbs) = vsbs; - *(ckt->CKTstate0 + here->BSIM4v6vses) = vses; - *(ckt->CKTstate0 + here->BSIM4v6vdes) = vdes; - *(ckt->CKTstate0 + here->BSIM4v6qdef) = qdef; - - - if (!ChargeComputationNeeded) - goto line850; - - if (here->BSIM4v6rgateMod == 3) - { - vgdx = vgmd; - vgsx = vgms; - } - else /* For rgateMod == 0, 1 and 2 */ - { - vgdx = vgd; - vgsx = vgs; - } - if (model->BSIM4v6capMod == 0) - { - cgdo = pParam->BSIM4v6cgdo; - qgdo = pParam->BSIM4v6cgdo * vgdx; - cgso = pParam->BSIM4v6cgso; - qgso = pParam->BSIM4v6cgso * vgsx; - } - else /* For both capMod == 1 and 2 */ - { T0 = vgdx + DELTA_1; - T1 = sqrt(T0 * T0 + 4.0 * DELTA_1); - T2 = 0.5 * (T0 - T1); - - T3 = pParam->BSIM4v6weffCV * pParam->BSIM4v6cgdl; - T4 = sqrt(1.0 - 4.0 * T2 / pParam->BSIM4v6ckappad); - cgdo = pParam->BSIM4v6cgdo + T3 - T3 * (1.0 - 1.0 / T4) - * (0.5 - 0.5 * T0 / T1); - qgdo = (pParam->BSIM4v6cgdo + T3) * vgdx - T3 * (T2 - + 0.5 * pParam->BSIM4v6ckappad * (T4 - 1.0)); - - T0 = vgsx + DELTA_1; - T1 = sqrt(T0 * T0 + 4.0 * DELTA_1); - T2 = 0.5 * (T0 - T1); - T3 = pParam->BSIM4v6weffCV * pParam->BSIM4v6cgsl; - T4 = sqrt(1.0 - 4.0 * T2 / pParam->BSIM4v6ckappas); - cgso = pParam->BSIM4v6cgso + T3 - T3 * (1.0 - 1.0 / T4) - * (0.5 - 0.5 * T0 / T1); - qgso = (pParam->BSIM4v6cgso + T3) * vgsx - T3 * (T2 - + 0.5 * pParam->BSIM4v6ckappas * (T4 - 1.0)); - } - - if (here->BSIM4v6nf != 1.0) - { cgdo *= here->BSIM4v6nf; - cgso *= here->BSIM4v6nf; - qgdo *= here->BSIM4v6nf; - qgso *= here->BSIM4v6nf; - } - here->BSIM4v6cgdo = cgdo; - here->BSIM4v6qgdo = qgdo; - here->BSIM4v6cgso = cgso; - here->BSIM4v6qgso = qgso; - -#ifndef NOBYPASS -line755: -#endif - ag0 = ckt->CKTag[0]; - if (here->BSIM4v6mode > 0) - { if (here->BSIM4v6trnqsMod == 0) - { qdrn -= qgdo; - if (here->BSIM4v6rgateMod == 3) - { gcgmgmb = (cgdo + cgso + pParam->BSIM4v6cgbo) * ag0; - gcgmdb = -cgdo * ag0; - gcgmsb = -cgso * ag0; - gcgmbb = -pParam->BSIM4v6cgbo * ag0; - - gcdgmb = gcgmdb; - gcsgmb = gcgmsb; - gcbgmb = gcgmbb; - - gcggb = here->BSIM4v6cggb * ag0; - gcgdb = here->BSIM4v6cgdb * ag0; - gcgsb = here->BSIM4v6cgsb * ag0; - gcgbb = -(gcggb + gcgdb + gcgsb); - - gcdgb = here->BSIM4v6cdgb * ag0; - gcsgb = -(here->BSIM4v6cggb + here->BSIM4v6cbgb - + here->BSIM4v6cdgb) * ag0; - gcbgb = here->BSIM4v6cbgb * ag0; - - qgmb = pParam->BSIM4v6cgbo * vgmb; - qgmid = qgdo + qgso + qgmb; - qbulk -= qgmb; - qsrc = -(qgate + qgmid + qbulk + qdrn); - } - else - { gcggb = (here->BSIM4v6cggb + cgdo + cgso - + pParam->BSIM4v6cgbo ) * ag0; - gcgdb = (here->BSIM4v6cgdb - cgdo) * ag0; - gcgsb = (here->BSIM4v6cgsb - cgso) * ag0; - gcgbb = -(gcggb + gcgdb + gcgsb); - - gcdgb = (here->BSIM4v6cdgb - cgdo) * ag0; - gcsgb = -(here->BSIM4v6cggb + here->BSIM4v6cbgb - + here->BSIM4v6cdgb + cgso) * ag0; - gcbgb = (here->BSIM4v6cbgb - pParam->BSIM4v6cgbo) * ag0; - - gcdgmb = gcsgmb = gcbgmb = 0.0; - - qgb = pParam->BSIM4v6cgbo * vgb; - qgate += qgdo + qgso + qgb; - qbulk -= qgb; - qsrc = -(qgate + qbulk + qdrn); - } - gcddb = (here->BSIM4v6cddb + here->BSIM4v6capbd + cgdo) * ag0; - gcdsb = here->BSIM4v6cdsb * ag0; - - gcsdb = -(here->BSIM4v6cgdb + here->BSIM4v6cbdb - + here->BSIM4v6cddb) * ag0; - gcssb = (here->BSIM4v6capbs + cgso - (here->BSIM4v6cgsb - + here->BSIM4v6cbsb + here->BSIM4v6cdsb)) * ag0; - - if (!here->BSIM4v6rbodyMod) - { gcdbb = -(gcdgb + gcddb + gcdsb + gcdgmb); - gcsbb = -(gcsgb + gcsdb + gcssb + gcsgmb); - gcbdb = (here->BSIM4v6cbdb - here->BSIM4v6capbd) * ag0; - gcbsb = (here->BSIM4v6cbsb - here->BSIM4v6capbs) * ag0; - gcdbdb = 0.0; gcsbsb = 0.0; - } - else - { gcdbb = -(here->BSIM4v6cddb + here->BSIM4v6cdgb - + here->BSIM4v6cdsb) * ag0; - gcsbb = -(gcsgb + gcsdb + gcssb + gcsgmb) - + here->BSIM4v6capbs * ag0; - gcbdb = here->BSIM4v6cbdb * ag0; - gcbsb = here->BSIM4v6cbsb * ag0; - - gcdbdb = -here->BSIM4v6capbd * ag0; - gcsbsb = -here->BSIM4v6capbs * ag0; - } - gcbbb = -(gcbdb + gcbgb + gcbsb + gcbgmb); - - ggtg = ggtd = ggtb = ggts = 0.0; - sxpart = 0.6; - dxpart = 0.4; - ddxpart_dVd = ddxpart_dVg = ddxpart_dVb = ddxpart_dVs = 0.0; - dsxpart_dVd = dsxpart_dVg = dsxpart_dVb = dsxpart_dVs = 0.0; - } - else - { qcheq = here->BSIM4v6qchqs; - CoxWL = model->BSIM4v6coxe * pParam->BSIM4v6weffCV * here->BSIM4v6nf - * pParam->BSIM4v6leffCV; - T0 = qdef * ScalingFactor / CoxWL; - - ggtg = here->BSIM4v6gtg = T0 * here->BSIM4v6gcrgg; - ggtd = here->BSIM4v6gtd = T0 * here->BSIM4v6gcrgd; - ggts = here->BSIM4v6gts = T0 * here->BSIM4v6gcrgs; - ggtb = here->BSIM4v6gtb = T0 * here->BSIM4v6gcrgb; - gqdef = ScalingFactor * ag0; - - gcqgb = here->BSIM4v6cqgb * ag0; - gcqdb = here->BSIM4v6cqdb * ag0; - gcqsb = here->BSIM4v6cqsb * ag0; - gcqbb = here->BSIM4v6cqbb * ag0; - - if (fabs(qcheq) <= 1.0e-5 * CoxWL) - { if (model->BSIM4v6xpart < 0.5) - { dxpart = 0.4; - } - else if (model->BSIM4v6xpart > 0.5) - { dxpart = 0.0; - } - else - { dxpart = 0.5; - } - ddxpart_dVd = ddxpart_dVg = ddxpart_dVb - = ddxpart_dVs = 0.0; - } - else - { dxpart = qdrn / qcheq; - Cdd = here->BSIM4v6cddb; - Csd = -(here->BSIM4v6cgdb + here->BSIM4v6cddb - + here->BSIM4v6cbdb); - ddxpart_dVd = (Cdd - dxpart * (Cdd + Csd)) / qcheq; - Cdg = here->BSIM4v6cdgb; - Csg = -(here->BSIM4v6cggb + here->BSIM4v6cdgb - + here->BSIM4v6cbgb); - ddxpart_dVg = (Cdg - dxpart * (Cdg + Csg)) / qcheq; - - Cds = here->BSIM4v6cdsb; - Css = -(here->BSIM4v6cgsb + here->BSIM4v6cdsb - + here->BSIM4v6cbsb); - ddxpart_dVs = (Cds - dxpart * (Cds + Css)) / qcheq; - - ddxpart_dVb = -(ddxpart_dVd + ddxpart_dVg + ddxpart_dVs); - } - sxpart = 1.0 - dxpart; - dsxpart_dVd = -ddxpart_dVd; - dsxpart_dVg = -ddxpart_dVg; - dsxpart_dVs = -ddxpart_dVs; - dsxpart_dVb = -(dsxpart_dVd + dsxpart_dVg + dsxpart_dVs); - - if (here->BSIM4v6rgateMod == 3) - { gcgmgmb = (cgdo + cgso + pParam->BSIM4v6cgbo) * ag0; - gcgmdb = -cgdo * ag0; - gcgmsb = -cgso * ag0; - gcgmbb = -pParam->BSIM4v6cgbo * ag0; - - gcdgmb = gcgmdb; - gcsgmb = gcgmsb; - gcbgmb = gcgmbb; - - gcdgb = gcsgb = gcbgb = 0.0; - gcggb = gcgdb = gcgsb = gcgbb = 0.0; - - qgmb = pParam->BSIM4v6cgbo * vgmb; - qgmid = qgdo + qgso + qgmb; - qgate = 0.0; - qbulk = -qgmb; - qdrn = -qgdo; - qsrc = -(qgmid + qbulk + qdrn); - } - else - { gcggb = (cgdo + cgso + pParam->BSIM4v6cgbo ) * ag0; - gcgdb = -cgdo * ag0; - gcgsb = -cgso * ag0; - gcgbb = -pParam->BSIM4v6cgbo * ag0; - - gcdgb = gcgdb; - gcsgb = gcgsb; - gcbgb = gcgbb; - gcdgmb = gcsgmb = gcbgmb = 0.0; - - qgb = pParam->BSIM4v6cgbo * vgb; - qgate = qgdo + qgso + qgb; - qbulk = -qgb; - qdrn = -qgdo; - qsrc = -(qgate + qbulk + qdrn); - } - - gcddb = (here->BSIM4v6capbd + cgdo) * ag0; - gcdsb = gcsdb = 0.0; - gcssb = (here->BSIM4v6capbs + cgso) * ag0; - - if (!here->BSIM4v6rbodyMod) - { gcdbb = -(gcdgb + gcddb + gcdgmb); - gcsbb = -(gcsgb + gcssb + gcsgmb); - gcbdb = -here->BSIM4v6capbd * ag0; - gcbsb = -here->BSIM4v6capbs * ag0; - gcdbdb = 0.0; gcsbsb = 0.0; - } - else - { gcdbb = gcsbb = gcbdb = gcbsb = 0.0; - gcdbdb = -here->BSIM4v6capbd * ag0; - gcsbsb = -here->BSIM4v6capbs * ag0; - } - gcbbb = -(gcbdb + gcbgb + gcbsb + gcbgmb); - } - } - else - { if (here->BSIM4v6trnqsMod == 0) - { qsrc = qdrn - qgso; - if (here->BSIM4v6rgateMod == 3) - { gcgmgmb = (cgdo + cgso + pParam->BSIM4v6cgbo) * ag0; - gcgmdb = -cgdo * ag0; - gcgmsb = -cgso * ag0; - gcgmbb = -pParam->BSIM4v6cgbo * ag0; - - gcdgmb = gcgmdb; - gcsgmb = gcgmsb; - gcbgmb = gcgmbb; - - gcggb = here->BSIM4v6cggb * ag0; - gcgdb = here->BSIM4v6cgsb * ag0; - gcgsb = here->BSIM4v6cgdb * ag0; - gcgbb = -(gcggb + gcgdb + gcgsb); - - gcdgb = -(here->BSIM4v6cggb + here->BSIM4v6cbgb - + here->BSIM4v6cdgb) * ag0; - gcsgb = here->BSIM4v6cdgb * ag0; - gcbgb = here->BSIM4v6cbgb * ag0; - - qgmb = pParam->BSIM4v6cgbo * vgmb; - qgmid = qgdo + qgso + qgmb; - qbulk -= qgmb; - qdrn = -(qgate + qgmid + qbulk + qsrc); - } - else - { gcggb = (here->BSIM4v6cggb + cgdo + cgso - + pParam->BSIM4v6cgbo ) * ag0; - gcgdb = (here->BSIM4v6cgsb - cgdo) * ag0; - gcgsb = (here->BSIM4v6cgdb - cgso) * ag0; - gcgbb = -(gcggb + gcgdb + gcgsb); - - gcdgb = -(here->BSIM4v6cggb + here->BSIM4v6cbgb - + here->BSIM4v6cdgb + cgdo) * ag0; - gcsgb = (here->BSIM4v6cdgb - cgso) * ag0; - gcbgb = (here->BSIM4v6cbgb - pParam->BSIM4v6cgbo) * ag0; - - gcdgmb = gcsgmb = gcbgmb = 0.0; - - qgb = pParam->BSIM4v6cgbo * vgb; - qgate += qgdo + qgso + qgb; - qbulk -= qgb; - qdrn = -(qgate + qbulk + qsrc); - } - gcddb = (here->BSIM4v6capbd + cgdo - (here->BSIM4v6cgsb - + here->BSIM4v6cbsb + here->BSIM4v6cdsb)) * ag0; - gcdsb = -(here->BSIM4v6cgdb + here->BSIM4v6cbdb - + here->BSIM4v6cddb) * ag0; - - gcsdb = here->BSIM4v6cdsb * ag0; - gcssb = (here->BSIM4v6cddb + here->BSIM4v6capbs + cgso) * ag0; - - if (!here->BSIM4v6rbodyMod) - { gcdbb = -(gcdgb + gcddb + gcdsb + gcdgmb); - gcsbb = -(gcsgb + gcsdb + gcssb + gcsgmb); - gcbdb = (here->BSIM4v6cbsb - here->BSIM4v6capbd) * ag0; - gcbsb = (here->BSIM4v6cbdb - here->BSIM4v6capbs) * ag0; - gcdbdb = 0.0; gcsbsb = 0.0; - } - else - { gcdbb = -(gcdgb + gcddb + gcdsb + gcdgmb) - + here->BSIM4v6capbd * ag0; - gcsbb = -(here->BSIM4v6cddb + here->BSIM4v6cdgb - + here->BSIM4v6cdsb) * ag0; - gcbdb = here->BSIM4v6cbsb * ag0; - gcbsb = here->BSIM4v6cbdb * ag0; - gcdbdb = -here->BSIM4v6capbd * ag0; - gcsbsb = -here->BSIM4v6capbs * ag0; - } - gcbbb = -(gcbgb + gcbdb + gcbsb + gcbgmb); - - ggtg = ggtd = ggtb = ggts = 0.0; - sxpart = 0.4; - dxpart = 0.6; - ddxpart_dVd = ddxpart_dVg = ddxpart_dVb = ddxpart_dVs = 0.0; - dsxpart_dVd = dsxpart_dVg = dsxpart_dVb = dsxpart_dVs = 0.0; - } - else - { qcheq = here->BSIM4v6qchqs; - CoxWL = model->BSIM4v6coxe * pParam->BSIM4v6weffCV * here->BSIM4v6nf - * pParam->BSIM4v6leffCV; - T0 = qdef * ScalingFactor / CoxWL; - ggtg = here->BSIM4v6gtg = T0 * here->BSIM4v6gcrgg; - ggts = here->BSIM4v6gts = T0 * here->BSIM4v6gcrgd; - ggtd = here->BSIM4v6gtd = T0 * here->BSIM4v6gcrgs; - ggtb = here->BSIM4v6gtb = T0 * here->BSIM4v6gcrgb; - gqdef = ScalingFactor * ag0; - - gcqgb = here->BSIM4v6cqgb * ag0; - gcqdb = here->BSIM4v6cqsb * ag0; - gcqsb = here->BSIM4v6cqdb * ag0; - gcqbb = here->BSIM4v6cqbb * ag0; - - if (fabs(qcheq) <= 1.0e-5 * CoxWL) - { if (model->BSIM4v6xpart < 0.5) - { sxpart = 0.4; - } - else if (model->BSIM4v6xpart > 0.5) - { sxpart = 0.0; - } - else - { sxpart = 0.5; - } - dsxpart_dVd = dsxpart_dVg = dsxpart_dVb - = dsxpart_dVs = 0.0; - } - else - { sxpart = qdrn / qcheq; - Css = here->BSIM4v6cddb; - Cds = -(here->BSIM4v6cgdb + here->BSIM4v6cddb - + here->BSIM4v6cbdb); - dsxpart_dVs = (Css - sxpart * (Css + Cds)) / qcheq; - Csg = here->BSIM4v6cdgb; - Cdg = -(here->BSIM4v6cggb + here->BSIM4v6cdgb - + here->BSIM4v6cbgb); - dsxpart_dVg = (Csg - sxpart * (Csg + Cdg)) / qcheq; - - Csd = here->BSIM4v6cdsb; - Cdd = -(here->BSIM4v6cgsb + here->BSIM4v6cdsb - + here->BSIM4v6cbsb); - dsxpart_dVd = (Csd - sxpart * (Csd + Cdd)) / qcheq; - - dsxpart_dVb = -(dsxpart_dVd + dsxpart_dVg + dsxpart_dVs); - } - dxpart = 1.0 - sxpart; - ddxpart_dVd = -dsxpart_dVd; - ddxpart_dVg = -dsxpart_dVg; - ddxpart_dVs = -dsxpart_dVs; - ddxpart_dVb = -(ddxpart_dVd + ddxpart_dVg + ddxpart_dVs); - - if (here->BSIM4v6rgateMod == 3) - { gcgmgmb = (cgdo + cgso + pParam->BSIM4v6cgbo) * ag0; - gcgmdb = -cgdo * ag0; - gcgmsb = -cgso * ag0; - gcgmbb = -pParam->BSIM4v6cgbo * ag0; - - gcdgmb = gcgmdb; - gcsgmb = gcgmsb; - gcbgmb = gcgmbb; - - gcdgb = gcsgb = gcbgb = 0.0; - gcggb = gcgdb = gcgsb = gcgbb = 0.0; - - qgmb = pParam->BSIM4v6cgbo * vgmb; - qgmid = qgdo + qgso + qgmb; - qgate = 0.0; - qbulk = -qgmb; - qdrn = -qgdo; - qsrc = -qgso; - } - else - { gcggb = (cgdo + cgso + pParam->BSIM4v6cgbo ) * ag0; - gcgdb = -cgdo * ag0; - gcgsb = -cgso * ag0; - gcgbb = -pParam->BSIM4v6cgbo * ag0; - - gcdgb = gcgdb; - gcsgb = gcgsb; - gcbgb = gcgbb; - gcdgmb = gcsgmb = gcbgmb = 0.0; - - qgb = pParam->BSIM4v6cgbo * vgb; - qgate = qgdo + qgso + qgb; - qbulk = -qgb; - qdrn = -qgdo; - qsrc = -qgso; - } - - gcddb = (here->BSIM4v6capbd + cgdo) * ag0; - gcdsb = gcsdb = 0.0; - gcssb = (here->BSIM4v6capbs + cgso) * ag0; - if (!here->BSIM4v6rbodyMod) - { gcdbb = -(gcdgb + gcddb + gcdgmb); - gcsbb = -(gcsgb + gcssb + gcsgmb); - gcbdb = -here->BSIM4v6capbd * ag0; - gcbsb = -here->BSIM4v6capbs * ag0; - gcdbdb = 0.0; gcsbsb = 0.0; - } - else - { gcdbb = gcsbb = gcbdb = gcbsb = 0.0; - gcdbdb = -here->BSIM4v6capbd * ag0; - gcsbsb = -here->BSIM4v6capbs * ag0; - } - gcbbb = -(gcbdb + gcbgb + gcbsb + gcbgmb); - } - } - - - if (here->BSIM4v6trnqsMod) - { *(ckt->CKTstate0 + here->BSIM4v6qcdump) = qdef * ScalingFactor; - if (ckt->CKTmode & MODEINITTRAN) - *(ckt->CKTstate1 + here->BSIM4v6qcdump) = - *(ckt->CKTstate0 + here->BSIM4v6qcdump); - error = NIintegrate(ckt, &geq, &ceq, 0.0, here->BSIM4v6qcdump); - if (error) - return(error); - } - - if (ByPass) goto line860; - - *(ckt->CKTstate0 + here->BSIM4v6qg) = qgate; - *(ckt->CKTstate0 + here->BSIM4v6qd) = qdrn - - *(ckt->CKTstate0 + here->BSIM4v6qbd); - *(ckt->CKTstate0 + here->BSIM4v6qs) = qsrc - - *(ckt->CKTstate0 + here->BSIM4v6qbs); - if (here->BSIM4v6rgateMod == 3) - *(ckt->CKTstate0 + here->BSIM4v6qgmid) = qgmid; - - if (!here->BSIM4v6rbodyMod) - { *(ckt->CKTstate0 + here->BSIM4v6qb) = qbulk - + *(ckt->CKTstate0 + here->BSIM4v6qbd) - + *(ckt->CKTstate0 + here->BSIM4v6qbs); - } - else - *(ckt->CKTstate0 + here->BSIM4v6qb) = qbulk; - - - /* Store small signal parameters */ - if (ckt->CKTmode & MODEINITSMSIG) - { goto line1000; - } - - if (!ChargeComputationNeeded) - goto line850; - - if (ckt->CKTmode & MODEINITTRAN) - { *(ckt->CKTstate1 + here->BSIM4v6qb) = - *(ckt->CKTstate0 + here->BSIM4v6qb); - *(ckt->CKTstate1 + here->BSIM4v6qg) = - *(ckt->CKTstate0 + here->BSIM4v6qg); - *(ckt->CKTstate1 + here->BSIM4v6qd) = - *(ckt->CKTstate0 + here->BSIM4v6qd); - if (here->BSIM4v6rgateMod == 3) - *(ckt->CKTstate1 + here->BSIM4v6qgmid) = - *(ckt->CKTstate0 + here->BSIM4v6qgmid); - if (here->BSIM4v6rbodyMod) - { *(ckt->CKTstate1 + here->BSIM4v6qbs) = - *(ckt->CKTstate0 + here->BSIM4v6qbs); - *(ckt->CKTstate1 + here->BSIM4v6qbd) = - *(ckt->CKTstate0 + here->BSIM4v6qbd); - } - } - - error = NIintegrate(ckt, &geq, &ceq, 0.0, here->BSIM4v6qb); - if (error) - return(error); - error = NIintegrate(ckt, &geq, &ceq, 0.0, here->BSIM4v6qg); - if (error) - return(error); - error = NIintegrate(ckt, &geq, &ceq, 0.0, here->BSIM4v6qd); - if (error) - return(error); - - if (here->BSIM4v6rgateMod == 3) - { error = NIintegrate(ckt, &geq, &ceq, 0.0, here->BSIM4v6qgmid); - if (error) return(error); - } - - if (here->BSIM4v6rbodyMod) - { error = NIintegrate(ckt, &geq, &ceq, 0.0, here->BSIM4v6qbs); - if (error) - return(error); - error = NIintegrate(ckt, &geq, &ceq, 0.0, here->BSIM4v6qbd); - if (error) - return(error); - } - - goto line860; - - -line850: - /* Zero gcap and ceqcap if (!ChargeComputationNeeded) */ - ceqqg = ceqqb = ceqqd = 0.0; - ceqqjd = ceqqjs = 0.0; - cqcheq = cqdef = 0.0; - - gcdgb = gcddb = gcdsb = gcdbb = 0.0; - gcsgb = gcsdb = gcssb = gcsbb = 0.0; - gcggb = gcgdb = gcgsb = gcgbb = 0.0; - gcbdb = gcbgb = gcbsb = gcbbb = 0.0; - - gcgmgmb = gcgmdb = gcgmsb = gcgmbb = 0.0; - gcdgmb = gcsgmb = gcbgmb = ceqqgmid = 0.0; - gcdbdb = gcsbsb = 0.0; - - gqdef = gcqgb = gcqdb = gcqsb = gcqbb = 0.0; - ggtg = ggtd = ggtb = ggts = 0.0; - sxpart = (1.0 - (dxpart = (here->BSIM4v6mode > 0) ? 0.4 : 0.6)); - ddxpart_dVd = ddxpart_dVg = ddxpart_dVb = ddxpart_dVs = 0.0; - dsxpart_dVd = dsxpart_dVg = dsxpart_dVb = dsxpart_dVs = 0.0; - - if (here->BSIM4v6trnqsMod) - { CoxWL = model->BSIM4v6coxe * pParam->BSIM4v6weffCV * here->BSIM4v6nf - * pParam->BSIM4v6leffCV; - T1 = here->BSIM4v6gcrg / CoxWL; - here->BSIM4v6gtau = T1 * ScalingFactor; - } - else - here->BSIM4v6gtau = 0.0; - - goto line900; - - -line860: - /* Calculate equivalent charge current */ - - cqgate = *(ckt->CKTstate0 + here->BSIM4v6cqg); - cqbody = *(ckt->CKTstate0 + here->BSIM4v6cqb); - cqdrn = *(ckt->CKTstate0 + here->BSIM4v6cqd); - - ceqqg = cqgate - gcggb * vgb + gcgdb * vbd + gcgsb * vbs; - ceqqd = cqdrn - gcdgb * vgb - gcdgmb * vgmb + (gcddb + gcdbdb) - * vbd - gcdbdb * vbd_jct + gcdsb * vbs; - ceqqb = cqbody - gcbgb * vgb - gcbgmb * vgmb - + gcbdb * vbd + gcbsb * vbs; - - - if (here->BSIM4v6rgateMod == 3) - ceqqgmid = *(ckt->CKTstate0 + here->BSIM4v6cqgmid) - + gcgmdb * vbd + gcgmsb * vbs - gcgmgmb * vgmb; - else - ceqqgmid = 0.0; - - if (here->BSIM4v6rbodyMod) - { ceqqjs = *(ckt->CKTstate0 + here->BSIM4v6cqbs) + gcsbsb * vbs_jct; - ceqqjd = *(ckt->CKTstate0 + here->BSIM4v6cqbd) + gcdbdb * vbd_jct; - } - - if (here->BSIM4v6trnqsMod) - { T0 = ggtg * vgb - ggtd * vbd - ggts * vbs; - ceqqg += T0; - T1 = qdef * here->BSIM4v6gtau; - ceqqd -= dxpart * T0 + T1 * (ddxpart_dVg * vgb - ddxpart_dVd - * vbd - ddxpart_dVs * vbs); - cqdef = *(ckt->CKTstate0 + here->BSIM4v6cqcdump) - gqdef * qdef; - cqcheq = *(ckt->CKTstate0 + here->BSIM4v6cqcheq) - - (gcqgb * vgb - gcqdb * vbd - gcqsb * vbs) + T0; - } - - if (ckt->CKTmode & MODEINITTRAN) - { *(ckt->CKTstate1 + here->BSIM4v6cqb) = - *(ckt->CKTstate0 + here->BSIM4v6cqb); - *(ckt->CKTstate1 + here->BSIM4v6cqg) = - *(ckt->CKTstate0 + here->BSIM4v6cqg); - *(ckt->CKTstate1 + here->BSIM4v6cqd) = - *(ckt->CKTstate0 + here->BSIM4v6cqd); - - if (here->BSIM4v6rgateMod == 3) - *(ckt->CKTstate1 + here->BSIM4v6cqgmid) = - *(ckt->CKTstate0 + here->BSIM4v6cqgmid); - - if (here->BSIM4v6rbodyMod) - { *(ckt->CKTstate1 + here->BSIM4v6cqbs) = - *(ckt->CKTstate0 + here->BSIM4v6cqbs); - *(ckt->CKTstate1 + here->BSIM4v6cqbd) = - *(ckt->CKTstate0 + here->BSIM4v6cqbd); - } - } - - - /* - * Load current vector - */ - -line900: - if (here->BSIM4v6mode >= 0) - { Gm = here->BSIM4v6gm; - Gmbs = here->BSIM4v6gmbs; - FwdSum = Gm + Gmbs; - RevSum = 0.0; - - ceqdrn = model->BSIM4v6type * (cdrain - here->BSIM4v6gds * vds - - Gm * vgs - Gmbs * vbs); - ceqbd = model->BSIM4v6type * (here->BSIM4v6csub + here->BSIM4v6Igidl - - (here->BSIM4v6gbds + here->BSIM4v6ggidld) * vds - - (here->BSIM4v6gbgs + here->BSIM4v6ggidlg) * vgs - - (here->BSIM4v6gbbs + here->BSIM4v6ggidlb) * vbs); - ceqbs = model->BSIM4v6type * (here->BSIM4v6Igisl + here->BSIM4v6ggisls * vds - - here->BSIM4v6ggislg * vgd - here->BSIM4v6ggislb * vbd); - - gbbdp = -(here->BSIM4v6gbds); - gbbsp = here->BSIM4v6gbds + here->BSIM4v6gbgs + here->BSIM4v6gbbs; - - gbdpg = here->BSIM4v6gbgs; - gbdpdp = here->BSIM4v6gbds; - gbdpb = here->BSIM4v6gbbs; - gbdpsp = -(gbdpg + gbdpdp + gbdpb); - - gbspg = 0.0; - gbspdp = 0.0; - gbspb = 0.0; - gbspsp = 0.0; - - if (model->BSIM4v6igcMod) - { gIstotg = here->BSIM4v6gIgsg + here->BSIM4v6gIgcsg; - gIstotd = here->BSIM4v6gIgcsd; - gIstots = here->BSIM4v6gIgss + here->BSIM4v6gIgcss; - gIstotb = here->BSIM4v6gIgcsb; - Istoteq = model->BSIM4v6type * (here->BSIM4v6Igs + here->BSIM4v6Igcs - - gIstotg * vgs - here->BSIM4v6gIgcsd * vds - - here->BSIM4v6gIgcsb * vbs); - - gIdtotg = here->BSIM4v6gIgdg + here->BSIM4v6gIgcdg; - gIdtotd = here->BSIM4v6gIgdd + here->BSIM4v6gIgcdd; - gIdtots = here->BSIM4v6gIgcds; - gIdtotb = here->BSIM4v6gIgcdb; - Idtoteq = model->BSIM4v6type * (here->BSIM4v6Igd + here->BSIM4v6Igcd - - here->BSIM4v6gIgdg * vgd - here->BSIM4v6gIgcdg * vgs - - here->BSIM4v6gIgcdd * vds - here->BSIM4v6gIgcdb * vbs); - } - else - { gIstotg = gIstotd = gIstots = gIstotb = Istoteq = 0.0; - gIdtotg = gIdtotd = gIdtots = gIdtotb = Idtoteq = 0.0; - } - - if (model->BSIM4v6igbMod) - { gIbtotg = here->BSIM4v6gIgbg; - gIbtotd = here->BSIM4v6gIgbd; - gIbtots = here->BSIM4v6gIgbs; - gIbtotb = here->BSIM4v6gIgbb; - Ibtoteq = model->BSIM4v6type * (here->BSIM4v6Igb - - here->BSIM4v6gIgbg * vgs - here->BSIM4v6gIgbd * vds - - here->BSIM4v6gIgbb * vbs); - } - else - gIbtotg = gIbtotd = gIbtots = gIbtotb = Ibtoteq = 0.0; - - if ((model->BSIM4v6igcMod != 0) || (model->BSIM4v6igbMod != 0)) - { gIgtotg = gIstotg + gIdtotg + gIbtotg; - gIgtotd = gIstotd + gIdtotd + gIbtotd ; - gIgtots = gIstots + gIdtots + gIbtots; - gIgtotb = gIstotb + gIdtotb + gIbtotb; - Igtoteq = Istoteq + Idtoteq + Ibtoteq; - } - else - gIgtotg = gIgtotd = gIgtots = gIgtotb = Igtoteq = 0.0; - - - if (here->BSIM4v6rgateMod == 2) - T0 = vges - vgs; - else if (here->BSIM4v6rgateMod == 3) - T0 = vgms - vgs; - if (here->BSIM4v6rgateMod > 1) - { gcrgd = here->BSIM4v6gcrgd * T0; - gcrgg = here->BSIM4v6gcrgg * T0; - gcrgs = here->BSIM4v6gcrgs * T0; - gcrgb = here->BSIM4v6gcrgb * T0; - ceqgcrg = -(gcrgd * vds + gcrgg * vgs - + gcrgb * vbs); - gcrgg -= here->BSIM4v6gcrg; - gcrg = here->BSIM4v6gcrg; - } - else - ceqgcrg = gcrg = gcrgd = gcrgg = gcrgs = gcrgb = 0.0; - } - else - { Gm = -here->BSIM4v6gm; - Gmbs = -here->BSIM4v6gmbs; - FwdSum = 0.0; - RevSum = -(Gm + Gmbs); - - ceqdrn = -model->BSIM4v6type * (cdrain + here->BSIM4v6gds * vds - + Gm * vgd + Gmbs * vbd); - - ceqbs = model->BSIM4v6type * (here->BSIM4v6csub + here->BSIM4v6Igisl - + (here->BSIM4v6gbds + here->BSIM4v6ggisls) * vds - - (here->BSIM4v6gbgs + here->BSIM4v6ggislg) * vgd - - (here->BSIM4v6gbbs + here->BSIM4v6ggislb) * vbd); - ceqbd = model->BSIM4v6type * (here->BSIM4v6Igidl - here->BSIM4v6ggidld * vds - - here->BSIM4v6ggidlg * vgs - here->BSIM4v6ggidlb * vbs); - - gbbsp = -(here->BSIM4v6gbds); - gbbdp = here->BSIM4v6gbds + here->BSIM4v6gbgs + here->BSIM4v6gbbs; - - gbdpg = 0.0; - gbdpsp = 0.0; - gbdpb = 0.0; - gbdpdp = 0.0; - - gbspg = here->BSIM4v6gbgs; - gbspsp = here->BSIM4v6gbds; - gbspb = here->BSIM4v6gbbs; - gbspdp = -(gbspg + gbspsp + gbspb); - - if (model->BSIM4v6igcMod) - { gIstotg = here->BSIM4v6gIgsg + here->BSIM4v6gIgcdg; - gIstotd = here->BSIM4v6gIgcds; - gIstots = here->BSIM4v6gIgss + here->BSIM4v6gIgcdd; - gIstotb = here->BSIM4v6gIgcdb; - Istoteq = model->BSIM4v6type * (here->BSIM4v6Igs + here->BSIM4v6Igcd - - here->BSIM4v6gIgsg * vgs - here->BSIM4v6gIgcdg * vgd - + here->BSIM4v6gIgcdd * vds - here->BSIM4v6gIgcdb * vbd); - - gIdtotg = here->BSIM4v6gIgdg + here->BSIM4v6gIgcsg; - gIdtotd = here->BSIM4v6gIgdd + here->BSIM4v6gIgcss; - gIdtots = here->BSIM4v6gIgcsd; - gIdtotb = here->BSIM4v6gIgcsb; - Idtoteq = model->BSIM4v6type * (here->BSIM4v6Igd + here->BSIM4v6Igcs - - (here->BSIM4v6gIgdg + here->BSIM4v6gIgcsg) * vgd - + here->BSIM4v6gIgcsd * vds - here->BSIM4v6gIgcsb * vbd); - } - else - { gIstotg = gIstotd = gIstots = gIstotb = Istoteq = 0.0; - gIdtotg = gIdtotd = gIdtots = gIdtotb = Idtoteq = 0.0; - } - - if (model->BSIM4v6igbMod) - { gIbtotg = here->BSIM4v6gIgbg; - gIbtotd = here->BSIM4v6gIgbs; - gIbtots = here->BSIM4v6gIgbd; - gIbtotb = here->BSIM4v6gIgbb; - Ibtoteq = model->BSIM4v6type * (here->BSIM4v6Igb - - here->BSIM4v6gIgbg * vgd + here->BSIM4v6gIgbd * vds - - here->BSIM4v6gIgbb * vbd); - } - else - gIbtotg = gIbtotd = gIbtots = gIbtotb = Ibtoteq = 0.0; - - if ((model->BSIM4v6igcMod != 0) || (model->BSIM4v6igbMod != 0)) - { gIgtotg = gIstotg + gIdtotg + gIbtotg; - gIgtotd = gIstotd + gIdtotd + gIbtotd ; - gIgtots = gIstots + gIdtots + gIbtots; - gIgtotb = gIstotb + gIdtotb + gIbtotb; - Igtoteq = Istoteq + Idtoteq + Ibtoteq; - } - else - gIgtotg = gIgtotd = gIgtots = gIgtotb = Igtoteq = 0.0; - - - if (here->BSIM4v6rgateMod == 2) - T0 = vges - vgs; - else if (here->BSIM4v6rgateMod == 3) - T0 = vgms - vgs; - if (here->BSIM4v6rgateMod > 1) - { gcrgd = here->BSIM4v6gcrgs * T0; - gcrgg = here->BSIM4v6gcrgg * T0; - gcrgs = here->BSIM4v6gcrgd * T0; - gcrgb = here->BSIM4v6gcrgb * T0; - ceqgcrg = -(gcrgg * vgd - gcrgs * vds - + gcrgb * vbd); - gcrgg -= here->BSIM4v6gcrg; - gcrg = here->BSIM4v6gcrg; - } - else - ceqgcrg = gcrg = gcrgd = gcrgg = gcrgs = gcrgb = 0.0; - } - - if (model->BSIM4v6rdsMod == 1) - { ceqgstot = model->BSIM4v6type * (here->BSIM4v6gstotd * vds - + here->BSIM4v6gstotg * vgs + here->BSIM4v6gstotb * vbs); - /* WDLiu: ceqgstot flowing away from sNodePrime */ - gstot = here->BSIM4v6gstot; - gstotd = here->BSIM4v6gstotd; - gstotg = here->BSIM4v6gstotg; - gstots = here->BSIM4v6gstots - gstot; - gstotb = here->BSIM4v6gstotb; - - ceqgdtot = -model->BSIM4v6type * (here->BSIM4v6gdtotd * vds - + here->BSIM4v6gdtotg * vgs + here->BSIM4v6gdtotb * vbs); - /* WDLiu: ceqgdtot defined as flowing into dNodePrime */ - gdtot = here->BSIM4v6gdtot; - gdtotd = here->BSIM4v6gdtotd - gdtot; - gdtotg = here->BSIM4v6gdtotg; - gdtots = here->BSIM4v6gdtots; - gdtotb = here->BSIM4v6gdtotb; - } - else - { gstot = gstotd = gstotg = gstots = gstotb = ceqgstot = 0.0; - gdtot = gdtotd = gdtotg = gdtots = gdtotb = ceqgdtot = 0.0; - } - - if (model->BSIM4v6type > 0) - { ceqjs = (here->BSIM4v6cbs - here->BSIM4v6gbs * vbs_jct); - ceqjd = (here->BSIM4v6cbd - here->BSIM4v6gbd * vbd_jct); - } - else - { ceqjs = -(here->BSIM4v6cbs - here->BSIM4v6gbs * vbs_jct); - ceqjd = -(here->BSIM4v6cbd - here->BSIM4v6gbd * vbd_jct); - ceqqg = -ceqqg; - ceqqd = -ceqqd; - ceqqb = -ceqqb; - ceqgcrg = -ceqgcrg; - - if (here->BSIM4v6trnqsMod) - { cqdef = -cqdef; - cqcheq = -cqcheq; - } - - if (here->BSIM4v6rbodyMod) - { ceqqjs = -ceqqjs; - ceqqjd = -ceqqjd; - } - - if (here->BSIM4v6rgateMod == 3) - ceqqgmid = -ceqqgmid; - } - - - /* - * Loading RHS - */ - - m = here->BSIM4v6m; - -#ifdef USE_OMP - here->BSIM4v6rhsdPrime = m * (ceqjd - ceqbd + ceqgdtot - - ceqdrn - ceqqd + Idtoteq); - here->BSIM4v6rhsgPrime = m * (ceqqg - ceqgcrg + Igtoteq); - - if (here->BSIM4v6rgateMod == 2) - here->BSIM4v6rhsgExt = m * ceqgcrg; - else if (here->BSIM4v6rgateMod == 3) - here->BSIM4v6grhsMid = m * (ceqqgmid + ceqgcrg); - - if (!here->BSIM4v6rbodyMod) - { here->BSIM4v6rhsbPrime = m * (ceqbd + ceqbs - ceqjd - - ceqjs - ceqqb + Ibtoteq); - here->BSIM4v6rhssPrime = m * (ceqdrn - ceqbs + ceqjs - + ceqqg + ceqqb + ceqqd + ceqqgmid - ceqgstot + Istoteq); - } - else - { here->BSIM4v6rhsdb = m * (ceqjd + ceqqjd); - here->BSIM4v6rhsbPrime = m * (ceqbd + ceqbs - ceqqb + Ibtoteq); - here->BSIM4v6rhssb = m * (ceqjs + ceqqjs); - here->BSIM4v6rhssPrime = m * (ceqdrn - ceqbs + ceqjs + ceqqd - + ceqqg + ceqqb + ceqqjd + ceqqjs + ceqqgmid - ceqgstot + Istoteq); - } - - if (model->BSIM4v6rdsMod) - { here->BSIM4v6rhsd = m * ceqgdtot; - here->BSIM4v6rhss = m * ceqgstot; - } - - if (here->BSIM4v6trnqsMod) - here->BSIM4v6rhsq = m * (cqcheq - cqdef); -#else - (*(ckt->CKTrhs + here->BSIM4v6dNodePrime) += m * (ceqjd - ceqbd + ceqgdtot - - ceqdrn - ceqqd + Idtoteq)); - (*(ckt->CKTrhs + here->BSIM4v6gNodePrime) -= m * (ceqqg - ceqgcrg + Igtoteq)); - - if (here->BSIM4v6rgateMod == 2) - (*(ckt->CKTrhs + here->BSIM4v6gNodeExt) -= m * ceqgcrg); - else if (here->BSIM4v6rgateMod == 3) - (*(ckt->CKTrhs + here->BSIM4v6gNodeMid) -= m * (ceqqgmid + ceqgcrg)); - - if (!here->BSIM4v6rbodyMod) - { (*(ckt->CKTrhs + here->BSIM4v6bNodePrime) += m * (ceqbd + ceqbs - ceqjd - - ceqjs - ceqqb + Ibtoteq)); - (*(ckt->CKTrhs + here->BSIM4v6sNodePrime) += m * (ceqdrn - ceqbs + ceqjs - + ceqqg + ceqqb + ceqqd + ceqqgmid - ceqgstot + Istoteq)); - } - - else - { (*(ckt->CKTrhs + here->BSIM4v6dbNode) -= m * (ceqjd + ceqqjd)); - (*(ckt->CKTrhs + here->BSIM4v6bNodePrime) += m * (ceqbd + ceqbs - ceqqb + Ibtoteq)); - (*(ckt->CKTrhs + here->BSIM4v6sbNode) -= m * (ceqjs + ceqqjs)); - (*(ckt->CKTrhs + here->BSIM4v6sNodePrime) += m * (ceqdrn - ceqbs + ceqjs + ceqqd - + ceqqg + ceqqb + ceqqjd + ceqqjs + ceqqgmid - ceqgstot + Istoteq)); - } - - if (model->BSIM4v6rdsMod) - { (*(ckt->CKTrhs + here->BSIM4v6dNode) -= m * ceqgdtot); - (*(ckt->CKTrhs + here->BSIM4v6sNode) += m * ceqgstot); - } - - if (here->BSIM4v6trnqsMod) - *(ckt->CKTrhs + here->BSIM4v6qNode) += m * (cqcheq - cqdef); -#endif - - /* - * Loading matrix - */ - - if (!here->BSIM4v6rbodyMod) - { gjbd = here->BSIM4v6gbd; - gjbs = here->BSIM4v6gbs; - } - else - gjbd = gjbs = 0.0; - - if (!model->BSIM4v6rdsMod) - { gdpr = here->BSIM4v6drainConductance; - gspr = here->BSIM4v6sourceConductance; - } - else - gdpr = gspr = 0.0; - - geltd = here->BSIM4v6grgeltd; - - T1 = qdef * here->BSIM4v6gtau; -#ifdef USE_OMP - if (here->BSIM4v6rgateMod == 1) - { here->BSIM4v6_1 = m * geltd; - here->BSIM4v6_2 = m * geltd; - here->BSIM4v6_3 = m * geltd; - here->BSIM4v6_4 = m * (gcggb + geltd - ggtg + gIgtotg); - here->BSIM4v6_5 = m * (gcgdb - ggtd + gIgtotd); - here->BSIM4v6_6 = m * (gcgsb - ggts + gIgtots); - here->BSIM4v6_7 = m * (gcgbb - ggtb + gIgtotb); - } /* WDLiu: gcrg already subtracted from all gcrgg below */ - else if (here->BSIM4v6rgateMod == 2) - { here->BSIM4v6_8 = m * gcrg; - here->BSIM4v6_9 = m * gcrgg; - here->BSIM4v6_10 = m * gcrgd; - here->BSIM4v6_11 = m * gcrgs; - here->BSIM4v6_12 = m * gcrgb; - - here->BSIM4v6_13 = m * gcrg; - here->BSIM4v6_14 = m * (gcggb - gcrgg - ggtg + gIgtotg); - here->BSIM4v6_15 = m * (gcgdb - gcrgd - ggtd + gIgtotd); - here->BSIM4v6_16 = m * (gcgsb - gcrgs - ggts + gIgtots); - here->BSIM4v6_17 = m * (gcgbb - gcrgb - ggtb + gIgtotb); - } - else if (here->BSIM4v6rgateMod == 3) - { here->BSIM4v6_18 = m * geltd; - here->BSIM4v6_19 = m * geltd; - here->BSIM4v6_20 = m * geltd; - here->BSIM4v6_21 = m * (geltd + gcrg + gcgmgmb); - - here->BSIM4v6_22 = m * (gcrgd + gcgmdb); - here->BSIM4v6_23 = m * gcrgg; - here->BSIM4v6_24 = m * (gcrgs + gcgmsb); - here->BSIM4v6_25 = m * (gcrgb + gcgmbb); - - here->BSIM4v6_26 = m * gcdgmb; - here->BSIM4v6_27 = m * gcrg; - here->BSIM4v6_28 = m * gcsgmb; - here->BSIM4v6_29 = m * gcbgmb; - - here->BSIM4v6_30 = m * (gcggb - gcrgg - ggtg + gIgtotg); - here->BSIM4v6_31 = m * (gcgdb - gcrgd - ggtd + gIgtotd); - here->BSIM4v6_32 = m * (gcgsb - gcrgs - ggts + gIgtots); - here->BSIM4v6_33 = m * (gcgbb - gcrgb - ggtb + gIgtotb); - } - else - { here->BSIM4v6_34 = m * (gcggb - ggtg + gIgtotg); - here->BSIM4v6_35 = m * (gcgdb - ggtd + gIgtotd); - here->BSIM4v6_36 = m * (gcgsb - ggts + gIgtots); - here->BSIM4v6_37 = m * (gcgbb - ggtb + gIgtotb); - } - - if (model->BSIM4v6rdsMod) - { here->BSIM4v6_38 = m * gdtotg; - here->BSIM4v6_39 = m * gdtots; - here->BSIM4v6_40 = m * gdtotb; - here->BSIM4v6_41 = m * gstotd; - here->BSIM4v6_42 = m * gstotg; - here->BSIM4v6_43 = m * gstotb; - } - - here->BSIM4v6_44 = m * (gdpr + here->BSIM4v6gds + here->BSIM4v6gbd + T1 * ddxpart_dVd - - gdtotd + RevSum + gcddb + gbdpdp + dxpart * ggtd - gIdtotd); - here->BSIM4v6_45 = m * (gdpr + gdtot); - here->BSIM4v6_46 = m * (Gm + gcdgb - gdtotg + gbdpg - gIdtotg - + dxpart * ggtg + T1 * ddxpart_dVg); - here->BSIM4v6_47 = m * (here->BSIM4v6gds + gdtots - dxpart * ggts + gIdtots - - T1 * ddxpart_dVs + FwdSum - gcdsb - gbdpsp); - here->BSIM4v6_48 = m * (gjbd + gdtotb - Gmbs - gcdbb - gbdpb + gIdtotb - - T1 * ddxpart_dVb - dxpart * ggtb); - - here->BSIM4v6_49 = m * (gdpr - gdtotd); - here->BSIM4v6_50 = m * (gdpr + gdtot); - - here->BSIM4v6_51 = m * (here->BSIM4v6gds + gstotd + RevSum - gcsdb - gbspdp - - T1 * dsxpart_dVd - sxpart * ggtd + gIstotd); - here->BSIM4v6_52 = m * (gcsgb - Gm - gstotg + gbspg + sxpart * ggtg - + T1 * dsxpart_dVg - gIstotg); - here->BSIM4v6_53 = m * (gspr + here->BSIM4v6gds + here->BSIM4v6gbs + T1 * dsxpart_dVs - - gstots + FwdSum + gcssb + gbspsp + sxpart * ggts - gIstots); - here->BSIM4v6_54 = m * (gspr + gstot); - here->BSIM4v6_55 = m * (gjbs + gstotb + Gmbs - gcsbb - gbspb - sxpart * ggtb - - T1 * dsxpart_dVb + gIstotb); - - here->BSIM4v6_56 = m * (gspr - gstots); - here->BSIM4v6_57 = m * (gspr + gstot); - - here->BSIM4v6_58 = m * (gcbdb - gjbd + gbbdp - gIbtotd); - here->BSIM4v6_59 = m * (gcbgb - here->BSIM4v6gbgs - gIbtotg); - here->BSIM4v6_60 = m * (gcbsb - gjbs + gbbsp - gIbtots); - here->BSIM4v6_61 = m * (gjbd + gjbs + gcbbb - here->BSIM4v6gbbs - gIbtotb); - - ggidld = here->BSIM4v6ggidld; - ggidlg = here->BSIM4v6ggidlg; - ggidlb = here->BSIM4v6ggidlb; - ggislg = here->BSIM4v6ggislg; - ggisls = here->BSIM4v6ggisls; - ggislb = here->BSIM4v6ggislb; - - /* stamp gidl */ - here->BSIM4v6_62 = m * ggidld; - here->BSIM4v6_63 = m * ggidlg; - here->BSIM4v6_64 = m * (ggidlg + ggidld + ggidlb); - here->BSIM4v6_65 = m * ggidlb; - here->BSIM4v6_66 = m * ggidld; - here->BSIM4v6_67 = m * ggidlg; - here->BSIM4v6_68 = m * (ggidlg + ggidld + ggidlb); - here->BSIM4v6_69 = m * ggidlb; - /* stamp gisl */ - here->BSIM4v6_70 = m * (ggisls + ggislg + ggislb); - here->BSIM4v6_71 = m * ggislg; - here->BSIM4v6_72 = m * ggisls; - here->BSIM4v6_73 = m * ggislb; - here->BSIM4v6_74 = m * (ggislg + ggisls + ggislb); - here->BSIM4v6_75 = m * ggislg; - here->BSIM4v6_76 = m * ggisls; - here->BSIM4v6_77 = m * ggislb; - - if (here->BSIM4v6rbodyMod) - { here->BSIM4v6_78 = m * (gcdbdb - here->BSIM4v6gbd); - here->BSIM4v6_79 = m * (here->BSIM4v6gbs - gcsbsb); - - here->BSIM4v6_80 = m * (gcdbdb - here->BSIM4v6gbd); - here->BSIM4v6_81 = m * (here->BSIM4v6gbd - gcdbdb - + here->BSIM4v6grbpd + here->BSIM4v6grbdb); - here->BSIM4v6_82 = m * here->BSIM4v6grbpd; - here->BSIM4v6_83 = m * here->BSIM4v6grbdb; - - here->BSIM4v6_84 = m * here->BSIM4v6grbpd; - here->BSIM4v6_85 = m * here->BSIM4v6grbpb; - here->BSIM4v6_86 = m * here->BSIM4v6grbps; - here->BSIM4v6_87 = m * (here->BSIM4v6grbpd + here->BSIM4v6grbps - + here->BSIM4v6grbpb); - /* WDLiu: (gcbbb - here->BSIM4v6gbbs) already added to BPbpPtr */ - - here->BSIM4v6_88 = m * (gcsbsb - here->BSIM4v6gbs); - here->BSIM4v6_89 = m * here->BSIM4v6grbps; - here->BSIM4v6_90 = m * here->BSIM4v6grbsb; - here->BSIM4v6_91 = m * (here->BSIM4v6gbs - gcsbsb - + here->BSIM4v6grbps + here->BSIM4v6grbsb); - - here->BSIM4v6_92 = m * here->BSIM4v6grbdb; - here->BSIM4v6_93 = m * here->BSIM4v6grbpb; - here->BSIM4v6_94 = m * here->BSIM4v6grbsb; - here->BSIM4v6_95 = m * (here->BSIM4v6grbsb + here->BSIM4v6grbdb - + here->BSIM4v6grbpb); - } - - if (here->BSIM4v6trnqsMod) - { here->BSIM4v6_96 = m * (gqdef + here->BSIM4v6gtau); - here->BSIM4v6_97 = m * (ggtg - gcqgb); - here->BSIM4v6_98 = m * (ggtd - gcqdb); - here->BSIM4v6_99 = m * (ggts - gcqsb); - here->BSIM4v6_100 = m * (ggtb - gcqbb); - - here->BSIM4v6_101 = m * dxpart * here->BSIM4v6gtau; - here->BSIM4v6_102 = m * sxpart * here->BSIM4v6gtau; - here->BSIM4v6_103 = m * here->BSIM4v6gtau; - } -#else - if (here->BSIM4v6rgateMod == 1) - { (*(here->BSIM4v6GEgePtr) += m * geltd); - (*(here->BSIM4v6GPgePtr) -= m * geltd); - (*(here->BSIM4v6GEgpPtr) -= m * geltd); - (*(here->BSIM4v6GPgpPtr) += m * (gcggb + geltd - ggtg + gIgtotg)); - (*(here->BSIM4v6GPdpPtr) += m * (gcgdb - ggtd + gIgtotd)); - (*(here->BSIM4v6GPspPtr) += m * (gcgsb - ggts + gIgtots)); - (*(here->BSIM4v6GPbpPtr) += m * (gcgbb - ggtb + gIgtotb)); - } /* WDLiu: gcrg already subtracted from all gcrgg below */ - else if (here->BSIM4v6rgateMod == 2) - { (*(here->BSIM4v6GEgePtr) += m * gcrg); - (*(here->BSIM4v6GEgpPtr) += m * gcrgg); - (*(here->BSIM4v6GEdpPtr) += m * gcrgd); - (*(here->BSIM4v6GEspPtr) += m * gcrgs); - (*(here->BSIM4v6GEbpPtr) += m * gcrgb); - - (*(here->BSIM4v6GPgePtr) -= m * gcrg); - (*(here->BSIM4v6GPgpPtr) += m * (gcggb - gcrgg - ggtg + gIgtotg)); - (*(here->BSIM4v6GPdpPtr) += m * (gcgdb - gcrgd - ggtd + gIgtotd)); - (*(here->BSIM4v6GPspPtr) += m * (gcgsb - gcrgs - ggts + gIgtots)); - (*(here->BSIM4v6GPbpPtr) += m * (gcgbb - gcrgb - ggtb + gIgtotb)); - } - else if (here->BSIM4v6rgateMod == 3) - { (*(here->BSIM4v6GEgePtr) += m * geltd); - (*(here->BSIM4v6GEgmPtr) -= m * geltd); - (*(here->BSIM4v6GMgePtr) -= m * geltd); - (*(here->BSIM4v6GMgmPtr) += m * (geltd + gcrg + gcgmgmb)); - - (*(here->BSIM4v6GMdpPtr) += m * (gcrgd + gcgmdb)); - (*(here->BSIM4v6GMgpPtr) += m * gcrgg); - (*(here->BSIM4v6GMspPtr) += m * (gcrgs + gcgmsb)); - (*(here->BSIM4v6GMbpPtr) += m * (gcrgb + gcgmbb)); - - (*(here->BSIM4v6DPgmPtr) += m * gcdgmb); - (*(here->BSIM4v6GPgmPtr) -= m * gcrg); - (*(here->BSIM4v6SPgmPtr) += m * gcsgmb); - (*(here->BSIM4v6BPgmPtr) += m * gcbgmb); - - (*(here->BSIM4v6GPgpPtr) += m * (gcggb - gcrgg - ggtg + gIgtotg)); - (*(here->BSIM4v6GPdpPtr) += m * (gcgdb - gcrgd - ggtd + gIgtotd)); - (*(here->BSIM4v6GPspPtr) += m * (gcgsb - gcrgs - ggts + gIgtots)); - (*(here->BSIM4v6GPbpPtr) += m * (gcgbb - gcrgb - ggtb + gIgtotb)); - } - else - { (*(here->BSIM4v6GPgpPtr) += m * (gcggb - ggtg + gIgtotg)); - (*(here->BSIM4v6GPdpPtr) += m * (gcgdb - ggtd + gIgtotd)); - (*(here->BSIM4v6GPspPtr) += m * (gcgsb - ggts + gIgtots)); - (*(here->BSIM4v6GPbpPtr) += m * (gcgbb - ggtb + gIgtotb)); - } - - if (model->BSIM4v6rdsMod) - { (*(here->BSIM4v6DgpPtr) += m * gdtotg); - (*(here->BSIM4v6DspPtr) += m * gdtots); - (*(here->BSIM4v6DbpPtr) += m * gdtotb); - (*(here->BSIM4v6SdpPtr) += m * gstotd); - (*(here->BSIM4v6SgpPtr) += m * gstotg); - (*(here->BSIM4v6SbpPtr) += m * gstotb); - } - - (*(here->BSIM4v6DPdpPtr) += m * (gdpr + here->BSIM4v6gds + here->BSIM4v6gbd + T1 * ddxpart_dVd - - gdtotd + RevSum + gcddb + gbdpdp + dxpart * ggtd - gIdtotd)); - (*(here->BSIM4v6DPdPtr) -= m * (gdpr + gdtot)); - (*(here->BSIM4v6DPgpPtr) += m * (Gm + gcdgb - gdtotg + gbdpg - gIdtotg - + dxpart * ggtg + T1 * ddxpart_dVg)); - (*(here->BSIM4v6DPspPtr) -= m * (here->BSIM4v6gds + gdtots - dxpart * ggts + gIdtots - - T1 * ddxpart_dVs + FwdSum - gcdsb - gbdpsp)); - (*(here->BSIM4v6DPbpPtr) -= m * (gjbd + gdtotb - Gmbs - gcdbb - gbdpb + gIdtotb - - T1 * ddxpart_dVb - dxpart * ggtb)); - - (*(here->BSIM4v6DdpPtr) -= m * (gdpr - gdtotd)); - (*(here->BSIM4v6DdPtr) += m * (gdpr + gdtot)); - - (*(here->BSIM4v6SPdpPtr) -= m * (here->BSIM4v6gds + gstotd + RevSum - gcsdb - gbspdp - - T1 * dsxpart_dVd - sxpart * ggtd + gIstotd)); - (*(here->BSIM4v6SPgpPtr) += m * (gcsgb - Gm - gstotg + gbspg + sxpart * ggtg - + T1 * dsxpart_dVg - gIstotg)); - (*(here->BSIM4v6SPspPtr) += m * (gspr + here->BSIM4v6gds + here->BSIM4v6gbs + T1 * dsxpart_dVs - - gstots + FwdSum + gcssb + gbspsp + sxpart * ggts - gIstots)); - (*(here->BSIM4v6SPsPtr) -= m * (gspr + gstot)); - (*(here->BSIM4v6SPbpPtr) -= m * (gjbs + gstotb + Gmbs - gcsbb - gbspb - sxpart * ggtb - - T1 * dsxpart_dVb + gIstotb)); - - (*(here->BSIM4v6SspPtr) -= m * (gspr - gstots)); - (*(here->BSIM4v6SsPtr) += m * (gspr + gstot)); - - (*(here->BSIM4v6BPdpPtr) += m * (gcbdb - gjbd + gbbdp - gIbtotd)); - (*(here->BSIM4v6BPgpPtr) += m * (gcbgb - here->BSIM4v6gbgs - gIbtotg)); - (*(here->BSIM4v6BPspPtr) += m * (gcbsb - gjbs + gbbsp - gIbtots)); - (*(here->BSIM4v6BPbpPtr) += m * (gjbd + gjbs + gcbbb - here->BSIM4v6gbbs - - gIbtotb)); - - ggidld = here->BSIM4v6ggidld; - ggidlg = here->BSIM4v6ggidlg; - ggidlb = here->BSIM4v6ggidlb; - ggislg = here->BSIM4v6ggislg; - ggisls = here->BSIM4v6ggisls; - ggislb = here->BSIM4v6ggislb; - - /* stamp gidl */ - (*(here->BSIM4v6DPdpPtr) += m * ggidld); - (*(here->BSIM4v6DPgpPtr) += m * ggidlg); - (*(here->BSIM4v6DPspPtr) -= m * (ggidlg + ggidld + ggidlb)); - (*(here->BSIM4v6DPbpPtr) += m * ggidlb); - (*(here->BSIM4v6BPdpPtr) -= m * ggidld); - (*(here->BSIM4v6BPgpPtr) -= m * ggidlg); - (*(here->BSIM4v6BPspPtr) += m * (ggidlg + ggidld + ggidlb)); - (*(here->BSIM4v6BPbpPtr) -= m * ggidlb); - /* stamp gisl */ - (*(here->BSIM4v6SPdpPtr) -= m * (ggisls + ggislg + ggislb)); - (*(here->BSIM4v6SPgpPtr) += m * ggislg); - (*(here->BSIM4v6SPspPtr) += m * ggisls); - (*(here->BSIM4v6SPbpPtr) += m * ggislb); - (*(here->BSIM4v6BPdpPtr) += m * (ggislg + ggisls + ggislb)); - (*(here->BSIM4v6BPgpPtr) -= m * ggislg); - (*(here->BSIM4v6BPspPtr) -= m * ggisls); - (*(here->BSIM4v6BPbpPtr) -= m * ggislb); - - - if (here->BSIM4v6rbodyMod) - { (*(here->BSIM4v6DPdbPtr) += m * (gcdbdb - here->BSIM4v6gbd)); - (*(here->BSIM4v6SPsbPtr) -= m * (here->BSIM4v6gbs - gcsbsb)); - - (*(here->BSIM4v6DBdpPtr) += m * (gcdbdb - here->BSIM4v6gbd)); - (*(here->BSIM4v6DBdbPtr) += m * (here->BSIM4v6gbd - gcdbdb - + here->BSIM4v6grbpd + here->BSIM4v6grbdb)); - (*(here->BSIM4v6DBbpPtr) -= m * here->BSIM4v6grbpd); - (*(here->BSIM4v6DBbPtr) -= m * here->BSIM4v6grbdb); - - (*(here->BSIM4v6BPdbPtr) -= m * here->BSIM4v6grbpd); - (*(here->BSIM4v6BPbPtr) -= m * here->BSIM4v6grbpb); - (*(here->BSIM4v6BPsbPtr) -= m * here->BSIM4v6grbps); - (*(here->BSIM4v6BPbpPtr) += m * (here->BSIM4v6grbpd + here->BSIM4v6grbps - + here->BSIM4v6grbpb)); - /* WDLiu: (gcbbb - here->BSIM4v6gbbs) already added to BPbpPtr */ - - (*(here->BSIM4v6SBspPtr) += m * (gcsbsb - here->BSIM4v6gbs)); - (*(here->BSIM4v6SBbpPtr) -= m * here->BSIM4v6grbps); - (*(here->BSIM4v6SBbPtr) -= m * here->BSIM4v6grbsb); - (*(here->BSIM4v6SBsbPtr) += m * (here->BSIM4v6gbs - gcsbsb - + here->BSIM4v6grbps + here->BSIM4v6grbsb)); - - (*(here->BSIM4v6BdbPtr) -= m * here->BSIM4v6grbdb); - (*(here->BSIM4v6BbpPtr) -= m * here->BSIM4v6grbpb); - (*(here->BSIM4v6BsbPtr) -= m * here->BSIM4v6grbsb); - (*(here->BSIM4v6BbPtr) += m * (here->BSIM4v6grbsb + here->BSIM4v6grbdb - + here->BSIM4v6grbpb)); - } - - if (here->BSIM4v6trnqsMod) - { (*(here->BSIM4v6QqPtr) += m * (gqdef + here->BSIM4v6gtau)); - (*(here->BSIM4v6QgpPtr) += m * (ggtg - gcqgb)); - (*(here->BSIM4v6QdpPtr) += m * (ggtd - gcqdb)); - (*(here->BSIM4v6QspPtr) += m * (ggts - gcqsb)); - (*(here->BSIM4v6QbpPtr) += m * (ggtb - gcqbb)); - - (*(here->BSIM4v6DPqPtr) += m * dxpart * here->BSIM4v6gtau); - (*(here->BSIM4v6SPqPtr) += m * sxpart * here->BSIM4v6gtau); - (*(here->BSIM4v6GPqPtr) -= m * here->BSIM4v6gtau); - } -#endif - -line1000: ; - -#ifndef USE_OMP - } /* End of MOSFET Instance */ -} /* End of Model Instance */ -#endif - -return(OK); -} - -/* function to compute poly depletion effect */ -int BSIM4v6polyDepletion( - double phi, - double ngate, - double epsgate, - double coxe, - double Vgs, - double *Vgs_eff, - double *dVgs_eff_dVg) -{ - double T1, T2, T3, T4, T5, T6, T7, T8; - - /* Poly Gate Si Depletion Effect */ - if ((ngate > 1.0e18) && - (ngate < 1.0e25) && (Vgs > phi) && (epsgate!=0) - ){ - T1 = 1.0e6 * CHARGE * epsgate * ngate / (coxe * coxe); - T8 = Vgs - phi; - T4 = sqrt(1.0 + 2.0 * T8 / T1); - T2 = 2.0 * T8 / (T4 + 1.0); - T3 = 0.5 * T2 * T2 / T1; /* T3 = Vpoly */ - T7 = 1.12 - T3 - 0.05; - T6 = sqrt(T7 * T7 + 0.224); - T5 = 1.12 - 0.5 * (T7 + T6); - *Vgs_eff = Vgs - T5; - *dVgs_eff_dVg = 1.0 - (0.5 - 0.5 / T4) * (1.0 + T7 / T6); - } - else { - *Vgs_eff = Vgs; - *dVgs_eff_dVg = 1.0; - } - return(0); -} - -#ifdef USE_OMP -void BSIM4v6LoadRhsMat(GENmodel *inModel, CKTcircuit *ckt) -{ - int InstCount, idx; - BSIM4v6instance **InstArray; - BSIM4v6instance *here; - BSIM4v6model *model = (BSIM4v6model*)inModel; - - InstArray = model->BSIM4v6InstanceArray; - InstCount = model->BSIM4v6InstCount; - - for(idx = 0; idx < InstCount; idx++) { - here = InstArray[idx]; - model = BSIM4v6modPtr(here); - /* Update b for Ax = b */ - (*(ckt->CKTrhs + here->BSIM4v6dNodePrime) += here->BSIM4v6rhsdPrime); - (*(ckt->CKTrhs + here->BSIM4v6gNodePrime) -= here->BSIM4v6rhsgPrime); - - if (here->BSIM4v6rgateMod == 2) - (*(ckt->CKTrhs + here->BSIM4v6gNodeExt) -= here->BSIM4v6rhsgExt); - else if (here->BSIM4v6rgateMod == 3) - (*(ckt->CKTrhs + here->BSIM4v6gNodeMid) -= here->BSIM4v6grhsMid); - - if (!here->BSIM4v6rbodyMod) - { (*(ckt->CKTrhs + here->BSIM4v6bNodePrime) += here->BSIM4v6rhsbPrime); - (*(ckt->CKTrhs + here->BSIM4v6sNodePrime) += here->BSIM4v6rhssPrime); - } - else - { (*(ckt->CKTrhs + here->BSIM4v6dbNode) -= here->BSIM4v6rhsdb); - (*(ckt->CKTrhs + here->BSIM4v6bNodePrime) += here->BSIM4v6rhsbPrime); - (*(ckt->CKTrhs + here->BSIM4v6sbNode) -= here->BSIM4v6rhssb); - (*(ckt->CKTrhs + here->BSIM4v6sNodePrime) += here->BSIM4v6rhssPrime); - } - - if (model->BSIM4v6rdsMod) - { (*(ckt->CKTrhs + here->BSIM4v6dNode) -= here->BSIM4v6rhsd); - (*(ckt->CKTrhs + here->BSIM4v6sNode) += here->BSIM4v6rhss); - } - - if (here->BSIM4v6trnqsMod) - *(ckt->CKTrhs + here->BSIM4v6qNode) += here->BSIM4v6rhsq; - - - /* Update A for Ax = b */ - if (here->BSIM4v6rgateMod == 1) - { (*(here->BSIM4v6GEgePtr) += here->BSIM4v6_1); - (*(here->BSIM4v6GPgePtr) -= here->BSIM4v6_2); - (*(here->BSIM4v6GEgpPtr) -= here->BSIM4v6_3); - (*(here->BSIM4v6GPgpPtr) += here->BSIM4v6_4); - (*(here->BSIM4v6GPdpPtr) += here->BSIM4v6_5); - (*(here->BSIM4v6GPspPtr) += here->BSIM4v6_6); - (*(here->BSIM4v6GPbpPtr) += here->BSIM4v6_7); - } - else if (here->BSIM4v6rgateMod == 2) - { (*(here->BSIM4v6GEgePtr) += here->BSIM4v6_8); - (*(here->BSIM4v6GEgpPtr) += here->BSIM4v6_9); - (*(here->BSIM4v6GEdpPtr) += here->BSIM4v6_10); - (*(here->BSIM4v6GEspPtr) += here->BSIM4v6_11); - (*(here->BSIM4v6GEbpPtr) += here->BSIM4v6_12); - - (*(here->BSIM4v6GPgePtr) -= here->BSIM4v6_13); - (*(here->BSIM4v6GPgpPtr) += here->BSIM4v6_14); - (*(here->BSIM4v6GPdpPtr) += here->BSIM4v6_15); - (*(here->BSIM4v6GPspPtr) += here->BSIM4v6_16); - (*(here->BSIM4v6GPbpPtr) += here->BSIM4v6_17); - } - else if (here->BSIM4v6rgateMod == 3) - { (*(here->BSIM4v6GEgePtr) += here->BSIM4v6_18); - (*(here->BSIM4v6GEgmPtr) -= here->BSIM4v6_19); - (*(here->BSIM4v6GMgePtr) -= here->BSIM4v6_20); - (*(here->BSIM4v6GMgmPtr) += here->BSIM4v6_21); - - (*(here->BSIM4v6GMdpPtr) += here->BSIM4v6_22); - (*(here->BSIM4v6GMgpPtr) += here->BSIM4v6_23); - (*(here->BSIM4v6GMspPtr) += here->BSIM4v6_24); - (*(here->BSIM4v6GMbpPtr) += here->BSIM4v6_25); - - (*(here->BSIM4v6DPgmPtr) += here->BSIM4v6_26); - (*(here->BSIM4v6GPgmPtr) -= here->BSIM4v6_27); - (*(here->BSIM4v6SPgmPtr) += here->BSIM4v6_28); - (*(here->BSIM4v6BPgmPtr) += here->BSIM4v6_29); - - (*(here->BSIM4v6GPgpPtr) += here->BSIM4v6_30); - (*(here->BSIM4v6GPdpPtr) += here->BSIM4v6_31); - (*(here->BSIM4v6GPspPtr) += here->BSIM4v6_32); - (*(here->BSIM4v6GPbpPtr) += here->BSIM4v6_33); - } - - - else - { (*(here->BSIM4v6GPgpPtr) += here->BSIM4v6_34); - (*(here->BSIM4v6GPdpPtr) += here->BSIM4v6_35); - (*(here->BSIM4v6GPspPtr) += here->BSIM4v6_36); - (*(here->BSIM4v6GPbpPtr) += here->BSIM4v6_37); - } - - - if (model->BSIM4v6rdsMod) - { (*(here->BSIM4v6DgpPtr) += here->BSIM4v6_38); - (*(here->BSIM4v6DspPtr) += here->BSIM4v6_39); - (*(here->BSIM4v6DbpPtr) += here->BSIM4v6_40); - (*(here->BSIM4v6SdpPtr) += here->BSIM4v6_41); - (*(here->BSIM4v6SgpPtr) += here->BSIM4v6_42); - (*(here->BSIM4v6SbpPtr) += here->BSIM4v6_43); - } - - (*(here->BSIM4v6DPdpPtr) += here->BSIM4v6_44); - (*(here->BSIM4v6DPdPtr) -= here->BSIM4v6_45); - (*(here->BSIM4v6DPgpPtr) += here->BSIM4v6_46); - (*(here->BSIM4v6DPspPtr) -= here->BSIM4v6_47); - (*(here->BSIM4v6DPbpPtr) -= here->BSIM4v6_48); - - (*(here->BSIM4v6DdpPtr) -= here->BSIM4v6_49); - (*(here->BSIM4v6DdPtr) += here->BSIM4v6_50); - - (*(here->BSIM4v6SPdpPtr) -= here->BSIM4v6_51); - (*(here->BSIM4v6SPgpPtr) += here->BSIM4v6_52); - (*(here->BSIM4v6SPspPtr) += here->BSIM4v6_53); - (*(here->BSIM4v6SPsPtr) -= here->BSIM4v6_54); - (*(here->BSIM4v6SPbpPtr) -= here->BSIM4v6_55); - - (*(here->BSIM4v6SspPtr) -= here->BSIM4v6_56); - (*(here->BSIM4v6SsPtr) += here->BSIM4v6_57); - - (*(here->BSIM4v6BPdpPtr) += here->BSIM4v6_58); - (*(here->BSIM4v6BPgpPtr) += here->BSIM4v6_59); - (*(here->BSIM4v6BPspPtr) += here->BSIM4v6_60); - (*(here->BSIM4v6BPbpPtr) += here->BSIM4v6_61); - - /* stamp gidl */ - (*(here->BSIM4v6DPdpPtr) += here->BSIM4v6_62); - (*(here->BSIM4v6DPgpPtr) += here->BSIM4v6_63); - (*(here->BSIM4v6DPspPtr) -= here->BSIM4v6_64); - (*(here->BSIM4v6DPbpPtr) += here->BSIM4v6_65); - (*(here->BSIM4v6BPdpPtr) -= here->BSIM4v6_66); - (*(here->BSIM4v6BPgpPtr) -= here->BSIM4v6_67); - (*(here->BSIM4v6BPspPtr) += here->BSIM4v6_68); - (*(here->BSIM4v6BPbpPtr) -= here->BSIM4v6_69); - /* stamp gisl */ - (*(here->BSIM4v6SPdpPtr) -= here->BSIM4v6_70); - (*(here->BSIM4v6SPgpPtr) += here->BSIM4v6_71); - (*(here->BSIM4v6SPspPtr) += here->BSIM4v6_72); - (*(here->BSIM4v6SPbpPtr) += here->BSIM4v6_73); - (*(here->BSIM4v6BPdpPtr) += here->BSIM4v6_74); - (*(here->BSIM4v6BPgpPtr) -= here->BSIM4v6_75); - (*(here->BSIM4v6BPspPtr) -= here->BSIM4v6_76); - (*(here->BSIM4v6BPbpPtr) -= here->BSIM4v6_77); - - - if (here->BSIM4v6rbodyMod) - { (*(here->BSIM4v6DPdbPtr) += here->BSIM4v6_78); - (*(here->BSIM4v6SPsbPtr) -= here->BSIM4v6_79); - - (*(here->BSIM4v6DBdpPtr) += here->BSIM4v6_80); - (*(here->BSIM4v6DBdbPtr) += here->BSIM4v6_81); - (*(here->BSIM4v6DBbpPtr) -= here->BSIM4v6_82); - (*(here->BSIM4v6DBbPtr) -= here->BSIM4v6_83); - - (*(here->BSIM4v6BPdbPtr) -= here->BSIM4v6_84); - (*(here->BSIM4v6BPbPtr) -= here->BSIM4v6_85); - (*(here->BSIM4v6BPsbPtr) -= here->BSIM4v6_86); - (*(here->BSIM4v6BPbpPtr) += here->BSIM4v6_87); - - (*(here->BSIM4v6SBspPtr) += here->BSIM4v6_88); - (*(here->BSIM4v6SBbpPtr) -= here->BSIM4v6_89); - (*(here->BSIM4v6SBbPtr) -= here->BSIM4v6_90); - (*(here->BSIM4v6SBsbPtr) += here->BSIM4v6_91); - - (*(here->BSIM4v6BdbPtr) -= here->BSIM4v6_92); - (*(here->BSIM4v6BbpPtr) -= here->BSIM4v6_93); - (*(here->BSIM4v6BsbPtr) -= here->BSIM4v6_94); - (*(here->BSIM4v6BbPtr) += here->BSIM4v6_95); - } - - if (here->BSIM4v6trnqsMod) - { (*(here->BSIM4v6QqPtr) += here->BSIM4v6_96); - (*(here->BSIM4v6QgpPtr) += here->BSIM4v6_97); - (*(here->BSIM4v6QdpPtr) += here->BSIM4v6_98); - (*(here->BSIM4v6QspPtr) += here->BSIM4v6_99); - (*(here->BSIM4v6QbpPtr) += here->BSIM4v6_100); - - (*(here->BSIM4v6DPqPtr) += here->BSIM4v6_101); - (*(here->BSIM4v6SPqPtr) += here->BSIM4v6_102); - (*(here->BSIM4v6GPqPtr) -= here->BSIM4v6_103); - } - } -} - -#endif diff --git a/src/spicelib/devices/bsim4v6/b4v6mask.c b/src/spicelib/devices/bsim4v6/b4v6mask.c deleted file mode 100644 index 73568c658..000000000 --- a/src/spicelib/devices/bsim4v6/b4v6mask.c +++ /dev/null @@ -1,2534 +0,0 @@ -/**** BSIM4.6.2 Released by Wenwei Yang 07/31/2008 ****/ - -/********** - * Copyright 2006 Regents of the University of California. All rights reserved. - * File: b4mask.c of BSIM4.6.2. - * Author: 2000 Weidong Liu - * Authors: 2001- Xuemei Xi, Mohan Dunga, Ali Niknejad, Chenming Hu. - * Authors: 2006- Mohan Dunga, Ali Niknejad, Chenming Hu - * Authors: 2007- Mohan Dunga, Wenwei Yang, Ali Niknejad, Chenming Hu - * Project Director: Prof. Chenming Hu. - * Modified by Xuemei Xi, 04/06/2001. - * Modified by Xuemei Xi, 10/05/2001. - * Modified by Xuemei Xi, 11/15/2002. - * Modified by Xuemei Xi, 05/09/2003. - * Modified by Xuemei Xi, Mohan Dunga, 07/29/2005. - * Modified by Mohan Dunga, 12/13/2006 - * Modified by Mohan Dunga, Wenwei Yang, 07/31/2008. - **********/ - - -#include "ngspice/ngspice.h" -#include "ngspice/ifsim.h" -#include "ngspice/cktdefs.h" -#include "ngspice/devdefs.h" -#include "bsim4v6def.h" -#include "ngspice/sperror.h" -#include "ngspice/suffix.h" - -int -BSIM4v6mAsk( -CKTcircuit *ckt, -GENmodel *inst, -int which, -IFvalue *value) -{ - BSIM4v6model *model = (BSIM4v6model *)inst; - - NG_IGNORE(ckt); - - switch(which) - { case BSIM4v6_MOD_MOBMOD : - value->iValue = model->BSIM4v6mobMod; - return(OK); - case BSIM4v6_MOD_PARAMCHK : - value->iValue = model->BSIM4v6paramChk; - return(OK); - case BSIM4v6_MOD_BINUNIT : - value->iValue = model->BSIM4v6binUnit; - return(OK); - case BSIM4v6_MOD_CVCHARGEMOD : - value->iValue = model->BSIM4v6cvchargeMod; - return(OK); - case BSIM4v6_MOD_CAPMOD : - value->iValue = model->BSIM4v6capMod; - return(OK); - case BSIM4v6_MOD_DIOMOD : - value->iValue = model->BSIM4v6dioMod; - return(OK); - case BSIM4v6_MOD_TRNQSMOD : - value->iValue = model->BSIM4v6trnqsMod; - return(OK); - case BSIM4v6_MOD_ACNQSMOD : - value->iValue = model->BSIM4v6acnqsMod; - return(OK); - case BSIM4v6_MOD_FNOIMOD : - value->iValue = model->BSIM4v6fnoiMod; - return(OK); - case BSIM4v6_MOD_TNOIMOD : - value->iValue = model->BSIM4v6tnoiMod; - return(OK); - case BSIM4v6_MOD_RDSMOD : - value->iValue = model->BSIM4v6rdsMod; - return(OK); - case BSIM4v6_MOD_RBODYMOD : - value->iValue = model->BSIM4v6rbodyMod; - return(OK); - case BSIM4v6_MOD_RGATEMOD : - value->iValue = model->BSIM4v6rgateMod; - return(OK); - case BSIM4v6_MOD_PERMOD : - value->iValue = model->BSIM4v6perMod; - return(OK); - case BSIM4v6_MOD_GEOMOD : - value->iValue = model->BSIM4v6geoMod; - return(OK); - case BSIM4v6_MOD_RGEOMOD : - value->iValue = model->BSIM4v6rgeoMod; - return(OK); - case BSIM4v6_MOD_MTRLMOD : - value->iValue = model->BSIM4v6mtrlMod; - return(OK); - - case BSIM4v6_MOD_IGCMOD : - value->iValue = model->BSIM4v6igcMod; - return(OK); - case BSIM4v6_MOD_IGBMOD : - value->iValue = model->BSIM4v6igbMod; - return(OK); - case BSIM4v6_MOD_TEMPMOD : - value->iValue = model->BSIM4v6tempMod; - return(OK); - - case BSIM4v6_MOD_VERSION : - value->sValue = model->BSIM4v6version; - return(OK); - case BSIM4v6_MOD_TOXREF : - value->rValue = model->BSIM4v6toxref; - return(OK); - case BSIM4v6_MOD_EOT : - value->rValue = model->BSIM4v6eot; - return(OK); - case BSIM4v6_MOD_VDDEOT : - value->rValue = model->BSIM4v6vddeot; - return(OK); - case BSIM4v6_MOD_TEMPEOT : - value->rValue = model->BSIM4v6tempeot; - return(OK); - case BSIM4v6_MOD_LEFFEOT : - value->rValue = model->BSIM4v6leffeot; - return(OK); - case BSIM4v6_MOD_WEFFEOT : - value->rValue = model->BSIM4v6weffeot; - return(OK); - case BSIM4v6_MOD_ADOS : - value->rValue = model->BSIM4v6ados; - return(OK); - case BSIM4v6_MOD_BDOS : - value->rValue = model->BSIM4v6bdos; - return(OK); - case BSIM4v6_MOD_TOXE : - value->rValue = model->BSIM4v6toxe; - return(OK); - case BSIM4v6_MOD_TOXP : - value->rValue = model->BSIM4v6toxp; - return(OK); - case BSIM4v6_MOD_TOXM : - value->rValue = model->BSIM4v6toxm; - return(OK); - case BSIM4v6_MOD_DTOX : - value->rValue = model->BSIM4v6dtox; - return(OK); - case BSIM4v6_MOD_EPSROX : - value->rValue = model->BSIM4v6epsrox; - return(OK); - case BSIM4v6_MOD_CDSC : - value->rValue = model->BSIM4v6cdsc; - return(OK); - case BSIM4v6_MOD_CDSCB : - value->rValue = model->BSIM4v6cdscb; - return(OK); - - case BSIM4v6_MOD_CDSCD : - value->rValue = model->BSIM4v6cdscd; - return(OK); - - case BSIM4v6_MOD_CIT : - value->rValue = model->BSIM4v6cit; - return(OK); - case BSIM4v6_MOD_NFACTOR : - value->rValue = model->BSIM4v6nfactor; - return(OK); - case BSIM4v6_MOD_XJ: - value->rValue = model->BSIM4v6xj; - return(OK); - case BSIM4v6_MOD_VSAT: - value->rValue = model->BSIM4v6vsat; - return(OK); - case BSIM4v6_MOD_VTL: - value->rValue = model->BSIM4v6vtl; - return(OK); - case BSIM4v6_MOD_XN: - value->rValue = model->BSIM4v6xn; - return(OK); - case BSIM4v6_MOD_LC: - value->rValue = model->BSIM4v6lc; - return(OK); - case BSIM4v6_MOD_LAMBDA: - value->rValue = model->BSIM4v6lambda; - return(OK); - case BSIM4v6_MOD_AT: - value->rValue = model->BSIM4v6at; - return(OK); - case BSIM4v6_MOD_A0: - value->rValue = model->BSIM4v6a0; - return(OK); - - case BSIM4v6_MOD_AGS: - value->rValue = model->BSIM4v6ags; - return(OK); - - case BSIM4v6_MOD_A1: - value->rValue = model->BSIM4v6a1; - return(OK); - case BSIM4v6_MOD_A2: - value->rValue = model->BSIM4v6a2; - return(OK); - case BSIM4v6_MOD_KETA: - value->rValue = model->BSIM4v6keta; - return(OK); - case BSIM4v6_MOD_NSUB: - value->rValue = model->BSIM4v6nsub; - return(OK); - case BSIM4v6_MOD_PHIG: - value->rValue = model->BSIM4v6phig; - return(OK); - case BSIM4v6_MOD_EPSRGATE: - value->rValue = model->BSIM4v6epsrgate; - return(OK); - case BSIM4v6_MOD_EASUB: - value->rValue = model->BSIM4v6easub; - return(OK); - case BSIM4v6_MOD_EPSRSUB: - value->rValue = model->BSIM4v6epsrsub; - return(OK); - case BSIM4v6_MOD_NI0SUB: - value->rValue = model->BSIM4v6ni0sub; - return(OK); - case BSIM4v6_MOD_BG0SUB: - value->rValue = model->BSIM4v6bg0sub; - return(OK); - case BSIM4v6_MOD_TBGASUB: - value->rValue = model->BSIM4v6tbgasub; - return(OK); - case BSIM4v6_MOD_TBGBSUB: - value->rValue = model->BSIM4v6tbgbsub; - return(OK); - case BSIM4v6_MOD_NDEP: - value->rValue = model->BSIM4v6ndep; - return(OK); - case BSIM4v6_MOD_NSD: - value->rValue = model->BSIM4v6nsd; - return(OK); - case BSIM4v6_MOD_NGATE: - value->rValue = model->BSIM4v6ngate; - return(OK); - case BSIM4v6_MOD_GAMMA1: - value->rValue = model->BSIM4v6gamma1; - return(OK); - case BSIM4v6_MOD_GAMMA2: - value->rValue = model->BSIM4v6gamma2; - return(OK); - case BSIM4v6_MOD_VBX: - value->rValue = model->BSIM4v6vbx; - return(OK); - case BSIM4v6_MOD_VBM: - value->rValue = model->BSIM4v6vbm; - return(OK); - case BSIM4v6_MOD_XT: - value->rValue = model->BSIM4v6xt; - return(OK); - case BSIM4v6_MOD_K1: - value->rValue = model->BSIM4v6k1; - return(OK); - case BSIM4v6_MOD_KT1: - value->rValue = model->BSIM4v6kt1; - return(OK); - case BSIM4v6_MOD_KT1L: - value->rValue = model->BSIM4v6kt1l; - return(OK); - case BSIM4v6_MOD_KT2 : - value->rValue = model->BSIM4v6kt2; - return(OK); - case BSIM4v6_MOD_K2 : - value->rValue = model->BSIM4v6k2; - return(OK); - case BSIM4v6_MOD_K3: - value->rValue = model->BSIM4v6k3; - return(OK); - case BSIM4v6_MOD_K3B: - value->rValue = model->BSIM4v6k3b; - return(OK); - case BSIM4v6_MOD_W0: - value->rValue = model->BSIM4v6w0; - return(OK); - case BSIM4v6_MOD_LPE0: - value->rValue = model->BSIM4v6lpe0; - return(OK); - case BSIM4v6_MOD_LPEB: - value->rValue = model->BSIM4v6lpeb; - return(OK); - case BSIM4v6_MOD_DVTP0: - value->rValue = model->BSIM4v6dvtp0; - return(OK); - case BSIM4v6_MOD_DVTP1: - value->rValue = model->BSIM4v6dvtp1; - return(OK); - case BSIM4v6_MOD_DVT0 : - value->rValue = model->BSIM4v6dvt0; - return(OK); - case BSIM4v6_MOD_DVT1 : - value->rValue = model->BSIM4v6dvt1; - return(OK); - case BSIM4v6_MOD_DVT2 : - value->rValue = model->BSIM4v6dvt2; - return(OK); - case BSIM4v6_MOD_DVT0W : - value->rValue = model->BSIM4v6dvt0w; - return(OK); - case BSIM4v6_MOD_DVT1W : - value->rValue = model->BSIM4v6dvt1w; - return(OK); - case BSIM4v6_MOD_DVT2W : - value->rValue = model->BSIM4v6dvt2w; - return(OK); - case BSIM4v6_MOD_DROUT : - value->rValue = model->BSIM4v6drout; - return(OK); - case BSIM4v6_MOD_DSUB : - value->rValue = model->BSIM4v6dsub; - return(OK); - case BSIM4v6_MOD_VTH0: - value->rValue = model->BSIM4v6vth0; - return(OK); - case BSIM4v6_MOD_EU: - value->rValue = model->BSIM4v6eu; - return(OK); - case BSIM4v6_MOD_UCS: - value->rValue = model->BSIM4v6ucs; - return(OK); - case BSIM4v6_MOD_UA: - value->rValue = model->BSIM4v6ua; - return(OK); - case BSIM4v6_MOD_UA1: - value->rValue = model->BSIM4v6ua1; - return(OK); - case BSIM4v6_MOD_UB: - value->rValue = model->BSIM4v6ub; - return(OK); - case BSIM4v6_MOD_UB1: - value->rValue = model->BSIM4v6ub1; - return(OK); - case BSIM4v6_MOD_UC: - value->rValue = model->BSIM4v6uc; - return(OK); - case BSIM4v6_MOD_UC1: - value->rValue = model->BSIM4v6uc1; - return(OK); - case BSIM4v6_MOD_UD: - value->rValue = model->BSIM4v6ud; - return(OK); - case BSIM4v6_MOD_UD1: - value->rValue = model->BSIM4v6ud1; - return(OK); - case BSIM4v6_MOD_UP: - value->rValue = model->BSIM4v6up; - return(OK); - case BSIM4v6_MOD_LP: - value->rValue = model->BSIM4v6lp; - return(OK); - case BSIM4v6_MOD_U0: - value->rValue = model->BSIM4v6u0; - return(OK); - case BSIM4v6_MOD_UTE: - value->rValue = model->BSIM4v6ute; - return(OK); - case BSIM4v6_MOD_UCSTE: - value->rValue = model->BSIM4v6ucste; - return(OK); - case BSIM4v6_MOD_VOFF: - value->rValue = model->BSIM4v6voff; - return(OK); - case BSIM4v6_MOD_TVOFF: - value->rValue = model->BSIM4v6tvoff; - return(OK); - case BSIM4v6_MOD_VFBSDOFF: - value->rValue = model->BSIM4v6vfbsdoff; - return(OK); - case BSIM4v6_MOD_TVFBSDOFF: - value->rValue = model->BSIM4v6tvfbsdoff; - return(OK); - case BSIM4v6_MOD_VOFFL: - value->rValue = model->BSIM4v6voffl; - return(OK); - case BSIM4v6_MOD_VOFFCVL: - value->rValue = model->BSIM4v6voffcvl; - return(OK); - case BSIM4v6_MOD_MINV: - value->rValue = model->BSIM4v6minv; - return(OK); - case BSIM4v6_MOD_MINVCV: - value->rValue = model->BSIM4v6minvcv; - return(OK); - case BSIM4v6_MOD_FPROUT: - value->rValue = model->BSIM4v6fprout; - return(OK); - case BSIM4v6_MOD_PDITS: - value->rValue = model->BSIM4v6pdits; - return(OK); - case BSIM4v6_MOD_PDITSD: - value->rValue = model->BSIM4v6pditsd; - return(OK); - case BSIM4v6_MOD_PDITSL: - value->rValue = model->BSIM4v6pditsl; - return(OK); - case BSIM4v6_MOD_DELTA: - value->rValue = model->BSIM4v6delta; - return(OK); - case BSIM4v6_MOD_RDSW: - value->rValue = model->BSIM4v6rdsw; - return(OK); - case BSIM4v6_MOD_RDSWMIN: - value->rValue = model->BSIM4v6rdswmin; - return(OK); - case BSIM4v6_MOD_RDWMIN: - value->rValue = model->BSIM4v6rdwmin; - return(OK); - case BSIM4v6_MOD_RSWMIN: - value->rValue = model->BSIM4v6rswmin; - return(OK); - case BSIM4v6_MOD_RDW: - value->rValue = model->BSIM4v6rdw; - return(OK); - case BSIM4v6_MOD_RSW: - value->rValue = model->BSIM4v6rsw; - return(OK); - case BSIM4v6_MOD_PRWG: - value->rValue = model->BSIM4v6prwg; - return(OK); - case BSIM4v6_MOD_PRWB: - value->rValue = model->BSIM4v6prwb; - return(OK); - case BSIM4v6_MOD_PRT: - value->rValue = model->BSIM4v6prt; - return(OK); - case BSIM4v6_MOD_ETA0: - value->rValue = model->BSIM4v6eta0; - return(OK); - case BSIM4v6_MOD_ETAB: - value->rValue = model->BSIM4v6etab; - return(OK); - case BSIM4v6_MOD_PCLM: - value->rValue = model->BSIM4v6pclm; - return(OK); - case BSIM4v6_MOD_PDIBL1: - value->rValue = model->BSIM4v6pdibl1; - return(OK); - case BSIM4v6_MOD_PDIBL2: - value->rValue = model->BSIM4v6pdibl2; - return(OK); - case BSIM4v6_MOD_PDIBLB: - value->rValue = model->BSIM4v6pdiblb; - return(OK); - case BSIM4v6_MOD_PSCBE1: - value->rValue = model->BSIM4v6pscbe1; - return(OK); - case BSIM4v6_MOD_PSCBE2: - value->rValue = model->BSIM4v6pscbe2; - return(OK); - case BSIM4v6_MOD_PVAG: - value->rValue = model->BSIM4v6pvag; - return(OK); - case BSIM4v6_MOD_WR: - value->rValue = model->BSIM4v6wr; - return(OK); - case BSIM4v6_MOD_DWG: - value->rValue = model->BSIM4v6dwg; - return(OK); - case BSIM4v6_MOD_DWB: - value->rValue = model->BSIM4v6dwb; - return(OK); - case BSIM4v6_MOD_B0: - value->rValue = model->BSIM4v6b0; - return(OK); - case BSIM4v6_MOD_B1: - value->rValue = model->BSIM4v6b1; - return(OK); - case BSIM4v6_MOD_ALPHA0: - value->rValue = model->BSIM4v6alpha0; - return(OK); - case BSIM4v6_MOD_ALPHA1: - value->rValue = model->BSIM4v6alpha1; - return(OK); - case BSIM4v6_MOD_BETA0: - value->rValue = model->BSIM4v6beta0; - return(OK); - case BSIM4v6_MOD_AGIDL: - value->rValue = model->BSIM4v6agidl; - return(OK); - case BSIM4v6_MOD_BGIDL: - value->rValue = model->BSIM4v6bgidl; - return(OK); - case BSIM4v6_MOD_CGIDL: - value->rValue = model->BSIM4v6cgidl; - return(OK); - case BSIM4v6_MOD_EGIDL: - value->rValue = model->BSIM4v6egidl; - return(OK); - case BSIM4v6_MOD_AGISL: - value->rValue = model->BSIM4v6agisl; - return(OK); - case BSIM4v6_MOD_BGISL: - value->rValue = model->BSIM4v6bgisl; - return(OK); - case BSIM4v6_MOD_CGISL: - value->rValue = model->BSIM4v6cgisl; - return(OK); - case BSIM4v6_MOD_EGISL: - value->rValue = model->BSIM4v6egisl; - return(OK); - case BSIM4v6_MOD_AIGC: - value->rValue = model->BSIM4v6aigc; - return(OK); - case BSIM4v6_MOD_BIGC: - value->rValue = model->BSIM4v6bigc; - return(OK); - case BSIM4v6_MOD_CIGC: - value->rValue = model->BSIM4v6cigc; - return(OK); - case BSIM4v6_MOD_AIGSD: - value->rValue = model->BSIM4v6aigsd; - return(OK); - case BSIM4v6_MOD_BIGSD: - value->rValue = model->BSIM4v6bigsd; - return(OK); - case BSIM4v6_MOD_CIGSD: - value->rValue = model->BSIM4v6cigsd; - return(OK); - case BSIM4v6_MOD_AIGS: - value->rValue = model->BSIM4v6aigs; - return(OK); - case BSIM4v6_MOD_BIGS: - value->rValue = model->BSIM4v6bigs; - return(OK); - case BSIM4v6_MOD_CIGS: - value->rValue = model->BSIM4v6cigs; - return(OK); - case BSIM4v6_MOD_AIGD: - value->rValue = model->BSIM4v6aigd; - return(OK); - case BSIM4v6_MOD_BIGD: - value->rValue = model->BSIM4v6bigd; - return(OK); - case BSIM4v6_MOD_CIGD: - value->rValue = model->BSIM4v6cigd; - return(OK); - case BSIM4v6_MOD_AIGBACC: - value->rValue = model->BSIM4v6aigbacc; - return(OK); - case BSIM4v6_MOD_BIGBACC: - value->rValue = model->BSIM4v6bigbacc; - return(OK); - case BSIM4v6_MOD_CIGBACC: - value->rValue = model->BSIM4v6cigbacc; - return(OK); - case BSIM4v6_MOD_AIGBINV: - value->rValue = model->BSIM4v6aigbinv; - return(OK); - case BSIM4v6_MOD_BIGBINV: - value->rValue = model->BSIM4v6bigbinv; - return(OK); - case BSIM4v6_MOD_CIGBINV: - value->rValue = model->BSIM4v6cigbinv; - return(OK); - case BSIM4v6_MOD_NIGC: - value->rValue = model->BSIM4v6nigc; - return(OK); - case BSIM4v6_MOD_NIGBACC: - value->rValue = model->BSIM4v6nigbacc; - return(OK); - case BSIM4v6_MOD_NIGBINV: - value->rValue = model->BSIM4v6nigbinv; - return(OK); - case BSIM4v6_MOD_NTOX: - value->rValue = model->BSIM4v6ntox; - return(OK); - case BSIM4v6_MOD_EIGBINV: - value->rValue = model->BSIM4v6eigbinv; - return(OK); - case BSIM4v6_MOD_PIGCD: - value->rValue = model->BSIM4v6pigcd; - return(OK); - case BSIM4v6_MOD_POXEDGE: - value->rValue = model->BSIM4v6poxedge; - return(OK); - case BSIM4v6_MOD_PHIN: - value->rValue = model->BSIM4v6phin; - return(OK); - case BSIM4v6_MOD_XRCRG1: - value->rValue = model->BSIM4v6xrcrg1; - return(OK); - case BSIM4v6_MOD_XRCRG2: - value->rValue = model->BSIM4v6xrcrg2; - return(OK); - case BSIM4v6_MOD_TNOIA: - value->rValue = model->BSIM4v6tnoia; - return(OK); - case BSIM4v6_MOD_TNOIB: - value->rValue = model->BSIM4v6tnoib; - return(OK); - case BSIM4v6_MOD_RNOIA: - value->rValue = model->BSIM4v6rnoia; - return(OK); - case BSIM4v6_MOD_RNOIB: - value->rValue = model->BSIM4v6rnoib; - return(OK); - case BSIM4v6_MOD_NTNOI: - value->rValue = model->BSIM4v6ntnoi; - return(OK); - case BSIM4v6_MOD_IJTHDFWD: - value->rValue = model->BSIM4v6ijthdfwd; - return(OK); - case BSIM4v6_MOD_IJTHSFWD: - value->rValue = model->BSIM4v6ijthsfwd; - return(OK); - case BSIM4v6_MOD_IJTHDREV: - value->rValue = model->BSIM4v6ijthdrev; - return(OK); - case BSIM4v6_MOD_IJTHSREV: - value->rValue = model->BSIM4v6ijthsrev; - return(OK); - case BSIM4v6_MOD_XJBVD: - value->rValue = model->BSIM4v6xjbvd; - return(OK); - case BSIM4v6_MOD_XJBVS: - value->rValue = model->BSIM4v6xjbvs; - return(OK); - case BSIM4v6_MOD_BVD: - value->rValue = model->BSIM4v6bvd; - return(OK); - case BSIM4v6_MOD_BVS: - value->rValue = model->BSIM4v6bvs; - return(OK); - case BSIM4v6_MOD_VFB: - value->rValue = model->BSIM4v6vfb; - return(OK); - - case BSIM4v6_MOD_JTSS: - value->rValue = model->BSIM4v6jtss; - return(OK); - case BSIM4v6_MOD_JTSD: - value->rValue = model->BSIM4v6jtsd; - return(OK); - case BSIM4v6_MOD_JTSSWS: - value->rValue = model->BSIM4v6jtssws; - return(OK); - case BSIM4v6_MOD_JTSSWD: - value->rValue = model->BSIM4v6jtsswd; - return(OK); - case BSIM4v6_MOD_JTSSWGS: - value->rValue = model->BSIM4v6jtsswgs; - return(OK); - case BSIM4v6_MOD_JTSSWGD: - value->rValue = model->BSIM4v6jtsswgd; - return(OK); - case BSIM4v6_MOD_JTWEFF: - value->rValue = model->BSIM4v6jtweff; - return(OK); - case BSIM4v6_MOD_NJTS: - value->rValue = model->BSIM4v6njts; - return(OK); - case BSIM4v6_MOD_NJTSSW: - value->rValue = model->BSIM4v6njtssw; - return(OK); - case BSIM4v6_MOD_NJTSSWG: - value->rValue = model->BSIM4v6njtsswg; - return(OK); - case BSIM4v6_MOD_NJTSD: - value->rValue = model->BSIM4v6njtsd; - return(OK); - case BSIM4v6_MOD_NJTSSWD: - value->rValue = model->BSIM4v6njtsswd; - return(OK); - case BSIM4v6_MOD_NJTSSWGD: - value->rValue = model->BSIM4v6njtsswgd; - return(OK); - case BSIM4v6_MOD_XTSS: - value->rValue = model->BSIM4v6xtss; - return(OK); - case BSIM4v6_MOD_XTSD: - value->rValue = model->BSIM4v6xtsd; - return(OK); - case BSIM4v6_MOD_XTSSWS: - value->rValue = model->BSIM4v6xtssws; - return(OK); - case BSIM4v6_MOD_XTSSWD: - value->rValue = model->BSIM4v6xtsswd; - return(OK); - case BSIM4v6_MOD_XTSSWGS: - value->rValue = model->BSIM4v6xtsswgs; - return(OK); - case BSIM4v6_MOD_XTSSWGD: - value->rValue = model->BSIM4v6xtsswgd; - return(OK); - case BSIM4v6_MOD_TNJTS: - value->rValue = model->BSIM4v6tnjts; - return(OK); - case BSIM4v6_MOD_TNJTSSW: - value->rValue = model->BSIM4v6tnjtssw; - return(OK); - case BSIM4v6_MOD_TNJTSSWG: - value->rValue = model->BSIM4v6tnjtsswg; - return(OK); - case BSIM4v6_MOD_TNJTSD: - value->rValue = model->BSIM4v6tnjtsd; - return(OK); - case BSIM4v6_MOD_TNJTSSWD: - value->rValue = model->BSIM4v6tnjtsswd; - return(OK); - case BSIM4v6_MOD_TNJTSSWGD: - value->rValue = model->BSIM4v6tnjtsswgd; - return(OK); - case BSIM4v6_MOD_VTSS: - value->rValue = model->BSIM4v6vtss; - return(OK); - case BSIM4v6_MOD_VTSD: - value->rValue = model->BSIM4v6vtsd; - return(OK); - case BSIM4v6_MOD_VTSSWS: - value->rValue = model->BSIM4v6vtssws; - return(OK); - case BSIM4v6_MOD_VTSSWD: - value->rValue = model->BSIM4v6vtsswd; - return(OK); - case BSIM4v6_MOD_VTSSWGS: - value->rValue = model->BSIM4v6vtsswgs; - return(OK); - case BSIM4v6_MOD_VTSSWGD: - value->rValue = model->BSIM4v6vtsswgd; - return(OK); - - case BSIM4v6_MOD_GBMIN: - value->rValue = model->BSIM4v6gbmin; - return(OK); - case BSIM4v6_MOD_RBDB: - value->rValue = model->BSIM4v6rbdb; - return(OK); - case BSIM4v6_MOD_RBPB: - value->rValue = model->BSIM4v6rbpb; - return(OK); - case BSIM4v6_MOD_RBSB: - value->rValue = model->BSIM4v6rbsb; - return(OK); - case BSIM4v6_MOD_RBPS: - value->rValue = model->BSIM4v6rbps; - return(OK); - case BSIM4v6_MOD_RBPD: - value->rValue = model->BSIM4v6rbpd; - return(OK); - - case BSIM4v6_MOD_RBPS0: - value->rValue = model->BSIM4v6rbps0; - return(OK); - case BSIM4v6_MOD_RBPSL: - value->rValue = model->BSIM4v6rbpsl; - return(OK); - case BSIM4v6_MOD_RBPSW: - value->rValue = model->BSIM4v6rbpsw; - return(OK); - case BSIM4v6_MOD_RBPSNF: - value->rValue = model->BSIM4v6rbpsnf; - return(OK); - case BSIM4v6_MOD_RBPD0: - value->rValue = model->BSIM4v6rbpd0; - return(OK); - case BSIM4v6_MOD_RBPDL: - value->rValue = model->BSIM4v6rbpdl; - return(OK); - case BSIM4v6_MOD_RBPDW: - value->rValue = model->BSIM4v6rbpdw; - return(OK); - case BSIM4v6_MOD_RBPDNF: - value->rValue = model->BSIM4v6rbpdnf; - return(OK); - case BSIM4v6_MOD_RBPBX0: - value->rValue = model->BSIM4v6rbpbx0; - return(OK); - case BSIM4v6_MOD_RBPBXL: - value->rValue = model->BSIM4v6rbpbxl; - return(OK); - case BSIM4v6_MOD_RBPBXW: - value->rValue = model->BSIM4v6rbpbxw; - return(OK); - case BSIM4v6_MOD_RBPBXNF: - value->rValue = model->BSIM4v6rbpbxnf; - return(OK); - case BSIM4v6_MOD_RBPBY0: - value->rValue = model->BSIM4v6rbpby0; - return(OK); - case BSIM4v6_MOD_RBPBYL: - value->rValue = model->BSIM4v6rbpbyl; - return(OK); - case BSIM4v6_MOD_RBPBYW: - value->rValue = model->BSIM4v6rbpbyw; - return(OK); - case BSIM4v6_MOD_RBPBYNF: - value->rValue = model->BSIM4v6rbpbynf; - return(OK); - - case BSIM4v6_MOD_RBSBX0: - value->rValue = model->BSIM4v6rbsbx0; - return(OK); - case BSIM4v6_MOD_RBSBY0: - value->rValue = model->BSIM4v6rbsby0; - return(OK); - case BSIM4v6_MOD_RBDBX0: - value->rValue = model->BSIM4v6rbdbx0; - return(OK); - case BSIM4v6_MOD_RBDBY0: - value->rValue = model->BSIM4v6rbdby0; - return(OK); - case BSIM4v6_MOD_RBSDBXL: - value->rValue = model->BSIM4v6rbsdbxl; - return(OK); - case BSIM4v6_MOD_RBSDBXW: - value->rValue = model->BSIM4v6rbsdbxw; - return(OK); - case BSIM4v6_MOD_RBSDBXNF: - value->rValue = model->BSIM4v6rbsdbxnf; - return(OK); - case BSIM4v6_MOD_RBSDBYL: - value->rValue = model->BSIM4v6rbsdbyl; - return(OK); - case BSIM4v6_MOD_RBSDBYW: - value->rValue = model->BSIM4v6rbsdbyw; - return(OK); - case BSIM4v6_MOD_RBSDBYNF: - value->rValue = model->BSIM4v6rbsdbynf; - return(OK); - - - case BSIM4v6_MOD_CGSL: - value->rValue = model->BSIM4v6cgsl; - return(OK); - case BSIM4v6_MOD_CGDL: - value->rValue = model->BSIM4v6cgdl; - return(OK); - case BSIM4v6_MOD_CKAPPAS: - value->rValue = model->BSIM4v6ckappas; - return(OK); - case BSIM4v6_MOD_CKAPPAD: - value->rValue = model->BSIM4v6ckappad; - return(OK); - case BSIM4v6_MOD_CF: - value->rValue = model->BSIM4v6cf; - return(OK); - case BSIM4v6_MOD_CLC: - value->rValue = model->BSIM4v6clc; - return(OK); - case BSIM4v6_MOD_CLE: - value->rValue = model->BSIM4v6cle; - return(OK); - case BSIM4v6_MOD_DWC: - value->rValue = model->BSIM4v6dwc; - return(OK); - case BSIM4v6_MOD_DLC: - value->rValue = model->BSIM4v6dlc; - return(OK); - case BSIM4v6_MOD_XW: - value->rValue = model->BSIM4v6xw; - return(OK); - case BSIM4v6_MOD_XL: - value->rValue = model->BSIM4v6xl; - return(OK); - case BSIM4v6_MOD_DLCIG: - value->rValue = model->BSIM4v6dlcig; - return(OK); - case BSIM4v6_MOD_DLCIGD: - value->rValue = model->BSIM4v6dlcigd; - return(OK); - case BSIM4v6_MOD_DWJ: - value->rValue = model->BSIM4v6dwj; - return(OK); - case BSIM4v6_MOD_VFBCV: - value->rValue = model->BSIM4v6vfbcv; - return(OK); - case BSIM4v6_MOD_ACDE: - value->rValue = model->BSIM4v6acde; - return(OK); - case BSIM4v6_MOD_MOIN: - value->rValue = model->BSIM4v6moin; - return(OK); - case BSIM4v6_MOD_NOFF: - value->rValue = model->BSIM4v6noff; - return(OK); - case BSIM4v6_MOD_VOFFCV: - value->rValue = model->BSIM4v6voffcv; - return(OK); - case BSIM4v6_MOD_DMCG: - value->rValue = model->BSIM4v6dmcg; - return(OK); - case BSIM4v6_MOD_DMCI: - value->rValue = model->BSIM4v6dmci; - return(OK); - case BSIM4v6_MOD_DMDG: - value->rValue = model->BSIM4v6dmdg; - return(OK); - case BSIM4v6_MOD_DMCGT: - value->rValue = model->BSIM4v6dmcgt; - return(OK); - case BSIM4v6_MOD_XGW: - value->rValue = model->BSIM4v6xgw; - return(OK); - case BSIM4v6_MOD_XGL: - value->rValue = model->BSIM4v6xgl; - return(OK); - case BSIM4v6_MOD_RSHG: - value->rValue = model->BSIM4v6rshg; - return(OK); - case BSIM4v6_MOD_TCJ: - value->rValue = model->BSIM4v6tcj; - return(OK); - case BSIM4v6_MOD_TPB: - value->rValue = model->BSIM4v6tpb; - return(OK); - case BSIM4v6_MOD_TCJSW: - value->rValue = model->BSIM4v6tcjsw; - return(OK); - case BSIM4v6_MOD_TPBSW: - value->rValue = model->BSIM4v6tpbsw; - return(OK); - case BSIM4v6_MOD_TCJSWG: - value->rValue = model->BSIM4v6tcjswg; - return(OK); - case BSIM4v6_MOD_TPBSWG: - value->rValue = model->BSIM4v6tpbswg; - return(OK); - - /* Length dependence */ - case BSIM4v6_MOD_LCDSC : - value->rValue = model->BSIM4v6lcdsc; - return(OK); - case BSIM4v6_MOD_LCDSCB : - value->rValue = model->BSIM4v6lcdscb; - return(OK); - case BSIM4v6_MOD_LCDSCD : - value->rValue = model->BSIM4v6lcdscd; - return(OK); - case BSIM4v6_MOD_LCIT : - value->rValue = model->BSIM4v6lcit; - return(OK); - case BSIM4v6_MOD_LNFACTOR : - value->rValue = model->BSIM4v6lnfactor; - return(OK); - case BSIM4v6_MOD_LXJ: - value->rValue = model->BSIM4v6lxj; - return(OK); - case BSIM4v6_MOD_LVSAT: - value->rValue = model->BSIM4v6lvsat; - return(OK); - case BSIM4v6_MOD_LAT: - value->rValue = model->BSIM4v6lat; - return(OK); - case BSIM4v6_MOD_LA0: - value->rValue = model->BSIM4v6la0; - return(OK); - case BSIM4v6_MOD_LAGS: - value->rValue = model->BSIM4v6lags; - return(OK); - case BSIM4v6_MOD_LA1: - value->rValue = model->BSIM4v6la1; - return(OK); - case BSIM4v6_MOD_LA2: - value->rValue = model->BSIM4v6la2; - return(OK); - case BSIM4v6_MOD_LKETA: - value->rValue = model->BSIM4v6lketa; - return(OK); - case BSIM4v6_MOD_LNSUB: - value->rValue = model->BSIM4v6lnsub; - return(OK); - case BSIM4v6_MOD_LNDEP: - value->rValue = model->BSIM4v6lndep; - return(OK); - case BSIM4v6_MOD_LNSD: - value->rValue = model->BSIM4v6lnsd; - return(OK); - case BSIM4v6_MOD_LNGATE: - value->rValue = model->BSIM4v6lngate; - return(OK); - case BSIM4v6_MOD_LGAMMA1: - value->rValue = model->BSIM4v6lgamma1; - return(OK); - case BSIM4v6_MOD_LGAMMA2: - value->rValue = model->BSIM4v6lgamma2; - return(OK); - case BSIM4v6_MOD_LVBX: - value->rValue = model->BSIM4v6lvbx; - return(OK); - case BSIM4v6_MOD_LVBM: - value->rValue = model->BSIM4v6lvbm; - return(OK); - case BSIM4v6_MOD_LXT: - value->rValue = model->BSIM4v6lxt; - return(OK); - case BSIM4v6_MOD_LK1: - value->rValue = model->BSIM4v6lk1; - return(OK); - case BSIM4v6_MOD_LKT1: - value->rValue = model->BSIM4v6lkt1; - return(OK); - case BSIM4v6_MOD_LKT1L: - value->rValue = model->BSIM4v6lkt1l; - return(OK); - case BSIM4v6_MOD_LKT2 : - value->rValue = model->BSIM4v6lkt2; - return(OK); - case BSIM4v6_MOD_LK2 : - value->rValue = model->BSIM4v6lk2; - return(OK); - case BSIM4v6_MOD_LK3: - value->rValue = model->BSIM4v6lk3; - return(OK); - case BSIM4v6_MOD_LK3B: - value->rValue = model->BSIM4v6lk3b; - return(OK); - case BSIM4v6_MOD_LW0: - value->rValue = model->BSIM4v6lw0; - return(OK); - case BSIM4v6_MOD_LLPE0: - value->rValue = model->BSIM4v6llpe0; - return(OK); - case BSIM4v6_MOD_LLPEB: - value->rValue = model->BSIM4v6llpeb; - return(OK); - case BSIM4v6_MOD_LDVTP0: - value->rValue = model->BSIM4v6ldvtp0; - return(OK); - case BSIM4v6_MOD_LDVTP1: - value->rValue = model->BSIM4v6ldvtp1; - return(OK); - case BSIM4v6_MOD_LDVT0: - value->rValue = model->BSIM4v6ldvt0; - return(OK); - case BSIM4v6_MOD_LDVT1 : - value->rValue = model->BSIM4v6ldvt1; - return(OK); - case BSIM4v6_MOD_LDVT2 : - value->rValue = model->BSIM4v6ldvt2; - return(OK); - case BSIM4v6_MOD_LDVT0W : - value->rValue = model->BSIM4v6ldvt0w; - return(OK); - case BSIM4v6_MOD_LDVT1W : - value->rValue = model->BSIM4v6ldvt1w; - return(OK); - case BSIM4v6_MOD_LDVT2W : - value->rValue = model->BSIM4v6ldvt2w; - return(OK); - case BSIM4v6_MOD_LDROUT : - value->rValue = model->BSIM4v6ldrout; - return(OK); - case BSIM4v6_MOD_LDSUB : - value->rValue = model->BSIM4v6ldsub; - return(OK); - case BSIM4v6_MOD_LVTH0: - value->rValue = model->BSIM4v6lvth0; - return(OK); - case BSIM4v6_MOD_LUA: - value->rValue = model->BSIM4v6lua; - return(OK); - case BSIM4v6_MOD_LUA1: - value->rValue = model->BSIM4v6lua1; - return(OK); - case BSIM4v6_MOD_LUB: - value->rValue = model->BSIM4v6lub; - return(OK); - case BSIM4v6_MOD_LUB1: - value->rValue = model->BSIM4v6lub1; - return(OK); - case BSIM4v6_MOD_LUC: - value->rValue = model->BSIM4v6luc; - return(OK); - case BSIM4v6_MOD_LUC1: - value->rValue = model->BSIM4v6luc1; - return(OK); - case BSIM4v6_MOD_LUD: - value->rValue = model->BSIM4v6lud; - return(OK); - case BSIM4v6_MOD_LUD1: - value->rValue = model->BSIM4v6lud1; - return(OK); - case BSIM4v6_MOD_LUP: - value->rValue = model->BSIM4v6lup; - return(OK); - case BSIM4v6_MOD_LLP: - value->rValue = model->BSIM4v6llp; - return(OK); - case BSIM4v6_MOD_LU0: - value->rValue = model->BSIM4v6lu0; - return(OK); - case BSIM4v6_MOD_LUTE: - value->rValue = model->BSIM4v6lute; - return(OK); - case BSIM4v6_MOD_LUCSTE: - value->rValue = model->BSIM4v6lucste; - return(OK); - case BSIM4v6_MOD_LVOFF: - value->rValue = model->BSIM4v6lvoff; - return(OK); - case BSIM4v6_MOD_LTVOFF: - value->rValue = model->BSIM4v6ltvoff; - return(OK); - case BSIM4v6_MOD_LMINV: - value->rValue = model->BSIM4v6lminv; - return(OK); - case BSIM4v6_MOD_LMINVCV: - value->rValue = model->BSIM4v6lminvcv; - return(OK); - case BSIM4v6_MOD_LFPROUT: - value->rValue = model->BSIM4v6lfprout; - return(OK); - case BSIM4v6_MOD_LPDITS: - value->rValue = model->BSIM4v6lpdits; - return(OK); - case BSIM4v6_MOD_LPDITSD: - value->rValue = model->BSIM4v6lpditsd; - return(OK); - case BSIM4v6_MOD_LDELTA: - value->rValue = model->BSIM4v6ldelta; - return(OK); - case BSIM4v6_MOD_LRDSW: - value->rValue = model->BSIM4v6lrdsw; - return(OK); - case BSIM4v6_MOD_LRDW: - value->rValue = model->BSIM4v6lrdw; - return(OK); - case BSIM4v6_MOD_LRSW: - value->rValue = model->BSIM4v6lrsw; - return(OK); - case BSIM4v6_MOD_LPRWB: - value->rValue = model->BSIM4v6lprwb; - return(OK); - case BSIM4v6_MOD_LPRWG: - value->rValue = model->BSIM4v6lprwg; - return(OK); - case BSIM4v6_MOD_LPRT: - value->rValue = model->BSIM4v6lprt; - return(OK); - case BSIM4v6_MOD_LETA0: - value->rValue = model->BSIM4v6leta0; - return(OK); - case BSIM4v6_MOD_LETAB: - value->rValue = model->BSIM4v6letab; - return(OK); - case BSIM4v6_MOD_LPCLM: - value->rValue = model->BSIM4v6lpclm; - return(OK); - case BSIM4v6_MOD_LPDIBL1: - value->rValue = model->BSIM4v6lpdibl1; - return(OK); - case BSIM4v6_MOD_LPDIBL2: - value->rValue = model->BSIM4v6lpdibl2; - return(OK); - case BSIM4v6_MOD_LPDIBLB: - value->rValue = model->BSIM4v6lpdiblb; - return(OK); - case BSIM4v6_MOD_LPSCBE1: - value->rValue = model->BSIM4v6lpscbe1; - return(OK); - case BSIM4v6_MOD_LPSCBE2: - value->rValue = model->BSIM4v6lpscbe2; - return(OK); - case BSIM4v6_MOD_LPVAG: - value->rValue = model->BSIM4v6lpvag; - return(OK); - case BSIM4v6_MOD_LWR: - value->rValue = model->BSIM4v6lwr; - return(OK); - case BSIM4v6_MOD_LDWG: - value->rValue = model->BSIM4v6ldwg; - return(OK); - case BSIM4v6_MOD_LDWB: - value->rValue = model->BSIM4v6ldwb; - return(OK); - case BSIM4v6_MOD_LB0: - value->rValue = model->BSIM4v6lb0; - return(OK); - case BSIM4v6_MOD_LB1: - value->rValue = model->BSIM4v6lb1; - return(OK); - case BSIM4v6_MOD_LALPHA0: - value->rValue = model->BSIM4v6lalpha0; - return(OK); - case BSIM4v6_MOD_LALPHA1: - value->rValue = model->BSIM4v6lalpha1; - return(OK); - case BSIM4v6_MOD_LBETA0: - value->rValue = model->BSIM4v6lbeta0; - return(OK); - case BSIM4v6_MOD_LAGIDL: - value->rValue = model->BSIM4v6lagidl; - return(OK); - case BSIM4v6_MOD_LBGIDL: - value->rValue = model->BSIM4v6lbgidl; - return(OK); - case BSIM4v6_MOD_LCGIDL: - value->rValue = model->BSIM4v6lcgidl; - return(OK); - case BSIM4v6_MOD_LEGIDL: - value->rValue = model->BSIM4v6legidl; - return(OK); - case BSIM4v6_MOD_LAGISL: - value->rValue = model->BSIM4v6lagisl; - return(OK); - case BSIM4v6_MOD_LBGISL: - value->rValue = model->BSIM4v6lbgisl; - return(OK); - case BSIM4v6_MOD_LCGISL: - value->rValue = model->BSIM4v6lcgisl; - return(OK); - case BSIM4v6_MOD_LEGISL: - value->rValue = model->BSIM4v6legisl; - return(OK); - case BSIM4v6_MOD_LAIGC: - value->rValue = model->BSIM4v6laigc; - return(OK); - case BSIM4v6_MOD_LBIGC: - value->rValue = model->BSIM4v6lbigc; - return(OK); - case BSIM4v6_MOD_LCIGC: - value->rValue = model->BSIM4v6lcigc; - return(OK); - case BSIM4v6_MOD_LAIGSD: - value->rValue = model->BSIM4v6laigsd; - return(OK); - case BSIM4v6_MOD_LBIGSD: - value->rValue = model->BSIM4v6lbigsd; - return(OK); - case BSIM4v6_MOD_LCIGSD: - value->rValue = model->BSIM4v6lcigsd; - return(OK); - case BSIM4v6_MOD_LAIGS: - value->rValue = model->BSIM4v6laigs; - return(OK); - case BSIM4v6_MOD_LBIGS: - value->rValue = model->BSIM4v6lbigs; - return(OK); - case BSIM4v6_MOD_LCIGS: - value->rValue = model->BSIM4v6lcigs; - return(OK); - case BSIM4v6_MOD_LAIGD: - value->rValue = model->BSIM4v6laigd; - return(OK); - case BSIM4v6_MOD_LBIGD: - value->rValue = model->BSIM4v6lbigd; - return(OK); - case BSIM4v6_MOD_LCIGD: - value->rValue = model->BSIM4v6lcigd; - return(OK); - case BSIM4v6_MOD_LAIGBACC: - value->rValue = model->BSIM4v6laigbacc; - return(OK); - case BSIM4v6_MOD_LBIGBACC: - value->rValue = model->BSIM4v6lbigbacc; - return(OK); - case BSIM4v6_MOD_LCIGBACC: - value->rValue = model->BSIM4v6lcigbacc; - return(OK); - case BSIM4v6_MOD_LAIGBINV: - value->rValue = model->BSIM4v6laigbinv; - return(OK); - case BSIM4v6_MOD_LBIGBINV: - value->rValue = model->BSIM4v6lbigbinv; - return(OK); - case BSIM4v6_MOD_LCIGBINV: - value->rValue = model->BSIM4v6lcigbinv; - return(OK); - case BSIM4v6_MOD_LNIGC: - value->rValue = model->BSIM4v6lnigc; - return(OK); - case BSIM4v6_MOD_LNIGBACC: - value->rValue = model->BSIM4v6lnigbacc; - return(OK); - case BSIM4v6_MOD_LNIGBINV: - value->rValue = model->BSIM4v6lnigbinv; - return(OK); - case BSIM4v6_MOD_LNTOX: - value->rValue = model->BSIM4v6lntox; - return(OK); - case BSIM4v6_MOD_LEIGBINV: - value->rValue = model->BSIM4v6leigbinv; - return(OK); - case BSIM4v6_MOD_LPIGCD: - value->rValue = model->BSIM4v6lpigcd; - return(OK); - case BSIM4v6_MOD_LPOXEDGE: - value->rValue = model->BSIM4v6lpoxedge; - return(OK); - case BSIM4v6_MOD_LPHIN: - value->rValue = model->BSIM4v6lphin; - return(OK); - case BSIM4v6_MOD_LXRCRG1: - value->rValue = model->BSIM4v6lxrcrg1; - return(OK); - case BSIM4v6_MOD_LXRCRG2: - value->rValue = model->BSIM4v6lxrcrg2; - return(OK); - case BSIM4v6_MOD_LEU: - value->rValue = model->BSIM4v6leu; - return(OK); - case BSIM4v6_MOD_LUCS: - value->rValue = model->BSIM4v6lucs; - return(OK); - case BSIM4v6_MOD_LVFB: - value->rValue = model->BSIM4v6lvfb; - return(OK); - - case BSIM4v6_MOD_LCGSL: - value->rValue = model->BSIM4v6lcgsl; - return(OK); - case BSIM4v6_MOD_LCGDL: - value->rValue = model->BSIM4v6lcgdl; - return(OK); - case BSIM4v6_MOD_LCKAPPAS: - value->rValue = model->BSIM4v6lckappas; - return(OK); - case BSIM4v6_MOD_LCKAPPAD: - value->rValue = model->BSIM4v6lckappad; - return(OK); - case BSIM4v6_MOD_LCF: - value->rValue = model->BSIM4v6lcf; - return(OK); - case BSIM4v6_MOD_LCLC: - value->rValue = model->BSIM4v6lclc; - return(OK); - case BSIM4v6_MOD_LCLE: - value->rValue = model->BSIM4v6lcle; - return(OK); - case BSIM4v6_MOD_LVFBCV: - value->rValue = model->BSIM4v6lvfbcv; - return(OK); - case BSIM4v6_MOD_LACDE: - value->rValue = model->BSIM4v6lacde; - return(OK); - case BSIM4v6_MOD_LMOIN: - value->rValue = model->BSIM4v6lmoin; - return(OK); - case BSIM4v6_MOD_LNOFF: - value->rValue = model->BSIM4v6lnoff; - return(OK); - case BSIM4v6_MOD_LVOFFCV: - value->rValue = model->BSIM4v6lvoffcv; - return(OK); - case BSIM4v6_MOD_LVFBSDOFF: - value->rValue = model->BSIM4v6lvfbsdoff; - return(OK); - case BSIM4v6_MOD_LTVFBSDOFF: - value->rValue = model->BSIM4v6ltvfbsdoff; - return(OK); - - /* Width dependence */ - case BSIM4v6_MOD_WCDSC : - value->rValue = model->BSIM4v6wcdsc; - return(OK); - case BSIM4v6_MOD_WCDSCB : - value->rValue = model->BSIM4v6wcdscb; - return(OK); - case BSIM4v6_MOD_WCDSCD : - value->rValue = model->BSIM4v6wcdscd; - return(OK); - case BSIM4v6_MOD_WCIT : - value->rValue = model->BSIM4v6wcit; - return(OK); - case BSIM4v6_MOD_WNFACTOR : - value->rValue = model->BSIM4v6wnfactor; - return(OK); - case BSIM4v6_MOD_WXJ: - value->rValue = model->BSIM4v6wxj; - return(OK); - case BSIM4v6_MOD_WVSAT: - value->rValue = model->BSIM4v6wvsat; - return(OK); - case BSIM4v6_MOD_WAT: - value->rValue = model->BSIM4v6wat; - return(OK); - case BSIM4v6_MOD_WA0: - value->rValue = model->BSIM4v6wa0; - return(OK); - case BSIM4v6_MOD_WAGS: - value->rValue = model->BSIM4v6wags; - return(OK); - case BSIM4v6_MOD_WA1: - value->rValue = model->BSIM4v6wa1; - return(OK); - case BSIM4v6_MOD_WA2: - value->rValue = model->BSIM4v6wa2; - return(OK); - case BSIM4v6_MOD_WKETA: - value->rValue = model->BSIM4v6wketa; - return(OK); - case BSIM4v6_MOD_WNSUB: - value->rValue = model->BSIM4v6wnsub; - return(OK); - case BSIM4v6_MOD_WNDEP: - value->rValue = model->BSIM4v6wndep; - return(OK); - case BSIM4v6_MOD_WNSD: - value->rValue = model->BSIM4v6wnsd; - return(OK); - case BSIM4v6_MOD_WNGATE: - value->rValue = model->BSIM4v6wngate; - return(OK); - case BSIM4v6_MOD_WGAMMA1: - value->rValue = model->BSIM4v6wgamma1; - return(OK); - case BSIM4v6_MOD_WGAMMA2: - value->rValue = model->BSIM4v6wgamma2; - return(OK); - case BSIM4v6_MOD_WVBX: - value->rValue = model->BSIM4v6wvbx; - return(OK); - case BSIM4v6_MOD_WVBM: - value->rValue = model->BSIM4v6wvbm; - return(OK); - case BSIM4v6_MOD_WXT: - value->rValue = model->BSIM4v6wxt; - return(OK); - case BSIM4v6_MOD_WK1: - value->rValue = model->BSIM4v6wk1; - return(OK); - case BSIM4v6_MOD_WKT1: - value->rValue = model->BSIM4v6wkt1; - return(OK); - case BSIM4v6_MOD_WKT1L: - value->rValue = model->BSIM4v6wkt1l; - return(OK); - case BSIM4v6_MOD_WKT2 : - value->rValue = model->BSIM4v6wkt2; - return(OK); - case BSIM4v6_MOD_WK2 : - value->rValue = model->BSIM4v6wk2; - return(OK); - case BSIM4v6_MOD_WK3: - value->rValue = model->BSIM4v6wk3; - return(OK); - case BSIM4v6_MOD_WK3B: - value->rValue = model->BSIM4v6wk3b; - return(OK); - case BSIM4v6_MOD_WW0: - value->rValue = model->BSIM4v6ww0; - return(OK); - case BSIM4v6_MOD_WLPE0: - value->rValue = model->BSIM4v6wlpe0; - return(OK); - case BSIM4v6_MOD_WDVTP0: - value->rValue = model->BSIM4v6wdvtp0; - return(OK); - case BSIM4v6_MOD_WDVTP1: - value->rValue = model->BSIM4v6wdvtp1; - return(OK); - case BSIM4v6_MOD_WLPEB: - value->rValue = model->BSIM4v6wlpeb; - return(OK); - case BSIM4v6_MOD_WDVT0: - value->rValue = model->BSIM4v6wdvt0; - return(OK); - case BSIM4v6_MOD_WDVT1 : - value->rValue = model->BSIM4v6wdvt1; - return(OK); - case BSIM4v6_MOD_WDVT2 : - value->rValue = model->BSIM4v6wdvt2; - return(OK); - case BSIM4v6_MOD_WDVT0W : - value->rValue = model->BSIM4v6wdvt0w; - return(OK); - case BSIM4v6_MOD_WDVT1W : - value->rValue = model->BSIM4v6wdvt1w; - return(OK); - case BSIM4v6_MOD_WDVT2W : - value->rValue = model->BSIM4v6wdvt2w; - return(OK); - case BSIM4v6_MOD_WDROUT : - value->rValue = model->BSIM4v6wdrout; - return(OK); - case BSIM4v6_MOD_WDSUB : - value->rValue = model->BSIM4v6wdsub; - return(OK); - case BSIM4v6_MOD_WVTH0: - value->rValue = model->BSIM4v6wvth0; - return(OK); - case BSIM4v6_MOD_WUA: - value->rValue = model->BSIM4v6wua; - return(OK); - case BSIM4v6_MOD_WUA1: - value->rValue = model->BSIM4v6wua1; - return(OK); - case BSIM4v6_MOD_WUB: - value->rValue = model->BSIM4v6wub; - return(OK); - case BSIM4v6_MOD_WUB1: - value->rValue = model->BSIM4v6wub1; - return(OK); - case BSIM4v6_MOD_WUC: - value->rValue = model->BSIM4v6wuc; - return(OK); - case BSIM4v6_MOD_WUC1: - value->rValue = model->BSIM4v6wuc1; - return(OK); - case BSIM4v6_MOD_WUD: - value->rValue = model->BSIM4v6wud; - return(OK); - case BSIM4v6_MOD_WUD1: - value->rValue = model->BSIM4v6wud1; - return(OK); - case BSIM4v6_MOD_WUP: - value->rValue = model->BSIM4v6wup; - return(OK); - case BSIM4v6_MOD_WLP: - value->rValue = model->BSIM4v6wlp; - return(OK); - case BSIM4v6_MOD_WU0: - value->rValue = model->BSIM4v6wu0; - return(OK); - case BSIM4v6_MOD_WUTE: - value->rValue = model->BSIM4v6wute; - return(OK); - case BSIM4v6_MOD_WUCSTE: - value->rValue = model->BSIM4v6wucste; - return(OK); - case BSIM4v6_MOD_WVOFF: - value->rValue = model->BSIM4v6wvoff; - return(OK); - case BSIM4v6_MOD_WTVOFF: - value->rValue = model->BSIM4v6wtvoff; - return(OK); - case BSIM4v6_MOD_WMINV: - value->rValue = model->BSIM4v6wminv; - return(OK); - case BSIM4v6_MOD_WMINVCV: - value->rValue = model->BSIM4v6wminvcv; - return(OK); - case BSIM4v6_MOD_WFPROUT: - value->rValue = model->BSIM4v6wfprout; - return(OK); - case BSIM4v6_MOD_WPDITS: - value->rValue = model->BSIM4v6wpdits; - return(OK); - case BSIM4v6_MOD_WPDITSD: - value->rValue = model->BSIM4v6wpditsd; - return(OK); - case BSIM4v6_MOD_WDELTA: - value->rValue = model->BSIM4v6wdelta; - return(OK); - case BSIM4v6_MOD_WRDSW: - value->rValue = model->BSIM4v6wrdsw; - return(OK); - case BSIM4v6_MOD_WRDW: - value->rValue = model->BSIM4v6wrdw; - return(OK); - case BSIM4v6_MOD_WRSW: - value->rValue = model->BSIM4v6wrsw; - return(OK); - case BSIM4v6_MOD_WPRWB: - value->rValue = model->BSIM4v6wprwb; - return(OK); - case BSIM4v6_MOD_WPRWG: - value->rValue = model->BSIM4v6wprwg; - return(OK); - case BSIM4v6_MOD_WPRT: - value->rValue = model->BSIM4v6wprt; - return(OK); - case BSIM4v6_MOD_WETA0: - value->rValue = model->BSIM4v6weta0; - return(OK); - case BSIM4v6_MOD_WETAB: - value->rValue = model->BSIM4v6wetab; - return(OK); - case BSIM4v6_MOD_WPCLM: - value->rValue = model->BSIM4v6wpclm; - return(OK); - case BSIM4v6_MOD_WPDIBL1: - value->rValue = model->BSIM4v6wpdibl1; - return(OK); - case BSIM4v6_MOD_WPDIBL2: - value->rValue = model->BSIM4v6wpdibl2; - return(OK); - case BSIM4v6_MOD_WPDIBLB: - value->rValue = model->BSIM4v6wpdiblb; - return(OK); - case BSIM4v6_MOD_WPSCBE1: - value->rValue = model->BSIM4v6wpscbe1; - return(OK); - case BSIM4v6_MOD_WPSCBE2: - value->rValue = model->BSIM4v6wpscbe2; - return(OK); - case BSIM4v6_MOD_WPVAG: - value->rValue = model->BSIM4v6wpvag; - return(OK); - case BSIM4v6_MOD_WWR: - value->rValue = model->BSIM4v6wwr; - return(OK); - case BSIM4v6_MOD_WDWG: - value->rValue = model->BSIM4v6wdwg; - return(OK); - case BSIM4v6_MOD_WDWB: - value->rValue = model->BSIM4v6wdwb; - return(OK); - case BSIM4v6_MOD_WB0: - value->rValue = model->BSIM4v6wb0; - return(OK); - case BSIM4v6_MOD_WB1: - value->rValue = model->BSIM4v6wb1; - return(OK); - case BSIM4v6_MOD_WALPHA0: - value->rValue = model->BSIM4v6walpha0; - return(OK); - case BSIM4v6_MOD_WALPHA1: - value->rValue = model->BSIM4v6walpha1; - return(OK); - case BSIM4v6_MOD_WBETA0: - value->rValue = model->BSIM4v6wbeta0; - return(OK); - case BSIM4v6_MOD_WAGIDL: - value->rValue = model->BSIM4v6wagidl; - return(OK); - case BSIM4v6_MOD_WBGIDL: - value->rValue = model->BSIM4v6wbgidl; - return(OK); - case BSIM4v6_MOD_WCGIDL: - value->rValue = model->BSIM4v6wcgidl; - return(OK); - case BSIM4v6_MOD_WEGIDL: - value->rValue = model->BSIM4v6wegidl; - return(OK); - case BSIM4v6_MOD_WAGISL: - value->rValue = model->BSIM4v6wagisl; - return(OK); - case BSIM4v6_MOD_WBGISL: - value->rValue = model->BSIM4v6wbgisl; - return(OK); - case BSIM4v6_MOD_WCGISL: - value->rValue = model->BSIM4v6wcgisl; - return(OK); - case BSIM4v6_MOD_WEGISL: - value->rValue = model->BSIM4v6wegisl; - return(OK); - case BSIM4v6_MOD_WAIGC: - value->rValue = model->BSIM4v6waigc; - return(OK); - case BSIM4v6_MOD_WBIGC: - value->rValue = model->BSIM4v6wbigc; - return(OK); - case BSIM4v6_MOD_WCIGC: - value->rValue = model->BSIM4v6wcigc; - return(OK); - case BSIM4v6_MOD_WAIGSD: - value->rValue = model->BSIM4v6waigsd; - return(OK); - case BSIM4v6_MOD_WBIGSD: - value->rValue = model->BSIM4v6wbigsd; - return(OK); - case BSIM4v6_MOD_WCIGSD: - value->rValue = model->BSIM4v6wcigsd; - return(OK); - case BSIM4v6_MOD_WAIGS: - value->rValue = model->BSIM4v6waigs; - return(OK); - case BSIM4v6_MOD_WBIGS: - value->rValue = model->BSIM4v6wbigs; - return(OK); - case BSIM4v6_MOD_WCIGS: - value->rValue = model->BSIM4v6wcigs; - return(OK); - case BSIM4v6_MOD_WAIGD: - value->rValue = model->BSIM4v6waigd; - return(OK); - case BSIM4v6_MOD_WBIGD: - value->rValue = model->BSIM4v6wbigd; - return(OK); - case BSIM4v6_MOD_WCIGD: - value->rValue = model->BSIM4v6wcigd; - return(OK); - case BSIM4v6_MOD_WAIGBACC: - value->rValue = model->BSIM4v6waigbacc; - return(OK); - case BSIM4v6_MOD_WBIGBACC: - value->rValue = model->BSIM4v6wbigbacc; - return(OK); - case BSIM4v6_MOD_WCIGBACC: - value->rValue = model->BSIM4v6wcigbacc; - return(OK); - case BSIM4v6_MOD_WAIGBINV: - value->rValue = model->BSIM4v6waigbinv; - return(OK); - case BSIM4v6_MOD_WBIGBINV: - value->rValue = model->BSIM4v6wbigbinv; - return(OK); - case BSIM4v6_MOD_WCIGBINV: - value->rValue = model->BSIM4v6wcigbinv; - return(OK); - case BSIM4v6_MOD_WNIGC: - value->rValue = model->BSIM4v6wnigc; - return(OK); - case BSIM4v6_MOD_WNIGBACC: - value->rValue = model->BSIM4v6wnigbacc; - return(OK); - case BSIM4v6_MOD_WNIGBINV: - value->rValue = model->BSIM4v6wnigbinv; - return(OK); - case BSIM4v6_MOD_WNTOX: - value->rValue = model->BSIM4v6wntox; - return(OK); - case BSIM4v6_MOD_WEIGBINV: - value->rValue = model->BSIM4v6weigbinv; - return(OK); - case BSIM4v6_MOD_WPIGCD: - value->rValue = model->BSIM4v6wpigcd; - return(OK); - case BSIM4v6_MOD_WPOXEDGE: - value->rValue = model->BSIM4v6wpoxedge; - return(OK); - case BSIM4v6_MOD_WPHIN: - value->rValue = model->BSIM4v6wphin; - return(OK); - case BSIM4v6_MOD_WXRCRG1: - value->rValue = model->BSIM4v6wxrcrg1; - return(OK); - case BSIM4v6_MOD_WXRCRG2: - value->rValue = model->BSIM4v6wxrcrg2; - return(OK); - case BSIM4v6_MOD_WEU: - value->rValue = model->BSIM4v6weu; - return(OK); - case BSIM4v6_MOD_WUCS: - value->rValue = model->BSIM4v6wucs; - return(OK); - case BSIM4v6_MOD_WVFB: - value->rValue = model->BSIM4v6wvfb; - return(OK); - - case BSIM4v6_MOD_WCGSL: - value->rValue = model->BSIM4v6wcgsl; - return(OK); - case BSIM4v6_MOD_WCGDL: - value->rValue = model->BSIM4v6wcgdl; - return(OK); - case BSIM4v6_MOD_WCKAPPAS: - value->rValue = model->BSIM4v6wckappas; - return(OK); - case BSIM4v6_MOD_WCKAPPAD: - value->rValue = model->BSIM4v6wckappad; - return(OK); - case BSIM4v6_MOD_WCF: - value->rValue = model->BSIM4v6wcf; - return(OK); - case BSIM4v6_MOD_WCLC: - value->rValue = model->BSIM4v6wclc; - return(OK); - case BSIM4v6_MOD_WCLE: - value->rValue = model->BSIM4v6wcle; - return(OK); - case BSIM4v6_MOD_WVFBCV: - value->rValue = model->BSIM4v6wvfbcv; - return(OK); - case BSIM4v6_MOD_WACDE: - value->rValue = model->BSIM4v6wacde; - return(OK); - case BSIM4v6_MOD_WMOIN: - value->rValue = model->BSIM4v6wmoin; - return(OK); - case BSIM4v6_MOD_WNOFF: - value->rValue = model->BSIM4v6wnoff; - return(OK); - case BSIM4v6_MOD_WVOFFCV: - value->rValue = model->BSIM4v6wvoffcv; - return(OK); - case BSIM4v6_MOD_WVFBSDOFF: - value->rValue = model->BSIM4v6wvfbsdoff; - return(OK); - case BSIM4v6_MOD_WTVFBSDOFF: - value->rValue = model->BSIM4v6wtvfbsdoff; - return(OK); - - /* Cross-term dependence */ - case BSIM4v6_MOD_PCDSC : - value->rValue = model->BSIM4v6pcdsc; - return(OK); - case BSIM4v6_MOD_PCDSCB : - value->rValue = model->BSIM4v6pcdscb; - return(OK); - case BSIM4v6_MOD_PCDSCD : - value->rValue = model->BSIM4v6pcdscd; - return(OK); - case BSIM4v6_MOD_PCIT : - value->rValue = model->BSIM4v6pcit; - return(OK); - case BSIM4v6_MOD_PNFACTOR : - value->rValue = model->BSIM4v6pnfactor; - return(OK); - case BSIM4v6_MOD_PXJ: - value->rValue = model->BSIM4v6pxj; - return(OK); - case BSIM4v6_MOD_PVSAT: - value->rValue = model->BSIM4v6pvsat; - return(OK); - case BSIM4v6_MOD_PAT: - value->rValue = model->BSIM4v6pat; - return(OK); - case BSIM4v6_MOD_PA0: - value->rValue = model->BSIM4v6pa0; - return(OK); - case BSIM4v6_MOD_PAGS: - value->rValue = model->BSIM4v6pags; - return(OK); - case BSIM4v6_MOD_PA1: - value->rValue = model->BSIM4v6pa1; - return(OK); - case BSIM4v6_MOD_PA2: - value->rValue = model->BSIM4v6pa2; - return(OK); - case BSIM4v6_MOD_PKETA: - value->rValue = model->BSIM4v6pketa; - return(OK); - case BSIM4v6_MOD_PNSUB: - value->rValue = model->BSIM4v6pnsub; - return(OK); - case BSIM4v6_MOD_PNDEP: - value->rValue = model->BSIM4v6pndep; - return(OK); - case BSIM4v6_MOD_PNSD: - value->rValue = model->BSIM4v6pnsd; - return(OK); - case BSIM4v6_MOD_PNGATE: - value->rValue = model->BSIM4v6pngate; - return(OK); - case BSIM4v6_MOD_PGAMMA1: - value->rValue = model->BSIM4v6pgamma1; - return(OK); - case BSIM4v6_MOD_PGAMMA2: - value->rValue = model->BSIM4v6pgamma2; - return(OK); - case BSIM4v6_MOD_PVBX: - value->rValue = model->BSIM4v6pvbx; - return(OK); - case BSIM4v6_MOD_PVBM: - value->rValue = model->BSIM4v6pvbm; - return(OK); - case BSIM4v6_MOD_PXT: - value->rValue = model->BSIM4v6pxt; - return(OK); - case BSIM4v6_MOD_PK1: - value->rValue = model->BSIM4v6pk1; - return(OK); - case BSIM4v6_MOD_PKT1: - value->rValue = model->BSIM4v6pkt1; - return(OK); - case BSIM4v6_MOD_PKT1L: - value->rValue = model->BSIM4v6pkt1l; - return(OK); - case BSIM4v6_MOD_PKT2 : - value->rValue = model->BSIM4v6pkt2; - return(OK); - case BSIM4v6_MOD_PK2 : - value->rValue = model->BSIM4v6pk2; - return(OK); - case BSIM4v6_MOD_PK3: - value->rValue = model->BSIM4v6pk3; - return(OK); - case BSIM4v6_MOD_PK3B: - value->rValue = model->BSIM4v6pk3b; - return(OK); - case BSIM4v6_MOD_PW0: - value->rValue = model->BSIM4v6pw0; - return(OK); - case BSIM4v6_MOD_PLPE0: - value->rValue = model->BSIM4v6plpe0; - return(OK); - case BSIM4v6_MOD_PLPEB: - value->rValue = model->BSIM4v6plpeb; - return(OK); - case BSIM4v6_MOD_PDVTP0: - value->rValue = model->BSIM4v6pdvtp0; - return(OK); - case BSIM4v6_MOD_PDVTP1: - value->rValue = model->BSIM4v6pdvtp1; - return(OK); - case BSIM4v6_MOD_PDVT0 : - value->rValue = model->BSIM4v6pdvt0; - return(OK); - case BSIM4v6_MOD_PDVT1 : - value->rValue = model->BSIM4v6pdvt1; - return(OK); - case BSIM4v6_MOD_PDVT2 : - value->rValue = model->BSIM4v6pdvt2; - return(OK); - case BSIM4v6_MOD_PDVT0W : - value->rValue = model->BSIM4v6pdvt0w; - return(OK); - case BSIM4v6_MOD_PDVT1W : - value->rValue = model->BSIM4v6pdvt1w; - return(OK); - case BSIM4v6_MOD_PDVT2W : - value->rValue = model->BSIM4v6pdvt2w; - return(OK); - case BSIM4v6_MOD_PDROUT : - value->rValue = model->BSIM4v6pdrout; - return(OK); - case BSIM4v6_MOD_PDSUB : - value->rValue = model->BSIM4v6pdsub; - return(OK); - case BSIM4v6_MOD_PVTH0: - value->rValue = model->BSIM4v6pvth0; - return(OK); - case BSIM4v6_MOD_PUA: - value->rValue = model->BSIM4v6pua; - return(OK); - case BSIM4v6_MOD_PUA1: - value->rValue = model->BSIM4v6pua1; - return(OK); - case BSIM4v6_MOD_PUB: - value->rValue = model->BSIM4v6pub; - return(OK); - case BSIM4v6_MOD_PUB1: - value->rValue = model->BSIM4v6pub1; - return(OK); - case BSIM4v6_MOD_PUC: - value->rValue = model->BSIM4v6puc; - return(OK); - case BSIM4v6_MOD_PUC1: - value->rValue = model->BSIM4v6puc1; - return(OK); - case BSIM4v6_MOD_PUD: - value->rValue = model->BSIM4v6pud; - return(OK); - case BSIM4v6_MOD_PUD1: - value->rValue = model->BSIM4v6pud1; - return(OK); - case BSIM4v6_MOD_PUP: - value->rValue = model->BSIM4v6pup; - return(OK); - case BSIM4v6_MOD_PLP: - value->rValue = model->BSIM4v6plp; - return(OK); - case BSIM4v6_MOD_PU0: - value->rValue = model->BSIM4v6pu0; - return(OK); - case BSIM4v6_MOD_PUTE: - value->rValue = model->BSIM4v6pute; - return(OK); - case BSIM4v6_MOD_PUCSTE: - value->rValue = model->BSIM4v6pucste; - return(OK); - case BSIM4v6_MOD_PVOFF: - value->rValue = model->BSIM4v6pvoff; - return(OK); - case BSIM4v6_MOD_PTVOFF: - value->rValue = model->BSIM4v6ptvoff; - return(OK); - case BSIM4v6_MOD_PMINV: - value->rValue = model->BSIM4v6pminv; - return(OK); - case BSIM4v6_MOD_PMINVCV: - value->rValue = model->BSIM4v6pminvcv; - return(OK); - case BSIM4v6_MOD_PFPROUT: - value->rValue = model->BSIM4v6pfprout; - return(OK); - case BSIM4v6_MOD_PPDITS: - value->rValue = model->BSIM4v6ppdits; - return(OK); - case BSIM4v6_MOD_PPDITSD: - value->rValue = model->BSIM4v6ppditsd; - return(OK); - case BSIM4v6_MOD_PDELTA: - value->rValue = model->BSIM4v6pdelta; - return(OK); - case BSIM4v6_MOD_PRDSW: - value->rValue = model->BSIM4v6prdsw; - return(OK); - case BSIM4v6_MOD_PRDW: - value->rValue = model->BSIM4v6prdw; - return(OK); - case BSIM4v6_MOD_PRSW: - value->rValue = model->BSIM4v6prsw; - return(OK); - case BSIM4v6_MOD_PPRWB: - value->rValue = model->BSIM4v6pprwb; - return(OK); - case BSIM4v6_MOD_PPRWG: - value->rValue = model->BSIM4v6pprwg; - return(OK); - case BSIM4v6_MOD_PPRT: - value->rValue = model->BSIM4v6pprt; - return(OK); - case BSIM4v6_MOD_PETA0: - value->rValue = model->BSIM4v6peta0; - return(OK); - case BSIM4v6_MOD_PETAB: - value->rValue = model->BSIM4v6petab; - return(OK); - case BSIM4v6_MOD_PPCLM: - value->rValue = model->BSIM4v6ppclm; - return(OK); - case BSIM4v6_MOD_PPDIBL1: - value->rValue = model->BSIM4v6ppdibl1; - return(OK); - case BSIM4v6_MOD_PPDIBL2: - value->rValue = model->BSIM4v6ppdibl2; - return(OK); - case BSIM4v6_MOD_PPDIBLB: - value->rValue = model->BSIM4v6ppdiblb; - return(OK); - case BSIM4v6_MOD_PPSCBE1: - value->rValue = model->BSIM4v6ppscbe1; - return(OK); - case BSIM4v6_MOD_PPSCBE2: - value->rValue = model->BSIM4v6ppscbe2; - return(OK); - case BSIM4v6_MOD_PPVAG: - value->rValue = model->BSIM4v6ppvag; - return(OK); - case BSIM4v6_MOD_PWR: - value->rValue = model->BSIM4v6pwr; - return(OK); - case BSIM4v6_MOD_PDWG: - value->rValue = model->BSIM4v6pdwg; - return(OK); - case BSIM4v6_MOD_PDWB: - value->rValue = model->BSIM4v6pdwb; - return(OK); - case BSIM4v6_MOD_PB0: - value->rValue = model->BSIM4v6pb0; - return(OK); - case BSIM4v6_MOD_PB1: - value->rValue = model->BSIM4v6pb1; - return(OK); - case BSIM4v6_MOD_PALPHA0: - value->rValue = model->BSIM4v6palpha0; - return(OK); - case BSIM4v6_MOD_PALPHA1: - value->rValue = model->BSIM4v6palpha1; - return(OK); - case BSIM4v6_MOD_PBETA0: - value->rValue = model->BSIM4v6pbeta0; - return(OK); - case BSIM4v6_MOD_PAGIDL: - value->rValue = model->BSIM4v6pagidl; - return(OK); - case BSIM4v6_MOD_PBGIDL: - value->rValue = model->BSIM4v6pbgidl; - return(OK); - case BSIM4v6_MOD_PCGIDL: - value->rValue = model->BSIM4v6pcgidl; - return(OK); - case BSIM4v6_MOD_PEGIDL: - value->rValue = model->BSIM4v6pegidl; - return(OK); - case BSIM4v6_MOD_PAGISL: - value->rValue = model->BSIM4v6pagisl; - return(OK); - case BSIM4v6_MOD_PBGISL: - value->rValue = model->BSIM4v6pbgisl; - return(OK); - case BSIM4v6_MOD_PCGISL: - value->rValue = model->BSIM4v6pcgisl; - return(OK); - case BSIM4v6_MOD_PEGISL: - value->rValue = model->BSIM4v6pegisl; - return(OK); - case BSIM4v6_MOD_PAIGC: - value->rValue = model->BSIM4v6paigc; - return(OK); - case BSIM4v6_MOD_PBIGC: - value->rValue = model->BSIM4v6pbigc; - return(OK); - case BSIM4v6_MOD_PCIGC: - value->rValue = model->BSIM4v6pcigc; - return(OK); - case BSIM4v6_MOD_PAIGSD: - value->rValue = model->BSIM4v6paigsd; - return(OK); - case BSIM4v6_MOD_PBIGSD: - value->rValue = model->BSIM4v6pbigsd; - return(OK); - case BSIM4v6_MOD_PCIGSD: - value->rValue = model->BSIM4v6pcigsd; - return(OK); - case BSIM4v6_MOD_PAIGS: - value->rValue = model->BSIM4v6paigs; - return(OK); - case BSIM4v6_MOD_PBIGS: - value->rValue = model->BSIM4v6pbigs; - return(OK); - case BSIM4v6_MOD_PCIGS: - value->rValue = model->BSIM4v6pcigs; - return(OK); - case BSIM4v6_MOD_PAIGD: - value->rValue = model->BSIM4v6paigd; - return(OK); - case BSIM4v6_MOD_PBIGD: - value->rValue = model->BSIM4v6pbigd; - return(OK); - case BSIM4v6_MOD_PCIGD: - value->rValue = model->BSIM4v6pcigd; - return(OK); - case BSIM4v6_MOD_PAIGBACC: - value->rValue = model->BSIM4v6paigbacc; - return(OK); - case BSIM4v6_MOD_PBIGBACC: - value->rValue = model->BSIM4v6pbigbacc; - return(OK); - case BSIM4v6_MOD_PCIGBACC: - value->rValue = model->BSIM4v6pcigbacc; - return(OK); - case BSIM4v6_MOD_PAIGBINV: - value->rValue = model->BSIM4v6paigbinv; - return(OK); - case BSIM4v6_MOD_PBIGBINV: - value->rValue = model->BSIM4v6pbigbinv; - return(OK); - case BSIM4v6_MOD_PCIGBINV: - value->rValue = model->BSIM4v6pcigbinv; - return(OK); - case BSIM4v6_MOD_PNIGC: - value->rValue = model->BSIM4v6pnigc; - return(OK); - case BSIM4v6_MOD_PNIGBACC: - value->rValue = model->BSIM4v6pnigbacc; - return(OK); - case BSIM4v6_MOD_PNIGBINV: - value->rValue = model->BSIM4v6pnigbinv; - return(OK); - case BSIM4v6_MOD_PNTOX: - value->rValue = model->BSIM4v6pntox; - return(OK); - case BSIM4v6_MOD_PEIGBINV: - value->rValue = model->BSIM4v6peigbinv; - return(OK); - case BSIM4v6_MOD_PPIGCD: - value->rValue = model->BSIM4v6ppigcd; - return(OK); - case BSIM4v6_MOD_PPOXEDGE: - value->rValue = model->BSIM4v6ppoxedge; - return(OK); - case BSIM4v6_MOD_PPHIN: - value->rValue = model->BSIM4v6pphin; - return(OK); - case BSIM4v6_MOD_PXRCRG1: - value->rValue = model->BSIM4v6pxrcrg1; - return(OK); - case BSIM4v6_MOD_PXRCRG2: - value->rValue = model->BSIM4v6pxrcrg2; - return(OK); - case BSIM4v6_MOD_PEU: - value->rValue = model->BSIM4v6peu; - return(OK); - case BSIM4v6_MOD_PUCS: - value->rValue = model->BSIM4v6pucs; - return(OK); - case BSIM4v6_MOD_PVFB: - value->rValue = model->BSIM4v6pvfb; - return(OK); - - case BSIM4v6_MOD_PCGSL: - value->rValue = model->BSIM4v6pcgsl; - return(OK); - case BSIM4v6_MOD_PCGDL: - value->rValue = model->BSIM4v6pcgdl; - return(OK); - case BSIM4v6_MOD_PCKAPPAS: - value->rValue = model->BSIM4v6pckappas; - return(OK); - case BSIM4v6_MOD_PCKAPPAD: - value->rValue = model->BSIM4v6pckappad; - return(OK); - case BSIM4v6_MOD_PCF: - value->rValue = model->BSIM4v6pcf; - return(OK); - case BSIM4v6_MOD_PCLC: - value->rValue = model->BSIM4v6pclc; - return(OK); - case BSIM4v6_MOD_PCLE: - value->rValue = model->BSIM4v6pcle; - return(OK); - case BSIM4v6_MOD_PVFBCV: - value->rValue = model->BSIM4v6pvfbcv; - return(OK); - case BSIM4v6_MOD_PACDE: - value->rValue = model->BSIM4v6pacde; - return(OK); - case BSIM4v6_MOD_PMOIN: - value->rValue = model->BSIM4v6pmoin; - return(OK); - case BSIM4v6_MOD_PNOFF: - value->rValue = model->BSIM4v6pnoff; - return(OK); - case BSIM4v6_MOD_PVOFFCV: - value->rValue = model->BSIM4v6pvoffcv; - return(OK); - case BSIM4v6_MOD_PVFBSDOFF: - value->rValue = model->BSIM4v6pvfbsdoff; - return(OK); - case BSIM4v6_MOD_PTVFBSDOFF: - value->rValue = model->BSIM4v6ptvfbsdoff; - return(OK); - - case BSIM4v6_MOD_TNOM : - value->rValue = model->BSIM4v6tnom; - return(OK); - case BSIM4v6_MOD_CGSO: - value->rValue = model->BSIM4v6cgso; - return(OK); - case BSIM4v6_MOD_CGDO: - value->rValue = model->BSIM4v6cgdo; - return(OK); - case BSIM4v6_MOD_CGBO: - value->rValue = model->BSIM4v6cgbo; - return(OK); - case BSIM4v6_MOD_XPART: - value->rValue = model->BSIM4v6xpart; - return(OK); - case BSIM4v6_MOD_RSH: - value->rValue = model->BSIM4v6sheetResistance; - return(OK); - case BSIM4v6_MOD_JSS: - value->rValue = model->BSIM4v6SjctSatCurDensity; - return(OK); - case BSIM4v6_MOD_JSWS: - value->rValue = model->BSIM4v6SjctSidewallSatCurDensity; - return(OK); - case BSIM4v6_MOD_JSWGS: - value->rValue = model->BSIM4v6SjctGateSidewallSatCurDensity; - return(OK); - case BSIM4v6_MOD_PBS: - value->rValue = model->BSIM4v6SbulkJctPotential; - return(OK); - case BSIM4v6_MOD_MJS: - value->rValue = model->BSIM4v6SbulkJctBotGradingCoeff; - return(OK); - case BSIM4v6_MOD_PBSWS: - value->rValue = model->BSIM4v6SsidewallJctPotential; - return(OK); - case BSIM4v6_MOD_MJSWS: - value->rValue = model->BSIM4v6SbulkJctSideGradingCoeff; - return(OK); - case BSIM4v6_MOD_CJS: - value->rValue = model->BSIM4v6SunitAreaJctCap; - return(OK); - case BSIM4v6_MOD_CJSWS: - value->rValue = model->BSIM4v6SunitLengthSidewallJctCap; - return(OK); - case BSIM4v6_MOD_PBSWGS: - value->rValue = model->BSIM4v6SGatesidewallJctPotential; - return(OK); - case BSIM4v6_MOD_MJSWGS: - value->rValue = model->BSIM4v6SbulkJctGateSideGradingCoeff; - return(OK); - case BSIM4v6_MOD_CJSWGS: - value->rValue = model->BSIM4v6SunitLengthGateSidewallJctCap; - return(OK); - case BSIM4v6_MOD_NJS: - value->rValue = model->BSIM4v6SjctEmissionCoeff; - return(OK); - case BSIM4v6_MOD_XTIS: - value->rValue = model->BSIM4v6SjctTempExponent; - return(OK); - case BSIM4v6_MOD_JSD: - value->rValue = model->BSIM4v6DjctSatCurDensity; - return(OK); - case BSIM4v6_MOD_JSWD: - value->rValue = model->BSIM4v6DjctSidewallSatCurDensity; - return(OK); - case BSIM4v6_MOD_JSWGD: - value->rValue = model->BSIM4v6DjctGateSidewallSatCurDensity; - return(OK); - case BSIM4v6_MOD_PBD: - value->rValue = model->BSIM4v6DbulkJctPotential; - return(OK); - case BSIM4v6_MOD_MJD: - value->rValue = model->BSIM4v6DbulkJctBotGradingCoeff; - return(OK); - case BSIM4v6_MOD_PBSWD: - value->rValue = model->BSIM4v6DsidewallJctPotential; - return(OK); - case BSIM4v6_MOD_MJSWD: - value->rValue = model->BSIM4v6DbulkJctSideGradingCoeff; - return(OK); - case BSIM4v6_MOD_CJD: - value->rValue = model->BSIM4v6DunitAreaJctCap; - return(OK); - case BSIM4v6_MOD_CJSWD: - value->rValue = model->BSIM4v6DunitLengthSidewallJctCap; - return(OK); - case BSIM4v6_MOD_PBSWGD: - value->rValue = model->BSIM4v6DGatesidewallJctPotential; - return(OK); - case BSIM4v6_MOD_MJSWGD: - value->rValue = model->BSIM4v6DbulkJctGateSideGradingCoeff; - return(OK); - case BSIM4v6_MOD_CJSWGD: - value->rValue = model->BSIM4v6DunitLengthGateSidewallJctCap; - return(OK); - case BSIM4v6_MOD_NJD: - value->rValue = model->BSIM4v6DjctEmissionCoeff; - return(OK); - case BSIM4v6_MOD_XTID: - value->rValue = model->BSIM4v6DjctTempExponent; - return(OK); - case BSIM4v6_MOD_LINT: - value->rValue = model->BSIM4v6Lint; - return(OK); - case BSIM4v6_MOD_LL: - value->rValue = model->BSIM4v6Ll; - return(OK); - case BSIM4v6_MOD_LLC: - value->rValue = model->BSIM4v6Llc; - return(OK); - case BSIM4v6_MOD_LLN: - value->rValue = model->BSIM4v6Lln; - return(OK); - case BSIM4v6_MOD_LW: - value->rValue = model->BSIM4v6Lw; - return(OK); - case BSIM4v6_MOD_LWC: - value->rValue = model->BSIM4v6Lwc; - return(OK); - case BSIM4v6_MOD_LWN: - value->rValue = model->BSIM4v6Lwn; - return(OK); - case BSIM4v6_MOD_LWL: - value->rValue = model->BSIM4v6Lwl; - return(OK); - case BSIM4v6_MOD_LWLC: - value->rValue = model->BSIM4v6Lwlc; - return(OK); - case BSIM4v6_MOD_LMIN: - value->rValue = model->BSIM4v6Lmin; - return(OK); - case BSIM4v6_MOD_LMAX: - value->rValue = model->BSIM4v6Lmax; - return(OK); - case BSIM4v6_MOD_WINT: - value->rValue = model->BSIM4v6Wint; - return(OK); - case BSIM4v6_MOD_WL: - value->rValue = model->BSIM4v6Wl; - return(OK); - case BSIM4v6_MOD_WLC: - value->rValue = model->BSIM4v6Wlc; - return(OK); - case BSIM4v6_MOD_WLN: - value->rValue = model->BSIM4v6Wln; - return(OK); - case BSIM4v6_MOD_WW: - value->rValue = model->BSIM4v6Ww; - return(OK); - case BSIM4v6_MOD_WWC: - value->rValue = model->BSIM4v6Wwc; - return(OK); - case BSIM4v6_MOD_WWN: - value->rValue = model->BSIM4v6Wwn; - return(OK); - case BSIM4v6_MOD_WWL: - value->rValue = model->BSIM4v6Wwl; - return(OK); - case BSIM4v6_MOD_WWLC: - value->rValue = model->BSIM4v6Wwlc; - return(OK); - case BSIM4v6_MOD_WMIN: - value->rValue = model->BSIM4v6Wmin; - return(OK); - case BSIM4v6_MOD_WMAX: - value->rValue = model->BSIM4v6Wmax; - return(OK); - - /* stress effect */ - case BSIM4v6_MOD_SAREF: - value->rValue = model->BSIM4v6saref; - return(OK); - case BSIM4v6_MOD_SBREF: - value->rValue = model->BSIM4v6sbref; - return(OK); - case BSIM4v6_MOD_WLOD: - value->rValue = model->BSIM4v6wlod; - return(OK); - case BSIM4v6_MOD_KU0: - value->rValue = model->BSIM4v6ku0; - return(OK); - case BSIM4v6_MOD_KVSAT: - value->rValue = model->BSIM4v6kvsat; - return(OK); - case BSIM4v6_MOD_KVTH0: - value->rValue = model->BSIM4v6kvth0; - return(OK); - case BSIM4v6_MOD_TKU0: - value->rValue = model->BSIM4v6tku0; - return(OK); - case BSIM4v6_MOD_LLODKU0: - value->rValue = model->BSIM4v6llodku0; - return(OK); - case BSIM4v6_MOD_WLODKU0: - value->rValue = model->BSIM4v6wlodku0; - return(OK); - case BSIM4v6_MOD_LLODVTH: - value->rValue = model->BSIM4v6llodvth; - return(OK); - case BSIM4v6_MOD_WLODVTH: - value->rValue = model->BSIM4v6wlodvth; - return(OK); - case BSIM4v6_MOD_LKU0: - value->rValue = model->BSIM4v6lku0; - return(OK); - case BSIM4v6_MOD_WKU0: - value->rValue = model->BSIM4v6wku0; - return(OK); - case BSIM4v6_MOD_PKU0: - value->rValue = model->BSIM4v6pku0; - return(OK); - case BSIM4v6_MOD_LKVTH0: - value->rValue = model->BSIM4v6lkvth0; - return(OK); - case BSIM4v6_MOD_WKVTH0: - value->rValue = model->BSIM4v6wkvth0; - return(OK); - case BSIM4v6_MOD_PKVTH0: - value->rValue = model->BSIM4v6pkvth0; - return(OK); - case BSIM4v6_MOD_STK2: - value->rValue = model->BSIM4v6stk2; - return(OK); - case BSIM4v6_MOD_LODK2: - value->rValue = model->BSIM4v6lodk2; - return(OK); - case BSIM4v6_MOD_STETA0: - value->rValue = model->BSIM4v6steta0; - return(OK); - case BSIM4v6_MOD_LODETA0: - value->rValue = model->BSIM4v6lodeta0; - return(OK); - - /* Well Proximity Effect */ - case BSIM4v6_MOD_WEB: - value->rValue = model->BSIM4v6web; - return(OK); - case BSIM4v6_MOD_WEC: - value->rValue = model->BSIM4v6wec; - return(OK); - case BSIM4v6_MOD_KVTH0WE: - value->rValue = model->BSIM4v6kvth0we; - return(OK); - case BSIM4v6_MOD_K2WE: - value->rValue = model->BSIM4v6k2we; - return(OK); - case BSIM4v6_MOD_KU0WE: - value->rValue = model->BSIM4v6ku0we; - return(OK); - case BSIM4v6_MOD_SCREF: - value->rValue = model->BSIM4v6scref; - return(OK); - case BSIM4v6_MOD_WPEMOD: - value->rValue = model->BSIM4v6wpemod; - return(OK); - case BSIM4v6_MOD_LKVTH0WE: - value->rValue = model->BSIM4v6lkvth0we; - return(OK); - case BSIM4v6_MOD_LK2WE: - value->rValue = model->BSIM4v6lk2we; - return(OK); - case BSIM4v6_MOD_LKU0WE: - value->rValue = model->BSIM4v6lku0we; - return(OK); - case BSIM4v6_MOD_WKVTH0WE: - value->rValue = model->BSIM4v6wkvth0we; - return(OK); - case BSIM4v6_MOD_WK2WE: - value->rValue = model->BSIM4v6wk2we; - return(OK); - case BSIM4v6_MOD_WKU0WE: - value->rValue = model->BSIM4v6wku0we; - return(OK); - case BSIM4v6_MOD_PKVTH0WE: - value->rValue = model->BSIM4v6pkvth0we; - return(OK); - case BSIM4v6_MOD_PK2WE: - value->rValue = model->BSIM4v6pk2we; - return(OK); - case BSIM4v6_MOD_PKU0WE: - value->rValue = model->BSIM4v6pku0we; - return(OK); - - case BSIM4v6_MOD_NOIA: - value->rValue = model->BSIM4v6oxideTrapDensityA; - return(OK); - case BSIM4v6_MOD_NOIB: - value->rValue = model->BSIM4v6oxideTrapDensityB; - return(OK); - case BSIM4v6_MOD_NOIC: - value->rValue = model->BSIM4v6oxideTrapDensityC; - return(OK); - case BSIM4v6_MOD_EM: - value->rValue = model->BSIM4v6em; - return(OK); - case BSIM4v6_MOD_EF: - value->rValue = model->BSIM4v6ef; - return(OK); - case BSIM4v6_MOD_AF: - value->rValue = model->BSIM4v6af; - return(OK); - case BSIM4v6_MOD_KF: - value->rValue = model->BSIM4v6kf; - return(OK); - - case BSIM4v6_MOD_VGS_MAX: - value->rValue = model->BSIM4v6vgsMax; - return(OK); - case BSIM4v6_MOD_VGD_MAX: - value->rValue = model->BSIM4v6vgdMax; - return(OK); - case BSIM4v6_MOD_VGB_MAX: - value->rValue = model->BSIM4v6vgbMax; - return(OK); - case BSIM4v6_MOD_VDS_MAX: - value->rValue = model->BSIM4v6vdsMax; - return(OK); - case BSIM4v6_MOD_VBS_MAX: - value->rValue = model->BSIM4v6vbsMax; - return(OK); - case BSIM4v6_MOD_VBD_MAX: - value->rValue = model->BSIM4v6vbdMax; - return(OK); - case BSIM4v6_MOD_VGSR_MAX: - value->rValue = model->BSIM4v6vgsrMax; - return(OK); - case BSIM4v6_MOD_VGDR_MAX: - value->rValue = model->BSIM4v6vgdrMax; - return(OK); - case BSIM4v6_MOD_VGBR_MAX: - value->rValue = model->BSIM4v6vgbrMax; - return(OK); - case BSIM4v6_MOD_VBSR_MAX: - value->rValue = model->BSIM4v6vbsrMax; - return(OK); - case BSIM4v6_MOD_VBDR_MAX: - value->rValue = model->BSIM4v6vbdrMax; - return(OK); - - default: - return(E_BADPARM); - } - /* NOTREACHED */ -} - - - diff --git a/src/spicelib/devices/bsim4v6/b4v6mdel.c b/src/spicelib/devices/bsim4v6/b4v6mdel.c deleted file mode 100644 index 48f1c36e2..000000000 --- a/src/spicelib/devices/bsim4v6/b4v6mdel.c +++ /dev/null @@ -1,38 +0,0 @@ -/**** BSIM4.6.2 Released by Wenwei Yang 07/31/2008 ****/ - -/********** - * Copyright 2006 Regents of the University of California. All rights reserved. - * File: b4mdel.c of BSIM4.6.2. - * Author: 2000 Weidong Liu - * Authors: 2001- Xuemei Xi, Mohan Dunga, Ali Niknejad, Chenming Hu. - * Authors: 2006- Mohan Dunga, Ali Niknejad, Chenming Hu - * Authors: 2007- Mohan Dunga, Wenwei Yang, Ali Niknejad, Chenming Hu - * Project Director: Prof. Chenming Hu. - **********/ - -#include "ngspice/ngspice.h" -#include "bsim4v6def.h" -#include "ngspice/sperror.h" -#include "ngspice/suffix.h" - - -int -BSIM4v6mDelete(GENmodel *gen_model) -{ - BSIM4v6model *model = (BSIM4v6model *) gen_model; - -#ifdef USE_OMP - FREE(model->BSIM4v6InstanceArray); -#endif - - struct bsim4v6SizeDependParam *p = model->pSizeDependParamKnot; - while (p) { - struct bsim4v6SizeDependParam *next_p = p->pNext; - FREE(p); - p = next_p; - } - - FREE(model->BSIM4v6version); - - return OK; -} diff --git a/src/spicelib/devices/bsim4v6/b4v6mpar.c b/src/spicelib/devices/bsim4v6/b4v6mpar.c deleted file mode 100644 index b2e57efa5..000000000 --- a/src/spicelib/devices/bsim4v6/b4v6mpar.c +++ /dev/null @@ -1,3443 +0,0 @@ -/**** BSIM4.6.2 Released by Wenwei Yang 07/31/2008 ****/ - -/********** - * Copyright 2006 Regents of the University of California. All rights reserved. - * File: b4mpar.c of BSIM4.6.1. - * Author: 2000 Weidong Liu - * Authors: 2001- Xuemei Xi, Mohan Dunga, Ali Niknejad, Chenming Hu. - * Authors: 2006- Mohan Dunga, Ali Niknejad, Chenming Hu - * Authors: 2007- Mohan Dunga, Wenwei Yang, Ali Niknejad, Chenming Hu - * Authors: 2008- Wenwei Yang, Ali Niknejad, Chenming Hu - * Project Director: Prof. Chenming Hu. - * Modified by Xuemei Xi, 04/06/2001. - * Modified by Xuemei Xi, 10/05/2001. - * Modified by Xuemei Xi, 11/15/2002. - * Modified by Xuemei Xi, 05/09/2003. - * Modified by Xuemei Xi, 03/04/2004. - * Modified by Xuemei Xi, Mohan Dunga, 07/29/2005. - * Modified by Mohan Dunga, 12/13/2006 - * Modified by Mohan Dunga, Wenwei Yang, 05/18/2007. - * Modified by Wenwei Yang, 07/31/2008. - **********/ - -#include "ngspice/ngspice.h" -#include "bsim4v6def.h" -#include "ngspice/ifsim.h" -#include "ngspice/sperror.h" -#include "ngspice/suffix.h" -#include "ngspice/const.h" - -int -BSIM4v6mParam( -int param, -IFvalue *value, -GENmodel *inMod) -{ - BSIM4v6model *mod = (BSIM4v6model*)inMod; - switch(param) - { case BSIM4v6_MOD_MOBMOD : - mod->BSIM4v6mobMod = value->iValue; - mod->BSIM4v6mobModGiven = TRUE; - break; - case BSIM4v6_MOD_BINUNIT : - mod->BSIM4v6binUnit = value->iValue; - mod->BSIM4v6binUnitGiven = TRUE; - break; - case BSIM4v6_MOD_PARAMCHK : - mod->BSIM4v6paramChk = value->iValue; - mod->BSIM4v6paramChkGiven = TRUE; - break; - case BSIM4v6_MOD_CVCHARGEMOD : - mod->BSIM4v6cvchargeMod = value->iValue; - mod->BSIM4v6cvchargeModGiven = TRUE; - break; - case BSIM4v6_MOD_CAPMOD : - mod->BSIM4v6capMod = value->iValue; - mod->BSIM4v6capModGiven = TRUE; - break; - case BSIM4v6_MOD_DIOMOD : - mod->BSIM4v6dioMod = value->iValue; - mod->BSIM4v6dioModGiven = TRUE; - break; - case BSIM4v6_MOD_RDSMOD : - mod->BSIM4v6rdsMod = value->iValue; - mod->BSIM4v6rdsModGiven = TRUE; - break; - case BSIM4v6_MOD_TRNQSMOD : - mod->BSIM4v6trnqsMod = value->iValue; - mod->BSIM4v6trnqsModGiven = TRUE; - break; - case BSIM4v6_MOD_ACNQSMOD : - mod->BSIM4v6acnqsMod = value->iValue; - mod->BSIM4v6acnqsModGiven = TRUE; - break; - case BSIM4v6_MOD_RBODYMOD : - mod->BSIM4v6rbodyMod = value->iValue; - mod->BSIM4v6rbodyModGiven = TRUE; - break; - case BSIM4v6_MOD_RGATEMOD : - mod->BSIM4v6rgateMod = value->iValue; - mod->BSIM4v6rgateModGiven = TRUE; - break; - case BSIM4v6_MOD_PERMOD : - mod->BSIM4v6perMod = value->iValue; - mod->BSIM4v6perModGiven = TRUE; - break; - case BSIM4v6_MOD_GEOMOD : - mod->BSIM4v6geoMod = value->iValue; - mod->BSIM4v6geoModGiven = TRUE; - break; - case BSIM4v6_MOD_RGEOMOD : - mod->BSIM4v6rgeoMod = value->iValue; - mod->BSIM4v6rgeoModGiven = TRUE; - break; - case BSIM4v6_MOD_FNOIMOD : - mod->BSIM4v6fnoiMod = value->iValue; - mod->BSIM4v6fnoiModGiven = TRUE; - break; - case BSIM4v6_MOD_TNOIMOD : - mod->BSIM4v6tnoiMod = value->iValue; - mod->BSIM4v6tnoiModGiven = TRUE; - break; - case BSIM4v6_MOD_MTRLMOD : - mod->BSIM4v6mtrlMod = value->iValue; - mod->BSIM4v6mtrlModGiven = TRUE; - break; - case BSIM4v6_MOD_IGCMOD : - mod->BSIM4v6igcMod = value->iValue; - mod->BSIM4v6igcModGiven = TRUE; - break; - case BSIM4v6_MOD_IGBMOD : - mod->BSIM4v6igbMod = value->iValue; - mod->BSIM4v6igbModGiven = TRUE; - break; - case BSIM4v6_MOD_TEMPMOD : - mod->BSIM4v6tempMod = value->iValue; - mod->BSIM4v6tempModGiven = TRUE; - break; - - case BSIM4v6_MOD_VERSION : - mod->BSIM4v6version = value->sValue; - mod->BSIM4v6versionGiven = TRUE; - break; - case BSIM4v6_MOD_TOXREF : - mod->BSIM4v6toxref = value->rValue; - mod->BSIM4v6toxrefGiven = TRUE; - break; - case BSIM4v6_MOD_EOT : - mod->BSIM4v6eot = value->rValue; - mod->BSIM4v6eotGiven = TRUE; - break; - case BSIM4v6_MOD_VDDEOT : - mod->BSIM4v6vddeot = value->rValue; - mod->BSIM4v6vddeotGiven = TRUE; - break; - case BSIM4v6_MOD_TEMPEOT : - mod->BSIM4v6tempeot = value->rValue; - mod->BSIM4v6tempeotGiven = TRUE; - break; - case BSIM4v6_MOD_LEFFEOT : - mod->BSIM4v6leffeot = value->rValue; - mod->BSIM4v6leffeotGiven = TRUE; - break; - case BSIM4v6_MOD_WEFFEOT : - mod->BSIM4v6weffeot = value->rValue; - mod->BSIM4v6weffeotGiven = TRUE; - break; - case BSIM4v6_MOD_ADOS : - mod->BSIM4v6ados = value->rValue; - mod->BSIM4v6adosGiven = TRUE; - break; - case BSIM4v6_MOD_BDOS : - mod->BSIM4v6bdos = value->rValue; - mod->BSIM4v6bdosGiven = TRUE; - break; - case BSIM4v6_MOD_TOXE : - mod->BSIM4v6toxe = value->rValue; - mod->BSIM4v6toxeGiven = TRUE; - break; - case BSIM4v6_MOD_TOXP : - mod->BSIM4v6toxp = value->rValue; - mod->BSIM4v6toxpGiven = TRUE; - break; - case BSIM4v6_MOD_TOXM : - mod->BSIM4v6toxm = value->rValue; - mod->BSIM4v6toxmGiven = TRUE; - break; - case BSIM4v6_MOD_DTOX : - mod->BSIM4v6dtox = value->rValue; - mod->BSIM4v6dtoxGiven = TRUE; - break; - case BSIM4v6_MOD_EPSROX : - mod->BSIM4v6epsrox = value->rValue; - mod->BSIM4v6epsroxGiven = TRUE; - break; - - case BSIM4v6_MOD_CDSC : - mod->BSIM4v6cdsc = value->rValue; - mod->BSIM4v6cdscGiven = TRUE; - break; - case BSIM4v6_MOD_CDSCB : - mod->BSIM4v6cdscb = value->rValue; - mod->BSIM4v6cdscbGiven = TRUE; - break; - - case BSIM4v6_MOD_CDSCD : - mod->BSIM4v6cdscd = value->rValue; - mod->BSIM4v6cdscdGiven = TRUE; - break; - - case BSIM4v6_MOD_CIT : - mod->BSIM4v6cit = value->rValue; - mod->BSIM4v6citGiven = TRUE; - break; - case BSIM4v6_MOD_NFACTOR : - mod->BSIM4v6nfactor = value->rValue; - mod->BSIM4v6nfactorGiven = TRUE; - break; - case BSIM4v6_MOD_XJ: - mod->BSIM4v6xj = value->rValue; - mod->BSIM4v6xjGiven = TRUE; - break; - case BSIM4v6_MOD_VSAT: - mod->BSIM4v6vsat = value->rValue; - mod->BSIM4v6vsatGiven = TRUE; - break; - case BSIM4v6_MOD_A0: - mod->BSIM4v6a0 = value->rValue; - mod->BSIM4v6a0Given = TRUE; - break; - - case BSIM4v6_MOD_AGS: - mod->BSIM4v6ags= value->rValue; - mod->BSIM4v6agsGiven = TRUE; - break; - - case BSIM4v6_MOD_A1: - mod->BSIM4v6a1 = value->rValue; - mod->BSIM4v6a1Given = TRUE; - break; - case BSIM4v6_MOD_A2: - mod->BSIM4v6a2 = value->rValue; - mod->BSIM4v6a2Given = TRUE; - break; - case BSIM4v6_MOD_AT: - mod->BSIM4v6at = value->rValue; - mod->BSIM4v6atGiven = TRUE; - break; - case BSIM4v6_MOD_KETA: - mod->BSIM4v6keta = value->rValue; - mod->BSIM4v6ketaGiven = TRUE; - break; - case BSIM4v6_MOD_NSUB: - mod->BSIM4v6nsub = value->rValue; - mod->BSIM4v6nsubGiven = TRUE; - break; - case BSIM4v6_MOD_PHIG: - mod->BSIM4v6phig = value->rValue; - mod->BSIM4v6phigGiven = TRUE; - break; - case BSIM4v6_MOD_EPSRGATE: - mod->BSIM4v6epsrgate = value->rValue; - mod->BSIM4v6epsrgateGiven = TRUE; - break; - case BSIM4v6_MOD_EASUB: - mod->BSIM4v6easub = value->rValue; - mod->BSIM4v6easubGiven = TRUE; - break; - case BSIM4v6_MOD_EPSRSUB: - mod->BSIM4v6epsrsub = value->rValue; - mod->BSIM4v6epsrsubGiven = TRUE; - break; - case BSIM4v6_MOD_NI0SUB: - mod->BSIM4v6ni0sub = value->rValue; - mod->BSIM4v6ni0subGiven = TRUE; - break; - case BSIM4v6_MOD_BG0SUB: - mod->BSIM4v6bg0sub = value->rValue; - mod->BSIM4v6bg0subGiven = TRUE; - break; - case BSIM4v6_MOD_TBGASUB: - mod->BSIM4v6tbgasub = value->rValue; - mod->BSIM4v6tbgasubGiven = TRUE; - break; - case BSIM4v6_MOD_TBGBSUB: - mod->BSIM4v6tbgbsub = value->rValue; - mod->BSIM4v6tbgbsubGiven = TRUE; - break; - case BSIM4v6_MOD_NDEP: - mod->BSIM4v6ndep = value->rValue; - mod->BSIM4v6ndepGiven = TRUE; - if (mod->BSIM4v6ndep > 1.0e20) - mod->BSIM4v6ndep *= 1.0e-6; - break; - case BSIM4v6_MOD_NSD: - mod->BSIM4v6nsd = value->rValue; - mod->BSIM4v6nsdGiven = TRUE; - if (mod->BSIM4v6nsd > 1.000001e24) - mod->BSIM4v6nsd *= 1.0e-6; - break; - case BSIM4v6_MOD_NGATE: - mod->BSIM4v6ngate = value->rValue; - mod->BSIM4v6ngateGiven = TRUE; - if (mod->BSIM4v6ngate > 1.000001e24) - mod->BSIM4v6ngate *= 1.0e-6; - break; - case BSIM4v6_MOD_GAMMA1: - mod->BSIM4v6gamma1 = value->rValue; - mod->BSIM4v6gamma1Given = TRUE; - break; - case BSIM4v6_MOD_GAMMA2: - mod->BSIM4v6gamma2 = value->rValue; - mod->BSIM4v6gamma2Given = TRUE; - break; - case BSIM4v6_MOD_VBX: - mod->BSIM4v6vbx = value->rValue; - mod->BSIM4v6vbxGiven = TRUE; - break; - case BSIM4v6_MOD_VBM: - mod->BSIM4v6vbm = value->rValue; - mod->BSIM4v6vbmGiven = TRUE; - break; - case BSIM4v6_MOD_XT: - mod->BSIM4v6xt = value->rValue; - mod->BSIM4v6xtGiven = TRUE; - break; - case BSIM4v6_MOD_K1: - mod->BSIM4v6k1 = value->rValue; - mod->BSIM4v6k1Given = TRUE; - break; - case BSIM4v6_MOD_KT1: - mod->BSIM4v6kt1 = value->rValue; - mod->BSIM4v6kt1Given = TRUE; - break; - case BSIM4v6_MOD_KT1L: - mod->BSIM4v6kt1l = value->rValue; - mod->BSIM4v6kt1lGiven = TRUE; - break; - case BSIM4v6_MOD_KT2: - mod->BSIM4v6kt2 = value->rValue; - mod->BSIM4v6kt2Given = TRUE; - break; - case BSIM4v6_MOD_K2: - mod->BSIM4v6k2 = value->rValue; - mod->BSIM4v6k2Given = TRUE; - break; - case BSIM4v6_MOD_K3: - mod->BSIM4v6k3 = value->rValue; - mod->BSIM4v6k3Given = TRUE; - break; - case BSIM4v6_MOD_K3B: - mod->BSIM4v6k3b = value->rValue; - mod->BSIM4v6k3bGiven = TRUE; - break; - case BSIM4v6_MOD_LPE0: - mod->BSIM4v6lpe0 = value->rValue; - mod->BSIM4v6lpe0Given = TRUE; - break; - case BSIM4v6_MOD_LPEB: - mod->BSIM4v6lpeb = value->rValue; - mod->BSIM4v6lpebGiven = TRUE; - break; - case BSIM4v6_MOD_DVTP0: - mod->BSIM4v6dvtp0 = value->rValue; - mod->BSIM4v6dvtp0Given = TRUE; - break; - case BSIM4v6_MOD_DVTP1: - mod->BSIM4v6dvtp1 = value->rValue; - mod->BSIM4v6dvtp1Given = TRUE; - break; - case BSIM4v6_MOD_W0: - mod->BSIM4v6w0 = value->rValue; - mod->BSIM4v6w0Given = TRUE; - break; - case BSIM4v6_MOD_DVT0: - mod->BSIM4v6dvt0 = value->rValue; - mod->BSIM4v6dvt0Given = TRUE; - break; - case BSIM4v6_MOD_DVT1: - mod->BSIM4v6dvt1 = value->rValue; - mod->BSIM4v6dvt1Given = TRUE; - break; - case BSIM4v6_MOD_DVT2: - mod->BSIM4v6dvt2 = value->rValue; - mod->BSIM4v6dvt2Given = TRUE; - break; - case BSIM4v6_MOD_DVT0W: - mod->BSIM4v6dvt0w = value->rValue; - mod->BSIM4v6dvt0wGiven = TRUE; - break; - case BSIM4v6_MOD_DVT1W: - mod->BSIM4v6dvt1w = value->rValue; - mod->BSIM4v6dvt1wGiven = TRUE; - break; - case BSIM4v6_MOD_DVT2W: - mod->BSIM4v6dvt2w = value->rValue; - mod->BSIM4v6dvt2wGiven = TRUE; - break; - case BSIM4v6_MOD_DROUT: - mod->BSIM4v6drout = value->rValue; - mod->BSIM4v6droutGiven = TRUE; - break; - case BSIM4v6_MOD_DSUB: - mod->BSIM4v6dsub = value->rValue; - mod->BSIM4v6dsubGiven = TRUE; - break; - case BSIM4v6_MOD_VTH0: - mod->BSIM4v6vth0 = value->rValue; - mod->BSIM4v6vth0Given = TRUE; - break; - case BSIM4v6_MOD_EU: - mod->BSIM4v6eu = value->rValue; - mod->BSIM4v6euGiven = TRUE; - break; - case BSIM4v6_MOD_UCS: - mod->BSIM4v6ucs = value->rValue; - mod->BSIM4v6ucsGiven = TRUE; - break; - case BSIM4v6_MOD_UA: - mod->BSIM4v6ua = value->rValue; - mod->BSIM4v6uaGiven = TRUE; - break; - case BSIM4v6_MOD_UA1: - mod->BSIM4v6ua1 = value->rValue; - mod->BSIM4v6ua1Given = TRUE; - break; - case BSIM4v6_MOD_UB: - mod->BSIM4v6ub = value->rValue; - mod->BSIM4v6ubGiven = TRUE; - break; - case BSIM4v6_MOD_UB1: - mod->BSIM4v6ub1 = value->rValue; - mod->BSIM4v6ub1Given = TRUE; - break; - case BSIM4v6_MOD_UC: - mod->BSIM4v6uc = value->rValue; - mod->BSIM4v6ucGiven = TRUE; - break; - case BSIM4v6_MOD_UC1: - mod->BSIM4v6uc1 = value->rValue; - mod->BSIM4v6uc1Given = TRUE; - break; - case BSIM4v6_MOD_U0 : - mod->BSIM4v6u0 = value->rValue; - mod->BSIM4v6u0Given = TRUE; - break; - case BSIM4v6_MOD_UTE : - mod->BSIM4v6ute = value->rValue; - mod->BSIM4v6uteGiven = TRUE; - break; - case BSIM4v6_MOD_UCSTE : - mod->BSIM4v6ucste = value->rValue; - mod->BSIM4v6ucsteGiven = TRUE; - break; - case BSIM4v6_MOD_UD: - mod->BSIM4v6ud = value->rValue; - mod->BSIM4v6udGiven = TRUE; - break; - case BSIM4v6_MOD_UD1: - mod->BSIM4v6ud1 = value->rValue; - mod->BSIM4v6ud1Given = TRUE; - break; - case BSIM4v6_MOD_UP: - mod->BSIM4v6up = value->rValue; - mod->BSIM4v6upGiven = TRUE; - break; - case BSIM4v6_MOD_LP: - mod->BSIM4v6lp = value->rValue; - mod->BSIM4v6lpGiven = TRUE; - break; - case BSIM4v6_MOD_LUD: - mod->BSIM4v6lud = value->rValue; - mod->BSIM4v6ludGiven = TRUE; - break; - case BSIM4v6_MOD_LUD1: - mod->BSIM4v6lud1 = value->rValue; - mod->BSIM4v6lud1Given = TRUE; - break; - case BSIM4v6_MOD_LUP: - mod->BSIM4v6lup = value->rValue; - mod->BSIM4v6lupGiven = TRUE; - break; - case BSIM4v6_MOD_LLP: - mod->BSIM4v6llp = value->rValue; - mod->BSIM4v6llpGiven = TRUE; - break; - case BSIM4v6_MOD_WUD: - mod->BSIM4v6wud = value->rValue; - mod->BSIM4v6wudGiven = TRUE; - break; - case BSIM4v6_MOD_WUD1: - mod->BSIM4v6wud1 = value->rValue; - mod->BSIM4v6wud1Given = TRUE; - break; - case BSIM4v6_MOD_WUP: - mod->BSIM4v6wup = value->rValue; - mod->BSIM4v6wupGiven = TRUE; - break; - case BSIM4v6_MOD_WLP: - mod->BSIM4v6wlp = value->rValue; - mod->BSIM4v6wlpGiven = TRUE; - break; - case BSIM4v6_MOD_PUD: - mod->BSIM4v6pud = value->rValue; - mod->BSIM4v6pudGiven = TRUE; - break; - case BSIM4v6_MOD_PUD1: - mod->BSIM4v6pud1 = value->rValue; - mod->BSIM4v6pud1Given = TRUE; - break; - case BSIM4v6_MOD_PUP: - mod->BSIM4v6pup = value->rValue; - mod->BSIM4v6pupGiven = TRUE; - break; - case BSIM4v6_MOD_PLP: - mod->BSIM4v6plp = value->rValue; - mod->BSIM4v6plpGiven = TRUE; - break; - - - case BSIM4v6_MOD_VOFF: - mod->BSIM4v6voff = value->rValue; - mod->BSIM4v6voffGiven = TRUE; - break; - case BSIM4v6_MOD_TVOFF: - mod->BSIM4v6tvoff = value->rValue; - mod->BSIM4v6tvoffGiven = TRUE; - break; - case BSIM4v6_MOD_VOFFL: - mod->BSIM4v6voffl = value->rValue; - mod->BSIM4v6vofflGiven = TRUE; - break; - case BSIM4v6_MOD_VOFFCVL: - mod->BSIM4v6voffcvl = value->rValue; - mod->BSIM4v6voffcvlGiven = TRUE; - break; - case BSIM4v6_MOD_MINV: - mod->BSIM4v6minv = value->rValue; - mod->BSIM4v6minvGiven = TRUE; - break; - case BSIM4v6_MOD_MINVCV: - mod->BSIM4v6minvcv = value->rValue; - mod->BSIM4v6minvcvGiven = TRUE; - break; - case BSIM4v6_MOD_FPROUT: - mod->BSIM4v6fprout = value->rValue; - mod->BSIM4v6fproutGiven = TRUE; - break; - case BSIM4v6_MOD_PDITS: - mod->BSIM4v6pdits = value->rValue; - mod->BSIM4v6pditsGiven = TRUE; - break; - case BSIM4v6_MOD_PDITSD: - mod->BSIM4v6pditsd = value->rValue; - mod->BSIM4v6pditsdGiven = TRUE; - break; - case BSIM4v6_MOD_PDITSL: - mod->BSIM4v6pditsl = value->rValue; - mod->BSIM4v6pditslGiven = TRUE; - break; - case BSIM4v6_MOD_DELTA : - mod->BSIM4v6delta = value->rValue; - mod->BSIM4v6deltaGiven = TRUE; - break; - case BSIM4v6_MOD_RDSW: - mod->BSIM4v6rdsw = value->rValue; - mod->BSIM4v6rdswGiven = TRUE; - break; - case BSIM4v6_MOD_RDSWMIN: - mod->BSIM4v6rdswmin = value->rValue; - mod->BSIM4v6rdswminGiven = TRUE; - break; - case BSIM4v6_MOD_RDWMIN: - mod->BSIM4v6rdwmin = value->rValue; - mod->BSIM4v6rdwminGiven = TRUE; - break; - case BSIM4v6_MOD_RSWMIN: - mod->BSIM4v6rswmin = value->rValue; - mod->BSIM4v6rswminGiven = TRUE; - break; - case BSIM4v6_MOD_RDW: - mod->BSIM4v6rdw = value->rValue; - mod->BSIM4v6rdwGiven = TRUE; - break; - case BSIM4v6_MOD_RSW: - mod->BSIM4v6rsw = value->rValue; - mod->BSIM4v6rswGiven = TRUE; - break; - case BSIM4v6_MOD_PRWG: - mod->BSIM4v6prwg = value->rValue; - mod->BSIM4v6prwgGiven = TRUE; - break; - case BSIM4v6_MOD_PRWB: - mod->BSIM4v6prwb = value->rValue; - mod->BSIM4v6prwbGiven = TRUE; - break; - case BSIM4v6_MOD_PRT: - mod->BSIM4v6prt = value->rValue; - mod->BSIM4v6prtGiven = TRUE; - break; - case BSIM4v6_MOD_ETA0: - mod->BSIM4v6eta0 = value->rValue; - mod->BSIM4v6eta0Given = TRUE; - break; - case BSIM4v6_MOD_ETAB: - mod->BSIM4v6etab = value->rValue; - mod->BSIM4v6etabGiven = TRUE; - break; - case BSIM4v6_MOD_PCLM: - mod->BSIM4v6pclm = value->rValue; - mod->BSIM4v6pclmGiven = TRUE; - break; - case BSIM4v6_MOD_PDIBL1: - mod->BSIM4v6pdibl1 = value->rValue; - mod->BSIM4v6pdibl1Given = TRUE; - break; - case BSIM4v6_MOD_PDIBL2: - mod->BSIM4v6pdibl2 = value->rValue; - mod->BSIM4v6pdibl2Given = TRUE; - break; - case BSIM4v6_MOD_PDIBLB: - mod->BSIM4v6pdiblb = value->rValue; - mod->BSIM4v6pdiblbGiven = TRUE; - break; - case BSIM4v6_MOD_PSCBE1: - mod->BSIM4v6pscbe1 = value->rValue; - mod->BSIM4v6pscbe1Given = TRUE; - break; - case BSIM4v6_MOD_PSCBE2: - mod->BSIM4v6pscbe2 = value->rValue; - mod->BSIM4v6pscbe2Given = TRUE; - break; - case BSIM4v6_MOD_PVAG: - mod->BSIM4v6pvag = value->rValue; - mod->BSIM4v6pvagGiven = TRUE; - break; - case BSIM4v6_MOD_WR : - mod->BSIM4v6wr = value->rValue; - mod->BSIM4v6wrGiven = TRUE; - break; - case BSIM4v6_MOD_DWG : - mod->BSIM4v6dwg = value->rValue; - mod->BSIM4v6dwgGiven = TRUE; - break; - case BSIM4v6_MOD_DWB : - mod->BSIM4v6dwb = value->rValue; - mod->BSIM4v6dwbGiven = TRUE; - break; - case BSIM4v6_MOD_B0 : - mod->BSIM4v6b0 = value->rValue; - mod->BSIM4v6b0Given = TRUE; - break; - case BSIM4v6_MOD_B1 : - mod->BSIM4v6b1 = value->rValue; - mod->BSIM4v6b1Given = TRUE; - break; - case BSIM4v6_MOD_ALPHA0 : - mod->BSIM4v6alpha0 = value->rValue; - mod->BSIM4v6alpha0Given = TRUE; - break; - case BSIM4v6_MOD_ALPHA1 : - mod->BSIM4v6alpha1 = value->rValue; - mod->BSIM4v6alpha1Given = TRUE; - break; - case BSIM4v6_MOD_PHIN : - mod->BSIM4v6phin = value->rValue; - mod->BSIM4v6phinGiven = TRUE; - break; - case BSIM4v6_MOD_AGIDL : - mod->BSIM4v6agidl = value->rValue; - mod->BSIM4v6agidlGiven = TRUE; - break; - case BSIM4v6_MOD_BGIDL : - mod->BSIM4v6bgidl = value->rValue; - mod->BSIM4v6bgidlGiven = TRUE; - break; - case BSIM4v6_MOD_CGIDL : - mod->BSIM4v6cgidl = value->rValue; - mod->BSIM4v6cgidlGiven = TRUE; - break; - case BSIM4v6_MOD_EGIDL : - mod->BSIM4v6egidl = value->rValue; - mod->BSIM4v6egidlGiven = TRUE; - break; - case BSIM4v6_MOD_AGISL : - mod->BSIM4v6agisl = value->rValue; - mod->BSIM4v6agislGiven = TRUE; - break; - case BSIM4v6_MOD_BGISL : - mod->BSIM4v6bgisl = value->rValue; - mod->BSIM4v6bgislGiven = TRUE; - break; - case BSIM4v6_MOD_CGISL : - mod->BSIM4v6cgisl = value->rValue; - mod->BSIM4v6cgislGiven = TRUE; - break; - case BSIM4v6_MOD_EGISL : - mod->BSIM4v6egisl = value->rValue; - mod->BSIM4v6egislGiven = TRUE; - break; - case BSIM4v6_MOD_AIGC : - mod->BSIM4v6aigc = value->rValue; - mod->BSIM4v6aigcGiven = TRUE; - break; - case BSIM4v6_MOD_BIGC : - mod->BSIM4v6bigc = value->rValue; - mod->BSIM4v6bigcGiven = TRUE; - break; - case BSIM4v6_MOD_CIGC : - mod->BSIM4v6cigc = value->rValue; - mod->BSIM4v6cigcGiven = TRUE; - break; - case BSIM4v6_MOD_AIGSD : - mod->BSIM4v6aigsd = value->rValue; - mod->BSIM4v6aigsdGiven = TRUE; - break; - case BSIM4v6_MOD_BIGSD : - mod->BSIM4v6bigsd = value->rValue; - mod->BSIM4v6bigsdGiven = TRUE; - break; - case BSIM4v6_MOD_CIGSD : - mod->BSIM4v6cigsd = value->rValue; - mod->BSIM4v6cigsdGiven = TRUE; - break; - case BSIM4v6_MOD_AIGS : - mod->BSIM4v6aigs = value->rValue; - mod->BSIM4v6aigsGiven = TRUE; - break; - case BSIM4v6_MOD_BIGS : - mod->BSIM4v6bigs = value->rValue; - mod->BSIM4v6bigsGiven = TRUE; - break; - case BSIM4v6_MOD_CIGS : - mod->BSIM4v6cigs = value->rValue; - mod->BSIM4v6cigsGiven = TRUE; - break; - case BSIM4v6_MOD_AIGD : - mod->BSIM4v6aigd = value->rValue; - mod->BSIM4v6aigdGiven = TRUE; - break; - case BSIM4v6_MOD_BIGD : - mod->BSIM4v6bigd = value->rValue; - mod->BSIM4v6bigdGiven = TRUE; - break; - case BSIM4v6_MOD_CIGD : - mod->BSIM4v6cigd = value->rValue; - mod->BSIM4v6cigdGiven = TRUE; - break; - case BSIM4v6_MOD_AIGBACC : - mod->BSIM4v6aigbacc = value->rValue; - mod->BSIM4v6aigbaccGiven = TRUE; - break; - case BSIM4v6_MOD_BIGBACC : - mod->BSIM4v6bigbacc = value->rValue; - mod->BSIM4v6bigbaccGiven = TRUE; - break; - case BSIM4v6_MOD_CIGBACC : - mod->BSIM4v6cigbacc = value->rValue; - mod->BSIM4v6cigbaccGiven = TRUE; - break; - case BSIM4v6_MOD_AIGBINV : - mod->BSIM4v6aigbinv = value->rValue; - mod->BSIM4v6aigbinvGiven = TRUE; - break; - case BSIM4v6_MOD_BIGBINV : - mod->BSIM4v6bigbinv = value->rValue; - mod->BSIM4v6bigbinvGiven = TRUE; - break; - case BSIM4v6_MOD_CIGBINV : - mod->BSIM4v6cigbinv = value->rValue; - mod->BSIM4v6cigbinvGiven = TRUE; - break; - case BSIM4v6_MOD_NIGC : - mod->BSIM4v6nigc = value->rValue; - mod->BSIM4v6nigcGiven = TRUE; - break; - case BSIM4v6_MOD_NIGBINV : - mod->BSIM4v6nigbinv = value->rValue; - mod->BSIM4v6nigbinvGiven = TRUE; - break; - case BSIM4v6_MOD_NIGBACC : - mod->BSIM4v6nigbacc = value->rValue; - mod->BSIM4v6nigbaccGiven = TRUE; - break; - case BSIM4v6_MOD_NTOX : - mod->BSIM4v6ntox = value->rValue; - mod->BSIM4v6ntoxGiven = TRUE; - break; - case BSIM4v6_MOD_EIGBINV : - mod->BSIM4v6eigbinv = value->rValue; - mod->BSIM4v6eigbinvGiven = TRUE; - break; - case BSIM4v6_MOD_PIGCD : - mod->BSIM4v6pigcd = value->rValue; - mod->BSIM4v6pigcdGiven = TRUE; - break; - case BSIM4v6_MOD_POXEDGE : - mod->BSIM4v6poxedge = value->rValue; - mod->BSIM4v6poxedgeGiven = TRUE; - break; - case BSIM4v6_MOD_XRCRG1 : - mod->BSIM4v6xrcrg1 = value->rValue; - mod->BSIM4v6xrcrg1Given = TRUE; - break; - case BSIM4v6_MOD_XRCRG2 : - mod->BSIM4v6xrcrg2 = value->rValue; - mod->BSIM4v6xrcrg2Given = TRUE; - break; - case BSIM4v6_MOD_LAMBDA : - mod->BSIM4v6lambda = value->rValue; - mod->BSIM4v6lambdaGiven = TRUE; - break; - case BSIM4v6_MOD_VTL : - mod->BSIM4v6vtl = value->rValue; - mod->BSIM4v6vtlGiven = TRUE; - break; - case BSIM4v6_MOD_XN: - mod->BSIM4v6xn = value->rValue; - mod->BSIM4v6xnGiven = TRUE; - break; - case BSIM4v6_MOD_LC: - mod->BSIM4v6lc = value->rValue; - mod->BSIM4v6lcGiven = TRUE; - break; - case BSIM4v6_MOD_TNOIA : - mod->BSIM4v6tnoia = value->rValue; - mod->BSIM4v6tnoiaGiven = TRUE; - break; - case BSIM4v6_MOD_TNOIB : - mod->BSIM4v6tnoib = value->rValue; - mod->BSIM4v6tnoibGiven = TRUE; - break; - case BSIM4v6_MOD_RNOIA : - mod->BSIM4v6rnoia = value->rValue; - mod->BSIM4v6rnoiaGiven = TRUE; - break; - case BSIM4v6_MOD_RNOIB : - mod->BSIM4v6rnoib = value->rValue; - mod->BSIM4v6rnoibGiven = TRUE; - break; - case BSIM4v6_MOD_NTNOI : - mod->BSIM4v6ntnoi = value->rValue; - mod->BSIM4v6ntnoiGiven = TRUE; - break; - case BSIM4v6_MOD_VFBSDOFF: - mod->BSIM4v6vfbsdoff = value->rValue; - mod->BSIM4v6vfbsdoffGiven = TRUE; - break; - case BSIM4v6_MOD_TVFBSDOFF: - mod->BSIM4v6tvfbsdoff = value->rValue; - mod->BSIM4v6tvfbsdoffGiven = TRUE; - break; - case BSIM4v6_MOD_LINTNOI: - mod->BSIM4v6lintnoi = value->rValue; - mod->BSIM4v6lintnoiGiven = TRUE; - break; - - /* stress effect */ - case BSIM4v6_MOD_SAREF : - mod->BSIM4v6saref = value->rValue; - mod->BSIM4v6sarefGiven = TRUE; - break; - case BSIM4v6_MOD_SBREF : - mod->BSIM4v6sbref = value->rValue; - mod->BSIM4v6sbrefGiven = TRUE; - break; - case BSIM4v6_MOD_WLOD : - mod->BSIM4v6wlod = value->rValue; - mod->BSIM4v6wlodGiven = TRUE; - break; - case BSIM4v6_MOD_KU0 : - mod->BSIM4v6ku0 = value->rValue; - mod->BSIM4v6ku0Given = TRUE; - break; - case BSIM4v6_MOD_KVSAT : - mod->BSIM4v6kvsat = value->rValue; - mod->BSIM4v6kvsatGiven = TRUE; - break; - case BSIM4v6_MOD_KVTH0 : - mod->BSIM4v6kvth0 = value->rValue; - mod->BSIM4v6kvth0Given = TRUE; - break; - case BSIM4v6_MOD_TKU0 : - mod->BSIM4v6tku0 = value->rValue; - mod->BSIM4v6tku0Given = TRUE; - break; - case BSIM4v6_MOD_LLODKU0 : - mod->BSIM4v6llodku0 = value->rValue; - mod->BSIM4v6llodku0Given = TRUE; - break; - case BSIM4v6_MOD_WLODKU0 : - mod->BSIM4v6wlodku0 = value->rValue; - mod->BSIM4v6wlodku0Given = TRUE; - break; - case BSIM4v6_MOD_LLODVTH : - mod->BSIM4v6llodvth = value->rValue; - mod->BSIM4v6llodvthGiven = TRUE; - break; - case BSIM4v6_MOD_WLODVTH : - mod->BSIM4v6wlodvth = value->rValue; - mod->BSIM4v6wlodvthGiven = TRUE; - break; - case BSIM4v6_MOD_LKU0 : - mod->BSIM4v6lku0 = value->rValue; - mod->BSIM4v6lku0Given = TRUE; - break; - case BSIM4v6_MOD_WKU0 : - mod->BSIM4v6wku0 = value->rValue; - mod->BSIM4v6wku0Given = TRUE; - break; - case BSIM4v6_MOD_PKU0 : - mod->BSIM4v6pku0 = value->rValue; - mod->BSIM4v6pku0Given = TRUE; - break; - case BSIM4v6_MOD_LKVTH0 : - mod->BSIM4v6lkvth0 = value->rValue; - mod->BSIM4v6lkvth0Given = TRUE; - break; - case BSIM4v6_MOD_WKVTH0 : - mod->BSIM4v6wkvth0 = value->rValue; - mod->BSIM4v6wkvth0Given = TRUE; - break; - case BSIM4v6_MOD_PKVTH0 : - mod->BSIM4v6pkvth0 = value->rValue; - mod->BSIM4v6pkvth0Given = TRUE; - break; - case BSIM4v6_MOD_STK2 : - mod->BSIM4v6stk2 = value->rValue; - mod->BSIM4v6stk2Given = TRUE; - break; - case BSIM4v6_MOD_LODK2 : - mod->BSIM4v6lodk2 = value->rValue; - mod->BSIM4v6lodk2Given = TRUE; - break; - case BSIM4v6_MOD_STETA0 : - mod->BSIM4v6steta0 = value->rValue; - mod->BSIM4v6steta0Given = TRUE; - break; - case BSIM4v6_MOD_LODETA0 : - mod->BSIM4v6lodeta0 = value->rValue; - mod->BSIM4v6lodeta0Given = TRUE; - break; - - case BSIM4v6_MOD_WEB : - mod->BSIM4v6web = value->rValue; - mod->BSIM4v6webGiven = TRUE; - break; - case BSIM4v6_MOD_WEC : - mod->BSIM4v6wec = value->rValue; - mod->BSIM4v6wecGiven = TRUE; - break; - case BSIM4v6_MOD_KVTH0WE : - mod->BSIM4v6kvth0we = value->rValue; - mod->BSIM4v6kvth0weGiven = TRUE; - break; - case BSIM4v6_MOD_K2WE : - mod->BSIM4v6k2we = value->rValue; - mod->BSIM4v6k2weGiven = TRUE; - break; - case BSIM4v6_MOD_KU0WE : - mod->BSIM4v6ku0we = value->rValue; - mod->BSIM4v6ku0weGiven = TRUE; - break; - case BSIM4v6_MOD_SCREF : - mod->BSIM4v6scref = value->rValue; - mod->BSIM4v6screfGiven = TRUE; - break; - case BSIM4v6_MOD_WPEMOD : - mod->BSIM4v6wpemod = value->rValue; - mod->BSIM4v6wpemodGiven = TRUE; - break; - case BSIM4v6_MOD_LKVTH0WE : - mod->BSIM4v6lkvth0we = value->rValue; - mod->BSIM4v6lkvth0weGiven = TRUE; - break; - case BSIM4v6_MOD_LK2WE : - mod->BSIM4v6lk2we = value->rValue; - mod->BSIM4v6lk2weGiven = TRUE; - break; - case BSIM4v6_MOD_LKU0WE : - mod->BSIM4v6lku0we = value->rValue; - mod->BSIM4v6lku0weGiven = TRUE; - break; - case BSIM4v6_MOD_WKVTH0WE : - mod->BSIM4v6wkvth0we = value->rValue; - mod->BSIM4v6wkvth0weGiven = TRUE; - break; - case BSIM4v6_MOD_WK2WE : - mod->BSIM4v6wk2we = value->rValue; - mod->BSIM4v6wk2weGiven = TRUE; - break; - case BSIM4v6_MOD_WKU0WE : - mod->BSIM4v6wku0we = value->rValue; - mod->BSIM4v6wku0weGiven = TRUE; - break; - case BSIM4v6_MOD_PKVTH0WE : - mod->BSIM4v6pkvth0we = value->rValue; - mod->BSIM4v6pkvth0weGiven = TRUE; - break; - case BSIM4v6_MOD_PK2WE : - mod->BSIM4v6pk2we = value->rValue; - mod->BSIM4v6pk2weGiven = TRUE; - break; - case BSIM4v6_MOD_PKU0WE : - mod->BSIM4v6pku0we = value->rValue; - mod->BSIM4v6pku0weGiven = TRUE; - break; - - case BSIM4v6_MOD_BETA0 : - mod->BSIM4v6beta0 = value->rValue; - mod->BSIM4v6beta0Given = TRUE; - break; - case BSIM4v6_MOD_IJTHDFWD : - mod->BSIM4v6ijthdfwd = value->rValue; - mod->BSIM4v6ijthdfwdGiven = TRUE; - break; - case BSIM4v6_MOD_IJTHSFWD : - mod->BSIM4v6ijthsfwd = value->rValue; - mod->BSIM4v6ijthsfwdGiven = TRUE; - break; - case BSIM4v6_MOD_IJTHDREV : - mod->BSIM4v6ijthdrev = value->rValue; - mod->BSIM4v6ijthdrevGiven = TRUE; - break; - case BSIM4v6_MOD_IJTHSREV : - mod->BSIM4v6ijthsrev = value->rValue; - mod->BSIM4v6ijthsrevGiven = TRUE; - break; - case BSIM4v6_MOD_XJBVD : - mod->BSIM4v6xjbvd = value->rValue; - mod->BSIM4v6xjbvdGiven = TRUE; - break; - case BSIM4v6_MOD_XJBVS : - mod->BSIM4v6xjbvs = value->rValue; - mod->BSIM4v6xjbvsGiven = TRUE; - break; - case BSIM4v6_MOD_BVD : - mod->BSIM4v6bvd = value->rValue; - mod->BSIM4v6bvdGiven = TRUE; - break; - case BSIM4v6_MOD_BVS : - mod->BSIM4v6bvs = value->rValue; - mod->BSIM4v6bvsGiven = TRUE; - break; - - /* reverse diode */ - case BSIM4v6_MOD_JTSS : - mod->BSIM4v6jtss = value->rValue; - mod->BSIM4v6jtssGiven = TRUE; - break; - case BSIM4v6_MOD_JTSD : - mod->BSIM4v6jtsd = value->rValue; - mod->BSIM4v6jtsdGiven = TRUE; - break; - case BSIM4v6_MOD_JTSSWS : - mod->BSIM4v6jtssws = value->rValue; - mod->BSIM4v6jtsswsGiven = TRUE; - break; - case BSIM4v6_MOD_JTSSWD : - mod->BSIM4v6jtsswd = value->rValue; - mod->BSIM4v6jtsswdGiven = TRUE; - break; - case BSIM4v6_MOD_JTSSWGS : - mod->BSIM4v6jtsswgs = value->rValue; - mod->BSIM4v6jtsswgsGiven = TRUE; - break; - case BSIM4v6_MOD_JTSSWGD : - mod->BSIM4v6jtsswgd = value->rValue; - mod->BSIM4v6jtsswgdGiven = TRUE; - break; - case BSIM4v6_MOD_JTWEFF : - mod->BSIM4v6jtweff = value->rValue; - mod->BSIM4v6jtweffGiven = TRUE; - break; - case BSIM4v6_MOD_NJTS : - mod->BSIM4v6njts = value->rValue; - mod->BSIM4v6njtsGiven = TRUE; - break; - case BSIM4v6_MOD_NJTSSW : - mod->BSIM4v6njtssw = value->rValue; - mod->BSIM4v6njtsswGiven = TRUE; - break; - case BSIM4v6_MOD_NJTSSWG : - mod->BSIM4v6njtsswg = value->rValue; - mod->BSIM4v6njtsswgGiven = TRUE; - break; - case BSIM4v6_MOD_NJTSD : - mod->BSIM4v6njtsd = value->rValue; - mod->BSIM4v6njtsdGiven = TRUE; - break; - case BSIM4v6_MOD_NJTSSWD : - mod->BSIM4v6njtsswd = value->rValue; - mod->BSIM4v6njtsswdGiven = TRUE; - break; - case BSIM4v6_MOD_NJTSSWGD : - mod->BSIM4v6njtsswgd = value->rValue; - mod->BSIM4v6njtsswgdGiven = TRUE; - break; - case BSIM4v6_MOD_XTSS : - mod->BSIM4v6xtss = value->rValue; - mod->BSIM4v6xtssGiven = TRUE; - break; - case BSIM4v6_MOD_XTSD : - mod->BSIM4v6xtsd = value->rValue; - mod->BSIM4v6xtsdGiven = TRUE; - break; - case BSIM4v6_MOD_XTSSWS : - mod->BSIM4v6xtssws = value->rValue; - mod->BSIM4v6xtsswsGiven = TRUE; - break; - case BSIM4v6_MOD_XTSSWD : - mod->BSIM4v6xtsswd = value->rValue; - mod->BSIM4v6xtsswdGiven = TRUE; - break; - case BSIM4v6_MOD_XTSSWGS : - mod->BSIM4v6xtsswgs = value->rValue; - mod->BSIM4v6xtsswgsGiven = TRUE; - break; - case BSIM4v6_MOD_XTSSWGD : - mod->BSIM4v6xtsswgd = value->rValue; - mod->BSIM4v6xtsswgdGiven = TRUE; - break; - case BSIM4v6_MOD_TNJTS : - mod->BSIM4v6tnjts = value->rValue; - mod->BSIM4v6tnjtsGiven = TRUE; - break; - case BSIM4v6_MOD_TNJTSSW : - mod->BSIM4v6tnjtssw = value->rValue; - mod->BSIM4v6tnjtsswGiven = TRUE; - break; - case BSIM4v6_MOD_TNJTSSWG : - mod->BSIM4v6tnjtsswg = value->rValue; - mod->BSIM4v6tnjtsswgGiven = TRUE; - break; - case BSIM4v6_MOD_TNJTSD : - mod->BSIM4v6tnjtsd = value->rValue; - mod->BSIM4v6tnjtsdGiven = TRUE; - break; - case BSIM4v6_MOD_TNJTSSWD : - mod->BSIM4v6tnjtsswd = value->rValue; - mod->BSIM4v6tnjtsswdGiven = TRUE; - break; - case BSIM4v6_MOD_TNJTSSWGD : - mod->BSIM4v6tnjtsswgd = value->rValue; - mod->BSIM4v6tnjtsswgdGiven = TRUE; - break; - case BSIM4v6_MOD_VTSS : - mod->BSIM4v6vtss = value->rValue; - mod->BSIM4v6vtssGiven = TRUE; - break; - case BSIM4v6_MOD_VTSD : - mod->BSIM4v6vtsd = value->rValue; - mod->BSIM4v6vtsdGiven = TRUE; - break; - case BSIM4v6_MOD_VTSSWS : - mod->BSIM4v6vtssws = value->rValue; - mod->BSIM4v6vtsswsGiven = TRUE; - break; - case BSIM4v6_MOD_VTSSWD : - mod->BSIM4v6vtsswd = value->rValue; - mod->BSIM4v6vtsswdGiven = TRUE; - break; - case BSIM4v6_MOD_VTSSWGS : - mod->BSIM4v6vtsswgs = value->rValue; - mod->BSIM4v6vtsswgsGiven = TRUE; - break; - case BSIM4v6_MOD_VTSSWGD : - mod->BSIM4v6vtsswgd = value->rValue; - mod->BSIM4v6vtsswgdGiven = TRUE; - break; - - case BSIM4v6_MOD_VFB : - mod->BSIM4v6vfb = value->rValue; - mod->BSIM4v6vfbGiven = TRUE; - break; - - case BSIM4v6_MOD_GBMIN : - mod->BSIM4v6gbmin = value->rValue; - mod->BSIM4v6gbminGiven = TRUE; - break; - case BSIM4v6_MOD_RBDB : - mod->BSIM4v6rbdb = value->rValue; - mod->BSIM4v6rbdbGiven = TRUE; - break; - case BSIM4v6_MOD_RBPB : - mod->BSIM4v6rbpb = value->rValue; - mod->BSIM4v6rbpbGiven = TRUE; - break; - case BSIM4v6_MOD_RBSB : - mod->BSIM4v6rbsb = value->rValue; - mod->BSIM4v6rbsbGiven = TRUE; - break; - case BSIM4v6_MOD_RBPS : - mod->BSIM4v6rbps = value->rValue; - mod->BSIM4v6rbpsGiven = TRUE; - break; - case BSIM4v6_MOD_RBPD : - mod->BSIM4v6rbpd = value->rValue; - mod->BSIM4v6rbpdGiven = TRUE; - break; - - case BSIM4v6_MOD_RBPS0 : - mod->BSIM4v6rbps0 = value->rValue; - mod->BSIM4v6rbps0Given = TRUE; - break; - case BSIM4v6_MOD_RBPSL : - mod->BSIM4v6rbpsl = value->rValue; - mod->BSIM4v6rbpslGiven = TRUE; - break; - case BSIM4v6_MOD_RBPSW : - mod->BSIM4v6rbpsw = value->rValue; - mod->BSIM4v6rbpswGiven = TRUE; - break; - case BSIM4v6_MOD_RBPSNF : - mod->BSIM4v6rbpsnf = value->rValue; - mod->BSIM4v6rbpsnfGiven = TRUE; - break; - - case BSIM4v6_MOD_RBPD0 : - mod->BSIM4v6rbpd0 = value->rValue; - mod->BSIM4v6rbpd0Given = TRUE; - break; - case BSIM4v6_MOD_RBPDL : - mod->BSIM4v6rbpdl = value->rValue; - mod->BSIM4v6rbpdlGiven = TRUE; - break; - case BSIM4v6_MOD_RBPDW : - mod->BSIM4v6rbpdw = value->rValue; - mod->BSIM4v6rbpdwGiven = TRUE; - break; - case BSIM4v6_MOD_RBPDNF : - mod->BSIM4v6rbpdnf = value->rValue; - mod->BSIM4v6rbpdnfGiven = TRUE; - break; - - case BSIM4v6_MOD_RBPBX0 : - mod->BSIM4v6rbpbx0 = value->rValue; - mod->BSIM4v6rbpbx0Given = TRUE; - break; - case BSIM4v6_MOD_RBPBXL : - mod->BSIM4v6rbpbxl = value->rValue; - mod->BSIM4v6rbpbxlGiven = TRUE; - break; - case BSIM4v6_MOD_RBPBXW : - mod->BSIM4v6rbpbxw = value->rValue; - mod->BSIM4v6rbpbxwGiven = TRUE; - break; - case BSIM4v6_MOD_RBPBXNF : - mod->BSIM4v6rbpbxnf = value->rValue; - mod->BSIM4v6rbpbxnfGiven = TRUE; - break; - case BSIM4v6_MOD_RBPBY0 : - mod->BSIM4v6rbpby0 = value->rValue; - mod->BSIM4v6rbpby0Given = TRUE; - break; - case BSIM4v6_MOD_RBPBYL : - mod->BSIM4v6rbpbyl = value->rValue; - mod->BSIM4v6rbpbylGiven = TRUE; - break; - case BSIM4v6_MOD_RBPBYW : - mod->BSIM4v6rbpbyw = value->rValue; - mod->BSIM4v6rbpbywGiven = TRUE; - break; - case BSIM4v6_MOD_RBPBYNF : - mod->BSIM4v6rbpbynf = value->rValue; - mod->BSIM4v6rbpbynfGiven = TRUE; - break; - case BSIM4v6_MOD_RBSBX0 : - mod->BSIM4v6rbsbx0 = value->rValue; - mod->BSIM4v6rbsbx0Given = TRUE; - break; - case BSIM4v6_MOD_RBSBY0 : - mod->BSIM4v6rbsby0 = value->rValue; - mod->BSIM4v6rbsby0Given = TRUE; - break; - case BSIM4v6_MOD_RBDBX0 : - mod->BSIM4v6rbdbx0 = value->rValue; - mod->BSIM4v6rbdbx0Given = TRUE; - break; - case BSIM4v6_MOD_RBDBY0 : - mod->BSIM4v6rbdby0 = value->rValue; - mod->BSIM4v6rbdby0Given = TRUE; - break; - - - case BSIM4v6_MOD_RBSDBXL : - mod->BSIM4v6rbsdbxl = value->rValue; - mod->BSIM4v6rbsdbxlGiven = TRUE; - break; - case BSIM4v6_MOD_RBSDBXW : - mod->BSIM4v6rbsdbxw = value->rValue; - mod->BSIM4v6rbsdbxwGiven = TRUE; - break; - case BSIM4v6_MOD_RBSDBXNF : - mod->BSIM4v6rbsdbxnf = value->rValue; - mod->BSIM4v6rbsdbxnfGiven = TRUE; - break; - case BSIM4v6_MOD_RBSDBYL : - mod->BSIM4v6rbsdbyl = value->rValue; - mod->BSIM4v6rbsdbylGiven = TRUE; - break; - case BSIM4v6_MOD_RBSDBYW : - mod->BSIM4v6rbsdbyw = value->rValue; - mod->BSIM4v6rbsdbywGiven = TRUE; - break; - case BSIM4v6_MOD_RBSDBYNF : - mod->BSIM4v6rbsdbynf = value->rValue; - mod->BSIM4v6rbsdbynfGiven = TRUE; - break; - - case BSIM4v6_MOD_CGSL : - mod->BSIM4v6cgsl = value->rValue; - mod->BSIM4v6cgslGiven = TRUE; - break; - case BSIM4v6_MOD_CGDL : - mod->BSIM4v6cgdl = value->rValue; - mod->BSIM4v6cgdlGiven = TRUE; - break; - case BSIM4v6_MOD_CKAPPAS : - mod->BSIM4v6ckappas = value->rValue; - mod->BSIM4v6ckappasGiven = TRUE; - break; - case BSIM4v6_MOD_CKAPPAD : - mod->BSIM4v6ckappad = value->rValue; - mod->BSIM4v6ckappadGiven = TRUE; - break; - case BSIM4v6_MOD_CF : - mod->BSIM4v6cf = value->rValue; - mod->BSIM4v6cfGiven = TRUE; - break; - case BSIM4v6_MOD_CLC : - mod->BSIM4v6clc = value->rValue; - mod->BSIM4v6clcGiven = TRUE; - break; - case BSIM4v6_MOD_CLE : - mod->BSIM4v6cle = value->rValue; - mod->BSIM4v6cleGiven = TRUE; - break; - case BSIM4v6_MOD_DWC : - mod->BSIM4v6dwc = value->rValue; - mod->BSIM4v6dwcGiven = TRUE; - break; - case BSIM4v6_MOD_DLC : - mod->BSIM4v6dlc = value->rValue; - mod->BSIM4v6dlcGiven = TRUE; - break; - case BSIM4v6_MOD_XW : - mod->BSIM4v6xw = value->rValue; - mod->BSIM4v6xwGiven = TRUE; - break; - case BSIM4v6_MOD_XL : - mod->BSIM4v6xl = value->rValue; - mod->BSIM4v6xlGiven = TRUE; - break; - case BSIM4v6_MOD_DLCIG : - mod->BSIM4v6dlcig = value->rValue; - mod->BSIM4v6dlcigGiven = TRUE; - break; - case BSIM4v6_MOD_DLCIGD : - mod->BSIM4v6dlcigd = value->rValue; - mod->BSIM4v6dlcigdGiven = TRUE; - break; - case BSIM4v6_MOD_DWJ : - mod->BSIM4v6dwj = value->rValue; - mod->BSIM4v6dwjGiven = TRUE; - break; - case BSIM4v6_MOD_VFBCV : - mod->BSIM4v6vfbcv = value->rValue; - mod->BSIM4v6vfbcvGiven = TRUE; - break; - case BSIM4v6_MOD_ACDE : - mod->BSIM4v6acde = value->rValue; - mod->BSIM4v6acdeGiven = TRUE; - break; - case BSIM4v6_MOD_MOIN : - mod->BSIM4v6moin = value->rValue; - mod->BSIM4v6moinGiven = TRUE; - break; - case BSIM4v6_MOD_NOFF : - mod->BSIM4v6noff = value->rValue; - mod->BSIM4v6noffGiven = TRUE; - break; - case BSIM4v6_MOD_VOFFCV : - mod->BSIM4v6voffcv = value->rValue; - mod->BSIM4v6voffcvGiven = TRUE; - break; - case BSIM4v6_MOD_DMCG : - mod->BSIM4v6dmcg = value->rValue; - mod->BSIM4v6dmcgGiven = TRUE; - break; - case BSIM4v6_MOD_DMCI : - mod->BSIM4v6dmci = value->rValue; - mod->BSIM4v6dmciGiven = TRUE; - break; - case BSIM4v6_MOD_DMDG : - mod->BSIM4v6dmdg = value->rValue; - mod->BSIM4v6dmdgGiven = TRUE; - break; - case BSIM4v6_MOD_DMCGT : - mod->BSIM4v6dmcgt = value->rValue; - mod->BSIM4v6dmcgtGiven = TRUE; - break; - case BSIM4v6_MOD_XGW : - mod->BSIM4v6xgw = value->rValue; - mod->BSIM4v6xgwGiven = TRUE; - break; - case BSIM4v6_MOD_XGL : - mod->BSIM4v6xgl = value->rValue; - mod->BSIM4v6xglGiven = TRUE; - break; - case BSIM4v6_MOD_RSHG : - mod->BSIM4v6rshg = value->rValue; - mod->BSIM4v6rshgGiven = TRUE; - break; - case BSIM4v6_MOD_NGCON : - mod->BSIM4v6ngcon = value->rValue; - mod->BSIM4v6ngconGiven = TRUE; - break; - case BSIM4v6_MOD_TCJ : - mod->BSIM4v6tcj = value->rValue; - mod->BSIM4v6tcjGiven = TRUE; - break; - case BSIM4v6_MOD_TPB : - mod->BSIM4v6tpb = value->rValue; - mod->BSIM4v6tpbGiven = TRUE; - break; - case BSIM4v6_MOD_TCJSW : - mod->BSIM4v6tcjsw = value->rValue; - mod->BSIM4v6tcjswGiven = TRUE; - break; - case BSIM4v6_MOD_TPBSW : - mod->BSIM4v6tpbsw = value->rValue; - mod->BSIM4v6tpbswGiven = TRUE; - break; - case BSIM4v6_MOD_TCJSWG : - mod->BSIM4v6tcjswg = value->rValue; - mod->BSIM4v6tcjswgGiven = TRUE; - break; - case BSIM4v6_MOD_TPBSWG : - mod->BSIM4v6tpbswg = value->rValue; - mod->BSIM4v6tpbswgGiven = TRUE; - break; - - /* Length dependence */ - case BSIM4v6_MOD_LCDSC : - mod->BSIM4v6lcdsc = value->rValue; - mod->BSIM4v6lcdscGiven = TRUE; - break; - - - case BSIM4v6_MOD_LCDSCB : - mod->BSIM4v6lcdscb = value->rValue; - mod->BSIM4v6lcdscbGiven = TRUE; - break; - case BSIM4v6_MOD_LCDSCD : - mod->BSIM4v6lcdscd = value->rValue; - mod->BSIM4v6lcdscdGiven = TRUE; - break; - case BSIM4v6_MOD_LCIT : - mod->BSIM4v6lcit = value->rValue; - mod->BSIM4v6lcitGiven = TRUE; - break; - case BSIM4v6_MOD_LNFACTOR : - mod->BSIM4v6lnfactor = value->rValue; - mod->BSIM4v6lnfactorGiven = TRUE; - break; - case BSIM4v6_MOD_LXJ: - mod->BSIM4v6lxj = value->rValue; - mod->BSIM4v6lxjGiven = TRUE; - break; - case BSIM4v6_MOD_LVSAT: - mod->BSIM4v6lvsat = value->rValue; - mod->BSIM4v6lvsatGiven = TRUE; - break; - - - case BSIM4v6_MOD_LA0: - mod->BSIM4v6la0 = value->rValue; - mod->BSIM4v6la0Given = TRUE; - break; - case BSIM4v6_MOD_LAGS: - mod->BSIM4v6lags = value->rValue; - mod->BSIM4v6lagsGiven = TRUE; - break; - case BSIM4v6_MOD_LA1: - mod->BSIM4v6la1 = value->rValue; - mod->BSIM4v6la1Given = TRUE; - break; - case BSIM4v6_MOD_LA2: - mod->BSIM4v6la2 = value->rValue; - mod->BSIM4v6la2Given = TRUE; - break; - case BSIM4v6_MOD_LAT: - mod->BSIM4v6lat = value->rValue; - mod->BSIM4v6latGiven = TRUE; - break; - case BSIM4v6_MOD_LKETA: - mod->BSIM4v6lketa = value->rValue; - mod->BSIM4v6lketaGiven = TRUE; - break; - case BSIM4v6_MOD_LNSUB: - mod->BSIM4v6lnsub = value->rValue; - mod->BSIM4v6lnsubGiven = TRUE; - break; - case BSIM4v6_MOD_LNDEP: - mod->BSIM4v6lndep = value->rValue; - mod->BSIM4v6lndepGiven = TRUE; - if (mod->BSIM4v6lndep > 1.0e20) - mod->BSIM4v6lndep *= 1.0e-6; - break; - case BSIM4v6_MOD_LNSD: - mod->BSIM4v6lnsd = value->rValue; - mod->BSIM4v6lnsdGiven = TRUE; - if (mod->BSIM4v6lnsd > 1.0e23) - mod->BSIM4v6lnsd *= 1.0e-6; - break; - case BSIM4v6_MOD_LNGATE: - mod->BSIM4v6lngate = value->rValue; - mod->BSIM4v6lngateGiven = TRUE; - if (mod->BSIM4v6lngate > 1.0e23) - mod->BSIM4v6lngate *= 1.0e-6; - break; - case BSIM4v6_MOD_LGAMMA1: - mod->BSIM4v6lgamma1 = value->rValue; - mod->BSIM4v6lgamma1Given = TRUE; - break; - case BSIM4v6_MOD_LGAMMA2: - mod->BSIM4v6lgamma2 = value->rValue; - mod->BSIM4v6lgamma2Given = TRUE; - break; - case BSIM4v6_MOD_LVBX: - mod->BSIM4v6lvbx = value->rValue; - mod->BSIM4v6lvbxGiven = TRUE; - break; - case BSIM4v6_MOD_LVBM: - mod->BSIM4v6lvbm = value->rValue; - mod->BSIM4v6lvbmGiven = TRUE; - break; - case BSIM4v6_MOD_LXT: - mod->BSIM4v6lxt = value->rValue; - mod->BSIM4v6lxtGiven = TRUE; - break; - case BSIM4v6_MOD_LK1: - mod->BSIM4v6lk1 = value->rValue; - mod->BSIM4v6lk1Given = TRUE; - break; - case BSIM4v6_MOD_LKT1: - mod->BSIM4v6lkt1 = value->rValue; - mod->BSIM4v6lkt1Given = TRUE; - break; - case BSIM4v6_MOD_LKT1L: - mod->BSIM4v6lkt1l = value->rValue; - mod->BSIM4v6lkt1lGiven = TRUE; - break; - case BSIM4v6_MOD_LKT2: - mod->BSIM4v6lkt2 = value->rValue; - mod->BSIM4v6lkt2Given = TRUE; - break; - case BSIM4v6_MOD_LK2: - mod->BSIM4v6lk2 = value->rValue; - mod->BSIM4v6lk2Given = TRUE; - break; - case BSIM4v6_MOD_LK3: - mod->BSIM4v6lk3 = value->rValue; - mod->BSIM4v6lk3Given = TRUE; - break; - case BSIM4v6_MOD_LK3B: - mod->BSIM4v6lk3b = value->rValue; - mod->BSIM4v6lk3bGiven = TRUE; - break; - case BSIM4v6_MOD_LLPE0: - mod->BSIM4v6llpe0 = value->rValue; - mod->BSIM4v6llpe0Given = TRUE; - break; - case BSIM4v6_MOD_LLPEB: - mod->BSIM4v6llpeb = value->rValue; - mod->BSIM4v6llpebGiven = TRUE; - break; - case BSIM4v6_MOD_LDVTP0: - mod->BSIM4v6ldvtp0 = value->rValue; - mod->BSIM4v6ldvtp0Given = TRUE; - break; - case BSIM4v6_MOD_LDVTP1: - mod->BSIM4v6ldvtp1 = value->rValue; - mod->BSIM4v6ldvtp1Given = TRUE; - break; - case BSIM4v6_MOD_LW0: - mod->BSIM4v6lw0 = value->rValue; - mod->BSIM4v6lw0Given = TRUE; - break; - case BSIM4v6_MOD_LDVT0: - mod->BSIM4v6ldvt0 = value->rValue; - mod->BSIM4v6ldvt0Given = TRUE; - break; - case BSIM4v6_MOD_LDVT1: - mod->BSIM4v6ldvt1 = value->rValue; - mod->BSIM4v6ldvt1Given = TRUE; - break; - case BSIM4v6_MOD_LDVT2: - mod->BSIM4v6ldvt2 = value->rValue; - mod->BSIM4v6ldvt2Given = TRUE; - break; - case BSIM4v6_MOD_LDVT0W: - mod->BSIM4v6ldvt0w = value->rValue; - mod->BSIM4v6ldvt0wGiven = TRUE; - break; - case BSIM4v6_MOD_LDVT1W: - mod->BSIM4v6ldvt1w = value->rValue; - mod->BSIM4v6ldvt1wGiven = TRUE; - break; - case BSIM4v6_MOD_LDVT2W: - mod->BSIM4v6ldvt2w = value->rValue; - mod->BSIM4v6ldvt2wGiven = TRUE; - break; - case BSIM4v6_MOD_LDROUT: - mod->BSIM4v6ldrout = value->rValue; - mod->BSIM4v6ldroutGiven = TRUE; - break; - case BSIM4v6_MOD_LDSUB: - mod->BSIM4v6ldsub = value->rValue; - mod->BSIM4v6ldsubGiven = TRUE; - break; - case BSIM4v6_MOD_LVTH0: - mod->BSIM4v6lvth0 = value->rValue; - mod->BSIM4v6lvth0Given = TRUE; - break; - case BSIM4v6_MOD_LUA: - mod->BSIM4v6lua = value->rValue; - mod->BSIM4v6luaGiven = TRUE; - break; - case BSIM4v6_MOD_LUA1: - mod->BSIM4v6lua1 = value->rValue; - mod->BSIM4v6lua1Given = TRUE; - break; - case BSIM4v6_MOD_LUB: - mod->BSIM4v6lub = value->rValue; - mod->BSIM4v6lubGiven = TRUE; - break; - case BSIM4v6_MOD_LUB1: - mod->BSIM4v6lub1 = value->rValue; - mod->BSIM4v6lub1Given = TRUE; - break; - case BSIM4v6_MOD_LUC: - mod->BSIM4v6luc = value->rValue; - mod->BSIM4v6lucGiven = TRUE; - break; - case BSIM4v6_MOD_LUC1: - mod->BSIM4v6luc1 = value->rValue; - mod->BSIM4v6luc1Given = TRUE; - break; - case BSIM4v6_MOD_LU0 : - mod->BSIM4v6lu0 = value->rValue; - mod->BSIM4v6lu0Given = TRUE; - break; - case BSIM4v6_MOD_LUTE : - mod->BSIM4v6lute = value->rValue; - mod->BSIM4v6luteGiven = TRUE; - break; - case BSIM4v6_MOD_LUCSTE : - mod->BSIM4v6lucste = value->rValue; - mod->BSIM4v6lucsteGiven = TRUE; - break; - case BSIM4v6_MOD_LVOFF: - mod->BSIM4v6lvoff = value->rValue; - mod->BSIM4v6lvoffGiven = TRUE; - break; - case BSIM4v6_MOD_LTVOFF: - mod->BSIM4v6ltvoff = value->rValue; - mod->BSIM4v6ltvoffGiven = TRUE; - break; - case BSIM4v6_MOD_LMINV: - mod->BSIM4v6lminv = value->rValue; - mod->BSIM4v6lminvGiven = TRUE; - break; - case BSIM4v6_MOD_LMINVCV: - mod->BSIM4v6lminvcv = value->rValue; - mod->BSIM4v6lminvcvGiven = TRUE; - break; - case BSIM4v6_MOD_LFPROUT: - mod->BSIM4v6lfprout = value->rValue; - mod->BSIM4v6lfproutGiven = TRUE; - break; - case BSIM4v6_MOD_LPDITS: - mod->BSIM4v6lpdits = value->rValue; - mod->BSIM4v6lpditsGiven = TRUE; - break; - case BSIM4v6_MOD_LPDITSD: - mod->BSIM4v6lpditsd = value->rValue; - mod->BSIM4v6lpditsdGiven = TRUE; - break; - case BSIM4v6_MOD_LDELTA : - mod->BSIM4v6ldelta = value->rValue; - mod->BSIM4v6ldeltaGiven = TRUE; - break; - case BSIM4v6_MOD_LRDSW: - mod->BSIM4v6lrdsw = value->rValue; - mod->BSIM4v6lrdswGiven = TRUE; - break; - case BSIM4v6_MOD_LRDW: - mod->BSIM4v6lrdw = value->rValue; - mod->BSIM4v6lrdwGiven = TRUE; - break; - case BSIM4v6_MOD_LRSW: - mod->BSIM4v6lrsw = value->rValue; - mod->BSIM4v6lrswGiven = TRUE; - break; - case BSIM4v6_MOD_LPRWB: - mod->BSIM4v6lprwb = value->rValue; - mod->BSIM4v6lprwbGiven = TRUE; - break; - case BSIM4v6_MOD_LPRWG: - mod->BSIM4v6lprwg = value->rValue; - mod->BSIM4v6lprwgGiven = TRUE; - break; - case BSIM4v6_MOD_LPRT: - mod->BSIM4v6lprt = value->rValue; - mod->BSIM4v6lprtGiven = TRUE; - break; - case BSIM4v6_MOD_LETA0: - mod->BSIM4v6leta0 = value->rValue; - mod->BSIM4v6leta0Given = TRUE; - break; - case BSIM4v6_MOD_LETAB: - mod->BSIM4v6letab = value->rValue; - mod->BSIM4v6letabGiven = TRUE; - break; - case BSIM4v6_MOD_LPCLM: - mod->BSIM4v6lpclm = value->rValue; - mod->BSIM4v6lpclmGiven = TRUE; - break; - case BSIM4v6_MOD_LPDIBL1: - mod->BSIM4v6lpdibl1 = value->rValue; - mod->BSIM4v6lpdibl1Given = TRUE; - break; - case BSIM4v6_MOD_LPDIBL2: - mod->BSIM4v6lpdibl2 = value->rValue; - mod->BSIM4v6lpdibl2Given = TRUE; - break; - case BSIM4v6_MOD_LPDIBLB: - mod->BSIM4v6lpdiblb = value->rValue; - mod->BSIM4v6lpdiblbGiven = TRUE; - break; - case BSIM4v6_MOD_LPSCBE1: - mod->BSIM4v6lpscbe1 = value->rValue; - mod->BSIM4v6lpscbe1Given = TRUE; - break; - case BSIM4v6_MOD_LPSCBE2: - mod->BSIM4v6lpscbe2 = value->rValue; - mod->BSIM4v6lpscbe2Given = TRUE; - break; - case BSIM4v6_MOD_LPVAG: - mod->BSIM4v6lpvag = value->rValue; - mod->BSIM4v6lpvagGiven = TRUE; - break; - case BSIM4v6_MOD_LWR : - mod->BSIM4v6lwr = value->rValue; - mod->BSIM4v6lwrGiven = TRUE; - break; - case BSIM4v6_MOD_LDWG : - mod->BSIM4v6ldwg = value->rValue; - mod->BSIM4v6ldwgGiven = TRUE; - break; - case BSIM4v6_MOD_LDWB : - mod->BSIM4v6ldwb = value->rValue; - mod->BSIM4v6ldwbGiven = TRUE; - break; - case BSIM4v6_MOD_LB0 : - mod->BSIM4v6lb0 = value->rValue; - mod->BSIM4v6lb0Given = TRUE; - break; - case BSIM4v6_MOD_LB1 : - mod->BSIM4v6lb1 = value->rValue; - mod->BSIM4v6lb1Given = TRUE; - break; - case BSIM4v6_MOD_LALPHA0 : - mod->BSIM4v6lalpha0 = value->rValue; - mod->BSIM4v6lalpha0Given = TRUE; - break; - case BSIM4v6_MOD_LALPHA1 : - mod->BSIM4v6lalpha1 = value->rValue; - mod->BSIM4v6lalpha1Given = TRUE; - break; - case BSIM4v6_MOD_LBETA0 : - mod->BSIM4v6lbeta0 = value->rValue; - mod->BSIM4v6lbeta0Given = TRUE; - break; - case BSIM4v6_MOD_LPHIN : - mod->BSIM4v6lphin = value->rValue; - mod->BSIM4v6lphinGiven = TRUE; - break; - case BSIM4v6_MOD_LAGIDL : - mod->BSIM4v6lagidl = value->rValue; - mod->BSIM4v6lagidlGiven = TRUE; - break; - case BSIM4v6_MOD_LBGIDL : - mod->BSIM4v6lbgidl = value->rValue; - mod->BSIM4v6lbgidlGiven = TRUE; - break; - case BSIM4v6_MOD_LCGIDL : - mod->BSIM4v6lcgidl = value->rValue; - mod->BSIM4v6lcgidlGiven = TRUE; - break; - case BSIM4v6_MOD_LEGIDL : - mod->BSIM4v6legidl = value->rValue; - mod->BSIM4v6legidlGiven = TRUE; - break; - case BSIM4v6_MOD_LAGISL : - mod->BSIM4v6lagisl = value->rValue; - mod->BSIM4v6lagislGiven = TRUE; - break; - case BSIM4v6_MOD_LBGISL : - mod->BSIM4v6lbgisl = value->rValue; - mod->BSIM4v6lbgislGiven = TRUE; - break; - case BSIM4v6_MOD_LCGISL : - mod->BSIM4v6lcgisl = value->rValue; - mod->BSIM4v6lcgislGiven = TRUE; - break; - case BSIM4v6_MOD_LEGISL : - mod->BSIM4v6legisl = value->rValue; - mod->BSIM4v6legislGiven = TRUE; - break; - case BSIM4v6_MOD_LAIGC : - mod->BSIM4v6laigc = value->rValue; - mod->BSIM4v6laigcGiven = TRUE; - break; - case BSIM4v6_MOD_LBIGC : - mod->BSIM4v6lbigc = value->rValue; - mod->BSIM4v6lbigcGiven = TRUE; - break; - case BSIM4v6_MOD_LCIGC : - mod->BSIM4v6lcigc = value->rValue; - mod->BSIM4v6lcigcGiven = TRUE; - break; - case BSIM4v6_MOD_LAIGSD : - mod->BSIM4v6laigsd = value->rValue; - mod->BSIM4v6laigsdGiven = TRUE; - break; - case BSIM4v6_MOD_LBIGSD : - mod->BSIM4v6lbigsd = value->rValue; - mod->BSIM4v6lbigsdGiven = TRUE; - break; - case BSIM4v6_MOD_LCIGSD : - mod->BSIM4v6lcigsd = value->rValue; - mod->BSIM4v6lcigsdGiven = TRUE; - break; - case BSIM4v6_MOD_LAIGS : - mod->BSIM4v6laigs = value->rValue; - mod->BSIM4v6laigsGiven = TRUE; - break; - case BSIM4v6_MOD_LBIGS : - mod->BSIM4v6lbigs = value->rValue; - mod->BSIM4v6lbigsGiven = TRUE; - break; - case BSIM4v6_MOD_LCIGS : - mod->BSIM4v6lcigs = value->rValue; - mod->BSIM4v6lcigsGiven = TRUE; - break; - case BSIM4v6_MOD_LAIGD : - mod->BSIM4v6laigd = value->rValue; - mod->BSIM4v6laigdGiven = TRUE; - break; - case BSIM4v6_MOD_LBIGD : - mod->BSIM4v6lbigd = value->rValue; - mod->BSIM4v6lbigdGiven = TRUE; - break; - case BSIM4v6_MOD_LCIGD : - mod->BSIM4v6lcigd = value->rValue; - mod->BSIM4v6lcigdGiven = TRUE; - break; - case BSIM4v6_MOD_LAIGBACC : - mod->BSIM4v6laigbacc = value->rValue; - mod->BSIM4v6laigbaccGiven = TRUE; - break; - case BSIM4v6_MOD_LBIGBACC : - mod->BSIM4v6lbigbacc = value->rValue; - mod->BSIM4v6lbigbaccGiven = TRUE; - break; - case BSIM4v6_MOD_LCIGBACC : - mod->BSIM4v6lcigbacc = value->rValue; - mod->BSIM4v6lcigbaccGiven = TRUE; - break; - case BSIM4v6_MOD_LAIGBINV : - mod->BSIM4v6laigbinv = value->rValue; - mod->BSIM4v6laigbinvGiven = TRUE; - break; - case BSIM4v6_MOD_LBIGBINV : - mod->BSIM4v6lbigbinv = value->rValue; - mod->BSIM4v6lbigbinvGiven = TRUE; - break; - case BSIM4v6_MOD_LCIGBINV : - mod->BSIM4v6lcigbinv = value->rValue; - mod->BSIM4v6lcigbinvGiven = TRUE; - break; - case BSIM4v6_MOD_LNIGC : - mod->BSIM4v6lnigc = value->rValue; - mod->BSIM4v6lnigcGiven = TRUE; - break; - case BSIM4v6_MOD_LNIGBINV : - mod->BSIM4v6lnigbinv = value->rValue; - mod->BSIM4v6lnigbinvGiven = TRUE; - break; - case BSIM4v6_MOD_LNIGBACC : - mod->BSIM4v6lnigbacc = value->rValue; - mod->BSIM4v6lnigbaccGiven = TRUE; - break; - case BSIM4v6_MOD_LNTOX : - mod->BSIM4v6lntox = value->rValue; - mod->BSIM4v6lntoxGiven = TRUE; - break; - case BSIM4v6_MOD_LEIGBINV : - mod->BSIM4v6leigbinv = value->rValue; - mod->BSIM4v6leigbinvGiven = TRUE; - break; - case BSIM4v6_MOD_LPIGCD : - mod->BSIM4v6lpigcd = value->rValue; - mod->BSIM4v6lpigcdGiven = TRUE; - break; - case BSIM4v6_MOD_LPOXEDGE : - mod->BSIM4v6lpoxedge = value->rValue; - mod->BSIM4v6lpoxedgeGiven = TRUE; - break; - case BSIM4v6_MOD_LXRCRG1 : - mod->BSIM4v6lxrcrg1 = value->rValue; - mod->BSIM4v6lxrcrg1Given = TRUE; - break; - case BSIM4v6_MOD_LXRCRG2 : - mod->BSIM4v6lxrcrg2 = value->rValue; - mod->BSIM4v6lxrcrg2Given = TRUE; - break; - case BSIM4v6_MOD_LLAMBDA : - mod->BSIM4v6llambda = value->rValue; - mod->BSIM4v6llambdaGiven = TRUE; - break; - case BSIM4v6_MOD_LVTL : - mod->BSIM4v6lvtl = value->rValue; - mod->BSIM4v6lvtlGiven = TRUE; - break; - case BSIM4v6_MOD_LXN: - mod->BSIM4v6lxn = value->rValue; - mod->BSIM4v6lxnGiven = TRUE; - break; - case BSIM4v6_MOD_LVFBSDOFF: - mod->BSIM4v6lvfbsdoff = value->rValue; - mod->BSIM4v6lvfbsdoffGiven = TRUE; - break; - case BSIM4v6_MOD_LTVFBSDOFF: - mod->BSIM4v6ltvfbsdoff = value->rValue; - mod->BSIM4v6ltvfbsdoffGiven = TRUE; - break; - case BSIM4v6_MOD_LEU : - mod->BSIM4v6leu = value->rValue; - mod->BSIM4v6leuGiven = TRUE; - break; - case BSIM4v6_MOD_LUCS : - mod->BSIM4v6lucs = value->rValue; - mod->BSIM4v6lucsGiven = TRUE; - break; - case BSIM4v6_MOD_LVFB : - mod->BSIM4v6lvfb = value->rValue; - mod->BSIM4v6lvfbGiven = TRUE; - break; - case BSIM4v6_MOD_LCGSL : - mod->BSIM4v6lcgsl = value->rValue; - mod->BSIM4v6lcgslGiven = TRUE; - break; - case BSIM4v6_MOD_LCGDL : - mod->BSIM4v6lcgdl = value->rValue; - mod->BSIM4v6lcgdlGiven = TRUE; - break; - case BSIM4v6_MOD_LCKAPPAS : - mod->BSIM4v6lckappas = value->rValue; - mod->BSIM4v6lckappasGiven = TRUE; - break; - case BSIM4v6_MOD_LCKAPPAD : - mod->BSIM4v6lckappad = value->rValue; - mod->BSIM4v6lckappadGiven = TRUE; - break; - case BSIM4v6_MOD_LCF : - mod->BSIM4v6lcf = value->rValue; - mod->BSIM4v6lcfGiven = TRUE; - break; - case BSIM4v6_MOD_LCLC : - mod->BSIM4v6lclc = value->rValue; - mod->BSIM4v6lclcGiven = TRUE; - break; - case BSIM4v6_MOD_LCLE : - mod->BSIM4v6lcle = value->rValue; - mod->BSIM4v6lcleGiven = TRUE; - break; - case BSIM4v6_MOD_LVFBCV : - mod->BSIM4v6lvfbcv = value->rValue; - mod->BSIM4v6lvfbcvGiven = TRUE; - break; - case BSIM4v6_MOD_LACDE : - mod->BSIM4v6lacde = value->rValue; - mod->BSIM4v6lacdeGiven = TRUE; - break; - case BSIM4v6_MOD_LMOIN : - mod->BSIM4v6lmoin = value->rValue; - mod->BSIM4v6lmoinGiven = TRUE; - break; - case BSIM4v6_MOD_LNOFF : - mod->BSIM4v6lnoff = value->rValue; - mod->BSIM4v6lnoffGiven = TRUE; - break; - case BSIM4v6_MOD_LVOFFCV : - mod->BSIM4v6lvoffcv = value->rValue; - mod->BSIM4v6lvoffcvGiven = TRUE; - break; - - /* Width dependence */ - case BSIM4v6_MOD_WCDSC : - mod->BSIM4v6wcdsc = value->rValue; - mod->BSIM4v6wcdscGiven = TRUE; - break; - - - case BSIM4v6_MOD_WCDSCB : - mod->BSIM4v6wcdscb = value->rValue; - mod->BSIM4v6wcdscbGiven = TRUE; - break; - case BSIM4v6_MOD_WCDSCD : - mod->BSIM4v6wcdscd = value->rValue; - mod->BSIM4v6wcdscdGiven = TRUE; - break; - case BSIM4v6_MOD_WCIT : - mod->BSIM4v6wcit = value->rValue; - mod->BSIM4v6wcitGiven = TRUE; - break; - case BSIM4v6_MOD_WNFACTOR : - mod->BSIM4v6wnfactor = value->rValue; - mod->BSIM4v6wnfactorGiven = TRUE; - break; - case BSIM4v6_MOD_WXJ: - mod->BSIM4v6wxj = value->rValue; - mod->BSIM4v6wxjGiven = TRUE; - break; - case BSIM4v6_MOD_WVSAT: - mod->BSIM4v6wvsat = value->rValue; - mod->BSIM4v6wvsatGiven = TRUE; - break; - - - case BSIM4v6_MOD_WA0: - mod->BSIM4v6wa0 = value->rValue; - mod->BSIM4v6wa0Given = TRUE; - break; - case BSIM4v6_MOD_WAGS: - mod->BSIM4v6wags = value->rValue; - mod->BSIM4v6wagsGiven = TRUE; - break; - case BSIM4v6_MOD_WA1: - mod->BSIM4v6wa1 = value->rValue; - mod->BSIM4v6wa1Given = TRUE; - break; - case BSIM4v6_MOD_WA2: - mod->BSIM4v6wa2 = value->rValue; - mod->BSIM4v6wa2Given = TRUE; - break; - case BSIM4v6_MOD_WAT: - mod->BSIM4v6wat = value->rValue; - mod->BSIM4v6watGiven = TRUE; - break; - case BSIM4v6_MOD_WKETA: - mod->BSIM4v6wketa = value->rValue; - mod->BSIM4v6wketaGiven = TRUE; - break; - case BSIM4v6_MOD_WNSUB: - mod->BSIM4v6wnsub = value->rValue; - mod->BSIM4v6wnsubGiven = TRUE; - break; - case BSIM4v6_MOD_WNDEP: - mod->BSIM4v6wndep = value->rValue; - mod->BSIM4v6wndepGiven = TRUE; - if (mod->BSIM4v6wndep > 1.0e20) - mod->BSIM4v6wndep *= 1.0e-6; - break; - case BSIM4v6_MOD_WNSD: - mod->BSIM4v6wnsd = value->rValue; - mod->BSIM4v6wnsdGiven = TRUE; - if (mod->BSIM4v6wnsd > 1.0e23) - mod->BSIM4v6wnsd *= 1.0e-6; - break; - case BSIM4v6_MOD_WNGATE: - mod->BSIM4v6wngate = value->rValue; - mod->BSIM4v6wngateGiven = TRUE; - if (mod->BSIM4v6wngate > 1.0e23) - mod->BSIM4v6wngate *= 1.0e-6; - break; - case BSIM4v6_MOD_WGAMMA1: - mod->BSIM4v6wgamma1 = value->rValue; - mod->BSIM4v6wgamma1Given = TRUE; - break; - case BSIM4v6_MOD_WGAMMA2: - mod->BSIM4v6wgamma2 = value->rValue; - mod->BSIM4v6wgamma2Given = TRUE; - break; - case BSIM4v6_MOD_WVBX: - mod->BSIM4v6wvbx = value->rValue; - mod->BSIM4v6wvbxGiven = TRUE; - break; - case BSIM4v6_MOD_WVBM: - mod->BSIM4v6wvbm = value->rValue; - mod->BSIM4v6wvbmGiven = TRUE; - break; - case BSIM4v6_MOD_WXT: - mod->BSIM4v6wxt = value->rValue; - mod->BSIM4v6wxtGiven = TRUE; - break; - case BSIM4v6_MOD_WK1: - mod->BSIM4v6wk1 = value->rValue; - mod->BSIM4v6wk1Given = TRUE; - break; - case BSIM4v6_MOD_WKT1: - mod->BSIM4v6wkt1 = value->rValue; - mod->BSIM4v6wkt1Given = TRUE; - break; - case BSIM4v6_MOD_WKT1L: - mod->BSIM4v6wkt1l = value->rValue; - mod->BSIM4v6wkt1lGiven = TRUE; - break; - case BSIM4v6_MOD_WKT2: - mod->BSIM4v6wkt2 = value->rValue; - mod->BSIM4v6wkt2Given = TRUE; - break; - case BSIM4v6_MOD_WK2: - mod->BSIM4v6wk2 = value->rValue; - mod->BSIM4v6wk2Given = TRUE; - break; - case BSIM4v6_MOD_WK3: - mod->BSIM4v6wk3 = value->rValue; - mod->BSIM4v6wk3Given = TRUE; - break; - case BSIM4v6_MOD_WK3B: - mod->BSIM4v6wk3b = value->rValue; - mod->BSIM4v6wk3bGiven = TRUE; - break; - case BSIM4v6_MOD_WLPE0: - mod->BSIM4v6wlpe0 = value->rValue; - mod->BSIM4v6wlpe0Given = TRUE; - break; - case BSIM4v6_MOD_WLPEB: - mod->BSIM4v6wlpeb = value->rValue; - mod->BSIM4v6wlpebGiven = TRUE; - break; - case BSIM4v6_MOD_WDVTP0: - mod->BSIM4v6wdvtp0 = value->rValue; - mod->BSIM4v6wdvtp0Given = TRUE; - break; - case BSIM4v6_MOD_WDVTP1: - mod->BSIM4v6wdvtp1 = value->rValue; - mod->BSIM4v6wdvtp1Given = TRUE; - break; - case BSIM4v6_MOD_WW0: - mod->BSIM4v6ww0 = value->rValue; - mod->BSIM4v6ww0Given = TRUE; - break; - case BSIM4v6_MOD_WDVT0: - mod->BSIM4v6wdvt0 = value->rValue; - mod->BSIM4v6wdvt0Given = TRUE; - break; - case BSIM4v6_MOD_WDVT1: - mod->BSIM4v6wdvt1 = value->rValue; - mod->BSIM4v6wdvt1Given = TRUE; - break; - case BSIM4v6_MOD_WDVT2: - mod->BSIM4v6wdvt2 = value->rValue; - mod->BSIM4v6wdvt2Given = TRUE; - break; - case BSIM4v6_MOD_WDVT0W: - mod->BSIM4v6wdvt0w = value->rValue; - mod->BSIM4v6wdvt0wGiven = TRUE; - break; - case BSIM4v6_MOD_WDVT1W: - mod->BSIM4v6wdvt1w = value->rValue; - mod->BSIM4v6wdvt1wGiven = TRUE; - break; - case BSIM4v6_MOD_WDVT2W: - mod->BSIM4v6wdvt2w = value->rValue; - mod->BSIM4v6wdvt2wGiven = TRUE; - break; - case BSIM4v6_MOD_WDROUT: - mod->BSIM4v6wdrout = value->rValue; - mod->BSIM4v6wdroutGiven = TRUE; - break; - case BSIM4v6_MOD_WDSUB: - mod->BSIM4v6wdsub = value->rValue; - mod->BSIM4v6wdsubGiven = TRUE; - break; - case BSIM4v6_MOD_WVTH0: - mod->BSIM4v6wvth0 = value->rValue; - mod->BSIM4v6wvth0Given = TRUE; - break; - case BSIM4v6_MOD_WUA: - mod->BSIM4v6wua = value->rValue; - mod->BSIM4v6wuaGiven = TRUE; - break; - case BSIM4v6_MOD_WUA1: - mod->BSIM4v6wua1 = value->rValue; - mod->BSIM4v6wua1Given = TRUE; - break; - case BSIM4v6_MOD_WUB: - mod->BSIM4v6wub = value->rValue; - mod->BSIM4v6wubGiven = TRUE; - break; - case BSIM4v6_MOD_WUB1: - mod->BSIM4v6wub1 = value->rValue; - mod->BSIM4v6wub1Given = TRUE; - break; - case BSIM4v6_MOD_WUC: - mod->BSIM4v6wuc = value->rValue; - mod->BSIM4v6wucGiven = TRUE; - break; - case BSIM4v6_MOD_WUC1: - mod->BSIM4v6wuc1 = value->rValue; - mod->BSIM4v6wuc1Given = TRUE; - break; - case BSIM4v6_MOD_WU0 : - mod->BSIM4v6wu0 = value->rValue; - mod->BSIM4v6wu0Given = TRUE; - break; - case BSIM4v6_MOD_WUTE : - mod->BSIM4v6wute = value->rValue; - mod->BSIM4v6wuteGiven = TRUE; - break; - case BSIM4v6_MOD_WUCSTE : - mod->BSIM4v6wucste = value->rValue; - mod->BSIM4v6wucsteGiven = TRUE; - break; - case BSIM4v6_MOD_WVOFF: - mod->BSIM4v6wvoff = value->rValue; - mod->BSIM4v6wvoffGiven = TRUE; - break; - case BSIM4v6_MOD_WTVOFF: - mod->BSIM4v6wtvoff = value->rValue; - mod->BSIM4v6wtvoffGiven = TRUE; - break; - case BSIM4v6_MOD_WMINV: - mod->BSIM4v6wminv = value->rValue; - mod->BSIM4v6wminvGiven = TRUE; - break; - case BSIM4v6_MOD_WMINVCV: - mod->BSIM4v6wminvcv = value->rValue; - mod->BSIM4v6wminvcvGiven = TRUE; - break; - case BSIM4v6_MOD_WFPROUT: - mod->BSIM4v6wfprout = value->rValue; - mod->BSIM4v6wfproutGiven = TRUE; - break; - case BSIM4v6_MOD_WPDITS: - mod->BSIM4v6wpdits = value->rValue; - mod->BSIM4v6wpditsGiven = TRUE; - break; - case BSIM4v6_MOD_WPDITSD: - mod->BSIM4v6wpditsd = value->rValue; - mod->BSIM4v6wpditsdGiven = TRUE; - break; - case BSIM4v6_MOD_WDELTA : - mod->BSIM4v6wdelta = value->rValue; - mod->BSIM4v6wdeltaGiven = TRUE; - break; - case BSIM4v6_MOD_WRDSW: - mod->BSIM4v6wrdsw = value->rValue; - mod->BSIM4v6wrdswGiven = TRUE; - break; - case BSIM4v6_MOD_WRDW: - mod->BSIM4v6wrdw = value->rValue; - mod->BSIM4v6wrdwGiven = TRUE; - break; - case BSIM4v6_MOD_WRSW: - mod->BSIM4v6wrsw = value->rValue; - mod->BSIM4v6wrswGiven = TRUE; - break; - case BSIM4v6_MOD_WPRWB: - mod->BSIM4v6wprwb = value->rValue; - mod->BSIM4v6wprwbGiven = TRUE; - break; - case BSIM4v6_MOD_WPRWG: - mod->BSIM4v6wprwg = value->rValue; - mod->BSIM4v6wprwgGiven = TRUE; - break; - case BSIM4v6_MOD_WPRT: - mod->BSIM4v6wprt = value->rValue; - mod->BSIM4v6wprtGiven = TRUE; - break; - case BSIM4v6_MOD_WETA0: - mod->BSIM4v6weta0 = value->rValue; - mod->BSIM4v6weta0Given = TRUE; - break; - case BSIM4v6_MOD_WETAB: - mod->BSIM4v6wetab = value->rValue; - mod->BSIM4v6wetabGiven = TRUE; - break; - case BSIM4v6_MOD_WPCLM: - mod->BSIM4v6wpclm = value->rValue; - mod->BSIM4v6wpclmGiven = TRUE; - break; - case BSIM4v6_MOD_WPDIBL1: - mod->BSIM4v6wpdibl1 = value->rValue; - mod->BSIM4v6wpdibl1Given = TRUE; - break; - case BSIM4v6_MOD_WPDIBL2: - mod->BSIM4v6wpdibl2 = value->rValue; - mod->BSIM4v6wpdibl2Given = TRUE; - break; - case BSIM4v6_MOD_WPDIBLB: - mod->BSIM4v6wpdiblb = value->rValue; - mod->BSIM4v6wpdiblbGiven = TRUE; - break; - case BSIM4v6_MOD_WPSCBE1: - mod->BSIM4v6wpscbe1 = value->rValue; - mod->BSIM4v6wpscbe1Given = TRUE; - break; - case BSIM4v6_MOD_WPSCBE2: - mod->BSIM4v6wpscbe2 = value->rValue; - mod->BSIM4v6wpscbe2Given = TRUE; - break; - case BSIM4v6_MOD_WPVAG: - mod->BSIM4v6wpvag = value->rValue; - mod->BSIM4v6wpvagGiven = TRUE; - break; - case BSIM4v6_MOD_WWR : - mod->BSIM4v6wwr = value->rValue; - mod->BSIM4v6wwrGiven = TRUE; - break; - case BSIM4v6_MOD_WDWG : - mod->BSIM4v6wdwg = value->rValue; - mod->BSIM4v6wdwgGiven = TRUE; - break; - case BSIM4v6_MOD_WDWB : - mod->BSIM4v6wdwb = value->rValue; - mod->BSIM4v6wdwbGiven = TRUE; - break; - case BSIM4v6_MOD_WB0 : - mod->BSIM4v6wb0 = value->rValue; - mod->BSIM4v6wb0Given = TRUE; - break; - case BSIM4v6_MOD_WB1 : - mod->BSIM4v6wb1 = value->rValue; - mod->BSIM4v6wb1Given = TRUE; - break; - case BSIM4v6_MOD_WALPHA0 : - mod->BSIM4v6walpha0 = value->rValue; - mod->BSIM4v6walpha0Given = TRUE; - break; - case BSIM4v6_MOD_WALPHA1 : - mod->BSIM4v6walpha1 = value->rValue; - mod->BSIM4v6walpha1Given = TRUE; - break; - case BSIM4v6_MOD_WBETA0 : - mod->BSIM4v6wbeta0 = value->rValue; - mod->BSIM4v6wbeta0Given = TRUE; - break; - case BSIM4v6_MOD_WPHIN : - mod->BSIM4v6wphin = value->rValue; - mod->BSIM4v6wphinGiven = TRUE; - break; - case BSIM4v6_MOD_WAGIDL : - mod->BSIM4v6wagidl = value->rValue; - mod->BSIM4v6wagidlGiven = TRUE; - break; - case BSIM4v6_MOD_WBGIDL : - mod->BSIM4v6wbgidl = value->rValue; - mod->BSIM4v6wbgidlGiven = TRUE; - break; - case BSIM4v6_MOD_WCGIDL : - mod->BSIM4v6wcgidl = value->rValue; - mod->BSIM4v6wcgidlGiven = TRUE; - break; - case BSIM4v6_MOD_WEGIDL : - mod->BSIM4v6wegidl = value->rValue; - mod->BSIM4v6wegidlGiven = TRUE; - break; - case BSIM4v6_MOD_WAGISL : - mod->BSIM4v6wagisl = value->rValue; - mod->BSIM4v6wagislGiven = TRUE; - break; - case BSIM4v6_MOD_WBGISL : - mod->BSIM4v6wbgisl = value->rValue; - mod->BSIM4v6wbgislGiven = TRUE; - break; - case BSIM4v6_MOD_WCGISL : - mod->BSIM4v6wcgisl = value->rValue; - mod->BSIM4v6wcgislGiven = TRUE; - break; - case BSIM4v6_MOD_WEGISL : - mod->BSIM4v6wegisl = value->rValue; - mod->BSIM4v6wegislGiven = TRUE; - break; - case BSIM4v6_MOD_WAIGC : - mod->BSIM4v6waigc = value->rValue; - mod->BSIM4v6waigcGiven = TRUE; - break; - case BSIM4v6_MOD_WBIGC : - mod->BSIM4v6wbigc = value->rValue; - mod->BSIM4v6wbigcGiven = TRUE; - break; - case BSIM4v6_MOD_WCIGC : - mod->BSIM4v6wcigc = value->rValue; - mod->BSIM4v6wcigcGiven = TRUE; - break; - case BSIM4v6_MOD_WAIGSD : - mod->BSIM4v6waigsd = value->rValue; - mod->BSIM4v6waigsdGiven = TRUE; - break; - case BSIM4v6_MOD_WBIGSD : - mod->BSIM4v6wbigsd = value->rValue; - mod->BSIM4v6wbigsdGiven = TRUE; - break; - case BSIM4v6_MOD_WCIGSD : - mod->BSIM4v6wcigsd = value->rValue; - mod->BSIM4v6wcigsdGiven = TRUE; - break; - case BSIM4v6_MOD_WAIGS : - mod->BSIM4v6waigs = value->rValue; - mod->BSIM4v6waigsGiven = TRUE; - break; - case BSIM4v6_MOD_WBIGS : - mod->BSIM4v6wbigs = value->rValue; - mod->BSIM4v6wbigsGiven = TRUE; - break; - case BSIM4v6_MOD_WCIGS : - mod->BSIM4v6wcigs = value->rValue; - mod->BSIM4v6wcigsGiven = TRUE; - break; - case BSIM4v6_MOD_WAIGD : - mod->BSIM4v6waigd = value->rValue; - mod->BSIM4v6waigdGiven = TRUE; - break; - case BSIM4v6_MOD_WBIGD : - mod->BSIM4v6wbigd = value->rValue; - mod->BSIM4v6wbigdGiven = TRUE; - break; - case BSIM4v6_MOD_WCIGD : - mod->BSIM4v6wcigd = value->rValue; - mod->BSIM4v6wcigdGiven = TRUE; - break; - case BSIM4v6_MOD_WAIGBACC : - mod->BSIM4v6waigbacc = value->rValue; - mod->BSIM4v6waigbaccGiven = TRUE; - break; - case BSIM4v6_MOD_WBIGBACC : - mod->BSIM4v6wbigbacc = value->rValue; - mod->BSIM4v6wbigbaccGiven = TRUE; - break; - case BSIM4v6_MOD_WCIGBACC : - mod->BSIM4v6wcigbacc = value->rValue; - mod->BSIM4v6wcigbaccGiven = TRUE; - break; - case BSIM4v6_MOD_WAIGBINV : - mod->BSIM4v6waigbinv = value->rValue; - mod->BSIM4v6waigbinvGiven = TRUE; - break; - case BSIM4v6_MOD_WBIGBINV : - mod->BSIM4v6wbigbinv = value->rValue; - mod->BSIM4v6wbigbinvGiven = TRUE; - break; - case BSIM4v6_MOD_WCIGBINV : - mod->BSIM4v6wcigbinv = value->rValue; - mod->BSIM4v6wcigbinvGiven = TRUE; - break; - case BSIM4v6_MOD_WNIGC : - mod->BSIM4v6wnigc = value->rValue; - mod->BSIM4v6wnigcGiven = TRUE; - break; - case BSIM4v6_MOD_WNIGBINV : - mod->BSIM4v6wnigbinv = value->rValue; - mod->BSIM4v6wnigbinvGiven = TRUE; - break; - case BSIM4v6_MOD_WNIGBACC : - mod->BSIM4v6wnigbacc = value->rValue; - mod->BSIM4v6wnigbaccGiven = TRUE; - break; - case BSIM4v6_MOD_WNTOX : - mod->BSIM4v6wntox = value->rValue; - mod->BSIM4v6wntoxGiven = TRUE; - break; - case BSIM4v6_MOD_WEIGBINV : - mod->BSIM4v6weigbinv = value->rValue; - mod->BSIM4v6weigbinvGiven = TRUE; - break; - case BSIM4v6_MOD_WPIGCD : - mod->BSIM4v6wpigcd = value->rValue; - mod->BSIM4v6wpigcdGiven = TRUE; - break; - case BSIM4v6_MOD_WPOXEDGE : - mod->BSIM4v6wpoxedge = value->rValue; - mod->BSIM4v6wpoxedgeGiven = TRUE; - break; - case BSIM4v6_MOD_WXRCRG1 : - mod->BSIM4v6wxrcrg1 = value->rValue; - mod->BSIM4v6wxrcrg1Given = TRUE; - break; - case BSIM4v6_MOD_WXRCRG2 : - mod->BSIM4v6wxrcrg2 = value->rValue; - mod->BSIM4v6wxrcrg2Given = TRUE; - break; - case BSIM4v6_MOD_WLAMBDA : - mod->BSIM4v6wlambda = value->rValue; - mod->BSIM4v6wlambdaGiven = TRUE; - break; - case BSIM4v6_MOD_WVTL : - mod->BSIM4v6wvtl = value->rValue; - mod->BSIM4v6wvtlGiven = TRUE; - break; - case BSIM4v6_MOD_WXN: - mod->BSIM4v6wxn = value->rValue; - mod->BSIM4v6wxnGiven = TRUE; - break; - case BSIM4v6_MOD_WVFBSDOFF: - mod->BSIM4v6wvfbsdoff = value->rValue; - mod->BSIM4v6wvfbsdoffGiven = TRUE; - break; - case BSIM4v6_MOD_WTVFBSDOFF: - mod->BSIM4v6wtvfbsdoff = value->rValue; - mod->BSIM4v6wtvfbsdoffGiven = TRUE; - break; - case BSIM4v6_MOD_WEU : - mod->BSIM4v6weu = value->rValue; - mod->BSIM4v6weuGiven = TRUE; - break; - case BSIM4v6_MOD_WUCS : - mod->BSIM4v6wucs = value->rValue; - mod->BSIM4v6wucsGiven = TRUE; - break; - case BSIM4v6_MOD_WVFB : - mod->BSIM4v6wvfb = value->rValue; - mod->BSIM4v6wvfbGiven = TRUE; - break; - case BSIM4v6_MOD_WCGSL : - mod->BSIM4v6wcgsl = value->rValue; - mod->BSIM4v6wcgslGiven = TRUE; - break; - case BSIM4v6_MOD_WCGDL : - mod->BSIM4v6wcgdl = value->rValue; - mod->BSIM4v6wcgdlGiven = TRUE; - break; - case BSIM4v6_MOD_WCKAPPAS : - mod->BSIM4v6wckappas = value->rValue; - mod->BSIM4v6wckappasGiven = TRUE; - break; - case BSIM4v6_MOD_WCKAPPAD : - mod->BSIM4v6wckappad = value->rValue; - mod->BSIM4v6wckappadGiven = TRUE; - break; - case BSIM4v6_MOD_WCF : - mod->BSIM4v6wcf = value->rValue; - mod->BSIM4v6wcfGiven = TRUE; - break; - case BSIM4v6_MOD_WCLC : - mod->BSIM4v6wclc = value->rValue; - mod->BSIM4v6wclcGiven = TRUE; - break; - case BSIM4v6_MOD_WCLE : - mod->BSIM4v6wcle = value->rValue; - mod->BSIM4v6wcleGiven = TRUE; - break; - case BSIM4v6_MOD_WVFBCV : - mod->BSIM4v6wvfbcv = value->rValue; - mod->BSIM4v6wvfbcvGiven = TRUE; - break; - case BSIM4v6_MOD_WACDE : - mod->BSIM4v6wacde = value->rValue; - mod->BSIM4v6wacdeGiven = TRUE; - break; - case BSIM4v6_MOD_WMOIN : - mod->BSIM4v6wmoin = value->rValue; - mod->BSIM4v6wmoinGiven = TRUE; - break; - case BSIM4v6_MOD_WNOFF : - mod->BSIM4v6wnoff = value->rValue; - mod->BSIM4v6wnoffGiven = TRUE; - break; - case BSIM4v6_MOD_WVOFFCV : - mod->BSIM4v6wvoffcv = value->rValue; - mod->BSIM4v6wvoffcvGiven = TRUE; - break; - - /* Cross-term dependence */ - case BSIM4v6_MOD_PCDSC : - mod->BSIM4v6pcdsc = value->rValue; - mod->BSIM4v6pcdscGiven = TRUE; - break; - - - case BSIM4v6_MOD_PCDSCB : - mod->BSIM4v6pcdscb = value->rValue; - mod->BSIM4v6pcdscbGiven = TRUE; - break; - case BSIM4v6_MOD_PCDSCD : - mod->BSIM4v6pcdscd = value->rValue; - mod->BSIM4v6pcdscdGiven = TRUE; - break; - case BSIM4v6_MOD_PCIT : - mod->BSIM4v6pcit = value->rValue; - mod->BSIM4v6pcitGiven = TRUE; - break; - case BSIM4v6_MOD_PNFACTOR : - mod->BSIM4v6pnfactor = value->rValue; - mod->BSIM4v6pnfactorGiven = TRUE; - break; - case BSIM4v6_MOD_PXJ: - mod->BSIM4v6pxj = value->rValue; - mod->BSIM4v6pxjGiven = TRUE; - break; - case BSIM4v6_MOD_PVSAT: - mod->BSIM4v6pvsat = value->rValue; - mod->BSIM4v6pvsatGiven = TRUE; - break; - - - case BSIM4v6_MOD_PA0: - mod->BSIM4v6pa0 = value->rValue; - mod->BSIM4v6pa0Given = TRUE; - break; - case BSIM4v6_MOD_PAGS: - mod->BSIM4v6pags = value->rValue; - mod->BSIM4v6pagsGiven = TRUE; - break; - case BSIM4v6_MOD_PA1: - mod->BSIM4v6pa1 = value->rValue; - mod->BSIM4v6pa1Given = TRUE; - break; - case BSIM4v6_MOD_PA2: - mod->BSIM4v6pa2 = value->rValue; - mod->BSIM4v6pa2Given = TRUE; - break; - case BSIM4v6_MOD_PAT: - mod->BSIM4v6pat = value->rValue; - mod->BSIM4v6patGiven = TRUE; - break; - case BSIM4v6_MOD_PKETA: - mod->BSIM4v6pketa = value->rValue; - mod->BSIM4v6pketaGiven = TRUE; - break; - case BSIM4v6_MOD_PNSUB: - mod->BSIM4v6pnsub = value->rValue; - mod->BSIM4v6pnsubGiven = TRUE; - break; - case BSIM4v6_MOD_PNDEP: - mod->BSIM4v6pndep = value->rValue; - mod->BSIM4v6pndepGiven = TRUE; - if (mod->BSIM4v6pndep > 1.0e20) - mod->BSIM4v6pndep *= 1.0e-6; - break; - case BSIM4v6_MOD_PNSD: - mod->BSIM4v6pnsd = value->rValue; - mod->BSIM4v6pnsdGiven = TRUE; - if (mod->BSIM4v6pnsd > 1.0e23) - mod->BSIM4v6pnsd *= 1.0e-6; - break; - case BSIM4v6_MOD_PNGATE: - mod->BSIM4v6pngate = value->rValue; - mod->BSIM4v6pngateGiven = TRUE; - if (mod->BSIM4v6pngate > 1.0e23) - mod->BSIM4v6pngate *= 1.0e-6; - break; - case BSIM4v6_MOD_PGAMMA1: - mod->BSIM4v6pgamma1 = value->rValue; - mod->BSIM4v6pgamma1Given = TRUE; - break; - case BSIM4v6_MOD_PGAMMA2: - mod->BSIM4v6pgamma2 = value->rValue; - mod->BSIM4v6pgamma2Given = TRUE; - break; - case BSIM4v6_MOD_PVBX: - mod->BSIM4v6pvbx = value->rValue; - mod->BSIM4v6pvbxGiven = TRUE; - break; - case BSIM4v6_MOD_PVBM: - mod->BSIM4v6pvbm = value->rValue; - mod->BSIM4v6pvbmGiven = TRUE; - break; - case BSIM4v6_MOD_PXT: - mod->BSIM4v6pxt = value->rValue; - mod->BSIM4v6pxtGiven = TRUE; - break; - case BSIM4v6_MOD_PK1: - mod->BSIM4v6pk1 = value->rValue; - mod->BSIM4v6pk1Given = TRUE; - break; - case BSIM4v6_MOD_PKT1: - mod->BSIM4v6pkt1 = value->rValue; - mod->BSIM4v6pkt1Given = TRUE; - break; - case BSIM4v6_MOD_PKT1L: - mod->BSIM4v6pkt1l = value->rValue; - mod->BSIM4v6pkt1lGiven = TRUE; - break; - case BSIM4v6_MOD_PKT2: - mod->BSIM4v6pkt2 = value->rValue; - mod->BSIM4v6pkt2Given = TRUE; - break; - case BSIM4v6_MOD_PK2: - mod->BSIM4v6pk2 = value->rValue; - mod->BSIM4v6pk2Given = TRUE; - break; - case BSIM4v6_MOD_PK3: - mod->BSIM4v6pk3 = value->rValue; - mod->BSIM4v6pk3Given = TRUE; - break; - case BSIM4v6_MOD_PK3B: - mod->BSIM4v6pk3b = value->rValue; - mod->BSIM4v6pk3bGiven = TRUE; - break; - case BSIM4v6_MOD_PLPE0: - mod->BSIM4v6plpe0 = value->rValue; - mod->BSIM4v6plpe0Given = TRUE; - break; - case BSIM4v6_MOD_PLPEB: - mod->BSIM4v6plpeb = value->rValue; - mod->BSIM4v6plpebGiven = TRUE; - break; - case BSIM4v6_MOD_PDVTP0: - mod->BSIM4v6pdvtp0 = value->rValue; - mod->BSIM4v6pdvtp0Given = TRUE; - break; - case BSIM4v6_MOD_PDVTP1: - mod->BSIM4v6pdvtp1 = value->rValue; - mod->BSIM4v6pdvtp1Given = TRUE; - break; - case BSIM4v6_MOD_PW0: - mod->BSIM4v6pw0 = value->rValue; - mod->BSIM4v6pw0Given = TRUE; - break; - case BSIM4v6_MOD_PDVT0: - mod->BSIM4v6pdvt0 = value->rValue; - mod->BSIM4v6pdvt0Given = TRUE; - break; - case BSIM4v6_MOD_PDVT1: - mod->BSIM4v6pdvt1 = value->rValue; - mod->BSIM4v6pdvt1Given = TRUE; - break; - case BSIM4v6_MOD_PDVT2: - mod->BSIM4v6pdvt2 = value->rValue; - mod->BSIM4v6pdvt2Given = TRUE; - break; - case BSIM4v6_MOD_PDVT0W: - mod->BSIM4v6pdvt0w = value->rValue; - mod->BSIM4v6pdvt0wGiven = TRUE; - break; - case BSIM4v6_MOD_PDVT1W: - mod->BSIM4v6pdvt1w = value->rValue; - mod->BSIM4v6pdvt1wGiven = TRUE; - break; - case BSIM4v6_MOD_PDVT2W: - mod->BSIM4v6pdvt2w = value->rValue; - mod->BSIM4v6pdvt2wGiven = TRUE; - break; - case BSIM4v6_MOD_PDROUT: - mod->BSIM4v6pdrout = value->rValue; - mod->BSIM4v6pdroutGiven = TRUE; - break; - case BSIM4v6_MOD_PDSUB: - mod->BSIM4v6pdsub = value->rValue; - mod->BSIM4v6pdsubGiven = TRUE; - break; - case BSIM4v6_MOD_PVTH0: - mod->BSIM4v6pvth0 = value->rValue; - mod->BSIM4v6pvth0Given = TRUE; - break; - case BSIM4v6_MOD_PUA: - mod->BSIM4v6pua = value->rValue; - mod->BSIM4v6puaGiven = TRUE; - break; - case BSIM4v6_MOD_PUA1: - mod->BSIM4v6pua1 = value->rValue; - mod->BSIM4v6pua1Given = TRUE; - break; - case BSIM4v6_MOD_PUB: - mod->BSIM4v6pub = value->rValue; - mod->BSIM4v6pubGiven = TRUE; - break; - case BSIM4v6_MOD_PUB1: - mod->BSIM4v6pub1 = value->rValue; - mod->BSIM4v6pub1Given = TRUE; - break; - case BSIM4v6_MOD_PUC: - mod->BSIM4v6puc = value->rValue; - mod->BSIM4v6pucGiven = TRUE; - break; - case BSIM4v6_MOD_PUC1: - mod->BSIM4v6puc1 = value->rValue; - mod->BSIM4v6puc1Given = TRUE; - break; - case BSIM4v6_MOD_PU0 : - mod->BSIM4v6pu0 = value->rValue; - mod->BSIM4v6pu0Given = TRUE; - break; - case BSIM4v6_MOD_PUTE : - mod->BSIM4v6pute = value->rValue; - mod->BSIM4v6puteGiven = TRUE; - break; - case BSIM4v6_MOD_PUCSTE : - mod->BSIM4v6pucste = value->rValue; - mod->BSIM4v6pucsteGiven = TRUE; - break; - case BSIM4v6_MOD_PVOFF: - mod->BSIM4v6pvoff = value->rValue; - mod->BSIM4v6pvoffGiven = TRUE; - break; - case BSIM4v6_MOD_PTVOFF: - mod->BSIM4v6ptvoff = value->rValue; - mod->BSIM4v6ptvoffGiven = TRUE; - break; - case BSIM4v6_MOD_PMINV: - mod->BSIM4v6pminv = value->rValue; - mod->BSIM4v6pminvGiven = TRUE; - break; - case BSIM4v6_MOD_PMINVCV: - mod->BSIM4v6pminvcv = value->rValue; - mod->BSIM4v6pminvcvGiven = TRUE; - break; - case BSIM4v6_MOD_PFPROUT: - mod->BSIM4v6pfprout = value->rValue; - mod->BSIM4v6pfproutGiven = TRUE; - break; - case BSIM4v6_MOD_PPDITS: - mod->BSIM4v6ppdits = value->rValue; - mod->BSIM4v6ppditsGiven = TRUE; - break; - case BSIM4v6_MOD_PPDITSD: - mod->BSIM4v6ppditsd = value->rValue; - mod->BSIM4v6ppditsdGiven = TRUE; - break; - case BSIM4v6_MOD_PDELTA : - mod->BSIM4v6pdelta = value->rValue; - mod->BSIM4v6pdeltaGiven = TRUE; - break; - case BSIM4v6_MOD_PRDSW: - mod->BSIM4v6prdsw = value->rValue; - mod->BSIM4v6prdswGiven = TRUE; - break; - case BSIM4v6_MOD_PRDW: - mod->BSIM4v6prdw = value->rValue; - mod->BSIM4v6prdwGiven = TRUE; - break; - case BSIM4v6_MOD_PRSW: - mod->BSIM4v6prsw = value->rValue; - mod->BSIM4v6prswGiven = TRUE; - break; - case BSIM4v6_MOD_PPRWB: - mod->BSIM4v6pprwb = value->rValue; - mod->BSIM4v6pprwbGiven = TRUE; - break; - case BSIM4v6_MOD_PPRWG: - mod->BSIM4v6pprwg = value->rValue; - mod->BSIM4v6pprwgGiven = TRUE; - break; - case BSIM4v6_MOD_PPRT: - mod->BSIM4v6pprt = value->rValue; - mod->BSIM4v6pprtGiven = TRUE; - break; - case BSIM4v6_MOD_PETA0: - mod->BSIM4v6peta0 = value->rValue; - mod->BSIM4v6peta0Given = TRUE; - break; - case BSIM4v6_MOD_PETAB: - mod->BSIM4v6petab = value->rValue; - mod->BSIM4v6petabGiven = TRUE; - break; - case BSIM4v6_MOD_PPCLM: - mod->BSIM4v6ppclm = value->rValue; - mod->BSIM4v6ppclmGiven = TRUE; - break; - case BSIM4v6_MOD_PPDIBL1: - mod->BSIM4v6ppdibl1 = value->rValue; - mod->BSIM4v6ppdibl1Given = TRUE; - break; - case BSIM4v6_MOD_PPDIBL2: - mod->BSIM4v6ppdibl2 = value->rValue; - mod->BSIM4v6ppdibl2Given = TRUE; - break; - case BSIM4v6_MOD_PPDIBLB: - mod->BSIM4v6ppdiblb = value->rValue; - mod->BSIM4v6ppdiblbGiven = TRUE; - break; - case BSIM4v6_MOD_PPSCBE1: - mod->BSIM4v6ppscbe1 = value->rValue; - mod->BSIM4v6ppscbe1Given = TRUE; - break; - case BSIM4v6_MOD_PPSCBE2: - mod->BSIM4v6ppscbe2 = value->rValue; - mod->BSIM4v6ppscbe2Given = TRUE; - break; - case BSIM4v6_MOD_PPVAG: - mod->BSIM4v6ppvag = value->rValue; - mod->BSIM4v6ppvagGiven = TRUE; - break; - case BSIM4v6_MOD_PWR : - mod->BSIM4v6pwr = value->rValue; - mod->BSIM4v6pwrGiven = TRUE; - break; - case BSIM4v6_MOD_PDWG : - mod->BSIM4v6pdwg = value->rValue; - mod->BSIM4v6pdwgGiven = TRUE; - break; - case BSIM4v6_MOD_PDWB : - mod->BSIM4v6pdwb = value->rValue; - mod->BSIM4v6pdwbGiven = TRUE; - break; - case BSIM4v6_MOD_PB0 : - mod->BSIM4v6pb0 = value->rValue; - mod->BSIM4v6pb0Given = TRUE; - break; - case BSIM4v6_MOD_PB1 : - mod->BSIM4v6pb1 = value->rValue; - mod->BSIM4v6pb1Given = TRUE; - break; - case BSIM4v6_MOD_PALPHA0 : - mod->BSIM4v6palpha0 = value->rValue; - mod->BSIM4v6palpha0Given = TRUE; - break; - case BSIM4v6_MOD_PALPHA1 : - mod->BSIM4v6palpha1 = value->rValue; - mod->BSIM4v6palpha1Given = TRUE; - break; - case BSIM4v6_MOD_PBETA0 : - mod->BSIM4v6pbeta0 = value->rValue; - mod->BSIM4v6pbeta0Given = TRUE; - break; - case BSIM4v6_MOD_PPHIN : - mod->BSIM4v6pphin = value->rValue; - mod->BSIM4v6pphinGiven = TRUE; - break; - case BSIM4v6_MOD_PAGIDL : - mod->BSIM4v6pagidl = value->rValue; - mod->BSIM4v6pagidlGiven = TRUE; - break; - case BSIM4v6_MOD_PBGIDL : - mod->BSIM4v6pbgidl = value->rValue; - mod->BSIM4v6pbgidlGiven = TRUE; - break; - case BSIM4v6_MOD_PCGIDL : - mod->BSIM4v6pcgidl = value->rValue; - mod->BSIM4v6pcgidlGiven = TRUE; - break; - case BSIM4v6_MOD_PEGIDL : - mod->BSIM4v6pegidl = value->rValue; - mod->BSIM4v6pegidlGiven = TRUE; - break; - case BSIM4v6_MOD_PAGISL : - mod->BSIM4v6pagisl = value->rValue; - mod->BSIM4v6pagislGiven = TRUE; - break; - case BSIM4v6_MOD_PBGISL : - mod->BSIM4v6pbgisl = value->rValue; - mod->BSIM4v6pbgislGiven = TRUE; - break; - case BSIM4v6_MOD_PCGISL : - mod->BSIM4v6pcgisl = value->rValue; - mod->BSIM4v6pcgislGiven = TRUE; - break; - case BSIM4v6_MOD_PEGISL : - mod->BSIM4v6pegisl = value->rValue; - mod->BSIM4v6pegislGiven = TRUE; - break; - case BSIM4v6_MOD_PAIGC : - mod->BSIM4v6paigc = value->rValue; - mod->BSIM4v6paigcGiven = TRUE; - break; - case BSIM4v6_MOD_PBIGC : - mod->BSIM4v6pbigc = value->rValue; - mod->BSIM4v6pbigcGiven = TRUE; - break; - case BSIM4v6_MOD_PCIGC : - mod->BSIM4v6pcigc = value->rValue; - mod->BSIM4v6pcigcGiven = TRUE; - break; - case BSIM4v6_MOD_PAIGSD : - mod->BSIM4v6paigsd = value->rValue; - mod->BSIM4v6paigsdGiven = TRUE; - break; - case BSIM4v6_MOD_PBIGSD : - mod->BSIM4v6pbigsd = value->rValue; - mod->BSIM4v6pbigsdGiven = TRUE; - break; - case BSIM4v6_MOD_PCIGSD : - mod->BSIM4v6pcigsd = value->rValue; - mod->BSIM4v6pcigsdGiven = TRUE; - break; - case BSIM4v6_MOD_PAIGS : - mod->BSIM4v6paigs = value->rValue; - mod->BSIM4v6paigsGiven = TRUE; - break; - case BSIM4v6_MOD_PBIGS : - mod->BSIM4v6pbigs = value->rValue; - mod->BSIM4v6pbigsGiven = TRUE; - break; - case BSIM4v6_MOD_PCIGS : - mod->BSIM4v6pcigs = value->rValue; - mod->BSIM4v6pcigsGiven = TRUE; - break; - case BSIM4v6_MOD_PAIGD : - mod->BSIM4v6paigd = value->rValue; - mod->BSIM4v6paigdGiven = TRUE; - break; - case BSIM4v6_MOD_PBIGD : - mod->BSIM4v6pbigd = value->rValue; - mod->BSIM4v6pbigdGiven = TRUE; - break; - case BSIM4v6_MOD_PCIGD : - mod->BSIM4v6pcigd = value->rValue; - mod->BSIM4v6pcigdGiven = TRUE; - break; - case BSIM4v6_MOD_PAIGBACC : - mod->BSIM4v6paigbacc = value->rValue; - mod->BSIM4v6paigbaccGiven = TRUE; - break; - case BSIM4v6_MOD_PBIGBACC : - mod->BSIM4v6pbigbacc = value->rValue; - mod->BSIM4v6pbigbaccGiven = TRUE; - break; - case BSIM4v6_MOD_PCIGBACC : - mod->BSIM4v6pcigbacc = value->rValue; - mod->BSIM4v6pcigbaccGiven = TRUE; - break; - case BSIM4v6_MOD_PAIGBINV : - mod->BSIM4v6paigbinv = value->rValue; - mod->BSIM4v6paigbinvGiven = TRUE; - break; - case BSIM4v6_MOD_PBIGBINV : - mod->BSIM4v6pbigbinv = value->rValue; - mod->BSIM4v6pbigbinvGiven = TRUE; - break; - case BSIM4v6_MOD_PCIGBINV : - mod->BSIM4v6pcigbinv = value->rValue; - mod->BSIM4v6pcigbinvGiven = TRUE; - break; - case BSIM4v6_MOD_PNIGC : - mod->BSIM4v6pnigc = value->rValue; - mod->BSIM4v6pnigcGiven = TRUE; - break; - case BSIM4v6_MOD_PNIGBINV : - mod->BSIM4v6pnigbinv = value->rValue; - mod->BSIM4v6pnigbinvGiven = TRUE; - break; - case BSIM4v6_MOD_PNIGBACC : - mod->BSIM4v6pnigbacc = value->rValue; - mod->BSIM4v6pnigbaccGiven = TRUE; - break; - case BSIM4v6_MOD_PNTOX : - mod->BSIM4v6pntox = value->rValue; - mod->BSIM4v6pntoxGiven = TRUE; - break; - case BSIM4v6_MOD_PEIGBINV : - mod->BSIM4v6peigbinv = value->rValue; - mod->BSIM4v6peigbinvGiven = TRUE; - break; - case BSIM4v6_MOD_PPIGCD : - mod->BSIM4v6ppigcd = value->rValue; - mod->BSIM4v6ppigcdGiven = TRUE; - break; - case BSIM4v6_MOD_PPOXEDGE : - mod->BSIM4v6ppoxedge = value->rValue; - mod->BSIM4v6ppoxedgeGiven = TRUE; - break; - case BSIM4v6_MOD_PXRCRG1 : - mod->BSIM4v6pxrcrg1 = value->rValue; - mod->BSIM4v6pxrcrg1Given = TRUE; - break; - case BSIM4v6_MOD_PXRCRG2 : - mod->BSIM4v6pxrcrg2 = value->rValue; - mod->BSIM4v6pxrcrg2Given = TRUE; - break; - case BSIM4v6_MOD_PLAMBDA : - mod->BSIM4v6plambda = value->rValue; - mod->BSIM4v6plambdaGiven = TRUE; - break; - case BSIM4v6_MOD_PVTL : - mod->BSIM4v6pvtl = value->rValue; - mod->BSIM4v6pvtlGiven = TRUE; - break; - case BSIM4v6_MOD_PXN: - mod->BSIM4v6pxn = value->rValue; - mod->BSIM4v6pxnGiven = TRUE; - break; - case BSIM4v6_MOD_PVFBSDOFF: - mod->BSIM4v6pvfbsdoff = value->rValue; - mod->BSIM4v6pvfbsdoffGiven = TRUE; - break; - case BSIM4v6_MOD_PTVFBSDOFF: - mod->BSIM4v6ptvfbsdoff = value->rValue; - mod->BSIM4v6ptvfbsdoffGiven = TRUE; - break; - case BSIM4v6_MOD_PEU : - mod->BSIM4v6peu = value->rValue; - mod->BSIM4v6peuGiven = TRUE; - break; - case BSIM4v6_MOD_PUCS : - mod->BSIM4v6pucs = value->rValue; - mod->BSIM4v6pucsGiven = TRUE; - break; - case BSIM4v6_MOD_PVFB : - mod->BSIM4v6pvfb = value->rValue; - mod->BSIM4v6pvfbGiven = TRUE; - break; - case BSIM4v6_MOD_PCGSL : - mod->BSIM4v6pcgsl = value->rValue; - mod->BSIM4v6pcgslGiven = TRUE; - break; - case BSIM4v6_MOD_PCGDL : - mod->BSIM4v6pcgdl = value->rValue; - mod->BSIM4v6pcgdlGiven = TRUE; - break; - case BSIM4v6_MOD_PCKAPPAS : - mod->BSIM4v6pckappas = value->rValue; - mod->BSIM4v6pckappasGiven = TRUE; - break; - case BSIM4v6_MOD_PCKAPPAD : - mod->BSIM4v6pckappad = value->rValue; - mod->BSIM4v6pckappadGiven = TRUE; - break; - case BSIM4v6_MOD_PCF : - mod->BSIM4v6pcf = value->rValue; - mod->BSIM4v6pcfGiven = TRUE; - break; - case BSIM4v6_MOD_PCLC : - mod->BSIM4v6pclc = value->rValue; - mod->BSIM4v6pclcGiven = TRUE; - break; - case BSIM4v6_MOD_PCLE : - mod->BSIM4v6pcle = value->rValue; - mod->BSIM4v6pcleGiven = TRUE; - break; - case BSIM4v6_MOD_PVFBCV : - mod->BSIM4v6pvfbcv = value->rValue; - mod->BSIM4v6pvfbcvGiven = TRUE; - break; - case BSIM4v6_MOD_PACDE : - mod->BSIM4v6pacde = value->rValue; - mod->BSIM4v6pacdeGiven = TRUE; - break; - case BSIM4v6_MOD_PMOIN : - mod->BSIM4v6pmoin = value->rValue; - mod->BSIM4v6pmoinGiven = TRUE; - break; - case BSIM4v6_MOD_PNOFF : - mod->BSIM4v6pnoff = value->rValue; - mod->BSIM4v6pnoffGiven = TRUE; - break; - case BSIM4v6_MOD_PVOFFCV : - mod->BSIM4v6pvoffcv = value->rValue; - mod->BSIM4v6pvoffcvGiven = TRUE; - break; - - case BSIM4v6_MOD_TNOM : - mod->BSIM4v6tnom = value->rValue + CONSTCtoK; - mod->BSIM4v6tnomGiven = TRUE; - break; - case BSIM4v6_MOD_CGSO : - mod->BSIM4v6cgso = value->rValue; - mod->BSIM4v6cgsoGiven = TRUE; - break; - case BSIM4v6_MOD_CGDO : - mod->BSIM4v6cgdo = value->rValue; - mod->BSIM4v6cgdoGiven = TRUE; - break; - case BSIM4v6_MOD_CGBO : - mod->BSIM4v6cgbo = value->rValue; - mod->BSIM4v6cgboGiven = TRUE; - break; - case BSIM4v6_MOD_XPART : - mod->BSIM4v6xpart = value->rValue; - mod->BSIM4v6xpartGiven = TRUE; - break; - case BSIM4v6_MOD_RSH : - mod->BSIM4v6sheetResistance = value->rValue; - mod->BSIM4v6sheetResistanceGiven = TRUE; - break; - case BSIM4v6_MOD_JSS : - mod->BSIM4v6SjctSatCurDensity = value->rValue; - mod->BSIM4v6SjctSatCurDensityGiven = TRUE; - break; - case BSIM4v6_MOD_JSWS : - mod->BSIM4v6SjctSidewallSatCurDensity = value->rValue; - mod->BSIM4v6SjctSidewallSatCurDensityGiven = TRUE; - break; - case BSIM4v6_MOD_JSWGS : - mod->BSIM4v6SjctGateSidewallSatCurDensity = value->rValue; - mod->BSIM4v6SjctGateSidewallSatCurDensityGiven = TRUE; - break; - case BSIM4v6_MOD_PBS : - mod->BSIM4v6SbulkJctPotential = value->rValue; - mod->BSIM4v6SbulkJctPotentialGiven = TRUE; - break; - case BSIM4v6_MOD_MJS : - mod->BSIM4v6SbulkJctBotGradingCoeff = value->rValue; - mod->BSIM4v6SbulkJctBotGradingCoeffGiven = TRUE; - break; - case BSIM4v6_MOD_PBSWS : - mod->BSIM4v6SsidewallJctPotential = value->rValue; - mod->BSIM4v6SsidewallJctPotentialGiven = TRUE; - break; - case BSIM4v6_MOD_MJSWS : - mod->BSIM4v6SbulkJctSideGradingCoeff = value->rValue; - mod->BSIM4v6SbulkJctSideGradingCoeffGiven = TRUE; - break; - case BSIM4v6_MOD_CJS : - mod->BSIM4v6SunitAreaJctCap = value->rValue; - mod->BSIM4v6SunitAreaJctCapGiven = TRUE; - break; - case BSIM4v6_MOD_CJSWS : - mod->BSIM4v6SunitLengthSidewallJctCap = value->rValue; - mod->BSIM4v6SunitLengthSidewallJctCapGiven = TRUE; - break; - case BSIM4v6_MOD_NJS : - mod->BSIM4v6SjctEmissionCoeff = value->rValue; - mod->BSIM4v6SjctEmissionCoeffGiven = TRUE; - break; - case BSIM4v6_MOD_PBSWGS : - mod->BSIM4v6SGatesidewallJctPotential = value->rValue; - mod->BSIM4v6SGatesidewallJctPotentialGiven = TRUE; - break; - case BSIM4v6_MOD_MJSWGS : - mod->BSIM4v6SbulkJctGateSideGradingCoeff = value->rValue; - mod->BSIM4v6SbulkJctGateSideGradingCoeffGiven = TRUE; - break; - case BSIM4v6_MOD_CJSWGS : - mod->BSIM4v6SunitLengthGateSidewallJctCap = value->rValue; - mod->BSIM4v6SunitLengthGateSidewallJctCapGiven = TRUE; - break; - case BSIM4v6_MOD_XTIS : - mod->BSIM4v6SjctTempExponent = value->rValue; - mod->BSIM4v6SjctTempExponentGiven = TRUE; - break; - case BSIM4v6_MOD_JSD : - mod->BSIM4v6DjctSatCurDensity = value->rValue; - mod->BSIM4v6DjctSatCurDensityGiven = TRUE; - break; - case BSIM4v6_MOD_JSWD : - mod->BSIM4v6DjctSidewallSatCurDensity = value->rValue; - mod->BSIM4v6DjctSidewallSatCurDensityGiven = TRUE; - break; - case BSIM4v6_MOD_JSWGD : - mod->BSIM4v6DjctGateSidewallSatCurDensity = value->rValue; - mod->BSIM4v6DjctGateSidewallSatCurDensityGiven = TRUE; - break; - case BSIM4v6_MOD_PBD : - mod->BSIM4v6DbulkJctPotential = value->rValue; - mod->BSIM4v6DbulkJctPotentialGiven = TRUE; - break; - case BSIM4v6_MOD_MJD : - mod->BSIM4v6DbulkJctBotGradingCoeff = value->rValue; - mod->BSIM4v6DbulkJctBotGradingCoeffGiven = TRUE; - break; - case BSIM4v6_MOD_PBSWD : - mod->BSIM4v6DsidewallJctPotential = value->rValue; - mod->BSIM4v6DsidewallJctPotentialGiven = TRUE; - break; - case BSIM4v6_MOD_MJSWD : - mod->BSIM4v6DbulkJctSideGradingCoeff = value->rValue; - mod->BSIM4v6DbulkJctSideGradingCoeffGiven = TRUE; - break; - case BSIM4v6_MOD_CJD : - mod->BSIM4v6DunitAreaJctCap = value->rValue; - mod->BSIM4v6DunitAreaJctCapGiven = TRUE; - break; - case BSIM4v6_MOD_CJSWD : - mod->BSIM4v6DunitLengthSidewallJctCap = value->rValue; - mod->BSIM4v6DunitLengthSidewallJctCapGiven = TRUE; - break; - case BSIM4v6_MOD_NJD : - mod->BSIM4v6DjctEmissionCoeff = value->rValue; - mod->BSIM4v6DjctEmissionCoeffGiven = TRUE; - break; - case BSIM4v6_MOD_PBSWGD : - mod->BSIM4v6DGatesidewallJctPotential = value->rValue; - mod->BSIM4v6DGatesidewallJctPotentialGiven = TRUE; - break; - case BSIM4v6_MOD_MJSWGD : - mod->BSIM4v6DbulkJctGateSideGradingCoeff = value->rValue; - mod->BSIM4v6DbulkJctGateSideGradingCoeffGiven = TRUE; - break; - case BSIM4v6_MOD_CJSWGD : - mod->BSIM4v6DunitLengthGateSidewallJctCap = value->rValue; - mod->BSIM4v6DunitLengthGateSidewallJctCapGiven = TRUE; - break; - case BSIM4v6_MOD_XTID : - mod->BSIM4v6DjctTempExponent = value->rValue; - mod->BSIM4v6DjctTempExponentGiven = TRUE; - break; - case BSIM4v6_MOD_LINT : - mod->BSIM4v6Lint = value->rValue; - mod->BSIM4v6LintGiven = TRUE; - break; - case BSIM4v6_MOD_LL : - mod->BSIM4v6Ll = value->rValue; - mod->BSIM4v6LlGiven = TRUE; - break; - case BSIM4v6_MOD_LLC : - mod->BSIM4v6Llc = value->rValue; - mod->BSIM4v6LlcGiven = TRUE; - break; - case BSIM4v6_MOD_LLN : - mod->BSIM4v6Lln = value->rValue; - mod->BSIM4v6LlnGiven = TRUE; - break; - case BSIM4v6_MOD_LW : - mod->BSIM4v6Lw = value->rValue; - mod->BSIM4v6LwGiven = TRUE; - break; - case BSIM4v6_MOD_LWC : - mod->BSIM4v6Lwc = value->rValue; - mod->BSIM4v6LwcGiven = TRUE; - break; - case BSIM4v6_MOD_LWN : - mod->BSIM4v6Lwn = value->rValue; - mod->BSIM4v6LwnGiven = TRUE; - break; - case BSIM4v6_MOD_LWL : - mod->BSIM4v6Lwl = value->rValue; - mod->BSIM4v6LwlGiven = TRUE; - break; - case BSIM4v6_MOD_LWLC : - mod->BSIM4v6Lwlc = value->rValue; - mod->BSIM4v6LwlcGiven = TRUE; - break; - case BSIM4v6_MOD_LMIN : - mod->BSIM4v6Lmin = value->rValue; - mod->BSIM4v6LminGiven = TRUE; - break; - case BSIM4v6_MOD_LMAX : - mod->BSIM4v6Lmax = value->rValue; - mod->BSIM4v6LmaxGiven = TRUE; - break; - case BSIM4v6_MOD_WINT : - mod->BSIM4v6Wint = value->rValue; - mod->BSIM4v6WintGiven = TRUE; - break; - case BSIM4v6_MOD_WL : - mod->BSIM4v6Wl = value->rValue; - mod->BSIM4v6WlGiven = TRUE; - break; - case BSIM4v6_MOD_WLC : - mod->BSIM4v6Wlc = value->rValue; - mod->BSIM4v6WlcGiven = TRUE; - break; - case BSIM4v6_MOD_WLN : - mod->BSIM4v6Wln = value->rValue; - mod->BSIM4v6WlnGiven = TRUE; - break; - case BSIM4v6_MOD_WW : - mod->BSIM4v6Ww = value->rValue; - mod->BSIM4v6WwGiven = TRUE; - break; - case BSIM4v6_MOD_WWC : - mod->BSIM4v6Wwc = value->rValue; - mod->BSIM4v6WwcGiven = TRUE; - break; - case BSIM4v6_MOD_WWN : - mod->BSIM4v6Wwn = value->rValue; - mod->BSIM4v6WwnGiven = TRUE; - break; - case BSIM4v6_MOD_WWL : - mod->BSIM4v6Wwl = value->rValue; - mod->BSIM4v6WwlGiven = TRUE; - break; - case BSIM4v6_MOD_WWLC : - mod->BSIM4v6Wwlc = value->rValue; - mod->BSIM4v6WwlcGiven = TRUE; - break; - case BSIM4v6_MOD_WMIN : - mod->BSIM4v6Wmin = value->rValue; - mod->BSIM4v6WminGiven = TRUE; - break; - case BSIM4v6_MOD_WMAX : - mod->BSIM4v6Wmax = value->rValue; - mod->BSIM4v6WmaxGiven = TRUE; - break; - - case BSIM4v6_MOD_NOIA : - mod->BSIM4v6oxideTrapDensityA = value->rValue; - mod->BSIM4v6oxideTrapDensityAGiven = TRUE; - break; - case BSIM4v6_MOD_NOIB : - mod->BSIM4v6oxideTrapDensityB = value->rValue; - mod->BSIM4v6oxideTrapDensityBGiven = TRUE; - break; - case BSIM4v6_MOD_NOIC : - mod->BSIM4v6oxideTrapDensityC = value->rValue; - mod->BSIM4v6oxideTrapDensityCGiven = TRUE; - break; - case BSIM4v6_MOD_EM : - mod->BSIM4v6em = value->rValue; - mod->BSIM4v6emGiven = TRUE; - break; - case BSIM4v6_MOD_EF : - mod->BSIM4v6ef = value->rValue; - mod->BSIM4v6efGiven = TRUE; - break; - case BSIM4v6_MOD_AF : - mod->BSIM4v6af = value->rValue; - mod->BSIM4v6afGiven = TRUE; - break; - case BSIM4v6_MOD_KF : - mod->BSIM4v6kf = value->rValue; - mod->BSIM4v6kfGiven = TRUE; - break; - case BSIM4v6_MOD_VGS_MAX: - mod->BSIM4v6vgsMax = value->rValue; - mod->BSIM4v6vgsMaxGiven = TRUE; - break; - case BSIM4v6_MOD_VGD_MAX: - mod->BSIM4v6vgdMax = value->rValue; - mod->BSIM4v6vgdMaxGiven = TRUE; - break; - case BSIM4v6_MOD_VGB_MAX: - mod->BSIM4v6vgbMax = value->rValue; - mod->BSIM4v6vgbMaxGiven = TRUE; - break; - case BSIM4v6_MOD_VDS_MAX: - mod->BSIM4v6vdsMax = value->rValue; - mod->BSIM4v6vdsMaxGiven = TRUE; - break; - case BSIM4v6_MOD_VBS_MAX: - mod->BSIM4v6vbsMax = value->rValue; - mod->BSIM4v6vbsMaxGiven = TRUE; - break; - case BSIM4v6_MOD_VBD_MAX: - mod->BSIM4v6vbdMax = value->rValue; - mod->BSIM4v6vbdMaxGiven = TRUE; - break; - case BSIM4v6_MOD_VGSR_MAX: - mod->BSIM4v6vgsrMax = value->rValue; - mod->BSIM4v6vgsrMaxGiven = TRUE; - break; - case BSIM4v6_MOD_VGDR_MAX: - mod->BSIM4v6vgdrMax = value->rValue; - mod->BSIM4v6vgdrMaxGiven = TRUE; - break; - case BSIM4v6_MOD_VGBR_MAX: - mod->BSIM4v6vgbrMax = value->rValue; - mod->BSIM4v6vgbrMaxGiven = TRUE; - break; - case BSIM4v6_MOD_VBSR_MAX: - mod->BSIM4v6vbsrMax = value->rValue; - mod->BSIM4v6vbsrMaxGiven = TRUE; - break; - case BSIM4v6_MOD_VBDR_MAX: - mod->BSIM4v6vbdrMax = value->rValue; - mod->BSIM4v6vbdrMaxGiven = TRUE; - break; - - case BSIM4v6_MOD_NMOS : - if(value->iValue) { - mod->BSIM4v6type = 1; - mod->BSIM4v6typeGiven = TRUE; - } - break; - case BSIM4v6_MOD_PMOS : - if(value->iValue) { - mod->BSIM4v6type = - 1; - mod->BSIM4v6typeGiven = TRUE; - } - break; - default: - return(E_BADPARM); - } - return(OK); -} - - diff --git a/src/spicelib/devices/bsim4v6/b4v6noi.c b/src/spicelib/devices/bsim4v6/b4v6noi.c deleted file mode 100644 index 0cba94207..000000000 --- a/src/spicelib/devices/bsim4v6/b4v6noi.c +++ /dev/null @@ -1,513 +0,0 @@ -/**** BSIM4.6.2 Released by Wenwei Yang 07/31/2008 ****/ -/**** BSIM4.6.4 Update ngspice 08/22/2009 ****/ -/********** - * Copyright 2006 Regents of the University of California. All rights reserved. - * File: b4noi.c of BSIM4.6.2. - * Author: 2000 Weidong Liu - * Authors: 2001- Xuemei Xi, Mohan Dunga, Ali Niknejad, Chenming Hu. - * Authors: 2006- Mohan Dunga, Ali Niknejad, Chenming Hu - * Authors: 2007- Mohan Dunga, Wenwei Yang, Ali Niknejad, Chenming Hu - * Authors: 2008- Wenwei Yang, Ali Niknejad, Chenming Hu - * Project Director: Prof. Chenming Hu. - * Modified by Xuemei Xi, 04/06/2001. - * Modified by Xuemei Xi, 10/05/2001. - * Modified by Xuemei Xi, 05/09/2003. - * Modified by Xuemei Xi, 03/04/2004. - * Modified by Xuemei Xi, 07/29/2005. - * Modified by Mohan Dunga, 12/13/2006 - * Modified by Wenwei Yang, 07/31/2008. - **********/ - -#include "ngspice/ngspice.h" -#include "bsim4v6def.h" -#include "ngspice/cktdefs.h" -#include "ngspice/iferrmsg.h" -#include "ngspice/noisedef.h" -#include "ngspice/suffix.h" -#include "ngspice/const.h" - - -/* - * WDL: 1/f noise model has been smoothed out and enhanced with - * bulk charge effect as well as physical N* equ. and necessary - * conversion into the SI unit system. - */ - -static double -Eval1ovFNoise(double Vds, BSIM4v6model *model, BSIM4v6instance *here, double freq, double temp) -{ -struct bsim4v6SizeDependParam *pParam; -double cd, esat, DelClm, EffFreq, N0, Nl, Leff, Leffsq; -double T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, Ssi; - - pParam = here->pParam; - cd = fabs(here->BSIM4v6cd); - Leff = pParam->BSIM4v6leff - 2.0 * model->BSIM4v6lintnoi; - Leffsq = Leff * Leff; - esat = 2.0 * here->BSIM4v6vsattemp / here->BSIM4v6ueff; - if(model->BSIM4v6em<=0.0) DelClm = 0.0; /* flicker noise modified -JX */ - else { - T0 = ((((Vds - here->BSIM4v6Vdseff) / pParam->BSIM4v6litl) - + model->BSIM4v6em) / esat); - DelClm = pParam->BSIM4v6litl * log (MAX(T0, N_MINLOG)); - if (DelClm < 0.0) DelClm = 0.0; /* bugfix */ - } - EffFreq = pow(freq, model->BSIM4v6ef); - T1 = CHARGE * CHARGE * CONSTboltz * cd * temp * here->BSIM4v6ueff; - T2 = 1.0e10 * EffFreq * here->BSIM4v6Abulk * model->BSIM4v6coxe * Leffsq; - N0 = model->BSIM4v6coxe * here->BSIM4v6Vgsteff / CHARGE; - Nl = model->BSIM4v6coxe * here->BSIM4v6Vgsteff - * (1.0 - here->BSIM4v6AbovVgst2Vtm * here->BSIM4v6Vdseff) / CHARGE; - - T3 = model->BSIM4v6oxideTrapDensityA - * log(MAX(((N0 + here->BSIM4v6nstar) / (Nl + here->BSIM4v6nstar)), N_MINLOG)); - T4 = model->BSIM4v6oxideTrapDensityB * (N0 - Nl); - T5 = model->BSIM4v6oxideTrapDensityC * 0.5 * (N0 * N0 - Nl * Nl); - - T6 = CONSTboltz * temp * cd * cd; - T7 = 1.0e10 * EffFreq * Leffsq * pParam->BSIM4v6weff * here->BSIM4v6nf; - T8 = model->BSIM4v6oxideTrapDensityA + model->BSIM4v6oxideTrapDensityB * Nl - + model->BSIM4v6oxideTrapDensityC * Nl * Nl; - T9 = (Nl + here->BSIM4v6nstar) * (Nl + here->BSIM4v6nstar); - Ssi = T1 / T2 * (T3 + T4 + T5) + T6 / T7 * DelClm * T8 / T9; - return Ssi; -} - - -int -BSIM4v6noise( -int mode, -int operation, -GENmodel *inModel, -CKTcircuit *ckt, -Ndata *data, -double *OnDens) -{ -NOISEAN *job = (NOISEAN *) ckt->CKTcurJob; - -BSIM4v6model *model = (BSIM4v6model *)inModel; -BSIM4v6instance *here; -struct bsim4v6SizeDependParam *pParam; -double tempOnoise; -double tempInoise; -double noizDens[BSIM4v6NSRCS]; -double lnNdens[BSIM4v6NSRCS]; - -double T0, T1, T2, T5, T10, T11; -double Vds, Ssi, Swi; -double tmp=0.0, gdpr, gspr, npart_theta=0.0, npart_beta=0.0, igsquare, bodymode; - -double m; - -int i; - - /* define the names of the noise sources */ - static char *BSIM4v6nNames[BSIM4v6NSRCS] = - { /* Note that we have to keep the order */ - ".rd", /* noise due to rd */ - ".rs", /* noise due to rs */ - ".rg", /* noise due to rgeltd */ - ".rbps", /* noise due to rbps */ - ".rbpd", /* noise due to rbpd */ - ".rbpb", /* noise due to rbpb */ - ".rbsb", /* noise due to rbsb */ - ".rbdb", /* noise due to rbdb */ - ".id", /* noise due to id */ - ".1overf", /* flicker (1/f) noise */ - ".igs", /* shot noise due to IGS */ - ".igd", /* shot noise due to IGD */ - ".igb", /* shot noise due to IGB */ - "" /* total transistor noise */ - }; - - for (; model != NULL; model = BSIM4v6nextModel(model)) - { for (here = BSIM4v6instances(model); here != NULL; - here = BSIM4v6nextInstance(here)) - { pParam = here->pParam; - switch (operation) - { case N_OPEN: - /* see if we have to to produce a summary report */ - /* if so, name all the noise generators */ - - if (job->NStpsSm != 0) - { switch (mode) - { case N_DENS: - for (i = 0; i < BSIM4v6NSRCS; i++) - { NOISE_ADD_OUTVAR(ckt, data, "onoise.%s%s", here->BSIM4v6name, BSIM4v6nNames[i]); - } - break; - case INT_NOIZ: - for (i = 0; i < BSIM4v6NSRCS; i++) - { NOISE_ADD_OUTVAR(ckt, data, "onoise_total.%s%s", here->BSIM4v6name, BSIM4v6nNames[i]); - NOISE_ADD_OUTVAR(ckt, data, "inoise_total.%s%s", here->BSIM4v6name, BSIM4v6nNames[i]); - } - break; - } - } - break; - case N_CALC: - m = here->BSIM4v6m; - switch (mode) - { case N_DENS: - if (model->BSIM4v6tnoiMod == 0) - { if (model->BSIM4v6rdsMod == 0) - { gspr = here->BSIM4v6sourceConductance; - gdpr = here->BSIM4v6drainConductance; - if (here->BSIM4v6grdsw > 0.0) - tmp = 1.0 / here->BSIM4v6grdsw; /* tmp used below */ - else - tmp = 0.0; - } - else - { gspr = here->BSIM4v6gstot; - gdpr = here->BSIM4v6gdtot; - tmp = 0.0; - } - } - else - { T5 = here->BSIM4v6Vgsteff / here->BSIM4v6EsatL; - T5 *= T5; - npart_beta = model->BSIM4v6rnoia * (1.0 + T5 - * model->BSIM4v6tnoia * pParam->BSIM4v6leff); - npart_theta = model->BSIM4v6rnoib * (1.0 + T5 - * model->BSIM4v6tnoib * pParam->BSIM4v6leff); - if(npart_theta > 0.9) - npart_theta = 0.9; - if(npart_theta > 0.9 * npart_beta) - npart_theta = 0.9 * npart_beta; //4.6.2 - - if (model->BSIM4v6rdsMod == 0) - { gspr = here->BSIM4v6sourceConductance; - gdpr = here->BSIM4v6drainConductance; - } - else - { gspr = here->BSIM4v6gstot; - gdpr = here->BSIM4v6gdtot; - } - - if ((*(ckt->CKTstates[0] + here->BSIM4v6vds)) >= 0.0) - gspr = gspr * (1.0 + npart_theta * npart_theta * gspr - / here->BSIM4v6IdovVds); /* bugfix */ - else - gdpr = gdpr * (1.0 + npart_theta * npart_theta * gdpr - / here->BSIM4v6IdovVds); - } - - NevalSrc(&noizDens[BSIM4v6RDNOIZ], - &lnNdens[BSIM4v6RDNOIZ], ckt, THERMNOISE, - here->BSIM4v6dNodePrime, here->BSIM4v6dNode, - gdpr * m); - - NevalSrc(&noizDens[BSIM4v6RSNOIZ], - &lnNdens[BSIM4v6RSNOIZ], ckt, THERMNOISE, - here->BSIM4v6sNodePrime, here->BSIM4v6sNode, - gspr * m); - - - if (here->BSIM4v6rgateMod == 1) - { NevalSrc(&noizDens[BSIM4v6RGNOIZ], - &lnNdens[BSIM4v6RGNOIZ], ckt, THERMNOISE, - here->BSIM4v6gNodePrime, here->BSIM4v6gNodeExt, - here->BSIM4v6grgeltd * m); - } - else if (here->BSIM4v6rgateMod == 2) - { - T0 = 1.0 + here->BSIM4v6grgeltd/here->BSIM4v6gcrg; - T1 = T0 * T0; - NevalSrc(&noizDens[BSIM4v6RGNOIZ], - &lnNdens[BSIM4v6RGNOIZ], ckt, THERMNOISE, - here->BSIM4v6gNodePrime, here->BSIM4v6gNodeExt, - here->BSIM4v6grgeltd * m / T1); - } - else if (here->BSIM4v6rgateMod == 3) - { NevalSrc(&noizDens[BSIM4v6RGNOIZ], - &lnNdens[BSIM4v6RGNOIZ], ckt, THERMNOISE, - here->BSIM4v6gNodeMid, here->BSIM4v6gNodeExt, - here->BSIM4v6grgeltd * m); - } - else - { noizDens[BSIM4v6RGNOIZ] = 0.0; - lnNdens[BSIM4v6RGNOIZ] = - log(MAX(noizDens[BSIM4v6RGNOIZ], N_MINLOG)); - } - - bodymode = 5; - if (here->BSIM4v6rbodyMod == 2) - { if( ( !model->BSIM4v6rbps0Given) || - ( !model->BSIM4v6rbpd0Given) ) - bodymode = 1; - else - if( (!model->BSIM4v6rbsbx0Given && !model->BSIM4v6rbsby0Given) || - (!model->BSIM4v6rbdbx0Given && !model->BSIM4v6rbdby0Given) ) - bodymode = 3; - } - - if (here->BSIM4v6rbodyMod) - { - if(bodymode == 5) - { - NevalSrc(&noizDens[BSIM4v6RBPSNOIZ], - &lnNdens[BSIM4v6RBPSNOIZ], ckt, THERMNOISE, - here->BSIM4v6bNodePrime, here->BSIM4v6sbNode, - here->BSIM4v6grbps * m); - NevalSrc(&noizDens[BSIM4v6RBPDNOIZ], - &lnNdens[BSIM4v6RBPDNOIZ], ckt, THERMNOISE, - here->BSIM4v6bNodePrime, here->BSIM4v6dbNode, - here->BSIM4v6grbpd * m); - NevalSrc(&noizDens[BSIM4v6RBPBNOIZ], - &lnNdens[BSIM4v6RBPBNOIZ], ckt, THERMNOISE, - here->BSIM4v6bNodePrime, here->BSIM4v6bNode, - here->BSIM4v6grbpb * m); - NevalSrc(&noizDens[BSIM4v6RBSBNOIZ], - &lnNdens[BSIM4v6RBSBNOIZ], ckt, THERMNOISE, - here->BSIM4v6bNode, here->BSIM4v6sbNode, - here->BSIM4v6grbsb * m); - NevalSrc(&noizDens[BSIM4v6RBDBNOIZ], - &lnNdens[BSIM4v6RBDBNOIZ], ckt, THERMNOISE, - here->BSIM4v6bNode, here->BSIM4v6dbNode, - here->BSIM4v6grbdb * m); - } - if(bodymode == 3) - { - NevalSrc(&noizDens[BSIM4v6RBPSNOIZ], - &lnNdens[BSIM4v6RBPSNOIZ], ckt, THERMNOISE, - here->BSIM4v6bNodePrime, here->BSIM4v6sbNode, - here->BSIM4v6grbps * m); - NevalSrc(&noizDens[BSIM4v6RBPDNOIZ], - &lnNdens[BSIM4v6RBPDNOIZ], ckt, THERMNOISE, - here->BSIM4v6bNodePrime, here->BSIM4v6dbNode, - here->BSIM4v6grbpd * m); - NevalSrc(&noizDens[BSIM4v6RBPBNOIZ], - &lnNdens[BSIM4v6RBPBNOIZ], ckt, THERMNOISE, - here->BSIM4v6bNodePrime, here->BSIM4v6bNode, - here->BSIM4v6grbpb * m); - noizDens[BSIM4v6RBSBNOIZ] = noizDens[BSIM4v6RBDBNOIZ] = 0.0; - lnNdens[BSIM4v6RBSBNOIZ] = - log(MAX(noizDens[BSIM4v6RBSBNOIZ], N_MINLOG)); - lnNdens[BSIM4v6RBDBNOIZ] = - log(MAX(noizDens[BSIM4v6RBDBNOIZ], N_MINLOG)); - } - if(bodymode == 1) - { - NevalSrc(&noizDens[BSIM4v6RBPBNOIZ], - &lnNdens[BSIM4v6RBPBNOIZ], ckt, THERMNOISE, - here->BSIM4v6bNodePrime, here->BSIM4v6bNode, - here->BSIM4v6grbpb * m); - noizDens[BSIM4v6RBPSNOIZ] = noizDens[BSIM4v6RBPDNOIZ] = 0.0; - noizDens[BSIM4v6RBSBNOIZ] = noizDens[BSIM4v6RBDBNOIZ] = 0.0; - lnNdens[BSIM4v6RBPSNOIZ] = - log(MAX(noizDens[BSIM4v6RBPSNOIZ], N_MINLOG)); - lnNdens[BSIM4v6RBPDNOIZ] = - log(MAX(noizDens[BSIM4v6RBPDNOIZ], N_MINLOG)); - lnNdens[BSIM4v6RBSBNOIZ] = - log(MAX(noizDens[BSIM4v6RBSBNOIZ], N_MINLOG)); - lnNdens[BSIM4v6RBDBNOIZ] = - log(MAX(noizDens[BSIM4v6RBDBNOIZ], N_MINLOG)); - } - } - else - { noizDens[BSIM4v6RBPSNOIZ] = noizDens[BSIM4v6RBPDNOIZ] = 0.0; - noizDens[BSIM4v6RBPBNOIZ] = 0.0; - noizDens[BSIM4v6RBSBNOIZ] = noizDens[BSIM4v6RBDBNOIZ] = 0.0; - lnNdens[BSIM4v6RBPSNOIZ] = - log(MAX(noizDens[BSIM4v6RBPSNOIZ], N_MINLOG)); - lnNdens[BSIM4v6RBPDNOIZ] = - log(MAX(noizDens[BSIM4v6RBPDNOIZ], N_MINLOG)); - lnNdens[BSIM4v6RBPBNOIZ] = - log(MAX(noizDens[BSIM4v6RBPBNOIZ], N_MINLOG)); - lnNdens[BSIM4v6RBSBNOIZ] = - log(MAX(noizDens[BSIM4v6RBSBNOIZ], N_MINLOG)); - lnNdens[BSIM4v6RBDBNOIZ] = - log(MAX(noizDens[BSIM4v6RBDBNOIZ], N_MINLOG)); - } - - - switch(model->BSIM4v6tnoiMod) - { case 0: - T0 = here->BSIM4v6ueff * fabs(here->BSIM4v6qinv); - T1 = T0 * tmp + pParam->BSIM4v6leff - * pParam->BSIM4v6leff; - NevalSrc(&noizDens[BSIM4v6IDNOIZ], - &lnNdens[BSIM4v6IDNOIZ], ckt, - THERMNOISE, here->BSIM4v6dNodePrime, - here->BSIM4v6sNodePrime, - m * (T0 / T1) * model->BSIM4v6ntnoi); - break; - case 1: - T0 = here->BSIM4v6gm + here->BSIM4v6gmbs + here->BSIM4v6gds; - T0 *= T0; - igsquare = npart_theta * npart_theta * T0 / here->BSIM4v6IdovVds; - T1 = npart_beta * (here->BSIM4v6gm - + here->BSIM4v6gmbs) + here->BSIM4v6gds; - T2 = T1 * T1 / here->BSIM4v6IdovVds; - NevalSrc(&noizDens[BSIM4v6IDNOIZ], - &lnNdens[BSIM4v6IDNOIZ], ckt, - THERMNOISE, here->BSIM4v6dNodePrime, - here->BSIM4v6sNodePrime, m * (T2 - igsquare)); - break; - } - - NevalSrc(&noizDens[BSIM4v6FLNOIZ], NULL, - ckt, N_GAIN, here->BSIM4v6dNodePrime, - here->BSIM4v6sNodePrime, (double) 0.0); - - switch(model->BSIM4v6fnoiMod) - { case 0: - noizDens[BSIM4v6FLNOIZ] *= m * model->BSIM4v6kf - * exp(model->BSIM4v6af - * log(MAX(fabs(here->BSIM4v6cd), - N_MINLOG))) - / (pow(data->freq, model->BSIM4v6ef) - * pParam->BSIM4v6leff - * pParam->BSIM4v6leff - * model->BSIM4v6coxe); - break; - case 1: - Vds = *(ckt->CKTstates[0] + here->BSIM4v6vds); - if (Vds < 0.0) - Vds = -Vds; - - Ssi = Eval1ovFNoise(Vds, model, here, - data->freq, ckt->CKTtemp); - T10 = model->BSIM4v6oxideTrapDensityA - * CONSTboltz * ckt->CKTtemp; - T11 = pParam->BSIM4v6weff * here->BSIM4v6nf * pParam->BSIM4v6leff - * pow(data->freq, model->BSIM4v6ef) * 1.0e10 - * here->BSIM4v6nstar * here->BSIM4v6nstar; - Swi = T10 / T11 * here->BSIM4v6cd - * here->BSIM4v6cd; - T1 = Swi + Ssi; - if (T1 > 0.0) - noizDens[BSIM4v6FLNOIZ] *= m * (Ssi * Swi) / T1; - else - noizDens[BSIM4v6FLNOIZ] *= 0.0; - break; - } - - lnNdens[BSIM4v6FLNOIZ] = - log(MAX(noizDens[BSIM4v6FLNOIZ], N_MINLOG)); - - - if(here->BSIM4v6mode >= 0) { /* bugfix */ - NevalSrc(&noizDens[BSIM4v6IGSNOIZ], - &lnNdens[BSIM4v6IGSNOIZ], ckt, SHOTNOISE, - here->BSIM4v6gNodePrime, here->BSIM4v6sNodePrime, - m * (here->BSIM4v6Igs + here->BSIM4v6Igcs)); - NevalSrc(&noizDens[BSIM4v6IGDNOIZ], - &lnNdens[BSIM4v6IGDNOIZ], ckt, SHOTNOISE, - here->BSIM4v6gNodePrime, here->BSIM4v6dNodePrime, - m * (here->BSIM4v6Igd + here->BSIM4v6Igcd)); - } else { - NevalSrc(&noizDens[BSIM4v6IGSNOIZ], - &lnNdens[BSIM4v6IGSNOIZ], ckt, SHOTNOISE, - here->BSIM4v6gNodePrime, here->BSIM4v6sNodePrime, - m * (here->BSIM4v6Igs + here->BSIM4v6Igcd)); - NevalSrc(&noizDens[BSIM4v6IGDNOIZ], - &lnNdens[BSIM4v6IGDNOIZ], ckt, SHOTNOISE, - here->BSIM4v6gNodePrime, here->BSIM4v6dNodePrime, - m * (here->BSIM4v6Igd + here->BSIM4v6Igcs)); - } - NevalSrc(&noizDens[BSIM4v6IGBNOIZ], - &lnNdens[BSIM4v6IGBNOIZ], ckt, SHOTNOISE, - here->BSIM4v6gNodePrime, here->BSIM4v6bNodePrime, - m * here->BSIM4v6Igb); - - - noizDens[BSIM4v6TOTNOIZ] = noizDens[BSIM4v6RDNOIZ] - + noizDens[BSIM4v6RSNOIZ] + noizDens[BSIM4v6RGNOIZ] - + noizDens[BSIM4v6RBPSNOIZ] + noizDens[BSIM4v6RBPDNOIZ] - + noizDens[BSIM4v6RBPBNOIZ] - + noizDens[BSIM4v6RBSBNOIZ] + noizDens[BSIM4v6RBDBNOIZ] - + noizDens[BSIM4v6IDNOIZ] + noizDens[BSIM4v6FLNOIZ] - + noizDens[BSIM4v6IGSNOIZ] + noizDens[BSIM4v6IGDNOIZ] - + noizDens[BSIM4v6IGBNOIZ]; - lnNdens[BSIM4v6TOTNOIZ] = - log(MAX(noizDens[BSIM4v6TOTNOIZ], N_MINLOG)); - - *OnDens += noizDens[BSIM4v6TOTNOIZ]; - - if (data->delFreq == 0.0) - { /* if we haven't done any previous - integration, we need to initialize our - "history" variables. - */ - - for (i = 0; i < BSIM4v6NSRCS; i++) - { here->BSIM4v6nVar[LNLSTDENS][i] = - lnNdens[i]; - } - - /* clear out our integration variables - if it's the first pass - */ - if (data->freq == - job->NstartFreq) - { for (i = 0; i < BSIM4v6NSRCS; i++) - { here->BSIM4v6nVar[OUTNOIZ][i] = 0.0; - here->BSIM4v6nVar[INNOIZ][i] = 0.0; - } - } - } - else - { /* data->delFreq != 0.0, - we have to integrate. - */ - for (i = 0; i < BSIM4v6NSRCS; i++) - { if (i != BSIM4v6TOTNOIZ) - { tempOnoise = Nintegrate(noizDens[i], - lnNdens[i], - here->BSIM4v6nVar[LNLSTDENS][i], - data); - tempInoise = Nintegrate(noizDens[i] - * data->GainSqInv, lnNdens[i] - + data->lnGainInv, - here->BSIM4v6nVar[LNLSTDENS][i] - + data->lnGainInv, data); - here->BSIM4v6nVar[LNLSTDENS][i] = - lnNdens[i]; - data->outNoiz += tempOnoise; - data->inNoise += tempInoise; - if (job->NStpsSm != 0) - { here->BSIM4v6nVar[OUTNOIZ][i] - += tempOnoise; - here->BSIM4v6nVar[OUTNOIZ][BSIM4v6TOTNOIZ] - += tempOnoise; - here->BSIM4v6nVar[INNOIZ][i] - += tempInoise; - here->BSIM4v6nVar[INNOIZ][BSIM4v6TOTNOIZ] - += tempInoise; - } - } - } - } - if (data->prtSummary) - { for (i = 0; i < BSIM4v6NSRCS; i++) - { /* print a summary report */ - data->outpVector[data->outNumber++] - = noizDens[i]; - } - } - break; - case INT_NOIZ: - /* already calculated, just output */ - if (job->NStpsSm != 0) - { for (i = 0; i < BSIM4v6NSRCS; i++) - { data->outpVector[data->outNumber++] - = here->BSIM4v6nVar[OUTNOIZ][i]; - data->outpVector[data->outNumber++] - = here->BSIM4v6nVar[INNOIZ][i]; - } - } - break; - } - break; - case N_CLOSE: - /* do nothing, the main calling routine will close */ - return (OK); - break; /* the plots */ - } /* switch (operation) */ - } /* for here */ - } /* for model */ - - return(OK); -} diff --git a/src/spicelib/devices/bsim4v6/b4v6par.c b/src/spicelib/devices/bsim4v6/b4v6par.c deleted file mode 100644 index 87e0bc09e..000000000 --- a/src/spicelib/devices/bsim4v6/b4v6par.c +++ /dev/null @@ -1,208 +0,0 @@ -/**** BSIM4.6.2 Released by Wenwei Yang 07/31/2008 ****/ - -/********** - * Copyright 2006 Regents of the University of California. All rights reserved. - * File: b4par.c of BSIM4.6.2. - * Author: 2000 Weidong Liu - * Authors: 2001- Xuemei Xi, Mohan Dunga, Ali Niknejad, Chenming Hu. - * Authors: 2006- Mohan Dunga, Ali Niknejad, Chenming Hu - * Authors: 2007- Mohan Dunga, Wenwei Yang, Ali Niknejad, Chenming Hu - * Project Director: Prof. Chenming Hu. - * Modified by Xuemei Xi, 04/06/2001. - * Modified by Xuemei Xi, 11/15/2002. - * Modified by Xuemei Xi, 05/09/2003. - * Modified by Xuemei Xi, Mohan Dunga, 07/29/2005. -**********/ - -#include "ngspice/ngspice.h" -#include "ngspice/ifsim.h" -#include "bsim4v6def.h" -#include "ngspice/sperror.h" -#include "ngspice/suffix.h" -#include "ngspice/fteext.h" - -int -BSIM4v6param( -int param, -IFvalue *value, -GENinstance *inst, -IFvalue *select) -{ - double scale; - - BSIM4v6instance *here = (BSIM4v6instance*)inst; - - NG_IGNORE(select); - - if (!cp_getvar("scale", CP_REAL, &scale, 0)) - scale = 1; - - switch (param) { - case BSIM4v6_W: - here->BSIM4v6w = value->rValue*scale; - here->BSIM4v6wGiven = TRUE; - break; - case BSIM4v6_L: - here->BSIM4v6l = value->rValue*scale; - here->BSIM4v6lGiven = TRUE; - break; - case BSIM4v6_M: - here->BSIM4v6m = value->rValue; - here->BSIM4v6mGiven = TRUE; - break; - case BSIM4v6_NF: - here->BSIM4v6nf = value->rValue; - here->BSIM4v6nfGiven = TRUE; - break; - case BSIM4v6_MIN: - here->BSIM4v6min = value->iValue; - here->BSIM4v6minGiven = TRUE; - break; - case BSIM4v6_AS: - here->BSIM4v6sourceArea = value->rValue*scale*scale; - here->BSIM4v6sourceAreaGiven = TRUE; - break; - case BSIM4v6_AD: - here->BSIM4v6drainArea = value->rValue*scale*scale; - here->BSIM4v6drainAreaGiven = TRUE; - break; - case BSIM4v6_PS: - here->BSIM4v6sourcePerimeter = value->rValue*scale; - here->BSIM4v6sourcePerimeterGiven = TRUE; - break; - case BSIM4v6_PD: - here->BSIM4v6drainPerimeter = value->rValue*scale; - here->BSIM4v6drainPerimeterGiven = TRUE; - break; - case BSIM4v6_NRS: - here->BSIM4v6sourceSquares = value->rValue; - here->BSIM4v6sourceSquaresGiven = TRUE; - break; - case BSIM4v6_NRD: - here->BSIM4v6drainSquares = value->rValue; - here->BSIM4v6drainSquaresGiven = TRUE; - break; - case BSIM4v6_OFF: - here->BSIM4v6off = value->iValue; - break; - case BSIM4v6_SA: - here->BSIM4v6sa = value->rValue; - here->BSIM4v6saGiven = TRUE; - break; - case BSIM4v6_SB: - here->BSIM4v6sb = value->rValue; - here->BSIM4v6sbGiven = TRUE; - break; - case BSIM4v6_SD: - here->BSIM4v6sd = value->rValue; - here->BSIM4v6sdGiven = TRUE; - break; - case BSIM4v6_SCA: - here->BSIM4v6sca = value->rValue; - here->BSIM4v6scaGiven = TRUE; - break; - case BSIM4v6_SCB: - here->BSIM4v6scb = value->rValue; - here->BSIM4v6scbGiven = TRUE; - break; - case BSIM4v6_SCC: - here->BSIM4v6scc = value->rValue; - here->BSIM4v6sccGiven = TRUE; - break; - case BSIM4v6_SC: - here->BSIM4v6sc = value->rValue; - here->BSIM4v6scGiven = TRUE; - break; - case BSIM4v6_RBSB: - here->BSIM4v6rbsb = value->rValue; - here->BSIM4v6rbsbGiven = TRUE; - break; - case BSIM4v6_RBDB: - here->BSIM4v6rbdb = value->rValue; - here->BSIM4v6rbdbGiven = TRUE; - break; - case BSIM4v6_RBPB: - here->BSIM4v6rbpb = value->rValue; - here->BSIM4v6rbpbGiven = TRUE; - break; - case BSIM4v6_RBPS: - here->BSIM4v6rbps = value->rValue; - here->BSIM4v6rbpsGiven = TRUE; - break; - case BSIM4v6_RBPD: - here->BSIM4v6rbpd = value->rValue; - here->BSIM4v6rbpdGiven = TRUE; - break; - case BSIM4v6_DELVTO: - here->BSIM4v6delvto = value->rValue; - here->BSIM4v6delvtoGiven = TRUE; - break; - case BSIM4v6_XGW: - here->BSIM4v6xgw = value->rValue; - here->BSIM4v6xgwGiven = TRUE; - break; - case BSIM4v6_NGCON: - here->BSIM4v6ngcon = value->rValue; - here->BSIM4v6ngconGiven = TRUE; - break; - case BSIM4v6_TRNQSMOD: - here->BSIM4v6trnqsMod = value->iValue; - here->BSIM4v6trnqsModGiven = TRUE; - break; - case BSIM4v6_ACNQSMOD: - here->BSIM4v6acnqsMod = value->iValue; - here->BSIM4v6acnqsModGiven = TRUE; - break; - case BSIM4v6_RBODYMOD: - here->BSIM4v6rbodyMod = value->iValue; - here->BSIM4v6rbodyModGiven = TRUE; - break; - case BSIM4v6_RGATEMOD: - here->BSIM4v6rgateMod = value->iValue; - here->BSIM4v6rgateModGiven = TRUE; - break; - case BSIM4v6_GEOMOD: - here->BSIM4v6geoMod = value->iValue; - here->BSIM4v6geoModGiven = TRUE; - break; - case BSIM4v6_RGEOMOD: - here->BSIM4v6rgeoMod = value->iValue; - here->BSIM4v6rgeoModGiven = TRUE; - break; - case BSIM4v6_IC_VDS: - here->BSIM4v6icVDS = value->rValue; - here->BSIM4v6icVDSGiven = TRUE; - break; - case BSIM4v6_IC_VGS: - here->BSIM4v6icVGS = value->rValue; - here->BSIM4v6icVGSGiven = TRUE; - break; - case BSIM4v6_IC_VBS: - here->BSIM4v6icVBS = value->rValue; - here->BSIM4v6icVBSGiven = TRUE; - break; - case BSIM4v6_IC: - /* FALLTHROUGH added to suppress GCC warning due to - * -Wimplicit-fallthrough flag */ - switch (value->v.numValue) { - case 3: - here->BSIM4v6icVBS = *(value->v.vec.rVec+2); - here->BSIM4v6icVBSGiven = TRUE; - /* FALLTHROUGH */ - case 2: - here->BSIM4v6icVGS = *(value->v.vec.rVec+1); - here->BSIM4v6icVGSGiven = TRUE; - /* FALLTHROUGH */ - case 1: - here->BSIM4v6icVDS = *(value->v.vec.rVec); - here->BSIM4v6icVDSGiven = TRUE; - break; - default: - return(E_BADPARM); - } - break; - default: - return(E_BADPARM); - } - return(OK); -} diff --git a/src/spicelib/devices/bsim4v6/b4v6pzld.c b/src/spicelib/devices/bsim4v6/b4v6pzld.c deleted file mode 100644 index 6e8d83a26..000000000 --- a/src/spicelib/devices/bsim4v6/b4v6pzld.c +++ /dev/null @@ -1,759 +0,0 @@ -/**** BSIM4.6.2 Released by Wenwei Yang 07/31/2008 ****/ - -/********** - * Copyright 2006 Regents of the University of California. All rights reserved. - * File: b4pzld.c of BSIM4.6.2. - * Author: 2000 Weidong Liu - * Authors: 2001- Xuemei Xi, Mohan Dunga, Ali Niknejad, Chenming Hu. - * Authors: 2006- Mohan Dunga, Ali Niknejad, Chenming Hu - * Authors: 2007- Mohan Dunga, Wenwei Yang, Ali Niknejad, Chenming Hu - * Project Director: Prof. Chenming Hu. - * Modified by Xuemei Xi, 10/05/2001. - **********/ - -#include "ngspice/ngspice.h" -#include "ngspice/cktdefs.h" -#include "ngspice/complex.h" -#include "ngspice/sperror.h" -#include "bsim4v6def.h" -#include "ngspice/suffix.h" - -int -BSIM4v6pzLoad( -GENmodel *inModel, -CKTcircuit *ckt, -SPcomplex *s) -{ -BSIM4v6model *model = (BSIM4v6model*)inModel; -BSIM4v6instance *here; - -double gjbd, gjbs, geltd, gcrg, gcrgg, gcrgd, gcrgs, gcrgb; -double xcggb, xcgdb, xcgsb, xcgbb, xcbgb, xcbdb, xcbsb, xcbbb; -double xcdgb, xcddb, xcdsb, xcdbb, xcsgb, xcsdb, xcssb, xcsbb; -double gds, capbd, capbs, FwdSum, RevSum, Gm, Gmbs; -double gstot, gstotd, gstotg, gstots, gstotb, gspr; -double gdtot, gdtotd, gdtotg, gdtots, gdtotb, gdpr; -double gIstotg, gIstotd, gIstots, gIstotb; -double gIdtotg, gIdtotd, gIdtots, gIdtotb; -double gIbtotg, gIbtotd, gIbtots, gIbtotb; -double gIgtotg, gIgtotd, gIgtots, gIgtotb; -double cgso, cgdo, cgbo; -double xcdbdb=0.0, xcsbsb=0.0, xcgmgmb=0.0, xcgmdb=0.0, xcgmsb=0.0, xcdgmb=0.0, xcsgmb=0.0; -double xcgmbb=0.0, xcbgmb=0.0; -double dxpart, sxpart, xgtg, xgtd, xgts, xgtb, xcqgb=0.0, xcqdb=0.0, xcqsb=0.0, xcqbb=0.0; -double gbspsp, gbbdp, gbbsp, gbspg, gbspb; -double gbspdp, gbdpdp, gbdpg, gbdpb, gbdpsp; -double ddxpart_dVd, ddxpart_dVg, ddxpart_dVb, ddxpart_dVs; -double dsxpart_dVd, dsxpart_dVg, dsxpart_dVb, dsxpart_dVs; -double T0=0.0, T1, CoxWL, qcheq, Cdg, Cdd, Cds, Csg, Csd, Css; -double ScalingFactor = 1.0e-9; -struct bsim4v6SizeDependParam *pParam; -double ggidld, ggidlg, ggidlb, ggislg, ggislb, ggisls; - -double m; - - for (; model != NULL; model = BSIM4v6nextModel(model)) - { for (here = BSIM4v6instances(model); here!= NULL; - here = BSIM4v6nextInstance(here)) - { - pParam = here->pParam; - capbd = here->BSIM4v6capbd; - capbs = here->BSIM4v6capbs; - cgso = here->BSIM4v6cgso; - cgdo = here->BSIM4v6cgdo; - cgbo = pParam->BSIM4v6cgbo; - - if (here->BSIM4v6mode >= 0) - { Gm = here->BSIM4v6gm; - Gmbs = here->BSIM4v6gmbs; - FwdSum = Gm + Gmbs; - RevSum = 0.0; - - gbbdp = -(here->BSIM4v6gbds); - gbbsp = here->BSIM4v6gbds + here->BSIM4v6gbgs + here->BSIM4v6gbbs; - gbdpg = here->BSIM4v6gbgs; - gbdpdp = here->BSIM4v6gbds; - gbdpb = here->BSIM4v6gbbs; - gbdpsp = -(gbdpg + gbdpdp + gbdpb); - - gbspdp = 0.0; - gbspg = 0.0; - gbspb = 0.0; - gbspsp = 0.0; - - if (model->BSIM4v6igcMod) - { gIstotg = here->BSIM4v6gIgsg + here->BSIM4v6gIgcsg; - gIstotd = here->BSIM4v6gIgcsd; - gIstots = here->BSIM4v6gIgss + here->BSIM4v6gIgcss; - gIstotb = here->BSIM4v6gIgcsb; - - gIdtotg = here->BSIM4v6gIgdg + here->BSIM4v6gIgcdg; - gIdtotd = here->BSIM4v6gIgdd + here->BSIM4v6gIgcdd; - gIdtots = here->BSIM4v6gIgcds; - gIdtotb = here->BSIM4v6gIgcdb; - } - else - { gIstotg = gIstotd = gIstots = gIstotb = 0.0; - gIdtotg = gIdtotd = gIdtots = gIdtotb = 0.0; - } - - if (model->BSIM4v6igbMod) - { gIbtotg = here->BSIM4v6gIgbg; - gIbtotd = here->BSIM4v6gIgbd; - gIbtots = here->BSIM4v6gIgbs; - gIbtotb = here->BSIM4v6gIgbb; - } - else - gIbtotg = gIbtotd = gIbtots = gIbtotb = 0.0; - - if ((model->BSIM4v6igcMod != 0) || (model->BSIM4v6igbMod != 0)) - { gIgtotg = gIstotg + gIdtotg + gIbtotg; - gIgtotd = gIstotd + gIdtotd + gIbtotd ; - gIgtots = gIstots + gIdtots + gIbtots; - gIgtotb = gIstotb + gIdtotb + gIbtotb; - } - else - gIgtotg = gIgtotd = gIgtots = gIgtotb = 0.0; - - if (here->BSIM4v6rgateMod == 2) - T0 = *(ckt->CKTstates[0] + here->BSIM4v6vges) - - *(ckt->CKTstates[0] + here->BSIM4v6vgs); - else if (here->BSIM4v6rgateMod == 3) - T0 = *(ckt->CKTstates[0] + here->BSIM4v6vgms) - - *(ckt->CKTstates[0] + here->BSIM4v6vgs); - if (here->BSIM4v6rgateMod > 1) - { gcrgd = here->BSIM4v6gcrgd * T0; - gcrgg = here->BSIM4v6gcrgg * T0; - gcrgs = here->BSIM4v6gcrgs * T0; - gcrgb = here->BSIM4v6gcrgb * T0; - gcrgg -= here->BSIM4v6gcrg; - gcrg = here->BSIM4v6gcrg; - } - else - gcrg = gcrgd = gcrgg = gcrgs = gcrgb = 0.0; - - if (here->BSIM4v6acnqsMod == 0) - { if (here->BSIM4v6rgateMod == 3) - { xcgmgmb = cgdo + cgso + pParam->BSIM4v6cgbo; - xcgmdb = -cgdo; - xcgmsb = -cgso; - xcgmbb = -pParam->BSIM4v6cgbo; - - xcdgmb = xcgmdb; - xcsgmb = xcgmsb; - xcbgmb = xcgmbb; - - xcggb = here->BSIM4v6cggb; - xcgdb = here->BSIM4v6cgdb; - xcgsb = here->BSIM4v6cgsb; - xcgbb = -(xcggb + xcgdb + xcgsb); - - xcdgb = here->BSIM4v6cdgb; - xcsgb = -(here->BSIM4v6cggb + here->BSIM4v6cbgb - + here->BSIM4v6cdgb); - xcbgb = here->BSIM4v6cbgb; - } - else - { xcggb = here->BSIM4v6cggb + cgdo + cgso - + pParam->BSIM4v6cgbo; - xcgdb = here->BSIM4v6cgdb - cgdo; - xcgsb = here->BSIM4v6cgsb - cgso; - xcgbb = -(xcggb + xcgdb + xcgsb); - - xcdgb = here->BSIM4v6cdgb - cgdo; - xcsgb = -(here->BSIM4v6cggb + here->BSIM4v6cbgb - + here->BSIM4v6cdgb + cgso); - xcbgb = here->BSIM4v6cbgb - pParam->BSIM4v6cgbo; - - xcdgmb = xcsgmb = xcbgmb = 0.0; - } - xcddb = here->BSIM4v6cddb + here->BSIM4v6capbd + cgdo; - xcdsb = here->BSIM4v6cdsb; - - xcsdb = -(here->BSIM4v6cgdb + here->BSIM4v6cbdb - + here->BSIM4v6cddb); - xcssb = here->BSIM4v6capbs + cgso - (here->BSIM4v6cgsb - + here->BSIM4v6cbsb + here->BSIM4v6cdsb); - - if (!here->BSIM4v6rbodyMod) - { xcdbb = -(xcdgb + xcddb + xcdsb + xcdgmb); - xcsbb = -(xcsgb + xcsdb + xcssb + xcsgmb); - xcbdb = here->BSIM4v6cbdb - here->BSIM4v6capbd; - xcbsb = here->BSIM4v6cbsb - here->BSIM4v6capbs; - xcdbdb = 0.0; - } - else - { xcdbb = -(here->BSIM4v6cddb + here->BSIM4v6cdgb - + here->BSIM4v6cdsb); - xcsbb = -(xcsgb + xcsdb + xcssb + xcsgmb) - + here->BSIM4v6capbs; - xcbdb = here->BSIM4v6cbdb; - xcbsb = here->BSIM4v6cbsb; - - xcdbdb = -here->BSIM4v6capbd; - xcsbsb = -here->BSIM4v6capbs; - } - xcbbb = -(xcbdb + xcbgb + xcbsb + xcbgmb); - - xgtg = xgtd = xgts = xgtb = 0.0; - sxpart = 0.6; - dxpart = 0.4; - ddxpart_dVd = ddxpart_dVg = ddxpart_dVb - = ddxpart_dVs = 0.0; - dsxpart_dVd = dsxpart_dVg = dsxpart_dVb - = dsxpart_dVs = 0.0; - } - else - { xcggb = xcgdb = xcgsb = xcgbb = 0.0; - xcbgb = xcbdb = xcbsb = xcbbb = 0.0; - xcdgb = xcddb = xcdsb = xcdbb = 0.0; - xcsgb = xcsdb = xcssb = xcsbb = 0.0; - - xgtg = here->BSIM4v6gtg; - xgtd = here->BSIM4v6gtd; - xgts = here->BSIM4v6gts; - xgtb = here->BSIM4v6gtb; - - xcqgb = here->BSIM4v6cqgb; - xcqdb = here->BSIM4v6cqdb; - xcqsb = here->BSIM4v6cqsb; - xcqbb = here->BSIM4v6cqbb; - - CoxWL = model->BSIM4v6coxe * here->pParam->BSIM4v6weffCV - * here->BSIM4v6nf * here->pParam->BSIM4v6leffCV; - qcheq = -(here->BSIM4v6qgate + here->BSIM4v6qbulk); - if (fabs(qcheq) <= 1.0e-5 * CoxWL) - { if (model->BSIM4v6xpart < 0.5) - { dxpart = 0.4; - } - else if (model->BSIM4v6xpart > 0.5) - { dxpart = 0.0; - } - else - { dxpart = 0.5; - } - ddxpart_dVd = ddxpart_dVg = ddxpart_dVb - = ddxpart_dVs = 0.0; - } - else - { dxpart = here->BSIM4v6qdrn / qcheq; - Cdd = here->BSIM4v6cddb; - Csd = -(here->BSIM4v6cgdb + here->BSIM4v6cddb - + here->BSIM4v6cbdb); - ddxpart_dVd = (Cdd - dxpart * (Cdd + Csd)) / qcheq; - Cdg = here->BSIM4v6cdgb; - Csg = -(here->BSIM4v6cggb + here->BSIM4v6cdgb - + here->BSIM4v6cbgb); - ddxpart_dVg = (Cdg - dxpart * (Cdg + Csg)) / qcheq; - - Cds = here->BSIM4v6cdsb; - Css = -(here->BSIM4v6cgsb + here->BSIM4v6cdsb - + here->BSIM4v6cbsb); - ddxpart_dVs = (Cds - dxpart * (Cds + Css)) / qcheq; - - ddxpart_dVb = -(ddxpart_dVd + ddxpart_dVg - + ddxpart_dVs); - } - sxpart = 1.0 - dxpart; - dsxpart_dVd = -ddxpart_dVd; - dsxpart_dVg = -ddxpart_dVg; - dsxpart_dVs = -ddxpart_dVs; - dsxpart_dVb = -(dsxpart_dVd + dsxpart_dVg + dsxpart_dVs); - } - } - else - { Gm = -here->BSIM4v6gm; - Gmbs = -here->BSIM4v6gmbs; - FwdSum = 0.0; - RevSum = -(Gm + Gmbs); - - gbbsp = -(here->BSIM4v6gbds); - gbbdp = here->BSIM4v6gbds + here->BSIM4v6gbgs + here->BSIM4v6gbbs; - - gbdpg = 0.0; - gbdpsp = 0.0; - gbdpb = 0.0; - gbdpdp = 0.0; - - gbspg = here->BSIM4v6gbgs; - gbspsp = here->BSIM4v6gbds; - gbspb = here->BSIM4v6gbbs; - gbspdp = -(gbspg + gbspsp + gbspb); - - if (model->BSIM4v6igcMod) - { gIstotg = here->BSIM4v6gIgsg + here->BSIM4v6gIgcdg; - gIstotd = here->BSIM4v6gIgcds; - gIstots = here->BSIM4v6gIgss + here->BSIM4v6gIgcdd; - gIstotb = here->BSIM4v6gIgcdb; - - gIdtotg = here->BSIM4v6gIgdg + here->BSIM4v6gIgcsg; - gIdtotd = here->BSIM4v6gIgdd + here->BSIM4v6gIgcss; - gIdtots = here->BSIM4v6gIgcsd; - gIdtotb = here->BSIM4v6gIgcsb; - } - else - { gIstotg = gIstotd = gIstots = gIstotb = 0.0; - gIdtotg = gIdtotd = gIdtots = gIdtotb = 0.0; - } - - if (model->BSIM4v6igbMod) - { gIbtotg = here->BSIM4v6gIgbg; - gIbtotd = here->BSIM4v6gIgbs; - gIbtots = here->BSIM4v6gIgbd; - gIbtotb = here->BSIM4v6gIgbb; - } - else - gIbtotg = gIbtotd = gIbtots = gIbtotb = 0.0; - - if ((model->BSIM4v6igcMod != 0) || (model->BSIM4v6igbMod != 0)) - { gIgtotg = gIstotg + gIdtotg + gIbtotg; - gIgtotd = gIstotd + gIdtotd + gIbtotd ; - gIgtots = gIstots + gIdtots + gIbtots; - gIgtotb = gIstotb + gIdtotb + gIbtotb; - } - else - gIgtotg = gIgtotd = gIgtots = gIgtotb = 0.0; - - if (here->BSIM4v6rgateMod == 2) - T0 = *(ckt->CKTstates[0] + here->BSIM4v6vges) - - *(ckt->CKTstates[0] + here->BSIM4v6vgs); - else if (here->BSIM4v6rgateMod == 3) - T0 = *(ckt->CKTstates[0] + here->BSIM4v6vgms) - - *(ckt->CKTstates[0] + here->BSIM4v6vgs); - if (here->BSIM4v6rgateMod > 1) - { gcrgd = here->BSIM4v6gcrgs * T0; - gcrgg = here->BSIM4v6gcrgg * T0; - gcrgs = here->BSIM4v6gcrgd * T0; - gcrgb = here->BSIM4v6gcrgb * T0; - gcrgg -= here->BSIM4v6gcrg; - gcrg = here->BSIM4v6gcrg; - } - else - gcrg = gcrgd = gcrgg = gcrgs = gcrgb = 0.0; - - if (here->BSIM4v6acnqsMod == 0) - { if (here->BSIM4v6rgateMod == 3) - { xcgmgmb = cgdo + cgso + pParam->BSIM4v6cgbo; - xcgmdb = -cgdo; - xcgmsb = -cgso; - xcgmbb = -pParam->BSIM4v6cgbo; - - xcdgmb = xcgmdb; - xcsgmb = xcgmsb; - xcbgmb = xcgmbb; - - xcggb = here->BSIM4v6cggb; - xcgdb = here->BSIM4v6cgsb; - xcgsb = here->BSIM4v6cgdb; - xcgbb = -(xcggb + xcgdb + xcgsb); - - xcdgb = -(here->BSIM4v6cggb + here->BSIM4v6cbgb - + here->BSIM4v6cdgb); - xcsgb = here->BSIM4v6cdgb; - xcbgb = here->BSIM4v6cbgb; - } - else - { xcggb = here->BSIM4v6cggb + cgdo + cgso - + pParam->BSIM4v6cgbo; - xcgdb = here->BSIM4v6cgsb - cgdo; - xcgsb = here->BSIM4v6cgdb - cgso; - xcgbb = -(xcggb + xcgdb + xcgsb); - - xcdgb = -(here->BSIM4v6cggb + here->BSIM4v6cbgb - + here->BSIM4v6cdgb + cgdo); - xcsgb = here->BSIM4v6cdgb - cgso; - xcbgb = here->BSIM4v6cbgb - pParam->BSIM4v6cgbo; - - xcdgmb = xcsgmb = xcbgmb = 0.0; - } - xcddb = here->BSIM4v6capbd + cgdo - (here->BSIM4v6cgsb - + here->BSIM4v6cbsb + here->BSIM4v6cdsb); - xcdsb = -(here->BSIM4v6cgdb + here->BSIM4v6cbdb - + here->BSIM4v6cddb); - - xcsdb = here->BSIM4v6cdsb; - xcssb = here->BSIM4v6cddb + here->BSIM4v6capbs + cgso; - - if (!here->BSIM4v6rbodyMod) - { xcdbb = -(xcdgb + xcddb + xcdsb + xcdgmb); - xcsbb = -(xcsgb + xcsdb + xcssb + xcsgmb); - xcbdb = here->BSIM4v6cbsb - here->BSIM4v6capbd; - xcbsb = here->BSIM4v6cbdb - here->BSIM4v6capbs; - xcdbdb = 0.0; - } - else - { xcdbb = -(xcdgb + xcddb + xcdsb + xcdgmb) - + here->BSIM4v6capbd; - xcsbb = -(here->BSIM4v6cddb + here->BSIM4v6cdgb - + here->BSIM4v6cdsb); - xcbdb = here->BSIM4v6cbsb; - xcbsb = here->BSIM4v6cbdb; - xcdbdb = -here->BSIM4v6capbd; - xcsbsb = -here->BSIM4v6capbs; - } - xcbbb = -(xcbgb + xcbdb + xcbsb + xcbgmb); - - xgtg = xgtd = xgts = xgtb = 0.0; - sxpart = 0.4; - dxpart = 0.6; - ddxpart_dVd = ddxpart_dVg = ddxpart_dVb - = ddxpart_dVs = 0.0; - dsxpart_dVd = dsxpart_dVg = dsxpart_dVb - = dsxpart_dVs = 0.0; - } - else - { xcggb = xcgdb = xcgsb = xcgbb = 0.0; - xcbgb = xcbdb = xcbsb = xcbbb = 0.0; - xcdgb = xcddb = xcdsb = xcdbb = 0.0; - xcsgb = xcsdb = xcssb = xcsbb = 0.0; - - xgtg = here->BSIM4v6gtg; - xgtd = here->BSIM4v6gts; - xgts = here->BSIM4v6gtd; - xgtb = here->BSIM4v6gtb; - - xcqgb = here->BSIM4v6cqgb; - xcqdb = here->BSIM4v6cqsb; - xcqsb = here->BSIM4v6cqdb; - xcqbb = here->BSIM4v6cqbb; - - CoxWL = model->BSIM4v6coxe * here->pParam->BSIM4v6weffCV - * here->BSIM4v6nf * here->pParam->BSIM4v6leffCV; - qcheq = -(here->BSIM4v6qgate + here->BSIM4v6qbulk); - if (fabs(qcheq) <= 1.0e-5 * CoxWL) - { if (model->BSIM4v6xpart < 0.5) - { sxpart = 0.4; - } - else if (model->BSIM4v6xpart > 0.5) - { sxpart = 0.0; - } - else - { sxpart = 0.5; - } - dsxpart_dVd = dsxpart_dVg = dsxpart_dVb - = dsxpart_dVs = 0.0; - } - else - { sxpart = here->BSIM4v6qdrn / qcheq; - Css = here->BSIM4v6cddb; - Cds = -(here->BSIM4v6cgdb + here->BSIM4v6cddb - + here->BSIM4v6cbdb); - dsxpart_dVs = (Css - sxpart * (Css + Cds)) / qcheq; - Csg = here->BSIM4v6cdgb; - Cdg = -(here->BSIM4v6cggb + here->BSIM4v6cdgb - + here->BSIM4v6cbgb); - dsxpart_dVg = (Csg - sxpart * (Csg + Cdg)) / qcheq; - - Csd = here->BSIM4v6cdsb; - Cdd = -(here->BSIM4v6cgsb + here->BSIM4v6cdsb - + here->BSIM4v6cbsb); - dsxpart_dVd = (Csd - sxpart * (Csd + Cdd)) / qcheq; - - dsxpart_dVb = -(dsxpart_dVd + dsxpart_dVg - + dsxpart_dVs); - } - dxpart = 1.0 - sxpart; - ddxpart_dVd = -dsxpart_dVd; - ddxpart_dVg = -dsxpart_dVg; - ddxpart_dVs = -dsxpart_dVs; - ddxpart_dVb = -(ddxpart_dVd + ddxpart_dVg + ddxpart_dVs); - } - } - - if (model->BSIM4v6rdsMod == 1) - { gstot = here->BSIM4v6gstot; - gstotd = here->BSIM4v6gstotd; - gstotg = here->BSIM4v6gstotg; - gstots = here->BSIM4v6gstots - gstot; - gstotb = here->BSIM4v6gstotb; - - gdtot = here->BSIM4v6gdtot; - gdtotd = here->BSIM4v6gdtotd - gdtot; - gdtotg = here->BSIM4v6gdtotg; - gdtots = here->BSIM4v6gdtots; - gdtotb = here->BSIM4v6gdtotb; - } - else - { gstot = gstotd = gstotg = gstots = gstotb = 0.0; - gdtot = gdtotd = gdtotg = gdtots = gdtotb = 0.0; - } - - - T1 = *(ckt->CKTstate0 + here->BSIM4v6qdef) * here->BSIM4v6gtau; - gds = here->BSIM4v6gds; - - /* - * Loading PZ matrix - */ - m = here->BSIM4v6m; - - if (!model->BSIM4v6rdsMod) - { gdpr = here->BSIM4v6drainConductance; - gspr = here->BSIM4v6sourceConductance; - } - else - gdpr = gspr = 0.0; - - if (!here->BSIM4v6rbodyMod) - { gjbd = here->BSIM4v6gbd; - gjbs = here->BSIM4v6gbs; - } - else - gjbd = gjbs = 0.0; - - geltd = here->BSIM4v6grgeltd; - - if (here->BSIM4v6rgateMod == 1) - { *(here->BSIM4v6GEgePtr) += m * geltd; - *(here->BSIM4v6GPgePtr) -= m * geltd; - *(here->BSIM4v6GEgpPtr) -= m * geltd; - - *(here->BSIM4v6GPgpPtr ) += m * xcggb * s->real; - *(here->BSIM4v6GPgpPtr +1) += m * xcggb * s->imag; - *(here->BSIM4v6GPgpPtr) += m * (geltd - xgtg + gIgtotg); - *(here->BSIM4v6GPdpPtr ) += m * xcgdb * s->real; - *(here->BSIM4v6GPdpPtr +1) += m * xcgdb * s->imag; - *(here->BSIM4v6GPdpPtr) -= m * (xgtd - gIgtotd); - *(here->BSIM4v6GPspPtr ) += m * xcgsb * s->real; - *(here->BSIM4v6GPspPtr +1) += m * xcgsb * s->imag; - *(here->BSIM4v6GPspPtr) -= m * (xgts - gIgtots); - *(here->BSIM4v6GPbpPtr ) += m * xcgbb * s->real; - *(here->BSIM4v6GPbpPtr +1) += m * xcgbb * s->imag; - *(here->BSIM4v6GPbpPtr) -= m * (xgtb - gIgtotb); - } - else if (here->BSIM4v6rgateMod == 2) - { *(here->BSIM4v6GEgePtr) += m * gcrg; - *(here->BSIM4v6GEgpPtr) += m * gcrgg; - *(here->BSIM4v6GEdpPtr) += m * gcrgd; - *(here->BSIM4v6GEspPtr) += m * gcrgs; - *(here->BSIM4v6GEbpPtr) += m * gcrgb; - - *(here->BSIM4v6GPgePtr) -= m * gcrg; - *(here->BSIM4v6GPgpPtr ) += m * xcggb * s->real; - *(here->BSIM4v6GPgpPtr +1) += m * xcggb * s->imag; - *(here->BSIM4v6GPgpPtr) -= m * (gcrgg + xgtg - gIgtotg); - *(here->BSIM4v6GPdpPtr ) += m * xcgdb * s->real; - *(here->BSIM4v6GPdpPtr +1) += m * xcgdb * s->imag; - *(here->BSIM4v6GPdpPtr) -= m * (gcrgd + xgtd - gIgtotd); - *(here->BSIM4v6GPspPtr ) += m * xcgsb * s->real; - *(here->BSIM4v6GPspPtr +1) += m * xcgsb * s->imag; - *(here->BSIM4v6GPspPtr) -= m * (gcrgs + xgts - gIgtots); - *(here->BSIM4v6GPbpPtr ) += m * xcgbb * s->real; - *(here->BSIM4v6GPbpPtr +1) += m * xcgbb * s->imag; - *(here->BSIM4v6GPbpPtr) -= m * (gcrgb + xgtb - gIgtotb); - } - else if (here->BSIM4v6rgateMod == 3) - { *(here->BSIM4v6GEgePtr) += m * geltd; - *(here->BSIM4v6GEgmPtr) -= m * geltd; - *(here->BSIM4v6GMgePtr) -= m * geltd; - *(here->BSIM4v6GMgmPtr) += m * (geltd + gcrg); - *(here->BSIM4v6GMgmPtr ) += m * xcgmgmb * s->real; - *(here->BSIM4v6GMgmPtr +1) += m * xcgmgmb * s->imag; - - *(here->BSIM4v6GMdpPtr) += m * gcrgd; - *(here->BSIM4v6GMdpPtr ) += m * xcgmdb * s->real; - *(here->BSIM4v6GMdpPtr +1) += m * xcgmdb * s->imag; - *(here->BSIM4v6GMgpPtr) += m * gcrgg; - *(here->BSIM4v6GMspPtr) += m * gcrgs; - *(here->BSIM4v6GMspPtr ) += m * xcgmsb * s->real; - *(here->BSIM4v6GMspPtr +1) += m * xcgmsb * s->imag; - *(here->BSIM4v6GMbpPtr) += m * gcrgb; - *(here->BSIM4v6GMbpPtr ) += m * xcgmbb * s->real; - *(here->BSIM4v6GMbpPtr +1) += m * xcgmbb * s->imag; - - *(here->BSIM4v6DPgmPtr ) += m * xcdgmb * s->real; - *(here->BSIM4v6DPgmPtr +1) += m * xcdgmb * s->imag; - *(here->BSIM4v6GPgmPtr) -= m * gcrg; - *(here->BSIM4v6SPgmPtr ) += m * xcsgmb * s->real; - *(here->BSIM4v6SPgmPtr +1) += m * xcsgmb * s->imag; - *(here->BSIM4v6BPgmPtr ) += m * xcbgmb * s->real; - *(here->BSIM4v6BPgmPtr +1) += m * xcbgmb * s->imag; - - *(here->BSIM4v6GPgpPtr) -= m * (gcrgg + xgtg - gIgtotg); - *(here->BSIM4v6GPgpPtr ) += m * xcggb * s->real; - *(here->BSIM4v6GPgpPtr +1) += m * xcggb * s->imag; - *(here->BSIM4v6GPdpPtr) -= m * (gcrgd + xgtd - gIgtotd); - *(here->BSIM4v6GPdpPtr ) += m * xcgdb * s->real; - *(here->BSIM4v6GPdpPtr +1) += m * xcgdb * s->imag; - *(here->BSIM4v6GPspPtr) -= m * (gcrgs + xgts - gIgtots); - *(here->BSIM4v6GPspPtr ) += m * xcgsb * s->real; - *(here->BSIM4v6GPspPtr +1) += m * xcgsb * s->imag; - *(here->BSIM4v6GPbpPtr) -= m * (gcrgb + xgtb - gIgtotb); - *(here->BSIM4v6GPbpPtr ) += m * xcgbb * s->real; - *(here->BSIM4v6GPbpPtr +1) += m * xcgbb * s->imag; - } - else - { *(here->BSIM4v6GPdpPtr ) += m * xcgdb * s->real; - *(here->BSIM4v6GPdpPtr +1) += m * xcgdb * s->imag; - *(here->BSIM4v6GPdpPtr) -= m * (xgtd - gIgtotd); - *(here->BSIM4v6GPgpPtr ) += m * xcggb * s->real; - *(here->BSIM4v6GPgpPtr +1) += m * xcggb * s->imag; - *(here->BSIM4v6GPgpPtr) -= m * (xgtg - gIgtotg); - *(here->BSIM4v6GPspPtr ) += m * xcgsb * s->real; - *(here->BSIM4v6GPspPtr +1) += m * xcgsb * s->imag; - *(here->BSIM4v6GPspPtr) -= m * (xgts - gIgtots); - *(here->BSIM4v6GPbpPtr ) += m * xcgbb * s->real; - *(here->BSIM4v6GPbpPtr +1) += m * xcgbb * s->imag; - *(here->BSIM4v6GPbpPtr) -= m * (xgtb - gIgtotb); - } - - if (model->BSIM4v6rdsMod) - { (*(here->BSIM4v6DgpPtr) += m * gdtotg); - (*(here->BSIM4v6DspPtr) += m * gdtots); - (*(here->BSIM4v6DbpPtr) += m * gdtotb); - (*(here->BSIM4v6SdpPtr) += m * gstotd); - (*(here->BSIM4v6SgpPtr) += m * gstotg); - (*(here->BSIM4v6SbpPtr) += m * gstotb); - } - - *(here->BSIM4v6DPdpPtr ) += m * xcddb * s->real; - *(here->BSIM4v6DPdpPtr +1) += m * xcddb * s->imag; - *(here->BSIM4v6DPdpPtr) += m * (gdpr + gds + here->BSIM4v6gbd - - gdtotd + RevSum + gbdpdp - gIdtotd - + dxpart * xgtd + T1 * ddxpart_dVd); - *(here->BSIM4v6DPdPtr) -= m * (gdpr + gdtot); - *(here->BSIM4v6DPgpPtr ) += m * xcdgb * s->real; - *(here->BSIM4v6DPgpPtr +1) += m * xcdgb * s->imag; - *(here->BSIM4v6DPgpPtr) += m * (Gm - gdtotg + gbdpg - gIdtotg - + T1 * ddxpart_dVg + dxpart * xgtg); - *(here->BSIM4v6DPspPtr ) += m * xcdsb * s->real; - *(here->BSIM4v6DPspPtr +1) += m * xcdsb * s->imag; - *(here->BSIM4v6DPspPtr) -= m * (gds + FwdSum + gdtots - gbdpsp + gIdtots - - T1 * ddxpart_dVs - dxpart * xgts); - *(here->BSIM4v6DPbpPtr ) += m * xcdbb * s->real; - *(here->BSIM4v6DPbpPtr +1) += m * xcdbb * s->imag; - *(here->BSIM4v6DPbpPtr) -= m * (gjbd + gdtotb - Gmbs - gbdpb + gIdtotb - - T1 * ddxpart_dVb - dxpart * xgtb); - - *(here->BSIM4v6DdpPtr) -= m * (gdpr - gdtotd); - *(here->BSIM4v6DdPtr) += m * (gdpr + gdtot); - - *(here->BSIM4v6SPdpPtr ) += m * xcsdb * s->real; - *(here->BSIM4v6SPdpPtr +1) += m * xcsdb * s->imag; - *(here->BSIM4v6SPdpPtr) -= m * (gds + gstotd + RevSum - gbspdp + gIstotd - - T1 * dsxpart_dVd - sxpart * xgtd); - *(here->BSIM4v6SPgpPtr ) += m * xcsgb * s->real; - *(here->BSIM4v6SPgpPtr +1) += m * xcsgb * s->imag; - *(here->BSIM4v6SPgpPtr) -= m * (Gm + gstotg - gbspg + gIstotg - - T1 * dsxpart_dVg - sxpart * xgtg); - *(here->BSIM4v6SPspPtr ) += m * xcssb * s->real; - *(here->BSIM4v6SPspPtr +1) += m * xcssb * s->imag; - *(here->BSIM4v6SPspPtr) += m * (gspr + gds + here->BSIM4v6gbs - gIstots - - gstots + FwdSum + gbspsp - + sxpart * xgts + T1 * dsxpart_dVs); - *(here->BSIM4v6SPsPtr) -= m * (gspr + gstot); - *(here->BSIM4v6SPbpPtr ) += m * xcsbb * s->real; - *(here->BSIM4v6SPbpPtr +1) += m * xcsbb * s->imag; - *(here->BSIM4v6SPbpPtr) -= m * (gjbs + gstotb + Gmbs - gbspb + gIstotb - - T1 * dsxpart_dVb - sxpart * xgtb); - - *(here->BSIM4v6SspPtr) -= m * (gspr - gstots); - *(here->BSIM4v6SsPtr) += m * (gspr + gstot); - - *(here->BSIM4v6BPdpPtr ) += m * xcbdb * s->real; - *(here->BSIM4v6BPdpPtr +1) += m * xcbdb * s->imag; - *(here->BSIM4v6BPdpPtr) -= m * (gjbd - gbbdp + gIbtotd); - *(here->BSIM4v6BPgpPtr ) += m * xcbgb * s->real; - *(here->BSIM4v6BPgpPtr +1) += m * xcbgb * s->imag; - *(here->BSIM4v6BPgpPtr) -= m * (here->BSIM4v6gbgs + gIbtotg); - *(here->BSIM4v6BPspPtr ) += m * xcbsb * s->real; - *(here->BSIM4v6BPspPtr +1) += m * xcbsb * s->imag; - *(here->BSIM4v6BPspPtr) -= m * (gjbs - gbbsp + gIbtots); - *(here->BSIM4v6BPbpPtr ) += m * xcbbb * s->real; - *(here->BSIM4v6BPbpPtr +1) += m * xcbbb * s->imag; - *(here->BSIM4v6BPbpPtr) += m * (gjbd + gjbs - here->BSIM4v6gbbs - - gIbtotb); - ggidld = here->BSIM4v6ggidld; - ggidlg = here->BSIM4v6ggidlg; - ggidlb = here->BSIM4v6ggidlb; - ggislg = here->BSIM4v6ggislg; - ggisls = here->BSIM4v6ggisls; - ggislb = here->BSIM4v6ggislb; - - /* stamp gidl */ - (*(here->BSIM4v6DPdpPtr) += m * ggidld); - (*(here->BSIM4v6DPgpPtr) += m * ggidlg); - (*(here->BSIM4v6DPspPtr) -= m * ((ggidlg + ggidld) + ggidlb)); - (*(here->BSIM4v6DPbpPtr) += m * ggidlb); - (*(here->BSIM4v6BPdpPtr) -= m * ggidld); - (*(here->BSIM4v6BPgpPtr) -= m * ggidlg); - (*(here->BSIM4v6BPspPtr) += m * ((ggidlg + ggidld) + ggidlb)); - (*(here->BSIM4v6BPbpPtr) -= m * ggidlb); - /* stamp gisl */ - (*(here->BSIM4v6SPdpPtr) -= m * ((ggisls + ggislg) + ggislb)); - (*(here->BSIM4v6SPgpPtr) += m * ggislg); - (*(here->BSIM4v6SPspPtr) += m * ggisls); - (*(here->BSIM4v6SPbpPtr) += m * ggislb); - (*(here->BSIM4v6BPdpPtr) += m * ((ggislg + ggisls) + ggislb)); - (*(here->BSIM4v6BPgpPtr) -= m * ggislg); - (*(here->BSIM4v6BPspPtr) -= m * ggisls); - (*(here->BSIM4v6BPbpPtr) -= m * ggislb); - - if (here->BSIM4v6rbodyMod) - { (*(here->BSIM4v6DPdbPtr ) += m * xcdbdb * s->real); - (*(here->BSIM4v6DPdbPtr +1) += m * xcdbdb * s->imag); - (*(here->BSIM4v6DPdbPtr) -= m * here->BSIM4v6gbd); - (*(here->BSIM4v6SPsbPtr ) += m * xcsbsb * s->real); - (*(here->BSIM4v6SPsbPtr +1) += m * xcsbsb * s->imag); - (*(here->BSIM4v6SPsbPtr) -= m * here->BSIM4v6gbs); - - (*(here->BSIM4v6DBdpPtr ) += m * xcdbdb * s->real); - (*(here->BSIM4v6DBdpPtr +1) += m * xcdbdb * s->imag); - (*(here->BSIM4v6DBdpPtr) -= m * here->BSIM4v6gbd); - (*(here->BSIM4v6DBdbPtr ) -= m * xcdbdb * s->real); - (*(here->BSIM4v6DBdbPtr +1) -= m * xcdbdb * s->imag); - (*(here->BSIM4v6DBdbPtr) += m * (here->BSIM4v6gbd + here->BSIM4v6grbpd - + here->BSIM4v6grbdb)); - (*(here->BSIM4v6DBbpPtr) -= m * here->BSIM4v6grbpd); - (*(here->BSIM4v6DBbPtr) -= m * here->BSIM4v6grbdb); - - (*(here->BSIM4v6BPdbPtr) -= m * here->BSIM4v6grbpd); - (*(here->BSIM4v6BPbPtr) -= m * here->BSIM4v6grbpb); - (*(here->BSIM4v6BPsbPtr) -= m * here->BSIM4v6grbps); - (*(here->BSIM4v6BPbpPtr) += m * (here->BSIM4v6grbpd + here->BSIM4v6grbps - + here->BSIM4v6grbpb)); - /* WDL: (-here->BSIM4v6gbbs) already added to BPbpPtr */ - - (*(here->BSIM4v6SBspPtr ) += m * xcsbsb * s->real); - (*(here->BSIM4v6SBspPtr +1) += m * xcsbsb * s->imag); - (*(here->BSIM4v6SBspPtr) -= m * here->BSIM4v6gbs); - (*(here->BSIM4v6SBbpPtr) -= m * here->BSIM4v6grbps); - (*(here->BSIM4v6SBbPtr) -= m * here->BSIM4v6grbsb); - (*(here->BSIM4v6SBsbPtr ) -= m * xcsbsb * s->real); - (*(here->BSIM4v6SBsbPtr +1) -= m * xcsbsb * s->imag); - (*(here->BSIM4v6SBsbPtr) += m * (here->BSIM4v6gbs - + here->BSIM4v6grbps + here->BSIM4v6grbsb)); - - (*(here->BSIM4v6BdbPtr) -= m * here->BSIM4v6grbdb); - (*(here->BSIM4v6BbpPtr) -= m * here->BSIM4v6grbpb); - (*(here->BSIM4v6BsbPtr) -= m * here->BSIM4v6grbsb); - (*(here->BSIM4v6BbPtr) += m * (here->BSIM4v6grbsb + here->BSIM4v6grbdb - + here->BSIM4v6grbpb)); - } - - if (here->BSIM4v6acnqsMod) - { *(here->BSIM4v6QqPtr ) += m * s->real * ScalingFactor; - *(here->BSIM4v6QqPtr +1) += m * s->imag * ScalingFactor; - *(here->BSIM4v6QgpPtr ) -= m * xcqgb * s->real; - *(here->BSIM4v6QgpPtr +1) -= m * xcqgb * s->imag; - *(here->BSIM4v6QdpPtr ) -= m * xcqdb * s->real; - *(here->BSIM4v6QdpPtr +1) -= m * xcqdb * s->imag; - *(here->BSIM4v6QbpPtr ) -= m * xcqbb * s->real; - *(here->BSIM4v6QbpPtr +1) -= m * xcqbb * s->imag; - *(here->BSIM4v6QspPtr ) -= m * xcqsb * s->real; - *(here->BSIM4v6QspPtr +1) -= m * xcqsb * s->imag; - - *(here->BSIM4v6GPqPtr) -= m * here->BSIM4v6gtau; - *(here->BSIM4v6DPqPtr) += m * dxpart * here->BSIM4v6gtau; - *(here->BSIM4v6SPqPtr) += m * sxpart * here->BSIM4v6gtau; - - *(here->BSIM4v6QqPtr) += m * here->BSIM4v6gtau; - *(here->BSIM4v6QgpPtr) += m * xgtg; - *(here->BSIM4v6QdpPtr) += m * xgtd; - *(here->BSIM4v6QbpPtr) += m * xgtb; - *(here->BSIM4v6QspPtr) += m * xgts; - } - } - } - return(OK); -} diff --git a/src/spicelib/devices/bsim4v6/b4v6set.c b/src/spicelib/devices/bsim4v6/b4v6set.c deleted file mode 100644 index 6040ac0b4..000000000 --- a/src/spicelib/devices/bsim4v6/b4v6set.c +++ /dev/null @@ -1,2527 +0,0 @@ -/**** BSIM4.6.2 Released by Wenwei Yang 07/31/2008 ****/ -/**** BSIM4.6.4 Update ngspice 08/22/2009 ****/ -/**** OpenMP support ngspice 06/28/2010 ****/ -/********** - * Copyright 2006 Regents of the University of California. All rights reserved. - * File: b4set.c of BSIM4.6.2. - * Author: 2000 Weidong Liu - * Authors: 2001- Xuemei Xi, Mohan Dunga, Ali Niknejad, Chenming Hu. - * Authors: 2006- Mohan Dunga, Ali Niknejad, Chenming Hu - * Authors: 2007- Mohan Dunga, Wenwei Yang, Ali Niknejad, Chenming Hu - * Authors: 2008- Wenwei Yang, Ali Niknejad, Chenming Hu - * Project Director: Prof. Chenming Hu. - * Modified by Xuemei Xi, 04/06/2001. - * Modified by Xuemei Xi, 10/05/2001. - * Modified by Xuemei Xi, 11/15/2002. - * Modified by Xuemei Xi, 05/09/2003. - * Modified by Xuemei Xi, 03/04/2004. - * Modified by Xuemei Xi, Mohan Dunga, 07/29/2005. - * Modified by Mohan Dunga, 12/13/2006 - * Modified by Mohan Dunga, Wenwei Yang, 05/18/2007. - * Modified by Wenwei Yang, 07/31/2008. -**********/ - -#include "ngspice/ngspice.h" -#include "ngspice/jobdefs.h" -#include "ngspice/ftedefs.h" -#include "ngspice/smpdefs.h" -#include "ngspice/cktdefs.h" -#include "bsim4v6def.h" -#include "ngspice/const.h" -#include "ngspice/sperror.h" -#include "ngspice/suffix.h" - -#ifdef USE_OMP -#include "ngspice/cpextern.h" -#endif - -#define MAX_EXP 5.834617425e14 -#define MIN_EXP 1.713908431e-15 -#define EXP_THRESHOLD 34.0 -#define EPS0 8.85418e-12 -#define EPSSI 1.03594e-10 -#define PI 3.141592654 -#define Charge_q 1.60219e-19 - -int -BSIM4v6setup( -SMPmatrix *matrix, -GENmodel *inModel, -CKTcircuit *ckt, -int *states) -{ -BSIM4v6model *model = (BSIM4v6model*)inModel; -BSIM4v6instance *here; -int error; -CKTnode *tmp; -int noiseAnalGiven = 0, createNode; /* Criteria for new node creation */ -double Rtot, DMCGeff, DMCIeff, DMDGeff; -JOB *job; - - -#ifdef USE_OMP -int idx, InstCount; -BSIM4v6instance **InstArray; -#endif - - /* Search for a noise analysis request */ - for (job = ft_curckt->ci_curTask->jobs; job; job = job->JOBnextJob) { - if(strcmp(job->JOBname,"Noise Analysis")==0) { - noiseAnalGiven = 1; - break; - } - } - - /* loop through all the BSIM4v6 device models */ - for( ; model != NULL; model = BSIM4v6nextModel(model)) - { /* process defaults of model parameters */ - if (!model->BSIM4v6typeGiven) - model->BSIM4v6type = NMOS; - - if (!model->BSIM4v6mobModGiven) - model->BSIM4v6mobMod = 0; - else if ((model->BSIM4v6mobMod != 0) && (model->BSIM4v6mobMod != 1) - && (model->BSIM4v6mobMod != 2) && (model->BSIM4v6mobMod != 3)) - { model->BSIM4v6mobMod = 0; - printf("Warning: mobMod has been set to its default value: 0.\n"); - } - - if (!model->BSIM4v6binUnitGiven) - model->BSIM4v6binUnit = 1; - if (!model->BSIM4v6paramChkGiven) - model->BSIM4v6paramChk = 1; - - if (!model->BSIM4v6dioModGiven) - model->BSIM4v6dioMod = 1; - else if ((model->BSIM4v6dioMod != 0) && (model->BSIM4v6dioMod != 1) - && (model->BSIM4v6dioMod != 2)) - { model->BSIM4v6dioMod = 1; - printf("Warning: dioMod has been set to its default value: 1.\n"); - } - - if (!model->BSIM4v6cvchargeModGiven) - model->BSIM4v6cvchargeMod = 0; - if (!model->BSIM4v6capModGiven) - model->BSIM4v6capMod = 2; - else if ((model->BSIM4v6capMod != 0) && (model->BSIM4v6capMod != 1) - && (model->BSIM4v6capMod != 2)) - { model->BSIM4v6capMod = 2; - printf("Warning: capMod has been set to its default value: 2.\n"); - } - - if (!model->BSIM4v6rdsModGiven) - model->BSIM4v6rdsMod = 0; - else if ((model->BSIM4v6rdsMod != 0) && (model->BSIM4v6rdsMod != 1)) - { model->BSIM4v6rdsMod = 0; - printf("Warning: rdsMod has been set to its default value: 0.\n"); - } - if (!model->BSIM4v6rbodyModGiven) - model->BSIM4v6rbodyMod = 0; - else if ((model->BSIM4v6rbodyMod != 0) && (model->BSIM4v6rbodyMod != 1) && (model->BSIM4v6rbodyMod != 2)) - { model->BSIM4v6rbodyMod = 0; - printf("Warning: rbodyMod has been set to its default value: 0.\n"); - } - - if (!model->BSIM4v6rgateModGiven) - model->BSIM4v6rgateMod = 0; - else if ((model->BSIM4v6rgateMod != 0) && (model->BSIM4v6rgateMod != 1) - && (model->BSIM4v6rgateMod != 2) && (model->BSIM4v6rgateMod != 3)) - { model->BSIM4v6rgateMod = 0; - printf("Warning: rgateMod has been set to its default value: 0.\n"); - } - - if (!model->BSIM4v6perModGiven) - model->BSIM4v6perMod = 1; - else if ((model->BSIM4v6perMod != 0) && (model->BSIM4v6perMod != 1)) - { model->BSIM4v6perMod = 1; - printf("Warning: perMod has been set to its default value: 1.\n"); - } - - if (!model->BSIM4v6geoModGiven) - model->BSIM4v6geoMod = 0; - - if (!model->BSIM4v6rgeoModGiven) - model->BSIM4v6rgeoMod = 0; - else if ((model->BSIM4v6rgeoMod != 0) && (model->BSIM4v6rgeoMod != 1)) - { model->BSIM4v6rgeoMod = 1; - printf("Warning: rgeoMod has been set to its default value: 1.\n"); - } - if (!model->BSIM4v6fnoiModGiven) - model->BSIM4v6fnoiMod = 1; - else if ((model->BSIM4v6fnoiMod != 0) && (model->BSIM4v6fnoiMod != 1)) - { model->BSIM4v6fnoiMod = 1; - printf("Warning: fnoiMod has been set to its default value: 1.\n"); - } - if (!model->BSIM4v6tnoiModGiven) - model->BSIM4v6tnoiMod = 0; /* WDLiu: tnoiMod=1 needs to set internal S/D nodes */ - else if ((model->BSIM4v6tnoiMod != 0) && (model->BSIM4v6tnoiMod != 1)) - { model->BSIM4v6tnoiMod = 0; - printf("Warning: tnoiMod has been set to its default value: 0.\n"); - } - - if (!model->BSIM4v6trnqsModGiven) - model->BSIM4v6trnqsMod = 0; - else if ((model->BSIM4v6trnqsMod != 0) && (model->BSIM4v6trnqsMod != 1)) - { model->BSIM4v6trnqsMod = 0; - printf("Warning: trnqsMod has been set to its default value: 0.\n"); - } - if (!model->BSIM4v6acnqsModGiven) - model->BSIM4v6acnqsMod = 0; - else if ((model->BSIM4v6acnqsMod != 0) && (model->BSIM4v6acnqsMod != 1)) - { model->BSIM4v6acnqsMod = 0; - printf("Warning: acnqsMod has been set to its default value: 0.\n"); - } - - if (!model->BSIM4v6mtrlModGiven) - model->BSIM4v6mtrlMod = 0; - - if (!model->BSIM4v6igcModGiven) - model->BSIM4v6igcMod = 0; - else if ((model->BSIM4v6igcMod != 0) && (model->BSIM4v6igcMod != 1) - && (model->BSIM4v6igcMod != 2)) - { model->BSIM4v6igcMod = 0; - printf("Warning: igcMod has been set to its default value: 0.\n"); - } - if (!model->BSIM4v6igbModGiven) - model->BSIM4v6igbMod = 0; - else if ((model->BSIM4v6igbMod != 0) && (model->BSIM4v6igbMod != 1)) - { model->BSIM4v6igbMod = 0; - printf("Warning: igbMod has been set to its default value: 0.\n"); - } - if (!model->BSIM4v6tempModGiven) - model->BSIM4v6tempMod = 0; - else if ((model->BSIM4v6tempMod != 0) && (model->BSIM4v6tempMod != 1) - && (model->BSIM4v6tempMod != 2) && (model->BSIM4v6tempMod != 3)) - { model->BSIM4v6tempMod = 0; - printf("Warning: tempMod has been set to its default value: 0.\n"); - } - - if (!model->BSIM4v6versionGiven) - model->BSIM4v6version = "4.6.4"; - if (!model->BSIM4v6toxrefGiven) - model->BSIM4v6toxref = 30.0e-10; - if (!model->BSIM4v6eotGiven) - model->BSIM4v6eot = 15.0e-10; - if (!model->BSIM4v6vddeotGiven) - model->BSIM4v6vddeot = (model->BSIM4v6type == NMOS) ? 1.5 : -1.5; - if (!model->BSIM4v6tempeotGiven) - model->BSIM4v6tempeot = 300.15; - if (!model->BSIM4v6leffeotGiven) - model->BSIM4v6leffeot = 1; - if (!model->BSIM4v6weffeotGiven) - model->BSIM4v6weffeot = 10; - if (!model->BSIM4v6adosGiven) - model->BSIM4v6ados = 1.0; - if (!model->BSIM4v6bdosGiven) - model->BSIM4v6bdos = 1.0; - if (!model->BSIM4v6toxeGiven) - model->BSIM4v6toxe = 30.0e-10; - if (!model->BSIM4v6toxpGiven) - model->BSIM4v6toxp = model->BSIM4v6toxe; - if (!model->BSIM4v6toxmGiven) - model->BSIM4v6toxm = model->BSIM4v6toxe; - if (!model->BSIM4v6dtoxGiven) - model->BSIM4v6dtox = 0.0; - if (!model->BSIM4v6epsroxGiven) - model->BSIM4v6epsrox = 3.9; - - if (!model->BSIM4v6cdscGiven) - model->BSIM4v6cdsc = 2.4e-4; /* unit Q/V/m^2 */ - if (!model->BSIM4v6cdscbGiven) - model->BSIM4v6cdscb = 0.0; /* unit Q/V/m^2 */ - if (!model->BSIM4v6cdscdGiven) - model->BSIM4v6cdscd = 0.0; /* unit Q/V/m^2 */ - if (!model->BSIM4v6citGiven) - model->BSIM4v6cit = 0.0; /* unit Q/V/m^2 */ - if (!model->BSIM4v6nfactorGiven) - model->BSIM4v6nfactor = 1.0; - if (!model->BSIM4v6xjGiven) - model->BSIM4v6xj = .15e-6; - if (!model->BSIM4v6vsatGiven) - model->BSIM4v6vsat = 8.0e4; /* unit m/s */ - if (!model->BSIM4v6atGiven) - model->BSIM4v6at = 3.3e4; /* unit m/s */ - if (!model->BSIM4v6a0Given) - model->BSIM4v6a0 = 1.0; - if (!model->BSIM4v6agsGiven) - model->BSIM4v6ags = 0.0; - if (!model->BSIM4v6a1Given) - model->BSIM4v6a1 = 0.0; - if (!model->BSIM4v6a2Given) - model->BSIM4v6a2 = 1.0; - if (!model->BSIM4v6ketaGiven) - model->BSIM4v6keta = -0.047; /* unit / V */ - if (!model->BSIM4v6nsubGiven) - model->BSIM4v6nsub = 6.0e16; /* unit 1/cm3 */ - if (!model->BSIM4v6phigGiven) - model->BSIM4v6phig = 4.05; - if (!model->BSIM4v6epsrgateGiven) - model->BSIM4v6epsrgate = 11.7; - if (!model->BSIM4v6easubGiven) - model->BSIM4v6easub = 4.05; - if (!model->BSIM4v6epsrsubGiven) - model->BSIM4v6epsrsub = 11.7; - if (!model->BSIM4v6ni0subGiven) - model->BSIM4v6ni0sub = 1.45e10; /* unit 1/cm3 */ - if (!model->BSIM4v6bg0subGiven) - model->BSIM4v6bg0sub = 1.16; /* unit eV */ - if (!model->BSIM4v6tbgasubGiven) - model->BSIM4v6tbgasub = 7.02e-4; - if (!model->BSIM4v6tbgbsubGiven) - model->BSIM4v6tbgbsub = 1108.0; - if (!model->BSIM4v6ndepGiven) - model->BSIM4v6ndep = 1.7e17; /* unit 1/cm3 */ - if (!model->BSIM4v6nsdGiven) - model->BSIM4v6nsd = 1.0e20; /* unit 1/cm3 */ - if (!model->BSIM4v6phinGiven) - model->BSIM4v6phin = 0.0; /* unit V */ - if (!model->BSIM4v6ngateGiven) - model->BSIM4v6ngate = 0; /* unit 1/cm3 */ - if (!model->BSIM4v6vbmGiven) - model->BSIM4v6vbm = -3.0; - if (!model->BSIM4v6xtGiven) - model->BSIM4v6xt = 1.55e-7; - if (!model->BSIM4v6kt1Given) - model->BSIM4v6kt1 = -0.11; /* unit V */ - if (!model->BSIM4v6kt1lGiven) - model->BSIM4v6kt1l = 0.0; /* unit V*m */ - if (!model->BSIM4v6kt2Given) - model->BSIM4v6kt2 = 0.022; /* No unit */ - if (!model->BSIM4v6k3Given) - model->BSIM4v6k3 = 80.0; - if (!model->BSIM4v6k3bGiven) - model->BSIM4v6k3b = 0.0; - if (!model->BSIM4v6w0Given) - model->BSIM4v6w0 = 2.5e-6; - if (!model->BSIM4v6lpe0Given) - model->BSIM4v6lpe0 = 1.74e-7; - if (!model->BSIM4v6lpebGiven) - model->BSIM4v6lpeb = 0.0; - if (!model->BSIM4v6dvtp0Given) - model->BSIM4v6dvtp0 = 0.0; - if (!model->BSIM4v6dvtp1Given) - model->BSIM4v6dvtp1 = 0.0; - if (!model->BSIM4v6dvt0Given) - model->BSIM4v6dvt0 = 2.2; - if (!model->BSIM4v6dvt1Given) - model->BSIM4v6dvt1 = 0.53; - if (!model->BSIM4v6dvt2Given) - model->BSIM4v6dvt2 = -0.032; /* unit 1 / V */ - - if (!model->BSIM4v6dvt0wGiven) - model->BSIM4v6dvt0w = 0.0; - if (!model->BSIM4v6dvt1wGiven) - model->BSIM4v6dvt1w = 5.3e6; - if (!model->BSIM4v6dvt2wGiven) - model->BSIM4v6dvt2w = -0.032; - - if (!model->BSIM4v6droutGiven) - model->BSIM4v6drout = 0.56; - if (!model->BSIM4v6dsubGiven) - model->BSIM4v6dsub = model->BSIM4v6drout; - if (!model->BSIM4v6vth0Given) - model->BSIM4v6vth0 = (model->BSIM4v6type == NMOS) ? 0.7 : -0.7; - if (!model->BSIM4v6vfbGiven) - model->BSIM4v6vfb = -1.0; - if (!model->BSIM4v6euGiven) - model->BSIM4v6eu = (model->BSIM4v6type == NMOS) ? 1.67 : 1.0; - if (!model->BSIM4v6ucsGiven) - model->BSIM4v6ucs = (model->BSIM4v6type == NMOS) ? 1.67 : 1.0; - if (!model->BSIM4v6uaGiven) - model->BSIM4v6ua = ((model->BSIM4v6mobMod == 2)) ? 1.0e-15 : 1.0e-9; /* unit m/V */ - if (!model->BSIM4v6ua1Given) - model->BSIM4v6ua1 = 1.0e-9; /* unit m/V */ - if (!model->BSIM4v6ubGiven) - model->BSIM4v6ub = 1.0e-19; /* unit (m/V)**2 */ - if (!model->BSIM4v6ub1Given) - model->BSIM4v6ub1 = -1.0e-18; /* unit (m/V)**2 */ - if (!model->BSIM4v6ucGiven) - model->BSIM4v6uc = (model->BSIM4v6mobMod == 1) ? -0.0465 : -0.0465e-9; - if (!model->BSIM4v6uc1Given) - model->BSIM4v6uc1 = (model->BSIM4v6mobMod == 1) ? -0.056 : -0.056e-9; - if (!model->BSIM4v6udGiven) - model->BSIM4v6ud = 0.0; /* unit m**(-2) */ - if (!model->BSIM4v6ud1Given) - model->BSIM4v6ud1 = 0.0; - if (!model->BSIM4v6upGiven) - model->BSIM4v6up = 0.0; - if (!model->BSIM4v6lpGiven) - model->BSIM4v6lp = 1.0e-8; - if (!model->BSIM4v6u0Given) - model->BSIM4v6u0 = (model->BSIM4v6type == NMOS) ? 0.067 : 0.025; - if (!model->BSIM4v6uteGiven) - model->BSIM4v6ute = -1.5; - if (!model->BSIM4v6ucsteGiven) - model->BSIM4v6ucste = -4.775e-3; - if (!model->BSIM4v6voffGiven) - model->BSIM4v6voff = -0.08; - if (!model->BSIM4v6vofflGiven) - model->BSIM4v6voffl = 0.0; - if (!model->BSIM4v6voffcvlGiven) - model->BSIM4v6voffcvl = 0.0; - if (!model->BSIM4v6minvGiven) - model->BSIM4v6minv = 0.0; - if (!model->BSIM4v6minvcvGiven) - model->BSIM4v6minvcv = 0.0; - if (!model->BSIM4v6fproutGiven) - model->BSIM4v6fprout = 0.0; - if (!model->BSIM4v6pditsGiven) - model->BSIM4v6pdits = 0.0; - if (!model->BSIM4v6pditsdGiven) - model->BSIM4v6pditsd = 0.0; - if (!model->BSIM4v6pditslGiven) - model->BSIM4v6pditsl = 0.0; - if (!model->BSIM4v6deltaGiven) - model->BSIM4v6delta = 0.01; - if (!model->BSIM4v6rdswminGiven) - model->BSIM4v6rdswmin = 0.0; - if (!model->BSIM4v6rdwminGiven) - model->BSIM4v6rdwmin = 0.0; - if (!model->BSIM4v6rswminGiven) - model->BSIM4v6rswmin = 0.0; - if (!model->BSIM4v6rdswGiven) - model->BSIM4v6rdsw = 200.0; /* in ohm*um */ - if (!model->BSIM4v6rdwGiven) - model->BSIM4v6rdw = 100.0; - if (!model->BSIM4v6rswGiven) - model->BSIM4v6rsw = 100.0; - if (!model->BSIM4v6prwgGiven) - model->BSIM4v6prwg = 1.0; /* in 1/V */ - if (!model->BSIM4v6prwbGiven) - model->BSIM4v6prwb = 0.0; - if (!model->BSIM4v6prtGiven) - model->BSIM4v6prt = 0.0; - if (!model->BSIM4v6eta0Given) - model->BSIM4v6eta0 = 0.08; /* no unit */ - if (!model->BSIM4v6etabGiven) - model->BSIM4v6etab = -0.07; /* unit 1/V */ - if (!model->BSIM4v6pclmGiven) - model->BSIM4v6pclm = 1.3; /* no unit */ - if (!model->BSIM4v6pdibl1Given) - model->BSIM4v6pdibl1 = 0.39; /* no unit */ - if (!model->BSIM4v6pdibl2Given) - model->BSIM4v6pdibl2 = 0.0086; /* no unit */ - if (!model->BSIM4v6pdiblbGiven) - model->BSIM4v6pdiblb = 0.0; /* 1/V */ - if (!model->BSIM4v6pscbe1Given) - model->BSIM4v6pscbe1 = 4.24e8; - if (!model->BSIM4v6pscbe2Given) - model->BSIM4v6pscbe2 = 1.0e-5; - if (!model->BSIM4v6pvagGiven) - model->BSIM4v6pvag = 0.0; - if (!model->BSIM4v6wrGiven) - model->BSIM4v6wr = 1.0; - if (!model->BSIM4v6dwgGiven) - model->BSIM4v6dwg = 0.0; - if (!model->BSIM4v6dwbGiven) - model->BSIM4v6dwb = 0.0; - if (!model->BSIM4v6b0Given) - model->BSIM4v6b0 = 0.0; - if (!model->BSIM4v6b1Given) - model->BSIM4v6b1 = 0.0; - if (!model->BSIM4v6alpha0Given) - model->BSIM4v6alpha0 = 0.0; - if (!model->BSIM4v6alpha1Given) - model->BSIM4v6alpha1 = 0.0; - if (!model->BSIM4v6beta0Given) - model->BSIM4v6beta0 = 0.0; - if (!model->BSIM4v6agidlGiven) - model->BSIM4v6agidl = 0.0; - if (!model->BSIM4v6bgidlGiven) - model->BSIM4v6bgidl = 2.3e9; /* V/m */ - if (!model->BSIM4v6cgidlGiven) - model->BSIM4v6cgidl = 0.5; /* V^3 */ - if (!model->BSIM4v6egidlGiven) - model->BSIM4v6egidl = 0.8; /* V */ - if (!model->BSIM4v6agislGiven) - { - if (model->BSIM4v6agidlGiven) - model->BSIM4v6agisl = model->BSIM4v6agidl; - else - model->BSIM4v6agisl = 0.0; - } - if (!model->BSIM4v6bgislGiven) - { - if (model->BSIM4v6bgidlGiven) - model->BSIM4v6bgisl = model->BSIM4v6bgidl; - else - model->BSIM4v6bgisl = 2.3e9; /* V/m */ - } - if (!model->BSIM4v6cgislGiven) - { - if (model->BSIM4v6cgidlGiven) - model->BSIM4v6cgisl = model->BSIM4v6cgidl; - else - model->BSIM4v6cgisl = 0.5; /* V^3 */ - } - if (!model->BSIM4v6egislGiven) - { - if (model->BSIM4v6egidlGiven) - model->BSIM4v6egisl = model->BSIM4v6egidl; - else - model->BSIM4v6egisl = 0.8; /* V */ - } - if (!model->BSIM4v6aigcGiven) - model->BSIM4v6aigc = (model->BSIM4v6type == NMOS) ? 1.36e-2 : 9.80e-3; - if (!model->BSIM4v6bigcGiven) - model->BSIM4v6bigc = (model->BSIM4v6type == NMOS) ? 1.71e-3 : 7.59e-4; - if (!model->BSIM4v6cigcGiven) - model->BSIM4v6cigc = (model->BSIM4v6type == NMOS) ? 0.075 : 0.03; - if (model->BSIM4v6aigsdGiven) - { - model->BSIM4v6aigs = model->BSIM4v6aigd = model->BSIM4v6aigsd; - } - else - { - model->BSIM4v6aigsd = (model->BSIM4v6type == NMOS) ? 1.36e-2 : 9.80e-3; - if (!model->BSIM4v6aigsGiven) - model->BSIM4v6aigs = (model->BSIM4v6type == NMOS) ? 1.36e-2 : 9.80e-3; - if (!model->BSIM4v6aigdGiven) - model->BSIM4v6aigd = (model->BSIM4v6type == NMOS) ? 1.36e-2 : 9.80e-3; - } - if (model->BSIM4v6bigsdGiven) - { - model->BSIM4v6bigs = model->BSIM4v6bigd = model->BSIM4v6bigsd; - } - else - { - model->BSIM4v6bigsd = (model->BSIM4v6type == NMOS) ? 1.71e-3 : 7.59e-4; - if (!model->BSIM4v6bigsGiven) - model->BSIM4v6bigs = (model->BSIM4v6type == NMOS) ? 1.71e-3 : 7.59e-4; - if (!model->BSIM4v6bigdGiven) - model->BSIM4v6bigd = (model->BSIM4v6type == NMOS) ? 1.71e-3 : 7.59e-4; - } - if (model->BSIM4v6cigsdGiven) - { - model->BSIM4v6cigs = model->BSIM4v6cigd = model->BSIM4v6cigsd; - } - else - { - model->BSIM4v6cigsd = (model->BSIM4v6type == NMOS) ? 0.075 : 0.03; - if (!model->BSIM4v6cigsGiven) - model->BSIM4v6cigs = (model->BSIM4v6type == NMOS) ? 0.075 : 0.03; - if (!model->BSIM4v6cigdGiven) - model->BSIM4v6cigd = (model->BSIM4v6type == NMOS) ? 0.075 : 0.03; - } - if (!model->BSIM4v6aigbaccGiven) - model->BSIM4v6aigbacc = 1.36e-2; - if (!model->BSIM4v6bigbaccGiven) - model->BSIM4v6bigbacc = 1.71e-3; - if (!model->BSIM4v6cigbaccGiven) - model->BSIM4v6cigbacc = 0.075; - if (!model->BSIM4v6aigbinvGiven) - model->BSIM4v6aigbinv = 1.11e-2; - if (!model->BSIM4v6bigbinvGiven) - model->BSIM4v6bigbinv = 9.49e-4; - if (!model->BSIM4v6cigbinvGiven) - model->BSIM4v6cigbinv = 0.006; - if (!model->BSIM4v6nigcGiven) - model->BSIM4v6nigc = 1.0; - if (!model->BSIM4v6nigbinvGiven) - model->BSIM4v6nigbinv = 3.0; - if (!model->BSIM4v6nigbaccGiven) - model->BSIM4v6nigbacc = 1.0; - if (!model->BSIM4v6ntoxGiven) - model->BSIM4v6ntox = 1.0; - if (!model->BSIM4v6eigbinvGiven) - model->BSIM4v6eigbinv = 1.1; - if (!model->BSIM4v6pigcdGiven) - model->BSIM4v6pigcd = 1.0; - if (!model->BSIM4v6poxedgeGiven) - model->BSIM4v6poxedge = 1.0; - if (!model->BSIM4v6xrcrg1Given) - model->BSIM4v6xrcrg1 = 12.0; - if (!model->BSIM4v6xrcrg2Given) - model->BSIM4v6xrcrg2 = 1.0; - if (!model->BSIM4v6ijthsfwdGiven) - model->BSIM4v6ijthsfwd = 0.1; /* unit A */ - if (!model->BSIM4v6ijthdfwdGiven) - model->BSIM4v6ijthdfwd = model->BSIM4v6ijthsfwd; - if (!model->BSIM4v6ijthsrevGiven) - model->BSIM4v6ijthsrev = 0.1; /* unit A */ - if (!model->BSIM4v6ijthdrevGiven) - model->BSIM4v6ijthdrev = model->BSIM4v6ijthsrev; - if (!model->BSIM4v6tnoiaGiven) - model->BSIM4v6tnoia = 1.5; - if (!model->BSIM4v6tnoibGiven) - model->BSIM4v6tnoib = 3.5; - if (!model->BSIM4v6rnoiaGiven) - model->BSIM4v6rnoia = 0.577; - if (!model->BSIM4v6rnoibGiven) - model->BSIM4v6rnoib = 0.5164; - if (!model->BSIM4v6ntnoiGiven) - model->BSIM4v6ntnoi = 1.0; - if (!model->BSIM4v6lambdaGiven) - model->BSIM4v6lambda = 0.0; - if (!model->BSIM4v6vtlGiven) - model->BSIM4v6vtl = 2.0e5; /* unit m/s */ - if (!model->BSIM4v6xnGiven) - model->BSIM4v6xn = 3.0; - if (!model->BSIM4v6lcGiven) - model->BSIM4v6lc = 5.0e-9; - if (!model->BSIM4v6vfbsdoffGiven) - model->BSIM4v6vfbsdoff = 0.0; /* unit v */ - if (!model->BSIM4v6tvfbsdoffGiven) - model->BSIM4v6tvfbsdoff = 0.0; - if (!model->BSIM4v6tvoffGiven) - model->BSIM4v6tvoff = 0.0; - - if (!model->BSIM4v6lintnoiGiven) - model->BSIM4v6lintnoi = 0.0; /* unit m */ - - if (!model->BSIM4v6xjbvsGiven) - model->BSIM4v6xjbvs = 1.0; /* no unit */ - if (!model->BSIM4v6xjbvdGiven) - model->BSIM4v6xjbvd = model->BSIM4v6xjbvs; - if (!model->BSIM4v6bvsGiven) - model->BSIM4v6bvs = 10.0; /* V */ - if (!model->BSIM4v6bvdGiven) - model->BSIM4v6bvd = model->BSIM4v6bvs; - - if (!model->BSIM4v6gbminGiven) - model->BSIM4v6gbmin = 1.0e-12; /* in mho */ - if (!model->BSIM4v6rbdbGiven) - model->BSIM4v6rbdb = 50.0; /* in ohm */ - if (!model->BSIM4v6rbpbGiven) - model->BSIM4v6rbpb = 50.0; - if (!model->BSIM4v6rbsbGiven) - model->BSIM4v6rbsb = 50.0; - if (!model->BSIM4v6rbpsGiven) - model->BSIM4v6rbps = 50.0; - if (!model->BSIM4v6rbpdGiven) - model->BSIM4v6rbpd = 50.0; - - if (!model->BSIM4v6rbps0Given) - model->BSIM4v6rbps0 = 50.0; - if (!model->BSIM4v6rbpslGiven) - model->BSIM4v6rbpsl = 0.0; - if (!model->BSIM4v6rbpswGiven) - model->BSIM4v6rbpsw = 0.0; - if (!model->BSIM4v6rbpsnfGiven) - model->BSIM4v6rbpsnf = 0.0; - - if (!model->BSIM4v6rbpd0Given) - model->BSIM4v6rbpd0 = 50.0; - if (!model->BSIM4v6rbpdlGiven) - model->BSIM4v6rbpdl = 0.0; - if (!model->BSIM4v6rbpdwGiven) - model->BSIM4v6rbpdw = 0.0; - if (!model->BSIM4v6rbpdnfGiven) - model->BSIM4v6rbpdnf = 0.0; - - if (!model->BSIM4v6rbpbx0Given) - model->BSIM4v6rbpbx0 = 100.0; - if (!model->BSIM4v6rbpbxlGiven) - model->BSIM4v6rbpbxl = 0.0; - if (!model->BSIM4v6rbpbxwGiven) - model->BSIM4v6rbpbxw = 0.0; - if (!model->BSIM4v6rbpbxnfGiven) - model->BSIM4v6rbpbxnf = 0.0; - if (!model->BSIM4v6rbpby0Given) - model->BSIM4v6rbpby0 = 100.0; - if (!model->BSIM4v6rbpbylGiven) - model->BSIM4v6rbpbyl = 0.0; - if (!model->BSIM4v6rbpbywGiven) - model->BSIM4v6rbpbyw = 0.0; - if (!model->BSIM4v6rbpbynfGiven) - model->BSIM4v6rbpbynf = 0.0; - - - if (!model->BSIM4v6rbsbx0Given) - model->BSIM4v6rbsbx0 = 100.0; - if (!model->BSIM4v6rbsby0Given) - model->BSIM4v6rbsby0 = 100.0; - if (!model->BSIM4v6rbdbx0Given) - model->BSIM4v6rbdbx0 = 100.0; - if (!model->BSIM4v6rbdby0Given) - model->BSIM4v6rbdby0 = 100.0; - - - if (!model->BSIM4v6rbsdbxlGiven) - model->BSIM4v6rbsdbxl = 0.0; - if (!model->BSIM4v6rbsdbxwGiven) - model->BSIM4v6rbsdbxw = 0.0; - if (!model->BSIM4v6rbsdbxnfGiven) - model->BSIM4v6rbsdbxnf = 0.0; - if (!model->BSIM4v6rbsdbylGiven) - model->BSIM4v6rbsdbyl = 0.0; - if (!model->BSIM4v6rbsdbywGiven) - model->BSIM4v6rbsdbyw = 0.0; - if (!model->BSIM4v6rbsdbynfGiven) - model->BSIM4v6rbsdbynf = 0.0; - - if (!model->BSIM4v6cgslGiven) - model->BSIM4v6cgsl = 0.0; - if (!model->BSIM4v6cgdlGiven) - model->BSIM4v6cgdl = 0.0; - if (!model->BSIM4v6ckappasGiven) - model->BSIM4v6ckappas = 0.6; - if (!model->BSIM4v6ckappadGiven) - model->BSIM4v6ckappad = model->BSIM4v6ckappas; - if (!model->BSIM4v6clcGiven) - model->BSIM4v6clc = 0.1e-6; - if (!model->BSIM4v6cleGiven) - model->BSIM4v6cle = 0.6; - if (!model->BSIM4v6vfbcvGiven) - model->BSIM4v6vfbcv = -1.0; - if (!model->BSIM4v6acdeGiven) - model->BSIM4v6acde = 1.0; - if (!model->BSIM4v6moinGiven) - model->BSIM4v6moin = 15.0; - if (!model->BSIM4v6noffGiven) - model->BSIM4v6noff = 1.0; - if (!model->BSIM4v6voffcvGiven) - model->BSIM4v6voffcv = 0.0; - if (!model->BSIM4v6dmcgGiven) - model->BSIM4v6dmcg = 0.0; - if (!model->BSIM4v6dmciGiven) - model->BSIM4v6dmci = model->BSIM4v6dmcg; - if (!model->BSIM4v6dmdgGiven) - model->BSIM4v6dmdg = 0.0; - if (!model->BSIM4v6dmcgtGiven) - model->BSIM4v6dmcgt = 0.0; - if (!model->BSIM4v6xgwGiven) - model->BSIM4v6xgw = 0.0; - if (!model->BSIM4v6xglGiven) - model->BSIM4v6xgl = 0.0; - if (!model->BSIM4v6rshgGiven) - model->BSIM4v6rshg = 0.1; - if (!model->BSIM4v6ngconGiven) - model->BSIM4v6ngcon = 1.0; - if (!model->BSIM4v6tcjGiven) - model->BSIM4v6tcj = 0.0; - if (!model->BSIM4v6tpbGiven) - model->BSIM4v6tpb = 0.0; - if (!model->BSIM4v6tcjswGiven) - model->BSIM4v6tcjsw = 0.0; - if (!model->BSIM4v6tpbswGiven) - model->BSIM4v6tpbsw = 0.0; - if (!model->BSIM4v6tcjswgGiven) - model->BSIM4v6tcjswg = 0.0; - if (!model->BSIM4v6tpbswgGiven) - model->BSIM4v6tpbswg = 0.0; - - /* Length dependence */ - if (!model->BSIM4v6lcdscGiven) - model->BSIM4v6lcdsc = 0.0; - if (!model->BSIM4v6lcdscbGiven) - model->BSIM4v6lcdscb = 0.0; - if (!model->BSIM4v6lcdscdGiven) - model->BSIM4v6lcdscd = 0.0; - if (!model->BSIM4v6lcitGiven) - model->BSIM4v6lcit = 0.0; - if (!model->BSIM4v6lnfactorGiven) - model->BSIM4v6lnfactor = 0.0; - if (!model->BSIM4v6lxjGiven) - model->BSIM4v6lxj = 0.0; - if (!model->BSIM4v6lvsatGiven) - model->BSIM4v6lvsat = 0.0; - if (!model->BSIM4v6latGiven) - model->BSIM4v6lat = 0.0; - if (!model->BSIM4v6la0Given) - model->BSIM4v6la0 = 0.0; - if (!model->BSIM4v6lagsGiven) - model->BSIM4v6lags = 0.0; - if (!model->BSIM4v6la1Given) - model->BSIM4v6la1 = 0.0; - if (!model->BSIM4v6la2Given) - model->BSIM4v6la2 = 0.0; - if (!model->BSIM4v6lketaGiven) - model->BSIM4v6lketa = 0.0; - if (!model->BSIM4v6lnsubGiven) - model->BSIM4v6lnsub = 0.0; - if (!model->BSIM4v6lndepGiven) - model->BSIM4v6lndep = 0.0; - if (!model->BSIM4v6lnsdGiven) - model->BSIM4v6lnsd = 0.0; - if (!model->BSIM4v6lphinGiven) - model->BSIM4v6lphin = 0.0; - if (!model->BSIM4v6lngateGiven) - model->BSIM4v6lngate = 0.0; - if (!model->BSIM4v6lvbmGiven) - model->BSIM4v6lvbm = 0.0; - if (!model->BSIM4v6lxtGiven) - model->BSIM4v6lxt = 0.0; - if (!model->BSIM4v6lkt1Given) - model->BSIM4v6lkt1 = 0.0; - if (!model->BSIM4v6lkt1lGiven) - model->BSIM4v6lkt1l = 0.0; - if (!model->BSIM4v6lkt2Given) - model->BSIM4v6lkt2 = 0.0; - if (!model->BSIM4v6lk3Given) - model->BSIM4v6lk3 = 0.0; - if (!model->BSIM4v6lk3bGiven) - model->BSIM4v6lk3b = 0.0; - if (!model->BSIM4v6lw0Given) - model->BSIM4v6lw0 = 0.0; - if (!model->BSIM4v6llpe0Given) - model->BSIM4v6llpe0 = 0.0; - if (!model->BSIM4v6llpebGiven) - model->BSIM4v6llpeb = 0.0; - if (!model->BSIM4v6ldvtp0Given) - model->BSIM4v6ldvtp0 = 0.0; - if (!model->BSIM4v6ldvtp1Given) - model->BSIM4v6ldvtp1 = 0.0; - if (!model->BSIM4v6ldvt0Given) - model->BSIM4v6ldvt0 = 0.0; - if (!model->BSIM4v6ldvt1Given) - model->BSIM4v6ldvt1 = 0.0; - if (!model->BSIM4v6ldvt2Given) - model->BSIM4v6ldvt2 = 0.0; - if (!model->BSIM4v6ldvt0wGiven) - model->BSIM4v6ldvt0w = 0.0; - if (!model->BSIM4v6ldvt1wGiven) - model->BSIM4v6ldvt1w = 0.0; - if (!model->BSIM4v6ldvt2wGiven) - model->BSIM4v6ldvt2w = 0.0; - if (!model->BSIM4v6ldroutGiven) - model->BSIM4v6ldrout = 0.0; - if (!model->BSIM4v6ldsubGiven) - model->BSIM4v6ldsub = 0.0; - if (!model->BSIM4v6lvth0Given) - model->BSIM4v6lvth0 = 0.0; - if (!model->BSIM4v6luaGiven) - model->BSIM4v6lua = 0.0; - if (!model->BSIM4v6lua1Given) - model->BSIM4v6lua1 = 0.0; - if (!model->BSIM4v6lubGiven) - model->BSIM4v6lub = 0.0; - if (!model->BSIM4v6lub1Given) - model->BSIM4v6lub1 = 0.0; - if (!model->BSIM4v6lucGiven) - model->BSIM4v6luc = 0.0; - if (!model->BSIM4v6luc1Given) - model->BSIM4v6luc1 = 0.0; - if (!model->BSIM4v6ludGiven) - model->BSIM4v6lud = 0.0; - if (!model->BSIM4v6lud1Given) - model->BSIM4v6lud1 = 0.0; - if (!model->BSIM4v6lupGiven) - model->BSIM4v6lup = 0.0; - if (!model->BSIM4v6llpGiven) - model->BSIM4v6llp = 0.0; - if (!model->BSIM4v6lu0Given) - model->BSIM4v6lu0 = 0.0; - if (!model->BSIM4v6luteGiven) - model->BSIM4v6lute = 0.0; - if (!model->BSIM4v6lucsteGiven) - model->BSIM4v6lucste = 0.0; - if (!model->BSIM4v6lvoffGiven) - model->BSIM4v6lvoff = 0.0; - if (!model->BSIM4v6lminvGiven) - model->BSIM4v6lminv = 0.0; - if (!model->BSIM4v6lminvcvGiven) - model->BSIM4v6lminvcv = 0.0; - if (!model->BSIM4v6lfproutGiven) - model->BSIM4v6lfprout = 0.0; - if (!model->BSIM4v6lpditsGiven) - model->BSIM4v6lpdits = 0.0; - if (!model->BSIM4v6lpditsdGiven) - model->BSIM4v6lpditsd = 0.0; - if (!model->BSIM4v6ldeltaGiven) - model->BSIM4v6ldelta = 0.0; - if (!model->BSIM4v6lrdswGiven) - model->BSIM4v6lrdsw = 0.0; - if (!model->BSIM4v6lrdwGiven) - model->BSIM4v6lrdw = 0.0; - if (!model->BSIM4v6lrswGiven) - model->BSIM4v6lrsw = 0.0; - if (!model->BSIM4v6lprwbGiven) - model->BSIM4v6lprwb = 0.0; - if (!model->BSIM4v6lprwgGiven) - model->BSIM4v6lprwg = 0.0; - if (!model->BSIM4v6lprtGiven) - model->BSIM4v6lprt = 0.0; - if (!model->BSIM4v6leta0Given) - model->BSIM4v6leta0 = 0.0; - if (!model->BSIM4v6letabGiven) - model->BSIM4v6letab = -0.0; - if (!model->BSIM4v6lpclmGiven) - model->BSIM4v6lpclm = 0.0; - if (!model->BSIM4v6lpdibl1Given) - model->BSIM4v6lpdibl1 = 0.0; - if (!model->BSIM4v6lpdibl2Given) - model->BSIM4v6lpdibl2 = 0.0; - if (!model->BSIM4v6lpdiblbGiven) - model->BSIM4v6lpdiblb = 0.0; - if (!model->BSIM4v6lpscbe1Given) - model->BSIM4v6lpscbe1 = 0.0; - if (!model->BSIM4v6lpscbe2Given) - model->BSIM4v6lpscbe2 = 0.0; - if (!model->BSIM4v6lpvagGiven) - model->BSIM4v6lpvag = 0.0; - if (!model->BSIM4v6lwrGiven) - model->BSIM4v6lwr = 0.0; - if (!model->BSIM4v6ldwgGiven) - model->BSIM4v6ldwg = 0.0; - if (!model->BSIM4v6ldwbGiven) - model->BSIM4v6ldwb = 0.0; - if (!model->BSIM4v6lb0Given) - model->BSIM4v6lb0 = 0.0; - if (!model->BSIM4v6lb1Given) - model->BSIM4v6lb1 = 0.0; - if (!model->BSIM4v6lalpha0Given) - model->BSIM4v6lalpha0 = 0.0; - if (!model->BSIM4v6lalpha1Given) - model->BSIM4v6lalpha1 = 0.0; - if (!model->BSIM4v6lbeta0Given) - model->BSIM4v6lbeta0 = 0.0; - if (!model->BSIM4v6lagidlGiven) - model->BSIM4v6lagidl = 0.0; - if (!model->BSIM4v6lbgidlGiven) - model->BSIM4v6lbgidl = 0.0; - if (!model->BSIM4v6lcgidlGiven) - model->BSIM4v6lcgidl = 0.0; - if (!model->BSIM4v6legidlGiven) - model->BSIM4v6legidl = 0.0; - if (!model->BSIM4v6lagislGiven) - { - if (model->BSIM4v6lagidlGiven) - model->BSIM4v6lagisl = model->BSIM4v6lagidl; - else - model->BSIM4v6lagisl = 0.0; - } - if (!model->BSIM4v6lbgislGiven) - { - if (model->BSIM4v6lbgidlGiven) - model->BSIM4v6lbgisl = model->BSIM4v6lbgidl; - else - model->BSIM4v6lbgisl = 0.0; - } - if (!model->BSIM4v6lcgislGiven) - { - if (model->BSIM4v6lcgidlGiven) - model->BSIM4v6lcgisl = model->BSIM4v6lcgidl; - else - model->BSIM4v6lcgisl = 0.0; - } - if (!model->BSIM4v6legislGiven) - { - if (model->BSIM4v6legidlGiven) - model->BSIM4v6legisl = model->BSIM4v6legidl; - else - model->BSIM4v6legisl = 0.0; - } - if (!model->BSIM4v6laigcGiven) - model->BSIM4v6laigc = 0.0; - if (!model->BSIM4v6lbigcGiven) - model->BSIM4v6lbigc = 0.0; - if (!model->BSIM4v6lcigcGiven) - model->BSIM4v6lcigc = 0.0; - if (!model->BSIM4v6aigsdGiven && (model->BSIM4v6aigsGiven || model->BSIM4v6aigdGiven)) - { - if (!model->BSIM4v6laigsGiven) - model->BSIM4v6laigs = 0.0; - if (!model->BSIM4v6laigdGiven) - model->BSIM4v6laigd = 0.0; - } - else - { - if (!model->BSIM4v6laigsdGiven) - model->BSIM4v6laigsd = 0.0; - model->BSIM4v6laigs = model->BSIM4v6laigd = model->BSIM4v6laigsd; - } - if (!model->BSIM4v6bigsdGiven && (model->BSIM4v6bigsGiven || model->BSIM4v6bigdGiven)) - { - if (!model->BSIM4v6lbigsGiven) - model->BSIM4v6lbigs = 0.0; - if (!model->BSIM4v6lbigdGiven) - model->BSIM4v6lbigd = 0.0; - } - else - { - if (!model->BSIM4v6lbigsdGiven) - model->BSIM4v6lbigsd = 0.0; - model->BSIM4v6lbigs = model->BSIM4v6lbigd = model->BSIM4v6lbigsd; - } - if (!model->BSIM4v6cigsdGiven && (model->BSIM4v6cigsGiven || model->BSIM4v6cigdGiven)) - { - if (!model->BSIM4v6lcigsGiven) - model->BSIM4v6lcigs = 0.0; - if (!model->BSIM4v6lcigdGiven) - model->BSIM4v6lcigd = 0.0; - } - else - { - if (!model->BSIM4v6lcigsdGiven) - model->BSIM4v6lcigsd = 0.0; - model->BSIM4v6lcigs = model->BSIM4v6lcigd = model->BSIM4v6lcigsd; - } - if (!model->BSIM4v6laigbaccGiven) - model->BSIM4v6laigbacc = 0.0; - if (!model->BSIM4v6lbigbaccGiven) - model->BSIM4v6lbigbacc = 0.0; - if (!model->BSIM4v6lcigbaccGiven) - model->BSIM4v6lcigbacc = 0.0; - if (!model->BSIM4v6laigbinvGiven) - model->BSIM4v6laigbinv = 0.0; - if (!model->BSIM4v6lbigbinvGiven) - model->BSIM4v6lbigbinv = 0.0; - if (!model->BSIM4v6lcigbinvGiven) - model->BSIM4v6lcigbinv = 0.0; - if (!model->BSIM4v6lnigcGiven) - model->BSIM4v6lnigc = 0.0; - if (!model->BSIM4v6lnigbinvGiven) - model->BSIM4v6lnigbinv = 0.0; - if (!model->BSIM4v6lnigbaccGiven) - model->BSIM4v6lnigbacc = 0.0; - if (!model->BSIM4v6lntoxGiven) - model->BSIM4v6lntox = 0.0; - if (!model->BSIM4v6leigbinvGiven) - model->BSIM4v6leigbinv = 0.0; - if (!model->BSIM4v6lpigcdGiven) - model->BSIM4v6lpigcd = 0.0; - if (!model->BSIM4v6lpoxedgeGiven) - model->BSIM4v6lpoxedge = 0.0; - if (!model->BSIM4v6lxrcrg1Given) - model->BSIM4v6lxrcrg1 = 0.0; - if (!model->BSIM4v6lxrcrg2Given) - model->BSIM4v6lxrcrg2 = 0.0; - if (!model->BSIM4v6leuGiven) - model->BSIM4v6leu = 0.0; - if (!model->BSIM4v6lucsGiven) - model->BSIM4v6lucs = 0.0; - if (!model->BSIM4v6lvfbGiven) - model->BSIM4v6lvfb = 0.0; - if (!model->BSIM4v6llambdaGiven) - model->BSIM4v6llambda = 0.0; - if (!model->BSIM4v6lvtlGiven) - model->BSIM4v6lvtl = 0.0; - if (!model->BSIM4v6lxnGiven) - model->BSIM4v6lxn = 0.0; - if (!model->BSIM4v6lvfbsdoffGiven) - model->BSIM4v6lvfbsdoff = 0.0; - if (!model->BSIM4v6ltvfbsdoffGiven) - model->BSIM4v6ltvfbsdoff = 0.0; - if (!model->BSIM4v6ltvoffGiven) - model->BSIM4v6ltvoff = 0.0; - - - if (!model->BSIM4v6lcgslGiven) - model->BSIM4v6lcgsl = 0.0; - if (!model->BSIM4v6lcgdlGiven) - model->BSIM4v6lcgdl = 0.0; - if (!model->BSIM4v6lckappasGiven) - model->BSIM4v6lckappas = 0.0; - if (!model->BSIM4v6lckappadGiven) - model->BSIM4v6lckappad = 0.0; - if (!model->BSIM4v6lclcGiven) - model->BSIM4v6lclc = 0.0; - if (!model->BSIM4v6lcleGiven) - model->BSIM4v6lcle = 0.0; - if (!model->BSIM4v6lcfGiven) - model->BSIM4v6lcf = 0.0; - if (!model->BSIM4v6lvfbcvGiven) - model->BSIM4v6lvfbcv = 0.0; - if (!model->BSIM4v6lacdeGiven) - model->BSIM4v6lacde = 0.0; - if (!model->BSIM4v6lmoinGiven) - model->BSIM4v6lmoin = 0.0; - if (!model->BSIM4v6lnoffGiven) - model->BSIM4v6lnoff = 0.0; - if (!model->BSIM4v6lvoffcvGiven) - model->BSIM4v6lvoffcv = 0.0; - - /* Width dependence */ - if (!model->BSIM4v6wcdscGiven) - model->BSIM4v6wcdsc = 0.0; - if (!model->BSIM4v6wcdscbGiven) - model->BSIM4v6wcdscb = 0.0; - if (!model->BSIM4v6wcdscdGiven) - model->BSIM4v6wcdscd = 0.0; - if (!model->BSIM4v6wcitGiven) - model->BSIM4v6wcit = 0.0; - if (!model->BSIM4v6wnfactorGiven) - model->BSIM4v6wnfactor = 0.0; - if (!model->BSIM4v6wxjGiven) - model->BSIM4v6wxj = 0.0; - if (!model->BSIM4v6wvsatGiven) - model->BSIM4v6wvsat = 0.0; - if (!model->BSIM4v6watGiven) - model->BSIM4v6wat = 0.0; - if (!model->BSIM4v6wa0Given) - model->BSIM4v6wa0 = 0.0; - if (!model->BSIM4v6wagsGiven) - model->BSIM4v6wags = 0.0; - if (!model->BSIM4v6wa1Given) - model->BSIM4v6wa1 = 0.0; - if (!model->BSIM4v6wa2Given) - model->BSIM4v6wa2 = 0.0; - if (!model->BSIM4v6wketaGiven) - model->BSIM4v6wketa = 0.0; - if (!model->BSIM4v6wnsubGiven) - model->BSIM4v6wnsub = 0.0; - if (!model->BSIM4v6wndepGiven) - model->BSIM4v6wndep = 0.0; - if (!model->BSIM4v6wnsdGiven) - model->BSIM4v6wnsd = 0.0; - if (!model->BSIM4v6wphinGiven) - model->BSIM4v6wphin = 0.0; - if (!model->BSIM4v6wngateGiven) - model->BSIM4v6wngate = 0.0; - if (!model->BSIM4v6wvbmGiven) - model->BSIM4v6wvbm = 0.0; - if (!model->BSIM4v6wxtGiven) - model->BSIM4v6wxt = 0.0; - if (!model->BSIM4v6wkt1Given) - model->BSIM4v6wkt1 = 0.0; - if (!model->BSIM4v6wkt1lGiven) - model->BSIM4v6wkt1l = 0.0; - if (!model->BSIM4v6wkt2Given) - model->BSIM4v6wkt2 = 0.0; - if (!model->BSIM4v6wk3Given) - model->BSIM4v6wk3 = 0.0; - if (!model->BSIM4v6wk3bGiven) - model->BSIM4v6wk3b = 0.0; - if (!model->BSIM4v6ww0Given) - model->BSIM4v6ww0 = 0.0; - if (!model->BSIM4v6wlpe0Given) - model->BSIM4v6wlpe0 = 0.0; - if (!model->BSIM4v6wlpebGiven) - model->BSIM4v6wlpeb = 0.0; - if (!model->BSIM4v6wdvtp0Given) - model->BSIM4v6wdvtp0 = 0.0; - if (!model->BSIM4v6wdvtp1Given) - model->BSIM4v6wdvtp1 = 0.0; - if (!model->BSIM4v6wdvt0Given) - model->BSIM4v6wdvt0 = 0.0; - if (!model->BSIM4v6wdvt1Given) - model->BSIM4v6wdvt1 = 0.0; - if (!model->BSIM4v6wdvt2Given) - model->BSIM4v6wdvt2 = 0.0; - if (!model->BSIM4v6wdvt0wGiven) - model->BSIM4v6wdvt0w = 0.0; - if (!model->BSIM4v6wdvt1wGiven) - model->BSIM4v6wdvt1w = 0.0; - if (!model->BSIM4v6wdvt2wGiven) - model->BSIM4v6wdvt2w = 0.0; - if (!model->BSIM4v6wdroutGiven) - model->BSIM4v6wdrout = 0.0; - if (!model->BSIM4v6wdsubGiven) - model->BSIM4v6wdsub = 0.0; - if (!model->BSIM4v6wvth0Given) - model->BSIM4v6wvth0 = 0.0; - if (!model->BSIM4v6wuaGiven) - model->BSIM4v6wua = 0.0; - if (!model->BSIM4v6wua1Given) - model->BSIM4v6wua1 = 0.0; - if (!model->BSIM4v6wubGiven) - model->BSIM4v6wub = 0.0; - if (!model->BSIM4v6wub1Given) - model->BSIM4v6wub1 = 0.0; - if (!model->BSIM4v6wucGiven) - model->BSIM4v6wuc = 0.0; - if (!model->BSIM4v6wuc1Given) - model->BSIM4v6wuc1 = 0.0; - if (!model->BSIM4v6wudGiven) - model->BSIM4v6wud = 0.0; - if (!model->BSIM4v6wud1Given) - model->BSIM4v6wud1 = 0.0; - if (!model->BSIM4v6wupGiven) - model->BSIM4v6wup = 0.0; - if (!model->BSIM4v6wlpGiven) - model->BSIM4v6wlp = 0.0; - if (!model->BSIM4v6wu0Given) - model->BSIM4v6wu0 = 0.0; - if (!model->BSIM4v6wuteGiven) - model->BSIM4v6wute = 0.0; - if (!model->BSIM4v6wucsteGiven) - model->BSIM4v6wucste = 0.0; - if (!model->BSIM4v6wvoffGiven) - model->BSIM4v6wvoff = 0.0; - if (!model->BSIM4v6wminvGiven) - model->BSIM4v6wminv = 0.0; - if (!model->BSIM4v6wminvcvGiven) - model->BSIM4v6wminvcv = 0.0; - if (!model->BSIM4v6wfproutGiven) - model->BSIM4v6wfprout = 0.0; - if (!model->BSIM4v6wpditsGiven) - model->BSIM4v6wpdits = 0.0; - if (!model->BSIM4v6wpditsdGiven) - model->BSIM4v6wpditsd = 0.0; - if (!model->BSIM4v6wdeltaGiven) - model->BSIM4v6wdelta = 0.0; - if (!model->BSIM4v6wrdswGiven) - model->BSIM4v6wrdsw = 0.0; - if (!model->BSIM4v6wrdwGiven) - model->BSIM4v6wrdw = 0.0; - if (!model->BSIM4v6wrswGiven) - model->BSIM4v6wrsw = 0.0; - if (!model->BSIM4v6wprwbGiven) - model->BSIM4v6wprwb = 0.0; - if (!model->BSIM4v6wprwgGiven) - model->BSIM4v6wprwg = 0.0; - if (!model->BSIM4v6wprtGiven) - model->BSIM4v6wprt = 0.0; - if (!model->BSIM4v6weta0Given) - model->BSIM4v6weta0 = 0.0; - if (!model->BSIM4v6wetabGiven) - model->BSIM4v6wetab = 0.0; - if (!model->BSIM4v6wpclmGiven) - model->BSIM4v6wpclm = 0.0; - if (!model->BSIM4v6wpdibl1Given) - model->BSIM4v6wpdibl1 = 0.0; - if (!model->BSIM4v6wpdibl2Given) - model->BSIM4v6wpdibl2 = 0.0; - if (!model->BSIM4v6wpdiblbGiven) - model->BSIM4v6wpdiblb = 0.0; - if (!model->BSIM4v6wpscbe1Given) - model->BSIM4v6wpscbe1 = 0.0; - if (!model->BSIM4v6wpscbe2Given) - model->BSIM4v6wpscbe2 = 0.0; - if (!model->BSIM4v6wpvagGiven) - model->BSIM4v6wpvag = 0.0; - if (!model->BSIM4v6wwrGiven) - model->BSIM4v6wwr = 0.0; - if (!model->BSIM4v6wdwgGiven) - model->BSIM4v6wdwg = 0.0; - if (!model->BSIM4v6wdwbGiven) - model->BSIM4v6wdwb = 0.0; - if (!model->BSIM4v6wb0Given) - model->BSIM4v6wb0 = 0.0; - if (!model->BSIM4v6wb1Given) - model->BSIM4v6wb1 = 0.0; - if (!model->BSIM4v6walpha0Given) - model->BSIM4v6walpha0 = 0.0; - if (!model->BSIM4v6walpha1Given) - model->BSIM4v6walpha1 = 0.0; - if (!model->BSIM4v6wbeta0Given) - model->BSIM4v6wbeta0 = 0.0; - if (!model->BSIM4v6wagidlGiven) - model->BSIM4v6wagidl = 0.0; - if (!model->BSIM4v6wbgidlGiven) - model->BSIM4v6wbgidl = 0.0; - if (!model->BSIM4v6wcgidlGiven) - model->BSIM4v6wcgidl = 0.0; - if (!model->BSIM4v6wegidlGiven) - model->BSIM4v6wegidl = 0.0; - if (!model->BSIM4v6wagislGiven) - { - if (model->BSIM4v6wagidlGiven) - model->BSIM4v6wagisl = model->BSIM4v6wagidl; - else - model->BSIM4v6wagisl = 0.0; - } - if (!model->BSIM4v6wbgislGiven) - { - if (model->BSIM4v6wbgidlGiven) - model->BSIM4v6wbgisl = model->BSIM4v6wbgidl; - else - model->BSIM4v6wbgisl = 0.0; - } - if (!model->BSIM4v6wcgislGiven) - { - if (model->BSIM4v6wcgidlGiven) - model->BSIM4v6wcgisl = model->BSIM4v6wcgidl; - else - model->BSIM4v6wcgisl = 0.0; - } - if (!model->BSIM4v6wegislGiven) - { - if (model->BSIM4v6wegidlGiven) - model->BSIM4v6wegisl = model->BSIM4v6wegidl; - else - model->BSIM4v6wegisl = 0.0; - } - if (!model->BSIM4v6waigcGiven) - model->BSIM4v6waigc = 0.0; - if (!model->BSIM4v6wbigcGiven) - model->BSIM4v6wbigc = 0.0; - if (!model->BSIM4v6wcigcGiven) - model->BSIM4v6wcigc = 0.0; - if (!model->BSIM4v6aigsdGiven && (model->BSIM4v6aigsGiven || model->BSIM4v6aigdGiven)) - { - if (!model->BSIM4v6waigsGiven) - model->BSIM4v6waigs = 0.0; - if (!model->BSIM4v6waigdGiven) - model->BSIM4v6waigd = 0.0; - } - else - { - if (!model->BSIM4v6waigsdGiven) - model->BSIM4v6waigsd = 0.0; - model->BSIM4v6waigs = model->BSIM4v6waigd = model->BSIM4v6waigsd; - } - if (!model->BSIM4v6bigsdGiven && (model->BSIM4v6bigsGiven || model->BSIM4v6bigdGiven)) - { - if (!model->BSIM4v6wbigsGiven) - model->BSIM4v6wbigs = 0.0; - if (!model->BSIM4v6wbigdGiven) - model->BSIM4v6wbigd = 0.0; - } - else - { - if (!model->BSIM4v6wbigsdGiven) - model->BSIM4v6wbigsd = 0.0; - model->BSIM4v6wbigs = model->BSIM4v6wbigd = model->BSIM4v6wbigsd; - } - if (!model->BSIM4v6cigsdGiven && (model->BSIM4v6cigsGiven || model->BSIM4v6cigdGiven)) - { - if (!model->BSIM4v6wcigsGiven) - model->BSIM4v6wcigs = 0.0; - if (!model->BSIM4v6wcigdGiven) - model->BSIM4v6wcigd = 0.0; - } - else - { - if (!model->BSIM4v6wcigsdGiven) - model->BSIM4v6wcigsd = 0.0; - model->BSIM4v6wcigs = model->BSIM4v6wcigd = model->BSIM4v6wcigsd; - } - if (!model->BSIM4v6waigbaccGiven) - model->BSIM4v6waigbacc = 0.0; - if (!model->BSIM4v6wbigbaccGiven) - model->BSIM4v6wbigbacc = 0.0; - if (!model->BSIM4v6wcigbaccGiven) - model->BSIM4v6wcigbacc = 0.0; - if (!model->BSIM4v6waigbinvGiven) - model->BSIM4v6waigbinv = 0.0; - if (!model->BSIM4v6wbigbinvGiven) - model->BSIM4v6wbigbinv = 0.0; - if (!model->BSIM4v6wcigbinvGiven) - model->BSIM4v6wcigbinv = 0.0; - if (!model->BSIM4v6wnigcGiven) - model->BSIM4v6wnigc = 0.0; - if (!model->BSIM4v6wnigbinvGiven) - model->BSIM4v6wnigbinv = 0.0; - if (!model->BSIM4v6wnigbaccGiven) - model->BSIM4v6wnigbacc = 0.0; - if (!model->BSIM4v6wntoxGiven) - model->BSIM4v6wntox = 0.0; - if (!model->BSIM4v6weigbinvGiven) - model->BSIM4v6weigbinv = 0.0; - if (!model->BSIM4v6wpigcdGiven) - model->BSIM4v6wpigcd = 0.0; - if (!model->BSIM4v6wpoxedgeGiven) - model->BSIM4v6wpoxedge = 0.0; - if (!model->BSIM4v6wxrcrg1Given) - model->BSIM4v6wxrcrg1 = 0.0; - if (!model->BSIM4v6wxrcrg2Given) - model->BSIM4v6wxrcrg2 = 0.0; - if (!model->BSIM4v6weuGiven) - model->BSIM4v6weu = 0.0; - if (!model->BSIM4v6wucsGiven) - model->BSIM4v6wucs = 0.0; - if (!model->BSIM4v6wvfbGiven) - model->BSIM4v6wvfb = 0.0; - if (!model->BSIM4v6wlambdaGiven) - model->BSIM4v6wlambda = 0.0; - if (!model->BSIM4v6wvtlGiven) - model->BSIM4v6wvtl = 0.0; - if (!model->BSIM4v6wxnGiven) - model->BSIM4v6wxn = 0.0; - if (!model->BSIM4v6wvfbsdoffGiven) - model->BSIM4v6wvfbsdoff = 0.0; - if (!model->BSIM4v6wtvfbsdoffGiven) - model->BSIM4v6wtvfbsdoff = 0.0; - if (!model->BSIM4v6wtvoffGiven) - model->BSIM4v6wtvoff = 0.0; - - if (!model->BSIM4v6wcgslGiven) - model->BSIM4v6wcgsl = 0.0; - if (!model->BSIM4v6wcgdlGiven) - model->BSIM4v6wcgdl = 0.0; - if (!model->BSIM4v6wckappasGiven) - model->BSIM4v6wckappas = 0.0; - if (!model->BSIM4v6wckappadGiven) - model->BSIM4v6wckappad = 0.0; - if (!model->BSIM4v6wcfGiven) - model->BSIM4v6wcf = 0.0; - if (!model->BSIM4v6wclcGiven) - model->BSIM4v6wclc = 0.0; - if (!model->BSIM4v6wcleGiven) - model->BSIM4v6wcle = 0.0; - if (!model->BSIM4v6wvfbcvGiven) - model->BSIM4v6wvfbcv = 0.0; - if (!model->BSIM4v6wacdeGiven) - model->BSIM4v6wacde = 0.0; - if (!model->BSIM4v6wmoinGiven) - model->BSIM4v6wmoin = 0.0; - if (!model->BSIM4v6wnoffGiven) - model->BSIM4v6wnoff = 0.0; - if (!model->BSIM4v6wvoffcvGiven) - model->BSIM4v6wvoffcv = 0.0; - - /* Cross-term dependence */ - if (!model->BSIM4v6pcdscGiven) - model->BSIM4v6pcdsc = 0.0; - if (!model->BSIM4v6pcdscbGiven) - model->BSIM4v6pcdscb = 0.0; - if (!model->BSIM4v6pcdscdGiven) - model->BSIM4v6pcdscd = 0.0; - if (!model->BSIM4v6pcitGiven) - model->BSIM4v6pcit = 0.0; - if (!model->BSIM4v6pnfactorGiven) - model->BSIM4v6pnfactor = 0.0; - if (!model->BSIM4v6pxjGiven) - model->BSIM4v6pxj = 0.0; - if (!model->BSIM4v6pvsatGiven) - model->BSIM4v6pvsat = 0.0; - if (!model->BSIM4v6patGiven) - model->BSIM4v6pat = 0.0; - if (!model->BSIM4v6pa0Given) - model->BSIM4v6pa0 = 0.0; - - if (!model->BSIM4v6pagsGiven) - model->BSIM4v6pags = 0.0; - if (!model->BSIM4v6pa1Given) - model->BSIM4v6pa1 = 0.0; - if (!model->BSIM4v6pa2Given) - model->BSIM4v6pa2 = 0.0; - if (!model->BSIM4v6pketaGiven) - model->BSIM4v6pketa = 0.0; - if (!model->BSIM4v6pnsubGiven) - model->BSIM4v6pnsub = 0.0; - if (!model->BSIM4v6pndepGiven) - model->BSIM4v6pndep = 0.0; - if (!model->BSIM4v6pnsdGiven) - model->BSIM4v6pnsd = 0.0; - if (!model->BSIM4v6pphinGiven) - model->BSIM4v6pphin = 0.0; - if (!model->BSIM4v6pngateGiven) - model->BSIM4v6pngate = 0.0; - if (!model->BSIM4v6pvbmGiven) - model->BSIM4v6pvbm = 0.0; - if (!model->BSIM4v6pxtGiven) - model->BSIM4v6pxt = 0.0; - if (!model->BSIM4v6pkt1Given) - model->BSIM4v6pkt1 = 0.0; - if (!model->BSIM4v6pkt1lGiven) - model->BSIM4v6pkt1l = 0.0; - if (!model->BSIM4v6pkt2Given) - model->BSIM4v6pkt2 = 0.0; - if (!model->BSIM4v6pk3Given) - model->BSIM4v6pk3 = 0.0; - if (!model->BSIM4v6pk3bGiven) - model->BSIM4v6pk3b = 0.0; - if (!model->BSIM4v6pw0Given) - model->BSIM4v6pw0 = 0.0; - if (!model->BSIM4v6plpe0Given) - model->BSIM4v6plpe0 = 0.0; - if (!model->BSIM4v6plpebGiven) - model->BSIM4v6plpeb = 0.0; - if (!model->BSIM4v6pdvtp0Given) - model->BSIM4v6pdvtp0 = 0.0; - if (!model->BSIM4v6pdvtp1Given) - model->BSIM4v6pdvtp1 = 0.0; - if (!model->BSIM4v6pdvt0Given) - model->BSIM4v6pdvt0 = 0.0; - if (!model->BSIM4v6pdvt1Given) - model->BSIM4v6pdvt1 = 0.0; - if (!model->BSIM4v6pdvt2Given) - model->BSIM4v6pdvt2 = 0.0; - if (!model->BSIM4v6pdvt0wGiven) - model->BSIM4v6pdvt0w = 0.0; - if (!model->BSIM4v6pdvt1wGiven) - model->BSIM4v6pdvt1w = 0.0; - if (!model->BSIM4v6pdvt2wGiven) - model->BSIM4v6pdvt2w = 0.0; - if (!model->BSIM4v6pdroutGiven) - model->BSIM4v6pdrout = 0.0; - if (!model->BSIM4v6pdsubGiven) - model->BSIM4v6pdsub = 0.0; - if (!model->BSIM4v6pvth0Given) - model->BSIM4v6pvth0 = 0.0; - if (!model->BSIM4v6puaGiven) - model->BSIM4v6pua = 0.0; - if (!model->BSIM4v6pua1Given) - model->BSIM4v6pua1 = 0.0; - if (!model->BSIM4v6pubGiven) - model->BSIM4v6pub = 0.0; - if (!model->BSIM4v6pub1Given) - model->BSIM4v6pub1 = 0.0; - if (!model->BSIM4v6pucGiven) - model->BSIM4v6puc = 0.0; - if (!model->BSIM4v6puc1Given) - model->BSIM4v6puc1 = 0.0; - if (!model->BSIM4v6pudGiven) - model->BSIM4v6pud = 0.0; - if (!model->BSIM4v6pud1Given) - model->BSIM4v6pud1 = 0.0; - if (!model->BSIM4v6pupGiven) - model->BSIM4v6pup = 0.0; - if (!model->BSIM4v6plpGiven) - model->BSIM4v6plp = 0.0; - if (!model->BSIM4v6pu0Given) - model->BSIM4v6pu0 = 0.0; - if (!model->BSIM4v6puteGiven) - model->BSIM4v6pute = 0.0; - if (!model->BSIM4v6pucsteGiven) - model->BSIM4v6pucste = 0.0; - if (!model->BSIM4v6pvoffGiven) - model->BSIM4v6pvoff = 0.0; - if (!model->BSIM4v6pminvGiven) - model->BSIM4v6pminv = 0.0; - if (!model->BSIM4v6pminvcvGiven) - model->BSIM4v6pminvcv = 0.0; - if (!model->BSIM4v6pfproutGiven) - model->BSIM4v6pfprout = 0.0; - if (!model->BSIM4v6ppditsGiven) - model->BSIM4v6ppdits = 0.0; - if (!model->BSIM4v6ppditsdGiven) - model->BSIM4v6ppditsd = 0.0; - if (!model->BSIM4v6pdeltaGiven) - model->BSIM4v6pdelta = 0.0; - if (!model->BSIM4v6prdswGiven) - model->BSIM4v6prdsw = 0.0; - if (!model->BSIM4v6prdwGiven) - model->BSIM4v6prdw = 0.0; - if (!model->BSIM4v6prswGiven) - model->BSIM4v6prsw = 0.0; - if (!model->BSIM4v6pprwbGiven) - model->BSIM4v6pprwb = 0.0; - if (!model->BSIM4v6pprwgGiven) - model->BSIM4v6pprwg = 0.0; - if (!model->BSIM4v6pprtGiven) - model->BSIM4v6pprt = 0.0; - if (!model->BSIM4v6peta0Given) - model->BSIM4v6peta0 = 0.0; - if (!model->BSIM4v6petabGiven) - model->BSIM4v6petab = 0.0; - if (!model->BSIM4v6ppclmGiven) - model->BSIM4v6ppclm = 0.0; - if (!model->BSIM4v6ppdibl1Given) - model->BSIM4v6ppdibl1 = 0.0; - if (!model->BSIM4v6ppdibl2Given) - model->BSIM4v6ppdibl2 = 0.0; - if (!model->BSIM4v6ppdiblbGiven) - model->BSIM4v6ppdiblb = 0.0; - if (!model->BSIM4v6ppscbe1Given) - model->BSIM4v6ppscbe1 = 0.0; - if (!model->BSIM4v6ppscbe2Given) - model->BSIM4v6ppscbe2 = 0.0; - if (!model->BSIM4v6ppvagGiven) - model->BSIM4v6ppvag = 0.0; - if (!model->BSIM4v6pwrGiven) - model->BSIM4v6pwr = 0.0; - if (!model->BSIM4v6pdwgGiven) - model->BSIM4v6pdwg = 0.0; - if (!model->BSIM4v6pdwbGiven) - model->BSIM4v6pdwb = 0.0; - if (!model->BSIM4v6pb0Given) - model->BSIM4v6pb0 = 0.0; - if (!model->BSIM4v6pb1Given) - model->BSIM4v6pb1 = 0.0; - if (!model->BSIM4v6palpha0Given) - model->BSIM4v6palpha0 = 0.0; - if (!model->BSIM4v6palpha1Given) - model->BSIM4v6palpha1 = 0.0; - if (!model->BSIM4v6pbeta0Given) - model->BSIM4v6pbeta0 = 0.0; - if (!model->BSIM4v6pagidlGiven) - model->BSIM4v6pagidl = 0.0; - if (!model->BSIM4v6pbgidlGiven) - model->BSIM4v6pbgidl = 0.0; - if (!model->BSIM4v6pcgidlGiven) - model->BSIM4v6pcgidl = 0.0; - if (!model->BSIM4v6pegidlGiven) - model->BSIM4v6pegidl = 0.0; - if (!model->BSIM4v6pagislGiven) - { - if (model->BSIM4v6pagidlGiven) - model->BSIM4v6pagisl = model->BSIM4v6pagidl; - else - model->BSIM4v6pagisl = 0.0; - } - if (!model->BSIM4v6pbgislGiven) - { - if (model->BSIM4v6pbgidlGiven) - model->BSIM4v6pbgisl = model->BSIM4v6pbgidl; - else - model->BSIM4v6pbgisl = 0.0; - } - if (!model->BSIM4v6pcgislGiven) - { - if (model->BSIM4v6pcgidlGiven) - model->BSIM4v6pcgisl = model->BSIM4v6pcgidl; - else - model->BSIM4v6pcgisl = 0.0; - } - if (!model->BSIM4v6pegislGiven) - { - if (model->BSIM4v6pegidlGiven) - model->BSIM4v6pegisl = model->BSIM4v6pegidl; - else - model->BSIM4v6pegisl = 0.0; - } - if (!model->BSIM4v6paigcGiven) - model->BSIM4v6paigc = 0.0; - if (!model->BSIM4v6pbigcGiven) - model->BSIM4v6pbigc = 0.0; - if (!model->BSIM4v6pcigcGiven) - model->BSIM4v6pcigc = 0.0; - if (!model->BSIM4v6aigsdGiven && (model->BSIM4v6aigsGiven || model->BSIM4v6aigdGiven)) - { - if (!model->BSIM4v6paigsGiven) - model->BSIM4v6paigs = 0.0; - if (!model->BSIM4v6paigdGiven) - model->BSIM4v6paigd = 0.0; - } - else - { - if (!model->BSIM4v6paigsdGiven) - model->BSIM4v6paigsd = 0.0; - model->BSIM4v6paigs = model->BSIM4v6paigd = model->BSIM4v6paigsd; - } - if (!model->BSIM4v6bigsdGiven && (model->BSIM4v6bigsGiven || model->BSIM4v6bigdGiven)) - { - if (!model->BSIM4v6pbigsGiven) - model->BSIM4v6pbigs = 0.0; - if (!model->BSIM4v6pbigdGiven) - model->BSIM4v6pbigd = 0.0; - } - else - { - if (!model->BSIM4v6pbigsdGiven) - model->BSIM4v6pbigsd = 0.0; - model->BSIM4v6pbigs = model->BSIM4v6pbigd = model->BSIM4v6pbigsd; - } - if (!model->BSIM4v6cigsdGiven && (model->BSIM4v6cigsGiven || model->BSIM4v6cigdGiven)) - { - if (!model->BSIM4v6pcigsGiven) - model->BSIM4v6pcigs = 0.0; - if (!model->BSIM4v6pcigdGiven) - model->BSIM4v6pcigd = 0.0; - } - else - { - if (!model->BSIM4v6pcigsdGiven) - model->BSIM4v6pcigsd = 0.0; - model->BSIM4v6pcigs = model->BSIM4v6pcigd = model->BSIM4v6pcigsd; - } - if (!model->BSIM4v6paigbaccGiven) - model->BSIM4v6paigbacc = 0.0; - if (!model->BSIM4v6pbigbaccGiven) - model->BSIM4v6pbigbacc = 0.0; - if (!model->BSIM4v6pcigbaccGiven) - model->BSIM4v6pcigbacc = 0.0; - if (!model->BSIM4v6paigbinvGiven) - model->BSIM4v6paigbinv = 0.0; - if (!model->BSIM4v6pbigbinvGiven) - model->BSIM4v6pbigbinv = 0.0; - if (!model->BSIM4v6pcigbinvGiven) - model->BSIM4v6pcigbinv = 0.0; - if (!model->BSIM4v6pnigcGiven) - model->BSIM4v6pnigc = 0.0; - if (!model->BSIM4v6pnigbinvGiven) - model->BSIM4v6pnigbinv = 0.0; - if (!model->BSIM4v6pnigbaccGiven) - model->BSIM4v6pnigbacc = 0.0; - if (!model->BSIM4v6pntoxGiven) - model->BSIM4v6pntox = 0.0; - if (!model->BSIM4v6peigbinvGiven) - model->BSIM4v6peigbinv = 0.0; - if (!model->BSIM4v6ppigcdGiven) - model->BSIM4v6ppigcd = 0.0; - if (!model->BSIM4v6ppoxedgeGiven) - model->BSIM4v6ppoxedge = 0.0; - if (!model->BSIM4v6pxrcrg1Given) - model->BSIM4v6pxrcrg1 = 0.0; - if (!model->BSIM4v6pxrcrg2Given) - model->BSIM4v6pxrcrg2 = 0.0; - if (!model->BSIM4v6peuGiven) - model->BSIM4v6peu = 0.0; - if (!model->BSIM4v6pucsGiven) - model->BSIM4v6pucs = 0.0; - if (!model->BSIM4v6pvfbGiven) - model->BSIM4v6pvfb = 0.0; - if (!model->BSIM4v6plambdaGiven) - model->BSIM4v6plambda = 0.0; - if (!model->BSIM4v6pvtlGiven) - model->BSIM4v6pvtl = 0.0; - if (!model->BSIM4v6pxnGiven) - model->BSIM4v6pxn = 0.0; - if (!model->BSIM4v6pvfbsdoffGiven) - model->BSIM4v6pvfbsdoff = 0.0; - if (!model->BSIM4v6ptvfbsdoffGiven) - model->BSIM4v6ptvfbsdoff = 0.0; - if (!model->BSIM4v6ptvoffGiven) - model->BSIM4v6ptvoff = 0.0; - - if (!model->BSIM4v6pcgslGiven) - model->BSIM4v6pcgsl = 0.0; - if (!model->BSIM4v6pcgdlGiven) - model->BSIM4v6pcgdl = 0.0; - if (!model->BSIM4v6pckappasGiven) - model->BSIM4v6pckappas = 0.0; - if (!model->BSIM4v6pckappadGiven) - model->BSIM4v6pckappad = 0.0; - if (!model->BSIM4v6pcfGiven) - model->BSIM4v6pcf = 0.0; - if (!model->BSIM4v6pclcGiven) - model->BSIM4v6pclc = 0.0; - if (!model->BSIM4v6pcleGiven) - model->BSIM4v6pcle = 0.0; - if (!model->BSIM4v6pvfbcvGiven) - model->BSIM4v6pvfbcv = 0.0; - if (!model->BSIM4v6pacdeGiven) - model->BSIM4v6pacde = 0.0; - if (!model->BSIM4v6pmoinGiven) - model->BSIM4v6pmoin = 0.0; - if (!model->BSIM4v6pnoffGiven) - model->BSIM4v6pnoff = 0.0; - if (!model->BSIM4v6pvoffcvGiven) - model->BSIM4v6pvoffcv = 0.0; - - if (!model->BSIM4v6gamma1Given) - model->BSIM4v6gamma1 = 0.0; - if (!model->BSIM4v6lgamma1Given) - model->BSIM4v6lgamma1 = 0.0; - if (!model->BSIM4v6wgamma1Given) - model->BSIM4v6wgamma1 = 0.0; - if (!model->BSIM4v6pgamma1Given) - model->BSIM4v6pgamma1 = 0.0; - if (!model->BSIM4v6gamma2Given) - model->BSIM4v6gamma2 = 0.0; - if (!model->BSIM4v6lgamma2Given) - model->BSIM4v6lgamma2 = 0.0; - if (!model->BSIM4v6wgamma2Given) - model->BSIM4v6wgamma2 = 0.0; - if (!model->BSIM4v6pgamma2Given) - model->BSIM4v6pgamma2 = 0.0; - if (!model->BSIM4v6vbxGiven) - model->BSIM4v6vbx = 0.0; - if (!model->BSIM4v6lvbxGiven) - model->BSIM4v6lvbx = 0.0; - if (!model->BSIM4v6wvbxGiven) - model->BSIM4v6wvbx = 0.0; - if (!model->BSIM4v6pvbxGiven) - model->BSIM4v6pvbx = 0.0; - - /* unit degree celcius */ - if (!model->BSIM4v6tnomGiven) - model->BSIM4v6tnom = ckt->CKTnomTemp; - if (!model->BSIM4v6LintGiven) - model->BSIM4v6Lint = 0.0; - if (!model->BSIM4v6LlGiven) - model->BSIM4v6Ll = 0.0; - if (!model->BSIM4v6LlcGiven) - model->BSIM4v6Llc = model->BSIM4v6Ll; - if (!model->BSIM4v6LlnGiven) - model->BSIM4v6Lln = 1.0; - if (!model->BSIM4v6LwGiven) - model->BSIM4v6Lw = 0.0; - if (!model->BSIM4v6LwcGiven) - model->BSIM4v6Lwc = model->BSIM4v6Lw; - if (!model->BSIM4v6LwnGiven) - model->BSIM4v6Lwn = 1.0; - if (!model->BSIM4v6LwlGiven) - model->BSIM4v6Lwl = 0.0; - if (!model->BSIM4v6LwlcGiven) - model->BSIM4v6Lwlc = model->BSIM4v6Lwl; - if (!model->BSIM4v6LminGiven) - model->BSIM4v6Lmin = 0.0; - if (!model->BSIM4v6LmaxGiven) - model->BSIM4v6Lmax = 1.0; - if (!model->BSIM4v6WintGiven) - model->BSIM4v6Wint = 0.0; - if (!model->BSIM4v6WlGiven) - model->BSIM4v6Wl = 0.0; - if (!model->BSIM4v6WlcGiven) - model->BSIM4v6Wlc = model->BSIM4v6Wl; - if (!model->BSIM4v6WlnGiven) - model->BSIM4v6Wln = 1.0; - if (!model->BSIM4v6WwGiven) - model->BSIM4v6Ww = 0.0; - if (!model->BSIM4v6WwcGiven) - model->BSIM4v6Wwc = model->BSIM4v6Ww; - if (!model->BSIM4v6WwnGiven) - model->BSIM4v6Wwn = 1.0; - if (!model->BSIM4v6WwlGiven) - model->BSIM4v6Wwl = 0.0; - if (!model->BSIM4v6WwlcGiven) - model->BSIM4v6Wwlc = model->BSIM4v6Wwl; - if (!model->BSIM4v6WminGiven) - model->BSIM4v6Wmin = 0.0; - if (!model->BSIM4v6WmaxGiven) - model->BSIM4v6Wmax = 1.0; - if (!model->BSIM4v6dwcGiven) - model->BSIM4v6dwc = model->BSIM4v6Wint; - if (!model->BSIM4v6dlcGiven) - model->BSIM4v6dlc = model->BSIM4v6Lint; - if (!model->BSIM4v6xlGiven) - model->BSIM4v6xl = 0.0; - if (!model->BSIM4v6xwGiven) - model->BSIM4v6xw = 0.0; - if (!model->BSIM4v6dlcigGiven) - model->BSIM4v6dlcig = model->BSIM4v6Lint; - if (!model->BSIM4v6dlcigdGiven) - { - if (model->BSIM4v6dlcigGiven) - model->BSIM4v6dlcigd = model->BSIM4v6dlcig; - else - model->BSIM4v6dlcigd = model->BSIM4v6Lint; - } - if (!model->BSIM4v6dwjGiven) - model->BSIM4v6dwj = model->BSIM4v6dwc; - if (!model->BSIM4v6cfGiven) - model->BSIM4v6cf = 2.0 * model->BSIM4v6epsrox * EPS0 / PI - * log(1.0 + 0.4e-6 / model->BSIM4v6toxe); - - if (!model->BSIM4v6xpartGiven) - model->BSIM4v6xpart = 0.0; - if (!model->BSIM4v6sheetResistanceGiven) - model->BSIM4v6sheetResistance = 0.0; - - if (!model->BSIM4v6SunitAreaJctCapGiven) - model->BSIM4v6SunitAreaJctCap = 5.0E-4; - if (!model->BSIM4v6DunitAreaJctCapGiven) - model->BSIM4v6DunitAreaJctCap = model->BSIM4v6SunitAreaJctCap; - if (!model->BSIM4v6SunitLengthSidewallJctCapGiven) - model->BSIM4v6SunitLengthSidewallJctCap = 5.0E-10; - if (!model->BSIM4v6DunitLengthSidewallJctCapGiven) - model->BSIM4v6DunitLengthSidewallJctCap = model->BSIM4v6SunitLengthSidewallJctCap; - if (!model->BSIM4v6SunitLengthGateSidewallJctCapGiven) - model->BSIM4v6SunitLengthGateSidewallJctCap = model->BSIM4v6SunitLengthSidewallJctCap ; - if (!model->BSIM4v6DunitLengthGateSidewallJctCapGiven) - model->BSIM4v6DunitLengthGateSidewallJctCap = model->BSIM4v6SunitLengthGateSidewallJctCap; - if (!model->BSIM4v6SjctSatCurDensityGiven) - model->BSIM4v6SjctSatCurDensity = 1.0E-4; - if (!model->BSIM4v6DjctSatCurDensityGiven) - model->BSIM4v6DjctSatCurDensity = model->BSIM4v6SjctSatCurDensity; - if (!model->BSIM4v6SjctSidewallSatCurDensityGiven) - model->BSIM4v6SjctSidewallSatCurDensity = 0.0; - if (!model->BSIM4v6DjctSidewallSatCurDensityGiven) - model->BSIM4v6DjctSidewallSatCurDensity = model->BSIM4v6SjctSidewallSatCurDensity; - if (!model->BSIM4v6SjctGateSidewallSatCurDensityGiven) - model->BSIM4v6SjctGateSidewallSatCurDensity = 0.0; - if (!model->BSIM4v6DjctGateSidewallSatCurDensityGiven) - model->BSIM4v6DjctGateSidewallSatCurDensity = model->BSIM4v6SjctGateSidewallSatCurDensity; - if (!model->BSIM4v6SbulkJctPotentialGiven) - model->BSIM4v6SbulkJctPotential = 1.0; - if (!model->BSIM4v6DbulkJctPotentialGiven) - model->BSIM4v6DbulkJctPotential = model->BSIM4v6SbulkJctPotential; - if (!model->BSIM4v6SsidewallJctPotentialGiven) - model->BSIM4v6SsidewallJctPotential = 1.0; - if (!model->BSIM4v6DsidewallJctPotentialGiven) - model->BSIM4v6DsidewallJctPotential = model->BSIM4v6SsidewallJctPotential; - if (!model->BSIM4v6SGatesidewallJctPotentialGiven) - model->BSIM4v6SGatesidewallJctPotential = model->BSIM4v6SsidewallJctPotential; - if (!model->BSIM4v6DGatesidewallJctPotentialGiven) - model->BSIM4v6DGatesidewallJctPotential = model->BSIM4v6SGatesidewallJctPotential; - if (!model->BSIM4v6SbulkJctBotGradingCoeffGiven) - model->BSIM4v6SbulkJctBotGradingCoeff = 0.5; - if (!model->BSIM4v6DbulkJctBotGradingCoeffGiven) - model->BSIM4v6DbulkJctBotGradingCoeff = model->BSIM4v6SbulkJctBotGradingCoeff; - if (!model->BSIM4v6SbulkJctSideGradingCoeffGiven) - model->BSIM4v6SbulkJctSideGradingCoeff = 0.33; - if (!model->BSIM4v6DbulkJctSideGradingCoeffGiven) - model->BSIM4v6DbulkJctSideGradingCoeff = model->BSIM4v6SbulkJctSideGradingCoeff; - if (!model->BSIM4v6SbulkJctGateSideGradingCoeffGiven) - model->BSIM4v6SbulkJctGateSideGradingCoeff = model->BSIM4v6SbulkJctSideGradingCoeff; - if (!model->BSIM4v6DbulkJctGateSideGradingCoeffGiven) - model->BSIM4v6DbulkJctGateSideGradingCoeff = model->BSIM4v6SbulkJctGateSideGradingCoeff; - if (!model->BSIM4v6SjctEmissionCoeffGiven) - model->BSIM4v6SjctEmissionCoeff = 1.0; - if (!model->BSIM4v6DjctEmissionCoeffGiven) - model->BSIM4v6DjctEmissionCoeff = model->BSIM4v6SjctEmissionCoeff; - if (!model->BSIM4v6SjctTempExponentGiven) - model->BSIM4v6SjctTempExponent = 3.0; - if (!model->BSIM4v6DjctTempExponentGiven) - model->BSIM4v6DjctTempExponent = model->BSIM4v6SjctTempExponent; - - if (!model->BSIM4v6jtssGiven) - model->BSIM4v6jtss = 0.0; - if (!model->BSIM4v6jtsdGiven) - model->BSIM4v6jtsd = model->BSIM4v6jtss; - if (!model->BSIM4v6jtsswsGiven) - model->BSIM4v6jtssws = 0.0; - if (!model->BSIM4v6jtsswdGiven) - model->BSIM4v6jtsswd = model->BSIM4v6jtssws; - if (!model->BSIM4v6jtsswgsGiven) - model->BSIM4v6jtsswgs = 0.0; - if (!model->BSIM4v6jtsswgdGiven) - model->BSIM4v6jtsswgd = model->BSIM4v6jtsswgs; - if (!model->BSIM4v6jtweffGiven) - model->BSIM4v6jtweff = 0.0; - if (!model->BSIM4v6njtsGiven) - model->BSIM4v6njts = 20.0; - if (!model->BSIM4v6njtsswGiven) - model->BSIM4v6njtssw = 20.0; - if (!model->BSIM4v6njtsswgGiven) - model->BSIM4v6njtsswg = 20.0; - if (!model->BSIM4v6njtsdGiven) - { - if (model->BSIM4v6njtsGiven) - model->BSIM4v6njtsd = model->BSIM4v6njts; - else - model->BSIM4v6njtsd = 20.0; - } - if (!model->BSIM4v6njtsswdGiven) - { - if (model->BSIM4v6njtsswGiven) - model->BSIM4v6njtsswd = model->BSIM4v6njtssw; - else - model->BSIM4v6njtsswd = 20.0; - } - if (!model->BSIM4v6njtsswgdGiven) - { - if (model->BSIM4v6njtsswgGiven) - model->BSIM4v6njtsswgd = model->BSIM4v6njtsswg; - else - model->BSIM4v6njtsswgd = 20.0; - } - if (!model->BSIM4v6xtssGiven) - model->BSIM4v6xtss = 0.02; - if (!model->BSIM4v6xtsdGiven) - model->BSIM4v6xtsd = model->BSIM4v6xtss; - if (!model->BSIM4v6xtsswsGiven) - model->BSIM4v6xtssws = 0.02; - if (!model->BSIM4v6xtsswdGiven) - model->BSIM4v6xtsswd = model->BSIM4v6xtssws; - if (!model->BSIM4v6xtsswgsGiven) - model->BSIM4v6xtsswgs = 0.02; - if (!model->BSIM4v6xtsswgdGiven) - model->BSIM4v6xtsswgd = model->BSIM4v6xtsswgs; - if (!model->BSIM4v6tnjtsGiven) - model->BSIM4v6tnjts = 0.0; - if (!model->BSIM4v6tnjtsswGiven) - model->BSIM4v6tnjtssw = 0.0; - if (!model->BSIM4v6tnjtsswgGiven) - model->BSIM4v6tnjtsswg = 0.0; - if (!model->BSIM4v6tnjtsdGiven) - { - if (model->BSIM4v6tnjtsGiven) - model->BSIM4v6tnjtsd = model->BSIM4v6tnjts; - else - model->BSIM4v6tnjtsd = 0.0; - } - if (!model->BSIM4v6tnjtsswdGiven) - { - if (model->BSIM4v6tnjtsswGiven) - model->BSIM4v6tnjtsswd = model->BSIM4v6tnjtssw; - else - model->BSIM4v6tnjtsswd = 0.0; - } - if (!model->BSIM4v6tnjtsswgdGiven) - { - if (model->BSIM4v6tnjtsswgGiven) - model->BSIM4v6tnjtsswgd = model->BSIM4v6tnjtsswg; - else - model->BSIM4v6tnjtsswgd = 0.0; - } - if (!model->BSIM4v6vtssGiven) - model->BSIM4v6vtss = 10.0; - if (!model->BSIM4v6vtsdGiven) - model->BSIM4v6vtsd = model->BSIM4v6vtss; - if (!model->BSIM4v6vtsswsGiven) - model->BSIM4v6vtssws = 10.0; - if (!model->BSIM4v6vtsswdGiven) - model->BSIM4v6vtsswd = model->BSIM4v6vtssws; - if (!model->BSIM4v6vtsswgsGiven) - model->BSIM4v6vtsswgs = 10.0; - if (!model->BSIM4v6vtsswgdGiven) - model->BSIM4v6vtsswgd = model->BSIM4v6vtsswgs; - - if (!model->BSIM4v6oxideTrapDensityAGiven) - { if (model->BSIM4v6type == NMOS) - model->BSIM4v6oxideTrapDensityA = 6.25e41; - else - model->BSIM4v6oxideTrapDensityA= 6.188e40; - } - if (!model->BSIM4v6oxideTrapDensityBGiven) - { if (model->BSIM4v6type == NMOS) - model->BSIM4v6oxideTrapDensityB = 3.125e26; - else - model->BSIM4v6oxideTrapDensityB = 1.5e25; - } - if (!model->BSIM4v6oxideTrapDensityCGiven) - model->BSIM4v6oxideTrapDensityC = 8.75e9; - if (!model->BSIM4v6emGiven) - model->BSIM4v6em = 4.1e7; /* V/m */ - if (!model->BSIM4v6efGiven) - model->BSIM4v6ef = 1.0; - if (!model->BSIM4v6afGiven) - model->BSIM4v6af = 1.0; - if (!model->BSIM4v6kfGiven) - model->BSIM4v6kf = 0.0; - - if (!model->BSIM4v6vgsMaxGiven) - model->BSIM4v6vgsMax = 1e99; - if (!model->BSIM4v6vgdMaxGiven) - model->BSIM4v6vgdMax = 1e99; - if (!model->BSIM4v6vgbMaxGiven) - model->BSIM4v6vgbMax = 1e99; - if (!model->BSIM4v6vdsMaxGiven) - model->BSIM4v6vdsMax = 1e99; - if (!model->BSIM4v6vbsMaxGiven) - model->BSIM4v6vbsMax = 1e99; - if (!model->BSIM4v6vbdMaxGiven) - model->BSIM4v6vbdMax = 1e99; - if (!model->BSIM4v6vgsrMaxGiven) - model->BSIM4v6vgsrMax = 1e99; - if (!model->BSIM4v6vgdrMaxGiven) - model->BSIM4v6vgdrMax = 1e99; - if (!model->BSIM4v6vgbrMaxGiven) - model->BSIM4v6vgbrMax = 1e99; - if (!model->BSIM4v6vbsrMaxGiven) - model->BSIM4v6vbsrMax = 1e99; - if (!model->BSIM4v6vbdrMaxGiven) - model->BSIM4v6vbdrMax = 1e99; - - /* stress effect */ - if (!model->BSIM4v6sarefGiven) - model->BSIM4v6saref = 1e-6; /* m */ - if (!model->BSIM4v6sbrefGiven) - model->BSIM4v6sbref = 1e-6; /* m */ - if (!model->BSIM4v6wlodGiven) - model->BSIM4v6wlod = 0; /* m */ - if (!model->BSIM4v6ku0Given) - model->BSIM4v6ku0 = 0; /* 1/m */ - if (!model->BSIM4v6kvsatGiven) - model->BSIM4v6kvsat = 0; - if (!model->BSIM4v6kvth0Given) /* m */ - model->BSIM4v6kvth0 = 0; - if (!model->BSIM4v6tku0Given) - model->BSIM4v6tku0 = 0; - if (!model->BSIM4v6llodku0Given) - model->BSIM4v6llodku0 = 0; - if (!model->BSIM4v6wlodku0Given) - model->BSIM4v6wlodku0 = 0; - if (!model->BSIM4v6llodvthGiven) - model->BSIM4v6llodvth = 0; - if (!model->BSIM4v6wlodvthGiven) - model->BSIM4v6wlodvth = 0; - if (!model->BSIM4v6lku0Given) - model->BSIM4v6lku0 = 0; - if (!model->BSIM4v6wku0Given) - model->BSIM4v6wku0 = 0; - if (!model->BSIM4v6pku0Given) - model->BSIM4v6pku0 = 0; - if (!model->BSIM4v6lkvth0Given) - model->BSIM4v6lkvth0 = 0; - if (!model->BSIM4v6wkvth0Given) - model->BSIM4v6wkvth0 = 0; - if (!model->BSIM4v6pkvth0Given) - model->BSIM4v6pkvth0 = 0; - if (!model->BSIM4v6stk2Given) - model->BSIM4v6stk2 = 0; - if (!model->BSIM4v6lodk2Given) - model->BSIM4v6lodk2 = 1.0; - if (!model->BSIM4v6steta0Given) - model->BSIM4v6steta0 = 0; - if (!model->BSIM4v6lodeta0Given) - model->BSIM4v6lodeta0 = 1.0; - - /* Well Proximity Effect */ - if (!model->BSIM4v6webGiven) - model->BSIM4v6web = 0.0; - if (!model->BSIM4v6wecGiven) - model->BSIM4v6wec = 0.0; - if (!model->BSIM4v6kvth0weGiven) - model->BSIM4v6kvth0we = 0.0; - if (!model->BSIM4v6k2weGiven) - model->BSIM4v6k2we = 0.0; - if (!model->BSIM4v6ku0weGiven) - model->BSIM4v6ku0we = 0.0; - if (!model->BSIM4v6screfGiven) - model->BSIM4v6scref = 1.0E-6; /* m */ - if (!model->BSIM4v6wpemodGiven) - model->BSIM4v6wpemod = 0; - else if ((model->BSIM4v6wpemod != 0) && (model->BSIM4v6wpemod != 1)) - { model->BSIM4v6wpemod = 0; - printf("Warning: wpemod has been set to its default value: 0.\n"); - } - if (!model->BSIM4v6lkvth0weGiven) - model->BSIM4v6lkvth0we = 0; - if (!model->BSIM4v6lk2weGiven) - model->BSIM4v6lk2we = 0; - if (!model->BSIM4v6lku0weGiven) - model->BSIM4v6lku0we = 0; - if (!model->BSIM4v6wkvth0weGiven) - model->BSIM4v6wkvth0we = 0; - if (!model->BSIM4v6wk2weGiven) - model->BSIM4v6wk2we = 0; - if (!model->BSIM4v6wku0weGiven) - model->BSIM4v6wku0we = 0; - if (!model->BSIM4v6pkvth0weGiven) - model->BSIM4v6pkvth0we = 0; - if (!model->BSIM4v6pk2weGiven) - model->BSIM4v6pk2we = 0; - if (!model->BSIM4v6pku0weGiven) - model->BSIM4v6pku0we = 0; - - DMCGeff = model->BSIM4v6dmcg - model->BSIM4v6dmcgt; - DMCIeff = model->BSIM4v6dmci; - DMDGeff = model->BSIM4v6dmdg - model->BSIM4v6dmcgt; - - /* - * End processing models and begin to loop - * through all the instances of the model - */ - - for (here = BSIM4v6instances(model); here != NULL ; - here=BSIM4v6nextInstance(here)) - { - /* allocate a chunk of the state vector */ - here->BSIM4v6states = *states; - *states += BSIM4v6numStates; - - /* perform the parameter defaulting */ - if (!here->BSIM4v6lGiven) - here->BSIM4v6l = 5.0e-6; - if (!here->BSIM4v6wGiven) - here->BSIM4v6w = 5.0e-6; - if (!here->BSIM4v6mGiven) - here->BSIM4v6m = 1.0; - if (!here->BSIM4v6nfGiven) - here->BSIM4v6nf = 1.0; - if (!here->BSIM4v6minGiven) - here->BSIM4v6min = 0; /* integer */ - if (!here->BSIM4v6icVDSGiven) - here->BSIM4v6icVDS = 0.0; - if (!here->BSIM4v6icVGSGiven) - here->BSIM4v6icVGS = 0.0; - if (!here->BSIM4v6icVBSGiven) - here->BSIM4v6icVBS = 0.0; - if (!here->BSIM4v6drainAreaGiven) - here->BSIM4v6drainArea = 0.0; - if (!here->BSIM4v6drainPerimeterGiven) - here->BSIM4v6drainPerimeter = 0.0; - if (!here->BSIM4v6drainSquaresGiven) - here->BSIM4v6drainSquares = 1.0; - if (!here->BSIM4v6sourceAreaGiven) - here->BSIM4v6sourceArea = 0.0; - if (!here->BSIM4v6sourcePerimeterGiven) - here->BSIM4v6sourcePerimeter = 0.0; - if (!here->BSIM4v6sourceSquaresGiven) - here->BSIM4v6sourceSquares = 1.0; - - if (!here->BSIM4v6rbdbGiven) - here->BSIM4v6rbdb = model->BSIM4v6rbdb; /* in ohm */ - if (!here->BSIM4v6rbsbGiven) - here->BSIM4v6rbsb = model->BSIM4v6rbsb; - if (!here->BSIM4v6rbpbGiven) - here->BSIM4v6rbpb = model->BSIM4v6rbpb; - if (!here->BSIM4v6rbpsGiven) - here->BSIM4v6rbps = model->BSIM4v6rbps; - if (!here->BSIM4v6rbpdGiven) - here->BSIM4v6rbpd = model->BSIM4v6rbpd; - if (!here->BSIM4v6delvtoGiven) - here->BSIM4v6delvto = 0.0; - if (!here->BSIM4v6xgwGiven) - here->BSIM4v6xgw = model->BSIM4v6xgw; - if (!here->BSIM4v6ngconGiven) - here->BSIM4v6ngcon = model->BSIM4v6ngcon; - - - /* Process instance model selectors, some - * may override their global counterparts - */ - if (!here->BSIM4v6rbodyModGiven) - here->BSIM4v6rbodyMod = model->BSIM4v6rbodyMod; - else if ((here->BSIM4v6rbodyMod != 0) && (here->BSIM4v6rbodyMod != 1) && (here->BSIM4v6rbodyMod != 2)) - { here->BSIM4v6rbodyMod = model->BSIM4v6rbodyMod; - printf("Warning: rbodyMod has been set to its global value %d.\n", - model->BSIM4v6rbodyMod); - } - - if (!here->BSIM4v6rgateModGiven) - here->BSIM4v6rgateMod = model->BSIM4v6rgateMod; - else if ((here->BSIM4v6rgateMod != 0) && (here->BSIM4v6rgateMod != 1) - && (here->BSIM4v6rgateMod != 2) && (here->BSIM4v6rgateMod != 3)) - { here->BSIM4v6rgateMod = model->BSIM4v6rgateMod; - printf("Warning: rgateMod has been set to its global value %d.\n", - model->BSIM4v6rgateMod); - } - - if (!here->BSIM4v6geoModGiven) - here->BSIM4v6geoMod = model->BSIM4v6geoMod; - - if (!here->BSIM4v6rgeoModGiven) - here->BSIM4v6rgeoMod = model->BSIM4v6rgeoMod; - else if ((here->BSIM4v6rgeoMod != 0) && (here->BSIM4v6rgeoMod != 1)) - { here->BSIM4v6rgeoMod = model->BSIM4v6rgeoMod; - printf("Warning: rgeoMod has been set to its global value %d.\n", - model->BSIM4v6rgeoMod); - } - if (!here->BSIM4v6trnqsModGiven) - here->BSIM4v6trnqsMod = model->BSIM4v6trnqsMod; - else if ((here->BSIM4v6trnqsMod != 0) && (here->BSIM4v6trnqsMod != 1)) - { here->BSIM4v6trnqsMod = model->BSIM4v6trnqsMod; - printf("Warning: trnqsMod has been set to its global value %d.\n", - model->BSIM4v6trnqsMod); - } - - if (!here->BSIM4v6acnqsModGiven) - here->BSIM4v6acnqsMod = model->BSIM4v6acnqsMod; - else if ((here->BSIM4v6acnqsMod != 0) && (here->BSIM4v6acnqsMod != 1)) - { here->BSIM4v6acnqsMod = model->BSIM4v6acnqsMod; - printf("Warning: acnqsMod has been set to its global value %d.\n", - model->BSIM4v6acnqsMod); - } - - /* stress effect */ - if (!here->BSIM4v6saGiven) - here->BSIM4v6sa = 0.0; - if (!here->BSIM4v6sbGiven) - here->BSIM4v6sb = 0.0; - if (!here->BSIM4v6sdGiven) - here->BSIM4v6sd = 2 * model->BSIM4v6dmcg; - /* Well Proximity Effect */ - if (!here->BSIM4v6scaGiven) - here->BSIM4v6sca = 0.0; - if (!here->BSIM4v6scbGiven) - here->BSIM4v6scb = 0.0; - if (!here->BSIM4v6sccGiven) - here->BSIM4v6scc = 0.0; - if (!here->BSIM4v6scGiven) - here->BSIM4v6sc = 0.0; /* m */ - - /* process drain series resistance */ - createNode = 0; - if ( (model->BSIM4v6rdsMod != 0) - || (model->BSIM4v6tnoiMod != 0 && noiseAnalGiven)) - { - createNode = 1; - } else if (model->BSIM4v6sheetResistance > 0) - { - if (here->BSIM4v6drainSquaresGiven - && here->BSIM4v6drainSquares > 0) - { - createNode = 1; - } else if (!here->BSIM4v6drainSquaresGiven - && (here->BSIM4v6rgeoMod != 0)) - { - BSIM4v6RdseffGeo(here->BSIM4v6nf*here->BSIM4v6m, here->BSIM4v6geoMod, - here->BSIM4v6rgeoMod, here->BSIM4v6min, - here->BSIM4v6w, model->BSIM4v6sheetResistance, - DMCGeff, DMCIeff, DMDGeff, 0, &Rtot); - if(Rtot > 0) - createNode = 1; - } - } - if ( createNode != 0 ) - { if (here->BSIM4v6dNodePrime == 0) - { error = CKTmkVolt(ckt,&tmp,here->BSIM4v6name,"drain"); - if(error) return(error); - here->BSIM4v6dNodePrime = tmp->number; - if (ckt->CKTcopyNodesets) { - CKTnode *tmpNode; - IFuid tmpName; - if (CKTinst2Node(ckt,here,1,&tmpNode,&tmpName)==OK) { - if (tmpNode->nsGiven) { - tmp->nodeset=tmpNode->nodeset; - tmp->nsGiven=tmpNode->nsGiven; - } - } - } - } - } - else - { here->BSIM4v6dNodePrime = here->BSIM4v6dNode; - } - - /* process source series resistance */ - createNode = 0; - if ( (model->BSIM4v6rdsMod != 0) - || (model->BSIM4v6tnoiMod != 0 && noiseAnalGiven)) - { - createNode = 1; - } else if (model->BSIM4v6sheetResistance > 0) - { - if (here->BSIM4v6sourceSquaresGiven - && here->BSIM4v6sourceSquares > 0) - { - createNode = 1; - } else if (!here->BSIM4v6sourceSquaresGiven - && (here->BSIM4v6rgeoMod != 0)) - { - BSIM4v6RdseffGeo(here->BSIM4v6nf*here->BSIM4v6m, here->BSIM4v6geoMod, - here->BSIM4v6rgeoMod, here->BSIM4v6min, - here->BSIM4v6w, model->BSIM4v6sheetResistance, - DMCGeff, DMCIeff, DMDGeff, 1, &Rtot); - if(Rtot > 0) - createNode = 1; - } - } - if ( createNode != 0 ) - { if (here->BSIM4v6sNodePrime == 0) - { error = CKTmkVolt(ckt,&tmp,here->BSIM4v6name,"source"); - if(error) return(error); - here->BSIM4v6sNodePrime = tmp->number; - if (ckt->CKTcopyNodesets) { - CKTnode *tmpNode; - IFuid tmpName; - if (CKTinst2Node(ckt,here,3,&tmpNode,&tmpName)==OK) { - if (tmpNode->nsGiven) { - tmp->nodeset=tmpNode->nodeset; - tmp->nsGiven=tmpNode->nsGiven; - } - } - } - } - } - else - here->BSIM4v6sNodePrime = here->BSIM4v6sNode; - - if (here->BSIM4v6rgateMod > 0) - { if (here->BSIM4v6gNodePrime == 0) - { error = CKTmkVolt(ckt,&tmp,here->BSIM4v6name,"gate"); - if(error) return(error); - here->BSIM4v6gNodePrime = tmp->number; - if (ckt->CKTcopyNodesets) { - CKTnode *tmpNode; - IFuid tmpName; - if (CKTinst2Node(ckt,here,2,&tmpNode,&tmpName)==OK) { - if (tmpNode->nsGiven) { - tmp->nodeset=tmpNode->nodeset; - tmp->nsGiven=tmpNode->nsGiven; - } - } - } - } - } - else - here->BSIM4v6gNodePrime = here->BSIM4v6gNodeExt; - - if (here->BSIM4v6rgateMod == 3) - { if (here->BSIM4v6gNodeMid == 0) - { error = CKTmkVolt(ckt,&tmp,here->BSIM4v6name,"midgate"); - if(error) return(error); - here->BSIM4v6gNodeMid = tmp->number; - } - } - else - here->BSIM4v6gNodeMid = here->BSIM4v6gNodeExt; - - - /* internal body nodes for body resistance model */ - if ((here->BSIM4v6rbodyMod ==1) || (here->BSIM4v6rbodyMod ==2)) - { if (here->BSIM4v6dbNode == 0) - { error = CKTmkVolt(ckt,&tmp,here->BSIM4v6name,"dbody"); - if(error) return(error); - here->BSIM4v6dbNode = tmp->number; - } - if (here->BSIM4v6bNodePrime == 0) - { error = CKTmkVolt(ckt,&tmp,here->BSIM4v6name,"body"); - if(error) return(error); - here->BSIM4v6bNodePrime = tmp->number; - if (ckt->CKTcopyNodesets) { - CKTnode *tmpNode; - IFuid tmpName; - if (CKTinst2Node(ckt,here,4,&tmpNode,&tmpName)==OK) { - if (tmpNode->nsGiven) { - tmp->nodeset=tmpNode->nodeset; - tmp->nsGiven=tmpNode->nsGiven; - } - } - } - } - if (here->BSIM4v6sbNode == 0) - { error = CKTmkVolt(ckt,&tmp,here->BSIM4v6name,"sbody"); - if(error) return(error); - here->BSIM4v6sbNode = tmp->number; - } - } - else - here->BSIM4v6dbNode = here->BSIM4v6bNodePrime = here->BSIM4v6sbNode - = here->BSIM4v6bNode; - - /* NQS node */ - if (here->BSIM4v6trnqsMod) - { if (here->BSIM4v6qNode == 0) - { error = CKTmkVolt(ckt,&tmp,here->BSIM4v6name,"charge"); - if(error) return(error); - here->BSIM4v6qNode = tmp->number; - } - } - else - here->BSIM4v6qNode = 0; - -/* set Sparse Matrix Pointers - * macro to make elements with built-in out-of-memory test */ -#define TSTALLOC(ptr,first,second) \ -do { if((here->ptr = SMPmakeElt(matrix, here->first, here->second)) == NULL){\ - return(E_NOMEM);\ -} } while(0) - - TSTALLOC(BSIM4v6DPbpPtr, BSIM4v6dNodePrime, BSIM4v6bNodePrime); - TSTALLOC(BSIM4v6GPbpPtr, BSIM4v6gNodePrime, BSIM4v6bNodePrime); - TSTALLOC(BSIM4v6SPbpPtr, BSIM4v6sNodePrime, BSIM4v6bNodePrime); - - TSTALLOC(BSIM4v6BPdpPtr, BSIM4v6bNodePrime, BSIM4v6dNodePrime); - TSTALLOC(BSIM4v6BPgpPtr, BSIM4v6bNodePrime, BSIM4v6gNodePrime); - TSTALLOC(BSIM4v6BPspPtr, BSIM4v6bNodePrime, BSIM4v6sNodePrime); - TSTALLOC(BSIM4v6BPbpPtr, BSIM4v6bNodePrime, BSIM4v6bNodePrime); - - TSTALLOC(BSIM4v6DdPtr, BSIM4v6dNode, BSIM4v6dNode); - TSTALLOC(BSIM4v6GPgpPtr, BSIM4v6gNodePrime, BSIM4v6gNodePrime); - TSTALLOC(BSIM4v6SsPtr, BSIM4v6sNode, BSIM4v6sNode); - TSTALLOC(BSIM4v6DPdpPtr, BSIM4v6dNodePrime, BSIM4v6dNodePrime); - TSTALLOC(BSIM4v6SPspPtr, BSIM4v6sNodePrime, BSIM4v6sNodePrime); - TSTALLOC(BSIM4v6DdpPtr, BSIM4v6dNode, BSIM4v6dNodePrime); - TSTALLOC(BSIM4v6GPdpPtr, BSIM4v6gNodePrime, BSIM4v6dNodePrime); - TSTALLOC(BSIM4v6GPspPtr, BSIM4v6gNodePrime, BSIM4v6sNodePrime); - TSTALLOC(BSIM4v6SspPtr, BSIM4v6sNode, BSIM4v6sNodePrime); - TSTALLOC(BSIM4v6DPspPtr, BSIM4v6dNodePrime, BSIM4v6sNodePrime); - TSTALLOC(BSIM4v6DPdPtr, BSIM4v6dNodePrime, BSIM4v6dNode); - TSTALLOC(BSIM4v6DPgpPtr, BSIM4v6dNodePrime, BSIM4v6gNodePrime); - TSTALLOC(BSIM4v6SPgpPtr, BSIM4v6sNodePrime, BSIM4v6gNodePrime); - TSTALLOC(BSIM4v6SPsPtr, BSIM4v6sNodePrime, BSIM4v6sNode); - TSTALLOC(BSIM4v6SPdpPtr, BSIM4v6sNodePrime, BSIM4v6dNodePrime); - - TSTALLOC(BSIM4v6QqPtr, BSIM4v6qNode, BSIM4v6qNode); - TSTALLOC(BSIM4v6QbpPtr, BSIM4v6qNode, BSIM4v6bNodePrime) ; - TSTALLOC(BSIM4v6QdpPtr, BSIM4v6qNode, BSIM4v6dNodePrime); - TSTALLOC(BSIM4v6QspPtr, BSIM4v6qNode, BSIM4v6sNodePrime); - TSTALLOC(BSIM4v6QgpPtr, BSIM4v6qNode, BSIM4v6gNodePrime); - TSTALLOC(BSIM4v6DPqPtr, BSIM4v6dNodePrime, BSIM4v6qNode); - TSTALLOC(BSIM4v6SPqPtr, BSIM4v6sNodePrime, BSIM4v6qNode); - TSTALLOC(BSIM4v6GPqPtr, BSIM4v6gNodePrime, BSIM4v6qNode); - - if (here->BSIM4v6rgateMod != 0) - { TSTALLOC(BSIM4v6GEgePtr, BSIM4v6gNodeExt, BSIM4v6gNodeExt); - TSTALLOC(BSIM4v6GEgpPtr, BSIM4v6gNodeExt, BSIM4v6gNodePrime); - TSTALLOC(BSIM4v6GPgePtr, BSIM4v6gNodePrime, BSIM4v6gNodeExt); - TSTALLOC(BSIM4v6GEdpPtr, BSIM4v6gNodeExt, BSIM4v6dNodePrime); - TSTALLOC(BSIM4v6GEspPtr, BSIM4v6gNodeExt, BSIM4v6sNodePrime); - TSTALLOC(BSIM4v6GEbpPtr, BSIM4v6gNodeExt, BSIM4v6bNodePrime); - - TSTALLOC(BSIM4v6GMdpPtr, BSIM4v6gNodeMid, BSIM4v6dNodePrime); - TSTALLOC(BSIM4v6GMgpPtr, BSIM4v6gNodeMid, BSIM4v6gNodePrime); - TSTALLOC(BSIM4v6GMgmPtr, BSIM4v6gNodeMid, BSIM4v6gNodeMid); - TSTALLOC(BSIM4v6GMgePtr, BSIM4v6gNodeMid, BSIM4v6gNodeExt); - TSTALLOC(BSIM4v6GMspPtr, BSIM4v6gNodeMid, BSIM4v6sNodePrime); - TSTALLOC(BSIM4v6GMbpPtr, BSIM4v6gNodeMid, BSIM4v6bNodePrime); - TSTALLOC(BSIM4v6DPgmPtr, BSIM4v6dNodePrime, BSIM4v6gNodeMid); - TSTALLOC(BSIM4v6GPgmPtr, BSIM4v6gNodePrime, BSIM4v6gNodeMid); - TSTALLOC(BSIM4v6GEgmPtr, BSIM4v6gNodeExt, BSIM4v6gNodeMid); - TSTALLOC(BSIM4v6SPgmPtr, BSIM4v6sNodePrime, BSIM4v6gNodeMid); - TSTALLOC(BSIM4v6BPgmPtr, BSIM4v6bNodePrime, BSIM4v6gNodeMid); - } - - if ((here->BSIM4v6rbodyMod ==1) || (here->BSIM4v6rbodyMod ==2)) - { TSTALLOC(BSIM4v6DPdbPtr, BSIM4v6dNodePrime, BSIM4v6dbNode); - TSTALLOC(BSIM4v6SPsbPtr, BSIM4v6sNodePrime, BSIM4v6sbNode); - - TSTALLOC(BSIM4v6DBdpPtr, BSIM4v6dbNode, BSIM4v6dNodePrime); - TSTALLOC(BSIM4v6DBdbPtr, BSIM4v6dbNode, BSIM4v6dbNode); - TSTALLOC(BSIM4v6DBbpPtr, BSIM4v6dbNode, BSIM4v6bNodePrime); - TSTALLOC(BSIM4v6DBbPtr, BSIM4v6dbNode, BSIM4v6bNode); - - TSTALLOC(BSIM4v6BPdbPtr, BSIM4v6bNodePrime, BSIM4v6dbNode); - TSTALLOC(BSIM4v6BPbPtr, BSIM4v6bNodePrime, BSIM4v6bNode); - TSTALLOC(BSIM4v6BPsbPtr, BSIM4v6bNodePrime, BSIM4v6sbNode); - - TSTALLOC(BSIM4v6SBspPtr, BSIM4v6sbNode, BSIM4v6sNodePrime); - TSTALLOC(BSIM4v6SBbpPtr, BSIM4v6sbNode, BSIM4v6bNodePrime); - TSTALLOC(BSIM4v6SBbPtr, BSIM4v6sbNode, BSIM4v6bNode); - TSTALLOC(BSIM4v6SBsbPtr, BSIM4v6sbNode, BSIM4v6sbNode); - - TSTALLOC(BSIM4v6BdbPtr, BSIM4v6bNode, BSIM4v6dbNode); - TSTALLOC(BSIM4v6BbpPtr, BSIM4v6bNode, BSIM4v6bNodePrime); - TSTALLOC(BSIM4v6BsbPtr, BSIM4v6bNode, BSIM4v6sbNode); - TSTALLOC(BSIM4v6BbPtr, BSIM4v6bNode, BSIM4v6bNode); - } - - if (model->BSIM4v6rdsMod) - { TSTALLOC(BSIM4v6DgpPtr, BSIM4v6dNode, BSIM4v6gNodePrime); - TSTALLOC(BSIM4v6DspPtr, BSIM4v6dNode, BSIM4v6sNodePrime); - TSTALLOC(BSIM4v6DbpPtr, BSIM4v6dNode, BSIM4v6bNodePrime); - TSTALLOC(BSIM4v6SdpPtr, BSIM4v6sNode, BSIM4v6dNodePrime); - TSTALLOC(BSIM4v6SgpPtr, BSIM4v6sNode, BSIM4v6gNodePrime); - TSTALLOC(BSIM4v6SbpPtr, BSIM4v6sNode, BSIM4v6bNodePrime); - } - } - } /* end of loop through all the BSIM4v6 device models */ - -#ifdef USE_OMP - InstCount = 0; - model = (BSIM4v6model*)inModel; - /* loop through all the BSIM4v6 device models - to count the number of instances */ - - for( ; model != NULL; model = BSIM4v6nextModel(model)) - { - /* loop through all the instances of the model */ - for (here = BSIM4v6instances(model); here != NULL ; - here=BSIM4v6nextInstance(here)) - { - InstCount++; - } - model->BSIM4v6InstCount = 0; - model->BSIM4v6InstanceArray = NULL; - } - InstArray = TMALLOC(BSIM4v6instance*, InstCount); - model = (BSIM4v6model*)inModel; - /* store this in the first model only */ - model->BSIM4v6InstCount = InstCount; - model->BSIM4v6InstanceArray = InstArray; - idx = 0; - for( ; model != NULL; model = BSIM4v6nextModel(model)) - { - /* loop through all the instances of the model */ - for (here = BSIM4v6instances(model); here != NULL ; - here=BSIM4v6nextInstance(here)) - { - InstArray[idx] = here; - idx++; - } - } -#endif - - return(OK); -} - -int -BSIM4v6unsetup(GENmodel *inModel, CKTcircuit *ckt) -{ -#ifndef HAS_BATCHSIM - BSIM4v6model *model; - BSIM4v6instance *here; - -#ifdef USE_OMP - model = (BSIM4v6model*)inModel; - tfree(model->BSIM4v6InstanceArray); -#endif - - for (model = (BSIM4v6model *)inModel; model != NULL; - model = BSIM4v6nextModel(model)) - { - for (here = BSIM4v6instances(model); here != NULL; - here=BSIM4v6nextInstance(here)) - { - if (here->BSIM4v6qNode > 0) - CKTdltNNum(ckt, here->BSIM4v6qNode); - here->BSIM4v6qNode = 0; - - if (here->BSIM4v6sbNode > 0 && - here->BSIM4v6sbNode != here->BSIM4v6bNode) - CKTdltNNum(ckt, here->BSIM4v6sbNode); - here->BSIM4v6sbNode = 0; - - if (here->BSIM4v6bNodePrime > 0 && - here->BSIM4v6bNodePrime != here->BSIM4v6bNode) - CKTdltNNum(ckt, here->BSIM4v6bNodePrime); - here->BSIM4v6bNodePrime = 0; - - if (here->BSIM4v6dbNode > 0 && - here->BSIM4v6dbNode != here->BSIM4v6bNode) - CKTdltNNum(ckt, here->BSIM4v6dbNode); - here->BSIM4v6dbNode = 0; - - if (here->BSIM4v6gNodeMid > 0 && - here->BSIM4v6gNodeMid != here->BSIM4v6gNodeExt) - CKTdltNNum(ckt, here->BSIM4v6gNodeMid); - here->BSIM4v6gNodeMid = 0; - - if (here->BSIM4v6gNodePrime > 0 && - here->BSIM4v6gNodePrime != here->BSIM4v6gNodeExt) - CKTdltNNum(ckt, here->BSIM4v6gNodePrime); - here->BSIM4v6gNodePrime = 0; - - if (here->BSIM4v6sNodePrime > 0 - && here->BSIM4v6sNodePrime != here->BSIM4v6sNode) - CKTdltNNum(ckt, here->BSIM4v6sNodePrime); - here->BSIM4v6sNodePrime = 0; - - if (here->BSIM4v6dNodePrime > 0 - && here->BSIM4v6dNodePrime != here->BSIM4v6dNode) - CKTdltNNum(ckt, here->BSIM4v6dNodePrime); - here->BSIM4v6dNodePrime = 0; - } - } -#endif - return OK; -} diff --git a/src/spicelib/devices/bsim4v6/b4v6soachk.c b/src/spicelib/devices/bsim4v6/b4v6soachk.c deleted file mode 100644 index b508cc43a..000000000 --- a/src/spicelib/devices/bsim4v6/b4v6soachk.c +++ /dev/null @@ -1,341 +0,0 @@ -/********** -Copyright 2013 Dietmar Warning. All rights reserved. -Author: 2013 Dietmar Warning -**********/ - -#include "ngspice/ngspice.h" -#include "ngspice/cktdefs.h" -#include "bsim4v6def.h" -#include "ngspice/trandefs.h" -#include "ngspice/sperror.h" -#include "ngspice/suffix.h" -#include "ngspice/cpdefs.h" - - -int -BSIM4v6soaCheck(CKTcircuit *ckt, GENmodel *inModel) -{ - BSIM4v6model *model = (BSIM4v6model *) inModel; - BSIM4v6instance *here; - double vgs, vgd, vgb, vds, vbs, vbd; /* actual mos voltages */ - int maxwarns; - static int warns_vgs = 0, warns_vgd = 0, warns_vgb = 0, warns_vds = 0, warns_vbs = 0, warns_vbd = 0; - - if (!ckt) { - warns_vgs = 0; - warns_vgd = 0; - warns_vgb = 0; - warns_vds = 0; - warns_vbs = 0; - warns_vbd = 0; - return OK; - } - - maxwarns = ckt->CKTsoaMaxWarns; - - for (; model; model = BSIM4v6nextModel(model)) { - - for (here = BSIM4v6instances(model); here; here = BSIM4v6nextInstance(here)) { - - vgs = ckt->CKTrhsOld [here->BSIM4v6gNodePrime] - - ckt->CKTrhsOld [here->BSIM4v6sNodePrime]; - - vgd = ckt->CKTrhsOld [here->BSIM4v6gNodePrime] - - ckt->CKTrhsOld [here->BSIM4v6dNodePrime]; - - vgb = ckt->CKTrhsOld [here->BSIM4v6gNodePrime] - - ckt->CKTrhsOld [here->BSIM4v6bNodePrime]; - - vds = ckt->CKTrhsOld [here->BSIM4v6dNodePrime] - - ckt->CKTrhsOld [here->BSIM4v6sNodePrime]; - - vbs = ckt->CKTrhsOld [here->BSIM4v6bNodePrime] - - ckt->CKTrhsOld [here->BSIM4v6sNodePrime]; - - vbd = ckt->CKTrhsOld [here->BSIM4v6bNodePrime] - - ckt->CKTrhsOld [here->BSIM4v6dNodePrime]; - - if (!model->BSIM4v6vgsrMaxGiven) { - if (fabs(vgs) > model->BSIM4v6vgsMax) - if (warns_vgs < maxwarns) { - soa_printf(ckt, (GENinstance*) here, - "Vgs=%g has exceeded Vgs_max=%g\n", - vgs, model->BSIM4v6vgsMax); - warns_vgs++; - } - if (!model->BSIM4v6vgbMaxGiven) { - if (fabs(vgb) > model->BSIM4v6vgsMax) - if (warns_vgb < maxwarns) { - soa_printf(ckt, (GENinstance*) here, - "Vgb=%g has exceeded Vgs_max=%g\n", - vgb, model->BSIM4v6vgsMax); - warns_vgb++; - } - } else { - if (fabs(vgb) > model->BSIM4v6vgbMax) - if (warns_vgb < maxwarns) { - soa_printf(ckt, (GENinstance*) here, - "Vgb=%g has exceeded Vgb_max=%g\n", - vgb, model->BSIM4v6vgbMax); - warns_vgb++; - } - } - } else { - if (model->BSIM4v6type > 0) { - if (vgs > model->BSIM4v6vgsMax) - if (warns_vgs < maxwarns) { - soa_printf(ckt, (GENinstance*) here, - "Vgs=%g has exceeded Vgs_max=%g\n", - vgs, model->BSIM4v6vgsMax); - warns_vgs++; - } - if (-1*vgs > model->BSIM4v6vgsrMax) - if (warns_vgs < maxwarns) { - soa_printf(ckt, (GENinstance*) here, - "Vgs=%g has exceeded Vgsr_max=%g\n", - vgs, model->BSIM4v6vgsrMax); - warns_vgs++; - } - } else { - if (vgs > model->BSIM4v6vgsrMax) - if (warns_vgs < maxwarns) { - soa_printf(ckt, (GENinstance*) here, - "Vgs=%g has exceeded Vgsr_max=%g\n", - vgs, model->BSIM4v6vgsrMax); - warns_vgs++; - } - if (-1*vgs > model->BSIM4v6vgsMax) - if (warns_vgs < maxwarns) { - soa_printf(ckt, (GENinstance*) here, - "Vgs=%g has exceeded Vgs_max=%g\n", - vgs, model->BSIM4v6vgsMax); - warns_vgs++; - } - } - } - - if (!model->BSIM4v6vgdrMaxGiven) { - if (fabs(vgd) > model->BSIM4v6vgdMax) - if (warns_vgd < maxwarns) { - soa_printf(ckt, (GENinstance*) here, - "Vgd=%g has exceeded Vgd_max=%g\n", - vgd, model->BSIM4v6vgdMax); - warns_vgd++; - } - } else { - if (model->BSIM4v6type > 0) { - if (vgd > model->BSIM4v6vgdMax) - if (warns_vgd < maxwarns) { - soa_printf(ckt, (GENinstance*) here, - "Vgd=%g has exceeded Vgd_max=%g\n", - vgd, model->BSIM4v6vgdMax); - warns_vgd++; - } - if (-1*vgd > model->BSIM4v6vgdrMax) - if (warns_vgd < maxwarns) { - soa_printf(ckt, (GENinstance*) here, - "Vgd=%g has exceeded Vgdr_max=%g\n", - vgd, model->BSIM4v6vgdrMax); - warns_vgd++; - } - } else { - if (vgd > model->BSIM4v6vgdrMax) - if (warns_vgd < maxwarns) { - soa_printf(ckt, (GENinstance*) here, - "Vgd=%g has exceeded Vgdr_max=%g\n", - vgd, model->BSIM4v6vgdrMax); - warns_vgd++; - } - if (-1*vgd > model->BSIM4v6vgdMax) - if (warns_vgd < maxwarns) { - soa_printf(ckt, (GENinstance*) here, - "Vgd=%g has exceeded Vgd_max=%g\n", - vgd, model->BSIM4v6vgdMax); - warns_vgd++; - } - } - } - - if (fabs(vds) > model->BSIM4v6vdsMax) - if (warns_vds < maxwarns) { - soa_printf(ckt, (GENinstance*) here, - "Vds=%g has exceeded Vds_max=%g\n", - vds, model->BSIM4v6vdsMax); - warns_vds++; - } - - if (!model->BSIM4v6vgbrMaxGiven) { - if (fabs(vgb) > model->BSIM4v6vgbMax) - if (warns_vgb < maxwarns) { - soa_printf(ckt, (GENinstance*) here, - "Vgb=%g has exceeded Vgb_max=%g\n", - vgb, model->BSIM4v6vgbMax); - warns_vgb++; - } - } else { - if (model->BSIM4v6type > 0) { - if (vgb > model->BSIM4v6vgbMax) - if (warns_vgb < maxwarns) { - soa_printf(ckt, (GENinstance*) here, - "Vgb=%g has exceeded Vgb_max=%g\n", - vgb, model->BSIM4v6vgbMax); - warns_vgb++; - } - if (-1*vgb > model->BSIM4v6vgbrMax) - if (warns_vgb < maxwarns) { - soa_printf(ckt, (GENinstance*) here, - "Vgb=%g has exceeded Vgbr_max=%g\n", - vgb, model->BSIM4v6vgbrMax); - warns_vgb++; - } - } else { - if (vgb > model->BSIM4v6vgbrMax) - if (warns_vgb < maxwarns) { - soa_printf(ckt, (GENinstance*) here, - "Vgb=%g has exceeded Vgbr_max=%g\n", - vgb, model->BSIM4v6vgbrMax); - warns_vgb++; - } - if (-1*vgb > model->BSIM4v6vgbMax) - if (warns_vgb < maxwarns) { - soa_printf(ckt, (GENinstance*) here, - "Vgb=%g has exceeded Vgb_max=%g\n", - vgb, model->BSIM4v6vgbMax); - warns_vgb++; - } - } - } - - if (!model->BSIM4v6vbsrMaxGiven) { - if (!model->BSIM4v6vbsMaxGiven) { - if (fabs(vbs) > model->BSIM4v6vbdMax) - if (warns_vbs < maxwarns) { - soa_printf(ckt, (GENinstance*) here, - "Vbs=%g has exceeded Vbd_max=%g\n", - vbs, model->BSIM4v6vbdMax); - warns_vbs++; - } - } else { - if (fabs(vbs) > model->BSIM4v6vbsMax) - if (warns_vbs < maxwarns) { - soa_printf(ckt, (GENinstance*) here, - "Vbs=%g has exceeded Vbs_max=%g\n", - vbs, model->BSIM4v6vbsMax); - warns_vbs++; - } - } - } else { - if (!model->BSIM4v6vbsMaxGiven) { - if (model->BSIM4v6type > 0) { - if (vbs > model->BSIM4v6vbdMax) - if (warns_vbs < maxwarns) { - soa_printf(ckt, (GENinstance*) here, - "Vbs=%g has exceeded Vbd_max=%g\n", - vbs, model->BSIM4v6vbdMax); - warns_vbs++; - } - if (-1*vbs > model->BSIM4v6vbsrMax) - if (warns_vbs < maxwarns) { - soa_printf(ckt, (GENinstance*) here, - "Vbs=%g has exceeded Vbsr_max=%g\n", - vbs, model->BSIM4v6vbsrMax); - warns_vbs++; - } - } else { - if (vbs > model->BSIM4v6vbsrMax) - if (warns_vbs < maxwarns) { - soa_printf(ckt, (GENinstance*) here, - "Vbs=%g has exceeded Vbsr_max=%g\n", - vbs, model->BSIM4v6vbsrMax); - warns_vbs++; - } - if (-1*vbs > model->BSIM4v6vbdMax) - if (warns_vbs < maxwarns) { - soa_printf(ckt, (GENinstance*) here, - "Vbs=%g has exceeded Vbd_max=%g\n", - vbs, model->BSIM4v6vbdMax); - warns_vbs++; - } - } - } else { - if (model->BSIM4v6type > 0) { - if (vbs > model->BSIM4v6vbsMax) - if (warns_vbs < maxwarns) { - soa_printf(ckt, (GENinstance*) here, - "Vbs=%g has exceeded Vbs_max=%g\n", - vbs, model->BSIM4v6vbsMax); - warns_vbs++; - } - if (-1*vbs > model->BSIM4v6vbsrMax) - if (warns_vbs < maxwarns) { - soa_printf(ckt, (GENinstance*) here, - "Vbs=%g has exceeded Vbsr_max=%g\n", - vbs, model->BSIM4v6vbsrMax); - warns_vbs++; - } - } else { - if (vbs > model->BSIM4v6vbsrMax) - if (warns_vbs < maxwarns) { - soa_printf(ckt, (GENinstance*) here, - "Vbs=%g has exceeded Vbsr_max=%g\n", - vbs, model->BSIM4v6vbsrMax); - warns_vbs++; - } - if (-1*vbs > model->BSIM4v6vbsMax) - if (warns_vbs < maxwarns) { - soa_printf(ckt, (GENinstance*) here, - "Vbs=%g has exceeded Vbs_max=%g\n", - vbs, model->BSIM4v6vbsMax); - warns_vbs++; - } - } - } - } - - if (!model->BSIM4v6vbdrMaxGiven) { - if (fabs(vbd) > model->BSIM4v6vbdMax) - if (warns_vbd < maxwarns) { - soa_printf(ckt, (GENinstance*) here, - "Vbd=%g has exceeded Vbd_max=%g\n", - vbd, model->BSIM4v6vbdMax); - warns_vbd++; - } - } else { - if (model->BSIM4v6type > 0) { - if (vbd > model->BSIM4v6vbdMax) - if (warns_vbd < maxwarns) { - soa_printf(ckt, (GENinstance*) here, - "Vbd=%g has exceeded Vbd_max=%g\n", - vbd, model->BSIM4v6vbdMax); - warns_vbd++; - } - if (-1*vbd > model->BSIM4v6vbdrMax) - if (warns_vbd < maxwarns) { - soa_printf(ckt, (GENinstance*) here, - "Vbd=%g has exceeded Vbdr_max=%g\n", - vbd, model->BSIM4v6vbdrMax); - warns_vbd++; - } - } else { - if (vbd > model->BSIM4v6vbdrMax) - if (warns_vbd < maxwarns) { - soa_printf(ckt, (GENinstance*) here, - "Vbd=%g has exceeded Vbdr_max=%g\n", - vbd, model->BSIM4v6vbdrMax); - warns_vbd++; - } - if (-1*vbd > model->BSIM4v6vbdMax) - if (warns_vbd < maxwarns) { - soa_printf(ckt, (GENinstance*) here, - "Vbd=%g has exceeded Vbd_max=%g\n", - vbd, model->BSIM4v6vbdMax); - warns_vbd++; - } - } - } - - } - } - - return OK; -} diff --git a/src/spicelib/devices/bsim4v6/b4v6temp.c b/src/spicelib/devices/bsim4v6/b4v6temp.c deleted file mode 100644 index 44e2914b7..000000000 --- a/src/spicelib/devices/bsim4v6/b4v6temp.c +++ /dev/null @@ -1,2196 +0,0 @@ -/**** BSIM4.6.2 Released by Wenwei Yang 07/31/2008 ****/ -/**** BSIM4.6.5 Update ngspice 09/22/2009 ****/ -/********** - * Copyright 2006 Regents of the University of California. All rights reserved. - * File: b4temp.c of BSIM4.6.3. - * Author: 2000 Weidong Liu - * Authors: 2001- Xuemei Xi, Mohan Dunga, Ali Niknejad, Chenming Hu. - * Authors: 2006- Mohan Dunga, Ali Niknejad, Chenming Hu - * Authors: 2007- Mohan Dunga, Wenwei Yang, Ali Niknejad, Chenming Hu - * Authors: 2008- Wenwei Yang, Ali Niknejad, Chenming Hu - * Project Director: Prof. Chenming Hu. - * Modified by Xuemei Xi, 04/06/2001. - * Modified by Xuemei Xi, 10/05/2001. - * Modified by Xuemei Xi, 11/15/2002. - * Modified by Xuemei Xi, 05/09/2003. - * Modified by Xuemei Xi, 03/04/2004. - * Modified by Xuemei Xi, Mohan Dunga, 07/29/2005. - * Modified by Mohan Dunga, 12/13/2006. - * Modified by Mohan Dunga, Wenwei Yang, 05/18/2007. - * Modified by Wenwei Yang, 07/31/2008. - **********/ - - -#include "ngspice/ngspice.h" -#include "ngspice/smpdefs.h" -#include "ngspice/cktdefs.h" -#include "bsim4v6def.h" -#include "ngspice/const.h" -#include "ngspice/sperror.h" -#include "ngspice/suffix.h" - -#define Kb 1.3806226e-23 -#define KboQ 8.617087e-5 -#define EPS0 8.85418e-12 -#define EPSSI 1.03594e-10 -#define PI 3.141592654 -#define MAX_EXP 5.834617425e14 -#define MIN_EXP 1.713908431e-15 -#define EXP_THRESHOLD 34.0 -#define Charge_q 1.60219e-19 -#define DELTA 1.0E-9 -#define DEXP(A,B) { \ - if (A > EXP_THRESHOLD) { \ - B = MAX_EXP*(1.0+(A)-EXP_THRESHOLD); \ - } else if (A < -EXP_THRESHOLD) { \ - B = MIN_EXP; \ - } else { \ - B = exp(A); \ - } \ - } - - -static int -BSIM4v6DioIjthVjmEval(double Nvtm, double Ijth, double Isb, double XExpBV, double *Vjm) -{ -double Tb, Tc, EVjmovNv; - - Tc = XExpBV; - Tb = 1.0 + Ijth / Isb - Tc; - EVjmovNv = 0.5 * (Tb + sqrt(Tb * Tb + 4.0 * Tc)); - *Vjm = Nvtm * log(EVjmovNv); - -return 0; -} - - -int -BSIM4v6temp( -GENmodel *inModel, -CKTcircuit *ckt) -{ -BSIM4v6model *model = (BSIM4v6model*) inModel; -BSIM4v6instance *here; -struct bsim4v6SizeDependParam *pSizeDependParamKnot, *pLastKnot, *pParam=NULL; -double tmp, tmp1, tmp2, tmp3, Eg, Eg0, ni, epssub; -double T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, Lnew=0.0, Wnew; -double delTemp, Temp, TRatio, Inv_L, Inv_W, Inv_LW, Vtm0, Tnom; -double dumPs, dumPd, dumAs, dumAd, PowWeffWr; -double DMCGeff, DMCIeff, DMDGeff; -double Nvtms, Nvtmd, SourceSatCurrent, DrainSatCurrent; -double T10, T11; -double Inv_saref, Inv_sbref, Inv_sa, Inv_sb, rho, Ldrn, dvth0_lod; -double W_tmp, Inv_ODeff, OD_offset, dk2_lod, deta0_lod; -double lnl, lnw, lnnf, rbpbx, rbpby, rbsbx, rbsby, rbdbx, rbdby,bodymode; -double kvsat, wlod, sceff, Wdrn; -double V0, lt1, ltw, Theta0, Delt_vth, Vth_NarrowW, Lpe_Vb, Vth; -double n, n0, Vgsteff, Vgs_eff, niter, toxpf, toxpi, Tcen, toxe, epsrox, vddeot; -double vtfbphi2eot, phieot, TempRatioeot, Vtm0eot, Vtmeot,vbieot; - -int Size_Not_Found, i; - - /* loop through all the BSIM4v6 device models */ - for (; model != NULL; model = BSIM4v6nextModel(model)) - { Temp = ckt->CKTtemp; - if (model->BSIM4v6SbulkJctPotential < 0.1) - { model->BSIM4v6SbulkJctPotential = 0.1; - fprintf(stderr, "Given pbs is less than 0.1. Pbs is set to 0.1.\n"); - } - if (model->BSIM4v6SsidewallJctPotential < 0.1) - { model->BSIM4v6SsidewallJctPotential = 0.1; - fprintf(stderr, "Given pbsws is less than 0.1. Pbsws is set to 0.1.\n"); - } - if (model->BSIM4v6SGatesidewallJctPotential < 0.1) - { model->BSIM4v6SGatesidewallJctPotential = 0.1; - fprintf(stderr, "Given pbswgs is less than 0.1. Pbswgs is set to 0.1.\n"); - } - - if (model->BSIM4v6DbulkJctPotential < 0.1) - { model->BSIM4v6DbulkJctPotential = 0.1; - fprintf(stderr, "Given pbd is less than 0.1. Pbd is set to 0.1.\n"); - } - if (model->BSIM4v6DsidewallJctPotential < 0.1) - { model->BSIM4v6DsidewallJctPotential = 0.1; - fprintf(stderr, "Given pbswd is less than 0.1. Pbswd is set to 0.1.\n"); - } - if (model->BSIM4v6DGatesidewallJctPotential < 0.1) - { model->BSIM4v6DGatesidewallJctPotential = 0.1; - fprintf(stderr, "Given pbswgd is less than 0.1. Pbswgd is set to 0.1.\n"); - } - - if(model->BSIM4v6mtrlMod == 0) - { - if ((model->BSIM4v6toxeGiven) && (model->BSIM4v6toxpGiven) && (model->BSIM4v6dtoxGiven) - && (model->BSIM4v6toxe != (model->BSIM4v6toxp + model->BSIM4v6dtox))) - printf("Warning: toxe, toxp and dtox all given and toxe != toxp + dtox; dtox ignored.\n"); - else if ((model->BSIM4v6toxeGiven) && (!model->BSIM4v6toxpGiven)) - model->BSIM4v6toxp = model->BSIM4v6toxe - model->BSIM4v6dtox; - else if ((!model->BSIM4v6toxeGiven) && (model->BSIM4v6toxpGiven)) - model->BSIM4v6toxe = model->BSIM4v6toxp + model->BSIM4v6dtox; - } - - if(model->BSIM4v6mtrlMod) - { - epsrox = 3.9; - toxe = model->BSIM4v6eot; - epssub = EPS0 * model->BSIM4v6epsrsub; - } - else - { - epsrox = model->BSIM4v6epsrox; - toxe = model->BSIM4v6toxe; - epssub = EPSSI; - } - - - model->BSIM4v6coxe = epsrox * EPS0 / toxe; - if(model->BSIM4v6mtrlMod == 0) - model->BSIM4v6coxp = model->BSIM4v6epsrox * EPS0 / model->BSIM4v6toxp; - - if (!model->BSIM4v6cgdoGiven) - { if (model->BSIM4v6dlcGiven && (model->BSIM4v6dlc > 0.0)) - model->BSIM4v6cgdo = model->BSIM4v6dlc * model->BSIM4v6coxe - - model->BSIM4v6cgdl ; - else - model->BSIM4v6cgdo = 0.6 * model->BSIM4v6xj * model->BSIM4v6coxe; - } - if (!model->BSIM4v6cgsoGiven) - { if (model->BSIM4v6dlcGiven && (model->BSIM4v6dlc > 0.0)) - model->BSIM4v6cgso = model->BSIM4v6dlc * model->BSIM4v6coxe - - model->BSIM4v6cgsl ; - else - model->BSIM4v6cgso = 0.6 * model->BSIM4v6xj * model->BSIM4v6coxe; - } - if (!model->BSIM4v6cgboGiven) - model->BSIM4v6cgbo = 2.0 * model->BSIM4v6dwc * model->BSIM4v6coxe; - - struct bsim4v6SizeDependParam *p = model->pSizeDependParamKnot; - while (p) { - struct bsim4v6SizeDependParam *next_p = p->pNext; - FREE(p); - p = next_p; - } - model->pSizeDependParamKnot = NULL; - pLastKnot = NULL; - - Tnom = model->BSIM4v6tnom; - TRatio = Temp / Tnom; - - model->BSIM4v6vcrit = CONSTvt0 * log(CONSTvt0 / (CONSTroot2 * 1.0e-14)); - model->BSIM4v6factor1 = sqrt(epssub / (epsrox * EPS0)* toxe); - - Vtm0 = model->BSIM4v6vtm0 = KboQ * Tnom; - - if(model->BSIM4v6mtrlMod==0) - { - Eg0 = 1.16 - 7.02e-4 * Tnom * Tnom / (Tnom + 1108.0); - ni = 1.45e10 * (Tnom / 300.15) * sqrt(Tnom / 300.15) - * exp(21.5565981 - Eg0 / (2.0 * Vtm0)); - } - else - { - Eg0 = model->BSIM4v6bg0sub - model->BSIM4v6tbgasub * Tnom * Tnom - / (Tnom + model->BSIM4v6tbgbsub); - T0 = model->BSIM4v6bg0sub - model->BSIM4v6tbgasub * 90090.0225 - / (300.15 + model->BSIM4v6tbgbsub); - ni = model->BSIM4v6ni0sub * (Tnom / 300.15) * sqrt(Tnom / 300.15) - * exp((T0 - Eg0) / (2.0 * Vtm0)); - } - - model->BSIM4v6Eg0 = Eg0; - model->BSIM4v6vtm = KboQ * Temp; - if(model->BSIM4v6mtrlMod == 0) - Eg = 1.16 - 7.02e-4 * Temp * Temp / (Temp + 1108.0); - else - Eg = model->BSIM4v6bg0sub - model->BSIM4v6tbgasub * Temp * Temp - / (Temp + model->BSIM4v6tbgbsub); - if (Temp != Tnom) - { T0 = Eg0 / Vtm0 - Eg / model->BSIM4v6vtm; - T1 = log(Temp / Tnom); - T2 = T0 + model->BSIM4v6SjctTempExponent * T1; - T3 = exp(T2 / model->BSIM4v6SjctEmissionCoeff); - model->BSIM4v6SjctTempSatCurDensity = model->BSIM4v6SjctSatCurDensity - * T3; - model->BSIM4v6SjctSidewallTempSatCurDensity - = model->BSIM4v6SjctSidewallSatCurDensity * T3; - model->BSIM4v6SjctGateSidewallTempSatCurDensity - = model->BSIM4v6SjctGateSidewallSatCurDensity * T3; - - T2 = T0 + model->BSIM4v6DjctTempExponent * T1; - T3 = exp(T2 / model->BSIM4v6DjctEmissionCoeff); - model->BSIM4v6DjctTempSatCurDensity = model->BSIM4v6DjctSatCurDensity - * T3; - model->BSIM4v6DjctSidewallTempSatCurDensity - = model->BSIM4v6DjctSidewallSatCurDensity * T3; - model->BSIM4v6DjctGateSidewallTempSatCurDensity - = model->BSIM4v6DjctGateSidewallSatCurDensity * T3; - } - else - { model->BSIM4v6SjctTempSatCurDensity = model->BSIM4v6SjctSatCurDensity; - model->BSIM4v6SjctSidewallTempSatCurDensity - = model->BSIM4v6SjctSidewallSatCurDensity; - model->BSIM4v6SjctGateSidewallTempSatCurDensity - = model->BSIM4v6SjctGateSidewallSatCurDensity; - model->BSIM4v6DjctTempSatCurDensity = model->BSIM4v6DjctSatCurDensity; - model->BSIM4v6DjctSidewallTempSatCurDensity - = model->BSIM4v6DjctSidewallSatCurDensity; - model->BSIM4v6DjctGateSidewallTempSatCurDensity - = model->BSIM4v6DjctGateSidewallSatCurDensity; - } - - if (model->BSIM4v6SjctTempSatCurDensity < 0.0) - model->BSIM4v6SjctTempSatCurDensity = 0.0; - if (model->BSIM4v6SjctSidewallTempSatCurDensity < 0.0) - model->BSIM4v6SjctSidewallTempSatCurDensity = 0.0; - if (model->BSIM4v6SjctGateSidewallTempSatCurDensity < 0.0) - model->BSIM4v6SjctGateSidewallTempSatCurDensity = 0.0; - if (model->BSIM4v6DjctTempSatCurDensity < 0.0) - model->BSIM4v6DjctTempSatCurDensity = 0.0; - if (model->BSIM4v6DjctSidewallTempSatCurDensity < 0.0) - model->BSIM4v6DjctSidewallTempSatCurDensity = 0.0; - if (model->BSIM4v6DjctGateSidewallTempSatCurDensity < 0.0) - model->BSIM4v6DjctGateSidewallTempSatCurDensity = 0.0; - - /* Temperature dependence of D/B and S/B diode capacitance begins */ - delTemp = ckt->CKTtemp - model->BSIM4v6tnom; - T0 = model->BSIM4v6tcj * delTemp; - if (T0 >= -1.0) - { model->BSIM4v6SunitAreaTempJctCap = model->BSIM4v6SunitAreaJctCap *(1.0 + T0); /*bug_fix -JX */ - model->BSIM4v6DunitAreaTempJctCap = model->BSIM4v6DunitAreaJctCap *(1.0 + T0); - } - else - { if (model->BSIM4v6SunitAreaJctCap > 0.0) - { model->BSIM4v6SunitAreaTempJctCap = 0.0; - fprintf(stderr, "Temperature effect has caused cjs to be negative. Cjs is clamped to zero.\n"); - } - if (model->BSIM4v6DunitAreaJctCap > 0.0) - { model->BSIM4v6DunitAreaTempJctCap = 0.0; - fprintf(stderr, "Temperature effect has caused cjd to be negative. Cjd is clamped to zero.\n"); - } - } - T0 = model->BSIM4v6tcjsw * delTemp; - if (model->BSIM4v6SunitLengthSidewallJctCap < 0.0)/*4.6.2*/ - {model->BSIM4v6SunitLengthSidewallJctCap = 0.0; - fprintf(stderr, "CJSWS is negative. Cjsws is clamped to zero.\n");} - if (model->BSIM4v6DunitLengthSidewallJctCap < 0.0) - {model->BSIM4v6DunitLengthSidewallJctCap = 0.0; - fprintf(stderr, "CJSWD is negative. Cjswd is clamped to zero.\n");} - if (T0 >= -1.0) - { model->BSIM4v6SunitLengthSidewallTempJctCap = model->BSIM4v6SunitLengthSidewallJctCap *(1.0 + T0); - model->BSIM4v6DunitLengthSidewallTempJctCap = model->BSIM4v6DunitLengthSidewallJctCap *(1.0 + T0); - } - else - { if (model->BSIM4v6SunitLengthSidewallJctCap > 0.0) - { model->BSIM4v6SunitLengthSidewallTempJctCap = 0.0; - fprintf(stderr, "Temperature effect has caused cjsws to be negative. Cjsws is clamped to zero.\n"); - } - if (model->BSIM4v6DunitLengthSidewallJctCap > 0.0) - { model->BSIM4v6DunitLengthSidewallTempJctCap = 0.0; - fprintf(stderr, "Temperature effect has caused cjswd to be negative. Cjswd is clamped to zero.\n"); - } - } - T0 = model->BSIM4v6tcjswg * delTemp; - if (T0 >= -1.0) - { model->BSIM4v6SunitLengthGateSidewallTempJctCap = model->BSIM4v6SunitLengthGateSidewallJctCap *(1.0 + T0); - model->BSIM4v6DunitLengthGateSidewallTempJctCap = model->BSIM4v6DunitLengthGateSidewallJctCap *(1.0 + T0); - } - else - { if (model->BSIM4v6SunitLengthGateSidewallJctCap > 0.0) - { model->BSIM4v6SunitLengthGateSidewallTempJctCap = 0.0; - fprintf(stderr, "Temperature effect has caused cjswgs to be negative. Cjswgs is clamped to zero.\n"); - } - if (model->BSIM4v6DunitLengthGateSidewallJctCap > 0.0) - { model->BSIM4v6DunitLengthGateSidewallTempJctCap = 0.0; - fprintf(stderr, "Temperature effect has caused cjswgd to be negative. Cjswgd is clamped to zero.\n"); - } - } - - model->BSIM4v6PhiBS = model->BSIM4v6SbulkJctPotential - - model->BSIM4v6tpb * delTemp; - if (model->BSIM4v6PhiBS < 0.01) - { model->BSIM4v6PhiBS = 0.01; - fprintf(stderr, "Temperature effect has caused pbs to be less than 0.01. Pbs is clamped to 0.01.\n"); - } - model->BSIM4v6PhiBD = model->BSIM4v6DbulkJctPotential - - model->BSIM4v6tpb * delTemp; - if (model->BSIM4v6PhiBD < 0.01) - { model->BSIM4v6PhiBD = 0.01; - fprintf(stderr, "Temperature effect has caused pbd to be less than 0.01. Pbd is clamped to 0.01.\n"); - } - - model->BSIM4v6PhiBSWS = model->BSIM4v6SsidewallJctPotential - - model->BSIM4v6tpbsw * delTemp; - if (model->BSIM4v6PhiBSWS <= 0.01) - { model->BSIM4v6PhiBSWS = 0.01; - fprintf(stderr, "Temperature effect has caused pbsws to be less than 0.01. Pbsws is clamped to 0.01.\n"); - } - model->BSIM4v6PhiBSWD = model->BSIM4v6DsidewallJctPotential - - model->BSIM4v6tpbsw * delTemp; - if (model->BSIM4v6PhiBSWD <= 0.01) - { model->BSIM4v6PhiBSWD = 0.01; - fprintf(stderr, "Temperature effect has caused pbswd to be less than 0.01. Pbswd is clamped to 0.01.\n"); - } - - model->BSIM4v6PhiBSWGS = model->BSIM4v6SGatesidewallJctPotential - - model->BSIM4v6tpbswg * delTemp; - if (model->BSIM4v6PhiBSWGS <= 0.01) - { model->BSIM4v6PhiBSWGS = 0.01; - fprintf(stderr, "Temperature effect has caused pbswgs to be less than 0.01. Pbswgs is clamped to 0.01.\n"); - } - model->BSIM4v6PhiBSWGD = model->BSIM4v6DGatesidewallJctPotential - - model->BSIM4v6tpbswg * delTemp; - if (model->BSIM4v6PhiBSWGD <= 0.01) - { model->BSIM4v6PhiBSWGD = 0.01; - fprintf(stderr, "Temperature effect has caused pbswgd to be less than 0.01. Pbswgd is clamped to 0.01.\n"); - } /* End of junction capacitance */ - - - if (model->BSIM4v6ijthdfwd <= 0.0) - { model->BSIM4v6ijthdfwd = 0.0; - fprintf(stderr, "Ijthdfwd reset to %g.\n", model->BSIM4v6ijthdfwd); - } - if (model->BSIM4v6ijthsfwd <= 0.0) - { model->BSIM4v6ijthsfwd = 0.0; - fprintf(stderr, "Ijthsfwd reset to %g.\n", model->BSIM4v6ijthsfwd); - } - if (model->BSIM4v6ijthdrev <= 0.0) - { model->BSIM4v6ijthdrev = 0.0; - fprintf(stderr, "Ijthdrev reset to %g.\n", model->BSIM4v6ijthdrev); - } - if (model->BSIM4v6ijthsrev <= 0.0) - { model->BSIM4v6ijthsrev = 0.0; - fprintf(stderr, "Ijthsrev reset to %g.\n", model->BSIM4v6ijthsrev); - } - - if ((model->BSIM4v6xjbvd <= 0.0) && (model->BSIM4v6dioMod == 2)) - { model->BSIM4v6xjbvd = 0.0; - fprintf(stderr, "Xjbvd reset to %g.\n", model->BSIM4v6xjbvd); - } - else if ((model->BSIM4v6xjbvd < 0.0) && (model->BSIM4v6dioMod == 0)) - { model->BSIM4v6xjbvd = 0.0; - fprintf(stderr, "Xjbvd reset to %g.\n", model->BSIM4v6xjbvd); - } - - if (model->BSIM4v6bvd <= 0.0) /*4.6.2*/ - { model->BSIM4v6bvd = 0.0; - fprintf(stderr, "BVD reset to %g.\n", model->BSIM4v6bvd); - } - - if ((model->BSIM4v6xjbvs <= 0.0) && (model->BSIM4v6dioMod == 2)) - { model->BSIM4v6xjbvs = 0.0; - fprintf(stderr, "Xjbvs reset to %g.\n", model->BSIM4v6xjbvs); - } - else if ((model->BSIM4v6xjbvs < 0.0) && (model->BSIM4v6dioMod == 0)) - { model->BSIM4v6xjbvs = 0.0; - fprintf(stderr, "Xjbvs reset to %g.\n", model->BSIM4v6xjbvs); - } - - if (model->BSIM4v6bvs <= 0.0) - { model->BSIM4v6bvs = 0.0; - fprintf(stderr, "BVS reset to %g.\n", model->BSIM4v6bvs); - } - - - /* loop through all the instances of the model */ - for (here = BSIM4v6instances(model); here != NULL; - here = BSIM4v6nextInstance(here)) - { - pSizeDependParamKnot = model->pSizeDependParamKnot; - Size_Not_Found = 1; - while ((pSizeDependParamKnot != NULL) && Size_Not_Found) - { if ((here->BSIM4v6l == pSizeDependParamKnot->Length) - && (here->BSIM4v6w == pSizeDependParamKnot->Width) - && (here->BSIM4v6nf == pSizeDependParamKnot->NFinger)) - { Size_Not_Found = 0; - here->pParam = pSizeDependParamKnot; - pParam = here->pParam; /*bug-fix */ - } - else - { pLastKnot = pSizeDependParamKnot; - pSizeDependParamKnot = pSizeDependParamKnot->pNext; - } - } - - /* stress effect */ - Ldrn = here->BSIM4v6l; - Wdrn = here->BSIM4v6w / here->BSIM4v6nf; - - if (Size_Not_Found) - { pParam = TMALLOC(struct bsim4v6SizeDependParam, 1); - if (pLastKnot == NULL) - model->pSizeDependParamKnot = pParam; - else - pLastKnot->pNext = pParam; - pParam->pNext = NULL; - here->pParam = pParam; - - pParam->Length = here->BSIM4v6l; - pParam->Width = here->BSIM4v6w; - pParam->NFinger = here->BSIM4v6nf; - Lnew = here->BSIM4v6l + model->BSIM4v6xl ; - Wnew = here->BSIM4v6w / here->BSIM4v6nf + model->BSIM4v6xw; - - T0 = pow(Lnew, model->BSIM4v6Lln); - T1 = pow(Wnew, model->BSIM4v6Lwn); - tmp1 = model->BSIM4v6Ll / T0 + model->BSIM4v6Lw / T1 - + model->BSIM4v6Lwl / (T0 * T1); - pParam->BSIM4v6dl = model->BSIM4v6Lint + tmp1; - tmp2 = model->BSIM4v6Llc / T0 + model->BSIM4v6Lwc / T1 - + model->BSIM4v6Lwlc / (T0 * T1); - pParam->BSIM4v6dlc = model->BSIM4v6dlc + tmp2; - - T2 = pow(Lnew, model->BSIM4v6Wln); - T3 = pow(Wnew, model->BSIM4v6Wwn); - tmp1 = model->BSIM4v6Wl / T2 + model->BSIM4v6Ww / T3 - + model->BSIM4v6Wwl / (T2 * T3); - pParam->BSIM4v6dw = model->BSIM4v6Wint + tmp1; - tmp2 = model->BSIM4v6Wlc / T2 + model->BSIM4v6Wwc / T3 - + model->BSIM4v6Wwlc / (T2 * T3); - pParam->BSIM4v6dwc = model->BSIM4v6dwc + tmp2; - pParam->BSIM4v6dwj = model->BSIM4v6dwj + tmp2; - - pParam->BSIM4v6leff = Lnew - 2.0 * pParam->BSIM4v6dl; - if (pParam->BSIM4v6leff <= 0.0) - { - SPfrontEnd->IFerrorf (ERR_FATAL, - "BSIM4v6: mosfet %s, model %s: Effective channel length <= 0", - model->BSIM4v6modName, here->BSIM4v6name); - return(E_BADPARM); - } - - pParam->BSIM4v6weff = Wnew - 2.0 * pParam->BSIM4v6dw; - if (pParam->BSIM4v6weff <= 0.0) - { - SPfrontEnd->IFerrorf (ERR_FATAL, - "BSIM4v6: mosfet %s, model %s: Effective channel width <= 0", - model->BSIM4v6modName, here->BSIM4v6name); - return(E_BADPARM); - } - - pParam->BSIM4v6leffCV = Lnew - 2.0 * pParam->BSIM4v6dlc; - if (pParam->BSIM4v6leffCV <= 0.0) - { - SPfrontEnd->IFerrorf (ERR_FATAL, - "BSIM4v6: mosfet %s, model %s: Effective channel length for C-V <= 0", - model->BSIM4v6modName, here->BSIM4v6name); - return(E_BADPARM); - } - - pParam->BSIM4v6weffCV = Wnew - 2.0 * pParam->BSIM4v6dwc; - if (pParam->BSIM4v6weffCV <= 0.0) - { - SPfrontEnd->IFerrorf (ERR_FATAL, - "BSIM4v6: mosfet %s, model %s: Effective channel width for C-V <= 0", - model->BSIM4v6modName, here->BSIM4v6name); - return(E_BADPARM); - } - - pParam->BSIM4v6weffCJ = Wnew - 2.0 * pParam->BSIM4v6dwj; - if (pParam->BSIM4v6weffCJ <= 0.0) - { - SPfrontEnd->IFerrorf (ERR_FATAL, - "BSIM4v6: mosfet %s, model %s: Effective channel width for S/D junctions <= 0", - model->BSIM4v6modName, here->BSIM4v6name); - return(E_BADPARM); - } - - - if (model->BSIM4v6binUnit == 1) - { Inv_L = 1.0e-6 / pParam->BSIM4v6leff; - Inv_W = 1.0e-6 / pParam->BSIM4v6weff; - Inv_LW = 1.0e-12 / (pParam->BSIM4v6leff - * pParam->BSIM4v6weff); - } - else - { Inv_L = 1.0 / pParam->BSIM4v6leff; - Inv_W = 1.0 / pParam->BSIM4v6weff; - Inv_LW = 1.0 / (pParam->BSIM4v6leff - * pParam->BSIM4v6weff); - } - pParam->BSIM4v6cdsc = model->BSIM4v6cdsc - + model->BSIM4v6lcdsc * Inv_L - + model->BSIM4v6wcdsc * Inv_W - + model->BSIM4v6pcdsc * Inv_LW; - pParam->BSIM4v6cdscb = model->BSIM4v6cdscb - + model->BSIM4v6lcdscb * Inv_L - + model->BSIM4v6wcdscb * Inv_W - + model->BSIM4v6pcdscb * Inv_LW; - - pParam->BSIM4v6cdscd = model->BSIM4v6cdscd - + model->BSIM4v6lcdscd * Inv_L - + model->BSIM4v6wcdscd * Inv_W - + model->BSIM4v6pcdscd * Inv_LW; - - pParam->BSIM4v6cit = model->BSIM4v6cit - + model->BSIM4v6lcit * Inv_L - + model->BSIM4v6wcit * Inv_W - + model->BSIM4v6pcit * Inv_LW; - pParam->BSIM4v6nfactor = model->BSIM4v6nfactor - + model->BSIM4v6lnfactor * Inv_L - + model->BSIM4v6wnfactor * Inv_W - + model->BSIM4v6pnfactor * Inv_LW; - pParam->BSIM4v6xj = model->BSIM4v6xj - + model->BSIM4v6lxj * Inv_L - + model->BSIM4v6wxj * Inv_W - + model->BSIM4v6pxj * Inv_LW; - pParam->BSIM4v6vsat = model->BSIM4v6vsat - + model->BSIM4v6lvsat * Inv_L - + model->BSIM4v6wvsat * Inv_W - + model->BSIM4v6pvsat * Inv_LW; - pParam->BSIM4v6at = model->BSIM4v6at - + model->BSIM4v6lat * Inv_L - + model->BSIM4v6wat * Inv_W - + model->BSIM4v6pat * Inv_LW; - pParam->BSIM4v6a0 = model->BSIM4v6a0 - + model->BSIM4v6la0 * Inv_L - + model->BSIM4v6wa0 * Inv_W - + model->BSIM4v6pa0 * Inv_LW; - - pParam->BSIM4v6ags = model->BSIM4v6ags - + model->BSIM4v6lags * Inv_L - + model->BSIM4v6wags * Inv_W - + model->BSIM4v6pags * Inv_LW; - - pParam->BSIM4v6a1 = model->BSIM4v6a1 - + model->BSIM4v6la1 * Inv_L - + model->BSIM4v6wa1 * Inv_W - + model->BSIM4v6pa1 * Inv_LW; - pParam->BSIM4v6a2 = model->BSIM4v6a2 - + model->BSIM4v6la2 * Inv_L - + model->BSIM4v6wa2 * Inv_W - + model->BSIM4v6pa2 * Inv_LW; - pParam->BSIM4v6keta = model->BSIM4v6keta - + model->BSIM4v6lketa * Inv_L - + model->BSIM4v6wketa * Inv_W - + model->BSIM4v6pketa * Inv_LW; - pParam->BSIM4v6nsub = model->BSIM4v6nsub - + model->BSIM4v6lnsub * Inv_L - + model->BSIM4v6wnsub * Inv_W - + model->BSIM4v6pnsub * Inv_LW; - pParam->BSIM4v6ndep = model->BSIM4v6ndep - + model->BSIM4v6lndep * Inv_L - + model->BSIM4v6wndep * Inv_W - + model->BSIM4v6pndep * Inv_LW; - pParam->BSIM4v6nsd = model->BSIM4v6nsd - + model->BSIM4v6lnsd * Inv_L - + model->BSIM4v6wnsd * Inv_W - + model->BSIM4v6pnsd * Inv_LW; - pParam->BSIM4v6phin = model->BSIM4v6phin - + model->BSIM4v6lphin * Inv_L - + model->BSIM4v6wphin * Inv_W - + model->BSIM4v6pphin * Inv_LW; - pParam->BSIM4v6ngate = model->BSIM4v6ngate - + model->BSIM4v6lngate * Inv_L - + model->BSIM4v6wngate * Inv_W - + model->BSIM4v6pngate * Inv_LW; - pParam->BSIM4v6gamma1 = model->BSIM4v6gamma1 - + model->BSIM4v6lgamma1 * Inv_L - + model->BSIM4v6wgamma1 * Inv_W - + model->BSIM4v6pgamma1 * Inv_LW; - pParam->BSIM4v6gamma2 = model->BSIM4v6gamma2 - + model->BSIM4v6lgamma2 * Inv_L - + model->BSIM4v6wgamma2 * Inv_W - + model->BSIM4v6pgamma2 * Inv_LW; - pParam->BSIM4v6vbx = model->BSIM4v6vbx - + model->BSIM4v6lvbx * Inv_L - + model->BSIM4v6wvbx * Inv_W - + model->BSIM4v6pvbx * Inv_LW; - pParam->BSIM4v6vbm = model->BSIM4v6vbm - + model->BSIM4v6lvbm * Inv_L - + model->BSIM4v6wvbm * Inv_W - + model->BSIM4v6pvbm * Inv_LW; - pParam->BSIM4v6xt = model->BSIM4v6xt - + model->BSIM4v6lxt * Inv_L - + model->BSIM4v6wxt * Inv_W - + model->BSIM4v6pxt * Inv_LW; - pParam->BSIM4v6vfb = model->BSIM4v6vfb - + model->BSIM4v6lvfb * Inv_L - + model->BSIM4v6wvfb * Inv_W - + model->BSIM4v6pvfb * Inv_LW; - pParam->BSIM4v6k1 = model->BSIM4v6k1 - + model->BSIM4v6lk1 * Inv_L - + model->BSIM4v6wk1 * Inv_W - + model->BSIM4v6pk1 * Inv_LW; - pParam->BSIM4v6kt1 = model->BSIM4v6kt1 - + model->BSIM4v6lkt1 * Inv_L - + model->BSIM4v6wkt1 * Inv_W - + model->BSIM4v6pkt1 * Inv_LW; - pParam->BSIM4v6kt1l = model->BSIM4v6kt1l - + model->BSIM4v6lkt1l * Inv_L - + model->BSIM4v6wkt1l * Inv_W - + model->BSIM4v6pkt1l * Inv_LW; - pParam->BSIM4v6k2 = model->BSIM4v6k2 - + model->BSIM4v6lk2 * Inv_L - + model->BSIM4v6wk2 * Inv_W - + model->BSIM4v6pk2 * Inv_LW; - pParam->BSIM4v6kt2 = model->BSIM4v6kt2 - + model->BSIM4v6lkt2 * Inv_L - + model->BSIM4v6wkt2 * Inv_W - + model->BSIM4v6pkt2 * Inv_LW; - pParam->BSIM4v6k3 = model->BSIM4v6k3 - + model->BSIM4v6lk3 * Inv_L - + model->BSIM4v6wk3 * Inv_W - + model->BSIM4v6pk3 * Inv_LW; - pParam->BSIM4v6k3b = model->BSIM4v6k3b - + model->BSIM4v6lk3b * Inv_L - + model->BSIM4v6wk3b * Inv_W - + model->BSIM4v6pk3b * Inv_LW; - pParam->BSIM4v6w0 = model->BSIM4v6w0 - + model->BSIM4v6lw0 * Inv_L - + model->BSIM4v6ww0 * Inv_W - + model->BSIM4v6pw0 * Inv_LW; - pParam->BSIM4v6lpe0 = model->BSIM4v6lpe0 - + model->BSIM4v6llpe0 * Inv_L - + model->BSIM4v6wlpe0 * Inv_W - + model->BSIM4v6plpe0 * Inv_LW; - pParam->BSIM4v6lpeb = model->BSIM4v6lpeb - + model->BSIM4v6llpeb * Inv_L - + model->BSIM4v6wlpeb * Inv_W - + model->BSIM4v6plpeb * Inv_LW; - pParam->BSIM4v6dvtp0 = model->BSIM4v6dvtp0 - + model->BSIM4v6ldvtp0 * Inv_L - + model->BSIM4v6wdvtp0 * Inv_W - + model->BSIM4v6pdvtp0 * Inv_LW; - pParam->BSIM4v6dvtp1 = model->BSIM4v6dvtp1 - + model->BSIM4v6ldvtp1 * Inv_L - + model->BSIM4v6wdvtp1 * Inv_W - + model->BSIM4v6pdvtp1 * Inv_LW; - pParam->BSIM4v6dvt0 = model->BSIM4v6dvt0 - + model->BSIM4v6ldvt0 * Inv_L - + model->BSIM4v6wdvt0 * Inv_W - + model->BSIM4v6pdvt0 * Inv_LW; - pParam->BSIM4v6dvt1 = model->BSIM4v6dvt1 - + model->BSIM4v6ldvt1 * Inv_L - + model->BSIM4v6wdvt1 * Inv_W - + model->BSIM4v6pdvt1 * Inv_LW; - pParam->BSIM4v6dvt2 = model->BSIM4v6dvt2 - + model->BSIM4v6ldvt2 * Inv_L - + model->BSIM4v6wdvt2 * Inv_W - + model->BSIM4v6pdvt2 * Inv_LW; - pParam->BSIM4v6dvt0w = model->BSIM4v6dvt0w - + model->BSIM4v6ldvt0w * Inv_L - + model->BSIM4v6wdvt0w * Inv_W - + model->BSIM4v6pdvt0w * Inv_LW; - pParam->BSIM4v6dvt1w = model->BSIM4v6dvt1w - + model->BSIM4v6ldvt1w * Inv_L - + model->BSIM4v6wdvt1w * Inv_W - + model->BSIM4v6pdvt1w * Inv_LW; - pParam->BSIM4v6dvt2w = model->BSIM4v6dvt2w - + model->BSIM4v6ldvt2w * Inv_L - + model->BSIM4v6wdvt2w * Inv_W - + model->BSIM4v6pdvt2w * Inv_LW; - pParam->BSIM4v6drout = model->BSIM4v6drout - + model->BSIM4v6ldrout * Inv_L - + model->BSIM4v6wdrout * Inv_W - + model->BSIM4v6pdrout * Inv_LW; - pParam->BSIM4v6dsub = model->BSIM4v6dsub - + model->BSIM4v6ldsub * Inv_L - + model->BSIM4v6wdsub * Inv_W - + model->BSIM4v6pdsub * Inv_LW; - pParam->BSIM4v6vth0 = model->BSIM4v6vth0 - + model->BSIM4v6lvth0 * Inv_L - + model->BSIM4v6wvth0 * Inv_W - + model->BSIM4v6pvth0 * Inv_LW; - pParam->BSIM4v6ua = model->BSIM4v6ua - + model->BSIM4v6lua * Inv_L - + model->BSIM4v6wua * Inv_W - + model->BSIM4v6pua * Inv_LW; - pParam->BSIM4v6ua1 = model->BSIM4v6ua1 - + model->BSIM4v6lua1 * Inv_L - + model->BSIM4v6wua1 * Inv_W - + model->BSIM4v6pua1 * Inv_LW; - pParam->BSIM4v6ub = model->BSIM4v6ub - + model->BSIM4v6lub * Inv_L - + model->BSIM4v6wub * Inv_W - + model->BSIM4v6pub * Inv_LW; - pParam->BSIM4v6ub1 = model->BSIM4v6ub1 - + model->BSIM4v6lub1 * Inv_L - + model->BSIM4v6wub1 * Inv_W - + model->BSIM4v6pub1 * Inv_LW; - pParam->BSIM4v6uc = model->BSIM4v6uc - + model->BSIM4v6luc * Inv_L - + model->BSIM4v6wuc * Inv_W - + model->BSIM4v6puc * Inv_LW; - pParam->BSIM4v6uc1 = model->BSIM4v6uc1 - + model->BSIM4v6luc1 * Inv_L - + model->BSIM4v6wuc1 * Inv_W - + model->BSIM4v6puc1 * Inv_LW; - pParam->BSIM4v6ud = model->BSIM4v6ud - + model->BSIM4v6lud * Inv_L - + model->BSIM4v6wud * Inv_W - + model->BSIM4v6pud * Inv_LW; - pParam->BSIM4v6ud1 = model->BSIM4v6ud1 - + model->BSIM4v6lud1 * Inv_L - + model->BSIM4v6wud1 * Inv_W - + model->BSIM4v6pud1 * Inv_LW; - pParam->BSIM4v6up = model->BSIM4v6up - + model->BSIM4v6lup * Inv_L - + model->BSIM4v6wup * Inv_W - + model->BSIM4v6pup * Inv_LW; - pParam->BSIM4v6lp = model->BSIM4v6lp - + model->BSIM4v6llp * Inv_L - + model->BSIM4v6wlp * Inv_W - + model->BSIM4v6plp * Inv_LW; - pParam->BSIM4v6eu = model->BSIM4v6eu - + model->BSIM4v6leu * Inv_L - + model->BSIM4v6weu * Inv_W - + model->BSIM4v6peu * Inv_LW; - pParam->BSIM4v6u0 = model->BSIM4v6u0 - + model->BSIM4v6lu0 * Inv_L - + model->BSIM4v6wu0 * Inv_W - + model->BSIM4v6pu0 * Inv_LW; - pParam->BSIM4v6ute = model->BSIM4v6ute - + model->BSIM4v6lute * Inv_L - + model->BSIM4v6wute * Inv_W - + model->BSIM4v6pute * Inv_LW; - /*high k mobility*/ - pParam->BSIM4v6ucs = model->BSIM4v6ucs - + model->BSIM4v6lucs * Inv_L - + model->BSIM4v6wucs * Inv_W - + model->BSIM4v6pucs * Inv_LW; - pParam->BSIM4v6ucste = model->BSIM4v6ucste - + model->BSIM4v6lucste * Inv_L - + model->BSIM4v6wucste * Inv_W - + model->BSIM4v6pucste * Inv_LW; - - pParam->BSIM4v6voff = model->BSIM4v6voff - + model->BSIM4v6lvoff * Inv_L - + model->BSIM4v6wvoff * Inv_W - + model->BSIM4v6pvoff * Inv_LW; - pParam->BSIM4v6tvoff = model->BSIM4v6tvoff - + model->BSIM4v6ltvoff * Inv_L - + model->BSIM4v6wtvoff * Inv_W - + model->BSIM4v6ptvoff * Inv_LW; - pParam->BSIM4v6minv = model->BSIM4v6minv - + model->BSIM4v6lminv * Inv_L - + model->BSIM4v6wminv * Inv_W - + model->BSIM4v6pminv * Inv_LW; - pParam->BSIM4v6minvcv = model->BSIM4v6minvcv - + model->BSIM4v6lminvcv * Inv_L - + model->BSIM4v6wminvcv * Inv_W - + model->BSIM4v6pminvcv * Inv_LW; - pParam->BSIM4v6fprout = model->BSIM4v6fprout - + model->BSIM4v6lfprout * Inv_L - + model->BSIM4v6wfprout * Inv_W - + model->BSIM4v6pfprout * Inv_LW; - pParam->BSIM4v6pdits = model->BSIM4v6pdits - + model->BSIM4v6lpdits * Inv_L - + model->BSIM4v6wpdits * Inv_W - + model->BSIM4v6ppdits * Inv_LW; - pParam->BSIM4v6pditsd = model->BSIM4v6pditsd - + model->BSIM4v6lpditsd * Inv_L - + model->BSIM4v6wpditsd * Inv_W - + model->BSIM4v6ppditsd * Inv_LW; - pParam->BSIM4v6delta = model->BSIM4v6delta - + model->BSIM4v6ldelta * Inv_L - + model->BSIM4v6wdelta * Inv_W - + model->BSIM4v6pdelta * Inv_LW; - pParam->BSIM4v6rdsw = model->BSIM4v6rdsw - + model->BSIM4v6lrdsw * Inv_L - + model->BSIM4v6wrdsw * Inv_W - + model->BSIM4v6prdsw * Inv_LW; - pParam->BSIM4v6rdw = model->BSIM4v6rdw - + model->BSIM4v6lrdw * Inv_L - + model->BSIM4v6wrdw * Inv_W - + model->BSIM4v6prdw * Inv_LW; - pParam->BSIM4v6rsw = model->BSIM4v6rsw - + model->BSIM4v6lrsw * Inv_L - + model->BSIM4v6wrsw * Inv_W - + model->BSIM4v6prsw * Inv_LW; - pParam->BSIM4v6prwg = model->BSIM4v6prwg - + model->BSIM4v6lprwg * Inv_L - + model->BSIM4v6wprwg * Inv_W - + model->BSIM4v6pprwg * Inv_LW; - pParam->BSIM4v6prwb = model->BSIM4v6prwb - + model->BSIM4v6lprwb * Inv_L - + model->BSIM4v6wprwb * Inv_W - + model->BSIM4v6pprwb * Inv_LW; - pParam->BSIM4v6prt = model->BSIM4v6prt - + model->BSIM4v6lprt * Inv_L - + model->BSIM4v6wprt * Inv_W - + model->BSIM4v6pprt * Inv_LW; - pParam->BSIM4v6eta0 = model->BSIM4v6eta0 - + model->BSIM4v6leta0 * Inv_L - + model->BSIM4v6weta0 * Inv_W - + model->BSIM4v6peta0 * Inv_LW; - pParam->BSIM4v6etab = model->BSIM4v6etab - + model->BSIM4v6letab * Inv_L - + model->BSIM4v6wetab * Inv_W - + model->BSIM4v6petab * Inv_LW; - pParam->BSIM4v6pclm = model->BSIM4v6pclm - + model->BSIM4v6lpclm * Inv_L - + model->BSIM4v6wpclm * Inv_W - + model->BSIM4v6ppclm * Inv_LW; - pParam->BSIM4v6pdibl1 = model->BSIM4v6pdibl1 - + model->BSIM4v6lpdibl1 * Inv_L - + model->BSIM4v6wpdibl1 * Inv_W - + model->BSIM4v6ppdibl1 * Inv_LW; - pParam->BSIM4v6pdibl2 = model->BSIM4v6pdibl2 - + model->BSIM4v6lpdibl2 * Inv_L - + model->BSIM4v6wpdibl2 * Inv_W - + model->BSIM4v6ppdibl2 * Inv_LW; - pParam->BSIM4v6pdiblb = model->BSIM4v6pdiblb - + model->BSIM4v6lpdiblb * Inv_L - + model->BSIM4v6wpdiblb * Inv_W - + model->BSIM4v6ppdiblb * Inv_LW; - pParam->BSIM4v6pscbe1 = model->BSIM4v6pscbe1 - + model->BSIM4v6lpscbe1 * Inv_L - + model->BSIM4v6wpscbe1 * Inv_W - + model->BSIM4v6ppscbe1 * Inv_LW; - pParam->BSIM4v6pscbe2 = model->BSIM4v6pscbe2 - + model->BSIM4v6lpscbe2 * Inv_L - + model->BSIM4v6wpscbe2 * Inv_W - + model->BSIM4v6ppscbe2 * Inv_LW; - pParam->BSIM4v6pvag = model->BSIM4v6pvag - + model->BSIM4v6lpvag * Inv_L - + model->BSIM4v6wpvag * Inv_W - + model->BSIM4v6ppvag * Inv_LW; - pParam->BSIM4v6wr = model->BSIM4v6wr - + model->BSIM4v6lwr * Inv_L - + model->BSIM4v6wwr * Inv_W - + model->BSIM4v6pwr * Inv_LW; - pParam->BSIM4v6dwg = model->BSIM4v6dwg - + model->BSIM4v6ldwg * Inv_L - + model->BSIM4v6wdwg * Inv_W - + model->BSIM4v6pdwg * Inv_LW; - pParam->BSIM4v6dwb = model->BSIM4v6dwb - + model->BSIM4v6ldwb * Inv_L - + model->BSIM4v6wdwb * Inv_W - + model->BSIM4v6pdwb * Inv_LW; - pParam->BSIM4v6b0 = model->BSIM4v6b0 - + model->BSIM4v6lb0 * Inv_L - + model->BSIM4v6wb0 * Inv_W - + model->BSIM4v6pb0 * Inv_LW; - pParam->BSIM4v6b1 = model->BSIM4v6b1 - + model->BSIM4v6lb1 * Inv_L - + model->BSIM4v6wb1 * Inv_W - + model->BSIM4v6pb1 * Inv_LW; - pParam->BSIM4v6alpha0 = model->BSIM4v6alpha0 - + model->BSIM4v6lalpha0 * Inv_L - + model->BSIM4v6walpha0 * Inv_W - + model->BSIM4v6palpha0 * Inv_LW; - pParam->BSIM4v6alpha1 = model->BSIM4v6alpha1 - + model->BSIM4v6lalpha1 * Inv_L - + model->BSIM4v6walpha1 * Inv_W - + model->BSIM4v6palpha1 * Inv_LW; - pParam->BSIM4v6beta0 = model->BSIM4v6beta0 - + model->BSIM4v6lbeta0 * Inv_L - + model->BSIM4v6wbeta0 * Inv_W - + model->BSIM4v6pbeta0 * Inv_LW; - pParam->BSIM4v6agidl = model->BSIM4v6agidl - + model->BSIM4v6lagidl * Inv_L - + model->BSIM4v6wagidl * Inv_W - + model->BSIM4v6pagidl * Inv_LW; - pParam->BSIM4v6bgidl = model->BSIM4v6bgidl - + model->BSIM4v6lbgidl * Inv_L - + model->BSIM4v6wbgidl * Inv_W - + model->BSIM4v6pbgidl * Inv_LW; - pParam->BSIM4v6cgidl = model->BSIM4v6cgidl - + model->BSIM4v6lcgidl * Inv_L - + model->BSIM4v6wcgidl * Inv_W - + model->BSIM4v6pcgidl * Inv_LW; - pParam->BSIM4v6egidl = model->BSIM4v6egidl - + model->BSIM4v6legidl * Inv_L - + model->BSIM4v6wegidl * Inv_W - + model->BSIM4v6pegidl * Inv_LW; - pParam->BSIM4v6agisl = model->BSIM4v6agisl - + model->BSIM4v6lagisl * Inv_L - + model->BSIM4v6wagisl * Inv_W - + model->BSIM4v6pagisl * Inv_LW; - pParam->BSIM4v6bgisl = model->BSIM4v6bgisl - + model->BSIM4v6lbgisl * Inv_L - + model->BSIM4v6wbgisl * Inv_W - + model->BSIM4v6pbgisl * Inv_LW; - pParam->BSIM4v6cgisl = model->BSIM4v6cgisl - + model->BSIM4v6lcgisl * Inv_L - + model->BSIM4v6wcgisl * Inv_W - + model->BSIM4v6pcgisl * Inv_LW; - pParam->BSIM4v6egisl = model->BSIM4v6egisl - + model->BSIM4v6legisl * Inv_L - + model->BSIM4v6wegisl * Inv_W - + model->BSIM4v6pegisl * Inv_LW; - pParam->BSIM4v6aigc = model->BSIM4v6aigc - + model->BSIM4v6laigc * Inv_L - + model->BSIM4v6waigc * Inv_W - + model->BSIM4v6paigc * Inv_LW; - pParam->BSIM4v6bigc = model->BSIM4v6bigc - + model->BSIM4v6lbigc * Inv_L - + model->BSIM4v6wbigc * Inv_W - + model->BSIM4v6pbigc * Inv_LW; - pParam->BSIM4v6cigc = model->BSIM4v6cigc - + model->BSIM4v6lcigc * Inv_L - + model->BSIM4v6wcigc * Inv_W - + model->BSIM4v6pcigc * Inv_LW; - pParam->BSIM4v6aigs = model->BSIM4v6aigs - + model->BSIM4v6laigs * Inv_L - + model->BSIM4v6waigs * Inv_W - + model->BSIM4v6paigs * Inv_LW; - pParam->BSIM4v6bigs = model->BSIM4v6bigs - + model->BSIM4v6lbigs * Inv_L - + model->BSIM4v6wbigs * Inv_W - + model->BSIM4v6pbigs * Inv_LW; - pParam->BSIM4v6cigs = model->BSIM4v6cigs - + model->BSIM4v6lcigs * Inv_L - + model->BSIM4v6wcigs * Inv_W - + model->BSIM4v6pcigs * Inv_LW; - pParam->BSIM4v6aigd = model->BSIM4v6aigd - + model->BSIM4v6laigd * Inv_L - + model->BSIM4v6waigd * Inv_W - + model->BSIM4v6paigd * Inv_LW; - pParam->BSIM4v6bigd = model->BSIM4v6bigd - + model->BSIM4v6lbigd * Inv_L - + model->BSIM4v6wbigd * Inv_W - + model->BSIM4v6pbigd * Inv_LW; - pParam->BSIM4v6cigd = model->BSIM4v6cigd - + model->BSIM4v6lcigd * Inv_L - + model->BSIM4v6wcigd * Inv_W - + model->BSIM4v6pcigd * Inv_LW; - pParam->BSIM4v6aigbacc = model->BSIM4v6aigbacc - + model->BSIM4v6laigbacc * Inv_L - + model->BSIM4v6waigbacc * Inv_W - + model->BSIM4v6paigbacc * Inv_LW; - pParam->BSIM4v6bigbacc = model->BSIM4v6bigbacc - + model->BSIM4v6lbigbacc * Inv_L - + model->BSIM4v6wbigbacc * Inv_W - + model->BSIM4v6pbigbacc * Inv_LW; - pParam->BSIM4v6cigbacc = model->BSIM4v6cigbacc - + model->BSIM4v6lcigbacc * Inv_L - + model->BSIM4v6wcigbacc * Inv_W - + model->BSIM4v6pcigbacc * Inv_LW; - pParam->BSIM4v6aigbinv = model->BSIM4v6aigbinv - + model->BSIM4v6laigbinv * Inv_L - + model->BSIM4v6waigbinv * Inv_W - + model->BSIM4v6paigbinv * Inv_LW; - pParam->BSIM4v6bigbinv = model->BSIM4v6bigbinv - + model->BSIM4v6lbigbinv * Inv_L - + model->BSIM4v6wbigbinv * Inv_W - + model->BSIM4v6pbigbinv * Inv_LW; - pParam->BSIM4v6cigbinv = model->BSIM4v6cigbinv - + model->BSIM4v6lcigbinv * Inv_L - + model->BSIM4v6wcigbinv * Inv_W - + model->BSIM4v6pcigbinv * Inv_LW; - pParam->BSIM4v6nigc = model->BSIM4v6nigc - + model->BSIM4v6lnigc * Inv_L - + model->BSIM4v6wnigc * Inv_W - + model->BSIM4v6pnigc * Inv_LW; - pParam->BSIM4v6nigbacc = model->BSIM4v6nigbacc - + model->BSIM4v6lnigbacc * Inv_L - + model->BSIM4v6wnigbacc * Inv_W - + model->BSIM4v6pnigbacc * Inv_LW; - pParam->BSIM4v6nigbinv = model->BSIM4v6nigbinv - + model->BSIM4v6lnigbinv * Inv_L - + model->BSIM4v6wnigbinv * Inv_W - + model->BSIM4v6pnigbinv * Inv_LW; - pParam->BSIM4v6ntox = model->BSIM4v6ntox - + model->BSIM4v6lntox * Inv_L - + model->BSIM4v6wntox * Inv_W - + model->BSIM4v6pntox * Inv_LW; - pParam->BSIM4v6eigbinv = model->BSIM4v6eigbinv - + model->BSIM4v6leigbinv * Inv_L - + model->BSIM4v6weigbinv * Inv_W - + model->BSIM4v6peigbinv * Inv_LW; - pParam->BSIM4v6pigcd = model->BSIM4v6pigcd - + model->BSIM4v6lpigcd * Inv_L - + model->BSIM4v6wpigcd * Inv_W - + model->BSIM4v6ppigcd * Inv_LW; - pParam->BSIM4v6poxedge = model->BSIM4v6poxedge - + model->BSIM4v6lpoxedge * Inv_L - + model->BSIM4v6wpoxedge * Inv_W - + model->BSIM4v6ppoxedge * Inv_LW; - pParam->BSIM4v6xrcrg1 = model->BSIM4v6xrcrg1 - + model->BSIM4v6lxrcrg1 * Inv_L - + model->BSIM4v6wxrcrg1 * Inv_W - + model->BSIM4v6pxrcrg1 * Inv_LW; - pParam->BSIM4v6xrcrg2 = model->BSIM4v6xrcrg2 - + model->BSIM4v6lxrcrg2 * Inv_L - + model->BSIM4v6wxrcrg2 * Inv_W - + model->BSIM4v6pxrcrg2 * Inv_LW; - pParam->BSIM4v6lambda = model->BSIM4v6lambda - + model->BSIM4v6llambda * Inv_L - + model->BSIM4v6wlambda * Inv_W - + model->BSIM4v6plambda * Inv_LW; - pParam->BSIM4v6vtl = model->BSIM4v6vtl - + model->BSIM4v6lvtl * Inv_L - + model->BSIM4v6wvtl * Inv_W - + model->BSIM4v6pvtl * Inv_LW; - pParam->BSIM4v6xn = model->BSIM4v6xn - + model->BSIM4v6lxn * Inv_L - + model->BSIM4v6wxn * Inv_W - + model->BSIM4v6pxn * Inv_LW; - pParam->BSIM4v6vfbsdoff = model->BSIM4v6vfbsdoff - + model->BSIM4v6lvfbsdoff * Inv_L - + model->BSIM4v6wvfbsdoff * Inv_W - + model->BSIM4v6pvfbsdoff * Inv_LW; - pParam->BSIM4v6tvfbsdoff = model->BSIM4v6tvfbsdoff - + model->BSIM4v6ltvfbsdoff * Inv_L - + model->BSIM4v6wtvfbsdoff * Inv_W - + model->BSIM4v6ptvfbsdoff * Inv_LW; - - pParam->BSIM4v6cgsl = model->BSIM4v6cgsl - + model->BSIM4v6lcgsl * Inv_L - + model->BSIM4v6wcgsl * Inv_W - + model->BSIM4v6pcgsl * Inv_LW; - pParam->BSIM4v6cgdl = model->BSIM4v6cgdl - + model->BSIM4v6lcgdl * Inv_L - + model->BSIM4v6wcgdl * Inv_W - + model->BSIM4v6pcgdl * Inv_LW; - pParam->BSIM4v6ckappas = model->BSIM4v6ckappas - + model->BSIM4v6lckappas * Inv_L - + model->BSIM4v6wckappas * Inv_W - + model->BSIM4v6pckappas * Inv_LW; - pParam->BSIM4v6ckappad = model->BSIM4v6ckappad - + model->BSIM4v6lckappad * Inv_L - + model->BSIM4v6wckappad * Inv_W - + model->BSIM4v6pckappad * Inv_LW; - pParam->BSIM4v6cf = model->BSIM4v6cf - + model->BSIM4v6lcf * Inv_L - + model->BSIM4v6wcf * Inv_W - + model->BSIM4v6pcf * Inv_LW; - pParam->BSIM4v6clc = model->BSIM4v6clc - + model->BSIM4v6lclc * Inv_L - + model->BSIM4v6wclc * Inv_W - + model->BSIM4v6pclc * Inv_LW; - pParam->BSIM4v6cle = model->BSIM4v6cle - + model->BSIM4v6lcle * Inv_L - + model->BSIM4v6wcle * Inv_W - + model->BSIM4v6pcle * Inv_LW; - pParam->BSIM4v6vfbcv = model->BSIM4v6vfbcv - + model->BSIM4v6lvfbcv * Inv_L - + model->BSIM4v6wvfbcv * Inv_W - + model->BSIM4v6pvfbcv * Inv_LW; - pParam->BSIM4v6acde = model->BSIM4v6acde - + model->BSIM4v6lacde * Inv_L - + model->BSIM4v6wacde * Inv_W - + model->BSIM4v6pacde * Inv_LW; - pParam->BSIM4v6moin = model->BSIM4v6moin - + model->BSIM4v6lmoin * Inv_L - + model->BSIM4v6wmoin * Inv_W - + model->BSIM4v6pmoin * Inv_LW; - pParam->BSIM4v6noff = model->BSIM4v6noff - + model->BSIM4v6lnoff * Inv_L - + model->BSIM4v6wnoff * Inv_W - + model->BSIM4v6pnoff * Inv_LW; - pParam->BSIM4v6voffcv = model->BSIM4v6voffcv - + model->BSIM4v6lvoffcv * Inv_L - + model->BSIM4v6wvoffcv * Inv_W - + model->BSIM4v6pvoffcv * Inv_LW; - pParam->BSIM4v6kvth0we = model->BSIM4v6kvth0we - + model->BSIM4v6lkvth0we * Inv_L - + model->BSIM4v6wkvth0we * Inv_W - + model->BSIM4v6pkvth0we * Inv_LW; - pParam->BSIM4v6k2we = model->BSIM4v6k2we - + model->BSIM4v6lk2we * Inv_L - + model->BSIM4v6wk2we * Inv_W - + model->BSIM4v6pk2we * Inv_LW; - pParam->BSIM4v6ku0we = model->BSIM4v6ku0we - + model->BSIM4v6lku0we * Inv_L - + model->BSIM4v6wku0we * Inv_W - + model->BSIM4v6pku0we * Inv_LW; - - pParam->BSIM4v6abulkCVfactor = 1.0 + pow((pParam->BSIM4v6clc - / pParam->BSIM4v6leffCV), - pParam->BSIM4v6cle); - - T0 = (TRatio - 1.0); - - PowWeffWr = pow(pParam->BSIM4v6weffCJ * 1.0e6, pParam->BSIM4v6wr) * here->BSIM4v6nf; - - T1 = T2 = T3 = T4 = 0.0; - pParam->BSIM4v6ucs = pParam->BSIM4v6ucs * pow(TRatio, pParam->BSIM4v6ucste); - if(model->BSIM4v6tempMod == 0) { - pParam->BSIM4v6ua = pParam->BSIM4v6ua + pParam->BSIM4v6ua1 * T0; - pParam->BSIM4v6ub = pParam->BSIM4v6ub + pParam->BSIM4v6ub1 * T0; - pParam->BSIM4v6uc = pParam->BSIM4v6uc + pParam->BSIM4v6uc1 * T0; - pParam->BSIM4v6ud = pParam->BSIM4v6ud + pParam->BSIM4v6ud1 * T0; - pParam->BSIM4v6vsattemp = pParam->BSIM4v6vsat - pParam->BSIM4v6at * T0; - T10 = pParam->BSIM4v6prt * T0; - if(model->BSIM4v6rdsMod) { - /* External Rd(V) */ - T1 = pParam->BSIM4v6rdw + T10; - T2 = model->BSIM4v6rdwmin + T10; - /* External Rs(V) */ - T3 = pParam->BSIM4v6rsw + T10; - T4 = model->BSIM4v6rswmin + T10; - } - /* Internal Rds(V) in IV */ - pParam->BSIM4v6rds0 = (pParam->BSIM4v6rdsw + T10) - * here->BSIM4v6nf / PowWeffWr; - pParam->BSIM4v6rdswmin = (model->BSIM4v6rdswmin + T10) - * here->BSIM4v6nf / PowWeffWr; - } else { - if (model->BSIM4v6tempMod == 3) - {pParam->BSIM4v6ua = pParam->BSIM4v6ua * pow(TRatio, pParam->BSIM4v6ua1) ; - pParam->BSIM4v6ub = pParam->BSIM4v6ub * pow(TRatio, pParam->BSIM4v6ub1); - pParam->BSIM4v6uc = pParam->BSIM4v6uc * pow(TRatio, pParam->BSIM4v6uc1); - pParam->BSIM4v6ud = pParam->BSIM4v6ud * pow(TRatio, pParam->BSIM4v6ud1); - } - else{ /* tempMod = 1, 2 */ - pParam->BSIM4v6ua = pParam->BSIM4v6ua * (1.0 + pParam->BSIM4v6ua1 * delTemp) ; - pParam->BSIM4v6ub = pParam->BSIM4v6ub * (1.0 + pParam->BSIM4v6ub1 * delTemp); - pParam->BSIM4v6uc = pParam->BSIM4v6uc * (1.0 + pParam->BSIM4v6uc1 * delTemp); - pParam->BSIM4v6ud = pParam->BSIM4v6ud * (1.0 + pParam->BSIM4v6ud1 * delTemp); - } - pParam->BSIM4v6vsattemp = pParam->BSIM4v6vsat * (1.0 - pParam->BSIM4v6at * delTemp); - T10 = 1.0 + pParam->BSIM4v6prt * delTemp; - if(model->BSIM4v6rdsMod) { - /* External Rd(V) */ - T1 = pParam->BSIM4v6rdw * T10; - T2 = model->BSIM4v6rdwmin * T10; - /* External Rs(V) */ - T3 = pParam->BSIM4v6rsw * T10; - T4 = model->BSIM4v6rswmin * T10; - } - /* Internal Rds(V) in IV */ - pParam->BSIM4v6rds0 = pParam->BSIM4v6rdsw * T10 * here->BSIM4v6nf / PowWeffWr; - pParam->BSIM4v6rdswmin = model->BSIM4v6rdswmin * T10 * here->BSIM4v6nf / PowWeffWr; - } - if (T1 < 0.0) - { T1 = 0.0; - printf("Warning: Rdw at current temperature is negative; set to 0.\n"); - } - if (T2 < 0.0) - { T2 = 0.0; - printf("Warning: Rdwmin at current temperature is negative; set to 0.\n"); - } - pParam->BSIM4v6rd0 = T1 / PowWeffWr; - pParam->BSIM4v6rdwmin = T2 / PowWeffWr; - if (T3 < 0.0) - { T3 = 0.0; - printf("Warning: Rsw at current temperature is negative; set to 0.\n"); - } - if (T4 < 0.0) - { T4 = 0.0; - printf("Warning: Rswmin at current temperature is negative; set to 0.\n"); - } - pParam->BSIM4v6rs0 = T3 / PowWeffWr; - pParam->BSIM4v6rswmin = T4 / PowWeffWr; - - if (pParam->BSIM4v6u0 > 1.0) - pParam->BSIM4v6u0 = pParam->BSIM4v6u0 / 1.0e4; - - /* mobility channel length dependence */ - T5 = 1.0 - pParam->BSIM4v6up * exp( - pParam->BSIM4v6leff / pParam->BSIM4v6lp); - pParam->BSIM4v6u0temp = pParam->BSIM4v6u0 * T5 - * pow(TRatio, pParam->BSIM4v6ute); - if (pParam->BSIM4v6eu < 0.0) - { pParam->BSIM4v6eu = 0.0; - printf("Warning: eu has been negative; reset to 0.0.\n"); - } - if (pParam->BSIM4v6ucs < 0.0) - { pParam->BSIM4v6ucs = 0.0; - printf("Warning: ucs has been negative; reset to 0.0.\n"); - } - - pParam->BSIM4v6vfbsdoff = pParam->BSIM4v6vfbsdoff * (1.0 + pParam->BSIM4v6tvfbsdoff * delTemp); - pParam->BSIM4v6voff = pParam->BSIM4v6voff * (1.0 + pParam->BSIM4v6tvoff * delTemp); - - /* Source End Velocity Limit */ - if((model->BSIM4v6vtlGiven) && (model->BSIM4v6vtl > 0.0) ) - { - if(model->BSIM4v6lc < 0.0) pParam->BSIM4v6lc = 0.0; - else pParam->BSIM4v6lc = model->BSIM4v6lc ; - T0 = pParam->BSIM4v6leff / (pParam->BSIM4v6xn * pParam->BSIM4v6leff + pParam->BSIM4v6lc); - pParam->BSIM4v6tfactor = (1.0 - T0) / (1.0 + T0 ); - } - - pParam->BSIM4v6cgdo = (model->BSIM4v6cgdo + pParam->BSIM4v6cf) - * pParam->BSIM4v6weffCV; - pParam->BSIM4v6cgso = (model->BSIM4v6cgso + pParam->BSIM4v6cf) - * pParam->BSIM4v6weffCV; - pParam->BSIM4v6cgbo = model->BSIM4v6cgbo * pParam->BSIM4v6leffCV * here->BSIM4v6nf; - - if (!model->BSIM4v6ndepGiven && model->BSIM4v6gamma1Given) - { T0 = pParam->BSIM4v6gamma1 * model->BSIM4v6coxe; - pParam->BSIM4v6ndep = 3.01248e22 * T0 * T0; - } - - pParam->BSIM4v6phi = Vtm0 * log(pParam->BSIM4v6ndep / ni) - + pParam->BSIM4v6phin + 0.4; - - pParam->BSIM4v6sqrtPhi = sqrt(pParam->BSIM4v6phi); - pParam->BSIM4v6phis3 = pParam->BSIM4v6sqrtPhi * pParam->BSIM4v6phi; - - pParam->BSIM4v6Xdep0 = sqrt(2.0 * epssub / (Charge_q - * pParam->BSIM4v6ndep * 1.0e6)) - * pParam->BSIM4v6sqrtPhi; - pParam->BSIM4v6sqrtXdep0 = sqrt(pParam->BSIM4v6Xdep0); - - if(model->BSIM4v6mtrlMod == 0) - pParam->BSIM4v6litl = sqrt(3.0 * 3.9 / epsrox * pParam->BSIM4v6xj * toxe); - else - pParam->BSIM4v6litl = sqrt(model->BSIM4v6epsrsub/epsrox * pParam->BSIM4v6xj * toxe); - - pParam->BSIM4v6vbi = Vtm0 * log(pParam->BSIM4v6nsd - * pParam->BSIM4v6ndep / (ni * ni)); - - if (model->BSIM4v6mtrlMod == 0) - { - if (pParam->BSIM4v6ngate > 0.0) - { pParam->BSIM4v6vfbsd = Vtm0 * log(pParam->BSIM4v6ngate - / pParam->BSIM4v6nsd); - } - else - pParam->BSIM4v6vfbsd = 0.0; - } - else - { - T0 = Vtm0 * log(pParam->BSIM4v6nsd/ni); - T1 = 0.5 * Eg0; - if(T0 > T1) - T0 = T1; - T2 = model->BSIM4v6easub + T1 - model->BSIM4v6type * T0; - pParam->BSIM4v6vfbsd = model->BSIM4v6phig - T2; - } - - pParam->BSIM4v6cdep0 = sqrt(Charge_q * epssub - * pParam->BSIM4v6ndep * 1.0e6 / 2.0 - / pParam->BSIM4v6phi); - - pParam->BSIM4v6ToxRatio = exp(pParam->BSIM4v6ntox - * log(model->BSIM4v6toxref / toxe)) - / toxe / toxe; - pParam->BSIM4v6ToxRatioEdge = exp(pParam->BSIM4v6ntox - * log(model->BSIM4v6toxref - / (toxe * pParam->BSIM4v6poxedge))) - / toxe / toxe - / pParam->BSIM4v6poxedge / pParam->BSIM4v6poxedge; - pParam->BSIM4v6Aechvb = (model->BSIM4v6type == NMOS) ? 4.97232e-7 : 3.42537e-7; - pParam->BSIM4v6Bechvb = (model->BSIM4v6type == NMOS) ? 7.45669e11 : 1.16645e12; - pParam->BSIM4v6AechvbEdgeS = pParam->BSIM4v6Aechvb * pParam->BSIM4v6weff - * model->BSIM4v6dlcig * pParam->BSIM4v6ToxRatioEdge; - pParam->BSIM4v6AechvbEdgeD = pParam->BSIM4v6Aechvb * pParam->BSIM4v6weff - * model->BSIM4v6dlcigd * pParam->BSIM4v6ToxRatioEdge; - pParam->BSIM4v6BechvbEdge = -pParam->BSIM4v6Bechvb - * toxe * pParam->BSIM4v6poxedge; - pParam->BSIM4v6Aechvb *= pParam->BSIM4v6weff * pParam->BSIM4v6leff - * pParam->BSIM4v6ToxRatio; - pParam->BSIM4v6Bechvb *= -toxe; - - - pParam->BSIM4v6mstar = 0.5 + atan(pParam->BSIM4v6minv) / PI; - pParam->BSIM4v6mstarcv = 0.5 + atan(pParam->BSIM4v6minvcv) / PI; - pParam->BSIM4v6voffcbn = pParam->BSIM4v6voff + model->BSIM4v6voffl / pParam->BSIM4v6leff; - pParam->BSIM4v6voffcbncv = pParam->BSIM4v6voffcv + model->BSIM4v6voffcvl / pParam->BSIM4v6leff; - - pParam->BSIM4v6ldeb = sqrt(epssub * Vtm0 / (Charge_q - * pParam->BSIM4v6ndep * 1.0e6)) / 3.0; - pParam->BSIM4v6acde *= pow((pParam->BSIM4v6ndep / 2.0e16), -0.25); - - - if (model->BSIM4v6k1Given || model->BSIM4v6k2Given) - { if (!model->BSIM4v6k1Given) - { - if ((!ckt->CKTcurJob) || (ckt->CKTcurJob->JOBtype < 9)) /* don't print in sensitivity */ - fprintf(stdout, "Warning: k1 should be specified with k2.\n"); - pParam->BSIM4v6k1 = 0.53; - } - if (!model->BSIM4v6k2Given) - { - if ((!ckt->CKTcurJob) || (ckt->CKTcurJob->JOBtype < 9)) /* don't print in sensitivity */ - fprintf(stdout, "Warning: k2 should be specified with k1.\n"); - pParam->BSIM4v6k2 = -0.0186; - } - if ((!ckt->CKTcurJob) || (ckt->CKTcurJob->JOBtype < 9)) { /* don't print in sensitivity */ - if (model->BSIM4v6nsubGiven) - fprintf(stdout, "Warning: nsub is ignored because k1 or k2 is given.\n"); - if (model->BSIM4v6xtGiven) - fprintf(stdout, "Warning: xt is ignored because k1 or k2 is given.\n"); - if (model->BSIM4v6vbxGiven) - fprintf(stdout, "Warning: vbx is ignored because k1 or k2 is given.\n"); - if (model->BSIM4v6gamma1Given) - fprintf(stdout, "Warning: gamma1 is ignored because k1 or k2 is given.\n"); - if (model->BSIM4v6gamma2Given) - fprintf(stdout, "Warning: gamma2 is ignored because k1 or k2 is given.\n"); - } - } - else - { if (!model->BSIM4v6vbxGiven) - pParam->BSIM4v6vbx = pParam->BSIM4v6phi - 7.7348e-4 - * pParam->BSIM4v6ndep - * pParam->BSIM4v6xt * pParam->BSIM4v6xt; - if (pParam->BSIM4v6vbx > 0.0) - pParam->BSIM4v6vbx = -pParam->BSIM4v6vbx; - if (pParam->BSIM4v6vbm > 0.0) - pParam->BSIM4v6vbm = -pParam->BSIM4v6vbm; - - if (!model->BSIM4v6gamma1Given) - pParam->BSIM4v6gamma1 = 5.753e-12 - * sqrt(pParam->BSIM4v6ndep) - / model->BSIM4v6coxe; - if (!model->BSIM4v6gamma2Given) - pParam->BSIM4v6gamma2 = 5.753e-12 - * sqrt(pParam->BSIM4v6nsub) - / model->BSIM4v6coxe; - - T0 = pParam->BSIM4v6gamma1 - pParam->BSIM4v6gamma2; - T1 = sqrt(pParam->BSIM4v6phi - pParam->BSIM4v6vbx) - - pParam->BSIM4v6sqrtPhi; - T2 = sqrt(pParam->BSIM4v6phi * (pParam->BSIM4v6phi - - pParam->BSIM4v6vbm)) - pParam->BSIM4v6phi; - pParam->BSIM4v6k2 = T0 * T1 / (2.0 * T2 + pParam->BSIM4v6vbm); - pParam->BSIM4v6k1 = pParam->BSIM4v6gamma2 - 2.0 - * pParam->BSIM4v6k2 * sqrt(pParam->BSIM4v6phi - - pParam->BSIM4v6vbm); - } - - if (!model->BSIM4v6vfbGiven) - { - if (model->BSIM4v6vth0Given) - { pParam->BSIM4v6vfb = model->BSIM4v6type * pParam->BSIM4v6vth0 - - pParam->BSIM4v6phi - pParam->BSIM4v6k1 - * pParam->BSIM4v6sqrtPhi; - } - else - { - if ((model->BSIM4v6mtrlMod) && (model->BSIM4v6phigGiven) && - (model->BSIM4v6nsubGiven)) - { - T0 = Vtm0 * log(pParam->BSIM4v6nsub/ni); - T1 = 0.5 * Eg0; - if(T0 > T1) - T0 = T1; - T2 = model->BSIM4v6easub + T1 + model->BSIM4v6type * T0; - pParam->BSIM4v6vfb = model->BSIM4v6phig - T2; - } - else - { - pParam->BSIM4v6vfb = -1.0; - } - } - } - if (!model->BSIM4v6vth0Given) - { pParam->BSIM4v6vth0 = model->BSIM4v6type * (pParam->BSIM4v6vfb - + pParam->BSIM4v6phi + pParam->BSIM4v6k1 - * pParam->BSIM4v6sqrtPhi); - } - - pParam->BSIM4v6k1ox = pParam->BSIM4v6k1 * toxe - / model->BSIM4v6toxm; - - tmp = sqrt(epssub / (epsrox * EPS0) * toxe * pParam->BSIM4v6Xdep0); - T0 = pParam->BSIM4v6dsub * pParam->BSIM4v6leff / tmp; - if (T0 < EXP_THRESHOLD) - { T1 = exp(T0); - T2 = T1 - 1.0; - T3 = T2 * T2; - T4 = T3 + 2.0 * T1 * MIN_EXP; - pParam->BSIM4v6theta0vb0 = T1 / T4; - } - else - pParam->BSIM4v6theta0vb0 = 1.0 / (MAX_EXP - 2.0); - - T0 = pParam->BSIM4v6drout * pParam->BSIM4v6leff / tmp; - if (T0 < EXP_THRESHOLD) - { T1 = exp(T0); - T2 = T1 - 1.0; - T3 = T2 * T2; - T4 = T3 + 2.0 * T1 * MIN_EXP; - T5 = T1 / T4; - } - else - T5 = 1.0 / (MAX_EXP - 2.0); /* 3.0 * MIN_EXP omitted */ - pParam->BSIM4v6thetaRout = pParam->BSIM4v6pdibl1 * T5 - + pParam->BSIM4v6pdibl2; - - tmp = sqrt(pParam->BSIM4v6Xdep0); - tmp1 = pParam->BSIM4v6vbi - pParam->BSIM4v6phi; - tmp2 = model->BSIM4v6factor1 * tmp; - - T0 = pParam->BSIM4v6dvt1w * pParam->BSIM4v6weff - * pParam->BSIM4v6leff / tmp2; - if (T0 < EXP_THRESHOLD) - { T1 = exp(T0); - T2 = T1 - 1.0; - T3 = T2 * T2; - T4 = T3 + 2.0 * T1 * MIN_EXP; - T8 = T1 / T4; - } - else - T8 = 1.0 / (MAX_EXP - 2.0); - T0 = pParam->BSIM4v6dvt0w * T8; - T8 = T0 * tmp1; - - T0 = pParam->BSIM4v6dvt1 * pParam->BSIM4v6leff / tmp2; - if (T0 < EXP_THRESHOLD) - { T1 = exp(T0); - T2 = T1 - 1.0; - T3 = T2 * T2; - T4 = T3 + 2.0 * T1 * MIN_EXP; - T9 = T1 / T4; - } - else - T9 = 1.0 / (MAX_EXP - 2.0); - T9 = pParam->BSIM4v6dvt0 * T9 * tmp1; - - T4 = toxe * pParam->BSIM4v6phi - / (pParam->BSIM4v6weff + pParam->BSIM4v6w0); - - T0 = sqrt(1.0 + pParam->BSIM4v6lpe0 / pParam->BSIM4v6leff); - if((model->BSIM4v6tempMod == 1) || (model->BSIM4v6tempMod == 0)) - T3 = (pParam->BSIM4v6kt1 + pParam->BSIM4v6kt1l / pParam->BSIM4v6leff) - * (TRatio - 1.0); - if((model->BSIM4v6tempMod == 2)||(model->BSIM4v6tempMod == 3)) - T3 = - pParam->BSIM4v6kt1 * (TRatio - 1.0); - - T5 = pParam->BSIM4v6k1ox * (T0 - 1.0) * pParam->BSIM4v6sqrtPhi - + T3; - pParam->BSIM4v6vfbzbfactor = - T8 - T9 + pParam->BSIM4v6k3 * T4 + T5 - - pParam->BSIM4v6phi - pParam->BSIM4v6k1 * pParam->BSIM4v6sqrtPhi; - - /* stress effect */ - - wlod = model->BSIM4v6wlod; - if (model->BSIM4v6wlod < 0.0) - { fprintf(stderr, "Warning: WLOD = %g is less than 0. 0.0 is used\n",model->BSIM4v6wlod); - wlod = 0.0; - } - T0 = pow(Lnew, model->BSIM4v6llodku0); - W_tmp = Wnew + wlod; - T1 = pow(W_tmp, model->BSIM4v6wlodku0); - tmp1 = model->BSIM4v6lku0 / T0 + model->BSIM4v6wku0 / T1 - + model->BSIM4v6pku0 / (T0 * T1); - pParam->BSIM4v6ku0 = 1.0 + tmp1; - - T0 = pow(Lnew, model->BSIM4v6llodvth); - T1 = pow(W_tmp, model->BSIM4v6wlodvth); - tmp1 = model->BSIM4v6lkvth0 / T0 + model->BSIM4v6wkvth0 / T1 - + model->BSIM4v6pkvth0 / (T0 * T1); - pParam->BSIM4v6kvth0 = 1.0 + tmp1; - pParam->BSIM4v6kvth0 = sqrt(pParam->BSIM4v6kvth0*pParam->BSIM4v6kvth0 + DELTA); - - T0 = (TRatio - 1.0); - pParam->BSIM4v6ku0temp = pParam->BSIM4v6ku0 * (1.0 + model->BSIM4v6tku0 *T0) + DELTA; - - Inv_saref = 1.0/(model->BSIM4v6saref + 0.5*Ldrn); - Inv_sbref = 1.0/(model->BSIM4v6sbref + 0.5*Ldrn); - pParam->BSIM4v6inv_od_ref = Inv_saref + Inv_sbref; - pParam->BSIM4v6rho_ref = model->BSIM4v6ku0 / pParam->BSIM4v6ku0temp * pParam->BSIM4v6inv_od_ref; - - } /* End of SizeNotFound */ - - /* stress effect */ - if( (here->BSIM4v6sa > 0.0) && (here->BSIM4v6sb > 0.0) && - ((here->BSIM4v6nf == 1.0) || ((here->BSIM4v6nf > 1.0) && (here->BSIM4v6sd > 0.0))) ) - { Inv_sa = 0; - Inv_sb = 0; - - kvsat = model->BSIM4v6kvsat; - if (model->BSIM4v6kvsat < -1.0 ) - { fprintf(stderr, "Warning: KVSAT = %g is too small; -1.0 is used.\n",model->BSIM4v6kvsat); - kvsat = -1.0; - } - if (model->BSIM4v6kvsat > 1.0) - { fprintf(stderr, "Warning: KVSAT = %g is too big; 1.0 is used.\n",model->BSIM4v6kvsat); - kvsat = 1.0; - } - - for(i = 0; i < here->BSIM4v6nf; i++){ - T0 = 1.0 / here->BSIM4v6nf / (here->BSIM4v6sa + 0.5*Ldrn + i * (here->BSIM4v6sd +Ldrn)); - T1 = 1.0 / here->BSIM4v6nf / (here->BSIM4v6sb + 0.5*Ldrn + i * (here->BSIM4v6sd +Ldrn)); - Inv_sa += T0; - Inv_sb += T1; - } - Inv_ODeff = Inv_sa + Inv_sb; - rho = model->BSIM4v6ku0 / pParam->BSIM4v6ku0temp * Inv_ODeff; - T0 = (1.0 + rho)/(1.0 + pParam->BSIM4v6rho_ref); - here->BSIM4v6u0temp = pParam->BSIM4v6u0temp * T0; - - T1 = (1.0 + kvsat * rho)/(1.0 + kvsat * pParam->BSIM4v6rho_ref); - here->BSIM4v6vsattemp = pParam->BSIM4v6vsattemp * T1; - - OD_offset = Inv_ODeff - pParam->BSIM4v6inv_od_ref; - dvth0_lod = model->BSIM4v6kvth0 / pParam->BSIM4v6kvth0 * OD_offset; - dk2_lod = model->BSIM4v6stk2 / pow(pParam->BSIM4v6kvth0, model->BSIM4v6lodk2) * - OD_offset; - deta0_lod = model->BSIM4v6steta0 / pow(pParam->BSIM4v6kvth0, model->BSIM4v6lodeta0) * - OD_offset; - here->BSIM4v6vth0 = pParam->BSIM4v6vth0 + dvth0_lod; - - here->BSIM4v6eta0 = pParam->BSIM4v6eta0 + deta0_lod; - here->BSIM4v6k2 = pParam->BSIM4v6k2 + dk2_lod; - } else { - here->BSIM4v6u0temp = pParam->BSIM4v6u0temp; - here->BSIM4v6vth0 = pParam->BSIM4v6vth0; - here->BSIM4v6vsattemp = pParam->BSIM4v6vsattemp; - here->BSIM4v6eta0 = pParam->BSIM4v6eta0; - here->BSIM4v6k2 = pParam->BSIM4v6k2; - } - - /* Well Proximity Effect */ - if (model->BSIM4v6wpemod) - { if( (!here->BSIM4v6scaGiven) && (!here->BSIM4v6scbGiven) && (!here->BSIM4v6sccGiven) ) - { if((here->BSIM4v6scGiven) && (here->BSIM4v6sc > 0.0) ) - { T1 = here->BSIM4v6sc + Wdrn; - T2 = 1.0 / model->BSIM4v6scref; - here->BSIM4v6sca = model->BSIM4v6scref * model->BSIM4v6scref - / (here->BSIM4v6sc * T1); - here->BSIM4v6scb = ( (0.1 * here->BSIM4v6sc + 0.01 * model->BSIM4v6scref) - * exp(-10.0 * here->BSIM4v6sc * T2) - - (0.1 * T1 + 0.01 * model->BSIM4v6scref) - * exp(-10.0 * T1 * T2) ) / Wdrn; - here->BSIM4v6scc = ( (0.05 * here->BSIM4v6sc + 0.0025 * model->BSIM4v6scref) - * exp(-20.0 * here->BSIM4v6sc * T2) - - (0.05 * T1 + 0.0025 * model->BSIM4v6scref) - * exp(-20.0 * T1 * T2) ) / Wdrn; - } else { - fprintf(stderr, "Warning: No WPE as none of SCA, SCB, SCC, SC is given and/or SC not positive.\n"); - } - } - - if (here->BSIM4v6sca < 0.0) - { - printf("Warning: SCA = %g is negative. Set to 0.0.\n", here->BSIM4v6sca); - here->BSIM4v6sca = 0.0; - } - if (here->BSIM4v6scb < 0.0) - { - printf("Warning: SCB = %g is negative. Set to 0.0.\n", here->BSIM4v6scb); - here->BSIM4v6scb = 0.0; - } - if (here->BSIM4v6scc < 0.0) - { - printf("Warning: SCC = %g is negative. Set to 0.0.\n", here->BSIM4v6scc); - here->BSIM4v6scc = 0.0; - } - if (here->BSIM4v6sc < 0.0) - { - printf("Warning: SC = %g is negative. Set to 0.0.\n", here->BSIM4v6sc); - here->BSIM4v6sc = 0.0; - } - /*4.6.2*/ - sceff = here->BSIM4v6sca + model->BSIM4v6web * here->BSIM4v6scb - + model->BSIM4v6wec * here->BSIM4v6scc; - here->BSIM4v6vth0 += pParam->BSIM4v6kvth0we * sceff; - here->BSIM4v6k2 += pParam->BSIM4v6k2we * sceff; - T3 = 1.0 + pParam->BSIM4v6ku0we * sceff; - if (T3 <= 0.0) - { T3 = 0.0; - fprintf(stderr, "Warning: ku0we = %g is negatively too high. Negative mobility! \n", pParam->BSIM4v6ku0we); - } - here->BSIM4v6u0temp *= T3; - } - - /* adding delvto */ - here->BSIM4v6vth0 += here->BSIM4v6delvto; - here->BSIM4v6vfb = pParam->BSIM4v6vfb + model->BSIM4v6type * here->BSIM4v6delvto; - - /* Instance variables calculation */ - T3 = model->BSIM4v6type * here->BSIM4v6vth0 - - here->BSIM4v6vfb - pParam->BSIM4v6phi; - T4 = T3 + T3; - T5 = 2.5 * T3; - here->BSIM4v6vtfbphi1 = (model->BSIM4v6type == NMOS) ? T4 : T5; - if (here->BSIM4v6vtfbphi1 < 0.0) - here->BSIM4v6vtfbphi1 = 0.0; - - here->BSIM4v6vtfbphi2 = 4.0 * T3; - if (here->BSIM4v6vtfbphi2 < 0.0) - here->BSIM4v6vtfbphi2 = 0.0; - - if (here->BSIM4v6k2 < 0.0) - { T0 = 0.5 * pParam->BSIM4v6k1 / here->BSIM4v6k2; - here->BSIM4v6vbsc = 0.9 * (pParam->BSIM4v6phi - T0 * T0); - if (here->BSIM4v6vbsc > -3.0) - here->BSIM4v6vbsc = -3.0; - else if (here->BSIM4v6vbsc < -30.0) - here->BSIM4v6vbsc = -30.0; - } - else - here->BSIM4v6vbsc = -30.0; - if (here->BSIM4v6vbsc > pParam->BSIM4v6vbm) - here->BSIM4v6vbsc = pParam->BSIM4v6vbm; - here->BSIM4v6k2ox = here->BSIM4v6k2 * toxe - / model->BSIM4v6toxm; - - here->BSIM4v6vfbzb = pParam->BSIM4v6vfbzbfactor - + model->BSIM4v6type * here->BSIM4v6vth0 ; - - here->BSIM4v6cgso = pParam->BSIM4v6cgso; - here->BSIM4v6cgdo = pParam->BSIM4v6cgdo; - - lnl = log(pParam->BSIM4v6leff * 1.0e6); - lnw = log(pParam->BSIM4v6weff * 1.0e6); - lnnf = log(here->BSIM4v6nf); - - bodymode = 5; - if( ( !model->BSIM4v6rbps0Given) || - ( !model->BSIM4v6rbpd0Given) ) - bodymode = 1; - else - if( (!model->BSIM4v6rbsbx0Given && !model->BSIM4v6rbsby0Given) || - (!model->BSIM4v6rbdbx0Given && !model->BSIM4v6rbdby0Given) ) - bodymode = 3; - - if(here->BSIM4v6rbodyMod == 2) - { - if (bodymode == 5) - { - rbsbx = exp( log(model->BSIM4v6rbsbx0) + model->BSIM4v6rbsdbxl * lnl + - model->BSIM4v6rbsdbxw * lnw + model->BSIM4v6rbsdbxnf * lnnf ); - rbsby = exp( log(model->BSIM4v6rbsby0) + model->BSIM4v6rbsdbyl * lnl + - model->BSIM4v6rbsdbyw * lnw + model->BSIM4v6rbsdbynf * lnnf ); - here->BSIM4v6rbsb = rbsbx * rbsby / (rbsbx + rbsby); - - - rbdbx = exp( log(model->BSIM4v6rbdbx0) + model->BSIM4v6rbsdbxl * lnl + - model->BSIM4v6rbsdbxw * lnw + model->BSIM4v6rbsdbxnf * lnnf ); - rbdby = exp( log(model->BSIM4v6rbdby0) + model->BSIM4v6rbsdbyl * lnl + - model->BSIM4v6rbsdbyw * lnw + model->BSIM4v6rbsdbynf * lnnf ); - here->BSIM4v6rbdb = rbdbx * rbdby / (rbdbx + rbdby); - } - - if ((bodymode == 3)|| (bodymode == 5)) - { - here->BSIM4v6rbps = exp( log(model->BSIM4v6rbps0) + model->BSIM4v6rbpsl * lnl + - model->BSIM4v6rbpsw * lnw + model->BSIM4v6rbpsnf * lnnf ); - here->BSIM4v6rbpd = exp( log(model->BSIM4v6rbpd0) + model->BSIM4v6rbpdl * lnl + - model->BSIM4v6rbpdw * lnw + model->BSIM4v6rbpdnf * lnnf ); - } - - rbpbx = exp( log(model->BSIM4v6rbpbx0) + model->BSIM4v6rbpbxl * lnl + - model->BSIM4v6rbpbxw * lnw + model->BSIM4v6rbpbxnf * lnnf ); - rbpby = exp( log(model->BSIM4v6rbpby0) + model->BSIM4v6rbpbyl * lnl + - model->BSIM4v6rbpbyw * lnw + model->BSIM4v6rbpbynf * lnnf ); - here->BSIM4v6rbpb = rbpbx*rbpby/(rbpbx + rbpby); - } - - - if ((here->BSIM4v6rbodyMod == 1 ) || ((here->BSIM4v6rbodyMod == 2 ) && (bodymode == 5)) ) - { if (here->BSIM4v6rbdb < 1.0e-3) - here->BSIM4v6grbdb = 1.0e3; /* in mho */ - else - here->BSIM4v6grbdb = model->BSIM4v6gbmin + 1.0 / here->BSIM4v6rbdb; - if (here->BSIM4v6rbpb < 1.0e-3) - here->BSIM4v6grbpb = 1.0e3; - else - here->BSIM4v6grbpb = model->BSIM4v6gbmin + 1.0 / here->BSIM4v6rbpb; - if (here->BSIM4v6rbps < 1.0e-3) - here->BSIM4v6grbps = 1.0e3; - else - here->BSIM4v6grbps = model->BSIM4v6gbmin + 1.0 / here->BSIM4v6rbps; - if (here->BSIM4v6rbsb < 1.0e-3) - here->BSIM4v6grbsb = 1.0e3; - else - here->BSIM4v6grbsb = model->BSIM4v6gbmin + 1.0 / here->BSIM4v6rbsb; - if (here->BSIM4v6rbpd < 1.0e-3) - here->BSIM4v6grbpd = 1.0e3; - else - here->BSIM4v6grbpd = model->BSIM4v6gbmin + 1.0 / here->BSIM4v6rbpd; - - } - - if((here->BSIM4v6rbodyMod == 2) && (bodymode == 3)) - { - here->BSIM4v6grbdb = here->BSIM4v6grbsb = model->BSIM4v6gbmin; - if (here->BSIM4v6rbpb < 1.0e-3) - here->BSIM4v6grbpb = 1.0e3; - else - here->BSIM4v6grbpb = model->BSIM4v6gbmin + 1.0 / here->BSIM4v6rbpb; - if (here->BSIM4v6rbps < 1.0e-3) - here->BSIM4v6grbps = 1.0e3; - else - here->BSIM4v6grbps = model->BSIM4v6gbmin + 1.0 / here->BSIM4v6rbps; - if (here->BSIM4v6rbpd < 1.0e-3) - here->BSIM4v6grbpd = 1.0e3; - else - here->BSIM4v6grbpd = model->BSIM4v6gbmin + 1.0 / here->BSIM4v6rbpd; - } - - if((here->BSIM4v6rbodyMod == 2) && (bodymode == 1)) - { - here->BSIM4v6grbdb = here->BSIM4v6grbsb = model->BSIM4v6gbmin; - here->BSIM4v6grbps = here->BSIM4v6grbpd = 1.0e3; - if (here->BSIM4v6rbpb < 1.0e-3) - here->BSIM4v6grbpb = 1.0e3; - else - here->BSIM4v6grbpb = model->BSIM4v6gbmin + 1.0 / here->BSIM4v6rbpb; - } - - - /* - * Process geomertry dependent parasitics - */ - - here->BSIM4v6grgeltd = model->BSIM4v6rshg * (here->BSIM4v6xgw - + pParam->BSIM4v6weffCJ / 3.0 / here->BSIM4v6ngcon) / - (here->BSIM4v6ngcon * here->BSIM4v6nf * - (Lnew - model->BSIM4v6xgl)); - if (here->BSIM4v6grgeltd > 0.0) - here->BSIM4v6grgeltd = 1.0 / here->BSIM4v6grgeltd; - else - { here->BSIM4v6grgeltd = 1.0e3; /* mho */ - if (here->BSIM4v6rgateMod != 0) - printf("Warning: The gate conductance reset to 1.0e3 mho.\n"); - } - - DMCGeff = model->BSIM4v6dmcg - model->BSIM4v6dmcgt; - DMCIeff = model->BSIM4v6dmci; - DMDGeff = model->BSIM4v6dmdg - model->BSIM4v6dmcgt; - - if (here->BSIM4v6sourcePerimeterGiven) - { - if(here->BSIM4v6sourcePerimeter == 0.0) - here->BSIM4v6Pseff = 0.0; - else if (here->BSIM4v6sourcePerimeter < 0.0) - { - printf("Warning: Source Perimeter is specified as negative, it is set to zero.\n"); - here->BSIM4v6Pseff = 0.0; - } - else - { - if (model->BSIM4v6perMod == 0) - here->BSIM4v6Pseff = here->BSIM4v6sourcePerimeter; - else - here->BSIM4v6Pseff = here->BSIM4v6sourcePerimeter - - pParam->BSIM4v6weffCJ * here->BSIM4v6nf; - } - } - else - BSIM4v6PAeffGeo(here->BSIM4v6nf, here->BSIM4v6geoMod, here->BSIM4v6min, - pParam->BSIM4v6weffCJ, DMCGeff, DMCIeff, DMDGeff, - &(here->BSIM4v6Pseff), &dumPd, &dumAs, &dumAd); - if (here->BSIM4v6Pseff < 0.0) /*4.6.2*/ - here->BSIM4v6Pseff = 0.0; - - if (here->BSIM4v6drainPerimeterGiven) - { - if(here->BSIM4v6drainPerimeter == 0.0) - here->BSIM4v6Pdeff = 0.0; - else if (here->BSIM4v6drainPerimeter < 0.0) - { - printf("Warning: Drain Perimeter is specified as negative, it is set to zero\n"); - here->BSIM4v6Pdeff = 0.0; - } - else - { - if (model->BSIM4v6perMod == 0) - here->BSIM4v6Pdeff = here->BSIM4v6drainPerimeter; - else - here->BSIM4v6Pdeff = here->BSIM4v6drainPerimeter - - pParam->BSIM4v6weffCJ * here->BSIM4v6nf; - } - } - else - BSIM4v6PAeffGeo(here->BSIM4v6nf, here->BSIM4v6geoMod, here->BSIM4v6min, - pParam->BSIM4v6weffCJ, DMCGeff, DMCIeff, DMDGeff, - &dumPs, &(here->BSIM4v6Pdeff), &dumAs, &dumAd); - if (here->BSIM4v6Pdeff < 0.0) /*4.6.2*/ - here->BSIM4v6Pdeff = 0.0; - - if (here->BSIM4v6sourceAreaGiven) - here->BSIM4v6Aseff = here->BSIM4v6sourceArea; - else - BSIM4v6PAeffGeo(here->BSIM4v6nf, here->BSIM4v6geoMod, here->BSIM4v6min, - pParam->BSIM4v6weffCJ, DMCGeff, DMCIeff, DMDGeff, - &dumPs, &dumPd, &(here->BSIM4v6Aseff), &dumAd); - - if (here->BSIM4v6drainAreaGiven) - here->BSIM4v6Adeff = here->BSIM4v6drainArea; - else - BSIM4v6PAeffGeo(here->BSIM4v6nf, here->BSIM4v6geoMod, here->BSIM4v6min, - pParam->BSIM4v6weffCJ, DMCGeff, DMCIeff, DMDGeff, - &dumPs, &dumPd, &dumAs, &(here->BSIM4v6Adeff)); - - /* Processing S/D resistance and conductance below */ - if(here->BSIM4v6sNodePrime != here->BSIM4v6sNode) - { - here->BSIM4v6sourceConductance = 0.0; - if(here->BSIM4v6sourceSquaresGiven) - { - here->BSIM4v6sourceConductance = model->BSIM4v6sheetResistance - * here->BSIM4v6sourceSquares; - } else if (here->BSIM4v6rgeoMod > 0) - { - BSIM4v6RdseffGeo(here->BSIM4v6nf, here->BSIM4v6geoMod, - here->BSIM4v6rgeoMod, here->BSIM4v6min, - pParam->BSIM4v6weffCJ, model->BSIM4v6sheetResistance, - DMCGeff, DMCIeff, DMDGeff, 1, &(here->BSIM4v6sourceConductance)); - } else - { - here->BSIM4v6sourceConductance = 0.0; - } - - if (here->BSIM4v6sourceConductance > 0.0) - here->BSIM4v6sourceConductance = 1.0 - / here->BSIM4v6sourceConductance; - else - { - here->BSIM4v6sourceConductance = 1.0e3; /* mho */ - printf ("Warning: Source conductance reset to 1.0e3 mho.\n"); - } - } else - { - here->BSIM4v6sourceConductance = 0.0; - } - - if(here->BSIM4v6dNodePrime != here->BSIM4v6dNode) - { - here->BSIM4v6drainConductance = 0.0; - if(here->BSIM4v6drainSquaresGiven) - { - here->BSIM4v6drainConductance = model->BSIM4v6sheetResistance - * here->BSIM4v6drainSquares; - } else if (here->BSIM4v6rgeoMod > 0) - { - BSIM4v6RdseffGeo(here->BSIM4v6nf, here->BSIM4v6geoMod, - here->BSIM4v6rgeoMod, here->BSIM4v6min, - pParam->BSIM4v6weffCJ, model->BSIM4v6sheetResistance, - DMCGeff, DMCIeff, DMDGeff, 0, &(here->BSIM4v6drainConductance)); - } else - { - here->BSIM4v6drainConductance = 0.0; - } - - if (here->BSIM4v6drainConductance > 0.0) - here->BSIM4v6drainConductance = 1.0 - / here->BSIM4v6drainConductance; - else - { - here->BSIM4v6drainConductance = 1.0e3; /* mho */ - printf ("Warning: Drain conductance reset to 1.0e3 mho.\n"); - } - } else - { - here->BSIM4v6drainConductance = 0.0; - } - - /* End of Rsd processing */ - - - Nvtms = model->BSIM4v6vtm * model->BSIM4v6SjctEmissionCoeff; - if ((here->BSIM4v6Aseff <= 0.0) && (here->BSIM4v6Pseff <= 0.0)) - { SourceSatCurrent = 0.0; - } - else - { SourceSatCurrent = here->BSIM4v6Aseff * model->BSIM4v6SjctTempSatCurDensity - + here->BSIM4v6Pseff * model->BSIM4v6SjctSidewallTempSatCurDensity - + pParam->BSIM4v6weffCJ * here->BSIM4v6nf - * model->BSIM4v6SjctGateSidewallTempSatCurDensity; - } - if (SourceSatCurrent > 0.0) - { switch(model->BSIM4v6dioMod) - { case 0: - if ((model->BSIM4v6bvs / Nvtms) > EXP_THRESHOLD) - here->BSIM4v6XExpBVS = model->BSIM4v6xjbvs * MIN_EXP; - else - here->BSIM4v6XExpBVS = model->BSIM4v6xjbvs * exp(-model->BSIM4v6bvs / Nvtms); - break; - case 1: - BSIM4v6DioIjthVjmEval(Nvtms, model->BSIM4v6ijthsfwd, SourceSatCurrent, - 0.0, &(here->BSIM4v6vjsmFwd)); - here->BSIM4v6IVjsmFwd = SourceSatCurrent * exp(here->BSIM4v6vjsmFwd / Nvtms); - break; - case 2: - if ((model->BSIM4v6bvs / Nvtms) > EXP_THRESHOLD) - { here->BSIM4v6XExpBVS = model->BSIM4v6xjbvs * MIN_EXP; - tmp = MIN_EXP; - } - else - { here->BSIM4v6XExpBVS = exp(-model->BSIM4v6bvs / Nvtms); - tmp = here->BSIM4v6XExpBVS; - here->BSIM4v6XExpBVS *= model->BSIM4v6xjbvs; - } - - BSIM4v6DioIjthVjmEval(Nvtms, model->BSIM4v6ijthsfwd, SourceSatCurrent, - here->BSIM4v6XExpBVS, &(here->BSIM4v6vjsmFwd)); - T0 = exp(here->BSIM4v6vjsmFwd / Nvtms); - here->BSIM4v6IVjsmFwd = SourceSatCurrent * (T0 - here->BSIM4v6XExpBVS / T0 - + here->BSIM4v6XExpBVS - 1.0); - here->BSIM4v6SslpFwd = SourceSatCurrent - * (T0 + here->BSIM4v6XExpBVS / T0) / Nvtms; - - T2 = model->BSIM4v6ijthsrev / SourceSatCurrent; - if (T2 < 1.0) - { T2 = 10.0; - fprintf(stderr, "Warning: ijthsrev too small and set to 10 times IsbSat.\n"); - } - here->BSIM4v6vjsmRev = -model->BSIM4v6bvs - - Nvtms * log((T2 - 1.0) / model->BSIM4v6xjbvs); - T1 = model->BSIM4v6xjbvs * exp(-(model->BSIM4v6bvs - + here->BSIM4v6vjsmRev) / Nvtms); - here->BSIM4v6IVjsmRev = SourceSatCurrent * (1.0 + T1); - here->BSIM4v6SslpRev = -SourceSatCurrent * T1 / Nvtms; - break; - default: - printf("Specified dioMod = %d not matched\n", model->BSIM4v6dioMod); - } - } - - Nvtmd = model->BSIM4v6vtm * model->BSIM4v6DjctEmissionCoeff; - if ((here->BSIM4v6Adeff <= 0.0) && (here->BSIM4v6Pdeff <= 0.0)) - { DrainSatCurrent = 0.0; - } - else - { DrainSatCurrent = here->BSIM4v6Adeff * model->BSIM4v6DjctTempSatCurDensity - + here->BSIM4v6Pdeff * model->BSIM4v6DjctSidewallTempSatCurDensity - + pParam->BSIM4v6weffCJ * here->BSIM4v6nf - * model->BSIM4v6DjctGateSidewallTempSatCurDensity; - } - if (DrainSatCurrent > 0.0) - { switch(model->BSIM4v6dioMod) - { case 0: - if ((model->BSIM4v6bvd / Nvtmd) > EXP_THRESHOLD) - here->BSIM4v6XExpBVD = model->BSIM4v6xjbvd * MIN_EXP; - else - here->BSIM4v6XExpBVD = model->BSIM4v6xjbvd * exp(-model->BSIM4v6bvd / Nvtmd); - break; - case 1: - BSIM4v6DioIjthVjmEval(Nvtmd, model->BSIM4v6ijthdfwd, DrainSatCurrent, - 0.0, &(here->BSIM4v6vjdmFwd)); - here->BSIM4v6IVjdmFwd = DrainSatCurrent * exp(here->BSIM4v6vjdmFwd / Nvtmd); - break; - case 2: - if ((model->BSIM4v6bvd / Nvtmd) > EXP_THRESHOLD) - { here->BSIM4v6XExpBVD = model->BSIM4v6xjbvd * MIN_EXP; - tmp = MIN_EXP; - } - else - { here->BSIM4v6XExpBVD = exp(-model->BSIM4v6bvd / Nvtmd); - tmp = here->BSIM4v6XExpBVD; - here->BSIM4v6XExpBVD *= model->BSIM4v6xjbvd; - } - - BSIM4v6DioIjthVjmEval(Nvtmd, model->BSIM4v6ijthdfwd, DrainSatCurrent, - here->BSIM4v6XExpBVD, &(here->BSIM4v6vjdmFwd)); - T0 = exp(here->BSIM4v6vjdmFwd / Nvtmd); - here->BSIM4v6IVjdmFwd = DrainSatCurrent * (T0 - here->BSIM4v6XExpBVD / T0 - + here->BSIM4v6XExpBVD - 1.0); - here->BSIM4v6DslpFwd = DrainSatCurrent - * (T0 + here->BSIM4v6XExpBVD / T0) / Nvtmd; - - T2 = model->BSIM4v6ijthdrev / DrainSatCurrent; - if (T2 < 1.0) - { T2 = 10.0; - fprintf(stderr, "Warning: ijthdrev too small and set to 10 times IdbSat.\n"); - } - here->BSIM4v6vjdmRev = -model->BSIM4v6bvd - - Nvtmd * log((T2 - 1.0) / model->BSIM4v6xjbvd); /* bugfix */ - T1 = model->BSIM4v6xjbvd * exp(-(model->BSIM4v6bvd - + here->BSIM4v6vjdmRev) / Nvtmd); - here->BSIM4v6IVjdmRev = DrainSatCurrent * (1.0 + T1); - here->BSIM4v6DslpRev = -DrainSatCurrent * T1 / Nvtmd; - break; - default: - printf("Specified dioMod = %d not matched\n", model->BSIM4v6dioMod); - } - } - - /* GEDL current reverse bias */ - T0 = (TRatio - 1.0); - model->BSIM4v6njtsstemp = model->BSIM4v6njts * (1.0 + model->BSIM4v6tnjts * T0); - model->BSIM4v6njtsswstemp = model->BSIM4v6njtssw * (1.0 + model->BSIM4v6tnjtssw * T0); - model->BSIM4v6njtsswgstemp = model->BSIM4v6njtsswg * (1.0 + model->BSIM4v6tnjtsswg * T0); - model->BSIM4v6njtsdtemp = model->BSIM4v6njtsd * (1.0 + model->BSIM4v6tnjtsd * T0); - model->BSIM4v6njtsswdtemp = model->BSIM4v6njtsswd * (1.0 + model->BSIM4v6tnjtsswd * T0); - model->BSIM4v6njtsswgdtemp = model->BSIM4v6njtsswgd * (1.0 + model->BSIM4v6tnjtsswgd * T0); - T7 = Eg0 / model->BSIM4v6vtm * T0; - T9 = model->BSIM4v6xtss * T7; - DEXP(T9, T1); - T9 = model->BSIM4v6xtsd * T7; - DEXP(T9, T2); - T9 = model->BSIM4v6xtssws * T7; - DEXP(T9, T3); - T9 = model->BSIM4v6xtsswd * T7; - DEXP(T9, T4); - T9 = model->BSIM4v6xtsswgs * T7; - DEXP(T9, T5); - T9 = model->BSIM4v6xtsswgd * T7; - DEXP(T9, T6); - /*IBM TAT*/ - if(model->BSIM4v6jtweff < 0.0) - { model->BSIM4v6jtweff = 0.0; - fprintf(stderr, "TAT width dependence effect is negative. Jtweff is clamped to zero.\n"); - } - T11 = sqrt(model->BSIM4v6jtweff / pParam->BSIM4v6weffCJ) + 1.0; - - T10 = pParam->BSIM4v6weffCJ * here->BSIM4v6nf; - here->BSIM4v6SjctTempRevSatCur = T1 * here->BSIM4v6Aseff * model->BSIM4v6jtss; - here->BSIM4v6DjctTempRevSatCur = T2 * here->BSIM4v6Adeff * model->BSIM4v6jtsd; - here->BSIM4v6SswTempRevSatCur = T3 * here->BSIM4v6Pseff * model->BSIM4v6jtssws; - here->BSIM4v6DswTempRevSatCur = T4 * here->BSIM4v6Pdeff * model->BSIM4v6jtsswd; - here->BSIM4v6SswgTempRevSatCur = T5 * T10 * T11 * model->BSIM4v6jtsswgs; - here->BSIM4v6DswgTempRevSatCur = T6 * T10 * T11 * model->BSIM4v6jtsswgd; - - /*high k*/ - /*Calculate VgsteffVth for mobMod=3*/ - if(model->BSIM4v6mobMod==3) - { /*Calculate n @ Vbs=Vds=0*/ - V0 = pParam->BSIM4v6vbi - pParam->BSIM4v6phi; - lt1 = model->BSIM4v6factor1* pParam->BSIM4v6sqrtXdep0; - ltw = lt1; - T0 = pParam->BSIM4v6dvt1 * pParam->BSIM4v6leff / lt1; - if (T0 < EXP_THRESHOLD) - { - T1 = exp(T0); - T2 = T1 - 1.0; - T3 = T2 * T2; - T4 = T3 + 2.0 * T1 * MIN_EXP; - Theta0 = T1 / T4; - } - else - Theta0 = 1.0 / (MAX_EXP - 2.0); - - tmp1 = epssub / pParam->BSIM4v6Xdep0; - here->BSIM4v6nstar = model->BSIM4v6vtm / Charge_q * - (model->BSIM4v6coxe + tmp1 + pParam->BSIM4v6cit); - tmp2 = pParam->BSIM4v6nfactor * tmp1; - tmp3 = (tmp2 + pParam->BSIM4v6cdsc * Theta0 + pParam->BSIM4v6cit) / model->BSIM4v6coxe; - if (tmp3 >= -0.5) - n0 = 1.0 + tmp3; - else - { - T0 = 1.0 / (3.0 + 8.0 * tmp3); - n0 = (1.0 + 3.0 * tmp3) * T0; - } - - T0 = n0 * model->BSIM4v6vtm; - T1 = pParam->BSIM4v6voffcbn; - T2 = T1/T0; - if (T2 < -EXP_THRESHOLD) - { T3 = model->BSIM4v6coxe * MIN_EXP / pParam->BSIM4v6cdep0; - T4 = pParam->BSIM4v6mstar + T3 * n0; - } - else if (T2 > EXP_THRESHOLD) - { T3 = model->BSIM4v6coxe * MAX_EXP / pParam->BSIM4v6cdep0; - T4 = pParam->BSIM4v6mstar + T3 * n0; - } - else - { T3 = exp(T2)* model->BSIM4v6coxe / pParam->BSIM4v6cdep0; - T4 = pParam->BSIM4v6mstar + T3 * n0; - - } - pParam->BSIM4v6VgsteffVth = T0 * log(2.0)/T4; - - } - - if(model->BSIM4v6mtrlMod) - { - /* Calculate TOXP from EOT */ - /* Calculate Vgs_eff @ Vgs = VDD with Poly Depletion Effect */ - Vtm0eot = KboQ * model->BSIM4v6tempeot; - Vtmeot = Vtm0eot; - vbieot = Vtm0eot * log(pParam->BSIM4v6nsd - * pParam->BSIM4v6ndep / (ni * ni)); - phieot = Vtm0eot * log(pParam->BSIM4v6ndep / ni) - + pParam->BSIM4v6phin + 0.4; - tmp2 = here->BSIM4v6vfb + phieot; - vddeot = model->BSIM4v6type * model->BSIM4v6vddeot; - T0 = model->BSIM4v6epsrgate * EPS0; - if ((pParam->BSIM4v6ngate > 1.0e18) && (pParam->BSIM4v6ngate < 1.0e25) - && (vddeot > tmp2) && (T0!=0)) - { - T1 = 1.0e6 * CHARGE * T0 * pParam->BSIM4v6ngate / - (model->BSIM4v6coxe * model->BSIM4v6coxe); - T8 = vddeot - tmp2; - T4 = sqrt(1.0 + 2.0 * T8 / T1); - T2 = 2.0 * T8 / (T4 + 1.0); - T3 = 0.5 * T2 * T2 / T1; - T7 = 1.12 - T3 - 0.05; - T6 = sqrt(T7 * T7 + 0.224); - T5 = 1.12 - 0.5 * (T7 + T6); - Vgs_eff = vddeot - T5; - } - else - Vgs_eff = vddeot; - - /* Calculate Vth @ Vds=Vbs=0 */ - - V0 = vbieot - phieot; - lt1 = model->BSIM4v6factor1* pParam->BSIM4v6sqrtXdep0; - ltw = lt1; - T0 = pParam->BSIM4v6dvt1 * model->BSIM4v6leffeot / lt1; - if (T0 < EXP_THRESHOLD) - { - T1 = exp(T0); - T2 = T1 - 1.0; - T3 = T2 * T2; - T4 = T3 + 2.0 * T1 * MIN_EXP; - Theta0 = T1 / T4; - } - else - Theta0 = 1.0 / (MAX_EXP - 2.0); - Delt_vth = pParam->BSIM4v6dvt0 * Theta0 * V0; - T0 = pParam->BSIM4v6dvt1w * model->BSIM4v6weffeot * model->BSIM4v6leffeot / ltw; - if (T0 < EXP_THRESHOLD) - { T1 = exp(T0); - T2 = T1 - 1.0; - T3 = T2 * T2; - T4 = T3 + 2.0 * T1 * MIN_EXP; - T5 = T1 / T4; - } - else - T5 = 1.0 / (MAX_EXP - 2.0); /* 3.0 * MIN_EXP omitted */ - T2 = pParam->BSIM4v6dvt0w * T5 * V0; - TempRatioeot = model->BSIM4v6tempeot / model->BSIM4v6tnom - 1.0; - T0 = sqrt(1.0 + pParam->BSIM4v6lpe0 / model->BSIM4v6leffeot); - T1 = pParam->BSIM4v6k1ox * (T0 - 1.0) * sqrt(phieot) - + (pParam->BSIM4v6kt1 + pParam->BSIM4v6kt1l / model->BSIM4v6leffeot) * TempRatioeot; - Vth_NarrowW = toxe * phieot - / (model->BSIM4v6weffeot + pParam->BSIM4v6w0); - Lpe_Vb = sqrt(1.0 + pParam->BSIM4v6lpeb / model->BSIM4v6leffeot); - Vth = model->BSIM4v6type * here->BSIM4v6vth0 + - (pParam->BSIM4v6k1ox - pParam->BSIM4v6k1)*sqrt(phieot)*Lpe_Vb - - Delt_vth - T2 + pParam->BSIM4v6k3 * Vth_NarrowW + T1; - - /* Calculate n */ - tmp1 = epssub / pParam->BSIM4v6Xdep0; - here->BSIM4v6nstar = Vtmeot / Charge_q * - (model->BSIM4v6coxe + tmp1 + pParam->BSIM4v6cit); - tmp2 = pParam->BSIM4v6nfactor * tmp1; - tmp3 = (tmp2 + pParam->BSIM4v6cdsc * Theta0 + pParam->BSIM4v6cit) / model->BSIM4v6coxe; - if (tmp3 >= -0.5) - n = 1.0 + tmp3; - else - { - T0 = 1.0 / (3.0 + 8.0 * tmp3); - n = (1.0 + 3.0 * tmp3) * T0; - } - - /* Vth correction for Pocket implant */ - if (pParam->BSIM4v6dvtp0 > 0.0) - { - T3 = model->BSIM4v6leffeot + pParam->BSIM4v6dvtp0 * 2.0; - if (model->BSIM4v6tempMod < 2) - T4 = Vtmeot * log(model->BSIM4v6leffeot / T3); - else - T4 = Vtm0eot * log(model->BSIM4v6leffeot / T3); - Vth -= n * T4; - } - Vgsteff = Vgs_eff-Vth; - /* calculating Toxp */ - T3 = model->BSIM4v6type * here->BSIM4v6vth0 - - here->BSIM4v6vfb - phieot; - T4 = T3 + T3; - T5 = 2.5 * T3; - - vtfbphi2eot = 4.0 * T3; - if (vtfbphi2eot < 0.0) - vtfbphi2eot = 0.0; - - - niter = 0; - toxpf = toxe; - do - { - toxpi = toxpf; - tmp2 = 2.0e8 * toxpf; - T0 = (Vgsteff + vtfbphi2eot) / tmp2; - T1 = 1.0 + exp(model->BSIM4v6bdos * 0.7 * log(T0)); - Tcen = model->BSIM4v6ados * 1.9e-9 / T1; - toxpf = toxe - epsrox/model->BSIM4v6epsrsub * Tcen; - niter++; - } while ((niter<=4)&&(ABS(toxpf-toxpi)>1e-12)); - model->BSIM4v6toxp = toxpf; - model->BSIM4v6coxp = epsrox * EPS0 / model->BSIM4v6toxp; - } - - if (BSIM4v6checkModel(model, here, ckt)) - { - SPfrontEnd->IFerrorf(ERR_FATAL, - "detected during BSIM4.6.5 parameter checking for \n model %s of device instance %s\n", model->BSIM4v6modName, here->BSIM4v6name); - return(E_BADPARM); - } - } /* End instance */ - } - return(OK); -} diff --git a/src/spicelib/devices/bsim4v6/b4v6trunc.c b/src/spicelib/devices/bsim4v6/b4v6trunc.c deleted file mode 100644 index 8951c198a..000000000 --- a/src/spicelib/devices/bsim4v6/b4v6trunc.c +++ /dev/null @@ -1,61 +0,0 @@ -/**** BSIM4.6.2 Released by Wenwei Yang 07/31/2008 ****/ - -/********** - * Copyright 2006 Regents of the University of California. All rights reserved. - * File: b4trunc.c of BSIM4.6.2. - * Author: 2000 Weidong Liu - * Authors: 2001- Xuemei Xi, Mohan Dunga, Ali Niknejad, Chenming Hu. - * Authors: 2006- Mohan Dunga, Ali Niknejad, Chenming Hu - * Authors: 2007- Mohan Dunga, Wenwei Yang, Ali Niknejad, Chenming Hu - * Project Director: Prof. Chenming Hu. - **********/ - -#include "ngspice/ngspice.h" -#include "ngspice/cktdefs.h" -#include "bsim4v6def.h" -#include "ngspice/sperror.h" -#include "ngspice/suffix.h" - - -int -BSIM4v6trunc( -GENmodel *inModel, -CKTcircuit *ckt, -double *timeStep) -{ -BSIM4v6model *model = (BSIM4v6model*)inModel; -BSIM4v6instance *here; - -#ifdef STEPDEBUG - double debugtemp; -#endif /* STEPDEBUG */ - - for (; model != NULL; model = BSIM4v6nextModel(model)) - { for (here = BSIM4v6instances(model); here != NULL; - here = BSIM4v6nextInstance(here)) - { - -#ifdef STEPDEBUG - debugtemp = *timeStep; -#endif /* STEPDEBUG */ - CKTterr(here->BSIM4v6qb,ckt,timeStep); - CKTterr(here->BSIM4v6qg,ckt,timeStep); - CKTterr(here->BSIM4v6qd,ckt,timeStep); - if (here->BSIM4v6trnqsMod) - CKTterr(here->BSIM4v6qcdump,ckt,timeStep); - if (here->BSIM4v6rbodyMod) - { CKTterr(here->BSIM4v6qbs,ckt,timeStep); - CKTterr(here->BSIM4v6qbd,ckt,timeStep); - } - if (here->BSIM4v6rgateMod == 3) - CKTterr(here->BSIM4v6qgmid,ckt,timeStep); -#ifdef STEPDEBUG - if(debugtemp != *timeStep) - { printf("device %s reduces step from %g to %g\n", - here->BSIM4v6name,debugtemp,*timeStep); - } -#endif /* STEPDEBUG */ - } - } - return(OK); -} diff --git a/src/spicelib/devices/bsim4v6/bsim4v6def.h b/src/spicelib/devices/bsim4v6/bsim4v6def.h deleted file mode 100644 index 62de645f5..000000000 --- a/src/spicelib/devices/bsim4v6/bsim4v6def.h +++ /dev/null @@ -1,3605 +0,0 @@ -/**** BSIM4.6.2 Released by Wenwei Yang 07/31/2008 ****/ -/**** OpenMP support for ngspice by Holger Vogt 06/28/2010 ****/ -/********** -Copyright 2006 Regents of the University of California. All rights reserved. -File: bsim4v6def.h -Author: 2000 Weidong Liu. -Authors: 2001- Xuemei Xi, Mohan Dunga, Ali Niknejad, Chenming Hu. -Authors: 2006- Mohan Dunga, Ali Niknejad, Chenming Hu -Authors: 2007- Mohan Dunga, Wenwei Yang, Ali Niknejad, Chenming Hu -Authors: 2008- Wenwei Yang, Ali Niknejad, Chenming Hu -Modified by Xuemei Xi, 11/15/2002. -Modified by Xuemei Xi, 05/09/2003. -Modified by Xuemei Xi, 03/04/2004. -Modified by Xuemei Xi, Mohan Dunga, 09/24/2004. -Modified by Xuemei Xi, 07/29/2005. -Modified by Mohan Dunga, 12/13/2006 -Modified by Mohan Dunga, Wenwei Yang, 05/18/2007. -Modified by Wenwei Yang, 07/31/2008. -**********/ - -#ifndef BSIM4v6 -#define BSIM4v6 - -#include "ngspice/ifsim.h" -#include "ngspice/gendefs.h" -#include "ngspice/cktdefs.h" -#include "ngspice/complex.h" -#include "ngspice/noisedef.h" - -typedef struct sBSIM4v6instance -{ - - struct GENinstance gen; - -#define BSIM4v6modPtr(inst) ((struct sBSIM4v6model *)((inst)->gen.GENmodPtr)) -#define BSIM4v6nextInstance(inst) ((struct sBSIM4v6instance *)((inst)->gen.GENnextInstance)) -#define BSIM4v6name gen.GENname -#define BSIM4v6states gen.GENstate - - const int BSIM4v6dNode; - const int BSIM4v6gNodeExt; - const int BSIM4v6sNode; - const int BSIM4v6bNode; - int BSIM4v6dNodePrime; - int BSIM4v6gNodePrime; - int BSIM4v6gNodeMid; - int BSIM4v6sNodePrime; - int BSIM4v6bNodePrime; - int BSIM4v6dbNode; - int BSIM4v6sbNode; - int BSIM4v6qNode; - - double BSIM4v6ueff; - double BSIM4v6thetavth; - double BSIM4v6von; - double BSIM4v6vdsat; - double BSIM4v6cgdo; - double BSIM4v6qgdo; - double BSIM4v6cgso; - double BSIM4v6qgso; - double BSIM4v6grbsb; - double BSIM4v6grbdb; - double BSIM4v6grbpb; - double BSIM4v6grbps; - double BSIM4v6grbpd; - - double BSIM4v6vjsmFwd; - double BSIM4v6vjsmRev; - double BSIM4v6vjdmFwd; - double BSIM4v6vjdmRev; - double BSIM4v6XExpBVS; - double BSIM4v6XExpBVD; - double BSIM4v6SslpFwd; - double BSIM4v6SslpRev; - double BSIM4v6DslpFwd; - double BSIM4v6DslpRev; - double BSIM4v6IVjsmFwd; - double BSIM4v6IVjsmRev; - double BSIM4v6IVjdmFwd; - double BSIM4v6IVjdmRev; - - double BSIM4v6grgeltd; - double BSIM4v6Pseff; - double BSIM4v6Pdeff; - double BSIM4v6Aseff; - double BSIM4v6Adeff; - - double BSIM4v6l; - double BSIM4v6w; - double BSIM4v6drainArea; - double BSIM4v6sourceArea; - double BSIM4v6drainSquares; - double BSIM4v6sourceSquares; - double BSIM4v6drainPerimeter; - double BSIM4v6sourcePerimeter; - double BSIM4v6sourceConductance; - double BSIM4v6drainConductance; - /* stress effect instance param */ - double BSIM4v6sa; - double BSIM4v6sb; - double BSIM4v6sd; - double BSIM4v6sca; - double BSIM4v6scb; - double BSIM4v6scc; - double BSIM4v6sc; - - double BSIM4v6rbdb; - double BSIM4v6rbsb; - double BSIM4v6rbpb; - double BSIM4v6rbps; - double BSIM4v6rbpd; - - double BSIM4v6delvto; - double BSIM4v6xgw; - double BSIM4v6ngcon; - - /* added here to account stress effect instance dependence */ - double BSIM4v6u0temp; - double BSIM4v6vsattemp; - double BSIM4v6vth0; - double BSIM4v6vfb; - double BSIM4v6vfbzb; - double BSIM4v6vtfbphi1; - double BSIM4v6vtfbphi2; - double BSIM4v6k2; - double BSIM4v6vbsc; - double BSIM4v6k2ox; - double BSIM4v6eta0; - - double BSIM4v6icVDS; - double BSIM4v6icVGS; - double BSIM4v6icVBS; - double BSIM4v6m; - double BSIM4v6nf; - int BSIM4v6off; - int BSIM4v6mode; - int BSIM4v6trnqsMod; - int BSIM4v6acnqsMod; - int BSIM4v6rbodyMod; - int BSIM4v6rgateMod; - int BSIM4v6geoMod; - int BSIM4v6rgeoMod; - int BSIM4v6min; - - - /* OP point */ - double BSIM4v6Vgsteff; - double BSIM4v6vgs_eff; - double BSIM4v6vgd_eff; - double BSIM4v6dvgs_eff_dvg; - double BSIM4v6dvgd_eff_dvg; - double BSIM4v6Vdseff; - double BSIM4v6nstar; - double BSIM4v6Abulk; - double BSIM4v6EsatL; - double BSIM4v6AbovVgst2Vtm; - double BSIM4v6qinv; - double BSIM4v6cd; - double BSIM4v6cbs; - double BSIM4v6cbd; - double BSIM4v6csub; - double BSIM4v6Igidl; - double BSIM4v6Igisl; - double BSIM4v6gm; - double BSIM4v6gds; - double BSIM4v6gmbs; - double BSIM4v6gbd; - double BSIM4v6gbs; - - double BSIM4v6gbbs; - double BSIM4v6gbgs; - double BSIM4v6gbds; - double BSIM4v6ggidld; - double BSIM4v6ggidlg; - double BSIM4v6ggidls; - double BSIM4v6ggidlb; - double BSIM4v6ggisld; - double BSIM4v6ggislg; - double BSIM4v6ggisls; - double BSIM4v6ggislb; - - double BSIM4v6Igcs; - double BSIM4v6gIgcsg; - double BSIM4v6gIgcsd; - double BSIM4v6gIgcss; - double BSIM4v6gIgcsb; - double BSIM4v6Igcd; - double BSIM4v6gIgcdg; - double BSIM4v6gIgcdd; - double BSIM4v6gIgcds; - double BSIM4v6gIgcdb; - - double BSIM4v6Igs; - double BSIM4v6gIgsg; - double BSIM4v6gIgss; - double BSIM4v6Igd; - double BSIM4v6gIgdg; - double BSIM4v6gIgdd; - - double BSIM4v6Igb; - double BSIM4v6gIgbg; - double BSIM4v6gIgbd; - double BSIM4v6gIgbs; - double BSIM4v6gIgbb; - - double BSIM4v6grdsw; - double BSIM4v6IdovVds; - double BSIM4v6gcrg; - double BSIM4v6gcrgd; - double BSIM4v6gcrgg; - double BSIM4v6gcrgs; - double BSIM4v6gcrgb; - - double BSIM4v6gstot; - double BSIM4v6gstotd; - double BSIM4v6gstotg; - double BSIM4v6gstots; - double BSIM4v6gstotb; - - double BSIM4v6gdtot; - double BSIM4v6gdtotd; - double BSIM4v6gdtotg; - double BSIM4v6gdtots; - double BSIM4v6gdtotb; - - double BSIM4v6cggb; - double BSIM4v6cgdb; - double BSIM4v6cgsb; - double BSIM4v6cbgb; - double BSIM4v6cbdb; - double BSIM4v6cbsb; - double BSIM4v6cdgb; - double BSIM4v6cddb; - double BSIM4v6cdsb; - double BSIM4v6csgb; - double BSIM4v6csdb; - double BSIM4v6cssb; - double BSIM4v6cgbb; - double BSIM4v6cdbb; - double BSIM4v6csbb; - double BSIM4v6cbbb; - double BSIM4v6capbd; - double BSIM4v6capbs; - - double BSIM4v6cqgb; - double BSIM4v6cqdb; - double BSIM4v6cqsb; - double BSIM4v6cqbb; - - double BSIM4v6qgate; - double BSIM4v6qbulk; - double BSIM4v6qdrn; - double BSIM4v6qsrc; - double BSIM4v6qdef; - - double BSIM4v6qchqs; - double BSIM4v6taunet; - double BSIM4v6gtau; - double BSIM4v6gtg; - double BSIM4v6gtd; - double BSIM4v6gts; - double BSIM4v6gtb; - double BSIM4v6SjctTempRevSatCur; - double BSIM4v6DjctTempRevSatCur; - double BSIM4v6SswTempRevSatCur; - double BSIM4v6DswTempRevSatCur; - double BSIM4v6SswgTempRevSatCur; - double BSIM4v6DswgTempRevSatCur; - - struct bsim4v6SizeDependParam *pParam; - - unsigned BSIM4v6lGiven :1; - unsigned BSIM4v6wGiven :1; - unsigned BSIM4v6mGiven :1; - unsigned BSIM4v6nfGiven :1; - unsigned BSIM4v6minGiven :1; - unsigned BSIM4v6drainAreaGiven :1; - unsigned BSIM4v6sourceAreaGiven :1; - unsigned BSIM4v6drainSquaresGiven :1; - unsigned BSIM4v6sourceSquaresGiven :1; - unsigned BSIM4v6drainPerimeterGiven :1; - unsigned BSIM4v6sourcePerimeterGiven :1; - unsigned BSIM4v6saGiven :1; - unsigned BSIM4v6sbGiven :1; - unsigned BSIM4v6sdGiven :1; - unsigned BSIM4v6scaGiven :1; - unsigned BSIM4v6scbGiven :1; - unsigned BSIM4v6sccGiven :1; - unsigned BSIM4v6scGiven :1; - unsigned BSIM4v6rbdbGiven :1; - unsigned BSIM4v6rbsbGiven :1; - unsigned BSIM4v6rbpbGiven :1; - unsigned BSIM4v6rbpdGiven :1; - unsigned BSIM4v6rbpsGiven :1; - unsigned BSIM4v6delvtoGiven :1; - unsigned BSIM4v6xgwGiven :1; - unsigned BSIM4v6ngconGiven :1; - unsigned BSIM4v6icVDSGiven :1; - unsigned BSIM4v6icVGSGiven :1; - unsigned BSIM4v6icVBSGiven :1; - unsigned BSIM4v6trnqsModGiven :1; - unsigned BSIM4v6acnqsModGiven :1; - unsigned BSIM4v6rbodyModGiven :1; - unsigned BSIM4v6rgateModGiven :1; - unsigned BSIM4v6geoModGiven :1; - unsigned BSIM4v6rgeoModGiven :1; - - - double *BSIM4v6DPdPtr; - double *BSIM4v6DPdpPtr; - double *BSIM4v6DPgpPtr; - double *BSIM4v6DPgmPtr; - double *BSIM4v6DPspPtr; - double *BSIM4v6DPbpPtr; - double *BSIM4v6DPdbPtr; - - double *BSIM4v6DdPtr; - double *BSIM4v6DdpPtr; - - double *BSIM4v6GPdpPtr; - double *BSIM4v6GPgpPtr; - double *BSIM4v6GPgmPtr; - double *BSIM4v6GPgePtr; - double *BSIM4v6GPspPtr; - double *BSIM4v6GPbpPtr; - - double *BSIM4v6GMdpPtr; - double *BSIM4v6GMgpPtr; - double *BSIM4v6GMgmPtr; - double *BSIM4v6GMgePtr; - double *BSIM4v6GMspPtr; - double *BSIM4v6GMbpPtr; - - double *BSIM4v6GEdpPtr; - double *BSIM4v6GEgpPtr; - double *BSIM4v6GEgmPtr; - double *BSIM4v6GEgePtr; - double *BSIM4v6GEspPtr; - double *BSIM4v6GEbpPtr; - - double *BSIM4v6SPdpPtr; - double *BSIM4v6SPgpPtr; - double *BSIM4v6SPgmPtr; - double *BSIM4v6SPsPtr; - double *BSIM4v6SPspPtr; - double *BSIM4v6SPbpPtr; - double *BSIM4v6SPsbPtr; - - double *BSIM4v6SspPtr; - double *BSIM4v6SsPtr; - - double *BSIM4v6BPdpPtr; - double *BSIM4v6BPgpPtr; - double *BSIM4v6BPgmPtr; - double *BSIM4v6BPspPtr; - double *BSIM4v6BPdbPtr; - double *BSIM4v6BPbPtr; - double *BSIM4v6BPsbPtr; - double *BSIM4v6BPbpPtr; - - double *BSIM4v6DBdpPtr; - double *BSIM4v6DBdbPtr; - double *BSIM4v6DBbpPtr; - double *BSIM4v6DBbPtr; - - double *BSIM4v6SBspPtr; - double *BSIM4v6SBbpPtr; - double *BSIM4v6SBbPtr; - double *BSIM4v6SBsbPtr; - - double *BSIM4v6BdbPtr; - double *BSIM4v6BbpPtr; - double *BSIM4v6BsbPtr; - double *BSIM4v6BbPtr; - - double *BSIM4v6DgpPtr; - double *BSIM4v6DspPtr; - double *BSIM4v6DbpPtr; - double *BSIM4v6SdpPtr; - double *BSIM4v6SgpPtr; - double *BSIM4v6SbpPtr; - - double *BSIM4v6QdpPtr; - double *BSIM4v6QgpPtr; - double *BSIM4v6QspPtr; - double *BSIM4v6QbpPtr; - double *BSIM4v6QqPtr; - double *BSIM4v6DPqPtr; - double *BSIM4v6GPqPtr; - double *BSIM4v6SPqPtr; - -#ifdef USE_OMP - /* per instance storage of results, to update matrix at a later stge */ - double BSIM4v6rhsdPrime; - double BSIM4v6rhsgPrime; - double BSIM4v6rhsgExt; - double BSIM4v6grhsMid; - double BSIM4v6rhsbPrime; - double BSIM4v6rhssPrime; - double BSIM4v6rhsdb; - double BSIM4v6rhssb; - double BSIM4v6rhsd; - double BSIM4v6rhss; - double BSIM4v6rhsq; - - double BSIM4v6_1; - double BSIM4v6_2; - double BSIM4v6_3; - double BSIM4v6_4; - double BSIM4v6_5; - double BSIM4v6_6; - double BSIM4v6_7; - double BSIM4v6_8; - double BSIM4v6_9; - double BSIM4v6_10; - double BSIM4v6_11; - double BSIM4v6_12; - double BSIM4v6_13; - double BSIM4v6_14; - double BSIM4v6_15; - double BSIM4v6_16; - double BSIM4v6_17; - double BSIM4v6_18; - double BSIM4v6_19; - double BSIM4v6_20; - double BSIM4v6_21; - double BSIM4v6_22; - double BSIM4v6_23; - double BSIM4v6_24; - double BSIM4v6_25; - double BSIM4v6_26; - double BSIM4v6_27; - double BSIM4v6_28; - double BSIM4v6_29; - double BSIM4v6_30; - double BSIM4v6_31; - double BSIM4v6_32; - double BSIM4v6_33; - double BSIM4v6_34; - double BSIM4v6_35; - double BSIM4v6_36; - double BSIM4v6_37; - double BSIM4v6_38; - double BSIM4v6_39; - double BSIM4v6_40; - double BSIM4v6_41; - double BSIM4v6_42; - double BSIM4v6_43; - double BSIM4v6_44; - double BSIM4v6_45; - double BSIM4v6_46; - double BSIM4v6_47; - double BSIM4v6_48; - double BSIM4v6_49; - double BSIM4v6_50; - double BSIM4v6_51; - double BSIM4v6_52; - double BSIM4v6_53; - double BSIM4v6_54; - double BSIM4v6_55; - double BSIM4v6_56; - double BSIM4v6_57; - double BSIM4v6_58; - double BSIM4v6_59; - double BSIM4v6_60; - double BSIM4v6_61; - double BSIM4v6_62; - double BSIM4v6_63; - double BSIM4v6_64; - double BSIM4v6_65; - double BSIM4v6_66; - double BSIM4v6_67; - double BSIM4v6_68; - double BSIM4v6_69; - double BSIM4v6_70; - double BSIM4v6_71; - double BSIM4v6_72; - double BSIM4v6_73; - double BSIM4v6_74; - double BSIM4v6_75; - double BSIM4v6_76; - double BSIM4v6_77; - double BSIM4v6_78; - double BSIM4v6_79; - double BSIM4v6_80; - double BSIM4v6_81; - double BSIM4v6_82; - double BSIM4v6_83; - double BSIM4v6_84; - double BSIM4v6_85; - double BSIM4v6_86; - double BSIM4v6_87; - double BSIM4v6_88; - double BSIM4v6_89; - double BSIM4v6_90; - double BSIM4v6_91; - double BSIM4v6_92; - double BSIM4v6_93; - double BSIM4v6_94; - double BSIM4v6_95; - double BSIM4v6_96; - double BSIM4v6_97; - double BSIM4v6_98; - double BSIM4v6_99; - double BSIM4v6_100; - double BSIM4v6_101; - double BSIM4v6_102; - double BSIM4v6_103; - -#endif - -#define BSIM4v6vbd BSIM4v6states+ 0 -#define BSIM4v6vbs BSIM4v6states+ 1 -#define BSIM4v6vgs BSIM4v6states+ 2 -#define BSIM4v6vds BSIM4v6states+ 3 -#define BSIM4v6vdbs BSIM4v6states+ 4 -#define BSIM4v6vdbd BSIM4v6states+ 5 -#define BSIM4v6vsbs BSIM4v6states+ 6 -#define BSIM4v6vges BSIM4v6states+ 7 -#define BSIM4v6vgms BSIM4v6states+ 8 -#define BSIM4v6vses BSIM4v6states+ 9 -#define BSIM4v6vdes BSIM4v6states+ 10 - -#define BSIM4v6qb BSIM4v6states+ 11 -#define BSIM4v6cqb BSIM4v6states+ 12 -#define BSIM4v6qg BSIM4v6states+ 13 -#define BSIM4v6cqg BSIM4v6states+ 14 -#define BSIM4v6qd BSIM4v6states+ 15 -#define BSIM4v6cqd BSIM4v6states+ 16 -#define BSIM4v6qgmid BSIM4v6states+ 17 -#define BSIM4v6cqgmid BSIM4v6states+ 18 - -#define BSIM4v6qbs BSIM4v6states+ 19 -#define BSIM4v6cqbs BSIM4v6states+ 20 -#define BSIM4v6qbd BSIM4v6states+ 21 -#define BSIM4v6cqbd BSIM4v6states+ 22 - -#define BSIM4v6qcheq BSIM4v6states+ 23 -#define BSIM4v6cqcheq BSIM4v6states+ 24 -#define BSIM4v6qcdump BSIM4v6states+ 25 -#define BSIM4v6cqcdump BSIM4v6states+ 26 -#define BSIM4v6qdef BSIM4v6states+ 27 -#define BSIM4v6qs BSIM4v6states+ 28 - -#define BSIM4v6numStates 29 - - -/* indices to the array of BSIM4v6 NOISE SOURCES */ - -#define BSIM4v6RDNOIZ 0 -#define BSIM4v6RSNOIZ 1 -#define BSIM4v6RGNOIZ 2 -#define BSIM4v6RBPSNOIZ 3 -#define BSIM4v6RBPDNOIZ 4 -#define BSIM4v6RBPBNOIZ 5 -#define BSIM4v6RBSBNOIZ 6 -#define BSIM4v6RBDBNOIZ 7 -#define BSIM4v6IDNOIZ 8 -#define BSIM4v6FLNOIZ 9 -#define BSIM4v6IGSNOIZ 10 -#define BSIM4v6IGDNOIZ 11 -#define BSIM4v6IGBNOIZ 12 -#define BSIM4v6TOTNOIZ 13 - -#define BSIM4v6NSRCS 14 /* Number of BSIM4v6 noise sources */ - -#ifndef NONOISE - double BSIM4v6nVar[NSTATVARS][BSIM4v6NSRCS]; -#else /* NONOISE */ - double **BSIM4v6nVar; -#endif /* NONOISE */ - -} BSIM4v6instance ; - -struct bsim4v6SizeDependParam -{ - double Width; - double Length; - double NFinger; - - double BSIM4v6cdsc; - double BSIM4v6cdscb; - double BSIM4v6cdscd; - double BSIM4v6cit; - double BSIM4v6nfactor; - double BSIM4v6xj; - double BSIM4v6vsat; - double BSIM4v6at; - double BSIM4v6a0; - double BSIM4v6ags; - double BSIM4v6a1; - double BSIM4v6a2; - double BSIM4v6keta; - double BSIM4v6nsub; - double BSIM4v6ndep; - double BSIM4v6nsd; - double BSIM4v6phin; - double BSIM4v6ngate; - double BSIM4v6gamma1; - double BSIM4v6gamma2; - double BSIM4v6vbx; - double BSIM4v6vbi; - double BSIM4v6vbm; - double BSIM4v6xt; - double BSIM4v6phi; - double BSIM4v6litl; - double BSIM4v6k1; - double BSIM4v6kt1; - double BSIM4v6kt1l; - double BSIM4v6kt2; - double BSIM4v6k2; - double BSIM4v6k3; - double BSIM4v6k3b; - double BSIM4v6w0; - double BSIM4v6dvtp0; - double BSIM4v6dvtp1; - double BSIM4v6lpe0; - double BSIM4v6lpeb; - double BSIM4v6dvt0; - double BSIM4v6dvt1; - double BSIM4v6dvt2; - double BSIM4v6dvt0w; - double BSIM4v6dvt1w; - double BSIM4v6dvt2w; - double BSIM4v6drout; - double BSIM4v6dsub; - double BSIM4v6vth0; - double BSIM4v6ua; - double BSIM4v6ua1; - double BSIM4v6ub; - double BSIM4v6ub1; - double BSIM4v6uc; - double BSIM4v6uc1; - double BSIM4v6ud; - double BSIM4v6ud1; - double BSIM4v6up; - double BSIM4v6lp; - double BSIM4v6u0; - double BSIM4v6eu; - double BSIM4v6ucs; - double BSIM4v6ute; - double BSIM4v6ucste; - double BSIM4v6voff; - double BSIM4v6tvoff; - double BSIM4v6minv; - double BSIM4v6minvcv; - double BSIM4v6vfb; - double BSIM4v6delta; - double BSIM4v6rdsw; - double BSIM4v6rds0; - double BSIM4v6rs0; - double BSIM4v6rd0; - double BSIM4v6rsw; - double BSIM4v6rdw; - double BSIM4v6prwg; - double BSIM4v6prwb; - double BSIM4v6prt; - double BSIM4v6eta0; - double BSIM4v6etab; - double BSIM4v6pclm; - double BSIM4v6pdibl1; - double BSIM4v6pdibl2; - double BSIM4v6pdiblb; - double BSIM4v6fprout; - double BSIM4v6pdits; - double BSIM4v6pditsd; - double BSIM4v6pscbe1; - double BSIM4v6pscbe2; - double BSIM4v6pvag; - double BSIM4v6wr; - double BSIM4v6dwg; - double BSIM4v6dwb; - double BSIM4v6b0; - double BSIM4v6b1; - double BSIM4v6alpha0; - double BSIM4v6alpha1; - double BSIM4v6beta0; - double BSIM4v6agidl; - double BSIM4v6bgidl; - double BSIM4v6cgidl; - double BSIM4v6egidl; - double BSIM4v6agisl; - double BSIM4v6bgisl; - double BSIM4v6cgisl; - double BSIM4v6egisl; - double BSIM4v6aigc; - double BSIM4v6bigc; - double BSIM4v6cigc; - double BSIM4v6aigs; - double BSIM4v6bigs; - double BSIM4v6cigs; - double BSIM4v6aigd; - double BSIM4v6bigd; - double BSIM4v6cigd; - double BSIM4v6aigbacc; - double BSIM4v6bigbacc; - double BSIM4v6cigbacc; - double BSIM4v6aigbinv; - double BSIM4v6bigbinv; - double BSIM4v6cigbinv; - double BSIM4v6nigc; - double BSIM4v6nigbacc; - double BSIM4v6nigbinv; - double BSIM4v6ntox; - double BSIM4v6eigbinv; - double BSIM4v6pigcd; - double BSIM4v6poxedge; - double BSIM4v6xrcrg1; - double BSIM4v6xrcrg2; - double BSIM4v6lambda; /* overshoot */ - double BSIM4v6vtl; /* thermal velocity limit */ - double BSIM4v6xn; /* back scattering parameter */ - double BSIM4v6lc; /* back scattering parameter */ - double BSIM4v6tfactor; /* ballistic transportation factor */ - double BSIM4v6vfbsdoff; /* S/D flatband offset voltage */ - double BSIM4v6tvfbsdoff; - -/* added for stress effect */ - double BSIM4v6ku0; - double BSIM4v6kvth0; - double BSIM4v6ku0temp; - double BSIM4v6rho_ref; - double BSIM4v6inv_od_ref; -/* added for well proximity effect */ - double BSIM4v6kvth0we; - double BSIM4v6k2we; - double BSIM4v6ku0we; - - /* CV model */ - double BSIM4v6cgsl; - double BSIM4v6cgdl; - double BSIM4v6ckappas; - double BSIM4v6ckappad; - double BSIM4v6cf; - double BSIM4v6clc; - double BSIM4v6cle; - double BSIM4v6vfbcv; - double BSIM4v6noff; - double BSIM4v6voffcv; - double BSIM4v6acde; - double BSIM4v6moin; - -/* Pre-calculated constants */ - - double BSIM4v6dw; - double BSIM4v6dl; - double BSIM4v6leff; - double BSIM4v6weff; - - double BSIM4v6dwc; - double BSIM4v6dlc; - double BSIM4v6dwj; - double BSIM4v6leffCV; - double BSIM4v6weffCV; - double BSIM4v6weffCJ; - double BSIM4v6abulkCVfactor; - double BSIM4v6cgso; - double BSIM4v6cgdo; - double BSIM4v6cgbo; - - double BSIM4v6u0temp; - double BSIM4v6vsattemp; - double BSIM4v6sqrtPhi; - double BSIM4v6phis3; - double BSIM4v6Xdep0; - double BSIM4v6sqrtXdep0; - double BSIM4v6theta0vb0; - double BSIM4v6thetaRout; - double BSIM4v6mstar; - double BSIM4v6VgsteffVth; - double BSIM4v6mstarcv; - double BSIM4v6voffcbn; - double BSIM4v6voffcbncv; - double BSIM4v6rdswmin; - double BSIM4v6rdwmin; - double BSIM4v6rswmin; - double BSIM4v6vfbsd; - - double BSIM4v6cof1; - double BSIM4v6cof2; - double BSIM4v6cof3; - double BSIM4v6cof4; - double BSIM4v6cdep0; - double BSIM4v6ToxRatio; - double BSIM4v6Aechvb; - double BSIM4v6Bechvb; - double BSIM4v6ToxRatioEdge; - double BSIM4v6AechvbEdgeS; - double BSIM4v6AechvbEdgeD; - double BSIM4v6BechvbEdge; - double BSIM4v6ldeb; - double BSIM4v6k1ox; - double BSIM4v6k2ox; - double BSIM4v6vfbzbfactor; - - struct bsim4v6SizeDependParam *pNext; -}; - - -typedef struct sBSIM4v6model -{ - - struct GENmodel gen; - -#define BSIM4v6modType gen.GENmodType -#define BSIM4v6nextModel(inst) ((struct sBSIM4v6model *)((inst)->gen.GENnextModel)) -#define BSIM4v6instances(inst) ((BSIM4v6instance *)((inst)->gen.GENinstances)) -#define BSIM4v6modName gen.GENmodName - - int BSIM4v6type; - - int BSIM4v6mobMod; - int BSIM4v6cvchargeMod; - int BSIM4v6capMod; - int BSIM4v6dioMod; - int BSIM4v6trnqsMod; - int BSIM4v6acnqsMod; - int BSIM4v6fnoiMod; - int BSIM4v6tnoiMod; - int BSIM4v6rdsMod; - int BSIM4v6rbodyMod; - int BSIM4v6rgateMod; - int BSIM4v6perMod; - int BSIM4v6geoMod; - int BSIM4v6rgeoMod; - int BSIM4v6mtrlMod; - int BSIM4v6igcMod; - int BSIM4v6igbMod; - int BSIM4v6tempMod; - int BSIM4v6binUnit; - int BSIM4v6paramChk; - char *BSIM4v6version; - double BSIM4v6eot; - double BSIM4v6vddeot; - double BSIM4v6tempeot; - double BSIM4v6leffeot; - double BSIM4v6weffeot; - double BSIM4v6ados; - double BSIM4v6bdos; - double BSIM4v6toxe; - double BSIM4v6toxp; - double BSIM4v6toxm; - double BSIM4v6dtox; - double BSIM4v6epsrox; - double BSIM4v6cdsc; - double BSIM4v6cdscb; - double BSIM4v6cdscd; - double BSIM4v6cit; - double BSIM4v6nfactor; - double BSIM4v6xj; - double BSIM4v6vsat; - double BSIM4v6at; - double BSIM4v6a0; - double BSIM4v6ags; - double BSIM4v6a1; - double BSIM4v6a2; - double BSIM4v6keta; - double BSIM4v6nsub; - double BSIM4v6phig; - double BSIM4v6epsrgate; - double BSIM4v6easub; - double BSIM4v6epsrsub; - double BSIM4v6ni0sub; - double BSIM4v6bg0sub; - double BSIM4v6tbgasub; - double BSIM4v6tbgbsub; - double BSIM4v6ndep; - double BSIM4v6nsd; - double BSIM4v6phin; - double BSIM4v6ngate; - double BSIM4v6gamma1; - double BSIM4v6gamma2; - double BSIM4v6vbx; - double BSIM4v6vbm; - double BSIM4v6xt; - double BSIM4v6k1; - double BSIM4v6kt1; - double BSIM4v6kt1l; - double BSIM4v6kt2; - double BSIM4v6k2; - double BSIM4v6k3; - double BSIM4v6k3b; - double BSIM4v6w0; - double BSIM4v6dvtp0; - double BSIM4v6dvtp1; - double BSIM4v6lpe0; - double BSIM4v6lpeb; - double BSIM4v6dvt0; - double BSIM4v6dvt1; - double BSIM4v6dvt2; - double BSIM4v6dvt0w; - double BSIM4v6dvt1w; - double BSIM4v6dvt2w; - double BSIM4v6drout; - double BSIM4v6dsub; - double BSIM4v6vth0; - double BSIM4v6eu; - double BSIM4v6ucs; - double BSIM4v6ua; - double BSIM4v6ua1; - double BSIM4v6ub; - double BSIM4v6ub1; - double BSIM4v6uc; - double BSIM4v6uc1; - double BSIM4v6ud; - double BSIM4v6ud1; - double BSIM4v6up; - double BSIM4v6lp; - double BSIM4v6u0; - double BSIM4v6ute; - double BSIM4v6ucste; - double BSIM4v6voff; - double BSIM4v6tvoff; - double BSIM4v6minv; - double BSIM4v6minvcv; - double BSIM4v6voffl; - double BSIM4v6voffcvl; - double BSIM4v6delta; - double BSIM4v6rdsw; - double BSIM4v6rdswmin; - double BSIM4v6rdwmin; - double BSIM4v6rswmin; - double BSIM4v6rsw; - double BSIM4v6rdw; - double BSIM4v6prwg; - double BSIM4v6prwb; - double BSIM4v6prt; - double BSIM4v6eta0; - double BSIM4v6etab; - double BSIM4v6pclm; - double BSIM4v6pdibl1; - double BSIM4v6pdibl2; - double BSIM4v6pdiblb; - double BSIM4v6fprout; - double BSIM4v6pdits; - double BSIM4v6pditsd; - double BSIM4v6pditsl; - double BSIM4v6pscbe1; - double BSIM4v6pscbe2; - double BSIM4v6pvag; - double BSIM4v6wr; - double BSIM4v6dwg; - double BSIM4v6dwb; - double BSIM4v6b0; - double BSIM4v6b1; - double BSIM4v6alpha0; - double BSIM4v6alpha1; - double BSIM4v6beta0; - double BSIM4v6agidl; - double BSIM4v6bgidl; - double BSIM4v6cgidl; - double BSIM4v6egidl; - double BSIM4v6agisl; - double BSIM4v6bgisl; - double BSIM4v6cgisl; - double BSIM4v6egisl; - double BSIM4v6aigc; - double BSIM4v6bigc; - double BSIM4v6cigc; - double BSIM4v6aigsd; - double BSIM4v6bigsd; - double BSIM4v6cigsd; - double BSIM4v6aigs; - double BSIM4v6bigs; - double BSIM4v6cigs; - double BSIM4v6aigd; - double BSIM4v6bigd; - double BSIM4v6cigd; - double BSIM4v6aigbacc; - double BSIM4v6bigbacc; - double BSIM4v6cigbacc; - double BSIM4v6aigbinv; - double BSIM4v6bigbinv; - double BSIM4v6cigbinv; - double BSIM4v6nigc; - double BSIM4v6nigbacc; - double BSIM4v6nigbinv; - double BSIM4v6ntox; - double BSIM4v6eigbinv; - double BSIM4v6pigcd; - double BSIM4v6poxedge; - double BSIM4v6toxref; - double BSIM4v6ijthdfwd; - double BSIM4v6ijthsfwd; - double BSIM4v6ijthdrev; - double BSIM4v6ijthsrev; - double BSIM4v6xjbvd; - double BSIM4v6xjbvs; - double BSIM4v6bvd; - double BSIM4v6bvs; - - double BSIM4v6jtss; - double BSIM4v6jtsd; - double BSIM4v6jtssws; - double BSIM4v6jtsswd; - double BSIM4v6jtsswgs; - double BSIM4v6jtsswgd; - double BSIM4v6jtweff; - double BSIM4v6njts; - double BSIM4v6njtssw; - double BSIM4v6njtsswg; - double BSIM4v6njtsd; - double BSIM4v6njtsswd; - double BSIM4v6njtsswgd; - double BSIM4v6xtss; - double BSIM4v6xtsd; - double BSIM4v6xtssws; - double BSIM4v6xtsswd; - double BSIM4v6xtsswgs; - double BSIM4v6xtsswgd; - double BSIM4v6tnjts; - double BSIM4v6tnjtssw; - double BSIM4v6tnjtsswg; - double BSIM4v6tnjtsd; - double BSIM4v6tnjtsswd; - double BSIM4v6tnjtsswgd; - double BSIM4v6vtss; - double BSIM4v6vtsd; - double BSIM4v6vtssws; - double BSIM4v6vtsswd; - double BSIM4v6vtsswgs; - double BSIM4v6vtsswgd; - - double BSIM4v6xrcrg1; - double BSIM4v6xrcrg2; - double BSIM4v6lambda; - double BSIM4v6vtl; - double BSIM4v6lc; - double BSIM4v6xn; - double BSIM4v6vfbsdoff; /* S/D flatband offset voltage */ - double BSIM4v6lintnoi; /* lint offset for noise calculation */ - double BSIM4v6tvfbsdoff; - - double BSIM4v6vfb; - double BSIM4v6gbmin; - double BSIM4v6rbdb; - double BSIM4v6rbsb; - double BSIM4v6rbpb; - double BSIM4v6rbps; - double BSIM4v6rbpd; - - double BSIM4v6rbps0; - double BSIM4v6rbpsl; - double BSIM4v6rbpsw; - double BSIM4v6rbpsnf; - - double BSIM4v6rbpd0; - double BSIM4v6rbpdl; - double BSIM4v6rbpdw; - double BSIM4v6rbpdnf; - - double BSIM4v6rbpbx0; - double BSIM4v6rbpbxl; - double BSIM4v6rbpbxw; - double BSIM4v6rbpbxnf; - double BSIM4v6rbpby0; - double BSIM4v6rbpbyl; - double BSIM4v6rbpbyw; - double BSIM4v6rbpbynf; - - double BSIM4v6rbsbx0; - double BSIM4v6rbsby0; - double BSIM4v6rbdbx0; - double BSIM4v6rbdby0; - - double BSIM4v6rbsdbxl; - double BSIM4v6rbsdbxw; - double BSIM4v6rbsdbxnf; - double BSIM4v6rbsdbyl; - double BSIM4v6rbsdbyw; - double BSIM4v6rbsdbynf; - - double BSIM4v6tnoia; - double BSIM4v6tnoib; - double BSIM4v6rnoia; - double BSIM4v6rnoib; - double BSIM4v6ntnoi; - - /* CV model and Parasitics */ - double BSIM4v6cgsl; - double BSIM4v6cgdl; - double BSIM4v6ckappas; - double BSIM4v6ckappad; - double BSIM4v6cf; - double BSIM4v6vfbcv; - double BSIM4v6clc; - double BSIM4v6cle; - double BSIM4v6dwc; - double BSIM4v6dlc; - double BSIM4v6xw; - double BSIM4v6xl; - double BSIM4v6dlcig; - double BSIM4v6dlcigd; - double BSIM4v6dwj; - double BSIM4v6noff; - double BSIM4v6voffcv; - double BSIM4v6acde; - double BSIM4v6moin; - double BSIM4v6tcj; - double BSIM4v6tcjsw; - double BSIM4v6tcjswg; - double BSIM4v6tpb; - double BSIM4v6tpbsw; - double BSIM4v6tpbswg; - double BSIM4v6dmcg; - double BSIM4v6dmci; - double BSIM4v6dmdg; - double BSIM4v6dmcgt; - double BSIM4v6xgw; - double BSIM4v6xgl; - double BSIM4v6rshg; - double BSIM4v6ngcon; - - /* Length Dependence */ - double BSIM4v6lcdsc; - double BSIM4v6lcdscb; - double BSIM4v6lcdscd; - double BSIM4v6lcit; - double BSIM4v6lnfactor; - double BSIM4v6lxj; - double BSIM4v6lvsat; - double BSIM4v6lat; - double BSIM4v6la0; - double BSIM4v6lags; - double BSIM4v6la1; - double BSIM4v6la2; - double BSIM4v6lketa; - double BSIM4v6lnsub; - double BSIM4v6lndep; - double BSIM4v6lnsd; - double BSIM4v6lphin; - double BSIM4v6lngate; - double BSIM4v6lgamma1; - double BSIM4v6lgamma2; - double BSIM4v6lvbx; - double BSIM4v6lvbm; - double BSIM4v6lxt; - double BSIM4v6lk1; - double BSIM4v6lkt1; - double BSIM4v6lkt1l; - double BSIM4v6lkt2; - double BSIM4v6lk2; - double BSIM4v6lk3; - double BSIM4v6lk3b; - double BSIM4v6lw0; - double BSIM4v6ldvtp0; - double BSIM4v6ldvtp1; - double BSIM4v6llpe0; - double BSIM4v6llpeb; - double BSIM4v6ldvt0; - double BSIM4v6ldvt1; - double BSIM4v6ldvt2; - double BSIM4v6ldvt0w; - double BSIM4v6ldvt1w; - double BSIM4v6ldvt2w; - double BSIM4v6ldrout; - double BSIM4v6ldsub; - double BSIM4v6lvth0; - double BSIM4v6lua; - double BSIM4v6lua1; - double BSIM4v6lub; - double BSIM4v6lub1; - double BSIM4v6luc; - double BSIM4v6luc1; - double BSIM4v6lud; - double BSIM4v6lud1; - double BSIM4v6lup; - double BSIM4v6llp; - double BSIM4v6lu0; - double BSIM4v6leu; - double BSIM4v6lucs; - double BSIM4v6lute; - double BSIM4v6lucste; - double BSIM4v6lvoff; - double BSIM4v6ltvoff; - double BSIM4v6lminv; - double BSIM4v6lminvcv; - double BSIM4v6ldelta; - double BSIM4v6lrdsw; - double BSIM4v6lrsw; - double BSIM4v6lrdw; - double BSIM4v6lprwg; - double BSIM4v6lprwb; - double BSIM4v6lprt; - double BSIM4v6leta0; - double BSIM4v6letab; - double BSIM4v6lpclm; - double BSIM4v6lpdibl1; - double BSIM4v6lpdibl2; - double BSIM4v6lpdiblb; - double BSIM4v6lfprout; - double BSIM4v6lpdits; - double BSIM4v6lpditsd; - double BSIM4v6lpscbe1; - double BSIM4v6lpscbe2; - double BSIM4v6lpvag; - double BSIM4v6lwr; - double BSIM4v6ldwg; - double BSIM4v6ldwb; - double BSIM4v6lb0; - double BSIM4v6lb1; - double BSIM4v6lalpha0; - double BSIM4v6lalpha1; - double BSIM4v6lbeta0; - double BSIM4v6lvfb; - double BSIM4v6lagidl; - double BSIM4v6lbgidl; - double BSIM4v6lcgidl; - double BSIM4v6legidl; - double BSIM4v6lagisl; - double BSIM4v6lbgisl; - double BSIM4v6lcgisl; - double BSIM4v6legisl; - double BSIM4v6laigc; - double BSIM4v6lbigc; - double BSIM4v6lcigc; - double BSIM4v6laigsd; - double BSIM4v6lbigsd; - double BSIM4v6lcigsd; - double BSIM4v6laigs; - double BSIM4v6lbigs; - double BSIM4v6lcigs; - double BSIM4v6laigd; - double BSIM4v6lbigd; - double BSIM4v6lcigd; - double BSIM4v6laigbacc; - double BSIM4v6lbigbacc; - double BSIM4v6lcigbacc; - double BSIM4v6laigbinv; - double BSIM4v6lbigbinv; - double BSIM4v6lcigbinv; - double BSIM4v6lnigc; - double BSIM4v6lnigbacc; - double BSIM4v6lnigbinv; - double BSIM4v6lntox; - double BSIM4v6leigbinv; - double BSIM4v6lpigcd; - double BSIM4v6lpoxedge; - double BSIM4v6lxrcrg1; - double BSIM4v6lxrcrg2; - double BSIM4v6llambda; - double BSIM4v6lvtl; - double BSIM4v6lxn; - double BSIM4v6lvfbsdoff; - double BSIM4v6ltvfbsdoff; - - /* CV model */ - double BSIM4v6lcgsl; - double BSIM4v6lcgdl; - double BSIM4v6lckappas; - double BSIM4v6lckappad; - double BSIM4v6lcf; - double BSIM4v6lclc; - double BSIM4v6lcle; - double BSIM4v6lvfbcv; - double BSIM4v6lnoff; - double BSIM4v6lvoffcv; - double BSIM4v6lacde; - double BSIM4v6lmoin; - - /* Width Dependence */ - double BSIM4v6wcdsc; - double BSIM4v6wcdscb; - double BSIM4v6wcdscd; - double BSIM4v6wcit; - double BSIM4v6wnfactor; - double BSIM4v6wxj; - double BSIM4v6wvsat; - double BSIM4v6wat; - double BSIM4v6wa0; - double BSIM4v6wags; - double BSIM4v6wa1; - double BSIM4v6wa2; - double BSIM4v6wketa; - double BSIM4v6wnsub; - double BSIM4v6wndep; - double BSIM4v6wnsd; - double BSIM4v6wphin; - double BSIM4v6wngate; - double BSIM4v6wgamma1; - double BSIM4v6wgamma2; - double BSIM4v6wvbx; - double BSIM4v6wvbm; - double BSIM4v6wxt; - double BSIM4v6wk1; - double BSIM4v6wkt1; - double BSIM4v6wkt1l; - double BSIM4v6wkt2; - double BSIM4v6wk2; - double BSIM4v6wk3; - double BSIM4v6wk3b; - double BSIM4v6ww0; - double BSIM4v6wdvtp0; - double BSIM4v6wdvtp1; - double BSIM4v6wlpe0; - double BSIM4v6wlpeb; - double BSIM4v6wdvt0; - double BSIM4v6wdvt1; - double BSIM4v6wdvt2; - double BSIM4v6wdvt0w; - double BSIM4v6wdvt1w; - double BSIM4v6wdvt2w; - double BSIM4v6wdrout; - double BSIM4v6wdsub; - double BSIM4v6wvth0; - double BSIM4v6wua; - double BSIM4v6wua1; - double BSIM4v6wub; - double BSIM4v6wub1; - double BSIM4v6wuc; - double BSIM4v6wuc1; - double BSIM4v6wud; - double BSIM4v6wud1; - double BSIM4v6wup; - double BSIM4v6wlp; - double BSIM4v6wu0; - double BSIM4v6weu; - double BSIM4v6wucs; - double BSIM4v6wute; - double BSIM4v6wucste; - double BSIM4v6wvoff; - double BSIM4v6wtvoff; - double BSIM4v6wminv; - double BSIM4v6wminvcv; - double BSIM4v6wdelta; - double BSIM4v6wrdsw; - double BSIM4v6wrsw; - double BSIM4v6wrdw; - double BSIM4v6wprwg; - double BSIM4v6wprwb; - double BSIM4v6wprt; - double BSIM4v6weta0; - double BSIM4v6wetab; - double BSIM4v6wpclm; - double BSIM4v6wpdibl1; - double BSIM4v6wpdibl2; - double BSIM4v6wpdiblb; - double BSIM4v6wfprout; - double BSIM4v6wpdits; - double BSIM4v6wpditsd; - double BSIM4v6wpscbe1; - double BSIM4v6wpscbe2; - double BSIM4v6wpvag; - double BSIM4v6wwr; - double BSIM4v6wdwg; - double BSIM4v6wdwb; - double BSIM4v6wb0; - double BSIM4v6wb1; - double BSIM4v6walpha0; - double BSIM4v6walpha1; - double BSIM4v6wbeta0; - double BSIM4v6wvfb; - double BSIM4v6wagidl; - double BSIM4v6wbgidl; - double BSIM4v6wcgidl; - double BSIM4v6wegidl; - double BSIM4v6wagisl; - double BSIM4v6wbgisl; - double BSIM4v6wcgisl; - double BSIM4v6wegisl; - double BSIM4v6waigc; - double BSIM4v6wbigc; - double BSIM4v6wcigc; - double BSIM4v6waigsd; - double BSIM4v6wbigsd; - double BSIM4v6wcigsd; - double BSIM4v6waigs; - double BSIM4v6wbigs; - double BSIM4v6wcigs; - double BSIM4v6waigd; - double BSIM4v6wbigd; - double BSIM4v6wcigd; - double BSIM4v6waigbacc; - double BSIM4v6wbigbacc; - double BSIM4v6wcigbacc; - double BSIM4v6waigbinv; - double BSIM4v6wbigbinv; - double BSIM4v6wcigbinv; - double BSIM4v6wnigc; - double BSIM4v6wnigbacc; - double BSIM4v6wnigbinv; - double BSIM4v6wntox; - double BSIM4v6weigbinv; - double BSIM4v6wpigcd; - double BSIM4v6wpoxedge; - double BSIM4v6wxrcrg1; - double BSIM4v6wxrcrg2; - double BSIM4v6wlambda; - double BSIM4v6wvtl; - double BSIM4v6wxn; - double BSIM4v6wvfbsdoff; - double BSIM4v6wtvfbsdoff; - - /* CV model */ - double BSIM4v6wcgsl; - double BSIM4v6wcgdl; - double BSIM4v6wckappas; - double BSIM4v6wckappad; - double BSIM4v6wcf; - double BSIM4v6wclc; - double BSIM4v6wcle; - double BSIM4v6wvfbcv; - double BSIM4v6wnoff; - double BSIM4v6wvoffcv; - double BSIM4v6wacde; - double BSIM4v6wmoin; - - /* Cross-term Dependence */ - double BSIM4v6pcdsc; - double BSIM4v6pcdscb; - double BSIM4v6pcdscd; - double BSIM4v6pcit; - double BSIM4v6pnfactor; - double BSIM4v6pxj; - double BSIM4v6pvsat; - double BSIM4v6pat; - double BSIM4v6pa0; - double BSIM4v6pags; - double BSIM4v6pa1; - double BSIM4v6pa2; - double BSIM4v6pketa; - double BSIM4v6pnsub; - double BSIM4v6pndep; - double BSIM4v6pnsd; - double BSIM4v6pphin; - double BSIM4v6pngate; - double BSIM4v6pgamma1; - double BSIM4v6pgamma2; - double BSIM4v6pvbx; - double BSIM4v6pvbm; - double BSIM4v6pxt; - double BSIM4v6pk1; - double BSIM4v6pkt1; - double BSIM4v6pkt1l; - double BSIM4v6pkt2; - double BSIM4v6pk2; - double BSIM4v6pk3; - double BSIM4v6pk3b; - double BSIM4v6pw0; - double BSIM4v6pdvtp0; - double BSIM4v6pdvtp1; - double BSIM4v6plpe0; - double BSIM4v6plpeb; - double BSIM4v6pdvt0; - double BSIM4v6pdvt1; - double BSIM4v6pdvt2; - double BSIM4v6pdvt0w; - double BSIM4v6pdvt1w; - double BSIM4v6pdvt2w; - double BSIM4v6pdrout; - double BSIM4v6pdsub; - double BSIM4v6pvth0; - double BSIM4v6pua; - double BSIM4v6pua1; - double BSIM4v6pub; - double BSIM4v6pub1; - double BSIM4v6puc; - double BSIM4v6puc1; - double BSIM4v6pud; - double BSIM4v6pud1; - double BSIM4v6pup; - double BSIM4v6plp; - double BSIM4v6pu0; - double BSIM4v6peu; - double BSIM4v6pucs; - double BSIM4v6pute; - double BSIM4v6pucste; - double BSIM4v6pvoff; - double BSIM4v6ptvoff; - double BSIM4v6pminv; - double BSIM4v6pminvcv; - double BSIM4v6pdelta; - double BSIM4v6prdsw; - double BSIM4v6prsw; - double BSIM4v6prdw; - double BSIM4v6pprwg; - double BSIM4v6pprwb; - double BSIM4v6pprt; - double BSIM4v6peta0; - double BSIM4v6petab; - double BSIM4v6ppclm; - double BSIM4v6ppdibl1; - double BSIM4v6ppdibl2; - double BSIM4v6ppdiblb; - double BSIM4v6pfprout; - double BSIM4v6ppdits; - double BSIM4v6ppditsd; - double BSIM4v6ppscbe1; - double BSIM4v6ppscbe2; - double BSIM4v6ppvag; - double BSIM4v6pwr; - double BSIM4v6pdwg; - double BSIM4v6pdwb; - double BSIM4v6pb0; - double BSIM4v6pb1; - double BSIM4v6palpha0; - double BSIM4v6palpha1; - double BSIM4v6pbeta0; - double BSIM4v6pvfb; - double BSIM4v6pagidl; - double BSIM4v6pbgidl; - double BSIM4v6pcgidl; - double BSIM4v6pegidl; - double BSIM4v6pagisl; - double BSIM4v6pbgisl; - double BSIM4v6pcgisl; - double BSIM4v6pegisl; - double BSIM4v6paigc; - double BSIM4v6pbigc; - double BSIM4v6pcigc; - double BSIM4v6paigsd; - double BSIM4v6pbigsd; - double BSIM4v6pcigsd; - double BSIM4v6paigs; - double BSIM4v6pbigs; - double BSIM4v6pcigs; - double BSIM4v6paigd; - double BSIM4v6pbigd; - double BSIM4v6pcigd; - double BSIM4v6paigbacc; - double BSIM4v6pbigbacc; - double BSIM4v6pcigbacc; - double BSIM4v6paigbinv; - double BSIM4v6pbigbinv; - double BSIM4v6pcigbinv; - double BSIM4v6pnigc; - double BSIM4v6pnigbacc; - double BSIM4v6pnigbinv; - double BSIM4v6pntox; - double BSIM4v6peigbinv; - double BSIM4v6ppigcd; - double BSIM4v6ppoxedge; - double BSIM4v6pxrcrg1; - double BSIM4v6pxrcrg2; - double BSIM4v6plambda; - double BSIM4v6pvtl; - double BSIM4v6pxn; - double BSIM4v6pvfbsdoff; - double BSIM4v6ptvfbsdoff; - - /* CV model */ - double BSIM4v6pcgsl; - double BSIM4v6pcgdl; - double BSIM4v6pckappas; - double BSIM4v6pckappad; - double BSIM4v6pcf; - double BSIM4v6pclc; - double BSIM4v6pcle; - double BSIM4v6pvfbcv; - double BSIM4v6pnoff; - double BSIM4v6pvoffcv; - double BSIM4v6pacde; - double BSIM4v6pmoin; - - double BSIM4v6tnom; - double BSIM4v6cgso; - double BSIM4v6cgdo; - double BSIM4v6cgbo; - double BSIM4v6xpart; - double BSIM4v6cFringOut; - double BSIM4v6cFringMax; - - double BSIM4v6sheetResistance; - double BSIM4v6SjctSatCurDensity; - double BSIM4v6DjctSatCurDensity; - double BSIM4v6SjctSidewallSatCurDensity; - double BSIM4v6DjctSidewallSatCurDensity; - double BSIM4v6SjctGateSidewallSatCurDensity; - double BSIM4v6DjctGateSidewallSatCurDensity; - double BSIM4v6SbulkJctPotential; - double BSIM4v6DbulkJctPotential; - double BSIM4v6SbulkJctBotGradingCoeff; - double BSIM4v6DbulkJctBotGradingCoeff; - double BSIM4v6SbulkJctSideGradingCoeff; - double BSIM4v6DbulkJctSideGradingCoeff; - double BSIM4v6SbulkJctGateSideGradingCoeff; - double BSIM4v6DbulkJctGateSideGradingCoeff; - double BSIM4v6SsidewallJctPotential; - double BSIM4v6DsidewallJctPotential; - double BSIM4v6SGatesidewallJctPotential; - double BSIM4v6DGatesidewallJctPotential; - double BSIM4v6SunitAreaJctCap; - double BSIM4v6DunitAreaJctCap; - double BSIM4v6SunitLengthSidewallJctCap; - double BSIM4v6DunitLengthSidewallJctCap; - double BSIM4v6SunitLengthGateSidewallJctCap; - double BSIM4v6DunitLengthGateSidewallJctCap; - double BSIM4v6SjctEmissionCoeff; - double BSIM4v6DjctEmissionCoeff; - double BSIM4v6SjctTempExponent; - double BSIM4v6DjctTempExponent; - double BSIM4v6njtsstemp; - double BSIM4v6njtsswstemp; - double BSIM4v6njtsswgstemp; - double BSIM4v6njtsdtemp; - double BSIM4v6njtsswdtemp; - double BSIM4v6njtsswgdtemp; - - double BSIM4v6Lint; - double BSIM4v6Ll; - double BSIM4v6Llc; - double BSIM4v6Lln; - double BSIM4v6Lw; - double BSIM4v6Lwc; - double BSIM4v6Lwn; - double BSIM4v6Lwl; - double BSIM4v6Lwlc; - double BSIM4v6Lmin; - double BSIM4v6Lmax; - - double BSIM4v6Wint; - double BSIM4v6Wl; - double BSIM4v6Wlc; - double BSIM4v6Wln; - double BSIM4v6Ww; - double BSIM4v6Wwc; - double BSIM4v6Wwn; - double BSIM4v6Wwl; - double BSIM4v6Wwlc; - double BSIM4v6Wmin; - double BSIM4v6Wmax; - - /* added for stress effect */ - double BSIM4v6saref; - double BSIM4v6sbref; - double BSIM4v6wlod; - double BSIM4v6ku0; - double BSIM4v6kvsat; - double BSIM4v6kvth0; - double BSIM4v6tku0; - double BSIM4v6llodku0; - double BSIM4v6wlodku0; - double BSIM4v6llodvth; - double BSIM4v6wlodvth; - double BSIM4v6lku0; - double BSIM4v6wku0; - double BSIM4v6pku0; - double BSIM4v6lkvth0; - double BSIM4v6wkvth0; - double BSIM4v6pkvth0; - double BSIM4v6stk2; - double BSIM4v6lodk2; - double BSIM4v6steta0; - double BSIM4v6lodeta0; - - double BSIM4v6web; - double BSIM4v6wec; - double BSIM4v6kvth0we; - double BSIM4v6k2we; - double BSIM4v6ku0we; - double BSIM4v6scref; - double BSIM4v6wpemod; - double BSIM4v6lkvth0we; - double BSIM4v6lk2we; - double BSIM4v6lku0we; - double BSIM4v6wkvth0we; - double BSIM4v6wk2we; - double BSIM4v6wku0we; - double BSIM4v6pkvth0we; - double BSIM4v6pk2we; - double BSIM4v6pku0we; - -/* Pre-calculated constants - * move to size-dependent param */ - double BSIM4v6Eg0; - double BSIM4v6vtm; - double BSIM4v6vtm0; - double BSIM4v6coxe; - double BSIM4v6coxp; - double BSIM4v6cof1; - double BSIM4v6cof2; - double BSIM4v6cof3; - double BSIM4v6cof4; - double BSIM4v6vcrit; - double BSIM4v6factor1; - double BSIM4v6PhiBS; - double BSIM4v6PhiBSWS; - double BSIM4v6PhiBSWGS; - double BSIM4v6SjctTempSatCurDensity; - double BSIM4v6SjctSidewallTempSatCurDensity; - double BSIM4v6SjctGateSidewallTempSatCurDensity; - double BSIM4v6PhiBD; - double BSIM4v6PhiBSWD; - double BSIM4v6PhiBSWGD; - double BSIM4v6DjctTempSatCurDensity; - double BSIM4v6DjctSidewallTempSatCurDensity; - double BSIM4v6DjctGateSidewallTempSatCurDensity; - double BSIM4v6SunitAreaTempJctCap; - double BSIM4v6DunitAreaTempJctCap; - double BSIM4v6SunitLengthSidewallTempJctCap; - double BSIM4v6DunitLengthSidewallTempJctCap; - double BSIM4v6SunitLengthGateSidewallTempJctCap; - double BSIM4v6DunitLengthGateSidewallTempJctCap; - - double BSIM4v6oxideTrapDensityA; - double BSIM4v6oxideTrapDensityB; - double BSIM4v6oxideTrapDensityC; - double BSIM4v6em; - double BSIM4v6ef; - double BSIM4v6af; - double BSIM4v6kf; - - double BSIM4v6vgsMax; - double BSIM4v6vgdMax; - double BSIM4v6vgbMax; - double BSIM4v6vdsMax; - double BSIM4v6vbsMax; - double BSIM4v6vbdMax; - double BSIM4v6vgsrMax; - double BSIM4v6vgdrMax; - double BSIM4v6vgbrMax; - double BSIM4v6vbsrMax; - double BSIM4v6vbdrMax; - - struct bsim4v6SizeDependParam *pSizeDependParamKnot; - - -#ifdef USE_OMP - int BSIM4v6InstCount; - struct sBSIM4v6instance **BSIM4v6InstanceArray; -#endif - - /* Flags */ - unsigned BSIM4v6mobModGiven :1; - unsigned BSIM4v6binUnitGiven :1; - unsigned BSIM4v6cvchargeModGiven :1; - unsigned BSIM4v6capModGiven :1; - unsigned BSIM4v6dioModGiven :1; - unsigned BSIM4v6rdsModGiven :1; - unsigned BSIM4v6rbodyModGiven :1; - unsigned BSIM4v6rgateModGiven :1; - unsigned BSIM4v6perModGiven :1; - unsigned BSIM4v6geoModGiven :1; - unsigned BSIM4v6rgeoModGiven :1; - unsigned BSIM4v6paramChkGiven :1; - unsigned BSIM4v6trnqsModGiven :1; - unsigned BSIM4v6acnqsModGiven :1; - unsigned BSIM4v6fnoiModGiven :1; - unsigned BSIM4v6tnoiModGiven :1; - unsigned BSIM4v6mtrlModGiven :1; - unsigned BSIM4v6igcModGiven :1; - unsigned BSIM4v6igbModGiven :1; - unsigned BSIM4v6tempModGiven :1; - unsigned BSIM4v6typeGiven :1; - unsigned BSIM4v6toxrefGiven :1; - unsigned BSIM4v6eotGiven :1; - unsigned BSIM4v6vddeotGiven :1; - unsigned BSIM4v6tempeotGiven :1; - unsigned BSIM4v6leffeotGiven :1; - unsigned BSIM4v6weffeotGiven :1; - unsigned BSIM4v6adosGiven :1; - unsigned BSIM4v6bdosGiven :1; - unsigned BSIM4v6toxeGiven :1; - unsigned BSIM4v6toxpGiven :1; - unsigned BSIM4v6toxmGiven :1; - unsigned BSIM4v6dtoxGiven :1; - unsigned BSIM4v6epsroxGiven :1; - unsigned BSIM4v6versionGiven :1; - unsigned BSIM4v6cdscGiven :1; - unsigned BSIM4v6cdscbGiven :1; - unsigned BSIM4v6cdscdGiven :1; - unsigned BSIM4v6citGiven :1; - unsigned BSIM4v6nfactorGiven :1; - unsigned BSIM4v6xjGiven :1; - unsigned BSIM4v6vsatGiven :1; - unsigned BSIM4v6atGiven :1; - unsigned BSIM4v6a0Given :1; - unsigned BSIM4v6agsGiven :1; - unsigned BSIM4v6a1Given :1; - unsigned BSIM4v6a2Given :1; - unsigned BSIM4v6ketaGiven :1; - unsigned BSIM4v6nsubGiven :1; - unsigned BSIM4v6phigGiven :1; - unsigned BSIM4v6epsrgateGiven :1; - unsigned BSIM4v6easubGiven :1; - unsigned BSIM4v6epsrsubGiven :1; - unsigned BSIM4v6ni0subGiven :1; - unsigned BSIM4v6bg0subGiven :1; - unsigned BSIM4v6tbgasubGiven :1; - unsigned BSIM4v6tbgbsubGiven :1; - unsigned BSIM4v6ndepGiven :1; - unsigned BSIM4v6nsdGiven :1; - unsigned BSIM4v6phinGiven :1; - unsigned BSIM4v6ngateGiven :1; - unsigned BSIM4v6gamma1Given :1; - unsigned BSIM4v6gamma2Given :1; - unsigned BSIM4v6vbxGiven :1; - unsigned BSIM4v6vbmGiven :1; - unsigned BSIM4v6xtGiven :1; - unsigned BSIM4v6k1Given :1; - unsigned BSIM4v6kt1Given :1; - unsigned BSIM4v6kt1lGiven :1; - unsigned BSIM4v6kt2Given :1; - unsigned BSIM4v6k2Given :1; - unsigned BSIM4v6k3Given :1; - unsigned BSIM4v6k3bGiven :1; - unsigned BSIM4v6w0Given :1; - unsigned BSIM4v6dvtp0Given :1; - unsigned BSIM4v6dvtp1Given :1; - unsigned BSIM4v6lpe0Given :1; - unsigned BSIM4v6lpebGiven :1; - unsigned BSIM4v6dvt0Given :1; - unsigned BSIM4v6dvt1Given :1; - unsigned BSIM4v6dvt2Given :1; - unsigned BSIM4v6dvt0wGiven :1; - unsigned BSIM4v6dvt1wGiven :1; - unsigned BSIM4v6dvt2wGiven :1; - unsigned BSIM4v6droutGiven :1; - unsigned BSIM4v6dsubGiven :1; - unsigned BSIM4v6vth0Given :1; - unsigned BSIM4v6euGiven :1; - unsigned BSIM4v6ucsGiven :1; - unsigned BSIM4v6uaGiven :1; - unsigned BSIM4v6ua1Given :1; - unsigned BSIM4v6ubGiven :1; - unsigned BSIM4v6ub1Given :1; - unsigned BSIM4v6ucGiven :1; - unsigned BSIM4v6uc1Given :1; - unsigned BSIM4v6udGiven :1; - unsigned BSIM4v6ud1Given :1; - unsigned BSIM4v6upGiven :1; - unsigned BSIM4v6lpGiven :1; - unsigned BSIM4v6u0Given :1; - unsigned BSIM4v6uteGiven :1; - unsigned BSIM4v6ucsteGiven :1; - unsigned BSIM4v6voffGiven :1; - unsigned BSIM4v6tvoffGiven :1; - unsigned BSIM4v6vofflGiven :1; - unsigned BSIM4v6voffcvlGiven :1; - unsigned BSIM4v6minvGiven :1; - unsigned BSIM4v6minvcvGiven :1; - unsigned BSIM4v6rdswGiven :1; - unsigned BSIM4v6rdswminGiven :1; - unsigned BSIM4v6rdwminGiven :1; - unsigned BSIM4v6rswminGiven :1; - unsigned BSIM4v6rswGiven :1; - unsigned BSIM4v6rdwGiven :1; - unsigned BSIM4v6prwgGiven :1; - unsigned BSIM4v6prwbGiven :1; - unsigned BSIM4v6prtGiven :1; - unsigned BSIM4v6eta0Given :1; - unsigned BSIM4v6etabGiven :1; - unsigned BSIM4v6pclmGiven :1; - unsigned BSIM4v6pdibl1Given :1; - unsigned BSIM4v6pdibl2Given :1; - unsigned BSIM4v6pdiblbGiven :1; - unsigned BSIM4v6fproutGiven :1; - unsigned BSIM4v6pditsGiven :1; - unsigned BSIM4v6pditsdGiven :1; - unsigned BSIM4v6pditslGiven :1; - unsigned BSIM4v6pscbe1Given :1; - unsigned BSIM4v6pscbe2Given :1; - unsigned BSIM4v6pvagGiven :1; - unsigned BSIM4v6deltaGiven :1; - unsigned BSIM4v6wrGiven :1; - unsigned BSIM4v6dwgGiven :1; - unsigned BSIM4v6dwbGiven :1; - unsigned BSIM4v6b0Given :1; - unsigned BSIM4v6b1Given :1; - unsigned BSIM4v6alpha0Given :1; - unsigned BSIM4v6alpha1Given :1; - unsigned BSIM4v6beta0Given :1; - unsigned BSIM4v6agidlGiven :1; - unsigned BSIM4v6bgidlGiven :1; - unsigned BSIM4v6cgidlGiven :1; - unsigned BSIM4v6egidlGiven :1; - unsigned BSIM4v6agislGiven :1; - unsigned BSIM4v6bgislGiven :1; - unsigned BSIM4v6cgislGiven :1; - unsigned BSIM4v6egislGiven :1; - unsigned BSIM4v6aigcGiven :1; - unsigned BSIM4v6bigcGiven :1; - unsigned BSIM4v6cigcGiven :1; - unsigned BSIM4v6aigsdGiven :1; - unsigned BSIM4v6bigsdGiven :1; - unsigned BSIM4v6cigsdGiven :1; - unsigned BSIM4v6aigsGiven :1; - unsigned BSIM4v6bigsGiven :1; - unsigned BSIM4v6cigsGiven :1; - unsigned BSIM4v6aigdGiven :1; - unsigned BSIM4v6bigdGiven :1; - unsigned BSIM4v6cigdGiven :1; - unsigned BSIM4v6aigbaccGiven :1; - unsigned BSIM4v6bigbaccGiven :1; - unsigned BSIM4v6cigbaccGiven :1; - unsigned BSIM4v6aigbinvGiven :1; - unsigned BSIM4v6bigbinvGiven :1; - unsigned BSIM4v6cigbinvGiven :1; - unsigned BSIM4v6nigcGiven :1; - unsigned BSIM4v6nigbinvGiven :1; - unsigned BSIM4v6nigbaccGiven :1; - unsigned BSIM4v6ntoxGiven :1; - unsigned BSIM4v6eigbinvGiven :1; - unsigned BSIM4v6pigcdGiven :1; - unsigned BSIM4v6poxedgeGiven :1; - unsigned BSIM4v6ijthdfwdGiven :1; - unsigned BSIM4v6ijthsfwdGiven :1; - unsigned BSIM4v6ijthdrevGiven :1; - unsigned BSIM4v6ijthsrevGiven :1; - unsigned BSIM4v6xjbvdGiven :1; - unsigned BSIM4v6xjbvsGiven :1; - unsigned BSIM4v6bvdGiven :1; - unsigned BSIM4v6bvsGiven :1; - - unsigned BSIM4v6jtssGiven :1; - unsigned BSIM4v6jtsdGiven :1; - unsigned BSIM4v6jtsswsGiven :1; - unsigned BSIM4v6jtsswdGiven :1; - unsigned BSIM4v6jtsswgsGiven :1; - unsigned BSIM4v6jtsswgdGiven :1; - unsigned BSIM4v6jtweffGiven :1; - unsigned BSIM4v6njtsGiven :1; - unsigned BSIM4v6njtsswGiven :1; - unsigned BSIM4v6njtsswgGiven :1; - unsigned BSIM4v6njtsdGiven :1; - unsigned BSIM4v6njtsswdGiven :1; - unsigned BSIM4v6njtsswgdGiven :1; - unsigned BSIM4v6xtssGiven :1; - unsigned BSIM4v6xtsdGiven :1; - unsigned BSIM4v6xtsswsGiven :1; - unsigned BSIM4v6xtsswdGiven :1; - unsigned BSIM4v6xtsswgsGiven :1; - unsigned BSIM4v6xtsswgdGiven :1; - unsigned BSIM4v6tnjtsGiven :1; - unsigned BSIM4v6tnjtsswGiven :1; - unsigned BSIM4v6tnjtsswgGiven :1; - unsigned BSIM4v6tnjtsdGiven :1; - unsigned BSIM4v6tnjtsswdGiven :1; - unsigned BSIM4v6tnjtsswgdGiven :1; - unsigned BSIM4v6vtssGiven :1; - unsigned BSIM4v6vtsdGiven :1; - unsigned BSIM4v6vtsswsGiven :1; - unsigned BSIM4v6vtsswdGiven :1; - unsigned BSIM4v6vtsswgsGiven :1; - unsigned BSIM4v6vtsswgdGiven :1; - - unsigned BSIM4v6vfbGiven :1; - unsigned BSIM4v6gbminGiven :1; - unsigned BSIM4v6rbdbGiven :1; - unsigned BSIM4v6rbsbGiven :1; - unsigned BSIM4v6rbpsGiven :1; - unsigned BSIM4v6rbpdGiven :1; - unsigned BSIM4v6rbpbGiven :1; - - unsigned BSIM4v6rbps0Given :1; - unsigned BSIM4v6rbpslGiven :1; - unsigned BSIM4v6rbpswGiven :1; - unsigned BSIM4v6rbpsnfGiven :1; - - unsigned BSIM4v6rbpd0Given :1; - unsigned BSIM4v6rbpdlGiven :1; - unsigned BSIM4v6rbpdwGiven :1; - unsigned BSIM4v6rbpdnfGiven :1; - - unsigned BSIM4v6rbpbx0Given :1; - unsigned BSIM4v6rbpbxlGiven :1; - unsigned BSIM4v6rbpbxwGiven :1; - unsigned BSIM4v6rbpbxnfGiven :1; - unsigned BSIM4v6rbpby0Given :1; - unsigned BSIM4v6rbpbylGiven :1; - unsigned BSIM4v6rbpbywGiven :1; - unsigned BSIM4v6rbpbynfGiven :1; - - unsigned BSIM4v6rbsbx0Given :1; - unsigned BSIM4v6rbsby0Given :1; - unsigned BSIM4v6rbdbx0Given :1; - unsigned BSIM4v6rbdby0Given :1; - - unsigned BSIM4v6rbsdbxlGiven :1; - unsigned BSIM4v6rbsdbxwGiven :1; - unsigned BSIM4v6rbsdbxnfGiven :1; - unsigned BSIM4v6rbsdbylGiven :1; - unsigned BSIM4v6rbsdbywGiven :1; - unsigned BSIM4v6rbsdbynfGiven :1; - - unsigned BSIM4v6xrcrg1Given :1; - unsigned BSIM4v6xrcrg2Given :1; - unsigned BSIM4v6tnoiaGiven :1; - unsigned BSIM4v6tnoibGiven :1; - unsigned BSIM4v6rnoiaGiven :1; - unsigned BSIM4v6rnoibGiven :1; - unsigned BSIM4v6ntnoiGiven :1; - - unsigned BSIM4v6lambdaGiven :1; - unsigned BSIM4v6vtlGiven :1; - unsigned BSIM4v6lcGiven :1; - unsigned BSIM4v6xnGiven :1; - unsigned BSIM4v6vfbsdoffGiven :1; - unsigned BSIM4v6lintnoiGiven :1; - unsigned BSIM4v6tvfbsdoffGiven :1; - - /* CV model and parasitics */ - unsigned BSIM4v6cgslGiven :1; - unsigned BSIM4v6cgdlGiven :1; - unsigned BSIM4v6ckappasGiven :1; - unsigned BSIM4v6ckappadGiven :1; - unsigned BSIM4v6cfGiven :1; - unsigned BSIM4v6vfbcvGiven :1; - unsigned BSIM4v6clcGiven :1; - unsigned BSIM4v6cleGiven :1; - unsigned BSIM4v6dwcGiven :1; - unsigned BSIM4v6dlcGiven :1; - unsigned BSIM4v6xwGiven :1; - unsigned BSIM4v6xlGiven :1; - unsigned BSIM4v6dlcigGiven :1; - unsigned BSIM4v6dlcigdGiven :1; - unsigned BSIM4v6dwjGiven :1; - unsigned BSIM4v6noffGiven :1; - unsigned BSIM4v6voffcvGiven :1; - unsigned BSIM4v6acdeGiven :1; - unsigned BSIM4v6moinGiven :1; - unsigned BSIM4v6tcjGiven :1; - unsigned BSIM4v6tcjswGiven :1; - unsigned BSIM4v6tcjswgGiven :1; - unsigned BSIM4v6tpbGiven :1; - unsigned BSIM4v6tpbswGiven :1; - unsigned BSIM4v6tpbswgGiven :1; - unsigned BSIM4v6dmcgGiven :1; - unsigned BSIM4v6dmciGiven :1; - unsigned BSIM4v6dmdgGiven :1; - unsigned BSIM4v6dmcgtGiven :1; - unsigned BSIM4v6xgwGiven :1; - unsigned BSIM4v6xglGiven :1; - unsigned BSIM4v6rshgGiven :1; - unsigned BSIM4v6ngconGiven :1; - - - /* Length dependence */ - unsigned BSIM4v6lcdscGiven :1; - unsigned BSIM4v6lcdscbGiven :1; - unsigned BSIM4v6lcdscdGiven :1; - unsigned BSIM4v6lcitGiven :1; - unsigned BSIM4v6lnfactorGiven :1; - unsigned BSIM4v6lxjGiven :1; - unsigned BSIM4v6lvsatGiven :1; - unsigned BSIM4v6latGiven :1; - unsigned BSIM4v6la0Given :1; - unsigned BSIM4v6lagsGiven :1; - unsigned BSIM4v6la1Given :1; - unsigned BSIM4v6la2Given :1; - unsigned BSIM4v6lketaGiven :1; - unsigned BSIM4v6lnsubGiven :1; - unsigned BSIM4v6lndepGiven :1; - unsigned BSIM4v6lnsdGiven :1; - unsigned BSIM4v6lphinGiven :1; - unsigned BSIM4v6lngateGiven :1; - unsigned BSIM4v6lgamma1Given :1; - unsigned BSIM4v6lgamma2Given :1; - unsigned BSIM4v6lvbxGiven :1; - unsigned BSIM4v6lvbmGiven :1; - unsigned BSIM4v6lxtGiven :1; - unsigned BSIM4v6lk1Given :1; - unsigned BSIM4v6lkt1Given :1; - unsigned BSIM4v6lkt1lGiven :1; - unsigned BSIM4v6lkt2Given :1; - unsigned BSIM4v6lk2Given :1; - unsigned BSIM4v6lk3Given :1; - unsigned BSIM4v6lk3bGiven :1; - unsigned BSIM4v6lw0Given :1; - unsigned BSIM4v6ldvtp0Given :1; - unsigned BSIM4v6ldvtp1Given :1; - unsigned BSIM4v6llpe0Given :1; - unsigned BSIM4v6llpebGiven :1; - unsigned BSIM4v6ldvt0Given :1; - unsigned BSIM4v6ldvt1Given :1; - unsigned BSIM4v6ldvt2Given :1; - unsigned BSIM4v6ldvt0wGiven :1; - unsigned BSIM4v6ldvt1wGiven :1; - unsigned BSIM4v6ldvt2wGiven :1; - unsigned BSIM4v6ldroutGiven :1; - unsigned BSIM4v6ldsubGiven :1; - unsigned BSIM4v6lvth0Given :1; - unsigned BSIM4v6luaGiven :1; - unsigned BSIM4v6lua1Given :1; - unsigned BSIM4v6lubGiven :1; - unsigned BSIM4v6lub1Given :1; - unsigned BSIM4v6lucGiven :1; - unsigned BSIM4v6luc1Given :1; - unsigned BSIM4v6ludGiven :1; - unsigned BSIM4v6lud1Given :1; - unsigned BSIM4v6lupGiven :1; - unsigned BSIM4v6llpGiven :1; - unsigned BSIM4v6lu0Given :1; - unsigned BSIM4v6leuGiven :1; - unsigned BSIM4v6lucsGiven :1; - unsigned BSIM4v6luteGiven :1; - unsigned BSIM4v6lucsteGiven :1; - unsigned BSIM4v6lvoffGiven :1; - unsigned BSIM4v6ltvoffGiven :1; - unsigned BSIM4v6lminvGiven :1; - unsigned BSIM4v6lminvcvGiven :1; - unsigned BSIM4v6lrdswGiven :1; - unsigned BSIM4v6lrswGiven :1; - unsigned BSIM4v6lrdwGiven :1; - unsigned BSIM4v6lprwgGiven :1; - unsigned BSIM4v6lprwbGiven :1; - unsigned BSIM4v6lprtGiven :1; - unsigned BSIM4v6leta0Given :1; - unsigned BSIM4v6letabGiven :1; - unsigned BSIM4v6lpclmGiven :1; - unsigned BSIM4v6lpdibl1Given :1; - unsigned BSIM4v6lpdibl2Given :1; - unsigned BSIM4v6lpdiblbGiven :1; - unsigned BSIM4v6lfproutGiven :1; - unsigned BSIM4v6lpditsGiven :1; - unsigned BSIM4v6lpditsdGiven :1; - unsigned BSIM4v6lpscbe1Given :1; - unsigned BSIM4v6lpscbe2Given :1; - unsigned BSIM4v6lpvagGiven :1; - unsigned BSIM4v6ldeltaGiven :1; - unsigned BSIM4v6lwrGiven :1; - unsigned BSIM4v6ldwgGiven :1; - unsigned BSIM4v6ldwbGiven :1; - unsigned BSIM4v6lb0Given :1; - unsigned BSIM4v6lb1Given :1; - unsigned BSIM4v6lalpha0Given :1; - unsigned BSIM4v6lalpha1Given :1; - unsigned BSIM4v6lbeta0Given :1; - unsigned BSIM4v6lvfbGiven :1; - unsigned BSIM4v6lagidlGiven :1; - unsigned BSIM4v6lbgidlGiven :1; - unsigned BSIM4v6lcgidlGiven :1; - unsigned BSIM4v6legidlGiven :1; - unsigned BSIM4v6lagislGiven :1; - unsigned BSIM4v6lbgislGiven :1; - unsigned BSIM4v6lcgislGiven :1; - unsigned BSIM4v6legislGiven :1; - unsigned BSIM4v6laigcGiven :1; - unsigned BSIM4v6lbigcGiven :1; - unsigned BSIM4v6lcigcGiven :1; - unsigned BSIM4v6laigsdGiven :1; - unsigned BSIM4v6lbigsdGiven :1; - unsigned BSIM4v6lcigsdGiven :1; - unsigned BSIM4v6laigsGiven :1; - unsigned BSIM4v6lbigsGiven :1; - unsigned BSIM4v6lcigsGiven :1; - unsigned BSIM4v6laigdGiven :1; - unsigned BSIM4v6lbigdGiven :1; - unsigned BSIM4v6lcigdGiven :1; - unsigned BSIM4v6laigbaccGiven :1; - unsigned BSIM4v6lbigbaccGiven :1; - unsigned BSIM4v6lcigbaccGiven :1; - unsigned BSIM4v6laigbinvGiven :1; - unsigned BSIM4v6lbigbinvGiven :1; - unsigned BSIM4v6lcigbinvGiven :1; - unsigned BSIM4v6lnigcGiven :1; - unsigned BSIM4v6lnigbinvGiven :1; - unsigned BSIM4v6lnigbaccGiven :1; - unsigned BSIM4v6lntoxGiven :1; - unsigned BSIM4v6leigbinvGiven :1; - unsigned BSIM4v6lpigcdGiven :1; - unsigned BSIM4v6lpoxedgeGiven :1; - unsigned BSIM4v6lxrcrg1Given :1; - unsigned BSIM4v6lxrcrg2Given :1; - unsigned BSIM4v6llambdaGiven :1; - unsigned BSIM4v6lvtlGiven :1; - unsigned BSIM4v6lxnGiven :1; - unsigned BSIM4v6lvfbsdoffGiven :1; - unsigned BSIM4v6ltvfbsdoffGiven :1; - - /* CV model */ - unsigned BSIM4v6lcgslGiven :1; - unsigned BSIM4v6lcgdlGiven :1; - unsigned BSIM4v6lckappasGiven :1; - unsigned BSIM4v6lckappadGiven :1; - unsigned BSIM4v6lcfGiven :1; - unsigned BSIM4v6lclcGiven :1; - unsigned BSIM4v6lcleGiven :1; - unsigned BSIM4v6lvfbcvGiven :1; - unsigned BSIM4v6lnoffGiven :1; - unsigned BSIM4v6lvoffcvGiven :1; - unsigned BSIM4v6lacdeGiven :1; - unsigned BSIM4v6lmoinGiven :1; - - /* Width dependence */ - unsigned BSIM4v6wcdscGiven :1; - unsigned BSIM4v6wcdscbGiven :1; - unsigned BSIM4v6wcdscdGiven :1; - unsigned BSIM4v6wcitGiven :1; - unsigned BSIM4v6wnfactorGiven :1; - unsigned BSIM4v6wxjGiven :1; - unsigned BSIM4v6wvsatGiven :1; - unsigned BSIM4v6watGiven :1; - unsigned BSIM4v6wa0Given :1; - unsigned BSIM4v6wagsGiven :1; - unsigned BSIM4v6wa1Given :1; - unsigned BSIM4v6wa2Given :1; - unsigned BSIM4v6wketaGiven :1; - unsigned BSIM4v6wnsubGiven :1; - unsigned BSIM4v6wndepGiven :1; - unsigned BSIM4v6wnsdGiven :1; - unsigned BSIM4v6wphinGiven :1; - unsigned BSIM4v6wngateGiven :1; - unsigned BSIM4v6wgamma1Given :1; - unsigned BSIM4v6wgamma2Given :1; - unsigned BSIM4v6wvbxGiven :1; - unsigned BSIM4v6wvbmGiven :1; - unsigned BSIM4v6wxtGiven :1; - unsigned BSIM4v6wk1Given :1; - unsigned BSIM4v6wkt1Given :1; - unsigned BSIM4v6wkt1lGiven :1; - unsigned BSIM4v6wkt2Given :1; - unsigned BSIM4v6wk2Given :1; - unsigned BSIM4v6wk3Given :1; - unsigned BSIM4v6wk3bGiven :1; - unsigned BSIM4v6ww0Given :1; - unsigned BSIM4v6wdvtp0Given :1; - unsigned BSIM4v6wdvtp1Given :1; - unsigned BSIM4v6wlpe0Given :1; - unsigned BSIM4v6wlpebGiven :1; - unsigned BSIM4v6wdvt0Given :1; - unsigned BSIM4v6wdvt1Given :1; - unsigned BSIM4v6wdvt2Given :1; - unsigned BSIM4v6wdvt0wGiven :1; - unsigned BSIM4v6wdvt1wGiven :1; - unsigned BSIM4v6wdvt2wGiven :1; - unsigned BSIM4v6wdroutGiven :1; - unsigned BSIM4v6wdsubGiven :1; - unsigned BSIM4v6wvth0Given :1; - unsigned BSIM4v6wuaGiven :1; - unsigned BSIM4v6wua1Given :1; - unsigned BSIM4v6wubGiven :1; - unsigned BSIM4v6wub1Given :1; - unsigned BSIM4v6wucGiven :1; - unsigned BSIM4v6wuc1Given :1; - unsigned BSIM4v6wudGiven :1; - unsigned BSIM4v6wud1Given :1; - unsigned BSIM4v6wupGiven :1; - unsigned BSIM4v6wlpGiven :1; - unsigned BSIM4v6wu0Given :1; - unsigned BSIM4v6weuGiven :1; - unsigned BSIM4v6wucsGiven :1; - unsigned BSIM4v6wuteGiven :1; - unsigned BSIM4v6wucsteGiven :1; - unsigned BSIM4v6wvoffGiven :1; - unsigned BSIM4v6wtvoffGiven :1; - unsigned BSIM4v6wminvGiven :1; - unsigned BSIM4v6wminvcvGiven :1; - unsigned BSIM4v6wrdswGiven :1; - unsigned BSIM4v6wrswGiven :1; - unsigned BSIM4v6wrdwGiven :1; - unsigned BSIM4v6wprwgGiven :1; - unsigned BSIM4v6wprwbGiven :1; - unsigned BSIM4v6wprtGiven :1; - unsigned BSIM4v6weta0Given :1; - unsigned BSIM4v6wetabGiven :1; - unsigned BSIM4v6wpclmGiven :1; - unsigned BSIM4v6wpdibl1Given :1; - unsigned BSIM4v6wpdibl2Given :1; - unsigned BSIM4v6wpdiblbGiven :1; - unsigned BSIM4v6wfproutGiven :1; - unsigned BSIM4v6wpditsGiven :1; - unsigned BSIM4v6wpditsdGiven :1; - unsigned BSIM4v6wpscbe1Given :1; - unsigned BSIM4v6wpscbe2Given :1; - unsigned BSIM4v6wpvagGiven :1; - unsigned BSIM4v6wdeltaGiven :1; - unsigned BSIM4v6wwrGiven :1; - unsigned BSIM4v6wdwgGiven :1; - unsigned BSIM4v6wdwbGiven :1; - unsigned BSIM4v6wb0Given :1; - unsigned BSIM4v6wb1Given :1; - unsigned BSIM4v6walpha0Given :1; - unsigned BSIM4v6walpha1Given :1; - unsigned BSIM4v6wbeta0Given :1; - unsigned BSIM4v6wvfbGiven :1; - unsigned BSIM4v6wagidlGiven :1; - unsigned BSIM4v6wbgidlGiven :1; - unsigned BSIM4v6wcgidlGiven :1; - unsigned BSIM4v6wegidlGiven :1; - unsigned BSIM4v6wagislGiven :1; - unsigned BSIM4v6wbgislGiven :1; - unsigned BSIM4v6wcgislGiven :1; - unsigned BSIM4v6wegislGiven :1; - unsigned BSIM4v6waigcGiven :1; - unsigned BSIM4v6wbigcGiven :1; - unsigned BSIM4v6wcigcGiven :1; - unsigned BSIM4v6waigsdGiven :1; - unsigned BSIM4v6wbigsdGiven :1; - unsigned BSIM4v6wcigsdGiven :1; - unsigned BSIM4v6waigsGiven :1; - unsigned BSIM4v6wbigsGiven :1; - unsigned BSIM4v6wcigsGiven :1; - unsigned BSIM4v6waigdGiven :1; - unsigned BSIM4v6wbigdGiven :1; - unsigned BSIM4v6wcigdGiven :1; - unsigned BSIM4v6waigbaccGiven :1; - unsigned BSIM4v6wbigbaccGiven :1; - unsigned BSIM4v6wcigbaccGiven :1; - unsigned BSIM4v6waigbinvGiven :1; - unsigned BSIM4v6wbigbinvGiven :1; - unsigned BSIM4v6wcigbinvGiven :1; - unsigned BSIM4v6wnigcGiven :1; - unsigned BSIM4v6wnigbinvGiven :1; - unsigned BSIM4v6wnigbaccGiven :1; - unsigned BSIM4v6wntoxGiven :1; - unsigned BSIM4v6weigbinvGiven :1; - unsigned BSIM4v6wpigcdGiven :1; - unsigned BSIM4v6wpoxedgeGiven :1; - unsigned BSIM4v6wxrcrg1Given :1; - unsigned BSIM4v6wxrcrg2Given :1; - unsigned BSIM4v6wlambdaGiven :1; - unsigned BSIM4v6wvtlGiven :1; - unsigned BSIM4v6wxnGiven :1; - unsigned BSIM4v6wvfbsdoffGiven :1; - unsigned BSIM4v6wtvfbsdoffGiven :1; - - /* CV model */ - unsigned BSIM4v6wcgslGiven :1; - unsigned BSIM4v6wcgdlGiven :1; - unsigned BSIM4v6wckappasGiven :1; - unsigned BSIM4v6wckappadGiven :1; - unsigned BSIM4v6wcfGiven :1; - unsigned BSIM4v6wclcGiven :1; - unsigned BSIM4v6wcleGiven :1; - unsigned BSIM4v6wvfbcvGiven :1; - unsigned BSIM4v6wnoffGiven :1; - unsigned BSIM4v6wvoffcvGiven :1; - unsigned BSIM4v6wacdeGiven :1; - unsigned BSIM4v6wmoinGiven :1; - - /* Cross-term dependence */ - unsigned BSIM4v6pcdscGiven :1; - unsigned BSIM4v6pcdscbGiven :1; - unsigned BSIM4v6pcdscdGiven :1; - unsigned BSIM4v6pcitGiven :1; - unsigned BSIM4v6pnfactorGiven :1; - unsigned BSIM4v6pxjGiven :1; - unsigned BSIM4v6pvsatGiven :1; - unsigned BSIM4v6patGiven :1; - unsigned BSIM4v6pa0Given :1; - unsigned BSIM4v6pagsGiven :1; - unsigned BSIM4v6pa1Given :1; - unsigned BSIM4v6pa2Given :1; - unsigned BSIM4v6pketaGiven :1; - unsigned BSIM4v6pnsubGiven :1; - unsigned BSIM4v6pndepGiven :1; - unsigned BSIM4v6pnsdGiven :1; - unsigned BSIM4v6pphinGiven :1; - unsigned BSIM4v6pngateGiven :1; - unsigned BSIM4v6pgamma1Given :1; - unsigned BSIM4v6pgamma2Given :1; - unsigned BSIM4v6pvbxGiven :1; - unsigned BSIM4v6pvbmGiven :1; - unsigned BSIM4v6pxtGiven :1; - unsigned BSIM4v6pk1Given :1; - unsigned BSIM4v6pkt1Given :1; - unsigned BSIM4v6pkt1lGiven :1; - unsigned BSIM4v6pkt2Given :1; - unsigned BSIM4v6pk2Given :1; - unsigned BSIM4v6pk3Given :1; - unsigned BSIM4v6pk3bGiven :1; - unsigned BSIM4v6pw0Given :1; - unsigned BSIM4v6pdvtp0Given :1; - unsigned BSIM4v6pdvtp1Given :1; - unsigned BSIM4v6plpe0Given :1; - unsigned BSIM4v6plpebGiven :1; - unsigned BSIM4v6pdvt0Given :1; - unsigned BSIM4v6pdvt1Given :1; - unsigned BSIM4v6pdvt2Given :1; - unsigned BSIM4v6pdvt0wGiven :1; - unsigned BSIM4v6pdvt1wGiven :1; - unsigned BSIM4v6pdvt2wGiven :1; - unsigned BSIM4v6pdroutGiven :1; - unsigned BSIM4v6pdsubGiven :1; - unsigned BSIM4v6pvth0Given :1; - unsigned BSIM4v6puaGiven :1; - unsigned BSIM4v6pua1Given :1; - unsigned BSIM4v6pubGiven :1; - unsigned BSIM4v6pub1Given :1; - unsigned BSIM4v6pucGiven :1; - unsigned BSIM4v6puc1Given :1; - unsigned BSIM4v6pudGiven :1; - unsigned BSIM4v6pud1Given :1; - unsigned BSIM4v6pupGiven :1; - unsigned BSIM4v6plpGiven :1; - unsigned BSIM4v6pu0Given :1; - unsigned BSIM4v6peuGiven :1; - unsigned BSIM4v6pucsGiven :1; - unsigned BSIM4v6puteGiven :1; - unsigned BSIM4v6pucsteGiven :1; - unsigned BSIM4v6pvoffGiven :1; - unsigned BSIM4v6ptvoffGiven :1; - unsigned BSIM4v6pminvGiven :1; - unsigned BSIM4v6pminvcvGiven :1; - unsigned BSIM4v6prdswGiven :1; - unsigned BSIM4v6prswGiven :1; - unsigned BSIM4v6prdwGiven :1; - unsigned BSIM4v6pprwgGiven :1; - unsigned BSIM4v6pprwbGiven :1; - unsigned BSIM4v6pprtGiven :1; - unsigned BSIM4v6peta0Given :1; - unsigned BSIM4v6petabGiven :1; - unsigned BSIM4v6ppclmGiven :1; - unsigned BSIM4v6ppdibl1Given :1; - unsigned BSIM4v6ppdibl2Given :1; - unsigned BSIM4v6ppdiblbGiven :1; - unsigned BSIM4v6pfproutGiven :1; - unsigned BSIM4v6ppditsGiven :1; - unsigned BSIM4v6ppditsdGiven :1; - unsigned BSIM4v6ppscbe1Given :1; - unsigned BSIM4v6ppscbe2Given :1; - unsigned BSIM4v6ppvagGiven :1; - unsigned BSIM4v6pdeltaGiven :1; - unsigned BSIM4v6pwrGiven :1; - unsigned BSIM4v6pdwgGiven :1; - unsigned BSIM4v6pdwbGiven :1; - unsigned BSIM4v6pb0Given :1; - unsigned BSIM4v6pb1Given :1; - unsigned BSIM4v6palpha0Given :1; - unsigned BSIM4v6palpha1Given :1; - unsigned BSIM4v6pbeta0Given :1; - unsigned BSIM4v6pvfbGiven :1; - unsigned BSIM4v6pagidlGiven :1; - unsigned BSIM4v6pbgidlGiven :1; - unsigned BSIM4v6pcgidlGiven :1; - unsigned BSIM4v6pegidlGiven :1; - unsigned BSIM4v6pagislGiven :1; - unsigned BSIM4v6pbgislGiven :1; - unsigned BSIM4v6pcgislGiven :1; - unsigned BSIM4v6pegislGiven :1; - unsigned BSIM4v6paigcGiven :1; - unsigned BSIM4v6pbigcGiven :1; - unsigned BSIM4v6pcigcGiven :1; - unsigned BSIM4v6paigsdGiven :1; - unsigned BSIM4v6pbigsdGiven :1; - unsigned BSIM4v6pcigsdGiven :1; - unsigned BSIM4v6paigsGiven :1; - unsigned BSIM4v6pbigsGiven :1; - unsigned BSIM4v6pcigsGiven :1; - unsigned BSIM4v6paigdGiven :1; - unsigned BSIM4v6pbigdGiven :1; - unsigned BSIM4v6pcigdGiven :1; - unsigned BSIM4v6paigbaccGiven :1; - unsigned BSIM4v6pbigbaccGiven :1; - unsigned BSIM4v6pcigbaccGiven :1; - unsigned BSIM4v6paigbinvGiven :1; - unsigned BSIM4v6pbigbinvGiven :1; - unsigned BSIM4v6pcigbinvGiven :1; - unsigned BSIM4v6pnigcGiven :1; - unsigned BSIM4v6pnigbinvGiven :1; - unsigned BSIM4v6pnigbaccGiven :1; - unsigned BSIM4v6pntoxGiven :1; - unsigned BSIM4v6peigbinvGiven :1; - unsigned BSIM4v6ppigcdGiven :1; - unsigned BSIM4v6ppoxedgeGiven :1; - unsigned BSIM4v6pxrcrg1Given :1; - unsigned BSIM4v6pxrcrg2Given :1; - unsigned BSIM4v6plambdaGiven :1; - unsigned BSIM4v6pvtlGiven :1; - unsigned BSIM4v6pxnGiven :1; - unsigned BSIM4v6pvfbsdoffGiven :1; - unsigned BSIM4v6ptvfbsdoffGiven :1; - - /* CV model */ - unsigned BSIM4v6pcgslGiven :1; - unsigned BSIM4v6pcgdlGiven :1; - unsigned BSIM4v6pckappasGiven :1; - unsigned BSIM4v6pckappadGiven :1; - unsigned BSIM4v6pcfGiven :1; - unsigned BSIM4v6pclcGiven :1; - unsigned BSIM4v6pcleGiven :1; - unsigned BSIM4v6pvfbcvGiven :1; - unsigned BSIM4v6pnoffGiven :1; - unsigned BSIM4v6pvoffcvGiven :1; - unsigned BSIM4v6pacdeGiven :1; - unsigned BSIM4v6pmoinGiven :1; - - unsigned BSIM4v6useFringeGiven :1; - - unsigned BSIM4v6tnomGiven :1; - unsigned BSIM4v6cgsoGiven :1; - unsigned BSIM4v6cgdoGiven :1; - unsigned BSIM4v6cgboGiven :1; - unsigned BSIM4v6xpartGiven :1; - unsigned BSIM4v6sheetResistanceGiven :1; - - unsigned BSIM4v6SjctSatCurDensityGiven :1; - unsigned BSIM4v6SjctSidewallSatCurDensityGiven :1; - unsigned BSIM4v6SjctGateSidewallSatCurDensityGiven :1; - unsigned BSIM4v6SbulkJctPotentialGiven :1; - unsigned BSIM4v6SbulkJctBotGradingCoeffGiven :1; - unsigned BSIM4v6SsidewallJctPotentialGiven :1; - unsigned BSIM4v6SGatesidewallJctPotentialGiven :1; - unsigned BSIM4v6SbulkJctSideGradingCoeffGiven :1; - unsigned BSIM4v6SunitAreaJctCapGiven :1; - unsigned BSIM4v6SunitLengthSidewallJctCapGiven :1; - unsigned BSIM4v6SbulkJctGateSideGradingCoeffGiven :1; - unsigned BSIM4v6SunitLengthGateSidewallJctCapGiven :1; - unsigned BSIM4v6SjctEmissionCoeffGiven :1; - unsigned BSIM4v6SjctTempExponentGiven :1; - - unsigned BSIM4v6DjctSatCurDensityGiven :1; - unsigned BSIM4v6DjctSidewallSatCurDensityGiven :1; - unsigned BSIM4v6DjctGateSidewallSatCurDensityGiven :1; - unsigned BSIM4v6DbulkJctPotentialGiven :1; - unsigned BSIM4v6DbulkJctBotGradingCoeffGiven :1; - unsigned BSIM4v6DsidewallJctPotentialGiven :1; - unsigned BSIM4v6DGatesidewallJctPotentialGiven :1; - unsigned BSIM4v6DbulkJctSideGradingCoeffGiven :1; - unsigned BSIM4v6DunitAreaJctCapGiven :1; - unsigned BSIM4v6DunitLengthSidewallJctCapGiven :1; - unsigned BSIM4v6DbulkJctGateSideGradingCoeffGiven :1; - unsigned BSIM4v6DunitLengthGateSidewallJctCapGiven :1; - unsigned BSIM4v6DjctEmissionCoeffGiven :1; - unsigned BSIM4v6DjctTempExponentGiven :1; - - unsigned BSIM4v6oxideTrapDensityAGiven :1; - unsigned BSIM4v6oxideTrapDensityBGiven :1; - unsigned BSIM4v6oxideTrapDensityCGiven :1; - unsigned BSIM4v6emGiven :1; - unsigned BSIM4v6efGiven :1; - unsigned BSIM4v6afGiven :1; - unsigned BSIM4v6kfGiven :1; - - unsigned BSIM4v6vgsMaxGiven :1; - unsigned BSIM4v6vgdMaxGiven :1; - unsigned BSIM4v6vgbMaxGiven :1; - unsigned BSIM4v6vdsMaxGiven :1; - unsigned BSIM4v6vbsMaxGiven :1; - unsigned BSIM4v6vbdMaxGiven :1; - unsigned BSIM4v6vgsrMaxGiven :1; - unsigned BSIM4v6vgdrMaxGiven :1; - unsigned BSIM4v6vgbrMaxGiven :1; - unsigned BSIM4v6vbsrMaxGiven :1; - unsigned BSIM4v6vbdrMaxGiven :1; - - unsigned BSIM4v6LintGiven :1; - unsigned BSIM4v6LlGiven :1; - unsigned BSIM4v6LlcGiven :1; - unsigned BSIM4v6LlnGiven :1; - unsigned BSIM4v6LwGiven :1; - unsigned BSIM4v6LwcGiven :1; - unsigned BSIM4v6LwnGiven :1; - unsigned BSIM4v6LwlGiven :1; - unsigned BSIM4v6LwlcGiven :1; - unsigned BSIM4v6LminGiven :1; - unsigned BSIM4v6LmaxGiven :1; - - unsigned BSIM4v6WintGiven :1; - unsigned BSIM4v6WlGiven :1; - unsigned BSIM4v6WlcGiven :1; - unsigned BSIM4v6WlnGiven :1; - unsigned BSIM4v6WwGiven :1; - unsigned BSIM4v6WwcGiven :1; - unsigned BSIM4v6WwnGiven :1; - unsigned BSIM4v6WwlGiven :1; - unsigned BSIM4v6WwlcGiven :1; - unsigned BSIM4v6WminGiven :1; - unsigned BSIM4v6WmaxGiven :1; - - /* added for stress effect */ - unsigned BSIM4v6sarefGiven :1; - unsigned BSIM4v6sbrefGiven :1; - unsigned BSIM4v6wlodGiven :1; - unsigned BSIM4v6ku0Given :1; - unsigned BSIM4v6kvsatGiven :1; - unsigned BSIM4v6kvth0Given :1; - unsigned BSIM4v6tku0Given :1; - unsigned BSIM4v6llodku0Given :1; - unsigned BSIM4v6wlodku0Given :1; - unsigned BSIM4v6llodvthGiven :1; - unsigned BSIM4v6wlodvthGiven :1; - unsigned BSIM4v6lku0Given :1; - unsigned BSIM4v6wku0Given :1; - unsigned BSIM4v6pku0Given :1; - unsigned BSIM4v6lkvth0Given :1; - unsigned BSIM4v6wkvth0Given :1; - unsigned BSIM4v6pkvth0Given :1; - unsigned BSIM4v6stk2Given :1; - unsigned BSIM4v6lodk2Given :1; - unsigned BSIM4v6steta0Given :1; - unsigned BSIM4v6lodeta0Given :1; - - unsigned BSIM4v6webGiven :1; - unsigned BSIM4v6wecGiven :1; - unsigned BSIM4v6kvth0weGiven :1; - unsigned BSIM4v6k2weGiven :1; - unsigned BSIM4v6ku0weGiven :1; - unsigned BSIM4v6screfGiven :1; - unsigned BSIM4v6wpemodGiven :1; - unsigned BSIM4v6lkvth0weGiven :1; - unsigned BSIM4v6lk2weGiven :1; - unsigned BSIM4v6lku0weGiven :1; - unsigned BSIM4v6wkvth0weGiven :1; - unsigned BSIM4v6wk2weGiven :1; - unsigned BSIM4v6wku0weGiven :1; - unsigned BSIM4v6pkvth0weGiven :1; - unsigned BSIM4v6pk2weGiven :1; - unsigned BSIM4v6pku0weGiven :1; - - -} BSIM4v6model; - - -#ifndef NMOS -#define NMOS 1 -#define PMOS -1 -#endif /*NMOS*/ - - -/* Instance parameters */ -#define BSIM4v6_W 1 -#define BSIM4v6_L 2 -#define BSIM4v6_AS 3 -#define BSIM4v6_AD 4 -#define BSIM4v6_PS 5 -#define BSIM4v6_PD 6 -#define BSIM4v6_NRS 7 -#define BSIM4v6_NRD 8 -#define BSIM4v6_OFF 9 -#define BSIM4v6_IC 10 -#define BSIM4v6_IC_VDS 11 -#define BSIM4v6_IC_VGS 12 -#define BSIM4v6_IC_VBS 13 -#define BSIM4v6_TRNQSMOD 14 -#define BSIM4v6_RBODYMOD 15 -#define BSIM4v6_RGATEMOD 16 -#define BSIM4v6_GEOMOD 17 -#define BSIM4v6_RGEOMOD 18 -#define BSIM4v6_NF 19 -#define BSIM4v6_MIN 20 -#define BSIM4v6_ACNQSMOD 22 -#define BSIM4v6_RBDB 23 -#define BSIM4v6_RBSB 24 -#define BSIM4v6_RBPB 25 -#define BSIM4v6_RBPS 26 -#define BSIM4v6_RBPD 27 -#define BSIM4v6_SA 28 -#define BSIM4v6_SB 29 -#define BSIM4v6_SD 30 -#define BSIM4v6_DELVTO 31 -#define BSIM4v6_XGW 32 -#define BSIM4v6_NGCON 33 -#define BSIM4v6_SCA 34 -#define BSIM4v6_SCB 35 -#define BSIM4v6_SCC 36 -#define BSIM4v6_SC 37 -#define BSIM4v6_M 38 - -/* Global parameters */ -#define BSIM4v6_MOD_TEMPEOT 65 -#define BSIM4v6_MOD_LEFFEOT 66 -#define BSIM4v6_MOD_WEFFEOT 67 -#define BSIM4v6_MOD_UCSTE 68 -#define BSIM4v6_MOD_LUCSTE 69 -#define BSIM4v6_MOD_WUCSTE 70 -#define BSIM4v6_MOD_PUCSTE 71 -#define BSIM4v6_MOD_UCS 72 -#define BSIM4v6_MOD_LUCS 73 -#define BSIM4v6_MOD_WUCS 74 -#define BSIM4v6_MOD_PUCS 75 -#define BSIM4v6_MOD_CVCHARGEMOD 76 -#define BSIM4v6_MOD_ADOS 77 -#define BSIM4v6_MOD_BDOS 78 -#define BSIM4v6_MOD_TEMPMOD 79 -#define BSIM4v6_MOD_MTRLMOD 80 -#define BSIM4v6_MOD_IGCMOD 81 -#define BSIM4v6_MOD_IGBMOD 82 -#define BSIM4v6_MOD_ACNQSMOD 83 -#define BSIM4v6_MOD_FNOIMOD 84 -#define BSIM4v6_MOD_RDSMOD 85 -#define BSIM4v6_MOD_DIOMOD 86 -#define BSIM4v6_MOD_PERMOD 87 -#define BSIM4v6_MOD_GEOMOD 88 -#define BSIM4v6_MOD_RGEOMOD 89 -#define BSIM4v6_MOD_RGATEMOD 90 -#define BSIM4v6_MOD_RBODYMOD 91 -#define BSIM4v6_MOD_CAPMOD 92 -#define BSIM4v6_MOD_TRNQSMOD 93 -#define BSIM4v6_MOD_MOBMOD 94 -#define BSIM4v6_MOD_TNOIMOD 95 -#define BSIM4v6_MOD_EOT 96 -#define BSIM4v6_MOD_VDDEOT 97 -#define BSIM4v6_MOD_TOXE 98 -#define BSIM4v6_MOD_CDSC 99 -#define BSIM4v6_MOD_CDSCB 100 -#define BSIM4v6_MOD_CIT 101 -#define BSIM4v6_MOD_NFACTOR 102 -#define BSIM4v6_MOD_XJ 103 -#define BSIM4v6_MOD_VSAT 104 -#define BSIM4v6_MOD_AT 105 -#define BSIM4v6_MOD_A0 106 -#define BSIM4v6_MOD_A1 107 -#define BSIM4v6_MOD_A2 108 -#define BSIM4v6_MOD_KETA 109 -#define BSIM4v6_MOD_NSUB 110 -#define BSIM4v6_MOD_PHIG 111 -#define BSIM4v6_MOD_EPSRGATE 112 -#define BSIM4v6_MOD_EASUB 113 -#define BSIM4v6_MOD_EPSRSUB 114 -#define BSIM4v6_MOD_NI0SUB 115 -#define BSIM4v6_MOD_BG0SUB 116 -#define BSIM4v6_MOD_TBGASUB 117 -#define BSIM4v6_MOD_TBGBSUB 118 -#define BSIM4v6_MOD_NDEP 119 -#define BSIM4v6_MOD_NGATE 120 -#define BSIM4v6_MOD_GAMMA1 121 -#define BSIM4v6_MOD_GAMMA2 122 -#define BSIM4v6_MOD_VBX 123 -#define BSIM4v6_MOD_BINUNIT 124 -#define BSIM4v6_MOD_VBM 125 -#define BSIM4v6_MOD_XT 126 -#define BSIM4v6_MOD_K1 129 -#define BSIM4v6_MOD_KT1 130 -#define BSIM4v6_MOD_KT1L 131 -#define BSIM4v6_MOD_K2 132 -#define BSIM4v6_MOD_KT2 133 -#define BSIM4v6_MOD_K3 134 -#define BSIM4v6_MOD_K3B 135 -#define BSIM4v6_MOD_W0 136 -#define BSIM4v6_MOD_LPE0 137 -#define BSIM4v6_MOD_DVT0 138 -#define BSIM4v6_MOD_DVT1 139 -#define BSIM4v6_MOD_DVT2 140 -#define BSIM4v6_MOD_DVT0W 141 -#define BSIM4v6_MOD_DVT1W 142 -#define BSIM4v6_MOD_DVT2W 143 -#define BSIM4v6_MOD_DROUT 144 -#define BSIM4v6_MOD_DSUB 145 -#define BSIM4v6_MOD_VTH0 146 -#define BSIM4v6_MOD_UA 147 -#define BSIM4v6_MOD_UA1 148 -#define BSIM4v6_MOD_UB 149 -#define BSIM4v6_MOD_UB1 150 -#define BSIM4v6_MOD_UC 151 -#define BSIM4v6_MOD_UC1 152 -#define BSIM4v6_MOD_U0 153 -#define BSIM4v6_MOD_UTE 154 -#define BSIM4v6_MOD_VOFF 155 -#define BSIM4v6_MOD_DELTA 156 -#define BSIM4v6_MOD_RDSW 157 -#define BSIM4v6_MOD_PRT 158 -#define BSIM4v6_MOD_LDD 159 -#define BSIM4v6_MOD_ETA 160 -#define BSIM4v6_MOD_ETA0 161 -#define BSIM4v6_MOD_ETAB 162 -#define BSIM4v6_MOD_PCLM 163 -#define BSIM4v6_MOD_PDIBL1 164 -#define BSIM4v6_MOD_PDIBL2 165 -#define BSIM4v6_MOD_PSCBE1 166 -#define BSIM4v6_MOD_PSCBE2 167 -#define BSIM4v6_MOD_PVAG 168 -#define BSIM4v6_MOD_WR 169 -#define BSIM4v6_MOD_DWG 170 -#define BSIM4v6_MOD_DWB 171 -#define BSIM4v6_MOD_B0 172 -#define BSIM4v6_MOD_B1 173 -#define BSIM4v6_MOD_ALPHA0 174 -#define BSIM4v6_MOD_BETA0 175 -#define BSIM4v6_MOD_PDIBLB 178 -#define BSIM4v6_MOD_PRWG 179 -#define BSIM4v6_MOD_PRWB 180 -#define BSIM4v6_MOD_CDSCD 181 -#define BSIM4v6_MOD_AGS 182 -#define BSIM4v6_MOD_FRINGE 184 -#define BSIM4v6_MOD_CGSL 186 -#define BSIM4v6_MOD_CGDL 187 -#define BSIM4v6_MOD_CKAPPAS 188 -#define BSIM4v6_MOD_CF 189 -#define BSIM4v6_MOD_CLC 190 -#define BSIM4v6_MOD_CLE 191 -#define BSIM4v6_MOD_PARAMCHK 192 -#define BSIM4v6_MOD_VERSION 193 -#define BSIM4v6_MOD_VFBCV 194 -#define BSIM4v6_MOD_ACDE 195 -#define BSIM4v6_MOD_MOIN 196 -#define BSIM4v6_MOD_NOFF 197 -#define BSIM4v6_MOD_IJTHDFWD 198 -#define BSIM4v6_MOD_ALPHA1 199 -#define BSIM4v6_MOD_VFB 200 -#define BSIM4v6_MOD_TOXM 201 -#define BSIM4v6_MOD_TCJ 202 -#define BSIM4v6_MOD_TCJSW 203 -#define BSIM4v6_MOD_TCJSWG 204 -#define BSIM4v6_MOD_TPB 205 -#define BSIM4v6_MOD_TPBSW 206 -#define BSIM4v6_MOD_TPBSWG 207 -#define BSIM4v6_MOD_VOFFCV 208 -#define BSIM4v6_MOD_GBMIN 209 -#define BSIM4v6_MOD_RBDB 210 -#define BSIM4v6_MOD_RBSB 211 -#define BSIM4v6_MOD_RBPB 212 -#define BSIM4v6_MOD_RBPS 213 -#define BSIM4v6_MOD_RBPD 214 -#define BSIM4v6_MOD_DMCG 215 -#define BSIM4v6_MOD_DMCI 216 -#define BSIM4v6_MOD_DMDG 217 -#define BSIM4v6_MOD_XGW 218 -#define BSIM4v6_MOD_XGL 219 -#define BSIM4v6_MOD_RSHG 220 -#define BSIM4v6_MOD_NGCON 221 -#define BSIM4v6_MOD_AGIDL 222 -#define BSIM4v6_MOD_BGIDL 223 -#define BSIM4v6_MOD_EGIDL 224 -#define BSIM4v6_MOD_IJTHSFWD 225 -#define BSIM4v6_MOD_XJBVD 226 -#define BSIM4v6_MOD_XJBVS 227 -#define BSIM4v6_MOD_BVD 228 -#define BSIM4v6_MOD_BVS 229 -#define BSIM4v6_MOD_TOXP 230 -#define BSIM4v6_MOD_DTOX 231 -#define BSIM4v6_MOD_XRCRG1 232 -#define BSIM4v6_MOD_XRCRG2 233 -#define BSIM4v6_MOD_EU 234 -#define BSIM4v6_MOD_IJTHSREV 235 -#define BSIM4v6_MOD_IJTHDREV 236 -#define BSIM4v6_MOD_MINV 237 -#define BSIM4v6_MOD_VOFFL 238 -#define BSIM4v6_MOD_PDITS 239 -#define BSIM4v6_MOD_PDITSD 240 -#define BSIM4v6_MOD_PDITSL 241 -#define BSIM4v6_MOD_TNOIA 242 -#define BSIM4v6_MOD_TNOIB 243 -#define BSIM4v6_MOD_NTNOI 244 -#define BSIM4v6_MOD_FPROUT 245 -#define BSIM4v6_MOD_LPEB 246 -#define BSIM4v6_MOD_DVTP0 247 -#define BSIM4v6_MOD_DVTP1 248 -#define BSIM4v6_MOD_CGIDL 249 -#define BSIM4v6_MOD_PHIN 250 -#define BSIM4v6_MOD_RDSWMIN 251 -#define BSIM4v6_MOD_RSW 252 -#define BSIM4v6_MOD_RDW 253 -#define BSIM4v6_MOD_RDWMIN 254 -#define BSIM4v6_MOD_RSWMIN 255 -#define BSIM4v6_MOD_NSD 256 -#define BSIM4v6_MOD_CKAPPAD 257 -#define BSIM4v6_MOD_DMCGT 258 -#define BSIM4v6_MOD_AIGC 259 -#define BSIM4v6_MOD_BIGC 260 -#define BSIM4v6_MOD_CIGC 261 -#define BSIM4v6_MOD_AIGBACC 262 -#define BSIM4v6_MOD_BIGBACC 263 -#define BSIM4v6_MOD_CIGBACC 264 -#define BSIM4v6_MOD_AIGBINV 265 -#define BSIM4v6_MOD_BIGBINV 266 -#define BSIM4v6_MOD_CIGBINV 267 -#define BSIM4v6_MOD_NIGC 268 -#define BSIM4v6_MOD_NIGBACC 269 -#define BSIM4v6_MOD_NIGBINV 270 -#define BSIM4v6_MOD_NTOX 271 -#define BSIM4v6_MOD_TOXREF 272 -#define BSIM4v6_MOD_EIGBINV 273 -#define BSIM4v6_MOD_PIGCD 274 -#define BSIM4v6_MOD_POXEDGE 275 -#define BSIM4v6_MOD_EPSROX 276 -#define BSIM4v6_MOD_AIGSD 277 -#define BSIM4v6_MOD_BIGSD 278 -#define BSIM4v6_MOD_CIGSD 279 -#define BSIM4v6_MOD_JSWGS 280 -#define BSIM4v6_MOD_JSWGD 281 -#define BSIM4v6_MOD_LAMBDA 282 -#define BSIM4v6_MOD_VTL 283 -#define BSIM4v6_MOD_LC 284 -#define BSIM4v6_MOD_XN 285 -#define BSIM4v6_MOD_RNOIA 286 -#define BSIM4v6_MOD_RNOIB 287 -#define BSIM4v6_MOD_VFBSDOFF 288 -#define BSIM4v6_MOD_LINTNOI 289 -#define BSIM4v6_MOD_UD 290 -#define BSIM4v6_MOD_UD1 291 -#define BSIM4v6_MOD_UP 292 -#define BSIM4v6_MOD_LP 293 -#define BSIM4v6_MOD_TVOFF 294 -#define BSIM4v6_MOD_TVFBSDOFF 295 -#define BSIM4v6_MOD_MINVCV 296 -#define BSIM4v6_MOD_VOFFCVL 297 - -/* Length dependence */ -#define BSIM4v6_MOD_LCDSC 301 -#define BSIM4v6_MOD_LCDSCB 302 -#define BSIM4v6_MOD_LCIT 303 -#define BSIM4v6_MOD_LNFACTOR 304 -#define BSIM4v6_MOD_LXJ 305 -#define BSIM4v6_MOD_LVSAT 306 -#define BSIM4v6_MOD_LAT 307 -#define BSIM4v6_MOD_LA0 308 -#define BSIM4v6_MOD_LA1 309 -#define BSIM4v6_MOD_LA2 310 -#define BSIM4v6_MOD_LKETA 311 -#define BSIM4v6_MOD_LNSUB 312 -#define BSIM4v6_MOD_LNDEP 313 -#define BSIM4v6_MOD_LNGATE 315 -#define BSIM4v6_MOD_LGAMMA1 316 -#define BSIM4v6_MOD_LGAMMA2 317 -#define BSIM4v6_MOD_LVBX 318 -#define BSIM4v6_MOD_LVBM 320 -#define BSIM4v6_MOD_LXT 322 -#define BSIM4v6_MOD_LK1 325 -#define BSIM4v6_MOD_LKT1 326 -#define BSIM4v6_MOD_LKT1L 327 -#define BSIM4v6_MOD_LK2 328 -#define BSIM4v6_MOD_LKT2 329 -#define BSIM4v6_MOD_LK3 330 -#define BSIM4v6_MOD_LK3B 331 -#define BSIM4v6_MOD_LW0 332 -#define BSIM4v6_MOD_LLPE0 333 -#define BSIM4v6_MOD_LDVT0 334 -#define BSIM4v6_MOD_LDVT1 335 -#define BSIM4v6_MOD_LDVT2 336 -#define BSIM4v6_MOD_LDVT0W 337 -#define BSIM4v6_MOD_LDVT1W 338 -#define BSIM4v6_MOD_LDVT2W 339 -#define BSIM4v6_MOD_LDROUT 340 -#define BSIM4v6_MOD_LDSUB 341 -#define BSIM4v6_MOD_LVTH0 342 -#define BSIM4v6_MOD_LUA 343 -#define BSIM4v6_MOD_LUA1 344 -#define BSIM4v6_MOD_LUB 345 -#define BSIM4v6_MOD_LUB1 346 -#define BSIM4v6_MOD_LUC 347 -#define BSIM4v6_MOD_LUC1 348 -#define BSIM4v6_MOD_LU0 349 -#define BSIM4v6_MOD_LUTE 350 -#define BSIM4v6_MOD_LVOFF 351 -#define BSIM4v6_MOD_LDELTA 352 -#define BSIM4v6_MOD_LRDSW 353 -#define BSIM4v6_MOD_LPRT 354 -#define BSIM4v6_MOD_LLDD 355 -#define BSIM4v6_MOD_LETA 356 -#define BSIM4v6_MOD_LETA0 357 -#define BSIM4v6_MOD_LETAB 358 -#define BSIM4v6_MOD_LPCLM 359 -#define BSIM4v6_MOD_LPDIBL1 360 -#define BSIM4v6_MOD_LPDIBL2 361 -#define BSIM4v6_MOD_LPSCBE1 362 -#define BSIM4v6_MOD_LPSCBE2 363 -#define BSIM4v6_MOD_LPVAG 364 -#define BSIM4v6_MOD_LWR 365 -#define BSIM4v6_MOD_LDWG 366 -#define BSIM4v6_MOD_LDWB 367 -#define BSIM4v6_MOD_LB0 368 -#define BSIM4v6_MOD_LB1 369 -#define BSIM4v6_MOD_LALPHA0 370 -#define BSIM4v6_MOD_LBETA0 371 -#define BSIM4v6_MOD_LPDIBLB 374 -#define BSIM4v6_MOD_LPRWG 375 -#define BSIM4v6_MOD_LPRWB 376 -#define BSIM4v6_MOD_LCDSCD 377 -#define BSIM4v6_MOD_LAGS 378 - -#define BSIM4v6_MOD_LFRINGE 381 -#define BSIM4v6_MOD_LCGSL 383 -#define BSIM4v6_MOD_LCGDL 384 -#define BSIM4v6_MOD_LCKAPPAS 385 -#define BSIM4v6_MOD_LCF 386 -#define BSIM4v6_MOD_LCLC 387 -#define BSIM4v6_MOD_LCLE 388 -#define BSIM4v6_MOD_LVFBCV 389 -#define BSIM4v6_MOD_LACDE 390 -#define BSIM4v6_MOD_LMOIN 391 -#define BSIM4v6_MOD_LNOFF 392 -#define BSIM4v6_MOD_LALPHA1 394 -#define BSIM4v6_MOD_LVFB 395 -#define BSIM4v6_MOD_LVOFFCV 396 -#define BSIM4v6_MOD_LAGIDL 397 -#define BSIM4v6_MOD_LBGIDL 398 -#define BSIM4v6_MOD_LEGIDL 399 -#define BSIM4v6_MOD_LXRCRG1 400 -#define BSIM4v6_MOD_LXRCRG2 401 -#define BSIM4v6_MOD_LEU 402 -#define BSIM4v6_MOD_LMINV 403 -#define BSIM4v6_MOD_LPDITS 404 -#define BSIM4v6_MOD_LPDITSD 405 -#define BSIM4v6_MOD_LFPROUT 406 -#define BSIM4v6_MOD_LLPEB 407 -#define BSIM4v6_MOD_LDVTP0 408 -#define BSIM4v6_MOD_LDVTP1 409 -#define BSIM4v6_MOD_LCGIDL 410 -#define BSIM4v6_MOD_LPHIN 411 -#define BSIM4v6_MOD_LRSW 412 -#define BSIM4v6_MOD_LRDW 413 -#define BSIM4v6_MOD_LNSD 414 -#define BSIM4v6_MOD_LCKAPPAD 415 -#define BSIM4v6_MOD_LAIGC 416 -#define BSIM4v6_MOD_LBIGC 417 -#define BSIM4v6_MOD_LCIGC 418 -#define BSIM4v6_MOD_LAIGBACC 419 -#define BSIM4v6_MOD_LBIGBACC 420 -#define BSIM4v6_MOD_LCIGBACC 421 -#define BSIM4v6_MOD_LAIGBINV 422 -#define BSIM4v6_MOD_LBIGBINV 423 -#define BSIM4v6_MOD_LCIGBINV 424 -#define BSIM4v6_MOD_LNIGC 425 -#define BSIM4v6_MOD_LNIGBACC 426 -#define BSIM4v6_MOD_LNIGBINV 427 -#define BSIM4v6_MOD_LNTOX 428 -#define BSIM4v6_MOD_LEIGBINV 429 -#define BSIM4v6_MOD_LPIGCD 430 -#define BSIM4v6_MOD_LPOXEDGE 431 -#define BSIM4v6_MOD_LAIGSD 432 -#define BSIM4v6_MOD_LBIGSD 433 -#define BSIM4v6_MOD_LCIGSD 434 - -#define BSIM4v6_MOD_LLAMBDA 435 -#define BSIM4v6_MOD_LVTL 436 -#define BSIM4v6_MOD_LXN 437 -#define BSIM4v6_MOD_LVFBSDOFF 438 -#define BSIM4v6_MOD_LUD 439 -#define BSIM4v6_MOD_LUD1 440 -#define BSIM4v6_MOD_LUP 441 -#define BSIM4v6_MOD_LLP 442 -#define BSIM4v6_MOD_LMINVCV 443 - -/* Width dependence */ -#define BSIM4v6_MOD_WCDSC 481 -#define BSIM4v6_MOD_WCDSCB 482 -#define BSIM4v6_MOD_WCIT 483 -#define BSIM4v6_MOD_WNFACTOR 484 -#define BSIM4v6_MOD_WXJ 485 -#define BSIM4v6_MOD_WVSAT 486 -#define BSIM4v6_MOD_WAT 487 -#define BSIM4v6_MOD_WA0 488 -#define BSIM4v6_MOD_WA1 489 -#define BSIM4v6_MOD_WA2 490 -#define BSIM4v6_MOD_WKETA 491 -#define BSIM4v6_MOD_WNSUB 492 -#define BSIM4v6_MOD_WNDEP 493 -#define BSIM4v6_MOD_WNGATE 495 -#define BSIM4v6_MOD_WGAMMA1 496 -#define BSIM4v6_MOD_WGAMMA2 497 -#define BSIM4v6_MOD_WVBX 498 -#define BSIM4v6_MOD_WVBM 500 -#define BSIM4v6_MOD_WXT 502 -#define BSIM4v6_MOD_WK1 505 -#define BSIM4v6_MOD_WKT1 506 -#define BSIM4v6_MOD_WKT1L 507 -#define BSIM4v6_MOD_WK2 508 -#define BSIM4v6_MOD_WKT2 509 -#define BSIM4v6_MOD_WK3 510 -#define BSIM4v6_MOD_WK3B 511 -#define BSIM4v6_MOD_WW0 512 -#define BSIM4v6_MOD_WLPE0 513 -#define BSIM4v6_MOD_WDVT0 514 -#define BSIM4v6_MOD_WDVT1 515 -#define BSIM4v6_MOD_WDVT2 516 -#define BSIM4v6_MOD_WDVT0W 517 -#define BSIM4v6_MOD_WDVT1W 518 -#define BSIM4v6_MOD_WDVT2W 519 -#define BSIM4v6_MOD_WDROUT 520 -#define BSIM4v6_MOD_WDSUB 521 -#define BSIM4v6_MOD_WVTH0 522 -#define BSIM4v6_MOD_WUA 523 -#define BSIM4v6_MOD_WUA1 524 -#define BSIM4v6_MOD_WUB 525 -#define BSIM4v6_MOD_WUB1 526 -#define BSIM4v6_MOD_WUC 527 -#define BSIM4v6_MOD_WUC1 528 -#define BSIM4v6_MOD_WU0 529 -#define BSIM4v6_MOD_WUTE 530 -#define BSIM4v6_MOD_WVOFF 531 -#define BSIM4v6_MOD_WDELTA 532 -#define BSIM4v6_MOD_WRDSW 533 -#define BSIM4v6_MOD_WPRT 534 -#define BSIM4v6_MOD_WLDD 535 -#define BSIM4v6_MOD_WETA 536 -#define BSIM4v6_MOD_WETA0 537 -#define BSIM4v6_MOD_WETAB 538 -#define BSIM4v6_MOD_WPCLM 539 -#define BSIM4v6_MOD_WPDIBL1 540 -#define BSIM4v6_MOD_WPDIBL2 541 -#define BSIM4v6_MOD_WPSCBE1 542 -#define BSIM4v6_MOD_WPSCBE2 543 -#define BSIM4v6_MOD_WPVAG 544 -#define BSIM4v6_MOD_WWR 545 -#define BSIM4v6_MOD_WDWG 546 -#define BSIM4v6_MOD_WDWB 547 -#define BSIM4v6_MOD_WB0 548 -#define BSIM4v6_MOD_WB1 549 -#define BSIM4v6_MOD_WALPHA0 550 -#define BSIM4v6_MOD_WBETA0 551 -#define BSIM4v6_MOD_WPDIBLB 554 -#define BSIM4v6_MOD_WPRWG 555 -#define BSIM4v6_MOD_WPRWB 556 -#define BSIM4v6_MOD_WCDSCD 557 -#define BSIM4v6_MOD_WAGS 558 - -#define BSIM4v6_MOD_WFRINGE 561 -#define BSIM4v6_MOD_WCGSL 563 -#define BSIM4v6_MOD_WCGDL 564 -#define BSIM4v6_MOD_WCKAPPAS 565 -#define BSIM4v6_MOD_WCF 566 -#define BSIM4v6_MOD_WCLC 567 -#define BSIM4v6_MOD_WCLE 568 -#define BSIM4v6_MOD_WVFBCV 569 -#define BSIM4v6_MOD_WACDE 570 -#define BSIM4v6_MOD_WMOIN 571 -#define BSIM4v6_MOD_WNOFF 572 -#define BSIM4v6_MOD_WALPHA1 574 -#define BSIM4v6_MOD_WVFB 575 -#define BSIM4v6_MOD_WVOFFCV 576 -#define BSIM4v6_MOD_WAGIDL 577 -#define BSIM4v6_MOD_WBGIDL 578 -#define BSIM4v6_MOD_WEGIDL 579 -#define BSIM4v6_MOD_WXRCRG1 580 -#define BSIM4v6_MOD_WXRCRG2 581 -#define BSIM4v6_MOD_WEU 582 -#define BSIM4v6_MOD_WMINV 583 -#define BSIM4v6_MOD_WPDITS 584 -#define BSIM4v6_MOD_WPDITSD 585 -#define BSIM4v6_MOD_WFPROUT 586 -#define BSIM4v6_MOD_WLPEB 587 -#define BSIM4v6_MOD_WDVTP0 588 -#define BSIM4v6_MOD_WDVTP1 589 -#define BSIM4v6_MOD_WCGIDL 590 -#define BSIM4v6_MOD_WPHIN 591 -#define BSIM4v6_MOD_WRSW 592 -#define BSIM4v6_MOD_WRDW 593 -#define BSIM4v6_MOD_WNSD 594 -#define BSIM4v6_MOD_WCKAPPAD 595 -#define BSIM4v6_MOD_WAIGC 596 -#define BSIM4v6_MOD_WBIGC 597 -#define BSIM4v6_MOD_WCIGC 598 -#define BSIM4v6_MOD_WAIGBACC 599 -#define BSIM4v6_MOD_WBIGBACC 600 -#define BSIM4v6_MOD_WCIGBACC 601 -#define BSIM4v6_MOD_WAIGBINV 602 -#define BSIM4v6_MOD_WBIGBINV 603 -#define BSIM4v6_MOD_WCIGBINV 604 -#define BSIM4v6_MOD_WNIGC 605 -#define BSIM4v6_MOD_WNIGBACC 606 -#define BSIM4v6_MOD_WNIGBINV 607 -#define BSIM4v6_MOD_WNTOX 608 -#define BSIM4v6_MOD_WEIGBINV 609 -#define BSIM4v6_MOD_WPIGCD 610 -#define BSIM4v6_MOD_WPOXEDGE 611 -#define BSIM4v6_MOD_WAIGSD 612 -#define BSIM4v6_MOD_WBIGSD 613 -#define BSIM4v6_MOD_WCIGSD 614 -#define BSIM4v6_MOD_WLAMBDA 615 -#define BSIM4v6_MOD_WVTL 616 -#define BSIM4v6_MOD_WXN 617 -#define BSIM4v6_MOD_WVFBSDOFF 618 -#define BSIM4v6_MOD_WUD 619 -#define BSIM4v6_MOD_WUD1 620 -#define BSIM4v6_MOD_WUP 621 -#define BSIM4v6_MOD_WLP 622 -#define BSIM4v6_MOD_WMINVCV 623 - -/* Cross-term dependence */ -#define BSIM4v6_MOD_PCDSC 661 -#define BSIM4v6_MOD_PCDSCB 662 -#define BSIM4v6_MOD_PCIT 663 -#define BSIM4v6_MOD_PNFACTOR 664 -#define BSIM4v6_MOD_PXJ 665 -#define BSIM4v6_MOD_PVSAT 666 -#define BSIM4v6_MOD_PAT 667 -#define BSIM4v6_MOD_PA0 668 -#define BSIM4v6_MOD_PA1 669 -#define BSIM4v6_MOD_PA2 670 -#define BSIM4v6_MOD_PKETA 671 -#define BSIM4v6_MOD_PNSUB 672 -#define BSIM4v6_MOD_PNDEP 673 -#define BSIM4v6_MOD_PNGATE 675 -#define BSIM4v6_MOD_PGAMMA1 676 -#define BSIM4v6_MOD_PGAMMA2 677 -#define BSIM4v6_MOD_PVBX 678 - -#define BSIM4v6_MOD_PVBM 680 - -#define BSIM4v6_MOD_PXT 682 -#define BSIM4v6_MOD_PK1 685 -#define BSIM4v6_MOD_PKT1 686 -#define BSIM4v6_MOD_PKT1L 687 -#define BSIM4v6_MOD_PK2 688 -#define BSIM4v6_MOD_PKT2 689 -#define BSIM4v6_MOD_PK3 690 -#define BSIM4v6_MOD_PK3B 691 -#define BSIM4v6_MOD_PW0 692 -#define BSIM4v6_MOD_PLPE0 693 - -#define BSIM4v6_MOD_PDVT0 694 -#define BSIM4v6_MOD_PDVT1 695 -#define BSIM4v6_MOD_PDVT2 696 - -#define BSIM4v6_MOD_PDVT0W 697 -#define BSIM4v6_MOD_PDVT1W 698 -#define BSIM4v6_MOD_PDVT2W 699 - -#define BSIM4v6_MOD_PDROUT 700 -#define BSIM4v6_MOD_PDSUB 701 -#define BSIM4v6_MOD_PVTH0 702 -#define BSIM4v6_MOD_PUA 703 -#define BSIM4v6_MOD_PUA1 704 -#define BSIM4v6_MOD_PUB 705 -#define BSIM4v6_MOD_PUB1 706 -#define BSIM4v6_MOD_PUC 707 -#define BSIM4v6_MOD_PUC1 708 -#define BSIM4v6_MOD_PU0 709 -#define BSIM4v6_MOD_PUTE 710 -#define BSIM4v6_MOD_PVOFF 711 -#define BSIM4v6_MOD_PDELTA 712 -#define BSIM4v6_MOD_PRDSW 713 -#define BSIM4v6_MOD_PPRT 714 -#define BSIM4v6_MOD_PLDD 715 -#define BSIM4v6_MOD_PETA 716 -#define BSIM4v6_MOD_PETA0 717 -#define BSIM4v6_MOD_PETAB 718 -#define BSIM4v6_MOD_PPCLM 719 -#define BSIM4v6_MOD_PPDIBL1 720 -#define BSIM4v6_MOD_PPDIBL2 721 -#define BSIM4v6_MOD_PPSCBE1 722 -#define BSIM4v6_MOD_PPSCBE2 723 -#define BSIM4v6_MOD_PPVAG 724 -#define BSIM4v6_MOD_PWR 725 -#define BSIM4v6_MOD_PDWG 726 -#define BSIM4v6_MOD_PDWB 727 -#define BSIM4v6_MOD_PB0 728 -#define BSIM4v6_MOD_PB1 729 -#define BSIM4v6_MOD_PALPHA0 730 -#define BSIM4v6_MOD_PBETA0 731 -#define BSIM4v6_MOD_PPDIBLB 734 - -#define BSIM4v6_MOD_PPRWG 735 -#define BSIM4v6_MOD_PPRWB 736 - -#define BSIM4v6_MOD_PCDSCD 737 -#define BSIM4v6_MOD_PAGS 738 - -#define BSIM4v6_MOD_PFRINGE 741 -#define BSIM4v6_MOD_PCGSL 743 -#define BSIM4v6_MOD_PCGDL 744 -#define BSIM4v6_MOD_PCKAPPAS 745 -#define BSIM4v6_MOD_PCF 746 -#define BSIM4v6_MOD_PCLC 747 -#define BSIM4v6_MOD_PCLE 748 -#define BSIM4v6_MOD_PVFBCV 749 -#define BSIM4v6_MOD_PACDE 750 -#define BSIM4v6_MOD_PMOIN 751 -#define BSIM4v6_MOD_PNOFF 752 -#define BSIM4v6_MOD_PALPHA1 754 -#define BSIM4v6_MOD_PVFB 755 -#define BSIM4v6_MOD_PVOFFCV 756 -#define BSIM4v6_MOD_PAGIDL 757 -#define BSIM4v6_MOD_PBGIDL 758 -#define BSIM4v6_MOD_PEGIDL 759 -#define BSIM4v6_MOD_PXRCRG1 760 -#define BSIM4v6_MOD_PXRCRG2 761 -#define BSIM4v6_MOD_PEU 762 -#define BSIM4v6_MOD_PMINV 763 -#define BSIM4v6_MOD_PPDITS 764 -#define BSIM4v6_MOD_PPDITSD 765 -#define BSIM4v6_MOD_PFPROUT 766 -#define BSIM4v6_MOD_PLPEB 767 -#define BSIM4v6_MOD_PDVTP0 768 -#define BSIM4v6_MOD_PDVTP1 769 -#define BSIM4v6_MOD_PCGIDL 770 -#define BSIM4v6_MOD_PPHIN 771 -#define BSIM4v6_MOD_PRSW 772 -#define BSIM4v6_MOD_PRDW 773 -#define BSIM4v6_MOD_PNSD 774 -#define BSIM4v6_MOD_PCKAPPAD 775 -#define BSIM4v6_MOD_PAIGC 776 -#define BSIM4v6_MOD_PBIGC 777 -#define BSIM4v6_MOD_PCIGC 778 -#define BSIM4v6_MOD_PAIGBACC 779 -#define BSIM4v6_MOD_PBIGBACC 780 -#define BSIM4v6_MOD_PCIGBACC 781 -#define BSIM4v6_MOD_PAIGBINV 782 -#define BSIM4v6_MOD_PBIGBINV 783 -#define BSIM4v6_MOD_PCIGBINV 784 -#define BSIM4v6_MOD_PNIGC 785 -#define BSIM4v6_MOD_PNIGBACC 786 -#define BSIM4v6_MOD_PNIGBINV 787 -#define BSIM4v6_MOD_PNTOX 788 -#define BSIM4v6_MOD_PEIGBINV 789 -#define BSIM4v6_MOD_PPIGCD 790 -#define BSIM4v6_MOD_PPOXEDGE 791 -#define BSIM4v6_MOD_PAIGSD 792 -#define BSIM4v6_MOD_PBIGSD 793 -#define BSIM4v6_MOD_PCIGSD 794 - -#define BSIM4v6_MOD_SAREF 795 -#define BSIM4v6_MOD_SBREF 796 -#define BSIM4v6_MOD_KU0 797 -#define BSIM4v6_MOD_KVSAT 798 -#define BSIM4v6_MOD_TKU0 799 -#define BSIM4v6_MOD_LLODKU0 800 -#define BSIM4v6_MOD_WLODKU0 801 -#define BSIM4v6_MOD_LLODVTH 802 -#define BSIM4v6_MOD_WLODVTH 803 -#define BSIM4v6_MOD_LKU0 804 -#define BSIM4v6_MOD_WKU0 805 -#define BSIM4v6_MOD_PKU0 806 -#define BSIM4v6_MOD_KVTH0 807 -#define BSIM4v6_MOD_LKVTH0 808 -#define BSIM4v6_MOD_WKVTH0 809 -#define BSIM4v6_MOD_PKVTH0 810 -#define BSIM4v6_MOD_WLOD 811 -#define BSIM4v6_MOD_STK2 812 -#define BSIM4v6_MOD_LODK2 813 -#define BSIM4v6_MOD_STETA0 814 -#define BSIM4v6_MOD_LODETA0 815 - -#define BSIM4v6_MOD_WEB 816 -#define BSIM4v6_MOD_WEC 817 -#define BSIM4v6_MOD_KVTH0WE 818 -#define BSIM4v6_MOD_K2WE 819 -#define BSIM4v6_MOD_KU0WE 820 -#define BSIM4v6_MOD_SCREF 821 -#define BSIM4v6_MOD_WPEMOD 822 -#define BSIM4v6_MOD_PMINVCV 823 - -#define BSIM4v6_MOD_PLAMBDA 825 -#define BSIM4v6_MOD_PVTL 826 -#define BSIM4v6_MOD_PXN 827 -#define BSIM4v6_MOD_PVFBSDOFF 828 - -#define BSIM4v6_MOD_TNOM 831 -#define BSIM4v6_MOD_CGSO 832 -#define BSIM4v6_MOD_CGDO 833 -#define BSIM4v6_MOD_CGBO 834 -#define BSIM4v6_MOD_XPART 835 -#define BSIM4v6_MOD_RSH 836 -#define BSIM4v6_MOD_JSS 837 -#define BSIM4v6_MOD_PBS 838 -#define BSIM4v6_MOD_MJS 839 -#define BSIM4v6_MOD_PBSWS 840 -#define BSIM4v6_MOD_MJSWS 841 -#define BSIM4v6_MOD_CJS 842 -#define BSIM4v6_MOD_CJSWS 843 -#define BSIM4v6_MOD_NMOS 844 -#define BSIM4v6_MOD_PMOS 845 -#define BSIM4v6_MOD_NOIA 846 -#define BSIM4v6_MOD_NOIB 847 -#define BSIM4v6_MOD_NOIC 848 -#define BSIM4v6_MOD_LINT 849 -#define BSIM4v6_MOD_LL 850 -#define BSIM4v6_MOD_LLN 851 -#define BSIM4v6_MOD_LW 852 -#define BSIM4v6_MOD_LWN 853 -#define BSIM4v6_MOD_LWL 854 -#define BSIM4v6_MOD_LMIN 855 -#define BSIM4v6_MOD_LMAX 856 -#define BSIM4v6_MOD_WINT 857 -#define BSIM4v6_MOD_WL 858 -#define BSIM4v6_MOD_WLN 859 -#define BSIM4v6_MOD_WW 860 -#define BSIM4v6_MOD_WWN 861 -#define BSIM4v6_MOD_WWL 862 -#define BSIM4v6_MOD_WMIN 863 -#define BSIM4v6_MOD_WMAX 864 -#define BSIM4v6_MOD_DWC 865 -#define BSIM4v6_MOD_DLC 866 -#define BSIM4v6_MOD_XL 867 -#define BSIM4v6_MOD_XW 868 -#define BSIM4v6_MOD_EM 869 -#define BSIM4v6_MOD_EF 870 -#define BSIM4v6_MOD_AF 871 -#define BSIM4v6_MOD_KF 872 -#define BSIM4v6_MOD_NJS 873 -#define BSIM4v6_MOD_XTIS 874 -#define BSIM4v6_MOD_PBSWGS 875 -#define BSIM4v6_MOD_MJSWGS 876 -#define BSIM4v6_MOD_CJSWGS 877 -#define BSIM4v6_MOD_JSWS 878 -#define BSIM4v6_MOD_LLC 879 -#define BSIM4v6_MOD_LWC 880 -#define BSIM4v6_MOD_LWLC 881 -#define BSIM4v6_MOD_WLC 882 -#define BSIM4v6_MOD_WWC 883 -#define BSIM4v6_MOD_WWLC 884 -#define BSIM4v6_MOD_DWJ 885 -#define BSIM4v6_MOD_JSD 886 -#define BSIM4v6_MOD_PBD 887 -#define BSIM4v6_MOD_MJD 888 -#define BSIM4v6_MOD_PBSWD 889 -#define BSIM4v6_MOD_MJSWD 890 -#define BSIM4v6_MOD_CJD 891 -#define BSIM4v6_MOD_CJSWD 892 -#define BSIM4v6_MOD_NJD 893 -#define BSIM4v6_MOD_XTID 894 -#define BSIM4v6_MOD_PBSWGD 895 -#define BSIM4v6_MOD_MJSWGD 896 -#define BSIM4v6_MOD_CJSWGD 897 -#define BSIM4v6_MOD_JSWD 898 -#define BSIM4v6_MOD_DLCIG 899 - -/* trap-assisted tunneling */ - -#define BSIM4v6_MOD_JTSS 900 -#define BSIM4v6_MOD_JTSD 901 -#define BSIM4v6_MOD_JTSSWS 902 -#define BSIM4v6_MOD_JTSSWD 903 -#define BSIM4v6_MOD_JTSSWGS 904 -#define BSIM4v6_MOD_JTSSWGD 905 -#define BSIM4v6_MOD_NJTS 906 -#define BSIM4v6_MOD_NJTSSW 907 -#define BSIM4v6_MOD_NJTSSWG 908 -#define BSIM4v6_MOD_XTSS 909 -#define BSIM4v6_MOD_XTSD 910 -#define BSIM4v6_MOD_XTSSWS 911 -#define BSIM4v6_MOD_XTSSWD 912 -#define BSIM4v6_MOD_XTSSWGS 913 -#define BSIM4v6_MOD_XTSSWGD 914 -#define BSIM4v6_MOD_TNJTS 915 -#define BSIM4v6_MOD_TNJTSSW 916 -#define BSIM4v6_MOD_TNJTSSWG 917 -#define BSIM4v6_MOD_VTSS 918 -#define BSIM4v6_MOD_VTSD 919 -#define BSIM4v6_MOD_VTSSWS 920 -#define BSIM4v6_MOD_VTSSWD 921 -#define BSIM4v6_MOD_VTSSWGS 922 -#define BSIM4v6_MOD_VTSSWGD 923 -#define BSIM4v6_MOD_PUD 924 -#define BSIM4v6_MOD_PUD1 925 -#define BSIM4v6_MOD_PUP 926 -#define BSIM4v6_MOD_PLP 927 -#define BSIM4v6_MOD_JTWEFF 928 - -/* device questions */ -#define BSIM4v6_DNODE 945 -#define BSIM4v6_GNODEEXT 946 -#define BSIM4v6_SNODE 947 -#define BSIM4v6_BNODE 948 -#define BSIM4v6_DNODEPRIME 949 -#define BSIM4v6_GNODEPRIME 950 -#define BSIM4v6_GNODEMIDE 951 -#define BSIM4v6_GNODEMID 952 -#define BSIM4v6_SNODEPRIME 953 -#define BSIM4v6_BNODEPRIME 954 -#define BSIM4v6_DBNODE 955 -#define BSIM4v6_SBNODE 956 -#define BSIM4v6_VBD 957 -#define BSIM4v6_VBS 958 -#define BSIM4v6_VGS 959 -#define BSIM4v6_VDS 960 -#define BSIM4v6_CD 961 -#define BSIM4v6_CBS 962 -#define BSIM4v6_CBD 963 -#define BSIM4v6_GM 964 -#define BSIM4v6_GDS 965 -#define BSIM4v6_GMBS 966 -#define BSIM4v6_GBD 967 -#define BSIM4v6_GBS 968 -#define BSIM4v6_QB 969 -#define BSIM4v6_CQB 970 -#define BSIM4v6_QG 971 -#define BSIM4v6_CQG 972 -#define BSIM4v6_QD 973 -#define BSIM4v6_CQD 974 -#define BSIM4v6_CGGB 975 -#define BSIM4v6_CGDB 976 -#define BSIM4v6_CGSB 977 -#define BSIM4v6_CBGB 978 -#define BSIM4v6_CAPBD 979 -#define BSIM4v6_CQBD 980 -#define BSIM4v6_CAPBS 981 -#define BSIM4v6_CQBS 982 -#define BSIM4v6_CDGB 983 -#define BSIM4v6_CDDB 984 -#define BSIM4v6_CDSB 985 -#define BSIM4v6_VON 986 -#define BSIM4v6_VDSAT 987 -#define BSIM4v6_QBS 988 -#define BSIM4v6_QBD 989 -#define BSIM4v6_SOURCECONDUCT 990 -#define BSIM4v6_DRAINCONDUCT 991 -#define BSIM4v6_CBDB 992 -#define BSIM4v6_CBSB 993 -#define BSIM4v6_CSUB 994 -#define BSIM4v6_QINV 995 -#define BSIM4v6_IGIDL 996 -#define BSIM4v6_CSGB 997 -#define BSIM4v6_CSDB 998 -#define BSIM4v6_CSSB 999 -#define BSIM4v6_CGBB 1000 -#define BSIM4v6_CDBB 1001 -#define BSIM4v6_CSBB 1002 -#define BSIM4v6_CBBB 1003 -#define BSIM4v6_QS 1004 -#define BSIM4v6_IGISL 1005 -#define BSIM4v6_IGS 1006 -#define BSIM4v6_IGD 1007 -#define BSIM4v6_IGB 1008 -#define BSIM4v6_IGCS 1009 -#define BSIM4v6_IGCD 1010 -#define BSIM4v6_QDEF 1011 -#define BSIM4v6_DELVT0 1012 -#define BSIM4v6_GCRG 1013 -#define BSIM4v6_GTAU 1014 - -#define BSIM4v6_MOD_LTVOFF 1051 -#define BSIM4v6_MOD_LTVFBSDOFF 1052 -#define BSIM4v6_MOD_WTVOFF 1053 -#define BSIM4v6_MOD_WTVFBSDOFF 1054 -#define BSIM4v6_MOD_PTVOFF 1055 -#define BSIM4v6_MOD_PTVFBSDOFF 1056 - -#define BSIM4v6_MOD_LKVTH0WE 1061 -#define BSIM4v6_MOD_LK2WE 1062 -#define BSIM4v6_MOD_LKU0WE 1063 -#define BSIM4v6_MOD_WKVTH0WE 1064 -#define BSIM4v6_MOD_WK2WE 1065 -#define BSIM4v6_MOD_WKU0WE 1066 -#define BSIM4v6_MOD_PKVTH0WE 1067 -#define BSIM4v6_MOD_PK2WE 1068 -#define BSIM4v6_MOD_PKU0WE 1069 - -#define BSIM4v6_MOD_RBPS0 1101 -#define BSIM4v6_MOD_RBPSL 1102 -#define BSIM4v6_MOD_RBPSW 1103 -#define BSIM4v6_MOD_RBPSNF 1104 -#define BSIM4v6_MOD_RBPD0 1105 -#define BSIM4v6_MOD_RBPDL 1106 -#define BSIM4v6_MOD_RBPDW 1107 -#define BSIM4v6_MOD_RBPDNF 1108 - -#define BSIM4v6_MOD_RBPBX0 1109 -#define BSIM4v6_MOD_RBPBXL 1110 -#define BSIM4v6_MOD_RBPBXW 1111 -#define BSIM4v6_MOD_RBPBXNF 1112 -#define BSIM4v6_MOD_RBPBY0 1113 -#define BSIM4v6_MOD_RBPBYL 1114 -#define BSIM4v6_MOD_RBPBYW 1115 -#define BSIM4v6_MOD_RBPBYNF 1116 - -#define BSIM4v6_MOD_RBSBX0 1117 -#define BSIM4v6_MOD_RBSBY0 1118 -#define BSIM4v6_MOD_RBDBX0 1119 -#define BSIM4v6_MOD_RBDBY0 1120 - -#define BSIM4v6_MOD_RBSDBXL 1121 -#define BSIM4v6_MOD_RBSDBXW 1122 -#define BSIM4v6_MOD_RBSDBXNF 1123 -#define BSIM4v6_MOD_RBSDBYL 1124 -#define BSIM4v6_MOD_RBSDBYW 1125 -#define BSIM4v6_MOD_RBSDBYNF 1126 - -#define BSIM4v6_MOD_AGISL 1200 -#define BSIM4v6_MOD_BGISL 1201 -#define BSIM4v6_MOD_EGISL 1202 -#define BSIM4v6_MOD_CGISL 1203 -#define BSIM4v6_MOD_LAGISL 1204 -#define BSIM4v6_MOD_LBGISL 1205 -#define BSIM4v6_MOD_LEGISL 1206 -#define BSIM4v6_MOD_LCGISL 1207 -#define BSIM4v6_MOD_WAGISL 1208 -#define BSIM4v6_MOD_WBGISL 1209 -#define BSIM4v6_MOD_WEGISL 1210 -#define BSIM4v6_MOD_WCGISL 1211 -#define BSIM4v6_MOD_PAGISL 1212 -#define BSIM4v6_MOD_PBGISL 1213 -#define BSIM4v6_MOD_PEGISL 1214 -#define BSIM4v6_MOD_PCGISL 1215 - -#define BSIM4v6_MOD_AIGS 1220 -#define BSIM4v6_MOD_BIGS 1221 -#define BSIM4v6_MOD_CIGS 1222 -#define BSIM4v6_MOD_LAIGS 1223 -#define BSIM4v6_MOD_LBIGS 1224 -#define BSIM4v6_MOD_LCIGS 1225 -#define BSIM4v6_MOD_WAIGS 1226 -#define BSIM4v6_MOD_WBIGS 1227 -#define BSIM4v6_MOD_WCIGS 1228 -#define BSIM4v6_MOD_PAIGS 1229 -#define BSIM4v6_MOD_PBIGS 1230 -#define BSIM4v6_MOD_PCIGS 1231 -#define BSIM4v6_MOD_AIGD 1232 -#define BSIM4v6_MOD_BIGD 1233 -#define BSIM4v6_MOD_CIGD 1234 -#define BSIM4v6_MOD_LAIGD 1235 -#define BSIM4v6_MOD_LBIGD 1236 -#define BSIM4v6_MOD_LCIGD 1237 -#define BSIM4v6_MOD_WAIGD 1238 -#define BSIM4v6_MOD_WBIGD 1239 -#define BSIM4v6_MOD_WCIGD 1240 -#define BSIM4v6_MOD_PAIGD 1241 -#define BSIM4v6_MOD_PBIGD 1242 -#define BSIM4v6_MOD_PCIGD 1243 -#define BSIM4v6_MOD_DLCIGD 1244 - -#define BSIM4v6_MOD_NJTSD 1250 -#define BSIM4v6_MOD_NJTSSWD 1251 -#define BSIM4v6_MOD_NJTSSWGD 1252 -#define BSIM4v6_MOD_TNJTSD 1253 -#define BSIM4v6_MOD_TNJTSSWD 1254 -#define BSIM4v6_MOD_TNJTSSWGD 1255 - -#define BSIM4v6_MOD_VGS_MAX 1301 -#define BSIM4v6_MOD_VGD_MAX 1302 -#define BSIM4v6_MOD_VGB_MAX 1303 -#define BSIM4v6_MOD_VDS_MAX 1304 -#define BSIM4v6_MOD_VBS_MAX 1305 -#define BSIM4v6_MOD_VBD_MAX 1306 -#define BSIM4v6_MOD_VGSR_MAX 1307 -#define BSIM4v6_MOD_VGDR_MAX 1308 -#define BSIM4v6_MOD_VGBR_MAX 1309 -#define BSIM4v6_MOD_VBSR_MAX 1310 -#define BSIM4v6_MOD_VBDR_MAX 1311 - -#include "bsim4v6ext.h" - -extern void BSIM4v6evaluate(double,double,double,BSIM4v6instance*,BSIM4v6model*, - double*,double*,double*, double*, double*, double*, double*, - double*, double*, double*, double*, double*, double*, double*, - double*, double*, double*, double*, CKTcircuit*); -extern int BSIM4v6debug(BSIM4v6model*, BSIM4v6instance*, CKTcircuit*, int); -extern int BSIM4v6checkModel(BSIM4v6model*, BSIM4v6instance*, CKTcircuit*); -extern int BSIM4v6PAeffGeo(double, int, int, double, double, double, double, double *, double *, double *, double *); -extern int BSIM4v6RdseffGeo(double, int, int, int, double, double, double, double, double, int, double *); - - -#endif /*BSIM4v6*/ diff --git a/src/spicelib/devices/bsim4v6/bsim4v6ext.h b/src/spicelib/devices/bsim4v6/bsim4v6ext.h deleted file mode 100644 index 0ff7394c5..000000000 --- a/src/spicelib/devices/bsim4v6/bsim4v6ext.h +++ /dev/null @@ -1,29 +0,0 @@ -/********** -Copyright 2004 Regents of the University of California. All rights reserved. -Author: 2000 Weidong Liu -Author: 2001- Xuemei Xi -File: bsim4v6ext.h -**********/ - -extern int BSIM4v6acLoad(GENmodel *,CKTcircuit*); -extern int BSIM4v6ask(CKTcircuit *,GENinstance*,int,IFvalue*,IFvalue*); -extern int BSIM4v6convTest(GENmodel *,CKTcircuit*); -extern int BSIM4v6getic(GENmodel*,CKTcircuit*); -extern int BSIM4v6load(GENmodel*,CKTcircuit*); -extern int BSIM4v6mAsk(CKTcircuit*,GENmodel *,int, IFvalue*); -extern int BSIM4v6mDelete(GENmodel*); -extern int BSIM4v6mParam(int,IFvalue*,GENmodel*); -extern void BSIM4v6mosCap(CKTcircuit*, double, double, double, double, - double, double, double, double, double, double, double, - double, double, double, double, double, double, double*, - double*, double*, double*, double*, double*, double*, double*, - double*, double*, double*, double*, double*, double*, double*, - double*); -extern int BSIM4v6param(int,IFvalue*,GENinstance*,IFvalue*); -extern int BSIM4v6pzLoad(GENmodel*,CKTcircuit*,SPcomplex*); -extern int BSIM4v6setup(SMPmatrix*,GENmodel*,CKTcircuit*,int*); -extern int BSIM4v6temp(GENmodel*,CKTcircuit*); -extern int BSIM4v6trunc(GENmodel*,CKTcircuit*,double*); -extern int BSIM4v6noise(int,int,GENmodel*,CKTcircuit*,Ndata*,double*); -extern int BSIM4v6unsetup(GENmodel*,CKTcircuit*); -extern int BSIM4v6soaCheck(CKTcircuit *, GENmodel *); diff --git a/src/spicelib/devices/bsim4v6/bsim4v6init.c b/src/spicelib/devices/bsim4v6/bsim4v6init.c deleted file mode 100644 index b31970d15..000000000 --- a/src/spicelib/devices/bsim4v6/bsim4v6init.c +++ /dev/null @@ -1,76 +0,0 @@ -#include "ngspice/config.h" - -#include "ngspice/devdefs.h" - -#include "bsim4v6itf.h" -#include "bsim4v6ext.h" -#include "bsim4v6init.h" - - -SPICEdev BSIM4v6info = { - .DEVpublic = { - .name = "BSIM4v6", - .description = "Berkeley Short Channel IGFET Model-4", - .terms = &BSIM4v6nSize, - .numNames = &BSIM4v6nSize, - .termNames = BSIM4v6names, - .numInstanceParms = &BSIM4v6pTSize, - .instanceParms = BSIM4v6pTable, - .numModelParms = &BSIM4v6mPTSize, - .modelParms = BSIM4v6mPTable, - .flags = DEV_DEFAULT, - -#ifdef XSPICE - .cm_func = NULL, - .num_conn = 0, - .conn = NULL, - .num_param = 0, - .param = NULL, - .num_inst_var = 0, - .inst_var = NULL, -#endif - }, - - .DEVparam = BSIM4v6param, - .DEVmodParam = BSIM4v6mParam, - .DEVload = BSIM4v6load, - .DEVsetup = BSIM4v6setup, - .DEVunsetup = BSIM4v6unsetup, - .DEVpzSetup = BSIM4v6setup, - .DEVtemperature = BSIM4v6temp, - .DEVtrunc = BSIM4v6trunc, - .DEVfindBranch = NULL, - .DEVacLoad = BSIM4v6acLoad, - .DEVaccept = NULL, - .DEVdestroy = NULL, - .DEVmodDelete = BSIM4v6mDelete, - .DEVdelete = NULL, - .DEVsetic = BSIM4v6getic, - .DEVask = BSIM4v6ask, - .DEVmodAsk = BSIM4v6mAsk, - .DEVpzLoad = BSIM4v6pzLoad, - .DEVconvTest = BSIM4v6convTest, - .DEVsenSetup = NULL, - .DEVsenLoad = NULL, - .DEVsenUpdate = NULL, - .DEVsenAcLoad = NULL, - .DEVsenPrint = NULL, - .DEVsenTrunc = NULL, - .DEVdisto = NULL, - .DEVnoise = BSIM4v6noise, - .DEVsoaCheck = BSIM4v6soaCheck, - .DEVinstSize = &BSIM4v6iSize, - .DEVmodSize = &BSIM4v6mSize, - -#ifdef CIDER - .DEVdump = NULL, - .DEVacct = NULL, -#endif -}; - - -SPICEdev * -get_bsim4v6_info(void) -{ - return &BSIM4v6info; -} diff --git a/src/spicelib/devices/bsim4v6/bsim4v6init.h b/src/spicelib/devices/bsim4v6/bsim4v6init.h deleted file mode 100644 index 51e4ae05c..000000000 --- a/src/spicelib/devices/bsim4v6/bsim4v6init.h +++ /dev/null @@ -1,13 +0,0 @@ -#ifndef _BSIM4v6INIT_H -#define _BSIM4v6INIT_H - -extern IFparm BSIM4v6pTable[ ]; -extern IFparm BSIM4v6mPTable[ ]; -extern char *BSIM4v6names[ ]; -extern int BSIM4v6pTSize; -extern int BSIM4v6mPTSize; -extern int BSIM4v6nSize; -extern int BSIM4v6iSize; -extern int BSIM4v6mSize; - -#endif diff --git a/src/spicelib/devices/bsim4v6/bsim4v6itf.h b/src/spicelib/devices/bsim4v6/bsim4v6itf.h deleted file mode 100644 index 7acd92f7e..000000000 --- a/src/spicelib/devices/bsim4v6/bsim4v6itf.h +++ /dev/null @@ -1,13 +0,0 @@ -/********** -Copyright 2004 Regents of the University of California. All rights reserved. -Author: 2000 Weidong Liu. -Author: 2001- Xuemei Xi -File: bsim4v6itf.h -**********/ - -#ifndef DEV_BSIM4v6 -#define DEV_BSIM4v6 - -SPICEdev *get_bsim4v6_info(void); - -#endif diff --git a/src/spicelib/devices/bsim4v7/B4TERMS_OF_USE b/src/spicelib/devices/bsim4v7/B4TERMS_OF_USE deleted file mode 100644 index 5cc4023bb..000000000 --- a/src/spicelib/devices/bsim4v7/B4TERMS_OF_USE +++ /dev/null @@ -1,33 +0,0 @@ - -The terms under which the software is provided are as the following. - -Software is distributed as is, completely without warranty or service -support. The University of California and its employees are not liable -for the condition or performance of the software. - -The University owns the copyright but shall not be liable for any -infringement of copyright or other proprietary rights brought by third -parties against the users of the software. - -The University of California hereby disclaims all implied warranties. - -The University of California grants the users the right to modify, copy, -and redistribute the software and documentation, both within the user's -organization and externally, subject to the following restrictions: - -1. The users agree not to charge for the University of California code - itself but may charge for additions, extensions, or support. - -2. In any product based on the software, the users agree to acknowledge - the UC Berkeley BSIM Research Group that developed the software. This - acknowledgment shall appear in the product documentation. - -3. The users agree to obey all U.S. Government restrictions governing - redistribution or export of the software. - -4. The users agree to reproduce any copyright notice which appears on - the software on any copy or modification of such made available - to others. - -Chenming Hu, and Weidong Liu -Mar. 2000 diff --git a/src/spicelib/devices/bsim4v7/Makefile.am b/src/spicelib/devices/bsim4v7/Makefile.am deleted file mode 100644 index 4bb833752..000000000 --- a/src/spicelib/devices/bsim4v7/Makefile.am +++ /dev/null @@ -1,37 +0,0 @@ -## Process this file with automake to produce Makefile.in - -noinst_LTLIBRARIES = libbsim4v7.la - -libbsim4v7_la_SOURCES = \ - b4v7.c \ - b4v7acld.c \ - b4v7ask.c \ - b4v7check.c \ - b4v7cvtest.c \ - b4v7geo.c \ - b4v7getic.c \ - b4v7ld.c \ - b4v7mask.c \ - b4v7mdel.c \ - b4v7mpar.c \ - b4v7noi.c \ - b4v7par.c \ - b4v7pzld.c \ - b4v7set.c \ - b4v7soachk.c \ - b4v7temp.c \ - b4v7trunc.c \ - bsim4v7def.h \ - bsim4v7ext.h \ - bsim4v7init.c \ - bsim4v7init.h \ - bsim4v7itf.h - - - -AM_CPPFLAGS = @AM_CPPFLAGS@ -I$(top_srcdir)/src/include -AM_CFLAGS = $(STATIC) - -MAINTAINERCLEANFILES = Makefile.in - -EXTRA_DIST = B4TERMS_OF_USE diff --git a/src/spicelib/devices/bsim4v7/b4v7.c b/src/spicelib/devices/bsim4v7/b4v7.c deleted file mode 100644 index cb7cd3633..000000000 --- a/src/spicelib/devices/bsim4v7/b4v7.c +++ /dev/null @@ -1,1064 +0,0 @@ -/**** BSIM4.7.0 Released by Darsen Lu 04/08/2011 ****/ - -/********** - * Copyright 2006 Regents of the University of California. All rights reserved. - * File: b4.c of BSIM4.7.0. - * Author: 2000 Weidong Liu - * Authors: 2001- Xuemei Xi, Mohan Dunga, Ali Niknejad, Chenming Hu. - * Authors: 2006- Mohan Dunga, Ali Niknejad, Chenming Hu - * Authors: 2007- Mohan Dunga, Wenwei Yang, Ali Niknejad, Chenming Hu - * Authors: 2008- Wenwei Yang, Ali Niknejad, Chenming Hu - * Project Director: Prof. Chenming Hu. - * Modified by Xuemei Xi, 04/06/2001. - * Modified by Xuemei Xi, 10/05/2001. - * Modified by Xuemei Xi, 11/15/2002. - * Modified by Xuemei Xi, 05/09/2003. - * Modified by Xuemei Xi, 03/04/2004. - * Modified by Xuemei Xi, Mohan Dunga, 07/29/2005. - * Modified by Mohan Dunga, 12/13/2006. - * Modified by Mohan Dunga, Wenwei Yang, 05/18/2007. - * Modified by Wenwei Yang, 07/31/2008. - * Modified by Tanvir Morshed, Darsen Lu 03/27/2011 - **********/ - -#include "ngspice/ngspice.h" -#include "ngspice/devdefs.h" -#include "bsim4v7def.h" -#include "ngspice/suffix.h" - -IFparm BSIM4v7pTable[] = { /* parameters */ -IOP( "l", BSIM4v7_L, IF_REAL , "Length"), -IOP( "w", BSIM4v7_W, IF_REAL , "Width"), -IOP( "m", BSIM4v7_M, IF_REAL , "Separate Parallel multiplier"), -IOP( "nf", BSIM4v7_NF, IF_REAL , "Number of fingers"), -IOP( "sa", BSIM4v7_SA, IF_REAL , "distance between OD edge to poly of one side "), -IOP( "sb", BSIM4v7_SB, IF_REAL , "distance between OD edge to poly of the other side"), -IOP( "sd", BSIM4v7_SD, IF_REAL , "distance between neighbour fingers"), -IOP( "sca", BSIM4v7_SCA, IF_REAL , "Integral of the first distribution function for scattered well dopant"), -IOP( "scb", BSIM4v7_SCB, IF_REAL , "Integral of the second distribution function for scattered well dopant"), -IOP( "scc", BSIM4v7_SCC, IF_REAL , "Integral of the third distribution function for scattered well dopant"), -IOP( "sc", BSIM4v7_SC, IF_REAL , "Distance to a single well edge "), -IOP( "min", BSIM4v7_MIN, IF_INTEGER , "Minimize either D or S"), -IOP( "ad", BSIM4v7_AD, IF_REAL , "Drain area"), -IOP( "as", BSIM4v7_AS, IF_REAL , "Source area"), -IOP( "pd", BSIM4v7_PD, IF_REAL , "Drain perimeter"), -IOP( "ps", BSIM4v7_PS, IF_REAL , "Source perimeter"), -IOP( "nrd", BSIM4v7_NRD, IF_REAL , "Number of squares in drain"), -IOP( "nrs", BSIM4v7_NRS, IF_REAL , "Number of squares in source"), -IOP( "off", BSIM4v7_OFF, IF_FLAG , "Device is initially off"), -IOP( "rbdb", BSIM4v7_RBDB, IF_REAL , "Body resistance"), -IOP( "rbsb", BSIM4v7_RBSB, IF_REAL , "Body resistance"), -IOP( "rbpb", BSIM4v7_RBPB, IF_REAL , "Body resistance"), -IOP( "rbps", BSIM4v7_RBPS, IF_REAL , "Body resistance"), -IOP( "rbpd", BSIM4v7_RBPD, IF_REAL , "Body resistance"), -IOP( "delvto", BSIM4v7_DELVTO, IF_REAL , "Zero bias threshold voltage variation"), -IOPR( "delvt0", BSIM4v7_DELVTO, IF_REAL , "Zero bias threshold voltage variation"), -IOP( "mulu0", BSIM4v7_MULU0, IF_REAL, "Low field mobility multiplier"), -IOP( "xgw", BSIM4v7_XGW, IF_REAL, "Distance from gate contact center to device edge"), -IOP( "ngcon", BSIM4v7_NGCON, IF_REAL, "Number of gate contacts"), -IOP( "wnflag", BSIM4v7_WNFLAG, IF_INTEGER, "W/NF device flag for bin selection"), - -IOP( "trnqsmod", BSIM4v7_TRNQSMOD, IF_INTEGER, "Transient NQS model selector"), -IOP( "acnqsmod", BSIM4v7_ACNQSMOD, IF_INTEGER, "AC NQS model selector"), -IOP( "rbodymod", BSIM4v7_RBODYMOD, IF_INTEGER, "Distributed body R model selector"), -IOP( "rgatemod", BSIM4v7_RGATEMOD, IF_INTEGER, "Gate resistance model selector"), -IOP( "geomod", BSIM4v7_GEOMOD, IF_INTEGER, "Geometry dependent parasitics model selector"), -IOP( "rgeomod", BSIM4v7_RGEOMOD, IF_INTEGER, "S/D resistance and contact model selector"), -IP( "ic", BSIM4v7_IC, IF_REALVEC , "Vector of DS,GS,BS initial voltages"), -OP( "gmbs", BSIM4v7_GMBS, IF_REAL, "Gmb"), -OP( "gm", BSIM4v7_GM, IF_REAL, "Gm"), -OP( "gds", BSIM4v7_GDS, IF_REAL, "Gds"), -OP( "vdsat", BSIM4v7_VDSAT, IF_REAL, "Vdsat"), -OP( "vth", BSIM4v7_VON, IF_REAL, "Vth"), -OP( "id", BSIM4v7_CD, IF_REAL, "Ids"), -OP( "ibd", BSIM4v7_CBD, IF_REAL, "Ibd"), -OP( "ibs", BSIM4v7_CBS, IF_REAL, "Ibs"), -OP( "gbd", BSIM4v7_GBD, IF_REAL, "gbd"), -OP( "gbs", BSIM4v7_GBS, IF_REAL, "gbs"), -OP( "isub", BSIM4v7_CSUB, IF_REAL, "Isub"), -OP( "igidl", BSIM4v7_IGIDL, IF_REAL, "Igidl"), -OP( "igisl", BSIM4v7_IGISL, IF_REAL, "Igisl"), -OP( "igs", BSIM4v7_IGS, IF_REAL, "Igs"), -OP( "igd", BSIM4v7_IGD, IF_REAL, "Igd"), -OP( "igb", BSIM4v7_IGB, IF_REAL, "Igb"), -OP( "igcs", BSIM4v7_IGCS, IF_REAL, "Igcs"), -OP( "igcd", BSIM4v7_IGCD, IF_REAL, "Igcd"), -OP( "vbs", BSIM4v7_VBS, IF_REAL, "Vbs"), -OP( "vgs", BSIM4v7_VGS, IF_REAL, "Vgs"), -OP( "vds", BSIM4v7_VDS, IF_REAL, "Vds"), -OP( "cgg", BSIM4v7_CGGB, IF_REAL, "Cggb"), -OP( "cgs", BSIM4v7_CGSB, IF_REAL, "Cgsb"), -OP( "cgd", BSIM4v7_CGDB, IF_REAL, "Cgdb"), -OP( "cbg", BSIM4v7_CBGB, IF_REAL, "Cbgb"), -OP( "cbd", BSIM4v7_CBDB, IF_REAL, "Cbdb"), -OP( "cbs", BSIM4v7_CBSB, IF_REAL, "Cbsb"), -OP( "cdg", BSIM4v7_CDGB, IF_REAL, "Cdgb"), -OP( "cdd", BSIM4v7_CDDB, IF_REAL, "Cddb"), -OP( "cds", BSIM4v7_CDSB, IF_REAL, "Cdsb"), -OP( "csg", BSIM4v7_CSGB, IF_REAL, "Csgb"), -OP( "csd", BSIM4v7_CSDB, IF_REAL, "Csdb"), -OP( "css", BSIM4v7_CSSB, IF_REAL, "Cssb"), -OP( "cgb", BSIM4v7_CGBB, IF_REAL, "Cgbb"), -OP( "cdb", BSIM4v7_CDBB, IF_REAL, "Cdbb"), -OP( "csb", BSIM4v7_CSBB, IF_REAL, "Csbb"), -OP( "cbb", BSIM4v7_CBBB, IF_REAL, "Cbbb"), -OP( "capbd", BSIM4v7_CAPBD, IF_REAL, "Capbd"), -OP( "capbs", BSIM4v7_CAPBS, IF_REAL, "Capbs"), -OP( "qg", BSIM4v7_QG, IF_REAL, "Qgate"), -OP( "qb", BSIM4v7_QB, IF_REAL, "Qbulk"), -OP( "qd", BSIM4v7_QD, IF_REAL, "Qdrain"), -OP( "qs", BSIM4v7_QS, IF_REAL, "Qsource"), -OP( "qinv", BSIM4v7_QINV, IF_REAL, "Qinversion"), -OP( "qdef", BSIM4v7_QDEF, IF_REAL, "Qdef"), -OP( "gcrg", BSIM4v7_GCRG, IF_REAL, "Gcrg"), -OP( "gtau", BSIM4v7_GTAU, IF_REAL, "Gtau"), -}; - -IFparm BSIM4v7mPTable[] = { /* model parameters */ -IOP( "cvchargemod", BSIM4v7_MOD_CVCHARGEMOD, IF_INTEGER, "Capacitance Charge model selector"), -IOP( "capmod", BSIM4v7_MOD_CAPMOD, IF_INTEGER, "Capacitance model selector"), -IOP( "diomod", BSIM4v7_MOD_DIOMOD, IF_INTEGER, "Diode IV model selector"), -IOP( "rdsmod", BSIM4v7_MOD_RDSMOD, IF_INTEGER, "Bias-dependent S/D resistance model selector"), -IOP( "trnqsmod", BSIM4v7_MOD_TRNQSMOD, IF_INTEGER, "Transient NQS model selector"), -IOP( "acnqsmod", BSIM4v7_MOD_ACNQSMOD, IF_INTEGER, "AC NQS model selector"), -IOP( "mobmod", BSIM4v7_MOD_MOBMOD, IF_INTEGER, "Mobility model selector"), -IOP( "rbodymod", BSIM4v7_MOD_RBODYMOD, IF_INTEGER, "Distributed body R model selector"), -IOP( "rgatemod", BSIM4v7_MOD_RGATEMOD, IF_INTEGER, "Gate R model selector"), -IOP( "permod", BSIM4v7_MOD_PERMOD, IF_INTEGER, "Pd and Ps model selector"), -IOP( "geomod", BSIM4v7_MOD_GEOMOD, IF_INTEGER, "Geometry dependent parasitics model selector"), -IOP( "rgeomod", BSIM4v7_MOD_RGEOMOD, IF_INTEGER, "S/D resistance and contact model selector"), -IOP( "fnoimod", BSIM4v7_MOD_FNOIMOD, IF_INTEGER, "Flicker noise model selector"), -IOP( "tnoimod", BSIM4v7_MOD_TNOIMOD, IF_INTEGER, "Thermal noise model selector"), -IOP( "mtrlmod", BSIM4v7_MOD_MTRLMOD, IF_INTEGER, "parameter for non-silicon substrate or metal gate selector"), -IOP( "mtrlcompatmod", BSIM4v7_MOD_MTRLCOMPATMOD, IF_INTEGER, "New Material Mod backward compatibility selector"), -IOP( "igcmod", BSIM4v7_MOD_IGCMOD, IF_INTEGER, "Gate-to-channel Ig model selector"), -IOP( "igbmod", BSIM4v7_MOD_IGBMOD, IF_INTEGER, "Gate-to-body Ig model selector"), -IOP( "tempmod", BSIM4v7_MOD_TEMPMOD, IF_INTEGER, "Temperature model selector"), -IOP( "gidlmod", BSIM4v7_MOD_GIDLMOD, IF_INTEGER, "parameter for GIDL selector"), /* v4.7 New GIDL/GISL */ -IOP( "paramchk", BSIM4v7_MOD_PARAMCHK, IF_INTEGER, "Model parameter checking selector"), -IOP( "binunit", BSIM4v7_MOD_BINUNIT, IF_INTEGER, "Bin unit selector"), -IOP( "version", BSIM4v7_MOD_VERSION, IF_STRING, "parameter for model version"), -IOP( "eot", BSIM4v7_MOD_EOT, IF_REAL, "Equivalent gate oxide thickness in meters"), -IOP( "vddeot", BSIM4v7_MOD_VDDEOT, IF_REAL, "Voltage for extraction of Equivalent gate oxide thickness"), -IOP( "tempeot", BSIM4v7_MOD_TEMPEOT, IF_REAL, " Temperature for extraction of EOT"), -IOP( "leffeot", BSIM4v7_MOD_LEFFEOT, IF_REAL, " Effective length for extraction of EOT"), -IOP( "weffeot", BSIM4v7_MOD_WEFFEOT, IF_REAL, "Effective width for extraction of EOT"), -IOP( "ados", BSIM4v7_MOD_ADOS, IF_REAL, "Charge centroid parameter"), -IOP( "bdos", BSIM4v7_MOD_BDOS, IF_REAL, "Charge centroid parameter"), -IOP( "toxe", BSIM4v7_MOD_TOXE, IF_REAL, "Electrical gate oxide thickness in meters"), -IOP( "toxp", BSIM4v7_MOD_TOXP, IF_REAL, "Physical gate oxide thickness in meters"), -IOP( "toxm", BSIM4v7_MOD_TOXM, IF_REAL, "Gate oxide thickness at which parameters are extracted"), -IOP( "toxref", BSIM4v7_MOD_TOXREF, IF_REAL, "Target tox value"), -IOP( "dtox", BSIM4v7_MOD_DTOX, IF_REAL, "Defined as (toxe - toxp) "), -IOP( "epsrox", BSIM4v7_MOD_EPSROX, IF_REAL, "Dielectric constant of the gate oxide relative to vacuum"), -IOP( "cdsc", BSIM4v7_MOD_CDSC, IF_REAL, "Drain/Source and channel coupling capacitance"), -IOP( "cdscb", BSIM4v7_MOD_CDSCB, IF_REAL, "Body-bias dependence of cdsc"), -IOP( "cdscd", BSIM4v7_MOD_CDSCD, IF_REAL, "Drain-bias dependence of cdsc"), -IOP( "cit", BSIM4v7_MOD_CIT, IF_REAL, "Interface state capacitance"), -IOP( "nfactor", BSIM4v7_MOD_NFACTOR, IF_REAL, "Subthreshold swing Coefficient"), -IOP( "xj", BSIM4v7_MOD_XJ, IF_REAL, "Junction depth in meters"), -IOP( "vsat", BSIM4v7_MOD_VSAT, IF_REAL, "Saturation velocity at tnom"), -IOP( "at", BSIM4v7_MOD_AT, IF_REAL, "Temperature coefficient of vsat"), -IOP( "a0", BSIM4v7_MOD_A0, IF_REAL, "Non-uniform depletion width effect coefficient."), -IOP( "ags", BSIM4v7_MOD_AGS, IF_REAL, "Gate bias coefficient of Abulk."), -IOP( "a1", BSIM4v7_MOD_A1, IF_REAL, "Non-saturation effect coefficient"), -IOP( "a2", BSIM4v7_MOD_A2, IF_REAL, "Non-saturation effect coefficient"), -IOP( "keta", BSIM4v7_MOD_KETA, IF_REAL, "Body-bias coefficient of non-uniform depletion width effect."), -IOP( "phig", BSIM4v7_MOD_PHIG, IF_REAL, "Work function of gate"), -IOP( "epsrgate", BSIM4v7_MOD_EPSRGATE, IF_REAL, "Dielectric constant of gate relative to vacuum"), -IOP( "easub",BSIM4v7_MOD_EASUB, IF_REAL, "Electron affinity of substrate"), -IOP( "epsrsub", BSIM4v7_MOD_EPSRSUB, IF_REAL, "Dielectric constant of substrate relative to vacuum"), -IOP( "ni0sub", BSIM4v7_MOD_NI0SUB, IF_REAL, "Intrinsic carrier concentration of substrate at 300.15K"), -IOP( "bg0sub", BSIM4v7_MOD_BG0SUB, IF_REAL, "Band-gap of substrate at T=0K"), -IOP( "tbgasub", BSIM4v7_MOD_TBGASUB, IF_REAL, "First parameter of band-gap change due to temperature"), -IOP( "tbgbsub", BSIM4v7_MOD_TBGBSUB, IF_REAL, "Second parameter of band-gap change due to temperature"), -IOP( "nsub", BSIM4v7_MOD_NSUB, IF_REAL, "Substrate doping concentration"), -IOP( "ndep", BSIM4v7_MOD_NDEP, IF_REAL, "Channel doping concentration at the depletion edge"), -IOP( "nsd", BSIM4v7_MOD_NSD, IF_REAL, "S/D doping concentration"), -IOP( "phin", BSIM4v7_MOD_PHIN, IF_REAL, "Adjusting parameter for surface potential due to non-uniform vertical doping"), -IOP( "ngate", BSIM4v7_MOD_NGATE, IF_REAL, "Poly-gate doping concentration"), -IOP( "gamma1", BSIM4v7_MOD_GAMMA1, IF_REAL, "Vth body coefficient"), -IOP( "gamma2", BSIM4v7_MOD_GAMMA2, IF_REAL, "Vth body coefficient"), -IOP( "vbx", BSIM4v7_MOD_VBX, IF_REAL, "Vth transition body Voltage"), -IOP( "vbm", BSIM4v7_MOD_VBM, IF_REAL, "Maximum body voltage"), - -IOP( "xt", BSIM4v7_MOD_XT, IF_REAL, "Doping depth"), -IOP( "k1", BSIM4v7_MOD_K1, IF_REAL, "Bulk effect coefficient 1"), -IOP( "kt1", BSIM4v7_MOD_KT1, IF_REAL, "Temperature coefficient of Vth"), -IOP( "kt1l", BSIM4v7_MOD_KT1L, IF_REAL, "Temperature coefficient of Vth"), -IOP( "kt2", BSIM4v7_MOD_KT2, IF_REAL, "Body-coefficient of kt1"), -IOP( "k2", BSIM4v7_MOD_K2, IF_REAL, "Bulk effect coefficient 2"), -IOP( "k3", BSIM4v7_MOD_K3, IF_REAL, "Narrow width effect coefficient"), -IOP( "k3b", BSIM4v7_MOD_K3B, IF_REAL, "Body effect coefficient of k3"), -IOP( "w0", BSIM4v7_MOD_W0, IF_REAL, "Narrow width effect parameter"), -IOP( "dvtp0", BSIM4v7_MOD_DVTP0, IF_REAL, "First parameter for Vth shift due to pocket"), -IOP( "dvtp1", BSIM4v7_MOD_DVTP1, IF_REAL, "Second parameter for Vth shift due to pocket"), -IOP( "dvtp2", BSIM4v7_MOD_DVTP2, IF_REAL, "3rd parameter for Vth shift due to pocket"), -IOP( "dvtp3", BSIM4v7_MOD_DVTP3, IF_REAL, "4th parameter for Vth shift due to pocket"), -IOP( "dvtp4", BSIM4v7_MOD_DVTP4, IF_REAL, "5th parameter for Vth shift due to pocket"), -IOP( "dvtp5", BSIM4v7_MOD_DVTP5, IF_REAL, "6th parameter for Vth shift due to pocket"), -IOP( "lpe0", BSIM4v7_MOD_LPE0, IF_REAL, "Equivalent length of pocket region at zero bias"), -IOP( "lpeb", BSIM4v7_MOD_LPEB, IF_REAL, "Equivalent length of pocket region accounting for body bias"), -IOP( "dvt0", BSIM4v7_MOD_DVT0, IF_REAL, "Short channel effect coeff. 0"), -IOP( "dvt1", BSIM4v7_MOD_DVT1, IF_REAL, "Short channel effect coeff. 1"), -IOP( "dvt2", BSIM4v7_MOD_DVT2, IF_REAL, "Short channel effect coeff. 2"), -IOP( "dvt0w", BSIM4v7_MOD_DVT0W, IF_REAL, "Narrow Width coeff. 0"), -IOP( "dvt1w", BSIM4v7_MOD_DVT1W, IF_REAL, "Narrow Width effect coeff. 1"), -IOP( "dvt2w", BSIM4v7_MOD_DVT2W, IF_REAL, "Narrow Width effect coeff. 2"), -IOP( "drout", BSIM4v7_MOD_DROUT, IF_REAL, "DIBL coefficient of output resistance"), -IOP( "dsub", BSIM4v7_MOD_DSUB, IF_REAL, "DIBL coefficient in the subthreshold region"), -IOP( "vth0", BSIM4v7_MOD_VTH0, IF_REAL,"Threshold voltage"), -IOPR("vtho", BSIM4v7_MOD_VTH0, IF_REAL,"Threshold voltage"), -IOP( "ua", BSIM4v7_MOD_UA, IF_REAL, "Linear gate dependence of mobility"), -IOP( "ua1", BSIM4v7_MOD_UA1, IF_REAL, "Temperature coefficient of ua"), -IOP( "ub", BSIM4v7_MOD_UB, IF_REAL, "Quadratic gate dependence of mobility"), -IOP( "ub1", BSIM4v7_MOD_UB1, IF_REAL, "Temperature coefficient of ub"), -IOP( "uc", BSIM4v7_MOD_UC, IF_REAL, "Body-bias dependence of mobility"), -IOP( "uc1", BSIM4v7_MOD_UC1, IF_REAL, "Temperature coefficient of uc"), -IOP( "ud", BSIM4v7_MOD_UD, IF_REAL, "Coulomb scattering factor of mobility"), -IOP( "ud1", BSIM4v7_MOD_UD1, IF_REAL, "Temperature coefficient of ud"), -IOP( "up", BSIM4v7_MOD_UP, IF_REAL, "Channel length linear factor of mobility"), -IOP( "lp", BSIM4v7_MOD_LP, IF_REAL, "Channel length exponential factor of mobility"), -IOP( "u0", BSIM4v7_MOD_U0, IF_REAL, "Low-field mobility at Tnom"), -IOP( "eu", BSIM4v7_MOD_EU, IF_REAL, "Mobility exponent"), -IOP( "ucs", BSIM4v7_MOD_UCS, IF_REAL, "Colombic scattering exponent"), -IOP( "ute", BSIM4v7_MOD_UTE, IF_REAL, "Temperature coefficient of mobility"), -IOP( "ucste", BSIM4v7_MOD_UCSTE, IF_REAL,"Temperature coefficient of colombic mobility"), -IOP( "voff", BSIM4v7_MOD_VOFF, IF_REAL, "Threshold voltage offset"), -IOP( "minv", BSIM4v7_MOD_MINV, IF_REAL, "Fitting parameter for moderate inversion in Vgsteff"), -IOP( "minvcv", BSIM4v7_MOD_MINVCV, IF_REAL, "Fitting parameter for moderate inversion in Vgsteffcv"), -IOP( "voffl", BSIM4v7_MOD_VOFFL, IF_REAL, "Length dependence parameter for Vth offset"), -IOP( "voffcvl", BSIM4v7_MOD_VOFFCVL, IF_REAL, "Length dependence parameter for Vth offset in CV"), -IOP( "tnom", BSIM4v7_MOD_TNOM, IF_REAL, "Parameter measurement temperature"), -IOP( "cgso", BSIM4v7_MOD_CGSO, IF_REAL, "Gate-source overlap capacitance per width"), -IOP( "cgdo", BSIM4v7_MOD_CGDO, IF_REAL, "Gate-drain overlap capacitance per width"), -IOP( "cgbo", BSIM4v7_MOD_CGBO, IF_REAL, "Gate-bulk overlap capacitance per length"), -IOP( "xpart", BSIM4v7_MOD_XPART, IF_REAL, "Channel charge partitioning"), -IOP( "delta", BSIM4v7_MOD_DELTA, IF_REAL, "Effective Vds parameter"), -IOP( "rsh", BSIM4v7_MOD_RSH, IF_REAL, "Source-drain sheet resistance"), -IOP( "rdsw", BSIM4v7_MOD_RDSW, IF_REAL, "Source-drain resistance per width"), -IOP( "rdswmin", BSIM4v7_MOD_RDSWMIN, IF_REAL, "Source-drain resistance per width at high Vg"), -IOP( "rsw", BSIM4v7_MOD_RSW, IF_REAL, "Source resistance per width"), -IOP( "rdw", BSIM4v7_MOD_RDW, IF_REAL, "Drain resistance per width"), -IOP( "rdwmin", BSIM4v7_MOD_RDWMIN, IF_REAL, "Drain resistance per width at high Vg"), -IOP( "rswmin", BSIM4v7_MOD_RSWMIN, IF_REAL, "Source resistance per width at high Vg"), - -IOP( "prwg", BSIM4v7_MOD_PRWG, IF_REAL, "Gate-bias effect on parasitic resistance "), -IOP( "prwb", BSIM4v7_MOD_PRWB, IF_REAL, "Body-effect on parasitic resistance "), - -IOP( "prt", BSIM4v7_MOD_PRT, IF_REAL, "Temperature coefficient of parasitic resistance "), -IOP( "eta0", BSIM4v7_MOD_ETA0, IF_REAL, "Subthreshold region DIBL coefficient"), -IOP( "etab", BSIM4v7_MOD_ETAB, IF_REAL, "Subthreshold region DIBL coefficient"), -IOP( "pclm", BSIM4v7_MOD_PCLM, IF_REAL, "Channel length modulation Coefficient"), -IOP( "pdiblc1", BSIM4v7_MOD_PDIBL1, IF_REAL, "Drain-induced barrier lowering coefficient"), -IOP( "pdiblc2", BSIM4v7_MOD_PDIBL2, IF_REAL, "Drain-induced barrier lowering coefficient"), -IOP( "pdiblcb", BSIM4v7_MOD_PDIBLB, IF_REAL, "Body-effect on drain-induced barrier lowering"), -IOP( "fprout", BSIM4v7_MOD_FPROUT, IF_REAL, "Rout degradation coefficient for pocket devices"), -IOP( "pdits", BSIM4v7_MOD_PDITS, IF_REAL, "Coefficient for drain-induced Vth shifts"), -IOP( "pditsl", BSIM4v7_MOD_PDITSL, IF_REAL, "Length dependence of drain-induced Vth shifts"), -IOP( "pditsd", BSIM4v7_MOD_PDITSD, IF_REAL, "Vds dependence of drain-induced Vth shifts"), -IOP( "pscbe1", BSIM4v7_MOD_PSCBE1, IF_REAL, "Substrate current body-effect coefficient"), -IOP( "pscbe2", BSIM4v7_MOD_PSCBE2, IF_REAL, "Substrate current body-effect coefficient"), -IOP( "pvag", BSIM4v7_MOD_PVAG, IF_REAL, "Gate dependence of output resistance parameter"), - -IOP( "jss", BSIM4v7_MOD_JSS, IF_REAL, "Bottom source junction reverse saturation current density"), -IOP( "jsws", BSIM4v7_MOD_JSWS, IF_REAL, "Isolation edge sidewall source junction reverse saturation current density"), -IOP( "jswgs", BSIM4v7_MOD_JSWGS, IF_REAL, "Gate edge source junction reverse saturation current density"), -IOP( "pbs", BSIM4v7_MOD_PBS, IF_REAL, "Source junction built-in potential"), -IOP( "njs", BSIM4v7_MOD_NJS, IF_REAL, "Source junction emission coefficient"), -IOP( "xtis", BSIM4v7_MOD_XTIS, IF_REAL, "Source junction current temperature exponent"), -IOP( "mjs", BSIM4v7_MOD_MJS, IF_REAL, "Source bottom junction capacitance grading coefficient"), -IOP( "pbsws", BSIM4v7_MOD_PBSWS, IF_REAL, "Source sidewall junction capacitance built in potential"), -IOP( "mjsws", BSIM4v7_MOD_MJSWS, IF_REAL, "Source sidewall junction capacitance grading coefficient"), -IOP( "pbswgs", BSIM4v7_MOD_PBSWGS, IF_REAL, "Source (gate side) sidewall junction capacitance built in potential"), -IOP( "mjswgs", BSIM4v7_MOD_MJSWGS, IF_REAL, "Source (gate side) sidewall junction capacitance grading coefficient"), -IOP( "cjs", BSIM4v7_MOD_CJS, IF_REAL, "Source bottom junction capacitance per unit area"), -IOP( "cjsws", BSIM4v7_MOD_CJSWS, IF_REAL, "Source sidewall junction capacitance per unit periphery"), -IOP( "cjswgs", BSIM4v7_MOD_CJSWGS, IF_REAL, "Source (gate side) sidewall junction capacitance per unit width"), - -IOP( "jsd", BSIM4v7_MOD_JSD, IF_REAL, "Bottom drain junction reverse saturation current density"), -IOP( "jswd", BSIM4v7_MOD_JSWD, IF_REAL, "Isolation edge sidewall drain junction reverse saturation current density"), -IOP( "jswgd", BSIM4v7_MOD_JSWGD, IF_REAL, "Gate edge drain junction reverse saturation current density"), -IOP( "pbd", BSIM4v7_MOD_PBD, IF_REAL, "Drain junction built-in potential"), -IOP( "njd", BSIM4v7_MOD_NJD, IF_REAL, "Drain junction emission coefficient"), -IOP( "xtid", BSIM4v7_MOD_XTID, IF_REAL, "Drainjunction current temperature exponent"), -IOP( "mjd", BSIM4v7_MOD_MJD, IF_REAL, "Drain bottom junction capacitance grading coefficient"), -IOP( "pbswd", BSIM4v7_MOD_PBSWD, IF_REAL, "Drain sidewall junction capacitance built in potential"), -IOP( "mjswd", BSIM4v7_MOD_MJSWD, IF_REAL, "Drain sidewall junction capacitance grading coefficient"), -IOP( "pbswgd", BSIM4v7_MOD_PBSWGD, IF_REAL, "Drain (gate side) sidewall junction capacitance built in potential"), -IOP( "mjswgd", BSIM4v7_MOD_MJSWGD, IF_REAL, "Drain (gate side) sidewall junction capacitance grading coefficient"), -IOP( "cjd", BSIM4v7_MOD_CJD, IF_REAL, "Drain bottom junction capacitance per unit area"), -IOP( "cjswd", BSIM4v7_MOD_CJSWD, IF_REAL, "Drain sidewall junction capacitance per unit periphery"), -IOP( "cjswgd", BSIM4v7_MOD_CJSWGD, IF_REAL, "Drain (gate side) sidewall junction capacitance per unit width"), - -IOP( "vfbcv", BSIM4v7_MOD_VFBCV, IF_REAL, "Flat Band Voltage parameter for capmod=0 only"), -IOP( "vfb", BSIM4v7_MOD_VFB, IF_REAL, "Flat Band Voltage"), -IOP( "tpb", BSIM4v7_MOD_TPB, IF_REAL, "Temperature coefficient of pb"), -IOP( "tcj", BSIM4v7_MOD_TCJ, IF_REAL, "Temperature coefficient of cj"), -IOP( "tpbsw", BSIM4v7_MOD_TPBSW, IF_REAL, "Temperature coefficient of pbsw"), -IOP( "tcjsw", BSIM4v7_MOD_TCJSW, IF_REAL, "Temperature coefficient of cjsw"), -IOP( "tpbswg", BSIM4v7_MOD_TPBSWG, IF_REAL, "Temperature coefficient of pbswg"), -IOP( "tcjswg", BSIM4v7_MOD_TCJSWG, IF_REAL, "Temperature coefficient of cjswg"), -IOP( "acde", BSIM4v7_MOD_ACDE, IF_REAL, "Exponential coefficient for finite charge thickness"), -IOP( "moin", BSIM4v7_MOD_MOIN, IF_REAL, "Coefficient for gate-bias dependent surface potential"), -IOP( "noff", BSIM4v7_MOD_NOFF, IF_REAL, "C-V turn-on/off parameter"), -IOP( "voffcv", BSIM4v7_MOD_VOFFCV, IF_REAL, "C-V lateral-shift parameter"), -IOP( "dmcg", BSIM4v7_MOD_DMCG, IF_REAL, "Distance of Mid-Contact to Gate edge"), -IOP( "dmci", BSIM4v7_MOD_DMCI, IF_REAL, "Distance of Mid-Contact to Isolation"), -IOP( "dmdg", BSIM4v7_MOD_DMDG, IF_REAL, "Distance of Mid-Diffusion to Gate edge"), -IOP( "dmcgt", BSIM4v7_MOD_DMCGT, IF_REAL, "Distance of Mid-Contact to Gate edge in Test structures"), -IOP( "xgw", BSIM4v7_MOD_XGW, IF_REAL, "Distance from gate contact center to device edge"), -IOP( "xgl", BSIM4v7_MOD_XGL, IF_REAL, "Variation in Ldrawn"), -IOP( "rshg", BSIM4v7_MOD_RSHG, IF_REAL, "Gate sheet resistance"), -IOP( "ngcon", BSIM4v7_MOD_NGCON, IF_REAL, "Number of gate contacts"), -IOP( "xrcrg1", BSIM4v7_MOD_XRCRG1, IF_REAL, "First fitting parameter the bias-dependent Rg"), -IOP( "xrcrg2", BSIM4v7_MOD_XRCRG2, IF_REAL, "Second fitting parameter the bias-dependent Rg"), -IOP( "lambda", BSIM4v7_MOD_LAMBDA, IF_REAL, " Velocity overshoot parameter"), -IOP( "vtl", BSIM4v7_MOD_VTL, IF_REAL, " thermal velocity"), -IOP( "lc", BSIM4v7_MOD_LC, IF_REAL, " back scattering parameter"), -IOP( "xn", BSIM4v7_MOD_XN, IF_REAL, " back scattering parameter"), -IOP( "vfbsdoff", BSIM4v7_MOD_VFBSDOFF, IF_REAL, "S/D flatband voltage offset"), -IOP( "tvfbsdoff", BSIM4v7_MOD_TVFBSDOFF, IF_REAL, "Temperature parameter for vfbsdoff"), -IOP( "tvoff", BSIM4v7_MOD_TVOFF, IF_REAL, "Temperature parameter for voff"), -IOP( "tnfactor", BSIM4v7_MOD_TNFACTOR, IF_REAL, "Temperature parameter for nfactor"), /* v4.7 Tanvir*/ -IOP( "teta0", BSIM4v7_MOD_TETA0, IF_REAL, "Temperature parameter for eta0"), /* v4.7 Tanvir*/ -IOP( "tvoffcv", BSIM4v7_MOD_TVOFFCV, IF_REAL, "Temperature parameter for tvoffcv"), /* v4.7 Tanvir*/ - -IOP( "lintnoi", BSIM4v7_MOD_LINTNOI, IF_REAL, "lint offset for noise calculation"), -IOP( "lint", BSIM4v7_MOD_LINT, IF_REAL, "Length reduction parameter"), -IOP( "ll", BSIM4v7_MOD_LL, IF_REAL, "Length reduction parameter"), -IOP( "llc", BSIM4v7_MOD_LLC, IF_REAL, "Length reduction parameter for CV"), -IOP( "lln", BSIM4v7_MOD_LLN, IF_REAL, "Length reduction parameter"), -IOP( "lw", BSIM4v7_MOD_LW, IF_REAL, "Length reduction parameter"), -IOP( "lwc", BSIM4v7_MOD_LWC, IF_REAL, "Length reduction parameter for CV"), -IOP( "lwn", BSIM4v7_MOD_LWN, IF_REAL, "Length reduction parameter"), -IOP( "lwl", BSIM4v7_MOD_LWL, IF_REAL, "Length reduction parameter"), -IOP( "lwlc", BSIM4v7_MOD_LWLC, IF_REAL, "Length reduction parameter for CV"), -IOP( "lmin", BSIM4v7_MOD_LMIN, IF_REAL, "Minimum length for the model"), -IOP( "lmax", BSIM4v7_MOD_LMAX, IF_REAL, "Maximum length for the model"), - -IOP( "wr", BSIM4v7_MOD_WR, IF_REAL, "Width dependence of rds"), -IOP( "wint", BSIM4v7_MOD_WINT, IF_REAL, "Width reduction parameter"), -IOP( "dwg", BSIM4v7_MOD_DWG, IF_REAL, "Width reduction parameter"), -IOP( "dwb", BSIM4v7_MOD_DWB, IF_REAL, "Width reduction parameter"), - -IOP( "wl", BSIM4v7_MOD_WL, IF_REAL, "Width reduction parameter"), -IOP( "wlc", BSIM4v7_MOD_WLC, IF_REAL, "Width reduction parameter for CV"), -IOP( "wln", BSIM4v7_MOD_WLN, IF_REAL, "Width reduction parameter"), -IOP( "ww", BSIM4v7_MOD_WW, IF_REAL, "Width reduction parameter"), -IOP( "wwc", BSIM4v7_MOD_WWC, IF_REAL, "Width reduction parameter for CV"), -IOP( "wwn", BSIM4v7_MOD_WWN, IF_REAL, "Width reduction parameter"), -IOP( "wwl", BSIM4v7_MOD_WWL, IF_REAL, "Width reduction parameter"), -IOP( "wwlc", BSIM4v7_MOD_WWLC, IF_REAL, "Width reduction parameter for CV"), -IOP( "wmin", BSIM4v7_MOD_WMIN, IF_REAL, "Minimum width for the model"), -IOP( "wmax", BSIM4v7_MOD_WMAX, IF_REAL, "Maximum width for the model"), - -IOP( "b0", BSIM4v7_MOD_B0, IF_REAL, "Abulk narrow width parameter"), -IOP( "b1", BSIM4v7_MOD_B1, IF_REAL, "Abulk narrow width parameter"), - -IOP( "cgsl", BSIM4v7_MOD_CGSL, IF_REAL, "New C-V model parameter"), -IOP( "cgdl", BSIM4v7_MOD_CGDL, IF_REAL, "New C-V model parameter"), -IOP( "ckappas", BSIM4v7_MOD_CKAPPAS, IF_REAL, "S/G overlap C-V parameter "), -IOP( "ckappad", BSIM4v7_MOD_CKAPPAD, IF_REAL, "D/G overlap C-V parameter"), -IOP( "cf", BSIM4v7_MOD_CF, IF_REAL, "Fringe capacitance parameter"), -IOP( "clc", BSIM4v7_MOD_CLC, IF_REAL, "Vdsat parameter for C-V model"), -IOP( "cle", BSIM4v7_MOD_CLE, IF_REAL, "Vdsat parameter for C-V model"), -IOP( "dwc", BSIM4v7_MOD_DWC, IF_REAL, "Delta W for C-V model"), -IOP( "dlc", BSIM4v7_MOD_DLC, IF_REAL, "Delta L for C-V model"), -IOP( "xw", BSIM4v7_MOD_XW, IF_REAL, "W offset for channel width due to mask/etch effect"), -IOP( "xl", BSIM4v7_MOD_XL, IF_REAL, "L offset for channel length due to mask/etch effect"), -IOP( "dlcig", BSIM4v7_MOD_DLCIG, IF_REAL, "Delta L for Ig model"), -IOP( "dlcigd", BSIM4v7_MOD_DLCIGD, IF_REAL, "Delta L for Ig model drain side"), -IOP( "dwj", BSIM4v7_MOD_DWJ, IF_REAL, "Delta W for S/D junctions"), - -IOP( "alpha0", BSIM4v7_MOD_ALPHA0, IF_REAL, "substrate current model parameter"), -IOP( "alpha1", BSIM4v7_MOD_ALPHA1, IF_REAL, "substrate current model parameter"), -IOP( "beta0", BSIM4v7_MOD_BETA0, IF_REAL, "substrate current model parameter"), - -IOP( "agidl", BSIM4v7_MOD_AGIDL, IF_REAL, "Pre-exponential constant for GIDL"), -IOP( "bgidl", BSIM4v7_MOD_BGIDL, IF_REAL, "Exponential constant for GIDL"), -IOP( "cgidl", BSIM4v7_MOD_CGIDL, IF_REAL, "Parameter for body-bias dependence of GIDL"), -IOP( "rgidl", BSIM4v7_MOD_RGIDL, IF_REAL, "GIDL vg parameter"), /* v4.7 New GIDL/GISL */ -IOP( "kgidl", BSIM4v7_MOD_KGIDL, IF_REAL, "GIDL vb parameter"), /* v4.7 New GIDL/GISL */ -IOP( "fgidl", BSIM4v7_MOD_FGIDL, IF_REAL, "GIDL vb parameter"), /* v4.7 New GIDL/GISL */ -IOP( "egidl", BSIM4v7_MOD_EGIDL, IF_REAL, "Fitting parameter for Bandbending"), -IOP( "agisl", BSIM4v7_MOD_AGISL, IF_REAL, "Pre-exponential constant for GISL"), -IOP( "bgisl", BSIM4v7_MOD_BGISL, IF_REAL, "Exponential constant for GISL"), -IOP( "cgisl", BSIM4v7_MOD_CGISL, IF_REAL, "Parameter for body-bias dependence of GISL"), -IOP( "rgisl", BSIM4v7_MOD_RGISL, IF_REAL, "GISL vg parameter"), /* v4.7 New GIDL/GISL */ -IOP( "kgisl", BSIM4v7_MOD_KGISL, IF_REAL, "GISL vb parameter"), /* v4.7 New GIDL/GISL */ -IOP( "fgisl", BSIM4v7_MOD_FGISL, IF_REAL, "GISL vb parameter"), /* v4.7 New GIDL/GISL */ -IOP( "egisl", BSIM4v7_MOD_EGISL, IF_REAL, "Fitting parameter for Bandbending"), -IOP( "aigc", BSIM4v7_MOD_AIGC, IF_REAL, "Parameter for Igc"), -IOP( "bigc", BSIM4v7_MOD_BIGC, IF_REAL, "Parameter for Igc"), -IOP( "cigc", BSIM4v7_MOD_CIGC, IF_REAL, "Parameter for Igc"), -IOP( "aigsd", BSIM4v7_MOD_AIGSD, IF_REAL, "Parameter for Igs,d"), -IOP( "bigsd", BSIM4v7_MOD_BIGSD, IF_REAL, "Parameter for Igs,d"), -IOP( "cigsd", BSIM4v7_MOD_CIGSD, IF_REAL, "Parameter for Igs,d"), -IOP( "aigs", BSIM4v7_MOD_AIGS, IF_REAL, "Parameter for Igs"), -IOP( "bigs", BSIM4v7_MOD_BIGS, IF_REAL, "Parameter for Igs"), -IOP( "cigs", BSIM4v7_MOD_CIGS, IF_REAL, "Parameter for Igs"), -IOP( "aigd", BSIM4v7_MOD_AIGD, IF_REAL, "Parameter for Igd"), -IOP( "bigd", BSIM4v7_MOD_BIGD, IF_REAL, "Parameter for Igd"), -IOP( "cigd", BSIM4v7_MOD_CIGD, IF_REAL, "Parameter for Igd"), -IOP( "aigbacc", BSIM4v7_MOD_AIGBACC, IF_REAL, "Parameter for Igb"), -IOP( "bigbacc", BSIM4v7_MOD_BIGBACC, IF_REAL, "Parameter for Igb"), -IOP( "cigbacc", BSIM4v7_MOD_CIGBACC, IF_REAL, "Parameter for Igb"), -IOP( "aigbinv", BSIM4v7_MOD_AIGBINV, IF_REAL, "Parameter for Igb"), -IOP( "bigbinv", BSIM4v7_MOD_BIGBINV, IF_REAL, "Parameter for Igb"), -IOP( "cigbinv", BSIM4v7_MOD_CIGBINV, IF_REAL, "Parameter for Igb"), -IOP( "nigc", BSIM4v7_MOD_NIGC, IF_REAL, "Parameter for Igc slope"), -IOP( "nigbinv", BSIM4v7_MOD_NIGBINV, IF_REAL, "Parameter for Igbinv slope"), -IOP( "nigbacc", BSIM4v7_MOD_NIGBACC, IF_REAL, "Parameter for Igbacc slope"), -IOP( "ntox", BSIM4v7_MOD_NTOX, IF_REAL, "Exponent for Tox ratio"), -IOP( "eigbinv", BSIM4v7_MOD_EIGBINV, IF_REAL, "Parameter for the Si bandgap for Igbinv"), -IOP( "pigcd", BSIM4v7_MOD_PIGCD, IF_REAL, "Parameter for Igc partition"), -IOP( "poxedge", BSIM4v7_MOD_POXEDGE, IF_REAL, "Factor for the gate edge Tox"), - -IOP( "ijthdfwd", BSIM4v7_MOD_IJTHDFWD, IF_REAL, "Forward drain diode forward limiting current"), -IOP( "ijthsfwd", BSIM4v7_MOD_IJTHSFWD, IF_REAL, "Forward source diode forward limiting current"), -IOP( "ijthdrev", BSIM4v7_MOD_IJTHDREV, IF_REAL, "Reverse drain diode forward limiting current"), -IOP( "ijthsrev", BSIM4v7_MOD_IJTHSREV, IF_REAL, "Reverse source diode forward limiting current"), -IOP( "xjbvd", BSIM4v7_MOD_XJBVD, IF_REAL, "Fitting parameter for drain diode breakdown current"), -IOP( "xjbvs", BSIM4v7_MOD_XJBVS, IF_REAL, "Fitting parameter for source diode breakdown current"), -IOP( "bvd", BSIM4v7_MOD_BVD, IF_REAL, "Drain diode breakdown voltage"), -IOP( "bvs", BSIM4v7_MOD_BVS, IF_REAL, "Source diode breakdown voltage"), - -IOP( "jtss", BSIM4v7_MOD_JTSS, IF_REAL, "Source bottom trap-assisted saturation current density"), -IOP( "jtsd", BSIM4v7_MOD_JTSD, IF_REAL, "Drain bottom trap-assisted saturation current density"), -IOP( "jtssws", BSIM4v7_MOD_JTSSWS, IF_REAL, "Source STI sidewall trap-assisted saturation current density"), -IOP( "jtsswd", BSIM4v7_MOD_JTSSWD, IF_REAL, "Drain STI sidewall trap-assisted saturation current density"), -IOP( "jtsswgs", BSIM4v7_MOD_JTSSWGS, IF_REAL, "Source gate-edge sidewall trap-assisted saturation current density"), -IOP( "jtsswgd", BSIM4v7_MOD_JTSSWGD, IF_REAL, "Drain gate-edge sidewall trap-assisted saturation current density"), -IOP( "jtweff", BSIM4v7_MOD_JTWEFF, IF_REAL, "TAT current width dependence"), -IOP( "njts", BSIM4v7_MOD_NJTS, IF_REAL, "Non-ideality factor for bottom junction"), -IOP( "njtssw", BSIM4v7_MOD_NJTSSW, IF_REAL, "Non-ideality factor for STI sidewall junction"), -IOP( "njtsswg", BSIM4v7_MOD_NJTSSWG, IF_REAL, "Non-ideality factor for gate-edge sidewall junction"), -IOP( "njtsd", BSIM4v7_MOD_NJTSD, IF_REAL, "Non-ideality factor for bottom junction drain side"), -IOP( "njtsswd", BSIM4v7_MOD_NJTSSWD, IF_REAL, "Non-ideality factor for STI sidewall junction drain side"), -IOP( "njtsswgd", BSIM4v7_MOD_NJTSSWGD, IF_REAL, "Non-ideality factor for gate-edge sidewall junction drain side"), -IOP( "xtss", BSIM4v7_MOD_XTSS, IF_REAL, "Power dependence of JTSS on temperature"), -IOP( "xtsd", BSIM4v7_MOD_XTSD, IF_REAL, "Power dependence of JTSD on temperature"), -IOP( "xtssws", BSIM4v7_MOD_XTSSWS, IF_REAL, "Power dependence of JTSSWS on temperature"), -IOP( "xtsswd", BSIM4v7_MOD_XTSSWD, IF_REAL, "Power dependence of JTSSWD on temperature"), -IOP( "xtsswgs", BSIM4v7_MOD_XTSSWGS, IF_REAL, "Power dependence of JTSSWGS on temperature"), -IOP( "xtsswgd", BSIM4v7_MOD_XTSSWGD, IF_REAL, "Power dependence of JTSSWGD on temperature"), -IOP( "tnjts", BSIM4v7_MOD_TNJTS, IF_REAL, "Temperature coefficient for NJTS"), -IOP( "tnjtssw", BSIM4v7_MOD_TNJTSSW, IF_REAL, "Temperature coefficient for NJTSSW"), -IOP( "tnjtsswg", BSIM4v7_MOD_TNJTSSWG, IF_REAL, "Temperature coefficient for NJTSSWG"), -IOP( "tnjtsd", BSIM4v7_MOD_TNJTSD, IF_REAL, "Temperature coefficient for NJTSD"), -IOP( "tnjtsswd", BSIM4v7_MOD_TNJTSSWD, IF_REAL, "Temperature coefficient for NJTSSWD"), -IOP( "tnjtsswgd", BSIM4v7_MOD_TNJTSSWGD, IF_REAL, "Temperature coefficient for NJTSSWGD"), -IOP( "vtss", BSIM4v7_MOD_VTSS, IF_REAL, "Source bottom trap-assisted voltage dependent parameter"), -IOP( "vtsd", BSIM4v7_MOD_VTSD, IF_REAL, "Drain bottom trap-assisted voltage dependent parameter"), -IOP( "vtssws", BSIM4v7_MOD_VTSSWS, IF_REAL, "Source STI sidewall trap-assisted voltage dependent parameter"), -IOP( "vtsswd", BSIM4v7_MOD_VTSSWD, IF_REAL, "Drain STI sidewall trap-assisted voltage dependent parameter"), -IOP( "vtsswgs", BSIM4v7_MOD_VTSSWGS, IF_REAL, "Source gate-edge sidewall trap-assisted voltage dependent parameter"), -IOP( "vtsswgd", BSIM4v7_MOD_VTSSWGD, IF_REAL, "Drain gate-edge sidewall trap-assisted voltage dependent parameter"), - -IOP( "gbmin", BSIM4v7_MOD_GBMIN, IF_REAL, "Minimum body conductance"), -IOP( "rbdb", BSIM4v7_MOD_RBDB, IF_REAL, "Resistance between bNode and dbNode"), -IOP( "rbpb", BSIM4v7_MOD_RBPB, IF_REAL, "Resistance between bNodePrime and bNode"), -IOP( "rbsb", BSIM4v7_MOD_RBSB, IF_REAL, "Resistance between bNode and sbNode"), -IOP( "rbps", BSIM4v7_MOD_RBPS, IF_REAL, "Resistance between bNodePrime and sbNode"), -IOP( "rbpd", BSIM4v7_MOD_RBPD, IF_REAL, "Resistance between bNodePrime and bNode"), - -IOP( "rbps0", BSIM4v7_MOD_RBPS0, IF_REAL , "Body resistance RBPS scaling"), -IOP( "rbpsl", BSIM4v7_MOD_RBPSL, IF_REAL , "Body resistance RBPS L scaling"), -IOP( "rbpsw", BSIM4v7_MOD_RBPSW, IF_REAL , "Body resistance RBPS W scaling"), -IOP( "rbpsnf", BSIM4v7_MOD_RBPSNF, IF_REAL , "Body resistance RBPS NF scaling"), - -IOP( "rbpd0", BSIM4v7_MOD_RBPD0, IF_REAL , "Body resistance RBPD scaling"), -IOP( "rbpdl", BSIM4v7_MOD_RBPDL, IF_REAL , "Body resistance RBPD L scaling"), -IOP( "rbpdw", BSIM4v7_MOD_RBPDW, IF_REAL , "Body resistance RBPD W scaling"), -IOP( "rbpdnf", BSIM4v7_MOD_RBPDNF, IF_REAL , "Body resistance RBPD NF scaling"), - -IOP( "rbpbx0", BSIM4v7_MOD_RBPBX0, IF_REAL , "Body resistance RBPBX scaling"), -IOP( "rbpbxl", BSIM4v7_MOD_RBPBXL, IF_REAL , "Body resistance RBPBX L scaling"), -IOP( "rbpbxw", BSIM4v7_MOD_RBPBXW, IF_REAL , "Body resistance RBPBX W scaling"), -IOP( "rbpbxnf", BSIM4v7_MOD_RBPBXNF, IF_REAL , "Body resistance RBPBX NF scaling"), -IOP( "rbpby0", BSIM4v7_MOD_RBPBY0, IF_REAL , "Body resistance RBPBY scaling"), -IOP( "rbpbyl", BSIM4v7_MOD_RBPBYL, IF_REAL , "Body resistance RBPBY L scaling"), -IOP( "rbpbyw", BSIM4v7_MOD_RBPBYW, IF_REAL , "Body resistance RBPBY W scaling"), -IOP( "rbpbynf", BSIM4v7_MOD_RBPBYNF, IF_REAL , "Body resistance RBPBY NF scaling"), - -IOP( "rbsbx0", BSIM4v7_MOD_RBSBX0, IF_REAL , "Body resistance RBSBX scaling"), -IOP( "rbsby0", BSIM4v7_MOD_RBSBY0, IF_REAL , "Body resistance RBSBY scaling"), -IOP( "rbdbx0", BSIM4v7_MOD_RBDBX0, IF_REAL , "Body resistance RBDBX scaling"), -IOP( "rbdby0", BSIM4v7_MOD_RBDBY0, IF_REAL , "Body resistance RBDBY scaling"), - -IOP( "rbsdbxl", BSIM4v7_MOD_RBSDBXL, IF_REAL , "Body resistance RBSDBX L scaling"), -IOP( "rbsdbxw", BSIM4v7_MOD_RBSDBXW, IF_REAL , "Body resistance RBSDBX W scaling"), -IOP( "rbsdbxnf", BSIM4v7_MOD_RBSDBXNF, IF_REAL , "Body resistance RBSDBX NF scaling"), -IOP( "rbsdbyl", BSIM4v7_MOD_RBSDBYL, IF_REAL , "Body resistance RBSDBY L scaling"), -IOP( "rbsdbyw", BSIM4v7_MOD_RBSDBYW, IF_REAL , "Body resistance RBSDBY W scaling"), -IOP( "rbsdbynf", BSIM4v7_MOD_RBSDBYNF, IF_REAL , "Body resistance RBSDBY NF scaling"), - -IOP( "lcdsc", BSIM4v7_MOD_LCDSC, IF_REAL, "Length dependence of cdsc"), -IOP( "lcdscb", BSIM4v7_MOD_LCDSCB, IF_REAL, "Length dependence of cdscb"), -IOP( "lcdscd", BSIM4v7_MOD_LCDSCD, IF_REAL, "Length dependence of cdscd"), -IOP( "lcit", BSIM4v7_MOD_LCIT, IF_REAL, "Length dependence of cit"), -IOP( "lnfactor", BSIM4v7_MOD_LNFACTOR, IF_REAL, "Length dependence of nfactor"), -IOP( "lxj", BSIM4v7_MOD_LXJ, IF_REAL, "Length dependence of xj"), -IOP( "lvsat", BSIM4v7_MOD_LVSAT, IF_REAL, "Length dependence of vsat"), -IOP( "lat", BSIM4v7_MOD_LAT, IF_REAL, "Length dependence of at"), -IOP( "la0", BSIM4v7_MOD_LA0, IF_REAL, "Length dependence of a0"), -IOP( "lags", BSIM4v7_MOD_LAGS, IF_REAL, "Length dependence of ags"), -IOP( "la1", BSIM4v7_MOD_LA1, IF_REAL, "Length dependence of a1"), -IOP( "la2", BSIM4v7_MOD_LA2, IF_REAL, "Length dependence of a2"), -IOP( "lketa", BSIM4v7_MOD_LKETA, IF_REAL, "Length dependence of keta"), -IOP( "lnsub", BSIM4v7_MOD_LNSUB, IF_REAL, "Length dependence of nsub"), -IOP( "lndep", BSIM4v7_MOD_LNDEP, IF_REAL, "Length dependence of ndep"), -IOP( "lnsd", BSIM4v7_MOD_LNSD, IF_REAL, "Length dependence of nsd"), -IOP( "lphin", BSIM4v7_MOD_LPHIN, IF_REAL, "Length dependence of phin"), -IOP( "lngate", BSIM4v7_MOD_LNGATE, IF_REAL, "Length dependence of ngate"), -IOP( "lgamma1", BSIM4v7_MOD_LGAMMA1, IF_REAL, "Length dependence of gamma1"), -IOP( "lgamma2", BSIM4v7_MOD_LGAMMA2, IF_REAL, "Length dependence of gamma2"), -IOP( "lvbx", BSIM4v7_MOD_LVBX, IF_REAL, "Length dependence of vbx"), -IOP( "lvbm", BSIM4v7_MOD_LVBM, IF_REAL, "Length dependence of vbm"), -IOP( "lxt", BSIM4v7_MOD_LXT, IF_REAL, "Length dependence of xt"), -IOP( "lk1", BSIM4v7_MOD_LK1, IF_REAL, "Length dependence of k1"), -IOP( "lkt1", BSIM4v7_MOD_LKT1, IF_REAL, "Length dependence of kt1"), -IOP( "lkt1l", BSIM4v7_MOD_LKT1L, IF_REAL, "Length dependence of kt1l"), -IOP( "lkt2", BSIM4v7_MOD_LKT2, IF_REAL, "Length dependence of kt2"), -IOP( "lk2", BSIM4v7_MOD_LK2, IF_REAL, "Length dependence of k2"), -IOP( "lk3", BSIM4v7_MOD_LK3, IF_REAL, "Length dependence of k3"), -IOP( "lk3b", BSIM4v7_MOD_LK3B, IF_REAL, "Length dependence of k3b"), -IOP( "lw0", BSIM4v7_MOD_LW0, IF_REAL, "Length dependence of w0"), -IOP( "ldvtp0", BSIM4v7_MOD_LDVTP0, IF_REAL, "Length dependence of dvtp0"), -IOP( "ldvtp1", BSIM4v7_MOD_LDVTP1, IF_REAL, "Length dependence of dvtp1"), -IOP( "ldvtp2", BSIM4v7_MOD_LDVTP2, IF_REAL, "Length dependence of dvtp2"), -IOP( "ldvtp3", BSIM4v7_MOD_LDVTP3, IF_REAL, "Length dependence of dvtp3"), -IOP( "ldvtp4", BSIM4v7_MOD_LDVTP4, IF_REAL, "Length dependence of dvtp4"), -IOP( "ldvtp5", BSIM4v7_MOD_LDVTP5, IF_REAL, "Length dependence of dvtp5"), -IOP( "llpe0", BSIM4v7_MOD_LLPE0, IF_REAL, "Length dependence of lpe0"), -IOP( "llpeb", BSIM4v7_MOD_LLPEB, IF_REAL, "Length dependence of lpeb"), -IOP( "ldvt0", BSIM4v7_MOD_LDVT0, IF_REAL, "Length dependence of dvt0"), -IOP( "ldvt1", BSIM4v7_MOD_LDVT1, IF_REAL, "Length dependence of dvt1"), -IOP( "ldvt2", BSIM4v7_MOD_LDVT2, IF_REAL, "Length dependence of dvt2"), -IOP( "ldvt0w", BSIM4v7_MOD_LDVT0W, IF_REAL, "Length dependence of dvt0w"), -IOP( "ldvt1w", BSIM4v7_MOD_LDVT1W, IF_REAL, "Length dependence of dvt1w"), -IOP( "ldvt2w", BSIM4v7_MOD_LDVT2W, IF_REAL, "Length dependence of dvt2w"), -IOP( "ldrout", BSIM4v7_MOD_LDROUT, IF_REAL, "Length dependence of drout"), -IOP( "ldsub", BSIM4v7_MOD_LDSUB, IF_REAL, "Length dependence of dsub"), -IOP( "lvth0", BSIM4v7_MOD_LVTH0, IF_REAL,"Length dependence of vth0"), -IOPR("lvtho", BSIM4v7_MOD_LVTH0, IF_REAL,"Length dependence of vtho"), -IOP( "lua", BSIM4v7_MOD_LUA, IF_REAL, "Length dependence of ua"), -IOP( "lua1", BSIM4v7_MOD_LUA1, IF_REAL, "Length dependence of ua1"), -IOP( "lub", BSIM4v7_MOD_LUB, IF_REAL, "Length dependence of ub"), -IOP( "lub1", BSIM4v7_MOD_LUB1, IF_REAL, "Length dependence of ub1"), -IOP( "luc", BSIM4v7_MOD_LUC, IF_REAL, "Length dependence of uc"), -IOP( "luc1", BSIM4v7_MOD_LUC1, IF_REAL, "Length dependence of uc1"), -IOP( "lud", BSIM4v7_MOD_LUD, IF_REAL, "Length dependence of ud"), -IOP( "lud1", BSIM4v7_MOD_LUD1, IF_REAL, "Length dependence of ud1"), -IOP( "lup", BSIM4v7_MOD_LUP, IF_REAL, "Length dependence of up"), -IOP( "llp", BSIM4v7_MOD_LLP, IF_REAL, "Length dependence of lp"), -IOP( "lu0", BSIM4v7_MOD_LU0, IF_REAL, "Length dependence of u0"), -IOP( "lute", BSIM4v7_MOD_LUTE, IF_REAL, "Length dependence of ute"), -IOP( "lucste", BSIM4v7_MOD_LUCSTE, IF_REAL, "Length dependence of ucste"), -IOP( "lvoff", BSIM4v7_MOD_LVOFF, IF_REAL, "Length dependence of voff"), -IOP( "lminv", BSIM4v7_MOD_LMINV, IF_REAL, "Length dependence of minv"), -IOP( "lminvcv", BSIM4v7_MOD_LMINVCV, IF_REAL, "Length dependence of minvcv"), -IOP( "ldelta", BSIM4v7_MOD_LDELTA, IF_REAL, "Length dependence of delta"), -IOP( "lrdsw", BSIM4v7_MOD_LRDSW, IF_REAL, "Length dependence of rdsw "), -IOP( "lrsw", BSIM4v7_MOD_LRSW, IF_REAL, "Length dependence of rsw"), -IOP( "lrdw", BSIM4v7_MOD_LRDW, IF_REAL, "Length dependence of rdw"), - -IOP( "lprwg", BSIM4v7_MOD_LPRWG, IF_REAL, "Length dependence of prwg "), -IOP( "lprwb", BSIM4v7_MOD_LPRWB, IF_REAL, "Length dependence of prwb "), - -IOP( "lprt", BSIM4v7_MOD_LPRT, IF_REAL, "Length dependence of prt "), -IOP( "leta0", BSIM4v7_MOD_LETA0, IF_REAL, "Length dependence of eta0"), -IOP( "letab", BSIM4v7_MOD_LETAB, IF_REAL, "Length dependence of etab"), -IOP( "lpclm", BSIM4v7_MOD_LPCLM, IF_REAL, "Length dependence of pclm"), -IOP( "lpdiblc1", BSIM4v7_MOD_LPDIBL1, IF_REAL, "Length dependence of pdiblc1"), -IOP( "lpdiblc2", BSIM4v7_MOD_LPDIBL2, IF_REAL, "Length dependence of pdiblc2"), -IOP( "lpdiblcb", BSIM4v7_MOD_LPDIBLB, IF_REAL, "Length dependence of pdiblcb"), -IOP( "lfprout", BSIM4v7_MOD_LFPROUT, IF_REAL, "Length dependence of pdiblcb"), -IOP( "lpdits", BSIM4v7_MOD_LPDITS, IF_REAL, "Length dependence of pdits"), -IOP( "lpditsd", BSIM4v7_MOD_LPDITSD, IF_REAL, "Length dependence of pditsd"), -IOP( "lpscbe1", BSIM4v7_MOD_LPSCBE1, IF_REAL, "Length dependence of pscbe1"), -IOP( "lpscbe2", BSIM4v7_MOD_LPSCBE2, IF_REAL, "Length dependence of pscbe2"), -IOP( "lpvag", BSIM4v7_MOD_LPVAG, IF_REAL, "Length dependence of pvag"), -IOP( "lwr", BSIM4v7_MOD_LWR, IF_REAL, "Length dependence of wr"), -IOP( "ldwg", BSIM4v7_MOD_LDWG, IF_REAL, "Length dependence of dwg"), -IOP( "ldwb", BSIM4v7_MOD_LDWB, IF_REAL, "Length dependence of dwb"), -IOP( "lb0", BSIM4v7_MOD_LB0, IF_REAL, "Length dependence of b0"), -IOP( "lb1", BSIM4v7_MOD_LB1, IF_REAL, "Length dependence of b1"), -IOP( "lcgsl", BSIM4v7_MOD_LCGSL, IF_REAL, "Length dependence of cgsl"), -IOP( "lcgdl", BSIM4v7_MOD_LCGDL, IF_REAL, "Length dependence of cgdl"), -IOP( "lckappas", BSIM4v7_MOD_LCKAPPAS, IF_REAL, "Length dependence of ckappas"), -IOP( "lckappad", BSIM4v7_MOD_LCKAPPAD, IF_REAL, "Length dependence of ckappad"), -IOP( "lcf", BSIM4v7_MOD_LCF, IF_REAL, "Length dependence of cf"), -IOP( "lclc", BSIM4v7_MOD_LCLC, IF_REAL, "Length dependence of clc"), -IOP( "lcle", BSIM4v7_MOD_LCLE, IF_REAL, "Length dependence of cle"), -IOP( "lalpha0", BSIM4v7_MOD_LALPHA0, IF_REAL, "Length dependence of alpha0"), -IOP( "lalpha1", BSIM4v7_MOD_LALPHA1, IF_REAL, "Length dependence of alpha1"), -IOP( "lbeta0", BSIM4v7_MOD_LBETA0, IF_REAL, "Length dependence of beta0"), - -IOP( "lagidl", BSIM4v7_MOD_LAGIDL, IF_REAL, "Length dependence of agidl"), -IOP( "lbgidl", BSIM4v7_MOD_LBGIDL, IF_REAL, "Length dependence of bgidl"), -IOP( "lcgidl", BSIM4v7_MOD_LCGIDL, IF_REAL, "Length dependence of cgidl"), -IOP( "lrgidl", BSIM4v7_MOD_LRGIDL, IF_REAL, "Length dependence of rgidl"), /* v4.7 New GIDL/GISL */ -IOP( "lkgidl", BSIM4v7_MOD_LKGIDL, IF_REAL, "Length dependence of kgidl"), /* v4.7 New GIDL/GISL */ -IOP( "lfgidl", BSIM4v7_MOD_LFGIDL, IF_REAL, "Length dependence of fgidl"), /* v4.7 New GIDL/GISL */ -IOP( "legidl", BSIM4v7_MOD_LEGIDL, IF_REAL, "Length dependence of egidl"), -IOP( "lagisl", BSIM4v7_MOD_LAGISL, IF_REAL, "Length dependence of agisl"), -IOP( "lbgisl", BSIM4v7_MOD_LBGISL, IF_REAL, "Length dependence of bgisl"), -IOP( "lcgisl", BSIM4v7_MOD_LCGISL, IF_REAL, "Length dependence of cgisl"), -IOP( "lrgisl", BSIM4v7_MOD_LRGISL, IF_REAL, "Length dependence of rgisl"), /* v4.7 New GIDL/GISL */ -IOP( "lkgisl", BSIM4v7_MOD_LKGISL, IF_REAL, "Length dependence of kgisl"), /* v4.7 New GIDL/GISL */ -IOP( "lfgisl", BSIM4v7_MOD_LFGISL, IF_REAL, "Length dependence of fgisl"), /* v4.7 New GIDL/GISL */ -IOP( "legisl", BSIM4v7_MOD_LEGISL, IF_REAL, "Length dependence of egisl"), -IOP( "laigc", BSIM4v7_MOD_LAIGC, IF_REAL, "Length dependence of aigc"), -IOP( "lbigc", BSIM4v7_MOD_LBIGC, IF_REAL, "Length dependence of bigc"), -IOP( "lcigc", BSIM4v7_MOD_LCIGC, IF_REAL, "Length dependence of cigc"), -IOP( "laigsd", BSIM4v7_MOD_LAIGSD, IF_REAL, "Length dependence of aigsd"), -IOP( "lbigsd", BSIM4v7_MOD_LBIGSD, IF_REAL, "Length dependence of bigsd"), -IOP( "lcigsd", BSIM4v7_MOD_LCIGSD, IF_REAL, "Length dependence of cigsd"), -IOP( "laigs", BSIM4v7_MOD_LAIGS, IF_REAL, "Length dependence of aigs"), -IOP( "lbigs", BSIM4v7_MOD_LBIGS, IF_REAL, "Length dependence of bigs"), -IOP( "lcigs", BSIM4v7_MOD_LCIGS, IF_REAL, "Length dependence of cigs"), -IOP( "laigd", BSIM4v7_MOD_LAIGD, IF_REAL, "Length dependence of aigd"), -IOP( "lbigd", BSIM4v7_MOD_LBIGD, IF_REAL, "Length dependence of bigd"), -IOP( "lcigd", BSIM4v7_MOD_LCIGD, IF_REAL, "Length dependence of cigd"), -IOP( "laigbacc", BSIM4v7_MOD_LAIGBACC, IF_REAL, "Length dependence of aigbacc"), -IOP( "lbigbacc", BSIM4v7_MOD_LBIGBACC, IF_REAL, "Length dependence of bigbacc"), -IOP( "lcigbacc", BSIM4v7_MOD_LCIGBACC, IF_REAL, "Length dependence of cigbacc"), -IOP( "laigbinv", BSIM4v7_MOD_LAIGBINV, IF_REAL, "Length dependence of aigbinv"), -IOP( "lbigbinv", BSIM4v7_MOD_LBIGBINV, IF_REAL, "Length dependence of bigbinv"), -IOP( "lcigbinv", BSIM4v7_MOD_LCIGBINV, IF_REAL, "Length dependence of cigbinv"), -IOP( "lnigc", BSIM4v7_MOD_LNIGC, IF_REAL, "Length dependence of nigc"), -IOP( "lnigbinv", BSIM4v7_MOD_LNIGBINV, IF_REAL, "Length dependence of nigbinv"), -IOP( "lnigbacc", BSIM4v7_MOD_LNIGBACC, IF_REAL, "Length dependence of nigbacc"), -IOP( "lntox", BSIM4v7_MOD_LNTOX, IF_REAL, "Length dependence of ntox"), -IOP( "leigbinv", BSIM4v7_MOD_LEIGBINV, IF_REAL, "Length dependence for eigbinv"), -IOP( "lpigcd", BSIM4v7_MOD_LPIGCD, IF_REAL, "Length dependence for pigcd"), -IOP( "lpoxedge", BSIM4v7_MOD_LPOXEDGE, IF_REAL, "Length dependence for poxedge"), - -IOP( "lvfbcv", BSIM4v7_MOD_LVFBCV, IF_REAL, "Length dependence of vfbcv"), -IOP( "lvfb", BSIM4v7_MOD_LVFB, IF_REAL, "Length dependence of vfb"), -IOP( "lacde", BSIM4v7_MOD_LACDE, IF_REAL, "Length dependence of acde"), -IOP( "lmoin", BSIM4v7_MOD_LMOIN, IF_REAL, "Length dependence of moin"), -IOP( "lnoff", BSIM4v7_MOD_LNOFF, IF_REAL, "Length dependence of noff"), -IOP( "lvoffcv", BSIM4v7_MOD_LVOFFCV, IF_REAL, "Length dependence of voffcv"), -IOP( "lxrcrg1", BSIM4v7_MOD_LXRCRG1, IF_REAL, "Length dependence of xrcrg1"), -IOP( "lxrcrg2", BSIM4v7_MOD_LXRCRG2, IF_REAL, "Length dependence of xrcrg2"), -IOP( "llambda", BSIM4v7_MOD_LLAMBDA, IF_REAL, "Length dependence of lambda"), -IOP( "lvtl", BSIM4v7_MOD_LVTL, IF_REAL, " Length dependence of vtl"), -IOP( "lxn", BSIM4v7_MOD_LXN, IF_REAL, " Length dependence of xn"), -IOP( "leu", BSIM4v7_MOD_LEU, IF_REAL, " Length dependence of eu"), -IOP( "lucs", BSIM4v7_MOD_LUCS, IF_REAL, "Length dependence of lucs"), -IOP( "lvfbsdoff", BSIM4v7_MOD_LVFBSDOFF, IF_REAL, "Length dependence of vfbsdoff"), -IOP( "ltvfbsdoff", BSIM4v7_MOD_LTVFBSDOFF, IF_REAL, "Length dependence of tvfbsdoff"), -IOP( "ltvoff", BSIM4v7_MOD_LTVOFF, IF_REAL, "Length dependence of tvoff"), -IOP( "ltnfactor", BSIM4v7_MOD_LTNFACTOR, IF_REAL, "Length dependence of tnfactor"), /* v4.7 Tanvir*/ -IOP( "lteta0", BSIM4v7_MOD_LTETA0, IF_REAL, "Length dependence of teta0"), /* v4.7 Tanvir*/ -IOP( "ltvoffcv", BSIM4v7_MOD_LTVOFFCV, IF_REAL, "Length dependence of tvoffcv"), /* v4.7 Tanvir*/ - -IOP( "wcdsc", BSIM4v7_MOD_WCDSC, IF_REAL, "Width dependence of cdsc"), -IOP( "wcdscb", BSIM4v7_MOD_WCDSCB, IF_REAL, "Width dependence of cdscb"), -IOP( "wcdscd", BSIM4v7_MOD_WCDSCD, IF_REAL, "Width dependence of cdscd"), -IOP( "wcit", BSIM4v7_MOD_WCIT, IF_REAL, "Width dependence of cit"), -IOP( "wnfactor", BSIM4v7_MOD_WNFACTOR, IF_REAL, "Width dependence of nfactor"), -IOP( "wxj", BSIM4v7_MOD_WXJ, IF_REAL, "Width dependence of xj"), -IOP( "wvsat", BSIM4v7_MOD_WVSAT, IF_REAL, "Width dependence of vsat"), -IOP( "wat", BSIM4v7_MOD_WAT, IF_REAL, "Width dependence of at"), -IOP( "wa0", BSIM4v7_MOD_WA0, IF_REAL, "Width dependence of a0"), -IOP( "wags", BSIM4v7_MOD_WAGS, IF_REAL, "Width dependence of ags"), -IOP( "wa1", BSIM4v7_MOD_WA1, IF_REAL, "Width dependence of a1"), -IOP( "wa2", BSIM4v7_MOD_WA2, IF_REAL, "Width dependence of a2"), -IOP( "wketa", BSIM4v7_MOD_WKETA, IF_REAL, "Width dependence of keta"), -IOP( "wnsub", BSIM4v7_MOD_WNSUB, IF_REAL, "Width dependence of nsub"), -IOP( "wndep", BSIM4v7_MOD_WNDEP, IF_REAL, "Width dependence of ndep"), -IOP( "wnsd", BSIM4v7_MOD_WNSD, IF_REAL, "Width dependence of nsd"), -IOP( "wphin", BSIM4v7_MOD_WPHIN, IF_REAL, "Width dependence of phin"), -IOP( "wngate", BSIM4v7_MOD_WNGATE, IF_REAL, "Width dependence of ngate"), -IOP( "wgamma1", BSIM4v7_MOD_WGAMMA1, IF_REAL, "Width dependence of gamma1"), -IOP( "wgamma2", BSIM4v7_MOD_WGAMMA2, IF_REAL, "Width dependence of gamma2"), -IOP( "wvbx", BSIM4v7_MOD_WVBX, IF_REAL, "Width dependence of vbx"), -IOP( "wvbm", BSIM4v7_MOD_WVBM, IF_REAL, "Width dependence of vbm"), -IOP( "wxt", BSIM4v7_MOD_WXT, IF_REAL, "Width dependence of xt"), -IOP( "wk1", BSIM4v7_MOD_WK1, IF_REAL, "Width dependence of k1"), -IOP( "wkt1", BSIM4v7_MOD_WKT1, IF_REAL, "Width dependence of kt1"), -IOP( "wkt1l", BSIM4v7_MOD_WKT1L, IF_REAL, "Width dependence of kt1l"), -IOP( "wkt2", BSIM4v7_MOD_WKT2, IF_REAL, "Width dependence of kt2"), -IOP( "wk2", BSIM4v7_MOD_WK2, IF_REAL, "Width dependence of k2"), -IOP( "wk3", BSIM4v7_MOD_WK3, IF_REAL, "Width dependence of k3"), -IOP( "wk3b", BSIM4v7_MOD_WK3B, IF_REAL, "Width dependence of k3b"), -IOP( "ww0", BSIM4v7_MOD_WW0, IF_REAL, "Width dependence of w0"), -IOP( "wdvtp0", BSIM4v7_MOD_WDVTP0, IF_REAL, "Width dependence of dvtp0"), -IOP( "wdvtp1", BSIM4v7_MOD_WDVTP1, IF_REAL, "Width dependence of dvtp1"), -IOP( "wdvtp2", BSIM4v7_MOD_WDVTP2, IF_REAL, "Width dependence of dvtp2"), -IOP( "wdvtp3", BSIM4v7_MOD_WDVTP3, IF_REAL, "Width dependence of dvtp3"), -IOP( "wdvtp4", BSIM4v7_MOD_WDVTP4, IF_REAL, "Width dependence of dvtp4"), -IOP( "wdvtp5", BSIM4v7_MOD_WDVTP5, IF_REAL, "Width dependence of dvtp5"), -IOP( "wlpe0", BSIM4v7_MOD_WLPE0, IF_REAL, "Width dependence of lpe0"), -IOP( "wlpeb", BSIM4v7_MOD_WLPEB, IF_REAL, "Width dependence of lpeb"), -IOP( "wdvt0", BSIM4v7_MOD_WDVT0, IF_REAL, "Width dependence of dvt0"), -IOP( "wdvt1", BSIM4v7_MOD_WDVT1, IF_REAL, "Width dependence of dvt1"), -IOP( "wdvt2", BSIM4v7_MOD_WDVT2, IF_REAL, "Width dependence of dvt2"), -IOP( "wdvt0w", BSIM4v7_MOD_WDVT0W, IF_REAL, "Width dependence of dvt0w"), -IOP( "wdvt1w", BSIM4v7_MOD_WDVT1W, IF_REAL, "Width dependence of dvt1w"), -IOP( "wdvt2w", BSIM4v7_MOD_WDVT2W, IF_REAL, "Width dependence of dvt2w"), -IOP( "wdrout", BSIM4v7_MOD_WDROUT, IF_REAL, "Width dependence of drout"), -IOP( "wdsub", BSIM4v7_MOD_WDSUB, IF_REAL, "Width dependence of dsub"), -IOP( "wvth0", BSIM4v7_MOD_WVTH0, IF_REAL,"Width dependence of vth0"), -IOPR("wvtho", BSIM4v7_MOD_WVTH0, IF_REAL,"Width dependence of vtho"), -IOP( "wua", BSIM4v7_MOD_WUA, IF_REAL, "Width dependence of ua"), -IOP( "wua1", BSIM4v7_MOD_WUA1, IF_REAL, "Width dependence of ua1"), -IOP( "wub", BSIM4v7_MOD_WUB, IF_REAL, "Width dependence of ub"), -IOP( "wub1", BSIM4v7_MOD_WUB1, IF_REAL, "Width dependence of ub1"), -IOP( "wuc", BSIM4v7_MOD_WUC, IF_REAL, "Width dependence of uc"), -IOP( "wuc1", BSIM4v7_MOD_WUC1, IF_REAL, "Width dependence of uc1"), -IOP( "wud", BSIM4v7_MOD_WUD, IF_REAL, "Width dependence of ud"), -IOP( "wud1", BSIM4v7_MOD_WUD1, IF_REAL, "Width dependence of ud1"), -IOP( "wup", BSIM4v7_MOD_WUP, IF_REAL, "Width dependence of up"), -IOP( "wlp", BSIM4v7_MOD_WLP, IF_REAL, "Width dependence of lp"), -IOP( "wu0", BSIM4v7_MOD_WU0, IF_REAL, "Width dependence of u0"), -IOP( "wute", BSIM4v7_MOD_WUTE, IF_REAL, "Width dependence of ute"), -IOP( "wucste", BSIM4v7_MOD_WUCSTE, IF_REAL, "Width dependence of ucste"), -IOP( "wvoff", BSIM4v7_MOD_WVOFF, IF_REAL, "Width dependence of voff"), -IOP( "wminv", BSIM4v7_MOD_WMINV, IF_REAL, "Width dependence of minv"), -IOP( "wminvcv", BSIM4v7_MOD_WMINVCV, IF_REAL, "Width dependence of minvcv"), -IOP( "wdelta", BSIM4v7_MOD_WDELTA, IF_REAL, "Width dependence of delta"), -IOP( "wrdsw", BSIM4v7_MOD_WRDSW, IF_REAL, "Width dependence of rdsw "), -IOP( "wrsw", BSIM4v7_MOD_WRSW, IF_REAL, "Width dependence of rsw"), -IOP( "wrdw", BSIM4v7_MOD_WRDW, IF_REAL, "Width dependence of rdw"), - -IOP( "wprwg", BSIM4v7_MOD_WPRWG, IF_REAL, "Width dependence of prwg "), -IOP( "wprwb", BSIM4v7_MOD_WPRWB, IF_REAL, "Width dependence of prwb "), - -IOP( "wprt", BSIM4v7_MOD_WPRT, IF_REAL, "Width dependence of prt"), -IOP( "weta0", BSIM4v7_MOD_WETA0, IF_REAL, "Width dependence of eta0"), -IOP( "wetab", BSIM4v7_MOD_WETAB, IF_REAL, "Width dependence of etab"), -IOP( "wpclm", BSIM4v7_MOD_WPCLM, IF_REAL, "Width dependence of pclm"), -IOP( "wpdiblc1", BSIM4v7_MOD_WPDIBL1, IF_REAL, "Width dependence of pdiblc1"), -IOP( "wpdiblc2", BSIM4v7_MOD_WPDIBL2, IF_REAL, "Width dependence of pdiblc2"), -IOP( "wpdiblcb", BSIM4v7_MOD_WPDIBLB, IF_REAL, "Width dependence of pdiblcb"), -IOP( "wfprout", BSIM4v7_MOD_WFPROUT, IF_REAL, "Width dependence of pdiblcb"), -IOP( "wpdits", BSIM4v7_MOD_WPDITS, IF_REAL, "Width dependence of pdits"), -IOP( "wpditsd", BSIM4v7_MOD_WPDITSD, IF_REAL, "Width dependence of pditsd"), -IOP( "wpscbe1", BSIM4v7_MOD_WPSCBE1, IF_REAL, "Width dependence of pscbe1"), -IOP( "wpscbe2", BSIM4v7_MOD_WPSCBE2, IF_REAL, "Width dependence of pscbe2"), -IOP( "wpvag", BSIM4v7_MOD_WPVAG, IF_REAL, "Width dependence of pvag"), -IOP( "wwr", BSIM4v7_MOD_WWR, IF_REAL, "Width dependence of wr"), -IOP( "wdwg", BSIM4v7_MOD_WDWG, IF_REAL, "Width dependence of dwg"), -IOP( "wdwb", BSIM4v7_MOD_WDWB, IF_REAL, "Width dependence of dwb"), -IOP( "wb0", BSIM4v7_MOD_WB0, IF_REAL, "Width dependence of b0"), -IOP( "wb1", BSIM4v7_MOD_WB1, IF_REAL, "Width dependence of b1"), -IOP( "wcgsl", BSIM4v7_MOD_WCGSL, IF_REAL, "Width dependence of cgsl"), -IOP( "wcgdl", BSIM4v7_MOD_WCGDL, IF_REAL, "Width dependence of cgdl"), -IOP( "wckappas", BSIM4v7_MOD_WCKAPPAS, IF_REAL, "Width dependence of ckappas"), -IOP( "wckappad", BSIM4v7_MOD_WCKAPPAD, IF_REAL, "Width dependence of ckappad"), -IOP( "wcf", BSIM4v7_MOD_WCF, IF_REAL, "Width dependence of cf"), -IOP( "wclc", BSIM4v7_MOD_WCLC, IF_REAL, "Width dependence of clc"), -IOP( "wcle", BSIM4v7_MOD_WCLE, IF_REAL, "Width dependence of cle"), -IOP( "walpha0", BSIM4v7_MOD_WALPHA0, IF_REAL, "Width dependence of alpha0"), -IOP( "walpha1", BSIM4v7_MOD_WALPHA1, IF_REAL, "Width dependence of alpha1"), -IOP( "wbeta0", BSIM4v7_MOD_WBETA0, IF_REAL, "Width dependence of beta0"), - -IOP( "wagidl", BSIM4v7_MOD_WAGIDL, IF_REAL, "Width dependence of agidl"), -IOP( "wbgidl", BSIM4v7_MOD_WBGIDL, IF_REAL, "Width dependence of bgidl"), -IOP( "wcgidl", BSIM4v7_MOD_WCGIDL, IF_REAL, "Width dependence of cgidl"), -IOP( "wrgidl", BSIM4v7_MOD_WRGIDL, IF_REAL, "Width dependence of rgidl"), /* v4.7 New GIDL/GISL */ -IOP( "wkgidl", BSIM4v7_MOD_WKGIDL, IF_REAL, "Width dependence of kgidl"), /* v4.7 New GIDL/GISL */ -IOP( "wfgidl", BSIM4v7_MOD_WFGIDL, IF_REAL, "Width dependence of fgidl"), /* v4.7 New GIDL/GISL */ -IOP( "wegidl", BSIM4v7_MOD_WEGIDL, IF_REAL, "Width dependence of egidl"), -IOP( "wagisl", BSIM4v7_MOD_WAGISL, IF_REAL, "Width dependence of agisl"), -IOP( "wbgisl", BSIM4v7_MOD_WBGISL, IF_REAL, "Width dependence of bgisl"), -IOP( "wcgisl", BSIM4v7_MOD_WCGISL, IF_REAL, "Width dependence of cgisl"), -IOP( "wrgisl", BSIM4v7_MOD_WRGISL, IF_REAL, "Width dependence of rgisl"), /* v4.7 New GIDL/GISL */ -IOP( "wkgisl", BSIM4v7_MOD_WKGISL, IF_REAL, "Width dependence of kgisl"), /* v4.7 New GIDL/GISL */ -IOP( "wfgisl", BSIM4v7_MOD_WFGISL, IF_REAL, "Width dependence of fgisl"), /* v4.7 New GIDL/GISL */ -IOP( "wegisl", BSIM4v7_MOD_WEGISL, IF_REAL, "Width dependence of egisl"), -IOP( "waigc", BSIM4v7_MOD_WAIGC, IF_REAL, "Width dependence of aigc"), -IOP( "wbigc", BSIM4v7_MOD_WBIGC, IF_REAL, "Width dependence of bigc"), -IOP( "wcigc", BSIM4v7_MOD_WCIGC, IF_REAL, "Width dependence of cigc"), -IOP( "waigsd", BSIM4v7_MOD_WAIGSD, IF_REAL, "Width dependence of aigsd"), -IOP( "wbigsd", BSIM4v7_MOD_WBIGSD, IF_REAL, "Width dependence of bigsd"), -IOP( "wcigsd", BSIM4v7_MOD_WCIGSD, IF_REAL, "Width dependence of cigsd"), -IOP( "waigs", BSIM4v7_MOD_WAIGS, IF_REAL, "Width dependence of aigs"), -IOP( "wbigs", BSIM4v7_MOD_WBIGS, IF_REAL, "Width dependence of bigs"), -IOP( "wcigs", BSIM4v7_MOD_WCIGS, IF_REAL, "Width dependence of cigs"), -IOP( "waigd", BSIM4v7_MOD_WAIGD, IF_REAL, "Width dependence of aigd"), -IOP( "wbigd", BSIM4v7_MOD_WBIGD, IF_REAL, "Width dependence of bigd"), -IOP( "wcigd", BSIM4v7_MOD_WCIGD, IF_REAL, "Width dependence of cigd"), -IOP( "waigbacc", BSIM4v7_MOD_WAIGBACC, IF_REAL, "Width dependence of aigbacc"), -IOP( "wbigbacc", BSIM4v7_MOD_WBIGBACC, IF_REAL, "Width dependence of bigbacc"), -IOP( "wcigbacc", BSIM4v7_MOD_WCIGBACC, IF_REAL, "Width dependence of cigbacc"), -IOP( "waigbinv", BSIM4v7_MOD_WAIGBINV, IF_REAL, "Width dependence of aigbinv"), -IOP( "wbigbinv", BSIM4v7_MOD_WBIGBINV, IF_REAL, "Width dependence of bigbinv"), -IOP( "wcigbinv", BSIM4v7_MOD_WCIGBINV, IF_REAL, "Width dependence of cigbinv"), -IOP( "wnigc", BSIM4v7_MOD_WNIGC, IF_REAL, "Width dependence of nigc"), -IOP( "wnigbinv", BSIM4v7_MOD_WNIGBINV, IF_REAL, "Width dependence of nigbinv"), -IOP( "wnigbacc", BSIM4v7_MOD_WNIGBACC, IF_REAL, "Width dependence of nigbacc"), -IOP( "wntox", BSIM4v7_MOD_WNTOX, IF_REAL, "Width dependence of ntox"), -IOP( "weigbinv", BSIM4v7_MOD_WEIGBINV, IF_REAL, "Width dependence for eigbinv"), -IOP( "wpigcd", BSIM4v7_MOD_WPIGCD, IF_REAL, "Width dependence for pigcd"), -IOP( "wpoxedge", BSIM4v7_MOD_WPOXEDGE, IF_REAL, "Width dependence for poxedge"), -IOP( "wvfbcv", BSIM4v7_MOD_WVFBCV, IF_REAL, "Width dependence of vfbcv"), -IOP( "wvfb", BSIM4v7_MOD_WVFB, IF_REAL, "Width dependence of vfb"), -IOP( "wacde", BSIM4v7_MOD_WACDE, IF_REAL, "Width dependence of acde"), -IOP( "wmoin", BSIM4v7_MOD_WMOIN, IF_REAL, "Width dependence of moin"), -IOP( "wnoff", BSIM4v7_MOD_WNOFF, IF_REAL, "Width dependence of noff"), -IOP( "wvoffcv", BSIM4v7_MOD_WVOFFCV, IF_REAL, "Width dependence of voffcv"), -IOP( "wxrcrg1", BSIM4v7_MOD_WXRCRG1, IF_REAL, "Width dependence of xrcrg1"), -IOP( "wxrcrg2", BSIM4v7_MOD_WXRCRG2, IF_REAL, "Width dependence of xrcrg2"), -IOP( "wlambda", BSIM4v7_MOD_WLAMBDA, IF_REAL, "Width dependence of lambda"), -IOP( "wvtl", BSIM4v7_MOD_WVTL, IF_REAL, "Width dependence of vtl"), -IOP( "wxn", BSIM4v7_MOD_WXN, IF_REAL, "Width dependence of xn"), -IOP( "weu", BSIM4v7_MOD_WEU, IF_REAL, "Width dependence of eu"), -IOP( "wucs", BSIM4v7_MOD_WUCS, IF_REAL, "Width dependence of ucs"), -IOP( "wvfbsdoff", BSIM4v7_MOD_WVFBSDOFF, IF_REAL, "Width dependence of vfbsdoff"), -IOP( "wtvfbsdoff", BSIM4v7_MOD_WTVFBSDOFF, IF_REAL, "Width dependence of tvfbsdoff"), -IOP( "wtvoff", BSIM4v7_MOD_WTVOFF, IF_REAL, "Width dependence of tvoff"), -IOP( "wtnfactor", BSIM4v7_MOD_WTNFACTOR, IF_REAL, "Width dependence of tnfactor"), /* v4.7 Tanvir*/ -IOP( "wteta0", BSIM4v7_MOD_WTETA0, IF_REAL, "Width dependence of teta0"), /* v4.7 Tanvir*/ -IOP( "wtvoffcv", BSIM4v7_MOD_WTVOFFCV, IF_REAL, "Width dependence of tvoffcv"), /* v4.7 Tanvir*/ - -IOP( "pcdsc", BSIM4v7_MOD_PCDSC, IF_REAL, "Cross-term dependence of cdsc"), -IOP( "pcdscb", BSIM4v7_MOD_PCDSCB, IF_REAL, "Cross-term dependence of cdscb"), -IOP( "pcdscd", BSIM4v7_MOD_PCDSCD, IF_REAL, "Cross-term dependence of cdscd"), -IOP( "pcit", BSIM4v7_MOD_PCIT, IF_REAL, "Cross-term dependence of cit"), -IOP( "pnfactor", BSIM4v7_MOD_PNFACTOR, IF_REAL, "Cross-term dependence of nfactor"), -IOP( "pxj", BSIM4v7_MOD_PXJ, IF_REAL, "Cross-term dependence of xj"), -IOP( "pvsat", BSIM4v7_MOD_PVSAT, IF_REAL, "Cross-term dependence of vsat"), -IOP( "pat", BSIM4v7_MOD_PAT, IF_REAL, "Cross-term dependence of at"), -IOP( "pa0", BSIM4v7_MOD_PA0, IF_REAL, "Cross-term dependence of a0"), -IOP( "pags", BSIM4v7_MOD_PAGS, IF_REAL, "Cross-term dependence of ags"), -IOP( "pa1", BSIM4v7_MOD_PA1, IF_REAL, "Cross-term dependence of a1"), -IOP( "pa2", BSIM4v7_MOD_PA2, IF_REAL, "Cross-term dependence of a2"), -IOP( "pketa", BSIM4v7_MOD_PKETA, IF_REAL, "Cross-term dependence of keta"), -IOP( "pnsub", BSIM4v7_MOD_PNSUB, IF_REAL, "Cross-term dependence of nsub"), -IOP( "pndep", BSIM4v7_MOD_PNDEP, IF_REAL, "Cross-term dependence of ndep"), -IOP( "pnsd", BSIM4v7_MOD_PNSD, IF_REAL, "Cross-term dependence of nsd"), -IOP( "pphin", BSIM4v7_MOD_PPHIN, IF_REAL, "Cross-term dependence of phin"), -IOP( "pngate", BSIM4v7_MOD_PNGATE, IF_REAL, "Cross-term dependence of ngate"), -IOP( "pgamma1", BSIM4v7_MOD_PGAMMA1, IF_REAL, "Cross-term dependence of gamma1"), -IOP( "pgamma2", BSIM4v7_MOD_PGAMMA2, IF_REAL, "Cross-term dependence of gamma2"), -IOP( "pvbx", BSIM4v7_MOD_PVBX, IF_REAL, "Cross-term dependence of vbx"), -IOP( "pvbm", BSIM4v7_MOD_PVBM, IF_REAL, "Cross-term dependence of vbm"), -IOP( "pxt", BSIM4v7_MOD_PXT, IF_REAL, "Cross-term dependence of xt"), -IOP( "pk1", BSIM4v7_MOD_PK1, IF_REAL, "Cross-term dependence of k1"), -IOP( "pkt1", BSIM4v7_MOD_PKT1, IF_REAL, "Cross-term dependence of kt1"), -IOP( "pkt1l", BSIM4v7_MOD_PKT1L, IF_REAL, "Cross-term dependence of kt1l"), -IOP( "pkt2", BSIM4v7_MOD_PKT2, IF_REAL, "Cross-term dependence of kt2"), -IOP( "pk2", BSIM4v7_MOD_PK2, IF_REAL, "Cross-term dependence of k2"), -IOP( "pk3", BSIM4v7_MOD_PK3, IF_REAL, "Cross-term dependence of k3"), -IOP( "pk3b", BSIM4v7_MOD_PK3B, IF_REAL, "Cross-term dependence of k3b"), -IOP( "pw0", BSIM4v7_MOD_PW0, IF_REAL, "Cross-term dependence of w0"), -IOP( "pdvtp0", BSIM4v7_MOD_PDVTP0, IF_REAL, "Cross-term dependence of dvtp0"), -IOP( "pdvtp1", BSIM4v7_MOD_PDVTP1, IF_REAL, "Cross-term dependence of dvtp1"), -IOP( "pdvtp2", BSIM4v7_MOD_PDVTP2, IF_REAL, "Cross-term dependence of dvtp2"), -IOP( "pdvtp3", BSIM4v7_MOD_PDVTP3, IF_REAL, "Cross-term dependence of dvtp3"), -IOP( "pdvtp4", BSIM4v7_MOD_PDVTP4, IF_REAL, "Cross-term dependence of dvtp4"), -IOP( "pdvtp5", BSIM4v7_MOD_PDVTP5, IF_REAL, "Cross-term dependence of dvtp5"), -IOP( "plpe0", BSIM4v7_MOD_PLPE0, IF_REAL, "Cross-term dependence of lpe0"), -IOP( "plpeb", BSIM4v7_MOD_PLPEB, IF_REAL, "Cross-term dependence of lpeb"), -IOP( "pdvt0", BSIM4v7_MOD_PDVT0, IF_REAL, "Cross-term dependence of dvt0"), -IOP( "pdvt1", BSIM4v7_MOD_PDVT1, IF_REAL, "Cross-term dependence of dvt1"), -IOP( "pdvt2", BSIM4v7_MOD_PDVT2, IF_REAL, "Cross-term dependence of dvt2"), -IOP( "pdvt0w", BSIM4v7_MOD_PDVT0W, IF_REAL, "Cross-term dependence of dvt0w"), -IOP( "pdvt1w", BSIM4v7_MOD_PDVT1W, IF_REAL, "Cross-term dependence of dvt1w"), -IOP( "pdvt2w", BSIM4v7_MOD_PDVT2W, IF_REAL, "Cross-term dependence of dvt2w"), -IOP( "pdrout", BSIM4v7_MOD_PDROUT, IF_REAL, "Cross-term dependence of drout"), -IOP( "pdsub", BSIM4v7_MOD_PDSUB, IF_REAL, "Cross-term dependence of dsub"), -IOP( "pvth0", BSIM4v7_MOD_PVTH0, IF_REAL,"Cross-term dependence of vth0"), -IOPR("pvtho", BSIM4v7_MOD_PVTH0, IF_REAL,"Cross-term dependence of vtho"), -IOP( "pua", BSIM4v7_MOD_PUA, IF_REAL, "Cross-term dependence of ua"), -IOP( "pua1", BSIM4v7_MOD_PUA1, IF_REAL, "Cross-term dependence of ua1"), -IOP( "pub", BSIM4v7_MOD_PUB, IF_REAL, "Cross-term dependence of ub"), -IOP( "pub1", BSIM4v7_MOD_PUB1, IF_REAL, "Cross-term dependence of ub1"), -IOP( "puc", BSIM4v7_MOD_PUC, IF_REAL, "Cross-term dependence of uc"), -IOP( "puc1", BSIM4v7_MOD_PUC1, IF_REAL, "Cross-term dependence of uc1"), -IOP( "pud", BSIM4v7_MOD_PUD, IF_REAL, "Cross-term dependence of ud"), -IOP( "pud1", BSIM4v7_MOD_PUD1, IF_REAL, "Cross-term dependence of ud1"), -IOP( "pup", BSIM4v7_MOD_PUP, IF_REAL, "Cross-term dependence of up"), -IOP( "plp", BSIM4v7_MOD_PLP, IF_REAL, "Cross-term dependence of lp"), -IOP( "pu0", BSIM4v7_MOD_PU0, IF_REAL, "Cross-term dependence of u0"), -IOP( "pute", BSIM4v7_MOD_PUTE, IF_REAL, "Cross-term dependence of ute"), -IOP( "pucste", BSIM4v7_MOD_PUCSTE, IF_REAL, "Cross-term dependence of ucste"), -IOP( "pvoff", BSIM4v7_MOD_PVOFF, IF_REAL, "Cross-term dependence of voff"), -IOP( "pminv", BSIM4v7_MOD_PMINV, IF_REAL, "Cross-term dependence of minv"), -IOP( "pminvcv", BSIM4v7_MOD_PMINVCV, IF_REAL, "Cross-term dependence of minvcv"), -IOP( "pdelta", BSIM4v7_MOD_PDELTA, IF_REAL, "Cross-term dependence of delta"), -IOP( "prdsw", BSIM4v7_MOD_PRDSW, IF_REAL, "Cross-term dependence of rdsw "), -IOP( "prsw", BSIM4v7_MOD_PRSW, IF_REAL, "Cross-term dependence of rsw"), -IOP( "prdw", BSIM4v7_MOD_PRDW, IF_REAL, "Cross-term dependence of rdw"), - -IOP( "pprwg", BSIM4v7_MOD_PPRWG, IF_REAL, "Cross-term dependence of prwg "), -IOP( "pprwb", BSIM4v7_MOD_PPRWB, IF_REAL, "Cross-term dependence of prwb "), - -IOP( "pprt", BSIM4v7_MOD_PPRT, IF_REAL, "Cross-term dependence of prt "), -IOP( "peta0", BSIM4v7_MOD_PETA0, IF_REAL, "Cross-term dependence of eta0"), -IOP( "petab", BSIM4v7_MOD_PETAB, IF_REAL, "Cross-term dependence of etab"), -IOP( "ppclm", BSIM4v7_MOD_PPCLM, IF_REAL, "Cross-term dependence of pclm"), -IOP( "ppdiblc1", BSIM4v7_MOD_PPDIBL1, IF_REAL, "Cross-term dependence of pdiblc1"), -IOP( "ppdiblc2", BSIM4v7_MOD_PPDIBL2, IF_REAL, "Cross-term dependence of pdiblc2"), -IOP( "ppdiblcb", BSIM4v7_MOD_PPDIBLB, IF_REAL, "Cross-term dependence of pdiblcb"), -IOP( "pfprout", BSIM4v7_MOD_PFPROUT, IF_REAL, "Cross-term dependence of pdiblcb"), -IOP( "ppdits", BSIM4v7_MOD_PPDITS, IF_REAL, "Cross-term dependence of pdits"), -IOP( "ppditsd", BSIM4v7_MOD_PPDITSD, IF_REAL, "Cross-term dependence of pditsd"), -IOP( "ppscbe1", BSIM4v7_MOD_PPSCBE1, IF_REAL, "Cross-term dependence of pscbe1"), -IOP( "ppscbe2", BSIM4v7_MOD_PPSCBE2, IF_REAL, "Cross-term dependence of pscbe2"), -IOP( "ppvag", BSIM4v7_MOD_PPVAG, IF_REAL, "Cross-term dependence of pvag"), -IOP( "pwr", BSIM4v7_MOD_PWR, IF_REAL, "Cross-term dependence of wr"), -IOP( "pdwg", BSIM4v7_MOD_PDWG, IF_REAL, "Cross-term dependence of dwg"), -IOP( "pdwb", BSIM4v7_MOD_PDWB, IF_REAL, "Cross-term dependence of dwb"), -IOP( "pb0", BSIM4v7_MOD_PB0, IF_REAL, "Cross-term dependence of b0"), -IOP( "pb1", BSIM4v7_MOD_PB1, IF_REAL, "Cross-term dependence of b1"), -IOP( "pcgsl", BSIM4v7_MOD_PCGSL, IF_REAL, "Cross-term dependence of cgsl"), -IOP( "pcgdl", BSIM4v7_MOD_PCGDL, IF_REAL, "Cross-term dependence of cgdl"), -IOP( "pckappas", BSIM4v7_MOD_PCKAPPAS, IF_REAL, "Cross-term dependence of ckappas"), -IOP( "pckappad", BSIM4v7_MOD_PCKAPPAD, IF_REAL, "Cross-term dependence of ckappad"), -IOP( "pcf", BSIM4v7_MOD_PCF, IF_REAL, "Cross-term dependence of cf"), -IOP( "pclc", BSIM4v7_MOD_PCLC, IF_REAL, "Cross-term dependence of clc"), -IOP( "pcle", BSIM4v7_MOD_PCLE, IF_REAL, "Cross-term dependence of cle"), -IOP( "palpha0", BSIM4v7_MOD_PALPHA0, IF_REAL, "Cross-term dependence of alpha0"), -IOP( "palpha1", BSIM4v7_MOD_PALPHA1, IF_REAL, "Cross-term dependence of alpha1"), -IOP( "pbeta0", BSIM4v7_MOD_PBETA0, IF_REAL, "Cross-term dependence of beta0"), - -IOP( "pagidl", BSIM4v7_MOD_PAGIDL, IF_REAL, "Cross-term dependence of agidl"), -IOP( "pbgidl", BSIM4v7_MOD_PBGIDL, IF_REAL, "Cross-term dependence of bgidl"), -IOP( "pcgidl", BSIM4v7_MOD_PCGIDL, IF_REAL, "Cross-term dependence of cgidl"), -IOP( "prgidl", BSIM4v7_MOD_PRGIDL, IF_REAL, "Cross-term dependence of rgidl"), /* v4.7 New GIDL/GISL */ -IOP( "pkgidl", BSIM4v7_MOD_PKGIDL, IF_REAL, "Cross-term dependence of kgidl"), /* v4.7 New GIDL/GISL */ -IOP( "pfgidl", BSIM4v7_MOD_PFGIDL, IF_REAL, "Cross-term dependence of fgidl"), /* v4.7 New GIDL/GISL */ -IOP( "pegidl", BSIM4v7_MOD_PEGIDL, IF_REAL, "Cross-term dependence of egidl"), -IOP( "pagisl", BSIM4v7_MOD_PAGISL, IF_REAL, "Cross-term dependence of agisl"), -IOP( "pbgisl", BSIM4v7_MOD_PBGISL, IF_REAL, "Cross-term dependence of bgisl"), -IOP( "pcgisl", BSIM4v7_MOD_PCGISL, IF_REAL, "Cross-term dependence of cgisl"), -IOP( "pegisl", BSIM4v7_MOD_PEGISL, IF_REAL, "Cross-term dependence of egisl"), -IOP( "prgisl", BSIM4v7_MOD_PRGISL, IF_REAL, "Cross-term dependence of rgisl"), /* v4.7 New GIDL/GISL */ -IOP( "pkgisl", BSIM4v7_MOD_PKGISL, IF_REAL, "Cross-term dependence of kgisl"), /* v4.7 New GIDL/GISL */ -IOP( "pfgisl", BSIM4v7_MOD_PFGISL, IF_REAL, "Cross-term dependence of fgisl"), /* v4.7 New GIDL/GISL */ -IOP( "paigc", BSIM4v7_MOD_PAIGC, IF_REAL, "Cross-term dependence of aigc"), -IOP( "pbigc", BSIM4v7_MOD_PBIGC, IF_REAL, "Cross-term dependence of bigc"), -IOP( "pcigc", BSIM4v7_MOD_PCIGC, IF_REAL, "Cross-term dependence of cigc"), -IOP( "paigsd", BSIM4v7_MOD_PAIGSD, IF_REAL, "Cross-term dependence of aigsd"), -IOP( "pbigsd", BSIM4v7_MOD_PBIGSD, IF_REAL, "Cross-term dependence of bigsd"), -IOP( "pcigsd", BSIM4v7_MOD_PCIGSD, IF_REAL, "Cross-term dependence of cigsd"), -IOP( "paigs", BSIM4v7_MOD_PAIGS, IF_REAL, "Cross-term dependence of aigs"), -IOP( "pbigs", BSIM4v7_MOD_PBIGS, IF_REAL, "Cross-term dependence of bigs"), -IOP( "pcigs", BSIM4v7_MOD_PCIGS, IF_REAL, "Cross-term dependence of cigs"), -IOP( "paigd", BSIM4v7_MOD_PAIGD, IF_REAL, "Cross-term dependence of aigd"), -IOP( "pbigd", BSIM4v7_MOD_PBIGD, IF_REAL, "Cross-term dependence of bigd"), -IOP( "pcigd", BSIM4v7_MOD_PCIGD, IF_REAL, "Cross-term dependence of cigd"), -IOP( "paigbacc", BSIM4v7_MOD_PAIGBACC, IF_REAL, "Cross-term dependence of aigbacc"), -IOP( "pbigbacc", BSIM4v7_MOD_PBIGBACC, IF_REAL, "Cross-term dependence of bigbacc"), -IOP( "pcigbacc", BSIM4v7_MOD_PCIGBACC, IF_REAL, "Cross-term dependence of cigbacc"), -IOP( "paigbinv", BSIM4v7_MOD_PAIGBINV, IF_REAL, "Cross-term dependence of aigbinv"), -IOP( "pbigbinv", BSIM4v7_MOD_PBIGBINV, IF_REAL, "Cross-term dependence of bigbinv"), -IOP( "pcigbinv", BSIM4v7_MOD_PCIGBINV, IF_REAL, "Cross-term dependence of cigbinv"), -IOP( "pnigc", BSIM4v7_MOD_PNIGC, IF_REAL, "Cross-term dependence of nigc"), -IOP( "pnigbinv", BSIM4v7_MOD_PNIGBINV, IF_REAL, "Cross-term dependence of nigbinv"), -IOP( "pnigbacc", BSIM4v7_MOD_PNIGBACC, IF_REAL, "Cross-term dependence of nigbacc"), -IOP( "pntox", BSIM4v7_MOD_PNTOX, IF_REAL, "Cross-term dependence of ntox"), -IOP( "peigbinv", BSIM4v7_MOD_PEIGBINV, IF_REAL, "Cross-term dependence for eigbinv"), -IOP( "ppigcd", BSIM4v7_MOD_PPIGCD, IF_REAL, "Cross-term dependence for pigcd"), -IOP( "ppoxedge", BSIM4v7_MOD_PPOXEDGE, IF_REAL, "Cross-term dependence for poxedge"), -IOP( "pvfbcv", BSIM4v7_MOD_PVFBCV, IF_REAL, "Cross-term dependence of vfbcv"), -IOP( "pvfb", BSIM4v7_MOD_PVFB, IF_REAL, "Cross-term dependence of vfb"), -IOP( "pacde", BSIM4v7_MOD_PACDE, IF_REAL, "Cross-term dependence of acde"), -IOP( "pmoin", BSIM4v7_MOD_PMOIN, IF_REAL, "Cross-term dependence of moin"), -IOP( "pnoff", BSIM4v7_MOD_PNOFF, IF_REAL, "Cross-term dependence of noff"), -IOP( "pvoffcv", BSIM4v7_MOD_PVOFFCV, IF_REAL, "Cross-term dependence of voffcv"), -IOP( "pxrcrg1", BSIM4v7_MOD_PXRCRG1, IF_REAL, "Cross-term dependence of xrcrg1"), -IOP( "pxrcrg2", BSIM4v7_MOD_PXRCRG2, IF_REAL, "Cross-term dependence of xrcrg2"), -IOP( "plambda", BSIM4v7_MOD_PLAMBDA, IF_REAL, "Cross-term dependence of lambda"), -IOP( "pvtl", BSIM4v7_MOD_PVTL, IF_REAL, "Cross-term dependence of vtl"), -IOP( "pxn", BSIM4v7_MOD_PXN, IF_REAL, "Cross-term dependence of xn"), -IOP( "peu", BSIM4v7_MOD_PEU, IF_REAL, "Cross-term dependence of eu"), -IOP( "pucs", BSIM4v7_MOD_PUCS, IF_REAL, "Cross-term dependence of ucs"), -IOP( "pvfbsdoff", BSIM4v7_MOD_PVFBSDOFF, IF_REAL, "Cross-term dependence of vfbsdoff"), -IOP( "ptvfbsdoff", BSIM4v7_MOD_PTVFBSDOFF, IF_REAL, "Cross-term dependence of tvfbsdoff"), -IOP( "ptvoff", BSIM4v7_MOD_PTVOFF, IF_REAL, "Cross-term dependence of tvoff"), -IOP( "ptnfactor", BSIM4v7_MOD_PTNFACTOR, IF_REAL, "Cross-term dependence of tnfactor"), /* v4.7 Tanvir*/ -IOP( "pteta0", BSIM4v7_MOD_PTETA0, IF_REAL, "Cross-term dependence of teta0"), /* v4.7 Tanvir*/ -IOP( "ptvoffcv", BSIM4v7_MOD_PTVOFFCV, IF_REAL, "Cross-term dependence of tvoffcv"), /* v4.7 Tanvir*/ - -/* stress effect*/ -IOP( "saref", BSIM4v7_MOD_SAREF, IF_REAL, "Reference distance between OD edge to poly of one side"), -IOP( "sbref", BSIM4v7_MOD_SBREF, IF_REAL, "Reference distance between OD edge to poly of the other side"), -IOP( "wlod", BSIM4v7_MOD_WLOD, IF_REAL, "Width parameter for stress effect"), -IOP( "ku0", BSIM4v7_MOD_KU0, IF_REAL, "Mobility degradation/enhancement coefficient for LOD"), -IOP( "kvsat", BSIM4v7_MOD_KVSAT, IF_REAL, "Saturation velocity degradation/enhancement parameter for LOD"), -IOP( "kvth0", BSIM4v7_MOD_KVTH0, IF_REAL, "Threshold degradation/enhancement parameter for LOD"), -IOP( "tku0", BSIM4v7_MOD_TKU0, IF_REAL, "Temperature coefficient of KU0"), -IOP( "llodku0", BSIM4v7_MOD_LLODKU0, IF_REAL, "Length parameter for u0 LOD effect"), -IOP( "wlodku0", BSIM4v7_MOD_WLODKU0, IF_REAL, "Width parameter for u0 LOD effect"), -IOP( "llodvth", BSIM4v7_MOD_LLODVTH, IF_REAL, "Length parameter for vth LOD effect"), -IOP( "wlodvth", BSIM4v7_MOD_WLODVTH, IF_REAL, "Width parameter for vth LOD effect"), -IOP( "lku0", BSIM4v7_MOD_LKU0, IF_REAL, "Length dependence of ku0"), -IOP( "wku0", BSIM4v7_MOD_WKU0, IF_REAL, "Width dependence of ku0"), -IOP( "pku0", BSIM4v7_MOD_PKU0, IF_REAL, "Cross-term dependence of ku0"), -IOP( "lkvth0", BSIM4v7_MOD_LKVTH0, IF_REAL, "Length dependence of kvth0"), -IOP( "wkvth0", BSIM4v7_MOD_WKVTH0, IF_REAL, "Width dependence of kvth0"), -IOP( "pkvth0", BSIM4v7_MOD_PKVTH0, IF_REAL, "Cross-term dependence of kvth0"), -IOP( "stk2", BSIM4v7_MOD_STK2, IF_REAL, "K2 shift factor related to stress effect on vth"), -IOP( "lodk2", BSIM4v7_MOD_LODK2, IF_REAL, "K2 shift modification factor for stress effect"), -IOP( "steta0", BSIM4v7_MOD_STETA0, IF_REAL, "eta0 shift factor related to stress effect on vth"), -IOP( "lodeta0", BSIM4v7_MOD_LODETA0, IF_REAL, "eta0 shift modification factor for stress effect"), -/* Well Proximity Effect */ -IOP( "web", BSIM4v7_MOD_WEB, IF_REAL, "Coefficient for SCB"), -IOP( "wec", BSIM4v7_MOD_WEC, IF_REAL, "Coefficient for SCC"), -IOP( "kvth0we", BSIM4v7_MOD_KVTH0WE, IF_REAL, "Threshold shift factor for well proximity effect"), -IOP( "k2we", BSIM4v7_MOD_K2WE, IF_REAL, " K2 shift factor for well proximity effect "), -IOP( "ku0we", BSIM4v7_MOD_KU0WE, IF_REAL, " Mobility degradation factor for well proximity effect "), -IOP( "scref", BSIM4v7_MOD_SCREF, IF_REAL, " Reference distance to calculate SCA, SCB and SCC"), -IOP( "wpemod", BSIM4v7_MOD_WPEMOD, IF_REAL, " Flag for WPE model (WPEMOD=1 to activate this model) "), -IOP( "lkvth0we", BSIM4v7_MOD_LKVTH0WE, IF_REAL, "Length dependence of kvth0we"), -IOP( "lk2we", BSIM4v7_MOD_LK2WE, IF_REAL, " Length dependence of k2we "), -IOP( "lku0we", BSIM4v7_MOD_LKU0WE, IF_REAL, " Length dependence of ku0we "), -IOP( "wkvth0we", BSIM4v7_MOD_WKVTH0WE, IF_REAL, "Width dependence of kvth0we"), -IOP( "wk2we", BSIM4v7_MOD_WK2WE, IF_REAL, " Width dependence of k2we "), -IOP( "wku0we", BSIM4v7_MOD_WKU0WE, IF_REAL, " Width dependence of ku0we "), -IOP( "pkvth0we", BSIM4v7_MOD_PKVTH0WE, IF_REAL, "Cross-term dependence of kvth0we"), -IOP( "pk2we", BSIM4v7_MOD_PK2WE, IF_REAL, " Cross-term dependence of k2we "), -IOP( "pku0we", BSIM4v7_MOD_PKU0WE, IF_REAL, " Cross-term dependence of ku0we "), - -IOP( "noia", BSIM4v7_MOD_NOIA, IF_REAL, "Flicker noise parameter"), -IOP( "noib", BSIM4v7_MOD_NOIB, IF_REAL, "Flicker noise parameter"), -IOP( "noic", BSIM4v7_MOD_NOIC, IF_REAL, "Flicker noise parameter"), -IOP( "tnoia", BSIM4v7_MOD_TNOIA, IF_REAL, "Thermal noise parameter"), -IOP( "tnoib", BSIM4v7_MOD_TNOIB, IF_REAL, "Thermal noise parameter"), -IOP( "tnoic", BSIM4v7_MOD_TNOIC, IF_REAL, "Thermal noise parameter"), -IOP( "rnoia", BSIM4v7_MOD_RNOIA, IF_REAL, "Thermal noise coefficient"), -IOP( "rnoib", BSIM4v7_MOD_RNOIB, IF_REAL, "Thermal noise coefficient"), -IOP( "rnoic", BSIM4v7_MOD_RNOIC, IF_REAL, "Thermal noise coefficient"), -IOP( "ntnoi", BSIM4v7_MOD_NTNOI, IF_REAL, "Thermal noise parameter"), -IOP( "em", BSIM4v7_MOD_EM, IF_REAL, "Flicker noise parameter"), -IOP( "ef", BSIM4v7_MOD_EF, IF_REAL, "Flicker noise frequency exponent"), -IOP( "af", BSIM4v7_MOD_AF, IF_REAL, "Flicker noise exponent"), -IOP( "kf", BSIM4v7_MOD_KF, IF_REAL, "Flicker noise coefficient"), - -IOP("vgs_max", BSIM4v7_MOD_VGS_MAX, IF_REAL, "maximum voltage G-S branch"), -IOP("vgd_max", BSIM4v7_MOD_VGD_MAX, IF_REAL, "maximum voltage G-D branch"), -IOP("vgb_max", BSIM4v7_MOD_VGB_MAX, IF_REAL, "maximum voltage G-B branch"), -IOP("vds_max", BSIM4v7_MOD_VDS_MAX, IF_REAL, "maximum voltage D-S branch"), -IOP("vbs_max", BSIM4v7_MOD_VBS_MAX, IF_REAL, "maximum voltage B-S branch"), -IOP("vbd_max", BSIM4v7_MOD_VBD_MAX, IF_REAL, "maximum voltage B-D branch"), -IOP("vgsr_max", BSIM4v7_MOD_VGSR_MAX, IF_REAL, "maximum voltage G-S branch"), -IOP("vgdr_max", BSIM4v7_MOD_VGDR_MAX, IF_REAL, "maximum voltage G-D branch"), -IOP("vgbr_max", BSIM4v7_MOD_VGBR_MAX, IF_REAL, "maximum voltage G-B branch"), -IOP("vbsr_max", BSIM4v7_MOD_VBSR_MAX, IF_REAL, "maximum voltage B-S branch"), -IOP("vbdr_max", BSIM4v7_MOD_VBDR_MAX, IF_REAL, "maximum voltage B-D branch"), - -IP( "nmos", BSIM4v7_MOD_NMOS, IF_FLAG, "Flag to indicate NMOS"), -IP( "pmos", BSIM4v7_MOD_PMOS, IF_FLAG, "Flag to indicate PMOS"), -}; - -char *BSIM4v7names[] = { - "Drain", - "Gate", - "Source", - "Bulk", - "Charge" -}; - -int BSIM4v7nSize = NUMELEMS(BSIM4v7names); -int BSIM4v7pTSize = NUMELEMS(BSIM4v7pTable); -int BSIM4v7mPTSize = NUMELEMS(BSIM4v7mPTable); -int BSIM4v7iSize = sizeof(BSIM4v7instance); -int BSIM4v7mSize = sizeof(BSIM4v7model); diff --git a/src/spicelib/devices/bsim4v7/b4v7acld.c b/src/spicelib/devices/bsim4v7/b4v7acld.c deleted file mode 100644 index e3ced126f..000000000 --- a/src/spicelib/devices/bsim4v7/b4v7acld.c +++ /dev/null @@ -1,673 +0,0 @@ -/**** BSIM4.7.0 Released by Darsen Lu 04/08/2011 ****/ - -/********** - * Copyright 2006 Regents of the University of California. All rights reserved. - * File: b4acld.c of BSIM4.7.0. - * Author: 2000 Weidong Liu - * Authors: 2001- Xuemei Xi, Mohan Dunga, Ali Niknejad, Chenming Hu. - * Authors: 2006- Mohan Dunga, Ali Niknejad, Chenming Hu - * Authors: 2007- Mohan Dunga, Wenwei Yang, Ali Niknejad, Chenming Hu - * Project Director: Prof. Chenming Hu. - * Modified by Xuemei Xi, 10/05/2001. - **********/ - -#include "ngspice/ngspice.h" -#include "ngspice/cktdefs.h" -#include "bsim4v7def.h" -#include "ngspice/sperror.h" -#include "ngspice/suffix.h" - - -int -BSIM4v7acLoad( -GENmodel *inModel, -CKTcircuit *ckt) -{ -BSIM4v7model *model = (BSIM4v7model*)inModel; -BSIM4v7instance *here; - -double gjbd, gjbs, geltd, gcrg, gcrgg, gcrgd, gcrgs, gcrgb; -double xcbgb, xcbdb, xcbsb, xcbbb; -double xcggbr, xcgdbr, xcgsbr, xcgbbr, xcggbi, xcgdbi, xcgsbi, xcgbbi; -double Cggr, Cgdr, Cgsr, Cgbr, Cggi, Cgdi, Cgsi, Cgbi; -double xcddbr, xcdgbr, xcdsbr, xcdbbr, xcsdbr, xcsgbr, xcssbr, xcsbbr; -double xcddbi, xcdgbi, xcdsbi, xcdbbi, xcsdbi, xcsgbi, xcssbi, xcsbbi; -double xcdbdb, xcsbsb=0.0, xcgmgmb=0.0, xcgmdb=0.0, xcgmsb=0.0, xcdgmb, xcsgmb; -double xcgmbb=0.0, xcbgmb; -double capbd, capbs, omega; -double gstot, gstotd, gstotg, gstots, gstotb, gspr; -double gdtot, gdtotd, gdtotg, gdtots, gdtotb, gdpr; -double gIstotg, gIstotd, gIstots, gIstotb; -double gIdtotg, gIdtotd, gIdtots, gIdtotb; -double gIbtotg, gIbtotd, gIbtots, gIbtotb; -double gIgtotg, gIgtotd, gIgtots, gIgtotb; -double cgso, cgdo, cgbo; -double gbspsp, gbbdp, gbbsp, gbspg, gbspb; -double gbspdp, gbdpdp, gbdpg, gbdpb, gbdpsp; -double T0=0.0, T1, T2, T3; -double Csg, Csd, Css; -double Cdgr, Cddr, Cdsr, Cdbr, Csgr, Csdr, Cssr, Csbr; -double Cdgi, Cddi, Cdsi, Cdbi, Csgi, Csdi, Cssi, Csbi; -double gmr, gmi, gmbsr, gmbsi, gdsr, gdsi; -double FwdSumr, RevSumr, Gmr, Gmbsr; -double FwdSumi, RevSumi, Gmi, Gmbsi; -struct bsim4SizeDependParam *pParam; -double ggidld, ggidlg, ggidlb, ggislg, ggislb, ggisls; - -double m; - - omega = ckt->CKTomega; - for (; model != NULL; model = BSIM4v7nextModel(model)) - { for (here = BSIM4v7instances(model); here!= NULL; - here = BSIM4v7nextInstance(here)) - { - pParam = here->pParam; - capbd = here->BSIM4v7capbd; - capbs = here->BSIM4v7capbs; - cgso = here->BSIM4v7cgso; - cgdo = here->BSIM4v7cgdo; - cgbo = pParam->BSIM4v7cgbo; - - Csd = -(here->BSIM4v7cddb + here->BSIM4v7cgdb + here->BSIM4v7cbdb); - Csg = -(here->BSIM4v7cdgb + here->BSIM4v7cggb + here->BSIM4v7cbgb); - Css = -(here->BSIM4v7cdsb + here->BSIM4v7cgsb + here->BSIM4v7cbsb); - - if (here->BSIM4v7acnqsMod) - { T0 = omega * here->BSIM4v7taunet; - T1 = T0 * T0; - T2 = 1.0 / (1.0 + T1); - T3 = T0 * T2; - - gmr = here->BSIM4v7gm * T2; - gmbsr = here->BSIM4v7gmbs * T2; - gdsr = here->BSIM4v7gds * T2; - - gmi = -here->BSIM4v7gm * T3; - gmbsi = -here->BSIM4v7gmbs * T3; - gdsi = -here->BSIM4v7gds * T3; - - Cddr = here->BSIM4v7cddb * T2; - Cdgr = here->BSIM4v7cdgb * T2; - Cdsr = here->BSIM4v7cdsb * T2; - Cdbr = -(Cddr + Cdgr + Cdsr); - - /* WDLiu: Cxyi mulitplied by jomega below, and actually to be of conductance */ - Cddi = here->BSIM4v7cddb * T3 * omega; - Cdgi = here->BSIM4v7cdgb * T3 * omega; - Cdsi = here->BSIM4v7cdsb * T3 * omega; - Cdbi = -(Cddi + Cdgi + Cdsi); - - Csdr = Csd * T2; - Csgr = Csg * T2; - Cssr = Css * T2; - Csbr = -(Csdr + Csgr + Cssr); - - Csdi = Csd * T3 * omega; - Csgi = Csg * T3 * omega; - Cssi = Css * T3 * omega; - Csbi = -(Csdi + Csgi + Cssi); - - Cgdr = -(Cddr + Csdr + here->BSIM4v7cbdb); - Cggr = -(Cdgr + Csgr + here->BSIM4v7cbgb); - Cgsr = -(Cdsr + Cssr + here->BSIM4v7cbsb); - Cgbr = -(Cgdr + Cggr + Cgsr); - - Cgdi = -(Cddi + Csdi); - Cggi = -(Cdgi + Csgi); - Cgsi = -(Cdsi + Cssi); - Cgbi = -(Cgdi + Cggi + Cgsi); - } - else /* QS */ - { gmr = here->BSIM4v7gm; - gmbsr = here->BSIM4v7gmbs; - gdsr = here->BSIM4v7gds; - gmi = gmbsi = gdsi = 0.0; - - Cddr = here->BSIM4v7cddb; - Cdgr = here->BSIM4v7cdgb; - Cdsr = here->BSIM4v7cdsb; - Cdbr = -(Cddr + Cdgr + Cdsr); - Cddi = Cdgi = Cdsi = Cdbi = 0.0; - - Csdr = Csd; - Csgr = Csg; - Cssr = Css; - Csbr = -(Csdr + Csgr + Cssr); - Csdi = Csgi = Cssi = Csbi = 0.0; - - Cgdr = here->BSIM4v7cgdb; - Cggr = here->BSIM4v7cggb; - Cgsr = here->BSIM4v7cgsb; - Cgbr = -(Cgdr + Cggr + Cgsr); - Cgdi = Cggi = Cgsi = Cgbi = 0.0; - } - - - if (here->BSIM4v7mode >= 0) - { Gmr = gmr; - Gmbsr = gmbsr; - FwdSumr = Gmr + Gmbsr; - RevSumr = 0.0; - Gmi = gmi; - Gmbsi = gmbsi; - FwdSumi = Gmi + Gmbsi; - RevSumi = 0.0; - - gbbdp = -(here->BSIM4v7gbds); - gbbsp = here->BSIM4v7gbds + here->BSIM4v7gbgs + here->BSIM4v7gbbs; - gbdpg = here->BSIM4v7gbgs; - gbdpdp = here->BSIM4v7gbds; - gbdpb = here->BSIM4v7gbbs; - gbdpsp = -(gbdpg + gbdpdp + gbdpb); - - gbspdp = 0.0; - gbspg = 0.0; - gbspb = 0.0; - gbspsp = 0.0; - - if (model->BSIM4v7igcMod) - { gIstotg = here->BSIM4v7gIgsg + here->BSIM4v7gIgcsg; - gIstotd = here->BSIM4v7gIgcsd; - gIstots = here->BSIM4v7gIgss + here->BSIM4v7gIgcss; - gIstotb = here->BSIM4v7gIgcsb; - - gIdtotg = here->BSIM4v7gIgdg + here->BSIM4v7gIgcdg; - gIdtotd = here->BSIM4v7gIgdd + here->BSIM4v7gIgcdd; - gIdtots = here->BSIM4v7gIgcds; - gIdtotb = here->BSIM4v7gIgcdb; - } - else - { gIstotg = gIstotd = gIstots = gIstotb = 0.0; - gIdtotg = gIdtotd = gIdtots = gIdtotb = 0.0; - } - - if (model->BSIM4v7igbMod) - { gIbtotg = here->BSIM4v7gIgbg; - gIbtotd = here->BSIM4v7gIgbd; - gIbtots = here->BSIM4v7gIgbs; - gIbtotb = here->BSIM4v7gIgbb; - } - else - gIbtotg = gIbtotd = gIbtots = gIbtotb = 0.0; - - if ((model->BSIM4v7igcMod != 0) || (model->BSIM4v7igbMod != 0)) - { gIgtotg = gIstotg + gIdtotg + gIbtotg; - gIgtotd = gIstotd + gIdtotd + gIbtotd ; - gIgtots = gIstots + gIdtots + gIbtots; - gIgtotb = gIstotb + gIdtotb + gIbtotb; - } - else - gIgtotg = gIgtotd = gIgtots = gIgtotb = 0.0; - - if (here->BSIM4v7rgateMod == 2) - T0 = *(ckt->CKTstates[0] + here->BSIM4v7vges) - - *(ckt->CKTstates[0] + here->BSIM4v7vgs); - else if (here->BSIM4v7rgateMod == 3) - T0 = *(ckt->CKTstates[0] + here->BSIM4v7vgms) - - *(ckt->CKTstates[0] + here->BSIM4v7vgs); - if (here->BSIM4v7rgateMod > 1) - { gcrgd = here->BSIM4v7gcrgd * T0; - gcrgg = here->BSIM4v7gcrgg * T0; - gcrgs = here->BSIM4v7gcrgs * T0; - gcrgb = here->BSIM4v7gcrgb * T0; - gcrgg -= here->BSIM4v7gcrg; - gcrg = here->BSIM4v7gcrg; - } - else - gcrg = gcrgd = gcrgg = gcrgs = gcrgb = 0.0; - - if (here->BSIM4v7rgateMod == 3) - { xcgmgmb = (cgdo + cgso + pParam->BSIM4v7cgbo) * omega; - xcgmdb = -cgdo * omega; - xcgmsb = -cgso * omega; - xcgmbb = -pParam->BSIM4v7cgbo * omega; - - xcdgmb = xcgmdb; - xcsgmb = xcgmsb; - xcbgmb = xcgmbb; - - xcggbr = Cggr * omega; - xcgdbr = Cgdr * omega; - xcgsbr = Cgsr * omega; - xcgbbr = -(xcggbr + xcgdbr + xcgsbr); - - xcdgbr = Cdgr * omega; - xcsgbr = Csgr * omega; - xcbgb = here->BSIM4v7cbgb * omega; - } - else - { xcggbr = (Cggr + cgdo + cgso + pParam->BSIM4v7cgbo ) * omega; - xcgdbr = (Cgdr - cgdo) * omega; - xcgsbr = (Cgsr - cgso) * omega; - xcgbbr = -(xcggbr + xcgdbr + xcgsbr); - - xcdgbr = (Cdgr - cgdo) * omega; - xcsgbr = (Csgr - cgso) * omega; - xcbgb = (here->BSIM4v7cbgb - pParam->BSIM4v7cgbo) * omega; - - xcdgmb = xcsgmb = xcbgmb = 0.0; - } - xcddbr = (Cddr + here->BSIM4v7capbd + cgdo) * omega; - xcdsbr = Cdsr * omega; - xcsdbr = Csdr * omega; - xcssbr = (here->BSIM4v7capbs + cgso + Cssr) * omega; - - if (!here->BSIM4v7rbodyMod) - { xcdbbr = -(xcdgbr + xcddbr + xcdsbr + xcdgmb); - xcsbbr = -(xcsgbr + xcsdbr + xcssbr + xcsgmb); - - xcbdb = (here->BSIM4v7cbdb - here->BSIM4v7capbd) * omega; - xcbsb = (here->BSIM4v7cbsb - here->BSIM4v7capbs) * omega; - xcdbdb = 0.0; - } - else - { xcdbbr = Cdbr * omega; - xcsbbr = -(xcsgbr + xcsdbr + xcssbr + xcsgmb) - + here->BSIM4v7capbs * omega; - - xcbdb = here->BSIM4v7cbdb * omega; - xcbsb = here->BSIM4v7cbsb * omega; - - xcdbdb = -here->BSIM4v7capbd * omega; - xcsbsb = -here->BSIM4v7capbs * omega; - } - xcbbb = -(xcbdb + xcbgb + xcbsb + xcbgmb); - - xcdgbi = Cdgi; - xcsgbi = Csgi; - xcddbi = Cddi; - xcdsbi = Cdsi; - xcsdbi = Csdi; - xcssbi = Cssi; - xcdbbi = Cdbi; - xcsbbi = Csbi; - xcggbi = Cggi; - xcgdbi = Cgdi; - xcgsbi = Cgsi; - xcgbbi = Cgbi; - } - else /* Reverse mode */ - { Gmr = -gmr; - Gmbsr = -gmbsr; - FwdSumr = 0.0; - RevSumr = -(Gmr + Gmbsr); - Gmi = -gmi; - Gmbsi = -gmbsi; - FwdSumi = 0.0; - RevSumi = -(Gmi + Gmbsi); - - gbbsp = -(here->BSIM4v7gbds); - gbbdp = here->BSIM4v7gbds + here->BSIM4v7gbgs + here->BSIM4v7gbbs; - - gbdpg = 0.0; - gbdpsp = 0.0; - gbdpb = 0.0; - gbdpdp = 0.0; - - gbspg = here->BSIM4v7gbgs; - gbspsp = here->BSIM4v7gbds; - gbspb = here->BSIM4v7gbbs; - gbspdp = -(gbspg + gbspsp + gbspb); - - if (model->BSIM4v7igcMod) - { gIstotg = here->BSIM4v7gIgsg + here->BSIM4v7gIgcdg; - gIstotd = here->BSIM4v7gIgcds; - gIstots = here->BSIM4v7gIgss + here->BSIM4v7gIgcdd; - gIstotb = here->BSIM4v7gIgcdb; - - gIdtotg = here->BSIM4v7gIgdg + here->BSIM4v7gIgcsg; - gIdtotd = here->BSIM4v7gIgdd + here->BSIM4v7gIgcss; - gIdtots = here->BSIM4v7gIgcsd; - gIdtotb = here->BSIM4v7gIgcsb; - } - else - { gIstotg = gIstotd = gIstots = gIstotb = 0.0; - gIdtotg = gIdtotd = gIdtots = gIdtotb = 0.0; - } - - if (model->BSIM4v7igbMod) - { gIbtotg = here->BSIM4v7gIgbg; - gIbtotd = here->BSIM4v7gIgbs; - gIbtots = here->BSIM4v7gIgbd; - gIbtotb = here->BSIM4v7gIgbb; - } - else - gIbtotg = gIbtotd = gIbtots = gIbtotb = 0.0; - - if ((model->BSIM4v7igcMod != 0) || (model->BSIM4v7igbMod != 0)) - { gIgtotg = gIstotg + gIdtotg + gIbtotg; - gIgtotd = gIstotd + gIdtotd + gIbtotd ; - gIgtots = gIstots + gIdtots + gIbtots; - gIgtotb = gIstotb + gIdtotb + gIbtotb; - } - else - gIgtotg = gIgtotd = gIgtots = gIgtotb = 0.0; - - if (here->BSIM4v7rgateMod == 2) - T0 = *(ckt->CKTstates[0] + here->BSIM4v7vges) - - *(ckt->CKTstates[0] + here->BSIM4v7vgs); - else if (here->BSIM4v7rgateMod == 3) - T0 = *(ckt->CKTstates[0] + here->BSIM4v7vgms) - - *(ckt->CKTstates[0] + here->BSIM4v7vgs); - if (here->BSIM4v7rgateMod > 1) - { gcrgd = here->BSIM4v7gcrgs * T0; - gcrgg = here->BSIM4v7gcrgg * T0; - gcrgs = here->BSIM4v7gcrgd * T0; - gcrgb = here->BSIM4v7gcrgb * T0; - gcrgg -= here->BSIM4v7gcrg; - gcrg = here->BSIM4v7gcrg; - } - else - gcrg = gcrgd = gcrgg = gcrgs = gcrgb = 0.0; - - if (here->BSIM4v7rgateMod == 3) - { xcgmgmb = (cgdo + cgso + pParam->BSIM4v7cgbo) * omega; - xcgmdb = -cgdo * omega; - xcgmsb = -cgso * omega; - xcgmbb = -pParam->BSIM4v7cgbo * omega; - - xcdgmb = xcgmdb; - xcsgmb = xcgmsb; - xcbgmb = xcgmbb; - - xcggbr = Cggr * omega; - xcgdbr = Cgsr * omega; - xcgsbr = Cgdr * omega; - xcgbbr = -(xcggbr + xcgdbr + xcgsbr); - - xcdgbr = Csgr * omega; - xcsgbr = Cdgr * omega; - xcbgb = here->BSIM4v7cbgb * omega; - } - else - { xcggbr = (Cggr + cgdo + cgso + pParam->BSIM4v7cgbo ) * omega; - xcgdbr = (Cgsr - cgdo) * omega; - xcgsbr = (Cgdr - cgso) * omega; - xcgbbr = -(xcggbr + xcgdbr + xcgsbr); - - xcdgbr = (Csgr - cgdo) * omega; - xcsgbr = (Cdgr - cgso) * omega; - xcbgb = (here->BSIM4v7cbgb - pParam->BSIM4v7cgbo) * omega; - - xcdgmb = xcsgmb = xcbgmb = 0.0; - } - xcddbr = (here->BSIM4v7capbd + cgdo + Cssr) * omega; - xcdsbr = Csdr * omega; - xcsdbr = Cdsr * omega; - xcssbr = (Cddr + here->BSIM4v7capbs + cgso) * omega; - - if (!here->BSIM4v7rbodyMod) - { xcdbbr = -(xcdgbr + xcddbr + xcdsbr + xcdgmb); - xcsbbr = -(xcsgbr + xcsdbr + xcssbr + xcsgmb); - - xcbdb = (here->BSIM4v7cbsb - here->BSIM4v7capbd) * omega; - xcbsb = (here->BSIM4v7cbdb - here->BSIM4v7capbs) * omega; - xcdbdb = 0.0; - } - else - { xcdbbr = -(xcdgbr + xcddbr + xcdsbr + xcdgmb) - + here->BSIM4v7capbd * omega; - xcsbbr = Cdbr * omega; - - xcbdb = here->BSIM4v7cbsb * omega; - xcbsb = here->BSIM4v7cbdb * omega; - xcdbdb = -here->BSIM4v7capbd * omega; - xcsbsb = -here->BSIM4v7capbs * omega; - } - xcbbb = -(xcbgb + xcbdb + xcbsb + xcbgmb); - - xcdgbi = Csgi; - xcsgbi = Cdgi; - xcddbi = Cssi; - xcdsbi = Csdi; - xcsdbi = Cdsi; - xcssbi = Cddi; - xcdbbi = Csbi; - xcsbbi = Cdbi; - xcggbi = Cggi; - xcgdbi = Cgsi; - xcgsbi = Cgdi; - xcgbbi = Cgbi; - } - - if (model->BSIM4v7rdsMod == 1) - { gstot = here->BSIM4v7gstot; - gstotd = here->BSIM4v7gstotd; - gstotg = here->BSIM4v7gstotg; - gstots = here->BSIM4v7gstots - gstot; - gstotb = here->BSIM4v7gstotb; - - gdtot = here->BSIM4v7gdtot; - gdtotd = here->BSIM4v7gdtotd - gdtot; - gdtotg = here->BSIM4v7gdtotg; - gdtots = here->BSIM4v7gdtots; - gdtotb = here->BSIM4v7gdtotb; - } - else - { gstot = gstotd = gstotg = gstots = gstotb = 0.0; - gdtot = gdtotd = gdtotg = gdtots = gdtotb = 0.0; - } - - - /* - * Loading AC matrix - */ - m = here->BSIM4v7m; - - if (!model->BSIM4v7rdsMod) - { gdpr = here->BSIM4v7drainConductance; - gspr = here->BSIM4v7sourceConductance; - } - else - gdpr = gspr = 0.0; - - if (!here->BSIM4v7rbodyMod) - { gjbd = here->BSIM4v7gbd; - gjbs = here->BSIM4v7gbs; - } - else - gjbd = gjbs = 0.0; - - geltd = here->BSIM4v7grgeltd; - - if (here->BSIM4v7rgateMod == 1) - { *(here->BSIM4v7GEgePtr) += m * geltd; - *(here->BSIM4v7GPgePtr) -= m * geltd; - *(here->BSIM4v7GEgpPtr) -= m * geltd; - - *(here->BSIM4v7GPgpPtr +1) += m * xcggbr; - *(here->BSIM4v7GPgpPtr) += m * (geltd + xcggbi + gIgtotg); - *(here->BSIM4v7GPdpPtr +1) += m * xcgdbr; - *(here->BSIM4v7GPdpPtr) += m * (xcgdbi + gIgtotd); - *(here->BSIM4v7GPspPtr +1) += m * xcgsbr; - *(here->BSIM4v7GPspPtr) += m * (xcgsbi + gIgtots); - *(here->BSIM4v7GPbpPtr +1) += m * xcgbbr; - *(here->BSIM4v7GPbpPtr) += m * (xcgbbi + gIgtotb); - } /* WDLiu: gcrg already subtracted from all gcrgg below */ - else if (here->BSIM4v7rgateMod == 2) - { *(here->BSIM4v7GEgePtr) += m * gcrg; - *(here->BSIM4v7GEgpPtr) += m * gcrgg; - *(here->BSIM4v7GEdpPtr) += m * gcrgd; - *(here->BSIM4v7GEspPtr) += m * gcrgs; - *(here->BSIM4v7GEbpPtr) += m * gcrgb; - - *(here->BSIM4v7GPgePtr) -= m * gcrg; - *(here->BSIM4v7GPgpPtr +1) += m * xcggbr; - *(here->BSIM4v7GPgpPtr) -= m * (gcrgg - xcggbi - gIgtotg); - *(here->BSIM4v7GPdpPtr +1) += m * xcgdbr; - *(here->BSIM4v7GPdpPtr) -= m * (gcrgd - xcgdbi - gIgtotd); - *(here->BSIM4v7GPspPtr +1) += m * xcgsbr; - *(here->BSIM4v7GPspPtr) -= m * (gcrgs - xcgsbi - gIgtots); - *(here->BSIM4v7GPbpPtr +1) += m * xcgbbr; - *(here->BSIM4v7GPbpPtr) -= m * (gcrgb - xcgbbi - gIgtotb); - } - else if (here->BSIM4v7rgateMod == 3) - { *(here->BSIM4v7GEgePtr) += m * geltd; - *(here->BSIM4v7GEgmPtr) -= m * geltd; - *(here->BSIM4v7GMgePtr) -= m * geltd; - *(here->BSIM4v7GMgmPtr) += m * (geltd + gcrg); - *(here->BSIM4v7GMgmPtr +1) += m * xcgmgmb; - - *(here->BSIM4v7GMdpPtr) += m * gcrgd; - *(here->BSIM4v7GMdpPtr +1) += m * xcgmdb; - *(here->BSIM4v7GMgpPtr) += m * gcrgg; - *(here->BSIM4v7GMspPtr) += m * gcrgs; - *(here->BSIM4v7GMspPtr +1) += m * xcgmsb; - *(here->BSIM4v7GMbpPtr) += m * gcrgb; - *(here->BSIM4v7GMbpPtr +1) += m * xcgmbb; - - *(here->BSIM4v7DPgmPtr +1) += m * xcdgmb; - *(here->BSIM4v7GPgmPtr) -= m * gcrg; - *(here->BSIM4v7SPgmPtr +1) += m * xcsgmb; - *(here->BSIM4v7BPgmPtr +1) += m * xcbgmb; - - *(here->BSIM4v7GPgpPtr) -= m * (gcrgg - xcggbi - gIgtotg); - *(here->BSIM4v7GPgpPtr +1) += m * xcggbr; - *(here->BSIM4v7GPdpPtr) -= m * (gcrgd - xcgdbi - gIgtotd); - *(here->BSIM4v7GPdpPtr +1) += m * xcgdbr; - *(here->BSIM4v7GPspPtr) -= m * (gcrgs - xcgsbi - gIgtots); - *(here->BSIM4v7GPspPtr +1) += m * xcgsbr; - *(here->BSIM4v7GPbpPtr) -= m * (gcrgb - xcgbbi - gIgtotb); - *(here->BSIM4v7GPbpPtr +1) += m * xcgbbr; - } - else - { *(here->BSIM4v7GPgpPtr +1) += m * xcggbr; - *(here->BSIM4v7GPgpPtr) += m * (xcggbi + gIgtotg); - *(here->BSIM4v7GPdpPtr +1) += m * xcgdbr; - *(here->BSIM4v7GPdpPtr) += m * (xcgdbi + gIgtotd); - *(here->BSIM4v7GPspPtr +1) += m * xcgsbr; - *(here->BSIM4v7GPspPtr) += m * (xcgsbi + gIgtots); - *(here->BSIM4v7GPbpPtr +1) += m * xcgbbr; - *(here->BSIM4v7GPbpPtr) += m * (xcgbbi + gIgtotb); - } - - if (model->BSIM4v7rdsMod) - { (*(here->BSIM4v7DgpPtr) += m * gdtotg); - (*(here->BSIM4v7DspPtr) += m * gdtots); - (*(here->BSIM4v7DbpPtr) += m * gdtotb); - (*(here->BSIM4v7SdpPtr) += m * gstotd); - (*(here->BSIM4v7SgpPtr) += m * gstotg); - (*(here->BSIM4v7SbpPtr) += m * gstotb); - } - - *(here->BSIM4v7DPdpPtr +1) += m * (xcddbr + gdsi + RevSumi); - *(here->BSIM4v7DPdpPtr) += m * (gdpr + xcddbi + gdsr + here->BSIM4v7gbd - - gdtotd + RevSumr + gbdpdp - gIdtotd); - *(here->BSIM4v7DPdPtr) -= m * (gdpr + gdtot); - *(here->BSIM4v7DPgpPtr +1) += m * (xcdgbr + Gmi); - *(here->BSIM4v7DPgpPtr) += m * (Gmr + xcdgbi - gdtotg + gbdpg - gIdtotg); - *(here->BSIM4v7DPspPtr +1) += m * (xcdsbr - gdsi - FwdSumi); - *(here->BSIM4v7DPspPtr) -= m * (gdsr - xcdsbi + FwdSumr + gdtots - gbdpsp + gIdtots); - *(here->BSIM4v7DPbpPtr +1) += m * (xcdbbr + Gmbsi); - *(here->BSIM4v7DPbpPtr) -= m * (gjbd + gdtotb - xcdbbi - Gmbsr - gbdpb + gIdtotb); - - *(here->BSIM4v7DdpPtr) -= m * (gdpr - gdtotd); - *(here->BSIM4v7DdPtr) += m * (gdpr + gdtot); - - *(here->BSIM4v7SPdpPtr +1) += m * (xcsdbr - gdsi - RevSumi); - *(here->BSIM4v7SPdpPtr) -= m * (gdsr - xcsdbi + gstotd + RevSumr - gbspdp + gIstotd); - *(here->BSIM4v7SPgpPtr +1) += m * (xcsgbr - Gmi); - *(here->BSIM4v7SPgpPtr) -= m * (Gmr - xcsgbi + gstotg - gbspg + gIstotg); - *(here->BSIM4v7SPspPtr +1) += m * (xcssbr + gdsi + FwdSumi); - *(here->BSIM4v7SPspPtr) += m * (gspr + xcssbi + gdsr + here->BSIM4v7gbs - - gstots + FwdSumr + gbspsp - gIstots); - *(here->BSIM4v7SPsPtr) -= m * (gspr + gstot); - *(here->BSIM4v7SPbpPtr +1) += m * (xcsbbr - Gmbsi); - *(here->BSIM4v7SPbpPtr) -= m * (gjbs + gstotb - xcsbbi + Gmbsr - gbspb + gIstotb); - - *(here->BSIM4v7SspPtr) -= m * (gspr - gstots); - *(here->BSIM4v7SsPtr) += m * (gspr + gstot); - - *(here->BSIM4v7BPdpPtr +1) += m * xcbdb; - *(here->BSIM4v7BPdpPtr) -= m * (gjbd - gbbdp + gIbtotd); - *(here->BSIM4v7BPgpPtr +1) += m * xcbgb; - *(here->BSIM4v7BPgpPtr) -= m * (here->BSIM4v7gbgs + gIbtotg); - *(here->BSIM4v7BPspPtr +1) += m * xcbsb; - *(here->BSIM4v7BPspPtr) -= m * (gjbs - gbbsp + gIbtots); - *(here->BSIM4v7BPbpPtr +1) += m * xcbbb; - *(here->BSIM4v7BPbpPtr) += m * (gjbd + gjbs - here->BSIM4v7gbbs - - gIbtotb); - ggidld = here->BSIM4v7ggidld; - ggidlg = here->BSIM4v7ggidlg; - ggidlb = here->BSIM4v7ggidlb; - ggislg = here->BSIM4v7ggislg; - ggisls = here->BSIM4v7ggisls; - ggislb = here->BSIM4v7ggislb; - - /* stamp gidl */ - (*(here->BSIM4v7DPdpPtr) += m * ggidld); - (*(here->BSIM4v7DPgpPtr) += m * ggidlg); - (*(here->BSIM4v7DPspPtr) -= m * ((ggidlg + ggidld) + ggidlb)); - (*(here->BSIM4v7DPbpPtr) += m * ggidlb); - (*(here->BSIM4v7BPdpPtr) -= m * ggidld); - (*(here->BSIM4v7BPgpPtr) -= m * ggidlg); - (*(here->BSIM4v7BPspPtr) += m * ((ggidlg + ggidld) + ggidlb)); - (*(here->BSIM4v7BPbpPtr) -= m * ggidlb); - /* stamp gisl */ - (*(here->BSIM4v7SPdpPtr) -= m * ((ggisls + ggislg) + ggislb)); - (*(here->BSIM4v7SPgpPtr) += m * ggislg); - (*(here->BSIM4v7SPspPtr) += m * ggisls); - (*(here->BSIM4v7SPbpPtr) += m * ggislb); - (*(here->BSIM4v7BPdpPtr) += m * ((ggislg + ggisls) + ggislb)); - (*(here->BSIM4v7BPgpPtr) -= m * ggislg); - (*(here->BSIM4v7BPspPtr) -= m * ggisls); - (*(here->BSIM4v7BPbpPtr) -= m * ggislb); - - if (here->BSIM4v7rbodyMod) - { (*(here->BSIM4v7DPdbPtr +1) += m * xcdbdb); - (*(here->BSIM4v7DPdbPtr) -= m * here->BSIM4v7gbd); - (*(here->BSIM4v7SPsbPtr +1) += m * xcsbsb); - (*(here->BSIM4v7SPsbPtr) -= m * here->BSIM4v7gbs); - - (*(here->BSIM4v7DBdpPtr +1) += m * xcdbdb); - (*(here->BSIM4v7DBdpPtr) -= m * here->BSIM4v7gbd); - (*(here->BSIM4v7DBdbPtr +1) -= m * xcdbdb); - (*(here->BSIM4v7DBdbPtr) += m * (here->BSIM4v7gbd + here->BSIM4v7grbpd - + here->BSIM4v7grbdb)); - (*(here->BSIM4v7DBbpPtr) -= m * here->BSIM4v7grbpd); - (*(here->BSIM4v7DBbPtr) -= m * here->BSIM4v7grbdb); - - (*(here->BSIM4v7BPdbPtr) -= m * here->BSIM4v7grbpd); - (*(here->BSIM4v7BPbPtr) -= m * here->BSIM4v7grbpb); - (*(here->BSIM4v7BPsbPtr) -= m * here->BSIM4v7grbps); - (*(here->BSIM4v7BPbpPtr) += m * (here->BSIM4v7grbpd + here->BSIM4v7grbps - + here->BSIM4v7grbpb)); - /* WDLiu: (-here->BSIM4v7gbbs) already added to BPbpPtr */ - - (*(here->BSIM4v7SBspPtr +1) += m * xcsbsb); - (*(here->BSIM4v7SBspPtr) -= m * here->BSIM4v7gbs); - (*(here->BSIM4v7SBbpPtr) -= m * here->BSIM4v7grbps); - (*(here->BSIM4v7SBbPtr) -= m * here->BSIM4v7grbsb); - (*(here->BSIM4v7SBsbPtr +1) -= m * xcsbsb); - (*(here->BSIM4v7SBsbPtr) += m * (here->BSIM4v7gbs - + here->BSIM4v7grbps + here->BSIM4v7grbsb)); - - (*(here->BSIM4v7BdbPtr) -= m * here->BSIM4v7grbdb); - (*(here->BSIM4v7BbpPtr) -= m * here->BSIM4v7grbpb); - (*(here->BSIM4v7BsbPtr) -= m * here->BSIM4v7grbsb); - (*(here->BSIM4v7BbPtr) += m * (here->BSIM4v7grbsb + here->BSIM4v7grbdb - + here->BSIM4v7grbpb)); - } - - - /* - * WDLiu: The internal charge node generated for transient NQS is not needed for - * AC NQS. The following is not doing a real job, but we have to keep it; - * otherwise a singular AC NQS matrix may occur if the transient NQS is on. - * The charge node is isolated from the instance. - */ - if (here->BSIM4v7trnqsMod) - { (*(here->BSIM4v7QqPtr) += m * 1.0); - (*(here->BSIM4v7QgpPtr) += 0.0); - (*(here->BSIM4v7QdpPtr) += 0.0); - (*(here->BSIM4v7QspPtr) += 0.0); - (*(here->BSIM4v7QbpPtr) += 0.0); - - (*(here->BSIM4v7DPqPtr) += 0.0); - (*(here->BSIM4v7SPqPtr) += 0.0); - (*(here->BSIM4v7GPqPtr) += 0.0); - } - } - } - return(OK); -} diff --git a/src/spicelib/devices/bsim4v7/b4v7ask.c b/src/spicelib/devices/bsim4v7/b4v7ask.c deleted file mode 100644 index 78a8e10c1..000000000 --- a/src/spicelib/devices/bsim4v7/b4v7ask.c +++ /dev/null @@ -1,411 +0,0 @@ -/**** BSIM4.7.0 Released by Darsen Lu 04/08/2011 ****/ - -/********** - * Copyright 2006 Regents of the University of California. All rights reserved. - * File: b4ask.c of BSIM4.7.0. - * Author: 2000 Weidong Liu - * Authors: 2001- Xuemei Xi, Mohan Dunga, Ali Niknejad, Chenming Hu. - * Authors: 2006- Mohan Dunga, Ali Niknejad, Chenming Hu - * Authors: 2007- Mohan Dunga, Wenwei Yang, Ali Niknejad, Chenming Hu - * Project Director: Prof. Chenming Hu. - * Modified by Xuemei Xi, 04/06/2001. - * Modified by Xuemei Xi, 10/05/2001. - * Modified by Xuemei Xi, 05/09/2003. - * Modified by Xuemei Xi, Mohan Dunga, 07/29/2005. - **********/ - -#include "ngspice/ngspice.h" -#include "ngspice/ifsim.h" -#include "ngspice/cktdefs.h" -#include "ngspice/devdefs.h" -#include "bsim4v7def.h" -#include "ngspice/sperror.h" -#include "ngspice/suffix.h" - -int -BSIM4v7ask( -CKTcircuit *ckt, -GENinstance *inst, -int which, -IFvalue *value, -IFvalue *select) -{ -BSIM4v7instance *here = (BSIM4v7instance*)inst; - - NG_IGNORE(select); - - switch(which) - { case BSIM4v7_L: - value->rValue = here->BSIM4v7l; - return(OK); - case BSIM4v7_W: - value->rValue = here->BSIM4v7w; - return(OK); - case BSIM4v7_M: - value->rValue = here->BSIM4v7m; - return(OK); - case BSIM4v7_NF: - value->rValue = here->BSIM4v7nf; - return(OK); - case BSIM4v7_MIN: - value->iValue = here->BSIM4v7min; - return(OK); - case BSIM4v7_AS: - value->rValue = here->BSIM4v7sourceArea; - return(OK); - case BSIM4v7_AD: - value->rValue = here->BSIM4v7drainArea; - return(OK); - case BSIM4v7_PS: - value->rValue = here->BSIM4v7sourcePerimeter; - return(OK); - case BSIM4v7_PD: - value->rValue = here->BSIM4v7drainPerimeter; - return(OK); - case BSIM4v7_NRS: - value->rValue = here->BSIM4v7sourceSquares; - return(OK); - case BSIM4v7_NRD: - value->rValue = here->BSIM4v7drainSquares; - return(OK); - case BSIM4v7_OFF: - value->rValue = here->BSIM4v7off; - return(OK); - case BSIM4v7_SA: - value->rValue = here->BSIM4v7sa ; - return(OK); - case BSIM4v7_SB: - value->rValue = here->BSIM4v7sb ; - return(OK); - case BSIM4v7_SD: - value->rValue = here->BSIM4v7sd ; - return(OK); - case BSIM4v7_SCA: - value->rValue = here->BSIM4v7sca ; - return(OK); - case BSIM4v7_SCB: - value->rValue = here->BSIM4v7scb ; - return(OK); - case BSIM4v7_SCC: - value->rValue = here->BSIM4v7scc ; - return(OK); - case BSIM4v7_SC: - value->rValue = here->BSIM4v7sc ; - return(OK); - - case BSIM4v7_RBSB: - value->rValue = here->BSIM4v7rbsb; - return(OK); - case BSIM4v7_RBDB: - value->rValue = here->BSIM4v7rbdb; - return(OK); - case BSIM4v7_RBPB: - value->rValue = here->BSIM4v7rbpb; - return(OK); - case BSIM4v7_RBPS: - value->rValue = here->BSIM4v7rbps; - return(OK); - case BSIM4v7_RBPD: - value->rValue = here->BSIM4v7rbpd; - return(OK); - case BSIM4v7_DELVTO: - value->rValue = here->BSIM4v7delvto; - return(OK); - case BSIM4v7_MULU0: - value->rValue = here->BSIM4v7mulu0; - return(OK); - case BSIM4v7_WNFLAG: - value->iValue = here->BSIM4v7wnflag; - return(OK); - case BSIM4v7_XGW: - value->rValue = here->BSIM4v7xgw; - return(OK); - case BSIM4v7_NGCON: - value->rValue = here->BSIM4v7ngcon; - return(OK); - case BSIM4v7_TRNQSMOD: - value->iValue = here->BSIM4v7trnqsMod; - return(OK); - case BSIM4v7_ACNQSMOD: - value->iValue = here->BSIM4v7acnqsMod; - return(OK); - case BSIM4v7_RBODYMOD: - value->iValue = here->BSIM4v7rbodyMod; - return(OK); - case BSIM4v7_RGATEMOD: - value->iValue = here->BSIM4v7rgateMod; - return(OK); - case BSIM4v7_GEOMOD: - value->iValue = here->BSIM4v7geoMod; - return(OK); - case BSIM4v7_RGEOMOD: - value->iValue = here->BSIM4v7rgeoMod; - return(OK); - case BSIM4v7_IC_VDS: - value->rValue = here->BSIM4v7icVDS; - return(OK); - case BSIM4v7_IC_VGS: - value->rValue = here->BSIM4v7icVGS; - return(OK); - case BSIM4v7_IC_VBS: - value->rValue = here->BSIM4v7icVBS; - return(OK); - case BSIM4v7_DNODE: - value->iValue = here->BSIM4v7dNode; - return(OK); - case BSIM4v7_GNODEEXT: - value->iValue = here->BSIM4v7gNodeExt; - return(OK); - case BSIM4v7_SNODE: - value->iValue = here->BSIM4v7sNode; - return(OK); - case BSIM4v7_BNODE: - value->iValue = here->BSIM4v7bNode; - return(OK); - case BSIM4v7_DNODEPRIME: - value->iValue = here->BSIM4v7dNodePrime; - return(OK); - case BSIM4v7_GNODEPRIME: - value->iValue = here->BSIM4v7gNodePrime; - return(OK); - case BSIM4v7_GNODEMID: - value->iValue = here->BSIM4v7gNodeMid; - return(OK); - case BSIM4v7_SNODEPRIME: - value->iValue = here->BSIM4v7sNodePrime; - return(OK); - case BSIM4v7_DBNODE: - value->iValue = here->BSIM4v7dbNode; - return(OK); - case BSIM4v7_BNODEPRIME: - value->iValue = here->BSIM4v7bNodePrime; - return(OK); - case BSIM4v7_SBNODE: - value->iValue = here->BSIM4v7sbNode; - return(OK); - case BSIM4v7_SOURCECONDUCT: - value->rValue = here->BSIM4v7sourceConductance; - value->rValue *= here->BSIM4v7m; - return(OK); - case BSIM4v7_DRAINCONDUCT: - value->rValue = here->BSIM4v7drainConductance; - value->rValue *= here->BSIM4v7m; - return(OK); - case BSIM4v7_VBD: - value->rValue = *(ckt->CKTstate0 + here->BSIM4v7vbd); - return(OK); - case BSIM4v7_VBS: - value->rValue = *(ckt->CKTstate0 + here->BSIM4v7vbs); - return(OK); - case BSIM4v7_VGS: - value->rValue = *(ckt->CKTstate0 + here->BSIM4v7vgs); - return(OK); - case BSIM4v7_VDS: - value->rValue = *(ckt->CKTstate0 + here->BSIM4v7vds); - return(OK); - case BSIM4v7_CD: - value->rValue = here->BSIM4v7cd; - value->rValue *= here->BSIM4v7m; - return(OK); - case BSIM4v7_CBS: - value->rValue = here->BSIM4v7cbs; - value->rValue *= here->BSIM4v7m; - return(OK); - case BSIM4v7_CBD: - value->rValue = here->BSIM4v7cbd; - value->rValue *= here->BSIM4v7m; - return(OK); - case BSIM4v7_CSUB: - value->rValue = here->BSIM4v7csub; - value->rValue *= here->BSIM4v7m; - return(OK); - case BSIM4v7_QINV: - value->rValue = here-> BSIM4v7qinv; - value->rValue *= here->BSIM4v7m; - return(OK); - case BSIM4v7_IGIDL: - value->rValue = here->BSIM4v7Igidl; - value->rValue *= here->BSIM4v7m; - return(OK); - case BSIM4v7_IGISL: - value->rValue = here->BSIM4v7Igisl; - value->rValue *= here->BSIM4v7m; - return(OK); - case BSIM4v7_IGS: - value->rValue = here->BSIM4v7Igs; - value->rValue *= here->BSIM4v7m; - return(OK); - case BSIM4v7_IGD: - value->rValue = here->BSIM4v7Igd; - value->rValue *= here->BSIM4v7m; - return(OK); - case BSIM4v7_IGB: - value->rValue = here->BSIM4v7Igb; - value->rValue *= here->BSIM4v7m; - return(OK); - case BSIM4v7_IGCS: - value->rValue = here->BSIM4v7Igcs; - value->rValue *= here->BSIM4v7m; - return(OK); - case BSIM4v7_IGCD: - value->rValue = here->BSIM4v7Igcd; - value->rValue *= here->BSIM4v7m; - return(OK); - case BSIM4v7_GM: - value->rValue = here->BSIM4v7gm; - value->rValue *= here->BSIM4v7m; - return(OK); - case BSIM4v7_GDS: - value->rValue = here->BSIM4v7gds; - value->rValue *= here->BSIM4v7m; - return(OK); - case BSIM4v7_GMBS: - value->rValue = here->BSIM4v7gmbs; - value->rValue *= here->BSIM4v7m; - return(OK); - case BSIM4v7_GBD: - value->rValue = here->BSIM4v7gbd; - value->rValue *= here->BSIM4v7m; - return(OK); - case BSIM4v7_GBS: - value->rValue = here->BSIM4v7gbs; - value->rValue *= here->BSIM4v7m; - return(OK); -/* case BSIM4v7_QB: - value->rValue = *(ckt->CKTstate0 + here->BSIM4v7qb); - return(OK); */ - case BSIM4v7_CQB: - value->rValue = *(ckt->CKTstate0 + here->BSIM4v7cqb); - return(OK); -/* case BSIM4v7_QG: - value->rValue = *(ckt->CKTstate0 + here->BSIM4v7qg); - return(OK); */ - case BSIM4v7_CQG: - value->rValue = *(ckt->CKTstate0 + here->BSIM4v7cqg); - return(OK); -/* case BSIM4v7_QD: - value->rValue = *(ckt->CKTstate0 + here->BSIM4v7qd); - return(OK); */ - case BSIM4v7_CQD: - value->rValue = *(ckt->CKTstate0 + here->BSIM4v7cqd); - return(OK); -/* case BSIM4v7_QS: - value->rValue = *(ckt->CKTstate0 + here->BSIM4v7qs); - return(OK); */ - case BSIM4v7_QB: - value->rValue = here->BSIM4v7qbulk; - value->rValue *= here->BSIM4v7m; - return(OK); - case BSIM4v7_QG: - value->rValue = here->BSIM4v7qgate; - value->rValue *= here->BSIM4v7m; - return(OK); - case BSIM4v7_QS: - value->rValue = here->BSIM4v7qsrc; - value->rValue *= here->BSIM4v7m; - return(OK); - case BSIM4v7_QD: - value->rValue = here->BSIM4v7qdrn; - value->rValue *= here->BSIM4v7m; - return(OK); - case BSIM4v7_QDEF: - value->rValue = *(ckt->CKTstate0 + here->BSIM4v7qdef); - return(OK); - case BSIM4v7_GCRG: - value->rValue = here->BSIM4v7gcrg; - value->rValue *= here->BSIM4v7m; - return(OK); - case BSIM4v7_GTAU: - value->rValue = here->BSIM4v7gtau; - value->rValue *= here->BSIM4v7m; - return(OK); - case BSIM4v7_CGGB: - value->rValue = here->BSIM4v7cggb; - value->rValue *= here->BSIM4v7m; - return(OK); - case BSIM4v7_CGDB: - value->rValue = here->BSIM4v7cgdb; - value->rValue *= here->BSIM4v7m; - return(OK); - case BSIM4v7_CGSB: - value->rValue = here->BSIM4v7cgsb; - value->rValue *= here->BSIM4v7m; - return(OK); - case BSIM4v7_CDGB: - value->rValue = here->BSIM4v7cdgb; - value->rValue *= here->BSIM4v7m; - return(OK); - case BSIM4v7_CDDB: - value->rValue = here->BSIM4v7cddb; - value->rValue *= here->BSIM4v7m; - return(OK); - case BSIM4v7_CDSB: - value->rValue = here->BSIM4v7cdsb; - value->rValue *= here->BSIM4v7m; - return(OK); - case BSIM4v7_CBGB: - value->rValue = here->BSIM4v7cbgb; - value->rValue *= here->BSIM4v7m; - return(OK); - case BSIM4v7_CBDB: - value->rValue = here->BSIM4v7cbdb; - value->rValue *= here->BSIM4v7m; - return(OK); - case BSIM4v7_CBSB: - value->rValue = here->BSIM4v7cbsb; - value->rValue *= here->BSIM4v7m; - return(OK); - case BSIM4v7_CSGB: - value->rValue = here->BSIM4v7csgb; - value->rValue *= here->BSIM4v7m; - return(OK); - case BSIM4v7_CSDB: - value->rValue = here->BSIM4v7csdb; - value->rValue *= here->BSIM4v7m; - return(OK); - case BSIM4v7_CSSB: - value->rValue = here->BSIM4v7cssb; - value->rValue *= here->BSIM4v7m; - return(OK); - case BSIM4v7_CGBB: - value->rValue = here->BSIM4v7cgbb; - value->rValue *= here->BSIM4v7m; - return(OK); - case BSIM4v7_CDBB: - value->rValue = here->BSIM4v7cdbb; - value->rValue *= here->BSIM4v7m; - return(OK); - case BSIM4v7_CSBB: - value->rValue = here->BSIM4v7csbb; - value->rValue *= here->BSIM4v7m; - return(OK); - case BSIM4v7_CBBB: - value->rValue = here->BSIM4v7cbbb; - value->rValue *= here->BSIM4v7m; - return(OK); - case BSIM4v7_CAPBD: - value->rValue = here->BSIM4v7capbd; - value->rValue *= here->BSIM4v7m; - return(OK); - case BSIM4v7_CAPBS: - value->rValue = here->BSIM4v7capbs; - value->rValue *= here->BSIM4v7m; - return(OK); - case BSIM4v7_VON: - value->rValue = here->BSIM4v7von; - return(OK); - case BSIM4v7_VDSAT: - value->rValue = here->BSIM4v7vdsat; - return(OK); - case BSIM4v7_QBS: - value->rValue = *(ckt->CKTstate0 + here->BSIM4v7qbs); - return(OK); - case BSIM4v7_QBD: - value->rValue = *(ckt->CKTstate0 + here->BSIM4v7qbd); - return(OK); - default: - return(E_BADPARM); - } - /* NOTREACHED */ -} - diff --git a/src/spicelib/devices/bsim4v7/b4v7check.c b/src/spicelib/devices/bsim4v7/b4v7check.c deleted file mode 100644 index 4b6a28bee..000000000 --- a/src/spicelib/devices/bsim4v7/b4v7check.c +++ /dev/null @@ -1,841 +0,0 @@ -/**** BSIM4.7.0 Released by Darsen Lu 04/08/2011 ****/ - -/********** - * Copyright 2006 Regents of the University of California. All rights reserved. - * File: b4check.c of BSIM4.7.0. - * Author: 2000 Weidong Liu - * Authors: 2001- Xuemei Xi, Mohan Dunga, Ali Niknejad, Chenming Hu. - * Authors: 2006- Mohan Dunga, Ali Niknejad, Chenming Hu - * Authors: 2007- Mohan Dunga, Wenwei Yang, Ali Niknejad, Chenming Hu - * Project Director: Prof. Chenming Hu. - * Modified by Xuemei Xi, 04/06/2001. - * Modified by Xuemei Xi, 10/05/2001. - * Modified by Xuemei Xi, 11/15/2002. - * Modified by Xuemei Xi, 05/09/2003. - * Modified by Xuemei Xi, 03/04/2004. - * Modified by Xuemei Xi, 07/29/2005. - * Modified by Mohan Dunga, 12/13/2006 - * Modified by Mohan Dunga, Wenwei Yang, 05/18/2007. - * Modified by Wenwei Yang, 07/31/2008 . - * Modified by Tanvir Morshed, Darsen Lu 03/27/2011 - * Modified by Holger Vogt, 12/27/2020. - **********/ - -#include "ngspice/ngspice.h" -#include "ngspice/cktdefs.h" -#include "bsim4v7def.h" -#include "ngspice/trandefs.h" -#include "ngspice/const.h" -#include "ngspice/sperror.h" -#include "ngspice/devdefs.h" -#include "ngspice/suffix.h" -#include "ngspice/wordlist.h" -#include "ngspice/cpextern.h" - - - -/* Check for correctness of the BSIM4.7 parameters: - If parameter excursions are found, put the warning or error message into a wordlist. - Only then open a file bsim4v7.out and print the data into the file. */ -int -BSIM4v7checkModel( -BSIM4v7model *model, -BSIM4v7instance *here, -CKTcircuit *ckt) -{ - struct bsim4SizeDependParam *pParam; - int Fatal_Flag = 0; - FILE *fplog; - wordlist* wl, *wlstart; - - pParam = here->pParam; - - if (cp_getvar("ng_nomodcheck", CP_BOOL, NULL, 0)) - return(0); - - wl = wlstart = TMALLOC(wordlist, 1); - wl->wl_prev = NULL; - wl->wl_next = NULL; - wl->wl_word = tprintf("\nChecking parameters for BSIM 4.7 model %s\n", model->BSIM4v7modName); - - if ((here->BSIM4v7rgateMod == 2) || (here->BSIM4v7rgateMod == 3)) - { if ((here->BSIM4v7trnqsMod == 1) || (here->BSIM4v7acnqsMod == 1)) { - wl_append_word(&wl, &wl, tprintf("Warning: You've selected both Rg and charge deficit NQS; select one only.\n")); - } - } - - if (model->BSIM4v7toxe <= 0.0) - { - wl_append_word(&wl, &wl, tprintf("Fatal: Toxe = %g is not positive.\n", - model->BSIM4v7toxe)); - Fatal_Flag = 1; - } - - if (model->BSIM4v7toxp <= 0.0) - { - wl_append_word(&wl, &wl, tprintf("Fatal: Toxp = %g is not positive.\n", model->BSIM4v7toxp)); - Fatal_Flag = 1; - } - - if (model->BSIM4v7eot <= 0.0) - { - wl_append_word(&wl, &wl, tprintf("Fatal: EOT = %g is not positive.\n", model->BSIM4v7eot)); - Fatal_Flag = 1; - } - if (model->BSIM4v7epsrgate < 0.0) - { - wl_append_word(&wl, &wl, tprintf("Fatal: Epsrgate = %g is not positive.\n", model->BSIM4v7epsrgate)); - Fatal_Flag = 1; - } - if (model->BSIM4v7epsrsub < 0.0) - { - wl_append_word(&wl, &wl, tprintf("Fatal: Epsrsub = %g is not positive.\n", model->BSIM4v7epsrsub)); - Fatal_Flag = 1; - } - if (model->BSIM4v7easub < 0.0) - { - wl_append_word(&wl, &wl, tprintf("Fatal: Easub = %g is not positive.\n", model->BSIM4v7easub)); - Fatal_Flag = 1; - } - if (model->BSIM4v7ni0sub <= 0.0) - { - wl_append_word(&wl, &wl, tprintf("Fatal: Easub = %g is not positive.\n", model->BSIM4v7ni0sub)); - Fatal_Flag = 1; - } - - if (model->BSIM4v7toxm <= 0.0) - { - wl_append_word(&wl, &wl, tprintf("Fatal: Toxm = %g is not positive.\n", model->BSIM4v7toxm)); - Fatal_Flag = 1; - } - if (model->BSIM4v7toxref <= 0.0) - { - wl_append_word(&wl, &wl, tprintf("Fatal: Toxref = %g is not positive.\n", model->BSIM4v7toxref)); - Fatal_Flag = 1; - } - - if (pParam->BSIM4v7lpe0 < -pParam->BSIM4v7leff) - { - wl_append_word(&wl, &wl, tprintf("Fatal: Lpe0 = %g is less than -Leff.\n", - pParam->BSIM4v7lpe0)); - Fatal_Flag = 1; - } - if (model->BSIM4v7lintnoi > pParam->BSIM4v7leff / 2) - { - wl_append_word(&wl, &wl, tprintf("Fatal: Lintnoi = %g is too large - Leff for noise is negative.\n", - model->BSIM4v7lintnoi)); - Fatal_Flag = 1; - } - if (pParam->BSIM4v7lpeb < -pParam->BSIM4v7leff) - { - wl_append_word(&wl, &wl, tprintf("Fatal: Lpeb = %g is less than -Leff.\n", - pParam->BSIM4v7lpeb)); - Fatal_Flag = 1; - } - if (pParam->BSIM4v7ndep <= 0.0) - { - wl_append_word(&wl, &wl, tprintf("Fatal: Ndep = %g is not positive.\n", - pParam->BSIM4v7ndep)); - Fatal_Flag = 1; - } - if (pParam->BSIM4v7phi <= 0.0) - { - wl_append_word(&wl, &wl, tprintf("Fatal: Phi = %g is not positive. Please check Phin and Ndep\n", - pParam->BSIM4v7phi)); - wl_append_word(&wl, &wl, tprintf(" Phin = %g Ndep = %g \n", - pParam->BSIM4v7phin, pParam->BSIM4v7ndep)); - Fatal_Flag = 1; - } - if (pParam->BSIM4v7nsub <= 0.0) - { - wl_append_word(&wl, &wl, tprintf("Fatal: Nsub = %g is not positive.\n", - pParam->BSIM4v7nsub)); - Fatal_Flag = 1; - } - if (pParam->BSIM4v7ngate < 0.0) - { - wl_append_word(&wl, &wl, tprintf("Fatal: Ngate = %g Ngate is not positive.\n", - pParam->BSIM4v7ngate)); - Fatal_Flag = 1; - } - if (pParam->BSIM4v7ngate > 1.e25) - { - wl_append_word(&wl, &wl, tprintf("Fatal: Ngate = %g Ngate is too high\n", - pParam->BSIM4v7ngate)); - Fatal_Flag = 1; - } - if (pParam->BSIM4v7xj <= 0.0) - { - wl_append_word(&wl, &wl, tprintf("Fatal: Xj = %g is not positive.\n", pParam->BSIM4v7xj)); - Fatal_Flag = 1; - } - - if (pParam->BSIM4v7dvt1 < 0.0) - { - wl_append_word(&wl, &wl, tprintf("Fatal: Dvt1 = %g is negative.\n", pParam->BSIM4v7dvt1)); - Fatal_Flag = 1; - } - - if (pParam->BSIM4v7dvt1w < 0.0) - { - wl_append_word(&wl, &wl, tprintf("Fatal: Dvt1w = %g is negative.\n", pParam->BSIM4v7dvt1w)); - Fatal_Flag = 1; - } - - if (pParam->BSIM4v7w0 == -pParam->BSIM4v7weff) - { - wl_append_word(&wl, &wl, tprintf("Fatal: (W0 + Weff) = 0 causing divided-by-zero.\n")); - Fatal_Flag = 1; - } - - if (pParam->BSIM4v7dsub < 0.0) - { - wl_append_word(&wl, &wl, tprintf("Fatal: Dsub = %g is negative.\n", pParam->BSIM4v7dsub)); - Fatal_Flag = 1; - } - if (pParam->BSIM4v7b1 == -pParam->BSIM4v7weff) - { - wl_append_word(&wl, &wl, tprintf("Fatal: (B1 + Weff) = 0 causing divided-by-zero.\n")); - Fatal_Flag = 1; - } - if (here->BSIM4v7u0temp <= 0.0) - { - wl_append_word(&wl, &wl, tprintf("Fatal: u0 at current temperature = %g is not positive.\n", - here->BSIM4v7u0temp)); - Fatal_Flag = 1; - } - - if (pParam->BSIM4v7delta < 0.0) - { - wl_append_word(&wl, &wl, tprintf("Fatal: Delta = %g is less than zero.\n", pParam->BSIM4v7delta)); - Fatal_Flag = 1; - } - - if (here->BSIM4v7vsattemp <= 0.0) - { - wl_append_word(&wl, &wl, tprintf("Fatal: Vsat at current temperature = %g is not positive.\n", - here->BSIM4v7vsattemp)); - Fatal_Flag = 1; - } - - if (pParam->BSIM4v7pclm <= 0.0) - { - wl_append_word(&wl, &wl, tprintf("Fatal: Pclm = %g is not positive.\n", pParam->BSIM4v7pclm)); - Fatal_Flag = 1; - } - - if (pParam->BSIM4v7drout < 0.0) - { - wl_append_word(&wl, &wl, tprintf("Fatal: Drout = %g is negative.\n", pParam->BSIM4v7drout)); - Fatal_Flag = 1; - } - - if (here->BSIM4v7m <= 0.0) - { - wl_append_word(&wl, &wl, tprintf("Fatal: multiplier = %g is not positive.\n", here->BSIM4v7m)); - Fatal_Flag = 1; - } - if (here->BSIM4v7nf < 1.0) - { - wl_append_word(&wl, &wl, tprintf("Fatal: Number of finger = %g is smaller than one.\n", here->BSIM4v7nf)); - Fatal_Flag = 1; - } - - if ((here->BSIM4v7sa > 0.0) && (here->BSIM4v7sb > 0.0) && - ((here->BSIM4v7nf == 1.0) || ((here->BSIM4v7nf > 1.0) && (here->BSIM4v7sd > 0.0)))) - { - if (model->BSIM4v7saref <= 0.0) - { - wl_append_word(&wl, &wl, tprintf("Fatal: SAref = %g is not positive.\n", model->BSIM4v7saref)); - Fatal_Flag = 1; - } - if (model->BSIM4v7sbref <= 0.0) - { - wl_append_word(&wl, &wl, tprintf("Fatal: SBref = %g is not positive.\n", model->BSIM4v7sbref)); - Fatal_Flag = 1; - } - } - - if ((here->BSIM4v7l + model->BSIM4v7xl) <= model->BSIM4v7xgl) - { - wl_append_word(&wl, &wl, tprintf("Fatal: The parameter xgl must be smaller than Ldrawn+XL.\n")); - Fatal_Flag = 1; - } - if (here->BSIM4v7ngcon < 1.0) - { - wl_append_word(&wl, &wl, tprintf("Fatal: The parameter ngcon cannot be smaller than one.\n")); - Fatal_Flag = 1; - } - if ((here->BSIM4v7ngcon != 1.0) && (here->BSIM4v7ngcon != 2.0)) - { - here->BSIM4v7ngcon = 1.0; - wl_append_word(&wl, &wl, tprintf("Warning: Ngcon must be equal to one or two; reset to 1.0.\n")); - } - - if (model->BSIM4v7gbmin < 1.0e-20) - { - wl_append_word(&wl, &wl, tprintf("Warning: Gbmin = %g is too small.\n", model->BSIM4v7gbmin)); - } - - /* Check saturation parameters */ - if (pParam->BSIM4v7fprout < 0.0) - { - wl_append_word(&wl, &wl, tprintf("Fatal: fprout = %g is negative.\n", pParam->BSIM4v7fprout)); - Fatal_Flag = 1; - } - if (pParam->BSIM4v7pdits < 0.0) - { - wl_append_word(&wl, &wl, tprintf("Fatal: pdits = %g is negative.\n", pParam->BSIM4v7pdits)); - Fatal_Flag = 1; - } - if (model->BSIM4v7pditsl < 0.0) - { - wl_append_word(&wl, &wl, tprintf("Fatal: pditsl = %g is negative.\n", model->BSIM4v7pditsl)); - Fatal_Flag = 1; - } - - /* Check gate current parameters */ - if (model->BSIM4v7igbMod) { - if (pParam->BSIM4v7nigbinv <= 0.0) - { - wl_append_word(&wl, &wl, tprintf("Fatal: nigbinv = %g is non-positive.\n", pParam->BSIM4v7nigbinv)); - Fatal_Flag = 1; - } - if (pParam->BSIM4v7nigbacc <= 0.0) - { - wl_append_word(&wl, &wl, tprintf("Fatal: nigbacc = %g is non-positive.\n", pParam->BSIM4v7nigbacc)); - Fatal_Flag = 1; - } - } - if (model->BSIM4v7igcMod) { - if (pParam->BSIM4v7nigc <= 0.0) - { - wl_append_word(&wl, &wl, tprintf("Fatal: nigc = %g is non-positive.\n", pParam->BSIM4v7nigc)); - Fatal_Flag = 1; - } - if (pParam->BSIM4v7poxedge <= 0.0) - { - wl_append_word(&wl, &wl, tprintf("Fatal: poxedge = %g is non-positive.\n", pParam->BSIM4v7poxedge)); - Fatal_Flag = 1; - } - if (pParam->BSIM4v7pigcd <= 0.0) - { - wl_append_word(&wl, &wl, tprintf("Fatal: pigcd = %g is non-positive.\n", pParam->BSIM4v7pigcd)); - Fatal_Flag = 1; - } - } - - /* Check capacitance parameters */ - if (pParam->BSIM4v7clc < 0.0) - { - wl_append_word(&wl, &wl, tprintf("Fatal: Clc = %g is negative.\n", pParam->BSIM4v7clc)); - Fatal_Flag = 1; - } - - /* Check overlap capacitance parameters */ - if (pParam->BSIM4v7ckappas < 0.02) - { - wl_append_word(&wl, &wl, tprintf("Warning: ckappas = %g is too small.\n", pParam->BSIM4v7ckappas)); - pParam->BSIM4v7ckappas = 0.02; - } - if (pParam->BSIM4v7ckappad < 0.02) - { - wl_append_word(&wl, &wl, tprintf("Warning: ckappad = %g is too small.\n", pParam->BSIM4v7ckappad)); - pParam->BSIM4v7ckappad = 0.02; - } - - if (model->BSIM4v7vtss < 0.0) - { - wl_append_word(&wl, &wl, tprintf("Fatal: Vtss = %g is negative.\n", - model->BSIM4v7vtss)); - Fatal_Flag = 1; - } - if (model->BSIM4v7vtsd < 0.0) - { - wl_append_word(&wl, &wl, tprintf("Fatal: Vtsd = %g is negative.\n", - model->BSIM4v7vtsd)); - Fatal_Flag = 1; - } - if (model->BSIM4v7vtssws < 0.0) - { - wl_append_word(&wl, &wl, tprintf("Fatal: Vtssws = %g is negative.\n", - model->BSIM4v7vtssws)); - Fatal_Flag = 1; - } - if (model->BSIM4v7vtsswd < 0.0) - { - wl_append_word(&wl, &wl, tprintf("Fatal: Vtsswd = %g is negative.\n", - model->BSIM4v7vtsswd)); - Fatal_Flag = 1; - } - if (model->BSIM4v7vtsswgs < 0.0) - { - wl_append_word(&wl, &wl, tprintf("Fatal: Vtsswgs = %g is negative.\n", - model->BSIM4v7vtsswgs)); - Fatal_Flag = 1; - } - if (model->BSIM4v7vtsswgd < 0.0) - { - wl_append_word(&wl, &wl, tprintf("Fatal: Vtsswgd = %g is negative.\n", - model->BSIM4v7vtsswgd)); - Fatal_Flag = 1; - } - - - if (model->BSIM4v7paramChk == 1) - { - /* Check L and W parameters */ - if (pParam->BSIM4v7leff <= 1.0e-9) - { - wl_append_word(&wl, &wl, tprintf("Warning: Leff = %g <= 1.0e-9. Recommended Leff >= 1e-8 \n", - pParam->BSIM4v7leff)); - } - - if (pParam->BSIM4v7leffCV <= 1.0e-9) - { - wl_append_word(&wl, &wl, tprintf("Warning: Leff for CV = %g <= 1.0e-9. Recommended LeffCV >=1e-8 \n", - pParam->BSIM4v7leffCV)); - } - - if (pParam->BSIM4v7weff <= 1.0e-9) - { - wl_append_word(&wl, &wl, tprintf("Warning: Weff = %g <= 1.0e-9. Recommended Weff >=1e-7 \n", - pParam->BSIM4v7weff)); - } - - if (pParam->BSIM4v7weffCV <= 1.0e-9) - { - wl_append_word(&wl, &wl, tprintf("Warning: Weff for CV = %g <= 1.0e-9. Recommended WeffCV >= 1e-7 \n", - pParam->BSIM4v7weffCV)); - } - - /* Check threshold voltage parameters */ - if (model->BSIM4v7toxe < 1.0e-10) - { - wl_append_word(&wl, &wl, tprintf("Warning: Toxe = %g is less than 1A. Recommended Toxe >= 5A\n", model->BSIM4v7toxe)); - } - if (model->BSIM4v7toxp < 1.0e-10) - { - wl_append_word(&wl, &wl, tprintf("Warning: Toxp = %g is less than 1A. Recommended Toxp >= 5A\n", model->BSIM4v7toxp)); - } - if (model->BSIM4v7toxm < 1.0e-10) - { - wl_append_word(&wl, &wl, tprintf("Warning: Toxm = %g is less than 1A. Recommended Toxm >= 5A\n", model->BSIM4v7toxm)); - } - - if (pParam->BSIM4v7ndep <= 1.0e12) - { - wl_append_word(&wl, &wl, tprintf("Warning: Ndep = %g may be too small.\n", - pParam->BSIM4v7ndep)); - } - else if (pParam->BSIM4v7ndep >= 1.0e21) - { - wl_append_word(&wl, &wl, tprintf("Warning: Ndep = %g may be too large.\n", - pParam->BSIM4v7ndep)); - } - - if (pParam->BSIM4v7nsub <= 1.0e14) - { - wl_append_word(&wl, &wl, tprintf("Warning: Nsub = %g may be too small.\n", - pParam->BSIM4v7nsub)); - } - else if (pParam->BSIM4v7nsub >= 1.0e21) - { - wl_append_word(&wl, &wl, tprintf("Warning: Nsub = %g may be too large.\n", - pParam->BSIM4v7nsub)); - } - - if ((pParam->BSIM4v7ngate > 0.0) && - (pParam->BSIM4v7ngate <= 1.e18)) - { - wl_append_word(&wl, &wl, tprintf("Warning: Ngate = %g is less than 1.E18cm^-3.\n", - pParam->BSIM4v7ngate)); - } - - if (pParam->BSIM4v7dvt0 < 0.0) - { - wl_append_word(&wl, &wl, tprintf("Warning: Dvt0 = %g is negative.\n", pParam->BSIM4v7dvt0)); - } - - if (fabs(1.0e-8 / (pParam->BSIM4v7w0 + pParam->BSIM4v7weff)) > 10.0) - { - wl_append_word(&wl, &wl, tprintf("Warning: (W0 + Weff) may be too small.\n")); - } - - /* Check subthreshold parameters */ - if (pParam->BSIM4v7nfactor < 0.0) - { - wl_append_word(&wl, &wl, tprintf("Warning: Nfactor = %g is negative.\n", pParam->BSIM4v7nfactor)); - } - if (pParam->BSIM4v7cdsc < 0.0) - { - wl_append_word(&wl, &wl, tprintf("Warning: Cdsc = %g is negative.\n", pParam->BSIM4v7cdsc)); - } - if (pParam->BSIM4v7cdscd < 0.0) - { - wl_append_word(&wl, &wl, tprintf("Warning: Cdscd = %g is negative.\n", pParam->BSIM4v7cdscd)); - } - /* Check DIBL parameters */ - if (here->BSIM4v7eta0 < 0.0) - { - wl_append_word(&wl, &wl, tprintf("Warning: Eta0 = %g is negative.\n", here->BSIM4v7eta0)); - } - - /* Check Abulk parameters */ - if (fabs(1.0e-8 / (pParam->BSIM4v7b1 + pParam->BSIM4v7weff)) > 10.0) - { - wl_append_word(&wl, &wl, tprintf("Warning: (B1 + Weff) may be too small.\n")); - } - - - /* Check Saturation parameters */ - if (pParam->BSIM4v7a2 < 0.01) - { - wl_append_word(&wl, &wl, tprintf("Warning: A2 = %g is too small. Set to 0.01.\n", - pParam->BSIM4v7a2)); - pParam->BSIM4v7a2 = 0.01; - } - else if (pParam->BSIM4v7a2 > 1.0) - { - wl_append_word(&wl, &wl, tprintf("Warning: A2 = %g is larger than 1. A2 is set to 1 and A1 is set to 0.\n", - pParam->BSIM4v7a2)); - pParam->BSIM4v7a2 = 1.0; - pParam->BSIM4v7a1 = 0.0; - } - - if (pParam->BSIM4v7prwg < 0.0) - { - wl_append_word(&wl, &wl, tprintf("Warning: Prwg = %g is negative. Set to zero.\n", - pParam->BSIM4v7prwg)); - pParam->BSIM4v7prwg = 0.0; - } - - if (pParam->BSIM4v7rdsw < 0.0) - { - wl_append_word(&wl, &wl, tprintf("Warning: Rdsw = %g is negative. Set to zero.\n", - pParam->BSIM4v7rdsw)); - pParam->BSIM4v7rdsw = 0.0; - pParam->BSIM4v7rds0 = 0.0; - } - - if (pParam->BSIM4v7rds0 < 0.0) - { - wl_append_word(&wl, &wl, tprintf("Warning: Rds at current temperature = %g is negative. Set to zero.\n", - pParam->BSIM4v7rds0)); - pParam->BSIM4v7rds0 = 0.0; - } - - if (pParam->BSIM4v7rdswmin < 0.0) - { - wl_append_word(&wl, &wl, tprintf("Warning: Rdswmin at current temperature = %g is negative. Set to zero.\n", - pParam->BSIM4v7rdswmin)); - pParam->BSIM4v7rdswmin = 0.0; - } - - if (pParam->BSIM4v7pscbe2 <= 0.0) - { - wl_append_word(&wl, &wl, tprintf("Warning: Pscbe2 = %g is not positive.\n", pParam->BSIM4v7pscbe2)); - } - - if (pParam->BSIM4v7vsattemp < 1.0e3) - { - wl_append_word(&wl, &wl, tprintf("Warning: Vsat at current temperature = %g may be too small.\n", pParam->BSIM4v7vsattemp)); - } - - if ((model->BSIM4v7lambdaGiven) && (pParam->BSIM4v7lambda > 0.0)) - { - if (pParam->BSIM4v7lambda > 1.0e-9) - { - wl_append_word(&wl, &wl, tprintf("Warning: Lambda = %g may be too large.\n", pParam->BSIM4v7lambda)); - } - } - - if ((model->BSIM4v7vtlGiven) && (pParam->BSIM4v7vtl > 0.0)) - { - if (pParam->BSIM4v7vtl < 6.0e4) - { - wl_append_word(&wl, &wl, tprintf("Warning: Thermal velocity vtl = %g may be too small.\n", pParam->BSIM4v7vtl)); - } - - if (pParam->BSIM4v7xn < 3.0) - { - wl_append_word(&wl, &wl, tprintf("Warning: back scattering coeff xn = %g is too small. Reset to 3.0 \n", pParam->BSIM4v7xn)); - pParam->BSIM4v7xn = 3.0; - } - - if (model->BSIM4v7lc < 0.0) - { - wl_append_word(&wl, &wl, tprintf("Warning: back scattering coeff lc = %g is too small. Reset to 0.0\n", model->BSIM4v7lc)); - pParam->BSIM4v7lc = 0.0; - } - } - - if (pParam->BSIM4v7pdibl1 < 0.0) - { - wl_append_word(&wl, &wl, tprintf("Warning: Pdibl1 = %g is negative.\n", pParam->BSIM4v7pdibl1)); - } - } - - if (pParam->BSIM4v7pdibl2 < 0.0) - { - wl_append_word(&wl, &wl, tprintf("Warning: Pdibl2 = %g is negative.\n", pParam->BSIM4v7pdibl2)); - } - - /* Check stress effect parameters */ - if ((here->BSIM4v7sa > 0.0) && (here->BSIM4v7sb > 0.0) && - ((here->BSIM4v7nf == 1.0) || ((here->BSIM4v7nf > 1.0) && (here->BSIM4v7sd > 0.0)))) - { - if (model->BSIM4v7lodk2 <= 0.0) - { - wl_append_word(&wl, &wl, tprintf("Warning: LODK2 = %g is not positive.\n", model->BSIM4v7lodk2)); - } - if (model->BSIM4v7lodeta0 <= 0.0) - { - wl_append_word(&wl, &wl, tprintf("Warning: LODETA0 = %g is not positive.\n", model->BSIM4v7lodeta0)); - } - } - - /* Check gate resistance parameters */ - if (here->BSIM4v7rgateMod == 1) - { - if (model->BSIM4v7rshg <= 0.0) - wl_append_word(&wl, &wl, tprintf("Warning: rshg should be positive for rgateMod = 1.\n")); - } - else if (here->BSIM4v7rgateMod == 2) - { - if (model->BSIM4v7rshg <= 0.0) - wl_append_word(&wl, &wl, tprintf("Warning: rshg <= 0.0 for rgateMod = 2.\n")); - else if (pParam->BSIM4v7xrcrg1 <= 0.0) - wl_append_word(&wl, &wl, tprintf("Warning: xrcrg1 <= 0.0 for rgateMod = 2.\n")); - } - if (here->BSIM4v7rgateMod == 3) - { - if (model->BSIM4v7rshg <= 0.0) - wl_append_word(&wl, &wl, tprintf("Warning: rshg should be positive for rgateMod = 3.\n")); - else if (pParam->BSIM4v7xrcrg1 <= 0.0) - wl_append_word(&wl, &wl, tprintf("Warning: xrcrg1 should be positive for rgateMod = 3.\n")); - } - - /* Check capacitance parameters */ - if (pParam->BSIM4v7noff < 0.1) - { - wl_append_word(&wl, &wl, tprintf("Warning: Noff = %g is too small.\n", pParam->BSIM4v7noff)); - } - - if (pParam->BSIM4v7voffcv < -0.5) - { - wl_append_word(&wl, &wl, tprintf("Warning: Voffcv = %g is too small.\n", pParam->BSIM4v7voffcv)); - } - - if (pParam->BSIM4v7moin < 5.0) - { - wl_append_word(&wl, &wl, tprintf("Warning: Moin = %g is too small.\n", pParam->BSIM4v7moin)); - } - if (pParam->BSIM4v7moin > 25.0) - { - wl_append_word(&wl, &wl, tprintf("Warning: Moin = %g is too large.\n", pParam->BSIM4v7moin)); - } - if (model->BSIM4v7capMod == 2) { - if (pParam->BSIM4v7acde < 0.1) - { - wl_append_word(&wl, &wl, tprintf("Warning: Acde = %g is too small.\n", pParam->BSIM4v7acde)); - } - if (pParam->BSIM4v7acde > 1.6) - { - wl_append_word(&wl, &wl, tprintf("Warning: Acde = %g is too large.\n", pParam->BSIM4v7acde)); - } - } - - /* Check overlap capacitance parameters */ - if (model->BSIM4v7cgdo < 0.0) - { - wl_append_word(&wl, &wl, tprintf("Warning: cgdo = %g is negative. Set to zero.\n", model->BSIM4v7cgdo)); - model->BSIM4v7cgdo = 0.0; - } - if (model->BSIM4v7cgso < 0.0) - { - wl_append_word(&wl, &wl, tprintf("Warning: cgso = %g is negative. Set to zero.\n", model->BSIM4v7cgso)); - model->BSIM4v7cgso = 0.0; - } - if (model->BSIM4v7cgbo < 0.0) - { - wl_append_word(&wl, &wl, tprintf("Warning: cgbo = %g is negative. Set to zero.\n", model->BSIM4v7cgbo)); - model->BSIM4v7cgbo = 0.0; - } - /* v4.7 */ - if (model->BSIM4v7tnoiMod == 1 || model->BSIM4v7tnoiMod == 2) { - if (model->BSIM4v7tnoia < 0.0) - { - wl_append_word(&wl, &wl, tprintf("Warning: tnoia = %g is negative. Set to zero.\n", model->BSIM4v7tnoia)); - model->BSIM4v7tnoia = 0.0; - } - if (model->BSIM4v7tnoib < 0.0) - { - wl_append_word(&wl, &wl, tprintf("Warning: tnoib = %g is negative. Set to zero.\n", model->BSIM4v7tnoib)); - model->BSIM4v7tnoib = 0.0; - } - - if (model->BSIM4v7rnoia < 0.0) - { - wl_append_word(&wl, &wl, tprintf("Warning: rnoia = %g is negative. Set to zero.\n", model->BSIM4v7rnoia)); - model->BSIM4v7rnoia = 0.0; - } - if (model->BSIM4v7rnoib < 0.0) - { - wl_append_word(&wl, &wl, tprintf("Warning: rnoib = %g is negative. Set to zero.\n", model->BSIM4v7rnoib)); - model->BSIM4v7rnoib = 0.0; - } - } - - /* v4.7 */ - if (model->BSIM4v7tnoiMod == 2) { - if (model->BSIM4v7tnoic < 0.0) { - wl_append_word(&wl, &wl, tprintf("Warning: tnoic = %g is negative. Set to zero.\n", model->BSIM4v7tnoic)); - model->BSIM4v7tnoic = 0.0; - } - if (model->BSIM4v7rnoic < 0.0) { - wl_append_word(&wl, &wl, tprintf("Warning: rnoic = %g is negative. Set to zero.\n", model->BSIM4v7rnoic)); - model->BSIM4v7rnoic = 0.0; - } - } - - /* Limits of Njs and Njd modified in BSIM4v7.7 */ - if (model->BSIM4v7SjctEmissionCoeff < 0.1) { - wl_append_word(&wl, &wl, tprintf("Warning: Njs = %g is less than 0.1. Setting Njs to 0.1.\n", model->BSIM4v7SjctEmissionCoeff)); - model->BSIM4v7SjctEmissionCoeff = 0.1; - } - else if (model->BSIM4v7SjctEmissionCoeff < 0.7) { - wl_append_word(&wl, &wl, tprintf("Warning: Njs = %g is less than 0.7.\n", model->BSIM4v7SjctEmissionCoeff)); - } - if (model->BSIM4v7DjctEmissionCoeff < 0.1) - { - wl_append_word(&wl, &wl, tprintf("Warning: Njd = %g is less than 0.1. Setting Njd to 0.1.\n", model->BSIM4v7DjctEmissionCoeff)); - model->BSIM4v7DjctEmissionCoeff = 0.1; - } - else if (model->BSIM4v7DjctEmissionCoeff < 0.7) { - wl_append_word(&wl, &wl, tprintf("Warning: Njd = %g is less than 0.7.\n", model->BSIM4v7DjctEmissionCoeff)); - } - - if (model->BSIM4v7njtsstemp < 0.0) { - wl_append_word(&wl, &wl, tprintf("Warning: Njts = %g is negative at temperature = %g.\n", - model->BSIM4v7njtsstemp, ckt->CKTtemp)); - } - if (model->BSIM4v7njtsswstemp < 0.0) { - wl_append_word(&wl, &wl, tprintf("Warning: Njtssw = %g is negative at temperature = %g.\n", - model->BSIM4v7njtsswstemp, ckt->CKTtemp)); - } - if (model->BSIM4v7njtsswgstemp < 0.0) { - wl_append_word(&wl, &wl, tprintf("Warning: Njtsswg = %g is negative at temperature = %g.\n", - model->BSIM4v7njtsswgstemp, ckt->CKTtemp)); - } - - if (model->BSIM4v7njtsdGiven && model->BSIM4v7njtsdtemp < 0.0) - { - wl_append_word(&wl, &wl, tprintf("Warning: Njtsd = %g is negative at temperature = %g.\n", - model->BSIM4v7njtsdtemp, ckt->CKTtemp)); - } - if (model->BSIM4v7njtsswdGiven && model->BSIM4v7njtsswdtemp < 0.0) - { - wl_append_word(&wl, &wl, tprintf("Warning: Njtsswd = %g is negative at temperature = %g.\n", - model->BSIM4v7njtsswdtemp, ckt->CKTtemp)); - } - if (model->BSIM4v7njtsswgdGiven && model->BSIM4v7njtsswgdtemp < 0.0) - { - wl_append_word(&wl, &wl, tprintf("Warning: Njtsswgd = %g is negative at temperature = %g.\n", - model->BSIM4v7njtsswgdtemp, ckt->CKTtemp)); - } - - if (model->BSIM4v7ntnoi < 0.0) - { - wl_append_word(&wl, &wl, tprintf("Warning: ntnoi = %g is negative. Set to zero.\n", model->BSIM4v7ntnoi)); - model->BSIM4v7ntnoi = 0.0; - } - - /* diode model */ - if (model->BSIM4v7SbulkJctBotGradingCoeff >= 0.99) - { - wl_append_word(&wl, &wl, tprintf("Warning: MJS = %g is too big. Set to 0.99.\n", model->BSIM4v7SbulkJctBotGradingCoeff)); - model->BSIM4v7SbulkJctBotGradingCoeff = 0.99; - } - if (model->BSIM4v7SbulkJctSideGradingCoeff >= 0.99) - { - wl_append_word(&wl, &wl, tprintf("Warning: MJSWS = %g is too big. Set to 0.99.\n", model->BSIM4v7SbulkJctSideGradingCoeff)); - model->BSIM4v7SbulkJctSideGradingCoeff = 0.99; - } - if (model->BSIM4v7SbulkJctGateSideGradingCoeff >= 0.99) - { - wl_append_word(&wl, &wl, tprintf("Warning: MJSWGS = %g is too big. Set to 0.99.\n", model->BSIM4v7SbulkJctGateSideGradingCoeff)); - model->BSIM4v7SbulkJctGateSideGradingCoeff = 0.99; - } - - if (model->BSIM4v7DbulkJctBotGradingCoeff >= 0.99) - { - wl_append_word(&wl, &wl, tprintf("Warning: MJD = %g is too big. Set to 0.99.\n", model->BSIM4v7DbulkJctBotGradingCoeff)); - model->BSIM4v7DbulkJctBotGradingCoeff = 0.99; - } - if (model->BSIM4v7DbulkJctSideGradingCoeff >= 0.99) - { - wl_append_word(&wl, &wl, tprintf("Warning: MJSWD = %g is too big. Set to 0.99.\n", model->BSIM4v7DbulkJctSideGradingCoeff)); - model->BSIM4v7DbulkJctSideGradingCoeff = 0.99; - } - if (model->BSIM4v7DbulkJctGateSideGradingCoeff >= 0.99) - { - wl_append_word(&wl, &wl, tprintf("Warning: MJSWGD = %g is too big. Set to 0.99.\n", model->BSIM4v7DbulkJctGateSideGradingCoeff)); - model->BSIM4v7DbulkJctGateSideGradingCoeff = 0.99; - } - if (model->BSIM4v7wpemod == 1) - { - if (model->BSIM4v7scref <= 0.0) - { - wl_append_word(&wl, &wl, tprintf("Warning: SCREF = %g is not positive. Set to 1e-6.\n", model->BSIM4v7scref)); - model->BSIM4v7scref = 1e-6; - } - if (here->BSIM4v7sca < 0.0) - { - wl_append_word(&wl, &wl, tprintf("Warning: SCA = %g is negative. Set to 0.0.\n", here->BSIM4v7sca)); - here->BSIM4v7sca = 0.0; - } - if (here->BSIM4v7scb < 0.0) - { - wl_append_word(&wl, &wl, tprintf("Warning: SCB = %g is negative. Set to 0.0.\n", here->BSIM4v7scb)); - here->BSIM4v7scb = 0.0; - } - if (here->BSIM4v7scc < 0.0) - { - wl_append_word(&wl, &wl, tprintf("Warning: SCC = %g is negative. Set to 0.0.\n", here->BSIM4v7scc)); - here->BSIM4v7scc = 0.0; - } - if (here->BSIM4v7sc < 0.0) - { - wl_append_word(&wl, &wl, tprintf("Warning: SC = %g is negative. Set to 0.0.\n", here->BSIM4v7sc)); - here->BSIM4v7sc = 0.0; - } - } - - if (wlstart->wl_next) { - if ((fplog = fopen("bsim4v7.out", "w")) != NULL) { - while (wlstart) { - fprintf(fplog, "%s", wlstart->wl_word); - fprintf(stderr, "%s", wlstart->wl_word); - wlstart = wlstart->wl_next; - } - fclose(fplog); - } - else { - while (wlstart) { - fprintf(stderr, "%s", wlstart->wl_word); - wlstart = wlstart->wl_next; - } - } - } - - wl_free(wlstart); - - if ((strcmp(model->BSIM4v7version, "4.7.0")) && (strncmp(model->BSIM4v7version, "4.70", 4)) && (strncmp(model->BSIM4v7version, "4.7", 3))) - { - printf("Warning: This model is BSIM4.7.0; you specified a wrong version number '%s'.\n", model->BSIM4v7version); - } - - return(Fatal_Flag); -} - diff --git a/src/spicelib/devices/bsim4v7/b4v7cvtest.c b/src/spicelib/devices/bsim4v7/b4v7cvtest.c deleted file mode 100644 index 8e20f716f..000000000 --- a/src/spicelib/devices/bsim4v7/b4v7cvtest.c +++ /dev/null @@ -1,200 +0,0 @@ -/**** BSIM4.7.0 Released by Darsen Lu 04/08/2011 ****/ - -/********** - * Copyright 2006 Regents of the University of California. All rights reserved. - * File: b4cvtest.c of BSIM4.7.0. - * Author: 2000 Weidong Liu - * Authors: 2001- Xuemei Xi, Mohan Dunga, Ali Niknejad, Chenming Hu. - * Authors: 2006- Mohan Dunga, Ali Niknejad, Chenming Hu - * Authors: 2007- Mohan Dunga, Wenwei Yang, Ali Niknejad, Chenming Hu - * Project Director: Prof. Chenming Hu. - * Modified by Xuemei Xi, 04/06/2001. - * Modified by Xuemei Xi, 10/05/2001. - * Modified by Xuemei Xi, 05/09/2003. - **********/ - -#include "ngspice/ngspice.h" -#include "ngspice/cktdefs.h" -#include "bsim4v7def.h" -#include "ngspice/trandefs.h" -#include "ngspice/const.h" -#include "ngspice/devdefs.h" -#include "ngspice/sperror.h" -#include "ngspice/suffix.h" - - -int -BSIM4v7convTest( -GENmodel *inModel, -CKTcircuit *ckt) -{ -BSIM4v7model *model = (BSIM4v7model*)inModel; -BSIM4v7instance *here; -double delvbd, delvbs, delvds, delvgd, delvgs; -double delvdbd, delvsbs; -double delvbd_jct, delvbs_jct; -double vds, vgs, vgd, vgdo, vbs, vbd; -double vdbd, vdbs, vsbs; -double cbhat, cdhat, Idtot, Ibtot; -double vses, vdes, vdedo, delvses, delvded, delvdes; -double Isestot, cseshat, Idedtot, cdedhat; -double Igstot, cgshat, Igdtot, cgdhat, Igbtot, cgbhat; -double tol0, tol1, tol2, tol3, tol4, tol5, tol6; - - for (; model != NULL; model = BSIM4v7nextModel(model)) - { for (here = BSIM4v7instances(model); here != NULL ; - here=BSIM4v7nextInstance(here)) - { - vds = model->BSIM4v7type - * (*(ckt->CKTrhsOld + here->BSIM4v7dNodePrime) - - *(ckt->CKTrhsOld + here->BSIM4v7sNodePrime)); - vgs = model->BSIM4v7type - * (*(ckt->CKTrhsOld + here->BSIM4v7gNodePrime) - - *(ckt->CKTrhsOld + here->BSIM4v7sNodePrime)); - vbs = model->BSIM4v7type - * (*(ckt->CKTrhsOld + here->BSIM4v7bNodePrime) - - *(ckt->CKTrhsOld + here->BSIM4v7sNodePrime)); - vdbs = model->BSIM4v7type - * (*(ckt->CKTrhsOld + here->BSIM4v7dbNode) - - *(ckt->CKTrhsOld + here->BSIM4v7sNodePrime)); - vsbs = model->BSIM4v7type - * (*(ckt->CKTrhsOld + here->BSIM4v7sbNode) - - *(ckt->CKTrhsOld + here->BSIM4v7sNodePrime)); - vses = model->BSIM4v7type - * (*(ckt->CKTrhsOld + here->BSIM4v7sNode) - - *(ckt->CKTrhsOld + here->BSIM4v7sNodePrime)); - vdes = model->BSIM4v7type - * (*(ckt->CKTrhsOld + here->BSIM4v7dNode) - - *(ckt->CKTrhsOld + here->BSIM4v7sNodePrime)); - - vgdo = *(ckt->CKTstate0 + here->BSIM4v7vgs) - - *(ckt->CKTstate0 + here->BSIM4v7vds); - vbd = vbs - vds; - vdbd = vdbs - vds; - vgd = vgs - vds; - - delvbd = vbd - *(ckt->CKTstate0 + here->BSIM4v7vbd); - delvdbd = vdbd - *(ckt->CKTstate0 + here->BSIM4v7vdbd); - delvgd = vgd - vgdo; - - delvds = vds - *(ckt->CKTstate0 + here->BSIM4v7vds); - delvgs = vgs - *(ckt->CKTstate0 + here->BSIM4v7vgs); - delvbs = vbs - *(ckt->CKTstate0 + here->BSIM4v7vbs); - delvsbs = vsbs - *(ckt->CKTstate0 + here->BSIM4v7vsbs); - - delvses = vses - (*(ckt->CKTstate0 + here->BSIM4v7vses)); - vdedo = *(ckt->CKTstate0 + here->BSIM4v7vdes) - - *(ckt->CKTstate0 + here->BSIM4v7vds); - delvdes = vdes - *(ckt->CKTstate0 + here->BSIM4v7vdes); - delvded = vdes - vds - vdedo; - - delvbd_jct = (!here->BSIM4v7rbodyMod) ? delvbd : delvdbd; - delvbs_jct = (!here->BSIM4v7rbodyMod) ? delvbs : delvsbs; - - if (here->BSIM4v7mode >= 0) - { Idtot = here->BSIM4v7cd + here->BSIM4v7csub - here->BSIM4v7cbd - + here->BSIM4v7Igidl; - cdhat = Idtot - here->BSIM4v7gbd * delvbd_jct - + (here->BSIM4v7gmbs + here->BSIM4v7gbbs + here->BSIM4v7ggidlb) * delvbs - + (here->BSIM4v7gm + here->BSIM4v7gbgs + here->BSIM4v7ggidlg) * delvgs - + (here->BSIM4v7gds + here->BSIM4v7gbds + here->BSIM4v7ggidld) * delvds; - - Igstot = here->BSIM4v7Igs + here->BSIM4v7Igcs; - cgshat = Igstot + (here->BSIM4v7gIgsg + here->BSIM4v7gIgcsg) * delvgs - + here->BSIM4v7gIgcsd * delvds + here->BSIM4v7gIgcsb * delvbs; - - Igdtot = here->BSIM4v7Igd + here->BSIM4v7Igcd; - cgdhat = Igdtot + here->BSIM4v7gIgdg * delvgd + here->BSIM4v7gIgcdg * delvgs - + here->BSIM4v7gIgcdd * delvds + here->BSIM4v7gIgcdb * delvbs; - - Igbtot = here->BSIM4v7Igb; - cgbhat = here->BSIM4v7Igb + here->BSIM4v7gIgbg * delvgs + here->BSIM4v7gIgbd - * delvds + here->BSIM4v7gIgbb * delvbs; - } - else - { Idtot = here->BSIM4v7cd + here->BSIM4v7cbd - here->BSIM4v7Igidl; /* bugfix */ - cdhat = Idtot + here->BSIM4v7gbd * delvbd_jct + here->BSIM4v7gmbs - * delvbd + here->BSIM4v7gm * delvgd - - (here->BSIM4v7gds + here->BSIM4v7ggidls) * delvds - - here->BSIM4v7ggidlg * delvgs - here->BSIM4v7ggidlb * delvbs; - - Igstot = here->BSIM4v7Igs + here->BSIM4v7Igcd; - cgshat = Igstot + here->BSIM4v7gIgsg * delvgs + here->BSIM4v7gIgcdg * delvgd - - here->BSIM4v7gIgcdd * delvds + here->BSIM4v7gIgcdb * delvbd; - - Igdtot = here->BSIM4v7Igd + here->BSIM4v7Igcs; - cgdhat = Igdtot + (here->BSIM4v7gIgdg + here->BSIM4v7gIgcsg) * delvgd - - here->BSIM4v7gIgcsd * delvds + here->BSIM4v7gIgcsb * delvbd; - - Igbtot = here->BSIM4v7Igb; - cgbhat = here->BSIM4v7Igb + here->BSIM4v7gIgbg * delvgd - here->BSIM4v7gIgbd - * delvds + here->BSIM4v7gIgbb * delvbd; - } - - Isestot = here->BSIM4v7gstot * (*(ckt->CKTstate0 + here->BSIM4v7vses)); - cseshat = Isestot + here->BSIM4v7gstot * delvses - + here->BSIM4v7gstotd * delvds + here->BSIM4v7gstotg * delvgs - + here->BSIM4v7gstotb * delvbs; - - Idedtot = here->BSIM4v7gdtot * vdedo; - cdedhat = Idedtot + here->BSIM4v7gdtot * delvded - + here->BSIM4v7gdtotd * delvds + here->BSIM4v7gdtotg * delvgs - + here->BSIM4v7gdtotb * delvbs; - - /* - * Check convergence - */ - - if ((here->BSIM4v7off == 0) || (!(ckt->CKTmode & MODEINITFIX))) - { tol0 = ckt->CKTreltol * MAX(fabs(cdhat), fabs(Idtot)) - + ckt->CKTabstol; - tol1 = ckt->CKTreltol * MAX(fabs(cseshat), fabs(Isestot)) - + ckt->CKTabstol; - tol2 = ckt->CKTreltol * MAX(fabs(cdedhat), fabs(Idedtot)) - + ckt->CKTabstol; - tol3 = ckt->CKTreltol * MAX(fabs(cgshat), fabs(Igstot)) - + ckt->CKTabstol; - tol4 = ckt->CKTreltol * MAX(fabs(cgdhat), fabs(Igdtot)) - + ckt->CKTabstol; - tol5 = ckt->CKTreltol * MAX(fabs(cgbhat), fabs(Igbtot)) - + ckt->CKTabstol; - - if ((fabs(cdhat - Idtot) >= tol0) || (fabs(cseshat - Isestot) >= tol1) - || (fabs(cdedhat - Idedtot) >= tol2)) - { ckt->CKTnoncon++; - return(OK); - } - - if ((fabs(cgshat - Igstot) >= tol3) || (fabs(cgdhat - Igdtot) >= tol4) - || (fabs(cgbhat - Igbtot) >= tol5)) - { ckt->CKTnoncon++; - return(OK); - } - - Ibtot = here->BSIM4v7cbs + here->BSIM4v7cbd - - here->BSIM4v7Igidl - here->BSIM4v7Igisl - here->BSIM4v7csub; - if (here->BSIM4v7mode >= 0) - { cbhat = Ibtot + here->BSIM4v7gbd * delvbd_jct - + here->BSIM4v7gbs * delvbs_jct - (here->BSIM4v7gbbs + here->BSIM4v7ggidlb) - * delvbs - (here->BSIM4v7gbgs + here->BSIM4v7ggidlg) * delvgs - - (here->BSIM4v7gbds + here->BSIM4v7ggidld) * delvds - - here->BSIM4v7ggislg * delvgd - here->BSIM4v7ggislb* delvbd + here->BSIM4v7ggisls * delvds ; - } - else - { cbhat = Ibtot + here->BSIM4v7gbs * delvbs_jct + here->BSIM4v7gbd - * delvbd_jct - (here->BSIM4v7gbbs + here->BSIM4v7ggislb) * delvbd - - (here->BSIM4v7gbgs + here->BSIM4v7ggislg) * delvgd - + (here->BSIM4v7gbds + here->BSIM4v7ggisld - here->BSIM4v7ggidls) * delvds - - here->BSIM4v7ggidlg * delvgs - here->BSIM4v7ggidlb * delvbs; - } - tol6 = ckt->CKTreltol * MAX(fabs(cbhat), - fabs(Ibtot)) + ckt->CKTabstol; - if (fabs(cbhat - Ibtot) > tol6) - { ckt->CKTnoncon++; - return(OK); - } - } - } - } - return(OK); -} diff --git a/src/spicelib/devices/bsim4v7/b4v7geo.c b/src/spicelib/devices/bsim4v7/b4v7geo.c deleted file mode 100644 index 503c212b9..000000000 --- a/src/spicelib/devices/bsim4v7/b4v7geo.c +++ /dev/null @@ -1,395 +0,0 @@ -/**** BSIM4.7.0 Released by Darsen Lu 04/08/2011 ****/ - -/********** - * Copyright 2006 Regents of the University of California. All rights reserved. - * File: b4geo.c of BSIM4.7.0. - * Author: 2000 Weidong Liu - * Authors: 2001- Xuemei Xi, Mohan Dunga, Ali Niknejad, Chenming Hu. - * Authors: 2006- Mohan Dunga, Ali Niknejad, Chenming Hu - * Authors: 2007- Mohan Dunga, Wenwei Yang, Ali Niknejad, Chenming Hu - * Project Director: Prof. Chenming Hu. - **********/ - -#include "ngspice/ngspice.h" -#include "bsim4v7def.h" - - -/* - * WDLiu: - * This subrutine is a special module to process the geometry dependent - * parasitics for BSIM4v7, which calculates Ps, Pd, As, Ad, and Rs and Rd - * for multi-fingers and varous GEO and RGEO options. - */ - -static int -BSIM4v7NumFingerDiff( -double nf, -int minSD, -double *nuIntD, double *nuEndD, double *nuIntS, double *nuEndS) -{ -int NF; - NF = (int)nf; - if ((NF%2) != 0) - { *nuEndD = *nuEndS = 1.0; - *nuIntD = *nuIntS = 2.0 * MAX((nf - 1.0) / 2.0, 0.0); - } - else - { if (minSD == 1) /* minimize # of source */ - { *nuEndD = 2.0; - *nuIntD = 2.0 * MAX((nf / 2.0 - 1.0), 0.0); - *nuEndS = 0.0; - *nuIntS = nf; - } - else - { *nuEndD = 0.0; - *nuIntD = nf; - *nuEndS = 2.0; - *nuIntS = 2.0 * MAX((nf / 2.0 - 1.0), 0.0); - } - } -return 0; -} - - -int -BSIM4v7PAeffGeo( -double nf, -int geo, int minSD, -double Weffcj, double DMCG, double DMCI, double DMDG, -double *Ps, double *Pd, double *As, double *Ad) -{ -double T0, T1, T2; -double ADiso, ADsha, ADmer, ASiso, ASsha, ASmer; -double PDiso, PDsha, PDmer, PSiso, PSsha, PSmer; -double nuIntD = 0.0, nuEndD = 0.0, nuIntS = 0.0, nuEndS = 0.0; - - if (geo < 9) /* For geo = 9 and 10, the numbers of S/D diffusions already known */ - BSIM4v7NumFingerDiff(nf, minSD, &nuIntD, &nuEndD, &nuIntS, &nuEndS); - - T0 = DMCG + DMCI; - T1 = DMCG + DMCG; - T2 = DMDG + DMDG; - - PSiso = PDiso = T0 + T0 + Weffcj; - PSsha = PDsha = T1; - PSmer = PDmer = T2; - - ASiso = ADiso = T0 * Weffcj; - ASsha = ADsha = DMCG * Weffcj; - ASmer = ADmer = DMDG * Weffcj; - - switch(geo) - { case 0: - *Ps = nuEndS * PSiso + nuIntS * PSsha; - *Pd = nuEndD * PDiso + nuIntD * PDsha; - *As = nuEndS * ASiso + nuIntS * ASsha; - *Ad = nuEndD * ADiso + nuIntD * ADsha; - break; - case 1: - *Ps = nuEndS * PSiso + nuIntS * PSsha; - *Pd = (nuEndD + nuIntD) * PDsha; - *As = nuEndS * ASiso + nuIntS * ASsha; - *Ad = (nuEndD + nuIntD) * ADsha; - break; - case 2: - *Ps = (nuEndS + nuIntS) * PSsha; - *Pd = nuEndD * PDiso + nuIntD * PDsha; - *As = (nuEndS + nuIntS) * ASsha; - *Ad = nuEndD * ADiso + nuIntD * ADsha; - break; - case 3: - *Ps = (nuEndS + nuIntS) * PSsha; - *Pd = (nuEndD + nuIntD) * PDsha; - *As = (nuEndS + nuIntS) * ASsha; - *Ad = (nuEndD + nuIntD) * ADsha; - break; - case 4: - *Ps = nuEndS * PSiso + nuIntS * PSsha; - *Pd = nuEndD * PDmer + nuIntD * PDsha; - *As = nuEndS * ASiso + nuIntS * ASsha; - *Ad = nuEndD * ADmer + nuIntD * ADsha; - break; - case 5: - *Ps = (nuEndS + nuIntS) * PSsha; - *Pd = nuEndD * PDmer + nuIntD * PDsha; - *As = (nuEndS + nuIntS) * ASsha; - *Ad = nuEndD * ADmer + nuIntD * ADsha; - break; - case 6: - *Ps = nuEndS * PSmer + nuIntS * PSsha; - *Pd = nuEndD * PDiso + nuIntD * PDsha; - *As = nuEndS * ASmer + nuIntS * ASsha; - *Ad = nuEndD * ADiso + nuIntD * ADsha; - break; - case 7: - *Ps = nuEndS * PSmer + nuIntS * PSsha; - *Pd = (nuEndD + nuIntD) * PDsha; - *As = nuEndS * ASmer + nuIntS * ASsha; - *Ad = (nuEndD + nuIntD) * ADsha; - break; - case 8: - *Ps = nuEndS * PSmer + nuIntS * PSsha; - *Pd = nuEndD * PDmer + nuIntD * PDsha; - *As = nuEndS * ASmer + nuIntS * ASsha; - *Ad = nuEndD * ADmer + nuIntD * ADsha; - break; - case 9: /* geo = 9 and 10 happen only when nf = even */ - *Ps = PSiso + (nf - 1.0) * PSsha; - *Pd = nf * PDsha; - *As = ASiso + (nf - 1.0) * ASsha; - *Ad = nf * ADsha; - break; - case 10: - *Ps = nf * PSsha; - *Pd = PDiso + (nf - 1.0) * PDsha; - *As = nf * ASsha; - *Ad = ADiso + (nf - 1.0) * ADsha; - break; - default: - printf("Warning: Specified GEO = %d not matched\n", geo); - } -return 0; -} - - -int -BSIM4v7RdseffGeo( -double nf, -int geo, int rgeo, int minSD, -double Weffcj, double Rsh, double DMCG, double DMCI, double DMDG, -int Type, -double *Rtot) -{ -double Rint=0.0, Rend = 0.0; -double nuIntD = 0.0, nuEndD = 0.0, nuIntS = 0.0, nuEndS = 0.0; - - if (geo < 9) /* since geo = 9 and 10 only happen when nf = even */ - { BSIM4v7NumFingerDiff(nf, minSD, &nuIntD, &nuEndD, &nuIntS, &nuEndS); - - /* Internal S/D resistance -- assume shared S or D and all wide contacts */ - if (Type == 1) - { if (nuIntS == 0.0) - Rint = 0.0; - else - Rint = Rsh * DMCG / ( Weffcj * nuIntS); - } - else - { if (nuIntD == 0.0) - Rint = 0.0; - else - Rint = Rsh * DMCG / ( Weffcj * nuIntD); - } - } - - /* End S/D resistance -- geo dependent */ - switch(geo) - { case 0: - if (Type == 1) BSIM4v7RdsEndIso(Weffcj, Rsh, DMCG, DMCI, DMDG, - nuEndS, rgeo, 1, &Rend); - else BSIM4v7RdsEndIso(Weffcj, Rsh, DMCG, DMCI, DMDG, - nuEndD, rgeo, 0, &Rend); - break; - case 1: - if (Type == 1) BSIM4v7RdsEndIso(Weffcj, Rsh, DMCG, DMCI, DMDG, - nuEndS, rgeo, 1, &Rend); - else BSIM4v7RdsEndSha(Weffcj, Rsh, DMCG, DMCI, DMDG, - nuEndD, rgeo, 0, &Rend); - break; - case 2: - if (Type == 1) BSIM4v7RdsEndSha(Weffcj, Rsh, DMCG, DMCI, DMDG, - nuEndS, rgeo, 1, &Rend); - else BSIM4v7RdsEndIso(Weffcj, Rsh, DMCG, DMCI, DMDG, - nuEndD, rgeo, 0, &Rend); - break; - case 3: - if (Type == 1) BSIM4v7RdsEndSha(Weffcj, Rsh, DMCG, DMCI, DMDG, - nuEndS, rgeo, 1, &Rend); - else BSIM4v7RdsEndSha(Weffcj, Rsh, DMCG, DMCI, DMDG, - nuEndD, rgeo, 0, &Rend); - break; - case 4: - if (Type == 1) BSIM4v7RdsEndIso(Weffcj, Rsh, DMCG, DMCI, DMDG, - nuEndS, rgeo, 1, &Rend); - else Rend = Rsh * DMDG / Weffcj; - break; - case 5: - if (Type == 1) BSIM4v7RdsEndSha(Weffcj, Rsh, DMCG, DMCI, DMDG, - nuEndS, rgeo, 1, &Rend); - else Rend = Rsh * DMDG / (Weffcj * nuEndD); - break; - case 6: - if (Type == 1) Rend = Rsh * DMDG / Weffcj; - else BSIM4v7RdsEndIso(Weffcj, Rsh, DMCG, DMCI, DMDG, - nuEndD, rgeo, 0, &Rend); - break; - case 7: - if (Type == 1) Rend = Rsh * DMDG / (Weffcj * nuEndS); - else BSIM4v7RdsEndSha(Weffcj, Rsh, DMCG, DMCI, DMDG, - nuEndD, rgeo, 0, &Rend); - break; - case 8: - Rend = Rsh * DMDG / Weffcj; - break; - case 9: /* all wide contacts assumed for geo = 9 and 10 */ - if (Type == 1) - { Rend = 0.5 * Rsh * DMCG / Weffcj; - if (nf == 2.0) - Rint = 0.0; - else - Rint = Rsh * DMCG / (Weffcj * (nf - 2.0)); - } - else - { Rend = 0.0; - Rint = Rsh * DMCG / (Weffcj * nf); - } - break; - case 10: - if (Type == 1) - { Rend = 0.0; - Rint = Rsh * DMCG / (Weffcj * nf); - } - else - { Rend = 0.5 * Rsh * DMCG / Weffcj;; - if (nf == 2.0) - Rint = 0.0; - else - Rint = Rsh * DMCG / (Weffcj * (nf - 2.0)); - } - break; - default: - printf("Warning: Specified GEO = %d not matched\n", geo); - } - - if (Rint <= 0.0) - *Rtot = Rend; - else if (Rend <= 0.0) - *Rtot = Rint; - else - *Rtot = Rint * Rend / (Rint + Rend); -if(*Rtot==0.0) - printf("Warning: Zero resistance returned from RdseffGeo\n"); -return 0; -} - - -int -BSIM4v7RdsEndIso( -double Weffcj, double Rsh, double DMCG, double DMCI, double DMDG, -double nuEnd, -int rgeo, int Type, -double *Rend) -{ - NG_IGNORE(DMDG); - - if (Type == 1) - { switch(rgeo) - { case 1: - case 2: - case 5: - if (nuEnd == 0.0) - *Rend = 0.0; - else - *Rend = Rsh * DMCG / (Weffcj * nuEnd); - break; - case 3: - case 4: - case 6: - if ((DMCG + DMCI) == 0.0) - printf("(DMCG + DMCI) can not be equal to zero\n"); - if ((nuEnd == 0.0)||((DMCG+DMCI)==0.0)) - *Rend = 0.0; - else - *Rend = Rsh * Weffcj / (3.0 * nuEnd * (DMCG + DMCI)); - break; - default: - printf("Warning: Specified RGEO = %d not matched\n", rgeo); - } - } - else - { switch(rgeo) - { case 1: - case 3: - case 7: - if (nuEnd == 0.0) - *Rend = 0.0; - else - *Rend = Rsh * DMCG / (Weffcj * nuEnd); - break; - case 2: - case 4: - case 8: - if ((DMCG + DMCI) == 0.0) - printf("(DMCG + DMCI) can not be equal to zero\n"); - if ((nuEnd == 0.0)||((DMCG + DMCI)==0.0)) - *Rend = 0.0; - else - *Rend = Rsh * Weffcj / (3.0 * nuEnd * (DMCG + DMCI)); - break; - default: - printf("Warning: Specified RGEO = %d not matched\n", rgeo); - } - } -return 0; -} - - -int -BSIM4v7RdsEndSha( -double Weffcj, double Rsh, double DMCG, double DMCI, double DMDG, -double nuEnd, -int rgeo, int Type, -double *Rend) -{ - NG_IGNORE(DMCI); - NG_IGNORE(DMDG); - - if (Type == 1) - { switch(rgeo) - { case 1: - case 2: - case 5: - if (nuEnd == 0.0) - *Rend = 0.0; - else - *Rend = Rsh * DMCG / (Weffcj * nuEnd); - break; - case 3: - case 4: - case 6: - if (DMCG == 0.0) - printf("DMCG can not be equal to zero\n"); - if (nuEnd == 0.0) - *Rend = 0.0; - else - *Rend = Rsh * Weffcj / (6.0 * nuEnd * DMCG); - break; - default: - printf("Warning: Specified RGEO = %d not matched\n", rgeo); - } - } - else - { switch(rgeo) - { case 1: - case 3: - case 7: - if (nuEnd == 0.0) - *Rend = 0.0; - else - *Rend = Rsh * DMCG / (Weffcj * nuEnd); - break; - case 2: - case 4: - case 8: - if (DMCG == 0.0) - printf("DMCG can not be equal to zero\n"); - if (nuEnd == 0.0) - *Rend = 0.0; - else - *Rend = Rsh * Weffcj / (6.0 * nuEnd * DMCG); - break; - default: - printf("Warning: Specified RGEO = %d not matched\n", rgeo); - } - } -return 0; -} diff --git a/src/spicelib/devices/bsim4v7/b4v7getic.c b/src/spicelib/devices/bsim4v7/b4v7getic.c deleted file mode 100644 index 553a41366..000000000 --- a/src/spicelib/devices/bsim4v7/b4v7getic.c +++ /dev/null @@ -1,46 +0,0 @@ -/**** BSIM4.7.0 Released by Darsen Lu 04/08/2011 ****/ - -/********** - * Copyright 2006 Regents of the University of California. All rights reserved. - * File: b4getic.c of BSIM4.7.0. - * Author: 2000 Weidong Liu - * Authors: 2001- Xuemei Xi, Mohan Dunga, Ali Niknejad, Chenming Hu. - * Authors: 2006- Mohan Dunga, Ali Niknejad, Chenming Hu - * Authors: 2007- Mohan Dunga, Wenwei Yang, Ali Niknejad, Chenming Hu - * Project Director: Prof. Chenming Hu. - **********/ - -#include "ngspice/ngspice.h" -#include "ngspice/cktdefs.h" -#include "bsim4v7def.h" -#include "ngspice/sperror.h" -#include "ngspice/suffix.h" - - -int -BSIM4v7getic( -GENmodel *inModel, -CKTcircuit *ckt) -{ -BSIM4v7model *model = (BSIM4v7model*)inModel; -BSIM4v7instance *here; - - for (; model ; model = BSIM4v7nextModel(model)) - { for (here = BSIM4v7instances(model); here; here = BSIM4v7nextInstance(here)) - { - if (!here->BSIM4v7icVDSGiven) - { here->BSIM4v7icVDS = *(ckt->CKTrhs + here->BSIM4v7dNode) - - *(ckt->CKTrhs + here->BSIM4v7sNode); - } - if (!here->BSIM4v7icVGSGiven) - { here->BSIM4v7icVGS = *(ckt->CKTrhs + here->BSIM4v7gNodeExt) - - *(ckt->CKTrhs + here->BSIM4v7sNode); - } - if(!here->BSIM4v7icVBSGiven) - { here->BSIM4v7icVBS = *(ckt->CKTrhs + here->BSIM4v7bNode) - - *(ckt->CKTrhs + here->BSIM4v7sNode); - } - } - } - return(OK); -} diff --git a/src/spicelib/devices/bsim4v7/b4v7ld.c b/src/spicelib/devices/bsim4v7/b4v7ld.c deleted file mode 100644 index bc4058b8a..000000000 --- a/src/spicelib/devices/bsim4v7/b4v7ld.c +++ /dev/null @@ -1,5547 +0,0 @@ -/**** BSIM4.7.0 Released by Darsen Lu 04/08/2011 ****/ -/**** OpenMP support ngspice 06/28/2010 ****/ -/********** - * Copyright 2006 Regents of the University of California. All rights reserved. - * File: b4ld.c of BSIM4.7.0. - * Author: 2000 Weidong Liu - * Authors: 2001- Xuemei Xi, Mohan Dunga, Ali Niknejad, Chenming Hu. - * Authors: 2006- Mohan Dunga, Ali Niknejad, Chenming Hu - * Authors: 2007- Mohan Dunga, Wenwei Yang, Ali Niknejad, Chenming Hu - * Authors: 2008- Wenwei Yang, Ali Niknejad, Chenming Hu - * Project Director: Prof. Chenming Hu. - * Modified by Xuemei Xi, 04/06/2001. - * Modified by Xuemei Xi, 10/05/2001. - * Modified by Xuemei Xi, 11/15/2002. - * Modified by Xuemei Xi, 05/09/2003. - * Modified by Xuemei Xi, 03/04/2004. - * Modified by Xuemei Xi, Mohan Dunga, 07/29/2005. - * Modified by Mohan Dunga, 12/13/2006. - * Modified by Mohan Dunga, Wenwei Yang, 05/18/2007. - * Modified by Wenwei Yang, 07/31/2008. - * Modified by Tanvir Morshed, Darsen Lu 03/27/2011 - **********/ - - -#include "ngspice/ngspice.h" -#include "ngspice/cktdefs.h" -#include "bsim4v7def.h" -#include "ngspice/trandefs.h" -#include "ngspice/const.h" -#include "ngspice/sperror.h" -#include "ngspice/devdefs.h" -#include "ngspice/suffix.h" - -#define MAX_EXPL 2.688117142e+43 -#define MIN_EXPL 3.720075976e-44 -#define EXPL_THRESHOLD 100.0 - -#define MAX_EXP 5.834617425e14 -#define MIN_EXP 1.713908431e-15 -#define EXP_THRESHOLD 34.0 -#define EPS0 8.85418e-12 -#define EPSSI 1.03594e-10 -#define Charge_q 1.60219e-19 -#define DELTA_1 0.02 -#define DELTA_2 0.02 -#define DELTA_3 0.02 -#define DELTA_4 0.02 -#define MM 3 /* smooth coeff */ -#define DEXP(A,B,C) { \ - if (A > EXP_THRESHOLD) { \ - B = MAX_EXP*(1.0+(A)-EXP_THRESHOLD); \ - C = MAX_EXP; \ - } else if (A < -EXP_THRESHOLD) { \ - B = MIN_EXP; \ - C = 0; \ - } else { \ - B = exp(A); \ - C = B; \ - } \ - } - -#ifdef USE_OMP -int BSIM4v7LoadOMP(BSIM4v7instance *here, CKTcircuit *ckt); -void BSIM4v7LoadRhsMat(GENmodel *inModel, CKTcircuit *ckt); -#endif - -int BSIM4v7polyDepletion(double phi, double ngate,double epsgate, double coxe, double Vgs, double *Vgs_eff, double *dVgs_eff_dVg); - -int -BSIM4v7load( -GENmodel *inModel, -CKTcircuit *ckt) -{ -#ifdef USE_OMP - int idx; - BSIM4v7model *model = (BSIM4v7model*)inModel; - int error = 0; - BSIM4v7instance **InstArray; - InstArray = model->BSIM4v7InstanceArray; - -#pragma omp parallel for - for (idx = 0; idx < model->BSIM4v7InstCount; idx++) { - BSIM4v7instance *here = InstArray[idx]; - int local_error = BSIM4v7LoadOMP(here, ckt); - if (local_error) - error = local_error; - } - - BSIM4v7LoadRhsMat(inModel, ckt); - - return error; -} - - -int BSIM4v7LoadOMP(BSIM4v7instance *here, CKTcircuit *ckt) { -BSIM4v7model *model = BSIM4v7modPtr(here); -#else -BSIM4v7model *model = (BSIM4v7model*)inModel; -BSIM4v7instance *here; -#endif -double ceqgstot, dgstot_dvd, dgstot_dvg, dgstot_dvs, dgstot_dvb; -double ceqgdtot, dgdtot_dvd, dgdtot_dvg, dgdtot_dvs, dgdtot_dvb; -double gstot, gstotd, gstotg, gstots, gstotb, gspr, Rs, Rd; -double gdtot, gdtotd, gdtotg, gdtots, gdtotb, gdpr; -double vgs_eff, vgd_eff, dvgs_eff_dvg, dvgd_eff_dvg; -double dRs_dvg, dRd_dvg, dRs_dvb, dRd_dvb; -double dT0_dvg, dT1_dvb, dT3_dvg, dT3_dvb; -double vses, vdes, vdedo, delvses, delvded, delvdes; -double Isestot, cseshat, Idedtot, cdedhat; -#ifndef NEWCONV -double tol0, tol1, tol2, tol3, tol4, tol5, tol6; -#endif - -double geltd, gcrg, gcrgg, gcrgd, gcrgs, gcrgb, ceqgcrg; -double vges, vgms, vgedo, vgmdo, vged, vgmd, delvged, delvgmd; -double delvges, delvgms, vgmb; -double gcgmgmb=0.0, gcgmdb=0.0, gcgmsb=0.0, gcdgmb, gcsgmb; -double gcgmbb=0.0, gcbgmb, qgmb, qgmid=0.0, ceqqgmid; - -double vbd, vbs, vds, vgb, vgd, vgs, vgdo; -#ifndef PREDICTOR -double xfact; -#endif -double vdbs, vdbd, vsbs, vsbdo, vsbd; -double delvdbs, delvdbd, delvsbs; -double delvbd_jct, delvbs_jct, vbs_jct, vbd_jct; - -double SourceSatCurrent, DrainSatCurrent; -double ag0, qgb, von, cbhat, VgstNVt, ExpVgst; -double ceqqb, ceqqd, ceqqg, ceqqjd=0.0, ceqqjs=0.0, ceq, geq; -double cdrain, cdhat, ceqdrn, ceqbd, ceqbs, ceqjd, ceqjs, gjbd, gjbs; -double czbd, czbdsw, czbdswg, czbs, czbssw, czbsswg, evbd, evbs, arg, sarg; -double delvbd, delvbs, delvds, delvgd, delvgs; -double Vfbeff, dVfbeff_dVg, dVfbeff_dVb, V3, V4; -double gcbdb, gcbgb, gcbsb, gcddb, gcdgb, gcdsb, gcgdb, gcggb, gcgsb, gcsdb; -double gcgbb, gcdbb, gcsbb, gcbbb; -double gcdbdb, gcsbsb; -double gcsgb, gcssb, MJD, MJSWD, MJSWGD, MJS, MJSWS, MJSWGS; -double qgate=0.0, qbulk=0.0, qdrn=0.0, qsrc, cqgate, cqbody, cqdrn; -double Vdb, Vds, Vgs, Vbs, Gmbs, FwdSum, RevSum; -double Igidl, Ggidld, Ggidlg, Ggidlb; -double Voxacc=0.0, dVoxacc_dVg=0.0, dVoxacc_dVb=0.0; -double Voxdepinv=0.0, dVoxdepinv_dVg=0.0, dVoxdepinv_dVd=0.0, dVoxdepinv_dVb=0.0; -double VxNVt=0.0, ExpVxNVt, Vaux=0.0, dVaux_dVg=0.0, dVaux_dVd=0.0, dVaux_dVb=0.0; -double Igc, dIgc_dVg, dIgc_dVd, dIgc_dVb; -double Igcs, dIgcs_dVg, dIgcs_dVd, dIgcs_dVb; -double Igcd, dIgcd_dVg, dIgcd_dVd, dIgcd_dVb; -double Igs, dIgs_dVg, dIgs_dVs, Igd, dIgd_dVg, dIgd_dVd; -double Igbacc, dIgbacc_dVg, dIgbacc_dVb; -double Igbinv, dIgbinv_dVg, dIgbinv_dVd, dIgbinv_dVb; -double Pigcd, dPigcd_dVg, dPigcd_dVd, dPigcd_dVb; -double Istoteq, gIstotg, gIstotd, gIstots, gIstotb; -double Idtoteq, gIdtotg, gIdtotd, gIdtots, gIdtotb; -double Ibtoteq, gIbtotg, gIbtotd, gIbtots, gIbtotb; -double Igtoteq, gIgtotg, gIgtotd, gIgtots, gIgtotb; -double Igstot, cgshat, Igdtot, cgdhat, Igbtot, cgbhat; -double Vgs_eff, Vfb=0.0, Vth_NarrowW; -/* double Vgd_eff, dVgd_eff_dVg; v4.7.0 */ -double Phis, dPhis_dVb, sqrtPhis, dsqrtPhis_dVb, Vth, dVth_dVb, dVth_dVd; -double Vgst, dVgst_dVg, dVgst_dVb, dVgs_eff_dVg, Nvtms, Nvtmd; -double Vtm, Vtm0; -double n, dn_dVb, dn_dVd, voffcv, noff, dnoff_dVd, dnoff_dVb; -double V0, CoxWLcen, QovCox, LINK; -double DeltaPhi, dDeltaPhi_dVg, VgDP, dVgDP_dVg; -double Cox, Tox, Tcen, dTcen_dVg, dTcen_dVd, dTcen_dVb; -double Ccen, Coxeff, dCoxeff_dVd, dCoxeff_dVg, dCoxeff_dVb; -double Denomi, dDenomi_dVg, dDenomi_dVd, dDenomi_dVb; -double ueff, dueff_dVg, dueff_dVd, dueff_dVb; -double Esat, Vdsat; -double EsatL, dEsatL_dVg, dEsatL_dVd, dEsatL_dVb; -double dVdsat_dVg, dVdsat_dVb, dVdsat_dVd, Vasat, dAlphaz_dVg, dAlphaz_dVb; -double dVasat_dVg, dVasat_dVb, dVasat_dVd, Va, dVa_dVd, dVa_dVg, dVa_dVb; -double Vbseff, dVbseff_dVb, VbseffCV, dVbseffCV_dVb; -double VgsteffVth, dT11_dVg; -double Arg1, One_Third_CoxWL, Two_Third_CoxWL, Alphaz, CoxWL; -double T0=0.0, dT0_dVg, dT0_dVd, dT0_dVb; -double T1, dT1_dVg, dT1_dVd, dT1_dVb; -double T2, dT2_dVg, dT2_dVd, dT2_dVb; -double T3, dT3_dVg, dT3_dVd, dT3_dVb; -double T4, dT4_dVd, dT4_dVb; -double T5, dT5_dVg, dT5_dVd, dT5_dVb; -double T6, dT6_dVg, dT6_dVd, dT6_dVb; -double T7, dT7_dVg, dT7_dVd, dT7_dVb; -double T8, dT8_dVg, dT8_dVd, dT8_dVb; -double T9, dT9_dVg, dT9_dVd, dT9_dVb; -double T10, dT10_dVg, dT10_dVb, dT10_dVd; -double T11, T12, T13, T14; -double tmp, Abulk, dAbulk_dVb, Abulk0, dAbulk0_dVb; -double Cclm, dCclm_dVg, dCclm_dVd, dCclm_dVb; -double FP, dFP_dVg, PvagTerm, dPvagTerm_dVg, dPvagTerm_dVd, dPvagTerm_dVb; -double VADITS, dVADITS_dVg, dVADITS_dVd; -double Lpe_Vb, dDITS_Sft_dVb, dDITS_Sft_dVd; -double DITS_Sft2, dDITS_Sft2_dVd; /* v4.7 New DITS */ -double VACLM, dVACLM_dVg, dVACLM_dVd, dVACLM_dVb; -double VADIBL, dVADIBL_dVg, dVADIBL_dVd, dVADIBL_dVb; -double Xdep, dXdep_dVb, lt1, dlt1_dVb, ltw, dltw_dVb, Delt_vth, dDelt_vth_dVb; -double Theta0, dTheta0_dVb; -double TempRatio, tmp1, tmp2, tmp3, tmp4; -double DIBL_Sft, dDIBL_Sft_dVd, Lambda, dLambda_dVg; -double Idtot, Ibtot, a1, ScalingFactor; - -double Vgsteff, dVgsteff_dVg, dVgsteff_dVd, dVgsteff_dVb; -double Vdseff, dVdseff_dVg, dVdseff_dVd, dVdseff_dVb; -double VdseffCV, dVdseffCV_dVg, dVdseffCV_dVd, dVdseffCV_dVb; -double diffVds, dAbulk_dVg; -double beta, dbeta_dVg, dbeta_dVd, dbeta_dVb; -double gche, dgche_dVg, dgche_dVd, dgche_dVb; -double fgche1, dfgche1_dVg, dfgche1_dVd, dfgche1_dVb; -double fgche2, dfgche2_dVg, dfgche2_dVd, dfgche2_dVb; -double Idl, dIdl_dVg, dIdl_dVd, dIdl_dVb; -double Idsa, dIdsa_dVg, dIdsa_dVd, dIdsa_dVb; -double Ids, Gm, Gds, Gmb, devbs_dvb, devbd_dvb; -double Isub, Gbd, Gbg, Gbb; -double VASCBE, dVASCBE_dVg, dVASCBE_dVd, dVASCBE_dVb; -double CoxeffWovL; -double Rds, dRds_dVg, dRds_dVb, WVCox, WVCoxRds; -double Vgst2Vtm, VdsatCV; -double Leff, Weff, dWeff_dVg, dWeff_dVb; -double AbulkCV, dAbulkCV_dVb; -double qcheq, qdef, gqdef=0.0, cqdef=0.0, cqcheq=0.0; -double gcqdb=0.0, gcqsb=0.0, gcqgb=0.0, gcqbb=0.0; -double dxpart, sxpart, ggtg, ggtd, ggts, ggtb; -double ddxpart_dVd, ddxpart_dVg, ddxpart_dVb, ddxpart_dVs; -double dsxpart_dVd, dsxpart_dVg, dsxpart_dVb, dsxpart_dVs; -double gbspsp, gbbdp, gbbsp, gbspg, gbspb, gbspdp; -double gbdpdp, gbdpg, gbdpb, gbdpsp; -double qgdo, qgso, cgdo, cgso; -double Cgg, Cgd, Cgb, Cdg, Cdd, Cds; -double Csg, Csd, Css, Csb, Cbg, Cbd, Cbb; -double Cgg1, Cgd1, Cgb1, Cbg1, Cbb1, Cbd1, Qac0, Qsub0; -double dQac0_dVg, dQac0_dVb, dQsub0_dVg, dQsub0_dVd, dQsub0_dVb; -double ggidld, ggidlg, ggidlb, ggislg, ggislb, ggisls; -double Igisl, Ggislg, Ggislb, Ggisls; -double Nvtmrss, Nvtmrssws, Nvtmrsswgs; -double Nvtmrsd, Nvtmrsswd, Nvtmrsswgd; - -double vs, Fsevl, dvs_dVg, dvs_dVd, dvs_dVb, dFsevl_dVg, dFsevl_dVd, dFsevl_dVb; -double vgdx, vgsx, epssub, toxe, epsrox; -struct bsim4SizeDependParam *pParam; -int ByPass, ChargeComputationNeeded, error, Check, Check1, Check2; - -double m; - -ScalingFactor = 1.0e-9; -ChargeComputationNeeded = - ((ckt->CKTmode & (MODEDCTRANCURVE | MODEAC | MODETRAN | MODEINITSMSIG)) || - ((ckt->CKTmode & MODETRANOP) && (ckt->CKTmode & MODEUIC))) - ? 1 : 0; - -#ifndef USE_OMP -for (; model != NULL; model = BSIM4v7nextModel(model)) -{ for (here = BSIM4v7instances(model); here != NULL; - here = BSIM4v7nextInstance(here)) - { -#endif - - Check = Check1 = Check2 = 1; - ByPass = 0; - pParam = here->pParam; - - if ((ckt->CKTmode & MODEINITSMSIG)) - { vds = *(ckt->CKTstate0 + here->BSIM4v7vds); - vgs = *(ckt->CKTstate0 + here->BSIM4v7vgs); - vbs = *(ckt->CKTstate0 + here->BSIM4v7vbs); - vges = *(ckt->CKTstate0 + here->BSIM4v7vges); - vgms = *(ckt->CKTstate0 + here->BSIM4v7vgms); - vdbs = *(ckt->CKTstate0 + here->BSIM4v7vdbs); - vsbs = *(ckt->CKTstate0 + here->BSIM4v7vsbs); - vses = *(ckt->CKTstate0 + here->BSIM4v7vses); - vdes = *(ckt->CKTstate0 + here->BSIM4v7vdes); - - qdef = *(ckt->CKTstate0 + here->BSIM4v7qdef); - } - else if ((ckt->CKTmode & MODEINITTRAN)) - { vds = *(ckt->CKTstate1 + here->BSIM4v7vds); - vgs = *(ckt->CKTstate1 + here->BSIM4v7vgs); - vbs = *(ckt->CKTstate1 + here->BSIM4v7vbs); - vges = *(ckt->CKTstate1 + here->BSIM4v7vges); - vgms = *(ckt->CKTstate1 + here->BSIM4v7vgms); - vdbs = *(ckt->CKTstate1 + here->BSIM4v7vdbs); - vsbs = *(ckt->CKTstate1 + here->BSIM4v7vsbs); - vses = *(ckt->CKTstate1 + here->BSIM4v7vses); - vdes = *(ckt->CKTstate1 + here->BSIM4v7vdes); - - qdef = *(ckt->CKTstate1 + here->BSIM4v7qdef); - } - else if ((ckt->CKTmode & MODEINITJCT) && !here->BSIM4v7off) - { vds = model->BSIM4v7type * here->BSIM4v7icVDS; - vgs = vges = vgms = model->BSIM4v7type * here->BSIM4v7icVGS; - vbs = vdbs = vsbs = model->BSIM4v7type * here->BSIM4v7icVBS; - if (vds > 0.0) - { vdes = vds + 0.01; - vses = -0.01; - } - else if (vds < 0.0) - { vdes = vds - 0.01; - vses = 0.01; - } - else - vdes = vses = 0.0; - - qdef = 0.0; - - if ((vds == 0.0) && (vgs == 0.0) && (vbs == 0.0) && - ((ckt->CKTmode & (MODETRAN | MODEAC|MODEDCOP | - MODEDCTRANCURVE)) || (!(ckt->CKTmode & MODEUIC)))) - { vds = 0.1; - vdes = 0.11; - vses = -0.01; - vgs = vges = vgms = model->BSIM4v7type - * here->BSIM4v7vth0 + 0.1; - vbs = vdbs = vsbs = 0.0; - } - } - else if ((ckt->CKTmode & (MODEINITJCT | MODEINITFIX)) && - (here->BSIM4v7off)) - { vds = vgs = vbs = vges = vgms = 0.0; - vdbs = vsbs = vdes = vses = qdef = 0.0; - } - else - { -#ifndef PREDICTOR - if ((ckt->CKTmode & MODEINITPRED)) - { xfact = ckt->CKTdelta / ckt->CKTdeltaOld[1]; - *(ckt->CKTstate0 + here->BSIM4v7vds) = - *(ckt->CKTstate1 + here->BSIM4v7vds); - vds = (1.0 + xfact)* (*(ckt->CKTstate1 + here->BSIM4v7vds)) - - (xfact * (*(ckt->CKTstate2 + here->BSIM4v7vds))); - *(ckt->CKTstate0 + here->BSIM4v7vgs) = - *(ckt->CKTstate1 + here->BSIM4v7vgs); - vgs = (1.0 + xfact)* (*(ckt->CKTstate1 + here->BSIM4v7vgs)) - - (xfact * (*(ckt->CKTstate2 + here->BSIM4v7vgs))); - *(ckt->CKTstate0 + here->BSIM4v7vges) = - *(ckt->CKTstate1 + here->BSIM4v7vges); - vges = (1.0 + xfact)* (*(ckt->CKTstate1 + here->BSIM4v7vges)) - - (xfact * (*(ckt->CKTstate2 + here->BSIM4v7vges))); - *(ckt->CKTstate0 + here->BSIM4v7vgms) = - *(ckt->CKTstate1 + here->BSIM4v7vgms); - vgms = (1.0 + xfact)* (*(ckt->CKTstate1 + here->BSIM4v7vgms)) - - (xfact * (*(ckt->CKTstate2 + here->BSIM4v7vgms))); - *(ckt->CKTstate0 + here->BSIM4v7vbs) = - *(ckt->CKTstate1 + here->BSIM4v7vbs); - vbs = (1.0 + xfact)* (*(ckt->CKTstate1 + here->BSIM4v7vbs)) - - (xfact * (*(ckt->CKTstate2 + here->BSIM4v7vbs))); - *(ckt->CKTstate0 + here->BSIM4v7vbd) = - *(ckt->CKTstate0 + here->BSIM4v7vbs) - - *(ckt->CKTstate0 + here->BSIM4v7vds); - *(ckt->CKTstate0 + here->BSIM4v7vdbs) = - *(ckt->CKTstate1 + here->BSIM4v7vdbs); - vdbs = (1.0 + xfact)* (*(ckt->CKTstate1 + here->BSIM4v7vdbs)) - - (xfact * (*(ckt->CKTstate2 + here->BSIM4v7vdbs))); - *(ckt->CKTstate0 + here->BSIM4v7vdbd) = - *(ckt->CKTstate0 + here->BSIM4v7vdbs) - - *(ckt->CKTstate0 + here->BSIM4v7vds); - *(ckt->CKTstate0 + here->BSIM4v7vsbs) = - *(ckt->CKTstate1 + here->BSIM4v7vsbs); - vsbs = (1.0 + xfact)* (*(ckt->CKTstate1 + here->BSIM4v7vsbs)) - - (xfact * (*(ckt->CKTstate2 + here->BSIM4v7vsbs))); - *(ckt->CKTstate0 + here->BSIM4v7vses) = - *(ckt->CKTstate1 + here->BSIM4v7vses); - vses = (1.0 + xfact)* (*(ckt->CKTstate1 + here->BSIM4v7vses)) - - (xfact * (*(ckt->CKTstate2 + here->BSIM4v7vses))); - *(ckt->CKTstate0 + here->BSIM4v7vdes) = - *(ckt->CKTstate1 + here->BSIM4v7vdes); - vdes = (1.0 + xfact)* (*(ckt->CKTstate1 + here->BSIM4v7vdes)) - - (xfact * (*(ckt->CKTstate2 + here->BSIM4v7vdes))); - - *(ckt->CKTstate0 + here->BSIM4v7qdef) = - *(ckt->CKTstate1 + here->BSIM4v7qdef); - qdef = (1.0 + xfact)* (*(ckt->CKTstate1 + here->BSIM4v7qdef)) - -(xfact * (*(ckt->CKTstate2 + here->BSIM4v7qdef))); - } - else - { -#endif /* PREDICTOR */ - vds = model->BSIM4v7type - * (*(ckt->CKTrhsOld + here->BSIM4v7dNodePrime) - - *(ckt->CKTrhsOld + here->BSIM4v7sNodePrime)); - vgs = model->BSIM4v7type - * (*(ckt->CKTrhsOld + here->BSIM4v7gNodePrime) - - *(ckt->CKTrhsOld + here->BSIM4v7sNodePrime)); - vbs = model->BSIM4v7type - * (*(ckt->CKTrhsOld + here->BSIM4v7bNodePrime) - - *(ckt->CKTrhsOld + here->BSIM4v7sNodePrime)); - vges = model->BSIM4v7type - * (*(ckt->CKTrhsOld + here->BSIM4v7gNodeExt) - - *(ckt->CKTrhsOld + here->BSIM4v7sNodePrime)); - vgms = model->BSIM4v7type - * (*(ckt->CKTrhsOld + here->BSIM4v7gNodeMid) - - *(ckt->CKTrhsOld + here->BSIM4v7sNodePrime)); - vdbs = model->BSIM4v7type - * (*(ckt->CKTrhsOld + here->BSIM4v7dbNode) - - *(ckt->CKTrhsOld + here->BSIM4v7sNodePrime)); - vsbs = model->BSIM4v7type - * (*(ckt->CKTrhsOld + here->BSIM4v7sbNode) - - *(ckt->CKTrhsOld + here->BSIM4v7sNodePrime)); - vses = model->BSIM4v7type - * (*(ckt->CKTrhsOld + here->BSIM4v7sNode) - - *(ckt->CKTrhsOld + here->BSIM4v7sNodePrime)); - vdes = model->BSIM4v7type - * (*(ckt->CKTrhsOld + here->BSIM4v7dNode) - - *(ckt->CKTrhsOld + here->BSIM4v7sNodePrime)); - qdef = model->BSIM4v7type - * (*(ckt->CKTrhsOld + here->BSIM4v7qNode)); -#ifndef PREDICTOR - } -#endif /* PREDICTOR */ - - vgdo = *(ckt->CKTstate0 + here->BSIM4v7vgs) - - *(ckt->CKTstate0 + here->BSIM4v7vds); - vgedo = *(ckt->CKTstate0 + here->BSIM4v7vges) - - *(ckt->CKTstate0 + here->BSIM4v7vds); - vgmdo = *(ckt->CKTstate0 + here->BSIM4v7vgms) - - *(ckt->CKTstate0 + here->BSIM4v7vds); - - vbd = vbs - vds; - vdbd = vdbs - vds; - vgd = vgs - vds; - vged = vges - vds; - vgmd = vgms - vds; - - delvbd = vbd - *(ckt->CKTstate0 + here->BSIM4v7vbd); - delvdbd = vdbd - *(ckt->CKTstate0 + here->BSIM4v7vdbd); - delvgd = vgd - vgdo; - delvged = vged - vgedo; - delvgmd = vgmd - vgmdo; - - delvds = vds - *(ckt->CKTstate0 + here->BSIM4v7vds); - delvgs = vgs - *(ckt->CKTstate0 + here->BSIM4v7vgs); - delvges = vges - *(ckt->CKTstate0 + here->BSIM4v7vges); - delvgms = vgms - *(ckt->CKTstate0 + here->BSIM4v7vgms); - delvbs = vbs - *(ckt->CKTstate0 + here->BSIM4v7vbs); - delvdbs = vdbs - *(ckt->CKTstate0 + here->BSIM4v7vdbs); - delvsbs = vsbs - *(ckt->CKTstate0 + here->BSIM4v7vsbs); - - delvses = vses - (*(ckt->CKTstate0 + here->BSIM4v7vses)); - vdedo = *(ckt->CKTstate0 + here->BSIM4v7vdes) - - *(ckt->CKTstate0 + here->BSIM4v7vds); - delvdes = vdes - *(ckt->CKTstate0 + here->BSIM4v7vdes); - delvded = vdes - vds - vdedo; - - delvbd_jct = (!here->BSIM4v7rbodyMod) ? delvbd : delvdbd; - delvbs_jct = (!here->BSIM4v7rbodyMod) ? delvbs : delvsbs; - if (here->BSIM4v7mode >= 0) - { Idtot = here->BSIM4v7cd + here->BSIM4v7csub - here->BSIM4v7cbd - + here->BSIM4v7Igidl; - cdhat = Idtot - here->BSIM4v7gbd * delvbd_jct - + (here->BSIM4v7gmbs + here->BSIM4v7gbbs + here->BSIM4v7ggidlb) * delvbs - + (here->BSIM4v7gm + here->BSIM4v7gbgs + here->BSIM4v7ggidlg) * delvgs - + (here->BSIM4v7gds + here->BSIM4v7gbds + here->BSIM4v7ggidld) * delvds; - Ibtot = here->BSIM4v7cbs + here->BSIM4v7cbd - - here->BSIM4v7Igidl - here->BSIM4v7Igisl - here->BSIM4v7csub; - cbhat = Ibtot + here->BSIM4v7gbd * delvbd_jct - + here->BSIM4v7gbs * delvbs_jct - (here->BSIM4v7gbbs + here->BSIM4v7ggidlb) - * delvbs - (here->BSIM4v7gbgs + here->BSIM4v7ggidlg) * delvgs - - (here->BSIM4v7gbds + here->BSIM4v7ggidld - here->BSIM4v7ggisls) * delvds - - here->BSIM4v7ggislg * delvgd - here->BSIM4v7ggislb* delvbd; - - Igstot = here->BSIM4v7Igs + here->BSIM4v7Igcs; - cgshat = Igstot + (here->BSIM4v7gIgsg + here->BSIM4v7gIgcsg) * delvgs - + here->BSIM4v7gIgcsd * delvds + here->BSIM4v7gIgcsb * delvbs; - - Igdtot = here->BSIM4v7Igd + here->BSIM4v7Igcd; - cgdhat = Igdtot + here->BSIM4v7gIgdg * delvgd + here->BSIM4v7gIgcdg * delvgs - + here->BSIM4v7gIgcdd * delvds + here->BSIM4v7gIgcdb * delvbs; - - Igbtot = here->BSIM4v7Igb; - cgbhat = here->BSIM4v7Igb + here->BSIM4v7gIgbg * delvgs + here->BSIM4v7gIgbd - * delvds + here->BSIM4v7gIgbb * delvbs; - } - else - { Idtot = here->BSIM4v7cd + here->BSIM4v7cbd - here->BSIM4v7Igidl; /* bugfix */ - cdhat = Idtot + here->BSIM4v7gbd * delvbd_jct + here->BSIM4v7gmbs - * delvbd + here->BSIM4v7gm * delvgd - - (here->BSIM4v7gds + here->BSIM4v7ggidls) * delvds - - here->BSIM4v7ggidlg * delvgs - here->BSIM4v7ggidlb * delvbs; - Ibtot = here->BSIM4v7cbs + here->BSIM4v7cbd - - here->BSIM4v7Igidl - here->BSIM4v7Igisl - here->BSIM4v7csub; - cbhat = Ibtot + here->BSIM4v7gbs * delvbs_jct + here->BSIM4v7gbd - * delvbd_jct - (here->BSIM4v7gbbs + here->BSIM4v7ggislb) * delvbd - - (here->BSIM4v7gbgs + here->BSIM4v7ggislg) * delvgd - + (here->BSIM4v7gbds + here->BSIM4v7ggisld - here->BSIM4v7ggidls) * delvds - - here->BSIM4v7ggidlg * delvgs - here->BSIM4v7ggidlb * delvbs; - - Igstot = here->BSIM4v7Igs + here->BSIM4v7Igcd; - cgshat = Igstot + here->BSIM4v7gIgsg * delvgs + here->BSIM4v7gIgcdg * delvgd - - here->BSIM4v7gIgcdd * delvds + here->BSIM4v7gIgcdb * delvbd; - - Igdtot = here->BSIM4v7Igd + here->BSIM4v7Igcs; - cgdhat = Igdtot + (here->BSIM4v7gIgdg + here->BSIM4v7gIgcsg) * delvgd - - here->BSIM4v7gIgcsd * delvds + here->BSIM4v7gIgcsb * delvbd; - - Igbtot = here->BSIM4v7Igb; - cgbhat = here->BSIM4v7Igb + here->BSIM4v7gIgbg * delvgd - here->BSIM4v7gIgbd - * delvds + here->BSIM4v7gIgbb * delvbd; - } - - Isestot = here->BSIM4v7gstot * (*(ckt->CKTstate0 + here->BSIM4v7vses)); - cseshat = Isestot + here->BSIM4v7gstot * delvses - + here->BSIM4v7gstotd * delvds + here->BSIM4v7gstotg * delvgs - + here->BSIM4v7gstotb * delvbs; - - Idedtot = here->BSIM4v7gdtot * vdedo; - cdedhat = Idedtot + here->BSIM4v7gdtot * delvded - + here->BSIM4v7gdtotd * delvds + here->BSIM4v7gdtotg * delvgs - + here->BSIM4v7gdtotb * delvbs; - - -#ifndef NOBYPASS - /* Following should be one IF statement, but some C compilers - * can't handle that all at once, so we split it into several - * successive IF's */ - - if ((!(ckt->CKTmode & MODEINITPRED)) && (ckt->CKTbypass)) - if ((fabs(delvds) < (ckt->CKTreltol * MAX(fabs(vds), - fabs(*(ckt->CKTstate0 + here->BSIM4v7vds))) + ckt->CKTvoltTol))) - if ((fabs(delvgs) < (ckt->CKTreltol * MAX(fabs(vgs), - fabs(*(ckt->CKTstate0 + here->BSIM4v7vgs))) + ckt->CKTvoltTol))) - if ((fabs(delvbs) < (ckt->CKTreltol * MAX(fabs(vbs), - fabs(*(ckt->CKTstate0 + here->BSIM4v7vbs))) + ckt->CKTvoltTol))) - if ((fabs(delvbd) < (ckt->CKTreltol * MAX(fabs(vbd), - fabs(*(ckt->CKTstate0 + here->BSIM4v7vbd))) + ckt->CKTvoltTol))) - if ((here->BSIM4v7rgateMod == 0) || (here->BSIM4v7rgateMod == 1) - || (fabs(delvges) < (ckt->CKTreltol * MAX(fabs(vges), - fabs(*(ckt->CKTstate0 + here->BSIM4v7vges))) + ckt->CKTvoltTol))) - if ((here->BSIM4v7rgateMod != 3) || (fabs(delvgms) < (ckt->CKTreltol - * MAX(fabs(vgms), fabs(*(ckt->CKTstate0 + here->BSIM4v7vgms))) - + ckt->CKTvoltTol))) - if ((!here->BSIM4v7rbodyMod) || (fabs(delvdbs) < (ckt->CKTreltol - * MAX(fabs(vdbs), fabs(*(ckt->CKTstate0 + here->BSIM4v7vdbs))) - + ckt->CKTvoltTol))) - if ((!here->BSIM4v7rbodyMod) || (fabs(delvdbd) < (ckt->CKTreltol - * MAX(fabs(vdbd), fabs(*(ckt->CKTstate0 + here->BSIM4v7vdbd))) - + ckt->CKTvoltTol))) - if ((!here->BSIM4v7rbodyMod) || (fabs(delvsbs) < (ckt->CKTreltol - * MAX(fabs(vsbs), fabs(*(ckt->CKTstate0 + here->BSIM4v7vsbs))) - + ckt->CKTvoltTol))) - if ((!model->BSIM4v7rdsMod) || (fabs(delvses) < (ckt->CKTreltol - * MAX(fabs(vses), fabs(*(ckt->CKTstate0 + here->BSIM4v7vses))) - + ckt->CKTvoltTol))) - if ((!model->BSIM4v7rdsMod) || (fabs(delvdes) < (ckt->CKTreltol - * MAX(fabs(vdes), fabs(*(ckt->CKTstate0 + here->BSIM4v7vdes))) - + ckt->CKTvoltTol))) - if ((fabs(cdhat - Idtot) < ckt->CKTreltol - * MAX(fabs(cdhat), fabs(Idtot)) + ckt->CKTabstol)) - if ((fabs(cbhat - Ibtot) < ckt->CKTreltol - * MAX(fabs(cbhat), fabs(Ibtot)) + ckt->CKTabstol)) - if ((!model->BSIM4v7igcMod) || ((fabs(cgshat - Igstot) < ckt->CKTreltol - * MAX(fabs(cgshat), fabs(Igstot)) + ckt->CKTabstol))) - if ((!model->BSIM4v7igcMod) || ((fabs(cgdhat - Igdtot) < ckt->CKTreltol - * MAX(fabs(cgdhat), fabs(Igdtot)) + ckt->CKTabstol))) - if ((!model->BSIM4v7igbMod) || ((fabs(cgbhat - Igbtot) < ckt->CKTreltol - * MAX(fabs(cgbhat), fabs(Igbtot)) + ckt->CKTabstol))) - if ((!model->BSIM4v7rdsMod) || ((fabs(cseshat - Isestot) < ckt->CKTreltol - * MAX(fabs(cseshat), fabs(Isestot)) + ckt->CKTabstol))) - if ((!model->BSIM4v7rdsMod) || ((fabs(cdedhat - Idedtot) < ckt->CKTreltol - * MAX(fabs(cdedhat), fabs(Idedtot)) + ckt->CKTabstol))) - { vds = *(ckt->CKTstate0 + here->BSIM4v7vds); - vgs = *(ckt->CKTstate0 + here->BSIM4v7vgs); - vbs = *(ckt->CKTstate0 + here->BSIM4v7vbs); - vges = *(ckt->CKTstate0 + here->BSIM4v7vges); - vgms = *(ckt->CKTstate0 + here->BSIM4v7vgms); - - vbd = *(ckt->CKTstate0 + here->BSIM4v7vbd); - vdbs = *(ckt->CKTstate0 + here->BSIM4v7vdbs); - vdbd = *(ckt->CKTstate0 + here->BSIM4v7vdbd); - vsbs = *(ckt->CKTstate0 + here->BSIM4v7vsbs); - vses = *(ckt->CKTstate0 + here->BSIM4v7vses); - vdes = *(ckt->CKTstate0 + here->BSIM4v7vdes); - - vgd = vgs - vds; - vgb = vgs - vbs; - vged = vges - vds; - vgmd = vgms - vds; - vgmb = vgms - vbs; - - vbs_jct = (!here->BSIM4v7rbodyMod) ? vbs : vsbs; - vbd_jct = (!here->BSIM4v7rbodyMod) ? vbd : vdbd; - -/*** qdef should not be kept fixed even if vgs, vds & vbs has converged -**** qdef = *(ckt->CKTstate0 + here->BSIM4v7qdef); -***/ - cdrain = here->BSIM4v7cd; - - if ((ckt->CKTmode & (MODETRAN | MODEAC)) || - ((ckt->CKTmode & MODETRANOP) && - (ckt->CKTmode & MODEUIC))) - { ByPass = 1; - - qgate = here->BSIM4v7qgate; - qbulk = here->BSIM4v7qbulk; - qdrn = here->BSIM4v7qdrn; - cgdo = here->BSIM4v7cgdo; - qgdo = here->BSIM4v7qgdo; - cgso = here->BSIM4v7cgso; - qgso = here->BSIM4v7qgso; - - goto line755; - } - else - goto line850; - } -#endif /*NOBYPASS*/ - - von = here->BSIM4v7von; - if (*(ckt->CKTstate0 + here->BSIM4v7vds) >= 0.0) - { vgs = DEVfetlim(vgs, *(ckt->CKTstate0 + here->BSIM4v7vgs), von); - vds = vgs - vgd; - vds = DEVlimvds(vds, *(ckt->CKTstate0 + here->BSIM4v7vds)); - vgd = vgs - vds; - if (here->BSIM4v7rgateMod == 3) - { vges = DEVfetlim(vges, *(ckt->CKTstate0 + here->BSIM4v7vges), von); - vgms = DEVfetlim(vgms, *(ckt->CKTstate0 + here->BSIM4v7vgms), von); - vged = vges - vds; - vgmd = vgms - vds; - } - else if ((here->BSIM4v7rgateMod == 1) || (here->BSIM4v7rgateMod == 2)) - { vges = DEVfetlim(vges, *(ckt->CKTstate0 + here->BSIM4v7vges), von); - vged = vges - vds; - } - - if (model->BSIM4v7rdsMod) - { vdes = DEVlimvds(vdes, *(ckt->CKTstate0 + here->BSIM4v7vdes)); - vses = -DEVlimvds(-vses, -(*(ckt->CKTstate0 + here->BSIM4v7vses))); - } - - } - else - { vgd = DEVfetlim(vgd, vgdo, von); - vds = vgs - vgd; - vds = -DEVlimvds(-vds, -(*(ckt->CKTstate0 + here->BSIM4v7vds))); - vgs = vgd + vds; - - if (here->BSIM4v7rgateMod == 3) - { vged = DEVfetlim(vged, vgedo, von); - vges = vged + vds; - vgmd = DEVfetlim(vgmd, vgmdo, von); - vgms = vgmd + vds; - } - if ((here->BSIM4v7rgateMod == 1) || (here->BSIM4v7rgateMod == 2)) - { vged = DEVfetlim(vged, vgedo, von); - vges = vged + vds; - } - - if (model->BSIM4v7rdsMod) - { vdes = -DEVlimvds(-vdes, -(*(ckt->CKTstate0 + here->BSIM4v7vdes))); - vses = DEVlimvds(vses, *(ckt->CKTstate0 + here->BSIM4v7vses)); - } - } - - if (vds >= 0.0) - { vbs = DEVpnjlim(vbs, *(ckt->CKTstate0 + here->BSIM4v7vbs), - CONSTvt0, model->BSIM4v7vcrit, &Check); - vbd = vbs - vds; - if (here->BSIM4v7rbodyMod) - { vdbs = DEVpnjlim(vdbs, *(ckt->CKTstate0 + here->BSIM4v7vdbs), - CONSTvt0, model->BSIM4v7vcrit, &Check1); - vdbd = vdbs - vds; - vsbs = DEVpnjlim(vsbs, *(ckt->CKTstate0 + here->BSIM4v7vsbs), - CONSTvt0, model->BSIM4v7vcrit, &Check2); - if ((Check1 == 0) && (Check2 == 0)) - Check = 0; - else - Check = 1; - } - } - else - { vbd = DEVpnjlim(vbd, *(ckt->CKTstate0 + here->BSIM4v7vbd), - CONSTvt0, model->BSIM4v7vcrit, &Check); - vbs = vbd + vds; - if (here->BSIM4v7rbodyMod) - { vdbd = DEVpnjlim(vdbd, *(ckt->CKTstate0 + here->BSIM4v7vdbd), - CONSTvt0, model->BSIM4v7vcrit, &Check1); - vdbs = vdbd + vds; - vsbdo = *(ckt->CKTstate0 + here->BSIM4v7vsbs) - - *(ckt->CKTstate0 + here->BSIM4v7vds); - vsbd = vsbs - vds; - vsbd = DEVpnjlim(vsbd, vsbdo, CONSTvt0, model->BSIM4v7vcrit, &Check2); - vsbs = vsbd + vds; - if ((Check1 == 0) && (Check2 == 0)) - Check = 0; - else - Check = 1; - } - } - } - - /* Calculate DC currents and their derivatives */ - vbd = vbs - vds; - vgd = vgs - vds; - vgb = vgs - vbs; - vged = vges - vds; - vgmd = vgms - vds; - vgmb = vgms - vbs; - vdbd = vdbs - vds; - - vbs_jct = (!here->BSIM4v7rbodyMod) ? vbs : vsbs; - vbd_jct = (!here->BSIM4v7rbodyMod) ? vbd : vdbd; - - /* Source/drain junction diode DC model begins */ - Nvtms = model->BSIM4v7vtm * model->BSIM4v7SjctEmissionCoeff; -/* if ((here->BSIM4v7Aseff <= 0.0) && (here->BSIM4v7Pseff <= 0.0)) - { SourceSatCurrent = 1.0e-14; - } v4.7 */ - if ((here->BSIM4v7Aseff <= 0.0) && (here->BSIM4v7Pseff <= 0.0)) - { SourceSatCurrent = 0.0; - } - else - { SourceSatCurrent = here->BSIM4v7Aseff * model->BSIM4v7SjctTempSatCurDensity - + here->BSIM4v7Pseff * model->BSIM4v7SjctSidewallTempSatCurDensity - + pParam->BSIM4v7weffCJ * here->BSIM4v7nf - * model->BSIM4v7SjctGateSidewallTempSatCurDensity; - } - - if (SourceSatCurrent <= 0.0) - { here->BSIM4v7gbs = ckt->CKTgmin; - here->BSIM4v7cbs = here->BSIM4v7gbs * vbs_jct; - } - else - { switch(model->BSIM4v7dioMod) - { case 0: - evbs = exp(vbs_jct / Nvtms); - T1 = model->BSIM4v7xjbvs * exp(-(model->BSIM4v7bvs + vbs_jct) / Nvtms); - /* WDLiu: Magic T1 in this form; different from BSIM4v7 beta. */ - here->BSIM4v7gbs = SourceSatCurrent * (evbs + T1) / Nvtms + ckt->CKTgmin; - here->BSIM4v7cbs = SourceSatCurrent * (evbs + here->BSIM4v7XExpBVS - - T1 - 1.0) + ckt->CKTgmin * vbs_jct; - break; - case 1: - T2 = vbs_jct / Nvtms; - if (T2 < -EXP_THRESHOLD) - { here->BSIM4v7gbs = ckt->CKTgmin; - here->BSIM4v7cbs = SourceSatCurrent * (MIN_EXP - 1.0) - + ckt->CKTgmin * vbs_jct; - } - else if (vbs_jct <= here->BSIM4v7vjsmFwd) - { evbs = exp(T2); - here->BSIM4v7gbs = SourceSatCurrent * evbs / Nvtms + ckt->CKTgmin; - here->BSIM4v7cbs = SourceSatCurrent * (evbs - 1.0) - + ckt->CKTgmin * vbs_jct; - } - else - { T0 = here->BSIM4v7IVjsmFwd / Nvtms; - here->BSIM4v7gbs = T0 + ckt->CKTgmin; - here->BSIM4v7cbs = here->BSIM4v7IVjsmFwd - SourceSatCurrent + T0 - * (vbs_jct - here->BSIM4v7vjsmFwd) + ckt->CKTgmin * vbs_jct; - } - break; - case 2: - if (vbs_jct < here->BSIM4v7vjsmRev) - { T0 = vbs_jct / Nvtms; - if (T0 < -EXP_THRESHOLD) - { evbs = MIN_EXP; - devbs_dvb = 0.0; - } - else - { evbs = exp(T0); - devbs_dvb = evbs / Nvtms; - } - - T1 = evbs - 1.0; - T2 = here->BSIM4v7IVjsmRev + here->BSIM4v7SslpRev - * (vbs_jct - here->BSIM4v7vjsmRev); - here->BSIM4v7gbs = devbs_dvb * T2 + T1 * here->BSIM4v7SslpRev + ckt->CKTgmin; - here->BSIM4v7cbs = T1 * T2 + ckt->CKTgmin * vbs_jct; - } - else if (vbs_jct <= here->BSIM4v7vjsmFwd) - { T0 = vbs_jct / Nvtms; - if (T0 < -EXP_THRESHOLD) - { evbs = MIN_EXP; - devbs_dvb = 0.0; - } - else - { evbs = exp(T0); - devbs_dvb = evbs / Nvtms; - } - - T1 = (model->BSIM4v7bvs + vbs_jct) / Nvtms; - if (T1 > EXP_THRESHOLD) - { T2 = MIN_EXP; - T3 = 0.0; - } - else - { T2 = exp(-T1); - T3 = -T2 /Nvtms; - } - here->BSIM4v7gbs = SourceSatCurrent * (devbs_dvb - model->BSIM4v7xjbvs * T3) - + ckt->CKTgmin; - here->BSIM4v7cbs = SourceSatCurrent * (evbs + here->BSIM4v7XExpBVS - 1.0 - - model->BSIM4v7xjbvs * T2) + ckt->CKTgmin * vbs_jct; - } - else - { here->BSIM4v7gbs = here->BSIM4v7SslpFwd + ckt->CKTgmin; - here->BSIM4v7cbs = here->BSIM4v7IVjsmFwd + here->BSIM4v7SslpFwd * (vbs_jct - - here->BSIM4v7vjsmFwd) + ckt->CKTgmin * vbs_jct; - } - break; - default: break; - } - } - - Nvtmd = model->BSIM4v7vtm * model->BSIM4v7DjctEmissionCoeff; -/* if ((here->BSIM4v7Adeff <= 0.0) && (here->BSIM4v7Pdeff <= 0.0)) - { DrainSatCurrent = 1.0e-14; - } v4.7 */ - if ((here->BSIM4v7Adeff <= 0.0) && (here->BSIM4v7Pdeff <= 0.0)) - { DrainSatCurrent = 0.0; - } - else - { DrainSatCurrent = here->BSIM4v7Adeff * model->BSIM4v7DjctTempSatCurDensity - + here->BSIM4v7Pdeff * model->BSIM4v7DjctSidewallTempSatCurDensity - + pParam->BSIM4v7weffCJ * here->BSIM4v7nf - * model->BSIM4v7DjctGateSidewallTempSatCurDensity; - } - - if (DrainSatCurrent <= 0.0) - { here->BSIM4v7gbd = ckt->CKTgmin; - here->BSIM4v7cbd = here->BSIM4v7gbd * vbd_jct; - } - else - { switch(model->BSIM4v7dioMod) - { case 0: - evbd = exp(vbd_jct / Nvtmd); - T1 = model->BSIM4v7xjbvd * exp(-(model->BSIM4v7bvd + vbd_jct) / Nvtmd); - /* WDLiu: Magic T1 in this form; different from BSIM4v7 beta. */ - here->BSIM4v7gbd = DrainSatCurrent * (evbd + T1) / Nvtmd + ckt->CKTgmin; - here->BSIM4v7cbd = DrainSatCurrent * (evbd + here->BSIM4v7XExpBVD - - T1 - 1.0) + ckt->CKTgmin * vbd_jct; - break; - case 1: - T2 = vbd_jct / Nvtmd; - if (T2 < -EXP_THRESHOLD) - { here->BSIM4v7gbd = ckt->CKTgmin; - here->BSIM4v7cbd = DrainSatCurrent * (MIN_EXP - 1.0) - + ckt->CKTgmin * vbd_jct; - } - else if (vbd_jct <= here->BSIM4v7vjdmFwd) - { evbd = exp(T2); - here->BSIM4v7gbd = DrainSatCurrent * evbd / Nvtmd + ckt->CKTgmin; - here->BSIM4v7cbd = DrainSatCurrent * (evbd - 1.0) - + ckt->CKTgmin * vbd_jct; - } - else - { T0 = here->BSIM4v7IVjdmFwd / Nvtmd; - here->BSIM4v7gbd = T0 + ckt->CKTgmin; - here->BSIM4v7cbd = here->BSIM4v7IVjdmFwd - DrainSatCurrent + T0 - * (vbd_jct - here->BSIM4v7vjdmFwd) + ckt->CKTgmin * vbd_jct; - } - break; - case 2: - if (vbd_jct < here->BSIM4v7vjdmRev) - { T0 = vbd_jct / Nvtmd; - if (T0 < -EXP_THRESHOLD) - { evbd = MIN_EXP; - devbd_dvb = 0.0; - } - else - { evbd = exp(T0); - devbd_dvb = evbd / Nvtmd; - } - - T1 = evbd - 1.0; - T2 = here->BSIM4v7IVjdmRev + here->BSIM4v7DslpRev - * (vbd_jct - here->BSIM4v7vjdmRev); - here->BSIM4v7gbd = devbd_dvb * T2 + T1 * here->BSIM4v7DslpRev + ckt->CKTgmin; - here->BSIM4v7cbd = T1 * T2 + ckt->CKTgmin * vbd_jct; - } - else if (vbd_jct <= here->BSIM4v7vjdmFwd) - { T0 = vbd_jct / Nvtmd; - if (T0 < -EXP_THRESHOLD) - { evbd = MIN_EXP; - devbd_dvb = 0.0; - } - else - { evbd = exp(T0); - devbd_dvb = evbd / Nvtmd; - } - - T1 = (model->BSIM4v7bvd + vbd_jct) / Nvtmd; - if (T1 > EXP_THRESHOLD) - { T2 = MIN_EXP; - T3 = 0.0; - } - else - { T2 = exp(-T1); - T3 = -T2 /Nvtmd; - } - here->BSIM4v7gbd = DrainSatCurrent * (devbd_dvb - model->BSIM4v7xjbvd * T3) - + ckt->CKTgmin; - here->BSIM4v7cbd = DrainSatCurrent * (evbd + here->BSIM4v7XExpBVD - 1.0 - - model->BSIM4v7xjbvd * T2) + ckt->CKTgmin * vbd_jct; - } - else - { here->BSIM4v7gbd = here->BSIM4v7DslpFwd + ckt->CKTgmin; - here->BSIM4v7cbd = here->BSIM4v7IVjdmFwd + here->BSIM4v7DslpFwd * (vbd_jct - - here->BSIM4v7vjdmFwd) + ckt->CKTgmin * vbd_jct; - } - break; - default: break; - } - } - - /* trap-assisted tunneling and recombination current for reverse bias */ - Nvtmrssws = model->BSIM4v7vtm0 * model->BSIM4v7njtsswstemp; - Nvtmrsswgs = model->BSIM4v7vtm0 * model->BSIM4v7njtsswgstemp; - Nvtmrss = model->BSIM4v7vtm0 * model->BSIM4v7njtsstemp; - Nvtmrsswd = model->BSIM4v7vtm0 * model->BSIM4v7njtsswdtemp; - Nvtmrsswgd = model->BSIM4v7vtm0 * model->BSIM4v7njtsswgdtemp; - Nvtmrsd = model->BSIM4v7vtm0 * model->BSIM4v7njtsdtemp; - - if ((model->BSIM4v7vtss - vbs_jct) < (model->BSIM4v7vtss * 1e-3)) - { T9 = 1.0e3; - T0 = - vbs_jct / Nvtmrss * T9; - DEXP(T0, T1, T10); - dT1_dVb = T10 / Nvtmrss * T9; - } else { - T9 = 1.0 / (model->BSIM4v7vtss - vbs_jct); - T0 = -vbs_jct / Nvtmrss * model->BSIM4v7vtss * T9; - dT0_dVb = model->BSIM4v7vtss / Nvtmrss * (T9 + vbs_jct * T9 * T9) ; - DEXP(T0, T1, T10); - dT1_dVb = T10 * dT0_dVb; - } - - if ((model->BSIM4v7vtsd - vbd_jct) < (model->BSIM4v7vtsd * 1e-3) ) - { T9 = 1.0e3; - T0 = -vbd_jct / Nvtmrsd * T9; - DEXP(T0, T2, T10); - dT2_dVb = T10 / Nvtmrsd * T9; - } else { - T9 = 1.0 / (model->BSIM4v7vtsd - vbd_jct); - T0 = -vbd_jct / Nvtmrsd * model->BSIM4v7vtsd * T9; - dT0_dVb = model->BSIM4v7vtsd / Nvtmrsd * (T9 + vbd_jct * T9 * T9) ; - DEXP(T0, T2, T10); - dT2_dVb = T10 * dT0_dVb; - } - - if ((model->BSIM4v7vtssws - vbs_jct) < (model->BSIM4v7vtssws * 1e-3) ) - { T9 = 1.0e3; - T0 = -vbs_jct / Nvtmrssws * T9; - DEXP(T0, T3, T10); - dT3_dVb = T10 / Nvtmrssws * T9; - } else { - T9 = 1.0 / (model->BSIM4v7vtssws - vbs_jct); - T0 = -vbs_jct / Nvtmrssws * model->BSIM4v7vtssws * T9; - dT0_dVb = model->BSIM4v7vtssws / Nvtmrssws * (T9 + vbs_jct * T9 * T9) ; - DEXP(T0, T3, T10); - dT3_dVb = T10 * dT0_dVb; - } - - if ((model->BSIM4v7vtsswd - vbd_jct) < (model->BSIM4v7vtsswd * 1e-3) ) - { T9 = 1.0e3; - T0 = -vbd_jct / Nvtmrsswd * T9; - DEXP(T0, T4, T10); - dT4_dVb = T10 / Nvtmrsswd * T9; - } else { - T9 = 1.0 / (model->BSIM4v7vtsswd - vbd_jct); - T0 = -vbd_jct / Nvtmrsswd * model->BSIM4v7vtsswd * T9; - dT0_dVb = model->BSIM4v7vtsswd / Nvtmrsswd * (T9 + vbd_jct * T9 * T9) ; - DEXP(T0, T4, T10); - dT4_dVb = T10 * dT0_dVb; - } - - if ((model->BSIM4v7vtsswgs - vbs_jct) < (model->BSIM4v7vtsswgs * 1e-3) ) - { T9 = 1.0e3; - T0 = -vbs_jct / Nvtmrsswgs * T9; - DEXP(T0, T5, T10); - dT5_dVb = T10 / Nvtmrsswgs * T9; - } else { - T9 = 1.0 / (model->BSIM4v7vtsswgs - vbs_jct); - T0 = -vbs_jct / Nvtmrsswgs * model->BSIM4v7vtsswgs * T9; - dT0_dVb = model->BSIM4v7vtsswgs / Nvtmrsswgs * (T9 + vbs_jct * T9 * T9) ; - DEXP(T0, T5, T10); - dT5_dVb = T10 * dT0_dVb; - } - - if ((model->BSIM4v7vtsswgd - vbd_jct) < (model->BSIM4v7vtsswgd * 1e-3) ) - { T9 = 1.0e3; - T0 = -vbd_jct / Nvtmrsswgd * T9; - DEXP(T0, T6, T10); - dT6_dVb = T10 / Nvtmrsswgd * T9; - } else { - T9 = 1.0 / (model->BSIM4v7vtsswgd - vbd_jct); - T0 = -vbd_jct / Nvtmrsswgd * model->BSIM4v7vtsswgd * T9; - dT0_dVb = model->BSIM4v7vtsswgd / Nvtmrsswgd * (T9 + vbd_jct * T9 * T9) ; - DEXP(T0, T6, T10); - dT6_dVb = T10 * dT0_dVb; - } - - here->BSIM4v7gbs += here->BSIM4v7SjctTempRevSatCur * dT1_dVb - + here->BSIM4v7SswTempRevSatCur * dT3_dVb - + here->BSIM4v7SswgTempRevSatCur * dT5_dVb; - here->BSIM4v7cbs -= here->BSIM4v7SjctTempRevSatCur * (T1 - 1.0) - + here->BSIM4v7SswTempRevSatCur * (T3 - 1.0) - + here->BSIM4v7SswgTempRevSatCur * (T5 - 1.0); - here->BSIM4v7gbd += here->BSIM4v7DjctTempRevSatCur * dT2_dVb - + here->BSIM4v7DswTempRevSatCur * dT4_dVb - + here->BSIM4v7DswgTempRevSatCur * dT6_dVb; - here->BSIM4v7cbd -= here->BSIM4v7DjctTempRevSatCur * (T2 - 1.0) - + here->BSIM4v7DswTempRevSatCur * (T4 - 1.0) - + here->BSIM4v7DswgTempRevSatCur * (T6 - 1.0); - - /* End of diode DC model */ - - if (vds >= 0.0) - { here->BSIM4v7mode = 1; - Vds = vds; - Vgs = vgs; - Vbs = vbs; - Vdb = vds - vbs; /* WDLiu: for GIDL */ - - } - else - { here->BSIM4v7mode = -1; - Vds = -vds; - Vgs = vgd; - Vbs = vbd; - Vdb = -vbs; - } - - - /* dunga */ - if(model->BSIM4v7mtrlMod) - { - epsrox = 3.9; - toxe = model->BSIM4v7eot; - epssub = EPS0 * model->BSIM4v7epsrsub; - } - else - { - epsrox = model->BSIM4v7epsrox; - toxe = model->BSIM4v7toxe; - epssub = EPSSI; - } - - - T0 = Vbs - here->BSIM4v7vbsc - 0.001; - T1 = sqrt(T0 * T0 - 0.004 * here->BSIM4v7vbsc); - if (T0 >= 0.0) - { Vbseff = here->BSIM4v7vbsc + 0.5 * (T0 + T1); - dVbseff_dVb = 0.5 * (1.0 + T0 / T1); - } - else - { T2 = -0.002 / (T1 - T0); - Vbseff = here->BSIM4v7vbsc * (1.0 + T2); - dVbseff_dVb = T2 * here->BSIM4v7vbsc / T1; - } - - /* JX: Correction to forward body bias */ - T9 = 0.95 * pParam->BSIM4v7phi; - T0 = T9 - Vbseff - 0.001; - T1 = sqrt(T0 * T0 + 0.004 * T9); - Vbseff = T9 - 0.5 * (T0 + T1); - dVbseff_dVb *= 0.5 * (1.0 + T0 / T1); - Phis = pParam->BSIM4v7phi - Vbseff; - dPhis_dVb = -1.0; - sqrtPhis = sqrt(Phis); - dsqrtPhis_dVb = -0.5 / sqrtPhis; - - Xdep = pParam->BSIM4v7Xdep0 * sqrtPhis / pParam->BSIM4v7sqrtPhi; - dXdep_dVb = (pParam->BSIM4v7Xdep0 / pParam->BSIM4v7sqrtPhi) - * dsqrtPhis_dVb; - - Leff = pParam->BSIM4v7leff; - Vtm = model->BSIM4v7vtm; - Vtm0 = model->BSIM4v7vtm0; - - /* Vth Calculation */ - T3 = sqrt(Xdep); - V0 = pParam->BSIM4v7vbi - pParam->BSIM4v7phi; - - T0 = pParam->BSIM4v7dvt2 * Vbseff; - if (T0 >= - 0.5) - { T1 = 1.0 + T0; - T2 = pParam->BSIM4v7dvt2; - } - else - { T4 = 1.0 / (3.0 + 8.0 * T0); - T1 = (1.0 + 3.0 * T0) * T4; - T2 = pParam->BSIM4v7dvt2 * T4 * T4; - } - lt1 = model->BSIM4v7factor1 * T3 * T1; - dlt1_dVb = model->BSIM4v7factor1 * (0.5 / T3 * T1 * dXdep_dVb + T3 * T2); - - T0 = pParam->BSIM4v7dvt2w * Vbseff; - if (T0 >= - 0.5) - { T1 = 1.0 + T0; - T2 = pParam->BSIM4v7dvt2w; - } - else - { T4 = 1.0 / (3.0 + 8.0 * T0); - T1 = (1.0 + 3.0 * T0) * T4; - T2 = pParam->BSIM4v7dvt2w * T4 * T4; - } - ltw = model->BSIM4v7factor1 * T3 * T1; - dltw_dVb = model->BSIM4v7factor1 * (0.5 / T3 * T1 * dXdep_dVb + T3 * T2); - - T0 = pParam->BSIM4v7dvt1 * Leff / lt1; - if (T0 < EXP_THRESHOLD) - { T1 = exp(T0); - T2 = T1 - 1.0; - T3 = T2 * T2; - T4 = T3 + 2.0 * T1 * MIN_EXP; - Theta0 = T1 / T4; - dT1_dVb = -T0 * T1 * dlt1_dVb / lt1; - dTheta0_dVb = dT1_dVb * (T4 - 2.0 * T1 * (T2 + MIN_EXP)) / T4 / T4; - } - else - { Theta0 = 1.0 / (MAX_EXP - 2.0); /* 3.0 * MIN_EXP omitted */ - dTheta0_dVb = 0.0; - } - here->BSIM4v7thetavth = pParam->BSIM4v7dvt0 * Theta0; - Delt_vth = here->BSIM4v7thetavth * V0; - dDelt_vth_dVb = pParam->BSIM4v7dvt0 * dTheta0_dVb * V0; - - T0 = pParam->BSIM4v7dvt1w * pParam->BSIM4v7weff * Leff / ltw; - if (T0 < EXP_THRESHOLD) - { T1 = exp(T0); - T2 = T1 - 1.0; - T3 = T2 * T2; - T4 = T3 + 2.0 * T1 * MIN_EXP; - T5 = T1 / T4; - dT1_dVb = -T0 * T1 * dltw_dVb / ltw; - dT5_dVb = dT1_dVb * (T4 - 2.0 * T1 * (T2 + MIN_EXP)) / T4 / T4; - } - else - { T5 = 1.0 / (MAX_EXP - 2.0); /* 3.0 * MIN_EXP omitted */ - dT5_dVb = 0.0; - } - T0 = pParam->BSIM4v7dvt0w * T5; - T2 = T0 * V0; - dT2_dVb = pParam->BSIM4v7dvt0w * dT5_dVb * V0; - - TempRatio = ckt->CKTtemp / model->BSIM4v7tnom - 1.0; - T0 = sqrt(1.0 + pParam->BSIM4v7lpe0 / Leff); - T1 = pParam->BSIM4v7k1ox * (T0 - 1.0) * pParam->BSIM4v7sqrtPhi - + (pParam->BSIM4v7kt1 + pParam->BSIM4v7kt1l / Leff - + pParam->BSIM4v7kt2 * Vbseff) * TempRatio; - Vth_NarrowW = toxe * pParam->BSIM4v7phi - / (pParam->BSIM4v7weff + pParam->BSIM4v7w0); - - T3 = here->BSIM4v7eta0 + pParam->BSIM4v7etab * Vbseff; - if (T3 < 1.0e-4) - { T9 = 1.0 / (3.0 - 2.0e4 * T3); - T3 = (2.0e-4 - T3) * T9; - T4 = T9 * T9; - } - else - { T4 = 1.0; - } - dDIBL_Sft_dVd = T3 * pParam->BSIM4v7theta0vb0; - DIBL_Sft = dDIBL_Sft_dVd * Vds; - - Lpe_Vb = sqrt(1.0 + pParam->BSIM4v7lpeb / Leff); - - Vth = model->BSIM4v7type * here->BSIM4v7vth0 + (pParam->BSIM4v7k1ox * sqrtPhis - - pParam->BSIM4v7k1 * pParam->BSIM4v7sqrtPhi) * Lpe_Vb - - here->BSIM4v7k2ox * Vbseff - Delt_vth - T2 + (pParam->BSIM4v7k3 - + pParam->BSIM4v7k3b * Vbseff) * Vth_NarrowW + T1 - DIBL_Sft; - - dVth_dVb = Lpe_Vb * pParam->BSIM4v7k1ox * dsqrtPhis_dVb - here->BSIM4v7k2ox - - dDelt_vth_dVb - dT2_dVb + pParam->BSIM4v7k3b * Vth_NarrowW - - pParam->BSIM4v7etab * Vds * pParam->BSIM4v7theta0vb0 * T4 - + pParam->BSIM4v7kt2 * TempRatio; - dVth_dVd = -dDIBL_Sft_dVd; - - - /* Calculate n */ - tmp1 = epssub / Xdep; - here->BSIM4v7nstar = model->BSIM4v7vtm / Charge_q * (model->BSIM4v7coxe - + tmp1 + pParam->BSIM4v7cit); - tmp2 = pParam->BSIM4v7nfactor * tmp1; - tmp3 = pParam->BSIM4v7cdsc + pParam->BSIM4v7cdscb * Vbseff - + pParam->BSIM4v7cdscd * Vds; - tmp4 = (tmp2 + tmp3 * Theta0 + pParam->BSIM4v7cit) / model->BSIM4v7coxe; - if (tmp4 >= -0.5) - { n = 1.0 + tmp4; - dn_dVb = (-tmp2 / Xdep * dXdep_dVb + tmp3 * dTheta0_dVb - + pParam->BSIM4v7cdscb * Theta0) / model->BSIM4v7coxe; - dn_dVd = pParam->BSIM4v7cdscd * Theta0 / model->BSIM4v7coxe; - } - else - { T0 = 1.0 / (3.0 + 8.0 * tmp4); - n = (1.0 + 3.0 * tmp4) * T0; - T0 *= T0; - dn_dVb = (-tmp2 / Xdep * dXdep_dVb + tmp3 * dTheta0_dVb - + pParam->BSIM4v7cdscb * Theta0) / model->BSIM4v7coxe * T0; - dn_dVd = pParam->BSIM4v7cdscd * Theta0 / model->BSIM4v7coxe * T0; - } - - - /* Vth correction for Pocket implant */ - if (pParam->BSIM4v7dvtp0 > 0.0) - { T0 = -pParam->BSIM4v7dvtp1 * Vds; - if (T0 < -EXP_THRESHOLD) - { T2 = MIN_EXP; - dT2_dVd = 0.0; - } - else - { T2 = exp(T0); - dT2_dVd = -pParam->BSIM4v7dvtp1 * T2; - } - - T3 = Leff + pParam->BSIM4v7dvtp0 * (1.0 + T2); - dT3_dVd = pParam->BSIM4v7dvtp0 * dT2_dVd; - if (model->BSIM4v7tempMod < 2) - { - T4 = Vtm * log(Leff / T3); - dT4_dVd = -Vtm * dT3_dVd / T3; - } - else - { - T4 = model->BSIM4v7vtm0 * log(Leff / T3); - dT4_dVd = -model->BSIM4v7vtm0 * dT3_dVd / T3; - } - dDITS_Sft_dVd = dn_dVd * T4 + n * dT4_dVd; - dDITS_Sft_dVb = T4 * dn_dVb; - - Vth -= n * T4; - dVth_dVd -= dDITS_Sft_dVd; - dVth_dVb -= dDITS_Sft_dVb; - } - - /* v4.7 DITS_SFT2 */ - if ((pParam->BSIM4v7dvtp4 == 0.0) || (pParam->BSIM4v7dvtp2factor == 0.0)) { - T0 = 0.0; - DITS_Sft2 = 0.0; - } - else - { - //T0 = exp(2.0 * pParam->BSIM4v7dvtp4 * Vds); /* beta code */ - T1 = 2.0 * pParam->BSIM4v7dvtp4 * Vds; - DEXP(T1, T0, T10); - DITS_Sft2 = pParam->BSIM4v7dvtp2factor * (T0-1) / (T0+1); - //dDITS_Sft2_dVd = pParam->BSIM4v7dvtp2factor * pParam->BSIM4v7dvtp4 * 4.0 * T0 / ((T0+1) * (T0+1)); /* beta code */ - dDITS_Sft2_dVd = pParam->BSIM4v7dvtp2factor * pParam->BSIM4v7dvtp4 * 4.0 * T10 / ((T0+1) * (T0+1)); - Vth -= DITS_Sft2; - dVth_dVd -= dDITS_Sft2_dVd; - } - - - - here->BSIM4v7von = Vth; - - - /* Poly Gate Si Depletion Effect */ - T0 = here->BSIM4v7vfb + pParam->BSIM4v7phi; - if(model->BSIM4v7mtrlMod == 0) - T1 = EPSSI; - else - T1 = model->BSIM4v7epsrgate * EPS0; - - - BSIM4v7polyDepletion(T0, pParam->BSIM4v7ngate, T1, model->BSIM4v7coxe, vgs, &vgs_eff, &dvgs_eff_dvg); - - BSIM4v7polyDepletion(T0, pParam->BSIM4v7ngate, T1, model->BSIM4v7coxe, vgd, &vgd_eff, &dvgd_eff_dvg); - - if(here->BSIM4v7mode>0) { - Vgs_eff = vgs_eff; - dVgs_eff_dVg = dvgs_eff_dvg; - } else { - Vgs_eff = vgd_eff; - dVgs_eff_dVg = dvgd_eff_dvg; - } - here->BSIM4v7vgs_eff = vgs_eff; - here->BSIM4v7vgd_eff = vgd_eff; - here->BSIM4v7dvgs_eff_dvg = dvgs_eff_dvg; - here->BSIM4v7dvgd_eff_dvg = dvgd_eff_dvg; - - - Vgst = Vgs_eff - Vth; - - /* Calculate Vgsteff */ - T0 = n * Vtm; - T1 = pParam->BSIM4v7mstar * Vgst; - T2 = T1 / T0; - if (T2 > EXP_THRESHOLD) - { T10 = T1; - dT10_dVg = pParam->BSIM4v7mstar * dVgs_eff_dVg; - dT10_dVd = -dVth_dVd * pParam->BSIM4v7mstar; - dT10_dVb = -dVth_dVb * pParam->BSIM4v7mstar; - } - else if (T2 < -EXP_THRESHOLD) - { T10 = Vtm * log(1.0 + MIN_EXP); - dT10_dVg = 0.0; - dT10_dVd = T10 * dn_dVd; - dT10_dVb = T10 * dn_dVb; - T10 *= n; - } - else - { ExpVgst = exp(T2); - T3 = Vtm * log(1.0 + ExpVgst); - T10 = n * T3; - dT10_dVg = pParam->BSIM4v7mstar * ExpVgst / (1.0 + ExpVgst); - dT10_dVb = T3 * dn_dVb - dT10_dVg * (dVth_dVb + Vgst * dn_dVb / n); - dT10_dVd = T3 * dn_dVd - dT10_dVg * (dVth_dVd + Vgst * dn_dVd / n); - dT10_dVg *= dVgs_eff_dVg; - } - - T1 = pParam->BSIM4v7voffcbn - (1.0 - pParam->BSIM4v7mstar) * Vgst; - T2 = T1 / T0; - if (T2 < -EXP_THRESHOLD) - { T3 = model->BSIM4v7coxe * MIN_EXP / pParam->BSIM4v7cdep0; - T9 = pParam->BSIM4v7mstar + T3 * n; - dT9_dVg = 0.0; - dT9_dVd = dn_dVd * T3; - dT9_dVb = dn_dVb * T3; - } - else if (T2 > EXP_THRESHOLD) - { T3 = model->BSIM4v7coxe * MAX_EXP / pParam->BSIM4v7cdep0; - T9 = pParam->BSIM4v7mstar + T3 * n; - dT9_dVg = 0.0; - dT9_dVd = dn_dVd * T3; - dT9_dVb = dn_dVb * T3; - } - else - { ExpVgst = exp(T2); - T3 = model->BSIM4v7coxe / pParam->BSIM4v7cdep0; - T4 = T3 * ExpVgst; - T5 = T1 * T4 / T0; - T9 = pParam->BSIM4v7mstar + n * T4; - dT9_dVg = T3 * (pParam->BSIM4v7mstar - 1.0) * ExpVgst / Vtm; - dT9_dVb = T4 * dn_dVb - dT9_dVg * dVth_dVb - T5 * dn_dVb; - dT9_dVd = T4 * dn_dVd - dT9_dVg * dVth_dVd - T5 * dn_dVd; - dT9_dVg *= dVgs_eff_dVg; - } - here->BSIM4v7Vgsteff = Vgsteff = T10 / T9; - T11 = T9 * T9; - dVgsteff_dVg = (T9 * dT10_dVg - T10 * dT9_dVg) / T11; - dVgsteff_dVd = (T9 * dT10_dVd - T10 * dT9_dVd) / T11; - dVgsteff_dVb = (T9 * dT10_dVb - T10 * dT9_dVb) / T11; - - /* Calculate Effective Channel Geometry */ - T9 = sqrtPhis - pParam->BSIM4v7sqrtPhi; - Weff = pParam->BSIM4v7weff - 2.0 * (pParam->BSIM4v7dwg * Vgsteff - + pParam->BSIM4v7dwb * T9); - dWeff_dVg = -2.0 * pParam->BSIM4v7dwg; - dWeff_dVb = -2.0 * pParam->BSIM4v7dwb * dsqrtPhis_dVb; - - if (Weff < 2.0e-8) /* to avoid the discontinuity problem due to Weff*/ - { T0 = 1.0 / (6.0e-8 - 2.0 * Weff); - Weff = 2.0e-8 * (4.0e-8 - Weff) * T0; - T0 *= T0 * 4.0e-16; - dWeff_dVg *= T0; - dWeff_dVb *= T0; - } - - if (model->BSIM4v7rdsMod == 1) - Rds = dRds_dVg = dRds_dVb = 0.0; - else - { T0 = 1.0 + pParam->BSIM4v7prwg * Vgsteff; - dT0_dVg = -pParam->BSIM4v7prwg / T0 / T0; - T1 = pParam->BSIM4v7prwb * T9; - dT1_dVb = pParam->BSIM4v7prwb * dsqrtPhis_dVb; - - T2 = 1.0 / T0 + T1; - T3 = T2 + sqrt(T2 * T2 + 0.01); /* 0.01 = 4.0 * 0.05 * 0.05 */ - dT3_dVg = 1.0 + T2 / (T3 - T2); - dT3_dVb = dT3_dVg * dT1_dVb; - dT3_dVg *= dT0_dVg; - - T4 = pParam->BSIM4v7rds0 * 0.5; - Rds = pParam->BSIM4v7rdswmin + T3 * T4; - dRds_dVg = T4 * dT3_dVg; - dRds_dVb = T4 * dT3_dVb; - - if (Rds > 0.0) - here->BSIM4v7grdsw = 1.0 / Rds* here->BSIM4v7nf; /*4.6.2*/ - else - here->BSIM4v7grdsw = 0.0; - } - - /* Calculate Abulk */ - T9 = 0.5 * pParam->BSIM4v7k1ox * Lpe_Vb / sqrtPhis; - T1 = T9 + here->BSIM4v7k2ox - pParam->BSIM4v7k3b * Vth_NarrowW; - dT1_dVb = -T9 / sqrtPhis * dsqrtPhis_dVb; - - T9 = sqrt(pParam->BSIM4v7xj * Xdep); - tmp1 = Leff + 2.0 * T9; - T5 = Leff / tmp1; - tmp2 = pParam->BSIM4v7a0 * T5; - tmp3 = pParam->BSIM4v7weff + pParam->BSIM4v7b1; - tmp4 = pParam->BSIM4v7b0 / tmp3; - T2 = tmp2 + tmp4; - dT2_dVb = -T9 / tmp1 / Xdep * dXdep_dVb; - T6 = T5 * T5; - T7 = T5 * T6; - - Abulk0 = 1.0 + T1 * T2; - dAbulk0_dVb = T1 * tmp2 * dT2_dVb + T2 * dT1_dVb; - - T8 = pParam->BSIM4v7ags * pParam->BSIM4v7a0 * T7; - dAbulk_dVg = -T1 * T8; - Abulk = Abulk0 + dAbulk_dVg * Vgsteff; - dAbulk_dVb = dAbulk0_dVb - T8 * Vgsteff * (dT1_dVb - + 3.0 * T1 * dT2_dVb); - - if (Abulk0 < 0.1) /* added to avoid the problems caused by Abulk0 */ - { T9 = 1.0 / (3.0 - 20.0 * Abulk0); - Abulk0 = (0.2 - Abulk0) * T9; - dAbulk0_dVb *= T9 * T9; - } - - if (Abulk < 0.1) - { T9 = 1.0 / (3.0 - 20.0 * Abulk); - Abulk = (0.2 - Abulk) * T9; - T10 = T9 * T9; - dAbulk_dVb *= T10; - dAbulk_dVg *= T10; - } - here->BSIM4v7Abulk = Abulk; - - T2 = pParam->BSIM4v7keta * Vbseff; - if (T2 >= -0.9) - { T0 = 1.0 / (1.0 + T2); - dT0_dVb = -pParam->BSIM4v7keta * T0 * T0; - } - else - { T1 = 1.0 / (0.8 + T2); - T0 = (17.0 + 20.0 * T2) * T1; - dT0_dVb = -pParam->BSIM4v7keta * T1 * T1; - } - dAbulk_dVg *= T0; - dAbulk_dVb = dAbulk_dVb * T0 + Abulk * dT0_dVb; - dAbulk0_dVb = dAbulk0_dVb * T0 + Abulk0 * dT0_dVb; - Abulk *= T0; - Abulk0 *= T0; - - /* Mobility calculation */ - if (model->BSIM4v7mtrlMod && model->BSIM4v7mtrlCompatMod == 0) - T14 = 2.0 * model->BSIM4v7type *(model->BSIM4v7phig - model->BSIM4v7easub - 0.5*model->BSIM4v7Eg0 + 0.45); - else - T14 = 0.0; - - if (model->BSIM4v7mobMod == 0) - { T0 = Vgsteff + Vth + Vth - T14; - T2 = pParam->BSIM4v7ua + pParam->BSIM4v7uc * Vbseff; - T3 = T0 / toxe; - T12 = sqrt(Vth * Vth + 0.0001); - T9 = 1.0/(Vgsteff + 2*T12); - T10 = T9*toxe; - T8 = pParam->BSIM4v7ud * T10 * T10 * Vth; - T6 = T8 * Vth; - T5 = T3 * (T2 + pParam->BSIM4v7ub * T3) + T6; - T7 = - 2.0 * T6 * T9; - T11 = T7 * Vth/T12; - dDenomi_dVg = (T2 + 2.0 * pParam->BSIM4v7ub * T3) / toxe; - T13 = 2.0 * (dDenomi_dVg + T11 + T8); - dDenomi_dVd = T13 * dVth_dVd; - dDenomi_dVb = T13 * dVth_dVb + pParam->BSIM4v7uc * T3; - dDenomi_dVg+= T7; - } - else if (model->BSIM4v7mobMod == 1) - { T0 = Vgsteff + Vth + Vth - T14; - T2 = 1.0 + pParam->BSIM4v7uc * Vbseff; - T3 = T0 / toxe; - T4 = T3 * (pParam->BSIM4v7ua + pParam->BSIM4v7ub * T3); - T12 = sqrt(Vth * Vth + 0.0001); - T9 = 1.0/(Vgsteff + 2*T12); - T10 = T9*toxe; - T8 = pParam->BSIM4v7ud * T10 * T10 * Vth; - T6 = T8 * Vth; - T5 = T4 * T2 + T6; - T7 = - 2.0 * T6 * T9; - T11 = T7 * Vth/T12; - dDenomi_dVg = (pParam->BSIM4v7ua + 2.0 * pParam->BSIM4v7ub * T3) * T2 / toxe; - T13 = 2.0 * (dDenomi_dVg + T11 + T8); - dDenomi_dVd = T13 * dVth_dVd; - dDenomi_dVb = T13 * dVth_dVb + pParam->BSIM4v7uc * T4; - dDenomi_dVg+= T7; - } - else if (model->BSIM4v7mobMod == 2) - { T0 = (Vgsteff + here->BSIM4v7vtfbphi1) / toxe; - T1 = exp(pParam->BSIM4v7eu * log(T0)); - dT1_dVg = T1 * pParam->BSIM4v7eu / T0 / toxe; - T2 = pParam->BSIM4v7ua + pParam->BSIM4v7uc * Vbseff; - T3 = T0 / toxe; /*Do we need it?*/ - - T12 = sqrt(Vth * Vth + 0.0001); - T9 = 1.0/(Vgsteff + 2*T12); - T10 = T9*toxe; - T8 = pParam->BSIM4v7ud * T10 * T10 * Vth; - T6 = T8 * Vth; - T5 = T1 * T2 + T6; - T7 = - 2.0 * T6 * T9; - T11 = T7 * Vth/T12; - dDenomi_dVg = T2 * dT1_dVg + T7; - T13 = 2.0 * (T11 + T8); - dDenomi_dVd = T13 * dVth_dVd; - dDenomi_dVb = T13 * dVth_dVb + T1 * pParam->BSIM4v7uc; - } - /*high K mobility*/ - else - { - - - /*univsersal mobility*/ - T0 = (Vgsteff + here->BSIM4v7vtfbphi1)* 1.0e-8 / toxe/6.0; - T1 = exp(pParam->BSIM4v7eu * log(T0)); - dT1_dVg = T1 * pParam->BSIM4v7eu * 1.0e-8/ T0 / toxe/6.0; - T2 = pParam->BSIM4v7ua + pParam->BSIM4v7uc * Vbseff; - - /*Coulombic*/ - VgsteffVth = pParam->BSIM4v7VgsteffVth; - - T10 = exp(pParam->BSIM4v7ucs * log(0.5 + 0.5 * Vgsteff/VgsteffVth)); - T11 = pParam->BSIM4v7ud/T10; - dT11_dVg = - 0.5 * pParam->BSIM4v7ucs * T11 /(0.5 + 0.5*Vgsteff/VgsteffVth)/VgsteffVth; - - dDenomi_dVg = T2 * dT1_dVg + dT11_dVg; - dDenomi_dVd = 0.0; - dDenomi_dVb = T1 * pParam->BSIM4v7uc; - - T5 = T1 * T2 + T11; - } - - - - - - if (T5 >= -0.8) - { Denomi = 1.0 + T5; - } - else - { T9 = 1.0 / (7.0 + 10.0 * T5); - Denomi = (0.6 + T5) * T9; - T9 *= T9; - dDenomi_dVg *= T9; - dDenomi_dVd *= T9; - dDenomi_dVb *= T9; - } - - - here->BSIM4v7ueff = ueff = here->BSIM4v7u0temp / Denomi; - T9 = -ueff / Denomi; - dueff_dVg = T9 * dDenomi_dVg; - dueff_dVd = T9 * dDenomi_dVd; - dueff_dVb = T9 * dDenomi_dVb; - - /* Saturation Drain Voltage Vdsat */ - WVCox = Weff * here->BSIM4v7vsattemp * model->BSIM4v7coxe; - WVCoxRds = WVCox * Rds; - - Esat = 2.0 * here->BSIM4v7vsattemp / ueff; - here->BSIM4v7EsatL = EsatL = Esat * Leff; - T0 = -EsatL /ueff; - dEsatL_dVg = T0 * dueff_dVg; - dEsatL_dVd = T0 * dueff_dVd; - dEsatL_dVb = T0 * dueff_dVb; - - /* Sqrt() */ - a1 = pParam->BSIM4v7a1; - if (a1 == 0.0) - { Lambda = pParam->BSIM4v7a2; - dLambda_dVg = 0.0; - } - else if (a1 > 0.0) - { T0 = 1.0 - pParam->BSIM4v7a2; - T1 = T0 - pParam->BSIM4v7a1 * Vgsteff - 0.0001; - T2 = sqrt(T1 * T1 + 0.0004 * T0); - Lambda = pParam->BSIM4v7a2 + T0 - 0.5 * (T1 + T2); - dLambda_dVg = 0.5 * pParam->BSIM4v7a1 * (1.0 + T1 / T2); - } - else - { T1 = pParam->BSIM4v7a2 + pParam->BSIM4v7a1 * Vgsteff - 0.0001; - T2 = sqrt(T1 * T1 + 0.0004 * pParam->BSIM4v7a2); - Lambda = 0.5 * (T1 + T2); - dLambda_dVg = 0.5 * pParam->BSIM4v7a1 * (1.0 + T1 / T2); - } - - Vgst2Vtm = Vgsteff + 2.0 * Vtm; - if (Rds > 0) - { tmp2 = dRds_dVg / Rds + dWeff_dVg / Weff; - tmp3 = dRds_dVb / Rds + dWeff_dVb / Weff; - } - else - { tmp2 = dWeff_dVg / Weff; - tmp3 = dWeff_dVb / Weff; - } - if ((Rds == 0.0) && (Lambda == 1.0)) - { T0 = 1.0 / (Abulk * EsatL + Vgst2Vtm); - tmp1 = 0.0; - T1 = T0 * T0; - T2 = Vgst2Vtm * T0; - T3 = EsatL * Vgst2Vtm; - Vdsat = T3 * T0; - - dT0_dVg = -(Abulk * dEsatL_dVg + EsatL * dAbulk_dVg + 1.0) * T1; - dT0_dVd = -(Abulk * dEsatL_dVd) * T1; - dT0_dVb = -(Abulk * dEsatL_dVb + dAbulk_dVb * EsatL) * T1; - - dVdsat_dVg = T3 * dT0_dVg + T2 * dEsatL_dVg + EsatL * T0; - dVdsat_dVd = T3 * dT0_dVd + T2 * dEsatL_dVd; - dVdsat_dVb = T3 * dT0_dVb + T2 * dEsatL_dVb; - } - else - { tmp1 = dLambda_dVg / (Lambda * Lambda); - T9 = Abulk * WVCoxRds; - T8 = Abulk * T9; - T7 = Vgst2Vtm * T9; - T6 = Vgst2Vtm * WVCoxRds; - T0 = 2.0 * Abulk * (T9 - 1.0 + 1.0 / Lambda); - dT0_dVg = 2.0 * (T8 * tmp2 - Abulk * tmp1 - + (2.0 * T9 + 1.0 / Lambda - 1.0) * dAbulk_dVg); - - dT0_dVb = 2.0 * (T8 * (2.0 / Abulk * dAbulk_dVb + tmp3) - + (1.0 / Lambda - 1.0) * dAbulk_dVb); - dT0_dVd = 0.0; - T1 = Vgst2Vtm * (2.0 / Lambda - 1.0) + Abulk * EsatL + 3.0 * T7; - - dT1_dVg = (2.0 / Lambda - 1.0) - 2.0 * Vgst2Vtm * tmp1 - + Abulk * dEsatL_dVg + EsatL * dAbulk_dVg + 3.0 * (T9 - + T7 * tmp2 + T6 * dAbulk_dVg); - dT1_dVb = Abulk * dEsatL_dVb + EsatL * dAbulk_dVb - + 3.0 * (T6 * dAbulk_dVb + T7 * tmp3); - dT1_dVd = Abulk * dEsatL_dVd; - - T2 = Vgst2Vtm * (EsatL + 2.0 * T6); - dT2_dVg = EsatL + Vgst2Vtm * dEsatL_dVg - + T6 * (4.0 + 2.0 * Vgst2Vtm * tmp2); - dT2_dVb = Vgst2Vtm * (dEsatL_dVb + 2.0 * T6 * tmp3); - dT2_dVd = Vgst2Vtm * dEsatL_dVd; - - T3 = sqrt(T1 * T1 - 2.0 * T0 * T2); - Vdsat = (T1 - T3) / T0; - - dT3_dVg = (T1 * dT1_dVg - 2.0 * (T0 * dT2_dVg + T2 * dT0_dVg)) - / T3; - dT3_dVd = (T1 * dT1_dVd - 2.0 * (T0 * dT2_dVd + T2 * dT0_dVd)) - / T3; - dT3_dVb = (T1 * dT1_dVb - 2.0 * (T0 * dT2_dVb + T2 * dT0_dVb)) - / T3; - - dVdsat_dVg = (dT1_dVg - (T1 * dT1_dVg - dT0_dVg * T2 - - T0 * dT2_dVg) / T3 - Vdsat * dT0_dVg) / T0; - dVdsat_dVb = (dT1_dVb - (T1 * dT1_dVb - dT0_dVb * T2 - - T0 * dT2_dVb) / T3 - Vdsat * dT0_dVb) / T0; - dVdsat_dVd = (dT1_dVd - (T1 * dT1_dVd - T0 * dT2_dVd) / T3) / T0; - } - here->BSIM4v7vdsat = Vdsat; - - /* Calculate Vdseff */ - T1 = Vdsat - Vds - pParam->BSIM4v7delta; - dT1_dVg = dVdsat_dVg; - dT1_dVd = dVdsat_dVd - 1.0; - dT1_dVb = dVdsat_dVb; - - T2 = sqrt(T1 * T1 + 4.0 * pParam->BSIM4v7delta * Vdsat); - T0 = T1 / T2; - T9 = 2.0 * pParam->BSIM4v7delta; - T3 = T9 / T2; - dT2_dVg = T0 * dT1_dVg + T3 * dVdsat_dVg; - dT2_dVd = T0 * dT1_dVd + T3 * dVdsat_dVd; - dT2_dVb = T0 * dT1_dVb + T3 * dVdsat_dVb; - - if (T1 >= 0.0) - { Vdseff = Vdsat - 0.5 * (T1 + T2); - dVdseff_dVg = dVdsat_dVg - 0.5 * (dT1_dVg + dT2_dVg); - dVdseff_dVd = dVdsat_dVd - 0.5 * (dT1_dVd + dT2_dVd); - dVdseff_dVb = dVdsat_dVb - 0.5 * (dT1_dVb + dT2_dVb); - } - else - { T4 = T9 / (T2 - T1); - T5 = 1.0 - T4; - T6 = Vdsat * T4 / (T2 - T1); - Vdseff = Vdsat * T5; - dVdseff_dVg = dVdsat_dVg * T5 + T6 * (dT2_dVg - dT1_dVg); - dVdseff_dVd = dVdsat_dVd * T5 + T6 * (dT2_dVd - dT1_dVd); - dVdseff_dVb = dVdsat_dVb * T5 + T6 * (dT2_dVb - dT1_dVb); - } - - if (Vds == 0.0) - { Vdseff = 0.0; - dVdseff_dVg = 0.0; - dVdseff_dVb = 0.0; - } - - if (Vdseff > Vds) - Vdseff = Vds; - diffVds = Vds - Vdseff; - here->BSIM4v7Vdseff = Vdseff; - - /* Velocity Overshoot */ - if((model->BSIM4v7lambdaGiven) && (model->BSIM4v7lambda > 0.0) ) - { - T1 = Leff * ueff; - T2 = pParam->BSIM4v7lambda / T1; - T3 = -T2 / T1 * Leff; - dT2_dVd = T3 * dueff_dVd; - dT2_dVg = T3 * dueff_dVg; - dT2_dVb = T3 * dueff_dVb; - T5 = 1.0 / (Esat * pParam->BSIM4v7litl); - T4 = -T5 / EsatL; - dT5_dVg = dEsatL_dVg * T4; - dT5_dVd = dEsatL_dVd * T4; - dT5_dVb = dEsatL_dVb * T4; - T6 = 1.0 + diffVds * T5; - dT6_dVg = dT5_dVg * diffVds - dVdseff_dVg * T5; - dT6_dVd = dT5_dVd * diffVds + (1.0 - dVdseff_dVd) * T5; - dT6_dVb = dT5_dVb * diffVds - dVdseff_dVb * T5; - T7 = 2.0 / (T6 * T6 + 1.0); - T8 = 1.0 - T7; - T9 = T6 * T7 * T7; - dT8_dVg = T9 * dT6_dVg; - dT8_dVd = T9 * dT6_dVd; - dT8_dVb = T9 * dT6_dVb; - T10 = 1.0 + T2 * T8; - dT10_dVg = dT2_dVg * T8 + T2 * dT8_dVg; - dT10_dVd = dT2_dVd * T8 + T2 * dT8_dVd; - dT10_dVb = dT2_dVb * T8 + T2 * dT8_dVb; - if(T10 == 1.0) - dT10_dVg = dT10_dVd = dT10_dVb = 0.0; - - dEsatL_dVg *= T10; - dEsatL_dVg += EsatL * dT10_dVg; - dEsatL_dVd *= T10; - dEsatL_dVd += EsatL * dT10_dVd; - dEsatL_dVb *= T10; - dEsatL_dVb += EsatL * dT10_dVb; - EsatL *= T10; - Esat = EsatL / Leff; /* bugfix by Wenwei Yang (4.6.4) */ - here->BSIM4v7EsatL = EsatL; - } - - /* Calculate Vasat */ - tmp4 = 1.0 - 0.5 * Abulk * Vdsat / Vgst2Vtm; - T9 = WVCoxRds * Vgsteff; - T8 = T9 / Vgst2Vtm; - T0 = EsatL + Vdsat + 2.0 * T9 * tmp4; - - T7 = 2.0 * WVCoxRds * tmp4; - dT0_dVg = dEsatL_dVg + dVdsat_dVg + T7 * (1.0 + tmp2 * Vgsteff) - - T8 * (Abulk * dVdsat_dVg - Abulk * Vdsat / Vgst2Vtm - + Vdsat * dAbulk_dVg); - - dT0_dVb = dEsatL_dVb + dVdsat_dVb + T7 * tmp3 * Vgsteff - - T8 * (dAbulk_dVb * Vdsat + Abulk * dVdsat_dVb); - dT0_dVd = dEsatL_dVd + dVdsat_dVd - T8 * Abulk * dVdsat_dVd; - - T9 = WVCoxRds * Abulk; - T1 = 2.0 / Lambda - 1.0 + T9; - dT1_dVg = -2.0 * tmp1 + WVCoxRds * (Abulk * tmp2 + dAbulk_dVg); - dT1_dVb = dAbulk_dVb * WVCoxRds + T9 * tmp3; - - Vasat = T0 / T1; - dVasat_dVg = (dT0_dVg - Vasat * dT1_dVg) / T1; - dVasat_dVb = (dT0_dVb - Vasat * dT1_dVb) / T1; - dVasat_dVd = dT0_dVd / T1; - - /* Calculate Idl first */ - - tmp1 = here->BSIM4v7vtfbphi2; - tmp2 = 2.0e8 * model->BSIM4v7toxp; - dT0_dVg = 1.0 / tmp2; - T0 = (Vgsteff + tmp1) * dT0_dVg; - - tmp3 = exp(model->BSIM4v7bdos * 0.7 * log(T0)); - T1 = 1.0 + tmp3; - T2 = model->BSIM4v7bdos * 0.7 * tmp3 / T0; - Tcen = model->BSIM4v7ados * 1.9e-9 / T1; - dTcen_dVg = -Tcen * T2 * dT0_dVg / T1; - - Coxeff = epssub * model->BSIM4v7coxp - / (epssub + model->BSIM4v7coxp * Tcen); - here->BSIM4v7Coxeff = Coxeff; - dCoxeff_dVg = -Coxeff * Coxeff * dTcen_dVg / epssub; - - CoxeffWovL = Coxeff * Weff / Leff; - beta = ueff * CoxeffWovL; - T3 = ueff / Leff; - dbeta_dVg = CoxeffWovL * dueff_dVg + T3 - * (Weff * dCoxeff_dVg + Coxeff * dWeff_dVg); - dbeta_dVd = CoxeffWovL * dueff_dVd; - dbeta_dVb = CoxeffWovL * dueff_dVb + T3 * Coxeff * dWeff_dVb; - - here->BSIM4v7AbovVgst2Vtm = Abulk / Vgst2Vtm; - T0 = 1.0 - 0.5 * Vdseff * here->BSIM4v7AbovVgst2Vtm; - dT0_dVg = -0.5 * (Abulk * dVdseff_dVg - - Abulk * Vdseff / Vgst2Vtm + Vdseff * dAbulk_dVg) / Vgst2Vtm; - dT0_dVd = -0.5 * Abulk * dVdseff_dVd / Vgst2Vtm; - dT0_dVb = -0.5 * (Abulk * dVdseff_dVb + dAbulk_dVb * Vdseff) - / Vgst2Vtm; - - fgche1 = Vgsteff * T0; - dfgche1_dVg = Vgsteff * dT0_dVg + T0; - dfgche1_dVd = Vgsteff * dT0_dVd; - dfgche1_dVb = Vgsteff * dT0_dVb; - - T9 = Vdseff / EsatL; - fgche2 = 1.0 + T9; - dfgche2_dVg = (dVdseff_dVg - T9 * dEsatL_dVg) / EsatL; - dfgche2_dVd = (dVdseff_dVd - T9 * dEsatL_dVd) / EsatL; - dfgche2_dVb = (dVdseff_dVb - T9 * dEsatL_dVb) / EsatL; - - gche = beta * fgche1 / fgche2; - dgche_dVg = (beta * dfgche1_dVg + fgche1 * dbeta_dVg - - gche * dfgche2_dVg) / fgche2; - dgche_dVd = (beta * dfgche1_dVd + fgche1 * dbeta_dVd - - gche * dfgche2_dVd) / fgche2; - dgche_dVb = (beta * dfgche1_dVb + fgche1 * dbeta_dVb - - gche * dfgche2_dVb) / fgche2; - - T0 = 1.0 + gche * Rds; - Idl = gche / T0; - T1 = (1.0 - Idl * Rds) / T0; - T2 = Idl * Idl; - dIdl_dVg = T1 * dgche_dVg - T2 * dRds_dVg; - dIdl_dVd = T1 * dgche_dVd; - dIdl_dVb = T1 * dgche_dVb - T2 * dRds_dVb; - - /* Calculate degradation factor due to pocket implant */ - - if (pParam->BSIM4v7fprout <= 0.0) - { FP = 1.0; - dFP_dVg = 0.0; - } - else - { T9 = pParam->BSIM4v7fprout * sqrt(Leff) / Vgst2Vtm; - FP = 1.0 / (1.0 + T9); - dFP_dVg = FP * FP * T9 / Vgst2Vtm; - } - - /* Calculate VACLM */ - T8 = pParam->BSIM4v7pvag / EsatL; - T9 = T8 * Vgsteff; - if (T9 > -0.9) - { PvagTerm = 1.0 + T9; - dPvagTerm_dVg = T8 * (1.0 - Vgsteff * dEsatL_dVg / EsatL); - dPvagTerm_dVb = -T9 * dEsatL_dVb / EsatL; - dPvagTerm_dVd = -T9 * dEsatL_dVd / EsatL; - } - else - { T4 = 1.0 / (17.0 + 20.0 * T9); - PvagTerm = (0.8 + T9) * T4; - T4 *= T4; - dPvagTerm_dVg = T8 * (1.0 - Vgsteff * dEsatL_dVg / EsatL) * T4; - T9 *= T4 / EsatL; - dPvagTerm_dVb = -T9 * dEsatL_dVb; - dPvagTerm_dVd = -T9 * dEsatL_dVd; - } - - if ((pParam->BSIM4v7pclm > MIN_EXP) && (diffVds > 1.0e-10)) - { T0 = 1.0 + Rds * Idl; - dT0_dVg = dRds_dVg * Idl + Rds * dIdl_dVg; - dT0_dVd = Rds * dIdl_dVd; - dT0_dVb = dRds_dVb * Idl + Rds * dIdl_dVb; - - T2 = Vdsat / Esat; - T1 = Leff + T2; - dT1_dVg = (dVdsat_dVg - T2 * dEsatL_dVg / Leff) / Esat; - dT1_dVd = (dVdsat_dVd - T2 * dEsatL_dVd / Leff) / Esat; - dT1_dVb = (dVdsat_dVb - T2 * dEsatL_dVb / Leff) / Esat; - - Cclm = FP * PvagTerm * T0 * T1 / (pParam->BSIM4v7pclm * pParam->BSIM4v7litl); - dCclm_dVg = Cclm * (dFP_dVg / FP + dPvagTerm_dVg / PvagTerm - + dT0_dVg / T0 + dT1_dVg / T1); - dCclm_dVb = Cclm * (dPvagTerm_dVb / PvagTerm + dT0_dVb / T0 - + dT1_dVb / T1); - dCclm_dVd = Cclm * (dPvagTerm_dVd / PvagTerm + dT0_dVd / T0 - + dT1_dVd / T1); - VACLM = Cclm * diffVds; - - dVACLM_dVg = dCclm_dVg * diffVds - dVdseff_dVg * Cclm; - dVACLM_dVb = dCclm_dVb * diffVds - dVdseff_dVb * Cclm; - dVACLM_dVd = dCclm_dVd * diffVds + (1.0 - dVdseff_dVd) * Cclm; - } - else - { VACLM = Cclm = MAX_EXP; - dVACLM_dVd = dVACLM_dVg = dVACLM_dVb = 0.0; - dCclm_dVd = dCclm_dVg = dCclm_dVb = 0.0; - } - - /* Calculate VADIBL */ - if (pParam->BSIM4v7thetaRout > MIN_EXP) - { T8 = Abulk * Vdsat; - T0 = Vgst2Vtm * T8; - dT0_dVg = Vgst2Vtm * Abulk * dVdsat_dVg + T8 - + Vgst2Vtm * Vdsat * dAbulk_dVg; - dT0_dVb = Vgst2Vtm * (dAbulk_dVb * Vdsat + Abulk * dVdsat_dVb); - dT0_dVd = Vgst2Vtm * Abulk * dVdsat_dVd; - - T1 = Vgst2Vtm + T8; - dT1_dVg = 1.0 + Abulk * dVdsat_dVg + Vdsat * dAbulk_dVg; - dT1_dVb = Abulk * dVdsat_dVb + dAbulk_dVb * Vdsat; - dT1_dVd = Abulk * dVdsat_dVd; - - T9 = T1 * T1; - T2 = pParam->BSIM4v7thetaRout; - VADIBL = (Vgst2Vtm - T0 / T1) / T2; - dVADIBL_dVg = (1.0 - dT0_dVg / T1 + T0 * dT1_dVg / T9) / T2; - dVADIBL_dVb = (-dT0_dVb / T1 + T0 * dT1_dVb / T9) / T2; - dVADIBL_dVd = (-dT0_dVd / T1 + T0 * dT1_dVd / T9) / T2; - - T7 = pParam->BSIM4v7pdiblb * Vbseff; - if (T7 >= -0.9) - { T3 = 1.0 / (1.0 + T7); - VADIBL *= T3; - dVADIBL_dVg *= T3; - dVADIBL_dVb = (dVADIBL_dVb - VADIBL * pParam->BSIM4v7pdiblb) - * T3; - dVADIBL_dVd *= T3; - } - else - { T4 = 1.0 / (0.8 + T7); - T3 = (17.0 + 20.0 * T7) * T4; - dVADIBL_dVg *= T3; - dVADIBL_dVb = dVADIBL_dVb * T3 - - VADIBL * pParam->BSIM4v7pdiblb * T4 * T4; - dVADIBL_dVd *= T3; - VADIBL *= T3; - } - - dVADIBL_dVg = dVADIBL_dVg * PvagTerm + VADIBL * dPvagTerm_dVg; - dVADIBL_dVb = dVADIBL_dVb * PvagTerm + VADIBL * dPvagTerm_dVb; - dVADIBL_dVd = dVADIBL_dVd * PvagTerm + VADIBL * dPvagTerm_dVd; - VADIBL *= PvagTerm; - } - else - { VADIBL = MAX_EXP; - dVADIBL_dVd = dVADIBL_dVg = dVADIBL_dVb = 0.0; - } - - /* Calculate Va */ - Va = Vasat + VACLM; - dVa_dVg = dVasat_dVg + dVACLM_dVg; - dVa_dVb = dVasat_dVb + dVACLM_dVb; - dVa_dVd = dVasat_dVd + dVACLM_dVd; - - /* Calculate VADITS */ - T0 = pParam->BSIM4v7pditsd * Vds; - if (T0 > EXP_THRESHOLD) - { T1 = MAX_EXP; - dT1_dVd = 0; - } - else - { T1 = exp(T0); - dT1_dVd = T1 * pParam->BSIM4v7pditsd; - } - - if (pParam->BSIM4v7pdits > MIN_EXP) - { T2 = 1.0 + model->BSIM4v7pditsl * Leff; - VADITS = (1.0 + T2 * T1) / pParam->BSIM4v7pdits; - dVADITS_dVg = VADITS * dFP_dVg; - dVADITS_dVd = FP * T2 * dT1_dVd / pParam->BSIM4v7pdits; - VADITS *= FP; - } - else - { VADITS = MAX_EXP; - dVADITS_dVg = dVADITS_dVd = 0; - } - - /* Calculate VASCBE */ - if ((pParam->BSIM4v7pscbe2 > 0.0)&&(pParam->BSIM4v7pscbe1>=0.0)) /*4.6.2*/ - { if (diffVds > pParam->BSIM4v7pscbe1 * pParam->BSIM4v7litl - / EXP_THRESHOLD) - { T0 = pParam->BSIM4v7pscbe1 * pParam->BSIM4v7litl / diffVds; - VASCBE = Leff * exp(T0) / pParam->BSIM4v7pscbe2; - T1 = T0 * VASCBE / diffVds; - dVASCBE_dVg = T1 * dVdseff_dVg; - dVASCBE_dVd = -T1 * (1.0 - dVdseff_dVd); - dVASCBE_dVb = T1 * dVdseff_dVb; - } - else - { VASCBE = MAX_EXP * Leff/pParam->BSIM4v7pscbe2; - dVASCBE_dVg = dVASCBE_dVd = dVASCBE_dVb = 0.0; - } - } - else - { VASCBE = MAX_EXP; - dVASCBE_dVg = dVASCBE_dVd = dVASCBE_dVb = 0.0; - } - - /* Add DIBL to Ids */ - T9 = diffVds / VADIBL; - T0 = 1.0 + T9; - Idsa = Idl * T0; - dIdsa_dVg = T0 * dIdl_dVg - Idl * (dVdseff_dVg + T9 * dVADIBL_dVg) / VADIBL; - dIdsa_dVd = T0 * dIdl_dVd + Idl - * (1.0 - dVdseff_dVd - T9 * dVADIBL_dVd) / VADIBL; - dIdsa_dVb = T0 * dIdl_dVb - Idl * (dVdseff_dVb + T9 * dVADIBL_dVb) / VADIBL; - - /* Add DITS to Ids */ - T9 = diffVds / VADITS; - T0 = 1.0 + T9; - dIdsa_dVg = T0 * dIdsa_dVg - Idsa * (dVdseff_dVg + T9 * dVADITS_dVg) / VADITS; - dIdsa_dVd = T0 * dIdsa_dVd + Idsa - * (1.0 - dVdseff_dVd - T9 * dVADITS_dVd) / VADITS; - dIdsa_dVb = T0 * dIdsa_dVb - Idsa * dVdseff_dVb / VADITS; - Idsa *= T0; - - /* Add CLM to Ids */ - T0 = log(Va / Vasat); - dT0_dVg = dVa_dVg / Va - dVasat_dVg / Vasat; - dT0_dVb = dVa_dVb / Va - dVasat_dVb / Vasat; - dT0_dVd = dVa_dVd / Va - dVasat_dVd / Vasat; - T1 = T0 / Cclm; - T9 = 1.0 + T1; - dT9_dVg = (dT0_dVg - T1 * dCclm_dVg) / Cclm; - dT9_dVb = (dT0_dVb - T1 * dCclm_dVb) / Cclm; - dT9_dVd = (dT0_dVd - T1 * dCclm_dVd) / Cclm; - - dIdsa_dVg = dIdsa_dVg * T9 + Idsa * dT9_dVg; - dIdsa_dVb = dIdsa_dVb * T9 + Idsa * dT9_dVb; - dIdsa_dVd = dIdsa_dVd * T9 + Idsa * dT9_dVd; - Idsa *= T9; - - /* Substrate current begins */ - tmp = pParam->BSIM4v7alpha0 + pParam->BSIM4v7alpha1 * Leff; - if ((tmp <= 0.0) || (pParam->BSIM4v7beta0 <= 0.0)) - { Isub = Gbd = Gbb = Gbg = 0.0; - } - else - { T2 = tmp / Leff; - if (diffVds > pParam->BSIM4v7beta0 / EXP_THRESHOLD) - { T0 = -pParam->BSIM4v7beta0 / diffVds; - T1 = T2 * diffVds * exp(T0); - T3 = T1 / diffVds * (T0 - 1.0); - dT1_dVg = T3 * dVdseff_dVg; - dT1_dVd = T3 * (dVdseff_dVd - 1.0); - dT1_dVb = T3 * dVdseff_dVb; - } - else - { T3 = T2 * MIN_EXP; - T1 = T3 * diffVds; - dT1_dVg = -T3 * dVdseff_dVg; - dT1_dVd = T3 * (1.0 - dVdseff_dVd); - dT1_dVb = -T3 * dVdseff_dVb; - } - T4 = Idsa * Vdseff; - Isub = T1 * T4; - Gbg = T1 * (dIdsa_dVg * Vdseff + Idsa * dVdseff_dVg) - + T4 * dT1_dVg; - Gbd = T1 * (dIdsa_dVd * Vdseff + Idsa * dVdseff_dVd) - + T4 * dT1_dVd; - Gbb = T1 * (dIdsa_dVb * Vdseff + Idsa * dVdseff_dVb) - + T4 * dT1_dVb; - - Gbd += Gbg * dVgsteff_dVd; - Gbb += Gbg * dVgsteff_dVb; - Gbg *= dVgsteff_dVg; - Gbb *= dVbseff_dVb; - } - here->BSIM4v7csub = Isub; - here->BSIM4v7gbbs = Gbb; - here->BSIM4v7gbgs = Gbg; - here->BSIM4v7gbds = Gbd; - - /* Add SCBE to Ids */ - T9 = diffVds / VASCBE; - T0 = 1.0 + T9; - Ids = Idsa * T0; - - Gm = T0 * dIdsa_dVg - Idsa - * (dVdseff_dVg + T9 * dVASCBE_dVg) / VASCBE; - Gds = T0 * dIdsa_dVd + Idsa - * (1.0 - dVdseff_dVd - T9 * dVASCBE_dVd) / VASCBE; - Gmb = T0 * dIdsa_dVb - Idsa - * (dVdseff_dVb + T9 * dVASCBE_dVb) / VASCBE; - - - tmp1 = Gds + Gm * dVgsteff_dVd; - tmp2 = Gmb + Gm * dVgsteff_dVb; - tmp3 = Gm; - - Gm = (Ids * dVdseff_dVg + Vdseff * tmp3) * dVgsteff_dVg; - Gds = Ids * (dVdseff_dVd + dVdseff_dVg * dVgsteff_dVd) - + Vdseff * tmp1; - Gmb = (Ids * (dVdseff_dVb + dVdseff_dVg * dVgsteff_dVb) - + Vdseff * tmp2) * dVbseff_dVb; - - cdrain = Ids * Vdseff; - - /* Source End Velocity Limit */ - if((model->BSIM4v7vtlGiven) && (model->BSIM4v7vtl > 0.0) ) { - T12 = 1.0 / Leff / CoxeffWovL; - T11 = T12 / Vgsteff; - T10 = -T11 / Vgsteff; - vs = cdrain * T11; /* vs */ - dvs_dVg = Gm * T11 + cdrain * T10 * dVgsteff_dVg; - dvs_dVd = Gds * T11 + cdrain * T10 * dVgsteff_dVd; - dvs_dVb = Gmb * T11 + cdrain * T10 * dVgsteff_dVb; - T0 = 2 * MM; - T1 = vs / (pParam->BSIM4v7vtl * pParam->BSIM4v7tfactor); - if(T1 > 0.0) - { T2 = 1.0 + exp(T0 * log(T1)); - T3 = (T2 - 1.0) * T0 / vs; - Fsevl = 1.0 / exp(log(T2)/ T0); - dT2_dVg = T3 * dvs_dVg; - dT2_dVd = T3 * dvs_dVd; - dT2_dVb = T3 * dvs_dVb; - T4 = -1.0 / T0 * Fsevl / T2; - dFsevl_dVg = T4 * dT2_dVg; - dFsevl_dVd = T4 * dT2_dVd; - dFsevl_dVb = T4 * dT2_dVb; - } else { - Fsevl = 1.0; - dFsevl_dVg = 0.0; - dFsevl_dVd = 0.0; - dFsevl_dVb = 0.0; - } - Gm *=Fsevl; - Gm += cdrain * dFsevl_dVg; - Gmb *=Fsevl; - Gmb += cdrain * dFsevl_dVb; - Gds *=Fsevl; - Gds += cdrain * dFsevl_dVd; - - cdrain *= Fsevl; - } - - here->BSIM4v7gds = Gds; - here->BSIM4v7gm = Gm; - here->BSIM4v7gmbs = Gmb; - here->BSIM4v7IdovVds = Ids; - if( here->BSIM4v7IdovVds <= 1.0e-9) here->BSIM4v7IdovVds = 1.0e-9; - - /* Calculate Rg */ - if ((here->BSIM4v7rgateMod > 1) || - (here->BSIM4v7trnqsMod != 0) || (here->BSIM4v7acnqsMod != 0)) - { T9 = pParam->BSIM4v7xrcrg2 * model->BSIM4v7vtm; - T0 = T9 * beta; - dT0_dVd = (dbeta_dVd + dbeta_dVg * dVgsteff_dVd) * T9; - dT0_dVb = (dbeta_dVb + dbeta_dVg * dVgsteff_dVb) * T9; - dT0_dVg = dbeta_dVg * T9; - - here->BSIM4v7gcrg = pParam->BSIM4v7xrcrg1 * ( T0 + Ids); - here->BSIM4v7gcrgd = pParam->BSIM4v7xrcrg1 * (dT0_dVd + tmp1); - here->BSIM4v7gcrgb = pParam->BSIM4v7xrcrg1 * (dT0_dVb + tmp2) - * dVbseff_dVb; - here->BSIM4v7gcrgg = pParam->BSIM4v7xrcrg1 * (dT0_dVg + tmp3) - * dVgsteff_dVg; - - if (here->BSIM4v7nf != 1.0) - { here->BSIM4v7gcrg *= here->BSIM4v7nf; - here->BSIM4v7gcrgg *= here->BSIM4v7nf; - here->BSIM4v7gcrgd *= here->BSIM4v7nf; - here->BSIM4v7gcrgb *= here->BSIM4v7nf; - } - - if (here->BSIM4v7rgateMod == 2) - { T10 = here->BSIM4v7grgeltd * here->BSIM4v7grgeltd; - T11 = here->BSIM4v7grgeltd + here->BSIM4v7gcrg; - here->BSIM4v7gcrg = here->BSIM4v7grgeltd * here->BSIM4v7gcrg / T11; - T12 = T10 / T11 / T11; - here->BSIM4v7gcrgg *= T12; - here->BSIM4v7gcrgd *= T12; - here->BSIM4v7gcrgb *= T12; - } - here->BSIM4v7gcrgs = -(here->BSIM4v7gcrgg + here->BSIM4v7gcrgd - + here->BSIM4v7gcrgb); - } - - - /* Calculate bias-dependent external S/D resistance */ - if (model->BSIM4v7rdsMod) - { /* Rs(V) */ - T0 = vgs - pParam->BSIM4v7vfbsd; - T1 = sqrt(T0 * T0 + 1.0e-4); - vgs_eff = 0.5 * (T0 + T1); - dvgs_eff_dvg = vgs_eff / T1; - - T0 = 1.0 + pParam->BSIM4v7prwg * vgs_eff; - dT0_dvg = -pParam->BSIM4v7prwg / T0 / T0 * dvgs_eff_dvg; - T1 = -pParam->BSIM4v7prwb * vbs; - dT1_dvb = -pParam->BSIM4v7prwb; - - T2 = 1.0 / T0 + T1; - T3 = T2 + sqrt(T2 * T2 + 0.01); - dT3_dvg = T3 / (T3 - T2); - dT3_dvb = dT3_dvg * dT1_dvb; - dT3_dvg *= dT0_dvg; - - T4 = pParam->BSIM4v7rs0 * 0.5; - Rs = pParam->BSIM4v7rswmin + T3 * T4; - dRs_dvg = T4 * dT3_dvg; - dRs_dvb = T4 * dT3_dvb; - - T0 = 1.0 + here->BSIM4v7sourceConductance * Rs; - here->BSIM4v7gstot = here->BSIM4v7sourceConductance / T0; - T0 = -here->BSIM4v7gstot * here->BSIM4v7gstot; - dgstot_dvd = 0.0; /* place holder */ - dgstot_dvg = T0 * dRs_dvg; - dgstot_dvb = T0 * dRs_dvb; - dgstot_dvs = -(dgstot_dvg + dgstot_dvb + dgstot_dvd); - - /* Rd(V) */ - T0 = vgd - pParam->BSIM4v7vfbsd; - T1 = sqrt(T0 * T0 + 1.0e-4); - vgd_eff = 0.5 * (T0 + T1); - dvgd_eff_dvg = vgd_eff / T1; - - T0 = 1.0 + pParam->BSIM4v7prwg * vgd_eff; - dT0_dvg = -pParam->BSIM4v7prwg / T0 / T0 * dvgd_eff_dvg; - T1 = -pParam->BSIM4v7prwb * vbd; - dT1_dvb = -pParam->BSIM4v7prwb; - - T2 = 1.0 / T0 + T1; - T3 = T2 + sqrt(T2 * T2 + 0.01); - dT3_dvg = T3 / (T3 - T2); - dT3_dvb = dT3_dvg * dT1_dvb; - dT3_dvg *= dT0_dvg; - - T4 = pParam->BSIM4v7rd0 * 0.5; - Rd = pParam->BSIM4v7rdwmin + T3 * T4; - dRd_dvg = T4 * dT3_dvg; - dRd_dvb = T4 * dT3_dvb; - - T0 = 1.0 + here->BSIM4v7drainConductance * Rd; - here->BSIM4v7gdtot = here->BSIM4v7drainConductance / T0; - T0 = -here->BSIM4v7gdtot * here->BSIM4v7gdtot; - dgdtot_dvs = 0.0; - dgdtot_dvg = T0 * dRd_dvg; - dgdtot_dvb = T0 * dRd_dvb; - dgdtot_dvd = -(dgdtot_dvg + dgdtot_dvb + dgdtot_dvs); - - here->BSIM4v7gstotd = vses * dgstot_dvd; - here->BSIM4v7gstotg = vses * dgstot_dvg; - here->BSIM4v7gstots = vses * dgstot_dvs; - here->BSIM4v7gstotb = vses * dgstot_dvb; - - T2 = vdes - vds; - here->BSIM4v7gdtotd = T2 * dgdtot_dvd; - here->BSIM4v7gdtotg = T2 * dgdtot_dvg; - here->BSIM4v7gdtots = T2 * dgdtot_dvs; - here->BSIM4v7gdtotb = T2 * dgdtot_dvb; - } - else /* WDLiu: for bypass */ - { here->BSIM4v7gstot = here->BSIM4v7gstotd = here->BSIM4v7gstotg = 0.0; - here->BSIM4v7gstots = here->BSIM4v7gstotb = 0.0; - here->BSIM4v7gdtot = here->BSIM4v7gdtotd = here->BSIM4v7gdtotg = 0.0; - here->BSIM4v7gdtots = here->BSIM4v7gdtotb = 0.0; - } - - /* GIDL/GISL Models */ - - if(model->BSIM4v7mtrlMod == 0) - T0 = 3.0 * toxe; - else - T0 = model->BSIM4v7epsrsub * toxe / epsrox; - - /* Calculate GIDL current */ - - vgs_eff = here->BSIM4v7vgs_eff; - dvgs_eff_dvg = here->BSIM4v7dvgs_eff_dvg; - vgd_eff = here->BSIM4v7vgd_eff; - dvgd_eff_dvg = here->BSIM4v7dvgd_eff_dvg; - - if (model->BSIM4v7gidlMod==0){ - - if(model->BSIM4v7mtrlMod ==0) - T1 = (vds - vgs_eff - pParam->BSIM4v7egidl ) / T0; - else - T1 = (vds - vgs_eff - pParam->BSIM4v7egidl + pParam->BSIM4v7vfbsd) / T0; - - if ((pParam->BSIM4v7agidl <= 0.0) || (pParam->BSIM4v7bgidl <= 0.0) - || (T1 <= 0.0) || (pParam->BSIM4v7cgidl <= 0.0) || (vbd > 0.0)) - Igidl = Ggidld = Ggidlg = Ggidlb = 0.0; - else { - dT1_dVd = 1.0 / T0; - dT1_dVg = -dvgs_eff_dvg * dT1_dVd; - T2 = pParam->BSIM4v7bgidl / T1; - if (T2 < 100.0) - { Igidl = pParam->BSIM4v7agidl * pParam->BSIM4v7weffCJ * T1 * exp(-T2); - T3 = Igidl * (1.0 + T2) / T1; - Ggidld = T3 * dT1_dVd; - Ggidlg = T3 * dT1_dVg; - } - else - { Igidl = pParam->BSIM4v7agidl * pParam->BSIM4v7weffCJ * 3.720075976e-44; - Ggidld = Igidl * dT1_dVd; - Ggidlg = Igidl * dT1_dVg; - Igidl *= T1; - } - - T4 = vbd * vbd; - T5 = -vbd * T4; - T6 = pParam->BSIM4v7cgidl + T5; - T7 = T5 / T6; - T8 = 3.0 * pParam->BSIM4v7cgidl * T4 / T6 / T6; - Ggidld = Ggidld * T7 + Igidl * T8; - Ggidlg = Ggidlg * T7; - Ggidlb = -Igidl * T8; - Igidl *= T7; - } - here->BSIM4v7Igidl = Igidl; - here->BSIM4v7ggidld = Ggidld; - here->BSIM4v7ggidlg = Ggidlg; - here->BSIM4v7ggidlb = Ggidlb; - /* Calculate GISL current */ - - if(model->BSIM4v7mtrlMod ==0) - T1 = (-vds - vgd_eff - pParam->BSIM4v7egisl ) / T0; - else - T1 = (-vds - vgd_eff - pParam->BSIM4v7egisl + pParam->BSIM4v7vfbsd ) / T0; - - if ((pParam->BSIM4v7agisl <= 0.0) || (pParam->BSIM4v7bgisl <= 0.0) - || (T1 <= 0.0) || (pParam->BSIM4v7cgisl <= 0.0) || (vbs > 0.0)) - Igisl = Ggisls = Ggislg = Ggislb = 0.0; - else { - dT1_dVd = 1.0 / T0; - dT1_dVg = -dvgd_eff_dvg * dT1_dVd; - T2 = pParam->BSIM4v7bgisl / T1; - if (T2 < 100.0) - { Igisl = pParam->BSIM4v7agisl * pParam->BSIM4v7weffCJ * T1 * exp(-T2); - T3 = Igisl * (1.0 + T2) / T1; - Ggisls = T3 * dT1_dVd; - Ggislg = T3 * dT1_dVg; - } - else - { Igisl = pParam->BSIM4v7agisl * pParam->BSIM4v7weffCJ * 3.720075976e-44; - Ggisls = Igisl * dT1_dVd; - Ggislg = Igisl * dT1_dVg; - Igisl *= T1; - } - - T4 = vbs * vbs; - T5 = -vbs * T4; - T6 = pParam->BSIM4v7cgisl + T5; - T7 = T5 / T6; - T8 = 3.0 * pParam->BSIM4v7cgisl * T4 / T6 / T6; - Ggisls = Ggisls * T7 + Igisl * T8; - Ggislg = Ggislg * T7; - Ggislb = -Igisl * T8; - Igisl *= T7; - } - here->BSIM4v7Igisl = Igisl; - here->BSIM4v7ggisls = Ggisls; - here->BSIM4v7ggislg = Ggislg; - here->BSIM4v7ggislb = Ggislb; - } - else{ - /* v4.7 New Gidl/GISL model */ - - /* GISL */ - if (model->BSIM4v7mtrlMod==0) - T1 = (-vds - pParam->BSIM4v7rgisl * vgd_eff - pParam->BSIM4v7egisl) / T0; - else - T1 = (-vds - pParam->BSIM4v7rgisl * vgd_eff - pParam->BSIM4v7egisl + pParam->BSIM4v7vfbsd) / T0; - - if ((pParam->BSIM4v7agisl <= 0.0) || - (pParam->BSIM4v7bgisl <= 0.0) || (T1 <= 0.0) || - (pParam->BSIM4v7cgisl < 0.0) ) - Igisl = Ggisls = Ggislg = Ggislb = 0.0; - else - { - dT1_dVd = 1 / T0; - dT1_dVg = - pParam->BSIM4v7rgisl * dT1_dVd * dvgd_eff_dvg; - T2 = pParam->BSIM4v7bgisl / T1; - if (T2 < EXPL_THRESHOLD) - { - Igisl = pParam->BSIM4v7weffCJ * pParam->BSIM4v7agisl * T1 * exp(-T2); - T3 = Igisl / T1 * (T2 + 1); - Ggisls = T3 * dT1_dVd; - Ggislg = T3 * dT1_dVg; - } - else - { - T3 = pParam->BSIM4v7weffCJ * pParam->BSIM4v7agisl * MIN_EXPL; - Igisl = T3 * T1 ; - Ggisls = T3 * dT1_dVd; - Ggislg = T3 * dT1_dVg; - - } - T4 = vbs - pParam->BSIM4v7fgisl; - - if (T4==0) - T5 = EXPL_THRESHOLD; - else - T5 = pParam->BSIM4v7kgisl / T4; - if (T5BSIM4v7Igisl = Igisl; - here->BSIM4v7ggisls = Ggisls; - here->BSIM4v7ggislg = Ggislg; - here->BSIM4v7ggislb = Ggislb; - /* End of GISL */ - - /* GIDL */ - if (model->BSIM4v7mtrlMod==0) - T1 = (vds - pParam->BSIM4v7rgidl * vgs_eff - pParam->BSIM4v7egidl) / T0; - else - T1 = (vds - pParam->BSIM4v7rgidl * vgs_eff - pParam->BSIM4v7egidl + pParam->BSIM4v7vfbsd) / T0; - - - - if ((pParam->BSIM4v7agidl <= 0.0) || - (pParam->BSIM4v7bgidl <= 0.0) || (T1 <= 0.0) || - (pParam->BSIM4v7cgidl < 0.0) ) - Igidl = Ggidld = Ggidlg = Ggidlb = 0.0; - else - { - dT1_dVd = 1 / T0; - dT1_dVg = - pParam->BSIM4v7rgidl * dT1_dVd * dvgs_eff_dvg; - T2 = pParam->BSIM4v7bgidl / T1; - if (T2 < EXPL_THRESHOLD) - { - Igidl = pParam->BSIM4v7weffCJ * pParam->BSIM4v7agidl * T1 * exp(-T2); - T3 = Igidl / T1 * (T2 + 1); - Ggidld = T3 * dT1_dVd; - Ggidlg = T3 * dT1_dVg; - - } else - { - T3 = pParam->BSIM4v7weffCJ * pParam->BSIM4v7agidl * MIN_EXPL; - Igidl = T3 * T1 ; - Ggidld = T3 * dT1_dVd; - Ggidlg = T3 * dT1_dVg; - } - T4 = vbd - pParam->BSIM4v7fgidl; - if (T4==0) - T5 = EXPL_THRESHOLD; - else - T5 = pParam->BSIM4v7kgidl / T4; - if (T5BSIM4v7Igidl = Igidl; - here->BSIM4v7ggidld = Ggidld; - here->BSIM4v7ggidlg = Ggidlg; - here->BSIM4v7ggidlb = Ggidlb; - /* End of New GIDL */ - } - /*End of Gidl*/ - - - - /* Calculate gate tunneling current */ - if ((model->BSIM4v7igcMod != 0) || (model->BSIM4v7igbMod != 0)) - { Vfb = here->BSIM4v7vfbzb; - V3 = Vfb - Vgs_eff + Vbseff - DELTA_3; - if (Vfb <= 0.0) - T0 = sqrt(V3 * V3 - 4.0 * DELTA_3 * Vfb); - else - T0 = sqrt(V3 * V3 + 4.0 * DELTA_3 * Vfb); - T1 = 0.5 * (1.0 + V3 / T0); - Vfbeff = Vfb - 0.5 * (V3 + T0); - dVfbeff_dVg = T1 * dVgs_eff_dVg; - dVfbeff_dVb = -T1; /* WDLiu: -No surprise? No. -Good! */ - - Voxacc = Vfb - Vfbeff; - dVoxacc_dVg = -dVfbeff_dVg; - dVoxacc_dVb = -dVfbeff_dVb; - if (Voxacc < 0.0) /* WDLiu: Avoiding numerical instability. */ - Voxacc = dVoxacc_dVg = dVoxacc_dVb = 0.0; - - T0 = 0.5 * pParam->BSIM4v7k1ox; - T3 = Vgs_eff - Vfbeff - Vbseff - Vgsteff; - if (pParam->BSIM4v7k1ox == 0.0) - Voxdepinv = dVoxdepinv_dVg = dVoxdepinv_dVd - = dVoxdepinv_dVb = 0.0; - else if (T3 < 0.0) - { Voxdepinv = -T3; - dVoxdepinv_dVg = -dVgs_eff_dVg + dVfbeff_dVg - + dVgsteff_dVg; - dVoxdepinv_dVd = dVgsteff_dVd; - dVoxdepinv_dVb = dVfbeff_dVb + 1.0 + dVgsteff_dVb; - } - else - { T1 = sqrt(T0 * T0 + T3); - T2 = T0 / T1; - Voxdepinv = pParam->BSIM4v7k1ox * (T1 - T0); - dVoxdepinv_dVg = T2 * (dVgs_eff_dVg - dVfbeff_dVg - - dVgsteff_dVg); - dVoxdepinv_dVd = -T2 * dVgsteff_dVd; - dVoxdepinv_dVb = -T2 * (dVfbeff_dVb + 1.0 + dVgsteff_dVb); - } - - Voxdepinv += Vgsteff; - dVoxdepinv_dVg += dVgsteff_dVg; - dVoxdepinv_dVd += dVgsteff_dVd; - dVoxdepinv_dVb += dVgsteff_dVb; - } - - if(model->BSIM4v7tempMod < 2) - tmp = Vtm; - else /* model->BSIM4v7tempMod = 2 , 3*/ - tmp = Vtm0; - if (model->BSIM4v7igcMod) - { T0 = tmp * pParam->BSIM4v7nigc; - if(model->BSIM4v7igcMod == 1) { - VxNVt = (Vgs_eff - model->BSIM4v7type * here->BSIM4v7vth0) / T0; - if (VxNVt > EXP_THRESHOLD) - { Vaux = Vgs_eff - model->BSIM4v7type * here->BSIM4v7vth0; - dVaux_dVg = dVgs_eff_dVg; - dVaux_dVd = 0.0; - dVaux_dVb = 0.0; - } - } else if (model->BSIM4v7igcMod == 2) { - VxNVt = (Vgs_eff - here->BSIM4v7von) / T0; - if (VxNVt > EXP_THRESHOLD) - { Vaux = Vgs_eff - here->BSIM4v7von; - dVaux_dVg = dVgs_eff_dVg; - dVaux_dVd = -dVth_dVd; - dVaux_dVb = -dVth_dVb; - } - } - if (VxNVt < -EXP_THRESHOLD) - { Vaux = T0 * log(1.0 + MIN_EXP); - dVaux_dVg = dVaux_dVd = dVaux_dVb = 0.0; - } - else if ((VxNVt >= -EXP_THRESHOLD) && (VxNVt <= EXP_THRESHOLD)) - { ExpVxNVt = exp(VxNVt); - Vaux = T0 * log(1.0 + ExpVxNVt); - dVaux_dVg = ExpVxNVt / (1.0 + ExpVxNVt); - if(model->BSIM4v7igcMod == 1) { - dVaux_dVd = 0.0; - dVaux_dVb = 0.0; - } else if (model->BSIM4v7igcMod == 2) { - dVaux_dVd = -dVgs_eff_dVg * dVth_dVd; - dVaux_dVb = -dVgs_eff_dVg * dVth_dVb; - } - dVaux_dVg *= dVgs_eff_dVg; - } - - T2 = Vgs_eff * Vaux; - dT2_dVg = dVgs_eff_dVg * Vaux + Vgs_eff * dVaux_dVg; - dT2_dVd = Vgs_eff * dVaux_dVd; - dT2_dVb = Vgs_eff * dVaux_dVb; - - T11 = pParam->BSIM4v7Aechvb; - T12 = pParam->BSIM4v7Bechvb; - T3 = pParam->BSIM4v7aigc * pParam->BSIM4v7cigc - - pParam->BSIM4v7bigc; - T4 = pParam->BSIM4v7bigc * pParam->BSIM4v7cigc; - T5 = T12 * (pParam->BSIM4v7aigc + T3 * Voxdepinv - - T4 * Voxdepinv * Voxdepinv); - - if (T5 > EXP_THRESHOLD) - { T6 = MAX_EXP; - dT6_dVg = dT6_dVd = dT6_dVb = 0.0; - } - else if (T5 < -EXP_THRESHOLD) - { T6 = MIN_EXP; - dT6_dVg = dT6_dVd = dT6_dVb = 0.0; - } - else - { T6 = exp(T5); - dT6_dVg = T6 * T12 * (T3 - 2.0 * T4 * Voxdepinv); - dT6_dVd = dT6_dVg * dVoxdepinv_dVd; - dT6_dVb = dT6_dVg * dVoxdepinv_dVb; - dT6_dVg *= dVoxdepinv_dVg; - } - - Igc = T11 * T2 * T6; - dIgc_dVg = T11 * (T2 * dT6_dVg + T6 * dT2_dVg); - dIgc_dVd = T11 * (T2 * dT6_dVd + T6 * dT2_dVd); - dIgc_dVb = T11 * (T2 * dT6_dVb + T6 * dT2_dVb); - - if (model->BSIM4v7pigcdGiven) - { Pigcd = pParam->BSIM4v7pigcd; - dPigcd_dVg = dPigcd_dVd = dPigcd_dVb = 0.0; - } - else - { /* T11 = pParam->BSIM4v7Bechvb * toxe; v4.7 */ - T11 = -pParam->BSIM4v7Bechvb; - T12 = Vgsteff + 1.0e-20; - T13 = T11 / T12 / T12; - T14 = -T13 / T12; - Pigcd = T13 * (1.0 - 0.5 * Vdseff / T12); - dPigcd_dVg = T14 * (2.0 + 0.5 * (dVdseff_dVg - - 3.0 * Vdseff / T12)); - dPigcd_dVd = 0.5 * T14 * dVdseff_dVd; - dPigcd_dVb = 0.5 * T14 * dVdseff_dVb; - } - - T7 = -Pigcd * Vdseff; /* bugfix */ - dT7_dVg = -Vdseff * dPigcd_dVg - Pigcd * dVdseff_dVg; - dT7_dVd = -Vdseff * dPigcd_dVd - Pigcd * dVdseff_dVd + dT7_dVg * dVgsteff_dVd; - dT7_dVb = -Vdseff * dPigcd_dVb - Pigcd * dVdseff_dVb + dT7_dVg * dVgsteff_dVb; - dT7_dVg *= dVgsteff_dVg; - dT7_dVb *= dVbseff_dVb; - T8 = T7 * T7 + 2.0e-4; - dT8_dVg = 2.0 * T7; - dT8_dVd = dT8_dVg * dT7_dVd; - dT8_dVb = dT8_dVg * dT7_dVb; - dT8_dVg *= dT7_dVg; - - if (T7 > EXP_THRESHOLD) - { T9 = MAX_EXP; - dT9_dVg = dT9_dVd = dT9_dVb = 0.0; - } - else if (T7 < -EXP_THRESHOLD) - { T9 = MIN_EXP; - dT9_dVg = dT9_dVd = dT9_dVb = 0.0; - } - else - { T9 = exp(T7); - dT9_dVg = T9 * dT7_dVg; - dT9_dVd = T9 * dT7_dVd; - dT9_dVb = T9 * dT7_dVb; - } - - T0 = T8 * T8; - T1 = T9 - 1.0 + 1.0e-4; - T10 = (T1 - T7) / T8; - dT10_dVg = (dT9_dVg - dT7_dVg - T10 * dT8_dVg) / T8; - dT10_dVd = (dT9_dVd - dT7_dVd - T10 * dT8_dVd) / T8; - dT10_dVb = (dT9_dVb - dT7_dVb - T10 * dT8_dVb) / T8; - - Igcs = Igc * T10; - dIgcs_dVg = dIgc_dVg * T10 + Igc * dT10_dVg; - dIgcs_dVd = dIgc_dVd * T10 + Igc * dT10_dVd; - dIgcs_dVb = dIgc_dVb * T10 + Igc * dT10_dVb; - - T1 = T9 - 1.0 - 1.0e-4; - T10 = (T7 * T9 - T1) / T8; - dT10_dVg = (dT7_dVg * T9 + (T7 - 1.0) * dT9_dVg - - T10 * dT8_dVg) / T8; - dT10_dVd = (dT7_dVd * T9 + (T7 - 1.0) * dT9_dVd - - T10 * dT8_dVd) / T8; - dT10_dVb = (dT7_dVb * T9 + (T7 - 1.0) * dT9_dVb - - T10 * dT8_dVb) / T8; - Igcd = Igc * T10; - dIgcd_dVg = dIgc_dVg * T10 + Igc * dT10_dVg; - dIgcd_dVd = dIgc_dVd * T10 + Igc * dT10_dVd; - dIgcd_dVb = dIgc_dVb * T10 + Igc * dT10_dVb; - - here->BSIM4v7Igcs = Igcs; - here->BSIM4v7gIgcsg = dIgcs_dVg; - here->BSIM4v7gIgcsd = dIgcs_dVd; - here->BSIM4v7gIgcsb = dIgcs_dVb * dVbseff_dVb; - here->BSIM4v7Igcd = Igcd; - here->BSIM4v7gIgcdg = dIgcd_dVg; - here->BSIM4v7gIgcdd = dIgcd_dVd; - here->BSIM4v7gIgcdb = dIgcd_dVb * dVbseff_dVb; - - T0 = vgs - (pParam->BSIM4v7vfbsd + pParam->BSIM4v7vfbsdoff); - vgs_eff = sqrt(T0 * T0 + 1.0e-4); - dvgs_eff_dvg = T0 / vgs_eff; - - T2 = vgs * vgs_eff; - dT2_dVg = vgs * dvgs_eff_dvg + vgs_eff; - T11 = pParam->BSIM4v7AechvbEdgeS; - T12 = pParam->BSIM4v7BechvbEdge; - T3 = pParam->BSIM4v7aigs * pParam->BSIM4v7cigs - - pParam->BSIM4v7bigs; - T4 = pParam->BSIM4v7bigs * pParam->BSIM4v7cigs; - T5 = T12 * (pParam->BSIM4v7aigs + T3 * vgs_eff - - T4 * vgs_eff * vgs_eff); - if (T5 > EXP_THRESHOLD) - { T6 = MAX_EXP; - dT6_dVg = 0.0; - } - else if (T5 < -EXP_THRESHOLD) - { T6 = MIN_EXP; - dT6_dVg = 0.0; - } - else - { T6 = exp(T5); - dT6_dVg = T6 * T12 * (T3 - 2.0 * T4 * vgs_eff) - * dvgs_eff_dvg; - } - Igs = T11 * T2 * T6; - dIgs_dVg = T11 * (T2 * dT6_dVg + T6 * dT2_dVg); - dIgs_dVs = -dIgs_dVg; - - - T0 = vgd - (pParam->BSIM4v7vfbsd + pParam->BSIM4v7vfbsdoff); - vgd_eff = sqrt(T0 * T0 + 1.0e-4); - dvgd_eff_dvg = T0 / vgd_eff; - - T2 = vgd * vgd_eff; - dT2_dVg = vgd * dvgd_eff_dvg + vgd_eff; - T11 = pParam->BSIM4v7AechvbEdgeD; - T3 = pParam->BSIM4v7aigd * pParam->BSIM4v7cigd - - pParam->BSIM4v7bigd; - T4 = pParam->BSIM4v7bigd * pParam->BSIM4v7cigd; - T5 = T12 * (pParam->BSIM4v7aigd + T3 * vgd_eff - - T4 * vgd_eff * vgd_eff); - if (T5 > EXP_THRESHOLD) - { T6 = MAX_EXP; - dT6_dVg = 0.0; - } - else if (T5 < -EXP_THRESHOLD) - { T6 = MIN_EXP; - dT6_dVg = 0.0; - } - else - { T6 = exp(T5); - dT6_dVg = T6 * T12 * (T3 - 2.0 * T4 * vgd_eff) - * dvgd_eff_dvg; - } - Igd = T11 * T2 * T6; - dIgd_dVg = T11 * (T2 * dT6_dVg + T6 * dT2_dVg); - dIgd_dVd = -dIgd_dVg; - - here->BSIM4v7Igs = Igs; - here->BSIM4v7gIgsg = dIgs_dVg; - here->BSIM4v7gIgss = dIgs_dVs; - here->BSIM4v7Igd = Igd; - here->BSIM4v7gIgdg = dIgd_dVg; - here->BSIM4v7gIgdd = dIgd_dVd; - } - else - { here->BSIM4v7Igcs = here->BSIM4v7gIgcsg = here->BSIM4v7gIgcsd - = here->BSIM4v7gIgcsb = 0.0; - here->BSIM4v7Igcd = here->BSIM4v7gIgcdg = here->BSIM4v7gIgcdd - = here->BSIM4v7gIgcdb = 0.0; - here->BSIM4v7Igs = here->BSIM4v7gIgsg = here->BSIM4v7gIgss = 0.0; - here->BSIM4v7Igd = here->BSIM4v7gIgdg = here->BSIM4v7gIgdd = 0.0; - } - - if (model->BSIM4v7igbMod) - { T0 = tmp * pParam->BSIM4v7nigbacc; - T1 = -Vgs_eff + Vbseff + Vfb; - VxNVt = T1 / T0; - if (VxNVt > EXP_THRESHOLD) - { Vaux = T1; - dVaux_dVg = -dVgs_eff_dVg; - dVaux_dVb = 1.0; - } - else if (VxNVt < -EXP_THRESHOLD) - { Vaux = T0 * log(1.0 + MIN_EXP); - dVaux_dVg = dVaux_dVb = 0.0; - } - else - { ExpVxNVt = exp(VxNVt); - Vaux = T0 * log(1.0 + ExpVxNVt); - dVaux_dVb = ExpVxNVt / (1.0 + ExpVxNVt); - dVaux_dVg = -dVaux_dVb * dVgs_eff_dVg; - } - - T2 = (Vgs_eff - Vbseff) * Vaux; - dT2_dVg = dVgs_eff_dVg * Vaux + (Vgs_eff - Vbseff) * dVaux_dVg; - dT2_dVb = -Vaux + (Vgs_eff - Vbseff) * dVaux_dVb; - - T11 = 4.97232e-7 * pParam->BSIM4v7weff - * pParam->BSIM4v7leff * pParam->BSIM4v7ToxRatio; - T12 = -7.45669e11 * toxe; - T3 = pParam->BSIM4v7aigbacc * pParam->BSIM4v7cigbacc - - pParam->BSIM4v7bigbacc; - T4 = pParam->BSIM4v7bigbacc * pParam->BSIM4v7cigbacc; - T5 = T12 * (pParam->BSIM4v7aigbacc + T3 * Voxacc - - T4 * Voxacc * Voxacc); - - if (T5 > EXP_THRESHOLD) - { T6 = MAX_EXP; - dT6_dVg = dT6_dVb = 0.0; - } - else if (T5 < -EXP_THRESHOLD) - { T6 = MIN_EXP; - dT6_dVg = dT6_dVb = 0.0; - } - else - { T6 = exp(T5); - dT6_dVg = T6 * T12 * (T3 - 2.0 * T4 * Voxacc); - dT6_dVb = dT6_dVg * dVoxacc_dVb; - dT6_dVg *= dVoxacc_dVg; - } - - Igbacc = T11 * T2 * T6; - dIgbacc_dVg = T11 * (T2 * dT6_dVg + T6 * dT2_dVg); - dIgbacc_dVb = T11 * (T2 * dT6_dVb + T6 * dT2_dVb); - - - T0 = tmp * pParam->BSIM4v7nigbinv; - T1 = Voxdepinv - pParam->BSIM4v7eigbinv; - VxNVt = T1 / T0; - if (VxNVt > EXP_THRESHOLD) - { Vaux = T1; - dVaux_dVg = dVoxdepinv_dVg; - dVaux_dVd = dVoxdepinv_dVd; - dVaux_dVb = dVoxdepinv_dVb; - } - else if (VxNVt < -EXP_THRESHOLD) - { Vaux = T0 * log(1.0 + MIN_EXP); - dVaux_dVg = dVaux_dVd = dVaux_dVb = 0.0; - } - else - { ExpVxNVt = exp(VxNVt); - Vaux = T0 * log(1.0 + ExpVxNVt); - dVaux_dVg = ExpVxNVt / (1.0 + ExpVxNVt); - dVaux_dVd = dVaux_dVg * dVoxdepinv_dVd; - dVaux_dVb = dVaux_dVg * dVoxdepinv_dVb; - dVaux_dVg *= dVoxdepinv_dVg; - } - - T2 = (Vgs_eff - Vbseff) * Vaux; - dT2_dVg = dVgs_eff_dVg * Vaux + (Vgs_eff - Vbseff) * dVaux_dVg; - dT2_dVd = (Vgs_eff - Vbseff) * dVaux_dVd; - dT2_dVb = -Vaux + (Vgs_eff - Vbseff) * dVaux_dVb; - - T11 *= 0.75610; - T12 *= 1.31724; - T3 = pParam->BSIM4v7aigbinv * pParam->BSIM4v7cigbinv - - pParam->BSIM4v7bigbinv; - T4 = pParam->BSIM4v7bigbinv * pParam->BSIM4v7cigbinv; - T5 = T12 * (pParam->BSIM4v7aigbinv + T3 * Voxdepinv - - T4 * Voxdepinv * Voxdepinv); - - if (T5 > EXP_THRESHOLD) - { T6 = MAX_EXP; - dT6_dVg = dT6_dVd = dT6_dVb = 0.0; - } - else if (T5 < -EXP_THRESHOLD) - { T6 = MIN_EXP; - dT6_dVg = dT6_dVd = dT6_dVb = 0.0; - } - else - { T6 = exp(T5); - dT6_dVg = T6 * T12 * (T3 - 2.0 * T4 * Voxdepinv); - dT6_dVd = dT6_dVg * dVoxdepinv_dVd; - dT6_dVb = dT6_dVg * dVoxdepinv_dVb; - dT6_dVg *= dVoxdepinv_dVg; - } - - Igbinv = T11 * T2 * T6; - dIgbinv_dVg = T11 * (T2 * dT6_dVg + T6 * dT2_dVg); - dIgbinv_dVd = T11 * (T2 * dT6_dVd + T6 * dT2_dVd); - dIgbinv_dVb = T11 * (T2 * dT6_dVb + T6 * dT2_dVb); - - here->BSIM4v7Igb = Igbinv + Igbacc; - here->BSIM4v7gIgbg = dIgbinv_dVg + dIgbacc_dVg; - here->BSIM4v7gIgbd = dIgbinv_dVd; - here->BSIM4v7gIgbb = (dIgbinv_dVb + dIgbacc_dVb) * dVbseff_dVb; - } - else - { here->BSIM4v7Igb = here->BSIM4v7gIgbg = here->BSIM4v7gIgbd - = here->BSIM4v7gIgbs = here->BSIM4v7gIgbb = 0.0; - } /* End of Gate current */ - - if (here->BSIM4v7nf != 1.0) - { cdrain *= here->BSIM4v7nf; - here->BSIM4v7gds *= here->BSIM4v7nf; - here->BSIM4v7gm *= here->BSIM4v7nf; - here->BSIM4v7gmbs *= here->BSIM4v7nf; - here->BSIM4v7IdovVds *= here->BSIM4v7nf; - - here->BSIM4v7gbbs *= here->BSIM4v7nf; - here->BSIM4v7gbgs *= here->BSIM4v7nf; - here->BSIM4v7gbds *= here->BSIM4v7nf; - here->BSIM4v7csub *= here->BSIM4v7nf; - - here->BSIM4v7Igidl *= here->BSIM4v7nf; - here->BSIM4v7ggidld *= here->BSIM4v7nf; - here->BSIM4v7ggidlg *= here->BSIM4v7nf; - here->BSIM4v7ggidlb *= here->BSIM4v7nf; - - here->BSIM4v7Igisl *= here->BSIM4v7nf; - here->BSIM4v7ggisls *= here->BSIM4v7nf; - here->BSIM4v7ggislg *= here->BSIM4v7nf; - here->BSIM4v7ggislb *= here->BSIM4v7nf; - - here->BSIM4v7Igcs *= here->BSIM4v7nf; - here->BSIM4v7gIgcsg *= here->BSIM4v7nf; - here->BSIM4v7gIgcsd *= here->BSIM4v7nf; - here->BSIM4v7gIgcsb *= here->BSIM4v7nf; - here->BSIM4v7Igcd *= here->BSIM4v7nf; - here->BSIM4v7gIgcdg *= here->BSIM4v7nf; - here->BSIM4v7gIgcdd *= here->BSIM4v7nf; - here->BSIM4v7gIgcdb *= here->BSIM4v7nf; - - here->BSIM4v7Igs *= here->BSIM4v7nf; - here->BSIM4v7gIgsg *= here->BSIM4v7nf; - here->BSIM4v7gIgss *= here->BSIM4v7nf; - here->BSIM4v7Igd *= here->BSIM4v7nf; - here->BSIM4v7gIgdg *= here->BSIM4v7nf; - here->BSIM4v7gIgdd *= here->BSIM4v7nf; - - here->BSIM4v7Igb *= here->BSIM4v7nf; - here->BSIM4v7gIgbg *= here->BSIM4v7nf; - here->BSIM4v7gIgbd *= here->BSIM4v7nf; - here->BSIM4v7gIgbb *= here->BSIM4v7nf; - } - - here->BSIM4v7ggidls = -(here->BSIM4v7ggidld + here->BSIM4v7ggidlg - + here->BSIM4v7ggidlb); - here->BSIM4v7ggisld = -(here->BSIM4v7ggisls + here->BSIM4v7ggislg - + here->BSIM4v7ggislb); - here->BSIM4v7gIgbs = -(here->BSIM4v7gIgbg + here->BSIM4v7gIgbd - + here->BSIM4v7gIgbb); - here->BSIM4v7gIgcss = -(here->BSIM4v7gIgcsg + here->BSIM4v7gIgcsd - + here->BSIM4v7gIgcsb); - here->BSIM4v7gIgcds = -(here->BSIM4v7gIgcdg + here->BSIM4v7gIgcdd - + here->BSIM4v7gIgcdb); - here->BSIM4v7cd = cdrain; - - - /* Calculations for noise analysis */ - - if (model->BSIM4v7tnoiMod == 0) - { Abulk = Abulk0 * pParam->BSIM4v7abulkCVfactor; - Vdsat = Vgsteff / Abulk; - T0 = Vdsat - Vds - DELTA_4; - T1 = sqrt(T0 * T0 + 4.0 * DELTA_4 * Vdsat); - if (T0 >= 0.0) - Vdseff = Vdsat - 0.5 * (T0 + T1); - else - { T3 = (DELTA_4 + DELTA_4) / (T1 - T0); - T4 = 1.0 - T3; - T5 = Vdsat * T3 / (T1 - T0); - Vdseff = Vdsat * T4; - } - if (Vds == 0.0) - Vdseff = 0.0; - - T0 = Abulk * Vdseff; - T1 = 12.0 * (Vgsteff - 0.5 * T0 + 1.0e-20); - T2 = Vdseff / T1; - T3 = T0 * T2; - here->BSIM4v7qinv = Coxeff * pParam->BSIM4v7weffCV * here->BSIM4v7nf - * pParam->BSIM4v7leffCV - * (Vgsteff - 0.5 * T0 + Abulk * T3); - } - else if(model->BSIM4v7tnoiMod == 2) - { - here->BSIM4v7noiGd0 = here->BSIM4v7nf * beta * Vgsteff / (1.0 + gche * Rds); - } - - /* - * BSIM4v7 C-V begins - */ - - if ((model->BSIM4v7xpart < 0) || (!ChargeComputationNeeded)) - { qgate = qdrn = qsrc = qbulk = 0.0; - here->BSIM4v7cggb = here->BSIM4v7cgsb = here->BSIM4v7cgdb = 0.0; - here->BSIM4v7cdgb = here->BSIM4v7cdsb = here->BSIM4v7cddb = 0.0; - here->BSIM4v7cbgb = here->BSIM4v7cbsb = here->BSIM4v7cbdb = 0.0; - here->BSIM4v7csgb = here->BSIM4v7cssb = here->BSIM4v7csdb = 0.0; - here->BSIM4v7cgbb = here->BSIM4v7csbb = here->BSIM4v7cdbb = here->BSIM4v7cbbb = 0.0; - here->BSIM4v7cqdb = here->BSIM4v7cqsb = here->BSIM4v7cqgb - = here->BSIM4v7cqbb = 0.0; - here->BSIM4v7gtau = 0.0; - goto finished; - } - else if (model->BSIM4v7capMod == 0) - { - if (Vbseff < 0.0) - { VbseffCV = Vbs; /*4.6.2*/ - dVbseffCV_dVb = 1.0; - } - else - { VbseffCV = pParam->BSIM4v7phi - Phis; - dVbseffCV_dVb = -dPhis_dVb * dVbseff_dVb; /*4.6.2*/ - } - - Vfb = pParam->BSIM4v7vfbcv; - Vth = Vfb + pParam->BSIM4v7phi + pParam->BSIM4v7k1ox * sqrtPhis; - Vgst = Vgs_eff - Vth; - dVth_dVb = pParam->BSIM4v7k1ox * dsqrtPhis_dVb *dVbseff_dVb; /*4.6.2*/ - dVgst_dVb = -dVth_dVb; - dVgst_dVg = dVgs_eff_dVg; - - CoxWL = model->BSIM4v7coxe * pParam->BSIM4v7weffCV - * pParam->BSIM4v7leffCV * here->BSIM4v7nf; - Arg1 = Vgs_eff - VbseffCV - Vfb; - - if (Arg1 <= 0.0) - { qgate = CoxWL * Arg1; - qbulk = -qgate; - qdrn = 0.0; - - here->BSIM4v7cggb = CoxWL * dVgs_eff_dVg; - here->BSIM4v7cgdb = 0.0; - here->BSIM4v7cgsb = CoxWL * (dVbseffCV_dVb - dVgs_eff_dVg); - - here->BSIM4v7cdgb = 0.0; - here->BSIM4v7cddb = 0.0; - here->BSIM4v7cdsb = 0.0; - - here->BSIM4v7cbgb = -CoxWL * dVgs_eff_dVg; - here->BSIM4v7cbdb = 0.0; - here->BSIM4v7cbsb = -here->BSIM4v7cgsb; - } /* Arg1 <= 0.0, end of accumulation */ - else if (Vgst <= 0.0) - { T1 = 0.5 * pParam->BSIM4v7k1ox; - T2 = sqrt(T1 * T1 + Arg1); - qgate = CoxWL * pParam->BSIM4v7k1ox * (T2 - T1); - qbulk = -qgate; - qdrn = 0.0; - - T0 = CoxWL * T1 / T2; - here->BSIM4v7cggb = T0 * dVgs_eff_dVg; - here->BSIM4v7cgdb = 0.0; - here->BSIM4v7cgsb = T0 * (dVbseffCV_dVb - dVgs_eff_dVg); - - here->BSIM4v7cdgb = 0.0; - here->BSIM4v7cddb = 0.0; - here->BSIM4v7cdsb = 0.0; - - here->BSIM4v7cbgb = -here->BSIM4v7cggb; - here->BSIM4v7cbdb = 0.0; - here->BSIM4v7cbsb = -here->BSIM4v7cgsb; - } /* Vgst <= 0.0, end of depletion */ - else - { One_Third_CoxWL = CoxWL / 3.0; - Two_Third_CoxWL = 2.0 * One_Third_CoxWL; - - AbulkCV = Abulk0 * pParam->BSIM4v7abulkCVfactor; - dAbulkCV_dVb = pParam->BSIM4v7abulkCVfactor * dAbulk0_dVb*dVbseff_dVb; - - dVdsat_dVg = 1.0 / AbulkCV; /*4.6.2*/ - Vdsat = Vgst * dVdsat_dVg; - dVdsat_dVb = - (Vdsat * dAbulkCV_dVb + dVth_dVb)* dVdsat_dVg; - - if (model->BSIM4v7xpart > 0.5) - { /* 0/100 Charge partition model */ - if (Vdsat <= Vds) - { /* saturation region */ - T1 = Vdsat / 3.0; - qgate = CoxWL * (Vgs_eff - Vfb - - pParam->BSIM4v7phi - T1); - T2 = -Two_Third_CoxWL * Vgst; - qbulk = -(qgate + T2); - qdrn = 0.0; - - here->BSIM4v7cggb = One_Third_CoxWL * (3.0 - - dVdsat_dVg) * dVgs_eff_dVg; - T2 = -One_Third_CoxWL * dVdsat_dVb; - here->BSIM4v7cgsb = -(here->BSIM4v7cggb + T2); - here->BSIM4v7cgdb = 0.0; - - here->BSIM4v7cdgb = 0.0; - here->BSIM4v7cddb = 0.0; - here->BSIM4v7cdsb = 0.0; - - here->BSIM4v7cbgb = -(here->BSIM4v7cggb - - Two_Third_CoxWL * dVgs_eff_dVg); - T3 = -(T2 + Two_Third_CoxWL * dVth_dVb); - here->BSIM4v7cbsb = -(here->BSIM4v7cbgb + T3); - here->BSIM4v7cbdb = 0.0; - } - else - { /* linear region */ - Alphaz = Vgst / Vdsat; - T1 = 2.0 * Vdsat - Vds; - T2 = Vds / (3.0 * T1); - T3 = T2 * Vds; - T9 = 0.25 * CoxWL; - T4 = T9 * Alphaz; - T7 = 2.0 * Vds - T1 - 3.0 * T3; - T8 = T3 - T1 - 2.0 * Vds; - qgate = CoxWL * (Vgs_eff - Vfb - - pParam->BSIM4v7phi - 0.5 * (Vds - T3)); - T10 = T4 * T8; - qdrn = T4 * T7; - qbulk = -(qgate + qdrn + T10); - - T5 = T3 / T1; - here->BSIM4v7cggb = CoxWL * (1.0 - T5 * dVdsat_dVg) - * dVgs_eff_dVg; - T11 = -CoxWL * T5 * dVdsat_dVb; - here->BSIM4v7cgdb = CoxWL * (T2 - 0.5 + 0.5 * T5); - here->BSIM4v7cgsb = -(here->BSIM4v7cggb + T11 - + here->BSIM4v7cgdb); - T6 = 1.0 / Vdsat; - dAlphaz_dVg = T6 * (1.0 - Alphaz * dVdsat_dVg); - dAlphaz_dVb = -T6 * (dVth_dVb + Alphaz * dVdsat_dVb); - T7 = T9 * T7; - T8 = T9 * T8; - T9 = 2.0 * T4 * (1.0 - 3.0 * T5); - here->BSIM4v7cdgb = (T7 * dAlphaz_dVg - T9 - * dVdsat_dVg) * dVgs_eff_dVg; - T12 = T7 * dAlphaz_dVb - T9 * dVdsat_dVb; - here->BSIM4v7cddb = T4 * (3.0 - 6.0 * T2 - 3.0 * T5); - here->BSIM4v7cdsb = -(here->BSIM4v7cdgb + T12 - + here->BSIM4v7cddb); - - T9 = 2.0 * T4 * (1.0 + T5); - T10 = (T8 * dAlphaz_dVg - T9 * dVdsat_dVg) - * dVgs_eff_dVg; - T11 = T8 * dAlphaz_dVb - T9 * dVdsat_dVb; - T12 = T4 * (2.0 * T2 + T5 - 1.0); - T0 = -(T10 + T11 + T12); - - here->BSIM4v7cbgb = -(here->BSIM4v7cggb - + here->BSIM4v7cdgb + T10); - here->BSIM4v7cbdb = -(here->BSIM4v7cgdb - + here->BSIM4v7cddb + T12); - here->BSIM4v7cbsb = -(here->BSIM4v7cgsb - + here->BSIM4v7cdsb + T0); - } - } - else if (model->BSIM4v7xpart < 0.5) - { /* 40/60 Charge partition model */ - if (Vds >= Vdsat) - { /* saturation region */ - T1 = Vdsat / 3.0; - qgate = CoxWL * (Vgs_eff - Vfb - - pParam->BSIM4v7phi - T1); - T2 = -Two_Third_CoxWL * Vgst; - qbulk = -(qgate + T2); - qdrn = 0.4 * T2; - - here->BSIM4v7cggb = One_Third_CoxWL * (3.0 - - dVdsat_dVg) * dVgs_eff_dVg; - T2 = -One_Third_CoxWL * dVdsat_dVb; - here->BSIM4v7cgsb = -(here->BSIM4v7cggb + T2); - here->BSIM4v7cgdb = 0.0; - - T3 = 0.4 * Two_Third_CoxWL; - here->BSIM4v7cdgb = -T3 * dVgs_eff_dVg; - here->BSIM4v7cddb = 0.0; - T4 = T3 * dVth_dVb; - here->BSIM4v7cdsb = -(T4 + here->BSIM4v7cdgb); - - here->BSIM4v7cbgb = -(here->BSIM4v7cggb - - Two_Third_CoxWL * dVgs_eff_dVg); - T3 = -(T2 + Two_Third_CoxWL * dVth_dVb); - here->BSIM4v7cbsb = -(here->BSIM4v7cbgb + T3); - here->BSIM4v7cbdb = 0.0; - } - else - { /* linear region */ - Alphaz = Vgst / Vdsat; - T1 = 2.0 * Vdsat - Vds; - T2 = Vds / (3.0 * T1); - T3 = T2 * Vds; - T9 = 0.25 * CoxWL; - T4 = T9 * Alphaz; - qgate = CoxWL * (Vgs_eff - Vfb - pParam->BSIM4v7phi - - 0.5 * (Vds - T3)); - - T5 = T3 / T1; - here->BSIM4v7cggb = CoxWL * (1.0 - T5 * dVdsat_dVg) - * dVgs_eff_dVg; - tmp = -CoxWL * T5 * dVdsat_dVb; - here->BSIM4v7cgdb = CoxWL * (T2 - 0.5 + 0.5 * T5); - here->BSIM4v7cgsb = -(here->BSIM4v7cggb - + here->BSIM4v7cgdb + tmp); - - T6 = 1.0 / Vdsat; - dAlphaz_dVg = T6 * (1.0 - Alphaz * dVdsat_dVg); - dAlphaz_dVb = -T6 * (dVth_dVb + Alphaz * dVdsat_dVb); - - T6 = 8.0 * Vdsat * Vdsat - 6.0 * Vdsat * Vds - + 1.2 * Vds * Vds; - T8 = T2 / T1; - T7 = Vds - T1 - T8 * T6; - qdrn = T4 * T7; - T7 *= T9; - tmp = T8 / T1; - tmp1 = T4 * (2.0 - 4.0 * tmp * T6 - + T8 * (16.0 * Vdsat - 6.0 * Vds)); - - here->BSIM4v7cdgb = (T7 * dAlphaz_dVg - tmp1 - * dVdsat_dVg) * dVgs_eff_dVg; - T10 = T7 * dAlphaz_dVb - tmp1 * dVdsat_dVb; - here->BSIM4v7cddb = T4 * (2.0 - (1.0 / (3.0 * T1 - * T1) + 2.0 * tmp) * T6 + T8 - * (6.0 * Vdsat - 2.4 * Vds)); - here->BSIM4v7cdsb = -(here->BSIM4v7cdgb - + T10 + here->BSIM4v7cddb); - - T7 = 2.0 * (T1 + T3); - qbulk = -(qgate - T4 * T7); - T7 *= T9; - T0 = 4.0 * T4 * (1.0 - T5); - T12 = (-T7 * dAlphaz_dVg - T0 * dVdsat_dVg) * dVgs_eff_dVg - - here->BSIM4v7cdgb; /*4.6.2*/ - T11 = -T7 * dAlphaz_dVb - T10 - T0 * dVdsat_dVb; - T10 = -4.0 * T4 * (T2 - 0.5 + 0.5 * T5) - - here->BSIM4v7cddb; - tmp = -(T10 + T11 + T12); - - here->BSIM4v7cbgb = -(here->BSIM4v7cggb - + here->BSIM4v7cdgb + T12); - here->BSIM4v7cbdb = -(here->BSIM4v7cgdb - + here->BSIM4v7cddb + T10); - here->BSIM4v7cbsb = -(here->BSIM4v7cgsb - + here->BSIM4v7cdsb + tmp); - } - } - else - { /* 50/50 partitioning */ - if (Vds >= Vdsat) - { /* saturation region */ - T1 = Vdsat / 3.0; - qgate = CoxWL * (Vgs_eff - Vfb - - pParam->BSIM4v7phi - T1); - T2 = -Two_Third_CoxWL * Vgst; - qbulk = -(qgate + T2); - qdrn = 0.5 * T2; - - here->BSIM4v7cggb = One_Third_CoxWL * (3.0 - - dVdsat_dVg) * dVgs_eff_dVg; - T2 = -One_Third_CoxWL * dVdsat_dVb; - here->BSIM4v7cgsb = -(here->BSIM4v7cggb + T2); - here->BSIM4v7cgdb = 0.0; - - here->BSIM4v7cdgb = -One_Third_CoxWL * dVgs_eff_dVg; - here->BSIM4v7cddb = 0.0; - T4 = One_Third_CoxWL * dVth_dVb; - here->BSIM4v7cdsb = -(T4 + here->BSIM4v7cdgb); - - here->BSIM4v7cbgb = -(here->BSIM4v7cggb - - Two_Third_CoxWL * dVgs_eff_dVg); - T3 = -(T2 + Two_Third_CoxWL * dVth_dVb); - here->BSIM4v7cbsb = -(here->BSIM4v7cbgb + T3); - here->BSIM4v7cbdb = 0.0; - } - else - { /* linear region */ - Alphaz = Vgst / Vdsat; - T1 = 2.0 * Vdsat - Vds; - T2 = Vds / (3.0 * T1); - T3 = T2 * Vds; - T9 = 0.25 * CoxWL; - T4 = T9 * Alphaz; - qgate = CoxWL * (Vgs_eff - Vfb - pParam->BSIM4v7phi - - 0.5 * (Vds - T3)); - - T5 = T3 / T1; - here->BSIM4v7cggb = CoxWL * (1.0 - T5 * dVdsat_dVg) - * dVgs_eff_dVg; - tmp = -CoxWL * T5 * dVdsat_dVb; - here->BSIM4v7cgdb = CoxWL * (T2 - 0.5 + 0.5 * T5); - here->BSIM4v7cgsb = -(here->BSIM4v7cggb - + here->BSIM4v7cgdb + tmp); - - T6 = 1.0 / Vdsat; - dAlphaz_dVg = T6 * (1.0 - Alphaz * dVdsat_dVg); - dAlphaz_dVb = -T6 * (dVth_dVb + Alphaz * dVdsat_dVb); - - T7 = T1 + T3; - qdrn = -T4 * T7; - qbulk = - (qgate + qdrn + qdrn); - T7 *= T9; - T0 = T4 * (2.0 * T5 - 2.0); - - here->BSIM4v7cdgb = (T0 * dVdsat_dVg - T7 - * dAlphaz_dVg) * dVgs_eff_dVg; - T12 = T0 * dVdsat_dVb - T7 * dAlphaz_dVb; - here->BSIM4v7cddb = T4 * (1.0 - 2.0 * T2 - T5); - here->BSIM4v7cdsb = -(here->BSIM4v7cdgb + T12 - + here->BSIM4v7cddb); - - here->BSIM4v7cbgb = -(here->BSIM4v7cggb - + 2.0 * here->BSIM4v7cdgb); - here->BSIM4v7cbdb = -(here->BSIM4v7cgdb - + 2.0 * here->BSIM4v7cddb); - here->BSIM4v7cbsb = -(here->BSIM4v7cgsb - + 2.0 * here->BSIM4v7cdsb); - } /* end of linear region */ - } /* end of 50/50 partition */ - } /* end of inversion */ - } /* end of capMod=0 */ - else - { if (Vbseff < 0.0) - { VbseffCV = Vbseff; - dVbseffCV_dVb = 1.0; - } - else - { VbseffCV = pParam->BSIM4v7phi - Phis; - dVbseffCV_dVb = -dPhis_dVb; - } - - CoxWL = model->BSIM4v7coxe * pParam->BSIM4v7weffCV - * pParam->BSIM4v7leffCV * here->BSIM4v7nf; - - if(model->BSIM4v7cvchargeMod == 0) - { - /* Seperate VgsteffCV with noff and voffcv */ - noff = n * pParam->BSIM4v7noff; - dnoff_dVd = pParam->BSIM4v7noff * dn_dVd; - dnoff_dVb = pParam->BSIM4v7noff * dn_dVb; - T0 = Vtm * noff; - voffcv = pParam->BSIM4v7voffcv; - VgstNVt = (Vgst - voffcv) / T0; - - if (VgstNVt > EXP_THRESHOLD) - { - Vgsteff = Vgst - voffcv; - dVgsteff_dVg = dVgs_eff_dVg; - dVgsteff_dVd = -dVth_dVd; - dVgsteff_dVb = -dVth_dVb; - } - else if (VgstNVt < -EXP_THRESHOLD) - { - Vgsteff = T0 * log(1.0 + MIN_EXP); - dVgsteff_dVg = 0.0; - dVgsteff_dVd = Vgsteff / noff; - dVgsteff_dVb = dVgsteff_dVd * dnoff_dVb; - dVgsteff_dVd *= dnoff_dVd; - } - else - { - ExpVgst = exp(VgstNVt); - Vgsteff = T0 * log(1.0 + ExpVgst); - dVgsteff_dVg = ExpVgst / (1.0 + ExpVgst); - dVgsteff_dVd = -dVgsteff_dVg * (dVth_dVd + (Vgst - voffcv) - / noff * dnoff_dVd) + Vgsteff / noff * dnoff_dVd; - dVgsteff_dVb = -dVgsteff_dVg * (dVth_dVb + (Vgst - voffcv) - / noff * dnoff_dVb) + Vgsteff / noff * dnoff_dVb; - dVgsteff_dVg *= dVgs_eff_dVg; - } - /* End of VgsteffCV for cvchargeMod = 0 */ - } - else - { - T0 = n * Vtm; - T1 = pParam->BSIM4v7mstarcv * Vgst; - T2 = T1 / T0; - if (T2 > EXP_THRESHOLD) - { - T10 = T1; - dT10_dVg = pParam->BSIM4v7mstarcv * dVgs_eff_dVg; - dT10_dVd = -dVth_dVd * pParam->BSIM4v7mstarcv; - dT10_dVb = -dVth_dVb * pParam->BSIM4v7mstarcv; - } - else if (T2 < -EXP_THRESHOLD) - { - T10 = Vtm * log(1.0 + MIN_EXP); - dT10_dVg = 0.0; - dT10_dVd = T10 * dn_dVd; - dT10_dVb = T10 * dn_dVb; - T10 *= n; - } - else - { - ExpVgst = exp(T2); - T3 = Vtm * log(1.0 + ExpVgst); - T10 = n * T3; - dT10_dVg = pParam->BSIM4v7mstarcv * ExpVgst / (1.0 + ExpVgst); - dT10_dVb = T3 * dn_dVb - dT10_dVg * (dVth_dVb + Vgst * dn_dVb / n); - dT10_dVd = T3 * dn_dVd - dT10_dVg * (dVth_dVd + Vgst * dn_dVd / n); - dT10_dVg *= dVgs_eff_dVg; - } - - T1 = pParam->BSIM4v7voffcbncv - (1.0 - pParam->BSIM4v7mstarcv) * Vgst; - T2 = T1 / T0; - if (T2 < -EXP_THRESHOLD) - { - T3 = model->BSIM4v7coxe * MIN_EXP / pParam->BSIM4v7cdep0; - T9 = pParam->BSIM4v7mstarcv + T3 * n; - dT9_dVg = 0.0; - dT9_dVd = dn_dVd * T3; - dT9_dVb = dn_dVb * T3; - } - else if (T2 > EXP_THRESHOLD) - { - T3 = model->BSIM4v7coxe * MAX_EXP / pParam->BSIM4v7cdep0; - T9 = pParam->BSIM4v7mstarcv + T3 * n; - dT9_dVg = 0.0; - dT9_dVd = dn_dVd * T3; - dT9_dVb = dn_dVb * T3; - } - else - { - ExpVgst = exp(T2); - T3 = model->BSIM4v7coxe / pParam->BSIM4v7cdep0; - T4 = T3 * ExpVgst; - T5 = T1 * T4 / T0; - T9 = pParam->BSIM4v7mstarcv + n * T4; - dT9_dVg = T3 * (pParam->BSIM4v7mstarcv - 1.0) * ExpVgst / Vtm; - dT9_dVb = T4 * dn_dVb - dT9_dVg * dVth_dVb - T5 * dn_dVb; - dT9_dVd = T4 * dn_dVd - dT9_dVg * dVth_dVd - T5 * dn_dVd; - dT9_dVg *= dVgs_eff_dVg; - } - - Vgsteff = T10 / T9; - T11 = T9 * T9; - dVgsteff_dVg = (T9 * dT10_dVg - T10 * dT9_dVg) / T11; - dVgsteff_dVd = (T9 * dT10_dVd - T10 * dT9_dVd) / T11; - dVgsteff_dVb = (T9 * dT10_dVb - T10 * dT9_dVb) / T11; - /* End of VgsteffCV for cvchargeMod = 1 */ - } - - - if (model->BSIM4v7capMod == 1) - { Vfb = here->BSIM4v7vfbzb; - V3 = Vfb - Vgs_eff + VbseffCV - DELTA_3; - if (Vfb <= 0.0) - T0 = sqrt(V3 * V3 - 4.0 * DELTA_3 * Vfb); - else - T0 = sqrt(V3 * V3 + 4.0 * DELTA_3 * Vfb); - - T1 = 0.5 * (1.0 + V3 / T0); - Vfbeff = Vfb - 0.5 * (V3 + T0); - dVfbeff_dVg = T1 * dVgs_eff_dVg; - dVfbeff_dVb = -T1 * dVbseffCV_dVb; - Qac0 = CoxWL * (Vfbeff - Vfb); - dQac0_dVg = CoxWL * dVfbeff_dVg; - dQac0_dVb = CoxWL * dVfbeff_dVb; - - T0 = 0.5 * pParam->BSIM4v7k1ox; - T3 = Vgs_eff - Vfbeff - VbseffCV - Vgsteff; - if (pParam->BSIM4v7k1ox == 0.0) - { T1 = 0.0; - T2 = 0.0; - } - else if (T3 < 0.0) - { T1 = T0 + T3 / pParam->BSIM4v7k1ox; - T2 = CoxWL; - } - else - { T1 = sqrt(T0 * T0 + T3); - T2 = CoxWL * T0 / T1; - } - - Qsub0 = CoxWL * pParam->BSIM4v7k1ox * (T1 - T0); - - dQsub0_dVg = T2 * (dVgs_eff_dVg - dVfbeff_dVg - dVgsteff_dVg); - dQsub0_dVd = -T2 * dVgsteff_dVd; - dQsub0_dVb = -T2 * (dVfbeff_dVb + dVbseffCV_dVb - + dVgsteff_dVb); - - AbulkCV = Abulk0 * pParam->BSIM4v7abulkCVfactor; - dAbulkCV_dVb = pParam->BSIM4v7abulkCVfactor * dAbulk0_dVb; - VdsatCV = Vgsteff / AbulkCV; - - T0 = VdsatCV - Vds - DELTA_4; - dT0_dVg = 1.0 / AbulkCV; - dT0_dVb = -VdsatCV * dAbulkCV_dVb / AbulkCV; - T1 = sqrt(T0 * T0 + 4.0 * DELTA_4 * VdsatCV); - dT1_dVg = (T0 + DELTA_4 + DELTA_4) / T1; - dT1_dVd = -T0 / T1; - dT1_dVb = dT1_dVg * dT0_dVb; - dT1_dVg *= dT0_dVg; - if (T0 >= 0.0) - { VdseffCV = VdsatCV - 0.5 * (T0 + T1); - dVdseffCV_dVg = 0.5 * (dT0_dVg - dT1_dVg); - dVdseffCV_dVd = 0.5 * (1.0 - dT1_dVd); - dVdseffCV_dVb = 0.5 * (dT0_dVb - dT1_dVb); - } - else - { T3 = (DELTA_4 + DELTA_4) / (T1 - T0); - T4 = 1.0 - T3; - T5 = VdsatCV * T3 / (T1 - T0); - VdseffCV = VdsatCV * T4; - dVdseffCV_dVg = dT0_dVg * T4 + T5 * (dT1_dVg - dT0_dVg); - dVdseffCV_dVd = T5 * (dT1_dVd + 1.0); - dVdseffCV_dVb = dT0_dVb * (T4 - T5) + T5 * dT1_dVb; - } - - if (Vds == 0.0) - { VdseffCV = 0.0; - dVdseffCV_dVg = 0.0; - dVdseffCV_dVb = 0.0; - } - - T0 = AbulkCV * VdseffCV; - T1 = 12.0 * (Vgsteff - 0.5 * T0 + 1.0e-20); - T2 = VdseffCV / T1; - T3 = T0 * T2; - - T4 = (1.0 - 12.0 * T2 * T2 * AbulkCV); - T5 = (6.0 * T0 * (4.0 * Vgsteff - T0) / (T1 * T1) - 0.5); - T6 = 12.0 * T2 * T2 * Vgsteff; - - qgate = CoxWL * (Vgsteff - 0.5 * VdseffCV + T3); - Cgg1 = CoxWL * (T4 + T5 * dVdseffCV_dVg); - Cgd1 = CoxWL * T5 * dVdseffCV_dVd + Cgg1 * dVgsteff_dVd; - Cgb1 = CoxWL * (T5 * dVdseffCV_dVb + T6 * dAbulkCV_dVb) - + Cgg1 * dVgsteff_dVb; - Cgg1 *= dVgsteff_dVg; - - T7 = 1.0 - AbulkCV; - qbulk = CoxWL * T7 * (0.5 * VdseffCV - T3); - T4 = -T7 * (T4 - 1.0); - T5 = -T7 * T5; - T6 = -(T7 * T6 + (0.5 * VdseffCV - T3)); - Cbg1 = CoxWL * (T4 + T5 * dVdseffCV_dVg); - Cbd1 = CoxWL * T5 * dVdseffCV_dVd + Cbg1 * dVgsteff_dVd; - Cbb1 = CoxWL * (T5 * dVdseffCV_dVb + T6 * dAbulkCV_dVb) - + Cbg1 * dVgsteff_dVb; - Cbg1 *= dVgsteff_dVg; - - if (model->BSIM4v7xpart > 0.5) - { /* 0/100 Charge petition model */ - T1 = T1 + T1; - qsrc = -CoxWL * (0.5 * Vgsteff + 0.25 * T0 - - T0 * T0 / T1); - T7 = (4.0 * Vgsteff - T0) / (T1 * T1); - T4 = -(0.5 + 24.0 * T0 * T0 / (T1 * T1)); - T5 = -(0.25 * AbulkCV - 12.0 * AbulkCV * T0 * T7); - T6 = -(0.25 * VdseffCV - 12.0 * T0 * VdseffCV * T7); - Csg = CoxWL * (T4 + T5 * dVdseffCV_dVg); - Csd = CoxWL * T5 * dVdseffCV_dVd + Csg * dVgsteff_dVd; - Csb = CoxWL * (T5 * dVdseffCV_dVb + T6 * dAbulkCV_dVb) - + Csg * dVgsteff_dVb; - Csg *= dVgsteff_dVg; - } - else if (model->BSIM4v7xpart < 0.5) - { /* 40/60 Charge petition model */ - T1 = T1 / 12.0; - T2 = 0.5 * CoxWL / (T1 * T1); - T3 = Vgsteff * (2.0 * T0 * T0 / 3.0 + Vgsteff - * (Vgsteff - 4.0 * T0 / 3.0)) - - 2.0 * T0 * T0 * T0 / 15.0; - qsrc = -T2 * T3; - T7 = 4.0 / 3.0 * Vgsteff * (Vgsteff - T0) - + 0.4 * T0 * T0; - T4 = -2.0 * qsrc / T1 - T2 * (Vgsteff * (3.0 - * Vgsteff - 8.0 * T0 / 3.0) - + 2.0 * T0 * T0 / 3.0); - T5 = (qsrc / T1 + T2 * T7) * AbulkCV; - T6 = (qsrc / T1 * VdseffCV + T2 * T7 * VdseffCV); - Csg = (T4 + T5 * dVdseffCV_dVg); - Csd = T5 * dVdseffCV_dVd + Csg * dVgsteff_dVd; - Csb = (T5 * dVdseffCV_dVb + T6 * dAbulkCV_dVb) - + Csg * dVgsteff_dVb; - Csg *= dVgsteff_dVg; - } - else - { /* 50/50 Charge petition model */ - qsrc = -0.5 * (qgate + qbulk); - Csg = -0.5 * (Cgg1 + Cbg1); - Csb = -0.5 * (Cgb1 + Cbb1); - Csd = -0.5 * (Cgd1 + Cbd1); - } - - qgate += Qac0 + Qsub0; - qbulk -= (Qac0 + Qsub0); - qdrn = -(qgate + qbulk + qsrc); - - Cgg = dQac0_dVg + dQsub0_dVg + Cgg1; - Cgd = dQsub0_dVd + Cgd1; - Cgb = dQac0_dVb + dQsub0_dVb + Cgb1; - - Cbg = Cbg1 - dQac0_dVg - dQsub0_dVg; - Cbd = Cbd1 - dQsub0_dVd; - Cbb = Cbb1 - dQac0_dVb - dQsub0_dVb; - - Cgb *= dVbseff_dVb; - Cbb *= dVbseff_dVb; - Csb *= dVbseff_dVb; - - here->BSIM4v7cggb = Cgg; - here->BSIM4v7cgsb = -(Cgg + Cgd + Cgb); - here->BSIM4v7cgdb = Cgd; - here->BSIM4v7cdgb = -(Cgg + Cbg + Csg); - here->BSIM4v7cdsb = (Cgg + Cgd + Cgb + Cbg + Cbd + Cbb - + Csg + Csd + Csb); - here->BSIM4v7cddb = -(Cgd + Cbd + Csd); - here->BSIM4v7cbgb = Cbg; - here->BSIM4v7cbsb = -(Cbg + Cbd + Cbb); - here->BSIM4v7cbdb = Cbd; - } - - /* Charge-Thickness capMod (CTM) begins */ - else if (model->BSIM4v7capMod == 2) - { V3 = here->BSIM4v7vfbzb - Vgs_eff + VbseffCV - DELTA_3; - if (here->BSIM4v7vfbzb <= 0.0) - T0 = sqrt(V3 * V3 - 4.0 * DELTA_3 * here->BSIM4v7vfbzb); - else - T0 = sqrt(V3 * V3 + 4.0 * DELTA_3 * here->BSIM4v7vfbzb); - - T1 = 0.5 * (1.0 + V3 / T0); - Vfbeff = here->BSIM4v7vfbzb - 0.5 * (V3 + T0); - dVfbeff_dVg = T1 * dVgs_eff_dVg; - dVfbeff_dVb = -T1 * dVbseffCV_dVb; - - Cox = model->BSIM4v7coxp; - Tox = 1.0e8 * model->BSIM4v7toxp; - T0 = (Vgs_eff - VbseffCV - here->BSIM4v7vfbzb) / Tox; - dT0_dVg = dVgs_eff_dVg / Tox; - dT0_dVb = -dVbseffCV_dVb / Tox; - - tmp = T0 * pParam->BSIM4v7acde; - if ((-EXP_THRESHOLD < tmp) && (tmp < EXP_THRESHOLD)) - { Tcen = pParam->BSIM4v7ldeb * exp(tmp); - dTcen_dVg = pParam->BSIM4v7acde * Tcen; - dTcen_dVb = dTcen_dVg * dT0_dVb; - dTcen_dVg *= dT0_dVg; - } - else if (tmp <= -EXP_THRESHOLD) - { Tcen = pParam->BSIM4v7ldeb * MIN_EXP; - dTcen_dVg = dTcen_dVb = 0.0; - } - else - { Tcen = pParam->BSIM4v7ldeb * MAX_EXP; - dTcen_dVg = dTcen_dVb = 0.0; - } - - LINK = 1.0e-3 * model->BSIM4v7toxp; - V3 = pParam->BSIM4v7ldeb - Tcen - LINK; - V4 = sqrt(V3 * V3 + 4.0 * LINK * pParam->BSIM4v7ldeb); - Tcen = pParam->BSIM4v7ldeb - 0.5 * (V3 + V4); - T1 = 0.5 * (1.0 + V3 / V4); - dTcen_dVg *= T1; - dTcen_dVb *= T1; - - Ccen = epssub / Tcen; - T2 = Cox / (Cox + Ccen); - Coxeff = T2 * Ccen; - T3 = -Ccen / Tcen; - dCoxeff_dVg = T2 * T2 * T3; - dCoxeff_dVb = dCoxeff_dVg * dTcen_dVb; - dCoxeff_dVg *= dTcen_dVg; - CoxWLcen = CoxWL * Coxeff / model->BSIM4v7coxe; - - Qac0 = CoxWLcen * (Vfbeff - here->BSIM4v7vfbzb); - QovCox = Qac0 / Coxeff; - dQac0_dVg = CoxWLcen * dVfbeff_dVg - + QovCox * dCoxeff_dVg; - dQac0_dVb = CoxWLcen * dVfbeff_dVb - + QovCox * dCoxeff_dVb; - - T0 = 0.5 * pParam->BSIM4v7k1ox; - T3 = Vgs_eff - Vfbeff - VbseffCV - Vgsteff; - if (pParam->BSIM4v7k1ox == 0.0) - { T1 = 0.0; - T2 = 0.0; - } - else if (T3 < 0.0) - { T1 = T0 + T3 / pParam->BSIM4v7k1ox; - T2 = CoxWLcen; - } - else - { T1 = sqrt(T0 * T0 + T3); - T2 = CoxWLcen * T0 / T1; - } - - Qsub0 = CoxWLcen * pParam->BSIM4v7k1ox * (T1 - T0); - QovCox = Qsub0 / Coxeff; - dQsub0_dVg = T2 * (dVgs_eff_dVg - dVfbeff_dVg - dVgsteff_dVg) - + QovCox * dCoxeff_dVg; - dQsub0_dVd = -T2 * dVgsteff_dVd; - dQsub0_dVb = -T2 * (dVfbeff_dVb + dVbseffCV_dVb + dVgsteff_dVb) - + QovCox * dCoxeff_dVb; - - /* Gate-bias dependent delta Phis begins */ - if (pParam->BSIM4v7k1ox <= 0.0) - { Denomi = 0.25 * pParam->BSIM4v7moin * Vtm; - T0 = 0.5 * pParam->BSIM4v7sqrtPhi; - } - else - { Denomi = pParam->BSIM4v7moin * Vtm - * pParam->BSIM4v7k1ox * pParam->BSIM4v7k1ox; - T0 = pParam->BSIM4v7k1ox * pParam->BSIM4v7sqrtPhi; - } - T1 = 2.0 * T0 + Vgsteff; - - DeltaPhi = Vtm * log(1.0 + T1 * Vgsteff / Denomi); - dDeltaPhi_dVg = 2.0 * Vtm * (T1 -T0) / (Denomi + T1 * Vgsteff); - /* End of delta Phis */ - - /* VgDP = Vgsteff - DeltaPhi */ - T0 = Vgsteff - DeltaPhi - 0.001; - dT0_dVg = 1.0 - dDeltaPhi_dVg; - T1 = sqrt(T0 * T0 + Vgsteff * 0.004); - VgDP = 0.5 * (T0 + T1); - dVgDP_dVg = 0.5 * (dT0_dVg + (T0 * dT0_dVg + 0.002) / T1); - - Tox += Tox; /* WDLiu: Tcen reevaluated below due to different Vgsteff */ - T0 = (Vgsteff + here->BSIM4v7vtfbphi2) / Tox; - tmp = exp(model->BSIM4v7bdos * 0.7 * log(T0)); - T1 = 1.0 + tmp; - T2 = model->BSIM4v7bdos * 0.7 * tmp / (T0 * Tox); - Tcen = model->BSIM4v7ados * 1.9e-9 / T1; - dTcen_dVg = -Tcen * T2 / T1; - dTcen_dVd = dTcen_dVg * dVgsteff_dVd; - dTcen_dVb = dTcen_dVg * dVgsteff_dVb; - dTcen_dVg *= dVgsteff_dVg; - - Ccen = epssub / Tcen; - T0 = Cox / (Cox + Ccen); - Coxeff = T0 * Ccen; - T1 = -Ccen / Tcen; - dCoxeff_dVg = T0 * T0 * T1; - dCoxeff_dVd = dCoxeff_dVg * dTcen_dVd; - dCoxeff_dVb = dCoxeff_dVg * dTcen_dVb; - dCoxeff_dVg *= dTcen_dVg; - CoxWLcen = CoxWL * Coxeff / model->BSIM4v7coxe; - - AbulkCV = Abulk0 * pParam->BSIM4v7abulkCVfactor; - dAbulkCV_dVb = pParam->BSIM4v7abulkCVfactor * dAbulk0_dVb; - VdsatCV = VgDP / AbulkCV; - - T0 = VdsatCV - Vds - DELTA_4; - dT0_dVg = dVgDP_dVg / AbulkCV; - dT0_dVb = -VdsatCV * dAbulkCV_dVb / AbulkCV; - T1 = sqrt(T0 * T0 + 4.0 * DELTA_4 * VdsatCV); - dT1_dVg = (T0 + DELTA_4 + DELTA_4) / T1; - dT1_dVd = -T0 / T1; - dT1_dVb = dT1_dVg * dT0_dVb; - dT1_dVg *= dT0_dVg; - if (T0 >= 0.0) - { VdseffCV = VdsatCV - 0.5 * (T0 + T1); - dVdseffCV_dVg = 0.5 * (dT0_dVg - dT1_dVg); - dVdseffCV_dVd = 0.5 * (1.0 - dT1_dVd); - dVdseffCV_dVb = 0.5 * (dT0_dVb - dT1_dVb); - } - else - { T3 = (DELTA_4 + DELTA_4) / (T1 - T0); - T4 = 1.0 - T3; - T5 = VdsatCV * T3 / (T1 - T0); - VdseffCV = VdsatCV * T4; - dVdseffCV_dVg = dT0_dVg * T4 + T5 * (dT1_dVg - dT0_dVg); - dVdseffCV_dVd = T5 * (dT1_dVd + 1.0); - dVdseffCV_dVb = dT0_dVb * (T4 - T5) + T5 * dT1_dVb; - } - - if (Vds == 0.0) - { VdseffCV = 0.0; - dVdseffCV_dVg = 0.0; - dVdseffCV_dVb = 0.0; - } - - T0 = AbulkCV * VdseffCV; - T1 = VgDP; - T2 = 12.0 * (T1 - 0.5 * T0 + 1.0e-20); - T3 = T0 / T2; - T4 = 1.0 - 12.0 * T3 * T3; - T5 = AbulkCV * (6.0 * T0 * (4.0 * T1 - T0) / (T2 * T2) - 0.5); - T6 = T5 * VdseffCV / AbulkCV; - - qgate = CoxWLcen * (T1 - T0 * (0.5 - T3)); - QovCox = qgate / Coxeff; - Cgg1 = CoxWLcen * (T4 * dVgDP_dVg - + T5 * dVdseffCV_dVg); - Cgd1 = CoxWLcen * T5 * dVdseffCV_dVd + Cgg1 - * dVgsteff_dVd + QovCox * dCoxeff_dVd; - Cgb1 = CoxWLcen * (T5 * dVdseffCV_dVb + T6 * dAbulkCV_dVb) - + Cgg1 * dVgsteff_dVb + QovCox * dCoxeff_dVb; - Cgg1 = Cgg1 * dVgsteff_dVg + QovCox * dCoxeff_dVg; - - - T7 = 1.0 - AbulkCV; - T8 = T2 * T2; - T9 = 12.0 * T7 * T0 * T0 / (T8 * AbulkCV); - T10 = T9 * dVgDP_dVg; - T11 = -T7 * T5 / AbulkCV; - T12 = -(T9 * T1 / AbulkCV + VdseffCV * (0.5 - T0 / T2)); - - qbulk = CoxWLcen * T7 * (0.5 * VdseffCV - T0 * VdseffCV / T2); - QovCox = qbulk / Coxeff; - Cbg1 = CoxWLcen * (T10 + T11 * dVdseffCV_dVg); - Cbd1 = CoxWLcen * T11 * dVdseffCV_dVd + Cbg1 - * dVgsteff_dVd + QovCox * dCoxeff_dVd; - Cbb1 = CoxWLcen * (T11 * dVdseffCV_dVb + T12 * dAbulkCV_dVb) - + Cbg1 * dVgsteff_dVb + QovCox * dCoxeff_dVb; - Cbg1 = Cbg1 * dVgsteff_dVg + QovCox * dCoxeff_dVg; - - if (model->BSIM4v7xpart > 0.5) - { /* 0/100 partition */ - qsrc = -CoxWLcen * (T1 / 2.0 + T0 / 4.0 - - 0.5 * T0 * T0 / T2); - QovCox = qsrc / Coxeff; - T2 += T2; - T3 = T2 * T2; - T7 = -(0.25 - 12.0 * T0 * (4.0 * T1 - T0) / T3); - T4 = -(0.5 + 24.0 * T0 * T0 / T3) * dVgDP_dVg; - T5 = T7 * AbulkCV; - T6 = T7 * VdseffCV; - - Csg = CoxWLcen * (T4 + T5 * dVdseffCV_dVg); - Csd = CoxWLcen * T5 * dVdseffCV_dVd + Csg * dVgsteff_dVd - + QovCox * dCoxeff_dVd; - Csb = CoxWLcen * (T5 * dVdseffCV_dVb + T6 * dAbulkCV_dVb) - + Csg * dVgsteff_dVb + QovCox * dCoxeff_dVb; - Csg = Csg * dVgsteff_dVg + QovCox * dCoxeff_dVg; - } - else if (model->BSIM4v7xpart < 0.5) - { /* 40/60 partition */ - T2 = T2 / 12.0; - T3 = 0.5 * CoxWLcen / (T2 * T2); - T4 = T1 * (2.0 * T0 * T0 / 3.0 + T1 * (T1 - 4.0 - * T0 / 3.0)) - 2.0 * T0 * T0 * T0 / 15.0; - qsrc = -T3 * T4; - QovCox = qsrc / Coxeff; - T8 = 4.0 / 3.0 * T1 * (T1 - T0) + 0.4 * T0 * T0; - T5 = -2.0 * qsrc / T2 - T3 * (T1 * (3.0 * T1 - 8.0 - * T0 / 3.0) + 2.0 * T0 * T0 / 3.0); - T6 = AbulkCV * (qsrc / T2 + T3 * T8); - T7 = T6 * VdseffCV / AbulkCV; - - Csg = T5 * dVgDP_dVg + T6 * dVdseffCV_dVg; - Csd = Csg * dVgsteff_dVd + T6 * dVdseffCV_dVd - + QovCox * dCoxeff_dVd; - Csb = Csg * dVgsteff_dVb + T6 * dVdseffCV_dVb - + T7 * dAbulkCV_dVb + QovCox * dCoxeff_dVb; - Csg = Csg * dVgsteff_dVg + QovCox * dCoxeff_dVg; - } - else - { /* 50/50 partition */ - qsrc = -0.5 * qgate; - Csg = -0.5 * Cgg1; - Csd = -0.5 * Cgd1; - Csb = -0.5 * Cgb1; - } - - qgate += Qac0 + Qsub0 - qbulk; - qbulk -= (Qac0 + Qsub0); - qdrn = -(qgate + qbulk + qsrc); - - Cbg = Cbg1 - dQac0_dVg - dQsub0_dVg; - Cbd = Cbd1 - dQsub0_dVd; - Cbb = Cbb1 - dQac0_dVb - dQsub0_dVb; - - Cgg = Cgg1 - Cbg; - Cgd = Cgd1 - Cbd; - Cgb = Cgb1 - Cbb; - - Cgb *= dVbseff_dVb; - Cbb *= dVbseff_dVb; - Csb *= dVbseff_dVb; - - here->BSIM4v7cggb = Cgg; - here->BSIM4v7cgsb = -(Cgg + Cgd + Cgb); - here->BSIM4v7cgdb = Cgd; - here->BSIM4v7cdgb = -(Cgg + Cbg + Csg); - here->BSIM4v7cdsb = (Cgg + Cgd + Cgb + Cbg + Cbd + Cbb - + Csg + Csd + Csb); - here->BSIM4v7cddb = -(Cgd + Cbd + Csd); - here->BSIM4v7cbgb = Cbg; - here->BSIM4v7cbsb = -(Cbg + Cbd + Cbb); - here->BSIM4v7cbdb = Cbd; - } /* End of CTM */ - } - - here->BSIM4v7csgb = - here->BSIM4v7cggb - here->BSIM4v7cdgb - here->BSIM4v7cbgb; - here->BSIM4v7csdb = - here->BSIM4v7cgdb - here->BSIM4v7cddb - here->BSIM4v7cbdb; - here->BSIM4v7cssb = - here->BSIM4v7cgsb - here->BSIM4v7cdsb - here->BSIM4v7cbsb; - here->BSIM4v7cgbb = - here->BSIM4v7cgdb - here->BSIM4v7cggb - here->BSIM4v7cgsb; - here->BSIM4v7cdbb = - here->BSIM4v7cddb - here->BSIM4v7cdgb - here->BSIM4v7cdsb; - here->BSIM4v7cbbb = - here->BSIM4v7cbgb - here->BSIM4v7cbdb - here->BSIM4v7cbsb; - here->BSIM4v7csbb = - here->BSIM4v7cgbb - here->BSIM4v7cdbb - here->BSIM4v7cbbb; - here->BSIM4v7qgate = qgate; - here->BSIM4v7qbulk = qbulk; - here->BSIM4v7qdrn = qdrn; - here->BSIM4v7qsrc = -(qgate + qbulk + qdrn); - - /* NQS begins */ - if ((here->BSIM4v7trnqsMod) || (here->BSIM4v7acnqsMod)) - { here->BSIM4v7qchqs = qcheq = -(qbulk + qgate); - here->BSIM4v7cqgb = -(here->BSIM4v7cggb + here->BSIM4v7cbgb); - here->BSIM4v7cqdb = -(here->BSIM4v7cgdb + here->BSIM4v7cbdb); - here->BSIM4v7cqsb = -(here->BSIM4v7cgsb + here->BSIM4v7cbsb); - here->BSIM4v7cqbb = -(here->BSIM4v7cqgb + here->BSIM4v7cqdb - + here->BSIM4v7cqsb); - - CoxWL = model->BSIM4v7coxe * pParam->BSIM4v7weffCV * here->BSIM4v7nf - * pParam->BSIM4v7leffCV; - T1 = here->BSIM4v7gcrg / CoxWL; /* 1 / tau */ - here->BSIM4v7gtau = T1 * ScalingFactor; - - if (here->BSIM4v7acnqsMod) - here->BSIM4v7taunet = 1.0 / T1; - - *(ckt->CKTstate0 + here->BSIM4v7qcheq) = qcheq; - if (ckt->CKTmode & MODEINITTRAN) - *(ckt->CKTstate1 + here->BSIM4v7qcheq) = - *(ckt->CKTstate0 + here->BSIM4v7qcheq); - if (here->BSIM4v7trnqsMod) - { error = NIintegrate(ckt, &geq, &ceq, 0.0, here->BSIM4v7qcheq); - if (error) - return(error); - } - } - - -finished: - - /* Calculate junction C-V */ - if (ChargeComputationNeeded) - { czbd = model->BSIM4v7DunitAreaTempJctCap * here->BSIM4v7Adeff; /* bug fix */ - czbs = model->BSIM4v7SunitAreaTempJctCap * here->BSIM4v7Aseff; - czbdsw = model->BSIM4v7DunitLengthSidewallTempJctCap * here->BSIM4v7Pdeff; - czbdswg = model->BSIM4v7DunitLengthGateSidewallTempJctCap - * pParam->BSIM4v7weffCJ * here->BSIM4v7nf; - czbssw = model->BSIM4v7SunitLengthSidewallTempJctCap * here->BSIM4v7Pseff; - czbsswg = model->BSIM4v7SunitLengthGateSidewallTempJctCap - * pParam->BSIM4v7weffCJ * here->BSIM4v7nf; - - MJS = model->BSIM4v7SbulkJctBotGradingCoeff; - MJSWS = model->BSIM4v7SbulkJctSideGradingCoeff; - MJSWGS = model->BSIM4v7SbulkJctGateSideGradingCoeff; - - MJD = model->BSIM4v7DbulkJctBotGradingCoeff; - MJSWD = model->BSIM4v7DbulkJctSideGradingCoeff; - MJSWGD = model->BSIM4v7DbulkJctGateSideGradingCoeff; - - /* Source Bulk Junction */ - if (vbs_jct == 0.0) - { *(ckt->CKTstate0 + here->BSIM4v7qbs) = 0.0; - here->BSIM4v7capbs = czbs + czbssw + czbsswg; - } - else if (vbs_jct < 0.0) - { if (czbs > 0.0) - { arg = 1.0 - vbs_jct / model->BSIM4v7PhiBS; - if (MJS == 0.5) - sarg = 1.0 / sqrt(arg); - else - sarg = exp(-MJS * log(arg)); - *(ckt->CKTstate0 + here->BSIM4v7qbs) = model->BSIM4v7PhiBS * czbs - * (1.0 - arg * sarg) / (1.0 - MJS); - here->BSIM4v7capbs = czbs * sarg; - } - else - { *(ckt->CKTstate0 + here->BSIM4v7qbs) = 0.0; - here->BSIM4v7capbs = 0.0; - } - if (czbssw > 0.0) - { arg = 1.0 - vbs_jct / model->BSIM4v7PhiBSWS; - if (MJSWS == 0.5) - sarg = 1.0 / sqrt(arg); - else - sarg = exp(-MJSWS * log(arg)); - *(ckt->CKTstate0 + here->BSIM4v7qbs) += model->BSIM4v7PhiBSWS * czbssw - * (1.0 - arg * sarg) / (1.0 - MJSWS); - here->BSIM4v7capbs += czbssw * sarg; - } - if (czbsswg > 0.0) - { arg = 1.0 - vbs_jct / model->BSIM4v7PhiBSWGS; - if (MJSWGS == 0.5) - sarg = 1.0 / sqrt(arg); - else - sarg = exp(-MJSWGS * log(arg)); - *(ckt->CKTstate0 + here->BSIM4v7qbs) += model->BSIM4v7PhiBSWGS * czbsswg - * (1.0 - arg * sarg) / (1.0 - MJSWGS); - here->BSIM4v7capbs += czbsswg * sarg; - } - - } - else - { T0 = czbs + czbssw + czbsswg; - T1 = vbs_jct * (czbs * MJS / model->BSIM4v7PhiBS + czbssw * MJSWS - / model->BSIM4v7PhiBSWS + czbsswg * MJSWGS / model->BSIM4v7PhiBSWGS); - *(ckt->CKTstate0 + here->BSIM4v7qbs) = vbs_jct * (T0 + 0.5 * T1); - here->BSIM4v7capbs = T0 + T1; - } - - /* Drain Bulk Junction */ - if (vbd_jct == 0.0) - { *(ckt->CKTstate0 + here->BSIM4v7qbd) = 0.0; - here->BSIM4v7capbd = czbd + czbdsw + czbdswg; - } - else if (vbd_jct < 0.0) - { if (czbd > 0.0) - { arg = 1.0 - vbd_jct / model->BSIM4v7PhiBD; - if (MJD == 0.5) - sarg = 1.0 / sqrt(arg); - else - sarg = exp(-MJD * log(arg)); - *(ckt->CKTstate0 + here->BSIM4v7qbd) = model->BSIM4v7PhiBD* czbd - * (1.0 - arg * sarg) / (1.0 - MJD); - here->BSIM4v7capbd = czbd * sarg; - } - else - { *(ckt->CKTstate0 + here->BSIM4v7qbd) = 0.0; - here->BSIM4v7capbd = 0.0; - } - if (czbdsw > 0.0) - { arg = 1.0 - vbd_jct / model->BSIM4v7PhiBSWD; - if (MJSWD == 0.5) - sarg = 1.0 / sqrt(arg); - else - sarg = exp(-MJSWD * log(arg)); - *(ckt->CKTstate0 + here->BSIM4v7qbd) += model->BSIM4v7PhiBSWD * czbdsw - * (1.0 - arg * sarg) / (1.0 - MJSWD); - here->BSIM4v7capbd += czbdsw * sarg; - } - if (czbdswg > 0.0) - { arg = 1.0 - vbd_jct / model->BSIM4v7PhiBSWGD; - if (MJSWGD == 0.5) - sarg = 1.0 / sqrt(arg); - else - sarg = exp(-MJSWGD * log(arg)); - *(ckt->CKTstate0 + here->BSIM4v7qbd) += model->BSIM4v7PhiBSWGD * czbdswg - * (1.0 - arg * sarg) / (1.0 - MJSWGD); - here->BSIM4v7capbd += czbdswg * sarg; - } - } - else - { T0 = czbd + czbdsw + czbdswg; - T1 = vbd_jct * (czbd * MJD / model->BSIM4v7PhiBD + czbdsw * MJSWD - / model->BSIM4v7PhiBSWD + czbdswg * MJSWGD / model->BSIM4v7PhiBSWGD); - *(ckt->CKTstate0 + here->BSIM4v7qbd) = vbd_jct * (T0 + 0.5 * T1); - here->BSIM4v7capbd = T0 + T1; - } - } - - - /* - * check convergence - */ - - if ((here->BSIM4v7off == 0) || (!(ckt->CKTmode & MODEINITFIX))) - { if (Check == 1) - { ckt->CKTnoncon++; -#ifndef NEWCONV - } - else - { if (here->BSIM4v7mode >= 0) - { Idtot = here->BSIM4v7cd + here->BSIM4v7csub - + here->BSIM4v7Igidl - here->BSIM4v7cbd; - } - else - { Idtot = here->BSIM4v7cd + here->BSIM4v7cbd - here->BSIM4v7Igidl; /* bugfix */ - } - tol0 = ckt->CKTreltol * MAX(fabs(cdhat), fabs(Idtot)) - + ckt->CKTabstol; - tol1 = ckt->CKTreltol * MAX(fabs(cseshat), fabs(Isestot)) - + ckt->CKTabstol; - tol2 = ckt->CKTreltol * MAX(fabs(cdedhat), fabs(Idedtot)) - + ckt->CKTabstol; - tol3 = ckt->CKTreltol * MAX(fabs(cgshat), fabs(Igstot)) - + ckt->CKTabstol; - tol4 = ckt->CKTreltol * MAX(fabs(cgdhat), fabs(Igdtot)) - + ckt->CKTabstol; - tol5 = ckt->CKTreltol * MAX(fabs(cgbhat), fabs(Igbtot)) - + ckt->CKTabstol; - if ((fabs(cdhat - Idtot) >= tol0) || (fabs(cseshat - Isestot) >= tol1) - || (fabs(cdedhat - Idedtot) >= tol2)) - { ckt->CKTnoncon++; - } - else if ((fabs(cgshat - Igstot) >= tol3) || (fabs(cgdhat - Igdtot) >= tol4) - || (fabs(cgbhat - Igbtot) >= tol5)) - { ckt->CKTnoncon++; - } - else - { Ibtot = here->BSIM4v7cbs + here->BSIM4v7cbd - - here->BSIM4v7Igidl - here->BSIM4v7Igisl - here->BSIM4v7csub; - tol6 = ckt->CKTreltol * MAX(fabs(cbhat), fabs(Ibtot)) - + ckt->CKTabstol; - if (fabs(cbhat - Ibtot) > tol6) - { ckt->CKTnoncon++; - } - } -#endif /* NEWCONV */ - } - } - *(ckt->CKTstate0 + here->BSIM4v7vds) = vds; - *(ckt->CKTstate0 + here->BSIM4v7vgs) = vgs; - *(ckt->CKTstate0 + here->BSIM4v7vbs) = vbs; - *(ckt->CKTstate0 + here->BSIM4v7vbd) = vbd; - *(ckt->CKTstate0 + here->BSIM4v7vges) = vges; - *(ckt->CKTstate0 + here->BSIM4v7vgms) = vgms; - *(ckt->CKTstate0 + here->BSIM4v7vdbs) = vdbs; - *(ckt->CKTstate0 + here->BSIM4v7vdbd) = vdbd; - *(ckt->CKTstate0 + here->BSIM4v7vsbs) = vsbs; - *(ckt->CKTstate0 + here->BSIM4v7vses) = vses; - *(ckt->CKTstate0 + here->BSIM4v7vdes) = vdes; - *(ckt->CKTstate0 + here->BSIM4v7qdef) = qdef; - - - if (!ChargeComputationNeeded) - goto line850; - - if (here->BSIM4v7rgateMod == 3) - { - vgdx = vgmd; - vgsx = vgms; - } - else /* For rgateMod == 0, 1 and 2 */ - { - vgdx = vgd; - vgsx = vgs; - } - if (model->BSIM4v7capMod == 0) - { - cgdo = pParam->BSIM4v7cgdo; - qgdo = pParam->BSIM4v7cgdo * vgdx; - cgso = pParam->BSIM4v7cgso; - qgso = pParam->BSIM4v7cgso * vgsx; - } - else /* For both capMod == 1 and 2 */ - { T0 = vgdx + DELTA_1; - T1 = sqrt(T0 * T0 + 4.0 * DELTA_1); - T2 = 0.5 * (T0 - T1); - - T3 = pParam->BSIM4v7weffCV * pParam->BSIM4v7cgdl; - T4 = sqrt(1.0 - 4.0 * T2 / pParam->BSIM4v7ckappad); - cgdo = pParam->BSIM4v7cgdo + T3 - T3 * (1.0 - 1.0 / T4) - * (0.5 - 0.5 * T0 / T1); - qgdo = (pParam->BSIM4v7cgdo + T3) * vgdx - T3 * (T2 - + 0.5 * pParam->BSIM4v7ckappad * (T4 - 1.0)); - - T0 = vgsx + DELTA_1; - T1 = sqrt(T0 * T0 + 4.0 * DELTA_1); - T2 = 0.5 * (T0 - T1); - T3 = pParam->BSIM4v7weffCV * pParam->BSIM4v7cgsl; - T4 = sqrt(1.0 - 4.0 * T2 / pParam->BSIM4v7ckappas); - cgso = pParam->BSIM4v7cgso + T3 - T3 * (1.0 - 1.0 / T4) - * (0.5 - 0.5 * T0 / T1); - qgso = (pParam->BSIM4v7cgso + T3) * vgsx - T3 * (T2 - + 0.5 * pParam->BSIM4v7ckappas * (T4 - 1.0)); - } - - if (here->BSIM4v7nf != 1.0) - { cgdo *= here->BSIM4v7nf; - cgso *= here->BSIM4v7nf; - qgdo *= here->BSIM4v7nf; - qgso *= here->BSIM4v7nf; - } - here->BSIM4v7cgdo = cgdo; - here->BSIM4v7qgdo = qgdo; - here->BSIM4v7cgso = cgso; - here->BSIM4v7qgso = qgso; - -#ifndef NOBYPASS -line755: -#endif - ag0 = ckt->CKTag[0]; - if (here->BSIM4v7mode > 0) - { if (here->BSIM4v7trnqsMod == 0) - { qdrn -= qgdo; - if (here->BSIM4v7rgateMod == 3) - { gcgmgmb = (cgdo + cgso + pParam->BSIM4v7cgbo) * ag0; - gcgmdb = -cgdo * ag0; - gcgmsb = -cgso * ag0; - gcgmbb = -pParam->BSIM4v7cgbo * ag0; - - gcdgmb = gcgmdb; - gcsgmb = gcgmsb; - gcbgmb = gcgmbb; - - gcggb = here->BSIM4v7cggb * ag0; - gcgdb = here->BSIM4v7cgdb * ag0; - gcgsb = here->BSIM4v7cgsb * ag0; - gcgbb = -(gcggb + gcgdb + gcgsb); - - gcdgb = here->BSIM4v7cdgb * ag0; - gcsgb = -(here->BSIM4v7cggb + here->BSIM4v7cbgb - + here->BSIM4v7cdgb) * ag0; - gcbgb = here->BSIM4v7cbgb * ag0; - - qgmb = pParam->BSIM4v7cgbo * vgmb; - qgmid = qgdo + qgso + qgmb; - qbulk -= qgmb; - qsrc = -(qgate + qgmid + qbulk + qdrn); - } - else - { gcggb = (here->BSIM4v7cggb + cgdo + cgso - + pParam->BSIM4v7cgbo ) * ag0; - gcgdb = (here->BSIM4v7cgdb - cgdo) * ag0; - gcgsb = (here->BSIM4v7cgsb - cgso) * ag0; - gcgbb = -(gcggb + gcgdb + gcgsb); - - gcdgb = (here->BSIM4v7cdgb - cgdo) * ag0; - gcsgb = -(here->BSIM4v7cggb + here->BSIM4v7cbgb - + here->BSIM4v7cdgb + cgso) * ag0; - gcbgb = (here->BSIM4v7cbgb - pParam->BSIM4v7cgbo) * ag0; - - gcdgmb = gcsgmb = gcbgmb = 0.0; - - qgb = pParam->BSIM4v7cgbo * vgb; - qgate += qgdo + qgso + qgb; - qbulk -= qgb; - qsrc = -(qgate + qbulk + qdrn); - } - gcddb = (here->BSIM4v7cddb + here->BSIM4v7capbd + cgdo) * ag0; - gcdsb = here->BSIM4v7cdsb * ag0; - - gcsdb = -(here->BSIM4v7cgdb + here->BSIM4v7cbdb - + here->BSIM4v7cddb) * ag0; - gcssb = (here->BSIM4v7capbs + cgso - (here->BSIM4v7cgsb - + here->BSIM4v7cbsb + here->BSIM4v7cdsb)) * ag0; - - if (!here->BSIM4v7rbodyMod) - { gcdbb = -(gcdgb + gcddb + gcdsb + gcdgmb); - gcsbb = -(gcsgb + gcsdb + gcssb + gcsgmb); - gcbdb = (here->BSIM4v7cbdb - here->BSIM4v7capbd) * ag0; - gcbsb = (here->BSIM4v7cbsb - here->BSIM4v7capbs) * ag0; - gcdbdb = 0.0; gcsbsb = 0.0; - } - else - { gcdbb = -(here->BSIM4v7cddb + here->BSIM4v7cdgb - + here->BSIM4v7cdsb) * ag0; - gcsbb = -(gcsgb + gcsdb + gcssb + gcsgmb) - + here->BSIM4v7capbs * ag0; - gcbdb = here->BSIM4v7cbdb * ag0; - gcbsb = here->BSIM4v7cbsb * ag0; - - gcdbdb = -here->BSIM4v7capbd * ag0; - gcsbsb = -here->BSIM4v7capbs * ag0; - } - gcbbb = -(gcbdb + gcbgb + gcbsb + gcbgmb); - - ggtg = ggtd = ggtb = ggts = 0.0; - sxpart = 0.6; - dxpart = 0.4; - ddxpart_dVd = ddxpart_dVg = ddxpart_dVb = ddxpart_dVs = 0.0; - dsxpart_dVd = dsxpart_dVg = dsxpart_dVb = dsxpart_dVs = 0.0; - } - else - { qcheq = here->BSIM4v7qchqs; - CoxWL = model->BSIM4v7coxe * pParam->BSIM4v7weffCV * here->BSIM4v7nf - * pParam->BSIM4v7leffCV; - T0 = qdef * ScalingFactor / CoxWL; - - ggtg = here->BSIM4v7gtg = T0 * here->BSIM4v7gcrgg; - ggtd = here->BSIM4v7gtd = T0 * here->BSIM4v7gcrgd; - ggts = here->BSIM4v7gts = T0 * here->BSIM4v7gcrgs; - ggtb = here->BSIM4v7gtb = T0 * here->BSIM4v7gcrgb; - gqdef = ScalingFactor * ag0; - - gcqgb = here->BSIM4v7cqgb * ag0; - gcqdb = here->BSIM4v7cqdb * ag0; - gcqsb = here->BSIM4v7cqsb * ag0; - gcqbb = here->BSIM4v7cqbb * ag0; - - if (fabs(qcheq) <= 1.0e-5 * CoxWL) - { if (model->BSIM4v7xpart < 0.5) - { dxpart = 0.4; - } - else if (model->BSIM4v7xpart > 0.5) - { dxpart = 0.0; - } - else - { dxpart = 0.5; - } - ddxpart_dVd = ddxpart_dVg = ddxpart_dVb - = ddxpart_dVs = 0.0; - } - else - { dxpart = qdrn / qcheq; - Cdd = here->BSIM4v7cddb; - Csd = -(here->BSIM4v7cgdb + here->BSIM4v7cddb - + here->BSIM4v7cbdb); - ddxpart_dVd = (Cdd - dxpart * (Cdd + Csd)) / qcheq; - Cdg = here->BSIM4v7cdgb; - Csg = -(here->BSIM4v7cggb + here->BSIM4v7cdgb - + here->BSIM4v7cbgb); - ddxpart_dVg = (Cdg - dxpart * (Cdg + Csg)) / qcheq; - - Cds = here->BSIM4v7cdsb; - Css = -(here->BSIM4v7cgsb + here->BSIM4v7cdsb - + here->BSIM4v7cbsb); - ddxpart_dVs = (Cds - dxpart * (Cds + Css)) / qcheq; - - ddxpart_dVb = -(ddxpart_dVd + ddxpart_dVg + ddxpart_dVs); - } - sxpart = 1.0 - dxpart; - dsxpart_dVd = -ddxpart_dVd; - dsxpart_dVg = -ddxpart_dVg; - dsxpart_dVs = -ddxpart_dVs; - dsxpart_dVb = -(dsxpart_dVd + dsxpart_dVg + dsxpart_dVs); - - if (here->BSIM4v7rgateMod == 3) - { gcgmgmb = (cgdo + cgso + pParam->BSIM4v7cgbo) * ag0; - gcgmdb = -cgdo * ag0; - gcgmsb = -cgso * ag0; - gcgmbb = -pParam->BSIM4v7cgbo * ag0; - - gcdgmb = gcgmdb; - gcsgmb = gcgmsb; - gcbgmb = gcgmbb; - - gcdgb = gcsgb = gcbgb = 0.0; - gcggb = gcgdb = gcgsb = gcgbb = 0.0; - - qgmb = pParam->BSIM4v7cgbo * vgmb; - qgmid = qgdo + qgso + qgmb; - qgate = 0.0; - qbulk = -qgmb; - qdrn = -qgdo; - qsrc = -(qgmid + qbulk + qdrn); - } - else - { gcggb = (cgdo + cgso + pParam->BSIM4v7cgbo ) * ag0; - gcgdb = -cgdo * ag0; - gcgsb = -cgso * ag0; - gcgbb = -pParam->BSIM4v7cgbo * ag0; - - gcdgb = gcgdb; - gcsgb = gcgsb; - gcbgb = gcgbb; - gcdgmb = gcsgmb = gcbgmb = 0.0; - - qgb = pParam->BSIM4v7cgbo * vgb; - qgate = qgdo + qgso + qgb; - qbulk = -qgb; - qdrn = -qgdo; - qsrc = -(qgate + qbulk + qdrn); - } - - gcddb = (here->BSIM4v7capbd + cgdo) * ag0; - gcdsb = gcsdb = 0.0; - gcssb = (here->BSIM4v7capbs + cgso) * ag0; - - if (!here->BSIM4v7rbodyMod) - { gcdbb = -(gcdgb + gcddb + gcdgmb); - gcsbb = -(gcsgb + gcssb + gcsgmb); - gcbdb = -here->BSIM4v7capbd * ag0; - gcbsb = -here->BSIM4v7capbs * ag0; - gcdbdb = 0.0; gcsbsb = 0.0; - } - else - { gcdbb = gcsbb = gcbdb = gcbsb = 0.0; - gcdbdb = -here->BSIM4v7capbd * ag0; - gcsbsb = -here->BSIM4v7capbs * ag0; - } - gcbbb = -(gcbdb + gcbgb + gcbsb + gcbgmb); - } - } - else - { if (here->BSIM4v7trnqsMod == 0) - { qsrc = qdrn - qgso; - if (here->BSIM4v7rgateMod == 3) - { gcgmgmb = (cgdo + cgso + pParam->BSIM4v7cgbo) * ag0; - gcgmdb = -cgdo * ag0; - gcgmsb = -cgso * ag0; - gcgmbb = -pParam->BSIM4v7cgbo * ag0; - - gcdgmb = gcgmdb; - gcsgmb = gcgmsb; - gcbgmb = gcgmbb; - - gcggb = here->BSIM4v7cggb * ag0; - gcgdb = here->BSIM4v7cgsb * ag0; - gcgsb = here->BSIM4v7cgdb * ag0; - gcgbb = -(gcggb + gcgdb + gcgsb); - - gcdgb = -(here->BSIM4v7cggb + here->BSIM4v7cbgb - + here->BSIM4v7cdgb) * ag0; - gcsgb = here->BSIM4v7cdgb * ag0; - gcbgb = here->BSIM4v7cbgb * ag0; - - qgmb = pParam->BSIM4v7cgbo * vgmb; - qgmid = qgdo + qgso + qgmb; - qbulk -= qgmb; - qdrn = -(qgate + qgmid + qbulk + qsrc); - } - else - { gcggb = (here->BSIM4v7cggb + cgdo + cgso - + pParam->BSIM4v7cgbo ) * ag0; - gcgdb = (here->BSIM4v7cgsb - cgdo) * ag0; - gcgsb = (here->BSIM4v7cgdb - cgso) * ag0; - gcgbb = -(gcggb + gcgdb + gcgsb); - - gcdgb = -(here->BSIM4v7cggb + here->BSIM4v7cbgb - + here->BSIM4v7cdgb + cgdo) * ag0; - gcsgb = (here->BSIM4v7cdgb - cgso) * ag0; - gcbgb = (here->BSIM4v7cbgb - pParam->BSIM4v7cgbo) * ag0; - - gcdgmb = gcsgmb = gcbgmb = 0.0; - - qgb = pParam->BSIM4v7cgbo * vgb; - qgate += qgdo + qgso + qgb; - qbulk -= qgb; - qdrn = -(qgate + qbulk + qsrc); - } - gcddb = (here->BSIM4v7capbd + cgdo - (here->BSIM4v7cgsb - + here->BSIM4v7cbsb + here->BSIM4v7cdsb)) * ag0; - gcdsb = -(here->BSIM4v7cgdb + here->BSIM4v7cbdb - + here->BSIM4v7cddb) * ag0; - - gcsdb = here->BSIM4v7cdsb * ag0; - gcssb = (here->BSIM4v7cddb + here->BSIM4v7capbs + cgso) * ag0; - - if (!here->BSIM4v7rbodyMod) - { gcdbb = -(gcdgb + gcddb + gcdsb + gcdgmb); - gcsbb = -(gcsgb + gcsdb + gcssb + gcsgmb); - gcbdb = (here->BSIM4v7cbsb - here->BSIM4v7capbd) * ag0; - gcbsb = (here->BSIM4v7cbdb - here->BSIM4v7capbs) * ag0; - gcdbdb = 0.0; gcsbsb = 0.0; - } - else - { gcdbb = -(gcdgb + gcddb + gcdsb + gcdgmb) - + here->BSIM4v7capbd * ag0; - gcsbb = -(here->BSIM4v7cddb + here->BSIM4v7cdgb - + here->BSIM4v7cdsb) * ag0; - gcbdb = here->BSIM4v7cbsb * ag0; - gcbsb = here->BSIM4v7cbdb * ag0; - gcdbdb = -here->BSIM4v7capbd * ag0; - gcsbsb = -here->BSIM4v7capbs * ag0; - } - gcbbb = -(gcbgb + gcbdb + gcbsb + gcbgmb); - - ggtg = ggtd = ggtb = ggts = 0.0; - sxpart = 0.4; - dxpart = 0.6; - ddxpart_dVd = ddxpart_dVg = ddxpart_dVb = ddxpart_dVs = 0.0; - dsxpart_dVd = dsxpart_dVg = dsxpart_dVb = dsxpart_dVs = 0.0; - } - else - { qcheq = here->BSIM4v7qchqs; - CoxWL = model->BSIM4v7coxe * pParam->BSIM4v7weffCV * here->BSIM4v7nf - * pParam->BSIM4v7leffCV; - T0 = qdef * ScalingFactor / CoxWL; - ggtg = here->BSIM4v7gtg = T0 * here->BSIM4v7gcrgg; - ggts = here->BSIM4v7gts = T0 * here->BSIM4v7gcrgd; - ggtd = here->BSIM4v7gtd = T0 * here->BSIM4v7gcrgs; - ggtb = here->BSIM4v7gtb = T0 * here->BSIM4v7gcrgb; - gqdef = ScalingFactor * ag0; - - gcqgb = here->BSIM4v7cqgb * ag0; - gcqdb = here->BSIM4v7cqsb * ag0; - gcqsb = here->BSIM4v7cqdb * ag0; - gcqbb = here->BSIM4v7cqbb * ag0; - - if (fabs(qcheq) <= 1.0e-5 * CoxWL) - { if (model->BSIM4v7xpart < 0.5) - { sxpart = 0.4; - } - else if (model->BSIM4v7xpart > 0.5) - { sxpart = 0.0; - } - else - { sxpart = 0.5; - } - dsxpart_dVd = dsxpart_dVg = dsxpart_dVb - = dsxpart_dVs = 0.0; - } - else - { sxpart = qdrn / qcheq; - Css = here->BSIM4v7cddb; - Cds = -(here->BSIM4v7cgdb + here->BSIM4v7cddb - + here->BSIM4v7cbdb); - dsxpart_dVs = (Css - sxpart * (Css + Cds)) / qcheq; - Csg = here->BSIM4v7cdgb; - Cdg = -(here->BSIM4v7cggb + here->BSIM4v7cdgb - + here->BSIM4v7cbgb); - dsxpart_dVg = (Csg - sxpart * (Csg + Cdg)) / qcheq; - - Csd = here->BSIM4v7cdsb; - Cdd = -(here->BSIM4v7cgsb + here->BSIM4v7cdsb - + here->BSIM4v7cbsb); - dsxpart_dVd = (Csd - sxpart * (Csd + Cdd)) / qcheq; - - dsxpart_dVb = -(dsxpart_dVd + dsxpart_dVg + dsxpart_dVs); - } - dxpart = 1.0 - sxpart; - ddxpart_dVd = -dsxpart_dVd; - ddxpart_dVg = -dsxpart_dVg; - ddxpart_dVs = -dsxpart_dVs; - ddxpart_dVb = -(ddxpart_dVd + ddxpart_dVg + ddxpart_dVs); - - if (here->BSIM4v7rgateMod == 3) - { gcgmgmb = (cgdo + cgso + pParam->BSIM4v7cgbo) * ag0; - gcgmdb = -cgdo * ag0; - gcgmsb = -cgso * ag0; - gcgmbb = -pParam->BSIM4v7cgbo * ag0; - - gcdgmb = gcgmdb; - gcsgmb = gcgmsb; - gcbgmb = gcgmbb; - - gcdgb = gcsgb = gcbgb = 0.0; - gcggb = gcgdb = gcgsb = gcgbb = 0.0; - - qgmb = pParam->BSIM4v7cgbo * vgmb; - qgmid = qgdo + qgso + qgmb; - qgate = 0.0; - qbulk = -qgmb; - qdrn = -qgdo; - qsrc = -qgso; - } - else - { gcggb = (cgdo + cgso + pParam->BSIM4v7cgbo ) * ag0; - gcgdb = -cgdo * ag0; - gcgsb = -cgso * ag0; - gcgbb = -pParam->BSIM4v7cgbo * ag0; - - gcdgb = gcgdb; - gcsgb = gcgsb; - gcbgb = gcgbb; - gcdgmb = gcsgmb = gcbgmb = 0.0; - - qgb = pParam->BSIM4v7cgbo * vgb; - qgate = qgdo + qgso + qgb; - qbulk = -qgb; - qdrn = -qgdo; - qsrc = -qgso; - } - - gcddb = (here->BSIM4v7capbd + cgdo) * ag0; - gcdsb = gcsdb = 0.0; - gcssb = (here->BSIM4v7capbs + cgso) * ag0; - if (!here->BSIM4v7rbodyMod) - { gcdbb = -(gcdgb + gcddb + gcdgmb); - gcsbb = -(gcsgb + gcssb + gcsgmb); - gcbdb = -here->BSIM4v7capbd * ag0; - gcbsb = -here->BSIM4v7capbs * ag0; - gcdbdb = 0.0; gcsbsb = 0.0; - } - else - { gcdbb = gcsbb = gcbdb = gcbsb = 0.0; - gcdbdb = -here->BSIM4v7capbd * ag0; - gcsbsb = -here->BSIM4v7capbs * ag0; - } - gcbbb = -(gcbdb + gcbgb + gcbsb + gcbgmb); - } - } - - - if (here->BSIM4v7trnqsMod) - { *(ckt->CKTstate0 + here->BSIM4v7qcdump) = qdef * ScalingFactor; - if (ckt->CKTmode & MODEINITTRAN) - *(ckt->CKTstate1 + here->BSIM4v7qcdump) = - *(ckt->CKTstate0 + here->BSIM4v7qcdump); - error = NIintegrate(ckt, &geq, &ceq, 0.0, here->BSIM4v7qcdump); - if (error) - return(error); - } - - if (ByPass) goto line860; - - *(ckt->CKTstate0 + here->BSIM4v7qg) = qgate; - *(ckt->CKTstate0 + here->BSIM4v7qd) = qdrn - - *(ckt->CKTstate0 + here->BSIM4v7qbd); - *(ckt->CKTstate0 + here->BSIM4v7qs) = qsrc - - *(ckt->CKTstate0 + here->BSIM4v7qbs); - if (here->BSIM4v7rgateMod == 3) - *(ckt->CKTstate0 + here->BSIM4v7qgmid) = qgmid; - - if (!here->BSIM4v7rbodyMod) - { *(ckt->CKTstate0 + here->BSIM4v7qb) = qbulk - + *(ckt->CKTstate0 + here->BSIM4v7qbd) - + *(ckt->CKTstate0 + here->BSIM4v7qbs); - } - else - *(ckt->CKTstate0 + here->BSIM4v7qb) = qbulk; - - - /* Store small signal parameters */ - if (ckt->CKTmode & MODEINITSMSIG) - { goto line1000; - } - - if (!ChargeComputationNeeded) - goto line850; - - /* no integration, if dc sweep, but keep evaluating capacitances */ - if (ckt->CKTmode & MODEDCTRANCURVE) - goto line850; - - if (ckt->CKTmode & MODEINITTRAN) - { *(ckt->CKTstate1 + here->BSIM4v7qb) = - *(ckt->CKTstate0 + here->BSIM4v7qb); - *(ckt->CKTstate1 + here->BSIM4v7qg) = - *(ckt->CKTstate0 + here->BSIM4v7qg); - *(ckt->CKTstate1 + here->BSIM4v7qd) = - *(ckt->CKTstate0 + here->BSIM4v7qd); - if (here->BSIM4v7rgateMod == 3) - *(ckt->CKTstate1 + here->BSIM4v7qgmid) = - *(ckt->CKTstate0 + here->BSIM4v7qgmid); - if (here->BSIM4v7rbodyMod) - { *(ckt->CKTstate1 + here->BSIM4v7qbs) = - *(ckt->CKTstate0 + here->BSIM4v7qbs); - *(ckt->CKTstate1 + here->BSIM4v7qbd) = - *(ckt->CKTstate0 + here->BSIM4v7qbd); - } - } - - error = NIintegrate(ckt, &geq, &ceq, 0.0, here->BSIM4v7qb); - if (error) - return(error); - error = NIintegrate(ckt, &geq, &ceq, 0.0, here->BSIM4v7qg); - if (error) - return(error); - error = NIintegrate(ckt, &geq, &ceq, 0.0, here->BSIM4v7qd); - if (error) - return(error); - - if (here->BSIM4v7rgateMod == 3) - { error = NIintegrate(ckt, &geq, &ceq, 0.0, here->BSIM4v7qgmid); - if (error) return(error); - } - - if (here->BSIM4v7rbodyMod) - { error = NIintegrate(ckt, &geq, &ceq, 0.0, here->BSIM4v7qbs); - if (error) - return(error); - error = NIintegrate(ckt, &geq, &ceq, 0.0, here->BSIM4v7qbd); - if (error) - return(error); - } - - goto line860; - - -line850: - /* Zero gcap and ceqcap if (!ChargeComputationNeeded) */ - ceqqg = ceqqb = ceqqd = 0.0; - ceqqjd = ceqqjs = 0.0; - cqcheq = cqdef = 0.0; - - gcdgb = gcddb = gcdsb = gcdbb = 0.0; - gcsgb = gcsdb = gcssb = gcsbb = 0.0; - gcggb = gcgdb = gcgsb = gcgbb = 0.0; - gcbdb = gcbgb = gcbsb = gcbbb = 0.0; - - gcgmgmb = gcgmdb = gcgmsb = gcgmbb = 0.0; - gcdgmb = gcsgmb = gcbgmb = ceqqgmid = 0.0; - gcdbdb = gcsbsb = 0.0; - - gqdef = gcqgb = gcqdb = gcqsb = gcqbb = 0.0; - ggtg = ggtd = ggtb = ggts = 0.0; - sxpart = (1.0 - (dxpart = (here->BSIM4v7mode > 0) ? 0.4 : 0.6)); - ddxpart_dVd = ddxpart_dVg = ddxpart_dVb = ddxpart_dVs = 0.0; - dsxpart_dVd = dsxpart_dVg = dsxpart_dVb = dsxpart_dVs = 0.0; - - if (here->BSIM4v7trnqsMod) - { CoxWL = model->BSIM4v7coxe * pParam->BSIM4v7weffCV * here->BSIM4v7nf - * pParam->BSIM4v7leffCV; - T1 = here->BSIM4v7gcrg / CoxWL; - here->BSIM4v7gtau = T1 * ScalingFactor; - } - else - here->BSIM4v7gtau = 0.0; - - goto line900; - - -line860: - /* Calculate equivalent charge current */ - - cqgate = *(ckt->CKTstate0 + here->BSIM4v7cqg); - cqbody = *(ckt->CKTstate0 + here->BSIM4v7cqb); - cqdrn = *(ckt->CKTstate0 + here->BSIM4v7cqd); - - ceqqg = cqgate - gcggb * vgb + gcgdb * vbd + gcgsb * vbs; - ceqqd = cqdrn - gcdgb * vgb - gcdgmb * vgmb + (gcddb + gcdbdb) - * vbd - gcdbdb * vbd_jct + gcdsb * vbs; - ceqqb = cqbody - gcbgb * vgb - gcbgmb * vgmb - + gcbdb * vbd + gcbsb * vbs; - - - if (here->BSIM4v7rgateMod == 3) - ceqqgmid = *(ckt->CKTstate0 + here->BSIM4v7cqgmid) - + gcgmdb * vbd + gcgmsb * vbs - gcgmgmb * vgmb; - else - ceqqgmid = 0.0; - - if (here->BSIM4v7rbodyMod) - { ceqqjs = *(ckt->CKTstate0 + here->BSIM4v7cqbs) + gcsbsb * vbs_jct; - ceqqjd = *(ckt->CKTstate0 + here->BSIM4v7cqbd) + gcdbdb * vbd_jct; - } - - if (here->BSIM4v7trnqsMod) - { T0 = ggtg * vgb - ggtd * vbd - ggts * vbs; - ceqqg += T0; - T1 = qdef * here->BSIM4v7gtau; - ceqqd -= dxpart * T0 + T1 * (ddxpart_dVg * vgb - ddxpart_dVd - * vbd - ddxpart_dVs * vbs); - cqdef = *(ckt->CKTstate0 + here->BSIM4v7cqcdump) - gqdef * qdef; - cqcheq = *(ckt->CKTstate0 + here->BSIM4v7cqcheq) - - (gcqgb * vgb - gcqdb * vbd - gcqsb * vbs) + T0; - } - - if (ckt->CKTmode & MODEINITTRAN) - { *(ckt->CKTstate1 + here->BSIM4v7cqb) = - *(ckt->CKTstate0 + here->BSIM4v7cqb); - *(ckt->CKTstate1 + here->BSIM4v7cqg) = - *(ckt->CKTstate0 + here->BSIM4v7cqg); - *(ckt->CKTstate1 + here->BSIM4v7cqd) = - *(ckt->CKTstate0 + here->BSIM4v7cqd); - - if (here->BSIM4v7rgateMod == 3) - *(ckt->CKTstate1 + here->BSIM4v7cqgmid) = - *(ckt->CKTstate0 + here->BSIM4v7cqgmid); - - if (here->BSIM4v7rbodyMod) - { *(ckt->CKTstate1 + here->BSIM4v7cqbs) = - *(ckt->CKTstate0 + here->BSIM4v7cqbs); - *(ckt->CKTstate1 + here->BSIM4v7cqbd) = - *(ckt->CKTstate0 + here->BSIM4v7cqbd); - } - } - - - /* - * Load current vector - */ - -line900: - if (here->BSIM4v7mode >= 0) - { Gm = here->BSIM4v7gm; - Gmbs = here->BSIM4v7gmbs; - FwdSum = Gm + Gmbs; - RevSum = 0.0; - - ceqdrn = model->BSIM4v7type * (cdrain - here->BSIM4v7gds * vds - - Gm * vgs - Gmbs * vbs); - ceqbd = model->BSIM4v7type * (here->BSIM4v7csub + here->BSIM4v7Igidl - - (here->BSIM4v7gbds + here->BSIM4v7ggidld) * vds - - (here->BSIM4v7gbgs + here->BSIM4v7ggidlg) * vgs - - (here->BSIM4v7gbbs + here->BSIM4v7ggidlb) * vbs); - ceqbs = model->BSIM4v7type * (here->BSIM4v7Igisl + here->BSIM4v7ggisls * vds - - here->BSIM4v7ggislg * vgd - here->BSIM4v7ggislb * vbd); - - gbbdp = -(here->BSIM4v7gbds); - gbbsp = here->BSIM4v7gbds + here->BSIM4v7gbgs + here->BSIM4v7gbbs; - - gbdpg = here->BSIM4v7gbgs; - gbdpdp = here->BSIM4v7gbds; - gbdpb = here->BSIM4v7gbbs; - gbdpsp = -(gbdpg + gbdpdp + gbdpb); - - gbspg = 0.0; - gbspdp = 0.0; - gbspb = 0.0; - gbspsp = 0.0; - - if (model->BSIM4v7igcMod) - { gIstotg = here->BSIM4v7gIgsg + here->BSIM4v7gIgcsg; - gIstotd = here->BSIM4v7gIgcsd; - gIstots = here->BSIM4v7gIgss + here->BSIM4v7gIgcss; - gIstotb = here->BSIM4v7gIgcsb; - Istoteq = model->BSIM4v7type * (here->BSIM4v7Igs + here->BSIM4v7Igcs - - gIstotg * vgs - here->BSIM4v7gIgcsd * vds - - here->BSIM4v7gIgcsb * vbs); - - gIdtotg = here->BSIM4v7gIgdg + here->BSIM4v7gIgcdg; - gIdtotd = here->BSIM4v7gIgdd + here->BSIM4v7gIgcdd; - gIdtots = here->BSIM4v7gIgcds; - gIdtotb = here->BSIM4v7gIgcdb; - Idtoteq = model->BSIM4v7type * (here->BSIM4v7Igd + here->BSIM4v7Igcd - - here->BSIM4v7gIgdg * vgd - here->BSIM4v7gIgcdg * vgs - - here->BSIM4v7gIgcdd * vds - here->BSIM4v7gIgcdb * vbs); - } - else - { gIstotg = gIstotd = gIstots = gIstotb = Istoteq = 0.0; - gIdtotg = gIdtotd = gIdtots = gIdtotb = Idtoteq = 0.0; - } - - if (model->BSIM4v7igbMod) - { gIbtotg = here->BSIM4v7gIgbg; - gIbtotd = here->BSIM4v7gIgbd; - gIbtots = here->BSIM4v7gIgbs; - gIbtotb = here->BSIM4v7gIgbb; - Ibtoteq = model->BSIM4v7type * (here->BSIM4v7Igb - - here->BSIM4v7gIgbg * vgs - here->BSIM4v7gIgbd * vds - - here->BSIM4v7gIgbb * vbs); - } - else - gIbtotg = gIbtotd = gIbtots = gIbtotb = Ibtoteq = 0.0; - - if ((model->BSIM4v7igcMod != 0) || (model->BSIM4v7igbMod != 0)) - { gIgtotg = gIstotg + gIdtotg + gIbtotg; - gIgtotd = gIstotd + gIdtotd + gIbtotd ; - gIgtots = gIstots + gIdtots + gIbtots; - gIgtotb = gIstotb + gIdtotb + gIbtotb; - Igtoteq = Istoteq + Idtoteq + Ibtoteq; - } - else - gIgtotg = gIgtotd = gIgtots = gIgtotb = Igtoteq = 0.0; - - - if (here->BSIM4v7rgateMod == 2) - T0 = vges - vgs; - else if (here->BSIM4v7rgateMod == 3) - T0 = vgms - vgs; - if (here->BSIM4v7rgateMod > 1) - { gcrgd = here->BSIM4v7gcrgd * T0; - gcrgg = here->BSIM4v7gcrgg * T0; - gcrgs = here->BSIM4v7gcrgs * T0; - gcrgb = here->BSIM4v7gcrgb * T0; - ceqgcrg = -(gcrgd * vds + gcrgg * vgs - + gcrgb * vbs); - gcrgg -= here->BSIM4v7gcrg; - gcrg = here->BSIM4v7gcrg; - } - else - ceqgcrg = gcrg = gcrgd = gcrgg = gcrgs = gcrgb = 0.0; - } - else - { Gm = -here->BSIM4v7gm; - Gmbs = -here->BSIM4v7gmbs; - FwdSum = 0.0; - RevSum = -(Gm + Gmbs); - - ceqdrn = -model->BSIM4v7type * (cdrain + here->BSIM4v7gds * vds - + Gm * vgd + Gmbs * vbd); - - ceqbs = model->BSIM4v7type * (here->BSIM4v7csub + here->BSIM4v7Igisl - + (here->BSIM4v7gbds + here->BSIM4v7ggisls) * vds - - (here->BSIM4v7gbgs + here->BSIM4v7ggislg) * vgd - - (here->BSIM4v7gbbs + here->BSIM4v7ggislb) * vbd); - ceqbd = model->BSIM4v7type * (here->BSIM4v7Igidl - here->BSIM4v7ggidld * vds - - here->BSIM4v7ggidlg * vgs - here->BSIM4v7ggidlb * vbs); - - gbbsp = -(here->BSIM4v7gbds); - gbbdp = here->BSIM4v7gbds + here->BSIM4v7gbgs + here->BSIM4v7gbbs; - - gbdpg = 0.0; - gbdpsp = 0.0; - gbdpb = 0.0; - gbdpdp = 0.0; - - gbspg = here->BSIM4v7gbgs; - gbspsp = here->BSIM4v7gbds; - gbspb = here->BSIM4v7gbbs; - gbspdp = -(gbspg + gbspsp + gbspb); - - if (model->BSIM4v7igcMod) - { gIstotg = here->BSIM4v7gIgsg + here->BSIM4v7gIgcdg; - gIstotd = here->BSIM4v7gIgcds; - gIstots = here->BSIM4v7gIgss + here->BSIM4v7gIgcdd; - gIstotb = here->BSIM4v7gIgcdb; - Istoteq = model->BSIM4v7type * (here->BSIM4v7Igs + here->BSIM4v7Igcd - - here->BSIM4v7gIgsg * vgs - here->BSIM4v7gIgcdg * vgd - + here->BSIM4v7gIgcdd * vds - here->BSIM4v7gIgcdb * vbd); - - gIdtotg = here->BSIM4v7gIgdg + here->BSIM4v7gIgcsg; - gIdtotd = here->BSIM4v7gIgdd + here->BSIM4v7gIgcss; - gIdtots = here->BSIM4v7gIgcsd; - gIdtotb = here->BSIM4v7gIgcsb; - Idtoteq = model->BSIM4v7type * (here->BSIM4v7Igd + here->BSIM4v7Igcs - - (here->BSIM4v7gIgdg + here->BSIM4v7gIgcsg) * vgd - + here->BSIM4v7gIgcsd * vds - here->BSIM4v7gIgcsb * vbd); - } - else - { gIstotg = gIstotd = gIstots = gIstotb = Istoteq = 0.0; - gIdtotg = gIdtotd = gIdtots = gIdtotb = Idtoteq = 0.0; - } - - if (model->BSIM4v7igbMod) - { gIbtotg = here->BSIM4v7gIgbg; - gIbtotd = here->BSIM4v7gIgbs; - gIbtots = here->BSIM4v7gIgbd; - gIbtotb = here->BSIM4v7gIgbb; - Ibtoteq = model->BSIM4v7type * (here->BSIM4v7Igb - - here->BSIM4v7gIgbg * vgd + here->BSIM4v7gIgbd * vds - - here->BSIM4v7gIgbb * vbd); - } - else - gIbtotg = gIbtotd = gIbtots = gIbtotb = Ibtoteq = 0.0; - - if ((model->BSIM4v7igcMod != 0) || (model->BSIM4v7igbMod != 0)) - { gIgtotg = gIstotg + gIdtotg + gIbtotg; - gIgtotd = gIstotd + gIdtotd + gIbtotd ; - gIgtots = gIstots + gIdtots + gIbtots; - gIgtotb = gIstotb + gIdtotb + gIbtotb; - Igtoteq = Istoteq + Idtoteq + Ibtoteq; - } - else - gIgtotg = gIgtotd = gIgtots = gIgtotb = Igtoteq = 0.0; - - - if (here->BSIM4v7rgateMod == 2) - T0 = vges - vgs; - else if (here->BSIM4v7rgateMod == 3) - T0 = vgms - vgs; - if (here->BSIM4v7rgateMod > 1) - { gcrgd = here->BSIM4v7gcrgs * T0; - gcrgg = here->BSIM4v7gcrgg * T0; - gcrgs = here->BSIM4v7gcrgd * T0; - gcrgb = here->BSIM4v7gcrgb * T0; - ceqgcrg = -(gcrgg * vgd - gcrgs * vds - + gcrgb * vbd); - gcrgg -= here->BSIM4v7gcrg; - gcrg = here->BSIM4v7gcrg; - } - else - ceqgcrg = gcrg = gcrgd = gcrgg = gcrgs = gcrgb = 0.0; - } - - if (model->BSIM4v7rdsMod == 1) - { ceqgstot = model->BSIM4v7type * (here->BSIM4v7gstotd * vds - + here->BSIM4v7gstotg * vgs + here->BSIM4v7gstotb * vbs); - /* WDLiu: ceqgstot flowing away from sNodePrime */ - gstot = here->BSIM4v7gstot; - gstotd = here->BSIM4v7gstotd; - gstotg = here->BSIM4v7gstotg; - gstots = here->BSIM4v7gstots - gstot; - gstotb = here->BSIM4v7gstotb; - - ceqgdtot = -model->BSIM4v7type * (here->BSIM4v7gdtotd * vds - + here->BSIM4v7gdtotg * vgs + here->BSIM4v7gdtotb * vbs); - /* WDLiu: ceqgdtot defined as flowing into dNodePrime */ - gdtot = here->BSIM4v7gdtot; - gdtotd = here->BSIM4v7gdtotd - gdtot; - gdtotg = here->BSIM4v7gdtotg; - gdtots = here->BSIM4v7gdtots; - gdtotb = here->BSIM4v7gdtotb; - } - else - { gstot = gstotd = gstotg = gstots = gstotb = ceqgstot = 0.0; - gdtot = gdtotd = gdtotg = gdtots = gdtotb = ceqgdtot = 0.0; - } - - if (model->BSIM4v7type > 0) - { ceqjs = (here->BSIM4v7cbs - here->BSIM4v7gbs * vbs_jct); - ceqjd = (here->BSIM4v7cbd - here->BSIM4v7gbd * vbd_jct); - } - else - { ceqjs = -(here->BSIM4v7cbs - here->BSIM4v7gbs * vbs_jct); - ceqjd = -(here->BSIM4v7cbd - here->BSIM4v7gbd * vbd_jct); - ceqqg = -ceqqg; - ceqqd = -ceqqd; - ceqqb = -ceqqb; - ceqgcrg = -ceqgcrg; - - if (here->BSIM4v7trnqsMod) - { cqdef = -cqdef; - cqcheq = -cqcheq; - } - - if (here->BSIM4v7rbodyMod) - { ceqqjs = -ceqqjs; - ceqqjd = -ceqqjd; - } - - if (here->BSIM4v7rgateMod == 3) - ceqqgmid = -ceqqgmid; - } - - - /* - * Loading RHS - */ - - m = here->BSIM4v7m; - -#ifdef USE_OMP - here->BSIM4v7rhsdPrime = m * (ceqjd - ceqbd + ceqgdtot - - ceqdrn - ceqqd + Idtoteq); - here->BSIM4v7rhsgPrime = m * (ceqqg - ceqgcrg + Igtoteq); - - if (here->BSIM4v7rgateMod == 2) - here->BSIM4v7rhsgExt = m * ceqgcrg; - else if (here->BSIM4v7rgateMod == 3) - here->BSIM4v7grhsMid = m * (ceqqgmid + ceqgcrg); - - if (!here->BSIM4v7rbodyMod) - { here->BSIM4v7rhsbPrime = m * (ceqbd + ceqbs - ceqjd - - ceqjs - ceqqb + Ibtoteq); - here->BSIM4v7rhssPrime = m * (ceqdrn - ceqbs + ceqjs - + ceqqg + ceqqb + ceqqd + ceqqgmid - ceqgstot + Istoteq); - } - else - { here->BSIM4v7rhsdb = m * (ceqjd + ceqqjd); - here->BSIM4v7rhsbPrime = m * (ceqbd + ceqbs - ceqqb + Ibtoteq); - here->BSIM4v7rhssb = m * (ceqjs + ceqqjs); - here->BSIM4v7rhssPrime = m * (ceqdrn - ceqbs + ceqjs + ceqqd - + ceqqg + ceqqb + ceqqjd + ceqqjs + ceqqgmid - ceqgstot + Istoteq); - } - - if (model->BSIM4v7rdsMod) - { here->BSIM4v7rhsd = m * ceqgdtot; - here->BSIM4v7rhss = m * ceqgstot; - } - - if (here->BSIM4v7trnqsMod) - here->BSIM4v7rhsq = m * (cqcheq - cqdef); -#else - (*(ckt->CKTrhs + here->BSIM4v7dNodePrime) += m * (ceqjd - ceqbd + ceqgdtot - - ceqdrn - ceqqd + Idtoteq)); - (*(ckt->CKTrhs + here->BSIM4v7gNodePrime) -= m * (ceqqg - ceqgcrg + Igtoteq)); - - if (here->BSIM4v7rgateMod == 2) - (*(ckt->CKTrhs + here->BSIM4v7gNodeExt) -= m * ceqgcrg); - else if (here->BSIM4v7rgateMod == 3) - (*(ckt->CKTrhs + here->BSIM4v7gNodeMid) -= m * (ceqqgmid + ceqgcrg)); - - if (!here->BSIM4v7rbodyMod) - { (*(ckt->CKTrhs + here->BSIM4v7bNodePrime) += m * (ceqbd + ceqbs - ceqjd - - ceqjs - ceqqb + Ibtoteq)); - (*(ckt->CKTrhs + here->BSIM4v7sNodePrime) += m * (ceqdrn - ceqbs + ceqjs - + ceqqg + ceqqb + ceqqd + ceqqgmid - ceqgstot + Istoteq)); - } - - else - { (*(ckt->CKTrhs + here->BSIM4v7dbNode) -= m * (ceqjd + ceqqjd)); - (*(ckt->CKTrhs + here->BSIM4v7bNodePrime) += m * (ceqbd + ceqbs - ceqqb + Ibtoteq)); - (*(ckt->CKTrhs + here->BSIM4v7sbNode) -= m * (ceqjs + ceqqjs)); - (*(ckt->CKTrhs + here->BSIM4v7sNodePrime) += m * (ceqdrn - ceqbs + ceqjs + ceqqd - + ceqqg + ceqqb + ceqqjd + ceqqjs + ceqqgmid - ceqgstot + Istoteq)); - } - - if (model->BSIM4v7rdsMod) - { (*(ckt->CKTrhs + here->BSIM4v7dNode) -= m * ceqgdtot); - (*(ckt->CKTrhs + here->BSIM4v7sNode) += m * ceqgstot); - } - - if (here->BSIM4v7trnqsMod) - *(ckt->CKTrhs + here->BSIM4v7qNode) += m * (cqcheq - cqdef); -#endif - - /* - * Loading matrix - */ - - if (!here->BSIM4v7rbodyMod) - { gjbd = here->BSIM4v7gbd; - gjbs = here->BSIM4v7gbs; - } - else - gjbd = gjbs = 0.0; - - if (!model->BSIM4v7rdsMod) - { gdpr = here->BSIM4v7drainConductance; - gspr = here->BSIM4v7sourceConductance; - } - else - gdpr = gspr = 0.0; - - geltd = here->BSIM4v7grgeltd; - - T1 = qdef * here->BSIM4v7gtau; -#ifdef USE_OMP - if (here->BSIM4v7rgateMod == 1) - { here->BSIM4v7_1 = m * geltd; - here->BSIM4v7_2 = m * geltd; - here->BSIM4v7_3 = m * geltd; - here->BSIM4v7_4 = m * (gcggb + geltd - ggtg + gIgtotg); - here->BSIM4v7_5 = m * (gcgdb - ggtd + gIgtotd); - here->BSIM4v7_6 = m * (gcgsb - ggts + gIgtots); - here->BSIM4v7_7 = m * (gcgbb - ggtb + gIgtotb); - } /* WDLiu: gcrg already subtracted from all gcrgg below */ - else if (here->BSIM4v7rgateMod == 2) - { here->BSIM4v7_8 = m * gcrg; - here->BSIM4v7_9 = m * gcrgg; - here->BSIM4v7_10 = m * gcrgd; - here->BSIM4v7_11 = m * gcrgs; - here->BSIM4v7_12 = m * gcrgb; - - here->BSIM4v7_13 = m * gcrg; - here->BSIM4v7_14 = m * (gcggb - gcrgg - ggtg + gIgtotg); - here->BSIM4v7_15 = m * (gcgdb - gcrgd - ggtd + gIgtotd); - here->BSIM4v7_16 = m * (gcgsb - gcrgs - ggts + gIgtots); - here->BSIM4v7_17 = m * (gcgbb - gcrgb - ggtb + gIgtotb); - } - else if (here->BSIM4v7rgateMod == 3) - { here->BSIM4v7_18 = m * geltd; - here->BSIM4v7_19 = m * geltd; - here->BSIM4v7_20 = m * geltd; - here->BSIM4v7_21 = m * (geltd + gcrg + gcgmgmb); - - here->BSIM4v7_22 = m * (gcrgd + gcgmdb); - here->BSIM4v7_23 = m * gcrgg; - here->BSIM4v7_24 = m * (gcrgs + gcgmsb); - here->BSIM4v7_25 = m * (gcrgb + gcgmbb); - - here->BSIM4v7_26 = m * gcdgmb; - here->BSIM4v7_27 = m * gcrg; - here->BSIM4v7_28 = m * gcsgmb; - here->BSIM4v7_29 = m * gcbgmb; - - here->BSIM4v7_30 = m * (gcggb - gcrgg - ggtg + gIgtotg); - here->BSIM4v7_31 = m * (gcgdb - gcrgd - ggtd + gIgtotd); - here->BSIM4v7_32 = m * (gcgsb - gcrgs - ggts + gIgtots); - here->BSIM4v7_33 = m * (gcgbb - gcrgb - ggtb + gIgtotb); - } - else - { here->BSIM4v7_34 = m * (gcggb - ggtg + gIgtotg); - here->BSIM4v7_35 = m * (gcgdb - ggtd + gIgtotd); - here->BSIM4v7_36 = m * (gcgsb - ggts + gIgtots); - here->BSIM4v7_37 = m * (gcgbb - ggtb + gIgtotb); - } - - if (model->BSIM4v7rdsMod) - { here->BSIM4v7_38 = m * gdtotg; - here->BSIM4v7_39 = m * gdtots; - here->BSIM4v7_40 = m * gdtotb; - here->BSIM4v7_41 = m * gstotd; - here->BSIM4v7_42 = m * gstotg; - here->BSIM4v7_43 = m * gstotb; - } - - here->BSIM4v7_44 = m * (gdpr + here->BSIM4v7gds + here->BSIM4v7gbd + T1 * ddxpart_dVd - - gdtotd + RevSum + gcddb + gbdpdp + dxpart * ggtd - gIdtotd); - here->BSIM4v7_45 = m * (gdpr + gdtot); - here->BSIM4v7_46 = m * (Gm + gcdgb - gdtotg + gbdpg - gIdtotg - + dxpart * ggtg + T1 * ddxpart_dVg); - here->BSIM4v7_47 = m * (here->BSIM4v7gds + gdtots - dxpart * ggts + gIdtots - - T1 * ddxpart_dVs + FwdSum - gcdsb - gbdpsp); - here->BSIM4v7_48 = m * (gjbd + gdtotb - Gmbs - gcdbb - gbdpb + gIdtotb - - T1 * ddxpart_dVb - dxpart * ggtb); - - here->BSIM4v7_49 = m * (gdpr - gdtotd); - here->BSIM4v7_50 = m * (gdpr + gdtot); - - here->BSIM4v7_51 = m * (here->BSIM4v7gds + gstotd + RevSum - gcsdb - gbspdp - - T1 * dsxpart_dVd - sxpart * ggtd + gIstotd); - here->BSIM4v7_52 = m * (gcsgb - Gm - gstotg + gbspg + sxpart * ggtg - + T1 * dsxpart_dVg - gIstotg); - here->BSIM4v7_53 = m * (gspr + here->BSIM4v7gds + here->BSIM4v7gbs + T1 * dsxpart_dVs - - gstots + FwdSum + gcssb + gbspsp + sxpart * ggts - gIstots); - here->BSIM4v7_54 = m * (gspr + gstot); - here->BSIM4v7_55 = m * (gjbs + gstotb + Gmbs - gcsbb - gbspb - sxpart * ggtb - - T1 * dsxpart_dVb + gIstotb); - - here->BSIM4v7_56 = m * (gspr - gstots); - here->BSIM4v7_57 = m * (gspr + gstot); - - here->BSIM4v7_58 = m * (gcbdb - gjbd + gbbdp - gIbtotd); - here->BSIM4v7_59 = m * (gcbgb - here->BSIM4v7gbgs - gIbtotg); - here->BSIM4v7_60 = m * (gcbsb - gjbs + gbbsp - gIbtots); - here->BSIM4v7_61 = m * (gjbd + gjbs + gcbbb - here->BSIM4v7gbbs - gIbtotb); - - ggidld = here->BSIM4v7ggidld; - ggidlg = here->BSIM4v7ggidlg; - ggidlb = here->BSIM4v7ggidlb; - ggislg = here->BSIM4v7ggislg; - ggisls = here->BSIM4v7ggisls; - ggislb = here->BSIM4v7ggislb; - - /* stamp gidl */ - here->BSIM4v7_62 = m * ggidld; - here->BSIM4v7_63 = m * ggidlg; - here->BSIM4v7_64 = m * (ggidlg + ggidld + ggidlb); - here->BSIM4v7_65 = m * ggidlb; - here->BSIM4v7_66 = m * ggidld; - here->BSIM4v7_67 = m * ggidlg; - here->BSIM4v7_68 = m * (ggidlg + ggidld + ggidlb); - here->BSIM4v7_69 = m * ggidlb; - /* stamp gisl */ - here->BSIM4v7_70 = m * (ggisls + ggislg + ggislb); - here->BSIM4v7_71 = m * ggislg; - here->BSIM4v7_72 = m * ggisls; - here->BSIM4v7_73 = m * ggislb; - here->BSIM4v7_74 = m * (ggislg + ggisls + ggislb); - here->BSIM4v7_75 = m * ggislg; - here->BSIM4v7_76 = m * ggisls; - here->BSIM4v7_77 = m * ggislb; - - if (here->BSIM4v7rbodyMod) - { here->BSIM4v7_78 = m * (gcdbdb - here->BSIM4v7gbd); - here->BSIM4v7_79 = m * (here->BSIM4v7gbs - gcsbsb); - - here->BSIM4v7_80 = m * (gcdbdb - here->BSIM4v7gbd); - here->BSIM4v7_81 = m * (here->BSIM4v7gbd - gcdbdb - + here->BSIM4v7grbpd + here->BSIM4v7grbdb); - here->BSIM4v7_82 = m * here->BSIM4v7grbpd; - here->BSIM4v7_83 = m * here->BSIM4v7grbdb; - - here->BSIM4v7_84 = m * here->BSIM4v7grbpd; - here->BSIM4v7_85 = m * here->BSIM4v7grbpb; - here->BSIM4v7_86 = m * here->BSIM4v7grbps; - here->BSIM4v7_87 = m * (here->BSIM4v7grbpd + here->BSIM4v7grbps - + here->BSIM4v7grbpb); - /* WDLiu: (gcbbb - here->BSIM4v7gbbs) already added to BPbpPtr */ - - here->BSIM4v7_88 = m * (gcsbsb - here->BSIM4v7gbs); - here->BSIM4v7_89 = m * here->BSIM4v7grbps; - here->BSIM4v7_90 = m * here->BSIM4v7grbsb; - here->BSIM4v7_91 = m * (here->BSIM4v7gbs - gcsbsb - + here->BSIM4v7grbps + here->BSIM4v7grbsb); - - here->BSIM4v7_92 = m * here->BSIM4v7grbdb; - here->BSIM4v7_93 = m * here->BSIM4v7grbpb; - here->BSIM4v7_94 = m * here->BSIM4v7grbsb; - here->BSIM4v7_95 = m * (here->BSIM4v7grbsb + here->BSIM4v7grbdb - + here->BSIM4v7grbpb); - } - - if (here->BSIM4v7trnqsMod) - { here->BSIM4v7_96 = m * (gqdef + here->BSIM4v7gtau); - here->BSIM4v7_97 = m * (ggtg - gcqgb); - here->BSIM4v7_98 = m * (ggtd - gcqdb); - here->BSIM4v7_99 = m * (ggts - gcqsb); - here->BSIM4v7_100 = m * (ggtb - gcqbb); - - here->BSIM4v7_101 = m * dxpart * here->BSIM4v7gtau; - here->BSIM4v7_102 = m * sxpart * here->BSIM4v7gtau; - here->BSIM4v7_103 = m * here->BSIM4v7gtau; - } -#else - if (here->BSIM4v7rgateMod == 1) - { (*(here->BSIM4v7GEgePtr) += m * geltd); - (*(here->BSIM4v7GPgePtr) -= m * geltd); - (*(here->BSIM4v7GEgpPtr) -= m * geltd); - (*(here->BSIM4v7GPgpPtr) += m * (gcggb + geltd - ggtg + gIgtotg)); - (*(here->BSIM4v7GPdpPtr) += m * (gcgdb - ggtd + gIgtotd)); - (*(here->BSIM4v7GPspPtr) += m * (gcgsb - ggts + gIgtots)); - (*(here->BSIM4v7GPbpPtr) += m * (gcgbb - ggtb + gIgtotb)); - } /* WDLiu: gcrg already subtracted from all gcrgg below */ - else if (here->BSIM4v7rgateMod == 2) - { (*(here->BSIM4v7GEgePtr) += m * gcrg); - (*(here->BSIM4v7GEgpPtr) += m * gcrgg); - (*(here->BSIM4v7GEdpPtr) += m * gcrgd); - (*(here->BSIM4v7GEspPtr) += m * gcrgs); - (*(here->BSIM4v7GEbpPtr) += m * gcrgb); - - (*(here->BSIM4v7GPgePtr) -= m * gcrg); - (*(here->BSIM4v7GPgpPtr) += m * (gcggb - gcrgg - ggtg + gIgtotg)); - (*(here->BSIM4v7GPdpPtr) += m * (gcgdb - gcrgd - ggtd + gIgtotd)); - (*(here->BSIM4v7GPspPtr) += m * (gcgsb - gcrgs - ggts + gIgtots)); - (*(here->BSIM4v7GPbpPtr) += m * (gcgbb - gcrgb - ggtb + gIgtotb)); - } - else if (here->BSIM4v7rgateMod == 3) - { (*(here->BSIM4v7GEgePtr) += m * geltd); - (*(here->BSIM4v7GEgmPtr) -= m * geltd); - (*(here->BSIM4v7GMgePtr) -= m * geltd); - (*(here->BSIM4v7GMgmPtr) += m * (geltd + gcrg + gcgmgmb)); - - (*(here->BSIM4v7GMdpPtr) += m * (gcrgd + gcgmdb)); - (*(here->BSIM4v7GMgpPtr) += m * gcrgg); - (*(here->BSIM4v7GMspPtr) += m * (gcrgs + gcgmsb)); - (*(here->BSIM4v7GMbpPtr) += m * (gcrgb + gcgmbb)); - - (*(here->BSIM4v7DPgmPtr) += m * gcdgmb); - (*(here->BSIM4v7GPgmPtr) -= m * gcrg); - (*(here->BSIM4v7SPgmPtr) += m * gcsgmb); - (*(here->BSIM4v7BPgmPtr) += m * gcbgmb); - - (*(here->BSIM4v7GPgpPtr) += m * (gcggb - gcrgg - ggtg + gIgtotg)); - (*(here->BSIM4v7GPdpPtr) += m * (gcgdb - gcrgd - ggtd + gIgtotd)); - (*(here->BSIM4v7GPspPtr) += m * (gcgsb - gcrgs - ggts + gIgtots)); - (*(here->BSIM4v7GPbpPtr) += m * (gcgbb - gcrgb - ggtb + gIgtotb)); - } - else - { (*(here->BSIM4v7GPgpPtr) += m * (gcggb - ggtg + gIgtotg)); - (*(here->BSIM4v7GPdpPtr) += m * (gcgdb - ggtd + gIgtotd)); - (*(here->BSIM4v7GPspPtr) += m * (gcgsb - ggts + gIgtots)); - (*(here->BSIM4v7GPbpPtr) += m * (gcgbb - ggtb + gIgtotb)); - } - - if (model->BSIM4v7rdsMod) - { (*(here->BSIM4v7DgpPtr) += m * gdtotg); - (*(here->BSIM4v7DspPtr) += m * gdtots); - (*(here->BSIM4v7DbpPtr) += m * gdtotb); - (*(here->BSIM4v7SdpPtr) += m * gstotd); - (*(here->BSIM4v7SgpPtr) += m * gstotg); - (*(here->BSIM4v7SbpPtr) += m * gstotb); - } - - (*(here->BSIM4v7DPdpPtr) += m * (gdpr + here->BSIM4v7gds + here->BSIM4v7gbd + T1 * ddxpart_dVd - - gdtotd + RevSum + gcddb + gbdpdp + dxpart * ggtd - gIdtotd)); - (*(here->BSIM4v7DPdPtr) -= m * (gdpr + gdtot)); - (*(here->BSIM4v7DPgpPtr) += m * (Gm + gcdgb - gdtotg + gbdpg - gIdtotg - + dxpart * ggtg + T1 * ddxpart_dVg)); - (*(here->BSIM4v7DPspPtr) -= m * (here->BSIM4v7gds + gdtots - dxpart * ggts + gIdtots - - T1 * ddxpart_dVs + FwdSum - gcdsb - gbdpsp)); - (*(here->BSIM4v7DPbpPtr) -= m * (gjbd + gdtotb - Gmbs - gcdbb - gbdpb + gIdtotb - - T1 * ddxpart_dVb - dxpart * ggtb)); - - (*(here->BSIM4v7DdpPtr) -= m * (gdpr - gdtotd)); - (*(here->BSIM4v7DdPtr) += m * (gdpr + gdtot)); - - (*(here->BSIM4v7SPdpPtr) -= m * (here->BSIM4v7gds + gstotd + RevSum - gcsdb - gbspdp - - T1 * dsxpart_dVd - sxpart * ggtd + gIstotd)); - (*(here->BSIM4v7SPgpPtr) += m * (gcsgb - Gm - gstotg + gbspg + sxpart * ggtg - + T1 * dsxpart_dVg - gIstotg)); - (*(here->BSIM4v7SPspPtr) += m * (gspr + here->BSIM4v7gds + here->BSIM4v7gbs + T1 * dsxpart_dVs - - gstots + FwdSum + gcssb + gbspsp + sxpart * ggts - gIstots)); - (*(here->BSIM4v7SPsPtr) -= m * (gspr + gstot)); - (*(here->BSIM4v7SPbpPtr) -= m * (gjbs + gstotb + Gmbs - gcsbb - gbspb - sxpart * ggtb - - T1 * dsxpart_dVb + gIstotb)); - - (*(here->BSIM4v7SspPtr) -= m * (gspr - gstots)); - (*(here->BSIM4v7SsPtr) += m * (gspr + gstot)); - - (*(here->BSIM4v7BPdpPtr) += m * (gcbdb - gjbd + gbbdp - gIbtotd)); - (*(here->BSIM4v7BPgpPtr) += m * (gcbgb - here->BSIM4v7gbgs - gIbtotg)); - (*(here->BSIM4v7BPspPtr) += m * (gcbsb - gjbs + gbbsp - gIbtots)); - (*(here->BSIM4v7BPbpPtr) += m * (gjbd + gjbs + gcbbb - here->BSIM4v7gbbs - - gIbtotb)); - - ggidld = here->BSIM4v7ggidld; - ggidlg = here->BSIM4v7ggidlg; - ggidlb = here->BSIM4v7ggidlb; - ggislg = here->BSIM4v7ggislg; - ggisls = here->BSIM4v7ggisls; - ggislb = here->BSIM4v7ggislb; - - /* stamp gidl */ - (*(here->BSIM4v7DPdpPtr) += m * ggidld); - (*(here->BSIM4v7DPgpPtr) += m * ggidlg); - (*(here->BSIM4v7DPspPtr) -= m * (ggidlg + ggidld + ggidlb)); - (*(here->BSIM4v7DPbpPtr) += m * ggidlb); - (*(here->BSIM4v7BPdpPtr) -= m * ggidld); - (*(here->BSIM4v7BPgpPtr) -= m * ggidlg); - (*(here->BSIM4v7BPspPtr) += m * (ggidlg + ggidld + ggidlb)); - (*(here->BSIM4v7BPbpPtr) -= m * ggidlb); - /* stamp gisl */ - (*(here->BSIM4v7SPdpPtr) -= m * (ggisls + ggislg + ggislb)); - (*(here->BSIM4v7SPgpPtr) += m * ggislg); - (*(here->BSIM4v7SPspPtr) += m * ggisls); - (*(here->BSIM4v7SPbpPtr) += m * ggislb); - (*(here->BSIM4v7BPdpPtr) += m * (ggislg + ggisls + ggislb)); - (*(here->BSIM4v7BPgpPtr) -= m * ggislg); - (*(here->BSIM4v7BPspPtr) -= m * ggisls); - (*(here->BSIM4v7BPbpPtr) -= m * ggislb); - - - if (here->BSIM4v7rbodyMod) - { (*(here->BSIM4v7DPdbPtr) += m * (gcdbdb - here->BSIM4v7gbd)); - (*(here->BSIM4v7SPsbPtr) -= m * (here->BSIM4v7gbs - gcsbsb)); - - (*(here->BSIM4v7DBdpPtr) += m * (gcdbdb - here->BSIM4v7gbd)); - (*(here->BSIM4v7DBdbPtr) += m * (here->BSIM4v7gbd - gcdbdb - + here->BSIM4v7grbpd + here->BSIM4v7grbdb)); - (*(here->BSIM4v7DBbpPtr) -= m * here->BSIM4v7grbpd); - (*(here->BSIM4v7DBbPtr) -= m * here->BSIM4v7grbdb); - - (*(here->BSIM4v7BPdbPtr) -= m * here->BSIM4v7grbpd); - (*(here->BSIM4v7BPbPtr) -= m * here->BSIM4v7grbpb); - (*(here->BSIM4v7BPsbPtr) -= m * here->BSIM4v7grbps); - (*(here->BSIM4v7BPbpPtr) += m * (here->BSIM4v7grbpd + here->BSIM4v7grbps - + here->BSIM4v7grbpb)); - /* WDLiu: (gcbbb - here->BSIM4v7gbbs) already added to BPbpPtr */ - - (*(here->BSIM4v7SBspPtr) += m * (gcsbsb - here->BSIM4v7gbs)); - (*(here->BSIM4v7SBbpPtr) -= m * here->BSIM4v7grbps); - (*(here->BSIM4v7SBbPtr) -= m * here->BSIM4v7grbsb); - (*(here->BSIM4v7SBsbPtr) += m * (here->BSIM4v7gbs - gcsbsb - + here->BSIM4v7grbps + here->BSIM4v7grbsb)); - - (*(here->BSIM4v7BdbPtr) -= m * here->BSIM4v7grbdb); - (*(here->BSIM4v7BbpPtr) -= m * here->BSIM4v7grbpb); - (*(here->BSIM4v7BsbPtr) -= m * here->BSIM4v7grbsb); - (*(here->BSIM4v7BbPtr) += m * (here->BSIM4v7grbsb + here->BSIM4v7grbdb - + here->BSIM4v7grbpb)); - } - - if (here->BSIM4v7trnqsMod) - { (*(here->BSIM4v7QqPtr) += m * (gqdef + here->BSIM4v7gtau)); - (*(here->BSIM4v7QgpPtr) += m * (ggtg - gcqgb)); - (*(here->BSIM4v7QdpPtr) += m * (ggtd - gcqdb)); - (*(here->BSIM4v7QspPtr) += m * (ggts - gcqsb)); - (*(here->BSIM4v7QbpPtr) += m * (ggtb - gcqbb)); - - (*(here->BSIM4v7DPqPtr) += m * dxpart * here->BSIM4v7gtau); - (*(here->BSIM4v7SPqPtr) += m * sxpart * here->BSIM4v7gtau); - (*(here->BSIM4v7GPqPtr) -= m * here->BSIM4v7gtau); - } -#endif - -line1000: ; - -#ifndef USE_OMP - } /* End of MOSFET Instance */ -} /* End of Model Instance */ -#endif - -return(OK); -} - -/* function to compute poly depletion effect */ -int BSIM4v7polyDepletion( - double phi, - double ngate, - double epsgate, - double coxe, - double Vgs, - double *Vgs_eff, - double *dVgs_eff_dVg) -{ - double T1, T2, T3, T4, T5, T6, T7, T8; - - /* Poly Gate Si Depletion Effect */ - if ((ngate > 1.0e18) && - (ngate < 1.0e25) && (Vgs > phi) && (epsgate!=0) - ){ - T1 = 1.0e6 * CHARGE * epsgate * ngate / (coxe * coxe); - T8 = Vgs - phi; - T4 = sqrt(1.0 + 2.0 * T8 / T1); - T2 = 2.0 * T8 / (T4 + 1.0); - T3 = 0.5 * T2 * T2 / T1; /* T3 = Vpoly */ - T7 = 1.12 - T3 - 0.05; - T6 = sqrt(T7 * T7 + 0.224); - T5 = 1.12 - 0.5 * (T7 + T6); - *Vgs_eff = Vgs - T5; - *dVgs_eff_dVg = 1.0 - (0.5 - 0.5 / T4) * (1.0 + T7 / T6); - } - else { - *Vgs_eff = Vgs; - *dVgs_eff_dVg = 1.0; - } - return(0); -} - -#ifdef USE_OMP -void BSIM4v7LoadRhsMat(GENmodel *inModel, CKTcircuit *ckt) -{ - int InstCount, idx; - BSIM4v7instance **InstArray; - BSIM4v7instance *here; - BSIM4v7model *model = (BSIM4v7model*)inModel; - - InstArray = model->BSIM4v7InstanceArray; - InstCount = model->BSIM4v7InstCount; - - for(idx = 0; idx < InstCount; idx++) { - here = InstArray[idx]; - model = BSIM4v7modPtr(here); - /* Update b for Ax = b */ - (*(ckt->CKTrhs + here->BSIM4v7dNodePrime) += here->BSIM4v7rhsdPrime); - (*(ckt->CKTrhs + here->BSIM4v7gNodePrime) -= here->BSIM4v7rhsgPrime); - - if (here->BSIM4v7rgateMod == 2) - (*(ckt->CKTrhs + here->BSIM4v7gNodeExt) -= here->BSIM4v7rhsgExt); - else if (here->BSIM4v7rgateMod == 3) - (*(ckt->CKTrhs + here->BSIM4v7gNodeMid) -= here->BSIM4v7grhsMid); - - if (!here->BSIM4v7rbodyMod) - { (*(ckt->CKTrhs + here->BSIM4v7bNodePrime) += here->BSIM4v7rhsbPrime); - (*(ckt->CKTrhs + here->BSIM4v7sNodePrime) += here->BSIM4v7rhssPrime); - } - else - { (*(ckt->CKTrhs + here->BSIM4v7dbNode) -= here->BSIM4v7rhsdb); - (*(ckt->CKTrhs + here->BSIM4v7bNodePrime) += here->BSIM4v7rhsbPrime); - (*(ckt->CKTrhs + here->BSIM4v7sbNode) -= here->BSIM4v7rhssb); - (*(ckt->CKTrhs + here->BSIM4v7sNodePrime) += here->BSIM4v7rhssPrime); - } - - if (model->BSIM4v7rdsMod) - { (*(ckt->CKTrhs + here->BSIM4v7dNode) -= here->BSIM4v7rhsd); - (*(ckt->CKTrhs + here->BSIM4v7sNode) += here->BSIM4v7rhss); - } - - if (here->BSIM4v7trnqsMod) - *(ckt->CKTrhs + here->BSIM4v7qNode) += here->BSIM4v7rhsq; - - - /* Update A for Ax = b */ - if (here->BSIM4v7rgateMod == 1) - { (*(here->BSIM4v7GEgePtr) += here->BSIM4v7_1); - (*(here->BSIM4v7GPgePtr) -= here->BSIM4v7_2); - (*(here->BSIM4v7GEgpPtr) -= here->BSIM4v7_3); - (*(here->BSIM4v7GPgpPtr) += here->BSIM4v7_4); - (*(here->BSIM4v7GPdpPtr) += here->BSIM4v7_5); - (*(here->BSIM4v7GPspPtr) += here->BSIM4v7_6); - (*(here->BSIM4v7GPbpPtr) += here->BSIM4v7_7); - } - else if (here->BSIM4v7rgateMod == 2) - { (*(here->BSIM4v7GEgePtr) += here->BSIM4v7_8); - (*(here->BSIM4v7GEgpPtr) += here->BSIM4v7_9); - (*(here->BSIM4v7GEdpPtr) += here->BSIM4v7_10); - (*(here->BSIM4v7GEspPtr) += here->BSIM4v7_11); - (*(here->BSIM4v7GEbpPtr) += here->BSIM4v7_12); - - (*(here->BSIM4v7GPgePtr) -= here->BSIM4v7_13); - (*(here->BSIM4v7GPgpPtr) += here->BSIM4v7_14); - (*(here->BSIM4v7GPdpPtr) += here->BSIM4v7_15); - (*(here->BSIM4v7GPspPtr) += here->BSIM4v7_16); - (*(here->BSIM4v7GPbpPtr) += here->BSIM4v7_17); - } - else if (here->BSIM4v7rgateMod == 3) - { (*(here->BSIM4v7GEgePtr) += here->BSIM4v7_18); - (*(here->BSIM4v7GEgmPtr) -= here->BSIM4v7_19); - (*(here->BSIM4v7GMgePtr) -= here->BSIM4v7_20); - (*(here->BSIM4v7GMgmPtr) += here->BSIM4v7_21); - - (*(here->BSIM4v7GMdpPtr) += here->BSIM4v7_22); - (*(here->BSIM4v7GMgpPtr) += here->BSIM4v7_23); - (*(here->BSIM4v7GMspPtr) += here->BSIM4v7_24); - (*(here->BSIM4v7GMbpPtr) += here->BSIM4v7_25); - - (*(here->BSIM4v7DPgmPtr) += here->BSIM4v7_26); - (*(here->BSIM4v7GPgmPtr) -= here->BSIM4v7_27); - (*(here->BSIM4v7SPgmPtr) += here->BSIM4v7_28); - (*(here->BSIM4v7BPgmPtr) += here->BSIM4v7_29); - - (*(here->BSIM4v7GPgpPtr) += here->BSIM4v7_30); - (*(here->BSIM4v7GPdpPtr) += here->BSIM4v7_31); - (*(here->BSIM4v7GPspPtr) += here->BSIM4v7_32); - (*(here->BSIM4v7GPbpPtr) += here->BSIM4v7_33); - } - - - else - { (*(here->BSIM4v7GPgpPtr) += here->BSIM4v7_34); - (*(here->BSIM4v7GPdpPtr) += here->BSIM4v7_35); - (*(here->BSIM4v7GPspPtr) += here->BSIM4v7_36); - (*(here->BSIM4v7GPbpPtr) += here->BSIM4v7_37); - } - - - if (model->BSIM4v7rdsMod) - { (*(here->BSIM4v7DgpPtr) += here->BSIM4v7_38); - (*(here->BSIM4v7DspPtr) += here->BSIM4v7_39); - (*(here->BSIM4v7DbpPtr) += here->BSIM4v7_40); - (*(here->BSIM4v7SdpPtr) += here->BSIM4v7_41); - (*(here->BSIM4v7SgpPtr) += here->BSIM4v7_42); - (*(here->BSIM4v7SbpPtr) += here->BSIM4v7_43); - } - - (*(here->BSIM4v7DPdpPtr) += here->BSIM4v7_44); - (*(here->BSIM4v7DPdPtr) -= here->BSIM4v7_45); - (*(here->BSIM4v7DPgpPtr) += here->BSIM4v7_46); - (*(here->BSIM4v7DPspPtr) -= here->BSIM4v7_47); - (*(here->BSIM4v7DPbpPtr) -= here->BSIM4v7_48); - - (*(here->BSIM4v7DdpPtr) -= here->BSIM4v7_49); - (*(here->BSIM4v7DdPtr) += here->BSIM4v7_50); - - (*(here->BSIM4v7SPdpPtr) -= here->BSIM4v7_51); - (*(here->BSIM4v7SPgpPtr) += here->BSIM4v7_52); - (*(here->BSIM4v7SPspPtr) += here->BSIM4v7_53); - (*(here->BSIM4v7SPsPtr) -= here->BSIM4v7_54); - (*(here->BSIM4v7SPbpPtr) -= here->BSIM4v7_55); - - (*(here->BSIM4v7SspPtr) -= here->BSIM4v7_56); - (*(here->BSIM4v7SsPtr) += here->BSIM4v7_57); - - (*(here->BSIM4v7BPdpPtr) += here->BSIM4v7_58); - (*(here->BSIM4v7BPgpPtr) += here->BSIM4v7_59); - (*(here->BSIM4v7BPspPtr) += here->BSIM4v7_60); - (*(here->BSIM4v7BPbpPtr) += here->BSIM4v7_61); - - /* stamp gidl */ - (*(here->BSIM4v7DPdpPtr) += here->BSIM4v7_62); - (*(here->BSIM4v7DPgpPtr) += here->BSIM4v7_63); - (*(here->BSIM4v7DPspPtr) -= here->BSIM4v7_64); - (*(here->BSIM4v7DPbpPtr) += here->BSIM4v7_65); - (*(here->BSIM4v7BPdpPtr) -= here->BSIM4v7_66); - (*(here->BSIM4v7BPgpPtr) -= here->BSIM4v7_67); - (*(here->BSIM4v7BPspPtr) += here->BSIM4v7_68); - (*(here->BSIM4v7BPbpPtr) -= here->BSIM4v7_69); - /* stamp gisl */ - (*(here->BSIM4v7SPdpPtr) -= here->BSIM4v7_70); - (*(here->BSIM4v7SPgpPtr) += here->BSIM4v7_71); - (*(here->BSIM4v7SPspPtr) += here->BSIM4v7_72); - (*(here->BSIM4v7SPbpPtr) += here->BSIM4v7_73); - (*(here->BSIM4v7BPdpPtr) += here->BSIM4v7_74); - (*(here->BSIM4v7BPgpPtr) -= here->BSIM4v7_75); - (*(here->BSIM4v7BPspPtr) -= here->BSIM4v7_76); - (*(here->BSIM4v7BPbpPtr) -= here->BSIM4v7_77); - - - if (here->BSIM4v7rbodyMod) - { (*(here->BSIM4v7DPdbPtr) += here->BSIM4v7_78); - (*(here->BSIM4v7SPsbPtr) -= here->BSIM4v7_79); - - (*(here->BSIM4v7DBdpPtr) += here->BSIM4v7_80); - (*(here->BSIM4v7DBdbPtr) += here->BSIM4v7_81); - (*(here->BSIM4v7DBbpPtr) -= here->BSIM4v7_82); - (*(here->BSIM4v7DBbPtr) -= here->BSIM4v7_83); - - (*(here->BSIM4v7BPdbPtr) -= here->BSIM4v7_84); - (*(here->BSIM4v7BPbPtr) -= here->BSIM4v7_85); - (*(here->BSIM4v7BPsbPtr) -= here->BSIM4v7_86); - (*(here->BSIM4v7BPbpPtr) += here->BSIM4v7_87); - - (*(here->BSIM4v7SBspPtr) += here->BSIM4v7_88); - (*(here->BSIM4v7SBbpPtr) -= here->BSIM4v7_89); - (*(here->BSIM4v7SBbPtr) -= here->BSIM4v7_90); - (*(here->BSIM4v7SBsbPtr) += here->BSIM4v7_91); - - (*(here->BSIM4v7BdbPtr) -= here->BSIM4v7_92); - (*(here->BSIM4v7BbpPtr) -= here->BSIM4v7_93); - (*(here->BSIM4v7BsbPtr) -= here->BSIM4v7_94); - (*(here->BSIM4v7BbPtr) += here->BSIM4v7_95); - } - - if (here->BSIM4v7trnqsMod) - { (*(here->BSIM4v7QqPtr) += here->BSIM4v7_96); - (*(here->BSIM4v7QgpPtr) += here->BSIM4v7_97); - (*(here->BSIM4v7QdpPtr) += here->BSIM4v7_98); - (*(here->BSIM4v7QspPtr) += here->BSIM4v7_99); - (*(here->BSIM4v7QbpPtr) += here->BSIM4v7_100); - - (*(here->BSIM4v7DPqPtr) += here->BSIM4v7_101); - (*(here->BSIM4v7SPqPtr) += here->BSIM4v7_102); - (*(here->BSIM4v7GPqPtr) -= here->BSIM4v7_103); - } - } -} - -#endif diff --git a/src/spicelib/devices/bsim4v7/b4v7mask.c b/src/spicelib/devices/bsim4v7/b4v7mask.c deleted file mode 100644 index 77e160ded..000000000 --- a/src/spicelib/devices/bsim4v7/b4v7mask.c +++ /dev/null @@ -1,2738 +0,0 @@ -/**** BSIM4.7.0 Released by Darsen Lu 04/08/2011 ****/ - -/********** - * Copyright 2006 Regents of the University of California. All rights reserved. - * File: b4mask.c of BSIM4.7.0. - * Author: 2000 Weidong Liu - * Authors: 2001- Xuemei Xi, Mohan Dunga, Ali Niknejad, Chenming Hu. - * Authors: 2006- Mohan Dunga, Ali Niknejad, Chenming Hu - * Authors: 2007- Mohan Dunga, Wenwei Yang, Ali Niknejad, Chenming Hu - * Project Director: Prof. Chenming Hu. - * Modified by Xuemei Xi, 04/06/2001. - * Modified by Xuemei Xi, 10/05/2001. - * Modified by Xuemei Xi, 11/15/2002. - * Modified by Xuemei Xi, 05/09/2003. - * Modified by Xuemei Xi, Mohan Dunga, 07/29/2005. - * Modified by Mohan Dunga, 12/13/2006 - * Modified by Mohan Dunga, Wenwei Yang, 07/31/2008. - * Modified by Tanvir Morshed, Darsen Lu 03/27/2011 - **********/ - - -#include "ngspice/ngspice.h" -#include "ngspice/ifsim.h" -#include "ngspice/cktdefs.h" -#include "ngspice/devdefs.h" -#include "bsim4v7def.h" -#include "ngspice/sperror.h" -#include "ngspice/suffix.h" - -int -BSIM4v7mAsk( -CKTcircuit *ckt, -GENmodel *inst, -int which, -IFvalue *value) -{ - BSIM4v7model *model = (BSIM4v7model *)inst; - - NG_IGNORE(ckt); - - switch(which) - { case BSIM4v7_MOD_MOBMOD : - value->iValue = model->BSIM4v7mobMod; - return(OK); - case BSIM4v7_MOD_PARAMCHK : - value->iValue = model->BSIM4v7paramChk; - return(OK); - case BSIM4v7_MOD_BINUNIT : - value->iValue = model->BSIM4v7binUnit; - return(OK); - case BSIM4v7_MOD_CVCHARGEMOD : - value->iValue = model->BSIM4v7cvchargeMod; - return(OK); - case BSIM4v7_MOD_CAPMOD : - value->iValue = model->BSIM4v7capMod; - return(OK); - case BSIM4v7_MOD_DIOMOD : - value->iValue = model->BSIM4v7dioMod; - return(OK); - case BSIM4v7_MOD_TRNQSMOD : - value->iValue = model->BSIM4v7trnqsMod; - return(OK); - case BSIM4v7_MOD_ACNQSMOD : - value->iValue = model->BSIM4v7acnqsMod; - return(OK); - case BSIM4v7_MOD_FNOIMOD : - value->iValue = model->BSIM4v7fnoiMod; - return(OK); - case BSIM4v7_MOD_TNOIMOD : - value->iValue = model->BSIM4v7tnoiMod; - return(OK); - case BSIM4v7_MOD_RDSMOD : - value->iValue = model->BSIM4v7rdsMod; - return(OK); - case BSIM4v7_MOD_RBODYMOD : - value->iValue = model->BSIM4v7rbodyMod; - return(OK); - case BSIM4v7_MOD_RGATEMOD : - value->iValue = model->BSIM4v7rgateMod; - return(OK); - case BSIM4v7_MOD_PERMOD : - value->iValue = model->BSIM4v7perMod; - return(OK); - case BSIM4v7_MOD_GEOMOD : - value->iValue = model->BSIM4v7geoMod; - return(OK); - case BSIM4v7_MOD_RGEOMOD : - value->iValue = model->BSIM4v7rgeoMod; - return(OK); - case BSIM4v7_MOD_MTRLMOD : - value->iValue = model->BSIM4v7mtrlMod; - return(OK); - case BSIM4v7_MOD_GIDLMOD : /* v4.7 New GIDL/GISL*/ - value->iValue = model->BSIM4v7gidlMod; - return(OK); - case BSIM4v7_MOD_MTRLCOMPATMOD : - value->iValue = model->BSIM4v7mtrlCompatMod; - return(OK); - case BSIM4v7_MOD_IGCMOD : - value->iValue = model->BSIM4v7igcMod; - return(OK); - case BSIM4v7_MOD_IGBMOD : - value->iValue = model->BSIM4v7igbMod; - return(OK); - case BSIM4v7_MOD_TEMPMOD : - value->iValue = model->BSIM4v7tempMod; - return(OK); - - case BSIM4v7_MOD_VERSION : - value->sValue = model->BSIM4v7version; - return(OK); - case BSIM4v7_MOD_TOXREF : - value->rValue = model->BSIM4v7toxref; - return(OK); - case BSIM4v7_MOD_EOT : - value->rValue = model->BSIM4v7eot; - return(OK); - case BSIM4v7_MOD_VDDEOT : - value->rValue = model->BSIM4v7vddeot; - return(OK); - case BSIM4v7_MOD_TEMPEOT : - value->rValue = model->BSIM4v7tempeot; - return(OK); - case BSIM4v7_MOD_LEFFEOT : - value->rValue = model->BSIM4v7leffeot; - return(OK); - case BSIM4v7_MOD_WEFFEOT : - value->rValue = model->BSIM4v7weffeot; - return(OK); - case BSIM4v7_MOD_ADOS : - value->rValue = model->BSIM4v7ados; - return(OK); - case BSIM4v7_MOD_BDOS : - value->rValue = model->BSIM4v7bdos; - return(OK); - case BSIM4v7_MOD_TOXE : - value->rValue = model->BSIM4v7toxe; - return(OK); - case BSIM4v7_MOD_TOXP : - value->rValue = model->BSIM4v7toxp; - return(OK); - case BSIM4v7_MOD_TOXM : - value->rValue = model->BSIM4v7toxm; - return(OK); - case BSIM4v7_MOD_DTOX : - value->rValue = model->BSIM4v7dtox; - return(OK); - case BSIM4v7_MOD_EPSROX : - value->rValue = model->BSIM4v7epsrox; - return(OK); - case BSIM4v7_MOD_CDSC : - value->rValue = model->BSIM4v7cdsc; - return(OK); - case BSIM4v7_MOD_CDSCB : - value->rValue = model->BSIM4v7cdscb; - return(OK); - - case BSIM4v7_MOD_CDSCD : - value->rValue = model->BSIM4v7cdscd; - return(OK); - - case BSIM4v7_MOD_CIT : - value->rValue = model->BSIM4v7cit; - return(OK); - case BSIM4v7_MOD_NFACTOR : - value->rValue = model->BSIM4v7nfactor; - return(OK); - case BSIM4v7_MOD_XJ: - value->rValue = model->BSIM4v7xj; - return(OK); - case BSIM4v7_MOD_VSAT: - value->rValue = model->BSIM4v7vsat; - return(OK); - case BSIM4v7_MOD_VTL: - value->rValue = model->BSIM4v7vtl; - return(OK); - case BSIM4v7_MOD_XN: - value->rValue = model->BSIM4v7xn; - return(OK); - case BSIM4v7_MOD_LC: - value->rValue = model->BSIM4v7lc; - return(OK); - case BSIM4v7_MOD_LAMBDA: - value->rValue = model->BSIM4v7lambda; - return(OK); - case BSIM4v7_MOD_AT: - value->rValue = model->BSIM4v7at; - return(OK); - case BSIM4v7_MOD_A0: - value->rValue = model->BSIM4v7a0; - return(OK); - - case BSIM4v7_MOD_AGS: - value->rValue = model->BSIM4v7ags; - return(OK); - - case BSIM4v7_MOD_A1: - value->rValue = model->BSIM4v7a1; - return(OK); - case BSIM4v7_MOD_A2: - value->rValue = model->BSIM4v7a2; - return(OK); - case BSIM4v7_MOD_KETA: - value->rValue = model->BSIM4v7keta; - return(OK); - case BSIM4v7_MOD_NSUB: - value->rValue = model->BSIM4v7nsub; - return(OK); - case BSIM4v7_MOD_PHIG: - value->rValue = model->BSIM4v7phig; - return(OK); - case BSIM4v7_MOD_EPSRGATE: - value->rValue = model->BSIM4v7epsrgate; - return(OK); - case BSIM4v7_MOD_EASUB: - value->rValue = model->BSIM4v7easub; - return(OK); - case BSIM4v7_MOD_EPSRSUB: - value->rValue = model->BSIM4v7epsrsub; - return(OK); - case BSIM4v7_MOD_NI0SUB: - value->rValue = model->BSIM4v7ni0sub; - return(OK); - case BSIM4v7_MOD_BG0SUB: - value->rValue = model->BSIM4v7bg0sub; - return(OK); - case BSIM4v7_MOD_TBGASUB: - value->rValue = model->BSIM4v7tbgasub; - return(OK); - case BSIM4v7_MOD_TBGBSUB: - value->rValue = model->BSIM4v7tbgbsub; - return(OK); - case BSIM4v7_MOD_NDEP: - value->rValue = model->BSIM4v7ndep; - return(OK); - case BSIM4v7_MOD_NSD: - value->rValue = model->BSIM4v7nsd; - return(OK); - case BSIM4v7_MOD_NGATE: - value->rValue = model->BSIM4v7ngate; - return(OK); - case BSIM4v7_MOD_GAMMA1: - value->rValue = model->BSIM4v7gamma1; - return(OK); - case BSIM4v7_MOD_GAMMA2: - value->rValue = model->BSIM4v7gamma2; - return(OK); - case BSIM4v7_MOD_VBX: - value->rValue = model->BSIM4v7vbx; - return(OK); - case BSIM4v7_MOD_VBM: - value->rValue = model->BSIM4v7vbm; - return(OK); - case BSIM4v7_MOD_XT: - value->rValue = model->BSIM4v7xt; - return(OK); - case BSIM4v7_MOD_K1: - value->rValue = model->BSIM4v7k1; - return(OK); - case BSIM4v7_MOD_KT1: - value->rValue = model->BSIM4v7kt1; - return(OK); - case BSIM4v7_MOD_KT1L: - value->rValue = model->BSIM4v7kt1l; - return(OK); - case BSIM4v7_MOD_KT2 : - value->rValue = model->BSIM4v7kt2; - return(OK); - case BSIM4v7_MOD_K2 : - value->rValue = model->BSIM4v7k2; - return(OK); - case BSIM4v7_MOD_K3: - value->rValue = model->BSIM4v7k3; - return(OK); - case BSIM4v7_MOD_K3B: - value->rValue = model->BSIM4v7k3b; - return(OK); - case BSIM4v7_MOD_W0: - value->rValue = model->BSIM4v7w0; - return(OK); - case BSIM4v7_MOD_LPE0: - value->rValue = model->BSIM4v7lpe0; - return(OK); - case BSIM4v7_MOD_LPEB: - value->rValue = model->BSIM4v7lpeb; - return(OK); - case BSIM4v7_MOD_DVTP0: - value->rValue = model->BSIM4v7dvtp0; - return(OK); - case BSIM4v7_MOD_DVTP1: - value->rValue = model->BSIM4v7dvtp1; - return(OK); - case BSIM4v7_MOD_DVTP2: - value->rValue = model->BSIM4v7dvtp2; /* New DIBL/Rout */ - return(OK); - case BSIM4v7_MOD_DVTP3: - value->rValue = model->BSIM4v7dvtp3; - return(OK); - case BSIM4v7_MOD_DVTP4: - value->rValue = model->BSIM4v7dvtp4; - return(OK); - case BSIM4v7_MOD_DVTP5: - value->rValue = model->BSIM4v7dvtp5; - return(OK); - case BSIM4v7_MOD_DVT0 : - value->rValue = model->BSIM4v7dvt0; - return(OK); - case BSIM4v7_MOD_DVT1 : - value->rValue = model->BSIM4v7dvt1; - return(OK); - case BSIM4v7_MOD_DVT2 : - value->rValue = model->BSIM4v7dvt2; - return(OK); - case BSIM4v7_MOD_DVT0W : - value->rValue = model->BSIM4v7dvt0w; - return(OK); - case BSIM4v7_MOD_DVT1W : - value->rValue = model->BSIM4v7dvt1w; - return(OK); - case BSIM4v7_MOD_DVT2W : - value->rValue = model->BSIM4v7dvt2w; - return(OK); - case BSIM4v7_MOD_DROUT : - value->rValue = model->BSIM4v7drout; - return(OK); - case BSIM4v7_MOD_DSUB : - value->rValue = model->BSIM4v7dsub; - return(OK); - case BSIM4v7_MOD_VTH0: - value->rValue = model->BSIM4v7vth0; - return(OK); - case BSIM4v7_MOD_EU: - value->rValue = model->BSIM4v7eu; - return(OK); - case BSIM4v7_MOD_UCS: - value->rValue = model->BSIM4v7ucs; - return(OK); - case BSIM4v7_MOD_UA: - value->rValue = model->BSIM4v7ua; - return(OK); - case BSIM4v7_MOD_UA1: - value->rValue = model->BSIM4v7ua1; - return(OK); - case BSIM4v7_MOD_UB: - value->rValue = model->BSIM4v7ub; - return(OK); - case BSIM4v7_MOD_UB1: - value->rValue = model->BSIM4v7ub1; - return(OK); - case BSIM4v7_MOD_UC: - value->rValue = model->BSIM4v7uc; - return(OK); - case BSIM4v7_MOD_UC1: - value->rValue = model->BSIM4v7uc1; - return(OK); - case BSIM4v7_MOD_UD: - value->rValue = model->BSIM4v7ud; - return(OK); - case BSIM4v7_MOD_UD1: - value->rValue = model->BSIM4v7ud1; - return(OK); - case BSIM4v7_MOD_UP: - value->rValue = model->BSIM4v7up; - return(OK); - case BSIM4v7_MOD_LP: - value->rValue = model->BSIM4v7lp; - return(OK); - case BSIM4v7_MOD_U0: - value->rValue = model->BSIM4v7u0; - return(OK); - case BSIM4v7_MOD_UTE: - value->rValue = model->BSIM4v7ute; - return(OK); - case BSIM4v7_MOD_UCSTE: - value->rValue = model->BSIM4v7ucste; - return(OK); - case BSIM4v7_MOD_VOFF: - value->rValue = model->BSIM4v7voff; - return(OK); - case BSIM4v7_MOD_TVOFF: - value->rValue = model->BSIM4v7tvoff; - return(OK); - case BSIM4v7_MOD_TNFACTOR: /* v4.7 temp dep of leakage current */ - value->rValue = model->BSIM4v7tnfactor; - return(OK); - case BSIM4v7_MOD_TETA0: /* v4.7 temp dep of leakage current */ - value->rValue = model->BSIM4v7teta0; - return(OK); - case BSIM4v7_MOD_TVOFFCV: /* v4.7 temp dep of leakage current */ - value->rValue = model->BSIM4v7tvoffcv; - return(OK); - case BSIM4v7_MOD_VFBSDOFF: - value->rValue = model->BSIM4v7vfbsdoff; - return(OK); - case BSIM4v7_MOD_TVFBSDOFF: - value->rValue = model->BSIM4v7tvfbsdoff; - return(OK); - case BSIM4v7_MOD_VOFFL: - value->rValue = model->BSIM4v7voffl; - return(OK); - case BSIM4v7_MOD_VOFFCVL: - value->rValue = model->BSIM4v7voffcvl; - return(OK); - case BSIM4v7_MOD_MINV: - value->rValue = model->BSIM4v7minv; - return(OK); - case BSIM4v7_MOD_MINVCV: - value->rValue = model->BSIM4v7minvcv; - return(OK); - case BSIM4v7_MOD_FPROUT: - value->rValue = model->BSIM4v7fprout; - return(OK); - case BSIM4v7_MOD_PDITS: - value->rValue = model->BSIM4v7pdits; - return(OK); - case BSIM4v7_MOD_PDITSD: - value->rValue = model->BSIM4v7pditsd; - return(OK); - case BSIM4v7_MOD_PDITSL: - value->rValue = model->BSIM4v7pditsl; - return(OK); - case BSIM4v7_MOD_DELTA: - value->rValue = model->BSIM4v7delta; - return(OK); - case BSIM4v7_MOD_RDSW: - value->rValue = model->BSIM4v7rdsw; - return(OK); - case BSIM4v7_MOD_RDSWMIN: - value->rValue = model->BSIM4v7rdswmin; - return(OK); - case BSIM4v7_MOD_RDWMIN: - value->rValue = model->BSIM4v7rdwmin; - return(OK); - case BSIM4v7_MOD_RSWMIN: - value->rValue = model->BSIM4v7rswmin; - return(OK); - case BSIM4v7_MOD_RDW: - value->rValue = model->BSIM4v7rdw; - return(OK); - case BSIM4v7_MOD_RSW: - value->rValue = model->BSIM4v7rsw; - return(OK); - case BSIM4v7_MOD_PRWG: - value->rValue = model->BSIM4v7prwg; - return(OK); - case BSIM4v7_MOD_PRWB: - value->rValue = model->BSIM4v7prwb; - return(OK); - case BSIM4v7_MOD_PRT: - value->rValue = model->BSIM4v7prt; - return(OK); - case BSIM4v7_MOD_ETA0: - value->rValue = model->BSIM4v7eta0; - return(OK); - case BSIM4v7_MOD_ETAB: - value->rValue = model->BSIM4v7etab; - return(OK); - case BSIM4v7_MOD_PCLM: - value->rValue = model->BSIM4v7pclm; - return(OK); - case BSIM4v7_MOD_PDIBL1: - value->rValue = model->BSIM4v7pdibl1; - return(OK); - case BSIM4v7_MOD_PDIBL2: - value->rValue = model->BSIM4v7pdibl2; - return(OK); - case BSIM4v7_MOD_PDIBLB: - value->rValue = model->BSIM4v7pdiblb; - return(OK); - case BSIM4v7_MOD_PSCBE1: - value->rValue = model->BSIM4v7pscbe1; - return(OK); - case BSIM4v7_MOD_PSCBE2: - value->rValue = model->BSIM4v7pscbe2; - return(OK); - case BSIM4v7_MOD_PVAG: - value->rValue = model->BSIM4v7pvag; - return(OK); - case BSIM4v7_MOD_WR: - value->rValue = model->BSIM4v7wr; - return(OK); - case BSIM4v7_MOD_DWG: - value->rValue = model->BSIM4v7dwg; - return(OK); - case BSIM4v7_MOD_DWB: - value->rValue = model->BSIM4v7dwb; - return(OK); - case BSIM4v7_MOD_B0: - value->rValue = model->BSIM4v7b0; - return(OK); - case BSIM4v7_MOD_B1: - value->rValue = model->BSIM4v7b1; - return(OK); - case BSIM4v7_MOD_ALPHA0: - value->rValue = model->BSIM4v7alpha0; - return(OK); - case BSIM4v7_MOD_ALPHA1: - value->rValue = model->BSIM4v7alpha1; - return(OK); - case BSIM4v7_MOD_BETA0: - value->rValue = model->BSIM4v7beta0; - return(OK); - case BSIM4v7_MOD_AGIDL: - value->rValue = model->BSIM4v7agidl; - return(OK); - case BSIM4v7_MOD_BGIDL: - value->rValue = model->BSIM4v7bgidl; - return(OK); - case BSIM4v7_MOD_CGIDL: - value->rValue = model->BSIM4v7cgidl; - return(OK); - case BSIM4v7_MOD_EGIDL: - value->rValue = model->BSIM4v7egidl; - return(OK); - case BSIM4v7_MOD_FGIDL: /* v4.7 New GIDL/GISL*/ - value->rValue = model->BSIM4v7fgidl; - return(OK); - case BSIM4v7_MOD_KGIDL: /* v4.7 New GIDL/GISL*/ - value->rValue = model->BSIM4v7kgidl; - return(OK); - case BSIM4v7_MOD_RGIDL: /* v4.7 New GIDL/GISL*/ - value->rValue = model->BSIM4v7rgidl; - return(OK); - case BSIM4v7_MOD_AGISL: - value->rValue = model->BSIM4v7agisl; - return(OK); - case BSIM4v7_MOD_BGISL: - value->rValue = model->BSIM4v7bgisl; - return(OK); - case BSIM4v7_MOD_CGISL: - value->rValue = model->BSIM4v7cgisl; - return(OK); - case BSIM4v7_MOD_EGISL: - value->rValue = model->BSIM4v7egisl; - return(OK); - case BSIM4v7_MOD_FGISL: /* v4.7 New GIDL/GISL*/ - value->rValue = model->BSIM4v7fgisl; - return(OK); - case BSIM4v7_MOD_KGISL: /* v4.7 New GIDL/GISL*/ - value->rValue = model->BSIM4v7kgisl; - return(OK); - case BSIM4v7_MOD_RGISL: /* v4.7 New GIDL/GISL*/ - value->rValue = model->BSIM4v7rgisl; - return(OK); - case BSIM4v7_MOD_AIGC: - value->rValue = model->BSIM4v7aigc; - return(OK); - case BSIM4v7_MOD_BIGC: - value->rValue = model->BSIM4v7bigc; - return(OK); - case BSIM4v7_MOD_CIGC: - value->rValue = model->BSIM4v7cigc; - return(OK); - case BSIM4v7_MOD_AIGSD: - value->rValue = model->BSIM4v7aigsd; - return(OK); - case BSIM4v7_MOD_BIGSD: - value->rValue = model->BSIM4v7bigsd; - return(OK); - case BSIM4v7_MOD_CIGSD: - value->rValue = model->BSIM4v7cigsd; - return(OK); - case BSIM4v7_MOD_AIGS: - value->rValue = model->BSIM4v7aigs; - return(OK); - case BSIM4v7_MOD_BIGS: - value->rValue = model->BSIM4v7bigs; - return(OK); - case BSIM4v7_MOD_CIGS: - value->rValue = model->BSIM4v7cigs; - return(OK); - case BSIM4v7_MOD_AIGD: - value->rValue = model->BSIM4v7aigd; - return(OK); - case BSIM4v7_MOD_BIGD: - value->rValue = model->BSIM4v7bigd; - return(OK); - case BSIM4v7_MOD_CIGD: - value->rValue = model->BSIM4v7cigd; - return(OK); - case BSIM4v7_MOD_AIGBACC: - value->rValue = model->BSIM4v7aigbacc; - return(OK); - case BSIM4v7_MOD_BIGBACC: - value->rValue = model->BSIM4v7bigbacc; - return(OK); - case BSIM4v7_MOD_CIGBACC: - value->rValue = model->BSIM4v7cigbacc; - return(OK); - case BSIM4v7_MOD_AIGBINV: - value->rValue = model->BSIM4v7aigbinv; - return(OK); - case BSIM4v7_MOD_BIGBINV: - value->rValue = model->BSIM4v7bigbinv; - return(OK); - case BSIM4v7_MOD_CIGBINV: - value->rValue = model->BSIM4v7cigbinv; - return(OK); - case BSIM4v7_MOD_NIGC: - value->rValue = model->BSIM4v7nigc; - return(OK); - case BSIM4v7_MOD_NIGBACC: - value->rValue = model->BSIM4v7nigbacc; - return(OK); - case BSIM4v7_MOD_NIGBINV: - value->rValue = model->BSIM4v7nigbinv; - return(OK); - case BSIM4v7_MOD_NTOX: - value->rValue = model->BSIM4v7ntox; - return(OK); - case BSIM4v7_MOD_EIGBINV: - value->rValue = model->BSIM4v7eigbinv; - return(OK); - case BSIM4v7_MOD_PIGCD: - value->rValue = model->BSIM4v7pigcd; - return(OK); - case BSIM4v7_MOD_POXEDGE: - value->rValue = model->BSIM4v7poxedge; - return(OK); - case BSIM4v7_MOD_PHIN: - value->rValue = model->BSIM4v7phin; - return(OK); - case BSIM4v7_MOD_XRCRG1: - value->rValue = model->BSIM4v7xrcrg1; - return(OK); - case BSIM4v7_MOD_XRCRG2: - value->rValue = model->BSIM4v7xrcrg2; - return(OK); - case BSIM4v7_MOD_TNOIA: - value->rValue = model->BSIM4v7tnoia; - return(OK); - case BSIM4v7_MOD_TNOIB: - value->rValue = model->BSIM4v7tnoib; - return(OK); - case BSIM4v7_MOD_TNOIC: - value->rValue = model->BSIM4v7tnoic; - return(OK); - case BSIM4v7_MOD_RNOIA: - value->rValue = model->BSIM4v7rnoia; - return(OK); - case BSIM4v7_MOD_RNOIB: - value->rValue = model->BSIM4v7rnoib; - return(OK); - case BSIM4v7_MOD_RNOIC: - value->rValue = model->BSIM4v7rnoic; - return(OK); - case BSIM4v7_MOD_NTNOI: - value->rValue = model->BSIM4v7ntnoi; - return(OK); - case BSIM4v7_MOD_IJTHDFWD: - value->rValue = model->BSIM4v7ijthdfwd; - return(OK); - case BSIM4v7_MOD_IJTHSFWD: - value->rValue = model->BSIM4v7ijthsfwd; - return(OK); - case BSIM4v7_MOD_IJTHDREV: - value->rValue = model->BSIM4v7ijthdrev; - return(OK); - case BSIM4v7_MOD_IJTHSREV: - value->rValue = model->BSIM4v7ijthsrev; - return(OK); - case BSIM4v7_MOD_XJBVD: - value->rValue = model->BSIM4v7xjbvd; - return(OK); - case BSIM4v7_MOD_XJBVS: - value->rValue = model->BSIM4v7xjbvs; - return(OK); - case BSIM4v7_MOD_BVD: - value->rValue = model->BSIM4v7bvd; - return(OK); - case BSIM4v7_MOD_BVS: - value->rValue = model->BSIM4v7bvs; - return(OK); - case BSIM4v7_MOD_VFB: - value->rValue = model->BSIM4v7vfb; - return(OK); - - case BSIM4v7_MOD_JTSS: - value->rValue = model->BSIM4v7jtss; - return(OK); - case BSIM4v7_MOD_JTSD: - value->rValue = model->BSIM4v7jtsd; - return(OK); - case BSIM4v7_MOD_JTSSWS: - value->rValue = model->BSIM4v7jtssws; - return(OK); - case BSIM4v7_MOD_JTSSWD: - value->rValue = model->BSIM4v7jtsswd; - return(OK); - case BSIM4v7_MOD_JTSSWGS: - value->rValue = model->BSIM4v7jtsswgs; - return(OK); - case BSIM4v7_MOD_JTSSWGD: - value->rValue = model->BSIM4v7jtsswgd; - return(OK); - case BSIM4v7_MOD_JTWEFF: - value->rValue = model->BSIM4v7jtweff; - return(OK); - case BSIM4v7_MOD_NJTS: - value->rValue = model->BSIM4v7njts; - return(OK); - case BSIM4v7_MOD_NJTSSW: - value->rValue = model->BSIM4v7njtssw; - return(OK); - case BSIM4v7_MOD_NJTSSWG: - value->rValue = model->BSIM4v7njtsswg; - return(OK); - case BSIM4v7_MOD_NJTSD: - value->rValue = model->BSIM4v7njtsd; - return(OK); - case BSIM4v7_MOD_NJTSSWD: - value->rValue = model->BSIM4v7njtsswd; - return(OK); - case BSIM4v7_MOD_NJTSSWGD: - value->rValue = model->BSIM4v7njtsswgd; - return(OK); - case BSIM4v7_MOD_XTSS: - value->rValue = model->BSIM4v7xtss; - return(OK); - case BSIM4v7_MOD_XTSD: - value->rValue = model->BSIM4v7xtsd; - return(OK); - case BSIM4v7_MOD_XTSSWS: - value->rValue = model->BSIM4v7xtssws; - return(OK); - case BSIM4v7_MOD_XTSSWD: - value->rValue = model->BSIM4v7xtsswd; - return(OK); - case BSIM4v7_MOD_XTSSWGS: - value->rValue = model->BSIM4v7xtsswgs; - return(OK); - case BSIM4v7_MOD_XTSSWGD: - value->rValue = model->BSIM4v7xtsswgd; - return(OK); - case BSIM4v7_MOD_TNJTS: - value->rValue = model->BSIM4v7tnjts; - return(OK); - case BSIM4v7_MOD_TNJTSSW: - value->rValue = model->BSIM4v7tnjtssw; - return(OK); - case BSIM4v7_MOD_TNJTSSWG: - value->rValue = model->BSIM4v7tnjtsswg; - return(OK); - case BSIM4v7_MOD_TNJTSD: - value->rValue = model->BSIM4v7tnjtsd; - return(OK); - case BSIM4v7_MOD_TNJTSSWD: - value->rValue = model->BSIM4v7tnjtsswd; - return(OK); - case BSIM4v7_MOD_TNJTSSWGD: - value->rValue = model->BSIM4v7tnjtsswgd; - return(OK); - case BSIM4v7_MOD_VTSS: - value->rValue = model->BSIM4v7vtss; - return(OK); - case BSIM4v7_MOD_VTSD: - value->rValue = model->BSIM4v7vtsd; - return(OK); - case BSIM4v7_MOD_VTSSWS: - value->rValue = model->BSIM4v7vtssws; - return(OK); - case BSIM4v7_MOD_VTSSWD: - value->rValue = model->BSIM4v7vtsswd; - return(OK); - case BSIM4v7_MOD_VTSSWGS: - value->rValue = model->BSIM4v7vtsswgs; - return(OK); - case BSIM4v7_MOD_VTSSWGD: - value->rValue = model->BSIM4v7vtsswgd; - return(OK); - - case BSIM4v7_MOD_GBMIN: - value->rValue = model->BSIM4v7gbmin; - return(OK); - case BSIM4v7_MOD_RBDB: - value->rValue = model->BSIM4v7rbdb; - return(OK); - case BSIM4v7_MOD_RBPB: - value->rValue = model->BSIM4v7rbpb; - return(OK); - case BSIM4v7_MOD_RBSB: - value->rValue = model->BSIM4v7rbsb; - return(OK); - case BSIM4v7_MOD_RBPS: - value->rValue = model->BSIM4v7rbps; - return(OK); - case BSIM4v7_MOD_RBPD: - value->rValue = model->BSIM4v7rbpd; - return(OK); - - case BSIM4v7_MOD_RBPS0: - value->rValue = model->BSIM4v7rbps0; - return(OK); - case BSIM4v7_MOD_RBPSL: - value->rValue = model->BSIM4v7rbpsl; - return(OK); - case BSIM4v7_MOD_RBPSW: - value->rValue = model->BSIM4v7rbpsw; - return(OK); - case BSIM4v7_MOD_RBPSNF: - value->rValue = model->BSIM4v7rbpsnf; - return(OK); - case BSIM4v7_MOD_RBPD0: - value->rValue = model->BSIM4v7rbpd0; - return(OK); - case BSIM4v7_MOD_RBPDL: - value->rValue = model->BSIM4v7rbpdl; - return(OK); - case BSIM4v7_MOD_RBPDW: - value->rValue = model->BSIM4v7rbpdw; - return(OK); - case BSIM4v7_MOD_RBPDNF: - value->rValue = model->BSIM4v7rbpdnf; - return(OK); - case BSIM4v7_MOD_RBPBX0: - value->rValue = model->BSIM4v7rbpbx0; - return(OK); - case BSIM4v7_MOD_RBPBXL: - value->rValue = model->BSIM4v7rbpbxl; - return(OK); - case BSIM4v7_MOD_RBPBXW: - value->rValue = model->BSIM4v7rbpbxw; - return(OK); - case BSIM4v7_MOD_RBPBXNF: - value->rValue = model->BSIM4v7rbpbxnf; - return(OK); - case BSIM4v7_MOD_RBPBY0: - value->rValue = model->BSIM4v7rbpby0; - return(OK); - case BSIM4v7_MOD_RBPBYL: - value->rValue = model->BSIM4v7rbpbyl; - return(OK); - case BSIM4v7_MOD_RBPBYW: - value->rValue = model->BSIM4v7rbpbyw; - return(OK); - case BSIM4v7_MOD_RBPBYNF: - value->rValue = model->BSIM4v7rbpbynf; - return(OK); - - case BSIM4v7_MOD_RBSBX0: - value->rValue = model->BSIM4v7rbsbx0; - return(OK); - case BSIM4v7_MOD_RBSBY0: - value->rValue = model->BSIM4v7rbsby0; - return(OK); - case BSIM4v7_MOD_RBDBX0: - value->rValue = model->BSIM4v7rbdbx0; - return(OK); - case BSIM4v7_MOD_RBDBY0: - value->rValue = model->BSIM4v7rbdby0; - return(OK); - case BSIM4v7_MOD_RBSDBXL: - value->rValue = model->BSIM4v7rbsdbxl; - return(OK); - case BSIM4v7_MOD_RBSDBXW: - value->rValue = model->BSIM4v7rbsdbxw; - return(OK); - case BSIM4v7_MOD_RBSDBXNF: - value->rValue = model->BSIM4v7rbsdbxnf; - return(OK); - case BSIM4v7_MOD_RBSDBYL: - value->rValue = model->BSIM4v7rbsdbyl; - return(OK); - case BSIM4v7_MOD_RBSDBYW: - value->rValue = model->BSIM4v7rbsdbyw; - return(OK); - case BSIM4v7_MOD_RBSDBYNF: - value->rValue = model->BSIM4v7rbsdbynf; - return(OK); - - - case BSIM4v7_MOD_CGSL: - value->rValue = model->BSIM4v7cgsl; - return(OK); - case BSIM4v7_MOD_CGDL: - value->rValue = model->BSIM4v7cgdl; - return(OK); - case BSIM4v7_MOD_CKAPPAS: - value->rValue = model->BSIM4v7ckappas; - return(OK); - case BSIM4v7_MOD_CKAPPAD: - value->rValue = model->BSIM4v7ckappad; - return(OK); - case BSIM4v7_MOD_CF: - value->rValue = model->BSIM4v7cf; - return(OK); - case BSIM4v7_MOD_CLC: - value->rValue = model->BSIM4v7clc; - return(OK); - case BSIM4v7_MOD_CLE: - value->rValue = model->BSIM4v7cle; - return(OK); - case BSIM4v7_MOD_DWC: - value->rValue = model->BSIM4v7dwc; - return(OK); - case BSIM4v7_MOD_DLC: - value->rValue = model->BSIM4v7dlc; - return(OK); - case BSIM4v7_MOD_XW: - value->rValue = model->BSIM4v7xw; - return(OK); - case BSIM4v7_MOD_XL: - value->rValue = model->BSIM4v7xl; - return(OK); - case BSIM4v7_MOD_DLCIG: - value->rValue = model->BSIM4v7dlcig; - return(OK); - case BSIM4v7_MOD_DLCIGD: - value->rValue = model->BSIM4v7dlcigd; - return(OK); - case BSIM4v7_MOD_DWJ: - value->rValue = model->BSIM4v7dwj; - return(OK); - case BSIM4v7_MOD_VFBCV: - value->rValue = model->BSIM4v7vfbcv; - return(OK); - case BSIM4v7_MOD_ACDE: - value->rValue = model->BSIM4v7acde; - return(OK); - case BSIM4v7_MOD_MOIN: - value->rValue = model->BSIM4v7moin; - return(OK); - case BSIM4v7_MOD_NOFF: - value->rValue = model->BSIM4v7noff; - return(OK); - case BSIM4v7_MOD_VOFFCV: - value->rValue = model->BSIM4v7voffcv; - return(OK); - case BSIM4v7_MOD_DMCG: - value->rValue = model->BSIM4v7dmcg; - return(OK); - case BSIM4v7_MOD_DMCI: - value->rValue = model->BSIM4v7dmci; - return(OK); - case BSIM4v7_MOD_DMDG: - value->rValue = model->BSIM4v7dmdg; - return(OK); - case BSIM4v7_MOD_DMCGT: - value->rValue = model->BSIM4v7dmcgt; - return(OK); - case BSIM4v7_MOD_XGW: - value->rValue = model->BSIM4v7xgw; - return(OK); - case BSIM4v7_MOD_XGL: - value->rValue = model->BSIM4v7xgl; - return(OK); - case BSIM4v7_MOD_RSHG: - value->rValue = model->BSIM4v7rshg; - return(OK); - case BSIM4v7_MOD_NGCON: - value->rValue = model->BSIM4v7ngcon; - return(OK); - case BSIM4v7_MOD_TCJ: - value->rValue = model->BSIM4v7tcj; - return(OK); - case BSIM4v7_MOD_TPB: - value->rValue = model->BSIM4v7tpb; - return(OK); - case BSIM4v7_MOD_TCJSW: - value->rValue = model->BSIM4v7tcjsw; - return(OK); - case BSIM4v7_MOD_TPBSW: - value->rValue = model->BSIM4v7tpbsw; - return(OK); - case BSIM4v7_MOD_TCJSWG: - value->rValue = model->BSIM4v7tcjswg; - return(OK); - case BSIM4v7_MOD_TPBSWG: - value->rValue = model->BSIM4v7tpbswg; - return(OK); - - /* Length dependence */ - case BSIM4v7_MOD_LCDSC : - value->rValue = model->BSIM4v7lcdsc; - return(OK); - case BSIM4v7_MOD_LCDSCB : - value->rValue = model->BSIM4v7lcdscb; - return(OK); - case BSIM4v7_MOD_LCDSCD : - value->rValue = model->BSIM4v7lcdscd; - return(OK); - case BSIM4v7_MOD_LCIT : - value->rValue = model->BSIM4v7lcit; - return(OK); - case BSIM4v7_MOD_LNFACTOR : - value->rValue = model->BSIM4v7lnfactor; - return(OK); - case BSIM4v7_MOD_LXJ: - value->rValue = model->BSIM4v7lxj; - return(OK); - case BSIM4v7_MOD_LVSAT: - value->rValue = model->BSIM4v7lvsat; - return(OK); - case BSIM4v7_MOD_LAT: - value->rValue = model->BSIM4v7lat; - return(OK); - case BSIM4v7_MOD_LA0: - value->rValue = model->BSIM4v7la0; - return(OK); - case BSIM4v7_MOD_LAGS: - value->rValue = model->BSIM4v7lags; - return(OK); - case BSIM4v7_MOD_LA1: - value->rValue = model->BSIM4v7la1; - return(OK); - case BSIM4v7_MOD_LA2: - value->rValue = model->BSIM4v7la2; - return(OK); - case BSIM4v7_MOD_LKETA: - value->rValue = model->BSIM4v7lketa; - return(OK); - case BSIM4v7_MOD_LNSUB: - value->rValue = model->BSIM4v7lnsub; - return(OK); - case BSIM4v7_MOD_LNDEP: - value->rValue = model->BSIM4v7lndep; - return(OK); - case BSIM4v7_MOD_LNSD: - value->rValue = model->BSIM4v7lnsd; - return(OK); - case BSIM4v7_MOD_LNGATE: - value->rValue = model->BSIM4v7lngate; - return(OK); - case BSIM4v7_MOD_LGAMMA1: - value->rValue = model->BSIM4v7lgamma1; - return(OK); - case BSIM4v7_MOD_LGAMMA2: - value->rValue = model->BSIM4v7lgamma2; - return(OK); - case BSIM4v7_MOD_LVBX: - value->rValue = model->BSIM4v7lvbx; - return(OK); - case BSIM4v7_MOD_LVBM: - value->rValue = model->BSIM4v7lvbm; - return(OK); - case BSIM4v7_MOD_LXT: - value->rValue = model->BSIM4v7lxt; - return(OK); - case BSIM4v7_MOD_LK1: - value->rValue = model->BSIM4v7lk1; - return(OK); - case BSIM4v7_MOD_LKT1: - value->rValue = model->BSIM4v7lkt1; - return(OK); - case BSIM4v7_MOD_LKT1L: - value->rValue = model->BSIM4v7lkt1l; - return(OK); - case BSIM4v7_MOD_LKT2 : - value->rValue = model->BSIM4v7lkt2; - return(OK); - case BSIM4v7_MOD_LK2 : - value->rValue = model->BSIM4v7lk2; - return(OK); - case BSIM4v7_MOD_LK3: - value->rValue = model->BSIM4v7lk3; - return(OK); - case BSIM4v7_MOD_LK3B: - value->rValue = model->BSIM4v7lk3b; - return(OK); - case BSIM4v7_MOD_LW0: - value->rValue = model->BSIM4v7lw0; - return(OK); - case BSIM4v7_MOD_LLPE0: - value->rValue = model->BSIM4v7llpe0; - return(OK); - case BSIM4v7_MOD_LLPEB: - value->rValue = model->BSIM4v7llpeb; - return(OK); - case BSIM4v7_MOD_LDVTP0: - value->rValue = model->BSIM4v7ldvtp0; - return(OK); - case BSIM4v7_MOD_LDVTP1: - value->rValue = model->BSIM4v7ldvtp1; - return(OK); - case BSIM4v7_MOD_LDVTP2: - value->rValue = model->BSIM4v7ldvtp2; /* New DIBL/Rout */ - return(OK); - case BSIM4v7_MOD_LDVTP3: - value->rValue = model->BSIM4v7ldvtp3; - return(OK); - case BSIM4v7_MOD_LDVTP4: - value->rValue = model->BSIM4v7ldvtp4; - return(OK); - case BSIM4v7_MOD_LDVTP5: - value->rValue = model->BSIM4v7ldvtp5; - return(OK); - case BSIM4v7_MOD_LDVT0: - value->rValue = model->BSIM4v7ldvt0; - return(OK); - case BSIM4v7_MOD_LDVT1 : - value->rValue = model->BSIM4v7ldvt1; - return(OK); - case BSIM4v7_MOD_LDVT2 : - value->rValue = model->BSIM4v7ldvt2; - return(OK); - case BSIM4v7_MOD_LDVT0W : - value->rValue = model->BSIM4v7ldvt0w; - return(OK); - case BSIM4v7_MOD_LDVT1W : - value->rValue = model->BSIM4v7ldvt1w; - return(OK); - case BSIM4v7_MOD_LDVT2W : - value->rValue = model->BSIM4v7ldvt2w; - return(OK); - case BSIM4v7_MOD_LDROUT : - value->rValue = model->BSIM4v7ldrout; - return(OK); - case BSIM4v7_MOD_LDSUB : - value->rValue = model->BSIM4v7ldsub; - return(OK); - case BSIM4v7_MOD_LVTH0: - value->rValue = model->BSIM4v7lvth0; - return(OK); - case BSIM4v7_MOD_LUA: - value->rValue = model->BSIM4v7lua; - return(OK); - case BSIM4v7_MOD_LUA1: - value->rValue = model->BSIM4v7lua1; - return(OK); - case BSIM4v7_MOD_LUB: - value->rValue = model->BSIM4v7lub; - return(OK); - case BSIM4v7_MOD_LUB1: - value->rValue = model->BSIM4v7lub1; - return(OK); - case BSIM4v7_MOD_LUC: - value->rValue = model->BSIM4v7luc; - return(OK); - case BSIM4v7_MOD_LUC1: - value->rValue = model->BSIM4v7luc1; - return(OK); - case BSIM4v7_MOD_LUD: - value->rValue = model->BSIM4v7lud; - return(OK); - case BSIM4v7_MOD_LUD1: - value->rValue = model->BSIM4v7lud1; - return(OK); - case BSIM4v7_MOD_LUP: - value->rValue = model->BSIM4v7lup; - return(OK); - case BSIM4v7_MOD_LLP: - value->rValue = model->BSIM4v7llp; - return(OK); - case BSIM4v7_MOD_LU0: - value->rValue = model->BSIM4v7lu0; - return(OK); - case BSIM4v7_MOD_LUTE: - value->rValue = model->BSIM4v7lute; - return(OK); - case BSIM4v7_MOD_LUCSTE: - value->rValue = model->BSIM4v7lucste; - return(OK); - case BSIM4v7_MOD_LVOFF: - value->rValue = model->BSIM4v7lvoff; - return(OK); - case BSIM4v7_MOD_LTVOFF: - value->rValue = model->BSIM4v7ltvoff; - return(OK); - case BSIM4v7_MOD_LTNFACTOR: /* v4.7 temp dep of leakage current */ - value->rValue = model->BSIM4v7ltnfactor; - return(OK); - case BSIM4v7_MOD_LTETA0: /* v4.7 temp dep of leakage current */ - value->rValue = model->BSIM4v7lteta0; - return(OK); - case BSIM4v7_MOD_LTVOFFCV: /* v4.7 temp dep of leakage current */ - value->rValue = model->BSIM4v7ltvoffcv; - return(OK); - case BSIM4v7_MOD_LMINV: - value->rValue = model->BSIM4v7lminv; - return(OK); - case BSIM4v7_MOD_LMINVCV: - value->rValue = model->BSIM4v7lminvcv; - return(OK); - case BSIM4v7_MOD_LFPROUT: - value->rValue = model->BSIM4v7lfprout; - return(OK); - case BSIM4v7_MOD_LPDITS: - value->rValue = model->BSIM4v7lpdits; - return(OK); - case BSIM4v7_MOD_LPDITSD: - value->rValue = model->BSIM4v7lpditsd; - return(OK); - case BSIM4v7_MOD_LDELTA: - value->rValue = model->BSIM4v7ldelta; - return(OK); - case BSIM4v7_MOD_LRDSW: - value->rValue = model->BSIM4v7lrdsw; - return(OK); - case BSIM4v7_MOD_LRDW: - value->rValue = model->BSIM4v7lrdw; - return(OK); - case BSIM4v7_MOD_LRSW: - value->rValue = model->BSIM4v7lrsw; - return(OK); - case BSIM4v7_MOD_LPRWB: - value->rValue = model->BSIM4v7lprwb; - return(OK); - case BSIM4v7_MOD_LPRWG: - value->rValue = model->BSIM4v7lprwg; - return(OK); - case BSIM4v7_MOD_LPRT: - value->rValue = model->BSIM4v7lprt; - return(OK); - case BSIM4v7_MOD_LETA0: - value->rValue = model->BSIM4v7leta0; - return(OK); - case BSIM4v7_MOD_LETAB: - value->rValue = model->BSIM4v7letab; - return(OK); - case BSIM4v7_MOD_LPCLM: - value->rValue = model->BSIM4v7lpclm; - return(OK); - case BSIM4v7_MOD_LPDIBL1: - value->rValue = model->BSIM4v7lpdibl1; - return(OK); - case BSIM4v7_MOD_LPDIBL2: - value->rValue = model->BSIM4v7lpdibl2; - return(OK); - case BSIM4v7_MOD_LPDIBLB: - value->rValue = model->BSIM4v7lpdiblb; - return(OK); - case BSIM4v7_MOD_LPSCBE1: - value->rValue = model->BSIM4v7lpscbe1; - return(OK); - case BSIM4v7_MOD_LPSCBE2: - value->rValue = model->BSIM4v7lpscbe2; - return(OK); - case BSIM4v7_MOD_LPVAG: - value->rValue = model->BSIM4v7lpvag; - return(OK); - case BSIM4v7_MOD_LWR: - value->rValue = model->BSIM4v7lwr; - return(OK); - case BSIM4v7_MOD_LDWG: - value->rValue = model->BSIM4v7ldwg; - return(OK); - case BSIM4v7_MOD_LDWB: - value->rValue = model->BSIM4v7ldwb; - return(OK); - case BSIM4v7_MOD_LB0: - value->rValue = model->BSIM4v7lb0; - return(OK); - case BSIM4v7_MOD_LB1: - value->rValue = model->BSIM4v7lb1; - return(OK); - case BSIM4v7_MOD_LALPHA0: - value->rValue = model->BSIM4v7lalpha0; - return(OK); - case BSIM4v7_MOD_LALPHA1: - value->rValue = model->BSIM4v7lalpha1; - return(OK); - case BSIM4v7_MOD_LBETA0: - value->rValue = model->BSIM4v7lbeta0; - return(OK); - case BSIM4v7_MOD_LAGIDL: - value->rValue = model->BSIM4v7lagidl; - return(OK); - case BSIM4v7_MOD_LBGIDL: - value->rValue = model->BSIM4v7lbgidl; - return(OK); - case BSIM4v7_MOD_LCGIDL: - value->rValue = model->BSIM4v7lcgidl; - return(OK); - case BSIM4v7_MOD_LEGIDL: - value->rValue = model->BSIM4v7legidl; - return(OK); - case BSIM4v7_MOD_LFGIDL: /* v4.7 New GIDL/GISL*/ - value->rValue = model->BSIM4v7lfgidl; - return(OK); - case BSIM4v7_MOD_LKGIDL: /* v4.7 New GIDL/GISL*/ - value->rValue = model->BSIM4v7lkgidl; - return(OK); - case BSIM4v7_MOD_LRGIDL: /* v4.7 New GIDL/GISL*/ - value->rValue = model->BSIM4v7lrgidl; - return(OK); - case BSIM4v7_MOD_LAGISL: - value->rValue = model->BSIM4v7lagisl; - return(OK); - case BSIM4v7_MOD_LBGISL: - value->rValue = model->BSIM4v7lbgisl; - return(OK); - case BSIM4v7_MOD_LCGISL: - value->rValue = model->BSIM4v7lcgisl; - return(OK); - case BSIM4v7_MOD_LEGISL: - value->rValue = model->BSIM4v7legisl; - return(OK); - case BSIM4v7_MOD_LFGISL: /* v4.7 New GIDL/GISL*/ - value->rValue = model->BSIM4v7lfgisl; - return(OK); - case BSIM4v7_MOD_LKGISL: /* v4.7 New GIDL/GISL*/ - value->rValue = model->BSIM4v7lkgisl; - return(OK); - case BSIM4v7_MOD_LRGISL: /* v4.7 New GIDL/GISL*/ - value->rValue = model->BSIM4v7lrgisl; - return(OK); - case BSIM4v7_MOD_LAIGC: - value->rValue = model->BSIM4v7laigc; - return(OK); - case BSIM4v7_MOD_LBIGC: - value->rValue = model->BSIM4v7lbigc; - return(OK); - case BSIM4v7_MOD_LCIGC: - value->rValue = model->BSIM4v7lcigc; - return(OK); - case BSIM4v7_MOD_LAIGSD: - value->rValue = model->BSIM4v7laigsd; - return(OK); - case BSIM4v7_MOD_LBIGSD: - value->rValue = model->BSIM4v7lbigsd; - return(OK); - case BSIM4v7_MOD_LCIGSD: - value->rValue = model->BSIM4v7lcigsd; - return(OK); - case BSIM4v7_MOD_LAIGS: - value->rValue = model->BSIM4v7laigs; - return(OK); - case BSIM4v7_MOD_LBIGS: - value->rValue = model->BSIM4v7lbigs; - return(OK); - case BSIM4v7_MOD_LCIGS: - value->rValue = model->BSIM4v7lcigs; - return(OK); - case BSIM4v7_MOD_LAIGD: - value->rValue = model->BSIM4v7laigd; - return(OK); - case BSIM4v7_MOD_LBIGD: - value->rValue = model->BSIM4v7lbigd; - return(OK); - case BSIM4v7_MOD_LCIGD: - value->rValue = model->BSIM4v7lcigd; - return(OK); - case BSIM4v7_MOD_LAIGBACC: - value->rValue = model->BSIM4v7laigbacc; - return(OK); - case BSIM4v7_MOD_LBIGBACC: - value->rValue = model->BSIM4v7lbigbacc; - return(OK); - case BSIM4v7_MOD_LCIGBACC: - value->rValue = model->BSIM4v7lcigbacc; - return(OK); - case BSIM4v7_MOD_LAIGBINV: - value->rValue = model->BSIM4v7laigbinv; - return(OK); - case BSIM4v7_MOD_LBIGBINV: - value->rValue = model->BSIM4v7lbigbinv; - return(OK); - case BSIM4v7_MOD_LCIGBINV: - value->rValue = model->BSIM4v7lcigbinv; - return(OK); - case BSIM4v7_MOD_LNIGC: - value->rValue = model->BSIM4v7lnigc; - return(OK); - case BSIM4v7_MOD_LNIGBACC: - value->rValue = model->BSIM4v7lnigbacc; - return(OK); - case BSIM4v7_MOD_LNIGBINV: - value->rValue = model->BSIM4v7lnigbinv; - return(OK); - case BSIM4v7_MOD_LNTOX: - value->rValue = model->BSIM4v7lntox; - return(OK); - case BSIM4v7_MOD_LEIGBINV: - value->rValue = model->BSIM4v7leigbinv; - return(OK); - case BSIM4v7_MOD_LPIGCD: - value->rValue = model->BSIM4v7lpigcd; - return(OK); - case BSIM4v7_MOD_LPOXEDGE: - value->rValue = model->BSIM4v7lpoxedge; - return(OK); - case BSIM4v7_MOD_LPHIN: - value->rValue = model->BSIM4v7lphin; - return(OK); - case BSIM4v7_MOD_LXRCRG1: - value->rValue = model->BSIM4v7lxrcrg1; - return(OK); - case BSIM4v7_MOD_LXRCRG2: - value->rValue = model->BSIM4v7lxrcrg2; - return(OK); - case BSIM4v7_MOD_LEU: - value->rValue = model->BSIM4v7leu; - return(OK); - case BSIM4v7_MOD_LUCS: - value->rValue = model->BSIM4v7lucs; - return(OK); - case BSIM4v7_MOD_LVFB: - value->rValue = model->BSIM4v7lvfb; - return(OK); - - case BSIM4v7_MOD_LCGSL: - value->rValue = model->BSIM4v7lcgsl; - return(OK); - case BSIM4v7_MOD_LCGDL: - value->rValue = model->BSIM4v7lcgdl; - return(OK); - case BSIM4v7_MOD_LCKAPPAS: - value->rValue = model->BSIM4v7lckappas; - return(OK); - case BSIM4v7_MOD_LCKAPPAD: - value->rValue = model->BSIM4v7lckappad; - return(OK); - case BSIM4v7_MOD_LCF: - value->rValue = model->BSIM4v7lcf; - return(OK); - case BSIM4v7_MOD_LCLC: - value->rValue = model->BSIM4v7lclc; - return(OK); - case BSIM4v7_MOD_LCLE: - value->rValue = model->BSIM4v7lcle; - return(OK); - case BSIM4v7_MOD_LVFBCV: - value->rValue = model->BSIM4v7lvfbcv; - return(OK); - case BSIM4v7_MOD_LACDE: - value->rValue = model->BSIM4v7lacde; - return(OK); - case BSIM4v7_MOD_LMOIN: - value->rValue = model->BSIM4v7lmoin; - return(OK); - case BSIM4v7_MOD_LNOFF: - value->rValue = model->BSIM4v7lnoff; - return(OK); - case BSIM4v7_MOD_LVOFFCV: - value->rValue = model->BSIM4v7lvoffcv; - return(OK); - case BSIM4v7_MOD_LVFBSDOFF: - value->rValue = model->BSIM4v7lvfbsdoff; - return(OK); - case BSIM4v7_MOD_LTVFBSDOFF: - value->rValue = model->BSIM4v7ltvfbsdoff; - return(OK); - - case BSIM4v7_MOD_LLAMBDA: - value->rValue = model->BSIM4v7llambda; - return(OK); - case BSIM4v7_MOD_LVTL: - value->rValue = model->BSIM4v7lvtl; - return(OK); - case BSIM4v7_MOD_LXN: - value->rValue = model->BSIM4v7lxn; - return(OK); - - /* Width dependence */ - case BSIM4v7_MOD_WCDSC : - value->rValue = model->BSIM4v7wcdsc; - return(OK); - case BSIM4v7_MOD_WCDSCB : - value->rValue = model->BSIM4v7wcdscb; - return(OK); - case BSIM4v7_MOD_WCDSCD : - value->rValue = model->BSIM4v7wcdscd; - return(OK); - case BSIM4v7_MOD_WCIT : - value->rValue = model->BSIM4v7wcit; - return(OK); - case BSIM4v7_MOD_WNFACTOR : - value->rValue = model->BSIM4v7wnfactor; - return(OK); - case BSIM4v7_MOD_WXJ: - value->rValue = model->BSIM4v7wxj; - return(OK); - case BSIM4v7_MOD_WVSAT: - value->rValue = model->BSIM4v7wvsat; - return(OK); - case BSIM4v7_MOD_WAT: - value->rValue = model->BSIM4v7wat; - return(OK); - case BSIM4v7_MOD_WA0: - value->rValue = model->BSIM4v7wa0; - return(OK); - case BSIM4v7_MOD_WAGS: - value->rValue = model->BSIM4v7wags; - return(OK); - case BSIM4v7_MOD_WA1: - value->rValue = model->BSIM4v7wa1; - return(OK); - case BSIM4v7_MOD_WA2: - value->rValue = model->BSIM4v7wa2; - return(OK); - case BSIM4v7_MOD_WKETA: - value->rValue = model->BSIM4v7wketa; - return(OK); - case BSIM4v7_MOD_WNSUB: - value->rValue = model->BSIM4v7wnsub; - return(OK); - case BSIM4v7_MOD_WNDEP: - value->rValue = model->BSIM4v7wndep; - return(OK); - case BSIM4v7_MOD_WNSD: - value->rValue = model->BSIM4v7wnsd; - return(OK); - case BSIM4v7_MOD_WNGATE: - value->rValue = model->BSIM4v7wngate; - return(OK); - case BSIM4v7_MOD_WGAMMA1: - value->rValue = model->BSIM4v7wgamma1; - return(OK); - case BSIM4v7_MOD_WGAMMA2: - value->rValue = model->BSIM4v7wgamma2; - return(OK); - case BSIM4v7_MOD_WVBX: - value->rValue = model->BSIM4v7wvbx; - return(OK); - case BSIM4v7_MOD_WVBM: - value->rValue = model->BSIM4v7wvbm; - return(OK); - case BSIM4v7_MOD_WXT: - value->rValue = model->BSIM4v7wxt; - return(OK); - case BSIM4v7_MOD_WK1: - value->rValue = model->BSIM4v7wk1; - return(OK); - case BSIM4v7_MOD_WKT1: - value->rValue = model->BSIM4v7wkt1; - return(OK); - case BSIM4v7_MOD_WKT1L: - value->rValue = model->BSIM4v7wkt1l; - return(OK); - case BSIM4v7_MOD_WKT2 : - value->rValue = model->BSIM4v7wkt2; - return(OK); - case BSIM4v7_MOD_WK2 : - value->rValue = model->BSIM4v7wk2; - return(OK); - case BSIM4v7_MOD_WK3: - value->rValue = model->BSIM4v7wk3; - return(OK); - case BSIM4v7_MOD_WK3B: - value->rValue = model->BSIM4v7wk3b; - return(OK); - case BSIM4v7_MOD_WW0: - value->rValue = model->BSIM4v7ww0; - return(OK); - case BSIM4v7_MOD_WLPE0: - value->rValue = model->BSIM4v7wlpe0; - return(OK); - case BSIM4v7_MOD_WDVTP0: - value->rValue = model->BSIM4v7wdvtp0; - return(OK); - case BSIM4v7_MOD_WDVTP1: - value->rValue = model->BSIM4v7wdvtp1; - return(OK); - case BSIM4v7_MOD_WDVTP2: - value->rValue = model->BSIM4v7wdvtp2; /* New DIBL/Rout */ - return(OK); - case BSIM4v7_MOD_WDVTP3: - value->rValue = model->BSIM4v7wdvtp3; - return(OK); - case BSIM4v7_MOD_WDVTP4: - value->rValue = model->BSIM4v7wdvtp4; - return(OK); - case BSIM4v7_MOD_WDVTP5: - value->rValue = model->BSIM4v7wdvtp5; - return(OK); - case BSIM4v7_MOD_WLPEB: - value->rValue = model->BSIM4v7wlpeb; - return(OK); - case BSIM4v7_MOD_WDVT0: - value->rValue = model->BSIM4v7wdvt0; - return(OK); - case BSIM4v7_MOD_WDVT1 : - value->rValue = model->BSIM4v7wdvt1; - return(OK); - case BSIM4v7_MOD_WDVT2 : - value->rValue = model->BSIM4v7wdvt2; - return(OK); - case BSIM4v7_MOD_WDVT0W : - value->rValue = model->BSIM4v7wdvt0w; - return(OK); - case BSIM4v7_MOD_WDVT1W : - value->rValue = model->BSIM4v7wdvt1w; - return(OK); - case BSIM4v7_MOD_WDVT2W : - value->rValue = model->BSIM4v7wdvt2w; - return(OK); - case BSIM4v7_MOD_WDROUT : - value->rValue = model->BSIM4v7wdrout; - return(OK); - case BSIM4v7_MOD_WDSUB : - value->rValue = model->BSIM4v7wdsub; - return(OK); - case BSIM4v7_MOD_WVTH0: - value->rValue = model->BSIM4v7wvth0; - return(OK); - case BSIM4v7_MOD_WUA: - value->rValue = model->BSIM4v7wua; - return(OK); - case BSIM4v7_MOD_WUA1: - value->rValue = model->BSIM4v7wua1; - return(OK); - case BSIM4v7_MOD_WUB: - value->rValue = model->BSIM4v7wub; - return(OK); - case BSIM4v7_MOD_WUB1: - value->rValue = model->BSIM4v7wub1; - return(OK); - case BSIM4v7_MOD_WUC: - value->rValue = model->BSIM4v7wuc; - return(OK); - case BSIM4v7_MOD_WUC1: - value->rValue = model->BSIM4v7wuc1; - return(OK); - case BSIM4v7_MOD_WUD: - value->rValue = model->BSIM4v7wud; - return(OK); - case BSIM4v7_MOD_WUD1: - value->rValue = model->BSIM4v7wud1; - return(OK); - case BSIM4v7_MOD_WUP: - value->rValue = model->BSIM4v7wup; - return(OK); - case BSIM4v7_MOD_WLP: - value->rValue = model->BSIM4v7wlp; - return(OK); - case BSIM4v7_MOD_WU0: - value->rValue = model->BSIM4v7wu0; - return(OK); - case BSIM4v7_MOD_WUTE: - value->rValue = model->BSIM4v7wute; - return(OK); - case BSIM4v7_MOD_WUCSTE: - value->rValue = model->BSIM4v7wucste; - return(OK); - case BSIM4v7_MOD_WVOFF: - value->rValue = model->BSIM4v7wvoff; - return(OK); - case BSIM4v7_MOD_WTVOFF: - value->rValue = model->BSIM4v7wtvoff; - return(OK); - case BSIM4v7_MOD_WTNFACTOR: /* v4.7 temp dep of leakage current */ - value->rValue = model->BSIM4v7wtnfactor; - return(OK); - case BSIM4v7_MOD_WTETA0: /* v4.7 temp dep of leakage current */ - value->rValue = model->BSIM4v7wteta0; - return(OK); - case BSIM4v7_MOD_WTVOFFCV: /* v4.7 temp dep of leakage current */ - value->rValue = model->BSIM4v7wtvoffcv; - return(OK); - case BSIM4v7_MOD_WMINV: - value->rValue = model->BSIM4v7wminv; - return(OK); - case BSIM4v7_MOD_WMINVCV: - value->rValue = model->BSIM4v7wminvcv; - return(OK); - case BSIM4v7_MOD_WFPROUT: - value->rValue = model->BSIM4v7wfprout; - return(OK); - case BSIM4v7_MOD_WPDITS: - value->rValue = model->BSIM4v7wpdits; - return(OK); - case BSIM4v7_MOD_WPDITSD: - value->rValue = model->BSIM4v7wpditsd; - return(OK); - case BSIM4v7_MOD_WDELTA: - value->rValue = model->BSIM4v7wdelta; - return(OK); - case BSIM4v7_MOD_WRDSW: - value->rValue = model->BSIM4v7wrdsw; - return(OK); - case BSIM4v7_MOD_WRDW: - value->rValue = model->BSIM4v7wrdw; - return(OK); - case BSIM4v7_MOD_WRSW: - value->rValue = model->BSIM4v7wrsw; - return(OK); - case BSIM4v7_MOD_WPRWB: - value->rValue = model->BSIM4v7wprwb; - return(OK); - case BSIM4v7_MOD_WPRWG: - value->rValue = model->BSIM4v7wprwg; - return(OK); - case BSIM4v7_MOD_WPRT: - value->rValue = model->BSIM4v7wprt; - return(OK); - case BSIM4v7_MOD_WETA0: - value->rValue = model->BSIM4v7weta0; - return(OK); - case BSIM4v7_MOD_WETAB: - value->rValue = model->BSIM4v7wetab; - return(OK); - case BSIM4v7_MOD_WPCLM: - value->rValue = model->BSIM4v7wpclm; - return(OK); - case BSIM4v7_MOD_WPDIBL1: - value->rValue = model->BSIM4v7wpdibl1; - return(OK); - case BSIM4v7_MOD_WPDIBL2: - value->rValue = model->BSIM4v7wpdibl2; - return(OK); - case BSIM4v7_MOD_WPDIBLB: - value->rValue = model->BSIM4v7wpdiblb; - return(OK); - case BSIM4v7_MOD_WPSCBE1: - value->rValue = model->BSIM4v7wpscbe1; - return(OK); - case BSIM4v7_MOD_WPSCBE2: - value->rValue = model->BSIM4v7wpscbe2; - return(OK); - case BSIM4v7_MOD_WPVAG: - value->rValue = model->BSIM4v7wpvag; - return(OK); - case BSIM4v7_MOD_WWR: - value->rValue = model->BSIM4v7wwr; - return(OK); - case BSIM4v7_MOD_WDWG: - value->rValue = model->BSIM4v7wdwg; - return(OK); - case BSIM4v7_MOD_WDWB: - value->rValue = model->BSIM4v7wdwb; - return(OK); - case BSIM4v7_MOD_WB0: - value->rValue = model->BSIM4v7wb0; - return(OK); - case BSIM4v7_MOD_WB1: - value->rValue = model->BSIM4v7wb1; - return(OK); - case BSIM4v7_MOD_WALPHA0: - value->rValue = model->BSIM4v7walpha0; - return(OK); - case BSIM4v7_MOD_WALPHA1: - value->rValue = model->BSIM4v7walpha1; - return(OK); - case BSIM4v7_MOD_WBETA0: - value->rValue = model->BSIM4v7wbeta0; - return(OK); - case BSIM4v7_MOD_WAGIDL: - value->rValue = model->BSIM4v7wagidl; - return(OK); - case BSIM4v7_MOD_WBGIDL: - value->rValue = model->BSIM4v7wbgidl; - return(OK); - case BSIM4v7_MOD_WCGIDL: - value->rValue = model->BSIM4v7wcgidl; - return(OK); - case BSIM4v7_MOD_WEGIDL: - value->rValue = model->BSIM4v7wegidl; - return(OK); - case BSIM4v7_MOD_WFGIDL: /* v4.7 New GIDL/GISL*/ - value->rValue = model->BSIM4v7wfgidl; - return(OK); - case BSIM4v7_MOD_WKGIDL: /* v4.7 New GIDL/GISL*/ - value->rValue = model->BSIM4v7wkgidl; - return(OK); - case BSIM4v7_MOD_WRGIDL: /* v4.7 New GIDL/GISL*/ - value->rValue = model->BSIM4v7wrgidl; - return(OK); - case BSIM4v7_MOD_WAGISL: - value->rValue = model->BSIM4v7wagisl; - return(OK); - case BSIM4v7_MOD_WBGISL: - value->rValue = model->BSIM4v7wbgisl; - return(OK); - case BSIM4v7_MOD_WCGISL: - value->rValue = model->BSIM4v7wcgisl; - return(OK); - case BSIM4v7_MOD_WEGISL: - value->rValue = model->BSIM4v7wegisl; - return(OK); - case BSIM4v7_MOD_WFGISL: /* v4.7 New GIDL/GISL*/ - value->rValue = model->BSIM4v7wfgisl; - return(OK); - case BSIM4v7_MOD_WKGISL: /* v4.7 New GIDL/GISL*/ - value->rValue = model->BSIM4v7wkgisl; - return(OK); - case BSIM4v7_MOD_WRGISL: /* v4.7 New GIDL/GISL*/ - value->rValue = model->BSIM4v7wrgisl; - return(OK); - case BSIM4v7_MOD_WAIGC: - value->rValue = model->BSIM4v7waigc; - return(OK); - case BSIM4v7_MOD_WBIGC: - value->rValue = model->BSIM4v7wbigc; - return(OK); - case BSIM4v7_MOD_WCIGC: - value->rValue = model->BSIM4v7wcigc; - return(OK); - case BSIM4v7_MOD_WAIGSD: - value->rValue = model->BSIM4v7waigsd; - return(OK); - case BSIM4v7_MOD_WBIGSD: - value->rValue = model->BSIM4v7wbigsd; - return(OK); - case BSIM4v7_MOD_WCIGSD: - value->rValue = model->BSIM4v7wcigsd; - return(OK); - case BSIM4v7_MOD_WAIGS: - value->rValue = model->BSIM4v7waigs; - return(OK); - case BSIM4v7_MOD_WBIGS: - value->rValue = model->BSIM4v7wbigs; - return(OK); - case BSIM4v7_MOD_WCIGS: - value->rValue = model->BSIM4v7wcigs; - return(OK); - case BSIM4v7_MOD_WAIGD: - value->rValue = model->BSIM4v7waigd; - return(OK); - case BSIM4v7_MOD_WBIGD: - value->rValue = model->BSIM4v7wbigd; - return(OK); - case BSIM4v7_MOD_WCIGD: - value->rValue = model->BSIM4v7wcigd; - return(OK); - case BSIM4v7_MOD_WAIGBACC: - value->rValue = model->BSIM4v7waigbacc; - return(OK); - case BSIM4v7_MOD_WBIGBACC: - value->rValue = model->BSIM4v7wbigbacc; - return(OK); - case BSIM4v7_MOD_WCIGBACC: - value->rValue = model->BSIM4v7wcigbacc; - return(OK); - case BSIM4v7_MOD_WAIGBINV: - value->rValue = model->BSIM4v7waigbinv; - return(OK); - case BSIM4v7_MOD_WBIGBINV: - value->rValue = model->BSIM4v7wbigbinv; - return(OK); - case BSIM4v7_MOD_WCIGBINV: - value->rValue = model->BSIM4v7wcigbinv; - return(OK); - case BSIM4v7_MOD_WNIGC: - value->rValue = model->BSIM4v7wnigc; - return(OK); - case BSIM4v7_MOD_WNIGBACC: - value->rValue = model->BSIM4v7wnigbacc; - return(OK); - case BSIM4v7_MOD_WNIGBINV: - value->rValue = model->BSIM4v7wnigbinv; - return(OK); - case BSIM4v7_MOD_WNTOX: - value->rValue = model->BSIM4v7wntox; - return(OK); - case BSIM4v7_MOD_WEIGBINV: - value->rValue = model->BSIM4v7weigbinv; - return(OK); - case BSIM4v7_MOD_WPIGCD: - value->rValue = model->BSIM4v7wpigcd; - return(OK); - case BSIM4v7_MOD_WPOXEDGE: - value->rValue = model->BSIM4v7wpoxedge; - return(OK); - case BSIM4v7_MOD_WPHIN: - value->rValue = model->BSIM4v7wphin; - return(OK); - case BSIM4v7_MOD_WXRCRG1: - value->rValue = model->BSIM4v7wxrcrg1; - return(OK); - case BSIM4v7_MOD_WXRCRG2: - value->rValue = model->BSIM4v7wxrcrg2; - return(OK); - case BSIM4v7_MOD_WEU: - value->rValue = model->BSIM4v7weu; - return(OK); - case BSIM4v7_MOD_WUCS: - value->rValue = model->BSIM4v7wucs; - return(OK); - case BSIM4v7_MOD_WVFB: - value->rValue = model->BSIM4v7wvfb; - return(OK); - - case BSIM4v7_MOD_WCGSL: - value->rValue = model->BSIM4v7wcgsl; - return(OK); - case BSIM4v7_MOD_WCGDL: - value->rValue = model->BSIM4v7wcgdl; - return(OK); - case BSIM4v7_MOD_WCKAPPAS: - value->rValue = model->BSIM4v7wckappas; - return(OK); - case BSIM4v7_MOD_WCKAPPAD: - value->rValue = model->BSIM4v7wckappad; - return(OK); - case BSIM4v7_MOD_WCF: - value->rValue = model->BSIM4v7wcf; - return(OK); - case BSIM4v7_MOD_WCLC: - value->rValue = model->BSIM4v7wclc; - return(OK); - case BSIM4v7_MOD_WCLE: - value->rValue = model->BSIM4v7wcle; - return(OK); - case BSIM4v7_MOD_WVFBCV: - value->rValue = model->BSIM4v7wvfbcv; - return(OK); - case BSIM4v7_MOD_WACDE: - value->rValue = model->BSIM4v7wacde; - return(OK); - case BSIM4v7_MOD_WMOIN: - value->rValue = model->BSIM4v7wmoin; - return(OK); - case BSIM4v7_MOD_WNOFF: - value->rValue = model->BSIM4v7wnoff; - return(OK); - case BSIM4v7_MOD_WVOFFCV: - value->rValue = model->BSIM4v7wvoffcv; - return(OK); - case BSIM4v7_MOD_WVFBSDOFF: - value->rValue = model->BSIM4v7wvfbsdoff; - return(OK); - case BSIM4v7_MOD_WTVFBSDOFF: - value->rValue = model->BSIM4v7wtvfbsdoff; - return(OK); - - case BSIM4v7_MOD_WLAMBDA: - value->rValue = model->BSIM4v7wlambda; - return(OK); - case BSIM4v7_MOD_WVTL: - value->rValue = model->BSIM4v7wvtl; - return(OK); - case BSIM4v7_MOD_WXN: - value->rValue = model->BSIM4v7wxn; - return(OK); - - /* Cross-term dependence */ - case BSIM4v7_MOD_PCDSC : - value->rValue = model->BSIM4v7pcdsc; - return(OK); - case BSIM4v7_MOD_PCDSCB : - value->rValue = model->BSIM4v7pcdscb; - return(OK); - case BSIM4v7_MOD_PCDSCD : - value->rValue = model->BSIM4v7pcdscd; - return(OK); - case BSIM4v7_MOD_PCIT : - value->rValue = model->BSIM4v7pcit; - return(OK); - case BSIM4v7_MOD_PNFACTOR : - value->rValue = model->BSIM4v7pnfactor; - return(OK); - case BSIM4v7_MOD_PXJ: - value->rValue = model->BSIM4v7pxj; - return(OK); - case BSIM4v7_MOD_PVSAT: - value->rValue = model->BSIM4v7pvsat; - return(OK); - case BSIM4v7_MOD_PAT: - value->rValue = model->BSIM4v7pat; - return(OK); - case BSIM4v7_MOD_PA0: - value->rValue = model->BSIM4v7pa0; - return(OK); - case BSIM4v7_MOD_PAGS: - value->rValue = model->BSIM4v7pags; - return(OK); - case BSIM4v7_MOD_PA1: - value->rValue = model->BSIM4v7pa1; - return(OK); - case BSIM4v7_MOD_PA2: - value->rValue = model->BSIM4v7pa2; - return(OK); - case BSIM4v7_MOD_PKETA: - value->rValue = model->BSIM4v7pketa; - return(OK); - case BSIM4v7_MOD_PNSUB: - value->rValue = model->BSIM4v7pnsub; - return(OK); - case BSIM4v7_MOD_PNDEP: - value->rValue = model->BSIM4v7pndep; - return(OK); - case BSIM4v7_MOD_PNSD: - value->rValue = model->BSIM4v7pnsd; - return(OK); - case BSIM4v7_MOD_PNGATE: - value->rValue = model->BSIM4v7pngate; - return(OK); - case BSIM4v7_MOD_PGAMMA1: - value->rValue = model->BSIM4v7pgamma1; - return(OK); - case BSIM4v7_MOD_PGAMMA2: - value->rValue = model->BSIM4v7pgamma2; - return(OK); - case BSIM4v7_MOD_PVBX: - value->rValue = model->BSIM4v7pvbx; - return(OK); - case BSIM4v7_MOD_PVBM: - value->rValue = model->BSIM4v7pvbm; - return(OK); - case BSIM4v7_MOD_PXT: - value->rValue = model->BSIM4v7pxt; - return(OK); - case BSIM4v7_MOD_PK1: - value->rValue = model->BSIM4v7pk1; - return(OK); - case BSIM4v7_MOD_PKT1: - value->rValue = model->BSIM4v7pkt1; - return(OK); - case BSIM4v7_MOD_PKT1L: - value->rValue = model->BSIM4v7pkt1l; - return(OK); - case BSIM4v7_MOD_PKT2 : - value->rValue = model->BSIM4v7pkt2; - return(OK); - case BSIM4v7_MOD_PK2 : - value->rValue = model->BSIM4v7pk2; - return(OK); - case BSIM4v7_MOD_PK3: - value->rValue = model->BSIM4v7pk3; - return(OK); - case BSIM4v7_MOD_PK3B: - value->rValue = model->BSIM4v7pk3b; - return(OK); - case BSIM4v7_MOD_PW0: - value->rValue = model->BSIM4v7pw0; - return(OK); - case BSIM4v7_MOD_PLPE0: - value->rValue = model->BSIM4v7plpe0; - return(OK); - case BSIM4v7_MOD_PLPEB: - value->rValue = model->BSIM4v7plpeb; - return(OK); - case BSIM4v7_MOD_PDVTP0: - value->rValue = model->BSIM4v7pdvtp0; - return(OK); - case BSIM4v7_MOD_PDVTP1: - value->rValue = model->BSIM4v7pdvtp1; - return(OK); - case BSIM4v7_MOD_PDVTP2: - value->rValue = model->BSIM4v7pdvtp2; /* New DIBL/Rout */ - return(OK); - case BSIM4v7_MOD_PDVTP3: - value->rValue = model->BSIM4v7pdvtp3; - return(OK); - case BSIM4v7_MOD_PDVTP4: - value->rValue = model->BSIM4v7pdvtp4; - return(OK); - case BSIM4v7_MOD_PDVTP5: - value->rValue = model->BSIM4v7pdvtp5; - return(OK); - case BSIM4v7_MOD_PDVT0 : - value->rValue = model->BSIM4v7pdvt0; - return(OK); - case BSIM4v7_MOD_PDVT1 : - value->rValue = model->BSIM4v7pdvt1; - return(OK); - case BSIM4v7_MOD_PDVT2 : - value->rValue = model->BSIM4v7pdvt2; - return(OK); - case BSIM4v7_MOD_PDVT0W : - value->rValue = model->BSIM4v7pdvt0w; - return(OK); - case BSIM4v7_MOD_PDVT1W : - value->rValue = model->BSIM4v7pdvt1w; - return(OK); - case BSIM4v7_MOD_PDVT2W : - value->rValue = model->BSIM4v7pdvt2w; - return(OK); - case BSIM4v7_MOD_PDROUT : - value->rValue = model->BSIM4v7pdrout; - return(OK); - case BSIM4v7_MOD_PDSUB : - value->rValue = model->BSIM4v7pdsub; - return(OK); - case BSIM4v7_MOD_PVTH0: - value->rValue = model->BSIM4v7pvth0; - return(OK); - case BSIM4v7_MOD_PUA: - value->rValue = model->BSIM4v7pua; - return(OK); - case BSIM4v7_MOD_PUA1: - value->rValue = model->BSIM4v7pua1; - return(OK); - case BSIM4v7_MOD_PUB: - value->rValue = model->BSIM4v7pub; - return(OK); - case BSIM4v7_MOD_PUB1: - value->rValue = model->BSIM4v7pub1; - return(OK); - case BSIM4v7_MOD_PUC: - value->rValue = model->BSIM4v7puc; - return(OK); - case BSIM4v7_MOD_PUC1: - value->rValue = model->BSIM4v7puc1; - return(OK); - case BSIM4v7_MOD_PUD: - value->rValue = model->BSIM4v7pud; - return(OK); - case BSIM4v7_MOD_PUD1: - value->rValue = model->BSIM4v7pud1; - return(OK); - case BSIM4v7_MOD_PUP: - value->rValue = model->BSIM4v7pup; - return(OK); - case BSIM4v7_MOD_PLP: - value->rValue = model->BSIM4v7plp; - return(OK); - case BSIM4v7_MOD_PU0: - value->rValue = model->BSIM4v7pu0; - return(OK); - case BSIM4v7_MOD_PUTE: - value->rValue = model->BSIM4v7pute; - return(OK); - case BSIM4v7_MOD_PUCSTE: - value->rValue = model->BSIM4v7pucste; - return(OK); - case BSIM4v7_MOD_PVOFF: - value->rValue = model->BSIM4v7pvoff; - return(OK); - case BSIM4v7_MOD_PTVOFF: - value->rValue = model->BSIM4v7ptvoff; - return(OK); - case BSIM4v7_MOD_PTNFACTOR: /* v4.7 temp dep of leakage current */ - value->rValue = model->BSIM4v7ptnfactor; - return(OK); - case BSIM4v7_MOD_PTETA0: /* v4.7 temp dep of leakage current */ - value->rValue = model->BSIM4v7pteta0; - return(OK); - case BSIM4v7_MOD_PTVOFFCV: /* v4.7 temp dep of leakage current */ - value->rValue = model->BSIM4v7ptvoffcv; - return(OK); - case BSIM4v7_MOD_PMINV: - value->rValue = model->BSIM4v7pminv; - return(OK); - case BSIM4v7_MOD_PMINVCV: - value->rValue = model->BSIM4v7pminvcv; - return(OK); - case BSIM4v7_MOD_PFPROUT: - value->rValue = model->BSIM4v7pfprout; - return(OK); - case BSIM4v7_MOD_PPDITS: - value->rValue = model->BSIM4v7ppdits; - return(OK); - case BSIM4v7_MOD_PPDITSD: - value->rValue = model->BSIM4v7ppditsd; - return(OK); - case BSIM4v7_MOD_PDELTA: - value->rValue = model->BSIM4v7pdelta; - return(OK); - case BSIM4v7_MOD_PRDSW: - value->rValue = model->BSIM4v7prdsw; - return(OK); - case BSIM4v7_MOD_PRDW: - value->rValue = model->BSIM4v7prdw; - return(OK); - case BSIM4v7_MOD_PRSW: - value->rValue = model->BSIM4v7prsw; - return(OK); - case BSIM4v7_MOD_PPRWB: - value->rValue = model->BSIM4v7pprwb; - return(OK); - case BSIM4v7_MOD_PPRWG: - value->rValue = model->BSIM4v7pprwg; - return(OK); - case BSIM4v7_MOD_PPRT: - value->rValue = model->BSIM4v7pprt; - return(OK); - case BSIM4v7_MOD_PETA0: - value->rValue = model->BSIM4v7peta0; - return(OK); - case BSIM4v7_MOD_PETAB: - value->rValue = model->BSIM4v7petab; - return(OK); - case BSIM4v7_MOD_PPCLM: - value->rValue = model->BSIM4v7ppclm; - return(OK); - case BSIM4v7_MOD_PPDIBL1: - value->rValue = model->BSIM4v7ppdibl1; - return(OK); - case BSIM4v7_MOD_PPDIBL2: - value->rValue = model->BSIM4v7ppdibl2; - return(OK); - case BSIM4v7_MOD_PPDIBLB: - value->rValue = model->BSIM4v7ppdiblb; - return(OK); - case BSIM4v7_MOD_PPSCBE1: - value->rValue = model->BSIM4v7ppscbe1; - return(OK); - case BSIM4v7_MOD_PPSCBE2: - value->rValue = model->BSIM4v7ppscbe2; - return(OK); - case BSIM4v7_MOD_PPVAG: - value->rValue = model->BSIM4v7ppvag; - return(OK); - case BSIM4v7_MOD_PWR: - value->rValue = model->BSIM4v7pwr; - return(OK); - case BSIM4v7_MOD_PDWG: - value->rValue = model->BSIM4v7pdwg; - return(OK); - case BSIM4v7_MOD_PDWB: - value->rValue = model->BSIM4v7pdwb; - return(OK); - case BSIM4v7_MOD_PB0: - value->rValue = model->BSIM4v7pb0; - return(OK); - case BSIM4v7_MOD_PB1: - value->rValue = model->BSIM4v7pb1; - return(OK); - case BSIM4v7_MOD_PALPHA0: - value->rValue = model->BSIM4v7palpha0; - return(OK); - case BSIM4v7_MOD_PALPHA1: - value->rValue = model->BSIM4v7palpha1; - return(OK); - case BSIM4v7_MOD_PBETA0: - value->rValue = model->BSIM4v7pbeta0; - return(OK); - case BSIM4v7_MOD_PAGIDL: - value->rValue = model->BSIM4v7pagidl; - return(OK); - case BSIM4v7_MOD_PBGIDL: - value->rValue = model->BSIM4v7pbgidl; - return(OK); - case BSIM4v7_MOD_PCGIDL: - value->rValue = model->BSIM4v7pcgidl; - return(OK); - case BSIM4v7_MOD_PEGIDL: - value->rValue = model->BSIM4v7pegidl; - return(OK); - case BSIM4v7_MOD_PFGIDL: /* v4.7 New GIDL/GISL*/ - value->rValue = model->BSIM4v7pfgidl; - return(OK); - case BSIM4v7_MOD_PKGIDL: /* v4.7 New GIDL/GISL*/ - value->rValue = model->BSIM4v7pkgidl; - return(OK); - case BSIM4v7_MOD_PRGIDL: /* v4.7 New GIDL/GISL*/ - value->rValue = model->BSIM4v7prgidl; - return(OK); - case BSIM4v7_MOD_PAGISL: - value->rValue = model->BSIM4v7pagisl; - return(OK); - case BSIM4v7_MOD_PBGISL: - value->rValue = model->BSIM4v7pbgisl; - return(OK); - case BSIM4v7_MOD_PCGISL: - value->rValue = model->BSIM4v7pcgisl; - return(OK); - case BSIM4v7_MOD_PEGISL: - value->rValue = model->BSIM4v7pegisl; - return(OK); - case BSIM4v7_MOD_PFGISL: /* v4.7 New GIDL/GISL*/ - value->rValue = model->BSIM4v7pfgisl; - return(OK); - case BSIM4v7_MOD_PKGISL: /* v4.7 New GIDL/GISL*/ - value->rValue = model->BSIM4v7pkgisl; - return(OK); - case BSIM4v7_MOD_PRGISL: /* v4.7 New GIDL/GISL*/ - value->rValue = model->BSIM4v7prgisl; - return(OK); - case BSIM4v7_MOD_PAIGC: - value->rValue = model->BSIM4v7paigc; - return(OK); - case BSIM4v7_MOD_PBIGC: - value->rValue = model->BSIM4v7pbigc; - return(OK); - case BSIM4v7_MOD_PCIGC: - value->rValue = model->BSIM4v7pcigc; - return(OK); - case BSIM4v7_MOD_PAIGSD: - value->rValue = model->BSIM4v7paigsd; - return(OK); - case BSIM4v7_MOD_PBIGSD: - value->rValue = model->BSIM4v7pbigsd; - return(OK); - case BSIM4v7_MOD_PCIGSD: - value->rValue = model->BSIM4v7pcigsd; - return(OK); - case BSIM4v7_MOD_PAIGS: - value->rValue = model->BSIM4v7paigs; - return(OK); - case BSIM4v7_MOD_PBIGS: - value->rValue = model->BSIM4v7pbigs; - return(OK); - case BSIM4v7_MOD_PCIGS: - value->rValue = model->BSIM4v7pcigs; - return(OK); - case BSIM4v7_MOD_PAIGD: - value->rValue = model->BSIM4v7paigd; - return(OK); - case BSIM4v7_MOD_PBIGD: - value->rValue = model->BSIM4v7pbigd; - return(OK); - case BSIM4v7_MOD_PCIGD: - value->rValue = model->BSIM4v7pcigd; - return(OK); - case BSIM4v7_MOD_PAIGBACC: - value->rValue = model->BSIM4v7paigbacc; - return(OK); - case BSIM4v7_MOD_PBIGBACC: - value->rValue = model->BSIM4v7pbigbacc; - return(OK); - case BSIM4v7_MOD_PCIGBACC: - value->rValue = model->BSIM4v7pcigbacc; - return(OK); - case BSIM4v7_MOD_PAIGBINV: - value->rValue = model->BSIM4v7paigbinv; - return(OK); - case BSIM4v7_MOD_PBIGBINV: - value->rValue = model->BSIM4v7pbigbinv; - return(OK); - case BSIM4v7_MOD_PCIGBINV: - value->rValue = model->BSIM4v7pcigbinv; - return(OK); - case BSIM4v7_MOD_PNIGC: - value->rValue = model->BSIM4v7pnigc; - return(OK); - case BSIM4v7_MOD_PNIGBACC: - value->rValue = model->BSIM4v7pnigbacc; - return(OK); - case BSIM4v7_MOD_PNIGBINV: - value->rValue = model->BSIM4v7pnigbinv; - return(OK); - case BSIM4v7_MOD_PNTOX: - value->rValue = model->BSIM4v7pntox; - return(OK); - case BSIM4v7_MOD_PEIGBINV: - value->rValue = model->BSIM4v7peigbinv; - return(OK); - case BSIM4v7_MOD_PPIGCD: - value->rValue = model->BSIM4v7ppigcd; - return(OK); - case BSIM4v7_MOD_PPOXEDGE: - value->rValue = model->BSIM4v7ppoxedge; - return(OK); - case BSIM4v7_MOD_PPHIN: - value->rValue = model->BSIM4v7pphin; - return(OK); - case BSIM4v7_MOD_PXRCRG1: - value->rValue = model->BSIM4v7pxrcrg1; - return(OK); - case BSIM4v7_MOD_PXRCRG2: - value->rValue = model->BSIM4v7pxrcrg2; - return(OK); - case BSIM4v7_MOD_PEU: - value->rValue = model->BSIM4v7peu; - return(OK); - case BSIM4v7_MOD_PUCS: - value->rValue = model->BSIM4v7pucs; - return(OK); - case BSIM4v7_MOD_PVFB: - value->rValue = model->BSIM4v7pvfb; - return(OK); - - case BSIM4v7_MOD_PCGSL: - value->rValue = model->BSIM4v7pcgsl; - return(OK); - case BSIM4v7_MOD_PCGDL: - value->rValue = model->BSIM4v7pcgdl; - return(OK); - case BSIM4v7_MOD_PCKAPPAS: - value->rValue = model->BSIM4v7pckappas; - return(OK); - case BSIM4v7_MOD_PCKAPPAD: - value->rValue = model->BSIM4v7pckappad; - return(OK); - case BSIM4v7_MOD_PCF: - value->rValue = model->BSIM4v7pcf; - return(OK); - case BSIM4v7_MOD_PCLC: - value->rValue = model->BSIM4v7pclc; - return(OK); - case BSIM4v7_MOD_PCLE: - value->rValue = model->BSIM4v7pcle; - return(OK); - case BSIM4v7_MOD_PVFBCV: - value->rValue = model->BSIM4v7pvfbcv; - return(OK); - case BSIM4v7_MOD_PACDE: - value->rValue = model->BSIM4v7pacde; - return(OK); - case BSIM4v7_MOD_PMOIN: - value->rValue = model->BSIM4v7pmoin; - return(OK); - case BSIM4v7_MOD_PNOFF: - value->rValue = model->BSIM4v7pnoff; - return(OK); - case BSIM4v7_MOD_PVOFFCV: - value->rValue = model->BSIM4v7pvoffcv; - return(OK); - case BSIM4v7_MOD_PVFBSDOFF: - value->rValue = model->BSIM4v7pvfbsdoff; - return(OK); - case BSIM4v7_MOD_PTVFBSDOFF: - value->rValue = model->BSIM4v7ptvfbsdoff; - return(OK); - - case BSIM4v7_MOD_PLAMBDA: - value->rValue = model->BSIM4v7plambda; - return(OK); - case BSIM4v7_MOD_PVTL: - value->rValue = model->BSIM4v7pvtl; - return(OK); - case BSIM4v7_MOD_PXN: - value->rValue = model->BSIM4v7pxn; - return(OK); - - case BSIM4v7_MOD_TNOM : - value->rValue = model->BSIM4v7tnom; - return(OK); - case BSIM4v7_MOD_CGSO: - value->rValue = model->BSIM4v7cgso; - return(OK); - case BSIM4v7_MOD_CGDO: - value->rValue = model->BSIM4v7cgdo; - return(OK); - case BSIM4v7_MOD_CGBO: - value->rValue = model->BSIM4v7cgbo; - return(OK); - case BSIM4v7_MOD_XPART: - value->rValue = model->BSIM4v7xpart; - return(OK); - case BSIM4v7_MOD_RSH: - value->rValue = model->BSIM4v7sheetResistance; - return(OK); - case BSIM4v7_MOD_JSS: - value->rValue = model->BSIM4v7SjctSatCurDensity; - return(OK); - case BSIM4v7_MOD_JSWS: - value->rValue = model->BSIM4v7SjctSidewallSatCurDensity; - return(OK); - case BSIM4v7_MOD_JSWGS: - value->rValue = model->BSIM4v7SjctGateSidewallSatCurDensity; - return(OK); - case BSIM4v7_MOD_PBS: - value->rValue = model->BSIM4v7SbulkJctPotential; - return(OK); - case BSIM4v7_MOD_MJS: - value->rValue = model->BSIM4v7SbulkJctBotGradingCoeff; - return(OK); - case BSIM4v7_MOD_PBSWS: - value->rValue = model->BSIM4v7SsidewallJctPotential; - return(OK); - case BSIM4v7_MOD_MJSWS: - value->rValue = model->BSIM4v7SbulkJctSideGradingCoeff; - return(OK); - case BSIM4v7_MOD_CJS: - value->rValue = model->BSIM4v7SunitAreaJctCap; - return(OK); - case BSIM4v7_MOD_CJSWS: - value->rValue = model->BSIM4v7SunitLengthSidewallJctCap; - return(OK); - case BSIM4v7_MOD_PBSWGS: - value->rValue = model->BSIM4v7SGatesidewallJctPotential; - return(OK); - case BSIM4v7_MOD_MJSWGS: - value->rValue = model->BSIM4v7SbulkJctGateSideGradingCoeff; - return(OK); - case BSIM4v7_MOD_CJSWGS: - value->rValue = model->BSIM4v7SunitLengthGateSidewallJctCap; - return(OK); - case BSIM4v7_MOD_NJS: - value->rValue = model->BSIM4v7SjctEmissionCoeff; - return(OK); - case BSIM4v7_MOD_XTIS: - value->rValue = model->BSIM4v7SjctTempExponent; - return(OK); - case BSIM4v7_MOD_JSD: - value->rValue = model->BSIM4v7DjctSatCurDensity; - return(OK); - case BSIM4v7_MOD_JSWD: - value->rValue = model->BSIM4v7DjctSidewallSatCurDensity; - return(OK); - case BSIM4v7_MOD_JSWGD: - value->rValue = model->BSIM4v7DjctGateSidewallSatCurDensity; - return(OK); - case BSIM4v7_MOD_PBD: - value->rValue = model->BSIM4v7DbulkJctPotential; - return(OK); - case BSIM4v7_MOD_MJD: - value->rValue = model->BSIM4v7DbulkJctBotGradingCoeff; - return(OK); - case BSIM4v7_MOD_PBSWD: - value->rValue = model->BSIM4v7DsidewallJctPotential; - return(OK); - case BSIM4v7_MOD_MJSWD: - value->rValue = model->BSIM4v7DbulkJctSideGradingCoeff; - return(OK); - case BSIM4v7_MOD_CJD: - value->rValue = model->BSIM4v7DunitAreaJctCap; - return(OK); - case BSIM4v7_MOD_CJSWD: - value->rValue = model->BSIM4v7DunitLengthSidewallJctCap; - return(OK); - case BSIM4v7_MOD_PBSWGD: - value->rValue = model->BSIM4v7DGatesidewallJctPotential; - return(OK); - case BSIM4v7_MOD_MJSWGD: - value->rValue = model->BSIM4v7DbulkJctGateSideGradingCoeff; - return(OK); - case BSIM4v7_MOD_CJSWGD: - value->rValue = model->BSIM4v7DunitLengthGateSidewallJctCap; - return(OK); - case BSIM4v7_MOD_NJD: - value->rValue = model->BSIM4v7DjctEmissionCoeff; - return(OK); - case BSIM4v7_MOD_XTID: - value->rValue = model->BSIM4v7DjctTempExponent; - return(OK); - case BSIM4v7_MOD_LINTNOI: - value->rValue = model->BSIM4v7lintnoi; - return(OK); - case BSIM4v7_MOD_LINT: - value->rValue = model->BSIM4v7Lint; - return(OK); - case BSIM4v7_MOD_LL: - value->rValue = model->BSIM4v7Ll; - return(OK); - case BSIM4v7_MOD_LLC: - value->rValue = model->BSIM4v7Llc; - return(OK); - case BSIM4v7_MOD_LLN: - value->rValue = model->BSIM4v7Lln; - return(OK); - case BSIM4v7_MOD_LW: - value->rValue = model->BSIM4v7Lw; - return(OK); - case BSIM4v7_MOD_LWC: - value->rValue = model->BSIM4v7Lwc; - return(OK); - case BSIM4v7_MOD_LWN: - value->rValue = model->BSIM4v7Lwn; - return(OK); - case BSIM4v7_MOD_LWL: - value->rValue = model->BSIM4v7Lwl; - return(OK); - case BSIM4v7_MOD_LWLC: - value->rValue = model->BSIM4v7Lwlc; - return(OK); - case BSIM4v7_MOD_LMIN: - value->rValue = model->BSIM4v7Lmin; - return(OK); - case BSIM4v7_MOD_LMAX: - value->rValue = model->BSIM4v7Lmax; - return(OK); - case BSIM4v7_MOD_WINT: - value->rValue = model->BSIM4v7Wint; - return(OK); - case BSIM4v7_MOD_WL: - value->rValue = model->BSIM4v7Wl; - return(OK); - case BSIM4v7_MOD_WLC: - value->rValue = model->BSIM4v7Wlc; - return(OK); - case BSIM4v7_MOD_WLN: - value->rValue = model->BSIM4v7Wln; - return(OK); - case BSIM4v7_MOD_WW: - value->rValue = model->BSIM4v7Ww; - return(OK); - case BSIM4v7_MOD_WWC: - value->rValue = model->BSIM4v7Wwc; - return(OK); - case BSIM4v7_MOD_WWN: - value->rValue = model->BSIM4v7Wwn; - return(OK); - case BSIM4v7_MOD_WWL: - value->rValue = model->BSIM4v7Wwl; - return(OK); - case BSIM4v7_MOD_WWLC: - value->rValue = model->BSIM4v7Wwlc; - return(OK); - case BSIM4v7_MOD_WMIN: - value->rValue = model->BSIM4v7Wmin; - return(OK); - case BSIM4v7_MOD_WMAX: - value->rValue = model->BSIM4v7Wmax; - return(OK); - - /* stress effect */ - case BSIM4v7_MOD_SAREF: - value->rValue = model->BSIM4v7saref; - return(OK); - case BSIM4v7_MOD_SBREF: - value->rValue = model->BSIM4v7sbref; - return(OK); - case BSIM4v7_MOD_WLOD: - value->rValue = model->BSIM4v7wlod; - return(OK); - case BSIM4v7_MOD_KU0: - value->rValue = model->BSIM4v7ku0; - return(OK); - case BSIM4v7_MOD_KVSAT: - value->rValue = model->BSIM4v7kvsat; - return(OK); - case BSIM4v7_MOD_KVTH0: - value->rValue = model->BSIM4v7kvth0; - return(OK); - case BSIM4v7_MOD_TKU0: - value->rValue = model->BSIM4v7tku0; - return(OK); - case BSIM4v7_MOD_LLODKU0: - value->rValue = model->BSIM4v7llodku0; - return(OK); - case BSIM4v7_MOD_WLODKU0: - value->rValue = model->BSIM4v7wlodku0; - return(OK); - case BSIM4v7_MOD_LLODVTH: - value->rValue = model->BSIM4v7llodvth; - return(OK); - case BSIM4v7_MOD_WLODVTH: - value->rValue = model->BSIM4v7wlodvth; - return(OK); - case BSIM4v7_MOD_LKU0: - value->rValue = model->BSIM4v7lku0; - return(OK); - case BSIM4v7_MOD_WKU0: - value->rValue = model->BSIM4v7wku0; - return(OK); - case BSIM4v7_MOD_PKU0: - value->rValue = model->BSIM4v7pku0; - return(OK); - case BSIM4v7_MOD_LKVTH0: - value->rValue = model->BSIM4v7lkvth0; - return(OK); - case BSIM4v7_MOD_WKVTH0: - value->rValue = model->BSIM4v7wkvth0; - return(OK); - case BSIM4v7_MOD_PKVTH0: - value->rValue = model->BSIM4v7pkvth0; - return(OK); - case BSIM4v7_MOD_STK2: - value->rValue = model->BSIM4v7stk2; - return(OK); - case BSIM4v7_MOD_LODK2: - value->rValue = model->BSIM4v7lodk2; - return(OK); - case BSIM4v7_MOD_STETA0: - value->rValue = model->BSIM4v7steta0; - return(OK); - case BSIM4v7_MOD_LODETA0: - value->rValue = model->BSIM4v7lodeta0; - return(OK); - - /* Well Proximity Effect */ - case BSIM4v7_MOD_WEB: - value->rValue = model->BSIM4v7web; - return(OK); - case BSIM4v7_MOD_WEC: - value->rValue = model->BSIM4v7wec; - return(OK); - case BSIM4v7_MOD_KVTH0WE: - value->rValue = model->BSIM4v7kvth0we; - return(OK); - case BSIM4v7_MOD_K2WE: - value->rValue = model->BSIM4v7k2we; - return(OK); - case BSIM4v7_MOD_KU0WE: - value->rValue = model->BSIM4v7ku0we; - return(OK); - case BSIM4v7_MOD_SCREF: - value->rValue = model->BSIM4v7scref; - return(OK); - case BSIM4v7_MOD_WPEMOD: - value->rValue = model->BSIM4v7wpemod; - return(OK); - case BSIM4v7_MOD_LKVTH0WE: - value->rValue = model->BSIM4v7lkvth0we; - return(OK); - case BSIM4v7_MOD_LK2WE: - value->rValue = model->BSIM4v7lk2we; - return(OK); - case BSIM4v7_MOD_LKU0WE: - value->rValue = model->BSIM4v7lku0we; - return(OK); - case BSIM4v7_MOD_WKVTH0WE: - value->rValue = model->BSIM4v7wkvth0we; - return(OK); - case BSIM4v7_MOD_WK2WE: - value->rValue = model->BSIM4v7wk2we; - return(OK); - case BSIM4v7_MOD_WKU0WE: - value->rValue = model->BSIM4v7wku0we; - return(OK); - case BSIM4v7_MOD_PKVTH0WE: - value->rValue = model->BSIM4v7pkvth0we; - return(OK); - case BSIM4v7_MOD_PK2WE: - value->rValue = model->BSIM4v7pk2we; - return(OK); - case BSIM4v7_MOD_PKU0WE: - value->rValue = model->BSIM4v7pku0we; - return(OK); - - case BSIM4v7_MOD_NOIA: - value->rValue = model->BSIM4v7oxideTrapDensityA; - return(OK); - case BSIM4v7_MOD_NOIB: - value->rValue = model->BSIM4v7oxideTrapDensityB; - return(OK); - case BSIM4v7_MOD_NOIC: - value->rValue = model->BSIM4v7oxideTrapDensityC; - return(OK); - case BSIM4v7_MOD_EM: - value->rValue = model->BSIM4v7em; - return(OK); - case BSIM4v7_MOD_EF: - value->rValue = model->BSIM4v7ef; - return(OK); - case BSIM4v7_MOD_AF: - value->rValue = model->BSIM4v7af; - return(OK); - case BSIM4v7_MOD_KF: - value->rValue = model->BSIM4v7kf; - return(OK); - - case BSIM4v7_MOD_VGS_MAX: - value->rValue = model->BSIM4v7vgsMax; - return(OK); - case BSIM4v7_MOD_VGD_MAX: - value->rValue = model->BSIM4v7vgdMax; - return(OK); - case BSIM4v7_MOD_VGB_MAX: - value->rValue = model->BSIM4v7vgbMax; - return(OK); - case BSIM4v7_MOD_VDS_MAX: - value->rValue = model->BSIM4v7vdsMax; - return(OK); - case BSIM4v7_MOD_VBS_MAX: - value->rValue = model->BSIM4v7vbsMax; - return(OK); - case BSIM4v7_MOD_VBD_MAX: - value->rValue = model->BSIM4v7vbdMax; - return(OK); - case BSIM4v7_MOD_VGSR_MAX: - value->rValue = model->BSIM4v7vgsrMax; - return(OK); - case BSIM4v7_MOD_VGDR_MAX: - value->rValue = model->BSIM4v7vgdrMax; - return(OK); - case BSIM4v7_MOD_VGBR_MAX: - value->rValue = model->BSIM4v7vgbrMax; - return(OK); - case BSIM4v7_MOD_VBSR_MAX: - value->rValue = model->BSIM4v7vbsrMax; - return(OK); - case BSIM4v7_MOD_VBDR_MAX: - value->rValue = model->BSIM4v7vbdrMax; - return(OK); - - default: - return(E_BADPARM); - } - /* NOTREACHED */ -} - - - diff --git a/src/spicelib/devices/bsim4v7/b4v7mdel.c b/src/spicelib/devices/bsim4v7/b4v7mdel.c deleted file mode 100644 index 198f08fee..000000000 --- a/src/spicelib/devices/bsim4v7/b4v7mdel.c +++ /dev/null @@ -1,39 +0,0 @@ -/**** BSIM4.7.0 Released by Darsen Lu 04/08/2011 ****/ - -/********** - * Copyright 2006 Regents of the University of California. All rights reserved. - * File: b4mdel.c of BSIM4.7.0. - * Author: 2000 Weidong Liu - * Authors: 2001- Xuemei Xi, Mohan Dunga, Ali Niknejad, Chenming Hu. - * Authors: 2006- Mohan Dunga, Ali Niknejad, Chenming Hu - * Authors: 2007- Mohan Dunga, Wenwei Yang, Ali Niknejad, Chenming Hu - * Project Director: Prof. Chenming Hu. - **********/ - -#include "ngspice/ngspice.h" -#include "bsim4v7def.h" -#include "ngspice/sperror.h" -#include "ngspice/suffix.h" - - -int -BSIM4v7mDelete(GENmodel *gen_model) -{ - BSIM4v7model *model = (BSIM4v7model *) gen_model; - -#ifdef USE_OMP - FREE(model->BSIM4v7InstanceArray); -#endif - - struct bsim4SizeDependParam *p = model->pSizeDependParamKnot; - while (p) { - struct bsim4SizeDependParam *next_p = p->pNext; - FREE(p); - p = next_p; - } - - /* model->BSIM4v7modName to be freed in INPtabEnd() */ - FREE(model->BSIM4v7version); - - return OK; -} diff --git a/src/spicelib/devices/bsim4v7/b4v7mpar.c b/src/spicelib/devices/bsim4v7/b4v7mpar.c deleted file mode 100644 index 1bc839751..000000000 --- a/src/spicelib/devices/bsim4v7/b4v7mpar.c +++ /dev/null @@ -1,3669 +0,0 @@ -/**** BSIM4.7.0 Released by Darsen Lu 04/08/2011 ****/ - -/********** - * Copyright 2006 Regents of the University of California. All rights reserved. - * File: b4mpar.c of BSIM4.7.0. - * Author: 2000 Weidong Liu - * Authors: 2001- Xuemei Xi, Mohan Dunga, Ali Niknejad, Chenming Hu. - * Authors: 2006- Mohan Dunga, Ali Niknejad, Chenming Hu - * Authors: 2007- Mohan Dunga, Wenwei Yang, Ali Niknejad, Chenming Hu - * Authors: 2008- Wenwei Yang, Ali Niknejad, Chenming Hu - * Project Director: Prof. Chenming Hu. - * Modified by Xuemei Xi, 04/06/2001. - * Modified by Xuemei Xi, 10/05/2001. - * Modified by Xuemei Xi, 11/15/2002. - * Modified by Xuemei Xi, 05/09/2003. - * Modified by Xuemei Xi, 03/04/2004. - * Modified by Xuemei Xi, Mohan Dunga, 07/29/2005. - * Modified by Mohan Dunga, 12/13/2006 - * Modified by Mohan Dunga, Wenwei Yang, 05/18/2007. - * Modified by Wenwei Yang, 07/31/2008. - * Modified by Tanvir Morshed, Darsen Lu 03/27/2011 - **********/ - -#include "ngspice/ngspice.h" -#include "bsim4v7def.h" -#include "ngspice/ifsim.h" -#include "ngspice/sperror.h" -#include "ngspice/suffix.h" -#include "ngspice/const.h" - -int -BSIM4v7mParam( -int param, -IFvalue *value, -GENmodel *inMod) -{ - BSIM4v7model *mod = (BSIM4v7model*)inMod; - switch(param) - { case BSIM4v7_MOD_MOBMOD : - mod->BSIM4v7mobMod = value->iValue; - mod->BSIM4v7mobModGiven = TRUE; - break; - case BSIM4v7_MOD_BINUNIT : - mod->BSIM4v7binUnit = value->iValue; - mod->BSIM4v7binUnitGiven = TRUE; - break; - case BSIM4v7_MOD_PARAMCHK : - mod->BSIM4v7paramChk = value->iValue; - mod->BSIM4v7paramChkGiven = TRUE; - break; - case BSIM4v7_MOD_CVCHARGEMOD : - mod->BSIM4v7cvchargeMod = value->iValue; - mod->BSIM4v7cvchargeModGiven = TRUE; - break; - case BSIM4v7_MOD_CAPMOD : - mod->BSIM4v7capMod = value->iValue; - mod->BSIM4v7capModGiven = TRUE; - break; - case BSIM4v7_MOD_DIOMOD : - mod->BSIM4v7dioMod = value->iValue; - mod->BSIM4v7dioModGiven = TRUE; - break; - case BSIM4v7_MOD_RDSMOD : - mod->BSIM4v7rdsMod = value->iValue; - mod->BSIM4v7rdsModGiven = TRUE; - break; - case BSIM4v7_MOD_TRNQSMOD : - mod->BSIM4v7trnqsMod = value->iValue; - mod->BSIM4v7trnqsModGiven = TRUE; - break; - case BSIM4v7_MOD_ACNQSMOD : - mod->BSIM4v7acnqsMod = value->iValue; - mod->BSIM4v7acnqsModGiven = TRUE; - break; - case BSIM4v7_MOD_RBODYMOD : - mod->BSIM4v7rbodyMod = value->iValue; - mod->BSIM4v7rbodyModGiven = TRUE; - break; - case BSIM4v7_MOD_RGATEMOD : - mod->BSIM4v7rgateMod = value->iValue; - mod->BSIM4v7rgateModGiven = TRUE; - break; - case BSIM4v7_MOD_PERMOD : - mod->BSIM4v7perMod = value->iValue; - mod->BSIM4v7perModGiven = TRUE; - break; - case BSIM4v7_MOD_GEOMOD : - mod->BSIM4v7geoMod = value->iValue; - mod->BSIM4v7geoModGiven = TRUE; - break; - case BSIM4v7_MOD_RGEOMOD : - mod->BSIM4v7rgeoMod = value->iValue; - mod->BSIM4v7rgeoModGiven = TRUE; - break; - case BSIM4v7_MOD_FNOIMOD : - mod->BSIM4v7fnoiMod = value->iValue; - mod->BSIM4v7fnoiModGiven = TRUE; - break; - case BSIM4v7_MOD_TNOIMOD : - mod->BSIM4v7tnoiMod = value->iValue; - mod->BSIM4v7tnoiModGiven = TRUE; - break; - case BSIM4v7_MOD_MTRLMOD : - mod->BSIM4v7mtrlMod = value->iValue; - mod->BSIM4v7mtrlModGiven = TRUE; - break; - case BSIM4v7_MOD_MTRLCOMPATMOD : - mod->BSIM4v7mtrlCompatMod = value->iValue; - mod->BSIM4v7mtrlCompatModGiven = TRUE; - break; - case BSIM4v7_MOD_GIDLMOD : /* v4.7 New GIDL/GISL */ - mod->BSIM4v7gidlMod = value->iValue; - mod->BSIM4v7gidlModGiven = TRUE; - break; - case BSIM4v7_MOD_IGCMOD : - mod->BSIM4v7igcMod = value->iValue; - mod->BSIM4v7igcModGiven = TRUE; - break; - case BSIM4v7_MOD_IGBMOD : - mod->BSIM4v7igbMod = value->iValue; - mod->BSIM4v7igbModGiven = TRUE; - break; - case BSIM4v7_MOD_TEMPMOD : - mod->BSIM4v7tempMod = value->iValue; - mod->BSIM4v7tempModGiven = TRUE; - break; - - case BSIM4v7_MOD_VERSION : - mod->BSIM4v7version = value->sValue; - mod->BSIM4v7versionGiven = TRUE; - break; - case BSIM4v7_MOD_TOXREF : - mod->BSIM4v7toxref = value->rValue; - mod->BSIM4v7toxrefGiven = TRUE; - break; - case BSIM4v7_MOD_EOT : - mod->BSIM4v7eot = value->rValue; - mod->BSIM4v7eotGiven = TRUE; - break; - case BSIM4v7_MOD_VDDEOT : - mod->BSIM4v7vddeot = value->rValue; - mod->BSIM4v7vddeotGiven = TRUE; - break; - case BSIM4v7_MOD_TEMPEOT : - mod->BSIM4v7tempeot = value->rValue; - mod->BSIM4v7tempeotGiven = TRUE; - break; - case BSIM4v7_MOD_LEFFEOT : - mod->BSIM4v7leffeot = value->rValue; - mod->BSIM4v7leffeotGiven = TRUE; - break; - case BSIM4v7_MOD_WEFFEOT : - mod->BSIM4v7weffeot = value->rValue; - mod->BSIM4v7weffeotGiven = TRUE; - break; - case BSIM4v7_MOD_ADOS : - mod->BSIM4v7ados = value->rValue; - mod->BSIM4v7adosGiven = TRUE; - break; - case BSIM4v7_MOD_BDOS : - mod->BSIM4v7bdos = value->rValue; - mod->BSIM4v7bdosGiven = TRUE; - break; - case BSIM4v7_MOD_TOXE : - mod->BSIM4v7toxe = value->rValue; - mod->BSIM4v7toxeGiven = TRUE; - break; - case BSIM4v7_MOD_TOXP : - mod->BSIM4v7toxp = value->rValue; - mod->BSIM4v7toxpGiven = TRUE; - break; - case BSIM4v7_MOD_TOXM : - mod->BSIM4v7toxm = value->rValue; - mod->BSIM4v7toxmGiven = TRUE; - break; - case BSIM4v7_MOD_DTOX : - mod->BSIM4v7dtox = value->rValue; - mod->BSIM4v7dtoxGiven = TRUE; - break; - case BSIM4v7_MOD_EPSROX : - mod->BSIM4v7epsrox = value->rValue; - mod->BSIM4v7epsroxGiven = TRUE; - break; - - case BSIM4v7_MOD_CDSC : - mod->BSIM4v7cdsc = value->rValue; - mod->BSIM4v7cdscGiven = TRUE; - break; - case BSIM4v7_MOD_CDSCB : - mod->BSIM4v7cdscb = value->rValue; - mod->BSIM4v7cdscbGiven = TRUE; - break; - - case BSIM4v7_MOD_CDSCD : - mod->BSIM4v7cdscd = value->rValue; - mod->BSIM4v7cdscdGiven = TRUE; - break; - - case BSIM4v7_MOD_CIT : - mod->BSIM4v7cit = value->rValue; - mod->BSIM4v7citGiven = TRUE; - break; - case BSIM4v7_MOD_NFACTOR : - mod->BSIM4v7nfactor = value->rValue; - mod->BSIM4v7nfactorGiven = TRUE; - break; - case BSIM4v7_MOD_XJ: - mod->BSIM4v7xj = value->rValue; - mod->BSIM4v7xjGiven = TRUE; - break; - case BSIM4v7_MOD_VSAT: - mod->BSIM4v7vsat = value->rValue; - mod->BSIM4v7vsatGiven = TRUE; - break; - case BSIM4v7_MOD_A0: - mod->BSIM4v7a0 = value->rValue; - mod->BSIM4v7a0Given = TRUE; - break; - - case BSIM4v7_MOD_AGS: - mod->BSIM4v7ags= value->rValue; - mod->BSIM4v7agsGiven = TRUE; - break; - - case BSIM4v7_MOD_A1: - mod->BSIM4v7a1 = value->rValue; - mod->BSIM4v7a1Given = TRUE; - break; - case BSIM4v7_MOD_A2: - mod->BSIM4v7a2 = value->rValue; - mod->BSIM4v7a2Given = TRUE; - break; - case BSIM4v7_MOD_AT: - mod->BSIM4v7at = value->rValue; - mod->BSIM4v7atGiven = TRUE; - break; - case BSIM4v7_MOD_KETA: - mod->BSIM4v7keta = value->rValue; - mod->BSIM4v7ketaGiven = TRUE; - break; - case BSIM4v7_MOD_NSUB: - mod->BSIM4v7nsub = value->rValue; - mod->BSIM4v7nsubGiven = TRUE; - break; - case BSIM4v7_MOD_PHIG: - mod->BSIM4v7phig = value->rValue; - mod->BSIM4v7phigGiven = TRUE; - break; - case BSIM4v7_MOD_EPSRGATE: - mod->BSIM4v7epsrgate = value->rValue; - mod->BSIM4v7epsrgateGiven = TRUE; - break; - case BSIM4v7_MOD_EASUB: - mod->BSIM4v7easub = value->rValue; - mod->BSIM4v7easubGiven = TRUE; - break; - case BSIM4v7_MOD_EPSRSUB: - mod->BSIM4v7epsrsub = value->rValue; - mod->BSIM4v7epsrsubGiven = TRUE; - break; - case BSIM4v7_MOD_NI0SUB: - mod->BSIM4v7ni0sub = value->rValue; - mod->BSIM4v7ni0subGiven = TRUE; - break; - case BSIM4v7_MOD_BG0SUB: - mod->BSIM4v7bg0sub = value->rValue; - mod->BSIM4v7bg0subGiven = TRUE; - break; - case BSIM4v7_MOD_TBGASUB: - mod->BSIM4v7tbgasub = value->rValue; - mod->BSIM4v7tbgasubGiven = TRUE; - break; - case BSIM4v7_MOD_TBGBSUB: - mod->BSIM4v7tbgbsub = value->rValue; - mod->BSIM4v7tbgbsubGiven = TRUE; - break; - case BSIM4v7_MOD_NDEP: - mod->BSIM4v7ndep = value->rValue; - mod->BSIM4v7ndepGiven = TRUE; - if (mod->BSIM4v7ndep > 1.0e20) - mod->BSIM4v7ndep *= 1.0e-6; - break; - case BSIM4v7_MOD_NSD: - mod->BSIM4v7nsd = value->rValue; - mod->BSIM4v7nsdGiven = TRUE; - if (mod->BSIM4v7nsd > 1.000001e24) - mod->BSIM4v7nsd *= 1.0e-6; - break; - case BSIM4v7_MOD_NGATE: - mod->BSIM4v7ngate = value->rValue; - mod->BSIM4v7ngateGiven = TRUE; - if (mod->BSIM4v7ngate > 1.000001e24) - mod->BSIM4v7ngate *= 1.0e-6; - break; - case BSIM4v7_MOD_GAMMA1: - mod->BSIM4v7gamma1 = value->rValue; - mod->BSIM4v7gamma1Given = TRUE; - break; - case BSIM4v7_MOD_GAMMA2: - mod->BSIM4v7gamma2 = value->rValue; - mod->BSIM4v7gamma2Given = TRUE; - break; - case BSIM4v7_MOD_VBX: - mod->BSIM4v7vbx = value->rValue; - mod->BSIM4v7vbxGiven = TRUE; - break; - case BSIM4v7_MOD_VBM: - mod->BSIM4v7vbm = value->rValue; - mod->BSIM4v7vbmGiven = TRUE; - break; - case BSIM4v7_MOD_XT: - mod->BSIM4v7xt = value->rValue; - mod->BSIM4v7xtGiven = TRUE; - break; - case BSIM4v7_MOD_K1: - mod->BSIM4v7k1 = value->rValue; - mod->BSIM4v7k1Given = TRUE; - break; - case BSIM4v7_MOD_KT1: - mod->BSIM4v7kt1 = value->rValue; - mod->BSIM4v7kt1Given = TRUE; - break; - case BSIM4v7_MOD_KT1L: - mod->BSIM4v7kt1l = value->rValue; - mod->BSIM4v7kt1lGiven = TRUE; - break; - case BSIM4v7_MOD_KT2: - mod->BSIM4v7kt2 = value->rValue; - mod->BSIM4v7kt2Given = TRUE; - break; - case BSIM4v7_MOD_K2: - mod->BSIM4v7k2 = value->rValue; - mod->BSIM4v7k2Given = TRUE; - break; - case BSIM4v7_MOD_K3: - mod->BSIM4v7k3 = value->rValue; - mod->BSIM4v7k3Given = TRUE; - break; - case BSIM4v7_MOD_K3B: - mod->BSIM4v7k3b = value->rValue; - mod->BSIM4v7k3bGiven = TRUE; - break; - case BSIM4v7_MOD_LPE0: - mod->BSIM4v7lpe0 = value->rValue; - mod->BSIM4v7lpe0Given = TRUE; - break; - case BSIM4v7_MOD_LPEB: - mod->BSIM4v7lpeb = value->rValue; - mod->BSIM4v7lpebGiven = TRUE; - break; - case BSIM4v7_MOD_DVTP0: - mod->BSIM4v7dvtp0 = value->rValue; - mod->BSIM4v7dvtp0Given = TRUE; - break; - case BSIM4v7_MOD_DVTP1: - mod->BSIM4v7dvtp1 = value->rValue; - mod->BSIM4v7dvtp1Given = TRUE; - break; - case BSIM4v7_MOD_DVTP2: /* New DIBL/Rout */ - mod->BSIM4v7dvtp2 = value->rValue; - mod->BSIM4v7dvtp2Given = TRUE; - break; - case BSIM4v7_MOD_DVTP3: - mod->BSIM4v7dvtp3 = value->rValue; - mod->BSIM4v7dvtp3Given = TRUE; - break; - case BSIM4v7_MOD_DVTP4: - mod->BSIM4v7dvtp4 = value->rValue; - mod->BSIM4v7dvtp4Given = TRUE; - break; - case BSIM4v7_MOD_DVTP5: - mod->BSIM4v7dvtp5 = value->rValue; - mod->BSIM4v7dvtp5Given = TRUE; - break; - case BSIM4v7_MOD_W0: - mod->BSIM4v7w0 = value->rValue; - mod->BSIM4v7w0Given = TRUE; - break; - case BSIM4v7_MOD_DVT0: - mod->BSIM4v7dvt0 = value->rValue; - mod->BSIM4v7dvt0Given = TRUE; - break; - case BSIM4v7_MOD_DVT1: - mod->BSIM4v7dvt1 = value->rValue; - mod->BSIM4v7dvt1Given = TRUE; - break; - case BSIM4v7_MOD_DVT2: - mod->BSIM4v7dvt2 = value->rValue; - mod->BSIM4v7dvt2Given = TRUE; - break; - case BSIM4v7_MOD_DVT0W: - mod->BSIM4v7dvt0w = value->rValue; - mod->BSIM4v7dvt0wGiven = TRUE; - break; - case BSIM4v7_MOD_DVT1W: - mod->BSIM4v7dvt1w = value->rValue; - mod->BSIM4v7dvt1wGiven = TRUE; - break; - case BSIM4v7_MOD_DVT2W: - mod->BSIM4v7dvt2w = value->rValue; - mod->BSIM4v7dvt2wGiven = TRUE; - break; - case BSIM4v7_MOD_DROUT: - mod->BSIM4v7drout = value->rValue; - mod->BSIM4v7droutGiven = TRUE; - break; - case BSIM4v7_MOD_DSUB: - mod->BSIM4v7dsub = value->rValue; - mod->BSIM4v7dsubGiven = TRUE; - break; - case BSIM4v7_MOD_VTH0: - mod->BSIM4v7vth0 = value->rValue; - mod->BSIM4v7vth0Given = TRUE; - break; - case BSIM4v7_MOD_EU: - mod->BSIM4v7eu = value->rValue; - mod->BSIM4v7euGiven = TRUE; - break; - case BSIM4v7_MOD_UCS: - mod->BSIM4v7ucs = value->rValue; - mod->BSIM4v7ucsGiven = TRUE; - break; - case BSIM4v7_MOD_UA: - mod->BSIM4v7ua = value->rValue; - mod->BSIM4v7uaGiven = TRUE; - break; - case BSIM4v7_MOD_UA1: - mod->BSIM4v7ua1 = value->rValue; - mod->BSIM4v7ua1Given = TRUE; - break; - case BSIM4v7_MOD_UB: - mod->BSIM4v7ub = value->rValue; - mod->BSIM4v7ubGiven = TRUE; - break; - case BSIM4v7_MOD_UB1: - mod->BSIM4v7ub1 = value->rValue; - mod->BSIM4v7ub1Given = TRUE; - break; - case BSIM4v7_MOD_UC: - mod->BSIM4v7uc = value->rValue; - mod->BSIM4v7ucGiven = TRUE; - break; - case BSIM4v7_MOD_UC1: - mod->BSIM4v7uc1 = value->rValue; - mod->BSIM4v7uc1Given = TRUE; - break; - case BSIM4v7_MOD_U0 : - mod->BSIM4v7u0 = value->rValue; - mod->BSIM4v7u0Given = TRUE; - break; - case BSIM4v7_MOD_UTE : - mod->BSIM4v7ute = value->rValue; - mod->BSIM4v7uteGiven = TRUE; - break; - case BSIM4v7_MOD_UCSTE : - mod->BSIM4v7ucste = value->rValue; - mod->BSIM4v7ucsteGiven = TRUE; - break; - case BSIM4v7_MOD_UD: - mod->BSIM4v7ud = value->rValue; - mod->BSIM4v7udGiven = TRUE; - break; - case BSIM4v7_MOD_UD1: - mod->BSIM4v7ud1 = value->rValue; - mod->BSIM4v7ud1Given = TRUE; - break; - case BSIM4v7_MOD_UP: - mod->BSIM4v7up = value->rValue; - mod->BSIM4v7upGiven = TRUE; - break; - case BSIM4v7_MOD_LP: - mod->BSIM4v7lp = value->rValue; - mod->BSIM4v7lpGiven = TRUE; - break; - case BSIM4v7_MOD_LUD: - mod->BSIM4v7lud = value->rValue; - mod->BSIM4v7ludGiven = TRUE; - break; - case BSIM4v7_MOD_LUD1: - mod->BSIM4v7lud1 = value->rValue; - mod->BSIM4v7lud1Given = TRUE; - break; - case BSIM4v7_MOD_LUP: - mod->BSIM4v7lup = value->rValue; - mod->BSIM4v7lupGiven = TRUE; - break; - case BSIM4v7_MOD_LLP: - mod->BSIM4v7llp = value->rValue; - mod->BSIM4v7llpGiven = TRUE; - break; - case BSIM4v7_MOD_WUD: - mod->BSIM4v7wud = value->rValue; - mod->BSIM4v7wudGiven = TRUE; - break; - case BSIM4v7_MOD_WUD1: - mod->BSIM4v7wud1 = value->rValue; - mod->BSIM4v7wud1Given = TRUE; - break; - case BSIM4v7_MOD_WUP: - mod->BSIM4v7wup = value->rValue; - mod->BSIM4v7wupGiven = TRUE; - break; - case BSIM4v7_MOD_WLP: - mod->BSIM4v7wlp = value->rValue; - mod->BSIM4v7wlpGiven = TRUE; - break; - case BSIM4v7_MOD_PUD: - mod->BSIM4v7pud = value->rValue; - mod->BSIM4v7pudGiven = TRUE; - break; - case BSIM4v7_MOD_PUD1: - mod->BSIM4v7pud1 = value->rValue; - mod->BSIM4v7pud1Given = TRUE; - break; - case BSIM4v7_MOD_PUP: - mod->BSIM4v7pup = value->rValue; - mod->BSIM4v7pupGiven = TRUE; - break; - case BSIM4v7_MOD_PLP: - mod->BSIM4v7plp = value->rValue; - mod->BSIM4v7plpGiven = TRUE; - break; - - - case BSIM4v7_MOD_VOFF: - mod->BSIM4v7voff = value->rValue; - mod->BSIM4v7voffGiven = TRUE; - break; - case BSIM4v7_MOD_TVOFF: - mod->BSIM4v7tvoff = value->rValue; - mod->BSIM4v7tvoffGiven = TRUE; - break; - case BSIM4v7_MOD_TNFACTOR: /* v4.7 temp dep of leakage current */ - mod->BSIM4v7tnfactor = value->rValue; - mod->BSIM4v7tnfactorGiven = TRUE; - break; - case BSIM4v7_MOD_TETA0: /* v4.7 temp dep of leakage current */ - mod->BSIM4v7teta0 = value->rValue; - mod->BSIM4v7teta0Given = TRUE; - break; - case BSIM4v7_MOD_TVOFFCV: /* v4.7 temp dep of leakage current */ - mod->BSIM4v7tvoffcv = value->rValue; - mod->BSIM4v7tvoffcvGiven = TRUE; - break; - case BSIM4v7_MOD_VOFFL: - mod->BSIM4v7voffl = value->rValue; - mod->BSIM4v7vofflGiven = TRUE; - break; - case BSIM4v7_MOD_VOFFCVL: - mod->BSIM4v7voffcvl = value->rValue; - mod->BSIM4v7voffcvlGiven = TRUE; - break; - case BSIM4v7_MOD_MINV: - mod->BSIM4v7minv = value->rValue; - mod->BSIM4v7minvGiven = TRUE; - break; - case BSIM4v7_MOD_MINVCV: - mod->BSIM4v7minvcv = value->rValue; - mod->BSIM4v7minvcvGiven = TRUE; - break; - case BSIM4v7_MOD_FPROUT: - mod->BSIM4v7fprout = value->rValue; - mod->BSIM4v7fproutGiven = TRUE; - break; - case BSIM4v7_MOD_PDITS: - mod->BSIM4v7pdits = value->rValue; - mod->BSIM4v7pditsGiven = TRUE; - break; - case BSIM4v7_MOD_PDITSD: - mod->BSIM4v7pditsd = value->rValue; - mod->BSIM4v7pditsdGiven = TRUE; - break; - case BSIM4v7_MOD_PDITSL: - mod->BSIM4v7pditsl = value->rValue; - mod->BSIM4v7pditslGiven = TRUE; - break; - case BSIM4v7_MOD_DELTA : - mod->BSIM4v7delta = value->rValue; - mod->BSIM4v7deltaGiven = TRUE; - break; - case BSIM4v7_MOD_RDSW: - mod->BSIM4v7rdsw = value->rValue; - mod->BSIM4v7rdswGiven = TRUE; - break; - case BSIM4v7_MOD_RDSWMIN: - mod->BSIM4v7rdswmin = value->rValue; - mod->BSIM4v7rdswminGiven = TRUE; - break; - case BSIM4v7_MOD_RDWMIN: - mod->BSIM4v7rdwmin = value->rValue; - mod->BSIM4v7rdwminGiven = TRUE; - break; - case BSIM4v7_MOD_RSWMIN: - mod->BSIM4v7rswmin = value->rValue; - mod->BSIM4v7rswminGiven = TRUE; - break; - case BSIM4v7_MOD_RDW: - mod->BSIM4v7rdw = value->rValue; - mod->BSIM4v7rdwGiven = TRUE; - break; - case BSIM4v7_MOD_RSW: - mod->BSIM4v7rsw = value->rValue; - mod->BSIM4v7rswGiven = TRUE; - break; - case BSIM4v7_MOD_PRWG: - mod->BSIM4v7prwg = value->rValue; - mod->BSIM4v7prwgGiven = TRUE; - break; - case BSIM4v7_MOD_PRWB: - mod->BSIM4v7prwb = value->rValue; - mod->BSIM4v7prwbGiven = TRUE; - break; - case BSIM4v7_MOD_PRT: - mod->BSIM4v7prt = value->rValue; - mod->BSIM4v7prtGiven = TRUE; - break; - case BSIM4v7_MOD_ETA0: - mod->BSIM4v7eta0 = value->rValue; - mod->BSIM4v7eta0Given = TRUE; - break; - case BSIM4v7_MOD_ETAB: - mod->BSIM4v7etab = value->rValue; - mod->BSIM4v7etabGiven = TRUE; - break; - case BSIM4v7_MOD_PCLM: - mod->BSIM4v7pclm = value->rValue; - mod->BSIM4v7pclmGiven = TRUE; - break; - case BSIM4v7_MOD_PDIBL1: - mod->BSIM4v7pdibl1 = value->rValue; - mod->BSIM4v7pdibl1Given = TRUE; - break; - case BSIM4v7_MOD_PDIBL2: - mod->BSIM4v7pdibl2 = value->rValue; - mod->BSIM4v7pdibl2Given = TRUE; - break; - case BSIM4v7_MOD_PDIBLB: - mod->BSIM4v7pdiblb = value->rValue; - mod->BSIM4v7pdiblbGiven = TRUE; - break; - case BSIM4v7_MOD_PSCBE1: - mod->BSIM4v7pscbe1 = value->rValue; - mod->BSIM4v7pscbe1Given = TRUE; - break; - case BSIM4v7_MOD_PSCBE2: - mod->BSIM4v7pscbe2 = value->rValue; - mod->BSIM4v7pscbe2Given = TRUE; - break; - case BSIM4v7_MOD_PVAG: - mod->BSIM4v7pvag = value->rValue; - mod->BSIM4v7pvagGiven = TRUE; - break; - case BSIM4v7_MOD_WR : - mod->BSIM4v7wr = value->rValue; - mod->BSIM4v7wrGiven = TRUE; - break; - case BSIM4v7_MOD_DWG : - mod->BSIM4v7dwg = value->rValue; - mod->BSIM4v7dwgGiven = TRUE; - break; - case BSIM4v7_MOD_DWB : - mod->BSIM4v7dwb = value->rValue; - mod->BSIM4v7dwbGiven = TRUE; - break; - case BSIM4v7_MOD_B0 : - mod->BSIM4v7b0 = value->rValue; - mod->BSIM4v7b0Given = TRUE; - break; - case BSIM4v7_MOD_B1 : - mod->BSIM4v7b1 = value->rValue; - mod->BSIM4v7b1Given = TRUE; - break; - case BSIM4v7_MOD_ALPHA0 : - mod->BSIM4v7alpha0 = value->rValue; - mod->BSIM4v7alpha0Given = TRUE; - break; - case BSIM4v7_MOD_ALPHA1 : - mod->BSIM4v7alpha1 = value->rValue; - mod->BSIM4v7alpha1Given = TRUE; - break; - case BSIM4v7_MOD_PHIN : - mod->BSIM4v7phin = value->rValue; - mod->BSIM4v7phinGiven = TRUE; - break; - case BSIM4v7_MOD_AGIDL : - mod->BSIM4v7agidl = value->rValue; - mod->BSIM4v7agidlGiven = TRUE; - break; - case BSIM4v7_MOD_BGIDL : - mod->BSIM4v7bgidl = value->rValue; - mod->BSIM4v7bgidlGiven = TRUE; - break; - case BSIM4v7_MOD_CGIDL : - mod->BSIM4v7cgidl = value->rValue; - mod->BSIM4v7cgidlGiven = TRUE; - break; - case BSIM4v7_MOD_EGIDL : - mod->BSIM4v7egidl = value->rValue; - mod->BSIM4v7egidlGiven = TRUE; - break; - case BSIM4v7_MOD_FGIDL : /* v4.7 New GIDL/GISL */ - mod->BSIM4v7fgidl = value->rValue; - mod->BSIM4v7fgidlGiven = TRUE; - break; - case BSIM4v7_MOD_KGIDL : /* v4.7 New GIDL/GISL */ - mod->BSIM4v7kgidl = value->rValue; - mod->BSIM4v7kgidlGiven = TRUE; - break; - case BSIM4v7_MOD_RGIDL : /* v4.7 New GIDL/GISL */ - mod->BSIM4v7rgidl = value->rValue; - mod->BSIM4v7rgidlGiven = TRUE; - break; - case BSIM4v7_MOD_AGISL : - mod->BSIM4v7agisl = value->rValue; - mod->BSIM4v7agislGiven = TRUE; - break; - case BSIM4v7_MOD_BGISL : - mod->BSIM4v7bgisl = value->rValue; - mod->BSIM4v7bgislGiven = TRUE; - break; - case BSIM4v7_MOD_CGISL : - mod->BSIM4v7cgisl = value->rValue; - mod->BSIM4v7cgislGiven = TRUE; - break; - case BSIM4v7_MOD_EGISL : - mod->BSIM4v7egisl = value->rValue; - mod->BSIM4v7egislGiven = TRUE; - break; - case BSIM4v7_MOD_FGISL : /* v4.7 New GIDL/GISL */ - mod->BSIM4v7fgisl = value->rValue; - mod->BSIM4v7fgislGiven = TRUE; - break; - case BSIM4v7_MOD_KGISL : /* v4.7 New GIDL/GISL */ - mod->BSIM4v7kgisl = value->rValue; - mod->BSIM4v7kgislGiven = TRUE; - break; - case BSIM4v7_MOD_RGISL : /* v4.7 New GIDL/GISL */ - mod->BSIM4v7rgisl = value->rValue; - mod->BSIM4v7rgislGiven = TRUE; - break; - case BSIM4v7_MOD_AIGC : - mod->BSIM4v7aigc = value->rValue; - mod->BSIM4v7aigcGiven = TRUE; - break; - case BSIM4v7_MOD_BIGC : - mod->BSIM4v7bigc = value->rValue; - mod->BSIM4v7bigcGiven = TRUE; - break; - case BSIM4v7_MOD_CIGC : - mod->BSIM4v7cigc = value->rValue; - mod->BSIM4v7cigcGiven = TRUE; - break; - case BSIM4v7_MOD_AIGSD : - mod->BSIM4v7aigsd = value->rValue; - mod->BSIM4v7aigsdGiven = TRUE; - break; - case BSIM4v7_MOD_BIGSD : - mod->BSIM4v7bigsd = value->rValue; - mod->BSIM4v7bigsdGiven = TRUE; - break; - case BSIM4v7_MOD_CIGSD : - mod->BSIM4v7cigsd = value->rValue; - mod->BSIM4v7cigsdGiven = TRUE; - break; - case BSIM4v7_MOD_AIGS : - mod->BSIM4v7aigs = value->rValue; - mod->BSIM4v7aigsGiven = TRUE; - break; - case BSIM4v7_MOD_BIGS : - mod->BSIM4v7bigs = value->rValue; - mod->BSIM4v7bigsGiven = TRUE; - break; - case BSIM4v7_MOD_CIGS : - mod->BSIM4v7cigs = value->rValue; - mod->BSIM4v7cigsGiven = TRUE; - break; - case BSIM4v7_MOD_AIGD : - mod->BSIM4v7aigd = value->rValue; - mod->BSIM4v7aigdGiven = TRUE; - break; - case BSIM4v7_MOD_BIGD : - mod->BSIM4v7bigd = value->rValue; - mod->BSIM4v7bigdGiven = TRUE; - break; - case BSIM4v7_MOD_CIGD : - mod->BSIM4v7cigd = value->rValue; - mod->BSIM4v7cigdGiven = TRUE; - break; - case BSIM4v7_MOD_AIGBACC : - mod->BSIM4v7aigbacc = value->rValue; - mod->BSIM4v7aigbaccGiven = TRUE; - break; - case BSIM4v7_MOD_BIGBACC : - mod->BSIM4v7bigbacc = value->rValue; - mod->BSIM4v7bigbaccGiven = TRUE; - break; - case BSIM4v7_MOD_CIGBACC : - mod->BSIM4v7cigbacc = value->rValue; - mod->BSIM4v7cigbaccGiven = TRUE; - break; - case BSIM4v7_MOD_AIGBINV : - mod->BSIM4v7aigbinv = value->rValue; - mod->BSIM4v7aigbinvGiven = TRUE; - break; - case BSIM4v7_MOD_BIGBINV : - mod->BSIM4v7bigbinv = value->rValue; - mod->BSIM4v7bigbinvGiven = TRUE; - break; - case BSIM4v7_MOD_CIGBINV : - mod->BSIM4v7cigbinv = value->rValue; - mod->BSIM4v7cigbinvGiven = TRUE; - break; - case BSIM4v7_MOD_NIGC : - mod->BSIM4v7nigc = value->rValue; - mod->BSIM4v7nigcGiven = TRUE; - break; - case BSIM4v7_MOD_NIGBINV : - mod->BSIM4v7nigbinv = value->rValue; - mod->BSIM4v7nigbinvGiven = TRUE; - break; - case BSIM4v7_MOD_NIGBACC : - mod->BSIM4v7nigbacc = value->rValue; - mod->BSIM4v7nigbaccGiven = TRUE; - break; - case BSIM4v7_MOD_NTOX : - mod->BSIM4v7ntox = value->rValue; - mod->BSIM4v7ntoxGiven = TRUE; - break; - case BSIM4v7_MOD_EIGBINV : - mod->BSIM4v7eigbinv = value->rValue; - mod->BSIM4v7eigbinvGiven = TRUE; - break; - case BSIM4v7_MOD_PIGCD : - mod->BSIM4v7pigcd = value->rValue; - mod->BSIM4v7pigcdGiven = TRUE; - break; - case BSIM4v7_MOD_POXEDGE : - mod->BSIM4v7poxedge = value->rValue; - mod->BSIM4v7poxedgeGiven = TRUE; - break; - case BSIM4v7_MOD_XRCRG1 : - mod->BSIM4v7xrcrg1 = value->rValue; - mod->BSIM4v7xrcrg1Given = TRUE; - break; - case BSIM4v7_MOD_XRCRG2 : - mod->BSIM4v7xrcrg2 = value->rValue; - mod->BSIM4v7xrcrg2Given = TRUE; - break; - case BSIM4v7_MOD_LAMBDA : - mod->BSIM4v7lambda = value->rValue; - mod->BSIM4v7lambdaGiven = TRUE; - break; - case BSIM4v7_MOD_VTL : - mod->BSIM4v7vtl = value->rValue; - mod->BSIM4v7vtlGiven = TRUE; - break; - case BSIM4v7_MOD_XN: - mod->BSIM4v7xn = value->rValue; - mod->BSIM4v7xnGiven = TRUE; - break; - case BSIM4v7_MOD_LC: - mod->BSIM4v7lc = value->rValue; - mod->BSIM4v7lcGiven = TRUE; - break; - case BSIM4v7_MOD_TNOIA : - mod->BSIM4v7tnoia = value->rValue; - mod->BSIM4v7tnoiaGiven = TRUE; - break; - case BSIM4v7_MOD_TNOIB : - mod->BSIM4v7tnoib = value->rValue; - mod->BSIM4v7tnoibGiven = TRUE; - break; - case BSIM4v7_MOD_TNOIC : - mod->BSIM4v7tnoic = value->rValue; - mod->BSIM4v7tnoicGiven = TRUE; - break; - case BSIM4v7_MOD_RNOIA : - mod->BSIM4v7rnoia = value->rValue; - mod->BSIM4v7rnoiaGiven = TRUE; - break; - case BSIM4v7_MOD_RNOIB : - mod->BSIM4v7rnoib = value->rValue; - mod->BSIM4v7rnoibGiven = TRUE; - break; - case BSIM4v7_MOD_RNOIC : - mod->BSIM4v7rnoic = value->rValue; - mod->BSIM4v7rnoicGiven = TRUE; - break; - case BSIM4v7_MOD_NTNOI : - mod->BSIM4v7ntnoi = value->rValue; - mod->BSIM4v7ntnoiGiven = TRUE; - break; - case BSIM4v7_MOD_VFBSDOFF: - mod->BSIM4v7vfbsdoff = value->rValue; - mod->BSIM4v7vfbsdoffGiven = TRUE; - break; - case BSIM4v7_MOD_TVFBSDOFF: - mod->BSIM4v7tvfbsdoff = value->rValue; - mod->BSIM4v7tvfbsdoffGiven = TRUE; - break; - case BSIM4v7_MOD_LINTNOI: - mod->BSIM4v7lintnoi = value->rValue; - mod->BSIM4v7lintnoiGiven = TRUE; - break; - - /* stress effect */ - case BSIM4v7_MOD_SAREF : - mod->BSIM4v7saref = value->rValue; - mod->BSIM4v7sarefGiven = TRUE; - break; - case BSIM4v7_MOD_SBREF : - mod->BSIM4v7sbref = value->rValue; - mod->BSIM4v7sbrefGiven = TRUE; - break; - case BSIM4v7_MOD_WLOD : - mod->BSIM4v7wlod = value->rValue; - mod->BSIM4v7wlodGiven = TRUE; - break; - case BSIM4v7_MOD_KU0 : - mod->BSIM4v7ku0 = value->rValue; - mod->BSIM4v7ku0Given = TRUE; - break; - case BSIM4v7_MOD_KVSAT : - mod->BSIM4v7kvsat = value->rValue; - mod->BSIM4v7kvsatGiven = TRUE; - break; - case BSIM4v7_MOD_KVTH0 : - mod->BSIM4v7kvth0 = value->rValue; - mod->BSIM4v7kvth0Given = TRUE; - break; - case BSIM4v7_MOD_TKU0 : - mod->BSIM4v7tku0 = value->rValue; - mod->BSIM4v7tku0Given = TRUE; - break; - case BSIM4v7_MOD_LLODKU0 : - mod->BSIM4v7llodku0 = value->rValue; - mod->BSIM4v7llodku0Given = TRUE; - break; - case BSIM4v7_MOD_WLODKU0 : - mod->BSIM4v7wlodku0 = value->rValue; - mod->BSIM4v7wlodku0Given = TRUE; - break; - case BSIM4v7_MOD_LLODVTH : - mod->BSIM4v7llodvth = value->rValue; - mod->BSIM4v7llodvthGiven = TRUE; - break; - case BSIM4v7_MOD_WLODVTH : - mod->BSIM4v7wlodvth = value->rValue; - mod->BSIM4v7wlodvthGiven = TRUE; - break; - case BSIM4v7_MOD_LKU0 : - mod->BSIM4v7lku0 = value->rValue; - mod->BSIM4v7lku0Given = TRUE; - break; - case BSIM4v7_MOD_WKU0 : - mod->BSIM4v7wku0 = value->rValue; - mod->BSIM4v7wku0Given = TRUE; - break; - case BSIM4v7_MOD_PKU0 : - mod->BSIM4v7pku0 = value->rValue; - mod->BSIM4v7pku0Given = TRUE; - break; - case BSIM4v7_MOD_LKVTH0 : - mod->BSIM4v7lkvth0 = value->rValue; - mod->BSIM4v7lkvth0Given = TRUE; - break; - case BSIM4v7_MOD_WKVTH0 : - mod->BSIM4v7wkvth0 = value->rValue; - mod->BSIM4v7wkvth0Given = TRUE; - break; - case BSIM4v7_MOD_PKVTH0 : - mod->BSIM4v7pkvth0 = value->rValue; - mod->BSIM4v7pkvth0Given = TRUE; - break; - case BSIM4v7_MOD_STK2 : - mod->BSIM4v7stk2 = value->rValue; - mod->BSIM4v7stk2Given = TRUE; - break; - case BSIM4v7_MOD_LODK2 : - mod->BSIM4v7lodk2 = value->rValue; - mod->BSIM4v7lodk2Given = TRUE; - break; - case BSIM4v7_MOD_STETA0 : - mod->BSIM4v7steta0 = value->rValue; - mod->BSIM4v7steta0Given = TRUE; - break; - case BSIM4v7_MOD_LODETA0 : - mod->BSIM4v7lodeta0 = value->rValue; - mod->BSIM4v7lodeta0Given = TRUE; - break; - - case BSIM4v7_MOD_WEB : - mod->BSIM4v7web = value->rValue; - mod->BSIM4v7webGiven = TRUE; - break; - case BSIM4v7_MOD_WEC : - mod->BSIM4v7wec = value->rValue; - mod->BSIM4v7wecGiven = TRUE; - break; - case BSIM4v7_MOD_KVTH0WE : - mod->BSIM4v7kvth0we = value->rValue; - mod->BSIM4v7kvth0weGiven = TRUE; - break; - case BSIM4v7_MOD_K2WE : - mod->BSIM4v7k2we = value->rValue; - mod->BSIM4v7k2weGiven = TRUE; - break; - case BSIM4v7_MOD_KU0WE : - mod->BSIM4v7ku0we = value->rValue; - mod->BSIM4v7ku0weGiven = TRUE; - break; - case BSIM4v7_MOD_SCREF : - mod->BSIM4v7scref = value->rValue; - mod->BSIM4v7screfGiven = TRUE; - break; - case BSIM4v7_MOD_WPEMOD : - mod->BSIM4v7wpemod = value->rValue; - mod->BSIM4v7wpemodGiven = TRUE; - break; - case BSIM4v7_MOD_LKVTH0WE : - mod->BSIM4v7lkvth0we = value->rValue; - mod->BSIM4v7lkvth0weGiven = TRUE; - break; - case BSIM4v7_MOD_LK2WE : - mod->BSIM4v7lk2we = value->rValue; - mod->BSIM4v7lk2weGiven = TRUE; - break; - case BSIM4v7_MOD_LKU0WE : - mod->BSIM4v7lku0we = value->rValue; - mod->BSIM4v7lku0weGiven = TRUE; - break; - case BSIM4v7_MOD_WKVTH0WE : - mod->BSIM4v7wkvth0we = value->rValue; - mod->BSIM4v7wkvth0weGiven = TRUE; - break; - case BSIM4v7_MOD_WK2WE : - mod->BSIM4v7wk2we = value->rValue; - mod->BSIM4v7wk2weGiven = TRUE; - break; - case BSIM4v7_MOD_WKU0WE : - mod->BSIM4v7wku0we = value->rValue; - mod->BSIM4v7wku0weGiven = TRUE; - break; - case BSIM4v7_MOD_PKVTH0WE : - mod->BSIM4v7pkvth0we = value->rValue; - mod->BSIM4v7pkvth0weGiven = TRUE; - break; - case BSIM4v7_MOD_PK2WE : - mod->BSIM4v7pk2we = value->rValue; - mod->BSIM4v7pk2weGiven = TRUE; - break; - case BSIM4v7_MOD_PKU0WE : - mod->BSIM4v7pku0we = value->rValue; - mod->BSIM4v7pku0weGiven = TRUE; - break; - - case BSIM4v7_MOD_BETA0 : - mod->BSIM4v7beta0 = value->rValue; - mod->BSIM4v7beta0Given = TRUE; - break; - case BSIM4v7_MOD_IJTHDFWD : - mod->BSIM4v7ijthdfwd = value->rValue; - mod->BSIM4v7ijthdfwdGiven = TRUE; - break; - case BSIM4v7_MOD_IJTHSFWD : - mod->BSIM4v7ijthsfwd = value->rValue; - mod->BSIM4v7ijthsfwdGiven = TRUE; - break; - case BSIM4v7_MOD_IJTHDREV : - mod->BSIM4v7ijthdrev = value->rValue; - mod->BSIM4v7ijthdrevGiven = TRUE; - break; - case BSIM4v7_MOD_IJTHSREV : - mod->BSIM4v7ijthsrev = value->rValue; - mod->BSIM4v7ijthsrevGiven = TRUE; - break; - case BSIM4v7_MOD_XJBVD : - mod->BSIM4v7xjbvd = value->rValue; - mod->BSIM4v7xjbvdGiven = TRUE; - break; - case BSIM4v7_MOD_XJBVS : - mod->BSIM4v7xjbvs = value->rValue; - mod->BSIM4v7xjbvsGiven = TRUE; - break; - case BSIM4v7_MOD_BVD : - mod->BSIM4v7bvd = value->rValue; - mod->BSIM4v7bvdGiven = TRUE; - break; - case BSIM4v7_MOD_BVS : - mod->BSIM4v7bvs = value->rValue; - mod->BSIM4v7bvsGiven = TRUE; - break; - - /* reverse diode */ - case BSIM4v7_MOD_JTSS : - mod->BSIM4v7jtss = value->rValue; - mod->BSIM4v7jtssGiven = TRUE; - break; - case BSIM4v7_MOD_JTSD : - mod->BSIM4v7jtsd = value->rValue; - mod->BSIM4v7jtsdGiven = TRUE; - break; - case BSIM4v7_MOD_JTSSWS : - mod->BSIM4v7jtssws = value->rValue; - mod->BSIM4v7jtsswsGiven = TRUE; - break; - case BSIM4v7_MOD_JTSSWD : - mod->BSIM4v7jtsswd = value->rValue; - mod->BSIM4v7jtsswdGiven = TRUE; - break; - case BSIM4v7_MOD_JTSSWGS : - mod->BSIM4v7jtsswgs = value->rValue; - mod->BSIM4v7jtsswgsGiven = TRUE; - break; - case BSIM4v7_MOD_JTSSWGD : - mod->BSIM4v7jtsswgd = value->rValue; - mod->BSIM4v7jtsswgdGiven = TRUE; - break; - case BSIM4v7_MOD_JTWEFF : - mod->BSIM4v7jtweff = value->rValue; - mod->BSIM4v7jtweffGiven = TRUE; - break; - case BSIM4v7_MOD_NJTS : - mod->BSIM4v7njts = value->rValue; - mod->BSIM4v7njtsGiven = TRUE; - break; - case BSIM4v7_MOD_NJTSSW : - mod->BSIM4v7njtssw = value->rValue; - mod->BSIM4v7njtsswGiven = TRUE; - break; - case BSIM4v7_MOD_NJTSSWG : - mod->BSIM4v7njtsswg = value->rValue; - mod->BSIM4v7njtsswgGiven = TRUE; - break; - case BSIM4v7_MOD_NJTSD : - mod->BSIM4v7njtsd = value->rValue; - mod->BSIM4v7njtsdGiven = TRUE; - break; - case BSIM4v7_MOD_NJTSSWD : - mod->BSIM4v7njtsswd = value->rValue; - mod->BSIM4v7njtsswdGiven = TRUE; - break; - case BSIM4v7_MOD_NJTSSWGD : - mod->BSIM4v7njtsswgd = value->rValue; - mod->BSIM4v7njtsswgdGiven = TRUE; - break; - case BSIM4v7_MOD_XTSS : - mod->BSIM4v7xtss = value->rValue; - mod->BSIM4v7xtssGiven = TRUE; - break; - case BSIM4v7_MOD_XTSD : - mod->BSIM4v7xtsd = value->rValue; - mod->BSIM4v7xtsdGiven = TRUE; - break; - case BSIM4v7_MOD_XTSSWS : - mod->BSIM4v7xtssws = value->rValue; - mod->BSIM4v7xtsswsGiven = TRUE; - break; - case BSIM4v7_MOD_XTSSWD : - mod->BSIM4v7xtsswd = value->rValue; - mod->BSIM4v7xtsswdGiven = TRUE; - break; - case BSIM4v7_MOD_XTSSWGS : - mod->BSIM4v7xtsswgs = value->rValue; - mod->BSIM4v7xtsswgsGiven = TRUE; - break; - case BSIM4v7_MOD_XTSSWGD : - mod->BSIM4v7xtsswgd = value->rValue; - mod->BSIM4v7xtsswgdGiven = TRUE; - break; - case BSIM4v7_MOD_TNJTS : - mod->BSIM4v7tnjts = value->rValue; - mod->BSIM4v7tnjtsGiven = TRUE; - break; - case BSIM4v7_MOD_TNJTSSW : - mod->BSIM4v7tnjtssw = value->rValue; - mod->BSIM4v7tnjtsswGiven = TRUE; - break; - case BSIM4v7_MOD_TNJTSSWG : - mod->BSIM4v7tnjtsswg = value->rValue; - mod->BSIM4v7tnjtsswgGiven = TRUE; - break; - case BSIM4v7_MOD_TNJTSD : - mod->BSIM4v7tnjtsd = value->rValue; - mod->BSIM4v7tnjtsdGiven = TRUE; - break; - case BSIM4v7_MOD_TNJTSSWD : - mod->BSIM4v7tnjtsswd = value->rValue; - mod->BSIM4v7tnjtsswdGiven = TRUE; - break; - case BSIM4v7_MOD_TNJTSSWGD : - mod->BSIM4v7tnjtsswgd = value->rValue; - mod->BSIM4v7tnjtsswgdGiven = TRUE; - break; - case BSIM4v7_MOD_VTSS : - mod->BSIM4v7vtss = value->rValue; - mod->BSIM4v7vtssGiven = TRUE; - break; - case BSIM4v7_MOD_VTSD : - mod->BSIM4v7vtsd = value->rValue; - mod->BSIM4v7vtsdGiven = TRUE; - break; - case BSIM4v7_MOD_VTSSWS : - mod->BSIM4v7vtssws = value->rValue; - mod->BSIM4v7vtsswsGiven = TRUE; - break; - case BSIM4v7_MOD_VTSSWD : - mod->BSIM4v7vtsswd = value->rValue; - mod->BSIM4v7vtsswdGiven = TRUE; - break; - case BSIM4v7_MOD_VTSSWGS : - mod->BSIM4v7vtsswgs = value->rValue; - mod->BSIM4v7vtsswgsGiven = TRUE; - break; - case BSIM4v7_MOD_VTSSWGD : - mod->BSIM4v7vtsswgd = value->rValue; - mod->BSIM4v7vtsswgdGiven = TRUE; - break; - - case BSIM4v7_MOD_VFB : - mod->BSIM4v7vfb = value->rValue; - mod->BSIM4v7vfbGiven = TRUE; - break; - - case BSIM4v7_MOD_GBMIN : - mod->BSIM4v7gbmin = value->rValue; - mod->BSIM4v7gbminGiven = TRUE; - break; - case BSIM4v7_MOD_RBDB : - mod->BSIM4v7rbdb = value->rValue; - mod->BSIM4v7rbdbGiven = TRUE; - break; - case BSIM4v7_MOD_RBPB : - mod->BSIM4v7rbpb = value->rValue; - mod->BSIM4v7rbpbGiven = TRUE; - break; - case BSIM4v7_MOD_RBSB : - mod->BSIM4v7rbsb = value->rValue; - mod->BSIM4v7rbsbGiven = TRUE; - break; - case BSIM4v7_MOD_RBPS : - mod->BSIM4v7rbps = value->rValue; - mod->BSIM4v7rbpsGiven = TRUE; - break; - case BSIM4v7_MOD_RBPD : - mod->BSIM4v7rbpd = value->rValue; - mod->BSIM4v7rbpdGiven = TRUE; - break; - - case BSIM4v7_MOD_RBPS0 : - mod->BSIM4v7rbps0 = value->rValue; - mod->BSIM4v7rbps0Given = TRUE; - break; - case BSIM4v7_MOD_RBPSL : - mod->BSIM4v7rbpsl = value->rValue; - mod->BSIM4v7rbpslGiven = TRUE; - break; - case BSIM4v7_MOD_RBPSW : - mod->BSIM4v7rbpsw = value->rValue; - mod->BSIM4v7rbpswGiven = TRUE; - break; - case BSIM4v7_MOD_RBPSNF : - mod->BSIM4v7rbpsnf = value->rValue; - mod->BSIM4v7rbpsnfGiven = TRUE; - break; - - case BSIM4v7_MOD_RBPD0 : - mod->BSIM4v7rbpd0 = value->rValue; - mod->BSIM4v7rbpd0Given = TRUE; - break; - case BSIM4v7_MOD_RBPDL : - mod->BSIM4v7rbpdl = value->rValue; - mod->BSIM4v7rbpdlGiven = TRUE; - break; - case BSIM4v7_MOD_RBPDW : - mod->BSIM4v7rbpdw = value->rValue; - mod->BSIM4v7rbpdwGiven = TRUE; - break; - case BSIM4v7_MOD_RBPDNF : - mod->BSIM4v7rbpdnf = value->rValue; - mod->BSIM4v7rbpdnfGiven = TRUE; - break; - - case BSIM4v7_MOD_RBPBX0 : - mod->BSIM4v7rbpbx0 = value->rValue; - mod->BSIM4v7rbpbx0Given = TRUE; - break; - case BSIM4v7_MOD_RBPBXL : - mod->BSIM4v7rbpbxl = value->rValue; - mod->BSIM4v7rbpbxlGiven = TRUE; - break; - case BSIM4v7_MOD_RBPBXW : - mod->BSIM4v7rbpbxw = value->rValue; - mod->BSIM4v7rbpbxwGiven = TRUE; - break; - case BSIM4v7_MOD_RBPBXNF : - mod->BSIM4v7rbpbxnf = value->rValue; - mod->BSIM4v7rbpbxnfGiven = TRUE; - break; - case BSIM4v7_MOD_RBPBY0 : - mod->BSIM4v7rbpby0 = value->rValue; - mod->BSIM4v7rbpby0Given = TRUE; - break; - case BSIM4v7_MOD_RBPBYL : - mod->BSIM4v7rbpbyl = value->rValue; - mod->BSIM4v7rbpbylGiven = TRUE; - break; - case BSIM4v7_MOD_RBPBYW : - mod->BSIM4v7rbpbyw = value->rValue; - mod->BSIM4v7rbpbywGiven = TRUE; - break; - case BSIM4v7_MOD_RBPBYNF : - mod->BSIM4v7rbpbynf = value->rValue; - mod->BSIM4v7rbpbynfGiven = TRUE; - break; - case BSIM4v7_MOD_RBSBX0 : - mod->BSIM4v7rbsbx0 = value->rValue; - mod->BSIM4v7rbsbx0Given = TRUE; - break; - case BSIM4v7_MOD_RBSBY0 : - mod->BSIM4v7rbsby0 = value->rValue; - mod->BSIM4v7rbsby0Given = TRUE; - break; - case BSIM4v7_MOD_RBDBX0 : - mod->BSIM4v7rbdbx0 = value->rValue; - mod->BSIM4v7rbdbx0Given = TRUE; - break; - case BSIM4v7_MOD_RBDBY0 : - mod->BSIM4v7rbdby0 = value->rValue; - mod->BSIM4v7rbdby0Given = TRUE; - break; - - - case BSIM4v7_MOD_RBSDBXL : - mod->BSIM4v7rbsdbxl = value->rValue; - mod->BSIM4v7rbsdbxlGiven = TRUE; - break; - case BSIM4v7_MOD_RBSDBXW : - mod->BSIM4v7rbsdbxw = value->rValue; - mod->BSIM4v7rbsdbxwGiven = TRUE; - break; - case BSIM4v7_MOD_RBSDBXNF : - mod->BSIM4v7rbsdbxnf = value->rValue; - mod->BSIM4v7rbsdbxnfGiven = TRUE; - break; - case BSIM4v7_MOD_RBSDBYL : - mod->BSIM4v7rbsdbyl = value->rValue; - mod->BSIM4v7rbsdbylGiven = TRUE; - break; - case BSIM4v7_MOD_RBSDBYW : - mod->BSIM4v7rbsdbyw = value->rValue; - mod->BSIM4v7rbsdbywGiven = TRUE; - break; - case BSIM4v7_MOD_RBSDBYNF : - mod->BSIM4v7rbsdbynf = value->rValue; - mod->BSIM4v7rbsdbynfGiven = TRUE; - break; - - case BSIM4v7_MOD_CGSL : - mod->BSIM4v7cgsl = value->rValue; - mod->BSIM4v7cgslGiven = TRUE; - break; - case BSIM4v7_MOD_CGDL : - mod->BSIM4v7cgdl = value->rValue; - mod->BSIM4v7cgdlGiven = TRUE; - break; - case BSIM4v7_MOD_CKAPPAS : - mod->BSIM4v7ckappas = value->rValue; - mod->BSIM4v7ckappasGiven = TRUE; - break; - case BSIM4v7_MOD_CKAPPAD : - mod->BSIM4v7ckappad = value->rValue; - mod->BSIM4v7ckappadGiven = TRUE; - break; - case BSIM4v7_MOD_CF : - mod->BSIM4v7cf = value->rValue; - mod->BSIM4v7cfGiven = TRUE; - break; - case BSIM4v7_MOD_CLC : - mod->BSIM4v7clc = value->rValue; - mod->BSIM4v7clcGiven = TRUE; - break; - case BSIM4v7_MOD_CLE : - mod->BSIM4v7cle = value->rValue; - mod->BSIM4v7cleGiven = TRUE; - break; - case BSIM4v7_MOD_DWC : - mod->BSIM4v7dwc = value->rValue; - mod->BSIM4v7dwcGiven = TRUE; - break; - case BSIM4v7_MOD_DLC : - mod->BSIM4v7dlc = value->rValue; - mod->BSIM4v7dlcGiven = TRUE; - break; - case BSIM4v7_MOD_XW : - mod->BSIM4v7xw = value->rValue; - mod->BSIM4v7xwGiven = TRUE; - break; - case BSIM4v7_MOD_XL : - mod->BSIM4v7xl = value->rValue; - mod->BSIM4v7xlGiven = TRUE; - break; - case BSIM4v7_MOD_DLCIG : - mod->BSIM4v7dlcig = value->rValue; - mod->BSIM4v7dlcigGiven = TRUE; - break; - case BSIM4v7_MOD_DLCIGD : - mod->BSIM4v7dlcigd = value->rValue; - mod->BSIM4v7dlcigdGiven = TRUE; - break; - case BSIM4v7_MOD_DWJ : - mod->BSIM4v7dwj = value->rValue; - mod->BSIM4v7dwjGiven = TRUE; - break; - case BSIM4v7_MOD_VFBCV : - mod->BSIM4v7vfbcv = value->rValue; - mod->BSIM4v7vfbcvGiven = TRUE; - break; - case BSIM4v7_MOD_ACDE : - mod->BSIM4v7acde = value->rValue; - mod->BSIM4v7acdeGiven = TRUE; - break; - case BSIM4v7_MOD_MOIN : - mod->BSIM4v7moin = value->rValue; - mod->BSIM4v7moinGiven = TRUE; - break; - case BSIM4v7_MOD_NOFF : - mod->BSIM4v7noff = value->rValue; - mod->BSIM4v7noffGiven = TRUE; - break; - case BSIM4v7_MOD_VOFFCV : - mod->BSIM4v7voffcv = value->rValue; - mod->BSIM4v7voffcvGiven = TRUE; - break; - case BSIM4v7_MOD_DMCG : - mod->BSIM4v7dmcg = value->rValue; - mod->BSIM4v7dmcgGiven = TRUE; - break; - case BSIM4v7_MOD_DMCI : - mod->BSIM4v7dmci = value->rValue; - mod->BSIM4v7dmciGiven = TRUE; - break; - case BSIM4v7_MOD_DMDG : - mod->BSIM4v7dmdg = value->rValue; - mod->BSIM4v7dmdgGiven = TRUE; - break; - case BSIM4v7_MOD_DMCGT : - mod->BSIM4v7dmcgt = value->rValue; - mod->BSIM4v7dmcgtGiven = TRUE; - break; - case BSIM4v7_MOD_XGW : - mod->BSIM4v7xgw = value->rValue; - mod->BSIM4v7xgwGiven = TRUE; - break; - case BSIM4v7_MOD_XGL : - mod->BSIM4v7xgl = value->rValue; - mod->BSIM4v7xglGiven = TRUE; - break; - case BSIM4v7_MOD_RSHG : - mod->BSIM4v7rshg = value->rValue; - mod->BSIM4v7rshgGiven = TRUE; - break; - case BSIM4v7_MOD_NGCON : - mod->BSIM4v7ngcon = value->rValue; - mod->BSIM4v7ngconGiven = TRUE; - break; - case BSIM4v7_MOD_TCJ : - mod->BSIM4v7tcj = value->rValue; - mod->BSIM4v7tcjGiven = TRUE; - break; - case BSIM4v7_MOD_TPB : - mod->BSIM4v7tpb = value->rValue; - mod->BSIM4v7tpbGiven = TRUE; - break; - case BSIM4v7_MOD_TCJSW : - mod->BSIM4v7tcjsw = value->rValue; - mod->BSIM4v7tcjswGiven = TRUE; - break; - case BSIM4v7_MOD_TPBSW : - mod->BSIM4v7tpbsw = value->rValue; - mod->BSIM4v7tpbswGiven = TRUE; - break; - case BSIM4v7_MOD_TCJSWG : - mod->BSIM4v7tcjswg = value->rValue; - mod->BSIM4v7tcjswgGiven = TRUE; - break; - case BSIM4v7_MOD_TPBSWG : - mod->BSIM4v7tpbswg = value->rValue; - mod->BSIM4v7tpbswgGiven = TRUE; - break; - - /* Length dependence */ - case BSIM4v7_MOD_LCDSC : - mod->BSIM4v7lcdsc = value->rValue; - mod->BSIM4v7lcdscGiven = TRUE; - break; - - - case BSIM4v7_MOD_LCDSCB : - mod->BSIM4v7lcdscb = value->rValue; - mod->BSIM4v7lcdscbGiven = TRUE; - break; - case BSIM4v7_MOD_LCDSCD : - mod->BSIM4v7lcdscd = value->rValue; - mod->BSIM4v7lcdscdGiven = TRUE; - break; - case BSIM4v7_MOD_LCIT : - mod->BSIM4v7lcit = value->rValue; - mod->BSIM4v7lcitGiven = TRUE; - break; - case BSIM4v7_MOD_LNFACTOR : - mod->BSIM4v7lnfactor = value->rValue; - mod->BSIM4v7lnfactorGiven = TRUE; - break; - case BSIM4v7_MOD_LXJ: - mod->BSIM4v7lxj = value->rValue; - mod->BSIM4v7lxjGiven = TRUE; - break; - case BSIM4v7_MOD_LVSAT: - mod->BSIM4v7lvsat = value->rValue; - mod->BSIM4v7lvsatGiven = TRUE; - break; - - - case BSIM4v7_MOD_LA0: - mod->BSIM4v7la0 = value->rValue; - mod->BSIM4v7la0Given = TRUE; - break; - case BSIM4v7_MOD_LAGS: - mod->BSIM4v7lags = value->rValue; - mod->BSIM4v7lagsGiven = TRUE; - break; - case BSIM4v7_MOD_LA1: - mod->BSIM4v7la1 = value->rValue; - mod->BSIM4v7la1Given = TRUE; - break; - case BSIM4v7_MOD_LA2: - mod->BSIM4v7la2 = value->rValue; - mod->BSIM4v7la2Given = TRUE; - break; - case BSIM4v7_MOD_LAT: - mod->BSIM4v7lat = value->rValue; - mod->BSIM4v7latGiven = TRUE; - break; - case BSIM4v7_MOD_LKETA: - mod->BSIM4v7lketa = value->rValue; - mod->BSIM4v7lketaGiven = TRUE; - break; - case BSIM4v7_MOD_LNSUB: - mod->BSIM4v7lnsub = value->rValue; - mod->BSIM4v7lnsubGiven = TRUE; - break; - case BSIM4v7_MOD_LNDEP: - mod->BSIM4v7lndep = value->rValue; - mod->BSIM4v7lndepGiven = TRUE; - if (mod->BSIM4v7lndep > 1.0e20) - mod->BSIM4v7lndep *= 1.0e-6; - break; - case BSIM4v7_MOD_LNSD: - mod->BSIM4v7lnsd = value->rValue; - mod->BSIM4v7lnsdGiven = TRUE; - if (mod->BSIM4v7lnsd > 1.0e23) - mod->BSIM4v7lnsd *= 1.0e-6; - break; - case BSIM4v7_MOD_LNGATE: - mod->BSIM4v7lngate = value->rValue; - mod->BSIM4v7lngateGiven = TRUE; - if (mod->BSIM4v7lngate > 1.0e23) - mod->BSIM4v7lngate *= 1.0e-6; - break; - case BSIM4v7_MOD_LGAMMA1: - mod->BSIM4v7lgamma1 = value->rValue; - mod->BSIM4v7lgamma1Given = TRUE; - break; - case BSIM4v7_MOD_LGAMMA2: - mod->BSIM4v7lgamma2 = value->rValue; - mod->BSIM4v7lgamma2Given = TRUE; - break; - case BSIM4v7_MOD_LVBX: - mod->BSIM4v7lvbx = value->rValue; - mod->BSIM4v7lvbxGiven = TRUE; - break; - case BSIM4v7_MOD_LVBM: - mod->BSIM4v7lvbm = value->rValue; - mod->BSIM4v7lvbmGiven = TRUE; - break; - case BSIM4v7_MOD_LXT: - mod->BSIM4v7lxt = value->rValue; - mod->BSIM4v7lxtGiven = TRUE; - break; - case BSIM4v7_MOD_LK1: - mod->BSIM4v7lk1 = value->rValue; - mod->BSIM4v7lk1Given = TRUE; - break; - case BSIM4v7_MOD_LKT1: - mod->BSIM4v7lkt1 = value->rValue; - mod->BSIM4v7lkt1Given = TRUE; - break; - case BSIM4v7_MOD_LKT1L: - mod->BSIM4v7lkt1l = value->rValue; - mod->BSIM4v7lkt1lGiven = TRUE; - break; - case BSIM4v7_MOD_LKT2: - mod->BSIM4v7lkt2 = value->rValue; - mod->BSIM4v7lkt2Given = TRUE; - break; - case BSIM4v7_MOD_LK2: - mod->BSIM4v7lk2 = value->rValue; - mod->BSIM4v7lk2Given = TRUE; - break; - case BSIM4v7_MOD_LK3: - mod->BSIM4v7lk3 = value->rValue; - mod->BSIM4v7lk3Given = TRUE; - break; - case BSIM4v7_MOD_LK3B: - mod->BSIM4v7lk3b = value->rValue; - mod->BSIM4v7lk3bGiven = TRUE; - break; - case BSIM4v7_MOD_LLPE0: - mod->BSIM4v7llpe0 = value->rValue; - mod->BSIM4v7llpe0Given = TRUE; - break; - case BSIM4v7_MOD_LLPEB: - mod->BSIM4v7llpeb = value->rValue; - mod->BSIM4v7llpebGiven = TRUE; - break; - case BSIM4v7_MOD_LDVTP0: - mod->BSIM4v7ldvtp0 = value->rValue; - mod->BSIM4v7ldvtp0Given = TRUE; - break; - case BSIM4v7_MOD_LDVTP1: - mod->BSIM4v7ldvtp1 = value->rValue; - mod->BSIM4v7ldvtp1Given = TRUE; - break; - case BSIM4v7_MOD_LDVTP2: /* New DIBL/Rout */ - mod->BSIM4v7ldvtp2 = value->rValue; - mod->BSIM4v7ldvtp2Given = TRUE; - break; - case BSIM4v7_MOD_LDVTP3: - mod->BSIM4v7ldvtp3 = value->rValue; - mod->BSIM4v7ldvtp3Given = TRUE; - break; - case BSIM4v7_MOD_LDVTP4: - mod->BSIM4v7ldvtp4 = value->rValue; - mod->BSIM4v7ldvtp4Given = TRUE; - break; - case BSIM4v7_MOD_LDVTP5: - mod->BSIM4v7ldvtp5 = value->rValue; - mod->BSIM4v7ldvtp5Given = TRUE; - break; - case BSIM4v7_MOD_LW0: - mod->BSIM4v7lw0 = value->rValue; - mod->BSIM4v7lw0Given = TRUE; - break; - case BSIM4v7_MOD_LDVT0: - mod->BSIM4v7ldvt0 = value->rValue; - mod->BSIM4v7ldvt0Given = TRUE; - break; - case BSIM4v7_MOD_LDVT1: - mod->BSIM4v7ldvt1 = value->rValue; - mod->BSIM4v7ldvt1Given = TRUE; - break; - case BSIM4v7_MOD_LDVT2: - mod->BSIM4v7ldvt2 = value->rValue; - mod->BSIM4v7ldvt2Given = TRUE; - break; - case BSIM4v7_MOD_LDVT0W: - mod->BSIM4v7ldvt0w = value->rValue; - mod->BSIM4v7ldvt0wGiven = TRUE; - break; - case BSIM4v7_MOD_LDVT1W: - mod->BSIM4v7ldvt1w = value->rValue; - mod->BSIM4v7ldvt1wGiven = TRUE; - break; - case BSIM4v7_MOD_LDVT2W: - mod->BSIM4v7ldvt2w = value->rValue; - mod->BSIM4v7ldvt2wGiven = TRUE; - break; - case BSIM4v7_MOD_LDROUT: - mod->BSIM4v7ldrout = value->rValue; - mod->BSIM4v7ldroutGiven = TRUE; - break; - case BSIM4v7_MOD_LDSUB: - mod->BSIM4v7ldsub = value->rValue; - mod->BSIM4v7ldsubGiven = TRUE; - break; - case BSIM4v7_MOD_LVTH0: - mod->BSIM4v7lvth0 = value->rValue; - mod->BSIM4v7lvth0Given = TRUE; - break; - case BSIM4v7_MOD_LUA: - mod->BSIM4v7lua = value->rValue; - mod->BSIM4v7luaGiven = TRUE; - break; - case BSIM4v7_MOD_LUA1: - mod->BSIM4v7lua1 = value->rValue; - mod->BSIM4v7lua1Given = TRUE; - break; - case BSIM4v7_MOD_LUB: - mod->BSIM4v7lub = value->rValue; - mod->BSIM4v7lubGiven = TRUE; - break; - case BSIM4v7_MOD_LUB1: - mod->BSIM4v7lub1 = value->rValue; - mod->BSIM4v7lub1Given = TRUE; - break; - case BSIM4v7_MOD_LUC: - mod->BSIM4v7luc = value->rValue; - mod->BSIM4v7lucGiven = TRUE; - break; - case BSIM4v7_MOD_LUC1: - mod->BSIM4v7luc1 = value->rValue; - mod->BSIM4v7luc1Given = TRUE; - break; - case BSIM4v7_MOD_LU0 : - mod->BSIM4v7lu0 = value->rValue; - mod->BSIM4v7lu0Given = TRUE; - break; - case BSIM4v7_MOD_LUTE : - mod->BSIM4v7lute = value->rValue; - mod->BSIM4v7luteGiven = TRUE; - break; - case BSIM4v7_MOD_LUCSTE : - mod->BSIM4v7lucste = value->rValue; - mod->BSIM4v7lucsteGiven = TRUE; - break; - case BSIM4v7_MOD_LVOFF: - mod->BSIM4v7lvoff = value->rValue; - mod->BSIM4v7lvoffGiven = TRUE; - break; - case BSIM4v7_MOD_LTVOFF: - mod->BSIM4v7ltvoff = value->rValue; - mod->BSIM4v7ltvoffGiven = TRUE; - break; - case BSIM4v7_MOD_LTNFACTOR: /* v4.7 temp dep of leakage current */ - mod->BSIM4v7ltnfactor = value->rValue; - mod->BSIM4v7ltnfactorGiven = TRUE; - break; - case BSIM4v7_MOD_LTETA0: /* v4.7 temp dep of leakage current */ - mod->BSIM4v7lteta0 = value->rValue; - mod->BSIM4v7lteta0Given = TRUE; - break; - case BSIM4v7_MOD_LTVOFFCV: /* v4.7 temp dep of leakage current */ - mod->BSIM4v7ltvoffcv = value->rValue; - mod->BSIM4v7ltvoffcvGiven = TRUE; - break; - case BSIM4v7_MOD_LMINV: - mod->BSIM4v7lminv = value->rValue; - mod->BSIM4v7lminvGiven = TRUE; - break; - case BSIM4v7_MOD_LMINVCV: - mod->BSIM4v7lminvcv = value->rValue; - mod->BSIM4v7lminvcvGiven = TRUE; - break; - case BSIM4v7_MOD_LFPROUT: - mod->BSIM4v7lfprout = value->rValue; - mod->BSIM4v7lfproutGiven = TRUE; - break; - case BSIM4v7_MOD_LPDITS: - mod->BSIM4v7lpdits = value->rValue; - mod->BSIM4v7lpditsGiven = TRUE; - break; - case BSIM4v7_MOD_LPDITSD: - mod->BSIM4v7lpditsd = value->rValue; - mod->BSIM4v7lpditsdGiven = TRUE; - break; - case BSIM4v7_MOD_LDELTA : - mod->BSIM4v7ldelta = value->rValue; - mod->BSIM4v7ldeltaGiven = TRUE; - break; - case BSIM4v7_MOD_LRDSW: - mod->BSIM4v7lrdsw = value->rValue; - mod->BSIM4v7lrdswGiven = TRUE; - break; - case BSIM4v7_MOD_LRDW: - mod->BSIM4v7lrdw = value->rValue; - mod->BSIM4v7lrdwGiven = TRUE; - break; - case BSIM4v7_MOD_LRSW: - mod->BSIM4v7lrsw = value->rValue; - mod->BSIM4v7lrswGiven = TRUE; - break; - case BSIM4v7_MOD_LPRWB: - mod->BSIM4v7lprwb = value->rValue; - mod->BSIM4v7lprwbGiven = TRUE; - break; - case BSIM4v7_MOD_LPRWG: - mod->BSIM4v7lprwg = value->rValue; - mod->BSIM4v7lprwgGiven = TRUE; - break; - case BSIM4v7_MOD_LPRT: - mod->BSIM4v7lprt = value->rValue; - mod->BSIM4v7lprtGiven = TRUE; - break; - case BSIM4v7_MOD_LETA0: - mod->BSIM4v7leta0 = value->rValue; - mod->BSIM4v7leta0Given = TRUE; - break; - case BSIM4v7_MOD_LETAB: - mod->BSIM4v7letab = value->rValue; - mod->BSIM4v7letabGiven = TRUE; - break; - case BSIM4v7_MOD_LPCLM: - mod->BSIM4v7lpclm = value->rValue; - mod->BSIM4v7lpclmGiven = TRUE; - break; - case BSIM4v7_MOD_LPDIBL1: - mod->BSIM4v7lpdibl1 = value->rValue; - mod->BSIM4v7lpdibl1Given = TRUE; - break; - case BSIM4v7_MOD_LPDIBL2: - mod->BSIM4v7lpdibl2 = value->rValue; - mod->BSIM4v7lpdibl2Given = TRUE; - break; - case BSIM4v7_MOD_LPDIBLB: - mod->BSIM4v7lpdiblb = value->rValue; - mod->BSIM4v7lpdiblbGiven = TRUE; - break; - case BSIM4v7_MOD_LPSCBE1: - mod->BSIM4v7lpscbe1 = value->rValue; - mod->BSIM4v7lpscbe1Given = TRUE; - break; - case BSIM4v7_MOD_LPSCBE2: - mod->BSIM4v7lpscbe2 = value->rValue; - mod->BSIM4v7lpscbe2Given = TRUE; - break; - case BSIM4v7_MOD_LPVAG: - mod->BSIM4v7lpvag = value->rValue; - mod->BSIM4v7lpvagGiven = TRUE; - break; - case BSIM4v7_MOD_LWR : - mod->BSIM4v7lwr = value->rValue; - mod->BSIM4v7lwrGiven = TRUE; - break; - case BSIM4v7_MOD_LDWG : - mod->BSIM4v7ldwg = value->rValue; - mod->BSIM4v7ldwgGiven = TRUE; - break; - case BSIM4v7_MOD_LDWB : - mod->BSIM4v7ldwb = value->rValue; - mod->BSIM4v7ldwbGiven = TRUE; - break; - case BSIM4v7_MOD_LB0 : - mod->BSIM4v7lb0 = value->rValue; - mod->BSIM4v7lb0Given = TRUE; - break; - case BSIM4v7_MOD_LB1 : - mod->BSIM4v7lb1 = value->rValue; - mod->BSIM4v7lb1Given = TRUE; - break; - case BSIM4v7_MOD_LALPHA0 : - mod->BSIM4v7lalpha0 = value->rValue; - mod->BSIM4v7lalpha0Given = TRUE; - break; - case BSIM4v7_MOD_LALPHA1 : - mod->BSIM4v7lalpha1 = value->rValue; - mod->BSIM4v7lalpha1Given = TRUE; - break; - case BSIM4v7_MOD_LBETA0 : - mod->BSIM4v7lbeta0 = value->rValue; - mod->BSIM4v7lbeta0Given = TRUE; - break; - case BSIM4v7_MOD_LPHIN : - mod->BSIM4v7lphin = value->rValue; - mod->BSIM4v7lphinGiven = TRUE; - break; - case BSIM4v7_MOD_LAGIDL : - mod->BSIM4v7lagidl = value->rValue; - mod->BSIM4v7lagidlGiven = TRUE; - break; - case BSIM4v7_MOD_LBGIDL : - mod->BSIM4v7lbgidl = value->rValue; - mod->BSIM4v7lbgidlGiven = TRUE; - break; - case BSIM4v7_MOD_LCGIDL : - mod->BSIM4v7lcgidl = value->rValue; - mod->BSIM4v7lcgidlGiven = TRUE; - break; - case BSIM4v7_MOD_LEGIDL : - mod->BSIM4v7legidl = value->rValue; - mod->BSIM4v7legidlGiven = TRUE; - break; - case BSIM4v7_MOD_LFGIDL : /* v4.7 New GIDL/GISL */ - mod->BSIM4v7lfgidl = value->rValue; - mod->BSIM4v7lfgidlGiven = TRUE; - break; - case BSIM4v7_MOD_LKGIDL : /* v4.7 New GIDL/GISL */ - mod->BSIM4v7lkgidl = value->rValue; - mod->BSIM4v7lkgidlGiven = TRUE; - break; - case BSIM4v7_MOD_LRGIDL : /* v4.7 New GIDL/GISL */ - mod->BSIM4v7lrgidl = value->rValue; - mod->BSIM4v7lrgidlGiven = TRUE; - break; - case BSIM4v7_MOD_LAGISL : - mod->BSIM4v7lagisl = value->rValue; - mod->BSIM4v7lagislGiven = TRUE; - break; - case BSIM4v7_MOD_LBGISL : - mod->BSIM4v7lbgisl = value->rValue; - mod->BSIM4v7lbgislGiven = TRUE; - break; - case BSIM4v7_MOD_LCGISL : - mod->BSIM4v7lcgisl = value->rValue; - mod->BSIM4v7lcgislGiven = TRUE; - break; - case BSIM4v7_MOD_LEGISL : - mod->BSIM4v7legisl = value->rValue; - mod->BSIM4v7legislGiven = TRUE; - break; - case BSIM4v7_MOD_LFGISL : /* v4.7 New GIDL/GISL */ - mod->BSIM4v7lfgisl = value->rValue; - mod->BSIM4v7lfgislGiven = TRUE; - break; - case BSIM4v7_MOD_LKGISL : /* v4.7 New GIDL/GISL */ - mod->BSIM4v7lkgisl = value->rValue; - mod->BSIM4v7lkgislGiven = TRUE; - break; - case BSIM4v7_MOD_LRGISL : /* v4.7 New GIDL/GISL */ - mod->BSIM4v7lrgisl = value->rValue; - mod->BSIM4v7lrgislGiven = TRUE; - break; - case BSIM4v7_MOD_LAIGC : - mod->BSIM4v7laigc = value->rValue; - mod->BSIM4v7laigcGiven = TRUE; - break; - case BSIM4v7_MOD_LBIGC : - mod->BSIM4v7lbigc = value->rValue; - mod->BSIM4v7lbigcGiven = TRUE; - break; - case BSIM4v7_MOD_LCIGC : - mod->BSIM4v7lcigc = value->rValue; - mod->BSIM4v7lcigcGiven = TRUE; - break; - case BSIM4v7_MOD_LAIGSD : - mod->BSIM4v7laigsd = value->rValue; - mod->BSIM4v7laigsdGiven = TRUE; - break; - case BSIM4v7_MOD_LBIGSD : - mod->BSIM4v7lbigsd = value->rValue; - mod->BSIM4v7lbigsdGiven = TRUE; - break; - case BSIM4v7_MOD_LCIGSD : - mod->BSIM4v7lcigsd = value->rValue; - mod->BSIM4v7lcigsdGiven = TRUE; - break; - case BSIM4v7_MOD_LAIGS : - mod->BSIM4v7laigs = value->rValue; - mod->BSIM4v7laigsGiven = TRUE; - break; - case BSIM4v7_MOD_LBIGS : - mod->BSIM4v7lbigs = value->rValue; - mod->BSIM4v7lbigsGiven = TRUE; - break; - case BSIM4v7_MOD_LCIGS : - mod->BSIM4v7lcigs = value->rValue; - mod->BSIM4v7lcigsGiven = TRUE; - break; - case BSIM4v7_MOD_LAIGD : - mod->BSIM4v7laigd = value->rValue; - mod->BSIM4v7laigdGiven = TRUE; - break; - case BSIM4v7_MOD_LBIGD : - mod->BSIM4v7lbigd = value->rValue; - mod->BSIM4v7lbigdGiven = TRUE; - break; - case BSIM4v7_MOD_LCIGD : - mod->BSIM4v7lcigd = value->rValue; - mod->BSIM4v7lcigdGiven = TRUE; - break; - case BSIM4v7_MOD_LAIGBACC : - mod->BSIM4v7laigbacc = value->rValue; - mod->BSIM4v7laigbaccGiven = TRUE; - break; - case BSIM4v7_MOD_LBIGBACC : - mod->BSIM4v7lbigbacc = value->rValue; - mod->BSIM4v7lbigbaccGiven = TRUE; - break; - case BSIM4v7_MOD_LCIGBACC : - mod->BSIM4v7lcigbacc = value->rValue; - mod->BSIM4v7lcigbaccGiven = TRUE; - break; - case BSIM4v7_MOD_LAIGBINV : - mod->BSIM4v7laigbinv = value->rValue; - mod->BSIM4v7laigbinvGiven = TRUE; - break; - case BSIM4v7_MOD_LBIGBINV : - mod->BSIM4v7lbigbinv = value->rValue; - mod->BSIM4v7lbigbinvGiven = TRUE; - break; - case BSIM4v7_MOD_LCIGBINV : - mod->BSIM4v7lcigbinv = value->rValue; - mod->BSIM4v7lcigbinvGiven = TRUE; - break; - case BSIM4v7_MOD_LNIGC : - mod->BSIM4v7lnigc = value->rValue; - mod->BSIM4v7lnigcGiven = TRUE; - break; - case BSIM4v7_MOD_LNIGBINV : - mod->BSIM4v7lnigbinv = value->rValue; - mod->BSIM4v7lnigbinvGiven = TRUE; - break; - case BSIM4v7_MOD_LNIGBACC : - mod->BSIM4v7lnigbacc = value->rValue; - mod->BSIM4v7lnigbaccGiven = TRUE; - break; - case BSIM4v7_MOD_LNTOX : - mod->BSIM4v7lntox = value->rValue; - mod->BSIM4v7lntoxGiven = TRUE; - break; - case BSIM4v7_MOD_LEIGBINV : - mod->BSIM4v7leigbinv = value->rValue; - mod->BSIM4v7leigbinvGiven = TRUE; - break; - case BSIM4v7_MOD_LPIGCD : - mod->BSIM4v7lpigcd = value->rValue; - mod->BSIM4v7lpigcdGiven = TRUE; - break; - case BSIM4v7_MOD_LPOXEDGE : - mod->BSIM4v7lpoxedge = value->rValue; - mod->BSIM4v7lpoxedgeGiven = TRUE; - break; - case BSIM4v7_MOD_LXRCRG1 : - mod->BSIM4v7lxrcrg1 = value->rValue; - mod->BSIM4v7lxrcrg1Given = TRUE; - break; - case BSIM4v7_MOD_LXRCRG2 : - mod->BSIM4v7lxrcrg2 = value->rValue; - mod->BSIM4v7lxrcrg2Given = TRUE; - break; - case BSIM4v7_MOD_LLAMBDA : - mod->BSIM4v7llambda = value->rValue; - mod->BSIM4v7llambdaGiven = TRUE; - break; - case BSIM4v7_MOD_LVTL : - mod->BSIM4v7lvtl = value->rValue; - mod->BSIM4v7lvtlGiven = TRUE; - break; - case BSIM4v7_MOD_LXN: - mod->BSIM4v7lxn = value->rValue; - mod->BSIM4v7lxnGiven = TRUE; - break; - case BSIM4v7_MOD_LVFBSDOFF: - mod->BSIM4v7lvfbsdoff = value->rValue; - mod->BSIM4v7lvfbsdoffGiven = TRUE; - break; - case BSIM4v7_MOD_LTVFBSDOFF: - mod->BSIM4v7ltvfbsdoff = value->rValue; - mod->BSIM4v7ltvfbsdoffGiven = TRUE; - break; - case BSIM4v7_MOD_LEU : - mod->BSIM4v7leu = value->rValue; - mod->BSIM4v7leuGiven = TRUE; - break; - case BSIM4v7_MOD_LUCS : - mod->BSIM4v7lucs = value->rValue; - mod->BSIM4v7lucsGiven = TRUE; - break; - case BSIM4v7_MOD_LVFB : - mod->BSIM4v7lvfb = value->rValue; - mod->BSIM4v7lvfbGiven = TRUE; - break; - case BSIM4v7_MOD_LCGSL : - mod->BSIM4v7lcgsl = value->rValue; - mod->BSIM4v7lcgslGiven = TRUE; - break; - case BSIM4v7_MOD_LCGDL : - mod->BSIM4v7lcgdl = value->rValue; - mod->BSIM4v7lcgdlGiven = TRUE; - break; - case BSIM4v7_MOD_LCKAPPAS : - mod->BSIM4v7lckappas = value->rValue; - mod->BSIM4v7lckappasGiven = TRUE; - break; - case BSIM4v7_MOD_LCKAPPAD : - mod->BSIM4v7lckappad = value->rValue; - mod->BSIM4v7lckappadGiven = TRUE; - break; - case BSIM4v7_MOD_LCF : - mod->BSIM4v7lcf = value->rValue; - mod->BSIM4v7lcfGiven = TRUE; - break; - case BSIM4v7_MOD_LCLC : - mod->BSIM4v7lclc = value->rValue; - mod->BSIM4v7lclcGiven = TRUE; - break; - case BSIM4v7_MOD_LCLE : - mod->BSIM4v7lcle = value->rValue; - mod->BSIM4v7lcleGiven = TRUE; - break; - case BSIM4v7_MOD_LVFBCV : - mod->BSIM4v7lvfbcv = value->rValue; - mod->BSIM4v7lvfbcvGiven = TRUE; - break; - case BSIM4v7_MOD_LACDE : - mod->BSIM4v7lacde = value->rValue; - mod->BSIM4v7lacdeGiven = TRUE; - break; - case BSIM4v7_MOD_LMOIN : - mod->BSIM4v7lmoin = value->rValue; - mod->BSIM4v7lmoinGiven = TRUE; - break; - case BSIM4v7_MOD_LNOFF : - mod->BSIM4v7lnoff = value->rValue; - mod->BSIM4v7lnoffGiven = TRUE; - break; - case BSIM4v7_MOD_LVOFFCV : - mod->BSIM4v7lvoffcv = value->rValue; - mod->BSIM4v7lvoffcvGiven = TRUE; - break; - - /* Width dependence */ - case BSIM4v7_MOD_WCDSC : - mod->BSIM4v7wcdsc = value->rValue; - mod->BSIM4v7wcdscGiven = TRUE; - break; - - - case BSIM4v7_MOD_WCDSCB : - mod->BSIM4v7wcdscb = value->rValue; - mod->BSIM4v7wcdscbGiven = TRUE; - break; - case BSIM4v7_MOD_WCDSCD : - mod->BSIM4v7wcdscd = value->rValue; - mod->BSIM4v7wcdscdGiven = TRUE; - break; - case BSIM4v7_MOD_WCIT : - mod->BSIM4v7wcit = value->rValue; - mod->BSIM4v7wcitGiven = TRUE; - break; - case BSIM4v7_MOD_WNFACTOR : - mod->BSIM4v7wnfactor = value->rValue; - mod->BSIM4v7wnfactorGiven = TRUE; - break; - case BSIM4v7_MOD_WXJ: - mod->BSIM4v7wxj = value->rValue; - mod->BSIM4v7wxjGiven = TRUE; - break; - case BSIM4v7_MOD_WVSAT: - mod->BSIM4v7wvsat = value->rValue; - mod->BSIM4v7wvsatGiven = TRUE; - break; - - - case BSIM4v7_MOD_WA0: - mod->BSIM4v7wa0 = value->rValue; - mod->BSIM4v7wa0Given = TRUE; - break; - case BSIM4v7_MOD_WAGS: - mod->BSIM4v7wags = value->rValue; - mod->BSIM4v7wagsGiven = TRUE; - break; - case BSIM4v7_MOD_WA1: - mod->BSIM4v7wa1 = value->rValue; - mod->BSIM4v7wa1Given = TRUE; - break; - case BSIM4v7_MOD_WA2: - mod->BSIM4v7wa2 = value->rValue; - mod->BSIM4v7wa2Given = TRUE; - break; - case BSIM4v7_MOD_WAT: - mod->BSIM4v7wat = value->rValue; - mod->BSIM4v7watGiven = TRUE; - break; - case BSIM4v7_MOD_WKETA: - mod->BSIM4v7wketa = value->rValue; - mod->BSIM4v7wketaGiven = TRUE; - break; - case BSIM4v7_MOD_WNSUB: - mod->BSIM4v7wnsub = value->rValue; - mod->BSIM4v7wnsubGiven = TRUE; - break; - case BSIM4v7_MOD_WNDEP: - mod->BSIM4v7wndep = value->rValue; - mod->BSIM4v7wndepGiven = TRUE; - if (mod->BSIM4v7wndep > 1.0e20) - mod->BSIM4v7wndep *= 1.0e-6; - break; - case BSIM4v7_MOD_WNSD: - mod->BSIM4v7wnsd = value->rValue; - mod->BSIM4v7wnsdGiven = TRUE; - if (mod->BSIM4v7wnsd > 1.0e23) - mod->BSIM4v7wnsd *= 1.0e-6; - break; - case BSIM4v7_MOD_WNGATE: - mod->BSIM4v7wngate = value->rValue; - mod->BSIM4v7wngateGiven = TRUE; - if (mod->BSIM4v7wngate > 1.0e23) - mod->BSIM4v7wngate *= 1.0e-6; - break; - case BSIM4v7_MOD_WGAMMA1: - mod->BSIM4v7wgamma1 = value->rValue; - mod->BSIM4v7wgamma1Given = TRUE; - break; - case BSIM4v7_MOD_WGAMMA2: - mod->BSIM4v7wgamma2 = value->rValue; - mod->BSIM4v7wgamma2Given = TRUE; - break; - case BSIM4v7_MOD_WVBX: - mod->BSIM4v7wvbx = value->rValue; - mod->BSIM4v7wvbxGiven = TRUE; - break; - case BSIM4v7_MOD_WVBM: - mod->BSIM4v7wvbm = value->rValue; - mod->BSIM4v7wvbmGiven = TRUE; - break; - case BSIM4v7_MOD_WXT: - mod->BSIM4v7wxt = value->rValue; - mod->BSIM4v7wxtGiven = TRUE; - break; - case BSIM4v7_MOD_WK1: - mod->BSIM4v7wk1 = value->rValue; - mod->BSIM4v7wk1Given = TRUE; - break; - case BSIM4v7_MOD_WKT1: - mod->BSIM4v7wkt1 = value->rValue; - mod->BSIM4v7wkt1Given = TRUE; - break; - case BSIM4v7_MOD_WKT1L: - mod->BSIM4v7wkt1l = value->rValue; - mod->BSIM4v7wkt1lGiven = TRUE; - break; - case BSIM4v7_MOD_WKT2: - mod->BSIM4v7wkt2 = value->rValue; - mod->BSIM4v7wkt2Given = TRUE; - break; - case BSIM4v7_MOD_WK2: - mod->BSIM4v7wk2 = value->rValue; - mod->BSIM4v7wk2Given = TRUE; - break; - case BSIM4v7_MOD_WK3: - mod->BSIM4v7wk3 = value->rValue; - mod->BSIM4v7wk3Given = TRUE; - break; - case BSIM4v7_MOD_WK3B: - mod->BSIM4v7wk3b = value->rValue; - mod->BSIM4v7wk3bGiven = TRUE; - break; - case BSIM4v7_MOD_WLPE0: - mod->BSIM4v7wlpe0 = value->rValue; - mod->BSIM4v7wlpe0Given = TRUE; - break; - case BSIM4v7_MOD_WLPEB: - mod->BSIM4v7wlpeb = value->rValue; - mod->BSIM4v7wlpebGiven = TRUE; - break; - case BSIM4v7_MOD_WDVTP0: - mod->BSIM4v7wdvtp0 = value->rValue; - mod->BSIM4v7wdvtp0Given = TRUE; - break; - case BSIM4v7_MOD_WDVTP1: - mod->BSIM4v7wdvtp1 = value->rValue; - mod->BSIM4v7wdvtp1Given = TRUE; - break; - case BSIM4v7_MOD_WDVTP2: /* New DIBL/Rout */ - mod->BSIM4v7wdvtp2 = value->rValue; - mod->BSIM4v7wdvtp2Given = TRUE; - break; - case BSIM4v7_MOD_WDVTP3: - mod->BSIM4v7wdvtp3 = value->rValue; - mod->BSIM4v7wdvtp3Given = TRUE; - break; - case BSIM4v7_MOD_WDVTP4: - mod->BSIM4v7wdvtp4 = value->rValue; - mod->BSIM4v7wdvtp4Given = TRUE; - break; - case BSIM4v7_MOD_WDVTP5: - mod->BSIM4v7wdvtp5 = value->rValue; - mod->BSIM4v7wdvtp5Given = TRUE; - break; - case BSIM4v7_MOD_WW0: - mod->BSIM4v7ww0 = value->rValue; - mod->BSIM4v7ww0Given = TRUE; - break; - case BSIM4v7_MOD_WDVT0: - mod->BSIM4v7wdvt0 = value->rValue; - mod->BSIM4v7wdvt0Given = TRUE; - break; - case BSIM4v7_MOD_WDVT1: - mod->BSIM4v7wdvt1 = value->rValue; - mod->BSIM4v7wdvt1Given = TRUE; - break; - case BSIM4v7_MOD_WDVT2: - mod->BSIM4v7wdvt2 = value->rValue; - mod->BSIM4v7wdvt2Given = TRUE; - break; - case BSIM4v7_MOD_WDVT0W: - mod->BSIM4v7wdvt0w = value->rValue; - mod->BSIM4v7wdvt0wGiven = TRUE; - break; - case BSIM4v7_MOD_WDVT1W: - mod->BSIM4v7wdvt1w = value->rValue; - mod->BSIM4v7wdvt1wGiven = TRUE; - break; - case BSIM4v7_MOD_WDVT2W: - mod->BSIM4v7wdvt2w = value->rValue; - mod->BSIM4v7wdvt2wGiven = TRUE; - break; - case BSIM4v7_MOD_WDROUT: - mod->BSIM4v7wdrout = value->rValue; - mod->BSIM4v7wdroutGiven = TRUE; - break; - case BSIM4v7_MOD_WDSUB: - mod->BSIM4v7wdsub = value->rValue; - mod->BSIM4v7wdsubGiven = TRUE; - break; - case BSIM4v7_MOD_WVTH0: - mod->BSIM4v7wvth0 = value->rValue; - mod->BSIM4v7wvth0Given = TRUE; - break; - case BSIM4v7_MOD_WUA: - mod->BSIM4v7wua = value->rValue; - mod->BSIM4v7wuaGiven = TRUE; - break; - case BSIM4v7_MOD_WUA1: - mod->BSIM4v7wua1 = value->rValue; - mod->BSIM4v7wua1Given = TRUE; - break; - case BSIM4v7_MOD_WUB: - mod->BSIM4v7wub = value->rValue; - mod->BSIM4v7wubGiven = TRUE; - break; - case BSIM4v7_MOD_WUB1: - mod->BSIM4v7wub1 = value->rValue; - mod->BSIM4v7wub1Given = TRUE; - break; - case BSIM4v7_MOD_WUC: - mod->BSIM4v7wuc = value->rValue; - mod->BSIM4v7wucGiven = TRUE; - break; - case BSIM4v7_MOD_WUC1: - mod->BSIM4v7wuc1 = value->rValue; - mod->BSIM4v7wuc1Given = TRUE; - break; - case BSIM4v7_MOD_WU0 : - mod->BSIM4v7wu0 = value->rValue; - mod->BSIM4v7wu0Given = TRUE; - break; - case BSIM4v7_MOD_WUTE : - mod->BSIM4v7wute = value->rValue; - mod->BSIM4v7wuteGiven = TRUE; - break; - case BSIM4v7_MOD_WUCSTE : - mod->BSIM4v7wucste = value->rValue; - mod->BSIM4v7wucsteGiven = TRUE; - break; - case BSIM4v7_MOD_WVOFF: - mod->BSIM4v7wvoff = value->rValue; - mod->BSIM4v7wvoffGiven = TRUE; - break; - case BSIM4v7_MOD_WTVOFF: - mod->BSIM4v7wtvoff = value->rValue; - mod->BSIM4v7wtvoffGiven = TRUE; - break; - case BSIM4v7_MOD_WTNFACTOR: /* v4.7 temp dep of leakage current */ - mod->BSIM4v7wtnfactor = value->rValue; - mod->BSIM4v7wtnfactorGiven = TRUE; - break; - case BSIM4v7_MOD_WTETA0: /* v4.7 temp dep of leakage current */ - mod->BSIM4v7wteta0 = value->rValue; - mod->BSIM4v7wteta0Given = TRUE; - break; - case BSIM4v7_MOD_WTVOFFCV: /* v4.7 temp dep of leakage current */ - mod->BSIM4v7wtvoffcv = value->rValue; - mod->BSIM4v7wtvoffcvGiven = TRUE; - break; - case BSIM4v7_MOD_WMINV: - mod->BSIM4v7wminv = value->rValue; - mod->BSIM4v7wminvGiven = TRUE; - break; - case BSIM4v7_MOD_WMINVCV: - mod->BSIM4v7wminvcv = value->rValue; - mod->BSIM4v7wminvcvGiven = TRUE; - break; - case BSIM4v7_MOD_WFPROUT: - mod->BSIM4v7wfprout = value->rValue; - mod->BSIM4v7wfproutGiven = TRUE; - break; - case BSIM4v7_MOD_WPDITS: - mod->BSIM4v7wpdits = value->rValue; - mod->BSIM4v7wpditsGiven = TRUE; - break; - case BSIM4v7_MOD_WPDITSD: - mod->BSIM4v7wpditsd = value->rValue; - mod->BSIM4v7wpditsdGiven = TRUE; - break; - case BSIM4v7_MOD_WDELTA : - mod->BSIM4v7wdelta = value->rValue; - mod->BSIM4v7wdeltaGiven = TRUE; - break; - case BSIM4v7_MOD_WRDSW: - mod->BSIM4v7wrdsw = value->rValue; - mod->BSIM4v7wrdswGiven = TRUE; - break; - case BSIM4v7_MOD_WRDW: - mod->BSIM4v7wrdw = value->rValue; - mod->BSIM4v7wrdwGiven = TRUE; - break; - case BSIM4v7_MOD_WRSW: - mod->BSIM4v7wrsw = value->rValue; - mod->BSIM4v7wrswGiven = TRUE; - break; - case BSIM4v7_MOD_WPRWB: - mod->BSIM4v7wprwb = value->rValue; - mod->BSIM4v7wprwbGiven = TRUE; - break; - case BSIM4v7_MOD_WPRWG: - mod->BSIM4v7wprwg = value->rValue; - mod->BSIM4v7wprwgGiven = TRUE; - break; - case BSIM4v7_MOD_WPRT: - mod->BSIM4v7wprt = value->rValue; - mod->BSIM4v7wprtGiven = TRUE; - break; - case BSIM4v7_MOD_WETA0: - mod->BSIM4v7weta0 = value->rValue; - mod->BSIM4v7weta0Given = TRUE; - break; - case BSIM4v7_MOD_WETAB: - mod->BSIM4v7wetab = value->rValue; - mod->BSIM4v7wetabGiven = TRUE; - break; - case BSIM4v7_MOD_WPCLM: - mod->BSIM4v7wpclm = value->rValue; - mod->BSIM4v7wpclmGiven = TRUE; - break; - case BSIM4v7_MOD_WPDIBL1: - mod->BSIM4v7wpdibl1 = value->rValue; - mod->BSIM4v7wpdibl1Given = TRUE; - break; - case BSIM4v7_MOD_WPDIBL2: - mod->BSIM4v7wpdibl2 = value->rValue; - mod->BSIM4v7wpdibl2Given = TRUE; - break; - case BSIM4v7_MOD_WPDIBLB: - mod->BSIM4v7wpdiblb = value->rValue; - mod->BSIM4v7wpdiblbGiven = TRUE; - break; - case BSIM4v7_MOD_WPSCBE1: - mod->BSIM4v7wpscbe1 = value->rValue; - mod->BSIM4v7wpscbe1Given = TRUE; - break; - case BSIM4v7_MOD_WPSCBE2: - mod->BSIM4v7wpscbe2 = value->rValue; - mod->BSIM4v7wpscbe2Given = TRUE; - break; - case BSIM4v7_MOD_WPVAG: - mod->BSIM4v7wpvag = value->rValue; - mod->BSIM4v7wpvagGiven = TRUE; - break; - case BSIM4v7_MOD_WWR : - mod->BSIM4v7wwr = value->rValue; - mod->BSIM4v7wwrGiven = TRUE; - break; - case BSIM4v7_MOD_WDWG : - mod->BSIM4v7wdwg = value->rValue; - mod->BSIM4v7wdwgGiven = TRUE; - break; - case BSIM4v7_MOD_WDWB : - mod->BSIM4v7wdwb = value->rValue; - mod->BSIM4v7wdwbGiven = TRUE; - break; - case BSIM4v7_MOD_WB0 : - mod->BSIM4v7wb0 = value->rValue; - mod->BSIM4v7wb0Given = TRUE; - break; - case BSIM4v7_MOD_WB1 : - mod->BSIM4v7wb1 = value->rValue; - mod->BSIM4v7wb1Given = TRUE; - break; - case BSIM4v7_MOD_WALPHA0 : - mod->BSIM4v7walpha0 = value->rValue; - mod->BSIM4v7walpha0Given = TRUE; - break; - case BSIM4v7_MOD_WALPHA1 : - mod->BSIM4v7walpha1 = value->rValue; - mod->BSIM4v7walpha1Given = TRUE; - break; - case BSIM4v7_MOD_WBETA0 : - mod->BSIM4v7wbeta0 = value->rValue; - mod->BSIM4v7wbeta0Given = TRUE; - break; - case BSIM4v7_MOD_WPHIN : - mod->BSIM4v7wphin = value->rValue; - mod->BSIM4v7wphinGiven = TRUE; - break; - case BSIM4v7_MOD_WAGIDL : - mod->BSIM4v7wagidl = value->rValue; - mod->BSIM4v7wagidlGiven = TRUE; - break; - case BSIM4v7_MOD_WBGIDL : - mod->BSIM4v7wbgidl = value->rValue; - mod->BSIM4v7wbgidlGiven = TRUE; - break; - case BSIM4v7_MOD_WCGIDL : - mod->BSIM4v7wcgidl = value->rValue; - mod->BSIM4v7wcgidlGiven = TRUE; - break; - case BSIM4v7_MOD_WEGIDL : - mod->BSIM4v7wegidl = value->rValue; - mod->BSIM4v7wegidlGiven = TRUE; - break; - case BSIM4v7_MOD_WFGIDL : /* v4.7 New GIDL/GISL */ - mod->BSIM4v7wfgidl = value->rValue; - mod->BSIM4v7wfgidlGiven = TRUE; - break; - case BSIM4v7_MOD_WKGIDL : /* v4.7 New GIDL/GISL */ - mod->BSIM4v7wkgidl = value->rValue; - mod->BSIM4v7wkgidlGiven = TRUE; - break; - case BSIM4v7_MOD_WRGIDL : /* v4.7 New GIDL/GISL */ - mod->BSIM4v7wrgidl = value->rValue; - mod->BSIM4v7wrgidlGiven = TRUE; - break; - case BSIM4v7_MOD_WAGISL : - mod->BSIM4v7wagisl = value->rValue; - mod->BSIM4v7wagislGiven = TRUE; - break; - case BSIM4v7_MOD_WBGISL : - mod->BSIM4v7wbgisl = value->rValue; - mod->BSIM4v7wbgislGiven = TRUE; - break; - case BSIM4v7_MOD_WCGISL : - mod->BSIM4v7wcgisl = value->rValue; - mod->BSIM4v7wcgislGiven = TRUE; - break; - case BSIM4v7_MOD_WEGISL : - mod->BSIM4v7wegisl = value->rValue; - mod->BSIM4v7wegislGiven = TRUE; - break; - case BSIM4v7_MOD_WFGISL : /* v4.7 New GIDL/GISL */ - mod->BSIM4v7wfgisl = value->rValue; - mod->BSIM4v7wfgislGiven = TRUE; - break; - case BSIM4v7_MOD_WKGISL : /* v4.7 New GIDL/GISL */ - mod->BSIM4v7wkgisl = value->rValue; - mod->BSIM4v7wkgislGiven = TRUE; - break; - case BSIM4v7_MOD_WRGISL : /* v4.7 New GIDL/GISL */ - mod->BSIM4v7wrgisl = value->rValue; - mod->BSIM4v7wrgislGiven = TRUE; - break; - case BSIM4v7_MOD_WAIGC : - mod->BSIM4v7waigc = value->rValue; - mod->BSIM4v7waigcGiven = TRUE; - break; - case BSIM4v7_MOD_WBIGC : - mod->BSIM4v7wbigc = value->rValue; - mod->BSIM4v7wbigcGiven = TRUE; - break; - case BSIM4v7_MOD_WCIGC : - mod->BSIM4v7wcigc = value->rValue; - mod->BSIM4v7wcigcGiven = TRUE; - break; - case BSIM4v7_MOD_WAIGSD : - mod->BSIM4v7waigsd = value->rValue; - mod->BSIM4v7waigsdGiven = TRUE; - break; - case BSIM4v7_MOD_WBIGSD : - mod->BSIM4v7wbigsd = value->rValue; - mod->BSIM4v7wbigsdGiven = TRUE; - break; - case BSIM4v7_MOD_WCIGSD : - mod->BSIM4v7wcigsd = value->rValue; - mod->BSIM4v7wcigsdGiven = TRUE; - break; - case BSIM4v7_MOD_WAIGS : - mod->BSIM4v7waigs = value->rValue; - mod->BSIM4v7waigsGiven = TRUE; - break; - case BSIM4v7_MOD_WBIGS : - mod->BSIM4v7wbigs = value->rValue; - mod->BSIM4v7wbigsGiven = TRUE; - break; - case BSIM4v7_MOD_WCIGS : - mod->BSIM4v7wcigs = value->rValue; - mod->BSIM4v7wcigsGiven = TRUE; - break; - case BSIM4v7_MOD_WAIGD : - mod->BSIM4v7waigd = value->rValue; - mod->BSIM4v7waigdGiven = TRUE; - break; - case BSIM4v7_MOD_WBIGD : - mod->BSIM4v7wbigd = value->rValue; - mod->BSIM4v7wbigdGiven = TRUE; - break; - case BSIM4v7_MOD_WCIGD : - mod->BSIM4v7wcigd = value->rValue; - mod->BSIM4v7wcigdGiven = TRUE; - break; - case BSIM4v7_MOD_WAIGBACC : - mod->BSIM4v7waigbacc = value->rValue; - mod->BSIM4v7waigbaccGiven = TRUE; - break; - case BSIM4v7_MOD_WBIGBACC : - mod->BSIM4v7wbigbacc = value->rValue; - mod->BSIM4v7wbigbaccGiven = TRUE; - break; - case BSIM4v7_MOD_WCIGBACC : - mod->BSIM4v7wcigbacc = value->rValue; - mod->BSIM4v7wcigbaccGiven = TRUE; - break; - case BSIM4v7_MOD_WAIGBINV : - mod->BSIM4v7waigbinv = value->rValue; - mod->BSIM4v7waigbinvGiven = TRUE; - break; - case BSIM4v7_MOD_WBIGBINV : - mod->BSIM4v7wbigbinv = value->rValue; - mod->BSIM4v7wbigbinvGiven = TRUE; - break; - case BSIM4v7_MOD_WCIGBINV : - mod->BSIM4v7wcigbinv = value->rValue; - mod->BSIM4v7wcigbinvGiven = TRUE; - break; - case BSIM4v7_MOD_WNIGC : - mod->BSIM4v7wnigc = value->rValue; - mod->BSIM4v7wnigcGiven = TRUE; - break; - case BSIM4v7_MOD_WNIGBINV : - mod->BSIM4v7wnigbinv = value->rValue; - mod->BSIM4v7wnigbinvGiven = TRUE; - break; - case BSIM4v7_MOD_WNIGBACC : - mod->BSIM4v7wnigbacc = value->rValue; - mod->BSIM4v7wnigbaccGiven = TRUE; - break; - case BSIM4v7_MOD_WNTOX : - mod->BSIM4v7wntox = value->rValue; - mod->BSIM4v7wntoxGiven = TRUE; - break; - case BSIM4v7_MOD_WEIGBINV : - mod->BSIM4v7weigbinv = value->rValue; - mod->BSIM4v7weigbinvGiven = TRUE; - break; - case BSIM4v7_MOD_WPIGCD : - mod->BSIM4v7wpigcd = value->rValue; - mod->BSIM4v7wpigcdGiven = TRUE; - break; - case BSIM4v7_MOD_WPOXEDGE : - mod->BSIM4v7wpoxedge = value->rValue; - mod->BSIM4v7wpoxedgeGiven = TRUE; - break; - case BSIM4v7_MOD_WXRCRG1 : - mod->BSIM4v7wxrcrg1 = value->rValue; - mod->BSIM4v7wxrcrg1Given = TRUE; - break; - case BSIM4v7_MOD_WXRCRG2 : - mod->BSIM4v7wxrcrg2 = value->rValue; - mod->BSIM4v7wxrcrg2Given = TRUE; - break; - case BSIM4v7_MOD_WLAMBDA : - mod->BSIM4v7wlambda = value->rValue; - mod->BSIM4v7wlambdaGiven = TRUE; - break; - case BSIM4v7_MOD_WVTL : - mod->BSIM4v7wvtl = value->rValue; - mod->BSIM4v7wvtlGiven = TRUE; - break; - case BSIM4v7_MOD_WXN: - mod->BSIM4v7wxn = value->rValue; - mod->BSIM4v7wxnGiven = TRUE; - break; - case BSIM4v7_MOD_WVFBSDOFF: - mod->BSIM4v7wvfbsdoff = value->rValue; - mod->BSIM4v7wvfbsdoffGiven = TRUE; - break; - case BSIM4v7_MOD_WTVFBSDOFF: - mod->BSIM4v7wtvfbsdoff = value->rValue; - mod->BSIM4v7wtvfbsdoffGiven = TRUE; - break; - case BSIM4v7_MOD_WEU : - mod->BSIM4v7weu = value->rValue; - mod->BSIM4v7weuGiven = TRUE; - break; - case BSIM4v7_MOD_WUCS : - mod->BSIM4v7wucs = value->rValue; - mod->BSIM4v7wucsGiven = TRUE; - break; - case BSIM4v7_MOD_WVFB : - mod->BSIM4v7wvfb = value->rValue; - mod->BSIM4v7wvfbGiven = TRUE; - break; - case BSIM4v7_MOD_WCGSL : - mod->BSIM4v7wcgsl = value->rValue; - mod->BSIM4v7wcgslGiven = TRUE; - break; - case BSIM4v7_MOD_WCGDL : - mod->BSIM4v7wcgdl = value->rValue; - mod->BSIM4v7wcgdlGiven = TRUE; - break; - case BSIM4v7_MOD_WCKAPPAS : - mod->BSIM4v7wckappas = value->rValue; - mod->BSIM4v7wckappasGiven = TRUE; - break; - case BSIM4v7_MOD_WCKAPPAD : - mod->BSIM4v7wckappad = value->rValue; - mod->BSIM4v7wckappadGiven = TRUE; - break; - case BSIM4v7_MOD_WCF : - mod->BSIM4v7wcf = value->rValue; - mod->BSIM4v7wcfGiven = TRUE; - break; - case BSIM4v7_MOD_WCLC : - mod->BSIM4v7wclc = value->rValue; - mod->BSIM4v7wclcGiven = TRUE; - break; - case BSIM4v7_MOD_WCLE : - mod->BSIM4v7wcle = value->rValue; - mod->BSIM4v7wcleGiven = TRUE; - break; - case BSIM4v7_MOD_WVFBCV : - mod->BSIM4v7wvfbcv = value->rValue; - mod->BSIM4v7wvfbcvGiven = TRUE; - break; - case BSIM4v7_MOD_WACDE : - mod->BSIM4v7wacde = value->rValue; - mod->BSIM4v7wacdeGiven = TRUE; - break; - case BSIM4v7_MOD_WMOIN : - mod->BSIM4v7wmoin = value->rValue; - mod->BSIM4v7wmoinGiven = TRUE; - break; - case BSIM4v7_MOD_WNOFF : - mod->BSIM4v7wnoff = value->rValue; - mod->BSIM4v7wnoffGiven = TRUE; - break; - case BSIM4v7_MOD_WVOFFCV : - mod->BSIM4v7wvoffcv = value->rValue; - mod->BSIM4v7wvoffcvGiven = TRUE; - break; - - /* Cross-term dependence */ - case BSIM4v7_MOD_PCDSC : - mod->BSIM4v7pcdsc = value->rValue; - mod->BSIM4v7pcdscGiven = TRUE; - break; - - - case BSIM4v7_MOD_PCDSCB : - mod->BSIM4v7pcdscb = value->rValue; - mod->BSIM4v7pcdscbGiven = TRUE; - break; - case BSIM4v7_MOD_PCDSCD : - mod->BSIM4v7pcdscd = value->rValue; - mod->BSIM4v7pcdscdGiven = TRUE; - break; - case BSIM4v7_MOD_PCIT : - mod->BSIM4v7pcit = value->rValue; - mod->BSIM4v7pcitGiven = TRUE; - break; - case BSIM4v7_MOD_PNFACTOR : - mod->BSIM4v7pnfactor = value->rValue; - mod->BSIM4v7pnfactorGiven = TRUE; - break; - case BSIM4v7_MOD_PXJ: - mod->BSIM4v7pxj = value->rValue; - mod->BSIM4v7pxjGiven = TRUE; - break; - case BSIM4v7_MOD_PVSAT: - mod->BSIM4v7pvsat = value->rValue; - mod->BSIM4v7pvsatGiven = TRUE; - break; - - - case BSIM4v7_MOD_PA0: - mod->BSIM4v7pa0 = value->rValue; - mod->BSIM4v7pa0Given = TRUE; - break; - case BSIM4v7_MOD_PAGS: - mod->BSIM4v7pags = value->rValue; - mod->BSIM4v7pagsGiven = TRUE; - break; - case BSIM4v7_MOD_PA1: - mod->BSIM4v7pa1 = value->rValue; - mod->BSIM4v7pa1Given = TRUE; - break; - case BSIM4v7_MOD_PA2: - mod->BSIM4v7pa2 = value->rValue; - mod->BSIM4v7pa2Given = TRUE; - break; - case BSIM4v7_MOD_PAT: - mod->BSIM4v7pat = value->rValue; - mod->BSIM4v7patGiven = TRUE; - break; - case BSIM4v7_MOD_PKETA: - mod->BSIM4v7pketa = value->rValue; - mod->BSIM4v7pketaGiven = TRUE; - break; - case BSIM4v7_MOD_PNSUB: - mod->BSIM4v7pnsub = value->rValue; - mod->BSIM4v7pnsubGiven = TRUE; - break; - case BSIM4v7_MOD_PNDEP: - mod->BSIM4v7pndep = value->rValue; - mod->BSIM4v7pndepGiven = TRUE; - if (mod->BSIM4v7pndep > 1.0e20) - mod->BSIM4v7pndep *= 1.0e-6; - break; - case BSIM4v7_MOD_PNSD: - mod->BSIM4v7pnsd = value->rValue; - mod->BSIM4v7pnsdGiven = TRUE; - if (mod->BSIM4v7pnsd > 1.0e23) - mod->BSIM4v7pnsd *= 1.0e-6; - break; - case BSIM4v7_MOD_PNGATE: - mod->BSIM4v7pngate = value->rValue; - mod->BSIM4v7pngateGiven = TRUE; - if (mod->BSIM4v7pngate > 1.0e23) - mod->BSIM4v7pngate *= 1.0e-6; - break; - case BSIM4v7_MOD_PGAMMA1: - mod->BSIM4v7pgamma1 = value->rValue; - mod->BSIM4v7pgamma1Given = TRUE; - break; - case BSIM4v7_MOD_PGAMMA2: - mod->BSIM4v7pgamma2 = value->rValue; - mod->BSIM4v7pgamma2Given = TRUE; - break; - case BSIM4v7_MOD_PVBX: - mod->BSIM4v7pvbx = value->rValue; - mod->BSIM4v7pvbxGiven = TRUE; - break; - case BSIM4v7_MOD_PVBM: - mod->BSIM4v7pvbm = value->rValue; - mod->BSIM4v7pvbmGiven = TRUE; - break; - case BSIM4v7_MOD_PXT: - mod->BSIM4v7pxt = value->rValue; - mod->BSIM4v7pxtGiven = TRUE; - break; - case BSIM4v7_MOD_PK1: - mod->BSIM4v7pk1 = value->rValue; - mod->BSIM4v7pk1Given = TRUE; - break; - case BSIM4v7_MOD_PKT1: - mod->BSIM4v7pkt1 = value->rValue; - mod->BSIM4v7pkt1Given = TRUE; - break; - case BSIM4v7_MOD_PKT1L: - mod->BSIM4v7pkt1l = value->rValue; - mod->BSIM4v7pkt1lGiven = TRUE; - break; - case BSIM4v7_MOD_PKT2: - mod->BSIM4v7pkt2 = value->rValue; - mod->BSIM4v7pkt2Given = TRUE; - break; - case BSIM4v7_MOD_PK2: - mod->BSIM4v7pk2 = value->rValue; - mod->BSIM4v7pk2Given = TRUE; - break; - case BSIM4v7_MOD_PK3: - mod->BSIM4v7pk3 = value->rValue; - mod->BSIM4v7pk3Given = TRUE; - break; - case BSIM4v7_MOD_PK3B: - mod->BSIM4v7pk3b = value->rValue; - mod->BSIM4v7pk3bGiven = TRUE; - break; - case BSIM4v7_MOD_PLPE0: - mod->BSIM4v7plpe0 = value->rValue; - mod->BSIM4v7plpe0Given = TRUE; - break; - case BSIM4v7_MOD_PLPEB: - mod->BSIM4v7plpeb = value->rValue; - mod->BSIM4v7plpebGiven = TRUE; - break; - case BSIM4v7_MOD_PDVTP0: - mod->BSIM4v7pdvtp0 = value->rValue; - mod->BSIM4v7pdvtp0Given = TRUE; - break; - case BSIM4v7_MOD_PDVTP1: - mod->BSIM4v7pdvtp1 = value->rValue; - mod->BSIM4v7pdvtp1Given = TRUE; - break; - case BSIM4v7_MOD_PDVTP2: /* New DIBL/Rout */ - mod->BSIM4v7pdvtp2 = value->rValue; - mod->BSIM4v7pdvtp2Given = TRUE; - break; - case BSIM4v7_MOD_PDVTP3: - mod->BSIM4v7pdvtp3 = value->rValue; - mod->BSIM4v7pdvtp3Given = TRUE; - break; - case BSIM4v7_MOD_PDVTP4: - mod->BSIM4v7pdvtp4 = value->rValue; - mod->BSIM4v7pdvtp4Given = TRUE; - break; - case BSIM4v7_MOD_PDVTP5: - mod->BSIM4v7pdvtp5 = value->rValue; - mod->BSIM4v7pdvtp5Given = TRUE; - break; - case BSIM4v7_MOD_PW0: - mod->BSIM4v7pw0 = value->rValue; - mod->BSIM4v7pw0Given = TRUE; - break; - case BSIM4v7_MOD_PDVT0: - mod->BSIM4v7pdvt0 = value->rValue; - mod->BSIM4v7pdvt0Given = TRUE; - break; - case BSIM4v7_MOD_PDVT1: - mod->BSIM4v7pdvt1 = value->rValue; - mod->BSIM4v7pdvt1Given = TRUE; - break; - case BSIM4v7_MOD_PDVT2: - mod->BSIM4v7pdvt2 = value->rValue; - mod->BSIM4v7pdvt2Given = TRUE; - break; - case BSIM4v7_MOD_PDVT0W: - mod->BSIM4v7pdvt0w = value->rValue; - mod->BSIM4v7pdvt0wGiven = TRUE; - break; - case BSIM4v7_MOD_PDVT1W: - mod->BSIM4v7pdvt1w = value->rValue; - mod->BSIM4v7pdvt1wGiven = TRUE; - break; - case BSIM4v7_MOD_PDVT2W: - mod->BSIM4v7pdvt2w = value->rValue; - mod->BSIM4v7pdvt2wGiven = TRUE; - break; - case BSIM4v7_MOD_PDROUT: - mod->BSIM4v7pdrout = value->rValue; - mod->BSIM4v7pdroutGiven = TRUE; - break; - case BSIM4v7_MOD_PDSUB: - mod->BSIM4v7pdsub = value->rValue; - mod->BSIM4v7pdsubGiven = TRUE; - break; - case BSIM4v7_MOD_PVTH0: - mod->BSIM4v7pvth0 = value->rValue; - mod->BSIM4v7pvth0Given = TRUE; - break; - case BSIM4v7_MOD_PUA: - mod->BSIM4v7pua = value->rValue; - mod->BSIM4v7puaGiven = TRUE; - break; - case BSIM4v7_MOD_PUA1: - mod->BSIM4v7pua1 = value->rValue; - mod->BSIM4v7pua1Given = TRUE; - break; - case BSIM4v7_MOD_PUB: - mod->BSIM4v7pub = value->rValue; - mod->BSIM4v7pubGiven = TRUE; - break; - case BSIM4v7_MOD_PUB1: - mod->BSIM4v7pub1 = value->rValue; - mod->BSIM4v7pub1Given = TRUE; - break; - case BSIM4v7_MOD_PUC: - mod->BSIM4v7puc = value->rValue; - mod->BSIM4v7pucGiven = TRUE; - break; - case BSIM4v7_MOD_PUC1: - mod->BSIM4v7puc1 = value->rValue; - mod->BSIM4v7puc1Given = TRUE; - break; - case BSIM4v7_MOD_PU0 : - mod->BSIM4v7pu0 = value->rValue; - mod->BSIM4v7pu0Given = TRUE; - break; - case BSIM4v7_MOD_PUTE : - mod->BSIM4v7pute = value->rValue; - mod->BSIM4v7puteGiven = TRUE; - break; - case BSIM4v7_MOD_PUCSTE : - mod->BSIM4v7pucste = value->rValue; - mod->BSIM4v7pucsteGiven = TRUE; - break; - case BSIM4v7_MOD_PVOFF: - mod->BSIM4v7pvoff = value->rValue; - mod->BSIM4v7pvoffGiven = TRUE; - break; - case BSIM4v7_MOD_PTVOFF: - mod->BSIM4v7ptvoff = value->rValue; - mod->BSIM4v7ptvoffGiven = TRUE; - break; - case BSIM4v7_MOD_PTNFACTOR: /* v4.7 temp dep of leakage current */ - mod->BSIM4v7ptnfactor = value->rValue; - mod->BSIM4v7ptnfactorGiven = TRUE; - break; - case BSIM4v7_MOD_PTETA0: /* v4.7 temp dep of leakage current */ - mod->BSIM4v7pteta0 = value->rValue; - mod->BSIM4v7pteta0Given = TRUE; - break; - case BSIM4v7_MOD_PTVOFFCV: /* v4.7 temp dep of leakage current */ - mod->BSIM4v7ptvoffcv = value->rValue; - mod->BSIM4v7ptvoffcvGiven = TRUE; - break; - case BSIM4v7_MOD_PMINV: - mod->BSIM4v7pminv = value->rValue; - mod->BSIM4v7pminvGiven = TRUE; - break; - case BSIM4v7_MOD_PMINVCV: - mod->BSIM4v7pminvcv = value->rValue; - mod->BSIM4v7pminvcvGiven = TRUE; - break; - case BSIM4v7_MOD_PFPROUT: - mod->BSIM4v7pfprout = value->rValue; - mod->BSIM4v7pfproutGiven = TRUE; - break; - case BSIM4v7_MOD_PPDITS: - mod->BSIM4v7ppdits = value->rValue; - mod->BSIM4v7ppditsGiven = TRUE; - break; - case BSIM4v7_MOD_PPDITSD: - mod->BSIM4v7ppditsd = value->rValue; - mod->BSIM4v7ppditsdGiven = TRUE; - break; - case BSIM4v7_MOD_PDELTA : - mod->BSIM4v7pdelta = value->rValue; - mod->BSIM4v7pdeltaGiven = TRUE; - break; - case BSIM4v7_MOD_PRDSW: - mod->BSIM4v7prdsw = value->rValue; - mod->BSIM4v7prdswGiven = TRUE; - break; - case BSIM4v7_MOD_PRDW: - mod->BSIM4v7prdw = value->rValue; - mod->BSIM4v7prdwGiven = TRUE; - break; - case BSIM4v7_MOD_PRSW: - mod->BSIM4v7prsw = value->rValue; - mod->BSIM4v7prswGiven = TRUE; - break; - case BSIM4v7_MOD_PPRWB: - mod->BSIM4v7pprwb = value->rValue; - mod->BSIM4v7pprwbGiven = TRUE; - break; - case BSIM4v7_MOD_PPRWG: - mod->BSIM4v7pprwg = value->rValue; - mod->BSIM4v7pprwgGiven = TRUE; - break; - case BSIM4v7_MOD_PPRT: - mod->BSIM4v7pprt = value->rValue; - mod->BSIM4v7pprtGiven = TRUE; - break; - case BSIM4v7_MOD_PETA0: - mod->BSIM4v7peta0 = value->rValue; - mod->BSIM4v7peta0Given = TRUE; - break; - case BSIM4v7_MOD_PETAB: - mod->BSIM4v7petab = value->rValue; - mod->BSIM4v7petabGiven = TRUE; - break; - case BSIM4v7_MOD_PPCLM: - mod->BSIM4v7ppclm = value->rValue; - mod->BSIM4v7ppclmGiven = TRUE; - break; - case BSIM4v7_MOD_PPDIBL1: - mod->BSIM4v7ppdibl1 = value->rValue; - mod->BSIM4v7ppdibl1Given = TRUE; - break; - case BSIM4v7_MOD_PPDIBL2: - mod->BSIM4v7ppdibl2 = value->rValue; - mod->BSIM4v7ppdibl2Given = TRUE; - break; - case BSIM4v7_MOD_PPDIBLB: - mod->BSIM4v7ppdiblb = value->rValue; - mod->BSIM4v7ppdiblbGiven = TRUE; - break; - case BSIM4v7_MOD_PPSCBE1: - mod->BSIM4v7ppscbe1 = value->rValue; - mod->BSIM4v7ppscbe1Given = TRUE; - break; - case BSIM4v7_MOD_PPSCBE2: - mod->BSIM4v7ppscbe2 = value->rValue; - mod->BSIM4v7ppscbe2Given = TRUE; - break; - case BSIM4v7_MOD_PPVAG: - mod->BSIM4v7ppvag = value->rValue; - mod->BSIM4v7ppvagGiven = TRUE; - break; - case BSIM4v7_MOD_PWR : - mod->BSIM4v7pwr = value->rValue; - mod->BSIM4v7pwrGiven = TRUE; - break; - case BSIM4v7_MOD_PDWG : - mod->BSIM4v7pdwg = value->rValue; - mod->BSIM4v7pdwgGiven = TRUE; - break; - case BSIM4v7_MOD_PDWB : - mod->BSIM4v7pdwb = value->rValue; - mod->BSIM4v7pdwbGiven = TRUE; - break; - case BSIM4v7_MOD_PB0 : - mod->BSIM4v7pb0 = value->rValue; - mod->BSIM4v7pb0Given = TRUE; - break; - case BSIM4v7_MOD_PB1 : - mod->BSIM4v7pb1 = value->rValue; - mod->BSIM4v7pb1Given = TRUE; - break; - case BSIM4v7_MOD_PALPHA0 : - mod->BSIM4v7palpha0 = value->rValue; - mod->BSIM4v7palpha0Given = TRUE; - break; - case BSIM4v7_MOD_PALPHA1 : - mod->BSIM4v7palpha1 = value->rValue; - mod->BSIM4v7palpha1Given = TRUE; - break; - case BSIM4v7_MOD_PBETA0 : - mod->BSIM4v7pbeta0 = value->rValue; - mod->BSIM4v7pbeta0Given = TRUE; - break; - case BSIM4v7_MOD_PPHIN : - mod->BSIM4v7pphin = value->rValue; - mod->BSIM4v7pphinGiven = TRUE; - break; - case BSIM4v7_MOD_PAGIDL : - mod->BSIM4v7pagidl = value->rValue; - mod->BSIM4v7pagidlGiven = TRUE; - break; - case BSIM4v7_MOD_PBGIDL : - mod->BSIM4v7pbgidl = value->rValue; - mod->BSIM4v7pbgidlGiven = TRUE; - break; - case BSIM4v7_MOD_PCGIDL : - mod->BSIM4v7pcgidl = value->rValue; - mod->BSIM4v7pcgidlGiven = TRUE; - break; - case BSIM4v7_MOD_PEGIDL : - mod->BSIM4v7pegidl = value->rValue; - mod->BSIM4v7pegidlGiven = TRUE; - break; - case BSIM4v7_MOD_PFGIDL : /* v4.7 New GIDL/GISL */ - mod->BSIM4v7pfgidl = value->rValue; - mod->BSIM4v7pfgidlGiven = TRUE; - break; - case BSIM4v7_MOD_PKGIDL : /* v4.7 New GIDL/GISL */ - mod->BSIM4v7pkgidl = value->rValue; - mod->BSIM4v7pkgidlGiven = TRUE; - break; - case BSIM4v7_MOD_PRGIDL : /* v4.7 New GIDL/GISL */ - mod->BSIM4v7prgidl = value->rValue; - mod->BSIM4v7prgidlGiven = TRUE; - break; - case BSIM4v7_MOD_PAGISL : - mod->BSIM4v7pagisl = value->rValue; - mod->BSIM4v7pagislGiven = TRUE; - break; - case BSIM4v7_MOD_PBGISL : - mod->BSIM4v7pbgisl = value->rValue; - mod->BSIM4v7pbgislGiven = TRUE; - break; - case BSIM4v7_MOD_PCGISL : - mod->BSIM4v7pcgisl = value->rValue; - mod->BSIM4v7pcgislGiven = TRUE; - break; - case BSIM4v7_MOD_PEGISL : - mod->BSIM4v7pegisl = value->rValue; - mod->BSIM4v7pegislGiven = TRUE; - break; - case BSIM4v7_MOD_PFGISL : /* v4.7 New GIDL/GISL */ - mod->BSIM4v7pfgisl = value->rValue; - mod->BSIM4v7pfgislGiven = TRUE; - break; - case BSIM4v7_MOD_PKGISL : /* v4.7 New GIDL/GISL */ - mod->BSIM4v7pkgisl = value->rValue; - mod->BSIM4v7pkgislGiven = TRUE; - break; - case BSIM4v7_MOD_PRGISL : /* v4.7 New GIDL/GISL */ - mod->BSIM4v7prgisl = value->rValue; - mod->BSIM4v7prgislGiven = TRUE; - break; - case BSIM4v7_MOD_PAIGC : - mod->BSIM4v7paigc = value->rValue; - mod->BSIM4v7paigcGiven = TRUE; - break; - case BSIM4v7_MOD_PBIGC : - mod->BSIM4v7pbigc = value->rValue; - mod->BSIM4v7pbigcGiven = TRUE; - break; - case BSIM4v7_MOD_PCIGC : - mod->BSIM4v7pcigc = value->rValue; - mod->BSIM4v7pcigcGiven = TRUE; - break; - case BSIM4v7_MOD_PAIGSD : - mod->BSIM4v7paigsd = value->rValue; - mod->BSIM4v7paigsdGiven = TRUE; - break; - case BSIM4v7_MOD_PBIGSD : - mod->BSIM4v7pbigsd = value->rValue; - mod->BSIM4v7pbigsdGiven = TRUE; - break; - case BSIM4v7_MOD_PCIGSD : - mod->BSIM4v7pcigsd = value->rValue; - mod->BSIM4v7pcigsdGiven = TRUE; - break; - case BSIM4v7_MOD_PAIGS : - mod->BSIM4v7paigs = value->rValue; - mod->BSIM4v7paigsGiven = TRUE; - break; - case BSIM4v7_MOD_PBIGS : - mod->BSIM4v7pbigs = value->rValue; - mod->BSIM4v7pbigsGiven = TRUE; - break; - case BSIM4v7_MOD_PCIGS : - mod->BSIM4v7pcigs = value->rValue; - mod->BSIM4v7pcigsGiven = TRUE; - break; - case BSIM4v7_MOD_PAIGD : - mod->BSIM4v7paigd = value->rValue; - mod->BSIM4v7paigdGiven = TRUE; - break; - case BSIM4v7_MOD_PBIGD : - mod->BSIM4v7pbigd = value->rValue; - mod->BSIM4v7pbigdGiven = TRUE; - break; - case BSIM4v7_MOD_PCIGD : - mod->BSIM4v7pcigd = value->rValue; - mod->BSIM4v7pcigdGiven = TRUE; - break; - case BSIM4v7_MOD_PAIGBACC : - mod->BSIM4v7paigbacc = value->rValue; - mod->BSIM4v7paigbaccGiven = TRUE; - break; - case BSIM4v7_MOD_PBIGBACC : - mod->BSIM4v7pbigbacc = value->rValue; - mod->BSIM4v7pbigbaccGiven = TRUE; - break; - case BSIM4v7_MOD_PCIGBACC : - mod->BSIM4v7pcigbacc = value->rValue; - mod->BSIM4v7pcigbaccGiven = TRUE; - break; - case BSIM4v7_MOD_PAIGBINV : - mod->BSIM4v7paigbinv = value->rValue; - mod->BSIM4v7paigbinvGiven = TRUE; - break; - case BSIM4v7_MOD_PBIGBINV : - mod->BSIM4v7pbigbinv = value->rValue; - mod->BSIM4v7pbigbinvGiven = TRUE; - break; - case BSIM4v7_MOD_PCIGBINV : - mod->BSIM4v7pcigbinv = value->rValue; - mod->BSIM4v7pcigbinvGiven = TRUE; - break; - case BSIM4v7_MOD_PNIGC : - mod->BSIM4v7pnigc = value->rValue; - mod->BSIM4v7pnigcGiven = TRUE; - break; - case BSIM4v7_MOD_PNIGBINV : - mod->BSIM4v7pnigbinv = value->rValue; - mod->BSIM4v7pnigbinvGiven = TRUE; - break; - case BSIM4v7_MOD_PNIGBACC : - mod->BSIM4v7pnigbacc = value->rValue; - mod->BSIM4v7pnigbaccGiven = TRUE; - break; - case BSIM4v7_MOD_PNTOX : - mod->BSIM4v7pntox = value->rValue; - mod->BSIM4v7pntoxGiven = TRUE; - break; - case BSIM4v7_MOD_PEIGBINV : - mod->BSIM4v7peigbinv = value->rValue; - mod->BSIM4v7peigbinvGiven = TRUE; - break; - case BSIM4v7_MOD_PPIGCD : - mod->BSIM4v7ppigcd = value->rValue; - mod->BSIM4v7ppigcdGiven = TRUE; - break; - case BSIM4v7_MOD_PPOXEDGE : - mod->BSIM4v7ppoxedge = value->rValue; - mod->BSIM4v7ppoxedgeGiven = TRUE; - break; - case BSIM4v7_MOD_PXRCRG1 : - mod->BSIM4v7pxrcrg1 = value->rValue; - mod->BSIM4v7pxrcrg1Given = TRUE; - break; - case BSIM4v7_MOD_PXRCRG2 : - mod->BSIM4v7pxrcrg2 = value->rValue; - mod->BSIM4v7pxrcrg2Given = TRUE; - break; - case BSIM4v7_MOD_PLAMBDA : - mod->BSIM4v7plambda = value->rValue; - mod->BSIM4v7plambdaGiven = TRUE; - break; - case BSIM4v7_MOD_PVTL : - mod->BSIM4v7pvtl = value->rValue; - mod->BSIM4v7pvtlGiven = TRUE; - break; - case BSIM4v7_MOD_PXN: - mod->BSIM4v7pxn = value->rValue; - mod->BSIM4v7pxnGiven = TRUE; - break; - case BSIM4v7_MOD_PVFBSDOFF: - mod->BSIM4v7pvfbsdoff = value->rValue; - mod->BSIM4v7pvfbsdoffGiven = TRUE; - break; - case BSIM4v7_MOD_PTVFBSDOFF: - mod->BSIM4v7ptvfbsdoff = value->rValue; - mod->BSIM4v7ptvfbsdoffGiven = TRUE; - break; - case BSIM4v7_MOD_PEU : - mod->BSIM4v7peu = value->rValue; - mod->BSIM4v7peuGiven = TRUE; - break; - case BSIM4v7_MOD_PUCS : - mod->BSIM4v7pucs = value->rValue; - mod->BSIM4v7pucsGiven = TRUE; - break; - case BSIM4v7_MOD_PVFB : - mod->BSIM4v7pvfb = value->rValue; - mod->BSIM4v7pvfbGiven = TRUE; - break; - case BSIM4v7_MOD_PCGSL : - mod->BSIM4v7pcgsl = value->rValue; - mod->BSIM4v7pcgslGiven = TRUE; - break; - case BSIM4v7_MOD_PCGDL : - mod->BSIM4v7pcgdl = value->rValue; - mod->BSIM4v7pcgdlGiven = TRUE; - break; - case BSIM4v7_MOD_PCKAPPAS : - mod->BSIM4v7pckappas = value->rValue; - mod->BSIM4v7pckappasGiven = TRUE; - break; - case BSIM4v7_MOD_PCKAPPAD : - mod->BSIM4v7pckappad = value->rValue; - mod->BSIM4v7pckappadGiven = TRUE; - break; - case BSIM4v7_MOD_PCF : - mod->BSIM4v7pcf = value->rValue; - mod->BSIM4v7pcfGiven = TRUE; - break; - case BSIM4v7_MOD_PCLC : - mod->BSIM4v7pclc = value->rValue; - mod->BSIM4v7pclcGiven = TRUE; - break; - case BSIM4v7_MOD_PCLE : - mod->BSIM4v7pcle = value->rValue; - mod->BSIM4v7pcleGiven = TRUE; - break; - case BSIM4v7_MOD_PVFBCV : - mod->BSIM4v7pvfbcv = value->rValue; - mod->BSIM4v7pvfbcvGiven = TRUE; - break; - case BSIM4v7_MOD_PACDE : - mod->BSIM4v7pacde = value->rValue; - mod->BSIM4v7pacdeGiven = TRUE; - break; - case BSIM4v7_MOD_PMOIN : - mod->BSIM4v7pmoin = value->rValue; - mod->BSIM4v7pmoinGiven = TRUE; - break; - case BSIM4v7_MOD_PNOFF : - mod->BSIM4v7pnoff = value->rValue; - mod->BSIM4v7pnoffGiven = TRUE; - break; - case BSIM4v7_MOD_PVOFFCV : - mod->BSIM4v7pvoffcv = value->rValue; - mod->BSIM4v7pvoffcvGiven = TRUE; - break; - - case BSIM4v7_MOD_TNOM : - mod->BSIM4v7tnom = value->rValue + CONSTCtoK; - mod->BSIM4v7tnomGiven = TRUE; - break; - case BSIM4v7_MOD_CGSO : - mod->BSIM4v7cgso = value->rValue; - mod->BSIM4v7cgsoGiven = TRUE; - break; - case BSIM4v7_MOD_CGDO : - mod->BSIM4v7cgdo = value->rValue; - mod->BSIM4v7cgdoGiven = TRUE; - break; - case BSIM4v7_MOD_CGBO : - mod->BSIM4v7cgbo = value->rValue; - mod->BSIM4v7cgboGiven = TRUE; - break; - case BSIM4v7_MOD_XPART : - mod->BSIM4v7xpart = value->rValue; - mod->BSIM4v7xpartGiven = TRUE; - break; - case BSIM4v7_MOD_RSH : - mod->BSIM4v7sheetResistance = value->rValue; - mod->BSIM4v7sheetResistanceGiven = TRUE; - break; - case BSIM4v7_MOD_JSS : - mod->BSIM4v7SjctSatCurDensity = value->rValue; - mod->BSIM4v7SjctSatCurDensityGiven = TRUE; - break; - case BSIM4v7_MOD_JSWS : - mod->BSIM4v7SjctSidewallSatCurDensity = value->rValue; - mod->BSIM4v7SjctSidewallSatCurDensityGiven = TRUE; - break; - case BSIM4v7_MOD_JSWGS : - mod->BSIM4v7SjctGateSidewallSatCurDensity = value->rValue; - mod->BSIM4v7SjctGateSidewallSatCurDensityGiven = TRUE; - break; - case BSIM4v7_MOD_PBS : - mod->BSIM4v7SbulkJctPotential = value->rValue; - mod->BSIM4v7SbulkJctPotentialGiven = TRUE; - break; - case BSIM4v7_MOD_MJS : - mod->BSIM4v7SbulkJctBotGradingCoeff = value->rValue; - mod->BSIM4v7SbulkJctBotGradingCoeffGiven = TRUE; - break; - case BSIM4v7_MOD_PBSWS : - mod->BSIM4v7SsidewallJctPotential = value->rValue; - mod->BSIM4v7SsidewallJctPotentialGiven = TRUE; - break; - case BSIM4v7_MOD_MJSWS : - mod->BSIM4v7SbulkJctSideGradingCoeff = value->rValue; - mod->BSIM4v7SbulkJctSideGradingCoeffGiven = TRUE; - break; - case BSIM4v7_MOD_CJS : - mod->BSIM4v7SunitAreaJctCap = value->rValue; - mod->BSIM4v7SunitAreaJctCapGiven = TRUE; - break; - case BSIM4v7_MOD_CJSWS : - mod->BSIM4v7SunitLengthSidewallJctCap = value->rValue; - mod->BSIM4v7SunitLengthSidewallJctCapGiven = TRUE; - break; - case BSIM4v7_MOD_NJS : - mod->BSIM4v7SjctEmissionCoeff = value->rValue; - mod->BSIM4v7SjctEmissionCoeffGiven = TRUE; - break; - case BSIM4v7_MOD_PBSWGS : - mod->BSIM4v7SGatesidewallJctPotential = value->rValue; - mod->BSIM4v7SGatesidewallJctPotentialGiven = TRUE; - break; - case BSIM4v7_MOD_MJSWGS : - mod->BSIM4v7SbulkJctGateSideGradingCoeff = value->rValue; - mod->BSIM4v7SbulkJctGateSideGradingCoeffGiven = TRUE; - break; - case BSIM4v7_MOD_CJSWGS : - mod->BSIM4v7SunitLengthGateSidewallJctCap = value->rValue; - mod->BSIM4v7SunitLengthGateSidewallJctCapGiven = TRUE; - break; - case BSIM4v7_MOD_XTIS : - mod->BSIM4v7SjctTempExponent = value->rValue; - mod->BSIM4v7SjctTempExponentGiven = TRUE; - break; - case BSIM4v7_MOD_JSD : - mod->BSIM4v7DjctSatCurDensity = value->rValue; - mod->BSIM4v7DjctSatCurDensityGiven = TRUE; - break; - case BSIM4v7_MOD_JSWD : - mod->BSIM4v7DjctSidewallSatCurDensity = value->rValue; - mod->BSIM4v7DjctSidewallSatCurDensityGiven = TRUE; - break; - case BSIM4v7_MOD_JSWGD : - mod->BSIM4v7DjctGateSidewallSatCurDensity = value->rValue; - mod->BSIM4v7DjctGateSidewallSatCurDensityGiven = TRUE; - break; - case BSIM4v7_MOD_PBD : - mod->BSIM4v7DbulkJctPotential = value->rValue; - mod->BSIM4v7DbulkJctPotentialGiven = TRUE; - break; - case BSIM4v7_MOD_MJD : - mod->BSIM4v7DbulkJctBotGradingCoeff = value->rValue; - mod->BSIM4v7DbulkJctBotGradingCoeffGiven = TRUE; - break; - case BSIM4v7_MOD_PBSWD : - mod->BSIM4v7DsidewallJctPotential = value->rValue; - mod->BSIM4v7DsidewallJctPotentialGiven = TRUE; - break; - case BSIM4v7_MOD_MJSWD : - mod->BSIM4v7DbulkJctSideGradingCoeff = value->rValue; - mod->BSIM4v7DbulkJctSideGradingCoeffGiven = TRUE; - break; - case BSIM4v7_MOD_CJD : - mod->BSIM4v7DunitAreaJctCap = value->rValue; - mod->BSIM4v7DunitAreaJctCapGiven = TRUE; - break; - case BSIM4v7_MOD_CJSWD : - mod->BSIM4v7DunitLengthSidewallJctCap = value->rValue; - mod->BSIM4v7DunitLengthSidewallJctCapGiven = TRUE; - break; - case BSIM4v7_MOD_NJD : - mod->BSIM4v7DjctEmissionCoeff = value->rValue; - mod->BSIM4v7DjctEmissionCoeffGiven = TRUE; - break; - case BSIM4v7_MOD_PBSWGD : - mod->BSIM4v7DGatesidewallJctPotential = value->rValue; - mod->BSIM4v7DGatesidewallJctPotentialGiven = TRUE; - break; - case BSIM4v7_MOD_MJSWGD : - mod->BSIM4v7DbulkJctGateSideGradingCoeff = value->rValue; - mod->BSIM4v7DbulkJctGateSideGradingCoeffGiven = TRUE; - break; - case BSIM4v7_MOD_CJSWGD : - mod->BSIM4v7DunitLengthGateSidewallJctCap = value->rValue; - mod->BSIM4v7DunitLengthGateSidewallJctCapGiven = TRUE; - break; - case BSIM4v7_MOD_XTID : - mod->BSIM4v7DjctTempExponent = value->rValue; - mod->BSIM4v7DjctTempExponentGiven = TRUE; - break; - case BSIM4v7_MOD_LINT : - mod->BSIM4v7Lint = value->rValue; - mod->BSIM4v7LintGiven = TRUE; - break; - case BSIM4v7_MOD_LL : - mod->BSIM4v7Ll = value->rValue; - mod->BSIM4v7LlGiven = TRUE; - break; - case BSIM4v7_MOD_LLC : - mod->BSIM4v7Llc = value->rValue; - mod->BSIM4v7LlcGiven = TRUE; - break; - case BSIM4v7_MOD_LLN : - mod->BSIM4v7Lln = value->rValue; - mod->BSIM4v7LlnGiven = TRUE; - break; - case BSIM4v7_MOD_LW : - mod->BSIM4v7Lw = value->rValue; - mod->BSIM4v7LwGiven = TRUE; - break; - case BSIM4v7_MOD_LWC : - mod->BSIM4v7Lwc = value->rValue; - mod->BSIM4v7LwcGiven = TRUE; - break; - case BSIM4v7_MOD_LWN : - mod->BSIM4v7Lwn = value->rValue; - mod->BSIM4v7LwnGiven = TRUE; - break; - case BSIM4v7_MOD_LWL : - mod->BSIM4v7Lwl = value->rValue; - mod->BSIM4v7LwlGiven = TRUE; - break; - case BSIM4v7_MOD_LWLC : - mod->BSIM4v7Lwlc = value->rValue; - mod->BSIM4v7LwlcGiven = TRUE; - break; - case BSIM4v7_MOD_LMIN : - mod->BSIM4v7Lmin = value->rValue; - mod->BSIM4v7LminGiven = TRUE; - break; - case BSIM4v7_MOD_LMAX : - mod->BSIM4v7Lmax = value->rValue; - mod->BSIM4v7LmaxGiven = TRUE; - break; - case BSIM4v7_MOD_WINT : - mod->BSIM4v7Wint = value->rValue; - mod->BSIM4v7WintGiven = TRUE; - break; - case BSIM4v7_MOD_WL : - mod->BSIM4v7Wl = value->rValue; - mod->BSIM4v7WlGiven = TRUE; - break; - case BSIM4v7_MOD_WLC : - mod->BSIM4v7Wlc = value->rValue; - mod->BSIM4v7WlcGiven = TRUE; - break; - case BSIM4v7_MOD_WLN : - mod->BSIM4v7Wln = value->rValue; - mod->BSIM4v7WlnGiven = TRUE; - break; - case BSIM4v7_MOD_WW : - mod->BSIM4v7Ww = value->rValue; - mod->BSIM4v7WwGiven = TRUE; - break; - case BSIM4v7_MOD_WWC : - mod->BSIM4v7Wwc = value->rValue; - mod->BSIM4v7WwcGiven = TRUE; - break; - case BSIM4v7_MOD_WWN : - mod->BSIM4v7Wwn = value->rValue; - mod->BSIM4v7WwnGiven = TRUE; - break; - case BSIM4v7_MOD_WWL : - mod->BSIM4v7Wwl = value->rValue; - mod->BSIM4v7WwlGiven = TRUE; - break; - case BSIM4v7_MOD_WWLC : - mod->BSIM4v7Wwlc = value->rValue; - mod->BSIM4v7WwlcGiven = TRUE; - break; - case BSIM4v7_MOD_WMIN : - mod->BSIM4v7Wmin = value->rValue; - mod->BSIM4v7WminGiven = TRUE; - break; - case BSIM4v7_MOD_WMAX : - mod->BSIM4v7Wmax = value->rValue; - mod->BSIM4v7WmaxGiven = TRUE; - break; - - case BSIM4v7_MOD_NOIA : - mod->BSIM4v7oxideTrapDensityA = value->rValue; - mod->BSIM4v7oxideTrapDensityAGiven = TRUE; - break; - case BSIM4v7_MOD_NOIB : - mod->BSIM4v7oxideTrapDensityB = value->rValue; - mod->BSIM4v7oxideTrapDensityBGiven = TRUE; - break; - case BSIM4v7_MOD_NOIC : - mod->BSIM4v7oxideTrapDensityC = value->rValue; - mod->BSIM4v7oxideTrapDensityCGiven = TRUE; - break; - case BSIM4v7_MOD_EM : - mod->BSIM4v7em = value->rValue; - mod->BSIM4v7emGiven = TRUE; - break; - case BSIM4v7_MOD_EF : - mod->BSIM4v7ef = value->rValue; - mod->BSIM4v7efGiven = TRUE; - break; - case BSIM4v7_MOD_AF : - mod->BSIM4v7af = value->rValue; - mod->BSIM4v7afGiven = TRUE; - break; - case BSIM4v7_MOD_KF : - mod->BSIM4v7kf = value->rValue; - mod->BSIM4v7kfGiven = TRUE; - break; - - case BSIM4v7_MOD_VGS_MAX: - mod->BSIM4v7vgsMax = value->rValue; - mod->BSIM4v7vgsMaxGiven = TRUE; - break; - case BSIM4v7_MOD_VGD_MAX: - mod->BSIM4v7vgdMax = value->rValue; - mod->BSIM4v7vgdMaxGiven = TRUE; - break; - case BSIM4v7_MOD_VGB_MAX: - mod->BSIM4v7vgbMax = value->rValue; - mod->BSIM4v7vgbMaxGiven = TRUE; - break; - case BSIM4v7_MOD_VDS_MAX: - mod->BSIM4v7vdsMax = value->rValue; - mod->BSIM4v7vdsMaxGiven = TRUE; - break; - case BSIM4v7_MOD_VBS_MAX: - mod->BSIM4v7vbsMax = value->rValue; - mod->BSIM4v7vbsMaxGiven = TRUE; - break; - case BSIM4v7_MOD_VBD_MAX: - mod->BSIM4v7vbdMax = value->rValue; - mod->BSIM4v7vbdMaxGiven = TRUE; - break; - case BSIM4v7_MOD_VGSR_MAX: - mod->BSIM4v7vgsrMax = value->rValue; - mod->BSIM4v7vgsrMaxGiven = TRUE; - break; - case BSIM4v7_MOD_VGDR_MAX: - mod->BSIM4v7vgdrMax = value->rValue; - mod->BSIM4v7vgdrMaxGiven = TRUE; - break; - case BSIM4v7_MOD_VGBR_MAX: - mod->BSIM4v7vgbrMax = value->rValue; - mod->BSIM4v7vgbrMaxGiven = TRUE; - break; - case BSIM4v7_MOD_VBSR_MAX: - mod->BSIM4v7vbsrMax = value->rValue; - mod->BSIM4v7vbsrMaxGiven = TRUE; - break; - case BSIM4v7_MOD_VBDR_MAX: - mod->BSIM4v7vbdrMax = value->rValue; - mod->BSIM4v7vbdrMaxGiven = TRUE; - break; - - case BSIM4v7_MOD_NMOS : - if(value->iValue) { - mod->BSIM4v7type = 1; - mod->BSIM4v7typeGiven = TRUE; - } - break; - case BSIM4v7_MOD_PMOS : - if(value->iValue) { - mod->BSIM4v7type = - 1; - mod->BSIM4v7typeGiven = TRUE; - } - break; - default: - return(E_BADPARM); - } - return(OK); -} - - diff --git a/src/spicelib/devices/bsim4v7/b4v7noi.c b/src/spicelib/devices/bsim4v7/b4v7noi.c deleted file mode 100644 index c9626255e..000000000 --- a/src/spicelib/devices/bsim4v7/b4v7noi.c +++ /dev/null @@ -1,613 +0,0 @@ -/**** BSIM4.7.0 Released by Darsen Lu 04/08/2011 ****/ - -/********** - * Copyright 2006 Regents of the University of California. All rights reserved. - * File: b4noi.c of BSIM4.7.0. - * Author: 2000 Weidong Liu - * Authors: 2001- Xuemei Xi, Mohan Dunga, Ali Niknejad, Chenming Hu. - * Authors: 2006- Mohan Dunga, Ali Niknejad, Chenming Hu - * Authors: 2007- Mohan Dunga, Wenwei Yang, Ali Niknejad, Chenming Hu - * Authors: 2008- Wenwei Yang, Ali Niknejad, Chenming Hu - * Project Director: Prof. Chenming Hu. - * Modified by Xuemei Xi, 04/06/2001. - * Modified by Xuemei Xi, 10/05/2001. - * Modified by Xuemei Xi, 05/09/2003. - * Modified by Xuemei Xi, 03/04/2004. - * Modified by Xuemei Xi, 07/29/2005. - * Modified by Mohan Dunga, 12/13/2006 - * Modified by Wenwei Yang, 07/31/2008. - * Modified by Tanvir Morshed, Darsen Lu 03/27/2011 - **********/ - -#include "ngspice/ngspice.h" -#include "bsim4v7def.h" -#include "ngspice/cktdefs.h" -#include "ngspice/iferrmsg.h" -#include "ngspice/noisedef.h" -#include "ngspice/suffix.h" -#include "ngspice/const.h" - - -/* - * WDL: 1/f noise model has been smoothed out and enhanced with - * bulk charge effect as well as physical N* equ. and necessary - * conversion into the SI unit system. - */ - -static double -Eval1ovFNoise( -double Vds, -BSIM4v7model *model, -BSIM4v7instance *here, -double freq, double temp) -{ -struct bsim4SizeDependParam *pParam; -double cd, esat, DelClm, EffFreq, N0, Nl, Leff, Leffsq; -double T0=0.0, T1, T2, T3, T4, T5, T6, T7, T8, T9, Ssi; - - pParam = here->pParam; - cd = fabs(here->BSIM4v7cd); - Leff = pParam->BSIM4v7leff - 2.0 * model->BSIM4v7lintnoi; - Leffsq = Leff * Leff; - esat = 2.0 * here->BSIM4v7vsattemp / here->BSIM4v7ueff; - if(model->BSIM4v7em<=0.0) DelClm = 0.0; /* flicker noise modified -JX */ - else { - T0 = ((((Vds - here->BSIM4v7Vdseff) / pParam->BSIM4v7litl) - + model->BSIM4v7em) / esat); - DelClm = pParam->BSIM4v7litl * log (MAX(T0, N_MINLOG)); - if (DelClm < 0.0) DelClm = 0.0; /* bugfix */ - } - EffFreq = pow(freq, model->BSIM4v7ef); - T1 = CHARGE * CHARGE * CONSTboltz * cd * temp * here->BSIM4v7ueff; - T2 = 1.0e10 * EffFreq * here->BSIM4v7Abulk * model->BSIM4v7coxe * Leffsq; - N0 = model->BSIM4v7coxe * here->BSIM4v7Vgsteff / CHARGE; - Nl = model->BSIM4v7coxe * here->BSIM4v7Vgsteff - * (1.0 - here->BSIM4v7AbovVgst2Vtm * here->BSIM4v7Vdseff) / CHARGE; - - T3 = model->BSIM4v7oxideTrapDensityA - * log(MAX(((N0 + here->BSIM4v7nstar) / (Nl + here->BSIM4v7nstar)), N_MINLOG)); - T4 = model->BSIM4v7oxideTrapDensityB * (N0 - Nl); - T5 = model->BSIM4v7oxideTrapDensityC * 0.5 * (N0 * N0 - Nl * Nl); - - T6 = CONSTboltz * temp * cd * cd; - T7 = 1.0e10 * EffFreq * Leffsq * pParam->BSIM4v7weff * here->BSIM4v7nf; - T8 = model->BSIM4v7oxideTrapDensityA + model->BSIM4v7oxideTrapDensityB * Nl - + model->BSIM4v7oxideTrapDensityC * Nl * Nl; - T9 = (Nl + here->BSIM4v7nstar) * (Nl + here->BSIM4v7nstar); - Ssi = T1 / T2 * (T3 + T4 + T5) + T6 / T7 * DelClm * T8 / T9; - return Ssi; -} - - -int -BSIM4v7noise ( -int mode, int operation, -GENmodel *inModel, -CKTcircuit *ckt, -Ndata *data, -double *OnDens) -{ -NOISEAN *job = (NOISEAN *) ckt->CKTcurJob; - -BSIM4v7model *model = (BSIM4v7model *)inModel; -BSIM4v7instance *here; -struct bsim4SizeDependParam *pParam; -double tempOnoise; -double tempInoise; -double noizDens[BSIM4v7NSRCS]; -double lnNdens[BSIM4v7NSRCS]; - -double T0, T1, T2, T3, T4, T5, T6, T7, T8, T10, T11; -double Vds, Ssi, Swi; -double tmp=0.0, gdpr, gspr, npart_theta=0.0, npart_beta=0.0, igsquare, bodymode; - -/* tnoiMod=2 (v4.7) */ -double eta, Leff, Lvsat, gamma, delta, epsilon, GammaGd0=0.0; -double npart_c, sigrat=0.0, C0, omega, ctnoi=0.0; - -int i; - -double m; - - /* define the names of the noise sources */ - static char *BSIM4v7nNames[BSIM4v7NSRCS] = - { /* Note that we have to keep the order */ - ".rd", /* noise due to rd */ - ".rs", /* noise due to rs */ - ".rg", /* noise due to rgeltd */ - ".rbps", /* noise due to rbps */ - ".rbpd", /* noise due to rbpd */ - ".rbpb", /* noise due to rbpb */ - ".rbsb", /* noise due to rbsb */ - ".rbdb", /* noise due to rbdb */ - ".id", /* noise due to id (for tnoiMod2: uncorrelated portion only) */ - ".1overf", /* flicker (1/f) noise */ - ".igs", /* shot noise due to IGS */ - ".igd", /* shot noise due to IGD */ - ".igb", /* shot noise due to IGB */ - ".corl", /* contribution of correlated drain and induced gate noise */ - "" /* total transistor noise */ - }; - - for (; model != NULL; model = BSIM4v7nextModel(model)) - { - if(model->BSIM4v7tnoiMod != 2) { - noizDens[BSIM4v7CORLNOIZ] = 0.0; - lnNdens[BSIM4v7CORLNOIZ] = N_MINLOG; - } - for (here = BSIM4v7instances(model); here != NULL; - here = BSIM4v7nextInstance(here)) - { pParam = here->pParam; - switch (operation) - { case N_OPEN: - /* see if we have to to produce a summary report */ - /* if so, name all the noise generators */ - - if (job->NStpsSm != 0) - { switch (mode) - { case N_DENS: - for (i = 0; i < BSIM4v7NSRCS; i++) - { NOISE_ADD_OUTVAR(ckt, data, "onoise.%s%s", here->BSIM4v7name, BSIM4v7nNames[i]); - } - break; - case INT_NOIZ: - for (i = 0; i < BSIM4v7NSRCS; i++) - { NOISE_ADD_OUTVAR(ckt, data, "onoise_total.%s%s", here->BSIM4v7name, BSIM4v7nNames[i]); - NOISE_ADD_OUTVAR(ckt, data, "inoise_total.%s%s", here->BSIM4v7name, BSIM4v7nNames[i]); - } - break; - } - } - break; - case N_CALC: - m = here->BSIM4v7m; - switch (mode) - { case N_DENS: - if (model->BSIM4v7tnoiMod == 0) - { if (model->BSIM4v7rdsMod == 0) - { gspr = here->BSIM4v7sourceConductance; - gdpr = here->BSIM4v7drainConductance; - if (here->BSIM4v7grdsw > 0.0) - tmp = 1.0 / here->BSIM4v7grdsw; /* tmp used below */ - else - tmp = 0.0; - } - else - { gspr = here->BSIM4v7gstot; - gdpr = here->BSIM4v7gdtot; - tmp = 0.0; - } - } - else if(model->BSIM4v7tnoiMod == 1) - { T5 = here->BSIM4v7Vgsteff / here->BSIM4v7EsatL; - T5 *= T5; - npart_beta = model->BSIM4v7rnoia * (1.0 + T5 - * model->BSIM4v7tnoia * pParam->BSIM4v7leff); - npart_theta = model->BSIM4v7rnoib * (1.0 + T5 - * model->BSIM4v7tnoib * pParam->BSIM4v7leff); - if(npart_theta > 0.9) - npart_theta = 0.9; - if(npart_theta > 0.9 * npart_beta) - npart_theta = 0.9 * npart_beta; //4.6.2 - - if (model->BSIM4v7rdsMod == 0) - { gspr = here->BSIM4v7sourceConductance; - gdpr = here->BSIM4v7drainConductance; - } - else - { gspr = here->BSIM4v7gstot; - gdpr = here->BSIM4v7gdtot; - } - - if ((*(ckt->CKTstates[0] + here->BSIM4v7vds)) >= 0.0) - gspr = gspr * (1.0 + npart_theta * npart_theta * gspr - / here->BSIM4v7IdovVds); - else - gdpr = gdpr * (1.0 + npart_theta * npart_theta * gdpr - / here->BSIM4v7IdovVds); - } - else - { /* tnoiMod=2 (v4.7) */ - - if (model->BSIM4v7rdsMod == 0) - { gspr = here->BSIM4v7sourceConductance; - gdpr = here->BSIM4v7drainConductance; - } - else - { gspr = here->BSIM4v7gstot; - gdpr = here->BSIM4v7gdtot; - } - - } - - NevalSrc(&noizDens[BSIM4v7RDNOIZ], - &lnNdens[BSIM4v7RDNOIZ], ckt, THERMNOISE, - here->BSIM4v7dNodePrime, here->BSIM4v7dNode, - gdpr * m); - - NevalSrc(&noizDens[BSIM4v7RSNOIZ], - &lnNdens[BSIM4v7RSNOIZ], ckt, THERMNOISE, - here->BSIM4v7sNodePrime, here->BSIM4v7sNode, - gspr * m); - - - if (here->BSIM4v7rgateMod == 1) - { NevalSrc(&noizDens[BSIM4v7RGNOIZ], - &lnNdens[BSIM4v7RGNOIZ], ckt, THERMNOISE, - here->BSIM4v7gNodePrime, here->BSIM4v7gNodeExt, - here->BSIM4v7grgeltd * m); - } - else if (here->BSIM4v7rgateMod == 2) - { - T0 = 1.0 + here->BSIM4v7grgeltd/here->BSIM4v7gcrg; - T1 = T0 * T0; - NevalSrc(&noizDens[BSIM4v7RGNOIZ], - &lnNdens[BSIM4v7RGNOIZ], ckt, THERMNOISE, - here->BSIM4v7gNodePrime, here->BSIM4v7gNodeExt, - here->BSIM4v7grgeltd * m / T1); - } - else if (here->BSIM4v7rgateMod == 3) - { NevalSrc(&noizDens[BSIM4v7RGNOIZ], - &lnNdens[BSIM4v7RGNOIZ], ckt, THERMNOISE, - here->BSIM4v7gNodeMid, here->BSIM4v7gNodeExt, - here->BSIM4v7grgeltd * m); - } - else - { noizDens[BSIM4v7RGNOIZ] = 0.0; - lnNdens[BSIM4v7RGNOIZ] = - log(MAX(noizDens[BSIM4v7RGNOIZ], N_MINLOG)); - } - - bodymode = 5; - if (here->BSIM4v7rbodyMod == 2) - { if( ( !model->BSIM4v7rbps0Given) || - ( !model->BSIM4v7rbpd0Given) ) - bodymode = 1; - else - if( (!model->BSIM4v7rbsbx0Given && !model->BSIM4v7rbsby0Given) || - (!model->BSIM4v7rbdbx0Given && !model->BSIM4v7rbdby0Given) ) - bodymode = 3; - } - - if (here->BSIM4v7rbodyMod) - { - if(bodymode == 5) - { - NevalSrc(&noizDens[BSIM4v7RBPSNOIZ], - &lnNdens[BSIM4v7RBPSNOIZ], ckt, THERMNOISE, - here->BSIM4v7bNodePrime, here->BSIM4v7sbNode, - here->BSIM4v7grbps * m); - NevalSrc(&noizDens[BSIM4v7RBPDNOIZ], - &lnNdens[BSIM4v7RBPDNOIZ], ckt, THERMNOISE, - here->BSIM4v7bNodePrime, here->BSIM4v7dbNode, - here->BSIM4v7grbpd * m); - NevalSrc(&noizDens[BSIM4v7RBPBNOIZ], - &lnNdens[BSIM4v7RBPBNOIZ], ckt, THERMNOISE, - here->BSIM4v7bNodePrime, here->BSIM4v7bNode, - here->BSIM4v7grbpb * m); - NevalSrc(&noizDens[BSIM4v7RBSBNOIZ], - &lnNdens[BSIM4v7RBSBNOIZ], ckt, THERMNOISE, - here->BSIM4v7bNode, here->BSIM4v7sbNode, - here->BSIM4v7grbsb * m); - NevalSrc(&noizDens[BSIM4v7RBDBNOIZ], - &lnNdens[BSIM4v7RBDBNOIZ], ckt, THERMNOISE, - here->BSIM4v7bNode, here->BSIM4v7dbNode, - here->BSIM4v7grbdb * m); - } - if(bodymode == 3) - { - NevalSrc(&noizDens[BSIM4v7RBPSNOIZ], - &lnNdens[BSIM4v7RBPSNOIZ], ckt, THERMNOISE, - here->BSIM4v7bNodePrime, here->BSIM4v7sbNode, - here->BSIM4v7grbps * m); - NevalSrc(&noizDens[BSIM4v7RBPDNOIZ], - &lnNdens[BSIM4v7RBPDNOIZ], ckt, THERMNOISE, - here->BSIM4v7bNodePrime, here->BSIM4v7dbNode, - here->BSIM4v7grbpd * m); - NevalSrc(&noizDens[BSIM4v7RBPBNOIZ], - &lnNdens[BSIM4v7RBPBNOIZ], ckt, THERMNOISE, - here->BSIM4v7bNodePrime, here->BSIM4v7bNode, - here->BSIM4v7grbpb * m); - noizDens[BSIM4v7RBSBNOIZ] = noizDens[BSIM4v7RBDBNOIZ] = 0.0; - lnNdens[BSIM4v7RBSBNOIZ] = - log(MAX(noizDens[BSIM4v7RBSBNOIZ], N_MINLOG)); - lnNdens[BSIM4v7RBDBNOIZ] = - log(MAX(noizDens[BSIM4v7RBDBNOIZ], N_MINLOG)); - } - if(bodymode == 1) - { - NevalSrc(&noizDens[BSIM4v7RBPBNOIZ], - &lnNdens[BSIM4v7RBPBNOIZ], ckt, THERMNOISE, - here->BSIM4v7bNodePrime, here->BSIM4v7bNode, - here->BSIM4v7grbpb * m); - noizDens[BSIM4v7RBPSNOIZ] = noizDens[BSIM4v7RBPDNOIZ] = 0.0; - noizDens[BSIM4v7RBSBNOIZ] = noizDens[BSIM4v7RBDBNOIZ] = 0.0; - lnNdens[BSIM4v7RBPSNOIZ] = - log(MAX(noizDens[BSIM4v7RBPSNOIZ], N_MINLOG)); - lnNdens[BSIM4v7RBPDNOIZ] = - log(MAX(noizDens[BSIM4v7RBPDNOIZ], N_MINLOG)); - lnNdens[BSIM4v7RBSBNOIZ] = - log(MAX(noizDens[BSIM4v7RBSBNOIZ], N_MINLOG)); - lnNdens[BSIM4v7RBDBNOIZ] = - log(MAX(noizDens[BSIM4v7RBDBNOIZ], N_MINLOG)); - } - } - else - { noizDens[BSIM4v7RBPSNOIZ] = noizDens[BSIM4v7RBPDNOIZ] = 0.0; - noizDens[BSIM4v7RBPBNOIZ] = 0.0; - noizDens[BSIM4v7RBSBNOIZ] = noizDens[BSIM4v7RBDBNOIZ] = 0.0; - lnNdens[BSIM4v7RBPSNOIZ] = - log(MAX(noizDens[BSIM4v7RBPSNOIZ], N_MINLOG)); - lnNdens[BSIM4v7RBPDNOIZ] = - log(MAX(noizDens[BSIM4v7RBPDNOIZ], N_MINLOG)); - lnNdens[BSIM4v7RBPBNOIZ] = - log(MAX(noizDens[BSIM4v7RBPBNOIZ], N_MINLOG)); - lnNdens[BSIM4v7RBSBNOIZ] = - log(MAX(noizDens[BSIM4v7RBSBNOIZ], N_MINLOG)); - lnNdens[BSIM4v7RBDBNOIZ] = - log(MAX(noizDens[BSIM4v7RBDBNOIZ], N_MINLOG)); - } - - if(model->BSIM4v7tnoiMod == 2) - { - eta = 1.0 - here->BSIM4v7Vdseff * here->BSIM4v7AbovVgst2Vtm; - T0 = 1.0 - eta; - T1 = 1.0 + eta; - T2 = T1 + 2.0 * here->BSIM4v7Abulk * model->BSIM4v7vtm / here->BSIM4v7Vgsteff; - Leff = pParam->BSIM4v7leff; - Lvsat = Leff * (1.0 + here->BSIM4v7Vdseff / here->BSIM4v7EsatL); - T6 = Leff / Lvsat; - - T5 = here->BSIM4v7Vgsteff / here->BSIM4v7EsatL; - T5 = T5 * T5; - gamma = T6 * (0.5 * T1 + T0 * T0 / (6.0 * T2)); - T3 = T2 * T2; - T4 = T0 * T0; - T5 = T3 * T3; - delta = (T1 / T3 - (5.0 * T1 + T2) * T4 / (15.0 * T5) + T4 * T4 / (9.0 * T5 * T2)) / (6.0 * T6 * T6 * T6); - T7 = T0 / T2; - epsilon = (T7 - T7 * T7 * T7 / 3.0) / (6.0 * T6); - - T8 = here->BSIM4v7Vgsteff / here->BSIM4v7EsatL; - T8 *= T8; - npart_c = model->BSIM4v7rnoic * (1.0 + T8 - * model->BSIM4v7tnoic * Leff); - ctnoi = epsilon / sqrt(gamma * delta) - * (2.5316 * npart_c); - - npart_beta = model->BSIM4v7rnoia * (1.0 + T8 - * model->BSIM4v7tnoia * Leff); - npart_theta = model->BSIM4v7rnoib * (1.0 + T8 - * model->BSIM4v7tnoib * Leff); - gamma = gamma * (3.0 * npart_beta * npart_beta); - delta = delta * (3.75 * npart_theta * npart_theta); - - GammaGd0 = gamma * here->BSIM4v7noiGd0; - C0 = here->BSIM4v7Coxeff * pParam->BSIM4v7weffCV * here->BSIM4v7nf * pParam->BSIM4v7leffCV; - T0 = C0 / here->BSIM4v7noiGd0; - sigrat = T0 * sqrt(delta / gamma); - } - switch(model->BSIM4v7tnoiMod) - { case 0: - T0 = here->BSIM4v7ueff * fabs(here->BSIM4v7qinv); - T1 = T0 * tmp + pParam->BSIM4v7leff - * pParam->BSIM4v7leff; - NevalSrc(&noizDens[BSIM4v7IDNOIZ], - &lnNdens[BSIM4v7IDNOIZ], ckt, - THERMNOISE, here->BSIM4v7dNodePrime, - here->BSIM4v7sNodePrime, - (T0 / T1) * model->BSIM4v7ntnoi * m); - break; - case 1: - T0 = here->BSIM4v7gm + here->BSIM4v7gmbs + here->BSIM4v7gds; - T0 *= T0; - igsquare = npart_theta * npart_theta * T0 / here->BSIM4v7IdovVds; - T1 = npart_beta * (here->BSIM4v7gm - + here->BSIM4v7gmbs) + here->BSIM4v7gds; - T2 = T1 * T1 / here->BSIM4v7IdovVds; - NevalSrc(&noizDens[BSIM4v7IDNOIZ], - &lnNdens[BSIM4v7IDNOIZ], ckt, - THERMNOISE, here->BSIM4v7dNodePrime, - here->BSIM4v7sNodePrime, (T2 - igsquare) * m); - break; - case 2: - T2 = GammaGd0; - T3 = ctnoi * ctnoi; - T4 = 1.0 - T3; - NevalSrc(&noizDens[BSIM4v7IDNOIZ], - &lnNdens[BSIM4v7IDNOIZ], ckt, - THERMNOISE, here->BSIM4v7dNodePrime, - here->BSIM4v7sNodePrime, T2 * T4 * m); - - /* Evaluate output noise due to two correlated noise sources */ - omega = 2.0 * M_PI * data->freq; - T5 = omega * sigrat; - T6 = T5 * T5; - T7 = T6 / (1.0 + T6); - - if (here->BSIM4v7mode >= 0) { - NevalSrc2(&noizDens[BSIM4v7CORLNOIZ], - &lnNdens[BSIM4v7CORLNOIZ], ckt, - THERMNOISE, here->BSIM4v7dNodePrime, - here->BSIM4v7sNodePrime, T2 * T3 * m, - here->BSIM4v7gNodePrime, - here->BSIM4v7sNodePrime, - T2 * T7 * m, 0.5 * M_PI); - } - else - { - NevalSrc2(&noizDens[BSIM4v7CORLNOIZ], - &lnNdens[BSIM4v7CORLNOIZ], ckt, - THERMNOISE, here->BSIM4v7sNodePrime, - here->BSIM4v7dNodePrime, T2 * T3 * m, - here->BSIM4v7gNodePrime, - here->BSIM4v7dNodePrime, - T2 * T7 * m, 0.5 * M_PI); - } - break; - } - - NevalSrc(&noizDens[BSIM4v7FLNOIZ], (double*) NULL, - ckt, N_GAIN, here->BSIM4v7dNodePrime, - here->BSIM4v7sNodePrime, (double) 0.0); - - switch(model->BSIM4v7fnoiMod) - { case 0: - noizDens[BSIM4v7FLNOIZ] *= m * model->BSIM4v7kf - * exp(model->BSIM4v7af - * log(MAX(fabs(here->BSIM4v7cd), - N_MINLOG))) - / (pow(data->freq, model->BSIM4v7ef) - * pParam->BSIM4v7leff - * pParam->BSIM4v7leff - * model->BSIM4v7coxe); - break; - case 1: - Vds = *(ckt->CKTstates[0] + here->BSIM4v7vds); - if (Vds < 0.0) - Vds = -Vds; - - Ssi = Eval1ovFNoise(Vds, model, here, - data->freq, ckt->CKTtemp); - T10 = model->BSIM4v7oxideTrapDensityA - * CONSTboltz * ckt->CKTtemp; - T11 = pParam->BSIM4v7weff * here->BSIM4v7nf * pParam->BSIM4v7leff - * pow(data->freq, model->BSIM4v7ef) * 1.0e10 - * here->BSIM4v7nstar * here->BSIM4v7nstar; - Swi = T10 / T11 * here->BSIM4v7cd - * here->BSIM4v7cd; - T1 = Swi + Ssi; - if (T1 > 0.0) - noizDens[BSIM4v7FLNOIZ] *= m * (Ssi * Swi) / T1; - else - noizDens[BSIM4v7FLNOIZ] *= 0.0; - break; - } - - lnNdens[BSIM4v7FLNOIZ] = - log(MAX(noizDens[BSIM4v7FLNOIZ], N_MINLOG)); - - - if(here->BSIM4v7mode >= 0) { /* bugfix */ - NevalSrc(&noizDens[BSIM4v7IGSNOIZ], - &lnNdens[BSIM4v7IGSNOIZ], ckt, SHOTNOISE, - here->BSIM4v7gNodePrime, here->BSIM4v7sNodePrime, - m * (here->BSIM4v7Igs + here->BSIM4v7Igcs)); - NevalSrc(&noizDens[BSIM4v7IGDNOIZ], - &lnNdens[BSIM4v7IGDNOIZ], ckt, SHOTNOISE, - here->BSIM4v7gNodePrime, here->BSIM4v7dNodePrime, - m * (here->BSIM4v7Igd + here->BSIM4v7Igcd)); - } else { - NevalSrc(&noizDens[BSIM4v7IGSNOIZ], - &lnNdens[BSIM4v7IGSNOIZ], ckt, SHOTNOISE, - here->BSIM4v7gNodePrime, here->BSIM4v7sNodePrime, - m * (here->BSIM4v7Igs + here->BSIM4v7Igcd)); - NevalSrc(&noizDens[BSIM4v7IGDNOIZ], - &lnNdens[BSIM4v7IGDNOIZ], ckt, SHOTNOISE, - here->BSIM4v7gNodePrime, here->BSIM4v7dNodePrime, - m * (here->BSIM4v7Igd + here->BSIM4v7Igcs)); - } - NevalSrc(&noizDens[BSIM4v7IGBNOIZ], - &lnNdens[BSIM4v7IGBNOIZ], ckt, SHOTNOISE, - here->BSIM4v7gNodePrime, here->BSIM4v7bNodePrime, - m * here->BSIM4v7Igb); - - - noizDens[BSIM4v7TOTNOIZ] = noizDens[BSIM4v7RDNOIZ] - + noizDens[BSIM4v7RSNOIZ] + noizDens[BSIM4v7RGNOIZ] - + noizDens[BSIM4v7RBPSNOIZ] + noizDens[BSIM4v7RBPDNOIZ] - + noizDens[BSIM4v7RBPBNOIZ] - + noizDens[BSIM4v7RBSBNOIZ] + noizDens[BSIM4v7RBDBNOIZ] - + noizDens[BSIM4v7IDNOIZ] + noizDens[BSIM4v7FLNOIZ] - + noizDens[BSIM4v7IGSNOIZ] + noizDens[BSIM4v7IGDNOIZ] - + noizDens[BSIM4v7IGBNOIZ] + noizDens[BSIM4v7CORLNOIZ]; - lnNdens[BSIM4v7TOTNOIZ] = - log(MAX(noizDens[BSIM4v7TOTNOIZ], N_MINLOG)); - - *OnDens += noizDens[BSIM4v7TOTNOIZ]; - - if (data->delFreq == 0.0) - { /* if we haven't done any previous - integration, we need to initialize our - "history" variables. - */ - - for (i = 0; i < BSIM4v7NSRCS; i++) - { here->BSIM4v7nVar[LNLSTDENS][i] = - lnNdens[i]; - } - - /* clear out our integration variables - if it's the first pass - */ - if (data->freq == - job->NstartFreq) - { for (i = 0; i < BSIM4v7NSRCS; i++) - { here->BSIM4v7nVar[OUTNOIZ][i] = 0.0; - here->BSIM4v7nVar[INNOIZ][i] = 0.0; - } - } - } - else - { /* data->delFreq != 0.0, - we have to integrate. - */ - for (i = 0; i < BSIM4v7NSRCS; i++) - { if (i != BSIM4v7TOTNOIZ) - { tempOnoise = Nintegrate(noizDens[i], - lnNdens[i], - here->BSIM4v7nVar[LNLSTDENS][i], - data); - tempInoise = Nintegrate(noizDens[i] - * data->GainSqInv, lnNdens[i] - + data->lnGainInv, - here->BSIM4v7nVar[LNLSTDENS][i] - + data->lnGainInv, data); - here->BSIM4v7nVar[LNLSTDENS][i] = - lnNdens[i]; - data->outNoiz += tempOnoise; - data->inNoise += tempInoise; - if (job->NStpsSm != 0) - { here->BSIM4v7nVar[OUTNOIZ][i] - += tempOnoise; - here->BSIM4v7nVar[OUTNOIZ][BSIM4v7TOTNOIZ] - += tempOnoise; - here->BSIM4v7nVar[INNOIZ][i] - += tempInoise; - here->BSIM4v7nVar[INNOIZ][BSIM4v7TOTNOIZ] - += tempInoise; - } - } - } - } - if (data->prtSummary) - { for (i = 0; i < BSIM4v7NSRCS; i++) - { /* print a summary report */ - data->outpVector[data->outNumber++] - = noizDens[i]; - } - } - break; - case INT_NOIZ: - /* already calculated, just output */ - if (job->NStpsSm != 0) - { for (i = 0; i < BSIM4v7NSRCS; i++) - { data->outpVector[data->outNumber++] - = here->BSIM4v7nVar[OUTNOIZ][i]; - data->outpVector[data->outNumber++] - = here->BSIM4v7nVar[INNOIZ][i]; - } - } - break; - } - break; - case N_CLOSE: - /* do nothing, the main calling routine will close */ - return (OK); - break; /* the plots */ - } /* switch (operation) */ - } /* for here */ - } /* for model */ - - return(OK); -} diff --git a/src/spicelib/devices/bsim4v7/b4v7par.c b/src/spicelib/devices/bsim4v7/b4v7par.c deleted file mode 100644 index d8bdd6d3d..000000000 --- a/src/spicelib/devices/bsim4v7/b4v7par.c +++ /dev/null @@ -1,216 +0,0 @@ -/**** BSIM4.7.0 Released by Darsen Lu 04/08/2011 ****/ - -/********** - * Copyright 2006 Regents of the University of California. All rights reserved. - * File: b4par.c of BSIM4.7.0. - * Author: 2000 Weidong Liu - * Authors: 2001- Xuemei Xi, Mohan Dunga, Ali Niknejad, Chenming Hu. - * Authors: 2006- Mohan Dunga, Ali Niknejad, Chenming Hu - * Authors: 2007- Mohan Dunga, Wenwei Yang, Ali Niknejad, Chenming Hu - * Project Director: Prof. Chenming Hu. - * Modified by Xuemei Xi, 04/06/2001. - * Modified by Xuemei Xi, 11/15/2002. - * Modified by Xuemei Xi, 05/09/2003. - * Modified by Xuemei Xi, Mohan Dunga, 07/29/2005. -**********/ - -#include "ngspice/ngspice.h" -#include "ngspice/ifsim.h" -#include "bsim4v7def.h" -#include "ngspice/sperror.h" -#include "ngspice/suffix.h" -#include "ngspice/fteext.h" - -int -BSIM4v7param( -int param, -IFvalue *value, -GENinstance *inst, -IFvalue *select) -{ - double scale; - - BSIM4v7instance *here = (BSIM4v7instance*)inst; - - NG_IGNORE(select); - - if (!cp_getvar("scale", CP_REAL, &scale, 0)) - scale = 1; - - switch (param) { - case BSIM4v7_W: - here->BSIM4v7w = value->rValue * scale; - here->BSIM4v7wGiven = TRUE; - break; - case BSIM4v7_L: - here->BSIM4v7l = value->rValue * scale; - here->BSIM4v7lGiven = TRUE; - break; - case BSIM4v7_M: - here->BSIM4v7m = value->rValue; - here->BSIM4v7mGiven = TRUE; - break; - case BSIM4v7_NF: - here->BSIM4v7nf = value->rValue; - here->BSIM4v7nfGiven = TRUE; - break; - case BSIM4v7_MIN: - here->BSIM4v7min = value->iValue; - here->BSIM4v7minGiven = TRUE; - break; - case BSIM4v7_AS: - here->BSIM4v7sourceArea = value->rValue * scale * scale; - here->BSIM4v7sourceAreaGiven = TRUE; - break; - case BSIM4v7_AD: - here->BSIM4v7drainArea = value->rValue * scale * scale; - here->BSIM4v7drainAreaGiven = TRUE; - break; - case BSIM4v7_PS: - here->BSIM4v7sourcePerimeter = value->rValue * scale; - here->BSIM4v7sourcePerimeterGiven = TRUE; - break; - case BSIM4v7_PD: - here->BSIM4v7drainPerimeter = value->rValue * scale; - here->BSIM4v7drainPerimeterGiven = TRUE; - break; - case BSIM4v7_NRS: - here->BSIM4v7sourceSquares = value->rValue; - here->BSIM4v7sourceSquaresGiven = TRUE; - break; - case BSIM4v7_NRD: - here->BSIM4v7drainSquares = value->rValue; - here->BSIM4v7drainSquaresGiven = TRUE; - break; - case BSIM4v7_OFF: - here->BSIM4v7off = value->iValue; - break; - case BSIM4v7_SA: - here->BSIM4v7sa = value->rValue; - here->BSIM4v7saGiven = TRUE; - break; - case BSIM4v7_SB: - here->BSIM4v7sb = value->rValue; - here->BSIM4v7sbGiven = TRUE; - break; - case BSIM4v7_SD: - here->BSIM4v7sd = value->rValue; - here->BSIM4v7sdGiven = TRUE; - break; - case BSIM4v7_SCA: - here->BSIM4v7sca = value->rValue; - here->BSIM4v7scaGiven = TRUE; - break; - case BSIM4v7_SCB: - here->BSIM4v7scb = value->rValue; - here->BSIM4v7scbGiven = TRUE; - break; - case BSIM4v7_SCC: - here->BSIM4v7scc = value->rValue; - here->BSIM4v7sccGiven = TRUE; - break; - case BSIM4v7_SC: - here->BSIM4v7sc = value->rValue; - here->BSIM4v7scGiven = TRUE; - break; - case BSIM4v7_RBSB: - here->BSIM4v7rbsb = value->rValue; - here->BSIM4v7rbsbGiven = TRUE; - break; - case BSIM4v7_RBDB: - here->BSIM4v7rbdb = value->rValue; - here->BSIM4v7rbdbGiven = TRUE; - break; - case BSIM4v7_RBPB: - here->BSIM4v7rbpb = value->rValue; - here->BSIM4v7rbpbGiven = TRUE; - break; - case BSIM4v7_RBPS: - here->BSIM4v7rbps = value->rValue; - here->BSIM4v7rbpsGiven = TRUE; - break; - case BSIM4v7_RBPD: - here->BSIM4v7rbpd = value->rValue; - here->BSIM4v7rbpdGiven = TRUE; - break; - case BSIM4v7_DELVTO: - here->BSIM4v7delvto = value->rValue; - here->BSIM4v7delvtoGiven = TRUE; - break; - case BSIM4v7_MULU0: - here->BSIM4v7mulu0 = value->rValue; - here->BSIM4v7mulu0Given = TRUE; - break; - case BSIM4v7_WNFLAG: - here->BSIM4v7wnflag = value->iValue; - here->BSIM4v7wnflagGiven = TRUE; - break; - case BSIM4v7_XGW: - here->BSIM4v7xgw = value->rValue; - here->BSIM4v7xgwGiven = TRUE; - break; - case BSIM4v7_NGCON: - here->BSIM4v7ngcon = value->rValue; - here->BSIM4v7ngconGiven = TRUE; - break; - case BSIM4v7_TRNQSMOD: - here->BSIM4v7trnqsMod = value->iValue; - here->BSIM4v7trnqsModGiven = TRUE; - break; - case BSIM4v7_ACNQSMOD: - here->BSIM4v7acnqsMod = value->iValue; - here->BSIM4v7acnqsModGiven = TRUE; - break; - case BSIM4v7_RBODYMOD: - here->BSIM4v7rbodyMod = value->iValue; - here->BSIM4v7rbodyModGiven = TRUE; - break; - case BSIM4v7_RGATEMOD: - here->BSIM4v7rgateMod = value->iValue; - here->BSIM4v7rgateModGiven = TRUE; - break; - case BSIM4v7_GEOMOD: - here->BSIM4v7geoMod = value->iValue; - here->BSIM4v7geoModGiven = TRUE; - break; - case BSIM4v7_RGEOMOD: - here->BSIM4v7rgeoMod = value->iValue; - here->BSIM4v7rgeoModGiven = TRUE; - break; - case BSIM4v7_IC_VDS: - here->BSIM4v7icVDS = value->rValue; - here->BSIM4v7icVDSGiven = TRUE; - break; - case BSIM4v7_IC_VGS: - here->BSIM4v7icVGS = value->rValue; - here->BSIM4v7icVGSGiven = TRUE; - break; - case BSIM4v7_IC_VBS: - here->BSIM4v7icVBS = value->rValue; - here->BSIM4v7icVBSGiven = TRUE; - break; - case BSIM4v7_IC: - /* FALLTHROUGH added to suppress GCC warning due to - * -Wimplicit-fallthrough flag */ - switch (value->v.numValue) { - case 3: - here->BSIM4v7icVBS = *(value->v.vec.rVec+2); - here->BSIM4v7icVBSGiven = TRUE; - /* FALLTHROUGH */ - case 2: - here->BSIM4v7icVGS = *(value->v.vec.rVec+1); - here->BSIM4v7icVGSGiven = TRUE; - /* FALLTHROUGH */ - case 1: - here->BSIM4v7icVDS = *(value->v.vec.rVec); - here->BSIM4v7icVDSGiven = TRUE; - break; - default: - return(E_BADPARM); - } - break; - default: - return(E_BADPARM); - } - return(OK); -} diff --git a/src/spicelib/devices/bsim4v7/b4v7pzld.c b/src/spicelib/devices/bsim4v7/b4v7pzld.c deleted file mode 100644 index 641eb7067..000000000 --- a/src/spicelib/devices/bsim4v7/b4v7pzld.c +++ /dev/null @@ -1,759 +0,0 @@ -/**** BSIM4.7.0 Released by Darsen Lu 04/08/2011 ****/ - -/********** - * Copyright 2006 Regents of the University of California. All rights reserved. - * File: b4pzld.c of BSIM4.7.0. - * Author: 2000 Weidong Liu - * Authors: 2001- Xuemei Xi, Mohan Dunga, Ali Niknejad, Chenming Hu. - * Authors: 2006- Mohan Dunga, Ali Niknejad, Chenming Hu - * Authors: 2007- Mohan Dunga, Wenwei Yang, Ali Niknejad, Chenming Hu - * Project Director: Prof. Chenming Hu. - * Modified by Xuemei Xi, 10/05/2001. - **********/ - -#include "ngspice/ngspice.h" -#include "ngspice/cktdefs.h" -#include "ngspice/complex.h" -#include "ngspice/sperror.h" -#include "bsim4v7def.h" -#include "ngspice/suffix.h" - -int -BSIM4v7pzLoad( -GENmodel *inModel, -CKTcircuit *ckt, -SPcomplex *s) -{ -BSIM4v7model *model = (BSIM4v7model*)inModel; -BSIM4v7instance *here; - -double gjbd, gjbs, geltd, gcrg, gcrgg, gcrgd, gcrgs, gcrgb; -double xcggb, xcgdb, xcgsb, xcgbb, xcbgb, xcbdb, xcbsb, xcbbb; -double xcdgb, xcddb, xcdsb, xcdbb, xcsgb, xcsdb, xcssb, xcsbb; -double gds, capbd, capbs, FwdSum, RevSum, Gm, Gmbs; -double gstot, gstotd, gstotg, gstots, gstotb, gspr; -double gdtot, gdtotd, gdtotg, gdtots, gdtotb, gdpr; -double gIstotg, gIstotd, gIstots, gIstotb; -double gIdtotg, gIdtotd, gIdtots, gIdtotb; -double gIbtotg, gIbtotd, gIbtots, gIbtotb; -double gIgtotg, gIgtotd, gIgtots, gIgtotb; -double cgso, cgdo, cgbo; -double xcdbdb=0.0, xcsbsb=0.0, xcgmgmb=0.0, xcgmdb=0.0, xcgmsb=0.0, xcdgmb=0.0, xcsgmb=0.0; -double xcgmbb=0.0, xcbgmb=0.0; -double dxpart, sxpart, xgtg, xgtd, xgts, xgtb, xcqgb=0.0, xcqdb=0.0, xcqsb=0.0, xcqbb=0.0; -double gbspsp, gbbdp, gbbsp, gbspg, gbspb; -double gbspdp, gbdpdp, gbdpg, gbdpb, gbdpsp; -double ddxpart_dVd, ddxpart_dVg, ddxpart_dVb, ddxpart_dVs; -double dsxpart_dVd, dsxpart_dVg, dsxpart_dVb, dsxpart_dVs; -double T0=0.0, T1, CoxWL, qcheq, Cdg, Cdd, Cds, Csg, Csd, Css; -double ScalingFactor = 1.0e-9; -struct bsim4SizeDependParam *pParam; -double ggidld, ggidlg, ggidlb, ggislg, ggislb, ggisls; - -double m; - - for (; model != NULL; model = BSIM4v7nextModel(model)) - { for (here = BSIM4v7instances(model); here!= NULL; - here = BSIM4v7nextInstance(here)) - { - pParam = here->pParam; - capbd = here->BSIM4v7capbd; - capbs = here->BSIM4v7capbs; - cgso = here->BSIM4v7cgso; - cgdo = here->BSIM4v7cgdo; - cgbo = pParam->BSIM4v7cgbo; - - if (here->BSIM4v7mode >= 0) - { Gm = here->BSIM4v7gm; - Gmbs = here->BSIM4v7gmbs; - FwdSum = Gm + Gmbs; - RevSum = 0.0; - - gbbdp = -(here->BSIM4v7gbds); - gbbsp = here->BSIM4v7gbds + here->BSIM4v7gbgs + here->BSIM4v7gbbs; - gbdpg = here->BSIM4v7gbgs; - gbdpdp = here->BSIM4v7gbds; - gbdpb = here->BSIM4v7gbbs; - gbdpsp = -(gbdpg + gbdpdp + gbdpb); - - gbspdp = 0.0; - gbspg = 0.0; - gbspb = 0.0; - gbspsp = 0.0; - - if (model->BSIM4v7igcMod) - { gIstotg = here->BSIM4v7gIgsg + here->BSIM4v7gIgcsg; - gIstotd = here->BSIM4v7gIgcsd; - gIstots = here->BSIM4v7gIgss + here->BSIM4v7gIgcss; - gIstotb = here->BSIM4v7gIgcsb; - - gIdtotg = here->BSIM4v7gIgdg + here->BSIM4v7gIgcdg; - gIdtotd = here->BSIM4v7gIgdd + here->BSIM4v7gIgcdd; - gIdtots = here->BSIM4v7gIgcds; - gIdtotb = here->BSIM4v7gIgcdb; - } - else - { gIstotg = gIstotd = gIstots = gIstotb = 0.0; - gIdtotg = gIdtotd = gIdtots = gIdtotb = 0.0; - } - - if (model->BSIM4v7igbMod) - { gIbtotg = here->BSIM4v7gIgbg; - gIbtotd = here->BSIM4v7gIgbd; - gIbtots = here->BSIM4v7gIgbs; - gIbtotb = here->BSIM4v7gIgbb; - } - else - gIbtotg = gIbtotd = gIbtots = gIbtotb = 0.0; - - if ((model->BSIM4v7igcMod != 0) || (model->BSIM4v7igbMod != 0)) - { gIgtotg = gIstotg + gIdtotg + gIbtotg; - gIgtotd = gIstotd + gIdtotd + gIbtotd ; - gIgtots = gIstots + gIdtots + gIbtots; - gIgtotb = gIstotb + gIdtotb + gIbtotb; - } - else - gIgtotg = gIgtotd = gIgtots = gIgtotb = 0.0; - - if (here->BSIM4v7rgateMod == 2) - T0 = *(ckt->CKTstates[0] + here->BSIM4v7vges) - - *(ckt->CKTstates[0] + here->BSIM4v7vgs); - else if (here->BSIM4v7rgateMod == 3) - T0 = *(ckt->CKTstates[0] + here->BSIM4v7vgms) - - *(ckt->CKTstates[0] + here->BSIM4v7vgs); - if (here->BSIM4v7rgateMod > 1) - { gcrgd = here->BSIM4v7gcrgd * T0; - gcrgg = here->BSIM4v7gcrgg * T0; - gcrgs = here->BSIM4v7gcrgs * T0; - gcrgb = here->BSIM4v7gcrgb * T0; - gcrgg -= here->BSIM4v7gcrg; - gcrg = here->BSIM4v7gcrg; - } - else - gcrg = gcrgd = gcrgg = gcrgs = gcrgb = 0.0; - - if (here->BSIM4v7acnqsMod == 0) - { if (here->BSIM4v7rgateMod == 3) - { xcgmgmb = cgdo + cgso + pParam->BSIM4v7cgbo; - xcgmdb = -cgdo; - xcgmsb = -cgso; - xcgmbb = -pParam->BSIM4v7cgbo; - - xcdgmb = xcgmdb; - xcsgmb = xcgmsb; - xcbgmb = xcgmbb; - - xcggb = here->BSIM4v7cggb; - xcgdb = here->BSIM4v7cgdb; - xcgsb = here->BSIM4v7cgsb; - xcgbb = -(xcggb + xcgdb + xcgsb); - - xcdgb = here->BSIM4v7cdgb; - xcsgb = -(here->BSIM4v7cggb + here->BSIM4v7cbgb - + here->BSIM4v7cdgb); - xcbgb = here->BSIM4v7cbgb; - } - else - { xcggb = here->BSIM4v7cggb + cgdo + cgso - + pParam->BSIM4v7cgbo; - xcgdb = here->BSIM4v7cgdb - cgdo; - xcgsb = here->BSIM4v7cgsb - cgso; - xcgbb = -(xcggb + xcgdb + xcgsb); - - xcdgb = here->BSIM4v7cdgb - cgdo; - xcsgb = -(here->BSIM4v7cggb + here->BSIM4v7cbgb - + here->BSIM4v7cdgb + cgso); - xcbgb = here->BSIM4v7cbgb - pParam->BSIM4v7cgbo; - - xcdgmb = xcsgmb = xcbgmb = 0.0; - } - xcddb = here->BSIM4v7cddb + here->BSIM4v7capbd + cgdo; - xcdsb = here->BSIM4v7cdsb; - - xcsdb = -(here->BSIM4v7cgdb + here->BSIM4v7cbdb - + here->BSIM4v7cddb); - xcssb = here->BSIM4v7capbs + cgso - (here->BSIM4v7cgsb - + here->BSIM4v7cbsb + here->BSIM4v7cdsb); - - if (!here->BSIM4v7rbodyMod) - { xcdbb = -(xcdgb + xcddb + xcdsb + xcdgmb); - xcsbb = -(xcsgb + xcsdb + xcssb + xcsgmb); - xcbdb = here->BSIM4v7cbdb - here->BSIM4v7capbd; - xcbsb = here->BSIM4v7cbsb - here->BSIM4v7capbs; - xcdbdb = 0.0; - } - else - { xcdbb = -(here->BSIM4v7cddb + here->BSIM4v7cdgb - + here->BSIM4v7cdsb); - xcsbb = -(xcsgb + xcsdb + xcssb + xcsgmb) - + here->BSIM4v7capbs; - xcbdb = here->BSIM4v7cbdb; - xcbsb = here->BSIM4v7cbsb; - - xcdbdb = -here->BSIM4v7capbd; - xcsbsb = -here->BSIM4v7capbs; - } - xcbbb = -(xcbdb + xcbgb + xcbsb + xcbgmb); - - xgtg = xgtd = xgts = xgtb = 0.0; - sxpart = 0.6; - dxpart = 0.4; - ddxpart_dVd = ddxpart_dVg = ddxpart_dVb - = ddxpart_dVs = 0.0; - dsxpart_dVd = dsxpart_dVg = dsxpart_dVb - = dsxpart_dVs = 0.0; - } - else - { xcggb = xcgdb = xcgsb = xcgbb = 0.0; - xcbgb = xcbdb = xcbsb = xcbbb = 0.0; - xcdgb = xcddb = xcdsb = xcdbb = 0.0; - xcsgb = xcsdb = xcssb = xcsbb = 0.0; - - xgtg = here->BSIM4v7gtg; - xgtd = here->BSIM4v7gtd; - xgts = here->BSIM4v7gts; - xgtb = here->BSIM4v7gtb; - - xcqgb = here->BSIM4v7cqgb; - xcqdb = here->BSIM4v7cqdb; - xcqsb = here->BSIM4v7cqsb; - xcqbb = here->BSIM4v7cqbb; - - CoxWL = model->BSIM4v7coxe * here->pParam->BSIM4v7weffCV - * here->BSIM4v7nf * here->pParam->BSIM4v7leffCV; - qcheq = -(here->BSIM4v7qgate + here->BSIM4v7qbulk); - if (fabs(qcheq) <= 1.0e-5 * CoxWL) - { if (model->BSIM4v7xpart < 0.5) - { dxpart = 0.4; - } - else if (model->BSIM4v7xpart > 0.5) - { dxpart = 0.0; - } - else - { dxpart = 0.5; - } - ddxpart_dVd = ddxpart_dVg = ddxpart_dVb - = ddxpart_dVs = 0.0; - } - else - { dxpart = here->BSIM4v7qdrn / qcheq; - Cdd = here->BSIM4v7cddb; - Csd = -(here->BSIM4v7cgdb + here->BSIM4v7cddb - + here->BSIM4v7cbdb); - ddxpart_dVd = (Cdd - dxpart * (Cdd + Csd)) / qcheq; - Cdg = here->BSIM4v7cdgb; - Csg = -(here->BSIM4v7cggb + here->BSIM4v7cdgb - + here->BSIM4v7cbgb); - ddxpart_dVg = (Cdg - dxpart * (Cdg + Csg)) / qcheq; - - Cds = here->BSIM4v7cdsb; - Css = -(here->BSIM4v7cgsb + here->BSIM4v7cdsb - + here->BSIM4v7cbsb); - ddxpart_dVs = (Cds - dxpart * (Cds + Css)) / qcheq; - - ddxpart_dVb = -(ddxpart_dVd + ddxpart_dVg - + ddxpart_dVs); - } - sxpart = 1.0 - dxpart; - dsxpart_dVd = -ddxpart_dVd; - dsxpart_dVg = -ddxpart_dVg; - dsxpart_dVs = -ddxpart_dVs; - dsxpart_dVb = -(dsxpart_dVd + dsxpart_dVg + dsxpart_dVs); - } - } - else - { Gm = -here->BSIM4v7gm; - Gmbs = -here->BSIM4v7gmbs; - FwdSum = 0.0; - RevSum = -(Gm + Gmbs); - - gbbsp = -(here->BSIM4v7gbds); - gbbdp = here->BSIM4v7gbds + here->BSIM4v7gbgs + here->BSIM4v7gbbs; - - gbdpg = 0.0; - gbdpsp = 0.0; - gbdpb = 0.0; - gbdpdp = 0.0; - - gbspg = here->BSIM4v7gbgs; - gbspsp = here->BSIM4v7gbds; - gbspb = here->BSIM4v7gbbs; - gbspdp = -(gbspg + gbspsp + gbspb); - - if (model->BSIM4v7igcMod) - { gIstotg = here->BSIM4v7gIgsg + here->BSIM4v7gIgcdg; - gIstotd = here->BSIM4v7gIgcds; - gIstots = here->BSIM4v7gIgss + here->BSIM4v7gIgcdd; - gIstotb = here->BSIM4v7gIgcdb; - - gIdtotg = here->BSIM4v7gIgdg + here->BSIM4v7gIgcsg; - gIdtotd = here->BSIM4v7gIgdd + here->BSIM4v7gIgcss; - gIdtots = here->BSIM4v7gIgcsd; - gIdtotb = here->BSIM4v7gIgcsb; - } - else - { gIstotg = gIstotd = gIstots = gIstotb = 0.0; - gIdtotg = gIdtotd = gIdtots = gIdtotb = 0.0; - } - - if (model->BSIM4v7igbMod) - { gIbtotg = here->BSIM4v7gIgbg; - gIbtotd = here->BSIM4v7gIgbs; - gIbtots = here->BSIM4v7gIgbd; - gIbtotb = here->BSIM4v7gIgbb; - } - else - gIbtotg = gIbtotd = gIbtots = gIbtotb = 0.0; - - if ((model->BSIM4v7igcMod != 0) || (model->BSIM4v7igbMod != 0)) - { gIgtotg = gIstotg + gIdtotg + gIbtotg; - gIgtotd = gIstotd + gIdtotd + gIbtotd ; - gIgtots = gIstots + gIdtots + gIbtots; - gIgtotb = gIstotb + gIdtotb + gIbtotb; - } - else - gIgtotg = gIgtotd = gIgtots = gIgtotb = 0.0; - - if (here->BSIM4v7rgateMod == 2) - T0 = *(ckt->CKTstates[0] + here->BSIM4v7vges) - - *(ckt->CKTstates[0] + here->BSIM4v7vgs); - else if (here->BSIM4v7rgateMod == 3) - T0 = *(ckt->CKTstates[0] + here->BSIM4v7vgms) - - *(ckt->CKTstates[0] + here->BSIM4v7vgs); - if (here->BSIM4v7rgateMod > 1) - { gcrgd = here->BSIM4v7gcrgs * T0; - gcrgg = here->BSIM4v7gcrgg * T0; - gcrgs = here->BSIM4v7gcrgd * T0; - gcrgb = here->BSIM4v7gcrgb * T0; - gcrgg -= here->BSIM4v7gcrg; - gcrg = here->BSIM4v7gcrg; - } - else - gcrg = gcrgd = gcrgg = gcrgs = gcrgb = 0.0; - - if (here->BSIM4v7acnqsMod == 0) - { if (here->BSIM4v7rgateMod == 3) - { xcgmgmb = cgdo + cgso + pParam->BSIM4v7cgbo; - xcgmdb = -cgdo; - xcgmsb = -cgso; - xcgmbb = -pParam->BSIM4v7cgbo; - - xcdgmb = xcgmdb; - xcsgmb = xcgmsb; - xcbgmb = xcgmbb; - - xcggb = here->BSIM4v7cggb; - xcgdb = here->BSIM4v7cgsb; - xcgsb = here->BSIM4v7cgdb; - xcgbb = -(xcggb + xcgdb + xcgsb); - - xcdgb = -(here->BSIM4v7cggb + here->BSIM4v7cbgb - + here->BSIM4v7cdgb); - xcsgb = here->BSIM4v7cdgb; - xcbgb = here->BSIM4v7cbgb; - } - else - { xcggb = here->BSIM4v7cggb + cgdo + cgso - + pParam->BSIM4v7cgbo; - xcgdb = here->BSIM4v7cgsb - cgdo; - xcgsb = here->BSIM4v7cgdb - cgso; - xcgbb = -(xcggb + xcgdb + xcgsb); - - xcdgb = -(here->BSIM4v7cggb + here->BSIM4v7cbgb - + here->BSIM4v7cdgb + cgdo); - xcsgb = here->BSIM4v7cdgb - cgso; - xcbgb = here->BSIM4v7cbgb - pParam->BSIM4v7cgbo; - - xcdgmb = xcsgmb = xcbgmb = 0.0; - } - xcddb = here->BSIM4v7capbd + cgdo - (here->BSIM4v7cgsb - + here->BSIM4v7cbsb + here->BSIM4v7cdsb); - xcdsb = -(here->BSIM4v7cgdb + here->BSIM4v7cbdb - + here->BSIM4v7cddb); - - xcsdb = here->BSIM4v7cdsb; - xcssb = here->BSIM4v7cddb + here->BSIM4v7capbs + cgso; - - if (!here->BSIM4v7rbodyMod) - { xcdbb = -(xcdgb + xcddb + xcdsb + xcdgmb); - xcsbb = -(xcsgb + xcsdb + xcssb + xcsgmb); - xcbdb = here->BSIM4v7cbsb - here->BSIM4v7capbd; - xcbsb = here->BSIM4v7cbdb - here->BSIM4v7capbs; - xcdbdb = 0.0; - } - else - { xcdbb = -(xcdgb + xcddb + xcdsb + xcdgmb) - + here->BSIM4v7capbd; - xcsbb = -(here->BSIM4v7cddb + here->BSIM4v7cdgb - + here->BSIM4v7cdsb); - xcbdb = here->BSIM4v7cbsb; - xcbsb = here->BSIM4v7cbdb; - xcdbdb = -here->BSIM4v7capbd; - xcsbsb = -here->BSIM4v7capbs; - } - xcbbb = -(xcbgb + xcbdb + xcbsb + xcbgmb); - - xgtg = xgtd = xgts = xgtb = 0.0; - sxpart = 0.4; - dxpart = 0.6; - ddxpart_dVd = ddxpart_dVg = ddxpart_dVb - = ddxpart_dVs = 0.0; - dsxpart_dVd = dsxpart_dVg = dsxpart_dVb - = dsxpart_dVs = 0.0; - } - else - { xcggb = xcgdb = xcgsb = xcgbb = 0.0; - xcbgb = xcbdb = xcbsb = xcbbb = 0.0; - xcdgb = xcddb = xcdsb = xcdbb = 0.0; - xcsgb = xcsdb = xcssb = xcsbb = 0.0; - - xgtg = here->BSIM4v7gtg; - xgtd = here->BSIM4v7gts; - xgts = here->BSIM4v7gtd; - xgtb = here->BSIM4v7gtb; - - xcqgb = here->BSIM4v7cqgb; - xcqdb = here->BSIM4v7cqsb; - xcqsb = here->BSIM4v7cqdb; - xcqbb = here->BSIM4v7cqbb; - - CoxWL = model->BSIM4v7coxe * here->pParam->BSIM4v7weffCV - * here->BSIM4v7nf * here->pParam->BSIM4v7leffCV; - qcheq = -(here->BSIM4v7qgate + here->BSIM4v7qbulk); - if (fabs(qcheq) <= 1.0e-5 * CoxWL) - { if (model->BSIM4v7xpart < 0.5) - { sxpart = 0.4; - } - else if (model->BSIM4v7xpart > 0.5) - { sxpart = 0.0; - } - else - { sxpart = 0.5; - } - dsxpart_dVd = dsxpart_dVg = dsxpart_dVb - = dsxpart_dVs = 0.0; - } - else - { sxpart = here->BSIM4v7qdrn / qcheq; - Css = here->BSIM4v7cddb; - Cds = -(here->BSIM4v7cgdb + here->BSIM4v7cddb - + here->BSIM4v7cbdb); - dsxpart_dVs = (Css - sxpart * (Css + Cds)) / qcheq; - Csg = here->BSIM4v7cdgb; - Cdg = -(here->BSIM4v7cggb + here->BSIM4v7cdgb - + here->BSIM4v7cbgb); - dsxpart_dVg = (Csg - sxpart * (Csg + Cdg)) / qcheq; - - Csd = here->BSIM4v7cdsb; - Cdd = -(here->BSIM4v7cgsb + here->BSIM4v7cdsb - + here->BSIM4v7cbsb); - dsxpart_dVd = (Csd - sxpart * (Csd + Cdd)) / qcheq; - - dsxpart_dVb = -(dsxpart_dVd + dsxpart_dVg - + dsxpart_dVs); - } - dxpart = 1.0 - sxpart; - ddxpart_dVd = -dsxpart_dVd; - ddxpart_dVg = -dsxpart_dVg; - ddxpart_dVs = -dsxpart_dVs; - ddxpart_dVb = -(ddxpart_dVd + ddxpart_dVg + ddxpart_dVs); - } - } - - if (model->BSIM4v7rdsMod == 1) - { gstot = here->BSIM4v7gstot; - gstotd = here->BSIM4v7gstotd; - gstotg = here->BSIM4v7gstotg; - gstots = here->BSIM4v7gstots - gstot; - gstotb = here->BSIM4v7gstotb; - - gdtot = here->BSIM4v7gdtot; - gdtotd = here->BSIM4v7gdtotd - gdtot; - gdtotg = here->BSIM4v7gdtotg; - gdtots = here->BSIM4v7gdtots; - gdtotb = here->BSIM4v7gdtotb; - } - else - { gstot = gstotd = gstotg = gstots = gstotb = 0.0; - gdtot = gdtotd = gdtotg = gdtots = gdtotb = 0.0; - } - - - T1 = *(ckt->CKTstate0 + here->BSIM4v7qdef) * here->BSIM4v7gtau; - gds = here->BSIM4v7gds; - - /* - * Loading PZ matrix - */ - m = here->BSIM4v7m; - - if (!model->BSIM4v7rdsMod) - { gdpr = here->BSIM4v7drainConductance; - gspr = here->BSIM4v7sourceConductance; - } - else - gdpr = gspr = 0.0; - - if (!here->BSIM4v7rbodyMod) - { gjbd = here->BSIM4v7gbd; - gjbs = here->BSIM4v7gbs; - } - else - gjbd = gjbs = 0.0; - - geltd = here->BSIM4v7grgeltd; - - if (here->BSIM4v7rgateMod == 1) - { *(here->BSIM4v7GEgePtr) += m * geltd; - *(here->BSIM4v7GPgePtr) -= m * geltd; - *(here->BSIM4v7GEgpPtr) -= m * geltd; - - *(here->BSIM4v7GPgpPtr ) += m * xcggb * s->real; - *(here->BSIM4v7GPgpPtr +1) += m * xcggb * s->imag; - *(here->BSIM4v7GPgpPtr) += m * (geltd - xgtg + gIgtotg); - *(here->BSIM4v7GPdpPtr ) += m * xcgdb * s->real; - *(here->BSIM4v7GPdpPtr +1) += m * xcgdb * s->imag; - *(here->BSIM4v7GPdpPtr) -= m * (xgtd - gIgtotd); - *(here->BSIM4v7GPspPtr ) += m * xcgsb * s->real; - *(here->BSIM4v7GPspPtr +1) += m * xcgsb * s->imag; - *(here->BSIM4v7GPspPtr) -= m * (xgts - gIgtots); - *(here->BSIM4v7GPbpPtr ) += m * xcgbb * s->real; - *(here->BSIM4v7GPbpPtr +1) += m * xcgbb * s->imag; - *(here->BSIM4v7GPbpPtr) -= m * (xgtb - gIgtotb); - } - else if (here->BSIM4v7rgateMod == 2) - { *(here->BSIM4v7GEgePtr) += m * gcrg; - *(here->BSIM4v7GEgpPtr) += m * gcrgg; - *(here->BSIM4v7GEdpPtr) += m * gcrgd; - *(here->BSIM4v7GEspPtr) += m * gcrgs; - *(here->BSIM4v7GEbpPtr) += m * gcrgb; - - *(here->BSIM4v7GPgePtr) -= m * gcrg; - *(here->BSIM4v7GPgpPtr ) += m * xcggb * s->real; - *(here->BSIM4v7GPgpPtr +1) += m * xcggb * s->imag; - *(here->BSIM4v7GPgpPtr) -= m * (gcrgg + xgtg - gIgtotg); - *(here->BSIM4v7GPdpPtr ) += m * xcgdb * s->real; - *(here->BSIM4v7GPdpPtr +1) += m * xcgdb * s->imag; - *(here->BSIM4v7GPdpPtr) -= m * (gcrgd + xgtd - gIgtotd); - *(here->BSIM4v7GPspPtr ) += m * xcgsb * s->real; - *(here->BSIM4v7GPspPtr +1) += m * xcgsb * s->imag; - *(here->BSIM4v7GPspPtr) -= m * (gcrgs + xgts - gIgtots); - *(here->BSIM4v7GPbpPtr ) += m * xcgbb * s->real; - *(here->BSIM4v7GPbpPtr +1) += m * xcgbb * s->imag; - *(here->BSIM4v7GPbpPtr) -= m * (gcrgb + xgtb - gIgtotb); - } - else if (here->BSIM4v7rgateMod == 3) - { *(here->BSIM4v7GEgePtr) += m * geltd; - *(here->BSIM4v7GEgmPtr) -= m * geltd; - *(here->BSIM4v7GMgePtr) -= m * geltd; - *(here->BSIM4v7GMgmPtr) += m * (geltd + gcrg); - *(here->BSIM4v7GMgmPtr ) += m * xcgmgmb * s->real; - *(here->BSIM4v7GMgmPtr +1) += m * xcgmgmb * s->imag; - - *(here->BSIM4v7GMdpPtr) += m * gcrgd; - *(here->BSIM4v7GMdpPtr ) += m * xcgmdb * s->real; - *(here->BSIM4v7GMdpPtr +1) += m * xcgmdb * s->imag; - *(here->BSIM4v7GMgpPtr) += m * gcrgg; - *(here->BSIM4v7GMspPtr) += m * gcrgs; - *(here->BSIM4v7GMspPtr ) += m * xcgmsb * s->real; - *(here->BSIM4v7GMspPtr +1) += m * xcgmsb * s->imag; - *(here->BSIM4v7GMbpPtr) += m * gcrgb; - *(here->BSIM4v7GMbpPtr ) += m * xcgmbb * s->real; - *(here->BSIM4v7GMbpPtr +1) += m * xcgmbb * s->imag; - - *(here->BSIM4v7DPgmPtr ) += m * xcdgmb * s->real; - *(here->BSIM4v7DPgmPtr +1) += m * xcdgmb * s->imag; - *(here->BSIM4v7GPgmPtr) -= m * gcrg; - *(here->BSIM4v7SPgmPtr ) += m * xcsgmb * s->real; - *(here->BSIM4v7SPgmPtr +1) += m * xcsgmb * s->imag; - *(here->BSIM4v7BPgmPtr ) += m * xcbgmb * s->real; - *(here->BSIM4v7BPgmPtr +1) += m * xcbgmb * s->imag; - - *(here->BSIM4v7GPgpPtr) -= m * (gcrgg + xgtg - gIgtotg); - *(here->BSIM4v7GPgpPtr ) += m * xcggb * s->real; - *(here->BSIM4v7GPgpPtr +1) += m * xcggb * s->imag; - *(here->BSIM4v7GPdpPtr) -= m * (gcrgd + xgtd - gIgtotd); - *(here->BSIM4v7GPdpPtr ) += m * xcgdb * s->real; - *(here->BSIM4v7GPdpPtr +1) += m * xcgdb * s->imag; - *(here->BSIM4v7GPspPtr) -= m * (gcrgs + xgts - gIgtots); - *(here->BSIM4v7GPspPtr ) += m * xcgsb * s->real; - *(here->BSIM4v7GPspPtr +1) += m * xcgsb * s->imag; - *(here->BSIM4v7GPbpPtr) -= m * (gcrgb + xgtb - gIgtotb); - *(here->BSIM4v7GPbpPtr ) += m * xcgbb * s->real; - *(here->BSIM4v7GPbpPtr +1) += m * xcgbb * s->imag; - } - else - { *(here->BSIM4v7GPdpPtr ) += m * xcgdb * s->real; - *(here->BSIM4v7GPdpPtr +1) += m * xcgdb * s->imag; - *(here->BSIM4v7GPdpPtr) -= m * (xgtd - gIgtotd); - *(here->BSIM4v7GPgpPtr ) += m * xcggb * s->real; - *(here->BSIM4v7GPgpPtr +1) += m * xcggb * s->imag; - *(here->BSIM4v7GPgpPtr) -= m * (xgtg - gIgtotg); - *(here->BSIM4v7GPspPtr ) += m * xcgsb * s->real; - *(here->BSIM4v7GPspPtr +1) += m * xcgsb * s->imag; - *(here->BSIM4v7GPspPtr) -= m * (xgts - gIgtots); - *(here->BSIM4v7GPbpPtr ) += m * xcgbb * s->real; - *(here->BSIM4v7GPbpPtr +1) += m * xcgbb * s->imag; - *(here->BSIM4v7GPbpPtr) -= m * (xgtb - gIgtotb); - } - - if (model->BSIM4v7rdsMod) - { (*(here->BSIM4v7DgpPtr) += m * gdtotg); - (*(here->BSIM4v7DspPtr) += m * gdtots); - (*(here->BSIM4v7DbpPtr) += m * gdtotb); - (*(here->BSIM4v7SdpPtr) += m * gstotd); - (*(here->BSIM4v7SgpPtr) += m * gstotg); - (*(here->BSIM4v7SbpPtr) += m * gstotb); - } - - *(here->BSIM4v7DPdpPtr ) += m * xcddb * s->real; - *(here->BSIM4v7DPdpPtr +1) += m * xcddb * s->imag; - *(here->BSIM4v7DPdpPtr) += m * (gdpr + gds + here->BSIM4v7gbd - - gdtotd + RevSum + gbdpdp - gIdtotd - + dxpart * xgtd + T1 * ddxpart_dVd); - *(here->BSIM4v7DPdPtr) -= m * (gdpr + gdtot); - *(here->BSIM4v7DPgpPtr ) += m * xcdgb * s->real; - *(here->BSIM4v7DPgpPtr +1) += m * xcdgb * s->imag; - *(here->BSIM4v7DPgpPtr) += m * (Gm - gdtotg + gbdpg - gIdtotg - + T1 * ddxpart_dVg + dxpart * xgtg); - *(here->BSIM4v7DPspPtr ) += m * xcdsb * s->real; - *(here->BSIM4v7DPspPtr +1) += m * xcdsb * s->imag; - *(here->BSIM4v7DPspPtr) -= m * (gds + FwdSum + gdtots - gbdpsp + gIdtots - - T1 * ddxpart_dVs - dxpart * xgts); - *(here->BSIM4v7DPbpPtr ) += m * xcdbb * s->real; - *(here->BSIM4v7DPbpPtr +1) += m * xcdbb * s->imag; - *(here->BSIM4v7DPbpPtr) -= m * (gjbd + gdtotb - Gmbs - gbdpb + gIdtotb - - T1 * ddxpart_dVb - dxpart * xgtb); - - *(here->BSIM4v7DdpPtr) -= m * (gdpr - gdtotd); - *(here->BSIM4v7DdPtr) += m * (gdpr + gdtot); - - *(here->BSIM4v7SPdpPtr ) += m * xcsdb * s->real; - *(here->BSIM4v7SPdpPtr +1) += m * xcsdb * s->imag; - *(here->BSIM4v7SPdpPtr) -= m * (gds + gstotd + RevSum - gbspdp + gIstotd - - T1 * dsxpart_dVd - sxpart * xgtd); - *(here->BSIM4v7SPgpPtr ) += m * xcsgb * s->real; - *(here->BSIM4v7SPgpPtr +1) += m * xcsgb * s->imag; - *(here->BSIM4v7SPgpPtr) -= m * (Gm + gstotg - gbspg + gIstotg - - T1 * dsxpart_dVg - sxpart * xgtg); - *(here->BSIM4v7SPspPtr ) += m * xcssb * s->real; - *(here->BSIM4v7SPspPtr +1) += m * xcssb * s->imag; - *(here->BSIM4v7SPspPtr) += m * (gspr + gds + here->BSIM4v7gbs - gIstots - - gstots + FwdSum + gbspsp - + sxpart * xgts + T1 * dsxpart_dVs); - *(here->BSIM4v7SPsPtr) -= m * (gspr + gstot); - *(here->BSIM4v7SPbpPtr ) += m * xcsbb * s->real; - *(here->BSIM4v7SPbpPtr +1) += m * xcsbb * s->imag; - *(here->BSIM4v7SPbpPtr) -= m * (gjbs + gstotb + Gmbs - gbspb + gIstotb - - T1 * dsxpart_dVb - sxpart * xgtb); - - *(here->BSIM4v7SspPtr) -= m * (gspr - gstots); - *(here->BSIM4v7SsPtr) += m * (gspr + gstot); - - *(here->BSIM4v7BPdpPtr ) += m * xcbdb * s->real; - *(here->BSIM4v7BPdpPtr +1) += m * xcbdb * s->imag; - *(here->BSIM4v7BPdpPtr) -= m * (gjbd - gbbdp + gIbtotd); - *(here->BSIM4v7BPgpPtr ) += m * xcbgb * s->real; - *(here->BSIM4v7BPgpPtr +1) += m * xcbgb * s->imag; - *(here->BSIM4v7BPgpPtr) -= m * (here->BSIM4v7gbgs + gIbtotg); - *(here->BSIM4v7BPspPtr ) += m * xcbsb * s->real; - *(here->BSIM4v7BPspPtr +1) += m * xcbsb * s->imag; - *(here->BSIM4v7BPspPtr) -= m * (gjbs - gbbsp + gIbtots); - *(here->BSIM4v7BPbpPtr ) += m * xcbbb * s->real; - *(here->BSIM4v7BPbpPtr +1) += m * xcbbb * s->imag; - *(here->BSIM4v7BPbpPtr) += m * (gjbd + gjbs - here->BSIM4v7gbbs - - gIbtotb); - ggidld = here->BSIM4v7ggidld; - ggidlg = here->BSIM4v7ggidlg; - ggidlb = here->BSIM4v7ggidlb; - ggislg = here->BSIM4v7ggislg; - ggisls = here->BSIM4v7ggisls; - ggislb = here->BSIM4v7ggislb; - - /* stamp gidl */ - (*(here->BSIM4v7DPdpPtr) += m * ggidld); - (*(here->BSIM4v7DPgpPtr) += m * ggidlg); - (*(here->BSIM4v7DPspPtr) -= m * ((ggidlg + ggidld) + ggidlb)); - (*(here->BSIM4v7DPbpPtr) += m * ggidlb); - (*(here->BSIM4v7BPdpPtr) -= m * ggidld); - (*(here->BSIM4v7BPgpPtr) -= m * ggidlg); - (*(here->BSIM4v7BPspPtr) += m * ((ggidlg + ggidld) + ggidlb)); - (*(here->BSIM4v7BPbpPtr) -= m * ggidlb); - /* stamp gisl */ - (*(here->BSIM4v7SPdpPtr) -= m * ((ggisls + ggislg) + ggislb)); - (*(here->BSIM4v7SPgpPtr) += m * ggislg); - (*(here->BSIM4v7SPspPtr) += m * ggisls); - (*(here->BSIM4v7SPbpPtr) += m * ggislb); - (*(here->BSIM4v7BPdpPtr) += m * ((ggislg + ggisls) + ggislb)); - (*(here->BSIM4v7BPgpPtr) -= m * ggislg); - (*(here->BSIM4v7BPspPtr) -= m * ggisls); - (*(here->BSIM4v7BPbpPtr) -= m * ggislb); - - if (here->BSIM4v7rbodyMod) - { (*(here->BSIM4v7DPdbPtr ) += m * xcdbdb * s->real); - (*(here->BSIM4v7DPdbPtr +1) += m * xcdbdb * s->imag); - (*(here->BSIM4v7DPdbPtr) -= m * here->BSIM4v7gbd); - (*(here->BSIM4v7SPsbPtr ) += m * xcsbsb * s->real); - (*(here->BSIM4v7SPsbPtr +1) += m * xcsbsb * s->imag); - (*(here->BSIM4v7SPsbPtr) -= m * here->BSIM4v7gbs); - - (*(here->BSIM4v7DBdpPtr ) += m * xcdbdb * s->real); - (*(here->BSIM4v7DBdpPtr +1) += m * xcdbdb * s->imag); - (*(here->BSIM4v7DBdpPtr) -= m * here->BSIM4v7gbd); - (*(here->BSIM4v7DBdbPtr ) -= m * xcdbdb * s->real); - (*(here->BSIM4v7DBdbPtr +1) -= m * xcdbdb * s->imag); - (*(here->BSIM4v7DBdbPtr) += m * (here->BSIM4v7gbd + here->BSIM4v7grbpd - + here->BSIM4v7grbdb)); - (*(here->BSIM4v7DBbpPtr) -= m * here->BSIM4v7grbpd); - (*(here->BSIM4v7DBbPtr) -= m * here->BSIM4v7grbdb); - - (*(here->BSIM4v7BPdbPtr) -= m * here->BSIM4v7grbpd); - (*(here->BSIM4v7BPbPtr) -= m * here->BSIM4v7grbpb); - (*(here->BSIM4v7BPsbPtr) -= m * here->BSIM4v7grbps); - (*(here->BSIM4v7BPbpPtr) += m * (here->BSIM4v7grbpd + here->BSIM4v7grbps - + here->BSIM4v7grbpb)); - /* WDL: (-here->BSIM4v7gbbs) already added to BPbpPtr */ - - (*(here->BSIM4v7SBspPtr ) += m * xcsbsb * s->real); - (*(here->BSIM4v7SBspPtr +1) += m * xcsbsb * s->imag); - (*(here->BSIM4v7SBspPtr) -= m * here->BSIM4v7gbs); - (*(here->BSIM4v7SBbpPtr) -= m * here->BSIM4v7grbps); - (*(here->BSIM4v7SBbPtr) -= m * here->BSIM4v7grbsb); - (*(here->BSIM4v7SBsbPtr ) -= m * xcsbsb * s->real); - (*(here->BSIM4v7SBsbPtr +1) -= m * xcsbsb * s->imag); - (*(here->BSIM4v7SBsbPtr) += m * (here->BSIM4v7gbs - + here->BSIM4v7grbps + here->BSIM4v7grbsb)); - - (*(here->BSIM4v7BdbPtr) -= m * here->BSIM4v7grbdb); - (*(here->BSIM4v7BbpPtr) -= m * here->BSIM4v7grbpb); - (*(here->BSIM4v7BsbPtr) -= m * here->BSIM4v7grbsb); - (*(here->BSIM4v7BbPtr) += m * (here->BSIM4v7grbsb + here->BSIM4v7grbdb - + here->BSIM4v7grbpb)); - } - - if (here->BSIM4v7acnqsMod) - { *(here->BSIM4v7QqPtr ) += m * s->real * ScalingFactor; - *(here->BSIM4v7QqPtr +1) += m * s->imag * ScalingFactor; - *(here->BSIM4v7QgpPtr ) -= m * xcqgb * s->real; - *(here->BSIM4v7QgpPtr +1) -= m * xcqgb * s->imag; - *(here->BSIM4v7QdpPtr ) -= m * xcqdb * s->real; - *(here->BSIM4v7QdpPtr +1) -= m * xcqdb * s->imag; - *(here->BSIM4v7QbpPtr ) -= m * xcqbb * s->real; - *(here->BSIM4v7QbpPtr +1) -= m * xcqbb * s->imag; - *(here->BSIM4v7QspPtr ) -= m * xcqsb * s->real; - *(here->BSIM4v7QspPtr +1) -= m * xcqsb * s->imag; - - *(here->BSIM4v7GPqPtr) -= m * here->BSIM4v7gtau; - *(here->BSIM4v7DPqPtr) += m * dxpart * here->BSIM4v7gtau; - *(here->BSIM4v7SPqPtr) += m * sxpart * here->BSIM4v7gtau; - - *(here->BSIM4v7QqPtr) += m * here->BSIM4v7gtau; - *(here->BSIM4v7QgpPtr) += m * xgtg; - *(here->BSIM4v7QdpPtr) += m * xgtd; - *(here->BSIM4v7QbpPtr) += m * xgtb; - *(here->BSIM4v7QspPtr) += m * xgts; - } - } - } - return(OK); -} diff --git a/src/spicelib/devices/bsim4v7/b4v7set.c b/src/spicelib/devices/bsim4v7/b4v7set.c deleted file mode 100644 index ed2fd017f..000000000 --- a/src/spicelib/devices/bsim4v7/b4v7set.c +++ /dev/null @@ -1,2685 +0,0 @@ -/**** BSIM4.7.0 Released by Darsen Lu 04/08/2011 ****/ - -/********** - * Copyright 2006 Regents of the University of California. All rights reserved. - * File: b4set.c of BSIM4.7.0. - * Author: 2000 Weidong Liu - * Authors: 2001- Xuemei Xi, Mohan Dunga, Ali Niknejad, Chenming Hu. - * Authors: 2006- Mohan Dunga, Ali Niknejad, Chenming Hu - * Authors: 2007- Mohan Dunga, Wenwei Yang, Ali Niknejad, Chenming Hu - * Authors: 2008- Wenwei Yang, Ali Niknejad, Chenming Hu - * Project Director: Prof. Chenming Hu. - * Modified by Xuemei Xi, 04/06/2001. - * Modified by Xuemei Xi, 10/05/2001. - * Modified by Xuemei Xi, 11/15/2002. - * Modified by Xuemei Xi, 05/09/2003. - * Modified by Xuemei Xi, 03/04/2004. - * Modified by Xuemei Xi, Mohan Dunga, 07/29/2005. - * Modified by Mohan Dunga, 12/13/2006 - * Modified by Mohan Dunga, Wenwei Yang, 05/18/2007. - * Modified by Wenwei Yang, 07/31/2008. - * Modified by Tanvir Morshed, Darsen Lu 03/27/2011 -**********/ - -#include "ngspice/ngspice.h" -#include "ngspice/jobdefs.h" -#include "ngspice/ftedefs.h" -#include "ngspice/smpdefs.h" -#include "ngspice/cktdefs.h" -#include "bsim4v7def.h" -#include "ngspice/const.h" -#include "ngspice/sperror.h" -#include "ngspice/suffix.h" - -#ifdef USE_OMP -#include "ngspice/cpextern.h" -#endif - -#define MAX_EXP 5.834617425e14 -#define MIN_EXP 1.713908431e-15 -#define EXP_THRESHOLD 34.0 -#define EPS0 8.85418e-12 -#define EPSSI 1.03594e-10 -#define PI 3.141592654 -#define Charge_q 1.60219e-19 - -int -BSIM4v7setup( -SMPmatrix *matrix, -GENmodel *inModel, -CKTcircuit *ckt, -int *states) -{ -BSIM4v7model *model = (BSIM4v7model*)inModel; -BSIM4v7instance *here; -int error; -CKTnode *tmp; -int noiseAnalGiven = 0, createNode; /* Criteria for new node creation */ -double Rtot, DMCGeff, DMCIeff, DMDGeff; -JOB *job; - -#ifdef USE_OMP -int idx, InstCount; -BSIM4v7instance **InstArray; -#endif - - /* Search for a noise analysis request */ - for (job = ((TSKtask *)ft_curckt->ci_curTask)->jobs;job;job = job->JOBnextJob) { - if(strcmp(job->JOBname,"Noise Analysis")==0) { - noiseAnalGiven = 1; - break; - } - } - - /* loop through all the BSIM4v7 device models */ - for( ; model != NULL; model = BSIM4v7nextModel(model)) - { /* process defaults of model parameters */ - if (!model->BSIM4v7typeGiven) - model->BSIM4v7type = NMOS; - - if (!model->BSIM4v7mobModGiven) - model->BSIM4v7mobMod = 0; - else if ((model->BSIM4v7mobMod != 0) && (model->BSIM4v7mobMod != 1) - && (model->BSIM4v7mobMod != 2)&& (model->BSIM4v7mobMod != 3)) - { model->BSIM4v7mobMod = 0; - printf("Warning: mobMod has been set to its default value: 0.\n"); - } - - if (!model->BSIM4v7binUnitGiven) - model->BSIM4v7binUnit = 1; - if (!model->BSIM4v7paramChkGiven) - model->BSIM4v7paramChk = 1; - - if (!model->BSIM4v7dioModGiven) - model->BSIM4v7dioMod = 1; - else if ((model->BSIM4v7dioMod != 0) && (model->BSIM4v7dioMod != 1) - && (model->BSIM4v7dioMod != 2)) - { model->BSIM4v7dioMod = 1; - printf("Warning: dioMod has been set to its default value: 1.\n"); - } - - if (!model->BSIM4v7cvchargeModGiven) - model->BSIM4v7cvchargeMod = 0; - if (!model->BSIM4v7capModGiven) - model->BSIM4v7capMod = 2; - else if ((model->BSIM4v7capMod != 0) && (model->BSIM4v7capMod != 1) - && (model->BSIM4v7capMod != 2)) - { model->BSIM4v7capMod = 2; - printf("Warning: capMod has been set to its default value: 2.\n"); - } - - if (!model->BSIM4v7rdsModGiven) - model->BSIM4v7rdsMod = 0; - else if ((model->BSIM4v7rdsMod != 0) && (model->BSIM4v7rdsMod != 1)) - { model->BSIM4v7rdsMod = 0; - printf("Warning: rdsMod has been set to its default value: 0.\n"); - } - if (!model->BSIM4v7rbodyModGiven) - model->BSIM4v7rbodyMod = 0; - else if ((model->BSIM4v7rbodyMod != 0) && (model->BSIM4v7rbodyMod != 1) && (model->BSIM4v7rbodyMod != 2)) - { model->BSIM4v7rbodyMod = 0; - printf("Warning: rbodyMod has been set to its default value: 0.\n"); - } - - if (!model->BSIM4v7rgateModGiven) - model->BSIM4v7rgateMod = 0; - else if ((model->BSIM4v7rgateMod != 0) && (model->BSIM4v7rgateMod != 1) - && (model->BSIM4v7rgateMod != 2) && (model->BSIM4v7rgateMod != 3)) - { model->BSIM4v7rgateMod = 0; - printf("Warning: rgateMod has been set to its default value: 0.\n"); - } - - if (!model->BSIM4v7perModGiven) - model->BSIM4v7perMod = 1; - else if ((model->BSIM4v7perMod != 0) && (model->BSIM4v7perMod != 1)) - { model->BSIM4v7perMod = 1; - printf("Warning: perMod has been set to its default value: 1.\n"); - } - - if (!model->BSIM4v7geoModGiven) - model->BSIM4v7geoMod = 0; - - if (!model->BSIM4v7rgeoModGiven) - model->BSIM4v7rgeoMod = 0; - else if ((model->BSIM4v7rgeoMod != 0) && (model->BSIM4v7rgeoMod != 1)) - { model->BSIM4v7rgeoMod = 1; - printf("Warning: rgeoMod has been set to its default value: 1.\n"); - } - if (!model->BSIM4v7fnoiModGiven) - model->BSIM4v7fnoiMod = 1; - else if ((model->BSIM4v7fnoiMod != 0) && (model->BSIM4v7fnoiMod != 1)) - { model->BSIM4v7fnoiMod = 1; - printf("Warning: fnoiMod has been set to its default value: 1.\n"); - } - if (!model->BSIM4v7tnoiModGiven) - model->BSIM4v7tnoiMod = 0; /* WDLiu: tnoiMod=1 needs to set internal S/D nodes */ - else if ((model->BSIM4v7tnoiMod != 0) && (model->BSIM4v7tnoiMod != 1) && (model->BSIM4v7tnoiMod != 2)) /* v4.7 */ - { model->BSIM4v7tnoiMod = 0; - printf("Warning: tnoiMod has been set to its default value: 0.\n"); - } - - if (!model->BSIM4v7trnqsModGiven) - model->BSIM4v7trnqsMod = 0; - else if ((model->BSIM4v7trnqsMod != 0) && (model->BSIM4v7trnqsMod != 1)) - { model->BSIM4v7trnqsMod = 0; - printf("Warning: trnqsMod has been set to its default value: 0.\n"); - } - if (!model->BSIM4v7acnqsModGiven) - model->BSIM4v7acnqsMod = 0; - else if ((model->BSIM4v7acnqsMod != 0) && (model->BSIM4v7acnqsMod != 1)) - { model->BSIM4v7acnqsMod = 0; - printf("Warning: acnqsMod has been set to its default value: 0.\n"); - } - - if (!model->BSIM4v7mtrlModGiven) - model->BSIM4v7mtrlMod = 0; - else if((model->BSIM4v7mtrlMod != 0) && (model->BSIM4v7mtrlMod != 1)) - { - model->BSIM4v7mtrlMod = 0; - printf("Warning: mtrlMod has been set to its default value: 0.\n"); - } - if (!model->BSIM4v7mtrlCompatModGiven) - model->BSIM4v7mtrlCompatMod = 0; - else if((model->BSIM4v7mtrlCompatMod != 0) && (model->BSIM4v7mtrlCompatMod != 1)) - { - model->BSIM4v7mtrlCompatMod = 0; - printf("Warning: mtrlCompatMod has been set to its default value: 0.\n"); - } - - if (!model->BSIM4v7igcModGiven) - model->BSIM4v7igcMod = 0; - else if ((model->BSIM4v7igcMod != 0) && (model->BSIM4v7igcMod != 1) - && (model->BSIM4v7igcMod != 2)) - { model->BSIM4v7igcMod = 0; - printf("Warning: igcMod has been set to its default value: 0.\n"); - } - if (!model->BSIM4v7igbModGiven) - model->BSIM4v7igbMod = 0; - else if ((model->BSIM4v7igbMod != 0) && (model->BSIM4v7igbMod != 1)) - { model->BSIM4v7igbMod = 0; - printf("Warning: igbMod has been set to its default value: 0.\n"); - } - if (!model->BSIM4v7tempModGiven) - model->BSIM4v7tempMod = 0; - else if ((model->BSIM4v7tempMod != 0) && (model->BSIM4v7tempMod != 1) - && (model->BSIM4v7tempMod != 2) && (model->BSIM4v7tempMod != 3)) - { model->BSIM4v7tempMod = 0; - printf("Warning: tempMod has been set to its default value: 0.\n"); - } - - if (!model->BSIM4v7versionGiven) - model->BSIM4v7version = copy("4.7.0"); - if (!model->BSIM4v7toxrefGiven) - model->BSIM4v7toxref = 30.0e-10; - if (!model->BSIM4v7eotGiven) - model->BSIM4v7eot = 15.0e-10; - if (!model->BSIM4v7vddeotGiven) - model->BSIM4v7vddeot = (model->BSIM4v7type == NMOS) ? 1.5 : -1.5; - if (!model->BSIM4v7tempeotGiven) - model->BSIM4v7tempeot = 300.15; - if (!model->BSIM4v7leffeotGiven) - model->BSIM4v7leffeot = 1; - if (!model->BSIM4v7weffeotGiven) - model->BSIM4v7weffeot = 10; - if (!model->BSIM4v7adosGiven) - model->BSIM4v7ados = 1.0; - if (!model->BSIM4v7bdosGiven) - model->BSIM4v7bdos = 1.0; - if (!model->BSIM4v7toxeGiven) - model->BSIM4v7toxe = 30.0e-10; - if (!model->BSIM4v7toxpGiven) - model->BSIM4v7toxp = model->BSIM4v7toxe; - if (!model->BSIM4v7toxmGiven) - model->BSIM4v7toxm = model->BSIM4v7toxe; - if (!model->BSIM4v7dtoxGiven) - model->BSIM4v7dtox = 0.0; - if (!model->BSIM4v7epsroxGiven) - model->BSIM4v7epsrox = 3.9; - - if (!model->BSIM4v7cdscGiven) - model->BSIM4v7cdsc = 2.4e-4; /* unit Q/V/m^2 */ - if (!model->BSIM4v7cdscbGiven) - model->BSIM4v7cdscb = 0.0; /* unit Q/V/m^2 */ - if (!model->BSIM4v7cdscdGiven) - model->BSIM4v7cdscd = 0.0; /* unit Q/V/m^2 */ - if (!model->BSIM4v7citGiven) - model->BSIM4v7cit = 0.0; /* unit Q/V/m^2 */ - if (!model->BSIM4v7nfactorGiven) - model->BSIM4v7nfactor = 1.0; - if (!model->BSIM4v7xjGiven) - model->BSIM4v7xj = .15e-6; - if (!model->BSIM4v7vsatGiven) - model->BSIM4v7vsat = 8.0e4; /* unit m/s */ - if (!model->BSIM4v7atGiven) - model->BSIM4v7at = 3.3e4; /* unit m/s */ - if (!model->BSIM4v7a0Given) - model->BSIM4v7a0 = 1.0; - if (!model->BSIM4v7agsGiven) - model->BSIM4v7ags = 0.0; - if (!model->BSIM4v7a1Given) - model->BSIM4v7a1 = 0.0; - if (!model->BSIM4v7a2Given) - model->BSIM4v7a2 = 1.0; - if (!model->BSIM4v7ketaGiven) - model->BSIM4v7keta = -0.047; /* unit / V */ - if (!model->BSIM4v7nsubGiven) - model->BSIM4v7nsub = 6.0e16; /* unit 1/cm3 */ - if (!model->BSIM4v7phigGiven) - model->BSIM4v7phig = 4.05; - if (!model->BSIM4v7epsrgateGiven) - model->BSIM4v7epsrgate = 11.7; - if (!model->BSIM4v7easubGiven) - model->BSIM4v7easub = 4.05; - if (!model->BSIM4v7epsrsubGiven) - model->BSIM4v7epsrsub = 11.7; - if (!model->BSIM4v7ni0subGiven) - model->BSIM4v7ni0sub = 1.45e10; /* unit 1/cm3 */ - if (!model->BSIM4v7bg0subGiven) - model->BSIM4v7bg0sub = 1.16; /* unit eV */ - if (!model->BSIM4v7tbgasubGiven) - model->BSIM4v7tbgasub = 7.02e-4; - if (!model->BSIM4v7tbgbsubGiven) - model->BSIM4v7tbgbsub = 1108.0; - if (!model->BSIM4v7ndepGiven) - model->BSIM4v7ndep = 1.7e17; /* unit 1/cm3 */ - if (!model->BSIM4v7nsdGiven) - model->BSIM4v7nsd = 1.0e20; /* unit 1/cm3 */ - if (!model->BSIM4v7phinGiven) - model->BSIM4v7phin = 0.0; /* unit V */ - if (!model->BSIM4v7ngateGiven) - model->BSIM4v7ngate = 0; /* unit 1/cm3 */ - if (!model->BSIM4v7vbmGiven) - model->BSIM4v7vbm = -3.0; - if (!model->BSIM4v7xtGiven) - model->BSIM4v7xt = 1.55e-7; - if (!model->BSIM4v7kt1Given) - model->BSIM4v7kt1 = -0.11; /* unit V */ - if (!model->BSIM4v7kt1lGiven) - model->BSIM4v7kt1l = 0.0; /* unit V*m */ - if (!model->BSIM4v7kt2Given) - model->BSIM4v7kt2 = 0.022; /* No unit */ - if (!model->BSIM4v7k3Given) - model->BSIM4v7k3 = 80.0; - if (!model->BSIM4v7k3bGiven) - model->BSIM4v7k3b = 0.0; - if (!model->BSIM4v7w0Given) - model->BSIM4v7w0 = 2.5e-6; - if (!model->BSIM4v7lpe0Given) - model->BSIM4v7lpe0 = 1.74e-7; - if (!model->BSIM4v7lpebGiven) - model->BSIM4v7lpeb = 0.0; - if (!model->BSIM4v7dvtp0Given) - model->BSIM4v7dvtp0 = 0.0; - if (!model->BSIM4v7dvtp1Given) - model->BSIM4v7dvtp1 = 0.0; - if (!model->BSIM4v7dvtp2Given) /* New DIBL/Rout */ - model->BSIM4v7dvtp2 = 0.0; - if (!model->BSIM4v7dvtp3Given) - model->BSIM4v7dvtp3 = 0.0; - if (!model->BSIM4v7dvtp4Given) - model->BSIM4v7dvtp4 = 0.0; - if (!model->BSIM4v7dvtp5Given) - model->BSIM4v7dvtp5 = 0.0; - if (!model->BSIM4v7dvt0Given) - model->BSIM4v7dvt0 = 2.2; - if (!model->BSIM4v7dvt1Given) - model->BSIM4v7dvt1 = 0.53; - if (!model->BSIM4v7dvt2Given) - model->BSIM4v7dvt2 = -0.032; /* unit 1 / V */ - - if (!model->BSIM4v7dvt0wGiven) - model->BSIM4v7dvt0w = 0.0; - if (!model->BSIM4v7dvt1wGiven) - model->BSIM4v7dvt1w = 5.3e6; - if (!model->BSIM4v7dvt2wGiven) - model->BSIM4v7dvt2w = -0.032; - - if (!model->BSIM4v7droutGiven) - model->BSIM4v7drout = 0.56; - if (!model->BSIM4v7dsubGiven) - model->BSIM4v7dsub = model->BSIM4v7drout; - if (!model->BSIM4v7vth0Given) - model->BSIM4v7vth0 = (model->BSIM4v7type == NMOS) ? 0.7 : -0.7; - if (!model->BSIM4v7vfbGiven) - model->BSIM4v7vfb = -1.0; - if (!model->BSIM4v7euGiven) - model->BSIM4v7eu = (model->BSIM4v7type == NMOS) ? 1.67 : 1.0; - if (!model->BSIM4v7ucsGiven) - model->BSIM4v7ucs = (model->BSIM4v7type == NMOS) ? 1.67 : 1.0; - if (!model->BSIM4v7uaGiven) - model->BSIM4v7ua = ((model->BSIM4v7mobMod == 2)) ? 1.0e-15 : 1.0e-9; /* unit m/V */ - if (!model->BSIM4v7ua1Given) - model->BSIM4v7ua1 = 1.0e-9; /* unit m/V */ - if (!model->BSIM4v7ubGiven) - model->BSIM4v7ub = 1.0e-19; /* unit (m/V)**2 */ - if (!model->BSIM4v7ub1Given) - model->BSIM4v7ub1 = -1.0e-18; /* unit (m/V)**2 */ - if (!model->BSIM4v7ucGiven) - model->BSIM4v7uc = (model->BSIM4v7mobMod == 1) ? -0.0465 : -0.0465e-9; - if (!model->BSIM4v7uc1Given) - model->BSIM4v7uc1 = (model->BSIM4v7mobMod == 1) ? -0.056 : -0.056e-9; - if (!model->BSIM4v7udGiven) - model->BSIM4v7ud = 0.0; /* unit m**(-2) */ - if (!model->BSIM4v7ud1Given) - model->BSIM4v7ud1 = 0.0; - if (!model->BSIM4v7upGiven) - model->BSIM4v7up = 0.0; - if (!model->BSIM4v7lpGiven) - model->BSIM4v7lp = 1.0e-8; - if (!model->BSIM4v7u0Given) - model->BSIM4v7u0 = (model->BSIM4v7type == NMOS) ? 0.067 : 0.025; - if (!model->BSIM4v7uteGiven) - model->BSIM4v7ute = -1.5; - if (!model->BSIM4v7ucsteGiven) - model->BSIM4v7ucste = -4.775e-3; - if (!model->BSIM4v7voffGiven) - model->BSIM4v7voff = -0.08; - if (!model->BSIM4v7vofflGiven) - model->BSIM4v7voffl = 0.0; - if (!model->BSIM4v7voffcvlGiven) - model->BSIM4v7voffcvl = 0.0; - if (!model->BSIM4v7minvGiven) - model->BSIM4v7minv = 0.0; - if (!model->BSIM4v7minvcvGiven) - model->BSIM4v7minvcv = 0.0; - if (!model->BSIM4v7fproutGiven) - model->BSIM4v7fprout = 0.0; - if (!model->BSIM4v7pditsGiven) - model->BSIM4v7pdits = 0.0; - if (!model->BSIM4v7pditsdGiven) - model->BSIM4v7pditsd = 0.0; - if (!model->BSIM4v7pditslGiven) - model->BSIM4v7pditsl = 0.0; - if (!model->BSIM4v7deltaGiven) - model->BSIM4v7delta = 0.01; - if (!model->BSIM4v7rdswminGiven) - model->BSIM4v7rdswmin = 0.0; - if (!model->BSIM4v7rdwminGiven) - model->BSIM4v7rdwmin = 0.0; - if (!model->BSIM4v7rswminGiven) - model->BSIM4v7rswmin = 0.0; - if (!model->BSIM4v7rdswGiven) - model->BSIM4v7rdsw = 200.0; /* in ohm*um */ - if (!model->BSIM4v7rdwGiven) - model->BSIM4v7rdw = 100.0; - if (!model->BSIM4v7rswGiven) - model->BSIM4v7rsw = 100.0; - if (!model->BSIM4v7prwgGiven) - model->BSIM4v7prwg = 1.0; /* in 1/V */ - if (!model->BSIM4v7prwbGiven) - model->BSIM4v7prwb = 0.0; - if (!model->BSIM4v7prtGiven) - model->BSIM4v7prt = 0.0; - if (!model->BSIM4v7eta0Given) - model->BSIM4v7eta0 = 0.08; /* no unit */ - if (!model->BSIM4v7etabGiven) - model->BSIM4v7etab = -0.07; /* unit 1/V */ - if (!model->BSIM4v7pclmGiven) - model->BSIM4v7pclm = 1.3; /* no unit */ - if (!model->BSIM4v7pdibl1Given) - model->BSIM4v7pdibl1 = 0.39; /* no unit */ - if (!model->BSIM4v7pdibl2Given) - model->BSIM4v7pdibl2 = 0.0086; /* no unit */ - if (!model->BSIM4v7pdiblbGiven) - model->BSIM4v7pdiblb = 0.0; /* 1/V */ - if (!model->BSIM4v7pscbe1Given) - model->BSIM4v7pscbe1 = 4.24e8; - if (!model->BSIM4v7pscbe2Given) - model->BSIM4v7pscbe2 = 1.0e-5; - if (!model->BSIM4v7pvagGiven) - model->BSIM4v7pvag = 0.0; - if (!model->BSIM4v7wrGiven) - model->BSIM4v7wr = 1.0; - if (!model->BSIM4v7dwgGiven) - model->BSIM4v7dwg = 0.0; - if (!model->BSIM4v7dwbGiven) - model->BSIM4v7dwb = 0.0; - if (!model->BSIM4v7b0Given) - model->BSIM4v7b0 = 0.0; - if (!model->BSIM4v7b1Given) - model->BSIM4v7b1 = 0.0; - if (!model->BSIM4v7alpha0Given) - model->BSIM4v7alpha0 = 0.0; - if (!model->BSIM4v7alpha1Given) - model->BSIM4v7alpha1 = 0.0; - if (!model->BSIM4v7beta0Given) - model->BSIM4v7beta0 = 0.0; - if (!model->BSIM4v7gidlModGiven) - model->BSIM4v7gidlMod = 0; /* v4.7 New GIDL/GISL */ - if (!model->BSIM4v7agidlGiven) - model->BSIM4v7agidl = 0.0; - if (!model->BSIM4v7bgidlGiven) - model->BSIM4v7bgidl = 2.3e9; /* V/m */ - if (!model->BSIM4v7cgidlGiven) - model->BSIM4v7cgidl = 0.5; /* V^3 */ - if (!model->BSIM4v7egidlGiven) - model->BSIM4v7egidl = 0.8; /* V */ - if (!model->BSIM4v7rgidlGiven) /* v4.7 New GIDL/GISL */ - model->BSIM4v7rgidl = 1.0; - if (!model->BSIM4v7kgidlGiven) /* v4.7 New GIDL/GISL */ - model->BSIM4v7kgidl = 0.0; - if (!model->BSIM4v7fgidlGiven) /* v4.7 New GIDL/GISL */ - model->BSIM4v7fgidl = 0.0; - if (!model->BSIM4v7agislGiven) - { - if (model->BSIM4v7agidlGiven) - model->BSIM4v7agisl = model->BSIM4v7agidl; - else - model->BSIM4v7agisl = 0.0; - } - if (!model->BSIM4v7bgislGiven) - { - if (model->BSIM4v7bgidlGiven) - model->BSIM4v7bgisl = model->BSIM4v7bgidl; - else - model->BSIM4v7bgisl = 2.3e9; /* V/m */ - } - if (!model->BSIM4v7cgislGiven) - { - if (model->BSIM4v7cgidlGiven) - model->BSIM4v7cgisl = model->BSIM4v7cgidl; - else - model->BSIM4v7cgisl = 0.5; /* V^3 */ - } - if (!model->BSIM4v7egislGiven) - { - if (model->BSIM4v7egidlGiven) - model->BSIM4v7egisl = model->BSIM4v7egidl; - else - model->BSIM4v7egisl = 0.8; /* V */ - } - if (!model->BSIM4v7rgislGiven) /* v4.7 New GIDL/GISL */ - model->BSIM4v7rgisl = model->BSIM4v7rgidl; - if (!model->BSIM4v7kgislGiven) /* v4.7 New GIDL/GISL */ - model->BSIM4v7kgisl = model->BSIM4v7kgidl; - if (!model->BSIM4v7fgislGiven) /* v4.7 New GIDL/GISL */ - model->BSIM4v7fgisl = model->BSIM4v7fgidl; - if (!model->BSIM4v7aigcGiven) - model->BSIM4v7aigc = (model->BSIM4v7type == NMOS) ? 1.36e-2 : 9.80e-3; - if (!model->BSIM4v7bigcGiven) - model->BSIM4v7bigc = (model->BSIM4v7type == NMOS) ? 1.71e-3 : 7.59e-4; - if (!model->BSIM4v7cigcGiven) - model->BSIM4v7cigc = (model->BSIM4v7type == NMOS) ? 0.075 : 0.03; - if (model->BSIM4v7aigsdGiven) - { - model->BSIM4v7aigs = model->BSIM4v7aigd = model->BSIM4v7aigsd; - } - else - { - model->BSIM4v7aigsd = (model->BSIM4v7type == NMOS) ? 1.36e-2 : 9.80e-3; - if (!model->BSIM4v7aigsGiven) - model->BSIM4v7aigs = (model->BSIM4v7type == NMOS) ? 1.36e-2 : 9.80e-3; - if (!model->BSIM4v7aigdGiven) - model->BSIM4v7aigd = (model->BSIM4v7type == NMOS) ? 1.36e-2 : 9.80e-3; - } - if (model->BSIM4v7bigsdGiven) - { - model->BSIM4v7bigs = model->BSIM4v7bigd = model->BSIM4v7bigsd; - } - else - { - model->BSIM4v7bigsd = (model->BSIM4v7type == NMOS) ? 1.71e-3 : 7.59e-4; - if (!model->BSIM4v7bigsGiven) - model->BSIM4v7bigs = (model->BSIM4v7type == NMOS) ? 1.71e-3 : 7.59e-4; - if (!model->BSIM4v7bigdGiven) - model->BSIM4v7bigd = (model->BSIM4v7type == NMOS) ? 1.71e-3 : 7.59e-4; - } - if (model->BSIM4v7cigsdGiven) - { - model->BSIM4v7cigs = model->BSIM4v7cigd = model->BSIM4v7cigsd; - } - else - { - model->BSIM4v7cigsd = (model->BSIM4v7type == NMOS) ? 0.075 : 0.03; - if (!model->BSIM4v7cigsGiven) - model->BSIM4v7cigs = (model->BSIM4v7type == NMOS) ? 0.075 : 0.03; - if (!model->BSIM4v7cigdGiven) - model->BSIM4v7cigd = (model->BSIM4v7type == NMOS) ? 0.075 : 0.03; - } - if (!model->BSIM4v7aigbaccGiven) - model->BSIM4v7aigbacc = 1.36e-2; - if (!model->BSIM4v7bigbaccGiven) - model->BSIM4v7bigbacc = 1.71e-3; - if (!model->BSIM4v7cigbaccGiven) - model->BSIM4v7cigbacc = 0.075; - if (!model->BSIM4v7aigbinvGiven) - model->BSIM4v7aigbinv = 1.11e-2; - if (!model->BSIM4v7bigbinvGiven) - model->BSIM4v7bigbinv = 9.49e-4; - if (!model->BSIM4v7cigbinvGiven) - model->BSIM4v7cigbinv = 0.006; - if (!model->BSIM4v7nigcGiven) - model->BSIM4v7nigc = 1.0; - if (!model->BSIM4v7nigbinvGiven) - model->BSIM4v7nigbinv = 3.0; - if (!model->BSIM4v7nigbaccGiven) - model->BSIM4v7nigbacc = 1.0; - if (!model->BSIM4v7ntoxGiven) - model->BSIM4v7ntox = 1.0; - if (!model->BSIM4v7eigbinvGiven) - model->BSIM4v7eigbinv = 1.1; - if (!model->BSIM4v7pigcdGiven) - model->BSIM4v7pigcd = 1.0; - if (!model->BSIM4v7poxedgeGiven) - model->BSIM4v7poxedge = 1.0; - if (!model->BSIM4v7xrcrg1Given) - model->BSIM4v7xrcrg1 = 12.0; - if (!model->BSIM4v7xrcrg2Given) - model->BSIM4v7xrcrg2 = 1.0; - if (!model->BSIM4v7ijthsfwdGiven) - model->BSIM4v7ijthsfwd = 0.1; /* unit A */ - if (!model->BSIM4v7ijthdfwdGiven) - model->BSIM4v7ijthdfwd = model->BSIM4v7ijthsfwd; - if (!model->BSIM4v7ijthsrevGiven) - model->BSIM4v7ijthsrev = 0.1; /* unit A */ - if (!model->BSIM4v7ijthdrevGiven) - model->BSIM4v7ijthdrev = model->BSIM4v7ijthsrev; - if (!model->BSIM4v7tnoiaGiven) - model->BSIM4v7tnoia = 1.5; - if (!model->BSIM4v7tnoibGiven) - model->BSIM4v7tnoib = 3.5; - if (!model->BSIM4v7tnoicGiven) - model->BSIM4v7tnoic = 0.0; - if (!model->BSIM4v7rnoiaGiven) - model->BSIM4v7rnoia = 0.577; - if (!model->BSIM4v7rnoibGiven) - model->BSIM4v7rnoib = 0.5164; - if (!model->BSIM4v7rnoicGiven) - model->BSIM4v7rnoic = 0.395; - if (!model->BSIM4v7ntnoiGiven) - model->BSIM4v7ntnoi = 1.0; - if (!model->BSIM4v7lambdaGiven) - model->BSIM4v7lambda = 0.0; - if (!model->BSIM4v7vtlGiven) - model->BSIM4v7vtl = 2.0e5; /* unit m/s */ - if (!model->BSIM4v7xnGiven) - model->BSIM4v7xn = 3.0; - if (!model->BSIM4v7lcGiven) - model->BSIM4v7lc = 5.0e-9; - if (!model->BSIM4v7vfbsdoffGiven) - model->BSIM4v7vfbsdoff = 0.0; /* unit v */ - if (!model->BSIM4v7tvfbsdoffGiven) - model->BSIM4v7tvfbsdoff = 0.0; - if (!model->BSIM4v7tvoffGiven) - model->BSIM4v7tvoff = 0.0; - if (!model->BSIM4v7tnfactorGiven) /* v4.7 temp dep of leakage current */ - model->BSIM4v7tnfactor = 0.0; - if (!model->BSIM4v7teta0Given) /* v4.7 temp dep of leakage current */ - model->BSIM4v7teta0 = 0.0; - if (!model->BSIM4v7tvoffcvGiven) /* v4.7 temp dep of leakage current */ - model->BSIM4v7tvoffcv = 0.0; - - if (!model->BSIM4v7lintnoiGiven) - model->BSIM4v7lintnoi = 0.0; /* unit m */ - - if (!model->BSIM4v7xjbvsGiven) - model->BSIM4v7xjbvs = 1.0; /* no unit */ - if (!model->BSIM4v7xjbvdGiven) - model->BSIM4v7xjbvd = model->BSIM4v7xjbvs; - if (!model->BSIM4v7bvsGiven) - model->BSIM4v7bvs = 10.0; /* V */ - if (!model->BSIM4v7bvdGiven) - model->BSIM4v7bvd = model->BSIM4v7bvs; - - if (!model->BSIM4v7gbminGiven) - model->BSIM4v7gbmin = 1.0e-12; /* in mho */ - if (!model->BSIM4v7rbdbGiven) - model->BSIM4v7rbdb = 50.0; /* in ohm */ - if (!model->BSIM4v7rbpbGiven) - model->BSIM4v7rbpb = 50.0; - if (!model->BSIM4v7rbsbGiven) - model->BSIM4v7rbsb = 50.0; - if (!model->BSIM4v7rbpsGiven) - model->BSIM4v7rbps = 50.0; - if (!model->BSIM4v7rbpdGiven) - model->BSIM4v7rbpd = 50.0; - - if (!model->BSIM4v7rbps0Given) - model->BSIM4v7rbps0 = 50.0; - if (!model->BSIM4v7rbpslGiven) - model->BSIM4v7rbpsl = 0.0; - if (!model->BSIM4v7rbpswGiven) - model->BSIM4v7rbpsw = 0.0; - if (!model->BSIM4v7rbpsnfGiven) - model->BSIM4v7rbpsnf = 0.0; - - if (!model->BSIM4v7rbpd0Given) - model->BSIM4v7rbpd0 = 50.0; - if (!model->BSIM4v7rbpdlGiven) - model->BSIM4v7rbpdl = 0.0; - if (!model->BSIM4v7rbpdwGiven) - model->BSIM4v7rbpdw = 0.0; - if (!model->BSIM4v7rbpdnfGiven) - model->BSIM4v7rbpdnf = 0.0; - - if (!model->BSIM4v7rbpbx0Given) - model->BSIM4v7rbpbx0 = 100.0; - if (!model->BSIM4v7rbpbxlGiven) - model->BSIM4v7rbpbxl = 0.0; - if (!model->BSIM4v7rbpbxwGiven) - model->BSIM4v7rbpbxw = 0.0; - if (!model->BSIM4v7rbpbxnfGiven) - model->BSIM4v7rbpbxnf = 0.0; - if (!model->BSIM4v7rbpby0Given) - model->BSIM4v7rbpby0 = 100.0; - if (!model->BSIM4v7rbpbylGiven) - model->BSIM4v7rbpbyl = 0.0; - if (!model->BSIM4v7rbpbywGiven) - model->BSIM4v7rbpbyw = 0.0; - if (!model->BSIM4v7rbpbynfGiven) - model->BSIM4v7rbpbynf = 0.0; - - - if (!model->BSIM4v7rbsbx0Given) - model->BSIM4v7rbsbx0 = 100.0; - if (!model->BSIM4v7rbsby0Given) - model->BSIM4v7rbsby0 = 100.0; - if (!model->BSIM4v7rbdbx0Given) - model->BSIM4v7rbdbx0 = 100.0; - if (!model->BSIM4v7rbdby0Given) - model->BSIM4v7rbdby0 = 100.0; - - - if (!model->BSIM4v7rbsdbxlGiven) - model->BSIM4v7rbsdbxl = 0.0; - if (!model->BSIM4v7rbsdbxwGiven) - model->BSIM4v7rbsdbxw = 0.0; - if (!model->BSIM4v7rbsdbxnfGiven) - model->BSIM4v7rbsdbxnf = 0.0; - if (!model->BSIM4v7rbsdbylGiven) - model->BSIM4v7rbsdbyl = 0.0; - if (!model->BSIM4v7rbsdbywGiven) - model->BSIM4v7rbsdbyw = 0.0; - if (!model->BSIM4v7rbsdbynfGiven) - model->BSIM4v7rbsdbynf = 0.0; - - if (!model->BSIM4v7cgslGiven) - model->BSIM4v7cgsl = 0.0; - if (!model->BSIM4v7cgdlGiven) - model->BSIM4v7cgdl = 0.0; - if (!model->BSIM4v7ckappasGiven) - model->BSIM4v7ckappas = 0.6; - if (!model->BSIM4v7ckappadGiven) - model->BSIM4v7ckappad = model->BSIM4v7ckappas; - if (!model->BSIM4v7clcGiven) - model->BSIM4v7clc = 0.1e-6; - if (!model->BSIM4v7cleGiven) - model->BSIM4v7cle = 0.6; - if (!model->BSIM4v7vfbcvGiven) - model->BSIM4v7vfbcv = -1.0; - if (!model->BSIM4v7acdeGiven) - model->BSIM4v7acde = 1.0; - if (!model->BSIM4v7moinGiven) - model->BSIM4v7moin = 15.0; - if (!model->BSIM4v7noffGiven) - model->BSIM4v7noff = 1.0; - if (!model->BSIM4v7voffcvGiven) - model->BSIM4v7voffcv = 0.0; - if (!model->BSIM4v7dmcgGiven) - model->BSIM4v7dmcg = 0.0; - if (!model->BSIM4v7dmciGiven) - model->BSIM4v7dmci = model->BSIM4v7dmcg; - if (!model->BSIM4v7dmdgGiven) - model->BSIM4v7dmdg = 0.0; - if (!model->BSIM4v7dmcgtGiven) - model->BSIM4v7dmcgt = 0.0; - if (!model->BSIM4v7xgwGiven) - model->BSIM4v7xgw = 0.0; - if (!model->BSIM4v7xglGiven) - model->BSIM4v7xgl = 0.0; - if (!model->BSIM4v7rshgGiven) - model->BSIM4v7rshg = 0.1; - if (!model->BSIM4v7ngconGiven) - model->BSIM4v7ngcon = 1.0; - if (!model->BSIM4v7tcjGiven) - model->BSIM4v7tcj = 0.0; - if (!model->BSIM4v7tpbGiven) - model->BSIM4v7tpb = 0.0; - if (!model->BSIM4v7tcjswGiven) - model->BSIM4v7tcjsw = 0.0; - if (!model->BSIM4v7tpbswGiven) - model->BSIM4v7tpbsw = 0.0; - if (!model->BSIM4v7tcjswgGiven) - model->BSIM4v7tcjswg = 0.0; - if (!model->BSIM4v7tpbswgGiven) - model->BSIM4v7tpbswg = 0.0; - - /* Length dependence */ - if (!model->BSIM4v7lcdscGiven) - model->BSIM4v7lcdsc = 0.0; - if (!model->BSIM4v7lcdscbGiven) - model->BSIM4v7lcdscb = 0.0; - if (!model->BSIM4v7lcdscdGiven) - model->BSIM4v7lcdscd = 0.0; - if (!model->BSIM4v7lcitGiven) - model->BSIM4v7lcit = 0.0; - if (!model->BSIM4v7lnfactorGiven) - model->BSIM4v7lnfactor = 0.0; - if (!model->BSIM4v7lxjGiven) - model->BSIM4v7lxj = 0.0; - if (!model->BSIM4v7lvsatGiven) - model->BSIM4v7lvsat = 0.0; - if (!model->BSIM4v7latGiven) - model->BSIM4v7lat = 0.0; - if (!model->BSIM4v7la0Given) - model->BSIM4v7la0 = 0.0; - if (!model->BSIM4v7lagsGiven) - model->BSIM4v7lags = 0.0; - if (!model->BSIM4v7la1Given) - model->BSIM4v7la1 = 0.0; - if (!model->BSIM4v7la2Given) - model->BSIM4v7la2 = 0.0; - if (!model->BSIM4v7lketaGiven) - model->BSIM4v7lketa = 0.0; - if (!model->BSIM4v7lnsubGiven) - model->BSIM4v7lnsub = 0.0; - if (!model->BSIM4v7lndepGiven) - model->BSIM4v7lndep = 0.0; - if (!model->BSIM4v7lnsdGiven) - model->BSIM4v7lnsd = 0.0; - if (!model->BSIM4v7lphinGiven) - model->BSIM4v7lphin = 0.0; - if (!model->BSIM4v7lngateGiven) - model->BSIM4v7lngate = 0.0; - if (!model->BSIM4v7lvbmGiven) - model->BSIM4v7lvbm = 0.0; - if (!model->BSIM4v7lxtGiven) - model->BSIM4v7lxt = 0.0; - if (!model->BSIM4v7lkt1Given) - model->BSIM4v7lkt1 = 0.0; - if (!model->BSIM4v7lkt1lGiven) - model->BSIM4v7lkt1l = 0.0; - if (!model->BSIM4v7lkt2Given) - model->BSIM4v7lkt2 = 0.0; - if (!model->BSIM4v7lk3Given) - model->BSIM4v7lk3 = 0.0; - if (!model->BSIM4v7lk3bGiven) - model->BSIM4v7lk3b = 0.0; - if (!model->BSIM4v7lw0Given) - model->BSIM4v7lw0 = 0.0; - if (!model->BSIM4v7llpe0Given) - model->BSIM4v7llpe0 = 0.0; - if (!model->BSIM4v7llpebGiven) - model->BSIM4v7llpeb = 0.0; - if (!model->BSIM4v7ldvtp0Given) - model->BSIM4v7ldvtp0 = 0.0; - if (!model->BSIM4v7ldvtp1Given) - model->BSIM4v7ldvtp1 = 0.0; - if (!model->BSIM4v7ldvtp2Given) /* New DIBL/Rout */ - model->BSIM4v7ldvtp2 = 0.0; - if (!model->BSIM4v7ldvtp3Given) - model->BSIM4v7ldvtp3 = 0.0; - if (!model->BSIM4v7ldvtp4Given) - model->BSIM4v7ldvtp4 = 0.0; - if (!model->BSIM4v7ldvtp5Given) - model->BSIM4v7ldvtp5 = 0.0; - if (!model->BSIM4v7ldvt0Given) - model->BSIM4v7ldvt0 = 0.0; - if (!model->BSIM4v7ldvt1Given) - model->BSIM4v7ldvt1 = 0.0; - if (!model->BSIM4v7ldvt2Given) - model->BSIM4v7ldvt2 = 0.0; - if (!model->BSIM4v7ldvt0wGiven) - model->BSIM4v7ldvt0w = 0.0; - if (!model->BSIM4v7ldvt1wGiven) - model->BSIM4v7ldvt1w = 0.0; - if (!model->BSIM4v7ldvt2wGiven) - model->BSIM4v7ldvt2w = 0.0; - if (!model->BSIM4v7ldroutGiven) - model->BSIM4v7ldrout = 0.0; - if (!model->BSIM4v7ldsubGiven) - model->BSIM4v7ldsub = 0.0; - if (!model->BSIM4v7lvth0Given) - model->BSIM4v7lvth0 = 0.0; - if (!model->BSIM4v7luaGiven) - model->BSIM4v7lua = 0.0; - if (!model->BSIM4v7lua1Given) - model->BSIM4v7lua1 = 0.0; - if (!model->BSIM4v7lubGiven) - model->BSIM4v7lub = 0.0; - if (!model->BSIM4v7lub1Given) - model->BSIM4v7lub1 = 0.0; - if (!model->BSIM4v7lucGiven) - model->BSIM4v7luc = 0.0; - if (!model->BSIM4v7luc1Given) - model->BSIM4v7luc1 = 0.0; - if (!model->BSIM4v7ludGiven) - model->BSIM4v7lud = 0.0; - if (!model->BSIM4v7lud1Given) - model->BSIM4v7lud1 = 0.0; - if (!model->BSIM4v7lupGiven) - model->BSIM4v7lup = 0.0; - if (!model->BSIM4v7llpGiven) - model->BSIM4v7llp = 0.0; - if (!model->BSIM4v7lu0Given) - model->BSIM4v7lu0 = 0.0; - if (!model->BSIM4v7luteGiven) - model->BSIM4v7lute = 0.0; - if (!model->BSIM4v7lucsteGiven) - model->BSIM4v7lucste = 0.0; - if (!model->BSIM4v7lvoffGiven) - model->BSIM4v7lvoff = 0.0; - if (!model->BSIM4v7lminvGiven) - model->BSIM4v7lminv = 0.0; - if (!model->BSIM4v7lminvcvGiven) - model->BSIM4v7lminvcv = 0.0; - if (!model->BSIM4v7lfproutGiven) - model->BSIM4v7lfprout = 0.0; - if (!model->BSIM4v7lpditsGiven) - model->BSIM4v7lpdits = 0.0; - if (!model->BSIM4v7lpditsdGiven) - model->BSIM4v7lpditsd = 0.0; - if (!model->BSIM4v7ldeltaGiven) - model->BSIM4v7ldelta = 0.0; - if (!model->BSIM4v7lrdswGiven) - model->BSIM4v7lrdsw = 0.0; - if (!model->BSIM4v7lrdwGiven) - model->BSIM4v7lrdw = 0.0; - if (!model->BSIM4v7lrswGiven) - model->BSIM4v7lrsw = 0.0; - if (!model->BSIM4v7lprwbGiven) - model->BSIM4v7lprwb = 0.0; - if (!model->BSIM4v7lprwgGiven) - model->BSIM4v7lprwg = 0.0; - if (!model->BSIM4v7lprtGiven) - model->BSIM4v7lprt = 0.0; - if (!model->BSIM4v7leta0Given) - model->BSIM4v7leta0 = 0.0; - if (!model->BSIM4v7letabGiven) - model->BSIM4v7letab = -0.0; - if (!model->BSIM4v7lpclmGiven) - model->BSIM4v7lpclm = 0.0; - if (!model->BSIM4v7lpdibl1Given) - model->BSIM4v7lpdibl1 = 0.0; - if (!model->BSIM4v7lpdibl2Given) - model->BSIM4v7lpdibl2 = 0.0; - if (!model->BSIM4v7lpdiblbGiven) - model->BSIM4v7lpdiblb = 0.0; - if (!model->BSIM4v7lpscbe1Given) - model->BSIM4v7lpscbe1 = 0.0; - if (!model->BSIM4v7lpscbe2Given) - model->BSIM4v7lpscbe2 = 0.0; - if (!model->BSIM4v7lpvagGiven) - model->BSIM4v7lpvag = 0.0; - if (!model->BSIM4v7lwrGiven) - model->BSIM4v7lwr = 0.0; - if (!model->BSIM4v7ldwgGiven) - model->BSIM4v7ldwg = 0.0; - if (!model->BSIM4v7ldwbGiven) - model->BSIM4v7ldwb = 0.0; - if (!model->BSIM4v7lb0Given) - model->BSIM4v7lb0 = 0.0; - if (!model->BSIM4v7lb1Given) - model->BSIM4v7lb1 = 0.0; - if (!model->BSIM4v7lalpha0Given) - model->BSIM4v7lalpha0 = 0.0; - if (!model->BSIM4v7lalpha1Given) - model->BSIM4v7lalpha1 = 0.0; - if (!model->BSIM4v7lbeta0Given) - model->BSIM4v7lbeta0 = 0.0; - if (!model->BSIM4v7lagidlGiven) - model->BSIM4v7lagidl = 0.0; - if (!model->BSIM4v7lbgidlGiven) - model->BSIM4v7lbgidl = 0.0; - if (!model->BSIM4v7lcgidlGiven) - model->BSIM4v7lcgidl = 0.0; - if (!model->BSIM4v7legidlGiven) - model->BSIM4v7legidl = 0.0; - if (!model->BSIM4v7lrgidlGiven) /* v4.7 New GIDL/GISL */ - model->BSIM4v7lrgidl = 0.0; - if (!model->BSIM4v7lkgidlGiven) /* v4.7 New GIDL/GISL */ - model->BSIM4v7lkgidl = 0.0; - if (!model->BSIM4v7lfgidlGiven) /* v4.7 New GIDL/GISL */ - model->BSIM4v7lfgidl = 0.0; - - if (!model->BSIM4v7lagislGiven) - { - if (model->BSIM4v7lagidlGiven) - model->BSIM4v7lagisl = model->BSIM4v7lagidl; - else - model->BSIM4v7lagisl = 0.0; - } - if (!model->BSIM4v7lbgislGiven) - { - if (model->BSIM4v7lbgidlGiven) - model->BSIM4v7lbgisl = model->BSIM4v7lbgidl; - else - model->BSIM4v7lbgisl = 0.0; - } - if (!model->BSIM4v7lcgislGiven) - { - if (model->BSIM4v7lcgidlGiven) - model->BSIM4v7lcgisl = model->BSIM4v7lcgidl; - else - model->BSIM4v7lcgisl = 0.0; - } - if (!model->BSIM4v7legislGiven) - { - if (model->BSIM4v7legidlGiven) - model->BSIM4v7legisl = model->BSIM4v7legidl; - else - model->BSIM4v7legisl = 0.0; - } - if (!model->BSIM4v7lrgislGiven) /* v4.7 New GIDL/GISL */ - { - if (model->BSIM4v7lrgidlGiven) - model->BSIM4v7lrgisl = model->BSIM4v7lrgidl; - } - if (!model->BSIM4v7lkgislGiven) /* v4.7 New GIDL/GISL */ - { - if (model->BSIM4v7lkgidlGiven) - model->BSIM4v7lkgisl = model->BSIM4v7lkgidl; - } - if (!model->BSIM4v7lfgislGiven) /* v4.7 New GIDL/GISL */ - { - if (model->BSIM4v7lfgidlGiven) - model->BSIM4v7lfgisl = model->BSIM4v7lfgidl; - } - if (!model->BSIM4v7laigcGiven) - model->BSIM4v7laigc = 0.0; - if (!model->BSIM4v7lbigcGiven) - model->BSIM4v7lbigc = 0.0; - if (!model->BSIM4v7lcigcGiven) - model->BSIM4v7lcigc = 0.0; - if (!model->BSIM4v7aigsdGiven && (model->BSIM4v7aigsGiven || model->BSIM4v7aigdGiven)) - { - if (!model->BSIM4v7laigsGiven) - model->BSIM4v7laigs = 0.0; - if (!model->BSIM4v7laigdGiven) - model->BSIM4v7laigd = 0.0; - } - else - { - if (!model->BSIM4v7laigsdGiven) - model->BSIM4v7laigsd = 0.0; - model->BSIM4v7laigs = model->BSIM4v7laigd = model->BSIM4v7laigsd; - } - if (!model->BSIM4v7bigsdGiven && (model->BSIM4v7bigsGiven || model->BSIM4v7bigdGiven)) - { - if (!model->BSIM4v7lbigsGiven) - model->BSIM4v7lbigs = 0.0; - if (!model->BSIM4v7lbigdGiven) - model->BSIM4v7lbigd = 0.0; - } - else - { - if (!model->BSIM4v7lbigsdGiven) - model->BSIM4v7lbigsd = 0.0; - model->BSIM4v7lbigs = model->BSIM4v7lbigd = model->BSIM4v7lbigsd; - } - if (!model->BSIM4v7cigsdGiven && (model->BSIM4v7cigsGiven || model->BSIM4v7cigdGiven)) - { - if (!model->BSIM4v7lcigsGiven) - model->BSIM4v7lcigs = 0.0; - if (!model->BSIM4v7lcigdGiven) - model->BSIM4v7lcigd = 0.0; - } - else - { - if (!model->BSIM4v7lcigsdGiven) - model->BSIM4v7lcigsd = 0.0; - model->BSIM4v7lcigs = model->BSIM4v7lcigd = model->BSIM4v7lcigsd; - } - if (!model->BSIM4v7laigbaccGiven) - model->BSIM4v7laigbacc = 0.0; - if (!model->BSIM4v7lbigbaccGiven) - model->BSIM4v7lbigbacc = 0.0; - if (!model->BSIM4v7lcigbaccGiven) - model->BSIM4v7lcigbacc = 0.0; - if (!model->BSIM4v7laigbinvGiven) - model->BSIM4v7laigbinv = 0.0; - if (!model->BSIM4v7lbigbinvGiven) - model->BSIM4v7lbigbinv = 0.0; - if (!model->BSIM4v7lcigbinvGiven) - model->BSIM4v7lcigbinv = 0.0; - if (!model->BSIM4v7lnigcGiven) - model->BSIM4v7lnigc = 0.0; - if (!model->BSIM4v7lnigbinvGiven) - model->BSIM4v7lnigbinv = 0.0; - if (!model->BSIM4v7lnigbaccGiven) - model->BSIM4v7lnigbacc = 0.0; - if (!model->BSIM4v7lntoxGiven) - model->BSIM4v7lntox = 0.0; - if (!model->BSIM4v7leigbinvGiven) - model->BSIM4v7leigbinv = 0.0; - if (!model->BSIM4v7lpigcdGiven) - model->BSIM4v7lpigcd = 0.0; - if (!model->BSIM4v7lpoxedgeGiven) - model->BSIM4v7lpoxedge = 0.0; - if (!model->BSIM4v7lxrcrg1Given) - model->BSIM4v7lxrcrg1 = 0.0; - if (!model->BSIM4v7lxrcrg2Given) - model->BSIM4v7lxrcrg2 = 0.0; - if (!model->BSIM4v7leuGiven) - model->BSIM4v7leu = 0.0; - if (!model->BSIM4v7lucsGiven) - model->BSIM4v7lucs = 0.0; - if (!model->BSIM4v7lvfbGiven) - model->BSIM4v7lvfb = 0.0; - if (!model->BSIM4v7llambdaGiven) - model->BSIM4v7llambda = 0.0; - if (!model->BSIM4v7lvtlGiven) - model->BSIM4v7lvtl = 0.0; - if (!model->BSIM4v7lxnGiven) - model->BSIM4v7lxn = 0.0; - if (!model->BSIM4v7lvfbsdoffGiven) - model->BSIM4v7lvfbsdoff = 0.0; - if (!model->BSIM4v7ltvfbsdoffGiven) - model->BSIM4v7ltvfbsdoff = 0.0; - if (!model->BSIM4v7ltvoffGiven) - model->BSIM4v7ltvoff = 0.0; - if (!model->BSIM4v7ltnfactorGiven) /* v4.7 temp dep of leakage current */ - model->BSIM4v7ltnfactor = 0.0; - if (!model->BSIM4v7lteta0Given) /* v4.7 temp dep of leakage current */ - model->BSIM4v7lteta0 = 0.0; - if (!model->BSIM4v7ltvoffcvGiven) /* v4.7 temp dep of leakage current */ - model->BSIM4v7ltvoffcv = 0.0; - - - if (!model->BSIM4v7lcgslGiven) - model->BSIM4v7lcgsl = 0.0; - if (!model->BSIM4v7lcgdlGiven) - model->BSIM4v7lcgdl = 0.0; - if (!model->BSIM4v7lckappasGiven) - model->BSIM4v7lckappas = 0.0; - if (!model->BSIM4v7lckappadGiven) - model->BSIM4v7lckappad = 0.0; - if (!model->BSIM4v7lclcGiven) - model->BSIM4v7lclc = 0.0; - if (!model->BSIM4v7lcleGiven) - model->BSIM4v7lcle = 0.0; - if (!model->BSIM4v7lcfGiven) - model->BSIM4v7lcf = 0.0; - if (!model->BSIM4v7lvfbcvGiven) - model->BSIM4v7lvfbcv = 0.0; - if (!model->BSIM4v7lacdeGiven) - model->BSIM4v7lacde = 0.0; - if (!model->BSIM4v7lmoinGiven) - model->BSIM4v7lmoin = 0.0; - if (!model->BSIM4v7lnoffGiven) - model->BSIM4v7lnoff = 0.0; - if (!model->BSIM4v7lvoffcvGiven) - model->BSIM4v7lvoffcv = 0.0; - - /* Width dependence */ - if (!model->BSIM4v7wcdscGiven) - model->BSIM4v7wcdsc = 0.0; - if (!model->BSIM4v7wcdscbGiven) - model->BSIM4v7wcdscb = 0.0; - if (!model->BSIM4v7wcdscdGiven) - model->BSIM4v7wcdscd = 0.0; - if (!model->BSIM4v7wcitGiven) - model->BSIM4v7wcit = 0.0; - if (!model->BSIM4v7wnfactorGiven) - model->BSIM4v7wnfactor = 0.0; - if (!model->BSIM4v7wxjGiven) - model->BSIM4v7wxj = 0.0; - if (!model->BSIM4v7wvsatGiven) - model->BSIM4v7wvsat = 0.0; - if (!model->BSIM4v7watGiven) - model->BSIM4v7wat = 0.0; - if (!model->BSIM4v7wa0Given) - model->BSIM4v7wa0 = 0.0; - if (!model->BSIM4v7wagsGiven) - model->BSIM4v7wags = 0.0; - if (!model->BSIM4v7wa1Given) - model->BSIM4v7wa1 = 0.0; - if (!model->BSIM4v7wa2Given) - model->BSIM4v7wa2 = 0.0; - if (!model->BSIM4v7wketaGiven) - model->BSIM4v7wketa = 0.0; - if (!model->BSIM4v7wnsubGiven) - model->BSIM4v7wnsub = 0.0; - if (!model->BSIM4v7wndepGiven) - model->BSIM4v7wndep = 0.0; - if (!model->BSIM4v7wnsdGiven) - model->BSIM4v7wnsd = 0.0; - if (!model->BSIM4v7wphinGiven) - model->BSIM4v7wphin = 0.0; - if (!model->BSIM4v7wngateGiven) - model->BSIM4v7wngate = 0.0; - if (!model->BSIM4v7wvbmGiven) - model->BSIM4v7wvbm = 0.0; - if (!model->BSIM4v7wxtGiven) - model->BSIM4v7wxt = 0.0; - if (!model->BSIM4v7wkt1Given) - model->BSIM4v7wkt1 = 0.0; - if (!model->BSIM4v7wkt1lGiven) - model->BSIM4v7wkt1l = 0.0; - if (!model->BSIM4v7wkt2Given) - model->BSIM4v7wkt2 = 0.0; - if (!model->BSIM4v7wk3Given) - model->BSIM4v7wk3 = 0.0; - if (!model->BSIM4v7wk3bGiven) - model->BSIM4v7wk3b = 0.0; - if (!model->BSIM4v7ww0Given) - model->BSIM4v7ww0 = 0.0; - if (!model->BSIM4v7wlpe0Given) - model->BSIM4v7wlpe0 = 0.0; - if (!model->BSIM4v7wlpebGiven) - model->BSIM4v7wlpeb = 0.0; - if (!model->BSIM4v7wdvtp0Given) - model->BSIM4v7wdvtp0 = 0.0; - if (!model->BSIM4v7wdvtp1Given) - model->BSIM4v7wdvtp1 = 0.0; - if (!model->BSIM4v7wdvtp2Given) /* New DIBL/Rout */ - model->BSIM4v7wdvtp2 = 0.0; - if (!model->BSIM4v7wdvtp3Given) - model->BSIM4v7wdvtp3 = 0.0; - if (!model->BSIM4v7wdvtp4Given) - model->BSIM4v7wdvtp4 = 0.0; - if (!model->BSIM4v7wdvtp5Given) - model->BSIM4v7wdvtp5 = 0.0; - if (!model->BSIM4v7wdvt0Given) - model->BSIM4v7wdvt0 = 0.0; - if (!model->BSIM4v7wdvt1Given) - model->BSIM4v7wdvt1 = 0.0; - if (!model->BSIM4v7wdvt2Given) - model->BSIM4v7wdvt2 = 0.0; - if (!model->BSIM4v7wdvt0wGiven) - model->BSIM4v7wdvt0w = 0.0; - if (!model->BSIM4v7wdvt1wGiven) - model->BSIM4v7wdvt1w = 0.0; - if (!model->BSIM4v7wdvt2wGiven) - model->BSIM4v7wdvt2w = 0.0; - if (!model->BSIM4v7wdroutGiven) - model->BSIM4v7wdrout = 0.0; - if (!model->BSIM4v7wdsubGiven) - model->BSIM4v7wdsub = 0.0; - if (!model->BSIM4v7wvth0Given) - model->BSIM4v7wvth0 = 0.0; - if (!model->BSIM4v7wuaGiven) - model->BSIM4v7wua = 0.0; - if (!model->BSIM4v7wua1Given) - model->BSIM4v7wua1 = 0.0; - if (!model->BSIM4v7wubGiven) - model->BSIM4v7wub = 0.0; - if (!model->BSIM4v7wub1Given) - model->BSIM4v7wub1 = 0.0; - if (!model->BSIM4v7wucGiven) - model->BSIM4v7wuc = 0.0; - if (!model->BSIM4v7wuc1Given) - model->BSIM4v7wuc1 = 0.0; - if (!model->BSIM4v7wudGiven) - model->BSIM4v7wud = 0.0; - if (!model->BSIM4v7wud1Given) - model->BSIM4v7wud1 = 0.0; - if (!model->BSIM4v7wupGiven) - model->BSIM4v7wup = 0.0; - if (!model->BSIM4v7wlpGiven) - model->BSIM4v7wlp = 0.0; - if (!model->BSIM4v7wu0Given) - model->BSIM4v7wu0 = 0.0; - if (!model->BSIM4v7wuteGiven) - model->BSIM4v7wute = 0.0; - if (!model->BSIM4v7wucsteGiven) - model->BSIM4v7wucste = 0.0; - if (!model->BSIM4v7wvoffGiven) - model->BSIM4v7wvoff = 0.0; - if (!model->BSIM4v7wminvGiven) - model->BSIM4v7wminv = 0.0; - if (!model->BSIM4v7wminvcvGiven) - model->BSIM4v7wminvcv = 0.0; - if (!model->BSIM4v7wfproutGiven) - model->BSIM4v7wfprout = 0.0; - if (!model->BSIM4v7wpditsGiven) - model->BSIM4v7wpdits = 0.0; - if (!model->BSIM4v7wpditsdGiven) - model->BSIM4v7wpditsd = 0.0; - if (!model->BSIM4v7wdeltaGiven) - model->BSIM4v7wdelta = 0.0; - if (!model->BSIM4v7wrdswGiven) - model->BSIM4v7wrdsw = 0.0; - if (!model->BSIM4v7wrdwGiven) - model->BSIM4v7wrdw = 0.0; - if (!model->BSIM4v7wrswGiven) - model->BSIM4v7wrsw = 0.0; - if (!model->BSIM4v7wprwbGiven) - model->BSIM4v7wprwb = 0.0; - if (!model->BSIM4v7wprwgGiven) - model->BSIM4v7wprwg = 0.0; - if (!model->BSIM4v7wprtGiven) - model->BSIM4v7wprt = 0.0; - if (!model->BSIM4v7weta0Given) - model->BSIM4v7weta0 = 0.0; - if (!model->BSIM4v7wetabGiven) - model->BSIM4v7wetab = 0.0; - if (!model->BSIM4v7wpclmGiven) - model->BSIM4v7wpclm = 0.0; - if (!model->BSIM4v7wpdibl1Given) - model->BSIM4v7wpdibl1 = 0.0; - if (!model->BSIM4v7wpdibl2Given) - model->BSIM4v7wpdibl2 = 0.0; - if (!model->BSIM4v7wpdiblbGiven) - model->BSIM4v7wpdiblb = 0.0; - if (!model->BSIM4v7wpscbe1Given) - model->BSIM4v7wpscbe1 = 0.0; - if (!model->BSIM4v7wpscbe2Given) - model->BSIM4v7wpscbe2 = 0.0; - if (!model->BSIM4v7wpvagGiven) - model->BSIM4v7wpvag = 0.0; - if (!model->BSIM4v7wwrGiven) - model->BSIM4v7wwr = 0.0; - if (!model->BSIM4v7wdwgGiven) - model->BSIM4v7wdwg = 0.0; - if (!model->BSIM4v7wdwbGiven) - model->BSIM4v7wdwb = 0.0; - if (!model->BSIM4v7wb0Given) - model->BSIM4v7wb0 = 0.0; - if (!model->BSIM4v7wb1Given) - model->BSIM4v7wb1 = 0.0; - if (!model->BSIM4v7walpha0Given) - model->BSIM4v7walpha0 = 0.0; - if (!model->BSIM4v7walpha1Given) - model->BSIM4v7walpha1 = 0.0; - if (!model->BSIM4v7wbeta0Given) - model->BSIM4v7wbeta0 = 0.0; - if (!model->BSIM4v7wagidlGiven) - model->BSIM4v7wagidl = 0.0; - if (!model->BSIM4v7wbgidlGiven) - model->BSIM4v7wbgidl = 0.0; - if (!model->BSIM4v7wcgidlGiven) - model->BSIM4v7wcgidl = 0.0; - if (!model->BSIM4v7wegidlGiven) - model->BSIM4v7wegidl = 0.0; - if (!model->BSIM4v7wrgidlGiven) /* v4.7 New GIDL/GISL */ - model->BSIM4v7wrgidl = 0.0; - if (!model->BSIM4v7wkgidlGiven) /* v4.7 New GIDL/GISL */ - model->BSIM4v7wkgidl = 0.0; - if (!model->BSIM4v7wfgidlGiven) /* v4.7 New GIDL/GISL */ - model->BSIM4v7wfgidl = 0.0; - - if (!model->BSIM4v7wagislGiven) - { - if (model->BSIM4v7wagidlGiven) - model->BSIM4v7wagisl = model->BSIM4v7wagidl; - else - model->BSIM4v7wagisl = 0.0; - } - if (!model->BSIM4v7wbgislGiven) - { - if (model->BSIM4v7wbgidlGiven) - model->BSIM4v7wbgisl = model->BSIM4v7wbgidl; - else - model->BSIM4v7wbgisl = 0.0; - } - if (!model->BSIM4v7wcgislGiven) - { - if (model->BSIM4v7wcgidlGiven) - model->BSIM4v7wcgisl = model->BSIM4v7wcgidl; - else - model->BSIM4v7wcgisl = 0.0; - } - if (!model->BSIM4v7wegislGiven) - { - if (model->BSIM4v7wegidlGiven) - model->BSIM4v7wegisl = model->BSIM4v7wegidl; - else - model->BSIM4v7wegisl = 0.0; - } - if (!model->BSIM4v7wrgislGiven) /* v4.7 New GIDL/GISL */ - { - if (model->BSIM4v7wrgidlGiven) - model->BSIM4v7wrgisl = model->BSIM4v7wrgidl; - } - if (!model->BSIM4v7wkgislGiven) /* v4.7 New GIDL/GISL */ - { - if (model->BSIM4v7wkgidlGiven) - model->BSIM4v7wkgisl = model->BSIM4v7wkgidl; - } - if (!model->BSIM4v7wfgislGiven) /* v4.7 New GIDL/GISL */ - { - if (model->BSIM4v7wfgidlGiven) - model->BSIM4v7wfgisl = model->BSIM4v7wfgidl; - } - if (!model->BSIM4v7waigcGiven) - model->BSIM4v7waigc = 0.0; - if (!model->BSIM4v7wbigcGiven) - model->BSIM4v7wbigc = 0.0; - if (!model->BSIM4v7wcigcGiven) - model->BSIM4v7wcigc = 0.0; - if (!model->BSIM4v7aigsdGiven && (model->BSIM4v7aigsGiven || model->BSIM4v7aigdGiven)) - { - if (!model->BSIM4v7waigsGiven) - model->BSIM4v7waigs = 0.0; - if (!model->BSIM4v7waigdGiven) - model->BSIM4v7waigd = 0.0; - } - else - { - if (!model->BSIM4v7waigsdGiven) - model->BSIM4v7waigsd = 0.0; - model->BSIM4v7waigs = model->BSIM4v7waigd = model->BSIM4v7waigsd; - } - if (!model->BSIM4v7bigsdGiven && (model->BSIM4v7bigsGiven || model->BSIM4v7bigdGiven)) - { - if (!model->BSIM4v7wbigsGiven) - model->BSIM4v7wbigs = 0.0; - if (!model->BSIM4v7wbigdGiven) - model->BSIM4v7wbigd = 0.0; - } - else - { - if (!model->BSIM4v7wbigsdGiven) - model->BSIM4v7wbigsd = 0.0; - model->BSIM4v7wbigs = model->BSIM4v7wbigd = model->BSIM4v7wbigsd; - } - if (!model->BSIM4v7cigsdGiven && (model->BSIM4v7cigsGiven || model->BSIM4v7cigdGiven)) - { - if (!model->BSIM4v7wcigsGiven) - model->BSIM4v7wcigs = 0.0; - if (!model->BSIM4v7wcigdGiven) - model->BSIM4v7wcigd = 0.0; - } - else - { - if (!model->BSIM4v7wcigsdGiven) - model->BSIM4v7wcigsd = 0.0; - model->BSIM4v7wcigs = model->BSIM4v7wcigd = model->BSIM4v7wcigsd; - } - if (!model->BSIM4v7waigbaccGiven) - model->BSIM4v7waigbacc = 0.0; - if (!model->BSIM4v7wbigbaccGiven) - model->BSIM4v7wbigbacc = 0.0; - if (!model->BSIM4v7wcigbaccGiven) - model->BSIM4v7wcigbacc = 0.0; - if (!model->BSIM4v7waigbinvGiven) - model->BSIM4v7waigbinv = 0.0; - if (!model->BSIM4v7wbigbinvGiven) - model->BSIM4v7wbigbinv = 0.0; - if (!model->BSIM4v7wcigbinvGiven) - model->BSIM4v7wcigbinv = 0.0; - if (!model->BSIM4v7wnigcGiven) - model->BSIM4v7wnigc = 0.0; - if (!model->BSIM4v7wnigbinvGiven) - model->BSIM4v7wnigbinv = 0.0; - if (!model->BSIM4v7wnigbaccGiven) - model->BSIM4v7wnigbacc = 0.0; - if (!model->BSIM4v7wntoxGiven) - model->BSIM4v7wntox = 0.0; - if (!model->BSIM4v7weigbinvGiven) - model->BSIM4v7weigbinv = 0.0; - if (!model->BSIM4v7wpigcdGiven) - model->BSIM4v7wpigcd = 0.0; - if (!model->BSIM4v7wpoxedgeGiven) - model->BSIM4v7wpoxedge = 0.0; - if (!model->BSIM4v7wxrcrg1Given) - model->BSIM4v7wxrcrg1 = 0.0; - if (!model->BSIM4v7wxrcrg2Given) - model->BSIM4v7wxrcrg2 = 0.0; - if (!model->BSIM4v7weuGiven) - model->BSIM4v7weu = 0.0; - if (!model->BSIM4v7wucsGiven) - model->BSIM4v7wucs = 0.0; - if (!model->BSIM4v7wvfbGiven) - model->BSIM4v7wvfb = 0.0; - if (!model->BSIM4v7wlambdaGiven) - model->BSIM4v7wlambda = 0.0; - if (!model->BSIM4v7wvtlGiven) - model->BSIM4v7wvtl = 0.0; - if (!model->BSIM4v7wxnGiven) - model->BSIM4v7wxn = 0.0; - if (!model->BSIM4v7wvfbsdoffGiven) - model->BSIM4v7wvfbsdoff = 0.0; - if (!model->BSIM4v7wtvfbsdoffGiven) - model->BSIM4v7wtvfbsdoff = 0.0; - if (!model->BSIM4v7wtvoffGiven) - model->BSIM4v7wtvoff = 0.0; - if (!model->BSIM4v7wtnfactorGiven) /* v4.7 temp dep of leakage current */ - model->BSIM4v7wtnfactor = 0.0; - if (!model->BSIM4v7wteta0Given) /* v4.7 temp dep of leakage current */ - model->BSIM4v7wteta0 = 0.0; - if (!model->BSIM4v7wtvoffcvGiven) /* v4.7 temp dep of leakage current */ - model->BSIM4v7wtvoffcv = 0.0; - - if (!model->BSIM4v7wcgslGiven) - model->BSIM4v7wcgsl = 0.0; - if (!model->BSIM4v7wcgdlGiven) - model->BSIM4v7wcgdl = 0.0; - if (!model->BSIM4v7wckappasGiven) - model->BSIM4v7wckappas = 0.0; - if (!model->BSIM4v7wckappadGiven) - model->BSIM4v7wckappad = 0.0; - if (!model->BSIM4v7wcfGiven) - model->BSIM4v7wcf = 0.0; - if (!model->BSIM4v7wclcGiven) - model->BSIM4v7wclc = 0.0; - if (!model->BSIM4v7wcleGiven) - model->BSIM4v7wcle = 0.0; - if (!model->BSIM4v7wvfbcvGiven) - model->BSIM4v7wvfbcv = 0.0; - if (!model->BSIM4v7wacdeGiven) - model->BSIM4v7wacde = 0.0; - if (!model->BSIM4v7wmoinGiven) - model->BSIM4v7wmoin = 0.0; - if (!model->BSIM4v7wnoffGiven) - model->BSIM4v7wnoff = 0.0; - if (!model->BSIM4v7wvoffcvGiven) - model->BSIM4v7wvoffcv = 0.0; - - /* Cross-term dependence */ - if (!model->BSIM4v7pcdscGiven) - model->BSIM4v7pcdsc = 0.0; - if (!model->BSIM4v7pcdscbGiven) - model->BSIM4v7pcdscb = 0.0; - if (!model->BSIM4v7pcdscdGiven) - model->BSIM4v7pcdscd = 0.0; - if (!model->BSIM4v7pcitGiven) - model->BSIM4v7pcit = 0.0; - if (!model->BSIM4v7pnfactorGiven) - model->BSIM4v7pnfactor = 0.0; - if (!model->BSIM4v7pxjGiven) - model->BSIM4v7pxj = 0.0; - if (!model->BSIM4v7pvsatGiven) - model->BSIM4v7pvsat = 0.0; - if (!model->BSIM4v7patGiven) - model->BSIM4v7pat = 0.0; - if (!model->BSIM4v7pa0Given) - model->BSIM4v7pa0 = 0.0; - - if (!model->BSIM4v7pagsGiven) - model->BSIM4v7pags = 0.0; - if (!model->BSIM4v7pa1Given) - model->BSIM4v7pa1 = 0.0; - if (!model->BSIM4v7pa2Given) - model->BSIM4v7pa2 = 0.0; - if (!model->BSIM4v7pketaGiven) - model->BSIM4v7pketa = 0.0; - if (!model->BSIM4v7pnsubGiven) - model->BSIM4v7pnsub = 0.0; - if (!model->BSIM4v7pndepGiven) - model->BSIM4v7pndep = 0.0; - if (!model->BSIM4v7pnsdGiven) - model->BSIM4v7pnsd = 0.0; - if (!model->BSIM4v7pphinGiven) - model->BSIM4v7pphin = 0.0; - if (!model->BSIM4v7pngateGiven) - model->BSIM4v7pngate = 0.0; - if (!model->BSIM4v7pvbmGiven) - model->BSIM4v7pvbm = 0.0; - if (!model->BSIM4v7pxtGiven) - model->BSIM4v7pxt = 0.0; - if (!model->BSIM4v7pkt1Given) - model->BSIM4v7pkt1 = 0.0; - if (!model->BSIM4v7pkt1lGiven) - model->BSIM4v7pkt1l = 0.0; - if (!model->BSIM4v7pkt2Given) - model->BSIM4v7pkt2 = 0.0; - if (!model->BSIM4v7pk3Given) - model->BSIM4v7pk3 = 0.0; - if (!model->BSIM4v7pk3bGiven) - model->BSIM4v7pk3b = 0.0; - if (!model->BSIM4v7pw0Given) - model->BSIM4v7pw0 = 0.0; - if (!model->BSIM4v7plpe0Given) - model->BSIM4v7plpe0 = 0.0; - if (!model->BSIM4v7plpebGiven) - model->BSIM4v7plpeb = 0.0; - if (!model->BSIM4v7pdvtp0Given) - model->BSIM4v7pdvtp0 = 0.0; - if (!model->BSIM4v7pdvtp1Given) - model->BSIM4v7pdvtp1 = 0.0; - if (!model->BSIM4v7pdvtp2Given) /* New DIBL/Rout */ - model->BSIM4v7pdvtp2 = 0.0; - if (!model->BSIM4v7pdvtp3Given) - model->BSIM4v7pdvtp3 = 0.0; - if (!model->BSIM4v7pdvtp4Given) - model->BSIM4v7pdvtp4 = 0.0; - if (!model->BSIM4v7pdvtp5Given) - model->BSIM4v7pdvtp5 = 0.0; - if (!model->BSIM4v7pdvt0Given) - model->BSIM4v7pdvt0 = 0.0; - if (!model->BSIM4v7pdvt1Given) - model->BSIM4v7pdvt1 = 0.0; - if (!model->BSIM4v7pdvt2Given) - model->BSIM4v7pdvt2 = 0.0; - if (!model->BSIM4v7pdvt0wGiven) - model->BSIM4v7pdvt0w = 0.0; - if (!model->BSIM4v7pdvt1wGiven) - model->BSIM4v7pdvt1w = 0.0; - if (!model->BSIM4v7pdvt2wGiven) - model->BSIM4v7pdvt2w = 0.0; - if (!model->BSIM4v7pdroutGiven) - model->BSIM4v7pdrout = 0.0; - if (!model->BSIM4v7pdsubGiven) - model->BSIM4v7pdsub = 0.0; - if (!model->BSIM4v7pvth0Given) - model->BSIM4v7pvth0 = 0.0; - if (!model->BSIM4v7puaGiven) - model->BSIM4v7pua = 0.0; - if (!model->BSIM4v7pua1Given) - model->BSIM4v7pua1 = 0.0; - if (!model->BSIM4v7pubGiven) - model->BSIM4v7pub = 0.0; - if (!model->BSIM4v7pub1Given) - model->BSIM4v7pub1 = 0.0; - if (!model->BSIM4v7pucGiven) - model->BSIM4v7puc = 0.0; - if (!model->BSIM4v7puc1Given) - model->BSIM4v7puc1 = 0.0; - if (!model->BSIM4v7pudGiven) - model->BSIM4v7pud = 0.0; - if (!model->BSIM4v7pud1Given) - model->BSIM4v7pud1 = 0.0; - if (!model->BSIM4v7pupGiven) - model->BSIM4v7pup = 0.0; - if (!model->BSIM4v7plpGiven) - model->BSIM4v7plp = 0.0; - if (!model->BSIM4v7pu0Given) - model->BSIM4v7pu0 = 0.0; - if (!model->BSIM4v7puteGiven) - model->BSIM4v7pute = 0.0; - if (!model->BSIM4v7pucsteGiven) - model->BSIM4v7pucste = 0.0; - if (!model->BSIM4v7pvoffGiven) - model->BSIM4v7pvoff = 0.0; - if (!model->BSIM4v7pminvGiven) - model->BSIM4v7pminv = 0.0; - if (!model->BSIM4v7pminvcvGiven) - model->BSIM4v7pminvcv = 0.0; - if (!model->BSIM4v7pfproutGiven) - model->BSIM4v7pfprout = 0.0; - if (!model->BSIM4v7ppditsGiven) - model->BSIM4v7ppdits = 0.0; - if (!model->BSIM4v7ppditsdGiven) - model->BSIM4v7ppditsd = 0.0; - if (!model->BSIM4v7pdeltaGiven) - model->BSIM4v7pdelta = 0.0; - if (!model->BSIM4v7prdswGiven) - model->BSIM4v7prdsw = 0.0; - if (!model->BSIM4v7prdwGiven) - model->BSIM4v7prdw = 0.0; - if (!model->BSIM4v7prswGiven) - model->BSIM4v7prsw = 0.0; - if (!model->BSIM4v7pprwbGiven) - model->BSIM4v7pprwb = 0.0; - if (!model->BSIM4v7pprwgGiven) - model->BSIM4v7pprwg = 0.0; - if (!model->BSIM4v7pprtGiven) - model->BSIM4v7pprt = 0.0; - if (!model->BSIM4v7peta0Given) - model->BSIM4v7peta0 = 0.0; - if (!model->BSIM4v7petabGiven) - model->BSIM4v7petab = 0.0; - if (!model->BSIM4v7ppclmGiven) - model->BSIM4v7ppclm = 0.0; - if (!model->BSIM4v7ppdibl1Given) - model->BSIM4v7ppdibl1 = 0.0; - if (!model->BSIM4v7ppdibl2Given) - model->BSIM4v7ppdibl2 = 0.0; - if (!model->BSIM4v7ppdiblbGiven) - model->BSIM4v7ppdiblb = 0.0; - if (!model->BSIM4v7ppscbe1Given) - model->BSIM4v7ppscbe1 = 0.0; - if (!model->BSIM4v7ppscbe2Given) - model->BSIM4v7ppscbe2 = 0.0; - if (!model->BSIM4v7ppvagGiven) - model->BSIM4v7ppvag = 0.0; - if (!model->BSIM4v7pwrGiven) - model->BSIM4v7pwr = 0.0; - if (!model->BSIM4v7pdwgGiven) - model->BSIM4v7pdwg = 0.0; - if (!model->BSIM4v7pdwbGiven) - model->BSIM4v7pdwb = 0.0; - if (!model->BSIM4v7pb0Given) - model->BSIM4v7pb0 = 0.0; - if (!model->BSIM4v7pb1Given) - model->BSIM4v7pb1 = 0.0; - if (!model->BSIM4v7palpha0Given) - model->BSIM4v7palpha0 = 0.0; - if (!model->BSIM4v7palpha1Given) - model->BSIM4v7palpha1 = 0.0; - if (!model->BSIM4v7pbeta0Given) - model->BSIM4v7pbeta0 = 0.0; - if (!model->BSIM4v7pagidlGiven) - model->BSIM4v7pagidl = 0.0; - if (!model->BSIM4v7pbgidlGiven) - model->BSIM4v7pbgidl = 0.0; - if (!model->BSIM4v7pcgidlGiven) - model->BSIM4v7pcgidl = 0.0; - if (!model->BSIM4v7pegidlGiven) - model->BSIM4v7pegidl = 0.0; - if (!model->BSIM4v7prgidlGiven) /* v4.7 New GIDL/GISL */ - model->BSIM4v7prgidl = 0.0; - if (!model->BSIM4v7pkgidlGiven) /* v4.7 New GIDL/GISL */ - model->BSIM4v7pkgidl = 0.0; - if (!model->BSIM4v7pfgidlGiven) /* v4.7 New GIDL/GISL */ - model->BSIM4v7pfgidl = 0.0; - - if (!model->BSIM4v7pagislGiven) - { - if (model->BSIM4v7pagidlGiven) - model->BSIM4v7pagisl = model->BSIM4v7pagidl; - else - model->BSIM4v7pagisl = 0.0; - } - if (!model->BSIM4v7pbgislGiven) - { - if (model->BSIM4v7pbgidlGiven) - model->BSIM4v7pbgisl = model->BSIM4v7pbgidl; - else - model->BSIM4v7pbgisl = 0.0; - } - if (!model->BSIM4v7pcgislGiven) - { - if (model->BSIM4v7pcgidlGiven) - model->BSIM4v7pcgisl = model->BSIM4v7pcgidl; - else - model->BSIM4v7pcgisl = 0.0; - } - if (!model->BSIM4v7pegislGiven) - { - if (model->BSIM4v7pegidlGiven) - model->BSIM4v7pegisl = model->BSIM4v7pegidl; - else - model->BSIM4v7pegisl = 0.0; - } - if (!model->BSIM4v7prgislGiven) /* v4.7 New GIDL/GISL */ - { - if (model->BSIM4v7prgidlGiven) - model->BSIM4v7prgisl = model->BSIM4v7prgidl; - } - if (!model->BSIM4v7pkgislGiven) /* v4.7 New GIDL/GISL */ - { - if (model->BSIM4v7pkgidlGiven) - model->BSIM4v7pkgisl = model->BSIM4v7pkgidl; - } - if (!model->BSIM4v7pfgislGiven) /* v4.7 New GIDL/GISL */ - { - if (model->BSIM4v7pfgidlGiven) - model->BSIM4v7pfgisl = model->BSIM4v7pfgidl; - } - if (!model->BSIM4v7paigcGiven) - model->BSIM4v7paigc = 0.0; - if (!model->BSIM4v7pbigcGiven) - model->BSIM4v7pbigc = 0.0; - if (!model->BSIM4v7pcigcGiven) - model->BSIM4v7pcigc = 0.0; - if (!model->BSIM4v7aigsdGiven && (model->BSIM4v7aigsGiven || model->BSIM4v7aigdGiven)) - { - if (!model->BSIM4v7paigsGiven) - model->BSIM4v7paigs = 0.0; - if (!model->BSIM4v7paigdGiven) - model->BSIM4v7paigd = 0.0; - } - else - { - if (!model->BSIM4v7paigsdGiven) - model->BSIM4v7paigsd = 0.0; - model->BSIM4v7paigs = model->BSIM4v7paigd = model->BSIM4v7paigsd; - } - if (!model->BSIM4v7bigsdGiven && (model->BSIM4v7bigsGiven || model->BSIM4v7bigdGiven)) - { - if (!model->BSIM4v7pbigsGiven) - model->BSIM4v7pbigs = 0.0; - if (!model->BSIM4v7pbigdGiven) - model->BSIM4v7pbigd = 0.0; - } - else - { - if (!model->BSIM4v7pbigsdGiven) - model->BSIM4v7pbigsd = 0.0; - model->BSIM4v7pbigs = model->BSIM4v7pbigd = model->BSIM4v7pbigsd; - } - if (!model->BSIM4v7cigsdGiven && (model->BSIM4v7cigsGiven || model->BSIM4v7cigdGiven)) - { - if (!model->BSIM4v7pcigsGiven) - model->BSIM4v7pcigs = 0.0; - if (!model->BSIM4v7pcigdGiven) - model->BSIM4v7pcigd = 0.0; - } - else - { - if (!model->BSIM4v7pcigsdGiven) - model->BSIM4v7pcigsd = 0.0; - model->BSIM4v7pcigs = model->BSIM4v7pcigd = model->BSIM4v7pcigsd; - } - if (!model->BSIM4v7paigbaccGiven) - model->BSIM4v7paigbacc = 0.0; - if (!model->BSIM4v7pbigbaccGiven) - model->BSIM4v7pbigbacc = 0.0; - if (!model->BSIM4v7pcigbaccGiven) - model->BSIM4v7pcigbacc = 0.0; - if (!model->BSIM4v7paigbinvGiven) - model->BSIM4v7paigbinv = 0.0; - if (!model->BSIM4v7pbigbinvGiven) - model->BSIM4v7pbigbinv = 0.0; - if (!model->BSIM4v7pcigbinvGiven) - model->BSIM4v7pcigbinv = 0.0; - if (!model->BSIM4v7pnigcGiven) - model->BSIM4v7pnigc = 0.0; - if (!model->BSIM4v7pnigbinvGiven) - model->BSIM4v7pnigbinv = 0.0; - if (!model->BSIM4v7pnigbaccGiven) - model->BSIM4v7pnigbacc = 0.0; - if (!model->BSIM4v7pntoxGiven) - model->BSIM4v7pntox = 0.0; - if (!model->BSIM4v7peigbinvGiven) - model->BSIM4v7peigbinv = 0.0; - if (!model->BSIM4v7ppigcdGiven) - model->BSIM4v7ppigcd = 0.0; - if (!model->BSIM4v7ppoxedgeGiven) - model->BSIM4v7ppoxedge = 0.0; - if (!model->BSIM4v7pxrcrg1Given) - model->BSIM4v7pxrcrg1 = 0.0; - if (!model->BSIM4v7pxrcrg2Given) - model->BSIM4v7pxrcrg2 = 0.0; - if (!model->BSIM4v7peuGiven) - model->BSIM4v7peu = 0.0; - if (!model->BSIM4v7pucsGiven) - model->BSIM4v7pucs = 0.0; - if (!model->BSIM4v7pvfbGiven) - model->BSIM4v7pvfb = 0.0; - if (!model->BSIM4v7plambdaGiven) - model->BSIM4v7plambda = 0.0; - if (!model->BSIM4v7pvtlGiven) - model->BSIM4v7pvtl = 0.0; - if (!model->BSIM4v7pxnGiven) - model->BSIM4v7pxn = 0.0; - if (!model->BSIM4v7pvfbsdoffGiven) - model->BSIM4v7pvfbsdoff = 0.0; - if (!model->BSIM4v7ptvfbsdoffGiven) - model->BSIM4v7ptvfbsdoff = 0.0; - if (!model->BSIM4v7ptvoffGiven) - model->BSIM4v7ptvoff = 0.0; - if (!model->BSIM4v7ptnfactorGiven) /* v4.7 temp dep of leakage current */ - model->BSIM4v7ptnfactor = 0.0; - if (!model->BSIM4v7pteta0Given) /* v4.7 temp dep of leakage current */ - model->BSIM4v7pteta0 = 0.0; - if (!model->BSIM4v7ptvoffcvGiven) /* v4.7 temp dep of leakage current */ - model->BSIM4v7ptvoffcv = 0.0; - - if (!model->BSIM4v7pcgslGiven) - model->BSIM4v7pcgsl = 0.0; - if (!model->BSIM4v7pcgdlGiven) - model->BSIM4v7pcgdl = 0.0; - if (!model->BSIM4v7pckappasGiven) - model->BSIM4v7pckappas = 0.0; - if (!model->BSIM4v7pckappadGiven) - model->BSIM4v7pckappad = 0.0; - if (!model->BSIM4v7pcfGiven) - model->BSIM4v7pcf = 0.0; - if (!model->BSIM4v7pclcGiven) - model->BSIM4v7pclc = 0.0; - if (!model->BSIM4v7pcleGiven) - model->BSIM4v7pcle = 0.0; - if (!model->BSIM4v7pvfbcvGiven) - model->BSIM4v7pvfbcv = 0.0; - if (!model->BSIM4v7pacdeGiven) - model->BSIM4v7pacde = 0.0; - if (!model->BSIM4v7pmoinGiven) - model->BSIM4v7pmoin = 0.0; - if (!model->BSIM4v7pnoffGiven) - model->BSIM4v7pnoff = 0.0; - if (!model->BSIM4v7pvoffcvGiven) - model->BSIM4v7pvoffcv = 0.0; - - if (!model->BSIM4v7gamma1Given) - model->BSIM4v7gamma1 = 0.0; - if (!model->BSIM4v7lgamma1Given) - model->BSIM4v7lgamma1 = 0.0; - if (!model->BSIM4v7wgamma1Given) - model->BSIM4v7wgamma1 = 0.0; - if (!model->BSIM4v7pgamma1Given) - model->BSIM4v7pgamma1 = 0.0; - if (!model->BSIM4v7gamma2Given) - model->BSIM4v7gamma2 = 0.0; - if (!model->BSIM4v7lgamma2Given) - model->BSIM4v7lgamma2 = 0.0; - if (!model->BSIM4v7wgamma2Given) - model->BSIM4v7wgamma2 = 0.0; - if (!model->BSIM4v7pgamma2Given) - model->BSIM4v7pgamma2 = 0.0; - if (!model->BSIM4v7vbxGiven) - model->BSIM4v7vbx = 0.0; - if (!model->BSIM4v7lvbxGiven) - model->BSIM4v7lvbx = 0.0; - if (!model->BSIM4v7wvbxGiven) - model->BSIM4v7wvbx = 0.0; - if (!model->BSIM4v7pvbxGiven) - model->BSIM4v7pvbx = 0.0; - - /* unit degree celcius */ - if (!model->BSIM4v7tnomGiven) - model->BSIM4v7tnom = ckt->CKTnomTemp; - if (!model->BSIM4v7LintGiven) - model->BSIM4v7Lint = 0.0; - if (!model->BSIM4v7LlGiven) - model->BSIM4v7Ll = 0.0; - if (!model->BSIM4v7LlcGiven) - model->BSIM4v7Llc = model->BSIM4v7Ll; - if (!model->BSIM4v7LlnGiven) - model->BSIM4v7Lln = 1.0; - if (!model->BSIM4v7LwGiven) - model->BSIM4v7Lw = 0.0; - if (!model->BSIM4v7LwcGiven) - model->BSIM4v7Lwc = model->BSIM4v7Lw; - if (!model->BSIM4v7LwnGiven) - model->BSIM4v7Lwn = 1.0; - if (!model->BSIM4v7LwlGiven) - model->BSIM4v7Lwl = 0.0; - if (!model->BSIM4v7LwlcGiven) - model->BSIM4v7Lwlc = model->BSIM4v7Lwl; - if (!model->BSIM4v7LminGiven) - model->BSIM4v7Lmin = 0.0; - if (!model->BSIM4v7LmaxGiven) - model->BSIM4v7Lmax = 1.0; - if (!model->BSIM4v7WintGiven) - model->BSIM4v7Wint = 0.0; - if (!model->BSIM4v7WlGiven) - model->BSIM4v7Wl = 0.0; - if (!model->BSIM4v7WlcGiven) - model->BSIM4v7Wlc = model->BSIM4v7Wl; - if (!model->BSIM4v7WlnGiven) - model->BSIM4v7Wln = 1.0; - if (!model->BSIM4v7WwGiven) - model->BSIM4v7Ww = 0.0; - if (!model->BSIM4v7WwcGiven) - model->BSIM4v7Wwc = model->BSIM4v7Ww; - if (!model->BSIM4v7WwnGiven) - model->BSIM4v7Wwn = 1.0; - if (!model->BSIM4v7WwlGiven) - model->BSIM4v7Wwl = 0.0; - if (!model->BSIM4v7WwlcGiven) - model->BSIM4v7Wwlc = model->BSIM4v7Wwl; - if (!model->BSIM4v7WminGiven) - model->BSIM4v7Wmin = 0.0; - if (!model->BSIM4v7WmaxGiven) - model->BSIM4v7Wmax = 1.0; - if (!model->BSIM4v7dwcGiven) - model->BSIM4v7dwc = model->BSIM4v7Wint; - if (!model->BSIM4v7dlcGiven) - model->BSIM4v7dlc = model->BSIM4v7Lint; - if (!model->BSIM4v7xlGiven) - model->BSIM4v7xl = 0.0; - if (!model->BSIM4v7xwGiven) - model->BSIM4v7xw = 0.0; - if (!model->BSIM4v7dlcigGiven) - model->BSIM4v7dlcig = model->BSIM4v7Lint; - if (!model->BSIM4v7dlcigdGiven) - { - if (model->BSIM4v7dlcigGiven) - model->BSIM4v7dlcigd = model->BSIM4v7dlcig; - else - model->BSIM4v7dlcigd = model->BSIM4v7Lint; - } - if (!model->BSIM4v7dwjGiven) - model->BSIM4v7dwj = model->BSIM4v7dwc; - if (!model->BSIM4v7cfGiven) - model->BSIM4v7cf = 2.0 * model->BSIM4v7epsrox * EPS0 / PI - * log(1.0 + 0.4e-6 / model->BSIM4v7toxe); - - if (!model->BSIM4v7xpartGiven) - model->BSIM4v7xpart = 0.0; - if (!model->BSIM4v7sheetResistanceGiven) - model->BSIM4v7sheetResistance = 0.0; - - if (!model->BSIM4v7SunitAreaJctCapGiven) - model->BSIM4v7SunitAreaJctCap = 5.0E-4; - if (!model->BSIM4v7DunitAreaJctCapGiven) - model->BSIM4v7DunitAreaJctCap = model->BSIM4v7SunitAreaJctCap; - if (!model->BSIM4v7SunitLengthSidewallJctCapGiven) - model->BSIM4v7SunitLengthSidewallJctCap = 5.0E-10; - if (!model->BSIM4v7DunitLengthSidewallJctCapGiven) - model->BSIM4v7DunitLengthSidewallJctCap = model->BSIM4v7SunitLengthSidewallJctCap; - if (!model->BSIM4v7SunitLengthGateSidewallJctCapGiven) - model->BSIM4v7SunitLengthGateSidewallJctCap = model->BSIM4v7SunitLengthSidewallJctCap ; - if (!model->BSIM4v7DunitLengthGateSidewallJctCapGiven) - model->BSIM4v7DunitLengthGateSidewallJctCap = model->BSIM4v7SunitLengthGateSidewallJctCap; - if (!model->BSIM4v7SjctSatCurDensityGiven) - model->BSIM4v7SjctSatCurDensity = 1.0E-4; - if (!model->BSIM4v7DjctSatCurDensityGiven) - model->BSIM4v7DjctSatCurDensity = model->BSIM4v7SjctSatCurDensity; - if (!model->BSIM4v7SjctSidewallSatCurDensityGiven) - model->BSIM4v7SjctSidewallSatCurDensity = 0.0; - if (!model->BSIM4v7DjctSidewallSatCurDensityGiven) - model->BSIM4v7DjctSidewallSatCurDensity = model->BSIM4v7SjctSidewallSatCurDensity; - if (!model->BSIM4v7SjctGateSidewallSatCurDensityGiven) - model->BSIM4v7SjctGateSidewallSatCurDensity = 0.0; - if (!model->BSIM4v7DjctGateSidewallSatCurDensityGiven) - model->BSIM4v7DjctGateSidewallSatCurDensity = model->BSIM4v7SjctGateSidewallSatCurDensity; - if (!model->BSIM4v7SbulkJctPotentialGiven) - model->BSIM4v7SbulkJctPotential = 1.0; - if (!model->BSIM4v7DbulkJctPotentialGiven) - model->BSIM4v7DbulkJctPotential = model->BSIM4v7SbulkJctPotential; - if (!model->BSIM4v7SsidewallJctPotentialGiven) - model->BSIM4v7SsidewallJctPotential = 1.0; - if (!model->BSIM4v7DsidewallJctPotentialGiven) - model->BSIM4v7DsidewallJctPotential = model->BSIM4v7SsidewallJctPotential; - if (!model->BSIM4v7SGatesidewallJctPotentialGiven) - model->BSIM4v7SGatesidewallJctPotential = model->BSIM4v7SsidewallJctPotential; - if (!model->BSIM4v7DGatesidewallJctPotentialGiven) - model->BSIM4v7DGatesidewallJctPotential = model->BSIM4v7SGatesidewallJctPotential; - if (!model->BSIM4v7SbulkJctBotGradingCoeffGiven) - model->BSIM4v7SbulkJctBotGradingCoeff = 0.5; - if (!model->BSIM4v7DbulkJctBotGradingCoeffGiven) - model->BSIM4v7DbulkJctBotGradingCoeff = model->BSIM4v7SbulkJctBotGradingCoeff; - if (!model->BSIM4v7SbulkJctSideGradingCoeffGiven) - model->BSIM4v7SbulkJctSideGradingCoeff = 0.33; - if (!model->BSIM4v7DbulkJctSideGradingCoeffGiven) - model->BSIM4v7DbulkJctSideGradingCoeff = model->BSIM4v7SbulkJctSideGradingCoeff; - if (!model->BSIM4v7SbulkJctGateSideGradingCoeffGiven) - model->BSIM4v7SbulkJctGateSideGradingCoeff = model->BSIM4v7SbulkJctSideGradingCoeff; - if (!model->BSIM4v7DbulkJctGateSideGradingCoeffGiven) - model->BSIM4v7DbulkJctGateSideGradingCoeff = model->BSIM4v7SbulkJctGateSideGradingCoeff; - if (!model->BSIM4v7SjctEmissionCoeffGiven) - model->BSIM4v7SjctEmissionCoeff = 1.0; - if (!model->BSIM4v7DjctEmissionCoeffGiven) - model->BSIM4v7DjctEmissionCoeff = model->BSIM4v7SjctEmissionCoeff; - if (!model->BSIM4v7SjctTempExponentGiven) - model->BSIM4v7SjctTempExponent = 3.0; - if (!model->BSIM4v7DjctTempExponentGiven) - model->BSIM4v7DjctTempExponent = model->BSIM4v7SjctTempExponent; - - if (!model->BSIM4v7jtssGiven) - model->BSIM4v7jtss = 0.0; - if (!model->BSIM4v7jtsdGiven) - model->BSIM4v7jtsd = model->BSIM4v7jtss; - if (!model->BSIM4v7jtsswsGiven) - model->BSIM4v7jtssws = 0.0; - if (!model->BSIM4v7jtsswdGiven) - model->BSIM4v7jtsswd = model->BSIM4v7jtssws; - if (!model->BSIM4v7jtsswgsGiven) - model->BSIM4v7jtsswgs = 0.0; - if (!model->BSIM4v7jtsswgdGiven) - model->BSIM4v7jtsswgd = model->BSIM4v7jtsswgs; - if (!model->BSIM4v7jtweffGiven) - model->BSIM4v7jtweff = 0.0; - if (!model->BSIM4v7njtsGiven) - model->BSIM4v7njts = 20.0; - if (!model->BSIM4v7njtsswGiven) - model->BSIM4v7njtssw = 20.0; - if (!model->BSIM4v7njtsswgGiven) - model->BSIM4v7njtsswg = 20.0; - if (!model->BSIM4v7njtsdGiven) - { - if (model->BSIM4v7njtsGiven) - model->BSIM4v7njtsd = model->BSIM4v7njts; - else - model->BSIM4v7njtsd = 20.0; - } - if (!model->BSIM4v7njtsswdGiven) - { - if (model->BSIM4v7njtsswGiven) - model->BSIM4v7njtsswd = model->BSIM4v7njtssw; - else - model->BSIM4v7njtsswd = 20.0; - } - if (!model->BSIM4v7njtsswgdGiven) - { - if (model->BSIM4v7njtsswgGiven) - model->BSIM4v7njtsswgd = model->BSIM4v7njtsswg; - else - model->BSIM4v7njtsswgd = 20.0; - } - if (!model->BSIM4v7xtssGiven) - model->BSIM4v7xtss = 0.02; - if (!model->BSIM4v7xtsdGiven) - model->BSIM4v7xtsd = model->BSIM4v7xtss; - if (!model->BSIM4v7xtsswsGiven) - model->BSIM4v7xtssws = 0.02; - if (!model->BSIM4v7xtsswdGiven) - model->BSIM4v7xtsswd = model->BSIM4v7xtssws; - if (!model->BSIM4v7xtsswgsGiven) - model->BSIM4v7xtsswgs = 0.02; - if (!model->BSIM4v7xtsswgdGiven) - model->BSIM4v7xtsswgd = model->BSIM4v7xtsswgs; - if (!model->BSIM4v7tnjtsGiven) - model->BSIM4v7tnjts = 0.0; - if (!model->BSIM4v7tnjtsswGiven) - model->BSIM4v7tnjtssw = 0.0; - if (!model->BSIM4v7tnjtsswgGiven) - model->BSIM4v7tnjtsswg = 0.0; - if (!model->BSIM4v7tnjtsdGiven) - { - if (model->BSIM4v7tnjtsGiven) - model->BSIM4v7tnjtsd = model->BSIM4v7tnjts; - else - model->BSIM4v7tnjtsd = 0.0; - } - if (!model->BSIM4v7tnjtsswdGiven) - { - if (model->BSIM4v7tnjtsswGiven) - model->BSIM4v7tnjtsswd = model->BSIM4v7tnjtssw; - else - model->BSIM4v7tnjtsswd = 0.0; - } - if (!model->BSIM4v7tnjtsswgdGiven) - { - if (model->BSIM4v7tnjtsswgGiven) - model->BSIM4v7tnjtsswgd = model->BSIM4v7tnjtsswg; - else - model->BSIM4v7tnjtsswgd = 0.0; - } - if (!model->BSIM4v7vtssGiven) - model->BSIM4v7vtss = 10.0; - if (!model->BSIM4v7vtsdGiven) - model->BSIM4v7vtsd = model->BSIM4v7vtss; - if (!model->BSIM4v7vtsswsGiven) - model->BSIM4v7vtssws = 10.0; - if (!model->BSIM4v7vtsswdGiven) - model->BSIM4v7vtsswd = model->BSIM4v7vtssws; - if (!model->BSIM4v7vtsswgsGiven) - model->BSIM4v7vtsswgs = 10.0; - if (!model->BSIM4v7vtsswgdGiven) - model->BSIM4v7vtsswgd = model->BSIM4v7vtsswgs; - - if (!model->BSIM4v7oxideTrapDensityAGiven) - { if (model->BSIM4v7type == NMOS) - model->BSIM4v7oxideTrapDensityA = 6.25e41; - else - model->BSIM4v7oxideTrapDensityA= 6.188e40; - } - if (!model->BSIM4v7oxideTrapDensityBGiven) - { if (model->BSIM4v7type == NMOS) - model->BSIM4v7oxideTrapDensityB = 3.125e26; - else - model->BSIM4v7oxideTrapDensityB = 1.5e25; - } - if (!model->BSIM4v7oxideTrapDensityCGiven) - model->BSIM4v7oxideTrapDensityC = 8.75e9; - if (!model->BSIM4v7emGiven) - model->BSIM4v7em = 4.1e7; /* V/m */ - if (!model->BSIM4v7efGiven) - model->BSIM4v7ef = 1.0; - if (!model->BSIM4v7afGiven) - model->BSIM4v7af = 1.0; - if (!model->BSIM4v7kfGiven) - model->BSIM4v7kf = 0.0; - - if (!model->BSIM4v7vgsMaxGiven) - model->BSIM4v7vgsMax = 1e99; - if (!model->BSIM4v7vgdMaxGiven) - model->BSIM4v7vgdMax = 1e99; - if (!model->BSIM4v7vgbMaxGiven) - model->BSIM4v7vgbMax = 1e99; - if (!model->BSIM4v7vdsMaxGiven) - model->BSIM4v7vdsMax = 1e99; - if (!model->BSIM4v7vbsMaxGiven) - model->BSIM4v7vbsMax = 1e99; - if (!model->BSIM4v7vbdMaxGiven) - model->BSIM4v7vbdMax = 1e99; - if (!model->BSIM4v7vgsrMaxGiven) - model->BSIM4v7vgsrMax = 1e99; - if (!model->BSIM4v7vgdrMaxGiven) - model->BSIM4v7vgdrMax = 1e99; - if (!model->BSIM4v7vgbrMaxGiven) - model->BSIM4v7vgbrMax = 1e99; - if (!model->BSIM4v7vbsrMaxGiven) - model->BSIM4v7vbsrMax = 1e99; - if (!model->BSIM4v7vbdrMaxGiven) - model->BSIM4v7vbdrMax = 1e99; - - /* stress effect */ - if (!model->BSIM4v7sarefGiven) - model->BSIM4v7saref = 1e-6; /* m */ - if (!model->BSIM4v7sbrefGiven) - model->BSIM4v7sbref = 1e-6; /* m */ - if (!model->BSIM4v7wlodGiven) - model->BSIM4v7wlod = 0; /* m */ - if (!model->BSIM4v7ku0Given) - model->BSIM4v7ku0 = 0; /* 1/m */ - if (!model->BSIM4v7kvsatGiven) - model->BSIM4v7kvsat = 0; - if (!model->BSIM4v7kvth0Given) /* m */ - model->BSIM4v7kvth0 = 0; - if (!model->BSIM4v7tku0Given) - model->BSIM4v7tku0 = 0; - if (!model->BSIM4v7llodku0Given) - model->BSIM4v7llodku0 = 0; - if (!model->BSIM4v7wlodku0Given) - model->BSIM4v7wlodku0 = 0; - if (!model->BSIM4v7llodvthGiven) - model->BSIM4v7llodvth = 0; - if (!model->BSIM4v7wlodvthGiven) - model->BSIM4v7wlodvth = 0; - if (!model->BSIM4v7lku0Given) - model->BSIM4v7lku0 = 0; - if (!model->BSIM4v7wku0Given) - model->BSIM4v7wku0 = 0; - if (!model->BSIM4v7pku0Given) - model->BSIM4v7pku0 = 0; - if (!model->BSIM4v7lkvth0Given) - model->BSIM4v7lkvth0 = 0; - if (!model->BSIM4v7wkvth0Given) - model->BSIM4v7wkvth0 = 0; - if (!model->BSIM4v7pkvth0Given) - model->BSIM4v7pkvth0 = 0; - if (!model->BSIM4v7stk2Given) - model->BSIM4v7stk2 = 0; - if (!model->BSIM4v7lodk2Given) - model->BSIM4v7lodk2 = 1.0; - if (!model->BSIM4v7steta0Given) - model->BSIM4v7steta0 = 0; - if (!model->BSIM4v7lodeta0Given) - model->BSIM4v7lodeta0 = 1.0; - - /* Well Proximity Effect */ - if (!model->BSIM4v7webGiven) - model->BSIM4v7web = 0.0; - if (!model->BSIM4v7wecGiven) - model->BSIM4v7wec = 0.0; - if (!model->BSIM4v7kvth0weGiven) - model->BSIM4v7kvth0we = 0.0; - if (!model->BSIM4v7k2weGiven) - model->BSIM4v7k2we = 0.0; - if (!model->BSIM4v7ku0weGiven) - model->BSIM4v7ku0we = 0.0; - if (!model->BSIM4v7screfGiven) - model->BSIM4v7scref = 1.0E-6; /* m */ - if (!model->BSIM4v7wpemodGiven) - model->BSIM4v7wpemod = 0; - else if ((model->BSIM4v7wpemod != 0) && (model->BSIM4v7wpemod != 1)) - { model->BSIM4v7wpemod = 0; - printf("Warning: wpemod has been set to its default value: 0.\n"); - } - if (!model->BSIM4v7lkvth0weGiven) - model->BSIM4v7lkvth0we = 0; - if (!model->BSIM4v7lk2weGiven) - model->BSIM4v7lk2we = 0; - if (!model->BSIM4v7lku0weGiven) - model->BSIM4v7lku0we = 0; - if (!model->BSIM4v7wkvth0weGiven) - model->BSIM4v7wkvth0we = 0; - if (!model->BSIM4v7wk2weGiven) - model->BSIM4v7wk2we = 0; - if (!model->BSIM4v7wku0weGiven) - model->BSIM4v7wku0we = 0; - if (!model->BSIM4v7pkvth0weGiven) - model->BSIM4v7pkvth0we = 0; - if (!model->BSIM4v7pk2weGiven) - model->BSIM4v7pk2we = 0; - if (!model->BSIM4v7pku0weGiven) - model->BSIM4v7pku0we = 0; - - DMCGeff = model->BSIM4v7dmcg - model->BSIM4v7dmcgt; - DMCIeff = model->BSIM4v7dmci; - DMDGeff = model->BSIM4v7dmdg - model->BSIM4v7dmcgt; - - /* - * End processing models and begin to loop - * through all the instances of the model - */ - - for (here = BSIM4v7instances(model); here != NULL ; - here=BSIM4v7nextInstance(here)) - { - /* allocate a chunk of the state vector */ - here->BSIM4v7states = *states; - *states += BSIM4v7numStates; - - /* perform the parameter defaulting */ - if (!here->BSIM4v7lGiven) - here->BSIM4v7l = 5.0e-6; - if (!here->BSIM4v7wGiven) - here->BSIM4v7w = 5.0e-6; - if (!here->BSIM4v7mGiven) - here->BSIM4v7m = 1.0; - if (!here->BSIM4v7nfGiven) - here->BSIM4v7nf = 1.0; - if (!here->BSIM4v7minGiven) - here->BSIM4v7min = 0; /* integer */ - if (!here->BSIM4v7icVDSGiven) - here->BSIM4v7icVDS = 0.0; - if (!here->BSIM4v7icVGSGiven) - here->BSIM4v7icVGS = 0.0; - if (!here->BSIM4v7icVBSGiven) - here->BSIM4v7icVBS = 0.0; - if (!here->BSIM4v7drainAreaGiven) - here->BSIM4v7drainArea = 0.0; - if (!here->BSIM4v7drainPerimeterGiven) - here->BSIM4v7drainPerimeter = 0.0; - if (!here->BSIM4v7drainSquaresGiven) - here->BSIM4v7drainSquares = 1.0; - if (!here->BSIM4v7sourceAreaGiven) - here->BSIM4v7sourceArea = 0.0; - if (!here->BSIM4v7sourcePerimeterGiven) - here->BSIM4v7sourcePerimeter = 0.0; - if (!here->BSIM4v7sourceSquaresGiven) - here->BSIM4v7sourceSquares = 1.0; - - if (!here->BSIM4v7rbdbGiven) - here->BSIM4v7rbdb = model->BSIM4v7rbdb; /* in ohm */ - if (!here->BSIM4v7rbsbGiven) - here->BSIM4v7rbsb = model->BSIM4v7rbsb; - if (!here->BSIM4v7rbpbGiven) - here->BSIM4v7rbpb = model->BSIM4v7rbpb; - if (!here->BSIM4v7rbpsGiven) - here->BSIM4v7rbps = model->BSIM4v7rbps; - if (!here->BSIM4v7rbpdGiven) - here->BSIM4v7rbpd = model->BSIM4v7rbpd; - if (!here->BSIM4v7delvtoGiven) - here->BSIM4v7delvto = 0.0; - if (!here->BSIM4v7mulu0Given) - here->BSIM4v7mulu0 = 1.0; - if (!here->BSIM4v7xgwGiven) - here->BSIM4v7xgw = model->BSIM4v7xgw; - if (!here->BSIM4v7ngconGiven) - here->BSIM4v7ngcon = model->BSIM4v7ngcon; - - - /* Process instance model selectors, some - * may override their global counterparts - */ - if (!here->BSIM4v7rbodyModGiven) - here->BSIM4v7rbodyMod = model->BSIM4v7rbodyMod; - else if ((here->BSIM4v7rbodyMod != 0) && (here->BSIM4v7rbodyMod != 1) && (here->BSIM4v7rbodyMod != 2)) - { here->BSIM4v7rbodyMod = model->BSIM4v7rbodyMod; - printf("Warning: rbodyMod has been set to its global value %d.\n", - model->BSIM4v7rbodyMod); - } - - if (!here->BSIM4v7rgateModGiven) - here->BSIM4v7rgateMod = model->BSIM4v7rgateMod; - else if ((here->BSIM4v7rgateMod != 0) && (here->BSIM4v7rgateMod != 1) - && (here->BSIM4v7rgateMod != 2) && (here->BSIM4v7rgateMod != 3)) - { here->BSIM4v7rgateMod = model->BSIM4v7rgateMod; - printf("Warning: rgateMod has been set to its global value %d.\n", - model->BSIM4v7rgateMod); - } - - if (!here->BSIM4v7geoModGiven) - here->BSIM4v7geoMod = model->BSIM4v7geoMod; - - if (!here->BSIM4v7rgeoModGiven) - here->BSIM4v7rgeoMod = model->BSIM4v7rgeoMod; - else if ((here->BSIM4v7rgeoMod != 0) && (here->BSIM4v7rgeoMod != 1)) - { here->BSIM4v7rgeoMod = model->BSIM4v7rgeoMod; - printf("Warning: rgeoMod has been set to its global value %d.\n", - model->BSIM4v7rgeoMod); - } - - if (!here->BSIM4v7trnqsModGiven) - here->BSIM4v7trnqsMod = model->BSIM4v7trnqsMod; - else if ((here->BSIM4v7trnqsMod != 0) && (here->BSIM4v7trnqsMod != 1)) - { here->BSIM4v7trnqsMod = model->BSIM4v7trnqsMod; - printf("Warning: trnqsMod has been set to its global value %d.\n", - model->BSIM4v7trnqsMod); - } - - if (!here->BSIM4v7acnqsModGiven) - here->BSIM4v7acnqsMod = model->BSIM4v7acnqsMod; - else if ((here->BSIM4v7acnqsMod != 0) && (here->BSIM4v7acnqsMod != 1)) - { here->BSIM4v7acnqsMod = model->BSIM4v7acnqsMod; - printf("Warning: acnqsMod has been set to its global value %d.\n", - model->BSIM4v7acnqsMod); - } - - /* stress effect */ - if (!here->BSIM4v7saGiven) - here->BSIM4v7sa = 0.0; - if (!here->BSIM4v7sbGiven) - here->BSIM4v7sb = 0.0; - if (!here->BSIM4v7sdGiven) - here->BSIM4v7sd = 2 * model->BSIM4v7dmcg; - /* Well Proximity Effect */ - if (!here->BSIM4v7scaGiven) - here->BSIM4v7sca = 0.0; - if (!here->BSIM4v7scbGiven) - here->BSIM4v7scb = 0.0; - if (!here->BSIM4v7sccGiven) - here->BSIM4v7scc = 0.0; - if (!here->BSIM4v7scGiven) - here->BSIM4v7sc = 0.0; /* m */ - - /* process drain series resistance */ - createNode = 0; - if ( (model->BSIM4v7rdsMod != 0) - || (model->BSIM4v7tnoiMod == 1 && noiseAnalGiven)) - { - createNode = 1; - } else if (model->BSIM4v7sheetResistance > 0) - { - if (here->BSIM4v7drainSquaresGiven - && here->BSIM4v7drainSquares > 0) - { - createNode = 1; - } else if (!here->BSIM4v7drainSquaresGiven - && (here->BSIM4v7rgeoMod != 0)) - { - BSIM4v7RdseffGeo(here->BSIM4v7nf*here->BSIM4v7m, here->BSIM4v7geoMod, - here->BSIM4v7rgeoMod, here->BSIM4v7min, - here->BSIM4v7w, model->BSIM4v7sheetResistance, - DMCGeff, DMCIeff, DMDGeff, 0, &Rtot); - if(Rtot > 0) - createNode = 1; - } - } - if ( createNode != 0 ) - { if ( here->BSIM4v7dNodePrime == 0 ) - { error = CKTmkVolt(ckt,&tmp,here->BSIM4v7name,"drain"); - if(error) return(error); - here->BSIM4v7dNodePrime = tmp->number; - if (ckt->CKTcopyNodesets) { - CKTnode *tmpNode; - IFuid tmpName; - if (CKTinst2Node(ckt,here,1,&tmpNode,&tmpName)==OK) { - if (tmpNode->nsGiven) { - tmp->nodeset=tmpNode->nodeset; - tmp->nsGiven=tmpNode->nsGiven; - } - } - } - } - } - else - { here->BSIM4v7dNodePrime = here->BSIM4v7dNode; - } - - /* process source series resistance */ - createNode = 0; - if ( (model->BSIM4v7rdsMod != 0) - || (model->BSIM4v7tnoiMod == 1 && noiseAnalGiven)) - { - createNode = 1; - } else if (model->BSIM4v7sheetResistance > 0) - { - if (here->BSIM4v7sourceSquaresGiven - && here->BSIM4v7sourceSquares > 0) - { - createNode = 1; - } else if (!here->BSIM4v7sourceSquaresGiven - && (here->BSIM4v7rgeoMod != 0)) - { - BSIM4v7RdseffGeo(here->BSIM4v7nf*here->BSIM4v7m, here->BSIM4v7geoMod, - here->BSIM4v7rgeoMod, here->BSIM4v7min, - here->BSIM4v7w, model->BSIM4v7sheetResistance, - DMCGeff, DMCIeff, DMDGeff, 1, &Rtot); - if(Rtot > 0) - createNode = 1; - } - } - if ( createNode != 0 ) - { if ( here->BSIM4v7sNodePrime == 0 ) - { error = CKTmkVolt(ckt,&tmp,here->BSIM4v7name,"source"); - if(error) return(error); - here->BSIM4v7sNodePrime = tmp->number; - if (ckt->CKTcopyNodesets) { - CKTnode *tmpNode; - IFuid tmpName; - if (CKTinst2Node(ckt,here,3,&tmpNode,&tmpName)==OK) { - if (tmpNode->nsGiven) { - tmp->nodeset=tmpNode->nodeset; - tmp->nsGiven=tmpNode->nsGiven; - } - } - } - } - } - else - here->BSIM4v7sNodePrime = here->BSIM4v7sNode; - - if ( here->BSIM4v7rgateMod > 0 ) - { if ( here->BSIM4v7gNodePrime == 0 ) - { error = CKTmkVolt(ckt,&tmp,here->BSIM4v7name,"gate"); - if(error) return(error); - here->BSIM4v7gNodePrime = tmp->number; - if (ckt->CKTcopyNodesets) { - CKTnode *tmpNode; - IFuid tmpName; - if (CKTinst2Node(ckt,here,2,&tmpNode,&tmpName)==OK) { - if (tmpNode->nsGiven) { - tmp->nodeset=tmpNode->nodeset; - tmp->nsGiven=tmpNode->nsGiven; - } - } - } - } - } - else - here->BSIM4v7gNodePrime = here->BSIM4v7gNodeExt; - - if ( here->BSIM4v7rgateMod == 3 ) - { if ( here->BSIM4v7gNodeMid == 0 ) - { error = CKTmkVolt(ckt,&tmp,here->BSIM4v7name,"midgate"); - if(error) return(error); - here->BSIM4v7gNodeMid = tmp->number; - } - } - else - here->BSIM4v7gNodeMid = here->BSIM4v7gNodeExt; - - - /* internal body nodes for body resistance model */ - if ((here->BSIM4v7rbodyMod ==1) || (here->BSIM4v7rbodyMod ==2)) - { if (here->BSIM4v7dbNode == 0) - { error = CKTmkVolt(ckt,&tmp,here->BSIM4v7name,"dbody"); - if(error) return(error); - here->BSIM4v7dbNode = tmp->number; - } - if (here->BSIM4v7bNodePrime == 0) - { error = CKTmkVolt(ckt,&tmp,here->BSIM4v7name,"body"); - if(error) return(error); - here->BSIM4v7bNodePrime = tmp->number; - if (ckt->CKTcopyNodesets) { - CKTnode *tmpNode; - IFuid tmpName; - if (CKTinst2Node(ckt,here,4,&tmpNode,&tmpName)==OK) { - if (tmpNode->nsGiven) { - tmp->nodeset=tmpNode->nodeset; - tmp->nsGiven=tmpNode->nsGiven; - } - } - } - } - if (here->BSIM4v7sbNode == 0) - { error = CKTmkVolt(ckt,&tmp,here->BSIM4v7name,"sbody"); - if(error) return(error); - here->BSIM4v7sbNode = tmp->number; - } - } - else - here->BSIM4v7dbNode = here->BSIM4v7bNodePrime = here->BSIM4v7sbNode - = here->BSIM4v7bNode; - - /* NQS node */ - if ( here->BSIM4v7trnqsMod ) - { if ( here->BSIM4v7qNode == 0 ) - { error = CKTmkVolt(ckt,&tmp,here->BSIM4v7name,"charge"); - if(error) return(error); - here->BSIM4v7qNode = tmp->number; - } - } - else - here->BSIM4v7qNode = 0; - - -/* set Sparse Matrix Pointers - * macro to make elements with built-in out-of-memory test */ -#define TSTALLOC(ptr,first,second) \ -do { if((here->ptr = SMPmakeElt(matrix,here->first,here->second))==(double *)NULL){\ - return(E_NOMEM);\ -} } while(0) - - TSTALLOC(BSIM4v7DPbpPtr, BSIM4v7dNodePrime, BSIM4v7bNodePrime); - TSTALLOC(BSIM4v7GPbpPtr, BSIM4v7gNodePrime, BSIM4v7bNodePrime); - TSTALLOC(BSIM4v7SPbpPtr, BSIM4v7sNodePrime, BSIM4v7bNodePrime); - - TSTALLOC(BSIM4v7BPdpPtr, BSIM4v7bNodePrime, BSIM4v7dNodePrime); - TSTALLOC(BSIM4v7BPgpPtr, BSIM4v7bNodePrime, BSIM4v7gNodePrime); - TSTALLOC(BSIM4v7BPspPtr, BSIM4v7bNodePrime, BSIM4v7sNodePrime); - TSTALLOC(BSIM4v7BPbpPtr, BSIM4v7bNodePrime, BSIM4v7bNodePrime); - - TSTALLOC(BSIM4v7DdPtr, BSIM4v7dNode, BSIM4v7dNode); - TSTALLOC(BSIM4v7GPgpPtr, BSIM4v7gNodePrime, BSIM4v7gNodePrime); - TSTALLOC(BSIM4v7SsPtr, BSIM4v7sNode, BSIM4v7sNode); - TSTALLOC(BSIM4v7DPdpPtr, BSIM4v7dNodePrime, BSIM4v7dNodePrime); - TSTALLOC(BSIM4v7SPspPtr, BSIM4v7sNodePrime, BSIM4v7sNodePrime); - TSTALLOC(BSIM4v7DdpPtr, BSIM4v7dNode, BSIM4v7dNodePrime); - TSTALLOC(BSIM4v7GPdpPtr, BSIM4v7gNodePrime, BSIM4v7dNodePrime); - TSTALLOC(BSIM4v7GPspPtr, BSIM4v7gNodePrime, BSIM4v7sNodePrime); - TSTALLOC(BSIM4v7SspPtr, BSIM4v7sNode, BSIM4v7sNodePrime); - TSTALLOC(BSIM4v7DPspPtr, BSIM4v7dNodePrime, BSIM4v7sNodePrime); - TSTALLOC(BSIM4v7DPdPtr, BSIM4v7dNodePrime, BSIM4v7dNode); - TSTALLOC(BSIM4v7DPgpPtr, BSIM4v7dNodePrime, BSIM4v7gNodePrime); - TSTALLOC(BSIM4v7SPgpPtr, BSIM4v7sNodePrime, BSIM4v7gNodePrime); - TSTALLOC(BSIM4v7SPsPtr, BSIM4v7sNodePrime, BSIM4v7sNode); - TSTALLOC(BSIM4v7SPdpPtr, BSIM4v7sNodePrime, BSIM4v7dNodePrime); - - TSTALLOC(BSIM4v7QqPtr, BSIM4v7qNode, BSIM4v7qNode); - TSTALLOC(BSIM4v7QbpPtr, BSIM4v7qNode, BSIM4v7bNodePrime) ; - TSTALLOC(BSIM4v7QdpPtr, BSIM4v7qNode, BSIM4v7dNodePrime); - TSTALLOC(BSIM4v7QspPtr, BSIM4v7qNode, BSIM4v7sNodePrime); - TSTALLOC(BSIM4v7QgpPtr, BSIM4v7qNode, BSIM4v7gNodePrime); - TSTALLOC(BSIM4v7DPqPtr, BSIM4v7dNodePrime, BSIM4v7qNode); - TSTALLOC(BSIM4v7SPqPtr, BSIM4v7sNodePrime, BSIM4v7qNode); - TSTALLOC(BSIM4v7GPqPtr, BSIM4v7gNodePrime, BSIM4v7qNode); - - if (here->BSIM4v7rgateMod != 0) - { TSTALLOC(BSIM4v7GEgePtr, BSIM4v7gNodeExt, BSIM4v7gNodeExt); - TSTALLOC(BSIM4v7GEgpPtr, BSIM4v7gNodeExt, BSIM4v7gNodePrime); - TSTALLOC(BSIM4v7GPgePtr, BSIM4v7gNodePrime, BSIM4v7gNodeExt); - TSTALLOC(BSIM4v7GEdpPtr, BSIM4v7gNodeExt, BSIM4v7dNodePrime); - TSTALLOC(BSIM4v7GEspPtr, BSIM4v7gNodeExt, BSIM4v7sNodePrime); - TSTALLOC(BSIM4v7GEbpPtr, BSIM4v7gNodeExt, BSIM4v7bNodePrime); - - TSTALLOC(BSIM4v7GMdpPtr, BSIM4v7gNodeMid, BSIM4v7dNodePrime); - TSTALLOC(BSIM4v7GMgpPtr, BSIM4v7gNodeMid, BSIM4v7gNodePrime); - TSTALLOC(BSIM4v7GMgmPtr, BSIM4v7gNodeMid, BSIM4v7gNodeMid); - TSTALLOC(BSIM4v7GMgePtr, BSIM4v7gNodeMid, BSIM4v7gNodeExt); - TSTALLOC(BSIM4v7GMspPtr, BSIM4v7gNodeMid, BSIM4v7sNodePrime); - TSTALLOC(BSIM4v7GMbpPtr, BSIM4v7gNodeMid, BSIM4v7bNodePrime); - TSTALLOC(BSIM4v7DPgmPtr, BSIM4v7dNodePrime, BSIM4v7gNodeMid); - TSTALLOC(BSIM4v7GPgmPtr, BSIM4v7gNodePrime, BSIM4v7gNodeMid); - TSTALLOC(BSIM4v7GEgmPtr, BSIM4v7gNodeExt, BSIM4v7gNodeMid); - TSTALLOC(BSIM4v7SPgmPtr, BSIM4v7sNodePrime, BSIM4v7gNodeMid); - TSTALLOC(BSIM4v7BPgmPtr, BSIM4v7bNodePrime, BSIM4v7gNodeMid); - } - - if ((here->BSIM4v7rbodyMod ==1) || (here->BSIM4v7rbodyMod ==2)) - { TSTALLOC(BSIM4v7DPdbPtr, BSIM4v7dNodePrime, BSIM4v7dbNode); - TSTALLOC(BSIM4v7SPsbPtr, BSIM4v7sNodePrime, BSIM4v7sbNode); - - TSTALLOC(BSIM4v7DBdpPtr, BSIM4v7dbNode, BSIM4v7dNodePrime); - TSTALLOC(BSIM4v7DBdbPtr, BSIM4v7dbNode, BSIM4v7dbNode); - TSTALLOC(BSIM4v7DBbpPtr, BSIM4v7dbNode, BSIM4v7bNodePrime); - TSTALLOC(BSIM4v7DBbPtr, BSIM4v7dbNode, BSIM4v7bNode); - - TSTALLOC(BSIM4v7BPdbPtr, BSIM4v7bNodePrime, BSIM4v7dbNode); - TSTALLOC(BSIM4v7BPbPtr, BSIM4v7bNodePrime, BSIM4v7bNode); - TSTALLOC(BSIM4v7BPsbPtr, BSIM4v7bNodePrime, BSIM4v7sbNode); - - TSTALLOC(BSIM4v7SBspPtr, BSIM4v7sbNode, BSIM4v7sNodePrime); - TSTALLOC(BSIM4v7SBbpPtr, BSIM4v7sbNode, BSIM4v7bNodePrime); - TSTALLOC(BSIM4v7SBbPtr, BSIM4v7sbNode, BSIM4v7bNode); - TSTALLOC(BSIM4v7SBsbPtr, BSIM4v7sbNode, BSIM4v7sbNode); - - TSTALLOC(BSIM4v7BdbPtr, BSIM4v7bNode, BSIM4v7dbNode); - TSTALLOC(BSIM4v7BbpPtr, BSIM4v7bNode, BSIM4v7bNodePrime); - TSTALLOC(BSIM4v7BsbPtr, BSIM4v7bNode, BSIM4v7sbNode); - TSTALLOC(BSIM4v7BbPtr, BSIM4v7bNode, BSIM4v7bNode); - } - - if (model->BSIM4v7rdsMod) - { TSTALLOC(BSIM4v7DgpPtr, BSIM4v7dNode, BSIM4v7gNodePrime); - TSTALLOC(BSIM4v7DspPtr, BSIM4v7dNode, BSIM4v7sNodePrime); - TSTALLOC(BSIM4v7DbpPtr, BSIM4v7dNode, BSIM4v7bNodePrime); - TSTALLOC(BSIM4v7SdpPtr, BSIM4v7sNode, BSIM4v7dNodePrime); - TSTALLOC(BSIM4v7SgpPtr, BSIM4v7sNode, BSIM4v7gNodePrime); - TSTALLOC(BSIM4v7SbpPtr, BSIM4v7sNode, BSIM4v7bNodePrime); - } - } - } - -#ifdef USE_OMP - InstCount = 0; - model = (BSIM4v7model*)inModel; - /* loop through all the BSIM4v7 device models - to count the number of instances */ - - for( ; model != NULL; model = BSIM4v7nextModel(model)) - { - /* loop through all the instances of the model */ - for (here = BSIM4v7instances(model); here != NULL ; - here=BSIM4v7nextInstance(here)) - { - InstCount++; - } - model->BSIM4v7InstCount = 0; - model->BSIM4v7InstanceArray = NULL; - } - InstArray = TMALLOC(BSIM4v7instance*, InstCount); - model = (BSIM4v7model*)inModel; - /* store this in the first model only */ - model->BSIM4v7InstCount = InstCount; - model->BSIM4v7InstanceArray = InstArray; - idx = 0; - for( ; model != NULL; model = BSIM4v7nextModel(model)) - { - /* loop through all the instances of the model */ - for (here = BSIM4v7instances(model); here != NULL ; - here=BSIM4v7nextInstance(here)) - { - InstArray[idx] = here; - idx++; - } - } -#endif - - return(OK); -} - -int -BSIM4v7unsetup( -GENmodel *inModel, -CKTcircuit *ckt) -{ -#ifndef HAS_BATCHSIM - BSIM4v7model *model; - BSIM4v7instance *here; - -#ifdef USE_OMP - model = (BSIM4v7model*)inModel; - tfree(model->BSIM4v7InstanceArray); -#endif - - for (model = (BSIM4v7model *)inModel; model != NULL; - model = BSIM4v7nextModel(model)) - { - for (here = BSIM4v7instances(model); here != NULL; - here=BSIM4v7nextInstance(here)) - { - if (here->BSIM4v7qNode > 0) - CKTdltNNum(ckt, here->BSIM4v7qNode); - here->BSIM4v7qNode = 0; - - if (here->BSIM4v7sbNode > 0 && - here->BSIM4v7sbNode != here->BSIM4v7bNode) - CKTdltNNum(ckt, here->BSIM4v7sbNode); - here->BSIM4v7sbNode = 0; - - if (here->BSIM4v7bNodePrime > 0 && - here->BSIM4v7bNodePrime != here->BSIM4v7bNode) - CKTdltNNum(ckt, here->BSIM4v7bNodePrime); - here->BSIM4v7bNodePrime = 0; - - if (here->BSIM4v7dbNode > 0 && - here->BSIM4v7dbNode != here->BSIM4v7bNode) - CKTdltNNum(ckt, here->BSIM4v7dbNode); - here->BSIM4v7dbNode = 0; - - if (here->BSIM4v7gNodeMid > 0 && - here->BSIM4v7gNodeMid != here->BSIM4v7gNodeExt) - CKTdltNNum(ckt, here->BSIM4v7gNodeMid); - here->BSIM4v7gNodeMid = 0; - - if (here->BSIM4v7gNodePrime > 0 && - here->BSIM4v7gNodePrime != here->BSIM4v7gNodeExt) - CKTdltNNum(ckt, here->BSIM4v7gNodePrime); - here->BSIM4v7gNodePrime = 0; - - if (here->BSIM4v7sNodePrime > 0 - && here->BSIM4v7sNodePrime != here->BSIM4v7sNode) - CKTdltNNum(ckt, here->BSIM4v7sNodePrime); - here->BSIM4v7sNodePrime = 0; - - if (here->BSIM4v7dNodePrime > 0 - && here->BSIM4v7dNodePrime != here->BSIM4v7dNode) - CKTdltNNum(ckt, here->BSIM4v7dNodePrime); - here->BSIM4v7dNodePrime = 0; - - } - } -#endif - return OK; -} diff --git a/src/spicelib/devices/bsim4v7/b4v7soachk.c b/src/spicelib/devices/bsim4v7/b4v7soachk.c deleted file mode 100644 index a1e7777dc..000000000 --- a/src/spicelib/devices/bsim4v7/b4v7soachk.c +++ /dev/null @@ -1,341 +0,0 @@ -/********** -Copyright 2013 Dietmar Warning. All rights reserved. -Author: 2013 Dietmar Warning -**********/ - -#include "ngspice/ngspice.h" -#include "ngspice/cktdefs.h" -#include "bsim4v7def.h" -#include "ngspice/trandefs.h" -#include "ngspice/sperror.h" -#include "ngspice/suffix.h" -#include "ngspice/cpdefs.h" - - -int -BSIM4v7soaCheck(CKTcircuit *ckt, GENmodel *inModel) -{ - BSIM4v7model *model = (BSIM4v7model *) inModel; - BSIM4v7instance *here; - double vgs, vgd, vgb, vds, vbs, vbd; /* actual mos voltages */ - int maxwarns; - static int warns_vgs = 0, warns_vgd = 0, warns_vgb = 0, warns_vds = 0, warns_vbs = 0, warns_vbd = 0; - - if (!ckt) { - warns_vgs = 0; - warns_vgd = 0; - warns_vgb = 0; - warns_vds = 0; - warns_vbs = 0; - warns_vbd = 0; - return OK; - } - - maxwarns = ckt->CKTsoaMaxWarns; - - for (; model; model = BSIM4v7nextModel(model)) { - - for (here = BSIM4v7instances(model); here; here = BSIM4v7nextInstance(here)) { - - vgs = ckt->CKTrhsOld [here->BSIM4v7gNodePrime] - - ckt->CKTrhsOld [here->BSIM4v7sNodePrime]; - - vgd = ckt->CKTrhsOld [here->BSIM4v7gNodePrime] - - ckt->CKTrhsOld [here->BSIM4v7dNodePrime]; - - vgb = ckt->CKTrhsOld [here->BSIM4v7gNodePrime] - - ckt->CKTrhsOld [here->BSIM4v7bNodePrime]; - - vds = ckt->CKTrhsOld [here->BSIM4v7dNodePrime] - - ckt->CKTrhsOld [here->BSIM4v7sNodePrime]; - - vbs = ckt->CKTrhsOld [here->BSIM4v7bNodePrime] - - ckt->CKTrhsOld [here->BSIM4v7sNodePrime]; - - vbd = ckt->CKTrhsOld [here->BSIM4v7bNodePrime] - - ckt->CKTrhsOld [here->BSIM4v7dNodePrime]; - - if (!model->BSIM4v7vgsrMaxGiven) { - if (fabs(vgs) > model->BSIM4v7vgsMax) - if (warns_vgs < maxwarns) { - soa_printf(ckt, (GENinstance*) here, - "Vgs=%g has exceeded Vgs_max=%g\n", - vgs, model->BSIM4v7vgsMax); - warns_vgs++; - } - if (!model->BSIM4v7vgbMaxGiven) { - if (fabs(vgb) > model->BSIM4v7vgsMax) - if (warns_vgb < maxwarns) { - soa_printf(ckt, (GENinstance*) here, - "Vgb=%g has exceeded Vgs_max=%g\n", - vgb, model->BSIM4v7vgsMax); - warns_vgb++; - } - } else { - if (fabs(vgb) > model->BSIM4v7vgbMax) - if (warns_vgb < maxwarns) { - soa_printf(ckt, (GENinstance*) here, - "Vgb=%g has exceeded Vgb_max=%g\n", - vgb, model->BSIM4v7vgbMax); - warns_vgb++; - } - } - } else { - if (model->BSIM4v7type > 0) { - if (vgs > model->BSIM4v7vgsMax) - if (warns_vgs < maxwarns) { - soa_printf(ckt, (GENinstance*) here, - "Vgs=%g has exceeded Vgs_max=%g\n", - vgs, model->BSIM4v7vgsMax); - warns_vgs++; - } - if (-1*vgs > model->BSIM4v7vgsrMax) - if (warns_vgs < maxwarns) { - soa_printf(ckt, (GENinstance*) here, - "Vgs=%g has exceeded Vgsr_max=%g\n", - vgs, model->BSIM4v7vgsrMax); - warns_vgs++; - } - } else { - if (vgs > model->BSIM4v7vgsrMax) - if (warns_vgs < maxwarns) { - soa_printf(ckt, (GENinstance*) here, - "Vgs=%g has exceeded Vgsr_max=%g\n", - vgs, model->BSIM4v7vgsrMax); - warns_vgs++; - } - if (-1*vgs > model->BSIM4v7vgsMax) - if (warns_vgs < maxwarns) { - soa_printf(ckt, (GENinstance*) here, - "Vgs=%g has exceeded Vgs_max=%g\n", - vgs, model->BSIM4v7vgsMax); - warns_vgs++; - } - } - } - - if (!model->BSIM4v7vgdrMaxGiven) { - if (fabs(vgd) > model->BSIM4v7vgdMax) - if (warns_vgd < maxwarns) { - soa_printf(ckt, (GENinstance*) here, - "Vgd=%g has exceeded Vgd_max=%g\n", - vgd, model->BSIM4v7vgdMax); - warns_vgd++; - } - } else { - if (model->BSIM4v7type > 0) { - if (vgd > model->BSIM4v7vgdMax) - if (warns_vgd < maxwarns) { - soa_printf(ckt, (GENinstance*) here, - "Vgd=%g has exceeded Vgd_max=%g\n", - vgd, model->BSIM4v7vgdMax); - warns_vgd++; - } - if (-1*vgd > model->BSIM4v7vgdrMax) - if (warns_vgd < maxwarns) { - soa_printf(ckt, (GENinstance*) here, - "Vgd=%g has exceeded Vgdr_max=%g\n", - vgd, model->BSIM4v7vgdrMax); - warns_vgd++; - } - } else { - if (vgd > model->BSIM4v7vgdrMax) - if (warns_vgd < maxwarns) { - soa_printf(ckt, (GENinstance*) here, - "Vgd=%g has exceeded Vgdr_max=%g\n", - vgd, model->BSIM4v7vgdrMax); - warns_vgd++; - } - if (-1*vgd > model->BSIM4v7vgdMax) - if (warns_vgd < maxwarns) { - soa_printf(ckt, (GENinstance*) here, - "Vgd=%g has exceeded Vgd_max=%g\n", - vgd, model->BSIM4v7vgdMax); - warns_vgd++; - } - } - } - - if (fabs(vds) > model->BSIM4v7vdsMax) - if (warns_vds < maxwarns) { - soa_printf(ckt, (GENinstance*) here, - "Vds=%g has exceeded Vds_max=%g\n", - vds, model->BSIM4v7vdsMax); - warns_vds++; - } - - if (!model->BSIM4v7vgbrMaxGiven) { - if (fabs(vgb) > model->BSIM4v7vgbMax) - if (warns_vgb < maxwarns) { - soa_printf(ckt, (GENinstance*) here, - "Vgb=%g has exceeded Vgb_max=%g\n", - vgb, model->BSIM4v7vgbMax); - warns_vgb++; - } - } else { - if (model->BSIM4v7type > 0) { - if (vgb > model->BSIM4v7vgbMax) - if (warns_vgb < maxwarns) { - soa_printf(ckt, (GENinstance*) here, - "Vgb=%g has exceeded Vgb_max=%g\n", - vgb, model->BSIM4v7vgbMax); - warns_vgb++; - } - if (-1*vgb > model->BSIM4v7vgbrMax) - if (warns_vgb < maxwarns) { - soa_printf(ckt, (GENinstance*) here, - "Vgb=%g has exceeded Vgbr_max=%g\n", - vgb, model->BSIM4v7vgbrMax); - warns_vgb++; - } - } else { - if (vgb > model->BSIM4v7vgbrMax) - if (warns_vgb < maxwarns) { - soa_printf(ckt, (GENinstance*) here, - "Vgb=%g has exceeded Vgbr_max=%g\n", - vgb, model->BSIM4v7vgbrMax); - warns_vgb++; - } - if (-1*vgb > model->BSIM4v7vgbMax) - if (warns_vgb < maxwarns) { - soa_printf(ckt, (GENinstance*) here, - "Vgb=%g has exceeded Vgb_max=%g\n", - vgb, model->BSIM4v7vgbMax); - warns_vgb++; - } - } - } - - if (!model->BSIM4v7vbsrMaxGiven) { - if (!model->BSIM4v7vbsMaxGiven) { - if (fabs(vbs) > model->BSIM4v7vbdMax) - if (warns_vbs < maxwarns) { - soa_printf(ckt, (GENinstance*) here, - "Vbs=%g has exceeded Vbd_max=%g\n", - vbs, model->BSIM4v7vbdMax); - warns_vbs++; - } - } else { - if (fabs(vbs) > model->BSIM4v7vbsMax) - if (warns_vbs < maxwarns) { - soa_printf(ckt, (GENinstance*) here, - "Vbs=%g has exceeded Vbs_max=%g\n", - vbs, model->BSIM4v7vbsMax); - warns_vbs++; - } - } - } else { - if (!model->BSIM4v7vbsMaxGiven) { - if (model->BSIM4v7type > 0) { - if (vbs > model->BSIM4v7vbdMax) - if (warns_vbs < maxwarns) { - soa_printf(ckt, (GENinstance*) here, - "Vbs=%g has exceeded Vbd_max=%g\n", - vbs, model->BSIM4v7vbdMax); - warns_vbs++; - } - if (-1*vbs > model->BSIM4v7vbsrMax) - if (warns_vbs < maxwarns) { - soa_printf(ckt, (GENinstance*) here, - "Vbs=%g has exceeded Vbsr_max=%g\n", - vbs, model->BSIM4v7vbsrMax); - warns_vbs++; - } - } else { - if (vbs > model->BSIM4v7vbsrMax) - if (warns_vbs < maxwarns) { - soa_printf(ckt, (GENinstance*) here, - "Vbs=%g has exceeded Vbsr_max=%g\n", - vbs, model->BSIM4v7vbsrMax); - warns_vbs++; - } - if (-1*vbs > model->BSIM4v7vbdMax) - if (warns_vbs < maxwarns) { - soa_printf(ckt, (GENinstance*) here, - "Vbs=%g has exceeded Vbd_max=%g\n", - vbs, model->BSIM4v7vbdMax); - warns_vbs++; - } - } - } else { - if (model->BSIM4v7type > 0) { - if (vbs > model->BSIM4v7vbsMax) - if (warns_vbs < maxwarns) { - soa_printf(ckt, (GENinstance*) here, - "Vbs=%g has exceeded Vbs_max=%g\n", - vbs, model->BSIM4v7vbsMax); - warns_vbs++; - } - if (-1*vbs > model->BSIM4v7vbsrMax) - if (warns_vbs < maxwarns) { - soa_printf(ckt, (GENinstance*) here, - "Vbs=%g has exceeded Vbsr_max=%g\n", - vbs, model->BSIM4v7vbsrMax); - warns_vbs++; - } - } else { - if (vbs > model->BSIM4v7vbsrMax) - if (warns_vbs < maxwarns) { - soa_printf(ckt, (GENinstance*) here, - "Vbs=%g has exceeded Vbsr_max=%g\n", - vbs, model->BSIM4v7vbsrMax); - warns_vbs++; - } - if (-1*vbs > model->BSIM4v7vbsMax) - if (warns_vbs < maxwarns) { - soa_printf(ckt, (GENinstance*) here, - "Vbs=%g has exceeded Vbs_max=%g\n", - vbs, model->BSIM4v7vbsMax); - warns_vbs++; - } - } - } - } - - if (!model->BSIM4v7vbdrMaxGiven) { - if (fabs(vbd) > model->BSIM4v7vbdMax) - if (warns_vbd < maxwarns) { - soa_printf(ckt, (GENinstance*) here, - "Vbd=%g has exceeded Vbd_max=%g\n", - vbd, model->BSIM4v7vbdMax); - warns_vbd++; - } - } else { - if (model->BSIM4v7type > 0) { - if (vbd > model->BSIM4v7vbdMax) - if (warns_vbd < maxwarns) { - soa_printf(ckt, (GENinstance*) here, - "Vbd=%g has exceeded Vbd_max=%g\n", - vbd, model->BSIM4v7vbdMax); - warns_vbd++; - } - if (-1*vbd > model->BSIM4v7vbdrMax) - if (warns_vbd < maxwarns) { - soa_printf(ckt, (GENinstance*) here, - "Vbd=%g has exceeded Vbdr_max=%g\n", - vbd, model->BSIM4v7vbdrMax); - warns_vbd++; - } - } else { - if (vbd > model->BSIM4v7vbdrMax) - if (warns_vbd < maxwarns) { - soa_printf(ckt, (GENinstance*) here, - "Vbd=%g has exceeded Vbdr_max=%g\n", - vbd, model->BSIM4v7vbdrMax); - warns_vbd++; - } - if (-1*vbd > model->BSIM4v7vbdMax) - if (warns_vbd < maxwarns) { - soa_printf(ckt, (GENinstance*) here, - "Vbd=%g has exceeded Vbd_max=%g\n", - vbd, model->BSIM4v7vbdMax); - warns_vbd++; - } - } - } - - } - } - - return OK; -} diff --git a/src/spicelib/devices/bsim4v7/b4v7temp.c b/src/spicelib/devices/bsim4v7/b4v7temp.c deleted file mode 100644 index 5f9de0fdc..000000000 --- a/src/spicelib/devices/bsim4v7/b4v7temp.c +++ /dev/null @@ -1,2323 +0,0 @@ -/**** BSIM4.7.0 Released by Darsen Lu 04/08/2011 ****/ - -/********** - * Copyright 2006 Regents of the University of California. All rights reserved. - * File: b4temp.c of BSIM4.7.0. - * Author: 2000 Weidong Liu - * Authors: 2001- Xuemei Xi, Mohan Dunga, Ali Niknejad, Chenming Hu. - * Authors: 2006- Mohan Dunga, Ali Niknejad, Chenming Hu - * Authors: 2007- Mohan Dunga, Wenwei Yang, Ali Niknejad, Chenming Hu - * Authors: 2008- Wenwei Yang, Ali Niknejad, Chenming Hu - * Project Director: Prof. Chenming Hu. - * Modified by Xuemei Xi, 04/06/2001. - * Modified by Xuemei Xi, 10/05/2001. - * Modified by Xuemei Xi, 11/15/2002. - * Modified by Xuemei Xi, 05/09/2003. - * Modified by Xuemei Xi, 03/04/2004. - * Modified by Xuemei Xi, Mohan Dunga, 07/29/2005. - * Modified by Mohan Dunga, 12/13/2006. - * Modified by Mohan Dunga, Wenwei Yang, 05/18/2007. - * Modified by Wenwei Yang, 07/31/2008. - * Modified by Tanvir Morshed, Darsen Lu 03/27/2011 - **********/ - - -#include "ngspice/ngspice.h" -#include "ngspice/smpdefs.h" -#include "ngspice/cktdefs.h" -#include "bsim4v7def.h" -#include "ngspice/const.h" -#include "ngspice/sperror.h" -#include "ngspice/suffix.h" - -#define Kb 1.3806226e-23 -#define KboQ 8.617087e-5 -#define EPS0 8.85418e-12 -#define EPSSI 1.03594e-10 -#define PI 3.141592654 -#define MAX_EXP 5.834617425e14 -#define MIN_EXP 1.713908431e-15 -#define EXP_THRESHOLD 34.0 -#define Charge_q 1.60219e-19 -#define DELTA 1.0E-9 -#define DEXP(A,B) { \ - if (A > EXP_THRESHOLD) { \ - B = MAX_EXP*(1.0+(A)-EXP_THRESHOLD); \ - } else if (A < -EXP_THRESHOLD) { \ - B = MIN_EXP; \ - } else { \ - B = exp(A); \ - } \ - } - -static int -BSIM4v7DioIjthVjmEval( -double Nvtm, double Ijth, double Isb, double XExpBV, -double *Vjm) -{ -double Tb, Tc, EVjmovNv; - - Tc = XExpBV; - Tb = 1.0 + Ijth / Isb - Tc; - EVjmovNv = 0.5 * (Tb + sqrt(Tb * Tb + 4.0 * Tc)); - *Vjm = Nvtm * log(EVjmovNv); - -return 0; -} - - -int -BSIM4v7temp( -GENmodel *inModel, -CKTcircuit *ckt) -{ -BSIM4v7model *model = (BSIM4v7model*) inModel; -BSIM4v7instance *here; -struct bsim4SizeDependParam *pSizeDependParamKnot, *pLastKnot, *pParam=NULL; -double tmp, tmp1, tmp2, tmp3, Eg, Eg0, ni, epssub; -double T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, Lnew=0.0, Wnew; -double delTemp, Temp, TRatio, Inv_L, Inv_W, Inv_LW, Vtm0, Tnom; -double dumPs, dumPd, dumAs, dumAd, PowWeffWr; -double DMCGeff, DMCIeff, DMDGeff; -double Nvtms, Nvtmd, SourceSatCurrent, DrainSatCurrent; -double T10, T11; -double Inv_saref, Inv_sbref, Inv_sa, Inv_sb, rho, Ldrn, dvth0_lod; -double W_tmp, Inv_ODeff, OD_offset, dk2_lod, deta0_lod; -double lnl, lnw, lnnf, rbpbx, rbpby, rbsbx, rbsby, rbdbx, rbdby,bodymode; -double kvsat, wlod, sceff, Wdrn; -double V0, lt1, ltw, Theta0, Delt_vth, Vth_NarrowW, Lpe_Vb, Vth; -double n,n0, Vgsteff, Vgs_eff, niter, toxpf, toxpi, Tcen, toxe, epsrox, vddeot; -double vtfbphi2eot, phieot, TempRatioeot, Vtm0eot, Vtmeot,vbieot; - -int Size_Not_Found, i; - - /* loop through all the BSIM4v7 device models */ - for (; model != NULL; model = BSIM4v7nextModel(model)) - { Temp = ckt->CKTtemp; - if (model->BSIM4v7SbulkJctPotential < 0.1) - { model->BSIM4v7SbulkJctPotential = 0.1; - fprintf(stderr, "Given pbs is less than 0.1. Pbs is set to 0.1.\n"); - } - if (model->BSIM4v7SsidewallJctPotential < 0.1) - { model->BSIM4v7SsidewallJctPotential = 0.1; - fprintf(stderr, "Given pbsws is less than 0.1. Pbsws is set to 0.1.\n"); - } - if (model->BSIM4v7SGatesidewallJctPotential < 0.1) - { model->BSIM4v7SGatesidewallJctPotential = 0.1; - fprintf(stderr, "Given pbswgs is less than 0.1. Pbswgs is set to 0.1.\n"); - } - - if (model->BSIM4v7DbulkJctPotential < 0.1) - { model->BSIM4v7DbulkJctPotential = 0.1; - fprintf(stderr, "Given pbd is less than 0.1. Pbd is set to 0.1.\n"); - } - if (model->BSIM4v7DsidewallJctPotential < 0.1) - { model->BSIM4v7DsidewallJctPotential = 0.1; - fprintf(stderr, "Given pbswd is less than 0.1. Pbswd is set to 0.1.\n"); - } - if (model->BSIM4v7DGatesidewallJctPotential < 0.1) - { model->BSIM4v7DGatesidewallJctPotential = 0.1; - fprintf(stderr, "Given pbswgd is less than 0.1. Pbswgd is set to 0.1.\n"); - } - - if(model->BSIM4v7mtrlMod == 0) - { - if ((model->BSIM4v7toxeGiven) && (model->BSIM4v7toxpGiven) && (model->BSIM4v7dtoxGiven) - && (model->BSIM4v7toxe != (model->BSIM4v7toxp + model->BSIM4v7dtox))) - printf("Warning: toxe, toxp and dtox all given and toxe != toxp + dtox; dtox ignored.\n"); - else if ((model->BSIM4v7toxeGiven) && (!model->BSIM4v7toxpGiven)) - model->BSIM4v7toxp = model->BSIM4v7toxe - model->BSIM4v7dtox; - else if ((!model->BSIM4v7toxeGiven) && (model->BSIM4v7toxpGiven)){ - model->BSIM4v7toxe = model->BSIM4v7toxp + model->BSIM4v7dtox; - if (!model->BSIM4v7toxmGiven) /* v4.7 */ - model->BSIM4v7toxm = model->BSIM4v7toxe; - } - } - else if(model->BSIM4v7mtrlCompatMod != 0) /* v4.7 */ - { - T0 = model->BSIM4v7epsrox / 3.9; - if ((model->BSIM4v7eotGiven) && (model->BSIM4v7toxpGiven) && (model->BSIM4v7dtoxGiven) - && (ABS(model->BSIM4v7eot * T0 - (model->BSIM4v7toxp + model->BSIM4v7dtox)) > 1.0e-20)) - { - printf("Warning: eot, toxp and dtox all given and eot * EPSROX / 3.9 != toxp + dtox; dtox ignored.\n"); - } - else if ((model->BSIM4v7eotGiven) && (!model->BSIM4v7toxpGiven)) - model->BSIM4v7toxp = T0 * model->BSIM4v7eot - model->BSIM4v7dtox; - else if ((!model->BSIM4v7eotGiven) && (model->BSIM4v7toxpGiven)){ - model->BSIM4v7eot = (model->BSIM4v7toxp + model->BSIM4v7dtox) / T0; - if (!model->BSIM4v7toxmGiven) - model->BSIM4v7toxm = model->BSIM4v7eot; - } - } - - if(model->BSIM4v7mtrlMod) - { - epsrox = 3.9; - toxe = model->BSIM4v7eot; - epssub = EPS0 * model->BSIM4v7epsrsub; - } - else - { - epsrox = model->BSIM4v7epsrox; - toxe = model->BSIM4v7toxe; - epssub = EPSSI; - } - - - model->BSIM4v7coxe = epsrox * EPS0 / toxe; - if(model->BSIM4v7mtrlMod == 0 || model->BSIM4v7mtrlCompatMod != 0) - model->BSIM4v7coxp = model->BSIM4v7epsrox * EPS0 / model->BSIM4v7toxp; - - if (!model->BSIM4v7cgdoGiven) - { if (model->BSIM4v7dlcGiven && (model->BSIM4v7dlc > 0.0)) - model->BSIM4v7cgdo = model->BSIM4v7dlc * model->BSIM4v7coxe - - model->BSIM4v7cgdl ; - else - model->BSIM4v7cgdo = 0.6 * model->BSIM4v7xj * model->BSIM4v7coxe; - } - if (!model->BSIM4v7cgsoGiven) - { if (model->BSIM4v7dlcGiven && (model->BSIM4v7dlc > 0.0)) - model->BSIM4v7cgso = model->BSIM4v7dlc * model->BSIM4v7coxe - - model->BSIM4v7cgsl ; - else - model->BSIM4v7cgso = 0.6 * model->BSIM4v7xj * model->BSIM4v7coxe; - } - if (!model->BSIM4v7cgboGiven) - model->BSIM4v7cgbo = 2.0 * model->BSIM4v7dwc * model->BSIM4v7coxe; - - struct bsim4SizeDependParam *p = model->pSizeDependParamKnot; - while (p) { - struct bsim4SizeDependParam *next_p = p->pNext; - FREE(p); - p = next_p; - } - model->pSizeDependParamKnot = NULL; - pLastKnot = NULL; - - Tnom = model->BSIM4v7tnom; - TRatio = Temp / Tnom; - - model->BSIM4v7vcrit = CONSTvt0 * log(CONSTvt0 / (CONSTroot2 * 1.0e-14)); - model->BSIM4v7factor1 = sqrt(epssub / (epsrox * EPS0)* toxe); - - Vtm0 = model->BSIM4v7vtm0 = KboQ * Tnom; - - if(model->BSIM4v7mtrlMod==0) - { - Eg0 = 1.16 - 7.02e-4 * Tnom * Tnom / (Tnom + 1108.0); - ni = 1.45e10 * (Tnom / 300.15) * sqrt(Tnom / 300.15) - * exp(21.5565981 - Eg0 / (2.0 * Vtm0)); - } - else - { - Eg0 = model->BSIM4v7bg0sub - model->BSIM4v7tbgasub * Tnom * Tnom - / (Tnom + model->BSIM4v7tbgbsub); - T0 = model->BSIM4v7bg0sub - model->BSIM4v7tbgasub * 90090.0225 - / (300.15 + model->BSIM4v7tbgbsub); - ni = model->BSIM4v7ni0sub * (Tnom / 300.15) * sqrt(Tnom / 300.15) - * exp((T0 - Eg0) / (2.0 * Vtm0)); - } - - model->BSIM4v7Eg0 = Eg0; - model->BSIM4v7vtm = KboQ * Temp; - if(model->BSIM4v7mtrlMod == 0) - Eg = 1.16 - 7.02e-4 * Temp * Temp / (Temp + 1108.0); - else - Eg = model->BSIM4v7bg0sub - model->BSIM4v7tbgasub * Temp * Temp - / (Temp + model->BSIM4v7tbgbsub); - if (Temp != Tnom) - { T0 = Eg0 / Vtm0 - Eg / model->BSIM4v7vtm; - T1 = log(Temp / Tnom); - T2 = T0 + model->BSIM4v7SjctTempExponent * T1; - T3 = exp(T2 / model->BSIM4v7SjctEmissionCoeff); - model->BSIM4v7SjctTempSatCurDensity = model->BSIM4v7SjctSatCurDensity - * T3; - model->BSIM4v7SjctSidewallTempSatCurDensity - = model->BSIM4v7SjctSidewallSatCurDensity * T3; - model->BSIM4v7SjctGateSidewallTempSatCurDensity - = model->BSIM4v7SjctGateSidewallSatCurDensity * T3; - - T2 = T0 + model->BSIM4v7DjctTempExponent * T1; - T3 = exp(T2 / model->BSIM4v7DjctEmissionCoeff); - model->BSIM4v7DjctTempSatCurDensity = model->BSIM4v7DjctSatCurDensity - * T3; - model->BSIM4v7DjctSidewallTempSatCurDensity - = model->BSIM4v7DjctSidewallSatCurDensity * T3; - model->BSIM4v7DjctGateSidewallTempSatCurDensity - = model->BSIM4v7DjctGateSidewallSatCurDensity * T3; - } - else - { model->BSIM4v7SjctTempSatCurDensity = model->BSIM4v7SjctSatCurDensity; - model->BSIM4v7SjctSidewallTempSatCurDensity - = model->BSIM4v7SjctSidewallSatCurDensity; - model->BSIM4v7SjctGateSidewallTempSatCurDensity - = model->BSIM4v7SjctGateSidewallSatCurDensity; - model->BSIM4v7DjctTempSatCurDensity = model->BSIM4v7DjctSatCurDensity; - model->BSIM4v7DjctSidewallTempSatCurDensity - = model->BSIM4v7DjctSidewallSatCurDensity; - model->BSIM4v7DjctGateSidewallTempSatCurDensity - = model->BSIM4v7DjctGateSidewallSatCurDensity; - } - - if (model->BSIM4v7SjctTempSatCurDensity < 0.0) - model->BSIM4v7SjctTempSatCurDensity = 0.0; - if (model->BSIM4v7SjctSidewallTempSatCurDensity < 0.0) - model->BSIM4v7SjctSidewallTempSatCurDensity = 0.0; - if (model->BSIM4v7SjctGateSidewallTempSatCurDensity < 0.0) - model->BSIM4v7SjctGateSidewallTempSatCurDensity = 0.0; - if (model->BSIM4v7DjctTempSatCurDensity < 0.0) - model->BSIM4v7DjctTempSatCurDensity = 0.0; - if (model->BSIM4v7DjctSidewallTempSatCurDensity < 0.0) - model->BSIM4v7DjctSidewallTempSatCurDensity = 0.0; - if (model->BSIM4v7DjctGateSidewallTempSatCurDensity < 0.0) - model->BSIM4v7DjctGateSidewallTempSatCurDensity = 0.0; - - /* Temperature dependence of D/B and S/B diode capacitance begins */ - delTemp = ckt->CKTtemp - model->BSIM4v7tnom; - T0 = model->BSIM4v7tcj * delTemp; - if (T0 >= -1.0) - { model->BSIM4v7SunitAreaTempJctCap = model->BSIM4v7SunitAreaJctCap *(1.0 + T0); /*bug_fix -JX */ - model->BSIM4v7DunitAreaTempJctCap = model->BSIM4v7DunitAreaJctCap *(1.0 + T0); - } - else - { if (model->BSIM4v7SunitAreaJctCap > 0.0) - { model->BSIM4v7SunitAreaTempJctCap = 0.0; - fprintf(stderr, "Temperature effect has caused cjs to be negative. Cjs is clamped to zero.\n"); - } - if (model->BSIM4v7DunitAreaJctCap > 0.0) - { model->BSIM4v7DunitAreaTempJctCap = 0.0; - fprintf(stderr, "Temperature effect has caused cjd to be negative. Cjd is clamped to zero.\n"); - } - } - T0 = model->BSIM4v7tcjsw * delTemp; - if (model->BSIM4v7SunitLengthSidewallJctCap < 0.0)/*4.6.2*/ - {model->BSIM4v7SunitLengthSidewallJctCap = 0.0; - fprintf(stderr, "CJSWS is negative. Cjsws is clamped to zero.\n");} - if (model->BSIM4v7DunitLengthSidewallJctCap < 0.0) - {model->BSIM4v7DunitLengthSidewallJctCap = 0.0; - fprintf(stderr, "CJSWD is negative. Cjswd is clamped to zero.\n");} - if (T0 >= -1.0) - { model->BSIM4v7SunitLengthSidewallTempJctCap = model->BSIM4v7SunitLengthSidewallJctCap *(1.0 + T0); - model->BSIM4v7DunitLengthSidewallTempJctCap = model->BSIM4v7DunitLengthSidewallJctCap *(1.0 + T0); - } - else - { if (model->BSIM4v7SunitLengthSidewallJctCap > 0.0) - { model->BSIM4v7SunitLengthSidewallTempJctCap = 0.0; - fprintf(stderr, "Temperature effect has caused cjsws to be negative. Cjsws is clamped to zero.\n"); - } - if (model->BSIM4v7DunitLengthSidewallJctCap > 0.0) - { model->BSIM4v7DunitLengthSidewallTempJctCap = 0.0; - fprintf(stderr, "Temperature effect has caused cjswd to be negative. Cjswd is clamped to zero.\n"); - } - } - T0 = model->BSIM4v7tcjswg * delTemp; - if (T0 >= -1.0) - { model->BSIM4v7SunitLengthGateSidewallTempJctCap = model->BSIM4v7SunitLengthGateSidewallJctCap *(1.0 + T0); - model->BSIM4v7DunitLengthGateSidewallTempJctCap = model->BSIM4v7DunitLengthGateSidewallJctCap *(1.0 + T0); - } - else - { if (model->BSIM4v7SunitLengthGateSidewallJctCap > 0.0) - { model->BSIM4v7SunitLengthGateSidewallTempJctCap = 0.0; - fprintf(stderr, "Temperature effect has caused cjswgs to be negative. Cjswgs is clamped to zero.\n"); - } - if (model->BSIM4v7DunitLengthGateSidewallJctCap > 0.0) - { model->BSIM4v7DunitLengthGateSidewallTempJctCap = 0.0; - fprintf(stderr, "Temperature effect has caused cjswgd to be negative. Cjswgd is clamped to zero.\n"); - } - } - - model->BSIM4v7PhiBS = model->BSIM4v7SbulkJctPotential - - model->BSIM4v7tpb * delTemp; - if (model->BSIM4v7PhiBS < 0.01) - { model->BSIM4v7PhiBS = 0.01; - fprintf(stderr, "Temperature effect has caused pbs to be less than 0.01. Pbs is clamped to 0.01.\n"); - } - model->BSIM4v7PhiBD = model->BSIM4v7DbulkJctPotential - - model->BSIM4v7tpb * delTemp; - if (model->BSIM4v7PhiBD < 0.01) - { model->BSIM4v7PhiBD = 0.01; - fprintf(stderr, "Temperature effect has caused pbd to be less than 0.01. Pbd is clamped to 0.01.\n"); - } - - model->BSIM4v7PhiBSWS = model->BSIM4v7SsidewallJctPotential - - model->BSIM4v7tpbsw * delTemp; - if (model->BSIM4v7PhiBSWS <= 0.01) - { model->BSIM4v7PhiBSWS = 0.01; - fprintf(stderr, "Temperature effect has caused pbsws to be less than 0.01. Pbsws is clamped to 0.01.\n"); - } - model->BSIM4v7PhiBSWD = model->BSIM4v7DsidewallJctPotential - - model->BSIM4v7tpbsw * delTemp; - if (model->BSIM4v7PhiBSWD <= 0.01) - { model->BSIM4v7PhiBSWD = 0.01; - fprintf(stderr, "Temperature effect has caused pbswd to be less than 0.01. Pbswd is clamped to 0.01.\n"); - } - - model->BSIM4v7PhiBSWGS = model->BSIM4v7SGatesidewallJctPotential - - model->BSIM4v7tpbswg * delTemp; - if (model->BSIM4v7PhiBSWGS <= 0.01) - { model->BSIM4v7PhiBSWGS = 0.01; - fprintf(stderr, "Temperature effect has caused pbswgs to be less than 0.01. Pbswgs is clamped to 0.01.\n"); - } - model->BSIM4v7PhiBSWGD = model->BSIM4v7DGatesidewallJctPotential - - model->BSIM4v7tpbswg * delTemp; - if (model->BSIM4v7PhiBSWGD <= 0.01) - { model->BSIM4v7PhiBSWGD = 0.01; - fprintf(stderr, "Temperature effect has caused pbswgd to be less than 0.01. Pbswgd is clamped to 0.01.\n"); - } /* End of junction capacitance */ - - - if (model->BSIM4v7ijthdfwd <= 0.0) - { model->BSIM4v7ijthdfwd = 0.0; - fprintf(stderr, "Ijthdfwd reset to %g.\n", model->BSIM4v7ijthdfwd); - } - if (model->BSIM4v7ijthsfwd <= 0.0) - { model->BSIM4v7ijthsfwd = 0.0; - fprintf(stderr, "Ijthsfwd reset to %g.\n", model->BSIM4v7ijthsfwd); - } - if (model->BSIM4v7ijthdrev <= 0.0) - { model->BSIM4v7ijthdrev = 0.0; - fprintf(stderr, "Ijthdrev reset to %g.\n", model->BSIM4v7ijthdrev); - } - if (model->BSIM4v7ijthsrev <= 0.0) - { model->BSIM4v7ijthsrev = 0.0; - fprintf(stderr, "Ijthsrev reset to %g.\n", model->BSIM4v7ijthsrev); - } - - if ((model->BSIM4v7xjbvd <= 0.0) && (model->BSIM4v7dioMod == 2)) - { model->BSIM4v7xjbvd = 0.0; - fprintf(stderr, "Xjbvd reset to %g.\n", model->BSIM4v7xjbvd); - } - else if ((model->BSIM4v7xjbvd < 0.0) && (model->BSIM4v7dioMod == 0)) - { model->BSIM4v7xjbvd = 0.0; - fprintf(stderr, "Xjbvd reset to %g.\n", model->BSIM4v7xjbvd); - } - - if (model->BSIM4v7bvd <= 0.0) /*4.6.2*/ - { model->BSIM4v7bvd = 0.0; - fprintf(stderr, "BVD reset to %g.\n", model->BSIM4v7bvd); - } - - if ((model->BSIM4v7xjbvs <= 0.0) && (model->BSIM4v7dioMod == 2)) - { model->BSIM4v7xjbvs = 0.0; - fprintf(stderr, "Xjbvs reset to %g.\n", model->BSIM4v7xjbvs); - } - else if ((model->BSIM4v7xjbvs < 0.0) && (model->BSIM4v7dioMod == 0)) - { model->BSIM4v7xjbvs = 0.0; - fprintf(stderr, "Xjbvs reset to %g.\n", model->BSIM4v7xjbvs); - } - - if (model->BSIM4v7bvs <= 0.0) - { model->BSIM4v7bvs = 0.0; - fprintf(stderr, "BVS reset to %g.\n", model->BSIM4v7bvs); - } - - - /* loop through all the instances of the model */ - for (here = BSIM4v7instances(model); here != NULL; - here = BSIM4v7nextInstance(here)) - { - pSizeDependParamKnot = model->pSizeDependParamKnot; - Size_Not_Found = 1; - while ((pSizeDependParamKnot != NULL) && Size_Not_Found) - { if ((here->BSIM4v7l == pSizeDependParamKnot->Length) - && (here->BSIM4v7w == pSizeDependParamKnot->Width) - && (here->BSIM4v7nf == pSizeDependParamKnot->NFinger)) - { Size_Not_Found = 0; - here->pParam = pSizeDependParamKnot; - pParam = here->pParam; /*bug-fix */ - } - else - { pLastKnot = pSizeDependParamKnot; - pSizeDependParamKnot = pSizeDependParamKnot->pNext; - } - } - - /* stress effect */ - Ldrn = here->BSIM4v7l; - Wdrn = here->BSIM4v7w / here->BSIM4v7nf; - - if (Size_Not_Found) - { pParam = TMALLOC(struct bsim4SizeDependParam, 1); - if (pLastKnot == NULL) - model->pSizeDependParamKnot = pParam; - else - pLastKnot->pNext = pParam; - pParam->pNext = NULL; - here->pParam = pParam; - - pParam->Length = here->BSIM4v7l; - pParam->Width = here->BSIM4v7w; - pParam->NFinger = here->BSIM4v7nf; - Lnew = here->BSIM4v7l + model->BSIM4v7xl ; - Wnew = here->BSIM4v7w / here->BSIM4v7nf + model->BSIM4v7xw; - - T0 = pow(Lnew, model->BSIM4v7Lln); - T1 = pow(Wnew, model->BSIM4v7Lwn); - tmp1 = model->BSIM4v7Ll / T0 + model->BSIM4v7Lw / T1 - + model->BSIM4v7Lwl / (T0 * T1); - pParam->BSIM4v7dl = model->BSIM4v7Lint + tmp1; - tmp2 = model->BSIM4v7Llc / T0 + model->BSIM4v7Lwc / T1 - + model->BSIM4v7Lwlc / (T0 * T1); - pParam->BSIM4v7dlc = model->BSIM4v7dlc + tmp2; - - T2 = pow(Lnew, model->BSIM4v7Wln); - T3 = pow(Wnew, model->BSIM4v7Wwn); - tmp1 = model->BSIM4v7Wl / T2 + model->BSIM4v7Ww / T3 - + model->BSIM4v7Wwl / (T2 * T3); - pParam->BSIM4v7dw = model->BSIM4v7Wint + tmp1; - tmp2 = model->BSIM4v7Wlc / T2 + model->BSIM4v7Wwc / T3 - + model->BSIM4v7Wwlc / (T2 * T3); - pParam->BSIM4v7dwc = model->BSIM4v7dwc + tmp2; - pParam->BSIM4v7dwj = model->BSIM4v7dwj + tmp2; - - pParam->BSIM4v7leff = Lnew - 2.0 * pParam->BSIM4v7dl; - if (pParam->BSIM4v7leff <= 0.0) - { - SPfrontEnd->IFerrorf(ERR_FATAL, - "BSIM4v7: mosfet %s, model %s: Effective channel length <= 0", - model->BSIM4v7modName, here->BSIM4v7name); - return(E_BADPARM); - } - - pParam->BSIM4v7weff = Wnew - 2.0 * pParam->BSIM4v7dw; - if (pParam->BSIM4v7weff <= 0.0) - { - SPfrontEnd->IFerrorf(ERR_FATAL, - "BSIM4v7: mosfet %s, model %s: Effective channel width <= 0", - model->BSIM4v7modName, here->BSIM4v7name); - return(E_BADPARM); - } - - pParam->BSIM4v7leffCV = Lnew - 2.0 * pParam->BSIM4v7dlc; - if (pParam->BSIM4v7leffCV <= 0.0) - { - SPfrontEnd->IFerrorf(ERR_FATAL, - "BSIM4v7: mosfet %s, model %s: Effective channel length for C-V <= 0", - model->BSIM4v7modName, here->BSIM4v7name); - return(E_BADPARM); - } - - pParam->BSIM4v7weffCV = Wnew - 2.0 * pParam->BSIM4v7dwc; - if (pParam->BSIM4v7weffCV <= 0.0) - { - SPfrontEnd->IFerrorf(ERR_FATAL, - "BSIM4v7: mosfet %s, model %s: Effective channel width for C-V <= 0", - model->BSIM4v7modName, here->BSIM4v7name); - return(E_BADPARM); - } - - pParam->BSIM4v7weffCJ = Wnew - 2.0 * pParam->BSIM4v7dwj; - if (pParam->BSIM4v7weffCJ <= 0.0) - { - SPfrontEnd->IFerrorf(ERR_FATAL, - "BSIM4v7: mosfet %s, model %s: Effective channel width for S/D junctions <= 0", - model->BSIM4v7modName, here->BSIM4v7name); - return(E_BADPARM); - } - - - if (model->BSIM4v7binUnit == 1) - { Inv_L = 1.0e-6 / pParam->BSIM4v7leff; - Inv_W = 1.0e-6 / pParam->BSIM4v7weff; - Inv_LW = 1.0e-12 / (pParam->BSIM4v7leff - * pParam->BSIM4v7weff); - } - else - { Inv_L = 1.0 / pParam->BSIM4v7leff; - Inv_W = 1.0 / pParam->BSIM4v7weff; - Inv_LW = 1.0 / (pParam->BSIM4v7leff - * pParam->BSIM4v7weff); - } - pParam->BSIM4v7cdsc = model->BSIM4v7cdsc - + model->BSIM4v7lcdsc * Inv_L - + model->BSIM4v7wcdsc * Inv_W - + model->BSIM4v7pcdsc * Inv_LW; - pParam->BSIM4v7cdscb = model->BSIM4v7cdscb - + model->BSIM4v7lcdscb * Inv_L - + model->BSIM4v7wcdscb * Inv_W - + model->BSIM4v7pcdscb * Inv_LW; - - pParam->BSIM4v7cdscd = model->BSIM4v7cdscd - + model->BSIM4v7lcdscd * Inv_L - + model->BSIM4v7wcdscd * Inv_W - + model->BSIM4v7pcdscd * Inv_LW; - - pParam->BSIM4v7cit = model->BSIM4v7cit - + model->BSIM4v7lcit * Inv_L - + model->BSIM4v7wcit * Inv_W - + model->BSIM4v7pcit * Inv_LW; - pParam->BSIM4v7nfactor = model->BSIM4v7nfactor - + model->BSIM4v7lnfactor * Inv_L - + model->BSIM4v7wnfactor * Inv_W - + model->BSIM4v7pnfactor * Inv_LW; - pParam->BSIM4v7tnfactor = model->BSIM4v7tnfactor /* v4.7 */ - + model->BSIM4v7ltnfactor * Inv_L - + model->BSIM4v7wtnfactor * Inv_W - + model->BSIM4v7ptnfactor * Inv_LW; - pParam->BSIM4v7xj = model->BSIM4v7xj - + model->BSIM4v7lxj * Inv_L - + model->BSIM4v7wxj * Inv_W - + model->BSIM4v7pxj * Inv_LW; - pParam->BSIM4v7vsat = model->BSIM4v7vsat - + model->BSIM4v7lvsat * Inv_L - + model->BSIM4v7wvsat * Inv_W - + model->BSIM4v7pvsat * Inv_LW; - pParam->BSIM4v7at = model->BSIM4v7at - + model->BSIM4v7lat * Inv_L - + model->BSIM4v7wat * Inv_W - + model->BSIM4v7pat * Inv_LW; - pParam->BSIM4v7a0 = model->BSIM4v7a0 - + model->BSIM4v7la0 * Inv_L - + model->BSIM4v7wa0 * Inv_W - + model->BSIM4v7pa0 * Inv_LW; - - pParam->BSIM4v7ags = model->BSIM4v7ags - + model->BSIM4v7lags * Inv_L - + model->BSIM4v7wags * Inv_W - + model->BSIM4v7pags * Inv_LW; - - pParam->BSIM4v7a1 = model->BSIM4v7a1 - + model->BSIM4v7la1 * Inv_L - + model->BSIM4v7wa1 * Inv_W - + model->BSIM4v7pa1 * Inv_LW; - pParam->BSIM4v7a2 = model->BSIM4v7a2 - + model->BSIM4v7la2 * Inv_L - + model->BSIM4v7wa2 * Inv_W - + model->BSIM4v7pa2 * Inv_LW; - pParam->BSIM4v7keta = model->BSIM4v7keta - + model->BSIM4v7lketa * Inv_L - + model->BSIM4v7wketa * Inv_W - + model->BSIM4v7pketa * Inv_LW; - pParam->BSIM4v7nsub = model->BSIM4v7nsub - + model->BSIM4v7lnsub * Inv_L - + model->BSIM4v7wnsub * Inv_W - + model->BSIM4v7pnsub * Inv_LW; - pParam->BSIM4v7ndep = model->BSIM4v7ndep - + model->BSIM4v7lndep * Inv_L - + model->BSIM4v7wndep * Inv_W - + model->BSIM4v7pndep * Inv_LW; - pParam->BSIM4v7nsd = model->BSIM4v7nsd - + model->BSIM4v7lnsd * Inv_L - + model->BSIM4v7wnsd * Inv_W - + model->BSIM4v7pnsd * Inv_LW; - pParam->BSIM4v7phin = model->BSIM4v7phin - + model->BSIM4v7lphin * Inv_L - + model->BSIM4v7wphin * Inv_W - + model->BSIM4v7pphin * Inv_LW; - pParam->BSIM4v7ngate = model->BSIM4v7ngate - + model->BSIM4v7lngate * Inv_L - + model->BSIM4v7wngate * Inv_W - + model->BSIM4v7pngate * Inv_LW; - pParam->BSIM4v7gamma1 = model->BSIM4v7gamma1 - + model->BSIM4v7lgamma1 * Inv_L - + model->BSIM4v7wgamma1 * Inv_W - + model->BSIM4v7pgamma1 * Inv_LW; - pParam->BSIM4v7gamma2 = model->BSIM4v7gamma2 - + model->BSIM4v7lgamma2 * Inv_L - + model->BSIM4v7wgamma2 * Inv_W - + model->BSIM4v7pgamma2 * Inv_LW; - pParam->BSIM4v7vbx = model->BSIM4v7vbx - + model->BSIM4v7lvbx * Inv_L - + model->BSIM4v7wvbx * Inv_W - + model->BSIM4v7pvbx * Inv_LW; - pParam->BSIM4v7vbm = model->BSIM4v7vbm - + model->BSIM4v7lvbm * Inv_L - + model->BSIM4v7wvbm * Inv_W - + model->BSIM4v7pvbm * Inv_LW; - pParam->BSIM4v7xt = model->BSIM4v7xt - + model->BSIM4v7lxt * Inv_L - + model->BSIM4v7wxt * Inv_W - + model->BSIM4v7pxt * Inv_LW; - pParam->BSIM4v7vfb = model->BSIM4v7vfb - + model->BSIM4v7lvfb * Inv_L - + model->BSIM4v7wvfb * Inv_W - + model->BSIM4v7pvfb * Inv_LW; - pParam->BSIM4v7k1 = model->BSIM4v7k1 - + model->BSIM4v7lk1 * Inv_L - + model->BSIM4v7wk1 * Inv_W - + model->BSIM4v7pk1 * Inv_LW; - pParam->BSIM4v7kt1 = model->BSIM4v7kt1 - + model->BSIM4v7lkt1 * Inv_L - + model->BSIM4v7wkt1 * Inv_W - + model->BSIM4v7pkt1 * Inv_LW; - pParam->BSIM4v7kt1l = model->BSIM4v7kt1l - + model->BSIM4v7lkt1l * Inv_L - + model->BSIM4v7wkt1l * Inv_W - + model->BSIM4v7pkt1l * Inv_LW; - pParam->BSIM4v7k2 = model->BSIM4v7k2 - + model->BSIM4v7lk2 * Inv_L - + model->BSIM4v7wk2 * Inv_W - + model->BSIM4v7pk2 * Inv_LW; - pParam->BSIM4v7kt2 = model->BSIM4v7kt2 - + model->BSIM4v7lkt2 * Inv_L - + model->BSIM4v7wkt2 * Inv_W - + model->BSIM4v7pkt2 * Inv_LW; - pParam->BSIM4v7k3 = model->BSIM4v7k3 - + model->BSIM4v7lk3 * Inv_L - + model->BSIM4v7wk3 * Inv_W - + model->BSIM4v7pk3 * Inv_LW; - pParam->BSIM4v7k3b = model->BSIM4v7k3b - + model->BSIM4v7lk3b * Inv_L - + model->BSIM4v7wk3b * Inv_W - + model->BSIM4v7pk3b * Inv_LW; - pParam->BSIM4v7w0 = model->BSIM4v7w0 - + model->BSIM4v7lw0 * Inv_L - + model->BSIM4v7ww0 * Inv_W - + model->BSIM4v7pw0 * Inv_LW; - pParam->BSIM4v7lpe0 = model->BSIM4v7lpe0 - + model->BSIM4v7llpe0 * Inv_L - + model->BSIM4v7wlpe0 * Inv_W - + model->BSIM4v7plpe0 * Inv_LW; - pParam->BSIM4v7lpeb = model->BSIM4v7lpeb - + model->BSIM4v7llpeb * Inv_L - + model->BSIM4v7wlpeb * Inv_W - + model->BSIM4v7plpeb * Inv_LW; - pParam->BSIM4v7dvtp0 = model->BSIM4v7dvtp0 - + model->BSIM4v7ldvtp0 * Inv_L - + model->BSIM4v7wdvtp0 * Inv_W - + model->BSIM4v7pdvtp0 * Inv_LW; - pParam->BSIM4v7dvtp1 = model->BSIM4v7dvtp1 - + model->BSIM4v7ldvtp1 * Inv_L - + model->BSIM4v7wdvtp1 * Inv_W - + model->BSIM4v7pdvtp1 * Inv_LW; - pParam->BSIM4v7dvtp2 = model->BSIM4v7dvtp2 /* v4.7 */ - + model->BSIM4v7ldvtp2 * Inv_L - + model->BSIM4v7wdvtp2 * Inv_W - + model->BSIM4v7pdvtp2 * Inv_LW; - pParam->BSIM4v7dvtp3 = model->BSIM4v7dvtp3 /* v4.7 */ - + model->BSIM4v7ldvtp3 * Inv_L - + model->BSIM4v7wdvtp3 * Inv_W - + model->BSIM4v7pdvtp3 * Inv_LW; - pParam->BSIM4v7dvtp4 = model->BSIM4v7dvtp4 /* v4.7 */ - + model->BSIM4v7ldvtp4 * Inv_L - + model->BSIM4v7wdvtp4 * Inv_W - + model->BSIM4v7pdvtp4 * Inv_LW; - pParam->BSIM4v7dvtp5 = model->BSIM4v7dvtp5 /* v4.7 */ - + model->BSIM4v7ldvtp5 * Inv_L - + model->BSIM4v7wdvtp5 * Inv_W - + model->BSIM4v7pdvtp5 * Inv_LW; - pParam->BSIM4v7dvt0 = model->BSIM4v7dvt0 - + model->BSIM4v7ldvt0 * Inv_L - + model->BSIM4v7wdvt0 * Inv_W - + model->BSIM4v7pdvt0 * Inv_LW; - pParam->BSIM4v7dvt1 = model->BSIM4v7dvt1 - + model->BSIM4v7ldvt1 * Inv_L - + model->BSIM4v7wdvt1 * Inv_W - + model->BSIM4v7pdvt1 * Inv_LW; - pParam->BSIM4v7dvt2 = model->BSIM4v7dvt2 - + model->BSIM4v7ldvt2 * Inv_L - + model->BSIM4v7wdvt2 * Inv_W - + model->BSIM4v7pdvt2 * Inv_LW; - pParam->BSIM4v7dvt0w = model->BSIM4v7dvt0w - + model->BSIM4v7ldvt0w * Inv_L - + model->BSIM4v7wdvt0w * Inv_W - + model->BSIM4v7pdvt0w * Inv_LW; - pParam->BSIM4v7dvt1w = model->BSIM4v7dvt1w - + model->BSIM4v7ldvt1w * Inv_L - + model->BSIM4v7wdvt1w * Inv_W - + model->BSIM4v7pdvt1w * Inv_LW; - pParam->BSIM4v7dvt2w = model->BSIM4v7dvt2w - + model->BSIM4v7ldvt2w * Inv_L - + model->BSIM4v7wdvt2w * Inv_W - + model->BSIM4v7pdvt2w * Inv_LW; - pParam->BSIM4v7drout = model->BSIM4v7drout - + model->BSIM4v7ldrout * Inv_L - + model->BSIM4v7wdrout * Inv_W - + model->BSIM4v7pdrout * Inv_LW; - pParam->BSIM4v7dsub = model->BSIM4v7dsub - + model->BSIM4v7ldsub * Inv_L - + model->BSIM4v7wdsub * Inv_W - + model->BSIM4v7pdsub * Inv_LW; - pParam->BSIM4v7vth0 = model->BSIM4v7vth0 - + model->BSIM4v7lvth0 * Inv_L - + model->BSIM4v7wvth0 * Inv_W - + model->BSIM4v7pvth0 * Inv_LW; - pParam->BSIM4v7ua = model->BSIM4v7ua - + model->BSIM4v7lua * Inv_L - + model->BSIM4v7wua * Inv_W - + model->BSIM4v7pua * Inv_LW; - pParam->BSIM4v7ua1 = model->BSIM4v7ua1 - + model->BSIM4v7lua1 * Inv_L - + model->BSIM4v7wua1 * Inv_W - + model->BSIM4v7pua1 * Inv_LW; - pParam->BSIM4v7ub = model->BSIM4v7ub - + model->BSIM4v7lub * Inv_L - + model->BSIM4v7wub * Inv_W - + model->BSIM4v7pub * Inv_LW; - pParam->BSIM4v7ub1 = model->BSIM4v7ub1 - + model->BSIM4v7lub1 * Inv_L - + model->BSIM4v7wub1 * Inv_W - + model->BSIM4v7pub1 * Inv_LW; - pParam->BSIM4v7uc = model->BSIM4v7uc - + model->BSIM4v7luc * Inv_L - + model->BSIM4v7wuc * Inv_W - + model->BSIM4v7puc * Inv_LW; - pParam->BSIM4v7uc1 = model->BSIM4v7uc1 - + model->BSIM4v7luc1 * Inv_L - + model->BSIM4v7wuc1 * Inv_W - + model->BSIM4v7puc1 * Inv_LW; - pParam->BSIM4v7ud = model->BSIM4v7ud - + model->BSIM4v7lud * Inv_L - + model->BSIM4v7wud * Inv_W - + model->BSIM4v7pud * Inv_LW; - pParam->BSIM4v7ud1 = model->BSIM4v7ud1 - + model->BSIM4v7lud1 * Inv_L - + model->BSIM4v7wud1 * Inv_W - + model->BSIM4v7pud1 * Inv_LW; - pParam->BSIM4v7up = model->BSIM4v7up - + model->BSIM4v7lup * Inv_L - + model->BSIM4v7wup * Inv_W - + model->BSIM4v7pup * Inv_LW; - pParam->BSIM4v7lp = model->BSIM4v7lp - + model->BSIM4v7llp * Inv_L - + model->BSIM4v7wlp * Inv_W - + model->BSIM4v7plp * Inv_LW; - pParam->BSIM4v7eu = model->BSIM4v7eu - + model->BSIM4v7leu * Inv_L - + model->BSIM4v7weu * Inv_W - + model->BSIM4v7peu * Inv_LW; - pParam->BSIM4v7u0 = model->BSIM4v7u0 - + model->BSIM4v7lu0 * Inv_L - + model->BSIM4v7wu0 * Inv_W - + model->BSIM4v7pu0 * Inv_LW; - pParam->BSIM4v7ute = model->BSIM4v7ute - + model->BSIM4v7lute * Inv_L - + model->BSIM4v7wute * Inv_W - + model->BSIM4v7pute * Inv_LW; - /*high k mobility*/ - pParam->BSIM4v7ucs = model->BSIM4v7ucs - + model->BSIM4v7lucs * Inv_L - + model->BSIM4v7wucs * Inv_W - + model->BSIM4v7pucs * Inv_LW; - pParam->BSIM4v7ucste = model->BSIM4v7ucste - + model->BSIM4v7lucste * Inv_L - + model->BSIM4v7wucste * Inv_W - + model->BSIM4v7pucste * Inv_LW; - - pParam->BSIM4v7voff = model->BSIM4v7voff - + model->BSIM4v7lvoff * Inv_L - + model->BSIM4v7wvoff * Inv_W - + model->BSIM4v7pvoff * Inv_LW; - pParam->BSIM4v7tvoff = model->BSIM4v7tvoff - + model->BSIM4v7ltvoff * Inv_L - + model->BSIM4v7wtvoff * Inv_W - + model->BSIM4v7ptvoff * Inv_LW; - pParam->BSIM4v7minv = model->BSIM4v7minv - + model->BSIM4v7lminv * Inv_L - + model->BSIM4v7wminv * Inv_W - + model->BSIM4v7pminv * Inv_LW; - pParam->BSIM4v7minvcv = model->BSIM4v7minvcv - + model->BSIM4v7lminvcv * Inv_L - + model->BSIM4v7wminvcv * Inv_W - + model->BSIM4v7pminvcv * Inv_LW; - pParam->BSIM4v7fprout = model->BSIM4v7fprout - + model->BSIM4v7lfprout * Inv_L - + model->BSIM4v7wfprout * Inv_W - + model->BSIM4v7pfprout * Inv_LW; - pParam->BSIM4v7pdits = model->BSIM4v7pdits - + model->BSIM4v7lpdits * Inv_L - + model->BSIM4v7wpdits * Inv_W - + model->BSIM4v7ppdits * Inv_LW; - pParam->BSIM4v7pditsd = model->BSIM4v7pditsd - + model->BSIM4v7lpditsd * Inv_L - + model->BSIM4v7wpditsd * Inv_W - + model->BSIM4v7ppditsd * Inv_LW; - pParam->BSIM4v7delta = model->BSIM4v7delta - + model->BSIM4v7ldelta * Inv_L - + model->BSIM4v7wdelta * Inv_W - + model->BSIM4v7pdelta * Inv_LW; - pParam->BSIM4v7rdsw = model->BSIM4v7rdsw - + model->BSIM4v7lrdsw * Inv_L - + model->BSIM4v7wrdsw * Inv_W - + model->BSIM4v7prdsw * Inv_LW; - pParam->BSIM4v7rdw = model->BSIM4v7rdw - + model->BSIM4v7lrdw * Inv_L - + model->BSIM4v7wrdw * Inv_W - + model->BSIM4v7prdw * Inv_LW; - pParam->BSIM4v7rsw = model->BSIM4v7rsw - + model->BSIM4v7lrsw * Inv_L - + model->BSIM4v7wrsw * Inv_W - + model->BSIM4v7prsw * Inv_LW; - pParam->BSIM4v7prwg = model->BSIM4v7prwg - + model->BSIM4v7lprwg * Inv_L - + model->BSIM4v7wprwg * Inv_W - + model->BSIM4v7pprwg * Inv_LW; - pParam->BSIM4v7prwb = model->BSIM4v7prwb - + model->BSIM4v7lprwb * Inv_L - + model->BSIM4v7wprwb * Inv_W - + model->BSIM4v7pprwb * Inv_LW; - pParam->BSIM4v7prt = model->BSIM4v7prt - + model->BSIM4v7lprt * Inv_L - + model->BSIM4v7wprt * Inv_W - + model->BSIM4v7pprt * Inv_LW; - pParam->BSIM4v7eta0 = model->BSIM4v7eta0 - + model->BSIM4v7leta0 * Inv_L - + model->BSIM4v7weta0 * Inv_W - + model->BSIM4v7peta0 * Inv_LW; - pParam->BSIM4v7teta0 = model->BSIM4v7teta0 /* v4.7 */ - + model->BSIM4v7lteta0 * Inv_L - + model->BSIM4v7wteta0 * Inv_W - + model->BSIM4v7pteta0 * Inv_LW; - pParam->BSIM4v7etab = model->BSIM4v7etab - + model->BSIM4v7letab * Inv_L - + model->BSIM4v7wetab * Inv_W - + model->BSIM4v7petab * Inv_LW; - pParam->BSIM4v7pclm = model->BSIM4v7pclm - + model->BSIM4v7lpclm * Inv_L - + model->BSIM4v7wpclm * Inv_W - + model->BSIM4v7ppclm * Inv_LW; - pParam->BSIM4v7pdibl1 = model->BSIM4v7pdibl1 - + model->BSIM4v7lpdibl1 * Inv_L - + model->BSIM4v7wpdibl1 * Inv_W - + model->BSIM4v7ppdibl1 * Inv_LW; - pParam->BSIM4v7pdibl2 = model->BSIM4v7pdibl2 - + model->BSIM4v7lpdibl2 * Inv_L - + model->BSIM4v7wpdibl2 * Inv_W - + model->BSIM4v7ppdibl2 * Inv_LW; - pParam->BSIM4v7pdiblb = model->BSIM4v7pdiblb - + model->BSIM4v7lpdiblb * Inv_L - + model->BSIM4v7wpdiblb * Inv_W - + model->BSIM4v7ppdiblb * Inv_LW; - pParam->BSIM4v7pscbe1 = model->BSIM4v7pscbe1 - + model->BSIM4v7lpscbe1 * Inv_L - + model->BSIM4v7wpscbe1 * Inv_W - + model->BSIM4v7ppscbe1 * Inv_LW; - pParam->BSIM4v7pscbe2 = model->BSIM4v7pscbe2 - + model->BSIM4v7lpscbe2 * Inv_L - + model->BSIM4v7wpscbe2 * Inv_W - + model->BSIM4v7ppscbe2 * Inv_LW; - pParam->BSIM4v7pvag = model->BSIM4v7pvag - + model->BSIM4v7lpvag * Inv_L - + model->BSIM4v7wpvag * Inv_W - + model->BSIM4v7ppvag * Inv_LW; - pParam->BSIM4v7wr = model->BSIM4v7wr - + model->BSIM4v7lwr * Inv_L - + model->BSIM4v7wwr * Inv_W - + model->BSIM4v7pwr * Inv_LW; - pParam->BSIM4v7dwg = model->BSIM4v7dwg - + model->BSIM4v7ldwg * Inv_L - + model->BSIM4v7wdwg * Inv_W - + model->BSIM4v7pdwg * Inv_LW; - pParam->BSIM4v7dwb = model->BSIM4v7dwb - + model->BSIM4v7ldwb * Inv_L - + model->BSIM4v7wdwb * Inv_W - + model->BSIM4v7pdwb * Inv_LW; - pParam->BSIM4v7b0 = model->BSIM4v7b0 - + model->BSIM4v7lb0 * Inv_L - + model->BSIM4v7wb0 * Inv_W - + model->BSIM4v7pb0 * Inv_LW; - pParam->BSIM4v7b1 = model->BSIM4v7b1 - + model->BSIM4v7lb1 * Inv_L - + model->BSIM4v7wb1 * Inv_W - + model->BSIM4v7pb1 * Inv_LW; - pParam->BSIM4v7alpha0 = model->BSIM4v7alpha0 - + model->BSIM4v7lalpha0 * Inv_L - + model->BSIM4v7walpha0 * Inv_W - + model->BSIM4v7palpha0 * Inv_LW; - pParam->BSIM4v7alpha1 = model->BSIM4v7alpha1 - + model->BSIM4v7lalpha1 * Inv_L - + model->BSIM4v7walpha1 * Inv_W - + model->BSIM4v7palpha1 * Inv_LW; - pParam->BSIM4v7beta0 = model->BSIM4v7beta0 - + model->BSIM4v7lbeta0 * Inv_L - + model->BSIM4v7wbeta0 * Inv_W - + model->BSIM4v7pbeta0 * Inv_LW; - pParam->BSIM4v7agidl = model->BSIM4v7agidl - + model->BSIM4v7lagidl * Inv_L - + model->BSIM4v7wagidl * Inv_W - + model->BSIM4v7pagidl * Inv_LW; - pParam->BSIM4v7bgidl = model->BSIM4v7bgidl - + model->BSIM4v7lbgidl * Inv_L - + model->BSIM4v7wbgidl * Inv_W - + model->BSIM4v7pbgidl * Inv_LW; - pParam->BSIM4v7cgidl = model->BSIM4v7cgidl - + model->BSIM4v7lcgidl * Inv_L - + model->BSIM4v7wcgidl * Inv_W - + model->BSIM4v7pcgidl * Inv_LW; - pParam->BSIM4v7egidl = model->BSIM4v7egidl - + model->BSIM4v7legidl * Inv_L - + model->BSIM4v7wegidl * Inv_W - + model->BSIM4v7pegidl * Inv_LW; - pParam->BSIM4v7rgidl = model->BSIM4v7rgidl /* v4.7 New GIDL/GISL */ - + model->BSIM4v7lrgidl * Inv_L - + model->BSIM4v7wrgidl * Inv_W - + model->BSIM4v7prgidl * Inv_LW; - pParam->BSIM4v7kgidl = model->BSIM4v7kgidl /* v4.7 New GIDL/GISL */ - + model->BSIM4v7lkgidl * Inv_L - + model->BSIM4v7wkgidl * Inv_W - + model->BSIM4v7pkgidl * Inv_LW; - pParam->BSIM4v7fgidl = model->BSIM4v7fgidl /* v4.7 New GIDL/GISL */ - + model->BSIM4v7lfgidl * Inv_L - + model->BSIM4v7wfgidl * Inv_W - + model->BSIM4v7pfgidl * Inv_LW; - pParam->BSIM4v7agisl = model->BSIM4v7agisl - + model->BSIM4v7lagisl * Inv_L - + model->BSIM4v7wagisl * Inv_W - + model->BSIM4v7pagisl * Inv_LW; - pParam->BSIM4v7bgisl = model->BSIM4v7bgisl - + model->BSIM4v7lbgisl * Inv_L - + model->BSIM4v7wbgisl * Inv_W - + model->BSIM4v7pbgisl * Inv_LW; - pParam->BSIM4v7cgisl = model->BSIM4v7cgisl - + model->BSIM4v7lcgisl * Inv_L - + model->BSIM4v7wcgisl * Inv_W - + model->BSIM4v7pcgisl * Inv_LW; - pParam->BSIM4v7egisl = model->BSIM4v7egisl - + model->BSIM4v7legisl * Inv_L - + model->BSIM4v7wegisl * Inv_W - + model->BSIM4v7pegisl * Inv_LW; - pParam->BSIM4v7rgisl = model->BSIM4v7rgisl /* v4.7 New GIDL/GISL */ - + model->BSIM4v7lrgisl * Inv_L - + model->BSIM4v7wrgisl * Inv_W - + model->BSIM4v7prgisl * Inv_LW; - pParam->BSIM4v7kgisl = model->BSIM4v7kgisl /* v4.7 New GIDL/GISL */ - + model->BSIM4v7lkgisl * Inv_L - + model->BSIM4v7wkgisl * Inv_W - + model->BSIM4v7pkgisl * Inv_LW; - pParam->BSIM4v7fgisl = model->BSIM4v7fgisl /* v4.7 New GIDL/GISL */ - + model->BSIM4v7lfgisl * Inv_L - + model->BSIM4v7wfgisl * Inv_W - + model->BSIM4v7pfgisl * Inv_LW; - pParam->BSIM4v7aigc = model->BSIM4v7aigc - + model->BSIM4v7laigc * Inv_L - + model->BSIM4v7waigc * Inv_W - + model->BSIM4v7paigc * Inv_LW; - pParam->BSIM4v7bigc = model->BSIM4v7bigc - + model->BSIM4v7lbigc * Inv_L - + model->BSIM4v7wbigc * Inv_W - + model->BSIM4v7pbigc * Inv_LW; - pParam->BSIM4v7cigc = model->BSIM4v7cigc - + model->BSIM4v7lcigc * Inv_L - + model->BSIM4v7wcigc * Inv_W - + model->BSIM4v7pcigc * Inv_LW; - pParam->BSIM4v7aigs = model->BSIM4v7aigs - + model->BSIM4v7laigs * Inv_L - + model->BSIM4v7waigs * Inv_W - + model->BSIM4v7paigs * Inv_LW; - pParam->BSIM4v7bigs = model->BSIM4v7bigs - + model->BSIM4v7lbigs * Inv_L - + model->BSIM4v7wbigs * Inv_W - + model->BSIM4v7pbigs * Inv_LW; - pParam->BSIM4v7cigs = model->BSIM4v7cigs - + model->BSIM4v7lcigs * Inv_L - + model->BSIM4v7wcigs * Inv_W - + model->BSIM4v7pcigs * Inv_LW; - pParam->BSIM4v7aigd = model->BSIM4v7aigd - + model->BSIM4v7laigd * Inv_L - + model->BSIM4v7waigd * Inv_W - + model->BSIM4v7paigd * Inv_LW; - pParam->BSIM4v7bigd = model->BSIM4v7bigd - + model->BSIM4v7lbigd * Inv_L - + model->BSIM4v7wbigd * Inv_W - + model->BSIM4v7pbigd * Inv_LW; - pParam->BSIM4v7cigd = model->BSIM4v7cigd - + model->BSIM4v7lcigd * Inv_L - + model->BSIM4v7wcigd * Inv_W - + model->BSIM4v7pcigd * Inv_LW; - pParam->BSIM4v7aigbacc = model->BSIM4v7aigbacc - + model->BSIM4v7laigbacc * Inv_L - + model->BSIM4v7waigbacc * Inv_W - + model->BSIM4v7paigbacc * Inv_LW; - pParam->BSIM4v7bigbacc = model->BSIM4v7bigbacc - + model->BSIM4v7lbigbacc * Inv_L - + model->BSIM4v7wbigbacc * Inv_W - + model->BSIM4v7pbigbacc * Inv_LW; - pParam->BSIM4v7cigbacc = model->BSIM4v7cigbacc - + model->BSIM4v7lcigbacc * Inv_L - + model->BSIM4v7wcigbacc * Inv_W - + model->BSIM4v7pcigbacc * Inv_LW; - pParam->BSIM4v7aigbinv = model->BSIM4v7aigbinv - + model->BSIM4v7laigbinv * Inv_L - + model->BSIM4v7waigbinv * Inv_W - + model->BSIM4v7paigbinv * Inv_LW; - pParam->BSIM4v7bigbinv = model->BSIM4v7bigbinv - + model->BSIM4v7lbigbinv * Inv_L - + model->BSIM4v7wbigbinv * Inv_W - + model->BSIM4v7pbigbinv * Inv_LW; - pParam->BSIM4v7cigbinv = model->BSIM4v7cigbinv - + model->BSIM4v7lcigbinv * Inv_L - + model->BSIM4v7wcigbinv * Inv_W - + model->BSIM4v7pcigbinv * Inv_LW; - pParam->BSIM4v7nigc = model->BSIM4v7nigc - + model->BSIM4v7lnigc * Inv_L - + model->BSIM4v7wnigc * Inv_W - + model->BSIM4v7pnigc * Inv_LW; - pParam->BSIM4v7nigbacc = model->BSIM4v7nigbacc - + model->BSIM4v7lnigbacc * Inv_L - + model->BSIM4v7wnigbacc * Inv_W - + model->BSIM4v7pnigbacc * Inv_LW; - pParam->BSIM4v7nigbinv = model->BSIM4v7nigbinv - + model->BSIM4v7lnigbinv * Inv_L - + model->BSIM4v7wnigbinv * Inv_W - + model->BSIM4v7pnigbinv * Inv_LW; - pParam->BSIM4v7ntox = model->BSIM4v7ntox - + model->BSIM4v7lntox * Inv_L - + model->BSIM4v7wntox * Inv_W - + model->BSIM4v7pntox * Inv_LW; - pParam->BSIM4v7eigbinv = model->BSIM4v7eigbinv - + model->BSIM4v7leigbinv * Inv_L - + model->BSIM4v7weigbinv * Inv_W - + model->BSIM4v7peigbinv * Inv_LW; - pParam->BSIM4v7pigcd = model->BSIM4v7pigcd - + model->BSIM4v7lpigcd * Inv_L - + model->BSIM4v7wpigcd * Inv_W - + model->BSIM4v7ppigcd * Inv_LW; - pParam->BSIM4v7poxedge = model->BSIM4v7poxedge - + model->BSIM4v7lpoxedge * Inv_L - + model->BSIM4v7wpoxedge * Inv_W - + model->BSIM4v7ppoxedge * Inv_LW; - pParam->BSIM4v7xrcrg1 = model->BSIM4v7xrcrg1 - + model->BSIM4v7lxrcrg1 * Inv_L - + model->BSIM4v7wxrcrg1 * Inv_W - + model->BSIM4v7pxrcrg1 * Inv_LW; - pParam->BSIM4v7xrcrg2 = model->BSIM4v7xrcrg2 - + model->BSIM4v7lxrcrg2 * Inv_L - + model->BSIM4v7wxrcrg2 * Inv_W - + model->BSIM4v7pxrcrg2 * Inv_LW; - pParam->BSIM4v7lambda = model->BSIM4v7lambda - + model->BSIM4v7llambda * Inv_L - + model->BSIM4v7wlambda * Inv_W - + model->BSIM4v7plambda * Inv_LW; - pParam->BSIM4v7vtl = model->BSIM4v7vtl - + model->BSIM4v7lvtl * Inv_L - + model->BSIM4v7wvtl * Inv_W - + model->BSIM4v7pvtl * Inv_LW; - pParam->BSIM4v7xn = model->BSIM4v7xn - + model->BSIM4v7lxn * Inv_L - + model->BSIM4v7wxn * Inv_W - + model->BSIM4v7pxn * Inv_LW; - pParam->BSIM4v7vfbsdoff = model->BSIM4v7vfbsdoff - + model->BSIM4v7lvfbsdoff * Inv_L - + model->BSIM4v7wvfbsdoff * Inv_W - + model->BSIM4v7pvfbsdoff * Inv_LW; - pParam->BSIM4v7tvfbsdoff = model->BSIM4v7tvfbsdoff - + model->BSIM4v7ltvfbsdoff * Inv_L - + model->BSIM4v7wtvfbsdoff * Inv_W - + model->BSIM4v7ptvfbsdoff * Inv_LW; - - pParam->BSIM4v7cgsl = model->BSIM4v7cgsl - + model->BSIM4v7lcgsl * Inv_L - + model->BSIM4v7wcgsl * Inv_W - + model->BSIM4v7pcgsl * Inv_LW; - pParam->BSIM4v7cgdl = model->BSIM4v7cgdl - + model->BSIM4v7lcgdl * Inv_L - + model->BSIM4v7wcgdl * Inv_W - + model->BSIM4v7pcgdl * Inv_LW; - pParam->BSIM4v7ckappas = model->BSIM4v7ckappas - + model->BSIM4v7lckappas * Inv_L - + model->BSIM4v7wckappas * Inv_W - + model->BSIM4v7pckappas * Inv_LW; - pParam->BSIM4v7ckappad = model->BSIM4v7ckappad - + model->BSIM4v7lckappad * Inv_L - + model->BSIM4v7wckappad * Inv_W - + model->BSIM4v7pckappad * Inv_LW; - pParam->BSIM4v7cf = model->BSIM4v7cf - + model->BSIM4v7lcf * Inv_L - + model->BSIM4v7wcf * Inv_W - + model->BSIM4v7pcf * Inv_LW; - pParam->BSIM4v7clc = model->BSIM4v7clc - + model->BSIM4v7lclc * Inv_L - + model->BSIM4v7wclc * Inv_W - + model->BSIM4v7pclc * Inv_LW; - pParam->BSIM4v7cle = model->BSIM4v7cle - + model->BSIM4v7lcle * Inv_L - + model->BSIM4v7wcle * Inv_W - + model->BSIM4v7pcle * Inv_LW; - pParam->BSIM4v7vfbcv = model->BSIM4v7vfbcv - + model->BSIM4v7lvfbcv * Inv_L - + model->BSIM4v7wvfbcv * Inv_W - + model->BSIM4v7pvfbcv * Inv_LW; - pParam->BSIM4v7acde = model->BSIM4v7acde - + model->BSIM4v7lacde * Inv_L - + model->BSIM4v7wacde * Inv_W - + model->BSIM4v7pacde * Inv_LW; - pParam->BSIM4v7moin = model->BSIM4v7moin - + model->BSIM4v7lmoin * Inv_L - + model->BSIM4v7wmoin * Inv_W - + model->BSIM4v7pmoin * Inv_LW; - pParam->BSIM4v7noff = model->BSIM4v7noff - + model->BSIM4v7lnoff * Inv_L - + model->BSIM4v7wnoff * Inv_W - + model->BSIM4v7pnoff * Inv_LW; - pParam->BSIM4v7voffcv = model->BSIM4v7voffcv - + model->BSIM4v7lvoffcv * Inv_L - + model->BSIM4v7wvoffcv * Inv_W - + model->BSIM4v7pvoffcv * Inv_LW; - pParam->BSIM4v7kvth0we = model->BSIM4v7kvth0we - + model->BSIM4v7lkvth0we * Inv_L - + model->BSIM4v7wkvth0we * Inv_W - + model->BSIM4v7pkvth0we * Inv_LW; - pParam->BSIM4v7k2we = model->BSIM4v7k2we - + model->BSIM4v7lk2we * Inv_L - + model->BSIM4v7wk2we * Inv_W - + model->BSIM4v7pk2we * Inv_LW; - pParam->BSIM4v7ku0we = model->BSIM4v7ku0we - + model->BSIM4v7lku0we * Inv_L - + model->BSIM4v7wku0we * Inv_W - + model->BSIM4v7pku0we * Inv_LW; - - pParam->BSIM4v7abulkCVfactor = 1.0 + pow((pParam->BSIM4v7clc - / pParam->BSIM4v7leffCV), - pParam->BSIM4v7cle); - - T0 = (TRatio - 1.0); - - PowWeffWr = pow(pParam->BSIM4v7weffCJ * 1.0e6, pParam->BSIM4v7wr) * here->BSIM4v7nf; - - T1 = T2 = T3 = T4 = 0.0; - pParam->BSIM4v7ucs = pParam->BSIM4v7ucs * pow(TRatio, pParam->BSIM4v7ucste); - if(model->BSIM4v7tempMod == 0) - { - pParam->BSIM4v7ua = pParam->BSIM4v7ua + pParam->BSIM4v7ua1 * T0; - pParam->BSIM4v7ub = pParam->BSIM4v7ub + pParam->BSIM4v7ub1 * T0; - pParam->BSIM4v7uc = pParam->BSIM4v7uc + pParam->BSIM4v7uc1 * T0; - pParam->BSIM4v7ud = pParam->BSIM4v7ud + pParam->BSIM4v7ud1 * T0; - pParam->BSIM4v7vsattemp = pParam->BSIM4v7vsat - pParam->BSIM4v7at * T0; - T10 = pParam->BSIM4v7prt * T0; - if(model->BSIM4v7rdsMod) - { - /* External Rd(V) */ - T1 = pParam->BSIM4v7rdw + T10; - T2 = model->BSIM4v7rdwmin + T10; - /* External Rs(V) */ - T3 = pParam->BSIM4v7rsw + T10; - T4 = model->BSIM4v7rswmin + T10; - } - /* Internal Rds(V) in IV */ - pParam->BSIM4v7rds0 = (pParam->BSIM4v7rdsw + T10) - * here->BSIM4v7nf / PowWeffWr; - pParam->BSIM4v7rdswmin = (model->BSIM4v7rdswmin + T10) - * here->BSIM4v7nf / PowWeffWr; - } - else - { - if (model->BSIM4v7tempMod == 3) - { - pParam->BSIM4v7ua = pParam->BSIM4v7ua * pow(TRatio, pParam->BSIM4v7ua1) ; - pParam->BSIM4v7ub = pParam->BSIM4v7ub * pow(TRatio, pParam->BSIM4v7ub1); - pParam->BSIM4v7uc = pParam->BSIM4v7uc * pow(TRatio, pParam->BSIM4v7uc1); - pParam->BSIM4v7ud = pParam->BSIM4v7ud * pow(TRatio, pParam->BSIM4v7ud1); - } - else - { - /* tempMod = 1, 2 */ - pParam->BSIM4v7ua = pParam->BSIM4v7ua * (1.0 + pParam->BSIM4v7ua1 * delTemp) ; - pParam->BSIM4v7ub = pParam->BSIM4v7ub * (1.0 + pParam->BSIM4v7ub1 * delTemp); - pParam->BSIM4v7uc = pParam->BSIM4v7uc * (1.0 + pParam->BSIM4v7uc1 * delTemp); - pParam->BSIM4v7ud = pParam->BSIM4v7ud * (1.0 + pParam->BSIM4v7ud1 * delTemp); - } - pParam->BSIM4v7vsattemp = pParam->BSIM4v7vsat * (1.0 - pParam->BSIM4v7at * delTemp); - T10 = 1.0 + pParam->BSIM4v7prt * delTemp; - if(model->BSIM4v7rdsMod) - { - /* External Rd(V) */ - T1 = pParam->BSIM4v7rdw * T10; - T2 = model->BSIM4v7rdwmin * T10; - - /* External Rs(V) */ - T3 = pParam->BSIM4v7rsw * T10; - T4 = model->BSIM4v7rswmin * T10; - } - /* Internal Rds(V) in IV */ - pParam->BSIM4v7rds0 = pParam->BSIM4v7rdsw * T10 * here->BSIM4v7nf / PowWeffWr; - pParam->BSIM4v7rdswmin = model->BSIM4v7rdswmin * T10 * here->BSIM4v7nf / PowWeffWr; - } - - if (T1 < 0.0) - { T1 = 0.0; - printf("Warning: Rdw at current temperature is negative; set to 0.\n"); - } - if (T2 < 0.0) - { T2 = 0.0; - printf("Warning: Rdwmin at current temperature is negative; set to 0.\n"); - } - pParam->BSIM4v7rd0 = T1 / PowWeffWr; - pParam->BSIM4v7rdwmin = T2 / PowWeffWr; - if (T3 < 0.0) - { T3 = 0.0; - printf("Warning: Rsw at current temperature is negative; set to 0.\n"); - } - if (T4 < 0.0) - { T4 = 0.0; - printf("Warning: Rswmin at current temperature is negative; set to 0.\n"); - } - pParam->BSIM4v7rs0 = T3 / PowWeffWr; - pParam->BSIM4v7rswmin = T4 / PowWeffWr; - - if (pParam->BSIM4v7u0 > 1.0) - pParam->BSIM4v7u0 = pParam->BSIM4v7u0 / 1.0e4; - - /* mobility channel length dependence */ - T5 = 1.0 - pParam->BSIM4v7up * exp( - pParam->BSIM4v7leff / pParam->BSIM4v7lp); - pParam->BSIM4v7u0temp = pParam->BSIM4v7u0 * T5 - * pow(TRatio, pParam->BSIM4v7ute); - if (pParam->BSIM4v7eu < 0.0) - { pParam->BSIM4v7eu = 0.0; - printf("Warning: eu has been negative; reset to 0.0.\n"); - } - if (pParam->BSIM4v7ucs < 0.0) - { pParam->BSIM4v7ucs = 0.0; - printf("Warning: ucs has been negative; reset to 0.0.\n"); - } - - pParam->BSIM4v7vfbsdoff = pParam->BSIM4v7vfbsdoff * (1.0 + pParam->BSIM4v7tvfbsdoff * delTemp); - pParam->BSIM4v7voff = pParam->BSIM4v7voff * (1.0 + pParam->BSIM4v7tvoff * delTemp); - - pParam->BSIM4v7nfactor = pParam->BSIM4v7nfactor + pParam->BSIM4v7tnfactor * delTemp / Tnom; /* v4.7 temp dep of leakage currents */ - pParam->BSIM4v7voffcv = pParam->BSIM4v7voffcv * (1.0 + pParam->BSIM4v7tvoffcv * delTemp); /* v4.7 temp dep of leakage currents */ - pParam->BSIM4v7eta0 = pParam->BSIM4v7eta0 + pParam->BSIM4v7teta0 * delTemp / Tnom; /* v4.7 temp dep of leakage currents */ - - /* Source End Velocity Limit */ - if((model->BSIM4v7vtlGiven) && (model->BSIM4v7vtl > 0.0) ) - { - if(model->BSIM4v7lc < 0.0) pParam->BSIM4v7lc = 0.0; - else pParam->BSIM4v7lc = model->BSIM4v7lc ; - T0 = pParam->BSIM4v7leff / (pParam->BSIM4v7xn * pParam->BSIM4v7leff + pParam->BSIM4v7lc); - pParam->BSIM4v7tfactor = (1.0 - T0) / (1.0 + T0 ); - } - - pParam->BSIM4v7cgdo = (model->BSIM4v7cgdo + pParam->BSIM4v7cf) - * pParam->BSIM4v7weffCV; - pParam->BSIM4v7cgso = (model->BSIM4v7cgso + pParam->BSIM4v7cf) - * pParam->BSIM4v7weffCV; - pParam->BSIM4v7cgbo = model->BSIM4v7cgbo * pParam->BSIM4v7leffCV * here->BSIM4v7nf; - - if (!model->BSIM4v7ndepGiven && model->BSIM4v7gamma1Given) - { T0 = pParam->BSIM4v7gamma1 * model->BSIM4v7coxe; - pParam->BSIM4v7ndep = 3.01248e22 * T0 * T0; - } - - pParam->BSIM4v7phi = Vtm0 * log(pParam->BSIM4v7ndep / ni) - + pParam->BSIM4v7phin + 0.4; - - pParam->BSIM4v7sqrtPhi = sqrt(pParam->BSIM4v7phi); - pParam->BSIM4v7phis3 = pParam->BSIM4v7sqrtPhi * pParam->BSIM4v7phi; - - pParam->BSIM4v7Xdep0 = sqrt(2.0 * epssub / (Charge_q - * pParam->BSIM4v7ndep * 1.0e6)) - * pParam->BSIM4v7sqrtPhi; - pParam->BSIM4v7sqrtXdep0 = sqrt(pParam->BSIM4v7Xdep0); - - if(model->BSIM4v7mtrlMod == 0) - pParam->BSIM4v7litl = sqrt(3.0 * 3.9 / epsrox * pParam->BSIM4v7xj * toxe); - else - pParam->BSIM4v7litl = sqrt(model->BSIM4v7epsrsub/epsrox * pParam->BSIM4v7xj * toxe); - - pParam->BSIM4v7vbi = Vtm0 * log(pParam->BSIM4v7nsd - * pParam->BSIM4v7ndep / (ni * ni)); - - if (model->BSIM4v7mtrlMod == 0) - { - if (pParam->BSIM4v7ngate > 0.0) - { pParam->BSIM4v7vfbsd = Vtm0 * log(pParam->BSIM4v7ngate - / pParam->BSIM4v7nsd); - } - else - pParam->BSIM4v7vfbsd = 0.0; - } - else - { - T0 = Vtm0 * log(pParam->BSIM4v7nsd/ni); - T1 = 0.5 * Eg0; - if(T0 > T1) - T0 = T1; - T2 = model->BSIM4v7easub + T1 - model->BSIM4v7type * T0; - pParam->BSIM4v7vfbsd = model->BSIM4v7phig - T2; - } - - pParam->BSIM4v7cdep0 = sqrt(Charge_q * epssub - * pParam->BSIM4v7ndep * 1.0e6 / 2.0 - / pParam->BSIM4v7phi); - - pParam->BSIM4v7ToxRatio = exp(pParam->BSIM4v7ntox - * log(model->BSIM4v7toxref / toxe)) - / toxe / toxe; - pParam->BSIM4v7ToxRatioEdge = exp(pParam->BSIM4v7ntox - * log(model->BSIM4v7toxref - / (toxe * pParam->BSIM4v7poxedge))) - / toxe / toxe - / pParam->BSIM4v7poxedge / pParam->BSIM4v7poxedge; - pParam->BSIM4v7Aechvb = (model->BSIM4v7type == NMOS) ? 4.97232e-7 : 3.42537e-7; - pParam->BSIM4v7Bechvb = (model->BSIM4v7type == NMOS) ? 7.45669e11 : 1.16645e12; - pParam->BSIM4v7AechvbEdgeS = pParam->BSIM4v7Aechvb * pParam->BSIM4v7weff - * model->BSIM4v7dlcig * pParam->BSIM4v7ToxRatioEdge; - pParam->BSIM4v7AechvbEdgeD = pParam->BSIM4v7Aechvb * pParam->BSIM4v7weff - * model->BSIM4v7dlcigd * pParam->BSIM4v7ToxRatioEdge; - pParam->BSIM4v7BechvbEdge = -pParam->BSIM4v7Bechvb - * toxe * pParam->BSIM4v7poxedge; - pParam->BSIM4v7Aechvb *= pParam->BSIM4v7weff * pParam->BSIM4v7leff - * pParam->BSIM4v7ToxRatio; - pParam->BSIM4v7Bechvb *= -toxe; - - - pParam->BSIM4v7mstar = 0.5 + atan(pParam->BSIM4v7minv) / PI; - pParam->BSIM4v7mstarcv = 0.5 + atan(pParam->BSIM4v7minvcv) / PI; - pParam->BSIM4v7voffcbn = pParam->BSIM4v7voff + model->BSIM4v7voffl / pParam->BSIM4v7leff; - pParam->BSIM4v7voffcbncv = pParam->BSIM4v7voffcv + model->BSIM4v7voffcvl / pParam->BSIM4v7leff; - - pParam->BSIM4v7ldeb = sqrt(epssub * Vtm0 / (Charge_q - * pParam->BSIM4v7ndep * 1.0e6)) / 3.0; - pParam->BSIM4v7acde *= pow((pParam->BSIM4v7ndep / 2.0e16), -0.25); - - - if (model->BSIM4v7k1Given || model->BSIM4v7k2Given) - { if (!model->BSIM4v7k1Given) - { - if ((!ckt->CKTcurJob) || (ckt->CKTcurJob->JOBtype < 9)) /* don't print in sensitivity */ - fprintf(stdout, "Warning: k1 should be specified with k2.\n"); - pParam->BSIM4v7k1 = 0.53; - } - if (!model->BSIM4v7k2Given) - { - if ((!ckt->CKTcurJob) || (ckt->CKTcurJob->JOBtype < 9)) /* don't print in sensitivity */ - fprintf(stdout, "Warning: k2 should be specified with k1.\n"); - pParam->BSIM4v7k2 = -0.0186; - } - if ((!ckt->CKTcurJob) || (ckt->CKTcurJob->JOBtype < 9)) { /* don't print in sensitivity */ - if (model->BSIM4v7nsubGiven) - fprintf(stdout, "Warning: nsub is ignored because k1 or k2 is given.\n"); - if (model->BSIM4v7xtGiven) - fprintf(stdout, "Warning: xt is ignored because k1 or k2 is given.\n"); - if (model->BSIM4v7vbxGiven) - fprintf(stdout, "Warning: vbx is ignored because k1 or k2 is given.\n"); - if (model->BSIM4v7gamma1Given) - fprintf(stdout, "Warning: gamma1 is ignored because k1 or k2 is given.\n"); - if (model->BSIM4v7gamma2Given) - fprintf(stdout, "Warning: gamma2 is ignored because k1 or k2 is given.\n"); - } - } - else - { if (!model->BSIM4v7vbxGiven) - pParam->BSIM4v7vbx = pParam->BSIM4v7phi - 7.7348e-4 - * pParam->BSIM4v7ndep - * pParam->BSIM4v7xt * pParam->BSIM4v7xt; - if (pParam->BSIM4v7vbx > 0.0) - pParam->BSIM4v7vbx = -pParam->BSIM4v7vbx; - if (pParam->BSIM4v7vbm > 0.0) - pParam->BSIM4v7vbm = -pParam->BSIM4v7vbm; - - if (!model->BSIM4v7gamma1Given) - pParam->BSIM4v7gamma1 = 5.753e-12 - * sqrt(pParam->BSIM4v7ndep) - / model->BSIM4v7coxe; - if (!model->BSIM4v7gamma2Given) - pParam->BSIM4v7gamma2 = 5.753e-12 - * sqrt(pParam->BSIM4v7nsub) - / model->BSIM4v7coxe; - - T0 = pParam->BSIM4v7gamma1 - pParam->BSIM4v7gamma2; - T1 = sqrt(pParam->BSIM4v7phi - pParam->BSIM4v7vbx) - - pParam->BSIM4v7sqrtPhi; - T2 = sqrt(pParam->BSIM4v7phi * (pParam->BSIM4v7phi - - pParam->BSIM4v7vbm)) - pParam->BSIM4v7phi; - pParam->BSIM4v7k2 = T0 * T1 / (2.0 * T2 + pParam->BSIM4v7vbm); - pParam->BSIM4v7k1 = pParam->BSIM4v7gamma2 - 2.0 - * pParam->BSIM4v7k2 * sqrt(pParam->BSIM4v7phi - - pParam->BSIM4v7vbm); - } - - if (!model->BSIM4v7vfbGiven) - { - if (model->BSIM4v7vth0Given) - { pParam->BSIM4v7vfb = model->BSIM4v7type * pParam->BSIM4v7vth0 - - pParam->BSIM4v7phi - pParam->BSIM4v7k1 - * pParam->BSIM4v7sqrtPhi; - } - else - { - if ((model->BSIM4v7mtrlMod) && (model->BSIM4v7phigGiven) && - (model->BSIM4v7nsubGiven)) - { - T0 = Vtm0 * log(pParam->BSIM4v7nsub/ni); - T1 = 0.5 * Eg0; - if(T0 > T1) - T0 = T1; - T2 = model->BSIM4v7easub + T1 + model->BSIM4v7type * T0; - pParam->BSIM4v7vfb = model->BSIM4v7phig - T2; - } - else - { - pParam->BSIM4v7vfb = -1.0; - } - } - } - if (!model->BSIM4v7vth0Given) - { pParam->BSIM4v7vth0 = model->BSIM4v7type * (pParam->BSIM4v7vfb - + pParam->BSIM4v7phi + pParam->BSIM4v7k1 - * pParam->BSIM4v7sqrtPhi); - } - - pParam->BSIM4v7k1ox = pParam->BSIM4v7k1 * toxe - / model->BSIM4v7toxm; - - tmp = sqrt(epssub / (epsrox * EPS0) * toxe * pParam->BSIM4v7Xdep0); - T0 = pParam->BSIM4v7dsub * pParam->BSIM4v7leff / tmp; - if (T0 < EXP_THRESHOLD) - { T1 = exp(T0); - T2 = T1 - 1.0; - T3 = T2 * T2; - T4 = T3 + 2.0 * T1 * MIN_EXP; - pParam->BSIM4v7theta0vb0 = T1 / T4; - } - else - pParam->BSIM4v7theta0vb0 = 1.0 / (MAX_EXP - 2.0); - - T0 = pParam->BSIM4v7drout * pParam->BSIM4v7leff / tmp; - if (T0 < EXP_THRESHOLD) - { T1 = exp(T0); - T2 = T1 - 1.0; - T3 = T2 * T2; - T4 = T3 + 2.0 * T1 * MIN_EXP; - T5 = T1 / T4; - } - else - T5 = 1.0 / (MAX_EXP - 2.0); /* 3.0 * MIN_EXP omitted */ - pParam->BSIM4v7thetaRout = pParam->BSIM4v7pdibl1 * T5 - + pParam->BSIM4v7pdibl2; - - tmp = sqrt(pParam->BSIM4v7Xdep0); - tmp1 = pParam->BSIM4v7vbi - pParam->BSIM4v7phi; - tmp2 = model->BSIM4v7factor1 * tmp; - - T0 = pParam->BSIM4v7dvt1w * pParam->BSIM4v7weff - * pParam->BSIM4v7leff / tmp2; - if (T0 < EXP_THRESHOLD) - { T1 = exp(T0); - T2 = T1 - 1.0; - T3 = T2 * T2; - T4 = T3 + 2.0 * T1 * MIN_EXP; - T8 = T1 / T4; - } - else - T8 = 1.0 / (MAX_EXP - 2.0); - T0 = pParam->BSIM4v7dvt0w * T8; - T8 = T0 * tmp1; - - T0 = pParam->BSIM4v7dvt1 * pParam->BSIM4v7leff / tmp2; - if (T0 < EXP_THRESHOLD) - { T1 = exp(T0); - T2 = T1 - 1.0; - T3 = T2 * T2; - T4 = T3 + 2.0 * T1 * MIN_EXP; - T9 = T1 / T4; - } - else - T9 = 1.0 / (MAX_EXP - 2.0); - T9 = pParam->BSIM4v7dvt0 * T9 * tmp1; - - T4 = toxe * pParam->BSIM4v7phi - / (pParam->BSIM4v7weff + pParam->BSIM4v7w0); - - T0 = sqrt(1.0 + pParam->BSIM4v7lpe0 / pParam->BSIM4v7leff); - if((model->BSIM4v7tempMod == 1) || (model->BSIM4v7tempMod == 0)) - T3 = (pParam->BSIM4v7kt1 + pParam->BSIM4v7kt1l / pParam->BSIM4v7leff) - * (TRatio - 1.0); - if((model->BSIM4v7tempMod == 2)||(model->BSIM4v7tempMod == 3)) - T3 = - pParam->BSIM4v7kt1 * (TRatio - 1.0); - - T5 = pParam->BSIM4v7k1ox * (T0 - 1.0) * pParam->BSIM4v7sqrtPhi - + T3; - pParam->BSIM4v7vfbzbfactor = - T8 - T9 + pParam->BSIM4v7k3 * T4 + T5 - - pParam->BSIM4v7phi - pParam->BSIM4v7k1 * pParam->BSIM4v7sqrtPhi; - - /* stress effect */ - - wlod = model->BSIM4v7wlod; - if (model->BSIM4v7wlod < 0.0) - { fprintf(stderr, "Warning: WLOD = %g is less than 0. 0.0 is used\n",model->BSIM4v7wlod); - wlod = 0.0; - } - T0 = pow(Lnew, model->BSIM4v7llodku0); - W_tmp = Wnew + wlod; - T1 = pow(W_tmp, model->BSIM4v7wlodku0); - tmp1 = model->BSIM4v7lku0 / T0 + model->BSIM4v7wku0 / T1 - + model->BSIM4v7pku0 / (T0 * T1); - pParam->BSIM4v7ku0 = 1.0 + tmp1; - - T0 = pow(Lnew, model->BSIM4v7llodvth); - T1 = pow(W_tmp, model->BSIM4v7wlodvth); - tmp1 = model->BSIM4v7lkvth0 / T0 + model->BSIM4v7wkvth0 / T1 - + model->BSIM4v7pkvth0 / (T0 * T1); - pParam->BSIM4v7kvth0 = 1.0 + tmp1; - pParam->BSIM4v7kvth0 = sqrt(pParam->BSIM4v7kvth0*pParam->BSIM4v7kvth0 + DELTA); - - T0 = (TRatio - 1.0); - pParam->BSIM4v7ku0temp = pParam->BSIM4v7ku0 * (1.0 + model->BSIM4v7tku0 *T0) + DELTA; - - Inv_saref = 1.0/(model->BSIM4v7saref + 0.5*Ldrn); - Inv_sbref = 1.0/(model->BSIM4v7sbref + 0.5*Ldrn); - pParam->BSIM4v7inv_od_ref = Inv_saref + Inv_sbref; - pParam->BSIM4v7rho_ref = model->BSIM4v7ku0 / pParam->BSIM4v7ku0temp * pParam->BSIM4v7inv_od_ref; - - } /* End of SizeNotFound */ - - /* stress effect */ - if( (here->BSIM4v7sa > 0.0) && (here->BSIM4v7sb > 0.0) && - ((here->BSIM4v7nf == 1.0) || ((here->BSIM4v7nf > 1.0) && (here->BSIM4v7sd > 0.0))) ) - { Inv_sa = 0; - Inv_sb = 0; - - kvsat = model->BSIM4v7kvsat; - if (model->BSIM4v7kvsat < -1.0 ) - { fprintf(stderr, "Warning: KVSAT = %g is too small; -1.0 is used.\n",model->BSIM4v7kvsat); - kvsat = -1.0; - } - if (model->BSIM4v7kvsat > 1.0) - { fprintf(stderr, "Warning: KVSAT = %g is too big; 1.0 is used.\n",model->BSIM4v7kvsat); - kvsat = 1.0; - } - - for(i = 0; i < here->BSIM4v7nf; i++){ - T0 = 1.0 / here->BSIM4v7nf / (here->BSIM4v7sa + 0.5*Ldrn + i * (here->BSIM4v7sd +Ldrn)); - T1 = 1.0 / here->BSIM4v7nf / (here->BSIM4v7sb + 0.5*Ldrn + i * (here->BSIM4v7sd +Ldrn)); - Inv_sa += T0; - Inv_sb += T1; - } - Inv_ODeff = Inv_sa + Inv_sb; - rho = model->BSIM4v7ku0 / pParam->BSIM4v7ku0temp * Inv_ODeff; - T0 = (1.0 + rho)/(1.0 + pParam->BSIM4v7rho_ref); - here->BSIM4v7u0temp = pParam->BSIM4v7u0temp * T0; - - T1 = (1.0 + kvsat * rho)/(1.0 + kvsat * pParam->BSIM4v7rho_ref); - here->BSIM4v7vsattemp = pParam->BSIM4v7vsattemp * T1; - - OD_offset = Inv_ODeff - pParam->BSIM4v7inv_od_ref; - dvth0_lod = model->BSIM4v7kvth0 / pParam->BSIM4v7kvth0 * OD_offset; - dk2_lod = model->BSIM4v7stk2 / pow(pParam->BSIM4v7kvth0, model->BSIM4v7lodk2) * - OD_offset; - deta0_lod = model->BSIM4v7steta0 / pow(pParam->BSIM4v7kvth0, model->BSIM4v7lodeta0) * - OD_offset; - here->BSIM4v7vth0 = pParam->BSIM4v7vth0 + dvth0_lod; - - here->BSIM4v7eta0 = pParam->BSIM4v7eta0 + deta0_lod; - here->BSIM4v7k2 = pParam->BSIM4v7k2 + dk2_lod; - } else { - here->BSIM4v7u0temp = pParam->BSIM4v7u0temp; - here->BSIM4v7vth0 = pParam->BSIM4v7vth0; - here->BSIM4v7vsattemp = pParam->BSIM4v7vsattemp; - here->BSIM4v7eta0 = pParam->BSIM4v7eta0; - here->BSIM4v7k2 = pParam->BSIM4v7k2; - } - - /* Well Proximity Effect */ - if (model->BSIM4v7wpemod) - { if( (!here->BSIM4v7scaGiven) && (!here->BSIM4v7scbGiven) && (!here->BSIM4v7sccGiven) ) - { if((here->BSIM4v7scGiven) && (here->BSIM4v7sc > 0.0) ) - { T1 = here->BSIM4v7sc + Wdrn; - T2 = 1.0 / model->BSIM4v7scref; - here->BSIM4v7sca = model->BSIM4v7scref * model->BSIM4v7scref - / (here->BSIM4v7sc * T1); - here->BSIM4v7scb = ( (0.1 * here->BSIM4v7sc + 0.01 * model->BSIM4v7scref) - * exp(-10.0 * here->BSIM4v7sc * T2) - - (0.1 * T1 + 0.01 * model->BSIM4v7scref) - * exp(-10.0 * T1 * T2) ) / Wdrn; - here->BSIM4v7scc = ( (0.05 * here->BSIM4v7sc + 0.0025 * model->BSIM4v7scref) - * exp(-20.0 * here->BSIM4v7sc * T2) - - (0.05 * T1 + 0.0025 * model->BSIM4v7scref) - * exp(-20.0 * T1 * T2) ) / Wdrn; - } else { - fprintf(stderr, "Warning: No WPE as none of SCA, SCB, SCC, SC is given and/or SC not positive.\n"); - } - } - - if (here->BSIM4v7sca < 0.0) - { - printf("Warning: SCA = %g is negative. Set to 0.0.\n", here->BSIM4v7sca); - here->BSIM4v7sca = 0.0; - } - if (here->BSIM4v7scb < 0.0) - { - printf("Warning: SCB = %g is negative. Set to 0.0.\n", here->BSIM4v7scb); - here->BSIM4v7scb = 0.0; - } - if (here->BSIM4v7scc < 0.0) - { - printf("Warning: SCC = %g is negative. Set to 0.0.\n", here->BSIM4v7scc); - here->BSIM4v7scc = 0.0; - } - if (here->BSIM4v7sc < 0.0) - { - printf("Warning: SC = %g is negative. Set to 0.0.\n", here->BSIM4v7sc); - here->BSIM4v7sc = 0.0; - } - /*4.6.2*/ - sceff = here->BSIM4v7sca + model->BSIM4v7web * here->BSIM4v7scb - + model->BSIM4v7wec * here->BSIM4v7scc; - here->BSIM4v7vth0 += pParam->BSIM4v7kvth0we * sceff; - here->BSIM4v7k2 += pParam->BSIM4v7k2we * sceff; - T3 = 1.0 + pParam->BSIM4v7ku0we * sceff; - if (T3 <= 0.0) - { T3 = 0.0; - fprintf(stderr, "Warning: ku0we = %g is negatively too high. Negative mobility! \n", pParam->BSIM4v7ku0we); - } - here->BSIM4v7u0temp *= T3; - } - - /* adding delvto */ - here->BSIM4v7vth0 += here->BSIM4v7delvto; - here->BSIM4v7vfb = pParam->BSIM4v7vfb + model->BSIM4v7type * here->BSIM4v7delvto; - - /* low field mobility multiplier */ - here->BSIM4v7u0temp = pParam->BSIM4v7u0temp * here->BSIM4v7mulu0; - - /* Instance variables calculation */ - T3 = model->BSIM4v7type * here->BSIM4v7vth0 - - here->BSIM4v7vfb - pParam->BSIM4v7phi; - T4 = T3 + T3; - T5 = 2.5 * T3; - here->BSIM4v7vtfbphi1 = (model->BSIM4v7type == NMOS) ? T4 : T5; - if (here->BSIM4v7vtfbphi1 < 0.0) - here->BSIM4v7vtfbphi1 = 0.0; - - here->BSIM4v7vtfbphi2 = 4.0 * T3; - if (here->BSIM4v7vtfbphi2 < 0.0) - here->BSIM4v7vtfbphi2 = 0.0; - - if (here->BSIM4v7k2 < 0.0) - { T0 = 0.5 * pParam->BSIM4v7k1 / here->BSIM4v7k2; - here->BSIM4v7vbsc = 0.9 * (pParam->BSIM4v7phi - T0 * T0); - if (here->BSIM4v7vbsc > -3.0) - here->BSIM4v7vbsc = -3.0; - else if (here->BSIM4v7vbsc < -30.0) - here->BSIM4v7vbsc = -30.0; - } - else - here->BSIM4v7vbsc = -30.0; - if (here->BSIM4v7vbsc > pParam->BSIM4v7vbm) - here->BSIM4v7vbsc = pParam->BSIM4v7vbm; - here->BSIM4v7k2ox = here->BSIM4v7k2 * toxe - / model->BSIM4v7toxm; - - here->BSIM4v7vfbzb = pParam->BSIM4v7vfbzbfactor - + model->BSIM4v7type * here->BSIM4v7vth0 ; - - here->BSIM4v7cgso = pParam->BSIM4v7cgso; - here->BSIM4v7cgdo = pParam->BSIM4v7cgdo; - - lnl = log(pParam->BSIM4v7leff * 1.0e6); - lnw = log(pParam->BSIM4v7weff * 1.0e6); - lnnf = log(here->BSIM4v7nf); - - bodymode = 5; - if( ( !model->BSIM4v7rbps0Given) || - ( !model->BSIM4v7rbpd0Given) ) - bodymode = 1; - else - if( (!model->BSIM4v7rbsbx0Given && !model->BSIM4v7rbsby0Given) || - (!model->BSIM4v7rbdbx0Given && !model->BSIM4v7rbdby0Given) ) - bodymode = 3; - - if(here->BSIM4v7rbodyMod == 2) - { - if (bodymode == 5) - { - rbsbx = exp( log(model->BSIM4v7rbsbx0) + model->BSIM4v7rbsdbxl * lnl + - model->BSIM4v7rbsdbxw * lnw + model->BSIM4v7rbsdbxnf * lnnf ); - rbsby = exp( log(model->BSIM4v7rbsby0) + model->BSIM4v7rbsdbyl * lnl + - model->BSIM4v7rbsdbyw * lnw + model->BSIM4v7rbsdbynf * lnnf ); - here->BSIM4v7rbsb = rbsbx * rbsby / (rbsbx + rbsby); - - - rbdbx = exp( log(model->BSIM4v7rbdbx0) + model->BSIM4v7rbsdbxl * lnl + - model->BSIM4v7rbsdbxw * lnw + model->BSIM4v7rbsdbxnf * lnnf ); - rbdby = exp( log(model->BSIM4v7rbdby0) + model->BSIM4v7rbsdbyl * lnl + - model->BSIM4v7rbsdbyw * lnw + model->BSIM4v7rbsdbynf * lnnf ); - here->BSIM4v7rbdb = rbdbx * rbdby / (rbdbx + rbdby); - } - - if ((bodymode == 3)|| (bodymode == 5)) - { - here->BSIM4v7rbps = exp( log(model->BSIM4v7rbps0) + model->BSIM4v7rbpsl * lnl + - model->BSIM4v7rbpsw * lnw + model->BSIM4v7rbpsnf * lnnf ); - here->BSIM4v7rbpd = exp( log(model->BSIM4v7rbpd0) + model->BSIM4v7rbpdl * lnl + - model->BSIM4v7rbpdw * lnw + model->BSIM4v7rbpdnf * lnnf ); - } - - rbpbx = exp( log(model->BSIM4v7rbpbx0) + model->BSIM4v7rbpbxl * lnl + - model->BSIM4v7rbpbxw * lnw + model->BSIM4v7rbpbxnf * lnnf ); - rbpby = exp( log(model->BSIM4v7rbpby0) + model->BSIM4v7rbpbyl * lnl + - model->BSIM4v7rbpbyw * lnw + model->BSIM4v7rbpbynf * lnnf ); - here->BSIM4v7rbpb = rbpbx*rbpby/(rbpbx + rbpby); - } - - - if ((here->BSIM4v7rbodyMod == 1 ) || ((here->BSIM4v7rbodyMod == 2 ) && (bodymode == 5)) ) - { if (here->BSIM4v7rbdb < 1.0e-3) - here->BSIM4v7grbdb = 1.0e3; /* in mho */ - else - here->BSIM4v7grbdb = model->BSIM4v7gbmin + 1.0 / here->BSIM4v7rbdb; - if (here->BSIM4v7rbpb < 1.0e-3) - here->BSIM4v7grbpb = 1.0e3; - else - here->BSIM4v7grbpb = model->BSIM4v7gbmin + 1.0 / here->BSIM4v7rbpb; - if (here->BSIM4v7rbps < 1.0e-3) - here->BSIM4v7grbps = 1.0e3; - else - here->BSIM4v7grbps = model->BSIM4v7gbmin + 1.0 / here->BSIM4v7rbps; - if (here->BSIM4v7rbsb < 1.0e-3) - here->BSIM4v7grbsb = 1.0e3; - else - here->BSIM4v7grbsb = model->BSIM4v7gbmin + 1.0 / here->BSIM4v7rbsb; - if (here->BSIM4v7rbpd < 1.0e-3) - here->BSIM4v7grbpd = 1.0e3; - else - here->BSIM4v7grbpd = model->BSIM4v7gbmin + 1.0 / here->BSIM4v7rbpd; - - } - - if((here->BSIM4v7rbodyMod == 2) && (bodymode == 3)) - { - here->BSIM4v7grbdb = here->BSIM4v7grbsb = model->BSIM4v7gbmin; - if (here->BSIM4v7rbpb < 1.0e-3) - here->BSIM4v7grbpb = 1.0e3; - else - here->BSIM4v7grbpb = model->BSIM4v7gbmin + 1.0 / here->BSIM4v7rbpb; - if (here->BSIM4v7rbps < 1.0e-3) - here->BSIM4v7grbps = 1.0e3; - else - here->BSIM4v7grbps = model->BSIM4v7gbmin + 1.0 / here->BSIM4v7rbps; - if (here->BSIM4v7rbpd < 1.0e-3) - here->BSIM4v7grbpd = 1.0e3; - else - here->BSIM4v7grbpd = model->BSIM4v7gbmin + 1.0 / here->BSIM4v7rbpd; - } - - if((here->BSIM4v7rbodyMod == 2) && (bodymode == 1)) - { - here->BSIM4v7grbdb = here->BSIM4v7grbsb = model->BSIM4v7gbmin; - here->BSIM4v7grbps = here->BSIM4v7grbpd = 1.0e3; - if (here->BSIM4v7rbpb < 1.0e-3) - here->BSIM4v7grbpb = 1.0e3; - else - here->BSIM4v7grbpb = model->BSIM4v7gbmin + 1.0 / here->BSIM4v7rbpb; - } - - - /* - * Process geomertry dependent parasitics - */ - - here->BSIM4v7grgeltd = model->BSIM4v7rshg * (here->BSIM4v7xgw - + pParam->BSIM4v7weffCJ / 3.0 / here->BSIM4v7ngcon) / - (here->BSIM4v7ngcon * here->BSIM4v7nf * - (Lnew - model->BSIM4v7xgl)); - if (here->BSIM4v7grgeltd > 0.0) - here->BSIM4v7grgeltd = 1.0 / here->BSIM4v7grgeltd; - else - { here->BSIM4v7grgeltd = 1.0e3; /* mho */ - if (here->BSIM4v7rgateMod != 0) - printf("Warning: The gate conductance reset to 1.0e3 mho.\n"); - } - - DMCGeff = model->BSIM4v7dmcg - model->BSIM4v7dmcgt; - DMCIeff = model->BSIM4v7dmci; - DMDGeff = model->BSIM4v7dmdg - model->BSIM4v7dmcgt; - -/* if (here->BSIM4v7sourcePerimeterGiven) - { if (model->BSIM4v7perMod == 0) - here->BSIM4v7Pseff = here->BSIM4v7sourcePerimeter; - else - here->BSIM4v7Pseff = here->BSIM4v7sourcePerimeter - - pParam->BSIM4v7weffCJ * here->BSIM4v7nf; - } - else - BSIM4v7PAeffGeo(here->BSIM4v7nf, here->BSIM4v7geoMod, here->BSIM4v7min, - pParam->BSIM4v7weffCJ, DMCGeff, DMCIeff, DMDGeff, - &(here->BSIM4v7Pseff), &dumPd, &dumAs, &dumAd); - if (here->BSIM4v7Pseff < 0.0) /4.6.2/ - here->BSIM4v7Pseff = 0.0; */ - - /* New Diode Model v4.7*/ - if (here->BSIM4v7sourcePerimeterGiven) - { /* given */ - if (here->BSIM4v7sourcePerimeter == 0.0) - here->BSIM4v7Pseff = 0.0; - else if (here->BSIM4v7sourcePerimeter < 0.0) - { - printf("Warning: Source Perimeter is specified as negative, it is set to zero.\n"); - here->BSIM4v7Pseff = 0.0; - } else - { - if (model->BSIM4v7perMod == 0) - here->BSIM4v7Pseff = here->BSIM4v7sourcePerimeter; - else - here->BSIM4v7Pseff = here->BSIM4v7sourcePerimeter - - pParam->BSIM4v7weffCJ * here->BSIM4v7nf; - } - } else /* not given */ - BSIM4v7PAeffGeo(here->BSIM4v7nf, here->BSIM4v7geoMod, here->BSIM4v7min, - pParam->BSIM4v7weffCJ, DMCGeff, DMCIeff, DMDGeff, - &(here->BSIM4v7Pseff), &dumPd, &dumAs, &dumAd); - - if (here->BSIM4v7Pseff < 0.0){ /* v4.7 final check */ - here->BSIM4v7Pseff = 0.0; - printf("Warning: Pseff is negative, it is set to zero.\n"); - } - /* if (here->BSIM4v7drainPerimeterGiven) - { if (model->BSIM4v7perMod == 0) - here->BSIM4v7Pdeff = here->BSIM4v7drainPerimeter; - else - here->BSIM4v7Pdeff = here->BSIM4v7drainPerimeter - - pParam->BSIM4v7weffCJ * here->BSIM4v7nf; - } - else - BSIM4v7PAeffGeo(here->BSIM4v7nf, here->BSIM4v7geoMod, here->BSIM4v7min, - pParam->BSIM4v7weffCJ, DMCGeff, DMCIeff, DMDGeff, - &dumPs, &(here->BSIM4v7Pdeff), &dumAs, &dumAd); - if (here->BSIM4v7Pdeff < 0.0) /4.6.2/ - here->BSIM4v7Pdeff = 0.0; */ - - if (here->BSIM4v7drainPerimeterGiven) - { /* given */ - if (here->BSIM4v7drainPerimeter == 0.0) - here->BSIM4v7Pdeff = 0.0; - else if (here->BSIM4v7drainPerimeter < 0.0) - { - printf("Warning: Drain Perimeter is specified as negative, it is set to zero.\n"); - here->BSIM4v7Pdeff = 0.0; - } else - { - if (model->BSIM4v7perMod == 0) - here->BSIM4v7Pdeff = here->BSIM4v7drainPerimeter; - else - here->BSIM4v7Pdeff = here->BSIM4v7drainPerimeter - - pParam->BSIM4v7weffCJ * here->BSIM4v7nf; - } - } else /* not given */ - BSIM4v7PAeffGeo(here->BSIM4v7nf, here->BSIM4v7geoMod, here->BSIM4v7min, - pParam->BSIM4v7weffCJ, DMCGeff, DMCIeff, DMDGeff, - &dumPs, &(here->BSIM4v7Pdeff), &dumAs, &dumAd); - - if (here->BSIM4v7Pdeff < 0.0){ - here->BSIM4v7Pdeff = 0.0; /*New Diode v4.7*/ - printf("Warning: Pdeff is negative, it is set to zero.\n"); - } - if (here->BSIM4v7sourceAreaGiven) - here->BSIM4v7Aseff = here->BSIM4v7sourceArea; - else - BSIM4v7PAeffGeo(here->BSIM4v7nf, here->BSIM4v7geoMod, here->BSIM4v7min, - pParam->BSIM4v7weffCJ, DMCGeff, DMCIeff, DMDGeff, - &dumPs, &dumPd, &(here->BSIM4v7Aseff), &dumAd); - if (here->BSIM4v7Aseff < 0.0){ - here->BSIM4v7Aseff = 0.0; /* v4.7 */ - printf("Warning: Aseff is negative, it is set to zero.\n"); - } - if (here->BSIM4v7drainAreaGiven) - here->BSIM4v7Adeff = here->BSIM4v7drainArea; - else - BSIM4v7PAeffGeo(here->BSIM4v7nf, here->BSIM4v7geoMod, here->BSIM4v7min, - pParam->BSIM4v7weffCJ, DMCGeff, DMCIeff, DMDGeff, - &dumPs, &dumPd, &dumAs, &(here->BSIM4v7Adeff)); - if (here->BSIM4v7Adeff < 0.0){ - here->BSIM4v7Adeff = 0.0; /* v4.7 */ - printf("Warning: Adeff is negative, it is set to zero.\n"); - } - /* Processing S/D resistance and conductance below */ - if(here->BSIM4v7sNodePrime != here->BSIM4v7sNode) - { - here->BSIM4v7sourceConductance = 0.0; - if(here->BSIM4v7sourceSquaresGiven) - { - here->BSIM4v7sourceConductance = model->BSIM4v7sheetResistance - * here->BSIM4v7sourceSquares; - } else if (here->BSIM4v7rgeoMod > 0) - { - BSIM4v7RdseffGeo(here->BSIM4v7nf, here->BSIM4v7geoMod, - here->BSIM4v7rgeoMod, here->BSIM4v7min, - pParam->BSIM4v7weffCJ, model->BSIM4v7sheetResistance, - DMCGeff, DMCIeff, DMDGeff, 1, &(here->BSIM4v7sourceConductance)); - } else - { - here->BSIM4v7sourceConductance = 0.0; - } - - if (here->BSIM4v7sourceConductance > 0.0) - here->BSIM4v7sourceConductance = 1.0 - / here->BSIM4v7sourceConductance; - else - { - here->BSIM4v7sourceConductance = 1.0e3; /* mho */ - printf ("Warning: Source conductance reset to 1.0e3 mho.\n"); - } - } else - { - here->BSIM4v7sourceConductance = 0.0; - } - - if(here->BSIM4v7dNodePrime != here->BSIM4v7dNode) - { - here->BSIM4v7drainConductance = 0.0; - if(here->BSIM4v7drainSquaresGiven) - { - here->BSIM4v7drainConductance = model->BSIM4v7sheetResistance - * here->BSIM4v7drainSquares; - } else if (here->BSIM4v7rgeoMod > 0) - { - BSIM4v7RdseffGeo(here->BSIM4v7nf, here->BSIM4v7geoMod, - here->BSIM4v7rgeoMod, here->BSIM4v7min, - pParam->BSIM4v7weffCJ, model->BSIM4v7sheetResistance, - DMCGeff, DMCIeff, DMDGeff, 0, &(here->BSIM4v7drainConductance)); - } else - { - here->BSIM4v7drainConductance = 0.0; - } - - if (here->BSIM4v7drainConductance > 0.0) - here->BSIM4v7drainConductance = 1.0 - / here->BSIM4v7drainConductance; - else - { - here->BSIM4v7drainConductance = 1.0e3; /* mho */ - printf ("Warning: Drain conductance reset to 1.0e3 mho.\n"); - } - } else - { - here->BSIM4v7drainConductance = 0.0; - } - - /* End of Rsd processing */ - - - Nvtms = model->BSIM4v7vtm * model->BSIM4v7SjctEmissionCoeff; - if ((here->BSIM4v7Aseff <= 0.0) && (here->BSIM4v7Pseff <= 0.0)) - { SourceSatCurrent = 0.0; /* v4.7 */ - /* SourceSatCurrent = 1.0e-14; */ - } - else - { SourceSatCurrent = here->BSIM4v7Aseff * model->BSIM4v7SjctTempSatCurDensity - + here->BSIM4v7Pseff * model->BSIM4v7SjctSidewallTempSatCurDensity - + pParam->BSIM4v7weffCJ * here->BSIM4v7nf - * model->BSIM4v7SjctGateSidewallTempSatCurDensity; - } - if (SourceSatCurrent > 0.0) - { switch(model->BSIM4v7dioMod) - { case 0: - if ((model->BSIM4v7bvs / Nvtms) > EXP_THRESHOLD) - here->BSIM4v7XExpBVS = model->BSIM4v7xjbvs * MIN_EXP; - else - here->BSIM4v7XExpBVS = model->BSIM4v7xjbvs * exp(-model->BSIM4v7bvs / Nvtms); - break; - case 1: - BSIM4v7DioIjthVjmEval(Nvtms, model->BSIM4v7ijthsfwd, SourceSatCurrent, - 0.0, &(here->BSIM4v7vjsmFwd)); - here->BSIM4v7IVjsmFwd = SourceSatCurrent * exp(here->BSIM4v7vjsmFwd / Nvtms); - break; - case 2: - if ((model->BSIM4v7bvs / Nvtms) > EXP_THRESHOLD) - { here->BSIM4v7XExpBVS = model->BSIM4v7xjbvs * MIN_EXP; - tmp = MIN_EXP; - } - else - { here->BSIM4v7XExpBVS = exp(-model->BSIM4v7bvs / Nvtms); - tmp = here->BSIM4v7XExpBVS; - here->BSIM4v7XExpBVS *= model->BSIM4v7xjbvs; - } - - BSIM4v7DioIjthVjmEval(Nvtms, model->BSIM4v7ijthsfwd, SourceSatCurrent, - here->BSIM4v7XExpBVS, &(here->BSIM4v7vjsmFwd)); - T0 = exp(here->BSIM4v7vjsmFwd / Nvtms); - here->BSIM4v7IVjsmFwd = SourceSatCurrent * (T0 - here->BSIM4v7XExpBVS / T0 - + here->BSIM4v7XExpBVS - 1.0); - here->BSIM4v7SslpFwd = SourceSatCurrent - * (T0 + here->BSIM4v7XExpBVS / T0) / Nvtms; - - T2 = model->BSIM4v7ijthsrev / SourceSatCurrent; - if (T2 < 1.0) - { T2 = 10.0; - fprintf(stderr, "Warning: ijthsrev too small and set to 10 times IsbSat.\n"); - } - here->BSIM4v7vjsmRev = -model->BSIM4v7bvs - - Nvtms * log((T2 - 1.0) / model->BSIM4v7xjbvs); - T1 = model->BSIM4v7xjbvs * exp(-(model->BSIM4v7bvs - + here->BSIM4v7vjsmRev) / Nvtms); - here->BSIM4v7IVjsmRev = SourceSatCurrent * (1.0 + T1); - here->BSIM4v7SslpRev = -SourceSatCurrent * T1 / Nvtms; - break; - default: - printf("Specified dioMod = %d not matched\n", model->BSIM4v7dioMod); - } - } - - Nvtmd = model->BSIM4v7vtm * model->BSIM4v7DjctEmissionCoeff; - if ((here->BSIM4v7Adeff <= 0.0) && (here->BSIM4v7Pdeff <= 0.0)) - { /* DrainSatCurrent = 1.0e-14; v4.7 */ - DrainSatCurrent = 0.0; - } - else - { DrainSatCurrent = here->BSIM4v7Adeff * model->BSIM4v7DjctTempSatCurDensity - + here->BSIM4v7Pdeff * model->BSIM4v7DjctSidewallTempSatCurDensity - + pParam->BSIM4v7weffCJ * here->BSIM4v7nf - * model->BSIM4v7DjctGateSidewallTempSatCurDensity; - } - if (DrainSatCurrent > 0.0) - { switch(model->BSIM4v7dioMod) - { case 0: - if ((model->BSIM4v7bvd / Nvtmd) > EXP_THRESHOLD) - here->BSIM4v7XExpBVD = model->BSIM4v7xjbvd * MIN_EXP; - else - here->BSIM4v7XExpBVD = model->BSIM4v7xjbvd * exp(-model->BSIM4v7bvd / Nvtmd); - break; - case 1: - BSIM4v7DioIjthVjmEval(Nvtmd, model->BSIM4v7ijthdfwd, DrainSatCurrent, - 0.0, &(here->BSIM4v7vjdmFwd)); - here->BSIM4v7IVjdmFwd = DrainSatCurrent * exp(here->BSIM4v7vjdmFwd / Nvtmd); - break; - case 2: - if ((model->BSIM4v7bvd / Nvtmd) > EXP_THRESHOLD) - { here->BSIM4v7XExpBVD = model->BSIM4v7xjbvd * MIN_EXP; - tmp = MIN_EXP; - } - else - { here->BSIM4v7XExpBVD = exp(-model->BSIM4v7bvd / Nvtmd); - tmp = here->BSIM4v7XExpBVD; - here->BSIM4v7XExpBVD *= model->BSIM4v7xjbvd; - } - - BSIM4v7DioIjthVjmEval(Nvtmd, model->BSIM4v7ijthdfwd, DrainSatCurrent, - here->BSIM4v7XExpBVD, &(here->BSIM4v7vjdmFwd)); - T0 = exp(here->BSIM4v7vjdmFwd / Nvtmd); - here->BSIM4v7IVjdmFwd = DrainSatCurrent * (T0 - here->BSIM4v7XExpBVD / T0 - + here->BSIM4v7XExpBVD - 1.0); - here->BSIM4v7DslpFwd = DrainSatCurrent - * (T0 + here->BSIM4v7XExpBVD / T0) / Nvtmd; - - T2 = model->BSIM4v7ijthdrev / DrainSatCurrent; - if (T2 < 1.0) - { T2 = 10.0; - fprintf(stderr, "Warning: ijthdrev too small and set to 10 times IdbSat.\n"); - } - here->BSIM4v7vjdmRev = -model->BSIM4v7bvd - - Nvtmd * log((T2 - 1.0) / model->BSIM4v7xjbvd); /* bugfix */ - T1 = model->BSIM4v7xjbvd * exp(-(model->BSIM4v7bvd - + here->BSIM4v7vjdmRev) / Nvtmd); - here->BSIM4v7IVjdmRev = DrainSatCurrent * (1.0 + T1); - here->BSIM4v7DslpRev = -DrainSatCurrent * T1 / Nvtmd; - break; - default: - printf("Specified dioMod = %d not matched\n", model->BSIM4v7dioMod); - } - } - - /* GEDL current reverse bias */ - T0 = (TRatio - 1.0); - model->BSIM4v7njtsstemp = model->BSIM4v7njts * (1.0 + model->BSIM4v7tnjts * T0); - model->BSIM4v7njtsswstemp = model->BSIM4v7njtssw * (1.0 + model->BSIM4v7tnjtssw * T0); - model->BSIM4v7njtsswgstemp = model->BSIM4v7njtsswg * (1.0 + model->BSIM4v7tnjtsswg * T0); - model->BSIM4v7njtsdtemp = model->BSIM4v7njtsd * (1.0 + model->BSIM4v7tnjtsd * T0); - model->BSIM4v7njtsswdtemp = model->BSIM4v7njtsswd * (1.0 + model->BSIM4v7tnjtsswd * T0); - model->BSIM4v7njtsswgdtemp = model->BSIM4v7njtsswgd * (1.0 + model->BSIM4v7tnjtsswgd * T0); - T7 = Eg0 / model->BSIM4v7vtm * T0; - T9 = model->BSIM4v7xtss * T7; - DEXP(T9, T1); - T9 = model->BSIM4v7xtsd * T7; - DEXP(T9, T2); - T9 = model->BSIM4v7xtssws * T7; - DEXP(T9, T3); - T9 = model->BSIM4v7xtsswd * T7; - DEXP(T9, T4); - T9 = model->BSIM4v7xtsswgs * T7; - DEXP(T9, T5); - T9 = model->BSIM4v7xtsswgd * T7; - DEXP(T9, T6); - /*IBM TAT*/ - if(model->BSIM4v7jtweff < 0.0) - { model->BSIM4v7jtweff = 0.0; - fprintf(stderr, "TAT width dependence effect is negative. Jtweff is clamped to zero.\n"); - } - T11 = sqrt(model->BSIM4v7jtweff / pParam->BSIM4v7weffCJ) + 1.0; - - T10 = pParam->BSIM4v7weffCJ * here->BSIM4v7nf; - here->BSIM4v7SjctTempRevSatCur = T1 * here->BSIM4v7Aseff * model->BSIM4v7jtss; - here->BSIM4v7DjctTempRevSatCur = T2 * here->BSIM4v7Adeff * model->BSIM4v7jtsd; - here->BSIM4v7SswTempRevSatCur = T3 * here->BSIM4v7Pseff * model->BSIM4v7jtssws; - here->BSIM4v7DswTempRevSatCur = T4 * here->BSIM4v7Pdeff * model->BSIM4v7jtsswd; - here->BSIM4v7SswgTempRevSatCur = T5 * T10 * T11 * model->BSIM4v7jtsswgs; - here->BSIM4v7DswgTempRevSatCur = T6 * T10 * T11 * model->BSIM4v7jtsswgd; - - /*high k*/ - /*Calculate VgsteffVth for mobMod=3*/ - if(model->BSIM4v7mobMod==3) - { /*Calculate n @ Vbs=Vds=0*/ - V0 = pParam->BSIM4v7vbi - pParam->BSIM4v7phi; - lt1 = model->BSIM4v7factor1* pParam->BSIM4v7sqrtXdep0; - ltw = lt1; - T0 = pParam->BSIM4v7dvt1 * pParam->BSIM4v7leff / lt1; - if (T0 < EXP_THRESHOLD) - { - T1 = exp(T0); - T2 = T1 - 1.0; - T3 = T2 * T2; - T4 = T3 + 2.0 * T1 * MIN_EXP; - Theta0 = T1 / T4; - } - else - Theta0 = 1.0 / (MAX_EXP - 2.0); - - tmp1 = epssub / pParam->BSIM4v7Xdep0; - here->BSIM4v7nstar = model->BSIM4v7vtm / Charge_q * - (model->BSIM4v7coxe + tmp1 + pParam->BSIM4v7cit); - tmp2 = pParam->BSIM4v7nfactor * tmp1; - tmp3 = (tmp2 + pParam->BSIM4v7cdsc * Theta0 + pParam->BSIM4v7cit) / model->BSIM4v7coxe; - if (tmp3 >= -0.5) - n0 = 1.0 + tmp3; - else - { - T0 = 1.0 / (3.0 + 8.0 * tmp3); - n0 = (1.0 + 3.0 * tmp3) * T0; - } - - T0 = n0 * model->BSIM4v7vtm; - T1 = pParam->BSIM4v7voffcbn; - T2 = T1/T0; - if (T2 < -EXP_THRESHOLD) - { T3 = model->BSIM4v7coxe * MIN_EXP / pParam->BSIM4v7cdep0; - T4 = pParam->BSIM4v7mstar + T3 * n0; - } - else if (T2 > EXP_THRESHOLD) - { T3 = model->BSIM4v7coxe * MAX_EXP / pParam->BSIM4v7cdep0; - T4 = pParam->BSIM4v7mstar + T3 * n0; - } - else - { T3 = exp(T2)* model->BSIM4v7coxe / pParam->BSIM4v7cdep0; - T4 = pParam->BSIM4v7mstar + T3 * n0; - } - pParam->BSIM4v7VgsteffVth = T0 * log(2.0)/T4; - - } - - /* New DITS term added in 4.7 */ - T0 = -pParam->BSIM4v7dvtp3 * log(pParam->BSIM4v7leff); - DEXP(T0, T1); - pParam->BSIM4v7dvtp2factor = pParam->BSIM4v7dvtp5 + pParam->BSIM4v7dvtp2 * T1; - - if(model->BSIM4v7mtrlMod != 0 && model->BSIM4v7mtrlCompatMod == 0) - { - /* Calculate TOXP from EOT */ - /* Calculate Vgs_eff @ Vgs = VDD with Poly Depletion Effect */ - Vtm0eot = KboQ * model->BSIM4v7tempeot; - Vtmeot = Vtm0eot; - vbieot = Vtm0eot * log(pParam->BSIM4v7nsd - * pParam->BSIM4v7ndep / (ni * ni)); - phieot = Vtm0eot * log(pParam->BSIM4v7ndep / ni) - + pParam->BSIM4v7phin + 0.4; - tmp2 = here->BSIM4v7vfb + phieot; - vddeot = model->BSIM4v7type * model->BSIM4v7vddeot; - T0 = model->BSIM4v7epsrgate * EPS0; - if ((pParam->BSIM4v7ngate > 1.0e18) && (pParam->BSIM4v7ngate < 1.0e25) - && (vddeot > tmp2) && (T0!=0)) - { - T1 = 1.0e6 * CHARGE * T0 * pParam->BSIM4v7ngate / - (model->BSIM4v7coxe * model->BSIM4v7coxe); - T8 = vddeot - tmp2; - T4 = sqrt(1.0 + 2.0 * T8 / T1); - T2 = 2.0 * T8 / (T4 + 1.0); - T3 = 0.5 * T2 * T2 / T1; - T7 = 1.12 - T3 - 0.05; - T6 = sqrt(T7 * T7 + 0.224); - T5 = 1.12 - 0.5 * (T7 + T6); - Vgs_eff = vddeot - T5; - } - else - Vgs_eff = vddeot; - - /* Calculate Vth @ Vds=Vbs=0 */ - - V0 = vbieot - phieot; - lt1 = model->BSIM4v7factor1* pParam->BSIM4v7sqrtXdep0; - ltw = lt1; - T0 = pParam->BSIM4v7dvt1 * model->BSIM4v7leffeot / lt1; - if (T0 < EXP_THRESHOLD) - { - T1 = exp(T0); - T2 = T1 - 1.0; - T3 = T2 * T2; - T4 = T3 + 2.0 * T1 * MIN_EXP; - Theta0 = T1 / T4; - } - else - Theta0 = 1.0 / (MAX_EXP - 2.0); - Delt_vth = pParam->BSIM4v7dvt0 * Theta0 * V0; - T0 = pParam->BSIM4v7dvt1w * model->BSIM4v7weffeot * model->BSIM4v7leffeot / ltw; - if (T0 < EXP_THRESHOLD) - { T1 = exp(T0); - T2 = T1 - 1.0; - T3 = T2 * T2; - T4 = T3 + 2.0 * T1 * MIN_EXP; - T5 = T1 / T4; - } - else - T5 = 1.0 / (MAX_EXP - 2.0); /* 3.0 * MIN_EXP omitted */ - T2 = pParam->BSIM4v7dvt0w * T5 * V0; - TempRatioeot = model->BSIM4v7tempeot / model->BSIM4v7tnom - 1.0; - T0 = sqrt(1.0 + pParam->BSIM4v7lpe0 / model->BSIM4v7leffeot); - T1 = pParam->BSIM4v7k1ox * (T0 - 1.0) * sqrt(phieot) - + (pParam->BSIM4v7kt1 + pParam->BSIM4v7kt1l / model->BSIM4v7leffeot) * TempRatioeot; - Vth_NarrowW = toxe * phieot - / (model->BSIM4v7weffeot + pParam->BSIM4v7w0); - Lpe_Vb = sqrt(1.0 + pParam->BSIM4v7lpeb / model->BSIM4v7leffeot); - Vth = model->BSIM4v7type * here->BSIM4v7vth0 + - (pParam->BSIM4v7k1ox - pParam->BSIM4v7k1)*sqrt(phieot)*Lpe_Vb - - Delt_vth - T2 + pParam->BSIM4v7k3 * Vth_NarrowW + T1; - - /* Calculate n */ - tmp1 = epssub / pParam->BSIM4v7Xdep0; - here->BSIM4v7nstar = Vtmeot / Charge_q * - (model->BSIM4v7coxe + tmp1 + pParam->BSIM4v7cit); - tmp2 = pParam->BSIM4v7nfactor * tmp1; - tmp3 = (tmp2 + pParam->BSIM4v7cdsc * Theta0 + pParam->BSIM4v7cit) / model->BSIM4v7coxe; - if (tmp3 >= -0.5) - n = 1.0 + tmp3; - else - { - T0 = 1.0 / (3.0 + 8.0 * tmp3); - n = (1.0 + 3.0 * tmp3) * T0; - } - - /* Vth correction for Pocket implant */ - if (pParam->BSIM4v7dvtp0 > 0.0) - { - T3 = model->BSIM4v7leffeot + pParam->BSIM4v7dvtp0 * 2.0; - if (model->BSIM4v7tempMod < 2) - T4 = Vtmeot * log(model->BSIM4v7leffeot / T3); - else - T4 = Vtm0eot * log(model->BSIM4v7leffeot / T3); - Vth -= n * T4; - } - Vgsteff = Vgs_eff-Vth; - /* calculating Toxp */ - T3 = model->BSIM4v7type * here->BSIM4v7vth0 - - here->BSIM4v7vfb - phieot; - T4 = T3 + T3; - T5 = 2.5 * T3; - - vtfbphi2eot = 4.0 * T3; - if (vtfbphi2eot < 0.0) - vtfbphi2eot = 0.0; - - - niter = 0; - toxpf = toxe; - do - { - toxpi = toxpf; - tmp2 = 2.0e8 * toxpf; - T0 = (Vgsteff + vtfbphi2eot) / tmp2; - T1 = 1.0 + exp(model->BSIM4v7bdos * 0.7 * log(T0)); - Tcen = model->BSIM4v7ados * 1.9e-9 / T1; - toxpf = toxe - epsrox/model->BSIM4v7epsrsub * Tcen; - niter++; - } while ((niter<=4)&&(ABS(toxpf-toxpi)>1e-12)); - model->BSIM4v7toxp = toxpf; - model->BSIM4v7coxp = epsrox * EPS0 / model->BSIM4v7toxp; - } - - if (BSIM4v7checkModel(model, here, ckt)) - { - SPfrontEnd->IFerrorf(ERR_FATAL, - "detected during BSIM4.7.0 parameter checking for \n model %s of device instance %s\n", model->BSIM4v7modName, here->BSIM4v7name); - return(E_BADPARM); - } - } /* End instance */ - } - return(OK); -} diff --git a/src/spicelib/devices/bsim4v7/b4v7trunc.c b/src/spicelib/devices/bsim4v7/b4v7trunc.c deleted file mode 100644 index 9aea00696..000000000 --- a/src/spicelib/devices/bsim4v7/b4v7trunc.c +++ /dev/null @@ -1,60 +0,0 @@ -/**** BSIM4.7.0 Released by Darsen Lu 04/08/2011 ****/ - -/********** - * Copyright 2006 Regents of the University of California. All rights reserved. - * File: b4trunc.c of BSIM4.7.0. - * Author: 2000 Weidong Liu - * Authors: 2001- Xuemei Xi, Mohan Dunga, Ali Niknejad, Chenming Hu. - * Authors: 2006- Mohan Dunga, Ali Niknejad, Chenming Hu - * Authors: 2007- Mohan Dunga, Wenwei Yang, Ali Niknejad, Chenming Hu - * Project Director: Prof. Chenming Hu. - **********/ - -#include "ngspice/ngspice.h" -#include "ngspice/cktdefs.h" -#include "bsim4v7def.h" -#include "ngspice/sperror.h" -#include "ngspice/suffix.h" - - -int -BSIM4v7trunc( -GENmodel *inModel, -CKTcircuit *ckt, -double *timeStep) -{ -BSIM4v7model *model = (BSIM4v7model*)inModel; -BSIM4v7instance *here; - -#ifdef STEPDEBUG - double debugtemp; -#endif /* STEPDEBUG */ - - for (; model != NULL; model = BSIM4v7nextModel(model)) - { for (here = BSIM4v7instances(model); here != NULL; - here = BSIM4v7nextInstance(here)) - { -#ifdef STEPDEBUG - debugtemp = *timeStep; -#endif /* STEPDEBUG */ - CKTterr(here->BSIM4v7qb,ckt,timeStep); - CKTterr(here->BSIM4v7qg,ckt,timeStep); - CKTterr(here->BSIM4v7qd,ckt,timeStep); - if (here->BSIM4v7trnqsMod) - CKTterr(here->BSIM4v7qcdump,ckt,timeStep); - if (here->BSIM4v7rbodyMod) - { CKTterr(here->BSIM4v7qbs,ckt,timeStep); - CKTterr(here->BSIM4v7qbd,ckt,timeStep); - } - if (here->BSIM4v7rgateMod == 3) - CKTterr(here->BSIM4v7qgmid,ckt,timeStep); -#ifdef STEPDEBUG - if(debugtemp != *timeStep) - { printf("device %s reduces step from %g to %g\n", - here->BSIM4v7name,debugtemp,*timeStep); - } -#endif /* STEPDEBUG */ - } - } - return(OK); -} diff --git a/src/spicelib/devices/bsim4v7/bsim4v7def.h b/src/spicelib/devices/bsim4v7/bsim4v7def.h deleted file mode 100644 index d4e8495eb..000000000 --- a/src/spicelib/devices/bsim4v7/bsim4v7def.h +++ /dev/null @@ -1,3801 +0,0 @@ -/**** BSIM4v7.6.2 Released by Wenwei Yang 07/31/2008 ****/ - -/********** -Copyright 2006 Regents of the University of California. All rights reserved. -File: bsim4v7def.h -Author: 2000 Weidong Liu. -Authors: 2001- Xuemei Xi, Mohan Dunga, Ali Niknejad, Chenming Hu. -Authors: 2006- Mohan Dunga, Ali Niknejad, Chenming Hu -Authors: 2007- Mohan Dunga, Wenwei Yang, Ali Niknejad, Chenming Hu -Authors: 2008- Wenwei Yang, Ali Niknejad, Chenming Hu -Modified by Xuemei Xi, 11/15/2002. -Modified by Xuemei Xi, 05/09/2003. -Modified by Xuemei Xi, 03/04/2004. -Modified by Xuemei Xi, Mohan Dunga, 09/24/2004. -Modified by Xuemei Xi, 07/29/2005. -Modified by Mohan Dunga, 12/13/2006 -Modified by Mohan Dunga, Wenwei Yang, 05/18/2007. -Modified by Wenwei Yang, 07/31/2008. - * Modified by Tanvir Morshed, Darsen Lu 03/27/2011 -**********/ - -#ifndef BSIM4v7 -#define BSIM4v7 - -#include "ngspice/ifsim.h" -#include "ngspice/gendefs.h" -#include "ngspice/cktdefs.h" -#include "ngspice/complex.h" -#include "ngspice/noisedef.h" - -typedef struct sBSIM4v7instance -{ - - struct GENinstance gen; - -#define BSIM4v7modPtr(inst) ((struct sBSIM4v7model *)((inst)->gen.GENmodPtr)) -#define BSIM4v7nextInstance(inst) ((struct sBSIM4v7instance *)((inst)->gen.GENnextInstance)) -#define BSIM4v7name gen.GENname -#define BSIM4v7states gen.GENstate - - const int BSIM4v7dNode; - const int BSIM4v7gNodeExt; - const int BSIM4v7sNode; - const int BSIM4v7bNode; - int BSIM4v7dNodePrime; - int BSIM4v7gNodePrime; - int BSIM4v7gNodeMid; - int BSIM4v7sNodePrime; - int BSIM4v7bNodePrime; - int BSIM4v7dbNode; - int BSIM4v7sbNode; - int BSIM4v7qNode; - - double BSIM4v7ueff; - double BSIM4v7thetavth; - double BSIM4v7von; - double BSIM4v7vdsat; - double BSIM4v7cgdo; - double BSIM4v7qgdo; - double BSIM4v7cgso; - double BSIM4v7qgso; - double BSIM4v7grbsb; - double BSIM4v7grbdb; - double BSIM4v7grbpb; - double BSIM4v7grbps; - double BSIM4v7grbpd; - - double BSIM4v7vjsmFwd; - double BSIM4v7vjsmRev; - double BSIM4v7vjdmFwd; - double BSIM4v7vjdmRev; - double BSIM4v7XExpBVS; - double BSIM4v7XExpBVD; - double BSIM4v7SslpFwd; - double BSIM4v7SslpRev; - double BSIM4v7DslpFwd; - double BSIM4v7DslpRev; - double BSIM4v7IVjsmFwd; - double BSIM4v7IVjsmRev; - double BSIM4v7IVjdmFwd; - double BSIM4v7IVjdmRev; - - double BSIM4v7grgeltd; - double BSIM4v7Pseff; - double BSIM4v7Pdeff; - double BSIM4v7Aseff; - double BSIM4v7Adeff; - - double BSIM4v7l; - double BSIM4v7w; - double BSIM4v7drainArea; - double BSIM4v7sourceArea; - double BSIM4v7drainSquares; - double BSIM4v7sourceSquares; - double BSIM4v7drainPerimeter; - double BSIM4v7sourcePerimeter; - double BSIM4v7sourceConductance; - double BSIM4v7drainConductance; - /* stress effect instance param */ - double BSIM4v7sa; - double BSIM4v7sb; - double BSIM4v7sd; - double BSIM4v7sca; - double BSIM4v7scb; - double BSIM4v7scc; - double BSIM4v7sc; - - double BSIM4v7rbdb; - double BSIM4v7rbsb; - double BSIM4v7rbpb; - double BSIM4v7rbps; - double BSIM4v7rbpd; - - double BSIM4v7delvto; - double BSIM4v7mulu0; - int BSIM4v7wnflag; - double BSIM4v7xgw; - double BSIM4v7ngcon; - - /* added here to account stress effect instance dependence */ - double BSIM4v7u0temp; - double BSIM4v7vsattemp; - double BSIM4v7vth0; - double BSIM4v7vfb; - double BSIM4v7vfbzb; - double BSIM4v7vtfbphi1; - double BSIM4v7vtfbphi2; - double BSIM4v7k2; - double BSIM4v7vbsc; - double BSIM4v7k2ox; - double BSIM4v7eta0; - - double BSIM4v7icVDS; - double BSIM4v7icVGS; - double BSIM4v7icVBS; - double BSIM4v7m; - double BSIM4v7nf; - int BSIM4v7off; - int BSIM4v7mode; - int BSIM4v7trnqsMod; - int BSIM4v7acnqsMod; - int BSIM4v7rbodyMod; - int BSIM4v7rgateMod; - int BSIM4v7geoMod; - int BSIM4v7rgeoMod; - int BSIM4v7min; - - - /* OP point */ - double BSIM4v7Vgsteff; - double BSIM4v7vgs_eff; - double BSIM4v7vgd_eff; - double BSIM4v7dvgs_eff_dvg; - double BSIM4v7dvgd_eff_dvg; - double BSIM4v7Vdseff; - double BSIM4v7nstar; - double BSIM4v7Abulk; - double BSIM4v7EsatL; - double BSIM4v7AbovVgst2Vtm; - double BSIM4v7qinv; - double BSIM4v7cd; - double BSIM4v7cbs; - double BSIM4v7cbd; - double BSIM4v7csub; - double BSIM4v7Igidl; - double BSIM4v7Igisl; - double BSIM4v7gm; - double BSIM4v7gds; - double BSIM4v7gmbs; - double BSIM4v7gbd; - double BSIM4v7gbs; - double BSIM4v7noiGd0; /* tnoiMod=2 (v4.7) */ - double BSIM4v7Coxeff; - - double BSIM4v7gbbs; - double BSIM4v7gbgs; - double BSIM4v7gbds; - double BSIM4v7ggidld; - double BSIM4v7ggidlg; - double BSIM4v7ggidls; - double BSIM4v7ggidlb; - double BSIM4v7ggisld; - double BSIM4v7ggislg; - double BSIM4v7ggisls; - double BSIM4v7ggislb; - - double BSIM4v7Igcs; - double BSIM4v7gIgcsg; - double BSIM4v7gIgcsd; - double BSIM4v7gIgcss; - double BSIM4v7gIgcsb; - double BSIM4v7Igcd; - double BSIM4v7gIgcdg; - double BSIM4v7gIgcdd; - double BSIM4v7gIgcds; - double BSIM4v7gIgcdb; - - double BSIM4v7Igs; - double BSIM4v7gIgsg; - double BSIM4v7gIgss; - double BSIM4v7Igd; - double BSIM4v7gIgdg; - double BSIM4v7gIgdd; - - double BSIM4v7Igb; - double BSIM4v7gIgbg; - double BSIM4v7gIgbd; - double BSIM4v7gIgbs; - double BSIM4v7gIgbb; - - double BSIM4v7grdsw; - double BSIM4v7IdovVds; - double BSIM4v7gcrg; - double BSIM4v7gcrgd; - double BSIM4v7gcrgg; - double BSIM4v7gcrgs; - double BSIM4v7gcrgb; - - double BSIM4v7gstot; - double BSIM4v7gstotd; - double BSIM4v7gstotg; - double BSIM4v7gstots; - double BSIM4v7gstotb; - - double BSIM4v7gdtot; - double BSIM4v7gdtotd; - double BSIM4v7gdtotg; - double BSIM4v7gdtots; - double BSIM4v7gdtotb; - - double BSIM4v7cggb; - double BSIM4v7cgdb; - double BSIM4v7cgsb; - double BSIM4v7cbgb; - double BSIM4v7cbdb; - double BSIM4v7cbsb; - double BSIM4v7cdgb; - double BSIM4v7cddb; - double BSIM4v7cdsb; - double BSIM4v7csgb; - double BSIM4v7csdb; - double BSIM4v7cssb; - double BSIM4v7cgbb; - double BSIM4v7cdbb; - double BSIM4v7csbb; - double BSIM4v7cbbb; - double BSIM4v7capbd; - double BSIM4v7capbs; - - double BSIM4v7cqgb; - double BSIM4v7cqdb; - double BSIM4v7cqsb; - double BSIM4v7cqbb; - - double BSIM4v7qgate; - double BSIM4v7qbulk; - double BSIM4v7qdrn; - double BSIM4v7qsrc; - double BSIM4v7qdef; - - double BSIM4v7qchqs; - double BSIM4v7taunet; - double BSIM4v7gtau; - double BSIM4v7gtg; - double BSIM4v7gtd; - double BSIM4v7gts; - double BSIM4v7gtb; - double BSIM4v7SjctTempRevSatCur; - double BSIM4v7DjctTempRevSatCur; - double BSIM4v7SswTempRevSatCur; - double BSIM4v7DswTempRevSatCur; - double BSIM4v7SswgTempRevSatCur; - double BSIM4v7DswgTempRevSatCur; - - struct bsim4SizeDependParam *pParam; - - unsigned BSIM4v7lGiven :1; - unsigned BSIM4v7wGiven :1; - unsigned BSIM4v7mGiven :1; - unsigned BSIM4v7nfGiven :1; - unsigned BSIM4v7minGiven :1; - unsigned BSIM4v7drainAreaGiven :1; - unsigned BSIM4v7sourceAreaGiven :1; - unsigned BSIM4v7drainSquaresGiven :1; - unsigned BSIM4v7sourceSquaresGiven :1; - unsigned BSIM4v7drainPerimeterGiven :1; - unsigned BSIM4v7sourcePerimeterGiven :1; - unsigned BSIM4v7saGiven :1; - unsigned BSIM4v7sbGiven :1; - unsigned BSIM4v7sdGiven :1; - unsigned BSIM4v7scaGiven :1; - unsigned BSIM4v7scbGiven :1; - unsigned BSIM4v7sccGiven :1; - unsigned BSIM4v7scGiven :1; - unsigned BSIM4v7rbdbGiven :1; - unsigned BSIM4v7rbsbGiven :1; - unsigned BSIM4v7rbpbGiven :1; - unsigned BSIM4v7rbpdGiven :1; - unsigned BSIM4v7rbpsGiven :1; - unsigned BSIM4v7delvtoGiven :1; - unsigned BSIM4v7mulu0Given :1; - unsigned BSIM4v7wnflagGiven :1; - unsigned BSIM4v7xgwGiven :1; - unsigned BSIM4v7ngconGiven :1; - unsigned BSIM4v7icVDSGiven :1; - unsigned BSIM4v7icVGSGiven :1; - unsigned BSIM4v7icVBSGiven :1; - unsigned BSIM4v7trnqsModGiven :1; - unsigned BSIM4v7acnqsModGiven :1; - unsigned BSIM4v7rbodyModGiven :1; - unsigned BSIM4v7rgateModGiven :1; - unsigned BSIM4v7geoModGiven :1; - unsigned BSIM4v7rgeoModGiven :1; - - - double *BSIM4v7DPdPtr; - double *BSIM4v7DPdpPtr; - double *BSIM4v7DPgpPtr; - double *BSIM4v7DPgmPtr; - double *BSIM4v7DPspPtr; - double *BSIM4v7DPbpPtr; - double *BSIM4v7DPdbPtr; - - double *BSIM4v7DdPtr; - double *BSIM4v7DdpPtr; - - double *BSIM4v7GPdpPtr; - double *BSIM4v7GPgpPtr; - double *BSIM4v7GPgmPtr; - double *BSIM4v7GPgePtr; - double *BSIM4v7GPspPtr; - double *BSIM4v7GPbpPtr; - - double *BSIM4v7GMdpPtr; - double *BSIM4v7GMgpPtr; - double *BSIM4v7GMgmPtr; - double *BSIM4v7GMgePtr; - double *BSIM4v7GMspPtr; - double *BSIM4v7GMbpPtr; - - double *BSIM4v7GEdpPtr; - double *BSIM4v7GEgpPtr; - double *BSIM4v7GEgmPtr; - double *BSIM4v7GEgePtr; - double *BSIM4v7GEspPtr; - double *BSIM4v7GEbpPtr; - - double *BSIM4v7SPdpPtr; - double *BSIM4v7SPgpPtr; - double *BSIM4v7SPgmPtr; - double *BSIM4v7SPsPtr; - double *BSIM4v7SPspPtr; - double *BSIM4v7SPbpPtr; - double *BSIM4v7SPsbPtr; - - double *BSIM4v7SspPtr; - double *BSIM4v7SsPtr; - - double *BSIM4v7BPdpPtr; - double *BSIM4v7BPgpPtr; - double *BSIM4v7BPgmPtr; - double *BSIM4v7BPspPtr; - double *BSIM4v7BPdbPtr; - double *BSIM4v7BPbPtr; - double *BSIM4v7BPsbPtr; - double *BSIM4v7BPbpPtr; - - double *BSIM4v7DBdpPtr; - double *BSIM4v7DBdbPtr; - double *BSIM4v7DBbpPtr; - double *BSIM4v7DBbPtr; - - double *BSIM4v7SBspPtr; - double *BSIM4v7SBbpPtr; - double *BSIM4v7SBbPtr; - double *BSIM4v7SBsbPtr; - - double *BSIM4v7BdbPtr; - double *BSIM4v7BbpPtr; - double *BSIM4v7BsbPtr; - double *BSIM4v7BbPtr; - - double *BSIM4v7DgpPtr; - double *BSIM4v7DspPtr; - double *BSIM4v7DbpPtr; - double *BSIM4v7SdpPtr; - double *BSIM4v7SgpPtr; - double *BSIM4v7SbpPtr; - - double *BSIM4v7QdpPtr; - double *BSIM4v7QgpPtr; - double *BSIM4v7QspPtr; - double *BSIM4v7QbpPtr; - double *BSIM4v7QqPtr; - double *BSIM4v7DPqPtr; - double *BSIM4v7GPqPtr; - double *BSIM4v7SPqPtr; - -#ifdef USE_OMP - /* per instance storage of results, to update matrix at a later stge */ - double BSIM4v7rhsdPrime; - double BSIM4v7rhsgPrime; - double BSIM4v7rhsgExt; - double BSIM4v7grhsMid; - double BSIM4v7rhsbPrime; - double BSIM4v7rhssPrime; - double BSIM4v7rhsdb; - double BSIM4v7rhssb; - double BSIM4v7rhsd; - double BSIM4v7rhss; - double BSIM4v7rhsq; - - double BSIM4v7_1; - double BSIM4v7_2; - double BSIM4v7_3; - double BSIM4v7_4; - double BSIM4v7_5; - double BSIM4v7_6; - double BSIM4v7_7; - double BSIM4v7_8; - double BSIM4v7_9; - double BSIM4v7_10; - double BSIM4v7_11; - double BSIM4v7_12; - double BSIM4v7_13; - double BSIM4v7_14; - double BSIM4v7_15; - double BSIM4v7_16; - double BSIM4v7_17; - double BSIM4v7_18; - double BSIM4v7_19; - double BSIM4v7_20; - double BSIM4v7_21; - double BSIM4v7_22; - double BSIM4v7_23; - double BSIM4v7_24; - double BSIM4v7_25; - double BSIM4v7_26; - double BSIM4v7_27; - double BSIM4v7_28; - double BSIM4v7_29; - double BSIM4v7_30; - double BSIM4v7_31; - double BSIM4v7_32; - double BSIM4v7_33; - double BSIM4v7_34; - double BSIM4v7_35; - double BSIM4v7_36; - double BSIM4v7_37; - double BSIM4v7_38; - double BSIM4v7_39; - double BSIM4v7_40; - double BSIM4v7_41; - double BSIM4v7_42; - double BSIM4v7_43; - double BSIM4v7_44; - double BSIM4v7_45; - double BSIM4v7_46; - double BSIM4v7_47; - double BSIM4v7_48; - double BSIM4v7_49; - double BSIM4v7_50; - double BSIM4v7_51; - double BSIM4v7_52; - double BSIM4v7_53; - double BSIM4v7_54; - double BSIM4v7_55; - double BSIM4v7_56; - double BSIM4v7_57; - double BSIM4v7_58; - double BSIM4v7_59; - double BSIM4v7_60; - double BSIM4v7_61; - double BSIM4v7_62; - double BSIM4v7_63; - double BSIM4v7_64; - double BSIM4v7_65; - double BSIM4v7_66; - double BSIM4v7_67; - double BSIM4v7_68; - double BSIM4v7_69; - double BSIM4v7_70; - double BSIM4v7_71; - double BSIM4v7_72; - double BSIM4v7_73; - double BSIM4v7_74; - double BSIM4v7_75; - double BSIM4v7_76; - double BSIM4v7_77; - double BSIM4v7_78; - double BSIM4v7_79; - double BSIM4v7_80; - double BSIM4v7_81; - double BSIM4v7_82; - double BSIM4v7_83; - double BSIM4v7_84; - double BSIM4v7_85; - double BSIM4v7_86; - double BSIM4v7_87; - double BSIM4v7_88; - double BSIM4v7_89; - double BSIM4v7_90; - double BSIM4v7_91; - double BSIM4v7_92; - double BSIM4v7_93; - double BSIM4v7_94; - double BSIM4v7_95; - double BSIM4v7_96; - double BSIM4v7_97; - double BSIM4v7_98; - double BSIM4v7_99; - double BSIM4v7_100; - double BSIM4v7_101; - double BSIM4v7_102; - double BSIM4v7_103; -#endif - -#define BSIM4v7vbd BSIM4v7states+ 0 -#define BSIM4v7vbs BSIM4v7states+ 1 -#define BSIM4v7vgs BSIM4v7states+ 2 -#define BSIM4v7vds BSIM4v7states+ 3 -#define BSIM4v7vdbs BSIM4v7states+ 4 -#define BSIM4v7vdbd BSIM4v7states+ 5 -#define BSIM4v7vsbs BSIM4v7states+ 6 -#define BSIM4v7vges BSIM4v7states+ 7 -#define BSIM4v7vgms BSIM4v7states+ 8 -#define BSIM4v7vses BSIM4v7states+ 9 -#define BSIM4v7vdes BSIM4v7states+ 10 - -#define BSIM4v7qb BSIM4v7states+ 11 -#define BSIM4v7cqb BSIM4v7states+ 12 -#define BSIM4v7qg BSIM4v7states+ 13 -#define BSIM4v7cqg BSIM4v7states+ 14 -#define BSIM4v7qd BSIM4v7states+ 15 -#define BSIM4v7cqd BSIM4v7states+ 16 -#define BSIM4v7qgmid BSIM4v7states+ 17 -#define BSIM4v7cqgmid BSIM4v7states+ 18 - -#define BSIM4v7qbs BSIM4v7states+ 19 -#define BSIM4v7cqbs BSIM4v7states+ 20 -#define BSIM4v7qbd BSIM4v7states+ 21 -#define BSIM4v7cqbd BSIM4v7states+ 22 - -#define BSIM4v7qcheq BSIM4v7states+ 23 -#define BSIM4v7cqcheq BSIM4v7states+ 24 -#define BSIM4v7qcdump BSIM4v7states+ 25 -#define BSIM4v7cqcdump BSIM4v7states+ 26 -#define BSIM4v7qdef BSIM4v7states+ 27 -#define BSIM4v7qs BSIM4v7states+ 28 - -#define BSIM4v7numStates 29 - - -/* indices to the array of BSIM4v7 NOISE SOURCES */ - -#define BSIM4v7RDNOIZ 0 -#define BSIM4v7RSNOIZ 1 -#define BSIM4v7RGNOIZ 2 -#define BSIM4v7RBPSNOIZ 3 -#define BSIM4v7RBPDNOIZ 4 -#define BSIM4v7RBPBNOIZ 5 -#define BSIM4v7RBSBNOIZ 6 -#define BSIM4v7RBDBNOIZ 7 -#define BSIM4v7IDNOIZ 8 -#define BSIM4v7FLNOIZ 9 -#define BSIM4v7IGSNOIZ 10 -#define BSIM4v7IGDNOIZ 11 -#define BSIM4v7IGBNOIZ 12 -#define BSIM4v7CORLNOIZ 13 -#define BSIM4v7TOTNOIZ 14 - -#define BSIM4v7NSRCS 15 /* Number of BSIM4v7 noise sources */ - -#ifndef NONOISE - double BSIM4v7nVar[NSTATVARS][BSIM4v7NSRCS]; -#else /* NONOISE */ - double **BSIM4v7nVar; -#endif /* NONOISE */ - -} BSIM4v7instance ; - -struct bsim4SizeDependParam -{ - double Width; - double Length; - double NFinger; - - double BSIM4v7cdsc; - double BSIM4v7cdscb; - double BSIM4v7cdscd; - double BSIM4v7cit; - double BSIM4v7nfactor; - double BSIM4v7xj; - double BSIM4v7vsat; - double BSIM4v7at; - double BSIM4v7a0; - double BSIM4v7ags; - double BSIM4v7a1; - double BSIM4v7a2; - double BSIM4v7keta; - double BSIM4v7nsub; - double BSIM4v7ndep; - double BSIM4v7nsd; - double BSIM4v7phin; - double BSIM4v7ngate; - double BSIM4v7gamma1; - double BSIM4v7gamma2; - double BSIM4v7vbx; - double BSIM4v7vbi; - double BSIM4v7vbm; - double BSIM4v7xt; - double BSIM4v7phi; - double BSIM4v7litl; - double BSIM4v7k1; - double BSIM4v7kt1; - double BSIM4v7kt1l; - double BSIM4v7kt2; - double BSIM4v7k2; - double BSIM4v7k3; - double BSIM4v7k3b; - double BSIM4v7w0; - double BSIM4v7dvtp0; - double BSIM4v7dvtp1; - double BSIM4v7dvtp2; /* New DIBL/Rout */ - double BSIM4v7dvtp3; - double BSIM4v7dvtp4; - double BSIM4v7dvtp5; - double BSIM4v7lpe0; - double BSIM4v7lpeb; - double BSIM4v7dvt0; - double BSIM4v7dvt1; - double BSIM4v7dvt2; - double BSIM4v7dvt0w; - double BSIM4v7dvt1w; - double BSIM4v7dvt2w; - double BSIM4v7drout; - double BSIM4v7dsub; - double BSIM4v7vth0; - double BSIM4v7ua; - double BSIM4v7ua1; - double BSIM4v7ub; - double BSIM4v7ub1; - double BSIM4v7uc; - double BSIM4v7uc1; - double BSIM4v7ud; - double BSIM4v7ud1; - double BSIM4v7up; - double BSIM4v7lp; - double BSIM4v7u0; - double BSIM4v7eu; - double BSIM4v7ucs; - double BSIM4v7ute; - double BSIM4v7ucste; - double BSIM4v7voff; - double BSIM4v7tvoff; - double BSIM4v7tnfactor; /* v4.7 Temp dep of leakage current */ - double BSIM4v7teta0; /* v4.7 temp dep of leakage current */ - double BSIM4v7tvoffcv; /* v4.7 temp dep of leakage current */ - double BSIM4v7minv; - double BSIM4v7minvcv; - double BSIM4v7vfb; - double BSIM4v7delta; - double BSIM4v7rdsw; - double BSIM4v7rds0; - double BSIM4v7rs0; - double BSIM4v7rd0; - double BSIM4v7rsw; - double BSIM4v7rdw; - double BSIM4v7prwg; - double BSIM4v7prwb; - double BSIM4v7prt; - double BSIM4v7eta0; - double BSIM4v7etab; - double BSIM4v7pclm; - double BSIM4v7pdibl1; - double BSIM4v7pdibl2; - double BSIM4v7pdiblb; - double BSIM4v7fprout; - double BSIM4v7pdits; - double BSIM4v7pditsd; - double BSIM4v7pscbe1; - double BSIM4v7pscbe2; - double BSIM4v7pvag; - double BSIM4v7wr; - double BSIM4v7dwg; - double BSIM4v7dwb; - double BSIM4v7b0; - double BSIM4v7b1; - double BSIM4v7alpha0; - double BSIM4v7alpha1; - double BSIM4v7beta0; - double BSIM4v7agidl; - double BSIM4v7bgidl; - double BSIM4v7cgidl; - double BSIM4v7egidl; - double BSIM4v7fgidl; /* v4.7 New GIDL/GISL */ - double BSIM4v7kgidl; /* v4.7 New GIDL/GISL */ - double BSIM4v7rgidl; /* v4.7 New GIDL/GISL */ - double BSIM4v7agisl; - double BSIM4v7bgisl; - double BSIM4v7cgisl; - double BSIM4v7egisl; - double BSIM4v7fgisl; /* v4.7 New GIDL/GISL */ - double BSIM4v7kgisl; /* v4.7 New GIDL/GISL */ - double BSIM4v7rgisl; /* v4.7 New GIDL/GISL */ - double BSIM4v7aigc; - double BSIM4v7bigc; - double BSIM4v7cigc; - double BSIM4v7aigs; - double BSIM4v7bigs; - double BSIM4v7cigs; - double BSIM4v7aigd; - double BSIM4v7bigd; - double BSIM4v7cigd; - double BSIM4v7aigbacc; - double BSIM4v7bigbacc; - double BSIM4v7cigbacc; - double BSIM4v7aigbinv; - double BSIM4v7bigbinv; - double BSIM4v7cigbinv; - double BSIM4v7nigc; - double BSIM4v7nigbacc; - double BSIM4v7nigbinv; - double BSIM4v7ntox; - double BSIM4v7eigbinv; - double BSIM4v7pigcd; - double BSIM4v7poxedge; - double BSIM4v7xrcrg1; - double BSIM4v7xrcrg2; - double BSIM4v7lambda; /* overshoot */ - double BSIM4v7vtl; /* thermal velocity limit */ - double BSIM4v7xn; /* back scattering parameter */ - double BSIM4v7lc; /* back scattering parameter */ - double BSIM4v7tfactor; /* ballistic transportation factor */ - double BSIM4v7vfbsdoff; /* S/D flatband offset voltage */ - double BSIM4v7tvfbsdoff; - -/* added for stress effect */ - double BSIM4v7ku0; - double BSIM4v7kvth0; - double BSIM4v7ku0temp; - double BSIM4v7rho_ref; - double BSIM4v7inv_od_ref; -/* added for well proximity effect */ - double BSIM4v7kvth0we; - double BSIM4v7k2we; - double BSIM4v7ku0we; - - /* CV model */ - double BSIM4v7cgsl; - double BSIM4v7cgdl; - double BSIM4v7ckappas; - double BSIM4v7ckappad; - double BSIM4v7cf; - double BSIM4v7clc; - double BSIM4v7cle; - double BSIM4v7vfbcv; - double BSIM4v7noff; - double BSIM4v7voffcv; - double BSIM4v7acde; - double BSIM4v7moin; - -/* Pre-calculated constants */ - - double BSIM4v7dw; - double BSIM4v7dl; - double BSIM4v7leff; - double BSIM4v7weff; - - double BSIM4v7dwc; - double BSIM4v7dlc; - double BSIM4v7dwj; - double BSIM4v7leffCV; - double BSIM4v7weffCV; - double BSIM4v7weffCJ; - double BSIM4v7abulkCVfactor; - double BSIM4v7cgso; - double BSIM4v7cgdo; - double BSIM4v7cgbo; - - double BSIM4v7u0temp; - double BSIM4v7vsattemp; - double BSIM4v7sqrtPhi; - double BSIM4v7phis3; - double BSIM4v7Xdep0; - double BSIM4v7sqrtXdep0; - double BSIM4v7theta0vb0; - double BSIM4v7thetaRout; - double BSIM4v7mstar; - double BSIM4v7VgsteffVth; - double BSIM4v7mstarcv; - double BSIM4v7voffcbn; - double BSIM4v7voffcbncv; - double BSIM4v7rdswmin; - double BSIM4v7rdwmin; - double BSIM4v7rswmin; - double BSIM4v7vfbsd; - - double BSIM4v7cof1; - double BSIM4v7cof2; - double BSIM4v7cof3; - double BSIM4v7cof4; - double BSIM4v7cdep0; - double BSIM4v7ToxRatio; - double BSIM4v7Aechvb; - double BSIM4v7Bechvb; - double BSIM4v7ToxRatioEdge; - double BSIM4v7AechvbEdgeS; - double BSIM4v7AechvbEdgeD; - double BSIM4v7BechvbEdge; - double BSIM4v7ldeb; - double BSIM4v7k1ox; - double BSIM4v7k2ox; - double BSIM4v7vfbzbfactor; - double BSIM4v7dvtp2factor; /* v4.7 */ - struct bsim4SizeDependParam *pNext; -}; - - -typedef struct sBSIM4v7model -{ - - struct GENmodel gen; - -#define BSIM4v7modType gen.GENmodType -#define BSIM4v7nextModel(inst) ((struct sBSIM4v7model *)((inst)->gen.GENnextModel)) -#define BSIM4v7instances(inst) ((BSIM4v7instance *)((inst)->gen.GENinstances)) -#define BSIM4v7modName gen.GENmodName - - int BSIM4v7type; - - int BSIM4v7mobMod; - int BSIM4v7cvchargeMod; - int BSIM4v7capMod; - int BSIM4v7dioMod; - int BSIM4v7trnqsMod; - int BSIM4v7acnqsMod; - int BSIM4v7fnoiMod; - int BSIM4v7tnoiMod; - int BSIM4v7rdsMod; - int BSIM4v7rbodyMod; - int BSIM4v7rgateMod; - int BSIM4v7perMod; - int BSIM4v7geoMod; - int BSIM4v7rgeoMod; - int BSIM4v7mtrlMod; - int BSIM4v7mtrlCompatMod; /* v4.7 */ - int BSIM4v7gidlMod; /* v4.7 New GIDL/GISL */ - int BSIM4v7igcMod; - int BSIM4v7igbMod; - int BSIM4v7tempMod; - int BSIM4v7binUnit; - int BSIM4v7paramChk; - char *BSIM4v7version; - double BSIM4v7eot; - double BSIM4v7vddeot; - double BSIM4v7tempeot; - double BSIM4v7leffeot; - double BSIM4v7weffeot; - double BSIM4v7ados; - double BSIM4v7bdos; - double BSIM4v7toxe; - double BSIM4v7toxp; - double BSIM4v7toxm; - double BSIM4v7dtox; - double BSIM4v7epsrox; - double BSIM4v7cdsc; - double BSIM4v7cdscb; - double BSIM4v7cdscd; - double BSIM4v7cit; - double BSIM4v7nfactor; - double BSIM4v7xj; - double BSIM4v7vsat; - double BSIM4v7at; - double BSIM4v7a0; - double BSIM4v7ags; - double BSIM4v7a1; - double BSIM4v7a2; - double BSIM4v7keta; - double BSIM4v7nsub; - double BSIM4v7phig; - double BSIM4v7epsrgate; - double BSIM4v7easub; - double BSIM4v7epsrsub; - double BSIM4v7ni0sub; - double BSIM4v7bg0sub; - double BSIM4v7tbgasub; - double BSIM4v7tbgbsub; - double BSIM4v7ndep; - double BSIM4v7nsd; - double BSIM4v7phin; - double BSIM4v7ngate; - double BSIM4v7gamma1; - double BSIM4v7gamma2; - double BSIM4v7vbx; - double BSIM4v7vbm; - double BSIM4v7xt; - double BSIM4v7k1; - double BSIM4v7kt1; - double BSIM4v7kt1l; - double BSIM4v7kt2; - double BSIM4v7k2; - double BSIM4v7k3; - double BSIM4v7k3b; - double BSIM4v7w0; - double BSIM4v7dvtp0; - double BSIM4v7dvtp1; - double BSIM4v7dvtp2; /* New DIBL/Rout */ - double BSIM4v7dvtp3; - double BSIM4v7dvtp4; - double BSIM4v7dvtp5; - double BSIM4v7lpe0; - double BSIM4v7lpeb; - double BSIM4v7dvt0; - double BSIM4v7dvt1; - double BSIM4v7dvt2; - double BSIM4v7dvt0w; - double BSIM4v7dvt1w; - double BSIM4v7dvt2w; - double BSIM4v7drout; - double BSIM4v7dsub; - double BSIM4v7vth0; - double BSIM4v7eu; - double BSIM4v7ucs; - double BSIM4v7ua; - double BSIM4v7ua1; - double BSIM4v7ub; - double BSIM4v7ub1; - double BSIM4v7uc; - double BSIM4v7uc1; - double BSIM4v7ud; - double BSIM4v7ud1; - double BSIM4v7up; - double BSIM4v7lp; - double BSIM4v7u0; - double BSIM4v7ute; - double BSIM4v7ucste; - double BSIM4v7voff; - double BSIM4v7tvoff; - double BSIM4v7tnfactor; /* v4.7 Temp dep of leakage current */ - double BSIM4v7teta0; /* v4.7 temp dep of leakage current */ - double BSIM4v7tvoffcv; /* v4.7 temp dep of leakage current */ - double BSIM4v7minv; - double BSIM4v7minvcv; - double BSIM4v7voffl; - double BSIM4v7voffcvl; - double BSIM4v7delta; - double BSIM4v7rdsw; - double BSIM4v7rdswmin; - double BSIM4v7rdwmin; - double BSIM4v7rswmin; - double BSIM4v7rsw; - double BSIM4v7rdw; - double BSIM4v7prwg; - double BSIM4v7prwb; - double BSIM4v7prt; - double BSIM4v7eta0; - double BSIM4v7etab; - double BSIM4v7pclm; - double BSIM4v7pdibl1; - double BSIM4v7pdibl2; - double BSIM4v7pdiblb; - double BSIM4v7fprout; - double BSIM4v7pdits; - double BSIM4v7pditsd; - double BSIM4v7pditsl; - double BSIM4v7pscbe1; - double BSIM4v7pscbe2; - double BSIM4v7pvag; - double BSIM4v7wr; - double BSIM4v7dwg; - double BSIM4v7dwb; - double BSIM4v7b0; - double BSIM4v7b1; - double BSIM4v7alpha0; - double BSIM4v7alpha1; - double BSIM4v7beta0; - double BSIM4v7agidl; - double BSIM4v7bgidl; - double BSIM4v7cgidl; - double BSIM4v7egidl; - double BSIM4v7fgidl; /* v4.7 New GIDL/GISL */ - double BSIM4v7kgidl; /* v4.7 New GIDL/GISL */ - double BSIM4v7rgidl; /* v4.7 New GIDL/GISL */ - double BSIM4v7agisl; - double BSIM4v7bgisl; - double BSIM4v7cgisl; - double BSIM4v7egisl; - double BSIM4v7fgisl; /* v4.7 New GIDL/GISL */ - double BSIM4v7kgisl; /* v4.7 New GIDL/GISL */ - double BSIM4v7rgisl; /* v4.7 New GIDL/GISL */ - double BSIM4v7aigc; - double BSIM4v7bigc; - double BSIM4v7cigc; - double BSIM4v7aigsd; - double BSIM4v7bigsd; - double BSIM4v7cigsd; - double BSIM4v7aigs; - double BSIM4v7bigs; - double BSIM4v7cigs; - double BSIM4v7aigd; - double BSIM4v7bigd; - double BSIM4v7cigd; - double BSIM4v7aigbacc; - double BSIM4v7bigbacc; - double BSIM4v7cigbacc; - double BSIM4v7aigbinv; - double BSIM4v7bigbinv; - double BSIM4v7cigbinv; - double BSIM4v7nigc; - double BSIM4v7nigbacc; - double BSIM4v7nigbinv; - double BSIM4v7ntox; - double BSIM4v7eigbinv; - double BSIM4v7pigcd; - double BSIM4v7poxedge; - double BSIM4v7toxref; - double BSIM4v7ijthdfwd; - double BSIM4v7ijthsfwd; - double BSIM4v7ijthdrev; - double BSIM4v7ijthsrev; - double BSIM4v7xjbvd; - double BSIM4v7xjbvs; - double BSIM4v7bvd; - double BSIM4v7bvs; - - double BSIM4v7jtss; - double BSIM4v7jtsd; - double BSIM4v7jtssws; - double BSIM4v7jtsswd; - double BSIM4v7jtsswgs; - double BSIM4v7jtsswgd; - double BSIM4v7jtweff; - double BSIM4v7njts; - double BSIM4v7njtssw; - double BSIM4v7njtsswg; - double BSIM4v7njtsd; - double BSIM4v7njtsswd; - double BSIM4v7njtsswgd; - double BSIM4v7xtss; - double BSIM4v7xtsd; - double BSIM4v7xtssws; - double BSIM4v7xtsswd; - double BSIM4v7xtsswgs; - double BSIM4v7xtsswgd; - double BSIM4v7tnjts; - double BSIM4v7tnjtssw; - double BSIM4v7tnjtsswg; - double BSIM4v7tnjtsd; - double BSIM4v7tnjtsswd; - double BSIM4v7tnjtsswgd; - double BSIM4v7vtss; - double BSIM4v7vtsd; - double BSIM4v7vtssws; - double BSIM4v7vtsswd; - double BSIM4v7vtsswgs; - double BSIM4v7vtsswgd; - - double BSIM4v7xrcrg1; - double BSIM4v7xrcrg2; - double BSIM4v7lambda; - double BSIM4v7vtl; - double BSIM4v7lc; - double BSIM4v7xn; - double BSIM4v7vfbsdoff; /* S/D flatband offset voltage */ - double BSIM4v7lintnoi; /* lint offset for noise calculation */ - double BSIM4v7tvfbsdoff; - - double BSIM4v7vfb; - double BSIM4v7gbmin; - double BSIM4v7rbdb; - double BSIM4v7rbsb; - double BSIM4v7rbpb; - double BSIM4v7rbps; - double BSIM4v7rbpd; - - double BSIM4v7rbps0; - double BSIM4v7rbpsl; - double BSIM4v7rbpsw; - double BSIM4v7rbpsnf; - - double BSIM4v7rbpd0; - double BSIM4v7rbpdl; - double BSIM4v7rbpdw; - double BSIM4v7rbpdnf; - - double BSIM4v7rbpbx0; - double BSIM4v7rbpbxl; - double BSIM4v7rbpbxw; - double BSIM4v7rbpbxnf; - double BSIM4v7rbpby0; - double BSIM4v7rbpbyl; - double BSIM4v7rbpbyw; - double BSIM4v7rbpbynf; - - double BSIM4v7rbsbx0; - double BSIM4v7rbsby0; - double BSIM4v7rbdbx0; - double BSIM4v7rbdby0; - - double BSIM4v7rbsdbxl; - double BSIM4v7rbsdbxw; - double BSIM4v7rbsdbxnf; - double BSIM4v7rbsdbyl; - double BSIM4v7rbsdbyw; - double BSIM4v7rbsdbynf; - - double BSIM4v7tnoia; - double BSIM4v7tnoib; - double BSIM4v7tnoic; - double BSIM4v7rnoia; - double BSIM4v7rnoib; - double BSIM4v7rnoic; - double BSIM4v7ntnoi; - - /* CV model and Parasitics */ - double BSIM4v7cgsl; - double BSIM4v7cgdl; - double BSIM4v7ckappas; - double BSIM4v7ckappad; - double BSIM4v7cf; - double BSIM4v7vfbcv; - double BSIM4v7clc; - double BSIM4v7cle; - double BSIM4v7dwc; - double BSIM4v7dlc; - double BSIM4v7xw; - double BSIM4v7xl; - double BSIM4v7dlcig; - double BSIM4v7dlcigd; - double BSIM4v7dwj; - double BSIM4v7noff; - double BSIM4v7voffcv; - double BSIM4v7acde; - double BSIM4v7moin; - double BSIM4v7tcj; - double BSIM4v7tcjsw; - double BSIM4v7tcjswg; - double BSIM4v7tpb; - double BSIM4v7tpbsw; - double BSIM4v7tpbswg; - double BSIM4v7dmcg; - double BSIM4v7dmci; - double BSIM4v7dmdg; - double BSIM4v7dmcgt; - double BSIM4v7xgw; - double BSIM4v7xgl; - double BSIM4v7rshg; - double BSIM4v7ngcon; - - /* Length Dependence */ - double BSIM4v7lcdsc; - double BSIM4v7lcdscb; - double BSIM4v7lcdscd; - double BSIM4v7lcit; - double BSIM4v7lnfactor; - double BSIM4v7lxj; - double BSIM4v7lvsat; - double BSIM4v7lat; - double BSIM4v7la0; - double BSIM4v7lags; - double BSIM4v7la1; - double BSIM4v7la2; - double BSIM4v7lketa; - double BSIM4v7lnsub; - double BSIM4v7lndep; - double BSIM4v7lnsd; - double BSIM4v7lphin; - double BSIM4v7lngate; - double BSIM4v7lgamma1; - double BSIM4v7lgamma2; - double BSIM4v7lvbx; - double BSIM4v7lvbm; - double BSIM4v7lxt; - double BSIM4v7lk1; - double BSIM4v7lkt1; - double BSIM4v7lkt1l; - double BSIM4v7lkt2; - double BSIM4v7lk2; - double BSIM4v7lk3; - double BSIM4v7lk3b; - double BSIM4v7lw0; - double BSIM4v7ldvtp0; - double BSIM4v7ldvtp1; - double BSIM4v7ldvtp2; /* New DIBL/Rout */ - double BSIM4v7ldvtp3; - double BSIM4v7ldvtp4; - double BSIM4v7ldvtp5; - double BSIM4v7llpe0; - double BSIM4v7llpeb; - double BSIM4v7ldvt0; - double BSIM4v7ldvt1; - double BSIM4v7ldvt2; - double BSIM4v7ldvt0w; - double BSIM4v7ldvt1w; - double BSIM4v7ldvt2w; - double BSIM4v7ldrout; - double BSIM4v7ldsub; - double BSIM4v7lvth0; - double BSIM4v7lua; - double BSIM4v7lua1; - double BSIM4v7lub; - double BSIM4v7lub1; - double BSIM4v7luc; - double BSIM4v7luc1; - double BSIM4v7lud; - double BSIM4v7lud1; - double BSIM4v7lup; - double BSIM4v7llp; - double BSIM4v7lu0; - double BSIM4v7leu; - double BSIM4v7lucs; - double BSIM4v7lute; - double BSIM4v7lucste; - double BSIM4v7lvoff; - double BSIM4v7ltvoff; - double BSIM4v7ltnfactor; /* v4.7 Temp dep of leakage current */ - double BSIM4v7lteta0; /* v4.7 temp dep of leakage current */ - double BSIM4v7ltvoffcv; /* v4.7 temp dep of leakage current */ - double BSIM4v7lminv; - double BSIM4v7lminvcv; - double BSIM4v7ldelta; - double BSIM4v7lrdsw; - double BSIM4v7lrsw; - double BSIM4v7lrdw; - double BSIM4v7lprwg; - double BSIM4v7lprwb; - double BSIM4v7lprt; - double BSIM4v7leta0; - double BSIM4v7letab; - double BSIM4v7lpclm; - double BSIM4v7lpdibl1; - double BSIM4v7lpdibl2; - double BSIM4v7lpdiblb; - double BSIM4v7lfprout; - double BSIM4v7lpdits; - double BSIM4v7lpditsd; - double BSIM4v7lpscbe1; - double BSIM4v7lpscbe2; - double BSIM4v7lpvag; - double BSIM4v7lwr; - double BSIM4v7ldwg; - double BSIM4v7ldwb; - double BSIM4v7lb0; - double BSIM4v7lb1; - double BSIM4v7lalpha0; - double BSIM4v7lalpha1; - double BSIM4v7lbeta0; - double BSIM4v7lvfb; - double BSIM4v7lagidl; - double BSIM4v7lbgidl; - double BSIM4v7lcgidl; - double BSIM4v7legidl; - double BSIM4v7lfgidl; /* v4.7 New GIDL/GISL */ - double BSIM4v7lkgidl; /* v4.7 New GIDL/GISL */ - double BSIM4v7lrgidl; /* v4.7 New GIDL/GISL */ - double BSIM4v7lagisl; - double BSIM4v7lbgisl; - double BSIM4v7lcgisl; - double BSIM4v7legisl; - double BSIM4v7lfgisl; /* v4.7 New GIDL/GISL */ - double BSIM4v7lkgisl; /* v4.7 New GIDL/GISL */ - double BSIM4v7lrgisl; /* v4.7 New GIDL/GISL */ - double BSIM4v7laigc; - double BSIM4v7lbigc; - double BSIM4v7lcigc; - double BSIM4v7laigsd; - double BSIM4v7lbigsd; - double BSIM4v7lcigsd; - double BSIM4v7laigs; - double BSIM4v7lbigs; - double BSIM4v7lcigs; - double BSIM4v7laigd; - double BSIM4v7lbigd; - double BSIM4v7lcigd; - double BSIM4v7laigbacc; - double BSIM4v7lbigbacc; - double BSIM4v7lcigbacc; - double BSIM4v7laigbinv; - double BSIM4v7lbigbinv; - double BSIM4v7lcigbinv; - double BSIM4v7lnigc; - double BSIM4v7lnigbacc; - double BSIM4v7lnigbinv; - double BSIM4v7lntox; - double BSIM4v7leigbinv; - double BSIM4v7lpigcd; - double BSIM4v7lpoxedge; - double BSIM4v7lxrcrg1; - double BSIM4v7lxrcrg2; - double BSIM4v7llambda; - double BSIM4v7lvtl; - double BSIM4v7lxn; - double BSIM4v7lvfbsdoff; - double BSIM4v7ltvfbsdoff; - - /* CV model */ - double BSIM4v7lcgsl; - double BSIM4v7lcgdl; - double BSIM4v7lckappas; - double BSIM4v7lckappad; - double BSIM4v7lcf; - double BSIM4v7lclc; - double BSIM4v7lcle; - double BSIM4v7lvfbcv; - double BSIM4v7lnoff; - double BSIM4v7lvoffcv; - double BSIM4v7lacde; - double BSIM4v7lmoin; - - /* Width Dependence */ - double BSIM4v7wcdsc; - double BSIM4v7wcdscb; - double BSIM4v7wcdscd; - double BSIM4v7wcit; - double BSIM4v7wnfactor; - double BSIM4v7wxj; - double BSIM4v7wvsat; - double BSIM4v7wat; - double BSIM4v7wa0; - double BSIM4v7wags; - double BSIM4v7wa1; - double BSIM4v7wa2; - double BSIM4v7wketa; - double BSIM4v7wnsub; - double BSIM4v7wndep; - double BSIM4v7wnsd; - double BSIM4v7wphin; - double BSIM4v7wngate; - double BSIM4v7wgamma1; - double BSIM4v7wgamma2; - double BSIM4v7wvbx; - double BSIM4v7wvbm; - double BSIM4v7wxt; - double BSIM4v7wk1; - double BSIM4v7wkt1; - double BSIM4v7wkt1l; - double BSIM4v7wkt2; - double BSIM4v7wk2; - double BSIM4v7wk3; - double BSIM4v7wk3b; - double BSIM4v7ww0; - double BSIM4v7wdvtp0; - double BSIM4v7wdvtp1; - double BSIM4v7wdvtp2; /* New DIBL/Rout */ - double BSIM4v7wdvtp3; - double BSIM4v7wdvtp4; - double BSIM4v7wdvtp5; - double BSIM4v7wlpe0; - double BSIM4v7wlpeb; - double BSIM4v7wdvt0; - double BSIM4v7wdvt1; - double BSIM4v7wdvt2; - double BSIM4v7wdvt0w; - double BSIM4v7wdvt1w; - double BSIM4v7wdvt2w; - double BSIM4v7wdrout; - double BSIM4v7wdsub; - double BSIM4v7wvth0; - double BSIM4v7wua; - double BSIM4v7wua1; - double BSIM4v7wub; - double BSIM4v7wub1; - double BSIM4v7wuc; - double BSIM4v7wuc1; - double BSIM4v7wud; - double BSIM4v7wud1; - double BSIM4v7wup; - double BSIM4v7wlp; - double BSIM4v7wu0; - double BSIM4v7weu; - double BSIM4v7wucs; - double BSIM4v7wute; - double BSIM4v7wucste; - double BSIM4v7wvoff; - double BSIM4v7wtvoff; - double BSIM4v7wtnfactor; /* v4.7 Temp dep of leakage current */ - double BSIM4v7wteta0; /* v4.7 temp dep of leakage current */ - double BSIM4v7wtvoffcv; /* v4.7 temp dep of leakage current */ - double BSIM4v7wminv; - double BSIM4v7wminvcv; - double BSIM4v7wdelta; - double BSIM4v7wrdsw; - double BSIM4v7wrsw; - double BSIM4v7wrdw; - double BSIM4v7wprwg; - double BSIM4v7wprwb; - double BSIM4v7wprt; - double BSIM4v7weta0; - double BSIM4v7wetab; - double BSIM4v7wpclm; - double BSIM4v7wpdibl1; - double BSIM4v7wpdibl2; - double BSIM4v7wpdiblb; - double BSIM4v7wfprout; - double BSIM4v7wpdits; - double BSIM4v7wpditsd; - double BSIM4v7wpscbe1; - double BSIM4v7wpscbe2; - double BSIM4v7wpvag; - double BSIM4v7wwr; - double BSIM4v7wdwg; - double BSIM4v7wdwb; - double BSIM4v7wb0; - double BSIM4v7wb1; - double BSIM4v7walpha0; - double BSIM4v7walpha1; - double BSIM4v7wbeta0; - double BSIM4v7wvfb; - double BSIM4v7wagidl; - double BSIM4v7wbgidl; - double BSIM4v7wcgidl; - double BSIM4v7wegidl; - double BSIM4v7wfgidl; /* v4.7 New GIDL/GISL */ - double BSIM4v7wkgidl; /* v4.7 New GIDL/GISL */ - double BSIM4v7wrgidl; /* v4.7 New GIDL/GISL */ - double BSIM4v7wagisl; - double BSIM4v7wbgisl; - double BSIM4v7wcgisl; - double BSIM4v7wegisl; - double BSIM4v7wfgisl; /* v4.7 New GIDL/GISL */ - double BSIM4v7wkgisl; /* v4.7 New GIDL/GISL */ - double BSIM4v7wrgisl; /* v4.7 New GIDL/GISL */ - double BSIM4v7waigc; - double BSIM4v7wbigc; - double BSIM4v7wcigc; - double BSIM4v7waigsd; - double BSIM4v7wbigsd; - double BSIM4v7wcigsd; - double BSIM4v7waigs; - double BSIM4v7wbigs; - double BSIM4v7wcigs; - double BSIM4v7waigd; - double BSIM4v7wbigd; - double BSIM4v7wcigd; - double BSIM4v7waigbacc; - double BSIM4v7wbigbacc; - double BSIM4v7wcigbacc; - double BSIM4v7waigbinv; - double BSIM4v7wbigbinv; - double BSIM4v7wcigbinv; - double BSIM4v7wnigc; - double BSIM4v7wnigbacc; - double BSIM4v7wnigbinv; - double BSIM4v7wntox; - double BSIM4v7weigbinv; - double BSIM4v7wpigcd; - double BSIM4v7wpoxedge; - double BSIM4v7wxrcrg1; - double BSIM4v7wxrcrg2; - double BSIM4v7wlambda; - double BSIM4v7wvtl; - double BSIM4v7wxn; - double BSIM4v7wvfbsdoff; - double BSIM4v7wtvfbsdoff; - - /* CV model */ - double BSIM4v7wcgsl; - double BSIM4v7wcgdl; - double BSIM4v7wckappas; - double BSIM4v7wckappad; - double BSIM4v7wcf; - double BSIM4v7wclc; - double BSIM4v7wcle; - double BSIM4v7wvfbcv; - double BSIM4v7wnoff; - double BSIM4v7wvoffcv; - double BSIM4v7wacde; - double BSIM4v7wmoin; - - /* Cross-term Dependence */ - double BSIM4v7pcdsc; - double BSIM4v7pcdscb; - double BSIM4v7pcdscd; - double BSIM4v7pcit; - double BSIM4v7pnfactor; - double BSIM4v7pxj; - double BSIM4v7pvsat; - double BSIM4v7pat; - double BSIM4v7pa0; - double BSIM4v7pags; - double BSIM4v7pa1; - double BSIM4v7pa2; - double BSIM4v7pketa; - double BSIM4v7pnsub; - double BSIM4v7pndep; - double BSIM4v7pnsd; - double BSIM4v7pphin; - double BSIM4v7pngate; - double BSIM4v7pgamma1; - double BSIM4v7pgamma2; - double BSIM4v7pvbx; - double BSIM4v7pvbm; - double BSIM4v7pxt; - double BSIM4v7pk1; - double BSIM4v7pkt1; - double BSIM4v7pkt1l; - double BSIM4v7pkt2; - double BSIM4v7pk2; - double BSIM4v7pk3; - double BSIM4v7pk3b; - double BSIM4v7pw0; - double BSIM4v7pdvtp0; - double BSIM4v7pdvtp1; - double BSIM4v7pdvtp2; /* New DIBL/Rout */ - double BSIM4v7pdvtp3; - double BSIM4v7pdvtp4; - double BSIM4v7pdvtp5; - double BSIM4v7plpe0; - double BSIM4v7plpeb; - double BSIM4v7pdvt0; - double BSIM4v7pdvt1; - double BSIM4v7pdvt2; - double BSIM4v7pdvt0w; - double BSIM4v7pdvt1w; - double BSIM4v7pdvt2w; - double BSIM4v7pdrout; - double BSIM4v7pdsub; - double BSIM4v7pvth0; - double BSIM4v7pua; - double BSIM4v7pua1; - double BSIM4v7pub; - double BSIM4v7pub1; - double BSIM4v7puc; - double BSIM4v7puc1; - double BSIM4v7pud; - double BSIM4v7pud1; - double BSIM4v7pup; - double BSIM4v7plp; - double BSIM4v7pu0; - double BSIM4v7peu; - double BSIM4v7pucs; - double BSIM4v7pute; - double BSIM4v7pucste; - double BSIM4v7pvoff; - double BSIM4v7ptvoff; - double BSIM4v7ptnfactor; /* v4.7 Temp dep of leakage current */ - double BSIM4v7pteta0; /* v4.7 temp dep of leakage current */ - double BSIM4v7ptvoffcv; /* v4.7 temp dep of leakage current */ - double BSIM4v7pminv; - double BSIM4v7pminvcv; - double BSIM4v7pdelta; - double BSIM4v7prdsw; - double BSIM4v7prsw; - double BSIM4v7prdw; - double BSIM4v7pprwg; - double BSIM4v7pprwb; - double BSIM4v7pprt; - double BSIM4v7peta0; - double BSIM4v7petab; - double BSIM4v7ppclm; - double BSIM4v7ppdibl1; - double BSIM4v7ppdibl2; - double BSIM4v7ppdiblb; - double BSIM4v7pfprout; - double BSIM4v7ppdits; - double BSIM4v7ppditsd; - double BSIM4v7ppscbe1; - double BSIM4v7ppscbe2; - double BSIM4v7ppvag; - double BSIM4v7pwr; - double BSIM4v7pdwg; - double BSIM4v7pdwb; - double BSIM4v7pb0; - double BSIM4v7pb1; - double BSIM4v7palpha0; - double BSIM4v7palpha1; - double BSIM4v7pbeta0; - double BSIM4v7pvfb; - double BSIM4v7pagidl; - double BSIM4v7pbgidl; - double BSIM4v7pcgidl; - double BSIM4v7pegidl; - double BSIM4v7pfgidl; /* v4.7 New GIDL/GISL */ - double BSIM4v7pkgidl; /* v4.7 New GIDL/GISL */ - double BSIM4v7prgidl; /* v4.7 New GIDL/GISL */ - double BSIM4v7pagisl; - double BSIM4v7pbgisl; - double BSIM4v7pcgisl; - double BSIM4v7pegisl; - double BSIM4v7pfgisl; /* v4.7 New GIDL/GISL */ - double BSIM4v7pkgisl; /* v4.7 New GIDL/GISL */ - double BSIM4v7prgisl; /* v4.7 New GIDL/GISL */ - double BSIM4v7paigc; - double BSIM4v7pbigc; - double BSIM4v7pcigc; - double BSIM4v7paigsd; - double BSIM4v7pbigsd; - double BSIM4v7pcigsd; - double BSIM4v7paigs; - double BSIM4v7pbigs; - double BSIM4v7pcigs; - double BSIM4v7paigd; - double BSIM4v7pbigd; - double BSIM4v7pcigd; - double BSIM4v7paigbacc; - double BSIM4v7pbigbacc; - double BSIM4v7pcigbacc; - double BSIM4v7paigbinv; - double BSIM4v7pbigbinv; - double BSIM4v7pcigbinv; - double BSIM4v7pnigc; - double BSIM4v7pnigbacc; - double BSIM4v7pnigbinv; - double BSIM4v7pntox; - double BSIM4v7peigbinv; - double BSIM4v7ppigcd; - double BSIM4v7ppoxedge; - double BSIM4v7pxrcrg1; - double BSIM4v7pxrcrg2; - double BSIM4v7plambda; - double BSIM4v7pvtl; - double BSIM4v7pxn; - double BSIM4v7pvfbsdoff; - double BSIM4v7ptvfbsdoff; - - /* CV model */ - double BSIM4v7pcgsl; - double BSIM4v7pcgdl; - double BSIM4v7pckappas; - double BSIM4v7pckappad; - double BSIM4v7pcf; - double BSIM4v7pclc; - double BSIM4v7pcle; - double BSIM4v7pvfbcv; - double BSIM4v7pnoff; - double BSIM4v7pvoffcv; - double BSIM4v7pacde; - double BSIM4v7pmoin; - - double BSIM4v7tnom; - double BSIM4v7cgso; - double BSIM4v7cgdo; - double BSIM4v7cgbo; - double BSIM4v7xpart; - double BSIM4v7cFringOut; - double BSIM4v7cFringMax; - - double BSIM4v7sheetResistance; - double BSIM4v7SjctSatCurDensity; - double BSIM4v7DjctSatCurDensity; - double BSIM4v7SjctSidewallSatCurDensity; - double BSIM4v7DjctSidewallSatCurDensity; - double BSIM4v7SjctGateSidewallSatCurDensity; - double BSIM4v7DjctGateSidewallSatCurDensity; - double BSIM4v7SbulkJctPotential; - double BSIM4v7DbulkJctPotential; - double BSIM4v7SbulkJctBotGradingCoeff; - double BSIM4v7DbulkJctBotGradingCoeff; - double BSIM4v7SbulkJctSideGradingCoeff; - double BSIM4v7DbulkJctSideGradingCoeff; - double BSIM4v7SbulkJctGateSideGradingCoeff; - double BSIM4v7DbulkJctGateSideGradingCoeff; - double BSIM4v7SsidewallJctPotential; - double BSIM4v7DsidewallJctPotential; - double BSIM4v7SGatesidewallJctPotential; - double BSIM4v7DGatesidewallJctPotential; - double BSIM4v7SunitAreaJctCap; - double BSIM4v7DunitAreaJctCap; - double BSIM4v7SunitLengthSidewallJctCap; - double BSIM4v7DunitLengthSidewallJctCap; - double BSIM4v7SunitLengthGateSidewallJctCap; - double BSIM4v7DunitLengthGateSidewallJctCap; - double BSIM4v7SjctEmissionCoeff; - double BSIM4v7DjctEmissionCoeff; - double BSIM4v7SjctTempExponent; - double BSIM4v7DjctTempExponent; - double BSIM4v7njtsstemp; - double BSIM4v7njtsswstemp; - double BSIM4v7njtsswgstemp; - double BSIM4v7njtsdtemp; - double BSIM4v7njtsswdtemp; - double BSIM4v7njtsswgdtemp; - - double BSIM4v7Lint; - double BSIM4v7Ll; - double BSIM4v7Llc; - double BSIM4v7Lln; - double BSIM4v7Lw; - double BSIM4v7Lwc; - double BSIM4v7Lwn; - double BSIM4v7Lwl; - double BSIM4v7Lwlc; - double BSIM4v7Lmin; - double BSIM4v7Lmax; - - double BSIM4v7Wint; - double BSIM4v7Wl; - double BSIM4v7Wlc; - double BSIM4v7Wln; - double BSIM4v7Ww; - double BSIM4v7Wwc; - double BSIM4v7Wwn; - double BSIM4v7Wwl; - double BSIM4v7Wwlc; - double BSIM4v7Wmin; - double BSIM4v7Wmax; - - /* added for stress effect */ - double BSIM4v7saref; - double BSIM4v7sbref; - double BSIM4v7wlod; - double BSIM4v7ku0; - double BSIM4v7kvsat; - double BSIM4v7kvth0; - double BSIM4v7tku0; - double BSIM4v7llodku0; - double BSIM4v7wlodku0; - double BSIM4v7llodvth; - double BSIM4v7wlodvth; - double BSIM4v7lku0; - double BSIM4v7wku0; - double BSIM4v7pku0; - double BSIM4v7lkvth0; - double BSIM4v7wkvth0; - double BSIM4v7pkvth0; - double BSIM4v7stk2; - double BSIM4v7lodk2; - double BSIM4v7steta0; - double BSIM4v7lodeta0; - - double BSIM4v7web; - double BSIM4v7wec; - double BSIM4v7kvth0we; - double BSIM4v7k2we; - double BSIM4v7ku0we; - double BSIM4v7scref; - double BSIM4v7wpemod; - double BSIM4v7lkvth0we; - double BSIM4v7lk2we; - double BSIM4v7lku0we; - double BSIM4v7wkvth0we; - double BSIM4v7wk2we; - double BSIM4v7wku0we; - double BSIM4v7pkvth0we; - double BSIM4v7pk2we; - double BSIM4v7pku0we; - -/* Pre-calculated constants - * move to size-dependent param */ - double BSIM4v7Eg0; - double BSIM4v7vtm; - double BSIM4v7vtm0; - double BSIM4v7coxe; - double BSIM4v7coxp; - double BSIM4v7cof1; - double BSIM4v7cof2; - double BSIM4v7cof3; - double BSIM4v7cof4; - double BSIM4v7vcrit; - double BSIM4v7factor1; - double BSIM4v7PhiBS; - double BSIM4v7PhiBSWS; - double BSIM4v7PhiBSWGS; - double BSIM4v7SjctTempSatCurDensity; - double BSIM4v7SjctSidewallTempSatCurDensity; - double BSIM4v7SjctGateSidewallTempSatCurDensity; - double BSIM4v7PhiBD; - double BSIM4v7PhiBSWD; - double BSIM4v7PhiBSWGD; - double BSIM4v7DjctTempSatCurDensity; - double BSIM4v7DjctSidewallTempSatCurDensity; - double BSIM4v7DjctGateSidewallTempSatCurDensity; - double BSIM4v7SunitAreaTempJctCap; - double BSIM4v7DunitAreaTempJctCap; - double BSIM4v7SunitLengthSidewallTempJctCap; - double BSIM4v7DunitLengthSidewallTempJctCap; - double BSIM4v7SunitLengthGateSidewallTempJctCap; - double BSIM4v7DunitLengthGateSidewallTempJctCap; - - double BSIM4v7oxideTrapDensityA; - double BSIM4v7oxideTrapDensityB; - double BSIM4v7oxideTrapDensityC; - double BSIM4v7em; - double BSIM4v7ef; - double BSIM4v7af; - double BSIM4v7kf; - - double BSIM4v7vgsMax; - double BSIM4v7vgdMax; - double BSIM4v7vgbMax; - double BSIM4v7vdsMax; - double BSIM4v7vbsMax; - double BSIM4v7vbdMax; - double BSIM4v7vgsrMax; - double BSIM4v7vgdrMax; - double BSIM4v7vgbrMax; - double BSIM4v7vbsrMax; - double BSIM4v7vbdrMax; - - struct bsim4SizeDependParam *pSizeDependParamKnot; - -#ifdef USE_OMP - int BSIM4v7InstCount; - struct sBSIM4v7instance **BSIM4v7InstanceArray; -#endif - - /* Flags */ - unsigned BSIM4v7mobModGiven :1; - unsigned BSIM4v7binUnitGiven :1; - unsigned BSIM4v7cvchargeModGiven :1; - unsigned BSIM4v7capModGiven :1; - unsigned BSIM4v7dioModGiven :1; - unsigned BSIM4v7rdsModGiven :1; - unsigned BSIM4v7rbodyModGiven :1; - unsigned BSIM4v7rgateModGiven :1; - unsigned BSIM4v7perModGiven :1; - unsigned BSIM4v7geoModGiven :1; - unsigned BSIM4v7rgeoModGiven :1; - unsigned BSIM4v7paramChkGiven :1; - unsigned BSIM4v7trnqsModGiven :1; - unsigned BSIM4v7acnqsModGiven :1; - unsigned BSIM4v7fnoiModGiven :1; - unsigned BSIM4v7tnoiModGiven :1; - unsigned BSIM4v7mtrlModGiven :1; - unsigned BSIM4v7mtrlCompatModGiven :1; - unsigned BSIM4v7gidlModGiven :1; /* v4.7 New GIDL/GISL */ - unsigned BSIM4v7igcModGiven :1; - unsigned BSIM4v7igbModGiven :1; - unsigned BSIM4v7tempModGiven :1; - unsigned BSIM4v7typeGiven :1; - unsigned BSIM4v7toxrefGiven :1; - unsigned BSIM4v7eotGiven :1; - unsigned BSIM4v7vddeotGiven :1; - unsigned BSIM4v7tempeotGiven :1; - unsigned BSIM4v7leffeotGiven :1; - unsigned BSIM4v7weffeotGiven :1; - unsigned BSIM4v7adosGiven :1; - unsigned BSIM4v7bdosGiven :1; - unsigned BSIM4v7toxeGiven :1; - unsigned BSIM4v7toxpGiven :1; - unsigned BSIM4v7toxmGiven :1; - unsigned BSIM4v7dtoxGiven :1; - unsigned BSIM4v7epsroxGiven :1; - unsigned BSIM4v7versionGiven :1; - unsigned BSIM4v7cdscGiven :1; - unsigned BSIM4v7cdscbGiven :1; - unsigned BSIM4v7cdscdGiven :1; - unsigned BSIM4v7citGiven :1; - unsigned BSIM4v7nfactorGiven :1; - unsigned BSIM4v7xjGiven :1; - unsigned BSIM4v7vsatGiven :1; - unsigned BSIM4v7atGiven :1; - unsigned BSIM4v7a0Given :1; - unsigned BSIM4v7agsGiven :1; - unsigned BSIM4v7a1Given :1; - unsigned BSIM4v7a2Given :1; - unsigned BSIM4v7ketaGiven :1; - unsigned BSIM4v7nsubGiven :1; - unsigned BSIM4v7phigGiven :1; - unsigned BSIM4v7epsrgateGiven :1; - unsigned BSIM4v7easubGiven :1; - unsigned BSIM4v7epsrsubGiven :1; - unsigned BSIM4v7ni0subGiven :1; - unsigned BSIM4v7bg0subGiven :1; - unsigned BSIM4v7tbgasubGiven :1; - unsigned BSIM4v7tbgbsubGiven :1; - unsigned BSIM4v7ndepGiven :1; - unsigned BSIM4v7nsdGiven :1; - unsigned BSIM4v7phinGiven :1; - unsigned BSIM4v7ngateGiven :1; - unsigned BSIM4v7gamma1Given :1; - unsigned BSIM4v7gamma2Given :1; - unsigned BSIM4v7vbxGiven :1; - unsigned BSIM4v7vbmGiven :1; - unsigned BSIM4v7xtGiven :1; - unsigned BSIM4v7k1Given :1; - unsigned BSIM4v7kt1Given :1; - unsigned BSIM4v7kt1lGiven :1; - unsigned BSIM4v7kt2Given :1; - unsigned BSIM4v7k2Given :1; - unsigned BSIM4v7k3Given :1; - unsigned BSIM4v7k3bGiven :1; - unsigned BSIM4v7w0Given :1; - unsigned BSIM4v7dvtp0Given :1; - unsigned BSIM4v7dvtp1Given :1; - unsigned BSIM4v7dvtp2Given :1; /* New DIBL/Rout */ - unsigned BSIM4v7dvtp3Given :1; - unsigned BSIM4v7dvtp4Given :1; - unsigned BSIM4v7dvtp5Given :1; - unsigned BSIM4v7lpe0Given :1; - unsigned BSIM4v7lpebGiven :1; - unsigned BSIM4v7dvt0Given :1; - unsigned BSIM4v7dvt1Given :1; - unsigned BSIM4v7dvt2Given :1; - unsigned BSIM4v7dvt0wGiven :1; - unsigned BSIM4v7dvt1wGiven :1; - unsigned BSIM4v7dvt2wGiven :1; - unsigned BSIM4v7droutGiven :1; - unsigned BSIM4v7dsubGiven :1; - unsigned BSIM4v7vth0Given :1; - unsigned BSIM4v7euGiven :1; - unsigned BSIM4v7ucsGiven :1; - unsigned BSIM4v7uaGiven :1; - unsigned BSIM4v7ua1Given :1; - unsigned BSIM4v7ubGiven :1; - unsigned BSIM4v7ub1Given :1; - unsigned BSIM4v7ucGiven :1; - unsigned BSIM4v7uc1Given :1; - unsigned BSIM4v7udGiven :1; - unsigned BSIM4v7ud1Given :1; - unsigned BSIM4v7upGiven :1; - unsigned BSIM4v7lpGiven :1; - unsigned BSIM4v7u0Given :1; - unsigned BSIM4v7uteGiven :1; - unsigned BSIM4v7ucsteGiven :1; - unsigned BSIM4v7voffGiven :1; - unsigned BSIM4v7tvoffGiven :1; - unsigned BSIM4v7tnfactorGiven :1; /* v4.7 Temp dep of leakage current */ - unsigned BSIM4v7teta0Given :1; /* v4.7 temp dep of leakage current */ - unsigned BSIM4v7tvoffcvGiven :1; /* v4.7 temp dep of leakage current */ - unsigned BSIM4v7vofflGiven :1; - unsigned BSIM4v7voffcvlGiven :1; - unsigned BSIM4v7minvGiven :1; - unsigned BSIM4v7minvcvGiven :1; - unsigned BSIM4v7rdswGiven :1; - unsigned BSIM4v7rdswminGiven :1; - unsigned BSIM4v7rdwminGiven :1; - unsigned BSIM4v7rswminGiven :1; - unsigned BSIM4v7rswGiven :1; - unsigned BSIM4v7rdwGiven :1; - unsigned BSIM4v7prwgGiven :1; - unsigned BSIM4v7prwbGiven :1; - unsigned BSIM4v7prtGiven :1; - unsigned BSIM4v7eta0Given :1; - unsigned BSIM4v7etabGiven :1; - unsigned BSIM4v7pclmGiven :1; - unsigned BSIM4v7pdibl1Given :1; - unsigned BSIM4v7pdibl2Given :1; - unsigned BSIM4v7pdiblbGiven :1; - unsigned BSIM4v7fproutGiven :1; - unsigned BSIM4v7pditsGiven :1; - unsigned BSIM4v7pditsdGiven :1; - unsigned BSIM4v7pditslGiven :1; - unsigned BSIM4v7pscbe1Given :1; - unsigned BSIM4v7pscbe2Given :1; - unsigned BSIM4v7pvagGiven :1; - unsigned BSIM4v7deltaGiven :1; - unsigned BSIM4v7wrGiven :1; - unsigned BSIM4v7dwgGiven :1; - unsigned BSIM4v7dwbGiven :1; - unsigned BSIM4v7b0Given :1; - unsigned BSIM4v7b1Given :1; - unsigned BSIM4v7alpha0Given :1; - unsigned BSIM4v7alpha1Given :1; - unsigned BSIM4v7beta0Given :1; - unsigned BSIM4v7agidlGiven :1; - unsigned BSIM4v7bgidlGiven :1; - unsigned BSIM4v7cgidlGiven :1; - unsigned BSIM4v7egidlGiven :1; - unsigned BSIM4v7fgidlGiven :1; /* v4.7 New GIDL/GISL */ - unsigned BSIM4v7kgidlGiven :1; /* v4.7 New GIDL/GISL */ - unsigned BSIM4v7rgidlGiven :1; /* v4.7 New GIDL/GISL */ - unsigned BSIM4v7agislGiven :1; - unsigned BSIM4v7bgislGiven :1; - unsigned BSIM4v7cgislGiven :1; - unsigned BSIM4v7egislGiven :1; - unsigned BSIM4v7fgislGiven :1; /* v4.7 New GIDL/GISL */ - unsigned BSIM4v7kgislGiven :1; /* v4.7 New GIDL/GISL */ - unsigned BSIM4v7rgislGiven :1; /* v4.7 New GIDL/GISL */ - unsigned BSIM4v7aigcGiven :1; - unsigned BSIM4v7bigcGiven :1; - unsigned BSIM4v7cigcGiven :1; - unsigned BSIM4v7aigsdGiven :1; - unsigned BSIM4v7bigsdGiven :1; - unsigned BSIM4v7cigsdGiven :1; - unsigned BSIM4v7aigsGiven :1; - unsigned BSIM4v7bigsGiven :1; - unsigned BSIM4v7cigsGiven :1; - unsigned BSIM4v7aigdGiven :1; - unsigned BSIM4v7bigdGiven :1; - unsigned BSIM4v7cigdGiven :1; - unsigned BSIM4v7aigbaccGiven :1; - unsigned BSIM4v7bigbaccGiven :1; - unsigned BSIM4v7cigbaccGiven :1; - unsigned BSIM4v7aigbinvGiven :1; - unsigned BSIM4v7bigbinvGiven :1; - unsigned BSIM4v7cigbinvGiven :1; - unsigned BSIM4v7nigcGiven :1; - unsigned BSIM4v7nigbinvGiven :1; - unsigned BSIM4v7nigbaccGiven :1; - unsigned BSIM4v7ntoxGiven :1; - unsigned BSIM4v7eigbinvGiven :1; - unsigned BSIM4v7pigcdGiven :1; - unsigned BSIM4v7poxedgeGiven :1; - unsigned BSIM4v7ijthdfwdGiven :1; - unsigned BSIM4v7ijthsfwdGiven :1; - unsigned BSIM4v7ijthdrevGiven :1; - unsigned BSIM4v7ijthsrevGiven :1; - unsigned BSIM4v7xjbvdGiven :1; - unsigned BSIM4v7xjbvsGiven :1; - unsigned BSIM4v7bvdGiven :1; - unsigned BSIM4v7bvsGiven :1; - - unsigned BSIM4v7jtssGiven :1; - unsigned BSIM4v7jtsdGiven :1; - unsigned BSIM4v7jtsswsGiven :1; - unsigned BSIM4v7jtsswdGiven :1; - unsigned BSIM4v7jtsswgsGiven :1; - unsigned BSIM4v7jtsswgdGiven :1; - unsigned BSIM4v7jtweffGiven :1; - unsigned BSIM4v7njtsGiven :1; - unsigned BSIM4v7njtsswGiven :1; - unsigned BSIM4v7njtsswgGiven :1; - unsigned BSIM4v7njtsdGiven :1; - unsigned BSIM4v7njtsswdGiven :1; - unsigned BSIM4v7njtsswgdGiven :1; - unsigned BSIM4v7xtssGiven :1; - unsigned BSIM4v7xtsdGiven :1; - unsigned BSIM4v7xtsswsGiven :1; - unsigned BSIM4v7xtsswdGiven :1; - unsigned BSIM4v7xtsswgsGiven :1; - unsigned BSIM4v7xtsswgdGiven :1; - unsigned BSIM4v7tnjtsGiven :1; - unsigned BSIM4v7tnjtsswGiven :1; - unsigned BSIM4v7tnjtsswgGiven :1; - unsigned BSIM4v7tnjtsdGiven :1; - unsigned BSIM4v7tnjtsswdGiven :1; - unsigned BSIM4v7tnjtsswgdGiven :1; - unsigned BSIM4v7vtssGiven :1; - unsigned BSIM4v7vtsdGiven :1; - unsigned BSIM4v7vtsswsGiven :1; - unsigned BSIM4v7vtsswdGiven :1; - unsigned BSIM4v7vtsswgsGiven :1; - unsigned BSIM4v7vtsswgdGiven :1; - - unsigned BSIM4v7vfbGiven :1; - unsigned BSIM4v7gbminGiven :1; - unsigned BSIM4v7rbdbGiven :1; - unsigned BSIM4v7rbsbGiven :1; - unsigned BSIM4v7rbpsGiven :1; - unsigned BSIM4v7rbpdGiven :1; - unsigned BSIM4v7rbpbGiven :1; - - unsigned BSIM4v7rbps0Given :1; - unsigned BSIM4v7rbpslGiven :1; - unsigned BSIM4v7rbpswGiven :1; - unsigned BSIM4v7rbpsnfGiven :1; - - unsigned BSIM4v7rbpd0Given :1; - unsigned BSIM4v7rbpdlGiven :1; - unsigned BSIM4v7rbpdwGiven :1; - unsigned BSIM4v7rbpdnfGiven :1; - - unsigned BSIM4v7rbpbx0Given :1; - unsigned BSIM4v7rbpbxlGiven :1; - unsigned BSIM4v7rbpbxwGiven :1; - unsigned BSIM4v7rbpbxnfGiven :1; - unsigned BSIM4v7rbpby0Given :1; - unsigned BSIM4v7rbpbylGiven :1; - unsigned BSIM4v7rbpbywGiven :1; - unsigned BSIM4v7rbpbynfGiven :1; - - unsigned BSIM4v7rbsbx0Given :1; - unsigned BSIM4v7rbsby0Given :1; - unsigned BSIM4v7rbdbx0Given :1; - unsigned BSIM4v7rbdby0Given :1; - - unsigned BSIM4v7rbsdbxlGiven :1; - unsigned BSIM4v7rbsdbxwGiven :1; - unsigned BSIM4v7rbsdbxnfGiven :1; - unsigned BSIM4v7rbsdbylGiven :1; - unsigned BSIM4v7rbsdbywGiven :1; - unsigned BSIM4v7rbsdbynfGiven :1; - - unsigned BSIM4v7xrcrg1Given :1; - unsigned BSIM4v7xrcrg2Given :1; - unsigned BSIM4v7tnoiaGiven :1; - unsigned BSIM4v7tnoibGiven :1; - unsigned BSIM4v7tnoicGiven :1; - unsigned BSIM4v7rnoiaGiven :1; - unsigned BSIM4v7rnoibGiven :1; - unsigned BSIM4v7rnoicGiven :1; - unsigned BSIM4v7ntnoiGiven :1; - - unsigned BSIM4v7lambdaGiven :1; - unsigned BSIM4v7vtlGiven :1; - unsigned BSIM4v7lcGiven :1; - unsigned BSIM4v7xnGiven :1; - unsigned BSIM4v7vfbsdoffGiven :1; - unsigned BSIM4v7lintnoiGiven :1; - unsigned BSIM4v7tvfbsdoffGiven :1; - - /* CV model and parasitics */ - unsigned BSIM4v7cgslGiven :1; - unsigned BSIM4v7cgdlGiven :1; - unsigned BSIM4v7ckappasGiven :1; - unsigned BSIM4v7ckappadGiven :1; - unsigned BSIM4v7cfGiven :1; - unsigned BSIM4v7vfbcvGiven :1; - unsigned BSIM4v7clcGiven :1; - unsigned BSIM4v7cleGiven :1; - unsigned BSIM4v7dwcGiven :1; - unsigned BSIM4v7dlcGiven :1; - unsigned BSIM4v7xwGiven :1; - unsigned BSIM4v7xlGiven :1; - unsigned BSIM4v7dlcigGiven :1; - unsigned BSIM4v7dlcigdGiven :1; - unsigned BSIM4v7dwjGiven :1; - unsigned BSIM4v7noffGiven :1; - unsigned BSIM4v7voffcvGiven :1; - unsigned BSIM4v7acdeGiven :1; - unsigned BSIM4v7moinGiven :1; - unsigned BSIM4v7tcjGiven :1; - unsigned BSIM4v7tcjswGiven :1; - unsigned BSIM4v7tcjswgGiven :1; - unsigned BSIM4v7tpbGiven :1; - unsigned BSIM4v7tpbswGiven :1; - unsigned BSIM4v7tpbswgGiven :1; - unsigned BSIM4v7dmcgGiven :1; - unsigned BSIM4v7dmciGiven :1; - unsigned BSIM4v7dmdgGiven :1; - unsigned BSIM4v7dmcgtGiven :1; - unsigned BSIM4v7xgwGiven :1; - unsigned BSIM4v7xglGiven :1; - unsigned BSIM4v7rshgGiven :1; - unsigned BSIM4v7ngconGiven :1; - - - /* Length dependence */ - unsigned BSIM4v7lcdscGiven :1; - unsigned BSIM4v7lcdscbGiven :1; - unsigned BSIM4v7lcdscdGiven :1; - unsigned BSIM4v7lcitGiven :1; - unsigned BSIM4v7lnfactorGiven :1; - unsigned BSIM4v7lxjGiven :1; - unsigned BSIM4v7lvsatGiven :1; - unsigned BSIM4v7latGiven :1; - unsigned BSIM4v7la0Given :1; - unsigned BSIM4v7lagsGiven :1; - unsigned BSIM4v7la1Given :1; - unsigned BSIM4v7la2Given :1; - unsigned BSIM4v7lketaGiven :1; - unsigned BSIM4v7lnsubGiven :1; - unsigned BSIM4v7lndepGiven :1; - unsigned BSIM4v7lnsdGiven :1; - unsigned BSIM4v7lphinGiven :1; - unsigned BSIM4v7lngateGiven :1; - unsigned BSIM4v7lgamma1Given :1; - unsigned BSIM4v7lgamma2Given :1; - unsigned BSIM4v7lvbxGiven :1; - unsigned BSIM4v7lvbmGiven :1; - unsigned BSIM4v7lxtGiven :1; - unsigned BSIM4v7lk1Given :1; - unsigned BSIM4v7lkt1Given :1; - unsigned BSIM4v7lkt1lGiven :1; - unsigned BSIM4v7lkt2Given :1; - unsigned BSIM4v7lk2Given :1; - unsigned BSIM4v7lk3Given :1; - unsigned BSIM4v7lk3bGiven :1; - unsigned BSIM4v7lw0Given :1; - unsigned BSIM4v7ldvtp0Given :1; - unsigned BSIM4v7ldvtp1Given :1; - unsigned BSIM4v7ldvtp2Given :1; /* New DIBL/Rout */ - unsigned BSIM4v7ldvtp3Given :1; - unsigned BSIM4v7ldvtp4Given :1; - unsigned BSIM4v7ldvtp5Given :1; - unsigned BSIM4v7llpe0Given :1; - unsigned BSIM4v7llpebGiven :1; - unsigned BSIM4v7ldvt0Given :1; - unsigned BSIM4v7ldvt1Given :1; - unsigned BSIM4v7ldvt2Given :1; - unsigned BSIM4v7ldvt0wGiven :1; - unsigned BSIM4v7ldvt1wGiven :1; - unsigned BSIM4v7ldvt2wGiven :1; - unsigned BSIM4v7ldroutGiven :1; - unsigned BSIM4v7ldsubGiven :1; - unsigned BSIM4v7lvth0Given :1; - unsigned BSIM4v7luaGiven :1; - unsigned BSIM4v7lua1Given :1; - unsigned BSIM4v7lubGiven :1; - unsigned BSIM4v7lub1Given :1; - unsigned BSIM4v7lucGiven :1; - unsigned BSIM4v7luc1Given :1; - unsigned BSIM4v7ludGiven :1; - unsigned BSIM4v7lud1Given :1; - unsigned BSIM4v7lupGiven :1; - unsigned BSIM4v7llpGiven :1; - unsigned BSIM4v7lu0Given :1; - unsigned BSIM4v7leuGiven :1; - unsigned BSIM4v7lucsGiven :1; - unsigned BSIM4v7luteGiven :1; - unsigned BSIM4v7lucsteGiven :1; - unsigned BSIM4v7lvoffGiven :1; - unsigned BSIM4v7ltvoffGiven :1; - unsigned BSIM4v7ltnfactorGiven :1; /* v4.7 Temp dep of leakage current */ - unsigned BSIM4v7lteta0Given :1; /* v4.7 temp dep of leakage current */ - unsigned BSIM4v7ltvoffcvGiven :1; /* v4.7 temp dep of leakage current */ - unsigned BSIM4v7lminvGiven :1; - unsigned BSIM4v7lminvcvGiven :1; - unsigned BSIM4v7lrdswGiven :1; - unsigned BSIM4v7lrswGiven :1; - unsigned BSIM4v7lrdwGiven :1; - unsigned BSIM4v7lprwgGiven :1; - unsigned BSIM4v7lprwbGiven :1; - unsigned BSIM4v7lprtGiven :1; - unsigned BSIM4v7leta0Given :1; - unsigned BSIM4v7letabGiven :1; - unsigned BSIM4v7lpclmGiven :1; - unsigned BSIM4v7lpdibl1Given :1; - unsigned BSIM4v7lpdibl2Given :1; - unsigned BSIM4v7lpdiblbGiven :1; - unsigned BSIM4v7lfproutGiven :1; - unsigned BSIM4v7lpditsGiven :1; - unsigned BSIM4v7lpditsdGiven :1; - unsigned BSIM4v7lpscbe1Given :1; - unsigned BSIM4v7lpscbe2Given :1; - unsigned BSIM4v7lpvagGiven :1; - unsigned BSIM4v7ldeltaGiven :1; - unsigned BSIM4v7lwrGiven :1; - unsigned BSIM4v7ldwgGiven :1; - unsigned BSIM4v7ldwbGiven :1; - unsigned BSIM4v7lb0Given :1; - unsigned BSIM4v7lb1Given :1; - unsigned BSIM4v7lalpha0Given :1; - unsigned BSIM4v7lalpha1Given :1; - unsigned BSIM4v7lbeta0Given :1; - unsigned BSIM4v7lvfbGiven :1; - unsigned BSIM4v7lagidlGiven :1; - unsigned BSIM4v7lbgidlGiven :1; - unsigned BSIM4v7lcgidlGiven :1; - unsigned BSIM4v7legidlGiven :1; - unsigned BSIM4v7lfgidlGiven :1; /* v4.7 New GIDL/GISL */ - unsigned BSIM4v7lkgidlGiven :1; /* v4.7 New GIDL/GISL */ - unsigned BSIM4v7lrgidlGiven :1; /* v4.7 New GIDL/GISL */ - unsigned BSIM4v7lagislGiven :1; - unsigned BSIM4v7lbgislGiven :1; - unsigned BSIM4v7lcgislGiven :1; - unsigned BSIM4v7legislGiven :1; - unsigned BSIM4v7lfgislGiven :1; /* v4.7 New GIDL/GISL */ - unsigned BSIM4v7lkgislGiven :1; /* v4.7 New GIDL/GISL */ - unsigned BSIM4v7lrgislGiven :1; /* v4.7 New GIDL/GISL */ - unsigned BSIM4v7laigcGiven :1; - unsigned BSIM4v7lbigcGiven :1; - unsigned BSIM4v7lcigcGiven :1; - unsigned BSIM4v7laigsdGiven :1; - unsigned BSIM4v7lbigsdGiven :1; - unsigned BSIM4v7lcigsdGiven :1; - unsigned BSIM4v7laigsGiven :1; - unsigned BSIM4v7lbigsGiven :1; - unsigned BSIM4v7lcigsGiven :1; - unsigned BSIM4v7laigdGiven :1; - unsigned BSIM4v7lbigdGiven :1; - unsigned BSIM4v7lcigdGiven :1; - unsigned BSIM4v7laigbaccGiven :1; - unsigned BSIM4v7lbigbaccGiven :1; - unsigned BSIM4v7lcigbaccGiven :1; - unsigned BSIM4v7laigbinvGiven :1; - unsigned BSIM4v7lbigbinvGiven :1; - unsigned BSIM4v7lcigbinvGiven :1; - unsigned BSIM4v7lnigcGiven :1; - unsigned BSIM4v7lnigbinvGiven :1; - unsigned BSIM4v7lnigbaccGiven :1; - unsigned BSIM4v7lntoxGiven :1; - unsigned BSIM4v7leigbinvGiven :1; - unsigned BSIM4v7lpigcdGiven :1; - unsigned BSIM4v7lpoxedgeGiven :1; - unsigned BSIM4v7lxrcrg1Given :1; - unsigned BSIM4v7lxrcrg2Given :1; - unsigned BSIM4v7llambdaGiven :1; - unsigned BSIM4v7lvtlGiven :1; - unsigned BSIM4v7lxnGiven :1; - unsigned BSIM4v7lvfbsdoffGiven :1; - unsigned BSIM4v7ltvfbsdoffGiven :1; - - /* CV model */ - unsigned BSIM4v7lcgslGiven :1; - unsigned BSIM4v7lcgdlGiven :1; - unsigned BSIM4v7lckappasGiven :1; - unsigned BSIM4v7lckappadGiven :1; - unsigned BSIM4v7lcfGiven :1; - unsigned BSIM4v7lclcGiven :1; - unsigned BSIM4v7lcleGiven :1; - unsigned BSIM4v7lvfbcvGiven :1; - unsigned BSIM4v7lnoffGiven :1; - unsigned BSIM4v7lvoffcvGiven :1; - unsigned BSIM4v7lacdeGiven :1; - unsigned BSIM4v7lmoinGiven :1; - - /* Width dependence */ - unsigned BSIM4v7wcdscGiven :1; - unsigned BSIM4v7wcdscbGiven :1; - unsigned BSIM4v7wcdscdGiven :1; - unsigned BSIM4v7wcitGiven :1; - unsigned BSIM4v7wnfactorGiven :1; - unsigned BSIM4v7wxjGiven :1; - unsigned BSIM4v7wvsatGiven :1; - unsigned BSIM4v7watGiven :1; - unsigned BSIM4v7wa0Given :1; - unsigned BSIM4v7wagsGiven :1; - unsigned BSIM4v7wa1Given :1; - unsigned BSIM4v7wa2Given :1; - unsigned BSIM4v7wketaGiven :1; - unsigned BSIM4v7wnsubGiven :1; - unsigned BSIM4v7wndepGiven :1; - unsigned BSIM4v7wnsdGiven :1; - unsigned BSIM4v7wphinGiven :1; - unsigned BSIM4v7wngateGiven :1; - unsigned BSIM4v7wgamma1Given :1; - unsigned BSIM4v7wgamma2Given :1; - unsigned BSIM4v7wvbxGiven :1; - unsigned BSIM4v7wvbmGiven :1; - unsigned BSIM4v7wxtGiven :1; - unsigned BSIM4v7wk1Given :1; - unsigned BSIM4v7wkt1Given :1; - unsigned BSIM4v7wkt1lGiven :1; - unsigned BSIM4v7wkt2Given :1; - unsigned BSIM4v7wk2Given :1; - unsigned BSIM4v7wk3Given :1; - unsigned BSIM4v7wk3bGiven :1; - unsigned BSIM4v7ww0Given :1; - unsigned BSIM4v7wdvtp0Given :1; - unsigned BSIM4v7wdvtp1Given :1; - unsigned BSIM4v7wdvtp2Given :1; /* New DIBL/Rout */ - unsigned BSIM4v7wdvtp3Given :1; - unsigned BSIM4v7wdvtp4Given :1; - unsigned BSIM4v7wdvtp5Given :1; - unsigned BSIM4v7wlpe0Given :1; - unsigned BSIM4v7wlpebGiven :1; - unsigned BSIM4v7wdvt0Given :1; - unsigned BSIM4v7wdvt1Given :1; - unsigned BSIM4v7wdvt2Given :1; - unsigned BSIM4v7wdvt0wGiven :1; - unsigned BSIM4v7wdvt1wGiven :1; - unsigned BSIM4v7wdvt2wGiven :1; - unsigned BSIM4v7wdroutGiven :1; - unsigned BSIM4v7wdsubGiven :1; - unsigned BSIM4v7wvth0Given :1; - unsigned BSIM4v7wuaGiven :1; - unsigned BSIM4v7wua1Given :1; - unsigned BSIM4v7wubGiven :1; - unsigned BSIM4v7wub1Given :1; - unsigned BSIM4v7wucGiven :1; - unsigned BSIM4v7wuc1Given :1; - unsigned BSIM4v7wudGiven :1; - unsigned BSIM4v7wud1Given :1; - unsigned BSIM4v7wupGiven :1; - unsigned BSIM4v7wlpGiven :1; - unsigned BSIM4v7wu0Given :1; - unsigned BSIM4v7weuGiven :1; - unsigned BSIM4v7wucsGiven :1; - unsigned BSIM4v7wuteGiven :1; - unsigned BSIM4v7wucsteGiven :1; - unsigned BSIM4v7wvoffGiven :1; - unsigned BSIM4v7wtvoffGiven :1; - unsigned BSIM4v7wtnfactorGiven :1; /* v4.7 Temp dep of leakage current */ - unsigned BSIM4v7wteta0Given :1; /* v4.7 temp dep of leakage current */ - unsigned BSIM4v7wtvoffcvGiven :1; /* v4.7 temp dep of leakage current */ - unsigned BSIM4v7wminvGiven :1; - unsigned BSIM4v7wminvcvGiven :1; - unsigned BSIM4v7wrdswGiven :1; - unsigned BSIM4v7wrswGiven :1; - unsigned BSIM4v7wrdwGiven :1; - unsigned BSIM4v7wprwgGiven :1; - unsigned BSIM4v7wprwbGiven :1; - unsigned BSIM4v7wprtGiven :1; - unsigned BSIM4v7weta0Given :1; - unsigned BSIM4v7wetabGiven :1; - unsigned BSIM4v7wpclmGiven :1; - unsigned BSIM4v7wpdibl1Given :1; - unsigned BSIM4v7wpdibl2Given :1; - unsigned BSIM4v7wpdiblbGiven :1; - unsigned BSIM4v7wfproutGiven :1; - unsigned BSIM4v7wpditsGiven :1; - unsigned BSIM4v7wpditsdGiven :1; - unsigned BSIM4v7wpscbe1Given :1; - unsigned BSIM4v7wpscbe2Given :1; - unsigned BSIM4v7wpvagGiven :1; - unsigned BSIM4v7wdeltaGiven :1; - unsigned BSIM4v7wwrGiven :1; - unsigned BSIM4v7wdwgGiven :1; - unsigned BSIM4v7wdwbGiven :1; - unsigned BSIM4v7wb0Given :1; - unsigned BSIM4v7wb1Given :1; - unsigned BSIM4v7walpha0Given :1; - unsigned BSIM4v7walpha1Given :1; - unsigned BSIM4v7wbeta0Given :1; - unsigned BSIM4v7wvfbGiven :1; - unsigned BSIM4v7wagidlGiven :1; - unsigned BSIM4v7wbgidlGiven :1; - unsigned BSIM4v7wcgidlGiven :1; - unsigned BSIM4v7wegidlGiven :1; - unsigned BSIM4v7wfgidlGiven :1; /* v4.7 New GIDL/GISL */ - unsigned BSIM4v7wkgidlGiven :1; /* v4.7 New GIDL/GISL */ - unsigned BSIM4v7wrgidlGiven :1; /* v4.7 New GIDL/GISL */ - unsigned BSIM4v7wagislGiven :1; - unsigned BSIM4v7wbgislGiven :1; - unsigned BSIM4v7wcgislGiven :1; - unsigned BSIM4v7wegislGiven :1; - unsigned BSIM4v7wfgislGiven :1; /* v4.7 New GIDL/GISL */ - unsigned BSIM4v7wkgislGiven :1; /* v4.7 New GIDL/GISL */ - unsigned BSIM4v7wrgislGiven :1; /* v4.7 New GIDL/GISL */ - unsigned BSIM4v7waigcGiven :1; - unsigned BSIM4v7wbigcGiven :1; - unsigned BSIM4v7wcigcGiven :1; - unsigned BSIM4v7waigsdGiven :1; - unsigned BSIM4v7wbigsdGiven :1; - unsigned BSIM4v7wcigsdGiven :1; - unsigned BSIM4v7waigsGiven :1; - unsigned BSIM4v7wbigsGiven :1; - unsigned BSIM4v7wcigsGiven :1; - unsigned BSIM4v7waigdGiven :1; - unsigned BSIM4v7wbigdGiven :1; - unsigned BSIM4v7wcigdGiven :1; - unsigned BSIM4v7waigbaccGiven :1; - unsigned BSIM4v7wbigbaccGiven :1; - unsigned BSIM4v7wcigbaccGiven :1; - unsigned BSIM4v7waigbinvGiven :1; - unsigned BSIM4v7wbigbinvGiven :1; - unsigned BSIM4v7wcigbinvGiven :1; - unsigned BSIM4v7wnigcGiven :1; - unsigned BSIM4v7wnigbinvGiven :1; - unsigned BSIM4v7wnigbaccGiven :1; - unsigned BSIM4v7wntoxGiven :1; - unsigned BSIM4v7weigbinvGiven :1; - unsigned BSIM4v7wpigcdGiven :1; - unsigned BSIM4v7wpoxedgeGiven :1; - unsigned BSIM4v7wxrcrg1Given :1; - unsigned BSIM4v7wxrcrg2Given :1; - unsigned BSIM4v7wlambdaGiven :1; - unsigned BSIM4v7wvtlGiven :1; - unsigned BSIM4v7wxnGiven :1; - unsigned BSIM4v7wvfbsdoffGiven :1; - unsigned BSIM4v7wtvfbsdoffGiven :1; - - /* CV model */ - unsigned BSIM4v7wcgslGiven :1; - unsigned BSIM4v7wcgdlGiven :1; - unsigned BSIM4v7wckappasGiven :1; - unsigned BSIM4v7wckappadGiven :1; - unsigned BSIM4v7wcfGiven :1; - unsigned BSIM4v7wclcGiven :1; - unsigned BSIM4v7wcleGiven :1; - unsigned BSIM4v7wvfbcvGiven :1; - unsigned BSIM4v7wnoffGiven :1; - unsigned BSIM4v7wvoffcvGiven :1; - unsigned BSIM4v7wacdeGiven :1; - unsigned BSIM4v7wmoinGiven :1; - - /* Cross-term dependence */ - unsigned BSIM4v7pcdscGiven :1; - unsigned BSIM4v7pcdscbGiven :1; - unsigned BSIM4v7pcdscdGiven :1; - unsigned BSIM4v7pcitGiven :1; - unsigned BSIM4v7pnfactorGiven :1; - unsigned BSIM4v7pxjGiven :1; - unsigned BSIM4v7pvsatGiven :1; - unsigned BSIM4v7patGiven :1; - unsigned BSIM4v7pa0Given :1; - unsigned BSIM4v7pagsGiven :1; - unsigned BSIM4v7pa1Given :1; - unsigned BSIM4v7pa2Given :1; - unsigned BSIM4v7pketaGiven :1; - unsigned BSIM4v7pnsubGiven :1; - unsigned BSIM4v7pndepGiven :1; - unsigned BSIM4v7pnsdGiven :1; - unsigned BSIM4v7pphinGiven :1; - unsigned BSIM4v7pngateGiven :1; - unsigned BSIM4v7pgamma1Given :1; - unsigned BSIM4v7pgamma2Given :1; - unsigned BSIM4v7pvbxGiven :1; - unsigned BSIM4v7pvbmGiven :1; - unsigned BSIM4v7pxtGiven :1; - unsigned BSIM4v7pk1Given :1; - unsigned BSIM4v7pkt1Given :1; - unsigned BSIM4v7pkt1lGiven :1; - unsigned BSIM4v7pkt2Given :1; - unsigned BSIM4v7pk2Given :1; - unsigned BSIM4v7pk3Given :1; - unsigned BSIM4v7pk3bGiven :1; - unsigned BSIM4v7pw0Given :1; - unsigned BSIM4v7pdvtp0Given :1; - unsigned BSIM4v7pdvtp1Given :1; - unsigned BSIM4v7pdvtp2Given :1; /* New DIBL/Rout */ - unsigned BSIM4v7pdvtp3Given :1; - unsigned BSIM4v7pdvtp4Given :1; - unsigned BSIM4v7pdvtp5Given :1; - unsigned BSIM4v7plpe0Given :1; - unsigned BSIM4v7plpebGiven :1; - unsigned BSIM4v7pdvt0Given :1; - unsigned BSIM4v7pdvt1Given :1; - unsigned BSIM4v7pdvt2Given :1; - unsigned BSIM4v7pdvt0wGiven :1; - unsigned BSIM4v7pdvt1wGiven :1; - unsigned BSIM4v7pdvt2wGiven :1; - unsigned BSIM4v7pdroutGiven :1; - unsigned BSIM4v7pdsubGiven :1; - unsigned BSIM4v7pvth0Given :1; - unsigned BSIM4v7puaGiven :1; - unsigned BSIM4v7pua1Given :1; - unsigned BSIM4v7pubGiven :1; - unsigned BSIM4v7pub1Given :1; - unsigned BSIM4v7pucGiven :1; - unsigned BSIM4v7puc1Given :1; - unsigned BSIM4v7pudGiven :1; - unsigned BSIM4v7pud1Given :1; - unsigned BSIM4v7pupGiven :1; - unsigned BSIM4v7plpGiven :1; - unsigned BSIM4v7pu0Given :1; - unsigned BSIM4v7peuGiven :1; - unsigned BSIM4v7pucsGiven :1; - unsigned BSIM4v7puteGiven :1; - unsigned BSIM4v7pucsteGiven :1; - unsigned BSIM4v7pvoffGiven :1; - unsigned BSIM4v7ptvoffGiven :1; - unsigned BSIM4v7ptnfactorGiven :1; /* v4.7 Temp dep of leakage current */ - unsigned BSIM4v7pteta0Given :1; /* v4.7 temp dep of leakage current */ - unsigned BSIM4v7ptvoffcvGiven :1; /* v4.7 temp dep of leakage current */ - unsigned BSIM4v7pminvGiven :1; - unsigned BSIM4v7pminvcvGiven :1; - unsigned BSIM4v7prdswGiven :1; - unsigned BSIM4v7prswGiven :1; - unsigned BSIM4v7prdwGiven :1; - unsigned BSIM4v7pprwgGiven :1; - unsigned BSIM4v7pprwbGiven :1; - unsigned BSIM4v7pprtGiven :1; - unsigned BSIM4v7peta0Given :1; - unsigned BSIM4v7petabGiven :1; - unsigned BSIM4v7ppclmGiven :1; - unsigned BSIM4v7ppdibl1Given :1; - unsigned BSIM4v7ppdibl2Given :1; - unsigned BSIM4v7ppdiblbGiven :1; - unsigned BSIM4v7pfproutGiven :1; - unsigned BSIM4v7ppditsGiven :1; - unsigned BSIM4v7ppditsdGiven :1; - unsigned BSIM4v7ppscbe1Given :1; - unsigned BSIM4v7ppscbe2Given :1; - unsigned BSIM4v7ppvagGiven :1; - unsigned BSIM4v7pdeltaGiven :1; - unsigned BSIM4v7pwrGiven :1; - unsigned BSIM4v7pdwgGiven :1; - unsigned BSIM4v7pdwbGiven :1; - unsigned BSIM4v7pb0Given :1; - unsigned BSIM4v7pb1Given :1; - unsigned BSIM4v7palpha0Given :1; - unsigned BSIM4v7palpha1Given :1; - unsigned BSIM4v7pbeta0Given :1; - unsigned BSIM4v7pvfbGiven :1; - unsigned BSIM4v7pagidlGiven :1; - unsigned BSIM4v7pbgidlGiven :1; - unsigned BSIM4v7pcgidlGiven :1; - unsigned BSIM4v7pegidlGiven :1; - unsigned BSIM4v7pfgidlGiven :1; /* v4.7 New GIDL/GISL */ - unsigned BSIM4v7pkgidlGiven :1; /* v4.7 New GIDL/GISL */ - unsigned BSIM4v7prgidlGiven :1; /* v4.7 New GIDL/GISL */ - unsigned BSIM4v7pagislGiven :1; - unsigned BSIM4v7pbgislGiven :1; - unsigned BSIM4v7pcgislGiven :1; - unsigned BSIM4v7pegislGiven :1; - unsigned BSIM4v7pfgislGiven :1; /* v4.7 New GIDL/GISL */ - unsigned BSIM4v7pkgislGiven :1; /* v4.7 New GIDL/GISL */ - unsigned BSIM4v7prgislGiven :1; /* v4.7 New GIDL/GISL */ - unsigned BSIM4v7paigcGiven :1; - unsigned BSIM4v7pbigcGiven :1; - unsigned BSIM4v7pcigcGiven :1; - unsigned BSIM4v7paigsdGiven :1; - unsigned BSIM4v7pbigsdGiven :1; - unsigned BSIM4v7pcigsdGiven :1; - unsigned BSIM4v7paigsGiven :1; - unsigned BSIM4v7pbigsGiven :1; - unsigned BSIM4v7pcigsGiven :1; - unsigned BSIM4v7paigdGiven :1; - unsigned BSIM4v7pbigdGiven :1; - unsigned BSIM4v7pcigdGiven :1; - unsigned BSIM4v7paigbaccGiven :1; - unsigned BSIM4v7pbigbaccGiven :1; - unsigned BSIM4v7pcigbaccGiven :1; - unsigned BSIM4v7paigbinvGiven :1; - unsigned BSIM4v7pbigbinvGiven :1; - unsigned BSIM4v7pcigbinvGiven :1; - unsigned BSIM4v7pnigcGiven :1; - unsigned BSIM4v7pnigbinvGiven :1; - unsigned BSIM4v7pnigbaccGiven :1; - unsigned BSIM4v7pntoxGiven :1; - unsigned BSIM4v7peigbinvGiven :1; - unsigned BSIM4v7ppigcdGiven :1; - unsigned BSIM4v7ppoxedgeGiven :1; - unsigned BSIM4v7pxrcrg1Given :1; - unsigned BSIM4v7pxrcrg2Given :1; - unsigned BSIM4v7plambdaGiven :1; - unsigned BSIM4v7pvtlGiven :1; - unsigned BSIM4v7pxnGiven :1; - unsigned BSIM4v7pvfbsdoffGiven :1; - unsigned BSIM4v7ptvfbsdoffGiven :1; - - /* CV model */ - unsigned BSIM4v7pcgslGiven :1; - unsigned BSIM4v7pcgdlGiven :1; - unsigned BSIM4v7pckappasGiven :1; - unsigned BSIM4v7pckappadGiven :1; - unsigned BSIM4v7pcfGiven :1; - unsigned BSIM4v7pclcGiven :1; - unsigned BSIM4v7pcleGiven :1; - unsigned BSIM4v7pvfbcvGiven :1; - unsigned BSIM4v7pnoffGiven :1; - unsigned BSIM4v7pvoffcvGiven :1; - unsigned BSIM4v7pacdeGiven :1; - unsigned BSIM4v7pmoinGiven :1; - - unsigned BSIM4v7useFringeGiven :1; - - unsigned BSIM4v7tnomGiven :1; - unsigned BSIM4v7cgsoGiven :1; - unsigned BSIM4v7cgdoGiven :1; - unsigned BSIM4v7cgboGiven :1; - unsigned BSIM4v7xpartGiven :1; - unsigned BSIM4v7sheetResistanceGiven :1; - - unsigned BSIM4v7SjctSatCurDensityGiven :1; - unsigned BSIM4v7SjctSidewallSatCurDensityGiven :1; - unsigned BSIM4v7SjctGateSidewallSatCurDensityGiven :1; - unsigned BSIM4v7SbulkJctPotentialGiven :1; - unsigned BSIM4v7SbulkJctBotGradingCoeffGiven :1; - unsigned BSIM4v7SsidewallJctPotentialGiven :1; - unsigned BSIM4v7SGatesidewallJctPotentialGiven :1; - unsigned BSIM4v7SbulkJctSideGradingCoeffGiven :1; - unsigned BSIM4v7SunitAreaJctCapGiven :1; - unsigned BSIM4v7SunitLengthSidewallJctCapGiven :1; - unsigned BSIM4v7SbulkJctGateSideGradingCoeffGiven :1; - unsigned BSIM4v7SunitLengthGateSidewallJctCapGiven :1; - unsigned BSIM4v7SjctEmissionCoeffGiven :1; - unsigned BSIM4v7SjctTempExponentGiven :1; - - unsigned BSIM4v7DjctSatCurDensityGiven :1; - unsigned BSIM4v7DjctSidewallSatCurDensityGiven :1; - unsigned BSIM4v7DjctGateSidewallSatCurDensityGiven :1; - unsigned BSIM4v7DbulkJctPotentialGiven :1; - unsigned BSIM4v7DbulkJctBotGradingCoeffGiven :1; - unsigned BSIM4v7DsidewallJctPotentialGiven :1; - unsigned BSIM4v7DGatesidewallJctPotentialGiven :1; - unsigned BSIM4v7DbulkJctSideGradingCoeffGiven :1; - unsigned BSIM4v7DunitAreaJctCapGiven :1; - unsigned BSIM4v7DunitLengthSidewallJctCapGiven :1; - unsigned BSIM4v7DbulkJctGateSideGradingCoeffGiven :1; - unsigned BSIM4v7DunitLengthGateSidewallJctCapGiven :1; - unsigned BSIM4v7DjctEmissionCoeffGiven :1; - unsigned BSIM4v7DjctTempExponentGiven :1; - - unsigned BSIM4v7oxideTrapDensityAGiven :1; - unsigned BSIM4v7oxideTrapDensityBGiven :1; - unsigned BSIM4v7oxideTrapDensityCGiven :1; - unsigned BSIM4v7emGiven :1; - unsigned BSIM4v7efGiven :1; - unsigned BSIM4v7afGiven :1; - unsigned BSIM4v7kfGiven :1; - - unsigned BSIM4v7vgsMaxGiven :1; - unsigned BSIM4v7vgdMaxGiven :1; - unsigned BSIM4v7vgbMaxGiven :1; - unsigned BSIM4v7vdsMaxGiven :1; - unsigned BSIM4v7vbsMaxGiven :1; - unsigned BSIM4v7vbdMaxGiven :1; - unsigned BSIM4v7vgsrMaxGiven :1; - unsigned BSIM4v7vgdrMaxGiven :1; - unsigned BSIM4v7vgbrMaxGiven :1; - unsigned BSIM4v7vbsrMaxGiven :1; - unsigned BSIM4v7vbdrMaxGiven :1; - - unsigned BSIM4v7LintGiven :1; - unsigned BSIM4v7LlGiven :1; - unsigned BSIM4v7LlcGiven :1; - unsigned BSIM4v7LlnGiven :1; - unsigned BSIM4v7LwGiven :1; - unsigned BSIM4v7LwcGiven :1; - unsigned BSIM4v7LwnGiven :1; - unsigned BSIM4v7LwlGiven :1; - unsigned BSIM4v7LwlcGiven :1; - unsigned BSIM4v7LminGiven :1; - unsigned BSIM4v7LmaxGiven :1; - - unsigned BSIM4v7WintGiven :1; - unsigned BSIM4v7WlGiven :1; - unsigned BSIM4v7WlcGiven :1; - unsigned BSIM4v7WlnGiven :1; - unsigned BSIM4v7WwGiven :1; - unsigned BSIM4v7WwcGiven :1; - unsigned BSIM4v7WwnGiven :1; - unsigned BSIM4v7WwlGiven :1; - unsigned BSIM4v7WwlcGiven :1; - unsigned BSIM4v7WminGiven :1; - unsigned BSIM4v7WmaxGiven :1; - - /* added for stress effect */ - unsigned BSIM4v7sarefGiven :1; - unsigned BSIM4v7sbrefGiven :1; - unsigned BSIM4v7wlodGiven :1; - unsigned BSIM4v7ku0Given :1; - unsigned BSIM4v7kvsatGiven :1; - unsigned BSIM4v7kvth0Given :1; - unsigned BSIM4v7tku0Given :1; - unsigned BSIM4v7llodku0Given :1; - unsigned BSIM4v7wlodku0Given :1; - unsigned BSIM4v7llodvthGiven :1; - unsigned BSIM4v7wlodvthGiven :1; - unsigned BSIM4v7lku0Given :1; - unsigned BSIM4v7wku0Given :1; - unsigned BSIM4v7pku0Given :1; - unsigned BSIM4v7lkvth0Given :1; - unsigned BSIM4v7wkvth0Given :1; - unsigned BSIM4v7pkvth0Given :1; - unsigned BSIM4v7stk2Given :1; - unsigned BSIM4v7lodk2Given :1; - unsigned BSIM4v7steta0Given :1; - unsigned BSIM4v7lodeta0Given :1; - - unsigned BSIM4v7webGiven :1; - unsigned BSIM4v7wecGiven :1; - unsigned BSIM4v7kvth0weGiven :1; - unsigned BSIM4v7k2weGiven :1; - unsigned BSIM4v7ku0weGiven :1; - unsigned BSIM4v7screfGiven :1; - unsigned BSIM4v7wpemodGiven :1; - unsigned BSIM4v7lkvth0weGiven :1; - unsigned BSIM4v7lk2weGiven :1; - unsigned BSIM4v7lku0weGiven :1; - unsigned BSIM4v7wkvth0weGiven :1; - unsigned BSIM4v7wk2weGiven :1; - unsigned BSIM4v7wku0weGiven :1; - unsigned BSIM4v7pkvth0weGiven :1; - unsigned BSIM4v7pk2weGiven :1; - unsigned BSIM4v7pku0weGiven :1; - - -} BSIM4v7model; - - -#ifndef NMOS -#define NMOS 1 -#define PMOS -1 -#endif /*NMOS*/ - - -/* Instance parameters */ -#define BSIM4v7_W 1 -#define BSIM4v7_L 2 -#define BSIM4v7_AS 3 -#define BSIM4v7_AD 4 -#define BSIM4v7_PS 5 -#define BSIM4v7_PD 6 -#define BSIM4v7_NRS 7 -#define BSIM4v7_NRD 8 -#define BSIM4v7_OFF 9 -#define BSIM4v7_IC 10 -#define BSIM4v7_IC_VDS 11 -#define BSIM4v7_IC_VGS 12 -#define BSIM4v7_IC_VBS 13 -#define BSIM4v7_TRNQSMOD 14 -#define BSIM4v7_RBODYMOD 15 -#define BSIM4v7_RGATEMOD 16 -#define BSIM4v7_GEOMOD 17 -#define BSIM4v7_RGEOMOD 18 -#define BSIM4v7_NF 19 -#define BSIM4v7_MIN 20 -#define BSIM4v7_ACNQSMOD 22 -#define BSIM4v7_RBDB 23 -#define BSIM4v7_RBSB 24 -#define BSIM4v7_RBPB 25 -#define BSIM4v7_RBPS 26 -#define BSIM4v7_RBPD 27 -#define BSIM4v7_SA 28 -#define BSIM4v7_SB 29 -#define BSIM4v7_SD 30 -#define BSIM4v7_DELVTO 31 -#define BSIM4v7_XGW 32 -#define BSIM4v7_NGCON 33 -#define BSIM4v7_SCA 34 -#define BSIM4v7_SCB 35 -#define BSIM4v7_SCC 36 -#define BSIM4v7_SC 37 -#define BSIM4v7_M 38 -#define BSIM4v7_MULU0 39 -#define BSIM4v7_WNFLAG 40 - -/* Global parameters */ -#define BSIM4v7_MOD_TEMPEOT 65 -#define BSIM4v7_MOD_LEFFEOT 66 -#define BSIM4v7_MOD_WEFFEOT 67 -#define BSIM4v7_MOD_UCSTE 68 -#define BSIM4v7_MOD_LUCSTE 69 -#define BSIM4v7_MOD_WUCSTE 70 -#define BSIM4v7_MOD_PUCSTE 71 -#define BSIM4v7_MOD_UCS 72 -#define BSIM4v7_MOD_LUCS 73 -#define BSIM4v7_MOD_WUCS 74 -#define BSIM4v7_MOD_PUCS 75 -#define BSIM4v7_MOD_CVCHARGEMOD 76 -#define BSIM4v7_MOD_ADOS 77 -#define BSIM4v7_MOD_BDOS 78 -#define BSIM4v7_MOD_TEMPMOD 79 -#define BSIM4v7_MOD_MTRLMOD 80 -#define BSIM4v7_MOD_IGCMOD 81 -#define BSIM4v7_MOD_IGBMOD 82 -#define BSIM4v7_MOD_ACNQSMOD 83 -#define BSIM4v7_MOD_FNOIMOD 84 -#define BSIM4v7_MOD_RDSMOD 85 -#define BSIM4v7_MOD_DIOMOD 86 -#define BSIM4v7_MOD_PERMOD 87 -#define BSIM4v7_MOD_GEOMOD 88 -#define BSIM4v7_MOD_RGEOMOD 89 -#define BSIM4v7_MOD_RGATEMOD 90 -#define BSIM4v7_MOD_RBODYMOD 91 -#define BSIM4v7_MOD_CAPMOD 92 -#define BSIM4v7_MOD_TRNQSMOD 93 -#define BSIM4v7_MOD_MOBMOD 94 -#define BSIM4v7_MOD_TNOIMOD 95 -#define BSIM4v7_MOD_EOT 96 -#define BSIM4v7_MOD_VDDEOT 97 -#define BSIM4v7_MOD_TOXE 98 -#define BSIM4v7_MOD_CDSC 99 -#define BSIM4v7_MOD_CDSCB 100 -#define BSIM4v7_MOD_CIT 101 -#define BSIM4v7_MOD_NFACTOR 102 -#define BSIM4v7_MOD_XJ 103 -#define BSIM4v7_MOD_VSAT 104 -#define BSIM4v7_MOD_AT 105 -#define BSIM4v7_MOD_A0 106 -#define BSIM4v7_MOD_A1 107 -#define BSIM4v7_MOD_A2 108 -#define BSIM4v7_MOD_KETA 109 -#define BSIM4v7_MOD_NSUB 110 -#define BSIM4v7_MOD_PHIG 111 -#define BSIM4v7_MOD_EPSRGATE 112 -#define BSIM4v7_MOD_EASUB 113 -#define BSIM4v7_MOD_EPSRSUB 114 -#define BSIM4v7_MOD_NI0SUB 115 -#define BSIM4v7_MOD_BG0SUB 116 -#define BSIM4v7_MOD_TBGASUB 117 -#define BSIM4v7_MOD_TBGBSUB 118 -#define BSIM4v7_MOD_NDEP 119 -#define BSIM4v7_MOD_NGATE 120 -#define BSIM4v7_MOD_GAMMA1 121 -#define BSIM4v7_MOD_GAMMA2 122 -#define BSIM4v7_MOD_VBX 123 -#define BSIM4v7_MOD_BINUNIT 124 -#define BSIM4v7_MOD_VBM 125 -#define BSIM4v7_MOD_XT 126 -#define BSIM4v7_MOD_K1 129 -#define BSIM4v7_MOD_KT1 130 -#define BSIM4v7_MOD_KT1L 131 -#define BSIM4v7_MOD_K2 132 -#define BSIM4v7_MOD_KT2 133 -#define BSIM4v7_MOD_K3 134 -#define BSIM4v7_MOD_K3B 135 -#define BSIM4v7_MOD_W0 136 -#define BSIM4v7_MOD_LPE0 137 -#define BSIM4v7_MOD_DVT0 138 -#define BSIM4v7_MOD_DVT1 139 -#define BSIM4v7_MOD_DVT2 140 -#define BSIM4v7_MOD_DVT0W 141 -#define BSIM4v7_MOD_DVT1W 142 -#define BSIM4v7_MOD_DVT2W 143 -#define BSIM4v7_MOD_DROUT 144 -#define BSIM4v7_MOD_DSUB 145 -#define BSIM4v7_MOD_VTH0 146 -#define BSIM4v7_MOD_UA 147 -#define BSIM4v7_MOD_UA1 148 -#define BSIM4v7_MOD_UB 149 -#define BSIM4v7_MOD_UB1 150 -#define BSIM4v7_MOD_UC 151 -#define BSIM4v7_MOD_UC1 152 -#define BSIM4v7_MOD_U0 153 -#define BSIM4v7_MOD_UTE 154 -#define BSIM4v7_MOD_VOFF 155 -#define BSIM4v7_MOD_DELTA 156 -#define BSIM4v7_MOD_RDSW 157 -#define BSIM4v7_MOD_PRT 158 -#define BSIM4v7_MOD_LDD 159 -#define BSIM4v7_MOD_ETA 160 -#define BSIM4v7_MOD_ETA0 161 -#define BSIM4v7_MOD_ETAB 162 -#define BSIM4v7_MOD_PCLM 163 -#define BSIM4v7_MOD_PDIBL1 164 -#define BSIM4v7_MOD_PDIBL2 165 -#define BSIM4v7_MOD_PSCBE1 166 -#define BSIM4v7_MOD_PSCBE2 167 -#define BSIM4v7_MOD_PVAG 168 -#define BSIM4v7_MOD_WR 169 -#define BSIM4v7_MOD_DWG 170 -#define BSIM4v7_MOD_DWB 171 -#define BSIM4v7_MOD_B0 172 -#define BSIM4v7_MOD_B1 173 -#define BSIM4v7_MOD_ALPHA0 174 -#define BSIM4v7_MOD_BETA0 175 -#define BSIM4v7_MOD_PDIBLB 178 -#define BSIM4v7_MOD_PRWG 179 -#define BSIM4v7_MOD_PRWB 180 -#define BSIM4v7_MOD_CDSCD 181 -#define BSIM4v7_MOD_AGS 182 -#define BSIM4v7_MOD_FRINGE 184 -#define BSIM4v7_MOD_CGSL 186 -#define BSIM4v7_MOD_CGDL 187 -#define BSIM4v7_MOD_CKAPPAS 188 -#define BSIM4v7_MOD_CF 189 -#define BSIM4v7_MOD_CLC 190 -#define BSIM4v7_MOD_CLE 191 -#define BSIM4v7_MOD_PARAMCHK 192 -#define BSIM4v7_MOD_VERSION 193 -#define BSIM4v7_MOD_VFBCV 194 -#define BSIM4v7_MOD_ACDE 195 -#define BSIM4v7_MOD_MOIN 196 -#define BSIM4v7_MOD_NOFF 197 -#define BSIM4v7_MOD_IJTHDFWD 198 -#define BSIM4v7_MOD_ALPHA1 199 -#define BSIM4v7_MOD_VFB 200 -#define BSIM4v7_MOD_TOXM 201 -#define BSIM4v7_MOD_TCJ 202 -#define BSIM4v7_MOD_TCJSW 203 -#define BSIM4v7_MOD_TCJSWG 204 -#define BSIM4v7_MOD_TPB 205 -#define BSIM4v7_MOD_TPBSW 206 -#define BSIM4v7_MOD_TPBSWG 207 -#define BSIM4v7_MOD_VOFFCV 208 -#define BSIM4v7_MOD_GBMIN 209 -#define BSIM4v7_MOD_RBDB 210 -#define BSIM4v7_MOD_RBSB 211 -#define BSIM4v7_MOD_RBPB 212 -#define BSIM4v7_MOD_RBPS 213 -#define BSIM4v7_MOD_RBPD 214 -#define BSIM4v7_MOD_DMCG 215 -#define BSIM4v7_MOD_DMCI 216 -#define BSIM4v7_MOD_DMDG 217 -#define BSIM4v7_MOD_XGW 218 -#define BSIM4v7_MOD_XGL 219 -#define BSIM4v7_MOD_RSHG 220 -#define BSIM4v7_MOD_NGCON 221 -#define BSIM4v7_MOD_AGIDL 222 -#define BSIM4v7_MOD_BGIDL 223 -#define BSIM4v7_MOD_EGIDL 224 -#define BSIM4v7_MOD_IJTHSFWD 225 -#define BSIM4v7_MOD_XJBVD 226 -#define BSIM4v7_MOD_XJBVS 227 -#define BSIM4v7_MOD_BVD 228 -#define BSIM4v7_MOD_BVS 229 -#define BSIM4v7_MOD_TOXP 230 -#define BSIM4v7_MOD_DTOX 231 -#define BSIM4v7_MOD_XRCRG1 232 -#define BSIM4v7_MOD_XRCRG2 233 -#define BSIM4v7_MOD_EU 234 -#define BSIM4v7_MOD_IJTHSREV 235 -#define BSIM4v7_MOD_IJTHDREV 236 -#define BSIM4v7_MOD_MINV 237 -#define BSIM4v7_MOD_VOFFL 238 -#define BSIM4v7_MOD_PDITS 239 -#define BSIM4v7_MOD_PDITSD 240 -#define BSIM4v7_MOD_PDITSL 241 -#define BSIM4v7_MOD_TNOIA 242 -#define BSIM4v7_MOD_TNOIB 243 -#define BSIM4v7_MOD_NTNOI 244 -#define BSIM4v7_MOD_FPROUT 245 -#define BSIM4v7_MOD_LPEB 246 -#define BSIM4v7_MOD_DVTP0 247 -#define BSIM4v7_MOD_DVTP1 248 -#define BSIM4v7_MOD_CGIDL 249 -#define BSIM4v7_MOD_PHIN 250 -#define BSIM4v7_MOD_RDSWMIN 251 -#define BSIM4v7_MOD_RSW 252 -#define BSIM4v7_MOD_RDW 253 -#define BSIM4v7_MOD_RDWMIN 254 -#define BSIM4v7_MOD_RSWMIN 255 -#define BSIM4v7_MOD_NSD 256 -#define BSIM4v7_MOD_CKAPPAD 257 -#define BSIM4v7_MOD_DMCGT 258 -#define BSIM4v7_MOD_AIGC 259 -#define BSIM4v7_MOD_BIGC 260 -#define BSIM4v7_MOD_CIGC 261 -#define BSIM4v7_MOD_AIGBACC 262 -#define BSIM4v7_MOD_BIGBACC 263 -#define BSIM4v7_MOD_CIGBACC 264 -#define BSIM4v7_MOD_AIGBINV 265 -#define BSIM4v7_MOD_BIGBINV 266 -#define BSIM4v7_MOD_CIGBINV 267 -#define BSIM4v7_MOD_NIGC 268 -#define BSIM4v7_MOD_NIGBACC 269 -#define BSIM4v7_MOD_NIGBINV 270 -#define BSIM4v7_MOD_NTOX 271 -#define BSIM4v7_MOD_TOXREF 272 -#define BSIM4v7_MOD_EIGBINV 273 -#define BSIM4v7_MOD_PIGCD 274 -#define BSIM4v7_MOD_POXEDGE 275 -#define BSIM4v7_MOD_EPSROX 276 -#define BSIM4v7_MOD_AIGSD 277 -#define BSIM4v7_MOD_BIGSD 278 -#define BSIM4v7_MOD_CIGSD 279 -#define BSIM4v7_MOD_JSWGS 280 -#define BSIM4v7_MOD_JSWGD 281 -#define BSIM4v7_MOD_LAMBDA 282 -#define BSIM4v7_MOD_VTL 283 -#define BSIM4v7_MOD_LC 284 -#define BSIM4v7_MOD_XN 285 -#define BSIM4v7_MOD_RNOIA 286 -#define BSIM4v7_MOD_RNOIB 287 -#define BSIM4v7_MOD_VFBSDOFF 288 -#define BSIM4v7_MOD_LINTNOI 289 -#define BSIM4v7_MOD_UD 290 -#define BSIM4v7_MOD_UD1 291 -#define BSIM4v7_MOD_UP 292 -#define BSIM4v7_MOD_LP 293 -#define BSIM4v7_MOD_TVOFF 294 -#define BSIM4v7_MOD_TVFBSDOFF 295 -#define BSIM4v7_MOD_MINVCV 296 -#define BSIM4v7_MOD_VOFFCVL 297 -#define BSIM4v7_MOD_MTRLCOMPATMOD 380 - -/* Length dependence */ -#define BSIM4v7_MOD_LCDSC 301 -#define BSIM4v7_MOD_LCDSCB 302 -#define BSIM4v7_MOD_LCIT 303 -#define BSIM4v7_MOD_LNFACTOR 304 -#define BSIM4v7_MOD_LXJ 305 -#define BSIM4v7_MOD_LVSAT 306 -#define BSIM4v7_MOD_LAT 307 -#define BSIM4v7_MOD_LA0 308 -#define BSIM4v7_MOD_LA1 309 -#define BSIM4v7_MOD_LA2 310 -#define BSIM4v7_MOD_LKETA 311 -#define BSIM4v7_MOD_LNSUB 312 -#define BSIM4v7_MOD_LNDEP 313 -#define BSIM4v7_MOD_LNGATE 315 -#define BSIM4v7_MOD_LGAMMA1 316 -#define BSIM4v7_MOD_LGAMMA2 317 -#define BSIM4v7_MOD_LVBX 318 -#define BSIM4v7_MOD_LVBM 320 -#define BSIM4v7_MOD_LXT 322 -#define BSIM4v7_MOD_LK1 325 -#define BSIM4v7_MOD_LKT1 326 -#define BSIM4v7_MOD_LKT1L 327 -#define BSIM4v7_MOD_LK2 328 -#define BSIM4v7_MOD_LKT2 329 -#define BSIM4v7_MOD_LK3 330 -#define BSIM4v7_MOD_LK3B 331 -#define BSIM4v7_MOD_LW0 332 -#define BSIM4v7_MOD_LLPE0 333 -#define BSIM4v7_MOD_LDVT0 334 -#define BSIM4v7_MOD_LDVT1 335 -#define BSIM4v7_MOD_LDVT2 336 -#define BSIM4v7_MOD_LDVT0W 337 -#define BSIM4v7_MOD_LDVT1W 338 -#define BSIM4v7_MOD_LDVT2W 339 -#define BSIM4v7_MOD_LDROUT 340 -#define BSIM4v7_MOD_LDSUB 341 -#define BSIM4v7_MOD_LVTH0 342 -#define BSIM4v7_MOD_LUA 343 -#define BSIM4v7_MOD_LUA1 344 -#define BSIM4v7_MOD_LUB 345 -#define BSIM4v7_MOD_LUB1 346 -#define BSIM4v7_MOD_LUC 347 -#define BSIM4v7_MOD_LUC1 348 -#define BSIM4v7_MOD_LU0 349 -#define BSIM4v7_MOD_LUTE 350 -#define BSIM4v7_MOD_LVOFF 351 -#define BSIM4v7_MOD_LDELTA 352 -#define BSIM4v7_MOD_LRDSW 353 -#define BSIM4v7_MOD_LPRT 354 -#define BSIM4v7_MOD_LLDD 355 -#define BSIM4v7_MOD_LETA 356 -#define BSIM4v7_MOD_LETA0 357 -#define BSIM4v7_MOD_LETAB 358 -#define BSIM4v7_MOD_LPCLM 359 -#define BSIM4v7_MOD_LPDIBL1 360 -#define BSIM4v7_MOD_LPDIBL2 361 -#define BSIM4v7_MOD_LPSCBE1 362 -#define BSIM4v7_MOD_LPSCBE2 363 -#define BSIM4v7_MOD_LPVAG 364 -#define BSIM4v7_MOD_LWR 365 -#define BSIM4v7_MOD_LDWG 366 -#define BSIM4v7_MOD_LDWB 367 -#define BSIM4v7_MOD_LB0 368 -#define BSIM4v7_MOD_LB1 369 -#define BSIM4v7_MOD_LALPHA0 370 -#define BSIM4v7_MOD_LBETA0 371 -#define BSIM4v7_MOD_LPDIBLB 374 -#define BSIM4v7_MOD_LPRWG 375 -#define BSIM4v7_MOD_LPRWB 376 -#define BSIM4v7_MOD_LCDSCD 377 -#define BSIM4v7_MOD_LAGS 378 - -#define BSIM4v7_MOD_LFRINGE 381 -#define BSIM4v7_MOD_LCGSL 383 -#define BSIM4v7_MOD_LCGDL 384 -#define BSIM4v7_MOD_LCKAPPAS 385 -#define BSIM4v7_MOD_LCF 386 -#define BSIM4v7_MOD_LCLC 387 -#define BSIM4v7_MOD_LCLE 388 -#define BSIM4v7_MOD_LVFBCV 389 -#define BSIM4v7_MOD_LACDE 390 -#define BSIM4v7_MOD_LMOIN 391 -#define BSIM4v7_MOD_LNOFF 392 -#define BSIM4v7_MOD_LALPHA1 394 -#define BSIM4v7_MOD_LVFB 395 -#define BSIM4v7_MOD_LVOFFCV 396 -#define BSIM4v7_MOD_LAGIDL 397 -#define BSIM4v7_MOD_LBGIDL 398 -#define BSIM4v7_MOD_LEGIDL 399 -#define BSIM4v7_MOD_LXRCRG1 400 -#define BSIM4v7_MOD_LXRCRG2 401 -#define BSIM4v7_MOD_LEU 402 -#define BSIM4v7_MOD_LMINV 403 -#define BSIM4v7_MOD_LPDITS 404 -#define BSIM4v7_MOD_LPDITSD 405 -#define BSIM4v7_MOD_LFPROUT 406 -#define BSIM4v7_MOD_LLPEB 407 -#define BSIM4v7_MOD_LDVTP0 408 -#define BSIM4v7_MOD_LDVTP1 409 -#define BSIM4v7_MOD_LCGIDL 410 -#define BSIM4v7_MOD_LPHIN 411 -#define BSIM4v7_MOD_LRSW 412 -#define BSIM4v7_MOD_LRDW 413 -#define BSIM4v7_MOD_LNSD 414 -#define BSIM4v7_MOD_LCKAPPAD 415 -#define BSIM4v7_MOD_LAIGC 416 -#define BSIM4v7_MOD_LBIGC 417 -#define BSIM4v7_MOD_LCIGC 418 -#define BSIM4v7_MOD_LAIGBACC 419 -#define BSIM4v7_MOD_LBIGBACC 420 -#define BSIM4v7_MOD_LCIGBACC 421 -#define BSIM4v7_MOD_LAIGBINV 422 -#define BSIM4v7_MOD_LBIGBINV 423 -#define BSIM4v7_MOD_LCIGBINV 424 -#define BSIM4v7_MOD_LNIGC 425 -#define BSIM4v7_MOD_LNIGBACC 426 -#define BSIM4v7_MOD_LNIGBINV 427 -#define BSIM4v7_MOD_LNTOX 428 -#define BSIM4v7_MOD_LEIGBINV 429 -#define BSIM4v7_MOD_LPIGCD 430 -#define BSIM4v7_MOD_LPOXEDGE 431 -#define BSIM4v7_MOD_LAIGSD 432 -#define BSIM4v7_MOD_LBIGSD 433 -#define BSIM4v7_MOD_LCIGSD 434 - -#define BSIM4v7_MOD_LLAMBDA 435 -#define BSIM4v7_MOD_LVTL 436 -#define BSIM4v7_MOD_LXN 437 -#define BSIM4v7_MOD_LVFBSDOFF 438 -#define BSIM4v7_MOD_LUD 439 -#define BSIM4v7_MOD_LUD1 440 -#define BSIM4v7_MOD_LUP 441 -#define BSIM4v7_MOD_LLP 442 -#define BSIM4v7_MOD_LMINVCV 443 - -#define BSIM4v7_MOD_FGIDL 444 /* v4.7 New GIDL/GISL*/ -#define BSIM4v7_MOD_KGIDL 445 /* v4.7 New GIDL/GISL*/ -#define BSIM4v7_MOD_RGIDL 446 /* v4.7 New GIDL/GISL*/ -#define BSIM4v7_MOD_FGISL 447 /* v4.7 New GIDL/GISL*/ -#define BSIM4v7_MOD_KGISL 448 /* v4.7 New GIDL/GISL*/ -#define BSIM4v7_MOD_RGISL 449 /* v4.7 New GIDL/GISL*/ -#define BSIM4v7_MOD_LFGIDL 450 /* v4.7 New GIDL/GISL*/ -#define BSIM4v7_MOD_LKGIDL 451 /* v4.7 New GIDL/GISL*/ -#define BSIM4v7_MOD_LRGIDL 452 /* v4.7 New GIDL/GISL*/ -#define BSIM4v7_MOD_LFGISL 453 /* v4.7 New GIDL/GISL*/ -#define BSIM4v7_MOD_LKGISL 454 /* v4.7 New GIDL/GISL*/ -#define BSIM4v7_MOD_LRGISL 455 /* v4.7 New GIDL/GISL*/ -#define BSIM4v7_MOD_WFGIDL 456 /* v4.7 New GIDL/GISL*/ -#define BSIM4v7_MOD_WKGIDL 457 /* v4.7 New GIDL/GISL*/ -#define BSIM4v7_MOD_WRGIDL 458 /* v4.7 New GIDL/GISL*/ -#define BSIM4v7_MOD_WFGISL 459 /* v4.7 New GIDL/GISL*/ -#define BSIM4v7_MOD_WKGISL 460 /* v4.7 New GIDL/GISL*/ -#define BSIM4v7_MOD_WRGISL 461 /* v4.7 New GIDL/GISL*/ -#define BSIM4v7_MOD_PFGIDL 462 /* v4.7 New GIDL/GISL*/ -#define BSIM4v7_MOD_PKGIDL 463 /* v4.7 New GIDL/GISL*/ -#define BSIM4v7_MOD_PRGIDL 464 /* v4.7 New GIDL/GISL*/ -#define BSIM4v7_MOD_PFGISL 465 /* v4.7 New GIDL/GISL*/ -#define BSIM4v7_MOD_PKGISL 466 /* v4.7 New GIDL/GISL*/ -#define BSIM4v7_MOD_PRGISL 467 /* v4.7 New GIDL/GISL*/ -#define BSIM4v7_MOD_GIDLMOD 379 /* v4.7 New GIDL/GISL*/ -#define BSIM4v7_MOD_DVTP2 468 /* v4.7 NEW DIBL/Rout*/ -#define BSIM4v7_MOD_DVTP3 469 /* v4.7 NEW DIBL/Rout*/ -#define BSIM4v7_MOD_DVTP4 470 /* v4.7 NEW DIBL/Rout*/ -#define BSIM4v7_MOD_DVTP5 471 /* v4.7 NEW DIBL/Rout*/ -#define BSIM4v7_MOD_LDVTP2 472 /* v4.7 NEW DIBL/Rout*/ -#define BSIM4v7_MOD_LDVTP3 473 /* v4.7 NEW DIBL/Rout*/ -#define BSIM4v7_MOD_LDVTP4 474 /* v4.7 NEW DIBL/Rout*/ -#define BSIM4v7_MOD_LDVTP5 475 /* v4.7 NEW DIBL/Rout*/ -#define BSIM4v7_MOD_WDVTP2 476 /* v4.7 NEW DIBL/Rout*/ -#define BSIM4v7_MOD_WDVTP3 477 /* v4.7 NEW DIBL/Rout*/ -#define BSIM4v7_MOD_WDVTP4 478 /* v4.7 NEW DIBL/Rout*/ -#define BSIM4v7_MOD_WDVTP5 479 /* v4.7 NEW DIBL/Rout*/ -#define BSIM4v7_MOD_PDVTP2 480 /* v4.7 NEW DIBL/Rout*/ -#define BSIM4v7_MOD_PDVTP3 298 /* v4.7 NEW DIBL/Rout*/ -#define BSIM4v7_MOD_PDVTP4 299 /* v4.7 NEW DIBL/Rout*/ -#define BSIM4v7_MOD_PDVTP5 300 /* v4.7 NEW DIBL/Rout*/ - -/* Width dependence */ -#define BSIM4v7_MOD_WCDSC 481 -#define BSIM4v7_MOD_WCDSCB 482 -#define BSIM4v7_MOD_WCIT 483 -#define BSIM4v7_MOD_WNFACTOR 484 -#define BSIM4v7_MOD_WXJ 485 -#define BSIM4v7_MOD_WVSAT 486 -#define BSIM4v7_MOD_WAT 487 -#define BSIM4v7_MOD_WA0 488 -#define BSIM4v7_MOD_WA1 489 -#define BSIM4v7_MOD_WA2 490 -#define BSIM4v7_MOD_WKETA 491 -#define BSIM4v7_MOD_WNSUB 492 -#define BSIM4v7_MOD_WNDEP 493 -#define BSIM4v7_MOD_WNGATE 495 -#define BSIM4v7_MOD_WGAMMA1 496 -#define BSIM4v7_MOD_WGAMMA2 497 -#define BSIM4v7_MOD_WVBX 498 -#define BSIM4v7_MOD_WVBM 500 -#define BSIM4v7_MOD_WXT 502 -#define BSIM4v7_MOD_WK1 505 -#define BSIM4v7_MOD_WKT1 506 -#define BSIM4v7_MOD_WKT1L 507 -#define BSIM4v7_MOD_WK2 508 -#define BSIM4v7_MOD_WKT2 509 -#define BSIM4v7_MOD_WK3 510 -#define BSIM4v7_MOD_WK3B 511 -#define BSIM4v7_MOD_WW0 512 -#define BSIM4v7_MOD_WLPE0 513 -#define BSIM4v7_MOD_WDVT0 514 -#define BSIM4v7_MOD_WDVT1 515 -#define BSIM4v7_MOD_WDVT2 516 -#define BSIM4v7_MOD_WDVT0W 517 -#define BSIM4v7_MOD_WDVT1W 518 -#define BSIM4v7_MOD_WDVT2W 519 -#define BSIM4v7_MOD_WDROUT 520 -#define BSIM4v7_MOD_WDSUB 521 -#define BSIM4v7_MOD_WVTH0 522 -#define BSIM4v7_MOD_WUA 523 -#define BSIM4v7_MOD_WUA1 524 -#define BSIM4v7_MOD_WUB 525 -#define BSIM4v7_MOD_WUB1 526 -#define BSIM4v7_MOD_WUC 527 -#define BSIM4v7_MOD_WUC1 528 -#define BSIM4v7_MOD_WU0 529 -#define BSIM4v7_MOD_WUTE 530 -#define BSIM4v7_MOD_WVOFF 531 -#define BSIM4v7_MOD_WDELTA 532 -#define BSIM4v7_MOD_WRDSW 533 -#define BSIM4v7_MOD_WPRT 534 -#define BSIM4v7_MOD_WLDD 535 -#define BSIM4v7_MOD_WETA 536 -#define BSIM4v7_MOD_WETA0 537 -#define BSIM4v7_MOD_WETAB 538 -#define BSIM4v7_MOD_WPCLM 539 -#define BSIM4v7_MOD_WPDIBL1 540 -#define BSIM4v7_MOD_WPDIBL2 541 -#define BSIM4v7_MOD_WPSCBE1 542 -#define BSIM4v7_MOD_WPSCBE2 543 -#define BSIM4v7_MOD_WPVAG 544 -#define BSIM4v7_MOD_WWR 545 -#define BSIM4v7_MOD_WDWG 546 -#define BSIM4v7_MOD_WDWB 547 -#define BSIM4v7_MOD_WB0 548 -#define BSIM4v7_MOD_WB1 549 -#define BSIM4v7_MOD_WALPHA0 550 -#define BSIM4v7_MOD_WBETA0 551 -#define BSIM4v7_MOD_WPDIBLB 554 -#define BSIM4v7_MOD_WPRWG 555 -#define BSIM4v7_MOD_WPRWB 556 -#define BSIM4v7_MOD_WCDSCD 557 -#define BSIM4v7_MOD_WAGS 558 - -#define BSIM4v7_MOD_WFRINGE 561 -#define BSIM4v7_MOD_WCGSL 563 -#define BSIM4v7_MOD_WCGDL 564 -#define BSIM4v7_MOD_WCKAPPAS 565 -#define BSIM4v7_MOD_WCF 566 -#define BSIM4v7_MOD_WCLC 567 -#define BSIM4v7_MOD_WCLE 568 -#define BSIM4v7_MOD_WVFBCV 569 -#define BSIM4v7_MOD_WACDE 570 -#define BSIM4v7_MOD_WMOIN 571 -#define BSIM4v7_MOD_WNOFF 572 -#define BSIM4v7_MOD_WALPHA1 574 -#define BSIM4v7_MOD_WVFB 575 -#define BSIM4v7_MOD_WVOFFCV 576 -#define BSIM4v7_MOD_WAGIDL 577 -#define BSIM4v7_MOD_WBGIDL 578 -#define BSIM4v7_MOD_WEGIDL 579 -#define BSIM4v7_MOD_WXRCRG1 580 -#define BSIM4v7_MOD_WXRCRG2 581 -#define BSIM4v7_MOD_WEU 582 -#define BSIM4v7_MOD_WMINV 583 -#define BSIM4v7_MOD_WPDITS 584 -#define BSIM4v7_MOD_WPDITSD 585 -#define BSIM4v7_MOD_WFPROUT 586 -#define BSIM4v7_MOD_WLPEB 587 -#define BSIM4v7_MOD_WDVTP0 588 -#define BSIM4v7_MOD_WDVTP1 589 -#define BSIM4v7_MOD_WCGIDL 590 -#define BSIM4v7_MOD_WPHIN 591 -#define BSIM4v7_MOD_WRSW 592 -#define BSIM4v7_MOD_WRDW 593 -#define BSIM4v7_MOD_WNSD 594 -#define BSIM4v7_MOD_WCKAPPAD 595 -#define BSIM4v7_MOD_WAIGC 596 -#define BSIM4v7_MOD_WBIGC 597 -#define BSIM4v7_MOD_WCIGC 598 -#define BSIM4v7_MOD_WAIGBACC 599 -#define BSIM4v7_MOD_WBIGBACC 600 -#define BSIM4v7_MOD_WCIGBACC 601 -#define BSIM4v7_MOD_WAIGBINV 602 -#define BSIM4v7_MOD_WBIGBINV 603 -#define BSIM4v7_MOD_WCIGBINV 604 -#define BSIM4v7_MOD_WNIGC 605 -#define BSIM4v7_MOD_WNIGBACC 606 -#define BSIM4v7_MOD_WNIGBINV 607 -#define BSIM4v7_MOD_WNTOX 608 -#define BSIM4v7_MOD_WEIGBINV 609 -#define BSIM4v7_MOD_WPIGCD 610 -#define BSIM4v7_MOD_WPOXEDGE 611 -#define BSIM4v7_MOD_WAIGSD 612 -#define BSIM4v7_MOD_WBIGSD 613 -#define BSIM4v7_MOD_WCIGSD 614 -#define BSIM4v7_MOD_WLAMBDA 615 -#define BSIM4v7_MOD_WVTL 616 -#define BSIM4v7_MOD_WXN 617 -#define BSIM4v7_MOD_WVFBSDOFF 618 -#define BSIM4v7_MOD_WUD 619 -#define BSIM4v7_MOD_WUD1 620 -#define BSIM4v7_MOD_WUP 621 -#define BSIM4v7_MOD_WLP 622 -#define BSIM4v7_MOD_WMINVCV 623 - -/* Cross-term dependence */ -#define BSIM4v7_MOD_PCDSC 661 -#define BSIM4v7_MOD_PCDSCB 662 -#define BSIM4v7_MOD_PCIT 663 -#define BSIM4v7_MOD_PNFACTOR 664 -#define BSIM4v7_MOD_PXJ 665 -#define BSIM4v7_MOD_PVSAT 666 -#define BSIM4v7_MOD_PAT 667 -#define BSIM4v7_MOD_PA0 668 -#define BSIM4v7_MOD_PA1 669 -#define BSIM4v7_MOD_PA2 670 -#define BSIM4v7_MOD_PKETA 671 -#define BSIM4v7_MOD_PNSUB 672 -#define BSIM4v7_MOD_PNDEP 673 -#define BSIM4v7_MOD_PNGATE 675 -#define BSIM4v7_MOD_PGAMMA1 676 -#define BSIM4v7_MOD_PGAMMA2 677 -#define BSIM4v7_MOD_PVBX 678 - -#define BSIM4v7_MOD_PVBM 680 - -#define BSIM4v7_MOD_PXT 682 -#define BSIM4v7_MOD_PK1 685 -#define BSIM4v7_MOD_PKT1 686 -#define BSIM4v7_MOD_PKT1L 687 -#define BSIM4v7_MOD_PK2 688 -#define BSIM4v7_MOD_PKT2 689 -#define BSIM4v7_MOD_PK3 690 -#define BSIM4v7_MOD_PK3B 691 -#define BSIM4v7_MOD_PW0 692 -#define BSIM4v7_MOD_PLPE0 693 - -#define BSIM4v7_MOD_PDVT0 694 -#define BSIM4v7_MOD_PDVT1 695 -#define BSIM4v7_MOD_PDVT2 696 - -#define BSIM4v7_MOD_PDVT0W 697 -#define BSIM4v7_MOD_PDVT1W 698 -#define BSIM4v7_MOD_PDVT2W 699 - -#define BSIM4v7_MOD_PDROUT 700 -#define BSIM4v7_MOD_PDSUB 701 -#define BSIM4v7_MOD_PVTH0 702 -#define BSIM4v7_MOD_PUA 703 -#define BSIM4v7_MOD_PUA1 704 -#define BSIM4v7_MOD_PUB 705 -#define BSIM4v7_MOD_PUB1 706 -#define BSIM4v7_MOD_PUC 707 -#define BSIM4v7_MOD_PUC1 708 -#define BSIM4v7_MOD_PU0 709 -#define BSIM4v7_MOD_PUTE 710 -#define BSIM4v7_MOD_PVOFF 711 -#define BSIM4v7_MOD_PDELTA 712 -#define BSIM4v7_MOD_PRDSW 713 -#define BSIM4v7_MOD_PPRT 714 -#define BSIM4v7_MOD_PLDD 715 -#define BSIM4v7_MOD_PETA 716 -#define BSIM4v7_MOD_PETA0 717 -#define BSIM4v7_MOD_PETAB 718 -#define BSIM4v7_MOD_PPCLM 719 -#define BSIM4v7_MOD_PPDIBL1 720 -#define BSIM4v7_MOD_PPDIBL2 721 -#define BSIM4v7_MOD_PPSCBE1 722 -#define BSIM4v7_MOD_PPSCBE2 723 -#define BSIM4v7_MOD_PPVAG 724 -#define BSIM4v7_MOD_PWR 725 -#define BSIM4v7_MOD_PDWG 726 -#define BSIM4v7_MOD_PDWB 727 -#define BSIM4v7_MOD_PB0 728 -#define BSIM4v7_MOD_PB1 729 -#define BSIM4v7_MOD_PALPHA0 730 -#define BSIM4v7_MOD_PBETA0 731 -#define BSIM4v7_MOD_PPDIBLB 734 - -#define BSIM4v7_MOD_PPRWG 735 -#define BSIM4v7_MOD_PPRWB 736 - -#define BSIM4v7_MOD_PCDSCD 737 -#define BSIM4v7_MOD_PAGS 738 - -#define BSIM4v7_MOD_PFRINGE 741 -#define BSIM4v7_MOD_PCGSL 743 -#define BSIM4v7_MOD_PCGDL 744 -#define BSIM4v7_MOD_PCKAPPAS 745 -#define BSIM4v7_MOD_PCF 746 -#define BSIM4v7_MOD_PCLC 747 -#define BSIM4v7_MOD_PCLE 748 -#define BSIM4v7_MOD_PVFBCV 749 -#define BSIM4v7_MOD_PACDE 750 -#define BSIM4v7_MOD_PMOIN 751 -#define BSIM4v7_MOD_PNOFF 752 -#define BSIM4v7_MOD_PALPHA1 754 -#define BSIM4v7_MOD_PVFB 755 -#define BSIM4v7_MOD_PVOFFCV 756 -#define BSIM4v7_MOD_PAGIDL 757 -#define BSIM4v7_MOD_PBGIDL 758 -#define BSIM4v7_MOD_PEGIDL 759 -#define BSIM4v7_MOD_PXRCRG1 760 -#define BSIM4v7_MOD_PXRCRG2 761 -#define BSIM4v7_MOD_PEU 762 -#define BSIM4v7_MOD_PMINV 763 -#define BSIM4v7_MOD_PPDITS 764 -#define BSIM4v7_MOD_PPDITSD 765 -#define BSIM4v7_MOD_PFPROUT 766 -#define BSIM4v7_MOD_PLPEB 767 -#define BSIM4v7_MOD_PDVTP0 768 -#define BSIM4v7_MOD_PDVTP1 769 -#define BSIM4v7_MOD_PCGIDL 770 -#define BSIM4v7_MOD_PPHIN 771 -#define BSIM4v7_MOD_PRSW 772 -#define BSIM4v7_MOD_PRDW 773 -#define BSIM4v7_MOD_PNSD 774 -#define BSIM4v7_MOD_PCKAPPAD 775 -#define BSIM4v7_MOD_PAIGC 776 -#define BSIM4v7_MOD_PBIGC 777 -#define BSIM4v7_MOD_PCIGC 778 -#define BSIM4v7_MOD_PAIGBACC 779 -#define BSIM4v7_MOD_PBIGBACC 780 -#define BSIM4v7_MOD_PCIGBACC 781 -#define BSIM4v7_MOD_PAIGBINV 782 -#define BSIM4v7_MOD_PBIGBINV 783 -#define BSIM4v7_MOD_PCIGBINV 784 -#define BSIM4v7_MOD_PNIGC 785 -#define BSIM4v7_MOD_PNIGBACC 786 -#define BSIM4v7_MOD_PNIGBINV 787 -#define BSIM4v7_MOD_PNTOX 788 -#define BSIM4v7_MOD_PEIGBINV 789 -#define BSIM4v7_MOD_PPIGCD 790 -#define BSIM4v7_MOD_PPOXEDGE 791 -#define BSIM4v7_MOD_PAIGSD 792 -#define BSIM4v7_MOD_PBIGSD 793 -#define BSIM4v7_MOD_PCIGSD 794 - -#define BSIM4v7_MOD_SAREF 795 -#define BSIM4v7_MOD_SBREF 796 -#define BSIM4v7_MOD_KU0 797 -#define BSIM4v7_MOD_KVSAT 798 -#define BSIM4v7_MOD_TKU0 799 -#define BSIM4v7_MOD_LLODKU0 800 -#define BSIM4v7_MOD_WLODKU0 801 -#define BSIM4v7_MOD_LLODVTH 802 -#define BSIM4v7_MOD_WLODVTH 803 -#define BSIM4v7_MOD_LKU0 804 -#define BSIM4v7_MOD_WKU0 805 -#define BSIM4v7_MOD_PKU0 806 -#define BSIM4v7_MOD_KVTH0 807 -#define BSIM4v7_MOD_LKVTH0 808 -#define BSIM4v7_MOD_WKVTH0 809 -#define BSIM4v7_MOD_PKVTH0 810 -#define BSIM4v7_MOD_WLOD 811 -#define BSIM4v7_MOD_STK2 812 -#define BSIM4v7_MOD_LODK2 813 -#define BSIM4v7_MOD_STETA0 814 -#define BSIM4v7_MOD_LODETA0 815 - -#define BSIM4v7_MOD_WEB 816 -#define BSIM4v7_MOD_WEC 817 -#define BSIM4v7_MOD_KVTH0WE 818 -#define BSIM4v7_MOD_K2WE 819 -#define BSIM4v7_MOD_KU0WE 820 -#define BSIM4v7_MOD_SCREF 821 -#define BSIM4v7_MOD_WPEMOD 822 -#define BSIM4v7_MOD_PMINVCV 823 - -#define BSIM4v7_MOD_PLAMBDA 825 -#define BSIM4v7_MOD_PVTL 826 -#define BSIM4v7_MOD_PXN 827 -#define BSIM4v7_MOD_PVFBSDOFF 828 - -#define BSIM4v7_MOD_TNOM 831 -#define BSIM4v7_MOD_CGSO 832 -#define BSIM4v7_MOD_CGDO 833 -#define BSIM4v7_MOD_CGBO 834 -#define BSIM4v7_MOD_XPART 835 -#define BSIM4v7_MOD_RSH 836 -#define BSIM4v7_MOD_JSS 837 -#define BSIM4v7_MOD_PBS 838 -#define BSIM4v7_MOD_MJS 839 -#define BSIM4v7_MOD_PBSWS 840 -#define BSIM4v7_MOD_MJSWS 841 -#define BSIM4v7_MOD_CJS 842 -#define BSIM4v7_MOD_CJSWS 843 -#define BSIM4v7_MOD_NMOS 844 -#define BSIM4v7_MOD_PMOS 845 -#define BSIM4v7_MOD_NOIA 846 -#define BSIM4v7_MOD_NOIB 847 -#define BSIM4v7_MOD_NOIC 848 -#define BSIM4v7_MOD_LINT 849 -#define BSIM4v7_MOD_LL 850 -#define BSIM4v7_MOD_LLN 851 -#define BSIM4v7_MOD_LW 852 -#define BSIM4v7_MOD_LWN 853 -#define BSIM4v7_MOD_LWL 854 -#define BSIM4v7_MOD_LMIN 855 -#define BSIM4v7_MOD_LMAX 856 -#define BSIM4v7_MOD_WINT 857 -#define BSIM4v7_MOD_WL 858 -#define BSIM4v7_MOD_WLN 859 -#define BSIM4v7_MOD_WW 860 -#define BSIM4v7_MOD_WWN 861 -#define BSIM4v7_MOD_WWL 862 -#define BSIM4v7_MOD_WMIN 863 -#define BSIM4v7_MOD_WMAX 864 -#define BSIM4v7_MOD_DWC 865 -#define BSIM4v7_MOD_DLC 866 -#define BSIM4v7_MOD_XL 867 -#define BSIM4v7_MOD_XW 868 -#define BSIM4v7_MOD_EM 869 -#define BSIM4v7_MOD_EF 870 -#define BSIM4v7_MOD_AF 871 -#define BSIM4v7_MOD_KF 872 -#define BSIM4v7_MOD_NJS 873 -#define BSIM4v7_MOD_XTIS 874 -#define BSIM4v7_MOD_PBSWGS 875 -#define BSIM4v7_MOD_MJSWGS 876 -#define BSIM4v7_MOD_CJSWGS 877 -#define BSIM4v7_MOD_JSWS 878 -#define BSIM4v7_MOD_LLC 879 -#define BSIM4v7_MOD_LWC 880 -#define BSIM4v7_MOD_LWLC 881 -#define BSIM4v7_MOD_WLC 882 -#define BSIM4v7_MOD_WWC 883 -#define BSIM4v7_MOD_WWLC 884 -#define BSIM4v7_MOD_DWJ 885 -#define BSIM4v7_MOD_JSD 886 -#define BSIM4v7_MOD_PBD 887 -#define BSIM4v7_MOD_MJD 888 -#define BSIM4v7_MOD_PBSWD 889 -#define BSIM4v7_MOD_MJSWD 890 -#define BSIM4v7_MOD_CJD 891 -#define BSIM4v7_MOD_CJSWD 892 -#define BSIM4v7_MOD_NJD 893 -#define BSIM4v7_MOD_XTID 894 -#define BSIM4v7_MOD_PBSWGD 895 -#define BSIM4v7_MOD_MJSWGD 896 -#define BSIM4v7_MOD_CJSWGD 897 -#define BSIM4v7_MOD_JSWD 898 -#define BSIM4v7_MOD_DLCIG 899 - -/* trap-assisted tunneling */ - -#define BSIM4v7_MOD_JTSS 900 -#define BSIM4v7_MOD_JTSD 901 -#define BSIM4v7_MOD_JTSSWS 902 -#define BSIM4v7_MOD_JTSSWD 903 -#define BSIM4v7_MOD_JTSSWGS 904 -#define BSIM4v7_MOD_JTSSWGD 905 -#define BSIM4v7_MOD_NJTS 906 -#define BSIM4v7_MOD_NJTSSW 907 -#define BSIM4v7_MOD_NJTSSWG 908 -#define BSIM4v7_MOD_XTSS 909 -#define BSIM4v7_MOD_XTSD 910 -#define BSIM4v7_MOD_XTSSWS 911 -#define BSIM4v7_MOD_XTSSWD 912 -#define BSIM4v7_MOD_XTSSWGS 913 -#define BSIM4v7_MOD_XTSSWGD 914 -#define BSIM4v7_MOD_TNJTS 915 -#define BSIM4v7_MOD_TNJTSSW 916 -#define BSIM4v7_MOD_TNJTSSWG 917 -#define BSIM4v7_MOD_VTSS 918 -#define BSIM4v7_MOD_VTSD 919 -#define BSIM4v7_MOD_VTSSWS 920 -#define BSIM4v7_MOD_VTSSWD 921 -#define BSIM4v7_MOD_VTSSWGS 922 -#define BSIM4v7_MOD_VTSSWGD 923 -#define BSIM4v7_MOD_PUD 924 -#define BSIM4v7_MOD_PUD1 925 -#define BSIM4v7_MOD_PUP 926 -#define BSIM4v7_MOD_PLP 927 -#define BSIM4v7_MOD_JTWEFF 928 - -/* device questions */ -#define BSIM4v7_DNODE 945 -#define BSIM4v7_GNODEEXT 946 -#define BSIM4v7_SNODE 947 -#define BSIM4v7_BNODE 948 -#define BSIM4v7_DNODEPRIME 949 -#define BSIM4v7_GNODEPRIME 950 -#define BSIM4v7_GNODEMIDE 951 -#define BSIM4v7_GNODEMID 952 -#define BSIM4v7_SNODEPRIME 953 -#define BSIM4v7_BNODEPRIME 954 -#define BSIM4v7_DBNODE 955 -#define BSIM4v7_SBNODE 956 -#define BSIM4v7_VBD 957 -#define BSIM4v7_VBS 958 -#define BSIM4v7_VGS 959 -#define BSIM4v7_VDS 960 -#define BSIM4v7_CD 961 -#define BSIM4v7_CBS 962 -#define BSIM4v7_CBD 963 -#define BSIM4v7_GM 964 -#define BSIM4v7_GDS 965 -#define BSIM4v7_GMBS 966 -#define BSIM4v7_GBD 967 -#define BSIM4v7_GBS 968 -#define BSIM4v7_QB 969 -#define BSIM4v7_CQB 970 -#define BSIM4v7_QG 971 -#define BSIM4v7_CQG 972 -#define BSIM4v7_QD 973 -#define BSIM4v7_CQD 974 -#define BSIM4v7_CGGB 975 -#define BSIM4v7_CGDB 976 -#define BSIM4v7_CGSB 977 -#define BSIM4v7_CBGB 978 -#define BSIM4v7_CAPBD 979 -#define BSIM4v7_CQBD 980 -#define BSIM4v7_CAPBS 981 -#define BSIM4v7_CQBS 982 -#define BSIM4v7_CDGB 983 -#define BSIM4v7_CDDB 984 -#define BSIM4v7_CDSB 985 -#define BSIM4v7_VON 986 -#define BSIM4v7_VDSAT 987 -#define BSIM4v7_QBS 988 -#define BSIM4v7_QBD 989 -#define BSIM4v7_SOURCECONDUCT 990 -#define BSIM4v7_DRAINCONDUCT 991 -#define BSIM4v7_CBDB 992 -#define BSIM4v7_CBSB 993 -#define BSIM4v7_CSUB 994 -#define BSIM4v7_QINV 995 -#define BSIM4v7_IGIDL 996 -#define BSIM4v7_CSGB 997 -#define BSIM4v7_CSDB 998 -#define BSIM4v7_CSSB 999 -#define BSIM4v7_CGBB 1000 -#define BSIM4v7_CDBB 1001 -#define BSIM4v7_CSBB 1002 -#define BSIM4v7_CBBB 1003 -#define BSIM4v7_QS 1004 -#define BSIM4v7_IGISL 1005 -#define BSIM4v7_IGS 1006 -#define BSIM4v7_IGD 1007 -#define BSIM4v7_IGB 1008 -#define BSIM4v7_IGCS 1009 -#define BSIM4v7_IGCD 1010 -#define BSIM4v7_QDEF 1011 -#define BSIM4v7_DELVT0 1012 -#define BSIM4v7_GCRG 1013 -#define BSIM4v7_GTAU 1014 - -#define BSIM4v7_MOD_LTVOFF 1051 -#define BSIM4v7_MOD_LTVFBSDOFF 1052 -#define BSIM4v7_MOD_WTVOFF 1053 -#define BSIM4v7_MOD_WTVFBSDOFF 1054 -#define BSIM4v7_MOD_PTVOFF 1055 -#define BSIM4v7_MOD_PTVFBSDOFF 1056 - -#define BSIM4v7_MOD_LKVTH0WE 1061 -#define BSIM4v7_MOD_LK2WE 1062 -#define BSIM4v7_MOD_LKU0WE 1063 -#define BSIM4v7_MOD_WKVTH0WE 1064 -#define BSIM4v7_MOD_WK2WE 1065 -#define BSIM4v7_MOD_WKU0WE 1066 -#define BSIM4v7_MOD_PKVTH0WE 1067 -#define BSIM4v7_MOD_PK2WE 1068 -#define BSIM4v7_MOD_PKU0WE 1069 - -#define BSIM4v7_MOD_RBPS0 1101 -#define BSIM4v7_MOD_RBPSL 1102 -#define BSIM4v7_MOD_RBPSW 1103 -#define BSIM4v7_MOD_RBPSNF 1104 -#define BSIM4v7_MOD_RBPD0 1105 -#define BSIM4v7_MOD_RBPDL 1106 -#define BSIM4v7_MOD_RBPDW 1107 -#define BSIM4v7_MOD_RBPDNF 1108 - -#define BSIM4v7_MOD_RBPBX0 1109 -#define BSIM4v7_MOD_RBPBXL 1110 -#define BSIM4v7_MOD_RBPBXW 1111 -#define BSIM4v7_MOD_RBPBXNF 1112 -#define BSIM4v7_MOD_RBPBY0 1113 -#define BSIM4v7_MOD_RBPBYL 1114 -#define BSIM4v7_MOD_RBPBYW 1115 -#define BSIM4v7_MOD_RBPBYNF 1116 - -#define BSIM4v7_MOD_RBSBX0 1117 -#define BSIM4v7_MOD_RBSBY0 1118 -#define BSIM4v7_MOD_RBDBX0 1119 -#define BSIM4v7_MOD_RBDBY0 1120 - -#define BSIM4v7_MOD_RBSDBXL 1121 -#define BSIM4v7_MOD_RBSDBXW 1122 -#define BSIM4v7_MOD_RBSDBXNF 1123 -#define BSIM4v7_MOD_RBSDBYL 1124 -#define BSIM4v7_MOD_RBSDBYW 1125 -#define BSIM4v7_MOD_RBSDBYNF 1126 - -#define BSIM4v7_MOD_AGISL 1200 -#define BSIM4v7_MOD_BGISL 1201 -#define BSIM4v7_MOD_EGISL 1202 -#define BSIM4v7_MOD_CGISL 1203 -#define BSIM4v7_MOD_LAGISL 1204 -#define BSIM4v7_MOD_LBGISL 1205 -#define BSIM4v7_MOD_LEGISL 1206 -#define BSIM4v7_MOD_LCGISL 1207 -#define BSIM4v7_MOD_WAGISL 1208 -#define BSIM4v7_MOD_WBGISL 1209 -#define BSIM4v7_MOD_WEGISL 1210 -#define BSIM4v7_MOD_WCGISL 1211 -#define BSIM4v7_MOD_PAGISL 1212 -#define BSIM4v7_MOD_PBGISL 1213 -#define BSIM4v7_MOD_PEGISL 1214 -#define BSIM4v7_MOD_PCGISL 1215 - -#define BSIM4v7_MOD_AIGS 1220 -#define BSIM4v7_MOD_BIGS 1221 -#define BSIM4v7_MOD_CIGS 1222 -#define BSIM4v7_MOD_LAIGS 1223 -#define BSIM4v7_MOD_LBIGS 1224 -#define BSIM4v7_MOD_LCIGS 1225 -#define BSIM4v7_MOD_WAIGS 1226 -#define BSIM4v7_MOD_WBIGS 1227 -#define BSIM4v7_MOD_WCIGS 1228 -#define BSIM4v7_MOD_PAIGS 1229 -#define BSIM4v7_MOD_PBIGS 1230 -#define BSIM4v7_MOD_PCIGS 1231 -#define BSIM4v7_MOD_AIGD 1232 -#define BSIM4v7_MOD_BIGD 1233 -#define BSIM4v7_MOD_CIGD 1234 -#define BSIM4v7_MOD_LAIGD 1235 -#define BSIM4v7_MOD_LBIGD 1236 -#define BSIM4v7_MOD_LCIGD 1237 -#define BSIM4v7_MOD_WAIGD 1238 -#define BSIM4v7_MOD_WBIGD 1239 -#define BSIM4v7_MOD_WCIGD 1240 -#define BSIM4v7_MOD_PAIGD 1241 -#define BSIM4v7_MOD_PBIGD 1242 -#define BSIM4v7_MOD_PCIGD 1243 -#define BSIM4v7_MOD_DLCIGD 1244 - -#define BSIM4v7_MOD_NJTSD 1250 -#define BSIM4v7_MOD_NJTSSWD 1251 -#define BSIM4v7_MOD_NJTSSWGD 1252 -#define BSIM4v7_MOD_TNJTSD 1253 -#define BSIM4v7_MOD_TNJTSSWD 1254 -#define BSIM4v7_MOD_TNJTSSWGD 1255 - -/* v4.7 temp dep of leakage current */ - -#define BSIM4v7_MOD_TNFACTOR 1256 -#define BSIM4v7_MOD_TETA0 1257 -#define BSIM4v7_MOD_TVOFFCV 1258 -#define BSIM4v7_MOD_LTNFACTOR 1260 -#define BSIM4v7_MOD_LTETA0 1261 -#define BSIM4v7_MOD_LTVOFFCV 1262 -#define BSIM4v7_MOD_WTNFACTOR 1264 -#define BSIM4v7_MOD_WTETA0 1265 -#define BSIM4v7_MOD_WTVOFFCV 1266 -#define BSIM4v7_MOD_PTNFACTOR 1268 -#define BSIM4v7_MOD_PTETA0 1269 -#define BSIM4v7_MOD_PTVOFFCV 1270 - -/* tnoiMod=2 (v4.7) */ -#define BSIM4v7_MOD_TNOIC 1272 -#define BSIM4v7_MOD_RNOIC 1273 - -#define BSIM4v7_MOD_VGS_MAX 1301 -#define BSIM4v7_MOD_VGD_MAX 1302 -#define BSIM4v7_MOD_VGB_MAX 1303 -#define BSIM4v7_MOD_VDS_MAX 1304 -#define BSIM4v7_MOD_VBS_MAX 1305 -#define BSIM4v7_MOD_VBD_MAX 1306 -#define BSIM4v7_MOD_VGSR_MAX 1307 -#define BSIM4v7_MOD_VGDR_MAX 1308 -#define BSIM4v7_MOD_VGBR_MAX 1309 -#define BSIM4v7_MOD_VBSR_MAX 1310 -#define BSIM4v7_MOD_VBDR_MAX 1311 - -#include "bsim4v7ext.h" - -extern void BSIM4v7evaluate(double,double,double,BSIM4v7instance*,BSIM4v7model*, - double*,double*,double*, double*, double*, double*, double*, - double*, double*, double*, double*, double*, double*, double*, - double*, double*, double*, double*, CKTcircuit*); -extern int BSIM4v7debug(BSIM4v7model*, BSIM4v7instance*, CKTcircuit*, int); -extern int BSIM4v7checkModel(BSIM4v7model*, BSIM4v7instance*, CKTcircuit*); -extern int BSIM4v7PAeffGeo(double, int, int, double, double, double, double, double *, double *, double *, double *); -extern int BSIM4v7RdseffGeo(double, int, int, int, double, double, double, double, double, int, double *); -extern int BSIM4v7RdsEndIso(double, double, double, double, double, double, int, int, double *); -extern int BSIM4v7RdsEndSha(double, double, double, double, double, double, int, int, double *); - -#endif /*BSIM4v7*/ diff --git a/src/spicelib/devices/bsim4v7/bsim4v7ext.h b/src/spicelib/devices/bsim4v7/bsim4v7ext.h deleted file mode 100644 index d25a3ad87..000000000 --- a/src/spicelib/devices/bsim4v7/bsim4v7ext.h +++ /dev/null @@ -1,29 +0,0 @@ -/********** -Copyright 2004 Regents of the University of California. All rights reserved. -Author: 2000 Weidong Liu -Author: 2001- Xuemei Xi -File: bsim4v7ext.h -**********/ - -extern int BSIM4v7acLoad(GENmodel *,CKTcircuit*); -extern int BSIM4v7ask(CKTcircuit *,GENinstance*,int,IFvalue*,IFvalue*); -extern int BSIM4v7convTest(GENmodel *,CKTcircuit*); -extern int BSIM4v7getic(GENmodel*,CKTcircuit*); -extern int BSIM4v7load(GENmodel*,CKTcircuit*); -extern int BSIM4v7mAsk(CKTcircuit*,GENmodel *,int, IFvalue*); -extern int BSIM4v7mDelete(GENmodel*); -extern int BSIM4v7mParam(int,IFvalue*,GENmodel*); -extern void BSIM4v7mosCap(CKTcircuit*, double, double, double, double, - double, double, double, double, double, double, double, - double, double, double, double, double, double, double*, - double*, double*, double*, double*, double*, double*, double*, - double*, double*, double*, double*, double*, double*, double*, - double*); -extern int BSIM4v7param(int,IFvalue*,GENinstance*,IFvalue*); -extern int BSIM4v7pzLoad(GENmodel*,CKTcircuit*,SPcomplex*); -extern int BSIM4v7setup(SMPmatrix*,GENmodel*,CKTcircuit*,int*); -extern int BSIM4v7temp(GENmodel*,CKTcircuit*); -extern int BSIM4v7trunc(GENmodel*,CKTcircuit*,double*); -extern int BSIM4v7noise(int,int,GENmodel*,CKTcircuit*,Ndata*,double*); -extern int BSIM4v7unsetup(GENmodel*,CKTcircuit*); -extern int BSIM4v7soaCheck(CKTcircuit *, GENmodel *); diff --git a/src/spicelib/devices/bsim4v7/bsim4v7init.c b/src/spicelib/devices/bsim4v7/bsim4v7init.c deleted file mode 100644 index abe32d37b..000000000 --- a/src/spicelib/devices/bsim4v7/bsim4v7init.c +++ /dev/null @@ -1,76 +0,0 @@ -#include "ngspice/config.h" - -#include "ngspice/devdefs.h" - -#include "bsim4v7itf.h" -#include "bsim4v7ext.h" -#include "bsim4v7init.h" - - -SPICEdev BSIM4v7info = { - .DEVpublic = { - .name = "BSIM4v7", - .description = "Berkeley Short Channel IGFET Model-4", - .terms = &BSIM4v7nSize, - .numNames = &BSIM4v7nSize, - .termNames = BSIM4v7names, - .numInstanceParms = &BSIM4v7pTSize, - .instanceParms = BSIM4v7pTable, - .numModelParms = &BSIM4v7mPTSize, - .modelParms = BSIM4v7mPTable, - .flags = DEV_DEFAULT, - -#ifdef XSPICE - .cm_func = NULL, - .num_conn = 0, - .conn = NULL, - .num_param = 0, - .param = NULL, - .num_inst_var = 0, - .inst_var = NULL, -#endif - }, - - .DEVparam = BSIM4v7param, - .DEVmodParam = BSIM4v7mParam, - .DEVload = BSIM4v7load, - .DEVsetup = BSIM4v7setup, - .DEVunsetup = BSIM4v7unsetup, - .DEVpzSetup = BSIM4v7setup, - .DEVtemperature = BSIM4v7temp, - .DEVtrunc = BSIM4v7trunc, - .DEVfindBranch = NULL, - .DEVacLoad = BSIM4v7acLoad, - .DEVaccept = NULL, - .DEVdestroy = NULL, - .DEVmodDelete = BSIM4v7mDelete, - .DEVdelete = NULL, - .DEVsetic = BSIM4v7getic, - .DEVask = BSIM4v7ask, - .DEVmodAsk = BSIM4v7mAsk, - .DEVpzLoad = BSIM4v7pzLoad, - .DEVconvTest = BSIM4v7convTest, - .DEVsenSetup = NULL, - .DEVsenLoad = NULL, - .DEVsenUpdate = NULL, - .DEVsenAcLoad = NULL, - .DEVsenPrint = NULL, - .DEVsenTrunc = NULL, - .DEVdisto = NULL, - .DEVnoise = BSIM4v7noise, - .DEVsoaCheck = BSIM4v7soaCheck, - .DEVinstSize = &BSIM4v7iSize, - .DEVmodSize = &BSIM4v7mSize, - -#ifdef CIDER - .DEVdump = NULL, - .DEVacct = NULL, -#endif -}; - - -SPICEdev * -get_bsim4v7_info(void) -{ - return &BSIM4v7info; -} diff --git a/src/spicelib/devices/bsim4v7/bsim4v7init.h b/src/spicelib/devices/bsim4v7/bsim4v7init.h deleted file mode 100644 index f8dbc8af1..000000000 --- a/src/spicelib/devices/bsim4v7/bsim4v7init.h +++ /dev/null @@ -1,13 +0,0 @@ -#ifndef _BSIM4v7INIT_H -#define _BSIM4v7INIT_H - -extern IFparm BSIM4v7pTable[ ]; -extern IFparm BSIM4v7mPTable[ ]; -extern char *BSIM4v7names[ ]; -extern int BSIM4v7pTSize; -extern int BSIM4v7mPTSize; -extern int BSIM4v7nSize; -extern int BSIM4v7iSize; -extern int BSIM4v7mSize; - -#endif diff --git a/src/spicelib/devices/bsim4v7/bsim4v7itf.h b/src/spicelib/devices/bsim4v7/bsim4v7itf.h deleted file mode 100644 index a067ded37..000000000 --- a/src/spicelib/devices/bsim4v7/bsim4v7itf.h +++ /dev/null @@ -1,13 +0,0 @@ -/********** -Copyright 2004 Regents of the University of California. All rights reserved. -Author: 2000 Weidong Liu. -Author: 2001- Xuemei Xi -File: bsim4v7itf.h -**********/ - -#ifndef DEV_BSIM4v7 -#define DEV_BSIM4v7 - -SPICEdev *get_bsim4v7_info(void); - -#endif diff --git a/src/spicelib/devices/bsimsoi/BsimTerms_use b/src/spicelib/devices/bsimsoi/BsimTerms_use deleted file mode 100644 index 0f00ea32d..000000000 --- a/src/spicelib/devices/bsimsoi/BsimTerms_use +++ /dev/null @@ -1,29 +0,0 @@ -The terms under which the software is provided are as the following. - -Software is distributed as is, completely without warranty or service -support. The University of California and its employees are not liable -for the condition or performance of the software. - -The University owns the copyright but shall not be liable for any -infringement of copyright or other proprietary rights brought by third -parties against the users of the software. - -The University of California hereby disclaims all implied warranties. - -The University of California grants the users the right to modify, copy, -and redistribute the software and documentation, both within the user's -organization and externally, subject to the following restrictions - -1. The users agree not to charge for the University of California code -itself but may charge for additions, extensions, or support. - -2. In any product based on the software, the users agree to acknowledge -the UC Berkeley BSIM Research Group that developed the software. This -acknowledgment shall appear in the product documentation. - -3. The users agree to obey all U.S. Government restrictions governing -redistribution or export of the software. - -4. The users agree to reproduce any copyright notice which appears on -the software on any copy or modification of such made available -to others. diff --git a/src/spicelib/devices/bsimsoi/Makefile.am b/src/spicelib/devices/bsimsoi/Makefile.am deleted file mode 100644 index e28c4b298..000000000 --- a/src/spicelib/devices/bsimsoi/Makefile.am +++ /dev/null @@ -1,36 +0,0 @@ -## Process this file with automake to produce Makefile.in - -noinst_LTLIBRARIES = libbsim4soi.la - -libbsim4soi_la_SOURCES = \ - b4soi.c \ - b4soiacld.c \ - b4soiask.c \ - b4soicheck.c \ - b4soicvtest.c \ - b4soigetic.c \ - b4soild.c \ - b4soimask.c \ - b4soimdel.c \ - b4soimpar.c \ - b4soinoi.c \ - b4soipar.c \ - b4soipzld.c \ - b4soiset.c \ - b4soisoachk.c \ - b4soitemp.c \ - b4soitrunc.c \ - b4soidef.h \ - b4soiext.h \ - b4soiinit.c \ - b4soiinit.h \ - b4soiitf.h - - - -AM_CPPFLAGS = @AM_CPPFLAGS@ -I$(top_srcdir)/src/include -AM_CFLAGS = $(STATIC) - -MAINTAINERCLEANFILES = Makefile.in - -EXTRA_DIST = BsimTerms_use diff --git a/src/spicelib/devices/bsimsoi/b4soi.c b/src/spicelib/devices/bsimsoi/b4soi.c deleted file mode 100644 index 663533fc8..000000000 --- a/src/spicelib/devices/bsimsoi/b4soi.c +++ /dev/null @@ -1,1139 +0,0 @@ -/*** B4SOI 12/16/2010 Released by Tanvir Morshed ***/ - - -/********** - * Copyright 2010 Regents of the University of California. All rights reserved. - * Authors: 1998 Samuel Fung, Dennis Sinitsky and Stephen Tang - * Authors: 1999-2004 Pin Su, Hui Wan, Wei Jin, b3soi.c - * Authors: 2005- Hui Wan, Xuemei Xi, Ali Niknejad, Chenming Hu. - * Authors: 2009- Wenwei Yang, Chung-Hsun Lin, Ali Niknejad, Chenming Hu. - * Authors: 2010- Tanvir Morshed, Ali Niknejad, Chenming Hu. - * File: b4soi.c - * Modified by Hui Wan, Xuemei Xi 11/30/2005 - * Modified by Wenwei Yang, Chung-Hsun Lin, Darsen Lu 03/06/2009 - * Modified by Tanvir Morshed 09/22/2009 - * Modified by Tanvir Morshed 12/31/2009 - * Modified by Tanvir Morshed 12/16/2010 - **********/ - -#include "ngspice/ngspice.h" - -#include "ngspice/devdefs.h" -#include "b4soidef.h" -#include "ngspice/suffix.h" - -IFparm B4SOIpTable[] = { /* parameters */ -IOP( "l", B4SOI_L, IF_REAL , "Length"), -IOP( "w", B4SOI_W, IF_REAL , "Width"), -IOP( "m", B4SOI_M, IF_REAL , "Parallel Multiplier"), -IOP( "nf", B4SOI_NF, IF_REAL , "Number of fingers"), -IOP( "sa", B4SOI_SA, IF_REAL , "distance between OD edge to poly of one side "), -IOP( "sb", B4SOI_SB, IF_REAL , "distance between OD edge to poly of the other side"), -IOP( "sd", B4SOI_SD, IF_REAL , "distance between neighbour fingers"), -IOP( "ad", B4SOI_AD, IF_REAL , "Drain area"), -IOP( "as", B4SOI_AS, IF_REAL , "Source area"), -IOP( "pd", B4SOI_PD, IF_REAL , "Drain perimeter"), -IOP( "ps", B4SOI_PS, IF_REAL , "Source perimeter"), -IOP( "nrd", B4SOI_NRD, IF_REAL , "Number of squares in drain"), -IOP( "nrs", B4SOI_NRS, IF_REAL , "Number of squares in source"), -IOP( "off", B4SOI_OFF, IF_FLAG , "Device is initially off"), -IP( "ic", B4SOI_IC, IF_REALVEC , "Vector of DS,GS,BS initial voltages"), -OP( "gmbs", B4SOI_GMBS, IF_REAL, "Gmb"), -OP( "gm", B4SOI_GM, IF_REAL, "Gm"), -OP( "gmids", B4SOI_GMID, IF_REAL, "Gm/Ids"), -OP( "gds", B4SOI_GDS, IF_REAL, "Gds"), -OP( "vdsat", B4SOI_VDSAT, IF_REAL, "Vdsat"), -OP( "vth", B4SOI_VON, IF_REAL, "Vth"), -OP( "ids", B4SOI_CD, IF_REAL, "Ids"), -OP( "vbs", B4SOI_VBS, IF_REAL, "Vbs"), -OP( "vgs", B4SOI_VGS, IF_REAL, "Vgs"), -OP( "vds", B4SOI_VDS, IF_REAL, "Vds"), -OP( "ves", B4SOI_VES, IF_REAL, "Ves"), -OP( "ibd", B4SOI_IBD, IF_REAL, "Ibd"), -OP( "ibs", B4SOI_IBS, IF_REAL, "Ibs"), -OP( "isub", B4SOI_ISUB, IF_REAL, "Isub"), -OP( "igidl", B4SOI_IGIDL, IF_REAL, "Igidl"), -OP( "igisl", B4SOI_IGISL, IF_REAL, "Igisl"), -OP( "igs", B4SOI_IGS, IF_REAL, "Igs"), -OP( "igd", B4SOI_IGD, IF_REAL, "Igd"), -OP( "igb", B4SOI_IGB, IF_REAL, "Igb"), -OP( "igcs", B4SOI_IGCS, IF_REAL, "Igcs"), -OP( "igcd", B4SOI_IGCD, IF_REAL, "Igcd"), -OP( "cgg", B4SOI_CGG, IF_REAL, "Cggb"), -OP( "cgs", B4SOI_CGS, IF_REAL, "Cgsb"), -OP( "cgd", B4SOI_CGD, IF_REAL, "Cgdb"), -OP( "cbg", B4SOI_CBG, IF_REAL, "Cbgb"), -OP( "cbd", B4SOI_CBD, IF_REAL, "Cbdb"), -OP( "cbs", B4SOI_CBS, IF_REAL, "Cbsb"), -OP( "cdg", B4SOI_CDG, IF_REAL, "Cdgb"), -OP( "cdd", B4SOI_CDD, IF_REAL, "Cddb"), -OP( "cds", B4SOI_CDS, IF_REAL, "Cdsb"), -OP( "capbd", B4SOI_CAPBD, IF_REAL, "Capbd"), -OP( "capbs", B4SOI_CAPBS, IF_REAL, "Capbs"), -OP( "qg", B4SOI_QG, IF_REAL, "Qgate"), -OP( "qb", B4SOI_QB, IF_REAL, "Qbulk"), -OP( "qd", B4SOI_QD, IF_REAL, "Qdrain"), -OP( "qs", B4SOI_QS, IF_REAL, "Qsource"), -#ifdef B4SOI_DEBUG_OUT -OP( "debug1", B4SOI_DEBUG1, IF_REAL, "DebugOut1"), -OP( "debug2", B4SOI_DEBUG2, IF_REAL, "DebugOut2"), -OP( "debug3", B4SOI_DEBUG3, IF_REAL, "DebugOut3"), -#endif - -IOP( "bjtoff", B4SOI_BJTOFF, IF_INTEGER, "BJT on/off flag"), -IOP( "debug", B4SOI_DEBUG, IF_INTEGER, "DEBUG on/off flag"), -IOP( "rth0", B4SOI_RTH0, IF_REAL, "Instance Thermal Resistance"), -IOP( "cth0", B4SOI_CTH0, IF_REAL, "Instance Thermal Capacitance"), -IOP( "nrb", B4SOI_NRB, IF_REAL, "Number of squares in body"), -IOP( "frbody", B4SOI_FRBODY, IF_REAL, "layout dependent body-resistance coefficient"), - -/* v4.0 */ -IOP( "rbdb", B4SOI_RBDB, IF_REAL , "Body resistance"), -IOP( "rbsb", B4SOI_RBSB, IF_REAL , "Body resistance"), -IOP( "delvto", B4SOI_DELVTO, IF_REAL, "Zero bias threshold voltage variation"), -IOPR( "delvt0", B4SOI_DELVTO, IF_REAL, "Zero bias threshold voltage variation"), -/* v4.0 end */ - -IOP( "soimod", B4SOI_SOIMOD, IF_INTEGER, "Instance model selector for PD/FD operation"), /* v3.2 */ - -/* v2.0 release */ -IOP( "nbc", B4SOI_NBC, IF_REAL, "Number of body contact isolation edge"), -IOP( "nseg", B4SOI_NSEG, IF_REAL, "Number segments for width partitioning"), -IOP( "pdbcp", B4SOI_PDBCP, IF_REAL, "Perimeter length for bc parasitics at drain side"), -IOP( "psbcp", B4SOI_PSBCP, IF_REAL, "Perimeter length for bc parasitics at source side"), -IOP( "agbcp", B4SOI_AGBCP, IF_REAL, "Gate to body overlap area for bc parasitics"), -IOP( "agbcp2", B4SOI_AGBCP2, IF_REAL, "Parasitic Gate to body overlap area for bc parasitics"), /* v4.1 improvement on BC */ -IOP( "agbcpd", B4SOI_AGBCPD, IF_REAL, "Gate to body overlap area for bc parasitics in DC"), -IOP( "aebcp", B4SOI_AEBCP, IF_REAL, "Substrate to body overlap area for bc prasitics"), -IOP( "vbsusr", B4SOI_VBSUSR, IF_REAL, "Vbs specified by user"), -IOP( "tnodeout", B4SOI_TNODEOUT, IF_FLAG, "Flag indicating external temp node"), - -/*v3.1 added rgatemod */ -IOP( "rgatemod", B4SOI_RGATEMOD, IF_INTEGER, "Gate resistance model selector"), -/*v3.1 added rgatemod */ -IOP( "rbodymod", B4SOI_RBODYMOD, IF_INTEGER, "Body R model selector"),/* v4.0 */ -}; - -IFparm B4SOImPTable[] = { /* model parameters */ -/*4.1*/ -IOP( "mtrlmod", B4SOI_MOD_MTRLMOD, IF_INTEGER, "parameter for non-silicon substrate or metal gate selector"), -IOP( "vgstcvmod", B4SOI_MOD_VGSTCVMOD, IF_INTEGER, "Improved VgsteffCV selector"), -IOP( "gidlmod", B4SOI_MOD_GIDLMOD, IF_INTEGER, "parameter for GIDL selector"), -IOP( "iiimod", B4SOI_MOD_IIIMOD, IF_INTEGER, "parameter for III selector"), -IOP( "eot", B4SOI_MOD_EOT, IF_REAL, "Effective SiO2 thickness"), -IOP( "epsrox", B4SOI_MOD_EPSROX, IF_REAL, "Dielectric constant of the gate oxide relative to vacuum"), -IOP( "epsrsub", B4SOI_MOD_EPSRSUB, IF_REAL, "Dielectric constant of substrate relative to vacuum"), -IOP( "ni0sub", B4SOI_MOD_NI0SUB, IF_REAL, "Intrinsic carrier concentration of substrate at Tnom"), -IOP( "bg0sub", B4SOI_MOD_BG0SUB, IF_REAL, "Band-gap of substrate at T=0K"), -IOP( "tbgasub", B4SOI_MOD_TBGASUB, IF_REAL, "First parameter of band-gap change due to temperature"), -IOP( "tbgbsub", B4SOI_MOD_TBGBSUB, IF_REAL, "Second parameter of band-gap change due to temperature"), -IOP( "phig", B4SOI_MOD_PHIG, IF_REAL, "Work function of gate"), -IOP( "easub",B4SOI_MOD_EASUB, IF_REAL, "Electron affinity of substrate"), - -IOP( "leffeot", B4SOI_MOD_LEFFEOT, IF_REAL, "Effective length for extraction of EOT"), -IOP( "weffeot", B4SOI_MOD_WEFFEOT, IF_REAL, "Effective width for extraction of EOT"), -IOP( "vddeot", B4SOI_MOD_VDDEOT, IF_REAL, "Voltage for extraction of EOT"), -IOP( "tempeot", B4SOI_MOD_TEMPEOT, IF_REAL, " Temperature for extraction of EOT"), -IOP( "ados", B4SOI_MOD_ADOS, IF_REAL, "Charge centroid parameter"), -IOP( "bdos", B4SOI_MOD_BDOS, IF_REAL, "Charge centroid parameter"), -IOP( "epsrgate", B4SOI_MOD_EPSRGATE, IF_REAL, "Dielectric constant of gate relative to vacuum"), -IOP( "capmod", B4SOI_MOD_CAPMOD, IF_INTEGER, "Capacitance model selector"), -IOP( "mobmod", B4SOI_MOD_MOBMOD, IF_INTEGER, "Mobility model selector"), -/*IOP( "noimod", B4SOI_MOD_NOIMOD, IF_INTEGER, "Noise model selector"), v3.2 */ -IOP( "paramchk", B4SOI_MOD_PARAMCHK, IF_INTEGER, "Model parameter checking selector"), -IOP( "binunit", B4SOI_MOD_BINUNIT, IF_INTEGER, "Bin unit selector"), -IOP( "version", B4SOI_MOD_VERSION, IF_REAL, " parameter for model version"), -IOP( "tox", B4SOI_MOD_TOX, IF_REAL, "Gate oxide thickness in meters"), -IOP( "toxp", B4SOI_MOD_TOXP, IF_REAL, " Physical gate oxide thickness"), -IOP( "toxm", B4SOI_MOD_TOXM, IF_REAL, "Gate oxide thickness used in extraction"), /* v3.2 */ -IOP( "dtoxcv", B4SOI_MOD_DTOXCV, IF_REAL, "Delta oxide thickness in meters in CapMod3"), /* v2.2.3 */ - -IOP( "cdsc", B4SOI_MOD_CDSC, IF_REAL, "Drain/Source and channel coupling capacitance"), -IOP( "cdscb", B4SOI_MOD_CDSCB, IF_REAL, "Body-bias dependence of cdsc"), -IOP( "cdscd", B4SOI_MOD_CDSCD, IF_REAL, "Drain-bias dependence of cdsc"), -IOP( "cit", B4SOI_MOD_CIT, IF_REAL, "Interface state capacitance"), -IOP( "nfactor", B4SOI_MOD_NFACTOR, IF_REAL, "Subthreshold swing Coefficient"), -IOP( "vsat", B4SOI_MOD_VSAT, IF_REAL, "Saturation velocity at tnom"), -IOP( "at", B4SOI_MOD_AT, IF_REAL, "Temperature coefficient of vsat"), -IOP( "a0", B4SOI_MOD_A0, IF_REAL, "Non-uniform depletion width effect coefficient."), -IOP( "ags", B4SOI_MOD_AGS, IF_REAL, "Gate bias coefficient of Abulk."), -IOP( "a1", B4SOI_MOD_A1, IF_REAL, "Non-saturation effect coefficient"), -IOP( "a2", B4SOI_MOD_A2, IF_REAL, "Non-saturation effect coefficient"), -IOP( "keta", B4SOI_MOD_KETA, IF_REAL, "Body-bias coefficient of non-uniform depletion width effect."), -IOP( "nsub", B4SOI_MOD_NSUB, IF_REAL, "Substrate doping concentration with polarity"), -IOP( "nch", B4SOI_MOD_NPEAK, IF_REAL, "Channel doping concentration"), -IOP( "ngate", B4SOI_MOD_NGATE, IF_REAL, "Poly-gate doping concentration"), -IOP( "nsd", B4SOI_MOD_NSD, IF_REAL, "S/D doping concentration"), -IOP( "gamma1", B4SOI_MOD_GAMMA1, IF_REAL, "Vth body coefficient"), -IOP( "gamma2", B4SOI_MOD_GAMMA2, IF_REAL, "Vth body coefficient"), -IOP( "vbx", B4SOI_MOD_VBX, IF_REAL, "Vth transition body Voltage"), -IOP( "vbm", B4SOI_MOD_VBM, IF_REAL, "Maximum body voltage"), - -IOP( "xt", B4SOI_MOD_XT, IF_REAL, "Doping depth"), -IOP( "k1", B4SOI_MOD_K1, IF_REAL, "Bulk effect coefficient 1"), -IOP( "kt1", B4SOI_MOD_KT1, IF_REAL, "Temperature coefficient of Vth"), -IOP( "kt1l", B4SOI_MOD_KT1L, IF_REAL, "Temperature coefficient of Vth"), -IOP( "kt2", B4SOI_MOD_KT2, IF_REAL, "Body-coefficient of kt1"), -IOP( "k2", B4SOI_MOD_K2, IF_REAL, "Bulk effect coefficient 2"), -IOP( "k3", B4SOI_MOD_K3, IF_REAL, "Narrow width effect coefficient"), -IOP( "k3b", B4SOI_MOD_K3B, IF_REAL, "Body effect coefficient of k3"), -IOP( "w0", B4SOI_MOD_W0, IF_REAL, "Narrow width effect parameter"), -IOP( "lpe0", B4SOI_MOD_LPE0, IF_REAL, "Lateral non-uniform doping effect"), -IOP( "lpeb", B4SOI_MOD_LPEB, IF_REAL, "Lateral non-uniform doping effect for body bias"), -IOP( "dvt0", B4SOI_MOD_DVT0, IF_REAL, "Short channel effect coeff. 0"), -IOP( "dvt1", B4SOI_MOD_DVT1, IF_REAL, "Short channel effect coeff. 1"), -IOP( "dvt2", B4SOI_MOD_DVT2, IF_REAL, "Short channel effect coeff. 2"), -IOP( "dvt0w", B4SOI_MOD_DVT0W, IF_REAL, "Narrow Width coeff. 0"), -IOP( "dvt1w", B4SOI_MOD_DVT1W, IF_REAL, "Narrow Width effect coeff. 1"), -IOP( "dvt2w", B4SOI_MOD_DVT2W, IF_REAL, "Narrow Width effect coeff. 2"), -IOP( "drout", B4SOI_MOD_DROUT, IF_REAL, "DIBL coefficient of output resistance"), -IOP( "dsub", B4SOI_MOD_DSUB, IF_REAL, "DIBL coefficient in the subthreshold region"), -IOP( "vth0", B4SOI_MOD_VTH0, IF_REAL,"Threshold voltage"), -IOPR("vtho", B4SOI_MOD_VTH0, IF_REAL,"Threshold voltage"), -IOP( "vfb", B4SOI_MOD_VFB, IF_REAL, "Flat Band Voltage"), /* v4.1 */ -IOP( "ua", B4SOI_MOD_UA, IF_REAL, "Linear gate dependence of mobility"), -IOP( "ua1", B4SOI_MOD_UA1, IF_REAL, "Temperature coefficient of ua"), -IOP( "ub", B4SOI_MOD_UB, IF_REAL, "Quadratic gate dependence of mobility"), -IOP( "ub1", B4SOI_MOD_UB1, IF_REAL, "Temperature coefficient of ub"), -IOP( "uc", B4SOI_MOD_UC, IF_REAL, "Body-bias dependence of mobility"), -IOP( "uc1", B4SOI_MOD_UC1, IF_REAL, "Temperature coefficient of uc"), -IOP( "u0", B4SOI_MOD_U0, IF_REAL, "Low-field mobility at Tnom"), -IOP( "eu", B4SOI_MOD_EU, IF_REAL, "Mobility exponent"), -IOP( "ute", B4SOI_MOD_UTE, IF_REAL, "Temperature coefficient of mobility"), -IOP( "ucs", B4SOI_MOD_UCS, IF_REAL, "Mobility exponent"), -IOP( "ucste", B4SOI_MOD_UCSTE, IF_REAL, " Temperature coefficient of UCS"), -IOP( "ud", B4SOI_MOD_UD, IF_REAL, "Coulomb scattering factor of mobility"), -IOP( "ud1", B4SOI_MOD_UD1, IF_REAL, "Temperature coefficient of ud"), -IOP( "voff", B4SOI_MOD_VOFF, IF_REAL, "Threshold voltage offset"), -IOP( "tnom", B4SOI_MOD_TNOM, IF_REAL, "Parameter measurement temperature"), -IOP( "cgso", B4SOI_MOD_CGSO, IF_REAL, "Gate-source overlap capacitance per width"), -IOP( "cgdo", B4SOI_MOD_CGDO, IF_REAL, "Gate-drain overlap capacitance per width"), -IOP( "xpart", B4SOI_MOD_XPART, IF_REAL, "Channel charge partitioning"), -IOP( "delta", B4SOI_MOD_DELTA, IF_REAL, "Effective Vds parameter"), -IOP( "rsh", B4SOI_MOD_RSH, IF_REAL, "Source-drain sheet resistance"), -IOP( "rdsw", B4SOI_MOD_RDSW, IF_REAL, "Source-drain resistance per width"), -IOP( "rsw", B4SOI_MOD_RSW, IF_REAL, "Source resistance per width"), /* v4.0 */ -IOP( "rdw", B4SOI_MOD_RDW, IF_REAL, "Drain resistance per width"), /* v4.0 */ -IOP( "rswmin", B4SOI_MOD_RSWMIN, IF_REAL, "Source resistance per width at high Vg"), -IOP( "rdwmin", B4SOI_MOD_RDWMIN, IF_REAL, "Drain resistance per width at hight Vg"), - -IOP( "prwg", B4SOI_MOD_PRWG, IF_REAL, "Gate-bias effect on parasitic resistance "), -IOP( "prwb", B4SOI_MOD_PRWB, IF_REAL, "Body-effect on parasitic resistance "), - -IOP( "prt", B4SOI_MOD_PRT, IF_REAL, "Temperature coefficient of parasitic resistance "), -IOP( "eta0", B4SOI_MOD_ETA0, IF_REAL, "Subthreshold region DIBL coefficient"), -IOP( "etab", B4SOI_MOD_ETAB, IF_REAL, "Subthreshold region DIBL coefficient"), -IOP( "pclm", B4SOI_MOD_PCLM, IF_REAL, "Channel length modulation Coefficient"), -IOP( "pdiblc1", B4SOI_MOD_PDIBL1, IF_REAL, "Drain-induced barrier lowering coefficient"), -IOP( "pdiblc2", B4SOI_MOD_PDIBL2, IF_REAL, "Drain-induced barrier lowering coefficient"), -IOP( "pdiblcb", B4SOI_MOD_PDIBLB, IF_REAL, "Body-effect on drain-induced barrier lowering"), - -IOP( "pvag", B4SOI_MOD_PVAG, IF_REAL, "Gate dependence of output resistance parameter"), - -IOP( "shmod", B4SOI_MOD_SHMOD, IF_INTEGER, "Self heating mode selector"), -/* IOP( "ddmod", B4SOI_MOD_DDMOD, IF_INTEGER, "Dynamic depletion mode selector"), */ /*v4.2 soiMod = 1 now has the functionality */ -IOP( "tbox", B4SOI_MOD_TBOX, IF_REAL, "Back gate oxide thickness in meters"), -IOP( "tsi", B4SOI_MOD_TSI, IF_REAL, "Silicon-on-insulator thickness in meters"), -IOP( "etsi", B4SOI_MOD_ETSI, IF_REAL, "Effective Silicon-on-insulator thickness in meters"), -IOP( "xj", B4SOI_MOD_XJ, IF_REAL, "Junction Depth"), -IOP( "rth0", B4SOI_MOD_RTH0, IF_REAL, "Self-heating thermal resistance"), -IOP( "cth0", B4SOI_MOD_CTH0, IF_REAL, "Self-heating thermal capacitance"), - -IOP( "cfrcoeff", B4SOI_MOD_CFRCOEFF, IF_REAL, "Fringe Cap parameter"), /* v4.4 */ -IOP( "egidl", B4SOI_MOD_EGIDL, IF_REAL, "GIDL first parameter"), -IOP( "agidl", B4SOI_MOD_AGIDL, IF_REAL, "GIDL second parameter"), -IOP( "bgidl", B4SOI_MOD_BGIDL, IF_REAL, "GIDL third parameter"), -IOP( "cgidl", B4SOI_MOD_CGIDL, IF_REAL, "GIDL vb parameter"), -IOP( "rgidl", B4SOI_MOD_RGIDL, IF_REAL, "GIDL vg parameter"), -IOP( "kgidl", B4SOI_MOD_KGIDL, IF_REAL, "GIDL vb parameter"), -IOP( "fgidl", B4SOI_MOD_FGIDL, IF_REAL, "GIDL vb parameter"), - -IOP( "egisl", B4SOI_MOD_EGISL, IF_REAL, "GISL first parameter"), -IOP( "agisl", B4SOI_MOD_AGISL, IF_REAL, "GISL second parameter"), -IOP( "bgisl", B4SOI_MOD_BGISL, IF_REAL, "GISL third parameter"), -IOP( "cgisl", B4SOI_MOD_CGISL, IF_REAL, "GISL vb parameter"), -IOP( "rgisl", B4SOI_MOD_RGISL, IF_REAL, "GISL vg parameter"), -IOP( "kgisl", B4SOI_MOD_KGISL, IF_REAL, "GISL vb parameter"), -IOP( "fgisl", B4SOI_MOD_FGISL, IF_REAL, "GISL vb parameter"), - -IOP( "ndiode", B4SOI_MOD_NDIODES, IF_REAL,"Diode non-ideality factor"),/*v4.0*/ -IOP( "ndioded", B4SOI_MOD_NDIODED, IF_REAL,"Diode non-ideality factor"),/*v4.0*/ -IOP( "xbjt", B4SOI_MOD_XBJT, IF_REAL, "Temperature coefficient for Isbjt"), - -IOP( "xdif", B4SOI_MOD_XDIFS, IF_REAL, "Temperature coefficient for Isdif"), -IOP( "xrec", B4SOI_MOD_XRECS, IF_REAL, "Temperature coefficient for Isrec"), -IOP( "xtun", B4SOI_MOD_XTUNS, IF_REAL, "Temperature coefficient for Istun"), -IOP( "xdifd", B4SOI_MOD_XDIFD, IF_REAL, "Temperature coefficient for Iddif"), -IOP( "xrecd", B4SOI_MOD_XRECD, IF_REAL, "Temperature coefficient for Idrec"), -IOP( "xtund", B4SOI_MOD_XTUND, IF_REAL, "Temperature coefficient for Idtun"), - -IOP( "pbswg", B4SOI_MOD_PBSWGS, IF_REAL, "Source(gate side) sidewall junction capacitance built in potential"), /* v4.0 */ -IOP( "pbswgd", B4SOI_MOD_PBSWGD, IF_REAL, "Drain(gate side) sidewall junction capacitance built in potential"), /* v4.0 */ -IOP( "mjswg", B4SOI_MOD_MJSWGS, IF_REAL, "Source (gate side) sidewall junction capacitance grading coefficient"), /* v4.0 */ -IOP( "mjswgd", B4SOI_MOD_MJSWGD, IF_REAL, "Drain (gate side) sidewall junction capacitance grading coefficient"), /* v4.0 */ -IOP( "cjswg", B4SOI_MOD_CJSWGS, IF_REAL, "Source(gate side) sidewall junction capacitance per unit width"), /* v4.0 */ -IOP( "cjswgd", B4SOI_MOD_CJSWGD, IF_REAL, "Drain (gate side) sidewall junction capacitance per unit width"), /* v4.0 */ -IOP( "lint", B4SOI_MOD_LINT, IF_REAL, "Length reduction parameter"), -IOP( "ll", B4SOI_MOD_LL, IF_REAL, "Length reduction parameter"), -IOP( "llc", B4SOI_MOD_LLC, IF_REAL, "Length reduction parameter"), /* v2.2.3 */ -IOP( "lln", B4SOI_MOD_LLN, IF_REAL, "Length reduction parameter"), -IOP( "lw", B4SOI_MOD_LW, IF_REAL, "Length reduction parameter"), -IOP( "lwc", B4SOI_MOD_LWC, IF_REAL, "Length reduction parameter"), /* v2.2.3 */ -IOP( "lwn", B4SOI_MOD_LWN, IF_REAL, "Length reduction parameter"), -IOP( "lwl", B4SOI_MOD_LWL, IF_REAL, "Length reduction parameter"), -IOP( "lwlc", B4SOI_MOD_LWLC, IF_REAL, "Length reduction parameter"), /* v2.2.3 */ - -IOP( "wr", B4SOI_MOD_WR, IF_REAL, "Width dependence of rds"), -IOP( "wint", B4SOI_MOD_WINT, IF_REAL, "Width reduction parameter"), -IOP( "dwg", B4SOI_MOD_DWG, IF_REAL, "Width reduction parameter"), -IOP( "dwb", B4SOI_MOD_DWB, IF_REAL, "Width reduction parameter"), - -IOP( "wl", B4SOI_MOD_WL, IF_REAL, "Width reduction parameter"), -IOP( "wlc", B4SOI_MOD_WLC, IF_REAL, "Width reduction parameter"), /* v2.2.3 */ -IOP( "wln", B4SOI_MOD_WLN, IF_REAL, "Width reduction parameter"), -IOP( "ww", B4SOI_MOD_WW, IF_REAL, "Width reduction parameter"), -IOP( "wwc", B4SOI_MOD_WWC, IF_REAL, "Width reduction parameter"), /* v2.2.3 */ -IOP( "wwn", B4SOI_MOD_WWN, IF_REAL, "Width reduction parameter"), -IOP( "wwl", B4SOI_MOD_WWL, IF_REAL, "Width reduction parameter"), -IOP( "wwlc", B4SOI_MOD_WWLC, IF_REAL, "Width reduction parameter"), /* v2.2.3 */ - -IOP( "b0", B4SOI_MOD_B0, IF_REAL, "Abulk narrow width parameter"), -IOP( "b1", B4SOI_MOD_B1, IF_REAL, "Abulk narrow width parameter"), - -IOP( "cgsl", B4SOI_MOD_CGSL, IF_REAL, "New C-V model parameter"), -IOP( "cgdl", B4SOI_MOD_CGDL, IF_REAL, "New C-V model parameter"), -IOP( "ckappa", B4SOI_MOD_CKAPPA, IF_REAL, "New C-V model parameter"), -IOP( "cf", B4SOI_MOD_CF, IF_REAL, "Fringe capacitance parameter"), -IOP( "clc", B4SOI_MOD_CLC, IF_REAL, "Vdsat parameter for C-V model"), -IOP( "cle", B4SOI_MOD_CLE, IF_REAL, "Vdsat parameter for C-V model"), -IOP( "dwc", B4SOI_MOD_DWC, IF_REAL, "Delta W for C-V model"), -IOP( "dlc", B4SOI_MOD_DLC, IF_REAL, "Delta L for C-V model"), - -IOP( "alpha0", B4SOI_MOD_ALPHA0, IF_REAL, "substrate current model parameter"), - -IOP( "noia", B4SOI_MOD_NOIA, IF_REAL, "Flicker noise parameter"), -IOP( "noib", B4SOI_MOD_NOIB, IF_REAL, "Flicker noise parameter"), -IOP( "noic", B4SOI_MOD_NOIC, IF_REAL, "Flicker noise parameter"), - -/* v3.2 */ -IOP( "fnoimod", B4SOI_MOD_FNOIMOD, IF_INTEGER, "Flicker noise model selector"), -IOP( "tnoimod", B4SOI_MOD_TNOIMOD, IF_INTEGER, "Thermal noise model selector"), -IOP( "tnoia", B4SOI_MOD_TNOIA, IF_REAL, "Thermal noise parameter"), -IOP( "tnoib", B4SOI_MOD_TNOIB, IF_REAL, "Thermal noise parameter"), -IOP( "rnoia", B4SOI_MOD_RNOIA, IF_REAL, "Thermal noise coefficient"), -IOP( "rnoib", B4SOI_MOD_RNOIB, IF_REAL, "Thermal noise coefficient"), -IOP( "ntnoi", B4SOI_MOD_NTNOI, IF_REAL, "Thermal noise parameter"), -/* v3.2 */ - -/* v4.0 stress effect*/ -IOP( "saref", B4SOI_MOD_SAREF, IF_REAL, "Reference distance between OD edge to poly of one side"), -IOP( "sbref", B4SOI_MOD_SBREF, IF_REAL, "Reference distance between OD edge to poly of the other side"), -IOP( "wlod", B4SOI_MOD_WLOD, IF_REAL, "Width parameter for stress effect"), -IOP( "ku0", B4SOI_MOD_KU0, IF_REAL, "Mobility degradation/enhancement coefficient for LOD"), -IOP( "kvsat", B4SOI_MOD_KVSAT, IF_REAL, "Saturation velocity degradation/enhancement parameter for LOD"), -IOP( "kvth0", B4SOI_MOD_KVTH0, IF_REAL, "Threshold degradation/enhancement parameter for LOD"), -IOP( "tku0", B4SOI_MOD_TKU0, IF_REAL, "Temperature coefficient of KU0"), -IOP( "llodku0", B4SOI_MOD_LLODKU0, IF_REAL, "Length parameter for u0 LOD effect"), -IOP( "wlodku0", B4SOI_MOD_WLODKU0, IF_REAL, "Width parameter for u0 LOD effect"), -IOP( "llodvth", B4SOI_MOD_LLODVTH, IF_REAL, "Length parameter for vth LOD effect"), -IOP( "wlodvth", B4SOI_MOD_WLODVTH, IF_REAL, "Width parameter for vth LOD effect"), -IOP( "lku0", B4SOI_MOD_LKU0, IF_REAL, "Length dependence of ku0"), -IOP( "wku0", B4SOI_MOD_WKU0, IF_REAL, "Width dependence of ku0"), -IOP( "pku0", B4SOI_MOD_PKU0, IF_REAL, "Cross-term dependence of ku0"), -IOP( "lkvth0", B4SOI_MOD_LKVTH0, IF_REAL, "Length dependence of kvth0"), -IOP( "wkvth0", B4SOI_MOD_WKVTH0, IF_REAL, "Width dependence of kvth0"), -IOP( "pkvth0", B4SOI_MOD_PKVTH0, IF_REAL, "Cross-term dependence of kvth0"), -IOP( "stk2", B4SOI_MOD_STK2, IF_REAL, "K2 shift factor related to stress effect on vth"), -IOP( "lodk2", B4SOI_MOD_LODK2, IF_REAL, "K2 shift modification factor for stress effect"), -IOP( "steta0", B4SOI_MOD_STETA0, IF_REAL, "eta0 shift factor related to stress effect on vth"), -IOP( "lodeta0", B4SOI_MOD_LODETA0, IF_REAL, "eta0 shift modification factor for stress effect"), -/* v4.0 stress effect end */ - -/* v4.0 */ -IOP( "gbmin", B4SOI_MOD_GBMIN, IF_REAL, "Minimum body conductance"), -IOP( "rbdb", B4SOI_MOD_RBDB, IF_REAL, "Resistance between bNode and dbNode"), -IOP( "rbsb", B4SOI_MOD_RBSB, IF_REAL, "Resistance between bNode and sbNode"), -IOP( "bf", B4SOI_MOD_BF, IF_REAL, "Flicker noise length dependence exponent"), -IOP( "w0flk", B4SOI_MOD_W0FLK, IF_REAL, "Flicker noise width dependence"), -IOP( "frbody", B4SOI_MOD_FRBODY,IF_REAL, "Layout dependent rbody multiplier "), -IOP( "dvtp0", B4SOI_MOD_DVTP0, IF_REAL, "First parameter for Vth shift due to pocket"), -IOP( "ldvtp0", B4SOI_MOD_LDVTP0, IF_REAL, "Length dependence of dvtp0"), -IOP( "wdvtp0", B4SOI_MOD_WDVTP0, IF_REAL, "Width dependence of dvtp0"), -IOP( "pdvtp0", B4SOI_MOD_PDVTP0, IF_REAL, "Cross-term dependence of dvtp0"), -IOP( "dvtp1", B4SOI_MOD_DVTP1, IF_REAL, "Second parameter for Vth shift due to pocket"), -IOP( "ldvtp1", B4SOI_MOD_LDVTP1, IF_REAL, "Length dependence of dvtp1"), -IOP( "wdvtp1", B4SOI_MOD_WDVTP1, IF_REAL, "Width dependence of dvtp1"), -IOP( "pdvtp1", B4SOI_MOD_PDVTP1, IF_REAL, "Cross-term dependence of dvtp1"), -IOP( "dvtp2", B4SOI_MOD_DVTP2, IF_REAL, "Third parameter for Vth shift due to pocket"), -IOP( "ldvtp2", B4SOI_MOD_LDVTP2, IF_REAL, "Length dependence of dvtp2"), -IOP( "wdvtp2", B4SOI_MOD_WDVTP2, IF_REAL, "Width dependence of dvtp2"), -IOP( "pdvtp2", B4SOI_MOD_PDVTP2, IF_REAL, "Cross-term dependence of dvtp2"), -IOP( "dvtp3", B4SOI_MOD_DVTP3, IF_REAL, "Third parameter for Vth shift due to pocket"), -IOP( "ldvtp3", B4SOI_MOD_LDVTP3, IF_REAL, "Length dependence of dvtp3"), -IOP( "wdvtp3", B4SOI_MOD_WDVTP3, IF_REAL, "Width dependence of dvtp3"), -IOP( "pdvtp3", B4SOI_MOD_PDVTP3, IF_REAL, "Cross-term dependence of dvtp3"), -IOP( "dvtp4", B4SOI_MOD_DVTP4, IF_REAL, "Forth parameter for Vth shift due to pocket"), -IOP( "ldvtp4", B4SOI_MOD_LDVTP4, IF_REAL, "Length dependence of dvtp4"), -IOP( "wdvtp4", B4SOI_MOD_WDVTP4, IF_REAL, "Width dependence of dvtp4"), -IOP( "pdvtp4", B4SOI_MOD_PDVTP4, IF_REAL, "Cross-term dependence of dvtp4"), -IOP( "minv", B4SOI_MOD_MINV, IF_REAL, "For moderate invversion in Vgsteff"), -IOP( "lminv", B4SOI_MOD_LMINV, IF_REAL, "Length dependence of minv"), -IOP( "wminv", B4SOI_MOD_WMINV, IF_REAL, "width dependence of minv"), -IOP( "pminv", B4SOI_MOD_PMINV, IF_REAL, "Cross-term dependence of minv"), -IOP( "pdits", B4SOI_MOD_PDITS, IF_REAL, "Coefficient for drain-induced Vth shifts"), -IOP( "pditsl", B4SOI_MOD_PDITSL, IF_REAL, "Length dependence of drain-induced Vth shifts"), -IOP( "pditsd", B4SOI_MOD_PDITSD, IF_REAL, "Vds dependence of drain-induced Vth shifts"), -IOP( "fprout", B4SOI_MOD_FPROUT, IF_REAL, "Rout degradation coefficient for pocket devices"), -IOP( "lfprout", B4SOI_MOD_LFPROUT, IF_REAL, "Length dependence of pdiblcb"), -IOP( "lpdits", B4SOI_MOD_LPDITS, IF_REAL, "Length dependence of pdits"), -IOP( "lpditsd", B4SOI_MOD_LPDITSD, IF_REAL, "Length dependence of pditsd"), -IOP( "wfprout", B4SOI_MOD_WFPROUT, IF_REAL, "Width dependence of pdiblcb"), -IOP( "wpdits", B4SOI_MOD_WPDITS, IF_REAL, "Width dependence of pdits"), -IOP( "wpditsd", B4SOI_MOD_WPDITSD, IF_REAL, "Width dependence of pditsd"), -IOP( "pfprout", B4SOI_MOD_PFPROUT, IF_REAL, "Cross-term dependence of pdiblcb"), -IOP( "ppdits", B4SOI_MOD_PPDITS, IF_REAL, "Cross-term dependence of pdits"), -IOP( "ppditsd", B4SOI_MOD_PPDITSD, IF_REAL, "Cross-term dependence of pditsd"), - -/* v4.0 */ - -IOP( "em", B4SOI_MOD_EM, IF_REAL, "Flicker noise parameter"), -IOP( "ef", B4SOI_MOD_EF, IF_REAL, "Flicker noise frequency exponent"), -IOP( "af", B4SOI_MOD_AF, IF_REAL, "Flicker noise exponent"), -IOP( "kf", B4SOI_MOD_KF, IF_REAL, "Flicker noise coefficient"), -IOP( "noif", B4SOI_MOD_NOIF, IF_REAL, "Floating body excess noise ideality factor"), - -/* v2.0 release */ -IOP( "k1w1", B4SOI_MOD_K1W1, IF_REAL, "First Body effect width dependent parameter"), -IOP( "k1w2", B4SOI_MOD_K1W2, IF_REAL, "Second Boby effect width dependent parameter"), -IOP( "ketas", B4SOI_MOD_KETAS, IF_REAL, "Surface potential adjustment for bulk charge effect"), -IOP( "dwbc", B4SOI_MOD_DWBC, IF_REAL, "Width offset for body contact isolation edge"), -IOP( "beta0", B4SOI_MOD_BETA0, IF_REAL, "First Vds dependent parameter of impact ionizition current"), -IOP( "beta1", B4SOI_MOD_BETA1, IF_REAL, "Second Vds dependent parameter of impact ionizition current"), -IOP( "beta2", B4SOI_MOD_BETA2, IF_REAL, "Third Vds dependent parameter of impact ionizition current"), -IOP( "vdsatii0", B4SOI_MOD_VDSATII0, IF_REAL, "Nominal drain saturation voltage at threshold for impact ionizition current"), -IOP( "tii", B4SOI_MOD_TII, IF_REAL, "Temperature dependent parameter for impact ionizition"), -IOP( "lii", B4SOI_MOD_LII, IF_REAL, "Channel length dependent parameter at threshold for impact ionizition current"), -IOP( "sii0", B4SOI_MOD_SII0, IF_REAL, "First Vgs dependent parameter for impact ionizition current"), -IOP( "sii1", B4SOI_MOD_SII1, IF_REAL, "Second Vgs dependent parameter for impact ionizition current"), -IOP( "sii2", B4SOI_MOD_SII2, IF_REAL, "Third Vgs dependent parameter for impact ionizition current"), -IOP( "siid", B4SOI_MOD_SIID, IF_REAL, "Vds dependent parameter of drain saturation voltage for impact ionizition current"), -IOP( "fbjtii", B4SOI_MOD_FBJTII, IF_REAL, "Fraction of bipolar current affecting the impact ionization"), -/*4.1*/ -IOP( "ebjtii", B4SOI_MOD_EBJTII, IF_REAL, "Impact ionization parameter for BJT part"), -IOP( "cbjtii", B4SOI_MOD_CBJTII, IF_REAL, "Length scaling parameter for II BJT part"), -IOP( "vbci", B4SOI_MOD_VBCI, IF_REAL, "Internal B-C built-in potential"), -IOP( "abjtii", B4SOI_MOD_ABJTII, IF_REAL, "Exponent factor for avalanche current"), -IOP( "mbjtii", B4SOI_MOD_MBJTII, IF_REAL, "Internal B-C grading coefficient"), -IOP( "tvbci", B4SOI_MOD_TVBCI, IF_REAL, "Temperature coefficient for VBCI"), -IOP( "esatii", B4SOI_MOD_ESATII, IF_REAL, "Saturation electric field for impact ionization"), -IOP( "ntun", B4SOI_MOD_NTUNS, IF_REAL,"Reverse tunneling non-ideality factor"), -IOP( "ntund", B4SOI_MOD_NTUND, IF_REAL,"Reverse tunneling non-ideality factor"), -IOP( "nrecf0", B4SOI_MOD_NRECF0S, IF_REAL, "Recombination non-ideality factor at forward bias"), -IOP( "nrecf0d", B4SOI_MOD_NRECF0D, IF_REAL, "Recombination non-ideality factor at forward bias"), -IOP( "nrecr0", B4SOI_MOD_NRECR0S, IF_REAL, "Recombination non-ideality factor at reversed bias"), -IOP( "nrecr0d", B4SOI_MOD_NRECR0D, IF_REAL, "Recombination non-ideality factor at reversed bias"), -IOP( "isbjt", B4SOI_MOD_ISBJT, IF_REAL, "BJT injection saturation current"), -IOP( "idbjt", B4SOI_MOD_IDBJT, IF_REAL, "BJT injection saturation current"), -IOP( "isdif", B4SOI_MOD_ISDIF, IF_REAL, "Body to source/drain injection saturation current"), -IOP( "iddif", B4SOI_MOD_IDDIF, IF_REAL, "Body to source/drain injection saturation current"), /* v4.0 */ -IOP( "isrec", B4SOI_MOD_ISREC, IF_REAL, "Recombination in depletion saturation current"), -IOP( "idrec", B4SOI_MOD_IDREC, IF_REAL, "Recombination in depletion saturation current"), -IOP( "istun", B4SOI_MOD_ISTUN, IF_REAL, "Reverse tunneling saturation current"), -IOP( "idtun", B4SOI_MOD_IDTUN, IF_REAL, "Reverse tunneling saturation current"), -IOP( "ln", B4SOI_MOD_LN, IF_REAL, "Electron/hole diffusion length"), -IOP( "vrec0", B4SOI_MOD_VREC0S, IF_REAL, "Voltage dependent parameter for recombination current"), -IOP( "vrec0d", B4SOI_MOD_VREC0D, IF_REAL, "Voltage dependent parameter for recombination current"), -IOP( "vtun0", B4SOI_MOD_VTUN0S, IF_REAL, "Voltage dependent parameter for tunneling current"), -IOP( "vtun0d", B4SOI_MOD_VTUN0D, IF_REAL, "Voltage dependent parameter for tunneling current"), -IOP( "nbjt", B4SOI_MOD_NBJT, IF_REAL, "Power coefficient of channel length dependency for bipolar current"), -IOP( "lbjt0", B4SOI_MOD_LBJT0, IF_REAL, "Refferenc channel length for bipolar cuurent"), -IOP( "ldif0", B4SOI_MOD_LDIF0, IF_REAL, "Channel-length dependency coefficient of diffusion cap"), -IOP( "vabjt", B4SOI_MOD_VABJT, IF_REAL, "Early voltage for bipolar current"), -IOP( "aely", B4SOI_MOD_AELY, IF_REAL, "Channel length dependency of early voltage for bipolar cuurent"), -IOP( "ahli", B4SOI_MOD_AHLIS, IF_REAL, "High level injection parameter for bipolar current"), /* v4.0 */ -IOP( "ahlid", B4SOI_MOD_AHLID, IF_REAL, "High level injection parameter for bipolar current"), /* v4.0 */ -IOP( "rbody", B4SOI_MOD_RBODY, IF_REAL, "Intrinsic body contact sheet resistance"), -IOP( "rbsh", B4SOI_MOD_RBSH, IF_REAL, "Extrinsic body contact sheet resistance"), -IOP( "cgeo", B4SOI_MOD_CGEO, IF_REAL, "Gate substrate overlap capacitance per unit channel length"), -IOP( "tt", B4SOI_MOD_TT, IF_REAL, "Diffusion capacitance transit time coefficient"), -IOP( "ndif", B4SOI_MOD_NDIF, IF_REAL, "Power coefficient of channel length dependency for diffusion capacitance"), -IOP( "vsdfb", B4SOI_MOD_VSDFB, IF_REAL, "Source/drain bottom diffusion capacitance flatband voltage"), -IOP( "vsdth", B4SOI_MOD_VSDTH, IF_REAL, "Source/drain bottom diffusion capacitance threshold voltage"), -IOP( "csdmin", B4SOI_MOD_CSDMIN, IF_REAL, "Source/drain bottom diffusion minimum capacitance"), -IOP( "asd", B4SOI_MOD_ASD, IF_REAL, "Source/drain bottom diffusion smoothing parameter"), -IOP( "csdesw", B4SOI_MOD_CSDESW, IF_REAL, "Source/drain sidewall fringing capacitance per unit length"), -IOP( "ntrecf", B4SOI_MOD_NTRECF, IF_REAL, "Temperature coefficient for Nrecf"), -IOP( "ntrecr", B4SOI_MOD_NTRECR, IF_REAL, "Temperature coefficient for Nrecr"), -IOP( "dlcb", B4SOI_MOD_DLCB, IF_REAL, "Length offset fitting parameter for body charge"), -IOP( "fbody", B4SOI_MOD_FBODY, IF_REAL, "Scaling factor for body charge"), -IOP( "tcjswg", B4SOI_MOD_TCJSWGS, IF_REAL, "Temperature coefficient of Cjswgs"), -IOP( "tpbswg", B4SOI_MOD_TPBSWGS, IF_REAL, "Temperature coefficient of Pbswgs"), -IOP( "tcjswgd", B4SOI_MOD_TCJSWGD, IF_REAL, "Temperature coefficient of Cjswgd"), -IOP( "tpbswgd", B4SOI_MOD_TPBSWGD, IF_REAL, "Temperature coefficient of Pbswgd"), -IOP( "acde", B4SOI_MOD_ACDE, IF_REAL, "Exponential coefficient for charge thickness in capMod=3 for accumulation and depletion regions"), -IOP( "moin", B4SOI_MOD_MOIN, IF_REAL, "Coefficient for the gate-bias dependent surface potential"), -IOP( "noff", B4SOI_MOD_NOFF, IF_REAL, "C-V turn-on/off parameter"), /* v3.2 */ -IOP( "delvt", B4SOI_MOD_DELVT, IF_REAL, "Threshold voltage adjust for CV"), -IOP( "kb1", B4SOI_MOD_KB1, IF_REAL, "Scaling factor for backgate charge"), -IOP( "dlbg", B4SOI_MOD_DLBG, IF_REAL, "Length offset fitting parameter for backgate charge"), - - -/* v2.2 release */ -IOP( "igmod", B4SOI_MOD_IGBMOD, IF_INTEGER, "gate-body tunneling current model selector"), /* v3.1.1 */ -IOPR("igbmod", B4SOI_MOD_IGBMOD, IF_INTEGER, "gate-body tunneling current model selector"), /* v3.0 */ -IOP( "igcmod", B4SOI_MOD_IGCMOD, IF_INTEGER, "gate-channel tunneling current model selector"), /* v3.0 */ -IOP( "toxqm", B4SOI_MOD_TOXQM, IF_REAL, "effective oxide thickness considering quantum effect"), -IOP( "wth0", B4SOI_MOD_WTH0, IF_REAL, "Minimum width for thermal resistance calculation"), -IOP( "rhalo", B4SOI_MOD_RHALO, IF_REAL, "body halo sheet resistance"), -IOP( "ntox", B4SOI_MOD_NTOX, IF_REAL, "power term of gate current"), -IOP( "toxref", B4SOI_MOD_TOXREF, IF_REAL, "target oxide thickness"), -IOP( "ebg", B4SOI_MOD_EBG, IF_REAL, "effective bandgap in gate current calcula."), -IOP( "vevb", B4SOI_MOD_VEVB, IF_REAL, "Vaux parameter for valence-band electron tunneling"), -IOP( "alphagb1", B4SOI_MOD_ALPHAGB1, IF_REAL, "First Vox dependent parameter for gate current in inversion"), -IOP( "betagb1", B4SOI_MOD_BETAGB1, IF_REAL, "Second Vox dependent parameter for gate current in inversion"), -IOP( "vgb1", B4SOI_MOD_VGB1, IF_REAL, "Third Vox dependent parameter for gate current in inversion"), -IOP( "vecb", B4SOI_MOD_VECB, IF_REAL, "Vaux parameter for conduction-band electron tunneling"), -IOP( "alphagb2", B4SOI_MOD_ALPHAGB2, IF_REAL, "First Vox dependent parameter for gate current in accumulation"), -IOP( "betagb2", B4SOI_MOD_BETAGB2, IF_REAL, "Second Vox dependent parameter for gate current in accumulation"), -IOP( "vgb2", B4SOI_MOD_VGB2, IF_REAL, "Third Vox dependent parameter for gate current in accumulation"), -IOP( "aigbcp2", B4SOI_MOD_AIGBCP2, IF_REAL, "First Vgp dependent parameter for gate current in accumulation in AGBCP2 region"), -IOP( "bigbcp2", B4SOI_MOD_BIGBCP2, IF_REAL, "Second Vgp dependent parameter for gate current in accumulation in AGBCP2 region"), -IOP( "cigbcp2", B4SOI_MOD_CIGBCP2, IF_REAL, "Third Vgp dependent parameter for gate current in accumulation in AGBCP2 region"), -IOP( "voxh", B4SOI_MOD_VOXH, IF_REAL, "the limit of Vox in gate current calculation"), -IOP( "deltavox", B4SOI_MOD_DELTAVOX, IF_REAL, "the smoothing parameter in the Vox smoothing function"), - -/* v3.0 */ -IOP( "aigc", B4SOI_MOD_AIGC, IF_REAL, "Parameter for Igc"), -IOP( "bigc", B4SOI_MOD_BIGC, IF_REAL, "Parameter for Igc"), -IOP( "cigc", B4SOI_MOD_CIGC, IF_REAL, "Parameter for Igc"), -IOP( "aigsd", B4SOI_MOD_AIGSD, IF_REAL, "Parameter for Igs,d"), -IOP( "bigsd", B4SOI_MOD_BIGSD, IF_REAL, "Parameter for Igs,d"), -IOP( "cigsd", B4SOI_MOD_CIGSD, IF_REAL, "Parameter for Igs,d"), -IOP( "nigc", B4SOI_MOD_NIGC, IF_REAL, "Parameter for Igc slope"), -IOP( "pigcd", B4SOI_MOD_PIGCD, IF_REAL, "Parameter for Igc partition"), -IOP( "poxedge", B4SOI_MOD_POXEDGE, IF_REAL, "Factor for the gate edge Tox"), -IOP( "dlcig", B4SOI_MOD_DLCIG, IF_REAL, "Delta L for Ig model"), - -/* v3.0 */ -IOP( "soimod", B4SOI_MOD_SOIMOD, IF_INTEGER, "model selector for SOI technology"), /* v3.2 bug fix */ -IOP( "vbs0pd", B4SOI_MOD_VBS0PD, IF_REAL, "Upper bound of built-in potential lowering for PD operation"), /* v3.2 */ -IOP( "vbs0fd", B4SOI_MOD_VBS0FD, IF_REAL, "Lower bound of built-in potential lowering for FD operation"), /* v3.2 */ -IOP( "vbsa", B4SOI_MOD_VBSA, IF_REAL, "Vbs0t offset voltage"), -IOP( "nofffd", B4SOI_MOD_NOFFFD,IF_REAL, "smoothing parameter in FD module"), -IOP( "vofffd", B4SOI_MOD_VOFFFD,IF_REAL, "smoothing parameter in FD module"), -IOP( "k1b", B4SOI_MOD_K1B, IF_REAL, "first backgate body effect parameter"), -IOP( "k2b", B4SOI_MOD_K2B, IF_REAL, "second backgate body effect parameter for short channel effect"), -IOP( "dk2b", B4SOI_MOD_DK2B, IF_REAL, "third backgate body effect parameter for short channel effect"), -IOP( "dvbd0", B4SOI_MOD_DVBD0, IF_REAL, "first short-channel effect parameter in FD module"), -IOP( "dvbd1", B4SOI_MOD_DVBD1, IF_REAL, "second short-channel effect parameter in FD module"), -IOP( "moinfd", B4SOI_MOD_MOINFD, IF_REAL, "Coefficient for the gate-bias dependent surface potential in FD"), -/* v3.0 */ - - -/* v3.1 added for RF */ -IOP( "rgatemod", B4SOI_MOD_RGATEMOD, IF_INTEGER, "Gate R model selector"), -IOP("xrcrg1", B4SOI_MOD_XRCRG1, IF_REAL, "First fitting parameter the bias-dependent Rg"), -IOP("xrcrg2", B4SOI_MOD_XRCRG2, IF_REAL, "Second fitting parameter the bias-dependent Rg"), -IOP("rshg", B4SOI_MOD_RSHG, IF_REAL, "Gate sheet resistance"), -IOP("ngcon", B4SOI_MOD_NGCON, IF_REAL, "Number of gate contacts"), -IOP( "xgw", B4SOI_MOD_XGW, IF_REAL, "Distance from gate contact center to device edge"), -IOP( "xgl", B4SOI_MOD_XGL, IF_REAL, "Variation in Ldrawn"), -/* v3.1 added for RF end */ - -/* 4.0 */ -IOP( "rbodymod", B4SOI_MOD_RBODYMOD, IF_INTEGER, "Body R model selector"), -/* 4.0 */ -IOP( "rdsmod", B4SOI_MOD_RDSMOD, IF_INTEGER, "Bias-dependent S/D resistance model selector"), /* v4.0 */ - -/* v4.1 */ -IOP( "fdmod", B4SOI_MOD_FDMOD, IF_INTEGER, "Improved dVbi model selector"), -IOP( "vsce", B4SOI_MOD_VSCE, IF_REAL, "SCE parameter for improved dVbi model"), -IOP( "cdsbs", B4SOI_MOD_CDSBS, IF_REAL, "coupling from Vd to Vbs for improved dVbi model"), -IOP( "minvcv", B4SOI_MOD_MINVCV, IF_REAL, "For moderate invversion in VgsteffCV"), -IOP( "lminvcv", B4SOI_MOD_LMINVCV, IF_REAL, "Length dependence of minvcv"), -IOP( "wminvcv", B4SOI_MOD_WMINVCV, IF_REAL, "width dependence of minvcv"), -IOP( "pminvcv", B4SOI_MOD_PMINVCV, IF_REAL, "Cross-term dependence of minvcv"), -IOP( "voffcv", B4SOI_MOD_VOFFCV, IF_REAL, "CV Threshold voltage offset"), -IOP( "lvoffcv", B4SOI_MOD_LVOFFCV, IF_REAL, "Length dependence of voffcv"), -IOP( "wvoffcv", B4SOI_MOD_WVOFFCV, IF_REAL, "Width dependence of voffcv"), -IOP( "pvoffcv", B4SOI_MOD_PVOFFCV, IF_REAL, "Cross-term dependence of voffcv"), -/* Added for binning - START */ -/* Length Dependence */ -/* v3.1 */ -IOP( "lxj", B4SOI_MOD_LXJ, IF_REAL, "Length dependence of xj"), -IOP( "lalphagb1", B4SOI_MOD_LALPHAGB1, IF_REAL, "Length dependence of alphagb1"), -IOP( "lbetagb1", B4SOI_MOD_LBETAGB1, IF_REAL, "Length dependence of betagb1"), -IOP( "lalphagb2", B4SOI_MOD_LALPHAGB2, IF_REAL, "Length dependence of alphagb2"), -IOP( "lbetagb2", B4SOI_MOD_LBETAGB2, IF_REAL, "Length dependence of betagb2"), -IOP( "laigbcp2", B4SOI_MOD_LAIGBCP2, IF_REAL, "Length dependence of aigbcp2"), -IOP( "lbigbcp2", B4SOI_MOD_LBIGBCP2, IF_REAL, "Length dependence of bigbcp2"), -IOP( "lcigbcp2", B4SOI_MOD_LCIGBCP2, IF_REAL, "Length dependence of cigbcp2"), -IOP( "lcgsl", B4SOI_MOD_LCGSL, IF_REAL, "Length dependence of cgsl"), -IOP( "lcgdl", B4SOI_MOD_LCGDL, IF_REAL, "Length dependence of cgdl"), -IOP( "lckappa", B4SOI_MOD_LCKAPPA, IF_REAL, "Length dependence of ckappa"), -IOP( "lndif", B4SOI_MOD_LNDIF, IF_REAL, "Length dependence of ndif"), -IOP( "lute", B4SOI_MOD_LUTE, IF_REAL, "Length dependence of ute"), -IOP( "lkt1", B4SOI_MOD_LKT1, IF_REAL, "Length dependence of kt1"), -IOP( "lkt1l", B4SOI_MOD_LKT1L, IF_REAL, "Length dependence of kt1l"), -IOP( "lkt2", B4SOI_MOD_LKT2, IF_REAL, "Length dependence of kt2"), -IOP( "lua1", B4SOI_MOD_LUA1, IF_REAL, "Length dependence of ua1"), -IOP( "lub1", B4SOI_MOD_LUB1, IF_REAL, "Length dependence of ub1"), -IOP( "luc1", B4SOI_MOD_LUC1, IF_REAL, "Length dependence of uc1"), -IOP( "lat", B4SOI_MOD_LAT, IF_REAL, "Length dependence of at"), -IOP( "lprt", B4SOI_MOD_LPRT, IF_REAL, "Length dependence of prt "), -IOP( "lntrecf", B4SOI_MOD_LNTRECF, IF_REAL, "Length dependence of ntrecf"), -IOP( "lntrecr", B4SOI_MOD_LNTRECR, IF_REAL, "Length dependence of ntrecr"), -IOP( "lxbjt", B4SOI_MOD_LXBJT, IF_REAL, "Length dependence of xbjt"), -IOP( "lxdif", B4SOI_MOD_LXDIFS, IF_REAL, "Length dependence of xdif"), -IOP( "lxrec", B4SOI_MOD_LXRECS, IF_REAL, "Length dependence of xrec"), -IOP( "lxtun", B4SOI_MOD_LXTUNS, IF_REAL, "Length dependence of xtun"), -IOP( "lxdifd", B4SOI_MOD_LXDIFD, IF_REAL, "Length dependence of xdifd"), -IOP( "lxrecd", B4SOI_MOD_LXRECD, IF_REAL, "Length dependence of xrecd"), -IOP( "lxtund", B4SOI_MOD_LXTUND, IF_REAL, "Length dependence of xtund"), - -/* v3.0 */ -IOP( "laigc", B4SOI_MOD_LAIGC, IF_REAL, "Length dependence of aigc"), -IOP( "lbigc", B4SOI_MOD_LBIGC, IF_REAL, "Length dependence of bigc"), -IOP( "lcigc", B4SOI_MOD_LCIGC, IF_REAL, "Length dependence of cigc"), -IOP( "laigsd", B4SOI_MOD_LAIGSD, IF_REAL, "Length dependence of aigsd"), -IOP( "lbigsd", B4SOI_MOD_LBIGSD, IF_REAL, "Length dependence of bigsd"), -IOP( "lcigsd", B4SOI_MOD_LCIGSD, IF_REAL, "Length dependence of cigsd"), -IOP( "lnigc", B4SOI_MOD_LNIGC, IF_REAL, "Length dependence of nigc"), -IOP( "lpigcd", B4SOI_MOD_LPIGCD, IF_REAL, "Length dependence for pigcd"), -IOP( "lpoxedge", B4SOI_MOD_LPOXEDGE, IF_REAL, "Length dependence for poxedge"), - -IOP( "lnch", B4SOI_MOD_LNPEAK, IF_REAL, "Length dependence of nch"), -IOP( "lnsub", B4SOI_MOD_LNSUB, IF_REAL, "Length dependence of nsub"), -IOP( "lngate", B4SOI_MOD_LNGATE, IF_REAL, "Length dependence of ngate"), -IOP( "lnsd", B4SOI_MOD_LNSD, IF_REAL, "Length dependence of nsd"), -IOP( "lvth0", B4SOI_MOD_LVTH0, IF_REAL,"Length dependence of vth0"), -IOP( "lvfb", B4SOI_MOD_LVFB, IF_REAL, "Length dependence of vfb"), /* v4.1 */ -IOP( "lk1", B4SOI_MOD_LK1, IF_REAL, "Length dependence of k1"), -IOP( "lk1w1", B4SOI_MOD_LK1W1, IF_REAL, "Length dependence of k1w1"), -IOP( "lk1w2", B4SOI_MOD_LK1W2, IF_REAL, "Length dependence of k1w2"), -IOP( "lk2", B4SOI_MOD_LK2, IF_REAL, "Length dependence of k2"), -IOP( "lk3", B4SOI_MOD_LK3, IF_REAL, "Length dependence of k3"), -IOP( "lk3b", B4SOI_MOD_LK3B, IF_REAL, "Length dependence of k3b"), -IOP( "lkb1", B4SOI_MOD_LKB1, IF_REAL, "Length dependence of kb1"), -IOP( "lw0", B4SOI_MOD_LW0, IF_REAL, "Length dependence of w0"), -IOP( "llpe0", B4SOI_MOD_LLPE0, IF_REAL, "Length dependence of lpe0"), -IOP( "llpeb", B4SOI_MOD_LLPEB, IF_REAL, "Length dependence of lpeb"), -IOP( "ldvt0", B4SOI_MOD_LDVT0, IF_REAL, "Length dependence of dvt0"), -IOP( "ldvt1", B4SOI_MOD_LDVT1, IF_REAL, "Length dependence of dvt1"), -IOP( "ldvt2", B4SOI_MOD_LDVT2, IF_REAL, "Length dependence of dvt2"), -IOP( "ldvt0w", B4SOI_MOD_LDVT0W, IF_REAL, "Length dependence of dvt0w"), -IOP( "ldvt1w", B4SOI_MOD_LDVT1W, IF_REAL, "Length dependence of dvt1w"), -IOP( "ldvt2w", B4SOI_MOD_LDVT2W, IF_REAL, "Length dependence of dvt2w"), -IOP( "lu0", B4SOI_MOD_LU0, IF_REAL, "Length dependence of u0"), -IOP( "leu", B4SOI_MOD_LEU, IF_REAL, " Length dependence of eu"), -IOP( "lua", B4SOI_MOD_LUA, IF_REAL, "Length dependence of ua"), -IOP( "lub", B4SOI_MOD_LUB, IF_REAL, "Length dependence of ub"), -IOP( "luc", B4SOI_MOD_LUC, IF_REAL, "Length dependence of uc"), -IOP( "lud", B4SOI_MOD_LUD, IF_REAL, "Length dependence of ud"), /* Bug fix # 32 Jul 09 */ -IOP( "lud1", B4SOI_MOD_LUD1, IF_REAL, "Length dependence of ud1"), - /* Bug fix # 32 Jul 09 */ -IOP( "lucste", B4SOI_MOD_LUCSTE, IF_REAL, "Length dependence of ucste"), -IOP( "lucs", B4SOI_MOD_LUCS, IF_REAL, "Length dependence of lucs"), -IOP( "lvsat", B4SOI_MOD_LVSAT, IF_REAL, "Length dependence of vsat"), -IOP( "la0", B4SOI_MOD_LA0, IF_REAL, "Length dependence of a0"), -IOP( "lags", B4SOI_MOD_LAGS, IF_REAL, "Length dependence of ags"), -IOP( "lb0", B4SOI_MOD_LB0, IF_REAL, "Length dependence of b0"), -IOP( "lb1", B4SOI_MOD_LB1, IF_REAL, "Length dependence of b1"), -IOP( "lketa", B4SOI_MOD_LKETA, IF_REAL, "Length dependence of keta"), -IOP( "lketas", B4SOI_MOD_LKETAS, IF_REAL, "Length dependence of ketas"), -IOP( "la1", B4SOI_MOD_LA1, IF_REAL, "Length dependence of a1"), -IOP( "la2", B4SOI_MOD_LA2, IF_REAL, "Length dependence of a2"), -IOP( "lrdsw", B4SOI_MOD_LRDSW, IF_REAL, "Length dependence of rdsw "), -IOP( "lrsw", B4SOI_MOD_LRSW, IF_REAL, "Length dependence of rsw"), /* v4.0 */ -IOP( "lrdw", B4SOI_MOD_LRDW, IF_REAL, "Length dependence of rdw"), /* v4.0 */ -IOP( "lprwb", B4SOI_MOD_LPRWB, IF_REAL, "Length dependence of prwb "), -IOP( "lprwg", B4SOI_MOD_LPRWG, IF_REAL, "Length dependence of prwg "), -IOP( "lwr", B4SOI_MOD_LWR, IF_REAL, "Length dependence of wr"), -IOP( "lnfactor", B4SOI_MOD_LNFACTOR, IF_REAL, "Length dependence of nfactor"), -IOP( "ldwg", B4SOI_MOD_LDWG, IF_REAL, "Length dependence of dwg"), -IOP( "ldwb", B4SOI_MOD_LDWB, IF_REAL, "Length dependence of dwb"), -IOP( "lvoff", B4SOI_MOD_LVOFF, IF_REAL, "Length dependence of voff"), -IOP( "leta0", B4SOI_MOD_LETA0, IF_REAL, "Length dependence of eta0"), -IOP( "letab", B4SOI_MOD_LETAB, IF_REAL, "Length dependence of etab"), -IOP( "ldsub", B4SOI_MOD_LDSUB, IF_REAL, "Length dependence of dsub"), -IOP( "lcit", B4SOI_MOD_LCIT, IF_REAL, "Length dependence of cit"), -IOP( "lcdsc", B4SOI_MOD_LCDSC, IF_REAL, "Length dependence of cdsc"), -IOP( "lcdscb", B4SOI_MOD_LCDSCB, IF_REAL, "Length dependence of cdscb"), -IOP( "lcdscd", B4SOI_MOD_LCDSCD, IF_REAL, "Length dependence of cdscd"), -IOP( "lpclm", B4SOI_MOD_LPCLM, IF_REAL, "Length dependence of pclm"), -IOP( "lpdiblc1", B4SOI_MOD_LPDIBL1, IF_REAL, "Length dependence of pdiblc1"), -IOP( "lpdiblc2", B4SOI_MOD_LPDIBL2, IF_REAL, "Length dependence of pdiblc2"), -IOP( "lpdiblcb", B4SOI_MOD_LPDIBLB, IF_REAL, "Length dependence of pdiblcb"), -IOP( "ldrout", B4SOI_MOD_LDROUT, IF_REAL, "Length dependence of drout"), -IOP( "lpvag", B4SOI_MOD_LPVAG, IF_REAL, "Length dependence of pvag"), -IOP( "ldelta", B4SOI_MOD_LDELTA, IF_REAL, "Length dependence of delta"), -IOP( "lalpha0", B4SOI_MOD_LALPHA0, IF_REAL, "Length dependence of alpha0"), -IOP( "lfbjtii", B4SOI_MOD_LFBJTII, IF_REAL, "Length dependence of fbjtii"), -IOP( "labjtii", B4SOI_MOD_LABJTII, IF_REAL, "Length dependence of abjtii"), /*Bug fix # 32 Jul 09*/ -IOP( "lcbjtii", B4SOI_MOD_LCBJTII, IF_REAL, "Length dependence of cbjtii"), /*Bug fix # 32 Jul 09*/ -IOP( "lebjtii", B4SOI_MOD_LEBJTII, IF_REAL, "Length dependence of ebjtii"), /*Bug fix # 32 Jul 09*/ -IOP( "lmbjtii", B4SOI_MOD_LMBJTII, IF_REAL, "Length dependence of mbjtii"), /*Bug fix # 32 Jul 09*/ -IOP( "lvbci", B4SOI_MOD_LVBCI, IF_REAL, "Length dependence of vbci"), /*Bug fix # 32 Jul 09*/ -IOP( "lbeta0", B4SOI_MOD_LBETA0, IF_REAL, "Length dependence of beta0"), -IOP( "lbeta1", B4SOI_MOD_LBETA1, IF_REAL, "Length dependence of beta1"), -IOP( "lbeta2", B4SOI_MOD_LBETA2, IF_REAL, "Length dependence of beta2"), -IOP( "lvdsatii0", B4SOI_MOD_LVDSATII0, IF_REAL, "Length dependence of vdsatii0"), -IOP( "llii", B4SOI_MOD_LLII, IF_REAL, "Length dependence of lii"), -IOP( "lesatii", B4SOI_MOD_LESATII, IF_REAL, "Length dependence of esatii"), -IOP( "lsii0", B4SOI_MOD_LSII0, IF_REAL, "Length dependence of sii0"), -IOP( "lsii1", B4SOI_MOD_LSII1, IF_REAL, "Length dependence of sii1"), -IOP( "lsii2", B4SOI_MOD_LSII2, IF_REAL, "Length dependence of sii2"), -IOP( "lsiid", B4SOI_MOD_LSIID, IF_REAL, "Length dependence of siid"), -IOP( "lagidl", B4SOI_MOD_LAGIDL, IF_REAL, "Length dependence of agidl"), -IOP( "lbgidl", B4SOI_MOD_LBGIDL, IF_REAL, "Length dependence of bgidl"), -IOP( "lcgidl", B4SOI_MOD_LCGIDL, IF_REAL, "Length dependence of cgidl"), -IOP( "legidl", B4SOI_MOD_LEGIDL, IF_REAL, "Length dependence of egidl"), -IOP( "lrgidl", B4SOI_MOD_LRGIDL, IF_REAL, "Length dependence of rgidl"), -IOP( "lkgidl", B4SOI_MOD_LKGIDL, IF_REAL, "Length dependence of kgidl"), -IOP( "lfgidl", B4SOI_MOD_LFGIDL, IF_REAL, "Length dependence of fgidl"), -IOP( "lagisl", B4SOI_MOD_LAGISL, IF_REAL, "Length dependence of agisl"), -IOP( "lbgisl", B4SOI_MOD_LBGISL, IF_REAL, "Length dependence of bgisl"), -IOP( "lcgisl", B4SOI_MOD_LCGISL, IF_REAL, "Length dependence of cgisl"), -IOP( "legisl", B4SOI_MOD_LEGISL, IF_REAL, "Length dependence of egisl"), -IOP( "lrgisl", B4SOI_MOD_LRGISL, IF_REAL, "Length dependence of rgisl"), -IOP( "lkgisl", B4SOI_MOD_LKGISL, IF_REAL, "Length dependence of kgisl"), -IOP( "lfgisl", B4SOI_MOD_LFGISL, IF_REAL, "Length dependence of fgisl"), -IOP( "lntun", B4SOI_MOD_LNTUNS, IF_REAL, "Length dependence of ntun"), -IOP( "lntund", B4SOI_MOD_LNTUND, IF_REAL, "Length dependence of ntund"), -IOP( "lndiode", B4SOI_MOD_LNDIODES, IF_REAL, "Length dependence of ndiode"), -IOP( "lndioded", B4SOI_MOD_LNDIODED, IF_REAL, "Length dependence of ndioded"), -IOP( "lnrecf0", B4SOI_MOD_LNRECF0S, IF_REAL, "Length dependence of nrecf0"), -IOP( "lnrecf0d", B4SOI_MOD_LNRECF0D, IF_REAL, "Length dependence of nrecf0d"), -IOP( "lnrecr0", B4SOI_MOD_LNRECR0S, IF_REAL, "Length dependence of nrecr0"), -IOP( "lnrecr0d", B4SOI_MOD_LNRECR0D, IF_REAL, "Length dependence of nrecr0d"), -IOP( "lisbjt", B4SOI_MOD_LISBJT, IF_REAL, "Length dependence of isbjt"), -IOP( "lidbjt", B4SOI_MOD_LIDBJT, IF_REAL, "Length dependence of idbjt"), -IOP( "lisdif", B4SOI_MOD_LISDIF, IF_REAL, "Length dependence of isdif"), -IOP( "liddif", B4SOI_MOD_LIDDIF, IF_REAL, "Length dependence of iddif"), -IOP( "lisrec", B4SOI_MOD_LISREC, IF_REAL, "Length dependence of isrec"), -IOP( "lidrec", B4SOI_MOD_LIDREC, IF_REAL, "Length dependence of idrec"), -IOP( "listun", B4SOI_MOD_LISTUN, IF_REAL, "Length dependence of istun"), -IOP( "lidtun", B4SOI_MOD_LIDTUN, IF_REAL, "Length dependence of idtun"), -IOP( "lvrec0", B4SOI_MOD_LVREC0S, IF_REAL, "Length dependence of vrec0"), -IOP( "lvrec0d", B4SOI_MOD_LVREC0D, IF_REAL, "Length dependence of vrec0d"), -IOP( "lvtun0", B4SOI_MOD_LVTUN0S, IF_REAL, "Length dependence of vtun0"), -IOP( "lvtun0d", B4SOI_MOD_LVTUN0D, IF_REAL, "Length dependence of vtun0d"), -IOP( "lnbjt", B4SOI_MOD_LNBJT, IF_REAL, "Length dependence of nbjt"), -IOP( "llbjt0", B4SOI_MOD_LLBJT0, IF_REAL, "Length dependence of lbjt0"), -IOP( "lvabjt", B4SOI_MOD_LVABJT, IF_REAL, "Length dependence of vabjt"), -IOP( "laely", B4SOI_MOD_LAELY, IF_REAL, "Length dependence of aely"), -IOP( "lahli", B4SOI_MOD_LAHLIS, IF_REAL, "Length dependence of ahli"),/*v4.0*/ -IOP( "lahlid", B4SOI_MOD_LAHLID, IF_REAL, "Length dependence of ahlid"),/*v4.0*/ -IOP( "lvsdfb", B4SOI_MOD_LVSDFB, IF_REAL, "Length dependence of vsdfb"), -IOP( "lvsdth", B4SOI_MOD_LVSDTH, IF_REAL, "Length dependence of vsdth"), -IOP( "ldelvt", B4SOI_MOD_LDELVT, IF_REAL, "Length dependence of delvt"), -IOP( "lacde", B4SOI_MOD_LACDE, IF_REAL, "Length dependence of acde"), -IOP( "lmoin", B4SOI_MOD_LMOIN, IF_REAL, "Length dependence of moin"), -IOP( "lnoff", B4SOI_MOD_LNOFF, IF_REAL, "Length dependence of noff"), /* v3.2 */ - -/* v3.1 added for RF */ -IOP("lxrcrg1", B4SOI_MOD_LXRCRG1, IF_REAL, "Length dependence of xrcrg1"), -IOP("lxrcrg2", B4SOI_MOD_LXRCRG2, IF_REAL, "Length dependence of xrcrg2"), -/* v3.1 added for RF end*/ - -/* Width Dependence */ -/* v3.1 */ -IOP( "wxj", B4SOI_MOD_WXJ, IF_REAL, "Width dependence of xj"), -IOP( "walphagb1", B4SOI_MOD_WALPHAGB1, IF_REAL, "Width dependence of alphagb1"), -IOP( "wbetagb1", B4SOI_MOD_WBETAGB1, IF_REAL, "Width dependence of betagb1"), -IOP( "walphagb2", B4SOI_MOD_WALPHAGB2, IF_REAL, "Width dependence of alphagb2"), -IOP( "wbetagb2", B4SOI_MOD_WBETAGB2, IF_REAL, "Width dependence of betagb2"), -IOP( "waigbcp2", B4SOI_MOD_WAIGBCP2, IF_REAL, "Width dependence of aigbcp2"), -IOP( "wbigbcp2", B4SOI_MOD_WBIGBCP2, IF_REAL, "Width dependence of bigbcp2"), -IOP( "wcigbcp2", B4SOI_MOD_WCIGBCP2, IF_REAL, "Width dependence of cigbcp2"), -IOP( "wcgsl", B4SOI_MOD_WCGSL, IF_REAL, "Width dependence of cgsl"), -IOP( "wcgdl", B4SOI_MOD_WCGDL, IF_REAL, "Width dependence of cgdl"), -IOP( "wckappa", B4SOI_MOD_WCKAPPA, IF_REAL, "Width dependence of ckappa"), -IOP( "wndif", B4SOI_MOD_WNDIF, IF_REAL, "Width dependence of ndif"), -IOP( "wute", B4SOI_MOD_WUTE, IF_REAL, "Width dependence of ute"), -IOP( "wkt1", B4SOI_MOD_WKT1, IF_REAL, "Width dependence of kt1"), -IOP( "wkt1l", B4SOI_MOD_WKT1L, IF_REAL, "Width dependence of kt1l"), -IOP( "wkt2", B4SOI_MOD_WKT2, IF_REAL, "Width dependence of kt2"), -IOP( "wua1", B4SOI_MOD_WUA1, IF_REAL, "Width dependence of ua1"), -IOP( "wub1", B4SOI_MOD_WUB1, IF_REAL, "Width dependence of ub1"), -IOP( "wuc1", B4SOI_MOD_WUC1, IF_REAL, "Width dependence of uc1"), -IOP( "wat", B4SOI_MOD_WAT, IF_REAL, "Width dependence of at"), -IOP( "wprt", B4SOI_MOD_WPRT, IF_REAL, "Width dependence of prt "), -IOP( "wntrecf", B4SOI_MOD_WNTRECF, IF_REAL, "Width dependence of ntrecf"), -IOP( "wntrecr", B4SOI_MOD_WNTRECR, IF_REAL, "Width dependence of ntrecr"), -IOP( "wxbjt", B4SOI_MOD_WXBJT, IF_REAL, "Width dependence of xbjt"), -IOP( "wxdif", B4SOI_MOD_WXDIFS, IF_REAL, "Width dependence of xdif"), -IOP( "wxrec", B4SOI_MOD_WXRECS, IF_REAL, "Width dependence of xrec"), -IOP( "wxtun", B4SOI_MOD_WXTUNS, IF_REAL, "Width dependence of xtun"), -IOP( "wxdifd", B4SOI_MOD_WXDIFD, IF_REAL, "Width dependence of xdifd"), -IOP( "wxrecd", B4SOI_MOD_WXRECD, IF_REAL, "Width dependence of xrecd"), -IOP( "wxtund", B4SOI_MOD_WXTUND, IF_REAL, "Width dependence of xtund"), - -/* v3.0 */ -IOP( "waigc", B4SOI_MOD_WAIGC, IF_REAL, "Width dependence of aigc"), -IOP( "wbigc", B4SOI_MOD_WBIGC, IF_REAL, "Width dependence of bigc"), -IOP( "wcigc", B4SOI_MOD_WCIGC, IF_REAL, "Width dependence of cigc"), -IOP( "waigsd", B4SOI_MOD_WAIGSD, IF_REAL, "Width dependence of aigsd"), -IOP( "wbigsd", B4SOI_MOD_WBIGSD, IF_REAL, "Width dependence of bigsd"), -IOP( "wcigsd", B4SOI_MOD_WCIGSD, IF_REAL, "Width dependence of cigsd"), -IOP( "wnigc", B4SOI_MOD_WNIGC, IF_REAL, "Width dependence of nigc"), -IOP( "wpigcd", B4SOI_MOD_WPIGCD, IF_REAL, "Width dependence for pigcd"), -IOP( "wpoxedge", B4SOI_MOD_WPOXEDGE, IF_REAL, "Width dependence for poxedge"), -IOP( "wnch", B4SOI_MOD_WNPEAK, IF_REAL, "Width dependence of nch"), -IOP( "wnsub", B4SOI_MOD_WNSUB, IF_REAL, "Width dependence of nsub"), -IOP( "wngate", B4SOI_MOD_WNGATE, IF_REAL, "Width dependence of ngate"), -IOP( "wnsd", B4SOI_MOD_WNSD, IF_REAL, "Width dependence of nsd"), -IOP( "wvth0", B4SOI_MOD_WVTH0, IF_REAL,"Width dependence of vth0"), -IOP( "wvfb", B4SOI_MOD_WVFB, IF_REAL, "Width dependence of vfb"), /* v4.1 */ -IOP( "wk1", B4SOI_MOD_WK1, IF_REAL, "Width dependence of k1"), -IOP( "wk1w1", B4SOI_MOD_WK1W1, IF_REAL, "Width dependence of k1w1"), -IOP( "wk1w2", B4SOI_MOD_WK1W2, IF_REAL, "Width dependence of k1w2"), -IOP( "wk2", B4SOI_MOD_WK2, IF_REAL, "Width dependence of k2"), -IOP( "wk3", B4SOI_MOD_WK3, IF_REAL, "Width dependence of k3"), -IOP( "wk3b", B4SOI_MOD_WK3B, IF_REAL, "Width dependence of k3b"), -IOP( "wkb1", B4SOI_MOD_WKB1, IF_REAL, "Width dependence of kb1"), -IOP( "ww0", B4SOI_MOD_WW0, IF_REAL, "Width dependence of w0"), -IOP( "wlpe0", B4SOI_MOD_WLPE0, IF_REAL, "Width dependence of lpe0"), -IOP( "wlpeb", B4SOI_MOD_WLPEB, IF_REAL, "Width dependence of lpeb"), -IOP( "wdvt0", B4SOI_MOD_WDVT0, IF_REAL, "Width dependence of dvt0"), -IOP( "wdvt1", B4SOI_MOD_WDVT1, IF_REAL, "Width dependence of dvt1"), -IOP( "wdvt2", B4SOI_MOD_WDVT2, IF_REAL, "Width dependence of dvt2"), -IOP( "wdvt0w", B4SOI_MOD_WDVT0W, IF_REAL, "Width dependence of dvt0w"), -IOP( "wdvt1w", B4SOI_MOD_WDVT1W, IF_REAL, "Width dependence of dvt1w"), -IOP( "wdvt2w", B4SOI_MOD_WDVT2W, IF_REAL, "Width dependence of dvt2w"), -IOP( "wu0", B4SOI_MOD_WU0, IF_REAL, "Width dependence of u0"), -IOP( "weu", B4SOI_MOD_WEU, IF_REAL, "Width dependence of eu"), -IOP( "wua", B4SOI_MOD_WUA, IF_REAL, "Width dependence of ua"), -IOP( "wub", B4SOI_MOD_WUB, IF_REAL, "Width dependence of ub"), -IOP( "wuc", B4SOI_MOD_WUC, IF_REAL, "Width dependence of uc"), -IOP( "wud", B4SOI_MOD_WUD, IF_REAL, "Width dependence of ud"), /* Bug fix # 32 Jul 09 */ -IOP( "wud1", B4SOI_MOD_WUD1, IF_REAL, "Width dependence of ud1"), /* Bug fix # 32 Jul 09 */ -IOP( "wucste", B4SOI_MOD_WUCSTE, IF_REAL, "Width dependence of ucste"), -IOP( "wucs", B4SOI_MOD_WUCS, IF_REAL, "Width dependence of ucs"), -IOP( "wvsat", B4SOI_MOD_WVSAT, IF_REAL, "Width dependence of vsat"), -IOP( "wa0", B4SOI_MOD_WA0, IF_REAL, "Width dependence of a0"), -IOP( "wags", B4SOI_MOD_WAGS, IF_REAL, "Width dependence of ags"), -IOP( "wb0", B4SOI_MOD_WB0, IF_REAL, "Width dependence of b0"), -IOP( "wb1", B4SOI_MOD_WB1, IF_REAL, "Width dependence of b1"), -IOP( "wketa", B4SOI_MOD_WKETA, IF_REAL, "Width dependence of keta"), -IOP( "wketas", B4SOI_MOD_WKETAS, IF_REAL, "Width dependence of ketas"), -IOP( "wa1", B4SOI_MOD_WA1, IF_REAL, "Width dependence of a1"), -IOP( "wa2", B4SOI_MOD_WA2, IF_REAL, "Width dependence of a2"), -IOP( "wrdsw", B4SOI_MOD_WRDSW, IF_REAL, "Width dependence of rdsw "), -IOP( "wrsw", B4SOI_MOD_WRSW, IF_REAL, "Width dependence of rsw"), /* v4.0 */ -IOP( "wrdw", B4SOI_MOD_WRDW, IF_REAL, "Width dependence of rdw"), /* v4.0 */ -IOP( "wprwb", B4SOI_MOD_WPRWB, IF_REAL, "Width dependence of prwb "), -IOP( "wprwg", B4SOI_MOD_WPRWG, IF_REAL, "Width dependence of prwg "), -IOP( "wwr", B4SOI_MOD_WWR, IF_REAL, "Width dependence of wr"), -IOP( "wnfactor", B4SOI_MOD_WNFACTOR, IF_REAL, "Width dependence of nfactor"), -IOP( "wdwg", B4SOI_MOD_WDWG, IF_REAL, "Width dependence of dwg"), -IOP( "wdwb", B4SOI_MOD_WDWB, IF_REAL, "Width dependence of dwb"), -IOP( "wvoff", B4SOI_MOD_WVOFF, IF_REAL, "Width dependence of voff"), -IOP( "weta0", B4SOI_MOD_WETA0, IF_REAL, "Width dependence of eta0"), -IOP( "wetab", B4SOI_MOD_WETAB, IF_REAL, "Width dependence of etab"), -IOP( "wdsub", B4SOI_MOD_WDSUB, IF_REAL, "Width dependence of dsub"), -IOP( "wcit", B4SOI_MOD_WCIT, IF_REAL, "Width dependence of cit"), -IOP( "wcdsc", B4SOI_MOD_WCDSC, IF_REAL, "Width dependence of cdsc"), -IOP( "wcdscb", B4SOI_MOD_WCDSCB, IF_REAL, "Width dependence of cdscb"), -IOP( "wcdscd", B4SOI_MOD_WCDSCD, IF_REAL, "Width dependence of cdscd"), -IOP( "wpclm", B4SOI_MOD_WPCLM, IF_REAL, "Width dependence of pclm"), -IOP( "wpdiblc1", B4SOI_MOD_WPDIBL1, IF_REAL, "Width dependence of pdiblc1"), -IOP( "wpdiblc2", B4SOI_MOD_WPDIBL2, IF_REAL, "Width dependence of pdiblc2"), -IOP( "wpdiblcb", B4SOI_MOD_WPDIBLB, IF_REAL, "Width dependence of pdiblcb"), -IOP( "wdrout", B4SOI_MOD_WDROUT, IF_REAL, "Width dependence of drout"), -IOP( "wpvag", B4SOI_MOD_WPVAG, IF_REAL, "Width dependence of pvag"), -IOP( "wdelta", B4SOI_MOD_WDELTA, IF_REAL, "Width dependence of delta"), -IOP( "walpha0", B4SOI_MOD_WALPHA0, IF_REAL, "Width dependence of alpha0"), -IOP( "wfbjtii", B4SOI_MOD_WFBJTII, IF_REAL, "Width dependence of fbjtii"), -IOP( "wabjtii", B4SOI_MOD_WABJTII, IF_REAL, "Width dependence of abjtii"), /*Bug fix # 32 Jul 09 */ -IOP( "wcbjtii", B4SOI_MOD_WCBJTII, IF_REAL, "Width dependence of cbjtii"), /*Bug fix # 32 Jul 09 */ -IOP( "webjtii", B4SOI_MOD_WEBJTII, IF_REAL, "Width dependence of ebjtii"), /*Bug fix # 32 Jul 09 */ -IOP( "wmbjtii", B4SOI_MOD_WMBJTII, IF_REAL, "Width dependence of mbjtii"), /*Bug fix # 32 Jul 09 */ -IOP( "wvbci", B4SOI_MOD_WVBCI, IF_REAL, "Width dependence of vbci"), /*Bug fix # 32 Jul 09*/ -IOP( "wbeta0", B4SOI_MOD_WBETA0, IF_REAL, "Width dependence of beta0"), -IOP( "wbeta1", B4SOI_MOD_WBETA1, IF_REAL, "Width dependence of beta1"), -IOP( "wbeta2", B4SOI_MOD_WBETA2, IF_REAL, "Width dependence of beta2"), -IOP( "wvdsatii0", B4SOI_MOD_WVDSATII0, IF_REAL, "Width dependence of vdsatii0"), -IOP( "wlii", B4SOI_MOD_WLII, IF_REAL, "Width dependence of lii"), -IOP( "wesatii", B4SOI_MOD_WESATII, IF_REAL, "Width dependence of esatii"), -IOP( "wsii0", B4SOI_MOD_WSII0, IF_REAL, "Width dependence of sii0"), -IOP( "wsii1", B4SOI_MOD_WSII1, IF_REAL, "Width dependence of sii1"), -IOP( "wsii2", B4SOI_MOD_WSII2, IF_REAL, "Width dependence of sii2"), -IOP( "wsiid", B4SOI_MOD_WSIID, IF_REAL, "Width dependence of siid"), -IOP( "wagidl", B4SOI_MOD_WAGIDL, IF_REAL, "Width dependence of agidl"), -IOP( "wbgidl", B4SOI_MOD_WBGIDL, IF_REAL, "Width dependence of bgidl"), -IOP( "wcgidl", B4SOI_MOD_WCGIDL, IF_REAL, "Width dependence of cgidl"), -IOP( "wegidl", B4SOI_MOD_WEGIDL, IF_REAL, "Width dependence of egidl"), -IOP( "wrgidl", B4SOI_MOD_WRGIDL, IF_REAL, "Width dependence of rgidl"), -IOP( "wkgidl", B4SOI_MOD_WKGIDL, IF_REAL, "Width dependence of kgidl"), -IOP( "wfgidl", B4SOI_MOD_WFGIDL, IF_REAL, "Width dependence of fgidl"), -IOP( "wagisl", B4SOI_MOD_WAGISL, IF_REAL, "Width dependence of agisl"), -IOP( "wbgisl", B4SOI_MOD_WBGISL, IF_REAL, "Width dependence of bgisl"), -IOP( "wcgisl", B4SOI_MOD_WCGISL, IF_REAL, "Width dependence of cgisl"), -IOP( "wegisl", B4SOI_MOD_WEGISL, IF_REAL, "Width dependence of egisl"), -IOP( "wrgisl", B4SOI_MOD_WRGISL, IF_REAL, "Width dependence of rgisl"), -IOP( "wkgisl", B4SOI_MOD_WKGISL, IF_REAL, "Width dependence of kgisl"), -IOP( "wfgisl", B4SOI_MOD_WFGISL, IF_REAL, "Width dependence of fgisl"), -IOP( "wntun", B4SOI_MOD_WNTUNS, IF_REAL, "Width dependence of ntun"), -IOP( "wntund", B4SOI_MOD_WNTUND, IF_REAL, "Width dependence of ntund"), -IOP( "wndiode", B4SOI_MOD_WNDIODES, IF_REAL, "Width dependence of ndiode"), -IOP( "wndioded", B4SOI_MOD_WNDIODED, IF_REAL, "Width dependence of ndioded"), -IOP( "wnrecf0", B4SOI_MOD_WNRECF0S, IF_REAL, "Width dependence of nrecf0"), -IOP( "wnrecf0d", B4SOI_MOD_WNRECF0D, IF_REAL, "Width dependence of nrecf0d"), -IOP( "wnrecr0", B4SOI_MOD_WNRECR0S, IF_REAL, "Width dependence of nrecr0"), -IOP( "wnrecr0d", B4SOI_MOD_WNRECR0D, IF_REAL, "Width dependence of nrecr0d"), -IOP( "wisbjt", B4SOI_MOD_WISBJT, IF_REAL, "Width dependence of isbjt"), -IOP( "widbjt", B4SOI_MOD_WIDBJT, IF_REAL, "Width dependence of idbjt"), -IOP( "wisdif", B4SOI_MOD_WISDIF, IF_REAL, "Width dependence of isdif"), -IOP( "widdif", B4SOI_MOD_WIDDIF, IF_REAL, "Width dependence of iddif"), -IOP( "wisrec", B4SOI_MOD_WISREC, IF_REAL, "Width dependence of isrec"), -IOP( "widrec", B4SOI_MOD_WIDREC, IF_REAL, "Width dependence of idrec"), -IOP( "wistun", B4SOI_MOD_WISTUN, IF_REAL, "Width dependence of istun"), -IOP( "widtun", B4SOI_MOD_WIDTUN, IF_REAL, "Width dependence of idtun"), -IOP( "wvrec0", B4SOI_MOD_WVREC0S, IF_REAL, "Width dependence of vrec0"), -IOP( "wvrec0d", B4SOI_MOD_WVREC0D, IF_REAL, "Width dependence of vrec0d"), -IOP( "wvtun0", B4SOI_MOD_WVTUN0S, IF_REAL, "Width dependence of vtun0"), -IOP( "wvtun0d", B4SOI_MOD_WVTUN0D, IF_REAL, "Width dependence of vtun0d"), -IOP( "wnbjt", B4SOI_MOD_WNBJT, IF_REAL, "Width dependence of nbjt"), -IOP( "wlbjt0", B4SOI_MOD_WLBJT0, IF_REAL, "Width dependence of lbjt0"), -IOP( "wvabjt", B4SOI_MOD_WVABJT, IF_REAL, "Width dependence of vabjt"), -IOP( "waely", B4SOI_MOD_WAELY, IF_REAL, "Width dependence of aely"), -IOP( "wahli", B4SOI_MOD_WAHLIS,IF_REAL, "Width dependence of ahli"),/* v4.0 */ -IOP( "wahlid", B4SOI_MOD_WAHLID,IF_REAL, "Width dependence of ahlid"),/* v4.0 */ -IOP( "wvsdfb", B4SOI_MOD_WVSDFB, IF_REAL, "Width dependence of vsdfb"), -IOP( "wvsdth", B4SOI_MOD_WVSDTH, IF_REAL, "Width dependence of vsdth"), -IOP( "wdelvt", B4SOI_MOD_WDELVT, IF_REAL, "Width dependence of delvt"), -IOP( "wacde", B4SOI_MOD_WACDE, IF_REAL, "Width dependence of acde"), -IOP( "wmoin", B4SOI_MOD_WMOIN, IF_REAL, "Width dependence of moin"), -IOP( "wnoff", B4SOI_MOD_WNOFF, IF_REAL, "Width dependence of noff"), /* v3.2 */ - -/* v3.1 added for RF */ -IOP("wxrcrg1", B4SOI_MOD_WXRCRG1, IF_REAL, "Width dependence of xrcrg1"), -/* IOP("Wxrcrg2", B4SOI_MOD_WXRCRG2, IF_REAL, "Width dependence of xrcrg2") *//*Bug fix # 32 Jul 09 */ -IOP("wxrcrg2", B4SOI_MOD_WXRCRG2, IF_REAL, "Width dependence of xrcrg2"), -/* added for RF model end*/ - - -/* Cross-term Dependence */ -/* v3.1 */ -IOP( "pxj", B4SOI_MOD_PXJ, IF_REAL, "Cross-term dependence of xj"), -IOP( "palphagb1", B4SOI_MOD_PALPHAGB1, IF_REAL, "Cross-term dependence of alphagb1"), -IOP( "pbetagb1", B4SOI_MOD_PBETAGB1, IF_REAL, "Cross-term dependence of betagb1"), -IOP( "palphagb2", B4SOI_MOD_PALPHAGB2, IF_REAL, "Cross-term dependence of alphagb2"), -IOP( "pbetagb2", B4SOI_MOD_PBETAGB2, IF_REAL, "Cross-term dependence of betagb2"), -IOP( "paigbcp2", B4SOI_MOD_PAIGBCP2, IF_REAL, "Cross-term dependence of aigbcp2"), -IOP( "pbigbcp2", B4SOI_MOD_PBIGBCP2, IF_REAL, "Cross-term dependence of bigbcp2"), -IOP( "pcigbcp2", B4SOI_MOD_PCIGBCP2, IF_REAL, "Cross-term dependence of cigbcp2"), -IOP( "pcgsl", B4SOI_MOD_PCGSL, IF_REAL, "Cross-term dependence of cgsl"), -IOP( "pcgdl", B4SOI_MOD_PCGDL, IF_REAL, "Cross-term dependence of cgdl"), -IOP( "pckappa", B4SOI_MOD_PCKAPPA, IF_REAL, "Cross-term dependence of ckappa"), -IOP( "pndif", B4SOI_MOD_PNDIF, IF_REAL, "Cross-term dependence of ndif"), -IOP( "pute", B4SOI_MOD_PUTE, IF_REAL, "Cross-term dependence of ute"), -IOP( "pkt1", B4SOI_MOD_PKT1, IF_REAL, "Cross-term dependence of kt1"), -IOP( "pkt1l", B4SOI_MOD_PKT1L, IF_REAL, "Cross-term dependence of kt1l"), -IOP( "pkt2", B4SOI_MOD_PKT2, IF_REAL, "Cross-term dependence of kt2"), -IOP( "pua1", B4SOI_MOD_PUA1, IF_REAL, "Cross-term dependence of ua1"), -IOP( "pub1", B4SOI_MOD_PUB1, IF_REAL, "Cross-term dependence of ub1"), -IOP( "puc1", B4SOI_MOD_PUC1, IF_REAL, "Cross-term dependence of uc1"), -IOP( "pat", B4SOI_MOD_PAT, IF_REAL, "Cross-term dependence of at"), -IOP( "pprt", B4SOI_MOD_PPRT, IF_REAL, "Cross-term dependence of prt "), -IOP( "pntrecf", B4SOI_MOD_PNTRECF, IF_REAL, "Cross-term dependence of ntrecf"), -IOP( "pntrecr", B4SOI_MOD_PNTRECR, IF_REAL, "Cross-term dependence of ntrecr"), -IOP( "pxbjt", B4SOI_MOD_PXBJT, IF_REAL, "Cross-term dependence of xbjt"), -IOP( "pxdif", B4SOI_MOD_PXDIFS, IF_REAL, "Cross-term dependence of xdif"), -IOP( "pxrec", B4SOI_MOD_PXRECS, IF_REAL, "Cross-term dependence of xrec"), -IOP( "pxtun", B4SOI_MOD_PXTUNS, IF_REAL, "Cross-term dependence of xtun"), -IOP( "pxdifd", B4SOI_MOD_PXDIFD, IF_REAL, "Cross-term dependence of xdifd"), -IOP( "pxrecd", B4SOI_MOD_PXRECD, IF_REAL, "Cross-term dependence of xrecd"), -IOP( "pxtund", B4SOI_MOD_PXTUND, IF_REAL, "Cross-term dependence of xtund"), - -/* v3.0 */ -IOP( "paigc", B4SOI_MOD_PAIGC, IF_REAL, "Cross-term dependence of aigc"), -IOP( "pbigc", B4SOI_MOD_PBIGC, IF_REAL, "Cross-term dependence of bigc"), -IOP( "pcigc", B4SOI_MOD_PCIGC, IF_REAL, "Cross-term dependence of cigc"), -IOP( "paigsd", B4SOI_MOD_PAIGSD, IF_REAL, "Cross-term dependence of aigsd"), -IOP( "pbigsd", B4SOI_MOD_PBIGSD, IF_REAL, "Cross-term dependence of bigsd"), -IOP( "pcigsd", B4SOI_MOD_PCIGSD, IF_REAL, "Cross-term dependence of cigsd"), -IOP( "pnigc", B4SOI_MOD_PNIGC, IF_REAL, "Cross-term dependence of nigc"), -IOP( "ppigcd", B4SOI_MOD_PPIGCD, IF_REAL, "Cross-term dependence for pigcd"), -IOP( "ppoxedge", B4SOI_MOD_PPOXEDGE, IF_REAL, "Cross-term dependence for poxedge"), - -IOP( "pnch", B4SOI_MOD_PNPEAK, IF_REAL, "Cross-term dependence of nch"), -IOP( "pnsub", B4SOI_MOD_PNSUB, IF_REAL, "Cross-term dependence of nsub"), -IOP( "pnsd", B4SOI_MOD_PNSD, IF_REAL, "Cross-term dependence of nsd"), -IOP( "pngate", B4SOI_MOD_PNGATE, IF_REAL, "Cross-term dependence of ngate"), -IOP( "pvth0", B4SOI_MOD_PVTH0, IF_REAL,"Cross-term dependence of vth0"), -IOP( "pvfb", B4SOI_MOD_PVFB, IF_REAL, "Cross-term dependence of vfb"), /* v4.1 */ -IOP( "pk1", B4SOI_MOD_PK1, IF_REAL, "Cross-term dependence of k1"), -IOP( "pk1w1", B4SOI_MOD_PK1W1, IF_REAL, "Cross-term dependence of k1w1"), -IOP( "pk1w2", B4SOI_MOD_PK1W2, IF_REAL, "Cross-term dependence of k1w2"), -IOP( "pk2", B4SOI_MOD_PK2, IF_REAL, "Cross-term dependence of k2"), -IOP( "pk3", B4SOI_MOD_PK3, IF_REAL, "Cross-term dependence of k3"), -IOP( "pk3b", B4SOI_MOD_PK3B, IF_REAL, "Cross-term dependence of k3b"), -IOP( "pkb1", B4SOI_MOD_PKB1, IF_REAL, "Cross-term dependence of kb1"), -IOP( "pw0", B4SOI_MOD_PW0, IF_REAL, "Cross-term dependence of w0"), -IOP( "plpe0", B4SOI_MOD_PLPE0, IF_REAL, "Cross-term dependence of lpe0"), -IOP( "plpeb", B4SOI_MOD_PLPEB, IF_REAL, "Cross-term dependence of lpeb"), -IOP( "pdvt0", B4SOI_MOD_PDVT0, IF_REAL, "Cross-term dependence of dvt0"), -IOP( "pdvt1", B4SOI_MOD_PDVT1, IF_REAL, "Cross-term dependence of dvt1"), -IOP( "pdvt2", B4SOI_MOD_PDVT2, IF_REAL, "Cross-term dependence of dvt2"), -IOP( "pdvt0w", B4SOI_MOD_PDVT0W, IF_REAL, "Cross-term dependence of dvt0w"), -IOP( "pdvt1w", B4SOI_MOD_PDVT1W, IF_REAL, "Cross-term dependence of dvt1w"), -IOP( "pdvt2w", B4SOI_MOD_PDVT2W, IF_REAL, "Cross-term dependence of dvt2w"), -IOP( "pu0", B4SOI_MOD_PU0, IF_REAL, "Cross-term dependence of u0"), -IOP( "peu", B4SOI_MOD_PEU, IF_REAL, "Cross-term dependence of eu"), -IOP( "pua", B4SOI_MOD_PUA, IF_REAL, "Cross-term dependence of ua"), -IOP( "pub", B4SOI_MOD_PUB, IF_REAL, "Cross-term dependence of ub"), -IOP( "puc", B4SOI_MOD_PUC, IF_REAL, "Cross-term dependence of uc"), -IOP( "pud", B4SOI_MOD_PUD, IF_REAL, "Cross-term dependence of ud"), /*Bug fix # 32 Jul 09 */ -IOP( "pud1", B4SOI_MOD_PUD1, IF_REAL, "Cross-term dependence of ud1"), /*Bug fix # 32 Jul 09 */ -IOP( "pucste", B4SOI_MOD_PUCSTE, IF_REAL, "Cross-term dependence of ucste"), -IOP( "pucs", B4SOI_MOD_PUCS, IF_REAL, "Cross-term dependence of ucs"), -IOP( "pvsat", B4SOI_MOD_PVSAT, IF_REAL, "Cross-term dependence of vsat"), -IOP( "pa0", B4SOI_MOD_PA0, IF_REAL, "Cross-term dependence of a0"), -IOP( "pags", B4SOI_MOD_PAGS, IF_REAL, "Cross-term dependence of ags"), -IOP( "pb0", B4SOI_MOD_PB0, IF_REAL, "Cross-term dependence of b0"), -IOP( "pb1", B4SOI_MOD_PB1, IF_REAL, "Cross-term dependence of b1"), -IOP( "pketa", B4SOI_MOD_PKETA, IF_REAL, "Cross-term dependence of keta"), -IOP( "pketas", B4SOI_MOD_PKETAS, IF_REAL, "Cross-term dependence of ketas"), -IOP( "pa1", B4SOI_MOD_PA1, IF_REAL, "Cross-term dependence of a1"), -IOP( "pa2", B4SOI_MOD_PA2, IF_REAL, "Cross-term dependence of a2"), -IOP( "prdsw", B4SOI_MOD_PRDSW, IF_REAL, "Cross-term dependence of rdsw "), -IOP( "prsw", B4SOI_MOD_PRSW, IF_REAL, "Cross-term dependence of rsw "),/*v4.0*/ -IOP( "prdw", B4SOI_MOD_PRDW, IF_REAL, "Cross-term dependence of rdw "),/*v4.0*/ -IOP( "pprwb", B4SOI_MOD_PPRWB, IF_REAL, "Cross-term dependence of prwb "), -IOP( "pprwg", B4SOI_MOD_PPRWG, IF_REAL, "Cross-term dependence of prwg "), -IOP( "pwr", B4SOI_MOD_PWR, IF_REAL, "Cross-term dependence of wr"), -IOP( "pnfactor", B4SOI_MOD_PNFACTOR, IF_REAL, "Cross-term dependence of nfactor"), -IOP( "pdwg", B4SOI_MOD_PDWG, IF_REAL, "Cross-term dependence of dwg"), -IOP( "pdwb", B4SOI_MOD_PDWB, IF_REAL, "Cross-term dependence of dwb"), -IOP( "pvoff", B4SOI_MOD_PVOFF, IF_REAL, "Cross-term dependence of voff"), -IOP( "peta0", B4SOI_MOD_PETA0, IF_REAL, "Cross-term dependence of eta0"), -IOP( "petab", B4SOI_MOD_PETAB, IF_REAL, "Cross-term dependence of etab"), -IOP( "pdsub", B4SOI_MOD_PDSUB, IF_REAL, "Cross-term dependence of dsub"), -IOP( "pcit", B4SOI_MOD_PCIT, IF_REAL, "Cross-term dependence of cit"), -IOP( "pcdsc", B4SOI_MOD_PCDSC, IF_REAL, "Cross-term dependence of cdsc"), -IOP( "pcdscb", B4SOI_MOD_PCDSCB, IF_REAL, "Cross-term dependence of cdscb"), -IOP( "pcdscd", B4SOI_MOD_PCDSCD, IF_REAL, "Cross-term dependence of cdscd"), -IOP( "ppclm", B4SOI_MOD_PPCLM, IF_REAL, "Cross-term dependence of pclm"), -IOP( "ppdiblc1", B4SOI_MOD_PPDIBL1, IF_REAL, "Cross-term dependence of pdiblc1"), -IOP( "ppdiblc2", B4SOI_MOD_PPDIBL2, IF_REAL, "Cross-term dependence of pdiblc2"), -IOP( "ppdiblcb", B4SOI_MOD_PPDIBLB, IF_REAL, "Cross-term dependence of pdiblcb"), -IOP( "pdrout", B4SOI_MOD_PDROUT, IF_REAL, "Cross-term dependence of drout"), -IOP( "ppvag", B4SOI_MOD_PPVAG, IF_REAL, "Cross-term dependence of pvag"), -IOP( "pdelta", B4SOI_MOD_PDELTA, IF_REAL, "Cross-term dependence of delta"), -IOP( "palpha0", B4SOI_MOD_PALPHA0, IF_REAL, "Cross-term dependence of alpha0"), -IOP( "pfbjtii", B4SOI_MOD_PFBJTII, IF_REAL, "Cross-term dependence of fbjtii"), -IOP( "pabjtii", B4SOI_MOD_PABJTII, IF_REAL, "Cross-term dependence of abjtii"), /* Bug fix # 32 Jul 09 */ -IOP( "pcbjtii", B4SOI_MOD_PCBJTII, IF_REAL, "Cross-term dependence of cbjtii"), /* Bug fix # 32 Jul 09 */ -IOP( "pebjtii", B4SOI_MOD_PEBJTII, IF_REAL, "Cross-term dependence of ebjtii"), /* Bug fix # 32 Jul 09 */ -IOP( "pmbjtii", B4SOI_MOD_PMBJTII, IF_REAL, "Cross-term dependence of mbjtii"), /* Bug fix # 32 Jul 09 */ -IOP( "pvbci", B4SOI_MOD_PVBCI, IF_REAL, "Cross-term dependence of vbci"), /* Bug fix # 32 Jul 09 */ -IOP( "pbeta0", B4SOI_MOD_PBETA0, IF_REAL, "Cross-term dependence of beta0"), -IOP( "pbeta1", B4SOI_MOD_PBETA1, IF_REAL, "Cross-term dependence of beta1"), -IOP( "pbeta2", B4SOI_MOD_PBETA2, IF_REAL, "Cross-term dependence of beta2"), -IOP( "pvdsatii0", B4SOI_MOD_PVDSATII0, IF_REAL, "Cross-term dependence of vdsatii0"), -IOP( "plii", B4SOI_MOD_PLII, IF_REAL, "Cross-term dependence of lii"), -IOP( "pesatii", B4SOI_MOD_PESATII, IF_REAL, "Cross-term dependence of esatii"), -IOP( "psii0", B4SOI_MOD_PSII0, IF_REAL, "Cross-term dependence of sii0"), -IOP( "psii1", B4SOI_MOD_PSII1, IF_REAL, "Cross-term dependence of sii1"), -IOP( "psii2", B4SOI_MOD_PSII2, IF_REAL, "Cross-term dependence of sii2"), -IOP( "psiid", B4SOI_MOD_PSIID, IF_REAL, "Cross-term dependence of siid"), -IOP( "pagidl", B4SOI_MOD_PAGIDL, IF_REAL, "Cross-term dependence of agidl"), -IOP( "pbgidl", B4SOI_MOD_PBGIDL, IF_REAL, "Cross-term dependence of bgidl"), -IOP( "pcgidl", B4SOI_MOD_PCGIDL, IF_REAL, "Cross-term dependence of cgidl"), -IOP( "pegidl", B4SOI_MOD_PEGIDL, IF_REAL, "Cross-term dependence of egidl"), -IOP( "prgidl", B4SOI_MOD_PRGIDL, IF_REAL, "Cross-term dependence of rgidl"), -IOP( "pkgidl", B4SOI_MOD_PKGIDL, IF_REAL, "Cross-term dependence of kgidl"), -IOP( "pfgidl", B4SOI_MOD_PFGIDL, IF_REAL, "Cross-term dependence of fgidl"), -IOP( "pagisl", B4SOI_MOD_PAGISL, IF_REAL, "Cross-term dependence of agisl"), -IOP( "pbgisl", B4SOI_MOD_PBGISL, IF_REAL, "Cross-term dependence of bgisl"), -IOP( "pcgisl", B4SOI_MOD_PCGISL, IF_REAL, "Cross-term dependence of cgisl"), -IOP( "pegisl", B4SOI_MOD_PEGISL, IF_REAL, "Cross-term dependence of egisl"), -IOP( "prgisl", B4SOI_MOD_PRGISL, IF_REAL, "Cross-term dependence of rgisl"), -IOP( "pkgisl", B4SOI_MOD_PKGISL, IF_REAL, "Cross-term dependence of kgisl"), -IOP( "pfgisl", B4SOI_MOD_PFGISL, IF_REAL, "Cross-term dependence of fgisl"), -IOP( "pntun", B4SOI_MOD_PNTUNS, IF_REAL, "Cross-term dependence of ntun"), -IOP( "pntund", B4SOI_MOD_PNTUND, IF_REAL, "Cross-term dependence of ntund"), -IOP( "pndiode", B4SOI_MOD_PNDIODES, IF_REAL,"Cross-term dependence of ndiode"), -IOP( "pndioded", B4SOI_MOD_PNDIODED, IF_REAL,"Cross-term dependence of ndiode"), -IOP( "pnrecf0", B4SOI_MOD_PNRECF0S, IF_REAL,"Cross-term dependence of nrecf0"), -IOP( "pnrecf0d", B4SOI_MOD_PNRECF0D, IF_REAL,"Cross-term dependence of nrecf0"), -IOP( "pnrecr0", B4SOI_MOD_PNRECR0S, IF_REAL,"Cross-term dependence of nrecr0"), -IOP( "pnrecr0d", B4SOI_MOD_PNRECR0D, IF_REAL,"Cross-term dependence of nrecr0"), -IOP( "pisbjt", B4SOI_MOD_PISBJT, IF_REAL, "Cross-term dependence of isbjt"), -IOP( "pidbjt", B4SOI_MOD_PIDBJT, IF_REAL, "Cross-term dependence of idbjt"), -IOP( "pisdif", B4SOI_MOD_PISDIF, IF_REAL, "Cross-term dependence of isdif"), -IOP( "piddif", B4SOI_MOD_PIDDIF, IF_REAL, "Cross-term dependence of iddif"), -IOP( "pisrec", B4SOI_MOD_PISREC, IF_REAL, "Cross-term dependence of isrec"), -IOP( "pidrec", B4SOI_MOD_PIDREC, IF_REAL, "Cross-term dependence of idrec"), -IOP( "pistun", B4SOI_MOD_PISTUN, IF_REAL, "Cross-term dependence of istun"), -IOP( "pidtun", B4SOI_MOD_PIDTUN, IF_REAL, "Cross-term dependence of idtun"), -IOP( "pvrec0", B4SOI_MOD_PVREC0S, IF_REAL, "Cross-term dependence of vrec0"), -IOP( "pvrec0d", B4SOI_MOD_PVREC0D, IF_REAL, "Cross-term dependence of vrec0d"), -IOP( "pvtun0", B4SOI_MOD_PVTUN0S, IF_REAL, "Cross-term dependence of vtun0"), -IOP( "pvtun0d", B4SOI_MOD_PVTUN0D, IF_REAL, "Cross-term dependence of vtun0d"), -IOP( "pnbjt", B4SOI_MOD_PNBJT, IF_REAL, "Cross-term dependence of nbjt"), -IOP( "plbjt0", B4SOI_MOD_PLBJT0, IF_REAL, "Cross-term dependence of lbjt0"), -IOP( "pvabjt", B4SOI_MOD_PVABJT, IF_REAL, "Cross-term dependence of vabjt"), -IOP( "paely", B4SOI_MOD_PAELY, IF_REAL, "Cross-term dependence of aely"), -IOP( "pahli",B4SOI_MOD_PAHLIS,IF_REAL, "X-term dependence of ahli"),/* v4.0 */ -IOP( "pahlid",B4SOI_MOD_PAHLID,IF_REAL, "X-term dependence of ahlid"),/* v4.0 */ -IOP( "pvsdfb", B4SOI_MOD_PVSDFB, IF_REAL, "Cross-term dependence of vsdfb"), -IOP( "pvsdth", B4SOI_MOD_PVSDTH, IF_REAL, "Cross-term dependence of vsdth"), -IOP( "pdelvt", B4SOI_MOD_PDELVT, IF_REAL, "Cross-term dependence of delvt"), -IOP( "pacde", B4SOI_MOD_PACDE, IF_REAL, "Cross-term dependence of acde"), -IOP( "pmoin", B4SOI_MOD_PMOIN, IF_REAL, "Cross-term dependence of moin"), -IOP( "pnoff", B4SOI_MOD_PNOFF, IF_REAL, "Cross-term dependence of noff"), /* v3.2 */ - -/* v3.1 added for RF */ -IOP("pxrcrg1", B4SOI_MOD_PXRCRG1, IF_REAL, "Cross-term dependence of xrcrg1"), -IOP("pxrcrg2", B4SOI_MOD_PXRCRG2, IF_REAL, "Cross-term dependence of xrcrg2"), -/* v3.1 added for RF end */ - -/* v4.0 backward compatibility */ -IOP( "nlx", B4SOI_MOD_NLX, IF_REAL, "Lateral non-uniform doping effect"), -IOP( "lnlx", B4SOI_MOD_LNLX, IF_REAL, "Length dependence of nlx"), -IOP( "wnlx", B4SOI_MOD_WNLX, IF_REAL, "Width dependence of nlx"), -IOP( "pnlx", B4SOI_MOD_PNLX, IF_REAL, "Cross-term dependence of nlx"), -IOP( "ngidl", B4SOI_MOD_NGIDL, IF_REAL, "GIDL first parameter"), -IOP( "lngidl", B4SOI_MOD_LNGIDL, IF_REAL, "Length dependence of ngidl"), -IOP( "wngidl", B4SOI_MOD_WNGIDL, IF_REAL, "Width dependence of ngidl"), -IOP( "pngidl", B4SOI_MOD_PNGIDL, IF_REAL, "Cross-term dependence of ngidl"), - -/* Added for binning - END */ - -IOP("vgs_max", B4SOI_MOD_VGS_MAX, IF_REAL, "maximum voltage G-S branch"), -IOP("vgd_max", B4SOI_MOD_VGD_MAX, IF_REAL, "maximum voltage G-D branch"), -IOP("vgb_max", B4SOI_MOD_VGB_MAX, IF_REAL, "maximum voltage G-B branch"), -IOP("vds_max", B4SOI_MOD_VDS_MAX, IF_REAL, "maximum voltage D-S branch"), -IOP("vbs_max", B4SOI_MOD_VBS_MAX, IF_REAL, "maximum voltage B-S branch"), -IOP("vbd_max", B4SOI_MOD_VBD_MAX, IF_REAL, "maximum voltage B-D branch"), -IOP("vgsr_max", B4SOI_MOD_VGSR_MAX, IF_REAL, "maximum voltage G-S branch"), -IOP("vgdr_max", B4SOI_MOD_VGDR_MAX, IF_REAL, "maximum voltage G-D branch"), -IOP("vgbr_max", B4SOI_MOD_VGBR_MAX, IF_REAL, "maximum voltage G-B branch"), -IOP("vbsr_max", B4SOI_MOD_VBSR_MAX, IF_REAL, "maximum voltage B-S branch"), -IOP("vbdr_max", B4SOI_MOD_VBDR_MAX, IF_REAL, "maximum voltage B-D branch"), - -IP( "nmos", B4SOI_MOD_NMOS, IF_FLAG, "Flag to indicate NMOS"), -IP( "pmos", B4SOI_MOD_PMOS, IF_FLAG, "Flag to indicate PMOS"), -}; - -char *B4SOInames[] = { - "Drain", - "Gate", - "Source", - "Backgate", - "", - "Body", - "Temp", - "Charge", -}; - -int B4SOInSize = NUMELEMS(B4SOInames); -int B4SOIpTSize = NUMELEMS(B4SOIpTable); -int B4SOImPTSize = NUMELEMS(B4SOImPTable); -int B4SOIiSize = sizeof(B4SOIinstance); -int B4SOImSize = sizeof(B4SOImodel); - - diff --git a/src/spicelib/devices/bsimsoi/b4soiacld.c b/src/spicelib/devices/bsimsoi/b4soiacld.c deleted file mode 100644 index d629e5bbb..000000000 --- a/src/spicelib/devices/bsimsoi/b4soiacld.c +++ /dev/null @@ -1,839 +0,0 @@ -/*** B4SOI 12/16/2010 Released by Tanvir Morshed ***/ - - -/********** - * Copyright 2010 Regents of the University of California. All rights reserved. - * Authors: 1998 Samuel Fung, Dennis Sinitsky and Stephen Tang - * Authors: 1999-2004 Pin Su, Hui Wan, Wei Jin, b3soiacld.c - * Authors: 2005- Hui Wan, Xuemei Xi, Ali Niknejad, Chenming Hu. - * Authors: 2009- Wenwei Yang, Chung-Hsun Lin, Ali Niknejad, Chenming Hu. - * Authors: 2010- Tanvir Morshed, Ali Niknejad, Chenming Hu. - * File: b4soiacld.c - * Modified by Hui Wan, Xuemei Xi 11/30/2005 - * Modified by Wenwei Yang, Chung-Hsun Lin, Darsen Lu 03/06/2009 - * Modified by Tanvir Morshed 09/22/2009 - **********/ - -#include "ngspice/ngspice.h" - -#include "ngspice/cktdefs.h" -#include "b4soidef.h" -#include "ngspice/sperror.h" -#include "ngspice/suffix.h" - - -int -B4SOIacLoad( -GENmodel *inModel, -CKTcircuit *ckt) -{ -register B4SOImodel *model = (B4SOImodel*)inModel; -register B4SOIinstance *here; -register int selfheat; -double xcggb, xcgdb, xcgsb, xcgeb, xcgT; -double xcdgb, xcddb, xcdsb, xcdeb, xcdT; -double xcsgb, xcsdb, xcssb, xcseb, xcsT; -double xcbgb, xcbdb, xcbsb, xcbeb, xcbT; -double xcegb, xceeb, xceT; -double gdpr, gspr, gds; -double cggb, cgdb, cgsb, cgT; -double cdgb, cddb, cdsb, cdeb, cdT; -double cbgb, cbdb, cbsb, cbeb, cbT; -double ceeb, ceT; -double GSoverlapCap, GDoverlapCap, GEoverlapCap, FwdSum, RevSum, Gm, Gmbs, GmT; -double omega; -double dxpart, sxpart; -double gbbg, gbbdp, gbbb, gbbp, gbbsp, gbbT; -double gddpg, gddpdp, gddpsp, gddpb, gddpT; -double gsspg, gsspdp, gsspsp, gsspb, gsspT; -double gppb, gppp; -double xcTt, cTt, gTtt, gTtg, gTtb, gTtdp, gTtsp; -double EDextrinsicCap, ESextrinsicCap; -double xcedb, xcesb; - -/* v3.0 */ -double Gme, gddpe, gsspe, gbbe, gTte; - -/* v3.1 added variables for RF */ -double T0=0.0; -double gcrgd, gcrgg, gcrgs, gcrgb, gcrg; -double xcgmgmb, xcgmdb, xcgmsb, xcgmeb, xcdgmb, xcsgmb, xcegmb; -double geltd; -double gigg, gigd, gigs, gigb, gige, gigT; -double gigpg, gigpp; - -/* v3.1.1 bug fix */ -double gIstotg, gIstotd, gIstotb, gIstots; -double gIdtotg, gIdtotd, gIdtotb, gIdtots; -double gIgtotg, gIgtotd, gIgtotb, gIgtots; - -/* v4.0 */ -double xcdbb, xcsbb, xcdbdb, xcsbsb, xcjdbdp, xcjsbsp; -double gstot, gstotd, gstotg, gstots, gstotb; -double gdtot, gdtotd, gdtotg, gdtots, gdtotb; - -double m; - - omega = ckt->CKTomega; - for (; model != NULL; model = B4SOInextModel(model)) - { - - for (here = B4SOIinstances(model); here!= NULL; - here = B4SOInextInstance(here)) - { - selfheat = (model->B4SOIshMod == 1) && (here->B4SOIrth0 != 0.0); - if (here->B4SOImode >= 0) - { Gm = here->B4SOIgm; - Gmbs = here->B4SOIgmbs; - -/* v3.0 */ - Gme = here->B4SOIgme; - - GmT = model->B4SOItype * here->B4SOIgmT; - FwdSum = Gm + Gmbs + Gme; /* v3.0 */ - RevSum = 0.0; - - cbgb = here->B4SOIcbgb; - cbsb = here->B4SOIcbsb; - cbdb = here->B4SOIcbdb; - cbeb = here->B4SOIcbeb; - cbT = model->B4SOItype * here->B4SOIcbT; - - ceeb = here->B4SOIceeb; - ceT = model->B4SOItype * here->B4SOIceT; - - cggb = here->B4SOIcggb; - cgsb = here->B4SOIcgsb; - cgdb = here->B4SOIcgdb; - cgT = model->B4SOItype * here->B4SOIcgT; - - cdgb = here->B4SOIcdgb; - cdsb = here->B4SOIcdsb; - cddb = here->B4SOIcddb; - cdeb = here->B4SOIcdeb; - cdT = model->B4SOItype * here->B4SOIcdT; - - cTt = here->pParam->B4SOIcth; - - -/* v3.1 bug fix */ - gigg = here->B4SOIgigg; - gigb = here->B4SOIgigb; - gige = here->B4SOIgige; - gigs = here->B4SOIgigs; - gigd = here->B4SOIgigd; - gigT = model->B4SOItype * here->B4SOIgigT; - - /* v4.1 */ - gigpg = here->B4SOIgigpg; - gigpp = here->B4SOIgigpp; - - gbbg = -here->B4SOIgbgs; - gbbdp = -here->B4SOIgbds; - gbbb = -here->B4SOIgbbs; - gbbp = -here->B4SOIgbps; - gbbT = -model->B4SOItype * here->B4SOIgbT; - gbbe = -here->B4SOIgbes; - - if (here->B4SOIrbodyMod) { /* v4.0 */ - gbbdp = -here->B4SOIgiigidld; - gbbb = -here->B4SOIgbgiigbpb; - } - - gbbsp = - ( gbbg + gbbdp + gbbb + gbbp + gbbe); - - gddpg = -here->B4SOIgjdg; - gddpdp = -here->B4SOIgjdd; - if (!here->B4SOIrbodyMod) /* v4.0 */ - gddpb = -here->B4SOIgjdb; - else - gddpb = here->B4SOIgiigidlb; - - gddpT = -model->B4SOItype * here->B4SOIgjdT; - -/* v3.0 */ - gddpe = -here->B4SOIgjde; - gddpsp = - ( gddpg + gddpdp + gddpb + gddpe); - - gsspg = -here->B4SOIgjsg; - gsspdp = -here->B4SOIgjsd; - if (!here->B4SOIrbodyMod) /* v4.0 */ - gsspb = -here->B4SOIgjsb; - else - gsspb = 0.0; - gsspT = -model->B4SOItype * here->B4SOIgjsT; - - gsspe = 0.0; - gsspsp = - (gsspg + gsspdp + gsspb + gsspe); - - gppb = -here->B4SOIgbpbs; - gppp = -here->B4SOIgbpps; - - gTtg = here->B4SOIgtempg; - gTtb = here->B4SOIgtempb; - gTtdp = here->B4SOIgtempd; - gTtt = here->B4SOIgtempT; - -/* v3.0 */ - gTte = here->B4SOIgtempe; - gTtsp = - (gTtg + gTtb + gTtdp + gTte); - - -/* v3.1.1 bug fix */ - if (model->B4SOIigcMod) - { - gIstotg = here->B4SOIgIgsg + here->B4SOIgIgcsg; - gIstotd = here->B4SOIgIgcsd; - gIstots = here->B4SOIgIgss + here->B4SOIgIgcss; - gIstotb = here->B4SOIgIgcsb; - - gIdtotg = here->B4SOIgIgdg + here->B4SOIgIgcdg; - gIdtotd = here->B4SOIgIgdd + here->B4SOIgIgcdd; - gIdtots = here->B4SOIgIgcds; - gIdtotb = here->B4SOIgIgcdb; - - gIgtotg = gIstotg + gIdtotg; - gIgtotd = gIstotd + gIdtotd; - gIgtots = gIstots + gIdtots; - gIgtotb = gIstotb + gIdtotb; - } - else - { - gIstotg = gIstotd = gIstots = gIstotb = 0.0; - gIdtotg = gIdtotd = gIdtots = gIdtotb = 0.0; - gIgtotg = gIgtotd = gIgtots = gIgtotb = 0.0; - } - - - sxpart = 0.6; - dxpart = 0.4; - - /* v3.1 for RF */ - if (here->B4SOIrgateMod == 2) - T0 = *(ckt->CKTstates[0] + here->B4SOIvges) - - *(ckt->CKTstates[0] + here->B4SOIvgs); - else if (here->B4SOIrgateMod == 3) - T0 = *(ckt->CKTstates[0] + here->B4SOIvgms) - - *(ckt->CKTstates[0] + here->B4SOIvgs); - if (here->B4SOIrgateMod > 1) - { gcrgd = here->B4SOIgcrgd * T0; - gcrgg = here->B4SOIgcrgg * T0; - gcrgs = here->B4SOIgcrgs * T0; - gcrgb = here->B4SOIgcrgb * T0; - gcrgg -= here->B4SOIgcrg; - gcrg = here->B4SOIgcrg; - } - else - gcrg = gcrgd = gcrgg = gcrgs = gcrgb = 0.0; - /* v3.1 for RF end*/ - - } - else - { Gm = -here->B4SOIgm; - Gmbs = -here->B4SOIgmbs; - -/* v3.0 */ - Gme = -here->B4SOIgme; - - GmT = -model->B4SOItype * here->B4SOIgmT; - FwdSum = 0.0; - RevSum = -Gm - Gmbs - Gme; /* v3.0 */ - - cdgb = - (here->B4SOIcdgb + here->B4SOIcggb + here->B4SOIcbgb); - cdsb = - (here->B4SOIcddb + here->B4SOIcgdb + here->B4SOIcbdb); - cddb = - (here->B4SOIcdsb + here->B4SOIcgsb + here->B4SOIcbsb); - cdeb = - (here->B4SOIcdeb + here->B4SOIcbeb + here->B4SOIceeb); - cdT = - model->B4SOItype * (here->B4SOIcgT + here->B4SOIcbT - + here->B4SOIcdT + here->B4SOIceT); - - ceeb = here->B4SOIceeb; - ceT = model->B4SOItype * here->B4SOIceT; - - cggb = here->B4SOIcggb; - cgsb = here->B4SOIcgdb; - cgdb = here->B4SOIcgsb; - cgT = model->B4SOItype * here->B4SOIcgT; - - cbgb = here->B4SOIcbgb; - cbsb = here->B4SOIcbdb; - cbdb = here->B4SOIcbsb; - cbeb = here->B4SOIcbeb; - cbT = model->B4SOItype * here->B4SOIcbT; - - cTt = here->pParam->B4SOIcth; - - -/* v3.1 bug fix */ - gigg = here->B4SOIgigg; - gigb = here->B4SOIgigb; - gige = here->B4SOIgige; - gigs = here->B4SOIgigd; /* v3.1.1 bug fix */ - gigd = here->B4SOIgigs; /* v3.1.1 bug fix */ - gigT = model->B4SOItype * here->B4SOIgigT; - - gigpg = here->B4SOIgigpg;/* bugfix_snps for setting gigpg gigpp*/ - gigpp = here->B4SOIgigpp; - - gbbg = -here->B4SOIgbgs; - gbbb = -here->B4SOIgbbs; - gbbp = -here->B4SOIgbps; - gbbsp = -here->B4SOIgbds; - gbbT = -model->B4SOItype * here->B4SOIgbT; -/* v3.0 */ - gbbe = -here->B4SOIgbes; - - if (here->B4SOIrbodyMod) { /* v4.0 */ - gbbsp = -here->B4SOIgiigidld; - gbbb = -here->B4SOIgbgiigbpb; - } - - gbbdp = - ( gbbg + gbbsp + gbbb + gbbp + gbbe); - - gddpg = -here->B4SOIgjsg; - gddpsp = -here->B4SOIgjsd; - if (!here->B4SOIrbodyMod) /* v4.0 */ - gddpb = -here->B4SOIgjsb; - else - gddpb = 0.0; - - gddpT = -model->B4SOItype * here->B4SOIgjsT; - -/* v3.0 */ - gddpe = 0.0; - gddpdp = - (gddpg + gddpsp + gddpb + gddpe ); - - gsspg = -here->B4SOIgjdg; - gsspsp = -here->B4SOIgjdd; - if (!here->B4SOIrbodyMod) /* v4.0 */ - gsspb = -here->B4SOIgjdb; - else - gsspb = here->B4SOIgiigidlb; - - gsspT = -model->B4SOItype * here->B4SOIgjdT; - -/* v3.0 */ - gsspe = -here->B4SOIgjde; - gsspdp = - ( gsspg + gsspsp + gsspb + gsspe ); - - gppb = -here->B4SOIgbpbs; - gppp = -here->B4SOIgbpps; - - gTtg = here->B4SOIgtempg; - gTtb = here->B4SOIgtempb; - gTtsp = here->B4SOIgtempd; - gTtt = here->B4SOIgtempT; - -/* v3.0 */ - gTte = here->B4SOIgtempe; - gTtdp = - (gTtg + gTtb + gTtsp + gTte); - - -/* v3.1.1 bug fix */ - if (model->B4SOIigcMod) - { - gIstotg = here->B4SOIgIgsg + here->B4SOIgIgcdg; - gIstotd = here->B4SOIgIgcds; - gIstots = here->B4SOIgIgss + here->B4SOIgIgcdd; - gIstotb = here->B4SOIgIgcdb; - - gIdtotg = here->B4SOIgIgdg + here->B4SOIgIgcsg; - gIdtotd = here->B4SOIgIgdd + here->B4SOIgIgcss; - gIdtots = here->B4SOIgIgcsd; - gIdtotb = here->B4SOIgIgcsb; - - gIgtotg = gIstotg + gIdtotg; - gIgtotd = gIstotd + gIdtotd; - gIgtots = gIstots + gIdtots; - gIgtotb = gIstotb + gIdtotb; - } - else - { - gIstotg = gIstotd = gIstots = gIstotb = 0.0; - gIdtotg = gIdtotd = gIdtots = gIdtotb = 0.0; - gIgtotg = gIgtotd = gIgtots = gIgtotb = 0.0; - } - - - sxpart = 0.4; - dxpart = 0.6; - - /* v3.1 for RF */ - if (here->B4SOIrgateMod == 2) - T0 = *(ckt->CKTstates[0] + here->B4SOIvges) - - *(ckt->CKTstates[0] + here->B4SOIvgs); - else if (here->B4SOIrgateMod == 3) - T0 = *(ckt->CKTstates[0] + here->B4SOIvgms) - - *(ckt->CKTstates[0] + here->B4SOIvgs); - if (here->B4SOIrgateMod > 1) - { gcrgd = here->B4SOIgcrgs * T0; - gcrgg = here->B4SOIgcrgg * T0; - gcrgs = here->B4SOIgcrgd * T0; - gcrgb = here->B4SOIgcrgb * T0; - gcrgg -= here->B4SOIgcrg; - gcrg = here->B4SOIgcrg; - } - else - gcrg = gcrgd = gcrgg = gcrgs = gcrgb = 0.0; - - /* v3.1 RF end*/ - - } - - if (!model->B4SOIrdsMod) { - gdpr=here->B4SOIdrainConductance; - gspr=here->B4SOIsourceConductance; - } - else gdpr = gspr = 0.0; - - - gds= here->B4SOIgds; - - GSoverlapCap = here->B4SOIcgso; - GDoverlapCap = here->B4SOIcgdo; - GEoverlapCap = here->pParam->B4SOIcgeo; - - EDextrinsicCap = here->B4SOIgcde; - ESextrinsicCap = here->B4SOIgcse; - - - /* v3.1 added for RF */ - if (here->B4SOIrgateMod == 3) - { - xcgmgmb = (GDoverlapCap + GSoverlapCap + GEoverlapCap ) * omega; - xcgmdb = -GDoverlapCap * omega; - xcgmsb = -GSoverlapCap * omega; - xcgmeb = -GEoverlapCap * omega; - - xcdgmb = xcgmdb; - xcsgmb = xcgmsb; - xcegmb = xcgmeb; - - xcedb = -EDextrinsicCap * omega; - xcdeb = (cdeb - EDextrinsicCap) * omega; - xcddb = (cddb + GDoverlapCap + EDextrinsicCap) * omega; - xceeb = (ceeb + GEoverlapCap + EDextrinsicCap + ESextrinsicCap) - * omega; - xcesb = -ESextrinsicCap * omega; - xcssb = (GSoverlapCap + ESextrinsicCap - (cgsb + cbsb + cdsb)) - * omega; - - xcseb = -(cbeb + cdeb + ceeb + ESextrinsicCap) * omega; - - xcegb = 0; /* v3.1 change for RF */ - xceT = ceT * omega; - xcggb = here->B4SOIcggb * omega; - xcgdb = cgdb * omega; - xcgsb = cgsb * omega; - xcgeb = 0; - xcgT = cgT * omega; - - xcdgb = cdgb * omega; - xcdsb = cdsb * omega; - xcdT = cdT * omega; - - xcsgb = -(cggb + cbgb + cdgb) * omega; - xcsdb = -(cgdb + cbdb + cddb) * omega; - xcsT = -(cgT + cbT + cdT + ceT) * omega; - - xcbgb = cbgb * omega; - xcbdb = cbdb * omega; - xcbsb = cbsb * omega; - xcbeb = cbeb * omega; - xcbT = cbT * omega; - - xcTt = cTt * omega; - } - - else - { - xcedb = -EDextrinsicCap * omega; - xcdeb = (cdeb - EDextrinsicCap) * omega; - xcddb = (cddb + GDoverlapCap + EDextrinsicCap) * omega; - xceeb = (ceeb + GEoverlapCap + EDextrinsicCap + ESextrinsicCap) - * omega; - xcesb = -ESextrinsicCap * omega; - xcssb = (GSoverlapCap + ESextrinsicCap - (cgsb + cbsb + cdsb)) - * omega; - - xcseb = -(cbeb + cdeb + ceeb + ESextrinsicCap) * omega; - - xcegb = (- GEoverlapCap) * omega; - xceT = ceT * omega; - xcggb = (cggb + GDoverlapCap + GSoverlapCap + GEoverlapCap) - * omega; - xcgdb = (cgdb - GDoverlapCap ) * omega; - xcgsb = (cgsb - GSoverlapCap) * omega; - xcgeb = (- GEoverlapCap) * omega; - xcgT = cgT * omega; - - xcdgb = (cdgb - GDoverlapCap) * omega; - xcdsb = cdsb * omega; - xcdT = cdT * omega; - - xcsgb = -(cggb + cbgb + cdgb + GSoverlapCap) * omega; - xcsdb = -(cgdb + cbdb + cddb) * omega; - xcsT = -(cgT + cbT + cdT + ceT) * omega; - - xcbgb = cbgb * omega; - xcbdb = cbdb * omega; - xcbsb = cbsb * omega; - xcbeb = cbeb * omega; - xcbT = cbT * omega; - - xcTt = cTt * omega; - - /* v3.1 */ - xcdgmb = xcsgmb = xcegmb = 0.0; - xcgmgmb = xcgmdb = xcgmsb = xcgmeb =0.0; - } - - if (here->B4SOImode >= 0) { /* v4.0 */ - if (!here->B4SOIrbodyMod) { - xcjdbdp = xcjsbsp = 0.0; - xcdbb = -(xcdgb + xcddb + xcdsb + xcdgmb + xcdeb); - xcsbb = -(xcsgb + xcsdb + xcssb + xcsgmb + xcseb); - xcdbdb = 0.0; xcsbsb = 0.0; - xcbdb = here->B4SOIcbdb * omega; - xcbsb = here->B4SOIcbsb * omega; - } - else { - xcjdbdp = here->B4SOIcjdb * omega; - xcjsbsp = here->B4SOIcjsb * omega; - xcdbb = -(xcdgb + xcddb + xcdsb + xcdgmb + xcdeb) - + xcjdbdp; - xcsbb = -(xcsgb + xcsdb + xcssb + xcsgmb + xcseb) - + xcjsbsp; - xcdbdb = -here->B4SOIcjdb * omega; - xcsbsb = -here->B4SOIcjsb * omega; - xcbdb = here->B4SOIcbdb * omega - xcdbdb; - xcbsb = here->B4SOIcbsb * omega - xcsbsb; - } - } - else { - if (!here->B4SOIrbodyMod) { - xcjdbdp = xcjsbsp = 0.0; - xcdbb = -(xcdgb + xcddb + xcdsb + xcdgmb + xcdeb); - xcsbb = -(xcsgb + xcsdb + xcssb + xcsgmb + xcseb); - xcdbdb = 0.0; xcsbsb = 0.0; - xcbdb = here->B4SOIcbsb * omega; - xcbsb = here->B4SOIcbdb * omega; - } - else { - xcjdbdp = here->B4SOIcjsb * omega; - xcjsbsp = here->B4SOIcjdb * omega; - xcdbb = -(xcdgb + xcddb + xcdsb + xcdgmb + xcdeb) - + xcjdbdp; - xcsbb = -(xcsgb + xcsdb + xcssb + xcsgmb + xcseb) - + xcjsbsp; - xcdbdb = -here->B4SOIcjsb * omega; - xcsbsb = -here->B4SOIcjdb * omega; - xcbdb = here->B4SOIcbsb * omega - xcdbdb; - xcbsb = here->B4SOIcbdb * omega - xcsbsb; - } - - } - - if (model->B4SOIrdsMod == 1) - { gstot = here->B4SOIgstot; - gstotd = here->B4SOIgstotd; - gstotg = here->B4SOIgstotg; - gstots = here->B4SOIgstots - gstot; - gstotb = here->B4SOIgstotb; - - gdtot = here->B4SOIgdtot; - gdtotd = here->B4SOIgdtotd - gdtot; - gdtotg = here->B4SOIgdtotg; - gdtots = here->B4SOIgdtots; - gdtotb = here->B4SOIgdtotb; - } - else - { gstot = gstotd = gstotg = gstots = gstotb = 0.0; - gdtot = gdtotd = gdtotg = gdtots = gdtotb = 0.0; - } - - m = here->B4SOIm; - - /* v3.1 for RF */ - geltd = here->B4SOIgrgeltd; - if (here->B4SOIrgateMod == 1) - { - *(here->B4SOIGEgePtr) += m * geltd; - *(here->B4SOIGgePtr) -= m * geltd; - *(here->B4SOIGEgPtr) -= m * geltd; - *(here->B4SOIGgPtr) += m * (geltd + gigg + gIgtotg); /* v3.1.1 bug fix */ - *(here->B4SOIGdpPtr) += m * (gigd + gIgtotd); /* v3.1.1 bug fix */ - *(here->B4SOIGspPtr) += m * (gigs + gIgtots); /* v3.1.1 bug fix */ - if (here->B4SOIsoiMod != 2) /* v3.2 */ - *(here->B4SOIGbPtr) -= m * (-gigb - gIgtotb); /* v3.1.1 bug fix */ - } - - else if (here->B4SOIrgateMod == 2) - { - *(here->B4SOIGEgePtr) += m * gcrg; - *(here->B4SOIGEgPtr) += m * gcrgg; - *(here->B4SOIGEdpPtr) += m * gcrgd; - *(here->B4SOIGEspPtr) += m * gcrgs; - if (here->B4SOIsoiMod != 2) /* v3.2 */ - *(here->B4SOIGEbPtr) += m * gcrgb; - - *(here->B4SOIGgePtr) -= m * gcrg; - *(here->B4SOIGgPtr) -= m * (gcrgg - gigg - gIgtotg); /* v3.1.1 bug fix */ - *(here->B4SOIGdpPtr) -= m * (gcrgd - gigd - gIgtotd); /* v3.1.1 bug fix */ - *(here->B4SOIGspPtr) -= m * (gcrgs - gigs - gIgtots); /* v3.1.1 bug fix */ - if (here->B4SOIsoiMod != 2) /* v3.2 */ - *(here->B4SOIGbPtr) -= m * (gcrgb - gigb - gIgtotb); /* v3.1.1 bug fix */ - } - - else if (here->B4SOIrgateMod == 3) - { - *(here->B4SOIGEgePtr) += m * geltd; - *(here->B4SOIGEgmPtr) -= m * geltd; - *(here->B4SOIGMgePtr) -= m * geltd; - *(here->B4SOIGMgmPtr) += m * (geltd + gcrg); - *(here->B4SOIGMgmPtr +1) += m * xcgmgmb; - - *(here->B4SOIGMdpPtr) += m * gcrgd; - *(here->B4SOIGMdpPtr +1) += m * xcgmdb; - *(here->B4SOIGMgPtr) += m * gcrgg; - *(here->B4SOIGMspPtr) += m * gcrgs; - *(here->B4SOIGMspPtr +1) += m * xcgmsb; - if (here->B4SOIsoiMod != 2) /* v3.2 */ - *(here->B4SOIGMbPtr) += m * gcrgb; - *(here->B4SOIGMePtr +1) += m * xcgmeb; - - *(here->B4SOIDPgmPtr +1) += m * xcdgmb; - *(here->B4SOIGgmPtr) -= m * gcrg; - *(here->B4SOISPgmPtr +1) += m * xcsgmb; - *(here->B4SOIEgmPtr +1) += m * xcegmb; - - *(here->B4SOIGgPtr) -= m * (gcrgg - gigg - gIgtotg); /* v3.1.1 bug fix */ - *(here->B4SOIGdpPtr) -= m * (gcrgd - gigd - gIgtotd); /* v3.1.1 bug fix */ - *(here->B4SOIGspPtr) -= m * (gcrgs - gigs - gIgtots); /* v3.1.1 bug fix */ - if (here->B4SOIsoiMod != 2) /* v3.2 */ - *(here->B4SOIGbPtr) -= m * (gcrgb - gigb - gIgtotb); /* v3.1.1 bug fix */ - } - else - { - *(here->B4SOIGgPtr) += m * (gigg + gIgtotg); /* v3.1.1 bug fix */ - *(here->B4SOIGdpPtr) += m * (gigd + gIgtotd); /* v3.1.1 bug fix */ - *(here->B4SOIGspPtr) += m * (gigs + gIgtots); /* v3.1.1 bug fix */ - if (here->B4SOIsoiMod != 2) /* v3.2 */ - *(here->B4SOIGbPtr) += m * (gigb + gIgtotb); /* v3.1.1 bug fix */ - } - /* v3.1 for RF end*/ - - if (model->B4SOIrdsMod) - { (*(here->B4SOIDgPtr) += m * gdtotg); - (*(here->B4SOIDspPtr) += m * gdtots); - (*(here->B4SOISdpPtr) += m * gstotd); - (*(here->B4SOISgPtr) += m * gstotg); - if (here->B4SOIsoiMod != 2) { - (*(here->B4SOIDbPtr) += m * gdtotb); - (*(here->B4SOISbPtr) += m * gstotb); - } - } - - *(here->B4SOIEdpPtr +1) += m * xcedb; - *(here->B4SOIEspPtr +1) += m * xcesb; - *(here->B4SOIDPePtr +1) += m * xcdeb; - *(here->B4SOISPePtr +1) += m * xcseb; - *(here->B4SOIEgPtr +1) += m * xcegb; - *(here->B4SOIGePtr +1) += m * xcgeb; - - *(here->B4SOIEePtr +1) += m * xceeb; - - *(here->B4SOIGgPtr +1) += m * xcggb; - *(here->B4SOIGdpPtr +1) += m * xcgdb; - *(here->B4SOIGspPtr +1) += m * xcgsb; - - *(here->B4SOIDPgPtr +1) += m * xcdgb; - *(here->B4SOIDPdpPtr +1) += m * xcddb; - *(here->B4SOIDPspPtr +1) += m * xcdsb; - - *(here->B4SOISPgPtr +1) += m * xcsgb; - *(here->B4SOISPdpPtr +1) += m * xcsdb; - *(here->B4SOISPspPtr +1) += m * xcssb; - -/* v3.1 */ - if (here->B4SOIsoiMod != 2) /* v3.2 */ - { - *(here->B4SOIBePtr +1) += m * xcbeb; - *(here->B4SOIBgPtr +1) += m * xcbgb; - *(here->B4SOIBdpPtr +1) += m * xcbdb; - *(here->B4SOIBspPtr +1) += m * xcbsb; - - *(here->B4SOIEbPtr +1) -= m * (xcegb + xceeb + xcedb + xcesb); - *(here->B4SOIGbPtr +1) -= m * (xcggb + xcgdb + xcgsb + xcgeb); -/* *(here->B4SOIDPbPtr +1) -= xcdgb + xcddb + xcdsb + xcdeb; - + xcdgmb; */ - - *(here->B4SOIDPbPtr +1) -= m * -xcdbb; /* v4.0 */ - -/* *(here->B4SOISPbPtr +1) -= xcsgb + xcsdb + xcssb + xcseb - + xcsgmb; */ - *(here->B4SOISPbPtr +1) -= m * -xcsbb; /* v4.0 */ - *(here->B4SOIBbPtr +1) -= m * (xcbgb + xcbdb + xcbsb + xcbeb); - } -/* v3.1 */ - - - if (selfheat) - { - *(here->B4SOITemptempPtr + 1) += m * xcTt; - *(here->B4SOIDPtempPtr + 1) += m * xcdT; - *(here->B4SOISPtempPtr + 1) += m * xcsT; - *(here->B4SOIBtempPtr + 1) += m * xcbT; - *(here->B4SOIEtempPtr + 1) += m * xceT; - *(here->B4SOIGtempPtr + 1) += m * xcgT; - } - - -/* v3.0 */ - if (here->B4SOIsoiMod != 0) /* v3.2 */ - { - *(here->B4SOIDPePtr) += m * (Gme + gddpe); - *(here->B4SOISPePtr) += m * (gsspe - Gme); - - if (here->B4SOIsoiMod != 2) /* v3.2 */ - { - *(here->B4SOIGePtr) += m * gige; - *(here->B4SOIBePtr) -= m * gige; - } - } - - *(here->B4SOIEePtr) += 0.0; - - *(here->B4SOIDPgPtr) += m * (Gm + gddpg - gIdtotg -gdtotg); /* v4.0 */ - *(here->B4SOIDPdpPtr) += m * (gdpr + gds + gddpdp + RevSum - gIdtotd - - gdtotd); /* v4.0 */ - - *(here->B4SOIDPspPtr) -= m * (gds + FwdSum - gddpsp + gIdtots - + gdtots); /* v4.0 */ - *(here->B4SOIDPdPtr) -= m * (gdpr + gdtot); - - *(here->B4SOISPgPtr) -= m * (Gm - gsspg + gIstotg + gstotg); /* v4.0 */ - *(here->B4SOISPdpPtr) -= m * (gds + RevSum - gsspdp + gIstotd - + gstotd); /* v4.0 */ - *(here->B4SOISPspPtr) += m * (gspr + gds + FwdSum + gsspsp - gIstots - - gstots); /* v4.0 */ - *(here->B4SOISPsPtr) -= m * (gspr + gstot); - - -/* v3.1 */ - if (here->B4SOIsoiMod != 2) /* v3.2 */ - { - *(here->B4SOIBePtr) += m * gbbe; /* v3.0 */ - *(here->B4SOIBgPtr) += m * (gbbg - gigg); /* v3.1 bug fix */ - *(here->B4SOIBdpPtr) += m * (gbbdp - gigd); /* v3.1 bug fix */ - *(here->B4SOIBspPtr) += m * (gbbsp - gigs); /* v3.1 bug fix */ - *(here->B4SOIBbPtr) += m * (gbbb - gigb); /* v3.1 bug fix */ - *(here->B4SOISPbPtr) -= m * (Gmbs - gsspb + gIstotb + gstotb); - /* v4.0 */ - *(here->B4SOIDPbPtr) -= m * ((-gddpb - Gmbs) + gIdtotb + gdtotb); - /* v4.0 */ - } -/* v3.1 */ - - - - if (selfheat) - { - *(here->B4SOIDPtempPtr) += m * (GmT + gddpT); - *(here->B4SOISPtempPtr) += m * (-GmT + gsspT); - *(here->B4SOIBtempPtr) += m * (gbbT - gigT); /* v3.1 bug fix */ - *(here->B4SOIGtempPtr) += m * gigT; /* v3.1 bug fix */ - *(here->B4SOITemptempPtr) += m * (gTtt + 1/here->pParam->B4SOIrth); - *(here->B4SOITempgPtr) += m * gTtg; - *(here->B4SOITempbPtr) += m * gTtb; - *(here->B4SOITempdpPtr) += m * gTtdp; - *(here->B4SOITempspPtr) += m * gTtsp; - -/* v3.0 */ - if (here->B4SOIsoiMod != 0) /* v3.2 */ - *(here->B4SOITempePtr) += m * gTte; - } - - - *(here->B4SOIDdPtr) += m * (gdpr + gdtot); - *(here->B4SOIDdpPtr) -= m * (gdpr - gdtotd); - *(here->B4SOISsPtr) += m * (gspr + gstot); - *(here->B4SOISspPtr) -= m * (gspr -gstots); - - - if (here->B4SOIbodyMod == 1) { - (*(here->B4SOIBpPtr) -= m * gppp); - (*(here->B4SOIPbPtr) += m * gppb); - (*(here->B4SOIPpPtr) += m * gppp); - } - - /* v4.1 Ig_agbcp2 stamping */ - (*(here->B4SOIGgPtr) += gigpg); - if (here->B4SOIbodyMod == 1) { - (*(here->B4SOIPpPtr) -= m * gigpp); - (*(here->B4SOIPgPtr) -= m * gigpg); - (*(here->B4SOIGpPtr) += m * gigpp); - } - else if(here->B4SOIbodyMod == 2) - { - (*(here->B4SOIBbPtr) -= m * gigpp); - (*(here->B4SOIBgPtr) -= m * gigpg); - (*(here->B4SOIGbPtr) += m * gigpp); - } - - - - /* v4.0 */ - if (here->B4SOIrbodyMod) - { - (*(here->B4SOIDPdbPtr + 1) -= m * xcjdbdp); - (*(here->B4SOIDPdbPtr) -= m * here->B4SOIGGjdb); - (*(here->B4SOISPsbPtr + 1) -= m * xcjsbsp); - (*(here->B4SOISPsbPtr) -= m * here->B4SOIGGjsb); - - (*(here->B4SOIDBdpPtr + 1) -= m * xcjdbdp); - (*(here->B4SOIDBdpPtr) -= m * here->B4SOIGGjdb); - (*(here->B4SOIDBdbPtr + 1) += m * xcjdbdp); - (*(here->B4SOIDBdbPtr) += m * (here->B4SOIGGjdb - + here->B4SOIgrbdb)); - - (*(here->B4SOIDBbPtr) -= m * here->B4SOIgrbdb); - (*(here->B4SOISBbPtr) -= m * here->B4SOIgrbsb); - - (*(here->B4SOISBspPtr + 1) -= m * xcjsbsp); - (*(here->B4SOISBspPtr) -= m * here->B4SOIGGjsb); - (*(here->B4SOISBsbPtr + 1) += m * xcjsbsp); - (*(here->B4SOISBsbPtr) += m * (here->B4SOIGGjsb - + here->B4SOIgrbsb)); - - (*(here->B4SOIBdbPtr) -= m * here->B4SOIgrbdb); - (*(here->B4SOIBsbPtr) -= m * here->B4SOIgrbsb); - (*(here->B4SOIBbPtr) += m * (here->B4SOIgrbsb - + here->B4SOIgrbdb)); - - } - - if (here->B4SOIdebugMod != 0) - { - *(here->B4SOIVbsPtr) += 1; - *(here->B4SOIIdsPtr) += 1; - *(here->B4SOIIcPtr) += 1; - *(here->B4SOIIbsPtr) += 1; - *(here->B4SOIIbdPtr) += 1; - *(here->B4SOIIiiPtr) += 1; - *(here->B4SOIIgidlPtr) += 1; - *(here->B4SOIItunPtr) += 1; - *(here->B4SOIIbpPtr) += 1; - *(here->B4SOICbgPtr) += 1; - *(here->B4SOICbbPtr) += 1; - *(here->B4SOICbdPtr) += 1; - *(here->B4SOIQbfPtr) += 1; - *(here->B4SOIQjsPtr) += 1; - *(here->B4SOIQjdPtr) += 1; - - } - - } - } - return(OK); -} - diff --git a/src/spicelib/devices/bsimsoi/b4soiask.c b/src/spicelib/devices/bsimsoi/b4soiask.c deleted file mode 100644 index b08de9525..000000000 --- a/src/spicelib/devices/bsimsoi/b4soiask.c +++ /dev/null @@ -1,388 +0,0 @@ -/*** B4SOI 12/16/2010 Released by Tanvir Morshed ***/ - - -/********** - * Copyright 2010 Regents of the University of California. All rights reserved. - * Authors: 1998 Samuel Fung, Dennis Sinitsky and Stephen Tang - * Authors: 1999-2004 Pin Su, Hui Wan, Wei Jin, b3soiask.c - * Authors: 2005- Hui Wan, Xuemei Xi, Ali Niknejad, Chenming Hu. - * Authors: 2009- Wenwei Yang, Chung-Hsun Lin, Ali Niknejad, Chenming Hu. - * File: b4soiask.c - * Modified by Hui Wan, Xuemei Xi 11/30/2005 - * Modified by Wenwei Yang, Chung-Hsun Lin, Darsen Lu 03/06/2009 - * Modified by Tanvir Morshed 09/22/2009 - * Modified by Tanvir Morshed 12/31/2009 - **********/ - -#include "ngspice/ngspice.h" - -#include "ngspice/ifsim.h" -#include "ngspice/cktdefs.h" -#include "ngspice/devdefs.h" -#include "b4soidef.h" -#include "ngspice/sperror.h" -#include "ngspice/suffix.h" - -int -B4SOIask( -CKTcircuit *ckt, -GENinstance *inst, -int which, -IFvalue *value, -IFvalue *select) -{ -B4SOIinstance *here = (B4SOIinstance*)inst; - - NG_IGNORE(select); - - switch(which) - { case B4SOI_L: - value->rValue = here->B4SOIl; - return(OK); - case B4SOI_W: - value->rValue = here->B4SOIw; - return(OK); - case B4SOI_M: - value->rValue = here->B4SOIm; - return(OK); - case B4SOI_AS: - value->rValue = here->B4SOIsourceArea; - return(OK); - case B4SOI_AD: - value->rValue = here->B4SOIdrainArea; - return(OK); - case B4SOI_PS: - value->rValue = here->B4SOIsourcePerimeter; - return(OK); - case B4SOI_PD: - value->rValue = here->B4SOIdrainPerimeter; - return(OK); - case B4SOI_NRS: - value->rValue = here->B4SOIsourceSquares; - return(OK); - case B4SOI_NRD: - value->rValue = here->B4SOIdrainSquares; - return(OK); - case B4SOI_OFF: - value->iValue = here->B4SOIoff; - return(OK); - case B4SOI_BJTOFF: - value->iValue = here->B4SOIbjtoff; - return(OK); - case B4SOI_RTH0: - value->rValue = here->B4SOIrth0; - return(OK); - case B4SOI_CTH0: - value->rValue = here->B4SOIcth0; - return(OK); - case B4SOI_NRB: - value->rValue = here->B4SOIbodySquares; - return(OK); - case B4SOI_FRBODY: - value->rValue = here->B4SOIfrbody; - return(OK); - - case B4SOI_QB: - value->rValue = here->B4SOIqbulk; - return(OK); - case B4SOI_QD: - value->rValue = here->B4SOIqdrn; - return(OK); - case B4SOI_QS: - value->rValue = here->B4SOIqsrc; - return(OK); - case B4SOI_CGG: - value->rValue = here->B4SOIcggb; - return(OK); - case B4SOI_CGD: - value->rValue = here->B4SOIcgdb; - return(OK); - case B4SOI_CGS: - value->rValue = here->B4SOIcgsb; - return(OK); - case B4SOI_CDG: - value->rValue = here->B4SOIcdgb; - return(OK); - case B4SOI_CDD: - value->rValue = here->B4SOIcddb; - return(OK); - case B4SOI_CDS: - value->rValue = here->B4SOIcdsb; - return(OK); - case B4SOI_CBG: - value->rValue = here->B4SOIcbgb; - return(OK); - case B4SOI_CBD: - value->rValue = here->B4SOIcbdb; - return(OK); - case B4SOI_CBS: - value->rValue = here->B4SOIcbsb; - return(OK); - case B4SOI_CAPBD: - value->rValue = here->B4SOIcapbd; - return(OK); - case B4SOI_CAPBS: - value->rValue = here->B4SOIcapbs; - return(OK); - -/* v4.0 */ - case B4SOI_RBSB: - value->rValue = here->B4SOIrbsb; - return(OK); - case B4SOI_RBDB: - value->rValue = here->B4SOIrbdb; - return(OK); - case B4SOI_CJSB: - value->rValue = here->B4SOIcjsb; - return(OK); - case B4SOI_CJDB: - value->rValue = here->B4SOIcjdb; - return(OK); - case B4SOI_SA: - value->rValue = here->B4SOIsa ; - return(OK); - case B4SOI_SB: - value->rValue = here->B4SOIsb ; - return(OK); - case B4SOI_SD: - value->rValue = here->B4SOIsd ; - return(OK); - case B4SOI_RBODYMOD: - value->iValue = here->B4SOIrbodyMod; - return(OK); - case B4SOI_NF: - value->rValue = here->B4SOInf; - return(OK); - case B4SOI_DELVTO: - value->rValue = here->B4SOIdelvto; - return(OK); - -/* v4.0 end */ - -/* v3.2 */ - case B4SOI_SOIMOD: - value->iValue = here->B4SOIsoiMod; - return(OK); - -/* v3.1 added rgate */ - case B4SOI_RGATEMOD: - value->iValue = here->B4SOIrgateMod; - return(OK); -/* v3.1 added rgate end */ - -/* v2.0 release */ - case B4SOI_NBC: - value->rValue = here->B4SOInbc; - return(OK); - case B4SOI_NSEG: - value->rValue = here->B4SOInseg; - return(OK); - case B4SOI_PDBCP: - value->rValue = here->B4SOIpdbcp; - return(OK); - case B4SOI_PSBCP: - value->rValue = here->B4SOIpsbcp; - return(OK); - case B4SOI_AGBCP: - value->rValue = here->B4SOIagbcp; - return(OK); - case B4SOI_AGBCP2: - value->rValue = here->B4SOIagbcp2; - return(OK); /* v4.1 for BC improvement */ - case B4SOI_AGBCPD: /* v4.0 */ - value->rValue = here->B4SOIagbcpd; - return(OK); - case B4SOI_AEBCP: - value->rValue = here->B4SOIaebcp; - return(OK); - case B4SOI_VBSUSR: - value->rValue = here->B4SOIvbsusr; - return(OK); - case B4SOI_TNODEOUT: - value->iValue = here->B4SOItnodeout; - return(OK); - - - case B4SOI_IC_VBS: - value->rValue = here->B4SOIicVBS; - return(OK); - case B4SOI_IC_VDS: - value->rValue = here->B4SOIicVDS; - return(OK); - case B4SOI_IC_VGS: - value->rValue = here->B4SOIicVGS; - return(OK); - case B4SOI_IC_VES: - value->rValue = here->B4SOIicVES; - return(OK); - case B4SOI_IC_VPS: - value->rValue = here->B4SOIicVPS; - return(OK); - case B4SOI_DNODE: - value->iValue = here->B4SOIdNode; - return(OK); - case B4SOI_GNODE: - value->iValue = here->B4SOIgNode; - return(OK); - case B4SOI_SNODE: - value->iValue = here->B4SOIsNode; - return(OK); - case B4SOI_BNODE: - value->iValue = here->B4SOIbNode; - return(OK); - case B4SOI_ENODE: - value->iValue = here->B4SOIeNode; - return(OK); - case B4SOI_DNODEPRIME: - value->iValue = here->B4SOIdNodePrime; - return(OK); - case B4SOI_SNODEPRIME: - value->iValue = here->B4SOIsNodePrime; - return(OK); - -/* v3.1 added for RF */ - case B4SOI_GNODEEXT: - value->iValue = here->B4SOIgNodeExt; - return(OK); - case B4SOI_GNODEMID: - value->iValue = here->B4SOIgNodeMid; - return(OK); -/* added for RF end*/ - - - case B4SOI_SOURCECONDUCT: - value->rValue = here->B4SOIsourceConductance; - value->rValue *= here->B4SOIm; - return(OK); - case B4SOI_DRAINCONDUCT: - value->rValue = here->B4SOIdrainConductance; - value->rValue *= here->B4SOIm; - return(OK); - case B4SOI_VBD: - value->rValue = *(ckt->CKTstate0 + here->B4SOIvbd); - return(OK); - case B4SOI_VBS: - value->rValue = *(ckt->CKTstate0 + here->B4SOIvbs); - return(OK); - case B4SOI_VGS: - value->rValue = *(ckt->CKTstate0 + here->B4SOIvgs); - return(OK); - case B4SOI_VES: - value->rValue = *(ckt->CKTstate0 + here->B4SOIves); - return(OK); - case B4SOI_VDS: - value->rValue = *(ckt->CKTstate0 + here->B4SOIvds); - return(OK); - case B4SOI_CD: - value->rValue = here->B4SOIcdrain; - value->rValue *= here->B4SOIm; - return(OK); - case B4SOI_IBS: - value->rValue = here->B4SOIibs; - value->rValue *= here->B4SOIm; - return(OK); - case B4SOI_IBD: - value->rValue = here->B4SOIibd; - value->rValue *= here->B4SOIm; - return(OK); - case B4SOI_ISUB: - value->rValue = here->B4SOIiii; - value->rValue *= here->B4SOIm; - return(OK); - case B4SOI_IGIDL: - value->rValue = here->B4SOIigidl; - return(OK); - case B4SOI_IGISL: - value->rValue = here->B4SOIigisl; - return(OK); - case B4SOI_IGS: - value->rValue = here->B4SOIIgs; - value->rValue *= here->B4SOIm; - return(OK); - case B4SOI_IGD: - value->rValue = here->B4SOIIgd; - value->rValue *= here->B4SOIm; - return(OK); - case B4SOI_IGB: - value->rValue = here->B4SOIIgb; - value->rValue *= here->B4SOIm; - return(OK); - case B4SOI_IGCS: - value->rValue = here->B4SOIIgcs; - value->rValue *= here->B4SOIm; - return(OK); - case B4SOI_IGCD: - value->rValue = here->B4SOIIgcd; - value->rValue *= here->B4SOIm; - return(OK); - case B4SOI_GM: - value->rValue = here->B4SOIgm; - value->rValue *= here->B4SOIm; - return(OK); - case B4SOI_GMID: - value->rValue = here->B4SOIgm/here->B4SOIcd; - return(OK); - case B4SOI_GDS: - value->rValue = here->B4SOIgds; - value->rValue *= here->B4SOIm; - return(OK); - case B4SOI_GMBS: - value->rValue = here->B4SOIgmbs; - value->rValue *= here->B4SOIm; - return(OK); - case B4SOI_GBD: - value->rValue = here->B4SOIgjdb; - value->rValue *= here->B4SOIm; - return(OK); - case B4SOI_GBS: - value->rValue = here->B4SOIgjsb; - value->rValue *= here->B4SOIm; - return(OK); - case B4SOI_CQB: - value->rValue = *(ckt->CKTstate0 + here->B4SOIcqb); - return(OK); - case B4SOI_CQG: - value->rValue = *(ckt->CKTstate0 + here->B4SOIcqg); - return(OK); - case B4SOI_CQD: - value->rValue = *(ckt->CKTstate0 + here->B4SOIcqd); - return(OK); - case B4SOI_CBDB: - value->rValue = here->B4SOIcbdb; - value->rValue *= here->B4SOIm; - return(OK); - case B4SOI_CBSB: - value->rValue = here->B4SOIcbsb; - value->rValue *= here->B4SOIm; - return(OK); - case B4SOI_VON: - value->rValue = here->B4SOIvon; - value->rValue *= here->B4SOIm; - return(OK); - case B4SOI_VDSAT: - value->rValue = here->B4SOIvdsat; - value->rValue *= here->B4SOIm; - return(OK); - case B4SOI_QBS: - value->rValue = *(ckt->CKTstate0 + here->B4SOIqbs); - return(OK); - case B4SOI_QBD: - value->rValue = *(ckt->CKTstate0 + here->B4SOIqbd); - return(OK); -#ifdef B4SOI_DEBUG_OUT - case B4SOI_DEBUG1: - value->rValue = here->B4SOIdebug1; - return(OK); - case B4SOI_DEBUG2: - value->rValue = here->B4SOIdebug2; - return(OK); - case B4SOI_DEBUG3: - value->rValue = here->B4SOIdebug3; - return(OK); -#endif - default: - return(E_BADPARM); - } - /* NOTREACHED */ -} - diff --git a/src/spicelib/devices/bsimsoi/b4soicheck.c b/src/spicelib/devices/bsimsoi/b4soicheck.c deleted file mode 100644 index 15d97ed2d..000000000 --- a/src/spicelib/devices/bsimsoi/b4soicheck.c +++ /dev/null @@ -1,1024 +0,0 @@ -/*** B4SOI 12/16/2010 Released by Tanvir Morshed ***/ - - -/********** - * Copyright 2010 Regents of the University of California. All rights reserved. - * Authors: 1998 Samuel Fung, Dennis Sinitsky and Stephen Tang - * Authors: 1999-2004 Pin Su, Hui Wan, Wei Jin, b3soicheck.c - * Authors: 2005- Hui Wan, Xuemei Xi, Ali Niknejad, Chenming Hu. - * Authors: 2009- Wenwei Yang, Chung-Hsun Lin, Ali Niknejad, Chenming Hu. - * Authors: 2010- Tanvir Morshed, Ali Niknejad, Chenming Hu. - * File: b4soicheck.c - * Modified by Hui Wan, Xuemei Xi 11/30/2005 - * Modified by Wenwei Yang, Chung-Hsun Lin, Darsen Lu 03/06/2009 - * Modified by Tanvir Morshed 09/22/2009 - * Modified by Tanvir Morshed 12/31/2009 - * Modified by Tanvir Morshed 12/16/2010 - **********/ - -#include "ngspice/ngspice.h" -#include "ngspice/cktdefs.h" -#include "b4soidef.h" -#include "ngspice/trandefs.h" -#include "ngspice/const.h" -#include "ngspice/sperror.h" -#include "ngspice/devdefs.h" -#include "ngspice/suffix.h" - -int -B4SOIcheckModel( -B4SOImodel *model, -B4SOIinstance *here, -CKTcircuit *ckt) -{ -struct b4soiSizeDependParam *pParam; -int Fatal_Flag = 0; -FILE *fplog; - - NG_IGNORE(ckt); - - if ((fplog = fopen("b4soiv1check.log", "w")) != NULL) - { pParam = here->pParam; - fprintf(fplog, "B4SOIV3 Parameter Check\n"); - fprintf(fplog, "Model = %s\n", model->B4SOImodName); - fprintf(fplog, "W = %g, L = %g\n", here->B4SOIw, here->B4SOIl); - - if (pParam->B4SOIlpe0 < -pParam->B4SOIleff) - { fprintf(fplog, "Fatal: Lpe0 = %g is less than -Leff.\n", - pParam->B4SOIlpe0); - printf("Fatal: Lpe0 = %g is less than -Leff.\n", - pParam->B4SOIlpe0); - Fatal_Flag = 1; - } - - if((here->B4SOIsa > 0.0) && (here->B4SOIsb > 0.0) && - ((here->B4SOInf == 1.0) || ((here->B4SOInf > 1.0) && - (here->B4SOIsd > 0.0))) ) - { if (model->B4SOIsaref <= 0.0) - { fprintf(fplog, "Fatal: SAref = %g is not positive.\n", - model->B4SOIsaref); - printf("Fatal: SAref = %g is not positive.\n", - model->B4SOIsaref); - Fatal_Flag = 1; - } - if (model->B4SOIsbref <= 0.0) - { fprintf(fplog, "Fatal: SBref = %g is not positive.\n", - model->B4SOIsbref); - printf("Fatal: SBref = %g is not positive.\n", - model->B4SOIsbref); - Fatal_Flag = 1; - } - } - - if (pParam->B4SOIlpeb < -pParam->B4SOIleff) /* v4.0 for Vth */ - { fprintf(fplog, "Fatal: Lpeb = %g is less than -Leff.\n", - pParam->B4SOIlpeb); - printf("Fatal: Lpeb = %g is less than -Leff.\n", - pParam->B4SOIlpeb); - Fatal_Flag = 1; - } - - if (pParam->B4SOIfprout < 0.0) /* v4.0 for DITS */ - { fprintf(fplog, "Fatal: fprout = %g is negative.\n", - pParam->B4SOIfprout); - printf("Fatal: fprout = %g is negative.\n", pParam->B4SOIfprout); - Fatal_Flag = 1; - } - if (pParam->B4SOIpdits < 0.0) /* v4.0 for DITS */ - { fprintf(fplog, "Fatal: pdits = %g is negative.\n", - pParam->B4SOIpdits); - printf("Fatal: pdits = %g is negative.\n", pParam->B4SOIpdits); - Fatal_Flag = 1; - } - if (model->B4SOIpditsl < 0.0) /* v4.0 for DITS */ - { fprintf(fplog, "Fatal: pditsl = %g is negative.\n", - model->B4SOIpditsl); - printf("Fatal: pditsl = %g is negative.\n", model->B4SOIpditsl); - Fatal_Flag = 1; - } - - if (model->B4SOItox <= 0.0) - { fprintf(fplog, "Fatal: Tox = %g is not positive.\n", - model->B4SOItox); - printf("Fatal: Tox = %g is not positive.\n", model->B4SOItox); - Fatal_Flag = 1; - } - if (model->B4SOIleffeot <= 0.0) - { fprintf(fplog, "Fatal: leffeot = %g is not positive.\n", - model->B4SOIleffeot); - printf("Fatal: Leffeot = %g is not positive.\n", model->B4SOIleffeot); - Fatal_Flag = 1; - } - if (model->B4SOIweffeot <= 0.0) - { fprintf(fplog, "Fatal: weffeot = %g is not positive.\n", - model->B4SOIweffeot); - printf("Fatal: Weffeot = %g is not positive.\n", model->B4SOIweffeot); - Fatal_Flag = 1; - } - if (model->B4SOItoxp <= 0.0) - { fprintf(fplog, "Fatal: Toxp = %g is not positive.\n", - model->B4SOItoxp); - printf("Fatal: Toxp = %g is not positive.\n", model->B4SOItoxp); - Fatal_Flag = 1; - } - if (model->B4SOIepsrgate < 0.0) - { fprintf(fplog, "Fatal: Epsrgate = %g is not positive.\n", - model->B4SOIepsrgate); - printf("Fatal: Epsrgate = %g is not positive.\n", model->B4SOIepsrgate); - Fatal_Flag = 1; - } - - if (model->B4SOItoxm <= 0.0) - { fprintf(fplog, "Fatal: Toxm = %g is not positive.\n", - model->B4SOItoxm); - printf("Fatal: Toxm = %g is not positive.\n", model->B4SOItoxm); - Fatal_Flag = 1; - } /* v3.2 */ - - if (here->B4SOInf < 1.0) - { fprintf(fplog, "Fatal: Number of finger = %g is smaller than one.\n", here->B4SOInf); - printf("Fatal: Number of finger = %g is smaller than one.\n", here->B4SOInf); - Fatal_Flag = 1; - } - - -/* v2.2.3 */ - if (model->B4SOItox - model->B4SOIdtoxcv <= 0.0) - { fprintf(fplog, "Fatal: Tox - dtoxcv = %g is not positive.\n", - model->B4SOItox - model->B4SOIdtoxcv); - printf("Fatal: Tox - dtoxcv = %g is not positive.\n", model->B4SOItox - model->B4SOIdtoxcv); - Fatal_Flag = 1; - } - - - if (model->B4SOItbox <= 0.0) - { fprintf(fplog, "Fatal: Tbox = %g is not positive.\n", - model->B4SOItbox); - printf("Fatal: Tbox = %g is not positive.\n", model->B4SOItbox); - Fatal_Flag = 1; - } - - if (pParam->B4SOInpeak <= 0.0) - { fprintf(fplog, "Fatal: Nch = %g is not positive.\n", - pParam->B4SOInpeak); - printf("Fatal: Nch = %g is not positive.\n", - pParam->B4SOInpeak); - Fatal_Flag = 1; - } - if (pParam->B4SOIngate < 0.0) - { fprintf(fplog, "Fatal: Ngate = %g is not positive.\n", - pParam->B4SOIngate); - printf("Fatal: Ngate = %g Ngate is not positive.\n", - pParam->B4SOIngate); - Fatal_Flag = 1; - } - if (pParam->B4SOIngate > 1.e25) - { fprintf(fplog, "Fatal: Ngate = %g is too high.\n", - pParam->B4SOIngate); - printf("Fatal: Ngate = %g Ngate is too high\n", - pParam->B4SOIngate); - Fatal_Flag = 1; - } - - if (pParam->B4SOIdvt1 < 0.0) - { fprintf(fplog, "Fatal: Dvt1 = %g is negative.\n", - pParam->B4SOIdvt1); - printf("Fatal: Dvt1 = %g is negative.\n", pParam->B4SOIdvt1); - Fatal_Flag = 1; - } - - if (pParam->B4SOIdvt1w < 0.0) - { fprintf(fplog, "Fatal: Dvt1w = %g is negative.\n", - pParam->B4SOIdvt1w); - printf("Fatal: Dvt1w = %g is negative.\n", pParam->B4SOIdvt1w); - Fatal_Flag = 1; - } - - if (pParam->B4SOIw0 == -pParam->B4SOIweff) - { fprintf(fplog, "Fatal: (W0 + Weff) = 0 cauing divided-by-zero.\n"); - printf("Fatal: (W0 + Weff) = 0 cauing divided-by-zero.\n"); - Fatal_Flag = 1; - } - - if (pParam->B4SOIdsub < 0.0) - { fprintf(fplog, "Fatal: Dsub = %g is negative.\n", pParam->B4SOIdsub); - printf("Fatal: Dsub = %g is negative.\n", pParam->B4SOIdsub); - Fatal_Flag = 1; - } - if (pParam->B4SOIb1 == -pParam->B4SOIweff) - { fprintf(fplog, "Fatal: (B1 + Weff) = 0 causing divided-by-zero.\n"); - printf("Fatal: (B1 + Weff) = 0 causing divided-by-zero.\n"); - Fatal_Flag = 1; - } - if (pParam->B4SOIu0temp <= 0.0) - { fprintf(fplog, "Fatal: u0 at current temperature = %g is not positive.\n", pParam->B4SOIu0temp); - printf("Fatal: u0 at current temperature = %g is not positive.\n", - pParam->B4SOIu0temp); - Fatal_Flag = 1; - } - -/* Check delta parameter */ - if (pParam->B4SOIdelta < 0.0) - { fprintf(fplog, "Fatal: Delta = %g is less than zero.\n", - pParam->B4SOIdelta); - printf("Fatal: Delta = %g is less than zero.\n", pParam->B4SOIdelta); - Fatal_Flag = 1; - } - - if (pParam->B4SOIvsattemp <= 0.0) - { fprintf(fplog, "Fatal: Vsat at current temperature = %g is not positive.\n", pParam->B4SOIvsattemp); - printf("Fatal: Vsat at current temperature = %g is not positive.\n", - pParam->B4SOIvsattemp); - Fatal_Flag = 1; - } -/* Check Rout parameters */ - if (pParam->B4SOIpclm <= 0.0) - { fprintf(fplog, "Fatal: Pclm = %g is not positive.\n", pParam->B4SOIpclm); - printf("Fatal: Pclm = %g is not positive.\n", pParam->B4SOIpclm); - Fatal_Flag = 1; - } - - if (pParam->B4SOIdrout < 0.0) - { fprintf(fplog, "Fatal: Drout = %g is negative.\n", pParam->B4SOIdrout); - printf("Fatal: Drout = %g is negative.\n", pParam->B4SOIdrout); - Fatal_Flag = 1; - } - if ( model->B4SOIunitLengthGateSidewallJctCapD > 0.0) /* v4.0 */ - { - if (here->B4SOIdrainPerimeter < pParam->B4SOIweff) - { fprintf(fplog, "Warning: Pd = %g is less than W.\n", - here->B4SOIdrainPerimeter); - printf("Warning: Pd = %g is less than W.\n", - here->B4SOIdrainPerimeter); - here->B4SOIdrainPerimeter =pParam->B4SOIweff; - } - } - if ( model->B4SOIunitLengthGateSidewallJctCapS > 0.0) /* v4.0 */ - { - if (here->B4SOIsourcePerimeter < pParam->B4SOIweff) - { fprintf(fplog, "Warning: Ps = %g is less than W.\n", - here->B4SOIsourcePerimeter); - printf("Warning: Ps = %g is less than W.\n", - here->B4SOIsourcePerimeter); - here->B4SOIsourcePerimeter =pParam->B4SOIweff; - } - } -/* Check capacitance parameters */ - if (pParam->B4SOIclc < 0.0) - { fprintf(fplog, "Fatal: Clc = %g is negative.\n", pParam->B4SOIclc); - printf("Fatal: Clc = %g is negative.\n", pParam->B4SOIclc); - Fatal_Flag = 1; - } - - -/* v3.2 */ - if (pParam->B4SOInoff < 0.1) - { fprintf(fplog, "Warning: Noff = %g is too small.\n", - pParam->B4SOInoff); - printf("Warning: Noff = %g is too small.\n", pParam->B4SOInoff); - } - if (pParam->B4SOInoff > 4.0) - { fprintf(fplog, "Warning: Noff = %g is too large.\n", - pParam->B4SOInoff); - printf("Warning: Noff = %g is too large.\n", pParam->B4SOInoff); - } - -/* added for stress */ - -/* Check stress effect parameters */ - if( (here->B4SOIsa > 0.0) && (here->B4SOIsb > 0.0) && - ((here->B4SOInf == 1.0) || ((here->B4SOInf > 1.0) && - (here->B4SOIsd > 0.0))) ) - { if (model->B4SOIlodk2 <= 0.0) - { fprintf(fplog, "Warning: LODK2 = %g is not positive.\n",model->B4SOIlodk2); - printf("Warning: LODK2 = %g is not positive.\n",model->B4SOIlodk2); - } - if (model->B4SOIlodeta0 <= 0.0) - { fprintf(fplog, "Warning: LODETA0 = %g is not positive.\n",model->B4SOIlodeta0); - printf("Warning: LODETA0 = %g is not positive.\n",model->B4SOIlodeta0); - } - } - -/* added for stress end */ - -/* v2.2.3 */ - if (pParam->B4SOImoin < 5.0) - { fprintf(fplog, "Warning: Moin = %g is too small.\n", - pParam->B4SOImoin); - printf("Warning: Moin = %g is too small.\n", pParam->B4SOImoin); - } - if (pParam->B4SOImoin > 25.0) - { fprintf(fplog, "Warning: Moin = %g is too large.\n", - pParam->B4SOImoin); - printf("Warning: Moin = %g is too large.\n", pParam->B4SOImoin); - } - -/* v3.0 */ - if (model->B4SOImoinFD < 5.0) - { fprintf(fplog, "Warning: MoinFD = %g is too small.\n", - model->B4SOImoinFD); - printf("Warning: MoinFD = %g is too small.\n", model->B4SOImoinFD); - } - - - if (model->B4SOIcapMod == 3) { - if (pParam->B4SOIacde < 0.1) /* v3.1.1 */ - { fprintf (fplog, "Warning: Acde = %g is too small.\n", - pParam->B4SOIacde); - printf ("Warning: Acde = %g is too small.\n", - pParam->B4SOIacde); - } - if (pParam->B4SOIacde > 1.6) - { fprintf (fplog, "Warning: Acde = %g is too large.\n", - pParam->B4SOIacde); - printf ("Warning: Acde = %g is too large.\n", - pParam->B4SOIacde); - } - } - -/* v4.2 always perform Fatal checks */ - if (pParam->B4SOInigc <= 0.0) - { fprintf(fplog, "Fatal: nigc = %g is non-positive.\n", - pParam->B4SOInigc); - printf("Fatal: nigc = %g is non-positive.\n", pParam->B4SOInigc); - Fatal_Flag = 1; - } - if (pParam->B4SOIpoxedge <= 0.0) - { fprintf(fplog, "Fatal: poxedge = %g is non-positive.\n", - pParam->B4SOIpoxedge); - printf("Fatal: poxedge = %g is non-positive.\n", pParam->B4SOIpoxedge); - Fatal_Flag = 1; - } - if (pParam->B4SOIpigcd <= 0.0) - { fprintf(fplog, "Fatal: pigcd = %g is non-positive.\n", - pParam->B4SOIpigcd); - printf("Fatal: pigcd = %g is non-positive.\n", pParam->B4SOIpigcd); - Fatal_Flag = 1; - } - - if (model->B4SOItoxref < 0.0) - { fprintf(fplog, "Warning: TOXREF = %g is negative.\n", - model->B4SOItoxref); - printf("Warning: Toxref = %g is negative.\n", model->B4SOItoxref); - Fatal_Flag = 1; - } - - if (model->B4SOItoxqm <= 0.0) - { fprintf(fplog, "Fatal: Toxqm = %g is not positive.\n", - model->B4SOItoxqm); - printf("Fatal: Toxqm = %g is not positive.\n", model->B4SOItoxqm); - Fatal_Flag = 1; - } - - if (model->B4SOIdeltavox <= 0.0) - { fprintf(fplog, "Fatal: Deltavox = %g is not positive.\n", - model->B4SOIdeltavox); - printf("Fatal: Deltavox = %g is not positive.\n", model->B4SOIdeltavox); - } - -/* v4.4 Tanvir */ - if (pParam->B4SOIrdsw < 0.0) - { fprintf(fplog, "Warning: Rdsw = %g is negative. Set to zero.\n", - pParam->B4SOIrdsw); - printf("Warning: Rdsw = %g is negative. Set to zero.\n", - pParam->B4SOIrdsw); - pParam->B4SOIrdsw = 0.0; - pParam->B4SOIrds0 = 0.0; - } - else if (pParam->B4SOIrds0 < 0.001) - { fprintf(fplog, "Warning: Rds at current temperature = %g is less than 0.001 ohm. Set to zero.\n", - pParam->B4SOIrds0); - printf("Warning: Rds at current temperature = %g is less than 0.001 ohm. Set to zero.\n", - pParam->B4SOIrds0); - pParam->B4SOIrds0 = 0.0; - } /* v4.4 */ - if ((model->B4SOIcfrcoeff < 1.0)||(model->B4SOIcfrcoeff > 2.0)) - { fprintf(fplog, "Warning: CfrCoeff = %g is out of range.\n", - model->B4SOIcfrcoeff); - printf("Warning: CfrCoeff = %g is outside valid range [1,2], set to 1.\n", model->B4SOIcfrcoeff); - model->B4SOIcfrcoeff = 1; - } /* v4.4 */ - if (model->B4SOIparamChk ==1) - { -/* Check L and W parameters */ - if (pParam->B4SOIleff <= 5.0e-8) - { fprintf(fplog, "Warning: Leff = %g may be too small.\n", - pParam->B4SOIleff); - printf("Warning: Leff = %g may be too small.\n", - pParam->B4SOIleff); - } - - if (pParam->B4SOIleffCV <= 5.0e-8) - { fprintf(fplog, "Warning: Leff for CV = %g may be too small.\n", - pParam->B4SOIleffCV); - printf("Warning: Leff for CV = %g may be too small.\n", - pParam->B4SOIleffCV); - } - - if (pParam->B4SOIweff <= 1.0e-7) - { fprintf(fplog, "Warning: Weff = %g may be too small.\n", - pParam->B4SOIweff); - printf("Warning: Weff = %g may be too small.\n", - pParam->B4SOIweff); - } - - if (pParam->B4SOIweffCV <= 1.0e-7) - { fprintf(fplog, "Warning: Weff for CV = %g may be too small.\n", - pParam->B4SOIweffCV); - printf("Warning: Weff for CV = %g may be too small.\n", - pParam->B4SOIweffCV); - } - -/* Check threshold voltage parameters */ - if (pParam->B4SOIlpe0 < 0.0) - { fprintf(fplog, "Warning: Lpe0 = %g is negative.\n", pParam->B4SOIlpe0); - printf("Warning: Lpe0 = %g is negative.\n", pParam->B4SOIlpe0); - } - if (model->B4SOItox < 1.0e-9) - { fprintf(fplog, "Warning: Tox = %g is less than 10A.\n", - model->B4SOItox); - printf("Warning: Tox = %g is less than 10A.\n", model->B4SOItox); - } - - if (pParam->B4SOInpeak <= 1.0e15) - { fprintf(fplog, "Warning: Nch = %g may be too small.\n", - pParam->B4SOInpeak); - printf("Warning: Nch = %g may be too small.\n", - pParam->B4SOInpeak); - } - else if (pParam->B4SOInpeak >= 1.0e21) - { fprintf(fplog, "Warning: Nch = %g may be too large.\n", - pParam->B4SOInpeak); - printf("Warning: Nch = %g may be too large.\n", - pParam->B4SOInpeak); - } - - if (fabs(pParam->B4SOInsub) >= 1.0e21) - { fprintf(fplog, "Warning: Nsub = %g may be too large.\n", - pParam->B4SOInsub); - printf("Warning: Nsub = %g may be too large.\n", - pParam->B4SOInsub); - } - - if ((pParam->B4SOIngate > 0.0) && - (pParam->B4SOIngate <= 1.e18)) - { fprintf(fplog, "Warning: Ngate = %g is less than 1.E18cm^-3.\n", - pParam->B4SOIngate); - printf("Warning: Ngate = %g is less than 1.E18cm^-3.\n", - pParam->B4SOIngate); - } - - if (pParam->B4SOIdvt0 < 0.0) - { fprintf(fplog, "Warning: Dvt0 = %g is negative.\n", - pParam->B4SOIdvt0); - printf("Warning: Dvt0 = %g is negative.\n", pParam->B4SOIdvt0); - } - - if (fabs(1.0e-6 / (pParam->B4SOIw0 + pParam->B4SOIweff)) > 10.0) - { fprintf(fplog, "Warning: (W0 + Weff) may be too small.\n"); - printf("Warning: (W0 + Weff) may be too small.\n"); - } -/* Check Nsd, Ngate and Npeak parameters*/ /* Bug Fix # 22 Jul09*/ -if (model->B4SOInsd > 1.0e23) - { fprintf(fplog, "Warning: Nsd = %g is too large, should be specified in cm^-3.\n", - model->B4SOInsd); - printf("Warning: Nsd = %g is too large, should be specified in cm^-3.\n", model->B4SOInsd); - } -if (model->B4SOIngate > 1.0e23) - { fprintf(fplog, "Warning: Ngate = %g is too large, should be specified in cm^-3.\n", - model->B4SOIngate); - printf("Warning: Ngate = %g is too large, should be specified in cm^-3.\n", model->B4SOIngate); - } -if (model->B4SOInpeak > 1.0e20) - { fprintf(fplog, "Warning: Npeak = %g is too large, should be less than 1.0e20, specified in cm^-3.\n", - model->B4SOInpeak); - printf("Warning: Npeak = %g is too large, should be less than 1.0e20, specified in cm^-3.\n", model->B4SOInpeak); - } -/* Check subthreshold parameters */ - if (pParam->B4SOInfactor < 0.0) - { fprintf(fplog, "Warning: Nfactor = %g is negative.\n", - pParam->B4SOInfactor); - printf("Warning: Nfactor = %g is negative.\n", pParam->B4SOInfactor); - } - if (pParam->B4SOIcdsc < 0.0) - { fprintf(fplog, "Warning: Cdsc = %g is negative.\n", - pParam->B4SOIcdsc); - printf("Warning: Cdsc = %g is negative.\n", pParam->B4SOIcdsc); - } - if (pParam->B4SOIcdscd < 0.0) - { fprintf(fplog, "Warning: Cdscd = %g is negative.\n", - pParam->B4SOIcdscd); - printf("Warning: Cdscd = %g is negative.\n", pParam->B4SOIcdscd); - } -/* Check DIBL parameters */ - if (pParam->B4SOIeta0 < 0.0) - { fprintf(fplog, "Warning: Eta0 = %g is negative.\n", - pParam->B4SOIeta0); - printf("Warning: Eta0 = %g is negative.\n", pParam->B4SOIeta0); - } - -/* Check Abulk parameters */ - if (fabs(1.0e-6 / (pParam->B4SOIb1 + pParam->B4SOIweff)) > 10.0) - { fprintf(fplog, "Warning: (B1 + Weff) may be too small.\n"); - printf("Warning: (B1 + Weff) may be too small.\n"); - } - -/* Check Saturation parameters */ - if (pParam->B4SOIa2 < 0.01) - { fprintf(fplog, "Warning: A2 = %g is too small. Set to 0.01.\n", pParam->B4SOIa2); - printf("Warning: A2 = %g is too small. Set to 0.01.\n", - pParam->B4SOIa2); - pParam->B4SOIa2 = 0.01; - } - else if (pParam->B4SOIa2 > 1.0) - { fprintf(fplog, "Warning: A2 = %g is larger than 1. A2 is set to 1 and A1 is set to 0.\n", - pParam->B4SOIa2); - printf("Warning: A2 = %g is larger than 1. A2 is set to 1 and A1 is set to 0.\n", - pParam->B4SOIa2); - pParam->B4SOIa2 = 1.0; - pParam->B4SOIa1 = 0.0; - - } -/* - if (pParam->B4SOIrdsw < 0.0) - { fprintf(fplog, "Warning: Rdsw = %g is negative. Set to zero.\n", - pParam->B4SOIrdsw); - printf("Warning: Rdsw = %g is negative. Set to zero.\n", - pParam->B4SOIrdsw); - pParam->B4SOIrdsw = 0.0; - pParam->B4SOIrds0 = 0.0; - } - else if (pParam->B4SOIrds0 < 0.001) - { fprintf(fplog, "Warning: Rds at current temperature = %g is less than 0.001 ohm. Set to zero.\n", - pParam->B4SOIrds0); - printf("Warning: Rds at current temperature = %g is less than 0.001 ohm. Set to zero.\n", - pParam->B4SOIrds0); - pParam->B4SOIrds0 = 0.0; - } v4.4 */ - if (pParam->B4SOIvsattemp < 1.0e3) - { fprintf(fplog, "Warning: Vsat at current temperature = %g may be too small.\n", pParam->B4SOIvsattemp); - printf("Warning: Vsat at current temperature = %g may be too small.\n", pParam->B4SOIvsattemp); - } - - if (pParam->B4SOIpdibl1 < 0.0) - { fprintf(fplog, "Warning: Pdibl1 = %g is negative.\n", - pParam->B4SOIpdibl1); - printf("Warning: Pdibl1 = %g is negative.\n", pParam->B4SOIpdibl1); - } - if (pParam->B4SOIpdibl2 < 0.0) - { fprintf(fplog, "Warning: Pdibl2 = %g is negative.\n", - pParam->B4SOIpdibl2); - printf("Warning: Pdibl2 = %g is negative.\n", pParam->B4SOIpdibl2); - } -/* Check overlap capacitance parameters */ - if (model->B4SOIcgdo < 0.0) - { fprintf(fplog, "Warning: cgdo = %g is negative. Set to zero.\n", model->B4SOIcgdo); - printf("Warning: cgdo = %g is negative. Set to zero.\n", model->B4SOIcgdo); - model->B4SOIcgdo = 0.0; - } - if (model->B4SOIcgso < 0.0) - { fprintf(fplog, "Warning: cgso = %g is negative. Set to zero.\n", model->B4SOIcgso); - printf("Warning: cgso = %g is negative. Set to zero.\n", model->B4SOIcgso); - model->B4SOIcgso = 0.0; - } - if (model->B4SOIcgeo < 0.0) - { fprintf(fplog, "Warning: cgeo = %g is negative. Set to zero.\n", model->B4SOIcgeo); - printf("Warning: cgeo = %g is negative. Set to zero.\n", model->B4SOIcgeo); - model->B4SOIcgeo = 0.0; - } - - if (model->B4SOIntun < 0.0) - { fprintf(fplog, "Warning: Ntuns = %g is negative.\n", - model->B4SOIntun); - printf("Warning: Ntuns = %g is negative.\n", model->B4SOIntun); - } - - if (model->B4SOIntund < 0.0) - { fprintf(fplog, "Warning: Ntund = %g is negative.\n", - model->B4SOIntund); - printf("Warning: Ntund = %g is negative.\n", model->B4SOIntund); - } - - if (model->B4SOIndiode < 0.0) - { fprintf(fplog, "Warning: Ndiode = %g is negative.\n", - model->B4SOIndiode); - printf("Warning: Ndiode = %g is negative.\n", model->B4SOIndiode); - } - - if (model->B4SOIndioded < 0.0) - { fprintf(fplog, "Warning: Ndioded = %g is negative.\n", - model->B4SOIndioded); - printf("Warning: Ndioded = %g is negative.\n", model->B4SOIndioded); - } - - if (model->B4SOIisbjt < 0.0) - { fprintf(fplog, "Warning: Isbjt = %g is negative.\n", - model->B4SOIisbjt); - printf("Warning: Isbjt = %g is negative.\n", model->B4SOIisbjt); - } - if (model->B4SOIidbjt < 0.0) - { fprintf(fplog, "Warning: Idbjt = %g is negative.\n", - model->B4SOIidbjt); - printf("Warning: Idbjt = %g is negative.\n", model->B4SOIidbjt); - } - - if (model->B4SOIisdif < 0.0) - { fprintf(fplog, "Warning: Isdif = %g is negative.\n", - model->B4SOIisdif); - printf("Warning: Isdif = %g is negative.\n", model->B4SOIisdif); - } - if (model->B4SOIiddif < 0.0) - { fprintf(fplog, "Warning: Iddif = %g is negative.\n", - model->B4SOIiddif); - printf("Warning: Iddif = %g is negative.\n", model->B4SOIiddif); - } - - if (model->B4SOIisrec < 0.0) - { fprintf(fplog, "Warning: Isrec = %g is negative.\n", - model->B4SOIisrec); - printf("Warning: Isrec = %g is negative.\n", model->B4SOIisrec); - } - if (model->B4SOIidrec < 0.0) - { fprintf(fplog, "Warning: Idrec = %g is negative.\n", - model->B4SOIidrec); - printf("Warning: Idrec = %g is negative.\n", model->B4SOIidrec); - } - - if (model->B4SOIistun < 0.0) - { fprintf(fplog, "Warning: Istun = %g is negative.\n", - model->B4SOIistun); - printf("Warning: Istun = %g is negative.\n", model->B4SOIistun); - } - if (model->B4SOIidtun < 0.0) - { fprintf(fplog, "Warning: Idtun = %g is negative.\n", - model->B4SOIidtun); - printf("Warning: Idtun = %g is negative.\n", model->B4SOIidtun); - } - - if (model->B4SOItt < 0.0) - { fprintf(fplog, "Warning: Tt = %g is negative.\n", - model->B4SOItt); - printf("Warning: Tt = %g is negative.\n", model->B4SOItt); - } - - if (model->B4SOIcsdmin < 0.0) - { fprintf(fplog, "Warning: Csdmin = %g is negative.\n", - model->B4SOIcsdmin); - printf("Warning: Csdmin = %g is negative.\n", model->B4SOIcsdmin); - } - - if (model->B4SOIcsdesw < 0.0) - { fprintf(fplog, "Warning: Csdesw = %g is negative.\n", - model->B4SOIcsdesw); - printf("Warning: Csdesw = %g is negative.\n", model->B4SOIcsdesw); - } - - if (model->B4SOIasd < 0.0) - { fprintf(fplog, "Warning: Asd = %g should be within (0, 1).\n", - model->B4SOIasd); - printf("Warning: Asd = %g should be within (0, 1).\n", model->B4SOIasd); - } - - if (model->B4SOIrth0 < 0.0) - { fprintf(fplog, "Warning: Rth0 = %g is negative.\n", - model->B4SOIrth0); - printf("Warning: Rth0 = %g is negative.\n", model->B4SOIrth0); - } - - if (model->B4SOIcth0 < 0.0) - { fprintf(fplog, "Warning: Cth0 = %g is negative.\n", - model->B4SOIcth0); - printf("Warning: Cth0 = %g is negative.\n", model->B4SOIcth0); - } - - if (model->B4SOIrbody < 0.0) - { fprintf(fplog, "Warning: Rbody = %g is negative.\n", - model->B4SOIrbody); - printf("Warning: Rbody = %g is negative.\n", model->B4SOIrbody); - } - - if (model->B4SOIrbsh < 0.0) - { fprintf(fplog, "Warning: Rbsh = %g is negative.\n", - model->B4SOIrbsh); - printf("Warning: Rbsh = %g is negative.\n", model->B4SOIrbsh); - } - - -/* v2.2 release */ - if (model->B4SOIwth0 < 0.0) - { fprintf(fplog, "Warning: WTH0 = %g is negative.\n", - model->B4SOIwth0); - printf("Warning: Wth0 = %g is negative.\n", model->B4SOIwth0); - } - if (model->B4SOIrhalo < 0.0) - { fprintf(fplog, "Warning: RHALO = %g is negative.\n", - model->B4SOIrhalo); - printf("Warning: Rhalo = %g is negative.\n", model->B4SOIrhalo); - } - if (model->B4SOIntox < 0.0) - { fprintf(fplog, "Warning: NTOX = %g is negative.\n", - model->B4SOIntox); - printf("Warning: Ntox = %g is negative.\n", model->B4SOIntox); - } - if (model->B4SOIebg < 0.0) - { fprintf(fplog, "Warning: EBG = %g is negative.\n", - model->B4SOIebg); - printf("Warning: Ebg = %g is negative.\n", model->B4SOIebg); - } - if (model->B4SOIvevb < 0.0) - { fprintf(fplog, "Warning: VEVB = %g is negative.\n", - model->B4SOIvevb); - printf("Warning: Vevb = %g is negative.\n", model->B4SOIvevb); - } - if (pParam->B4SOIalphaGB1 < 0.0) - { fprintf(fplog, "Warning: ALPHAGB1 = %g is negative.\n", - pParam->B4SOIalphaGB1); - printf("Warning: AlphaGB1 = %g is negative.\n", pParam->B4SOIalphaGB1); - } - if (pParam->B4SOIbetaGB1 < 0.0) - { fprintf(fplog, "Warning: BETAGB1 = %g is negative.\n", - pParam->B4SOIbetaGB1); - printf("Warning: BetaGB1 = %g is negative.\n", pParam->B4SOIbetaGB1); - } - if (model->B4SOIvgb1 < 0.0) - { fprintf(fplog, "Warning: VGB1 = %g is negative.\n", - model->B4SOIvgb1); - printf("Warning: Vgb1 = %g is negative.\n", model->B4SOIvgb1); - } - if (model->B4SOIvecb < 0.0) - { fprintf(fplog, "Warning: VECB = %g is negative.\n", - model->B4SOIvecb); - printf("Warning: Vecb = %g is negative.\n", model->B4SOIvecb); - } - if (pParam->B4SOIalphaGB2 < 0.0) - { fprintf(fplog, "Warning: ALPHAGB2 = %g is negative.\n", - pParam->B4SOIalphaGB2); - printf("Warning: AlphaGB2 = %g is negative.\n", pParam->B4SOIalphaGB2); - } - if (pParam->B4SOIbetaGB2 < 0.0) - { fprintf(fplog, "Warning: BETAGB2 = %g is negative.\n", - pParam->B4SOIbetaGB2); - printf("Warning: BetaGB2 = %g is negative.\n", pParam->B4SOIbetaGB2); - } - if (model->B4SOIvgb2 < 0.0) - { fprintf(fplog, "Warning: VGB2 = %g is negative.\n", - model->B4SOIvgb2); - printf("Warning: Vgb2 = %g is negative.\n", model->B4SOIvgb2); - } - if (model->B4SOIvoxh < 0.0) - { fprintf(fplog, "Warning: Voxh = %g is negative.\n", - model->B4SOIvoxh); - printf("Warning: Voxh = %g is negative.\n", model->B4SOIvoxh); - } - -/* v2.0 release */ - if (model->B4SOIk1w1 < 0.0) - { fprintf(fplog, "Warning: K1W1 = %g is negative.\n", - model->B4SOIk1w1); - printf("Warning: K1w1 = %g is negative.\n", model->B4SOIk1w1); - } - if (model->B4SOIk1w2 < 0.0) - { fprintf(fplog, "Warning: K1W2 = %g is negative.\n", - model->B4SOIk1w2); - printf("Warning: K1w2 = %g is negative.\n", model->B4SOIk1w2); - } - if (model->B4SOIketas < 0.0) - { fprintf(fplog, "Warning: KETAS = %g is negative.\n", - model->B4SOIketas); - printf("Warning: Ketas = %g is negative.\n", model->B4SOIketas); - } - if (model->B4SOIdwbc < 0.0) - { fprintf(fplog, "Warning: DWBC = %g is negative.\n", - model->B4SOIdwbc); - printf("Warning: Dwbc = %g is negative.\n", model->B4SOIdwbc); - } - if (model->B4SOIbeta0 < 0.0) - { fprintf(fplog, "Warning: BETA0 = %g is negative.\n", - model->B4SOIbeta0); - printf("Warning: Beta0 = %g is negative.\n", model->B4SOIbeta0); - } - if (model->B4SOIbeta1 < 0.0) - { fprintf(fplog, "Warning: BETA1 = %g is negative.\n", - model->B4SOIbeta1); - printf("Warning: Beta1 = %g is negative.\n", model->B4SOIbeta1); - } - if (model->B4SOIbeta2 < 0.0) - { fprintf(fplog, "Warning: BETA2 = %g is negative.\n", - model->B4SOIbeta2); - printf("Warning: Beta2 = %g is negative.\n", model->B4SOIbeta2); - } - if (model->B4SOItii < 0.0) - { fprintf(fplog, "Warning: TII = %g is negative.\n", - model->B4SOItii); - printf("Warning: Tii = %g is negative.\n", model->B4SOItii); - } - if (model->B4SOIlii < 0.0) - { fprintf(fplog, "Warning: LII = %g is negative.\n", - model->B4SOIlii); - printf("Warning: Lii = %g is negative.\n", model->B4SOIlii); - } - if (model->B4SOIsii1 < 0.0) - { fprintf(fplog, "Warning: SII1 = %g is negative.\n", - model->B4SOIsii1); - printf("Warning: Sii1 = %g is negative.\n", model->B4SOIsii1); - } - if (model->B4SOIsii2 < 0.0) - { fprintf(fplog, "Warning: SII2 = %g is negative.\n", - model->B4SOIsii2); - printf("Warning: Sii2 = %g is negative.\n", model->B4SOIsii1); - } - if (model->B4SOIsiid < 0.0) - { fprintf(fplog, "Warning: SIID = %g is negative.\n", - model->B4SOIsiid); - printf("Warning: Siid = %g is negative.\n", model->B4SOIsiid); - } - if (model->B4SOIfbjtii < 0.0) - { fprintf(fplog, "Warning: FBJTII = %g is negative.\n", - model->B4SOIfbjtii); - printf("Warning: fbjtii = %g is negative.\n", model->B4SOIfbjtii); - } - if (model->B4SOIvrec0 < 0.0) /* v4.0 */ - { fprintf(fplog, "Warning: VREC0S = %g is negative.\n", - model->B4SOIvrec0); - printf("Warning: Vrec0s = %g is negative.\n", model->B4SOIvrec0); - } - if (model->B4SOIvrec0d < 0.0) /* v4.0 */ - { fprintf(fplog, "Warning: VREC0D = %g is negative.\n", - model->B4SOIvrec0d); - printf("Warning: Vrec0d = %g is negative.\n", model->B4SOIvrec0d); - } - if (model->B4SOIvtun0 < 0.0) /* v4.0 */ - { fprintf(fplog, "Warning: VTUN0S = %g is negative.\n", - model->B4SOIvtun0); - printf("Warning: Vtun0s = %g is negative.\n", model->B4SOIvtun0); - } - if (model->B4SOIvtun0d < 0.0) /* v4.0 */ - { fprintf(fplog, "Warning: VTUN0D = %g is negative.\n", - model->B4SOIvtun0d); - printf("Warning: Vtun0d = %g is negative.\n", model->B4SOIvtun0d); - } - if (model->B4SOInbjt < 0.0) - { fprintf(fplog, "Warning: NBJT = %g is negative.\n", - model->B4SOInbjt); - printf("Warning: Nbjt = %g is negative.\n", model->B4SOInbjt); - } - if (model->B4SOIaely < 0.0) - { fprintf(fplog, "Warning: AELY = %g is negative.\n", - model->B4SOIaely); - printf("Warning: Aely = %g is negative.\n", model->B4SOIaely); - } - if (model->B4SOIahli < 0.0) - { fprintf(fplog, "Warning: AHLIS = %g is negative.\n", - model->B4SOIahli); - printf("Warning: Ahlis = %g is negative.\n", model->B4SOIahli); - } - if (model->B4SOIahlid < 0.0) - { fprintf(fplog, "Warning: AHLID = %g is negative.\n", - model->B4SOIahlid); - printf("Warning: Ahlid = %g is negative.\n", model->B4SOIahlid); - } - if (model->B4SOIrbody < 0.0) - { fprintf(fplog, "Warning: RBODY = %g is negative.\n", - model->B4SOIrbody); - printf("Warning: Rbody = %g is negative.\n", model->B4SOIrbody); - } - if (model->B4SOIrbsh < 0.0) - { fprintf(fplog, "Warning: RBSH = %g is negative.\n", - model->B4SOIrbsh); - printf("Warning: Rbsh = %g is negative.\n", model->B4SOIrbsh); - } - /* if (pParam->B4SOIntrecf < 0.0) - { fprintf(fplog, "Warning: NTRECF = %g is negative.\n", - pParam->B4SOIntrecf); - printf("Warning: Ntrecf = %g is negative.\n", pParam->B4SOIntrecf); - } - if (pParam->B4SOIntrecr < 0.0) - { fprintf(fplog, "Warning: NTRECR = %g is negative.\n", - pParam->B4SOIntrecr); - printf("Warning: Ntrecr = %g is negative.\n", pParam->B4SOIntrecr); - } v4.2 bugfix: QA Test uses negative temp co-efficients*/ - -/* v3.0 bug fix */ -/* - if (model->B4SOIndif < 0.0) - { fprintf(fplog, "Warning: NDIF = %g is negative.\n", - model->B4SOIndif); - printf("Warning: Ndif = %g is negative.\n", model->B4SOIndif); - } -*/ - -/* if (model->B4SOItcjswg < 0.0) - { fprintf(fplog, "Warning: TCJSWGS = %g is negative.\n", - model->B4SOItcjswg); - printf("Warning: Tcjswg = %g is negative.\n", model->B4SOItcjswg); - } - if (model->B4SOItpbswg < 0.0) - { fprintf(fplog, "Warning: TPBSWGS = %g is negative.\n", - model->B4SOItpbswg); - printf("Warning: Tpbswg = %g is negative.\n", model->B4SOItpbswg); - } - if (model->B4SOItcjswgd < 0.0) - { fprintf(fplog, "Warning: TCJSWGD = %g is negative.\n", - model->B4SOItcjswgd); - printf("Warning: Tcjswgd = %g is negative.\n", model->B4SOItcjswgd); - } - if (model->B4SOItpbswgd < 0.0) - { fprintf(fplog, "Warning: TPBSWGD = %g is negative.\n", - model->B4SOItpbswgd); - printf("Warning: Tpbswgd = %g is negative.\n", model->B4SOItpbswgd); - } v4.2 bugfix: QA Test uses negative temp co-efficients*/ - if ((model->B4SOIacde < 0.1) || (model->B4SOIacde > 1.6)) - { fprintf(fplog, "Warning: ACDE = %g is out of range.\n", - model->B4SOIacde); - printf("Warning: Acde = %g is out of range.\n", model->B4SOIacde); - } - if ((model->B4SOImoin < 5.0)||(model->B4SOImoin > 25.0)) - { fprintf(fplog, "Warning: MOIN = %g is out of range.\n", - model->B4SOImoin); - printf("Warning: Moin = %g is out of range.\n", model->B4SOImoin); - } - if (model->B4SOIdlbg < 0.0) - { fprintf(fplog, "Warning: DLBG = %g is negative.\n", - model->B4SOIdlbg); - printf("Warning: dlbg = %g is negative.\n", model->B4SOIdlbg); - } - if (model->B4SOIagidl < 0.0) - { fprintf(fplog, "Warning: AGIDL = %g is negative.\n", - model->B4SOIagidl); - printf("Warning: Agidl = %g is negative.\n", model->B4SOIagidl); - } - if (model->B4SOIbgidl < 0.0) - { fprintf(fplog, "Warning: BGIDL = %g is negative.\n", - model->B4SOIbgidl); - printf("Warning: Bgidl = %g is negative.\n", model->B4SOIbgidl); - } - if (fabs(model->B4SOIcgidl) < 1e-9) - { fprintf(fplog, "Warning: CGIDL = %g is smaller than 1e-9.\n", - model->B4SOIcgidl); - printf("Warning: Cgidl = %g is smaller than 1e-9.\n", - model->B4SOIcgidl); - } - if (model->B4SOIegidl < 0.0) - { fprintf(fplog, "Warning: EGIDL = %g is negative.\n", - model->B4SOIegidl); - printf("Warning: Egidl = %g is negative.\n", model->B4SOIegidl); - } - - if (model->B4SOIagisl < 0.0) - { fprintf(fplog, "Warning: AGISL = %g is negative.\n", - model->B4SOIagisl); - printf("Warning: Agidl = %g is negative.\n", model->B4SOIagidl); - } - if (model->B4SOIbgisl < 0.0) - { fprintf(fplog, "Warning: BGISL = %g is negative.\n", - model->B4SOIbgisl); - printf("Warning: Bgisl = %g is negative.\n", model->B4SOIbgisl); - } - if (fabs(model->B4SOIcgisl) < 1e-9) - { fprintf(fplog, "Warning: CGISL = %g is smaller than 1e-9.\n", - model->B4SOIcgisl); - printf("Warning: Cgisl = %g is smaller than 1e-9.\n", - model->B4SOIcgisl); - } - if (model->B4SOIegisl < 0.0) - { fprintf(fplog, "Warning: EGISL = %g is negative.\n", - model->B4SOIegisl); - printf("Warning: Egisl = %g is negative.\n", model->B4SOIegisl); - } - - if (model->B4SOIesatii < 0.0) - { fprintf(fplog, "Warning: Esatii = %g should be within positive.\n", - model->B4SOIesatii); - printf("Warning: Esatii = %g should be within (0, 1).\n", model->B4SOIesatii); - } - - if (!model->B4SOIvgstcvModGiven) - { fprintf(fplog, "Warning: The default vgstcvMod is changed in v4.2 from '0' to '1'.\n"); - printf("Warning: The default vgstcvMod is changed in v4.2 from '0' to '1'.\n"); - } - if (pParam->B4SOIxj > model->B4SOItsi) - { fprintf(fplog, "Warning: Xj = %g is thicker than Tsi = %g.\n", - pParam->B4SOIxj, model->B4SOItsi); - printf("Warning: Xj = %g is thicker than Tsi = %g.\n", - pParam->B4SOIxj, model->B4SOItsi); - } - - if (model->B4SOIcapMod < 2) - { fprintf(fplog, "Warning: capMod < 2 is not supported by BSIM3SOI.\n"); - printf("Warning: Warning: capMod < 2 is not supported by BSIM3SOI.\n"); - } - if (model->B4SOIcapMod > 3) - { fprintf(fplog, "Warning: capMod > 3 is not supported by BSIMSOI4.2.\n"); - printf("Warning: Warning: capMod > 3 is not supported by BSIMSOI4.2.\n"); - } - - }/* loop for the parameter check for warning messages */ - fclose(fplog); - } - else - { fprintf(stderr, "Warning: Can't open log file. Parameter checking skipped.\n"); - } - - return(Fatal_Flag); -} - diff --git a/src/spicelib/devices/bsimsoi/b4soicvtest.c b/src/spicelib/devices/bsimsoi/b4soicvtest.c deleted file mode 100644 index 0abfc9405..000000000 --- a/src/spicelib/devices/bsimsoi/b4soicvtest.c +++ /dev/null @@ -1,99 +0,0 @@ -/*** B4SOI 12/16/2010 Released by Tanvir Morshed ***/ - - -/********** - * Copyright 2010 Regents of the University of California. All rights reserved. - * Authors: 1998 Samuel Fung, Dennis Sinitsky and Stephen Tang - * Authors: 1999-2004 Pin Su, Hui Wan, Wei Jin, b3soicvtest.c - * Authors: 2005- Hui Wan, Xuemei Xi, Ali Niknejad, Chenming Hu. - * Authors: 2009- Wenwei Yang, Chung-Hsun Lin, Ali Niknejad, Chenming Hu. - * File: b4soicvtest.c - * Modified by Hui Wan, Xuemei Xi 11/30/2005 - * Modified by Wenwei Yang, Chung-Hsun Lin, Darsen Lu 03/06/2009 - * Modified by Tanvir Morshed 09/22/2009 - * Modified by Tanvir Morshed 12/31/2009 - **********/ - -#include "ngspice/ngspice.h" - -#include "ngspice/cktdefs.h" -#include "b4soidef.h" -#include "ngspice/trandefs.h" -#include "ngspice/const.h" -#include "ngspice/devdefs.h" -#include "ngspice/sperror.h" -#include "ngspice/suffix.h" - - -int -B4SOIconvTest( -GENmodel *inModel, -CKTcircuit *ckt) -{ -register B4SOImodel *model = (B4SOImodel*)inModel; -register B4SOIinstance *here; -double delvbd, delvbs, delvds, delvgd, delvgs, vbd, vbs, vds; -double cbd, cbhat, cbs, cd, cdhat, tol, vgd, vgdo, vgs; - - /* loop through all the B4SOI device models */ - for (; model != NULL; model = B4SOInextModel(model)) - { /* loop through all the instances of the model */ - for (here = B4SOIinstances(model); here != NULL ; - here=B4SOInextInstance(here)) - { - vbs = model->B4SOItype - * (*(ckt->CKTrhsOld+here->B4SOIbNode) - - *(ckt->CKTrhsOld+here->B4SOIsNodePrime)); - vgs = model->B4SOItype - * (*(ckt->CKTrhsOld+here->B4SOIgNode) - - *(ckt->CKTrhsOld+here->B4SOIsNodePrime)); - vds = model->B4SOItype - * (*(ckt->CKTrhsOld+here->B4SOIdNodePrime) - - *(ckt->CKTrhsOld+here->B4SOIsNodePrime)); - vbd = vbs - vds; - vgd = vgs - vds; - vgdo = *(ckt->CKTstate0 + here->B4SOIvgs) - - *(ckt->CKTstate0 + here->B4SOIvds); - delvbs = vbs - *(ckt->CKTstate0 + here->B4SOIvbs); - delvbd = vbd - *(ckt->CKTstate0 + here->B4SOIvbd); - delvgs = vgs - *(ckt->CKTstate0 + here->B4SOIvgs); - delvds = vds - *(ckt->CKTstate0 + here->B4SOIvds); - delvgd = vgd-vgdo; - - cd = here->B4SOIcd; - if (here->B4SOImode >= 0) - { cdhat = cd - here->B4SOIgjdb * delvbd - + here->B4SOIgmbs * delvbs + here->B4SOIgm * delvgs - + here->B4SOIgds * delvds; - } - else - { cdhat = cd - (here->B4SOIgjdb - here->B4SOIgmbs) * delvbd - - here->B4SOIgm * delvgd + here->B4SOIgds * delvds; - } - - /* - * check convergence - */ - if ((here->B4SOIoff == 0) || (!(ckt->CKTmode & MODEINITFIX))) - { tol = ckt->CKTreltol * MAX(fabs(cdhat), fabs(cd)) - + ckt->CKTabstol; - if (fabs(cdhat - cd) >= tol) - { ckt->CKTnoncon++; - return(OK); - } - cbs = here->B4SOIcjs; - cbd = here->B4SOIcjd; - cbhat = cbs + cbd + here->B4SOIgjdb * delvbd - + here->B4SOIgjsb * delvbs; - tol = ckt->CKTreltol * MAX(fabs(cbhat), fabs(cbs + cbd)) - + ckt->CKTabstol; - if (fabs(cbhat - (cbs + cbd)) > tol) - { ckt->CKTnoncon++; - return(OK); - } - } - } - } - return(OK); -} - diff --git a/src/spicelib/devices/bsimsoi/b4soidef.h b/src/spicelib/devices/bsimsoi/b4soidef.h deleted file mode 100644 index 96913736a..000000000 --- a/src/spicelib/devices/bsimsoi/b4soidef.h +++ /dev/null @@ -1,4300 +0,0 @@ -/********** -Copyright 2010 Regents of the University of California. All rights reserved. -Author: 1998 Samuel Fung -authors:1999-2004 Pin Su, Hui Wan b3soidef.h -Authors:2005- Hui Wan, Jane Xi -Authors: 2009- Wenwei Yang, Chung-Hsun Lin, Ali Niknejad, Chenming Hu -Authors: 2009- Tanvir Morshed, Ali Niknejad, Chenming Hu -Authors: 2010- Tanvir Morshed, Ali Niknejad, Chenming Hu -File: b4soidef.h -**********/ - -#ifndef B4SOI -#define B4SOI - -#define SOICODE - -/* Uncomment the following line to activate debugging variable output */ -/* debug1, debug2, debug3, ... */ -/* #define B4SOI_DEBUG_OUT */ - -#include "ngspice/ifsim.h" -#include "ngspice/gendefs.h" -#include "ngspice/cktdefs.h" -#include "ngspice/complex.h" -#include "ngspice/noisedef.h" - -typedef struct sB4SOIinstance -{ - - struct GENinstance gen; - -#define B4SOImodPtr(inst) ((struct sB4SOImodel *)((inst)->gen.GENmodPtr)) -#define B4SOInextInstance(inst) ((struct sB4SOIinstance *)((inst)->gen.GENnextInstance)) -#define B4SOIname gen.GENname -#define B4SOIstates gen.GENstate - - const int B4SOIdNode; - const int B4SOIgNodeExt; /* v3.1 changed gNode to gNodeExt */ - const int B4SOIsNode; - const int B4SOIeNode; - const int B4SOIpNodeExt; - const int B4SOIbNodeExt; - const int B4SOItempNodeExt; - int B4SOIpNode; - int B4SOIbNode; - int B4SOItempNode; - int B4SOIdNodePrime; - int B4SOIsNodePrime; - int B4SOIgNode; /* v3.1 */ - int B4SOIgNodeMid; /* v3.1 */ - int B4SOIdbNode; /* v4.0 */ - int B4SOIsbNode; /* v4.0 */ - - int B4SOIvbsNode; - /* for Debug */ - int B4SOIidsNode; - int B4SOIicNode; - int B4SOIibsNode; - int B4SOIibdNode; - int B4SOIiiiNode; - int B4SOIigNode; - int B4SOIgiggNode; - int B4SOIgigdNode; - int B4SOIgigbNode; - int B4SOIigidlNode; - int B4SOIitunNode; - int B4SOIibpNode; - int B4SOIcbbNode; - int B4SOIcbdNode; - int B4SOIcbgNode; - - int B4SOIqbfNode; - int B4SOIqjsNode; - int B4SOIqjdNode; - - double B4SOIphi; - double B4SOIvtm; - double B4SOIni; - double B4SOIueff; - double B4SOIthetavth; - double B4SOIvon; - double B4SOIvdsat; - double B4SOIcgdo; - double B4SOIcgso; - double B4SOIcgeo; - - double B4SOIids; - double B4SOIic; - double B4SOIibs; - double B4SOIibd; - double B4SOIiii; - double B4SOIig; - double B4SOIgigg; - double B4SOIgigd; - double B4SOIgigb; - double B4SOIgige; /* v3.0 */ -/* v3.1 added for RF */ - double B4SOIgcrg; - double B4SOIgcrgd; - double B4SOIgcrgg; - double B4SOIgcrgs; - double B4SOIgcrgb; -/* v3.1 added for end */ - - double B4SOIInv_ODeff; /* v4.0 */ - double B4SOIkvsat; /* v4.0 */ - double B4SOIgrbsb; /* v4.0 */ - double B4SOIgrbdb; /* v4.0 */ - double B4SOIrbsb; /* v4.0 */ - double B4SOIrbdb; /* v4.0 */ - double B4SOIGGjdb; /* v4.0 */ - double B4SOIGGjsb; /* v4.0 */ - double B4SOIgbgiigbpb; /* v4.0 */ - double B4SOIgiigidlb; /* v4.0 */ - double B4SOIgiigidld; /* v4.0 */ - double B4SOIdelvto; /* v4.0 */ - double B4SOIgstot; /* v4.0 for rdsmod */ - double B4SOIgstotd; /* v4.0 for rdsmod */ - double B4SOIgstotg; /* v4.0 for rdsmod */ - double B4SOIgstots; /* v4.0 for rdsmod */ - double B4SOIgstotb; /* v4.0 for rdsmod */ - - double B4SOIgdtot; /* v4.0 for rdsmod */ - double B4SOIgdtotd; /* v4.0 for rdsmod */ - double B4SOIgdtotg; /* v4.0 for rdsmod */ - double B4SOIgdtots; /* v4.0 for rdsmod */ - double B4SOIgdtotb; /* v4.0 for rdsmod */ - - double B4SOIigp; /* v4.1 for Igb in the AGBCP2 region */ - double B4SOIgigpg; /* v4.1 for Igb in the AGBCP2 region */ - double B4SOIgigpp; /* v4.1 for Igb in the AGBCP2 region */ - double B4SOITempSH; /* v4.2 for portability of SH temp */ - - double B4SOIigidl; - double B4SOIigisl; - double B4SOIitun; - double B4SOIibp; - /* double B4SOIabeff; */ /* v4.2 never used in the code */ - double B4SOIvbseff; - double B4SOIcbg; - double B4SOIcbb; - double B4SOIcbd; - double B4SOIqb; - double B4SOIqbf; - double B4SOIqjs; - double B4SOIqjd; - int B4SOIfloat; - -/* v3.1 for RF */ - double B4SOIgrgeltd; -/* v3.1 for RF end */ - - double B4SOIl; - double B4SOIw; - double B4SOIm; - double B4SOIdrainArea; - double B4SOIsourceArea; - double B4SOIdrainSquares; - double B4SOIsourceSquares; - double B4SOIdrainPerimeter; - double B4SOIsourcePerimeter; - double B4SOIsourceConductance; - double B4SOIdrainConductance; - -/* v4.0 stress effect instance param */ - double B4SOIsa; - double B4SOIsb; - double B4SOIsd; - double B4SOIu0temp; - double B4SOIvsattemp; - double B4SOIvth0; - double B4SOIvfb; - double B4SOIvfbzb; - double B4SOIk2; - double B4SOIk2ox; - double B4SOIeta0; -/* end of v4.0 stress effect instance param */ - /*4.1 mobmod=4*/ - double B4SOIvtfbphi1; - double B4SOIvgsteffvth; - - - - - - double B4SOIicVBS; - double B4SOIicVDS; - double B4SOIicVGS; - double B4SOIicVES; - double B4SOIicVPS; - - int B4SOIbjtoff; - int B4SOIbodyMod; - int B4SOIdebugMod; - double B4SOIrth0; - double B4SOIcth0; - double B4SOIbodySquares; - double B4SOIrbodyext; - double B4SOIfrbody; - -/* v2.0 release */ - double B4SOInbc; - double B4SOInseg; - double B4SOIpdbcp; - double B4SOIpsbcp; - double B4SOIagbcp; - double B4SOIagbcp2; /* v4.1 improvement on BC */ - double B4SOIagbcpd; /* v4.0 */ - double B4SOIaebcp; - double B4SOIvbsusr; - int B4SOItnodeout; - -/* Deleted from pParam and moved to here */ - double B4SOIcsesw; - double B4SOIcdesw; - double B4SOIcsbox; - double B4SOIcdbox; - double B4SOIcsmin; - double B4SOIcdmin; - double B4SOIst4; - double B4SOIdt4; - - int B4SOIoff; - int B4SOImode; - -/* v4.0 added */ - double B4SOInf; -/* v4.0 added end */ - -/* v3.2 added */ - double B4SOInstar; - double B4SOIAbulk; -/* v3.2 added end */ - int B4SOIsoiMod; /* v3.2 */ - -/* v3.1 for RF */ - int B4SOIrgateMod; -/* v3.1 for RF end */ -/* v4.0 */ - int B4SOIrbodyMod; -/* v4.0 end */ - - /* OP point */ - double B4SOIqinv; - double B4SOIcd; - double B4SOIcjs; - double B4SOIcjd; - double B4SOIcbody; - double B4SOIcbs; - double B4SOIIgb; - - -/* v2.2 release */ - double B4SOIcgate; - double B4SOIgigs; - double B4SOIgigT; - - double B4SOIcbodcon; - double B4SOIcth; - /* double B4SOIcsubstrate; */ /* v4.2 never used in the code */ - - double B4SOIgm; - double B4SOIgme; /* v3.0 */ - double B4SOIcb; - double B4SOIcdrain; - double B4SOIgds; - double B4SOIgmbs; - double B4SOIgmT; - -#ifdef B4SOI_DEBUG_OUT - double B4SOIdebug1; - double B4SOIdebug2; - double B4SOIdebug3; -#endif - - double B4SOIgbbs; - double B4SOIgbgs; - double B4SOIgbds; - double B4SOIgbes; /* v3.0 */ - double B4SOIgbps; - double B4SOIgbT; - -/* v3.0 */ - double B4SOIIgcs; - double B4SOIgIgcsg; - double B4SOIgIgcsd; - double B4SOIgIgcss; - double B4SOIgIgcsb; - double B4SOIgIgcse; - double B4SOIIgcd; - double B4SOIgIgcdg; - double B4SOIgIgcdd; - double B4SOIgIgcds; - double B4SOIgIgcdb; - double B4SOIgIgcde; - - double B4SOIIgs; - double B4SOIgIgsg; - double B4SOIgIgss; - double B4SOIIgd; - double B4SOIgIgdg; - double B4SOIgIgdd; - - - double B4SOIgjsd; - double B4SOIgjsb; - double B4SOIgjsg; - double B4SOIgjsT; - - double B4SOIgjdb; - double B4SOIgjdd; - double B4SOIgjdg; - double B4SOIgjde; /* v3.0 */ - double B4SOIgjdT; - - double B4SOIgbpbs; - double B4SOIgbpps; - double B4SOIgbpT; - - double B4SOIgtempb; - double B4SOIgtempg; - double B4SOIgtempd; - double B4SOIgtempe; /* v3.0 */ - double B4SOIgtempT; - - double B4SOIqgate; - double B4SOIqdrn; - double B4SOIqsrc; - double B4SOIqbulk; - double B4SOIcapbd; - double B4SOIcapbs; - - - double B4SOIcggb; - double B4SOIcgdb; - double B4SOIcgsb; - double B4SOIcgeb; - double B4SOIcgT; - - double B4SOIcbgb; - double B4SOIcbdb; - double B4SOIcbsb; - double B4SOIcbeb; - double B4SOIcbT; - - double B4SOIcdgb; - double B4SOIcddb; - double B4SOIcdsb; - double B4SOIcdeb; - double B4SOIcdT; - - double B4SOIceeb; - double B4SOIceT; - - double B4SOIqse; - double B4SOIgcse; - double B4SOIqde; - double B4SOIgcde; - double B4SOIrds; /* v2.2.3 */ - double B4SOIVgsteff; /* v2.2.3 */ - double B4SOIVdseff; /* v2.2.3 */ - double B4SOIAbovVgst2Vtm; /* v2.2.3 */ - -/* 4.0 */ - double B4SOIidovVds; - double B4SOIcjsb; - double B4SOIcjdb; - -/* 4.0 end */ - - struct b4soiSizeDependParam *pParam; - - unsigned B4SOIlGiven :1; - unsigned B4SOIwGiven :1; - - unsigned B4SOImGiven :1; - unsigned B4SOIdrainAreaGiven :1; - unsigned B4SOIsourceAreaGiven :1; - unsigned B4SOIdrainSquaresGiven :1; - unsigned B4SOIsourceSquaresGiven :1; - unsigned B4SOIdrainPerimeterGiven :1; - unsigned B4SOIsourcePerimeterGiven :1; - unsigned B4SOIdNodePrimeSet :1; - unsigned B4SOIsNodePrimeSet :1; - unsigned B4SOIsaGiven :1; /* v4.0 for stress */ - unsigned B4SOIsbGiven :1; /* v4.0 for stress */ - unsigned B4SOIsdGiven :1; /* v4.0 for stress */ - unsigned B4SOIrbdbGiven :1; /* v4.0 for rbody network */ - unsigned B4SOIrbsbGiven :1; /* v4.0 for rbody network */ - - unsigned B4SOIicVBSGiven :1; - unsigned B4SOIicVDSGiven :1; - unsigned B4SOIicVGSGiven :1; - unsigned B4SOIicVESGiven :1; - unsigned B4SOIicVPSGiven :1; - unsigned B4SOIbjtoffGiven :1; - unsigned B4SOIdebugModGiven :1; - unsigned B4SOIrth0Given :1; - unsigned B4SOIcth0Given :1; - unsigned B4SOIbodySquaresGiven :1; - unsigned B4SOIfrbodyGiven: 1; - -/* v2.0 release */ - unsigned B4SOInbcGiven :1; - unsigned B4SOInsegGiven :1; - unsigned B4SOIpdbcpGiven :1; - unsigned B4SOIpsbcpGiven :1; - unsigned B4SOIagbcpGiven :1; - unsigned B4SOIagbcp2Given :1; /* v4.1 improvement on BC */ - unsigned B4SOIagbcpdGiven :1; /* v4.0 */ - unsigned B4SOIaebcpGiven :1; - unsigned B4SOIvbsusrGiven :1; - unsigned B4SOItnodeoutGiven :1; - unsigned B4SOIoffGiven :1; - - unsigned B4SOIrgateModGiven :1; /* v3.1 */ - unsigned B4SOIsoiModGiven :1; /* v3.2 */ - -/* v4.0 added */ - unsigned B4SOInfGiven :1; - unsigned B4SOIrbodyModGiven :1; - unsigned B4SOIdelvtoGiven :1; -/* v4.0 added end */ - -/* v4.0 */ - double *B4SOIDBdpPtr; - double *B4SOIDBdbPtr; - double *B4SOIDBbPtr; - double *B4SOIDPdbPtr; - - double *B4SOISBspPtr; - double *B4SOISBbPtr; - double *B4SOISBsbPtr; - double *B4SOISPsbPtr; - - double *B4SOIBsbPtr; - double *B4SOIBdbPtr; - - double *B4SOIDgPtr; /* v4.0 for rdsMod =1 */ - double *B4SOIDspPtr; /* v4.0 for rdsMod =1 */ - double *B4SOIDbPtr; /* v4.0 for rdsMod =1 */ - double *B4SOISdpPtr; /* v4.0 for rdsMod =1 */ - double *B4SOISgPtr; /* v4.0 for rdsMod =1 */ - double *B4SOISbPtr; /* v4.0 for rdsMod =1 */ -/* v4.0 end */ - - double *B4SOIPgPtr; /* v4.1 for Ig_agbcp2 */ - double *B4SOIGpPtr; /* v4.1 for Ig_agbcp2 */ - -/* v3.1 added for RF */ - double *B4SOIGgmPtr; - double *B4SOIGgePtr; - - double *B4SOIGMdpPtr; - double *B4SOIGMgPtr; - double *B4SOIGMspPtr; - double *B4SOIGMgmPtr; - double *B4SOIGMgePtr; - double *B4SOIGMePtr; - double *B4SOIGMbPtr; - - double *B4SOISPgmPtr; - double *B4SOIDPgmPtr; - double *B4SOIEgmPtr; - - double *B4SOIGEdpPtr; - double *B4SOIGEgPtr; - double *B4SOIGEgmPtr; - double *B4SOIGEgePtr; - double *B4SOIGEspPtr; - double *B4SOIGEbPtr; -/* v3.1 added for RF end */ - - double *B4SOIGePtr; - double *B4SOIDPePtr; - double *B4SOISPePtr; - - double *B4SOIEePtr; - double *B4SOIEbPtr; - double *B4SOIBePtr; - double *B4SOIEgPtr; - double *B4SOIEdpPtr; - double *B4SOIEspPtr; - double *B4SOITemptempPtr; - double *B4SOITempdpPtr; - double *B4SOITempspPtr; - double *B4SOITempgPtr; - double *B4SOITempbPtr; - double *B4SOITempePtr; /* v3.0 */ - double *B4SOIGtempPtr; - double *B4SOIDPtempPtr; - double *B4SOISPtempPtr; - double *B4SOIEtempPtr; - double *B4SOIBtempPtr; - double *B4SOIPtempPtr; - double *B4SOIBpPtr; - double *B4SOIPbPtr; - double *B4SOIPpPtr; - double *B4SOIDdPtr; - double *B4SOIGgPtr; - double *B4SOISsPtr; - double *B4SOIBbPtr; - double *B4SOIDPdpPtr; - double *B4SOISPspPtr; - double *B4SOIDdpPtr; - double *B4SOIGbPtr; - double *B4SOIGdpPtr; - double *B4SOIGspPtr; - double *B4SOISspPtr; - double *B4SOIBdpPtr; - double *B4SOIBspPtr; - double *B4SOIDPspPtr; - double *B4SOIDPdPtr; - double *B4SOIBgPtr; - double *B4SOIDPgPtr; - double *B4SOISPgPtr; - double *B4SOISPsPtr; - double *B4SOIDPbPtr; - double *B4SOISPbPtr; - double *B4SOISPdpPtr; - - double *B4SOIVbsPtr; - /* Debug */ - double *B4SOIIdsPtr; - double *B4SOIIcPtr; - double *B4SOIIbsPtr; - double *B4SOIIbdPtr; - double *B4SOIIiiPtr; - double *B4SOIIgPtr; - double *B4SOIGiggPtr; - double *B4SOIGigdPtr; - double *B4SOIGigbPtr; - double *B4SOIIgidlPtr; - double *B4SOIItunPtr; - double *B4SOIIbpPtr; - double *B4SOICbbPtr; - double *B4SOICbdPtr; - double *B4SOICbgPtr; - double *B4SOIqbPtr; - double *B4SOIQbfPtr; - double *B4SOIQjsPtr; - double *B4SOIQjdPtr; - -#ifdef USE_OMP - /* per instance storage of results, to update matrix at a later stge */ - int B4SOINode_sh; - double B4SOINode_1; - double B4SOINode_2; - double B4SOINode_3; - double B4SOINode_4; - double B4SOINode_5; - double B4SOINode_6; - double B4SOINode_7; - double B4SOINode_8; - double B4SOINode_9; - double B4SOINode_10; - double B4SOINode_11; - double B4SOINode_12; - double B4SOINode_13; - double B4SOINode_14; - double B4SOINode_15; - - double B4SOI_1; - double B4SOI_2; - double B4SOI_3; - double B4SOI_4; - double B4SOI_5; - double B4SOI_6; - double B4SOI_7; - double B4SOI_8; - double B4SOI_9; - double B4SOI_10; - double B4SOI_11; - double B4SOI_12; - double B4SOI_13; - double B4SOI_14; - double B4SOI_15; - double B4SOI_16; - double B4SOI_17; - double B4SOI_18; - double B4SOI_19; - double B4SOI_20; - double B4SOI_21; - double B4SOI_22; - double B4SOI_23; - double B4SOI_24; - double B4SOI_25; - double B4SOI_26; - double B4SOI_27; - double B4SOI_28; - double B4SOI_29; - double B4SOI_30; - double B4SOI_31; - double B4SOI_32; - double B4SOI_33; - double B4SOI_34; - double B4SOI_35; - double B4SOI_36; - double B4SOI_37; - double B4SOI_38; - double B4SOI_39; - double B4SOI_40; - double B4SOI_41; - double B4SOI_42; - double B4SOI_43; - double B4SOI_44; - double B4SOI_45; - double B4SOI_46; - double B4SOI_47; - double B4SOI_48; - double B4SOI_49; - double B4SOI_50; - double B4SOI_51; - double B4SOI_52; - double B4SOI_53; - double B4SOI_54; - double B4SOI_55; - double B4SOI_56; - double B4SOI_57; - double B4SOI_58; - double B4SOI_59; - double B4SOI_60; - double B4SOI_61; - double B4SOI_62; - double B4SOI_63; - double B4SOI_64; - double B4SOI_65; - double B4SOI_66; - double B4SOI_67; - double B4SOI_68; - double B4SOI_69; - double B4SOI_70; - double B4SOI_71; - double B4SOI_72; - double B4SOI_73; - double B4SOI_74; - double B4SOI_75; - double B4SOI_76; - double B4SOI_77; - double B4SOI_78; - double B4SOI_79; - double B4SOI_80; - double B4SOI_81; - double B4SOI_82; - double B4SOI_83; - double B4SOI_84; - double B4SOI_85; - double B4SOI_86; - double B4SOI_87; - double B4SOI_88; - double B4SOI_89; - double B4SOI_90; - double B4SOI_91; - double B4SOI_92; - double B4SOI_93; - double B4SOI_94; - double B4SOI_95; - double B4SOI_96; - double B4SOI_97; - double B4SOI_98; - double B4SOI_99; - double B4SOI_100; - double B4SOI_101; - double B4SOI_102; -#endif - -#define B4SOIvbd B4SOIstates+ 0 -#define B4SOIvbs B4SOIstates+ 1 -#define B4SOIvgs B4SOIstates+ 2 -#define B4SOIvds B4SOIstates+ 3 -#define B4SOIves B4SOIstates+ 4 -#define B4SOIvps B4SOIstates+ 5 - -#define B4SOIvg B4SOIstates+ 6 -#define B4SOIvd B4SOIstates+ 7 -#define B4SOIvs B4SOIstates+ 8 -#define B4SOIvp B4SOIstates+ 9 -#define B4SOIve B4SOIstates+ 10 -#define B4SOIdeltemp B4SOIstates+ 11 - -#define B4SOIqb B4SOIstates+ 12 -#define B4SOIcqb B4SOIstates+ 13 -#define B4SOIqg B4SOIstates+ 14 -#define B4SOIcqg B4SOIstates+ 15 -#define B4SOIqd B4SOIstates+ 16 -#define B4SOIcqd B4SOIstates+ 17 -#define B4SOIqe B4SOIstates+ 18 -#define B4SOIcqe B4SOIstates+ 19 - -#define B4SOIqbs B4SOIstates+ 20 -#define B4SOIcqbs B4SOIstates+ 21 /* v4.0 */ -#define B4SOIqbd B4SOIstates+ 22 -#define B4SOIcqbd B4SOIstates+ 23 /* v4.0 */ -#define B4SOIqbe B4SOIstates+ 24 - -#define B4SOIqth B4SOIstates+ 25 -#define B4SOIcqth B4SOIstates+ 26 - -/* v3.1 added or changed for RF */ -#define B4SOIvges B4SOIstates+ 27 -#define B4SOIvgms B4SOIstates+ 28 -#define B4SOIvgge B4SOIstates+ 29 -#define B4SOIvggm B4SOIstates+ 30 -/* #define B4SOIcqgmid B4SOIstates+ 31 */ /* Bug # 29 */ -/* #define B4SOIqgmid B4SOIstates + 32 */ /* Bug # 29 */ -#define B4SOIqgmid B4SOIstates+ 31 /* Bug Fix # 29 Jul09*/ -#define B4SOIcqgmid B4SOIstates + 32 /* Bug Fix # 29 Jul09*/ -/* v3.1 added or changed for RF end */ - -/* v4.0 */ -#define B4SOIvdbs B4SOIstates + 33 -#define B4SOIvdbd B4SOIstates + 34 -#define B4SOIvsbs B4SOIstates + 35 -#define B4SOIvses B4SOIstates + 36 -#define B4SOIvdes B4SOIstates + 37 -/* v4.0 end */ - -#define B4SOInumStates 38 - -/* indices to the array of B4SOI NOISE SOURCES */ - -#define B4SOIRDNOIZ 0 -#define B4SOIRSNOIZ 1 -#define B4SOIRGNOIZ 2 -#define B4SOIIDNOIZ 3 -#define B4SOIFLNOIZ 4 -#define B4SOIFB_IBSNOIZ 5 /* v4.0 */ -#define B4SOIFB_IBDNOIZ 6 /* v4.0 */ -#define B4SOIIGSNOIZ 7 -#define B4SOIIGDNOIZ 8 -#define B4SOIIGBNOIZ 9 -#define B4SOIRBSBNOIZ 10 /* v4.0 */ -#define B4SOIRBDBNOIZ 11 /* v4.0 */ -#define B4SOIRBODYNOIZ 12 /* v4.0 */ -#define B4SOITOTNOIZ 13 /* v4.0 */ - -#define B4SOINSRCS 14 /* Number of MOSFET(3) noise sources v3.2 */ - -#ifndef NONOISE - double B4SOInVar[NSTATVARS][B4SOINSRCS]; -#else /* NONOISE */ - double **B4SOInVar; -#endif /* NONOISE */ - -} B4SOIinstance ; - -struct b4soiSizeDependParam -{ - double Width; - double Length; - double Rth0; - double Cth0; - - double B4SOIcdsc; - double B4SOIcdscb; - double B4SOIcdscd; - double B4SOIcit; - double B4SOInfactor; - double B4SOIvsat; - double B4SOIat; - double B4SOIa0; - double B4SOIags; - double B4SOIa1; - double B4SOIa2; - double B4SOIketa; - double B4SOInpeak; - double B4SOInsub; - double B4SOIngate; - double B4SOInsd; - double B4SOIgamma1; - double B4SOIgamma2; - double B4SOIvbx; - double B4SOIvbi; - double B4SOIvbm; - double B4SOIvbsc; - double B4SOIxt; - double B4SOIphi; - double B4SOIlitl; - double B4SOIk1; - double B4SOIkt1; - double B4SOIkt1l; - double B4SOIkt2; - double B4SOIk2; - double B4SOIk3; - double B4SOIk3b; - double B4SOIw0; - double B4SOIlpe0; - double B4SOIdvt0; - double B4SOIdvt1; - double B4SOIdvt2; - double B4SOIdvt0w; - double B4SOIdvt1w; - double B4SOIdvt2w; - double B4SOIdrout; - double B4SOIdsub; - double B4SOIvth0; - double B4SOIua; - double B4SOIua1; - double B4SOIub; - double B4SOIub1; - double B4SOIuc; - double B4SOIuc1; - double B4SOIu0; - double B4SOIute; - /*4.1 high k mobility*/ - double B4SOIud; - double B4SOIud1; - double B4SOIeu; - double B4SOIucs; - double B4SOIucste; - - - - double B4SOIvoff; - double B4SOIvfb; - double B4SOIuatemp; - double B4SOIubtemp; - double B4SOIuctemp; - double B4SOIrbody; - double B4SOIrth; - double B4SOIcth; - double B4SOIrds0denom; - double B4SOIvfbb; - double B4SOIjbjts; /* v4.0 */ - double B4SOIjbjtd; /* v4.0 */ - double B4SOIjdifs; /* v4.0 */ - double B4SOIjdifd; /* v4.0 */ - double B4SOIjrecs; /* v4.0 */ - double B4SOIjrecd; /* v4.0 */ - double B4SOIjtuns; /* v4.0 */ - double B4SOIjtund; /* v4.0 */ - double B4SOIrdw; /* v4.0 for rdsMod = 1 */ - double B4SOIrsw; /* v4.0 for rdsMod = 1 */ - double B4SOIrdwmin; /* v4.0 for rdsMod = 1 */ - double B4SOIrswmin; /* v4.0 for rdsMod = 1 */ - double B4SOIrd0; /* v4.0 for rdsMod = 1 */ - double B4SOIrs0; /* v4.0 for rdsMod = 1 */ - double B4SOIsdt1; - double B4SOIst2; - double B4SOIst3; - double B4SOIdt2; - double B4SOIdt3; - double B4SOIdelta; - double B4SOIrdsw; - double B4SOIrds0; - double B4SOIprwg; - double B4SOIprwb; - double B4SOIprt; - double B4SOIeta0; - double B4SOIetab; - double B4SOIpclm; - double B4SOIpdibl1; - double B4SOIpdibl2; - double B4SOIpdiblb; - double B4SOIpvag; - double B4SOIwr; - double B4SOIdwg; - double B4SOIdwb; - double B4SOIb0; - double B4SOIb1; - double B4SOIalpha0; - double B4SOIbeta0; - -/* v3.0 */ - double B4SOIaigc; - double B4SOIbigc; - double B4SOIcigc; - double B4SOIaigsd; - double B4SOIbigsd; - double B4SOIcigsd; - double B4SOInigc; - double B4SOIpigcd; - double B4SOIpoxedge; - double B4SOIdlcig; - -/* v3.1 added for RF */ - double B4SOIxrcrg1; - double B4SOIxrcrg2; -/* v3.1 added for RF end */ - -/* v4.0 */ - /* added for stress effect */ - double B4SOIku0; - double B4SOIkvth0; - double B4SOIku0temp; - double B4SOIrho_ref; - double B4SOIinv_od_ref; - /* added for stress effect end */ - double NFinger; -/* v4.0 end */ - - - /* CV model */ - double B4SOIcgsl; - double B4SOIcgdl; - double B4SOIckappa; - double B4SOIcf; - double B4SOIclc; - double B4SOIcle; - - -/* Added for binning - START0 */ -/* v3.1 */ - double B4SOIxj; - double B4SOIalphaGB1; - double B4SOIbetaGB1; - double B4SOIalphaGB2; - double B4SOIbetaGB2; - double B4SOIaigbcp2; /* 4.1 */ - double B4SOIbigbcp2; /* 4.1 */ - double B4SOIcigbcp2; /* 4.1 */ - double B4SOIndif; - double B4SOIntrecf; - double B4SOIntrecr; - double B4SOIxbjt; - double B4SOIxdif; - double B4SOIxrec; - double B4SOIxtun; - double B4SOIxdifd; - double B4SOIxrecd; - double B4SOIxtund; - - double B4SOIkb1; - double B4SOIk1w1; - double B4SOIk1w2; - double B4SOIketas; - double B4SOIfbjtii; - /*4.1 Iii model*/ - double B4SOIebjtii; - double B4SOIcbjtii; - double B4SOIvbci; - double B4SOIabjtii; - double B4SOImbjtii; - - double B4SOIbeta1; - double B4SOIbeta2; - double B4SOIvdsatii0; - double B4SOIlii; - double B4SOIesatii; - double B4SOIsii0; - double B4SOIsii1; - double B4SOIsii2; - double B4SOIsiid; - double B4SOIagidl; - double B4SOIbgidl; - double B4SOIcgidl; /* v4.0 */ - double B4SOIegidl; - double B4SOIrgidl; - double B4SOIkgidl; - double B4SOIfgidl; - double B4SOIagisl; - double B4SOIbgisl; - double B4SOIcgisl; /* v4.0 */ - double B4SOIegisl; - double B4SOIrgisl; - double B4SOIkgisl; - double B4SOIfgisl; - - - double B4SOIntun; /* v4.0 */ - double B4SOIntund; /* v4.0 */ - double B4SOIndiode; /* v4.0 */ - double B4SOIndioded; /* v4.0 */ - double B4SOInrecf0; /* v4.0 */ - double B4SOInrecf0d; /* v4.0 */ - double B4SOInrecr0; /* v4.0 */ - double B4SOInrecr0d; /* v4.0 */ - double B4SOIisbjt; - double B4SOIidbjt; /* v4.0 */ - double B4SOIisdif; - double B4SOIiddif; /* v4.0 */ - double B4SOIisrec; - double B4SOIidrec; /* v4.0 */ - double B4SOIistun; - double B4SOIidtun; /* v4.0 */ - double B4SOIvrec0; /* v4.0 */ - double B4SOIvrec0d; /* v4.0 */ - double B4SOIvtun0; /* v4.0 */ - double B4SOIvtun0d; /* v4.0 */ - double B4SOInbjt; - double B4SOIlbjt0; - double B4SOIvabjt; - double B4SOIaely; - double B4SOIvsdfb; - double B4SOIvsdth; - double B4SOIdelvt; -/* Added by binning - END0 */ - -/* Pre-calculated constants */ - - double B4SOIdw; - double B4SOIdl; - double B4SOIleff; - double B4SOIweff; - - double B4SOIdwc; - double B4SOIdlc; - double B4SOIleffCV; - double B4SOIweffCV; - - double B4SOIabulkCVfactor; - double B4SOIcgso; - double B4SOIcgdo; - double B4SOIcgeo; - - double B4SOIu0temp; - double B4SOIvsattemp; - double B4SOIsqrtPhi; - double B4SOIphis3; - double B4SOIXdep0; - double B4SOIsqrtXdep0; - double B4SOItheta0vb0; - double B4SOIthetaRout; - - -/* v3.2 */ - double B4SOIqsi; - -/* v2.2 release */ - double B4SOIoxideRatio; - - -/* v2.0 release */ - double B4SOIk1eff; - double B4SOIwdios; - double B4SOIwdiod; - double B4SOIwdiodCV; - double B4SOIwdiosCV; - double B4SOIarfabjt; - double B4SOIlratio; - double B4SOIlratiodif; - double B4SOIvearly; - double B4SOIahli; /* v4.0 */ - double B4SOIahlid; /* v4.0 */ - double B4SOIahli0s; /* v4.0 */ - double B4SOIahli0d; /* v4.0 */ - double B4SOIvfbzb; - double B4SOIldeb; - double B4SOIacde; - double B4SOImoin; - double B4SOInoff; /* v3.2 */ - double B4SOIleffCVb; - double B4SOIleffCVbg; - - /* double B4SOIcof1; - double B4SOIcof2; - double B4SOIcof3; - double B4SOIcof4; */ /* v4.2 nover used in the code */ - double B4SOIcdep0; -/* v3.0 */ - double B4SOIToxRatio; - double B4SOIAechvb; - double B4SOIBechvb; - double B4SOIToxRatioEdge; - double B4SOIAechvbEdges; /* LFW */ - double B4SOIAechvbEdged; /* LFW */ - double B4SOIBechvbEdge; - double B4SOIvfbsd; -/* v4.0 */ - double B4SOIk1ox; /* v4.0 for Vth */ - double B4SOIk2ox; /* v4.0 for Vth */ - double B4SOIlpeb; /* v4.0 for Vth */ - double B4SOIdvtp0; /* v4.0 for Vth */ - double B4SOIdvtp1; /* v4.0 for Vth */ - double B4SOIdvtp2; /* v4.1 for Vth */ - double B4SOIdvtp3; /* v4.1 for Vth */ - double B4SOIdvtp4; /* v4.1 for Vth */ - double B4SOIminv; /* v4.0 for Vgsteff */ - double B4SOImstar; /* v4.0 for Vgsteff */ - double B4SOIfprout; /* v4.0 for DITS in Id */ - double B4SOIpdits; /* v4.0 for DITS in Id */ - double B4SOIpditsd; /* v4.0 for DITS in Id */ - - /*4.1*/ - double B4SOImstarcv; - double B4SOIminvcv; - double B4SOIvoffcv; - double B4SOIdvtp2factor; - - struct b4soiSizeDependParam *pNext; -}; - - -typedef struct sB4SOImodel -{ - - struct GENmodel gen; - -#define B4SOImodType gen.GENmodType -#define B4SOInextModel(inst) ((struct sB4SOImodel *)((inst)->gen.GENnextModel)) -#define B4SOIinstances(inst) ((B4SOIinstance *)((inst)->gen.GENinstances)) -#define B4SOImodName gen.GENmodName - - int B4SOItype; - - int B4SOImobMod; - int B4SOIcapMod; - int B4SOIfnoiMod; /* v3.2 */ - int B4SOItnoiMod; /* v3.2 */ - int B4SOIshMod; - int B4SOIbinUnit; - int B4SOIparamChk; - int B4SOImtrlMod; /*4.1*/ - int B4SOIvgstcvMod; - int B4SOIgidlMod; - int B4SOIiiiMod; - - double B4SOIversion; - - double B4SOIeot; /*4.1*/ - double B4SOIepsrox; - double B4SOIepsrsub; - double B4SOItoxp; - double B4SOIleffeot; - double B4SOIweffeot; - double B4SOIvddeot; - double B4SOItempeot; - double B4SOIados; - double B4SOIbdos; - double B4SOIepsrgate; - double B4SOIni0sub; - double B4SOIbg0sub; - double B4SOItbgasub; - double B4SOItbgbsub; - double B4SOIphig; - double B4SOIeasub; - double B4SOItvbci; - - double B4SOItox; - double B4SOItoxm; /* v3.2 */ - double B4SOIdtoxcv; /* v2.2.3 */ - double B4SOIcdsc; - double B4SOIcdscb; - double B4SOIcdscd; - double B4SOIcit; - double B4SOInfactor; - double B4SOIvsat; - double B4SOIat; - double B4SOIa0; - double B4SOIags; - double B4SOIa1; - double B4SOIa2; - double B4SOIketa; - double B4SOInsub; - double B4SOInpeak; - double B4SOIngate; - double B4SOInsd; - double B4SOIlnsd; - double B4SOIwnsd; - double B4SOIpnsd; - double B4SOIgamma1; - double B4SOIgamma2; - double B4SOIvbx; - double B4SOIvbm; - double B4SOIxt; - double B4SOIk1; - double B4SOIkt1; - double B4SOIkt1l; - double B4SOIkt2; - double B4SOIk2; - double B4SOIk3; - double B4SOIk3b; - double B4SOIw0; - double B4SOIlpe0; - double B4SOIdvt0; - double B4SOIdvt1; - double B4SOIdvt2; - double B4SOIdvt0w; - double B4SOIdvt1w; - double B4SOIdvt2w; - double B4SOIdrout; - double B4SOIdsub; - double B4SOIvth0; - double B4SOIua; - double B4SOIua1; - double B4SOIub; - double B4SOIub1; - double B4SOIuc; - double B4SOIuc1; - double B4SOIu0; - double B4SOIute; - /*4.1 high k mobility*/ - double B4SOIud; - double B4SOIlud; - double B4SOIwud; - double B4SOIpud; - - double B4SOIud1; - double B4SOIlud1; - double B4SOIwud1; - double B4SOIpud1; - - double B4SOIeu; - double B4SOIleu; - double B4SOIweu; - double B4SOIpeu; - - double B4SOIucs; - double B4SOIlucs; - double B4SOIwucs; - double B4SOIpucs; - - double B4SOIucste; - double B4SOIlucste; - double B4SOIwucste; - double B4SOIpucste; - - double B4SOIvoff; - double B4SOIdelta; - double B4SOIrdsw; - double B4SOIrdw; /* v4.0 for rdsMod = 1 */ - double B4SOIrsw; /* v4.0 for rdsMod = 1 */ - double B4SOIrdwmin; /* v4.0 for rdsMod = 1 */ - double B4SOIrswmin; /* v4.0 for rdsMod = 1 */ - double B4SOIprwg; - double B4SOIprwb; - double B4SOIprt; - double B4SOIeta0; - double B4SOIetab; - double B4SOIpclm; - double B4SOIpdibl1; - double B4SOIpdibl2; - double B4SOIpdiblb; - double B4SOIpvag; - double B4SOIwr; - double B4SOIdwg; - double B4SOIdwb; - double B4SOIb0; - double B4SOIb1; - double B4SOIalpha0; - double B4SOItbox; - double B4SOItsi; - double B4SOIetsi; - double B4SOIxj; - double B4SOIkb1; - double B4SOIrth0; - double B4SOIcth0; - double B4SOIegidl; - double B4SOIcfrcoeff; /* v4.4 */ - double B4SOIagidl; - double B4SOIbgidl; - double B4SOIcgidl; /* v4.0 */ - double B4SOIrgidl; - double B4SOIkgidl; - double B4SOIfgidl; - double B4SOIegisl; - double B4SOIagisl; - double B4SOIbgisl; - double B4SOIcgisl; - double B4SOIrgisl; - double B4SOIkgisl; - double B4SOIfgisl; - double B4SOIndiode; /* v4.0 */ - double B4SOIndioded; /* v4.0 */ - double B4SOIistun; - double B4SOIidtun; /* v4.0 */ - double B4SOIxbjt; - double B4SOIxdif; - double B4SOIxrec; - double B4SOIxtun; - double B4SOIxdifd; - double B4SOIxrecd; - double B4SOIxtund; - - -/* v3.0 */ - int B4SOIsoiMod; /* v3.2 bug fix */ - double B4SOIvbs0pd; /* v3.2 */ - double B4SOIvbs0fd; /* v3.2 */ - double B4SOIvbsa; - double B4SOInofffd; - double B4SOIvofffd; - double B4SOIk1b; - double B4SOIk2b; - double B4SOIdk2b; - double B4SOIdvbd0; - double B4SOIdvbd1; - double B4SOImoinFD; - -/* v3.0 */ - int B4SOIigbMod; - int B4SOIigcMod; - double B4SOIaigc; - double B4SOIbigc; - double B4SOIcigc; - double B4SOIaigsd; - double B4SOIbigsd; - double B4SOIcigsd; - double B4SOInigc; - double B4SOIpigcd; - double B4SOIpoxedge; - double B4SOIdlcig; - -/* v3.1 added for RF */ - int B4SOIrgateMod; - double B4SOIxrcrg1; - double B4SOIxrcrg2; - double B4SOIrshg; - double B4SOIngcon; - double B4SOIxgw; - double B4SOIxgl; - /* v3.1 added for RF end */ - - /* v3.2 for noise */ - double B4SOItnoia; - double B4SOItnoib; - double B4SOIrnoia; - double B4SOIrnoib; - double B4SOIntnoi; - /* v3.2 for noise end */ - - /* v4.0 */ - int B4SOIrbodyMod; - double B4SOIrbdb; - double B4SOIrbsb; - double B4SOIgbmin; - double B4SOIfrbody; - - int B4SOIrdsMod; /* v4.0 */ - - /* v4.0 end */ - /* v4.1 */ - int B4SOIfdMod; - double B4SOIvfb; - double B4SOIvsce; - double B4SOIcdsbs; - double B4SOIminvcv; - double B4SOIlminvcv; - double B4SOIwminvcv; - double B4SOIpminvcv; - double B4SOIvoffcv; - double B4SOIlvoffcv; - double B4SOIwvoffcv; - double B4SOIpvoffcv; - - - /* added end */ - -/* v2.2 release */ - double B4SOIwth0; - double B4SOIrhalo; - double B4SOIntox; - double B4SOItoxref; - double B4SOIebg; - double B4SOIvevb; - double B4SOIalphaGB1; - double B4SOIbetaGB1; - double B4SOIvgb1; - double B4SOIvecb; - double B4SOIalphaGB2; - double B4SOIbetaGB2; - double B4SOIvgb2; - double B4SOIaigbcp2; /* 4.1 */ - double B4SOIbigbcp2; /* 4.1 */ - double B4SOIcigbcp2; /* 4.1 */ - double B4SOItoxqm; - double B4SOIvoxh; - double B4SOIdeltavox; - - -/* v2.0 release */ - double B4SOIk1w1; - double B4SOIk1w2; - double B4SOIketas; - double B4SOIdwbc; - double B4SOIbeta0; - double B4SOIbeta1; - double B4SOIbeta2; - double B4SOIvdsatii0; - double B4SOItii; - double B4SOIlii; - double B4SOIsii0; - double B4SOIsii1; - double B4SOIsii2; - double B4SOIsiid; - double B4SOIfbjtii; - /*4.1 Iii model*/ - double B4SOIebjtii; - double B4SOIcbjtii; - double B4SOIvbci; - double B4SOIabjtii; - double B4SOImbjtii; - - double B4SOIesatii; - double B4SOIntun; /* v4.0 */ - double B4SOIntund; /* v4.0 */ - double B4SOInrecf0; /* v4.0 */ - double B4SOInrecf0d; /* v4.0 */ - double B4SOInrecr0; /* v4.0 */ - double B4SOInrecr0d; /* v4.0 */ - double B4SOIisbjt; - double B4SOIidbjt; /* v4.0 */ - double B4SOIisdif; - double B4SOIiddif; /* v4.0 */ - double B4SOIisrec; - double B4SOIidrec; /* v4.0 */ - double B4SOIln; - double B4SOIvrec0; /* v4.0 */ - double B4SOIvrec0d; /* v4.0 */ - double B4SOIvtun0; /* v4.0 */ - double B4SOIvtun0d; /* v4.0 */ - double B4SOInbjt; - double B4SOIlbjt0; - double B4SOIldif0; - double B4SOIvabjt; - double B4SOIaely; - double B4SOIahli; /* v4.0 */ - double B4SOIahlid; /* v4.0 */ - double B4SOIrbody; - double B4SOIrbsh; - double B4SOItt; - double B4SOIndif; - double B4SOIvsdfb; - double B4SOIvsdth; - double B4SOIcsdmin; - double B4SOIasd; - double B4SOIntrecf; - double B4SOIntrecr; - double B4SOIdlcb; - double B4SOIfbody; - double B4SOItcjswg; - double B4SOItpbswg; - double B4SOItcjswgd; - double B4SOItpbswgd; - double B4SOIacde; - double B4SOImoin; - double B4SOInoff; /* v3.2 */ - double B4SOIdelvt; - double B4SOIdlbg; - - /* CV model */ - double B4SOIcgsl; - double B4SOIcgdl; - double B4SOIckappa; - double B4SOIcf; - double B4SOIclc; - double B4SOIcle; - double B4SOIdwc; - double B4SOIdlc; - - - double B4SOItnom; - double B4SOIcgso; - double B4SOIcgdo; - double B4SOIcgeo; - - double B4SOIxpart; - /* double B4SOIcFringOut; - double B4SOIcFringMax; */ /* v4.2 never used in the code */ - - double B4SOIsheetResistance; - double B4SOIbodyJctGateSideSGradingCoeff; /* v4.0 */ - double B4SOIbodyJctGateSideDGradingCoeff; /* v4.0 */ - double B4SOIGatesidewallJctSPotential; /* v4.0 */ - double B4SOIGatesidewallJctDPotential; /* v4.0 */ - double B4SOIunitLengthGateSidewallJctCapS; /* v4.0 */ - double B4SOIunitLengthGateSidewallJctCapD; /* v4.0 */ - double B4SOIcsdesw; - - double B4SOILint; - double B4SOILl; - double B4SOILlc; /* v2.2.3 */ - double B4SOILln; - double B4SOILw; - double B4SOILwc; /* v2.2.3 */ - double B4SOILwn; - double B4SOILwl; - double B4SOILwlc; /* v2.2.3 */ - double B4SOILmin; - double B4SOILmax; - - double B4SOIWint; - double B4SOIWl; - double B4SOIWlc; /* v2.2.3 */ - double B4SOIWln; - double B4SOIWw; - double B4SOIWwc; /* v2.2.3 */ - double B4SOIWwn; - double B4SOIWwl; - double B4SOIWwlc; /* v2.2.3 */ - double B4SOIWmin; - double B4SOIWmax; - -/* Added for binning - START1 */ - /* Length Dependence */ -/* v3.1 */ - double B4SOIlxj; - double B4SOIlalphaGB1; - double B4SOIlbetaGB1; - double B4SOIlalphaGB2; - double B4SOIlbetaGB2; - double B4SOIlaigbcp2; /* 4.1 */ - double B4SOIlbigbcp2; /* 4.1 */ - double B4SOIlcigbcp2; /* 4.1 */ - double B4SOIlndif; - double B4SOIlntrecf; - double B4SOIlntrecr; - double B4SOIlxbjt; - double B4SOIlxdif; - double B4SOIlxrec; - double B4SOIlxtun; - double B4SOIlxdifd; - double B4SOIlxrecd; - double B4SOIlxtund; - double B4SOIlcgsl; - double B4SOIlcgdl; - double B4SOIlckappa; - double B4SOIlua1; - double B4SOIlub1; - double B4SOIluc1; - double B4SOIlute; - double B4SOIlkt1; - double B4SOIlkt1l; - double B4SOIlkt2; - double B4SOIlat; - double B4SOIlprt; - -/* v3.0 */ - double B4SOIlaigc; - double B4SOIlbigc; - double B4SOIlcigc; - double B4SOIlaigsd; - double B4SOIlbigsd; - double B4SOIlcigsd; - double B4SOIlnigc; - double B4SOIlpigcd; - double B4SOIlpoxedge; - - double B4SOIlnpeak; - double B4SOIlnsub; - double B4SOIlngate; - double B4SOIlvth0; - double B4SOIlvfb; /* v4.1 */ - double B4SOIlk1; - double B4SOIlk1w1; - double B4SOIlk1w2; - double B4SOIlk2; - double B4SOIlk3; - double B4SOIlk3b; - double B4SOIlkb1; - double B4SOIlw0; - double B4SOIllpe0; - double B4SOIldvt0; - double B4SOIldvt1; - double B4SOIldvt2; - double B4SOIldvt0w; - double B4SOIldvt1w; - double B4SOIldvt2w; - double B4SOIlu0; - double B4SOIlua; - double B4SOIlub; - double B4SOIluc; - double B4SOIlvsat; - double B4SOIla0; - double B4SOIlags; - double B4SOIlb0; - double B4SOIlb1; - double B4SOIlketa; - double B4SOIlketas; - double B4SOIla1; - double B4SOIla2; - double B4SOIlrdsw; - double B4SOIlrdw; /* v4.0 for rdsMod = 1 */ - double B4SOIlrsw; /* v4.0 for rdsMod = 1 */ - double B4SOIlprwb; - double B4SOIlprwg; - double B4SOIlwr; - double B4SOIlnfactor; - double B4SOIldwg; - double B4SOIldwb; - double B4SOIlvoff; - double B4SOIleta0; - double B4SOIletab; - double B4SOIldsub; - double B4SOIlcit; - double B4SOIlcdsc; - double B4SOIlcdscb; - double B4SOIlcdscd; - double B4SOIlpclm; - double B4SOIlpdibl1; - double B4SOIlpdibl2; - double B4SOIlpdiblb; - double B4SOIldrout; - double B4SOIlpvag; - double B4SOIldelta; - double B4SOIlalpha0; - double B4SOIlfbjtii; - /*4.1 Iii model*/ - double B4SOIlebjtii; - double B4SOIlcbjtii; - double B4SOIlvbci; - double B4SOIlabjtii; - double B4SOIlmbjtii; - - double B4SOIlbeta0; - double B4SOIlbeta1; - double B4SOIlbeta2; - double B4SOIlvdsatii0; - double B4SOIllii; - double B4SOIlesatii; - double B4SOIlsii0; - double B4SOIlsii1; - double B4SOIlsii2; - double B4SOIlsiid; - double B4SOIlagidl; - double B4SOIlbgidl; - double B4SOIlcgidl; - double B4SOIlegidl; - double B4SOIlrgidl; - double B4SOIlkgidl; - double B4SOIlfgidl; - double B4SOIlagisl; - double B4SOIlbgisl; - double B4SOIlcgisl; - double B4SOIlegisl; - double B4SOIlrgisl; - double B4SOIlkgisl; - double B4SOIlfgisl; - double B4SOIlntun; /* v4.0 */ - double B4SOIlntund; /* v4.0 */ - double B4SOIlndiode; /* v4.0 */ - double B4SOIlndioded; /* v4.0 */ - double B4SOIlnrecf0; /* v4.0 */ - double B4SOIlnrecf0d; /* v4.0 */ - double B4SOIlnrecr0; /* v4.0 */ - double B4SOIlnrecr0d; /* v4.0 */ - double B4SOIlisbjt; - double B4SOIlidbjt; /* v4.0 */ - double B4SOIlisdif; - double B4SOIliddif; /* v4.0 */ - double B4SOIlisrec; - double B4SOIlidrec; /* v4.0 */ - double B4SOIlistun; - double B4SOIlidtun; /* v4.0 */ - double B4SOIlvrec0; /* v4.0 */ - double B4SOIlvrec0d; /* v4.0 */ - double B4SOIlvtun0; /* v4.0 */ - double B4SOIlvtun0d; /* v4.0 */ - double B4SOIlnbjt; - double B4SOIllbjt0; - double B4SOIlvabjt; - double B4SOIlaely; - double B4SOIlahli; /* v4.0 */ - double B4SOIlahlid; /* v4.0 */ - -/* v3.1 added for RF */ - double B4SOIlxrcrg1; - double B4SOIlxrcrg2; -/* v3.1 added for RF end */ - - /* CV model */ - double B4SOIlvsdfb; - double B4SOIlvsdth; - double B4SOIldelvt; - double B4SOIlacde; - double B4SOIlmoin; - double B4SOIlnoff; /* v3.2 */ - - /* Width Dependence */ -/* v3.1 */ - double B4SOIwxj; - double B4SOIwalphaGB1; - double B4SOIwbetaGB1; - double B4SOIwalphaGB2; - double B4SOIwbetaGB2; - double B4SOIwaigbcp2; /* 4.1 */ - double B4SOIwbigbcp2; /* 4.1 */ - double B4SOIwcigbcp2; /* 4.1 */ - double B4SOIwndif; - double B4SOIwntrecf; - double B4SOIwntrecr; - double B4SOIwxbjt; - double B4SOIwxdif; - double B4SOIwxrec; - double B4SOIwxtun; - double B4SOIwxdifd; - double B4SOIwxrecd; - double B4SOIwxtund; - double B4SOIwcgsl; - double B4SOIwcgdl; - double B4SOIwckappa; - double B4SOIwua1; - double B4SOIwub1; - double B4SOIwuc1; - double B4SOIwute; - double B4SOIwkt1; - double B4SOIwkt1l; - double B4SOIwkt2; - double B4SOIwat; - double B4SOIwprt; - -/* v3.0 */ - double B4SOIwaigc; - double B4SOIwbigc; - double B4SOIwcigc; - double B4SOIwaigsd; - double B4SOIwbigsd; - double B4SOIwcigsd; - double B4SOIwnigc; - double B4SOIwpigcd; - double B4SOIwpoxedge; - - double B4SOIwnpeak; - double B4SOIwnsub; - double B4SOIwngate; - double B4SOIwvth0; - double B4SOIwvfb; /* v4.1 */ - double B4SOIwk1; - double B4SOIwk1w1; - double B4SOIwk1w2; - double B4SOIwk2; - double B4SOIwk3; - double B4SOIwk3b; - double B4SOIwkb1; - double B4SOIww0; - double B4SOIwlpe0; - double B4SOIwdvt0; - double B4SOIwdvt1; - double B4SOIwdvt2; - double B4SOIwdvt0w; - double B4SOIwdvt1w; - double B4SOIwdvt2w; - double B4SOIwu0; - double B4SOIwua; - double B4SOIwub; - double B4SOIwuc; - double B4SOIwvsat; - double B4SOIwa0; - double B4SOIwags; - double B4SOIwb0; - double B4SOIwb1; - double B4SOIwketa; - double B4SOIwketas; - double B4SOIwa1; - double B4SOIwa2; - double B4SOIwrdsw; - double B4SOIwrdw; /* v4.0 for rdsMod = 1 */ - double B4SOIwrsw; /* v4.0 for rdsMod = 1 */ - double B4SOIwprwb; - double B4SOIwprwg; - double B4SOIwwr; - double B4SOIwnfactor; - double B4SOIwdwg; - double B4SOIwdwb; - double B4SOIwvoff; - double B4SOIweta0; - double B4SOIwetab; - double B4SOIwdsub; - double B4SOIwcit; - double B4SOIwcdsc; - double B4SOIwcdscb; - double B4SOIwcdscd; - double B4SOIwpclm; - double B4SOIwpdibl1; - double B4SOIwpdibl2; - double B4SOIwpdiblb; - double B4SOIwdrout; - double B4SOIwpvag; - double B4SOIwdelta; - double B4SOIwalpha0; - double B4SOIwfbjtii; - /*4.1 Iii model*/ - double B4SOIwebjtii; - double B4SOIwcbjtii; - double B4SOIwvbci; - double B4SOIwabjtii; - double B4SOIwmbjtii; - - double B4SOIwbeta0; - double B4SOIwbeta1; - double B4SOIwbeta2; - double B4SOIwvdsatii0; - double B4SOIwlii; - double B4SOIwesatii; - double B4SOIwsii0; - double B4SOIwsii1; - double B4SOIwsii2; - double B4SOIwsiid; - double B4SOIwagidl; - double B4SOIwbgidl; - double B4SOIwcgidl; - double B4SOIwegidl; - double B4SOIwrgidl; - double B4SOIwkgidl; - double B4SOIwfgidl; - double B4SOIwagisl; - double B4SOIwbgisl; - double B4SOIwcgisl; - double B4SOIwegisl; - double B4SOIwrgisl; - double B4SOIwkgisl; - double B4SOIwfgisl; - double B4SOIwntun; /* v4.0 */ - double B4SOIwntund; /* v4.0 */ - double B4SOIwndiode; /* v4.0 */ - double B4SOIwndioded; /* v4.0 */ - double B4SOIwnrecf0; /* v4.0 */ - double B4SOIwnrecf0d; /* v4.0 */ - double B4SOIwnrecr0; /* v4.0 */ - double B4SOIwnrecr0d; /* v4.0 */ - double B4SOIwisbjt; - double B4SOIwidbjt; /* v4.0 */ - double B4SOIwisdif; - double B4SOIwiddif; /* v4.0 */ - double B4SOIwisrec; - double B4SOIwidrec; /* v4.0 */ - double B4SOIwistun; - double B4SOIwidtun; /* v4.0 */ - double B4SOIwvrec0; /* v4.0 */ - double B4SOIwvrec0d; /* v4.0 */ - double B4SOIwvtun0; /* v4.0 */ - double B4SOIwvtun0d; /* v4.0 */ - double B4SOIwnbjt; - double B4SOIwlbjt0; - double B4SOIwvabjt; - double B4SOIwaely; - double B4SOIwahli; /* v4.0 */ - double B4SOIwahlid; /* v4.0 */ - -/* v3.1 added for RF */ - double B4SOIwxrcrg1; - double B4SOIwxrcrg2; -/* v3.1 added for RF end */ - - /* CV model */ - double B4SOIwvsdfb; - double B4SOIwvsdth; - double B4SOIwdelvt; - double B4SOIwacde; - double B4SOIwmoin; - double B4SOIwnoff; /* v3.2 */ - - /* Cross-term Dependence */ -/* v3.1 */ - double B4SOIpxj; - double B4SOIpalphaGB1; - double B4SOIpbetaGB1; - double B4SOIpalphaGB2; - double B4SOIpbetaGB2; - double B4SOIpaigbcp2; /* 4.1 */ - double B4SOIpbigbcp2; /* 4.1 */ - double B4SOIpcigbcp2; /* 4.1 */ - double B4SOIpndif; - double B4SOIpntrecf; - double B4SOIpntrecr; - double B4SOIpxbjt; - double B4SOIpxdif; - double B4SOIpxrec; - double B4SOIpxtun; - double B4SOIpxdifd; - double B4SOIpxrecd; - double B4SOIpxtund; - double B4SOIpcgsl; - double B4SOIpcgdl; - double B4SOIpckappa; - double B4SOIpua1; - double B4SOIpub1; - double B4SOIpuc1; - double B4SOIpute; - double B4SOIpkt1; - double B4SOIpkt1l; - double B4SOIpkt2; - double B4SOIpat; - double B4SOIpprt; - -/* v3.0 */ - double B4SOIpaigc; - double B4SOIpbigc; - double B4SOIpcigc; - double B4SOIpaigsd; - double B4SOIpbigsd; - double B4SOIpcigsd; - double B4SOIpnigc; - double B4SOIppigcd; - double B4SOIppoxedge; - - double B4SOIpnpeak; - double B4SOIpnsub; - double B4SOIpngate; - double B4SOIpvth0; - double B4SOIpvfb; /* v4.1 */ - double B4SOIpk1; - double B4SOIpk1w1; - double B4SOIpk1w2; - double B4SOIpk2; - double B4SOIpk3; - double B4SOIpk3b; - double B4SOIpkb1; - double B4SOIpw0; - double B4SOIplpe0; - double B4SOIpdvt0; - double B4SOIpdvt1; - double B4SOIpdvt2; - double B4SOIpdvt0w; - double B4SOIpdvt1w; - double B4SOIpdvt2w; - double B4SOIpu0; - double B4SOIpua; - double B4SOIpub; - double B4SOIpuc; - double B4SOIpvsat; - double B4SOIpa0; - double B4SOIpags; - double B4SOIpb0; - double B4SOIpb1; - double B4SOIpketa; - double B4SOIpketas; - double B4SOIpa1; - double B4SOIpa2; - double B4SOIprdsw; - double B4SOIprdw; /* v4.0 for rdsMod = 1 */ - double B4SOIprsw; /* v4.0 for rdsMod = 1 */ - double B4SOIpprwb; - double B4SOIpprwg; - double B4SOIpwr; - double B4SOIpnfactor; - double B4SOIpdwg; - double B4SOIpdwb; - double B4SOIpvoff; - double B4SOIpeta0; - double B4SOIpetab; - double B4SOIpdsub; - double B4SOIpcit; - double B4SOIpcdsc; - double B4SOIpcdscb; - double B4SOIpcdscd; - double B4SOIppclm; - double B4SOIppdibl1; - double B4SOIppdibl2; - double B4SOIppdiblb; - double B4SOIpdrout; - double B4SOIppvag; - double B4SOIpdelta; - double B4SOIpalpha0; - double B4SOIpfbjtii; - /*4.1 Iii model*/ - double B4SOIpebjtii; - double B4SOIpcbjtii; - double B4SOIpvbci; - double B4SOIpabjtii; - double B4SOIpmbjtii; - - double B4SOIpbeta0; - double B4SOIpbeta1; - double B4SOIpbeta2; - double B4SOIpvdsatii0; - double B4SOIplii; - double B4SOIpesatii; - double B4SOIpsii0; - double B4SOIpsii1; - double B4SOIpsii2; - double B4SOIpsiid; - double B4SOIpagidl; - double B4SOIpbgidl; - double B4SOIpcgidl; - double B4SOIpegidl; - double B4SOIprgidl; - double B4SOIpkgidl; - double B4SOIpfgidl; - double B4SOIpagisl; - double B4SOIpbgisl; - double B4SOIpcgisl; - double B4SOIpegisl; - double B4SOIprgisl; - double B4SOIpkgisl; - double B4SOIpfgisl; - double B4SOIpntun; /* v4.0 */ - double B4SOIpntund; /* v4.0 */ - double B4SOIpndiode; /* v4.0 */ - double B4SOIpndioded; /* v4.0 */ - double B4SOIpnrecf0; /* v4.0 */ - double B4SOIpnrecf0d; /* v4.0 */ - double B4SOIpnrecr0; /* v4.0 */ - double B4SOIpnrecr0d; /* v4.0 */ - double B4SOIpisbjt; - double B4SOIpidbjt; /* v4.0 */ - double B4SOIpisdif; - double B4SOIpiddif; /* v4.0 */ - double B4SOIpisrec; - double B4SOIpidrec; /* v4.0 */ - double B4SOIpistun; - double B4SOIpidtun; /* v4.0 */ - double B4SOIpvrec0; /* v4.0 */ - double B4SOIpvrec0d; /* v4.0 */ - double B4SOIpvtun0; /* v4.0 */ - double B4SOIpvtun0d; /* v4.0 */ - double B4SOIpnbjt; - double B4SOIplbjt0; - double B4SOIpvabjt; - double B4SOIpaely; - double B4SOIpahli; /* v4.0 */ - double B4SOIpahlid; /* v4.0 */ -/* v3.1 added for RF */ - double B4SOIpxrcrg1; - double B4SOIpxrcrg2; -/* v3.1 added for RF end */ - - /* CV model */ - double B4SOIpvsdfb; - double B4SOIpvsdth; - double B4SOIpdelvt; - double B4SOIpacde; - double B4SOIpmoin; - double B4SOIpnoff; /* v3.2 */ -/* Added for binning - END1 */ - -/* Pre-calculated constants */ - double B4SOIcbox; - double B4SOIcsi; - /* double B4SOIcsieff; - double B4SOIcoxt; - double B4SOInfb; - double B4SOIadice */ /* v4.2 never used in the code */ - double B4SOIeg0; - double B4SOIeg; /* Jun 09*/ - - /* v4.0 added for stress effect */ - double B4SOIsaref; - double B4SOIsbref; - double B4SOIwlod; - double B4SOIku0; - double B4SOIkvsat; - double B4SOIkvth0; - double B4SOItku0; - double B4SOIllodku0; - double B4SOIwlodku0; - double B4SOIllodvth; - double B4SOIwlodvth; - double B4SOIlku0; - double B4SOIwku0; - double B4SOIpku0; - double B4SOIlkvth0; - double B4SOIwkvth0; - double B4SOIpkvth0; - double B4SOIstk2; - double B4SOIlodk2; - double B4SOIsteta0; - double B4SOIlodeta0; - /* v4.0 added for stress effect end */ - - /* MCJ: move to size-dependent param. */ - double B4SOIvtm; - double B4SOIcox; - /* double B4SOIcof1; - double B4SOIcof2; - double B4SOIcof3; - double B4SOIcof4 */ /* v4.2 never used in the code */ - double B4SOIvcrit; - double B4SOIfactor1; - - double B4SOIoxideTrapDensityA; - double B4SOIoxideTrapDensityB; - double B4SOIoxideTrapDensityC; - double B4SOIem; - double B4SOIef; - double B4SOIaf; - double B4SOIkf; - double B4SOInoif; - double B4SOIbf; /* v4.0 for noise */ - double B4SOIw0flk; /* v4.0 for noise */ - double B4SOIlpeb; /* v4.0 for Vth */ - double B4SOIllpeb; /* v4.0 for Vth */ - double B4SOIwlpeb; /* v4.0 for Vth */ - double B4SOIplpeb; /* v4.0 for Vth */ - double B4SOIdvtp0; /* v4.0 for Vth */ - double B4SOIldvtp0; /* v4.0 for Vth */ - double B4SOIwdvtp0; /* v4.0 for Vth */ - double B4SOIpdvtp0; /* v4.0 for Vth */ - double B4SOIdvtp1; /* v4.0 for Vth */ - double B4SOIldvtp1; /* v4.0 for Vth */ - double B4SOIwdvtp1; /* v4.0 for Vth */ - double B4SOIpdvtp1; /* v4.0 for Vth */ - double B4SOIdvtp2; /* v4.1 for Vth */ - double B4SOIldvtp2; /* v4.1 for Vth */ - double B4SOIwdvtp2; /* v4.1 for Vth */ - double B4SOIpdvtp2; /* v4.1 for Vth */ - double B4SOIdvtp3; /* v4.1 for Vth */ - double B4SOIldvtp3; /* v4.1 for Vth */ - double B4SOIwdvtp3; /* v4.1 for Vth */ - double B4SOIpdvtp3; /* v4.1 for Vth */ - double B4SOIdvtp4; /* v4.1 for Vth */ - double B4SOIldvtp4; /* v4.1 for Vth */ - double B4SOIwdvtp4; /* v4.1 for Vth */ - double B4SOIpdvtp4; /* v4.1 for Vth */ - double B4SOIminv; /* v4.0 for Vgsteff */ - double B4SOIlminv; /* v4.0 for Vgsteff */ - double B4SOIwminv; /* v4.0 for Vgsteff */ - double B4SOIpminv; /* v4.0 for Vgsteff */ - double B4SOIfprout; /* v4.0 for DITS in Id */ - double B4SOIlfprout; /* v4.0 for DITS in Id */ - double B4SOIwfprout; /* v4.0 for DITS in Id */ - double B4SOIpfprout; /* v4.0 for DITS in Id */ - double B4SOIpdits; /* v4.0 for DITS in Id */ - double B4SOIlpdits; /* v4.0 for DITS in Id */ - double B4SOIwpdits; /* v4.0 for DITS in Id */ - double B4SOIppdits; /* v4.0 for DITS in Id */ - double B4SOIpditsd; /* v4.0 for DITS in Id */ - double B4SOIlpditsd; /* v4.0 for DITS in Id */ - double B4SOIwpditsd; /* v4.0 for DITS in Id */ - double B4SOIppditsd; /* v4.0 for DITS in Id */ - double B4SOIpditsl; /* v4.0 for DITS in Id */ - /* 4.0 backward compatibility */ - double B4SOInlx; - double B4SOIlnlx; - double B4SOIwnlx; - double B4SOIpnlx; - unsigned B4SOInlxGiven :1; - unsigned B4SOIlnlxGiven :1; - unsigned B4SOIwnlxGiven :1; - unsigned B4SOIpnlxGiven :1; - double B4SOIngidl; - double B4SOIlngidl; - double B4SOIwngidl; - double B4SOIpngidl; - unsigned B4SOIngidlGiven :1; - unsigned B4SOIlngidlGiven :1; - unsigned B4SOIwngidlGiven :1; - unsigned B4SOIpngidlGiven :1; - - double B4SOIvgsMax; - double B4SOIvgdMax; - double B4SOIvgbMax; - double B4SOIvdsMax; - double B4SOIvbsMax; - double B4SOIvbdMax; - double B4SOIvgsrMax; - double B4SOIvgdrMax; - double B4SOIvgbrMax; - double B4SOIvbsrMax; - double B4SOIvbdrMax; - unsigned B4SOIvgsMaxGiven :1; - unsigned B4SOIvgdMaxGiven :1; - unsigned B4SOIvgbMaxGiven :1; - unsigned B4SOIvdsMaxGiven :1; - unsigned B4SOIvbsMaxGiven :1; - unsigned B4SOIvbdMaxGiven :1; - unsigned B4SOIvgsrMaxGiven :1; - unsigned B4SOIvgdrMaxGiven :1; - unsigned B4SOIvgbrMaxGiven :1; - unsigned B4SOIvbsrMaxGiven :1; - unsigned B4SOIvbdrMaxGiven :1; - - struct b4soiSizeDependParam *pSizeDependParamKnot; - -#ifdef USE_OMP - int B4SOIInstCount; - struct sB4SOIinstance **B4SOIInstanceArray; -#endif - - /* Flags */ - unsigned B4SOIepsrgateGiven:1; - unsigned B4SOIadosGiven :1; - unsigned B4SOIbdosGiven :1; - unsigned B4SOIleffeotGiven :1; - unsigned B4SOIweffeotGiven :1; - unsigned B4SOIvddeotGiven :1; - unsigned B4SOItempeotGiven :1; - - unsigned B4SOItoxpGiven :1; - unsigned B4SOImtrlModGiven :1; /*4.1*/ - unsigned B4SOIvgstcvModGiven :1; - unsigned B4SOIgidlModGiven :1; - unsigned B4SOIiiiModGiven :1; - unsigned B4SOIrdsModGiven :1; /* v4.0 */ - unsigned B4SOIrbodyModGiven :1; /* v4.0 */ - unsigned B4SOIrgateModGiven :1; /* v3.1 */ - -/* v3.0 */ - unsigned B4SOIsoiModGiven: 1; - unsigned B4SOIvbs0pdGiven: 1; /* v3.2 */ - unsigned B4SOIvbs0fdGiven: 1; /* v3.2 */ - unsigned B4SOIvbsaGiven : 1; - unsigned B4SOInofffdGiven: 1; - unsigned B4SOIvofffdGiven: 1; - unsigned B4SOIk1bGiven: 1; - unsigned B4SOIk2bGiven: 1; - unsigned B4SOIdk2bGiven: 1; - unsigned B4SOIdvbd0Given: 1; - unsigned B4SOIdvbd1Given: 1; - unsigned B4SOImoinFDGiven: 1; - - - unsigned B4SOItboxGiven:1; - unsigned B4SOItsiGiven :1; - unsigned B4SOIetsiGiven :1; - unsigned B4SOIxjGiven :1; - unsigned B4SOIkb1Given :1; - unsigned B4SOIrth0Given :1; - unsigned B4SOIcth0Given :1; - unsigned B4SOIcfrcoeffGiven :1; /* v4.4 */ - unsigned B4SOIegidlGiven :1; - unsigned B4SOIagidlGiven :1; - unsigned B4SOIbgidlGiven :1; - unsigned B4SOIcgidlGiven :1; - unsigned B4SOIrgidlGiven :1; - unsigned B4SOIkgidlGiven :1; - unsigned B4SOIfgidlGiven :1; - unsigned B4SOIegislGiven :1; - unsigned B4SOIagislGiven :1; - unsigned B4SOIbgislGiven :1; - unsigned B4SOIcgislGiven :1; - unsigned B4SOIrgislGiven :1; - unsigned B4SOIkgislGiven :1; - unsigned B4SOIfgislGiven :1; - unsigned B4SOIndiodeGiven :1; /* v4.0 */ - unsigned B4SOIndiodedGiven :1; /* v4.0 */ - unsigned B4SOIxbjtGiven :1; - unsigned B4SOIxdifGiven :1; - unsigned B4SOIxrecGiven :1; - unsigned B4SOIxtunGiven :1; - unsigned B4SOIxdifdGiven :1; - unsigned B4SOIxrecdGiven :1; - unsigned B4SOIxtundGiven :1; - unsigned B4SOIttGiven :1; - unsigned B4SOIvsdfbGiven :1; - unsigned B4SOIvsdthGiven :1; - unsigned B4SOIasdGiven :1; - unsigned B4SOIcsdminGiven :1; - - unsigned B4SOImobModGiven :1; - unsigned B4SOIbinUnitGiven :1; - unsigned B4SOIcapModGiven :1; - unsigned B4SOIparamChkGiven :1; -/* unsigned B4SOInoiModGiven :1; v3.2 */ - unsigned B4SOIshModGiven :1; - unsigned B4SOItypeGiven :1; - unsigned B4SOItoxGiven :1; - unsigned B4SOItoxmGiven :1; /* v3.2 */ - unsigned B4SOIdtoxcvGiven :1; /* v2.2.3 */ - unsigned B4SOIversionGiven :1; - - unsigned B4SOIcdscGiven :1; - unsigned B4SOIcdscbGiven :1; - unsigned B4SOIcdscdGiven :1; - unsigned B4SOIcitGiven :1; - unsigned B4SOInfactorGiven :1; - unsigned B4SOIvsatGiven :1; - unsigned B4SOIatGiven :1; - unsigned B4SOIa0Given :1; - unsigned B4SOIagsGiven :1; - unsigned B4SOIa1Given :1; - unsigned B4SOIa2Given :1; - unsigned B4SOIketaGiven :1; - unsigned B4SOInsubGiven :1; - unsigned B4SOInpeakGiven :1; - unsigned B4SOIngateGiven :1; - unsigned B4SOInsdGiven :1; - unsigned B4SOIgamma1Given :1; - unsigned B4SOIgamma2Given :1; - unsigned B4SOIvbxGiven :1; - unsigned B4SOIvbmGiven :1; - unsigned B4SOIxtGiven :1; - unsigned B4SOIk1Given :1; - unsigned B4SOIkt1Given :1; - unsigned B4SOIkt1lGiven :1; - unsigned B4SOIkt2Given :1; - unsigned B4SOIk2Given :1; - unsigned B4SOIk3Given :1; - unsigned B4SOIk3bGiven :1; - unsigned B4SOIw0Given :1; - unsigned B4SOIlpe0Given :1; - unsigned B4SOIdvt0Given :1; - unsigned B4SOIdvt1Given :1; - unsigned B4SOIdvt2Given :1; - unsigned B4SOIdvt0wGiven :1; - unsigned B4SOIdvt1wGiven :1; - unsigned B4SOIdvt2wGiven :1; - unsigned B4SOIdroutGiven :1; - unsigned B4SOIdsubGiven :1; - unsigned B4SOIvth0Given :1; - unsigned B4SOIuaGiven :1; - unsigned B4SOIua1Given :1; - unsigned B4SOIubGiven :1; - unsigned B4SOIub1Given :1; - unsigned B4SOIucGiven :1; - unsigned B4SOIuc1Given :1; - unsigned B4SOIu0Given :1; - unsigned B4SOIuteGiven :1; - /*4.1 mobmod=4*/ - unsigned B4SOIudGiven :1; - unsigned B4SOIludGiven :1; - unsigned B4SOIwudGiven :1; - unsigned B4SOIpudGiven :1; - - unsigned B4SOIud1Given :1; - unsigned B4SOIlud1Given :1; - unsigned B4SOIwud1Given :1; - unsigned B4SOIpud1Given :1; - - unsigned B4SOIeuGiven :1; - unsigned B4SOIleuGiven :1; - unsigned B4SOIweuGiven :1; - unsigned B4SOIpeuGiven :1; - - unsigned B4SOIucsGiven :1; - unsigned B4SOIlucsGiven :1; - unsigned B4SOIwucsGiven :1; - unsigned B4SOIpucsGiven :1; - - unsigned B4SOIucsteGiven :1; - unsigned B4SOIlucsteGiven:1; - unsigned B4SOIwucsteGiven:1; - unsigned B4SOIpucsteGiven:1; - - unsigned B4SOIvoffGiven :1; - unsigned B4SOIrdswGiven :1; - unsigned B4SOIrdwGiven :1; /* v4.0 for rdsMod = 1 */ - unsigned B4SOIrswGiven :1; /* v4.0 for rdsMod = 1 */ - unsigned B4SOIrdwminGiven :1; /* v4.0 for rdsMod = 1 */ - unsigned B4SOIrswminGiven :1; /* v4.0 for rdsMod = 1 */ - unsigned B4SOIprwgGiven :1; - unsigned B4SOIprwbGiven :1; - unsigned B4SOIprtGiven :1; - unsigned B4SOIeta0Given :1; - unsigned B4SOIetabGiven :1; - unsigned B4SOIpclmGiven :1; - unsigned B4SOIpdibl1Given :1; - unsigned B4SOIpdibl2Given :1; - unsigned B4SOIpdiblbGiven :1; - unsigned B4SOIpvagGiven :1; - unsigned B4SOIdeltaGiven :1; - unsigned B4SOIwrGiven :1; - unsigned B4SOIdwgGiven :1; - unsigned B4SOIdwbGiven :1; - unsigned B4SOIb0Given :1; - unsigned B4SOIb1Given :1; - unsigned B4SOIalpha0Given :1; - - - /*4.1*/ - unsigned B4SOIepsroxGiven :1; - unsigned B4SOIeotGiven :1; - unsigned B4SOIepsrsubGiven :1; - unsigned B4SOIni0subGiven :1; - unsigned B4SOIbg0subGiven :1; - unsigned B4SOItbgasubGiven:1; - unsigned B4SOItbgbsubGiven:1; - unsigned B4SOIphigGiven :1; - unsigned B4SOIeasubGiven :1; - - /* v3.1 added for RF */ - unsigned B4SOIxrcrg1Given :1; - unsigned B4SOIxrcrg2Given :1; - unsigned B4SOIrshgGiven :1; - unsigned B4SOIngconGiven :1; - unsigned B4SOIxgwGiven :1; - unsigned B4SOIxglGiven :1; - /* v3.1 added for RF end */ - - /* v3.2 */ - unsigned B4SOIfnoiModGiven :1; - unsigned B4SOItnoiModGiven :1; - unsigned B4SOItnoiaGiven :1; - unsigned B4SOItnoibGiven :1; - unsigned B4SOIrnoiaGiven :1; - unsigned B4SOIrnoibGiven :1; - unsigned B4SOIntnoiGiven :1; - /* v3.2 end */ - - /* v4.0 */ - unsigned B4SOIvfbGiven :1; - unsigned B4SOIgbminGiven :1; - unsigned B4SOIrbdbGiven :1; - unsigned B4SOIrbsbGiven :1; - /* v4.0 end */ - /* v4.1 */ - unsigned B4SOIfdModGiven :1; - unsigned B4SOIvsceGiven :1; - unsigned B4SOIcdsbsGiven :1; - unsigned B4SOIminvcvGiven :1; - unsigned B4SOIlminvcvGiven :1; - unsigned B4SOIwminvcvGiven :1; - unsigned B4SOIpminvcvGiven :1; - unsigned B4SOIvoffcvGiven :1; - unsigned B4SOIlvoffcvGiven :1; - unsigned B4SOIwvoffcvGiven :1; - unsigned B4SOIpvoffcvGiven :1; -/* v2.2 release */ - unsigned B4SOIwth0Given :1; - unsigned B4SOIrhaloGiven :1; - unsigned B4SOIntoxGiven :1; - unsigned B4SOItoxrefGiven :1; - unsigned B4SOIebgGiven :1; - unsigned B4SOIvevbGiven :1; - unsigned B4SOIalphaGB1Given :1; - unsigned B4SOIbetaGB1Given :1; - unsigned B4SOIvgb1Given :1; - unsigned B4SOIvecbGiven :1; - unsigned B4SOIalphaGB2Given :1; - unsigned B4SOIbetaGB2Given :1; - unsigned B4SOIvgb2Given :1; - unsigned B4SOIaigbcp2Given :1; /* 4.1 */ - unsigned B4SOIbigbcp2Given :1; /* 4.1 */ - unsigned B4SOIcigbcp2Given :1; /* 4.1 */ - unsigned B4SOItoxqmGiven :1; - unsigned B4SOIigbModGiven :1; /* v3.0 */ - unsigned B4SOIvoxhGiven :1; - unsigned B4SOIdeltavoxGiven :1; - unsigned B4SOIigcModGiven :1; /* v3.0 */ -/* v3.0 */ - unsigned B4SOIaigcGiven :1; - unsigned B4SOIbigcGiven :1; - unsigned B4SOIcigcGiven :1; - unsigned B4SOIaigsdGiven :1; - unsigned B4SOIbigsdGiven :1; - unsigned B4SOIcigsdGiven :1; - unsigned B4SOInigcGiven :1; - unsigned B4SOIpigcdGiven :1; - unsigned B4SOIpoxedgeGiven :1; - unsigned B4SOIdlcigGiven :1; - - -/* v2.0 release */ - unsigned B4SOIk1w1Given :1; - unsigned B4SOIk1w2Given :1; - unsigned B4SOIketasGiven :1; - unsigned B4SOIdwbcGiven :1; - unsigned B4SOIbeta0Given :1; - unsigned B4SOIbeta1Given :1; - unsigned B4SOIbeta2Given :1; - unsigned B4SOIvdsatii0Given :1; - unsigned B4SOItiiGiven :1; - unsigned B4SOItvbciGiven :1; - unsigned B4SOIliiGiven :1; - unsigned B4SOIsii0Given :1; - unsigned B4SOIsii1Given :1; - unsigned B4SOIsii2Given :1; - unsigned B4SOIsiidGiven :1; - unsigned B4SOIfbjtiiGiven :1; - /*4.1 Iii model*/ - unsigned B4SOIebjtiiGiven :1; - unsigned B4SOIcbjtiiGiven :1; - unsigned B4SOIvbciGiven :1; - unsigned B4SOIabjtiiGiven :1; - unsigned B4SOImbjtiiGiven :1; - - unsigned B4SOIesatiiGiven :1; - unsigned B4SOIntunGiven :1; /* v4.0 */ - unsigned B4SOIntundGiven :1; /* v4.0 */ - unsigned B4SOInrecf0Given :1; /* v4.0 */ - unsigned B4SOInrecf0dGiven :1; /* v4.0 */ - unsigned B4SOInrecr0Given :1; /* v4.0 */ - unsigned B4SOInrecr0dGiven :1; /* v4.0 */ - unsigned B4SOIisbjtGiven :1; - unsigned B4SOIidbjtGiven :1; /* v4.0 */ - unsigned B4SOIisdifGiven :1; - unsigned B4SOIiddifGiven :1; /* v4.0 */ - unsigned B4SOIisrecGiven :1; - unsigned B4SOIidrecGiven :1; /* v4.0 */ - unsigned B4SOIistunGiven :1; - unsigned B4SOIidtunGiven :1; /* v4.0 */ - unsigned B4SOIlnGiven :1; - unsigned B4SOIvrec0Given :1; /* v4.0 */ - unsigned B4SOIvrec0dGiven :1; /* v4.0 */ - unsigned B4SOIvtun0Given :1; /* v4.0 */ - unsigned B4SOIvtun0dGiven :1; /* v4.0 */ - unsigned B4SOInbjtGiven :1; - unsigned B4SOIlbjt0Given :1; - unsigned B4SOIldif0Given :1; - unsigned B4SOIvabjtGiven :1; - unsigned B4SOIaelyGiven :1; - unsigned B4SOIahliGiven :1; /* v4.0 */ - unsigned B4SOIahlidGiven :1; /* v4.0 */ - unsigned B4SOIrbodyGiven :1; - unsigned B4SOIrbshGiven :1; - unsigned B4SOIndifGiven :1; - unsigned B4SOIntrecfGiven :1; - unsigned B4SOIntrecrGiven :1; - unsigned B4SOIdlcbGiven :1; - unsigned B4SOIfbodyGiven :1; - unsigned B4SOItcjswgGiven :1; - unsigned B4SOItpbswgGiven :1; - unsigned B4SOItcjswgdGiven :1; - unsigned B4SOItpbswgdGiven :1; - unsigned B4SOIacdeGiven :1; - unsigned B4SOImoinGiven :1; - unsigned B4SOInoffGiven: 1; /* v3.2 */ - unsigned B4SOIdelvtGiven :1; - unsigned B4SOIdlbgGiven :1; - - - /* CV model */ - unsigned B4SOIcgslGiven :1; - unsigned B4SOIcgdlGiven :1; - unsigned B4SOIckappaGiven :1; - unsigned B4SOIcfGiven :1; - unsigned B4SOIclcGiven :1; - unsigned B4SOIcleGiven :1; - unsigned B4SOIdwcGiven :1; - unsigned B4SOIdlcGiven :1; - -/* Added for binning - START2 */ - /* Length Dependence */ -/* v3.1 */ - unsigned B4SOIlxjGiven :1; - unsigned B4SOIlalphaGB1Given :1; - unsigned B4SOIlbetaGB1Given :1; - unsigned B4SOIlalphaGB2Given :1; - unsigned B4SOIlbetaGB2Given :1; - unsigned B4SOIlaigbcp2Given :1; /* 4.1 */ - unsigned B4SOIlbigbcp2Given :1; /* 4.1 */ - unsigned B4SOIlcigbcp2Given :1; /* 4.1 */ - unsigned B4SOIlndifGiven :1; - unsigned B4SOIlntrecfGiven :1; - unsigned B4SOIlntrecrGiven :1; - unsigned B4SOIlxbjtGiven :1; - unsigned B4SOIlxdifGiven :1; - unsigned B4SOIlxrecGiven :1; - unsigned B4SOIlxtunGiven :1; - unsigned B4SOIlxdifdGiven :1; - unsigned B4SOIlxrecdGiven :1; - unsigned B4SOIlxtundGiven :1; - unsigned B4SOIlcgslGiven :1; - unsigned B4SOIlcgdlGiven :1; - unsigned B4SOIlckappaGiven :1; - unsigned B4SOIlua1Given :1; - unsigned B4SOIlub1Given :1; - unsigned B4SOIluc1Given :1; - unsigned B4SOIluteGiven :1; - unsigned B4SOIlkt1Given :1; - unsigned B4SOIlkt1lGiven :1; - unsigned B4SOIlkt2Given :1; - unsigned B4SOIlatGiven :1; - unsigned B4SOIlprtGiven :1; - -/* v3.0 */ - unsigned B4SOIlaigcGiven :1; - unsigned B4SOIlbigcGiven :1; - unsigned B4SOIlcigcGiven :1; - unsigned B4SOIlaigsdGiven :1; - unsigned B4SOIlbigsdGiven :1; - unsigned B4SOIlcigsdGiven :1; - unsigned B4SOIlnigcGiven :1; - unsigned B4SOIlpigcdGiven :1; - unsigned B4SOIlpoxedgeGiven :1; - - unsigned B4SOIlnpeakGiven :1; - unsigned B4SOIlnsubGiven :1; - unsigned B4SOIlngateGiven :1; - unsigned B4SOIlnsdGiven :1; - unsigned B4SOIlvth0Given :1; - unsigned B4SOIlvfbGiven :1; /* v4.1 */ - unsigned B4SOIlk1Given :1; - unsigned B4SOIlk1w1Given :1; - unsigned B4SOIlk1w2Given :1; - unsigned B4SOIlk2Given :1; - unsigned B4SOIlk3Given :1; - unsigned B4SOIlk3bGiven :1; - unsigned B4SOIlkb1Given :1; - unsigned B4SOIlw0Given :1; - unsigned B4SOIllpe0Given :1; - unsigned B4SOIldvt0Given :1; - unsigned B4SOIldvt1Given :1; - unsigned B4SOIldvt2Given :1; - unsigned B4SOIldvt0wGiven :1; - unsigned B4SOIldvt1wGiven :1; - unsigned B4SOIldvt2wGiven :1; - unsigned B4SOIlu0Given :1; - unsigned B4SOIluaGiven :1; - unsigned B4SOIlubGiven :1; - unsigned B4SOIlucGiven :1; - unsigned B4SOIlvsatGiven :1; - unsigned B4SOIla0Given :1; - unsigned B4SOIlagsGiven :1; - unsigned B4SOIlb0Given :1; - unsigned B4SOIlb1Given :1; - unsigned B4SOIlketaGiven :1; - unsigned B4SOIlketasGiven :1; - unsigned B4SOIla1Given :1; - unsigned B4SOIla2Given :1; - unsigned B4SOIlrdswGiven :1; - unsigned B4SOIlrdwGiven :1; /* v4.0 for rdsMod = 1 */ - unsigned B4SOIlrswGiven :1; /* v4.0 for rdsMod = 1 */ - unsigned B4SOIlprwbGiven :1; - unsigned B4SOIlprwgGiven :1; - unsigned B4SOIlwrGiven :1; - unsigned B4SOIlnfactorGiven :1; - unsigned B4SOIldwgGiven :1; - unsigned B4SOIldwbGiven :1; - unsigned B4SOIlvoffGiven :1; - unsigned B4SOIleta0Given :1; - unsigned B4SOIletabGiven :1; - unsigned B4SOIldsubGiven :1; - unsigned B4SOIlcitGiven :1; - unsigned B4SOIlcdscGiven :1; - unsigned B4SOIlcdscbGiven :1; - unsigned B4SOIlcdscdGiven :1; - unsigned B4SOIlpclmGiven :1; - unsigned B4SOIlpdibl1Given :1; - unsigned B4SOIlpdibl2Given :1; - unsigned B4SOIlpdiblbGiven :1; - unsigned B4SOIldroutGiven :1; - unsigned B4SOIlpvagGiven :1; - unsigned B4SOIldeltaGiven :1; - unsigned B4SOIlalpha0Given :1; - unsigned B4SOIlfbjtiiGiven :1; - /*4.1 Iii model*/ - unsigned B4SOIlebjtiiGiven :1; - unsigned B4SOIlcbjtiiGiven :1; - unsigned B4SOIlvbciGiven :1; - unsigned B4SOIlabjtiiGiven :1; - unsigned B4SOIlmbjtiiGiven :1; - - unsigned B4SOIlbeta0Given :1; - unsigned B4SOIlbeta1Given :1; - unsigned B4SOIlbeta2Given :1; - unsigned B4SOIlvdsatii0Given :1; - unsigned B4SOIlliiGiven :1; - unsigned B4SOIlesatiiGiven :1; - unsigned B4SOIlsii0Given :1; - unsigned B4SOIlsii1Given :1; - unsigned B4SOIlsii2Given :1; - unsigned B4SOIlsiidGiven :1; - unsigned B4SOIlagidlGiven :1; - unsigned B4SOIlbgidlGiven :1; - unsigned B4SOIlcgidlGiven :1; - unsigned B4SOIlegidlGiven :1; - unsigned B4SOIlrgidlGiven :1; - unsigned B4SOIlkgidlGiven :1; - unsigned B4SOIlfgidlGiven :1; - unsigned B4SOIlagislGiven :1; - unsigned B4SOIlbgislGiven :1; - unsigned B4SOIlcgislGiven :1; - unsigned B4SOIlegislGiven :1; - unsigned B4SOIlrgislGiven :1; - unsigned B4SOIlkgislGiven :1; - unsigned B4SOIlfgislGiven :1; - unsigned B4SOIlntunGiven :1; /* v4.0 */ - unsigned B4SOIlntundGiven :1; /* v4.0 */ - unsigned B4SOIlndiodeGiven :1; /* v4.0 */ - unsigned B4SOIlndiodedGiven :1; /* v4.0 */ - unsigned B4SOIlnrecf0Given :1; /* v4.0 */ - unsigned B4SOIlnrecf0dGiven :1; /* v4.0 */ - unsigned B4SOIlnrecr0Given :1; /* v4.0 */ - unsigned B4SOIlnrecr0dGiven :1; /* v4.0 */ - unsigned B4SOIlisbjtGiven :1; - unsigned B4SOIlidbjtGiven :1; /* v4.0 */ - unsigned B4SOIlisdifGiven :1; - unsigned B4SOIliddifGiven :1; /* v4.0 */ - unsigned B4SOIlisrecGiven :1; - unsigned B4SOIlidrecGiven :1; /* v4.0 */ - unsigned B4SOIlistunGiven :1; - unsigned B4SOIlidtunGiven :1; /* v4.0 */ - unsigned B4SOIlvrec0Given :1; /* v4.0 */ - unsigned B4SOIlvrec0dGiven :1; /* v4.0 */ - unsigned B4SOIlvtun0Given :1; /* v4.0 */ - unsigned B4SOIlvtun0dGiven :1; /* v4.0 */ - unsigned B4SOIlnbjtGiven :1; - unsigned B4SOIllbjt0Given :1; - unsigned B4SOIlvabjtGiven :1; - unsigned B4SOIlaelyGiven :1; - unsigned B4SOIlahliGiven :1; /* v4.0 */ - unsigned B4SOIlahlidGiven :1; /* v4.0 */ -/* v3.1 added for RF */ - unsigned B4SOIlxrcrg1Given :1; - unsigned B4SOIlxrcrg2Given :1; -/* v3.1 added for RF end */ - - /* CV model */ - unsigned B4SOIlvsdfbGiven :1; - unsigned B4SOIlvsdthGiven :1; - unsigned B4SOIldelvtGiven :1; - unsigned B4SOIlacdeGiven :1; - unsigned B4SOIlmoinGiven :1; - unsigned B4SOIlnoffGiven :1; /* v3.2 */ - - /* Width Dependence */ -/* v3.1 */ - unsigned B4SOIwxjGiven :1; - unsigned B4SOIwalphaGB1Given :1; - unsigned B4SOIwbetaGB1Given :1; - unsigned B4SOIwalphaGB2Given :1; - unsigned B4SOIwbetaGB2Given :1; - unsigned B4SOIwaigbcp2Given :1; /* 4.1 */ - unsigned B4SOIwbigbcp2Given :1; /* 4.1 */ - unsigned B4SOIwcigbcp2Given :1; /* 4.1 */ - unsigned B4SOIwndifGiven :1; - unsigned B4SOIwntrecfGiven :1; - unsigned B4SOIwntrecrGiven :1; - unsigned B4SOIwxbjtGiven :1; - unsigned B4SOIwxdifGiven :1; - unsigned B4SOIwxrecGiven :1; - unsigned B4SOIwxtunGiven :1; - unsigned B4SOIwxdifdGiven :1; - unsigned B4SOIwxrecdGiven :1; - unsigned B4SOIwxtundGiven :1; - unsigned B4SOIwcgslGiven :1; - unsigned B4SOIwcgdlGiven :1; - unsigned B4SOIwckappaGiven :1; - unsigned B4SOIwua1Given :1; - unsigned B4SOIwub1Given :1; - unsigned B4SOIwuc1Given :1; - unsigned B4SOIwuteGiven :1; - unsigned B4SOIwkt1Given :1; - unsigned B4SOIwkt1lGiven :1; - unsigned B4SOIwkt2Given :1; - unsigned B4SOIwatGiven :1; - unsigned B4SOIwprtGiven :1; - -/* v3.0 */ - unsigned B4SOIwaigcGiven :1; - unsigned B4SOIwbigcGiven :1; - unsigned B4SOIwcigcGiven :1; - unsigned B4SOIwaigsdGiven :1; - unsigned B4SOIwbigsdGiven :1; - unsigned B4SOIwcigsdGiven :1; - unsigned B4SOIwnigcGiven :1; - unsigned B4SOIwpigcdGiven :1; - unsigned B4SOIwpoxedgeGiven :1; - - unsigned B4SOIwnpeakGiven :1; - unsigned B4SOIwnsubGiven :1; - unsigned B4SOIwngateGiven :1; - unsigned B4SOIwnsdGiven :1; - unsigned B4SOIwvth0Given :1; - unsigned B4SOIwvfbGiven :1; /* v4.1 */ - unsigned B4SOIwk1Given :1; - unsigned B4SOIwk1w1Given :1; - unsigned B4SOIwk1w2Given :1; - unsigned B4SOIwk2Given :1; - unsigned B4SOIwk3Given :1; - unsigned B4SOIwk3bGiven :1; - unsigned B4SOIwkb1Given :1; - unsigned B4SOIww0Given :1; - unsigned B4SOIwlpe0Given :1; - unsigned B4SOIwdvt0Given :1; - unsigned B4SOIwdvt1Given :1; - unsigned B4SOIwdvt2Given :1; - unsigned B4SOIwdvt0wGiven :1; - unsigned B4SOIwdvt1wGiven :1; - unsigned B4SOIwdvt2wGiven :1; - unsigned B4SOIwu0Given :1; - unsigned B4SOIwuaGiven :1; - unsigned B4SOIwubGiven :1; - unsigned B4SOIwucGiven :1; - unsigned B4SOIwvsatGiven :1; - unsigned B4SOIwa0Given :1; - unsigned B4SOIwagsGiven :1; - unsigned B4SOIwb0Given :1; - unsigned B4SOIwb1Given :1; - unsigned B4SOIwketaGiven :1; - unsigned B4SOIwketasGiven :1; - unsigned B4SOIwa1Given :1; - unsigned B4SOIwa2Given :1; - unsigned B4SOIwrdswGiven :1; - unsigned B4SOIwrdwGiven :1; /* v4.0 for rdsMod = 1 */ - unsigned B4SOIwrswGiven :1; /* v4.0 for rdsMod = 1 */ - unsigned B4SOIwprwbGiven :1; - unsigned B4SOIwprwgGiven :1; - unsigned B4SOIwwrGiven :1; - unsigned B4SOIwnfactorGiven :1; - unsigned B4SOIwdwgGiven :1; - unsigned B4SOIwdwbGiven :1; - unsigned B4SOIwvoffGiven :1; - unsigned B4SOIweta0Given :1; - unsigned B4SOIwetabGiven :1; - unsigned B4SOIwdsubGiven :1; - unsigned B4SOIwcitGiven :1; - unsigned B4SOIwcdscGiven :1; - unsigned B4SOIwcdscbGiven :1; - unsigned B4SOIwcdscdGiven :1; - unsigned B4SOIwpclmGiven :1; - unsigned B4SOIwpdibl1Given :1; - unsigned B4SOIwpdibl2Given :1; - unsigned B4SOIwpdiblbGiven :1; - unsigned B4SOIwdroutGiven :1; - unsigned B4SOIwpvagGiven :1; - unsigned B4SOIwdeltaGiven :1; - unsigned B4SOIwalpha0Given :1; - unsigned B4SOIwfbjtiiGiven :1; - /*4.1 Iii model*/ - unsigned B4SOIwebjtiiGiven :1; - unsigned B4SOIwcbjtiiGiven :1; - unsigned B4SOIwvbciGiven :1; - unsigned B4SOIwabjtiiGiven :1; - unsigned B4SOIwmbjtiiGiven :1; - - unsigned B4SOIwbeta0Given :1; - unsigned B4SOIwbeta1Given :1; - unsigned B4SOIwbeta2Given :1; - unsigned B4SOIwvdsatii0Given :1; - unsigned B4SOIwliiGiven :1; - unsigned B4SOIwesatiiGiven :1; - unsigned B4SOIwsii0Given :1; - unsigned B4SOIwsii1Given :1; - unsigned B4SOIwsii2Given :1; - unsigned B4SOIwsiidGiven :1; - unsigned B4SOIwagidlGiven :1; - unsigned B4SOIwbgidlGiven :1; - unsigned B4SOIwcgidlGiven :1; - unsigned B4SOIwegidlGiven :1; - unsigned B4SOIwrgidlGiven :1; - unsigned B4SOIwkgidlGiven :1; - unsigned B4SOIwfgidlGiven :1; - unsigned B4SOIwagislGiven :1; - unsigned B4SOIwbgislGiven :1; - unsigned B4SOIwcgislGiven :1; - unsigned B4SOIwegislGiven :1; - unsigned B4SOIwrgislGiven :1; - unsigned B4SOIwkgislGiven :1; - unsigned B4SOIwfgislGiven :1; - unsigned B4SOIwntunGiven :1; /* v4.0 */ - unsigned B4SOIwntundGiven :1; /* v4.0 */ - unsigned B4SOIwndiodeGiven :1; /* v4.0 */ - unsigned B4SOIwndiodedGiven :1; /* v4.0 */ - unsigned B4SOIwnrecf0Given :1; /* v4.0 */ - unsigned B4SOIwnrecf0dGiven :1; /* v4.0 */ - unsigned B4SOIwnrecr0Given :1; /* v4.0 */ - unsigned B4SOIwnrecr0dGiven :1; /* v4.0 */ - unsigned B4SOIwisbjtGiven :1; - unsigned B4SOIwidbjtGiven :1; /* v4.0 */ - unsigned B4SOIwisdifGiven :1; - unsigned B4SOIwiddifGiven :1; /* v4.0 */ - unsigned B4SOIwisrecGiven :1; - unsigned B4SOIwidrecGiven :1; /* v4.0 */ - unsigned B4SOIwistunGiven :1; - unsigned B4SOIwidtunGiven :1; /* v4.0 */ - unsigned B4SOIwvrec0Given :1; /* v4.0 */ - unsigned B4SOIwvrec0dGiven :1; /* v4.0 */ - unsigned B4SOIwvtun0Given :1; /* v4.0 */ - unsigned B4SOIwvtun0dGiven :1; /* v4.0 */ - unsigned B4SOIwnbjtGiven :1; - unsigned B4SOIwlbjt0Given :1; - unsigned B4SOIwvabjtGiven :1; - unsigned B4SOIwaelyGiven :1; - unsigned B4SOIwahliGiven :1; /* v4.0 */ - unsigned B4SOIwahlidGiven :1; /* v4.0 */ -/* v3.1 added for RF */ - unsigned B4SOIwxrcrg1Given :1; - unsigned B4SOIwxrcrg2Given :1; -/* v3.1 added for RF end */ - - /* CV model */ - unsigned B4SOIwvsdfbGiven :1; - unsigned B4SOIwvsdthGiven :1; - unsigned B4SOIwdelvtGiven :1; - unsigned B4SOIwacdeGiven :1; - unsigned B4SOIwmoinGiven :1; - unsigned B4SOIwnoffGiven :1; /* v3.2 */ - - /* Cross-term Dependence */ -/* v3.1 */ - unsigned B4SOIpxjGiven :1; - unsigned B4SOIpalphaGB1Given :1; - unsigned B4SOIpbetaGB1Given :1; - unsigned B4SOIpalphaGB2Given :1; - unsigned B4SOIpbetaGB2Given :1; - unsigned B4SOIpaigbcp2Given :1; /* 4.1 */ - unsigned B4SOIpbigbcp2Given :1; /* 4.1 */ - unsigned B4SOIpcigbcp2Given :1; /* 4.1 */ - unsigned B4SOIpndifGiven :1; - unsigned B4SOIpntrecfGiven :1; - unsigned B4SOIpntrecrGiven :1; - unsigned B4SOIpxbjtGiven :1; - unsigned B4SOIpxdifGiven :1; - unsigned B4SOIpxrecGiven :1; - unsigned B4SOIpxtunGiven :1; - unsigned B4SOIpxdifdGiven :1; - unsigned B4SOIpxrecdGiven :1; - unsigned B4SOIpxtundGiven :1; - unsigned B4SOIpcgslGiven :1; - unsigned B4SOIpcgdlGiven :1; - unsigned B4SOIpckappaGiven :1; - unsigned B4SOIpua1Given :1; - unsigned B4SOIpub1Given :1; - unsigned B4SOIpuc1Given :1; - unsigned B4SOIputeGiven :1; - unsigned B4SOIpkt1Given :1; - unsigned B4SOIpkt1lGiven :1; - unsigned B4SOIpkt2Given :1; - unsigned B4SOIpatGiven :1; - unsigned B4SOIpprtGiven :1; - -/* v3.0 */ - unsigned B4SOIpaigcGiven :1; - unsigned B4SOIpbigcGiven :1; - unsigned B4SOIpcigcGiven :1; - unsigned B4SOIpaigsdGiven :1; - unsigned B4SOIpbigsdGiven :1; - unsigned B4SOIpcigsdGiven :1; - unsigned B4SOIpnigcGiven :1; - unsigned B4SOIppigcdGiven :1; - unsigned B4SOIppoxedgeGiven :1; - - unsigned B4SOIpnpeakGiven :1; - unsigned B4SOIpnsubGiven :1; - unsigned B4SOIpngateGiven :1; - unsigned B4SOIpnsdGiven :1; - unsigned B4SOIpvth0Given :1; - unsigned B4SOIpvfbGiven :1; /* v4.1 */ - unsigned B4SOIpk1Given :1; - unsigned B4SOIpk1w1Given :1; - unsigned B4SOIpk1w2Given :1; - unsigned B4SOIpk2Given :1; - unsigned B4SOIpk3Given :1; - unsigned B4SOIpk3bGiven :1; - unsigned B4SOIpkb1Given :1; - unsigned B4SOIpw0Given :1; - unsigned B4SOIplpe0Given :1; - unsigned B4SOIpdvt0Given :1; - unsigned B4SOIpdvt1Given :1; - unsigned B4SOIpdvt2Given :1; - unsigned B4SOIpdvt0wGiven :1; - unsigned B4SOIpdvt1wGiven :1; - unsigned B4SOIpdvt2wGiven :1; - unsigned B4SOIpu0Given :1; - unsigned B4SOIpuaGiven :1; - unsigned B4SOIpubGiven :1; - unsigned B4SOIpucGiven :1; - unsigned B4SOIpvsatGiven :1; - unsigned B4SOIpa0Given :1; - unsigned B4SOIpagsGiven :1; - unsigned B4SOIpb0Given :1; - unsigned B4SOIpb1Given :1; - unsigned B4SOIpketaGiven :1; - unsigned B4SOIpketasGiven :1; - unsigned B4SOIpa1Given :1; - unsigned B4SOIpa2Given :1; - unsigned B4SOIprdswGiven :1; - unsigned B4SOIprdwGiven :1; /* v4.0 for rdsMod = 1 */ - unsigned B4SOIprswGiven :1; /* v4.0 for rdsMod = 1 */ - unsigned B4SOIpprwbGiven :1; - unsigned B4SOIpprwgGiven :1; - unsigned B4SOIpwrGiven :1; - unsigned B4SOIpnfactorGiven :1; - unsigned B4SOIpdwgGiven :1; - unsigned B4SOIpdwbGiven :1; - unsigned B4SOIpvoffGiven :1; - unsigned B4SOIpeta0Given :1; - unsigned B4SOIpetabGiven :1; - unsigned B4SOIpdsubGiven :1; - unsigned B4SOIpcitGiven :1; - unsigned B4SOIpcdscGiven :1; - unsigned B4SOIpcdscbGiven :1; - unsigned B4SOIpcdscdGiven :1; - unsigned B4SOIppclmGiven :1; - unsigned B4SOIppdibl1Given :1; - unsigned B4SOIppdibl2Given :1; - unsigned B4SOIppdiblbGiven :1; - unsigned B4SOIpdroutGiven :1; - unsigned B4SOIppvagGiven :1; - unsigned B4SOIpdeltaGiven :1; - unsigned B4SOIpalpha0Given :1; - unsigned B4SOIpfbjtiiGiven :1; - /*4.1 Iii model*/ - unsigned B4SOIpebjtiiGiven :1; - unsigned B4SOIpcbjtiiGiven :1; - unsigned B4SOIpvbciGiven :1; - unsigned B4SOIpabjtiiGiven :1; - unsigned B4SOIpmbjtiiGiven :1; - - unsigned B4SOIpbeta0Given :1; - unsigned B4SOIpbeta1Given :1; - unsigned B4SOIpbeta2Given :1; - unsigned B4SOIpvdsatii0Given :1; - unsigned B4SOIpliiGiven :1; - unsigned B4SOIpesatiiGiven :1; - unsigned B4SOIpsii0Given :1; - unsigned B4SOIpsii1Given :1; - unsigned B4SOIpsii2Given :1; - unsigned B4SOIpsiidGiven :1; - unsigned B4SOIpagidlGiven :1; - unsigned B4SOIpbgidlGiven :1; - unsigned B4SOIpcgidlGiven :1; - unsigned B4SOIpegidlGiven :1; - unsigned B4SOIprgidlGiven :1; - unsigned B4SOIpkgidlGiven :1; - unsigned B4SOIpfgidlGiven :1; - unsigned B4SOIpagislGiven :1; - unsigned B4SOIpbgislGiven :1; - unsigned B4SOIpcgislGiven :1; - unsigned B4SOIpegislGiven :1; - unsigned B4SOIprgislGiven :1; - unsigned B4SOIpkgislGiven :1; - unsigned B4SOIpfgislGiven :1; - unsigned B4SOIpntunGiven :1; /* v4.0 */ - unsigned B4SOIpntundGiven :1; /* v4.0 */ - unsigned B4SOIpndiodeGiven :1; /* v4.0 */ - unsigned B4SOIpndiodedGiven :1; /* v4.0 */ - unsigned B4SOIpnrecf0Given :1; /* v4.0 */ - unsigned B4SOIpnrecf0dGiven :1; /* v4.0 */ - unsigned B4SOIpnrecr0Given :1; /* v4.0 */ - unsigned B4SOIpnrecr0dGiven :1; /* v4.0 */ - unsigned B4SOIpisbjtGiven :1; - unsigned B4SOIpidbjtGiven :1; /* v4.0 */ - unsigned B4SOIpisdifGiven :1; - unsigned B4SOIpiddifGiven :1; /* v4.0 */ - unsigned B4SOIpisrecGiven :1; - unsigned B4SOIpidrecGiven :1; /* v4.0 */ - unsigned B4SOIpistunGiven :1; - unsigned B4SOIpidtunGiven :1; /* v4.0 */ - unsigned B4SOIpvrec0Given :1; /* v4.0 */ - unsigned B4SOIpvrec0dGiven :1; /* v4.0 */ - unsigned B4SOIpvtun0Given :1; /* v4.0 */ - unsigned B4SOIpvtun0dGiven :1; /* v4.0 */ - unsigned B4SOIpnbjtGiven :1; - unsigned B4SOIplbjt0Given :1; - unsigned B4SOIpvabjtGiven :1; - unsigned B4SOIpaelyGiven :1; - unsigned B4SOIpahliGiven :1; /* v4.0 */ - unsigned B4SOIpahlidGiven :1; /* v4.0 */ -/* v3.1 added for RF */ - unsigned B4SOIpxrcrg1Given :1; - unsigned B4SOIpxrcrg2Given :1; -/* v3.1 added for RF end */ - - /* CV model */ - unsigned B4SOIpvsdfbGiven :1; - unsigned B4SOIpvsdthGiven :1; - unsigned B4SOIpdelvtGiven :1; - unsigned B4SOIpacdeGiven :1; - unsigned B4SOIpmoinGiven :1; - unsigned B4SOIpnoffGiven :1;/* v3.2 */ - -/* Added for binning - END2 */ - - unsigned B4SOIuseFringeGiven :1; - - unsigned B4SOItnomGiven :1; - unsigned B4SOIcgsoGiven :1; - unsigned B4SOIcgdoGiven :1; - unsigned B4SOIcgeoGiven :1; - - unsigned B4SOIxpartGiven :1; - unsigned B4SOIsheetResistanceGiven :1; - unsigned B4SOIGatesidewallJctSPotentialGiven :1; /* v4.0 */ - unsigned B4SOIGatesidewallJctDPotentialGiven :1; /* v4.0 */ - unsigned B4SOIbodyJctGateSideSGradingCoeffGiven :1; /* v4.0 */ - unsigned B4SOIbodyJctGateSideDGradingCoeffGiven :1; /* v4.0 */ - unsigned B4SOIunitLengthGateSidewallJctCapSGiven :1; /* v4.0 */ - unsigned B4SOIunitLengthGateSidewallJctCapDGiven :1; /* v4.0 */ - unsigned B4SOIcsdeswGiven :1; - - unsigned B4SOIoxideTrapDensityAGiven :1; - unsigned B4SOIoxideTrapDensityBGiven :1; - unsigned B4SOIoxideTrapDensityCGiven :1; - unsigned B4SOIemGiven :1; - unsigned B4SOIefGiven :1; - unsigned B4SOIafGiven :1; - unsigned B4SOIkfGiven :1; - unsigned B4SOInoifGiven :1; - unsigned B4SOIbfGiven :1; /* v4.0 */ - unsigned B4SOIw0flkGiven :1; /* v4.0 */ - unsigned B4SOIfrbodyGiven :1; /* v4.0 */ - - unsigned B4SOILintGiven :1; - unsigned B4SOILlGiven :1; - unsigned B4SOILlcGiven :1; /* v2.2.3 */ - unsigned B4SOILlnGiven :1; - unsigned B4SOILwGiven :1; - unsigned B4SOILwcGiven :1; /* v2.2.3 */ - unsigned B4SOILwnGiven :1; - unsigned B4SOILwlGiven :1; - unsigned B4SOILwlcGiven :1; /* v2.2.3 */ - unsigned B4SOILminGiven :1; - unsigned B4SOILmaxGiven :1; - - unsigned B4SOIWintGiven :1; - unsigned B4SOIWlGiven :1; - unsigned B4SOIWlcGiven :1; /* v2.2.3 */ - unsigned B4SOIWlnGiven :1; - unsigned B4SOIWwGiven :1; - unsigned B4SOIWwcGiven :1; /* v2.2.3 */ - unsigned B4SOIWwnGiven :1; - unsigned B4SOIWwlGiven :1; - unsigned B4SOIWwlcGiven :1; /* v2.2.3 */ - unsigned B4SOIWminGiven :1; - unsigned B4SOIWmaxGiven :1; - - /* added for stress effect */ - unsigned B4SOIsarefGiven :1; - unsigned B4SOIsbrefGiven :1; - unsigned B4SOIwlodGiven :1; - unsigned B4SOIku0Given :1; - unsigned B4SOIkvsatGiven :1; - unsigned B4SOIkvth0Given :1; - unsigned B4SOItku0Given :1; - unsigned B4SOIllodku0Given :1; - unsigned B4SOIwlodku0Given :1; - unsigned B4SOIllodvthGiven :1; - unsigned B4SOIwlodvthGiven :1; - unsigned B4SOIlku0Given :1; - unsigned B4SOIwku0Given :1; - unsigned B4SOIpku0Given :1; - unsigned B4SOIlkvth0Given :1; - unsigned B4SOIwkvth0Given :1; - unsigned B4SOIpkvth0Given :1; - unsigned B4SOIstk2Given :1; - unsigned B4SOIlodk2Given :1; - unsigned B4SOIsteta0Given :1; - unsigned B4SOIlodeta0Given :1; - /* v4.0 added for stress effect end */ - unsigned B4SOIlpebGiven :1; /* v4.0 for vth */ - unsigned B4SOIllpebGiven :1; /* v4.0 for vth */ - unsigned B4SOIwlpebGiven :1; /* v4.0 for vth */ - unsigned B4SOIplpebGiven :1; /* v4.0 for vth */ - unsigned B4SOIdvtp0Given :1; /* v4.0 for vth */ - unsigned B4SOIldvtp0Given :1; /* v4.0 for vth */ - unsigned B4SOIwdvtp0Given :1; /* v4.0 for vth */ - unsigned B4SOIpdvtp0Given :1; /* v4.0 for vth */ - unsigned B4SOIdvtp1Given :1; /* v4.0 for vth */ - unsigned B4SOIldvtp1Given :1; /* v4.0 for vth */ - unsigned B4SOIwdvtp1Given :1; /* v4.0 for vth */ - unsigned B4SOIpdvtp1Given :1; /* v4.0 for vth */ - unsigned B4SOIdvtp2Given :1; /* v4.1 for vth */ - unsigned B4SOIldvtp2Given :1; /* v4.1 for vth */ - unsigned B4SOIwdvtp2Given :1; /* v4.1 for vth */ - unsigned B4SOIpdvtp2Given :1; /* v4.1 for vth */ - unsigned B4SOIdvtp3Given :1; /* v4.1 for vth */ - unsigned B4SOIldvtp3Given :1; /* v4.1 for vth */ - unsigned B4SOIwdvtp3Given :1; /* v4.1 for vth */ - unsigned B4SOIpdvtp3Given :1; /* v4.1 for vth */ - unsigned B4SOIdvtp4Given :1; /* v4.1 for vth */ - unsigned B4SOIldvtp4Given :1; /* v4.1 for vth */ - unsigned B4SOIwdvtp4Given :1; /* v4.1 for vth */ - unsigned B4SOIpdvtp4Given :1; /* v4.1 for vth */ - unsigned B4SOIminvGiven :1; /* v4.0 for Vgsteff */ - unsigned B4SOIlminvGiven :1; /* v4.0 for Vgsteff */ - unsigned B4SOIwminvGiven :1; /* v4.0 for Vgsteff */ - unsigned B4SOIpminvGiven :1; /* v4.0 for Vgsteff */ - unsigned B4SOIfproutGiven :1; /* v4.0 for DITS in ID */ - unsigned B4SOIlfproutGiven :1; /* v4.0 for DITS in ID */ - unsigned B4SOIwfproutGiven :1; /* v4.0 for DITS in ID */ - unsigned B4SOIpfproutGiven :1; /* v4.0 for DITS in ID */ - unsigned B4SOIpditsGiven :1; /* v4.0 for DITS in ID */ - unsigned B4SOIlpditsGiven :1; /* v4.0 for DITS in ID */ - unsigned B4SOIwpditsGiven :1; /* v4.0 for DITS in ID */ - unsigned B4SOIppditsGiven :1; /* v4.0 for DITS in ID */ - unsigned B4SOIpditsdGiven :1; /* v4.0 for DITS in ID */ - unsigned B4SOIlpditsdGiven :1; /* v4.0 for DITS in ID */ - unsigned B4SOIwpditsdGiven :1; /* v4.0 for DITS in ID */ - unsigned B4SOIppditsdGiven :1; /* v4.0 for DITS in ID */ - unsigned B4SOIpditslGiven :1; /* v4.0 for DITS in ID */ - -} B4SOImodel; - - -#ifndef NMOS -#define NMOS 1 -#define PMOS -1 -#endif /*NMOS*/ - - -/* device parameters */ -#define B4SOI_W 1 -#define B4SOI_L 2 -#define B4SOI_M 47 -#define B4SOI_AS 3 -#define B4SOI_AD 4 -#define B4SOI_PS 5 -#define B4SOI_PD 6 -#define B4SOI_NRS 7 -#define B4SOI_NRD 8 -#define B4SOI_OFF 9 -#define B4SOI_IC_VBS 10 -#define B4SOI_IC_VDS 11 -#define B4SOI_IC_VGS 12 -#define B4SOI_IC_VES 13 -#define B4SOI_IC_VPS 14 -#define B4SOI_BJTOFF 15 -#define B4SOI_RTH0 16 -#define B4SOI_CTH0 17 -#define B4SOI_NRB 18 -#define B4SOI_IC 19 -#define B4SOI_NQSMOD 20 -#define B4SOI_DEBUG 21 - -/* v2.0 release */ -#define B4SOI_NBC 22 -#define B4SOI_NSEG 23 -#define B4SOI_PDBCP 24 -#define B4SOI_PSBCP 25 -#define B4SOI_AGBCP 26 -#define B4SOI_AEBCP 27 -#define B4SOI_VBSUSR 28 -#define B4SOI_TNODEOUT 29 -#define B4SOI_FRBODY 30 /* v2.2.2 */ -#define B4SOI_RGATEMOD 31 /* v3.1 */ -#define B4SOI_SOIMOD 32 /* v3.2 */ -#define B4SOI_NF 33 /* v4.0 */ -#define B4SOI_RBODYMOD 34 /* v4.0 */ -#define B4SOI_RBDB 35 /* v4.0 */ -#define B4SOI_RBSB 36 /* v4.0 */ -#define B4SOI_CJSB 37 /* v4.0 */ -#define B4SOI_CJDB 38 /* v4.0 */ -#define B4SOI_SA 41 /* v4.0 */ -#define B4SOI_SB 42 /* v4.0 */ -#define B4SOI_SD 43 /* v4.0 */ -#define B4SOI_DELVTO 44 /* v4.0 */ -#define B4SOI_AGBCPD 45 /* v4.0 */ -#define B4SOI_AGBCP2 46 /* v4.1 improvement on BC */ - - -/* model parameters */ - - -#define B4SOI_MOD_PFGIDL 65 -#define B4SOI_MOD_WFGIDL 66 -#define B4SOI_MOD_LFGIDL 67 -#define B4SOI_MOD_FGIDL 68 -#define B4SOI_MOD_PKGIDL 69 -#define B4SOI_MOD_WKGIDL 70 -#define B4SOI_MOD_LKGIDL 71 -#define B4SOI_MOD_KGIDL 72 -#define B4SOI_MOD_PRGIDL 73 -#define B4SOI_MOD_WRGIDL 74 -#define B4SOI_MOD_LRGIDL 75 -#define B4SOI_MOD_RGIDL 76 -#define B4SOI_MOD_GIDLMOD 77 -#define B4SOI_MOD_PNSD 78 -#define B4SOI_MOD_WNSD 79 -#define B4SOI_MOD_LNSD 80 -#define B4SOI_MOD_NSD 81 -#define B4SOI_MOD_PHIG 82 -#define B4SOI_MOD_EASUB 83 -#define B4SOI_MOD_TBGBSUB 84 -#define B4SOI_MOD_TBGASUB 85 -#define B4SOI_MOD_BG0SUB 86 -#define B4SOI_MOD_NI0SUB 87 -#define B4SOI_MOD_EPSRGATE 88 -#define B4SOI_MOD_ADOS 89 -#define B4SOI_MOD_BDOS 90 -#define B4SOI_MOD_LEFFEOT 91 -#define B4SOI_MOD_WEFFEOT 92 -#define B4SOI_MOD_VDDEOT 93 -#define B4SOI_MOD_TEMPEOT 94 -#define B4SOI_MOD_TOXP 95 -#define B4SOI_MOD_ETSI 96 -#define B4SOI_MOD_EOT 97 -#define B4SOI_MOD_EPSROX 98 -#define B4SOI_MOD_EPSRSUB 99 -#define B4SOI_MOD_MTRLMOD 100 /*4.1*/ -#define B4SOI_MOD_CAPMOD 101 -#define B4SOI_MOD_NQSMOD 102 -#define B4SOI_MOD_MOBMOD 103 -/*#define B4SOI_MOD_NOIMOD 104 v3.2 */ -#define B4SOI_MOD_RDSMOD 104 /* v4.0 */ -#define B4SOI_MOD_SHMOD 105 -/*#define B4SOI_MOD_DDMOD 106 v4.2 ddmod is not used any more*/ -#define B4SOI_MOD_TOX 107 - -#define B4SOI_MOD_CDSC 108 -#define B4SOI_MOD_CDSCB 109 -#define B4SOI_MOD_CIT 110 -#define B4SOI_MOD_NFACTOR 111 -#define B4SOI_MOD_XJ 112 -#define B4SOI_MOD_VSAT 113 -#define B4SOI_MOD_AT 114 -#define B4SOI_MOD_A0 115 -#define B4SOI_MOD_A1 116 -#define B4SOI_MOD_A2 117 -#define B4SOI_MOD_KETA 118 -#define B4SOI_MOD_NSUB 119 -#define B4SOI_MOD_NPEAK 120 -#define B4SOI_MOD_NGATE 121 -#define B4SOI_MOD_GAMMA1 122 -#define B4SOI_MOD_GAMMA2 123 -#define B4SOI_MOD_VBX 124 -#define B4SOI_MOD_BINUNIT 125 - -#define B4SOI_MOD_VBM 126 - -#define B4SOI_MOD_XT 127 -#define B4SOI_MOD_K1 129 -#define B4SOI_MOD_KT1 130 -#define B4SOI_MOD_KT1L 131 -#define B4SOI_MOD_K2 132 -#define B4SOI_MOD_KT2 133 -#define B4SOI_MOD_K3 134 -#define B4SOI_MOD_K3B 135 -#define B4SOI_MOD_W0 136 -#define B4SOI_MOD_LPE0 137 - -#define B4SOI_MOD_DVT0 138 -#define B4SOI_MOD_DVT1 139 -#define B4SOI_MOD_DVT2 140 - -#define B4SOI_MOD_DVT0W 141 -#define B4SOI_MOD_DVT1W 142 -#define B4SOI_MOD_DVT2W 143 - -#define B4SOI_MOD_DROUT 144 -#define B4SOI_MOD_DSUB 145 -#define B4SOI_MOD_VTH0 146 -#define B4SOI_MOD_UA 147 -#define B4SOI_MOD_UA1 148 -#define B4SOI_MOD_UB 149 -#define B4SOI_MOD_UB1 150 -#define B4SOI_MOD_UC 151 -#define B4SOI_MOD_UC1 152 -#define B4SOI_MOD_U0 153 -#define B4SOI_MOD_UTE 154 -#define B4SOI_MOD_VOFF 155 -#define B4SOI_MOD_DELTA 156 -#define B4SOI_MOD_RDSW 157 -#define B4SOI_MOD_PRT 158 -#define B4SOI_MOD_LDD 159 -#define B4SOI_MOD_ETA 160 -#define B4SOI_MOD_ETA0 161 -#define B4SOI_MOD_ETAB 162 -#define B4SOI_MOD_PCLM 163 -#define B4SOI_MOD_PDIBL1 164 -#define B4SOI_MOD_PDIBL2 165 -#define B4SOI_MOD_PSCBE1 166 -#define B4SOI_MOD_PSCBE2 167 -#define B4SOI_MOD_PVAG 168 -#define B4SOI_MOD_WR 169 -#define B4SOI_MOD_DWG 170 -#define B4SOI_MOD_DWB 171 -#define B4SOI_MOD_B0 172 -#define B4SOI_MOD_B1 173 -#define B4SOI_MOD_ALPHA0 174 -#define B4SOI_MOD_PDIBLB 178 - -#define B4SOI_MOD_PRWG 179 -#define B4SOI_MOD_PRWB 180 - -#define B4SOI_MOD_CDSCD 181 -#define B4SOI_MOD_AGS 182 - -#define B4SOI_MOD_FRINGE 184 -#define B4SOI_MOD_CGSL 186 -#define B4SOI_MOD_CGDL 187 -#define B4SOI_MOD_CKAPPA 188 -#define B4SOI_MOD_CF 189 -#define B4SOI_MOD_CLC 190 -#define B4SOI_MOD_CLE 191 -#define B4SOI_MOD_PARAMCHK 192 -#define B4SOI_MOD_VERSION 193 - -#define B4SOI_MOD_TBOX 195 -#define B4SOI_MOD_TSI 196 -#define B4SOI_MOD_KB1 197 -#define B4SOI_MOD_KB3 198 -#define B4SOI_MOD_DELP 201 -#define B4SOI_MOD_RBODY 204 -#define B4SOI_MOD_ADICE0 205 -#define B4SOI_MOD_ABP 206 -#define B4SOI_MOD_MXC 207 -#define B4SOI_MOD_RTH0 208 -#define B4SOI_MOD_CTH0 209 -#define B4SOI_MOD_ALPHA1 214 -#define B4SOI_MOD_EGIDL 215 -#define B4SOI_MOD_AGIDL 216 -#define B4SOI_MOD_BGIDL 217 -#define B4SOI_MOD_NDIODES 218 /* v4.0 */ -#define B4SOI_MOD_LDIOF 219 -#define B4SOI_MOD_LDIOR 220 -#define B4SOI_MOD_NTUNS 221 /* v4.0 */ -#define B4SOI_MOD_ISBJT 222 -#define B4SOI_MOD_ISDIF 223 -#define B4SOI_MOD_ISREC 224 -#define B4SOI_MOD_ISTUN 225 -#define B4SOI_MOD_XBJT 226 -#define B4SOI_MOD_TT 232 -#define B4SOI_MOD_VSDTH 233 -#define B4SOI_MOD_VSDFB 234 -#define B4SOI_MOD_ASD 235 -#define B4SOI_MOD_CSDMIN 236 -#define B4SOI_MOD_RBSH 237 -#define B4SOI_MOD_ESATII 238 - - -/* v2.0 release */ -#define B4SOI_MOD_K1W1 239 -#define B4SOI_MOD_K1W2 240 -#define B4SOI_MOD_KETAS 241 -#define B4SOI_MOD_DWBC 242 -#define B4SOI_MOD_BETA0 243 -#define B4SOI_MOD_BETA1 244 -#define B4SOI_MOD_BETA2 245 -#define B4SOI_MOD_VDSATII0 246 -#define B4SOI_MOD_TII 247 -#define B4SOI_MOD_LII 248 -#define B4SOI_MOD_SII0 249 -#define B4SOI_MOD_SII1 250 -#define B4SOI_MOD_SII2 251 -#define B4SOI_MOD_SIID 252 -#define B4SOI_MOD_FBJTII 253 -#define B4SOI_MOD_NRECF0S 255 -#define B4SOI_MOD_NRECR0S 256 -#define B4SOI_MOD_LN 257 -#define B4SOI_MOD_VREC0S 258 -#define B4SOI_MOD_VTUN0S 259 -#define B4SOI_MOD_NBJT 260 -#define B4SOI_MOD_LBJT0 261 -#define B4SOI_MOD_VABJT 262 -#define B4SOI_MOD_AELY 263 -#define B4SOI_MOD_AHLIS 264 /* v4.0 */ -#define B4SOI_MOD_NTRECF 265 -#define B4SOI_MOD_NTRECR 266 -#define B4SOI_MOD_DLCB 267 -#define B4SOI_MOD_FBODY 268 -#define B4SOI_MOD_NDIF 269 -#define B4SOI_MOD_ACDE 272 -#define B4SOI_MOD_MOIN 273 -#define B4SOI_MOD_DELVT 274 -#define B4SOI_MOD_DLBG 275 -#define B4SOI_MOD_LDIF0 276 - - -/* v2.2 release */ -#define B4SOI_MOD_WTH0 277 -#define B4SOI_MOD_RHALO 278 -#define B4SOI_MOD_NTOX 279 -#define B4SOI_MOD_TOXREF 280 -#define B4SOI_MOD_EBG 281 -#define B4SOI_MOD_VEVB 282 -#define B4SOI_MOD_ALPHAGB1 283 -#define B4SOI_MOD_BETAGB1 284 -#define B4SOI_MOD_VGB1 285 -#define B4SOI_MOD_VECB 286 -#define B4SOI_MOD_ALPHAGB2 287 -#define B4SOI_MOD_BETAGB2 288 -#define B4SOI_MOD_VGB2 289 -#define B4SOI_MOD_TOXQM 290 -#define B4SOI_MOD_IGBMOD 291 /* v3.0 */ -#define B4SOI_MOD_VOXH 292 -#define B4SOI_MOD_DELTAVOX 293 -#define B4SOI_MOD_IGCMOD 294 /* v3.0 */ - -/* v3.1 added for RF */ -#define B4SOI_MOD_RGATEMOD 295 -#define B4SOI_MOD_XRCRG1 296 -#define B4SOI_MOD_XRCRG2 297 -#define B4SOI_MOD_RSHG 298 -#define B4SOI_MOD_NGCON 299 -/* v3.1 added for RF end */ - -#define B4SOI_MOD_RBODYMOD 300 /* v4.0 */ - - -/* Added for binning - START3 */ -/* Length dependence */ -#define B4SOI_MOD_LNPEAK 301 -#define B4SOI_MOD_LNSUB 302 -#define B4SOI_MOD_LNGATE 303 -#define B4SOI_MOD_LVTH0 304 -#define B4SOI_MOD_LK1 305 -#define B4SOI_MOD_LK1W1 306 -#define B4SOI_MOD_LK1W2 307 -#define B4SOI_MOD_LK2 308 -#define B4SOI_MOD_LK3 309 -#define B4SOI_MOD_LK3B 310 -#define B4SOI_MOD_LKB1 311 -#define B4SOI_MOD_LW0 312 -#define B4SOI_MOD_LLPE0 313 -#define B4SOI_MOD_LDVT0 314 -#define B4SOI_MOD_LDVT1 315 -#define B4SOI_MOD_LDVT2 316 -#define B4SOI_MOD_LDVT0W 317 -#define B4SOI_MOD_LDVT1W 318 -#define B4SOI_MOD_LDVT2W 319 -#define B4SOI_MOD_LU0 320 -#define B4SOI_MOD_LUA 321 -#define B4SOI_MOD_LUB 322 -#define B4SOI_MOD_LUC 323 -#define B4SOI_MOD_LVSAT 324 -#define B4SOI_MOD_LA0 325 -#define B4SOI_MOD_LAGS 326 -#define B4SOI_MOD_LB0 327 -#define B4SOI_MOD_LB1 328 -#define B4SOI_MOD_LKETA 329 -#define B4SOI_MOD_LKETAS 330 -#define B4SOI_MOD_LA1 331 -#define B4SOI_MOD_LA2 332 -#define B4SOI_MOD_LRDSW 333 -#define B4SOI_MOD_LPRWB 334 -#define B4SOI_MOD_LPRWG 335 -#define B4SOI_MOD_LWR 336 -#define B4SOI_MOD_LNFACTOR 337 -#define B4SOI_MOD_LDWG 338 -#define B4SOI_MOD_LDWB 339 -#define B4SOI_MOD_LVOFF 340 -#define B4SOI_MOD_LETA0 341 -#define B4SOI_MOD_LETAB 342 -#define B4SOI_MOD_LDSUB 343 -#define B4SOI_MOD_LCIT 344 -#define B4SOI_MOD_LCDSC 345 -#define B4SOI_MOD_LCDSCB 346 -#define B4SOI_MOD_LCDSCD 347 -#define B4SOI_MOD_LPCLM 348 -#define B4SOI_MOD_LPDIBL1 349 -#define B4SOI_MOD_LPDIBL2 350 -#define B4SOI_MOD_LPDIBLB 351 -#define B4SOI_MOD_LDROUT 352 -#define B4SOI_MOD_LPVAG 353 -#define B4SOI_MOD_LDELTA 354 -#define B4SOI_MOD_LALPHA0 355 -#define B4SOI_MOD_LFBJTII 356 -#define B4SOI_MOD_LBETA0 357 -#define B4SOI_MOD_LBETA1 358 -#define B4SOI_MOD_LBETA2 359 -#define B4SOI_MOD_LVDSATII0 360 -#define B4SOI_MOD_LLII 361 -#define B4SOI_MOD_LESATII 362 -#define B4SOI_MOD_LSII0 363 -#define B4SOI_MOD_LSII1 364 -#define B4SOI_MOD_LSII2 365 -#define B4SOI_MOD_LSIID 366 -#define B4SOI_MOD_LAGIDL 367 -#define B4SOI_MOD_LBGIDL 368 -#define B4SOI_MOD_LEGIDL 369 -#define B4SOI_MOD_LNTUNS 370 /* v4.0 */ -#define B4SOI_MOD_LNDIODES 371 -#define B4SOI_MOD_LNRECF0S 372 -#define B4SOI_MOD_LNRECR0S 373 -#define B4SOI_MOD_LISBJT 374 -#define B4SOI_MOD_LISDIF 375 -#define B4SOI_MOD_LISREC 376 -#define B4SOI_MOD_LISTUN 377 -#define B4SOI_MOD_LVREC0S 378 -#define B4SOI_MOD_LVTUN0S 379 -#define B4SOI_MOD_LNBJT 380 -#define B4SOI_MOD_LLBJT0 381 -#define B4SOI_MOD_LVABJT 382 -#define B4SOI_MOD_LAELY 383 -#define B4SOI_MOD_LAHLIS 384 /* v4.0 */ -#define B4SOI_MOD_LVSDFB 385 -#define B4SOI_MOD_LVSDTH 386 -#define B4SOI_MOD_LDELVT 387 -#define B4SOI_MOD_LACDE 388 -#define B4SOI_MOD_LMOIN 389 - -/* v3.1 added for RF */ -#define B4SOI_MOD_LXRCRG1 390 -#define B4SOI_MOD_LXRCRG2 391 -#define B4SOI_MOD_XGW 392 -#define B4SOI_MOD_XGL 393 -/* v3.1 added for RF end */ -#define B4SOI_MOD_CFRCOEFF 394 /* v4.4 */ - -/* Width dependence */ -#define B4SOI_MOD_WNPEAK 401 -#define B4SOI_MOD_WNSUB 402 -#define B4SOI_MOD_WNGATE 403 -#define B4SOI_MOD_WVTH0 404 -#define B4SOI_MOD_WK1 405 -#define B4SOI_MOD_WK1W1 406 -#define B4SOI_MOD_WK1W2 407 -#define B4SOI_MOD_WK2 408 -#define B4SOI_MOD_WK3 409 -#define B4SOI_MOD_WK3B 410 -#define B4SOI_MOD_WKB1 411 -#define B4SOI_MOD_WW0 412 -#define B4SOI_MOD_WLPE0 413 -#define B4SOI_MOD_WDVT0 414 -#define B4SOI_MOD_WDVT1 415 -#define B4SOI_MOD_WDVT2 416 -#define B4SOI_MOD_WDVT0W 417 -#define B4SOI_MOD_WDVT1W 418 -#define B4SOI_MOD_WDVT2W 419 -#define B4SOI_MOD_WU0 420 -#define B4SOI_MOD_WUA 421 -#define B4SOI_MOD_WUB 422 -#define B4SOI_MOD_WUC 423 -#define B4SOI_MOD_WVSAT 424 -#define B4SOI_MOD_WA0 425 -#define B4SOI_MOD_WAGS 426 -#define B4SOI_MOD_WB0 427 -#define B4SOI_MOD_WB1 428 -#define B4SOI_MOD_WKETA 429 -#define B4SOI_MOD_WKETAS 430 -#define B4SOI_MOD_WA1 431 -#define B4SOI_MOD_WA2 432 -#define B4SOI_MOD_WRDSW 433 -#define B4SOI_MOD_WPRWB 434 -#define B4SOI_MOD_WPRWG 435 -#define B4SOI_MOD_WWR 436 -#define B4SOI_MOD_WNFACTOR 437 -#define B4SOI_MOD_WDWG 438 -#define B4SOI_MOD_WDWB 439 -#define B4SOI_MOD_WVOFF 440 -#define B4SOI_MOD_WETA0 441 -#define B4SOI_MOD_WETAB 442 -#define B4SOI_MOD_WDSUB 443 -#define B4SOI_MOD_WCIT 444 -#define B4SOI_MOD_WCDSC 445 -#define B4SOI_MOD_WCDSCB 446 -#define B4SOI_MOD_WCDSCD 447 -#define B4SOI_MOD_WPCLM 448 -#define B4SOI_MOD_WPDIBL1 449 -#define B4SOI_MOD_WPDIBL2 450 -#define B4SOI_MOD_WPDIBLB 451 -#define B4SOI_MOD_WDROUT 452 -#define B4SOI_MOD_WPVAG 453 -#define B4SOI_MOD_WDELTA 454 -#define B4SOI_MOD_WALPHA0 455 -#define B4SOI_MOD_WFBJTII 456 -#define B4SOI_MOD_WBETA0 457 -#define B4SOI_MOD_WBETA1 458 -#define B4SOI_MOD_WBETA2 459 -#define B4SOI_MOD_WVDSATII0 460 -#define B4SOI_MOD_WLII 461 -#define B4SOI_MOD_WESATII 462 -#define B4SOI_MOD_WSII0 463 -#define B4SOI_MOD_WSII1 464 -#define B4SOI_MOD_WSII2 465 -#define B4SOI_MOD_WSIID 466 -#define B4SOI_MOD_WAGIDL 467 -#define B4SOI_MOD_WBGIDL 468 -#define B4SOI_MOD_WEGIDL 469 -#define B4SOI_MOD_WNTUNS 470 /* v4.0 */ -#define B4SOI_MOD_WNDIODES 471 -#define B4SOI_MOD_WNRECF0S 472 -#define B4SOI_MOD_WNRECR0S 473 -#define B4SOI_MOD_WISBJT 474 -#define B4SOI_MOD_WISDIF 475 -#define B4SOI_MOD_WISREC 476 -#define B4SOI_MOD_WISTUN 477 -#define B4SOI_MOD_WVREC0S 478 -#define B4SOI_MOD_WVTUN0S 479 -#define B4SOI_MOD_WNBJT 480 -#define B4SOI_MOD_WLBJT0 481 -#define B4SOI_MOD_WVABJT 482 -#define B4SOI_MOD_WAELY 483 -#define B4SOI_MOD_WAHLIS 484 /* v4.0 */ -#define B4SOI_MOD_WVSDFB 485 -#define B4SOI_MOD_WVSDTH 486 -#define B4SOI_MOD_WDELVT 487 -#define B4SOI_MOD_WACDE 488 -#define B4SOI_MOD_WMOIN 489 - -/* v3.1 added for RF */ -#define B4SOI_MOD_WXRCRG1 490 -#define B4SOI_MOD_WXRCRG2 491 -/* v3.1 added for RF end */ - -/* Cross-term dependence */ - -#define B4SOI_MOD_PNPEAK 501 -#define B4SOI_MOD_PNSUB 502 -#define B4SOI_MOD_PNGATE 503 -#define B4SOI_MOD_PVTH0 504 -#define B4SOI_MOD_PK1 505 -#define B4SOI_MOD_PK1W1 506 -#define B4SOI_MOD_PK1W2 507 -#define B4SOI_MOD_PK2 508 -#define B4SOI_MOD_PK3 509 -#define B4SOI_MOD_PK3B 510 -#define B4SOI_MOD_PKB1 511 -#define B4SOI_MOD_PW0 512 -#define B4SOI_MOD_PLPE0 513 -#define B4SOI_MOD_PDVT0 514 -#define B4SOI_MOD_PDVT1 515 -#define B4SOI_MOD_PDVT2 516 -#define B4SOI_MOD_PDVT0W 517 -#define B4SOI_MOD_PDVT1W 518 -#define B4SOI_MOD_PDVT2W 519 -#define B4SOI_MOD_PU0 520 -#define B4SOI_MOD_PUA 521 -#define B4SOI_MOD_PUB 522 -#define B4SOI_MOD_PUC 523 -#define B4SOI_MOD_PVSAT 524 -#define B4SOI_MOD_PA0 525 -#define B4SOI_MOD_PAGS 526 -#define B4SOI_MOD_PB0 527 -#define B4SOI_MOD_PB1 528 -#define B4SOI_MOD_PKETA 529 -#define B4SOI_MOD_PKETAS 530 -#define B4SOI_MOD_PA1 531 -#define B4SOI_MOD_PA2 532 -#define B4SOI_MOD_PRDSW 533 -#define B4SOI_MOD_PPRWB 534 -#define B4SOI_MOD_PPRWG 535 -#define B4SOI_MOD_PWR 536 -#define B4SOI_MOD_PNFACTOR 537 -#define B4SOI_MOD_PDWG 538 -#define B4SOI_MOD_PDWB 539 -#define B4SOI_MOD_PVOFF 540 -#define B4SOI_MOD_PETA0 541 -#define B4SOI_MOD_PETAB 542 -#define B4SOI_MOD_PDSUB 543 -#define B4SOI_MOD_PCIT 544 -#define B4SOI_MOD_PCDSC 545 -#define B4SOI_MOD_PCDSCB 546 -#define B4SOI_MOD_PCDSCD 547 -#define B4SOI_MOD_PPCLM 548 -#define B4SOI_MOD_PPDIBL1 549 -#define B4SOI_MOD_PPDIBL2 550 -#define B4SOI_MOD_PPDIBLB 551 -#define B4SOI_MOD_PDROUT 552 -#define B4SOI_MOD_PPVAG 553 -#define B4SOI_MOD_PDELTA 554 -#define B4SOI_MOD_PALPHA0 555 -#define B4SOI_MOD_PFBJTII 556 -#define B4SOI_MOD_PBETA0 557 -#define B4SOI_MOD_PBETA1 558 -#define B4SOI_MOD_PBETA2 559 -#define B4SOI_MOD_PVDSATII0 560 -#define B4SOI_MOD_PLII 561 -#define B4SOI_MOD_PESATII 562 -#define B4SOI_MOD_PSII0 563 -#define B4SOI_MOD_PSII1 564 -#define B4SOI_MOD_PSII2 565 -#define B4SOI_MOD_PSIID 566 -#define B4SOI_MOD_PAGIDL 567 -#define B4SOI_MOD_PBGIDL 568 -#define B4SOI_MOD_PEGIDL 569 -#define B4SOI_MOD_PNTUNS 570 /* v4.0 */ -#define B4SOI_MOD_PNDIODES 571 -#define B4SOI_MOD_PNRECF0S 572 -#define B4SOI_MOD_PNRECR0S 573 -#define B4SOI_MOD_PISBJT 574 -#define B4SOI_MOD_PISDIF 575 -#define B4SOI_MOD_PISREC 576 -#define B4SOI_MOD_PISTUN 577 -#define B4SOI_MOD_PVREC0S 578 -#define B4SOI_MOD_PVTUN0S 579 -#define B4SOI_MOD_PNBJT 580 -#define B4SOI_MOD_PLBJT0 581 -#define B4SOI_MOD_PVABJT 582 -#define B4SOI_MOD_PAELY 583 -#define B4SOI_MOD_PAHLIS 584 /* v4.0 */ -#define B4SOI_MOD_PVSDFB 585 -#define B4SOI_MOD_PVSDTH 586 -#define B4SOI_MOD_PDELVT 587 -#define B4SOI_MOD_PACDE 588 -#define B4SOI_MOD_PMOIN 589 -#define B4SOI_MOD_PXRCRG1 590 /* v3.1 for RF */ -#define B4SOI_MOD_PXRCRG2 591 /* v3.1 for RF */ -#define B4SOI_MOD_EM 592 /* v3.2 for noise */ -#define B4SOI_MOD_EF 593 /* v3.2 for noise */ -#define B4SOI_MOD_AF 594 /* v3.2 for noise */ -#define B4SOI_MOD_KF 595 /* v3.2 for noise */ -#define B4SOI_MOD_NOIF 596 /* v3.2 for noise */ -#define B4SOI_MOD_BF 597 /* v4.0 for noise */ -#define B4SOI_MOD_W0FLK 598 /* v4.0 for noise */ -#define B4SOI_MOD_FRBODY 599 /* v4.0 for Rbody */ -#define B4SOI_MOD_CGIDL 600 /* v4.0 for gidl */ -#define B4SOI_MOD_LCGIDL 601 /* v4.0 for gidl */ -#define B4SOI_MOD_WCGIDL 602 /* v4.0 for gidl */ -#define B4SOI_MOD_PCGIDL 603 /* v4.0 for gidl */ -#define B4SOI_MOD_LPEB 604 /* v4.0 for Vth */ -#define B4SOI_MOD_LLPEB 605 /* v4.0 for Vth */ -#define B4SOI_MOD_WLPEB 606 /* v4.0 for Vth */ -#define B4SOI_MOD_PLPEB 607 /* v4.0 for Vth */ -#define B4SOI_MOD_DVTP0 608 /* v4.0 for Vth */ -#define B4SOI_MOD_LDVTP0 609 /* v4.0 for Vth */ -#define B4SOI_MOD_WDVTP0 610 /* v4.0 for Vth */ -#define B4SOI_MOD_PDVTP0 611 /* v4.0 for Vth */ -#define B4SOI_MOD_DVTP1 612 /* v4.0 for Vth */ -#define B4SOI_MOD_LDVTP1 613 /* v4.0 for Vth */ -#define B4SOI_MOD_WDVTP1 614 /* v4.0 for Vth */ -#define B4SOI_MOD_PDVTP1 615 /* v4.0 for Vth */ -#define B4SOI_MOD_MINV 616 /* v4.0 for Vgsteff */ -#define B4SOI_MOD_LMINV 617 /* v4.0 for Vgsteff */ -#define B4SOI_MOD_WMINV 618 /* v4.0 for Vgsteff */ -#define B4SOI_MOD_PMINV 619 /* v4.0 for Vgsteff */ -#define B4SOI_MOD_FPROUT 620 /* v4.0 for DITS in Id */ -#define B4SOI_MOD_LFPROUT 621 /* v4.0 for DITS in Id */ -#define B4SOI_MOD_WFPROUT 622 /* v4.0 for DITS in Id */ -#define B4SOI_MOD_PFPROUT 623 /* v4.0 for DITS in Id */ -#define B4SOI_MOD_PDITS 624 /* v4.0 for DITS in Id */ -#define B4SOI_MOD_LPDITS 625 /* v4.0 for DITS in Id */ -#define B4SOI_MOD_WPDITS 626 /* v4.0 for DITS in Id */ -#define B4SOI_MOD_PPDITS 627 /* v4.0 for DITS in Id */ -#define B4SOI_MOD_PDITSD 628 /* v4.0 for DITS in Id */ -#define B4SOI_MOD_LPDITSD 629 /* v4.0 for DITS in Id */ -#define B4SOI_MOD_WPDITSD 630 /* v4.0 for DITS in Id */ -#define B4SOI_MOD_PPDITSD 631 /* v4.0 for DITS in Id */ -#define B4SOI_MOD_PDITSL 632 /* v4.0 for DITS in Id */ -#define B4SOI_MOD_NDIODED 633 /* v4.0 */ -#define B4SOI_MOD_LNDIODED 634 /* v4.0 */ -#define B4SOI_MOD_WNDIODED 635 /* v4.0 */ -#define B4SOI_MOD_PNDIODED 636 /* v4.0 */ -#define B4SOI_MOD_IDDIF 637 /* v4.0 */ -#define B4SOI_MOD_LIDDIF 638 /* v4.0 */ -#define B4SOI_MOD_WIDDIF 639 /* v4.0 */ -#define B4SOI_MOD_PIDDIF 640 /* v4.0 */ -#define B4SOI_MOD_IDBJT 641 /* v4.0 */ -#define B4SOI_MOD_LIDBJT 642 /* v4.0 */ -#define B4SOI_MOD_WIDBJT 643 /* v4.0 */ -#define B4SOI_MOD_PIDBJT 644 /* v4.0 */ -#define B4SOI_MOD_IDREC 645 /* v4.0 */ -#define B4SOI_MOD_LIDREC 646 /* v4.0 */ -#define B4SOI_MOD_WIDREC 647 /* v4.0 */ -#define B4SOI_MOD_PIDREC 648 /* v4.0 */ -#define B4SOI_MOD_IDTUN 649 /* v4.0 */ -#define B4SOI_MOD_LIDTUN 650 /* v4.0 */ -#define B4SOI_MOD_WIDTUN 651 /* v4.0 */ -#define B4SOI_MOD_PIDTUN 652 /* v4.0 */ -#define B4SOI_MOD_NRECF0D 653 /* v4.0 */ -#define B4SOI_MOD_LNRECF0D 654 /* v4.0 */ -#define B4SOI_MOD_WNRECF0D 655 /* v4.0 */ -#define B4SOI_MOD_PNRECF0D 656 /* v4.0 */ -#define B4SOI_MOD_NRECR0D 657 /* v4.0 */ -#define B4SOI_MOD_LNRECR0D 658 /* v4.0 */ -#define B4SOI_MOD_WNRECR0D 659 /* v4.0 */ -#define B4SOI_MOD_PNRECR0D 660 /* v4.0 */ -#define B4SOI_MOD_VREC0D 661 /* v4.0 */ -#define B4SOI_MOD_LVREC0D 662 /* v4.0 */ -#define B4SOI_MOD_WVREC0D 663 /* v4.0 */ -#define B4SOI_MOD_PVREC0D 664 /* v4.0 */ -#define B4SOI_MOD_VTUN0D 665 /* v4.0 */ -#define B4SOI_MOD_LVTUN0D 666 /* v4.0 */ -#define B4SOI_MOD_WVTUN0D 667 /* v4.0 */ -#define B4SOI_MOD_PVTUN0D 668 /* v4.0 */ -#define B4SOI_MOD_NTUND 669 /* v4.0 */ -#define B4SOI_MOD_LNTUND 670 /* v4.0 */ -#define B4SOI_MOD_WNTUND 671 /* v4.0 */ -#define B4SOI_MOD_PNTUND 672 /* v4.0 */ -#define B4SOI_MOD_RDW 673 /* v4.0 for rdsMod =1 */ -#define B4SOI_MOD_LRDW 674 /* v4.0 for rdsMod =1 */ -#define B4SOI_MOD_WRDW 675 /* v4.0 for rdsMod =1 */ -#define B4SOI_MOD_PRDW 676 /* v4.0 for rdsMod =1 */ -#define B4SOI_MOD_RSW 677 /* v4.0 for rdsMod =1 */ -#define B4SOI_MOD_LRSW 678 /* v4.0 for rdsMod =1 */ -#define B4SOI_MOD_WRSW 679 /* v4.0 for rdsMod =1 */ -#define B4SOI_MOD_PRSW 680 /* v4.0 for rdsMod =1 */ -#define B4SOI_MOD_RDWMIN 681 /* v4.0 for rdsMod =1 */ -#define B4SOI_MOD_RSWMIN 682 /* v4.0 for rdsMod =1 */ -#define B4SOI_MOD_AHLID 683 /* v4.0 */ -#define B4SOI_MOD_LAHLID 684 /* v4.0 */ -#define B4SOI_MOD_WAHLID 685 /* v4.0 */ -#define B4SOI_MOD_PAHLID 686 /* v4.0 */ -#define B4SOI_MOD_DVTP2 687 /* v4.1 for Vth */ -#define B4SOI_MOD_LDVTP2 688 /* v4.1 for Vth */ -#define B4SOI_MOD_WDVTP2 689 /* v4.1 for Vth */ -#define B4SOI_MOD_PDVTP2 690 /* v4.1 for Vth */ -#define B4SOI_MOD_DVTP3 691 /* v4.1 for Vth */ -#define B4SOI_MOD_LDVTP3 692 /* v4.1 for Vth */ -#define B4SOI_MOD_WDVTP3 693 /* v4.1 for Vth */ -#define B4SOI_MOD_PDVTP3 694 /* v4.1 for Vth */ -#define B4SOI_MOD_DVTP4 695 /* v4.1 for Vth */ -#define B4SOI_MOD_LDVTP4 696 /* v4.1 for Vth */ -#define B4SOI_MOD_WDVTP4 697 /* v4.1 for Vth */ -#define B4SOI_MOD_PDVTP4 698 /* v4.1 for Vth */ -#define B4SOI_MOD_AIGBCP2 10001 /* v4.1 for Ig in AGBCP2 Region */ -#define B4SOI_MOD_LAIGBCP2 10002 /* v4.1 for Ig in AGBCP2 Region */ -#define B4SOI_MOD_WAIGBCP2 10003 /* v4.1 for Ig in AGBCP2 Region */ -#define B4SOI_MOD_PAIGBCP2 10004 /* v4.1 for Ig in AGBCP2 Region */ -#define B4SOI_MOD_BIGBCP2 10005 /* v4.1 for Ig in AGBCP2 Region */ -#define B4SOI_MOD_LBIGBCP2 10006 /* v4.1 for Ig in AGBCP2 Region */ -#define B4SOI_MOD_WBIGBCP2 10007 /* v4.1 for Ig in AGBCP2 Region */ -#define B4SOI_MOD_PBIGBCP2 10008 /* v4.1 for Ig in AGBCP2 Region */ -#define B4SOI_MOD_CIGBCP2 10009 /* v4.1 for Ig in AGBCP2 Region */ -#define B4SOI_MOD_LCIGBCP2 10010 /* v4.1 for Ig in AGBCP2 Region */ -#define B4SOI_MOD_WCIGBCP2 10011 /* v4.1 for Ig in AGBCP2 Region */ -#define B4SOI_MOD_PCIGBCP2 10012 /* v4.1 for Ig in AGBCP2 Region */ - - -/* Added for binning - END3 */ - -#define B4SOI_MOD_TNOM 701 -#define B4SOI_MOD_CGSO 702 -#define B4SOI_MOD_CGDO 703 -#define B4SOI_MOD_CGEO 704 -#define B4SOI_MOD_XPART 705 -#define B4SOI_MOD_RSH 706 - - -#define B4SOI_MOD_NMOS 814 -#define B4SOI_MOD_PMOS 815 - -#define B4SOI_MOD_NOIA 816 -#define B4SOI_MOD_NOIB 817 -#define B4SOI_MOD_NOIC 818 - -#define B4SOI_MOD_LINT 819 -#define B4SOI_MOD_LL 820 -#define B4SOI_MOD_LLN 821 -#define B4SOI_MOD_LW 822 -#define B4SOI_MOD_LWN 823 -#define B4SOI_MOD_LWL 824 - -#define B4SOI_MOD_WINT 827 -#define B4SOI_MOD_WL 828 -#define B4SOI_MOD_WLN 829 -#define B4SOI_MOD_WW 830 -#define B4SOI_MOD_WWN 831 -#define B4SOI_MOD_WWL 832 - -/* v2.2.3 */ -#define B4SOI_MOD_LWLC 841 -#define B4SOI_MOD_LLC 842 -#define B4SOI_MOD_LWC 843 -#define B4SOI_MOD_WWLC 844 -#define B4SOI_MOD_WLC 845 -#define B4SOI_MOD_WWC 846 -#define B4SOI_MOD_DTOXCV 847 - -#define B4SOI_MOD_DWC 848 -#define B4SOI_MOD_DLC 849 - - - -#define B4SOI_MOD_PBSWGS 860 /* v4.0 */ -#define B4SOI_MOD_MJSWGS 861 /* v4.0 */ -#define B4SOI_MOD_CJSWGS 862 /* v4.0 */ -#define B4SOI_MOD_CSDESW 863 - -#define B4SOI_MOD_XDIFS 870 -#define B4SOI_MOD_XRECS 871 -#define B4SOI_MOD_XTUNS 872 -#define B4SOI_MOD_XDIFD 873 -#define B4SOI_MOD_XRECD 874 -#define B4SOI_MOD_XTUND 875 -#define B4SOI_MOD_LXDIFS 876 -#define B4SOI_MOD_LXRECS 877 -#define B4SOI_MOD_LXTUNS 878 -#define B4SOI_MOD_LXDIFD 879 -#define B4SOI_MOD_LXRECD 880 -#define B4SOI_MOD_LXTUND 881 -#define B4SOI_MOD_WXDIFS 882 -#define B4SOI_MOD_WXRECS 883 -#define B4SOI_MOD_WXTUNS 884 -#define B4SOI_MOD_WXDIFD 885 -#define B4SOI_MOD_WXRECD 886 -#define B4SOI_MOD_WXTUND 887 -#define B4SOI_MOD_PXDIFS 888 -#define B4SOI_MOD_PXRECS 889 -#define B4SOI_MOD_PXTUNS 890 -#define B4SOI_MOD_PXDIFD 891 -#define B4SOI_MOD_PXRECD 892 -#define B4SOI_MOD_PXTUND 893 -#define B4SOI_MOD_TCJSWGS 894 -#define B4SOI_MOD_TPBSWGS 895 -#define B4SOI_MOD_TCJSWGD 896 -#define B4SOI_MOD_TPBSWGD 897 - -/* device questions */ -#define B4SOI_DNODE 901 -#define B4SOI_GNODE 902 -#define B4SOI_SNODE 903 -#define B4SOI_BNODE 904 -#define B4SOI_ENODE 905 -#define B4SOI_DNODEPRIME 906 -#define B4SOI_SNODEPRIME 907 -#define B4SOI_VBD 908 -#define B4SOI_VBS 909 -#define B4SOI_VGS 910 -#define B4SOI_VES 911 -#define B4SOI_VDS 912 -#define B4SOI_CD 913 -#define B4SOI_CBS 914 -#define B4SOI_CBD 915 -#define B4SOI_GM 916 -#define B4SOI_GDS 917 -#define B4SOI_GMBS 918 -#define B4SOI_GBD 919 -#define B4SOI_GBS 920 -#define B4SOI_QB 921 -#define B4SOI_CQB 922 -#define B4SOI_QG 923 -#define B4SOI_CQG 924 -#define B4SOI_QD 925 -#define B4SOI_CQD 926 -#define B4SOI_CGG 927 -#define B4SOI_CGD 928 -#define B4SOI_CGS 929 -#define B4SOI_CBG 930 -#define B4SOI_CAPBD 931 -#define B4SOI_CQBD 932 -#define B4SOI_CAPBS 933 -#define B4SOI_CQBS 934 -#define B4SOI_CDG 935 -#define B4SOI_CDD 936 -#define B4SOI_CDS 937 -#define B4SOI_VON 938 -#define B4SOI_VDSAT 939 -#define B4SOI_QBS 940 -#define B4SOI_QBD 941 -#define B4SOI_SOURCECONDUCT 942 -#define B4SOI_DRAINCONDUCT 943 -#define B4SOI_CBDB 944 -#define B4SOI_CBSB 945 -#define B4SOI_GMID 946 -#define B4SOI_QS 955 - -/* For debugging only */ -#define B4SOI_DEBUG1 956 -#define B4SOI_DEBUG2 957 -#define B4SOI_DEBUG3 958 -/* End debugging */ - -/* v3.1 added for RF */ -#define B4SOI_GNODEEXT 947 -#define B4SOI_GNODEMID 948 -/* v3.1 added for RF end */ - -/* v4.0 */ -#define B4SOI_DBNODE 949 -#define B4SOI_SBNODE 950 -/* v4.0 end */ - -/*4.1 mobmod=4*/ -/*#define B4SOI_VGSTEFFVTH 3300*/ -/*#define B4SOI_VTFBPHI1 3301*/ -/*#define B4SOI_EG 3350*/ - -#define B4SOI_MOD_UD 3400 -#define B4SOI_MOD_LUD 3401 -#define B4SOI_MOD_WUD 3402 -#define B4SOI_MOD_PUD 3403 -#define B4SOI_MOD_UD1 3404 -#define B4SOI_MOD_LUD1 3405 -#define B4SOI_MOD_WUD1 3406 -#define B4SOI_MOD_PUD1 3407 -#define B4SOI_MOD_EU 3500 -#define B4SOI_MOD_LEU 3501 -#define B4SOI_MOD_WEU 3502 -#define B4SOI_MOD_PEU 3503 -#define B4SOI_MOD_UCS 3504 -#define B4SOI_MOD_LUCS 3505 -#define B4SOI_MOD_WUCS 3506 -#define B4SOI_MOD_PUCS 3507 -#define B4SOI_MOD_UCSTE 3508 -#define B4SOI_MOD_LUCSTE 3509 -#define B4SOI_MOD_WUCSTE 3510 -#define B4SOI_MOD_PUCSTE 3511 - - - - -/*4.1 Iii model*/ -#define B4SOI_MOD_IIIMOD 4000 -#define B4SOI_MOD_TVBCI 4001 -#define B4SOI_MOD_EBJTII 4002 -#define B4SOI_MOD_CBJTII 4003 -#define B4SOI_MOD_VBCI 4004 -#define B4SOI_MOD_ABJTII 4005 -#define B4SOI_MOD_MBJTII 4006 -#define B4SOI_MOD_LEBJTII 4007 -#define B4SOI_MOD_LCBJTII 4008 -#define B4SOI_MOD_LVBCI 4009 -#define B4SOI_MOD_LABJTII 4010 -#define B4SOI_MOD_LMBJTII 4011 -#define B4SOI_MOD_WEBJTII 4012 -#define B4SOI_MOD_WCBJTII 4013 -#define B4SOI_MOD_WVBCI 4014 -#define B4SOI_MOD_WABJTII 4015 -#define B4SOI_MOD_WMBJTII 4016 -#define B4SOI_MOD_PEBJTII 4017 -#define B4SOI_MOD_PCBJTII 4018 -#define B4SOI_MOD_PVBCI 4019 -#define B4SOI_MOD_PABJTII 4020 -#define B4SOI_MOD_PMBJTII 4021 - - -#define B4SOI_MOD_EGISL 2500 -#define B4SOI_MOD_AGISL 2501 -#define B4SOI_MOD_BGISL 2502 -#define B4SOI_MOD_CGISL 2503 -#define B4SOI_MOD_RGISL 2504 -#define B4SOI_MOD_KGISL 2505 -#define B4SOI_MOD_FGISL 2506 -#define B4SOI_MOD_LEGISL 2507 -#define B4SOI_MOD_WEGISL 2508 -#define B4SOI_MOD_PEGISL 2509 -#define B4SOI_MOD_LAGISL 2510 -#define B4SOI_MOD_WAGISL 2511 -#define B4SOI_MOD_PAGISL 2512 -#define B4SOI_MOD_LBGISL 2513 -#define B4SOI_MOD_WBGISL 2514 -#define B4SOI_MOD_PBGISL 2515 -#define B4SOI_MOD_LCGISL 2516 -#define B4SOI_MOD_WCGISL 2517 -#define B4SOI_MOD_PCGISL 2518 -#define B4SOI_MOD_LRGISL 2519 -#define B4SOI_MOD_WRGISL 2520 -#define B4SOI_MOD_PRGISL 2521 -#define B4SOI_MOD_LKGISL 2522 -#define B4SOI_MOD_WKGISL 2523 -#define B4SOI_MOD_PKGISL 2524 -#define B4SOI_MOD_LFGISL 2525 -#define B4SOI_MOD_WFGISL 2526 -#define B4SOI_MOD_PFGISL 2527 - -#define B4SOI_IGISL 3001 - -#define B4SOI_IBS 3002 -#define B4SOI_IBD 3003 -#define B4SOI_ISUB 3004 -#define B4SOI_IGIDL 3005 -#define B4SOI_IGS 3006 -#define B4SOI_IGD 3007 -#define B4SOI_IGB 3008 -#define B4SOI_IGCS 3009 -#define B4SOI_IGCD 3010 - -/* v3.2 */ -#define B4SOI_MOD_TNOIA 951 -#define B4SOI_MOD_TNOIB 952 -#define B4SOI_MOD_RNOIA 953 -#define B4SOI_MOD_RNOIB 954 -#define B4SOI_MOD_NTNOI 955 -#define B4SOI_MOD_FNOIMOD 956 -#define B4SOI_MOD_TNOIMOD 957 -#define B4SOI_MOD_NOFF 958 -#define B4SOI_MOD_LNOFF 959 -#define B4SOI_MOD_WNOFF 960 -#define B4SOI_MOD_PNOFF 961 -#define B4SOI_MOD_TOXM 962 -#define B4SOI_MOD_VBS0PD 963 -#define B4SOI_MOD_VBS0FD 964 -/* v3.2 */ - -/* v4.0 added for stress */ -#define B4SOI_MOD_SAREF 965 -#define B4SOI_MOD_SBREF 966 -#define B4SOI_MOD_KU0 967 -#define B4SOI_MOD_KVSAT 968 -#define B4SOI_MOD_TKU0 969 -#define B4SOI_MOD_LLODKU0 970 -#define B4SOI_MOD_WLODKU0 971 -#define B4SOI_MOD_LLODVTH 972 -#define B4SOI_MOD_WLODVTH 973 -#define B4SOI_MOD_LKU0 974 -#define B4SOI_MOD_WKU0 975 -#define B4SOI_MOD_PKU0 976 -#define B4SOI_MOD_KVTH0 977 -#define B4SOI_MOD_LKVTH0 978 -#define B4SOI_MOD_WKVTH0 979 -#define B4SOI_MOD_PKVTH0 980 -#define B4SOI_MOD_WLOD 981 -#define B4SOI_MOD_STK2 982 -#define B4SOI_MOD_LODK2 983 -#define B4SOI_MOD_STETA0 984 -#define B4SOI_MOD_LODETA0 985 -/* v4.0 added for stress end */ -#define B4SOI_MOD_GBMIN 986 /* v4.0 */ -#define B4SOI_MOD_RBDB 987 /* v4.0 */ -#define B4SOI_MOD_RBSB 988 /* v4.0 */ -#define B4SOI_MOD_MJSWGD 989 /* v4.0 */ -#define B4SOI_MOD_CJSWGD 990 /* v4.0 */ -#define B4SOI_MOD_PBSWGD 991 /* v4.0 */ -/*4.1*/ - -#define B4SOI_MOD_VFB 1201 /* v4.1 */ -#define B4SOI_MOD_LVFB 1202 /* v4.1 */ -#define B4SOI_MOD_WVFB 1203 /* v4.1 */ -#define B4SOI_MOD_PVFB 1204 /* v4.1 */ - -#define B4SOI_MOD_FDMOD 1221 -#define B4SOI_MOD_VSCE 1222 -#define B4SOI_MOD_CDSBS 1223 -#define B4SOI_MOD_VGSTCVMOD 1224 -#define B4SOI_MOD_MINVCV 1225 -#define B4SOI_MOD_LMINVCV 1226 -#define B4SOI_MOD_WMINVCV 1227 -#define B4SOI_MOD_PMINVCV 1228 -#define B4SOI_MOD_VOFFCV 1229 -#define B4SOI_MOD_LVOFFCV 1230 -#define B4SOI_MOD_WVOFFCV 1231 -#define B4SOI_MOD_PVOFFCV 1232 -/* v3.0 */ -#define B4SOI_MOD_SOIMOD 1001 -#define B4SOI_MOD_VBSA 1002 -#define B4SOI_MOD_NOFFFD 1003 -#define B4SOI_MOD_VOFFFD 1004 -#define B4SOI_MOD_K1B 1005 -#define B4SOI_MOD_K2B 1006 -#define B4SOI_MOD_DK2B 1007 -#define B4SOI_MOD_DVBD0 1008 -#define B4SOI_MOD_DVBD1 1009 -#define B4SOI_MOD_MOINFD 1010 - -/* v3.0 */ -#define B4SOI_MOD_AIGC 1021 -#define B4SOI_MOD_BIGC 1022 -#define B4SOI_MOD_CIGC 1023 -#define B4SOI_MOD_AIGSD 1024 -#define B4SOI_MOD_BIGSD 1025 -#define B4SOI_MOD_CIGSD 1026 -#define B4SOI_MOD_NIGC 1027 -#define B4SOI_MOD_PIGCD 1028 -#define B4SOI_MOD_POXEDGE 1029 -#define B4SOI_MOD_DLCIG 1030 - -#define B4SOI_MOD_LAIGC 1031 -#define B4SOI_MOD_LBIGC 1032 -#define B4SOI_MOD_LCIGC 1033 -#define B4SOI_MOD_LAIGSD 1034 -#define B4SOI_MOD_LBIGSD 1035 -#define B4SOI_MOD_LCIGSD 1036 -#define B4SOI_MOD_LNIGC 1037 -#define B4SOI_MOD_LPIGCD 1038 -#define B4SOI_MOD_LPOXEDGE 1039 - -#define B4SOI_MOD_WAIGC 1041 -#define B4SOI_MOD_WBIGC 1042 -#define B4SOI_MOD_WCIGC 1043 -#define B4SOI_MOD_WAIGSD 1044 -#define B4SOI_MOD_WBIGSD 1045 -#define B4SOI_MOD_WCIGSD 1046 -#define B4SOI_MOD_WNIGC 1047 -#define B4SOI_MOD_WPIGCD 1048 -#define B4SOI_MOD_WPOXEDGE 1049 - -#define B4SOI_MOD_PAIGC 1051 -#define B4SOI_MOD_PBIGC 1052 -#define B4SOI_MOD_PCIGC 1053 -#define B4SOI_MOD_PAIGSD 1054 -#define B4SOI_MOD_PBIGSD 1055 -#define B4SOI_MOD_PCIGSD 1056 -#define B4SOI_MOD_PNIGC 1057 -#define B4SOI_MOD_PPIGCD 1058 -#define B4SOI_MOD_PPOXEDGE 1059 - -/* v3.1 */ -#define B4SOI_MOD_LXJ 1061 -#define B4SOI_MOD_LALPHAGB1 1062 -#define B4SOI_MOD_LALPHAGB2 1063 -#define B4SOI_MOD_LBETAGB1 1064 -#define B4SOI_MOD_LBETAGB2 1065 -#define B4SOI_MOD_LNDIF 1066 -#define B4SOI_MOD_LNTRECF 1067 -#define B4SOI_MOD_LNTRECR 1068 -#define B4SOI_MOD_LXBJT 1069 -#define B4SOI_MOD_LCGDL 1073 -#define B4SOI_MOD_LCGSL 1074 -#define B4SOI_MOD_LCKAPPA 1075 -#define B4SOI_MOD_LUTE 1078 -#define B4SOI_MOD_LKT1 1079 -#define B4SOI_MOD_LKT2 1080 -#define B4SOI_MOD_LKT1L 1081 -#define B4SOI_MOD_LUA1 1082 -#define B4SOI_MOD_LUB1 1083 -#define B4SOI_MOD_LUC1 1084 -#define B4SOI_MOD_LAT 1085 -#define B4SOI_MOD_LPRT 1086 - -#define B4SOI_MOD_WXJ 1091 -#define B4SOI_MOD_WALPHAGB1 1092 -#define B4SOI_MOD_WALPHAGB2 1093 -#define B4SOI_MOD_WBETAGB1 1094 -#define B4SOI_MOD_WBETAGB2 1095 -#define B4SOI_MOD_WNDIF 1096 -#define B4SOI_MOD_WNTRECF 1097 -#define B4SOI_MOD_WNTRECR 1098 -#define B4SOI_MOD_WXBJT 1099 -#define B4SOI_MOD_WCGDL 2003 -#define B4SOI_MOD_WCGSL 2004 -#define B4SOI_MOD_WCKAPPA 2005 -#define B4SOI_MOD_WUTE 2008 -#define B4SOI_MOD_WKT1 2009 -#define B4SOI_MOD_WKT2 2010 -#define B4SOI_MOD_WKT1L 2011 -#define B4SOI_MOD_WUA1 2012 -#define B4SOI_MOD_WUB1 2013 -#define B4SOI_MOD_WUC1 2014 -#define B4SOI_MOD_WAT 2015 -#define B4SOI_MOD_WPRT 2016 - -#define B4SOI_MOD_PXJ 2021 -#define B4SOI_MOD_PALPHAGB1 2022 -#define B4SOI_MOD_PALPHAGB2 2023 -#define B4SOI_MOD_PBETAGB1 2024 -#define B4SOI_MOD_PBETAGB2 2025 -#define B4SOI_MOD_PNDIF 2026 -#define B4SOI_MOD_PNTRECF 2027 -#define B4SOI_MOD_PNTRECR 2028 -#define B4SOI_MOD_PXBJT 2029 -#define B4SOI_MOD_PCGDL 2033 -#define B4SOI_MOD_PCGSL 2034 -#define B4SOI_MOD_PCKAPPA 2035 -#define B4SOI_MOD_PUTE 2038 -#define B4SOI_MOD_PKT1 2039 -#define B4SOI_MOD_PKT2 2040 -#define B4SOI_MOD_PKT1L 2041 -#define B4SOI_MOD_PUA1 2042 -#define B4SOI_MOD_PUB1 2043 -#define B4SOI_MOD_PUC1 2044 -#define B4SOI_MOD_PAT 2045 -#define B4SOI_MOD_PPRT 2046 - -/* 4.0 backward compatibility */ -#define B4SOI_MOD_NGIDL 2100 -#define B4SOI_MOD_LNGIDL 2101 -#define B4SOI_MOD_WNGIDL 2102 -#define B4SOI_MOD_PNGIDL 2103 -#define B4SOI_MOD_NLX 2104 -#define B4SOI_MOD_LNLX 2105 -#define B4SOI_MOD_WNLX 2106 -#define B4SOI_MOD_PNLX 2107 - -#define B4SOI_MOD_VGS_MAX 2201 -#define B4SOI_MOD_VGD_MAX 2202 -#define B4SOI_MOD_VGB_MAX 2203 -#define B4SOI_MOD_VDS_MAX 2204 -#define B4SOI_MOD_VBS_MAX 2205 -#define B4SOI_MOD_VBD_MAX 2206 -#define B4SOI_MOD_VGSR_MAX 2207 -#define B4SOI_MOD_VGDR_MAX 2208 -#define B4SOI_MOD_VGBR_MAX 2209 -#define B4SOI_MOD_VBSR_MAX 2210 -#define B4SOI_MOD_VBDR_MAX 2211 - -#include "b4soiext.h" - -extern void B4SOIevaluate(double,double,double,B4SOIinstance*,B4SOImodel*, - double*,double*,double*, double*, double*, double*, double*, - double*, double*, double*, double*, double*, double*, double*, - double*, double*, double*, double*, CKTcircuit*); -extern int B4SOIdebug(B4SOImodel*, B4SOIinstance*, CKTcircuit*, int); -extern int B4SOIcheckModel(B4SOImodel*, B4SOIinstance*, CKTcircuit*); - -#endif /*B4SOI*/ - diff --git a/src/spicelib/devices/bsimsoi/b4soiext.h b/src/spicelib/devices/bsimsoi/b4soiext.h deleted file mode 100644 index 15feb85b9..000000000 --- a/src/spicelib/devices/bsimsoi/b4soiext.h +++ /dev/null @@ -1,31 +0,0 @@ -/********** -Copyright 2010 Regents of the University of California. All rights reserved. -Author: 2005 Hui Wan (based on Samuel Fung's b3soiext.h) -Authors: 2009- Wenwei Yang, Chung-Hsun Lin, Ali Niknejad, Chenming Hu. -Authors: 2009- Tanvir Morshed, Ali Niknejad, Chenming Hu. -Authors: 2010- Tanvir Morshed, Ali Niknejad, Chenming Hu. -File: b4soiext.h -**********/ - -extern int B4SOIacLoad(GENmodel *,CKTcircuit*); -extern int B4SOIask(CKTcircuit *,GENinstance*,int,IFvalue*,IFvalue*); -extern int B4SOIconvTest(GENmodel *,CKTcircuit*); -extern int B4SOIgetic(GENmodel*,CKTcircuit*); -extern int B4SOIload(GENmodel*,CKTcircuit*); -extern int B4SOImAsk(CKTcircuit*,GENmodel *,int, IFvalue*); -extern int B4SOImDelete(GENmodel*); -extern int B4SOImParam(int,IFvalue*,GENmodel*); -extern void B4SOImosCap(CKTcircuit*, double, double, double, double, - double, double, double, double, double, double, double, - double, double, double, double, double, double, double*, - double*, double*, double*, double*, double*, double*, double*, - double*, double*, double*, double*, double*, double*, double*, - double*); -extern int B4SOIparam(int,IFvalue*,GENinstance*,IFvalue*); -extern int B4SOIpzLoad(GENmodel*,CKTcircuit*,SPcomplex*); -extern int B4SOIsetup(SMPmatrix*,GENmodel*,CKTcircuit*,int*); -extern int B4SOItemp(GENmodel*,CKTcircuit*); -extern int B4SOItrunc(GENmodel*,CKTcircuit*,double*); -extern int B4SOInoise(int,int,GENmodel*,CKTcircuit*,Ndata*,double*); -extern int B4SOIunsetup(GENmodel*,CKTcircuit*); -extern int B4SOIsoaCheck(CKTcircuit *, GENmodel *); diff --git a/src/spicelib/devices/bsimsoi/b4soigetic.c b/src/spicelib/devices/bsimsoi/b4soigetic.c deleted file mode 100644 index 73478bad2..000000000 --- a/src/spicelib/devices/bsimsoi/b4soigetic.c +++ /dev/null @@ -1,61 +0,0 @@ -/*** B4SOI 12/16/2010 Released by Tanvir Morshed ***/ - - -/********** - * Copyright 2010 Regents of the University of California. All rights reserved. - * Authors: 1998 Samuel Fung, Dennis Sinitsky and Stephen Tang - * Authors: 1999-2004 Pin Su, Hui Wan, Wei Jin, b3soigetic.c - * Authors: 2005- Hui Wan, Xuemei Xi, Ali Niknejad, Chenming Hu. - * Authors: 2009- Wenwei Yang, Chung-Hsun Lin, Ali Niknejad, Chenming Hu. - * File: b4soigetic.c - * Modified by Hui Wan, Xuemei Xi 11/30/2005 - * Modified by Wenwei Yang, Chung-Hsun Lin, Darsen Lu 03/06/2009 - * Modified by Tanvir Morshed 09/22/2009 - * Modified by Tanvir Morshed 12/31/2009 - **********/ - -#include "ngspice/ngspice.h" - -#include "ngspice/cktdefs.h" -#include "b4soidef.h" -#include "ngspice/sperror.h" -#include "ngspice/suffix.h" - - -int -B4SOIgetic( -GENmodel *inModel, -CKTcircuit *ckt) -{ -B4SOImodel *model = (B4SOImodel*)inModel; -B4SOIinstance *here; - - for (; model ; model = B4SOInextModel(model)) - { for (here = B4SOIinstances(model); here; here = B4SOInextInstance(here)) - { - if(!here->B4SOIicVBSGiven) - { here->B4SOIicVBS = *(ckt->CKTrhs + here->B4SOIbNode) - - *(ckt->CKTrhs + here->B4SOIsNode); - } - if (!here->B4SOIicVDSGiven) - { here->B4SOIicVDS = *(ckt->CKTrhs + here->B4SOIdNode) - - *(ckt->CKTrhs + here->B4SOIsNode); - } - if (!here->B4SOIicVGSGiven) - { here->B4SOIicVGS = *(ckt->CKTrhs + here->B4SOIgNode) - - *(ckt->CKTrhs + here->B4SOIsNode); - } - if (!here->B4SOIicVESGiven) - { here->B4SOIicVES = *(ckt->CKTrhs + here->B4SOIeNode) - - *(ckt->CKTrhs + here->B4SOIsNode); - } - if (!here->B4SOIicVPSGiven) - { here->B4SOIicVPS = *(ckt->CKTrhs + here->B4SOIpNode) - - *(ckt->CKTrhs + here->B4SOIsNode); - } - } - } - return(OK); -} - - diff --git a/src/spicelib/devices/bsimsoi/b4soiinit.c b/src/spicelib/devices/bsimsoi/b4soiinit.c deleted file mode 100644 index 068207a07..000000000 --- a/src/spicelib/devices/bsimsoi/b4soiinit.c +++ /dev/null @@ -1,76 +0,0 @@ -#include "ngspice/config.h" - -#include "ngspice/devdefs.h" - -#include "b4soiitf.h" -#include "b4soiinit.h" - -SPICEdev B4SOIinfo = { - .DEVpublic = { - .name = "B4SOI", - .description = "Berkeley SOI MOSFET model version 4.4.0", - .terms = &B4SOInSize, - .numNames = &B4SOInSize, - .termNames = B4SOInames, - .numInstanceParms = &B4SOIpTSize, - .instanceParms = B4SOIpTable, - .numModelParms = &B4SOImPTSize, - .modelParms = B4SOImPTable, - .flags = DEV_DEFAULT, - -#ifdef XSPICE - .cm_func = NULL, - .num_conn = 0, - .conn = NULL, - .num_param = 0, - .param = NULL, - .num_inst_var = 0, - .inst_var = NULL, -#endif - }, - - .DEVparam = B4SOIparam, - .DEVmodParam = B4SOImParam, - .DEVload = B4SOIload, - .DEVsetup = B4SOIsetup, - .DEVunsetup = B4SOIunsetup, - .DEVpzSetup = B4SOIsetup, - .DEVtemperature = B4SOItemp, - .DEVtrunc = B4SOItrunc, - .DEVfindBranch = NULL, - .DEVacLoad = B4SOIacLoad, - .DEVaccept = NULL, - .DEVdestroy = NULL, - .DEVmodDelete = B4SOImDelete, - .DEVdelete = NULL, - .DEVsetic = B4SOIgetic, - .DEVask = B4SOIask, - .DEVmodAsk = B4SOImAsk, - .DEVpzLoad = B4SOIpzLoad, - .DEVconvTest = B4SOIconvTest, - .DEVsenSetup = NULL, - .DEVsenLoad = NULL, - .DEVsenUpdate = NULL, - .DEVsenAcLoad = NULL, - .DEVsenPrint = NULL, - .DEVsenTrunc = NULL, - .DEVdisto = NULL, - .DEVnoise = B4SOInoise, - .DEVsoaCheck = B4SOIsoaCheck, - .DEVinstSize = &B4SOIiSize, - .DEVmodSize = &B4SOImSize, - -#ifdef CIDER - .DEVdump = NULL, - .DEVacct = NULL, -#endif -}; - - -SPICEdev * -get_b4soi_info (void) -{ - return &B4SOIinfo; -} - - diff --git a/src/spicelib/devices/bsimsoi/b4soiinit.h b/src/spicelib/devices/bsimsoi/b4soiinit.h deleted file mode 100644 index 716b21937..000000000 --- a/src/spicelib/devices/bsimsoi/b4soiinit.h +++ /dev/null @@ -1,13 +0,0 @@ -#ifndef _B4SOIINIT_H -#define _B4SOIINIT_H - -extern IFparm B4SOIpTable[]; -extern IFparm B4SOImPTable[]; -extern char *B4SOInames[]; -extern int B4SOIpTSize; -extern int B4SOImPTSize; -extern int B4SOInSize; -extern int B4SOIiSize; -extern int B4SOImSize; - -#endif diff --git a/src/spicelib/devices/bsimsoi/b4soiitf.h b/src/spicelib/devices/bsimsoi/b4soiitf.h deleted file mode 100644 index 39d32ef81..000000000 --- a/src/spicelib/devices/bsimsoi/b4soiitf.h +++ /dev/null @@ -1,18 +0,0 @@ -/********** -Copyright 2010 Regents of the University of California. All rights reserved. -Author: 2005 Hui Wan (based on Samuel Fung's b3soiitf.h) -Authors: 2009- Wenwei Yang, Chung-Hsun Lin, Ali Niknejad, Chenming Hu. -Authors: 2009- Tanvir Morshed, Ali Niknejad, Chenming Hu. -Authors: 2010- Tanvir Morshed, Ali Niknejad, Chenming Hu. -File: b4soiitf.h -**********/ - -#ifndef DEV_B4SOI -#define DEV_B4SOI - -#include "b4soiext.h" - -SPICEdev *get_b4soi_info (void); - -#endif - diff --git a/src/spicelib/devices/bsimsoi/b4soild.c b/src/spicelib/devices/bsimsoi/b4soild.c deleted file mode 100644 index 29e4a7caa..000000000 --- a/src/spicelib/devices/bsimsoi/b4soild.c +++ /dev/null @@ -1,11274 +0,0 @@ -/*** B4SOI 12/16/2010 Released by Tanvir Morshed ***/ - - -/********** - * Copyright 2010 Regents of the University of California. All rights reserved. - * Authors: 1998 Samuel Fung, Dennis Sinitsky and Stephen Tang - * Authors: 1999-2004 Pin Su, Hui Wan, Wei Jin, b3soild.c - * Authors: 2005- Hui Wan, Xuemei Xi, Ali Niknejad, Chenming Hu. - * Authors: 2009- Wenwei Yang, Chung-Hsun Lin, Ali Niknejad, Chenming Hu. - * File: b4soild.c - * Modified by Hui Wan, Xuemei Xi 11/30/2005 - * Modified by Wenwei Yang, Chung-Hsun Lin, Darsen Lu 03/06/2009 - * Modified by Tanvir Morshed 09/22/2009 - * Modified by Tanvir Morshed 12/31/2009 - * Modified by Larry Wagner, Calvin Bittner, Geoffrey Coram, Tanvir Morshed 05/14/2010 - * Modified by Larry Wagner, Calvin Bittner, 5 fixes. 08/04/2010 - * Modified by Larry Wagner, Calvin Bittner, FD derivatives fixes. 08/25/2010 - **********/ - -#include "ngspice/ngspice.h" - -#include "ngspice/cktdefs.h" -#include "b4soidef.h" -#include "ngspice/trandefs.h" -#include "ngspice/const.h" -#include "ngspice/sperror.h" -#include "ngspice/devdefs.h" -#include "ngspice/suffix.h" - -#define EPS0 8.85418e-12 /*4.1*/ -#define EPSOX 3.453133e-11 -#define EPSSI 1.03594e-10 -#define Charge_q 1.60219e-19 -#define KboQ 8.617087e-5 /* Kb / q */ -#define Eg300 1.115 /* energy gap at 300K */ -#define DELTA 1.0E-9 /* v4.0 */ -#define DELTA_1 0.02 -#define DELTA_2 0.02 -#define DELTA_3 0.02 -/* Original is 0.02, for matching IBM model, change to 0.08 */ -#define DELTA_3_SOI 0.08 -#define DELTA_4 0.02 -#define DELT_Vbseff 0.005 -#define DELTA_VFB 0.02 -#define OFF_Vbsitf 0.02 /* v3.1*/ -#define CONST_2OV3 0.6666666666 - -#define MAX_EXPL 2.688117142e+43 -#define MIN_EXPL 3.720075976e-44 -#define EXPL_THRESHOLD 100.0 -#define DEXP(A,B,C) { \ - if (A > EXPL_THRESHOLD) { \ - B = MAX_EXPL*(1.0+(A)-EXPL_THRESHOLD); \ - C = MAX_EXPL; \ - } else if (A < -EXPL_THRESHOLD) { \ - B = MIN_EXPL; \ - C = 0; \ - } else { \ - B = exp(A); \ - C = B; \ - } \ -} - -#define FLOG(A) fabs(A) + 1e-14 - -#ifdef USE_OMP -int B4SOILoadOMP(B4SOIinstance *here, CKTcircuit *ckt); -void B4SOILoadRhsMat(GENmodel *inModel, CKTcircuit *ckt); -#endif - -/* B4SOIlimit(vnew,vold) - * limits the per-iteration change of any absolute voltage value - */ - -static double -B4SOIlimit( - double vnew, - double vold, - double limit, - int *check) -{ - double T0, T1; - - if (isnan (vnew) || isnan (vold)) - { - fprintf(stderr, "Alberto says: YOU TURKEY! The limiting function received NaN.\n"); - fprintf(stderr, "New prediction returns to 0.0!\n"); - vnew = 0.0; - *check = 1; - } - T0 = vnew - vold; - T1 = fabs(T0); - if (T1 > limit) { - if (T0 > 0.0) - vnew = vold + limit; - else - vnew = vold - limit; - *check = 1; - } - return vnew; -} - - -int -B4SOIload( - GENmodel *inModel, - CKTcircuit *ckt) -{ -#ifdef USE_OMP - int idx; - B4SOImodel *model = (B4SOImodel*)inModel; - int error = 0; - B4SOIinstance **InstArray; - InstArray = model->B4SOIInstanceArray; - -#pragma omp parallel for - for (idx = 0; idx < model->B4SOIInstCount; idx++) { - B4SOIinstance *here = InstArray[idx]; - int local_error = B4SOILoadOMP(here, ckt); - if (local_error) - error = local_error; - } - - B4SOILoadRhsMat(inModel, ckt); - - return error; -} - -int B4SOILoadOMP(B4SOIinstance *here, CKTcircuit *ckt) { - B4SOImodel *model = B4SOImodPtr(here); -#else - register B4SOImodel *model = (B4SOImodel*)inModel; - register B4SOIinstance *here; -#endif - - register int selfheat; - - double Gmin; - double dVgstNVt_dT, dVgstNVt2_dT; /* LFW_FD */ - double ag0, qgd, qgs, von, cbhat, VgstNVt, ExpVgst, dExpVgst_dT; /* enhanced line Wagner */ -/* LFW_FD next 4 lines */ - double dVgstNVt_dVg, dVgstNVt_dVd, dVgstNVt_dVb, dVgstNVt_dVe; - double dExpVgst_dVg, dExpVgst_dVd, dExpVgst_dVb, dExpVgst_dVe, dVgstNVt2_dVg; - double dVgstNVt2_dVd, dVgstNVt2_dVb, dVgstNVt2_dVe, dExpArg2_dVd, dExpArg2_dVb, dExpArg2_dVe; - double dExpVgst2_dVg, dExpVgst2_dVd, dExpVgst2_dVb, dExpVgst2_dVe; - double cdhat, cdreq, ceqbd, ceqbs, ceqqb, ceqqd, ceqqg, ceq, geq; - double arg; - double delvbd, delvbs, delvds, delvgd, delvgs; - double Vfbeff, dVfbeff_dVg, dVfbeff_dVd, dVfbeff_dVe, dVfbeff_dVb, V3, V4; - double PhiBSWG, MJSWG; - double gcgdb, gcggb, gcgsb, gcgeb, gcgT; - double gcsdb, gcsgb, gcssb, gcseb, gcsT; - double gcddb, gcdgb, gcdsb, gcdeb, gcdT; - double gcbdb, gcbgb, gcbsb, gcbeb, gcbT; - double gcedb, gcegb, gcesb, gceeb, gceT; - double gcTt, gTtg, gTtb, gTtdp, gTtt, gTtsp; - double vbd, vbs, vds, vgb, vgd, vgs, vgdo; -#ifndef PREDICTOR - double xfact; -#endif - double vg, vd, vs, vp, ve, vb; - double Vds, Vgs, Vbs, Gmbs, FwdSum, RevSum; - - double Vgs_eff, Vfb, dVfb_dVb, dVfb_dVd, dVfb_dVg, dVfb_dVe, dVfb_dT; - double Phis, sqrtPhis, dsqrtPhis_dVd, dsqrtPhis_dVe, dsqrtPhis_dVb, dsqrtPhis_dVg; - double Vth, dVth_dVb, dVth_dVd, dVth_dVg, dVth_dVe, dVth_dT; - double Vgst, dVgst_dVg, dVgst_dVd, dVgst_dVb, dVgst_dVe, dVgst_dT, dVgs_eff_dVg, dVgs_eff_dT; - double n, dn_dVb, dn_dVe, dn_dVg, Vtm; - double ExpArg, dExpArg_dVg, dExpArg_dVd, dExpArg_dVb, dExpArg_dVe, dExpArg_dT, dExpArg2_dVg, dExpArg2_dT, V0; - double ueff, dueff_dVg, dueff_dVd, dueff_dVb, dueff_dVe, dueff_dT; - double Esat, Vdsat; - double EsatL, dEsatL_dVg, dEsatL_dVd, dEsatL_dVb, dEsatL_dVe, dEsatL_dT; - double dVdsat_dVg, dVdsat_dVb, dVdsat_dVd, dVdsat_dVe, dVdsat_dT, Vasat; - double dVasat_dVg, dVasat_dVb, dVasat_dVd, dVasat_dVe, dVasat_dT; - double Va, dVa_dVd, dVa_dVg, dVa_dVb, dVa_dVe, dVa_dT; - double Vbseff, dVbseff_dVb; - double CoxWL; - double T0=0.0, dT0_dVg, dT0_dVd, dT0_dVe, dT0_dVb, dT0_dT; - - double T1, dT1_dVg, dT1_dVd, dT1_dVb, dT1_dT; - double T2, dT2_dVg, dT2_dVd, dT2_dVb, dT2_dT, dT2_dVp; - double T3, dT3_dVg, dT3_dVd, dT3_dVe, dT3_dVb, dT3_dT; - double T4, dT4_dVe, dT4_dVg, dT4_dVd, dT4_dVb, dT4_dT; - double T5, dT5_dVg, dT5_dVd, dT5_dVb, dT5_dT; - double T6, dT6_dVg, dT6_dVd, dT6_dVe, dT6_dVb, dT6_dT, dT6_dVp; - double T7, dT7_dVg, dT7_dVb, dT7_dVd, dT7_dVe; - double T8, dT8_dVd; - double T9, dT9_dVd; - double T10, dT10_dVb, dT10_dVd; - double T11, T12; - /* LFW_FD 2 new lines */ - double dT02_dVg, dT02_dVd, dT02_dVb, dT02_dVe, dT12_dVg, dT12_dVd, dT12_dVb, dT12_dVe; - double dT22_dVg, dT22_dVd, dT22_dVb, dT22_dVe; - double dTL0_dT, TL1, dTL1_dT, TL2, dTL2_dT, TL3, dTL3_dT, TL4, dTL4_dT, dTL5_dT; /* new line Wagner */ - /* LFW_FD 1 new line */ - double dTL1_dVg, dTL1_dVd, dTL1_dVb, dTL1_dVe; - double dTL6_dT, dTL7_dT, dTL8_dT, dTL9_dT; /* new line Wagner */ - double tmp, Abulk, dAbulk_dVb, Abulk0, dAbulk0_dVg, dAbulk0_dVb, dAbulk0_dVd, dAbulk0_dVe; - double dAbulk_dT, dAbulk0_dT, dAbulkCV_dT; /* new line Wagner */ - double VACLM, dVACLM_dVg, dVACLM_dVd, dVACLM_dVb, dVACLM_dVe, dVACLM_dT; - double VADIBL, dVADIBL_dVg, dVADIBL_dVd, dVADIBL_dVb, dVADIBL_dVe, dVADIBL_dT; - double Xdep, dXdep_dVd, dXdep_dVe, dXdep_dVb, dXdep_dVg; - double lt1, dlt1_dVd, dlt1_dVe, dlt1_dVb, dlt1_dVg; - double ltw, dltw_dVd, dltw_dVe, dltw_dVb, dltw_dVg; - double Delt_vth, dDelt_vth_dVd, dDelt_vth_dVe, dDelt_vth_dVb, dDelt_vth_dVg, dDelt_vth_dT; - double Theta0, dTheta0_dVd, dTheta0_dVe, dTheta0_dVb, dTheta0_dVg; - double TempRatio, tmp1, tmp2, tmp3, tmp4; - double DIBL_Sft, dDIBL_Sft_dVd, Lambda, dLambda_dVg, dLambda_dVb, dLambda_dVd, dLambda_dVe; - double dLambda_dT; /* new line Wagner */ - - double a1; - - double Vgsteff, dVgsteff_dVg, dVgsteff_dVd, dVgsteff_dVb, dVgsteff_dT; - double Vdseff, dVdseff_dVg, dVdseff_dVd, dVdseff_dVb, dVdseff_dVe, dVdseff_dT; - double VdseffCV, dVdseffCV_dVg, dVdseffCV_dVd, dVdseffCV_dVb, dVdseffCV_dVe; - double dVdseffCV_dT; /* new line Wagner */ - double diffVds; - double dAbulk_dVg, dAbulk_dVd, dAbulk_dVe, dn_dVd ; - double beta, dbeta_dVg, dbeta_dVd, dbeta_dVb, dbeta_dVe, dbeta_dT; - double gche, dgche_dVg, dgche_dVd, dgche_dVb, dgche_dVe, dgche_dT; - double fgche1, dfgche1_dVg, dfgche1_dVd, dfgche1_dVb, dfgche1_dVe, dfgche1_dT; - double fgche2, dfgche2_dVg, dfgche2_dVd, dfgche2_dVb, dfgche2_dVe, dfgche2_dT; - double Idl, dIdl_dVg, dIdl_dVd, dIdl_dVb, dIdl_dVe, dIdl_dT; - double Ids, Gm, Gds, Gmb, dIds_dVg, dIds_dVb, dIds_dVd, dIds_dVe, dIds_dT; - double CoxWovL; - double Rds, dRds_dVg, dRds_dVb, dRds_dVd, dRds_dVe, dRds_dT, WVCox, WVCoxRds, dWVCoxRds_dT; - double dWVCoxRds_dVg, dWVCoxRds_dVb, dWVCoxRds_dVd, dWVCoxRds_dVe; - double Vgst2Vtm, dVgst2Vtm_dT, VdsatCV, dVdsatCV_dVg, dVdsatCV_dVd, dVdsatCV_dVb, dVdsatCV_dVe, dVdsatCV_dT; - double Leff, Weff, dWeff_dVg, dWeff_dVb, dWeff_dVd, dWeff_dVe, dWeff_dT; - double AbulkCV, dAbulkCV_dVg, dAbulkCV_dVb, dAbulkCV_dVd, dAbulkCV_dVe; - double qgdo, qgso, cgdo, cgso; - - double dxpart, sxpart; - - struct b4soiSizeDependParam *pParam; - int ByPass, Check, ChargeComputationNeeded=0, error; - - double gbbsp, gbbdp, gbbg, gbbb, gbbp, gbbT; - double gddpsp, gddpdp, gddpg, gddpb, gddpT; - double gsspsp, gsspdp, gsspg, gsspb, gsspT; - double Gbpbs=0.0, Gbpps; - double ves, ved, veb, vge=0.0, delves, vedo, delved; - double vps, vpd, Vps, delvps; - double Vbd, Ves, Vesfb; - double DeltVthtemp, dDeltVthtemp_dVd, dDeltVthtemp_dVe, dDeltVthtemp_dVb, dDeltVthtemp_dVg, dDeltVthtemp_dT; - double Vbp, dVbp_dVb; - double DeltVthw, dDeltVthw_dVd, dDeltVthw_dVe, dDeltVthw_dVb, dDeltVthw_dVg, dDeltVthw_dT; - double Gm0, Gds0, Gmb0, Gme0, GmT0, GmT; - double dDIBL_Sft_dVg, dDIBL_Sft_dVe, dDIBL_Sft_dVb; - double Igidl, Ggidld=0.0, Ggidlg, Ggidlb=0.0, Ggidlt; /* enhanced line Wagner */ - double Igisl, Ggisls=0.0, Ggislg, Ggislb=0.0, Ggislt; /* enhanced line Wagner */ - double Gjsd, Gjsb=0.0, GjsT, Gjdd, Gjdb=0.0, GjdT; - double Ibp, Iii, Giid=0.0, Giig, Giib=0.0, GiiT, Gcd, Gcb, GcT, ceqbody, ceqbodcon; - double gppb, gppp; - double delTemp, deldelTemp, Temp; - double ceqth, ceqqth; - double K1; - double qjs=0.0, gcjsbs=0.0, gcjsT; - double qjd=0.0, gcjdbs=0.0, gcjdT; - double qge; - double ceqqe; - double ni, Eg, Cbox, CboxWL; - double dEg_dT; /* new line Wagner */ - double cjsbs; - double dVfbeff_dVrg; - double qinv, qgate=0.0, qbody=0.0, qdrn=0.0, qsrc, qsub=0.0, cqgate, cqbody, cqdrn, cqsub, cqtemp; - double qgate1; /* new line Wagner */ - - double Cgg, Cgd, Cgb, Cge; - double Csg, Csd, Csb, Cse, Cbg, Cbd, Cbb, Cbe; - double Cgg1, Cgb1, Cgd1, Cge1, Cbg1, Cbb1, Cbd1, Cbe1, Csg1, Csd1, Csb1, Cse1; - double Vdsatii; - double Ibs1 ,dIbs1_dVb ,dIbs1_dT; - double Ibs2 ,dIbs2_dVb ,dIbs2_dT; - double Ibs3 ,dIbs3_dVb ,dIbs3_dVd, dIbs3_dT; - double Ibs4 ,dIbs4_dVb ,dIbs4_dT; - double Ibd1 ,dIbd1_dVb ,dIbd1_dVd ,dIbd1_dT; - double Ibd2 ,dIbd2_dVb ,dIbd2_dVd ,dIbd2_dT; - double Ibd3 ,dIbd3_dVb ,dIbd3_dVd ,dIbd3_dT; - double Ibd4 ,dIbd4_dVb ,dIbd4_dVd ,dIbd4_dT; - double WTsi, NVtm1, NVtm2; - double Ic ,dIc_dVb ,dIc_dVd; - double Ibs; - double Ibd; - double Denomi ,dDenomi_dVg, dDenomi_dVd, dDenomi_dVb, dDenomi_dVe, dDenomi_dT; - double Qsub0 ,dQsub0_dVg ,dQsub0_dVb ,dQsub0_dVd, dQsub0_dVe ; - double dqgate_dT, dqgate2_dT, dqbulk_dT, dqsrc_dT, dqdrn_dT, dqbody_dT, dqsub_dT; /* new line Wagner */ - double Qac0 ,dQac0_dVb ,dQac0_dVd; - double Qe1 , dQe1_dVb, dQe1_dVe, dQe1_dT; - double Ce1b ,Ce1e, Ce1T; - double dQac0_dVrg, dQsub0_dVrg; - - /* for self-heating */ - double vbi, vfbb, phi, sqrtPhi, Xdep0, u0temp, vsattemp; - double jdifs, jdifd, djdifs_dT, djdifd_dT; - double jbjts, jbjtd, djbjts_dT, djbjtd_dT; - double jrecs, jrecd, djrecs_dT, djrecd_dT; - double jtuns, jtund, djtuns_dT, djtund_dT; - double rds0=0.0, ua, ub, uc; - double dvbi_dT, dvfbb_dT, du0temp_dT; - double dvsattemp_dT, drds0_dT=0.0, dua_dT, dub_dT, duc_dT, dni_dT, dVtm_dT; - double dVfbeff_dT, dQac0_dT, dQsub0_dT; - double CbT, CsT, CgT; - double CdT; /* new line Wagner */ - double rho, rho_ref, ku0temp; /* v4.0 */ - double drho_dT, drho_ref_dT, dku0temp_dT; /* v4.0 */ - - /* v2.0 release */ - double Vbsh, dVbsh_dVb; - double sqrtPhisExt, dsqrtPhisExt_dVd, dsqrtPhisExt_dVe, dsqrtPhisExt_dVb, dsqrtPhisExt_dVg; - double T13, T14; - double dT14_dT; /* new line Wagner */ - double dT11_dVb, dT11_dVd, dT11_dVe, dT13_dVb, dT13_dVd, dT13_dVe, dT14_dVb, dT14_dVd, dT14_dVe, dT13_dVg, dT14_dVg; - double Vdsatii0, dVdsatii0_dT; - double VgsStep, dVgsStep_dT, Ratio, dRatio_dVg, dRatio_dVb, dRatio_dVd, dRatio_dT, dTempRatio_dT; - double Vdiff, dVdiff_dVg, dVdiff_dVb, dVdiff_dVd, dVdiff_dT; - double dNVtm1_dT; - double NVtmf, NVtmr, dNVtmf_dT, dNVtmr_dT; - double TempRatioMinus1; - double Ahlis, dAhlis_dT, Ahlid, dAhlid_dT ; - double WsTsi, WdTsi; - double dPhiBSWG_dT, dcjsbs_dT, darg_dT, ddT3_dVb_dT; - double dT7_dT, dT0_dT7, dT1_dT7, dT2_dT7; - double CoxWLb, CoxWLcenb; - double ExpVbsNVtm, dExpVbsNVtm_dVb, dExpVbsNVtm_dT; - double ExpVbdNVtm, dExpVbdNVtm_dVb, dExpVbdNVtm_dVd, dExpVbdNVtm_dT; - double Ien, dIen_dT, Iendif, dIendif_dT; - double Ibsdif, dIbsdif_dVb, dIbsdif_dT; - double Ibddif, dIbddif_dVb, dIbddif_dT; - double Ehlis, dEhlis_dVb, dEhlis_dT; - double EhlisFactor, dEhlisFactor_dVb, dEhlisFactor_dT; - double Ehlid, dEhlid_dVb, dEhlid_dVd, dEhlid_dT; - double EhlidFactor, dEhlidFactor_dVb, dEhlidFactor_dT; - double E2ndFactor, dE2ndFactor_dVb, dE2ndFactor_dVd, dE2ndFactor_dT; - double dT10_dT, dT11_dT, dT13_dT, DioMax; /* LFW_FD enhance line */ - double cjdbs, dcjdbs_dT; - double wdios, wdiod; - - /* for capMod3 */ - double Cox, Tox, Tcen, dTcen_dVg, dTcen_dVb, LINK, Ccen, Coxeff, dCoxeff_dVg, dCoxeff_dVb; - double CoxWLcen, QovCox, dQac0_dVg, dQac0_dVe, DeltaPhi, dDeltaPhi_dVg, dDeltaPhi_dT; - double dDeltaPhi_dVd, dDeltaPhi_dVb, dDeltaPhi_dVe; - double dTcen_dVd, dTcen_dVe, dTcen_dT, dCoxeff_dVd, dCoxeff_dT, dCoxWLcenb_dT, qinoi, qbulk, qbulk1; - double dCoxeff_dVe; - double T3zb, lt1zb, ltwzb, Theta0zb; - double Delt_vthzb, dDelt_vthzb_dT; - double DeltVthwzb, dDeltVthwzb_dT; - double DeltVthtempzb, dDeltVthtempzb_dT; - double Vthzb, dVthzb_dT, Vfbzb, dVfbzb_dT; - - /* v3.2 */ - double noff, dnoff_dVg, dnoff_dVd, dnoff_dVb, dnoff_dVe; - double dnoff_dT; /* new line Wagner */ - double vgmb; - - /* v3.1 added for RF */ - double geltd, gcrg, gcrgg, gcrgd, gcrgs, gcrgb, ceqgcrg; - double vges, vgms, vgedo, vgmdo, vged, vgmd, delvged, delvgmd; - double delvges, delvgms, vgme; - double gcgmgmb=0.0, gcgmdb, gcgmsb, gcdgmb, gcsgmb; - double gcgmeb, gcegmb, qgme, qgmid=0.0, ceqqgmid; - double gcgbb; - double vgge, vggm; - - /* v3.0 */ - double Igc, dIgc_dVg, dIgc_dVd, dIgc_dVe, dIgc_dVb, Igs, dIgs_dVg, dIgs_dVs, Igd, dIgd_dVg, dIgd_dVd; - double Igcs, dIgcs_dVg, dIgcs_dVd, dIgcs_dVb, dIgcs_dVe, Igcd, dIgcd_dVg, dIgcd_dVd, dIgcd_dVb, dIgcd_dVe; - double dIgc_dT, dIgcs_dT, dIgcd_dT; /* new line Wagner */ - double vgs_eff, dvgs_eff_dvg, vgd_eff, dvgd_eff_dvg; - double VxNVt, ExpVxNVt; - double dVxNVt_dT; /* new line Wagner */ - double gIstotg, gIstotd, gIstotb, gIstots, Istoteq; - double gIdtotg, gIdtotd, gIdtotb, gIdtots, Idtoteq; - double gIgtotg, gIgtotd, gIgtotb, gIgtots, Igtoteq; - - /* v3.0 */ - double Vbsitf, dVbsitf_dVg, dVbsitf_dVd, dVbsitf_dVb, dVbsitf_dVe, dVbsitf_dT, dVbs_dVb; - double dVbs_dVg, dVbs_dVd, dVbs_dVe, dVbs_dT; - double dIgb1_dVe, Giie, dRatio_dVe, dVdiff_dVe; - double dT1_dVe, dT5_dVe, dIgb_dVe, dVox_dVe, dVoxdepinv_dVe, dVaux_dVe; - double Gme, gTte, gbbe, gddpe, gsspe; - double Vbs0, dVbs0_dVg, dVbs0_dVd, dVbs0_dVe, dVbs0_dT; - double Vbs0mos, dVbs0mos_dVe, dVbs0mos_dT; - double Vbsmos, dVbsmos_dVg, dVbsmos_dVd, dVbsmos_dVb, dVbsmos_dVe, dVbsmos_dT; - double PhiON, dPhiON_dVg, dPhiON_dVd, dPhiON_dVe, dPhiON_dT; - double PhiFD, dPhiFD_dVg, dPhiFD_dVd, dPhiFD_dVe, dPhiFD_dT; - double Vbs0t, dVbs0t_dVg, dVbs0t_dVd, dVbs0t_dVe, dVbs0t_dT; - double VthFD, dVthFD_dVd, dVthFD_dVb, dVthFD_dVe, dVthFD_dT; - double VtgsFD, ExpVtgsFD, VgstFD, ExpVgstFD; - double VtgseffFD, dVtgseffFD_dVd, dVtgseffFD_dVg, dVtgseffFD_dVe, dVtgseffFD_dT; - double VgsteffFD, dVgsteffFD_dVd, dVgsteffFD_dVg, dVgsteffFD_dVe, dVgsteffFD_dT; - double dT2_dVe, dVbsh_dVg, dVbsh_dVd, dVbsh_dVe, dVbsh_dT; - double dVgsteff_dVe, dVbseff_dVg, dVbseff_dVd, dVbseff_dVe, dVbseff_dT; - - /* v2.2 release */ - double Vgb, dVgb_dVg, dVgb_dVd, dVgb_dVe, dVgb_dVb, Vox, dVox_dVg, dVox_dVd, dVox_dVb; - double OxideRatio, Vaux, dVaux_dVg, dVaux_dVd, dVaux_dVb; - double Igb, dIgb_dVg, dIgb_dVd, dIgb_dVb; - double ceqgate; - double dT0_dVox, Voxeff, dVoxeff_dVox; - double dVox_dT, dVaux_dT, dIgb_dT; - double Voxacc, dVoxacc_dVg, dVoxacc_dVd, dVoxacc_dVe, dVoxacc_dVb, dVoxacc_dT; - double Voxdepinv, dVoxdepinv_dVg, dVoxdepinv_dVb, dVoxdepinv_dVd, dVoxdepinv_dT; - double Igb1, dIgb1_dVg, dIgb1_dVd, dIgb1_dVb, dIgb1_dT; - double Igb2, dIgb2_dVg, dIgb2_dVd, dIgb2_dVb, dIgb2_dVe, dIgb2_dT; - double gigs, gigd, gigb, gigg, gigT, gige; /* LFW_FD enhance line */ - double gigpg, gigpp; - - /* v4.0 */ - double IdlovVdseff, dIdlovVdseff_dVg, dIdlovVdseff_dVd, dIdlovVdseff_dVb; - double vdbs, vsbs, vdbd=0.0, vsbd, vsbdo, vbs_jct, vbd_jct; - double Vsbs, Vdbd, Vdbs; - double delvdbd, delvsbs, delvdbs, delvbd_jct, delvbs_jct; - double gcdbdb, gcsbsb, gcsbb, gcdbb; - double ceqqjd=0.0, ceqqjs=0.0; - double Lpe_Vb; /* v4.0 for Vth */ - double DITS_Sft, DITS_Sft2, dDITS_Sft_dVb, dDITS_Sft_dVd, dDITS_Sft2_dVd, dDITS_Sft_dT; - double FP, dFP_dT, dFP_dVg, dFP_dVb, dFP_dVd, dFP_dVe; - double VADITS, dVADITS_dVg, dVADITS_dVd, dVADITS_dVb, dVADITS_dVe, dVADITS_dT; /* for DITS */ - double Iii_Igidl, Giigidl_b, Giigidl_d, Giigidl_g, Giigidl_e, Giigidl_T; - double gjsdb; - double Idbdp=0.0, Isbsp=0.0, cdbdp, csbsp, gcjdbdp, gcjsbsp, GGjdb, GGjsb; - double vdes, vses, vdedo, delvdes, delvses, delvded, Isestot, cseshat, Idedtot, cdedhat; - double PowWeffWr, rd0=0.0, rs0=0.0, rdwmin=0.0, rswmin=0.0, drs0_dT=0.0, drd0_dT=0.0, drswmin_dT=0.0, - drdwmin_dT=0.0, Rd, dRd_dVg, dRd_dVb, dRd_dT, Rs, dRs_dVg, dRs_dVb, dRs_dT; - double dgstot_dvd, dgstot_dvg, dgstot_dvs, dgstot_dvb, dgstot_dve, dgstot_dT; - double dgdtot_dvd, dgdtot_dvg, dgdtot_dvs, dgdtot_dvb, dgdtot_dve, dgdtot_dT; - double gstot, gstotd, gstotg, gstots, gstotb, ceqgstot; - double gdtot, gdtotd, gdtotg, gdtots, gdtotb, ceqgdtot; - double gdpr, gspr; - /*4.1*/ - double toxe, epsrox, epssub, epsgate; - double Tnom, Eg0, Vtm0; - double Vbci, Idsmosfet, Iiibjt; - double dVbci_dT, dIiibjt_dVd, dIiibjt_dVb, dIiibjt_dT; - double VgsteffVth, dT11_dVg; - /* v4.1 */ - /* Jun 09 */ - double toxe_mob ; - /* Jun 09 */ - - - double dTheta0_dT, dn_dT, dsqrtPhisExt_dT, dT3zb_dT, dltwzb_dT, dlt1zb_dT, dTheta0zb_dT, dvth0_dT, dDIBL_Sft_dT,dtmp2_dT; /* v4.2 temp deriv */ - double Vgd, Vgd_eff, dVgd_eff_dVg, dVgd_eff_dT; /* enhanced line Wagner */ - double dVbs0mos_dVd; - double Ig_agbcp2, dIg_agbcp2_dVg, dIg_agbcp2_dVp, dIg_agbcp2_dT; - double vgp_eff, vgp=0.0, dvgp_eff_dvg, dvgp_eff_dvp, dvgp_eff_dT; - - /* improved body contact charge model */ - double CoxWL2, CoxWLb2; - double ExpVgst2, Vgsteff2, VgstNVt2, ExpArg2; - double dVgsteff2_dVd, dVgsteff2_dVg, dVgsteff2_dVb, dVgsteff2_dVe, dVgsteff2_dT; - double T02; - double Qac02, dQac02_dVrg, dQac02_dVd, dQac02_dVg, dQac02_dVb, dQac02_dVe, dQac02_dT; - double Vgs_eff2, dVgs_eff2_dVg; - double Vfbzb2, dVfbzb2_dT; - double Vfb2, dVfb2_dVg, dVfb2_dVd, dVfb2_dVb, dVfb2_dVe, dVfb2_dT; - double Vfbeff2, dVfbeff2_dVd, dVfbeff2_dVrg, dVfbeff2_dVg, dVfbeff2_dVb, dVfbeff2_dVe, dVfbeff2_dT; - double Qsub02, dQsub02_dVg, dQsub02_dVrg, dQsub02_dVd, dQsub02_dVb, dQsub02_dVe, dQsub02_dT; - double VdsatCV2, dVdsatCV2_dVg, dVdsatCV2_dVb, dVdsatCV2_dVd, dVdsatCV2_dVe, dVdsatCV2_dT; - double VdseffCV2, dVdseffCV2_dVg, dVdseffCV2_dVd, dVdseffCV2_dVb, dVdseffCV2_dVe, dVdseffCV2_dT; - double Cbg12, Cbd12, Cbb12, Cbe12; - double Cgg12, Cgd12, Cgb12, Cge12; - double Csg12, Csd12, Csb12, Cse12; - double Tcen2, dTcen2_dVg, dTcen2_dVd, dTcen2_dVb, dTcen2_dVe, dTcen2_dT; - double Ccen2; - double Coxeff2, dCoxeff2_dVg, dCoxeff2_dVd, dCoxeff2_dVb, dCoxeff2_dVe, dCoxeff2_dT; - double CoxWLcenb2, dCoxWLcenb2_dT; - double QovCox2; - double DeltaPhi2, dDeltaPhi2_dVg, dDeltaPhi2_dVd, dDeltaPhi2_dVb, dDeltaPhi2_dVe; - double dDeltaPhi2_dT; /* new line Wagner */ - double CoxWLcen2; - double T22, T52; - double qsrc2, qbulk2; - double dqsrc2_dT, dqbulk2_dT; /* new line Wagner */ - double Csg2, Csd2, Csb2, Cse2; - double DELTA_3_SOI2; - double dphi_dT,dsqrtPhi_dT,dXdep0_dT,cdep0,theta0vb0,dtheta0vb0_dT; - double thetaRout,dthetaRout_dT,dcdep0_dT; - double dPhis_dT,dsqrtPhis_dT,dXdep_dT,dlt1_dT,dltw_dT; - double agidl, bgidl, cgidl, egidl, rgidl, kgidl, fgidl; - - double agisl, bgisl, cgisl, egisl, rgisl, kgisl, fgisl; - double ucs, ud; /* Bugfix # 21 Jul09*/ - double ndiode, ndioded; /* v4.2 bugfix */ - double nrecf0s, nrecf0d, nrecr0s, nrecr0d, vrec0s, vrec0d, ntuns, ntund, vtun0s,vtun0d;/*bugfix for junction DC swapping */ - - double eggbcp2, eggdep, agb1, bgb1, agb2, bgb2, agbc2n, agbc2p, bgbc2n, bgbc2p, Vtm00; /* v4.3.1 bugfix for mtrlMod=1 -Tanvir */ - double m; - -#ifndef USE_OMP - for (; model != NULL; model = B4SOInextModel(model)) - { for (here = B4SOIinstances(model); here != NULL; - here = B4SOInextInstance(here)) - { - -#endif - Check = 0; - ByPass = 0; - selfheat = (model->B4SOIshMod == 1) && (here->B4SOIrth0 != 0.0); - pParam = here->pParam; - - - if ((ckt->CKTmode & MODEINITSMSIG)) - { - vs = *(ckt->CKTrhsOld + here->B4SOIsNodePrime); - if (!here->B4SOIvbsusrGiven) { - vbs = *(ckt->CKTstate0 + here->B4SOIvbs); - vb = *(ckt->CKTrhsOld + here->B4SOIbNode); - } - else { - vbs = here->B4SOIvbsusr; - vb = here->B4SOIvbsusr + vs; - } - vgs = *(ckt->CKTstate0 + here->B4SOIvgs); - ves = *(ckt->CKTstate0 + here->B4SOIves); - vps = *(ckt->CKTstate0 + here->B4SOIvps); - vds = *(ckt->CKTstate0 + here->B4SOIvds); - delTemp = *(ckt->CKTstate0 + here->B4SOIdeltemp); - /* v4.0 */ - vdbs = *(ckt->CKTstate0 + here->B4SOIvdbs); /* v4.0 for rbody */ - vdbd = *(ckt->CKTstate0 + here->B4SOIvdbd); /* v4.0 for rbody */ - vsbs = *(ckt->CKTstate0 + here->B4SOIvsbs); /* v4.0 for rbody */ - vses = *(ckt->CKTstate0 + here->B4SOIvses); /* v4.0 for rdsmod*/ - vdes = *(ckt->CKTstate0 + here->B4SOIvdes); /* v4.0 for rdsmod*/ - - /* v4.0 end */ - - vg = *(ckt->CKTrhsOld + here->B4SOIgNode); - vd = *(ckt->CKTrhsOld + here->B4SOIdNodePrime); - vp = *(ckt->CKTrhsOld + here->B4SOIpNode); - ve = *(ckt->CKTrhsOld + here->B4SOIeNode); - - /* v3.1 added for RF */ - vgge = *(ckt->CKTrhsOld + here->B4SOIgNodeExt); - vggm = *(ckt->CKTrhsOld + here->B4SOIgNodeMid); - - vges = *(ckt->CKTstate0 + here->B4SOIvges); - vgms = *(ckt->CKTstate0 + here->B4SOIvgms); - /* v3.1 added for RF end*/ - } - else if ((ckt->CKTmode & MODEINITTRAN)) - { - vs = *(ckt->CKTrhsOld + here->B4SOIsNodePrime); - if (!here->B4SOIvbsusrGiven) { - vbs = *(ckt->CKTstate1 + here->B4SOIvbs); - vb = *(ckt->CKTrhsOld + here->B4SOIbNode); - } - else { - vbs = here->B4SOIvbsusr; - vb = here->B4SOIvbsusr + vs; - } - vgs = *(ckt->CKTstate1 + here->B4SOIvgs); - ves = *(ckt->CKTstate1 + here->B4SOIves); - vps = *(ckt->CKTstate1 + here->B4SOIvps); - vds = *(ckt->CKTstate1 + here->B4SOIvds); - delTemp = *(ckt->CKTstate1 + here->B4SOIdeltemp); - - /* v4.0 */ - vdbs = *(ckt->CKTstate1 + here->B4SOIvdbs); /* v4.0 for rbody */ - vsbs = *(ckt->CKTstate1 + here->B4SOIvsbs); /* v4.0 for rbody */ - vses = *(ckt->CKTstate1 + here->B4SOIvses); /* v4.0 for rdsmod */ - vdes = *(ckt->CKTstate1 + here->B4SOIvdes); /* v4.0 for rdsmod */ - /* v4.0 end */ - - vg = *(ckt->CKTrhsOld + here->B4SOIgNode); - vd = *(ckt->CKTrhsOld + here->B4SOIdNodePrime); - vp = *(ckt->CKTrhsOld + here->B4SOIpNode); - ve = *(ckt->CKTrhsOld + here->B4SOIeNode); - - /* v3.1 added for RF */ - vgge = *(ckt->CKTrhsOld + here->B4SOIgNodeExt); - vggm = *(ckt->CKTrhsOld + here->B4SOIgNodeMid); - vges = *(ckt->CKTstate1 + here->B4SOIvges); - vgms = *(ckt->CKTstate1 + here->B4SOIvgms); - /* v3.1 added for RF end*/ - - } - else if ((ckt->CKTmode & MODEINITJCT) && !here->B4SOIoff) - { vds = model->B4SOItype * here->B4SOIicVDS; - vgs = model->B4SOItype * here->B4SOIicVGS; - ves = model->B4SOItype * here->B4SOIicVES; - vbs = model->B4SOItype * here->B4SOIicVBS; - vps = model->B4SOItype * here->B4SOIicVPS; - vdbs = vsbs = vbs; /* v4.0 */ - - vg = vd = vs = vp = ve = 0.0; - - /* v3.1 added for RF */ - vges = vgms = vgs; - vgge = vggm =0.0; - /* v3.1 added for RF end*/ - - if (vds > 0.0) /* v4.0 */ - { vdes = vds + 0.01; - vses = -0.01; - } - else if (vds < 0.0) - { vdes = vds - 0.01; - vses = 0.01; - } - else - vdes = vses = 0.0; - - delTemp = 0.0; - here->B4SOIphi = pParam->B4SOIphi; - - - - if ((vds == 0.0) && (vgs == 0.0) && (vbs == 0.0) && - ((ckt->CKTmode & (MODETRAN | MODEAC|MODEDCOP | - MODEDCTRANCURVE)) || (!(ckt->CKTmode & MODEUIC)))) - { - /* vgs = model->B4SOItype*0.1 + here->B4SOIvth0; */ - vgs = model->B4SOItype * here->B4SOIvth0 + 0.1; /* v4.0 */ - vds = 0.0; - ves = 0.0; - vps = 0.0; - vges = vgms = vgs; /* v3.1 */ - vbs = vdbs = vsbs = 0.0; /* v4.0 */ - vdes = 0.01; /* v4.0 for rdsmod */ - vses = -0.01; /* v4.0 for rdsmod */ - } - } - else if ((ckt->CKTmode & (MODEINITJCT | MODEINITFIX)) && - (here->B4SOIoff)) - { delTemp = vps = vbs = vgs = vds = ves = 0.0; - vg = vd = vs = vp = ve = 0.0; - vgge = vggm = 0.0; /* v3.1 */ - vges = vgms =0.0; /* v3.1 */ - vdbs = vsbs = vdes = vses = 0.0; /* v4.0 */ - } - else - { -#ifndef PREDICTOR - - if ((ckt->CKTmode & MODEINITPRED)) - { xfact = ckt->CKTdelta / ckt->CKTdeltaOld[1]; - *(ckt->CKTstate0 + here->B4SOIvbs) = - *(ckt->CKTstate1 + here->B4SOIvbs); - vbs = (1.0 + xfact)* (*(ckt->CKTstate1 + here->B4SOIvbs)) - - (xfact * (*(ckt->CKTstate2 + here->B4SOIvbs))); - *(ckt->CKTstate0 + here->B4SOIvgs) = - *(ckt->CKTstate1 + here->B4SOIvgs); - vgs = (1.0 + xfact)* (*(ckt->CKTstate1 + here->B4SOIvgs)) - - (xfact * (*(ckt->CKTstate2 + here->B4SOIvgs))); - *(ckt->CKTstate0 + here->B4SOIves) = - *(ckt->CKTstate1 + here->B4SOIves); - ves = (1.0 + xfact)* (*(ckt->CKTstate1 + here->B4SOIves)) - - (xfact * (*(ckt->CKTstate2 + here->B4SOIves))); - *(ckt->CKTstate0 + here->B4SOIvps) = - *(ckt->CKTstate1 + here->B4SOIvps); - vps = (1.0 + xfact)* (*(ckt->CKTstate1 + here->B4SOIvps)) - - (xfact * (*(ckt->CKTstate2 + here->B4SOIvps))); - *(ckt->CKTstate0 + here->B4SOIvds) = - *(ckt->CKTstate1 + here->B4SOIvds); - vds = (1.0 + xfact)* (*(ckt->CKTstate1 + here->B4SOIvds)) - - (xfact * (*(ckt->CKTstate2 + here->B4SOIvds))); - *(ckt->CKTstate0 + here->B4SOIvbd) = - *(ckt->CKTstate0 + here->B4SOIvbs) - - *(ckt->CKTstate0 + here->B4SOIvds); - /* v4.0 */ - *(ckt->CKTstate0 + here->B4SOIvdbs) = - *(ckt->CKTstate1 + here->B4SOIvdbs); - vdbs = (1.0 + xfact)* (*(ckt->CKTstate1 + here->B4SOIvdbs)) - - (xfact * (*(ckt->CKTstate2 + here->B4SOIvdbs))); - *(ckt->CKTstate0 + here->B4SOIvdbd) = - *(ckt->CKTstate0 + here->B4SOIvdbs) - - *(ckt->CKTstate0 + here->B4SOIvds); - *(ckt->CKTstate0 + here->B4SOIvsbs) = - *(ckt->CKTstate1 + here->B4SOIvsbs); - vsbs = (1.0 + xfact)* (*(ckt->CKTstate1 + here->B4SOIvsbs)) - - (xfact * (*(ckt->CKTstate2 + here->B4SOIvsbs))); - *(ckt->CKTstate0 + here->B4SOIvses) = - *(ckt->CKTstate1 + here->B4SOIvses); - vses = (1.0 + xfact)* (*(ckt->CKTstate1 + here->B4SOIvses)) - - (xfact * (*(ckt->CKTstate2 + here->B4SOIvses))); - *(ckt->CKTstate0 + here->B4SOIvdes) = - *(ckt->CKTstate1 + here->B4SOIvdes); - vdes = (1.0 + xfact)* (*(ckt->CKTstate1 + here->B4SOIvdes)) - - (xfact * (*(ckt->CKTstate2 + here->B4SOIvdes))); - /* v4.0 end */ - - *(ckt->CKTstate0 + here->B4SOIvg) = *(ckt->CKTstate1 + here->B4SOIvg); - *(ckt->CKTstate0 + here->B4SOIvd) = *(ckt->CKTstate1 + here->B4SOIvd); - *(ckt->CKTstate0 + here->B4SOIvs) = *(ckt->CKTstate1 + here->B4SOIvs); - *(ckt->CKTstate0 + here->B4SOIvp) = *(ckt->CKTstate1 + here->B4SOIvp); - *(ckt->CKTstate0 + here->B4SOIve) = *(ckt->CKTstate1 + here->B4SOIve); - - /* v3.1 added for RF */ - *(ckt->CKTstate0 + here->B4SOIvgge) = *(ckt->CKTstate1 + here->B4SOIvgge); - *(ckt->CKTstate0 + here->B4SOIvggm) = *(ckt->CKTstate1 + here->B4SOIvggm); - *(ckt->CKTstate0 + here->B4SOIvges) = - *(ckt->CKTstate1 + here->B4SOIvges); - vges = (1.0 + xfact)* (*(ckt->CKTstate1 + here->B4SOIvges)) - - (xfact * (*(ckt->CKTstate2 + here->B4SOIvges))); - *(ckt->CKTstate0 + here->B4SOIvgms) = - *(ckt->CKTstate1 + here->B4SOIvgms); - vgms = (1.0 + xfact)* (*(ckt->CKTstate1 + here->B4SOIvgms)) - - (xfact * (*(ckt->CKTstate2 + here->B4SOIvgms))); - /* v3.1 added for RF end */ - - /* Only predict ve */ - ve = (1.0 + xfact)* (*(ckt->CKTstate1 + here->B4SOIve)) - - (xfact * (*(ckt->CKTstate2 + here->B4SOIve))); - /* Then update vg, vs, vb, vd, vp base on ve */ - vs = ve - model->B4SOItype * ves; - vg = model->B4SOItype * vgs + vs; - vd = model->B4SOItype * vds + vs; - vb = model->B4SOItype * vbs + vs; - vp = model->B4SOItype * vps + vs; - - vgge = model->B4SOItype * vges + vs; /* v3.1 */ - vggm = model->B4SOItype * vgms + vs; /* v3.1 */ - - delTemp = (1.0 + xfact)* (*(ckt->CKTstate1 + - here->B4SOIdeltemp))-(xfact * (*(ckt->CKTstate2 + - here->B4SOIdeltemp))); - - /* v2.2.3 bug fix */ - *(ckt->CKTstate0 + here->B4SOIdeltemp) = - *(ckt->CKTstate1 + here->B4SOIdeltemp); - - /* if (selfheat) - { - here->B4SOIphi = 2.0 * here->B4SOIvtm - * log(pParam->B4SOInpeak / - here->B4SOIni); - } v4.2 bugfix never used in the code */ - - } - else - { -#endif /* PREDICTOR */ - - vg = B4SOIlimit(*(ckt->CKTrhsOld + here->B4SOIgNode), - *(ckt->CKTstate0 + here->B4SOIvg), 3.0, &Check); - vd = B4SOIlimit(*(ckt->CKTrhsOld + here->B4SOIdNodePrime), - *(ckt->CKTstate0 + here->B4SOIvd), 3.0, &Check); - vs = B4SOIlimit(*(ckt->CKTrhsOld + here->B4SOIsNodePrime), - *(ckt->CKTstate0 + here->B4SOIvs), 3.0, &Check); - vp = B4SOIlimit(*(ckt->CKTrhsOld + here->B4SOIpNode), - *(ckt->CKTstate0 + here->B4SOIvp), 3.0, &Check); - ve = B4SOIlimit(*(ckt->CKTrhsOld + here->B4SOIeNode), - *(ckt->CKTstate0 + here->B4SOIve), 3.0, &Check); - /* v3.1 added for RF */ - vgge = B4SOIlimit(*(ckt->CKTrhsOld + here->B4SOIgNodeExt), - *(ckt->CKTstate0 + here->B4SOIvgge), 3.0, &Check); - - vggm = B4SOIlimit(*(ckt->CKTrhsOld + here->B4SOIgNodeMid), - *(ckt->CKTstate0 + here->B4SOIvggm), 3.0, &Check); - /* v3.1 added for RF end */ - - delTemp = *(ckt->CKTrhsOld + here->B4SOItempNode); - - vbs = model->B4SOItype * (*(ckt->CKTrhsOld+here->B4SOIbNode) - - *(ckt->CKTrhsOld+here->B4SOIsNodePrime)); - - vps = model->B4SOItype * (vp - vs); - vgs = model->B4SOItype * (vg - vs); - ves = model->B4SOItype * (ve - vs); - vds = model->B4SOItype * (vd - vs); - - vges = model->B4SOItype * (vgge - vs); /* v3.1 */ - vgms = model->B4SOItype * (vggm - vs); /* v3.1 */ - - /* v4.0 */ - vdbs = model->B4SOItype - * (*(ckt->CKTrhsOld + here->B4SOIdbNode) - - *(ckt->CKTrhsOld + here->B4SOIsNodePrime)); - vsbs = model->B4SOItype - * (*(ckt->CKTrhsOld + here->B4SOIsbNode) - - *(ckt->CKTrhsOld + here->B4SOIsNodePrime)); - vses = model->B4SOItype - * (*(ckt->CKTrhsOld + here->B4SOIsNode) - - *(ckt->CKTrhsOld + here->B4SOIsNodePrime)); - vdes = model->B4SOItype - * (*(ckt->CKTrhsOld + here->B4SOIdNode) - - *(ckt->CKTrhsOld + here->B4SOIsNodePrime)); - /* v4.0 end */ - -#ifndef PREDICTOR - } -#endif /* PREDICTOR */ - - vbd = vbs - vds; - vdbd = vdbs - vds; /* v4.0 */ - - vgd = vgs - vds; - ved = ves - vds; - vgdo = *(ckt->CKTstate0 + here->B4SOIvgs) - - *(ckt->CKTstate0 + here->B4SOIvds); - vedo = *(ckt->CKTstate0 + here->B4SOIves) - - *(ckt->CKTstate0 + here->B4SOIvds); - - /* v3.1 for RF */ - vgedo = *(ckt->CKTstate0 + here->B4SOIvges) - - *(ckt->CKTstate0 + here->B4SOIvds); - vgmdo = *(ckt->CKTstate0 + here->B4SOIvgms) - - *(ckt->CKTstate0 + here->B4SOIvds); - vged = vges - vds; - vgmd = vgms - vds; - delvged = vged - vgedo; - delvgmd = vgmd - vgmdo; - /* v3.1 for RF end*/ - - delvbs = vbs - *(ckt->CKTstate0 + here->B4SOIvbs); - delvbd = vbd - *(ckt->CKTstate0 + here->B4SOIvbd); - delvgs = vgs - *(ckt->CKTstate0 + here->B4SOIvgs); - delves = ves - *(ckt->CKTstate0 + here->B4SOIves); - delvps = vps - *(ckt->CKTstate0 + here->B4SOIvps); - deldelTemp = delTemp - *(ckt->CKTstate0 + here->B4SOIdeltemp); - delvds = vds - *(ckt->CKTstate0 + here->B4SOIvds); - delvgd = vgd - vgdo; - delved = ved - vedo; - delvges = vges - *(ckt->CKTstate0 + here->B4SOIvges); /* v3.1 */ - delvgms = vgms - *(ckt->CKTstate0 + here->B4SOIvgms); /* v3.1 */ - delvdbd = vdbd - *(ckt->CKTstate0 + here->B4SOIvdbd); /* v4.0 */ - delvdbs = vdbs - *(ckt->CKTstate0 + here->B4SOIvdbs); /* v4.0 */ - delvsbs = vsbs - *(ckt->CKTstate0 + here->B4SOIvsbs); /* v4.0 */ - - delvbd_jct = (!here->B4SOIrbodyMod) ? delvbd : delvdbd; /*v4.0*/ - delvbs_jct = (!here->B4SOIrbodyMod) ? delvbs : delvsbs; /*v4.0*/ - - delvses = vses - *(ckt->CKTstate0 + here->B4SOIvses);/*v4.0*/ - vdedo = *(ckt->CKTstate0 + here->B4SOIvdes) - - *(ckt->CKTstate0 + here->B4SOIvds); /* v4.0 */ - delvdes = vdes - *(ckt->CKTstate0 + here->B4SOIvdes); /* v4.0 */ - delvded = vdes - vds - vdedo; /* v4.0 */ - - if (here->B4SOImode >= 0) - { - cdhat = here->B4SOIcd - + (here->B4SOIgm-here->B4SOIgjdg) * delvgs - + (here->B4SOIgds - here->B4SOIgjdd) * delvds - + (here->B4SOIgmbs * delvbs - - here->B4SOIgjdb * delvbs_jct ) /* v4.0 */ - + (here->B4SOIgme - here->B4SOIgjde) * delves - + (here->B4SOIgmT - here->B4SOIgjdT) * deldelTemp; /* v3.0 */ - } - else - { - cdhat = here->B4SOIcd - + (here->B4SOIgm-here->B4SOIgjdg) * delvgd - - (here->B4SOIgds - here->B4SOIgjdd) * delvds - + (here->B4SOIgmbs * delvbd - - here->B4SOIgjdb * delvbd_jct ) /*v4.0 */ - + (here->B4SOIgme - here->B4SOIgjde) * delved - + (here->B4SOIgmT - here->B4SOIgjdT) * deldelTemp; /* v3.0 */ - - } - cbhat = here->B4SOIcb + here->B4SOIgbgs * delvgs - + here->B4SOIgbbs * delvbs - + here->B4SOIgbds * delvds - + here->B4SOIgbes * delves - + here->B4SOIgbps * delvps - + here->B4SOIgbT * deldelTemp; /* v3.0 */ - - Isestot = here->B4SOIgstot * (*(ckt->CKTstate0 + here->B4SOIvses)); - cseshat = Isestot + here->B4SOIgstot * delvses - + here->B4SOIgstotd * delvds + here->B4SOIgstotg * delvgs - + here->B4SOIgstotb * delvbs; - - Idedtot = here->B4SOIgdtot * vdedo; - cdedhat = Idedtot + here->B4SOIgdtot * delvded - + here->B4SOIgdtotd * delvds + here->B4SOIgdtotg * delvgs - + here->B4SOIgdtotb * delvbs; - -#ifndef NOBYPASS - /* following should be one big if connected by && all over - * the place, but some C compilers can't handle that, so - * we split it up here to let them digest it in stages - */ - - if ((!(ckt->CKTmode & MODEINITPRED)) && (ckt->CKTbypass) && Check == 0) - if ((here->B4SOIsoiMod == 2) || /* v3.2 */ - (fabs(delvbs) < (ckt->CKTreltol * MAX(fabs(vbs), - fabs(*(ckt->CKTstate0+here->B4SOIvbs))) + ckt->CKTvoltTol)) ) - if ((here->B4SOIsoiMod == 2) || /* v3.2 */ - (fabs(delvbd) < (ckt->CKTreltol * MAX(fabs(vbd), - fabs(*(ckt->CKTstate0+here->B4SOIvbd))) + ckt->CKTvoltTol)) ) - if ((fabs(delvgs) < (ckt->CKTreltol * MAX(fabs(vgs), - fabs(*(ckt->CKTstate0+here->B4SOIvgs))) + ckt->CKTvoltTol))) - if ((fabs(delves) < (ckt->CKTreltol * MAX(fabs(ves), - fabs(*(ckt->CKTstate0+here->B4SOIves))) + ckt->CKTvoltTol))) - if ( (here->B4SOIbodyMod == 0) || (here->B4SOIbodyMod == 2) || - (fabs(delvps) < (ckt->CKTreltol * MAX(fabs(vps), - fabs(*(ckt->CKTstate0+here->B4SOIvps))) + ckt->CKTvoltTol)) ) - if ( (here->B4SOItempNode == 0) || - (fabs(deldelTemp) < (ckt->CKTreltol * MAX(fabs(delTemp), - fabs(*(ckt->CKTstate0+here->B4SOIdeltemp))) - + ckt->CKTvoltTol*1e4))) - - /* v3.1 added for RF */ - if ((here->B4SOIrgateMod == 0) || (here->B4SOIrgateMod == 1) - || (fabs(delvges) < (ckt->CKTreltol * MAX(fabs(vges), - fabs(*(ckt->CKTstate0 + here->B4SOIvges))) + ckt->CKTvoltTol))) - if ((here->B4SOIrgateMod != 3) || (fabs(delvgms) < (ckt->CKTreltol - * MAX(fabs(vgms), fabs(*(ckt->CKTstate0 + here->B4SOIvgms))) - + ckt->CKTvoltTol))) - /* v3.1 added for RF end */ - /* v4.0 */ - if ((!here->B4SOIrbodyMod) || (fabs(delvdbs) < (ckt->CKTreltol - * MAX(fabs(vdbs), fabs(*(ckt->CKTstate0 + here->B4SOIvdbs))) - + ckt->CKTvoltTol))) - if ((!here->B4SOIrbodyMod) || (fabs(delvdbd) < (ckt->CKTreltol - * MAX(fabs(vdbd), fabs(*(ckt->CKTstate0 + here->B4SOIvdbd))) - + ckt->CKTvoltTol))) - if ((!here->B4SOIrbodyMod) || (fabs(delvsbs) < (ckt->CKTreltol - * MAX(fabs(vsbs), fabs(*(ckt->CKTstate0 + here->B4SOIvsbs))) - + ckt->CKTvoltTol))) - if ((!model->B4SOIrdsMod) || (fabs(delvses) < (ckt->CKTreltol - * MAX(fabs(vses), fabs(*(ckt->CKTstate0 + here->B4SOIvses))) - + ckt->CKTvoltTol))) - if ((!model->B4SOIrdsMod) || (fabs(delvdes) < (ckt->CKTreltol - * MAX(fabs(vdes), fabs(*(ckt->CKTstate0 + here->B4SOIvdes))) - + ckt->CKTvoltTol))) - if ((!model->B4SOIrdsMod) || ((fabs(cseshat - Isestot) < ckt->CKTreltol - * MAX(fabs(cseshat), fabs(Isestot)) + ckt->CKTabstol))) - if ((!model->B4SOIrdsMod) || ((fabs(cdedhat - Idedtot) < ckt->CKTreltol - * MAX(fabs(cdedhat), fabs(Idedtot)) + ckt->CKTabstol))) - /* v4.0 end */ - - if ((fabs(delvds) < (ckt->CKTreltol * MAX(fabs(vds), - fabs(*(ckt->CKTstate0+here->B4SOIvds))) + ckt->CKTvoltTol))) - if ((fabs(cdhat - here->B4SOIcd) < ckt->CKTreltol - * MAX(fabs(cdhat),fabs(here->B4SOIcd)) + ckt->CKTabstol)) - if ((here->B4SOIsoiMod == 2) || /* v3.2 */ - (fabs(cbhat - here->B4SOIcb) < ckt->CKTreltol - * MAX(fabs(cbhat),fabs(here->B4SOIcb)) + ckt->CKTabstol) ) - { /* bypass code */ - vbs = *(ckt->CKTstate0 + here->B4SOIvbs); - vbd = *(ckt->CKTstate0 + here->B4SOIvbd); - vgs = *(ckt->CKTstate0 + here->B4SOIvgs); - ves = *(ckt->CKTstate0 + here->B4SOIves); - vps = *(ckt->CKTstate0 + here->B4SOIvps); - vds = *(ckt->CKTstate0 + here->B4SOIvds); - - /* v3.1 added for RF */ - vges = *(ckt->CKTstate0 + here->B4SOIvges); - vgms = *(ckt->CKTstate0 + here->B4SOIvgms); - vged = vges - vds; - vgmd = vgms - vds; - vgme = vgms - ves; - /* v3.1 added for RF end */ - vgmb = vgms - vbs; /* v3.2 bug fix */ - - /* v4.0 */ - vdbs = *(ckt->CKTstate0 + here->B4SOIvdbs); - vdbd = *(ckt->CKTstate0 + here->B4SOIvdbd); - vsbs = *(ckt->CKTstate0 + here->B4SOIvsbs); - vbs_jct = (!here->B4SOIrbodyMod) ? vbs : vsbs; - vbd_jct = (!here->B4SOIrbodyMod) ? vbd : vdbd; - vses = *(ckt->CKTstate0 + here->B4SOIvses); - vdes = *(ckt->CKTstate0 + here->B4SOIvdes); - /* v4.0 end */ - - delTemp = *(ckt->CKTstate0 + here->B4SOIdeltemp); - /* calculate Vds for temperature conductance calculation - in bypass (used later when filling Temp node matrix) */ - Vds = here->B4SOImode > 0 ? vds : -vds; - - vgd = vgs - vds; - vgb = vgs - vbs; - veb = ves - vbs; - - if ((ckt->CKTmode & (MODETRAN | MODEAC)) || - ((ckt->CKTmode & MODETRANOP) && (ckt->CKTmode & MODEUIC))) - { ByPass = 1; - goto line755; - } - else - { goto line850; - } - } - -#endif /*NOBYPASS*/ - von = here->B4SOIvon; - - - if (*(ckt->CKTstate0 + here->B4SOIvds) >= 0.0) - { T0 = *(ckt->CKTstate0 + here->B4SOIvbs); - - /* v3.1 added for RF */ - if (here->B4SOIrgateMod == 3) - { - vged = vges - vds; - vgmd = vgms - vds; - } - else if ((here->B4SOIrgateMod == 1) || (here->B4SOIrgateMod == 2)) - { - vged = vges - vds; - } - /* v3.1 added for RF end*/ - - } - else - { T0 = *(ckt->CKTstate0 + here->B4SOIvbd); - - /* added for RF */ - if (here->B4SOIrgateMod == 3) - { - vges = vged + vds; - vgms = vgmd + vds; - } - if ((here->B4SOIrgateMod == 1) || (here->B4SOIrgateMod == 2)) - { - vges = vged + vds; - } - /* added for RF end*/ - - } - - if (vds >= 0.0) - { - vbs = B4SOIlimit(vbs, T0, 0.2, &Check); - vbd = vbs - vds; - vb = model->B4SOItype * vbs + vs; - - if (here->B4SOIrbodyMod) /* v4.0 */ - { vdbs = B4SOIlimit(vdbs, - *(ckt->CKTstate0 + here->B4SOIvdbs), 0.2, &Check); - vdbd = vdbs - vds; - vsbs = B4SOIlimit(vsbs, - *(ckt->CKTstate0 + here->B4SOIvsbs), 0.2, &Check); - } - } - else - { - vbd = B4SOIlimit(vbd, T0, 0.2, &Check); - vbs = vbd + vds; - vb = model->B4SOItype * vbs + vd; - /* v4.0 */ - if (here->B4SOIrbodyMod) - { vdbd = B4SOIlimit(vdbd, - *(ckt->CKTstate0 + here->B4SOIvdbd), 0.2, &Check); - vdbs = vdbd + vds; - vsbdo = *(ckt->CKTstate0 + here->B4SOIvsbs) - - *(ckt->CKTstate0 + here->B4SOIvds); - vsbd = vsbs - vds; - vsbd = B4SOIlimit(vsbd, vsbdo, 0.2, &Check); - vsbs = vsbd + vds; - } - /* v4.0 end */ - } - - delTemp =B4SOIlimit(delTemp, - *(ckt->CKTstate0 + here->B4SOIdeltemp),5.0,&Check); - - } - - if(model->B4SOImtrlMod) - { - epsrox = 3.9; - toxe = model->B4SOIeot; - epssub = EPS0 * model->B4SOIepsrsub; - /* bugfix following constants should be replaced with model params -Tanvir */ - eggbcp2 = 1.12; - eggdep = 1.12; - agb1 = 3.7622e-7; - bgb1 = -3.1051e10; - agb2 = 4.9758e-7; - bgb2 = -2.357e10; - agbc2n = 3.42537e-7; - agbc2p = 4.97232e-7; - bgbc2n = 1.16645e12; - bgbc2p = 7.45669e11; - } - else - { - epsrox = model->B4SOIepsrox; - toxe = model->B4SOItox; - epssub = EPSSI; - /* bugfix v4.3.1 following constants are valid for mtrlMod=0 -Tanvir */ - eggbcp2 = 1.12; - eggdep = 1.12; - agb1 = 3.7622e-7; - bgb1 = -3.1051e10; - agb2 = 4.9758e-7; - bgb2 = -2.357e10; - agbc2n = 3.42537e-7; - agbc2p = 4.97232e-7; - bgbc2n = 1.16645e12; - bgbc2p = 7.45669e11; - } - - - /* Calculate temperature dependent values for self-heating effect */ - Temp = delTemp + ckt->CKTtemp; - dTempRatio_dT = 1 / model->B4SOItnom; - TempRatio = Temp * dTempRatio_dT; - here->B4SOITempSH = Temp; /*v4.2 added for portability of SH Temp */ - dEg_dT = 0.0; /* new line Wagner */ - Vtm00= 0.026; /* v4.3.1 Vtm00 replaces hardcoded 0.026 -Tanvir */ - if (selfheat) { - if(model->B4SOImtrlMod==0) - { - Vtm = KboQ * Temp; - - T0 = 1108.0 + Temp; - T5 = Temp * Temp; - Eg = 1.16 - 7.02e-4 * T5 / T0; - - dEg_dT = T1 = ((7.02e-4 * T5) - T0 * (14.04e-4 * Temp)) / T0 / T0; /* enhanced line Wagner */ - /* T1 = dEg / dT */ - - T2 = 1.9230584e-4; /* T2 = 1 / 300.15^(3/2) */ - T5 = sqrt(Temp); - T3 = 1.45e10 * Temp * T5 * T2; - T4 = exp(21.5565981 - Eg / (2.0 * Vtm)); - ni = T3 * T4; - dni_dT = 2.175e10 * T2 * T5 * T4 + T3 * T4 * - (-Vtm * T1 + Eg * KboQ) / (2.0 * Vtm * Vtm); - - T0 = log(1.0e20 * pParam->B4SOInpeak / (ni * ni)); - vbi = Vtm * T0; - dvbi_dT = KboQ * T0 + Vtm * (-2.0 * dni_dT / ni); - } - else - { - Tnom = model->B4SOItnom; - Vtm = KboQ * Temp; - Vtm0= KboQ * Tnom; - - Eg0 = model->B4SOIeg0; - T0 = model->B4SOItbgbsub + Temp; - T5 = Temp * Temp; - Eg = model->B4SOIbg0sub - model->B4SOItbgasub * Temp * Temp - / (Temp + model->B4SOItbgbsub); - - dEg_dT = T1 = ((model->B4SOItbgasub * T5) - T0 * (2.0*model->B4SOItbgasub * Temp)) / T0 / T0; /* enhanced line Wagner */ - /* T1 = dEg / dT */ - - T2 = 1/sqrt(Tnom*Tnom*Tnom); - T5 = sqrt(Temp); - T3 = model->B4SOIni0sub * Temp * T5 * T2; - T4 = exp(Eg0/(2.0*Vtm0) - Eg / (2.0 * Vtm)); - ni = T3 * T4; - dni_dT=1.5*model->B4SOIni0sub*T5*T2*T4+ - T3*T4*(-Vtm * T1 + Eg * KboQ) / (2.0 * Vtm * Vtm); - - T0 = log(1.0e20 * pParam->B4SOInpeak / (ni * ni)); - vbi = Vtm * T0; - dvbi_dT = KboQ * T0 + Vtm * (-2.0 * dni_dT / ni); - - - } - if (pParam->B4SOInsub > 0) { - T0 = log(pParam->B4SOInpeak / pParam->B4SOInsub); - vfbb = -model->B4SOItype * Vtm * T0; - dvfbb_dT = -model->B4SOItype * KboQ * T0; - } - else { - T0 = log(-pParam->B4SOInpeak * pParam->B4SOInsub / ni / ni); - vfbb = -model->B4SOItype * Vtm * T0; - dvfbb_dT = -model->B4SOItype * - (KboQ * T0 - Vtm * 2.0 * dni_dT / ni); - } - - /* V4.0 changed phi */ - phi = 2.0 * Vtm * log(pParam->B4SOInpeak / ni); - /* phi = here->B4SOIphi; */ - sqrtPhi = sqrt(phi); - Xdep0 = sqrt(2.0 * epssub / (Charge_q - * pParam->B4SOInpeak * 1.0e6)) - * sqrtPhi; - /* v4.1 SH bug fix */ - /* dphi_dT = phi / Vtm * KboQ; v4.2 Temp Derivative bug fix */ - dphi_dT = phi / Vtm * KboQ - 2.0 * Vtm * dni_dT / ni; - dsqrtPhi_dT = 0.5 / sqrtPhi * dphi_dT; - dXdep0_dT = Xdep0 / sqrtPhi * dsqrtPhi_dT; - - /* cdep0 = sqrt(Charge_q * EPSSI - * pParam->B4SOInpeak * 1.0e6 / 2.0) / sqrtPhi; */ /* Bug fix #2 Jun 09 Body type is generalized for mtrlMod 1*/ - cdep0 = sqrt(Charge_q * epssub /* Fix */ - * pParam->B4SOInpeak * 1.0e6 / 2.0) / sqrtPhi; - /* fix LHS name - Wagner */ - /*dcep0_dT = cdep0 * sqrtPhi * (-1.0) / phi * dsqrtPhi_dT; */ - dcdep0_dT = cdep0 * sqrtPhi * (-1.0) / phi * dsqrtPhi_dT; - - /* T1 = sqrt(EPSSI / (model->B4SOIepsrox * EPSOX / 3.9) Bug fix #3 Jun 09 Body type is generalized for mtrlMod 1*/ - /* * model->B4SOItox * Xdep0); */ - T1 = sqrt(epssub / (epsrox * EPS0) /* Fix */ - * toxe * Xdep0); - dT1_dT = 0.5 * T1 / Xdep0 * dXdep0_dT; - T0 = exp(-0.5 * pParam->B4SOIdsub * pParam->B4SOIleff / T1); - dT0_dT = T0 * 0.5 * pParam->B4SOIdsub * pParam->B4SOIleff - / T1 / T1 * dT1_dT; - theta0vb0 = (T0 + 2.0 * T0 * T0); - dtheta0vb0_dT = (1.0 + 4.0 * T0) * dT0_dT; - T0 = exp(-0.5 * pParam->B4SOIdrout * pParam->B4SOIleff / T1); - dT0_dT = T0 * 0.5 * pParam->B4SOIdrout * pParam->B4SOIleff - / T1 / T1 * dT1_dT; - T2 = (T0 + 2.0 * T0 * T0); - thetaRout = pParam->B4SOIpdibl1 * T2 + pParam->B4SOIpdibl2; - dthetaRout_dT = pParam->B4SOIpdibl1 * (1.0 + 4.0 * T0) * dT0_dT; - /* Save the values below for phi calculation in B4SOIaccept() */ - here->B4SOIvtm = Vtm; - /* here->B4SOIni = ni; v4.2 bugfix never used in the code */ - - T3 = TempRatio - 1.0; - T8 = 1/ model->B4SOItnom; - T4 = Eg300 / Vtm * T3; - dT4_dT = Eg300 / Vtm / Vtm * (Vtm * T8 - T3 * KboQ); - - T7 = pParam->B4SOIxbjt * T4 / pParam->B4SOIndiode; - dT7_dT = pParam->B4SOIxbjt * dT4_dT - / pParam->B4SOIndiode; - DEXP(T7, T0, dT0_dT7); - dT0_dT = dT0_dT7 * dT7_dT; - - if (pParam->B4SOIxbjt == pParam->B4SOIxdif) { - T1 = T0; - dT1_dT = dT0_dT; - } - else { - T7 = pParam->B4SOIxdif * T4 / pParam->B4SOIndiode; - dT7_dT = pParam->B4SOIxdif * dT4_dT / pParam->B4SOIndiode; - DEXP(T7, T1, dT1_dT7); - dT1_dT = dT1_dT7 * dT7_dT; - } - - T7 = pParam->B4SOIxrec * T4 / pParam->B4SOInrecf0; - dT7_dT = pParam->B4SOIxrec * dT4_dT - / pParam->B4SOInrecf0; - DEXP(T7, T2, dT2_dT7); - dT2_dT = dT2_dT7 * dT7_dT; - - /* high level injection */ - Ahlis = pParam->B4SOIahli * T0; - dAhlis_dT = pParam->B4SOIahli * dT0_dT; - - jbjts = pParam->B4SOIisbjt * T0; - jdifs = pParam->B4SOIisdif * T1; - jrecs = pParam->B4SOIisrec * T2; - djbjts_dT = pParam->B4SOIisbjt * dT0_dT; - djdifs_dT = pParam->B4SOIisdif * dT1_dT; - djrecs_dT = pParam->B4SOIisrec * dT2_dT; - - T7 = pParam->B4SOIxtun * T3; - dT7_dT = pParam->B4SOIxtun * T8; - DEXP(T7, T0, dT0_dT7); - dT0_dT = dT0_dT7 * dT7_dT; - jtuns = pParam->B4SOIistun * T0; - djtuns_dT = pParam->B4SOIistun * dT0_dT; - - /* drain side */ - T7 = pParam->B4SOIxbjt * T4 / pParam->B4SOIndioded; - dT7_dT = pParam->B4SOIxbjt * dT4_dT / pParam->B4SOIndioded; - DEXP(T7, T0, dT0_dT7); - dT0_dT = dT0_dT7 * dT7_dT; - - if (pParam->B4SOIxbjt == pParam->B4SOIxdifd) { - T1 = T0; - dT1_dT = dT0_dT; - } - else { - T7 = pParam->B4SOIxdifd * T4 / pParam->B4SOIndioded; - dT7_dT = pParam->B4SOIxdifd * dT4_dT / pParam->B4SOIndioded; - DEXP(T7, T1, dT1_dT7); - dT1_dT = dT1_dT7 * dT7_dT; - } - - T7 = pParam->B4SOIxrecd * T4 / pParam->B4SOInrecf0d; - dT7_dT = pParam->B4SOIxrecd * dT4_dT / pParam->B4SOInrecf0d; - DEXP(T7, T2, dT2_dT7); - dT2_dT = dT2_dT7 * dT7_dT; - - /* high level injection */ - Ahlid = pParam->B4SOIahlid * T0; - dAhlid_dT = pParam->B4SOIahlid * dT0_dT; - - jbjtd = pParam->B4SOIidbjt * T0; - jdifd = pParam->B4SOIiddif * T1; - - jrecd = pParam->B4SOIidrec * T2; - djbjtd_dT = pParam->B4SOIidbjt * dT0_dT; - djdifd_dT = pParam->B4SOIiddif * dT1_dT; - djrecd_dT = pParam->B4SOIidrec * dT2_dT; - - T7 = pParam->B4SOIxtund * T3; - dT7_dT = pParam->B4SOIxtund * T8; - DEXP(T7, T0, dT0_dT7); - dT0_dT = dT0_dT7 * dT7_dT; - jtund = pParam->B4SOIidtun * T0; - djtund_dT = pParam->B4SOIidtun * dT0_dT; - - - u0temp = pParam->B4SOIu0 - * pow(TempRatio, pParam->B4SOIute); - du0temp_dT = pParam->B4SOIu0 * pParam->B4SOIute * - pow(TempRatio, pParam->B4SOIute - 1.0) * T8; - ku0temp = pParam->B4SOIku0 * (1.0 - /* + model->B4SOItku0 * TempRatio) + DELTA; v4.2 bugfix */ - + model->B4SOItku0 * T3) + DELTA; - dku0temp_dT = pParam->B4SOIku0 * model->B4SOItku0 * T8; - T2 = ku0temp * ku0temp; - T7 = model->B4SOIku0 * pParam->B4SOIinv_od_ref; - rho_ref = T7 / ku0temp; - drho_ref_dT = -T7 / T2 * dku0temp_dT; - T4 = model->B4SOIku0 * here->B4SOIInv_ODeff; - rho = T4 / ku0temp; - drho_dT = -T4 / T2 * dku0temp_dT; - T2 = (1.0 + rho); - T7 = (1.0 + rho_ref); - T0 = T2 / T7; - dT0_dT = (drho_dT * T7 - drho_ref_dT * T2 ) / T7 / T7; - du0temp_dT = T0 * du0temp_dT + u0temp * dT0_dT; - u0temp *= T0; - - vsattemp = pParam->B4SOIvsat - pParam->B4SOIat * T3; - dvsattemp_dT = -pParam->B4SOIat * T8; - T2 = (1.0 + here->B4SOIkvsat * rho); - T7 = (1.0 + here->B4SOIkvsat * rho_ref); - T0 = T2 / T7; - dT0_dT = (here->B4SOIkvsat * drho_dT * T7 - - here->B4SOIkvsat * drho_ref_dT * T2) - / T7 / T7; - dvsattemp_dT = dvsattemp_dT * T0 + vsattemp * dT0_dT; - vsattemp *= T0; - here->B4SOIvsattemp = vsattemp; - - if (!model->B4SOIrdsMod) { - rds0 = (pParam->B4SOIrdsw + pParam->B4SOIprt * T3) - / pParam->B4SOIrds0denom; - drds0_dT = pParam->B4SOIprt / pParam->B4SOIrds0denom - * T8; - } - else { /* v4.0 */ - PowWeffWr = pParam->B4SOIrds0denom * here->B4SOInf; - T10 = pParam->B4SOIprt * T3; - - /* External Rd(V) */ - T1 = pParam->B4SOIrdw + T10; - T2 = model->B4SOIrdwmin + T10; - rd0 = T1 / PowWeffWr; - rdwmin = T2 / PowWeffWr; - drd0_dT = pParam->B4SOIprt / PowWeffWr * T8; - drdwmin_dT = drd0_dT; - - /* External Rs(V) */ - T7 = pParam->B4SOIrsw + T10; - T4 = model->B4SOIrswmin + T10; - rs0 = T7 / PowWeffWr; - rswmin = T4 / PowWeffWr; - drs0_dT = drswmin_dT = drd0_dT; - } - - ua = pParam->B4SOIuatemp + pParam->B4SOIua1 * T3; - ub = pParam->B4SOIubtemp + pParam->B4SOIub1 * T3; - uc = pParam->B4SOIuctemp + pParam->B4SOIuc1 * T3; - dua_dT = pParam->B4SOIua1 * T8; - dub_dT = pParam->B4SOIub1 * T8; - duc_dT = pParam->B4SOIuc1 * T8; - } - else { - vbi = pParam->B4SOIvbi; - vfbb = pParam->B4SOIvfbb; - phi = pParam->B4SOIphi; - sqrtPhi = pParam->B4SOIsqrtPhi; - Xdep0 = pParam->B4SOIXdep0; - /* Eg = model->B4SOIeg0; */ /* Bug fix #11 Jun 09 'Eg is evaluated at Temp, not Tnom' */ - Eg = model->B4SOIeg; /* 'model->B4SOIeg' computed in b4soitemp.c */ - /* v4.1 */ /* Since selfheat=0, using Eg from b4soitemp.c*/ - cdep0 = pParam->B4SOIcdep0; - theta0vb0 = pParam->B4SOItheta0vb0; - thetaRout = pParam->B4SOIthetaRout; - - jbjts = pParam->B4SOIjbjts; /* v4.0 */ - jbjtd = pParam->B4SOIjbjtd; - jdifs = pParam->B4SOIjdifs; - jdifd = pParam->B4SOIjdifd; - jrecs = pParam->B4SOIjrecs; - jrecd = pParam->B4SOIjrecd; - jtuns = pParam->B4SOIjtuns; - jtund = pParam->B4SOIjtund; - - /* v2.2.2 bug fix */ - Ahlis = pParam->B4SOIahli0s; - Ahlid = pParam->B4SOIahli0d; - - u0temp = here->B4SOIu0temp; - vsattemp = here->B4SOIvsattemp; - ua = pParam->B4SOIua; - ub = pParam->B4SOIub; - uc = pParam->B4SOIuc; - dni_dT = dvbi_dT = dvfbb_dT = 0.0; - djbjts_dT = djdifs_dT = djrecs_dT = djtuns_dT = 0.0; - djbjtd_dT = djdifd_dT = djrecd_dT = djtund_dT = 0.0; - du0temp_dT = dvsattemp_dT = 0.0; - dua_dT = dub_dT = duc_dT = 0.0; - /* v4.1 */ - dphi_dT = dsqrtPhi_dT = dXdep0_dT = 0.0; - dcdep0_dT = dtheta0vb0_dT = dthetaRout_dT = 0.0; - - if (!model->B4SOIrdsMod) { - rds0 = pParam->B4SOIrds0; - drds0_dT = 0.0; - } - else { - rd0 = pParam->B4SOIrd0; - rs0 = pParam->B4SOIrs0; - rdwmin = pParam->B4SOIrdwmin; - rswmin = pParam->B4SOIrswmin; - drd0_dT = drs0_dT = drdwmin_dT = drswmin_dT = 0.0; - } - dAhlis_dT = dAhlid_dT = 0; - } - - /* TempRatio used for Vth and mobility */ - if (selfheat) { - TempRatioMinus1 = Temp / model->B4SOItnom - 1.0; - } - else { - TempRatioMinus1 = ckt->CKTtemp / model->B4SOItnom - 1.0; - } - - /* determine DC current and derivatives */ - vbd = vbs - vds; - vgd = vgs - vds; - vgb = vgs - vbs; - ved = ves - vds; - veb = ves - vbs; - vge = vgs - ves; - vpd = vps - vds; - vgp = vgs - vps; - - /* v3.1 added for RF */ - vged = vges - vds; - vgmd = vgms - vds; - vgme = vgms - ves; - /* v3.1 added for RF end */ - vgmb = vgms - vbs; /* v3.2 bug fix */ - - agidl = pParam->B4SOIagidl; - bgidl = pParam->B4SOIbgidl; - cgidl = pParam->B4SOIcgidl; - egidl = pParam->B4SOIegidl; - rgidl = pParam->B4SOIrgidl; - kgidl = pParam->B4SOIkgidl; - fgidl = pParam->B4SOIfgidl; - - agisl = pParam->B4SOIagisl; - bgisl = pParam->B4SOIbgisl; - cgisl = pParam->B4SOIcgisl; - egisl = pParam->B4SOIegisl; - rgisl = pParam->B4SOIrgisl; - kgisl = pParam->B4SOIkgisl; - fgisl = pParam->B4SOIfgisl; - - - if (vds >= 0.0) - { /* normal mode */ - here->B4SOImode = 1; - Vds = vds; - Vgs = vgs; - Vbs = vbs; - Vbd = vbd; - Ves = ves; - Vps = vps; - Vsbs = vsbs; /* v4.0 */ - Vdbs = vdbs; /* v4.0 */ - Vdbd = Vdbs - Vds; /* v4.0 */ - Vgd = vgd; /* v4.1 */ - wdios = pParam->B4SOIwdios; - wdiod = pParam->B4SOIwdiod; - ndiode = pParam->B4SOIndiode; /* v4.2 bugfix*/ - ndioded = pParam->B4SOIndioded; /* v4.2 bugfix*/ - - nrecf0s = pParam->B4SOInrecf0; /* bugfix_snps start for junction DC part*/ - nrecf0d = pParam->B4SOInrecf0d; - nrecr0s = pParam->B4SOInrecr0; - nrecr0d = pParam->B4SOInrecr0d; - vrec0s = pParam->B4SOIvrec0; - vrec0d = pParam->B4SOIvrec0d; - ntuns = pParam->B4SOIntun; - ntund = pParam->B4SOIntund; - vtun0s = pParam->B4SOIvtun0; - vtun0d = pParam->B4SOIvtun0d; /* bugfix_snps end for junction DC part*/ - } - else - { /* inverse mode */ - here->B4SOImode = -1; - Vds = -vds; - Vgs = vgd; - Vbs = vbd; - Vbd = vbs; - Ves = ved; - Vps = vpd; - Vsbs = vdbd; /* v4.0 */ - Vdbd = vsbs; /* v4.0 */ - Vdbs = Vdbd + Vds; /* v4.0 */ - Vgd = vgs; /* v4.1 */ - wdios = pParam->B4SOIwdiod; - wdiod = pParam->B4SOIwdios; - ndiode = pParam->B4SOIndioded; /* v4.2 bugfix*/ - ndioded = pParam->B4SOIndiode; /* v4.2 bugfix*/ - - nrecf0s = pParam->B4SOInrecf0d; /* bugfix_snps start for junction DC part*/ - nrecf0d = pParam->B4SOInrecf0; - nrecr0s = pParam->B4SOInrecr0d; - nrecr0d = pParam->B4SOInrecr0; - vrec0s = pParam->B4SOIvrec0d; - vrec0d = pParam->B4SOIvrec0; - ntuns = pParam->B4SOIntund; - ntund = pParam->B4SOIntun; - vtun0s = pParam->B4SOIvtun0d; - vtun0d = pParam->B4SOIvtun0; /* bugfix_snps end for junction DC part*/ - } - if( vds < 0.0) - {/*Diode current*/ - T0 = jbjts; - T1 = djbjts_dT; - jbjts = jbjtd; - djbjts_dT = djbjtd_dT; - jbjtd = T0; - djbjtd_dT = T1; - - T0 = jdifs; - T1 = djdifs_dT; - jdifs = jdifd; - djdifs_dT = djdifd_dT; - jdifd = T0; - djdifd_dT = T1; - - T0 = jrecs; - T1 = djrecs_dT; - jrecs = jrecd; - djrecs_dT = djrecd_dT; - jrecd = T0; - djrecd_dT = T1; - - T0 = jtuns; - T1 = djtuns_dT; - jtuns = jtund; - djtuns_dT = djtund_dT; - jtund = T0; - djtund_dT = T1; - - /*GISL/GIDL*/ - T0 = agidl; - agidl = agisl; - agisl = T0; - - T0 = bgidl; - bgidl = bgisl; - bgisl = T0; - - T0 = cgidl; - cgidl = cgisl; - cgisl = T0; - - T0 = egidl; - egidl = egisl; - egisl = T0; - - T0 = rgidl; - rgidl = rgisl; - rgisl = T0; - - T0 = kgidl; - kgidl = kgisl; - kgisl = T0; - - T0 = fgidl; - fgidl = fgisl; - fgisl = T0; - - T0 = Ahlis; /* bugfix_snps */ - Ahlis = Ahlid; /* bugfix_snps */ - Ahlid = T0; /* bugfix_snps */ - - T0 = dAhlis_dT; /* bugfix_snps */ - dAhlis_dT = dAhlid_dT; /* bugfix_snps */ - dAhlid_dT = T0; /* bugfix_snps */ - - } - vbs_jct = (!here->B4SOIrbodyMod) ? Vbs : Vsbs; /* v4.0 */ - vbd_jct = (!here->B4SOIrbodyMod) ? Vbd : Vdbd; /* v4.0 */ - - Vesfb = Ves - vfbb; - Cbox = model->B4SOIcbox; - K1 = pParam->B4SOIk1eff; - - ChargeComputationNeeded = - ((ckt->CKTmode & (MODEAC | MODETRAN | MODEINITSMSIG)) || - ((ckt->CKTmode & MODETRANOP) && (ckt->CKTmode & MODEUIC))) - ? 1 : 0; - - if (here->B4SOIdebugMod <0) - ChargeComputationNeeded = 1; - -#ifdef B4SOI_DEBUG_OUT - ChargeComputationNeeded = 1; - here->B4SOIdebug1 = 0.0; - here->B4SOIdebug2 = 0.0; - here->B4SOIdebug3 = 0.0; -#endif - - /* Poly Gate Si Depletion Effect */ - T0 = here->B4SOIvfb + phi; - if (model->B4SOImtrlMod==0) - epsgate = epssub; - else - epsgate = model->B4SOIepsrgate * EPS0; - - if ((pParam->B4SOIngate > 1.e18) && (pParam->B4SOIngate < 1.e25) - && (Vgs > T0)&& (epsgate!=0)) - /* added to avoid the problem caused by ngate */ - { T1 = 1.0e6 * Charge_q * epsgate * pParam->B4SOIngate - / (model->B4SOIcox * model->B4SOIcox); - T4 = sqrt(1.0 + 2.0 * (Vgs - T0) / T1); - T2 = T1 * (T4 - 1.0); - T3 = 0.5 * T2 * T2 / T1; /* T3 = Vpoly */ - /* T7 = 1.12 - T3 - 0.05; */ - T7 = eggdep - T3 - 0.05; /* bugfix: v4.3.1 -Tanvir */ - T6 = sqrt(T7 * T7 + 0.224); - /* T5 = 1.12 - 0.5 * (T7 + T6); */ - T5 = eggdep - 0.5 * (T7 + T6); /* bugfix: v4.3.1 -Tanvir */ - Vgs_eff = Vgs - T5; - dVgs_eff_dVg = 1.0 - (0.5 - 0.5 / T4) * (1.0 + T7 / T6); - /* 7 new lines Wagner */ - if (selfheat) { - dTL2_dT = - dphi_dT / T4; - dTL3_dT = T2 * dTL2_dT / T1; - dTL6_dT = - T7 * dTL3_dT / T6; - dVgs_eff_dT = 0.5 * (dTL6_dT - dTL3_dT); - } - else dVgs_eff_dT = 0.0; - } - else - { Vgs_eff = Vgs; - dVgs_eff_dVg = 1.0; - dVgs_eff_dT = 0.0; /* new line Wagner */ - } - - if ((pParam->B4SOIngate > 1.e18) && (pParam->B4SOIngate < 1.e25)/* Bug fix # 25/26 Vgd_eff defined */ - && (Vgd > T0)&& (epsgate!=0)) - /* added to avoid the problem caused by ngate */ - { T1 = 1.0e6 * Charge_q * epsgate * pParam->B4SOIngate - / (model->B4SOIcox * model->B4SOIcox); - T4 = sqrt(1.0 + 2.0 * (Vgd - T0) / T1); - T2 = T1 * (T4 - 1.0); - T3 = 0.5 * T2 * T2 / T1; /* T3 = Vpoly */ - /* T7 = 1.12 - T3 - 0.05; */ - T7 = eggdep - T3 - 0.05; /* bugfix: v4.3.1 -Tanvir */ - T6 = sqrt(T7 * T7 + 0.224); - /* T5 = 1.12 - 0.5 * (T7 + T6); */ - T5 = eggdep - 0.5 * (T7 + T6); /* bugfix: v4.3.1 -Tanvir */ - Vgd_eff = Vgd - T5; - dVgd_eff_dVg = 1.0 - (0.5 - 0.5 / T4) * (1.0 + T7 / T6); - /* 7 new lines Wagner */ - if (selfheat) { - dTL2_dT = - dphi_dT / T4; - dTL3_dT = T2 * dTL2_dT / T1; - dTL6_dT = - T7 * dTL3_dT / T6; - dVgd_eff_dT = 0.5 * (dTL6_dT - dTL3_dT); - } - else dVgd_eff_dT = 0.0; - } - else - { Vgd_eff = Vgd; - dVgd_eff_dVg = 1.0; - dVgd_eff_dT = 0.0; /* new line Wagner */ - } - - /* if( here->B4SOImode != 1){ - T1=Vgs_eff; - Vgs_eff=Vgd_eff; - Vgd_eff=T1; - T2=dVgs_eff_dVg; - dVgs_eff_dVg=dVgd_eff_dVg; - dVgd_eff_dVg=T2; - } */ - - /* v4.1 for improved BT charge model, no poly depletion */ - - Vgs_eff2 = Vgs; - dVgs_eff2_dVg = 1.0; - - /* end v4.1 for improved BT charge model */ - Leff = pParam->B4SOIleff; - - if (selfheat) { - Vtm = KboQ * Temp; - dVtm_dT = KboQ; - } - else { - Vtm = model->B4SOIvtm; - dVtm_dT = 0.0; - } - - V0 = vbi - phi; - - - /* begin of v3.0 block addition */ - /* B/S built-in potential lowering calculation */ - if (here->B4SOIsoiMod == 0) /* BSIMPD */ /* v3.2 */ - { - Vbsmos = Vbs; - dVbsmos_dVg = 0.0; - dVbsmos_dVd = 0.0; - dVbsmos_dVb = 1.0; - dVbsmos_dVe = 0.0; - /* LFW_FD 5 new lines */ - dVbs_dVg = 0.0; - dVbs_dVd = 0.0; - dVbs_dVb = 1.0; - dVbs_dVe = 0.0; - dVbs_dT = 0.0; - dVbsmos_dT = 0.0; - - Vbp = Vbs - Vps; - dVbp_dVb = 1; - } - else /* soiMod = 1 or 2: adding FD module on top of BSIMPD */ - { - /* prepare Vbs0 & Vbs0mos for VthFD calculation */ - if (model->B4SOIfdMod == 0) /* v4.0 */ - { - T0 = -model->B4SOIdvbd1 * pParam->B4SOIleff / pParam->B4SOIlitl; - T1 = model->B4SOIdvbd0 * (exp(0.5*T0) + 2*exp(T0)); - T2 = T1 * (vbi - phi); - T3 = 0.5 * pParam->B4SOIqsi / model->B4SOIcsi; /* v3.2 */ - Vbs0t = phi - T3 + model->B4SOIvbsa + T2; - dVbs0t_dVd = 0.0; - dVbs0_dVd = 0.0; - if (selfheat) - /* dVbs0t_dT = T1 * dvbi_dT; */ - dVbs0t_dT = (1.0 - T1) * dphi_dT + T1 * dvbi_dT; /* LFW_FD new line */ - else - dVbs0t_dT = 0.0; - - T0 = 1 + model->B4SOIcsi / Cbox; - T3 = -model->B4SOIdk2b * pParam->B4SOIleff / pParam->B4SOIlitl; - T5 = model->B4SOIk2b * (exp(0.5*T3) + 2*exp(T3)); - T1 = (model->B4SOIk1b - T5) / T0; - T2 = T1 * Vesfb; - T4 = 1.0/(1 + Cbox / model->B4SOIcsi); - Vbs0 = T4 * Vbs0t + T2; - dVbs0_dVe = T1; - dVbs0_dVd = 0.0; /* flexilint */ - if (selfheat) - dVbs0_dT = T4 * dVbs0t_dT - T1 * dvfbb_dT; - else - dVbs0_dT = 0.0; - } - else - { - T0 = 1.0/(model->B4SOIcsi + Cbox + model->B4SOIcdsbs); - T1 = -model->B4SOIdvbd1 * pParam->B4SOIleff / pParam->B4SOIlitl; - T2 = model->B4SOIdvbd0 * (exp(0.5*T1) + 2*exp(T1)); - T3 = T2 * (Vds + model->B4SOIvsce); - T4 = 0.5 * pParam->B4SOIqsi / model->B4SOIcsi; - T5 = model->B4SOIcsi * T0 * (phi - T4 + model->B4SOIvbsa); - T6 = model->B4SOIcdsbs * T0 * T3; - Vbs0t = T5 + T6; - dVbs0t_dVd = model->B4SOIcdsbs * T0 * T2; - if (selfheat) - /* dVbs0t_dT = 0.0; LFW_FD changed line */ - dVbs0t_dT = model->B4SOIcsi * T0 * dphi_dT; - else - dVbs0t_dT = 0.0; - - T7 = Cbox * T0 * Vesfb; - Vbs0 = Vbs0t + T7; - dVbs0_dVe = Cbox * T0; - dVbs0_dVd = dVbs0t_dVd; - if (selfheat) - dVbs0_dT = dVbs0t_dT - Cbox * T0 * dvfbb_dT; - else - dVbs0_dT = 0.0; - - } - - /* zero field body potential cal. */ - T1 = Vbs0t - Vbs0 - 0.005; - T2 = sqrt(T1 * T1 + (2.5e-5)); - T3 = 0.5 * (T1 + T2); - T4 = T3 * model->B4SOIcsi / pParam->B4SOIqsi; /* v3.2 */ - Vbs0mos = Vbs0 - 0.5 * T3 * T4; - T5 = 0.5 * T4 * (1 + T1 / T2); - dVbs0mos_dVe = dVbs0_dVe * (1 + T5); - /* dVbs0mos_dVd = dVbs0_dVd + T5 * (dVbs0t_dVd - dVbs0_dVd); LFW_FD */ - dVbs0mos_dVd = dVbs0_dVd * (1 + T5) - T5 * dVbs0t_dVd; - if (selfheat) - dVbs0mos_dT = dVbs0_dT * (1 + T5) - T5 * dVbs0t_dT; - else - dVbs0mos_dT = 0.0; - - - /* set the upperbound of Vbs0mos to be phi for square root calc. */ - T1 = phi - 0.02; - T2 = T1 - Vbs0mos - 0.005; - T3 = sqrt(T2 * T2 + 4.0 * 0.005); - Vbs0mos = T1 - 0.5 * (T2 + T3); - T4 = 0.5 * (1 + T2 / T3); - dVbs0mos_dVe = T4 * dVbs0mos_dVe; - dVbs0mos_dVd = T4 * dVbs0mos_dVd; /* v4.1 */ - if (selfheat) - /* dVbs0mos_dT = T4 * dVbs0mos_dT; */ - dVbs0mos_dT = dphi_dT - T4 * (dphi_dT - dVbs0mos_dT); /* v4.1 */ - else dVbs0mos_dT = 0.0; - - - /* VthFD calculation */ - Phis = phi - Vbs0mos; - /* dPhis_dVb = -1; LFW_FD not used */ - sqrtPhis = sqrt(Phis); - dsqrtPhis_dVb = -0.5 / sqrtPhis; - Xdep = Xdep0 * sqrtPhis / sqrtPhi; - dXdep_dVb = (Xdep0 / sqrtPhi) * dsqrtPhis_dVb; - /* v4.2 bugfix temp deriv */ - if (selfheat) { - dPhis_dT = dphi_dT - dVbs0mos_dT; - dsqrtPhis_dT = 0.5 / sqrtPhis * dPhis_dT; - dXdep_dT = dXdep0_dT * sqrtPhis / sqrtPhi - + Xdep0 * (dsqrtPhis_dT * sqrtPhi - sqrtPhis * dsqrtPhi_dT) / phi; - } - else { - dPhis_dT = 0.0; - dsqrtPhis_dT = 0.0; - dXdep_dT = 0.0; - }/* v4.2 bugfix temp deriv */ - - T3 = sqrt(Xdep); - T0 = pParam->B4SOIdvt2 * Vbs0mos; - dT3_dT = 1.0 / (2.0 * T3) * dXdep_dT; /* v4.2 bugfix temp deriv */ - dT0_dT = pParam->B4SOIdvt2 * dVbs0mos_dT; /* v4.2 bugfix temp deriv */ - if (T0 >= - 0.5) - { T1 = 1.0 + T0; - dT1_dT = dT0_dT; /* v4.2 bugfix temp deriv */ - T2 = pParam->B4SOIdvt2 ; - } - else /* Added to avoid any discontinuity problems caused by dvt2 */ - { T4 = 1.0 / (3.0 + 8.0 * T0); - /* T1 = (1.0 + 3.0 * T0) * T4; */ /* v4.2 bugfix temp deriv */ - T5 = 1.0 + 3.0 * T0; /* v4.2 bugfix temp deriv */ - T1 = T4 * T5; /* v4.2 bugfix temp deriv */ - T2 = pParam->B4SOIdvt2 * T4 * T4 ; - dT1_dT = T4 * (3.0 - 8.0 * T5 * T4) * dT0_dT; /* v4.2 bugfix temp deriv */ - } - lt1 = model->B4SOIfactor1 * T3 * T1; - dlt1_dVb =model->B4SOIfactor1 * (0.5 / T3 * T1 * dXdep_dVb + T3 * T2); - dlt1_dT = model->B4SOIfactor1 * ( dT3_dT * T1+ T3 * dT1_dT); /* v4.2 bugfix temp deriv */ - - - T0 = pParam->B4SOIdvt2w * Vbs0mos; - dT0_dT = pParam->B4SOIdvt2w * dVbs0mos_dT; /* v4.2 bugfix temp deriv */ - if (T0 >= - 0.5) - { T1 = 1.0 + T0; - T2 = pParam->B4SOIdvt2w ; - dT1_dT = dT0_dT; /* v4.2 bugfix temp deriv */ - } - else /* Added to avoid any discontinuity problems caused by dvt2w */ - { T4 = 1.0 / (3.0 + 8.0 * T0); - /* T1 = (1.0 + 3.0 * T0) * T4; */ /* v4.2 bugfix temp deriv */ - T5 = 1.0 + 3.0 * T0; /* v4.2 bugfix temp deriv */ - T1 = T4 * T5; /* v4.2 bugfix temp deriv */ - T2 = pParam->B4SOIdvt2w * T4 * T4 ; - dT1_dT=T4*(3.0-8.0*T5*T4)*dT0_dT ; /* v4.2 bugfix temp deriv */ - } - ltw= model->B4SOIfactor1 * T3 * T1; - dltw_dVb=model->B4SOIfactor1*(0.5 / T3 * T1 * dXdep_dVb + T3 * T2); - - dltw_dT=model->B4SOIfactor1 *( dT3_dT * T1+ T3 *dT1_dT);/* v4.2 bugfix temp deriv */ - - T0 = -0.5 * pParam->B4SOIdvt1 * Leff / lt1; - if (T0 > -EXPL_THRESHOLD) - { T1 = exp(T0); - Theta0 = T1 * (1.0 + 2.0 * T1); - dT1_dVb = -T0 / lt1 * T1 * dlt1_dVb; - dTheta0_dVb = (1.0 + 4.0 * T1) * dT1_dVb; - dT1_dT = -T0 / lt1 * T1 * dlt1_dT; /* v4.2 bugfix temp deriv */ - dTheta0_dT = (1.0 + 4.0 * T1) * dT1_dT; /* v4.2 bugfix temp deriv */ - } - else - { T1 = MIN_EXPL; - Theta0 = T1 * (1.0 + 2.0 * T1); - dTheta0_dVb = 0.0; - dTheta0_dT = 0; /* v4.2 bugfix temp deriv */ - } - - T2 = pParam->B4SOInfactor * epssub / Xdep; - dT2_dVb = - T2 / Xdep * dXdep_dVb; - dT2_dT = - T2 / Xdep * dXdep_dT; /* v4.2 bugfix temp deriv */ - /* T3 = pParam->B4SOIcdsc + pParam->B4SOIcdscb * Vbseff - + pParam->B4SOIcdscd * Vds;*/ - /* v4.1 */ - T3 = pParam->B4SOIcdsc + pParam->B4SOIcdscb * Vbs0mos - + pParam->B4SOIcdscd * Vds; - dT3_dVb = pParam->B4SOIcdscb; - dT3_dVd = pParam->B4SOIcdscd; - T4 = (T2 + T3 * Theta0 + pParam->B4SOIcit) - / model->B4SOIcox; - dT4_dVb = (dT2_dVb + Theta0 * dT3_dVb - + dTheta0_dVb * T3) / model->B4SOIcox; - dT4_dVd = Theta0 * dT3_dVd / model->B4SOIcox; - dT4_dT = (dT2_dT + T3 * dTheta0_dT + pParam->B4SOIcdscb * dVbs0mos_dT * Theta0) / model->B4SOIcox; /* v4.2 bugfix temp deriv */ - if (T4 >= -0.5) { - n = 1.0 + T4; - dn_dVb = dT4_dVb; - - dn_dVd = dT4_dVd; - dn_dT = dT4_dT; /* v4.2 bugfix temp deriv */ - } - else { /* avoid discontinuity problems caused by T4 */ - T0 = 1.0 / (3.0 + 8.0 * T4); - /*n = (1.0 + 3.0 * T4) * T0;*/ /* v4.2 bugfix temp deriv */ - T5 = 1.0 + 3.0 * T4; /* v4.2 bugfix temp deriv */ - n = T0 * T5;/* v4.2 bugfix temp deriv */ - T0 *= T0; - dn_dVb = T0 * dT4_dVb; - dn_dVd = T0 * dT4_dVd; - dn_dT = T0 * (3.0 - 8.0 * T5 * T0) * dT4_dT; /* v4.2 bugfix temp deriv */ - } - - if (pParam->B4SOIdvtp0 > 0.0) { /* v4.0 */ - T0 = -pParam->B4SOIdvtp1 * Vds; - if (T0 < -EXPL_THRESHOLD) { - T2 = MIN_EXPL; - dT2_dVd = 0.0; - } - else { - T2 = exp(T0); - dT2_dVd = -pParam->B4SOIdvtp1 * T2; - } - - T3 = Leff + pParam->B4SOIdvtp0 * (1.0 + T2); - dT3_dVd = pParam->B4SOIdvtp0 * dT2_dVd; - T4 = Vtm * log(Leff / T3); - dT4_dVd = -Vtm * dT3_dVd / T3; - DITS_Sft = n * T4; - dDITS_Sft_dVd = dn_dVd * T4 + n * dT4_dVd; - dDITS_Sft_dVb = T4 * dn_dVb; - if (selfheat) { - /* dDITS_Sft_dT = n * KboQ * log(Leff / T3); *//* v4.2 bugfix temp deriv */ - dDITS_Sft_dT = n * KboQ * log(Leff / T3) + dn_dT * T4; /* v4.2 bugfix temp deriv */ - } - else - dDITS_Sft_dT = 0.0; - } - else { - DITS_Sft = dDITS_Sft_dVd = dDITS_Sft_dVb = 0.0; - dDITS_Sft_dT = 0.0; - } - - here->B4SOIthetavth = pParam->B4SOIdvt0 * Theta0; - Delt_vth = here->B4SOIthetavth * V0; - dDelt_vth_dVb = pParam->B4SOIdvt0 * dTheta0_dVb * V0; - if (selfheat) - /*dDelt_vth_dT = here->B4SOIthetavth * dvbi_dT;*/ - /*dDelt_vth_dT = here->B4SOIthetavth * (dvbi_dT - dphi_dT); */ - dDelt_vth_dT = pParam->B4SOIdvt0 * (dTheta0_dT * V0 + Theta0 * (dvbi_dT - dphi_dT)); /* v4.2 bugfix temp deriv */ - else dDelt_vth_dT = 0.0; - T0 = -0.5 * pParam->B4SOIdvt1w * pParam->B4SOIweff * Leff / ltw; - if (T0 > -EXPL_THRESHOLD) - { T1 = exp(T0); - T2 = T1 * (1.0 + 2.0 * T1); - dT1_dVb = -T0 / ltw * T1 * dltw_dVb; - dT2_dVb = (1.0 + 4.0 * T1) * dT1_dVb; - dT2_dT = -(1.0 + 4.0 * T1) * T1 * T0/ltw * dltw_dT; - } - else - { T1 = MIN_EXPL; - T2 = T1 * (1.0 + 2.0 * T1); - dT2_dVb = 0.0; - dT2_dT = 0; - } - T0 = pParam->B4SOIdvt0w * T2; - DeltVthw = T0 * V0; - dDeltVthw_dVb = pParam->B4SOIdvt0w * dT2_dVb * V0; - if (selfheat) - /* dDeltVthw_dT = T0 * dvbi_dT; */ - /* dDeltVthw_dT = T0 * (dvbi_dT - dphi_dT); v4.1 */ /* v4.2 bugfix temp deriv */ - dDeltVthw_dT = T0 * (dvbi_dT - dphi_dT) + pParam->B4SOIdvt0w * dT2_dT * V0; /* v4.2 bugfix temp deriv */ - else dDeltVthw_dT = 0.0; - - T0 = sqrt(1.0 + pParam->B4SOIlpe0 / Leff); - T1 = (pParam->B4SOIkt1 + pParam->B4SOIkt1l / Leff - + pParam->B4SOIkt2 * Vbs0mos); - - /* v4.0 */ - /* DeltVthtemp = pParam->B4SOIk1eff * (T0 - 1.0) * sqrtPhi + T1 * TempRatioMinus1; */ - DeltVthtemp = pParam->B4SOIk1ox * (T0 - 1.0) * sqrtPhi - + T1 * TempRatioMinus1; - /* v4.0 end */ - - if (selfheat) - /* dDeltVthtemp_dT = T1 / model->B4SOItnom; */ - /* dDeltVthtemp_dT = pParam->B4SOIk1ox * (T0 - 1.0) * dsqrtPhi_dT - + T1 / model->B4SOItnom; v4.1 */ /* v4.2 bugfix temp deriv */ - dDeltVthtemp_dT = pParam->B4SOIk1ox * (T0 - 1.0) * dsqrtPhi_dT - + T1 / model-> B4SOItnom+ pParam->B4SOIkt2 * dVbs0mos_dT* TempRatioMinus1;/* v4.2 bugfix temp deriv */ - else - dDeltVthtemp_dT = 0.0; - - tmp2 = toxe * phi / (pParam->B4SOIweff + pParam->B4SOIw0); - dtmp2_dT = toxe * dphi_dT / (pParam->B4SOIweff + pParam->B4SOIw0); /* v4.2 bugfix temp deriv */ - T3 = here->B4SOIeta0 + pParam->B4SOIetab * Vbs0mos;/*v4.0*/ - dT3_dT = pParam->B4SOIetab * dVbs0mos_dT; /*v4.2 temp deriv*/ - if (T3 < 1.0e-4) /* avoid discontinuity problems caused by etab */ - { T9 = 1.0 / (3.0 - 2.0e4 * T3); - T5 = (2.0e-4 - T3); /*v4.2 temp deriv*/ - T3 = T5 * T9; /*(2.0e-4 - T3) * T9;*/ /*v4.2 temp deriv*/ - T4 = T9 * T9 * pParam->B4SOIetab; - dT3_dVb = T4 ; - dT3_dT = (2.0e4 * T5 * T9 * T9 - T9) * dT3_dT; /*v4.2 temp deriv*/ - } - else - { - dT3_dVb = pParam->B4SOIetab ; - } - /* DIBL_Sft = T3 * pParam->B4SOItheta0vb0 * Vds; - dDIBL_Sft_dVd = pParam->B4SOItheta0vb0 * T3; - dDIBL_Sft_dVb = pParam->B4SOItheta0vb0 * Vds * dT3_dVb; */ /* v4.2 bug fix */ - DIBL_Sft = T3 * theta0vb0 * Vds; - dDIBL_Sft_dVd = theta0vb0 * T3; - dDIBL_Sft_dVb = theta0vb0 * Vds * dT3_dVb; - dDIBL_Sft_dT = Vds * (dT3_dT * theta0vb0 + T3 * dtheta0vb0_dT); /* v4.2 bug fix */ - Lpe_Vb = sqrt(1.0 + pParam->B4SOIlpeb / Leff); - - /* 4.1 */ - T0 = exp(2.0 * pParam->B4SOIdvtp4 * Vds); - DITS_Sft2 = pParam->B4SOIdvtp2factor * (T0-1) / (T0+1); - dDITS_Sft2_dVd = pParam->B4SOIdvtp2factor * pParam->B4SOIdvtp4 * 4.0 * T0 / ((T0+1) * (T0+1)); - - VthFD = model->B4SOItype * here->B4SOIvth0 - + (pParam->B4SOIk1ox * sqrtPhis - - pParam->B4SOIk1eff * sqrtPhi) * Lpe_Vb - - here->B4SOIk2ox * Vbs0mos- Delt_vth - DeltVthw - + (pParam->B4SOIk3 + pParam->B4SOIk3b * Vbs0mos) - * tmp2 + DeltVthtemp - DIBL_Sft - DITS_Sft - DITS_Sft2; - - - T6 = pParam->B4SOIk3b * tmp2 - here->B4SOIk2ox - + pParam->B4SOIkt2 * TempRatioMinus1; - dVthFD_dVb = Lpe_Vb * pParam->B4SOIk1ox * dsqrtPhis_dVb - - dDelt_vth_dVb - dDeltVthw_dVb - + T6 - dDIBL_Sft_dVb - dDITS_Sft_dVb; /* v4.0 */ - /* this is actually dVth_dVbs0mos */ - - dVthFD_dVe = dVthFD_dVb * dVbs0mos_dVe; - /* dVthFD_dVd = -dDIBL_Sft_dVd -dDITS_Sft_dVd; */ /* v4.0 */ - dVthFD_dVd = dVthFD_dVb * dVbs0mos_dVd - dDIBL_Sft_dVd - dDITS_Sft_dVd - dDITS_Sft2_dVd; /* v4.1 */ - - if (selfheat) - /* dVthFD_dT = dDeltVthtemp_dT - dDelt_vth_dT - - dDeltVthw_dT + dVthFD_dVb * dVbs0mos_dT - - dDITS_Sft_dT ; */ - /* dVthFD_dT = dDeltVthtemp_dT - dDelt_vth_dT - - dDeltVthw_dT + dVthFD_dVb * dVbs0mos_dT - - dDITS_Sft_dT - + Lpe_Vb * ( pParam->B4SOIk1ox * 0.5 / sqrtPhis * dphi_dT - - pParam->B4SOIk1eff * dsqrtPhi_dT); v4.1 */ - /* LFW_FD fixed expression */ - dVthFD_dT = (pParam->B4SOIk1ox * dsqrtPhis_dT - pParam->B4SOIk1eff * dsqrtPhi_dT) * Lpe_Vb - - here->B4SOIk2ox * dVbs0mos_dT - dDelt_vth_dT - dDeltVthw_dT - + pParam->B4SOIk3b * dVbs0mos_dT * tmp2 - + (pParam->B4SOIk3 + pParam->B4SOIk3b * Vbs0mos) * dtmp2_dT - + dDeltVthtemp_dT - dDIBL_Sft_dT - dDITS_Sft_dT; - - else dVthFD_dT = 0.0; - - - /* VtgseffFD calculation for PhiFD */ - VtgsFD = VthFD - Vgs_eff; - T10 = model->B4SOInofffd * Vtm; - DEXP( ((VtgsFD - model->B4SOIvofffd)/ T10), ExpVtgsFD, T0); - VtgseffFD = T10 * log(1.0 + ExpVtgsFD); - T0 /= (1.0 + ExpVtgsFD); - dVtgseffFD_dVd = T0 * dVthFD_dVd; - dVtgseffFD_dVg = -T0 * dVgs_eff_dVg; - dVtgseffFD_dVe = T0 * dVthFD_dVe; - if (selfheat) - /* fix below 1st line of expression - Wagner */ - /*dVtgseffFD_dT = T0 * (dVthFD_dT - (VtgsFD - model->B4SOIvofffd)/Temp) */ - dVtgseffFD_dT = T0 * (dVthFD_dT - dVgs_eff_dT - (VtgsFD - model->B4SOIvofffd)/Temp) - + VtgseffFD/Temp; - else dVtgseffFD_dT = 0.0; - - - /* surface potential modeling at strong inversion: PhiON */ - VgstFD = Vgs_eff - VthFD; - DEXP( ((VgstFD - model->B4SOIvofffd)/ T10), ExpVgstFD, T0); - VgsteffFD = T10 * log(1.0 + ExpVgstFD); - T0 /= (1.0 + ExpVgstFD); - dVgsteffFD_dVd = -T0 * dVthFD_dVd; - dVgsteffFD_dVg = T0 * dVgs_eff_dVg; - dVgsteffFD_dVe = -T0 * dVthFD_dVe; - if (selfheat) - /* fix below 1st line of expression - Wagner */ - /*dVgsteffFD_dT = T0 * (-dVthFD_dT */ - dVgsteffFD_dT = T0 * (dVgs_eff_dT - dVthFD_dT - - (VgstFD - model->B4SOIvofffd)/Temp) - + VgsteffFD/Temp; - else dVgsteffFD_dT = 0.0; - - - /* T1 = model->B4SOImoinFD*pParam->B4SOIk1eff*Vtm*Vtm; */ - T1 = model->B4SOImoinFD*pParam->B4SOIk1ox*Vtm*Vtm; - if (selfheat) dT1_dT = 2*T1/Temp; - else dT1_dT=0.0; - - T2 = VgsteffFD+ 2*pParam->B4SOIk1eff*sqrt(phi); - dT2_dVg = dVgsteffFD_dVg; - dT2_dVd = dVgsteffFD_dVd; - dT2_dVe = dVgsteffFD_dVe; - /* if (selfheat) dT2_dT = dVgsteffFD_dT; */ - if (selfheat) dT2_dT = dVgsteffFD_dT + 2*pParam->B4SOIk1eff*dsqrtPhi_dT; /* v4.1 */ - else dT2_dT = 0.0; - - T0 = 1+ VgsteffFD * T2 / T1; - dT0_dVg = (VgsteffFD * dT2_dVg + T2 * dVgsteffFD_dVg) / T1; - dT0_dVd = (VgsteffFD * dT2_dVd + T2 * dVgsteffFD_dVd) / T1; - dT0_dVe = (VgsteffFD * dT2_dVe + T2 * dVgsteffFD_dVe) / T1; - if (selfheat) - dT0_dT = (VgsteffFD * (dT2_dT - T2/T1 * dT1_dT) + T2 * dVgsteffFD_dT) / T1; - else dT0_dT = 0.0; - - - PhiON = phi + Vtm* log(T0) ; - dPhiON_dVg = Vtm* dT0_dVg/T0 ; - dPhiON_dVd = Vtm* dT0_dVd/T0 ; - dPhiON_dVe = Vtm* dT0_dVe/T0 ; - if (selfheat) - dPhiON_dT = dphi_dT + Vtm* dT0_dT/T0 + (PhiON-phi)/Temp ; /* v4.1 */ - else dPhiON_dT = 0.0; - - - /* surface potential from subthreshold to inversion: PhiFD */ - T0 = model->B4SOIcox / (model->B4SOIcox + 1.0/(1.0/model->B4SOIcsi + 1.0/Cbox)); - PhiFD = PhiON - T0 * VtgseffFD; - dPhiFD_dVg = dPhiON_dVg - T0 * dVtgseffFD_dVg; - dPhiFD_dVd = dPhiON_dVd - T0 * dVtgseffFD_dVd; - dPhiFD_dVe = dPhiON_dVe - T0 * dVtgseffFD_dVe; - if (selfheat) - dPhiFD_dT = dPhiON_dT - T0 * dVtgseffFD_dT; - else dPhiFD_dT = 0; - - - /* built-in potential lowering: Vbs0 */ - if (model->B4SOIfdMod == 0) /* v4.0 */ - { - T0 = -model->B4SOIdvbd1 * pParam->B4SOIleff / pParam->B4SOIlitl; - T1 = model->B4SOIdvbd0 * (exp(0.5*T0) + 2*exp(T0)); - T2 = T1 * (vbi - phi); - T3 = 0.5 * pParam->B4SOIqsi / model->B4SOIcsi; /* v3.2 */ - Vbs0t = PhiFD - T3 + model->B4SOIvbsa + T2; - dVbs0t_dVg = dPhiFD_dVg; - dVbs0t_dVd = dPhiFD_dVd; - dVbs0t_dVe = dPhiFD_dVe; - if (selfheat) - dVbs0t_dT = dPhiFD_dT + T1 * (dvbi_dT - dphi_dT); /* v4.1 */ - else dVbs0t_dT = 0; - - - T0 = 1 + model->B4SOIcsi / Cbox; - T3 = -model->B4SOIdk2b * pParam->B4SOIleff / pParam->B4SOIlitl; - T5 = model->B4SOIk2b * (exp(0.5*T3) + 2*exp(T3)); - T1 = (model->B4SOIk1b - T5) / T0; - T2 = T1 * Vesfb; - T0 = 1.0/(1 + Cbox / model->B4SOIcsi); - Vbs0 = T0 * Vbs0t + T2; - dVbs0_dVg = T0 * dVbs0t_dVg; - dVbs0_dVd = T0 * dVbs0t_dVd; - dVbs0_dVe = T0 * dVbs0t_dVe + T1; - if (selfheat) - dVbs0_dT = T0 * dVbs0t_dT - T1 * dvfbb_dT; - else - dVbs0_dT = 0.0; - } - else /* v4.1 */ - { - T0 = 1.0/(model->B4SOIcsi + Cbox + model->B4SOIcdsbs); - T1 = -model->B4SOIdvbd1 * pParam->B4SOIleff / pParam->B4SOIlitl; - T2 = model->B4SOIdvbd0 * (exp(0.5*T1) + 2*exp(T1)); - T3 = T2 * (Vds + model->B4SOIvsce); - T4 = 0.5 * pParam->B4SOIqsi / model->B4SOIcsi; - T5 = model->B4SOIcsi * T0 * (PhiFD - T4 + model->B4SOIvbsa); - T6 = model->B4SOIcdsbs * T0 * T3; - Vbs0t = T5 + T6; - T8 = model->B4SOIcsi * T0; - dVbs0t_dVg = T8 * dPhiFD_dVg; - dVbs0t_dVd = T8 * dPhiFD_dVd + model->B4SOIcdsbs * T0 * T2; - dVbs0t_dVe = T8 * dPhiFD_dVe; - if (selfheat) - dVbs0t_dT = T8 * dPhiFD_dT; - else - dVbs0t_dT = 0.0; - - T7 = Cbox * T0 * Vesfb; - Vbs0 = Vbs0t + T7; - dVbs0_dVg = dVbs0t_dVg; - dVbs0_dVe = dVbs0t_dVe + Cbox * T0; - dVbs0_dVd = dVbs0t_dVd; - if (selfheat) - dVbs0_dT = dVbs0t_dT - Cbox * T0 * dvfbb_dT; - else - dVbs0_dT = 0.0; - - } - - /* set lowerbound of Vbs (from SPICE) to Vbs0: Vbsitf (Vbs at back interface) */ - if (here->B4SOIsoiMod == 2) /* v3.2 */ /* v3.1 ideal FD: Vbsitf is pinned at Vbs0 */ - { - Vbs = Vbsitf = Vbs0 + OFF_Vbsitf; - dVbsitf_dVg = dVbs0_dVg; - dVbsitf_dVd = dVbs0_dVd; - dVbsitf_dVe = dVbs0_dVe; - /*dVbsitf_dVb = 0.0; */ - /*if (selfheat) dVbsitf_dT = dVbs0_dT; */ - /*else dVbsitf_dT = 0; */ - /* LFW_FD fix */ - dVbs_dVg = dVbsitf_dVg; - dVbs_dVd = dVbsitf_dVd; - dVbs_dVb = dVbsitf_dVb = 0.0; - dVbs_dVe = dVbsitf_dVe; - if (selfheat) {dVbsitf_dT = dVbs0_dT; dVbs_dT = dVbsitf_dT;} - else {dVbsitf_dT = 0; dVbs_dT = 0;} - } - else /* soiMod = 1 */ - { - T1 = Vbs - (Vbs0 + OFF_Vbsitf) - 0.01; - T2 = sqrt(T1*T1 + 0.0001); - T3 = 0.5 * (1 + T1/T2); - Vbsitf = (Vbs0 + OFF_Vbsitf) + 0.5 * (T1 + T2); - dVbsitf_dVg = (1 - T3) * dVbs0_dVg; - dVbsitf_dVd = (1 - T3) * dVbs0_dVd; - dVbsitf_dVe = (1 - T3) * dVbs0_dVe; - dVbsitf_dVb = T3 ; - /* LFW_FD 7 new lines */ - /* Note that Vbs has not been redefined */ - /* dVbs_dVb = dVbsitf_dVb; */ - dVbs_dVg = 0.0; - dVbs_dVd = 0.0; - dVbs_dVb = 1.0; - dVbs_dVe = 0.0; - dVbs_dT = 0.0; - if (selfheat) dVbsitf_dT = (1 - T3) * dVbs0_dT; - else dVbsitf_dT = 0.0; - } - - /* Based on Vbsitf, calculate zero-field body potential for MOS: Vbsmos */ - T1 = Vbs0t - Vbsitf - 0.005; - T2 = sqrt(T1 * T1 + (2.5e-5)); - T3 = 0.5 * (T1 + T2); - T4 = T3 * model->B4SOIcsi / pParam->B4SOIqsi; /* v3.2 */ - Vbsmos = Vbsitf - 0.5 * T3 * T4; - T5 = 0.5 * T4 * (1 + T1 / T2); - dVbsmos_dVg = dVbsitf_dVg * (1 + T5) - T5 * dVbs0t_dVg; - dVbsmos_dVd = dVbsitf_dVd * (1 + T5) - T5 * dVbs0t_dVd; - dVbsmos_dVb = dVbsitf_dVb * (1 + T5); - dVbsmos_dVe = dVbsitf_dVe * (1 + T5) - T5 * dVbs0t_dVe; - if (selfheat) - dVbsmos_dT = dVbsitf_dT * (1 + T5) - T5 * dVbs0t_dT; - else - dVbsmos_dT = 0.0; - /* Vbsmos should be used in MOS after some limiting (Vbseff) */ - - - Vbp = Vbs - Vps; - dVbp_dVb = 1; - } - /* end of v3.0 block edition */ - - - /* v3.0 modification */ - /* T2 is Vbsmos limited above Vbsc=-5 */ - T0 = Vbsmos + 5 - 0.001; - T1 = sqrt(T0 * T0 - 0.004 * (-5)); - T2 = (-5) + 0.5 * (T0 + T1); - dT2_dVb = (0.5 * (1.0 + T0 / T1)) * dVbsmos_dVb; - dT2_dVg = (0.5 * (1.0 + T0 / T1)) * dVbsmos_dVg; - dT2_dVd = (0.5 * (1.0 + T0 / T1)) * dVbsmos_dVd; - dT2_dVe = (0.5 * (1.0 + T0 / T1)) * dVbsmos_dVe; - if (selfheat) dT2_dT = (0.5 * (1.0 + T0 / T1)) * dVbsmos_dT; - else dT2_dT = 0.0; - - /* Vbsh is T2 limited below 1.5 */ - T0 = 1.5; - T1 = T0 - T2 - 0.002; - T3 = sqrt(T1 * T1 + 0.008 * T0); - Vbsh = T0 - 0.5 * (T1 + T3); - dVbsh_dVb = 0.5 * (1.0 + T1 / T3) * dT2_dVb; - dVbsh_dVg = 0.5 * (1.0 + T1 / T3) * dT2_dVg; - dVbsh_dVd = 0.5 * (1.0 + T1 / T3) * dT2_dVd; - dVbsh_dVe = 0.5 * (1.0 + T1 / T3) * dT2_dVe; - if (selfheat) dVbsh_dT = 0.5 * (1.0 + T1 / T3) * dT2_dT; - else dVbsh_dT = 0.0; - - - /* Vbseff is Vbsh limited to 0.95*phi */ - T0 = 0.95 * phi; - T1 = T0 - Vbsh - 0.002; - T2 = sqrt(T1 * T1 + 0.008 * T0); - Vbseff = T0 - 0.5 * (T1 + T2); - dVbseff_dVb = 0.5 * (1.0 + T1 / T2) * dVbsh_dVb; - dVbseff_dVg = 0.5 * (1.0 + T1 / T2) * dVbsh_dVg; - dVbseff_dVd = 0.5 * (1.0 + T1 / T2) * dVbsh_dVd; - dVbseff_dVe = 0.5 * (1.0 + T1 / T2) * dVbsh_dVe; - /* if (selfheat) dVbseff_dT = 0.5 * (1.0 + T1 / T2) * dVbsh_dT; */ - if (selfheat) { - dT0_dT = 0.95 * dphi_dT; - dT1_dT = dT0_dT - dVbsh_dT; - dVbseff_dT = dT0_dT - 0.5 * (1.0 + T1 / T2) * dT1_dT - - 0.002 * dT0_dT / T2; - } /* v4.1 */ - else dVbseff_dT = 0.0; - here->B4SOIvbseff = Vbseff; /* SPICE sol. */ - /* end of v3.0 modification */ - - - /* Below all the variables refer to Vbseff */ - /* LFW_FD comment out next 6 lines */ - /*if (dVbseff_dVb < 1e-20) { */ - /* dVbseff_dVb = 1e-20; */ - /* dVbsh_dVb *= 1e20; */ - /*} */ - /*else */ - /* dVbsh_dVb /= dVbseff_dVb; */ - /*=======================================================================*/ - /* Some derivatives were originally taken w.r.t. Vbseff, and named *_dVb */ - /* Later in the code, they were corrected by multiplying or dividing */ - /* by dVbseff_dVb. */ - /* Now, all derivatives labeled *_dVb are taken w.r.t. Vbs */ - /* The correction factor "dVbseff_dVb" has been removed where it is */ - /* no longer needed. */ - /*=======================================================================*/ - - Phis = phi - Vbseff; - /* dPhis_dVb = -1; LFW_FD not uesed */ - sqrtPhis = sqrt(Phis); - /*dsqrtPhis_dVb = -0.5 / sqrtPhis; */ - /* LFW_FD fix/add 4 lines */ - dsqrtPhis_dVg = -0.5 * dVbseff_dVg / sqrtPhis; - dsqrtPhis_dVd = -0.5 * dVbseff_dVd / sqrtPhis; - dsqrtPhis_dVb = -0.5 * dVbseff_dVb / sqrtPhis; - dsqrtPhis_dVe = -0.5 * dVbseff_dVe / sqrtPhis; - - Xdep = Xdep0 * sqrtPhis / sqrtPhi; - /*dXdep_dVb = (Xdep0 / sqrtPhi) * dsqrtPhis_dVb; */ - /* LFW_FD fix/add 4 lines */ - dXdep_dVg = Xdep0 * dsqrtPhis_dVg / sqrtPhi; - dXdep_dVd = Xdep0 * dsqrtPhis_dVd / sqrtPhi; - dXdep_dVb = Xdep0 * dsqrtPhis_dVb / sqrtPhi; - dXdep_dVe = Xdep0 * dsqrtPhis_dVe / sqrtPhi; - /* v4.1 */ - if (selfheat) { - dPhis_dT = dphi_dT - dVbseff_dT; - dsqrtPhis_dT = 0.5 / sqrtPhis * dPhis_dT; - /* dXdep_dT = dXdep0_dT * sqrtPhis / sqrtPhi - + (dsqrtPhis_dT * sqrtPhi - sqrtPhis * dsqrtPhi_dT) / phi; v4.2 Temp Deriv bugfix */ - dXdep_dT = dXdep0_dT * sqrtPhis / sqrtPhi - + Xdep0 * (dsqrtPhis_dT * sqrtPhi - sqrtPhis * dsqrtPhi_dT) / phi; - } - else { - dPhis_dT = 0.0; - dsqrtPhis_dT = 0.0; - dXdep_dT = 0.0; - } /* end v4.1 */ - - /* Calculate nstar v3.2 */ -/* here->B4SOInstar = model->B4SOIvtm / Charge_q * */ - here->B4SOInstar = Vtm / Charge_q * - (model->B4SOIcox + epssub / Xdep + pParam->B4SOIcit); - - /* Vth Calculation */ - T3 = sqrt(Xdep); - - T0 = pParam->B4SOIdvt2 * Vbseff; - if (T0 >= - 0.5) - { T1 = 1.0 + T0; - T2 = pParam->B4SOIdvt2 ; - } - else /* Added to avoid any discontinuity problems caused by dvt2 */ - { T4 = 1.0 / (3.0 + 8.0 * T0); - T1 = (1.0 + 3.0 * T0) * T4; - T2 = pParam->B4SOIdvt2 * T4 * T4 ; - } - lt1 = model->B4SOIfactor1 * T3 * T1; - /* dlt1_dVb =model->B4SOIfactor1 * (0.5 / T3 * T1 * dXdep_dVb + T3 * T2); */ - /* LFW_FD fix/add 4 lines */ - dlt1_dVg = model->B4SOIfactor1 * (T3 * T2 * dVbseff_dVg + 0.5 * T1 * dXdep_dVg / T3); - dlt1_dVd = model->B4SOIfactor1 * (T3 * T2 * dVbseff_dVd + 0.5 * T1 * dXdep_dVd / T3); - dlt1_dVb = model->B4SOIfactor1 * (T3 * T2 * dVbseff_dVb + 0.5 * T1 * dXdep_dVb / T3); - dlt1_dVe = model->B4SOIfactor1 * (T3 * T2 * dVbseff_dVe + 0.5 * T1 * dXdep_dVe / T3); - /* fix below expression Wagner */ - /*if (selfheat) dlt1_dT = model->B4SOIfactor1 * T1 * 0.5 / T3 * dXdep_dT;*/ - if (selfheat) dlt1_dT = model->B4SOIfactor1 * (T1 * 0.5 / T3 * dXdep_dT - + T3 * pParam->B4SOIdvt2 * dVbseff_dT); - else dlt1_dT = 0.0; /* v4.1 */ - - T0 = pParam->B4SOIdvt2w * Vbseff; - if (T0 >= - 0.5) - { T1 = 1.0 + T0; - T2 = pParam->B4SOIdvt2w ; - } - else /* Added to avoid any discontinuity problems caused by dvt2w */ - { T4 = 1.0 / (3.0 + 8.0 * T0); - T1 = (1.0 + 3.0 * T0) * T4; - T2 = pParam->B4SOIdvt2w * T4 * T4 ; - } - ltw= model->B4SOIfactor1 * T3 * T1; - /* dltw_dVb=model->B4SOIfactor1*(0.5 / T3 * T1 * dXdep_dVb + T3 * T2); */ - /* LFW_FD fix/add 4 lines */ - dltw_dVg = model->B4SOIfactor1 * (T3 * T2 * dVbseff_dVg + 0.5 * T1 * dXdep_dVg / T3); - dltw_dVd = model->B4SOIfactor1 * (T3 * T2 * dVbseff_dVd + 0.5 * T1 * dXdep_dVd / T3); - dltw_dVb = model->B4SOIfactor1 * (T3 * T2 * dVbseff_dVb + 0.5 * T1 * dXdep_dVb / T3); - dltw_dVe = model->B4SOIfactor1 * (T3 * T2 * dVbseff_dVe + 0.5 * T1 * dXdep_dVe / T3); - /* fix next expression Wagner */ - /*if (selfheat) dltw_dT = model->B4SOIfactor1 * T1 * 0.5 / T3 * dXdep_dT; */ - if (selfheat) dltw_dT = model->B4SOIfactor1 * (T1 * 0.5 / T3 * dXdep_dT - + T3 * pParam->B4SOIdvt2w * dVbseff_dT); - else dltw_dT = 0.0; /* v4.1 */ - T0 = -0.5 * pParam->B4SOIdvt1 * Leff / lt1; - if (T0 > -EXPL_THRESHOLD) - { T1 = exp(T0); - Theta0 = T1 * (1.0 + 2.0 * T1); - /*dT1_dVb = -T0 / lt1 * T1 * dlt1_dVb; */ - /*dTheta0_dVb = (1.0 + 4.0 * T1) * dT1_dVb; */ - /*dT1_dT = -T0 / lt1 * T1 * dlt1_dT; v4.2 bugfix temp deriv */ - /*dTheta0_dT = (1.0 + 4.0 * T1) * dT1_dT; v4.2 bugfix temp deriv */ - /* LFW_FD fix 5 derivatives */ - dTheta0_dVg = -(1.0 + 4.0 * T1) * T1 * T0 * dlt1_dVg / lt1; - dTheta0_dVd = -(1.0 + 4.0 * T1) * T1 * T0 * dlt1_dVd / lt1; - dTheta0_dVb = -(1.0 + 4.0 * T1) * T1 * T0 * dlt1_dVb / lt1; - dTheta0_dVe = -(1.0 + 4.0 * T1) * T1 * T0 * dlt1_dVe / lt1; - dTheta0_dT = -(1.0 + 4.0 * T1) * T1 * T0 * dlt1_dT / lt1; - } - else - { T1 = MIN_EXPL; - Theta0 = T1 * (1.0 + 2.0 * T1); - /* LFW_FD fix 5 derivatives */ - dTheta0_dVg = 0.0; - dTheta0_dVd = 0.0; - dTheta0_dVb = 0.0; - dTheta0_dVe = 0.0; - dTheta0_dT = 0; /* v4.2 bugfix temp deriv */ - } - - /* Calculate n */ - T2 = pParam->B4SOInfactor * epssub / Xdep; - /* LFW_FD add 3 derivatives */ - dT2_dVg = - T2 / Xdep * dXdep_dVg; - dT2_dVd = - T2 / Xdep * dXdep_dVd; - dT2_dVb = - T2 / Xdep * dXdep_dVb; - dT2_dVe = - T2 / Xdep * dXdep_dVe; - dT2_dT = - T2 / Xdep * dXdep_dT; /* v4.2 bugfix temp deriv */ - T3 = pParam->B4SOIcdsc + pParam->B4SOIcdscb * Vbseff - + pParam->B4SOIcdscd * Vds; - /* LFW_FD add/fix 5 derivatives */ - dT3_dVg = pParam->B4SOIcdscb * dVbseff_dVg; - dT3_dVd = pParam->B4SOIcdscb * dVbseff_dVd + pParam->B4SOIcdscd; - dT3_dVb = pParam->B4SOIcdscb * dVbseff_dVb; - dT3_dVe = pParam->B4SOIcdscb * dVbseff_dVe; - dT3_dT = pParam->B4SOIcdscb * dVbseff_dT; /* LFW */ - - T4 = (T2 + T3 * Theta0 + pParam->B4SOIcit) / model->B4SOIcox; - /* LFW_FD add/fix 5 derivatives */ - dT4_dVg = (dT2_dVg + T3 * dTheta0_dVg + Theta0 * dT3_dVg) / model->B4SOIcox; - dT4_dVd = (dT2_dVd + T3 * dTheta0_dVd + Theta0 * dT3_dVd) / model->B4SOIcox; - dT4_dVb = (dT2_dVb + T3 * dTheta0_dVb + Theta0 * dT3_dVb) / model->B4SOIcox; - dT4_dVe = (dT2_dVe + T3 * dTheta0_dVe + Theta0 * dT3_dVe) / model->B4SOIcox; - dT4_dT = (dT2_dT + dTheta0_dT* T3 + Theta0*dT3_dT)/ model->B4SOIcox; /* LFW */ - - if (T4 >= -0.5) - { n = 1.0 + T4; - dn_dVg = dT4_dVg; - dn_dVb = dT4_dVb; - dn_dVd = dT4_dVd; - dn_dVe = dT4_dVe; - dn_dT = dT4_dT; /* v4.2 bugfix temp deriv */ - } - else - /* avoid discontinuity problems caused by T4 */ - { T0 = 1.0 / (3.0 + 8.0 * T4); - /* n = (1.0 + 3.0 * T4) * T0; */ /* v4.2 bugfix temp deriv */ - T5 = 1.0 + 3.0 * T4; /* v4.2 bugfix temp deriv */ - n = T0 * T5; /* v4.2 bugfix temp deriv */ - dn_dT = T0 * (3.0 - 8.0 * T5 * T0) * dT4_dT; /* Wagner - moved line up from 3 lines below */ - T0 *= T0; - dn_dVg = T0 * dT4_dVg; - dn_dVb = T0 * dT4_dVb; - dn_dVd = T0 * dT4_dVd; - dn_dVe = T0 * dT4_dVe; - } - - /* v4.0 DITS */ - if (pParam->B4SOIdvtp0 > 0.0) { - T0 = -pParam->B4SOIdvtp1 * Vds; - if (T0 < -EXPL_THRESHOLD) { - T2 = MIN_EXPL; - dT2_dVd = 0.0; - } - else { - T2 = exp(T0); - dT2_dVd = -pParam->B4SOIdvtp1 * T2; - } - - T3 = Leff + pParam->B4SOIdvtp0 * (1.0 + T2); - dT3_dVd = pParam->B4SOIdvtp0 * dT2_dVd; - T4 = Vtm * log(Leff / T3); - dT4_dVd = -Vtm * dT3_dVd / T3; - DITS_Sft = n * T4; - dDITS_Sft_dVd = dn_dVd * T4 + n * dT4_dVd; - dDITS_Sft_dVb = T4 * dn_dVb; - if (selfheat) { - /* dDITS_Sft_dT = n * KboQ * log(Leff / T3); */ /* v4.2 bugfix temp deriv */ - dDITS_Sft_dT = n * KboQ * log(Leff / T3) + dn_dT * T4; /* v4.2 bugfix temp deriv */ - } - else - dDITS_Sft_dT = 0.0; - } - else { - DITS_Sft = dDITS_Sft_dVd = dDITS_Sft_dVb = 0.0; - dDITS_Sft_dT = 0.0; - } - - here->B4SOIthetavth = pParam->B4SOIdvt0 * Theta0; - Delt_vth = here->B4SOIthetavth * V0; - /* LFW_FD add/fix 4 derivatives */ - dDelt_vth_dVg = pParam->B4SOIdvt0 * dTheta0_dVg * V0; - dDelt_vth_dVd = pParam->B4SOIdvt0 * dTheta0_dVd * V0; - dDelt_vth_dVb = pParam->B4SOIdvt0 * dTheta0_dVb * V0; - dDelt_vth_dVe = pParam->B4SOIdvt0 * dTheta0_dVe * V0; - if (selfheat) /* dDelt_vth_dT = here->B4SOIthetavth * dvbi_dT; */ /* v4.2 bugfix temp deriv */ - dDelt_vth_dT = pParam->B4SOIdvt0 * (dTheta0_dT * V0 + Theta0 * (dvbi_dT - dphi_dT)); /* v4.2 bugfix temp deriv */ - else dDelt_vth_dT = 0.0; - - T0 = -0.5 * pParam->B4SOIdvt1w * pParam->B4SOIweff - * Leff / ltw; - if (T0 > -EXPL_THRESHOLD) - { T1 = exp(T0); - T2 = T1 * (1.0 + 2.0 * T1); - /*dT1_dVb = -T0 / ltw * T1 * dltw_dVb; */ - /*dT2_dVb = (1.0 + 4.0 * T1) * dT1_dVb; */ - /*dT1_dT = -T0 / ltw * T1 * dltw_dT; v4.2 bugfix temp deriv */ - /*dT2_dT = (1.0 + 4.0 * T1) * dT1_dT; v4.2 bugfix temp deriv */ - /* LFW_FD add/fix 5 derivatives */ - dT2_dVg = -(1.0 + 4.0 * T1) * T1 * T0 * dltw_dVg / ltw; - dT2_dVd = -(1.0 + 4.0 * T1) * T1 * T0 * dltw_dVd / ltw; - dT2_dVb = -(1.0 + 4.0 * T1) * T1 * T0 * dltw_dVb / ltw; - dT2_dVe = -(1.0 + 4.0 * T1) * T1 * T0 * dltw_dVe / ltw; - dT2_dT = -(1.0 + 4.0 * T1) * T1 * T0 * dltw_dT / ltw; - } - else - { T1 = MIN_EXPL; - T2 = T1 * (1.0 + 2.0 * T1); - /* LFW_FD add/fix 5 derivatives */ - dT2_dVg = 0.0; - dT2_dVd = 0.0; - dT2_dVb = 0.0; - dT2_dVe = 0.0; - dT2_dT = 0.0; - } - - T0 = pParam->B4SOIdvt0w * T2; - DeltVthw = T0 * V0; - /* LFW_FD add/fix 5 derivatives */ - dDeltVthw_dVg = pParam->B4SOIdvt0w * dT2_dVg * V0; - dDeltVthw_dVd = pParam->B4SOIdvt0w * dT2_dVd * V0; - dDeltVthw_dVb = pParam->B4SOIdvt0w * dT2_dVb * V0; - dDeltVthw_dVe = pParam->B4SOIdvt0w * dT2_dVe * V0; - if (selfheat) - dDeltVthw_dT = T0 * (dvbi_dT - dphi_dT) + pParam->B4SOIdvt0w * dT2_dT * V0; - else dDeltVthw_dT = 0.0; - - T0 = sqrt(1.0 + pParam->B4SOIlpe0 / Leff); - T1 = (pParam->B4SOIkt1 + pParam->B4SOIkt1l / Leff - + pParam->B4SOIkt2 * Vbseff); - DeltVthtemp = pParam->B4SOIk1ox * (T0 - 1.0) * sqrtPhi - + T1 * TempRatioMinus1; /* v4.0 */ - /* LFW_FD add/fix 5 derivatives */ - dDeltVthtemp_dVg = TempRatioMinus1 * pParam->B4SOIkt2 * dVbseff_dVg; - dDeltVthtemp_dVd = TempRatioMinus1 * pParam->B4SOIkt2 * dVbseff_dVd; - dDeltVthtemp_dVb = TempRatioMinus1 * pParam->B4SOIkt2 * dVbseff_dVb; - dDeltVthtemp_dVe = TempRatioMinus1 * pParam->B4SOIkt2 * dVbseff_dVe; - if (selfheat) - dDeltVthtemp_dT = pParam->B4SOIk1ox * (T0 - 1.0) * dsqrtPhi_dT + T1 / model-> B4SOItnom - + pParam->B4SOIkt2 * TempRatioMinus1 * dVbseff_dT; - else - dDeltVthtemp_dT = 0.0; - - tmp2 = toxe * phi / (pParam->B4SOIweff + pParam->B4SOIw0); - dtmp2_dT = toxe * dphi_dT / (pParam->B4SOIweff + pParam->B4SOIw0); /* v4.2 bugfix temp deriv */ - T3 = here->B4SOIeta0 + pParam->B4SOIetab * Vbseff; - if (T3 < 1.0e-4) /* avoid discontinuity problems caused by etab */ - { T9 = 1.0 / (3.0 - 2.0e4 * T3); - T3 = (2.0e-4 - T3) * T9; - T4 = T9 * T9 * pParam->B4SOIetab; - /* LFW_FD add/fix 4 derivatives */ - dT3_dVg = T4 * dVbseff_dVg; - dT3_dVd = T4 * dVbseff_dVd; - dT3_dVb = T4 * dVbseff_dVb; - dT3_dVe = T4 * dVbseff_dVe; - } - else - { - /* LFW_FD add/fix 4 derivatives */ - dT3_dVg = pParam->B4SOIetab * dVbseff_dVg; - dT3_dVd = pParam->B4SOIetab * dVbseff_dVd; - dT3_dVb = pParam->B4SOIetab * dVbseff_dVb; - dT3_dVe = pParam->B4SOIetab * dVbseff_dVe; - } - /* DIBL_Sft = T3 * pParam->B4SOItheta0vb0 * Vds; - dDIBL_Sft_dVd = pParam->B4SOItheta0vb0 * T3; - dDIBL_Sft_dVb = pParam->B4SOItheta0vb0 * Vds * dT3_dVb; v4.2 bugfix */ - DIBL_Sft = T3 * theta0vb0 * Vds; - /* LFW_FD add/fix 4 derivatives */ - dDIBL_Sft_dVg = theta0vb0 * Vds * dT3_dVg; - dDIBL_Sft_dVd = theta0vb0 * (Vds * dT3_dVd + T3) ; - dDIBL_Sft_dVb = theta0vb0 * Vds * dT3_dVb; - dDIBL_Sft_dVe = theta0vb0 * Vds * dT3_dVe; - dDIBL_Sft_dT = T3 * Vds * dtheta0vb0_dT + pParam->B4SOIetab * dVbseff_dT * theta0vb0 * Vds; - - Lpe_Vb = sqrt(1.0 + pParam->B4SOIlpeb / Leff); - - T9 = 2.2361 / sqrtPhi; - sqrtPhisExt = sqrtPhis - T9 * (Vbsh - Vbseff); - /* LFW_FD add/fix 4 derivatives */ - dsqrtPhisExt_dVg = dsqrtPhis_dVg - T9 * (dVbsh_dVg - dVbseff_dVg); - dsqrtPhisExt_dVd = dsqrtPhis_dVd - T9 * (dVbsh_dVd - dVbseff_dVd); - dsqrtPhisExt_dVb = dsqrtPhis_dVb - T9 * (dVbsh_dVb - dVbseff_dVb); - dsqrtPhisExt_dVe = dsqrtPhis_dVe - T9 * (dVbsh_dVe - dVbseff_dVe); - dsqrtPhisExt_dT = dsqrtPhis_dT - T9 * (dVbsh_dT - dVbseff_dT) - + 2.2361 * dsqrtPhi_dT * (Vbsh - Vbseff) / phi; /* v4.2 bugfix temp deriv */ - /* 4.1 */ - T0 = exp(2.0 * pParam->B4SOIdvtp4 * Vds); - DITS_Sft2 = pParam->B4SOIdvtp2factor * (T0-1) / (T0+1); - dDITS_Sft2_dVd = pParam->B4SOIdvtp2factor * pParam->B4SOIdvtp4 * 4.0 * T0 / ((T0+1) * (T0+1)); - - Vth = model->B4SOItype * here->B4SOIvth0 - + (pParam->B4SOIk1ox * sqrtPhisExt - - pParam->B4SOIk1eff * sqrtPhi) * Lpe_Vb - - here->B4SOIk2ox * Vbseff- Delt_vth - DeltVthw - +(pParam->B4SOIk3 + pParam->B4SOIk3b * Vbseff) * tmp2 - + DeltVthtemp - DIBL_Sft - DITS_Sft - DITS_Sft2; - - /* LFW_FD add/fix 2 derivatives */ - dVth_dVg = pParam->B4SOIk1ox * dsqrtPhisExt_dVg * Lpe_Vb - - here->B4SOIk2ox * dVbseff_dVg - dDelt_vth_dVg - dDeltVthw_dVg - + pParam->B4SOIk3b * dVbseff_dVg * tmp2 - + dDeltVthtemp_dVg - dDIBL_Sft_dVg; /* LFW_FD fix line */ - dvth0_dT=0; - - - - here->B4SOIvon = Vth; - - T6 = pParam->B4SOIk3b * tmp2 - here->B4SOIk2ox - + pParam->B4SOIkt2 * TempRatioMinus1; - - /* LFW_FD add/fix 4 derivatives */ - /* this is actually dVth_dVbseff */ - dVth_dVb = pParam->B4SOIk1ox * dsqrtPhisExt_dVb * Lpe_Vb - - here->B4SOIk2ox * dVbseff_dVb - dDelt_vth_dVb - dDeltVthw_dVb - + pParam->B4SOIk3b * dVbseff_dVb * tmp2 - + dDeltVthtemp_dVb - dDIBL_Sft_dVb - dDITS_Sft_dVb; - - dVth_dVd = pParam->B4SOIk1ox * dsqrtPhisExt_dVd * Lpe_Vb - - here->B4SOIk2ox * dVbseff_dVd - dDelt_vth_dVd - dDeltVthw_dVd - + pParam->B4SOIk3b * dVbseff_dVd * tmp2 - + dDeltVthtemp_dVd - dDIBL_Sft_dVd - dDITS_Sft_dVd - dDITS_Sft2_dVd; - - dVth_dVe = pParam->B4SOIk1ox * dsqrtPhisExt_dVe * Lpe_Vb - - here->B4SOIk2ox * dVbseff_dVe - dDelt_vth_dVe - dDeltVthw_dVe - + pParam->B4SOIk3b * dVbseff_dVe * tmp2 - + dDeltVthtemp_dVe - dDIBL_Sft_dVe; /* LFW_FD fix line */ - - if (selfheat) - /* dVth_dT = dDeltVthtemp_dT - dDelt_vth_dT - dDeltVthw_dT - - dDITS_Sft_dT; */ - dVth_dT = dDeltVthtemp_dT - dDelt_vth_dT - dDeltVthw_dT - +(pParam->B4SOIk1ox * dsqrtPhisExt_dT- pParam->B4SOIk1eff * dsqrtPhi_dT) * Lpe_Vb - - here->B4SOIk2ox*dVbseff_dT + pParam->B4SOIk3b*tmp2*dVbseff_dT - + (pParam->B4SOIk3 + pParam->B4SOIk3b * Vbseff)*dtmp2_dT - + model->B4SOItype * dvth0_dT - dDIBL_Sft_dT - dDITS_Sft_dT; /* v4.2 temp deriv */ - else dVth_dT = 0.0; - - - /* dVthzb_dT calculation */ - if ((model->B4SOIcapMod == 3) && (selfheat == 1)) { - T3zb = sqrt(Xdep0); - ltwzb = lt1zb = model->B4SOIfactor1 * T3zb; - dT3zb_dT = 1.0 / (2.0 * T3zb) * dXdep0_dT; /* v4.2 bugfix temp deriv */ - dltwzb_dT = dlt1zb_dT = model->B4SOIfactor1 * dT3zb_dT; /* v4.2 bugfix temp deriv */ - T0 = -0.5 * pParam->B4SOIdvt1 * Leff / lt1zb; - if (T0 > -EXPL_THRESHOLD) - { T1 = exp(T0); - - Theta0zb = T1 * (1.0 + 2.0 * T1); - dT0_dT = -(T0 / lt1zb) * dlt1zb_dT; /* v4.2 bugfix temp deriv */ - dT1_dT = T1 * dT0_dT; /* v4.2 bugfix temp deriv */ - dTheta0zb_dT = (1.0 + 4.0 * T1) * dT1_dT; /* v4.2 bugfix temp deriv */ - } - else - { T1 = MIN_EXPL; - Theta0zb = T1 * (1.0 + 2.0 * T1); - dTheta0zb_dT=0; /* v4.2 bugfix temp deriv */ - } - Delt_vthzb = pParam->B4SOIdvt0 * Theta0zb * V0; - /* dDelt_vthzb_dT = pParam->B4SOIdvt0 * Theta0zb * dvbi_dT; */ /* v4.2 bugfix temp deriv */ - dDelt_vthzb_dT = pParam->B4SOIdvt0 *( Theta0zb * (dvbi_dT - dphi_dT) - + dTheta0zb_dT *V0); /* v4.2 bugfix temp deriv */ - - T0 = -0.5 * pParam->B4SOIdvt1w * pParam->B4SOIweff * Leff / ltwzb; - if (T0 > -EXPL_THRESHOLD) - { T1 = exp(T0); - T2 = T1 * (1.0 + 2.0 * T1); - dT0_dT = -(T0 / ltwzb) * dltwzb_dT; /* v4.2 bugfix temp deriv */ - dT1_dT = T1 * dT0_dT; /* v4.2 bugfix temp deriv */ - dT2_dT = (1.0 + 4.0 * T1) * dT1_dT; /* v4.2 bugfix temp deriv */ - } - else - { T1 = MIN_EXPL; - T2 = T1 * (1.0 + 2.0 * T1); - dT2_dT=0; /* v4.2 bugfix temp deriv */ - } - T0 = pParam->B4SOIdvt0w * T2; - dT0_dT= pParam->B4SOIdvt0w * dT2_dT; /* v4.2 bugfix temp deriv */ - DeltVthwzb = T0 * V0; - /* dDeltVthwzb_dT = T0 * dvbi_dT; *//* v4.2 bugfix temp deriv */ - dDeltVthwzb_dT = ( T0 * (dvbi_dT - dphi_dT)+ dT0_dT *V0); /* v4.2 bugfix temp deriv */ - - T0 = sqrt(1.0 + pParam->B4SOIlpe0 / Leff); - T1 = (pParam->B4SOIkt1 + pParam->B4SOIkt1l / Leff); - DeltVthtempzb = pParam->B4SOIk1ox * (T0 - 1.0) * sqrtPhi - + T1 * TempRatioMinus1; - dDeltVthtempzb_dT = pParam->B4SOIk1ox * (T0 - 1.0) * dsqrtPhi_dT + T1 / model->B4SOItnom; /* v4.2 bugfix temp deriv */ - - Vthzb = model->B4SOItype * here->B4SOIvth0 - - Delt_vthzb - DeltVthwzb + pParam->B4SOIk3 * tmp2 - + DeltVthtempzb; - dVthzb_dT = model->B4SOItype * dvth0_dT - dDelt_vthzb_dT - dDeltVthwzb_dT + pParam->B4SOIk3 * dtmp2_dT + dDeltVthtempzb_dT; /* v4.2 bugfix temp deriv */ - /* Vthzb2 = Vthzb + 1.12; v4.1 */ /* v4.2 never used */ - } else /* LFW_FD */ - Vthzb = dVthzb_dT = 0.0; /* LFW_FD flexilint */ - - /* Effective Vgst (Vgsteff) Calculation */ - - Vgst = Vgs_eff - Vth; - dVgst_dVg = dVgs_eff_dVg - dVth_dVg; /* LFW_FD fix derivative */ - dVgst_dVd = -dVth_dVd; - dVgst_dVb = -dVth_dVb; - dVgst_dVe = -dVth_dVe; /* LFW_FD new line */ - if (selfheat) { - dVgst_dT = dVgs_eff_dT - dVth_dT; - } - else dVgst_dT = 0.0; - - T10 = n * Vtm; /* v4.0 */ - VgstNVt = pParam->B4SOImstar * Vgst / T10; /* v4.0 */ - /* LFW_FD add/fix 4 derivatives */ - dVgstNVt_dVg = (pParam->B4SOImstar * dVgst_dVg - VgstNVt * dn_dVg * Vtm) / T10; - dVgstNVt_dVd = (pParam->B4SOImstar * dVgst_dVd - VgstNVt * dn_dVd * Vtm) / T10; - dVgstNVt_dVb = (pParam->B4SOImstar * dVgst_dVb - VgstNVt * dn_dVb * Vtm) / T10; - dVgstNVt_dVe = (pParam->B4SOImstar * dVgst_dVe - VgstNVt * dn_dVe * Vtm) / T10; - ExpArg = (pParam->B4SOIvoff - (1- pParam->B4SOImstar) * Vgst)/T10; /* LFW_FD */ - /* LFW_FD add/fix 4 derivatives */ - dExpArg_dVg = (-(1- pParam->B4SOImstar) * dVgst_dVg - ExpArg * dn_dVg * Vtm) / T10; - dExpArg_dVd = (-(1- pParam->B4SOImstar) * dVgst_dVd - ExpArg * dn_dVd * Vtm) / T10; - dExpArg_dVb = (-(1- pParam->B4SOImstar) * dVgst_dVb - ExpArg * dn_dVb * Vtm) / T10; - dExpArg_dVe = (-(1- pParam->B4SOImstar) * dVgst_dVe - ExpArg * dn_dVe * Vtm) / T10; - if (selfheat) { - dT10_dT = n * dVtm_dT + dn_dT * Vtm; - dVgstNVt_dT = -(-pParam->B4SOImstar*dVgst_dT + VgstNVt*dT10_dT)/T10; - dExpArg_dT = -(1- pParam->B4SOImstar)*dVgst_dT/T10 - -ExpArg*dT10_dT/T10; - } - else { - dT10_dT = 0.0; - dVgstNVt_dT = 0.0; - dExpArg_dT = 0.0; - } - - /* LFW_FD new line */ - dExpVgst_dVg = dExpVgst_dVd = dExpVgst_dVb = dExpVgst_dVe = dExpVgst_dT = 0.0; - /* MCJ: Very small Vgst */ - if (VgstNVt > EXPL_THRESHOLD) - { ExpVgst = 1.0; /* LFW_FD flexilint */ - Vgsteff = Vgst; - /* T0 is dVgsteff_dVbseff */ - T0 = -dVth_dVb; - /* LFW_FD add/fix 5 derivatives */ - dVgsteff_dVg = dVgst_dVg; - dVgsteff_dVd = dVgst_dVd; - dVgsteff_dVb = dVgst_dVb; - dVgsteff_dVe = dVgst_dVe; - if (selfheat) - dVgsteff_dT = dVgst_dT ; /* LFW */ - else - dVgsteff_dT = 0.0; - } - else if (ExpArg > EXPL_THRESHOLD) - { T0 = (Vgst - pParam->B4SOIvoff) / (n * Vtm); - ExpVgst = exp(T0); - /* LFW_FD add/fix 4 derivatives */ - dExpVgst_dVg = (dVgst_dVg - T0 * dn_dVg * Vtm) /(n * Vtm); - dExpVgst_dVd = (dVgst_dVd - T0 * dn_dVd * Vtm) /(n * Vtm); - dExpVgst_dVb = (dVgst_dVb - T0 * dn_dVb * Vtm) /(n * Vtm); - dExpVgst_dVe = (dVgst_dVe - T0 * dn_dVe * Vtm) /(n * Vtm); - /*Vgsteff = Vtm * pParam->B4SOIcdep0 / model->B4SOIcox * ExpVgst; *//*v4.2 bug fix */ - Vgsteff = Vtm * cdep0 / model->B4SOIcox * ExpVgst; /* v4.2 bug fix */ - T3 = Vgsteff / (n * Vtm) ; - /* T1 is dVgsteff_dVbseff */ - /*T1 = -T3 * (dVth_dVb + T0 * Vtm * dn_dVb);*/ - /* LFW_FD fix T1 and 4 derivatives */ - T1 = -T3 * ( T0 * Vtm * dn_dVb); - dVgsteff_dVg = Vtm * cdep0 / model->B4SOIcox * dExpVgst_dVg; - dVgsteff_dVd = Vtm * cdep0 / model->B4SOIcox * dExpVgst_dVd; - dVgsteff_dVb = Vtm * cdep0 / model->B4SOIcox * dExpVgst_dVb; - dVgsteff_dVe = Vtm * cdep0 / model->B4SOIcox * dExpVgst_dVe; - /* enhance next if-then-else block - Wagner*/ - if (selfheat) { - /* dVgsteff_dT = -T3 * (dVth_dT + T0 * dVtm_dT * n) - + Vgsteff / Temp+ T1 * dVbseff_dT; v3.0 */ /* v4.2 temp deriv*/ - dVgsteff_dT = -T3 * (-dVgst_dT + T0 * dVtm_dT * n + Vtm * dn_dT) - + Vgsteff / Temp+ T1 * dVbseff_dT; /*v4.2 temp deriv*/ - dTL0_dT = (dVgst_dT - T0 * (dn_dT * Vtm + n * dVtm_dT)) / (n * Vtm); - dExpVgst_dT = ExpVgst * dTL0_dT; - dVgsteff_dT = Vgsteff * (dVtm_dT/Vtm + dcdep0_dT/cdep0 + dExpVgst_dT/ExpVgst); - } - else { - dExpVgst_dT = 0.0; - dVgsteff_dT = 0.0; - } - } - else - { ExpVgst = exp(VgstNVt); - /* LFW_FD add/fix 4 derivatives */ - dExpVgst_dVg = ExpVgst * dVgstNVt_dVg; - dExpVgst_dVd = ExpVgst * dVgstNVt_dVd; - dExpVgst_dVb = ExpVgst * dVgstNVt_dVb; - dExpVgst_dVe = ExpVgst * dVgstNVt_dVe; - /* 4 new lines Wagner */ - if (selfheat) - dExpVgst_dT = ExpVgst * dVgstNVt_dT; - else - dExpVgst_dT = 0.0; - T1 = T10 * log(1.0 + ExpVgst); - /* LFW_FD add/fix 4 derivatives */ - dT1_dVg = T10 * dExpVgst_dVg / (1.0 + ExpVgst) + T1 * dn_dVg / n; - dT1_dVd = T10 * dExpVgst_dVd / (1.0 + ExpVgst) + T1 * dn_dVd / n; - dT1_dVb = T10 * dExpVgst_dVb / (1.0 + ExpVgst) + T1 * dn_dVb / n; - dT1_dVe = T10 * dExpVgst_dVe / (1.0 + ExpVgst) + T1 * dn_dVe / n; - /*T3 = (1.0 / Temp); */ - T3 = (1.0 / Temp + dn_dT / n); /* v4.2 temp deriv */ - if (selfheat) - /* fix below expression Wagner */ - /*dT1_dT = -dT1_dVg * (dVth_dT + Vgst * T3) + T1 * T3;*/ - dT1_dT = dT10_dT*log(1.0 + ExpVgst) - + T10 * dExpVgst_dT / (1.0 + ExpVgst); - else - dT1_dT = 0.0; - - /*dT2_dVg = -model->B4SOIcox / (Vtm * pParam->B4SOIcdep0) - * exp(ExpArg) * (1 - pParam->B4SOImstar);*/ /*v4.2 bug fix*/ - dT2_dVg = -model->B4SOIcox / (Vtm * cdep0) - * exp(ExpArg) * (1 - pParam->B4SOImstar); /*v4.2 bug fix*/ - T2 = pParam->B4SOImstar - T10 * dT2_dVg - / (1.0 - pParam->B4SOImstar); - /* LFW_FD fix all 5 T2 derivatives */ - TL1 = dT2_dVg; - dTL1_dVg = TL1 * dExpArg_dVg; - dTL1_dVd = TL1 * dExpArg_dVd; - dTL1_dVb = TL1 * dExpArg_dVb; - dTL1_dVe = TL1 * dExpArg_dVe; - dT2_dVg = -(dn_dVg * Vtm * TL1 + T10 * dTL1_dVg) / (1.0 - pParam->B4SOImstar); - dT2_dVd = -(dn_dVd * Vtm * TL1 + T10 * dTL1_dVd) / (1.0 - pParam->B4SOImstar); - dT2_dVb = -(dn_dVb * Vtm * TL1 + T10 * dTL1_dVb) / (1.0 - pParam->B4SOImstar); - dT2_dVe = -(dn_dVe * Vtm * TL1 + T10 * dTL1_dVe) / (1.0 - pParam->B4SOImstar); - if (selfheat) - dT2_dT = -(dT10_dT * TL1 - +T10*TL1*(-dVtm_dT/Vtm-dcdep0_dT/cdep0+dExpArg_dT) - )/(1.0 - pParam->B4SOImstar); - else - dT2_dT = 0.0; - - Vgsteff = T1 / T2; - T3 = T2 * T2; - /* T4 is dVgsteff_dVbseff */ - T4 = (T2 * dT1_dVb - T1 * dT2_dVb) / T3; - /* LFW_FD fix 4 derivatives */ - dVgsteff_dVg = (T2 * dT1_dVg - T1 * dT2_dVg) / T3; - dVgsteff_dVd = (T2 * dT1_dVd - T1 * dT2_dVd) / T3; - dVgsteff_dVb = (T2 * dT1_dVb - T1 * dT2_dVb) / T3; - dVgsteff_dVe = (T2 * dT1_dVe - T1 * dT2_dVe) / T3; - if (selfheat) - dVgsteff_dT = (T2 * dT1_dT - T1 * dT2_dT) / T3; - else - dVgsteff_dT = 0.0; - } - Vgst2Vtm = Vgsteff + 2.0 * Vtm; - if (selfheat) dVgst2Vtm_dT = dVgsteff_dT + 2.0 * dVtm_dT; /* v3.1.1 bug fix */ - else dVgst2Vtm_dT = 0.0; - here->B4SOIVgsteff = Vgsteff; /* v2.2.3 bug fix */ - - /* v4.0 F-factor (degradation factor due to pocket implant) */ - if (pParam->B4SOIfprout <= 0.0) - { FP = 1.0; - /* LFW_FD enhance line */ - dFP_dVg = dFP_dVb = dFP_dVd = dFP_dVe = dFP_dT = 0.0; - } - else - { T9 = pParam->B4SOIfprout * sqrt(Leff) / Vgst2Vtm; - FP = 1.0 / (1.0 + T9); - /* LFW_FD fix/add 5 derivatives */ - dFP_dVg = FP * FP * T9 / Vgst2Vtm * dVgsteff_dVg; - dFP_dVb = FP * FP * T9 / Vgst2Vtm * dVgsteff_dVb; - dFP_dVd = FP * FP * T9 / Vgst2Vtm * dVgsteff_dVd; - dFP_dVe = FP * FP * T9 / Vgst2Vtm * dVgsteff_dVe; - if (selfheat) - dFP_dT = FP * T9 * dVgst2Vtm_dT / (1.0 + T9) / Vgst2Vtm; - else dFP_dT = 0.0; - } - - /* Calculate Effective Channel Geometry */ - T9 = sqrtPhis - sqrtPhi; - Weff = pParam->B4SOIweff - (2.0 - here->B4SOInbc) - * (pParam->B4SOIdwg * Vgsteff + pParam->B4SOIdwb * T9); - /* LFW_FD fix/add 4 derivatives */ - dWeff_dVg = -(2.0 - here->B4SOInbc) * - (pParam->B4SOIdwg * dVgsteff_dVg + pParam->B4SOIdwb * dsqrtPhis_dVg); - dWeff_dVb = -(2.0 - here->B4SOInbc) * - (pParam->B4SOIdwg * dVgsteff_dVb + pParam->B4SOIdwb * dsqrtPhis_dVb); - dWeff_dVd = -(2.0 - here->B4SOInbc) * - (pParam->B4SOIdwg * dVgsteff_dVd + pParam->B4SOIdwb * dsqrtPhis_dVd); - dWeff_dVe = -(2.0 - here->B4SOInbc) * - (pParam->B4SOIdwg * dVgsteff_dVe + pParam->B4SOIdwb * dsqrtPhis_dVe); - /* New - next 5 lines - Wagner */ - if (selfheat) - dWeff_dT = -(2.0 - here->B4SOInbc) * - (pParam->B4SOIdwg * dVgsteff_dT - + pParam->B4SOIdwb*(dsqrtPhis_dT - dsqrtPhi_dT)); - else dWeff_dT = 0.0; - - if (Weff < 2.0e-8) /* to avoid the discontinuity problem due to Weff*/ - { T0 = 1.0 / (6.0e-8 - 2.0 * Weff); - Weff = 2.0e-8 * (4.0e-8 - Weff) * T0; - T0 *= T0 * 4.0e-16; - dWeff_dVg *= T0; - dWeff_dVb *= T0; - /* LFW_FD add 2 derivatives */ - dWeff_dVd *= T0; - dWeff_dVe *= T0; - dWeff_dT *= T0; /* new line - Wagner */ - } - - if (model->B4SOIrdsMod == 1) /* v4.0 */ - /* LFW_FD enhance line */ - Rds = dRds_dVg = dRds_dVb = dRds_dVd = dRds_dVe = dRds_dT = 0.0; - else { - T0 = pParam->B4SOIprwg * Vgsteff - + pParam->B4SOIprwb * T9; - /* LFW_FD add 4 derivatives */ - dT0_dVg = pParam->B4SOIprwg * dVgsteff_dVg + pParam->B4SOIprwb * dsqrtPhis_dVg; - dT0_dVb = pParam->B4SOIprwg * dVgsteff_dVb + pParam->B4SOIprwb * dsqrtPhis_dVb; - dT0_dVd = pParam->B4SOIprwg * dVgsteff_dVd + pParam->B4SOIprwb * dsqrtPhis_dVd; - dT0_dVe = pParam->B4SOIprwg * dVgsteff_dVe + pParam->B4SOIprwb * dsqrtPhis_dVe; - dT0_dT = pParam->B4SOIprwg*dVgsteff_dT - + pParam->B4SOIprwb*(dsqrtPhis_dT - dsqrtPhi_dT); /* new expression Wagner */ - if (T0 >= -0.9) - { Rds = rds0 * (1.0 + T0); - /* LFW_FD add/fix 4 derivatives */ - dRds_dVg = rds0 * dT0_dVg; - dRds_dVb = rds0 * dT0_dVb; - dRds_dVd = rds0 * dT0_dVd; - dRds_dVe = rds0 * dT0_dVe; - - if (selfheat && (Rds!=0.0)) - /*fix below expression Wagner */ - /*dRds_dT = (1.0 + T0) * drds0_dT;*/ - dRds_dT = (1.0 + T0) * drds0_dT + rds0 * dT0_dT; - else dRds_dT = 0.0; - - } - else - /* to avoid the discontinuity problem due to prwg and prwb*/ - { T1 = 1.0 / (17.0 + 20.0 * T0); - Rds = rds0 * (0.8 + T0) * T1; - /* LFW_FD add/fix 4 derivatives */ - dRds_dVg = (rds0*T1- 20*Rds*T1) * dT0_dVg; - dRds_dVb = (rds0*T1- 20*Rds*T1) * dT0_dVb; - dRds_dVd = (rds0*T1- 20*Rds*T1) * dT0_dVd; - dRds_dVe = (rds0*T1- 20*Rds*T1) * dT0_dVe; - - if (selfheat && (Rds!=0.0)) - /*fix below expression Wagner */ - /*dRds_dT = (0.8 + T0) * T1 * drds0_dT;*/ - dRds_dT = (0.8 + T0) * T1 * drds0_dT - + (rds0*T1- 20*Rds*T1) * dT0_dT; - else dRds_dT = 0.0; - - } - /* here->B4SOIrds = Rds; v2.2.3 bug fix */ /* v4.2 bugfix # 39 */ - } - here->B4SOIrds = Rds / here->B4SOInf; /* LFW_FD fix */ - /* Calculate Abulk */ - if (pParam->B4SOIa0 == 0.0) { - - Abulk0 = Abulk = 1.0; - - /* LFW_FD expand next 3 lines */ - dAbulk_dVg = dAbulk_dVb = dAbulk_dVd = dAbulk_dVe = 0.0; - dAbulk0_dVg = dAbulk0_dVb = dAbulk0_dVd = dAbulk0_dVe = 0.0; - dAbulk0_dT = dAbulk_dT = 0.0; - } - else { - T10 = pParam->B4SOIketa * Vbsh; - if (T10 >= -0.9) { - T11 = 1.0 / (1.0 + T10); - /* LFW_FD add/fix 5 derivatives */ - dT11_dVg = -pParam->B4SOIketa * T11 * T11 * dVbsh_dVg; - dT11_dVb = -pParam->B4SOIketa * T11 * T11 * dVbsh_dVb; - dT11_dVd = -pParam->B4SOIketa * T11 * T11 * dVbsh_dVd; - dT11_dVe = -pParam->B4SOIketa * T11 * T11 * dVbsh_dVe; - dT11_dT = -pParam->B4SOIketa * T11 * T11 * dVbsh_dT; - } - else { /* added to avoid the problems caused by Keta */ - T12 = 1.0 / (0.8 + T10); - T11 = (17.0 + 20.0 * T10) * T12; - /* LFW_FD add/fix 5 derivatives */ - dT11_dVg = (20.0-T11) * T12 * pParam->B4SOIketa * dVbsh_dVg; - dT11_dVb = (20.0-T11) * T12 * pParam->B4SOIketa * dVbsh_dVb; - dT11_dVd = (20.0-T11) * T12 * pParam->B4SOIketa * dVbsh_dVd; - dT11_dVe = (20.0-T11) * T12 * pParam->B4SOIketa * dVbsh_dVe; - dT11_dT = (20.0-T11) * T12 * pParam->B4SOIketa * dVbsh_dT; - } - - /* v3.0 bug fix */ - T10 = phi + pParam->B4SOIketas; - - T13 = (Vbsh * T11) / T10; - /* LFW_FD add/fix 5 derivatives */ - dT13_dVg = (Vbsh * dT11_dVg + T11 * dVbsh_dVg) / T10; - dT13_dVb = (Vbsh * dT11_dVb + T11 * dVbsh_dVb) / T10; - dT13_dVd = (Vbsh * dT11_dVd + T11 * dVbsh_dVd) / T10; - dT13_dVe = (Vbsh * dT11_dVe + T11 * dVbsh_dVe) / T10; - dT13_dT = (dVbsh_dT * T11 + Vbsh * dT11_dT - T13 * dphi_dT) / T10; - - /* limit 1/sqrt(1-T13) to 6, starting at T13=0.96 */ - if (T13 < 0.96) { - T14 = 1 / sqrt(1-T13); - T10 = 0.5 * T14 / (1-T13); - /* LFW_FD add/fix 5 derivatives */ - dT14_dVg = T10 * dT13_dVg; - dT14_dVb = T10 * dT13_dVb; - dT14_dVd = T10 * dT13_dVd; - dT14_dVe = T10 * dT13_dVe; - dT14_dT = T10 * dT13_dT; - } - else { - /* IBM tweak */ - T11 = 1.0 / (1.0 - 1.0593220339*T13); - T14 = (6.0169491525 - 6.3559322034 * T13) * T11; - /* T10 = 0.0179546 * T11 * T11; never used - Wagner */ - /* LFW_FD add/fix 5 derivatives */ - dT14_dVg = (T14 * 1.0593220339 - 6.3559322034) * T11 * dT13_dVg; - dT14_dVb = (T14 * 1.0593220339 - 6.3559322034) * T11 * dT13_dVb; - dT14_dVd = (T14 * 1.0593220339 - 6.3559322034) * T11 * dT13_dVd; - dT14_dVe = (T14 * 1.0593220339 - 6.3559322034) * T11 * dT13_dVe; - dT14_dT = (T14 * 1.0593220339 - 6.3559322034) * T11 * dT13_dT; - } - - /* v3.0 bug fix */ - /* T10 = 0.5 * pParam->B4SOIk1eff - / sqrt(phi + pParam->B4SOIketas); */ - T10 = 0.5 * pParam->B4SOIk1ox * Lpe_Vb - / sqrt(phi + pParam->B4SOIketas); /* v4.0 */ - - T1 = T10 * T14; - /* LFW_FD add/fix 4 derivatives */ - dT1_dVg = T10 * dT14_dVg; - dT1_dVb = T10 * dT14_dVb; - dT1_dVd = T10 * dT14_dVd; - dT1_dVe = T10 * dT14_dVe; - - T9 = sqrt(pParam->B4SOIxj * Xdep); - tmp1 = Leff + 2.0 * T9; - T5 = Leff / tmp1; - tmp2 = pParam->B4SOIa0 * T5; - tmp3 = pParam->B4SOIweff + pParam->B4SOIb1; - tmp4 = pParam->B4SOIb0 / tmp3; - T2 = tmp2 + tmp4; - /* LFW_FD add/fix 4 derivatives */ - dT2_dVg = -tmp2 / tmp1 * pParam->B4SOIxj * dXdep_dVg / T9; - dT2_dVb = -tmp2 / tmp1 * pParam->B4SOIxj * dXdep_dVb / T9; - dT2_dVd = -tmp2 / tmp1 * pParam->B4SOIxj * dXdep_dVd / T9; - dT2_dVe = -tmp2 / tmp1 * pParam->B4SOIxj * dXdep_dVe / T9; - T6 = T5 * T5; - T7 = T5 * T6; - /* LFW_FD add 4 derivatives */ - dT7_dVg = -3.0 * T7 / tmp1 * pParam->B4SOIxj * dXdep_dVg / T9; - dT7_dVb = -3.0 * T7 / tmp1 * pParam->B4SOIxj * dXdep_dVb / T9; - dT7_dVd = -3.0 * T7 / tmp1 * pParam->B4SOIxj * dXdep_dVd / T9; - dT7_dVe = -3.0 * T7 / tmp1 * pParam->B4SOIxj * dXdep_dVe / T9; - - Abulk0 = 1 + T1 * T2; - /* LFW_FD add/fix 4 derivatives */ - dAbulk0_dVg = T1 * dT2_dVg + T2 * dT1_dVg; - dAbulk0_dVb = T1 * dT2_dVb + T2 * dT1_dVb; - dAbulk0_dVd = T1 * dT2_dVd + T2 * dT1_dVd; - dAbulk0_dVe = T1 * dT2_dVe + T2 * dT1_dVe; - - T8 = pParam->B4SOIags * pParam->B4SOIa0 * T7; - dAbulk_dVg = -T1 * T8; - Abulk = Abulk0 + dAbulk_dVg * Vgsteff; - - /* LFW_FD add/fix 4 derivatives */ - dAbulk_dVg = dAbulk0_dVg + dAbulk_dVg * dVgsteff_dVg - - (T1 * pParam->B4SOIags * pParam->B4SOIa0 * dT7_dVg + T8 * dT1_dVg) * Vgsteff; - dAbulk_dVb = dAbulk0_dVb - T1 * T8 * dVgsteff_dVb - - (T1 * pParam->B4SOIags * pParam->B4SOIa0 * dT7_dVb + T8 * dT1_dVb) * Vgsteff; - dAbulk_dVd = dAbulk0_dVd - T1 * T8 * dVgsteff_dVd - - (T1 * pParam->B4SOIags * pParam->B4SOIa0 * dT7_dVd + T8 * dT1_dVd) * Vgsteff; - dAbulk_dVe = dAbulk0_dVe - T1 * T8 * dVgsteff_dVe - - (T1 * pParam->B4SOIags * pParam->B4SOIa0 * dT7_dVe + T8 * dT1_dVe) * Vgsteff; - /* 21 new lines Wagner */ - /* need temperature derivs of Abulk & Abulk0 */ - TL2 = phi + pParam->B4SOIketas; - dTL1_dT = -0.5*T10/TL2*dphi_dT; - /* TL2 = T14; not used - Wagner */ - dTL3_dT = (0.5*pParam->B4SOIxj/T9)*dXdep_dT; - dTL4_dT = -2*tmp2*dTL3_dT/tmp1; - /* dTL5_dT = -T13*dphi_dT/(phi + pParam->B4SOIketas); not used - Wagner */ - /* dTL6_dT = 0.5*T14*dTL5_dT/(1-T13); not used - Wagner */ - /* fix line below - Wagner */ - /* dTL7_dT = T10*dTL6_dT + T14*dTL1_dT; */ - dTL7_dT = T10*dT14_dT + T14*dTL1_dT; - dTL8_dT = -pParam->B4SOIags*pParam->B4SOIa0*6*T7*dTL3_dT/tmp1; - dTL9_dT = -dTL7_dT*T8 - T1*dTL8_dT; - - if (selfheat) { - dAbulk0_dT = T1*dTL4_dT + T2*dTL7_dT; - dAbulk_dT = dAbulk0_dT + dTL9_dT*Vgsteff + dAbulk_dVg*dVgsteff_dT; - } - else { - dAbulk0_dT = 0.0; - dAbulk_dT = 0.0; - } - } - - if (Abulk0 < 0.01) - { - T9 = 1.0 / (3.0 - 200.0 * Abulk0); - Abulk0 = (0.02 - Abulk0) * T9; - /* fix line below - Wagner */ - /* dAbulk0_dVb *= T9 * T9; */ - T10 = (200.0 * Abulk0 - 1.0) * T9; - /* LFW_FD add/fix 5 derivatives */ - dAbulk0_dVg *= T10; - dAbulk0_dVb *= T10; - dAbulk0_dVd *= T10; - dAbulk0_dVe *= T10; - dAbulk0_dT *= T10; - } - - if (Abulk < 0.01) - { - T9 = 1.0 / (3.0 - 200.0 * Abulk); - Abulk = (0.02 - Abulk) * T9; - /* fix line below - Wagner */ - /* dAbulk_dVb *= T9 * T9; */ - /* T10 = T9 * T9; 3.2 bug fix */ - T10 = (200.0 * Abulk - 1.0) * T9; - /* LFW_FD add/fix 5 derivatives */ - dAbulk_dVg *= T10; /* 3.2 bug fix */ - dAbulk_dVb *= T10; /* 3.2 bug fix */ - dAbulk_dVd *= T10; /* 3.2 bug fix */ - dAbulk_dVe *= T10; - dAbulk_dT *= T10; - } - - here->B4SOIAbulk = Abulk; /*v3.2 for noise */ - - /* Mobility calculation */ - if (model->B4SOImtrlMod) { - /* extend "then" block Wagner */ - /*T14 = 2.0 * model->B4SOItype *(model->B4SOIphig - model->B4SOIeasub - 0.5 * Eg + 0.45); - toxe_mob = model->B4SOIeot * model->B4SOIepsrsub / 3.9;} Bug fix #4 Jun 09 implementing Eeff correctly*/ - T14 = 2.0 * model->B4SOItype *(model->B4SOIphig - model->B4SOIeasub - 0.5 * Eg + 0.45); - toxe_mob = model->B4SOIeot * model->B4SOIepsrsub / 3.9; /* Bug fix #4 Jun 09 implementing Eeff correctly*/ - /* 3 new lines Wagner */ - if (selfheat) - dT14_dT = - model->B4SOItype * dEg_dT; - else dT14_dT = 0.0;} - else { - T14 = 0.0; - /* extend "else" block Wagner */ - /*toxe_mob = model->B4SOItox;}*/ - toxe_mob = model->B4SOItox; - dT14_dT = 0.0;} /* new line Wagner */ - if (model->B4SOImobMod == 1) - { T0 = Vgsteff + Vth + Vth - T14; - T2 = ua + uc * Vbseff; - T3 = T0 / toxe_mob; /* Bug fix #4 Jun 09 implementing Eeff correctly*/ - T5 = T3 * (T2 + ub * T3); - /* LFW_FD fix 5 derivatives */ - dDenomi_dVg = (T2 + 2.0 * ub * T3) / toxe_mob * (dVgsteff_dVg + 2 * dVth_dVg) - + T3 * uc * dVbseff_dVg; - dDenomi_dVb = (T2 + 2.0 * ub * T3) / toxe_mob * (dVgsteff_dVb + 2 * dVth_dVb) - + T3 * uc * dVbseff_dVb; - dDenomi_dVd = (T2 + 2.0 * ub * T3) / toxe_mob * (dVgsteff_dVd + 2 * dVth_dVd) - + T3 * uc * dVbseff_dVd; - dDenomi_dVe = (T2 + 2.0 * ub * T3) / toxe_mob * (dVgsteff_dVe + 2 * dVth_dVe) - + T3 * uc * dVbseff_dVe; - - if (selfheat) - dDenomi_dT = (T2 + 2.0 * ub * T3) / toxe_mob * (2 * dVth_dT + dVgsteff_dT - dT14_dT) - + (dua_dT + Vbseff * duc_dT + uc * dVbseff_dT - + dub_dT * T3 ) * T3; - else - dDenomi_dT = 0.0; - } - else if (model->B4SOImobMod == 2) /* Bug fix #5 Jun 09 implementing Eeff correctly*/ - { T5 = (Vgsteff -T14)/ toxe * (ua /* MobMod=2 does not use Eeff */ - + uc * Vbseff + ub * (Vgsteff -T14) /* 'toxe' keeps code consistent with BSIMSOI4.1 Manual*/ - / toxe); - /* LFW_FD fix 5 derivatives */ - dDenomi_dVg = (ua + uc * Vbseff + 2.0 * ub * (Vgsteff -T14) / toxe) / toxe * dVgsteff_dVg - + (Vgsteff -T14) /toxe * uc * dVbseff_dVg; - dDenomi_dVb = (ua + uc * Vbseff + 2.0 * ub * (Vgsteff -T14) / toxe) / toxe * dVgsteff_dVb - + (Vgsteff -T14) /toxe * uc * dVbseff_dVb; - dDenomi_dVd = (ua + uc * Vbseff + 2.0 * ub * (Vgsteff -T14) / toxe) / toxe * dVgsteff_dVd - + (Vgsteff -T14) /toxe * uc * dVbseff_dVd; - dDenomi_dVe = (ua + uc * Vbseff + 2.0 * ub * (Vgsteff -T14) / toxe) / toxe * dVgsteff_dVe - + (Vgsteff -T14) / toxe * uc * dVbseff_dVe; - if (selfheat) - dDenomi_dT = (ua + uc * Vbseff + 2.0 * ub * (Vgsteff -T14) / toxe) / toxe * (dVgsteff_dT-dT14_dT) - + (Vgsteff -T14)/ toxe - * (dua_dT + Vbseff * duc_dT + uc * dVbseff_dT + dub_dT - * (Vgsteff -T14)/ toxe); - else - dDenomi_dT = 0.0; - } - else if (model->B4SOImobMod == 3) /* mobMod == 3 */ - { T0 = Vgsteff + Vth + Vth - T14; - T2 = 1.0 + uc * Vbseff; - T3 = T0 / toxe_mob; /* Bug fix #4 Jun 09 implementing Eeff correctly*/ - T4 = T3 * (ua + ub * T3); - T5 = T4 * T2; - /* LFW_FD fix 5 derivatives */ - dDenomi_dVg = (ua + 2.0 * ub * T3) * T2 * (dVgsteff_dVg + 2 * dVth_dVg) / toxe_mob - + T4 * uc * dVbseff_dVg; - dDenomi_dVb = (ua + 2.0 * ub * T3) * T2 * (dVgsteff_dVb + 2 * dVth_dVb) / toxe_mob - + T4 * uc * dVbseff_dVb; - dDenomi_dVd = (ua + 2.0 * ub * T3) * T2 * (dVgsteff_dVd + 2 * dVth_dVd) / toxe_mob - + T4 * uc * dVbseff_dVd; - dDenomi_dVe = (ua + 2.0 * ub * T3) * T2 * (dVgsteff_dVe + 2 * dVth_dVe) / toxe_mob - + T4 * uc * dVbseff_dVe; - if (selfheat) - dDenomi_dT = (ua + 2.0 * ub * T3) * T2 * (dVgsteff_dT + 2 * dVth_dT) / toxe_mob - + (dua_dT + dub_dT * T3) * T3 * T2 - + T4 * (Vbseff * duc_dT + uc * dVbseff_dT); - else - dDenomi_dT = 0.0; - } - else /* mobMod == 4 */ - { - /*universal mobility*/ - T0 = (Vgsteff + here->B4SOIvtfbphi1)* 1.0e-8 / toxe/6.0; - T1 = exp(pParam->B4SOIeu * log(T0)); /* MobMod=4 does not use Eeff */ - /* using 'toxe' keeps code consistent with BSIM4 formulation */ - /* LFW_FD add/fix 5 derivatives */ - dT1_dVg = T1 * pParam->B4SOIeu * 1.0e-8/ T0 / toxe/6.0 * dVgsteff_dVg; - dT1_dVb = T1 * pParam->B4SOIeu * 1.0e-8/ T0 / toxe/6.0 * dVgsteff_dVb; - dT1_dVd = T1 * pParam->B4SOIeu * 1.0e-8/ T0 / toxe/6.0 * dVgsteff_dVd; - dT1_dVe = T1 * pParam->B4SOIeu * 1.0e-8/ T0 / toxe/6.0 * dVgsteff_dVe; - dT1_dT = T1 * pParam->B4SOIeu * 1.0e-8/ T0 / toxe/6.0 * dVgsteff_dT; - - /*T2 = pParam->B4SOIua + pParam->B4SOIuc * Vbseff; */ /* v4.2 bugfix # 35 */ - T2 = ua + uc * Vbseff; - /*Coulombic*/ - /* pParam->B4SOIucs = pParam->B4SOIucs * pow(TempRatio, pParam->B4SOIucste); Bug# 21 Jul09*/ - /* pParam->B4SOIud = pParam->B4SOIud * pow(TempRatio, pParam->B4SOIud1) ; Bug# 21 Jul09 */ - ucs = pParam->B4SOIucs * pow(TempRatio, pParam->B4SOIucste); - ud = pParam->B4SOIud * pow(TempRatio, pParam->B4SOIud1) ; - VgsteffVth = here->B4SOIvgsteffvth; - - /*T10 = exp(pParam->B4SOIucs * log(0.5 + 0.5 * Vgsteff/VgsteffVth));*/ - /* T10 = exp(pParam->B4SOIucs * log(1.0 + Vgsteff/VgsteffVth)); Bug# 21 Jul09 */ - /* T11 = pParam->B4SOIud/T10; Bug# 21 Jul09 */ - T10 = exp(ucs * log(1.0 + Vgsteff/VgsteffVth)); /* Bug Fix # 21 Jul09*/ - T11 = ud/T10; /* Bug Fix # 21 Jul09*/ - /*dT11_dVg = - 0.5 * pParam->B4SOIucs * T11 /(0.5 + 0.5*Vgsteff/VgsteffVth)/VgsteffVth;*/ - /* dT11_dVg = (pParam->B4SOIucs - 1.0)*pParam->B4SOIud/(VgsteffVth* exp((pParam->B4SOIucs-1.0) * log(1.0 + Vgsteff/VgsteffVth))); Bug# 21 Jul09*/ - - /* LFW_FD add/fix 5 derivatives */ - dT11_dVg = - ud * ucs * exp(-(ucs+1.0) * log(1.0 + Vgsteff/VgsteffVth)) * dVgsteff_dVg / VgsteffVth; - dT11_dVb = - ud * ucs * exp(-(ucs+1.0) * log(1.0 + Vgsteff/VgsteffVth)) * dVgsteff_dVb / VgsteffVth; - dT11_dVd = - ud * ucs * exp(-(ucs+1.0) * log(1.0 + Vgsteff/VgsteffVth)) * dVgsteff_dVd / VgsteffVth; - dT11_dVe = - ud * ucs * exp(-(ucs+1.0) * log(1.0 + Vgsteff/VgsteffVth)) * dVgsteff_dVe / VgsteffVth; - dT11_dT = - ud * ucs * exp(-(ucs+1.0) * log(1.0 + Vgsteff/VgsteffVth)) * dVgsteff_dT / VgsteffVth; - - T5 = T1 * T2 + T11; - /* LFW_FD add/fix 5 derivatives */ - dDenomi_dVg = T2 * dT1_dVg + T1 * uc * dVbseff_dVg + dT11_dVg; - dDenomi_dVb = T2 * dT1_dVb + T1 * uc * dVbseff_dVb + dT11_dVb; - dDenomi_dVd = T2 * dT1_dVd + T1 * uc * dVbseff_dVd + dT11_dVd; - dDenomi_dVe = T2 * dT1_dVe + T1 * uc * dVbseff_dVe + dT11_dVe; - - if (selfheat) - dDenomi_dT = T2 * dT1_dT + T1 * (dua_dT + Vbseff * duc_dT + uc * dVbseff_dT) + dT11_dT; - - else - dDenomi_dT = 0.0; - - - } - if (T5 >= -0.8) - { Denomi = 1.0 + T5; - } - else /* Added to avoid the discontinuity problem caused by ua and ub*/ - { T9 = 1.0 / (7.0 + 10.0 * T5); - Denomi = (0.6 + T5) * T9; - T9 *= T9; - dDenomi_dVg *= T9; - dDenomi_dVd *= T9; - dDenomi_dVb *= T9; - dDenomi_dVe *= T9; /* LFW_FD new line */ - if (selfheat) dDenomi_dT *= T9; - else dDenomi_dT = 0.0; - } - - here->B4SOIueff = ueff = u0temp / Denomi; - T9 = -ueff / Denomi; - dueff_dVg = T9 * dDenomi_dVg; - dueff_dVd = T9 * dDenomi_dVd; - dueff_dVb = T9 * dDenomi_dVb; - dueff_dVe = T9 * dDenomi_dVe; /* LFW_FD new line */ - if (selfheat) dueff_dT = T9 * dDenomi_dT + du0temp_dT / Denomi; - else dueff_dT = 0.0; - - /* Saturation Drain Voltage Vdsat */ - WVCox = Weff * vsattemp * model->B4SOIcox; - WVCoxRds = WVCox * Rds; - /* LFW_FD add 4 derivatives */ - dWVCoxRds_dVg = WVCox * dRds_dVg + Rds * vsattemp * model->B4SOIcox * dWeff_dVg; - dWVCoxRds_dVb = WVCox * dRds_dVb + Rds * vsattemp * model->B4SOIcox * dWeff_dVb; - dWVCoxRds_dVd = WVCox * dRds_dVd + Rds * vsattemp * model->B4SOIcox * dWeff_dVd; - dWVCoxRds_dVe = WVCox * dRds_dVe + Rds * vsattemp * model->B4SOIcox * dWeff_dVe; - /* 5 lines new - Wagner */ - if (selfheat) - dWVCoxRds_dT = model->B4SOIcox * Rds * - (vsattemp * dWeff_dT + Weff * dvsattemp_dT) - + WVCox * dRds_dT; - else dWVCoxRds_dT = 0; - - /* dWVCoxRds_dT = WVCox * dRds_dT - + Weff * model->B4SOIcox * Rds * dvsattemp_dT; */ - - Esat = 2.0 * vsattemp / ueff; - EsatL = Esat * Leff; - T0 = -EsatL /ueff; - dEsatL_dVg = T0 * dueff_dVg; - dEsatL_dVd = T0 * dueff_dVd; - dEsatL_dVb = T0 * dueff_dVb; - dEsatL_dVe = T0 * dueff_dVe; /* LFW_FD new line */ - if (selfheat) - dEsatL_dT = T0 * dueff_dT + EsatL / vsattemp * dvsattemp_dT; - else - dEsatL_dT = 0.0; - - /* Sqrt() */ - a1 = pParam->B4SOIa1; - if (a1 == 0.0) - { Lambda = pParam->B4SOIa2; - /* LFW_FD add/fix 5 derivatives */ - dLambda_dVg = 0.0; - dLambda_dVb = 0.0; - dLambda_dVd = 0.0; - dLambda_dVe = 0.0; - dLambda_dT = 0.0; - } - else if (a1 > 0.0) - /* Added to avoid the discontinuity problem caused by a1 and a2 (Lambda) */ - { T0 = 1.0 - pParam->B4SOIa2; - T1 = T0 - pParam->B4SOIa1 * Vgsteff - 0.0001; - T2 = sqrt(T1 * T1 + 0.0004 * T0); - Lambda = pParam->B4SOIa2 + T0 - 0.5 * (T1 + T2); - /* LFW_FD add/fix 5 derivatives */ - dLambda_dVg = 0.5 * pParam->B4SOIa1 * (1.0 + T1 / T2) * dVgsteff_dVg; - dLambda_dVb = 0.5 * pParam->B4SOIa1 * (1.0 + T1 / T2) * dVgsteff_dVb; - dLambda_dVd = 0.5 * pParam->B4SOIa1 * (1.0 + T1 / T2) * dVgsteff_dVd; - dLambda_dVe = 0.5 * pParam->B4SOIa1 * (1.0 + T1 / T2) * dVgsteff_dVe; - if (selfheat) { - dT1_dT = - pParam->B4SOIa1 * dVgsteff_dT; - dT2_dT = T1 * dT1_dT / T2; - dLambda_dT = -0.5 * (dT1_dT + dT2_dT); } - else dLambda_dT = 0.0; - } - else - { T1 = pParam->B4SOIa2 + pParam->B4SOIa1 * Vgsteff - 0.0001; - T2 = sqrt(T1 * T1 + 0.0004 * pParam->B4SOIa2); - Lambda = 0.5 * (T1 + T2); - /* LFW_FD add/fix 5 derivatives */ - dLambda_dVg = 0.5 * pParam->B4SOIa1 * (1.0 + T1 / T2) * dVgsteff_dVg; - dLambda_dVb = 0.5 * pParam->B4SOIa1 * (1.0 + T1 / T2) * dVgsteff_dVb; - dLambda_dVd = 0.5 * pParam->B4SOIa1 * (1.0 + T1 / T2) * dVgsteff_dVd; - dLambda_dVe = 0.5 * pParam->B4SOIa1 * (1.0 + T1 / T2) * dVgsteff_dVe; - if (selfheat) { - dT1_dT = pParam->B4SOIa1 * dVgsteff_dT; - dT2_dT = T1 * dT1_dT / T2; - dLambda_dT = 0.5 * (dT1_dT + dT2_dT); } - else dLambda_dT = 0.0; - } - - here->B4SOIAbovVgst2Vtm = Abulk /Vgst2Vtm; /* v2.2.3 bug fix */ - - if (Rds > 0) - { tmp2 = dRds_dVg / Rds + dWeff_dVg / Weff; - tmp3 = dRds_dVb / Rds + dWeff_dVb / Weff; - } - else - { tmp2 = dWeff_dVg / Weff; - tmp3 = dWeff_dVb / Weff; - } - if ((Rds == 0.0) && (Lambda == 1.0)) - { T0 = 1.0 / (Abulk * EsatL + Vgst2Vtm); - tmp1 = 0.0; - T1 = T0 * T0; - T2 = Vgst2Vtm * T0; - T3 = EsatL * Vgst2Vtm; - Vdsat = T3 * T0; - - /* LFW_FD add/fix 5 derivatives */ - dT0_dVg = -(Abulk * dEsatL_dVg + EsatL * dAbulk_dVg + dVgsteff_dVg) * T1; - dT0_dVd = -(Abulk * dEsatL_dVd + EsatL * dAbulk_dVd + dVgsteff_dVd) * T1; - dT0_dVb = -(Abulk * dEsatL_dVb + EsatL * dAbulk_dVb + dVgsteff_dVb) * T1; - dT0_dVe = -(Abulk * dEsatL_dVe + EsatL * dAbulk_dVe + dVgsteff_dVe) * T1; - if (selfheat) - dT0_dT = -(Abulk * dEsatL_dT + dVgst2Vtm_dT) * T1; - else dT0_dT = 0.0; - - /* LFW_FD add/fix 5 derivatives */ - dVdsat_dVg = T3 * dT0_dVg + T2 * dEsatL_dVg + EsatL * T0 *dVgsteff_dVg; - dVdsat_dVb = T3 * dT0_dVb + T2 * dEsatL_dVb + EsatL * T0 *dVgsteff_dVb; - dVdsat_dVd = T3 * dT0_dVd + T2 * dEsatL_dVd + EsatL * T0 *dVgsteff_dVd; - dVdsat_dVe = T3 * dT0_dVe + T2 * dEsatL_dVe + EsatL * T0 *dVgsteff_dVe; - if (selfheat) - dVdsat_dT = T3 * dT0_dT + T2 * dEsatL_dT - + EsatL * T0 * dVgst2Vtm_dT; - else dVdsat_dT = 0.0; - } - else - { tmp1 = dLambda_dVg / (Lambda * Lambda); - T9 = Abulk * WVCoxRds; - T8 = Abulk * T9; - T7 = Vgst2Vtm * T9; - T6 = Vgst2Vtm * WVCoxRds; - T0 = 2.0 * Abulk * (T9 - 1.0 + 1.0 / Lambda); - /* LFW_FD add/fix 4 derivatives */ - dT0_dVg = 2.0 * ((2.0 * Abulk * WVCoxRds - 1.0 + 1.0 / Lambda) * dAbulk_dVg - + Abulk * Abulk * dWVCoxRds_dVg - Abulk * dLambda_dVg / (Lambda * Lambda)); - dT0_dVb = 2.0 * ((2.0 * Abulk * WVCoxRds - 1.0 + 1.0 / Lambda) * dAbulk_dVb - + Abulk * Abulk * dWVCoxRds_dVb - Abulk * dLambda_dVb / (Lambda * Lambda)); - dT0_dVd = 2.0 * ((2.0 * Abulk * WVCoxRds - 1.0 + 1.0 / Lambda) * dAbulk_dVd - + Abulk * Abulk * dWVCoxRds_dVd - Abulk * dLambda_dVd / (Lambda * Lambda)); - dT0_dVe = 2.0 * ((2.0 * Abulk * WVCoxRds - 1.0 + 1.0 / Lambda) * dAbulk_dVe - + Abulk * Abulk * dWVCoxRds_dVe - Abulk * dLambda_dVe / (Lambda * Lambda)); - - if (selfheat) - { - - if (Rds!=0.0) - tmp4 = dRds_dT / Rds + dvsattemp_dT / vsattemp; - else - tmp4 = dvsattemp_dT / vsattemp; - - /*fix below expression Wagner */ - /*dT0_dT = 2.0 * T8 * tmp4; */ - /*dT0_dT = 2.0 * T8 * tmp4 */ - /* + 2.0 * dAbulk_dT * (T9-1.0+1.0/Lambda) */ - /* + 2.0 * Abulk * (WVCoxRds*dAbulk_dT-dLambda_dT/(Lambda*Lambda)); */ - /*fix again below expression Wagner */ - dT0_dT = 2.0 * dAbulk_dT * (T9-1.0+1.0/Lambda) - + 2.0 * Abulk - * (WVCoxRds*dAbulk_dT+Abulk*dWVCoxRds_dT-dLambda_dT/(Lambda*Lambda)); - } else tmp4 = dT0_dT = 0.0; - - T1 = Vgst2Vtm * (2.0 / Lambda - 1.0) + Abulk * EsatL - + 3.0 * T7; - - /* LFW_FD add/fix 4 derivatives */ - dT1_dVg = (2.0 / Lambda - 1.0) * dVgsteff_dVg - 2.0 * Vgst2Vtm * dLambda_dVg / (Lambda * Lambda) - + EsatL * dAbulk_dVg + Abulk * dEsatL_dVg - + 3.0 * (dVgsteff_dVg * Abulk * WVCoxRds + Vgst2Vtm * dAbulk_dVg * WVCoxRds + Vgst2Vtm * Abulk * dWVCoxRds_dVg); - dT1_dVb = (2.0 / Lambda - 1.0) * dVgsteff_dVb - 2.0 * Vgst2Vtm * dLambda_dVb / (Lambda * Lambda) - + EsatL * dAbulk_dVb + Abulk * dEsatL_dVb - + 3.0 * (dVgsteff_dVb * Abulk * WVCoxRds + Vgst2Vtm * dAbulk_dVb * WVCoxRds + Vgst2Vtm * Abulk * dWVCoxRds_dVb); - dT1_dVd = (2.0 / Lambda - 1.0) * dVgsteff_dVd - 2.0 * Vgst2Vtm * dLambda_dVd / (Lambda * Lambda) - + EsatL * dAbulk_dVd + Abulk * dEsatL_dVd - + 3.0 * (dVgsteff_dVd * Abulk * WVCoxRds + Vgst2Vtm * dAbulk_dVd * WVCoxRds + Vgst2Vtm * Abulk * dWVCoxRds_dVd); - dT1_dVe = (2.0 / Lambda - 1.0) * dVgsteff_dVe - 2.0 * Vgst2Vtm * dLambda_dVe / (Lambda * Lambda) - + EsatL * dAbulk_dVe + Abulk * dEsatL_dVe - + 3.0 * (dVgsteff_dVe * Abulk * WVCoxRds + Vgst2Vtm * dAbulk_dVe * WVCoxRds + Vgst2Vtm * Abulk * dWVCoxRds_dVe); - - /* fix below "if" expresssion - Wagner */ - /*if (selfheat) - { - tmp4 += dVgst2Vtm_dT / Vgst2Vtm; - dT1_dT = (2.0 / Lambda - 1.0) * dVgst2Vtm_dT - + Abulk * dEsatL_dT + 3.0 * T7 * tmp4; - } else dT1_dT = 0.0; */ - if (selfheat) - dT1_dT = (2.0 / Lambda - 1.0) * dVgst2Vtm_dT - - Vgst2Vtm * 2 * dLambda_dT / (Lambda*Lambda) - + dAbulk_dT * EsatL - + Abulk * dEsatL_dT - + 3.0 * Vgst2Vtm * dAbulk_dT * WVCoxRds - + 3.0 * dVgst2Vtm_dT * Abulk * WVCoxRds - + 3.0 * T7 * tmp4; - else dT1_dT = 0.0; - - T2 = Vgst2Vtm * (EsatL + 2.0 * T6); - /* LFW_FD add/fix 4 derivatives */ - dT2_dVg = dVgsteff_dVg * (EsatL + 4.0 * T6) - + Vgst2Vtm * (dEsatL_dVg + 2 * Vgst2Vtm * dWVCoxRds_dVg); - dT2_dVb = dVgsteff_dVb * (EsatL + 4.0 * T6) - + Vgst2Vtm * (dEsatL_dVb + 2 * Vgst2Vtm * dWVCoxRds_dVb); - dT2_dVd = dVgsteff_dVd * (EsatL + 4.0 * T6) - + Vgst2Vtm * (dEsatL_dVd + 2 * Vgst2Vtm * dWVCoxRds_dVd); - dT2_dVe = dVgsteff_dVe * (EsatL + 4.0 * T6) - + Vgst2Vtm * (dEsatL_dVe + 2 * Vgst2Vtm * dWVCoxRds_dVe); - if (selfheat) - /* fix below expression - Wagner */ - /*dT2_dT = Vgst2Vtm * dEsatL_dT + EsatL * dVgst2Vtm_dT - + 2.0 * T6 * (dVgst2Vtm_dT + Vgst2Vtm * tmp4); */ - dT2_dT = dVgst2Vtm_dT * (EsatL + 2.0 * T6) - + Vgst2Vtm * (dEsatL_dT + 2.0 * T6 * tmp4 + 2.0 * dVgst2Vtm_dT * WVCoxRds); - else - dT2_dT = 0.0; - - T3 = sqrt(T1 * T1 - 2.0 * T0 * T2); - Vdsat = (T1 - T3) / T0; - - dVdsat_dVg = (dT1_dVg - (T1 * dT1_dVg - dT0_dVg * T2 - - T0 * dT2_dVg) / T3 - Vdsat * dT0_dVg) / T0; - dVdsat_dVb = (dT1_dVb - (T1 * dT1_dVb - dT0_dVb * T2 - - T0 * dT2_dVb) / T3 - Vdsat * dT0_dVb) / T0; - /* LFW_FD add/fix 2 derivatives */ - dVdsat_dVd = (dT1_dVd - (T1 * dT1_dVd - dT0_dVd * T2 - - T0 * dT2_dVd) / T3 - Vdsat * dT0_dVd) / T0; - dVdsat_dVe = (dT1_dVe - (T1 * dT1_dVe - dT0_dVe * T2 - - T0 * dT2_dVe) / T3 - Vdsat * dT0_dVe) / T0; - if (selfheat) - dVdsat_dT = (dT1_dT - (T1 * dT1_dT - dT0_dT * T2 - - T0 * dT2_dT) / T3 - Vdsat * dT0_dT) / T0; - else dVdsat_dT = 0.0; - } - here->B4SOIvdsat = Vdsat; - - - /* Effective Vds (Vdseff) Calculation */ - T1 = Vdsat - Vds - pParam->B4SOIdelta; - dT1_dVg = dVdsat_dVg; - dT1_dVd = dVdsat_dVd - 1.0; - dT1_dVb = dVdsat_dVb; - dT1_dVe = dVdsat_dVe; /* LFW_FD new line */ - dT1_dT = dVdsat_dT; - - T2 = sqrt(T1 * T1 + 4.0 * pParam->B4SOIdelta * Vdsat); - T0 = T1 / T2; - T3 = 2.0 * pParam->B4SOIdelta / T2; - dT2_dVg = T0 * dT1_dVg + T3 * dVdsat_dVg; - dT2_dVd = T0 * dT1_dVd + T3 * dVdsat_dVd; - dT2_dVb = T0 * dT1_dVb + T3 * dVdsat_dVb; - dT2_dVe = T0 * dT1_dVe + T3 * dVdsat_dVe; /* LFW_FD new line */ - if (selfheat) - dT2_dT = T0 * dT1_dT + T3 * dVdsat_dT; - else dT2_dT = 0.0; - - Vdseff = Vdsat - 0.5 * (T1 + T2); - dVdseff_dVg = dVdsat_dVg - 0.5 * (dT1_dVg + dT2_dVg); - dVdseff_dVd = dVdsat_dVd - 0.5 * (dT1_dVd + dT2_dVd); - dVdseff_dVb = dVdsat_dVb - 0.5 * (dT1_dVb + dT2_dVb); - dVdseff_dVe = dVdsat_dVe - 0.5 * (dT1_dVe + dT2_dVe); /* LFW_FD new line */ - if (selfheat) - dVdseff_dT = dVdsat_dT - 0.5 * (dT1_dT + dT2_dT); - else dVdseff_dT = 0.0; - - if (Vdseff > Vds) - Vdseff = Vds; /* This code is added to fixed the problem - caused by computer precision when - Vds is very close to Vdseff. */ - diffVds = Vds - Vdseff; - here->B4SOIVdseff = Vdseff; /* v2.2.3 bug fix */ - - /* Calculate VAsat */ - tmp4 = 1.0 - 0.5 * Abulk * Vdsat / Vgst2Vtm; - T9 = WVCoxRds * Vgsteff; - T8 = T9 / Vgst2Vtm; - T0 = EsatL + Vdsat + 2.0 * T9 * tmp4; - - T7 = 2.0 * WVCoxRds * tmp4; - /* LFW_FD fix/add 4 derivatives */ - dT0_dVg = dEsatL_dVg + dVdsat_dVg - + 2.0 * (tmp4 * (WVCoxRds * dVgsteff_dVg + dWVCoxRds_dVg * Vgsteff) - - T9 * (0.5 * (Abulk * dVdsat_dVg + dAbulk_dVg * Vdsat - - Abulk * Vdsat * dVgsteff_dVg / Vgst2Vtm) / Vgst2Vtm)); - dT0_dVb = dEsatL_dVb + dVdsat_dVb - + 2.0 * (tmp4 * (WVCoxRds * dVgsteff_dVb + dWVCoxRds_dVb * Vgsteff) - - T9 * (0.5 * (Abulk * dVdsat_dVb + dAbulk_dVb * Vdsat - - Abulk * Vdsat * dVgsteff_dVb / Vgst2Vtm) / Vgst2Vtm)); - dT0_dVd = dEsatL_dVd + dVdsat_dVd - + 2.0 * (tmp4 * (WVCoxRds * dVgsteff_dVd + dWVCoxRds_dVd * Vgsteff) - - T9 * (0.5 * (Abulk * dVdsat_dVd + dAbulk_dVd * Vdsat - - Abulk * Vdsat * dVgsteff_dVd / Vgst2Vtm) / Vgst2Vtm)); - dT0_dVe = dEsatL_dVe + dVdsat_dVe - + 2.0 * (tmp4 * (WVCoxRds * dVgsteff_dVe + dWVCoxRds_dVe * Vgsteff) - - T9 * (0.5 * (Abulk * dVdsat_dVe + dAbulk_dVe * Vdsat - - Abulk * Vdsat * dVgsteff_dVe / Vgst2Vtm) / Vgst2Vtm)); - - if (selfheat) - { - - if (Rds!=0.0) - tmp4 = dRds_dT / Rds + dvsattemp_dT / vsattemp; - else tmp4 = dvsattemp_dT / vsattemp; - - /* fix below expression - Wagner */ - /*dT0_dT = dEsatL_dT + dVdsat_dT + T7 * tmp4 * Vgsteff - - T8 * (Abulk * dVdsat_dT - Abulk * Vdsat * dVgst2Vtm_dT - / Vgst2Vtm); */ - dT0_dT = dEsatL_dT + dVdsat_dT - + T7 * (dVgsteff_dT + Vgsteff * tmp4) - - T9 * (dAbulk_dT * Vdsat + Abulk * dVdsat_dT - - Abulk * Vdsat * dVgst2Vtm_dT / Vgst2Vtm) / Vgst2Vtm; - } else - dT0_dT = 0.0; - - T9 = WVCoxRds * Abulk; - T1 = 2.0 / Lambda - 1.0 + T9; - /* LFW_FD fix/add 4 derivatives */ - dT1_dVg = -2.0 * dLambda_dVg / (Lambda * Lambda) + WVCoxRds * dAbulk_dVg + dWVCoxRds_dVg * Abulk; - dT1_dVb = -2.0 * dLambda_dVb / (Lambda * Lambda) + WVCoxRds * dAbulk_dVb + dWVCoxRds_dVb * Abulk; - dT1_dVd = -2.0 * dLambda_dVd / (Lambda * Lambda) + WVCoxRds * dAbulk_dVd + dWVCoxRds_dVd * Abulk; - dT1_dVe = -2.0 * dLambda_dVe / (Lambda * Lambda) + WVCoxRds * dAbulk_dVe + dWVCoxRds_dVe * Abulk; - if (selfheat) - /* fix below expression - Wagner */ - /*dT1_dT = T9 * tmp4;*/ - dT1_dT = - 2.0 * dLambda_dT / (Lambda*Lambda) - /* + T9 * tmp4 + WVCoxRds * dAbulk_dT; fix again */ - + WVCoxRds * dAbulk_dT + dWVCoxRds_dT * Abulk; - else - dT1_dT = 0.0; - - Vasat = T0 / T1; - dVasat_dVg = (dT0_dVg - Vasat * dT1_dVg) / T1; - dVasat_dVb = (dT0_dVb - Vasat * dT1_dVb) / T1; - /* LFW_FD fix/add 2 derivatives */ - dVasat_dVd = (dT0_dVd - Vasat * dT1_dVd) / T1; - dVasat_dVe = (dT0_dVe - Vasat * dT1_dVe) / T1; - if (selfheat) dVasat_dT = (dT0_dT - Vasat * dT1_dT) / T1; - else dVasat_dT = 0.0; - - /* Calculate VACLM */ - if ((pParam->B4SOIpclm > 0.0) && (diffVds > 1.0e-10)) - { T0 = 1.0 / (pParam->B4SOIpclm * Abulk * pParam->B4SOIlitl); - dT0_dVb = -T0 / Abulk * dAbulk_dVb; - dT0_dVg = -T0 / Abulk * dAbulk_dVg; - /* LFW_FD add 2 derivatives */ - dT0_dVd = -T0 / Abulk * dAbulk_dVd; - dT0_dVe = -T0 / Abulk * dAbulk_dVe; - - T2 = Vgsteff / EsatL; - T1 = Leff * (Abulk + T2); - /* LFW_FD add/fix 4 derivatives */ - dT1_dVg = Leff * (dAbulk_dVg + (dVgsteff_dVg - T2 * dEsatL_dVg) / EsatL); - dT1_dVb = Leff * (dAbulk_dVb + (dVgsteff_dVb - T2 * dEsatL_dVb) / EsatL); - dT1_dVd = Leff * (dAbulk_dVd + (dVgsteff_dVd - T2 * dEsatL_dVd) / EsatL); - dT1_dVe = Leff * (dAbulk_dVe + (dVgsteff_dVe - T2 * dEsatL_dVe) / EsatL); - /* fix below expression - Wagner */ - /*if (selfheat) dT1_dT = -T2 * dEsatL_dT / Esat; */ - if (selfheat) dT1_dT = Leff * (dAbulk_dT - + (dVgsteff_dT - T2 * dEsatL_dT) / EsatL); - else dT1_dT = 0.0; - - T9 = T0 * T1; - VACLM = T9 * diffVds; - dVACLM_dVg = T0 * dT1_dVg * diffVds - T9 * dVdseff_dVg - + T1 * diffVds * dT0_dVg; - dVACLM_dVb = (dT0_dVb * T1 + T0 * dT1_dVb) * diffVds - - T9 * dVdseff_dVb; - /* LFW_FD add/fix 2 derivatives */ - dVACLM_dVd = (dT0_dVd * T1 + T0 * dT1_dVd) * diffVds + T9 * (1.0 - dVdseff_dVd); - dVACLM_dVe = (dT0_dVe * T1 + T0 * dT1_dVe) * diffVds - T9 * dVdseff_dVe; - if (selfheat) - /* fix below expression - Wagner */ - /*dVACLM_dT = T0 * dT1_dT * diffVds - T9 * dVdseff_dT;*/ - dVACLM_dT = - T9 * dVdseff_dT - + diffVds * (T0 * dT1_dT - T1 * T0 * dAbulk_dT / Abulk); - else dVACLM_dT = 0.0; - - } - else - { VACLM = MAX_EXPL; - dVACLM_dVd = dVACLM_dVg = dVACLM_dVb = dVACLM_dVe = dVACLM_dT = 0.0; /* LFW_FD expand line */ - } - - - /* Calculate VADIBL */ - /* if (pParam->B4SOIthetaRout > 0.0) */ /* v4.2 bugfix # 36 */ - if (thetaRout > 0.0) - { T8 = Abulk * Vdsat; - T0 = Vgst2Vtm * T8; - T1 = Vgst2Vtm + T8; - /* LFW_FD fix/add 4 derivatives */ - dT0_dVg = T8 * dVgsteff_dVg + Vgst2Vtm * (Abulk * dVdsat_dVg + dAbulk_dVg * Vdsat); - dT0_dVb = T8 * dVgsteff_dVb + Vgst2Vtm * (Abulk * dVdsat_dVb + dAbulk_dVb * Vdsat); - dT0_dVd = T8 * dVgsteff_dVd + Vgst2Vtm * (Abulk * dVdsat_dVd + dAbulk_dVd * Vdsat); - dT0_dVe = T8 * dVgsteff_dVe + Vgst2Vtm * (Abulk * dVdsat_dVe + dAbulk_dVe * Vdsat); - - /* LFW_FD fix/add 4 derivatives */ - dT1_dVg = dVgsteff_dVg + Abulk * dVdsat_dVg + dAbulk_dVg * Vdsat; - dT1_dVb = dVgsteff_dVb + Abulk * dVdsat_dVb + dAbulk_dVb * Vdsat; - dT1_dVd = dVgsteff_dVd + Abulk * dVdsat_dVd + dAbulk_dVd * Vdsat; - dT1_dVe = dVgsteff_dVe + Abulk * dVdsat_dVe + dAbulk_dVe * Vdsat; - if (selfheat) - { - /* fix below expression - Wagner */ - /*dT0_dT = dVgst2Vtm_dT * T8 + Abulk * Vgst2Vtm * dVdsat_dT;*/ - dT0_dT = dVgst2Vtm_dT * T8 - + Vgst2Vtm * dAbulk_dT * Vdsat - + Vgst2Vtm * Abulk * dVdsat_dT; - /* fix below expression - Wagner */ - /*dT1_dT = dVgst2Vtm_dT + Abulk * dVdsat_dT;*/ - dT1_dT = dVgst2Vtm_dT + dAbulk_dT * Vdsat + Abulk * dVdsat_dT; - } else - dT0_dT = dT1_dT = 0.0; - - T9 = T1 * T1; - /*T2 = pParam->B4SOIthetaRout; */ /* v4.2 bugfix # 36 */ - T2 = thetaRout; - VADIBL = (Vgst2Vtm - T0 / T1) / T2; - /* LFW_FD fix/add 4 derivatives */ - dVADIBL_dVg = (dVgsteff_dVg - (dT0_dVg - T0 * dT1_dVg /T1 )/T1) / T2; - dVADIBL_dVb = (dVgsteff_dVb - (dT0_dVb - T0 * dT1_dVb /T1 )/T1) / T2; - dVADIBL_dVd = (dVgsteff_dVd - (dT0_dVd - T0 * dT1_dVd /T1 )/T1) / T2; - dVADIBL_dVe = (dVgsteff_dVe - (dT0_dVe - T0 * dT1_dVe /T1 )/T1) / T2; - - if (selfheat) - /*fix below expression Wagner */ - /*dVADIBL_dT = (dVgst2Vtm_dT - dT0_dT/T1 + T0*dT1_dT/T9) / T2;*/ - dVADIBL_dT = (dVgst2Vtm_dT - dT0_dT/T1 + T0*dT1_dT/T9) / T2 - - VADIBL * dthetaRout_dT / T2; - else dVADIBL_dT = 0.0; - - T7 = pParam->B4SOIpdiblb * Vbseff; - if (T7 >= -0.9) - { T3 = 1.0 / (1.0 + T7); - VADIBL *= T3; - /* LFW_FD fix/add 4 derivatives */ - dVADIBL_dVg = (dVADIBL_dVg - VADIBL * pParam->B4SOIpdiblb * dVbseff_dVg) * T3; - dVADIBL_dVb = (dVADIBL_dVb - VADIBL * pParam->B4SOIpdiblb * dVbseff_dVb) * T3; - dVADIBL_dVd = (dVADIBL_dVd - VADIBL * pParam->B4SOIpdiblb * dVbseff_dVd) * T3; - dVADIBL_dVe = (dVADIBL_dVe - VADIBL * pParam->B4SOIpdiblb * dVbseff_dVe) * T3; - /*fix below expression Wagner */ - /*if (selfheat) dVADIBL_dT *= T3;*/ - if (selfheat) - dVADIBL_dT = T3 * dVADIBL_dT - - VADIBL*pParam->B4SOIpdiblb*dVbseff_dT/(1.0+T7); - else dVADIBL_dT = 0.0; - } - else - /* Added to avoid the discontinuity problem caused by pdiblcb */ - { T4 = 1.0 / (0.8 + T7); - T3 = (17.0 + 20.0 * T7) * T4; - /* LFW_FD fix/add 4 derivatives */ - dVADIBL_dVg = dVADIBL_dVg * T3 + VADIBL * (20.0 - T3) * T4 * pParam->B4SOIpdiblb * dVbseff_dVg; - dVADIBL_dVb = dVADIBL_dVb * T3 + VADIBL * (20.0 - T3) * T4 * pParam->B4SOIpdiblb * dVbseff_dVb; - dVADIBL_dVd = dVADIBL_dVd * T3 + VADIBL * (20.0 - T3) * T4 * pParam->B4SOIpdiblb * dVbseff_dVd; - dVADIBL_dVe = dVADIBL_dVe * T3 + VADIBL * (20.0 - T3) * T4 * pParam->B4SOIpdiblb * dVbseff_dVe; - /*fix below expression Wagner */ - /*if (selfheat) dVADIBL_dT *= T3;*/ - if (selfheat) - dVADIBL_dT = T3 * dVADIBL_dT - + VADIBL * (20.0*T4 - T3/(0.8 + T7)) - * pParam->B4SOIpdiblb*dVbseff_dT; - else dVADIBL_dT = 0.0; - VADIBL *= T3; - } - } - else - { VADIBL = MAX_EXPL; - dVADIBL_dVd = dVADIBL_dVg = dVADIBL_dVb = dVADIBL_dVe = dVADIBL_dT = 0.0; /* LFW_FD enhance line */ - } - - /* v4.0 DITS */ - T0 = pParam->B4SOIpditsd * Vds; - if (T0 > EXPL_THRESHOLD) - { T1 = MAX_EXPL; - dT1_dVd = 0; - } - else - { T1 = exp(T0); - dT1_dVd = T1 * pParam->B4SOIpditsd; - } - if (pParam->B4SOIpdits > MIN_EXPL) - { T2 = 1.0 + model->B4SOIpditsl * Leff; - VADITS = (1.0 + T2 * T1) / pParam->B4SOIpdits; - dVADITS_dVg = VADITS * dFP_dVg; - /* LFW_FD fix/add 3 derivatives */ - dVADITS_dVd = VADITS * dFP_dVd + FP * T2 * dT1_dVd / pParam->B4SOIpdits; - dVADITS_dVb = VADITS * dFP_dVb; - dVADITS_dVe = VADITS * dFP_dVe; - VADITS *= FP; - if (selfheat) dVADITS_dT = VADITS * dFP_dT / FP; - else dVADITS_dT = 0.0; - } - else - { VADITS = MAX_EXPL; - dVADITS_dVg = dVADITS_dVd = dVADITS_dVb = dVADITS_dVe = dVADITS_dT = 0; /* LFW_FD enhance line */ - } - - /* Calculate VA */ - - T8 = pParam->B4SOIpvag / EsatL; - T9 = T8 * Vgsteff; - if (T9 > -0.9) - { T0 = 1.0 + T9; - /* LFW_FD fix/add 4 derivatives */ - dT0_dVg = T8 * dVgsteff_dVg - T9 * dEsatL_dVg / EsatL; - dT0_dVb = T8 * dVgsteff_dVb - T9 * dEsatL_dVb / EsatL; - dT0_dVd = T8 * dVgsteff_dVd - T9 * dEsatL_dVd / EsatL; - dT0_dVe = T8 * dVgsteff_dVe - T9 * dEsatL_dVe / EsatL; - if (selfheat) - /* fix below expression - Wagner */ - /*dT0_dT = -T9 * dEsatL_dT / EsatL;*/ - dT0_dT = T8 * dVgsteff_dT - T9 * dEsatL_dT / EsatL; - else - dT0_dT = 0.0; - } - else /* Added to avoid the discontinuity problems caused by pvag */ - { TL1 = T1 = 1.0 / (17.0 + 20.0 * T9); /* change LHS name - Wagner */ - T0 = (0.8 + T9) * T1; - T1 *= T1; - T9 *= T1 / EsatL; - /* LFW_FD fix/add 4 derivatives */ - dT0_dVg = (1.0 - 20.0 * T0) * TL1 * (T8 * dVgsteff_dVg - T9 * dEsatL_dVg / EsatL); - dT0_dVb = (1.0 - 20.0 * T0) * TL1 * (T8 * dVgsteff_dVb - T9 * dEsatL_dVb / EsatL); - dT0_dVd = (1.0 - 20.0 * T0) * TL1 * (T8 * dVgsteff_dVd - T9 * dEsatL_dVd / EsatL); - dT0_dVe = (1.0 - 20.0 * T0) * TL1 * (T8 * dVgsteff_dVe - T9 * dEsatL_dVe / EsatL); - if (selfheat) - /* fix below expression - Wagner */ - /*dT0_dT = -T9 * dEsatL_dT;*/ - dT0_dT = TL1 * (1.0 - 20.0 * T0) - * (T8 * dVgsteff_dT - T8 * Vgsteff * dEsatL_dT / EsatL); - else - dT0_dT = 0.0; - } - - tmp1 = VACLM * VACLM; - tmp2 = VADIBL * VADIBL; - tmp3 = VACLM + VADIBL; - - T1 = VACLM * VADIBL / tmp3; - tmp3 *= tmp3; - dT1_dVg = (tmp1 * dVADIBL_dVg + tmp2 * dVACLM_dVg) / tmp3; - dT1_dVd = (tmp1 * dVADIBL_dVd + tmp2 * dVACLM_dVd) / tmp3; - dT1_dVb = (tmp1 * dVADIBL_dVb + tmp2 * dVACLM_dVb) / tmp3; - dT1_dVe = (tmp1 * dVADIBL_dVe + tmp2 * dVACLM_dVe) / tmp3; /* LFW_FD new line */ - if (selfheat) - /*fix below expression - Wagner */ - /*dT1_dT = (tmp1 * dVADIBL_dT + tmp2 * dVACLM_dT ) / tmp3;*/ - dT1_dT = (dVACLM_dT * VADIBL + VACLM * dVADIBL_dT - - T1 * (dVACLM_dT + dVADIBL_dT))/ (VACLM + VADIBL); - else dT1_dT = 0.0; - - /* v4.0 adding DITS */ - tmp1 = T1 * T1; - tmp2 = VADITS * VADITS; - tmp3 = T1 + VADITS; - T2 = T1 * VADITS / tmp3; - tmp3 *= tmp3; - dT2_dVg = (tmp1 * dVADITS_dVg + tmp2 * dT1_dVg) / tmp3; - dT2_dVd = (tmp1 * dVADITS_dVd + tmp2 * dT1_dVd) / tmp3; - /* LFW_FD fix/add 2 derivatives */ - dT2_dVb = (tmp1 * dVADITS_dVb + tmp2 * dT1_dVb) / tmp3; - dT2_dVe = (tmp1 * dVADITS_dVe + tmp2 * dT1_dVe) / tmp3; - if (selfheat) - /*fix below expression - Wagner */ - /*dT2_dT = (tmp1 * dVADITS_dT + tmp2 * dT1_dT ) / tmp3;*/ - dT2_dT = (dT1_dT * VADITS + T1 * dVADITS_dT - - T2 * (dT1_dT + dVADITS_dT))/(T1 + VADITS); - else dT2_dT = 0.0; - - /* - Va = Vasat + T0 * T1; - dVa_dVg = dVasat_dVg + T1 * dT0_dVg + T0 * dT1_dVg; - dVa_dVd = dVasat_dVd + T1 * dT0_dVd + T0 * dT1_dVd; - dVa_dVb = dVasat_dVb + T1 * dT0_dVb + T0 * dT1_dVb; - if (selfheat) - dVa_dT = dVasat_dT + T1 * dT0_dT + T0 * dT1_dT; - else dVa_dT = 0.0; - */ - /* v4.0 */ - Va = Vasat + T0 * T2; - dVa_dVg = dVasat_dVg + T2 * dT0_dVg + T0 * dT2_dVg; - dVa_dVd = dVasat_dVd + T2 * dT0_dVd + T0 * dT2_dVd; - dVa_dVb = dVasat_dVb + T2 * dT0_dVb + T0 * dT2_dVb; - dVa_dVe = dVasat_dVe + T2 * dT0_dVe + T0 * dT2_dVe; /* LFW_FD new line */ - if (selfheat) - dVa_dT = dVasat_dT + T2 * dT0_dT + T0 * dT2_dT; - else dVa_dT = 0.0; - - /* Calculate Ids */ - CoxWovL = model->B4SOIcox * Weff / Leff; - beta = ueff * CoxWovL; - dbeta_dVg = CoxWovL * dueff_dVg + beta * dWeff_dVg / Weff ; - /* LFW_FD fix/add 3 derivatives */ - dbeta_dVd = CoxWovL * dueff_dVd + beta * dWeff_dVd / Weff ; - dbeta_dVb = CoxWovL * dueff_dVb + beta * dWeff_dVb / Weff ; - dbeta_dVe = CoxWovL * dueff_dVe + beta * dWeff_dVe / Weff ; - /* fix below if expresssion - Wagner */ - /*if (selfheat) dbeta_dT = CoxWovL * dueff_dT; */ - if (selfheat) dbeta_dT = CoxWovL * dueff_dT + beta * dWeff_dT / Weff ; - else dbeta_dT = 0.0; - - T0 = 1.0 - 0.5 * Abulk * Vdseff / Vgst2Vtm; - /* LFW_FD fix/add 4 derivatives */ - dT0_dVg = -0.5 * (Abulk * dVdseff_dVg + dAbulk_dVg * Vdseff - -Abulk * Vdseff * dVgsteff_dVg / Vgst2Vtm) / Vgst2Vtm; - dT0_dVb = -0.5 * (Abulk * dVdseff_dVb + dAbulk_dVb * Vdseff - -Abulk * Vdseff * dVgsteff_dVb / Vgst2Vtm) / Vgst2Vtm; - dT0_dVd = -0.5 * (Abulk * dVdseff_dVd + dAbulk_dVd * Vdseff - -Abulk * Vdseff * dVgsteff_dVd / Vgst2Vtm) / Vgst2Vtm; - dT0_dVe = -0.5 * (Abulk * dVdseff_dVe + dAbulk_dVe * Vdseff - -Abulk * Vdseff * dVgsteff_dVe / Vgst2Vtm) / Vgst2Vtm; - if (selfheat) - /* fix first line of below expression - Wagner */ - /*dT0_dT = -0.5 * (Abulk * dVdseff_dT */ - dT0_dT = -0.5 * (Abulk * dVdseff_dT + dAbulk_dT * Vdseff - - Abulk * Vdseff / Vgst2Vtm * dVgst2Vtm_dT) - / Vgst2Vtm; - else dT0_dT = 0.0; - - fgche1 = Vgsteff * T0; - /* LFW_FD fix/add 4 derivatives */ - dfgche1_dVg = Vgsteff * dT0_dVg + dVgsteff_dVg * T0; - dfgche1_dVb = Vgsteff * dT0_dVb + dVgsteff_dVb * T0; - dfgche1_dVd = Vgsteff * dT0_dVd + dVgsteff_dVd * T0; - dfgche1_dVe = Vgsteff * dT0_dVe + dVgsteff_dVe * T0; - /* fix below expression - Wagner */ - /*if (selfheat) dfgche1_dT = Vgsteff * dT0_dT;*/ - if (selfheat) dfgche1_dT = Vgsteff * dT0_dT + T0 * dVgsteff_dT; - else dfgche1_dT = 0.0; - - T9 = Vdseff / EsatL; - fgche2 = 1.0 + T9; - dfgche2_dVg = (dVdseff_dVg - T9 * dEsatL_dVg) / EsatL; - dfgche2_dVd = (dVdseff_dVd - T9 * dEsatL_dVd) / EsatL; - dfgche2_dVb = (dVdseff_dVb - T9 * dEsatL_dVb) / EsatL; - dfgche2_dVe = (dVdseff_dVe - T9 * dEsatL_dVe) / EsatL; /* LFW_FD new line */ - if (selfheat) dfgche2_dT = (dVdseff_dT - T9 * dEsatL_dT) / EsatL; - else dfgche2_dT = 0.0; - - gche = beta * fgche1 / fgche2; - dgche_dVg = (beta * dfgche1_dVg + fgche1 * dbeta_dVg - - gche * dfgche2_dVg) / fgche2; - dgche_dVd = (beta * dfgche1_dVd + fgche1 * dbeta_dVd - - gche * dfgche2_dVd) / fgche2; - dgche_dVb = (beta * dfgche1_dVb + fgche1 * dbeta_dVb - - gche * dfgche2_dVb) / fgche2; - /* LFW_FD add 1 derivative */ - dgche_dVe = (beta * dfgche1_dVe + fgche1 * dbeta_dVe - - gche * dfgche2_dVe) / fgche2; - if (selfheat) - dgche_dT = (beta * dfgche1_dT + fgche1 * dbeta_dT - - gche * dfgche2_dT) / fgche2; - else dgche_dT = 0.0; - - T0 = 1.0 + gche * Rds; - T9 = Vdseff / T0; - Idl = gche * T9; - IdlovVdseff = gche / T0; - - /* Whoa, these formulas for the derivatives of Idl are convoluted, but I - verified them to be correct */ - - dIdl_dVg = (gche * dVdseff_dVg + T9 * dgche_dVg) / T0 - - Idl * gche / T0 * dRds_dVg ; - /* LFW_FD fix/add 3 derivatives */ - dIdl_dVd = (gche * dVdseff_dVd + T9 * dgche_dVd - Idl * dRds_dVd * gche) / T0; - dIdl_dVb = (gche * dVdseff_dVb + T9 * dgche_dVb - - Idl * dRds_dVb * gche) / T0; - dIdl_dVe = (gche * dVdseff_dVe + T9 * dgche_dVe - Idl * dRds_dVe * gche) / T0; - if (selfheat) - dIdl_dT = (gche * dVdseff_dT + T9 * dgche_dT - - Idl * dRds_dT * gche) / T0; - else dIdl_dT = 0.0; - - T9 = diffVds / Va; - T0 = 1.0 + T9; - here->B4SOIids = Ids = Idl * T0 / here->B4SOInseg; - /* LFW_FD add 4 derivatives */ - dIds_dVg = (dIdl_dVg * T0 - Idl * (dVdseff_dVg + T9 * dVa_dVg) / Va)/ here->B4SOInseg; - dIds_dVb = (dIdl_dVb * T0 - Idl * (dVdseff_dVb + T9 * dVa_dVb) / Va)/ here->B4SOInseg; - dIds_dVd = (dIdl_dVd * T0 + Idl * (1.0 - dVdseff_dVd - T9 * dVa_dVd) / Va)/ here->B4SOInseg; - dIds_dVe = (dIdl_dVe * T0 - Idl * (dVdseff_dVe + T9 * dVa_dVe) / Va)/ here->B4SOInseg; - /* 5 new lines Wagner */ - if (selfheat) - dIds_dT = dIdl_dT * T0 / here->B4SOInseg - + Idl * (-dVdseff_dT/Va -diffVds/Va/Va*dVa_dT) - / here->B4SOInseg; - else dIds_dT = 0.0; - - here->B4SOIidovVds = IdlovVdseff * T0 / here->B4SOInseg; - /* v4.0 bug fix */ -/* IdovVds = IdlovVdseff * T0 / here->B4SOInseg; LFW_FD not needed */ - - Gm0 = T0 * dIdl_dVg - Idl * (dVdseff_dVg + T9 * dVa_dVg) / Va; - Gds0 = T0 * dIdl_dVd + Idl * (1.0 - dVdseff_dVd - - T9 * dVa_dVd) / Va; - Gmb0 = T0 * dIdl_dVb - Idl * (dVdseff_dVb + T9 * dVa_dVb) / Va; - Gme0 = dIdl_dVe * T0 - Idl * (dVdseff_dVe + T9 * dVa_dVe) / Va; /* LFW_FD new line */ - /*Gmc = 0.0; LFW_FD not used */ - - if (selfheat) - GmT0 = T0 * dIdl_dT - Idl * (dVdseff_dT + T9 * dVa_dT) / Va; - else GmT0 = 0.0; - - /* This includes all dependencies from Vgsteff, Vbseff */ - - /*Gm = (Gm0 * dVgsteff_dVg+ Gmb0 * dVbseff_dVg) / here->B4SOInseg; v3.0 */ - /*Gmb = (Gm0 * dVgsteff_dVb + Gmb0 * dVbseff_dVb) / here->B4SOInseg; */ - /*Gds = (Gm0 * dVgsteff_dVd+ Gmb0 * dVbseff_dVd + Gds0) / here->B4SOInseg; v3.0 */ - /*Gme = (Gm0 * dVgsteff_dVe + Gmb0 * dVbseff_dVe) / here->B4SOInseg; v3.0 */ - /* LFW_FD fix 4 derivatives */ - Gm = dIds_dVg; - Gmb = dIds_dVb; - Gds = dIds_dVd; - Gme = dIds_dVe; - if (selfheat) - /* fix below expression Wagner */ - /* GmT = (Gm0 * dVgsteff_dT + Gmb0 * dVbseff_dT + GmT0) / here->B4SOInseg; v3.0 */ - GmT = dIds_dT; - else GmT = 0.0; - - /* LFW_FD flexilint inits */ - Ibsdif = dIbsdif_dVb = dIbsdif_dT = 0; - Ibddif = dIbddif_dVb = dIbddif_dT = 0; - Ibs1 = dIbs1_dVb = dIbs1_dT = Ibd1 = dIbd1_dVb = dIbd1_dVd = dIbd1_dT = 0; - Ibs2 = dIbs2_dVb = dIbs2_dT = Ibd2 = dIbd2_dVb = dIbd2_dVd = dIbd2_dT = 0; - Ibs3 = dIbs3_dVb = dIbs3_dT = Ibd3 = dIbd3_dVb = dIbd3_dVd = dIbd3_dT = 0; - Ibs4 = dIbs4_dVb = dIbs4_dT = Ibd4 = dIbd4_dVb = dIbd4_dVd = dIbd4_dT = 0; - Igisl = Ggisls = Ggislg = Ggislb = 0.0; - dIc_dVd = dIc_dVb = 0.0; - - /* v3.1 */ - if (here->B4SOIsoiMod != 2) /* v3.2 */ - { - /* calculate GISL/GIDL current */ - /*4.1*/ - if(model->B4SOImtrlMod == 0) - T0 = 3.0 * 3.9 / epsrox * toxe; - else - T0 = model->B4SOIepsrsub * toxe / epsrox; - - - if (model->B4SOIgidlMod==0) - { - /*fix next if-then-else block Wagner */ - if (model->B4SOImtrlMod==0) { - /* T1 = (- Vds - Vgs_eff - egisl) / T0; *//* Bug # 25 Jul09*/ - T1 = (- Vds - Vgd_eff - egisl) / T0; - dTL1_dT = -dVgd_eff_dT / T0; - } - else { - /* T1 = (- Vds - Vgs_eff - egisl+pParam->B4SOIvfbsd) / T0; */ - T1 = (- Vds - Vgd_eff - egisl + pParam->B4SOIvfbsd) / T0; - dTL1_dT = -dVgd_eff_dT / T0; - } - /* GISL */ - if ((agisl <= 0.0) || - (bgisl <= 0.0) || (T1 <= 0.0) || - /*(cgisl < 0.0) || (Vbd > 0.0) ) */ /* v4.2 Bug # 24 Jul09*/ - (cgisl < 0.0) || (Vbs > 0.0) ) - Igisl = Ggisls = Ggislg = Ggislb = Ggislt = 0.0; /* enhanced line Wagner */ - - else { - dT1_dVd = 1 / T0; - /* dT1_dVg = - dT1_dVd * dVgs_eff_dVg; *//* Bug fix # 25 Jul09 */ - dT1_dVg = - dT1_dVd * dVgd_eff_dVg; - T2 = bgisl / T1; - if (T2 < EXPL_THRESHOLD) - { - Igisl = wdios * agisl * T1 * exp(-T2); - T3 = Igisl / T1 * (T2 + 1); - Ggisls = T3 * dT1_dVd; - /* Ggisls = T3 * dT1_dVg; */ /* Bug # 28 Jul09*/ - Ggislg = T3 * dT1_dVg; - /* 3 new lines Wagner */ - if (selfheat) - Ggislt = T3 * dTL1_dT; - else Ggislt = 0.0; - } else - { - T3 = wdios * agisl * MIN_EXPL; - Igisl = T3 * T1 ; - Ggisls = T3 * dT1_dVd; - Ggislg = T3 * dT1_dVg; - /* 3 new lines Wagner */ - if (selfheat) - Ggislt = T3 * dTL1_dT; - else Ggislt = 0.0; - } - if(cgisl >= MIN_EXPL) { - T4 = Vbs * Vbs; - T5 = -Vbs * T4; - T6 = cgisl + T5; - T7 = T5 / T6; - T8 = 3.0 * cgisl * T4 / T6 / T6; - Ggisls = Ggisls * T7 + Igisl * T8; - Ggislg = Ggislg * T7; - Ggislb = -Igisl * T8; - /* 3 new lines Wagner */ - if (selfheat) - Ggislt = Ggislt * T7; - else Ggislt = 0.0; - Igisl *= T7; - } else - Ggislb = 0.0; - } - here->B4SOIigisl = Igisl; - /* End of GISL */ - - /* enhance next if-then-else block Wagner */ - if (model->B4SOImtrlMod==0) { - T1 = (Vds - Vgs_eff - egidl) / T0; - dTL1_dT = -dVgs_eff_dT / T0; - } - else { - T1 = (Vds - Vgs_eff - egidl+pParam->B4SOIvfbsd) / T0; - dTL1_dT = -dVgs_eff_dT / T0; - } - - /* GIDL */ - if ((agidl <= 0.0) || - (bgidl <= 0.0) || (T1 <= 0.0) || - (cgidl < 0.0) || (Vbd > 0.0) ) - Igidl = Ggidld = Ggidlg = Ggidlb = Ggidlt = 0.0; /* enhanced line Wagner */ - - else { - dT1_dVd = 1 / T0; - dT1_dVg = - dT1_dVd * dVgs_eff_dVg; - T2 = bgidl / T1; - if (T2 < EXPL_THRESHOLD) - { - Igidl = wdiod * agidl * T1 * exp(-T2); - T3 = Igidl / T1 * (T2 + 1); - Ggidld = T3 * dT1_dVd; - Ggidlg = T3 * dT1_dVg; - /* 3 new lines Wagner */ - if (selfheat) - Ggidlt = T3 * dTL1_dT; - else Ggidlt = 0.0; - } else - { - T3 = wdiod * agidl * MIN_EXPL; - Igidl = T3 * T1 ; - Ggidld = T3 * dT1_dVd; - Ggidlg = T3 * dT1_dVg; - /* 3 new lines Wagner */ - if (selfheat) - Ggidlt = T3 * dTL1_dT; - else Ggidlt = 0.0; - } - if(cgidl >= MIN_EXPL) { - T4 = Vbd * Vbd; - T5 = -Vbd * T4; - T6 = cgidl + T5; - T7 = T5 / T6; - T8 = 3.0 * cgidl * T4 / T6 / T6; - Ggidld = Ggidld * T7 + Igidl * T8; - Ggidlg = Ggidlg * T7; - Ggidlb = -Igidl * T8; - /* 3 new lines Wagner */ - if (selfheat) - Ggidlt = Ggidlt * T7; - else Ggidlt = 0.0; - Igidl *= T7; - } else - Ggidlb = 0.0; - } - here->B4SOIigidl = Igidl; - /* End of GIDL*/ - } - else - { - /* enhance next if-then-else block Wagner */ - if (model->B4SOImtrlMod==0) { - /* T1 = (-Vds - rgisl*Vgs_eff - pParam->B4SOIegisl) / T0;*/ - T1 = (-Vds - rgisl*Vgd_eff - egisl) / T0; /* Bug # 26 Jul09*/ - dTL1_dT = -rgisl * dVgd_eff_dT / T0; - } - else { - /* T1 = (-Vds - rgisl*Vgs_eff - pParam->B4SOIegisl+pParam->B4SOIvfbsd) / T0; */ - T1 = (-Vds - rgisl*Vgd_eff - egisl + pParam->B4SOIvfbsd) / T0; /* Bug # 26 Jul09*/ - dTL1_dT = -rgisl * dVgd_eff_dT / T0; - } - - /* GISL */ - - if ((agisl <= 0.0) || - (bgisl <= 0.0) || (T1 <= 0.0) || - (cgisl < 0.0) ) - Igisl = Ggisls = Ggislg = Ggislb = Ggislt = 0.0; /* enhanced line Wagner */ - else - { - dT1_dVd = 1 / T0; - /* dT1_dVg = - rgisl*dT1_dVd * dVgs_eff_dVg;*//*Bug fix #26*/ - dT1_dVg = - rgisl*dT1_dVd * dVgd_eff_dVg; - T2 = bgisl / T1; - if (T2 < EXPL_THRESHOLD) - { - Igisl = wdios * agisl * T1 * exp(-T2); - T3 = Igisl / T1 * (T2 + 1); - Ggisls = T3 * dT1_dVd; - Ggislg = T3 * dT1_dVg; - /* 3 new lines Wagner */ - if (selfheat) - Ggislt = T3 * dTL1_dT; - else Ggislt = 0.0; - } else - { - T3 = wdios * agisl * MIN_EXPL; - Igisl = T3 * T1 ; - Ggisls = T3 * dT1_dVd; - Ggislg = T3 * dT1_dVg; - /* 3 new lines Wagner */ - if (selfheat) - Ggislt = T3 * dTL1_dT; - else Ggislt = 0.0; - } - T4 = Vbs - fgisl; - /*if (T4==0) - T5 =1; - else - T5 = kgisl/T4; - T6 = exp(T5); - if (T6B4SOIigisl = Igisl; - /* End of GISL */ - - /* enhance next if-then-else block Wagner */ - if (model->B4SOImtrlMod==0) { - /*T1 = (Vds - rgidl*Vgs_eff - pParam->B4SOIegidl) / T0; *//* v4.2 bugfix #26 */ - T1 = (Vds - rgidl*Vgs_eff - egidl) / T0; - dTL1_dT = -rgidl * dVgs_eff_dT / T0; - } - else { - /*T1 = (Vds - rgidl*Vgs_eff - pParam->B4SOIegidl+pParam->B4SOIvfbsd) / T0;*/ /* v4.2 bugfix #26 */ - T1 = (Vds - rgidl * Vgs_eff - egidl + pParam->B4SOIvfbsd) / T0; - dTL1_dT = -rgidl * dVgs_eff_dT / T0; - } - /* GIDL */ - if ((agidl <= 0.0) || - (bgidl <= 0.0) || (T1 <= 0.0) || - (cgidl < 0.0) ) - Igidl = Ggidld = Ggidlg = Ggidlb = Ggidlt = 0.0; /* enhanced line Wagner */ - else - { - dT1_dVd = 1 / T0; - dT1_dVg = - rgidl*dT1_dVd * dVgs_eff_dVg; - T2 = bgidl / T1; - if (T2 < EXPL_THRESHOLD) - { - Igidl = wdiod * agidl * T1 * exp(-T2); - T3 = Igidl / T1 * (T2 + 1); - Ggidld = T3 * dT1_dVd; - Ggidlg = T3 * dT1_dVg; - /* 3 new lines Wagner */ - if (selfheat) - Ggidlt = T3 * dTL1_dT; - else Ggidlt = 0.0; - } else - { - T3 = wdiod * agidl * MIN_EXPL; - Igidl = T3 * T1 ; - Ggidld = T3 * dT1_dVd; - Ggidlg = T3 * dT1_dVg; - /* 3 new lines Wagner */ - if (selfheat) - Ggidlt = T3 * dTL1_dT; - else Ggidlt = 0.0; - } - T4 = Vbd - fgidl; - /*if (T4==0) - T5 =1; - else - T5 = kgidl/T4; - T6 = exp(T5); - if (T6B4SOIigidl = Igidl; - /* End of GIDL */ - - } - - - - - - /* calculate diode and BJT current */ - WsTsi = wdios * model->B4SOItsi; - WdTsi = wdiod * model->B4SOItsi; - /* NVtm1 = Vtm * pParam->B4SOIndiode; v4.2 bugfix */ - NVtm1 = Vtm * ndiode; - if (selfheat) - /*dNVtm1_dT = pParam->B4SOIndiode * dVtm_dT; v4.2 bugfix */ - dNVtm1_dT = ndiode * dVtm_dT; - else - dNVtm1_dT = 0; - T0 = vbs_jct / NVtm1; /* v4.0 */ - dT0_dVb = 1.0 / NVtm1; - if (selfheat) - dT0_dT = -vbs_jct / NVtm1 / NVtm1 * dNVtm1_dT; - else - dT0_dT = 0; - DEXP(T0, ExpVbsNVtm, T1); - dExpVbsNVtm_dVb = T1 * dT0_dVb; - if (selfheat) - dExpVbsNVtm_dT = T1 * dT0_dT; - else - dExpVbsNVtm_dT = 0; - /* NVtm1 = Vtm * pParam->B4SOIndioded; v4.2 bugfix */ - NVtm1 = Vtm * ndioded; /* v4.0 drain side */ - if (selfheat) - /*dNVtm1_dT = pParam->B4SOIndioded* dVtm_dT; v4.2 bugfix */ - dNVtm1_dT = ndioded * dVtm_dT; - else - dNVtm1_dT = 0; - T0 = vbd_jct / NVtm1; /* v4.0 */ - dT0_dVb = 1.0 / NVtm1; - dT0_dVd = -dT0_dVb; - if (selfheat) - dT0_dT = -vbd_jct / NVtm1 / NVtm1 * dNVtm1_dT; - else - dT0_dT = 0; - DEXP(T0, ExpVbdNVtm, T1); - dExpVbdNVtm_dVb = T1 * dT0_dVb; - dExpVbdNVtm_dVd = -dExpVbdNVtm_dVb; - if (selfheat) - dExpVbdNVtm_dT = T1 * dT0_dT; - else - dExpVbdNVtm_dT = 0; - - /* Ibs1: diffusion current */ - if (jdifs == 0) { - Ibs1 = dIbs1_dVb = dIbs1_dT = 0; - } - else { - T0 = WsTsi * jdifs; - if (selfheat) - dT0_dT = WsTsi * djdifs_dT; - else - dT0_dT = 0; - Ibs1 = T0 * (ExpVbsNVtm - 1); - dIbs1_dVb = T0 * dExpVbsNVtm_dVb; - if (selfheat) - dIbs1_dT = T0 * dExpVbsNVtm_dT + (ExpVbsNVtm - 1) * dT0_dT; - else - dIbs1_dT = 0; - } - - /* Ibd1: diffusion current */ - if (jdifd == 0) { - Ibd1 = dIbd1_dVb = dIbd1_dVd = dIbd1_dT = 0; - } - else { - T0 = WdTsi * jdifd; - - if (selfheat) - dT0_dT = WdTsi * djdifd_dT; - else - dT0_dT = 0; - Ibd1 = T0 * (ExpVbdNVtm - 1); - dIbd1_dVb = T0 * dExpVbdNVtm_dVb; - dIbd1_dVd = -dIbd1_dVb; - if (selfheat) - dIbd1_dT = T0 * dExpVbdNVtm_dT + (ExpVbdNVtm -1) - * dT0_dT; - else - dIbd1_dT = 0; - } - - - /* Ibs2:recombination/trap-assisted tunneling current */ - - if (jrecs == 0) { - Ibs2 = dIbs2_dVb = dIbs2_dT = 0; - } - else { - /* forward bias */ - /* NVtmf = 0.026 * nrecf0s bugfix_snps for DC swapping - * (1 + pParam->B4SOIntrecf * (TempRatio - 1)); - NVtmr = 0.026 * nrecr0s bugfix_snps for DC swapping - * (1 + pParam->B4SOIntrecr * (TempRatio - 1)); */ - NVtmf = Vtm00 * nrecf0s /* bugfix_snps for DC swapping*/ - * (1 + pParam->B4SOIntrecf * (TempRatio - 1)); /* v4.3.1 -Tanvir */ - NVtmr = Vtm00 * nrecr0s /* bugfix_snps for DC swapping*/ - * (1 + pParam->B4SOIntrecr * (TempRatio - 1)); /* v4.3.1 -Tanvir */ - if (selfheat) { - /* dNVtmf_dT = nrecf0s * 0.026 bugfix_snps for DC swapping - * pParam->B4SOIntrecf * dTempRatio_dT; - dNVtmr_dT = nrecr0s * 0.026 bugfix_snps for DC swapping - * pParam->B4SOIntrecr * dTempRatio_dT; */ - dNVtmf_dT = nrecf0s * Vtm00 /* bugfix_snps for DC swapping*/ - * pParam->B4SOIntrecf * dTempRatio_dT; /* v4.3.1 -Tanvir */ - dNVtmr_dT = nrecr0s * Vtm00 /* bugfix_snps for DC swapping*/ - * pParam->B4SOIntrecr * dTempRatio_dT; /* v4.3.1 -Tanvir */ - } - else - dNVtmf_dT = dNVtmr_dT = 0; - - T0 = vbs_jct / NVtmf; /* v4.0 */ - DEXP(T0,T10,T2); - T4 = 1 / NVtmf; - dT10_dVb = T4 * T2; - if (selfheat) - dT10_dT = - T4 * T2 * vbs_jct / NVtmf * dNVtmf_dT ; - else dT10_dT = 0.0; - - /* reverse bias */ - if ((vrec0s- vbs_jct) < 1e-3) { /* bugfix_snps for DC swapping*/ - - /* v2.2.3 bug fix */ - T1 = 1e3; - T0 = -vbs_jct / NVtmr * vrec0s * T1; /* bugfix_snps for DC swapping*/ - T11 = -exp(T0); - - dT11_dVb = dT11_dT = 0; - } - else { - T1 = 1 / (vrec0s - vbs_jct); /* bugfix_snps for DC swapping*/ - T0 = -vbs_jct / NVtmr * vrec0s * T1; /* bugfix_snps for DC swapping*/ - dT0_dVb = -vrec0s / NVtmr * /* bugfix_snps for DC swapping*/ - (T1 + vbs_jct * T1 * T1) ; - if (selfheat) - dT0_dT = -T0 / NVtmr * dNVtmr_dT; - else dT0_dT = 0; - - DEXP(T0, T11, T2); - T11 = -T11; - dT11_dVb = -T2 * dT0_dVb; - if (selfheat) - dT11_dT = -T2 * dT0_dT; - else dT11_dT = 0; - } - T3 = WsTsi * jrecs; - Ibs2 = T3 * (T10 + T11); - dIbs2_dVb = T3 * (dT10_dVb + dT11_dVb); - if (selfheat) - dIbs2_dT = T3 * (dT10_dT + dT11_dT) - + WsTsi * (T10 + T11) * djrecs_dT; - else dIbs2_dT = 0; - - } - - if (jrecd == 0) { - Ibd2 = dIbd2_dVb = dIbd2_dVd = dIbd2_dT = 0; - } - else { - /*NVtmf = 0.026 * nrecf0d bugfix_snps for DC swapping - * (1 + pParam->B4SOIntrecf * (TempRatio - 1)); - NVtmr = 0.026 * nrecr0d bugfix_snps for DC swapping - * (1 + pParam->B4SOIntrecr * (TempRatio - 1)); */ - NVtmf = Vtm00 * nrecf0d /* bugfix_snps for DC swapping*/ - * (1 + pParam->B4SOIntrecf * (TempRatio - 1)); /* v4.3.1 -Tanvir */ - NVtmr = Vtm00 * nrecr0d /* bugfix_snps for DC swapping*/ - * (1 + pParam->B4SOIntrecr * (TempRatio - 1)); /* v4.3.1 -Tanvir */ - if (selfheat) { - /* dNVtmf_dT = nrecf0d * 0.026 bugfix_snps for DC swapping - * pParam->B4SOIntrecf * dTempRatio_dT; - dNVtmr_dT = nrecr0d * 0.026 - * pParam->B4SOIntrecr * dTempRatio_dT; bugfix_snps for DC swapping */ - dNVtmf_dT = nrecf0d * Vtm00 /*bugfix_snps for DC swapping*/ - * pParam->B4SOIntrecf * dTempRatio_dT; /* v4.3.1 -Tanvir */ - dNVtmr_dT = nrecr0d * Vtm00 /* v4.3.1 -Tanvir */ - * pParam->B4SOIntrecr * dTempRatio_dT; /* bugfix_snps for DC swapping*/ - } - else - dNVtmf_dT = dNVtmr_dT = 0; - - T0 = vbd_jct / NVtmf; - DEXP(T0,T10,T2); - T4 = 1 / NVtmf; - dT10_dVb = T4 * T2; - if (selfheat) - dT10_dT = - T4 * T2 * vbd_jct / NVtmf * dNVtmf_dT ; - else dT10_dT = 0.0; - - if ((vrec0d - vbd_jct) < 1e-3) { /* bugfix_snps for DC swapping*/ - - /* v2.2.3 bug fix */ - T1 = 1e3; - T0 = -vbd_jct / NVtmr * vrec0d * T1; /* bugfix_snps for DC swapping*/ - T11 = -exp(T0); - - dT11_dVb = dT11_dT = 0; - } - else { - T1 = 1 / (vrec0d - vbd_jct); /* bugfix_snps for DC swapping*/ - T0 = -vbd_jct / NVtmr * vrec0d * T1; /* bugfix_snps for DC swapping*/ - dT0_dVb = -vrec0d / NVtmr /* bugfix_snps for DC swapping*/ - * (T1 + vbd_jct * T1 * T1) ; - if (selfheat) - dT0_dT = -T0 / NVtmr * dNVtmr_dT; - else - dT0_dT = 0; - DEXP(T0, T11, T2); - T11 = - T11; - dT11_dVb = -T2 * dT0_dVb; - if (selfheat) - dT11_dT = -T2 * dT0_dT; - else - dT11_dT = 0; - } - T3 = WdTsi * jrecd; - Ibd2 = T3 * (T10 + T11); - dIbd2_dVb = T3 * (dT10_dVb + dT11_dVb); - dIbd2_dVd = -dIbd2_dVb; - if (selfheat) - dIbd2_dT = T3 * (dT10_dT + dT11_dT) - + WdTsi * (T10 + T11) * djrecd_dT; - else - dIbd2_dT = 0; - } - - /* Ibs3/Ibd3: recombination current in neutral body */ - WTsi = pParam->B4SOIweff / here->B4SOInseg * model->B4SOItsi; - if (jbjts == 0.0 && jbjtd == 0.0) - { - Ibs3 = dIbs3_dVb = dIbs3_dVd = dIbs3_dT = 0.0; - Ibd3 = dIbd3_dVb = dIbd3_dVd = dIbd3_dT = 0.0; - Ibsdif = dIbsdif_dVb = dIbsdif_dT = 0; - /*Ibddif = dIbddif_dVb = dIbddif_dT = 0; v4.2 */ - Ibddif = dIbddif_dVb = dIbddif_dT = 0; - here->B4SOIic = Ic = Gcd = Gcb = GcT = 0.0; - } - else { - Ien = WTsi * jbjts * pParam->B4SOIlratio; - if (selfheat) - dIen_dT = WTsi * djbjts_dT * pParam->B4SOIlratio; - else - dIen_dT = 0; - - /* high level injection of source side */ - if ((Ehlis = Ahlis * (ExpVbsNVtm - 1)) < 1e-5) { - Ehlis = dEhlis_dVb = dEhlis_dT = 0; - EhlisFactor = 1; - dEhlisFactor_dVb = dEhlisFactor_dT = 0; - } - else { - dEhlis_dVb = Ahlis * dExpVbsNVtm_dVb; - if (selfheat) - dEhlis_dT = Ahlis * dExpVbsNVtm_dT + (ExpVbsNVtm - 1) * dAhlis_dT; - else - dEhlis_dT = 0; - EhlisFactor = 1.0 / sqrt(1 + Ehlis); - T0 = -0.5 * EhlisFactor / (1 + Ehlis); - dEhlisFactor_dVb = T0 * dEhlis_dVb; - if (selfheat) - dEhlisFactor_dT = T0 * dEhlis_dT; - else - dEhlisFactor_dT = 0; - } - - /* high level injection of drain side */ - if ((Ehlid = Ahlid * (ExpVbdNVtm - 1)) < 1e-5) { - Ehlid = dEhlid_dVb = dEhlid_dVd = dEhlid_dT = 0; - EhlidFactor = 1; - dEhlidFactor_dVb = dEhlidFactor_dT = 0; /* LFW_FD flexilint */ - } - else { - dEhlid_dVb = Ahlid * dExpVbdNVtm_dVb; - dEhlid_dVd = -dEhlid_dVb; - if (selfheat) - dEhlid_dT = Ahlid * dExpVbdNVtm_dT + (ExpVbdNVtm - 1) * dAhlid_dT; - else - dEhlid_dT = 0; - EhlidFactor = 1.0 / sqrt(1 + Ehlid); - T0 = -0.5 * EhlidFactor / (1 + Ehlid); - dEhlidFactor_dVb = T0 * dEhlid_dVb; - if (selfheat) - dEhlidFactor_dT = T0 * dEhlid_dT; - else - dEhlidFactor_dT = 0; - } - - - /* v3.1.1 bug fix for Ibjt(L) discontinuity */ - T0 = 1 - pParam->B4SOIarfabjt; - T1 = T0 * Ien; - if (selfheat) - dT1_dT = T0 * dIen_dT; - else - dT1_dT = 0; - - Ibs3 = T1 * (ExpVbsNVtm - 1) * EhlisFactor; - dIbs3_dVb = T1 * (dExpVbsNVtm_dVb * EhlisFactor - + (ExpVbsNVtm - 1) * dEhlisFactor_dVb); - dIbs3_dVd = 0; - if (selfheat) - dIbs3_dT = dT1_dT * (ExpVbsNVtm - 1) * EhlisFactor - + T1 * (dExpVbsNVtm_dT * EhlisFactor - + (ExpVbsNVtm - 1) * dEhlisFactor_dT); - else - dIbs3_dT = 0.0; - - Ien = WTsi * jbjtd * pParam->B4SOIlratio; - if (selfheat) - dIen_dT = WTsi * djbjtd_dT * pParam->B4SOIlratio; - else - dIen_dT = 0; - - T1 = T0 * Ien; - if (selfheat) - dT1_dT = T0 * dIen_dT; - else - dT1_dT = 0; - - Ibd3 = T1 * (ExpVbdNVtm - 1) * EhlidFactor; - dIbd3_dVb = T1 * (dExpVbdNVtm_dVb * EhlidFactor - + (ExpVbdNVtm - 1) * dEhlidFactor_dVb); - dIbd3_dVd = -dIbd3_dVb; - if (selfheat) - dIbd3_dT = dT1_dT * (ExpVbdNVtm - 1) * EhlidFactor - + T1 * (dExpVbdNVtm_dT * EhlidFactor - + (ExpVbdNVtm - 1) * dEhlidFactor_dT); - else - dIbd3_dT = 0.0; - - - /* effective diffusion current for capacitance calcu. */ - Iendif = WTsi * jbjts * pParam->B4SOIlratiodif; - if (selfheat) - dIendif_dT = WTsi * djbjts_dT * pParam->B4SOIlratiodif; - else - dIendif_dT = 0; - - Ibsdif = Iendif * (ExpVbsNVtm - 1) * EhlisFactor; - dIbsdif_dVb = Iendif * (dExpVbsNVtm_dVb * EhlisFactor - + (ExpVbsNVtm - 1) * dEhlisFactor_dVb); - if (selfheat) - dIbsdif_dT = dIendif_dT * (ExpVbsNVtm - 1) * EhlisFactor - + Iendif * (dExpVbsNVtm_dT * EhlisFactor - + (ExpVbsNVtm - 1) * dEhlisFactor_dT); - else - dIbsdif_dT = 0; - - Iendif = WTsi * jbjtd * pParam->B4SOIlratiodif; - if (selfheat) - dIendif_dT = WTsi * djbjtd_dT * pParam->B4SOIlratiodif; - else - dIendif_dT = 0; - - Ibddif = Iendif * (ExpVbdNVtm - 1) * EhlidFactor; - dIbddif_dVb = Iendif * (dExpVbdNVtm_dVb * EhlidFactor - + (ExpVbdNVtm - 1) * dEhlidFactor_dVb); - /*dIbddif_dVd = -dIbddif_dVb; v4.2 */ - if (selfheat) - dIbddif_dT = dIendif_dT * (ExpVbdNVtm - 1) * EhlidFactor - + Iendif * (dExpVbdNVtm_dT * EhlidFactor - + (ExpVbdNVtm - 1) * dEhlidFactor_dT); - else - dIbddif_dT = 0; - - /* Ic: Bjt collector current */ - if ((here->B4SOIbjtoff == 1) || (Vds == 0.0)) { - here->B4SOIic = Ic = Gcd = Gcb = GcT = 0.0; - dIc_dVb = dIc_dVd = 0.0; /*bugfix_snps for setting zero */ - } - else { - /* second order effects */ - /* T0 = 1 + (Vbs + Vbd) / pParam->B4SOIvearly; v4.3 bugfix */ - T0 = 1 + (vbs_jct + vbd_jct) / pParam->B4SOIvearly; - dT0_dVb = 2.0 / pParam->B4SOIvearly; - dT0_dVd = -1.0 / pParam->B4SOIvearly; - T1 = Ehlis + Ehlid; - dT1_dVb = dEhlis_dVb + dEhlid_dVb; - dT1_dVd = dEhlid_dVd; - if (selfheat) - dT1_dT = dEhlis_dT + dEhlid_dT; - else - dT1_dT = 0; - - T3 = sqrt(T0 * T0 + 4 * T1); - dT3_dVb = 0.5 / T3 * (2 * T0 * dT0_dVb + 4 * dT1_dVb); - dT3_dVd = 0.5 / T3 * (2 * T0 * dT0_dVd + 4 * dT1_dVd); - if (selfheat) - dT3_dT = 2 * dT1_dT / T3; - else - dT3_dT = 0; - - T2 = (T0 + T3) / 2.0; - dT2_dVb = (dT0_dVb + dT3_dVb) / 2.0; - dT2_dVd = (dT0_dVd + dT3_dVd) / 2.0; - if (selfheat) - dT2_dT = dT3_dT /2.0; - else - dT2_dT = 0; - - if (T2 < .1) - { - E2ndFactor = 10.0; - dE2ndFactor_dVb = dE2ndFactor_dVd = dE2ndFactor_dT = 0; - } - - else { - E2ndFactor = 1.0 / T2; - dE2ndFactor_dVb = -E2ndFactor / T2 * dT2_dVb; - dE2ndFactor_dVd = -E2ndFactor / T2 * dT2_dVd; - if (selfheat) - dE2ndFactor_dT = -E2ndFactor / T2 * dT2_dT; - else - dE2ndFactor_dT = 0; - } - - T0 = pParam->B4SOIarfabjt * Ien; /* here Ien refers to the drain side to simplify the code */ - if (selfheat) - dT0_dT = pParam->B4SOIarfabjt * dIen_dT; - else - dT0_dT = 0; - here->B4SOIic = Ic - = T0 * (ExpVbsNVtm - ExpVbdNVtm) * E2ndFactor; - Gcb = dIc_dVb - = T0 * ((dExpVbsNVtm_dVb - dExpVbdNVtm_dVb) * E2ndFactor - + (ExpVbsNVtm - ExpVbdNVtm) * dE2ndFactor_dVb); - Gcd = dIc_dVd - = T0 * (-dExpVbdNVtm_dVd * E2ndFactor - + (ExpVbsNVtm - ExpVbdNVtm) * dE2ndFactor_dVd); - if (selfheat) - GcT = T0 * (dExpVbsNVtm_dT - dExpVbdNVtm_dT) * E2ndFactor - + dT0_dT * (ExpVbsNVtm - ExpVbdNVtm) * E2ndFactor - + T0 * (ExpVbsNVtm - ExpVbdNVtm) * dE2ndFactor_dT; - else - GcT = 0; - } - } - - /* Ibs4/Ibd4 : tunneling */ - if (jtuns == 0 && jtund == 0) - { Ibs4 = Ibd4 = dIbs4_dVb = dIbs4_dT = dIbd4_dVb = dIbd4_dVd = dIbd4_dT = 0; - } else - { - /* NVtm2 = 0.026 * ntuns; */ /* bugfix_snps for junction DC swapping*/ - NVtm2 = Vtm00 * ntuns; /* bugfix_snps for junction DC swapping*/ /* v4.3.1 -Tanvir */ - if ((vtun0s - vbs_jct) < 1e-3) /* bugfix_snps for junction DC swapping*/ - { - /* v2.2.3 bug fix */ - T1=1e3; - T0 = -vbs_jct / NVtm2 * vtun0s * T1; /* bugfix_snps for junction DC swapping*/ - T1 = exp(T0); - T3 = WsTsi * jtuns; - Ibs4 = T3 * (1- T1); - - /*dIbs4_dVb = dIbs4_dT = 0; */ - dIbs4_dVb = 0.0; - if (selfheat) - dIbs4_dT = (1 - T1) * WsTsi * djtuns_dT; - else - dIbs4_dT = 0; - - } - else { - T1 = 1 / (vtun0s - vbs_jct); /*bugfix for junction DC swapping*/ - T0 = -vbs_jct / NVtm2 * vtun0s * T1; /*bugfix for junction DC swapping*/ - dT0_dVb = -vtun0s / NVtm2 * (T1 + vbs_jct * T1 * T1) ; /*bugfix for junction DC swapping*/ - - DEXP(T0, T1, T2); - T3 = WsTsi * jtuns; - Ibs4 = T3 * (1- T1); - dIbs4_dVb = -T3 * T2 * dT0_dVb; - if (selfheat) - dIbs4_dT = (1 - T1) * WsTsi * djtuns_dT; - else dIbs4_dT = 0; - } - - /*NVtm2 = 0.026 * ntund;*/ /* bugfix_snps for junction DC swapping*/ - NVtm2 = Vtm00 * ntund; /* v4.3.1 -Tanvir */ - if ((vtun0d - vbd_jct) < 1e-3) { /* bugfix_snps for junction DC swapping*/ - - /* v2.2.3 bug fix */ - T1=1e3; - T0 = -vbd_jct / NVtm2 * vtun0d * T1; /* bugfix_snps for junction DC swapping*/ - T1 = exp(T0); - T3 = WdTsi * jtund; - Ibd4 = T3 * (1- T1); - - /*dIbd4_dVb = dIbd4_dT = 0;*/ - dIbd4_dVb = 0; - dIbd4_dVd = 0; - if (selfheat) - /* dIbs4_dT = (1 - T1) * WsTsi * djtuns_dT; Bug fix #8 Jun 09 'typo's corrected for Drain side */ - /* else dIbs4_dT = 0; */ - dIbd4_dT = (1 - T1) * WdTsi * djtund_dT; /* Fix */ - else dIbd4_dT = 0; - } - else { - T1 = 1 / (vtun0d - vbd_jct); /* bugfix_snps for junction DC swapping*/ - T0 = -vbd_jct / NVtm2 * vtun0d * T1; /* bugfix_snps for junction DC swapping*/ - dT0_dVb = -vtun0d / NVtm2 * (T1 + vbd_jct * T1 * T1) ; /* bugfix_snps for junction DC swapping*/ - - DEXP(T0, T1, T2); - T3 = WdTsi * jtund; - Ibd4 = T3 * (1- T1); - dIbd4_dVb = -T3 * T2 * dT0_dVb; - - dIbd4_dVd = -dIbd4_dVb; - - if (selfheat) - dIbd4_dT = (1 - T1) * WdTsi * djtund_dT; - else dIbd4_dT = 0; - } - } - - here->B4SOIitun = - Ibd3 - Ibd4; - Ibs = Ibs1 + Ibs2 + Ibs3 + Ibs4; - Ibd = Ibd1 + Ibd2 + Ibd3 + Ibd4; - - Gjsb = dIbs1_dVb + dIbs2_dVb + dIbs3_dVb + dIbs4_dVb; - Gjsd = dIbs3_dVd; - if (selfheat) GjsT = dIbs1_dT + dIbs2_dT + dIbs3_dT + dIbs4_dT; - else GjsT = 0.0; - - Gjdb = dIbd1_dVb + dIbd2_dVb + dIbd3_dVb + dIbd4_dVb; - Gjdd = dIbd1_dVd + dIbd2_dVd + dIbd3_dVd + dIbd4_dVd; - if (selfheat) GjdT = dIbd1_dT + dIbd2_dT + dIbd3_dT + dIbd4_dT; - else GjdT = 0.0; - } - else /* v3.1 soiMod=2: ideal FD */ - { - here->B4SOIigidl= Igidl - = Ggidld = Ggidlg = Ggidlb = Ggidlt = 0.0; /* LFW_FD inits */ - here->B4SOIigisl= Igisl /* Bug fix #9 Jun 09 Code added to set Igisl components to zero */ - = Ggisls = Ggislg = Ggislb = Ggislt = 0.0; /* This is an appx solution */ - - here->B4SOIitun = 0; - Ibs = 0; - Ibd = 0; - Gjsb = 0.0; - Gjdb = 0.0; - Gjsd = 0.0; - Gjdd = 0.0; - - /* here->B4SOIigidl= Igidl */ - /* = Ggidld = Ggidlg = Ggidlb = Ggidlt = 0.0; LFW_FD enhance line */ - /* here->B4SOIigisl= Igisl Bug fix #9 Jun 09 Code added to set Igisl components to zero */ - /* = Ggisls = Ggislg = Ggislb = Ggislt = 0.0; This is an appx solution - LFW_FD enhance line */ - /* Final code will comply with BSIM MG in future releases */ - /* here->B4SOIitun = 0; */ - /* LFW_FD next 21 lines; fix Ibs, Ibd, and derivatives Gjs* and Gjd* */ - /* Ibs = 0; */ - /* Ibd = 0; */ - /* Add Gmin since body node is floating - LFW - DIDN'T Converge */ - /* Connect to electrical source, since source is BSIM reference */ - /* Also option to connect to both source and drain */ - /* if (here->B4SOImode == 1) */ - /* { */ - /* Ibs = 1.0e-18 * vbs; */ - /* Ibd = 1.0e-18 * vbd; */ - /* } */ - /* else */ - /* { */ - /* Ibs = 1.0e-18 * vbd; */ - /* Ibd = 1.0e-18 * vbs; */ - /* } */ - /* Gjsb = 1.0e-18; */ - /* Gjdb = 1.0e-18; */ - /* Gjsd = 0.0; */ - /* Gjdd = -1.0e-18; */ - GjsT = 0; - GjdT = 0; - - here->B4SOIic = Ic = Gcd = Gcb = GcT = 0.0; - } - if (here->B4SOImode > 0) - { - here->B4SOIibs = Ibs; - here->B4SOIibd = Ibd; - } - else - { - here->B4SOIibd = Ibs; - here->B4SOIibs = Ibd; - } - /* LFW_FD 12 new lines per flexilint */ - Vfb = 0.0; - Voxacc = dVoxacc_dVg = dVoxacc_dVd = dVoxacc_dVb = dVoxacc_dVe = 0.0; - Voxdepinv = dVoxdepinv_dVg = dVoxdepinv_dVd = dVoxdepinv_dVb - = dVoxdepinv_dT= dVoxdepinv_dVe = 0.0; - - Vgb = Vgs_eff - Vbs; /* flexilint - moved from below if stmt */ - dVgb_dVg = dVgs_eff_dVg - dVbs_dVg; - dVgb_dVd = - dVbs_dVd; - dVgb_dVe = - dVbs_dVe; - dVgb_dVb = - dVbs_dVb; - dVoxacc_dT = 0.0; - dVfb_dT = 0.0; - /* v3.0: gate-tunneling */ - if ((model->B4SOIigbMod != 0) || (model->B4SOIigcMod != 0)) { - - /* Calculate Vox first */ - Vfb = model->B4SOItype * here->B4SOIvth0 /* v4.0 */ - - phi - pParam->B4SOIk1eff * sqrtPhi; - dVfb_dT = - dphi_dT - pParam->B4SOIk1eff*dsqrtPhi_dT; /* new line Wagner */ - - T3 = Vfb - Vgs_eff + Vbs - DELTA_3; - /* LFW_FD add/fix 5 derivatives */ - dT3_dVg = -dVgs_eff_dVg + dVbs_dVg; - dT3_dVd = dVbs_dVd; - dT3_dVe = dVbs_dVe; - dT3_dVb = dVbs_dVb; - dTL3_dT = dVfb_dT - dVgs_eff_dT + dVbs_dT; - - if (Vfb <= 0.0) { - T0 = sqrt(T3 * T3 - 4.0 * DELTA_3 * Vfb); - dT0_dVg = 1.0/(2.0 * T0) * 2.0*T3 * dT3_dVg; - dT0_dVb = 0.5*(1.0/T0) * 2.0*T3 * dT3_dVb; - /* LFW_FD add 2 derivatives */ - dT0_dVd = T3 * dT3_dVd / T0; - dT0_dVe = T3 * dT3_dVe / T0; - dTL0_dT = (T3 * dTL3_dT - 2.0 * DELTA_3 * dVfb_dT) / T0; /* new line Wagner */ - TL1 = -1.0; /* new line Wagner */ - } - else { - T0 = sqrt(T3 * T3 + 4.0 * DELTA_3 * Vfb); - dT0_dVg = 1.0/(2.0 * T0) * 2.0*T3 * dT3_dVg; - dT0_dVb = 0.5*(1.0/T0) * 2.0*T3 * dT3_dVb; - /* LFW_FD add 2 derivatives */ - dT0_dVd = T3 * dT3_dVd / T0; - dT0_dVe = T3 * dT3_dVe / T0; - dTL0_dT = (T3 * dTL3_dT + 2.0 * DELTA_3 * dVfb_dT) / T0; /* new line Wagner */ - TL1 = 1.0; /* new line Wagner */ - } - - Vfbeff = Vfb - 0.5 * (T3 + T0); - dVfbeff_dVg = -0.5 * (dT3_dVg + dT0_dVg); - dVfbeff_dVb = -0.5 * (dT3_dVb + dT0_dVb); - /* LFW_FD add 2 derivatives */ - dVfbeff_dVd = -0.5 * (dT3_dVd + dT0_dVd); - dVfbeff_dVe = -0.5 * (dT3_dVe + dT0_dVe); - /* 2 new lines - Wagner */ - if (selfheat) dVfbeff_dT = dVfb_dT - 0.5 * (dTL3_dT + dTL0_dT); - else dVfbeff_dT = 0.0; - - Voxacc = Vfb - Vfbeff; - dVoxacc_dVg = -dVfbeff_dVg; - /* LFW_FD add/fix 2 derivatives */ - dVoxacc_dVd = -dVfbeff_dVd; - dVoxacc_dVe = -dVfbeff_dVe; - dVoxacc_dVb = -dVfbeff_dVb; - if (Voxacc < 0.0) - Voxacc = dVoxacc_dVg = dVoxacc_dVb = dVoxacc_dVd = dVoxacc_dVe = 0.0; /* LFW_FD enhance line */ - /* 2 new lines Wagner */ - if (selfheat) dVoxacc_dT = dVfb_dT - dVfbeff_dT; - else dVoxacc_dT = 0.0; - - - T0 = Vgs_eff - Vgsteff - Vfbeff - Vbseff; - /* LFW_FD add/fix 4 derivatives */ - dT0_dVg = dVgs_eff_dVg - dVgsteff_dVg - dVfbeff_dVg - dVbseff_dVg; /* v3.0 */ - dT0_dVd = -dVgsteff_dVd - dVbseff_dVd - dVfbeff_dVd; - dT0_dVb = -dVgsteff_dVb - dVbseff_dVb - dVfbeff_dVb; - dT0_dVe = -dVgsteff_dVe - dVbseff_dVe - dVfbeff_dVe; - - dVoxdepinv_dT = 0.0; /* flexilint */ - - if (selfheat) - /* fix below expression Wagner */ - /*dT0_dT = -dVgsteff_dT - dVbseff_dT; v3.0 */ - dT0_dT = dVgs_eff_dT - dVgsteff_dT - dVfbeff_dT - dVbseff_dT; /* v3.0 */ - - - if (pParam->B4SOIk1ox == 0.0) /* v4.0 */ { - Voxdepinv = dVoxdepinv_dVg = dVoxdepinv_dVd = dVoxdepinv_dVb - = dVoxdepinv_dT = 0.0; - } else { - if (T0 < 0.0) { - T1 = T0/pParam->B4SOIk1ox; - dT1_dVg = dT0_dVg/pParam->B4SOIk1ox; - dT1_dVd = dT0_dVd/pParam->B4SOIk1ox; - dT1_dVb = dT0_dVb/pParam->B4SOIk1ox; - dT1_dVe = dT0_dVe/pParam->B4SOIk1ox; /* v3.0 */ - if (selfheat) dT1_dT = dT0_dT/pParam->B4SOIk1ox; - else dT1_dT = 0.0; /* new line Wagner */ - } - else { - T1 = pParam->B4SOIk1ox/2*(-1 + sqrt(1 + - 4*T0/pParam->B4SOIk1ox/pParam->B4SOIk1ox)); - T2 = pParam->B4SOIk1ox/2 * - 0.5/sqrt(1 + 4*T0/pParam->B4SOIk1ox/pParam->B4SOIk1ox) * - 4/pParam->B4SOIk1ox/pParam->B4SOIk1ox; - dT1_dVg = T2 * dT0_dVg; - dT1_dVd = T2 * dT0_dVd; - dT1_dVb = T2 * dT0_dVb; - dT1_dVe = T2 * dT0_dVe; /* v3.0 */ - if (selfheat) - dT1_dT = T2 * dT0_dT; - else dT1_dT = 0.0; /* new line Wagner */ - } - - Voxdepinv = Vgs_eff - (T1*T1 + Vbs) - Vfb; - /* LFW_FD add/fix 5 derivatives */ - dVoxdepinv_dVg = dVgs_eff_dVg - (2.0*T1*dT1_dVg) - dVbs_dVg; - dVoxdepinv_dVd = -(2.0*T1*dT1_dVd) - dVbs_dVd; - dVoxdepinv_dVb = -(2.0*T1*dT1_dVb) - dVbs_dVb; - dVoxdepinv_dVe = -(2.0*T1*dT1_dVe) - dVbs_dVe; - if (selfheat) - dVoxdepinv_dT = dVgs_eff_dT -(2.0*T1*dT1_dT) - dVbs_dT - dVfb_dT; - else dVoxdepinv_dT = 0.0; - } - } - - - /* gate-channel tunneling component */ - - /* LFW_FD next 6 lines - flexilint inits */ - Igd = dIgd_dVg = dIgd_dVd = 0.0; - Igcd = dIgcd_dVg = dIgcd_dVd = dIgcd_dVb = dIgcd_dVe = 0.0; - Igs = dIgs_dVg = dIgs_dVs = 0.0; - Igcs = dIgcs_dVg = dIgcs_dVd = dIgcs_dVb = dIgcs_dVe = 0.0; - ExpVxNVt = 0.0; - dIgcd_dT = dIgcs_dT = 0.0; - - if (model->B4SOIigcMod) - { T0 = Vtm * pParam->B4SOInigc; - /* 2 new lines Wagner */ - if (selfheat) dT0_dT = pParam->B4SOInigc * dVtm_dT; - else dT0_dT = 0.0; - VxNVt = (Vgs_eff - model->B4SOItype * here->B4SOIvth0) - / T0; /* Vth instead of Vth0 may be used */ - /* 2 new lines Wagner */ - if (selfheat) dVxNVt_dT = (dVgs_eff_dT - VxNVt * dT0_dT) /T0; - else dVxNVt_dT = 0.0; - if (VxNVt > EXPL_THRESHOLD) - { Vaux = Vgs_eff - model->B4SOItype * here->B4SOIvth0; - dVaux_dVg = dVgs_eff_dVg; - dVaux_dVd = 0.0; - dVaux_dVb = 0.0; - /* 3 new lines Wagner */ - if (selfheat) - dVaux_dT = dVgs_eff_dT; - else dVaux_dT = 0.0; - } - else if (VxNVt < -EXPL_THRESHOLD) - { Vaux = T0 * log(1.0 + MIN_EXPL); - dVaux_dVg = dVaux_dVd = dVaux_dVb = 0.0; - /* 3 new lines Wagner */ - if (selfheat) - dVaux_dT = dT0_dT * log(1.0 + MIN_EXPL); - else dVaux_dT = 0.0; - } - else - { ExpVxNVt = exp(VxNVt); - Vaux = T0 * log(1.0 + ExpVxNVt); - dVaux_dVg = ExpVxNVt / (1.0 + ExpVxNVt); - dVaux_dVd = -dVaux_dVg * 0.0; - dVaux_dVb = -dVaux_dVg * 0.0; - dVaux_dVg *= dVgs_eff_dVg; - /* Wagner New fix (moved from below into else block */ - if (selfheat) - dVaux_dT = dT0_dT*log(1.0+ExpVxNVt) + T0*ExpVxNVt*dVxNVt_dT/(1.0+ExpVxNVt); - else dVaux_dT = 0.0; - } - - T2 = Vgs_eff * Vaux; - dT2_dVg = dVgs_eff_dVg * Vaux + Vgs_eff * dVaux_dVg; - dT2_dVd = Vgs_eff * dVaux_dVd; - dT2_dVb = Vgs_eff * dVaux_dVb; - - /* 2 new lines Wagner */ - if (selfheat) dT2_dT = dVgs_eff_dT * Vaux + Vgs_eff * dVaux_dT; - else dT2_dT = 0.0; - - T11 = pParam->B4SOIAechvb; - T12 = pParam->B4SOIBechvb; - T3 = pParam->B4SOIaigc * pParam->B4SOIcigc - - pParam->B4SOIbigc; - T4 = pParam->B4SOIbigc * pParam->B4SOIcigc; - T5 = T12 * (pParam->B4SOIaigc + T3 * Voxdepinv - - T4 * Voxdepinv * Voxdepinv); - - /* LFW_FD fix derivative */ - if (selfheat) dT5_dT = T12 * (T3 - 2 * T4 * Voxdepinv) * dVoxdepinv_dT; - else dT5_dT = 0.0; - - if (T5 > EXPL_THRESHOLD) - { T6 = MAX_EXPL; - dT6_dVg = dT6_dVd = dT6_dVb = dT6_dVe = dT6_dT = 0.0; /* LFW_FD enhance line */ - } - else if (T5 < -EXPL_THRESHOLD) - { T6 = MIN_EXPL; - dT6_dVg = dT6_dVd = dT6_dVb = dT6_dVe = dT6_dT = 0.0; /* LFW_FD enhance line */ - } - else - { T6 = exp(T5); - dT6_dVg = T6 * T12 * (T3 - 2.0 * T4 * Voxdepinv); - dT6_dVd = dT6_dVg * dVoxdepinv_dVd; - dT6_dVe = dT6_dVg * dVoxdepinv_dVe; /* LFW_FD new line */ - dT6_dVb = dT6_dVg * dVoxdepinv_dVb; - dT6_dVg *= dVoxdepinv_dVg; - /* LFW_FD fix - move from below into this else block */ - if (selfheat) dT6_dT = T6 * dT5_dT; - else dT6_dT = 0.0; - } - - - Igc = T11 * T2 * T6; - dIgc_dVg = T11 * (T2 * dT6_dVg + T6 * dT2_dVg); - dIgc_dVd = T11 * (T2 * dT6_dVd + T6 * dT2_dVd); - dIgc_dVe = T11 * (T2 * dT6_dVe); /* LFW_FD new line */ - dIgc_dVb = T11 * (T2 * dT6_dVb + T6 * dT2_dVb); - - /* 3 new lines Wagner */ - if (selfheat) - dIgc_dT = T11 * T2 * dT6_dT + T11 * dT2_dT * T6; - else dIgc_dT = 0.0; - - T7 = -pParam->B4SOIpigcd * Vds; - T8 = T7 * T7 + 2.0e-4; - dT8_dVd = -2.0 * pParam->B4SOIpigcd * T7; - if (T7 > EXPL_THRESHOLD) - { T9 = MAX_EXPL; - dT9_dVd = 0.0; - } - else if (T7 < -EXPL_THRESHOLD) - { T9 = MIN_EXPL; - dT9_dVd = 0.0; - } - else - { T9 = exp(T7); - dT9_dVd = -T9 * pParam->B4SOIpigcd; - } - - T0 = T8 * T8; - T1 = T9 - 1.0 + 1.0e-4; - T10 = (T1 - T7) / T8; - dT10_dVd = ((pParam->B4SOIpigcd + dT9_dVd) * T8 - - (T1 - T7) * dT8_dVd) / T0; - Igcs = Igc * T10; - dIgcs_dVg = dIgc_dVg * T10; - dIgcs_dVd = dIgc_dVd * T10 + Igc * dT10_dVd; - dIgcs_dVb = dIgc_dVb * T10; - dIgcs_dVe = dIgc_dVe * T10; /* LFW_FD new line */ - - /* 3 new lines Wagner */ - if (selfheat) - dIgcs_dT = dIgc_dT * T10; - else dIgcs_dT = 0.0; - - T1 = T9 - 1.0 - 1.0e-4; - T10 = (T7 * T9 - T1) / T8; - dT10_dVd = (-pParam->B4SOIpigcd * T9 + (T7 - 1.0) - * dT9_dVd - T10 * dT8_dVd) / T8; - Igcd = Igc * T10; - dIgcd_dVg = dIgc_dVg * T10; - dIgcd_dVd = dIgc_dVd * T10 + Igc * dT10_dVd; - dIgcd_dVb = dIgc_dVb * T10; - dIgcd_dVe = dIgc_dVe * T10; /* LFW_FD new line */ - - /* 3 new lines Wagner */ - if (selfheat) - dIgcd_dT = dIgc_dT * T10; - else dIgcd_dT = 0.0; - - here->B4SOIIgcs = Igcs; - here->B4SOIgIgcsg = dIgcs_dVg; - here->B4SOIgIgcsd = dIgcs_dVd; - /* fix below expression Wagner */ - /*here->B4SOIgIgcsb = dIgcs_dVb * dVbseff_dVb;*/ - here->B4SOIgIgcsb = dIgcs_dVb; - here->B4SOIgIgcse = dIgcs_dVe; /* LFW_FD new line */ - here->B4SOIIgcd = Igcd; - here->B4SOIgIgcdg = dIgcd_dVg; - here->B4SOIgIgcdd = dIgcd_dVd; - /* fix below expression Wagner */ - /*here->B4SOIgIgcdb = dIgcd_dVb * dVbseff_dVb;*/ - here->B4SOIgIgcdb = dIgcd_dVb; - here->B4SOIgIgcde = dIgcd_dVe; /* LFW_FD new line */ - - - T0 = vgs - pParam->B4SOIvfbsd; - vgs_eff = sqrt(T0 * T0 + 1.0e-4); - dvgs_eff_dvg = T0 / vgs_eff; - - T2 = vgs * vgs_eff; - dT2_dVg = vgs * dvgs_eff_dvg + vgs_eff; - /* T11 = pParam->B4SOIAechvbEdge; */ - T13 = pParam->B4SOIAechvbEdges; - T14 = pParam->B4SOIAechvbEdged; - T12 = pParam->B4SOIBechvbEdge; - T3 = pParam->B4SOIaigsd * pParam->B4SOIcigsd - - pParam->B4SOIbigsd; - T4 = pParam->B4SOIbigsd * pParam->B4SOIcigsd; - T5 = T12 * (pParam->B4SOIaigsd + T3 * vgs_eff - - T4 * vgs_eff * vgs_eff); - if (T5 > EXPL_THRESHOLD) - { T6 = MAX_EXPL; - dT6_dVg = 0.0; - } - else if (T5 < -EXPL_THRESHOLD) - { T6 = MIN_EXPL; - dT6_dVg = 0.0; - } - else - { T6 = exp(T5); - dT6_dVg = T6 * T12 * (T3 - 2.0 * T4 * vgs_eff) - * dvgs_eff_dvg; - } - /* Igs = T11 * T2 * T6; */ - Igs = T13 * T2 * T6; - dIgs_dVg = T13 * (T2 * dT6_dVg + T6 * dT2_dVg); - dIgs_dVs = -dIgs_dVg; - - T0 = vgd - pParam->B4SOIvfbsd; - vgd_eff = sqrt(T0 * T0 + 1.0e-4); - dvgd_eff_dvg = T0 / vgd_eff; - - T2 = vgd * vgd_eff; - dT2_dVg = vgd * dvgd_eff_dvg + vgd_eff; - T5 = T12 * (pParam->B4SOIaigsd + T3 * vgd_eff - - T4 * vgd_eff * vgd_eff); - if (T5 > EXPL_THRESHOLD) - { T6 = MAX_EXPL; - dT6_dVg = 0.0; - } - else if (T5 < -EXPL_THRESHOLD) - { T6 = MIN_EXPL; - dT6_dVg = 0.0; - } - else - { T6 = exp(T5); - dT6_dVg = T6 * T12 * (T3 - 2.0 * T4 * vgd_eff) - * dvgd_eff_dvg; - } - /* Igd = T11 * T2 * T6; */ - Igd = T14 * T2 * T6; - dIgd_dVg = T14 * (T2 * dT6_dVg + T6 * dT2_dVg); - dIgd_dVd = -dIgd_dVg; - - here->B4SOIIgs = Igs; - here->B4SOIgIgsg = dIgs_dVg; - here->B4SOIgIgss = dIgs_dVs; - here->B4SOIIgd = Igd; - here->B4SOIgIgdg = dIgd_dVg; - here->B4SOIgIgdd = dIgd_dVd; - } - else - { here->B4SOIIgcs = here->B4SOIgIgcsg = here->B4SOIgIgcsd - = here->B4SOIgIgcsb = 0.0; - here->B4SOIIgcd = here->B4SOIgIgcdg = here->B4SOIgIgcdd - = here->B4SOIgIgcdb = 0.0; - here->B4SOIIgs = here->B4SOIgIgsg = here->B4SOIgIgss = 0.0; - here->B4SOIIgd = here->B4SOIgIgdg = here->B4SOIgIgdd = 0.0; - } - - here->B4SOIgIgcss = -(here->B4SOIgIgcsg + here->B4SOIgIgcsd - + here->B4SOIgIgcsb + here->B4SOIgIgcse); /* LFW_FD fix line */ - here->B4SOIgIgcds = -(here->B4SOIgIgcdg + here->B4SOIgIgcdd - + here->B4SOIgIgcdb + here->B4SOIgIgcde); /* LFW_FD fix line */ - - - Vfb2 = dVox_dT = 0.0; - /* gate-body tunneling component */ - if ((model->B4SOIigbMod!= 0) && (here->B4SOIsoiMod != 2)) /* v3.2 */ - /* v3.1: the Igb calculation is skipped for the ideal FD mode */ - { - OxideRatio = pParam->B4SOIoxideRatio; - - Vox = Voxdepinv; - /* Voxeff is Vox limited below Voxh */ - T0 = model->B4SOIvoxh; - T1 = T0 - Vox - model->B4SOIdeltavox; - T3 = sqrt(T1 * T1 + 4*model->B4SOIdeltavox * T0); - Voxeff = T0 - 0.5 * (T1 + T3); - dVoxeff_dVox = 0.5 * (1.0 + T1 / T3); - - Vox = Voxeff; - dVox_dVg = dVoxdepinv_dVg * dVoxeff_dVox; - dVox_dVd = dVoxdepinv_dVd * dVoxeff_dVox; - dVox_dVb = dVoxdepinv_dVb * dVoxeff_dVox; - dVox_dVe = dVoxdepinv_dVe * dVoxeff_dVox; /* v3.0 */ - if (selfheat) /* v4.2 Bug # 23 Jul09 */ - dVox_dT = dVoxdepinv_dT * dVoxeff_dVox; - - - T0 = (Vox - model->B4SOIebg)/model->B4SOIvevb; - if (selfheat) - dT0_dT = dVox_dT /model->B4SOIvevb; - - DEXP(T0, T1, T2); /* T1=exp(T0), T2=dT1_dT0 */ - if (selfheat) - dT1_dT = T2 * dT0_dT; - - Vaux = model->B4SOIvevb * log(1 + T1); - dVaux_dVg = T2 / (1 + T1) * dVox_dVg; - dVaux_dVd = T2 / (1 + T1) * dVox_dVd; - dVaux_dVb = T2 / (1 + T1) * dVox_dVb; - dVaux_dVe = T2 / (1 + T1) * dVox_dVe; /* v3.0 */ - if (selfheat) - dVaux_dT = T2 / (1 + T1) * dVox_dT; /* LFW_FD fix line */ - else - dVaux_dT = 0.0; - - if (model->B4SOIvgb1 != 0) { - T0 = 1 - Vox / model->B4SOIvgb1; - dT0_dVox = -1.0/model->B4SOIvgb1; - if (selfheat) - dT0_dT = -dVox_dT / model->B4SOIvgb1; - } else { - T0 = 1; - dT0_dVox = dT0_dT = 0.0; - } - - if (T0 < 0.01) { - T0 = 0.01; - dT0_dVox = dT0_dT = 0.0; - } - - /* v2.2.3 bug fix */ - /* T1 = (Leff * Weff / here->B4SOInseg + here->B4SOIagbcpd/here->B4SOInf) * 3.7622e-7 * OxideRatio; - - T2 = -3.1051e10 * model->B4SOItoxqm; */ - T1 = (Leff * Weff / here->B4SOInseg + here->B4SOIagbcpd/here->B4SOInf) * agb1 * OxideRatio; /* bugfix v4.3.1 -Tanvir */ - - T2 = bgb1 * model->B4SOItoxqm; /* bugfix v4.3.1 -Tanvir */ - T3 = pParam->B4SOIalphaGB1; - T4 = pParam->B4SOIbetaGB1; - - T6 = T2*(T3 - T4 * Vox) / T0; - if (selfheat) dT6_dT = -T2 * T4 * dVox_dT / T0 - T6/T0 * dT0_dT; - else dT6_dT = 0.0; /* flexilint */ - - DEXP(T6, T5, T7); /* T5=exp(T6), T7=dT5_dT6 */ - dT5_dVg = -T7 * dVox_dVg * T2 / T0 * (T4 + (T3 - T4 * Vox) / T0 * dT0_dVox); - dT5_dVd = -T7 * dVox_dVd * T2 / T0 * (T4 + (T3 - T4 * Vox) / T0 * dT0_dVox); - dT5_dVb = -T7 * dVox_dVb * T2 / T0 * (T4 + (T3 - T4 * Vox) / T0 * dT0_dVox); - dT5_dVe = -T7 * dVox_dVe * T2 / T0 * (T4 + (T3 - T4 * Vox) / T0 * dT0_dVox); /* v3.0 */ - if (selfheat) - dT5_dT = T7 * dT6_dT; - else - dT5_dT = 0.0; /* flexilint */ - - Igb1 = T1 * Vgb * Vaux * T5; - /* LFW_FD fix 5 derivatives */ - dIgb1_dVg = T1 * (Vgb*Vaux*dT5_dVg + dVgb_dVg*Vaux*T5 + - Vgb*T5*dVaux_dVg) - + Vgb * Vaux * T5 * Leff * dWeff_dVg * agb1 * OxideRatio / here->B4SOInseg; - dIgb1_dVd = T1 * (Vgb*Vaux*dT5_dVd + Vgb*T5*dVaux_dVd + dVgb_dVd*Vaux*T5); - dIgb1_dVb = T1 * (Vgb*Vaux*dT5_dVb + dVgb_dVb*Vaux*T5 + - Vgb*T5*dVaux_dVb) - + Vgb * Vaux * T5 * Leff * dWeff_dVb * agb1 * OxideRatio / here->B4SOInseg; - dIgb1_dVe = T1 * (Vgb*Vaux*dT5_dVe + Vgb*T5*dVaux_dVe + dVgb_dVe*Vaux*T5); - if (selfheat) - dIgb1_dT = T1 * Vgb * (Vaux*dT5_dT + T5*dVaux_dT) - + Vgb * Vaux * T5 * Leff * dWeff_dT * agb1 * OxideRatio / here->B4SOInseg - + T1 * dVgs_eff_dT * Vaux * T5; - else dIgb1_dT = 0.0; - - - Vox = Voxacc; - /* Voxeff is Vox limited below Voxh */ - T0 = model->B4SOIvoxh; - T1 = T0 - Vox - model->B4SOIdeltavox; - T3 = sqrt(T1 * T1 + 4*model->B4SOIdeltavox * T0); - Voxeff = T0 - 0.5 * (T1 + T3); - dVoxeff_dVox = 0.5 * (1.0 + T1 / T3); - - Vox = Voxeff; - dVox_dVg = dVoxacc_dVg * dVoxeff_dVox; - dVox_dVd = dVoxacc_dVd * dVoxeff_dVox; - dVox_dVe = dVoxacc_dVe * dVoxeff_dVox; /* LFW_FD new line */ - dVox_dVb = dVoxacc_dVb * dVoxeff_dVox; - /* fix below expression Wagner */ - /*dVox_dT = 0;*/ - dVox_dT = dVoxeff_dVox * dVoxacc_dT; - - T0 = (-Vgb+(Vfb))/model->B4SOIvecb; - /* fix below expression Wagner */ - /*if (selfheat) - dT0_dT = 0;*/ - if (selfheat) - dT0_dT = dVfb_dT/model->B4SOIvecb; - else dT0_dT = 0; - - DEXP(T0, T1, T2); /* T1=exp(T0), T2=dT1_dT0 */ - /* fix below expression - Wagner */ - /*if (selfheat) - dT1_dT = 0;*/ - if (selfheat) - dT1_dT = T2 * dT0_dT; - else dT1_dT = 0; - - Vaux = model->B4SOIvecb* log(1 + T1); - /* LFW_FD fix/add 4 derivatives */ - dVaux_dVg = - T2 / (1 + T1) * dVgb_dVg; - dVaux_dVd = - T2 / (1 + T1) * dVgb_dVd; - dVaux_dVe = - T2 / (1 + T1) * dVgb_dVe; - dVaux_dVb = - T2 / (1 + T1) * dVgb_dVb; - /* fix below expression - Wagner */ - /*if (selfheat) - dVaux_dT = 0;*/ - if (selfheat) - dVaux_dT = model->B4SOIvecb * dT1_dT / (1 + T1); - else - dVaux_dT = 0.0; - - if (model->B4SOIvgb2 != 0) { - T0 = 1 - Vox / model->B4SOIvgb2; - dT0_dVox = -1.0/model->B4SOIvgb2; - if (selfheat) dT0_dT = -dVox_dT / model->B4SOIvgb2; - } else { - T0 = 1; - dT0_dVox = dT0_dT =0.0; - } - - if (T0 < 0.01) { - T0 = 0.01; - dT0_dVox = dT0_dT =0.0; - } - - /* v2.2.3 bug fix */ - /* T1 = (Leff * Weff / here->B4SOInseg + here->B4SOIagbcpd/here->B4SOInf) * 4.9758e-7 * OxideRatio; - - T2 = -2.357e10 * model->B4SOItoxqm; */ - T1 = (Leff * Weff / here->B4SOInseg + here->B4SOIagbcpd/here->B4SOInf) * agb2 * OxideRatio; /* bugfix v4.3.1 -Tanvir */ - - T2 = bgb2 * model->B4SOItoxqm; /* bugfix v4.3.1 -Tanvir */ - T3 = pParam->B4SOIalphaGB2; - T4 = pParam->B4SOIbetaGB2; - - T6 = T2*(T3 - T4 * Vox) / T0; - if (selfheat) dT6_dT = -T2 * T4 * dVox_dT / T0 - T6/T0 * dT0_dT; - else dT6_dT = 0.0; /* flexilint */ - - DEXP(T6, T5, T7); /* T5=exp(T6), T7=dT5_dT6 */ - dT5_dVg = -T7 * dVox_dVg * T2 / T0 * (T4 + (T3 - T4 * Vox) / T0 * dT0_dVox); - dT5_dVd = -T7 * dVox_dVd * T2 / T0 * (T4 + (T3 - T4 * Vox) / T0 * dT0_dVox); - dT5_dVb = -T7 * dVox_dVb * T2 / T0 * (T4 + (T3 - T4 * Vox) / T0 * dT0_dVox); - dT5_dVe = -T7 * dVox_dVe * T2 / T0 * (T4 + (T3 - T4 * Vox) / T0 * dT0_dVox); /* LFW_FD new line */ - if (selfheat) - dT5_dT = T7 * dT6_dT; - else - dT5_dT = 0.0; /* flexilint */ - - Igb2 = T1 * Vgb * Vaux * T5; - /* LFW_FD fix 5 derivatives */ - dIgb2_dVg = T1 * (Vgb*Vaux*dT5_dVg + dVgb_dVg*Vaux*T5 + Vgb*T5*dVaux_dVg) - + Vgb * Vaux * T5 * Leff * dWeff_dVg *agb2 * OxideRatio / here->B4SOInseg; - dIgb2_dVd = T1 * (Vgb*Vaux*dT5_dVd + dVgb_dVd*Vaux*T5 + Vgb*T5*dVaux_dVd); - dIgb2_dVb = T1 * (Vgb*Vaux*dT5_dVb + dVgb_dVb*Vaux*T5 + Vgb*T5*dVaux_dVb) - + Vgb * Vaux * T5 * Leff * dWeff_dVb * agb2 * OxideRatio / here->B4SOInseg; - dIgb2_dVe = T1 * (Vgb*Vaux*dT5_dVe + dVgb_dVe*Vaux*T5 + Vgb*T5*dVaux_dVe); - if (selfheat) - dIgb2_dT = T1 * Vgb * (Vaux*dT5_dT + T5*dVaux_dT) - + Vgb * Vaux * T5 * Leff * dWeff_dT * agb2 * OxideRatio / here->B4SOInseg - + T1 * dVgs_eff_dT * Vaux * T5; - else dIgb2_dT = 0.0; - - - /* Igb1 dominates in inversion region, while Igb2 dominates in accumulation */ - /* v2.2.3 bug fix for residue at low Vgb */ - if (Vgb >= 0) - { - Igb = Igb1; - dIgb_dVg = dIgb1_dVg; - dIgb_dVd = dIgb1_dVd; - dIgb_dVb = dIgb1_dVb; - dIgb_dVe = dIgb1_dVe; /* v3.0 */ - dIgb_dT = dIgb1_dT; - } - else - { - Igb = Igb2; - dIgb_dVg = dIgb2_dVg; - dIgb_dVd = dIgb2_dVd; - dIgb_dVb = dIgb2_dVb; - dIgb_dVe = dIgb2_dVe; /* LFW_FD fix line */ - dIgb_dT = dIgb2_dT; - } - /*Vfb2 = Vfb + 1.12; Bug fix #18 Jul09*/ - Vfb2 = Vfb + eggbcp2; /* bugfix 4.3.1 -Tanvir */ - } - else { - Igb = 0.0; - dIgb_dVg = 0.0; - dIgb_dVd = 0.0; - dIgb_dVb = 0.0; - dIgb_dVe = 0.0; /* v3.0 */ - dIgb_dT = 0.0; - } - here->B4SOIig = Igb; - here->B4SOIgigg = dIgb_dVg; - here->B4SOIgigd = dIgb_dVd; - here->B4SOIgigb = dIgb_dVb; - here->B4SOIgige = dIgb_dVe; /* v3.0 */ - here->B4SOIgigs = -(dIgb_dVg + dIgb_dVd + dIgb_dVb + dIgb_dVe); /* v3.0 */ - here->B4SOIgigT = dIgb_dT; - - /* v4.1 */ - /* gate tunneling component in the AGBCP2 region */ - /* Vfb2 = Vfb + 1.12; Bug fix #18 Jul09 Code moved to 4370 where Vfb definition is valid*/ - - if ((model->B4SOIigbMod!= 0) && (here->B4SOIsoiMod != 2) && - (here->B4SOIbodyMod != 0) && (here->B4SOIagbcp2 > 0) && - (vgp < Vfb2)) - /* v4.1: the Igb2_agbcp2 calculation is skipped for the ideal FD mode or if there is no "p" node */ - { - /* Vfb, Vfb2 are taken as constants in derivative calculation for simplicity */ - T0 = vgp - Vfb2; - - T1 = sqrt(T0 * T0 + 1.0e-4); - vgp_eff = 0.5 * (-T0 + T1 - 1.0e-2); - dvgp_eff_dvg = 0.5 * (-1.0 + T0 / T1); - dvgp_eff_dvp = -dvgp_eff_dvg; - dvgp_eff_dT = 0.5 * (1.0 - T0 / T1) * dVfb_dT; /* LFW_FD new line */ - - /* T11=A* T12=B* */ - /*T11 = (model->B4SOItype == NMOS) ? 3.42537e-7 : 4.97232e-7; - T12 = (model->B4SOItype == NMOS) ? 1.16645e12 : 7.45669e11; */ - - T11 = (model->B4SOItype == NMOS) ? agbc2n : agbc2p; /* bugfix 4.3.1 -Tanvir */ - T12 = (model->B4SOItype == NMOS) ? bgbc2n : bgbc2p; /* bugfix 4.3.1 -Tanvir */ - - T2 = vgp * vgp_eff; - dT2_dVg = vgp * dvgp_eff_dvg + vgp_eff; - dT2_dVp = vgp * dvgp_eff_dvp - vgp_eff; - dT2_dT = vgp * dvgp_eff_dT; /* LFW_FD new line */ - - T3 = pParam->B4SOIaigbcp2 * pParam->B4SOIcigbcp2 - - pParam->B4SOIbigbcp2; - T4 = pParam->B4SOIbigbcp2 * pParam->B4SOIcigbcp2; - T5 = (-T12) * model->B4SOItoxqm * (pParam->B4SOIaigbcp2 - + T3 * vgp_eff - T4 * vgp_eff * vgp_eff); - if (T5 > EXPL_THRESHOLD) - { - T6 = MAX_EXPL; - dT6_dVg = 0.0; - dT6_dVp = 0.0; - dT6_dT = 0.0; /* LFW_FD new line */ - } - else if (T5 < -EXPL_THRESHOLD) - { - T6 = MIN_EXPL; - dT6_dVg = 0.0; - dT6_dVp = 0.0; - dT6_dT = 0.0; /* LFW_FD new line */ - } - else - { - T6 = exp(T5); - T7 = T6 * (-T12) * model->B4SOItoxqm * - (T3 - 2.0 * T4 * vgp_eff); - dT6_dVg = T7 * dvgp_eff_dvg; - dT6_dVp = T7 * dvgp_eff_dvg; - dT6_dT = T7 * dvgp_eff_dT; /* LFW_FD new line */ - } - T11 = T11 * here->B4SOIagbcp2 * pParam->B4SOIoxideRatio; - Ig_agbcp2 = T11 * T2 * T6; - dIg_agbcp2_dVg = T11 * (T2 * dT6_dVg + T6 * dT2_dVg); - dIg_agbcp2_dVp = -dIg_agbcp2_dVg; - dIg_agbcp2_dT = T11 * (T2 * dT6_dT + T6 * dT2_dT); /* LFW_FD new line */ - } - else { - Ig_agbcp2 = 0.0; - dIg_agbcp2_dVg = 0.0; - dIg_agbcp2_dVp = 0.0; - dIg_agbcp2_dT = 0.0; /* LFW_FD new line */ - } - here->B4SOIigp = Ig_agbcp2; - here->B4SOIgigpg = dIg_agbcp2_dVg; - here->B4SOIgigpp = dIg_agbcp2_dVp; - - /* end of gate-body tunneling */ - /* end of v3.0 gate-tunneling */ - - /* v3.1 */ - if (here->B4SOIsoiMod != 2) /* v3.2 */ - { - Idsmosfet = 0.0; - Ratio = dRatio_dVg = dRatio_dVd = dRatio_dVb = dRatio_dVe = dRatio_dT = 0.0; - if (model->B4SOIiiiMod == 0 ) - { - /* calculate substrate current Iii */ - if (pParam->B4SOIalpha0 <= 0.0) { - Giig = Giib = Giid = GiiT = 0.0; - Giie = 0; /* v3.0 */ - here->B4SOIiii = Iii = Idsmosfet = dIiibjt_dVb = dIiibjt_dVd = dIiibjt_dT = 0.0; - } - else { - Vdsatii0 = pParam->B4SOIvdsatii0 * (1 + model->B4SOItii * (TempRatio-1.0)) - - pParam->B4SOIlii / Leff; - if (selfheat) - dVdsatii0_dT = pParam->B4SOIvdsatii0 * model->B4SOItii * dTempRatio_dT; - else - dVdsatii0_dT = 0; - - /* Calculate VgsStep */ - T0 = pParam->B4SOIesatii * Leff; /* v3.0 bug fix: T0 is dimentionless (i.e., scaled by 1V) */ - T1 = pParam->B4SOIsii0 * T0 / (1.0 + T0); - - T0 = 1 / (1 + pParam->B4SOIsii1 * Vgsteff); - if (selfheat) - dT0_dT = - pParam->B4SOIsii1 * T0 * T0 *dVgsteff_dT; - else - dT0_dT = 0; - T3 = T0 + pParam->B4SOIsii2; - T4 = Vgst * pParam->B4SOIsii1 * T0 * T0; - T2 = Vgst * T3; - dT2_dVg = T3 * (dVgst_dVg - dVth_dVb * dVbseff_dVg) - T4 * dVgsteff_dVg; /* v3.0 */ - dT2_dVb = T3 * dVgst_dVb * dVbseff_dVb - T4 * dVgsteff_dVb; - dT2_dVe = T3 * dVgst_dVb * dVbseff_dVe - T4 * dVgsteff_dVe; /* v3.0 */ - dT2_dVd = T3 * (dVgst_dVd - dVth_dVb * dVbseff_dVd) - T4 * dVgsteff_dVd; /* v3.0 */ - if (selfheat) - /* fix below expression Wagner */ - /*dT2_dT = -(dVth_dT + dVth_dVb * dVbseff_dT) * T3 + Vgst * dT0_dT; v3.0 */ - dT2_dT = (dVgst_dT ) * T3 + Vgst * dT0_dT; /* v3.0 */ - else dT2_dT = 0; - - - T3 = 1 / (1 + pParam->B4SOIsiid * Vds); - dT3_dVd = - pParam->B4SOIsiid * T3 * T3; - - VgsStep = T1 * T2 * T3; - if (selfheat) - dVgsStep_dT = T1 * T3 * dT2_dT; - else dVgsStep_dT = 0; - Vdsatii = Vdsatii0 + VgsStep; - Vdiff = Vds - Vdsatii; - dVdiff_dVg = - T1 * T3 * dT2_dVg; - dVdiff_dVb = - T1 * T3 * dT2_dVb; - dVdiff_dVe = - T1 * T3 * dT2_dVe; /* v3.0 */ - dVdiff_dVd = 1.0 - T1 * (T3 * dT2_dVd + T2 * dT3_dVd); - if (selfheat) - dVdiff_dT = -(dVdsatii0_dT + dVgsStep_dT); - else dVdiff_dT = 0; - - T0 = pParam->B4SOIbeta2 + pParam->B4SOIbeta1 * Vdiff - + pParam->B4SOIbeta0 * Vdiff * Vdiff; - if (T0 < 1e-5) - { - T0 = 1e-5; - dT0_dVg = dT0_dVd = dT0_dVb = dT0_dT = 0.0; - dT0_dVe = 0; /* v3.0 */ - } - else - { - T1 = pParam->B4SOIbeta1 + 2 * pParam->B4SOIbeta0 * Vdiff; - dT0_dVg = T1 * dVdiff_dVg; - dT0_dVb = T1 * dVdiff_dVb; - dT0_dVd = T1 * dVdiff_dVd; - dT0_dVe = T1 * dVdiff_dVe; /* v3.0 */ - if (selfheat) - dT0_dT = T1 * dVdiff_dT; - else - dT0_dT = 0; - } - - if ((T0 < Vdiff / EXPL_THRESHOLD) && (Vdiff > 0.0)) { - Ratio = pParam->B4SOIalpha0 * MAX_EXPL; - dRatio_dVg = dRatio_dVb = dRatio_dVd = dRatio_dT = 0.0; - dRatio_dVe = 0; /* v3.0 */ - } - else if ((T0 < -Vdiff / EXPL_THRESHOLD) && (Vdiff < 0.0)) { - Ratio = pParam->B4SOIalpha0 * MIN_EXPL; - dRatio_dVg = dRatio_dVb = dRatio_dVd = dRatio_dT = 0.0; - dRatio_dVe = 0; /* v3.0 */ - } - else { - Ratio = pParam->B4SOIalpha0 * exp(Vdiff / T0); - T1 = Ratio / T0 / T0; - dRatio_dVg = T1 * (T0 * dVdiff_dVg - Vdiff * dT0_dVg); - dRatio_dVb = T1 * (T0 * dVdiff_dVb - Vdiff * dT0_dVb); - dRatio_dVd = T1 * (T0 * dVdiff_dVd - Vdiff * dT0_dVd); - /* v3.0 */ - dRatio_dVe = T1 * (T0 * dVdiff_dVe - Vdiff * dT0_dVe); - - if (selfheat) - dRatio_dT = T1 * (T0 * dVdiff_dT - Vdiff * dT0_dT); - else - dRatio_dT = 0; - } - - /* Avoid too high ratio */ - if (Ratio > 10.0) { - Ratio = 10.0; - dRatio_dVg = dRatio_dVb = dRatio_dVd = dRatio_dT = 0.0; - dRatio_dVe = 0; /* v3.0 */ - } - - T0 = Ids + pParam->B4SOIfbjtii * Ic; - here->B4SOIiii = Iii = Ratio * T0; - Giig = Ratio * Gm + T0 * dRatio_dVg; - Giib = Ratio * (Gmb + pParam->B4SOIfbjtii * Gcb) - + T0 * dRatio_dVb; - Giid = Ratio * (Gds + pParam->B4SOIfbjtii * Gcd) - + T0 * dRatio_dVd; - /* v3.0 */ - Giie = Ratio * Gme + T0 * dRatio_dVe; - - if (selfheat) - GiiT = Ratio * (GmT + pParam->B4SOIfbjtii * GcT) - + T0 * dRatio_dT; - else - GiiT = 0.0; - - } - } - else /*new Iii model*/ - { - /*Idsmosfet part*/ - if (pParam->B4SOIalpha0 <= 0.0) { - /* Giig = Giib = Giid = GiiT = 0.0; */ - Giie = 0; /* v3.0 */ - /* here->B4SOIiii = Iii = 0.0; v4.2 bugfix #38 */ - /* Idsmosfet = 0.0; v4.2 bugfix #38 */ - /*dIiibjt_dVb = 0.0; v4.2 bugfix #38 */ - /*dIiibjt_dVd = 0.0; */ - /*dIiibjt_dT = 0.0; */ - Ratio = 0; /* v4.2 bugfix # 38 */ - } - else { - Vdsatii0 = pParam->B4SOIvdsatii0 * (1 + model->B4SOItii * (TempRatio-1.0)) - - pParam->B4SOIlii / Leff; - if (selfheat) - dVdsatii0_dT = pParam->B4SOIvdsatii0 * model->B4SOItii * dTempRatio_dT; - else - dVdsatii0_dT = 0; - - /* Calculate VgsStep */ - T0 = pParam->B4SOIesatii * Leff; /* v3.0 bug fix: T0 is dimensionless (i.e., scaled by 1V) */ - T1 = pParam->B4SOIsii0 * T0 / (1.0 + T0); - - T0 = 1 / (1 + pParam->B4SOIsii1 * Vgsteff); - if (selfheat) - dT0_dT = - pParam->B4SOIsii1 * T0 * T0 *dVgsteff_dT; - else - dT0_dT = 0; - T3 = T0 + pParam->B4SOIsii2; - T4 = Vgst * pParam->B4SOIsii1 * T0 * T0; - T2 = Vgst * T3; - dT2_dVg = T3 * (dVgst_dVg - dVth_dVb * dVbseff_dVg) - T4 * dVgsteff_dVg; /* v3.0 */ - dT2_dVb = T3 * dVgst_dVb * dVbseff_dVb - T4 * dVgsteff_dVb; - dT2_dVe = T3 * dVgst_dVb * dVbseff_dVe - T4 * dVgsteff_dVe; /* v3.0 */ - dT2_dVd = T3 * (dVgst_dVd - dVth_dVb * dVbseff_dVd) - T4 * dVgsteff_dVd; /* v3.0 */ - if (selfheat) - /* fix below expression Wagner */ - /*dT2_dT = -(dVth_dT + dVth_dVb * dVbseff_dT) * T3 + Vgst * dT0_dT; v3.0 */ - dT2_dT = (dVgst_dT ) * T3 + Vgst * dT0_dT; /* v3.0 */ - else dT2_dT = 0; - - - T3 = 1 / (1 + pParam->B4SOIsiid * Vds); - dT3_dVd = - pParam->B4SOIsiid * T3 * T3; - - VgsStep = T1 * T2 * T3; - if (selfheat) - dVgsStep_dT = T1 * T3 * dT2_dT; - else dVgsStep_dT = 0; - Vdsatii = Vdsatii0 + VgsStep; - Vdiff = Vds - Vdsatii; - dVdiff_dVg = - T1 * T3 * dT2_dVg; - dVdiff_dVb = - T1 * T3 * dT2_dVb; - dVdiff_dVe = - T1 * T3 * dT2_dVe; /* v3.0 */ - dVdiff_dVd = 1.0 - T1 * (T3 * dT2_dVd + T2 * dT3_dVd); - if (selfheat) - dVdiff_dT = -(dVdsatii0_dT + dVgsStep_dT); - else dVdiff_dT = 0; - - T0 = pParam->B4SOIbeta2 + pParam->B4SOIbeta1 * Vdiff - + pParam->B4SOIbeta0 * Vdiff * Vdiff; - if (T0 < 1e-5) - { - T0 = 1e-5; - dT0_dVg = dT0_dVd = dT0_dVb = dT0_dT = 0.0; - dT0_dVe = 0; /* v3.0 */ - } - else - { - T1 = pParam->B4SOIbeta1 + 2 * pParam->B4SOIbeta0 * Vdiff; - dT0_dVg = T1 * dVdiff_dVg; - dT0_dVb = T1 * dVdiff_dVb; - dT0_dVd = T1 * dVdiff_dVd; - dT0_dVe = T1 * dVdiff_dVe; /* v3.0 */ - if (selfheat) - dT0_dT = T1 * dVdiff_dT; - else - dT0_dT = 0; - } - - if ((T0 < Vdiff / EXPL_THRESHOLD) && (Vdiff > 0.0)) { - Ratio = pParam->B4SOIalpha0 * MAX_EXPL; - dRatio_dVg = dRatio_dVb = dRatio_dVd = dRatio_dT = 0.0; - dRatio_dVe = 0; /* v3.0 */ - } - else if ((T0 < -Vdiff / EXPL_THRESHOLD) && (Vdiff < 0.0)) { - Ratio = pParam->B4SOIalpha0 * MIN_EXPL; - dRatio_dVg = dRatio_dVb = dRatio_dVd = dRatio_dT = 0.0; - dRatio_dVe = 0; /* v3.0 */ - } - else { - Ratio = pParam->B4SOIalpha0 * exp(Vdiff / T0); - T1 = Ratio / T0 / T0; - dRatio_dVg = T1 * (T0 * dVdiff_dVg - Vdiff * dT0_dVg); - dRatio_dVb = T1 * (T0 * dVdiff_dVb - Vdiff * dT0_dVb); - dRatio_dVd = T1 * (T0 * dVdiff_dVd - Vdiff * dT0_dVd); - /* v3.0 */ - dRatio_dVe = T1 * (T0 * dVdiff_dVe - Vdiff * dT0_dVe); - - if (selfheat) - dRatio_dT = T1 * (T0 * dVdiff_dT - Vdiff * dT0_dT); - else - dRatio_dT = 0; - } - - /* Avoid too high ratio */ - if (Ratio > 10.0) { - Ratio = 10.0; - dRatio_dVg = dRatio_dVb = dRatio_dVd = dRatio_dT = 0.0; - dRatio_dVe = 0; /* v3.0 */ - } - - T0 = Ids; - Idsmosfet = Ratio * T0; - } - /*New BJT part*/ - - T0 = (pParam->B4SOIcbjtii + pParam->B4SOIebjtii * Leff)/Leff; - - Vbci= pParam->B4SOIvbci*(1.0+model->B4SOItvbci*(TempRatio-1.0)); - /*T1 = Vbci - (Vbs - Vds); v4.3 bugfix*/ - T1 = Vbci - (vbs_jct - Vds); - - T2 = pParam->B4SOImbjtii -1.0; - - /* - if(T1 == 0.0) - T3 =1.0; - else - T3 = -pParam->B4SOIabjtii * pow(T1,T2); - */ - - if(T1<=0.0) - T3 = 0.0; - else - T3 = -pParam->B4SOIabjtii * pow(T1,T2); - - - - - - if (T3> EXPL_THRESHOLD) - T4 = MAX_EXPL; - else if (T3 < -EXPL_THRESHOLD) - T4 = MIN_EXPL; - else - T4 = exp(T3); - - - if (T1==0.0) - {if(T3> EXPL_THRESHOLD) - { - dT4_dVd = 0.0; - dT4_dVb = 0.0; - } - else if (T3 < -EXPL_THRESHOLD) - { - dT4_dVd = 0.0; - dT4_dVb = 0.0; - } - else - { - dT4_dVd = - T4 * pParam->B4SOIabjtii* T2 ; - dT4_dVb = T4 * pParam->B4SOIabjtii* T2 ; - } - } - else - { - if(T3> EXPL_THRESHOLD) - { - dT4_dVd = 0.0; - dT4_dVb = 0.0; - } - else if (T3 < -EXPL_THRESHOLD) - { - dT4_dVd = 0.0; - dT4_dVb = 0.0; - } - else - {T5 = T2-1.0; - if (T1<=0.0) - { dT4_dVd = 0.0; - dT4_dVb = 0.0; - } - else - { - dT4_dVd = - T4 * pParam->B4SOIabjtii* T2 * pow(T1,T5); - dT4_dVb = T4 * pParam->B4SOIabjtii* T2 * pow(T1,T5); - } - } - - } - - Iiibjt = T0 * Ic * T1 * T4; - - if (selfheat) - {T5= T2-1.0; - dVbci_dT = pParam->B4SOIvbci * model->B4SOItvbci *model->B4SOItnom; - if(T1<=0.0) - dT4_dT = 0.0; - else - dT4_dT = -T4 * pParam->B4SOIabjtii* T2 * pow(T1,T5)*dVbci_dT; - - dIiibjt_dT = T0 * Ic * T4 * dVbci_dT - + T0 *Ic *T1 * dT4_dT + T0 * GcT *T1 * T4; /* Samuel Mertens */ - - } - else - { - dVbci_dT = 0.0; - dT4_dT =0.0; - dIiibjt_dT = 0.0; - } - - /* Xue fix 10/29/2009 */ - dIiibjt_dVd = T0 * Ic *T4 - + T0 *Ic *T1*dT4_dVd + T0 * dIc_dVd * T1 * T4; - dIiibjt_dVb = -T0 * Ic *T4 + T0*Ic*T1*dT4_dVb + T0 * dIc_dVb * T1 * T4; - - - - - /*Total Iii*/ - T0 = Ids; - here->B4SOIiii = Iii = Idsmosfet + Iiibjt; - - - Giig = Ratio * Gm + T0 * dRatio_dVg; - Giib = Ratio * Gmb + T0 * dRatio_dVb + dIiibjt_dVb; - Giid = Ratio * Gds + T0 * dRatio_dVd + dIiibjt_dVd; - Giie = Ratio * Gme + T0 * dRatio_dVe; - - if (selfheat) - GiiT = Ratio * GmT + T0 * dRatio_dT - + dIiibjt_dT ; - else - GiiT = 0.0; - - } - - /* Current through body resistor */ - /* Current going out is +ve */ - if ((here->B4SOIbodyMod == 0) || (here->B4SOIbodyMod == 2)) - { - Ibp = Gbpbs = Gbpps = 0.0; - } - else { /* here->B4SOIbodyMod == 1 */ - if (pParam->B4SOIrbody < 1e-3) /* 3.2 bug fix */ - { - if (here->B4SOIrbodyext <= 1e-3) /* 3.2 bug fix */ - T0 = 1.0 / 1e-3; /* 3.2 bug fix */ - else - T0 = 1.0 / here->B4SOIrbodyext; - Ibp = Vbp * T0; - Gbpbs = T0 * dVbp_dVb; - Gbpps = -T0 * dVbp_dVb; - } else - { - Gbpbs = 1.0 / (pParam->B4SOIrbody + here->B4SOIrbodyext); - Ibp = Vbp * Gbpbs; - Gbpps = - Gbpbs; - } - } - - here->B4SOIibp = Ibp; - here->B4SOIgbpbs = Gbpbs; - here->B4SOIgbpps = Gbpps; - here->B4SOIgbpT = 0.0; - here->B4SOIcbodcon = (Ibp - (Gbpbs * Vbs + Gbpps * Vps)); - - } - - else /* v3.1 soiMod=2: ideal FD */ - { - Giig = Giib = Giid = Giie = GiiT = 0.0; - here->B4SOIiii = Iii = 0.0; - - here->B4SOIibp = Ibp = 0.0; - here->B4SOIgbpbs = 0.0; - here->B4SOIgbpps = here->B4SOIgbpT = here->B4SOIcbodcon = 0.0; - Gbpbs = Gbpps = 0.0; - } - /* v3.1 */ - - - - /* Current going out of drainprime node into the drain of device */ - /* "node" means the SPICE circuit node */ - - here->B4SOIcdrain = Ids + Ic; - here->B4SOIcd = Ids + Ic - Ibd + Iii + Igidl; - here->B4SOIcb = Ibs + Ibd + Ibp / here->B4SOInf - Iii - Igidl - Igisl - Igb; /* v4.2 bug fix # 27*/ - here->B4SOIgds = Gds + Gcd; - here->B4SOIgm = Gm; - here->B4SOIgmbs = Gmb + Gcb; - /* v3.0 */ - here->B4SOIgme = Gme; - - - /* v3.1 for RF */ - /* Calculate Rg */ - if (here->B4SOIrgateMod >1) - { T9 = pParam->B4SOIxrcrg2 * model->B4SOIvtm; - T0 = T9 *beta; - dT0_dVd = (dbeta_dVd + dbeta_dVg * dVgsteff_dVd) * T9; - dT0_dVb = (dbeta_dVb + dbeta_dVg * dVgsteff_dVb) * T9; - dT0_dVg = dbeta_dVg * T9; - T1 = 1 + gche * Rds; - T2 = 1 / T1; - - here->B4SOIgcrg = pParam->B4SOIxrcrg1 - * (T0 + here->B4SOIidovVds); - dIdlovVdseff_dVg = (T2 * dgche_dVg - - IdlovVdseff * gche * dRds_dVg) / T1; - dIdlovVdseff_dVd = T2 * dgche_dVd / T1; - dIdlovVdseff_dVb = (T2 * dgche_dVb - - IdlovVdseff * gche * dRds_dVb) / T1; - - T9 = diffVds / Va; - T3 = 1.0 + T9; - - T4 = T3 * dIdlovVdseff_dVg - - IdlovVdseff * (dVdseff_dVg + T9 * dVa_dVg) / Va; - T5 = T3 * dIdlovVdseff_dVd + IdlovVdseff - * (1.0 - dVdseff_dVd - T9 * dVa_dVd) / Va; - T6 = T3 * dIdlovVdseff_dVb - - IdlovVdseff * (dVdseff_dVb + T9 * dVa_dVb) / Va; - - tmp1 = (T4 * dVgsteff_dVd + T6 * dVbseff_dVd + T5) - / here->B4SOInseg; - tmp2 = (T4 * dVgsteff_dVg + T6 * dVbseff_dVg) - / here->B4SOInseg; - tmp3 = (T4 * dVgsteff_dVb + T6 * dVbseff_dVb) - / here->B4SOInseg; - - here->B4SOIgcrgd = pParam->B4SOIxrcrg1 * (dT0_dVd +tmp1); - here->B4SOIgcrgg = pParam->B4SOIxrcrg1 - * (dT0_dVg * dVgsteff_dVg + tmp2); - here->B4SOIgcrgb = pParam->B4SOIxrcrg1 - * (dT0_dVb * dVbseff_dVb + tmp3); - - if (here->B4SOInf != 1.0) - { here->B4SOIgcrg *= here->B4SOInf; - here->B4SOIgcrgg *= here->B4SOInf; - here->B4SOIgcrgd *= here->B4SOInf; - here->B4SOIgcrgb *= here->B4SOInf; - } - - if (here->B4SOIrgateMod == 2) - { T10 = here->B4SOIgrgeltd * here->B4SOIgrgeltd; - T11 = here->B4SOIgrgeltd + here->B4SOIgcrg; - here->B4SOIgcrg = here->B4SOIgrgeltd - * here->B4SOIgcrg / T11; - T12 = T10 / T11 /T11; - here->B4SOIgcrgg *= T12; - here->B4SOIgcrgd *= T12; - here->B4SOIgcrgb *= T12; - } - - here->B4SOIgcrgs = -(here->B4SOIgcrgg + here->B4SOIgcrgd - + here->B4SOIgcrgb); - } /* v3.1 added Rg for RF end */ - - /* v4.0 Calculate bias-dependent external S/D resistance */ - Rs = Rd = 0.0; /* flexilint */ - if (model->B4SOIrdsMod) - { /* Rs(V) */ - T0 = vgs - pParam->B4SOIvfbsd; - T1 = sqrt(T0 * T0 + 1.0e-4); - vgs_eff = 0.5 * (T0 + T1); - dvgs_eff_dvg = vgs_eff / T1; - - T0 = 1.0 + pParam->B4SOIprwg * vgs_eff; - dT0_dVg = -pParam->B4SOIprwg / T0 / T0 * dvgs_eff_dvg; - T1 = -pParam->B4SOIprwb * vbs; - dT1_dVb = -pParam->B4SOIprwb; - - T2 = 1.0 / T0 + T1; - T3 = T2 + sqrt(T2 * T2 + 0.01); - dT3_dVg = T3 / (T3 - T2); - dT3_dVb = dT3_dVg * dT1_dVb; - dT3_dVg *= dT0_dVg; - - T4 = rs0 * 0.5; - Rs = rswmin + T3 * T4; - dRs_dVg = T4 * dT3_dVg; - dRs_dVb = T4 * dT3_dVb; - - T0 = 1.0 + here->B4SOIsourceConductance * Rs; - here->B4SOIgstot = here->B4SOIsourceConductance / T0; - T0 = -here->B4SOIgstot * here->B4SOIgstot; - dgstot_dvd = 0.0; /* place holder */ - dgstot_dve = 0.0; /* place holder */ - dgstot_dvg = T0 * dRs_dVg; - dgstot_dvb = T0 * dRs_dVb; - dgstot_dvs = -(dgstot_dvg + dgstot_dvb + dgstot_dvd - + dgstot_dve); - if (selfheat) { - dRs_dT = drswmin_dT + T3 * 0.5 * drs0_dT; - dgstot_dT = T0 * dRs_dT; - } - else dRs_dT = dgstot_dT = 0.0; - - /* Rd(V) */ - T0 = vgd - pParam->B4SOIvfbsd; - T1 = sqrt(T0 * T0 + 1.0e-4); - vgd_eff = 0.5 * (T0 + T1); - dvgd_eff_dvg = vgd_eff / T1; - - T0 = 1.0 + pParam->B4SOIprwg * vgd_eff; - dT0_dVg = -pParam->B4SOIprwg / T0 / T0 * dvgd_eff_dvg; - T1 = -pParam->B4SOIprwb * vbd; - dT1_dVb = -pParam->B4SOIprwb; - - T2 = 1.0 / T0 + T1; - T3 = T2 + sqrt(T2 * T2 + 0.01); - dT3_dVg = T3 / (T3 - T2); - dT3_dVb = dT3_dVg * dT1_dVb; - dT3_dVg *= dT0_dVg; - - /*T4 = pParam->B4SOIrd0 * 0.5;*/ /* v4.2 bugfix # 37 */ - /*Rd = pParam->B4SOIrdwmin + T3 * T4;*/ /* v4.2 bugfix # 37 */ - T4 = rd0 * 0.5; - Rd = rdwmin + T3 * T4; - dRd_dVg = T4 * dT3_dVg; - dRd_dVb = T4 * dT3_dVb; - T0 = 1.0 + here->B4SOIdrainConductance * Rd; - here->B4SOIgdtot = here->B4SOIdrainConductance / T0; - T0 = -here->B4SOIgdtot * here->B4SOIgdtot; - dgdtot_dvs = 0.0; - dgdtot_dve = 0.0; - dgdtot_dvg = T0 * dRd_dVg; - dgdtot_dvb = T0 * dRd_dVb; - dgdtot_dvd = -(dgdtot_dvg + dgdtot_dvb + dgdtot_dvs - + dgdtot_dve); - if (selfheat) { - dRd_dT = drdwmin_dT + T3 * 0.5 * drd0_dT; - dgdtot_dT = T0 * dRd_dT; - } - else dRd_dT = dgdtot_dT = 0.0; - - here->B4SOIgstotd = vses * dgstot_dvd; - here->B4SOIgstotg = vses * dgstot_dvg; - here->B4SOIgstots = vses * dgstot_dvs; - here->B4SOIgstotb = vses * dgstot_dvb; - - T2 = vdes - vds; - here->B4SOIgdtotd = T2 * dgdtot_dvd; - here->B4SOIgdtotg = T2 * dgdtot_dvg; - here->B4SOIgdtots = T2 * dgdtot_dvs; - here->B4SOIgdtotb = T2 * dgdtot_dvb; - } - else - { here->B4SOIgstot = here->B4SOIgstotd = here->B4SOIgstotg - = here->B4SOIgstots = here->B4SOIgstotb - = 0.0; - here->B4SOIgdtot = here->B4SOIgdtotd = here->B4SOIgdtotg - = here->B4SOIgdtots = here->B4SOIgdtotb - = 0.0; - } - - if (selfheat) - here->B4SOIgmT = GmT + GcT; - else - here->B4SOIgmT = 0.0; - - /* note that sign is switched because power flows out - of device into the temperature node. - Currently omit self-heating due to bipolar current - because it can cause convergence problem*/ - - here->B4SOIgtempg = -model->B4SOItype*Gm * Vds; - here->B4SOIgtempb = -model->B4SOItype*Gmb * Vds; - /* v3.0 */ - here->B4SOIgtempe = -model->B4SOItype*Gme * Vds; - - here->B4SOIgtempT = -GmT * Vds; - here->B4SOIgtempd = -model->B4SOItype* (Gds * Vds + Ids); - here->B4SOIcth = - Ids * Vds - model->B4SOItype * - (here->B4SOIgtempg * Vgs + here->B4SOIgtempb * Vbs - + here->B4SOIgtempe * Ves - + here->B4SOIgtempd * Vds) - - here->B4SOIgtempT * delTemp; /* v3.0 */ - - - /* Body current which flows into drainprime node from the drain of device */ - - here->B4SOIgjdb = Gjdb - Giib -Ggidlb - Ggislb; /* v4.0 */ - here->B4SOIgjdd = Gjdd - (Giid + Ggidld); - here->B4SOIgjdg = - (Giig + Ggidlg + Ggislg); - here->B4SOIgjde = - Giie; - if (selfheat) here->B4SOIgjdT = GjdT - GiiT; - else here->B4SOIgjdT = 0.0; - here->B4SOIcjd = Ibd - Iii - Igidl - - (here->B4SOIgjdb * Vbs - + here->B4SOIgjdd * Vds - + here->B4SOIgjdg * Vgs - + here->B4SOIgjde * Ves - + here->B4SOIgjdT * delTemp); /* v3.0 */ - - if (!here->B4SOIrbodyMod) - { - Giigidl_b = Giigidl_d = Giigidl_g = Giigidl_e - = Giigidl_T = Iii_Igidl = 0.0; - } - else - { - here->B4SOIgiigidlb = Giib + Ggidlb + Ggislb; - here->B4SOIgiigidld = Giid + Ggidld; - Giigidl_b = - Giib -Ggidlb - Ggislb; - Giigidl_d = - Giid -Ggidld; - Giigidl_g = - Giig -Ggidlg - Ggislg; - Giigidl_e = - Giie; - if (selfheat) Giigidl_T = -GiiT; - else GiiT = Giigidl_T = 0.0; - - /*Idbdp = Ibd - ( Gjdb * vbs_jct + Gjdd * Vds - + GjdT * delTemp); v4.2 bugfix */ - Idbdp = Ibd - ( Gjdb * vbd_jct + Gjdd * Vds + GjdT * delTemp); - /* Iii_Igidl = - Iii - Igidl - + Giigidl_b * Vbs + Giigidl_d * Vds - + Giigidl_g * Vgs + Giigidl_e * Ves - + Giigidl_T * delTemp ; */ - } - - /* Body current which flows into sourceprime node from the source of device */ - - here->B4SOIgjsg = 0.0; - here->B4SOIgjsd = Gjsd; - here->B4SOIgjsb = Gjsb; /* v4.0 */ - if (selfheat) here->B4SOIgjsT = GjsT; - else here->B4SOIgjsT = 0.0; - here->B4SOIcjs = Ibs - Igisl - -( here->B4SOIgjsb * Vbs - + here->B4SOIgjsd * Vds - + here->B4SOIgjsg * Vgs - + here->B4SOIgjsT * delTemp); - - if (here->B4SOIrbodyMod) { - Isbsp = Ibs - ( Gjsb * vbs_jct + Gjsd * Vds - + GjsT * delTemp ); - } - - /* Current flowing into body node */ - - here->B4SOIgbbs = Giib - Gjsb - Gjdb - Gbpbs / here->B4SOInf; /* v4.2 bug fix #27 */ - here->B4SOIgbgs = Giig + Ggidlg + Ggislg; - here->B4SOIgbds = Giid + Ggidld + Ggisls - Gjsd - Gjdd; - here->B4SOIgbes = Giie; - here->B4SOIgbps = - Gbpps / here->B4SOInf; /* v4.2 bug fix #27 */ - if (selfheat) here->B4SOIgbT = GiiT - GjsT - GjdT; - else here->B4SOIgbT = 0.0; - - if (!here->B4SOIrbodyMod) - { - here->B4SOIcbody = Iii + Igidl + Igisl - Ibs - Ibd - - Ibp / here->B4SOInf + Igb /* v4.2 bug fix #27 */ - - ( (here->B4SOIgbbs + dIgb_dVb) * Vbs - + (here->B4SOIgbgs + dIgb_dVg) * Vgs - + (here->B4SOIgbds + dIgb_dVd) * Vds - + here->B4SOIgbps * Vps - + (here->B4SOIgbes + dIgb_dVe) * Ves - + (here->B4SOIgbT + dIgb_dT) * delTemp); - } - - if (here->B4SOIrbodyMod) - { - here->B4SOIgbgiigbpb = Giib - Gbpbs / here->B4SOInf; /* v4.3 bug fix */ - here->B4SOIcbody = Iii + Igidl + Igisl - Ibp / here->B4SOInf + Igb /* v4.2 bug fix #27 */ - - ( (Giib - Gbpbs / here->B4SOInf + dIgb_dVb) * Vbs /* v4.2 bug fix #27 */ - + (here->B4SOIgbgs + dIgb_dVg) * Vgs - + (Giid + Ggidld + dIgb_dVd) * Vds - + here->B4SOIgbps * Vps - + (here->B4SOIgbes + dIgb_dVe) * Ves - + (GiiT + dIgb_dT) * delTemp ); - } - - here->B4SOIcgate = Igb - - (dIgb_dVb * Vbs + dIgb_dVe * Ves + dIgb_dVg * Vgs - + dIgb_dVd * Vds + dIgb_dT * delTemp); /* v3.0 */ - - /* Calculate Qinv for Noise analysis */ - - T1 = Vgsteff * (1.0 - 0.5 * Abulk * Vdseff / Vgst2Vtm); - here->B4SOIqinv = -model->B4SOIcox * pParam->B4SOIweff - * here->B4SOInf * Leff * T1; /* v4.0 */ - - if (here->B4SOInf != 1) { - here->B4SOIcdrain *= here->B4SOInf; - here->B4SOIcd *= here->B4SOInf; - here->B4SOIcb *= here->B4SOInf; - -/* Fix NF problem with tnoimod=1 - LFW */ - here->B4SOIidovVds *= here->B4SOInf; - - here->B4SOIgds *= here->B4SOInf; - here->B4SOIgm *= here->B4SOInf; - here->B4SOIgmbs *= here->B4SOInf; - here->B4SOIgme *= here->B4SOInf; - /* Xue fix 10/29/2009 */ - /* here->B4SOIgmT *= here->B4SOInf; *added in line 5424 */ - here->B4SOIcbody *= here->B4SOInf; - - here->B4SOIcgate *= here->B4SOInf; - - here->B4SOIIgcs *= here->B4SOInf; - here->B4SOIgIgcsg *= here->B4SOInf; - here->B4SOIgIgcsd *= here->B4SOInf; - here->B4SOIgIgcsb *= here->B4SOInf; - here->B4SOIgIgcse *= here->B4SOInf; /* LFW_FD new line */ - here->B4SOIIgcd *= here->B4SOInf; - here->B4SOIgIgcdg *= here->B4SOInf; - here->B4SOIgIgcdd *= here->B4SOInf; - here->B4SOIgIgcdb *= here->B4SOInf; - here->B4SOIgIgcde *= here->B4SOInf; /* LFW_FD new line */ - - here->B4SOIIgs *= here->B4SOInf; - here->B4SOIgIgsg *= here->B4SOInf; - here->B4SOIgIgss *= here->B4SOInf; - here->B4SOIIgd *= here->B4SOInf; - here->B4SOIgIgdg *= here->B4SOInf; - here->B4SOIgIgdd *= here->B4SOInf; - - here->B4SOIig *= here->B4SOInf; - here->B4SOIgigg *= here->B4SOInf; - here->B4SOIgigd *= here->B4SOInf; - here->B4SOIgigb *= here->B4SOInf; - here->B4SOIgige *= here->B4SOInf; - here->B4SOIgigT *= here->B4SOInf; - - here->B4SOIcjs *= here->B4SOInf; - here->B4SOIcjd *= here->B4SOInf; - here->B4SOIibs *= here->B4SOInf; - here->B4SOIibd *= here->B4SOInf; - Idbdp *= here->B4SOInf; /*v4.2 bug fix Idbdp needs update as Ibd for nf!=1*/ - Isbsp *= here->B4SOInf; /*v4.2 bug fix Isbsp needs update as Ibd for nf!=1*/ - here->B4SOIgbbs *= here->B4SOInf; - here->B4SOIgbgs *= here->B4SOInf; - here->B4SOIgbds *= here->B4SOInf; - here->B4SOIgbes *= here->B4SOInf; - here->B4SOIgbps *= here->B4SOInf; - here->B4SOIgbT *= here->B4SOInf; - here->B4SOIigidl *= here->B4SOInf; - here->B4SOIigisl *= here->B4SOInf; - - /* bugfix_snps NF*/ - here->B4SOIgjdb *= here->B4SOInf; - here->B4SOIgjdd *= here->B4SOInf; - here->B4SOIgjdg *= here->B4SOInf; - here->B4SOIgjde *= here->B4SOInf; - here->B4SOIgjdT *= here->B4SOInf; - here->B4SOIgjsb *= here->B4SOInf; - here->B4SOIgjsd *= here->B4SOInf; - here->B4SOIgjsg *= here->B4SOInf; - here->B4SOIgjsT *= here->B4SOInf; - - here->B4SOIcth *= here->B4SOInf; - here->B4SOIgmT *= here->B4SOInf; - here->B4SOIgtempg *= here->B4SOInf; - here->B4SOIgtempb *= here->B4SOInf; - here->B4SOIgtempe *= here->B4SOInf; - here->B4SOIgtempT *= here->B4SOInf; - here->B4SOIgtempd *= here->B4SOInf; - here->B4SOIiii *= here->B4SOInf; - /* bugfix NF ends */ - } - here->B4SOIgigs = -(here->B4SOIgigg + here->B4SOIgigd - + here->B4SOIgigb + here->B4SOIgige); - /* LFW_FD fix 2 derivatives */ - here->B4SOIgIgcss = -(here->B4SOIgIgcsg + here->B4SOIgIgcsd - + here->B4SOIgIgcsb + here->B4SOIgIgcse); - here->B4SOIgIgcds = -(here->B4SOIgIgcdg + here->B4SOIgIgcdd - + here->B4SOIgIgcdb + here->B4SOIgIgcde); - - /* Begin CV (charge) model */ - - /* LFW_FD 9 new lines - flexilint */ - Cbb = Cbd = Cbg = 0.0; - Qsub0 = Qac0 = 0.0; - qjs = qjd = 0.0; - CboxWL = 0.0; - Qe1 = dQe1_dVb = dQe1_dVe = dQe1_dT = 0; - Vfbeff2=dVfbeff2_dVd=dVfbeff2_dVrg=dVfbeff2_dVg=dVfbeff2_dVb=dVfbeff2_dVe=dVfbeff2_dT=0.0; - VdseffCV2 = dVdseffCV2_dVg = dVdseffCV2_dVd = dVdseffCV2_dVb = dVdseffCV2_dVe = 0.0; - Vgsteff2 = 0.0; - dVgsteff2_dVd=dVgsteff2_dVg=dVgsteff2_dVb=dVgsteff2_dVe=dVgsteff2_dT=0.0; - - if ((model->B4SOIxpart < 0) || (!ChargeComputationNeeded)) - { qgate = qdrn = qsrc = qbody = qsub = 0.0; /* v2.2.3 bug fix */ - Qsub0=Qac0=Cbb=Cbg=Cbd=0; /* Bugfix #19 Jul09*/ - here->B4SOIcggb = here->B4SOIcgsb = here->B4SOIcgdb = 0.0; - here->B4SOIcdgb = here->B4SOIcdsb = here->B4SOIcddb = 0.0; - here->B4SOIcbgb = here->B4SOIcbsb = here->B4SOIcbdb = 0.0; - goto finished; - } - else - { - qgate = qdrn = qsrc = qbody = qsub = 0.0; /* flexilint */ - CoxWL = model->B4SOIcox * (pParam->B4SOIweffCV - / here->B4SOInseg * here->B4SOInf /* v4.0 */ - * pParam->B4SOIleffCV + here->B4SOIagbcp); - CoxWLb = model->B4SOIfbody * model->B4SOIcox - * (pParam->B4SOIweffCV / here->B4SOInseg - * here->B4SOInf /* v4.0 */ - * pParam->B4SOIleffCVb + here->B4SOIagbcp); - /* v4.1 for improved BT charge model */ - - CoxWL2 = model->B4SOIcox * here->B4SOIagbcp2; - CoxWLb2 = model->B4SOIfbody * model->B4SOIcox * here->B4SOIagbcp2; - /* end v4.1 */ - - - /* v3.2 Seperate VgsteffCV with noff */ - noff = n * pParam->B4SOInoff; - dnoff_dVg = pParam->B4SOInoff * dn_dVg; /* LFW_FD new line */ - dnoff_dVd = pParam->B4SOInoff * dn_dVd; - dnoff_dVb = pParam->B4SOInoff * dn_dVb; - dnoff_dVe = pParam->B4SOInoff * dn_dVe; /* LFW_FD new line */ - dnoff_dT = pParam->B4SOInoff * dn_dT; /* new line Wagner */ - if (model->B4SOIvgstcvMod == 0) - { - if ((VgstNVt > -EXPL_THRESHOLD) && (VgstNVt < EXPL_THRESHOLD)) - { - TL1 = ExpVgst; /* LFW_FD new line */ - ExpVgst *= ExpVgst; - ExpVgst *= exp( -(pParam->B4SOIdelvt / (noff * Vtm))); - /* LFW_FD 4 new derivatives */ - dExpVgst_dVg = 2.0 * TL1 * dExpVgst_dVg * exp( -pParam->B4SOIdelvt / (noff * Vtm)) - + ExpVgst * pParam->B4SOIdelvt * dnoff_dVg / (noff * noff * Vtm); - dExpVgst_dVd = 2.0 * TL1 * dExpVgst_dVd * exp( -pParam->B4SOIdelvt / (noff * Vtm)) - + ExpVgst * pParam->B4SOIdelvt * dnoff_dVd / (noff * noff * Vtm); - dExpVgst_dVb = 2.0 * TL1 * dExpVgst_dVb * exp( -pParam->B4SOIdelvt / (noff * Vtm)) - + ExpVgst * pParam->B4SOIdelvt * dnoff_dVb / (noff * noff * Vtm); - dExpVgst_dVe = 2.0 * TL1 * dExpVgst_dVe * exp( -pParam->B4SOIdelvt / (noff * Vtm)) - + ExpVgst * pParam->B4SOIdelvt * dnoff_dVe / (noff * noff * Vtm); - - Vgsteff = noff * Vtm * log(1.0 + ExpVgst); - /* LFW_FD 4 fix derivatives */ - dVgsteff_dVg = Vgsteff * dnoff_dVg / noff + noff * Vtm * dExpVgst_dVg / (1.0 + ExpVgst); - dVgsteff_dVd = Vgsteff * dnoff_dVd / noff + noff * Vtm * dExpVgst_dVd / (1.0 + ExpVgst); - dVgsteff_dVb = Vgsteff * dnoff_dVb / noff + noff * Vtm * dExpVgst_dVb / (1.0 + ExpVgst); - dVgsteff_dVe = Vgsteff * dnoff_dVe / noff + noff * Vtm * dExpVgst_dVe / (1.0 + ExpVgst); - - T0 = ExpVgst / (1.0 + ExpVgst); - T2 = 2.0 * pParam->B4SOImstar * pParam->B4SOInoff; /* LFW_FD new line */ - T1 = -T0 * (T2*dVth_dVb + (T2*Vgst-pParam->B4SOIdelvt) / noff * dnoff_dVb) - + Vgsteff / noff * dnoff_dVb; /* LFW_FD fix line */ - /* LFW_FD fix _dT derivatives */ - if (selfheat) { - dExpVgst_dT = 2.0 * TL1 * dExpVgst_dT * exp( -pParam->B4SOIdelvt / (noff * Vtm)) - + ExpVgst * pParam->B4SOIdelvt * (dVtm_dT / Vtm + dnoff_dT / noff) / (noff * Vtm); - dVgsteff_dT = Vgsteff * (dnoff_dT / noff + dVtm_dT / Vtm) + noff * Vtm * dExpVgst_dT / (1.0 + ExpVgst); - } - else dVgsteff_dT = 0.0; - - /* v4.1 */ - if (here->B4SOIagbcp2 > 0) { - /* ExpVgst2 = ExpVgst * exp(-1.12 / noff / Vtm); */ - ExpVgst2 = ExpVgst * exp(-eggbcp2 / noff / Vtm); /* bugfix 4.3.1 -Tanvir */ - /* LFW_FD add 4 derivatives */ - dExpVgst2_dVg = dExpVgst_dVg * exp(-eggbcp2 / noff / Vtm) + ExpVgst2 * eggbcp2 * dnoff_dVg / (noff * noff * Vtm); - dExpVgst2_dVd = dExpVgst_dVd * exp(-eggbcp2 / noff / Vtm) + ExpVgst2 * eggbcp2 * dnoff_dVd / (noff * noff * Vtm); - dExpVgst2_dVb = dExpVgst_dVb * exp(-eggbcp2 / noff / Vtm) + ExpVgst2 * eggbcp2 * dnoff_dVb / (noff * noff * Vtm); - dExpVgst2_dVe = dExpVgst_dVe * exp(-eggbcp2 / noff / Vtm) + ExpVgst2 * eggbcp2 * dnoff_dVe / (noff * noff * Vtm); - - Vgsteff2 = noff * Vtm * log(1.0 + ExpVgst2); - /* LFW_FD fix 4 derivatives */ - dVgsteff2_dVg = Vgsteff2 * dnoff_dVg / noff + noff * Vtm * dExpVgst2_dVg / (1.0 + ExpVgst2); - dVgsteff2_dVd = Vgsteff2 * dnoff_dVd / noff + noff * Vtm * dExpVgst2_dVd / (1.0 + ExpVgst2); - dVgsteff2_dVb = Vgsteff2 * dnoff_dVb / noff + noff * Vtm * dExpVgst2_dVb / (1.0 + ExpVgst2); - dVgsteff2_dVe = Vgsteff2 * dnoff_dVe / noff + noff * Vtm * dExpVgst2_dVe / (1.0 + ExpVgst2); - - T02 = ExpVgst2 / (1.0 + ExpVgst2); - /* T12 = -T02 * (dVth_dVb + (Vgst-1.12-pParam->B4SOIdelvt) / noff * dnoff_dVb) - + Vgsteff2 / noff * dnoff_dVb; */ - T12 = -T02 * (dVth_dVb + (Vgst-eggbcp2-pParam->B4SOIdelvt) / noff * dnoff_dVb) - + Vgsteff2 / noff * dnoff_dVb; /* bugfix 4.3.1 -Tanvir */ - if (selfheat) - /*fix below expression Wagner */ - /*dVgsteff2_dT = -T02 * (dVth_dT+dVth_dVb*dVbseff_dT */ - /* dVgsteff2_dT = -T02 * (-dVgst_dT - + (Vgst - 1.12 - pParam->B4SOIdelvt) / Temp) - + Vgsteff2 / Temp; */ /* bugfix 4.3.1 -Tanvir */ - dVgsteff2_dT = -T02 * (-dVgst_dT - + (Vgst - eggbcp2 - pParam->B4SOIdelvt) / Temp) - + Vgsteff2 / Temp; - else dVgsteff2_dT = 0.0; - } - } - } - else if (model->B4SOIvgstcvMod == 1) - { ExpVgst = exp(VgstNVt/(pParam->B4SOImstar * pParam->B4SOInoff)); - ExpVgst *= exp( -(pParam->B4SOIdelvt / (noff * Vtm))); - /* LFW_FD add 4 derivatives */ - dExpVgst_dVg = ExpVgst * (dVgstNVt_dVg/(pParam->B4SOImstar * pParam->B4SOInoff) - + pParam->B4SOIdelvt * dnoff_dVg / (noff * noff * Vtm)); - dExpVgst_dVd = ExpVgst * (dVgstNVt_dVd/(pParam->B4SOImstar * pParam->B4SOInoff) - + pParam->B4SOIdelvt * dnoff_dVd / (noff * noff * Vtm)); - dExpVgst_dVb = ExpVgst * (dVgstNVt_dVb/(pParam->B4SOImstar * pParam->B4SOInoff) - + pParam->B4SOIdelvt * dnoff_dVb / (noff * noff * Vtm)); - dExpVgst_dVe = ExpVgst * (dVgstNVt_dVe/(pParam->B4SOImstar * pParam->B4SOInoff) - + pParam->B4SOIdelvt * dnoff_dVe / (noff * noff * Vtm)); - - Vgsteff = noff * Vtm * log(1.0 + ExpVgst); - /* LFW_FD fix 4 derivatives */ - dVgsteff_dVg = Vgsteff * dnoff_dVg / noff + noff * Vtm * dExpVgst_dVg / (1.0 + ExpVgst); - dVgsteff_dVd = Vgsteff * dnoff_dVd / noff + noff * Vtm * dExpVgst_dVd / (1.0 + ExpVgst); - dVgsteff_dVb = Vgsteff * dnoff_dVb / noff + noff * Vtm * dExpVgst_dVb / (1.0 + ExpVgst); - dVgsteff_dVe = Vgsteff * dnoff_dVe / noff + noff * Vtm * dExpVgst_dVe / (1.0 + ExpVgst); - - T0 = ExpVgst / (1.0 + ExpVgst); - T1 = -T0 * (dVth_dVb + (Vgst-pParam->B4SOIdelvt) / noff * dnoff_dVb) - + Vgsteff / noff * dnoff_dVb; - - if (selfheat) - /*fix below expression Wagner */ - /*dVgsteff_dT = -T0 * (dVth_dT+dVth_dVb*dVbseff_dT */ - dVgsteff_dT = -T0 * (-dVgst_dT - + (Vgst - pParam->B4SOIdelvt) / Temp) - + Vgsteff / Temp; - else dVgsteff_dT = 0.0; - /* v4.1 */ - if (here->B4SOIagbcp2 > 0) { - /* ExpVgst2 = ExpVgst * exp(-1.12 / noff / Vtm); */ - ExpVgst2 = ExpVgst * exp(-eggbcp2 / noff / Vtm); /* bugfix 4.3.1 -Tanvir */ - /* LFW_FD add 4 derivatives */ - dExpVgst2_dVg = dExpVgst_dVg * exp(-eggbcp2 / noff / Vtm) + ExpVgst2 * eggbcp2 * dnoff_dVg / (noff * noff * Vtm); - dExpVgst2_dVd = dExpVgst_dVd * exp(-eggbcp2 / noff / Vtm) + ExpVgst2 * eggbcp2 * dnoff_dVd / (noff * noff * Vtm); - dExpVgst2_dVb = dExpVgst_dVb * exp(-eggbcp2 / noff / Vtm) + ExpVgst2 * eggbcp2 * dnoff_dVb / (noff * noff * Vtm); - dExpVgst2_dVe = dExpVgst_dVe * exp(-eggbcp2 / noff / Vtm) + ExpVgst2 * eggbcp2 * dnoff_dVe / (noff * noff * Vtm); - - Vgsteff2 = noff * Vtm * log(1.0 + ExpVgst2); - /* LFW_FD fix 4 derivatives */ - dVgsteff2_dVg = Vgsteff2 * dnoff_dVg / noff + noff * Vtm * dExpVgst2_dVg / (1.0 + ExpVgst2); - dVgsteff2_dVd = Vgsteff2 * dnoff_dVd / noff + noff * Vtm * dExpVgst2_dVd / (1.0 + ExpVgst2); - dVgsteff2_dVb = Vgsteff2 * dnoff_dVb / noff + noff * Vtm * dExpVgst2_dVb / (1.0 + ExpVgst2); - dVgsteff2_dVe = Vgsteff2 * dnoff_dVe / noff + noff * Vtm * dExpVgst2_dVe / (1.0 + ExpVgst2); - - T02 = ExpVgst2 / (1.0 + ExpVgst2); - /* T12 = -T02 * (dVth_dVb + (Vgst-1.12-pParam->B4SOIdelvt) / noff * dnoff_dVb) - + Vgsteff2 / noff * dnoff_dVb; */ - T12 = -T02 * (dVth_dVb + (Vgst-eggbcp2-pParam->B4SOIdelvt) / noff * dnoff_dVb) - + Vgsteff2 / noff * dnoff_dVb; /* bugfix 4.3.1 -Tanvir */ - dVgsteff2_dVb = T12 * dVbseff_dVb; - dVgsteff2_dVe = T12 * dVbseff_dVe; - if (selfheat) - /*fix below expression Wagner */ - /*dVgsteff2_dT = -T02 * (dVth_dT+dVth_dVb*dVbseff_dT */ - /* dVgsteff2_dT = -T02 * (-dVgst_dT - + (Vgst - 1.12 - pParam->B4SOIdelvt) / Temp) - + Vgsteff2 / Temp; */ - dVgsteff2_dT = -T02 * (-dVgst_dT - + (Vgst - eggbcp2 - pParam->B4SOIdelvt) / Temp) - + Vgsteff2 / Temp; /* bugfix 4.3.1 -Tanvir */ - else dVgsteff2_dT = 0.0; - } - - - } - else - { - T10 = noff * Vtm; - VgstNVt = pParam->B4SOImstarcv * (Vgst - pParam->B4SOIdelvt) / T10; - /* LFW_FD add 4 derivatives */ - dVgstNVt_dVg = (pParam->B4SOImstarcv * dVgst_dVg - VgstNVt * dnoff_dVg * Vtm) / T10; - dVgstNVt_dVd = (pParam->B4SOImstarcv * dVgst_dVd - VgstNVt * dnoff_dVd * Vtm) / T10; - dVgstNVt_dVb = (pParam->B4SOImstarcv * dVgst_dVb - VgstNVt * dnoff_dVb * Vtm) / T10; - dVgstNVt_dVe = (pParam->B4SOImstarcv * dVgst_dVe - VgstNVt * dnoff_dVe * Vtm) / T10; - - ExpArg = (pParam->B4SOIvoffcv - - (1- pParam->B4SOImstarcv) * (Vgst - pParam->B4SOIdelvt))/ T10; - /* LFW_FD add 4 derivatives */ - dExpArg_dVg = (-(1- pParam->B4SOImstarcv) * dVgst_dVg - ExpArg * dnoff_dVg * Vtm) / T10; - dExpArg_dVd = (-(1- pParam->B4SOImstarcv) * dVgst_dVd - ExpArg * dnoff_dVd * Vtm) / T10; - dExpArg_dVb = (-(1- pParam->B4SOImstarcv) * dVgst_dVb - ExpArg * dnoff_dVb * Vtm) / T10; - dExpArg_dVe = (-(1- pParam->B4SOImstarcv) * dVgst_dVe - ExpArg * dnoff_dVe * Vtm) / T10; - - /* 11 lines new Wagner */ - if (selfheat) { - dT10_dT = noff * dVtm_dT + dnoff_dT * Vtm; - /* fix below expression Wagner */ - /*dVgstNVt_dT = -(pParam->B4SOImstarcv*dVth_dT + VgstNVt*dT10_dT)/T10; */ - dVgstNVt_dT = -(-pParam->B4SOImstarcv*dVgst_dT + VgstNVt*dT10_dT)/T10; - /* fix below expression Wagner */ - dExpArg_dT = -(1- pParam->B4SOImstarcv)*dVgst_dT/T10 - -ExpArg*dT10_dT/T10; - } - else { - dT10_dT = 0.0; - dVgstNVt_dT = 0.0; - dExpArg_dT = 0.0; - } - - /* MCJ: Very small Vgst */ - if (VgstNVt > EXPL_THRESHOLD) - { Vgsteff = Vgst - pParam->B4SOIdelvt; - /* T0 is dVgsteff_dVbseff */ - T0 = -dVth_dVb; - /* LFW_FD fix 4 derivatives */ - dVgsteff_dVg = dVgst_dVg; - dVgsteff_dVd = dVgst_dVd; - dVgsteff_dVb = dVgst_dVb; - dVgsteff_dVe = dVgst_dVe; - if (selfheat) - /*fix below expression Wagner */ - /*dVgsteff_dT = -dVth_dT + T0 * dVbseff_dT; */ - dVgsteff_dT = dVgst_dT; - else - dVgsteff_dT = 0.0; - } - else if (ExpArg > EXPL_THRESHOLD) - { T0 = (Vgst - pParam->B4SOIdelvt - pParam->B4SOIvoffcv) / (noff * Vtm); - ExpVgst = exp(T0); - /* LFW_FD add 4 derivatives */ - dExpVgst_dVg = (dVgst_dVg - T0 * dnoff_dVg * Vtm) /(noff * Vtm); - dExpVgst_dVd = (dVgst_dVd - T0 * dnoff_dVd * Vtm) /(noff * Vtm); - dExpVgst_dVb = (dVgst_dVb - T0 * dnoff_dVb * Vtm) /(noff * Vtm); - dExpVgst_dVe = (dVgst_dVe - T0 * dnoff_dVe * Vtm) /(noff * Vtm); - - /*Vgsteff = Vtm * pParam->B4SOIcdep0 / model->B4SOIcox * ExpVgst;*/ /*v4.2 bug fix*/ - Vgsteff = Vtm * cdep0 / model->B4SOIcox * ExpVgst; /* v4.2 bug fix */ - T3 = Vgsteff / (noff * Vtm) ; - /* T1 is dVgsteff_dVbseff */ - /* T1 = -T3 * (dVth_dVb + T0 * Vtm * dnoff_dVb); */ - T1 = -T3 * ( T0 * Vtm * dnoff_dVb); /* LFW_FD fixed line */ - /* LFW_FD fix 4 derivatives */ - dVgsteff_dVg = Vtm * cdep0 / model->B4SOIcox * dExpVgst_dVg; - dVgsteff_dVd = Vtm * cdep0 / model->B4SOIcox * dExpVgst_dVd; - dVgsteff_dVb = Vtm * cdep0 / model->B4SOIcox * dExpVgst_dVb; - dVgsteff_dVe = Vtm * cdep0 / model->B4SOIcox * dExpVgst_dVe; - if (selfheat) - /*fix below expression Wagner */ - /*dVgsteff_dT = -T3 * (dVth_dT + T0 * dVtm_dT * noff) - + Vgsteff / Temp+ T1 * dVbseff_dT;*/ - dVgsteff_dT = -T3 * (-dVgst_dT + T0 * dVtm_dT * noff + Vtm * dnoff_dT) - + Vgsteff / Temp; - else - dVgsteff_dT = 0.0; - } - else - { - ExpVgst = exp(VgstNVt); - /* LFW_FD add 4 derivatives */ - dExpVgst_dVg = ExpVgst * dVgstNVt_dVg; - dExpVgst_dVd = ExpVgst * dVgstNVt_dVd; - dExpVgst_dVb = ExpVgst * dVgstNVt_dVb; - dExpVgst_dVe = ExpVgst * dVgstNVt_dVe; - - T1 = T10 * log(1.0 + ExpVgst); - /* LFW_FD fix 4 derivatives */ - dT1_dVg = T10 * dExpVgst_dVg / (1.0 + ExpVgst) + T1 * dnoff_dVg / noff; - dT1_dVd = T10 * dExpVgst_dVd / (1.0 + ExpVgst) + T1 * dnoff_dVd / noff; - dT1_dVb = T10 * dExpVgst_dVb / (1.0 + ExpVgst) + T1 * dnoff_dVb / noff; - dT1_dVe = T10 * dExpVgst_dVe / (1.0 + ExpVgst) + T1 * dnoff_dVe / noff; - - /*fix below expression Wagner */ - /*T3 = (1.0 / Temp); */ - T3 = (1.0 / Temp + dnoff_dT / noff); - if (selfheat) - /*fix below expression Wagner */ - /*dT1_dT = -dT1_dVg * (dVth_dT + (Vgst-pParam->B4SOIdelvt) * T3) + T1 * T3;*/ - dT1_dT = dT10_dT * log(1.0 + ExpVgst) + T10 * ExpVgst / (1.0 + ExpVgst) * dVgstNVt_dT; - else - dT1_dT = 0.0; - - /* dT2_dVg = -model->B4SOIcox / (Vtm * pParam->B4SOIcdep0) */ - /* * exp(ExpArg) * (1 - pParam->B4SOImstarcv); v4.2 bug fix */ - dT2_dVg = -model->B4SOIcox / (Vtm * cdep0) - * exp(ExpArg) * (1 - pParam->B4SOImstarcv); /* v4.2 bug fix */ - T2 = pParam->B4SOImstarcv - T10 * dT2_dVg - / (1.0 - pParam->B4SOImstarcv); - - /* LFW_FD 5 new lines */ - TL1 = dT2_dVg; - dTL1_dVg = TL1 * dExpArg_dVg; - dTL1_dVd = TL1 * dExpArg_dVd; - dTL1_dVb = TL1 * dExpArg_dVb; - dTL1_dVe = TL1 * dExpArg_dVe; - - /* LFW_FD fix/add 5 derivatives */ - dT2_dVg = -(dnoff_dVg * Vtm * TL1 + T10 * dTL1_dVg) / (1.0 - pParam->B4SOImstarcv); - dT2_dVd = -(dnoff_dVd * Vtm * TL1 + T10 * dTL1_dVd) / (1.0 - pParam->B4SOImstarcv); - dT2_dVb = -(dnoff_dVb * Vtm * TL1 + T10 * dTL1_dVb) / (1.0 - pParam->B4SOImstarcv); - dT2_dVe = -(dnoff_dVe * Vtm * TL1 + T10 * dTL1_dVe) / (1.0 - pParam->B4SOImstarcv); - if (selfheat) - dT2_dT = -(dT10_dT*TL1 - +T10*TL1*(-dVtm_dT/Vtm-dcdep0_dT/cdep0+dExpArg_dT) - )/(1.0 - pParam->B4SOImstarcv); - else - dT2_dT = 0.0; - - Vgsteff = T1 / T2; - - T3 = T2 * T2; - /* T4 is dVgsteff_dVbseff */ - T4 = (T2 * dT1_dVb - T1 * dT2_dVb) / T3; - /* LFW_FD fix 4 derivatives */ - dVgsteff_dVg = (T2 * dT1_dVg - T1 * dT2_dVg) / T3; - dVgsteff_dVd = (T2 * dT1_dVd - T1 * dT2_dVd) / T3; - dVgsteff_dVb = (T2 * dT1_dVb - T1 * dT2_dVb) / T3; - dVgsteff_dVe = (T2 * dT1_dVe - T1 * dT2_dVe) / T3; - if (selfheat) - /*fix below expression Wagner */ - /*dVgsteff_dT = (T2 * dT1_dT - T1 * dT2_dT) - / T3+ T4 * dVbseff_dT; */ - dVgsteff_dT = (T2 * dT1_dT - T1 * dT2_dT) / T3; - else - dVgsteff_dT = 0.0; - } - - - - if (here->B4SOIagbcp2 > 0) - { - /* VgstNVt2 = pParam->B4SOImstarcv * (Vgst - pParam->B4SOIdelvt - 1.12) / T10; */ - VgstNVt2 = pParam->B4SOImstarcv * (Vgst - pParam->B4SOIdelvt - eggbcp2) / T10; /* bugfix 4.3.1 -Tanvir */ - /* LFW_FD add 4 derivatives */ - dVgstNVt2_dVg = (pParam->B4SOImstarcv * dVgst_dVg - VgstNVt2 * dnoff_dVg * Vtm) / T10; - dVgstNVt2_dVd = (pParam->B4SOImstarcv * dVgst_dVd - VgstNVt2 * dnoff_dVd * Vtm) / T10; - dVgstNVt2_dVb = (pParam->B4SOImstarcv * dVgst_dVb - VgstNVt2 * dnoff_dVb * Vtm) / T10; - dVgstNVt2_dVe = (pParam->B4SOImstarcv * dVgst_dVe - VgstNVt2 * dnoff_dVe * Vtm) / T10; - - /* ExpArg2 = (pParam->B4SOIvoffcv - - (1- pParam->B4SOImstarcv) * (Vgst - pParam->B4SOIdelvt - 1.12))/ T10; */ - ExpArg2 = (pParam->B4SOIvoffcv - - (1- pParam->B4SOImstarcv) * (Vgst - pParam->B4SOIdelvt - eggbcp2))/ T10; /* bugfix 4.3.1 -Tanvir */ - /* LFW_FD add 4 derivatives */ - dExpArg2_dVg = (-(1- pParam->B4SOImstarcv) * dVgst_dVg - ExpArg2 * dnoff_dVg * Vtm) / T10; - dExpArg2_dVd = (-(1- pParam->B4SOImstarcv) * dVgst_dVd - ExpArg2 * dnoff_dVd * Vtm) / T10; - dExpArg2_dVb = (-(1- pParam->B4SOImstarcv) * dVgst_dVb - ExpArg2 * dnoff_dVb * Vtm) / T10; - dExpArg2_dVe = (-(1- pParam->B4SOImstarcv) * dVgst_dVe - ExpArg2 * dnoff_dVe * Vtm) / T10; - - /* 11 new lines Wagner */ - if (selfheat) { - /*fix below expression Wagner */ - /*dVgstNVt2_dT = -(pParam->B4SOImstarcv*dVth_dT + VgstNVt2*dT10_dT)/T10;*/ - dVgstNVt2_dT = -(-pParam->B4SOImstarcv*dVgst_dT + VgstNVt2*dT10_dT)/T10; - /*fix 1st line of below expression Wagner */ - /*dExpArg2_dT = (1- pParam->B4SOImstarcv)*dVth_dT/T10 */ - dExpArg2_dT = -(1- pParam->B4SOImstarcv)*dVgst_dT/T10 - -ExpArg2*dT10_dT/T10; - } - else { - dT10_dT = 0.0; - dVgstNVt_dT = 0.0; - dExpArg_dT = 0.0; - dExpArg2_dT = 0.0; - } - - /* MCJ: Very small Vgst */ - if (VgstNVt2 > EXPL_THRESHOLD) - { /* Vgsteff2 = Vgst - pParam->B4SOIdelvt - 1.12; */ - Vgsteff2 = Vgst - pParam->B4SOIdelvt - eggbcp2; /* bugfix 4.3.1 -Tanvir */ - T0 = -dVth_dVb; - /* LFW_FD fix 4 derivatives */ - dVgsteff2_dVg = dVgst_dVg; - dVgsteff2_dVd = dVgst_dVd; - dVgsteff2_dVb = dVgst_dVb; - dVgsteff2_dVe = dVgst_dVe; - - if (selfheat) - /*fix below expression Wagner */ - /*dVgsteff2_dT = -dVth_dT + T0 * dVbseff_dT;*/ - dVgsteff2_dT = dVgst_dT; - else - dVgsteff2_dT = 0.0; - } - else if (ExpArg2 > EXPL_THRESHOLD) - { /* T0 = (Vgst - pParam->B4SOIdelvt - pParam->B4SOIvoffcv - 1.12) / (noff * Vtm); - ExpVgst2 = exp(T0); */ - T0 = (Vgst - pParam->B4SOIdelvt - pParam->B4SOIvoffcv - eggbcp2) / (noff * Vtm); - ExpVgst2 = exp(T0); /* bugfix 4.3.1 -Tanvir */ - /*Vgsteff2 = Vtm * pParam->B4SOIcdep0 / model->B4SOIcox * ExpVgst*/ - Vgsteff2 = Vtm * cdep0 / model->B4SOIcox * ExpVgst2; /*v4.2 bug fix */ - T3 = Vgsteff2 / (noff * Vtm) ; - /* T1 is dVgsteff2_dVbseff */ - T1 = -T3 * (dVth_dVb + T0 * Vtm * dnoff_dVb); - /* LFW_FD fix 4 derivatives */ - dVgsteff2_dVg = Vgsteff2 * (dVgst_dVg / Vtm - T0 * dnoff_dVg) / noff; - dVgsteff2_dVd = Vgsteff2 * (dVgst_dVd / Vtm - T0 * dnoff_dVd) / noff; - dVgsteff2_dVb = Vgsteff2 * (dVgst_dVb / Vtm - T0 * dnoff_dVb) / noff; - dVgsteff2_dVe = Vgsteff2 * (dVgst_dVe / Vtm - T0 * dnoff_dVe) / noff; - - if (selfheat) - /* fix 1st line in below expression Wagner */ - /*dVgsteff2_dT = -T3 * (dVth_dT + T0 * dVtm_dT * noff) */ - dVgsteff2_dT = -T3 * (-dVgst_dT + T0 * dVtm_dT * noff) - + Vgsteff2 / Temp+ T1 * dVbseff_dT; - else - dVgsteff2_dT = 0.0; - } - else - { ExpVgst2 = exp(VgstNVt2); - T1 = T10 * log(1.0 + ExpVgst2); - /* LFW_FD fix 4 derivatives */ - dT1_dVg = dnoff_dVg * T1 / noff + T10 * ExpVgst2 * dVgstNVt2_dVg / (1.0 + ExpVgst2); - dT1_dVd = dnoff_dVg * T1 / noff + T10 * ExpVgst2 * dVgstNVt2_dVd / (1.0 + ExpVgst2); - dT1_dVb = dnoff_dVg * T1 / noff + T10 * ExpVgst2 * dVgstNVt2_dVb / (1.0 + ExpVgst2); - dT1_dVe = dnoff_dVg * T1 / noff + T10 * ExpVgst2 * dVgstNVt2_dVe / (1.0 + ExpVgst2); - /*fix below expression Wagner */ - /*T3 = (1.0 / Temp); */ - T3 = (1.0 / Temp + dnoff_dT / noff); - if (selfheat) - /*fix below expression */ - /*dT1_dT = -dT1_dVg * (dVth_dT + (Vgst - pParam->B4SOIdelvt - 1.12) * T3) + T1 * T3;*/ - /* dT1_dT = -dT1_dVg * (-dVgst_dT + (Vgst-pParam->B4SOIdelvt-1.12) * T3) + T1 * T3; */ - dT1_dT = -dT1_dVg * (-dVgst_dT + (Vgst-pParam->B4SOIdelvt-eggbcp2) * T3) + T1 * T3; /* bugfix 4.3.1 -Tanvir */ - else - dT1_dT = 0.0; - - /* dT2_dVg = -model->B4SOIcox / (Vtm * pParam->B4SOIcdep0) - * exp(ExpArg2) * (1 - pParam->B4SOImstarcv);*/ - dT2_dVg = -model->B4SOIcox / (Vtm * cdep0) - * exp(ExpArg2) * (1 - pParam->B4SOImstarcv); /*v4.2 bug fix */ - T2 = pParam->B4SOImstarcv - T10 * dT2_dVg - / (1.0 - pParam->B4SOImstarcv); - /* LFW_FD next 5 lines new */ - TL1 = dT2_dVg; - dTL1_dVg = TL1 * dExpArg2_dVg; - dTL1_dVd = TL1 * dExpArg2_dVd; - dTL1_dVb = TL1 * dExpArg2_dVb; - dTL1_dVe = TL1 * dExpArg2_dVe; - - /* LFW_FD fix next 5 derivatives */ - dT2_dVg = -(dnoff_dVg * Vtm * TL1 + T10 * dTL1_dVg) / (1.0 - pParam->B4SOImstarcv); - dT2_dVd = -(dnoff_dVg * Vtm * TL1 + T10 * dTL1_dVd) / (1.0 - pParam->B4SOImstarcv); - dT2_dVb = -(dnoff_dVg * Vtm * TL1 + T10 * dTL1_dVb) / (1.0 - pParam->B4SOImstarcv); - dT2_dVe = -(dnoff_dVg * Vtm * TL1 + T10 * dTL1_dVe) / (1.0 - pParam->B4SOImstarcv); - if (selfheat) - dT2_dT = -(dT10_dT*TL1 - +T10*TL1*(-dVtm_dT/Vtm-dcdep0_dT/cdep0+dExpArg2_dT) - )/(1.0 - pParam->B4SOImstarcv); - else - dT2_dT = 0.0; - - Vgsteff2 = T1 / T2; - T3 = T2 * T2; - /* T4 is dVgsteff2_dVbseff */ - T4 = (T2 * dT1_dVb - T1 * dT2_dVb) / T3; - /* LFW_FD fix next 4 derivatives */ - dVgsteff2_dVg = (T2 * dT1_dVg - T1 * dT2_dVg) / T3; - dVgsteff2_dVd = (T2 * dT1_dVd - T1 * dT2_dVd) / T3; - dVgsteff2_dVb = (T2 * dT1_dVb - T1 * dT2_dVb) / T3; - dVgsteff2_dVe = (T2 * dT1_dVe - T1 * dT2_dVe) / T3; - if (selfheat) - /*fix below expression Wagner */ - /*dVgsteff2_dT = (T2 * dT1_dT - T1 * dT2_dT) - / T3+ T4 * dVbseff_dT; */ - dVgsteff2_dT = (T2 * dT1_dT - T1 * dT2_dT) / T3; - else - dVgsteff2_dT = 0.0; - } - } - } - /* v3.2 */ - /* v3.2 */ - - /* LFW_FD flexilint initializations next 9 lines */ - Qsub02 = dQsub02_dVrg = dQsub02_dVg = dQsub02_dVd = dQsub02_dVb = dQsub02_dVe = dQsub02_dT = 0.0; - Qac02 = dQac02_dVrg = dQac02_dVg = dQac02_dVd = dQac02_dVb = dQac02_dVe = dQac02_dT = 0.0; - dqsrc_dT = 0.0; - dVdseffCV2_dT = 0; - T02 = dT02_dVg = dT02_dVd = dT02_dVb = dT02_dVe = 0.0; - T12 = dT12_dVg = dT12_dVd = dT12_dVb = dT12_dVe = 0.0; - T22 = dT22_dVg = dT22_dVd = dT22_dVb = dT22_dVe = 0.0; - - if (model->B4SOIcapMod == 2) - { - - /* v3.1 */ - if (here->B4SOIsoiMod == 2) /* v3.2 */ /* ideal FD */ - { - /* LFW_FD flexilint initializations next 4 lines */ - Qac0 = dQac0_dVrg = dQac0_dVg = dQac0_dVd = dQac0_dVb = dQac0_dVe = dQac0_dT = 0.0; - dQac02_dVrg = dQac02_dVg = dQac02_dVd = dQac02_dVb = dQac02_dVe = dQac02_dT = 0.0; - Qsub0 = dQsub0_dVrg = dQsub0_dVg = dQsub0_dVd = dQsub0_dVb = dQsub0_dVe = dQsub0_dT = 0.0; - dQsub02_dVrg = dQsub02_dVg = dQsub02_dVd = dQsub02_dVb = dQsub02_dVe = dQsub02_dT = 0.0; - } - else /* soiMod = 0 or 1 */ - { - Vfb = Vth - phi - pParam->B4SOIk1eff * sqrtPhis + pParam->B4SOIdelvt; - dVfb_dVb = dVth_dVb - pParam->B4SOIk1eff * dsqrtPhis_dVb; - /* LFW_FD fix/add next 3 derivatives */ - dVfb_dVd = dVth_dVd - pParam->B4SOIk1eff * dsqrtPhis_dVd; - dVfb_dVg = dVth_dVg - pParam->B4SOIk1eff * dsqrtPhis_dVg; - dVfb_dVe = dVth_dVe - pParam->B4SOIk1eff * dsqrtPhis_dVe; - /*fix below expression Wagner */ - /*dVfb_dT = dVth_dT; */ - dVfb_dT = dVth_dT - dphi_dT - pParam->B4SOIk1eff*dsqrtPhis_dT; - - V3 = Vfb - Vgs_eff + Vbseff - DELTA_3_SOI; - if (Vfb <= 0.0) - { T0 = sqrt(V3 * V3 - 4.0 * DELTA_3_SOI * Vfb); - T2 = -DELTA_3_SOI / T0; - } - else - { T0 = sqrt(V3 * V3 + 4.0 * DELTA_3_SOI * Vfb); - T2 = DELTA_3_SOI / T0; - } - - T1 = 0.5 * (1.0 + V3 / T0); - Vfbeff = Vfb - 0.5 * (V3 + T0); - /* LFW_FD fix/add next 4 derivatives */ - dVfbeff_dVd = (1.0 - T1 - T2) * dVfb_dVd - T1 * dVbseff_dVd; - dVfbeff_dVb = (1.0 - T1 - T2) * dVfb_dVb - T1 * dVbseff_dVb; - dVfbeff_dVg = (1.0 - T1 - T2) * dVfb_dVg - T1 * (dVbseff_dVg - dVgs_eff_dVg); - dVfbeff_dVe = (1.0 - T1 - T2) * dVfb_dVe - T1 * dVbseff_dVe; - dVfbeff_dVrg = T1 * dVgs_eff_dVg; - /*fix below expression Wagner */ - /*if (selfheat) dVfbeff_dT = (1.0 - T1 - T2) * dVfb_dT; - - T1*dVbseff_dT; */ - if (selfheat) dVfbeff_dT = (1.0 - T1 - T2) * dVfb_dT - + T1*(dVgs_eff_dT-dVbseff_dT); - else dVfbeff_dT = 0.0; - - Qac0 = CoxWLb * (Vfbeff - Vfb); - dQac0_dVrg = CoxWLb * dVfbeff_dVrg; - dQac0_dVd = CoxWLb * (dVfbeff_dVd - dVfb_dVd); - dQac0_dVb = CoxWLb * (dVfbeff_dVb - dVfb_dVb); - /* LFW_FD add next 2 derivatives */ - dQac0_dVg = CoxWLb * (dVfbeff_dVg - dVfb_dVg); - dQac0_dVe = CoxWLb * (dVfbeff_dVe - dVfb_dVe); - if (selfheat) dQac0_dT = CoxWLb * (dVfbeff_dT - dVfb_dT); - else dQac0_dT = 0.0; - /* v4.1 */ - if ((here->B4SOIsoiMod != 2) && /* Bug fix #10 Jun 09 'opposite type Q/C evaluated only if bodymod=1' Jun 09 */ - ( here->B4SOIbodyMod != 0) && here->B4SOIagbcp2 > 0) - { - /* Vfb2 = Vfb + 1.12; */ - Vfb2 = Vfb + eggbcp2; /* bugfix 4.3.1 -Tanvir */ - dVfb2_dVb = dVfb_dVb; - dVfb2_dVd = dVfb_dVd; - /* LFW_FD add next 2 derivatives */ - dVfb2_dVg = dVfb_dVg; - dVfb2_dVe = dVfb_dVe; - dVfb2_dT = dVfb_dT; - DELTA_3_SOI2 = DELTA_3_SOI; - V3 = Vfb2 - Vgs_eff2 + Vbseff - DELTA_3_SOI2; - if (Vfb2 <= 0.0) - { T0 = sqrt(V3 * V3 - 100.0 * DELTA_3_SOI2 * Vfb2); - T2 = -25.0 * DELTA_3_SOI2 / T0; - } - else - { T0 = sqrt(V3 * V3 + 100.0 * DELTA_3_SOI2 * Vfb2); - T2 = 25.0 * DELTA_3_SOI2 / T0; - } - T1 = 0.5 * (1.0 + V3 / T0); - Vfbeff2 = Vfb2 - 0.5 * (V3 + T0); - /* LFW_FD fix/add next 4 derivatives */ - dVfbeff2_dVg = (1.0 - T2) * dVfb2_dVg - T1 * (dVfb2_dVg - dVgs_eff2_dVg + dVbseff_dVg); - dVfbeff2_dVd = (1.0 - T2) * dVfb2_dVd - T1 * (dVfb2_dVd + dVbseff_dVd); - dVfbeff2_dVb = (1.0 - T2) * dVfb2_dVb - T1 * (dVfb2_dVb + dVbseff_dVb); - dVfbeff2_dVe = (1.0 - T2) * dVfb2_dVe - T1 * (dVfb2_dVe + dVbseff_dVe); - dVfbeff2_dVrg = T1 * dVgs_eff2_dVg; - /*fix below expression Wagner */ - /*if (selfheat) dVfbeff2_dT = (1.0 - T1 - T2) * dVfb2_dT; */ - if (selfheat) dVfbeff2_dT = (1.0 - T1 - T2) * dVfb2_dT - - T1*dVfbeff2_dT; - else dVfbeff2_dT = 0.0; - - Qac0 += CoxWLb2 * (Vfbeff2 - Vfb2); - dQac02_dVrg = CoxWLb2 * dVfbeff2_dVrg; - dQac02_dVd = CoxWLb2 * (dVfbeff2_dVd - dVfb2_dVd); - dQac02_dVb = CoxWLb2 * (dVfbeff2_dVb - dVfb2_dVb); - /* LFW_FD add next 2 derivatives */ - dQac02_dVg = CoxWLb2 * (dVfbeff2_dVg - dVfb2_dVg); - dQac02_dVe = CoxWLb2 * (dVfbeff2_dVe - dVfb2_dVe); - if (selfheat) - dQac02_dT = CoxWLb2 * (dVfbeff2_dT - dVfb2_dT); - else dQac02_dT = 0.0; - dQac0_dT += dQac02_dT; /* new line Wagner */ - } - /* end v4.1 */ - T0 = 0.5 * pParam->B4SOIk1ox; - T3 = Vgs_eff - Vfbeff - Vbseff - Vgsteff; - if (pParam->B4SOIk1ox == 0.0) - { T1 = 0.0; - T2 = 0.0; - } - else if (T3 < 0.0) - { T1 = T0 + T3 / pParam->B4SOIk1ox; - T2 = CoxWLb; - } - else - { T1 = sqrt(T0 * T0 + T3); - T2 = CoxWLb * T0 / T1; - } - - Qsub0 = CoxWLb * pParam->B4SOIk1ox * (T1 - T0); /* 4.1 bug fix */ - dQsub0_dVrg = T2 * (dVgs_eff_dVg - dVfbeff_dVrg); - /* LFW_FD fix/add next 4 derivatives */ - dQsub0_dVd = -T2 * (dVfbeff_dVd + dVbseff_dVd + dVgsteff_dVd); - dQsub0_dVg = T2 * (dVgs_eff_dVg - dVfbeff_dVg - dVbseff_dVg - dVgsteff_dVg); - dQsub0_dVb = -T2 * (dVfbeff_dVb + dVbseff_dVb + dVgsteff_dVb); - dQsub0_dVe = -T2 * (dVfbeff_dVe + dVbseff_dVe + dVgsteff_dVe); - /*fix below expression Wagner */ - /*if (selfheat) dQsub0_dT = -T2 * dVfbeff_dT; */ - if (selfheat) dQsub0_dT = -T2 * (-dVgs_eff_dT + dVfbeff_dT + dVbseff_dT + dVgsteff_dT); - else dQsub0_dT = 0.0; - /* v4.1 */ - if ((here->B4SOIsoiMod != 2) && /* Bug fix #10 Jun 09 'opposite type Q/C evaluated only if bodymod=1' */ - (here->B4SOIbodyMod != 0) && here->B4SOIagbcp2 > 0) - { T3 = Vgs_eff2- Vfbeff2 - Vbseff - Vgsteff2; - if (T3 < 0.0) - { T1 = T0 + T3 / pParam->B4SOIk1ox; - T2 = CoxWLb2; - } - else - { T1 = sqrt(T0 * T0 + T3); - T2 = CoxWLb2 * T0 / T1; - } - Qsub0 += CoxWLb2 * pParam->B4SOIk1ox * (T1 - T0); - dQsub02_dVrg = T2 * (dVgs_eff2_dVg - dVfbeff2_dVrg); - /* LFW_FD fix/add next 4 derivatives */ - dQsub02_dVg = T2 * (dVgs_eff2_dVg - dVfbeff2_dVg - dVbseff_dVg - dVgsteff2_dVg); - dQsub02_dVd = -T2 * ( dVfbeff2_dVd + dVbseff_dVd + dVgsteff2_dVd); - dQsub02_dVb = -T2 * ( dVfbeff2_dVb + dVbseff_dVb + dVgsteff2_dVb); - dQsub02_dVe = -T2 * ( dVfbeff2_dVe + dVbseff_dVe + dVgsteff2_dVe); - /*fix below expression Wagner */ - /*if (selfheat) dQsub02_dT = -T2 * dVfbeff2_dT; */ - if (selfheat) dQsub02_dT = -T2 * (dVfbeff2_dT + dVbseff_dT + dVgsteff2_dT); - else dQsub02_dT = 0.0; - dQsub0_dT += dQsub02_dT; /* new line Wagner */ - } - } - /* v3.1 */ - - - - AbulkCV = Abulk0 * pParam->B4SOIabulkCVfactor; - /* LFW_FD add next 3 derivatives */ - dAbulkCV_dVg = pParam->B4SOIabulkCVfactor * dAbulk0_dVg; - dAbulkCV_dVd = pParam->B4SOIabulkCVfactor * dAbulk0_dVd; - dAbulkCV_dVe = pParam->B4SOIabulkCVfactor * dAbulk0_dVe; - dAbulkCV_dVb = pParam->B4SOIabulkCVfactor * dAbulk0_dVb; - dAbulkCV_dT = dAbulk0_dT * pParam->B4SOIabulkCVfactor; /* new line Wagner */ - - VdsatCV = Vgsteff / AbulkCV; - /* LFW_FD fix/add next 4 derivatives */ - dVdsatCV_dVg = (dVgsteff_dVg -VdsatCV * dAbulkCV_dVg) / AbulkCV; - dVdsatCV_dVd = (dVgsteff_dVd -VdsatCV * dAbulkCV_dVd) / AbulkCV; - dVdsatCV_dVb = (dVgsteff_dVb -VdsatCV * dAbulkCV_dVb) / AbulkCV; - dVdsatCV_dVe = (dVgsteff_dVe -VdsatCV * dAbulkCV_dVe) / AbulkCV; - - V4 = VdsatCV - Vds - DELTA_4; - T0 = sqrt(V4 * V4 + 4.0 * DELTA_4 * VdsatCV); - VdseffCV = VdsatCV - 0.5 * (V4 + T0); - T1 = 0.5 * (1.0 + V4 / T0); - T2 = DELTA_4 / T0; - T3 = (1.0 - T1 - T2) / AbulkCV; - /* LFW_FD fix/add next 4 derivatives */ - dVdseffCV_dVg = ( 1.0 - T1 - T2) * dVdsatCV_dVg; - dVdseffCV_dVd = ( 1.0 - T1 - T2) * dVdsatCV_dVd + T1; - dVdseffCV_dVb = ( 1.0 - T1 - T2) * dVdsatCV_dVb; - dVdseffCV_dVe = ( 1.0 - T1 - T2) * dVdsatCV_dVe; - /* 10 new lines Wagner */ - if (selfheat) { - dVdsatCV_dT = dVgsteff_dT/AbulkCV - -VdsatCV*dAbulkCV_dT/AbulkCV; - dTL1_dT = (V4 + 2.0 * DELTA_4) * dVdsatCV_dT / T0; - dVdseffCV_dT = 0.5*dVdsatCV_dT - 0.5*dTL1_dT; - } - else { - dVdsatCV_dT = 0; - dVdseffCV_dT = 0; - } - - /* v4.1 */ - if (here->B4SOIagbcp2 > 0) - { VdsatCV2 = Vgsteff2 / AbulkCV; - /* LFW_FD fix/add next 4 derivatives */ - dVdsatCV2_dVg = (dVgsteff2_dVg - VdsatCV2 * dAbulkCV_dVg) / AbulkCV; - dVdsatCV2_dVd = (dVgsteff2_dVd - VdsatCV2 * dAbulkCV_dVd) / AbulkCV; - dVdsatCV2_dVb = (dVgsteff2_dVb - VdsatCV2 * dAbulkCV_dVb) / AbulkCV; - dVdsatCV2_dVe = (dVgsteff2_dVe - VdsatCV2 * dAbulkCV_dVe) / AbulkCV; - V4 = VdsatCV2 - Vds - DELTA_4; - T0 = sqrt(V4 * V4 + 4.0 * DELTA_4 * VdsatCV2); - VdseffCV2 = VdsatCV2 - 0.5 * (V4 + T0); - T1 = 0.5 * (1.0 + V4 / T0); - T2 = DELTA_4 / T0; - T3 = (1.0 - T1 - T2) / AbulkCV; - /* LFW_FD fix/add next 4 derivatives */ - dVdseffCV2_dVg = (1.0 - T1 - T2 ) * dVdsatCV2_dVg; - dVdseffCV2_dVd = (1.0 - T1 - T2 ) * dVdsatCV2_dVd + T1; - dVdseffCV2_dVb = (1.0 - T1 - T2 ) * dVdsatCV2_dVb; - dVdseffCV2_dVe = (1.0 - T1 - T2 ) * dVdsatCV2_dVe; - /* 10 new lines Wagner */ - if (selfheat) { - dVdsatCV2_dT = dVgsteff2_dT/AbulkCV - -VdsatCV2*dAbulkCV_dT/AbulkCV; - dTL1_dT = (V4 + 2.0 * DELTA_4) * dVdsatCV2_dT / T0; - dVdseffCV2_dT = 0.5*dVdsatCV2_dT - 0.5*dTL1_dT; - } - else { - dVdsatCV2_dT = 0; - dVdseffCV2_dT = 0; - } - } - /* end v4.1 */ - - /* v3.1 */ - Cbg12 = Cbd12 = Cbb12 = Cbe12 = 0; /* LFW_FD flexilint */ - dqbulk_dT = 0; /* new line Wagner */ - if (here->B4SOIsoiMod == 2) /* v3.2 */ /* ideal FD */ - { - qbulk = Cbg1 = Cbd1 = Cbb1 = Cbe1 = 0; /* LFW_FD enhance 2 lines */ - Cbg12 = Cbd12 = Cbb12 = Cbe12 = 0; /* v4.1 */ - } - else - { - T0 = AbulkCV * VdseffCV; - T1 = 12.0 * (Vgsteff - 0.5 * T0 + 1e-20); - T2 = VdseffCV / T1; - T3 = T0 * T2; - T4 = (1.0 - 12.0 * T2 * T2 * AbulkCV); - T5 = (6.0 * T0 * (4.0 * Vgsteff- T0) / (T1 * T1) - 0.5); - T6 = 12.0 * T2 * T2 * Vgsteff; - - T7 = 1.0 - AbulkCV; - qbulk = CoxWLb * T7 * (0.5 * VdseffCV - T3); - T4 = -T7 * (T4 - 1.0); - T5 = -T7 * T5; - T6 = -(T7 * T6 + (0.5 * VdseffCV - T3)); - - /* LFW_FD fix next 3 lines with next 20 lines */ -/* Cbg1 = CoxWLb * (T4 + T5 * dVdseffCV_dVg); */ -/* Cbd1 = CoxWLb * T5 * dVdseffCV_dVd ; */ -/* Cbb1 = CoxWLb * (T5 * dVdseffCV_dVb + T6 * dAbulkCV_dVb);*/ - - dT0_dVg = AbulkCV * dVdseffCV_dVg + dAbulkCV_dVg * VdseffCV; - dT0_dVd = AbulkCV * dVdseffCV_dVd + dAbulkCV_dVd * VdseffCV; - dT0_dVb = AbulkCV * dVdseffCV_dVb + dAbulkCV_dVb * VdseffCV; - dT0_dVe = AbulkCV * dVdseffCV_dVe + dAbulkCV_dVe * VdseffCV; - - dT1_dVg = 12.0 * (dVgsteff_dVg - 0.5 * dT0_dVg); - dT1_dVd = 12.0 * (dVgsteff_dVd - 0.5 * dT0_dVd); - dT1_dVb = 12.0 * (dVgsteff_dVb - 0.5 * dT0_dVb); - dT1_dVe = 12.0 * (dVgsteff_dVe - 0.5 * dT0_dVe); - - Cbg1 = CoxWLb * (T7 * (0.5 - T0 / T1) * dVdseffCV_dVg - - T7 * VdseffCV * ((dT0_dVg - T0 * dT1_dVg / T1) / T1) - - dAbulkCV_dVg * (0.5 * VdseffCV - T3) ); - Cbd1 = CoxWLb * (T7 * (0.5 - T0 / T1) * dVdseffCV_dVd - - T7 * VdseffCV * ((dT0_dVd - T0 * dT1_dVd / T1) / T1) - - dAbulkCV_dVd * (0.5 * VdseffCV - T3) ); - Cbb1 = CoxWLb * (T7 * (0.5 - T0 / T1) * dVdseffCV_dVb - - T7 * VdseffCV * ((dT0_dVb - T0 * dT1_dVb / T1) / T1) - - dAbulkCV_dVb * (0.5 * VdseffCV - T3) ); - Cbe1 = CoxWLb * (T7 * (0.5 - T0 / T1) * dVdseffCV_dVe - - T7 * VdseffCV * ((dT0_dVe - T0 * dT1_dVe / T1) / T1) - - dAbulkCV_dVe * (0.5 * VdseffCV - T3) ); - - /* 10 new lines Wagner */ - if (selfheat) { - dTL1_dT = AbulkCV * dVdseffCV_dT + dAbulkCV_dT * VdseffCV; - dTL2_dT = 12.0 * (dVgsteff_dT -0.5 * dTL1_dT); - dTL3_dT = (dVdseffCV_dT - T2 * dTL2_dT) / T1; - dTL4_dT = T0 * dTL3_dT + dTL1_dT * T2; - dqbulk_dT = CoxWLb * - (-dAbulk_dT * (0.5 * VdseffCV - T3) - + T7 * (0.5 * dVdseffCV_dT - dTL4_dT)); - } - else dqbulk_dT = 0; - - /* v4.1 */ - if ((here->B4SOIsoiMod != 2) && /* Bug fix #10 Jun 09 'opposite type Q/C evaluated only if bodymod=1' */ - (here->B4SOIbodyMod != 0) && here->B4SOIagbcp2 > 0) - { T0 = AbulkCV * VdseffCV2; - T1 = 12.0 * (Vgsteff2 - 0.5 * T0 + 1e-20); - T2 = VdseffCV2 / T1; - T3 = T0 * T2; - T4 = (1.0 - 12.0 * T2 * T2 * AbulkCV); - T5 = (6.0 * T0 * (4.0 * Vgsteff2 - T0) / (T1 * T1) - 0.5); - T6 = 12.0 * T2 * T2 * Vgsteff2; - T7 = 1.0 - AbulkCV; - qbulk += CoxWLb2 * T7 * (0.5 * VdseffCV2 - T3); - T4 = -T7 * (T4 - 1.0); - T5 = -T7 * T5; - T6 = -(T7 * T6 + (0.5 * VdseffCV2 - T3)); - /* LFW_FD fix next 3 lines with next 20 lines */ -/* Cbg12 = CoxWLb2 * (T4 + T5 * dVdseffCV2_dVg);*/ -/* Cbd12 = CoxWLb2 * T5 * dVdseffCV2_dVd ; */ -/* Cbb12 = CoxWLb2 * (T5 * dVdseffCV2_dVb + T6 * dAbulkCV_dVb);*/ - - dT0_dVg = AbulkCV * dVdseffCV2_dVg + dAbulkCV_dVg * VdseffCV2; - dT0_dVd = AbulkCV * dVdseffCV2_dVd + dAbulkCV_dVd * VdseffCV2; - dT0_dVb = AbulkCV * dVdseffCV2_dVb + dAbulkCV_dVb * VdseffCV2; - dT0_dVe = AbulkCV * dVdseffCV2_dVe + dAbulkCV_dVe * VdseffCV2; - - dT1_dVg = 12.0 * (dVgsteff2_dVg - 0.5 * dT0_dVg); - dT1_dVd = 12.0 * (dVgsteff2_dVd - 0.5 * dT0_dVd); - dT1_dVb = 12.0 * (dVgsteff2_dVb - 0.5 * dT0_dVb); - dT1_dVe = 12.0 * (dVgsteff2_dVe - 0.5 * dT0_dVe); - - Cbg12 = CoxWLb2 * (T7 * (0.5 - T0 / T1) * dVdseffCV2_dVg - - T7 * VdseffCV2 * ((dT0_dVg - T0 * dT1_dVg / T1) / T1) - - dAbulkCV_dVg * (0.5 * VdseffCV2 - T3) ); - Cbd12 = CoxWLb2 * (T7 * (0.5 - T0 / T1) * dVdseffCV2_dVd - - T7 * VdseffCV2 * ((dT0_dVd - T0 * dT1_dVd / T1) / T1) - - dAbulkCV_dVd * (0.5 * VdseffCV2 - T3) ); - Cbb12 = CoxWLb2 * (T7 * (0.5 - T0 / T1) * dVdseffCV2_dVb - - T7 * VdseffCV2 * ((dT0_dVb - T0 * dT1_dVb / T1) / T1) - - dAbulkCV_dVb * (0.5 * VdseffCV2 - T3) ); - Cbe12 = CoxWLb2 * (T7 * (0.5 - T0 / T1) * dVdseffCV2_dVe - - T7 * VdseffCV2 * ((dT0_dVe - T0 * dT1_dVe / T1) / T1) - - dAbulkCV_dVe * (0.5 * VdseffCV2 - T3) ); - - /* 10 new lines Wagner */ - if (selfheat) { - dTL1_dT = AbulkCV * dVdseffCV2_dT + dAbulkCV_dT * VdseffCV2; - dTL2_dT = 12.0 * (dVgsteff2_dT -0.5 * dTL1_dT); - dTL3_dT = (dVdseffCV2_dT - T2 * dTL2_dT) / T1; - dTL4_dT = T0 * dTL3_dT + dTL1_dT * T2; - dqbulk_dT += CoxWLb2 * - (-dAbulk_dT * (0.5 * VdseffCV2 - T3) - + T7 * (0.5 * dVdseffCV2_dT - dTL4_dT)); - } - else dqbulk_dT += 0; - } - /* end v4.1 */ - } - /* v3.1 */ - - - - /* Total inversion charge */ - T0 = AbulkCV * VdseffCV; - T1 = 12.0 * (Vgsteff - 0.5 * T0 + 1e-20); - /* T2 = VdseffCV / T1; - */ - T2 = T0 / T1; - T3 = T0 * T2; - - /* T4 = (1.0 - 12.0 * T2 * T2 * AbulkCV); - T5 = (6.0 * T0 * (4.0 * Vgsteff - T0) / (T1 * T1) - 0.5); - T6 = 12.0 * T2 * T2 * Vgsteff; - */ - T4 = (1.0 - 12.0 * T2 * T2);/*bug fix */ - T7 = T2 * (2.0 + 6.0 * T2) - 0.5; /*bug fix */ - - T5 = T7 * AbulkCV; - T6 = T7 * VdseffCV; - - /* qinv = CoxWL * (Vgsteff - 0.5 * VdseffCV + T3); - */ - qgate = qinv = CoxWL * (Vgsteff - 0.5 * T0 + T3); /* enhanced line Wagner */ - - here->B4SOIqinv = -qinv; /* for noise v3.2 */ - - /* LFW_FD fix next 3 lines with next 20 lines */ - /* Cgg1 = CoxWL * (T4 + T5 * dVdseffCV_dVg); */ - /* Cgd1 = CoxWL * T5 * dVdseffCV_dVd; */ - /* Cgb1 = CoxWL * (T5 * dVdseffCV_dVb + T6 * dAbulkCV_dVb);*/ - dT0_dVg = dAbulkCV_dVg * VdseffCV + AbulkCV * dVdseffCV_dVg; - dT0_dVd = dAbulkCV_dVd * VdseffCV + AbulkCV * dVdseffCV_dVd; - dT0_dVb = dAbulkCV_dVb * VdseffCV + AbulkCV * dVdseffCV_dVb; - dT0_dVe = dAbulkCV_dVe * VdseffCV + AbulkCV * dVdseffCV_dVe; - - dT1_dVg = 12.0 * (dVgsteff_dVg - 0.5 * dT0_dVg); - dT1_dVd = 12.0 * (dVgsteff_dVd - 0.5 * dT0_dVd); - dT1_dVb = 12.0 * (dVgsteff_dVb - 0.5 * dT0_dVb); - dT1_dVe = 12.0 * (dVgsteff_dVe - 0.5 * dT0_dVe); - - dT2_dVg = (dT0_dVg - T2 * dT1_dVg) / T1; - dT2_dVd = (dT0_dVd - T2 * dT1_dVd) / T1; - dT2_dVb = (dT0_dVb - T2 * dT1_dVb) / T1; - dT2_dVe = (dT0_dVe - T2 * dT1_dVe) / T1; - - dT3_dVg = dT0_dVg * T2 + T0 * dT2_dVg; - dT3_dVd = dT0_dVd * T2 + T0 * dT2_dVd; - dT3_dVb = dT0_dVb * T2 + T0 * dT2_dVb; - dT3_dVe = dT0_dVe * T2 + T0 * dT2_dVe; - - Cgg1 = CoxWL * (dVgsteff_dVg - 0.5 * dT0_dVg + dT3_dVg); - Cgd1 = CoxWL * (dVgsteff_dVd - 0.5 * dT0_dVd + dT3_dVd); - Cgb1 = CoxWL * (dVgsteff_dVb - 0.5 * dT0_dVb + dT3_dVb); - Cge1 = CoxWL * (dVgsteff_dVe - 0.5 * dT0_dVe + dT3_dVe); - - /* 7 new lines Wagner */ - if (selfheat) { - dTL1_dT = AbulkCV * dVdseffCV_dT + dAbulkCV_dT * VdseffCV; - dTL2_dT = 12 * (dVgsteff_dT - 0.5*dTL1_dT); - dTL3_dT = (2 * T0 * dTL1_dT - T3 * dTL2_dT) / T1; - dqgate_dT = CoxWL * (dVgsteff_dT - 0.5* dTL1_dT + dTL3_dT); - } - else dqgate_dT = 0; - - /* v4.1 */ - /* LFW_FD 2 new lines per flexilint */ - T12 = T02 = Cgg12 = Cgd12 = Cgb12 = Cge12 = 0.0; - Csg12 = Csd12 = Csb12 = Cse12 = 0.0; - dqsrc2_dT = 0; /* new line Wagner */ - if ((here->B4SOIsoiMod != 2) && /* Bug fix #10 Jun 09 'opposite type Q/C evaluated only if bodymod=1' */ - (here->B4SOIbodyMod != 0) && here->B4SOIagbcp2 > 0) - { - T02 = AbulkCV * VdseffCV2; - T12 = 12.0 * (Vgsteff2 - 0.5 * T02 + 1e-20); - T2 = T02 / T12; - T3 = T02 * T2; - T4 = (1.0 - 12.0 * T2 * T2); - T7 = T2 * (2.0 + 6.0 * T2) - 0.5; - - T5 = T7 * AbulkCV; - T6 = T7 * VdseffCV2; - - qinv += CoxWL2 * (Vgsteff2 - 0.5 * T02 + T3); - qgate = qinv; /* new line Wagner */ - here->B4SOIqinv = -qinv; - - /* LFW_FD fix next 3 lines with next 20 lines */ - /* Cgg12 = CoxWL2 * (T4 + T5 * dVdseffCV2_dVg); */ - /* Cgd12 = CoxWL2 * T5 * dVdseffCV2_dVd; */ - /* Cgb12 = CoxWL2 * (T5 * dVdseffCV2_dVb + T6 * dAbulkCV_dVb);*/ - - dT02_dVg = dAbulkCV_dVg * VdseffCV2 + AbulkCV * dVdseffCV2_dVg; - dT02_dVd = dAbulkCV_dVd * VdseffCV2 + AbulkCV * dVdseffCV2_dVd; - dT02_dVb = dAbulkCV_dVb * VdseffCV2 + AbulkCV * dVdseffCV2_dVb; - dT02_dVe = dAbulkCV_dVe * VdseffCV2 + AbulkCV * dVdseffCV2_dVe; - - dT12_dVg = 12.0 * (dVgsteff2_dVg - 0.5 * dT02_dVg); - dT12_dVd = 12.0 * (dVgsteff2_dVd - 0.5 * dT02_dVd); - dT12_dVb = 12.0 * (dVgsteff2_dVb - 0.5 * dT02_dVb); - dT12_dVe = 12.0 * (dVgsteff2_dVe - 0.5 * dT02_dVe); - - dT2_dVg = (dT02_dVg - T2 * dT12_dVg) / T12; - dT2_dVd = (dT02_dVd - T2 * dT12_dVd) / T12; - dT2_dVb = (dT02_dVb - T2 * dT12_dVb) / T12; - dT2_dVe = (dT02_dVe - T2 * dT12_dVe) / T12; - - dT3_dVg = dT02_dVg * T2 + T02 * dT2_dVg; - dT3_dVd = dT02_dVd * T2 + T02 * dT2_dVd; - dT3_dVb = dT02_dVb * T2 + T02 * dT2_dVb; - dT3_dVe = dT02_dVe * T2 + T02 * dT2_dVe; - - Cgg12 = CoxWL2 * (dVgsteff2_dVg - 0.5 * dT02_dVg + dT3_dVg); - Cgd12 = CoxWL2 * (dVgsteff2_dVd - 0.5 * dT02_dVd + dT3_dVd); - Cgb12 = CoxWL2 * (dVgsteff2_dVb - 0.5 * dT02_dVb + dT3_dVb); - Cge12 = CoxWL2 * (dVgsteff2_dVe - 0.5 * dT02_dVe + dT3_dVe); - - /* 8 new lines Wagner */ - if (selfheat) { - dTL1_dT = AbulkCV * dVdseffCV2_dT + dAbulkCV_dT * VdseffCV2; - dTL2_dT = 12 * (dVgsteff2_dT - 0.5*dTL1_dT); - dTL3_dT = (2 * T02 * dTL1_dT - T3 * dTL2_dT) / T12; - dqgate2_dT = CoxWL2 * (dVgsteff2_dT - 0.5* dTL1_dT + dTL3_dT); - dqgate_dT += dqgate2_dT; - } - else dqgate_dT = 0; - } - /* end v4.1 */ - /* Inversion charge partitioning into S / D */ - if (model->B4SOIxpart > 0.5) - { /* 0/100 Charge partition model */ - T1 = T1 + T1; - qsrc = -CoxWL * (0.5 * Vgsteff + 0.25 * T0 - - T0 * T0 / T1); - T7 = (4.0 * Vgsteff - T0) / (T1 * T1); - T4 = -(0.5 + 24.0 * T0 * T0 / (T1 * T1)); - T5 = -(0.25 * AbulkCV - 12.0 * AbulkCV * T0 * T7); - T6 = -(0.25 * VdseffCV - 12.0 * T0 * VdseffCV * T7); - /* LFW_FD fix next 3 lines with next 12 lines */ - /* Csg1 = CoxWL * (T4 + T5 * dVdseffCV_dVg); */ - /* Csd1 = CoxWL * T5 * dVdseffCV_dVd; */ - /* Csb1 = CoxWL * (T5 * dVdseffCV_dVb + T6 * dAbulkCV_dVb);*/ - dT1_dVg = 2.0 * dT1_dVg; - dT1_dVd = 2.0 * dT1_dVd; - dT1_dVb = 2.0 * dT1_dVb; - dT1_dVe = 2.0 * dT1_dVe; - - Csg1 = -CoxWL * (0.5 * dVgsteff_dVg + 0.25 * dT0_dVg - - 2.0 * T0 * dT0_dVg / T1 + T0 * T0 * dT1_dVg / (T1 * T1)); - Csd1 = -CoxWL * (0.5 * dVgsteff_dVd + 0.25 * dT0_dVd - - 2.0 * T0 * dT0_dVd / T1 + T0 * T0 * dT1_dVd / (T1 * T1)); - Csb1 = -CoxWL * (0.5 * dVgsteff_dVb + 0.25 * dT0_dVb - - 2.0 * T0 * dT0_dVb / T1 + T0 * T0 * dT1_dVb / (T1 * T1)); - Cse1 = -CoxWL * (0.5 * dVgsteff_dVe + 0.25 * dT0_dVe - - 2.0 * T0 * dT0_dVe / T1 + T0 * T0 * dT1_dVe / (T1 * T1)); - - /* 8 new lines Wagner */ - if (selfheat) { - dTL1_dT = AbulkCV * dVdseffCV_dT + dAbulkCV_dT * VdseffCV; - dTL2_dT = 24 * (dVgsteff_dT - 0.5*dTL1_dT); - dqsrc_dT = -CoxWL*(0.5*dVgsteff_dT + 0.25*dTL1_dT - - 2*T0*dTL1_dT/T1 + - + T0*T0*dTL2_dT/(T1*T1) ); - } - else dqsrc_dT = 0; - - /* v4.1 */ - if ((here->B4SOIsoiMod != 2) && /* Bug fix #10 Jun 09 'opposite type Q/C evaluated only if bodymod=1' */ - (here->B4SOIbodyMod != 0) && here->B4SOIagbcp2 > 0) - { - T12 = T12 + T12; - /*fix below expression Wagner */ - /*qsrc += -CoxWL2 * (0.5 * Vgsteff2 + 0.25 * T02 - - T02 * T02 / T12); */ - qsrc2 = -CoxWL2 * (0.5 * Vgsteff2 + 0.25 * T02 - - T02 * T02 / T12); - T7 = (4.0 * Vgsteff2 - T02) / (T12 * T12); - T4 = -(0.5 + 24.0 * T02 * T02 / (T12 * T12)); - T5 = -(0.25 * AbulkCV - 12.0 * AbulkCV * T02 * T7); - T6 = -(0.25 * VdseffCV2 - 12.0 * T02 * VdseffCV2 * T7); - /* LFW_FD fix next 3 lines with next 12 lines */ - /* Csg12 = CoxWL2 * (T4 + T5 * dVdseffCV2_dVg); */ - /* Csd12 = CoxWL2 * T5 * dVdseffCV2_dVd; */ - /* Csb12 = CoxWL2 * (T5 * dVdseffCV2_dVb + T6 * dAbulkCV_dVb);*/ - dT12_dVg = 2.0 * dT12_dVg; - dT12_dVd = 2.0 * dT12_dVd; - dT12_dVb = 2.0 * dT12_dVb; - dT12_dVe = 2.0 * dT12_dVe; - - Csg12 = -CoxWL2 * (0.5 * dVgsteff2_dVg + 0.25 * dT02_dVg - - 2.0 * T02 * dT02_dVg / T12 + T02 * T02 * dT12_dVg / (T12 * T12)); - Csd12 = -CoxWL2 * (0.5 * dVgsteff2_dVd + 0.25 * dT02_dVd - - 2.0 * T02 * dT02_dVd / T12 + T02 * T02 * dT12_dVd / (T12 * T12)); - Csb12 = -CoxWL2 * (0.5 * dVgsteff2_dVb + 0.25 * dT02_dVb - - 2.0 * T02 * dT02_dVb / T12 + T02 * T02 * dT12_dVb / (T12 * T12)); - Cse12 = -CoxWL2 * (0.5 * dVgsteff2_dVe + 0.25 * dT02_dVe - - 2.0 * T02 * dT02_dVe / T12 + T02 * T02 * dT12_dVe / (T12 * T12)); - /* 11 new lines Wagner */ - if (selfheat) { - dTL1_dT = AbulkCV * dVdseffCV2_dT + dAbulkCV_dT * VdseffCV2; - dTL2_dT = 24 * (dVgsteff2_dT - 0.5*dTL1_dT); - dqsrc2_dT = -CoxWL2*(0.5*dVgsteff2_dT + 0.25*dTL1_dT - - 2*T02*dTL1_dT/T12 + - + T02*T02*dTL2_dT/(T12*T12) ); - } - else dqsrc2_dT = 0; - - qsrc += qsrc2; - dqsrc_dT += dqsrc2_dT; - } - /* end v4.1 */ - - } - else if (model->B4SOIxpart < 0.5) - { /* 40/60 Charge partition model */ - T1 = T1 / 12.0; - T2 = 0.5 * CoxWL / (T1 * T1); - T3 = Vgsteff * (2.0 * T0 * T0 / 3.0 + Vgsteff - * (Vgsteff - 4.0 * T0 / 3.0)) - - 2.0 * T0 * T0 * T0 / 15.0; - qsrc = -T2 * T3; - - /* LFW_FD add next 28 lines of code */ - dT1_dVg = dVgsteff_dVg - 0.5 * dT0_dVg; - dT1_dVd = dVgsteff_dVd - 0.5 * dT0_dVd; - dT1_dVb = dVgsteff_dVb - 0.5 * dT0_dVb; - dT1_dVe = dVgsteff_dVe - 0.5 * dT0_dVe; - - dT2_dVg = - 2.0 * T2 * dT1_dVg / T1; - dT2_dVd = - 2.0 * T2 * dT1_dVd / T1; - dT2_dVb = - 2.0 * T2 * dT1_dVb / T1; - dT2_dVe = - 2.0 * T2 * dT1_dVe / T1; - - dT3_dVg = dVgsteff_dVg * (2.0 * T0 * T0 / 3.0 + Vgsteff * (Vgsteff - 4.0 * T0 / 3.0)) - + Vgsteff * (4.0 * T0 *dT0_dVg /3 + dVgsteff_dVg * (Vgsteff - 4.0 * T0 / 3.0) - + Vgsteff * (dVgsteff_dVg -4.0 * dT0_dVg / 3.0)) - - 2.0 * T0 * T0 * dT0_dVg / 5.0; - dT3_dVd = dVgsteff_dVd * (2.0 * T0 * T0 / 3.0 + Vgsteff * (Vgsteff - 4.0 * T0 / 3.0)) - + Vgsteff * (4.0 * T0 *dT0_dVd /3 + dVgsteff_dVd * (Vgsteff - 4.0 * T0 / 3.0) - + Vgsteff * (dVgsteff_dVd -4.0 * dT0_dVd / 3.0)) - - 2.0 * T0 * T0 * dT0_dVd / 5.0; - dT3_dVb = dVgsteff_dVb * (2.0 * T0 * T0 / 3.0 + Vgsteff * (Vgsteff - 4.0 * T0 / 3.0)) - + Vgsteff * (4.0 * T0 *dT0_dVb /3 + dVgsteff_dVb * (Vgsteff - 4.0 * T0 / 3.0) - + Vgsteff * (dVgsteff_dVb -4.0 * dT0_dVb / 3.0)) - - 2.0 * T0 * T0 * dT0_dVb / 5.0; - dT3_dVe = dVgsteff_dVe * (2.0 * T0 * T0 / 3.0 + Vgsteff * (Vgsteff - 4.0 * T0 / 3.0)) - + Vgsteff * (4.0 * T0 *dT0_dVe /3 + dVgsteff_dVe * (Vgsteff - 4.0 * T0 / 3.0) - + Vgsteff * (dVgsteff_dVe -4.0 * dT0_dVe / 3.0)) - - 2.0 * T0 * T0 * dT0_dVe / 5.0; - - Csg1 = - T2 * dT3_dVg - dT2_dVg * T3; - Csd1 = - T2 * dT3_dVd - dT2_dVd * T3; - Csb1 = - T2 * dT3_dVb - dT2_dVb * T3; - Cse1 = - T2 * dT3_dVe - dT2_dVe * T3; - - /* 13 new lines Wagner */ - if (selfheat) { - dTL1_dT = AbulkCV * dVdseffCV_dT + dAbulkCV_dT * VdseffCV; - dTL2_dT = (dVgsteff_dT - 0.5*dTL1_dT); - dTL3_dT = - CoxWL * dTL2_dT / (T1 * T1 * T1); - dTL4_dT = dVgsteff_dT * (2.0 * T0 * T0 / 3.0 - + Vgsteff * (Vgsteff - 4.0 * T0 / 3.0) ) - + Vgsteff * (4.0 * T0 * dTL1_dT /3.0 - + dVgsteff_dT * (Vgsteff - 4.0 * T0 / 3.0) - + Vgsteff * (dVgsteff_dT -4.0 * dTL1_dT / 3.0) ) - - 2.0 * T0 * T0 * dTL1_dT / 5.0; - dqsrc_dT = -T2*dTL4_dT - dTL3_dT*T3; - } - else dqsrc_dT = 0; - - /* LFW_FD delete next 10 lines of code */ - /* T7 = 4.0 / 3.0 * Vgsteff * (Vgsteff - T0) */ - /* + 0.4 * T0 * T0; */ - /* T4 = -2.0 * qsrc / T1 - T2 * (Vgsteff * (3.0 */ - /* * Vgsteff - 8.0 * T0 / 3.0) */ - /* + 2.0 * T0 * T0 / 3.0); */ - /* T5 = (qsrc / T1 + T2 * T7) * AbulkCV; */ - /* T6 = (qsrc / T1 * VdseffCV + T2 * T7 * VdseffCV);*/ - /* Csg1 = T4 + T5 * dVdseffCV_dVg; */ - /* Csd1 = T5 * dVdseffCV_dVd; */ - /* Csb1 = T5 * dVdseffCV_dVb + T6 * dAbulkCV_dVb; */ - /* v4.1 */ - if ((here->B4SOIsoiMod != 2) && /* Bug fix #10 Jun 09 'opposite type Q/C evaluated only if bodymod=1' */ - (here->B4SOIbodyMod != 0) && here->B4SOIagbcp2 >0) - { - T12 = T12 /12.0; - T2 = 0.5 * CoxWL2 / (T12 * T12); - T3 = Vgsteff2 * (2.0 * T02 * T02 / 3.0 + Vgsteff2 - * (Vgsteff2 - 4.0 * T02 / 3.0)) - - 2.0 * T02 * T02 * T02 / 15.0; - qsrc2 = -T2 * T3; - - T7 = 4.0 / 3.0 * Vgsteff2 * (Vgsteff2 - T02) - + 0.4 * T02 * T02; - T4 = -2.0 * qsrc2 / T12 - T2 * (Vgsteff2 * (3.0 - * Vgsteff2 - 8.0 * T02 / 3.0) - + 2.0 * T02 * T02 / 3.0); - T5 = (qsrc2 / T12 + T2 * T7) * AbulkCV; - T6 = (qsrc2 / T12 * VdseffCV2 + T2 * T7 * VdseffCV2); - /* LFW_FD fix next 3 lines with next 28 lines */ - /* Csg12 = T4 + T5 * dVdseffCV2_dVg; */ - /* Csd12 = T5 * dVdseffCV2_dVd; */ - /* Csb12 = T5 * dVdseffCV2_dVb + T6 * dAbulkCV_dVb;*/ - - dT12_dVg = dVgsteff2_dVg - 0.5 * dT02_dVg; - dT12_dVd = dVgsteff2_dVd - 0.5 * dT02_dVd; - dT12_dVb = dVgsteff2_dVb - 0.5 * dT02_dVb; - dT12_dVe = dVgsteff2_dVe - 0.5 * dT02_dVe; - - dT2_dVg = - 2.0 * T2 * dT12_dVg / T12; - dT2_dVd = - 2.0 * T2 * dT12_dVd / T12; - dT2_dVb = - 2.0 * T2 * dT12_dVb / T12; - dT2_dVe = - 2.0 * T2 * dT12_dVe / T12; - - dT3_dVg = dVgsteff2_dVg * (2.0 * T02 * T02 / 3.0 + Vgsteff2 * (Vgsteff2 - 4.0 * T02 / 3.0)) - + Vgsteff2 * (4.0 * T02 *dT02_dVg /3 + dVgsteff2_dVg * (Vgsteff2 - 4.0 * T02 / 3.0) - + Vgsteff2 * (dVgsteff2_dVg -4.0 * dT02_dVg / 3.0)) - - 2.0 * T02 * T02 * dT02_dVg / 5.0; - dT3_dVd = dVgsteff2_dVd * (2.0 * T02 * T02 / 3.0 + Vgsteff2 * (Vgsteff2 - 4.0 * T02 / 3.0)) - + Vgsteff2 * (4.0 * T02 *dT02_dVd /3 + dVgsteff2_dVd * (Vgsteff2 - 4.0 * T02 / 3.0) - + Vgsteff2 * (dVgsteff2_dVd -4.0 * dT02_dVd / 3.0)) - - 2.0 * T02 * T02 * dT02_dVd / 5.0; - dT3_dVb = dVgsteff2_dVb * (2.0 * T02 * T02 / 3.0 + Vgsteff2 * (Vgsteff2 - 4.0 * T02 / 3.0)) - + Vgsteff2 * (4.0 * T02 *dT02_dVb /3 + dVgsteff2_dVb * (Vgsteff2 - 4.0 * T02 / 3.0) - + Vgsteff2 * (dVgsteff2_dVb -4.0 * dT02_dVb / 3.0)) - - 2.0 * T02 * T02 * dT02_dVb / 5.0; - dT3_dVe = dVgsteff2_dVe * (2.0 * T02 * T02 / 3.0 + Vgsteff2 * (Vgsteff2 - 4.0 * T02 / 3.0)) - + Vgsteff2 * (4.0 * T02 *dT02_dVe /3 + dVgsteff2_dVe * (Vgsteff2 - 4.0 * T02 / 3.0) - + Vgsteff2 * (dVgsteff2_dVe -4.0 * dT02_dVe / 3.0)) - - 2.0 * T02 * T02 * dT02_dVe / 5.0; - - Csg12 = - T2 * dT3_dVg - dT2_dVg * T3; - Csd12 = - T2 * dT3_dVd - dT2_dVd * T3; - Csb12 = - T2 * dT3_dVb - dT2_dVb * T3; - Cse12 = - T2 * dT3_dVe - dT2_dVe * T3; - - /* 13 new lines Wagner */ - if (selfheat) { - dTL1_dT = AbulkCV * dVdseffCV2_dT + dAbulkCV_dT * VdseffCV2; - dTL2_dT = (dVgsteff2_dT - 0.5*dTL1_dT); - dTL3_dT = - CoxWL2 * dTL2_dT / (T12 * T12 * T12); - dTL4_dT = dVgsteff2_dT * (2.0 * T02 * T02 / 3.0 - + Vgsteff2 * (Vgsteff2 - 4.0 * T02 / 3.0) ) - + Vgsteff2 * (4.0 * T02 * dTL1_dT /3.0 - + dVgsteff2_dT * (Vgsteff2 - 4.0 * T02 / 3.0) - + Vgsteff2 * (dVgsteff2_dT -4.0 * dTL1_dT / 3.0) ) - - 2.0 * T02 * T02 * dTL1_dT /5.0; - dqsrc2_dT = -T2*dTL4_dT - dTL3_dT*T3; - } - else dqsrc2_dT = 0; - - qsrc += qsrc2; - dqsrc_dT += dqsrc2_dT; /* new line Wagner */ - } - - /* end v4.1 */ - } - else - { /* 50/50 Charge partition model */ - qsrc = - 0.5 * (qinv + qbulk); - Csg1 = - 0.5 * (Cgg1 + Cbg1); - Csb1 = - 0.5 * (Cgb1 + Cbb1); - Csd1 = - 0.5 * (Cgd1 + Cbd1); - Cse1 = - 0.5 * (Cge1 + Cbe1); /* LFW_FD new line */ - /* v4.1 */ - if ((here->B4SOIsoiMod != 2) && /* Bug fix #10 Jun 09 'opposite type Q/C evaluated only if bodymod=1' */ - (here->B4SOIbodyMod != 0) && here->B4SOIagbcp2 >0) - { - Csg12 = -0.5 * (Cgg12 + Cbg12); - Csb12 = -0.5 * (Cgb12 + Cbb12); - Csd12 = -0.5 * (Cgd12 + Cbd12); - Cse12 = -0.5 * (Cge12 + Cbe12); /* LFW_FD new line */ - } - dqsrc_dT = -0.5 * (dqgate_dT + dqbulk_dT); /* new line Wagner */ - /* end v4.1 */ - } - - - - /* Backgate charge */ - /* v3.1 */ - if (here->B4SOIsoiMod == 2) /* v3.2 */ /* ideal FD */ - { - Qe1 = dQe1_dVb = dQe1_dVe = Ce1T = dQe1_dT = 0; /* enhanced line Wagner */ - } - else /* soiMod = 0 or 1 */ - { - CboxWL = pParam->B4SOIkb1 * model->B4SOIfbody * Cbox - * (pParam->B4SOIweffCV / here->B4SOInseg - * here->B4SOInf /* bugfix_snps nf*/ - * pParam->B4SOIleffCVbg + here->B4SOIaebcp); - Qe1 = CboxWL * (Vesfb - Vbs); - dQe1_dVb = -CboxWL; - dQe1_dVe = CboxWL; - if (selfheat) Ce1T = dQe1_dT = -CboxWL * dvfbb_dT; /* enhanced line Wagner */ - else dQe1_dT = 0; - } - /* v3.1 */ - - - qgate = qinv + Qac0 + Qsub0; - /* LFW_FD commentary only; next 2 lines */ - /* Correct definition of qgate below. Not used because it changes CMC defined model.*/ - /* qgate = qinv + Qac0 + Qsub0 - qbulk;*/ - - qbody = (qbulk - Qac0 - Qsub0 - Qe1); - qsub = Qe1; - qdrn = -(qgate + qsrc + qbody + qsub); - - /* 4 new lines Wagner */ - dqgate_dT = dqgate_dT + dQac0_dT + dQsub0_dT; - dqbody_dT = (dqbulk_dT - dQac0_dT - dQsub0_dT - dQe1_dT); - dqsub_dT = dQe1_dT; - dqdrn_dT = -(dqgate_dT + dqsrc_dT + dqbody_dT + dqsub_dT); - - /* This transform all the dependency on Vgsteff, Vbseff - into real ones */ - Ce1b = dQe1_dVb; - Ce1e = dQe1_dVe; - - /* LFW_FD fix/add next 4 lines */ - Csg = Csg1; - Csd = Csd1; - Csb = Csb1; - Cse = Cse1; - - /*fix expression below Wagner */ - /*if (selfheat) CsT = Csg1 * dVgsteff_dT;*/ - if (selfheat) CsT = dqsrc_dT; - else CsT = 0.0; - - /* LFW_FD fix/add next 4 lines */ - Cgg = Cgg1 + dQsub0_dVg + dQac0_dVg; - Cgd = Cgd1 + dQsub0_dVd + dQac0_dVd; - Cgb = Cgb1 + dQsub0_dVb + dQac0_dVb; - Cge = Cge1 + dQsub0_dVe + dQac0_dVe; - - /* LFW_FD commentary only; next 5 lines */ -/* Use these with correct definition of qgate above */ -/* Cgg = Cgg1 + dQsub0_dVg + dQac0_dVg - Cbg1; */ -/* Cgd = Cgd1 + dQsub0_dVd + dQac0_dVd - Cbd1; */ -/* Cgb = Cgb1 + dQsub0_dVb + dQac0_dVb - Cbb1; */ -/* Cge = Cge1 + dQsub0_dVe + dQac0_dVe - Cbe1; */ - - if (selfheat) - /*fix expression below Wagner */ - /*CgT = (Cgg1 + dQsub0_dVg) * dVgsteff_dT - + dQac0_dT + dQsub0_dT;*/ - CgT = dqgate_dT; - else CgT = 0.0; - - /* LFW_FD fix/add next 4 lines */ - Cbg = Cbg1 - dQac0_dVg - dQsub0_dVg; - Cbd = Cbd1 - dQac0_dVd - dQsub0_dVd; - Cbb = Cbb1 - dQac0_dVb - dQsub0_dVb - Ce1b; - Cbe = Cbe1 - dQac0_dVe - dQsub0_dVe - Ce1e; - - if (selfheat) - /*fix expression below Wagner */ - /*CbT = (Cbg1 - dQsub0_dVg) * dVgsteff_dT - - dQac0_dT - dQsub0_dT - dQe1_dT;*/ - CbT = dqbody_dT; - else CbT = 0.0; - /* v4.1 */ - if ((here->B4SOIsoiMod != 2) && /* Bug fix #10 Jun 09 'opposite type Q/C evaluated only if bodymod=1' */ - (here->B4SOIbodyMod != 0) && here->B4SOIagbcp2 >0) { - /* LFW_FD fixed next 12 lines */ - Csg += Csg12; - Csd += Csd12; - Csb += Csb12; - Cse += Cse12; - - Cgg += Cgg12 + dQsub02_dVg + dQac02_dVg; - Cgd += Cgd12 + dQsub02_dVd + dQac02_dVd; - Cgb += Cgb12 + dQsub02_dVb + dQac02_dVb; - Cge += Cge12 + dQsub02_dVe + dQac02_dVe; - - Cbg += Cbg12 - dQac02_dVg - dQsub02_dVg; - Cbd += Cbd12 - dQac02_dVd - dQsub02_dVd; - Cbb += Cbb12 - dQac02_dVb - dQsub02_dVb; - Cbe += Cbe12 - dQac02_dVe - dQsub02_dVe; - } - /* end v4.1 */ - - here->B4SOIcggb = Cgg ; - here->B4SOIcgsb = - (Cgg + Cgd + Cgb + Cge); /* LFW_FD fixed line */ - here->B4SOIcgdb = Cgd; - here->B4SOIcgeb = Cge; /* LFW_FD new line */ - here->B4SOIcgT = CgT; - - here->B4SOIcbgb = Cbg; - here->B4SOIcbsb = -(Cbg + Cbd + Cbb + Cbe); /* LFW_FD fixed line */ - here->B4SOIcbdb = Cbd; - here->B4SOIcbeb = Cbe; /* LFW_FD fixed line */ - here->B4SOIcbT = CbT; - - here->B4SOIceeb = Ce1e ; - here->B4SOIceT = dQe1_dT; - - here->B4SOIcdgb = -(Cgg + Cbg + Csg); - here->B4SOIcddb = -(Cgd + Cbd + Csd); - here->B4SOIcdeb = -(Cge + Cse + Cbe) - Ce1e; /* LFW_FD fixed line */ - here->B4SOIcdT = -(CgT + CbT + CsT) - dQe1_dT; - here->B4SOIcdsb = Cgg + Cgd + Cgb + Cge /* LFW_FD fixed expression */ - + Cbg + Cbd + Cbb + Cbe + Ce1e - + Csg + Csd + Csb + Cse + Ce1b; - - } /* End of if capMod == 2 */ - - else if (model->B4SOIcapMod == 3) - { - - /* dVgsteff_dVb /= dVbseff_dVb; LFW_FD comment out line */ - if(model->B4SOImtrlMod == 0) - Cox = 3.453133e-11 / model->B4SOItoxp; - else - Cox = epsrox * EPS0 / model->B4SOItoxp; - CoxWL *= toxe/ model->B4SOItoxp; - CoxWLb *= model->B4SOItox/ model->B4SOItoxp; - Tox=1.0e8*model->B4SOItoxp; - - - /* v4.1 */ - if (here->B4SOIagbcp2 > 0) { - /* dVgsteff2_dVb /= dVbseff_dVb; LFW_FD comment out line */ - CoxWL2 *= model->B4SOItox / - model->B4SOItoxp; - CoxWLb2 *= model->B4SOItox/ - model->B4SOItoxp; - } - /* end v4.1 */ - - /* v3.1 */ - /* LFW_FD flexilint inits next 7 lines */ - Vfbzb = pParam->B4SOIvfbzb + pParam->B4SOIdelvt; - dVfbzb_dT = 0.0; - Vfbzb2 = dVfbzb2_dT = 0.0; - Tcen2 = dTcen2_dVg = dTcen2_dVd = dTcen2_dVb = dTcen2_dVe = dTcen2_dT = 0.0; - Coxeff2 = dCoxeff2_dVg = dCoxeff2_dVd = dCoxeff2_dVb = dCoxeff2_dVe = dCoxeff2_dT = 0.0; - CoxWLcenb2= dCoxWLcenb2_dT= 0.0; - dDeltaPhi2_dT = 0.0; - if (here->B4SOIsoiMod == 2) /* v3.2 */ /* ideal FD */ - { - /* LFW_FD enhance next 4 lines */ - Qac0 = dQac0_dVg = dQac0_dVb = dQac0_dVd = dQac0_dVe = dQac0_dT = 0.0; - dQac02_dVg = dQac02_dVb = dQac02_dVd = dQac02_dVe = dQac02_dT = 0.0; - Qsub0 = dQsub0_dVg = dQsub0_dVd = dQsub0_dVb = dQsub0_dVe = dQsub0_dT = 0.0; - dQsub02_dVg = dQsub02_dVd = dQsub02_dVb = dQsub02_dVe = dQsub02_dT = 0.0; - Vfbzb = dVfbzb_dT = 0; /* v4.2 bug fix # 20 */ - } - else /* soiMod = 0 or 1 */ - { - if (selfheat) { - Vfbzb = Vthzb - phi - pParam->B4SOIk1eff * sqrtPhi - + pParam->B4SOIdelvt; - /*fix expression below Wagner */ - /*dVfbzb_dT = dVthzb_dT;*/ - dVfbzb_dT = dVthzb_dT - dphi_dT - pParam->B4SOIk1eff*dsqrtPhi_dT; - } - else { - Vfbzb = here->B4SOIvfbzb + pParam->B4SOIdelvt; - dVfbzb_dT = 0; - } - - V3 = Vfbzb - Vgs_eff + Vbseff - DELTA_3; - if (Vfbzb <= 0.0) - { T0 = sqrt(V3 * V3 - 4.0 * DELTA_3 * Vfbzb); - T2 = -DELTA_3 / T0; - /* dTL0_dT = (V3 * dTL3_dT - 2.0 * DELTA_3 * dVfbzb_dT) / T0; LFW_FD delete line */ - } - else - { T0 = sqrt(V3 * V3 + 4.0 * DELTA_3 * Vfbzb); - T2 = DELTA_3 / T0; - } - - T1 = 0.5 * (1.0 + V3 / T0); - Vfbeff = Vfbzb - 0.5 * (V3 + T0); - /* LFW_FD fix/add next 4 lines */ - dVfbeff_dVg = T1 * (dVgs_eff_dVg - dVbseff_dVg); - dVfbeff_dVd = T1 * ( - dVbseff_dVd); - dVfbeff_dVb = T1 * ( - dVbseff_dVb); - dVfbeff_dVe = T1 * ( - dVbseff_dVe); - /*fix expression below Wagner */ - /*if (selfheat) dVfbeff_dT = (1.0 - T1 - T2) * dVfbzb_dT; - - T1*dVbseff_dT; */ - if (selfheat) dVfbeff_dT = (1.0 - T1 - T2) * dVfbzb_dT - + T1*(dVgs_eff_dT - dVbseff_dT); - else dVfbeff_dT = 0.0; - /* v4.1 */ - if (here->B4SOIagbcp2 >0) { - /* Vfbzb2 = Vfbzb + 1.12; */ - Vfbzb2 = Vfbzb + eggbcp2; /* bugfix v4.3.1 -Tanvir */ - if (selfheat) dVfbzb2_dT = dVfbzb_dT; - else dVfbzb2_dT = 0; - V3 = Vfbzb2 - Vgs_eff2 + Vbseff - DELTA_3; - if (Vfbzb2 <= 0.0) /* Bug fix #12 Jun 09 Vfbzb changed to Vfbzb2 */ - { T0 = sqrt(V3 * V3 - 100.0 * DELTA_3 * Vfbzb2); /* Value of 100 instead of 4 is used to make transition smooth*/ - T2 = -25.0 * DELTA_3 / T0; /* p+/p has same smoothness as n+/p with 100, 4 makes it too steep*/ - } - else - { T0 = sqrt(V3 * V3 + 100.0 * DELTA_3 * Vfbzb2); - T2 = 25.0 * DELTA_3 / T0; - } - T1 = 0.5 * (1.0 + V3 / T0); - Vfbeff2 = Vfbzb2 - 0.5 * (V3 + T0); - /* LFW_FD fix/add next 4 lines */ - dVfbeff2_dVg = T1 * (dVgs_eff2_dVg - dVbseff_dVg); - dVfbeff2_dVd = T1 * ( - dVbseff_dVd); - dVfbeff2_dVb = T1 * ( - dVbseff_dVb); - dVfbeff2_dVe = T1 * ( - dVbseff_dVe); - /*fix expression below Wagner */ - /*if (selfheat) dVfbeff2_dT = (1.0 - T1 - T2) * dVfbzb2_dT;*/ - if (selfheat) dVfbeff2_dT = (1.0 - T1 - T2) * dVfbzb2_dT - - T1*dVbseff_dT; - else dVfbeff2_dT = 0.0; - } - /* end v4.1 */ - - T0 = (Vgs_eff - Vbseff - Vfbzb) / Tox; - /* LFW_FD fix/add next 4 lines */ - dT0_dVg = (dVgs_eff_dVg - dVbseff_dVg) /Tox; - dT0_dVd = - dVbseff_dVd /Tox; - dT0_dVb = - dVbseff_dVb /Tox; - dT0_dVe = - dVbseff_dVe /Tox; - - tmp = T0 * pParam->B4SOIacde; - if ((-EXPL_THRESHOLD < tmp) && (tmp < EXPL_THRESHOLD)) - { Tcen = pParam->B4SOIldeb * exp(tmp); - /* LFW_FD fix/add next 5 lines */ - TL1 = pParam->B4SOIacde * Tcen; - dTcen_dVg = TL1 * dT0_dVg; - dTcen_dVd = TL1 * dT0_dVd; - dTcen_dVb = TL1 * dT0_dVb; - dTcen_dVe = TL1 * dT0_dVe; - if (selfheat) - /* fix below expression Wagner */ - /*dTcen_dT = -Tcen * pParam->B4SOIacde * dVfbzb_dT / Tox; */ - dTcen_dT = Tcen * pParam->B4SOIacde * (dVgs_eff_dT-dVbseff_dT-dVfbzb_dT) / Tox; - else dTcen_dT = 0; - } - else if (tmp <= -EXPL_THRESHOLD) - { Tcen = pParam->B4SOIldeb * MIN_EXPL; - dTcen_dVg = dTcen_dVb = dTcen_dVd = dTcen_dVe = dTcen_dT = 0.0; /* LFW_FD enhance line */ - } - else - { Tcen = pParam->B4SOIldeb * MAX_EXPL; - dTcen_dVg = dTcen_dVb = dTcen_dVd = dTcen_dVe = dTcen_dT = 0.0; /* LFW_FD enhance line */ - } - - /*LINK = 1.0e-3 * (toxe - model->B4SOIdtoxcv); v2.2.3 */ - LINK = 1.0e-3 * model->B4SOItoxp; - V3 = pParam->B4SOIldeb - Tcen - LINK; - V4 = sqrt(V3 * V3 + 4.0 * LINK * pParam->B4SOIldeb); - Tcen = pParam->B4SOIldeb - 0.5 * (V3 + V4); - T1 = 0.5 * (1.0 + V3 / V4); - /* v4.1 small Tcen can introduce numerical issue */ - if (Tcen < 1e-15) - { Tcen = 1e-15; - T1 = 0; - } /* end */ - - dTcen_dVg *= T1; - dTcen_dVb *= T1; - dTcen_dVd *= T1; /* LFW_FD new line */ - dTcen_dVe *= T1; /* LFW_FD new line */ - if (selfheat) - dTcen_dT *= T1; - else dTcen_dT = 0; - /* v4.1 */ - if (here->B4SOIagbcp2 > 0) { - T0 = (Vgs_eff2 - Vbseff - Vfbzb2) / Tox; - /* LFW_FD fix/add next 4 lines */ - dT0_dVg = (dVgs_eff2_dVg - dVbseff_dVg) / Tox; - dT0_dVd = -dVbseff_dVd / Tox; - dT0_dVb = -dVbseff_dVb / Tox; - dT0_dVe = -dVbseff_dVe / Tox; - - tmp = T0 * pParam->B4SOIacde; - if ((-EXPL_THRESHOLD < tmp) && (tmp < EXPL_THRESHOLD)) - { Tcen2 = pParam->B4SOIldeb * exp(tmp); - /* LFW_FD fix/add next 4 lines */ - dTcen2_dVg = pParam->B4SOIacde * Tcen2 * dT0_dVg; - dTcen2_dVd = pParam->B4SOIacde * Tcen2 * dT0_dVd; - dTcen2_dVb = pParam->B4SOIacde * Tcen2 * dT0_dVb; - dTcen2_dVe = pParam->B4SOIacde * Tcen2 * dT0_dVe; - if (selfheat) - dTcen2_dT = -Tcen2 * pParam->B4SOIacde * dVfbzb2_dT / Tox; - else dTcen2_dT = 0; - } - else if (tmp <= -EXPL_THRESHOLD) - { Tcen2 = pParam->B4SOIldeb * MIN_EXPL; - dTcen2_dVg = dTcen2_dVd = dTcen2_dVb = dTcen2_dVe = dTcen2_dT = 0.0; /* LFW_FD enhance line */ - } - else - { Tcen2 = pParam->B4SOIldeb * MAX_EXPL; - dTcen2_dVg = dTcen2_dVd = dTcen2_dVb = dTcen2_dVe = dTcen2_dT = 0.0; /* LFW_FD enhance line */ - } - - V3 = pParam->B4SOIldeb - Tcen2 - LINK; - V4 = sqrt(V3 * V3 + 4.0 * LINK * pParam->B4SOIldeb); - Tcen2 = pParam->B4SOIldeb - 0.5 * (V3 + V4); - T1 = 0.5 * (1.0 + V3 / V4); - - if (Tcen2 < 1e-15) - { Tcen2 = 1e-15; - T1 = 0; - } - dTcen2_dVg *= T1; - dTcen2_dVb *= T1; - dTcen2_dVd *= T1; /* LFW_FD new line */ - dTcen2_dVe *= T1; /* LFW_FD new line */ - if (selfheat) - dTcen2_dT *= T1; - else dTcen2_dT = 0; - } - /* end v4.1 */ - - Ccen = epssub / Tcen; - T2 = Cox / (Cox + Ccen); - Coxeff = T2 * Ccen; - T3 = -Ccen / Tcen; - /* LFW_FD fix/add next 5 lines */ - TL1 = T2 * T2 * T3; - dCoxeff_dVg = TL1 * dTcen_dVg; - dCoxeff_dVd = TL1 * dTcen_dVd; - dCoxeff_dVb = TL1 * dTcen_dVb; - dCoxeff_dVe = TL1 * dTcen_dVe; - if (selfheat) - /*fix expression below Wagner */ - /*dCoxeff_dT = T3 * dTcen_dT * (T2 - Coxeff / (Cox + Ccen));*/ - dCoxeff_dT = - Coxeff * T2 * dTcen_dT / Tcen; - else dCoxeff_dT = 0; - /* v4.1 */ - if ((here->B4SOIsoiMod != 2) && /* Bug fix #10 Jun 09 'opposite type Q/C evaluated only if bodymod=1' */ - (here->B4SOIbodyMod != 0) && here->B4SOIagbcp2 > 0) { - /* Ccen2 = EPSSI / Tcen2; */ /* Bug Fix # 30 Jul09 EPSSI changed to epssub */ - Ccen2 = epssub / Tcen2; - T2 = Cox / (Cox + Ccen2); - Coxeff2 = T2 * Ccen2; - T3 = -Ccen2 / Tcen2; - /* LFW_FD fix/add next 5 lines */ - TL1 = T2 * T2 * T3; - dCoxeff2_dVg = TL1 * dTcen2_dVg; - dCoxeff2_dVd = TL1 * dTcen2_dVd; - dCoxeff2_dVb = TL1 * dTcen2_dVb; - dCoxeff2_dVe = TL1 * dTcen2_dVe; - if (selfheat) - /*fix expression below Wagner */ - /*dCoxeff2_dT = T3 * dTcen2_dT * (T2 - Coxeff2 / (Cox + Ccen2));*/ - dCoxeff2_dT = - Coxeff2 * T2 * dTcen2_dT / Tcen2; - else dCoxeff2_dT = 0; - } - /* end v4.1 */ - CoxWLcenb = CoxWLb * Coxeff / Cox; - if (selfheat) - dCoxWLcenb_dT = CoxWLb * dCoxeff_dT / Cox; - else dCoxWLcenb_dT = 0; - /* v4.1 */ - if (here->B4SOIagbcp2 > 0) { - CoxWLcenb2 = CoxWLb2 * Coxeff2 / Cox; - if (selfheat) - dCoxWLcenb2_dT = CoxWLb2 * dCoxeff2_dT / Cox; - else dCoxWLcenb2_dT = 0; - } - /* end v4.1 */ - Qac0 = CoxWLcenb * (Vfbeff - Vfbzb); - QovCox = Qac0 / Coxeff; - /* LFW_FD fix/add next 4 lines */ - dQac0_dVg = CoxWLcenb * dVfbeff_dVg + QovCox * dCoxeff_dVg; - dQac0_dVb = CoxWLcenb * dVfbeff_dVb + QovCox * dCoxeff_dVb; - dQac0_dVd = CoxWLcenb * dVfbeff_dVd + QovCox * dCoxeff_dVd; - dQac0_dVe = CoxWLcenb * dVfbeff_dVe + QovCox * dCoxeff_dVe; - if (selfheat) dQac0_dT = CoxWLcenb * (dVfbeff_dT - dVfbzb_dT) - + dCoxWLcenb_dT * (Vfbeff - Vfbzb); - else dQac0_dT = 0.0; - /* v4.1 */ - if ((here->B4SOIsoiMod != 2) && /* Bug fix #10 Jun 09 'opposite type Q/C evaluated only if bodymod=1' */ - (here->B4SOIbodyMod != 0) && here->B4SOIagbcp2 > 0) { - Qac02 = CoxWLcenb2 * (Vfbeff2 - Vfbzb2); - QovCox2 = Qac02 / Coxeff2; - /* LFW_FD fix/add next 4 lines */ - dQac02_dVg = CoxWLcenb2 * dVfbeff2_dVg + QovCox2 * dCoxeff2_dVg; - dQac02_dVd = CoxWLcenb2 * dVfbeff2_dVd + QovCox2 * dCoxeff2_dVd; - dQac02_dVb = CoxWLcenb2 * dVfbeff2_dVb + QovCox2 * dCoxeff2_dVb; - dQac02_dVe = CoxWLcenb2 * dVfbeff2_dVe + QovCox2 * dCoxeff2_dVe; - if (selfheat) dQac02_dT = CoxWLcenb2 * (dVfbeff2_dT - dVfbzb2_dT) - + dCoxWLcenb2_dT * (Vfbeff2 - Vfbzb2); - else dQac02_dT = 0.0; - - Qac0 += Qac02; - dQac0_dT += dQac02_dT; /* new line Wagner */ - } - /* end v4.1 */ - - T0 = 0.5 * pParam->B4SOIk1ox; - T3 = Vgs_eff - Vfbeff - Vbseff - Vgsteff; - if (pParam->B4SOIk1ox == 0.0) - { T1 = 0.0; - T2 = 0.0; - } - else if (T3 < 0.0) - { T1 = T0 + T3 / pParam->B4SOIk1ox; - T2 = CoxWLcenb; - } - else - { T1 = sqrt(T0 * T0 + T3); - T2 = CoxWLcenb * T0 / T1; - } - - Qsub0 = CoxWLcenb * pParam->B4SOIk1ox * (T1 - T0); - QovCox = Qsub0 / Coxeff; - /* LFW_FD fix/add next 4 lines */ - dQsub0_dVg = T2 * (dVgs_eff_dVg - dVfbeff_dVg - dVbseff_dVg - dVgsteff_dVg) + QovCox * dCoxeff_dVg; - dQsub0_dVd = -T2 * (dVfbeff_dVd + dVbseff_dVd + dVgsteff_dVd) + QovCox * dCoxeff_dVd; - dQsub0_dVb = -T2 * (dVfbeff_dVb + dVbseff_dVb + dVgsteff_dVb) + QovCox * dCoxeff_dVb; - dQsub0_dVe = -T2 * (dVfbeff_dVe + dVbseff_dVe + dVgsteff_dVe) + QovCox * dCoxeff_dVe; - - if (selfheat) - /*fix 1st line of expression below Wagner */ - /*dQsub0_dT = -T2 * (dVfbeff_dT + dVgsteff_dT)*/ - dQsub0_dT = T2 * (dVgs_eff_dT - dVfbeff_dT - dVbseff_dT - dVgsteff_dT) - + dCoxWLcenb_dT * pParam->B4SOIk1ox * (T1 - T0); - else dQsub0_dT = 0.0; - - /* v4.1 */ - if ((here->B4SOIsoiMod != 2) && /* Bug fix #10 Jun 09 'opposite type Q/C evaluated only if bodymod=1' */ - (here->B4SOIbodyMod != 0) && here->B4SOIagbcp2 > 0) { - T3 = Vgs_eff2 - Vfbeff2 - Vbseff - Vgsteff2; - if (pParam->B4SOIk1ox == 0.0) - { T1 = 0.0; - T2 = 0.0; - } - else if (T3 < 0.0) - { T1 = T0 + T3 / pParam->B4SOIk1ox; - T2 = CoxWLcenb2; - } - else - { T1 = sqrt(T0 * T0 + T3); - T2 = CoxWLcenb2 * T0 / T1; - } - - Qsub02 = CoxWLcenb2 * pParam->B4SOIk1ox * (T1 - T0); - QovCox2 = Qsub02 / Coxeff2; - /* LFW_FD fix/add next 4 lines */ - dQsub02_dVg = T2 * (dVgs_eff2_dVg - dVfbeff2_dVg - dVbseff_dVg - dVgsteff2_dVg) + QovCox2 * dCoxeff2_dVg; - dQsub02_dVd = -T2 * (dVfbeff2_dVd + dVbseff_dVd + dVgsteff2_dVd) + QovCox2 * dCoxeff2_dVd; - dQsub02_dVb = -T2 * (dVfbeff2_dVb + dVbseff_dVb + dVgsteff2_dVb) + QovCox2 * dCoxeff2_dVb; - dQsub02_dVe = -T2 * (dVfbeff2_dVe + dVbseff_dVe + dVgsteff2_dVe) + QovCox2 * dCoxeff2_dVe; - - if (selfheat) - dQsub02_dT = -T2 * (dVfbeff2_dT + dVgsteff2_dT) - + dCoxWLcenb2_dT * pParam->B4SOIk1ox * (T1 - T0); - else dQsub02_dT = 0.0; - - Qsub0 += Qsub02; - dQsub0_dT += dQsub02_dT; /* new line Wagner */ - } - /* end v4.1 */ - - } - /* v3.1 */ - - - /* Gate-bias dependent delta Phis begins */ - if (pParam->B4SOIk1ox <= 0.0) - { Denomi = 0.25 * pParam->B4SOImoin * Vtm; - T0 = 0.5 * pParam->B4SOIsqrtPhi; - } - else - { Denomi = pParam->B4SOImoin * Vtm - * pParam->B4SOIk1ox * pParam->B4SOIk1ox; - T0 = pParam->B4SOIk1ox * pParam->B4SOIsqrtPhi; - } - T1 = 2.0 * T0 + Vgsteff; - - DeltaPhi = Vtm * log(1.0 + T1 * Vgsteff / Denomi); - /* LFW_FD fix/add next 5 lines */ - dDeltaPhi_dVg = 2.0 * Vtm * (T1 -T0) / (Denomi + T1 * Vgsteff) * dVgsteff_dVg; - dDeltaPhi_dVd = 2.0 * Vtm * (T1 -T0) / (Denomi + T1 * Vgsteff) * dVgsteff_dVd; - dDeltaPhi_dVb = 2.0 * Vtm * (T1 -T0) / (Denomi + T1 * Vgsteff) * dVgsteff_dVb; - dDeltaPhi_dVe = 2.0 * Vtm * (T1 -T0) / (Denomi + T1 * Vgsteff) * dVgsteff_dVe; - - DeltaPhi2 = dDeltaPhi2_dVg = dDeltaPhi2_dVd = dDeltaPhi2_dVb = dDeltaPhi2_dVe = 0.0; /* flexilint */ - - /* 7 new lines Wagner */ - if (selfheat) { - TL1 = 1.0 + T1 * Vgsteff / Denomi; - dTL1_dT = (2*(T0+Vgsteff)*dVgsteff_dT/Denomi) - - (T1 * Vgsteff / (Denomi*Vtm))*dVtm_dT; - dDeltaPhi_dT = dVtm_dT * log(TL1) + (Vtm/TL1)*dTL1_dT; - } - else dDeltaPhi_dT = 0.0; - - /* v4.1 */ - if (here->B4SOIagbcp2 > 0) { - T1 = 2.0 * T0 + Vgsteff2; - DeltaPhi2 = Vtm * log(1.0 + T1 * Vgsteff2 / Denomi); - /* LFW_FD fix/add next 4 lines */ - dDeltaPhi2_dVg = 2.0 * Vtm * (T1 -T0) / (Denomi + T1 * Vgsteff2) * dVgsteff2_dVg; - dDeltaPhi2_dVd = 2.0 * Vtm * (T1 -T0) / (Denomi + T1 * Vgsteff2) * dVgsteff2_dVd; - dDeltaPhi2_dVb = 2.0 * Vtm * (T1 -T0) / (Denomi + T1 * Vgsteff2) * dVgsteff2_dVb; - dDeltaPhi2_dVe = 2.0 * Vtm * (T1 -T0) / (Denomi + T1 * Vgsteff2) * dVgsteff2_dVe; - - /* 7 new lines Wagner */ - if (selfheat) { - TL1 = 1.0 + T1 * Vgsteff2 / Denomi; - dTL1_dT = (2*(T0+Vgsteff2)*dVgsteff2_dT/Denomi) - - (T1 * Vgsteff2 / (Denomi*Vtm))*dVtm_dT; - dDeltaPhi2_dT = dVtm_dT * log(TL1) + (Vtm/TL1)*dTL1_dT; - } - else dDeltaPhi2_dT = 0.0; - } - /* end v4.1 */ - /* End of delta Phis */ - - - /* v3.1.1 bug fix for discontinuity */ - T3 = 4.0 * (Vth - Vfbzb - phi); - T2 = sqrt(T3*T3 + 0.0001); - T5 = 0.5 * (1 + T3/T2); - T4 = 0.5 * (T3 + T2); - - Tox += Tox; - T0 = (Vgsteff + T4) / Tox; - tmp = exp(0.7 * log(T0)); - T1 = 1.0 + tmp; - T2 = 0.7 * tmp / (T0 * Tox); - Tcen = 1.9e-9 / T1; - /* LFW_FD fix/add next 5 lines */ - TL1 = dTcen_dVg = -Tcen * T2 / T1; - dTcen_dVg = TL1 * (T5 * 4.0 * dVth_dVg + dVgsteff_dVg); - dTcen_dVd = TL1 * (T5 * 4.0 * dVth_dVd + dVgsteff_dVd); - dTcen_dVb = TL1 * (T5 * 4.0 * dVth_dVb + dVgsteff_dVb); - dTcen_dVe = TL1 * (T5 * 4.0 * dVth_dVe + dVgsteff_dVe); - - if (selfheat) - /*fix below expression Wagner */ - /*dTcen_dT = -Tcen * T2 / T1 - * (T5 * 4.0 * (dVth_dT - dVfbzb_dT) + dVgsteff_dT);*/ - dTcen_dT = -Tcen * T2 / T1 - * (T5 * 4.0 * (dVth_dT - dVfbzb_dT - dphi_dT) + dVgsteff_dT); - else dTcen_dT = 0; - - - Ccen = epssub / Tcen; - T0 = Cox / (Cox + Ccen); - Coxeff = T0 * Ccen; - T1 = -Ccen / Tcen; - /* LFW_FD fix/add next 5 lines */ - TL1 = dCoxeff_dVg = T0 * T0 * T1; - dCoxeff_dVg = TL1 * dTcen_dVg; - dCoxeff_dVd = TL1 * dTcen_dVd; - dCoxeff_dVb = TL1 * dTcen_dVb; - dCoxeff_dVe = TL1 * dTcen_dVe; - - if (selfheat) - /*dCoxeff_dT = T1 * dTcen_dT * (T0 - Coxeff / (Cox + Ccen));*/ - dCoxeff_dT = TL1 * dTcen_dT; /* LFW_FD fix line */ - else dCoxeff_dT = 0; - CoxWLcen = CoxWL * Coxeff / Cox; - CoxWLcenb = CoxWLb * Coxeff / Cox; - /* 3 new lines Wagner*/ - if (selfheat) - dCoxWLcenb_dT = CoxWLb * dCoxeff_dT / Cox; - else dCoxWLcenb_dT = 0; - /* v4.1 */ - CoxWLcen2 = 0.0; /* flexilint */ - if ((here->B4SOIsoiMod != 2) && /* Bug fix #10 Jun 09 'opposite type Q/C evaluated only if bodymod=1' */ - (here->B4SOIbodyMod != 0) && here->B4SOIagbcp2 > 0) { - /* T3 = 4.0 * (Vth + 1.12 - Vfbzb2 - phi); */ - T3 = 4.0 * (Vth + eggbcp2 - Vfbzb2 - phi); /* bugfix v4.3.1 -Tanvir */ - T2 = sqrt(T3*T3 + 0.0001); - T5 = 0.5 * (1 + T3/T2); - T4 = 0.5 * (T3 + T2); - /* Tox += Tox; */ - T0 = (Vgsteff2 + T4) / Tox; - tmp = exp(0.7 * log(T0)); - T1 = 1.0 + tmp; - T2 = 0.7 * tmp / (T0 * Tox); - Tcen2 = 1.9e-9 / T1; - /* LFW_FD fix/add next 5 lines */ - TL1 = dTcen2_dVg = -Tcen2 * T2 / T1; - dTcen2_dVg = TL1 * (T5 * 4.0 * dVth_dVg + dVgsteff2_dVg); - dTcen2_dVd = TL1 * (T5 * 4.0 * dVth_dVd + dVgsteff2_dVd); - dTcen2_dVb = TL1 * (T5 * 4.0 * dVth_dVb + dVgsteff2_dVb); - dTcen2_dVe = TL1 * (T5 * 4.0 * dVth_dVe + dVgsteff2_dVe); - - if (selfheat) - /*fix below expression Wagner */ - /*dTcen2_dT = -Tcen2 * T2 / T1 - * (T5 * 4.0 * (dVth_dT - dVfbzb2_dT) + dVgsteff2_dT); */ - dTcen2_dT = -Tcen2 * T2 / T1 - * (T5 * 4.0 * (dVth_dT - dVfbzb2_dT - dphi_dT) + dVgsteff2_dT); - else dTcen2_dT = 0; - /*Ccen2 = EPSSI / Tcen2;*//*Bug Fix # 30 Jul09*/ - Ccen2 = epssub/ Tcen2; - T0 = Cox / (Cox + Ccen2); - Coxeff2 = T0 * Ccen2; - T1 = -Ccen2 / Tcen2; - /* LFW_FD fix/add next 5 lines */ - TL1 = dCoxeff2_dVg = T0 * T0 * T1; - dCoxeff2_dVg = TL1 * dTcen2_dVg; - dCoxeff2_dVd = TL1 * dTcen2_dVd; - dCoxeff2_dVb = TL1 * dTcen2_dVb; - dCoxeff2_dVe = TL1 * dTcen2_dVe; - - if (selfheat) - dCoxeff2_dT = T1 * dTcen2_dT * (T0 - Coxeff2 / (Cox + Ccen2)); - else dCoxeff2_dT = 0; - CoxWLcen2 = CoxWL2 * Coxeff2 / Cox; - CoxWLcenb2 = CoxWLb2 * Coxeff2 / Cox; - /* 3 new lines Wagner */ - if (selfheat) - dCoxWLcenb2_dT = CoxWLb2 * dCoxeff2_dT / Cox; - else dCoxWLcenb2_dT = 0; - } - /* end v4.1 */ - - AbulkCV = Abulk0 * pParam->B4SOIabulkCVfactor; - /* LFW_FD fix/add next 4 lines */ - dAbulkCV_dVg = pParam->B4SOIabulkCVfactor * dAbulk0_dVg; - dAbulkCV_dVb = pParam->B4SOIabulkCVfactor * dAbulk0_dVb; - dAbulkCV_dVd = pParam->B4SOIabulkCVfactor * dAbulk0_dVd; - dAbulkCV_dVe = pParam->B4SOIabulkCVfactor * dAbulk0_dVe; - /* 3 new lines Wagner */ - if (selfheat) - dAbulkCV_dT = dAbulk0_dT * pParam->B4SOIabulkCVfactor; - else dAbulkCV_dT = 0; - - VdsatCV = (Vgsteff - DeltaPhi) / AbulkCV; - /* LFW_FD add next 4 lines */ - dVdsatCV_dVg = (dVgsteff_dVg - dDeltaPhi_dVg - VdsatCV * dAbulkCV_dVg) / AbulkCV; - dVdsatCV_dVd = (dVgsteff_dVd - dDeltaPhi_dVd - VdsatCV * dAbulkCV_dVd) / AbulkCV; - dVdsatCV_dVb = (dVgsteff_dVb - dDeltaPhi_dVb - VdsatCV * dAbulkCV_dVb) / AbulkCV; - dVdsatCV_dVe = (dVgsteff_dVe - dDeltaPhi_dVe - VdsatCV * dAbulkCV_dVe) / AbulkCV; - - V4 = VdsatCV - Vds - DELTA_4; - T0 = sqrt(V4 * V4 + 4.0 * DELTA_4 * VdsatCV); - VdseffCV = VdsatCV - 0.5 * (V4 + T0); - T1 = 0.5 * (1.0 + V4 / T0); - T2 = DELTA_4 / T0; - T3 = (1.0 - T1 - T2) / AbulkCV; - T4 = T3 * ( 1.0 - dDeltaPhi_dVg); - /* LFW_FD fix/add next 4 lines */ - dVdseffCV_dVg = (1.0 - T1 - T2) * dVdsatCV_dVg; - dVdseffCV_dVd = (1.0 - T1 - T2) * dVdsatCV_dVd + T1; - dVdseffCV_dVb = (1.0 - T1 - T2) * dVdsatCV_dVb; - dVdseffCV_dVe = (1.0 - T1 - T2) * dVdsatCV_dVe; - /* 10 new lines Wagner */ - if (selfheat) { - dVdsatCV_dT = (dVgsteff_dT-dDeltaPhi_dT)/AbulkCV - -VdsatCV*dAbulkCV_dT/AbulkCV; - dTL1_dT = (V4 + 2.0 * DELTA_4) * dVdsatCV_dT / T0; - dVdseffCV_dT = 0.5*dVdsatCV_dT - 0.5*dTL1_dT; - } - else { - dVdsatCV_dT = 0; - dVdseffCV_dT = 0; - } - - T0 = AbulkCV * VdseffCV; - T1 = Vgsteff - DeltaPhi; - T2 = 12.0 * (T1 - 0.5 * T0 + 1.0e-20); - T3 = T0 / T2; - T4 = 1.0 - 12.0 * T3 * T3; - T5 = AbulkCV * (6.0 * T0 * (4.0 * T1 - T0) / (T2 * T2) - 0.5); - T6 = T5 * VdseffCV / AbulkCV; - - /* LFW_FD add next 16 lines */ - dT0_dVg = dAbulkCV_dVg * VdseffCV + AbulkCV * dVdseffCV_dVg; - dT0_dVd = dAbulkCV_dVd * VdseffCV + AbulkCV * dVdseffCV_dVd; - dT0_dVb = dAbulkCV_dVb * VdseffCV + AbulkCV * dVdseffCV_dVb; - dT0_dVe = dAbulkCV_dVe * VdseffCV + AbulkCV * dVdseffCV_dVe; - - dT1_dVg = dVgsteff_dVg - dDeltaPhi_dVg; - dT1_dVd = dVgsteff_dVd - dDeltaPhi_dVd; - dT1_dVb = dVgsteff_dVb - dDeltaPhi_dVb; - dT1_dVe = dVgsteff_dVe - dDeltaPhi_dVe; - - dT2_dVg = 12.0 * (dT1_dVg - 0.5 * dT0_dVg); - dT2_dVd = 12.0 * (dT1_dVd - 0.5 * dT0_dVd); - dT2_dVb = 12.0 * (dT1_dVb - 0.5 * dT0_dVb); - dT2_dVe = 12.0 * (dT1_dVe - 0.5 * dT0_dVe); - - dT3_dVg = (dT0_dVg - T3 * dT2_dVg) / T2; - dT3_dVd = (dT0_dVd - T3 * dT2_dVd) / T2; - dT3_dVb = (dT0_dVb - T3 * dT2_dVb) / T2; - dT3_dVe = (dT0_dVe - T3 * dT2_dVe) / T2; - - qgate1 = qinv = qgate = qinoi = CoxWLcen * (T1 - T0 * (0.5 - T3)); /* enhanced line Wagner */ - QovCox = qgate / Coxeff; - /* LFW_FD fix/add next 4 lines */ - Cgg1 = CoxWLcen * (dT1_dVg - dT0_dVg * (0.5 - T3) + T0 * dT3_dVg) + QovCox * dCoxeff_dVg; - Cgd1 = CoxWLcen * (dT1_dVd - dT0_dVd * (0.5 - T3) + T0 * dT3_dVd) + QovCox * dCoxeff_dVd; - Cgb1 = CoxWLcen * (dT1_dVb - dT0_dVb * (0.5 - T3) + T0 * dT3_dVb) + QovCox * dCoxeff_dVb; - Cge1 = CoxWLcen * (dT1_dVe - dT0_dVe * (0.5 - T3) + T0 * dT3_dVe) + QovCox * dCoxeff_dVe; - /* 10 new lines Wagner */ - if (selfheat) { - dTL1_dT = AbulkCV * dVdseffCV_dT + dAbulkCV_dT * VdseffCV; - dTL2_dT = 12 * (dVgsteff_dT - dDeltaPhi_dT - 0.5*dTL1_dT); - dTL3_dT = dTL1_dT/T2 - (T3/T2)*dTL2_dT; - dqgate_dT = (qgate * dCoxeff_dT / Coxeff) - + CoxWLcen * (dVgsteff_dT - dDeltaPhi_dT - - dTL1_dT*(0.5-T3) - + T0*dTL3_dT); - } - else dqgate_dT = 0; - - /* LFW_FD 2 new lines per flexilint */ - T02 = T12 = T22 = T52 = 0.0; /* flexilint */ - Cgg12 = Cgd12 = Cgb12 = Cge12 = 0.0; - /* v4.1 */ - if ((here->B4SOIsoiMod != 2) && /* Bug fix #10 Jun 09 'opposite type Q/C evaluated only if bodymod=1' */ - (here->B4SOIbodyMod != 0) && here->B4SOIagbcp2 > 0) { - VdsatCV2 = (Vgsteff2 - DeltaPhi2) / AbulkCV; - /* LFW_FD add next 4 lines */ - dVdsatCV2_dVg = (dVgsteff2_dVg - dDeltaPhi2_dVg - VdsatCV2 * dAbulkCV_dVg) / AbulkCV; - dVdsatCV2_dVd = (dVgsteff2_dVd - dDeltaPhi2_dVd - VdsatCV2 * dAbulkCV_dVd) / AbulkCV; - dVdsatCV2_dVb = (dVgsteff2_dVb - dDeltaPhi2_dVb - VdsatCV2 * dAbulkCV_dVb) / AbulkCV; - dVdsatCV2_dVe = (dVgsteff2_dVe - dDeltaPhi2_dVe - VdsatCV2 * dAbulkCV_dVe) / AbulkCV; - - V4 = VdsatCV2 - Vds - DELTA_4; - T02 = sqrt(V4 * V4 + 4.0 * DELTA_4 * VdsatCV2); - VdseffCV2 = VdsatCV2 - 0.5 * (V4 + T02); - T12 = 0.5 * (1.0 + V4 / T02); - T22 = DELTA_4 / T02; - T3 = (1.0 - T12 - T22) / AbulkCV; - T4 = T3 * ( 1.0 - dDeltaPhi2_dVg); - /* LFW_FD fix/add next 4 lines */ - dVdseffCV2_dVg = (1.0 - T12 - T22) * dVdsatCV2_dVg; - dVdseffCV2_dVd = (1.0 - T12 - T22) * dVdsatCV2_dVd + T12; - dVdseffCV2_dVb = (1.0 - T12 - T22) * dVdsatCV2_dVb; - dVdseffCV2_dVe = (1.0 - T12 - T22) * dVdsatCV2_dVe; - - /* 10 new lines Wagner */ - if (selfheat) { - dVdsatCV2_dT = (dVgsteff2_dT-dDeltaPhi2_dT)/AbulkCV - -VdsatCV2*dAbulkCV_dT/AbulkCV; - dTL1_dT = (V4 + 2.0 * DELTA_4) * dVdsatCV2_dT / T02; - dVdseffCV2_dT = 0.5*dVdsatCV2_dT - 0.5*dTL1_dT; - } - else { - dVdsatCV2_dT = 0; - dVdseffCV2_dT = 0; - } - - T02 = AbulkCV * VdseffCV2; - T12 = Vgsteff2 - DeltaPhi2; - T22 = 12.0 * (T12 - 0.5 * T02 + 1.0e-20); - T3 = T02 / T22; - T4 = 1.0 - 12.0 * T3 * T3; - T52 = AbulkCV * (6.0 * T02 * (4.0 * T12 - T02) / (T22 * T22) - 0.5); - T6 = T52 * VdseffCV2 / AbulkCV; - /* LFW_FD add next 16 lines */ - dT02_dVg = dAbulkCV_dVg * VdseffCV2 + AbulkCV * dVdseffCV2_dVg; - dT02_dVd = dAbulkCV_dVd * VdseffCV2 + AbulkCV * dVdseffCV2_dVd; - dT02_dVb = dAbulkCV_dVb * VdseffCV2 + AbulkCV * dVdseffCV2_dVb; - dT02_dVe = dAbulkCV_dVe * VdseffCV2 + AbulkCV * dVdseffCV2_dVe; - - dT12_dVg = dVgsteff2_dVg - dDeltaPhi2_dVg; - dT12_dVd = dVgsteff2_dVd - dDeltaPhi2_dVd; - dT12_dVb = dVgsteff2_dVb - dDeltaPhi2_dVb; - dT12_dVe = dVgsteff2_dVe - dDeltaPhi2_dVe; - - dT22_dVg = 12.0 * (dT12_dVg - 0.5 * dT02_dVg); - dT22_dVd = 12.0 * (dT12_dVd - 0.5 * dT02_dVd); - dT22_dVb = 12.0 * (dT12_dVb - 0.5 * dT02_dVb); - dT22_dVe = 12.0 * (dT12_dVe - 0.5 * dT02_dVe); - - dT3_dVg = (dT02_dVg - T3 * dT22_dVg) / T22; - dT3_dVd = (dT02_dVd - T3 * dT22_dVd) / T22; - dT3_dVb = (dT02_dVb - T3 * dT22_dVb) / T22; - dT3_dVe = (dT02_dVe - T3 * dT22_dVe) / T22; - - T7 = CoxWLcen2 * (T12 - T02 * (0.5 - T3)); - qinv += T7; - qgate = qinoi = qinv; - QovCox2 = T7 / Coxeff2; - /* LFW_FD fix/add next 4 lines */ - Cgg12 = CoxWLcen2 * (dT12_dVg - dT02_dVg * (0.5 - T3) + T02 * dT3_dVg) + QovCox2 * dCoxeff2_dVg; - Cgd12 = CoxWLcen2 * (dT12_dVd - dT02_dVd * (0.5 - T3) + T02 * dT3_dVd) + QovCox2 * dCoxeff2_dVd; - Cgb12 = CoxWLcen2 * (dT12_dVb - dT02_dVb * (0.5 - T3) + T02 * dT3_dVb) + QovCox2 * dCoxeff2_dVb; - Cge12 = CoxWLcen2 * (dT12_dVe - dT02_dVe * (0.5 - T3) + T02 * dT3_dVe) + QovCox2 * dCoxeff2_dVe; - - /* 11 new lines Wagner */ - if (selfheat) { - dTL1_dT = AbulkCV * dVdseffCV2_dT + dAbulkCV_dT * VdseffCV2; - dTL2_dT = 12 * (dVgsteff2_dT - dDeltaPhi2_dT - 0.5*dTL1_dT); - dTL3_dT = dTL1_dT/T22 - (T3/T22)*dTL2_dT; - dqgate2_dT = (T7 * dCoxeff2_dT / Coxeff2) - + CoxWLcen2 * (dVgsteff2_dT - dDeltaPhi2_dT - - dTL1_dT*(0.5-T3) - + T02*dTL3_dT); - dqgate_dT += dqgate2_dT; - } - else dqgate_dT += 0; - } - - /* end v4.1 */ - - - /* v3.1 */ - /* LFW_FD 2 new lines - flexilint */ - Csg2 = Cbg12 = Cbd12 = Cbb12 = Cbe12 = 0; - dqbulk_dT = 0; - if (here->B4SOIsoiMod == 2) /* v3.2 */ /* ideal FD */ - { - qbulk = Cbg1 = Cbd1 = Cbb1 = Cbe1 = dqbulk_dT = 0; /* LFW_FD enhance line */ - } - else /* soiMod = 0 or 1 */ - { - T7 = 1.0 - AbulkCV; - T8 = T2 * T2; - T9 = 12.0 * T7 * T0 * T0 / (T8 * AbulkCV); - T10 = T9 * (1.0 - dDeltaPhi_dVg); - T11 = -T7 * T5 / AbulkCV; - T12 = -(T9 * T1 / AbulkCV + VdseffCV * (0.5 - T0 / T2)); - - qbulk1 = qbulk = CoxWLcenb * T7 * (0.5 * VdseffCV - T0 * VdseffCV / T2); /* enhanced line Wagner */ - QovCox = qbulk / Coxeff; - /* LFW_FD fix/add next 4 derivatives */ - Cbg1 = CoxWLcenb * T7 * (0.5 - T0 / T2) * dVdseffCV_dVg - - CoxWLcenb * T7 * VdseffCV * ((dT0_dVg -T0 * dT2_dVg / T2) /T2) - - CoxWLcenb * VdseffCV * (0.5 - T0 / T2) * dAbulkCV_dVg - + QovCox * dCoxeff_dVg; - Cbb1 = CoxWLcenb * T7 * (0.5 - T0 / T2) * dVdseffCV_dVb - - CoxWLcenb * T7 * VdseffCV * ((dT0_dVb -T0 * dT2_dVb / T2) /T2) - - CoxWLcenb * VdseffCV * (0.5 - T0 / T2) * dAbulkCV_dVb - + QovCox * dCoxeff_dVb; - Cbd1 = CoxWLcenb * T7 * (0.5 - T0 / T2) * dVdseffCV_dVd - - CoxWLcenb * T7 * VdseffCV * ((dT0_dVd -T0 * dT2_dVd / T2) /T2) - - CoxWLcenb * VdseffCV * (0.5 - T0 / T2) * dAbulkCV_dVd - + QovCox * dCoxeff_dVd; - Cbe1 = CoxWLcenb * T7 * (0.5 - T0 / T2) * dVdseffCV_dVe - - CoxWLcenb * T7 * VdseffCV * ((dT0_dVe -T0 * dT2_dVe / T2) /T2) - - CoxWLcenb * VdseffCV * (0.5 - T0 / T2) * dAbulkCV_dVe - + QovCox * dCoxeff_dVe; - - /* 12 new lines Wagner */ - if (selfheat) { - dTL1_dT = AbulkCV * dVdseffCV_dT + dAbulkCV_dT * VdseffCV; - dTL2_dT = 12 * (dVgsteff_dT - dDeltaPhi_dT - 0.5*dTL1_dT); - TL3 = T0/T2; - dTL3_dT = dTL1_dT/T2 - (TL3/T2)*dTL2_dT; - TL4 = (0.5 * VdseffCV - T0 * VdseffCV / T2); - dTL4_dT = (0.5 - T0/T2)*dVdseffCV_dT - VdseffCV*dTL3_dT; - dqbulk_dT = dCoxWLcenb_dT * T7 * TL4 - - CoxWLcenb * dAbulkCV_dT * TL4 - + CoxWLcenb * T7 * dTL4_dT; - } - else dqbulk_dT = 0; - /* v4.1 */ - if ((here->B4SOIsoiMod != 2) && /* Bug fix #10 Jun 09 'opposite type Q/C evaluated only if bodymod=1' */ - (here->B4SOIbodyMod != 0) && here->B4SOIagbcp2 > 0) { - T8 = T22 * T22; - T9 = 12.0 * T7 * T02 * T02 / (T8 * AbulkCV); - T10 = T9 * (1.0 - dDeltaPhi2_dVg); - T11 = -T7 * T52 / AbulkCV; - T12 = -(T9 * (Vgsteff2 - DeltaPhi2) / AbulkCV + VdseffCV2 * (0.5 - T02 / T22)); - - qbulk2 = CoxWLcenb2 * T7 * (0.5 * VdseffCV2 - T02 * VdseffCV2 / T22); - QovCox2 = qbulk2 / Coxeff2; - /* LFW_FD fix/add next 4 derivatives */ - Cbg12 = CoxWLcenb2 * T7 * (0.5 - T02 / T22) * dVdseffCV2_dVg - - CoxWLcenb2 * T7 * VdseffCV2 * ((dT02_dVg -T02 * dT22_dVg / T22) /T22) - - CoxWLcenb2 * VdseffCV2 * (0.5 - T02 / T22) * dAbulkCV_dVg - + QovCox2 * dCoxeff2_dVg; - Cbb12 = CoxWLcenb2 * T7 * (0.5 - T02 / T22) * dVdseffCV2_dVb - - CoxWLcenb2 * T7 * VdseffCV2 * ((dT02_dVb -T02 * dT22_dVb / T22) /T22) - - CoxWLcenb2 * VdseffCV2 * (0.5 - T02 / T22) * dAbulkCV_dVb - + QovCox2 * dCoxeff2_dVb; - Cbd12 = CoxWLcenb2 * T7 * (0.5 - T02 / T22) * dVdseffCV2_dVd - - CoxWLcenb2 * T7 * VdseffCV2 * ((dT02_dVd -T02 * dT22_dVd / T22) /T22) - - CoxWLcenb2 * VdseffCV2 * (0.5 - T02 / T22) * dAbulkCV_dVd - + QovCox2 * dCoxeff2_dVd; - Cbe12 = CoxWLcenb2 * T7 * (0.5 - T02 / T22) * dVdseffCV2_dVe - - CoxWLcenb2 * T7 * VdseffCV2 * ((dT02_dVe -T02 * dT22_dVe / T22) /T22) - - CoxWLcenb2 * VdseffCV2 * (0.5 - T02 / T22) * dAbulkCV_dVe - + QovCox2 * dCoxeff2_dVe; - - /* 12 new lines Wagner */ - if (selfheat) { - dTL1_dT = AbulkCV * dVdseffCV2_dT + dAbulkCV_dT * VdseffCV2; - dTL2_dT = 12 * (dVgsteff2_dT - dDeltaPhi2_dT - 0.5*dTL1_dT); - TL3 = T02/T22; - dTL3_dT = dTL1_dT/T22 - (TL3/T22)*dTL2_dT; - TL4 = (0.5 * VdseffCV2 - T02 * VdseffCV2 / T22); - dTL4_dT = (0.5 - T02/T22)*dVdseffCV2_dT - VdseffCV2*dTL3_dT; - dqbulk2_dT = dCoxWLcenb2_dT * T7 * TL4 - - CoxWLcenb2 * dAbulkCV_dT * TL4 - + CoxWLcenb2 * T7 * dTL4_dT; - } - else dqbulk2_dT = 0; - - qbulk += qbulk2; - dqbulk_dT += dqbulk2_dT; /* new line Wagner */ - } - - /* end v4.1 */ - - } - /* v3.1 */ - - Csg2 = Csd2 = Csb2 = Cse2 = 0.0; /* LFW_FD enhance line */ - dqsrc2_dT = 0; /* new line Wagner */ - if (model->B4SOIxpart > 0.5) - { /* 0/100 partition */ - qsrc = -CoxWLcen * (T1 / 2.0 + T0 / 4.0 - - 0.5 * T0 * T0 / T2); - /* 9 new lines Wagner */ - if (selfheat) { - dTL1_dT = AbulkCV * dVdseffCV_dT + dAbulkCV_dT * VdseffCV; - dTL5_dT = dVgsteff_dT - dDeltaPhi_dT; - dTL2_dT = 12 * (dVgsteff_dT - dDeltaPhi_dT - 0.5*dTL1_dT); - dqsrc_dT = qsrc*dCoxeff_dT/Coxeff - -CoxWLcen*(dTL5_dT/2.0 + dTL1_dT/4.0 - T0*dTL1_dT/T2 - + 0.5*T0*T0*dTL2_dT/(T2*T2) ); - } - else dqsrc_dT = 0; - - QovCox = qsrc / Coxeff; - T2 += T2; - T3 = T2 * T2; - T7 = -(0.25 - 12.0 * T0 * (4.0 * T1 - T0) / T3); - T4 = -(0.5 + 24.0 * T0 * T0 / T3) * (1.0 - dDeltaPhi_dVg); - T5 = T7 * AbulkCV; - T6 = T7 * VdseffCV; - - /* LFW_FD fix/add next 4 derivatives */ - Csg = QovCox * dCoxeff_dVg - - CoxWLcen * (dT1_dVg / 2.0 + dT0_dVg / 4.0 - - 2.0 * T0 * dT0_dVg / T2 + 2.0 * T0 * T0 * dT2_dVg / (T2 * T2)); - Csd = QovCox * dCoxeff_dVd - - CoxWLcen * (dT1_dVd / 2.0 + dT0_dVd / 4.0 - - 2.0 * T0 * dT0_dVd / T2 + 2.0 * T0 * T0 * dT2_dVd / (T2 * T2)); - Csb = QovCox * dCoxeff_dVb - - CoxWLcen * (dT1_dVb / 2.0 + dT0_dVb / 4.0 - - 2.0 * T0 * dT0_dVb / T2 + 2.0 * T0 * T0 * dT2_dVb / (T2 * T2)); - Cse = QovCox * dCoxeff_dVe - - CoxWLcen * (dT1_dVe / 2.0 + dT0_dVe / 4.0 - - 2.0 * T0 * dT0_dVe / T2 + 2.0 * T0 * T0 * dT2_dVe / (T2 * T2)); - - /* v4.1 */ - if ((here->B4SOIsoiMod != 2) && /* Bug fix #10 Jun 09 'opposite type Q/C evaluated only if bodymod=1' */ - (here->B4SOIbodyMod != 0) && here->B4SOIagbcp2 > 0) { - T12 = Vgsteff2 - DeltaPhi2; /* must restore for derivatives below*/ - qsrc2 = -CoxWLcen2 * ( (Vgsteff2 - DeltaPhi2) / 2.0 + T02 / 4.0 - - 0.5 * T02 * T02 / T22); /* CJB LFW */ - /* 9 new lines Wagner */ - if (selfheat) { - dTL1_dT = AbulkCV * dVdseffCV2_dT + dAbulkCV_dT * VdseffCV2; - dTL5_dT = dVgsteff2_dT - dDeltaPhi2_dT; - dTL2_dT = 12 * (dVgsteff2_dT - dDeltaPhi2_dT - 0.5*dTL1_dT); - dqsrc2_dT = qsrc2*dCoxeff2_dT/Coxeff2 - -CoxWLcen2*(dTL5_dT/2.0 + dTL1_dT/4.0 - T02*dTL1_dT/T22 - + 0.5*T02*T02*dTL2_dT/(T22*T22) ); - } - else dqsrc2_dT = 0; - - QovCox2 = qsrc2 / Coxeff2; - T22 += T22; - T3 = T22 * T22; - T7 = -(0.25 - 12.0 * T02 * (4.0 * T12 - T02) / T3); - T4 = -(0.5 + 24.0 * T02 * T02 / T3) * (1.0 - dDeltaPhi2_dVg); - T5 = T7 * AbulkCV; - T6 = T7 * VdseffCV2; - /* LFW_FD fix/add next 4 derivatives */ - Csg2 = QovCox2 * dCoxeff2_dVg - - CoxWLcen2 * (dT12_dVg / 2.0 + dT02_dVg / 4.0 - - 2.0 * T02 * dT02_dVg / T22 + 2.0 * T02 * T02 * dT22_dVg / (T22 * T22)); - Csd2 = QovCox2 * dCoxeff2_dVd - - CoxWLcen2 * (dT12_dVd / 2.0 + dT02_dVd / 4.0 - - 2.0 * T02 * dT02_dVd / T22 + 2.0 * T02 * T02 * dT22_dVd / (T22 * T22)); - Csb2 = QovCox2 * dCoxeff2_dVb - - CoxWLcen2 * (dT12_dVb / 2.0 + dT02_dVb / 4.0 - - 2.0 * T02 * dT02_dVb / T22 + 2.0 * T02 * T02 * dT22_dVb / (T22 * T22)); - Cse2 = QovCox2 * dCoxeff2_dVe - - CoxWLcen2 * (dT12_dVe / 2.0 + dT02_dVe / 4.0 - - 2.0 * T02 * dT02_dVe / T22 + 2.0 * T02 * T02 * dT22_dVe / (T22 * T22)); - - qsrc += qsrc2; - dqsrc_dT += dqsrc2_dT; /* new line Wagner */ - } - /* end v4.1 */ - - } - else if (model->B4SOIxpart < 0.5) - { /* 40/60 partition */ - T2 = T2 / 12.0; - T3 = 0.5 * CoxWLcen / (T2 * T2); - T4 = T1 * (2.0 * T0 * T0 / 3.0 + T1 * (T1 - 4.0 - * T0 / 3.0)) - 2.0 * T0 * T0 * T0 / 15.0; - qsrc = -T3 * T4; - QovCox = qsrc / Coxeff; - T8 = 4.0 / 3.0 * T1 * (T1 - T0) + 0.4 * T0 * T0; - T5 = -2.0 * qsrc / T2 - T3 * (T1 * (3.0 * T1 - 8.0 - * T0 / 3.0) + 2.0 * T0 * T0 / 3.0); - T6 = AbulkCV * (qsrc / T2 + T3 * T8); - T7 = T6 * VdseffCV / AbulkCV; - - /* LFW_FD add next 32 lines */ - dT2_dVg = dT2_dVg / 12.0; - dT2_dVd = dT2_dVd / 12.0; - dT2_dVb = dT2_dVb / 12.0; - dT2_dVe = dT2_dVe / 12.0; - - dT3_dVg = T3 * dCoxeff_dVg / Coxeff - - 2.0 * T3 * T2 * dT2_dVg / (T2 * T2); - dT3_dVd = T3 * dCoxeff_dVd / Coxeff - - 2.0 * T3 * T2 * dT2_dVd / (T2 * T2); - dT3_dVb = T3 * dCoxeff_dVb / Coxeff - - 2.0 * T3 * T2 * dT2_dVb / (T2 * T2); - dT3_dVe = T3 * dCoxeff_dVe / Coxeff - - 2.0 * T3 * T2 * dT2_dVe / (T2 * T2); - - dT4_dVg = dT1_dVg * (2.0 * T0 * T0 / 3.0 + T1 * (T1 - 4.0 * T0 / 3.0)) - + T1 * (4.0 * T0 * dT0_dVg / 3.0 - + dT1_dVg * (T1 - 4.0 * T0 / 3.0) - + T1 * (dT1_dVg - 4.0 * dT0_dVg /3.0)) - - 2.0 * T0 * T0 * dT0_dVg / 5.0; - dT4_dVd = dT1_dVd * (2.0 * T0 * T0 / 3.0 + T1 * (T1 - 4.0 * T0 / 3.0)) - + T1 * (4.0 * T0 * dT0_dVd / 3.0 - + dT1_dVd * (T1 - 4.0 * T0 / 3.0) - + T1 * (dT1_dVd - 4.0 * dT0_dVd /3.0)) - - 2.0 * T0 * T0 * dT0_dVd / 5.0; - dT4_dVb = dT1_dVb * (2.0 * T0 * T0 / 3.0 + T1 * (T1 - 4.0 * T0 / 3.0)) - + T1 * (4.0 * T0 * dT0_dVb / 3.0 - + dT1_dVb * (T1 - 4.0 * T0 / 3.0) - + T1 * (dT1_dVb - 4.0 * dT0_dVb /3.0)) - - 2.0 * T0 * T0 * dT0_dVb / 5.0; - dT4_dVe = dT1_dVe * (2.0 * T0 * T0 / 3.0 + T1 * (T1 - 4.0 * T0 / 3.0)) - + T1 * (4.0 * T0 * dT0_dVe / 3.0 - + dT1_dVe * (T1 - 4.0 * T0 / 3.0) - + T1 * (dT1_dVe - 4.0 * dT0_dVe /3.0)) - - 2.0 * T0 * T0 * dT0_dVe / 5.0; - - /* LFW_FD fix/add next 4 derivatives */ - Csg = -(dT3_dVg * T4 + T3 * dT4_dVg); - Csd = -(dT3_dVd * T4 + T3 * dT4_dVd); - Csb = -(dT3_dVb * T4 + T3 * dT4_dVb); - Cse = -(dT3_dVe * T4 + T3 * dT4_dVe); - - /* 13 new lines Wagner */ - if (selfheat) { - dTL1_dT = AbulkCV * dVdseffCV_dT + dAbulkCV_dT * VdseffCV; - dTL5_dT = dVgsteff_dT - dDeltaPhi_dT; - dTL2_dT = (dVgsteff_dT - dDeltaPhi_dT - 0.5*dTL1_dT); - dTL3_dT = - 2*T3*dTL2_dT/T2 + T3*dCoxeff_dT/Coxeff; - dTL4_dT = dTL5_dT * (2.0*T0*T0/3.0 + T1*(T1-4.0*T0/3.0)) - + T1 * (4.0*T0*dTL1_dT/3.0 - + dTL5_dT*(T1-4.0*T0/3.0) - + T1*(dTL5_dT-4.0*dTL1_dT/3.0) ) - - 2.0*T0*T0*dTL1_dT/5.0; - dqsrc_dT = -T3*dTL4_dT - dTL3_dT*T4; - } - else dqsrc_dT += 0; - - /* v4.1 */ - if ((here->B4SOIsoiMod != 2) && /* Bug fix #10 Jun 09 'opposite type Q/C evaluated only if bodymod=1' */ - (here->B4SOIbodyMod != 0) && here->B4SOIagbcp2 > 0) { - T12 = Vgsteff2 - DeltaPhi2; /* must restore for derivatives below*/ - T22 = T22 / 12.0; - T3 = 0.5 * CoxWLcen2 / (T22 * T22); - T4 = T12 * (2.0 * T02 * T02 / 3.0 + T12 * (T12 - 4.0 - * T02 / 3.0)) - 2.0 * T02 * T02 * T02 / 15.0; - qsrc2 = -T3 * T4; - QovCox2 = qsrc2 / Coxeff2; - T8 = 4.0 / 3.0 * T12 * (T12 - T02) + 0.4 * T02 * T02; - T5 = -2.0 * qsrc2 / T22 - T3 * (T12 * (3.0 * T12 - 8.0 - * T02 / 3.0) + 2.0 * T02 * T02 / 3.0); - T6 = AbulkCV * (qsrc2 / T22 + T3 * T8); - T7 = T6 * VdseffCV2 / AbulkCV; - - /* LFW_FD add next 32 lines */ - dT22_dVg = dT22_dVg / 12.0; - dT22_dVd = dT22_dVd / 12.0; - dT22_dVb = dT22_dVb / 12.0; - dT22_dVe = dT22_dVe / 12.0; - - dT3_dVg = T3 * dCoxeff2_dVg / Coxeff2 - - 2.0 * T3 * T22 * dT22_dVg / (T22 * T22); - dT3_dVd = T3 * dCoxeff2_dVd / Coxeff2 - - 2.0 * T3 * T22 * dT22_dVd / (T22 * T22); - dT3_dVb = T3 * dCoxeff2_dVb / Coxeff2 - - 2.0 * T3 * T22 * dT22_dVb / (T22 * T22); - dT3_dVe = T3 * dCoxeff2_dVe / Coxeff2 - - 2.0 * T3 * T22 * dT22_dVe / (T22 * T22); - - dT4_dVg = dT12_dVg * (2.0 * T02 * T02 / 3.0 + T12 * (T12 - 4.0 * T02 / 3.0)) - + T12 * (4.0 * T02 * dT02_dVg / 3.0 - + dT12_dVg * (T12 - 4.0 * T02 / 3.0) - + T12 * (dT12_dVg - 4.0 * dT02_dVg /3.0)) - - 2.0 * T02 * T02 * dT02_dVg / 5.0; - dT4_dVd = dT12_dVd * (2.0 * T02 * T02 / 3.0 + T12 * (T12 - 4.0 * T02 / 3.0)) - + T12 * (4.0 * T02 * dT02_dVd / 3.0 - + dT12_dVd * (T12 - 4.0 * T02 / 3.0) - + T12 * (dT12_dVd - 4.0 * dT02_dVd /3.0)) - - 2.0 * T02 * T02 * dT02_dVd / 5.0; - dT4_dVb = dT12_dVb * (2.0 * T02 * T02 / 3.0 + T12 * (T12 - 4.0 * T02 / 3.0)) - + T12 * (4.0 * T02 * dT02_dVb / 3.0 - + dT12_dVb * (T12 - 4.0 * T02 / 3.0) - + T12 * (dT12_dVb - 4.0 * dT02_dVb /3.0)) - - 2.0 * T02 * T02 * dT02_dVb / 5.0; - dT4_dVe = dT12_dVe * (2.0 * T02 * T02 / 3.0 + T12 * (T12 - 4.0 * T02 / 3.0)) - + T12 * (4.0 * T02 * dT02_dVe / 3.0 - + dT12_dVe * (T12 - 4.0 * T02 / 3.0) - + T12 * (dT12_dVe - 4.0 * dT02_dVe /3.0)) - - 2.0 * T02 * T02 * dT02_dVe / 5.0; - /* LFW_FD fix/add next 4 derivatives */ - Csg2 = -(dT3_dVg * T4 + T3 * dT4_dVg); - Csd2 = -(dT3_dVd * T4 + T3 * dT4_dVd); - Csb2 = -(dT3_dVb * T4 + T3 * dT4_dVb); - Cse2 = -(dT3_dVe * T4 + T3 * dT4_dVe); - - /* 14 new lines Wagner */ - if (selfheat) { - dTL1_dT = AbulkCV * dVdseffCV2_dT + dAbulkCV_dT * VdseffCV2; - dTL5_dT = dVgsteff2_dT - dDeltaPhi2_dT; - dTL2_dT = (dVgsteff2_dT - dDeltaPhi2_dT - 0.5*dTL1_dT); - dTL3_dT = - 2*T3*dTL2_dT/T22 + T3*dCoxeff2_dT/Coxeff2; - dTL4_dT = dTL5_dT * (2.0*T02*T02/3.0 + T12*(T12-4.0*T02/3.0)) - + T12 * (4.0*T02*dTL1_dT/3.0 - + dTL5_dT*(T12-4.0*T02/3.0) - + T12*(dTL5_dT-4.0*dTL1_dT/3.0) ) - - 2.0*T02*T02*dTL1_dT/5.0; - dqsrc2_dT = -T3*dTL4_dT - dTL3_dT*T4; - } - else dqsrc_dT += 0; - - qsrc += qsrc2; - dqsrc_dT += dqsrc2_dT; /* new line Wagner */ - } - /* end v4.1 */ - } - else - { /* 50/50 partition */ - qsrc = -0.5 * qgate; - Csg = -0.5 * Cgg1; - Csd = -0.5 * Cgd1; - Csb = -0.5 * Cgb1; - Cse = -0.5 * Cge1; /* LFW_FD new line */ - /* v4.1 */ - if ((here->B4SOIsoiMod != 2) && /* Bug fix #10 Jun 09 'opposite type Q/C evaluated only if bodymod=1' */ - (here->B4SOIbodyMod != 0) && here->B4SOIagbcp2 > 0) { - /* LFW_FD fix/add next 4 lines */ - Csg2 = -0.5 * Cgg12; - Csd2 = -0.5 * Cgd12; - Csb2 = -0.5 * Cgb12; - Cse2 = -0.5 * Cge12; - } - dqsrc_dT = -0.5 * dqgate_dT; /* new line Wagner */ - /* end v4.1 */ - } - - - /* Backgate charge */ - /* v3.1 */ - if (here->B4SOIsoiMod == 2) /* v3.2 */ /* ideal FD */ - { - Qe1 = Ce1b = Ce1e = Ce1T = dQe1_dT = 0; - } - else /* soiMod = 0 or 1 */ - { - CboxWL = pParam->B4SOIkb1 * model->B4SOIfbody * Cbox - * (pParam->B4SOIweffCV / here->B4SOInseg - * here->B4SOInf /* bugfix_snps nf*/ - * pParam->B4SOIleffCVbg + here->B4SOIaebcp); - Qe1 = CboxWL * (Vesfb - Vbs); - Ce1b = dQe1_dVb = -CboxWL; - Ce1e = dQe1_dVe = CboxWL; - if (selfheat) Ce1T = dQe1_dT = -CboxWL * dvfbb_dT; - else Ce1T = dQe1_dT = 0.0; - } - /* v3.1 */ - - - qgate += Qac0 + Qsub0 - qbulk; - qbody = qbulk - Qac0 - Qsub0 - Qe1; - qsub = Qe1; - qdrn = -(qgate + qbody + qsub + qsrc); - - /* 8 new lines Wagner */ - dqgate_dT += dQac0_dT + dQsub0_dT - dqbulk_dT; - dqbody_dT = dqbulk_dT - dQac0_dT - dQsub0_dT - dQe1_dT; - dqsub_dT = dQe1_dT; - dqdrn_dT = -(dqgate_dT + dqbody_dT + dqsub_dT + dqsrc_dT); - CgT = dqgate_dT; - CbT = dqbody_dT; - CsT = dqsrc_dT; - CdT = dqdrn_dT; - - Cbg = Cbg1 - dQac0_dVg - dQsub0_dVg; - /* LFW_FD fix/add next 3 lines */ - Cbd = Cbd1 - dQac0_dVd - dQsub0_dVd; - Cbb = Cbb1 - dQac0_dVb - dQsub0_dVb - Ce1b; - Cbe = Cbe1 - dQac0_dVe - dQsub0_dVe - Ce1e; - - Cgg = Cgg1 - Cbg; - Cgd = Cgd1 - Cbd; - /* LFW_FD fix/add next 2 lines */ - Cgb = Cgb1 - Cbb - Ce1b; - Cge = Cge1 - Cbe - Ce1e; - /* comment out next 4 lines Wagner */ - /*if (selfheat) - CgT = Cgg1 * dVgsteff_dT + dQac0_dT - + dQsub0_dT; - else CgT = 0.0;*/ - - /*Cgb *= dVbseff_dVb; */ - /*Cbb *= dVbseff_dVb; */ - /*Csb *= dVbseff_dVb; */ - /* comment out next 2 lines Wagner */ - /*if (selfheat) CsT = Csg * dVgsteff_dT; - else CsT = 0.0;*/ - /* v4.1 */ - if ((here->B4SOIsoiMod != 2) && /* Bug fix #10 Jun 09 'opposite type Q/C evaluated only if bodymod=1' */ - (here->B4SOIbodyMod != 0) && here->B4SOIagbcp2 > 0) { - /* LFW_FD fix next 12 lines */ - Cbg += Cbg12 - dQac02_dVg - dQsub02_dVg; - Cbd += Cbd12 - dQac02_dVd - dQsub02_dVd; - Cbb += Cbb12 - dQac02_dVb - dQsub02_dVb; - Cbe += Cbe12 - dQac02_dVe - dQsub02_dVe; - - Cgg = Cgg1 + Cgg12 - Cbg; - Cgd = Cgd1 + Cgd12 - Cbd; - Cgb = Cgb1 + Cgb12 - Cbb - Ce1b; - Cge = Cge1 + Cge12 - Cbe - Ce1e; - - Csg += Csg2; - Csd += Csd2; - Csb += Csb2; - Cse += Cse2; - } - - /* end v4.1 */ - here->B4SOIcggb = Cgg; - here->B4SOIcgsb = -(Cgg + Cgd + Cgb + Cge); /* LFW_FD fix line */ - here->B4SOIcgdb = Cgd; - here->B4SOIcgeb = Cge; /* LFW_FD fix line */ - here->B4SOIcgT = CgT; - - here->B4SOIcbgb = Cbg; - here->B4SOIcbsb = -(Cbg + Cbd + Cbb + Cbe); /* LFW_FD fix line */ - here->B4SOIcbdb = Cbd; - here->B4SOIcbeb = Cbe; /* LFW_FD fix line */ - here->B4SOIcbT = CbT; - - here->B4SOIceT = Ce1T; - here->B4SOIceeb = Ce1e ; - - here->B4SOIcdgb = -(Cgg + Cbg + Csg); - here->B4SOIcddb = -(Cgd + Cbd + Csd); - here->B4SOIcdeb = -(Cge + Cse + Cbe) - Ce1e; /* LFW_FD fix line */ - here->B4SOIcdT = -(CgT+CbT+CsT) - Ce1T; - here->B4SOIcdsb = Cgg + Cgd + Cgb + Cge /* LFW_FD fix expression */ - + Cbg + Cbd + Cbb + Cbe + Ce1e - + Csg + Csd + Csb + Cse + Ce1b; - here->B4SOIqinv = -qinoi; - - } /* End of if capMod ==3 */ - else { /* v4.0 */ - Qsub0 = Qac0 = 0.0; - qgate = qdrn = qsrc = qbody = qsub = 0.0; - Cbg = Cbd = Cbb = 0.0; - here->B4SOIcggb = here->B4SOIcgsb - = here->B4SOIcgdb = 0.0; - here->B4SOIcdgb = here->B4SOIcdsb - = here->B4SOIcddb = 0.0; - here->B4SOIcbgb = here->B4SOIcbsb - = here->B4SOIcbdb = 0.0; - } - } - here->B4SOIqgate = qgate; - here->B4SOIqdrn = qdrn; - here->B4SOIqbulk = qbody; - here->B4SOIqsrc = qsrc; - - - -finished: /* returning Values to Calling Routine */ - /* - * COMPUTE EQUIVALENT DRAIN CURRENT SOURCE - */ - - /* flexilint inits */ - gcjdbs = gcjdT = 0.0; - gcjsbs = gcjsT = 0.0; - - if (ChargeComputationNeeded) - { - /* Intrinsic S/D junction charge */ - - /* v3.1 */ - if (here->B4SOIsoiMod == 2) /* v3.2 */ /* ideal FD */ - { - qjs = qjd = 0.0; - /*gcjdds = gcjdbs = gcjdT = 0.0; v4.2 */ - gcjdbs = gcjdT = 0.0; - gcjsbs = gcjsT = 0.0; - here->B4SOIcjsb = here->B4SOIcjdb = 0.0 /*v4.0*/; - - } - else /* soiMod = 0 or 1 */ - { - PhiBSWG = model->B4SOIGatesidewallJctSPotential; - dPhiBSWG_dT = -model->B4SOItpbswg; - PhiBSWG += dPhiBSWG_dT * (Temp - model->B4SOItnom); - MJSWG = model->B4SOIbodyJctGateSideSGradingCoeff; - - cjsbs = model->B4SOIunitLengthGateSidewallJctCapS - * pParam->B4SOIwdiosCV * model->B4SOItsi * here->B4SOInf / 1e-7; /* bugfix_snps nf*/ - dcjsbs_dT = cjsbs * model->B4SOItcjswg; - cjsbs += dcjsbs_dT * (Temp - model->B4SOItnom); - - cjdbs = model->B4SOIunitLengthGateSidewallJctCapD - * pParam->B4SOIwdiodCV * model->B4SOItsi * here->B4SOInf / 1e-7; /* bugfix_snps nf*/ - dcjdbs_dT = cjdbs * model->B4SOItcjswgd; - cjdbs += dcjdbs_dT * (Temp - model->B4SOItnom); - - DioMax = 0.9 * (PhiBSWG); - - /* arg = 1.0 - (Vbs > DioMax ? DioMax : Vbs) / PhiBSWG; */ /* Bug fix #6 Vbs evaluated taking consideration of Rbody Mode*/ - if (here->B4SOIrbodyMod) - arg = 1.0 - (vsbs > DioMax ? DioMax : vsbs) / PhiBSWG; /* Bug fix #6 */ - else - arg = 1.0 - (vbs > DioMax ? DioMax : vbs) / PhiBSWG; /* Bug fix #6 */ - if (selfheat) - darg_dT = (1 - arg) / PhiBSWG * dPhiBSWG_dT; - else - darg_dT = 1.0; /* flexilint */ - - if (MJSWG == 0.5) { - dT3_dVb = 1.0 / sqrt(arg); - - if (selfheat) ddT3_dVb_dT = -0.5 * dT3_dVb / arg * darg_dT; - else ddT3_dVb_dT = 1.0; /* flexilint */ - } - else { - dT3_dVb = exp(-MJSWG * log(arg)); - - if (selfheat) ddT3_dVb_dT = -MJSWG * dT3_dVb / arg * darg_dT; - else ddT3_dVb_dT = 1.0; /* flexilint */ - } - T3 = (1.0 - arg * dT3_dVb) * PhiBSWG / (1.0 - MJSWG); - - if (selfheat) - dT3_dT = (1.0 - arg * dT3_dVb) * dPhiBSWG_dT / (1.0 - MJSWG) - - (arg * ddT3_dVb_dT + darg_dT * dT3_dVb) * PhiBSWG / (1.0 - MJSWG); - else - dT3_dT = 1.0; /* flexilint */ - - /* if (vbs > DioMax) - T3 += dT3_dVb * (vbs - DioMax); */ /* Bug fix #6 Vbs evaluated taking consideration of Rbody Mode*/ - - if (here->B4SOIrbodyMod) - { - if (vsbs > DioMax) /* Bug fix #6 */ - T3 += dT3_dVb * (vsbs - DioMax); - } - else - { - if (vbs > DioMax) /* Bug fix #6 */ - T3 += dT3_dVb * (vbs - DioMax); - } - - if (here->B4SOImode > 0) - { - qjs = cjsbs * T3 + model->B4SOItt * Ibsdif * here->B4SOInf; - gcjsbs = cjsbs * dT3_dVb + model->B4SOItt * dIbsdif_dVb * here->B4SOInf; - /* 3 new lines */ - if (selfheat) - gcjsT = model->B4SOItt * dIbsdif_dT * here->B4SOInf + dcjsbs_dT * T3 + dT3_dT * cjsbs; - else gcjsT = 0.0; - } - else - { - qjs = cjsbs * T3 + model->B4SOItt * Ibddif * here->B4SOInf; - gcjsbs = cjsbs * dT3_dVb + model->B4SOItt * dIbddif_dVb * here->B4SOInf; - /* 3 new lines */ - if (selfheat) - gcjsT = model->B4SOItt * dIbddif_dT * here->B4SOInf + dcjsbs_dT * T3 + dT3_dT * cjsbs; - else gcjsT = 0.0; - } - /* comment out next 3 lines Wagner */ - /*if (selfheat) - gcjsT = model->B4SOItt * dIbsdif_dT * here->B4SOInf + dcjsbs_dT * T3 + dT3_dT * cjsbs; - else gcjsT = 0.0; */ - - PhiBSWG = model->B4SOIGatesidewallJctDPotential; - dPhiBSWG_dT = -model->B4SOItpbswgd; - PhiBSWG += dPhiBSWG_dT * (Temp - model->B4SOItnom); - MJSWG = model->B4SOIbodyJctGateSideDGradingCoeff; - - DioMax = 0.9 * (PhiBSWG); - /* arg = 1.0 - (vbd > DioMax ? DioMax : vbd) / PhiBSWG; */ /* Bug fix #6 Vbd evaluated taking consideration of Rbody Mode*/ - if (here->B4SOIrbodyMod) - arg = 1.0 - (vdbd > DioMax ? DioMax : vdbd) / PhiBSWG; /* Bug Fix #6 */ - else - arg = 1.0 - (vbd > DioMax ? DioMax : vbd) / PhiBSWG; /* Bug Fix #6 */ - - if (selfheat) - darg_dT = (1 - arg) / PhiBSWG * dPhiBSWG_dT; - else - darg_dT = 1.0; /* flexilint */ - - if (MJSWG == 0.5) { - dT3_dVb = 1.0 / sqrt(arg); - - if (selfheat) ddT3_dVb_dT = -0.5 * dT3_dVb / arg * darg_dT; - else ddT3_dVb_dT = 1.0; /* flexilint */ - } - else { - dT3_dVb = exp(-MJSWG * log(arg)); - - if (selfheat) ddT3_dVb_dT = -MJSWG * dT3_dVb / arg * darg_dT; - else ddT3_dVb_dT = 1.0; /* flexilint */ - } - T3 = (1.0 - arg * dT3_dVb) * PhiBSWG / (1.0 - MJSWG); - - if (selfheat) - dT3_dT = (1.0 - arg * dT3_dVb) * dPhiBSWG_dT / (1.0 - MJSWG) - - (arg * ddT3_dVb_dT + darg_dT * dT3_dVb) * PhiBSWG / (1.0 - MJSWG); - else - dT3_dT = 1.0; /* flexilint */ - - /* if (vbd > DioMax) - T3 += dT3_dVb * (vbd - DioMax); */ /* Bug fix #6 Vbd evaluated taking consideration of Rbody Mode*/ - if (here->B4SOIrbodyMod) - { - if (vdbd > DioMax) /* Bug fix #6 */ - T3 += dT3_dVb * (vdbd - DioMax); - } - else - { - if (vbd > DioMax) /* Bug fix #6 */ - T3 += dT3_dVb * (vbd - DioMax); - } - dT3_dVd = -dT3_dVb; - - if (here->B4SOImode > 0) - { - qjd = cjdbs * T3 + model->B4SOItt * Ibddif * here->B4SOInf; - gcjdbs = cjdbs * dT3_dVb + model->B4SOItt * dIbddif_dVb * here->B4SOInf; - /* 3 new lines Wagner */ - if (selfheat) - gcjdT = model->B4SOItt * dIbddif_dT * here->B4SOInf + dcjdbs_dT * T3 + dT3_dT * cjdbs; - else gcjdT = 0.0; - } - else - { - qjd = cjdbs * T3 + model->B4SOItt * Ibsdif * here->B4SOInf; - gcjdbs = cjdbs * dT3_dVb + model->B4SOItt * dIbsdif_dVb * here->B4SOInf; - /* 3 new lines Wagner */ - if (selfheat) - gcjdT = model->B4SOItt * dIbsdif_dT * here->B4SOInf + dcjdbs_dT * T3 + dT3_dT * cjdbs; - else gcjdT = 0.0; - } - /*gcjdds = cjdbs * dT3_dVd + model->B4SOItt * dIbddif_dVd; v4.2 */ - /* comment out next 3 lines Wagner */ - /*if (selfheat) - gcjdT = model->B4SOItt * dIbddif_dT * here->B4SOInf + dcjdbs_dT * T3 + dT3_dT * cjdbs; - else gcjdT = 0.0;*/ - } - /* v3.1 */ - - /* v4.0 */ - /* qdrn -= qjd; - qbody += (qjs + qjd); - qsrc = -(qgate + qbody + qdrn + qsub); - */ - - /* Update the conductance */ - /* v4.2 bugfix: qjs/qjd computed using unswapped voltages; however, total capacitances are swapped below - note that gcjdds = -gcjdbs always, so (gcjdds + gcjdbs) == 0 - here->B4SOIcddb -= gcjdds; - here->B4SOIcdT -= gcjdT; - here->B4SOIcdsb += gcjdds + gcjdbs; - - - here->B4SOIcbdb += (gcjdds); - here->B4SOIcbT += (gcjdT + gcjsT); - here->B4SOIcbsb -= (gcjdds + gcjdbs + gcjsbs); - - here->B4SOIcjsb = (gcjdds + gcjdbs + gcjsbs); - here->B4SOIcjdb = -gcjdds; - */ - here->B4SOIcbT += (gcjdT + gcjsT); - if (here->B4SOImode > 0) - { - here->B4SOIcddb += gcjdbs; - here->B4SOIcdT -= gcjdT; - - here->B4SOIcbdb -= (gcjdbs); - here->B4SOIcbsb -= (gcjsbs); - - here->B4SOIcjsb = gcjsbs; - here->B4SOIcjdb = gcjdbs; - } else { - here->B4SOIcddb += gcjsbs; - here->B4SOIcdT -= gcjsT; - - here->B4SOIcbdb -= (gcjsbs); - here->B4SOIcbsb -= (gcjdbs); - - here->B4SOIcjsb = gcjdbs; - here->B4SOIcjdb = gcjsbs; - } - - /* Extrinsic Bottom S/D to substrate charge */ - T10 = -model->B4SOItype * ves; - /* T10 is vse without type conversion */ - T11 = model->B4SOItype * (vds - ves); - /* T11 is vde without type conversion */ - - if (model->B4SOIcsdmin != 0.0) - { - if ( ((pParam->B4SOInsub > 0) && (model->B4SOItype > 0)) || - ((pParam->B4SOInsub < 0) && (model->B4SOItype < 0)) ) - { - if (T10 < pParam->B4SOIvsdfb) - { here->B4SOIqse = here->B4SOIcsbox * (T10 - pParam->B4SOIvsdfb); - here->B4SOIgcse = here->B4SOIcsbox; - } - else if (T10 < pParam->B4SOIsdt1) - { T0 = T10 - pParam->B4SOIvsdfb; - T1 = T0 * T0; - here->B4SOIqse = T0 * (here->B4SOIcsbox - - pParam->B4SOIst2 / 3 * T1) ; - here->B4SOIgcse = here->B4SOIcsbox - pParam->B4SOIst2 * T1; - } - else if (T10 < pParam->B4SOIvsdth) - { T0 = T10 - pParam->B4SOIvsdth; - T1 = T0 * T0; - here->B4SOIqse = here->B4SOIcsmin * T10 + here->B4SOIst4 + - pParam->B4SOIst3 / 3 * T0 * T1; - here->B4SOIgcse = here->B4SOIcsmin + pParam->B4SOIst3 * T1; - } - else - { here->B4SOIqse = here->B4SOIcsmin * T10 + here->B4SOIst4; - here->B4SOIgcse = here->B4SOIcsmin; - } - } else - { - if (T10 < pParam->B4SOIvsdth) - { here->B4SOIqse = here->B4SOIcsmin * (T10 - pParam->B4SOIvsdth); - here->B4SOIgcse = here->B4SOIcsmin; - } - else if (T10 < pParam->B4SOIsdt1) - { T0 = T10 - pParam->B4SOIvsdth; - T1 = T0 * T0; - here->B4SOIqse = T0 * (here->B4SOIcsmin - pParam->B4SOIst2 / 3 * T1) ; - here->B4SOIgcse = here->B4SOIcsmin - pParam->B4SOIst2 * T1; - } - else if (T10 < pParam->B4SOIvsdfb) - { T0 = T10 - pParam->B4SOIvsdfb; - T1 = T0 * T0; - here->B4SOIqse = here->B4SOIcsbox * T10 + here->B4SOIst4 + - pParam->B4SOIst3 / 3 * T0 * T1; - here->B4SOIgcse = here->B4SOIcsbox + pParam->B4SOIst3 * T1; - } - else - { here->B4SOIqse = here->B4SOIcsbox * T10 + here->B4SOIst4; - here->B4SOIgcse = here->B4SOIcsbox; - } - } - - if ( ((pParam->B4SOInsub > 0) && (model->B4SOItype > 0)) || - ((pParam->B4SOInsub < 0) && (model->B4SOItype < 0)) ) - { - if (T11 < pParam->B4SOIvsdfb) - { here->B4SOIqde = here->B4SOIcdbox * (T11 - pParam->B4SOIvsdfb); - here->B4SOIgcde = here->B4SOIcdbox; - } - else if (T11 < pParam->B4SOIsdt1) - { T0 = T11 - pParam->B4SOIvsdfb; - T1 = T0 * T0; - here->B4SOIqde = T0 * (here->B4SOIcdbox - pParam->B4SOIdt2 / 3 * T1) ; - here->B4SOIgcde = here->B4SOIcdbox - pParam->B4SOIdt2 * T1; - } - else if (T11 < pParam->B4SOIvsdth) - { T0 = T11 - pParam->B4SOIvsdth; - T1 = T0 * T0; - here->B4SOIqde = here->B4SOIcdmin * T11 + here->B4SOIdt4 + - pParam->B4SOIdt3 / 3 * T0 * T1; - here->B4SOIgcde = here->B4SOIcdmin + pParam->B4SOIdt3 * T1; - } - else - { here->B4SOIqde = here->B4SOIcdmin * T11 + here->B4SOIdt4; - here->B4SOIgcde = here->B4SOIcdmin; - } - } else - { - if (T11 < pParam->B4SOIvsdth) - { here->B4SOIqde = here->B4SOIcdmin * (T11 - pParam->B4SOIvsdth); - here->B4SOIgcde = here->B4SOIcdmin; - } - else if (T11 < pParam->B4SOIsdt1) - { T0 = T11 - pParam->B4SOIvsdth; - T1 = T0 * T0; - here->B4SOIqde = T0 * (here->B4SOIcdmin - pParam->B4SOIdt2 / 3 * T1) ; - here->B4SOIgcde = here->B4SOIcdmin - pParam->B4SOIdt2 * T1; - } - else if (T11 < pParam->B4SOIvsdfb) - { T0 = T11 - pParam->B4SOIvsdfb; - T1 = T0 * T0; - here->B4SOIqde = here->B4SOIcdbox * T11 + here->B4SOIdt4 + - pParam->B4SOIdt3 / 3 * T0 * T1; - here->B4SOIgcde = here->B4SOIcdbox + pParam->B4SOIdt3 * T1; - } - else - { here->B4SOIqde = here->B4SOIcdbox * T11 + here->B4SOIdt4; - here->B4SOIgcde = here->B4SOIcdbox; - } - } - } - else { - here->B4SOIqse = here->B4SOIcsbox * T10; - here->B4SOIgcse = here->B4SOIcsbox; - here->B4SOIqde = here->B4SOIcdbox * T11; - here->B4SOIgcde = here->B4SOIcdbox; - } - - /* Extrinsic : Sidewall fringing S/D charge */ - here->B4SOIqse += here->B4SOIcsesw * T10; - here->B4SOIgcse += here->B4SOIcsesw; - here->B4SOIqde += here->B4SOIcdesw * T11; - here->B4SOIgcde += here->B4SOIcdesw; - - /* All charge are multiplied with type at the end, but qse and qde - have true polarity => so pre-multiplied with type */ - here->B4SOIqse *= model->B4SOItype; - here->B4SOIqde *= model->B4SOItype; - } - else { /* v4.0 */ - qjs = qjd = 0.0; - here->B4SOIqse = here->B4SOIqde = 0.0; - here->B4SOIgcse = here->B4SOIgcde = 0.0; - } - - here->B4SOIcbb = Cbb; - here->B4SOIcbd = Cbd; - here->B4SOIcbg = Cbg; - here->B4SOIqbf = -Qsub0 - Qac0; - here->B4SOIqjs = qjs; - here->B4SOIqjd = qjd; - *(ckt->CKTstate0 + here->B4SOIqbs) = qjs; /* v4.0 */ - *(ckt->CKTstate0 + here->B4SOIqbd) = qjd; /* v4.0 */ - - /* - * check convergence - */ - if ((here->B4SOIoff == 0) || (!(ckt->CKTmode & MODEINITFIX))) - { if (Check == 1) - { ckt->CKTnoncon++; -#ifndef NEWCONV - } - else - { tol = ckt->CKTreltol * MAX(fabs(cdhat), fabs(here->B4SOIcd)) - + ckt->CKTabstol; - if (fabs(cdhat - here->B4SOIcd) >= tol) - { ckt->CKTnoncon++; - } - else - { tol = ckt->CKTreltol * MAX(fabs(cbhat), - fabs(here->B4SOIcbs + here->B4SOIcbd)) - + ckt->CKTabstol; - if (fabs(cbhat - (here->B4SOIcbs + here->B4SOIcbd)) - > tol) - { ckt->CKTnoncon++; - } - } -#endif /* NEWCONV */ - } - } - - *(ckt->CKTstate0 + here->B4SOIvg) = vg; - *(ckt->CKTstate0 + here->B4SOIvd) = vd; - *(ckt->CKTstate0 + here->B4SOIvs) = vs; - *(ckt->CKTstate0 + here->B4SOIvp) = vp; - *(ckt->CKTstate0 + here->B4SOIve) = ve; - - *(ckt->CKTstate0 + here->B4SOIvbs) = vbs; - *(ckt->CKTstate0 + here->B4SOIvbd) = vbd; - *(ckt->CKTstate0 + here->B4SOIvgs) = vgs; - *(ckt->CKTstate0 + here->B4SOIvds) = vds; - *(ckt->CKTstate0 + here->B4SOIves) = ves; - *(ckt->CKTstate0 + here->B4SOIvps) = vps; - *(ckt->CKTstate0 + here->B4SOIdeltemp) = delTemp; - - /* v3.1 added for RF */ - *(ckt->CKTstate0 + here->B4SOIvgge) = vgge; - *(ckt->CKTstate0 + here->B4SOIvggm) = vggm; - *(ckt->CKTstate0 + here->B4SOIvges) = vges; - *(ckt->CKTstate0 + here->B4SOIvgms) = vgms; - /* v3.1 added for RF end*/ - *(ckt->CKTstate0 + here->B4SOIvdbs) = vdbs; /* v4.0 */ - *(ckt->CKTstate0 + here->B4SOIvdbd) = vdbd; /* v4.0 */ - *(ckt->CKTstate0 + here->B4SOIvsbs) = vsbs; /* v4.0 */ - *(ckt->CKTstate0 + here->B4SOIvses) = vses; - *(ckt->CKTstate0 + here->B4SOIvdes) = vdes; - - /* bulk and channel charge plus overlaps */ - - if (!ChargeComputationNeeded) - goto line850; - -#ifndef NOBYPASS -line755: -#endif - ag0 = ckt->CKTag[0]; - - T0 = vgd + DELTA_1; - if (here->B4SOIrgateMod == 3) T0 = vgmd + DELTA_1; /* v3.2 bug fix */ - T1 = sqrt(T0 * T0 + 4.0 * DELTA_1); - T2 = 0.5 * (T0 - T1); - - /* v2.2.3 bug fix */ - T3 = pParam->B4SOIwdiodCV * pParam->B4SOIcgdl; /* v3.1 bug fix */ - - T4 = sqrt(1.0 - 4.0 * T2 / pParam->B4SOIckappa); - cgdo = pParam->B4SOIcgdo + T3 - T3 * (1.0 - 1.0 / T4) - * (0.5 - 0.5 * T0 / T1); - qgdo = (pParam->B4SOIcgdo + T3) * vgd - T3 * (T2 - + 0.5 * pParam->B4SOIckappa * (T4 - 1.0)); - - if (here->B4SOIrgateMod == 3) { - qgdo = (pParam->B4SOIcgdo + T3) * vgmd - T3 * (T2 - + 0.5 * pParam->B4SOIckappa * (T4 - 1.0)); - } /* v3.2 bug fix */ - - T0 = vgs + DELTA_1; - if (here->B4SOIrgateMod == 3) T0 = vgms + DELTA_1; /* v3.2 bug fix */ - T1 = sqrt(T0 * T0 + 4.0 * DELTA_1); - T2 = 0.5 * (T0 - T1); - - /* v2.2.3 bug fix */ - T3 = pParam->B4SOIwdiosCV * pParam->B4SOIcgsl; /* v3.1 bug fix */ - - T4 = sqrt(1.0 - 4.0 * T2 / pParam->B4SOIckappa); - cgso = pParam->B4SOIcgso + T3 - T3 * (1.0 - 1.0 / T4) - * (0.5 - 0.5 * T0 / T1); - qgso = (pParam->B4SOIcgso + T3) * vgs - T3 * (T2 - + 0.5 * pParam->B4SOIckappa * (T4 - 1.0)); - - if (here->B4SOIrgateMod == 3) { - qgso = (pParam->B4SOIcgso + T3) * vgms - T3 * (T2 - + 0.5 * pParam->B4SOIckappa * (T4 - 1.0)); - } /* v3.2 bug fix */ - - if (here->B4SOInf != 1.0) - { cgdo *= here->B4SOInf; - cgso *= here->B4SOInf; - qgdo *= here->B4SOInf; - qgso *= here->B4SOInf; - } - /* here->B4SOIcgdo = cgdo; - here->B4SOIcgso = cgso; - */ - if (here->B4SOIdebugMod < 0) - goto line850; - - - if (here->B4SOImode > 0) - { - - /* v3.1 added for RF */ - if (here->B4SOIrgateMod == 3) - { - gcgmgmb = (cgdo + cgso + pParam->B4SOIcgeo) * ag0; - - gcgmdb = -cgdo * ag0; - gcgmsb = -cgso * ag0; - gcgmeb = -pParam->B4SOIcgeo * ag0; - gcdgmb = gcgmdb; - gcsgmb = gcgmsb; - gcegmb = gcgmeb; - - gcggb = here->B4SOIcggb * ag0; - gcgdb = here->B4SOIcgdb * ag0; - gcgsb = here->B4SOIcgsb * ag0; - gcgeb = here->B4SOIcgeb * ag0; /* fix line */ - gcgbb = -(gcggb + gcgdb + gcgsb + gcgeb); - - gcdgb = here->B4SOIcdgb * ag0; - gcegb = gcgeb; /*v3.1 added*/ - gcsgb = -(here->B4SOIcggb + here->B4SOIcbgb - + here->B4SOIcdgb) * ag0 - gcegb; - gcbgb = here->B4SOIcbgb * ag0; - - qgd = qgdo; - qgs = qgso; - qge = 0; /* v3.1 change */ - - qgme = pParam->B4SOIcgeo * vgme; - qgmid = qgdo + qgso + qgme; - qdrn += here->B4SOIqde - qgd; - qsub -= qgme + here->B4SOIqse + here->B4SOIqde; - qsrc = -(qgate + qgmid + qbody + qdrn + qsub) - qjs; - qdrn -= qjd; - if (!here->B4SOIrbodyMod) qbody += qjd + qjs; - - } - else - { - gcggb = (here->B4SOIcggb + cgdo + cgso - + pParam->B4SOIcgeo) * ag0; - gcgdb = (here->B4SOIcgdb - cgdo) * ag0; - gcgsb = (here->B4SOIcgsb - cgso) * ag0; - gcgeb = (here->B4SOIcgeb - pParam->B4SOIcgeo) *ag0; /* LFW_FD fix line */ - gcgbb = -(gcggb + gcgdb + gcgsb + gcgeb); - - gcegb = (- pParam->B4SOIcgeo) * ag0; - gcdgb = (here->B4SOIcdgb - cgdo) * ag0; - gcsgb = -(here->B4SOIcggb + here->B4SOIcbgb - + here->B4SOIcdgb + cgso) * ag0; - gcbgb = here->B4SOIcbgb * ag0; - - gcdgmb = gcsgmb = gcegmb = 0.0; - gcgmdb = gcgmsb = gcgmeb = 0.0; - - /* Lump the overlap capacitance and S/D parasitics */ - qgd = qgdo; - qgs = qgso; - qge = pParam->B4SOIcgeo * vge; - qgate += qgd + qgs + qge; - qdrn += here->B4SOIqde - qgd; - qsub -= qge + here->B4SOIqse + here->B4SOIqde; - qsrc = -(qgate + qbody + qdrn + qsub) - qjs; - qdrn -= qjd; - if (!here->B4SOIrbodyMod) qbody += qjd + qjs; - } - - gcddb = (here->B4SOIcddb + cgdo + here->B4SOIgcde) * ag0; - gcdsb = here->B4SOIcdsb * ag0; - gcdeb = (here->B4SOIcdeb - here->B4SOIgcde) * ag0; - /*fix below expression Wagner */ - /*gcdT = model->B4SOItype * here->B4SOIcdT * ag0;*/ - gcdT = here->B4SOIcdT * ag0; - - gcsdb = -(here->B4SOIcgdb + here->B4SOIcbdb - + here->B4SOIcddb) * ag0; - gcssb = (cgso + here->B4SOIgcse - (here->B4SOIcgsb - + here->B4SOIcbsb + here->B4SOIcdsb)) * ag0; - gcseb = -(here->B4SOIgcse + here->B4SOIcbeb - + here->B4SOIcdeb + here->B4SOIcgeb + here->B4SOIceeb) * ag0; /* LFW_FD fix line */ - /*fix below expression Wagner */ - /*gcsT = - model->B4SOItype * (here->B4SOIcgT */ - gcsT = - (here->B4SOIcgT - + here->B4SOIcbT + here->B4SOIcdT + here->B4SOIceT) - * ag0; - - /*fix below expression Wagner */ - /*gcgT = model->B4SOItype * here->B4SOIcgT * ag0;*/ - gcgT = here->B4SOIcgT * ag0; - - /* gcbdb = here->B4SOIcbdb * ag0; - gcbsb = here->B4SOIcbsb * ag0; - */ - gcbeb = here->B4SOIcbeb * ag0; - gcbT = model->B4SOItype * here->B4SOIcbT * ag0; - - /* v4.0 */ - if (!here->B4SOIrbodyMod) - { - gcjdbdp = gcjsbsp = 0.0; - gcdbb = -(gcdgb + gcddb + gcdsb + gcdgmb + gcdeb); - gcsbb = -(gcsgb + gcsdb + gcssb + gcsgmb + gcseb); - gcdbdb = gcsbsb = 0.0; - gcbdb = here->B4SOIcbdb * ag0; - gcbsb = here->B4SOIcbsb * ag0; - here->B4SOIGGjdb = GGjdb = 0.0; - here->B4SOIGGjsb = GGjsb = 0.0; - } - else - { - gcjdbdp = gcjdbs * ag0; - gcjsbsp = gcjsbs * ag0; - gcdbb = -(gcdgb + gcddb + gcdsb + gcdgmb + gcdeb) - + gcjdbdp; - gcsbb = -(gcsgb + gcsdb + gcssb + gcsgmb + gcseb) - + gcjsbsp; - /* v4.2 optimization: gcjdds + gcjdbs = 0 - gcdbdb = gcjdds * ag0; - gcsbsb = -(gcjdds + gcjdbs + gcjsbs) * ag0; - */ - gcdbdb = -gcjdbs * ag0; - gcsbsb = -gcjsbs * ag0; - gcbdb = here->B4SOIcbdb * ag0 - gcdbdb; - gcbsb = here->B4SOIcbsb * ag0 - gcsbsb; - here->B4SOIGGjdb = GGjdb = Gjdb; - here->B4SOIGGjsb = GGjsb = Gjsb; - } - /* v4.0 end */ - - gcedb = (- here->B4SOIgcde) * ag0; - gcesb = (- here->B4SOIgcse) * ag0; - gceeb = (here->B4SOIgcse + here->B4SOIgcde + - here->B4SOIceeb + pParam->B4SOIcgeo) * ag0; - - gceT = model->B4SOItype * here->B4SOIceT * ag0; - - gcTt = pParam->B4SOIcth * ag0; - - sxpart = 0.6; - dxpart = 0.4; - - - /* v3.1 moved the following original code ahead */ - /* Lump the overlap capacitance and S/D parasitics */ - /* qgd = qgdo; - qgs = qgso; - qge = pParam->B4SOIcgeo * vge; - qgate += qgd + qgs + qge; - qdrn += here->B4SOIqde - qgd; - qsub -= qge + here->B4SOIqse + here->B4SOIqde; - qsrc = -(qgate + qbody + qdrn + qsub); - */ - /* v3.1 end */ - - } - - else - { - if (here->B4SOIrgateMod == 3) - { - gcgmgmb = (cgdo + cgso + pParam->B4SOIcgeo) * ag0; - gcgmdb = -cgdo * ag0; - gcgmsb = -cgso * ag0; - gcgmeb = -pParam->B4SOIcgeo * ag0; - gcdgmb = gcgmdb; - gcsgmb = gcgmsb; - gcegmb = gcgmeb; - - gcggb = here->B4SOIcggb * ag0; - gcgsb = here->B4SOIcgdb * ag0; - gcgdb = here->B4SOIcgsb * ag0; - gcgeb = here->B4SOIcgeb * ag0; /* LFW_FD fix line */ - gcgbb = -(gcggb + gcgdb + gcgsb + gcgeb); /* v3.1 added gcgeb */ - - gcsgb = here->B4SOIcdgb * ag0; - gcegb = gcgeb; /* v3.1 added */ - gcdgb = -(here->B4SOIcggb + here->B4SOIcbgb - + here->B4SOIcdgb) * ag0 - gcegb; /*v3.1 added gcegb*/ - gcbgb = here->B4SOIcbgb * ag0; - - qgd = qgdo; - qgs = qgso; - qge = 0; /* v3.1 */ - qgme = pParam->B4SOIcgeo * vgme; - qgmid = qgdo + qgso + qgme; - qgate += qge; - qbody -= 0; - qsrc = qdrn - qgs + here->B4SOIqse; - qsub -= qgme + here->B4SOIqse + here->B4SOIqde; - qdrn = -(qgate + qgmid + qbody + qsrc + qsub) -qjd; - qsrc -= qjs; - if (!here->B4SOIrbodyMod) qbody += qjs + qjd; - } - else - { - gcggb = (here->B4SOIcggb + cgdo + cgso + pParam->B4SOIcgeo) * ag0; - gcgdb = (here->B4SOIcgsb - cgdo) * ag0; - gcgsb = (here->B4SOIcgdb - cgso) * ag0; - gcgeb = (here->B4SOIcgeb - pParam->B4SOIcgeo) * ag0; /* LFW_FD fix line */ - gcgbb = -(gcggb + gcgdb + gcgsb + gcgeb); /*added gcgbb*/ - - gcegb = (- pParam->B4SOIcgeo) * ag0; /* LFW_FD fix line */ - gcsgb = (here->B4SOIcdgb - cgso) * ag0; - gcdgb = -(here->B4SOIcggb + here->B4SOIcbgb + here->B4SOIcdgb + cgdo) * ag0; - gcbgb = here->B4SOIcbgb * ag0; - - gcdgmb = gcsgmb = gcegmb = 0.0; - gcgmdb = gcgmsb = gcgmeb = 0.0; - - /* Lump the overlap capacitance and S/D parasitics */ - qgd = qgdo; - qgs = qgso; - qge = pParam->B4SOIcgeo * vge; - qgate += qgd + qgs + qge; - qsrc = qdrn - qgs + here->B4SOIqse; - qsub -= qge + here->B4SOIqse + here->B4SOIqde; - qdrn = -(qgate + qbody + qsrc + qsub) - qjd; - qsrc -= qjs; - if (!here->B4SOIrbodyMod) qbody += qjs + qjd; - } - - gcssb = (here->B4SOIcddb + cgso + here->B4SOIgcse) * ag0; - gcsdb = here->B4SOIcdsb * ag0; - gcseb = (here->B4SOIcdeb - here->B4SOIgcse) * ag0; - /*fix below expression Wagner */ - /*gcsT = model->B4SOItype * here->B4SOIcdT * ag0;*/ - gcsT = here->B4SOIcdT * ag0; - - gcdsb = -(here->B4SOIcgdb + here->B4SOIcbdb - + here->B4SOIcddb) * ag0; - gcddb = (cgdo + here->B4SOIgcde - (here->B4SOIcgsb - + here->B4SOIcbsb + here->B4SOIcdsb)) * ag0; - gcdeb = -(here->B4SOIgcde + here->B4SOIcbeb - + here->B4SOIcdeb + here->B4SOIcgeb + here->B4SOIceeb) * ag0; /* LFW_FD fix line */ - /*fix below expression Wagner */ - /*gcdT = - model->B4SOItype * (here->B4SOIcgT */ - gcdT = - (here->B4SOIcgT - + here->B4SOIcbT + here->B4SOIcdT + here->B4SOIceT) - * ag0; - - /*fix below expression Wagner */ - /*gcgT = model->B4SOItype * here->B4SOIcgT * ag0;*/ - gcgT = here->B4SOIcgT * ag0; - - gcbeb = here->B4SOIcbeb * ag0; - gcbT = model->B4SOItype * here->B4SOIcbT * ag0; - /* v4.0 gcbsb = here->B4SOIcbdb * ag0; - gcbdb = here->B4SOIcbsb * ag0; - */ - - /* v4.0 */ - if (!here->B4SOIrbodyMod) - { - gcjdbdp = gcjsbsp = 0.0; - gcdbb = -(gcdgb + gcddb + gcdsb + gcdgmb + gcdeb); - gcsbb = -(gcsgb + gcsdb + gcssb + gcsgmb + gcseb); - gcdbdb = gcsbsb = 0.0; - gcbdb = here->B4SOIcbsb * ag0; - gcbsb = here->B4SOIcbdb * ag0; - here->B4SOIGGjdb = GGjdb = 0.0; - here->B4SOIGGjsb = GGjsb = 0.0; - } - else - { - /* v4.2 bugfix; qjd/qjs are not swapped - gcjdbdp = gcjsbs * ag0; - gcjsbsp = gcjdbs * ag0; - */ - gcjdbdp = gcjdbs * ag0; - gcjsbsp = gcjsbs * ag0; - gcdbb = -(gcdgb + gcddb + gcdsb + gcdgmb + gcdeb) - + gcjdbdp; - gcsbb = -(gcsgb + gcsdb + gcssb + gcsgmb + gcseb) - + gcjsbsp; - /* v4.2 bugfix; qjd/qjs are not swapped - gcsbsb = gcjdds * ag0; - gcdbdb = -(gcjdds + gcjdbs + gcjsbs) * ag0; - */ - gcsbsb = -gcjdbs * ag0; - gcdbdb = -gcjsbs * ag0; - gcbdb = here->B4SOIcbsb * ag0 - gcdbdb; - gcbsb = here->B4SOIcbdb * ag0 - gcsbsb; - here->B4SOIGGjdb = GGjdb = Gjsb; - here->B4SOIGGjsb = GGjsb = Gjdb; - } - /* v4.0 end */ - - /* gcegb = (-pParam->B4SOIcgeo) * ag0; V3.2 bug fix */ - gcesb = (- here->B4SOIgcse) * ag0; - gcedb = (- here->B4SOIgcde) * ag0; - gceeb = (here->B4SOIceeb + pParam->B4SOIcgeo + - here->B4SOIgcse + here->B4SOIgcde) * ag0; - gceT = model->B4SOItype * here->B4SOIceT * ag0; - - gcTt = pParam->B4SOIcth * ag0; - - dxpart = 0.6; - sxpart = 0.4; - - - /* v3.1 moved the following code ahead */ - /* Lump the overlap capacitance */ - /* - qgd = qgdo; - qgs = qgso; - qge = pParam->B4SOIcgeo * vge; - qgate += qgd + qgs + qge; - qsrc = qdrn - qgs + here->B4SOIqse; - qsub -= qge + here->B4SOIqse + here->B4SOIqde; - qdrn = -(qgate + qbody + qsrc + qsub); - */ - /* v3.1 end */ - - - } - - here->B4SOIcgdo = cgdo; - here->B4SOIcgso = cgso; - - if (ByPass) goto line860; - - *(ckt->CKTstate0 + here->B4SOIqe) = qsub; - *(ckt->CKTstate0 + here->B4SOIqg) = qgate; - *(ckt->CKTstate0 + here->B4SOIqd) = qdrn; - *(ckt->CKTstate0 + here->B4SOIqb) = qbody; - if ((model->B4SOIshMod == 1) && (here->B4SOIrth0!=0.0)) - *(ckt->CKTstate0 + here->B4SOIqth) = pParam->B4SOIcth * delTemp; - if (here->B4SOIrgateMod == 3) /* 3.1 bug fix */ - *(ckt->CKTstate0 + here->B4SOIqgmid) = qgmid; - - - /* store small signal parameters */ - if (ckt->CKTmode & MODEINITSMSIG) - { goto line1000; - } - if (!ChargeComputationNeeded) - goto line850; - - - if (ckt->CKTmode & MODEINITTRAN) - { *(ckt->CKTstate1 + here->B4SOIqb) = - *(ckt->CKTstate0 + here->B4SOIqb); - *(ckt->CKTstate1 + here->B4SOIqg) = - *(ckt->CKTstate0 + here->B4SOIqg); - *(ckt->CKTstate1 + here->B4SOIqd) = - *(ckt->CKTstate0 + here->B4SOIqd); - *(ckt->CKTstate1 + here->B4SOIqe) = - *(ckt->CKTstate0 + here->B4SOIqe); - *(ckt->CKTstate1 + here->B4SOIqth) = - *(ckt->CKTstate0 + here->B4SOIqth); - if (here->B4SOIrgateMod == 3) - *(ckt->CKTstate1 + here->B4SOIqgmid) = - *(ckt->CKTstate0 + here->B4SOIqgmid); - if (here->B4SOIrbodyMod) /* v4.0 */ - { *(ckt->CKTstate1 + here->B4SOIqbs) = - *(ckt->CKTstate0 + here->B4SOIqbs); - *(ckt->CKTstate1 + here->B4SOIqbd) = - *(ckt->CKTstate0 + here->B4SOIqbd); - } - - } - - error = NIintegrate(ckt, &geq, &ceq,0.0,here->B4SOIqb); - if (error) return(error); - error = NIintegrate(ckt, &geq, &ceq, 0.0, here->B4SOIqg); - if (error) return(error); - error = NIintegrate(ckt,&geq, &ceq, 0.0, here->B4SOIqd); - if (error) return(error); - error = NIintegrate(ckt,&geq, &ceq, 0.0, here->B4SOIqe); - if (error) return(error); - if ((model->B4SOIshMod == 1) && (here->B4SOIrth0!=0.0)) - { - error = NIintegrate(ckt, &geq, &ceq, 0.0, here->B4SOIqth); - if (error) return (error); - } - - if (here->B4SOIrgateMod == 3) - { error = NIintegrate(ckt, &geq, &ceq, 0.0, here->B4SOIqgmid); - if (error) return(error); - } /*3.1 bug fix*/ - - if (here->B4SOIrbodyMod) /* v4.0 */ - { error = NIintegrate(ckt, &geq, &ceq, 0.0, here->B4SOIqbs); - if (error) return(error); - error = NIintegrate(ckt, &geq, &ceq, 0.0, here->B4SOIqbd); - if (error) return(error); - } - - goto line860; - -line850: - /* initialize to zero charge conductance and current */ - ceqqe = ceqqg = ceqqb = ceqqd = ceqqth= 0.0; - - gcdgb = gcddb = gcdsb = gcdeb = gcdT = 0.0; - gcsgb = gcsdb = gcssb = gcseb = gcsT = 0.0; - gcggb = gcgdb = gcgsb = gcgeb = gcgT = 0.0; - gcbgb = gcbdb = gcbsb = gcbeb = gcbT = 0.0; - gcegb = gcedb = gceeb = gcesb = gceT = 0.0; - gcTt = 0.0; - - /* v3.1 added for RF */ - gcgmgmb = gcgmdb = gcgmsb = gcgmeb = 0.0; - gcdgmb = gcsgmb = gcegmb = ceqqgmid = 0.0; - gcgbb = gcsbb = gcdbb = 0.0; - /* v3.1 added for RF end */ - - gcdbdb = gcsbsb = gcjdbdp = gcjsbsp = 0.0; /* v4.0 */ - ceqqjd = ceqqjs = 0.0; /* v4.0 */ - GGjdb = GGjsb = 0.0; /* v4.0 */ - - sxpart = (1.0 - (dxpart = (here->B4SOImode > 0) ? 0.4 : 0.6)); - - goto line900; - -line860: - /* evaluate equivalent charge current */ - - cqgate = *(ckt->CKTstate0 + here->B4SOIcqg); - cqbody = *(ckt->CKTstate0 + here->B4SOIcqb); - cqdrn = *(ckt->CKTstate0 + here->B4SOIcqd); - cqsub = *(ckt->CKTstate0 + here->B4SOIcqe); - cqtemp = *(ckt->CKTstate0 + here->B4SOIcqth); - - here->B4SOIcb += cqbody; - here->B4SOIcd += cqdrn; - - ceqqg = cqgate - gcggb * vgb + gcgdb * vbd + gcgsb * vbs - - gcgeb * veb - gcgT * delTemp; - - ceqqb = cqbody - gcbgb * vgb + gcbdb * vbd + gcbsb * vbs - - gcbeb * veb - gcbT * delTemp; /* v3.2 bug fix */ - ceqqd = cqdrn - gcdgb * vgb + (gcddb + gcdbdb) * vbd - + gcdsb * vbs - gcdeb * veb - gcdT * delTemp - - gcdbdb * vbd_jct - gcdgmb * vgmb;/* v4.0 */ - - ceqqe = cqsub - gcegb * vgb + gcedb * vbd + gcesb * vbs - - gceeb * veb - gceT * delTemp - gcegmb * vgmb; /* 3.2 bug fix */ - ceqqth = cqtemp - gcTt * delTemp; - - /* v3.1 added for RF */ - if (here->B4SOIrgateMod == 3) - ceqqgmid = *(ckt->CKTstate0 + here->B4SOIcqgmid) - + gcgmdb * vbd + gcgmsb * vbs - gcgmgmb * vgmb;/* 3.2 bug fix */ - else - ceqqgmid = 0.0; - /* v3.1 added for RF end */ - - if (here->B4SOIrbodyMod) /* v4.0 */ - { ceqqjs = *(ckt->CKTstate0 + here->B4SOIcqbs) - + gcsbsb * vbs_jct; - ceqqjd = *(ckt->CKTstate0 + here->B4SOIcqbd) - + gcdbdb * vbd_jct; - } - - if (ckt->CKTmode & MODEINITTRAN) - { *(ckt->CKTstate1 + here->B4SOIcqe) = - *(ckt->CKTstate0 + here->B4SOIcqe); - *(ckt->CKTstate1 + here->B4SOIcqb) = - *(ckt->CKTstate0 + here->B4SOIcqb); - *(ckt->CKTstate1 + here->B4SOIcqg) = - *(ckt->CKTstate0 + here->B4SOIcqg); - *(ckt->CKTstate1 + here->B4SOIcqd) = - *(ckt->CKTstate0 + here->B4SOIcqd); - *(ckt->CKTstate1 + here->B4SOIcqth) = - *(ckt->CKTstate0 + here->B4SOIcqth); - - if (here->B4SOIrgateMod == 3) /* v3.1 */ - *(ckt->CKTstate1 + here->B4SOIcqgmid) = - *(ckt->CKTstate0 + here->B4SOIcqgmid); - - if (here->B4SOIrbodyMod) /* v4.0 */ - { *(ckt->CKTstate1 + here->B4SOIcqbs) = - *(ckt->CKTstate0 + here->B4SOIcqbs); - *(ckt->CKTstate1 + here->B4SOIcqbd) = - *(ckt->CKTstate0 + here->B4SOIcqbd); - } - - } - - /* - * load current vector - */ -line900: - - if (here->B4SOImode >= 0) - { Gm = here->B4SOIgm; - Gmbs = here->B4SOIgmbs; - /* v3.0 */ - Gme = here->B4SOIgme; - - GmT = model->B4SOItype * here->B4SOIgmT; - FwdSum = Gm + Gmbs + Gme; /* v3.0 */ - RevSum = 0.0; - - /* v2.2.2 bug fix */ - cdreq = model->B4SOItype * (here->B4SOIcdrain - - here->B4SOIgds * vds - Gm * vgs - Gmbs * vbs - - Gme * ves) - GmT * delTemp; /* v3.0 */ - - /* ceqbs now is compatible with cdreq, ie. going in is +ve */ - /* Equivalent current source from the diode */ - ceqbs = here->B4SOIcjs; - ceqbd = here->B4SOIcjd; - cdbdp = Idbdp; - csbsp = Isbsp; - - /* Current going in is +ve */ - ceqbody = -here->B4SOIcbody; - - ceqgate = here->B4SOIcgate; - gigg = here->B4SOIgigg; - gigb = here->B4SOIgigb; - gige = here->B4SOIgige; /* v3.0 */ - gigs = here->B4SOIgigs; - gigd = here->B4SOIgigd; - gigT = model->B4SOItype * here->B4SOIgigT; - - ceqth = here->B4SOIcth; - ceqbodcon = here->B4SOIcbodcon; - - /* v4.1 */ - gigpg = here->B4SOIgigpg; - gigpp = here->B4SOIgigpp; - ceqgate += (here->B4SOIigp - gigpg * vgp); - if(here->B4SOIbodyMod == 1) - ceqbodcon += (here->B4SOIigp - gigpg * vgp); - else if(here->B4SOIbodyMod == 2) - ceqbody -= (here->B4SOIigp - gigpg * vgp); - - gbbg = -here->B4SOIgbgs; - gbbdp = -here->B4SOIgbds; - gbbb = -here->B4SOIgbbs; - gbbp = -here->B4SOIgbps; - gbbT = -model->B4SOItype * here->B4SOIgbT; - /* v3.0 */ - gbbe = -here->B4SOIgbes; - - if (here->B4SOIrbodyMod) { /* v4.0 */ - gbbdp = -Giid - Ggidld - Ggisls; - gbbb = -Giib + Gbpbs; - gjsdb = Gjsb + Gjdb; - } - - gbbsp = - ( gbbg + gbbdp + gbbb + gbbp + gbbe); - - gddpg = -here->B4SOIgjdg; - gddpdp = -here->B4SOIgjdd; - if (!here->B4SOIrbodyMod) /* v4.0 */ - gddpb = -here->B4SOIgjdb; - else - gddpb = Giib + Ggidlb + Ggislb; - gddpT = -model->B4SOItype * here->B4SOIgjdT; - /* v3.0 */ - gddpe = -here->B4SOIgjde; - gddpsp = - ( gddpg + gddpdp + gddpb + gddpe); - - gsspg = -here->B4SOIgjsg; - gsspdp = -here->B4SOIgjsd; - if (!here->B4SOIrbodyMod) - gsspb = -here->B4SOIgjsb; - else - gsspb = 0.0; - gsspT = -model->B4SOItype * here->B4SOIgjsT; - /* v3.0 */ - gsspe = 0.0; - gsspsp = - (gsspg + gsspdp + gsspb + gsspe); - - gppb = -here->B4SOIgbpbs; - gppp = -here->B4SOIgbpps; - - gTtg = here->B4SOIgtempg; - gTtb = here->B4SOIgtempb; - gTtdp = here->B4SOIgtempd; - gTtt = here->B4SOIgtempT; - - /* v3.0 */ - gTte = here->B4SOIgtempe; - gTtsp = - (gTtg + gTtb + gTtdp + gTte); - - - /* v3.0 */ - if (model->B4SOIigcMod) - { gIstotg = here->B4SOIgIgsg + here->B4SOIgIgcsg; - gIstotd = here->B4SOIgIgcsd; - gIstots = here->B4SOIgIgss + here->B4SOIgIgcss; - gIstotb = here->B4SOIgIgcsb; - Istoteq = model->B4SOItype * (here->B4SOIIgs + here->B4SOIIgcs - - gIstotg * vgs - here->B4SOIgIgcsd * vds - - here->B4SOIgIgcsb * vbs); - - gIdtotg = here->B4SOIgIgdg + here->B4SOIgIgcdg; - gIdtotd = here->B4SOIgIgdd + here->B4SOIgIgcdd; - gIdtots = here->B4SOIgIgcds; - gIdtotb = here->B4SOIgIgcdb; - Idtoteq = model->B4SOItype * (here->B4SOIIgd + here->B4SOIIgcd - - here->B4SOIgIgdg * vgd - here->B4SOIgIgcdg * vgs - - here->B4SOIgIgcdd * vds - here->B4SOIgIgcdb * vbs); - - gIgtotg = gIstotg + gIdtotg; - gIgtotd = gIstotd + gIdtotd; - gIgtots = gIstots + gIdtots; - gIgtotb = gIstotb + gIdtotb; - Igtoteq = Istoteq + Idtoteq; - } - else - { gIstotg = gIstotd = gIstots = gIstotb = Istoteq = 0.0; - gIdtotg = gIdtotd = gIdtots = gIdtotb = Idtoteq = 0.0; - - gIgtotg = gIgtotd = gIgtots = gIgtotb = Igtoteq = 0.0; - } - - /* v3.1 added for RF */ - if (here->B4SOIrgateMod == 2) - T0 = vges - vgs; - else if (here->B4SOIrgateMod == 3) - T0 = vgms - vgs; - if (here->B4SOIrgateMod > 1) - { - gcrgd = here->B4SOIgcrgd * T0; - gcrgg = here->B4SOIgcrgg * T0; - gcrgs = here->B4SOIgcrgs * T0; - gcrgb = here->B4SOIgcrgb * T0; - - ceqgcrg = -(gcrgd * vds + gcrgg * vgs - + gcrgb * vbs); - gcrgg -= here->B4SOIgcrg; - gcrg = here->B4SOIgcrg; - } - else - ceqgcrg = gcrg = gcrgd = gcrgg = gcrgs = gcrgb = 0.0; - /* v3.1 added for RF end */ - - } /* end of soimode>=0 */ - - else - { Gm = -here->B4SOIgm; - Gmbs = -here->B4SOIgmbs; - /* v3.0 */ - Gme = -here->B4SOIgme; - - GmT = -model->B4SOItype * here->B4SOIgmT; - FwdSum = 0.0; - RevSum = -(Gm + Gmbs + Gme); /* v3.0 */ - - - /* v3.1 bug fix */ - cdreq = -model->B4SOItype * (here->B4SOIcdrain + here->B4SOIgds*vds - + Gm * vgd + Gmbs * vbd + Gme * (ves - vds)) - - GmT * delTemp; - - - ceqbs = here->B4SOIcjd; - ceqbd = here->B4SOIcjs; - csbsp = Idbdp; - cdbdp = Isbsp; - - /* Current going in is +ve */ - ceqbody = -here->B4SOIcbody; - - - ceqgate = here->B4SOIcgate; - gigg = here->B4SOIgigg; - gigb = here->B4SOIgigb; - gige = here->B4SOIgige; /* v3.0 */ - gigs = here->B4SOIgigd; - gigd = here->B4SOIgigs; - gigT = model->B4SOItype * here->B4SOIgigT; - - ceqth = here->B4SOIcth; - ceqbodcon = here->B4SOIcbodcon; - - /* v4.1 */ - gigpg = here->B4SOIgigpg; - gigpp = here->B4SOIgigpp; - ceqgate += (here->B4SOIigp - gigpg * vgp); - if(here->B4SOIbodyMod == 1) - ceqbodcon += (here->B4SOIigp - gigpg * vgp); - else if(here->B4SOIbodyMod == 2) - ceqbody -= (here->B4SOIigp - gigpg * vgp); - - gbbg = -here->B4SOIgbgs; - gbbb = -here->B4SOIgbbs; - gbbp = -here->B4SOIgbps; - gbbsp = -here->B4SOIgbds; - gbbT = -model->B4SOItype * here->B4SOIgbT; - /* v3.0 */ - gbbe = -here->B4SOIgbes; - - if (here->B4SOIrbodyMod) { /* v4.0 */ - gbbsp = -Giid - Ggidld - Ggisls; - gbbb = -Giib + Gbpbs; - gjsdb = Gjsb + Gjdb; - } - gbbdp = - ( gbbg + gbbsp + gbbb + gbbp + gbbe); - - gddpg = -here->B4SOIgjsg; - gddpsp = -here->B4SOIgjsd; - if (!here->B4SOIrbodyMod) - gddpb = -here->B4SOIgjsb; - else - gddpb = 0.0; - gddpT = -model->B4SOItype * here->B4SOIgjsT; - /* v3.0 */ - gddpe = 0.0; - gddpdp = - (gddpg + gddpsp + gddpb + gddpe); - - gsspg = -here->B4SOIgjdg; - gsspsp = -here->B4SOIgjdd; - if (!here->B4SOIrbodyMod) - gsspb = -here->B4SOIgjdb; - else - gsspb = Giib + Ggidlb + Ggislb; - gsspT = -model->B4SOItype * here->B4SOIgjdT; - /* v3.0 */ - gsspe = -here->B4SOIgjde; - gsspdp = - ( gsspg + gsspsp + gsspb + gsspe); - - gppb = -here->B4SOIgbpbs; - gppp = -here->B4SOIgbpps; - - gTtg = here->B4SOIgtempg; - gTtb = here->B4SOIgtempb; - gTtsp = here->B4SOIgtempd; - gTtt = here->B4SOIgtempT; - - /* v3.0 */ - gTte = here->B4SOIgtempe; - gTtdp = - (gTtg + gTtb + gTtsp + gTte); - - /* v3.0 */ - if (model->B4SOIigcMod) - { gIstotg = here->B4SOIgIgsg + here->B4SOIgIgcdg; - gIstotd = here->B4SOIgIgcds; - gIstots = here->B4SOIgIgss + here->B4SOIgIgcdd; - gIstotb = here->B4SOIgIgcdb; - Istoteq = model->B4SOItype * (here->B4SOIIgs + here->B4SOIIgcd - - here->B4SOIgIgsg * vgs - here->B4SOIgIgcdg * vgd - + here->B4SOIgIgcdd * vds - here->B4SOIgIgcdb * vbd); - - gIdtotg = here->B4SOIgIgdg + here->B4SOIgIgcsg; - gIdtotd = here->B4SOIgIgdd + here->B4SOIgIgcss; - gIdtots = here->B4SOIgIgcsd; - gIdtotb = here->B4SOIgIgcsb; - Idtoteq = model->B4SOItype * (here->B4SOIIgd + here->B4SOIIgcs - - (here->B4SOIgIgdg + here->B4SOIgIgcsg) * vgd - + here->B4SOIgIgcsd * vds - here->B4SOIgIgcsb * vbd); - - gIgtotg = gIstotg + gIdtotg; - gIgtotd = gIstotd + gIdtotd; - gIgtots = gIstots + gIdtots; - gIgtotb = gIstotb + gIdtotb; - Igtoteq = Istoteq + Idtoteq; - - } - else - { gIstotg = gIstotd = gIstots = gIstotb = Istoteq = 0.0; - gIdtotg = gIdtotd = gIdtots = gIdtotb = Idtoteq = 0.0; - - gIgtotg = gIgtotd = gIgtots = gIgtotb = Igtoteq = 0.0; - } - - /* v3.1 added for RF */ - if (here->B4SOIrgateMod == 2) - T0 = vges - vgs; - else if (here->B4SOIrgateMod == 3) - T0 = vgms - vgs; - if (here->B4SOIrgateMod > 1) - { - gcrgd = here->B4SOIgcrgs * T0; - gcrgg = here->B4SOIgcrgg * T0; - gcrgs = here->B4SOIgcrgd * T0; - gcrgb = here->B4SOIgcrgb * T0; - ceqgcrg = -(gcrgg * vgd - gcrgs * vds - + gcrgb * vbd); - gcrgg -= here->B4SOIgcrg; - gcrg = here->B4SOIgcrg; - } - else - ceqgcrg = gcrg = gcrgd = gcrgg = gcrgs = gcrgb = 0.0; - /* v3.1 added for RF end */ - - } /* end of soimod<0 */ - - - if (model->B4SOIrdsMod == 1) - { ceqgstot = model->B4SOItype * (here->B4SOIgstotd * vds - + here->B4SOIgstotg * vgs + here->B4SOIgstotb * vbs); - /* ceqgstot flowing away from sNodePrime */ - gstot = here->B4SOIgstot; - gstotd = here->B4SOIgstotd; - gstotg = here->B4SOIgstotg; - gstots = here->B4SOIgstots - gstot; - gstotb = here->B4SOIgstotb; - - ceqgdtot = -model->B4SOItype * (here->B4SOIgdtotd * vds - + here->B4SOIgdtotg * vgs + here->B4SOIgdtotb * vbs); - /* ceqgdtot defined as flowing into dNodePrime */ - gdtot = here->B4SOIgdtot; - gdtotd = here->B4SOIgdtotd - gdtot; - gdtotg = here->B4SOIgdtotg; - gdtots = here->B4SOIgdtots; - gdtotb = here->B4SOIgdtotb; - } - else - { gstot = gstotd = gstotg = gstots - = gstotb = ceqgstot = 0.0; - gdtot = gdtotd = gdtotg = gdtots - = gdtotb = ceqgdtot = 0.0; - } - - if (model->B4SOItype < 0) - { - ceqbodcon = -ceqbodcon; - ceqbody = -ceqbody; - ceqgate = -ceqgate; - ceqbs = -ceqbs; - ceqbd = -ceqbd; - ceqqg = -ceqqg; - ceqqb = -ceqqb; - ceqqd = -ceqqd; - ceqqe = -ceqqe; - cdbdp = - cdbdp; /* v4.0 */ - csbsp = - csbsp; /* v4.0 */ - - - ceqgcrg = -ceqgcrg; /* v3.1 */ - if (here->B4SOIrgateMod == 3) - ceqqgmid = -ceqqgmid; - - if (here->B4SOIrbodyMod) /* v4.0 */ - { ceqqjs = -ceqqjs; - ceqqjd = -ceqqjd; - } - - } - - m = here->B4SOIm; - - /* v3.1 */ - -#ifndef USE_OMP - /* v3.1 added ceqgcrg for RF */ - (*(ckt->CKTrhs + here->B4SOIgNode) -= m * ((ceqgate + ceqqg) - + Igtoteq - ceqgcrg)); - /* v3.1 added ceqgcrg for RF end */ - - (*(ckt->CKTrhs + here->B4SOIdNodePrime) += m * ((ceqbd - cdreq - - ceqqd) + Idtoteq - /* v4.0 */ + ceqgdtot)); - if (!here->B4SOIrbodyMod) { - (*(ckt->CKTrhs + here->B4SOIsNodePrime) += m * ((cdreq + ceqbs - + ceqqg + ceqqb + ceqqd + ceqqe) + Istoteq - + ceqqgmid - ceqgstot)); /* v4.0 */ - } - else { /* v4.0 */ - (*(ckt->CKTrhs + here->B4SOIsNodePrime) += m * ((cdreq + ceqbs - + ceqqg + ceqqb + ceqqd + ceqqe) + Istoteq - + ceqqgmid + ceqqjd + ceqqjs - ceqgstot)); - } - - (*(ckt->CKTrhs + here->B4SOIeNode) -= m * ceqqe); - - if (here->B4SOIrgateMod == 2) - (*(ckt->CKTrhs + here->B4SOIgNodeExt) -= m * ceqgcrg); - else if (here->B4SOIrgateMod == 3) - (*(ckt->CKTrhs + here->B4SOIgNodeMid) -= m * (ceqqgmid - + ceqgcrg)); - - if (here->B4SOIbodyMod == 1) { - (*(ckt->CKTrhs + here->B4SOIpNode) += m * ceqbodcon); - } - - if ( here->B4SOIsoiMod != 2 ) - {if (!here->B4SOIrbodyMod) - (*(ckt->CKTrhs + here->B4SOIbNode) -= m * (ceqbody + ceqqb)); - else /* v4.0 */ - { (*(ckt->CKTrhs + here->B4SOIdbNode) -= m * (cdbdp + ceqqjd)); - (*(ckt->CKTrhs + here->B4SOIbNode) -= m * (ceqbody + ceqqb)); - (*(ckt->CKTrhs + here->B4SOIsbNode) -= m * (csbsp + ceqqjs)); - } - } - - if (selfheat) { - (*(ckt->CKTrhs + here->B4SOItempNode) -= m * (ceqth + ceqqth)); - } - - if (model->B4SOIrdsMod) - { (*(ckt->CKTrhs + here->B4SOIdNode) -= m * ceqgdtot); - (*(ckt->CKTrhs + here->B4SOIsNode) += m * ceqgstot); - } - -#else - /* OpenMP parallelization: - Temporary storage of right hand side values into instance storage space. - Update to matrix will be done by function B4SOILoadRhsMat() only when all - instances have their values stored. */ - - /* v3.1 added ceqgcrg for RF */ - here->B4SOINode_1 = m * ((ceqgate + ceqqg) - + Igtoteq - ceqgcrg); - /* v3.1 added ceqgcrg for RF end */ - - here->B4SOINode_2 = m * ((ceqbd - cdreq - - ceqqd) + Idtoteq - /* v4.0 */ + ceqgdtot); - if (!here->B4SOIrbodyMod) { - here->B4SOINode_3 = m * ((cdreq + ceqbs - + ceqqg + ceqqb + ceqqd + ceqqe) + Istoteq - + ceqqgmid - ceqgstot); /* v4.0 */ - } - else { /* v4.0 */ - here->B4SOINode_4 = m * ((cdreq + ceqbs - + ceqqg + ceqqb + ceqqd + ceqqe) + Istoteq - + ceqqgmid + ceqqjd + ceqqjs - ceqgstot); - } - - here->B4SOINode_5 = m * ceqqe; - - if (here->B4SOIrgateMod == 2) - here->B4SOINode_6 = m * ceqgcrg; - else if (here->B4SOIrgateMod == 3) - here->B4SOINode_7 = m * (ceqqgmid - + ceqgcrg); - - if (here->B4SOIbodyMod == 1) { - here->B4SOINode_8 = m * ceqbodcon; - } - - if ( here->B4SOIsoiMod != 2 ) - {if (!here->B4SOIrbodyMod) - here->B4SOINode_9 = m * (ceqbody + ceqqb); - else /* v4.0 */ { - here->B4SOINode_10 = m * (cdbdp + ceqqjd); - here->B4SOINode_11 = m * (ceqbody + ceqqb); - here->B4SOINode_12 = m * (csbsp + ceqqjs); - } - } - here->B4SOINode_sh = selfheat; - - if (selfheat) { - here->B4SOINode_13 = m * (ceqth + ceqqth); - } - - if (model->B4SOIrdsMod) - { here->B4SOINode_14 = m * ceqgdtot; - here->B4SOINode_15 = m * ceqgstot; - } - -#endif - if (here->B4SOIdebugMod != 0) - { - *(ckt->CKTrhs + here->B4SOIvbsNode) = here->B4SOIvbseff; - *(ckt->CKTrhs + here->B4SOIidsNode) = FLOG(here->B4SOIids); - *(ckt->CKTrhs + here->B4SOIicNode) = FLOG(here->B4SOIic); - *(ckt->CKTrhs + here->B4SOIibsNode) = FLOG(here->B4SOIibs); - *(ckt->CKTrhs + here->B4SOIibdNode) = FLOG(here->B4SOIibd); - *(ckt->CKTrhs + here->B4SOIiiiNode) = FLOG(here->B4SOIiii); - *(ckt->CKTrhs + here->B4SOIigNode) = here->B4SOIig; - *(ckt->CKTrhs + here->B4SOIgiggNode) = here->B4SOIgigg; - *(ckt->CKTrhs + here->B4SOIgigdNode) = here->B4SOIgigd; - *(ckt->CKTrhs + here->B4SOIgigbNode) = here->B4SOIgigb; - *(ckt->CKTrhs + here->B4SOIigidlNode) = here->B4SOIigidl; - *(ckt->CKTrhs + here->B4SOIitunNode) = here->B4SOIitun; - *(ckt->CKTrhs + here->B4SOIibpNode) = here->B4SOIibp; - *(ckt->CKTrhs + here->B4SOIcbbNode) = here->B4SOIcbb; - *(ckt->CKTrhs + here->B4SOIcbdNode) = here->B4SOIcbd; - *(ckt->CKTrhs + here->B4SOIcbgNode) = here->B4SOIcbg; - *(ckt->CKTrhs + here->B4SOIqbfNode) = here->B4SOIqbf; - *(ckt->CKTrhs + here->B4SOIqjsNode) = here->B4SOIqjs; - *(ckt->CKTrhs + here->B4SOIqjdNode) = here->B4SOIqjd; - - } - - if (!model->B4SOIrdsMod) - { gdpr = here->B4SOIdrainConductance; - gspr = here->B4SOIsourceConductance; - } - else - gdpr = gspr = 0.0; /* v4.0 */ - - /* - * load y matrix - */ - Gmin = ckt->CKTgmin * 1e-6; - - /* v3.1 added for RF */ - geltd = here->B4SOIgrgeltd; - -#ifndef USE_OMP - if (here->B4SOIrgateMod == 1) - { - *(here->B4SOIGEgePtr) += m * geltd; - *(here->B4SOIGgePtr) -= m * geltd; - *(here->B4SOIGEgPtr) -= m * geltd; - } - else if (here->B4SOIrgateMod == 2) - { - *(here->B4SOIGEgePtr) += m * gcrg; - *(here->B4SOIGEgPtr) += m * gcrgg; - *(here->B4SOIGEdpPtr) += m * gcrgd; - *(here->B4SOIGEspPtr) += m * gcrgs; - *(here->B4SOIGgePtr) -= m * gcrg; - if (here->B4SOIsoiMod !=2) /* v3.2 */ - *(here->B4SOIGEbPtr) += m * gcrgb; - } - else if (here->B4SOIrgateMod == 3) - { - *(here->B4SOIGEgePtr) += m * geltd; - *(here->B4SOIGEgmPtr) -= m * geltd; - *(here->B4SOIGMgePtr) -= m * geltd; - *(here->B4SOIGMgmPtr) += m * (geltd + gcrg + gcgmgmb); - - *(here->B4SOIGMdpPtr) += m * (gcrgd + gcgmdb); - *(here->B4SOIGMgPtr) += m * gcrgg; - *(here->B4SOIGMspPtr) += m * (gcrgs + gcgmsb); - *(here->B4SOIGMePtr) += m * gcgmeb; - if (here->B4SOIsoiMod !=2) /* v3.2 */ - *(here->B4SOIGMbPtr) += m * gcrgb; - - *(here->B4SOIDPgmPtr) += m * gcdgmb; - *(here->B4SOIGgmPtr) -= m * gcrg; - *(here->B4SOISPgmPtr) += m * gcsgmb; - *(here->B4SOIEgmPtr) += m * gcegmb; - } - /* v3.1 added for RF end*/ - - - /* v3.0 */ - if (here->B4SOIsoiMod != 0) /* v3.2 */ - { - (*(here->B4SOIDPePtr) += m * (Gme + gddpe)); - (*(here->B4SOISPePtr) += m * (gsspe - Gme)); - - if (here->B4SOIsoiMod != 2) /* v3.2 */ - { - *(here->B4SOIGePtr) += m * gige; - *(here->B4SOIBePtr) -= m * gige; - } - } - - *(here->B4SOIEdpPtr) += m * gcedb; - *(here->B4SOIEspPtr) += m * gcesb; - *(here->B4SOIDPePtr) += m * gcdeb; - *(here->B4SOISPePtr) += m * gcseb; - *(here->B4SOIEgPtr) += m * gcegb; - *(here->B4SOIGePtr) += m * gcgeb; - - /* v3.1 */ - if (here->B4SOIsoiMod != 2) /* v3.2 */ - { - (*(here->B4SOIEbPtr) -= m * (gcegb + gcedb + gcesb + gceeb + gcegmb)); /* 3.2 bug fix */ - - /* v3.1 changed GbPtr for RF */ - if ((here->B4SOIrgateMod == 0) || (here->B4SOIrgateMod == 1)) - (*(here->B4SOIGbPtr) -= m * (-gigb + gcggb + gcgdb + gcgsb - + gcgeb - gIgtotb)); - else /* v3.1 for rgateMod = 2 or 3 */ - *(here->B4SOIGbPtr) += m * (gigb + gcgbb +gIgtotb - gcrgb); - - - (*(here->B4SOIDPbPtr) -= m * (-gddpb - Gmbs - gcdbb + gdtotb - + gIdtotb )); /* v4.0 */ - - /* (*(here->B4SOIDPbPtr) -= (-gddpb - Gmbs + gcdgb + gcddb - + gcdeb + gcdsb) + gcdgmb - + gIdtotb ); - */ - - (*(here->B4SOISPbPtr) -= m * (-gsspb + Gmbs - gcsbb + gstotb - + Gmin + gIstotb)); /* v4.0 */ - - /* (*(here->B4SOISPbPtr) -= (-gsspb + Gmbs + gcsgb + gcsdb - + gcseb + gcssb) + gcsgmb - + Gmin + gIstotb); - */ - (*(here->B4SOIBePtr) += m * (gbbe + gcbeb)); /* v3.0 */ - (*(here->B4SOIBgPtr) += m * (-gigg + gcbgb + gbbg)); - (*(here->B4SOIBdpPtr) += m * (-gigd + gcbdb + gbbdp )); - - (*(here->B4SOIBspPtr) += m * (gcbsb + gbbsp - Gmin - - gigs)); - /* if (!here->B4SOIrbodyMod) - */ - (*(here->B4SOIBbPtr) += m * (-gigb + gbbb - gcbgb - gcbdb - - gcbsb - gcbeb + Gmin)) ; - /* else - (*(here->B4SOIBbPtr) += -gigb - (Giib - Gbpbs) - gcbgb - - gcbdb - gcbsb - gcbeb + Gmin) ; - */ - /* v4.0 */ - if (here->B4SOIrbodyMod) { - (*(here->B4SOIDPdbPtr) += m * (-gcjdbdp - GGjdb)); - (*(here->B4SOISPsbPtr) += m * (-gcjsbsp - GGjsb)); - (*(here->B4SOIDBdpPtr) += m * (-gcjdbdp - GGjdb)); - (*(here->B4SOIDBdbPtr) += m * (gcjdbdp + GGjdb - + here->B4SOIgrbdb)); - (*(here->B4SOIDBbPtr) -= m * here->B4SOIgrbdb); - (*(here->B4SOISBspPtr) += m * (-gcjsbsp - GGjsb)); - (*(here->B4SOISBbPtr) -= m * here->B4SOIgrbsb); - (*(here->B4SOISBsbPtr) += m * (gcjsbsp + GGjsb - + here->B4SOIgrbsb)); - (*(here->B4SOIBdbPtr) -= m * here->B4SOIgrbdb); - (*(here->B4SOIBsbPtr) -= m * here->B4SOIgrbsb); - (*(here->B4SOIBbPtr) += m * (here->B4SOIgrbsb - + here->B4SOIgrbdb)); - } - if (model->B4SOIrdsMod) - { - (*(here->B4SOIDbPtr) += m * gdtotb); - (*(here->B4SOISbPtr) += m * gstotb); - } - - } - /* v3.1 */ - if (model->B4SOIrdsMod) - { (*(here->B4SOIDgPtr) += m * gdtotg); - (*(here->B4SOIDspPtr) += m * gdtots); - (*(here->B4SOISdpPtr) += m * gstotd); - (*(here->B4SOISgPtr) += m * gstotg); - } - - (*(here->B4SOIEePtr) += m * gceeb); - - if (here->B4SOIrgateMod == 0) - { - (*(here->B4SOIGgPtr) += m * (gigg + gcggb + Gmin - + gIgtotg)); - (*(here->B4SOIGdpPtr) += m * (gigd + gcgdb - Gmin - + gIgtotd)); - (*(here->B4SOIGspPtr) += m * (gcgsb + gigs + gIgtots)); - } - else if (here->B4SOIrgateMod == 1) /* v3.1 for RF */ - { - *(here->B4SOIGgPtr) += m * (gigg + gcggb + Gmin - + gIgtotg + geltd); - *(here->B4SOIGdpPtr) += m * (gigd + gcgdb - Gmin - + gIgtotd); - *(here->B4SOIGspPtr) += m * (gcgsb + gigs + gIgtots); - } - else /* v3.1 for RF rgateMod == 2 or 3 */ - { - *(here->B4SOIGgPtr) += m * (gigg + gcggb + Gmin - + gIgtotg - gcrgg); - *(here->B4SOIGdpPtr) += m * (gigd + gcgdb - Gmin - + gIgtotd - gcrgd); - *(here->B4SOIGspPtr) += m * (gcgsb + gigs + gIgtots - gcrgs); - } - - - (*(here->B4SOIDPgPtr) += m * ((Gm + gcdgb) + gddpg - Gmin - - gIdtotg - gdtotg)); /* v4.0 */ - (*(here->B4SOIDPdpPtr) += m * ((gdpr + here->B4SOIgds + gddpdp - + RevSum + gcddb) + Gmin - - gIdtotd - gdtotd)); /* v4.0 */ - (*(here->B4SOIDPspPtr) -= m * ((-gddpsp + here->B4SOIgds + FwdSum - - gcdsb) + gIdtots + gdtots)); - - (*(here->B4SOIDPdPtr) -= m * (gdpr + gdtot)); - - (*(here->B4SOISPgPtr) += m * (gcsgb - Gm + gsspg - gIstotg - - gstotg)); /* v4.0 */ - (*(here->B4SOISPdpPtr) -= m * ((here->B4SOIgds - gsspdp + RevSum - - gcsdb + gIstotd) + gstotd)); /* v4.0 */ - - (*(here->B4SOISPspPtr) += m * ((gspr - gstots - + here->B4SOIgds + gsspsp - + FwdSum + gcssb) - + Gmin - gIstots)); /* v4.0 */ - - (*(here->B4SOISPsPtr) -= m * (gspr + gstot)); - - - (*(here->B4SOIDdPtr) += m * (gdpr + gdtot)); - (*(here->B4SOIDdpPtr) -= m * (gdpr - gdtotd)); - - - (*(here->B4SOISsPtr) += m * (gspr + gstot)); - (*(here->B4SOISspPtr) -= m * (gspr - gstots)); - - - if (here->B4SOIbodyMod == 1) { - (*(here->B4SOIBpPtr) -= m * gppp); - (*(here->B4SOIPbPtr) += m * gppb); - (*(here->B4SOIPpPtr) += m * gppp); - } - - /* v4.1 Ig_agbcp2 stamping */ - (*(here->B4SOIGgPtr) += m * gigpg); - if (here->B4SOIbodyMod == 1) { - (*(here->B4SOIPpPtr) -= m * gigpp); - (*(here->B4SOIPgPtr) -= m * gigpg); - (*(here->B4SOIGpPtr) += m * gigpp); - } - else if(here->B4SOIbodyMod == 2) - { - (*(here->B4SOIBbPtr) -= m * gigpp); - (*(here->B4SOIBgPtr) -= m * gigpg); - (*(here->B4SOIGbPtr) += m * gigpp); - } - - - if (selfheat) - { - (*(here->B4SOIDPtempPtr) += m * (GmT + gddpT + gcdT)); - (*(here->B4SOISPtempPtr) += m * (-GmT + gsspT + gcsT)); - (*(here->B4SOIBtempPtr) += m * (gbbT + gcbT - gigT)); - (*(here->B4SOIEtempPtr) += m * gceT); - (*(here->B4SOIGtempPtr) += m * (gcgT + gigT)); - (*(here->B4SOITemptempPtr) += m * (gTtt + 1/pParam->B4SOIrth + gcTt)); - (*(here->B4SOITempgPtr) += m * gTtg); - (*(here->B4SOITempbPtr) += m * gTtb); - (*(here->B4SOITempdpPtr) += m * gTtdp); - (*(here->B4SOITempspPtr) += m * gTtsp); - - /* v3.0 */ - if (here->B4SOIsoiMod != 0) /* v3.2 */ - (*(here->B4SOITempePtr) += m * gTte); - - } -#else - /* OpenMP parallelization: - Temporary storage of matrix values into instance storage space. - Update to matrix will be done by function B4SOILoadRhsMat() only when all - instances have their values stored. */ - - if (here->B4SOIrgateMod == 1) - { - here->B4SOI_1 = m * geltd; - here->B4SOI_2 = m * geltd; - here->B4SOI_3 = m * geltd; - } - else if (here->B4SOIrgateMod == 2) - { - here->B4SOI_4 = m * gcrg; - here->B4SOI_5 = m * gcrgg; - here->B4SOI_6 = m * gcrgd; - here->B4SOI_7 = m * gcrgs; - here->B4SOI_8 = m * gcrg; - if (here->B4SOIsoiMod !=2) /* v3.2 */ - here->B4SOI_9 = m * gcrgb; - } - else if (here->B4SOIrgateMod == 3) - { - here->B4SOI_10 = m * geltd; - here->B4SOI_11 = m * geltd; - here->B4SOI_12 = m * geltd; - here->B4SOI_13 = m * (geltd + gcrg + gcgmgmb); - - here->B4SOI_14 = m * (gcrgd + gcgmdb); - here->B4SOI_15 = m * gcrgg; - here->B4SOI_16 = m * (gcrgs + gcgmsb); - here->B4SOI_17 = m * gcgmeb; - if (here->B4SOIsoiMod !=2) /* v3.2 */ - here->B4SOI_18 = m * gcrgb; - - here->B4SOI_19 = m * gcdgmb; - here->B4SOI_20 = m * gcrg; - here->B4SOI_21 = m * gcsgmb; - here->B4SOI_22 = m * gcegmb; - } - /* v3.1 added for RF end*/ - - - /* v3.0 */ - if (here->B4SOIsoiMod != 0) /* v3.2 */ - { - here->B4SOI_23 = m * (Gme + gddpe); - here->B4SOI_24 = m * (gsspe - Gme); - - if (here->B4SOIsoiMod != 2) /* v3.2 */ - { - here->B4SOI_25 = m * gige; - here->B4SOI_26 = m * gige; - } - } - - here->B4SOI_27 = m * gcedb; - here->B4SOI_28 = m * gcesb; - here->B4SOI_29 = m * gcdeb; - here->B4SOI_30 = m * gcseb; - here->B4SOI_31 = m * gcegb; - here->B4SOI_32 = m * gcgeb; - - /* v3.1 */ - if (here->B4SOIsoiMod != 2) /* v3.2 */ - { - here->B4SOI_33 = m * (gcegb + gcedb + gcesb + gceeb + gcegmb); /* 3.2 bug fix */ - - /* v3.1 changed GbPtr for RF */ - if ((here->B4SOIrgateMod == 0) || (here->B4SOIrgateMod == 1)) - (here->B4SOI_34 = m * (-gigb + gcggb + gcgdb + gcgsb - + gcgeb - gIgtotb)); - else /* v3.1 for rgateMod = 2 or 3 */ - here->B4SOI_35 = m * (gigb + gcgbb +gIgtotb - gcrgb); - - - here->B4SOI_36 = m * (-gddpb - Gmbs - gcdbb + gdtotb - + gIdtotb ); /* v4.0 */ - - /* (*(here->B4SOIDPbPtr) -= (-gddpb - Gmbs + gcdgb + gcddb - + gcdeb + gcdsb) + gcdgmb - + gIdtotb ); - */ - - (here->B4SOI_37 = m * (-gsspb + Gmbs - gcsbb + gstotb - + Gmin + gIstotb)); /* v4.0 */ - - /* (*(here->B4SOISPbPtr) -= (-gsspb + Gmbs + gcsgb + gcsdb - + gcseb + gcssb) + gcsgmb - + Gmin + gIstotb); - */ - (here->B4SOI_38 = m * (gbbe + gcbeb)); /* v3.0 */ - (here->B4SOI_39 = m * (-gigg + gcbgb + gbbg)); - (here->B4SOI_40 = m * (-gigd + gcbdb + gbbdp)); - - (here->B4SOI_41 = m * (gcbsb + gbbsp - Gmin - - gigs)); - /* if (!here->B4SOIrbodyMod) - */ - (here->B4SOI_42 = m * (-gigb + gbbb - gcbgb - gcbdb - - gcbsb - gcbeb + Gmin)); - /* else - (*(here->B4SOIBbPtr) += -gigb - (Giib - Gbpbs) - gcbgb - - gcbdb - gcbsb - gcbeb + Gmin) ; - */ - /* v4.0 */ - if (here->B4SOIrbodyMod) { - (here->B4SOI_43 = m * (-gcjdbdp - GGjdb)); - (here->B4SOI_44 = m * (-gcjsbsp - GGjsb)); - (here->B4SOI_45 = m * (-gcjdbdp - GGjdb)); - (here->B4SOI_46 = m * (gcjdbdp + GGjdb - + here->B4SOIgrbdb)); - (here->B4SOI_47 = m * here->B4SOIgrbdb); - (here->B4SOI_48 = m * (-gcjsbsp - GGjsb)); - (here->B4SOI_49 = m * here->B4SOIgrbsb); - (here->B4SOI_50 = m * (gcjsbsp + GGjsb - + here->B4SOIgrbsb)); - (here->B4SOI_51 = m * here->B4SOIgrbdb); - (here->B4SOI_52 = m * here->B4SOIgrbsb); - (here->B4SOI_53 = m * (here->B4SOIgrbsb - + here->B4SOIgrbdb)); - } - if (model->B4SOIrdsMod) - { - (here->B4SOI_54 = m * gdtotb); - (here->B4SOI_55 = m * gstotb); - } - - } - /* v3.1 */ - if (model->B4SOIrdsMod) - { (here->B4SOI_56 = m * gdtotg); - (here->B4SOI_57 = m * gdtots); - (here->B4SOI_58 = m * gstotd); - (here->B4SOI_59 = m * gstotg); - } - - (here->B4SOI_60 = m * gceeb); - - if (here->B4SOIrgateMod == 0) - { - (here->B4SOI_61 = m * (gigg + gcggb + Gmin - + gIgtotg)); - (here->B4SOI_62 =m * ( gigd + gcgdb - Gmin - + gIgtotd)); - (here->B4SOI_63 = m * (gcgsb + gigs + gIgtots)); - } - else if (here->B4SOIrgateMod == 1) /* v3.1 for RF */ - { - here->B4SOI_64 = m * (gigg + gcggb + Gmin - + gIgtotg + geltd); - here->B4SOI_65 = m * (gigd + gcgdb - Gmin - + gIgtotd); - here->B4SOI_66 = m * (gcgsb + gigs + gIgtots); - } - else /* v3.1 for RF rgateMod == 2 or 3 */ - { - here->B4SOI_67 = m * (gigg + gcggb + Gmin - + gIgtotg - gcrgg); - here->B4SOI_68 = m * (gigd + gcgdb - Gmin - + gIgtotd - gcrgd); - here->B4SOI_69 = m * (gcgsb + gigs + gIgtots - gcrgs); - } - - - (here->B4SOI_70 = m * ((Gm + gcdgb) + gddpg - Gmin - - gIdtotg - gdtotg)); /* v4.0 */ - (here->B4SOI_71 = m * ((gdpr + here->B4SOIgds + gddpdp - + RevSum + gcddb) + Gmin - - gIdtotd - gdtotd)); /* v4.0 */ - (here->B4SOI_72 = m * ((-gddpsp + here->B4SOIgds + FwdSum - - gcdsb) + gIdtots + gdtots)); - - (here->B4SOI_73 = m * (gdpr + gdtot)); - - (here->B4SOI_74 = m * (gcsgb - Gm + gsspg - gIstotg - - gstotg)); /* v4.0 */ - (here->B4SOI_75 = m * ((here->B4SOIgds - gsspdp + RevSum - - gcsdb + gIstotd) + gstotd)); /* v4.0 */ - - (here->B4SOI_76 = m * ((gspr - gstots - + here->B4SOIgds + gsspsp - + FwdSum + gcssb) - + Gmin - gIstots)); /* v4.0 */ - - (here->B4SOI_77 = m * (gspr + gstot)); - - - (here->B4SOI_78 = m * (gdpr + gdtot)); - (here->B4SOI_79 = m * (gdpr - gdtotd)); - - - (here->B4SOI_80 = m * (gspr + gstot)); - (here->B4SOI_81 = m * (gspr - gstots)); - - - if (here->B4SOIbodyMod == 1) { - (here->B4SOI_82 = m * gppp); - (here->B4SOI_83 = m * gppb); - (here->B4SOI_84 = m * gppp); - } - - /* v4.1 Ig_agbcp2 stamping */ - (here->B4SOI_85 = m * gigpg); /* FIXME m or not m ?? h_vogt */ - if (here->B4SOIbodyMod == 1) { - (here->B4SOI_86 = m * gigpp); - (here->B4SOI_87 = m * gigpg); - (here->B4SOI_88 = m * gigpp); - } - else if(here->B4SOIbodyMod == 2) - { - (here->B4SOI_89 = m * gigpp); - (here->B4SOI_90 = m * gigpg); - (here->B4SOI_91 = m * gigpp); - } - - - if (selfheat) - { - (here->B4SOI_92 = m * (GmT + gddpT + gcdT)); - (here->B4SOI_93 = m * (-GmT + gsspT + gcsT)); - (here->B4SOI_94 = m * (gbbT + gcbT - gigT)); - (here->B4SOI_95 = m * gceT); - (here->B4SOI_96 = m * (gcgT + gigT)); - (here->B4SOI_97 = m * (gTtt + 1/pParam->B4SOIrth + gcTt)); - (here->B4SOI_98 = m * gTtg); - (here->B4SOI_99 = m * gTtb); - (here->B4SOI_100 = m * gTtdp); - (here->B4SOI_101 = m * gTtsp); - - /* v3.0 */ - if (here->B4SOIsoiMod != 0) /* v3.2 */ - (here->B4SOI_102 = m * gTte); - - } -#endif - if (here->B4SOIdebugMod != 0) - { - *(here->B4SOIVbsPtr) += 1; - *(here->B4SOIIdsPtr) += 1; - *(here->B4SOIIcPtr) += 1; - *(here->B4SOIIbsPtr) += 1; - *(here->B4SOIIbdPtr) += 1; - *(here->B4SOIIiiPtr) += 1; - *(here->B4SOIIgPtr) += 1; - *(here->B4SOIGiggPtr) += 1; - *(here->B4SOIGigdPtr) += 1; - *(here->B4SOIGigbPtr) += 1; - *(here->B4SOIIgidlPtr) += 1; - *(here->B4SOIItunPtr) += 1; - *(here->B4SOIIbpPtr) += 1; - *(here->B4SOICbgPtr) += 1; - *(here->B4SOICbbPtr) += 1; - *(here->B4SOICbdPtr) += 1; - *(here->B4SOIQbfPtr) += 1; - *(here->B4SOIQjsPtr) += 1; - *(here->B4SOIQjdPtr) += 1; - } - -line1000: ; - -#ifndef USE_OMP - } /* End of Mosfet Instance */ - } /* End of Model Instance */ -#endif - - return(OK); -} - - -#ifdef USE_OMP - -/* OpenMP parallelization: -Update of right hand side and matrix values from instance temporary storage. -Update to matrix will be done only when all instances of this model -have their values calculated and stored. Thus there is no further -synchronisation required.*/ - -void B4SOILoadRhsMat(GENmodel *inModel, CKTcircuit *ckt) -{ - int InstCount, idx; - B4SOIinstance **InstArray; - B4SOIinstance *here; - B4SOImodel *model = (B4SOImodel*)inModel; - - InstArray = model->B4SOIInstanceArray; - InstCount = model->B4SOIInstCount; - - for(idx = 0; idx < InstCount; idx++) { - here = InstArray[idx]; - model = B4SOImodPtr(here); - /* Update b for Ax = b */ - - /* v3.1 */ - - /* v3.1 added ceqgcrg for RF */ - (*(ckt->CKTrhs + here->B4SOIgNode) -= here->B4SOINode_1); - /* v3.1 added ceqgcrg for RF end */ - - (*(ckt->CKTrhs + here->B4SOIdNodePrime) += here->B4SOINode_2); - if (!here->B4SOIrbodyMod) { - (*(ckt->CKTrhs + here->B4SOIsNodePrime) += here->B4SOINode_3); /* v4.0 */ - } - else { /* v4.0 */ - (*(ckt->CKTrhs + here->B4SOIsNodePrime) += here->B4SOINode_4); - } - - (*(ckt->CKTrhs + here->B4SOIeNode) -= here->B4SOINode_5); - - if (here->B4SOIrgateMod == 2) - (*(ckt->CKTrhs + here->B4SOIgNodeExt) -= here->B4SOINode_6); - else if (here->B4SOIrgateMod == 3) - (*(ckt->CKTrhs + here->B4SOIgNodeMid) -= here->B4SOINode_7); - - if (here->B4SOIbodyMod == 1) { - (*(ckt->CKTrhs + here->B4SOIpNode) += here->B4SOINode_8); - } - - if ( here->B4SOIsoiMod != 2 ) - {if (!here->B4SOIrbodyMod) - (*(ckt->CKTrhs + here->B4SOIbNode) -= here->B4SOINode_9); - else /* v4.0 */ - { (*(ckt->CKTrhs + here->B4SOIdbNode) -= here->B4SOINode_10); - (*(ckt->CKTrhs + here->B4SOIbNode) -= here->B4SOINode_11); - (*(ckt->CKTrhs + here->B4SOIsbNode) -= here->B4SOINode_12); - } - } - - if (here->B4SOINode_sh) { - (*(ckt->CKTrhs + here->B4SOItempNode) -= here->B4SOINode_13); - } - - if (model->B4SOIrdsMod) - { (*(ckt->CKTrhs + here->B4SOIdNode) -= here->B4SOINode_14); - (*(ckt->CKTrhs + here->B4SOIsNode) += here->B4SOINode_15); - } - - - if (here->B4SOIdebugMod != 0) - { - *(ckt->CKTrhs + here->B4SOIvbsNode) = here->B4SOIvbseff; - *(ckt->CKTrhs + here->B4SOIidsNode) = FLOG(here->B4SOIids); - *(ckt->CKTrhs + here->B4SOIicNode) = FLOG(here->B4SOIic); - *(ckt->CKTrhs + here->B4SOIibsNode) = FLOG(here->B4SOIibs); - *(ckt->CKTrhs + here->B4SOIibdNode) = FLOG(here->B4SOIibd); - *(ckt->CKTrhs + here->B4SOIiiiNode) = FLOG(here->B4SOIiii); - *(ckt->CKTrhs + here->B4SOIigNode) = here->B4SOIig; - *(ckt->CKTrhs + here->B4SOIgiggNode) = here->B4SOIgigg; - *(ckt->CKTrhs + here->B4SOIgigdNode) = here->B4SOIgigd; - *(ckt->CKTrhs + here->B4SOIgigbNode) = here->B4SOIgigb; - *(ckt->CKTrhs + here->B4SOIigidlNode) = here->B4SOIigidl; - *(ckt->CKTrhs + here->B4SOIitunNode) = here->B4SOIitun; - *(ckt->CKTrhs + here->B4SOIibpNode) = here->B4SOIibp; - *(ckt->CKTrhs + here->B4SOIcbbNode) = here->B4SOIcbb; - *(ckt->CKTrhs + here->B4SOIcbdNode) = here->B4SOIcbd; - *(ckt->CKTrhs + here->B4SOIcbgNode) = here->B4SOIcbg; - *(ckt->CKTrhs + here->B4SOIqbfNode) = here->B4SOIqbf; - *(ckt->CKTrhs + here->B4SOIqjsNode) = here->B4SOIqjs; - *(ckt->CKTrhs + here->B4SOIqjdNode) = here->B4SOIqjd; - - } - - - if (here->B4SOIrgateMod == 1) - { - *(here->B4SOIGEgePtr) += here->B4SOI_1; - *(here->B4SOIGgePtr) -= here->B4SOI_2; - *(here->B4SOIGEgPtr) -= here->B4SOI_3; - } - else if (here->B4SOIrgateMod == 2) - { - *(here->B4SOIGEgePtr) += here->B4SOI_4; - *(here->B4SOIGEgPtr) += here->B4SOI_5; - *(here->B4SOIGEdpPtr) += here->B4SOI_6; - *(here->B4SOIGEspPtr) += here->B4SOI_7; - *(here->B4SOIGgePtr) -= here->B4SOI_8; - if (here->B4SOIsoiMod !=2) /* v3.2 */ - *(here->B4SOIGEbPtr) += here->B4SOI_9; - } - else if (here->B4SOIrgateMod == 3) - { - *(here->B4SOIGEgePtr) += here->B4SOI_10; - *(here->B4SOIGEgmPtr) -= here->B4SOI_11; - *(here->B4SOIGMgePtr) -= here->B4SOI_12; - *(here->B4SOIGMgmPtr) += here->B4SOI_13; - - *(here->B4SOIGMdpPtr) += here->B4SOI_14; - *(here->B4SOIGMgPtr) += here->B4SOI_15; - *(here->B4SOIGMspPtr) += here->B4SOI_16; - *(here->B4SOIGMePtr) += here->B4SOI_17; - if (here->B4SOIsoiMod !=2) /* v3.2 */ - *(here->B4SOIGMbPtr) += here->B4SOI_18; - - *(here->B4SOIDPgmPtr) += here->B4SOI_19; - *(here->B4SOIGgmPtr) -= here->B4SOI_20; - *(here->B4SOISPgmPtr) += here->B4SOI_21; - *(here->B4SOIEgmPtr) += here->B4SOI_22; - } - /* v3.1 added for RF end*/ - - - /* v3.0 */ - if (here->B4SOIsoiMod != 0) /* v3.2 */ - { - (*(here->B4SOIDPePtr) += here->B4SOI_23); - (*(here->B4SOISPePtr) += here->B4SOI_24); - - if (here->B4SOIsoiMod != 2) /* v3.2 */ - { - *(here->B4SOIGePtr) += here->B4SOI_25; - *(here->B4SOIBePtr) -= here->B4SOI_26; - } - } - - *(here->B4SOIEdpPtr) += here->B4SOI_27; - *(here->B4SOIEspPtr) += here->B4SOI_28; - *(here->B4SOIDPePtr) += here->B4SOI_29; - *(here->B4SOISPePtr) += here->B4SOI_30; - *(here->B4SOIEgPtr) += here->B4SOI_31; - *(here->B4SOIGePtr) += here->B4SOI_32; - - /* v3.1 */ - if (here->B4SOIsoiMod != 2) /* v3.2 */ - { - (*(here->B4SOIEbPtr) -= here->B4SOI_33); /* 3.2 bug fix */ - - /* v3.1 changed GbPtr for RF */ - if ((here->B4SOIrgateMod == 0) || (here->B4SOIrgateMod == 1)) - (*(here->B4SOIGbPtr) -= here->B4SOI_34); - else /* v3.1 for rgateMod = 2 or 3 */ - *(here->B4SOIGbPtr) += here->B4SOI_35; - - - (*(here->B4SOIDPbPtr) -= here->B4SOI_36); /* v4.0 */ - - /* (*(here->B4SOIDPbPtr) -= (-gddpb - Gmbs + gcdgb + gcddb - + gcdeb + gcdsb) + gcdgmb - + gIdtotb ); - */ - - (*(here->B4SOISPbPtr) -= here->B4SOI_37); /* v4.0 */ - - /* (*(here->B4SOISPbPtr) -= (-gsspb + Gmbs + gcsgb + gcsdb - + gcseb + gcssb) + gcsgmb - + Gmin + gIstotb); - */ - (*(here->B4SOIBePtr) += here->B4SOI_38); /* v3.0 */ - (*(here->B4SOIBgPtr) += here->B4SOI_39); - (*(here->B4SOIBdpPtr) += here->B4SOI_40); - - (*(here->B4SOIBspPtr) += here->B4SOI_41); - /* if (!here->B4SOIrbodyMod) - */ - (*(here->B4SOIBbPtr) += here->B4SOI_42); - /* else - (*(here->B4SOIBbPtr) += -gigb - (Giib - Gbpbs) - gcbgb - - gcbdb - gcbsb - gcbeb + Gmin) ; - */ - /* v4.0 */ - if (here->B4SOIrbodyMod) { - (*(here->B4SOIDPdbPtr) += here->B4SOI_43); - (*(here->B4SOISPsbPtr) += here->B4SOI_44); - (*(here->B4SOIDBdpPtr) += here->B4SOI_45); - (*(here->B4SOIDBdbPtr) += here->B4SOI_46); - (*(here->B4SOIDBbPtr) -= here->B4SOI_47); - (*(here->B4SOISBspPtr) += here->B4SOI_48); - (*(here->B4SOISBbPtr) -= here->B4SOI_49); - (*(here->B4SOISBsbPtr) += here->B4SOI_50); - (*(here->B4SOIBdbPtr) -= here->B4SOI_51); - (*(here->B4SOIBsbPtr) -= here->B4SOI_52); - (*(here->B4SOIBbPtr) += here->B4SOI_53); - } - if (model->B4SOIrdsMod) - { - (*(here->B4SOIDbPtr) += here->B4SOI_54); - (*(here->B4SOISbPtr) += here->B4SOI_55); - } - - } - /* v3.1 */ - if (model->B4SOIrdsMod) - { (*(here->B4SOIDgPtr) += here->B4SOI_56); - (*(here->B4SOIDspPtr) += here->B4SOI_57); - (*(here->B4SOISdpPtr) += here->B4SOI_58); - (*(here->B4SOISgPtr) += here->B4SOI_59); - } - - (*(here->B4SOIEePtr) += here->B4SOI_60); - - if (here->B4SOIrgateMod == 0) - { - (*(here->B4SOIGgPtr) += here->B4SOI_61); - (*(here->B4SOIGdpPtr) += here->B4SOI_62); - (*(here->B4SOIGspPtr) += here->B4SOI_63); - } - else if (here->B4SOIrgateMod == 1) /* v3.1 for RF */ - { - *(here->B4SOIGgPtr) += here->B4SOI_64; - *(here->B4SOIGdpPtr) += here->B4SOI_65; - *(here->B4SOIGspPtr) += here->B4SOI_66; - } - else /* v3.1 for RF rgateMod == 2 or 3 */ - { - *(here->B4SOIGgPtr) += here->B4SOI_67; - *(here->B4SOIGdpPtr) += here->B4SOI_68; - *(here->B4SOIGspPtr) += here->B4SOI_69; - } - - - (*(here->B4SOIDPgPtr) += here->B4SOI_70); /* v4.0 */ - (*(here->B4SOIDPdpPtr) += here->B4SOI_71); /* v4.0 */ - (*(here->B4SOIDPspPtr) -= here->B4SOI_72); - - (*(here->B4SOIDPdPtr) -= here->B4SOI_73); - - (*(here->B4SOISPgPtr) += here->B4SOI_74); /* v4.0 */ - (*(here->B4SOISPdpPtr) -= here->B4SOI_75); /* v4.0 */ - - (*(here->B4SOISPspPtr) += here->B4SOI_76); /* v4.0 */ - - (*(here->B4SOISPsPtr) -= here->B4SOI_77); - - - (*(here->B4SOIDdPtr) += here->B4SOI_78); - (*(here->B4SOIDdpPtr) -= here->B4SOI_79); - - - (*(here->B4SOISsPtr) += here->B4SOI_80); - (*(here->B4SOISspPtr) -= here->B4SOI_81); - - - if (here->B4SOIbodyMod == 1) { - (*(here->B4SOIBpPtr) -= here->B4SOI_82); - (*(here->B4SOIPbPtr) += here->B4SOI_83); - (*(here->B4SOIPpPtr) += here->B4SOI_84); - } - - /* v4.1 Ig_agbcp2 stamping */ - (*(here->B4SOIGgPtr) += here->B4SOI_85); /* FIXME m or not m ?? h_vogt */ - if (here->B4SOIbodyMod == 1) { - (*(here->B4SOIPpPtr) -= here->B4SOI_86); - (*(here->B4SOIPgPtr) -= here->B4SOI_87); - (*(here->B4SOIGpPtr) += here->B4SOI_88); - } - else if(here->B4SOIbodyMod == 2) - { - (*(here->B4SOIBbPtr) -= here->B4SOI_89); - (*(here->B4SOIBgPtr) -= here->B4SOI_90); - (*(here->B4SOIGbPtr) += here->B4SOI_91); - } - - - if (here->B4SOINode_sh) /* selfheat */ - { - (*(here->B4SOIDPtempPtr) += here->B4SOI_92); - (*(here->B4SOISPtempPtr) += here->B4SOI_93); - (*(here->B4SOIBtempPtr) += here->B4SOI_94); - (*(here->B4SOIEtempPtr) +=here->B4SOI_95); - (*(here->B4SOIGtempPtr) += here->B4SOI_96); - (*(here->B4SOITemptempPtr) += here->B4SOI_97); - (*(here->B4SOITempgPtr) += here->B4SOI_98); - (*(here->B4SOITempbPtr) += here->B4SOI_99); - (*(here->B4SOITempdpPtr) += here->B4SOI_100); - (*(here->B4SOITempspPtr) += here->B4SOI_101); - - /* v3.0 */ - if (here->B4SOIsoiMod != 0) /* v3.2 */ - (*(here->B4SOITempePtr) += here->B4SOI_102); - - } - - - - if (here->B4SOIdebugMod != 0) - { - *(here->B4SOIVbsPtr) += 1; - *(here->B4SOIIdsPtr) += 1; - *(here->B4SOIIcPtr) += 1; - *(here->B4SOIIbsPtr) += 1; - *(here->B4SOIIbdPtr) += 1; - *(here->B4SOIIiiPtr) += 1; - *(here->B4SOIIgPtr) += 1; - *(here->B4SOIGiggPtr) += 1; - *(here->B4SOIGigdPtr) += 1; - *(here->B4SOIGigbPtr) += 1; - *(here->B4SOIIgidlPtr) += 1; - *(here->B4SOIItunPtr) += 1; - *(here->B4SOIIbpPtr) += 1; - *(here->B4SOICbgPtr) += 1; - *(here->B4SOICbbPtr) += 1; - *(here->B4SOICbdPtr) += 1; - *(here->B4SOIQbfPtr) += 1; - *(here->B4SOIQjsPtr) += 1; - *(here->B4SOIQjdPtr) += 1; - } - } -} - -#endif diff --git a/src/spicelib/devices/bsimsoi/b4soimask.c b/src/spicelib/devices/bsimsoi/b4soimask.c deleted file mode 100644 index b8308f62d..000000000 --- a/src/spicelib/devices/bsimsoi/b4soimask.c +++ /dev/null @@ -1,2845 +0,0 @@ -/*** B4SOI 12/16/2010 Released by Tanvir Morshed ***/ - - -/********** - * Copyright 2010 Regents of the University of California. All rights reserved. - * Authors: 1998 Samuel Fung, Dennis Sinitsky and Stephen Tang - * Authors: 1999-2004 Pin Su, Hui Wan, Wei Jin, b3soimask.c - * Authors: 2005- Hui Wan, Xuemei Xi, Ali Niknejad, Chenming Hu. - * Authors: 2009- Wenwei Yang, Chung-Hsun Lin, Ali Niknejad, Chenming Hu. - * File: b4soimask.c - * Modified by Hui Wan, Xuemei Xi 11/30/2005 - * Modified by Wenwei Yang, Chung-Hsun Lin, Darsen Lu 03/06/2009 - * Modified by Tanvir Morshed 09/22/2009 - * Modified by Tanvir Morshed 12/31/2009 - * Modified by Tanvir Morshed 12/16/2010 - **********/ - -#include "ngspice/ngspice.h" - -#include "ngspice/ifsim.h" -#include "ngspice/cktdefs.h" -#include "ngspice/devdefs.h" -#include "b4soidef.h" -#include "ngspice/sperror.h" -#include "ngspice/suffix.h" - -int -B4SOImAsk( -CKTcircuit *ckt, -GENmodel *inst, -int which, -IFvalue *value) -{ - B4SOImodel *model = (B4SOImodel *)inst; - NG_IGNORE(ckt); - switch(which) - { case B4SOI_MOD_MOBMOD: - value->iValue = model->B4SOImobMod; - return(OK); - case B4SOI_MOD_PARAMCHK: - value->iValue = model->B4SOIparamChk; - return(OK); - case B4SOI_MOD_BINUNIT: - value->iValue = model->B4SOIbinUnit; - return(OK); - case B4SOI_MOD_CAPMOD: - value->iValue = model->B4SOIcapMod; - return(OK); - case B4SOI_MOD_SHMOD: - value->iValue = model->B4SOIshMod; - return(OK); - -/* case B4SOI_MOD_NOIMOD: - value->iValue = model->B4SOInoiMod; - return(OK); v3.2 */ - - case B4SOI_MOD_VERSION : - value->rValue = model->B4SOIversion; - return(OK); - case B4SOI_MOD_TOX : - value->rValue = model->B4SOItox; - return(OK); - case B4SOI_MOD_TOXP : - value->rValue = model->B4SOItoxp; - return(OK); - case B4SOI_MOD_LEFFEOT : - value->rValue = model->B4SOIleffeot; - return(OK); - case B4SOI_MOD_WEFFEOT : - value->rValue = model->B4SOIweffeot; - return(OK); - case B4SOI_MOD_VDDEOT : - value->rValue = model->B4SOIvddeot; - return(OK); - case B4SOI_MOD_TEMPEOT : - value->rValue = model->B4SOItempeot; - return(OK); - case B4SOI_MOD_ADOS : - value->rValue = model->B4SOIados; - return(OK); - case B4SOI_MOD_BDOS : - value->rValue = model->B4SOIbdos; - return(OK); - case B4SOI_MOD_EPSRGATE: - value->rValue = model->B4SOIepsrgate; - return(OK); - case B4SOI_MOD_PHIG: - value->rValue = model->B4SOIphig; - return(OK); - case B4SOI_MOD_EASUB: - value->rValue = model->B4SOIeasub; - return(OK); - - case B4SOI_MOD_TOXM : - value->rValue = model->B4SOItoxm; - return(OK); /* v3.2 */ - - /*4.1*/ - case B4SOI_MOD_EOT : - value->rValue = model->B4SOIeot; - return(OK); - case B4SOI_MOD_EPSROX : - value->rValue = model->B4SOIepsrox; - return(OK); - case B4SOI_MOD_EPSRSUB: - value->rValue = model->B4SOIepsrsub; - return(OK); - case B4SOI_MOD_NI0SUB: - value->rValue = model->B4SOIni0sub; - return(OK); - case B4SOI_MOD_BG0SUB: - value->rValue = model->B4SOIbg0sub; - return(OK); - case B4SOI_MOD_TBGASUB: - value->rValue = model->B4SOItbgasub; - return(OK); - case B4SOI_MOD_TBGBSUB: - value->rValue = model->B4SOItbgbsub; - return(OK); -/* v2.2.3 */ - case B4SOI_MOD_DTOXCV : - value->rValue = model->B4SOIdtoxcv; - return(OK); - - case B4SOI_MOD_CDSC : - value->rValue = model->B4SOIcdsc; - return(OK); - case B4SOI_MOD_CDSCB : - value->rValue = model->B4SOIcdscb; - return(OK); - - case B4SOI_MOD_CDSCD : - value->rValue = model->B4SOIcdscd; - return(OK); - - case B4SOI_MOD_CIT : - value->rValue = model->B4SOIcit; - return(OK); - case B4SOI_MOD_NFACTOR : - value->rValue = model->B4SOInfactor; - return(OK); - case B4SOI_MOD_VSAT: - value->rValue = model->B4SOIvsat; - return(OK); - case B4SOI_MOD_AT: - value->rValue = model->B4SOIat; - return(OK); - case B4SOI_MOD_A0: - value->rValue = model->B4SOIa0; - return(OK); - - case B4SOI_MOD_AGS: - value->rValue = model->B4SOIags; - return(OK); - - case B4SOI_MOD_A1: - value->rValue = model->B4SOIa1; - return(OK); - case B4SOI_MOD_A2: - value->rValue = model->B4SOIa2; - return(OK); - case B4SOI_MOD_KETA: - value->rValue = model->B4SOIketa; - return(OK); - case B4SOI_MOD_NSUB: - value->rValue = model->B4SOInsub; - return(OK); - case B4SOI_MOD_NPEAK: - value->rValue = model->B4SOInpeak; - return(OK); - case B4SOI_MOD_NGATE: - value->rValue = model->B4SOIngate; - return(OK); - case B4SOI_MOD_NSD: - value->rValue = model->B4SOInsd; - return(OK); - case B4SOI_MOD_GAMMA1: - value->rValue = model->B4SOIgamma1; - return(OK); - case B4SOI_MOD_GAMMA2: - value->rValue = model->B4SOIgamma2; - return(OK); - case B4SOI_MOD_VBX: - value->rValue = model->B4SOIvbx; - return(OK); - case B4SOI_MOD_VBM: - value->rValue = model->B4SOIvbm; - return(OK); - case B4SOI_MOD_XT: - value->rValue = model->B4SOIxt; - return(OK); - case B4SOI_MOD_K1: - value->rValue = model->B4SOIk1; - return(OK); - case B4SOI_MOD_KT1: - value->rValue = model->B4SOIkt1; - return(OK); - case B4SOI_MOD_KT1L: - value->rValue = model->B4SOIkt1l; - return(OK); - case B4SOI_MOD_KT2 : - value->rValue = model->B4SOIkt2; - return(OK); - case B4SOI_MOD_K2 : - value->rValue = model->B4SOIk2; - return(OK); - case B4SOI_MOD_K3: - value->rValue = model->B4SOIk3; - return(OK); - case B4SOI_MOD_K3B: - value->rValue = model->B4SOIk3b; - return(OK); - case B4SOI_MOD_W0: - value->rValue = model->B4SOIw0; - return(OK); - case B4SOI_MOD_LPE0: - value->rValue = model->B4SOIlpe0; - return(OK); - case B4SOI_MOD_LPEB: /* v4.0 for Vth */ - value->rValue = model->B4SOIlpeb; - return(OK); - case B4SOI_MOD_DVT0 : - value->rValue = model->B4SOIdvt0; - return(OK); - case B4SOI_MOD_DVT1 : - value->rValue = model->B4SOIdvt1; - return(OK); - case B4SOI_MOD_DVT2 : - value->rValue = model->B4SOIdvt2; - return(OK); - case B4SOI_MOD_DVT0W : - value->rValue = model->B4SOIdvt0w; - return(OK); - case B4SOI_MOD_DVT1W : - value->rValue = model->B4SOIdvt1w; - return(OK); - case B4SOI_MOD_DVT2W : - value->rValue = model->B4SOIdvt2w; - return(OK); - case B4SOI_MOD_DROUT : - value->rValue = model->B4SOIdrout; - return(OK); - case B4SOI_MOD_DSUB : - value->rValue = model->B4SOIdsub; - return(OK); - case B4SOI_MOD_VTH0: - value->rValue = model->B4SOIvth0; - return(OK); - case B4SOI_MOD_VFB: - value->rValue = model->B4SOIvfb; - return(OK); /* v4.1 */ - case B4SOI_MOD_UA: - value->rValue = model->B4SOIua; - return(OK); - case B4SOI_MOD_UA1: - value->rValue = model->B4SOIua1; - return(OK); - case B4SOI_MOD_UB: - value->rValue = model->B4SOIub; - return(OK); - case B4SOI_MOD_UB1: - value->rValue = model->B4SOIub1; - return(OK); - case B4SOI_MOD_UC: - value->rValue = model->B4SOIuc; - return(OK); - case B4SOI_MOD_UC1: - value->rValue = model->B4SOIuc1; - return(OK); - case B4SOI_MOD_U0: - value->rValue = model->B4SOIu0; - return(OK); - case B4SOI_MOD_UTE: - value->rValue = model->B4SOIute; - return(OK); - - /*4.1 mobmod=4*/ - case B4SOI_MOD_UD: - value->rValue = model->B4SOIud; - return(OK); - case B4SOI_MOD_LUD: - value->rValue = model->B4SOIlud; - return(OK); - case B4SOI_MOD_WUD: - value->rValue = model->B4SOIwud; - return(OK); - case B4SOI_MOD_PUD: - value->rValue = model->B4SOIpud; - return(OK); - case B4SOI_MOD_UD1: - value->rValue = model->B4SOIud1; - return(OK); - case B4SOI_MOD_LUD1: - value->rValue = model->B4SOIlud1; - return(OK); - case B4SOI_MOD_WUD1: - value->rValue = model->B4SOIwud1; - return(OK); - case B4SOI_MOD_PUD1: - value->rValue = model->B4SOIpud1; - return(OK); - case B4SOI_MOD_EU: - value->rValue = model->B4SOIeu; - return(OK); - case B4SOI_MOD_LEU: - value->rValue = model->B4SOIleu; - return(OK); - case B4SOI_MOD_WEU: - value->rValue = model->B4SOIweu; - return(OK); - case B4SOI_MOD_PEU: - value->rValue = model->B4SOIpeu; - return(OK); - case B4SOI_MOD_UCS: - value->rValue = model->B4SOIucs; - return(OK); - case B4SOI_MOD_LUCS: - value->rValue = model->B4SOIlucs; - return(OK); - case B4SOI_MOD_WUCS: - value->rValue = model->B4SOIwucs; - return(OK); - case B4SOI_MOD_PUCS: - value->rValue = model->B4SOIpucs; - return(OK); - case B4SOI_MOD_UCSTE: - value->rValue = model->B4SOIucste; - return(OK); - case B4SOI_MOD_LUCSTE: - value->rValue = model->B4SOIlucste; - return(OK); - case B4SOI_MOD_WUCSTE: - value->rValue = model->B4SOIwucste; - return(OK); - case B4SOI_MOD_PUCSTE: - value->rValue = model->B4SOIpucste; - return(OK); - - case B4SOI_MOD_VOFF: - value->rValue = model->B4SOIvoff; - return(OK); - case B4SOI_MOD_DELTA: - value->rValue = model->B4SOIdelta; - return(OK); - case B4SOI_MOD_RDSW: - value->rValue = model->B4SOIrdsw; - return(OK); - case B4SOI_MOD_RDWMIN: - value->rValue = model->B4SOIrdwmin; - return(OK); - case B4SOI_MOD_RSWMIN: - value->rValue = model->B4SOIrswmin; - return(OK); - case B4SOI_MOD_RDW: - value->rValue = model->B4SOIrdw; - return(OK); - case B4SOI_MOD_RSW: - value->rValue = model->B4SOIrsw; - return(OK); - case B4SOI_MOD_PRWG: - value->rValue = model->B4SOIprwg; - return(OK); - case B4SOI_MOD_PRWB: - value->rValue = model->B4SOIprwb; - return(OK); - case B4SOI_MOD_PRT: - value->rValue = model->B4SOIprt; - return(OK); - case B4SOI_MOD_ETA0: - value->rValue = model->B4SOIeta0; - return(OK); - case B4SOI_MOD_ETAB: - value->rValue = model->B4SOIetab; - return(OK); - case B4SOI_MOD_PCLM: - value->rValue = model->B4SOIpclm; - return(OK); - case B4SOI_MOD_PDIBL1: - value->rValue = model->B4SOIpdibl1; - return(OK); - case B4SOI_MOD_PDIBL2: - value->rValue = model->B4SOIpdibl2; - return(OK); - case B4SOI_MOD_PDIBLB: - value->rValue = model->B4SOIpdiblb; - return(OK); - case B4SOI_MOD_PVAG: - value->rValue = model->B4SOIpvag; - return(OK); - case B4SOI_MOD_WR: - value->rValue = model->B4SOIwr; - return(OK); - case B4SOI_MOD_DWG: - value->rValue = model->B4SOIdwg; - return(OK); - case B4SOI_MOD_DWB: - value->rValue = model->B4SOIdwb; - return(OK); - case B4SOI_MOD_B0: - value->rValue = model->B4SOIb0; - return(OK); - case B4SOI_MOD_B1: - value->rValue = model->B4SOIb1; - return(OK); - case B4SOI_MOD_ALPHA0: - value->rValue = model->B4SOIalpha0; - return(OK); - - case B4SOI_MOD_CGSL: - value->rValue = model->B4SOIcgsl; - return(OK); - case B4SOI_MOD_CGDL: - value->rValue = model->B4SOIcgdl; - return(OK); - case B4SOI_MOD_CKAPPA: - value->rValue = model->B4SOIckappa; - return(OK); - case B4SOI_MOD_CF: - value->rValue = model->B4SOIcf; - return(OK); - case B4SOI_MOD_CLC: - value->rValue = model->B4SOIclc; - return(OK); - case B4SOI_MOD_CLE: - value->rValue = model->B4SOIcle; - return(OK); - case B4SOI_MOD_DWC: - value->rValue = model->B4SOIdwc; - return(OK); - case B4SOI_MOD_DLC: - value->rValue = model->B4SOIdlc; - return(OK); - - - case B4SOI_MOD_TBOX: - value->rValue = model->B4SOItbox; - return(OK); - case B4SOI_MOD_TSI: - value->rValue = model->B4SOItsi; - return(OK); - case B4SOI_MOD_ETSI: - value->rValue = model->B4SOIetsi; - return(OK); - case B4SOI_MOD_RTH0: - value->rValue = model->B4SOIrth0; - return(OK); - case B4SOI_MOD_CTH0: - value->rValue = model->B4SOIcth0; - return(OK); - case B4SOI_MOD_NDIODES: /* v4.0 */ - value->rValue = model->B4SOIndiode; - return(OK); - case B4SOI_MOD_NDIODED: /* v4.0 */ - value->rValue = model->B4SOIndioded; - return(OK); - case B4SOI_MOD_XBJT: - value->rValue = model->B4SOIxbjt; - return(OK); - case B4SOI_MOD_XDIFS: - value->rValue = model->B4SOIxdif; - return(OK); - case B4SOI_MOD_XRECS: - value->rValue = model->B4SOIxrec; - return(OK); - case B4SOI_MOD_XTUNS: - value->rValue = model->B4SOIxtun; - return(OK); - case B4SOI_MOD_XDIFD: - value->rValue = model->B4SOIxdifd; - return(OK); - case B4SOI_MOD_XRECD: - value->rValue = model->B4SOIxrecd; - return(OK); - case B4SOI_MOD_XTUND: - value->rValue = model->B4SOIxtund; - return(OK); - - case B4SOI_MOD_TT: - value->rValue = model->B4SOItt; - return(OK); - case B4SOI_MOD_VSDTH: - value->rValue = model->B4SOIvsdth; - return(OK); - case B4SOI_MOD_VSDFB: - value->rValue = model->B4SOIvsdfb; - return(OK); - case B4SOI_MOD_CSDMIN: - value->rValue = model->B4SOIcsdmin; - return(OK); - case B4SOI_MOD_ASD: - value->rValue = model->B4SOIasd; - return(OK); - - case B4SOI_MOD_TNOM : - value->rValue = model->B4SOItnom; - return(OK); - case B4SOI_MOD_CGSO: - value->rValue = model->B4SOIcgso; - return(OK); - case B4SOI_MOD_CGDO: - value->rValue = model->B4SOIcgdo; - return(OK); - case B4SOI_MOD_CGEO: - value->rValue = model->B4SOIcgeo; - return(OK); - - - case B4SOI_MOD_XPART: - value->rValue = model->B4SOIxpart; - return(OK); - case B4SOI_MOD_RSH: - value->rValue = model->B4SOIsheetResistance; - return(OK); - case B4SOI_MOD_PBSWGS: /* v4.0 */ - value->rValue = model->B4SOIGatesidewallJctSPotential; - return(OK); - case B4SOI_MOD_PBSWGD: /* v4.0 */ - value->rValue = model->B4SOIGatesidewallJctDPotential; - return(OK); - case B4SOI_MOD_MJSWGS: /* v4.0 */ - value->rValue = model->B4SOIbodyJctGateSideSGradingCoeff; - return(OK); - case B4SOI_MOD_MJSWGD: /* v4.0 */ - value->rValue = model->B4SOIbodyJctGateSideDGradingCoeff; - return(OK); - case B4SOI_MOD_CJSWGS: /* v4.0 */ - value->rValue = model->B4SOIunitLengthGateSidewallJctCapS; - return(OK); - case B4SOI_MOD_CJSWGD: /* v4.0 */ - value->rValue = model->B4SOIunitLengthGateSidewallJctCapD; - return(OK); - case B4SOI_MOD_CSDESW: - value->rValue = model->B4SOIcsdesw; - return(OK); - case B4SOI_MOD_LINT: - value->rValue = model->B4SOILint; - return(OK); - case B4SOI_MOD_LL: - value->rValue = model->B4SOILl; - return(OK); -/* v2.2.3 */ - case B4SOI_MOD_LLC: - value->rValue = model->B4SOILlc; - return(OK); - - case B4SOI_MOD_LLN: - value->rValue = model->B4SOILln; - return(OK); - case B4SOI_MOD_LW: - value->rValue = model->B4SOILw; - return(OK); -/* v2.2.3 */ - case B4SOI_MOD_LWC: - value->rValue = model->B4SOILwc; - return(OK); - - case B4SOI_MOD_LWN: - value->rValue = model->B4SOILwn; - return(OK); - case B4SOI_MOD_LWL: - value->rValue = model->B4SOILwl; - return(OK); -/* v2.2.3 */ - case B4SOI_MOD_LWLC: - value->rValue = model->B4SOILwlc; - return(OK); - - case B4SOI_MOD_WINT: - value->rValue = model->B4SOIWint; - return(OK); - case B4SOI_MOD_WL: - value->rValue = model->B4SOIWl; - return(OK); -/* v2.2.3 */ - case B4SOI_MOD_WLC: - value->rValue = model->B4SOIWlc; - return(OK); - - case B4SOI_MOD_WLN: - value->rValue = model->B4SOIWln; - return(OK); - case B4SOI_MOD_WW: - value->rValue = model->B4SOIWw; - return(OK); -/* v2.2.3 */ - case B4SOI_MOD_WWC: - value->rValue = model->B4SOIWwc; - return(OK); - - case B4SOI_MOD_WWN: - value->rValue = model->B4SOIWwn; - return(OK); - case B4SOI_MOD_WWL: - value->rValue = model->B4SOIWwl; - return(OK); -/* v2.2.3 */ - case B4SOI_MOD_WWLC: - value->rValue = model->B4SOIWwlc; - return(OK); - - /* stress effect */ - case B4SOI_MOD_SAREF: - value->rValue = model->B4SOIsaref; - return(OK); - case B4SOI_MOD_SBREF: - value->rValue = model->B4SOIsbref; - return(OK); - case B4SOI_MOD_WLOD: - value->rValue = model->B4SOIwlod; - return(OK); - case B4SOI_MOD_KU0: - value->rValue = model->B4SOIku0; - return(OK); - case B4SOI_MOD_KVSAT: - value->rValue = model->B4SOIkvsat; - return(OK); - case B4SOI_MOD_KVTH0: - value->rValue = model->B4SOIkvth0; - return(OK); - case B4SOI_MOD_TKU0: - value->rValue = model->B4SOItku0; - return(OK); - case B4SOI_MOD_LLODKU0: - value->rValue = model->B4SOIllodku0; - return(OK); - case B4SOI_MOD_WLODKU0: - value->rValue = model->B4SOIwlodku0; - return(OK); - case B4SOI_MOD_LLODVTH: - value->rValue = model->B4SOIllodvth; - return(OK); - case B4SOI_MOD_WLODVTH: - value->rValue = model->B4SOIwlodvth; - return(OK); - case B4SOI_MOD_LKU0: - value->rValue = model->B4SOIlku0; - return(OK); - case B4SOI_MOD_WKU0: - value->rValue = model->B4SOIwku0; - return(OK); - case B4SOI_MOD_PKU0: - value->rValue = model->B4SOIpku0; - return(OK); - case B4SOI_MOD_LKVTH0: - value->rValue = model->B4SOIlkvth0; - return(OK); - case B4SOI_MOD_WKVTH0: - value->rValue = model->B4SOIwkvth0; - return(OK); - case B4SOI_MOD_PKVTH0: - value->rValue = model->B4SOIpkvth0; - return(OK); - case B4SOI_MOD_STK2: - value->rValue = model->B4SOIstk2; - return(OK); - case B4SOI_MOD_LODK2: - value->rValue = model->B4SOIlodk2; - return(OK); - case B4SOI_MOD_STETA0: - value->rValue = model->B4SOIsteta0; - return(OK); - case B4SOI_MOD_LODETA0: - value->rValue = model->B4SOIlodeta0; - return(OK); - -/* added for stress end */ - - - - case B4SOI_MOD_NOIA: - value->rValue = model->B4SOIoxideTrapDensityA; - return(OK); - case B4SOI_MOD_NOIB: - value->rValue = model->B4SOIoxideTrapDensityB; - return(OK); - case B4SOI_MOD_NOIC: - value->rValue = model->B4SOIoxideTrapDensityC; - return(OK); - case B4SOI_MOD_NOIF: - value->rValue = model->B4SOInoif; - return(OK); - case B4SOI_MOD_EM: - value->rValue = model->B4SOIem; - return(OK); - case B4SOI_MOD_EF: - value->rValue = model->B4SOIef; - return(OK); - case B4SOI_MOD_AF: - value->rValue = model->B4SOIaf; - return(OK); - case B4SOI_MOD_KF: - value->rValue = model->B4SOIkf; - return(OK); - case B4SOI_MOD_BF: - value->rValue = model->B4SOIbf; - return(OK); - case B4SOI_MOD_W0FLK: - value->rValue = model->B4SOIw0flk; - return(OK); - - -/* v2.0 release */ - case B4SOI_MOD_K1W1: - value->rValue = model->B4SOIk1w1; - return(OK); - case B4SOI_MOD_K1W2: - value->rValue = model->B4SOIk1w2; - return(OK); - case B4SOI_MOD_KETAS: - value->rValue = model->B4SOIketas; - return(OK); - case B4SOI_MOD_DWBC: - value->rValue = model->B4SOIdwbc; - return(OK); - case B4SOI_MOD_BETA0: - value->rValue = model->B4SOIbeta0; - return(OK); - case B4SOI_MOD_BETA1: - value->rValue = model->B4SOIbeta1; - return(OK); - case B4SOI_MOD_BETA2: - value->rValue = model->B4SOIbeta2; - return(OK); - case B4SOI_MOD_VDSATII0: - value->rValue = model->B4SOIvdsatii0; - return(OK); - case B4SOI_MOD_TII: - value->rValue = model->B4SOItii; - return(OK); - /*4.1 Iii model*/ - case B4SOI_MOD_TVBCI: - value->rValue = model->B4SOItvbci; - return(OK); - case B4SOI_MOD_LII: - value->rValue = model->B4SOIlii; - return(OK); - case B4SOI_MOD_SII0: - value->rValue = model->B4SOIsii0; - return(OK); - case B4SOI_MOD_SII1: - value->rValue = model->B4SOIsii1; - return(OK); - case B4SOI_MOD_SII2: - value->rValue = model->B4SOIsii2; - return(OK); - case B4SOI_MOD_SIID: - value->rValue = model->B4SOIsiid; - return(OK); - case B4SOI_MOD_FBJTII: - value->rValue = model->B4SOIfbjtii; - return(OK); - /*4.1 Iii model*/ - case B4SOI_MOD_EBJTII: - value->rValue = model->B4SOIebjtii; - return(OK); - case B4SOI_MOD_CBJTII: - value->rValue = model->B4SOIcbjtii; - return(OK); - case B4SOI_MOD_VBCI: - value->rValue = model->B4SOIvbci; - return(OK); - case B4SOI_MOD_ABJTII: - value->rValue = model->B4SOIabjtii; - return(OK); - case B4SOI_MOD_MBJTII: - value->rValue = model->B4SOImbjtii; - return(OK); - case B4SOI_MOD_ESATII: - value->rValue = model->B4SOIesatii; - return(OK); - case B4SOI_MOD_NTUNS: /* v4.0 */ - value->rValue = model->B4SOIntun; - return(OK); - case B4SOI_MOD_NTUND: /* v4.0 */ - value->rValue = model->B4SOIntund; - return(OK); - case B4SOI_MOD_NRECF0S: /* v4.0 */ - value->rValue = model->B4SOInrecf0; - return(OK); - case B4SOI_MOD_NRECF0D: /* v4.0 */ - value->rValue = model->B4SOInrecf0d; - return(OK); - case B4SOI_MOD_NRECR0S: /* v4.0 */ - value->rValue = model->B4SOInrecr0; - return(OK); - case B4SOI_MOD_NRECR0D: /* v4.0 */ - value->rValue = model->B4SOInrecr0d; - return(OK); - case B4SOI_MOD_ISBJT: - value->rValue = model->B4SOIisbjt; - return(OK); - case B4SOI_MOD_IDBJT: /* v4.0 */ - value->rValue = model->B4SOIidbjt; - return(OK); - case B4SOI_MOD_ISDIF: - value->rValue = model->B4SOIisdif; - return(OK); - case B4SOI_MOD_IDDIF: /* v4.0 */ - value->rValue = model->B4SOIiddif; - return(OK); - case B4SOI_MOD_ISREC: - value->rValue = model->B4SOIisrec; - return(OK); - case B4SOI_MOD_IDREC: /* v4.0 */ - value->rValue = model->B4SOIidrec; - return(OK); - case B4SOI_MOD_ISTUN: - value->rValue = model->B4SOIistun; - return(OK); - case B4SOI_MOD_IDTUN: /* v4.0 */ - value->rValue = model->B4SOIidtun; - return(OK); - case B4SOI_MOD_LN: - value->rValue = model->B4SOIln; - return(OK); - case B4SOI_MOD_VREC0S: /* v4.0 */ - value->rValue = model->B4SOIvrec0; - return(OK); - case B4SOI_MOD_VREC0D: /* v4.0 */ - value->rValue = model->B4SOIvrec0d; - return(OK); - case B4SOI_MOD_VTUN0S: /* v4.0 */ - value->rValue = model->B4SOIvtun0; - return(OK); - case B4SOI_MOD_VTUN0D: /* v4.0 */ - value->rValue = model->B4SOIvtun0d; - return(OK); - case B4SOI_MOD_NBJT: - value->rValue = model->B4SOInbjt; - return(OK); - case B4SOI_MOD_LBJT0: - value->rValue = model->B4SOIlbjt0; - return(OK); - case B4SOI_MOD_LDIF0: - value->rValue = model->B4SOIldif0; - return(OK); - case B4SOI_MOD_VABJT: - value->rValue = model->B4SOIvabjt; - return(OK); - case B4SOI_MOD_AELY: - value->rValue = model->B4SOIaely; - return(OK); - case B4SOI_MOD_AHLIS: /* v4.0 */ - value->rValue = model->B4SOIahli; - return(OK); - case B4SOI_MOD_AHLID: /* v4.0 */ - value->rValue = model->B4SOIahlid; - return(OK); - case B4SOI_MOD_RBODY: - value->rValue = model->B4SOIrbody; - return(OK); - case B4SOI_MOD_RBSH: - value->rValue = model->B4SOIrbsh; - return(OK); - case B4SOI_MOD_NTRECF: - value->rValue = model->B4SOIntrecf; - return(OK); - case B4SOI_MOD_NTRECR: - value->rValue = model->B4SOIntrecr; - return(OK); - case B4SOI_MOD_NDIF: - value->rValue = model->B4SOIndif; - return(OK); - case B4SOI_MOD_DLCB: - value->rValue = model->B4SOIdlcb; - return(OK); - case B4SOI_MOD_FBODY: - value->rValue = model->B4SOIfbody; - return(OK); - case B4SOI_MOD_TCJSWGS: - value->rValue = model->B4SOItcjswg; - return(OK); - case B4SOI_MOD_TPBSWGS: - value->rValue = model->B4SOItpbswg; - return(OK); - case B4SOI_MOD_TCJSWGD: - value->rValue = model->B4SOItcjswgd; - return(OK); - case B4SOI_MOD_TPBSWGD: - value->rValue = model->B4SOItpbswgd; - return(OK); - case B4SOI_MOD_ACDE: - value->rValue = model->B4SOIacde; - return(OK); - case B4SOI_MOD_MOIN: - value->rValue = model->B4SOImoin; - return(OK); - case B4SOI_MOD_NOFF: - value->rValue = model->B4SOInoff; - return(OK); /* v3.2 */ - case B4SOI_MOD_DELVT: - value->rValue = model->B4SOIdelvt; - return(OK); - case B4SOI_MOD_KB1: - value->rValue = model->B4SOIkb1; - return(OK); - case B4SOI_MOD_DLBG: - value->rValue = model->B4SOIdlbg; - return(OK); -/* v4.4 */ - case B4SOI_MOD_CFRCOEFF: - value->rValue = model->B4SOIcfrcoeff; - return(OK); - case B4SOI_MOD_EGIDL: - value->rValue = model->B4SOIegidl; - return(OK); - case B4SOI_MOD_AGIDL: - value->rValue = model->B4SOIagidl; - return(OK); - case B4SOI_MOD_BGIDL: - value->rValue = model->B4SOIbgidl; - return(OK); - case B4SOI_MOD_CGIDL: - value->rValue = model->B4SOIcgidl; - return(OK); - case B4SOI_MOD_RGIDL: - value->rValue = model->B4SOIrgidl; - return(OK); - case B4SOI_MOD_KGIDL: - value->rValue = model->B4SOIkgidl; - return(OK); - case B4SOI_MOD_FGIDL: - value->rValue = model->B4SOIfgidl; - return(OK); - - case B4SOI_MOD_EGISL: - value->rValue = model->B4SOIegisl; - return(OK); - case B4SOI_MOD_AGISL: - value->rValue = model->B4SOIagisl; - return(OK); - case B4SOI_MOD_BGISL: - value->rValue = model->B4SOIbgisl; - return(OK); - case B4SOI_MOD_CGISL: - value->rValue = model->B4SOIcgisl; - return(OK); - case B4SOI_MOD_RGISL: - value->rValue = model->B4SOIrgisl; - return(OK); - case B4SOI_MOD_KGISL: - value->rValue = model->B4SOIkgisl; - return(OK); - case B4SOI_MOD_FGISL: - value->rValue = model->B4SOIfgisl; - return(OK); - - case B4SOI_MOD_FDMOD: - value->rValue = model->B4SOIfdMod; - return(OK); - case B4SOI_MOD_VSCE: - value->rValue = model->B4SOIvsce; - return(OK); - case B4SOI_MOD_CDSBS: - value->rValue = model->B4SOIcdsbs; - return(OK); - - case B4SOI_MOD_MINVCV: - value->rValue = model->B4SOIminvcv; - return(OK); - case B4SOI_MOD_LMINVCV: - value->rValue = model->B4SOIlminvcv; - return(OK); - case B4SOI_MOD_WMINVCV: - value->rValue = model->B4SOIwminvcv; - return(OK); - case B4SOI_MOD_PMINVCV: - value->rValue = model->B4SOIpminvcv; - return(OK); - case B4SOI_MOD_VOFFCV: - value->rValue = model->B4SOIvoffcv; - return(OK); - case B4SOI_MOD_LVOFFCV: - value->rValue = model->B4SOIlvoffcv; - return(OK); - case B4SOI_MOD_WVOFFCV: - value->rValue = model->B4SOIwvoffcv; - return(OK); - case B4SOI_MOD_PVOFFCV: - value->rValue = model->B4SOIpvoffcv; - return(OK); -/* v3.0 */ - case B4SOI_MOD_SOIMOD: - value->iValue = model->B4SOIsoiMod; - return(OK); /* v3.2 bug fix */ - case B4SOI_MOD_VBS0PD: - value->rValue = model->B4SOIvbs0pd; - return(OK); /* v3.2 */ - case B4SOI_MOD_VBS0FD: - value->rValue = model->B4SOIvbs0fd; - return(OK); /* v3.2 */ - case B4SOI_MOD_VBSA: - value->rValue = model->B4SOIvbsa; - return(OK); - case B4SOI_MOD_NOFFFD: - value->rValue = model->B4SOInofffd; - return(OK); - case B4SOI_MOD_VOFFFD: - value->rValue = model->B4SOIvofffd; - return(OK); - case B4SOI_MOD_K1B: - value->rValue = model->B4SOIk1b; - return(OK); - case B4SOI_MOD_K2B: - value->rValue = model->B4SOIk2b; - return(OK); - case B4SOI_MOD_DK2B: - value->rValue = model->B4SOIdk2b; - return(OK); - case B4SOI_MOD_DVBD0: - value->rValue = model->B4SOIdvbd0; - return(OK); - case B4SOI_MOD_DVBD1: - value->rValue = model->B4SOIdvbd1; - return(OK); - case B4SOI_MOD_MOINFD: - value->rValue = model->B4SOImoinFD; - return(OK); - - - -/* v2.2 release */ - case B4SOI_MOD_WTH0: - value->rValue = model->B4SOIwth0; - return(OK); - case B4SOI_MOD_RHALO: - value->rValue = model->B4SOIrhalo; - return(OK); - case B4SOI_MOD_NTOX: - value->rValue = model->B4SOIntox; - return(OK); - case B4SOI_MOD_TOXREF: - value->rValue = model->B4SOItoxref; - return(OK); - case B4SOI_MOD_EBG: - value->rValue = model->B4SOIebg; - return(OK); - case B4SOI_MOD_VEVB: - value->rValue = model->B4SOIvevb; - return(OK); - case B4SOI_MOD_ALPHAGB1: - value->rValue = model->B4SOIalphaGB1; - return(OK); - case B4SOI_MOD_BETAGB1: - value->rValue = model->B4SOIbetaGB1; - return(OK); - case B4SOI_MOD_VGB1: - value->rValue = model->B4SOIvgb1; - return(OK); - case B4SOI_MOD_VECB: - value->rValue = model->B4SOIvecb; - return(OK); - case B4SOI_MOD_ALPHAGB2: - value->rValue = model->B4SOIalphaGB2; - return(OK); - case B4SOI_MOD_BETAGB2: - value->rValue = model->B4SOIbetaGB2; - return(OK); - case B4SOI_MOD_VGB2: - value->rValue = model->B4SOIvgb2; - return(OK); - case B4SOI_MOD_AIGBCP2: - value->rValue = model->B4SOIaigbcp2; - return(OK); - case B4SOI_MOD_BIGBCP2: - value->rValue = model->B4SOIbigbcp2; - return(OK); - case B4SOI_MOD_CIGBCP2: - value->rValue = model->B4SOIcigbcp2; - return(OK); - case B4SOI_MOD_TOXQM: - value->rValue = model->B4SOItoxqm; - return(OK); - case B4SOI_MOD_VOXH: - value->rValue = model->B4SOIvoxh; - return(OK); - case B4SOI_MOD_DELTAVOX: - value->rValue = model->B4SOIdeltavox; - return(OK); -/* v4.0 */ - case B4SOI_MOD_RDSMOD : - value->iValue = model->B4SOIrdsMod; - return(OK); - case B4SOI_MOD_RBODYMOD : - value->iValue = model->B4SOIrbodyMod; - return(OK); - case B4SOI_MOD_GBMIN: - value->rValue = model->B4SOIgbmin; - return(OK); - case B4SOI_MOD_RBDB: - value->rValue = model->B4SOIrbdb; - return(OK); - case B4SOI_MOD_RBSB: - value->rValue = model->B4SOIrbsb; - return(OK); - case B4SOI_MOD_FRBODY: - value->rValue = model->B4SOIfrbody; - return(OK); - case B4SOI_MOD_DVTP0: - value->rValue = model->B4SOIdvtp0; - return(OK); - case B4SOI_MOD_DVTP1: - value->rValue = model->B4SOIdvtp1; - return(OK); - case B4SOI_MOD_DVTP2: - value->rValue = model->B4SOIdvtp2; - return(OK); - case B4SOI_MOD_DVTP3: - value->rValue = model->B4SOIdvtp3; - return(OK); - case B4SOI_MOD_DVTP4: - value->rValue = model->B4SOIdvtp4; - return(OK); - case B4SOI_MOD_LDVTP0: - value->rValue = model->B4SOIldvtp0; - return(OK); - case B4SOI_MOD_LDVTP1: - value->rValue = model->B4SOIldvtp1; - return(OK); - case B4SOI_MOD_LDVTP2: - value->rValue = model->B4SOIldvtp2; - return(OK); - case B4SOI_MOD_LDVTP3: - value->rValue = model->B4SOIldvtp3; - return(OK); - case B4SOI_MOD_LDVTP4: - value->rValue = model->B4SOIldvtp4; - return(OK); - case B4SOI_MOD_WDVTP0: - value->rValue = model->B4SOIwdvtp0; - return(OK); - case B4SOI_MOD_WDVTP1: - value->rValue = model->B4SOIwdvtp1; - return(OK); - case B4SOI_MOD_WDVTP2: - value->rValue = model->B4SOIwdvtp2; - return(OK); - case B4SOI_MOD_WDVTP3: - value->rValue = model->B4SOIwdvtp3; - return(OK); - case B4SOI_MOD_WDVTP4: - value->rValue = model->B4SOIwdvtp4; - return(OK); - case B4SOI_MOD_PDVTP0: - value->rValue = model->B4SOIpdvtp0; - return(OK); - case B4SOI_MOD_PDVTP1: - value->rValue = model->B4SOIpdvtp1; - return(OK); - case B4SOI_MOD_PDVTP2: - value->rValue = model->B4SOIpdvtp2; - return(OK); - case B4SOI_MOD_PDVTP3: - value->rValue = model->B4SOIpdvtp3; - return(OK); - case B4SOI_MOD_PDVTP4: - value->rValue = model->B4SOIpdvtp4; - return(OK); - case B4SOI_MOD_MINV: - value->rValue = model->B4SOIminv; - return(OK); - case B4SOI_MOD_LMINV: - value->rValue = model->B4SOIlminv; - return(OK); - case B4SOI_MOD_WMINV: - value->rValue = model->B4SOIwminv; - return(OK); - case B4SOI_MOD_PMINV: - value->rValue = model->B4SOIpminv; - return(OK); - case B4SOI_MOD_FPROUT: - value->rValue = model->B4SOIfprout; - return(OK); - case B4SOI_MOD_PDITS: - value->rValue = model->B4SOIpdits; - return(OK); - case B4SOI_MOD_PDITSD: - value->rValue = model->B4SOIpditsd; - return(OK); - case B4SOI_MOD_PDITSL: - value->rValue = model->B4SOIpditsl; - return(OK); - case B4SOI_MOD_LFPROUT: - value->rValue = model->B4SOIlfprout; - return(OK); - case B4SOI_MOD_LPDITS: - value->rValue = model->B4SOIlpdits; - return(OK); - case B4SOI_MOD_LPDITSD: - value->rValue = model->B4SOIlpditsd; - return(OK); - case B4SOI_MOD_WFPROUT: - value->rValue = model->B4SOIwfprout; - return(OK); - case B4SOI_MOD_WPDITS: - value->rValue = model->B4SOIwpdits; - return(OK); - case B4SOI_MOD_WPDITSD: - value->rValue = model->B4SOIwpditsd; - return(OK); - case B4SOI_MOD_PFPROUT: - value->rValue = model->B4SOIpfprout; - return(OK); - case B4SOI_MOD_PPDITS: - value->rValue = model->B4SOIppdits; - return(OK); - case B4SOI_MOD_PPDITSD: - value->rValue = model->B4SOIppditsd; - return(OK); - -/* v4.0 end */ - -/* v3.2 */ - case B4SOI_MOD_FNOIMOD : - value->iValue = model->B4SOIfnoiMod; - return(OK); - case B4SOI_MOD_TNOIMOD : - value->iValue = model->B4SOItnoiMod; - return(OK); - case B4SOI_MOD_TNOIA: - value->rValue = model->B4SOItnoia; - return(OK); - case B4SOI_MOD_TNOIB: - value->rValue = model->B4SOItnoib; - return(OK); - case B4SOI_MOD_RNOIA: - value->rValue = model->B4SOIrnoia; - return(OK); - case B4SOI_MOD_RNOIB: - value->rValue = model->B4SOIrnoib; - return(OK); - case B4SOI_MOD_NTNOI: - value->rValue = model->B4SOIntnoi; - return(OK); -/* v3.2 */ - -/* v3.1 added for RF */ - case B4SOI_MOD_RGATEMOD : - value->iValue = model->B4SOIrgateMod; - return(OK); - case B4SOI_MOD_XRCRG1: - value->rValue = model->B4SOIxrcrg1; - return(OK); - case B4SOI_MOD_XRCRG2: - value->rValue = model->B4SOIxrcrg2; - return(OK); - case B4SOI_MOD_RSHG: - value->rValue = model->B4SOIrshg; - return(OK); - case B4SOI_MOD_NGCON: - value->rValue = model->B4SOIngcon; - return(OK); - case B4SOI_MOD_XGW: - value->rValue = model->B4SOIxgw; - return(OK); - case B4SOI_MOD_XGL: - value->rValue = model->B4SOIxgl; - return(OK); -/* v3.1 added for RF end */ -/*4.1*/ - - case B4SOI_MOD_MTRLMOD : - value->iValue = model->B4SOImtrlMod; - return(OK); - case B4SOI_MOD_VGSTCVMOD: - value->iValue = model->B4SOIvgstcvMod; - return(OK); - case B4SOI_MOD_GIDLMOD : - value->iValue = model->B4SOIgidlMod; - return(OK); - case B4SOI_MOD_IIIMOD : - value->iValue = model->B4SOIiiiMod; - return(OK); -/* v3.0 */ - case B4SOI_MOD_IGBMOD: - value->iValue = model->B4SOIigbMod; - return(OK); - case B4SOI_MOD_IGCMOD: - value->iValue = model->B4SOIigcMod; - return(OK); - case B4SOI_MOD_AIGC: - value->rValue = model->B4SOIaigc; - return(OK); - case B4SOI_MOD_BIGC: - value->rValue = model->B4SOIbigc; - return(OK); - case B4SOI_MOD_CIGC: - value->rValue = model->B4SOIcigc; - return(OK); - case B4SOI_MOD_AIGSD: - value->rValue = model->B4SOIaigsd; - return(OK); - case B4SOI_MOD_BIGSD: - value->rValue = model->B4SOIbigsd; - return(OK); - case B4SOI_MOD_CIGSD: - value->rValue = model->B4SOIcigsd; - return(OK); - case B4SOI_MOD_NIGC: - value->rValue = model->B4SOInigc; - return(OK); - case B4SOI_MOD_PIGCD: - value->rValue = model->B4SOIpigcd; - return(OK); - case B4SOI_MOD_POXEDGE: - value->rValue = model->B4SOIpoxedge; - return(OK); - case B4SOI_MOD_DLCIG: - value->rValue = model->B4SOIdlcig; - return(OK); - - - -/* Added for binning - START */ - /* Length Dependence */ -/* v3.1 */ - case B4SOI_MOD_LXJ: - value->rValue = model->B4SOIlxj; - return(OK); - case B4SOI_MOD_LALPHAGB1: - value->rValue = model->B4SOIlalphaGB1; - return(OK); - case B4SOI_MOD_LALPHAGB2: - value->rValue = model->B4SOIlalphaGB2; - return(OK); - case B4SOI_MOD_LBETAGB1: - value->rValue = model->B4SOIlbetaGB1; - return(OK); - case B4SOI_MOD_LBETAGB2: - value->rValue = model->B4SOIlbetaGB2; - return(OK); - case B4SOI_MOD_LAIGBCP2: - value->rValue = model->B4SOIlaigbcp2; - return(OK); - case B4SOI_MOD_LBIGBCP2: - value->rValue = model->B4SOIlbigbcp2; - return(OK); - case B4SOI_MOD_LCIGBCP2: - value->rValue = model->B4SOIlcigbcp2; - return(OK); - case B4SOI_MOD_LNDIF: - value->rValue = model->B4SOIlndif; - return(OK); - case B4SOI_MOD_LNTRECF: - value->rValue = model->B4SOIlntrecf; - return(OK); - case B4SOI_MOD_LNTRECR: - value->rValue = model->B4SOIlntrecr; - return(OK); - case B4SOI_MOD_LXBJT: - value->rValue = model->B4SOIlxbjt; - return(OK); - case B4SOI_MOD_LXDIFS: - value->rValue = model->B4SOIlxdif; - return(OK); - case B4SOI_MOD_LXRECS: - value->rValue = model->B4SOIlxrec; - return(OK); - case B4SOI_MOD_LXTUNS: - value->rValue = model->B4SOIlxtun; - return(OK); - case B4SOI_MOD_LXDIFD: - value->rValue = model->B4SOIlxdifd; - return(OK); - case B4SOI_MOD_LXRECD: - value->rValue = model->B4SOIlxrecd; - return(OK); - case B4SOI_MOD_LXTUND: - value->rValue = model->B4SOIlxtund; - return(OK); - case B4SOI_MOD_LCGDL: - value->rValue = model->B4SOIlcgdl; - return(OK); - case B4SOI_MOD_LCGSL: - value->rValue = model->B4SOIlcgsl; - return(OK); - case B4SOI_MOD_LCKAPPA: - value->rValue = model->B4SOIlckappa; - return(OK); - case B4SOI_MOD_LUTE: - value->rValue = model->B4SOIlute; - return(OK); - case B4SOI_MOD_LKT1: - value->rValue = model->B4SOIlkt1; - return(OK); - case B4SOI_MOD_LKT2: - value->rValue = model->B4SOIlkt2; - return(OK); - case B4SOI_MOD_LKT1L: - value->rValue = model->B4SOIlkt1l; - return(OK); - case B4SOI_MOD_LUA1: - value->rValue = model->B4SOIlua1; - return(OK); - case B4SOI_MOD_LUB1: - value->rValue = model->B4SOIlub1; - return(OK); - case B4SOI_MOD_LUC1: - value->rValue = model->B4SOIluc1; - return(OK); - case B4SOI_MOD_LAT: - value->rValue = model->B4SOIlat; - return(OK); - case B4SOI_MOD_LPRT: - value->rValue = model->B4SOIlprt; - return(OK); - - -/* v3.0 */ - case B4SOI_MOD_LAIGC: - value->rValue = model->B4SOIlaigc; - return(OK); - case B4SOI_MOD_LBIGC: - value->rValue = model->B4SOIlbigc; - return(OK); - case B4SOI_MOD_LCIGC: - value->rValue = model->B4SOIlcigc; - return(OK); - case B4SOI_MOD_LAIGSD: - value->rValue = model->B4SOIlaigsd; - return(OK); - case B4SOI_MOD_LBIGSD: - value->rValue = model->B4SOIlbigsd; - return(OK); - case B4SOI_MOD_LCIGSD: - value->rValue = model->B4SOIlcigsd; - return(OK); - case B4SOI_MOD_LNIGC: - value->rValue = model->B4SOIlnigc; - return(OK); - case B4SOI_MOD_LPIGCD: - value->rValue = model->B4SOIlpigcd; - return(OK); - case B4SOI_MOD_LPOXEDGE: - value->rValue = model->B4SOIlpoxedge; - return(OK); - - case B4SOI_MOD_LNPEAK: - value->rValue = model->B4SOIlnpeak; - return(OK); - case B4SOI_MOD_LNSUB: - value->rValue = model->B4SOIlnsub; - return(OK); - case B4SOI_MOD_LNGATE: - value->rValue = model->B4SOIlngate; - return(OK); - case B4SOI_MOD_LNSD: - value->rValue = model->B4SOIlnsd; - return(OK); - case B4SOI_MOD_LVTH0: - value->rValue = model->B4SOIlvth0; - return(OK); - case B4SOI_MOD_LVFB: - value->rValue = model->B4SOIlvfb; - return(OK); /* v4.1 */ - case B4SOI_MOD_LK1: - value->rValue = model->B4SOIlk1; - return(OK); - case B4SOI_MOD_LK1W1: - value->rValue = model->B4SOIlk1w1; - return(OK); - case B4SOI_MOD_LK1W2: - value->rValue = model->B4SOIlk1w2; - return(OK); - case B4SOI_MOD_LK2: - value->rValue = model->B4SOIlk2; - return(OK); - case B4SOI_MOD_LK3: - value->rValue = model->B4SOIlk3; - return(OK); - case B4SOI_MOD_LK3B: - value->rValue = model->B4SOIlk3b; - return(OK); - case B4SOI_MOD_LKB1: - value->rValue = model->B4SOIlkb1; - return(OK); - case B4SOI_MOD_LW0: - value->rValue = model->B4SOIlw0; - return(OK); - case B4SOI_MOD_LLPE0: - value->rValue = model->B4SOIllpe0; - return(OK); - case B4SOI_MOD_LLPEB: /* v4.0 for Vth */ - value->rValue = model->B4SOIllpeb; - return(OK); - case B4SOI_MOD_LDVT0 : - value->rValue = model->B4SOIldvt0; - return(OK); - case B4SOI_MOD_LDVT1 : - value->rValue = model->B4SOIldvt1; - return(OK); - case B4SOI_MOD_LDVT2 : - value->rValue = model->B4SOIldvt2; - return(OK); - case B4SOI_MOD_LDVT0W : - value->rValue = model->B4SOIldvt0w; - return(OK); - case B4SOI_MOD_LDVT1W : - value->rValue = model->B4SOIldvt1w; - return(OK); - case B4SOI_MOD_LDVT2W : - value->rValue = model->B4SOIldvt2w; - return(OK); - case B4SOI_MOD_LU0: - value->rValue = model->B4SOIlu0; - return(OK); - case B4SOI_MOD_LUA: - value->rValue = model->B4SOIlua; - return(OK); - case B4SOI_MOD_LUB: - value->rValue = model->B4SOIlub; - return(OK); - case B4SOI_MOD_LUC: - value->rValue = model->B4SOIluc; - return(OK); - case B4SOI_MOD_LVSAT: - value->rValue = model->B4SOIlvsat; - return(OK); - case B4SOI_MOD_LA0: - value->rValue = model->B4SOIla0; - return(OK); - case B4SOI_MOD_LAGS: - value->rValue = model->B4SOIlags; - return(OK); - case B4SOI_MOD_LB0: - value->rValue = model->B4SOIlb0; - return(OK); - case B4SOI_MOD_LB1: - value->rValue = model->B4SOIlb1; - return(OK); - case B4SOI_MOD_LKETA: - value->rValue = model->B4SOIlketa; - return(OK); - case B4SOI_MOD_LKETAS: - value->rValue = model->B4SOIlketas; - return(OK); - case B4SOI_MOD_LA1: - value->rValue = model->B4SOIla1; - return(OK); - case B4SOI_MOD_LA2: - value->rValue = model->B4SOIla2; - return(OK); - case B4SOI_MOD_LRDSW: - value->rValue = model->B4SOIlrdsw; - return(OK); - case B4SOI_MOD_LRDW: - value->rValue = model->B4SOIlrdw; - return(OK); - case B4SOI_MOD_LRSW: - value->rValue = model->B4SOIlrsw; - return(OK); - case B4SOI_MOD_LPRWB: - value->rValue = model->B4SOIlprwb; - return(OK); - case B4SOI_MOD_LPRWG: - value->rValue = model->B4SOIlprwg; - return(OK); - case B4SOI_MOD_LWR: - value->rValue = model->B4SOIlwr; - return(OK); - case B4SOI_MOD_LNFACTOR : - value->rValue = model->B4SOIlnfactor; - return(OK); - case B4SOI_MOD_LDWG: - value->rValue = model->B4SOIldwg; - return(OK); - case B4SOI_MOD_LDWB: - value->rValue = model->B4SOIldwb; - return(OK); - case B4SOI_MOD_LVOFF: - value->rValue = model->B4SOIlvoff; - return(OK); - case B4SOI_MOD_LETA0: - value->rValue = model->B4SOIleta0; - return(OK); - case B4SOI_MOD_LETAB: - value->rValue = model->B4SOIletab; - return(OK); - case B4SOI_MOD_LDSUB : - value->rValue = model->B4SOIldsub; - return(OK); - case B4SOI_MOD_LCIT : - value->rValue = model->B4SOIlcit; - return(OK); - case B4SOI_MOD_LCDSC : - value->rValue = model->B4SOIlcdsc; - return(OK); - case B4SOI_MOD_LCDSCB : - value->rValue = model->B4SOIlcdscb; - return(OK); - case B4SOI_MOD_LCDSCD : - value->rValue = model->B4SOIlcdscd; - return(OK); - case B4SOI_MOD_LPCLM: - value->rValue = model->B4SOIlpclm; - return(OK); - case B4SOI_MOD_LPDIBL1: - value->rValue = model->B4SOIlpdibl1; - return(OK); - case B4SOI_MOD_LPDIBL2: - value->rValue = model->B4SOIlpdibl2; - return(OK); - case B4SOI_MOD_LPDIBLB: - value->rValue = model->B4SOIlpdiblb; - return(OK); - case B4SOI_MOD_LDROUT : - value->rValue = model->B4SOIldrout; - return(OK); - case B4SOI_MOD_LPVAG: - value->rValue = model->B4SOIlpvag; - return(OK); - case B4SOI_MOD_LDELTA: - value->rValue = model->B4SOIldelta; - return(OK); - case B4SOI_MOD_LALPHA0: - value->rValue = model->B4SOIlalpha0; - return(OK); - case B4SOI_MOD_LFBJTII: - value->rValue = model->B4SOIlfbjtii; - return(OK); - /*4.1 Iii model*/ - case B4SOI_MOD_LEBJTII: - value->rValue = model->B4SOIlebjtii; - return(OK); - case B4SOI_MOD_LCBJTII: - value->rValue = model->B4SOIlcbjtii; - return(OK); - case B4SOI_MOD_LVBCI: - value->rValue = model->B4SOIlvbci; - return(OK); - case B4SOI_MOD_LABJTII: - value->rValue = model->B4SOIlabjtii; - return(OK); - case B4SOI_MOD_LMBJTII: - value->rValue = model->B4SOIlmbjtii; - return(OK); - case B4SOI_MOD_LBETA0: - value->rValue = model->B4SOIlbeta0; - return(OK); - case B4SOI_MOD_LBETA1: - value->rValue = model->B4SOIlbeta1; - return(OK); - case B4SOI_MOD_LBETA2: - value->rValue = model->B4SOIlbeta2; - return(OK); - case B4SOI_MOD_LVDSATII0: - value->rValue = model->B4SOIlvdsatii0; - return(OK); - case B4SOI_MOD_LLII: - value->rValue = model->B4SOIllii; - return(OK); - case B4SOI_MOD_LESATII: - value->rValue = model->B4SOIlesatii; - return(OK); - case B4SOI_MOD_LSII0: - value->rValue = model->B4SOIlsii0; - return(OK); - case B4SOI_MOD_LSII1: - value->rValue = model->B4SOIlsii1; - return(OK); - case B4SOI_MOD_LSII2: - value->rValue = model->B4SOIlsii2; - return(OK); - case B4SOI_MOD_LSIID: - value->rValue = model->B4SOIlsiid; - return(OK); - case B4SOI_MOD_LAGIDL: - value->rValue = model->B4SOIlagidl; - return(OK); - case B4SOI_MOD_LBGIDL: - value->rValue = model->B4SOIlbgidl; - return(OK); - case B4SOI_MOD_LCGIDL: - value->rValue = model->B4SOIlcgidl; - return(OK); - case B4SOI_MOD_LEGIDL: - value->rValue = model->B4SOIlegidl; - return(OK); - case B4SOI_MOD_LRGIDL: - value->rValue = model->B4SOIlrgidl; - return(OK); - case B4SOI_MOD_LKGIDL: - value->rValue = model->B4SOIlkgidl; - return(OK); - case B4SOI_MOD_LFGIDL: - value->rValue = model->B4SOIlfgidl; - return(OK); - - case B4SOI_MOD_LAGISL: - value->rValue = model->B4SOIlagisl; - return(OK); - case B4SOI_MOD_LBGISL: - value->rValue = model->B4SOIlbgisl; - return(OK); - case B4SOI_MOD_LCGISL: - value->rValue = model->B4SOIlcgisl; - return(OK); - case B4SOI_MOD_LEGISL: - value->rValue = model->B4SOIlegisl; - return(OK); - case B4SOI_MOD_LRGISL: - value->rValue = model->B4SOIlrgisl; - return(OK); - case B4SOI_MOD_LKGISL: - value->rValue = model->B4SOIlkgisl; - return(OK); - case B4SOI_MOD_LFGISL: - value->rValue = model->B4SOIlfgisl; - return(OK); - case B4SOI_MOD_LNTUNS: /* v4.0 */ - value->rValue = model->B4SOIlntun; - return(OK); - case B4SOI_MOD_LNTUND: /* v4.0 */ - value->rValue = model->B4SOIlntund; - return(OK); - case B4SOI_MOD_LNDIODES: /* v4.0 */ - value->rValue = model->B4SOIlndiode; - return(OK); - case B4SOI_MOD_LNDIODED: /* v4.0 */ - value->rValue = model->B4SOIlndioded; - return(OK); - case B4SOI_MOD_LNRECF0S: /* v4.0 */ - value->rValue = model->B4SOIlnrecf0; - return(OK); - case B4SOI_MOD_LNRECF0D: /* v4.0 */ - value->rValue = model->B4SOIlnrecf0d; - return(OK); - case B4SOI_MOD_LNRECR0S: /* v4.0 */ - value->rValue = model->B4SOIlnrecr0; - return(OK); - case B4SOI_MOD_LNRECR0D: /* v4.0 */ - value->rValue = model->B4SOIlnrecr0d; - return(OK); - case B4SOI_MOD_LISBJT: - value->rValue = model->B4SOIlisbjt; - return(OK); - case B4SOI_MOD_LIDBJT: /* v4.0 */ - value->rValue = model->B4SOIlidbjt; - return(OK); - case B4SOI_MOD_LISDIF: - value->rValue = model->B4SOIlisdif; - return(OK); - case B4SOI_MOD_LIDDIF: /* v4.0 */ - value->rValue = model->B4SOIliddif; - return(OK); - case B4SOI_MOD_LISREC: - value->rValue = model->B4SOIlisrec; - return(OK); - case B4SOI_MOD_LIDREC: /* v4.0 */ - value->rValue = model->B4SOIlidrec; - return(OK); - case B4SOI_MOD_LISTUN: - value->rValue = model->B4SOIlistun; - return(OK); - case B4SOI_MOD_LIDTUN: /* v4.0 */ - value->rValue = model->B4SOIlidtun; - return(OK); - case B4SOI_MOD_LVREC0S: /* v4.0 */ - value->rValue = model->B4SOIlvrec0; - return(OK); - case B4SOI_MOD_LVREC0D: /* v4.0 */ - value->rValue = model->B4SOIlvrec0d; - return(OK); - case B4SOI_MOD_LVTUN0S: /* v4.0 */ - value->rValue = model->B4SOIlvtun0; - return(OK); - case B4SOI_MOD_LVTUN0D: /* v4.0 */ - value->rValue = model->B4SOIlvtun0d; - return(OK); - case B4SOI_MOD_LNBJT: - value->rValue = model->B4SOIlnbjt; - return(OK); - case B4SOI_MOD_LLBJT0: - value->rValue = model->B4SOIllbjt0; - return(OK); - case B4SOI_MOD_LVABJT: - value->rValue = model->B4SOIlvabjt; - return(OK); - case B4SOI_MOD_LAELY: - value->rValue = model->B4SOIlaely; - return(OK); - case B4SOI_MOD_LAHLIS: /* v4.0 */ - value->rValue = model->B4SOIlahli; - return(OK); - case B4SOI_MOD_LAHLID: /* v4.0 */ - value->rValue = model->B4SOIlahlid; - return(OK); - /* CV Model */ - case B4SOI_MOD_LVSDFB: - value->rValue = model->B4SOIlvsdfb; - return(OK); - case B4SOI_MOD_LVSDTH: - value->rValue = model->B4SOIlvsdth; - return(OK); - case B4SOI_MOD_LDELVT: - value->rValue = model->B4SOIldelvt; - return(OK); - case B4SOI_MOD_LACDE: - value->rValue = model->B4SOIlacde; - return(OK); - case B4SOI_MOD_LMOIN: - value->rValue = model->B4SOIlmoin; - return(OK); - case B4SOI_MOD_LNOFF: - value->rValue = model->B4SOIlnoff; - return(OK); /* v3.2 */ - - /* Width Dependence */ -/* v3.1 */ - case B4SOI_MOD_WXJ: - value->rValue = model->B4SOIwxj; - return(OK); - case B4SOI_MOD_WALPHAGB1: - value->rValue = model->B4SOIwalphaGB1; - return(OK); - case B4SOI_MOD_WALPHAGB2: - value->rValue = model->B4SOIwalphaGB2; - return(OK); - case B4SOI_MOD_WBETAGB1: - value->rValue = model->B4SOIwbetaGB1; - return(OK); - case B4SOI_MOD_WBETAGB2: - value->rValue = model->B4SOIwbetaGB2; - return(OK); - case B4SOI_MOD_WAIGBCP2: - value->rValue = model->B4SOIwaigbcp2; - return(OK); - case B4SOI_MOD_WBIGBCP2: - value->rValue = model->B4SOIwbigbcp2; - return(OK); - case B4SOI_MOD_WCIGBCP2: - value->rValue = model->B4SOIwcigbcp2; - return(OK); - case B4SOI_MOD_WNDIF: - value->rValue = model->B4SOIwndif; - return(OK); - case B4SOI_MOD_WNTRECF: - value->rValue = model->B4SOIwntrecf; - return(OK); - case B4SOI_MOD_WNTRECR: - value->rValue = model->B4SOIwntrecr; - return(OK); - case B4SOI_MOD_WXBJT: - value->rValue = model->B4SOIwxbjt; - return(OK); - case B4SOI_MOD_WXDIFS: - value->rValue = model->B4SOIwxdif; - return(OK); - case B4SOI_MOD_WXRECS: - value->rValue = model->B4SOIwxrec; - return(OK); - case B4SOI_MOD_WXTUNS: - value->rValue = model->B4SOIwxtun; - return(OK); - case B4SOI_MOD_WXDIFD: - value->rValue = model->B4SOIwxdifd; - return(OK); - case B4SOI_MOD_WXRECD: - value->rValue = model->B4SOIwxrecd; - return(OK); - case B4SOI_MOD_WXTUND: - value->rValue = model->B4SOIwxtund; - return(OK); - case B4SOI_MOD_WCGDL: - value->rValue = model->B4SOIwcgdl; - return(OK); - case B4SOI_MOD_WCGSL: - value->rValue = model->B4SOIwcgsl; - return(OK); - case B4SOI_MOD_WCKAPPA: - value->rValue = model->B4SOIwckappa; - return(OK); - case B4SOI_MOD_WUTE: - value->rValue = model->B4SOIwute; - return(OK); - case B4SOI_MOD_WKT1: - value->rValue = model->B4SOIwkt1; - return(OK); - case B4SOI_MOD_WKT2: - value->rValue = model->B4SOIwkt2; - return(OK); - case B4SOI_MOD_WKT1L: - value->rValue = model->B4SOIwkt1l; - return(OK); - case B4SOI_MOD_WUA1: - value->rValue = model->B4SOIwua1; - return(OK); - case B4SOI_MOD_WUB1: - value->rValue = model->B4SOIwub1; - return(OK); - case B4SOI_MOD_WUC1: - value->rValue = model->B4SOIwuc1; - return(OK); - case B4SOI_MOD_WAT: - value->rValue = model->B4SOIwat; - return(OK); - case B4SOI_MOD_WPRT: - value->rValue = model->B4SOIwprt; - return(OK); - -/* v3.0 */ - case B4SOI_MOD_WAIGC: - value->rValue = model->B4SOIwaigc; - return(OK); - case B4SOI_MOD_WBIGC: - value->rValue = model->B4SOIwbigc; - return(OK); - case B4SOI_MOD_WCIGC: - value->rValue = model->B4SOIwcigc; - return(OK); - case B4SOI_MOD_WAIGSD: - value->rValue = model->B4SOIwaigsd; - return(OK); - case B4SOI_MOD_WBIGSD: - value->rValue = model->B4SOIwbigsd; - return(OK); - case B4SOI_MOD_WCIGSD: - value->rValue = model->B4SOIwcigsd; - return(OK); - case B4SOI_MOD_WNIGC: - value->rValue = model->B4SOIwnigc; - return(OK); - case B4SOI_MOD_WPIGCD: - value->rValue = model->B4SOIwpigcd; - return(OK); - case B4SOI_MOD_WPOXEDGE: - value->rValue = model->B4SOIwpoxedge; - return(OK); - - case B4SOI_MOD_WNPEAK: - value->rValue = model->B4SOIwnpeak; - return(OK); - case B4SOI_MOD_WNSUB: - value->rValue = model->B4SOIwnsub; - return(OK); - case B4SOI_MOD_WNGATE: - value->rValue = model->B4SOIwngate; - return(OK); - case B4SOI_MOD_WNSD: - value->rValue = model->B4SOIwnsd; - return(OK); - case B4SOI_MOD_WVTH0: - value->rValue = model->B4SOIwvth0; - return(OK); - case B4SOI_MOD_WVFB: - value->rValue = model->B4SOIwvfb; - return(OK); /* v4.1 */ - case B4SOI_MOD_WK1: - value->rValue = model->B4SOIwk1; - return(OK); - case B4SOI_MOD_WK1W1: - value->rValue = model->B4SOIwk1w1; - return(OK); - case B4SOI_MOD_WK1W2: - value->rValue = model->B4SOIwk1w2; - return(OK); - case B4SOI_MOD_WK2: - value->rValue = model->B4SOIwk2; - return(OK); - case B4SOI_MOD_WK3: - value->rValue = model->B4SOIwk3; - return(OK); - case B4SOI_MOD_WK3B: - value->rValue = model->B4SOIwk3b; - return(OK); - case B4SOI_MOD_WKB1: - value->rValue = model->B4SOIwkb1; - return(OK); - case B4SOI_MOD_WW0: - value->rValue = model->B4SOIww0; - return(OK); - case B4SOI_MOD_WLPE0: - value->rValue = model->B4SOIwlpe0; - return(OK); - case B4SOI_MOD_WLPEB: /* v4.0 for Vth */ - value->rValue = model->B4SOIwlpeb; - return(OK); - case B4SOI_MOD_WDVT0 : - value->rValue = model->B4SOIwdvt0; - return(OK); - case B4SOI_MOD_WDVT1 : - value->rValue = model->B4SOIwdvt1; - return(OK); - case B4SOI_MOD_WDVT2 : - value->rValue = model->B4SOIwdvt2; - return(OK); - case B4SOI_MOD_WDVT0W : - value->rValue = model->B4SOIwdvt0w; - return(OK); - case B4SOI_MOD_WDVT1W : - value->rValue = model->B4SOIwdvt1w; - return(OK); - case B4SOI_MOD_WDVT2W : - value->rValue = model->B4SOIwdvt2w; - return(OK); - case B4SOI_MOD_WU0: - value->rValue = model->B4SOIwu0; - return(OK); - case B4SOI_MOD_WUA: - value->rValue = model->B4SOIwua; - return(OK); - case B4SOI_MOD_WUB: - value->rValue = model->B4SOIwub; - return(OK); - case B4SOI_MOD_WUC: - value->rValue = model->B4SOIwuc; - return(OK); - case B4SOI_MOD_WVSAT: - value->rValue = model->B4SOIwvsat; - return(OK); - case B4SOI_MOD_WA0: - value->rValue = model->B4SOIwa0; - return(OK); - case B4SOI_MOD_WAGS: - value->rValue = model->B4SOIwags; - return(OK); - case B4SOI_MOD_WB0: - value->rValue = model->B4SOIwb0; - return(OK); - case B4SOI_MOD_WB1: - value->rValue = model->B4SOIwb1; - return(OK); - case B4SOI_MOD_WKETA: - value->rValue = model->B4SOIwketa; - return(OK); - case B4SOI_MOD_WKETAS: - value->rValue = model->B4SOIwketas; - return(OK); - case B4SOI_MOD_WA1: - value->rValue = model->B4SOIwa1; - return(OK); - case B4SOI_MOD_WA2: - value->rValue = model->B4SOIwa2; - return(OK); - case B4SOI_MOD_WRDSW: - value->rValue = model->B4SOIwrdsw; - return(OK); - case B4SOI_MOD_WRDW: - value->rValue = model->B4SOIwrdw; - return(OK); - case B4SOI_MOD_WRSW: - value->rValue = model->B4SOIwrsw; - return(OK); - case B4SOI_MOD_WPRWB: - value->rValue = model->B4SOIwprwb; - return(OK); - case B4SOI_MOD_WPRWG: - value->rValue = model->B4SOIwprwg; - return(OK); - case B4SOI_MOD_WWR: - value->rValue = model->B4SOIwwr; - return(OK); - case B4SOI_MOD_WNFACTOR : - value->rValue = model->B4SOIwnfactor; - return(OK); - case B4SOI_MOD_WDWG: - value->rValue = model->B4SOIwdwg; - return(OK); - case B4SOI_MOD_WDWB: - value->rValue = model->B4SOIwdwb; - return(OK); - case B4SOI_MOD_WVOFF: - value->rValue = model->B4SOIwvoff; - return(OK); - case B4SOI_MOD_WETA0: - value->rValue = model->B4SOIweta0; - return(OK); - case B4SOI_MOD_WETAB: - value->rValue = model->B4SOIwetab; - return(OK); - case B4SOI_MOD_WDSUB : - value->rValue = model->B4SOIwdsub; - return(OK); - case B4SOI_MOD_WCIT : - value->rValue = model->B4SOIwcit; - return(OK); - case B4SOI_MOD_WCDSC : - value->rValue = model->B4SOIwcdsc; - return(OK); - case B4SOI_MOD_WCDSCB : - value->rValue = model->B4SOIwcdscb; - return(OK); - case B4SOI_MOD_WCDSCD : - value->rValue = model->B4SOIwcdscd; - return(OK); - case B4SOI_MOD_WPCLM: - value->rValue = model->B4SOIwpclm; - return(OK); - case B4SOI_MOD_WPDIBL1: - value->rValue = model->B4SOIwpdibl1; - return(OK); - case B4SOI_MOD_WPDIBL2: - value->rValue = model->B4SOIwpdibl2; - return(OK); - case B4SOI_MOD_WPDIBLB: - value->rValue = model->B4SOIwpdiblb; - return(OK); - case B4SOI_MOD_WDROUT : - value->rValue = model->B4SOIwdrout; - return(OK); - case B4SOI_MOD_WPVAG: - value->rValue = model->B4SOIwpvag; - return(OK); - case B4SOI_MOD_WDELTA: - value->rValue = model->B4SOIwdelta; - return(OK); - case B4SOI_MOD_WALPHA0: - value->rValue = model->B4SOIwalpha0; - return(OK); - case B4SOI_MOD_WFBJTII: - value->rValue = model->B4SOIwfbjtii; - return(OK); - /*4.1 Iii model*/ - case B4SOI_MOD_WEBJTII: - value->rValue = model->B4SOIwebjtii; - return(OK); - case B4SOI_MOD_WCBJTII: - value->rValue = model->B4SOIwcbjtii; - return(OK); - case B4SOI_MOD_WVBCI: - value->rValue = model->B4SOIwvbci; - return(OK); - case B4SOI_MOD_WABJTII: - value->rValue = model->B4SOIwabjtii; - return(OK); - case B4SOI_MOD_WMBJTII: - value->rValue = model->B4SOIwmbjtii; - return(OK); - case B4SOI_MOD_WBETA0: - value->rValue = model->B4SOIwbeta0; - return(OK); - case B4SOI_MOD_WBETA1: - value->rValue = model->B4SOIwbeta1; - return(OK); - case B4SOI_MOD_WBETA2: - value->rValue = model->B4SOIwbeta2; - return(OK); - case B4SOI_MOD_WVDSATII0: - value->rValue = model->B4SOIwvdsatii0; - return(OK); - case B4SOI_MOD_WLII: - value->rValue = model->B4SOIwlii; - return(OK); - case B4SOI_MOD_WESATII: - value->rValue = model->B4SOIwesatii; - return(OK); - case B4SOI_MOD_WSII0: - value->rValue = model->B4SOIwsii0; - return(OK); - case B4SOI_MOD_WSII1: - value->rValue = model->B4SOIwsii1; - return(OK); - case B4SOI_MOD_WSII2: - value->rValue = model->B4SOIwsii2; - return(OK); - case B4SOI_MOD_WSIID: - value->rValue = model->B4SOIwsiid; - return(OK); - case B4SOI_MOD_WAGIDL: - value->rValue = model->B4SOIwagidl; - return(OK); - case B4SOI_MOD_WBGIDL: - value->rValue = model->B4SOIwbgidl; - return(OK); - case B4SOI_MOD_WCGIDL: - value->rValue = model->B4SOIwcgidl; - return(OK); - case B4SOI_MOD_WEGIDL: - value->rValue = model->B4SOIwegidl; - return(OK); - case B4SOI_MOD_WRGIDL: - value->rValue = model->B4SOIwrgidl; - return(OK); - case B4SOI_MOD_WKGIDL: - value->rValue = model->B4SOIwkgidl; - return(OK); - case B4SOI_MOD_WFGIDL: - value->rValue = model->B4SOIwfgidl; - return(OK); - - case B4SOI_MOD_WAGISL: - value->rValue = model->B4SOIwagisl; - return(OK); - - case B4SOI_MOD_WBGISL: - value->rValue = model->B4SOIwbgisl; - return(OK); - - case B4SOI_MOD_WCGISL: - value->rValue = model->B4SOIwcgisl; - return(OK); - - case B4SOI_MOD_WEGISL: - value->rValue = model->B4SOIwegisl; - return(OK); - - case B4SOI_MOD_WRGISL: - value->rValue = model->B4SOIwrgisl; - return(OK); - - case B4SOI_MOD_WKGISL: - value->rValue = model->B4SOIwkgisl; - return(OK); - - case B4SOI_MOD_WFGISL: - value->rValue = model->B4SOIwfgisl; - return(OK); - - - case B4SOI_MOD_WNTUNS: /* v4.0 */ - value->rValue = model->B4SOIwntun; - return(OK); - case B4SOI_MOD_WNTUND: /* v4.0 */ - value->rValue = model->B4SOIwntund; - return(OK); - case B4SOI_MOD_WNDIODES: /* v4.0 */ - value->rValue = model->B4SOIwndiode; - return(OK); - case B4SOI_MOD_WNDIODED: /* v4.0 */ - value->rValue = model->B4SOIwndioded; - return(OK); - case B4SOI_MOD_WNRECF0S: /* v4.0 */ - value->rValue = model->B4SOIwnrecf0; - return(OK); - case B4SOI_MOD_WNRECF0D: /* v4.0 */ - value->rValue = model->B4SOIwnrecf0d; - return(OK); - case B4SOI_MOD_WNRECR0S: /* v4.0 */ - value->rValue = model->B4SOIwnrecr0; - return(OK); - case B4SOI_MOD_WNRECR0D: /* v4.0 */ - value->rValue = model->B4SOIwnrecr0d; - return(OK); - case B4SOI_MOD_WISBJT: - value->rValue = model->B4SOIwisbjt; - return(OK); - case B4SOI_MOD_WIDBJT: /* v4.0 */ - value->rValue = model->B4SOIwidbjt; - return(OK); - case B4SOI_MOD_WISDIF: - value->rValue = model->B4SOIwisdif; - return(OK); - case B4SOI_MOD_WIDDIF: /* v4.0 */ - value->rValue = model->B4SOIwiddif; - return(OK); - case B4SOI_MOD_WISREC: - value->rValue = model->B4SOIwisrec; - return(OK); - case B4SOI_MOD_WIDREC: /* v4.0 */ - value->rValue = model->B4SOIwidrec; - return(OK); - case B4SOI_MOD_WISTUN: - value->rValue = model->B4SOIwistun; - return(OK); - case B4SOI_MOD_WIDTUN: /* v4.0 */ - value->rValue = model->B4SOIwidtun; - return(OK); - case B4SOI_MOD_WVREC0S: /* v4.0 */ - value->rValue = model->B4SOIwvrec0; - return(OK); - case B4SOI_MOD_WVREC0D: /* v4.0 */ - value->rValue = model->B4SOIwvrec0d; - return(OK); - case B4SOI_MOD_WVTUN0S: /* v4.0 */ - value->rValue = model->B4SOIwvtun0; - return(OK); - case B4SOI_MOD_WVTUN0D: /* v4.0 */ - value->rValue = model->B4SOIwvtun0d; - return(OK); - case B4SOI_MOD_WNBJT: - value->rValue = model->B4SOIwnbjt; - return(OK); - case B4SOI_MOD_WLBJT0: - value->rValue = model->B4SOIwlbjt0; - return(OK); - case B4SOI_MOD_WVABJT: - value->rValue = model->B4SOIwvabjt; - return(OK); - case B4SOI_MOD_WAELY: - value->rValue = model->B4SOIwaely; - return(OK); - case B4SOI_MOD_WAHLIS: /* v4.0 */ - value->rValue = model->B4SOIwahli; - return(OK); - case B4SOI_MOD_WAHLID: /* v4.0 */ - value->rValue = model->B4SOIwahlid; - return(OK); - /* CV Model */ - case B4SOI_MOD_WVSDFB: - value->rValue = model->B4SOIwvsdfb; - return(OK); - case B4SOI_MOD_WVSDTH: - value->rValue = model->B4SOIwvsdth; - return(OK); - case B4SOI_MOD_WDELVT: - value->rValue = model->B4SOIwdelvt; - return(OK); - case B4SOI_MOD_WACDE: - value->rValue = model->B4SOIwacde; - return(OK); - case B4SOI_MOD_WMOIN: - value->rValue = model->B4SOIwmoin; - return(OK); - case B4SOI_MOD_WNOFF: - value->rValue = model->B4SOIwnoff; - return(OK); /* v3.2 */ - - /* Cross-term Dependence */ -/* v3.1 */ - case B4SOI_MOD_PXJ: - value->rValue = model->B4SOIpxj; - return(OK); - case B4SOI_MOD_PALPHAGB1: - value->rValue = model->B4SOIpalphaGB1; - return(OK); - case B4SOI_MOD_PALPHAGB2: - value->rValue = model->B4SOIpalphaGB2; - return(OK); - case B4SOI_MOD_PBETAGB1: - value->rValue = model->B4SOIpbetaGB1; - return(OK); - case B4SOI_MOD_PBETAGB2: - value->rValue = model->B4SOIpbetaGB2; - return(OK); - case B4SOI_MOD_PAIGBCP2: - value->rValue = model->B4SOIpaigbcp2; - return(OK); - case B4SOI_MOD_PBIGBCP2: - value->rValue = model->B4SOIpbigbcp2; - return(OK); - case B4SOI_MOD_PCIGBCP2: - value->rValue = model->B4SOIpcigbcp2; - return(OK); - case B4SOI_MOD_PNDIF: - value->rValue = model->B4SOIpndif; - return(OK); - case B4SOI_MOD_PNTRECF: - value->rValue = model->B4SOIpntrecf; - return(OK); - case B4SOI_MOD_PNTRECR: - value->rValue = model->B4SOIpntrecr; - return(OK); - case B4SOI_MOD_PXBJT: - value->rValue = model->B4SOIpxbjt; - return(OK); - case B4SOI_MOD_PXDIFS: - value->rValue = model->B4SOIpxdif; - return(OK); - case B4SOI_MOD_PXRECS: - value->rValue = model->B4SOIpxrec; - return(OK); - case B4SOI_MOD_PXTUNS: - value->rValue = model->B4SOIpxtun; - return(OK); - case B4SOI_MOD_PXDIFD: - value->rValue = model->B4SOIpxdifd; - return(OK); - case B4SOI_MOD_PXRECD: - value->rValue = model->B4SOIpxrecd; - return(OK); - case B4SOI_MOD_PXTUND: - value->rValue = model->B4SOIpxtund; - return(OK); - case B4SOI_MOD_PCGDL: - value->rValue = model->B4SOIpcgdl; - return(OK); - case B4SOI_MOD_PCGSL: - value->rValue = model->B4SOIpcgsl; - return(OK); - case B4SOI_MOD_PCKAPPA: - value->rValue = model->B4SOIpckappa; - return(OK); - case B4SOI_MOD_PUTE: - value->rValue = model->B4SOIpute; - return(OK); - case B4SOI_MOD_PKT1: - value->rValue = model->B4SOIpkt1; - return(OK); - case B4SOI_MOD_PKT2: - value->rValue = model->B4SOIpkt2; - return(OK); - case B4SOI_MOD_PKT1L: - value->rValue = model->B4SOIpkt1l; - return(OK); - case B4SOI_MOD_PUA1: - value->rValue = model->B4SOIpua1; - return(OK); - case B4SOI_MOD_PUB1: - value->rValue = model->B4SOIpub1; - return(OK); - case B4SOI_MOD_PUC1: - value->rValue = model->B4SOIpuc1; - return(OK); - case B4SOI_MOD_PAT: - value->rValue = model->B4SOIpat; - return(OK); - case B4SOI_MOD_PPRT: - value->rValue = model->B4SOIpprt; - return(OK); - - -/* v3.0 */ - case B4SOI_MOD_PAIGC: - value->rValue = model->B4SOIpaigc; - return(OK); - case B4SOI_MOD_PBIGC: - value->rValue = model->B4SOIpbigc; - return(OK); - case B4SOI_MOD_PCIGC: - value->rValue = model->B4SOIpcigc; - return(OK); - case B4SOI_MOD_PAIGSD: - value->rValue = model->B4SOIpaigsd; - return(OK); - case B4SOI_MOD_PBIGSD: - value->rValue = model->B4SOIpbigsd; - return(OK); - case B4SOI_MOD_PCIGSD: - value->rValue = model->B4SOIpcigsd; - return(OK); - case B4SOI_MOD_PNIGC: - value->rValue = model->B4SOIpnigc; - return(OK); - case B4SOI_MOD_PPIGCD: - value->rValue = model->B4SOIppigcd; - return(OK); - case B4SOI_MOD_PPOXEDGE: - value->rValue = model->B4SOIppoxedge; - return(OK); - - case B4SOI_MOD_PNPEAK: - value->rValue = model->B4SOIpnpeak; - return(OK); - case B4SOI_MOD_PNSUB: - value->rValue = model->B4SOIpnsub; - return(OK); - case B4SOI_MOD_PNGATE: - value->rValue = model->B4SOIpngate; - return(OK); - case B4SOI_MOD_PNSD: - value->rValue = model->B4SOIpnsd; - return(OK); - case B4SOI_MOD_PVTH0: - value->rValue = model->B4SOIpvth0; - return(OK); - case B4SOI_MOD_PVFB: - value->rValue = model->B4SOIpvfb; - return(OK); /* v4.1 */ - case B4SOI_MOD_PK1: - value->rValue = model->B4SOIpk1; - return(OK); - case B4SOI_MOD_PK1W1: - value->rValue = model->B4SOIpk1w1; - return(OK); - case B4SOI_MOD_PK1W2: - value->rValue = model->B4SOIpk1w2; - return(OK); - case B4SOI_MOD_PK2: - value->rValue = model->B4SOIpk2; - return(OK); - case B4SOI_MOD_PK3: - value->rValue = model->B4SOIpk3; - return(OK); - case B4SOI_MOD_PK3B: - value->rValue = model->B4SOIpk3b; - return(OK); - case B4SOI_MOD_PKB1: - value->rValue = model->B4SOIpkb1; - return(OK); - case B4SOI_MOD_PW0: - value->rValue = model->B4SOIpw0; - return(OK); - case B4SOI_MOD_PLPE0: - value->rValue = model->B4SOIplpe0; - return(OK); - case B4SOI_MOD_PLPEB: /* v4.0 for Vth */ - value->rValue = model->B4SOIplpeb; - return(OK); - case B4SOI_MOD_PDVT0 : - value->rValue = model->B4SOIpdvt0; - return(OK); - case B4SOI_MOD_PDVT1 : - value->rValue = model->B4SOIpdvt1; - return(OK); - case B4SOI_MOD_PDVT2 : - value->rValue = model->B4SOIpdvt2; - return(OK); - case B4SOI_MOD_PDVT0W : - value->rValue = model->B4SOIpdvt0w; - return(OK); - case B4SOI_MOD_PDVT1W : - value->rValue = model->B4SOIpdvt1w; - return(OK); - case B4SOI_MOD_PDVT2W : - value->rValue = model->B4SOIpdvt2w; - return(OK); - case B4SOI_MOD_PU0: - value->rValue = model->B4SOIpu0; - return(OK); - case B4SOI_MOD_PUA: - value->rValue = model->B4SOIpua; - return(OK); - case B4SOI_MOD_PUB: - value->rValue = model->B4SOIpub; - return(OK); - case B4SOI_MOD_PUC: - value->rValue = model->B4SOIpuc; - return(OK); - case B4SOI_MOD_PVSAT: - value->rValue = model->B4SOIpvsat; - return(OK); - case B4SOI_MOD_PA0: - value->rValue = model->B4SOIpa0; - return(OK); - case B4SOI_MOD_PAGS: - value->rValue = model->B4SOIpags; - return(OK); - case B4SOI_MOD_PB0: - value->rValue = model->B4SOIpb0; - return(OK); - case B4SOI_MOD_PB1: - value->rValue = model->B4SOIpb1; - return(OK); - case B4SOI_MOD_PKETA: - value->rValue = model->B4SOIpketa; - return(OK); - case B4SOI_MOD_PKETAS: - value->rValue = model->B4SOIpketas; - return(OK); - case B4SOI_MOD_PA1: - value->rValue = model->B4SOIpa1; - return(OK); - case B4SOI_MOD_PA2: - value->rValue = model->B4SOIpa2; - return(OK); - case B4SOI_MOD_PRDSW: - value->rValue = model->B4SOIprdsw; - return(OK); - case B4SOI_MOD_PRDW: - value->rValue = model->B4SOIprdw; - return(OK); - case B4SOI_MOD_PRSW: - value->rValue = model->B4SOIprsw; - return(OK); - case B4SOI_MOD_PPRWB: - value->rValue = model->B4SOIpprwb; - return(OK); - case B4SOI_MOD_PPRWG: - value->rValue = model->B4SOIpprwg; - return(OK); - case B4SOI_MOD_PWR: - value->rValue = model->B4SOIpwr; - return(OK); - case B4SOI_MOD_PNFACTOR : - value->rValue = model->B4SOIpnfactor; - return(OK); - case B4SOI_MOD_PDWG: - value->rValue = model->B4SOIpdwg; - return(OK); - case B4SOI_MOD_PDWB: - value->rValue = model->B4SOIpdwb; - return(OK); - case B4SOI_MOD_PVOFF: - value->rValue = model->B4SOIpvoff; - return(OK); - case B4SOI_MOD_PETA0: - value->rValue = model->B4SOIpeta0; - return(OK); - case B4SOI_MOD_PETAB: - value->rValue = model->B4SOIpetab; - return(OK); - case B4SOI_MOD_PDSUB : - value->rValue = model->B4SOIpdsub; - return(OK); - case B4SOI_MOD_PCIT : - value->rValue = model->B4SOIpcit; - return(OK); - case B4SOI_MOD_PCDSC : - value->rValue = model->B4SOIpcdsc; - return(OK); - case B4SOI_MOD_PCDSCB : - value->rValue = model->B4SOIpcdscb; - return(OK); - case B4SOI_MOD_PCDSCD : - value->rValue = model->B4SOIpcdscd; - return(OK); - case B4SOI_MOD_PPCLM: - value->rValue = model->B4SOIppclm; - return(OK); - case B4SOI_MOD_PPDIBL1: - value->rValue = model->B4SOIppdibl1; - return(OK); - case B4SOI_MOD_PPDIBL2: - value->rValue = model->B4SOIppdibl2; - return(OK); - case B4SOI_MOD_PPDIBLB: - value->rValue = model->B4SOIppdiblb; - return(OK); - case B4SOI_MOD_PDROUT : - value->rValue = model->B4SOIpdrout; - return(OK); - case B4SOI_MOD_PPVAG: - value->rValue = model->B4SOIppvag; - return(OK); - case B4SOI_MOD_PDELTA: - value->rValue = model->B4SOIpdelta; - return(OK); - case B4SOI_MOD_PALPHA0: - value->rValue = model->B4SOIpalpha0; - return(OK); - case B4SOI_MOD_PFBJTII: - value->rValue = model->B4SOIpfbjtii; - return(OK); - /*4.1 Iii model*/ - case B4SOI_MOD_PEBJTII: - value->rValue = model->B4SOIpebjtii; - return(OK); - case B4SOI_MOD_PCBJTII: - value->rValue = model->B4SOIpcbjtii; - return(OK); - case B4SOI_MOD_PVBCI: - value->rValue = model->B4SOIpvbci; - return(OK); - case B4SOI_MOD_PABJTII: - value->rValue = model->B4SOIpabjtii; - return(OK); - case B4SOI_MOD_PMBJTII: - value->rValue = model->B4SOIpmbjtii; - return(OK); - - case B4SOI_MOD_PBETA0: - value->rValue = model->B4SOIpbeta0; - return(OK); - case B4SOI_MOD_PBETA1: - value->rValue = model->B4SOIpbeta1; - return(OK); - case B4SOI_MOD_PBETA2: - value->rValue = model->B4SOIpbeta2; - return(OK); - case B4SOI_MOD_PVDSATII0: - value->rValue = model->B4SOIpvdsatii0; - return(OK); - case B4SOI_MOD_PLII: - value->rValue = model->B4SOIplii; - return(OK); - case B4SOI_MOD_PESATII: - value->rValue = model->B4SOIpesatii; - return(OK); - case B4SOI_MOD_PSII0: - value->rValue = model->B4SOIpsii0; - return(OK); - case B4SOI_MOD_PSII1: - value->rValue = model->B4SOIpsii1; - return(OK); - case B4SOI_MOD_PSII2: - value->rValue = model->B4SOIpsii2; - return(OK); - case B4SOI_MOD_PSIID: - value->rValue = model->B4SOIpsiid; - return(OK); - case B4SOI_MOD_PAGIDL: - value->rValue = model->B4SOIpagidl; - return(OK); - case B4SOI_MOD_PBGIDL: - value->rValue = model->B4SOIpbgidl; - return(OK); - case B4SOI_MOD_PCGIDL: - value->rValue = model->B4SOIpcgidl; - return(OK); - case B4SOI_MOD_PEGIDL: - value->rValue = model->B4SOIpegidl; - return(OK); - case B4SOI_MOD_PRGIDL: - value->rValue = model->B4SOIprgidl; - return(OK); - case B4SOI_MOD_PKGIDL: - value->rValue = model->B4SOIpkgidl; - return(OK); - case B4SOI_MOD_PFGIDL: - value->rValue = model->B4SOIpfgidl; - return(OK); - - case B4SOI_MOD_PAGISL: - value->rValue = model->B4SOIpagisl; - return(OK); - case B4SOI_MOD_PBGISL: - value->rValue = model->B4SOIpbgisl; - return(OK); - case B4SOI_MOD_PCGISL: - value->rValue = model->B4SOIpcgisl; - return(OK); - case B4SOI_MOD_PEGISL: - value->rValue = model->B4SOIpegisl; - return(OK); - case B4SOI_MOD_PRGISL: - value->rValue = model->B4SOIprgisl; - return(OK); - case B4SOI_MOD_PKGISL: - value->rValue = model->B4SOIpkgisl; - return(OK); - case B4SOI_MOD_PFGISL: - value->rValue = model->B4SOIpfgisl; - return(OK); - - case B4SOI_MOD_PNTUNS: /* v4.0 */ - value->rValue = model->B4SOIpntun; - return(OK); - case B4SOI_MOD_PNTUND: /* v4.0 */ - value->rValue = model->B4SOIpntund; - return(OK); - case B4SOI_MOD_PNDIODES: /* v4.0 */ - value->rValue = model->B4SOIpndiode; - return(OK); - case B4SOI_MOD_PNDIODED: /* v4.0 */ - value->rValue = model->B4SOIpndioded; - return(OK); - case B4SOI_MOD_PNRECF0S: /* v4.0 */ - value->rValue = model->B4SOIpnrecf0; - return(OK); - case B4SOI_MOD_PNRECF0D: /* v4.0 */ - value->rValue = model->B4SOIpnrecf0d; - return(OK); - case B4SOI_MOD_PNRECR0S: /* v4.0 */ - value->rValue = model->B4SOIpnrecr0; - return(OK); - case B4SOI_MOD_PNRECR0D: /* v4.0 */ - value->rValue = model->B4SOIpnrecr0d; - return(OK); - case B4SOI_MOD_PISBJT: - value->rValue = model->B4SOIpisbjt; - return(OK); - case B4SOI_MOD_PIDBJT: /* v4.0 */ - value->rValue = model->B4SOIpidbjt; - return(OK); - case B4SOI_MOD_PISDIF: - value->rValue = model->B4SOIpisdif; - return(OK); - case B4SOI_MOD_PIDDIF: /* v4.0 */ - value->rValue = model->B4SOIpiddif; - return(OK); - case B4SOI_MOD_PISREC: - value->rValue = model->B4SOIpisrec; - return(OK); - case B4SOI_MOD_PIDREC: /* v4.0 */ - value->rValue = model->B4SOIpidrec; - return(OK); - case B4SOI_MOD_PISTUN: - value->rValue = model->B4SOIpistun; - return(OK); - case B4SOI_MOD_PIDTUN: /* v4.0 */ - value->rValue = model->B4SOIpidtun; - return(OK); - case B4SOI_MOD_PVREC0S: /* v4.0 */ - value->rValue = model->B4SOIpvrec0; - return(OK); - case B4SOI_MOD_PVREC0D: /* v4.0 */ - value->rValue = model->B4SOIpvrec0d; - return(OK); - case B4SOI_MOD_PVTUN0S: /* v4.0 */ - value->rValue = model->B4SOIpvtun0; - return(OK); - case B4SOI_MOD_PVTUN0D: /* v4.0 */ - value->rValue = model->B4SOIpvtun0d; - return(OK); - case B4SOI_MOD_PNBJT: - value->rValue = model->B4SOIpnbjt; - return(OK); - case B4SOI_MOD_PLBJT0: - value->rValue = model->B4SOIplbjt0; - return(OK); - case B4SOI_MOD_PVABJT: - value->rValue = model->B4SOIpvabjt; - return(OK); - case B4SOI_MOD_PAELY: - value->rValue = model->B4SOIpaely; - return(OK); - case B4SOI_MOD_PAHLIS: /* v4.0 */ - value->rValue = model->B4SOIpahli; - return(OK); - case B4SOI_MOD_PAHLID: /* v4.0 */ - value->rValue = model->B4SOIpahlid; - return(OK); - /* CV Model */ - case B4SOI_MOD_PVSDFB: - value->rValue = model->B4SOIpvsdfb; - return(OK); - case B4SOI_MOD_PVSDTH: - value->rValue = model->B4SOIpvsdth; - return(OK); - case B4SOI_MOD_PDELVT: - value->rValue = model->B4SOIpdelvt; - return(OK); - case B4SOI_MOD_PACDE: - value->rValue = model->B4SOIpacde; - return(OK); - case B4SOI_MOD_PMOIN: - value->rValue = model->B4SOIpmoin; - return(OK); - case B4SOI_MOD_PNOFF: - value->rValue = model->B4SOIpnoff; - return(OK); /* v3.2 */ -/* Added for binning - END */ - - case B4SOI_MOD_VGS_MAX: - value->rValue = model->B4SOIvgsMax; - return(OK); - case B4SOI_MOD_VGD_MAX: - value->rValue = model->B4SOIvgdMax; - return(OK); - case B4SOI_MOD_VGB_MAX: - value->rValue = model->B4SOIvgbMax; - return(OK); - case B4SOI_MOD_VDS_MAX: - value->rValue = model->B4SOIvdsMax; - return(OK); - case B4SOI_MOD_VBS_MAX: - value->rValue = model->B4SOIvbsMax; - return(OK); - case B4SOI_MOD_VBD_MAX: - value->rValue = model->B4SOIvbdMax; - return(OK); - case B4SOI_MOD_VGSR_MAX: - value->rValue = model->B4SOIvgsrMax; - return(OK); - case B4SOI_MOD_VGDR_MAX: - value->rValue = model->B4SOIvgdrMax; - return(OK); - case B4SOI_MOD_VGBR_MAX: - value->rValue = model->B4SOIvgbrMax; - return(OK); - case B4SOI_MOD_VBSR_MAX: - value->rValue = model->B4SOIvbsrMax; - return(OK); - case B4SOI_MOD_VBDR_MAX: - value->rValue = model->B4SOIvbdrMax; - return(OK); - - default: - return(E_BADPARM); - } - /* NOTREACHED */ -} - - - diff --git a/src/spicelib/devices/bsimsoi/b4soimdel.c b/src/spicelib/devices/bsimsoi/b4soimdel.c deleted file mode 100644 index b141382e4..000000000 --- a/src/spicelib/devices/bsimsoi/b4soimdel.c +++ /dev/null @@ -1,34 +0,0 @@ -/*** B4SOI 12/16/2010 Released by Tanvir Morshed ***/ - - -/********** - * Copyright 2010 Regents of the University of California. All rights reserved. - * Authors: 1998 Samuel Fung, Dennis Sinitsky and Stephen Tang - * Authors: 1999-2004 Pin Su, Hui Wan, Wei Jin, b3soimdel.c - * Authors: 2005- Hui Wan, Xuemei Xi, Ali Niknejad, Chenming Hu. - * Authors: 2009- Wenwei Yang, Chung-Hsun Lin, Ali Niknejad, Chenming Hu. - * File: b4soimdel.c - * Modified by Hui Wan, Xuemei Xi 11/30/2005 - * Modified by Wenwei Yang, Chung-Hsun Lin, Darsen Lu 03/06/2009 - * Modified by Tanvir Morshed 09/22/2009 - * Modified by Tanvir Morshed 12/31/2009 - **********/ - -#include "ngspice/ngspice.h" -#include "b4soidef.h" -#include "ngspice/sperror.h" -#include "ngspice/suffix.h" - - -int -B4SOImDelete(GENmodel *gen_model) -{ - NG_IGNORE(gen_model); - -#ifdef USE_OMP - B4SOImodel *model = (B4SOImodel *) gen_model; - FREE(model->B4SOIInstanceArray); -#endif - - return OK; -} diff --git a/src/spicelib/devices/bsimsoi/b4soimpar.c b/src/spicelib/devices/bsimsoi/b4soimpar.c deleted file mode 100644 index a3adb8309..000000000 --- a/src/spicelib/devices/bsimsoi/b4soimpar.c +++ /dev/null @@ -1,3825 +0,0 @@ -/*** B4SOI 12/16/2010 Released by Tanvir Morshed ***/ - - -/********** - * Copyright 2010 Regents of the University of California. All rights reserved. - * Authors: 1998 Samuel Fung, Dennis Sinitsky and Stephen Tang - * Authors: 1999-2004 Pin Su, Hui Wan, Wei Jin, b3soimpar.c - * Authors: 2005- Hui Wan, Xuemei Xi, Ali Niknejad, Chenming Hu. - * Authors: 2009- Wenwei Yang, Chung-Hsun Lin, Ali Niknejad, Chenming Hu. - * Authors: 2010- Tanvir Morshed, Ali Niknejad, Chenming Hu. - * File: b4soimpar.c - * Modified by Hui Wan, Xuemei Xi 11/30/2005 - * Modified by Wenwei Yang, Chung-Hsun Lin, Darsen Lu 03/06/2009 - * Modified by Tanvir Morshed 09/22/2009 - * Modified by Tanvir Morshed 12/31/2009 - * Modified by Tanvir Morshed 12/16/2010 - **********/ - -#include "ngspice/ngspice.h" - -#include "b4soidef.h" -#include "ngspice/ifsim.h" -#include "ngspice/sperror.h" -#include "ngspice/suffix.h" - - -int -B4SOImParam( -int param, -IFvalue *value, -GENmodel *inMod) -{ - B4SOImodel *mod = (B4SOImodel*)inMod; - switch(param) - { - case B4SOI_MOD_MOBMOD : - mod->B4SOImobMod = value->iValue; - mod->B4SOImobModGiven = TRUE; - break; - case B4SOI_MOD_BINUNIT : - mod->B4SOIbinUnit = value->iValue; - mod->B4SOIbinUnitGiven = TRUE; - break; - case B4SOI_MOD_PARAMCHK : - mod->B4SOIparamChk = value->iValue; - mod->B4SOIparamChkGiven = TRUE; - break; - case B4SOI_MOD_CAPMOD : - mod->B4SOIcapMod = value->iValue; - mod->B4SOIcapModGiven = TRUE; - break; - case B4SOI_MOD_SHMOD : - mod->B4SOIshMod = value->iValue; - mod->B4SOIshModGiven = TRUE; - break; - -/* case B4SOI_MOD_NOIMOD : - mod->B4SOInoiMod = value->iValue; - mod->B4SOInoiModGiven = TRUE; - break; v3.2 */ - - case B4SOI_MOD_VERSION : - mod->B4SOIversion = value->rValue; - mod->B4SOIversionGiven = TRUE; - break; - case B4SOI_MOD_MTRLMOD : - mod->B4SOImtrlMod = value->iValue; - mod->B4SOImtrlModGiven = TRUE; - break; - case B4SOI_MOD_VGSTCVMOD : - mod->B4SOIvgstcvMod = value->iValue; - mod->B4SOIvgstcvModGiven = TRUE; - break; - case B4SOI_MOD_GIDLMOD : - mod->B4SOIgidlMod = value->iValue; - mod->B4SOIgidlModGiven = TRUE; - break; - case B4SOI_MOD_IIIMOD : - mod->B4SOIiiiMod = value->iValue; - mod->B4SOIiiiModGiven = TRUE; - break; - case B4SOI_MOD_TOX : - mod->B4SOItox = value->rValue; - mod->B4SOItoxGiven = TRUE; - break; - case B4SOI_MOD_TOXP : - mod->B4SOItoxp = value->rValue; - mod->B4SOItoxpGiven = TRUE; - break; - case B4SOI_MOD_LEFFEOT : - mod->B4SOIleffeot = value->rValue; - mod->B4SOIleffeotGiven = TRUE; - break; - case B4SOI_MOD_WEFFEOT : - mod->B4SOIweffeot = value->rValue; - mod->B4SOIweffeotGiven = TRUE; - break; - case B4SOI_MOD_VDDEOT : - mod->B4SOIvddeot = value->rValue; - mod->B4SOIvddeotGiven = TRUE; - break; - case B4SOI_MOD_TEMPEOT : - mod->B4SOItempeot = value->rValue; - mod->B4SOItempeotGiven = TRUE; - break; - case B4SOI_MOD_ADOS : - mod->B4SOIados = value->rValue; - mod->B4SOIadosGiven = TRUE; - break; - case B4SOI_MOD_BDOS : - mod->B4SOIbdos = value->rValue; - mod->B4SOIbdosGiven = TRUE; - break; - case B4SOI_MOD_EPSRGATE: - mod->B4SOIepsrgate = value->rValue; - mod->B4SOIepsrgateGiven = TRUE; - break; - case B4SOI_MOD_PHIG: - mod->B4SOIphig = value->rValue; - mod->B4SOIphigGiven = TRUE; - break; - case B4SOI_MOD_EASUB: - mod->B4SOIeasub = value->rValue; - mod->B4SOIeasubGiven = TRUE; - break; - - case B4SOI_MOD_TOXM : - mod->B4SOItoxm = value->rValue; - mod->B4SOItoxmGiven = TRUE; - break; /* v3.2 */ - /*4.1 */ - case B4SOI_MOD_EOT : - mod->B4SOIeot = value->rValue; - mod->B4SOIeotGiven = TRUE; - break; - case B4SOI_MOD_EPSROX : - mod->B4SOIepsrox = value->rValue; - mod->B4SOIepsroxGiven = TRUE; - break; - case B4SOI_MOD_EPSRSUB: - mod->B4SOIepsrsub = value->rValue; - mod->B4SOIepsrsubGiven = TRUE; - break; - case B4SOI_MOD_NI0SUB: - mod->B4SOIni0sub = value->rValue; - mod->B4SOIni0subGiven = TRUE; - break; - case B4SOI_MOD_BG0SUB: - mod->B4SOIbg0sub = value->rValue; - mod->B4SOIbg0subGiven = TRUE; - break; - case B4SOI_MOD_TBGASUB: - mod->B4SOItbgasub = value->rValue; - mod->B4SOItbgasubGiven = TRUE; - break; - case B4SOI_MOD_TBGBSUB: - mod->B4SOItbgbsub = value->rValue; - mod->B4SOItbgbsubGiven = TRUE; - break; -/* v2.2.3 */ - case B4SOI_MOD_DTOXCV : - mod->B4SOIdtoxcv = value->rValue; - mod->B4SOIdtoxcvGiven = TRUE; - break; - - case B4SOI_MOD_CDSC : - mod->B4SOIcdsc = value->rValue; - mod->B4SOIcdscGiven = TRUE; - break; - case B4SOI_MOD_CDSCB : - mod->B4SOIcdscb = value->rValue; - mod->B4SOIcdscbGiven = TRUE; - break; - - case B4SOI_MOD_CDSCD : - mod->B4SOIcdscd = value->rValue; - mod->B4SOIcdscdGiven = TRUE; - break; - - case B4SOI_MOD_CIT : - mod->B4SOIcit = value->rValue; - mod->B4SOIcitGiven = TRUE; - break; - case B4SOI_MOD_NFACTOR : - mod->B4SOInfactor = value->rValue; - mod->B4SOInfactorGiven = TRUE; - break; - case B4SOI_MOD_VSAT: - mod->B4SOIvsat = value->rValue; - mod->B4SOIvsatGiven = TRUE; - break; - case B4SOI_MOD_A0: - mod->B4SOIa0 = value->rValue; - mod->B4SOIa0Given = TRUE; - break; - - case B4SOI_MOD_AGS: - mod->B4SOIags= value->rValue; - mod->B4SOIagsGiven = TRUE; - break; - - case B4SOI_MOD_A1: - mod->B4SOIa1 = value->rValue; - mod->B4SOIa1Given = TRUE; - break; - case B4SOI_MOD_A2: - mod->B4SOIa2 = value->rValue; - mod->B4SOIa2Given = TRUE; - break; - case B4SOI_MOD_AT: - mod->B4SOIat = value->rValue; - mod->B4SOIatGiven = TRUE; - break; - case B4SOI_MOD_KETA: - mod->B4SOIketa = value->rValue; - mod->B4SOIketaGiven = TRUE; - break; - case B4SOI_MOD_NSUB: - mod->B4SOInsub = value->rValue; - mod->B4SOInsubGiven = TRUE; - break; - case B4SOI_MOD_NPEAK: - mod->B4SOInpeak = value->rValue; - mod->B4SOInpeakGiven = TRUE; - /* Bug # 22 Jul09 Proper limiting conditions are specified in the B4SOIcheck.c file*/ - /* if (mod->B4SOInpeak > 1.0e20) - mod->B4SOInpeak *= 1.0e-6; */ - break; - case B4SOI_MOD_NSD: - mod->B4SOInsd = value->rValue; - mod->B4SOInsdGiven = TRUE; - /* if (mod->B4SOInsd > 1.0e23) - mod->B4SOInsd *= 1.0e-6; */ /* Bug # 22 Jul09 Proper limiting conditions are specified in the B4SOIcheck.c file*/ - break; - case B4SOI_MOD_NGATE: - mod->B4SOIngate = value->rValue; - mod->B4SOIngateGiven = TRUE; - /* if (mod->B4SOIngate > 1.0e23) - mod->B4SOIngate *= 1.0e-6; */ /* Bug # 22 Jul09 Proper limiting conditions are specified in the B4SOIcheck.c file*/ - break; - case B4SOI_MOD_GAMMA1: - mod->B4SOIgamma1 = value->rValue; - mod->B4SOIgamma1Given = TRUE; - break; - case B4SOI_MOD_GAMMA2: - mod->B4SOIgamma2 = value->rValue; - mod->B4SOIgamma2Given = TRUE; - break; - case B4SOI_MOD_VBX: - mod->B4SOIvbx = value->rValue; - mod->B4SOIvbxGiven = TRUE; - break; - case B4SOI_MOD_VBM: - mod->B4SOIvbm = value->rValue; - mod->B4SOIvbmGiven = TRUE; - break; - case B4SOI_MOD_XT: - mod->B4SOIxt = value->rValue; - mod->B4SOIxtGiven = TRUE; - break; - case B4SOI_MOD_K1: - mod->B4SOIk1 = value->rValue; - mod->B4SOIk1Given = TRUE; - break; - case B4SOI_MOD_KT1: - mod->B4SOIkt1 = value->rValue; - mod->B4SOIkt1Given = TRUE; - break; - case B4SOI_MOD_KT1L: - mod->B4SOIkt1l = value->rValue; - mod->B4SOIkt1lGiven = TRUE; - break; - case B4SOI_MOD_KT2: - mod->B4SOIkt2 = value->rValue; - mod->B4SOIkt2Given = TRUE; - break; - case B4SOI_MOD_K2: - mod->B4SOIk2 = value->rValue; - mod->B4SOIk2Given = TRUE; - break; - case B4SOI_MOD_K3: - mod->B4SOIk3 = value->rValue; - mod->B4SOIk3Given = TRUE; - break; - case B4SOI_MOD_K3B: - mod->B4SOIk3b = value->rValue; - mod->B4SOIk3bGiven = TRUE; - break; - case B4SOI_MOD_LPE0: - mod->B4SOIlpe0 = value->rValue; - mod->B4SOIlpe0Given = TRUE; - break; - case B4SOI_MOD_LPEB: /* v4.0 for Vth */ - mod->B4SOIlpeb = value->rValue; - mod->B4SOIlpebGiven = TRUE; - break; - case B4SOI_MOD_W0: - mod->B4SOIw0 = value->rValue; - mod->B4SOIw0Given = TRUE; - break; - case B4SOI_MOD_DVT0: - mod->B4SOIdvt0 = value->rValue; - mod->B4SOIdvt0Given = TRUE; - break; - case B4SOI_MOD_DVT1: - mod->B4SOIdvt1 = value->rValue; - mod->B4SOIdvt1Given = TRUE; - break; - case B4SOI_MOD_DVT2: - mod->B4SOIdvt2 = value->rValue; - mod->B4SOIdvt2Given = TRUE; - break; - case B4SOI_MOD_DVT0W: - mod->B4SOIdvt0w = value->rValue; - mod->B4SOIdvt0wGiven = TRUE; - break; - case B4SOI_MOD_DVT1W: - mod->B4SOIdvt1w = value->rValue; - mod->B4SOIdvt1wGiven = TRUE; - break; - case B4SOI_MOD_DVT2W: - mod->B4SOIdvt2w = value->rValue; - mod->B4SOIdvt2wGiven = TRUE; - break; - case B4SOI_MOD_DROUT: - mod->B4SOIdrout = value->rValue; - mod->B4SOIdroutGiven = TRUE; - break; - case B4SOI_MOD_DSUB: - mod->B4SOIdsub = value->rValue; - mod->B4SOIdsubGiven = TRUE; - break; - case B4SOI_MOD_VTH0: - mod->B4SOIvth0 = value->rValue; - mod->B4SOIvth0Given = TRUE; - break; - case B4SOI_MOD_VFB: - mod->B4SOIvfb = value->rValue; - mod->B4SOIvfbGiven = TRUE; - break; /* v4.1 */ - case B4SOI_MOD_UA: - mod->B4SOIua = value->rValue; - mod->B4SOIuaGiven = TRUE; - break; - case B4SOI_MOD_UA1: - mod->B4SOIua1 = value->rValue; - mod->B4SOIua1Given = TRUE; - break; - case B4SOI_MOD_UB: - mod->B4SOIub = value->rValue; - mod->B4SOIubGiven = TRUE; - break; - case B4SOI_MOD_UB1: - mod->B4SOIub1 = value->rValue; - mod->B4SOIub1Given = TRUE; - break; - case B4SOI_MOD_UC: - mod->B4SOIuc = value->rValue; - mod->B4SOIucGiven = TRUE; - break; - case B4SOI_MOD_UC1: - mod->B4SOIuc1 = value->rValue; - mod->B4SOIuc1Given = TRUE; - break; - case B4SOI_MOD_U0 : - mod->B4SOIu0 = value->rValue; - mod->B4SOIu0Given = TRUE; - break; - case B4SOI_MOD_UTE : - mod->B4SOIute = value->rValue; - mod->B4SOIuteGiven = TRUE; - break; -/*4.1 mobmod=4*/ -case B4SOI_MOD_UD: - mod->B4SOIud = value->rValue; - mod->B4SOIudGiven = TRUE; - break; - case B4SOI_MOD_LUD: - mod->B4SOIlud = value->rValue; - mod->B4SOIludGiven = TRUE; - break; - case B4SOI_MOD_WUD: - mod->B4SOIwud = value->rValue; - mod->B4SOIwudGiven = TRUE; - break; - case B4SOI_MOD_PUD: - mod->B4SOIpud = value->rValue; - mod->B4SOIpudGiven = TRUE; - break; - case B4SOI_MOD_UD1: - mod->B4SOIud1 = value->rValue; - mod->B4SOIud1Given = TRUE; - break; - case B4SOI_MOD_LUD1: - mod->B4SOIlud1 = value->rValue; - mod->B4SOIlud1Given = TRUE; - break; - case B4SOI_MOD_WUD1: - mod->B4SOIwud1 = value->rValue; - mod->B4SOIwud1Given = TRUE; - break; - case B4SOI_MOD_PUD1: - mod->B4SOIpud1 = value->rValue; - mod->B4SOIpud1Given = TRUE; - break; - case B4SOI_MOD_EU: - mod->B4SOIeu = value->rValue; - mod->B4SOIeuGiven = TRUE; - break; - case B4SOI_MOD_LEU: - mod->B4SOIleu = value->rValue; - mod->B4SOIleuGiven = TRUE; - break; - case B4SOI_MOD_WEU: - mod->B4SOIweu = value->rValue; - mod->B4SOIweuGiven = TRUE; - break; - case B4SOI_MOD_PEU: - mod->B4SOIpeu = value->rValue; - mod->B4SOIpeuGiven = TRUE; - break; - case B4SOI_MOD_UCS: - mod->B4SOIucs = value->rValue; - mod->B4SOIucsGiven = TRUE; - break; - case B4SOI_MOD_LUCS: - mod->B4SOIlucs = value->rValue; - mod->B4SOIlucsGiven = TRUE; - break; - case B4SOI_MOD_WUCS: - mod->B4SOIwucs = value->rValue; - mod->B4SOIwucsGiven = TRUE; - break; - case B4SOI_MOD_PUCS: - mod->B4SOIpucs = value->rValue; - mod->B4SOIpucsGiven = TRUE; - break; /* Bug fix # 31 Jul09 */ - case B4SOI_MOD_UCSTE: - mod->B4SOIucste = value->rValue; - mod->B4SOIucsteGiven = TRUE; - break; - case B4SOI_MOD_LUCSTE: - mod->B4SOIlucste = value->rValue; - mod->B4SOIlucsteGiven = TRUE; - break; - case B4SOI_MOD_WUCSTE: - mod->B4SOIwucste = value->rValue; - mod->B4SOIwucsteGiven = TRUE; - break; - case B4SOI_MOD_PUCSTE: - mod->B4SOIpucste = value->rValue; - mod->B4SOIpucsteGiven = TRUE; - break; - case B4SOI_MOD_VOFF: - mod->B4SOIvoff = value->rValue; - mod->B4SOIvoffGiven = TRUE; - break; - case B4SOI_MOD_DELTA : - mod->B4SOIdelta = value->rValue; - mod->B4SOIdeltaGiven = TRUE; - break; - case B4SOI_MOD_RDSW: - mod->B4SOIrdsw = value->rValue; - mod->B4SOIrdswGiven = TRUE; - break; - case B4SOI_MOD_RSW: - mod->B4SOIrsw = value->rValue; - mod->B4SOIrswGiven = TRUE; - break; - case B4SOI_MOD_RDW: - mod->B4SOIrdw = value->rValue; - mod->B4SOIrdwGiven = TRUE; - break; - case B4SOI_MOD_RSWMIN: - mod->B4SOIrswmin = value->rValue; - mod->B4SOIrswminGiven = TRUE; - break; - case B4SOI_MOD_RDWMIN: - mod->B4SOIrdwmin = value->rValue; - mod->B4SOIrdwminGiven = TRUE; - break; - case B4SOI_MOD_PRWG: - mod->B4SOIprwg = value->rValue; - mod->B4SOIprwgGiven = TRUE; - break; - case B4SOI_MOD_PRWB: - mod->B4SOIprwb = value->rValue; - mod->B4SOIprwbGiven = TRUE; - break; - case B4SOI_MOD_PRT: - mod->B4SOIprt = value->rValue; - mod->B4SOIprtGiven = TRUE; - break; - case B4SOI_MOD_ETA0: - mod->B4SOIeta0 = value->rValue; - mod->B4SOIeta0Given = TRUE; - break; - case B4SOI_MOD_ETAB: - mod->B4SOIetab = value->rValue; - mod->B4SOIetabGiven = TRUE; - break; - case B4SOI_MOD_PCLM: - mod->B4SOIpclm = value->rValue; - mod->B4SOIpclmGiven = TRUE; - break; - case B4SOI_MOD_PDIBL1: - mod->B4SOIpdibl1 = value->rValue; - mod->B4SOIpdibl1Given = TRUE; - break; - case B4SOI_MOD_PDIBL2: - mod->B4SOIpdibl2 = value->rValue; - mod->B4SOIpdibl2Given = TRUE; - break; - case B4SOI_MOD_PDIBLB: - mod->B4SOIpdiblb = value->rValue; - mod->B4SOIpdiblbGiven = TRUE; - break; - case B4SOI_MOD_PVAG: - mod->B4SOIpvag = value->rValue; - mod->B4SOIpvagGiven = TRUE; - break; - case B4SOI_MOD_WR : - mod->B4SOIwr = value->rValue; - mod->B4SOIwrGiven = TRUE; - break; - case B4SOI_MOD_DWG : - mod->B4SOIdwg = value->rValue; - mod->B4SOIdwgGiven = TRUE; - break; - case B4SOI_MOD_DWB : - mod->B4SOIdwb = value->rValue; - mod->B4SOIdwbGiven = TRUE; - break; - case B4SOI_MOD_B0 : - mod->B4SOIb0 = value->rValue; - mod->B4SOIb0Given = TRUE; - break; - case B4SOI_MOD_B1 : - mod->B4SOIb1 = value->rValue; - mod->B4SOIb1Given = TRUE; - break; - case B4SOI_MOD_ALPHA0 : - mod->B4SOIalpha0 = value->rValue; - mod->B4SOIalpha0Given = TRUE; - break; - - case B4SOI_MOD_CGSL : - mod->B4SOIcgsl = value->rValue; - mod->B4SOIcgslGiven = TRUE; - break; - case B4SOI_MOD_CGDL : - mod->B4SOIcgdl = value->rValue; - mod->B4SOIcgdlGiven = TRUE; - break; - case B4SOI_MOD_CKAPPA : - mod->B4SOIckappa = value->rValue; - mod->B4SOIckappaGiven = TRUE; - break; - case B4SOI_MOD_CF : - mod->B4SOIcf = value->rValue; - mod->B4SOIcfGiven = TRUE; - break; - case B4SOI_MOD_CLC : - mod->B4SOIclc = value->rValue; - mod->B4SOIclcGiven = TRUE; - break; - case B4SOI_MOD_CLE : - mod->B4SOIcle = value->rValue; - mod->B4SOIcleGiven = TRUE; - break; - case B4SOI_MOD_DWC : - mod->B4SOIdwc = value->rValue; - mod->B4SOIdwcGiven = TRUE; - break; - case B4SOI_MOD_DLC : - mod->B4SOIdlc = value->rValue; - mod->B4SOIdlcGiven = TRUE; - break; - case B4SOI_MOD_TBOX : - mod->B4SOItbox = value->rValue; - mod->B4SOItboxGiven = TRUE; - break; - case B4SOI_MOD_TSI : - mod->B4SOItsi = value->rValue; - mod->B4SOItsiGiven = TRUE; - break; - case B4SOI_MOD_ETSI : - mod->B4SOIetsi = value->rValue; - mod->B4SOIetsiGiven = TRUE; - break; - case B4SOI_MOD_XJ : - mod->B4SOIxj = value->rValue; - mod->B4SOIxjGiven = TRUE; - break; - case B4SOI_MOD_RBODY : - mod->B4SOIrbody = value->rValue; - mod->B4SOIrbodyGiven = TRUE; - break; - case B4SOI_MOD_RBSH : - mod->B4SOIrbsh = value->rValue; - mod->B4SOIrbshGiven = TRUE; - break; - case B4SOI_MOD_RTH0 : - mod->B4SOIrth0 = value->rValue; - mod->B4SOIrth0Given = TRUE; - break; - case B4SOI_MOD_CTH0 : - mod->B4SOIcth0 = value->rValue; - mod->B4SOIcth0Given = TRUE; - break; - case B4SOI_MOD_CFRCOEFF : /* v4.4 */ - mod->B4SOIcfrcoeff = value->rValue; - mod->B4SOIcfrcoeffGiven = TRUE; - break; - case B4SOI_MOD_EGIDL : - mod->B4SOIegidl = value->rValue; - mod->B4SOIegidlGiven = TRUE; - break; - case B4SOI_MOD_AGIDL : - mod->B4SOIagidl = value->rValue; - mod->B4SOIagidlGiven = TRUE; - break; - case B4SOI_MOD_BGIDL : - mod->B4SOIbgidl = value->rValue; - mod->B4SOIbgidlGiven = TRUE; - break; - case B4SOI_MOD_CGIDL : - mod->B4SOIcgidl = value->rValue; - mod->B4SOIcgidlGiven = TRUE; - break; - case B4SOI_MOD_RGIDL : - mod->B4SOIrgidl = value->rValue; - mod->B4SOIrgidlGiven = TRUE; - break; - case B4SOI_MOD_KGIDL : - mod->B4SOIkgidl = value->rValue; - mod->B4SOIkgidlGiven = TRUE; - break; - case B4SOI_MOD_FGIDL : - mod->B4SOIfgidl = value->rValue; - mod->B4SOIfgidlGiven = TRUE; - break; - - case B4SOI_MOD_EGISL : - mod->B4SOIegisl = value->rValue; - mod->B4SOIegislGiven = TRUE; - break; - case B4SOI_MOD_AGISL : - mod->B4SOIagisl = value->rValue; - mod->B4SOIagislGiven = TRUE; - break; - case B4SOI_MOD_BGISL : - mod->B4SOIbgisl = value->rValue; - mod->B4SOIbgislGiven = TRUE; - break; - case B4SOI_MOD_CGISL : - mod->B4SOIcgisl = value->rValue; - mod->B4SOIcgislGiven = TRUE; - break; - case B4SOI_MOD_RGISL : - mod->B4SOIrgisl = value->rValue; - mod->B4SOIrgislGiven = TRUE; - break; - case B4SOI_MOD_KGISL : - mod->B4SOIkgisl = value->rValue; - mod->B4SOIkgislGiven = TRUE; - break; - case B4SOI_MOD_FGISL : - mod->B4SOIfgisl = value->rValue; - mod->B4SOIfgislGiven = TRUE; - break; - case B4SOI_MOD_FDMOD : - /* mod->B4SOIfdMod = value->rValue; v4.2 */ - mod->B4SOIfdMod = value->iValue; - mod->B4SOIfdModGiven = TRUE; - break; - case B4SOI_MOD_VSCE : - mod->B4SOIvsce = value->rValue; - mod->B4SOIvsceGiven = TRUE; - break; - case B4SOI_MOD_CDSBS : - mod->B4SOIcdsbs = value->rValue; - mod->B4SOIcdsbsGiven = TRUE; - break; - case B4SOI_MOD_MINVCV: - mod->B4SOIminvcv = value->rValue; - mod->B4SOIminvcvGiven = TRUE; - break; - case B4SOI_MOD_LMINVCV: - mod->B4SOIlminvcv = value->rValue; - mod->B4SOIlminvcvGiven = TRUE; - break; - case B4SOI_MOD_WMINVCV: - mod->B4SOIwminvcv = value->rValue; - mod->B4SOIwminvcvGiven = TRUE; - break; - case B4SOI_MOD_PMINVCV: - mod->B4SOIpminvcv = value->rValue; - mod->B4SOIpminvcvGiven = TRUE; - break; - case B4SOI_MOD_VOFFCV: - mod->B4SOIvoffcv = value->rValue; - mod->B4SOIvoffcvGiven = TRUE; - break; - case B4SOI_MOD_LVOFFCV: - mod->B4SOIlvoffcv = value->rValue; - mod->B4SOIlvoffcvGiven = TRUE; - break; - case B4SOI_MOD_WVOFFCV: - mod->B4SOIwvoffcv = value->rValue; - mod->B4SOIwvoffcvGiven = TRUE; - break; - case B4SOI_MOD_PVOFFCV: - mod->B4SOIpvoffcv = value->rValue; - mod->B4SOIpvoffcvGiven = TRUE; - break; - - case B4SOI_MOD_NDIODES : /* v4.0 */ - mod->B4SOIndiode = value->rValue; - mod->B4SOIndiodeGiven = TRUE; - break; - case B4SOI_MOD_NDIODED : /* v4.0 */ - mod->B4SOIndioded = value->rValue; - mod->B4SOIndiodedGiven = TRUE; - break; - case B4SOI_MOD_XBJT : - mod->B4SOIxbjt = value->rValue; - mod->B4SOIxbjtGiven = TRUE; - break; - - case B4SOI_MOD_XDIFS : - mod->B4SOIxdif = value->rValue; - mod->B4SOIxdifGiven = TRUE; - break; - case B4SOI_MOD_XRECS : - mod->B4SOIxrec = value->rValue; - mod->B4SOIxrecGiven = TRUE; - break; - case B4SOI_MOD_XTUNS : - mod->B4SOIxtun = value->rValue; - mod->B4SOIxtunGiven = TRUE; - break; - case B4SOI_MOD_XDIFD : - mod->B4SOIxdifd = value->rValue; - mod->B4SOIxdifdGiven = TRUE; - break; - case B4SOI_MOD_XRECD : - mod->B4SOIxrecd = value->rValue; - mod->B4SOIxrecdGiven = TRUE; - break; - case B4SOI_MOD_XTUND : - mod->B4SOIxtund = value->rValue; - mod->B4SOIxtundGiven = TRUE; - break; - case B4SOI_MOD_TT : - mod->B4SOItt = value->rValue; - mod->B4SOIttGiven = TRUE; - break; - case B4SOI_MOD_VSDTH : - mod->B4SOIvsdth = value->rValue; - mod->B4SOIvsdthGiven = TRUE; - break; - case B4SOI_MOD_VSDFB : - mod->B4SOIvsdfb = value->rValue; - mod->B4SOIvsdfbGiven = TRUE; - break; - case B4SOI_MOD_CSDMIN : - mod->B4SOIcsdmin = value->rValue; - mod->B4SOIcsdminGiven = TRUE; - break; - case B4SOI_MOD_ASD : - mod->B4SOIasd = value->rValue; - mod->B4SOIasdGiven = TRUE; - break; - - - case B4SOI_MOD_TNOM : - mod->B4SOItnom = value->rValue + 273.15; - mod->B4SOItnomGiven = TRUE; - break; - case B4SOI_MOD_CGSO : - mod->B4SOIcgso = value->rValue; - mod->B4SOIcgsoGiven = TRUE; - break; - case B4SOI_MOD_CGDO : - mod->B4SOIcgdo = value->rValue; - mod->B4SOIcgdoGiven = TRUE; - break; - case B4SOI_MOD_CGEO : - mod->B4SOIcgeo = value->rValue; - mod->B4SOIcgeoGiven = TRUE; - break; - - - case B4SOI_MOD_XPART : - mod->B4SOIxpart = value->rValue; - mod->B4SOIxpartGiven = TRUE; - break; - case B4SOI_MOD_RSH : - mod->B4SOIsheetResistance = value->rValue; - mod->B4SOIsheetResistanceGiven = TRUE; - break; - case B4SOI_MOD_PBSWGS : /* v4.0 */ - mod->B4SOIGatesidewallJctSPotential = value->rValue; - mod->B4SOIGatesidewallJctSPotentialGiven = TRUE; - break; - case B4SOI_MOD_PBSWGD : /* v4.0 */ - mod->B4SOIGatesidewallJctDPotential = value->rValue; - mod->B4SOIGatesidewallJctDPotentialGiven = TRUE; - break; - case B4SOI_MOD_MJSWGS : /* v4.0 */ - mod->B4SOIbodyJctGateSideSGradingCoeff = value->rValue; - mod->B4SOIbodyJctGateSideSGradingCoeffGiven = TRUE; - break; - case B4SOI_MOD_MJSWGD : /* v4.0 */ - mod->B4SOIbodyJctGateSideDGradingCoeff = value->rValue; - mod->B4SOIbodyJctGateSideDGradingCoeffGiven = TRUE; - break; - case B4SOI_MOD_CJSWGS : /* v4.0 */ - mod->B4SOIunitLengthGateSidewallJctCapS = value->rValue; - mod->B4SOIunitLengthGateSidewallJctCapSGiven = TRUE; - break; - case B4SOI_MOD_CJSWGD : /* v4.0 */ - mod->B4SOIunitLengthGateSidewallJctCapD = value->rValue; - mod->B4SOIunitLengthGateSidewallJctCapDGiven = TRUE; - break; - case B4SOI_MOD_CSDESW : - mod->B4SOIcsdesw = value->rValue; - mod->B4SOIcsdeswGiven = TRUE; - break; - case B4SOI_MOD_LINT : - mod->B4SOILint = value->rValue; - mod->B4SOILintGiven = TRUE; - break; - case B4SOI_MOD_LL : - mod->B4SOILl = value->rValue; - mod->B4SOILlGiven = TRUE; - break; -/* v2.2.3 */ - case B4SOI_MOD_LLC : - mod->B4SOILlc = value->rValue; - mod->B4SOILlcGiven = TRUE; - break; - - case B4SOI_MOD_LLN : - mod->B4SOILln = value->rValue; - mod->B4SOILlnGiven = TRUE; - break; - case B4SOI_MOD_LW : - mod->B4SOILw = value->rValue; - mod->B4SOILwGiven = TRUE; - break; -/* v2.2.3 */ - case B4SOI_MOD_LWC : - mod->B4SOILwc = value->rValue; - mod->B4SOILwcGiven = TRUE; - break; - - case B4SOI_MOD_LWN : - mod->B4SOILwn = value->rValue; - mod->B4SOILwnGiven = TRUE; - break; - case B4SOI_MOD_LWL : - mod->B4SOILwl = value->rValue; - mod->B4SOILwlGiven = TRUE; - break; -/* v2.2.3 */ - case B4SOI_MOD_LWLC : - mod->B4SOILwlc = value->rValue; - mod->B4SOILwlcGiven = TRUE; - break; - - case B4SOI_MOD_WINT : - mod->B4SOIWint = value->rValue; - mod->B4SOIWintGiven = TRUE; - break; - case B4SOI_MOD_WL : - mod->B4SOIWl = value->rValue; - mod->B4SOIWlGiven = TRUE; - break; -/* v2.2.3 */ - case B4SOI_MOD_WLC : - mod->B4SOIWlc = value->rValue; - mod->B4SOIWlcGiven = TRUE; - break; - - case B4SOI_MOD_WLN : - mod->B4SOIWln = value->rValue; - mod->B4SOIWlnGiven = TRUE; - break; - case B4SOI_MOD_WW : - mod->B4SOIWw = value->rValue; - mod->B4SOIWwGiven = TRUE; - break; -/* v2.2.3 */ - case B4SOI_MOD_WWC : - mod->B4SOIWwc = value->rValue; - mod->B4SOIWwcGiven = TRUE; - break; - - case B4SOI_MOD_WWN : - mod->B4SOIWwn = value->rValue; - mod->B4SOIWwnGiven = TRUE; - break; - case B4SOI_MOD_WWL : - mod->B4SOIWwl = value->rValue; - mod->B4SOIWwlGiven = TRUE; - break; -/* v2.2.3 */ - case B4SOI_MOD_WWLC : - mod->B4SOIWwlc = value->rValue; - mod->B4SOIWwlcGiven = TRUE; - break; - - case B4SOI_MOD_NOIA : - mod->B4SOIoxideTrapDensityA = value->rValue; - mod->B4SOIoxideTrapDensityAGiven = TRUE; - break; - case B4SOI_MOD_NOIB : - mod->B4SOIoxideTrapDensityB = value->rValue; - mod->B4SOIoxideTrapDensityBGiven = TRUE; - break; - case B4SOI_MOD_NOIC : - mod->B4SOIoxideTrapDensityC = value->rValue; - mod->B4SOIoxideTrapDensityCGiven = TRUE; - break; - case B4SOI_MOD_NOIF : - mod->B4SOInoif = value->rValue; - mod->B4SOInoifGiven = TRUE; - break; - case B4SOI_MOD_EM : - mod->B4SOIem = value->rValue; - mod->B4SOIemGiven = TRUE; - break; - case B4SOI_MOD_EF : - mod->B4SOIef = value->rValue; - mod->B4SOIefGiven = TRUE; - break; - case B4SOI_MOD_AF : - mod->B4SOIaf = value->rValue; - mod->B4SOIafGiven = TRUE; - break; - case B4SOI_MOD_KF : - mod->B4SOIkf = value->rValue; - mod->B4SOIkfGiven = TRUE; - break; - case B4SOI_MOD_BF : - mod->B4SOIbf = value->rValue; - mod->B4SOIbfGiven = TRUE; - break; - case B4SOI_MOD_W0FLK : - mod->B4SOIw0flk = value->rValue; - mod->B4SOIw0flkGiven = TRUE; - break; - -/* v3.0 */ - case B4SOI_MOD_SOIMOD: - mod->B4SOIsoiMod = value->iValue; - mod->B4SOIsoiModGiven = TRUE; - break; /* v3.2 bug fix */ - case B4SOI_MOD_VBS0PD: - mod->B4SOIvbs0pd = value->rValue; - mod->B4SOIvbs0pdGiven = TRUE; - break; /* v3.2 */ - case B4SOI_MOD_VBS0FD: - mod->B4SOIvbs0fd = value->rValue; - mod->B4SOIvbs0fdGiven = TRUE; - break; /* v3.2 */ - case B4SOI_MOD_VBSA: - mod->B4SOIvbsa = value->rValue; - mod->B4SOIvbsaGiven = TRUE; - break; - case B4SOI_MOD_NOFFFD : - mod->B4SOInofffd = value->rValue; - mod->B4SOInofffdGiven = TRUE; - break; - case B4SOI_MOD_VOFFFD: - mod->B4SOIvofffd = value->rValue; - mod->B4SOIvofffdGiven = TRUE; - break; - case B4SOI_MOD_K1B: - mod->B4SOIk1b = value->rValue; - mod->B4SOIk1bGiven = TRUE; - break; - case B4SOI_MOD_K2B: - mod->B4SOIk2b = value->rValue; - mod->B4SOIk2bGiven = TRUE; - break; - case B4SOI_MOD_DK2B: - mod->B4SOIdk2b = value->rValue; - mod->B4SOIdk2bGiven = TRUE; - break; - case B4SOI_MOD_DVBD0: - mod->B4SOIdvbd0 = value->rValue; - mod->B4SOIdvbd0Given = TRUE; - break; - case B4SOI_MOD_DVBD1: - mod->B4SOIdvbd1 = value->rValue; - mod->B4SOIdvbd1Given = TRUE; - break; - case B4SOI_MOD_MOINFD: - mod->B4SOImoinFD = value->rValue; - mod->B4SOImoinFDGiven = TRUE; - break; - - -/* v2.2 release */ - case B4SOI_MOD_WTH0 : - mod->B4SOIwth0 = value->rValue; - mod->B4SOIwth0Given = TRUE; - break; - case B4SOI_MOD_RHALO : - mod->B4SOIrhalo = value->rValue; - mod->B4SOIrhaloGiven = TRUE; - break; - case B4SOI_MOD_NTOX : - mod->B4SOIntox = value->rValue; - mod->B4SOIntoxGiven = TRUE; - break; - case B4SOI_MOD_TOXREF : - mod->B4SOItoxref = value->rValue; - mod->B4SOItoxrefGiven = TRUE; - break; - case B4SOI_MOD_EBG : - mod->B4SOIebg = value->rValue; - mod->B4SOIebgGiven = TRUE; - break; - case B4SOI_MOD_VEVB : - mod->B4SOIvevb = value->rValue; - mod->B4SOIvevbGiven = TRUE; - break; - case B4SOI_MOD_ALPHAGB1 : - mod->B4SOIalphaGB1 = value->rValue; - mod->B4SOIalphaGB1Given = TRUE; - break; - case B4SOI_MOD_BETAGB1 : - mod->B4SOIbetaGB1 = value->rValue; - mod->B4SOIbetaGB1Given = TRUE; - break; - case B4SOI_MOD_VGB1 : - mod->B4SOIvgb1 = value->rValue; - mod->B4SOIvgb1Given = TRUE; - break; - case B4SOI_MOD_VECB : - mod->B4SOIvecb = value->rValue; - mod->B4SOIvecbGiven = TRUE; - break; - case B4SOI_MOD_ALPHAGB2 : - mod->B4SOIalphaGB2 = value->rValue; - mod->B4SOIalphaGB2Given = TRUE; - break; - case B4SOI_MOD_BETAGB2 : - mod->B4SOIbetaGB2 = value->rValue; - mod->B4SOIbetaGB2Given = TRUE; - break; - case B4SOI_MOD_VGB2 : - mod->B4SOIvgb2 = value->rValue; - mod->B4SOIvgb2Given = TRUE; - break; - case B4SOI_MOD_AIGBCP2 : - mod->B4SOIaigbcp2 = value->rValue; - mod->B4SOIaigbcp2Given = TRUE; - break; - case B4SOI_MOD_BIGBCP2 : - mod->B4SOIbigbcp2 = value->rValue; - mod->B4SOIbigbcp2Given = TRUE; - break; - case B4SOI_MOD_CIGBCP2 : - mod->B4SOIcigbcp2 = value->rValue; - mod->B4SOIcigbcp2Given = TRUE; - break; - case B4SOI_MOD_TOXQM : - mod->B4SOItoxqm = value->rValue; - mod->B4SOItoxqmGiven = TRUE; - break; - case B4SOI_MOD_VOXH : - mod->B4SOIvoxh = value->rValue; - mod->B4SOIvoxhGiven = TRUE; - break; - case B4SOI_MOD_DELTAVOX : - mod->B4SOIdeltavox = value->rValue; - mod->B4SOIdeltavoxGiven = TRUE; - break; - -/* v3.0 */ - case B4SOI_MOD_IGBMOD : - mod->B4SOIigbMod = value->iValue; - mod->B4SOIigbModGiven = TRUE; - break; - case B4SOI_MOD_IGCMOD : - mod->B4SOIigcMod = value->iValue; - mod->B4SOIigcModGiven = TRUE; - break; - case B4SOI_MOD_AIGC : - mod->B4SOIaigc = value->rValue; - mod->B4SOIaigcGiven = TRUE; - break; - case B4SOI_MOD_BIGC : - mod->B4SOIbigc = value->rValue; - mod->B4SOIbigcGiven = TRUE; - break; - case B4SOI_MOD_CIGC : - mod->B4SOIcigc = value->rValue; - mod->B4SOIcigcGiven = TRUE; - break; - case B4SOI_MOD_AIGSD : - mod->B4SOIaigsd = value->rValue; - mod->B4SOIaigsdGiven = TRUE; - break; - case B4SOI_MOD_BIGSD : - mod->B4SOIbigsd = value->rValue; - mod->B4SOIbigsdGiven = TRUE; - break; - case B4SOI_MOD_CIGSD : - mod->B4SOIcigsd = value->rValue; - mod->B4SOIcigsdGiven = TRUE; - break; - case B4SOI_MOD_NIGC : - mod->B4SOInigc = value->rValue; - mod->B4SOInigcGiven = TRUE; - break; - case B4SOI_MOD_PIGCD : - mod->B4SOIpigcd = value->rValue; - mod->B4SOIpigcdGiven = TRUE; - break; - case B4SOI_MOD_POXEDGE : - mod->B4SOIpoxedge = value->rValue; - mod->B4SOIpoxedgeGiven = TRUE; - break; - case B4SOI_MOD_DLCIG : - mod->B4SOIdlcig = value->rValue; - mod->B4SOIdlcigGiven = TRUE; - break; - - /* v3.1 added for RF */ - case B4SOI_MOD_RGATEMOD : - mod->B4SOIrgateMod = value->iValue; - mod->B4SOIrgateModGiven = TRUE; - break; - case B4SOI_MOD_XRCRG1 : - mod->B4SOIxrcrg1 = value->rValue; - mod->B4SOIxrcrg1Given = TRUE; - break; - case B4SOI_MOD_XRCRG2 : - mod->B4SOIxrcrg2 = value->rValue; - mod->B4SOIxrcrg2Given = TRUE; - break; - case B4SOI_MOD_RSHG : - mod->B4SOIrshg = value->rValue; - mod->B4SOIrshgGiven = TRUE; - break; - case B4SOI_MOD_NGCON : - mod->B4SOIngcon = value->rValue; - mod->B4SOIngconGiven = TRUE; - break; - case B4SOI_MOD_XGW : - mod->B4SOIxgw = value->rValue; - mod->B4SOIxgwGiven = TRUE; - break; - case B4SOI_MOD_XGL : - mod->B4SOIxgl = value->rValue; - mod->B4SOIxglGiven = TRUE; - break; - /* v3.1 added RF end */ - - /* v4.0 */ - case B4SOI_MOD_RDSMOD : - mod->B4SOIrdsMod = value->iValue; - mod->B4SOIrdsModGiven = TRUE; - break; - case B4SOI_MOD_GBMIN : - mod->B4SOIgbmin = value->rValue; - mod->B4SOIgbminGiven = TRUE; - break; - case B4SOI_MOD_RBODYMOD : - mod->B4SOIrbodyMod = value->iValue; - mod->B4SOIrbodyModGiven = TRUE; - break; - case B4SOI_MOD_RBDB : - mod->B4SOIrbdb = value->rValue; - mod->B4SOIrbdbGiven = TRUE; - break; /* Bug fix # 31 Jul 09 */ - case B4SOI_MOD_RBSB : - mod->B4SOIrbsb = value->rValue; - mod->B4SOIrbsbGiven = TRUE; - break; - case B4SOI_MOD_FRBODY : - mod->B4SOIfrbody = value->rValue; - mod->B4SOIfrbodyGiven = TRUE; - break; - case B4SOI_MOD_DVTP0: - mod->B4SOIdvtp0 = value->rValue; - mod->B4SOIdvtp0Given = TRUE; - break; - case B4SOI_MOD_DVTP1: - mod->B4SOIdvtp1 = value->rValue; - mod->B4SOIdvtp1Given = TRUE; - break; - case B4SOI_MOD_DVTP2: - mod->B4SOIdvtp2 = value->rValue; - mod->B4SOIdvtp2Given = TRUE; - break; - case B4SOI_MOD_DVTP3: - mod->B4SOIdvtp3 = value->rValue; - mod->B4SOIdvtp3Given = TRUE; - break; - case B4SOI_MOD_DVTP4: - mod->B4SOIdvtp4 = value->rValue; - mod->B4SOIdvtp4Given = TRUE; - break; - case B4SOI_MOD_LDVTP0: - mod->B4SOIldvtp0 = value->rValue; - mod->B4SOIldvtp0Given = TRUE; - break; - case B4SOI_MOD_LDVTP1: - mod->B4SOIldvtp1 = value->rValue; - mod->B4SOIldvtp1Given = TRUE; - break; - case B4SOI_MOD_LDVTP2: - mod->B4SOIldvtp2 = value->rValue; - mod->B4SOIldvtp2Given = TRUE; - break; - case B4SOI_MOD_LDVTP3: - mod->B4SOIldvtp3 = value->rValue; - mod->B4SOIldvtp3Given = TRUE; - break; - case B4SOI_MOD_LDVTP4: - mod->B4SOIldvtp4 = value->rValue; - mod->B4SOIldvtp4Given = TRUE; - break; - case B4SOI_MOD_WDVTP0: - mod->B4SOIwdvtp0 = value->rValue; - mod->B4SOIwdvtp0Given = TRUE; - break; - case B4SOI_MOD_WDVTP1: - mod->B4SOIwdvtp1 = value->rValue; - mod->B4SOIwdvtp1Given = TRUE; - break; - case B4SOI_MOD_WDVTP2: - mod->B4SOIwdvtp2 = value->rValue; - mod->B4SOIwdvtp2Given = TRUE; - break; - case B4SOI_MOD_WDVTP3: - mod->B4SOIwdvtp3 = value->rValue; - mod->B4SOIwdvtp3Given = TRUE; - break; - case B4SOI_MOD_WDVTP4: - mod->B4SOIwdvtp4 = value->rValue; - mod->B4SOIwdvtp4Given = TRUE; - break; - case B4SOI_MOD_PDVTP0: - mod->B4SOIpdvtp0 = value->rValue; - mod->B4SOIpdvtp0Given = TRUE; - break; - case B4SOI_MOD_PDVTP1: - mod->B4SOIpdvtp1 = value->rValue; - mod->B4SOIpdvtp1Given = TRUE; - break; - case B4SOI_MOD_PDVTP2: - mod->B4SOIpdvtp2 = value->rValue; - mod->B4SOIpdvtp2Given = TRUE; - break; - case B4SOI_MOD_PDVTP3: - mod->B4SOIpdvtp3 = value->rValue; - mod->B4SOIpdvtp3Given = TRUE; - break; - case B4SOI_MOD_PDVTP4: - mod->B4SOIpdvtp4 = value->rValue; - mod->B4SOIpdvtp4Given = TRUE; - break; - case B4SOI_MOD_MINV: - mod->B4SOIminv = value->rValue; - mod->B4SOIminvGiven = TRUE; - break; - case B4SOI_MOD_LMINV: - mod->B4SOIlminv = value->rValue; - mod->B4SOIlminvGiven = TRUE; - break; - case B4SOI_MOD_WMINV: - mod->B4SOIwminv = value->rValue; - mod->B4SOIwminvGiven = TRUE; - break; - case B4SOI_MOD_PMINV: - mod->B4SOIpminv = value->rValue; - mod->B4SOIpminvGiven = TRUE; - break; - case B4SOI_MOD_FPROUT: - mod->B4SOIfprout = value->rValue; - mod->B4SOIfproutGiven = TRUE; - break; - case B4SOI_MOD_PDITS: - mod->B4SOIpdits = value->rValue; - mod->B4SOIpditsGiven = TRUE; - break; - case B4SOI_MOD_PDITSD: - mod->B4SOIpditsd = value->rValue; - mod->B4SOIpditsdGiven = TRUE; - break; - case B4SOI_MOD_PDITSL: - mod->B4SOIpditsl = value->rValue; - mod->B4SOIpditslGiven = TRUE; - break; - case B4SOI_MOD_LFPROUT: - mod->B4SOIlfprout = value->rValue; - mod->B4SOIlfproutGiven = TRUE; - break; - case B4SOI_MOD_LPDITS: - mod->B4SOIlpdits = value->rValue; - mod->B4SOIlpditsGiven = TRUE; - break; - case B4SOI_MOD_LPDITSD: - mod->B4SOIlpditsd = value->rValue; - mod->B4SOIlpditsdGiven = TRUE; - break; - case B4SOI_MOD_WFPROUT: - mod->B4SOIwfprout = value->rValue; - mod->B4SOIwfproutGiven = TRUE; - break; - case B4SOI_MOD_WPDITS: - mod->B4SOIwpdits = value->rValue; - mod->B4SOIwpditsGiven = TRUE; - break; - case B4SOI_MOD_WPDITSD: - mod->B4SOIwpditsd = value->rValue; - mod->B4SOIwpditsdGiven = TRUE; - break; - case B4SOI_MOD_PFPROUT: - mod->B4SOIpfprout = value->rValue; - mod->B4SOIpfproutGiven = TRUE; - break; - case B4SOI_MOD_PPDITS: - mod->B4SOIppdits = value->rValue; - mod->B4SOIppditsGiven = TRUE; - break; - case B4SOI_MOD_PPDITSD: - mod->B4SOIppditsd = value->rValue; - mod->B4SOIppditsdGiven = TRUE; - break; - - /* v4.0 */ - - /* v4.0 stress effect */ - case B4SOI_MOD_SAREF : - mod->B4SOIsaref = value->rValue; - mod->B4SOIsarefGiven = TRUE; - break; - case B4SOI_MOD_SBREF : - mod->B4SOIsbref = value->rValue; - mod->B4SOIsbrefGiven = TRUE; - break; - case B4SOI_MOD_WLOD : - mod->B4SOIwlod = value->rValue; - mod->B4SOIwlodGiven = TRUE; - break; - case B4SOI_MOD_KU0 : - mod->B4SOIku0 = value->rValue; - mod->B4SOIku0Given = TRUE; - break; - case B4SOI_MOD_KVSAT : - mod->B4SOIkvsat = value->rValue; - mod->B4SOIkvsatGiven = TRUE; - break; - case B4SOI_MOD_KVTH0 : - mod->B4SOIkvth0 = value->rValue; - mod->B4SOIkvth0Given = TRUE; - break; - case B4SOI_MOD_TKU0 : - mod->B4SOItku0 = value->rValue; - mod->B4SOItku0Given = TRUE; - break; - case B4SOI_MOD_LLODKU0 : - mod->B4SOIllodku0 = value->rValue; - mod->B4SOIllodku0Given = TRUE; - break; - case B4SOI_MOD_WLODKU0 : - mod->B4SOIwlodku0 = value->rValue; - mod->B4SOIwlodku0Given = TRUE; - break; - case B4SOI_MOD_LLODVTH : - mod->B4SOIllodvth = value->rValue; - mod->B4SOIllodvthGiven = TRUE; - break; - case B4SOI_MOD_WLODVTH : - mod->B4SOIwlodvth = value->rValue; - mod->B4SOIwlodvthGiven = TRUE; - break; - case B4SOI_MOD_LKU0 : - mod->B4SOIlku0 = value->rValue; - mod->B4SOIlku0Given = TRUE; - break; - case B4SOI_MOD_WKU0 : - mod->B4SOIwku0 = value->rValue; - mod->B4SOIwku0Given = TRUE; - break; - case B4SOI_MOD_PKU0 : - mod->B4SOIpku0 = value->rValue; - mod->B4SOIpku0Given = TRUE; - break; - case B4SOI_MOD_LKVTH0 : - mod->B4SOIlkvth0 = value->rValue; - mod->B4SOIlkvth0Given = TRUE; - break; - case B4SOI_MOD_WKVTH0 : - mod->B4SOIwkvth0 = value->rValue; - mod->B4SOIwkvth0Given = TRUE; - break; - case B4SOI_MOD_PKVTH0 : - mod->B4SOIpkvth0 = value->rValue; - mod->B4SOIpkvth0Given = TRUE; - break; - case B4SOI_MOD_STK2 : - mod->B4SOIstk2 = value->rValue; - mod->B4SOIstk2Given = TRUE; - break; - case B4SOI_MOD_LODK2 : - mod->B4SOIlodk2 = value->rValue; - mod->B4SOIlodk2Given = TRUE; - break; /* Bug fix # 31 Jul 09*/ - case B4SOI_MOD_STETA0 : - mod->B4SOIsteta0 = value->rValue; - mod->B4SOIsteta0Given = TRUE; - break; - case B4SOI_MOD_LODETA0 : - mod->B4SOIlodeta0 = value->rValue; - mod->B4SOIlodeta0Given = TRUE; - break; - - /* v4.0 stress effect end */ - - /* v3.2 */ - case B4SOI_MOD_FNOIMOD : - mod->B4SOIfnoiMod = value->iValue; - mod->B4SOIfnoiModGiven = TRUE; - break; - case B4SOI_MOD_TNOIMOD : - mod->B4SOItnoiMod = value->iValue; - mod->B4SOItnoiModGiven = TRUE; - break; - case B4SOI_MOD_TNOIA : - mod->B4SOItnoia = value->rValue; - mod->B4SOItnoiaGiven = TRUE; - break; - case B4SOI_MOD_TNOIB : - mod->B4SOItnoib = value->rValue; - mod->B4SOItnoibGiven = TRUE; - break; - case B4SOI_MOD_RNOIA : - mod->B4SOIrnoia = value->rValue; - mod->B4SOIrnoiaGiven = TRUE; - break; - case B4SOI_MOD_RNOIB : - mod->B4SOIrnoib = value->rValue; - mod->B4SOIrnoibGiven = TRUE; - break; - case B4SOI_MOD_NTNOI : - mod->B4SOIntnoi = value->rValue; - mod->B4SOIntnoiGiven = TRUE; - break; - - /* v3.2 end */ - -/* v2.0 release */ - case B4SOI_MOD_K1W1 : - mod->B4SOIk1w1 = value->rValue; - mod->B4SOIk1w1Given = TRUE; - break; - case B4SOI_MOD_K1W2 : - mod->B4SOIk1w2 = value->rValue; - mod->B4SOIk1w2Given = TRUE; - break; - case B4SOI_MOD_KETAS : - mod->B4SOIketas = value->rValue; - mod->B4SOIketasGiven = TRUE; - break; - case B4SOI_MOD_DWBC : - mod->B4SOIdwbc = value->rValue; - mod->B4SOIdwbcGiven = TRUE; - break; - case B4SOI_MOD_BETA0 : - mod->B4SOIbeta0 = value->rValue; - mod->B4SOIbeta0Given = TRUE; - break; - case B4SOI_MOD_BETA1 : - mod->B4SOIbeta1 = value->rValue; - mod->B4SOIbeta1Given = TRUE; - break; - case B4SOI_MOD_BETA2 : - mod->B4SOIbeta2 = value->rValue; - mod->B4SOIbeta2Given = TRUE; - break; - case B4SOI_MOD_VDSATII0 : - mod->B4SOIvdsatii0 = value->rValue; - mod->B4SOIvdsatii0Given = TRUE; - break; - case B4SOI_MOD_TII : - mod->B4SOItii = value->rValue; - mod->B4SOItiiGiven = TRUE; - break; - case B4SOI_MOD_TVBCI : - mod->B4SOItvbci = value->rValue; - mod->B4SOItvbciGiven = TRUE; - break; - case B4SOI_MOD_LII : - mod->B4SOIlii = value->rValue; - mod->B4SOIliiGiven = TRUE; - break; - case B4SOI_MOD_SII0 : - mod->B4SOIsii0 = value->rValue; - mod->B4SOIsii0Given = TRUE; - break; - case B4SOI_MOD_SII1 : - mod->B4SOIsii1 = value->rValue; - mod->B4SOIsii1Given = TRUE; - break; - case B4SOI_MOD_SII2 : - mod->B4SOIsii2 = value->rValue; - mod->B4SOIsii2Given = TRUE; - break; - case B4SOI_MOD_SIID : - mod->B4SOIsiid = value->rValue; - mod->B4SOIsiidGiven = TRUE; - break; - case B4SOI_MOD_FBJTII : - mod->B4SOIfbjtii = value->rValue; - mod->B4SOIfbjtiiGiven = TRUE; - break; - /*4.1 Iii model*/ - case B4SOI_MOD_EBJTII : - mod->B4SOIebjtii = value->rValue; - mod->B4SOIebjtiiGiven = TRUE; - break; - case B4SOI_MOD_CBJTII : - mod->B4SOIcbjtii = value->rValue; - mod->B4SOIcbjtiiGiven = TRUE; - break; - case B4SOI_MOD_VBCI : - mod->B4SOIvbci = value->rValue; - mod->B4SOIvbciGiven = TRUE; - break; - case B4SOI_MOD_ABJTII : - mod->B4SOIabjtii = value->rValue; - mod->B4SOIabjtiiGiven = TRUE; - break; - case B4SOI_MOD_MBJTII : - mod->B4SOImbjtii = value->rValue; - mod->B4SOImbjtiiGiven = TRUE; - break; - case B4SOI_MOD_ESATII : - mod->B4SOIesatii = value->rValue; - mod->B4SOIesatiiGiven = TRUE; - break; - case B4SOI_MOD_NTUNS : /* v4.0 */ - mod->B4SOIntun = value->rValue; - mod->B4SOIntunGiven = TRUE; - break; - case B4SOI_MOD_NTUND : /* v4.0 */ - mod->B4SOIntund = value->rValue; - mod->B4SOIntundGiven = TRUE; - break; - case B4SOI_MOD_NRECF0S : /* v4.0 */ - mod->B4SOInrecf0 = value->rValue; - mod->B4SOInrecf0Given = TRUE; - break; - case B4SOI_MOD_NRECF0D : /* v4.0 */ - mod->B4SOInrecf0d = value->rValue; - mod->B4SOInrecf0dGiven = TRUE; - break; - case B4SOI_MOD_NRECR0S : /* v4.0 */ - mod->B4SOInrecr0 = value->rValue; - mod->B4SOInrecr0Given = TRUE; - break; - case B4SOI_MOD_NRECR0D : /* v4.0 */ - mod->B4SOInrecr0d = value->rValue; - mod->B4SOInrecr0dGiven = TRUE; - break; - case B4SOI_MOD_ISBJT : - mod->B4SOIisbjt = value->rValue; - mod->B4SOIisbjtGiven = TRUE; - break; - case B4SOI_MOD_IDBJT : /* v4.0 */ - mod->B4SOIidbjt = value->rValue; - mod->B4SOIidbjtGiven = TRUE; - break; - case B4SOI_MOD_ISDIF : - mod->B4SOIisdif = value->rValue; - mod->B4SOIisdifGiven = TRUE; - break; - case B4SOI_MOD_IDDIF : /* v4.0 */ - mod->B4SOIiddif = value->rValue; - mod->B4SOIiddifGiven = TRUE; - break; - case B4SOI_MOD_ISREC : - mod->B4SOIisrec = value->rValue; - mod->B4SOIisrecGiven = TRUE; - break; - case B4SOI_MOD_IDREC : /* v4.0 */ - mod->B4SOIidrec = value->rValue; - mod->B4SOIidrecGiven = TRUE; - break; - case B4SOI_MOD_ISTUN : - mod->B4SOIistun = value->rValue; - mod->B4SOIistunGiven = TRUE; - break; - case B4SOI_MOD_IDTUN : /* v4.0 */ - mod->B4SOIidtun = value->rValue; - mod->B4SOIidtunGiven = TRUE; - break; - case B4SOI_MOD_LN : - mod->B4SOIln = value->rValue; - mod->B4SOIlnGiven = TRUE; - break; - case B4SOI_MOD_VREC0S : /* v4.0 */ - mod->B4SOIvrec0 = value->rValue; - mod->B4SOIvrec0Given = TRUE; - break; - case B4SOI_MOD_VREC0D : /* v4.0 */ - mod->B4SOIvrec0d = value->rValue; - mod->B4SOIvrec0dGiven = TRUE; - break; - case B4SOI_MOD_VTUN0S : /* v4.0 */ - mod->B4SOIvtun0 = value->rValue; - mod->B4SOIvtun0Given = TRUE; - break; - case B4SOI_MOD_VTUN0D : /* v4.0 */ - mod->B4SOIvtun0d = value->rValue; - mod->B4SOIvtun0dGiven = TRUE; - break; - case B4SOI_MOD_NBJT : - mod->B4SOInbjt = value->rValue; - mod->B4SOInbjtGiven = TRUE; - break; - case B4SOI_MOD_LBJT0 : - mod->B4SOIlbjt0 = value->rValue; - mod->B4SOIlbjt0Given = TRUE; - break; - case B4SOI_MOD_LDIF0 : - mod->B4SOIldif0 = value->rValue; - mod->B4SOIldif0Given = TRUE; - break; - case B4SOI_MOD_VABJT : - mod->B4SOIvabjt = value->rValue; - mod->B4SOIvabjtGiven = TRUE; - break; - case B4SOI_MOD_AELY : - mod->B4SOIaely = value->rValue; - mod->B4SOIaelyGiven = TRUE; - break; - case B4SOI_MOD_AHLIS : /* v4.0 */ - mod->B4SOIahli = value->rValue; - mod->B4SOIahliGiven = TRUE; - break; - case B4SOI_MOD_AHLID : /* v4.0 */ - mod->B4SOIahlid = value->rValue; - mod->B4SOIahlidGiven = TRUE; - break; - case B4SOI_MOD_NDIF : - mod->B4SOIndif = value->rValue; - mod->B4SOIndifGiven = TRUE; - break; - case B4SOI_MOD_NTRECF : - mod->B4SOIntrecf = value->rValue; - mod->B4SOIntrecfGiven = TRUE; - break; - case B4SOI_MOD_NTRECR : - mod->B4SOIntrecr = value->rValue; - mod->B4SOIntrecrGiven = TRUE; - break; - case B4SOI_MOD_DLCB : - mod->B4SOIdlcb = value->rValue; - mod->B4SOIdlcbGiven = TRUE; - break; - case B4SOI_MOD_FBODY : - mod->B4SOIfbody = value->rValue; - mod->B4SOIfbodyGiven = TRUE; - break; - case B4SOI_MOD_TCJSWGS : - mod->B4SOItcjswg = value->rValue; - mod->B4SOItcjswgGiven = TRUE; - break; - case B4SOI_MOD_TPBSWGS : - mod->B4SOItpbswg = value->rValue; - mod->B4SOItpbswgGiven = TRUE; - break; - case B4SOI_MOD_TCJSWGD : - mod->B4SOItcjswgd = value->rValue; - mod->B4SOItcjswgdGiven = TRUE; - break; - case B4SOI_MOD_TPBSWGD : - mod->B4SOItpbswgd = value->rValue; - mod->B4SOItpbswgdGiven = TRUE; - break; - - - case B4SOI_MOD_ACDE : - mod->B4SOIacde = value->rValue; - mod->B4SOIacdeGiven = TRUE; - break; - case B4SOI_MOD_MOIN : - mod->B4SOImoin = value->rValue; - mod->B4SOImoinGiven = TRUE; - break; - case B4SOI_MOD_NOFF : - mod->B4SOInoff = value->rValue; - mod->B4SOInoffGiven = TRUE; - break; /* v3.2 */ - case B4SOI_MOD_DELVT : - mod->B4SOIdelvt = value->rValue; - mod->B4SOIdelvtGiven = TRUE; - break; - case B4SOI_MOD_KB1 : - mod->B4SOIkb1 = value->rValue; - mod->B4SOIkb1Given = TRUE; - break; - case B4SOI_MOD_DLBG : - mod->B4SOIdlbg = value->rValue; - mod->B4SOIdlbgGiven = TRUE; - break; - -/* Added for binning - START */ - /* Length Dependence */ -/* v3.1 */ - case B4SOI_MOD_LXJ : - mod->B4SOIlxj = value->rValue; - mod->B4SOIlxjGiven = TRUE; - break; - case B4SOI_MOD_LALPHAGB1 : - mod->B4SOIlalphaGB1 = value->rValue; - mod->B4SOIlalphaGB1Given = TRUE; - break; - case B4SOI_MOD_LALPHAGB2 : - mod->B4SOIlalphaGB2 = value->rValue; - mod->B4SOIlalphaGB2Given = TRUE; - break; - case B4SOI_MOD_LBETAGB1 : - mod->B4SOIlbetaGB1 = value->rValue; - mod->B4SOIlbetaGB1Given = TRUE; - break; - case B4SOI_MOD_LBETAGB2 : - mod->B4SOIlbetaGB2 = value->rValue; - mod->B4SOIlbetaGB2Given = TRUE; - break; - case B4SOI_MOD_LAIGBCP2 : - mod->B4SOIlaigbcp2 = value->rValue; - mod->B4SOIlaigbcp2Given = TRUE; - break; - case B4SOI_MOD_LBIGBCP2 : - mod->B4SOIlbigbcp2 = value->rValue; - mod->B4SOIlbigbcp2Given = TRUE; - break; - case B4SOI_MOD_LCIGBCP2 : - mod->B4SOIlcigbcp2 = value->rValue; - mod->B4SOIlcigbcp2Given = TRUE; - break; - case B4SOI_MOD_LNDIF : - mod->B4SOIlndif = value->rValue; - mod->B4SOIlndifGiven = TRUE; - break; - case B4SOI_MOD_LNTRECF : - mod->B4SOIlntrecf = value->rValue; - mod->B4SOIlntrecfGiven = TRUE; - break; - case B4SOI_MOD_LNTRECR : - mod->B4SOIlntrecr = value->rValue; - mod->B4SOIlntrecrGiven = TRUE; - break; - case B4SOI_MOD_LXBJT : - mod->B4SOIlxbjt = value->rValue; - mod->B4SOIlxbjtGiven = TRUE; - break; - case B4SOI_MOD_LXDIFS : - mod->B4SOIlxdif = value->rValue; - mod->B4SOIlxdifGiven = TRUE; - break; - case B4SOI_MOD_LXRECS : - mod->B4SOIlxrec = value->rValue; - mod->B4SOIlxrecGiven = TRUE; - break; - case B4SOI_MOD_LXTUNS : - mod->B4SOIlxtun = value->rValue; - mod->B4SOIlxtunGiven = TRUE; - break; - case B4SOI_MOD_LXDIFD : - mod->B4SOIlxdifd = value->rValue; - mod->B4SOIlxdifdGiven = TRUE; - break; - case B4SOI_MOD_LXRECD : - mod->B4SOIlxrecd = value->rValue; - mod->B4SOIlxrecdGiven = TRUE; - break; - case B4SOI_MOD_LXTUND : - mod->B4SOIlxtund = value->rValue; - mod->B4SOIlxtundGiven = TRUE; - break; - case B4SOI_MOD_LCGDL : - mod->B4SOIlcgdl = value->rValue; - mod->B4SOIlcgdlGiven = TRUE; - break; - case B4SOI_MOD_LCGSL : - mod->B4SOIlcgsl = value->rValue; - mod->B4SOIlcgslGiven = TRUE; - break; - case B4SOI_MOD_LCKAPPA : - mod->B4SOIlckappa = value->rValue; - mod->B4SOIlckappaGiven = TRUE; - break; - case B4SOI_MOD_LUTE : - mod->B4SOIlute = value->rValue; - mod->B4SOIluteGiven = TRUE; - break; - case B4SOI_MOD_LKT1 : - mod->B4SOIlkt1 = value->rValue; - mod->B4SOIlkt1Given = TRUE; - break; - case B4SOI_MOD_LKT2 : - mod->B4SOIlkt2 = value->rValue; - mod->B4SOIlkt2Given = TRUE; - break; - case B4SOI_MOD_LKT1L : - mod->B4SOIlkt1l = value->rValue; - mod->B4SOIlkt1lGiven = TRUE; - break; - case B4SOI_MOD_LUA1 : - mod->B4SOIlua1 = value->rValue; - mod->B4SOIlua1Given = TRUE; - break; - case B4SOI_MOD_LUB1 : - mod->B4SOIlub1 = value->rValue; - mod->B4SOIlub1Given = TRUE; - break; - case B4SOI_MOD_LUC1 : - mod->B4SOIluc1 = value->rValue; - mod->B4SOIluc1Given = TRUE; - break; - case B4SOI_MOD_LAT : - mod->B4SOIlat = value->rValue; - mod->B4SOIlatGiven = TRUE; - break; - case B4SOI_MOD_LPRT : - mod->B4SOIlprt = value->rValue; - mod->B4SOIlprtGiven = TRUE; - break; - - -/* v3.0 */ - case B4SOI_MOD_LAIGC : - mod->B4SOIlaigc = value->rValue; - mod->B4SOIlaigcGiven = TRUE; - break; - case B4SOI_MOD_LBIGC : - mod->B4SOIlbigc = value->rValue; - mod->B4SOIlbigcGiven = TRUE; - break; - case B4SOI_MOD_LCIGC : - mod->B4SOIlcigc = value->rValue; - mod->B4SOIlcigcGiven = TRUE; - break; - case B4SOI_MOD_LAIGSD : - mod->B4SOIlaigsd = value->rValue; - mod->B4SOIlaigsdGiven = TRUE; - break; - case B4SOI_MOD_LBIGSD : - mod->B4SOIlbigsd = value->rValue; - mod->B4SOIlbigsdGiven = TRUE; - break; - case B4SOI_MOD_LCIGSD : - mod->B4SOIlcigsd = value->rValue; - mod->B4SOIlcigsdGiven = TRUE; - break; - case B4SOI_MOD_LNIGC : - mod->B4SOIlnigc = value->rValue; - mod->B4SOIlnigcGiven = TRUE; - break; - case B4SOI_MOD_LPIGCD : - mod->B4SOIlpigcd = value->rValue; - mod->B4SOIlpigcdGiven = TRUE; - break; - case B4SOI_MOD_LPOXEDGE : - mod->B4SOIlpoxedge = value->rValue; - mod->B4SOIlpoxedgeGiven = TRUE; - break; - - case B4SOI_MOD_LNPEAK: - mod->B4SOIlnpeak = value->rValue; - mod->B4SOIlnpeakGiven = TRUE; - break; - case B4SOI_MOD_LNSUB: - mod->B4SOIlnsub = value->rValue; - mod->B4SOIlnsubGiven = TRUE; - break; - case B4SOI_MOD_LNGATE: - mod->B4SOIlngate = value->rValue; - mod->B4SOIlngateGiven = TRUE; - break; - case B4SOI_MOD_LNSD: - mod->B4SOIlnsd = value->rValue; - mod->B4SOIlnsdGiven = TRUE; - break; - case B4SOI_MOD_LVTH0: - mod->B4SOIlvth0 = value->rValue; - mod->B4SOIlvth0Given = TRUE; - break; - case B4SOI_MOD_LVFB: - mod->B4SOIlvfb = value->rValue; - mod->B4SOIlvfbGiven = TRUE; - break; /* v4.1 */ - case B4SOI_MOD_LK1: - mod->B4SOIlk1 = value->rValue; - mod->B4SOIlk1Given = TRUE; - break; - case B4SOI_MOD_LK1W1: - mod->B4SOIlk1w1 = value->rValue; - mod->B4SOIlk1w1Given = TRUE; - break; - case B4SOI_MOD_LK1W2: - mod->B4SOIlk1w2 = value->rValue; - mod->B4SOIlk1w2Given = TRUE; - break; - case B4SOI_MOD_LK2: - mod->B4SOIlk2 = value->rValue; - mod->B4SOIlk2Given = TRUE; - break; - case B4SOI_MOD_LK3: - mod->B4SOIlk3 = value->rValue; - mod->B4SOIlk3Given = TRUE; - break; - case B4SOI_MOD_LK3B: - mod->B4SOIlk3b = value->rValue; - mod->B4SOIlk3bGiven = TRUE; - break; - case B4SOI_MOD_LKB1 : - mod->B4SOIlkb1 = value->rValue; - mod->B4SOIlkb1Given = TRUE; - break; - case B4SOI_MOD_LW0: - mod->B4SOIlw0 = value->rValue; - mod->B4SOIlw0Given = TRUE; - break; - case B4SOI_MOD_LLPE0: - mod->B4SOIllpe0 = value->rValue; - mod->B4SOIllpe0Given = TRUE; - break; - case B4SOI_MOD_LLPEB: /* v4.0 for Vth */ - mod->B4SOIllpeb = value->rValue; - mod->B4SOIllpebGiven = TRUE; - break; - case B4SOI_MOD_LDVT0: - mod->B4SOIldvt0 = value->rValue; - mod->B4SOIldvt0Given = TRUE; - break; - case B4SOI_MOD_LDVT1: - mod->B4SOIldvt1 = value->rValue; - mod->B4SOIldvt1Given = TRUE; - break; - case B4SOI_MOD_LDVT2: - mod->B4SOIldvt2 = value->rValue; - mod->B4SOIldvt2Given = TRUE; - break; - case B4SOI_MOD_LDVT0W: - mod->B4SOIldvt0w = value->rValue; - mod->B4SOIldvt0wGiven = TRUE; - break; - case B4SOI_MOD_LDVT1W: - mod->B4SOIldvt1w = value->rValue; - mod->B4SOIldvt1wGiven = TRUE; - break; - case B4SOI_MOD_LDVT2W: - mod->B4SOIldvt2w = value->rValue; - mod->B4SOIldvt2wGiven = TRUE; - break; - case B4SOI_MOD_LU0 : - mod->B4SOIlu0 = value->rValue; - mod->B4SOIlu0Given = TRUE; - break; - case B4SOI_MOD_LUA: - mod->B4SOIlua = value->rValue; - mod->B4SOIluaGiven = TRUE; - break; - case B4SOI_MOD_LUB: - mod->B4SOIlub = value->rValue; - mod->B4SOIlubGiven = TRUE; - break; - case B4SOI_MOD_LUC: - mod->B4SOIluc = value->rValue; - mod->B4SOIlucGiven = TRUE; - break; - case B4SOI_MOD_LVSAT: - mod->B4SOIlvsat = value->rValue; - mod->B4SOIlvsatGiven = TRUE; - break; - case B4SOI_MOD_LA0: - mod->B4SOIla0 = value->rValue; - mod->B4SOIla0Given = TRUE; - break; - case B4SOI_MOD_LAGS: - mod->B4SOIlags= value->rValue; - mod->B4SOIlagsGiven = TRUE; - break; - case B4SOI_MOD_LB0 : - mod->B4SOIlb0 = value->rValue; - mod->B4SOIlb0Given = TRUE; - break; - case B4SOI_MOD_LB1 : - mod->B4SOIlb1 = value->rValue; - mod->B4SOIlb1Given = TRUE; - break; - case B4SOI_MOD_LKETA: - mod->B4SOIlketa = value->rValue; - mod->B4SOIlketaGiven = TRUE; - break; - case B4SOI_MOD_LKETAS: - mod->B4SOIlketas = value->rValue; - mod->B4SOIlketasGiven = TRUE; - break; - case B4SOI_MOD_LA1: - mod->B4SOIla1 = value->rValue; - mod->B4SOIla1Given = TRUE; - break; - case B4SOI_MOD_LA2: - mod->B4SOIla2 = value->rValue; - mod->B4SOIla2Given = TRUE; - break; - case B4SOI_MOD_LRDSW: - mod->B4SOIlrdsw = value->rValue; - mod->B4SOIlrdswGiven = TRUE; - break; - case B4SOI_MOD_LRSW: - mod->B4SOIlrsw = value->rValue; - mod->B4SOIlrswGiven = TRUE; - break; - case B4SOI_MOD_LRDW: - mod->B4SOIlrdw = value->rValue; - mod->B4SOIlrdwGiven = TRUE; - break; - case B4SOI_MOD_LPRWB: - mod->B4SOIlprwb = value->rValue; - mod->B4SOIlprwbGiven = TRUE; - break; - case B4SOI_MOD_LPRWG: - mod->B4SOIlprwg = value->rValue; - mod->B4SOIlprwgGiven = TRUE; - break; - case B4SOI_MOD_LWR : - mod->B4SOIlwr = value->rValue; - mod->B4SOIlwrGiven = TRUE; - break; - case B4SOI_MOD_LNFACTOR : - mod->B4SOIlnfactor = value->rValue; - mod->B4SOIlnfactorGiven = TRUE; - break; - case B4SOI_MOD_LDWG : - mod->B4SOIldwg = value->rValue; - mod->B4SOIldwgGiven = TRUE; - break; - case B4SOI_MOD_LDWB : - mod->B4SOIldwb = value->rValue; - mod->B4SOIldwbGiven = TRUE; - break; - case B4SOI_MOD_LVOFF: - mod->B4SOIlvoff = value->rValue; - mod->B4SOIlvoffGiven = TRUE; - break; - case B4SOI_MOD_LETA0: - mod->B4SOIleta0 = value->rValue; - mod->B4SOIleta0Given = TRUE; - break; - case B4SOI_MOD_LETAB: - mod->B4SOIletab = value->rValue; - mod->B4SOIletabGiven = TRUE; - break; - case B4SOI_MOD_LDSUB: - mod->B4SOIldsub = value->rValue; - mod->B4SOIldsubGiven = TRUE; - break; - case B4SOI_MOD_LCIT : - mod->B4SOIlcit = value->rValue; - mod->B4SOIlcitGiven = TRUE; - break; - case B4SOI_MOD_LCDSC : - mod->B4SOIlcdsc = value->rValue; - mod->B4SOIlcdscGiven = TRUE; - break; - case B4SOI_MOD_LCDSCB : - mod->B4SOIlcdscb = value->rValue; - mod->B4SOIlcdscbGiven = TRUE; - break; - case B4SOI_MOD_LCDSCD : - mod->B4SOIlcdscd = value->rValue; - mod->B4SOIlcdscdGiven = TRUE; - break; - case B4SOI_MOD_LPCLM: - mod->B4SOIlpclm = value->rValue; - mod->B4SOIlpclmGiven = TRUE; - break; - case B4SOI_MOD_LPDIBL1: - mod->B4SOIlpdibl1 = value->rValue; - mod->B4SOIlpdibl1Given = TRUE; - break; - case B4SOI_MOD_LPDIBL2: - mod->B4SOIlpdibl2 = value->rValue; - mod->B4SOIlpdibl2Given = TRUE; - break; - case B4SOI_MOD_LPDIBLB: - mod->B4SOIlpdiblb = value->rValue; - mod->B4SOIlpdiblbGiven = TRUE; - break; - case B4SOI_MOD_LDROUT: - mod->B4SOIldrout = value->rValue; - mod->B4SOIldroutGiven = TRUE; - break; - case B4SOI_MOD_LPVAG: - mod->B4SOIlpvag = value->rValue; - mod->B4SOIlpvagGiven = TRUE; - break; - case B4SOI_MOD_LDELTA : - mod->B4SOIldelta = value->rValue; - mod->B4SOIldeltaGiven = TRUE; - break; - case B4SOI_MOD_LALPHA0 : - mod->B4SOIlalpha0 = value->rValue; - mod->B4SOIlalpha0Given = TRUE; - break; - case B4SOI_MOD_LFBJTII : - mod->B4SOIlfbjtii = value->rValue; - mod->B4SOIlfbjtiiGiven = TRUE; - break; - /*4.1 Iii model*/ - case B4SOI_MOD_LEBJTII : - mod->B4SOIlebjtii = value->rValue; - mod->B4SOIlebjtiiGiven = TRUE; - break; - case B4SOI_MOD_LCBJTII : - mod->B4SOIlcbjtii = value->rValue; - mod->B4SOIlcbjtiiGiven = TRUE; - break; - case B4SOI_MOD_LVBCI : - mod->B4SOIlvbci = value->rValue; - mod->B4SOIlvbciGiven = TRUE; - break; - case B4SOI_MOD_LABJTII : - mod->B4SOIlabjtii = value->rValue; - mod->B4SOIlabjtiiGiven = TRUE; - break; - case B4SOI_MOD_LMBJTII : - mod->B4SOIlmbjtii = value->rValue; - mod->B4SOIlmbjtiiGiven = TRUE; - break; - - case B4SOI_MOD_LBETA0 : - mod->B4SOIlbeta0 = value->rValue; - mod->B4SOIlbeta0Given = TRUE; - break; - case B4SOI_MOD_LBETA1 : - mod->B4SOIlbeta1 = value->rValue; - mod->B4SOIlbeta1Given = TRUE; - break; - case B4SOI_MOD_LBETA2 : - mod->B4SOIlbeta2 = value->rValue; - mod->B4SOIlbeta2Given = TRUE; - break; - case B4SOI_MOD_LVDSATII0 : - mod->B4SOIlvdsatii0 = value->rValue; - mod->B4SOIlvdsatii0Given = TRUE; - break; - case B4SOI_MOD_LLII : - mod->B4SOIllii = value->rValue; - mod->B4SOIlliiGiven = TRUE; - break; - case B4SOI_MOD_LESATII : - mod->B4SOIlesatii = value->rValue; - mod->B4SOIlesatiiGiven = TRUE; - break; - case B4SOI_MOD_LSII0 : - mod->B4SOIlsii0 = value->rValue; - mod->B4SOIlsii0Given = TRUE; - break; - case B4SOI_MOD_LSII1 : - mod->B4SOIlsii1 = value->rValue; - mod->B4SOIlsii1Given = TRUE; - break; - case B4SOI_MOD_LSII2 : - mod->B4SOIlsii2 = value->rValue; - mod->B4SOIlsii2Given = TRUE; - break; - case B4SOI_MOD_LSIID : - mod->B4SOIlsiid = value->rValue; - mod->B4SOIlsiidGiven = TRUE; - break; - case B4SOI_MOD_LAGIDL : - mod->B4SOIlagidl = value->rValue; - mod->B4SOIlagidlGiven = TRUE; - break; - case B4SOI_MOD_LBGIDL : - mod->B4SOIlbgidl = value->rValue; - mod->B4SOIlbgidlGiven = TRUE; - break; - case B4SOI_MOD_LCGIDL : - mod->B4SOIlcgidl = value->rValue; - mod->B4SOIlcgidlGiven = TRUE; - break; - case B4SOI_MOD_LEGIDL : - mod->B4SOIlegidl = value->rValue; - mod->B4SOIlegidlGiven = TRUE; - break; - case B4SOI_MOD_LRGIDL : - mod->B4SOIlrgidl = value->rValue; - mod->B4SOIlrgidlGiven = TRUE; - break; - case B4SOI_MOD_LKGIDL : - mod->B4SOIlkgidl = value->rValue; - mod->B4SOIlkgidlGiven = TRUE; - break; - case B4SOI_MOD_LFGIDL : - mod->B4SOIlfgidl = value->rValue; - mod->B4SOIlfgidlGiven = TRUE; - break; - - case B4SOI_MOD_LAGISL : - mod->B4SOIlagisl = value->rValue; - mod->B4SOIlagislGiven = TRUE; - break; - case B4SOI_MOD_LBGISL : - mod->B4SOIlbgisl = value->rValue; - mod->B4SOIlbgislGiven = TRUE; - break; - case B4SOI_MOD_LCGISL : - mod->B4SOIlcgisl = value->rValue; - mod->B4SOIlcgislGiven = TRUE; - break; - case B4SOI_MOD_LEGISL : - mod->B4SOIlegisl = value->rValue; - mod->B4SOIlegislGiven = TRUE; - break; - case B4SOI_MOD_LRGISL : - mod->B4SOIlrgisl = value->rValue; - mod->B4SOIlrgislGiven = TRUE; - break; - case B4SOI_MOD_LKGISL : - mod->B4SOIlkgisl = value->rValue; - mod->B4SOIlkgislGiven = TRUE; - break; - case B4SOI_MOD_LFGISL : - mod->B4SOIlfgisl = value->rValue; - mod->B4SOIlfgislGiven = TRUE; - break; - case B4SOI_MOD_LNTUNS : /* v4.0 */ - mod->B4SOIlntun = value->rValue; - mod->B4SOIlntunGiven = TRUE; - break; - case B4SOI_MOD_LNTUND : /* v4.0 */ - mod->B4SOIlntund = value->rValue; - mod->B4SOIlntundGiven = TRUE; - break; - case B4SOI_MOD_LNDIODES : /* v4.0 */ - mod->B4SOIlndiode = value->rValue; - mod->B4SOIlndiodeGiven = TRUE; - break; - case B4SOI_MOD_LNDIODED : /* v4.0 */ - mod->B4SOIlndioded = value->rValue; - mod->B4SOIlndiodedGiven = TRUE; - break; - case B4SOI_MOD_LNRECF0S : /* v4.0 */ - mod->B4SOIlnrecf0 = value->rValue; - mod->B4SOIlnrecf0Given = TRUE; - break; - case B4SOI_MOD_LNRECF0D : /* v4.0 */ - mod->B4SOIlnrecf0d = value->rValue; - mod->B4SOIlnrecf0dGiven = TRUE; - break; - case B4SOI_MOD_LNRECR0S : /* v4.0 */ - mod->B4SOIlnrecr0 = value->rValue; - mod->B4SOIlnrecr0Given = TRUE; - break; - case B4SOI_MOD_LNRECR0D : /* v4.0 */ - mod->B4SOIlnrecr0d = value->rValue; - mod->B4SOIlnrecr0dGiven = TRUE; - break; - case B4SOI_MOD_LISBJT : - mod->B4SOIlisbjt = value->rValue; - mod->B4SOIlisbjtGiven = TRUE; - break; - case B4SOI_MOD_LIDBJT : /* v4.0 */ - mod->B4SOIlidbjt = value->rValue; - mod->B4SOIlidbjtGiven = TRUE; - break; - case B4SOI_MOD_LISDIF : - mod->B4SOIlisdif = value->rValue; - mod->B4SOIlisdifGiven = TRUE; - break; - case B4SOI_MOD_LIDDIF : /* v4.0 */ - mod->B4SOIliddif = value->rValue; - mod->B4SOIliddifGiven = TRUE; - break; - case B4SOI_MOD_LISREC : - mod->B4SOIlisrec = value->rValue; - mod->B4SOIlisrecGiven = TRUE; - break; - case B4SOI_MOD_LIDREC : /* v4.0 */ - mod->B4SOIlidrec = value->rValue; - mod->B4SOIlidrecGiven = TRUE; - break; - case B4SOI_MOD_LISTUN : - mod->B4SOIlistun = value->rValue; - mod->B4SOIlistunGiven = TRUE; - break; - case B4SOI_MOD_LIDTUN : /* v4.0 */ - mod->B4SOIlidtun = value->rValue; - mod->B4SOIlidtunGiven = TRUE; - break; - case B4SOI_MOD_LVREC0S : /* v4.0 */ - mod->B4SOIlvrec0 = value->rValue; - mod->B4SOIlvrec0Given = TRUE; - break; - case B4SOI_MOD_LVREC0D : /* v4.0 */ - mod->B4SOIlvrec0d = value->rValue; - mod->B4SOIlvrec0dGiven = TRUE; - break; - case B4SOI_MOD_LVTUN0S : /* v4.0 */ - mod->B4SOIlvtun0 = value->rValue; - mod->B4SOIlvtun0Given = TRUE; - break; - case B4SOI_MOD_LVTUN0D : /* v4.0 */ - mod->B4SOIlvtun0d = value->rValue; - mod->B4SOIlvtun0dGiven = TRUE; - break; - case B4SOI_MOD_LNBJT : - mod->B4SOIlnbjt = value->rValue; - mod->B4SOIlnbjtGiven = TRUE; - break; - case B4SOI_MOD_LLBJT0 : - mod->B4SOIllbjt0 = value->rValue; - mod->B4SOIllbjt0Given = TRUE; - break; - case B4SOI_MOD_LVABJT : - mod->B4SOIlvabjt = value->rValue; - mod->B4SOIlvabjtGiven = TRUE; - break; - case B4SOI_MOD_LAELY : - mod->B4SOIlaely = value->rValue; - mod->B4SOIlaelyGiven = TRUE; - break; - case B4SOI_MOD_LAHLIS : /* v4.0 */ - mod->B4SOIlahli = value->rValue; - mod->B4SOIlahliGiven = TRUE; - break; - case B4SOI_MOD_LAHLID : /* v4.0 */ - mod->B4SOIlahlid = value->rValue; - mod->B4SOIlahlidGiven = TRUE; - break; - -/* v3.1 for RF */ - case B4SOI_MOD_LXRCRG1 : - mod->B4SOIlxrcrg1 = value->rValue; - mod->B4SOIlxrcrg1Given = TRUE; - break; - case B4SOI_MOD_LXRCRG2 : - mod->B4SOIlxrcrg2 = value->rValue; - mod->B4SOIlxrcrg2Given = TRUE; - break; -/* v3.1 for RF end */ - - /* CV Model */ - case B4SOI_MOD_LVSDFB : - mod->B4SOIlvsdfb = value->rValue; - mod->B4SOIlvsdfbGiven = TRUE; - break; - case B4SOI_MOD_LVSDTH : - mod->B4SOIlvsdth = value->rValue; - mod->B4SOIlvsdthGiven = TRUE; - break; - case B4SOI_MOD_LDELVT : - mod->B4SOIldelvt = value->rValue; - mod->B4SOIldelvtGiven = TRUE; - break; - case B4SOI_MOD_LACDE : - mod->B4SOIlacde = value->rValue; - mod->B4SOIlacdeGiven = TRUE; - break; - case B4SOI_MOD_LMOIN : - mod->B4SOIlmoin = value->rValue; - mod->B4SOIlmoinGiven = TRUE; - break; - case B4SOI_MOD_LNOFF : - mod->B4SOIlnoff = value->rValue; - mod->B4SOIlnoffGiven = TRUE; - break; /* v3.2 */ - - /* Width Dependence */ -/* v3.1 */ - case B4SOI_MOD_WXJ : - mod->B4SOIwxj = value->rValue; - mod->B4SOIwxjGiven = TRUE; - break; - case B4SOI_MOD_WALPHAGB1 : - mod->B4SOIwalphaGB1 = value->rValue; - mod->B4SOIwalphaGB1Given = TRUE; - break; - case B4SOI_MOD_WALPHAGB2 : - mod->B4SOIwalphaGB2 = value->rValue; - mod->B4SOIwalphaGB2Given = TRUE; - break; - case B4SOI_MOD_WBETAGB1 : - mod->B4SOIwbetaGB1 = value->rValue; - mod->B4SOIwbetaGB1Given = TRUE; - break; - case B4SOI_MOD_WBETAGB2 : - mod->B4SOIwbetaGB2 = value->rValue; - mod->B4SOIwbetaGB2Given = TRUE; - break; - case B4SOI_MOD_WAIGBCP2 : - mod->B4SOIwaigbcp2 = value->rValue; - mod->B4SOIwaigbcp2Given = TRUE; - break; - case B4SOI_MOD_WBIGBCP2 : - mod->B4SOIwbigbcp2 = value->rValue; - mod->B4SOIwbigbcp2Given = TRUE; - break; - case B4SOI_MOD_WCIGBCP2 : - mod->B4SOIwcigbcp2 = value->rValue; - mod->B4SOIwcigbcp2Given = TRUE; - break; - case B4SOI_MOD_WNDIF : - mod->B4SOIwndif = value->rValue; - mod->B4SOIwndifGiven = TRUE; - break; - case B4SOI_MOD_WNTRECF : - mod->B4SOIwntrecf = value->rValue; - mod->B4SOIwntrecfGiven = TRUE; - break; - case B4SOI_MOD_WNTRECR : - mod->B4SOIwntrecr = value->rValue; - mod->B4SOIwntrecrGiven = TRUE; - break; - case B4SOI_MOD_WXBJT : - mod->B4SOIwxbjt = value->rValue; - mod->B4SOIwxbjtGiven = TRUE; - break; - case B4SOI_MOD_WXDIFS : - mod->B4SOIwxdif = value->rValue; - mod->B4SOIwxdifGiven = TRUE; - break; - case B4SOI_MOD_WXRECS : - mod->B4SOIwxrec = value->rValue; - mod->B4SOIwxrecGiven = TRUE; - break; - case B4SOI_MOD_WXTUNS : - mod->B4SOIwxtun = value->rValue; - mod->B4SOIwxtunGiven = TRUE; - break; - case B4SOI_MOD_WXDIFD : - mod->B4SOIwxdifd = value->rValue; - mod->B4SOIwxdifdGiven = TRUE; - break; - case B4SOI_MOD_WXRECD : - mod->B4SOIwxrecd = value->rValue; - mod->B4SOIwxrecdGiven = TRUE; - break; - case B4SOI_MOD_WXTUND : - mod->B4SOIwxtund = value->rValue; - mod->B4SOIwxtundGiven = TRUE; - break; - case B4SOI_MOD_WCGDL : - mod->B4SOIwcgdl = value->rValue; - mod->B4SOIwcgdlGiven = TRUE; - break; - case B4SOI_MOD_WCGSL : - mod->B4SOIwcgsl = value->rValue; - mod->B4SOIwcgslGiven = TRUE; - break; - case B4SOI_MOD_WCKAPPA : - mod->B4SOIwckappa = value->rValue; - mod->B4SOIwckappaGiven = TRUE; - break; - case B4SOI_MOD_WUTE : - mod->B4SOIwute = value->rValue; - mod->B4SOIwuteGiven = TRUE; - break; - case B4SOI_MOD_WKT1 : - mod->B4SOIwkt1 = value->rValue; - mod->B4SOIwkt1Given = TRUE; - break; - case B4SOI_MOD_WKT2 : - mod->B4SOIwkt2 = value->rValue; - mod->B4SOIwkt2Given = TRUE; - break; - case B4SOI_MOD_WKT1L : - mod->B4SOIwkt1l = value->rValue; - mod->B4SOIwkt1lGiven = TRUE; - break; - case B4SOI_MOD_WUA1 : - mod->B4SOIwua1 = value->rValue; - mod->B4SOIwua1Given = TRUE; - break; - case B4SOI_MOD_WUB1 : - mod->B4SOIwub1 = value->rValue; - mod->B4SOIwub1Given = TRUE; - break; - case B4SOI_MOD_WUC1 : - mod->B4SOIwuc1 = value->rValue; - mod->B4SOIwuc1Given = TRUE; - break; - case B4SOI_MOD_WAT : - mod->B4SOIwat = value->rValue; - mod->B4SOIwatGiven = TRUE; - break; - case B4SOI_MOD_WPRT : - mod->B4SOIwprt = value->rValue; - mod->B4SOIwprtGiven = TRUE; - break; - -/* v3.0 */ - case B4SOI_MOD_WAIGC : - mod->B4SOIwaigc = value->rValue; - mod->B4SOIwaigcGiven = TRUE; - break; - case B4SOI_MOD_WBIGC : - mod->B4SOIwbigc = value->rValue; - mod->B4SOIwbigcGiven = TRUE; - break; - case B4SOI_MOD_WCIGC : - mod->B4SOIwcigc = value->rValue; - mod->B4SOIwcigcGiven = TRUE; - break; - case B4SOI_MOD_WAIGSD : - mod->B4SOIwaigsd = value->rValue; - mod->B4SOIwaigsdGiven = TRUE; - break; - case B4SOI_MOD_WBIGSD : - mod->B4SOIwbigsd = value->rValue; - mod->B4SOIwbigsdGiven = TRUE; - break; - case B4SOI_MOD_WCIGSD : - mod->B4SOIwcigsd = value->rValue; - mod->B4SOIwcigsdGiven = TRUE; - break; - case B4SOI_MOD_WNIGC : - mod->B4SOIwnigc = value->rValue; - mod->B4SOIwnigcGiven = TRUE; - break; - case B4SOI_MOD_WPIGCD : - mod->B4SOIwpigcd = value->rValue; - mod->B4SOIwpigcdGiven = TRUE; - break; - case B4SOI_MOD_WPOXEDGE : - mod->B4SOIwpoxedge = value->rValue; - mod->B4SOIwpoxedgeGiven = TRUE; - break; - - case B4SOI_MOD_WNPEAK: - mod->B4SOIwnpeak = value->rValue; - mod->B4SOIwnpeakGiven = TRUE; - break; - case B4SOI_MOD_WNSUB: - mod->B4SOIwnsub = value->rValue; - mod->B4SOIwnsubGiven = TRUE; - break; - case B4SOI_MOD_WNGATE: - mod->B4SOIwngate = value->rValue; - mod->B4SOIwngateGiven = TRUE; - break; - case B4SOI_MOD_WNSD: - mod->B4SOIwnsd = value->rValue; - mod->B4SOIwnsdGiven = TRUE; - break; - case B4SOI_MOD_WVTH0: - mod->B4SOIwvth0 = value->rValue; - mod->B4SOIwvth0Given = TRUE; - break; - case B4SOI_MOD_WVFB: - mod->B4SOIwvfb = value->rValue; - mod->B4SOIwvfbGiven = TRUE; - break; /* v4.1 */ - case B4SOI_MOD_WK1: - mod->B4SOIwk1 = value->rValue; - mod->B4SOIwk1Given = TRUE; - break; - case B4SOI_MOD_WK1W1: - mod->B4SOIwk1w1 = value->rValue; - mod->B4SOIwk1w1Given = TRUE; - break; - case B4SOI_MOD_WK1W2: - mod->B4SOIwk1w2 = value->rValue; - mod->B4SOIwk1w2Given = TRUE; - break; - case B4SOI_MOD_WK2: - mod->B4SOIwk2 = value->rValue; - mod->B4SOIwk2Given = TRUE; - break; - case B4SOI_MOD_WK3: - mod->B4SOIwk3 = value->rValue; - mod->B4SOIwk3Given = TRUE; - break; - case B4SOI_MOD_WK3B: - mod->B4SOIwk3b = value->rValue; - mod->B4SOIwk3bGiven = TRUE; - break; - case B4SOI_MOD_WKB1 : - mod->B4SOIwkb1 = value->rValue; - mod->B4SOIwkb1Given = TRUE; - break; - case B4SOI_MOD_WW0: - mod->B4SOIww0 = value->rValue; - mod->B4SOIww0Given = TRUE; - break; - case B4SOI_MOD_WLPE0: - mod->B4SOIwlpe0 = value->rValue; - mod->B4SOIwlpe0Given = TRUE; - break; - case B4SOI_MOD_WLPEB: /* v4.0 for Vth */ - mod->B4SOIwlpeb = value->rValue; - mod->B4SOIwlpebGiven = TRUE; - break; - case B4SOI_MOD_WDVT0: - mod->B4SOIwdvt0 = value->rValue; - mod->B4SOIwdvt0Given = TRUE; - break; - case B4SOI_MOD_WDVT1: - mod->B4SOIwdvt1 = value->rValue; - mod->B4SOIwdvt1Given = TRUE; - break; - case B4SOI_MOD_WDVT2: - mod->B4SOIwdvt2 = value->rValue; - mod->B4SOIwdvt2Given = TRUE; - break; - case B4SOI_MOD_WDVT0W: - mod->B4SOIwdvt0w = value->rValue; - mod->B4SOIwdvt0wGiven = TRUE; - break; - case B4SOI_MOD_WDVT1W: - mod->B4SOIwdvt1w = value->rValue; - mod->B4SOIwdvt1wGiven = TRUE; - break; - case B4SOI_MOD_WDVT2W: - mod->B4SOIwdvt2w = value->rValue; - mod->B4SOIwdvt2wGiven = TRUE; - break; - case B4SOI_MOD_WU0 : - mod->B4SOIwu0 = value->rValue; - mod->B4SOIwu0Given = TRUE; - break; - case B4SOI_MOD_WUA: - mod->B4SOIwua = value->rValue; - mod->B4SOIwuaGiven = TRUE; - break; - case B4SOI_MOD_WUB: - mod->B4SOIwub = value->rValue; - mod->B4SOIwubGiven = TRUE; - break; - case B4SOI_MOD_WUC: - mod->B4SOIwuc = value->rValue; - mod->B4SOIwucGiven = TRUE; - break; - case B4SOI_MOD_WVSAT: - mod->B4SOIwvsat = value->rValue; - mod->B4SOIwvsatGiven = TRUE; - break; - case B4SOI_MOD_WA0: - mod->B4SOIwa0 = value->rValue; - mod->B4SOIwa0Given = TRUE; - break; - case B4SOI_MOD_WAGS: - mod->B4SOIwags= value->rValue; - mod->B4SOIwagsGiven = TRUE; - break; - case B4SOI_MOD_WB0 : - mod->B4SOIwb0 = value->rValue; - mod->B4SOIwb0Given = TRUE; - break; - case B4SOI_MOD_WB1 : - mod->B4SOIwb1 = value->rValue; - mod->B4SOIwb1Given = TRUE; - break; - case B4SOI_MOD_WKETA: - mod->B4SOIwketa = value->rValue; - mod->B4SOIwketaGiven = TRUE; - break; - case B4SOI_MOD_WKETAS: - mod->B4SOIwketas = value->rValue; - mod->B4SOIwketasGiven = TRUE; - break; - case B4SOI_MOD_WA1: - mod->B4SOIwa1 = value->rValue; - mod->B4SOIwa1Given = TRUE; - break; - case B4SOI_MOD_WA2: - mod->B4SOIwa2 = value->rValue; - mod->B4SOIwa2Given = TRUE; - break; - case B4SOI_MOD_WRDSW: - mod->B4SOIwrdsw = value->rValue; - mod->B4SOIwrdswGiven = TRUE; - break; - case B4SOI_MOD_WRSW: - mod->B4SOIwrsw = value->rValue; - mod->B4SOIwrswGiven = TRUE; - break; - case B4SOI_MOD_WRDW: - mod->B4SOIwrdw = value->rValue; - mod->B4SOIwrdwGiven = TRUE; - break; - case B4SOI_MOD_WPRWB: - mod->B4SOIwprwb = value->rValue; - mod->B4SOIwprwbGiven = TRUE; - break; - case B4SOI_MOD_WPRWG: - mod->B4SOIwprwg = value->rValue; - mod->B4SOIwprwgGiven = TRUE; - break; - case B4SOI_MOD_WWR : - mod->B4SOIwwr = value->rValue; - mod->B4SOIwwrGiven = TRUE; - break; - case B4SOI_MOD_WNFACTOR : - mod->B4SOIwnfactor = value->rValue; - mod->B4SOIwnfactorGiven = TRUE; - break; - case B4SOI_MOD_WDWG : - mod->B4SOIwdwg = value->rValue; - mod->B4SOIwdwgGiven = TRUE; - break; - case B4SOI_MOD_WDWB : - mod->B4SOIwdwb = value->rValue; - mod->B4SOIwdwbGiven = TRUE; - break; - case B4SOI_MOD_WVOFF: - mod->B4SOIwvoff = value->rValue; - mod->B4SOIwvoffGiven = TRUE; - break; - case B4SOI_MOD_WETA0: - mod->B4SOIweta0 = value->rValue; - mod->B4SOIweta0Given = TRUE; - break; - case B4SOI_MOD_WETAB: - mod->B4SOIwetab = value->rValue; - mod->B4SOIwetabGiven = TRUE; - break; - case B4SOI_MOD_WDSUB: - mod->B4SOIwdsub = value->rValue; - mod->B4SOIwdsubGiven = TRUE; - break; - case B4SOI_MOD_WCIT : - mod->B4SOIwcit = value->rValue; - mod->B4SOIwcitGiven = TRUE; - break; - case B4SOI_MOD_WCDSC : - mod->B4SOIwcdsc = value->rValue; - mod->B4SOIwcdscGiven = TRUE; - break; - case B4SOI_MOD_WCDSCB : - mod->B4SOIwcdscb = value->rValue; - mod->B4SOIwcdscbGiven = TRUE; - break; - case B4SOI_MOD_WCDSCD : - mod->B4SOIwcdscd = value->rValue; - mod->B4SOIwcdscdGiven = TRUE; - break; - case B4SOI_MOD_WPCLM: - mod->B4SOIwpclm = value->rValue; - mod->B4SOIwpclmGiven = TRUE; - break; - case B4SOI_MOD_WPDIBL1: - mod->B4SOIwpdibl1 = value->rValue; - mod->B4SOIwpdibl1Given = TRUE; - break; - case B4SOI_MOD_WPDIBL2: - mod->B4SOIwpdibl2 = value->rValue; - mod->B4SOIwpdibl2Given = TRUE; - break; - case B4SOI_MOD_WPDIBLB: - mod->B4SOIwpdiblb = value->rValue; - mod->B4SOIwpdiblbGiven = TRUE; - break; - case B4SOI_MOD_WDROUT: - mod->B4SOIwdrout = value->rValue; - mod->B4SOIwdroutGiven = TRUE; - break; - case B4SOI_MOD_WPVAG: - mod->B4SOIwpvag = value->rValue; - mod->B4SOIwpvagGiven = TRUE; - break; - case B4SOI_MOD_WDELTA : - mod->B4SOIwdelta = value->rValue; - mod->B4SOIwdeltaGiven = TRUE; - break; - case B4SOI_MOD_WALPHA0 : - mod->B4SOIwalpha0 = value->rValue; - mod->B4SOIwalpha0Given = TRUE; - break; - case B4SOI_MOD_WFBJTII : - mod->B4SOIwfbjtii = value->rValue; - mod->B4SOIwfbjtiiGiven = TRUE; - break; - /*4.1 Iii model*/ - case B4SOI_MOD_WEBJTII : - mod->B4SOIwebjtii = value->rValue; - mod->B4SOIwebjtiiGiven = TRUE; - break; - case B4SOI_MOD_WCBJTII : - mod->B4SOIwcbjtii = value->rValue; - mod->B4SOIwcbjtiiGiven = TRUE; - break; - case B4SOI_MOD_WVBCI : - mod->B4SOIwvbci = value->rValue; - mod->B4SOIwvbciGiven = TRUE; - break; - case B4SOI_MOD_WABJTII : - mod->B4SOIwabjtii = value->rValue; - mod->B4SOIwabjtiiGiven = TRUE; - break; - case B4SOI_MOD_WMBJTII : - mod->B4SOIwmbjtii = value->rValue; - mod->B4SOIwmbjtiiGiven = TRUE; - break; - - case B4SOI_MOD_WBETA0 : - mod->B4SOIwbeta0 = value->rValue; - mod->B4SOIwbeta0Given = TRUE; - break; - case B4SOI_MOD_WBETA1 : - mod->B4SOIwbeta1 = value->rValue; - mod->B4SOIwbeta1Given = TRUE; - break; - case B4SOI_MOD_WBETA2 : - mod->B4SOIwbeta2 = value->rValue; - mod->B4SOIwbeta2Given = TRUE; - break; - case B4SOI_MOD_WVDSATII0 : - mod->B4SOIwvdsatii0 = value->rValue; - mod->B4SOIwvdsatii0Given = TRUE; - break; - case B4SOI_MOD_WLII : - mod->B4SOIwlii = value->rValue; - mod->B4SOIwliiGiven = TRUE; - break; - case B4SOI_MOD_WESATII : - mod->B4SOIwesatii = value->rValue; - mod->B4SOIwesatiiGiven = TRUE; - break; - case B4SOI_MOD_WSII0 : - mod->B4SOIwsii0 = value->rValue; - mod->B4SOIwsii0Given = TRUE; - break; - case B4SOI_MOD_WSII1 : - mod->B4SOIwsii1 = value->rValue; - mod->B4SOIwsii1Given = TRUE; - break; - case B4SOI_MOD_WSII2 : - mod->B4SOIwsii2 = value->rValue; - mod->B4SOIwsii2Given = TRUE; - break; - case B4SOI_MOD_WSIID : - mod->B4SOIwsiid = value->rValue; - mod->B4SOIwsiidGiven = TRUE; - break; - case B4SOI_MOD_WAGIDL : - mod->B4SOIwagidl = value->rValue; - mod->B4SOIwagidlGiven = TRUE; - break; - case B4SOI_MOD_WBGIDL : - mod->B4SOIwbgidl = value->rValue; - mod->B4SOIwbgidlGiven = TRUE; - break; - case B4SOI_MOD_WCGIDL : - mod->B4SOIwcgidl = value->rValue; - mod->B4SOIwcgidlGiven = TRUE; - break; - case B4SOI_MOD_WEGIDL : - mod->B4SOIwegidl = value->rValue; - mod->B4SOIwegidlGiven = TRUE; - break; - case B4SOI_MOD_WRGIDL : - mod->B4SOIwrgidl = value->rValue; - mod->B4SOIwrgidlGiven = TRUE; - break; - case B4SOI_MOD_WKGIDL : - mod->B4SOIwkgidl = value->rValue; - mod->B4SOIwkgidlGiven = TRUE; - break; - case B4SOI_MOD_WFGIDL : - mod->B4SOIwfgidl = value->rValue; - mod->B4SOIwfgidlGiven = TRUE; - break; - - - case B4SOI_MOD_WAGISL : - mod->B4SOIwagisl = value->rValue; - mod->B4SOIwagislGiven = TRUE; - break; - - case B4SOI_MOD_WBGISL : - mod->B4SOIwbgisl = value->rValue; - mod->B4SOIwbgislGiven = TRUE; - break; - - case B4SOI_MOD_WCGISL : - mod->B4SOIwcgisl = value->rValue; - mod->B4SOIwcgislGiven = TRUE; - break; - - case B4SOI_MOD_WEGISL : - mod->B4SOIwegisl = value->rValue; - mod->B4SOIwegislGiven = TRUE; - break; - - case B4SOI_MOD_WRGISL : - mod->B4SOIwrgisl = value->rValue; - mod->B4SOIwrgislGiven = TRUE; - break; - - case B4SOI_MOD_WKGISL : - mod->B4SOIwkgisl = value->rValue; - mod->B4SOIwkgislGiven = TRUE; - break; - - case B4SOI_MOD_WFGISL : - mod->B4SOIwfgisl = value->rValue; - mod->B4SOIwfgislGiven = TRUE; - break; - - - case B4SOI_MOD_WNTUNS : /* v4.0 */ - mod->B4SOIwntun = value->rValue; - mod->B4SOIwntunGiven = TRUE; - break; - case B4SOI_MOD_WNTUND : /* v4.0 */ - mod->B4SOIwntund = value->rValue; - mod->B4SOIwntundGiven = TRUE; - break; - case B4SOI_MOD_WNDIODES : /* v4.0 */ - mod->B4SOIwndiode = value->rValue; - mod->B4SOIwndiodeGiven = TRUE; - break; - case B4SOI_MOD_WNDIODED : /* v4.0 */ - mod->B4SOIwndioded = value->rValue; - mod->B4SOIwndiodedGiven = TRUE; - break; - case B4SOI_MOD_WNRECF0S : /* v4.0 */ - mod->B4SOIwnrecf0 = value->rValue; - mod->B4SOIwnrecf0Given = TRUE; - break; - case B4SOI_MOD_WNRECF0D : /* v4.0 */ - mod->B4SOIwnrecf0d = value->rValue; - mod->B4SOIwnrecf0dGiven = TRUE; - break; - case B4SOI_MOD_WNRECR0S : /* v4.0 */ - mod->B4SOIwnrecr0 = value->rValue; - mod->B4SOIwnrecr0Given = TRUE; - break; - case B4SOI_MOD_WNRECR0D : /* v4.0 */ - mod->B4SOIwnrecr0d = value->rValue; - mod->B4SOIwnrecr0dGiven = TRUE; - break; - case B4SOI_MOD_WISBJT : - mod->B4SOIwisbjt = value->rValue; - mod->B4SOIwisbjtGiven = TRUE; - break; - case B4SOI_MOD_WIDBJT : /* v4.0 */ - mod->B4SOIwidbjt = value->rValue; - mod->B4SOIwidbjtGiven = TRUE; - break; - case B4SOI_MOD_WISDIF : - mod->B4SOIwisdif = value->rValue; - mod->B4SOIwisdifGiven = TRUE; - break; - case B4SOI_MOD_WIDDIF : /* v4.0 */ - mod->B4SOIwiddif = value->rValue; - mod->B4SOIwiddifGiven = TRUE; - break; - case B4SOI_MOD_WISREC : - mod->B4SOIwisrec = value->rValue; - mod->B4SOIwisrecGiven = TRUE; - break; - case B4SOI_MOD_WIDREC : /* v4.0 */ - mod->B4SOIwidrec = value->rValue; - mod->B4SOIwidrecGiven = TRUE; - break; - case B4SOI_MOD_WISTUN : - mod->B4SOIwistun = value->rValue; - mod->B4SOIwistunGiven = TRUE; - break; - case B4SOI_MOD_WIDTUN : /* v4.0 */ - mod->B4SOIwidtun = value->rValue; - mod->B4SOIwidtunGiven = TRUE; - break; - case B4SOI_MOD_WVREC0S : /* v4.0 */ - mod->B4SOIwvrec0 = value->rValue; - mod->B4SOIwvrec0Given = TRUE; - break; - case B4SOI_MOD_WVREC0D : /* v4.0 */ - mod->B4SOIwvrec0d = value->rValue; - mod->B4SOIwvrec0dGiven = TRUE; - break; - case B4SOI_MOD_WVTUN0S : /* v4.0 */ - mod->B4SOIwvtun0 = value->rValue; - mod->B4SOIwvtun0Given = TRUE; - break; - case B4SOI_MOD_WVTUN0D : /* v4.0 */ - mod->B4SOIwvtun0d = value->rValue; - mod->B4SOIwvtun0dGiven = TRUE; - break; - case B4SOI_MOD_WNBJT : - mod->B4SOIwnbjt = value->rValue; - mod->B4SOIwnbjtGiven = TRUE; - break; - case B4SOI_MOD_WLBJT0 : - mod->B4SOIwlbjt0 = value->rValue; - mod->B4SOIwlbjt0Given = TRUE; - break; - case B4SOI_MOD_WVABJT : - mod->B4SOIwvabjt = value->rValue; - mod->B4SOIwvabjtGiven = TRUE; - break; - case B4SOI_MOD_WAELY : - mod->B4SOIwaely = value->rValue; - mod->B4SOIwaelyGiven = TRUE; - break; - case B4SOI_MOD_WAHLIS : /* v4.0 */ - mod->B4SOIwahli = value->rValue; - mod->B4SOIwahliGiven = TRUE; - break; - case B4SOI_MOD_WAHLID : /* v4.0 */ - mod->B4SOIwahlid = value->rValue; - mod->B4SOIwahlidGiven = TRUE; - break; - -/* v3.1 for RF */ - case B4SOI_MOD_WXRCRG1 : - mod->B4SOIwxrcrg1 = value->rValue; - mod->B4SOIwxrcrg1Given = TRUE; - break; - case B4SOI_MOD_WXRCRG2 : - mod->B4SOIwxrcrg2 = value->rValue; - mod->B4SOIwxrcrg2Given = TRUE; - break; -/* v3.1 for RF end */ - - /* CV Model */ - case B4SOI_MOD_WVSDFB : - mod->B4SOIwvsdfb = value->rValue; - mod->B4SOIwvsdfbGiven = TRUE; - break; - case B4SOI_MOD_WVSDTH : - mod->B4SOIwvsdth = value->rValue; - mod->B4SOIwvsdthGiven = TRUE; - break; - case B4SOI_MOD_WDELVT : - mod->B4SOIwdelvt = value->rValue; - mod->B4SOIwdelvtGiven = TRUE; - break; - case B4SOI_MOD_WACDE : - mod->B4SOIwacde = value->rValue; - mod->B4SOIwacdeGiven = TRUE; - break; - case B4SOI_MOD_WMOIN : - mod->B4SOIwmoin = value->rValue; - mod->B4SOIwmoinGiven = TRUE; - break; - case B4SOI_MOD_WNOFF : - mod->B4SOIwnoff = value->rValue; - mod->B4SOIwnoffGiven = TRUE; - break; /* v3.2 */ - - /* Cross-term Dependence */ -/* v3.1 */ - case B4SOI_MOD_PXJ : - mod->B4SOIpxj = value->rValue; - mod->B4SOIpxjGiven = TRUE; - break; - case B4SOI_MOD_PALPHAGB1 : - mod->B4SOIpalphaGB1 = value->rValue; - mod->B4SOIpalphaGB1Given = TRUE; - break; - case B4SOI_MOD_PALPHAGB2 : - mod->B4SOIpalphaGB2 = value->rValue; - mod->B4SOIpalphaGB2Given = TRUE; - break; - case B4SOI_MOD_PBETAGB1 : - mod->B4SOIpbetaGB1 = value->rValue; - mod->B4SOIpbetaGB1Given = TRUE; - break; - case B4SOI_MOD_PBETAGB2 : - mod->B4SOIpbetaGB2 = value->rValue; - mod->B4SOIpbetaGB2Given = TRUE; - break; - case B4SOI_MOD_PAIGBCP2 : - mod->B4SOIpaigbcp2 = value->rValue; - mod->B4SOIpaigbcp2Given = TRUE; - break; - case B4SOI_MOD_PBIGBCP2 : - mod->B4SOIpbigbcp2 = value->rValue; - mod->B4SOIpbigbcp2Given = TRUE; - break; - case B4SOI_MOD_PCIGBCP2 : - mod->B4SOIpcigbcp2 = value->rValue; - mod->B4SOIpcigbcp2Given = TRUE; - break; - case B4SOI_MOD_PNDIF : - mod->B4SOIpndif = value->rValue; - mod->B4SOIpndifGiven = TRUE; - break; - case B4SOI_MOD_PNTRECF : - mod->B4SOIpntrecf = value->rValue; - mod->B4SOIpntrecfGiven = TRUE; - break; - case B4SOI_MOD_PNTRECR : - mod->B4SOIpntrecr = value->rValue; - mod->B4SOIpntrecrGiven = TRUE; - break; - case B4SOI_MOD_PXBJT : - mod->B4SOIpxbjt = value->rValue; - mod->B4SOIpxbjtGiven = TRUE; - break; - case B4SOI_MOD_PXDIFS : - mod->B4SOIpxdif = value->rValue; - mod->B4SOIpxdifGiven = TRUE; - break; - case B4SOI_MOD_PXRECS : - mod->B4SOIpxrec = value->rValue; - mod->B4SOIpxrecGiven = TRUE; - break; - case B4SOI_MOD_PXTUNS : - mod->B4SOIpxtun = value->rValue; - mod->B4SOIpxtunGiven = TRUE; - break; - case B4SOI_MOD_PXDIFD : - mod->B4SOIpxdifd = value->rValue; - mod->B4SOIpxdifdGiven = TRUE; - break; - case B4SOI_MOD_PXRECD : - mod->B4SOIpxrecd = value->rValue; - mod->B4SOIpxrecdGiven = TRUE; - break; - case B4SOI_MOD_PXTUND : - mod->B4SOIpxtund = value->rValue; - mod->B4SOIpxtundGiven = TRUE; - break; - case B4SOI_MOD_PCGDL : - mod->B4SOIpcgdl = value->rValue; - mod->B4SOIpcgdlGiven = TRUE; - break; - case B4SOI_MOD_PCGSL : - mod->B4SOIpcgsl = value->rValue; - mod->B4SOIpcgslGiven = TRUE; - break; - case B4SOI_MOD_PCKAPPA : - mod->B4SOIpckappa = value->rValue; - mod->B4SOIpckappaGiven = TRUE; - break; - case B4SOI_MOD_PUTE : - mod->B4SOIpute = value->rValue; - mod->B4SOIputeGiven = TRUE; - break; - case B4SOI_MOD_PKT1 : - mod->B4SOIpkt1 = value->rValue; - mod->B4SOIpkt1Given = TRUE; - break; - case B4SOI_MOD_PKT2 : - mod->B4SOIpkt2 = value->rValue; - mod->B4SOIpkt2Given = TRUE; - break; - case B4SOI_MOD_PKT1L : - mod->B4SOIpkt1l = value->rValue; - mod->B4SOIpkt1lGiven = TRUE; - break; - case B4SOI_MOD_PUA1 : - mod->B4SOIpua1 = value->rValue; - mod->B4SOIpua1Given = TRUE; - break; - case B4SOI_MOD_PUB1 : - mod->B4SOIpub1 = value->rValue; - mod->B4SOIpub1Given = TRUE; - break; - case B4SOI_MOD_PUC1 : - mod->B4SOIpuc1 = value->rValue; - mod->B4SOIpuc1Given = TRUE; - break; - case B4SOI_MOD_PAT : - mod->B4SOIpat = value->rValue; - mod->B4SOIpatGiven = TRUE; - break; - case B4SOI_MOD_PPRT : - mod->B4SOIpprt = value->rValue; - mod->B4SOIpprtGiven = TRUE; - break; - -/* v3.0 */ - case B4SOI_MOD_PAIGC : - mod->B4SOIpaigc = value->rValue; - mod->B4SOIpaigcGiven = TRUE; - break; - case B4SOI_MOD_PBIGC : - mod->B4SOIpbigc = value->rValue; - mod->B4SOIpbigcGiven = TRUE; - break; - case B4SOI_MOD_PCIGC : - mod->B4SOIpcigc = value->rValue; - mod->B4SOIpcigcGiven = TRUE; - break; - case B4SOI_MOD_PAIGSD : - mod->B4SOIpaigsd = value->rValue; - mod->B4SOIpaigsdGiven = TRUE; - break; - case B4SOI_MOD_PBIGSD : - mod->B4SOIpbigsd = value->rValue; - mod->B4SOIpbigsdGiven = TRUE; - break; - case B4SOI_MOD_PCIGSD : - mod->B4SOIpcigsd = value->rValue; - mod->B4SOIpcigsdGiven = TRUE; - break; - case B4SOI_MOD_PNIGC : - mod->B4SOIpnigc = value->rValue; - mod->B4SOIpnigcGiven = TRUE; - break; - case B4SOI_MOD_PPIGCD : - mod->B4SOIppigcd = value->rValue; - mod->B4SOIppigcdGiven = TRUE; - break; - case B4SOI_MOD_PPOXEDGE : - mod->B4SOIppoxedge = value->rValue; - mod->B4SOIppoxedgeGiven = TRUE; - break; - - case B4SOI_MOD_PNPEAK: - mod->B4SOIpnpeak = value->rValue; - mod->B4SOIpnpeakGiven = TRUE; - break; - case B4SOI_MOD_PNSUB: - mod->B4SOIpnsub = value->rValue; - mod->B4SOIpnsubGiven = TRUE; - break; - case B4SOI_MOD_PNGATE: - mod->B4SOIpngate = value->rValue; - mod->B4SOIpngateGiven = TRUE; - break; - case B4SOI_MOD_PNSD: - mod->B4SOIpnsd = value->rValue; - mod->B4SOIpnsdGiven = TRUE; - break; - case B4SOI_MOD_PVTH0: - mod->B4SOIpvth0 = value->rValue; - mod->B4SOIpvth0Given = TRUE; - break; - case B4SOI_MOD_PVFB: - mod->B4SOIpvfb = value->rValue; - mod->B4SOIpvfbGiven = TRUE; - break; /* v4.1 */ - case B4SOI_MOD_PK1: - mod->B4SOIpk1 = value->rValue; - mod->B4SOIpk1Given = TRUE; - break; - case B4SOI_MOD_PK1W1: - mod->B4SOIpk1w1 = value->rValue; - mod->B4SOIpk1w1Given = TRUE; - break; - case B4SOI_MOD_PK1W2: - mod->B4SOIpk1w2 = value->rValue; - mod->B4SOIpk1w2Given = TRUE; - break; - case B4SOI_MOD_PK2: - mod->B4SOIpk2 = value->rValue; - mod->B4SOIpk2Given = TRUE; - break; - case B4SOI_MOD_PK3: - mod->B4SOIpk3 = value->rValue; - mod->B4SOIpk3Given = TRUE; - break; - case B4SOI_MOD_PK3B: - mod->B4SOIpk3b = value->rValue; - mod->B4SOIpk3bGiven = TRUE; - break; - case B4SOI_MOD_PKB1 : - mod->B4SOIpkb1 = value->rValue; - mod->B4SOIpkb1Given = TRUE; - break; - case B4SOI_MOD_PW0: - mod->B4SOIpw0 = value->rValue; - mod->B4SOIpw0Given = TRUE; - break; - case B4SOI_MOD_PLPE0: - mod->B4SOIplpe0 = value->rValue; - mod->B4SOIplpe0Given = TRUE; - break; - case B4SOI_MOD_PLPEB: /* v4.0 for Vth */ - mod->B4SOIplpeb = value->rValue; - mod->B4SOIplpebGiven = TRUE; - break; - case B4SOI_MOD_PDVT0: - mod->B4SOIpdvt0 = value->rValue; - mod->B4SOIpdvt0Given = TRUE; - break; - case B4SOI_MOD_PDVT1: - mod->B4SOIpdvt1 = value->rValue; - mod->B4SOIpdvt1Given = TRUE; - break; - case B4SOI_MOD_PDVT2: - mod->B4SOIpdvt2 = value->rValue; - mod->B4SOIpdvt2Given = TRUE; - break; - case B4SOI_MOD_PDVT0W: - mod->B4SOIpdvt0w = value->rValue; - mod->B4SOIpdvt0wGiven = TRUE; - break; - case B4SOI_MOD_PDVT1W: - mod->B4SOIpdvt1w = value->rValue; - mod->B4SOIpdvt1wGiven = TRUE; - break; - case B4SOI_MOD_PDVT2W: - mod->B4SOIpdvt2w = value->rValue; - mod->B4SOIpdvt2wGiven = TRUE; - break; - case B4SOI_MOD_PU0 : - mod->B4SOIpu0 = value->rValue; - mod->B4SOIpu0Given = TRUE; - break; - case B4SOI_MOD_PUA: - mod->B4SOIpua = value->rValue; - mod->B4SOIpuaGiven = TRUE; - break; - case B4SOI_MOD_PUB: - mod->B4SOIpub = value->rValue; - mod->B4SOIpubGiven = TRUE; - break; - case B4SOI_MOD_PUC: - mod->B4SOIpuc = value->rValue; - mod->B4SOIpucGiven = TRUE; - break; - case B4SOI_MOD_PVSAT: - mod->B4SOIpvsat = value->rValue; - mod->B4SOIpvsatGiven = TRUE; - break; - case B4SOI_MOD_PA0: - mod->B4SOIpa0 = value->rValue; - mod->B4SOIpa0Given = TRUE; - break; - case B4SOI_MOD_PAGS: - mod->B4SOIpags= value->rValue; - mod->B4SOIpagsGiven = TRUE; - break; - case B4SOI_MOD_PB0 : - mod->B4SOIpb0 = value->rValue; - mod->B4SOIpb0Given = TRUE; - break; - case B4SOI_MOD_PB1 : - mod->B4SOIpb1 = value->rValue; - mod->B4SOIpb1Given = TRUE; - break; - case B4SOI_MOD_PKETA: - mod->B4SOIpketa = value->rValue; - mod->B4SOIpketaGiven = TRUE; - break; - case B4SOI_MOD_PKETAS: - mod->B4SOIpketas = value->rValue; - mod->B4SOIpketasGiven = TRUE; - break; - case B4SOI_MOD_PA1: - mod->B4SOIpa1 = value->rValue; - mod->B4SOIpa1Given = TRUE; - break; - case B4SOI_MOD_PA2: - mod->B4SOIpa2 = value->rValue; - mod->B4SOIpa2Given = TRUE; - break; - case B4SOI_MOD_PRDSW: - mod->B4SOIprdsw = value->rValue; - mod->B4SOIprdswGiven = TRUE; - break; - case B4SOI_MOD_PRSW: - mod->B4SOIprsw = value->rValue; - mod->B4SOIprswGiven = TRUE; - break; - case B4SOI_MOD_PRDW: - mod->B4SOIprdw = value->rValue; - mod->B4SOIprdwGiven = TRUE; - break; - case B4SOI_MOD_PPRWB: - mod->B4SOIpprwb = value->rValue; - mod->B4SOIpprwbGiven = TRUE; - break; - case B4SOI_MOD_PPRWG: - mod->B4SOIpprwg = value->rValue; - mod->B4SOIpprwgGiven = TRUE; - break; - case B4SOI_MOD_PWR : - mod->B4SOIpwr = value->rValue; - mod->B4SOIpwrGiven = TRUE; - break; - case B4SOI_MOD_PNFACTOR : - mod->B4SOIpnfactor = value->rValue; - mod->B4SOIpnfactorGiven = TRUE; - break; - case B4SOI_MOD_PDWG : - mod->B4SOIpdwg = value->rValue; - mod->B4SOIpdwgGiven = TRUE; - break; - case B4SOI_MOD_PDWB : - mod->B4SOIpdwb = value->rValue; - mod->B4SOIpdwbGiven = TRUE; - break; - case B4SOI_MOD_PVOFF: - mod->B4SOIpvoff = value->rValue; - mod->B4SOIpvoffGiven = TRUE; - break; - case B4SOI_MOD_PETA0: - mod->B4SOIpeta0 = value->rValue; - mod->B4SOIpeta0Given = TRUE; - break; - case B4SOI_MOD_PETAB: - mod->B4SOIpetab = value->rValue; - mod->B4SOIpetabGiven = TRUE; - break; - case B4SOI_MOD_PDSUB: - mod->B4SOIpdsub = value->rValue; - mod->B4SOIpdsubGiven = TRUE; - break; - case B4SOI_MOD_PCIT : - mod->B4SOIpcit = value->rValue; - mod->B4SOIpcitGiven = TRUE; - break; - case B4SOI_MOD_PCDSC : - mod->B4SOIpcdsc = value->rValue; - mod->B4SOIpcdscGiven = TRUE; - break; - case B4SOI_MOD_PCDSCB : - mod->B4SOIpcdscb = value->rValue; - mod->B4SOIpcdscbGiven = TRUE; - break; - case B4SOI_MOD_PCDSCD : - mod->B4SOIpcdscd = value->rValue; - mod->B4SOIpcdscdGiven = TRUE; - break; - case B4SOI_MOD_PPCLM: - mod->B4SOIppclm = value->rValue; - mod->B4SOIppclmGiven = TRUE; - break; - case B4SOI_MOD_PPDIBL1: - mod->B4SOIppdibl1 = value->rValue; - mod->B4SOIppdibl1Given = TRUE; - break; - case B4SOI_MOD_PPDIBL2: - mod->B4SOIppdibl2 = value->rValue; - mod->B4SOIppdibl2Given = TRUE; - break; - case B4SOI_MOD_PPDIBLB: - mod->B4SOIppdiblb = value->rValue; - mod->B4SOIppdiblbGiven = TRUE; - break; - case B4SOI_MOD_PDROUT: - mod->B4SOIpdrout = value->rValue; - mod->B4SOIpdroutGiven = TRUE; - break; - case B4SOI_MOD_PPVAG: - mod->B4SOIppvag = value->rValue; - mod->B4SOIppvagGiven = TRUE; - break; - case B4SOI_MOD_PDELTA : - mod->B4SOIpdelta = value->rValue; - mod->B4SOIpdeltaGiven = TRUE; - break; - case B4SOI_MOD_PALPHA0 : - mod->B4SOIpalpha0 = value->rValue; - mod->B4SOIpalpha0Given = TRUE; - break; - case B4SOI_MOD_PFBJTII : - mod->B4SOIpfbjtii = value->rValue; - mod->B4SOIpfbjtiiGiven = TRUE; - break; - /*4.1 Iii model*/ - case B4SOI_MOD_PEBJTII : - mod->B4SOIpebjtii = value->rValue; - mod->B4SOIpebjtiiGiven = TRUE; - break; - case B4SOI_MOD_PCBJTII : - mod->B4SOIpcbjtii = value->rValue; - mod->B4SOIpcbjtiiGiven = TRUE; - break; - case B4SOI_MOD_PVBCI : - mod->B4SOIpvbci = value->rValue; - mod->B4SOIpvbciGiven = TRUE; - break; - case B4SOI_MOD_PABJTII : - mod->B4SOIpabjtii = value->rValue; - mod->B4SOIpabjtiiGiven = TRUE; - break; - case B4SOI_MOD_PMBJTII : - mod->B4SOIpmbjtii = value->rValue; - mod->B4SOIpmbjtiiGiven = TRUE; - break; - case B4SOI_MOD_PBETA0 : - mod->B4SOIpbeta0 = value->rValue; - mod->B4SOIpbeta0Given = TRUE; - break; - case B4SOI_MOD_PBETA1 : - mod->B4SOIpbeta1 = value->rValue; - mod->B4SOIpbeta1Given = TRUE; - break; - case B4SOI_MOD_PBETA2 : - mod->B4SOIpbeta2 = value->rValue; - mod->B4SOIpbeta2Given = TRUE; - break; - case B4SOI_MOD_PVDSATII0 : - mod->B4SOIpvdsatii0 = value->rValue; - mod->B4SOIpvdsatii0Given = TRUE; - break; - case B4SOI_MOD_PLII : - mod->B4SOIplii = value->rValue; - mod->B4SOIpliiGiven = TRUE; - break; - case B4SOI_MOD_PESATII : - mod->B4SOIpesatii = value->rValue; - mod->B4SOIpesatiiGiven = TRUE; - break; - case B4SOI_MOD_PSII0 : - mod->B4SOIpsii0 = value->rValue; - mod->B4SOIpsii0Given = TRUE; - break; - case B4SOI_MOD_PSII1 : - mod->B4SOIpsii1 = value->rValue; - mod->B4SOIpsii1Given = TRUE; - break; - case B4SOI_MOD_PSII2 : - mod->B4SOIpsii2 = value->rValue; - mod->B4SOIpsii2Given = TRUE; - break; - case B4SOI_MOD_PSIID : - mod->B4SOIpsiid = value->rValue; - mod->B4SOIpsiidGiven = TRUE; - break; - case B4SOI_MOD_PAGIDL : - mod->B4SOIpagidl = value->rValue; - mod->B4SOIpagidlGiven = TRUE; - break; - case B4SOI_MOD_PBGIDL : - mod->B4SOIpbgidl = value->rValue; - mod->B4SOIpbgidlGiven = TRUE; - break; - case B4SOI_MOD_PCGIDL : - mod->B4SOIpcgidl = value->rValue; - mod->B4SOIpcgidlGiven = TRUE; - break; - case B4SOI_MOD_PEGIDL : - mod->B4SOIpegidl = value->rValue; - mod->B4SOIpegidlGiven = TRUE; - break; - case B4SOI_MOD_PRGIDL : - mod->B4SOIprgidl = value->rValue; - mod->B4SOIprgidlGiven = TRUE; - break; - case B4SOI_MOD_PKGIDL : - mod->B4SOIpkgidl = value->rValue; - mod->B4SOIpkgidlGiven = TRUE; - break; - case B4SOI_MOD_PFGIDL : - mod->B4SOIpfgidl = value->rValue; - mod->B4SOIpfgidlGiven = TRUE; - break; - - case B4SOI_MOD_PAGISL : - mod->B4SOIpagisl = value->rValue; - mod->B4SOIpagislGiven = TRUE; - break; - case B4SOI_MOD_PBGISL : - mod->B4SOIpbgisl = value->rValue; - mod->B4SOIpbgislGiven = TRUE; - break; - case B4SOI_MOD_PCGISL : - mod->B4SOIpcgisl = value->rValue; - mod->B4SOIpcgislGiven = TRUE; - break; - case B4SOI_MOD_PEGISL : - mod->B4SOIpegisl = value->rValue; - mod->B4SOIpegislGiven = TRUE; - break; - case B4SOI_MOD_PRGISL : - mod->B4SOIprgisl = value->rValue; - mod->B4SOIprgislGiven = TRUE; - break; - case B4SOI_MOD_PKGISL : - mod->B4SOIpkgisl = value->rValue; - mod->B4SOIpkgislGiven = TRUE; - break; - case B4SOI_MOD_PFGISL : - mod->B4SOIpfgisl = value->rValue; - mod->B4SOIpfgislGiven = TRUE; - break; - case B4SOI_MOD_PNTUNS : /* v4.0 */ - mod->B4SOIpntun = value->rValue; - mod->B4SOIpntunGiven = TRUE; - break; - case B4SOI_MOD_PNTUND : /* v4.0 */ - mod->B4SOIpntund = value->rValue; - mod->B4SOIpntundGiven = TRUE; - break; - case B4SOI_MOD_PNDIODES : /* v4.0 */ - mod->B4SOIpndiode = value->rValue; - mod->B4SOIpndiodeGiven = TRUE; - break; - case B4SOI_MOD_PNDIODED : /* v4.0 */ - mod->B4SOIpndioded = value->rValue; - mod->B4SOIpndiodedGiven = TRUE; - break; - case B4SOI_MOD_PNRECF0S : /* v4.0 */ - mod->B4SOIpnrecf0 = value->rValue; - mod->B4SOIpnrecf0Given = TRUE; - break; - case B4SOI_MOD_PNRECF0D : /* v4.0 */ - mod->B4SOIpnrecf0d = value->rValue; - mod->B4SOIpnrecf0dGiven = TRUE; - break; - case B4SOI_MOD_PNRECR0S : /* v4.0 */ - mod->B4SOIpnrecr0 = value->rValue; - mod->B4SOIpnrecr0Given = TRUE; - break; - case B4SOI_MOD_PNRECR0D : /* v4.0 */ - mod->B4SOIpnrecr0d = value->rValue; - mod->B4SOIpnrecr0dGiven = TRUE; - break; - case B4SOI_MOD_PISBJT : - mod->B4SOIpisbjt = value->rValue; - mod->B4SOIpisbjtGiven = TRUE; - break; - case B4SOI_MOD_PIDBJT : /* v4.0 */ - mod->B4SOIpidbjt = value->rValue; - mod->B4SOIpidbjtGiven = TRUE; - break; - case B4SOI_MOD_PISDIF : - mod->B4SOIpisdif = value->rValue; - mod->B4SOIpisdifGiven = TRUE; - break; - case B4SOI_MOD_PIDDIF : /* v4.0 */ - mod->B4SOIpiddif = value->rValue; - mod->B4SOIpiddifGiven = TRUE; - break; - case B4SOI_MOD_PISREC : - mod->B4SOIpisrec = value->rValue; - mod->B4SOIpisrecGiven = TRUE; - break; - case B4SOI_MOD_PIDREC : /* v4.0 */ - mod->B4SOIpidrec = value->rValue; - mod->B4SOIpidrecGiven = TRUE; - break; - case B4SOI_MOD_PISTUN : - mod->B4SOIpistun = value->rValue; - mod->B4SOIpistunGiven = TRUE; - break; - case B4SOI_MOD_PIDTUN : /* v4.0 */ - mod->B4SOIpidtun = value->rValue; - mod->B4SOIpidtunGiven = TRUE; - break; - case B4SOI_MOD_PVREC0S : /* v4.0 */ - mod->B4SOIpvrec0 = value->rValue; - mod->B4SOIpvrec0Given = TRUE; - break; - case B4SOI_MOD_PVREC0D : /* v4.0 */ - mod->B4SOIpvrec0d = value->rValue; - mod->B4SOIpvrec0dGiven = TRUE; - break; - case B4SOI_MOD_PVTUN0S : /* v4.0 */ - mod->B4SOIpvtun0 = value->rValue; - mod->B4SOIpvtun0Given = TRUE; - break; - case B4SOI_MOD_PVTUN0D : /* v4.0 */ - mod->B4SOIpvtun0d = value->rValue; - mod->B4SOIpvtun0dGiven = TRUE; - break; - case B4SOI_MOD_PNBJT : - mod->B4SOIpnbjt = value->rValue; - mod->B4SOIpnbjtGiven = TRUE; - break; - case B4SOI_MOD_PLBJT0 : - mod->B4SOIplbjt0 = value->rValue; - mod->B4SOIplbjt0Given = TRUE; - break; - case B4SOI_MOD_PVABJT : - mod->B4SOIpvabjt = value->rValue; - mod->B4SOIpvabjtGiven = TRUE; - break; - case B4SOI_MOD_PAELY : - mod->B4SOIpaely = value->rValue; - mod->B4SOIpaelyGiven = TRUE; - break; - case B4SOI_MOD_PAHLIS : /* v4.0 */ - mod->B4SOIpahli = value->rValue; - mod->B4SOIpahliGiven = TRUE; - break; - case B4SOI_MOD_PAHLID : /* v4.0 */ - mod->B4SOIpahlid = value->rValue; - mod->B4SOIpahlidGiven = TRUE; - break; - -/* v3.1 for RF */ - case B4SOI_MOD_PXRCRG1 : - mod->B4SOIpxrcrg1 = value->rValue; - mod->B4SOIpxrcrg1Given = TRUE; - break; - case B4SOI_MOD_PXRCRG2 : - mod->B4SOIpxrcrg2 = value->rValue; - mod->B4SOIpxrcrg2Given = TRUE; - break; -/* v3.1 for RF end */ - - /* CV Model */ - case B4SOI_MOD_PVSDFB : - mod->B4SOIpvsdfb = value->rValue; - mod->B4SOIpvsdfbGiven = TRUE; - break; - case B4SOI_MOD_PVSDTH : - mod->B4SOIpvsdth = value->rValue; - mod->B4SOIpvsdthGiven = TRUE; - break; - case B4SOI_MOD_PDELVT : - mod->B4SOIpdelvt = value->rValue; - mod->B4SOIpdelvtGiven = TRUE; - break; - case B4SOI_MOD_PACDE : - mod->B4SOIpacde = value->rValue; - mod->B4SOIpacdeGiven = TRUE; - break; - case B4SOI_MOD_PMOIN : - mod->B4SOIpmoin = value->rValue; - mod->B4SOIpmoinGiven = TRUE; - break; - case B4SOI_MOD_PNOFF : - mod->B4SOIpnoff = value->rValue; - mod->B4SOIpnoffGiven = TRUE; - break; /* v3.2 */ -/* Added for binning - END */ - - /* 4.0 backward compatibility */ - case B4SOI_MOD_NLX: - mod->B4SOInlx = value->rValue; - mod->B4SOInlxGiven = TRUE; - break; - case B4SOI_MOD_LNLX: - mod->B4SOIlnlx = value->rValue; - mod->B4SOIlnlxGiven = TRUE; - break; - case B4SOI_MOD_WNLX: - mod->B4SOIwnlx = value->rValue; - mod->B4SOIwnlxGiven = TRUE; - break; - case B4SOI_MOD_PNLX: - mod->B4SOIpnlx = value->rValue; - mod->B4SOIpnlxGiven = TRUE; - break; - case B4SOI_MOD_NGIDL: - mod->B4SOIngidl = value->rValue; - mod->B4SOIngidlGiven = TRUE; - break; - case B4SOI_MOD_LNGIDL: - mod->B4SOIlngidl = value->rValue; - mod->B4SOIlngidlGiven = TRUE; - break; - case B4SOI_MOD_WNGIDL: - mod->B4SOIwngidl = value->rValue; - mod->B4SOIwngidlGiven = TRUE; - break; - case B4SOI_MOD_PNGIDL: - mod->B4SOIpngidl = value->rValue; - mod->B4SOIpngidlGiven = TRUE; - break; - - case B4SOI_MOD_VGS_MAX: - mod->B4SOIvgsMax = value->rValue; - mod->B4SOIvgsMaxGiven = TRUE; - break; - case B4SOI_MOD_VGD_MAX: - mod->B4SOIvgdMax = value->rValue; - mod->B4SOIvgdMaxGiven = TRUE; - break; - case B4SOI_MOD_VGB_MAX: - mod->B4SOIvgbMax = value->rValue; - mod->B4SOIvgbMaxGiven = TRUE; - break; - case B4SOI_MOD_VDS_MAX: - mod->B4SOIvdsMax = value->rValue; - mod->B4SOIvdsMaxGiven = TRUE; - break; - case B4SOI_MOD_VBS_MAX: - mod->B4SOIvbsMax = value->rValue; - mod->B4SOIvbsMaxGiven = TRUE; - break; - case B4SOI_MOD_VBD_MAX: - mod->B4SOIvbdMax = value->rValue; - mod->B4SOIvbdMaxGiven = TRUE; - break; - case B4SOI_MOD_VGSR_MAX: - mod->B4SOIvgsrMax = value->rValue; - mod->B4SOIvgsrMaxGiven = TRUE; - break; - case B4SOI_MOD_VGDR_MAX: - mod->B4SOIvgdrMax = value->rValue; - mod->B4SOIvgdrMaxGiven = TRUE; - break; - case B4SOI_MOD_VGBR_MAX: - mod->B4SOIvgbrMax = value->rValue; - mod->B4SOIvgbrMaxGiven = TRUE; - break; - case B4SOI_MOD_VBSR_MAX: - mod->B4SOIvbsrMax = value->rValue; - mod->B4SOIvbsrMaxGiven = TRUE; - break; - case B4SOI_MOD_VBDR_MAX: - mod->B4SOIvbdrMax = value->rValue; - mod->B4SOIvbdrMaxGiven = TRUE; - break; - - case B4SOI_MOD_NMOS : - if(value->iValue) { - mod->B4SOItype = 1; - mod->B4SOItypeGiven = TRUE; - } - break; - case B4SOI_MOD_PMOS : - if(value->iValue) { - mod->B4SOItype = - 1; - mod->B4SOItypeGiven = TRUE; - } - break; - default: - return(E_BADPARM); - } - return(OK); -} - - diff --git a/src/spicelib/devices/bsimsoi/b4soinoi.c b/src/spicelib/devices/bsimsoi/b4soinoi.c deleted file mode 100644 index b61f9b8d0..000000000 --- a/src/spicelib/devices/bsimsoi/b4soinoi.c +++ /dev/null @@ -1,601 +0,0 @@ -/*** B4SOI 12/16/2010 Released by Tanvir Morshed ***/ - - -/********** - * Copyright 2010 Regents of the University of California. All rights reserved. - * Authors: 1998 Samuel Fung, Dennis Sinitsky and Stephen Tang - * Authors: 1999-2004 Pin Su, Hui Wan, Wei Jin, b3soinoi.c - * Authors: 2005- Hui Wan, Xuemei Xi, Ali Niknejad, Chenming Hu. - * Authors: 2009- Wenwei Yang, Chung-Hsun Lin, Ali Niknejad, Chenming Hu. - * File: b4soinoi.c - * Modified by Hui Wan, Xuemei Xi 11/30/2005 - * Modified by Wenwei Yang, Chung-Hsun Lin, Darsen Lu 03/06/2009 - * Modified by Tanvir Morshed 09/22/2009 - * Modified by Tanvir Morshed 12/31/2009 - **********/ - -#include "ngspice/ngspice.h" -#include "b4soidef.h" -#include "ngspice/cktdefs.h" -#include "ngspice/iferrmsg.h" -#include "ngspice/noisedef.h" -#include "ngspice/suffix.h" -#include "ngspice/const.h" /* jwan */ - -/* - * B4SOInoise (mode, operation, firstModel, ckt, data, OnDens) - * This routine names and evaluates all of the noise sources - * associated with MOSFET's. It starts with the model *firstModel and - * traverses all of its insts. It then proceeds to any other models - * on the linked list. The total output noise density generated by - * all of the MOSFET's is summed with the variable "OnDens". - */ - -/* - Channel thermal and flicker noises are calculated based on the value - of model->B4SOItnoiMod and model->B4SOIfnoiMod - If model->B4SOItnoiMod = 0, - Channel thermal noise = Charge based model - If model->B4SOItnoiMod = 1, - Channel thermal noise = Holistic noise model - If model->B4SOItnoiMod = 2, - Channel thermal noise = SPICE2 model - If model->B4SOIfnoiMod = 0, - Flicker noise = Simple model - If model->B4SOIfnoiMod = 1, - Flicker noise = Unified model -*/ - -static double -B4SOIEval1ovFNoise( -double vds, -B4SOImodel *model, -B4SOIinstance *here, -double freq, double temp) -{ -struct b4soiSizeDependParam *pParam; -double cd, esat, DelClm, EffFreq, N0, Nl; -double T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, Ssi; - - pParam = here->pParam; - cd = fabs(here->B4SOIcd); - esat = 2.0 * here->B4SOIvsattemp / here->B4SOIueff; -/* v2.2.3 bug fix */ - if(model->B4SOIem<=0.0) DelClm = 0.0; - else { - T0 = ((((vds - here->B4SOIVdseff) / pParam->B4SOIlitl) - + model->B4SOIem) / esat); - DelClm = pParam->B4SOIlitl * log (MAX(T0, N_MINLOG)); - } - - EffFreq = pow(freq, model->B4SOIef); - T1 = CHARGE * CHARGE * CONSTboltz * cd * temp * here->B4SOIueff; - T2 = 1.0e10 * EffFreq * here->B4SOIAbulk * model->B4SOIcox - * pParam->B4SOIleff * pParam->B4SOIleff; - -/* v2.2.3 bug fix */ - N0 = model->B4SOIcox * here->B4SOIVgsteff / CHARGE; - Nl = model->B4SOIcox * here->B4SOIVgsteff - * (1.0 - here->B4SOIAbovVgst2Vtm * here->B4SOIVdseff) / CHARGE; - - T3 = model->B4SOIoxideTrapDensityA - * log(MAX(((N0 + here->B4SOInstar) / (Nl + here->B4SOInstar)), N_MINLOG)); - T4 = model->B4SOIoxideTrapDensityB * (N0 - Nl); - T5 = model->B4SOIoxideTrapDensityC * 0.5 * (N0 * N0 - Nl * Nl); - - T6 = CONSTboltz * temp * cd * cd; - T7 = 1.0e10 * EffFreq * pParam->B4SOIleff - * pParam->B4SOIleff * pParam->B4SOIweff * here->B4SOInf; - T8 = model->B4SOIoxideTrapDensityA + model->B4SOIoxideTrapDensityB * Nl - + model->B4SOIoxideTrapDensityC * Nl * Nl; - T9 = (Nl + here->B4SOInstar) * (Nl + here->B4SOInstar); - - Ssi = T1 / T2 * (T3 + T4 + T5) + T6 / T7 * DelClm * T8 / T9; - - return Ssi; -} - -int -B4SOInoise ( -int mode, int operation, -GENmodel *inModel, -CKTcircuit *ckt, -Ndata *data, -double *OnDens) -{ -register B4SOImodel *model = (B4SOImodel *)inModel; -register B4SOIinstance *here; -struct b4soiSizeDependParam *pParam; -double tempOnoise; -double tempInoise; -double noizDens[B4SOINSRCS]; -double lnNdens[B4SOINSRCS]; - -double vgs, vds; -double T0, T1, T2, T5, T10, T11; -double Ssi, Swi; - -/* v3.2 */ -double npart_theta, npart_beta, igsquare, esat; -/* v3.2 end */ -double gspr, gdpr; -double tempRatioSH, Vdseffovcd; /* v4.2 bugfix */ - -int i; - -double m; - - /* define the names of the noise sources */ - static char *B4SOInNames[B4SOINSRCS] = - { /* Note that we have to keep the order */ - ".rd", /* noise due to rd */ - /* consistent with the index definitions */ - ".rs", /* noise due to rs */ - /* in B4SOIdefs.h */ - ".rg", /* noise due to rgeltd, v3.2 */ - ".id", /* noise due to id */ - ".1overf", /* flicker (1/f) noise */ - ".fb_ibs", /* noise due to floating body by ibs */ - ".fb_ibd", /* noise due to floating body by ibd */ - ".igs", /* shot noise due to IGS, v3.2 */ - ".igd", /* shot noise due to IGD, v3.2 */ - ".igb", /* shot noise due to IGB, v3.2 */ - ".rbsb", /* noise due to rbsb v4.0 */ - ".rbdb", /* noise due to rbdb v4.0 */ - ".rbody", /* noise due to body contact v4.0 */ - - "" /* total transistor noise */ - }; - - for (; model != NULL; model = B4SOInextModel(model)) - { for (here = B4SOIinstances(model); here != NULL; - here = B4SOInextInstance(here)) - { - m = here->B4SOIm; - - pParam = here->pParam; - switch (operation) - { case N_OPEN: - /* see if we have to to produce a summary report */ - /* if so, name all the noise generators */ - - if (((NOISEAN*)ckt->CKTcurJob)->NStpsSm != 0) - { switch (mode) - { case N_DENS: - for (i = 0; i < B4SOINSRCS; i++) - { NOISE_ADD_OUTVAR(ckt, data, "onoise.%s%s", here->B4SOIname, B4SOInNames[i]); - } - break; - case INT_NOIZ: - for (i = 0; i < B4SOINSRCS; i++) - { NOISE_ADD_OUTVAR(ckt, data, "onoise_total.%s%s", here->B4SOIname, B4SOInNames[i]); - NOISE_ADD_OUTVAR(ckt, data, "inoise_total.%s%s", here->B4SOIname, B4SOInNames[i]); - } - break; - } - } - break; - case N_CALC: - switch (mode) - { case N_DENS: - /*v4.2 implementing SH temp */ - if ((model->B4SOIshMod == 1) && (here->B4SOIrth0 != 0.0)) - tempRatioSH = here->B4SOITempSH / ckt->CKTtemp; - else - tempRatioSH = 1.0; - /*v4.2 implementing limit on Vdseffovcd*/ - if (here->B4SOIcd != 0) - { - Vdseffovcd = here->B4SOIVdseff / here->B4SOIcd; - if (Vdseffovcd >= 1.0e9) Vdseffovcd = 1.0e9 ; - } - else - Vdseffovcd = 1.0e9; - /* if (model->B4SOItnoiMod == 0) *//* v4.0 */ /* v4.2 bugfix: consider tnoiMod = 2*/ - if (model->B4SOItnoiMod != 1) - { if (model->B4SOIrdsMod == 0) - { gspr = here->B4SOIsourceConductance; - gdpr = here->B4SOIdrainConductance; - } - else - { gspr = here->B4SOIgstot; - gdpr = here->B4SOIgdtot; - } - } - else - { - esat = 2.0 * here->B4SOIvsattemp / here->B4SOIueff; - T5 = here->B4SOIVgsteff / esat - / pParam->B4SOIleff; - T5 *= T5; - npart_beta = model->B4SOIrnoia * (1.0 + - T5 * model->B4SOItnoia * - pParam->B4SOIleff); - npart_theta = model->B4SOIrnoib * (1.0 + - T5 * model->B4SOItnoib * - pParam->B4SOIleff); - - /* v4.2 bugfix: implement bugfix from bsim4.6.2 */ - if(npart_theta > 0.9) - npart_theta = 0.9; - if(npart_theta > 0.9 * npart_beta) - npart_theta = 0.9 * npart_beta; - - - if (model->B4SOIrdsMod == 0) - { gspr = here->B4SOIsourceConductance; - gdpr = here->B4SOIdrainConductance; - } - else - { gspr = here->B4SOIgstot; - gdpr = here->B4SOIgdtot; - } - if ( (*(ckt->CKTstates[0] + here->B4SOIvds)) - >= 0.0 ) - gspr = gspr * (1.0 + npart_theta - * npart_theta * gspr - / here->B4SOIidovVds); - else - gdpr = gdpr * (1.0 + npart_theta - * npart_theta * gdpr - / here->B4SOIidovVds); - } - - NevalSrc(&noizDens[B4SOIRDNOIZ], - &lnNdens[B4SOIRDNOIZ], ckt, THERMNOISE, - here->B4SOIdNodePrime, here->B4SOIdNode, - gdpr * tempRatioSH * m); /* v4.2 self-heating temp */ - - NevalSrc(&noizDens[B4SOIRSNOIZ], - &lnNdens[B4SOIRSNOIZ], ckt, THERMNOISE, - here->B4SOIsNodePrime, here->B4SOIsNode, - gspr * tempRatioSH * m); /* v4.2 self-heating temp */ - - /* v4.2 bugfix: implement correct thermal noise model (bsim4.6.0)*/ - /* if ((here->B4SOIrgateMod == 1) || - (here->B4SOIrgateMod == 2)) */ - if (here->B4SOIrgateMod == 1) - { NevalSrc(&noizDens[B4SOIRGNOIZ], - &lnNdens[B4SOIRGNOIZ], ckt, THERMNOISE, - here->B4SOIgNode, - here->B4SOIgNodeExt, - here->B4SOIgrgeltd * tempRatioSH * m); /* v4.2 self-heating temp */ - } - else if (here->B4SOIrgateMod == 2) /*v4.2*/ - { - T0 = 1.0 + here->B4SOIgrgeltd/here->B4SOIgcrg; - T1 = T0 * T0; - NevalSrc(&noizDens[B4SOIRGNOIZ], - &lnNdens[B4SOIRGNOIZ], ckt, THERMNOISE, - here->B4SOIgNode, - here->B4SOIgNodeExt, - here->B4SOIgrgeltd/T1 * tempRatioSH * m); /*v4.2*/ - } - else if (here->B4SOIrgateMod == 3) - { NevalSrc(&noizDens[B4SOIRGNOIZ], - &lnNdens[B4SOIRGNOIZ], ckt, THERMNOISE, - here->B4SOIgNodeMid, - here->B4SOIgNodeExt, - here->B4SOIgrgeltd * tempRatioSH * m); /* v4.2 self-heating temp */ - } - else - { noizDens[B4SOIRGNOIZ] = 0.0; - lnNdens[B4SOIRGNOIZ] = - log(MAX(noizDens[B4SOIRGNOIZ], - N_MINLOG)); - } - - if (here->B4SOIrbodyMod) - { - NevalSrc(&noizDens[B4SOIRBSBNOIZ], - &lnNdens[B4SOIRBSBNOIZ], ckt, THERMNOISE, - here->B4SOIbNode, here->B4SOIsbNode, - here->B4SOIgrbsb * m); - NevalSrc(&noizDens[B4SOIRBDBNOIZ], - &lnNdens[B4SOIRBDBNOIZ], ckt, THERMNOISE, - here->B4SOIbNode, here->B4SOIdbNode, - here->B4SOIgrbdb * tempRatioSH * m); /* v4.2 self-heating temp */ - } - else - { noizDens[B4SOIRBSBNOIZ] = 0.0; - noizDens[B4SOIRBDBNOIZ] = 0.0; - lnNdens[B4SOIRBSBNOIZ] = - log(MAX(noizDens[B4SOIRBSBNOIZ], N_MINLOG)); - lnNdens[B4SOIRBDBNOIZ] = - log(MAX(noizDens[B4SOIRBDBNOIZ], N_MINLOG)); - } - - if (here->B4SOIbodyMod == 1) - { - NevalSrc(&noizDens[B4SOIRBODYNOIZ], - &lnNdens[B4SOIRBODYNOIZ], ckt, THERMNOISE, - here->B4SOIbNode, here->B4SOIpNode, - tempRatioSH / (here->B4SOIrbodyext + /* v4.2 self-heating temp */ - pParam->B4SOIrbody) * m); - } - else - { noizDens[B4SOIRBODYNOIZ] = 0.0; - lnNdens[B4SOIRBODYNOIZ] = - log(MAX(noizDens[B4SOIRBODYNOIZ], N_MINLOG)); - } - - switch( model->B4SOItnoiMod ) - { - case 0: - NevalSrc(&noizDens[B4SOIIDNOIZ], - &lnNdens[B4SOIIDNOIZ], ckt, - THERMNOISE, - here->B4SOIdNodePrime, - here->B4SOIsNodePrime, - (here->B4SOIueff - * fabs(here->B4SOIqinv - / (pParam->B4SOIleff - * pParam->B4SOIleff - + here->B4SOIueff*fabs - (here->B4SOIqinv) - * here->B4SOIrds))) - * tempRatioSH /* v4.2 self-heating temp */ - * model->B4SOIntnoi * m ); - break; - -/* v2.2.3 bug fix */ - case 1: - T0 = here->B4SOIgm + here->B4SOIgmbs + - here->B4SOIgds; - T0 *= T0; - esat = 2.0 * here->B4SOIvsattemp / - here->B4SOIueff; - T5 = here->B4SOIVgsteff / esat / - pParam->B4SOIleff; - T5 *= T5; - npart_beta = model->B4SOIrnoia * (1.0 + - T5 * model->B4SOItnoia * - pParam->B4SOIleff); - npart_theta = model->B4SOIrnoib * (1.0 + - T5 * model->B4SOItnoib * - pParam->B4SOIleff); - /*igsquare = npart_theta * npart_theta * - T0 * here->B4SOIVdseff / here->B4SOIcd; v4.2 implementing limit on Vdseffovcd*/ - igsquare = npart_theta * npart_theta * T0 * Vdseffovcd; - T1 = npart_beta * (here->B4SOIgm - + here->B4SOIgmbs) + here->B4SOIgds; - /*T2 = T1 * T1 * here->B4SOIVdseff / here->B4SOIcd; v4.2 implementing limit on Vdseffovcd*/ - T2 = T1 * T1 * Vdseffovcd; - NevalSrc(&noizDens[B4SOIIDNOIZ], - &lnNdens[B4SOIIDNOIZ], ckt, - THERMNOISE, - here->B4SOIdNodePrime, - here->B4SOIsNodePrime, - /* (T2 - igsquare)); */ - (T2 - igsquare) * tempRatioSH * m); /* v4.2 self-heating temp */ - break; - - case 2: - NevalSrc(&noizDens[B4SOIIDNOIZ], - &lnNdens[B4SOIIDNOIZ], ckt, - THERMNOISE, - here->B4SOIdNodePrime, - here->B4SOIsNodePrime, - model->B4SOIntnoi * - tempRatioSH * /* v4.2 self-heating temp */ - (2.0 / 3.0 * fabs(here->B4SOIgm - + here->B4SOIgds - + here->B4SOIgmbs)) * m); - break; - } - - NevalSrc(&noizDens[B4SOIFLNOIZ], (double*) NULL, - ckt, N_GAIN, here->B4SOIdNodePrime, - here->B4SOIsNodePrime, (double) 0.0); - - switch( model->B4SOIfnoiMod ) - { case 0: - if (model->B4SOIw0flk > 0) { /* v4.0 */ - noizDens[B4SOIFLNOIZ] *= m * here->B4SOInf - * pParam->B4SOIweff/model->B4SOIw0flk - * model->B4SOIkf * exp(model->B4SOIaf - * log(MAX(fabs(here->B4SOIcd - / pParam->B4SOIweff / here->B4SOInf - * model->B4SOIw0flk), N_MINLOG))) - / (pow(data->freq, model->B4SOIef) - * pow(pParam->B4SOIleff, - model->B4SOIbf) * model->B4SOIcox); - break; - } - else { - noizDens[B4SOIFLNOIZ] *= - m * model->B4SOIkf * exp(model->B4SOIaf - * log(MAX(fabs(here->B4SOIcd), N_MINLOG))) - / (pow(data->freq, model->B4SOIef) - * pow(pParam->B4SOIleff, - model->B4SOIbf) * model->B4SOIcox); - break; - } - case 1: - vgs = *(ckt->CKTstates[0] + here->B4SOIvgs); - vds = *(ckt->CKTstates[0] + here->B4SOIvds); - if (vds < 0.0) - { vds = -vds; - vgs = vgs + vds; - } - /*v4.2 implementing SH temp */ - if ((model->B4SOIshMod == 1) && (here->B4SOIrth0 != 0.0)) - Ssi = B4SOIEval1ovFNoise(vds, model, here, - data->freq, here->B4SOITempSH); - else - Ssi = B4SOIEval1ovFNoise(vds, model, here, - data->freq, ckt->CKTtemp); /*v4.2 implementing SH temp */ - - /*v4.2 implementing SH temp */ - if ((model->B4SOIshMod == 1) && (here->B4SOIrth0 != 0.0)) - T10 = model->B4SOIoxideTrapDensityA - * CONSTboltz * here->B4SOITempSH; - else - T10 = model->B4SOIoxideTrapDensityA - * CONSTboltz * ckt->CKTtemp; /*v4.2 implementing SH temp */ - - T11 = pParam->B4SOIweff * here->B4SOInf - * pParam->B4SOIleff - * pow(data->freq, model->B4SOIef) - * 1.0e10 * here->B4SOInstar - * here->B4SOInstar ; - Swi = T10 / T11 * here->B4SOIcd - * here->B4SOIcd; - T1 = Swi + Ssi; - if (T1 > 0.0) - noizDens[B4SOIFLNOIZ] *= m * (Ssi - * Swi) / T1; - else - noizDens[B4SOIFLNOIZ] *= 0.0; - break; - } - - lnNdens[B4SOIFLNOIZ] = - log(MAX(noizDens[B4SOIFLNOIZ], N_MINLOG)); - - /* v3.2 for gate tunneling shot noise */ - NevalSrc(&noizDens[B4SOIIGSNOIZ], - &lnNdens[B4SOIIGSNOIZ], ckt, SHOTNOISE, - here->B4SOIgNode, here->B4SOIsNodePrime, - (here->B4SOIIgs + here->B4SOIIgcs) * m); - - NevalSrc(&noizDens[B4SOIIGDNOIZ], - &lnNdens[B4SOIIGDNOIZ], ckt, SHOTNOISE, - here->B4SOIgNode, here->B4SOIdNodePrime, - (here->B4SOIIgd + here->B4SOIIgcd) * m); - - NevalSrc(&noizDens[B4SOIIGBNOIZ], - &lnNdens[B4SOIIGBNOIZ], ckt, SHOTNOISE, - here->B4SOIgNode, here->B4SOIbNode, - here->B4SOIig * m); - /* v3.2 for gate tunneling shot noise end */ - - /* Low frequency excess noise due to FBE */ -/* NevalSrc(&noizDens[B4SOIFBNOIZ], - &lnNdens[B4SOIFBNOIZ], ckt, SHOTNOISE, - here->B4SOIsNodePrime, here->B4SOIbNode, - 2.0 * model->B4SOInoif * here->B4SOIibs); */ -/* v4.0 */ - NevalSrc(&noizDens[B4SOIFB_IBSNOIZ], - &lnNdens[B4SOIFB_IBSNOIZ], ckt, SHOTNOISE, - here->B4SOIsNodePrime, here->B4SOIbNode, - model->B4SOInoif * here->B4SOIibs * m); - - /* NevalSrc(&noizDens[B4SOIFB_IBDNOIZ], - &lnNdens[B4SOIFB_IBDNOIZ], ckt, SHOTNOISE, - here->B4SOIdNodePrime, here->B4SOIbNode, - model->B4SOInoif * fabs(here->B4SOIibd)); */ /*v4.2*/ - - NevalSrc(&noizDens[B4SOIFB_IBDNOIZ], - &lnNdens[B4SOIFB_IBDNOIZ], ckt, SHOTNOISE, - here->B4SOIdNodePrime, here->B4SOIbNode, - model->B4SOInoif * (here->B4SOIibd) * m); /*v4.2 extra fabs()removed */ - - noizDens[B4SOITOTNOIZ] = noizDens[B4SOIRDNOIZ] - + noizDens[B4SOIRSNOIZ] - + noizDens[B4SOIRGNOIZ] - + noizDens[B4SOIIDNOIZ] - + noizDens[B4SOIFLNOIZ] - /* + noizDens[B4SOIFBNOIZ] */ - + noizDens[B4SOIFB_IBSNOIZ] - + noizDens[B4SOIFB_IBDNOIZ] - + noizDens[B4SOIIGSNOIZ] - + noizDens[B4SOIIGDNOIZ] - + noizDens[B4SOIIGBNOIZ] - + noizDens[B4SOIRBSBNOIZ] - + noizDens[B4SOIRBDBNOIZ] - + noizDens[B4SOIRBODYNOIZ]; - lnNdens[B4SOITOTNOIZ] = - log(MAX(noizDens[B4SOITOTNOIZ], N_MINLOG)); - - *OnDens += noizDens[B4SOITOTNOIZ]; - - if (data->delFreq == 0.0) - { /* if we haven't done any previous - integration, we need to initialize our - "history" variables. - */ - - for (i = 0; i < B4SOINSRCS; i++) - { here->B4SOInVar[LNLSTDENS][i] = - lnNdens[i]; - } - - /* clear out our integration variables - if it's the first pass - */ - if (data->freq == - ((NOISEAN*) ckt->CKTcurJob)->NstartFreq) - { for (i = 0; i < B4SOINSRCS; i++) - { here->B4SOInVar[OUTNOIZ][i] = 0.0; - here->B4SOInVar[INNOIZ][i] = 0.0; - } - } - } - else - { /* data->delFreq != 0.0, - we have to integrate. - */ - for (i = 0; i < B4SOINSRCS; i++) - { if (i != B4SOITOTNOIZ) - { tempOnoise = Nintegrate(noizDens[i], - lnNdens[i], - here->B4SOInVar[LNLSTDENS][i], - data); - tempInoise = Nintegrate(noizDens[i] - * data->GainSqInv, lnNdens[i] - + data->lnGainInv, - here->B4SOInVar[LNLSTDENS][i] - + data->lnGainInv, data); - here->B4SOInVar[LNLSTDENS][i] = - lnNdens[i]; - data->outNoiz += tempOnoise; - data->inNoise += tempInoise; - if (((NOISEAN*) - ckt->CKTcurJob)->NStpsSm != 0) - { here->B4SOInVar[OUTNOIZ][i] - += tempOnoise; - here->B4SOInVar[OUTNOIZ][B4SOITOTNOIZ] - += tempOnoise; - here->B4SOInVar[INNOIZ][i] - += tempInoise; - here->B4SOInVar[INNOIZ][B4SOITOTNOIZ] - += tempInoise; - } - } - } - } - if (data->prtSummary) - { for (i = 0; i < B4SOINSRCS; i++) - { /* print a summary report */ - data->outpVector[data->outNumber++] - = noizDens[i]; - } - } - break; - case INT_NOIZ: - /* already calculated, just output */ - if (((NOISEAN*)ckt->CKTcurJob)->NStpsSm != 0) - { for (i = 0; i < B4SOINSRCS; i++) - { data->outpVector[data->outNumber++] - = here->B4SOInVar[OUTNOIZ][i]; - data->outpVector[data->outNumber++] - = here->B4SOInVar[INNOIZ][i]; - } - } - break; - } - break; - case N_CLOSE: - /* do nothing, the main calling routine will close */ - return (OK); - break; /* the plots */ - } /* switch (operation) */ - } /* for here */ - } /* for model */ - - return(OK); -} - - - diff --git a/src/spicelib/devices/bsimsoi/b4soipar.c b/src/spicelib/devices/bsimsoi/b4soipar.c deleted file mode 100644 index 3bd5bce75..000000000 --- a/src/spicelib/devices/bsimsoi/b4soipar.c +++ /dev/null @@ -1,251 +0,0 @@ -/*** B4SOI 12/16/2010 Released by Tanvir Morshed ***/ - - -/********** - * Copyright 2010 Regents of the University of California. All rights reserved. - * Authors: 1998 Samuel Fung, Dennis Sinitsky and Stephen Tang - * Authors: 1999-2004 Pin Su, Hui Wan, Wei Jin, b3soipar.c - * Authors: 2005- Hui Wan, Xuemei Xi, Ali Niknejad, Chenming Hu. - * Authors: 2009- Wenwei Yang, Chung-Hsun Lin, Ali Niknejad, Chenming Hu. - * File: b4soipar.c - * Modified by Hui Wan, Xuemei Xi 11/30/2005 - * Modified by Wenwei Yang, Chung-Hsun Lin, Darsen Lu 03/06/2009 - * Modified by Tanvir Morshed 09/22/2009 - * Modified by Tanvir Morshed 12/31/2009 - **********/ - -#include "ngspice/ngspice.h" -#include "ngspice/ifsim.h" -#include "b4soidef.h" -#include "ngspice/sperror.h" -#include "ngspice/suffix.h" -#include "ngspice/fteext.h" - -int -B4SOIparam( -int param, -IFvalue *value, -GENinstance *inst, -IFvalue *select) -{ - double scale; - - B4SOIinstance *here = (B4SOIinstance*)inst; - - NG_IGNORE(select); - - if (!cp_getvar("scale", CP_REAL, &scale, 0)) - scale = 1; - - switch(param) - { case B4SOI_W: - here->B4SOIw = value->rValue * scale; - here->B4SOIwGiven = TRUE; - break; - case B4SOI_L: - here->B4SOIl = value->rValue * scale; - here->B4SOIlGiven = TRUE; - break; - case B4SOI_M: - here->B4SOIm = value->rValue; - here->B4SOImGiven = TRUE; - break; - case B4SOI_AS: - here->B4SOIsourceArea = value->rValue * scale * scale; - here->B4SOIsourceAreaGiven = TRUE; - break; - case B4SOI_AD: - here->B4SOIdrainArea = value->rValue * scale * scale; - here->B4SOIdrainAreaGiven = TRUE; - break; - case B4SOI_PS: - here->B4SOIsourcePerimeter = value->rValue * scale; - here->B4SOIsourcePerimeterGiven = TRUE; - break; - case B4SOI_PD: - here->B4SOIdrainPerimeter = value->rValue * scale; - here->B4SOIdrainPerimeterGiven = TRUE; - break; - case B4SOI_NRS: - here->B4SOIsourceSquares = value->rValue; - here->B4SOIsourceSquaresGiven = TRUE; - break; - case B4SOI_NRD: - here->B4SOIdrainSquares = value->rValue; - here->B4SOIdrainSquaresGiven = TRUE; - break; - case B4SOI_OFF: - here->B4SOIoff = value->iValue; - here->B4SOIoffGiven = TRUE; - break; - case B4SOI_IC_VBS: - here->B4SOIicVBS = value->rValue; - here->B4SOIicVBSGiven = TRUE; - break; - case B4SOI_IC_VDS: - here->B4SOIicVDS = value->rValue; - here->B4SOIicVDSGiven = TRUE; - break; - case B4SOI_IC_VGS: - here->B4SOIicVGS = value->rValue; - here->B4SOIicVGSGiven = TRUE; - break; - case B4SOI_IC_VES: - here->B4SOIicVES = value->rValue; - here->B4SOIicVESGiven = TRUE; - break; - case B4SOI_IC_VPS: - here->B4SOIicVPS = value->rValue; - here->B4SOIicVPSGiven = TRUE; - break; - case B4SOI_BJTOFF: - here->B4SOIbjtoff = value->iValue; - here->B4SOIbjtoffGiven= TRUE; - break; - case B4SOI_DEBUG: - here->B4SOIdebugMod = value->iValue; - here->B4SOIdebugModGiven= TRUE; - break; - case B4SOI_RTH0: - here->B4SOIrth0= value->rValue; - here->B4SOIrth0Given = TRUE; - break; - case B4SOI_CTH0: - here->B4SOIcth0= value->rValue; - here->B4SOIcth0Given = TRUE; - break; - case B4SOI_NRB: - here->B4SOIbodySquares = value->rValue; - here->B4SOIbodySquaresGiven = TRUE; - break; - case B4SOI_FRBODY: - here->B4SOIfrbody = value->rValue; - here->B4SOIfrbodyGiven = TRUE; - break; - -/* v4.0 added */ - case B4SOI_RBSB: - here->B4SOIrbsb = value->rValue; - here->B4SOIrbsbGiven = TRUE; - break; - case B4SOI_RBDB: - here->B4SOIrbdb = value->rValue; - here->B4SOIrbdbGiven = TRUE; - break; - case B4SOI_SA: - here->B4SOIsa = value->rValue; - here->B4SOIsaGiven = TRUE; - break; - case B4SOI_SB: - here->B4SOIsb = value->rValue; - here->B4SOIsbGiven = TRUE; - break; - case B4SOI_SD: - here->B4SOIsd = value->rValue; - here->B4SOIsdGiven = TRUE; - break; - case B4SOI_RBODYMOD: - here->B4SOIrbodyMod = value->iValue; - here->B4SOIrbodyModGiven = TRUE; - break; - case B4SOI_NF: - here->B4SOInf = value->rValue; - here->B4SOInfGiven = TRUE; - break; - case B4SOI_DELVTO: - here->B4SOIdelvto = value->rValue; - here->B4SOIdelvtoGiven = TRUE; - break; - -/* v4.0 added end */ - - case B4SOI_SOIMOD: - here->B4SOIsoiMod = value->iValue; - here->B4SOIsoiModGiven = TRUE; - break; /* v3.2 */ - -/* v3.1 added rgate */ - case B4SOI_RGATEMOD: - here->B4SOIrgateMod = value->iValue; - here->B4SOIrgateModGiven = TRUE; - break; -/* v3.1 added rgate end */ - - -/* v2.0 release */ - case B4SOI_NBC: - here->B4SOInbc = value->rValue; - here->B4SOInbcGiven = TRUE; - break; - case B4SOI_NSEG: - here->B4SOInseg = value->rValue; - here->B4SOInsegGiven = TRUE; - break; - case B4SOI_PDBCP: - here->B4SOIpdbcp = value->rValue; - here->B4SOIpdbcpGiven = TRUE; - break; - case B4SOI_PSBCP: - here->B4SOIpsbcp = value->rValue; - here->B4SOIpsbcpGiven = TRUE; - break; - case B4SOI_AGBCP: - here->B4SOIagbcp = value->rValue; - here->B4SOIagbcpGiven = TRUE; - break; - case B4SOI_AGBCP2: - here->B4SOIagbcp2 = value->rValue; - here->B4SOIagbcp2Given = TRUE; - break; /* v4.1 */ - case B4SOI_AGBCPD: - here->B4SOIagbcpd = value->rValue; - here->B4SOIagbcpdGiven = TRUE; - break; - case B4SOI_AEBCP: - here->B4SOIaebcp = value->rValue; - here->B4SOIaebcpGiven = TRUE; - break; - case B4SOI_VBSUSR: - here->B4SOIvbsusr = value->rValue; - here->B4SOIvbsusrGiven = TRUE; - break; - case B4SOI_TNODEOUT: - here->B4SOItnodeout = value->iValue; - here->B4SOItnodeoutGiven = TRUE; - break; - - - case B4SOI_IC: - switch(value->v.numValue){ - case 5: - here->B4SOIicVPS = *(value->v.vec.rVec+4); - here->B4SOIicVPSGiven = TRUE; - break; /* v4.2 bugfix */ - case 4: - here->B4SOIicVES = *(value->v.vec.rVec+3); - here->B4SOIicVESGiven = TRUE; - break; /* v4.2 bugfix */ - case 3: - here->B4SOIicVBS = *(value->v.vec.rVec+2); - here->B4SOIicVBSGiven = TRUE; - break; /* v4.2 bugfix */ - case 2: - here->B4SOIicVGS = *(value->v.vec.rVec+1); - here->B4SOIicVGSGiven = TRUE; - break; /* v4.2 bugfix */ - case 1: - here->B4SOIicVDS = *(value->v.vec.rVec); - here->B4SOIicVDSGiven = TRUE; - break; - default: - return(E_BADPARM); - } - break; - default: - return(E_BADPARM); - } - return(OK); -} - - - diff --git a/src/spicelib/devices/bsimsoi/b4soipzld.c b/src/spicelib/devices/bsimsoi/b4soipzld.c deleted file mode 100644 index 51362257a..000000000 --- a/src/spicelib/devices/bsimsoi/b4soipzld.c +++ /dev/null @@ -1,166 +0,0 @@ -/*** B4SOI 12/16/2010 Released by Tanvir Morshed ***/ - - -/********** - * Copyright 2010 Regents of the University of California. All rights reserved. - * Authors: 1998 Samuel Fung, Dennis Sinitsky and Stephen Tang - * Authors: 1999-2004 Pin Su, Hui Wan, Wei Jin, b3soipzld.c - * Authors: 2005- Hui Wan, Xuemei Xi, Ali Niknejad, Chenming Hu. - * Authors: 2009- Wenwei Yang, Chung-Hsun Lin, Ali Niknejad, Chenming Hu. - * File: b4soipzld.c - * Modified by Hui Wan, Xuemei Xi 11/30/2005 - * Modified by Wenwei Yang, Chung-Hsun Lin, Darsen Lu 03/06/2009 - * Modified by Tanvir Morshed 09/22/2009 - * Modified by Tanvir Morshed 12/31/2009 - **********/ - -#include "ngspice/ngspice.h" - -#include "ngspice/cktdefs.h" -#include "ngspice/complex.h" -#include "ngspice/sperror.h" -#include "b4soidef.h" -#include "ngspice/suffix.h" - -int -B4SOIpzLoad( -GENmodel *inModel, -CKTcircuit *ckt, -SPcomplex *s) -{ -register B4SOImodel *model = (B4SOImodel*)inModel; -register B4SOIinstance *here; -double xcggb, xcgdb, xcgsb, xcbgb, xcbdb, xcbsb, xcddb, xcssb, xcdgb; -double gdpr, gspr, gds, gbd, gbs, capbd=0.0, capbs=0.0, xcsgb, xcdsb, xcsdb; -double cggb, cgdb, cgsb, cbgb, cbdb, cbsb, cddb, cdgb, cdsb; -double GSoverlapCap, GDoverlapCap, GBoverlapCap=0.0; -double FwdSum, RevSum, Gm, Gmbs; - -double m; - - NG_IGNORE(ckt); - - for (; model != NULL; model = B4SOInextModel(model)) - { for (here = B4SOIinstances(model); here!= NULL; - here = B4SOInextInstance(here)) - { - if (here->B4SOImode >= 0) - { Gm = here->B4SOIgm; - Gmbs = here->B4SOIgmbs; - FwdSum = Gm + Gmbs; - RevSum = 0.0; - cggb = here->B4SOIcggb; - cgsb = here->B4SOIcgsb; - cgdb = here->B4SOIcgdb; - - cbgb = here->B4SOIcbgb; - cbsb = here->B4SOIcbsb; - cbdb = here->B4SOIcbdb; - - cdgb = here->B4SOIcdgb; - cdsb = here->B4SOIcdsb; - cddb = here->B4SOIcddb; - } - else - { Gm = -here->B4SOIgm; - Gmbs = -here->B4SOIgmbs; - FwdSum = 0.0; - RevSum = -Gm - Gmbs; - cggb = here->B4SOIcggb; - cgsb = here->B4SOIcgdb; - cgdb = here->B4SOIcgsb; - - cbgb = here->B4SOIcbgb; - cbsb = here->B4SOIcbdb; - cbdb = here->B4SOIcbsb; - - cdgb = -(here->B4SOIcdgb + cggb + cbgb); - cdsb = -(here->B4SOIcddb + cgsb + cbsb); - cddb = -(here->B4SOIcdsb + cgdb + cbdb); - } - gdpr=here->B4SOIdrainConductance; - gspr=here->B4SOIsourceConductance; - gds= here->B4SOIgds; - gbd= here->B4SOIgjdb; - gbs= here->B4SOIgjsb; -#ifdef BULKCODE - capbd= here->B4SOIcapbd; - capbs= here->B4SOIcapbs; -#endif - GSoverlapCap = here->B4SOIcgso; - GDoverlapCap = here->B4SOIcgdo; -#ifdef BULKCODE - GBoverlapCap = here->pParam->B4SOIcgbo; -#endif - - xcdgb = (cdgb - GDoverlapCap); - xcddb = (cddb + capbd + GDoverlapCap); - xcdsb = cdsb; - xcsgb = -(cggb + cbgb + cdgb + GSoverlapCap); - xcsdb = -(cgdb + cbdb + cddb); - xcssb = (capbs + GSoverlapCap - (cgsb+cbsb+cdsb)); - xcggb = (cggb + GDoverlapCap + GSoverlapCap + GBoverlapCap); - xcgdb = (cgdb - GDoverlapCap); - xcgsb = (cgsb - GSoverlapCap); - xcbgb = (cbgb - GBoverlapCap); - xcbdb = (cbdb - capbd); - xcbsb = (cbsb - capbs); - - m = here->B4SOIm; - - *(here->B4SOIGgPtr ) += m * xcggb * s->real; - *(here->B4SOIGgPtr +1) += m * xcggb * s->imag; - *(here->B4SOIBbPtr ) += m * (-xcbgb-xcbdb-xcbsb) * s->real; - *(here->B4SOIBbPtr +1) += m * (-xcbgb-xcbdb-xcbsb) * s->imag; - *(here->B4SOIDPdpPtr ) += m * xcddb * s->real; - *(here->B4SOIDPdpPtr +1) += m * xcddb * s->imag; - *(here->B4SOISPspPtr ) += m * xcssb * s->real; - *(here->B4SOISPspPtr +1) += m * xcssb * s->imag; - *(here->B4SOIGbPtr ) += m * (-xcggb-xcgdb-xcgsb) * s->real; - *(here->B4SOIGbPtr +1) += m * (-xcggb-xcgdb-xcgsb) * s->imag; - *(here->B4SOIGdpPtr ) += m * xcgdb * s->real; - *(here->B4SOIGdpPtr +1) += m * xcgdb * s->imag; - *(here->B4SOIGspPtr ) += m * xcgsb * s->real; - *(here->B4SOIGspPtr +1) += m * xcgsb * s->imag; - *(here->B4SOIBgPtr ) += m * xcbgb * s->real; - *(here->B4SOIBgPtr +1) += m * xcbgb * s->imag; - *(here->B4SOIBdpPtr ) += m * xcbdb * s->real; - *(here->B4SOIBdpPtr +1) += m * xcbdb * s->imag; - *(here->B4SOIBspPtr ) += m * xcbsb * s->real; - *(here->B4SOIBspPtr +1) += m * xcbsb * s->imag; - *(here->B4SOIDPgPtr ) += m * xcdgb * s->real; - *(here->B4SOIDPgPtr +1) += m * xcdgb * s->imag; - *(here->B4SOIDPbPtr ) += m * (-xcdgb-xcddb-xcdsb) * s->real; - *(here->B4SOIDPbPtr +1) += m * (-xcdgb-xcddb-xcdsb) * s->imag; - *(here->B4SOIDPspPtr ) += m * xcdsb * s->real; - *(here->B4SOIDPspPtr +1) += m * xcdsb * s->imag; - *(here->B4SOISPgPtr ) += m * xcsgb * s->real; - *(here->B4SOISPgPtr +1) += m * xcsgb * s->imag; - *(here->B4SOISPbPtr ) += m * (-xcsgb-xcsdb-xcssb) * s->real; - *(here->B4SOISPbPtr +1) += m * (-xcsgb-xcsdb-xcssb) * s->imag; - *(here->B4SOISPdpPtr ) += m * xcsdb * s->real; - *(here->B4SOISPdpPtr +1) += m * xcsdb * s->imag; - *(here->B4SOIDdPtr) += m * gdpr; - *(here->B4SOISsPtr) += m * gspr; - *(here->B4SOIBbPtr) += m * (gbd+gbs); - *(here->B4SOIDPdpPtr) += m * (gdpr+gds+gbd+RevSum); - *(here->B4SOISPspPtr) += m * (gspr+gds+gbs+FwdSum); - *(here->B4SOIDdpPtr) -= m * gdpr; - *(here->B4SOISspPtr) -= m * gspr; - *(here->B4SOIBdpPtr) -= m * gbd; - *(here->B4SOIBspPtr) -= m * gbs; - *(here->B4SOIDPdPtr) -= m * gdpr; - *(here->B4SOIDPgPtr) += m * Gm; - *(here->B4SOIDPbPtr) -= m * (gbd - Gmbs); - *(here->B4SOIDPspPtr) -= m * (gds + FwdSum); - *(here->B4SOISPgPtr) -= m * Gm; - *(here->B4SOISPsPtr) -= m * gspr; - *(here->B4SOISPbPtr) -= m * (gbs + Gmbs); - *(here->B4SOISPdpPtr) -= m * (gds + RevSum); - - } - } - return(OK); -} - - diff --git a/src/spicelib/devices/bsimsoi/b4soiset.c b/src/spicelib/devices/bsimsoi/b4soiset.c deleted file mode 100644 index 3523eae74..000000000 --- a/src/spicelib/devices/bsimsoi/b4soiset.c +++ /dev/null @@ -1,2905 +0,0 @@ -/*** B4SOI 12/16/2010 Released by Tanvir Morshed ***/ - - -/********** - * Copyright 2010 Regents of the University of California. All rights reserved. - * Authors: 1998 Samuel Fung, Dennis Sinitsky and Stephen Tang - * Authors: 1999-2004 Pin Su, Hui Wan, Wei Jin, b3soiset.c - * Authors: 2005- Hui Wan, Xuemei Xi, Ali Niknejad, Chenming Hu. - * Authors: 2009- Wenwei Yang, Chung-Hsun Lin, Ali Niknejad, Chenming Hu. - * Authors: 2009- Tanvir Morshed, Ali Niknejad, Chenming Hu. - * File: b4soiset.c - * Modified by Hui Wan, Xuemei Xi 11/30/2005 - * Modified by Wenwei Yang, Chung-Hsun Lin, Darsen Lu 03/06/2009 - * Modified by Tanvir Morshed 09/22/2009 - * Modified by Tanvir Morshed 12/31/2009 - * Modified by Tanvir Morshed 04/27/2010 - * Modified by Tanvir Morshed 12/16/2010 - **********/ - -#include "ngspice/ngspice.h" -#include "ngspice/smpdefs.h" -#include "ngspice/cktdefs.h" -#include "b4soidef.h" -#include "ngspice/const.h" -#include "ngspice/sperror.h" -#include "ngspice/suffix.h" - -#define SMOOTHFACTOR 0.1 -#define EPSOX 3.453133e-11 -#define EPSSI 1.03594e-10 -#define PI 3.141592654 -#define Charge_q 1.60219e-19 -#define Meter2Micron 1.0e6 -#define EPS0 8.85418e-12 - -double epsrox, toxe, epssub; -double NchMax; /* v4.4 */ - -int -B4SOIsetup( -SMPmatrix *matrix, -GENmodel *inModel, -CKTcircuit *ckt, -int *states) -{ -register B4SOImodel *model = (B4SOImodel*)inModel; -register B4SOIinstance *here; -int error; -CKTnode *tmp; - -double Cboxt; - -/* v3.2 */ -double Vbs0t, Qsi; - -#ifdef USE_OMP -int idx, InstCount; -B4SOIinstance **InstArray; -#endif - - /* loop through all the B4SOI device models */ - for( ; model != NULL; model = B4SOInextModel(model)) - { -/* Default value Processing for B4SOI MOSFET Models */ - - if (!model->B4SOItypeGiven) - model->B4SOItype = NMOS; - if (!model->B4SOImobModGiven) - model->B4SOImobMod = 1; - if (!model->B4SOIbinUnitGiven) - model->B4SOIbinUnit = 1; - if (!model->B4SOIparamChkGiven) - model->B4SOIparamChk = 0; - if (!model->B4SOIcapModGiven) - model->B4SOIcapMod = 2; - if (!model->B4SOIiiiModGiven) /* Bug fix #7 Jun 09 'iiimod' with default value added */ - model->B4SOIiiiMod = 0; - - if (!model->B4SOImtrlModGiven) - model->B4SOImtrlMod = 0; /*4.1*/ - if (!model->B4SOIvgstcvModGiven) - /*model->B4SOIvgstcvMod = 0; v4.2 Bugfix */ - model->B4SOIvgstcvMod = 1; - if (!model->B4SOIgidlModGiven) - model->B4SOIgidlMod = 0; - if (!model->B4SOIeotGiven) - model->B4SOIeot = 100.0e-10; - if (!model->B4SOIepsroxGiven) - model->B4SOIepsrox = 3.9; - if (!model->B4SOIepsrsubGiven) - model->B4SOIepsrsub = 11.7; - if (!model->B4SOIni0subGiven) - model->B4SOIni0sub = 1.45e10; /* unit 1/cm3 */ - if (!model->B4SOIbg0subGiven) - model->B4SOIbg0sub = 1.16; /* unit eV */ - if (!model->B4SOItbgasubGiven) - model->B4SOItbgasub = 7.02e-4; - if (!model->B4SOItbgbsubGiven) - model->B4SOItbgbsub = 1108.0; - if (!model->B4SOIleffeotGiven) - model->B4SOIleffeot = 1.0; - if (!model->B4SOIweffeotGiven) - model->B4SOIweffeot = 10.0; - if (!model->B4SOIvddeotGiven) - model->B4SOIvddeot = (model->B4SOItype == NMOS) ? 1.5 : -1.5; - if (!model->B4SOItempeotGiven) - model->B4SOItempeot = 300.15; - if (!model->B4SOIadosGiven) - model->B4SOIados = 1.0; - if (!model->B4SOIbdosGiven) - model->B4SOIbdos = 1.0; - if (!model->B4SOIepsrgateGiven) - model->B4SOIepsrgate = 11.7; - if (!model->B4SOIphigGiven) - model->B4SOIphig = 4.05; - if (!model->B4SOIeasubGiven) - model->B4SOIeasub = 4.05; - -/* if (!model->B4SOInoiModGiven) - model->B4SOInoiMod = 1; v3.2 */ - if (!model->B4SOIshModGiven) - model->B4SOIshMod = 0; - if (!model->B4SOIversionGiven) - model->B4SOIversion = 4.4; - if (!model->B4SOItoxGiven) - model->B4SOItox = 100.0e-10; - /*model->B4SOIcox = 3.453133e-11 / model->B4SOItox;*/ - if(model->B4SOImtrlMod) - { - epsrox = 3.9; - toxe = model->B4SOIeot; - epssub = EPS0 * model->B4SOIepsrsub; - /*model->B4SOIcox = 3.453133e-11 / model->B4SOItox;*/ - model->B4SOIcox = epsrox * EPS0 / toxe; - } - else - { - epsrox = model->B4SOIepsrox; - toxe = model->B4SOItox; - epssub = EPSSI; - /*model->B4SOIcox = epsrox * EPS0 / toxe;*/ - model->B4SOIcox = 3.453133e-11 / model->B4SOItox; - } - - - if (!model->B4SOItoxpGiven) - model->B4SOItoxp = model->B4SOItox; - - - - if (!model->B4SOItoxmGiven) - model->B4SOItoxm = model->B4SOItox; /* v3.2 */ - -/* v3.2 */ - if (!model->B4SOIsoiModGiven) - model->B4SOIsoiMod = 0; - else if ((model->B4SOIsoiMod != 0) && (model->B4SOIsoiMod != 1) - && (model->B4SOIsoiMod != 2) && (model->B4SOIsoiMod != 3)) - { model->B4SOIsoiMod = 0; - printf("Warning: soiMod has been set to its default value: 0.\n"); - } - - /* v3.1 added for RF */ - if (!model->B4SOIrgateModGiven) - model->B4SOIrgateMod = 0; - else if ((model->B4SOIrgateMod != 0) && (model->B4SOIrgateMod != 1) - && (model->B4SOIrgateMod != 2) && (model->B4SOIrgateMod != 3)) - { model->B4SOIrgateMod = 0; - printf("Warning: rgateMod has been set to its default value: 0.\n"); - } - /* v3.1 added for RF end */ - - /* v3.2 for noise */ - if (!model->B4SOIfnoiModGiven) - model->B4SOIfnoiMod = 1; - else if ((model->B4SOIfnoiMod != 0) && (model->B4SOIfnoiMod != 1)) - { model->B4SOIfnoiMod = 1; - printf("Waring: fnoiMod has been set to default value:1.\n"); - } - - if (!model->B4SOItnoiModGiven) - model->B4SOItnoiMod = 0; - else if ((model->B4SOItnoiMod != 0) && (model->B4SOItnoiMod != 1)&& (model->B4SOItnoiMod != 2)) - { model->B4SOItnoiMod = 0; - printf("Waring: tnoiMod has been set to default value:0.\n"); - } - - if (!model->B4SOItnoiaGiven) - model->B4SOItnoia = 1.5; - if (!model->B4SOItnoibGiven) - model->B4SOItnoib = 3.5; - if (!model->B4SOIrnoiaGiven) - model->B4SOIrnoia = 0.577; - if (!model->B4SOIrnoibGiven) - model->B4SOIrnoib = 0.37; - if (!model->B4SOIntnoiGiven) - model->B4SOIntnoi = 1.0; - /* v3.2 for noise end */ - - /* v4.0 */ - if (!model->B4SOIrdsModGiven) - model->B4SOIrdsMod = 0; - else if ((model->B4SOIrdsMod != 0) && (model->B4SOIrdsMod != 1)) - { model->B4SOIrdsMod = 0; - printf("Warning: rdsMod has been set to its default value: 0.\n"); - } - - if (!model->B4SOIrbodyModGiven) - model->B4SOIrbodyMod = 0; - else if ((model->B4SOIrbodyMod != 0) && (model->B4SOIrbodyMod != 1)) - { model->B4SOIrbodyMod = 0; - printf("Warning: rbodyMod has been set to its default value: 0.\n"); - } - if (!model->B4SOIgbminGiven) - model->B4SOIgbmin = 1.0e-12; /* in mho */ - if (!model->B4SOIrbdbGiven) - model->B4SOIrbdb = 50.0; /* in ohm */ - if (!model->B4SOIrbsbGiven) - model->B4SOIrbsb = 50.0; /* in ohm */ - - /* v4.0 end */ - - -/* v2.2.3 */ - if (!model->B4SOIdtoxcvGiven) - model->B4SOIdtoxcv = 0.0; - - if (!model->B4SOIcdscGiven) - model->B4SOIcdsc = 2.4e-4; /* unit Q/V/m^2 */ - if (!model->B4SOIcdscbGiven) - model->B4SOIcdscb = 0.0; /* unit Q/V/m^2 */ - if (!model->B4SOIcdscdGiven) - model->B4SOIcdscd = 0.0; /* unit Q/V/m^2 */ - if (!model->B4SOIcitGiven) - model->B4SOIcit = 0.0; /* unit Q/V/m^2 */ - if (!model->B4SOInfactorGiven) - model->B4SOInfactor = 1; - if (!model->B4SOIvsatGiven) - model->B4SOIvsat = 8.0e4; /* unit m/s */ - if (!model->B4SOIatGiven) - model->B4SOIat = 3.3e4; /* unit m/s */ - if (!model->B4SOIa0Given) - model->B4SOIa0 = 1.0; - if (!model->B4SOIagsGiven) - model->B4SOIags = 0.0; - if (!model->B4SOIa1Given) - model->B4SOIa1 = 0.0; - if (!model->B4SOIa2Given) - model->B4SOIa2 = 1.0; - if (!model->B4SOIketaGiven) - model->B4SOIketa = -0.6; /* unit / V */ - if (!model->B4SOInsubGiven) - model->B4SOInsub = 6.0e16; /* unit 1/cm3 */ - if (!model->B4SOInpeakGiven) - model->B4SOInpeak = 1.7e17; /* unit 1/cm3 */ - if (!model->B4SOIngateGiven) - model->B4SOIngate = 0; /* unit 1/cm3 */ - if (!model->B4SOInsdGiven) - model->B4SOInsd = 1.0e20; - if (!model->B4SOIvbmGiven) - model->B4SOIvbm = -3.0; - if (!model->B4SOIxtGiven) - model->B4SOIxt = 1.55e-7; - if (!model->B4SOIkt1Given) - model->B4SOIkt1 = -0.11; /* unit V */ - if (!model->B4SOIkt1lGiven) - model->B4SOIkt1l = 0.0; /* unit V*m */ - if (!model->B4SOIkt2Given) - model->B4SOIkt2 = 0.022; /* No unit */ - if (!model->B4SOIk3Given) - model->B4SOIk3 = 0.0; - if (!model->B4SOIk3bGiven) - model->B4SOIk3b = 0.0; - if (!model->B4SOIw0Given) - model->B4SOIw0 = 2.5e-6; - if (!model->B4SOIlpebGiven) - model->B4SOIlpeb = 0.0; - if (!model->B4SOIdvt0Given) - model->B4SOIdvt0 = 2.2; - if (!model->B4SOIdvt1Given) - model->B4SOIdvt1 = 0.53; - if (!model->B4SOIdvt2Given) - model->B4SOIdvt2 = -0.032; /* unit 1 / V */ - - if (!model->B4SOIdvt0wGiven) - model->B4SOIdvt0w = 0.0; - if (!model->B4SOIdvt1wGiven) - model->B4SOIdvt1w = 5.3e6; - if (!model->B4SOIdvt2wGiven) - model->B4SOIdvt2w = -0.032; - - if (!model->B4SOIdroutGiven) - model->B4SOIdrout = 0.56; - if (!model->B4SOIdsubGiven) - model->B4SOIdsub = model->B4SOIdrout; - if (!model->B4SOIvth0Given) - model->B4SOIvth0 = (model->B4SOItype == NMOS) ? 0.7 : -0.7; - if (!model->B4SOIvfbGiven) - model->B4SOIvfb = -1.0; /* v4.1 */ - if (!model->B4SOIuaGiven) - model->B4SOIua = 2.25e-9; /* unit m/V */ - if (!model->B4SOIua1Given) - model->B4SOIua1 = 4.31e-9; /* unit m/V */ - if (!model->B4SOIubGiven) - model->B4SOIub = 5.87e-19; /* unit (m/V)**2 */ - if (!model->B4SOIub1Given) - model->B4SOIub1 = -7.61e-18; /* unit (m/V)**2 */ - if (!model->B4SOIucGiven) - model->B4SOIuc = (model->B4SOImobMod == 3) ? -0.0465 : -0.0465e-9; - if (!model->B4SOIuc1Given) - model->B4SOIuc1 = (model->B4SOImobMod == 3) ? -0.056 : -0.056e-9; - if (!model->B4SOIu0Given) - model->B4SOIu0 = (model->B4SOItype == NMOS) ? 0.067 : 0.025; - if (!model->B4SOIuteGiven) - model->B4SOIute = -1.5; - - /*4.1 mobmod =4 */ - if (!model->B4SOIudGiven) - model->B4SOIud = 0.0; - if (!model->B4SOIludGiven) - model->B4SOIlud = 0.0; - if (!model->B4SOIwudGiven) - model->B4SOIwud = 0.0; - if (!model->B4SOIpudGiven) - /* model->B4SOIpud1 = 0.0; */ /*Bug fix # 33 Jul 09 */ - model->B4SOIpud = 0.0; - if (!model->B4SOIud1Given) - model->B4SOIud1 = 0.0; - if (!model->B4SOIlud1Given) - model->B4SOIlud1 = 0.0; - if (!model->B4SOIwud1Given) - model->B4SOIwud1 = 0.0; - if (!model->B4SOIpud1Given) - model->B4SOIpud1 = 0.0; - if (!model->B4SOIeuGiven) - model->B4SOIeu = (model->B4SOItype == NMOS) ? 1.67 : 1.0; - if (!model->B4SOIleuGiven) - model->B4SOIleu = 0.0; - if (!model->B4SOIweuGiven) - model->B4SOIweu = 0.0; - if (!model->B4SOIpeuGiven) - model->B4SOIpeu = 0.0; - if (!model->B4SOIucsGiven) - model->B4SOIucs = (model->B4SOItype == NMOS) ? 1.67 : 1.0; - if (!model->B4SOIlucsGiven) - model->B4SOIlucs =0.0; - if (!model->B4SOIwucsGiven) - model->B4SOIwucs =0.0; - if (!model->B4SOIpucsGiven) - model->B4SOIpucs =0.0; - if (!model->B4SOIucsteGiven) - model->B4SOIucste = -4.775e-3; - if (!model->B4SOIlucsteGiven) - model->B4SOIlucste = 0.0; - if (!model->B4SOIwucsteGiven) - model->B4SOIwucste = 0.0; - if (!model->B4SOIpucsteGiven) - model->B4SOIpucste = 0.0; - - if (!model->B4SOIvoffGiven) - model->B4SOIvoff = -0.08; - if (!model->B4SOIdeltaGiven) - model->B4SOIdelta = 0.01; - if (!model->B4SOIrdswGiven) - model->B4SOIrdsw = 100; - if (!model->B4SOIrswGiven) /* v4.0 */ - model->B4SOIrsw = 50; - if (!model->B4SOIrdwGiven) /* v4.0 */ - model->B4SOIrdw = 50; - if (!model->B4SOIrswminGiven) /* v4.0 */ - model->B4SOIrswmin = 0.0; - if (!model->B4SOIrdwminGiven) /* v4.0 */ - model->B4SOIrdwmin = 0.0; - if (!model->B4SOIprwgGiven) - model->B4SOIprwg = 0.0; /* unit 1/V */ - if (!model->B4SOIprwbGiven) - model->B4SOIprwb = 0.0; - if (!model->B4SOIprtGiven) - model->B4SOIprt = 0.0; - if (!model->B4SOIeta0Given) - model->B4SOIeta0 = 0.08; /* no unit */ - if (!model->B4SOIetabGiven) - model->B4SOIetab = -0.07; /* unit 1/V */ - if (!model->B4SOIpclmGiven) - model->B4SOIpclm = 1.3; /* no unit */ - if (!model->B4SOIpdibl1Given) - model->B4SOIpdibl1 = .39; /* no unit */ - if (!model->B4SOIpdibl2Given) - model->B4SOIpdibl2 = 0.0086; /* no unit */ - if (!model->B4SOIpdiblbGiven) - model->B4SOIpdiblb = 0.0; /* 1/V */ - if (!model->B4SOIpvagGiven) - model->B4SOIpvag = 0.0; - if (!model->B4SOIwrGiven) - model->B4SOIwr = 1.0; - if (!model->B4SOIdwgGiven) - model->B4SOIdwg = 0.0; - if (!model->B4SOIdwbGiven) - model->B4SOIdwb = 0.0; - if (!model->B4SOIb0Given) - model->B4SOIb0 = 0.0; - if (!model->B4SOIb1Given) - model->B4SOIb1 = 0.0; - if (!model->B4SOIalpha0Given) - model->B4SOIalpha0 = 0.0; - - if (!model->B4SOIcgslGiven) - model->B4SOIcgsl = 0.0; - if (!model->B4SOIcgdlGiven) - model->B4SOIcgdl = 0.0; - if (!model->B4SOIckappaGiven) - model->B4SOIckappa = 0.6; - if (!model->B4SOIclcGiven) - model->B4SOIclc = 0.1e-7; - if (!model->B4SOIcleGiven) - model->B4SOIcle = 0.0; - if (!model->B4SOItboxGiven) - model->B4SOItbox = 3e-7; - if (!model->B4SOItsiGiven) - model->B4SOItsi = 1e-7; - if (!model->B4SOIetsiGiven) - model->B4SOIetsi = 1e-7; - if (!model->B4SOIxjGiven) - model->B4SOIxj = model->B4SOItsi; - if (!model->B4SOIrbodyGiven) - model->B4SOIrbody = 0.0; - if (!model->B4SOIrbshGiven) - model->B4SOIrbsh = 0.0; - if (!model->B4SOIrth0Given) - model->B4SOIrth0 = 0; - -/* v3.0 bug fix */ - if (!model->B4SOIcth0Given) - model->B4SOIcth0 = 1e-5; - if (!model->B4SOIcfrcoeffGiven) /* v4.4 */ - model->B4SOIcfrcoeff = 1.0; - - if (!model->B4SOIagidlGiven) - model->B4SOIagidl = 0.0; - if (!model->B4SOIbgidlGiven) - model->B4SOIbgidl = 2.3e9; /* v4.0 */ - if (!model->B4SOIcgidlGiven) /* v4.0 */ - model->B4SOIcgidl = 0.5; /* v4.2 default value changed from 0 to 0.5 */ - if (!model->B4SOIrgidlGiven) /* v4.1 */ - model->B4SOIrgidl = 1.0; - if (!model->B4SOIkgidlGiven) /* v4.1 */ - model->B4SOIkgidl = 0.0; - if (!model->B4SOIfgidlGiven) /* v4.1 */ - model->B4SOIfgidl = 0.0; - if (!model->B4SOIagislGiven) - model->B4SOIagisl = model->B4SOIagidl; - if (!model->B4SOIbgislGiven) - model->B4SOIbgisl = model->B4SOIbgidl; /* v4.0 */ - if (!model->B4SOIcgislGiven) /* v4.0 */ - model->B4SOIcgisl = model->B4SOIcgidl; - if (!model->B4SOIrgislGiven) /* v4.1 */ - model->B4SOIrgisl = model->B4SOIrgidl; - if (!model->B4SOIkgislGiven) /* v4.1 */ - model->B4SOIkgisl = model->B4SOIkgidl; - if (!model->B4SOIfgislGiven) /* v4.1 */ - model->B4SOIfgisl = model->B4SOIfgidl; - - if (!model->B4SOIndiodeGiven) /* v4.0 */ - model->B4SOIndiode = 1.0; - if (!model->B4SOIndiodedGiven) /* v4.0 */ - model->B4SOIndioded = model->B4SOIndiode; - if (!model->B4SOIntunGiven) /* v4.0 */ - model->B4SOIntun = 10.0; - if (!model->B4SOIntundGiven) /* v4.0 */ - model->B4SOIntund = model->B4SOIntun; - - if (!model->B4SOInrecf0Given) - model->B4SOInrecf0 = 2.0; - if (!model->B4SOInrecf0dGiven) - model->B4SOInrecf0d = model->B4SOInrecf0; - if (!model->B4SOInrecr0Given) - model->B4SOInrecr0 = 10.0; - if (!model->B4SOInrecr0dGiven) - model->B4SOInrecr0d = model->B4SOInrecr0; - - if (!model->B4SOIisbjtGiven) - model->B4SOIisbjt = 1e-6; - if (!model->B4SOIidbjtGiven) - model->B4SOIidbjt = model->B4SOIisbjt; - if (!model->B4SOIisdifGiven) - model->B4SOIisdif = 0.0; - if (!model->B4SOIiddifGiven) - model->B4SOIiddif = model->B4SOIisdif; /* v4.0 */ - if (!model->B4SOIisrecGiven) - model->B4SOIisrec = 1e-5; - if (!model->B4SOIidrecGiven) - model->B4SOIidrec = model->B4SOIisrec; - if (!model->B4SOIistunGiven) - model->B4SOIistun = 0.0; - if (!model->B4SOIidtunGiven) - model->B4SOIidtun = model->B4SOIistun; - if (!model->B4SOIxbjtGiven) - model->B4SOIxbjt = 1.0; - if (!model->B4SOIxdifGiven) - model->B4SOIxdif = model->B4SOIxbjt; - if (!model->B4SOIxdifdGiven) - model->B4SOIxdifd = model->B4SOIxdif; - if (!model->B4SOIxrecGiven) - model->B4SOIxrec = 1.0; - if (!model->B4SOIxrecdGiven) - model->B4SOIxrecd = model->B4SOIxrec; - if (!model->B4SOIxtunGiven) - model->B4SOIxtun = 0.0; - if (!model->B4SOIxtundGiven) - model->B4SOIxtund = model->B4SOIxtun; - if (!model->B4SOIttGiven) - model->B4SOItt = 1e-12; - if (!model->B4SOIasdGiven) - model->B4SOIasd = 0.3; - - /* 4.0 backward compatibility */ - if (!model->B4SOIlpe0Given) { - if(!model->B4SOInlxGiven) - model->B4SOIlpe0 = 1.74e-7; - else - model->B4SOIlpe0 = model->B4SOInlx; - } - if(model->B4SOIlpe0Given && model->B4SOInlxGiven) - printf("Warning: both lpe0 and nlx are given. Lpe0 value is taken \n"); - if (!model->B4SOIllpe0Given) { - if(!model->B4SOIlnlxGiven) - model->B4SOIllpe0 = 0.0; - else - model->B4SOIllpe0 = model->B4SOIlnlx; - } - if(model->B4SOIllpe0Given && model->B4SOIlnlxGiven) - printf("Warning: both llpe0 and lnlx are given. Llpe0 value is taken \n"); - if (!model->B4SOIwlpe0Given) { - if(!model->B4SOIwnlxGiven) - model->B4SOIwlpe0 = 0.0; - else - model->B4SOIwlpe0 = model->B4SOIwnlx; - } - if(model->B4SOIwlpe0Given && model->B4SOIwnlxGiven) - printf("Warning: both wlpe0 and wnlx are given. Wlpe0 value is taken \n"); - if (!model->B4SOIplpe0Given) { - if(!model->B4SOIpnlxGiven) - model->B4SOIplpe0 = 0.0; - else - model->B4SOIplpe0 = model->B4SOIpnlx; - } - if(model->B4SOIplpe0Given && model->B4SOIpnlxGiven) - printf("Warning: both plpe0 and pnlx are given. Plpe0 value is taken \n"); - - if (!model->B4SOIegidlGiven) { - if(!model->B4SOIngidlGiven) - model->B4SOIegidl = 1.2; - else - model->B4SOIegidl = model->B4SOIngidl; - } - - if(model->B4SOIegidlGiven && model->B4SOIngidlGiven) - printf("Warning: both egidl and ngidl are given. Egidl value is taken \n"); - if (!model->B4SOIlegidlGiven) { - if(!model->B4SOIlngidlGiven) - model->B4SOIlegidl = 0.0; - else - model->B4SOIlegidl = model->B4SOIlngidl; - } - if(model->B4SOIlegidlGiven && model->B4SOIlngidlGiven) - printf("Warning: both legidl and lngidl are given. Legidl value is taken \n"); - if (!model->B4SOIwegidlGiven) { - if(!model->B4SOIwngidlGiven) - model->B4SOIwegidl = 0.0; - else - model->B4SOIwegidl = model->B4SOIwngidl; - } - if(model->B4SOIwegidlGiven && model->B4SOIwngidlGiven) - printf("Warning: both wegidl and wngidl are given. Wegidl value is taken \n"); - if (!model->B4SOIpegidlGiven) { - if(!model->B4SOIpngidlGiven) - model->B4SOIpegidl = 0.0; - else - model->B4SOIpegidl = model->B4SOIpngidl; - } - if(model->B4SOIpegidlGiven && model->B4SOIpngidlGiven) - printf("Warning: both pegidl and pngidl are given. Pegidl value is taken \n"); - - if (!model->B4SOIegislGiven) { - model->B4SOIegisl = model->B4SOIegidl; - } - if (!model->B4SOIlegislGiven) { - model->B4SOIlegisl = model->B4SOIlegidl; - } - if (!model->B4SOIwegislGiven) { - model->B4SOIwegisl = model->B4SOIwegidl; - } - if (!model->B4SOIpegislGiven) { - model->B4SOIpegisl = model->B4SOIpegidl; - } - /* unit degree celcius */ - if (!model->B4SOItnomGiven) - model->B4SOItnom = ckt->CKTnomTemp; - if (!model->B4SOILintGiven) - model->B4SOILint = 0.0; - if (!model->B4SOILlGiven) - model->B4SOILl = 0.0; - if (!model->B4SOILlcGiven) - model->B4SOILlc = 0.0; /* v2.2.3 */ - if (!model->B4SOILlnGiven) - model->B4SOILln = 1.0; - if (!model->B4SOILwGiven) - model->B4SOILw = 0.0; - if (!model->B4SOILwcGiven) - model->B4SOILwc = 0.0; /* v2.2.3 */ - if (!model->B4SOILwnGiven) - model->B4SOILwn = 1.0; - if (!model->B4SOILwlGiven) - model->B4SOILwl = 0.0; - if (!model->B4SOILwlcGiven) - model->B4SOILwlc = 0.0; /* v2.2.3 */ - if (!model->B4SOILminGiven) - model->B4SOILmin = 0.0; - if (!model->B4SOILmaxGiven) - model->B4SOILmax = 1.0; - if (!model->B4SOIWintGiven) - model->B4SOIWint = 0.0; - if (!model->B4SOIWlGiven) - model->B4SOIWl = 0.0; - if (!model->B4SOIWlcGiven) - model->B4SOIWlc = 0.0; /* v2.2.3 */ - if (!model->B4SOIWlnGiven) - model->B4SOIWln = 1.0; - if (!model->B4SOIWwGiven) - model->B4SOIWw = 0.0; - if (!model->B4SOIWwcGiven) - model->B4SOIWwc = 0.0; /* v2.2.3 */ - if (!model->B4SOIWwnGiven) - model->B4SOIWwn = 1.0; - if (!model->B4SOIWwlGiven) - model->B4SOIWwl = 0.0; - if (!model->B4SOIWwlcGiven) - model->B4SOIWwlc = 0.0; /* v2.2.3 */ - if (!model->B4SOIWminGiven) - model->B4SOIWmin = 0.0; - if (!model->B4SOIWmaxGiven) - model->B4SOIWmax = 1.0; - if (!model->B4SOIdwcGiven) - model->B4SOIdwc = model->B4SOIWint; - if (!model->B4SOIdlcGiven) - model->B4SOIdlc = model->B4SOILint; - if (!model->B4SOIdlcigGiven) - model->B4SOIdlcig = model->B4SOILint; /* v3.0 */ - - -/* v3.0 */ - if (!model->B4SOIvbs0pdGiven) - model->B4SOIvbs0pd = 0.0; /* v3.2 */ - if (!model->B4SOIvbs0fdGiven) - model->B4SOIvbs0fd = 0.5; /* v3.2 */ - if (!model->B4SOIvbsaGiven) - model->B4SOIvbsa = 0.0; - if (!model->B4SOInofffdGiven) - model->B4SOInofffd = 1.0; - if (!model->B4SOIvofffdGiven) - model->B4SOIvofffd = 0.0; - if (!model->B4SOIk1bGiven) - model->B4SOIk1b = 1.0; - if (!model->B4SOIk2bGiven) - model->B4SOIk2b = 0.0; - if (!model->B4SOIdk2bGiven) - model->B4SOIdk2b = 0.0; - if (!model->B4SOIdvbd0Given) - model->B4SOIdvbd0 = 0.0; - if (!model->B4SOIdvbd1Given) - model->B4SOIdvbd1 = 0.0; - if (!model->B4SOImoinFDGiven) - model->B4SOImoinFD = 1e3; - -/* v3.1 added for RF */ - if (!model->B4SOIxrcrg1Given) - model->B4SOIxrcrg1 =12.0; - if (!model->B4SOIxrcrg2Given) - model->B4SOIxrcrg2 =1.0; - if (!model->B4SOIrshgGiven) - model->B4SOIrshg =0.1; - if (!model->B4SOIngconGiven) - model->B4SOIngcon =1.0; - if (!model->B4SOIxgwGiven) - model->B4SOIxgw = 0.0; - if (!model->B4SOIxglGiven) - model->B4SOIxgl = 0.0; -/* v3.1 added for RF end */ - -/* v2.2 release */ - if (!model->B4SOIwth0Given) - model->B4SOIwth0 = 0.0; - if (!model->B4SOIrhaloGiven) - model->B4SOIrhalo = 1e15; - if (!model->B4SOIntoxGiven) - model->B4SOIntox = 1; - if (!model->B4SOItoxrefGiven) - model->B4SOItoxref = 2.5e-9; - if (!model->B4SOIebgGiven) - model->B4SOIebg = 1.2; - if (!model->B4SOIvevbGiven) - model->B4SOIvevb = 0.075; - if (!model->B4SOIalphaGB1Given) - model->B4SOIalphaGB1 = 0.35; - if (!model->B4SOIbetaGB1Given) - model->B4SOIbetaGB1 = 0.03; - if (!model->B4SOIvgb1Given) - model->B4SOIvgb1 = 300; - if (!model->B4SOIalphaGB2Given) - model->B4SOIalphaGB2 = 0.43; - if (!model->B4SOIbetaGB2Given) - model->B4SOIbetaGB2 = 0.05; - if (!model->B4SOIvecbGiven) - model->B4SOIvecb = 0.026; - if (!model->B4SOIvgb2Given) - model->B4SOIvgb2 = 17; - if (!model->B4SOIaigbcp2Given) - model->B4SOIaigbcp2 = 0.043; - if (!model->B4SOIbigbcp2Given) - model->B4SOIbigbcp2 = 0.0054; - if (!model->B4SOIcigbcp2Given) - model->B4SOIcigbcp2 = 0.0075; - if (!model->B4SOItoxqmGiven) - model->B4SOItoxqm = model->B4SOItox; - if (!model->B4SOIvoxhGiven) - model->B4SOIvoxh = 5.0; - if (!model->B4SOIdeltavoxGiven) - model->B4SOIdeltavox = 0.005; - -/* v3.0 */ - if (!model->B4SOIigbModGiven) - model->B4SOIigbMod = 0; - if (!model->B4SOIigcModGiven) - model->B4SOIigcMod = 0; - if (!model->B4SOInigcGiven) - model->B4SOInigc = 1.0; - if (!model->B4SOIaigcGiven) - model->B4SOIaigc = (model->B4SOItype == NMOS) ? 0.43 : 0.31; - if (!model->B4SOIbigcGiven) - model->B4SOIbigc = (model->B4SOItype == NMOS) ? 0.054 : 0.024; - if (!model->B4SOIcigcGiven) - model->B4SOIcigc = (model->B4SOItype == NMOS) ? 0.075 : 0.03; - if (!model->B4SOIaigsdGiven) - model->B4SOIaigsd = (model->B4SOItype == NMOS) ? 0.43 : 0.31; - if (!model->B4SOIbigsdGiven) - model->B4SOIbigsd = (model->B4SOItype == NMOS) ? 0.054 : 0.024; - if (!model->B4SOIcigsdGiven) - model->B4SOIcigsd = (model->B4SOItype == NMOS) ? 0.075 : 0.03; - if (!model->B4SOIpigcdGiven) - model->B4SOIpigcd = 1.0; - if (!model->B4SOIpoxedgeGiven) - model->B4SOIpoxedge = 1.0; - - - -/* v2.0 release */ - if (!model->B4SOIk1w1Given) - model->B4SOIk1w1 = 0.0; - if (!model->B4SOIk1w2Given) - model->B4SOIk1w2 = 0.0; - if (!model->B4SOIketasGiven) - model->B4SOIketas = 0.0; - if (!model->B4SOIdwbcGiven) - model->B4SOIdwbc = 0.0; - if (!model->B4SOIbeta0Given) - model->B4SOIbeta0 = 0.0; - if (!model->B4SOIbeta1Given) - model->B4SOIbeta1 = 0.0; - if (!model->B4SOIbeta2Given) - model->B4SOIbeta2 = 0.1; - if (!model->B4SOIvdsatii0Given) - model->B4SOIvdsatii0 = 0.9; - if (!model->B4SOItiiGiven) - model->B4SOItii = 0.0; - if (!model->B4SOIliiGiven) - model->B4SOIlii = 0.0; - if (!model->B4SOIsii0Given) - model->B4SOIsii0 = 0.5; - if (!model->B4SOIsii1Given) - model->B4SOIsii1 = 0.1; - if (!model->B4SOIsii2Given) - model->B4SOIsii2 = 0.0; - if (!model->B4SOIsiidGiven) - model->B4SOIsiid = 0.0; - if (!model->B4SOIfbjtiiGiven) - model->B4SOIfbjtii = 0.0; - /*4.1 Iii model*/ - if (!model->B4SOIebjtiiGiven) - model->B4SOIebjtii = 0.0; - if (!model->B4SOIcbjtiiGiven) - model->B4SOIcbjtii = 0.0; - if (!model->B4SOIvbciGiven) - model->B4SOIvbci = 0.0; - if (!model->B4SOItvbciGiven) - model->B4SOItvbci = 0.0; - if (!model->B4SOIabjtiiGiven) - model->B4SOIabjtii = 0.0; - if (!model->B4SOImbjtiiGiven) - model->B4SOImbjtii = 0.4; - - if (!model->B4SOIesatiiGiven) - model->B4SOIesatii = 1e7; - if (!model->B4SOIlnGiven) - model->B4SOIln = 2e-6; - if (!model->B4SOIvrec0Given) /* v4.0 */ - model->B4SOIvrec0 = 0; - if (!model->B4SOIvrec0dGiven) /* v4.0 */ - model->B4SOIvrec0d = model->B4SOIvrec0; - if (!model->B4SOIvtun0Given) /* v4.0 */ - model->B4SOIvtun0 = 0; - if (!model->B4SOIvtun0dGiven) /* v4.0 */ - model->B4SOIvtun0d = model->B4SOIvtun0; - if (!model->B4SOInbjtGiven) - model->B4SOInbjt = 1.0; - if (!model->B4SOIlbjt0Given) - model->B4SOIlbjt0 = 0.20e-6; - if (!model->B4SOIldif0Given) - model->B4SOIldif0 = 1.0; - if (!model->B4SOIvabjtGiven) - model->B4SOIvabjt = 10.0; - if (!model->B4SOIaelyGiven) - model->B4SOIaely = 0; - if (!model->B4SOIahliGiven) /* v4.0 */ - model->B4SOIahli = 0; - if (!model->B4SOIahlidGiven) /* v4.0 */ - model->B4SOIahlid = model->B4SOIahli; - if (!model->B4SOIrbodyGiven) - model->B4SOIrbody = 0.0; - if (!model->B4SOIrbshGiven) - model->B4SOIrbsh = 0.0; - if (!model->B4SOIntrecfGiven) - model->B4SOIntrecf = 0.0; - if (!model->B4SOIntrecrGiven) - model->B4SOIntrecr = 0.0; - if (!model->B4SOIndifGiven) - model->B4SOIndif = -1.0; - if (!model->B4SOIdlcbGiven) - model->B4SOIdlcb = 0.0; - if (!model->B4SOIfbodyGiven) - model->B4SOIfbody = 1.0; - if (!model->B4SOItcjswgGiven) - model->B4SOItcjswg = 0.0; - if (!model->B4SOItpbswgGiven) - model->B4SOItpbswg = 0.0; - if (!model->B4SOItcjswgdGiven) - model->B4SOItcjswgd = model->B4SOItcjswg; - if (!model->B4SOItpbswgdGiven) - model->B4SOItpbswgd = model->B4SOItpbswg; - if (!model->B4SOIacdeGiven) - model->B4SOIacde = 1.0; - if (!model->B4SOImoinGiven) - model->B4SOImoin = 15.0; - if (!model->B4SOInoffGiven) - model->B4SOInoff = 1.0; /* v3.2 */ - if (!model->B4SOIdelvtGiven) - model->B4SOIdelvt = 0.0; - if (!model->B4SOIkb1Given) - model->B4SOIkb1 = 1.0; - if (!model->B4SOIdlbgGiven) - model->B4SOIdlbg = 0.0; - -/* Added for binning - START */ - /* Length dependence */ -/* v3.1 */ - if (!model->B4SOIlxjGiven) - model->B4SOIlxj = 0.0; - if (!model->B4SOIlalphaGB1Given) - model->B4SOIlalphaGB1 = 0.0; - if (!model->B4SOIlalphaGB2Given) - model->B4SOIlalphaGB2 = 0.0; - if (!model->B4SOIlbetaGB1Given) - model->B4SOIlbetaGB1 = 0.0; - if (!model->B4SOIlbetaGB2Given) - model->B4SOIlbetaGB2 = 0.0; - if (!model->B4SOIlaigbcp2Given) - model->B4SOIlaigbcp2 = 0.0; - if (!model->B4SOIlbigbcp2Given) - model->B4SOIlbigbcp2 = 0.0; - if (!model->B4SOIlcigbcp2Given) - model->B4SOIlcigbcp2 = 0.0; - if (!model->B4SOIlndifGiven) - model->B4SOIlndif = 0.0; - if (!model->B4SOIlntrecfGiven) - model->B4SOIlntrecf = 0.0; - if (!model->B4SOIlntrecrGiven) - model->B4SOIlntrecr = 0.0; - if (!model->B4SOIlxbjtGiven) - model->B4SOIlxbjt = 0.0; - if (!model->B4SOIlxdifGiven) - model->B4SOIlxdif = 0.0; - if (!model->B4SOIlxrecGiven) - model->B4SOIlxrec = 0.0; - if (!model->B4SOIlxtunGiven) - model->B4SOIlxtun = 0.0; - if (!model->B4SOIlxdifdGiven) - model->B4SOIlxdifd = model->B4SOIlxdif; - if (!model->B4SOIlxrecdGiven) - model->B4SOIlxrecd = model->B4SOIlxrec; - if (!model->B4SOIlxtundGiven) - model->B4SOIlxtund = model->B4SOIlxtun; - if (!model->B4SOIlcgdlGiven) - model->B4SOIlcgdl = 0.0; - if (!model->B4SOIlcgslGiven) - model->B4SOIlcgsl = 0.0; - if (!model->B4SOIlckappaGiven) - model->B4SOIlckappa = 0.0; - if (!model->B4SOIluteGiven) - model->B4SOIlute = 0.0; - if (!model->B4SOIlkt1Given) - model->B4SOIlkt1 = 0.0; - if (!model->B4SOIlkt2Given) - model->B4SOIlkt2 = 0.0; - if (!model->B4SOIlkt1lGiven) - model->B4SOIlkt1l = 0.0; - if (!model->B4SOIlua1Given) - model->B4SOIlua1 = 0.0; - if (!model->B4SOIlub1Given) - model->B4SOIlub1 = 0.0; - if (!model->B4SOIluc1Given) - model->B4SOIluc1 = 0.0; - if (!model->B4SOIlatGiven) - model->B4SOIlat = 0.0; - if (!model->B4SOIlprtGiven) - model->B4SOIlprt = 0.0; - -/* v3.0 */ - if (!model->B4SOIlnigcGiven) - model->B4SOIlnigc = 0.0; - if (!model->B4SOIlpigcdGiven) - model->B4SOIlpigcd = 0.0; - if (!model->B4SOIlpoxedgeGiven) - model->B4SOIlpoxedge = 0.0; - if (!model->B4SOIlaigcGiven) - model->B4SOIlaigc = 0.0; - if (!model->B4SOIlbigcGiven) - model->B4SOIlbigc = 0.0; - if (!model->B4SOIlcigcGiven) - model->B4SOIlcigc = 0.0; - if (!model->B4SOIlaigsdGiven) - model->B4SOIlaigsd = 0.0; - if (!model->B4SOIlbigsdGiven) - model->B4SOIlbigsd = 0.0; - if (!model->B4SOIlcigsdGiven) - model->B4SOIlcigsd = 0.0; - - if (!model->B4SOIlnpeakGiven) - model->B4SOIlnpeak = 0.0; - if (!model->B4SOIlnsubGiven) - model->B4SOIlnsub = 0.0; - if (!model->B4SOIlngateGiven) - model->B4SOIlngate = 0.0; - if (!model->B4SOIlnsdGiven) - model->B4SOIlnsd = 0.0; - if (!model->B4SOIlvth0Given) - model->B4SOIlvth0 = 0.0; - if (!model->B4SOIlvfbGiven) - model->B4SOIlvfb = 0.0; /* v4.1 */ - if (!model->B4SOIlk1Given) - model->B4SOIlk1 = 0.0; - if (!model->B4SOIlk1w1Given) - model->B4SOIlk1w1 = 0.0; - if (!model->B4SOIlk1w2Given) - model->B4SOIlk1w2 = 0.0; - if (!model->B4SOIlk2Given) - model->B4SOIlk2 = 0.0; - if (!model->B4SOIlk3Given) - model->B4SOIlk3 = 0.0; - if (!model->B4SOIlk3bGiven) - model->B4SOIlk3b = 0.0; - if (!model->B4SOIlkb1Given) - model->B4SOIlkb1 = 0.0; - if (!model->B4SOIlw0Given) - model->B4SOIlw0 = 0.0; - if (!model->B4SOIllpebGiven) - model->B4SOIllpeb = 0.0; - if (!model->B4SOIldvt0Given) - model->B4SOIldvt0 = 0.0; - if (!model->B4SOIldvt1Given) - model->B4SOIldvt1 = 0.0; - if (!model->B4SOIldvt2Given) - model->B4SOIldvt2 = 0.0; - if (!model->B4SOIldvt0wGiven) - model->B4SOIldvt0w = 0.0; - if (!model->B4SOIldvt1wGiven) - model->B4SOIldvt1w = 0.0; - if (!model->B4SOIldvt2wGiven) - model->B4SOIldvt2w = 0.0; - if (!model->B4SOIlu0Given) - model->B4SOIlu0 = 0.0; - if (!model->B4SOIluaGiven) - model->B4SOIlua = 0.0; - if (!model->B4SOIlubGiven) - model->B4SOIlub = 0.0; - if (!model->B4SOIlucGiven) - model->B4SOIluc = 0.0; - if (!model->B4SOIlvsatGiven) - model->B4SOIlvsat = 0.0; - if (!model->B4SOIla0Given) - model->B4SOIla0 = 0.0; - if (!model->B4SOIlagsGiven) - model->B4SOIlags = 0.0; - if (!model->B4SOIlb0Given) - model->B4SOIlb0 = 0.0; - if (!model->B4SOIlb1Given) - model->B4SOIlb1 = 0.0; - if (!model->B4SOIlketaGiven) - model->B4SOIlketa = 0.0; - if (!model->B4SOIlketasGiven) - model->B4SOIlketas = 0.0; - if (!model->B4SOIla1Given) - model->B4SOIla1 = 0.0; - if (!model->B4SOIla2Given) - model->B4SOIla2 = 0.0; - if (!model->B4SOIlrdswGiven) - model->B4SOIlrdsw = 0.0; - if (!model->B4SOIlrswGiven) /* v4.0 */ - model->B4SOIlrsw = 0.0; - if (!model->B4SOIlrdwGiven) /* v4.0 */ - model->B4SOIlrdw = 0.0; - if (!model->B4SOIlprwbGiven) - model->B4SOIlprwb = 0.0; - if (!model->B4SOIlprwgGiven) - model->B4SOIlprwg = 0.0; - if (!model->B4SOIlwrGiven) - model->B4SOIlwr = 0.0; - if (!model->B4SOIlnfactorGiven) - model->B4SOIlnfactor = 0.0; - if (!model->B4SOIldwgGiven) - model->B4SOIldwg = 0.0; - if (!model->B4SOIldwbGiven) - model->B4SOIldwb = 0.0; - if (!model->B4SOIlvoffGiven) - model->B4SOIlvoff = 0.0; - if (!model->B4SOIleta0Given) - model->B4SOIleta0 = 0.0; - if (!model->B4SOIletabGiven) - model->B4SOIletab = 0.0; - if (!model->B4SOIldsubGiven) - model->B4SOIldsub = 0.0; - if (!model->B4SOIlcitGiven) - model->B4SOIlcit = 0.0; - if (!model->B4SOIlcdscGiven) - model->B4SOIlcdsc = 0.0; - if (!model->B4SOIlcdscbGiven) - model->B4SOIlcdscb = 0.0; - if (!model->B4SOIlcdscdGiven) - model->B4SOIlcdscd = 0.0; - if (!model->B4SOIlpclmGiven) - model->B4SOIlpclm = 0.0; - if (!model->B4SOIlpdibl1Given) - model->B4SOIlpdibl1 = 0.0; - if (!model->B4SOIlpdibl2Given) - model->B4SOIlpdibl2 = 0.0; - if (!model->B4SOIlpdiblbGiven) - model->B4SOIlpdiblb = 0.0; - if (!model->B4SOIldroutGiven) - model->B4SOIldrout = 0.0; - if (!model->B4SOIlpvagGiven) - model->B4SOIlpvag = 0.0; - if (!model->B4SOIldeltaGiven) - model->B4SOIldelta = 0.0; - if (!model->B4SOIlalpha0Given) - model->B4SOIlalpha0 = 0.0; - if (!model->B4SOIlfbjtiiGiven) - model->B4SOIlfbjtii = 0.0; - /*4.1 Iii model*/ - if (!model->B4SOIlebjtiiGiven) - model->B4SOIlebjtii = 0.0; - if (!model->B4SOIlcbjtiiGiven) - model->B4SOIlcbjtii = 0.0; - if (!model->B4SOIlvbciGiven) - model->B4SOIlvbci = 0.0; - if (!model->B4SOIlabjtiiGiven) - model->B4SOIlabjtii = 0.0; - if (!model->B4SOIlmbjtiiGiven) - model->B4SOIlmbjtii = 0.0; - - if (!model->B4SOIlbeta0Given) - model->B4SOIlbeta0 = 0.0; - if (!model->B4SOIlbeta1Given) - model->B4SOIlbeta1 = 0.0; - if (!model->B4SOIlbeta2Given) - model->B4SOIlbeta2 = 0.0; - if (!model->B4SOIlvdsatii0Given) - model->B4SOIlvdsatii0 = 0.0; - if (!model->B4SOIlliiGiven) - model->B4SOIllii = 0.0; - if (!model->B4SOIlesatiiGiven) - model->B4SOIlesatii = 0.0; - if (!model->B4SOIlsii0Given) - model->B4SOIlsii0 = 0.0; - if (!model->B4SOIlsii1Given) - model->B4SOIlsii1 = 0.0; - if (!model->B4SOIlsii2Given) - model->B4SOIlsii2 = 0.0; - if (!model->B4SOIlsiidGiven) - model->B4SOIlsiid = 0.0; - if (!model->B4SOIlagidlGiven) - model->B4SOIlagidl = 0.0; - if (!model->B4SOIlbgidlGiven) - model->B4SOIlbgidl = 0.0; - if (!model->B4SOIlcgidlGiven) - model->B4SOIlcgidl = 0.0; - if (!model->B4SOIlrgidlGiven) - model->B4SOIlrgidl = 0.0; - if (!model->B4SOIlkgidlGiven) - model->B4SOIlkgidl = 0.0; - if (!model->B4SOIlfgidlGiven) - model->B4SOIlfgidl = 0.0; - - if (!model->B4SOIlagislGiven) - model->B4SOIlagisl = 0.0; - if (!model->B4SOIlbgislGiven) - model->B4SOIlbgisl = 0.0; - if (!model->B4SOIlcgislGiven) - model->B4SOIlcgisl = 0.0; - if (!model->B4SOIlrgislGiven) - model->B4SOIlrgisl = 0.0; - if (!model->B4SOIlkgislGiven) - model->B4SOIlkgisl = 0.0; - if (!model->B4SOIlfgislGiven) - model->B4SOIlfgisl = 0.0; - if (!model->B4SOIlntunGiven) /* v4.0 */ - model->B4SOIlntun = 0.0; - if (!model->B4SOIlntundGiven) /* v4.0 */ - model->B4SOIlntund = model->B4SOIlntun; - if (!model->B4SOIlndiodeGiven) /* v4.0 */ - model->B4SOIlndiode = 0.0; - if (!model->B4SOIlndiodedGiven) /* v4.0 */ - model->B4SOIlndioded = model->B4SOIlndiode; - if (!model->B4SOIlnrecf0Given) /* v4.0 */ - model->B4SOIlnrecf0 = 0.0; - if (!model->B4SOIlnrecf0dGiven) /* v4.0 */ - model->B4SOIlnrecf0d = model->B4SOIlnrecf0; - if (!model->B4SOIlnrecr0Given) /* v4.0 */ - model->B4SOIlnrecr0 = 0.0; - if (!model->B4SOIlnrecr0dGiven) /* v4.0 */ - model->B4SOIlnrecr0d = model->B4SOIlnrecr0; - if (!model->B4SOIlisbjtGiven) - model->B4SOIlisbjt = 0.0; - if (!model->B4SOIlidbjtGiven) - model->B4SOIlidbjt = model->B4SOIlisbjt; - if (!model->B4SOIlisdifGiven) - model->B4SOIlisdif = 0.0; - if (!model->B4SOIliddifGiven) - model->B4SOIliddif = model->B4SOIlisdif; /* v4.0 */ - if (!model->B4SOIlisrecGiven) - model->B4SOIlisrec = 0.0; - if (!model->B4SOIlidrecGiven) - model->B4SOIlidrec = model->B4SOIlisrec; - if (!model->B4SOIlistunGiven) - model->B4SOIlistun = 0.0; - if (!model->B4SOIlidtunGiven) - model->B4SOIlidtun = model->B4SOIlistun; - if (!model->B4SOIlvrec0Given) /* v4.0 */ - model->B4SOIlvrec0 = 0; - if (!model->B4SOIlvrec0dGiven) /* v4.0 */ - model->B4SOIlvrec0d = model->B4SOIlvrec0; - if (!model->B4SOIlvtun0Given) /* v4.0 */ - model->B4SOIlvtun0 = 0; - if (!model->B4SOIlvtun0dGiven) /* v4.0 */ - model->B4SOIlvtun0d = model->B4SOIlvtun0; - if (!model->B4SOIlnbjtGiven) - model->B4SOIlnbjt = 0.0; - if (!model->B4SOIllbjt0Given) - model->B4SOIllbjt0 = 0.0; - if (!model->B4SOIlvabjtGiven) - model->B4SOIlvabjt = 0.0; - if (!model->B4SOIlaelyGiven) - model->B4SOIlaely = 0.0; - if (!model->B4SOIlahliGiven) /* v4.0 */ - model->B4SOIlahli = 0.0; - if (!model->B4SOIlahlidGiven) /* v4.0 */ - model->B4SOIlahlid = model->B4SOIlahli; - /* CV Model */ - if (!model->B4SOIlvsdfbGiven) - model->B4SOIlvsdfb = 0.0; - if (!model->B4SOIlvsdthGiven) - model->B4SOIlvsdth = 0.0; - if (!model->B4SOIldelvtGiven) - model->B4SOIldelvt = 0.0; - if (!model->B4SOIlacdeGiven) - model->B4SOIlacde = 0.0; - if (!model->B4SOIlmoinGiven) - model->B4SOIlmoin = 0.0; - if (!model->B4SOIlnoffGiven) - model->B4SOIlnoff = 0.0; /* v3.2 */ - -/* v3.1 added for RF */ - if (!model->B4SOIlxrcrg1Given) - model->B4SOIlxrcrg1 =0.0; - if (!model->B4SOIlxrcrg2Given) - model->B4SOIlxrcrg2 =0.0; -/* v3.1 added for RF end */ - - /* Width dependence */ -/* v3.1 */ - if (!model->B4SOIwxjGiven) - model->B4SOIwxj = 0.0; - if (!model->B4SOIwalphaGB1Given) - model->B4SOIwalphaGB1 = 0.0; - if (!model->B4SOIwalphaGB2Given) - model->B4SOIwalphaGB2 = 0.0; - if (!model->B4SOIwbetaGB1Given) - model->B4SOIwbetaGB1 = 0.0; - if (!model->B4SOIwbetaGB2Given) - model->B4SOIwbetaGB2 = 0.0; - if (!model->B4SOIwaigbcp2Given) - model->B4SOIwaigbcp2 = 0.0; - if (!model->B4SOIwbigbcp2Given) - model->B4SOIwbigbcp2 = 0.0; - if (!model->B4SOIwcigbcp2Given) - model->B4SOIwcigbcp2 = 0.0; - if (!model->B4SOIwndifGiven) - model->B4SOIwndif = 0.0; - if (!model->B4SOIwntrecfGiven) - model->B4SOIwntrecf = 0.0; - if (!model->B4SOIwntrecrGiven) - model->B4SOIwntrecr = 0.0; - if (!model->B4SOIwxbjtGiven) - model->B4SOIwxbjt = 0.0; - if (!model->B4SOIwxdifGiven) - model->B4SOIwxdif = 0.0; - if (!model->B4SOIwxrecGiven) - model->B4SOIwxrec = 0.0; - if (!model->B4SOIwxtunGiven) - model->B4SOIwxtun = 0.0; - if (!model->B4SOIwxdifdGiven) - model->B4SOIwxdifd = model->B4SOIwxdif; - if (!model->B4SOIwxrecdGiven) - model->B4SOIwxrecd = model->B4SOIwxrec; - if (!model->B4SOIwxtundGiven) - model->B4SOIwxtund = model->B4SOIwxtun; - if (!model->B4SOIwcgdlGiven) - model->B4SOIwcgdl = 0.0; - if (!model->B4SOIwcgslGiven) - model->B4SOIwcgsl = 0.0; - if (!model->B4SOIwckappaGiven) - model->B4SOIwckappa = 0.0; - if (!model->B4SOIwuteGiven) - model->B4SOIwute = 0.0; - if (!model->B4SOIwkt1Given) - model->B4SOIwkt1 = 0.0; - if (!model->B4SOIwkt2Given) - model->B4SOIwkt2 = 0.0; - if (!model->B4SOIwkt1lGiven) - model->B4SOIwkt1l = 0.0; - if (!model->B4SOIwua1Given) - model->B4SOIwua1 = 0.0; - if (!model->B4SOIwub1Given) - model->B4SOIwub1 = 0.0; - if (!model->B4SOIwuc1Given) - model->B4SOIwuc1 = 0.0; - if (!model->B4SOIwatGiven) - model->B4SOIwat = 0.0; - if (!model->B4SOIwprtGiven) - model->B4SOIwprt = 0.0; - - -/* v3.0 */ - if (!model->B4SOIwnigcGiven) - model->B4SOIwnigc = 0.0; - if (!model->B4SOIwpigcdGiven) - model->B4SOIwpigcd = 0.0; - if (!model->B4SOIwpoxedgeGiven) - model->B4SOIwpoxedge = 0.0; - if (!model->B4SOIwaigcGiven) - model->B4SOIwaigc = 0.0; - if (!model->B4SOIwbigcGiven) - model->B4SOIwbigc = 0.0; - if (!model->B4SOIwcigcGiven) - model->B4SOIwcigc = 0.0; - if (!model->B4SOIwaigsdGiven) - model->B4SOIwaigsd = 0.0; - if (!model->B4SOIwbigsdGiven) - model->B4SOIwbigsd = 0.0; - if (!model->B4SOIwcigsdGiven) - model->B4SOIwcigsd = 0.0; - - if (!model->B4SOIwnpeakGiven) - model->B4SOIwnpeak = 0.0; - if (!model->B4SOIwnsubGiven) - model->B4SOIwnsub = 0.0; - if (!model->B4SOIwngateGiven) - model->B4SOIwngate = 0.0; - if (!model->B4SOIwnsdGiven) - model->B4SOIwnsd = 0.0; - if (!model->B4SOIwvth0Given) - model->B4SOIwvth0 = 0.0; - if (!model->B4SOIwvfbGiven) - model->B4SOIwvfb = 0.0; /* v4.1 */ - if (!model->B4SOIwk1Given) - model->B4SOIwk1 = 0.0; - if (!model->B4SOIwk1w1Given) - model->B4SOIwk1w1 = 0.0; - if (!model->B4SOIwk1w2Given) - model->B4SOIwk1w2 = 0.0; - if (!model->B4SOIwk2Given) - model->B4SOIwk2 = 0.0; - if (!model->B4SOIwk3Given) - model->B4SOIwk3 = 0.0; - if (!model->B4SOIwk3bGiven) - model->B4SOIwk3b = 0.0; - if (!model->B4SOIwkb1Given) - model->B4SOIwkb1 = 0.0; - if (!model->B4SOIww0Given) - model->B4SOIww0 = 0.0; - if (!model->B4SOIwlpebGiven) - model->B4SOIwlpeb = 0.0; - if (!model->B4SOIwdvt0Given) - model->B4SOIwdvt0 = 0.0; - if (!model->B4SOIwdvt1Given) - model->B4SOIwdvt1 = 0.0; - if (!model->B4SOIwdvt2Given) - model->B4SOIwdvt2 = 0.0; - if (!model->B4SOIwdvt0wGiven) - model->B4SOIwdvt0w = 0.0; - if (!model->B4SOIwdvt1wGiven) - model->B4SOIwdvt1w = 0.0; - if (!model->B4SOIwdvt2wGiven) - model->B4SOIwdvt2w = 0.0; - if (!model->B4SOIwu0Given) - model->B4SOIwu0 = 0.0; - if (!model->B4SOIwuaGiven) - model->B4SOIwua = 0.0; - if (!model->B4SOIwubGiven) - model->B4SOIwub = 0.0; - if (!model->B4SOIwucGiven) - model->B4SOIwuc = 0.0; - if (!model->B4SOIwvsatGiven) - model->B4SOIwvsat = 0.0; - if (!model->B4SOIwa0Given) - model->B4SOIwa0 = 0.0; - if (!model->B4SOIwagsGiven) - model->B4SOIwags = 0.0; - if (!model->B4SOIwb0Given) - model->B4SOIwb0 = 0.0; - if (!model->B4SOIwb1Given) - model->B4SOIwb1 = 0.0; - if (!model->B4SOIwketaGiven) - model->B4SOIwketa = 0.0; - if (!model->B4SOIwketasGiven) - model->B4SOIwketas = 0.0; - if (!model->B4SOIwa1Given) - model->B4SOIwa1 = 0.0; - if (!model->B4SOIwa2Given) - model->B4SOIwa2 = 0.0; - if (!model->B4SOIwrdswGiven) - model->B4SOIwrdsw = 0.0; - if (!model->B4SOIwrswGiven) /* v4.0 */ - model->B4SOIwrsw = 0.0; - if (!model->B4SOIwrdwGiven) /* v4.0 */ - model->B4SOIwrdw = 0.0; - if (!model->B4SOIwprwbGiven) - model->B4SOIwprwb = 0.0; - if (!model->B4SOIwprwgGiven) - model->B4SOIwprwg = 0.0; - if (!model->B4SOIwwrGiven) - model->B4SOIwwr = 0.0; - if (!model->B4SOIwnfactorGiven) - model->B4SOIwnfactor = 0.0; - if (!model->B4SOIwdwgGiven) - model->B4SOIwdwg = 0.0; - if (!model->B4SOIwdwbGiven) - model->B4SOIwdwb = 0.0; - if (!model->B4SOIwvoffGiven) - model->B4SOIwvoff = 0.0; - if (!model->B4SOIweta0Given) - model->B4SOIweta0 = 0.0; - if (!model->B4SOIwetabGiven) - model->B4SOIwetab = 0.0; - if (!model->B4SOIwdsubGiven) - model->B4SOIwdsub = 0.0; - if (!model->B4SOIwcitGiven) - model->B4SOIwcit = 0.0; - if (!model->B4SOIwcdscGiven) - model->B4SOIwcdsc = 0.0; - if (!model->B4SOIwcdscbGiven) - model->B4SOIwcdscb = 0.0; - if (!model->B4SOIwcdscdGiven) - model->B4SOIwcdscd = 0.0; - if (!model->B4SOIwpclmGiven) - model->B4SOIwpclm = 0.0; - if (!model->B4SOIwpdibl1Given) - model->B4SOIwpdibl1 = 0.0; - if (!model->B4SOIwpdibl2Given) - model->B4SOIwpdibl2 = 0.0; - if (!model->B4SOIwpdiblbGiven) - model->B4SOIwpdiblb = 0.0; - if (!model->B4SOIwdroutGiven) - model->B4SOIwdrout = 0.0; - if (!model->B4SOIwpvagGiven) - model->B4SOIwpvag = 0.0; - if (!model->B4SOIwdeltaGiven) - model->B4SOIwdelta = 0.0; - if (!model->B4SOIwalpha0Given) - model->B4SOIwalpha0 = 0.0; - if (!model->B4SOIwfbjtiiGiven) - model->B4SOIwfbjtii = 0.0; - /*4.1 Iii model*/ - if (!model->B4SOIwebjtiiGiven) - model->B4SOIwebjtii = 0.0; - if (!model->B4SOIwcbjtiiGiven) - model->B4SOIwcbjtii = 0.0; - if (!model->B4SOIwvbciGiven) - model->B4SOIwvbci = 0.0; - if (!model->B4SOIwabjtiiGiven) - model->B4SOIwabjtii = 0.0; - if (!model->B4SOIwmbjtiiGiven) - model->B4SOIwmbjtii = 0.0; - if (!model->B4SOIwbeta0Given) - model->B4SOIwbeta0 = 0.0; - if (!model->B4SOIwbeta1Given) - model->B4SOIwbeta1 = 0.0; - if (!model->B4SOIwbeta2Given) - model->B4SOIwbeta2 = 0.0; - if (!model->B4SOIwvdsatii0Given) - model->B4SOIwvdsatii0 = 0.0; - if (!model->B4SOIwliiGiven) - model->B4SOIwlii = 0.0; - if (!model->B4SOIwesatiiGiven) - model->B4SOIwesatii = 0.0; - if (!model->B4SOIwsii0Given) - model->B4SOIwsii0 = 0.0; - if (!model->B4SOIwsii1Given) - model->B4SOIwsii1 = 0.0; - if (!model->B4SOIwsii2Given) - model->B4SOIwsii2 = 0.0; - if (!model->B4SOIwsiidGiven) - model->B4SOIwsiid = 0.0; - if (!model->B4SOIwagidlGiven) - model->B4SOIwagidl = 0.0; - if (!model->B4SOIwbgidlGiven) - model->B4SOIwbgidl = 0.0; - if (!model->B4SOIwcgidlGiven) - model->B4SOIwcgidl = 0.0; - if (!model->B4SOIwrgidlGiven) - model->B4SOIwrgidl = 0.0; - if (!model->B4SOIwkgidlGiven) - model->B4SOIwkgidl = 0.0; - if (!model->B4SOIwfgidlGiven) - model->B4SOIwfgidl = 0.0; - - if (!model->B4SOIwagislGiven) - model->B4SOIwagisl = 0.0; - if (!model->B4SOIwbgislGiven) - model->B4SOIwbgisl = 0.0; - if (!model->B4SOIwcgislGiven) - model->B4SOIwcgisl = 0.0; - if (!model->B4SOIwrgislGiven) - model->B4SOIwrgisl = 0.0; - if (!model->B4SOIwkgislGiven) - model->B4SOIwkgisl = 0.0; - if (!model->B4SOIwfgislGiven) - model->B4SOIwfgisl = 0.0; - if (!model->B4SOIwntunGiven) /* v4.0 */ - model->B4SOIwntun = 0.0; - if (!model->B4SOIwntundGiven) /* v4.0 */ - model->B4SOIwntund = model->B4SOIwntun; - if (!model->B4SOIwndiodeGiven) /* v4.0 */ - model->B4SOIwndiode = 0.0; - if (!model->B4SOIwndiodedGiven) /* v4.0 */ - model->B4SOIwndioded = model->B4SOIwndiode; - if (!model->B4SOIwnrecf0Given) /* v4.0 */ - model->B4SOIwnrecf0 = 0.0; - if (!model->B4SOIwnrecf0dGiven) /* v4.0 */ - model->B4SOIwnrecf0d = model->B4SOIwnrecf0; - if (!model->B4SOIwnrecr0Given) /* v4.0 */ - model->B4SOIwnrecr0 = 0.0; - if (!model->B4SOIwnrecr0dGiven) /* v4.0 */ - model->B4SOIwnrecr0d = model->B4SOIwnrecr0; - if (!model->B4SOIwisbjtGiven) - model->B4SOIwisbjt = 0.0; - if (!model->B4SOIwidbjtGiven) - model->B4SOIwidbjt = model->B4SOIwisbjt; - if (!model->B4SOIwisdifGiven) - model->B4SOIwisdif = 0.0; - if (!model->B4SOIwiddifGiven) - model->B4SOIwiddif = model->B4SOIwisdif; /* v4.0 */ - if (!model->B4SOIwisrecGiven) - model->B4SOIwisrec = 0.0; - if (!model->B4SOIwidrecGiven) - model->B4SOIwidrec = model->B4SOIwisrec; - if (!model->B4SOIwistunGiven) - model->B4SOIwistun = 0.0; - if (!model->B4SOIwidtunGiven) - model->B4SOIwidtun = model->B4SOIwistun; - if (!model->B4SOIwvrec0Given) /* v4.0 */ - model->B4SOIwvrec0 = 0; - if (!model->B4SOIwvrec0dGiven) /* v4.0 */ - model->B4SOIwvrec0d = model->B4SOIwvrec0; - if (!model->B4SOIwvtun0Given) /* v4.0 */ - model->B4SOIwvtun0 = 0; - if (!model->B4SOIwvtun0dGiven) /* v4.0 */ - model->B4SOIwvtun0d = model->B4SOIwvtun0; - if (!model->B4SOIwnbjtGiven) - model->B4SOIwnbjt = 0.0; - if (!model->B4SOIwlbjt0Given) - model->B4SOIwlbjt0 = 0.0; - if (!model->B4SOIwvabjtGiven) - model->B4SOIwvabjt = 0.0; - if (!model->B4SOIwaelyGiven) - model->B4SOIwaely = 0.0; - if (!model->B4SOIwahliGiven) /* v4.0 */ - model->B4SOIwahli = 0.0; - if (!model->B4SOIwahlidGiven) /* v4.0 */ - model->B4SOIwahlid = model->B4SOIwahli; - -/* v3.1 added for RF */ - if (!model->B4SOIwxrcrg1Given) - model->B4SOIwxrcrg1 =0.0; - if (!model->B4SOIwxrcrg2Given) - model->B4SOIwxrcrg2 =0.0; -/* v3.1 added for RF end */ - - /* CV Model */ - if (!model->B4SOIwvsdfbGiven) - model->B4SOIwvsdfb = 0.0; - if (!model->B4SOIwvsdthGiven) - model->B4SOIwvsdth = 0.0; - if (!model->B4SOIwdelvtGiven) - model->B4SOIwdelvt = 0.0; - if (!model->B4SOIwacdeGiven) - model->B4SOIwacde = 0.0; - if (!model->B4SOIwmoinGiven) - model->B4SOIwmoin = 0.0; - if (!model->B4SOIwnoffGiven) - model->B4SOIwnoff = 0.0; /* v3.2 */ - - /* Cross-term dependence */ -/* v3.1 */ - if (!model->B4SOIpxjGiven) - model->B4SOIpxj = 0.0; - if (!model->B4SOIpalphaGB1Given) - model->B4SOIpalphaGB1 = 0.0; - if (!model->B4SOIpalphaGB2Given) - model->B4SOIpalphaGB2 = 0.0; - if (!model->B4SOIpbetaGB1Given) - model->B4SOIpbetaGB1 = 0.0; - if (!model->B4SOIpbetaGB2Given) - model->B4SOIpbetaGB2 = 0.0; - if (!model->B4SOIpaigbcp2Given) - model->B4SOIpaigbcp2 = 0.0; - if (!model->B4SOIpbigbcp2Given) - model->B4SOIpbigbcp2 = 0.0; - if (!model->B4SOIpcigbcp2Given) - model->B4SOIpcigbcp2 = 0.0; - if (!model->B4SOIpndifGiven) - model->B4SOIpndif = 0.0; - if (!model->B4SOIpntrecfGiven) - model->B4SOIpntrecf = 0.0; - if (!model->B4SOIpntrecrGiven) - model->B4SOIpntrecr = 0.0; - if (!model->B4SOIpxbjtGiven) - model->B4SOIpxbjt = 0.0; - if (!model->B4SOIpxdifGiven) - model->B4SOIpxdif = 0.0; - if (!model->B4SOIpxrecGiven) - model->B4SOIpxrec = 0.0; - if (!model->B4SOIpxtunGiven) - model->B4SOIpxtun = 0.0; - if (!model->B4SOIpxdifdGiven) - model->B4SOIpxdifd = model->B4SOIpxdif; - if (!model->B4SOIpxrecdGiven) - model->B4SOIpxrecd = model->B4SOIpxrec; - if (!model->B4SOIpxtundGiven) - model->B4SOIpxtund = model->B4SOIpxtun; - if (!model->B4SOIpcgdlGiven) - model->B4SOIpcgdl = 0.0; - if (!model->B4SOIpcgslGiven) - model->B4SOIpcgsl = 0.0; - if (!model->B4SOIpckappaGiven) - model->B4SOIpckappa = 0.0; - if (!model->B4SOIputeGiven) - model->B4SOIpute = 0.0; - if (!model->B4SOIpkt1Given) - model->B4SOIpkt1 = 0.0; - if (!model->B4SOIpkt2Given) - model->B4SOIpkt2 = 0.0; - if (!model->B4SOIpkt1lGiven) - model->B4SOIpkt1l = 0.0; - if (!model->B4SOIpua1Given) - model->B4SOIpua1 = 0.0; - if (!model->B4SOIpub1Given) - model->B4SOIpub1 = 0.0; - if (!model->B4SOIpuc1Given) - model->B4SOIpuc1 = 0.0; - if (!model->B4SOIpatGiven) - model->B4SOIpat = 0.0; - if (!model->B4SOIpprtGiven) - model->B4SOIpprt = 0.0; - - -/* v3.0 */ - if (!model->B4SOIpnigcGiven) - model->B4SOIpnigc = 0.0; - if (!model->B4SOIppigcdGiven) - model->B4SOIppigcd = 0.0; - if (!model->B4SOIppoxedgeGiven) - model->B4SOIppoxedge = 0.0; - if (!model->B4SOIpaigcGiven) - model->B4SOIpaigc = 0.0; - if (!model->B4SOIpbigcGiven) - model->B4SOIpbigc = 0.0; - if (!model->B4SOIpcigcGiven) - model->B4SOIpcigc = 0.0; - if (!model->B4SOIpaigsdGiven) - model->B4SOIpaigsd = 0.0; - if (!model->B4SOIpbigsdGiven) - model->B4SOIpbigsd = 0.0; - if (!model->B4SOIpcigsdGiven) - model->B4SOIpcigsd = 0.0; - - if (!model->B4SOIpnpeakGiven) - model->B4SOIpnpeak = 0.0; - if (!model->B4SOIpnsubGiven) - model->B4SOIpnsub = 0.0; - if (!model->B4SOIpngateGiven) - model->B4SOIpngate = 0.0; - if (!model->B4SOIpnsdGiven) - model->B4SOIpnsd = 0.0; - if (!model->B4SOIpvth0Given) - model->B4SOIpvth0 = 0.0; - if (!model->B4SOIpvfbGiven) - model->B4SOIpvfb = 0.0; /* v4.1 */ - if (!model->B4SOIpk1Given) - model->B4SOIpk1 = 0.0; - if (!model->B4SOIpk1w1Given) - model->B4SOIpk1w1 = 0.0; - if (!model->B4SOIpk1w2Given) - model->B4SOIpk1w2 = 0.0; - if (!model->B4SOIpk2Given) - model->B4SOIpk2 = 0.0; - if (!model->B4SOIpk3Given) - model->B4SOIpk3 = 0.0; - if (!model->B4SOIpk3bGiven) - model->B4SOIpk3b = 0.0; - if (!model->B4SOIpkb1Given) - model->B4SOIpkb1 = 0.0; - if (!model->B4SOIpw0Given) - model->B4SOIpw0 = 0.0; - if (!model->B4SOIplpebGiven) - model->B4SOIplpeb = 0.0; - if (!model->B4SOIpdvt0Given) - model->B4SOIpdvt0 = 0.0; - if (!model->B4SOIpdvt1Given) - model->B4SOIpdvt1 = 0.0; - if (!model->B4SOIpdvt2Given) - model->B4SOIpdvt2 = 0.0; - if (!model->B4SOIpdvt0wGiven) - model->B4SOIpdvt0w = 0.0; - if (!model->B4SOIpdvt1wGiven) - model->B4SOIpdvt1w = 0.0; - if (!model->B4SOIpdvt2wGiven) - model->B4SOIpdvt2w = 0.0; - if (!model->B4SOIpu0Given) - model->B4SOIpu0 = 0.0; - if (!model->B4SOIpuaGiven) - model->B4SOIpua = 0.0; - if (!model->B4SOIpubGiven) - model->B4SOIpub = 0.0; - if (!model->B4SOIpucGiven) - model->B4SOIpuc = 0.0; - if (!model->B4SOIpvsatGiven) - model->B4SOIpvsat = 0.0; - if (!model->B4SOIpa0Given) - model->B4SOIpa0 = 0.0; - if (!model->B4SOIpagsGiven) - model->B4SOIpags = 0.0; - if (!model->B4SOIpb0Given) - model->B4SOIpb0 = 0.0; - if (!model->B4SOIpb1Given) - model->B4SOIpb1 = 0.0; - if (!model->B4SOIpketaGiven) - model->B4SOIpketa = 0.0; - if (!model->B4SOIpketasGiven) - model->B4SOIpketas = 0.0; - if (!model->B4SOIpa1Given) - model->B4SOIpa1 = 0.0; - if (!model->B4SOIpa2Given) - model->B4SOIpa2 = 0.0; - if (!model->B4SOIprdswGiven) - model->B4SOIprdsw = 0.0; - if (!model->B4SOIprswGiven) /* v4.0 */ - model->B4SOIprsw = 0.0; - if (!model->B4SOIprdwGiven) /* v4.0 */ - model->B4SOIprdw = 0.0; - if (!model->B4SOIpprwbGiven) - model->B4SOIpprwb = 0.0; - if (!model->B4SOIpprwgGiven) - model->B4SOIpprwg = 0.0; - if (!model->B4SOIpwrGiven) - model->B4SOIpwr = 0.0; - if (!model->B4SOIpnfactorGiven) - model->B4SOIpnfactor = 0.0; - if (!model->B4SOIpdwgGiven) - model->B4SOIpdwg = 0.0; - if (!model->B4SOIpdwbGiven) - model->B4SOIpdwb = 0.0; - if (!model->B4SOIpvoffGiven) - model->B4SOIpvoff = 0.0; - if (!model->B4SOIpeta0Given) - model->B4SOIpeta0 = 0.0; - if (!model->B4SOIpetabGiven) - model->B4SOIpetab = 0.0; - if (!model->B4SOIpdsubGiven) - model->B4SOIpdsub = 0.0; - if (!model->B4SOIpcitGiven) - model->B4SOIpcit = 0.0; - if (!model->B4SOIpcdscGiven) - model->B4SOIpcdsc = 0.0; - if (!model->B4SOIpcdscbGiven) - model->B4SOIpcdscb = 0.0; - if (!model->B4SOIpcdscdGiven) - model->B4SOIpcdscd = 0.0; - if (!model->B4SOIppclmGiven) - model->B4SOIppclm = 0.0; - if (!model->B4SOIppdibl1Given) - model->B4SOIppdibl1 = 0.0; - if (!model->B4SOIppdibl2Given) - model->B4SOIppdibl2 = 0.0; - if (!model->B4SOIppdiblbGiven) - model->B4SOIppdiblb = 0.0; - if (!model->B4SOIpdroutGiven) - model->B4SOIpdrout = 0.0; - if (!model->B4SOIppvagGiven) - model->B4SOIppvag = 0.0; - if (!model->B4SOIpdeltaGiven) - model->B4SOIpdelta = 0.0; - if (!model->B4SOIpalpha0Given) - model->B4SOIpalpha0 = 0.0; - if (!model->B4SOIpfbjtiiGiven) - model->B4SOIpfbjtii = 0.0; - /*4.1 Iii model*/ - if (!model->B4SOIpebjtiiGiven) - model->B4SOIpebjtii = 0.0; - if (!model->B4SOIpcbjtiiGiven) - model->B4SOIpcbjtii = 0.0; - if (!model->B4SOIpvbciGiven) - model->B4SOIpvbci = 0.0; - if (!model->B4SOIpabjtiiGiven) - model->B4SOIpabjtii = 0.0; - if (!model->B4SOIpmbjtiiGiven) - model->B4SOIpmbjtii = 0.0; - if (!model->B4SOIpbeta0Given) - model->B4SOIpbeta0 = 0.0; - if (!model->B4SOIpbeta1Given) - model->B4SOIpbeta1 = 0.0; - if (!model->B4SOIpbeta2Given) - model->B4SOIpbeta2 = 0.0; - if (!model->B4SOIpvdsatii0Given) - model->B4SOIpvdsatii0 = 0.0; - if (!model->B4SOIpliiGiven) - model->B4SOIplii = 0.0; - if (!model->B4SOIpesatiiGiven) - model->B4SOIpesatii = 0.0; - if (!model->B4SOIpsii0Given) - model->B4SOIpsii0 = 0.0; - if (!model->B4SOIpsii1Given) - model->B4SOIpsii1 = 0.0; - if (!model->B4SOIpsii2Given) - model->B4SOIpsii2 = 0.0; - if (!model->B4SOIpsiidGiven) - model->B4SOIpsiid = 0.0; - if (!model->B4SOIpagidlGiven) - model->B4SOIpagidl = 0.0; - if (!model->B4SOIpbgidlGiven) - model->B4SOIpbgidl = 0.0; - if (!model->B4SOIpcgidlGiven) - model->B4SOIpcgidl = 0.0; - if (!model->B4SOIprgidlGiven) - model->B4SOIprgidl = 0.0; - if (!model->B4SOIpkgidlGiven) - model->B4SOIpkgidl = 0.0; - if (!model->B4SOIpfgidlGiven) - model->B4SOIpfgidl = 0.0; - - if (!model->B4SOIpagislGiven) - model->B4SOIpagisl = 0.0; - if (!model->B4SOIpbgislGiven) - model->B4SOIpbgisl = 0.0; - if (!model->B4SOIpcgislGiven) - model->B4SOIpcgisl = 0.0; - if (!model->B4SOIprgislGiven) - model->B4SOIprgisl = 0.0; - if (!model->B4SOIpkgislGiven) - model->B4SOIpkgisl = 0.0; - if (!model->B4SOIpfgislGiven) - model->B4SOIpfgisl = 0.0; - if (!model->B4SOIpntunGiven) /* v4.0 */ - model->B4SOIpntun = 0.0; - if (!model->B4SOIpntundGiven) /* v4.0 */ - model->B4SOIpntund = model->B4SOIpntun; - if (!model->B4SOIpndiodeGiven) /* v4.0 */ - model->B4SOIpndiode = 0.0; - if (!model->B4SOIpndiodedGiven) /* v4.0 */ - model->B4SOIpndioded = model->B4SOIpndiode; - if (!model->B4SOIpnrecf0Given) /* v4.0 */ - model->B4SOIpnrecf0 = 0.0; - if (!model->B4SOIpnrecf0dGiven) /* v4.0 */ - model->B4SOIpnrecf0d = model->B4SOIpnrecf0; - if (!model->B4SOIpnrecr0Given) /* v4.0 */ - model->B4SOIpnrecr0 = 0.0; - if (!model->B4SOIpnrecr0dGiven) /* v4.0 */ - model->B4SOIpnrecr0d = model->B4SOIpnrecr0; - if (!model->B4SOIpisbjtGiven) - model->B4SOIpisbjt = 0.0; - if (!model->B4SOIpidbjtGiven) - model->B4SOIpidbjt = model->B4SOIpisbjt; - if (!model->B4SOIpisdifGiven) - model->B4SOIpisdif = 0.0; - if (!model->B4SOIpiddifGiven) - model->B4SOIpiddif = model->B4SOIpisdif; /* v4.0 */ - if (!model->B4SOIpisrecGiven) - model->B4SOIpisrec = 0.0; - if (!model->B4SOIpidrecGiven) - model->B4SOIpidrec = model->B4SOIpisrec; - if (!model->B4SOIpistunGiven) - model->B4SOIpistun = 0.0; - if (!model->B4SOIpidtunGiven) - model->B4SOIpidtun = model->B4SOIpistun; - if (!model->B4SOIpvrec0Given) /* v4.0 */ - model->B4SOIpvrec0 = 0.0; - if (!model->B4SOIpvrec0dGiven) /* v4.0 */ - model->B4SOIpvrec0d = model->B4SOIpvrec0; - if (!model->B4SOIpvtun0Given) /* v4.0 */ - model->B4SOIpvtun0 = 0.0; - if (!model->B4SOIpvtun0dGiven) /* v4.0 */ - model->B4SOIpvtun0d = model->B4SOIpvtun0; - if (!model->B4SOIpnbjtGiven) - model->B4SOIpnbjt = 0.0; - if (!model->B4SOIplbjt0Given) - model->B4SOIplbjt0 = 0.0; - if (!model->B4SOIpvabjtGiven) - model->B4SOIpvabjt = 0.0; - if (!model->B4SOIpaelyGiven) - model->B4SOIpaely = 0.0; - if (!model->B4SOIpahliGiven) /* v4.0 */ - model->B4SOIpahli = 0.0; - if (!model->B4SOIpahlidGiven) /* v4.0 */ - model->B4SOIpahlid = model->B4SOIpahli; - -/* v3.1 for RF */ - if (!model->B4SOIpxrcrg1Given) - model->B4SOIpxrcrg1 =0.0; - if (!model->B4SOIpxrcrg2Given) - model->B4SOIpxrcrg2 =0.0; -/* v3.1 for RF end */ - - /* CV Model */ - if (!model->B4SOIpvsdfbGiven) - model->B4SOIpvsdfb = 0.0; - if (!model->B4SOIpvsdthGiven) - model->B4SOIpvsdth = 0.0; - if (!model->B4SOIpdelvtGiven) - model->B4SOIpdelvt = 0.0; - if (!model->B4SOIpacdeGiven) - model->B4SOIpacde = 0.0; - if (!model->B4SOIpmoinGiven) - model->B4SOIpmoin = 0.0; - if (!model->B4SOIpnoffGiven) - model->B4SOIpnoff = 0.0; /* v3.2 */ -/* Added for binning - END */ - - if (!model->B4SOIcfGiven) - model->B4SOIcf = 2.0 * EPSOX / PI - * log(1.0 + 0.4e-6 / model->B4SOItox); - if (!model->B4SOIcgdoGiven) - { if (model->B4SOIdlcGiven && (model->B4SOIdlc > 0.0)) - { model->B4SOIcgdo = model->B4SOIdlc * model->B4SOIcox - - model->B4SOIcgdl ; - } - else - model->B4SOIcgdo = 0.6 * model->B4SOIxj * model->B4SOIcox; - } - if (!model->B4SOIcgsoGiven) - { if (model->B4SOIdlcGiven && (model->B4SOIdlc > 0.0)) - { model->B4SOIcgso = model->B4SOIdlc * model->B4SOIcox - - model->B4SOIcgsl ; - } - else - model->B4SOIcgso = 0.6 * model->B4SOIxj * model->B4SOIcox; - } - - if (!model->B4SOIcgeoGiven) - { model->B4SOIcgeo = 0.0; - } - if (!model->B4SOIxpartGiven) - model->B4SOIxpart = 0.0; - if (!model->B4SOIsheetResistanceGiven) - model->B4SOIsheetResistance = 0.0; - if (!model->B4SOIcsdeswGiven) - model->B4SOIcsdesw = 0.0; - if (!model->B4SOIunitLengthGateSidewallJctCapSGiven) /* v4.0 */ - model->B4SOIunitLengthGateSidewallJctCapS = 1e-10; - if (!model->B4SOIunitLengthGateSidewallJctCapDGiven) /* v4.0 */ - model->B4SOIunitLengthGateSidewallJctCapD = model->B4SOIunitLengthGateSidewallJctCapS; - if (!model->B4SOIGatesidewallJctSPotentialGiven) /* v4.0 */ - model->B4SOIGatesidewallJctSPotential = 0.7; - if (!model->B4SOIGatesidewallJctDPotentialGiven) /* v4.0 */ - model->B4SOIGatesidewallJctDPotential = model->B4SOIGatesidewallJctSPotential; - if (!model->B4SOIbodyJctGateSideSGradingCoeffGiven) /* v4.0 */ - model->B4SOIbodyJctGateSideSGradingCoeff = 0.5; - if (!model->B4SOIbodyJctGateSideDGradingCoeffGiven) /* v4.0 */ - model->B4SOIbodyJctGateSideDGradingCoeff = model->B4SOIbodyJctGateSideSGradingCoeff; - if (!model->B4SOIoxideTrapDensityAGiven) - { if (model->B4SOItype == NMOS) - model->B4SOIoxideTrapDensityA = 6.25e41; - else - model->B4SOIoxideTrapDensityA=6.188e40; - } - if (!model->B4SOIoxideTrapDensityBGiven) - { if (model->B4SOItype == NMOS) - model->B4SOIoxideTrapDensityB = 3.125e26; - else - model->B4SOIoxideTrapDensityB = 1.5e25; - } - if (!model->B4SOIoxideTrapDensityCGiven) - model->B4SOIoxideTrapDensityC = 8.75e9; - - if (!model->B4SOIemGiven) - model->B4SOIem = 4.1e7; /* V/m */ - if (!model->B4SOIefGiven) - model->B4SOIef = 1.0; - if (!model->B4SOIafGiven) - model->B4SOIaf = 1.0; - if (!model->B4SOIkfGiven) - model->B4SOIkf = 0.0; - if (!model->B4SOInoifGiven) - model->B4SOInoif = 1.0; - if (!model->B4SOIbfGiven) /* v4.0 */ - model->B4SOIbf = 2.0; - if (!model->B4SOIw0flkGiven) /* v4.0 */ - model->B4SOIw0flk = 10.0e-6; - if (!model->B4SOIfrbodyGiven) /* v4.0 */ - model->B4SOIfrbody = 1; - if (!model->B4SOIdvtp0Given) /* v4.0 for Vth */ - model->B4SOIdvtp0 = 0.0; - if (!model->B4SOIdvtp1Given) /* v4.0 for Vth */ - model->B4SOIdvtp1 = 0.0; - if (!model->B4SOIdvtp2Given) /* v4.1 for Vth */ - model->B4SOIdvtp2 = 0.0; - if (!model->B4SOIdvtp3Given) /* v4.1 for Vth */ - model->B4SOIdvtp3 = 0.0; - if (!model->B4SOIdvtp4Given) /* v4.1 for Vth */ - model->B4SOIdvtp4 = 0.0; - if (!model->B4SOIldvtp0Given) /* v4.0 for Vth */ - model->B4SOIldvtp0 = 0.0; - if (!model->B4SOIldvtp1Given) /* v4.0 for Vth */ - model->B4SOIldvtp1 = 0.0; - if (!model->B4SOIldvtp2Given) /* v4.1 for Vth */ - model->B4SOIldvtp2 = 0.0; - if (!model->B4SOIldvtp3Given) /* v4.1 for Vth */ - model->B4SOIldvtp3 = 0.0; - if (!model->B4SOIldvtp4Given) /* v4.1 for Vth */ - model->B4SOIldvtp4 = 0.0; - if (!model->B4SOIwdvtp0Given) /* v4.0 for Vth */ - model->B4SOIwdvtp0 = 0.0; - if (!model->B4SOIwdvtp1Given) /* v4.0 for Vth */ - model->B4SOIwdvtp1 = 0.0; - if (!model->B4SOIwdvtp2Given) /* v4.1 for Vth */ - model->B4SOIwdvtp2 = 0.0; - if (!model->B4SOIwdvtp3Given) /* v4.1 for Vth */ - model->B4SOIwdvtp3 = 0.0; - if (!model->B4SOIwdvtp4Given) /* v4.1 for Vth */ - model->B4SOIwdvtp4 = 0.0; - if (!model->B4SOIpdvtp0Given) /* v4.0 for Vth */ - model->B4SOIpdvtp0 = 0.0; - if (!model->B4SOIpdvtp1Given) /* v4.0 for Vth */ - model->B4SOIpdvtp1 = 0.0; - if (!model->B4SOIpdvtp2Given) /* v4.1 for Vth */ - model->B4SOIpdvtp2 = 0.0; - if (!model->B4SOIpdvtp3Given) /* v4.1 for Vth */ - model->B4SOIpdvtp3 = 0.0; - if (!model->B4SOIpdvtp4Given) /* v4.1 for Vth */ - model->B4SOIpdvtp4 = 0.0; - if (!model->B4SOIminvGiven) /* v4.0 for Vgsteff */ - model->B4SOIminv = 0.0; - if (!model->B4SOIlminvGiven) /* v4.0 for Vgsteff */ - model->B4SOIlminv = 0.0; - if (!model->B4SOIwminvGiven) /* v4.0 for Vgsteff */ - model->B4SOIwminv = 0.0; - if (!model->B4SOIpminvGiven) /* v4.0 for Vgsteff */ - model->B4SOIpminv = 0.0; - if (!model->B4SOIfproutGiven) /* v4.0 for DITS in Id */ - model->B4SOIfprout = 0.0; - if (!model->B4SOIpditsGiven) - model->B4SOIpdits = 1e-20; - if (!model->B4SOIpditsdGiven) - model->B4SOIpditsd = 0.0; - if (!model->B4SOIpditslGiven) - model->B4SOIpditsl = 0.0; - if (!model->B4SOIlfproutGiven) - model->B4SOIlfprout = 0.0; - if (!model->B4SOIlpditsGiven) - model->B4SOIlpdits = 0.0; - if (!model->B4SOIlpditsdGiven) - model->B4SOIlpditsd = 0.0; - if (!model->B4SOIwfproutGiven) - model->B4SOIwfprout = 0.0; - if (!model->B4SOIwpditsGiven) - model->B4SOIwpdits = 0.0; - if (!model->B4SOIwpditsdGiven) - model->B4SOIwpditsd = 0.0; - if (!model->B4SOIpfproutGiven) - model->B4SOIpfprout = 0.0; - if (!model->B4SOIppditsGiven) - model->B4SOIppdits = 0.0; - if (!model->B4SOIppditsdGiven) - model->B4SOIppditsd = 0.0; - -/* v4.0 stress effect */ - if (!model->B4SOIsarefGiven) - model->B4SOIsaref = 1e-6; /* m */ - if (!model->B4SOIsbrefGiven) - model->B4SOIsbref = 1e-6; /* m */ - if (!model->B4SOIwlodGiven) - model->B4SOIwlod = 0; /* m */ - if (!model->B4SOIku0Given) - model->B4SOIku0 = 0; /* 1/m */ - if (!model->B4SOIkvsatGiven) - model->B4SOIkvsat = 0; - if (!model->B4SOIkvth0Given) /* m */ - model->B4SOIkvth0 = 0; - if (!model->B4SOItku0Given) - model->B4SOItku0 = 0; - if (!model->B4SOIllodku0Given) - model->B4SOIllodku0 = 0; - if (!model->B4SOIwlodku0Given) - model->B4SOIwlodku0 = 0; - if (!model->B4SOIllodvthGiven) - model->B4SOIllodvth = 0; - if (!model->B4SOIwlodvthGiven) - model->B4SOIwlodvth = 0; - if (!model->B4SOIlku0Given) - model->B4SOIlku0 = 0; - if (!model->B4SOIwku0Given) - model->B4SOIwku0 = 0; - if (!model->B4SOIpku0Given) - model->B4SOIpku0 = 0; - if (!model->B4SOIlkvth0Given) - model->B4SOIlkvth0 = 0; - if (!model->B4SOIwkvth0Given) - model->B4SOIwkvth0 = 0; - if (!model->B4SOIpkvth0Given) - model->B4SOIpkvth0 = 0; - if (!model->B4SOIstk2Given) - model->B4SOIstk2 = 0; - if (!model->B4SOIlodk2Given) - model->B4SOIlodk2 = 1.0; - if (!model->B4SOIsteta0Given) - model->B4SOIsteta0 = 0; - if (!model->B4SOIlodeta0Given) - model->B4SOIlodeta0 = 1.0; -/* stress effect end */ - - if (!model->B4SOIvgsMaxGiven) - model->B4SOIvgsMax = 1e99; - if (!model->B4SOIvgdMaxGiven) - model->B4SOIvgdMax = 1e99; - if (!model->B4SOIvgbMaxGiven) - model->B4SOIvgbMax = 1e99; - if (!model->B4SOIvdsMaxGiven) - model->B4SOIvdsMax = 1e99; - if (!model->B4SOIvbsMaxGiven) - model->B4SOIvbsMax = 1e99; - if (!model->B4SOIvbdMaxGiven) - model->B4SOIvbdMax = 1e99; - if (!model->B4SOIvgsrMaxGiven) - model->B4SOIvgsrMax = 1e99; - if (!model->B4SOIvgdrMaxGiven) - model->B4SOIvgdrMax = 1e99; - if (!model->B4SOIvgbrMaxGiven) - model->B4SOIvgbrMax = 1e99; - if (!model->B4SOIvbsrMaxGiven) - model->B4SOIvbsrMax = 1e99; - if (!model->B4SOIvbdrMaxGiven) - model->B4SOIvbdrMax = 1e99; - - if (!model->B4SOIfdModGiven) - model->B4SOIfdMod = 0; - if (!model->B4SOIvsceGiven) - model->B4SOIvsce = 0.0; - if (!model->B4SOIcdsbsGiven) - model->B4SOIcdsbs = 0.0; - if (!model->B4SOIminvcvGiven) /* v4.1 for Vgsteffcv */ - model->B4SOIminvcv = 0.0; - if (!model->B4SOIlminvcvGiven) /* v4.1 for Vgsteffcv */ - model->B4SOIlminvcv = 0.0; - if (!model->B4SOIwminvcvGiven) /* v4.1 for Vgsteffcv */ - model->B4SOIwminvcv = 0.0; - if (!model->B4SOIpminvcvGiven) /* v4.1 for Vgsteffcv */ - model->B4SOIpminvcv = 0.0; - if (!model->B4SOIvoffcvGiven) - /*model->B4SOIvoffcv = -0.08; v4.2 */ - model->B4SOIvoffcv = 0.0; - if (!model->B4SOIlvoffcvGiven) - model->B4SOIlvoffcv = 0.0; - if (!model->B4SOIwvoffcvGiven) - model->B4SOIwvoffcv = 0.0; - if (!model->B4SOIpvoffcvGiven) - model->B4SOIpvoffcv = 0.0; - /* loop through all the instances of the model */ - for (here = B4SOIinstances(model); here != NULL ; - here=B4SOInextInstance(here)) - { /* allocate a chunk of the state vector */ - here->B4SOIstates = *states; - *states += B4SOInumStates; - /* perform the parameter defaulting */ - if (!here->B4SOIdrainAreaGiven) - here->B4SOIdrainArea = 0.0; - if (!here->B4SOIdrainPerimeterGiven) - here->B4SOIdrainPerimeter = 0.0; - if (!here->B4SOIdrainSquaresGiven) - here->B4SOIdrainSquares = 1.0; - if (!here->B4SOIicVBSGiven) - here->B4SOIicVBS = 0; - if (!here->B4SOIicVDSGiven) - here->B4SOIicVDS = 0; - if (!here->B4SOIicVGSGiven) - here->B4SOIicVGS = 0; - if (!here->B4SOIicVESGiven) - here->B4SOIicVES = 0; - if (!here->B4SOIicVPSGiven) - here->B4SOIicVPS = 0; - if (!here->B4SOIbjtoffGiven) - here->B4SOIbjtoff = 0; - if (!here->B4SOIdebugModGiven) - here->B4SOIdebugMod = 0; - if (!here->B4SOIrth0Given) - here->B4SOIrth0 = model->B4SOIrth0; - if (!here->B4SOIcth0Given) - here->B4SOIcth0 = model->B4SOIcth0; - if (!here->B4SOIbodySquaresGiven) - here->B4SOIbodySquares = 1.0; - if (!here->B4SOIfrbodyGiven) - here->B4SOIfrbody = model->B4SOIfrbody; /* v4.0 */ - if (!here->B4SOIlGiven) - here->B4SOIl = 5e-6; - if (!here->B4SOIsourceAreaGiven) - here->B4SOIsourceArea = 0; - if (!here->B4SOIsourcePerimeterGiven) - here->B4SOIsourcePerimeter = 0; - if (!here->B4SOIsourceSquaresGiven) - here->B4SOIsourceSquares = 1; - if (!here->B4SOIwGiven) - here->B4SOIw = 5e-6; - if (!here->B4SOImGiven) - here->B4SOIm = 1; -/* v2.0 release */ - if (!here->B4SOInbcGiven) - here->B4SOInbc = 0; - if (!here->B4SOInsegGiven) - here->B4SOInseg = 1; - if (!here->B4SOIpdbcpGiven) - here->B4SOIpdbcp = 0; - if (!here->B4SOIpsbcpGiven) - here->B4SOIpsbcp = 0; - if (!here->B4SOIagbcpGiven) - here->B4SOIagbcp = 0; - if (!here->B4SOIagbcp2Given) - here->B4SOIagbcp2 = 0; /* v4.1 */ - if (!here->B4SOIagbcpdGiven) - here->B4SOIagbcpd = here->B4SOIagbcp; - if (!here->B4SOIaebcpGiven) - here->B4SOIaebcp = 0; - - if (!here->B4SOIoffGiven) - here->B4SOIoff = 0; - - /* process drain series resistance */ - - if ( ((model->B4SOIsheetResistance > 0.0) && - (here->B4SOIdrainSquares > 0.0 ) && - (here->B4SOIdNodePrime == 0)) ) - { error = CKTmkVolt(ckt,&tmp,here->B4SOIname,"drain"); - if(error) return(error); - here->B4SOIdNodePrime = tmp->number; - } - else - { here->B4SOIdNodePrime = here->B4SOIdNode; - } - - /* process source series resistance */ - if ( ((model->B4SOIsheetResistance > 0.0) && - (here->B4SOIsourceSquares > 0.0 ) && - (here->B4SOIsNodePrime == 0)) ) - { error = CKTmkVolt(ckt,&tmp,here->B4SOIname,"source"); - if(error) return(error); - here->B4SOIsNodePrime = tmp->number; - } - else - { here->B4SOIsNodePrime = here->B4SOIsNode; - } - -/* v4.4 -- Check of TsiMax for SOIMOD = 2 */ - if (model->B4SOIsoiMod == 2){ - if (model->B4SOImtrlMod){ - NchMax = (model->B4SOIbg0sub - 0.1) / Charge_q * 2.0e-6 * epssub / (model->B4SOIetsi * model->B4SOIetsi); - if (model->B4SOInpeak > NchMax ){ - printf("Warning: SOIMOD=2 can not support given Nch=%g cm^-3 and Etsi=%g m. \n ", model->B4SOInpeak, model->B4SOIetsi); - printf("Exceeds maximum allowed band bending of (Eg-0.1)eV. \n"); - printf("Nch is set to %g cm^-3. \n",NchMax); - model->B4SOInpeak = NchMax; - } - } else { - NchMax = (1.12 - 0.1) / Charge_q * 2.0e-6 * epssub / (model->B4SOItsi * model->B4SOItsi); - if (model->B4SOInpeak > NchMax ) { - printf("Warning: SOIMOD=2 can not support given Nch=%g cm^-3 and Tsi=%g m. \n", model->B4SOInpeak, model->B4SOItsi); - printf("Exceeds maximum allowed band bending of (Eg-0.1)eV. \n"); - printf("Nch is set to %g cm^-3. \n",NchMax); - model->B4SOInpeak = NchMax; - } - } - } - - /* process effective silicon film thickness */ - model->B4SOIcbox = 3.453133e-11 / model->B4SOItbox; - if(model->B4SOImtrlMod) - { - model->B4SOIcsi = 1.03594e-10 / model->B4SOIetsi; - } - else - { - model->B4SOIcsi = 1.03594e-10 / model->B4SOItsi; - } - Cboxt = model->B4SOIcbox * model->B4SOIcsi / (model->B4SOIcbox + model->B4SOIcsi); - - -/* v3.2 */ - if(model->B4SOImtrlMod) - { - Qsi = Charge_q * model->B4SOInpeak - * (1.0 + model->B4SOIlpe0 / here->B4SOIl) * 1e6 * model->B4SOIetsi; - } - else - { - Qsi = Charge_q * model->B4SOInpeak - * (1.0 + model->B4SOIlpe0 / here->B4SOIl) * 1e6 * model->B4SOItsi; - } - Vbs0t = 0.8 - 0.5 * Qsi / model->B4SOIcsi + model->B4SOIvbsa; - - if (!here->B4SOIsoiModGiven) - here->B4SOIsoiMod = model->B4SOIsoiMod; - else if ((here->B4SOIsoiMod != 0) && (here->B4SOIsoiMod != 1) - && (here->B4SOIsoiMod != 2) && (here->B4SOIsoiMod != 3)) - { here->B4SOIsoiMod = model->B4SOIsoiMod; - printf("Warning: soiMod has been set to its global value %d.\n", model->B4SOIsoiMod); - } - - if (here->B4SOIsoiMod == 3) { /* auto selection */ - if (Vbs0t > model->B4SOIvbs0fd) - here->B4SOIsoiMod = 2; /* ideal FD mode */ - else { - if (Vbs0t < model->B4SOIvbs0pd) - here->B4SOIsoiMod = 0; /* BSIMPD */ - else - here->B4SOIsoiMod = 1; - } - } - - here->B4SOIpNode = here->B4SOIpNodeExt; - here->B4SOIbNode = here->B4SOIbNodeExt; - here->B4SOItempNode = here->B4SOItempNodeExt; - - here->B4SOIfloat = 0; - if (here->B4SOIsoiMod == 2) /* v3.2 */ - { - here->B4SOIbNode = here->B4SOIpNode = 0; - here->B4SOIbodyMod = 0; - } /* For ideal FD, body contact is disabled and no body node */ - else - { - if (here->B4SOIpNode == -1) { /* floating body case -- 4-node */ - error = CKTmkVolt(ckt,&tmp,here->B4SOIname,"Body"); - if (error) return(error); - here->B4SOIbNode = tmp->number; - here->B4SOIpNode = 0; - here->B4SOIfloat = 1; - here->B4SOIbodyMod = 0; - - } - else /* the 5th Node has been assigned */ - { - if (!here->B4SOItnodeoutGiven) { /* if t-node not assigned */ - if (here->B4SOIbNode == -1) - { /* 5-node body tie, bNode has not been assigned */ - if ((model->B4SOIrbody == 0.0) && (model->B4SOIrbsh == 0.0)) - { /* ideal body tie, pNode is not used */ - here->B4SOIbNode = here->B4SOIpNode; - here->B4SOIbodyMod = 2; - } - else { /* nonideal body tie */ - error = CKTmkVolt(ckt, &tmp, here->B4SOIname, "Body"); - if (error) return(error); - here->B4SOIbNode = tmp->number; - here->B4SOIbodyMod = 1; - } - } - else { /* 6-node body tie, bNode has been assigned */ - if ((model->B4SOIrbody == 0.0) && (model->B4SOIrbsh == 0.0)) - { - printf("\n Warning: model parameter rbody=0!\n"); - model->B4SOIrbody = 1e0; - here->B4SOIbodyMod = 1; - } - else { /* nonideal body tie */ - here->B4SOIbodyMod = 1; - } - } - } - else { /* t-node assigned */ - if (here->B4SOIbNode == -1) - { /* 4 nodes & t-node, floating body */ - error = CKTmkVolt(ckt, &tmp, here->B4SOIname, "Body"); - if (error) return(error); - here->B4SOIbNode = tmp->number; - here->B4SOItempNode = here->B4SOIpNode; - here->B4SOIpNode = 0; - here->B4SOIfloat = 1; - here->B4SOIbodyMod = 0; - } - else { /* 5 or 6 nodes & t-node, body-contact device */ - if (here->B4SOItempNode == -1) { /* 5 nodes & tnode */ - if ((model->B4SOIrbody == 0.0) && (model->B4SOIrbsh == 0.0)) - { /* ideal body tie, pNode is not used */ - here->B4SOItempNode = here->B4SOIbNode; - here->B4SOIbNode = here->B4SOIpNode; - here->B4SOIbodyMod = 2; - } - else { /* nonideal body tie */ - here->B4SOItempNode = here->B4SOIbNode; - error = CKTmkVolt(ckt, &tmp, here->B4SOIname, "Body"); - if (error) return(error); - here->B4SOIbNode = tmp->number; - here->B4SOIbodyMod = 1; - } - } - else { /* 6 nodes & t-node */ - if ((model->B4SOIrbody == 0.0) && (model->B4SOIrbsh == 0.0)) - { - printf("\n Warning: model parameter rbody=0!\n"); - model->B4SOIrbody = 1e0; - here->B4SOIbodyMod = 1; - } - else { /* nonideal body tie */ - here->B4SOIbodyMod = 1; - } - } - } - } - } - } - - - if ((model->B4SOIshMod == 1) && (here->B4SOIrth0!=0)) - { - if (here->B4SOItempNode == -1) { - error = CKTmkVolt(ckt,&tmp,here->B4SOIname,"Temp"); - if (error) return(error); - here->B4SOItempNode = tmp->number; - } - - } else { - here->B4SOItempNode = 0; - } - -/* v3.1 added for RF */ - if (!here->B4SOIrgateModGiven) - here->B4SOIrgateMod = model->B4SOIrgateMod; - else if ((here->B4SOIrgateMod != 0) && (here->B4SOIrgateMod != 1) - && (here->B4SOIrgateMod != 2) && (here->B4SOIrgateMod != 3)) - { here->B4SOIrgateMod = model->B4SOIrgateMod; - printf("Warning: rgateMod has been set to its global value %d.\n", model->B4SOIrgateMod); - } - - if (here->B4SOIrgateMod > 0) - { error = CKTmkVolt(ckt,&tmp,here->B4SOIname,"gate"); - if(error) return(error); - here->B4SOIgNode = tmp->number; - if (here->B4SOIrgateMod == 1) - { if (model->B4SOIrshg <= 0.0) - printf("Warning: rshg should be positive for rgateMod = 1.\n"); - } - else if (here->B4SOIrgateMod == 2) - { if (model->B4SOIrshg <= 0.0) - printf("Warning: rshg <= 0.0 for rgateMod = 2!!!\n"); - else if (model->B4SOIxrcrg1 <= 0.0) - printf("Warning: xrcrg1 <= 0.0 for rgateMod = 2!!!\n"); - } - } - else - { - here->B4SOIgNode = here->B4SOIgNodeExt; - } - - if (here->B4SOIrgateMod == 3) - { error = CKTmkVolt(ckt,&tmp,here->B4SOIname,"midgate"); - if(error) return(error); - here->B4SOIgNodeMid = tmp->number; - if (model->B4SOIrshg <= 0.0) - printf("Warning: rshg should be positive for rgateMod = 3.\n"); - else if (model->B4SOIxrcrg1 <= 0.0) - printf("Warning: xrcrg1 should be positive for rgateMod = 3. \n"); - } - else - here->B4SOIgNodeMid = here->B4SOIgNodeExt; -/* v3.1 added for RF end */ - -/* v4.0 */ - if (!here->B4SOIrbodyModGiven) - here->B4SOIrbodyMod = model->B4SOIrbodyMod; - else if ((here->B4SOIrbodyMod != 0) && (here->B4SOIrbodyMod != 1)) - { here->B4SOIrbodyMod = model->B4SOIrbodyMod; - printf("Warning: rbodyMod has been set to its global value %d. \n", model->B4SOIrbodyMod); - } - - if (here->B4SOIrbodyMod ==1 && here->B4SOIsoiMod == 2) /* v4.0 */ - here->B4SOIrbodyMod = 0; - - if (here->B4SOIrbodyMod == 1) - { if (here->B4SOIdbNode == 0) - { error = CKTmkVolt(ckt,&tmp,here->B4SOIname,"dbody"); - if(error) return(error); - here->B4SOIdbNode = tmp->number; - } - if (here->B4SOIsbNode == 0) - { error = CKTmkVolt(ckt,&tmp,here->B4SOIname,"sbody"); - if(error) return(error); - here->B4SOIsbNode = tmp->number; - } - } - else - here->B4SOIdbNode = here->B4SOIsbNode - = here->B4SOIbNode; - -/* v4.0 end */ - - /* v4.0 added */ - if (!here->B4SOIsaGiven) /* stress */ - here->B4SOIsa = 0.0; - if (!here->B4SOIsbGiven) - here->B4SOIsb = 0.0; - if (!here->B4SOIsdGiven) - here->B4SOIsd = 0.0; - if (!here->B4SOInfGiven) - here->B4SOInf = 1.0; - if (!here->B4SOIrbdbGiven) - here->B4SOIrbdb = model->B4SOIrbdb; /* in ohm */ - if (!here->B4SOIrbsbGiven) - here->B4SOIrbsb = model->B4SOIrbsb; - if (!here->B4SOIdelvtoGiven) - here->B4SOIdelvto = 0.0; - - /* v4.0 added end */ - - -/* here for debugging purpose only */ - if (here->B4SOIdebugMod != 0) - { - /* The real Vbs value */ - error = CKTmkVolt(ckt, &tmp, here->B4SOIname, "Vbs"); - if(error) return(error); - here->B4SOIvbsNode = tmp->number; - - error = CKTmkVolt(ckt, &tmp, here->B4SOIname, "Ids"); - if(error) return(error); - here->B4SOIidsNode = tmp->number; - - error = CKTmkVolt(ckt, &tmp, here->B4SOIname, "Ic"); - if(error) return(error); - here->B4SOIicNode = tmp->number; - - error = CKTmkVolt(ckt, &tmp, here->B4SOIname, "Ibs"); - if(error) return(error); - here->B4SOIibsNode = tmp->number; - - error = CKTmkVolt(ckt, &tmp, here->B4SOIname, "Ibd"); - if(error) return(error); - here->B4SOIibdNode = tmp->number; - - error = CKTmkVolt(ckt, &tmp, here->B4SOIname, "Iii"); - if(error) return(error); - here->B4SOIiiiNode = tmp->number; - - error = CKTmkVolt(ckt, &tmp, here->B4SOIname, "Ig"); - if(error) return(error); - here->B4SOIigNode = tmp->number; - - error = CKTmkVolt(ckt, &tmp, here->B4SOIname, "Gigg"); - if(error) return(error); - here->B4SOIgiggNode = tmp->number; - - error = CKTmkVolt(ckt, &tmp, here->B4SOIname, "Gigd"); - if(error) return(error); - here->B4SOIgigdNode = tmp->number; - - error = CKTmkVolt(ckt, &tmp, here->B4SOIname, "Gigb"); - if(error) return(error); - here->B4SOIgigbNode = tmp->number; - - error = CKTmkVolt(ckt, &tmp, here->B4SOIname, "Igidl"); - if(error) return(error); - here->B4SOIigidlNode = tmp->number; - - error = CKTmkVolt(ckt, &tmp, here->B4SOIname, "Itun"); - if(error) return(error); - here->B4SOIitunNode = tmp->number; - - error = CKTmkVolt(ckt, &tmp, here->B4SOIname, "Ibp"); - if(error) return(error); - here->B4SOIibpNode = tmp->number; - - error = CKTmkVolt(ckt, &tmp, here->B4SOIname, "Cbb"); - if(error) return(error); - here->B4SOIcbbNode = tmp->number; - - error = CKTmkVolt(ckt, &tmp, here->B4SOIname, "Cbd"); - if(error) return(error); - here->B4SOIcbdNode = tmp->number; - - error = CKTmkVolt(ckt, &tmp, here->B4SOIname, "Cbg"); - if(error) return(error); - here->B4SOIcbgNode = tmp->number; - - - error = CKTmkVolt(ckt, &tmp, here->B4SOIname, "Qbf"); - if(error) return(error); - here->B4SOIqbfNode = tmp->number; - - error = CKTmkVolt(ckt, &tmp, here->B4SOIname, "Qjs"); - if(error) return(error); - here->B4SOIqjsNode = tmp->number; - - error = CKTmkVolt(ckt, &tmp, here->B4SOIname, "Qjd"); - if(error) return(error); - here->B4SOIqjdNode = tmp->number; - - - } - - /* set Sparse Matrix Pointers */ - -/* macro to make elements with built in test for out of memory */ -#define TSTALLOC(ptr,first,second) \ -do { if((here->ptr = SMPmakeElt(matrix,here->first,here->second))==(double *)NULL){\ - return(E_NOMEM);\ -} } while(0) - - - if ((model->B4SOIshMod == 1) && (here->B4SOIrth0!=0.0)) { - TSTALLOC(B4SOITemptempPtr, B4SOItempNode, B4SOItempNode); - TSTALLOC(B4SOITempdpPtr, B4SOItempNode, B4SOIdNodePrime); - TSTALLOC(B4SOITempspPtr, B4SOItempNode, B4SOIsNodePrime); - TSTALLOC(B4SOITempgPtr, B4SOItempNode, B4SOIgNode); - TSTALLOC(B4SOITempbPtr, B4SOItempNode, B4SOIbNode); - - TSTALLOC(B4SOIGtempPtr, B4SOIgNode, B4SOItempNode); - - TSTALLOC(B4SOIDPtempPtr, B4SOIdNodePrime, B4SOItempNode); - TSTALLOC(B4SOISPtempPtr, B4SOIsNodePrime, B4SOItempNode); - TSTALLOC(B4SOIEtempPtr, B4SOIeNode, B4SOItempNode); - TSTALLOC(B4SOIBtempPtr, B4SOIbNode, B4SOItempNode); - - if (here->B4SOIbodyMod == 1) { - TSTALLOC(B4SOIPtempPtr, B4SOIpNode, B4SOItempNode); - } - -/* v3.0 */ - if (here->B4SOIsoiMod != 0) { /* v3.2 */ - TSTALLOC(B4SOITempePtr, B4SOItempNode, B4SOIeNode); - } - - } - if (here->B4SOIbodyMod == 2) { - /* Don't create any Jacobian entry for pNode */ - } - else if (here->B4SOIbodyMod == 1) { - TSTALLOC(B4SOIBpPtr, B4SOIbNode, B4SOIpNode); - TSTALLOC(B4SOIPbPtr, B4SOIpNode, B4SOIbNode); - TSTALLOC(B4SOIPpPtr, B4SOIpNode, B4SOIpNode); - - /* 4.1 for Igb2_agbcp2 */ - TSTALLOC(B4SOIPgPtr , B4SOIpNode, B4SOIgNode); - TSTALLOC(B4SOIGpPtr , B4SOIgNode, B4SOIpNode); - } - - -/* v3.1 added for RF */ - if (here->B4SOIrgateMod != 0) - { TSTALLOC(B4SOIGEgePtr, B4SOIgNodeExt, B4SOIgNodeExt); - TSTALLOC(B4SOIGEgPtr, B4SOIgNodeExt, B4SOIgNode); - TSTALLOC(B4SOIGgePtr, B4SOIgNode, B4SOIgNodeExt); - TSTALLOC(B4SOIGEdpPtr, B4SOIgNodeExt, B4SOIdNodePrime); - TSTALLOC(B4SOIGEspPtr, B4SOIgNodeExt, B4SOIsNodePrime); - if (here->B4SOIsoiMod !=2) /* v3.2 */ - TSTALLOC(B4SOIGEbPtr, B4SOIgNodeExt, B4SOIbNode); - - TSTALLOC(B4SOIGMdpPtr, B4SOIgNodeMid, B4SOIdNodePrime); - TSTALLOC(B4SOIGMgPtr, B4SOIgNodeMid, B4SOIgNode); - TSTALLOC(B4SOIGMgmPtr, B4SOIgNodeMid, B4SOIgNodeMid); - TSTALLOC(B4SOIGMgePtr, B4SOIgNodeMid, B4SOIgNodeExt); - TSTALLOC(B4SOIGMspPtr, B4SOIgNodeMid, B4SOIsNodePrime); - if (here->B4SOIsoiMod !=2) /* v3.2 */ - TSTALLOC(B4SOIGMbPtr, B4SOIgNodeMid, B4SOIbNode); - - TSTALLOC(B4SOIGMePtr, B4SOIgNodeMid, B4SOIeNode); - TSTALLOC(B4SOIDPgmPtr, B4SOIdNodePrime, B4SOIgNodeMid); - TSTALLOC(B4SOIGgmPtr, B4SOIgNode, B4SOIgNodeMid); - TSTALLOC(B4SOIGEgmPtr, B4SOIgNodeExt, B4SOIgNodeMid); - TSTALLOC(B4SOISPgmPtr, B4SOIsNodePrime, B4SOIgNodeMid); - TSTALLOC(B4SOIEgmPtr, B4SOIeNode, B4SOIgNodeMid); - } -/* v3.1 added for RF end */ - - -/* v3.1 */ - if (here->B4SOIsoiMod != 2) /* v3.2 */ - { - TSTALLOC(B4SOIEbPtr, B4SOIeNode, B4SOIbNode); - TSTALLOC(B4SOIGbPtr, B4SOIgNode, B4SOIbNode); - TSTALLOC(B4SOIDPbPtr, B4SOIdNodePrime, B4SOIbNode); - TSTALLOC(B4SOISPbPtr, B4SOIsNodePrime, B4SOIbNode); - TSTALLOC(B4SOIBePtr, B4SOIbNode, B4SOIeNode); - TSTALLOC(B4SOIBgPtr, B4SOIbNode, B4SOIgNode); - TSTALLOC(B4SOIBdpPtr, B4SOIbNode, B4SOIdNodePrime); - TSTALLOC(B4SOIBspPtr, B4SOIbNode, B4SOIsNodePrime); - TSTALLOC(B4SOIBbPtr, B4SOIbNode, B4SOIbNode); - } -/* v3.1 */ - - - TSTALLOC(B4SOIEgPtr, B4SOIeNode, B4SOIgNode); - TSTALLOC(B4SOIEdpPtr, B4SOIeNode, B4SOIdNodePrime); - TSTALLOC(B4SOIEspPtr, B4SOIeNode, B4SOIsNodePrime); - TSTALLOC(B4SOIGePtr, B4SOIgNode, B4SOIeNode); - TSTALLOC(B4SOIDPePtr, B4SOIdNodePrime, B4SOIeNode); - TSTALLOC(B4SOISPePtr, B4SOIsNodePrime, B4SOIeNode); - - TSTALLOC(B4SOIEePtr, B4SOIeNode, B4SOIeNode); - - TSTALLOC(B4SOIGgPtr, B4SOIgNode, B4SOIgNode); - TSTALLOC(B4SOIGdpPtr, B4SOIgNode, B4SOIdNodePrime); - TSTALLOC(B4SOIGspPtr, B4SOIgNode, B4SOIsNodePrime); - - TSTALLOC(B4SOIDPgPtr, B4SOIdNodePrime, B4SOIgNode); - TSTALLOC(B4SOIDPdpPtr, B4SOIdNodePrime, B4SOIdNodePrime); - TSTALLOC(B4SOIDPspPtr, B4SOIdNodePrime, B4SOIsNodePrime); - TSTALLOC(B4SOIDPdPtr, B4SOIdNodePrime, B4SOIdNode); - - TSTALLOC(B4SOISPgPtr, B4SOIsNodePrime, B4SOIgNode); - TSTALLOC(B4SOISPdpPtr, B4SOIsNodePrime, B4SOIdNodePrime); - TSTALLOC(B4SOISPspPtr, B4SOIsNodePrime, B4SOIsNodePrime); - TSTALLOC(B4SOISPsPtr, B4SOIsNodePrime, B4SOIsNode); - - TSTALLOC(B4SOIDdPtr, B4SOIdNode, B4SOIdNode); - TSTALLOC(B4SOIDdpPtr, B4SOIdNode, B4SOIdNodePrime); - - TSTALLOC(B4SOISsPtr, B4SOIsNode, B4SOIsNode); - TSTALLOC(B4SOISspPtr, B4SOIsNode, B4SOIsNodePrime); - -/* v4.0 */ - if (here->B4SOIrbodyMod == 1) - { TSTALLOC(B4SOIDPdbPtr, B4SOIdNodePrime, B4SOIdbNode); - TSTALLOC(B4SOISPsbPtr, B4SOIsNodePrime, B4SOIsbNode); - - TSTALLOC(B4SOIDBdpPtr, B4SOIdbNode, B4SOIdNodePrime); - TSTALLOC(B4SOIDBdbPtr, B4SOIdbNode, B4SOIdbNode); - TSTALLOC(B4SOIDBbPtr, B4SOIdbNode, B4SOIbNode); - - TSTALLOC(B4SOISBspPtr, B4SOIsbNode, B4SOIsNodePrime); - TSTALLOC(B4SOISBsbPtr, B4SOIsbNode, B4SOIsbNode); - TSTALLOC(B4SOISBbPtr, B4SOIsbNode, B4SOIbNode); - - TSTALLOC(B4SOIBdbPtr, B4SOIbNode, B4SOIdbNode); - TSTALLOC(B4SOIBsbPtr, B4SOIbNode, B4SOIsbNode); - } - - if (model->B4SOIrdsMod) - { TSTALLOC(B4SOIDgPtr, B4SOIdNode, B4SOIgNode); - TSTALLOC(B4SOIDspPtr, B4SOIdNode, B4SOIsNodePrime); - TSTALLOC(B4SOISdpPtr, B4SOIsNode, B4SOIdNodePrime); - TSTALLOC(B4SOISgPtr, B4SOIsNode, B4SOIgNode); - if (model->B4SOIsoiMod != 2) { - TSTALLOC(B4SOIDbPtr, B4SOIdNode, B4SOIbNode); - TSTALLOC(B4SOISbPtr, B4SOIsNode, B4SOIbNode); - } - } - - -/* v4.0 end*/ - -/* here for debugging purpose only */ - if (here->B4SOIdebugMod != 0) - { - TSTALLOC(B4SOIVbsPtr, B4SOIvbsNode, B4SOIvbsNode); - TSTALLOC(B4SOIIdsPtr, B4SOIidsNode, B4SOIidsNode); - TSTALLOC(B4SOIIcPtr, B4SOIicNode, B4SOIicNode); - TSTALLOC(B4SOIIbsPtr, B4SOIibsNode, B4SOIibsNode); - TSTALLOC(B4SOIIbdPtr, B4SOIibdNode, B4SOIibdNode); - TSTALLOC(B4SOIIiiPtr, B4SOIiiiNode, B4SOIiiiNode); - TSTALLOC(B4SOIIgPtr, B4SOIigNode, B4SOIigNode); - TSTALLOC(B4SOIGiggPtr, B4SOIgiggNode, B4SOIgiggNode); - TSTALLOC(B4SOIGigdPtr, B4SOIgigdNode, B4SOIgigdNode); - TSTALLOC(B4SOIGigbPtr, B4SOIgigbNode, B4SOIgigbNode); - TSTALLOC(B4SOIIgidlPtr, B4SOIigidlNode, B4SOIigidlNode); - TSTALLOC(B4SOIItunPtr, B4SOIitunNode, B4SOIitunNode); - TSTALLOC(B4SOIIbpPtr, B4SOIibpNode, B4SOIibpNode); - TSTALLOC(B4SOICbbPtr, B4SOIcbbNode, B4SOIcbbNode); - TSTALLOC(B4SOICbdPtr, B4SOIcbdNode, B4SOIcbdNode); - TSTALLOC(B4SOICbgPtr, B4SOIcbgNode, B4SOIcbgNode); - TSTALLOC(B4SOIQbfPtr, B4SOIqbfNode, B4SOIqbfNode); - TSTALLOC(B4SOIQjsPtr, B4SOIqjsNode, B4SOIqjsNode); - TSTALLOC(B4SOIQjdPtr, B4SOIqjdNode, B4SOIqjdNode); - - - } - - } - } - -#ifdef USE_OMP - InstCount = 0; - model = (B4SOImodel*)inModel; - /* loop through all the B4SOI device models - to count the number of instances */ - - for( ; model != NULL; model = B4SOInextModel(model)) - { - /* loop through all the instances of the model */ - for (here = B4SOIinstances(model); here != NULL ; - here=B4SOInextInstance(here)) - { - InstCount++; - } - model->B4SOIInstCount = 0; - model->B4SOIInstanceArray = NULL; - } - InstArray = TMALLOC(B4SOIinstance*, InstCount); - model = (B4SOImodel*)inModel; - /* store this in the first model only */ - model->B4SOIInstCount = InstCount; - model->B4SOIInstanceArray = InstArray; - idx = 0; - for( ; model != NULL; model = B4SOInextModel(model)) - { - /* loop through all the instances of the model */ - for (here = B4SOIinstances(model); here != NULL ; - here=B4SOInextInstance(here)) - { - InstArray[idx] = here; - idx++; - } - } -#endif - - return(OK); -} - -int -B4SOIunsetup( - GENmodel *inModel, - CKTcircuit *ckt) -{ -#ifndef HAS_BATCHSIM - B4SOImodel *model; - B4SOIinstance *here; - -#ifdef USE_OMP - model = (B4SOImodel*)inModel; - tfree(model->B4SOIInstanceArray); -#endif - - for (model = (B4SOImodel *)inModel; model != NULL; - model = B4SOInextModel(model)) - { - for (here = B4SOIinstances(model); here != NULL; - here=B4SOInextInstance(here)) - { - /* here for debugging purpose only */ - if (here->B4SOIqjdNode > 0) - CKTdltNNum(ckt, here->B4SOIqjdNode); - here->B4SOIqjdNode = 0; - - if (here->B4SOIqjsNode > 0) - CKTdltNNum(ckt, here->B4SOIqjsNode); - here->B4SOIqjsNode = 0; - - if (here->B4SOIqbfNode > 0) - CKTdltNNum(ckt, here->B4SOIqbfNode); - here->B4SOIqbfNode = 0; - - if (here->B4SOIcbgNode > 0) - CKTdltNNum(ckt, here->B4SOIcbgNode); - here->B4SOIcbgNode = 0; - - if (here->B4SOIcbdNode > 0) - CKTdltNNum(ckt, here->B4SOIcbdNode); - here->B4SOIcbdNode = 0; - - if (here->B4SOIcbbNode > 0) - CKTdltNNum(ckt, here->B4SOIcbbNode); - here->B4SOIcbbNode = 0; - - if (here->B4SOIibpNode > 0) - CKTdltNNum(ckt, here->B4SOIibpNode); - here->B4SOIibpNode = 0; - - if (here->B4SOIitunNode > 0) - CKTdltNNum(ckt, here->B4SOIitunNode); - here->B4SOIitunNode = 0; - - if (here->B4SOIigidlNode > 0) - CKTdltNNum(ckt, here->B4SOIigidlNode); - here->B4SOIigidlNode = 0; - - if (here->B4SOIgigbNode > 0) - CKTdltNNum(ckt, here->B4SOIgigbNode); - here->B4SOIgigbNode = 0; - - if (here->B4SOIgigdNode > 0) - CKTdltNNum(ckt, here->B4SOIgigdNode); - here->B4SOIgigdNode = 0; - - if (here->B4SOIgiggNode > 0) - CKTdltNNum(ckt, here->B4SOIgiggNode); - here->B4SOIgiggNode = 0; - - if (here->B4SOIigNode > 0) - CKTdltNNum(ckt, here->B4SOIigNode); - here->B4SOIigNode = 0; - - if (here->B4SOIiiiNode > 0) - CKTdltNNum(ckt, here->B4SOIiiiNode); - here->B4SOIiiiNode = 0; - - if (here->B4SOIibdNode > 0) - CKTdltNNum(ckt, here->B4SOIibdNode); - here->B4SOIibdNode = 0; - - if (here->B4SOIibsNode > 0) - CKTdltNNum(ckt, here->B4SOIibsNode); - here->B4SOIibsNode = 0; - - if (here->B4SOIicNode > 0) - CKTdltNNum(ckt, here->B4SOIicNode); - here->B4SOIicNode = 0; - - if (here->B4SOIidsNode > 0) - CKTdltNNum(ckt, here->B4SOIidsNode); - here->B4SOIidsNode = 0; - - if (here->B4SOIvbsNode > 0) - CKTdltNNum(ckt, here->B4SOIvbsNode); - here->B4SOIvbsNode = 0; - - if (here->B4SOIsbNode > 0 && - here->B4SOIsbNode != here->B4SOIbNode) - CKTdltNNum(ckt, here->B4SOIsbNode); - here->B4SOIsbNode = 0; - - if (here->B4SOIdbNode > 0 && - here->B4SOIdbNode != here->B4SOIbNode) - CKTdltNNum(ckt, here->B4SOIdbNode); - here->B4SOIdbNode = 0; - - if (here->B4SOIgNodeMid > 0 && - here->B4SOIgNodeMid != here->B4SOIgNodeExt) - CKTdltNNum(ckt, here->B4SOIgNodeMid); - here->B4SOIgNodeMid = 0; - - if (here->B4SOIgNode > 0 && - here->B4SOIgNode != here->B4SOIgNodeExt) - CKTdltNNum(ckt, here->B4SOIgNode); - here->B4SOIgNode = 0; - - if (here->B4SOItempNode > 0 && - here->B4SOItempNode != here->B4SOItempNodeExt && - here->B4SOItempNode != here->B4SOIbNodeExt && - here->B4SOItempNode != here->B4SOIpNodeExt) - CKTdltNNum(ckt, here->B4SOItempNode); - here->B4SOItempNode = 0; - - if (here->B4SOIbNode > 0 && - here->B4SOIbNode != here->B4SOIbNodeExt && - here->B4SOIbNode != here->B4SOIpNodeExt) - CKTdltNNum(ckt, here->B4SOIbNode); - here->B4SOIbNode = 0; - - here->B4SOIpNode = 0; - - if (here->B4SOIsNodePrime > 0 - && here->B4SOIsNodePrime != here->B4SOIsNode) - CKTdltNNum(ckt, here->B4SOIsNodePrime); - here->B4SOIsNodePrime = 0; - - if (here->B4SOIdNodePrime > 0 - && here->B4SOIdNodePrime != here->B4SOIdNode) - CKTdltNNum(ckt, here->B4SOIdNodePrime); - here->B4SOIdNodePrime = 0; - } - } -#endif - return OK; -} diff --git a/src/spicelib/devices/bsimsoi/b4soisoachk.c b/src/spicelib/devices/bsimsoi/b4soisoachk.c deleted file mode 100644 index 44a77f40e..000000000 --- a/src/spicelib/devices/bsimsoi/b4soisoachk.c +++ /dev/null @@ -1,341 +0,0 @@ -/********** -Copyright 2013 Dietmar Warning. All rights reserved. -Author: 2013 Dietmar Warning -**********/ - -#include "ngspice/ngspice.h" -#include "ngspice/cktdefs.h" -#include "b4soidef.h" -#include "ngspice/trandefs.h" -#include "ngspice/sperror.h" -#include "ngspice/suffix.h" -#include "ngspice/cpdefs.h" - - -int -B4SOIsoaCheck(CKTcircuit *ckt, GENmodel *inModel) -{ - B4SOImodel *model = (B4SOImodel *) inModel; - B4SOIinstance *here; - double vgs, vgd, vgb, vds, vbs, vbd; /* actual mos voltages */ - int maxwarns; - static int warns_vgs = 0, warns_vgd = 0, warns_vgb = 0, warns_vds = 0, warns_vbs = 0, warns_vbd = 0; - - if (!ckt) { - warns_vgs = 0; - warns_vgd = 0; - warns_vgb = 0; - warns_vds = 0; - warns_vbs = 0; - warns_vbd = 0; - return OK; - } - - maxwarns = ckt->CKTsoaMaxWarns; - - for (; model; model = B4SOInextModel(model)) { - - for (here = B4SOIinstances(model); here; here = B4SOInextInstance(here)) { - - vgs = ckt->CKTrhsOld [here->B4SOIgNode] - - ckt->CKTrhsOld [here->B4SOIsNodePrime]; - - vgd = ckt->CKTrhsOld [here->B4SOIgNode] - - ckt->CKTrhsOld [here->B4SOIdNodePrime]; - - vgb = ckt->CKTrhsOld [here->B4SOIgNode] - - ckt->CKTrhsOld [here->B4SOIbNode]; - - vds = ckt->CKTrhsOld [here->B4SOIdNodePrime] - - ckt->CKTrhsOld [here->B4SOIsNodePrime]; - - vbs = ckt->CKTrhsOld [here->B4SOIbNode] - - ckt->CKTrhsOld [here->B4SOIsNodePrime]; - - vbd = ckt->CKTrhsOld [here->B4SOIbNode] - - ckt->CKTrhsOld [here->B4SOIdNodePrime]; - - if (!model->B4SOIvgsrMaxGiven) { - if (fabs(vgs) > model->B4SOIvgsMax) - if (warns_vgs < maxwarns) { - soa_printf(ckt, (GENinstance*) here, - "Vgs=%g has exceeded Vgs_max=%g\n", - vgs, model->B4SOIvgsMax); - warns_vgs++; - } - if (!model->B4SOIvgbMaxGiven) { - if (fabs(vgb) > model->B4SOIvgsMax) - if (warns_vgb < maxwarns) { - soa_printf(ckt, (GENinstance*) here, - "Vgb=%g has exceeded Vgs_max=%g\n", - vgb, model->B4SOIvgsMax); - warns_vgb++; - } - } else { - if (fabs(vgb) > model->B4SOIvgbMax) - if (warns_vgb < maxwarns) { - soa_printf(ckt, (GENinstance*) here, - "Vgb=%g has exceeded Vgb_max=%g\n", - vgb, model->B4SOIvgbMax); - warns_vgb++; - } - } - } else { - if (model->B4SOItype > 0) { - if (vgs > model->B4SOIvgsMax) - if (warns_vgs < maxwarns) { - soa_printf(ckt, (GENinstance*) here, - "Vgs=%g has exceeded Vgs_max=%g\n", - vgs, model->B4SOIvgsMax); - warns_vgs++; - } - if (-1*vgs > model->B4SOIvgsrMax) - if (warns_vgs < maxwarns) { - soa_printf(ckt, (GENinstance*) here, - "Vgs=%g has exceeded Vgsr_max=%g\n", - vgs, model->B4SOIvgsrMax); - warns_vgs++; - } - } else { - if (vgs > model->B4SOIvgsrMax) - if (warns_vgs < maxwarns) { - soa_printf(ckt, (GENinstance*) here, - "Vgs=%g has exceeded Vgsr_max=%g\n", - vgs, model->B4SOIvgsrMax); - warns_vgs++; - } - if (-1*vgs > model->B4SOIvgsMax) - if (warns_vgs < maxwarns) { - soa_printf(ckt, (GENinstance*) here, - "Vgs=%g has exceeded Vgs_max=%g\n", - vgs, model->B4SOIvgsMax); - warns_vgs++; - } - } - } - - if (!model->B4SOIvgdrMaxGiven) { - if (fabs(vgd) > model->B4SOIvgdMax) - if (warns_vgd < maxwarns) { - soa_printf(ckt, (GENinstance*) here, - "Vgd=%g has exceeded Vgd_max=%g\n", - vgd, model->B4SOIvgdMax); - warns_vgd++; - } - } else { - if (model->B4SOItype > 0) { - if (vgd > model->B4SOIvgdMax) - if (warns_vgd < maxwarns) { - soa_printf(ckt, (GENinstance*) here, - "Vgd=%g has exceeded Vgd_max=%g\n", - vgd, model->B4SOIvgdMax); - warns_vgd++; - } - if (-1*vgd > model->B4SOIvgdrMax) - if (warns_vgd < maxwarns) { - soa_printf(ckt, (GENinstance*) here, - "Vgd=%g has exceeded Vgdr_max=%g\n", - vgd, model->B4SOIvgdrMax); - warns_vgd++; - } - } else { - if (vgd > model->B4SOIvgdrMax) - if (warns_vgd < maxwarns) { - soa_printf(ckt, (GENinstance*) here, - "Vgd=%g has exceeded Vgdr_max=%g\n", - vgd, model->B4SOIvgdrMax); - warns_vgd++; - } - if (-1*vgd > model->B4SOIvgdMax) - if (warns_vgd < maxwarns) { - soa_printf(ckt, (GENinstance*) here, - "Vgd=%g has exceeded Vgd_max=%g\n", - vgd, model->B4SOIvgdMax); - warns_vgd++; - } - } - } - - if (fabs(vds) > model->B4SOIvdsMax) - if (warns_vds < maxwarns) { - soa_printf(ckt, (GENinstance*) here, - "Vds=%g has exceeded Vds_max=%g\n", - vds, model->B4SOIvdsMax); - warns_vds++; - } - - if (!model->B4SOIvgbrMaxGiven) { - if (fabs(vgb) > model->B4SOIvgbMax) - if (warns_vgb < maxwarns) { - soa_printf(ckt, (GENinstance*) here, - "Vgb=%g has exceeded Vgb_max=%g\n", - vgb, model->B4SOIvgbMax); - warns_vgb++; - } - } else { - if (model->B4SOItype > 0) { - if (vgb > model->B4SOIvgbMax) - if (warns_vgb < maxwarns) { - soa_printf(ckt, (GENinstance*) here, - "Vgb=%g has exceeded Vgb_max=%g\n", - vgb, model->B4SOIvgbMax); - warns_vgb++; - } - if (-1*vgb > model->B4SOIvgbrMax) - if (warns_vgb < maxwarns) { - soa_printf(ckt, (GENinstance*) here, - "Vgb=%g has exceeded Vgbr_max=%g\n", - vgb, model->B4SOIvgbrMax); - warns_vgb++; - } - } else { - if (vgb > model->B4SOIvgbrMax) - if (warns_vgb < maxwarns) { - soa_printf(ckt, (GENinstance*) here, - "Vgb=%g has exceeded Vgbr_max=%g\n", - vgb, model->B4SOIvgbrMax); - warns_vgb++; - } - if (-1*vgb > model->B4SOIvgbMax) - if (warns_vgb < maxwarns) { - soa_printf(ckt, (GENinstance*) here, - "Vgb=%g has exceeded Vgb_max=%g\n", - vgb, model->B4SOIvgbMax); - warns_vgb++; - } - } - } - - if (!model->B4SOIvbsrMaxGiven) { - if (!model->B4SOIvbsMaxGiven) { - if (fabs(vbs) > model->B4SOIvbdMax) - if (warns_vbs < maxwarns) { - soa_printf(ckt, (GENinstance*) here, - "Vbs=%g has exceeded Vbd_max=%g\n", - vbs, model->B4SOIvbdMax); - warns_vbs++; - } - } else { - if (fabs(vbs) > model->B4SOIvbsMax) - if (warns_vbs < maxwarns) { - soa_printf(ckt, (GENinstance*) here, - "Vbs=%g has exceeded Vbs_max=%g\n", - vbs, model->B4SOIvbsMax); - warns_vbs++; - } - } - } else { - if (!model->B4SOIvbsMaxGiven) { - if (model->B4SOItype > 0) { - if (vbs > model->B4SOIvbdMax) - if (warns_vbs < maxwarns) { - soa_printf(ckt, (GENinstance*) here, - "Vbs=%g has exceeded Vbd_max=%g\n", - vbs, model->B4SOIvbdMax); - warns_vbs++; - } - if (-1*vbs > model->B4SOIvbsrMax) - if (warns_vbs < maxwarns) { - soa_printf(ckt, (GENinstance*) here, - "Vbs=%g has exceeded Vbsr_max=%g\n", - vbs, model->B4SOIvbsrMax); - warns_vbs++; - } - } else { - if (vbs > model->B4SOIvbsrMax) - if (warns_vbs < maxwarns) { - soa_printf(ckt, (GENinstance*) here, - "Vbs=%g has exceeded Vbsr_max=%g\n", - vbs, model->B4SOIvbsrMax); - warns_vbs++; - } - if (-1*vbs > model->B4SOIvbdMax) - if (warns_vbs < maxwarns) { - soa_printf(ckt, (GENinstance*) here, - "Vbs=%g has exceeded Vbd_max=%g\n", - vbs, model->B4SOIvbdMax); - warns_vbs++; - } - } - } else { - if (model->B4SOItype > 0) { - if (vbs > model->B4SOIvbsMax) - if (warns_vbs < maxwarns) { - soa_printf(ckt, (GENinstance*) here, - "Vbs=%g has exceeded Vbs_max=%g\n", - vbs, model->B4SOIvbsMax); - warns_vbs++; - } - if (-1*vbs > model->B4SOIvbsrMax) - if (warns_vbs < maxwarns) { - soa_printf(ckt, (GENinstance*) here, - "Vbs=%g has exceeded Vbsr_max=%g\n", - vbs, model->B4SOIvbsrMax); - warns_vbs++; - } - } else { - if (vbs > model->B4SOIvbsrMax) - if (warns_vbs < maxwarns) { - soa_printf(ckt, (GENinstance*) here, - "Vbs=%g has exceeded Vbsr_max=%g\n", - vbs, model->B4SOIvbsrMax); - warns_vbs++; - } - if (-1*vbs > model->B4SOIvbsMax) - if (warns_vbs < maxwarns) { - soa_printf(ckt, (GENinstance*) here, - "Vbs=%g has exceeded Vbs_max=%g\n", - vbs, model->B4SOIvbsMax); - warns_vbs++; - } - } - } - } - - if (!model->B4SOIvbdrMaxGiven) { - if (fabs(vbd) > model->B4SOIvbdMax) - if (warns_vbd < maxwarns) { - soa_printf(ckt, (GENinstance*) here, - "Vbd=%g has exceeded Vbd_max=%g\n", - vbd, model->B4SOIvbdMax); - warns_vbd++; - } - } else { - if (model->B4SOItype > 0) { - if (vbd > model->B4SOIvbdMax) - if (warns_vbd < maxwarns) { - soa_printf(ckt, (GENinstance*) here, - "Vbd=%g has exceeded Vbd_max=%g\n", - vbd, model->B4SOIvbdMax); - warns_vbd++; - } - if (-1*vbd > model->B4SOIvbdrMax) - if (warns_vbd < maxwarns) { - soa_printf(ckt, (GENinstance*) here, - "Vbd=%g has exceeded Vbdr_max=%g\n", - vbd, model->B4SOIvbdrMax); - warns_vbd++; - } - } else { - if (vbd > model->B4SOIvbdrMax) - if (warns_vbd < maxwarns) { - soa_printf(ckt, (GENinstance*) here, - "Vbd=%g has exceeded Vbdr_max=%g\n", - vbd, model->B4SOIvbdrMax); - warns_vbd++; - } - if (-1*vbd > model->B4SOIvbdMax) - if (warns_vbd < maxwarns) { - soa_printf(ckt, (GENinstance*) here, - "Vbd=%g has exceeded Vbd_max=%g\n", - vbd, model->B4SOIvbdMax); - warns_vbd++; - } - } - } - - } - } - - return OK; -} diff --git a/src/spicelib/devices/bsimsoi/b4soitemp.c b/src/spicelib/devices/bsimsoi/b4soitemp.c deleted file mode 100644 index 6d36b5586..000000000 --- a/src/spicelib/devices/bsimsoi/b4soitemp.c +++ /dev/null @@ -1,2074 +0,0 @@ -/*** B4SOI 12/16/2010 Released by Tanvir Morshed ***/ - - -/********** - * Copyright 2010 Regents of the University of California. All rights reserved. - * Authors: 1998 Samuel Fung, Dennis Sinitsky and Stephen Tang - * Authors: 1999-2004 Pin Su, Hui Wan, Wei Jin, b3soitemp.c - * Authors: 2005- Hui Wan, Xuemei Xi, Ali Niknejad, Chenming Hu. - * Authors: 2009- Wenwei Yang, Chung-Hsun Lin, Ali Niknejad, Chenming Hu. - * File: b4soitemp.c - * Modified by Hui Wan, Xuemei Xi 11/30/2005 - * Modified by Wenwei Yang, Chung-Hsun Lin, Darsen Lu 03/06/2009 - * Modified by Tanvir Morshed 09/22/2009 - * Modified by Tanvir Morshed 12/31/2009 - * Modified by Tanvir Morshed 05/14/2010 - * Modified by Tanvir Morshed 12/16/2010 - **********/ - -/* Lmin, Lmax, Wmin, Wmax */ - -#include "ngspice/ngspice.h" -#include "ngspice/smpdefs.h" -#include "ngspice/cktdefs.h" -#include "b4soidef.h" -#include "ngspice/const.h" -#include "ngspice/sperror.h" -#include "ngspice/suffix.h" - -#define Kb 1.3806226e-23 -#define KboQ 8.617087e-5 /* Kb / q where q = 1.60219e-19 */ -#define EPSOX 3.453133e-11 -#define EPSSI 1.03594e-10 -#define EPS0 8.85418e-12 -#define PI 3.141592654 -#define Charge_q 1.60219e-19 -#define Eg300 1.115 /* energy gap at 300K */ - -#define MAX_EXPL 2.688117142e+43 -#define MIN_EXPL 3.720075976e-44 -#define EXPL_THRESHOLD 100.0 -#define DELTA 1.0E-9 -#define DEXP(A,B) { \ - if (A > EXPL_THRESHOLD) { \ - B = MAX_EXPL*(1.0+(A)-EXPL_THRESHOLD); \ - } else if (A < -EXPL_THRESHOLD) { \ - B = MIN_EXPL; \ - } else { \ - B = exp(A); \ - } \ -} - int -B4SOItemp( - GENmodel *inModel, - CKTcircuit *ckt) -{ - register B4SOImodel *model = (B4SOImodel*) inModel; - register B4SOIinstance *here; - struct b4soiSizeDependParam *pSizeDependParamKnot, *pLastKnot, *pParam=NULL; - double tmp, tmp1, tmp2, Eg, Eg0, ni, T0, T1, T2, T3, T4, T5, T6; - double Ldrn=0.0, Wdrn; - double Temp, TempRatio, Inv_L, Inv_W, Inv_LW, Vtm0, Tnom; - double SDphi, SDgamma; - double Inv_saref, Inv_sbref, Inv_sa, Inv_sb, rho, dvth0_lod; - double W_tmp, Inv_ODeff, OD_offset, dk2_lod, deta0_lod, kvsat; - int Size_Not_Found, i; - double PowWeffWr, T10; /*v4.0 */ - double Vtm0eot, Vtmeot,vbieot,phieot,sqrtphieot,vddeot; - double Vgs_eff,Vgsteff, V0, Vth,Vgst; - double lt1,ltw; - double TempRatioMinus1; - double n, VgstNVt, ExpArg, sqrtPhisExt,ExpVgst,Vgst2Vtm,vtfbphi2eot; - double DIBL_Sft,Lpe_Vb,DITS_Sft,DeltVthtemp, DITS_Sft2; - double Theta0,Delt_vth,DeltVthw; - double niter,toxpf,toxpi, Tcen; - double n0; - double eggdep, agbc2n, agbc2p, bgbc2n, bgbc2p, sqrt2qeps; /* v4.3.1 bugfix for mtrlMod=1 -Tanvir */ - - - /* v2.0 release */ - double tmp3, T7; - /*4.1*/ - double epsrox, toxe, epssub; - - - /* loop through all the B4SOI device models */ - for (; model != NULL; model = B4SOInextModel(model)) - { Temp = ckt->CKTtemp; - if (model->B4SOIGatesidewallJctSPotential < 0.1) /* v4.0 */ - model->B4SOIGatesidewallJctSPotential = 0.1; - if (model->B4SOIGatesidewallJctDPotential < 0.1) /* v4.0 */ - model->B4SOIGatesidewallJctDPotential = 0.1; - - struct b4soiSizeDependParam *p = model->pSizeDependParamKnot; - while (p) { - struct b4soiSizeDependParam *next_p = p->pNext; - FREE(p); - p = next_p; - } - model->pSizeDependParamKnot = NULL; - pLastKnot = NULL; - - Tnom = model->B4SOItnom; - TempRatio = Temp / Tnom; - - if(model->B4SOImtrlMod) - { - epsrox = 3.9; - toxe = model->B4SOIeot; - epssub = EPS0 * model->B4SOIepsrsub; - sqrt2qeps = sqrt(2.0 * 1.0e6 * Charge_q * epssub); /* bugfix 4.3.1 */ - /* bugfix v4.3.1 following constants should be replaced with model params -Tanvir */ - agbc2n = 3.42537e-7; - agbc2p = 4.97232e-7; - bgbc2n = 1.16645e12; - bgbc2p = 7.45669e11; - eggdep = 1.12; - } - else - { - epsrox = model->B4SOIepsrox; - toxe = model->B4SOItox; - epssub = EPSSI; - sqrt2qeps = 5.753e-12; /* constant from v4.3.0 and earlier */ - /* bugfix v4.3.1 following constants are valid for mtrlMod=0 -Tanvir */ - agbc2n = 3.42537e-7; - agbc2p = 4.97232e-7; - bgbc2n = 1.16645e12; - bgbc2p = 7.45669e11; - eggdep = 1.12; - } - - /*model->B4SOIcox = epsrox * EPS0 / toxe;*/ - - model->B4SOIvcrit = CONSTvt0 * log(CONSTvt0 / (CONSTroot2 * 1.0e-14)); - if(model->B4SOImtrlMod == 0) - model->B4SOIfactor1 = sqrt(EPSSI / EPSOX * model->B4SOItox); - else - model->B4SOIfactor1 = sqrt(epssub / (epsrox*EPS0) * toxe);/*4.1*/ - - if (model->B4SOImtrlMod==0) - { - Vtm0 = KboQ * Tnom; - Eg0 = 1.16 - 7.02e-4 * Tnom * Tnom / (Tnom + 1108.0); - model->B4SOIeg0 = Eg0; - model->B4SOIvtm = KboQ * Temp; - - Eg = 1.16 - 7.02e-4 * Temp * Temp / (Temp + 1108.0); - model->B4SOIeg = Eg; /* Bug fix #11 Jun 09 Eg is evaluated at Temp, not Tnom. To be used if no selfheat */ - /* ni is in cm^-3 */ - ni = 1.45e10 * (Temp / 300.15) * sqrt(Temp / 300.15) - * exp(21.5565981 - Eg / (2.0 * model->B4SOIvtm)); - } - else - { Vtm0 = KboQ * Tnom; - Eg0 = model->B4SOIbg0sub - model->B4SOItbgasub * Tnom * Tnom - / (Tnom + model->B4SOItbgbsub); - model->B4SOIeg0 = Eg0; - model->B4SOIvtm = KboQ * Temp; - Eg = model->B4SOIbg0sub - model->B4SOItbgasub * Temp * Temp - / (Temp + model->B4SOItbgbsub); - model->B4SOIeg = Eg; /* Bug fix #11 Jun 09 Eg is evaluated at Temp, not Tnom. To be used if no selfheat */ - ni = model->B4SOIni0sub * (Temp / Tnom) * sqrt(Temp / Tnom) - * exp(Eg0/(2.0*Vtm0) - Eg / (2.0 * model->B4SOIvtm)); - - - } - - /* loop through all the instances of the model */ - /* MCJ: Length and Width not initialized */ - for (here = B4SOIinstances(model); here != NULL; - here = B4SOInextInstance(here)) - { - here->B4SOIrbodyext = here->B4SOIbodySquares * - model->B4SOIrbsh; - pSizeDependParamKnot = model->pSizeDependParamKnot; - Size_Not_Found = 1; - while ((pSizeDependParamKnot != NULL) && Size_Not_Found) - { - if ((here->B4SOIl == pSizeDependParamKnot->Length) - && (here->B4SOIw == pSizeDependParamKnot->Width) - && (here->B4SOIrth0 == pSizeDependParamKnot->Rth0) - && (here->B4SOIcth0 == pSizeDependParamKnot->Cth0) - && (here->B4SOInf == pSizeDependParamKnot->NFinger)) /*4.0*/ - { Size_Not_Found = 0; - here->pParam = pSizeDependParamKnot; - pParam = here->pParam; /* v2.2.3 bug fix */ - } - else - { pLastKnot = pSizeDependParamKnot; - pSizeDependParamKnot = pSizeDependParamKnot->pNext; - } - } - - if (Size_Not_Found) - { pParam = (struct b4soiSizeDependParam *)tmalloc( - sizeof(struct b4soiSizeDependParam)); - if (pLastKnot == NULL) - model->pSizeDependParamKnot = pParam; - else - pLastKnot->pNext = pParam; - pParam->pNext = NULL; - here->pParam = pParam; - - Ldrn = here->B4SOIl; - Wdrn = here->B4SOIw / here->B4SOInf; /* v4.0 */ - pParam->Length = here->B4SOIl; - pParam->Width = here->B4SOIw; - pParam->NFinger = here->B4SOInf; /* v4.0 */ - pParam->Rth0 = here->B4SOIrth0; - pParam->Cth0 = here->B4SOIcth0; - - T0 = pow(Ldrn, model->B4SOILln); - T1 = pow(Wdrn, model->B4SOILwn); - tmp1 = model->B4SOILl / T0 + model->B4SOILw / T1 - + model->B4SOILwl / (T0 * T1); - pParam->B4SOIdl = model->B4SOILint + tmp1; - - /* v2.2.3 */ - tmp1 = model->B4SOILlc / T0 + model->B4SOILwc / T1 - + model->B4SOILwlc / (T0 * T1); - pParam->B4SOIdlc = model->B4SOIdlc + tmp1; - - /* v3.0 */ - pParam->B4SOIdlcig = model->B4SOIdlcig + tmp1; - - - T2 = pow(Ldrn, model->B4SOIWln); - T3 = pow(Wdrn, model->B4SOIWwn); - tmp2 = model->B4SOIWl / T2 + model->B4SOIWw / T3 - + model->B4SOIWwl / (T2 * T3); - pParam->B4SOIdw = model->B4SOIWint + tmp2; - - /* v2.2.3 */ - tmp2 = model->B4SOIWlc / T2 + model->B4SOIWwc / T3 - + model->B4SOIWwlc / (T2 * T3); - pParam->B4SOIdwc = model->B4SOIdwc + tmp2; - - - pParam->B4SOIleff = here->B4SOIl - 2.0 * pParam->B4SOIdl; - if (pParam->B4SOIleff <= 0.0) - { - SPfrontEnd->IFerrorf(ERR_FATAL, - "B4SOI: mosfet %s, model %s: Effective channel length <= 0", - model->B4SOImodName, here->B4SOIname); - return(E_BADPARM); - } - - pParam->B4SOIweff = here->B4SOIw / here->B4SOInf /* v4.0 */ - - here->B4SOInbc * model->B4SOIdwbc - - (2.0 - here->B4SOInbc) * pParam->B4SOIdw; - if (pParam->B4SOIweff <= 0.0) - { - SPfrontEnd->IFerrorf(ERR_FATAL, - "B4SOI: mosfet %s, model %s: Effective channel width <= 0", - model->B4SOImodName, here->B4SOIname); - return(E_BADPARM); - } - - pParam->B4SOIwdiod = pParam->B4SOIweff / here->B4SOInseg - + here->B4SOIpdbcp; - pParam->B4SOIwdios = pParam->B4SOIweff / here->B4SOInseg - + here->B4SOIpsbcp; - - pParam->B4SOIleffCV = here->B4SOIl - 2.0 * pParam->B4SOIdlc; - if (pParam->B4SOIleffCV <= 0.0) - { - SPfrontEnd->IFerrorf(ERR_FATAL, - "B4SOI: mosfet %s, model %s: Effective channel length for C-V <= 0", - model->B4SOImodName, here->B4SOIname); - return(E_BADPARM); - } - - pParam->B4SOIweffCV = here->B4SOIw /here->B4SOInf /* v4.0 */ - - here->B4SOInbc * model->B4SOIdwbc - - (2.0 - here->B4SOInbc) * pParam->B4SOIdwc; - if (pParam->B4SOIweffCV <= 0.0) - { - SPfrontEnd->IFerrorf(ERR_FATAL, - "B4SOI: mosfet %s, model %s: Effective channel width for C-V <= 0", - model->B4SOImodName, here->B4SOIname); - return(E_BADPARM); - } - - pParam->B4SOIwdiodCV = pParam->B4SOIweffCV / here->B4SOInseg - + here->B4SOIpdbcp; - pParam->B4SOIwdiosCV = pParam->B4SOIweffCV / here->B4SOInseg - + here->B4SOIpsbcp; - - pParam->B4SOIleffCVb = here->B4SOIl - 2.0 * pParam->B4SOIdlc - - model->B4SOIdlcb; - if (pParam->B4SOIleffCVb <= 0.0) - { - SPfrontEnd->IFerrorf(ERR_FATAL, - "B4SOI: mosfet %s, model %s: Effective channel length for C-V (body) <= 0", - model->B4SOImodName, here->B4SOIname); - return(E_BADPARM); - } - - pParam->B4SOIleffCVbg = pParam->B4SOIleffCVb + 2 * model->B4SOIdlbg; - if (pParam->B4SOIleffCVbg <= 0.0) - { - SPfrontEnd->IFerrorf(ERR_FATAL, - "B4SOI: mosfet %s, model %s: Effective channel length for C-V (backgate) <= 0", - model->B4SOImodName, here->B4SOIname); - return(E_BADPARM); - } - - - /* Not binned - START */ - pParam->B4SOIgamma1 = model->B4SOIgamma1; - pParam->B4SOIgamma2 = model->B4SOIgamma2; - pParam->B4SOIvbx = model->B4SOIvbx; - pParam->B4SOIvbm = model->B4SOIvbm; - pParam->B4SOIxt = model->B4SOIxt; - /* Not binned - END */ - - /* CV model */ - pParam->B4SOIcf = model->B4SOIcf; - pParam->B4SOIclc = model->B4SOIclc; - pParam->B4SOIcle = model->B4SOIcle; - - pParam->B4SOIabulkCVfactor = 1.0 + pow((pParam->B4SOIclc - / pParam->B4SOIleff), - pParam->B4SOIcle); - - /* Added for binning - START */ - if (model->B4SOIbinUnit == 1) - { Inv_L = 1.0e-6 / pParam->B4SOIleff; - Inv_W = 1.0e-6 / pParam->B4SOIweff; - Inv_LW = 1.0e-12 / (pParam->B4SOIleff - * pParam->B4SOIweff); - } - else - { Inv_L = 1.0 / pParam->B4SOIleff; - Inv_W = 1.0 / pParam->B4SOIweff; - Inv_LW = 1.0 / (pParam->B4SOIleff - * pParam->B4SOIweff); - } - pParam->B4SOInpeak = model->B4SOInpeak - + model->B4SOIlnpeak * Inv_L - + model->B4SOIwnpeak * Inv_W - + model->B4SOIpnpeak * Inv_LW; - pParam->B4SOInsub = model->B4SOInsub - + model->B4SOIlnsub * Inv_L - + model->B4SOIwnsub * Inv_W - + model->B4SOIpnsub * Inv_LW; - pParam->B4SOIngate = model->B4SOIngate - + model->B4SOIlngate * Inv_L - + model->B4SOIwngate * Inv_W - + model->B4SOIpngate * Inv_LW; - /*4.1*/ - pParam->B4SOInsd = model->B4SOInsd - + model->B4SOIlnsd * Inv_L - + model->B4SOIwnsd * Inv_W - + model->B4SOIpnsd * Inv_LW; - - - - pParam->B4SOIvth0 = model->B4SOIvth0 - + model->B4SOIlvth0 * Inv_L - + model->B4SOIwvth0 * Inv_W - + model->B4SOIpvth0 * Inv_LW; - pParam->B4SOIvfb = model->B4SOIvfb - + model->B4SOIlvfb * Inv_L - + model->B4SOIwvfb * Inv_W - + model->B4SOIpvfb * Inv_LW; /* v4.1 */ - pParam->B4SOIk1 = model->B4SOIk1 - + model->B4SOIlk1 * Inv_L - + model->B4SOIwk1 * Inv_W - + model->B4SOIpk1 * Inv_LW; - pParam->B4SOIk2 = model->B4SOIk2 - + model->B4SOIlk2 * Inv_L - + model->B4SOIwk2 * Inv_W - + model->B4SOIpk2 * Inv_LW; - pParam->B4SOIk1w1 = model->B4SOIk1w1 - + model->B4SOIlk1w1 * Inv_L - + model->B4SOIwk1w1 * Inv_W - + model->B4SOIpk1w1 * Inv_LW; - pParam->B4SOIk1w2 = model->B4SOIk1w2 - + model->B4SOIlk1w2 * Inv_L - + model->B4SOIwk1w2 * Inv_W - + model->B4SOIpk1w2 * Inv_LW; - pParam->B4SOIk3 = model->B4SOIk3 - + model->B4SOIlk3 * Inv_L - + model->B4SOIwk3 * Inv_W - + model->B4SOIpk3 * Inv_LW; - pParam->B4SOIk3b = model->B4SOIk3b - + model->B4SOIlk3b * Inv_L - + model->B4SOIwk3b * Inv_W - + model->B4SOIpk3b * Inv_LW; - pParam->B4SOIkb1 = model->B4SOIkb1 - + model->B4SOIlkb1 * Inv_L - + model->B4SOIwkb1 * Inv_W - + model->B4SOIpkb1 * Inv_LW; - pParam->B4SOIw0 = model->B4SOIw0 - + model->B4SOIlw0 * Inv_L - + model->B4SOIww0 * Inv_W - + model->B4SOIpw0 * Inv_LW; - pParam->B4SOIlpe0 = model->B4SOIlpe0 - + model->B4SOIllpe0 * Inv_L - + model->B4SOIwlpe0 * Inv_W - + model->B4SOIplpe0 * Inv_LW; - pParam->B4SOIlpeb = model->B4SOIlpeb - + model->B4SOIllpeb * Inv_L - + model->B4SOIwlpeb * Inv_W - + model->B4SOIplpeb * Inv_LW; /* v4.0 */ - pParam->B4SOIdvt0 = model->B4SOIdvt0 - + model->B4SOIldvt0 * Inv_L - + model->B4SOIwdvt0 * Inv_W - + model->B4SOIpdvt0 * Inv_LW; - pParam->B4SOIdvt1 = model->B4SOIdvt1 - + model->B4SOIldvt1 * Inv_L - + model->B4SOIwdvt1 * Inv_W - + model->B4SOIpdvt1 * Inv_LW; - pParam->B4SOIdvt2 = model->B4SOIdvt2 - + model->B4SOIldvt2 * Inv_L - + model->B4SOIwdvt2 * Inv_W - + model->B4SOIpdvt2 * Inv_LW; - pParam->B4SOIdvt0w = model->B4SOIdvt0w - + model->B4SOIldvt0w * Inv_L - + model->B4SOIwdvt0w * Inv_W - + model->B4SOIpdvt0w * Inv_LW; - pParam->B4SOIdvt1w = model->B4SOIdvt1w - + model->B4SOIldvt1w * Inv_L - + model->B4SOIwdvt1w * Inv_W - + model->B4SOIpdvt1w * Inv_LW; - pParam->B4SOIdvt2w = model->B4SOIdvt2w - + model->B4SOIldvt2w * Inv_L - + model->B4SOIwdvt2w * Inv_W - + model->B4SOIpdvt2w * Inv_LW; - pParam->B4SOIu0 = model->B4SOIu0 - + model->B4SOIlu0 * Inv_L - + model->B4SOIwu0 * Inv_W - + model->B4SOIpu0 * Inv_LW; - pParam->B4SOIua = model->B4SOIua - + model->B4SOIlua * Inv_L - + model->B4SOIwua * Inv_W - + model->B4SOIpua * Inv_LW; - pParam->B4SOIub = model->B4SOIub - + model->B4SOIlub * Inv_L - + model->B4SOIwub * Inv_W - + model->B4SOIpub * Inv_LW; - pParam->B4SOIuc = model->B4SOIuc - + model->B4SOIluc * Inv_L - + model->B4SOIwuc * Inv_W - + model->B4SOIpuc * Inv_LW; - pParam->B4SOIvsat = model->B4SOIvsat - + model->B4SOIlvsat * Inv_L - + model->B4SOIwvsat * Inv_W - + model->B4SOIpvsat * Inv_LW; - pParam->B4SOIa0 = model->B4SOIa0 - + model->B4SOIla0 * Inv_L - + model->B4SOIwa0 * Inv_W - + model->B4SOIpa0 * Inv_LW; - pParam->B4SOIags = model->B4SOIags - + model->B4SOIlags * Inv_L - + model->B4SOIwags * Inv_W - + model->B4SOIpags * Inv_LW; - pParam->B4SOIb0 = model->B4SOIb0 - + model->B4SOIlb0 * Inv_L - + model->B4SOIwb0 * Inv_W - + model->B4SOIpb0 * Inv_LW; - pParam->B4SOIb1 = model->B4SOIb1 - + model->B4SOIlb1 * Inv_L - + model->B4SOIwb1 * Inv_W - + model->B4SOIpb1 * Inv_LW; - pParam->B4SOIketa = model->B4SOIketa - + model->B4SOIlketa * Inv_L - + model->B4SOIwketa * Inv_W - + model->B4SOIpketa * Inv_LW; - pParam->B4SOIketas = model->B4SOIketas - + model->B4SOIlketas * Inv_L - + model->B4SOIwketas * Inv_W - + model->B4SOIpketas * Inv_LW; - pParam->B4SOIa1 = model->B4SOIa1 - + model->B4SOIla1 * Inv_L - + model->B4SOIwa1 * Inv_W - + model->B4SOIpa1 * Inv_LW; - pParam->B4SOIa2 = model->B4SOIa2 - + model->B4SOIla2 * Inv_L - + model->B4SOIwa2 * Inv_W - + model->B4SOIpa2 * Inv_LW; - pParam->B4SOIrdsw = model->B4SOIrdsw - + model->B4SOIlrdsw * Inv_L - + model->B4SOIwrdsw * Inv_W - + model->B4SOIprdsw * Inv_LW; - pParam->B4SOIrsw = model->B4SOIrsw /* v4.0 */ - + model->B4SOIlrsw * Inv_L - + model->B4SOIwrsw * Inv_W - + model->B4SOIprsw * Inv_LW; - pParam->B4SOIrdw = model->B4SOIrdw /* v4.0 */ - + model->B4SOIlrdw * Inv_L - + model->B4SOIwrdw * Inv_W - + model->B4SOIprdw * Inv_LW; - pParam->B4SOIprwb = model->B4SOIprwb - + model->B4SOIlprwb * Inv_L - + model->B4SOIwprwb * Inv_W - + model->B4SOIpprwb * Inv_LW; - pParam->B4SOIprwg = model->B4SOIprwg - + model->B4SOIlprwg * Inv_L - + model->B4SOIwprwg * Inv_W - + model->B4SOIpprwg * Inv_LW; - pParam->B4SOIwr = model->B4SOIwr - + model->B4SOIlwr * Inv_L - + model->B4SOIwwr * Inv_W - + model->B4SOIpwr * Inv_LW; - pParam->B4SOInfactor = model->B4SOInfactor - + model->B4SOIlnfactor * Inv_L - + model->B4SOIwnfactor * Inv_W - + model->B4SOIpnfactor * Inv_LW; - pParam->B4SOIdwg = model->B4SOIdwg - + model->B4SOIldwg * Inv_L - + model->B4SOIwdwg * Inv_W - + model->B4SOIpdwg * Inv_LW; - pParam->B4SOIdwb = model->B4SOIdwb - + model->B4SOIldwb * Inv_L - + model->B4SOIwdwb * Inv_W - + model->B4SOIpdwb * Inv_LW; - pParam->B4SOIvoff = model->B4SOIvoff - + model->B4SOIlvoff * Inv_L - + model->B4SOIwvoff * Inv_W - + model->B4SOIpvoff * Inv_LW; - pParam->B4SOIeta0 = model->B4SOIeta0 - + model->B4SOIleta0 * Inv_L - + model->B4SOIweta0 * Inv_W - + model->B4SOIpeta0 * Inv_LW; - pParam->B4SOIetab = model->B4SOIetab - + model->B4SOIletab * Inv_L - + model->B4SOIwetab * Inv_W - + model->B4SOIpetab * Inv_LW; - pParam->B4SOIdsub = model->B4SOIdsub - + model->B4SOIldsub * Inv_L - + model->B4SOIwdsub * Inv_W - + model->B4SOIpdsub * Inv_LW; - pParam->B4SOIcit = model->B4SOIcit - + model->B4SOIlcit * Inv_L - + model->B4SOIwcit * Inv_W - + model->B4SOIpcit * Inv_LW; - pParam->B4SOIcdsc = model->B4SOIcdsc - + model->B4SOIlcdsc * Inv_L - + model->B4SOIwcdsc * Inv_W - + model->B4SOIpcdsc * Inv_LW; - pParam->B4SOIcdscb = model->B4SOIcdscb - + model->B4SOIlcdscb * Inv_L - + model->B4SOIwcdscb * Inv_W - + model->B4SOIpcdscb * Inv_LW; - pParam->B4SOIcdscd = model->B4SOIcdscd - + model->B4SOIlcdscd * Inv_L - + model->B4SOIwcdscd * Inv_W - + model->B4SOIpcdscd * Inv_LW; - pParam->B4SOIpclm = model->B4SOIpclm - + model->B4SOIlpclm * Inv_L - + model->B4SOIwpclm * Inv_W - + model->B4SOIppclm * Inv_LW; - pParam->B4SOIpdibl1 = model->B4SOIpdibl1 - + model->B4SOIlpdibl1 * Inv_L - + model->B4SOIwpdibl1 * Inv_W - + model->B4SOIppdibl1 * Inv_LW; - pParam->B4SOIpdibl2 = model->B4SOIpdibl2 - + model->B4SOIlpdibl2 * Inv_L - + model->B4SOIwpdibl2 * Inv_W - + model->B4SOIppdibl2 * Inv_LW; - pParam->B4SOIpdiblb = model->B4SOIpdiblb - + model->B4SOIlpdiblb * Inv_L - + model->B4SOIwpdiblb * Inv_W - + model->B4SOIppdiblb * Inv_LW; - pParam->B4SOIdrout = model->B4SOIdrout - + model->B4SOIldrout * Inv_L - + model->B4SOIwdrout * Inv_W - + model->B4SOIpdrout * Inv_LW; - pParam->B4SOIpvag = model->B4SOIpvag - + model->B4SOIlpvag * Inv_L - + model->B4SOIwpvag * Inv_W - + model->B4SOIppvag * Inv_LW; - pParam->B4SOIdelta = model->B4SOIdelta - + model->B4SOIldelta * Inv_L - + model->B4SOIwdelta * Inv_W - + model->B4SOIpdelta * Inv_LW; - pParam->B4SOIalpha0 = model->B4SOIalpha0 - + model->B4SOIlalpha0 * Inv_L - + model->B4SOIwalpha0 * Inv_W - + model->B4SOIpalpha0 * Inv_LW; - pParam->B4SOIfbjtii = model->B4SOIfbjtii - + model->B4SOIlfbjtii * Inv_L - + model->B4SOIwfbjtii * Inv_W - + model->B4SOIpfbjtii * Inv_LW; - /*4.1 Iii model*/ - pParam->B4SOIebjtii = model->B4SOIebjtii - + model->B4SOIlebjtii * Inv_L - + model->B4SOIwebjtii * Inv_W - + model->B4SOIpebjtii * Inv_LW; - pParam->B4SOIcbjtii = model->B4SOIcbjtii - + model->B4SOIlcbjtii * Inv_L - + model->B4SOIwcbjtii * Inv_W - + model->B4SOIpcbjtii * Inv_LW; - pParam->B4SOIvbci = model->B4SOIvbci - + model->B4SOIlvbci * Inv_L - + model->B4SOIwvbci * Inv_W - + model->B4SOIpvbci * Inv_LW; - - pParam->B4SOIabjtii = model->B4SOIabjtii - + model->B4SOIlabjtii * Inv_L - + model->B4SOIwabjtii * Inv_W - + model->B4SOIpabjtii * Inv_LW; - pParam->B4SOImbjtii = model->B4SOImbjtii - + model->B4SOIlmbjtii * Inv_L - + model->B4SOIwmbjtii * Inv_W - + model->B4SOIpmbjtii * Inv_LW; - - pParam->B4SOIbeta0 = model->B4SOIbeta0 - + model->B4SOIlbeta0 * Inv_L - + model->B4SOIwbeta0 * Inv_W - + model->B4SOIpbeta0 * Inv_LW; - pParam->B4SOIbeta1 = model->B4SOIbeta1 - + model->B4SOIlbeta1 * Inv_L - + model->B4SOIwbeta1 * Inv_W - + model->B4SOIpbeta1 * Inv_LW; - pParam->B4SOIbeta2 = model->B4SOIbeta2 - + model->B4SOIlbeta2 * Inv_L - + model->B4SOIwbeta2 * Inv_W - + model->B4SOIpbeta2 * Inv_LW; - pParam->B4SOIvdsatii0 = model->B4SOIvdsatii0 - + model->B4SOIlvdsatii0 * Inv_L - + model->B4SOIwvdsatii0 * Inv_W - + model->B4SOIpvdsatii0 * Inv_LW; - pParam->B4SOIlii = model->B4SOIlii - + model->B4SOIllii * Inv_L - + model->B4SOIwlii * Inv_W - + model->B4SOIplii * Inv_LW; - pParam->B4SOIesatii = model->B4SOIesatii - + model->B4SOIlesatii * Inv_L - + model->B4SOIwesatii * Inv_W - + model->B4SOIpesatii * Inv_LW; - pParam->B4SOIsii0 = model->B4SOIsii0 - + model->B4SOIlsii0 * Inv_L - + model->B4SOIwsii0 * Inv_W - + model->B4SOIpsii0 * Inv_LW; - pParam->B4SOIsii1 = model->B4SOIsii1 - + model->B4SOIlsii1 * Inv_L - + model->B4SOIwsii1 * Inv_W - + model->B4SOIpsii1 * Inv_LW; - pParam->B4SOIsii2 = model->B4SOIsii2 - + model->B4SOIlsii2 * Inv_L - + model->B4SOIwsii2 * Inv_W - + model->B4SOIpsii2 * Inv_LW; - pParam->B4SOIsiid = model->B4SOIsiid - + model->B4SOIlsiid * Inv_L - + model->B4SOIwsiid * Inv_W - + model->B4SOIpsiid * Inv_LW; - pParam->B4SOIagidl = model->B4SOIagidl - + model->B4SOIlagidl * Inv_L - + model->B4SOIwagidl * Inv_W - + model->B4SOIpagidl * Inv_LW; - pParam->B4SOIbgidl = model->B4SOIbgidl - + model->B4SOIlbgidl * Inv_L - + model->B4SOIwbgidl * Inv_W - + model->B4SOIpbgidl * Inv_LW; - pParam->B4SOIcgidl = model->B4SOIcgidl - + model->B4SOIlcgidl * Inv_L - + model->B4SOIwcgidl * Inv_W - + model->B4SOIpcgidl * Inv_LW; - pParam->B4SOIegidl = model->B4SOIegidl - + model->B4SOIlegidl * Inv_L - + model->B4SOIwegidl * Inv_W - + model->B4SOIpegidl * Inv_LW; - pParam->B4SOIrgidl = model->B4SOIrgidl - + model->B4SOIlrgidl * Inv_L - + model->B4SOIwrgidl * Inv_W - + model->B4SOIprgidl * Inv_LW; - pParam->B4SOIkgidl = model->B4SOIkgidl - + model->B4SOIlkgidl * Inv_L - + model->B4SOIwkgidl * Inv_W - + model->B4SOIpkgidl * Inv_LW; - pParam->B4SOIfgidl = model->B4SOIfgidl - + model->B4SOIlfgidl * Inv_L - + model->B4SOIwfgidl * Inv_W - + model->B4SOIpfgidl * Inv_LW; - pParam->B4SOIagisl = model->B4SOIagisl - + model->B4SOIlagisl * Inv_L - + model->B4SOIwagisl * Inv_W - + model->B4SOIpagisl * Inv_LW; - pParam->B4SOIbgisl = model->B4SOIbgisl - + model->B4SOIlbgisl * Inv_L - + model->B4SOIwbgisl * Inv_W - + model->B4SOIpbgisl * Inv_LW; - pParam->B4SOIcgisl = model->B4SOIcgisl - + model->B4SOIlcgisl * Inv_L - + model->B4SOIwcgisl * Inv_W - + model->B4SOIpcgisl * Inv_LW; - pParam->B4SOIegisl = model->B4SOIegisl - + model->B4SOIlegisl * Inv_L - + model->B4SOIwegisl * Inv_W - + model->B4SOIpegisl * Inv_LW; - pParam->B4SOIrgisl = model->B4SOIrgisl - + model->B4SOIlrgisl * Inv_L - + model->B4SOIwrgisl * Inv_W - + model->B4SOIprgisl * Inv_LW; - pParam->B4SOIkgisl = model->B4SOIkgisl - + model->B4SOIlkgisl * Inv_L - + model->B4SOIwkgisl * Inv_W - + model->B4SOIpkgisl * Inv_LW; - pParam->B4SOIfgisl = model->B4SOIfgisl - + model->B4SOIlfgisl * Inv_L - + model->B4SOIwfgisl * Inv_W - + model->B4SOIpfgisl * Inv_LW; - - pParam->B4SOIntun = model->B4SOIntun /* v4.0 */ - + model->B4SOIlntun * Inv_L - + model->B4SOIwntun * Inv_W - + model->B4SOIpntun * Inv_LW; - pParam->B4SOIntund = model->B4SOIntund /* v4.0 */ - + model->B4SOIlntund * Inv_L - + model->B4SOIwntund * Inv_W - + model->B4SOIpntund * Inv_LW; - pParam->B4SOIndiode = model->B4SOIndiode /* v4.0 */ - + model->B4SOIlndiode * Inv_L - + model->B4SOIwndiode * Inv_W - + model->B4SOIpndiode * Inv_LW; - pParam->B4SOIndioded = model->B4SOIndioded /* v4.0 */ - + model->B4SOIlndioded * Inv_L - + model->B4SOIwndioded * Inv_W - + model->B4SOIpndioded * Inv_LW; - pParam->B4SOInrecf0 = model->B4SOInrecf0 /* v4.0 */ - + model->B4SOIlnrecf0 * Inv_L - + model->B4SOIwnrecf0 * Inv_W - + model->B4SOIpnrecf0 * Inv_LW; - pParam->B4SOInrecf0d = model->B4SOInrecf0d /* v4.0 */ - + model->B4SOIlnrecf0d * Inv_L - + model->B4SOIwnrecf0d * Inv_W - + model->B4SOIpnrecf0d * Inv_LW; - pParam->B4SOInrecr0 = model->B4SOInrecr0 /* v4.0 */ - + model->B4SOIlnrecr0 * Inv_L - + model->B4SOIwnrecr0 * Inv_W - + model->B4SOIpnrecr0 * Inv_LW; - pParam->B4SOInrecr0d = model->B4SOInrecr0d /* v4.0 */ - + model->B4SOIlnrecr0d * Inv_L - + model->B4SOIwnrecr0d * Inv_W - + model->B4SOIpnrecr0d * Inv_LW; - pParam->B4SOIisbjt = model->B4SOIisbjt - + model->B4SOIlisbjt * Inv_L - + model->B4SOIwisbjt * Inv_W - + model->B4SOIpisbjt * Inv_LW; - pParam->B4SOIidbjt = model->B4SOIidbjt - + model->B4SOIlidbjt * Inv_L - + model->B4SOIwidbjt * Inv_W - + model->B4SOIpidbjt * Inv_LW; - pParam->B4SOIisdif = model->B4SOIisdif - + model->B4SOIlisdif * Inv_L - + model->B4SOIwisdif * Inv_W - + model->B4SOIpisdif * Inv_LW; - pParam->B4SOIiddif = model->B4SOIiddif - + model->B4SOIliddif * Inv_L - + model->B4SOIwiddif * Inv_W - + model->B4SOIpiddif * Inv_LW; - pParam->B4SOIisrec = model->B4SOIisrec - + model->B4SOIlisrec * Inv_L - + model->B4SOIwisrec * Inv_W - + model->B4SOIpisrec * Inv_LW; - pParam->B4SOIistun = model->B4SOIistun - + model->B4SOIlistun * Inv_L - + model->B4SOIwistun * Inv_W - + model->B4SOIpistun * Inv_LW; - pParam->B4SOIidrec = model->B4SOIidrec - + model->B4SOIlidrec * Inv_L - + model->B4SOIwidrec * Inv_W - + model->B4SOIpidrec * Inv_LW; - pParam->B4SOIidtun = model->B4SOIidtun - + model->B4SOIlidtun * Inv_L - + model->B4SOIwidtun * Inv_W - + model->B4SOIpidtun * Inv_LW; - pParam->B4SOIvrec0 = model->B4SOIvrec0 /* v4.0 */ - + model->B4SOIlvrec0 * Inv_L - + model->B4SOIwvrec0 * Inv_W - + model->B4SOIpvrec0 * Inv_LW; - pParam->B4SOIvrec0d = model->B4SOIvrec0d /* v4.0 */ - + model->B4SOIlvrec0d * Inv_L - + model->B4SOIwvrec0d * Inv_W - + model->B4SOIpvrec0d * Inv_LW; - pParam->B4SOIvtun0 = model->B4SOIvtun0 /* v4.0 */ - + model->B4SOIlvtun0 * Inv_L - + model->B4SOIwvtun0 * Inv_W - + model->B4SOIpvtun0 * Inv_LW; - pParam->B4SOIvtun0d = model->B4SOIvtun0d /* v4.0 */ - + model->B4SOIlvtun0d * Inv_L - + model->B4SOIwvtun0d * Inv_W - + model->B4SOIpvtun0d * Inv_LW; - pParam->B4SOInbjt = model->B4SOInbjt - + model->B4SOIlnbjt * Inv_L - + model->B4SOIwnbjt * Inv_W - + model->B4SOIpnbjt * Inv_LW; - pParam->B4SOIlbjt0 = model->B4SOIlbjt0 - + model->B4SOIllbjt0 * Inv_L - + model->B4SOIwlbjt0 * Inv_W - + model->B4SOIplbjt0 * Inv_LW; - pParam->B4SOIvabjt = model->B4SOIvabjt - + model->B4SOIlvabjt * Inv_L - + model->B4SOIwvabjt * Inv_W - + model->B4SOIpvabjt * Inv_LW; - pParam->B4SOIaely = model->B4SOIaely - + model->B4SOIlaely * Inv_L - + model->B4SOIwaely * Inv_W - + model->B4SOIpaely * Inv_LW; - pParam->B4SOIahli = model->B4SOIahli /* v4.0 */ - + model->B4SOIlahli * Inv_L - + model->B4SOIwahli * Inv_W - + model->B4SOIpahli * Inv_LW; - pParam->B4SOIahlid = model->B4SOIahlid /* v4.0 */ - + model->B4SOIlahlid * Inv_L - + model->B4SOIwahlid * Inv_W - + model->B4SOIpahlid * Inv_LW; - - - /* v3.1 */ - pParam->B4SOIxj = model->B4SOIxj - + model->B4SOIlxj * Inv_L - + model->B4SOIwxj * Inv_W - + model->B4SOIpxj * Inv_LW; - pParam->B4SOIalphaGB1 = model->B4SOIalphaGB1 - + model->B4SOIlalphaGB1 * Inv_L - + model->B4SOIwalphaGB1 * Inv_W - + model->B4SOIpalphaGB1 * Inv_LW; - pParam->B4SOIalphaGB2 = model->B4SOIalphaGB2 - + model->B4SOIlalphaGB2 * Inv_L - + model->B4SOIwalphaGB2 * Inv_W - + model->B4SOIpalphaGB2 * Inv_LW; - pParam->B4SOIbetaGB1 = model->B4SOIbetaGB1 - + model->B4SOIlbetaGB1* Inv_L - + model->B4SOIwbetaGB1 * Inv_W - + model->B4SOIpbetaGB1 * Inv_LW; - pParam->B4SOIbetaGB2 = model->B4SOIbetaGB2 - + model->B4SOIlbetaGB2 * Inv_L - + model->B4SOIwbetaGB2 * Inv_W - + model->B4SOIpbetaGB2 * Inv_LW; - pParam->B4SOIndif = model->B4SOIndif - + model->B4SOIlndif * Inv_L - + model->B4SOIwndif * Inv_W - + model->B4SOIpndif * Inv_LW; - pParam->B4SOIntrecf = model->B4SOIntrecf - + model->B4SOIlntrecf* Inv_L - + model->B4SOIwntrecf * Inv_W - + model->B4SOIpntrecf * Inv_LW; - pParam->B4SOIntrecr = model->B4SOIntrecr - + model->B4SOIlntrecr * Inv_L - + model->B4SOIwntrecr * Inv_W - + model->B4SOIpntrecr * Inv_LW; - pParam->B4SOIxbjt = model->B4SOIxbjt - + model->B4SOIlxbjt * Inv_L - + model->B4SOIwxbjt * Inv_W - + model->B4SOIpxbjt * Inv_LW; - pParam->B4SOIxdif = model->B4SOIxdif - + model->B4SOIlxdif* Inv_L - + model->B4SOIwxdif * Inv_W - + model->B4SOIpxdif * Inv_LW; - pParam->B4SOIxrec = model->B4SOIxrec - + model->B4SOIlxrec * Inv_L - + model->B4SOIwxrec * Inv_W - + model->B4SOIpxrec * Inv_LW; - pParam->B4SOIxtun = model->B4SOIxtun - + model->B4SOIlxtun * Inv_L - + model->B4SOIwxtun * Inv_W - + model->B4SOIpxtun * Inv_LW; - pParam->B4SOIxdifd = model->B4SOIxdifd - + model->B4SOIlxdifd* Inv_L - + model->B4SOIwxdifd * Inv_W - + model->B4SOIpxdifd * Inv_LW; - pParam->B4SOIxrecd = model->B4SOIxrecd - + model->B4SOIlxrecd * Inv_L - + model->B4SOIwxrecd * Inv_W - + model->B4SOIpxrecd * Inv_LW; - pParam->B4SOIxtund = model->B4SOIxtund - + model->B4SOIlxtund * Inv_L - + model->B4SOIwxtund * Inv_W - + model->B4SOIpxtund * Inv_LW; - pParam->B4SOIcgdl = model->B4SOIcgdl - + model->B4SOIlcgdl * Inv_L - + model->B4SOIwcgdl * Inv_W - + model->B4SOIpcgdl * Inv_LW; - pParam->B4SOIcgsl = model->B4SOIcgsl - + model->B4SOIlcgsl * Inv_L - + model->B4SOIwcgsl * Inv_W - + model->B4SOIpcgsl * Inv_LW; - pParam->B4SOIckappa = model->B4SOIckappa - + model->B4SOIlckappa * Inv_L - + model->B4SOIwckappa * Inv_W - + model->B4SOIpckappa * Inv_LW; - pParam->B4SOIute = model->B4SOIute - + model->B4SOIlute * Inv_L - + model->B4SOIwute * Inv_W - + model->B4SOIpute * Inv_LW; - - /*4.1 mobmod=4*/ - pParam->B4SOIud = model->B4SOIud - /* + model->B4SOIud * Inv_L*//*Bug #15 Jun 09*/ - + model->B4SOIlud * Inv_L /*Fix*/ - + model->B4SOIwud * Inv_W - + model->B4SOIpud * Inv_LW; - - pParam->B4SOIud1 = model->B4SOIud1 - + model->B4SOIlud1 * Inv_L - + model->B4SOIwud1 * Inv_W - + model->B4SOIpud1 * Inv_LW; - pParam->B4SOIeu = model->B4SOIeu - + model->B4SOIleu * Inv_L - + model->B4SOIweu * Inv_W - + model->B4SOIpeu * Inv_LW; - pParam->B4SOIucs = model->B4SOIucs - + model->B4SOIlucs * Inv_L - + model->B4SOIwucs * Inv_W - + model->B4SOIpucs * Inv_LW; - pParam->B4SOIucste = model->B4SOIucste - + model->B4SOIlucste * Inv_L - + model->B4SOIwucste * Inv_W - + model->B4SOIpucste * Inv_LW; - - pParam->B4SOIkt1 = model->B4SOIkt1 - + model->B4SOIlkt1 * Inv_L - + model->B4SOIwkt1 * Inv_W - + model->B4SOIpkt1 * Inv_LW; - pParam->B4SOIkt2 = model->B4SOIkt2 - + model->B4SOIlkt2 * Inv_L - + model->B4SOIwkt2 * Inv_W - + model->B4SOIpkt2 * Inv_LW; - pParam->B4SOIkt1l = model->B4SOIkt1l - + model->B4SOIlkt1l * Inv_L - + model->B4SOIwkt1l * Inv_W - + model->B4SOIpkt1l * Inv_LW; - pParam->B4SOIua1 = model->B4SOIua1 - + model->B4SOIlua1 * Inv_L - + model->B4SOIwua1 * Inv_W - + model->B4SOIpua1 * Inv_LW; - pParam->B4SOIub1 = model->B4SOIub1 - + model->B4SOIlub1* Inv_L - + model->B4SOIwub1 * Inv_W - + model->B4SOIpub1 * Inv_LW; - pParam->B4SOIuc1 = model->B4SOIuc1 - + model->B4SOIluc1 * Inv_L - + model->B4SOIwuc1 * Inv_W - + model->B4SOIpuc1 * Inv_LW; - pParam->B4SOIat = model->B4SOIat - + model->B4SOIlat * Inv_L - + model->B4SOIwat * Inv_W - + model->B4SOIpat * Inv_LW; - pParam->B4SOIprt = model->B4SOIprt - + model->B4SOIlprt * Inv_L - + model->B4SOIwprt * Inv_W - + model->B4SOIpprt * Inv_LW; - - - /* v3.0 */ - pParam->B4SOInigc = model->B4SOInigc - + model->B4SOIlnigc * Inv_L - + model->B4SOIwnigc * Inv_W - + model->B4SOIpnigc * Inv_LW; - pParam->B4SOIaigc = model->B4SOIaigc - + model->B4SOIlaigc * Inv_L - + model->B4SOIwaigc * Inv_W - + model->B4SOIpaigc * Inv_LW; - pParam->B4SOIbigc = model->B4SOIbigc - + model->B4SOIlbigc * Inv_L - + model->B4SOIwbigc * Inv_W - + model->B4SOIpbigc * Inv_LW; - pParam->B4SOIcigc = model->B4SOIcigc - + model->B4SOIlcigc * Inv_L - + model->B4SOIwcigc * Inv_W - + model->B4SOIpcigc * Inv_LW; - pParam->B4SOIaigsd = model->B4SOIaigsd - + model->B4SOIlaigsd * Inv_L - + model->B4SOIwaigsd * Inv_W - + model->B4SOIpaigsd * Inv_LW; - pParam->B4SOIbigsd = model->B4SOIbigsd - + model->B4SOIlbigsd * Inv_L - + model->B4SOIwbigsd * Inv_W - + model->B4SOIpbigsd * Inv_LW; - pParam->B4SOIcigsd = model->B4SOIcigsd - + model->B4SOIlcigsd * Inv_L - + model->B4SOIwcigsd * Inv_W - + model->B4SOIpcigsd * Inv_LW; - pParam->B4SOIpigcd = model->B4SOIpigcd - + model->B4SOIlpigcd * Inv_L - + model->B4SOIwpigcd * Inv_W - + model->B4SOIppigcd * Inv_LW; - pParam->B4SOIpoxedge = model->B4SOIpoxedge - + model->B4SOIlpoxedge * Inv_L - + model->B4SOIwpoxedge * Inv_W - + model->B4SOIppoxedge * Inv_LW; - /* v3.0 */ - - /* v3.1 added for RF */ - pParam->B4SOIxrcrg1 = model->B4SOIxrcrg1 - + model->B4SOIlxrcrg1 * Inv_L - + model->B4SOIwxrcrg1 * Inv_W - + model->B4SOIpxrcrg1 * Inv_LW; - pParam->B4SOIxrcrg2 = model->B4SOIxrcrg2 - + model->B4SOIlxrcrg2 * Inv_L - + model->B4SOIwxrcrg2 * Inv_W - + model->B4SOIpxrcrg2 * Inv_LW; - /* v3.1 added for RF end */ - - - /* CV model */ - pParam->B4SOIvsdfb = model->B4SOIvsdfb - + model->B4SOIlvsdfb * Inv_L - + model->B4SOIwvsdfb * Inv_W - + model->B4SOIpvsdfb * Inv_LW; - pParam->B4SOIvsdth = model->B4SOIvsdth - + model->B4SOIlvsdth * Inv_L - + model->B4SOIwvsdth * Inv_W - + model->B4SOIpvsdth * Inv_LW; - pParam->B4SOIdelvt = model->B4SOIdelvt - + model->B4SOIldelvt * Inv_L - + model->B4SOIwdelvt * Inv_W - + model->B4SOIpdelvt * Inv_LW; - pParam->B4SOIacde = model->B4SOIacde - + model->B4SOIlacde * Inv_L - + model->B4SOIwacde * Inv_W - + model->B4SOIpacde * Inv_LW; - pParam->B4SOIacde = pParam->B4SOIacde * - pow((pParam->B4SOInpeak / 2.0e16), -0.25); - /* v3.2 bug fix */ - - pParam->B4SOImoin = model->B4SOImoin - + model->B4SOIlmoin * Inv_L - + model->B4SOIwmoin * Inv_W - + model->B4SOIpmoin * Inv_LW; - pParam->B4SOInoff = model->B4SOInoff - + model->B4SOIlnoff * Inv_L - + model->B4SOIwnoff * Inv_W - + model->B4SOIpnoff * Inv_LW; /* v3.2 */ - - pParam->B4SOIdvtp0 = model->B4SOIdvtp0 - + model->B4SOIldvtp0 * Inv_L - + model->B4SOIwdvtp0 * Inv_W - + model->B4SOIpdvtp0 * Inv_LW; /* v4.0 */ - pParam->B4SOIdvtp1 = model->B4SOIdvtp1 - + model->B4SOIldvtp1 * Inv_L - + model->B4SOIwdvtp1 * Inv_W - + model->B4SOIpdvtp1 * Inv_LW; /* v4.0 */ - pParam->B4SOIdvtp2 = model->B4SOIdvtp2 - + model->B4SOIldvtp2 * Inv_L - + model->B4SOIwdvtp2 * Inv_W - + model->B4SOIpdvtp2 * Inv_LW; /* v4.1 */ - pParam->B4SOIdvtp3 = model->B4SOIdvtp3 - + model->B4SOIldvtp3 * Inv_L - + model->B4SOIwdvtp3 * Inv_W - + model->B4SOIpdvtp3 * Inv_LW; /* v4.1 */ - pParam->B4SOIdvtp4 = model->B4SOIdvtp4 - + model->B4SOIldvtp4 * Inv_L - + model->B4SOIwdvtp4 * Inv_W - + model->B4SOIpdvtp4 * Inv_LW; /* v4.1 */ - pParam->B4SOIminv = model->B4SOIminv - + model->B4SOIlminv * Inv_L - + model->B4SOIwminv * Inv_W - + model->B4SOIpminv * Inv_LW; /* v4.0 */ - pParam->B4SOIminvcv = model->B4SOIminvcv - + model->B4SOIlminvcv * Inv_L - + model->B4SOIwminvcv * Inv_W - + model->B4SOIpminvcv * Inv_LW; /* v4.1 */ - pParam->B4SOIvoffcv = model->B4SOIvoffcv /*Bug fix # 16 Jun09*/ - + model->B4SOIlvoffcv * Inv_L - + model->B4SOIwvoffcv * Inv_W - + model->B4SOIpvoffcv * Inv_LW; - pParam->B4SOIfprout = model->B4SOIfprout - + model->B4SOIlfprout * Inv_L - + model->B4SOIwfprout * Inv_W - + model->B4SOIpfprout * Inv_LW; /* v4.0 */ - pParam->B4SOIpdits = model->B4SOIpdits - + model->B4SOIlpdits * Inv_L - + model->B4SOIwpdits * Inv_W - + model->B4SOIppdits * Inv_LW; /* v4.0 */ - pParam->B4SOIpditsd = model->B4SOIpditsd - + model->B4SOIlpditsd * Inv_L - + model->B4SOIwpditsd * Inv_W - + model->B4SOIppditsd * Inv_LW; /* v4.0 */ - pParam->B4SOIaigbcp2 = model->B4SOIaigbcp2 - + model->B4SOIlaigbcp2 * Inv_L - + model->B4SOIwaigbcp2 * Inv_W - + model->B4SOIpaigbcp2 * Inv_LW; /* v4.0 */ - pParam->B4SOIbigbcp2 = model->B4SOIbigbcp2 - + model->B4SOIlbigbcp2 * Inv_L - + model->B4SOIwbigbcp2 * Inv_W - + model->B4SOIpbigbcp2 * Inv_LW; /* v4.0 */ - pParam->B4SOIcigbcp2 = model->B4SOIcigbcp2 - + model->B4SOIlcigbcp2 * Inv_L - + model->B4SOIwcigbcp2 * Inv_W - + model->B4SOIpcigbcp2 * Inv_LW; /* v4.0 */ - - /* Added for binning - END */ - - /* v4.0 add mstar for Vgsteff */ - pParam->B4SOImstar = 0.5 + atan(pParam->B4SOIminv) / PI; - if (model->B4SOIvgstcvMod == 0) - printf("vgstcvMod = 0, users are suggested to use vgstcvMod = 1 or 2.\n"); - /* v4.1 add mstarcv for Vgsteffcv */ - pParam->B4SOImstarcv = 0.5 + atan(pParam->B4SOIminvcv) / PI; - - T0 = (TempRatio - 1.0); - - pParam->B4SOIuatemp = pParam->B4SOIua; /* save ua, ub, and uc for b4soild.c */ - pParam->B4SOIubtemp = pParam->B4SOIub; - pParam->B4SOIuctemp = pParam->B4SOIuc; - pParam->B4SOIrds0denom = pow(pParam->B4SOIweff * 1E6, pParam->B4SOIwr); - - - /* v2.2 release */ - pParam->B4SOIrth = here->B4SOIrth0 - / (pParam->B4SOIweff + model->B4SOIwth0) - * here->B4SOInseg / here->B4SOInf; /* bugfix_snps nf*/ - pParam->B4SOIcth = here->B4SOIcth0 - * (pParam->B4SOIweff + model->B4SOIwth0) - / here->B4SOInseg * here->B4SOInf; /* bugfix_snps nf*/ - - /* v2.2.2 adding layout-dependent Frbody multiplier */ - /* pParam->B4SOIrbody = here->B4SOIfrbody *model->B4SOIrbody - * model->B4SOIrhalo - / (2 * model->B4SOIrbody - + model->B4SOIrhalo * pParam->B4SOIleff) - * pParam->B4SOIweff / here->B4SOInseg - / here->B4SOInf */ /* v4.0 *//*;*/ - - if (model->B4SOIrbody == 0) /* Bug Fix # 27 added to avoid NaN (0/0) in QA*/ - pParam->B4SOIrbody = 0; - else - pParam->B4SOIrbody = here->B4SOIfrbody *model->B4SOIrbody - * model->B4SOIrhalo - / (2 * model->B4SOIrbody - + model->B4SOIrhalo * pParam->B4SOIleff) - * pParam->B4SOIweff / here->B4SOInseg/ here->B4SOInf; /* v4.0 */ - - pParam->B4SOIoxideRatio = pow(model->B4SOItoxref - /model->B4SOItoxqm, model->B4SOIntox) - /model->B4SOItoxqm/model->B4SOItoxqm; - /* v2.2 release */ - - - pParam->B4SOIua = pParam->B4SOIua + pParam->B4SOIua1 * T0; - pParam->B4SOIub = pParam->B4SOIub + pParam->B4SOIub1 * T0; - pParam->B4SOIuc = pParam->B4SOIuc + pParam->B4SOIuc1 * T0; - if (pParam->B4SOIu0 > 1.0) - pParam->B4SOIu0 = pParam->B4SOIu0 / 1.0e4; - - pParam->B4SOIu0temp = pParam->B4SOIu0 - * pow(TempRatio, pParam->B4SOIute); - pParam->B4SOIvsattemp = pParam->B4SOIvsat - pParam->B4SOIat - * T0; - pParam->B4SOIrds0 = (pParam->B4SOIrdsw - + pParam->B4SOIprt * T0) - / pow(pParam->B4SOIweff * 1E6, - pParam->B4SOIwr); - - if(model->B4SOIrdsMod) { /* v4.0 */ - PowWeffWr = pParam->B4SOIrds0denom * here->B4SOInf; - T10 = pParam->B4SOIprt * T0; - /* External Rd(V) */ - T1 = pParam->B4SOIrdw + T10; - T2 = model->B4SOIrdwmin + T10; - if (T1 < 0.0) - { T1 = 0.0; - printf("Warning: Rdw at current temperature is negative; set to 0.\n"); - } - if (T2 < 0.0) - { T2 = 0.0; - printf("Warning: Rdwmin at current temperature is negative; set to 0.\n"); - } - - pParam->B4SOIrd0 = T1 / PowWeffWr; - pParam->B4SOIrdwmin = T2 / PowWeffWr; - - /* External Rs(V) */ - T3 = pParam->B4SOIrsw + T10; - T4 = model->B4SOIrswmin + T10; - if (T3 < 0.0) - { T3 = 0.0; - printf("Warning: Rsw at current temperature is negative; set to 0.\n"); - } - if (T4 < 0.0) - { T4 = 0.0; - printf("Warning: Rswmin at current temperature is negative; set to 0.\n"); - } - pParam->B4SOIrs0 = T3 / PowWeffWr; - pParam->B4SOIrswmin = T4 / PowWeffWr; - } - - if (B4SOIcheckModel(model, here, ckt)) - { - SPfrontEnd->IFerrorf (ERR_FATAL, "Fatal error(s) detected during B4SOIV3 parameter checking for %s in model %s", model->B4SOImodName, here->B4SOIname); - return(E_BADPARM); - } - - - pParam->B4SOIcgdo = (model->B4SOIcgdo + pParam->B4SOIcf) - * pParam->B4SOIwdiodCV; - pParam->B4SOIcgso = (model->B4SOIcgso + pParam->B4SOIcf) - * pParam->B4SOIwdiosCV; - - pParam->B4SOIcgeo = model->B4SOIcgeo * pParam->B4SOIleffCV - * here->B4SOInf; /* v4.0 */ - - - if (!model->B4SOInpeakGiven && model->B4SOIgamma1Given) - { T0 = pParam->B4SOIgamma1 * model->B4SOIcox; - pParam->B4SOInpeak = 3.021E22 * T0 * T0; - } - - - T4 = Eg300 / model->B4SOIvtm * (TempRatio - 1.0); - /* source side */ - T7 = pParam->B4SOIxbjt * T4 / pParam->B4SOIndiode; - DEXP(T7, T0); - T7 = pParam->B4SOIxdif * T4 / pParam->B4SOIndiode; - DEXP(T7, T1); - T7 = pParam->B4SOIxrec * T4 / pParam->B4SOInrecf0; - DEXP(T7, T2); - - pParam->B4SOIahli0s = pParam->B4SOIahli * T0; - pParam->B4SOIjbjts = pParam->B4SOIisbjt * T0; - pParam->B4SOIjdifs = pParam->B4SOIisdif * T1; - pParam->B4SOIjrecs = pParam->B4SOIisrec * T2; - T7 = pParam->B4SOIxtun * (TempRatio - 1); - DEXP(T7, T0); - pParam->B4SOIjtuns = pParam->B4SOIistun * T0; - - /* drain side */ - /* pParam->B4SOIjtund = pParam->B4SOIidtun * T0; */ /*v4.2 redundant */ - - T7 = pParam->B4SOIxbjt * T4 / pParam->B4SOIndioded; - DEXP(T7, T0); - T7 = pParam->B4SOIxdifd * T4 / pParam->B4SOIndioded; - DEXP(T7, T1); - T7 = pParam->B4SOIxrecd * T4 / pParam->B4SOInrecf0d; - DEXP(T7, T2); - - pParam->B4SOIahli0d = pParam->B4SOIahlid * T0; - pParam->B4SOIjbjtd = pParam->B4SOIidbjt * T0; - pParam->B4SOIjdifd = pParam->B4SOIiddif * T1; - pParam->B4SOIjrecd = pParam->B4SOIidrec * T2; - T7 = pParam->B4SOIxtund * (TempRatio - 1); - DEXP(T7, T0); - pParam->B4SOIjtund = pParam->B4SOIidtun * T0; - - if (pParam->B4SOInsub > 0) - pParam->B4SOIvfbb = -model->B4SOItype * model->B4SOIvtm * - log(pParam->B4SOInpeak/ pParam->B4SOInsub); - else - pParam->B4SOIvfbb = -model->B4SOItype * model->B4SOIvtm * - log(-pParam->B4SOInpeak* pParam->B4SOInsub/ni/ni); - - if (!model->B4SOIvsdfbGiven) - { - if (pParam->B4SOInsub > 0) - pParam->B4SOIvsdfb = -model->B4SOItype * - (model->B4SOIvtm*log(1e20 * - pParam->B4SOInsub / ni /ni) - 0.3); - else if (pParam->B4SOInsub < 0) - pParam->B4SOIvsdfb = -model->B4SOItype * - (model->B4SOIvtm*log(-1e20 / - pParam->B4SOInsub) + 0.3); - } - - /* Phi & Gamma */ - SDphi = 2.0*model->B4SOIvtm*log(fabs(pParam->B4SOInsub) / ni); - SDgamma = sqrt2qeps * sqrt(fabs(pParam->B4SOInsub)) - / model->B4SOIcbox; /* bugfix v4.3.1*/ - - if (!model->B4SOIvsdthGiven) - { - if ( ((pParam->B4SOInsub > 0) && (model->B4SOItype > 0)) || - ((pParam->B4SOInsub < 0) && (model->B4SOItype < 0)) ) - pParam->B4SOIvsdth = pParam->B4SOIvsdfb + SDphi + - SDgamma * sqrt(SDphi); - else - pParam->B4SOIvsdth = pParam->B4SOIvsdfb - SDphi - - SDgamma * sqrt(SDphi); - } - - if (!model->B4SOIcsdminGiven) { - /* Cdmin */ - tmp = sqrt(2.0 * epssub * SDphi / (Charge_q * - fabs(pParam->B4SOInsub) * 1.0e6)); - tmp1 = epssub / tmp; - model->B4SOIcsdmin = tmp1 * model->B4SOIcbox / - (tmp1 + model->B4SOIcbox); - } - - - pParam->B4SOIphi = 2.0 * model->B4SOIvtm - * log(pParam->B4SOInpeak / ni); - - pParam->B4SOIsqrtPhi = sqrt(pParam->B4SOIphi); - pParam->B4SOIphis3 = pParam->B4SOIsqrtPhi * pParam->B4SOIphi; - - pParam->B4SOIXdep0 = sqrt(2.0 * epssub / (Charge_q - * pParam->B4SOInpeak * 1.0e6)) - * pParam->B4SOIsqrtPhi; - pParam->B4SOIsqrtXdep0 = sqrt(pParam->B4SOIXdep0); - /*4.1*/ - if (model->B4SOImtrlMod==0) - pParam->B4SOIlitl = sqrt(3.0 *3.9/epsrox* pParam->B4SOIxj - * model->B4SOItox); - else - /* pParam->B4SOIlitl = sqrt(epssub * pParam->B4SOIxj * model->B4SOItox/(epsrox*EPS0)); */ /* Bug fix # 13 Jun 09 'not reported by vendors'*/ - pParam->B4SOIlitl = sqrt(epssub * pParam->B4SOIxj * toxe/(epsrox*EPS0)); /* fix */ - pParam->B4SOIvbi = model->B4SOIvtm * log(1.0e20 - * pParam->B4SOInpeak / (ni * ni)); - pParam->B4SOIcdep0 = sqrt(Charge_q * epssub - * pParam->B4SOInpeak * 1.0e6 / 2.0 - / pParam->B4SOIphi); - - /* v3.0 */ - /*4.1 */ - if (model->B4SOImtrlMod ==0) - { - if (pParam->B4SOIngate > 0.0) - { pParam->B4SOIvfbsd = Vtm0 * log(pParam->B4SOIngate - / 1.0e20); - } - else - pParam->B4SOIvfbsd = 0.0; - } - else - { - T0 = Vtm0 * log(pParam->B4SOInsd/ni); - T1 = 0.5 * Eg0; - if(T0 > T1) - T0 = T1; - T2 = model->B4SOIeasub + T1 - model->B4SOItype * T0; - pParam->B4SOIvfbsd = model->B4SOIphig - T2; - - - } - pParam->B4SOIToxRatio = exp(model->B4SOIntox - * log(model->B4SOItoxref /model->B4SOItoxqm)) - /model->B4SOItoxqm /model->B4SOItoxqm; - pParam->B4SOIToxRatioEdge = exp(model->B4SOIntox - * log(model->B4SOItoxref - / (model->B4SOItoxqm * pParam->B4SOIpoxedge))) - / model->B4SOItoxqm / model->B4SOItoxqm - / pParam->B4SOIpoxedge / pParam->B4SOIpoxedge; - /* pParam->B4SOIAechvb = (model->B4SOItype == NMOS) ? 4.97232e-7 : 3.42537e-7; - pParam->B4SOIBechvb = (model->B4SOItype == NMOS) ? 7.45669e11 : 1.16645e12; */ - pParam->B4SOIAechvb = (model->B4SOItype == NMOS) ? agbc2p : agbc2n; /* bugfix 4.3.1 -Tanvir */ - pParam->B4SOIBechvb = (model->B4SOItype == NMOS) ? bgbc2p : bgbc2n; /* bugfix v4.3.1 -Tanvir */ -// The edge should have a contribution from psbcp & pdbcp. Need s & d terms. -// There is no NF correction because psbcp & pdbcp are "per finger" in manual. - pParam->B4SOIAechvbEdges = pParam->B4SOIAechvb - * (pParam->B4SOIweff/here->B4SOInseg + here->B4SOIpsbcp) - * pParam->B4SOIdlcig * pParam->B4SOIToxRatioEdge; /* v3.1 bug fix */ - pParam->B4SOIAechvbEdged = pParam->B4SOIAechvb - * (pParam->B4SOIweff/here->B4SOInseg + here->B4SOIpdbcp) - * pParam->B4SOIdlcig * pParam->B4SOIToxRatioEdge; /* v3.1 bug fix */ - pParam->B4SOIBechvbEdge = -pParam->B4SOIBechvb - * model->B4SOItoxqm * pParam->B4SOIpoxedge; -/* pParam->B4SOIAechvb *= pParam->B4SOIweff/here->B4SOInseg */ -/* * pParam->B4SOIleff */ -/* * pParam->B4SOIToxRatio */ -/* + here->B4SOIagbcpd; v4.0 */ - pParam->B4SOIAechvb *= (pParam->B4SOIweff/here->B4SOInseg - * pParam->B4SOIleff - + here->B4SOIagbcpd/here->B4SOInf) /* LFW */ - * pParam->B4SOIToxRatio; /* From Geoffrey Coram 10/22/09 */ - - pParam->B4SOIBechvb *= -model->B4SOItoxqm; - /* v3.0 */ - - - if (model->B4SOIk1Given || model->B4SOIk2Given) - { if (!model->B4SOIk1Given) - { fprintf(stdout, "Warning: k1 should be specified with k2.\n"); - pParam->B4SOIk1 = 0.53; - } - if (!model->B4SOIk2Given) - { fprintf(stdout, "Warning: k2 should be specified with k1.\n"); - pParam->B4SOIk2 = -0.0186; - } - if (model->B4SOIxtGiven) - fprintf(stdout, "Warning: xt is ignored because k1 or k2 is given.\n"); - if (model->B4SOIvbxGiven) - fprintf(stdout, "Warning: vbx is ignored because k1 or k2 is given.\n"); - if (model->B4SOIvbmGiven) - fprintf(stdout, "Warning: vbm is ignored because k1 or k2 is given.\n"); - if (model->B4SOIgamma1Given) - fprintf(stdout, "Warning: gamma1 is ignored because k1 or k2 is given.\n"); - if (model->B4SOIgamma2Given) - fprintf(stdout, "Warning: gamma2 is ignored because k1 or k2 is given.\n"); - } - else - { if (!model->B4SOIvbxGiven){ - if (model->B4SOImtrlMod) - T0 = Charge_q / 2.0 / epssub * 1.0e6; - else - T0 = 7.7348e-4; - pParam->B4SOIvbx = pParam->B4SOIphi - T0 - * pParam->B4SOInpeak - * pParam->B4SOIxt * pParam->B4SOIxt;} /* bugfix 4.3.1 */ - if (pParam->B4SOIvbx > 0.0) - pParam->B4SOIvbx = -pParam->B4SOIvbx; - if (pParam->B4SOIvbm > 0.0) - pParam->B4SOIvbm = -pParam->B4SOIvbm; - - if (!model->B4SOIgamma1Given) - pParam->B4SOIgamma1 = sqrt2qeps - * sqrt(pParam->B4SOInpeak) - / model->B4SOIcox; /* bugfix 4.3.1 */ - if (!model->B4SOIgamma2Given) - pParam->B4SOIgamma2 = sqrt2qeps - * sqrt(pParam->B4SOInsub) - / model->B4SOIcox; /* bugfix 4.3.1 */ - - T0 = pParam->B4SOIgamma1 - pParam->B4SOIgamma2; - T1 = sqrt(pParam->B4SOIphi - pParam->B4SOIvbx) - - pParam->B4SOIsqrtPhi; - T2 = sqrt(pParam->B4SOIphi * (pParam->B4SOIphi - - pParam->B4SOIvbm)) - pParam->B4SOIphi; - pParam->B4SOIk2 = T0 * T1 / (2.0 * T2 + pParam->B4SOIvbm); - pParam->B4SOIk1 = pParam->B4SOIgamma2 - 2.0 - * pParam->B4SOIk2 * sqrt(pParam->B4SOIphi - - pParam->B4SOIvbm); - } - - /*if (pParam->B4SOIk2 < 0.0) - { T0 = 0.5 * pParam->B4SOIk1 / pParam->B4SOIk2; - pParam->B4SOIvbsc = 0.9 * (pParam->B4SOIphi - T0 * T0); - if (pParam->B4SOIvbsc > -3.0) - pParam->B4SOIvbsc = -3.0; - else if (pParam->B4SOIvbsc < -30.0) - pParam->B4SOIvbsc = -30.0; - } - else - { pParam->B4SOIvbsc = -30.0; - } - if (pParam->B4SOIvbsc > pParam->B4SOIvbm) - pParam->B4SOIvbsc = pParam->B4SOIvbm; */ /* v4.2 never used in code */ - - if ((T0 = pParam->B4SOIweff + pParam->B4SOIk1w2) < 1e-8) - T0 = 1e-8; - pParam->B4SOIk1eff = pParam->B4SOIk1 * (1 + pParam->B4SOIk1w1/T0); - /*4.0 - if (model->B4SOIvth0Given) - { pParam->B4SOIvfb = model->B4SOItype * pParam->B4SOIvth0 - - pParam->B4SOIphi - pParam->B4SOIk1eff - * pParam->B4SOIsqrtPhi; - } - else - { pParam->B4SOIvfb = -1.0; - pParam->B4SOIvth0 = model->B4SOItype * (pParam->B4SOIvfb - + pParam->B4SOIphi + pParam->B4SOIk1eff - * pParam->B4SOIsqrtPhi); - } - */ - /* v4.1 */ - if (!model->B4SOIvfbGiven) - { if (model->B4SOIvth0Given) - { pParam->B4SOIvfb = model->B4SOItype * pParam->B4SOIvth0 - - pParam->B4SOIphi - pParam->B4SOIk1eff - * pParam->B4SOIsqrtPhi; - } - else - { pParam->B4SOIvfb = -1.0; - } - } - if (!model->B4SOIvth0Given) - { pParam->B4SOIvth0 = model->B4SOItype * (pParam->B4SOIvfb - + pParam->B4SOIphi + pParam->B4SOIk1eff - * pParam->B4SOIsqrtPhi); - } - /* v4.0 */ - pParam->B4SOIk1ox = pParam->B4SOIk1eff * model->B4SOItox - / model->B4SOItoxm; - if(model->B4SOImtrlMod == 0) - T1 = sqrt(EPSSI / EPSOX * model->B4SOItox - * pParam->B4SOIXdep0); - else - T1 = sqrt(epssub / (epsrox*EPS0) * model->B4SOItox - * pParam->B4SOIXdep0); - T0 = exp(-0.5 * pParam->B4SOIdsub * pParam->B4SOIleff / T1); - pParam->B4SOItheta0vb0 = (T0 + 2.0 * T0 * T0); - - T0 = exp(-0.5 * pParam->B4SOIdrout * pParam->B4SOIleff / T1); - T2 = (T0 + 2.0 * T0 * T0); - pParam->B4SOIthetaRout = pParam->B4SOIpdibl1 * T2 - + pParam->B4SOIpdibl2; - - /* New DITS term (added in 4.1) */ - pParam->B4SOIdvtp2factor = pParam->B4SOIdvtp2 / exp(pParam->B4SOIdvtp3 * log(pParam->B4SOIleff)); - - /* stress effect */ - if (model->B4SOIwlod < 0.0) - { fprintf(stderr, "Warning: WLOD = %g is less than 0. Set to 0.0\n",model->B4SOIwlod); - model->B4SOIwlod = 0.0; - } - - T0 = pow(Ldrn, model->B4SOIllodku0); - W_tmp = Wdrn + model->B4SOIwlod; - T1 = pow(W_tmp, model->B4SOIwlodku0); - tmp1 = model->B4SOIlku0 / T0 + model->B4SOIwku0 / T1 - + model->B4SOIpku0 / (T0 * T1); - pParam->B4SOIku0 = 1.0 + tmp1; - - T0 = pow(Ldrn, model->B4SOIllodvth); - T1 = pow(W_tmp, model->B4SOIwlodvth); - tmp1 = model->B4SOIlkvth0 / T0 + model->B4SOIwkvth0 / T1 - + model->B4SOIpkvth0 / (T0 * T1); - pParam->B4SOIkvth0 = 1.0 + tmp1; - pParam->B4SOIkvth0 = sqrt( pParam->B4SOIkvth0 - * pParam->B4SOIkvth0 + DELTA); - - /*T0 = (TRatio - 1.0);*/ - T0 = (TempRatio - 1.0); /* bug fix v4.1 */ - pParam->B4SOIku0temp = pParam->B4SOIku0 * (1.0 - + model->B4SOItku0 * T0) + DELTA; - - Inv_saref = 1.0 / (model->B4SOIsaref + 0.5 * Ldrn); - Inv_sbref = 1.0 / (model->B4SOIsbref + 0.5 * Ldrn); - pParam->B4SOIinv_od_ref = Inv_saref + Inv_sbref; - pParam->B4SOIrho_ref = model->B4SOIku0 / pParam->B4SOIku0temp - * pParam->B4SOIinv_od_ref; - /* stress effect end */ - - } - - /* v4.0 stress effect */ /* Bug Fix # 17 Jul09 Code 1484-1560 is moved up from lines 1884-1958 of old version*/ - /* v4.0 stress effect */ - if( (here->B4SOIsa > 0.0) && (here->B4SOIsb > 0.0) && - ( (here->B4SOInf == 1.0) || - ((here->B4SOInf > 1.0) && (here->B4SOIsd > 0.0)) - ) - ) - { Inv_sa = 0; - Inv_sb = 0; - - if (model->B4SOIkvsat < -1.0 ) - { fprintf(stderr, "Warning: KVSAT = %g is too small; Reset to -1.0.\n",model->B4SOIkvsat); - here->B4SOIkvsat = kvsat = -1.0; - } - else if (model->B4SOIkvsat > 1.0) - { fprintf(stderr, "Warning: KVSAT = %g is too big; Reset to 1.0.\n",model->B4SOIkvsat); - here->B4SOIkvsat = kvsat = 1.0; - } - else here->B4SOIkvsat = model->B4SOIkvsat; - - for(i = 0; i < here->B4SOInf; i++) { - T0 = 1.0 / here->B4SOInf / (here->B4SOIsa - + 0.5*Ldrn + i * (here->B4SOIsd +Ldrn)); - T1 = 1.0 / here->B4SOInf / (here->B4SOIsb - + 0.5*Ldrn + i * (here->B4SOIsd +Ldrn)); - Inv_sa += T0; - Inv_sb += T1; - } - - Inv_ODeff = Inv_sa + Inv_sb; - here->B4SOIInv_ODeff = Inv_ODeff; - rho = model->B4SOIku0 / pParam->B4SOIku0temp * Inv_ODeff; - T0 = (1.0 + rho)/(1.0 + pParam->B4SOIrho_ref); - here->B4SOIu0temp = pParam->B4SOIu0temp * T0; - - T1 = (1.0 + here->B4SOIkvsat * rho)/(1.0 + here->B4SOIkvsat * pParam->B4SOIrho_ref);/*self-heating bug fix*/ - here->B4SOIvsattemp = pParam->B4SOIvsattemp * T1; - - OD_offset = Inv_ODeff - pParam->B4SOIinv_od_ref; - dvth0_lod = model->B4SOIkvth0 - / pParam->B4SOIkvth0 * OD_offset; - dk2_lod = model->B4SOIstk2 - / pow(pParam->B4SOIkvth0, model->B4SOIlodk2) - * OD_offset; - deta0_lod = model->B4SOIsteta0 - / pow(pParam->B4SOIkvth0, model->B4SOIlodeta0) - * OD_offset; - here->B4SOIvth0 = pParam->B4SOIvth0 + dvth0_lod; - - here->B4SOIk2 = pParam->B4SOIk2 + dk2_lod; - - here->B4SOIeta0 = pParam->B4SOIeta0 + deta0_lod; - } - else { - here->B4SOIu0temp = pParam->B4SOIu0temp; - here->B4SOIvth0 = pParam->B4SOIvth0; - here->B4SOIvsattemp = pParam->B4SOIvsattemp; - here->B4SOIk2 = pParam->B4SOIk2; - here->B4SOIeta0 = pParam->B4SOIeta0; - here->B4SOIInv_ODeff = 0; - pParam->B4SOIinv_od_ref = 0; /*Stress bug fix*/ - here->B4SOIkvsat = 0; /*Stress bug fix*/ - } /* v4.0 stress effect end */ - - - - - here->B4SOIk2ox = here->B4SOIk2 * model->B4SOItox - / model->B4SOItoxm; /* v4.0 */ - here->B4SOIvth0 += here->B4SOIdelvto; /* v4.0 */ - here->B4SOIvfb = pParam->B4SOIvfb + model->B4SOItype * here->B4SOIdelvto; - /* Bug Fix # 17 Jul09 Code 1479-1545 is moved up from lines 1884-1950 of old version, 1954-2035 in this version*/ - - here->B4SOIcsbox = model->B4SOIcbox*here->B4SOIsourceArea; - here->B4SOIcsmin = model->B4SOIcsdmin*here->B4SOIsourceArea; - here->B4SOIcdbox = model->B4SOIcbox*here->B4SOIdrainArea; - here->B4SOIcdmin = model->B4SOIcsdmin*here->B4SOIdrainArea; - - if ( ((pParam->B4SOInsub > 0) && (model->B4SOItype > 0)) || - ((pParam->B4SOInsub < 0) && (model->B4SOItype < 0)) ) - { - T0 = pParam->B4SOIvsdth - pParam->B4SOIvsdfb; - pParam->B4SOIsdt1 = pParam->B4SOIvsdfb + model->B4SOIasd * T0; - T1 = here->B4SOIcsbox - here->B4SOIcsmin; - T2 = T1 / T0 / T0; - pParam->B4SOIst2 = T2 / model->B4SOIasd; - pParam->B4SOIst3 = T2 /( 1 - model->B4SOIasd); - here->B4SOIst4 = T0 * T1 * (1 + model->B4SOIasd) / 3 - - here->B4SOIcsmin * pParam->B4SOIvsdfb; - - T1 = here->B4SOIcdbox - here->B4SOIcdmin; - T2 = T1 / T0 / T0; - pParam->B4SOIdt2 = T2 / model->B4SOIasd; - pParam->B4SOIdt3 = T2 /( 1 - model->B4SOIasd); - here->B4SOIdt4 = T0 * T1 * (1 + model->B4SOIasd) / 3 - - here->B4SOIcdmin * pParam->B4SOIvsdfb; - } else - { - T0 = pParam->B4SOIvsdfb - pParam->B4SOIvsdth; - pParam->B4SOIsdt1 = pParam->B4SOIvsdth + model->B4SOIasd * T0; - T1 = here->B4SOIcsmin - here->B4SOIcsbox; - T2 = T1 / T0 / T0; - pParam->B4SOIst2 = T2 / model->B4SOIasd; - pParam->B4SOIst3 = T2 /( 1 - model->B4SOIasd); - here->B4SOIst4 = T0 * T1 * (1 + model->B4SOIasd) / 3 - - here->B4SOIcsbox * pParam->B4SOIvsdth; - - T1 = here->B4SOIcdmin - here->B4SOIcdbox; - T2 = T1 / T0 / T0; - pParam->B4SOIdt2 = T2 / model->B4SOIasd; - pParam->B4SOIdt3 = T2 /( 1 - model->B4SOIasd); - here->B4SOIdt4 = T0 * T1 * (1 + model->B4SOIasd) / 3 - - here->B4SOIcdbox * pParam->B4SOIvsdth; - } - - /* v2.2.2 bug fix */ - T0 = model->B4SOIcsdesw * log(model->B4SOIcfrcoeff * (1 + model->B4SOItsi / - model->B4SOItbox)); /* v4.4 */ - T1 = here->B4SOIsourcePerimeter - here->B4SOIw; - if (T1 > 0.0) - here->B4SOIcsesw = T0 * T1; - else - here->B4SOIcsesw = 0.0; - T1 = here->B4SOIdrainPerimeter - here->B4SOIw; - if (T1 > 0.0) - here->B4SOIcdesw = T0 * T1; - else - here->B4SOIcdesw = 0.0; - - - here->B4SOIphi = pParam->B4SOIphi; - /* process source/drain series resistance */ - here->B4SOIdrainConductance = model->B4SOIsheetResistance - * here->B4SOIdrainSquares; - if (here->B4SOIdrainConductance > 0.0) - here->B4SOIdrainConductance = 1.0 - / here->B4SOIdrainConductance; - else - here->B4SOIdrainConductance = 0.0; - - here->B4SOIsourceConductance = model->B4SOIsheetResistance - * here->B4SOIsourceSquares; - if (here->B4SOIsourceConductance > 0.0) - here->B4SOIsourceConductance = 1.0 - / here->B4SOIsourceConductance; - else - here->B4SOIsourceConductance = 0.0; - here->B4SOIcgso = pParam->B4SOIcgso; - here->B4SOIcgdo = pParam->B4SOIcgdo; - - - /* v2.0 release */ - if (model->B4SOIln < 1e-15) model->B4SOIln = 1e-15; - T0 = -0.5 * pParam->B4SOIleff * pParam->B4SOIleff / model->B4SOIln / model->B4SOIln; - DEXP(T0,T1); - pParam->B4SOIarfabjt = T1; - - T0 = pParam->B4SOIlbjt0 * (1.0 / pParam->B4SOIleff + 1.0 / model->B4SOIln); - pParam->B4SOIlratio = pow(T0,pParam->B4SOInbjt); - pParam->B4SOIlratiodif = 1.0 + model->B4SOIldif0 * pow(T0,pParam->B4SOIndif); - - if ((pParam->B4SOIvearly = pParam->B4SOIvabjt + pParam->B4SOIaely * pParam->B4SOIleff) < 1) - pParam->B4SOIvearly = 1; - - /*4.1 toxp calculation*/ - if(model->B4SOImtrlMod==0) - { - model->B4SOItoxp = model->B4SOItox - model->B4SOIdtoxcv; - } - else - { - /* Calculate TOXP from EOT */ - /* Calculate Vgs_eff @ Vgs = VDD with Poly Depletion Effect */ - Vtm0eot = KboQ * model->B4SOItempeot; - Vtmeot = Vtm0eot; - vbieot = Vtm0eot * log(1.0e20 - * pParam->B4SOInpeak / (ni * ni)); - phieot = 2.0 * Vtm0eot - * log(pParam->B4SOInpeak / ni); - sqrtphieot = sqrt(phieot); - tmp2 = here->B4SOIvfb + phieot; - vddeot = model->B4SOItype * model->B4SOIvddeot; - - T0 = model->B4SOIepsrgate * EPS0; - if ((pParam->B4SOIngate > 1.0e18) && (pParam->B4SOIngate < 1.0e25) - && (vddeot > tmp2) && (T0!=0)) - { T1 = 1.0e6 * Charge_q * epssub * pParam->B4SOIngate - / (model->B4SOIcox * model->B4SOIcox); - T4 = sqrt(1.0 + 2.0 * (vddeot - T0) / T1); - T2 = T1 * (T4 - 1.0); - T3 = 0.5 * T2 * T2 / T1; /* T3 = Vpoly */ - /* T7 = 1.12 - T3 - 0.05; */ - T7 = eggdep - T3 - 0.05; /* bugfix v4.3.1 -Tanvir */ - T6 = sqrt(T7 * T7 + 0.224); - /* T5 = 1.12 - 0.5 * (T7 + T6); */ - T5 = eggdep - 0.5 * (T7 + T6); /* bugfix v4.3.1 -Tanvir */ - Vgs_eff = vddeot - T5; - - } - else - { Vgs_eff = vddeot; - - } - - - - /* Calculate Vth @ Vds=Vbs=0 */ - - V0 = vbieot - phieot; - - T3 = sqrt(pParam->B4SOIXdep0); - - - - - lt1 = model->B4SOIfactor1 * T3; - - - - ltw= model->B4SOIfactor1 * T3 ; - - - T0 = -0.5 * pParam->B4SOIdvt1 * model->B4SOIleffeot / lt1; - if (T0 > -EXPL_THRESHOLD) - { T1 = exp(T0); - Theta0 = T1 * (1.0 + 2.0 * T1); - - } - else - { T1 = MIN_EXPL; - Theta0 = T1 * (1.0 + 2.0 * T1); - - } - - /* Calculate n */ - T2 = pParam->B4SOInfactor * epssub / pParam->B4SOIXdep0; - T3 = pParam->B4SOIcdsc ; - T4 = (T2 + T3 * Theta0 + pParam->B4SOIcit) / model->B4SOIcox; - - - if (T4 >= -0.5) - { n = 1.0 + T4; - - } - else - /* avoid discontinuity problems caused by T4 */ - { T0 = 1.0 / (3.0 + 8.0 * T4); - n = (1.0 + 3.0 * T4) * T0; - - } - - /* v4.0 DITS */ - if (pParam->B4SOIdvtp0 > 0.0) { - T2 = 1; /* Bug fix #1 Jun 09 Shorter implementation of same code */ - /* T0 = 0.0; - T2 = exp(T0); - if (T0 < -EXPL_THRESHOLD) { - T2 = MIN_EXPL; - - } - else { - T2 = exp(T0); - - } end */ - - T3 = model->B4SOIleffeot + pParam->B4SOIdvtp0 * (1.0 + T2); - - T4 = Vtmeot * log(model->B4SOIleffeot / T3); - - DITS_Sft = n * T4; - - - } - else { - DITS_Sft=0.0; - - } - - here->B4SOIthetavth = pParam->B4SOIdvt0 * Theta0; - Delt_vth = here->B4SOIthetavth * V0; - - T0 = -0.5 * pParam->B4SOIdvt1w * model->B4SOIweffeot - * model->B4SOIleffeot / ltw; - if (T0 > -EXPL_THRESHOLD) - { T1 = exp(T0); - T2 = T1 * (1.0 + 2.0 * T1); - - } - else - { T1 = MIN_EXPL; - T2 = T1 * (1.0 + 2.0 * T1); - - } - - T0 = pParam->B4SOIdvt0w * T2; - DeltVthw = T0 * V0; - - TempRatioMinus1 = model->B4SOItempeot / model->B4SOItnom - 1.0; - - T0 = sqrt(1.0 + pParam->B4SOIlpe0 / model->B4SOIleffeot); - T1 = (pParam->B4SOIkt1 + pParam->B4SOIkt1l / model->B4SOIleffeot); - DeltVthtemp = pParam->B4SOIk1ox * (T0 - 1.0) * sqrtphieot - + T1 * TempRatioMinus1; /* v4.0 */ - - - tmp2 = toxe * phieot - / (model->B4SOIweffeot + pParam->B4SOIw0); - - - DIBL_Sft = 0.0; - DITS_Sft2 = 0.0; - - - Lpe_Vb = sqrt(1.0 + pParam->B4SOIlpeb / model->B4SOIleffeot); - - - sqrtPhisExt = sqrtphieot; - - - Vth = model->B4SOItype * here->B4SOIvth0 - + (pParam->B4SOIk1ox * sqrtPhisExt - - pParam->B4SOIk1eff * sqrtphieot) * Lpe_Vb - - Delt_vth - DeltVthw - +pParam->B4SOIk3 * tmp2 - + DeltVthtemp - DIBL_Sft -DITS_Sft - DITS_Sft2; - - - Vgst = Vgs_eff - Vth; - - - T10 = n * Vtmeot; /* v4.0 */ - VgstNVt = pParam->B4SOImstar * Vgst / T10; /* v4.0 */ - - ExpArg = (pParam->B4SOIvoff - (1- pParam->B4SOImstar) * Vgst) - / T10; /* v4.0 */ - - /* MCJ: Very small Vgst */ - if (VgstNVt > EXPL_THRESHOLD) - { Vgsteff = Vgst; - /* T0 is dVgsteff_dVbseff */ - - } - else if (ExpArg > EXPL_THRESHOLD) - { T0 = (Vgst - pParam->B4SOIvoff) / (n * Vtmeot); - ExpVgst = exp(T0); - Vgsteff = Vtmeot * pParam->B4SOIcdep0 / model->B4SOIcox * ExpVgst; - - - } - else - { ExpVgst = exp(VgstNVt); - T1 = T10 * log(1.0 + ExpVgst); - - T3 = (1.0 / model->B4SOItempeot); - - - T4 = -model->B4SOIcox / (Vtm0eot * pParam->B4SOIcdep0) - * exp(ExpArg) * (1 - pParam->B4SOImstar); - T2 = pParam->B4SOImstar - T10 * T4 - / (1.0 - pParam->B4SOImstar); - - Vgsteff = T1 / T2; - - } - Vgst2Vtm = Vgsteff + 2.0 * Vtmeot; - - - - - - /* calculating Toxp */ - T3 = model->B4SOItype * here->B4SOIvth0 - - here->B4SOIvfb - phieot; - - - vtfbphi2eot = 4.0 * T3; - if (vtfbphi2eot < 0.0) - vtfbphi2eot = 0.0; - - - niter = 0; - toxpf = toxe; - do - { - toxpi = toxpf; - tmp2 = 2.0e8 * toxpf; - T0 = (Vgsteff + vtfbphi2eot) / tmp2; - T1 = 1.0 + exp(model->B4SOIbdos * 0.7 * log(T0)); - Tcen = model->B4SOIados * 1.9e-9 / T1; - toxpf = toxe - epsrox/model->B4SOIepsrsub * Tcen; - niter++; - } while ((niter<=4)&&(ABS(toxpf-toxpi)>1e-12)); - model->B4SOItoxp = toxpf; - /*model->B4SOIcoxp = epsrox * EPS0 / model->B4SOItoxp;*/ - - - }/*End of Toxp*/ - - /* vfbzb calculation for capMod 3 */ - tmp = sqrt(pParam->B4SOIXdep0); - tmp1 = pParam->B4SOIvbi - pParam->B4SOIphi; - tmp2 = model->B4SOIfactor1 * tmp; - - T0 = -0.5 * pParam->B4SOIdvt1w * pParam->B4SOIweff - * pParam->B4SOIleff / tmp2; - if (T0 > -EXPL_THRESHOLD) - { T1 = exp(T0); - T2 = T1 * (1.0 + 2.0 * T1); - } - else - { T1 = MIN_EXPL; - T2 = T1 * (1.0 + 2.0 * T1); - } - T0 = pParam->B4SOIdvt0w * T2; - T2 = T0 * tmp1; - - T0 = -0.5 * pParam->B4SOIdvt1 * pParam->B4SOIleff / tmp2; - if (T0 > -EXPL_THRESHOLD) - { T1 = exp(T0); - T3 = T1 * (1.0 + 2.0 * T1); - } - else - { T1 = MIN_EXPL; - T3 = T1 * (1.0 + 2.0 * T1); - } - T3 = pParam->B4SOIdvt0 * T3 * tmp1; - - /* v2.2.3 */ - /*4.1*/ - /* T4 = (model->B4SOItox - model->B4SOIdtoxcv) * pParam->B4SOIphi - / (pParam->B4SOIweff + pParam->B4SOIw0); - */ - T4 = model->B4SOItoxp * pParam->B4SOIphi - / (pParam->B4SOIweff + pParam->B4SOIw0); - T0 = sqrt(1.0 + pParam->B4SOIlpe0 / pParam->B4SOIleff); /*v4.0*/ - T5 = pParam->B4SOIk1ox * (T0 - 1.0) * pParam->B4SOIsqrtPhi - + (pParam->B4SOIkt1 + pParam->B4SOIkt1l / pParam->B4SOIleff) - * (TempRatio - 1.0); /* v4.0 */ - - tmp3 = model->B4SOItype * pParam->B4SOIvth0 - - T2 - T3 + pParam->B4SOIk3 * T4 + T5; - pParam->B4SOIvfbzb = tmp3 - pParam->B4SOIphi - pParam->B4SOIk1 - * pParam->B4SOIsqrtPhi; - /* End of vfbzb */ - - - /* v3.2 */ - pParam->B4SOIqsi = Charge_q * model->B4SOInpeak - * (1.0 + pParam->B4SOIlpe0 / pParam->B4SOIleff) - * 1e6 * model->B4SOItsi; - - - /* v3.1 added for RF */ - here->B4SOIgrgeltd = model->B4SOIrshg * (model->B4SOIxgw - + pParam->B4SOIweff / here->B4SOInseg - / 3.0 / model->B4SOIngcon) / - (model->B4SOIngcon * here->B4SOInf * - (here->B4SOIl - model->B4SOIxgl)); - if (here->B4SOIgrgeltd > 0.0) - here->B4SOIgrgeltd = 1.0 / here->B4SOIgrgeltd; - else - { here->B4SOIgrgeltd = 1.0e3; /* mho */ - if (here->B4SOIrgateMod !=0) - printf("Warning: The gate conductance reset to 1.0e3 mho.\n"); - } - /* v3.1 added for RF end */ - - /* v4.0 rbodyMod */ - if (here->B4SOIrbodyMod) - { if (here->B4SOIrbdb < 1.0e-3) - here->B4SOIgrbdb = 1.0e3; /* in mho */ - else - here->B4SOIgrbdb = model->B4SOIgbmin - + 1.0 / here->B4SOIrbdb; - if (here->B4SOIrbsb < 1.0e-3) - here->B4SOIgrbsb = 1.0e3; - else - here->B4SOIgrbsb = model->B4SOIgbmin - + 1.0 / here->B4SOIrbsb; - } - /* v4.0 rbodyMod end */ - /* Bug Fix # 17 Jul09 Stress effect code (lines: 1954-2020) is moved up to lines 1479-1545*/ - - here->B4SOIvfbzb = pParam->B4SOIvfbzb + model->B4SOItype * here->B4SOIdelvto; - - pParam->B4SOIldeb = sqrt(epssub * Vtm0 / - (Charge_q * pParam->B4SOInpeak * 1.0e6)) / 3.0; - - /*For high k mobility*/ - T1 = model->B4SOItype * here->B4SOIvth0 - - here->B4SOIvfb - pParam->B4SOIphi; - T2 = T1 + T1; - T3 = 2.5 * T1; - here->B4SOIvtfbphi1 = (model->B4SOItype == NMOS) ? T2 : T3; - if (here->B4SOIvtfbphi1 < 0.0) - here->B4SOIvtfbphi1 = 0.0; - /*Calculate VgsteffVth for mobMod=4*/ - if(model->B4SOImobMod == 4) - { - /*Calculate n @ Vbs=Vds=0*/ - /*V0 = pParam->B4SOIvbi - pParam->B4SOIphi; */ /* v4.2 never used in code */ - lt1 = model->B4SOIfactor1* pParam->B4SOIsqrtXdep0; - /* ltw = lt1; */ /* v4.2 never used in code */ - T0 = pParam->B4SOIdvt1 * pParam->B4SOIleff / lt1; - if (T0 < EXPL_THRESHOLD) - { - T1 = exp(T0); - T2 = T1 - 1.0; - T3 = T2 * T2; - T4 = T3 + 2.0 * T1 * MIN_EXPL; - Theta0 = T1 / T4; - } - else - Theta0 = 1.0 / (MAX_EXPL - 2.0); - - tmp1 = epssub / pParam->B4SOIXdep0; - /*here->B4SOInstar = model->B4SOIvtm / Charge_q * - (model->B4SOIcox + tmp1 + pParam->B4SOIcit); */ /* v4.2 never used in code */ - tmp2 = pParam->B4SOInfactor * tmp1; - tmp3 = (tmp2 + pParam->B4SOIcdsc * Theta0 + pParam->B4SOIcit) / model->B4SOIcox; - if (tmp3 >= -0.5) - n0 = 1.0 + tmp3; - else - { - T0 = 1.0 / (3.0 + 8.0 * tmp3); - n0 = (1.0 + 3.0 * tmp3) * T0; - } - - T0 = n0 * Vtm0; - T1 = pParam->B4SOIvoff; - T2 = T1/T0; - if (T2 < -EXPL_THRESHOLD) - { T3 = model->B4SOIcox * MIN_EXPL / pParam->B4SOIcdep0; - T4 = pParam->B4SOImstar + T3 * n0; - } - else if (T2 > EXPL_THRESHOLD) - { T3 = model->B4SOIcox * MAX_EXPL / pParam->B4SOIcdep0; - T4 = pParam->B4SOImstar + T3 * n0; - } - else - { T3 = exp(T2)* model->B4SOIcox / pParam->B4SOIcdep0; - T4 = pParam->B4SOImstar + T3 * n0; - - } - - here->B4SOIvgsteffvth = T0 * log(2.0)/T4; - - } - - - } - } - return(OK); -} - diff --git a/src/spicelib/devices/bsimsoi/b4soitrunc.c b/src/spicelib/devices/bsimsoi/b4soitrunc.c deleted file mode 100644 index 1dd9cd64b..000000000 --- a/src/spicelib/devices/bsimsoi/b4soitrunc.c +++ /dev/null @@ -1,60 +0,0 @@ -/*** B4SOI 12/16/2010 Released by Tanvir Morshed ***/ - - -/********** - * Copyright 2010 Regents of the University of California. All rights reserved. - * Authors: 1998 Samuel Fung, Dennis Sinitsky and Stephen Tang - * Authors: 1999-2004 Pin Su, Hui Wan, Wei Jin, b3soitrunc.c - * Authors: 2005- Hui Wan, Xuemei Xi, Ali Niknejad, Chenming Hu. - * Authors: 2009- Wenwei Yang, Chung-Hsun Lin, Ali Niknejad, Chenming Hu. - * File: b4soitrunc.c - * Modified by Hui Wan, Xuemei Xi 11/30/2005 - * Modified by Wenwei Yang, Chung-Hsun Lin, Darsen Lu 03/06/2009 - * Modified by Tanvir Morshed 09/22/2009 - * Modified by Tanvir Morshed 12/31/2009 - **********/ - -#include "ngspice/ngspice.h" -#include "ngspice/cktdefs.h" -#include "b4soidef.h" -#include "ngspice/sperror.h" -#include "ngspice/suffix.h" - - -int -B4SOItrunc( -GENmodel *inModel, -CKTcircuit *ckt, -double *timeStep) -{ -register B4SOImodel *model = (B4SOImodel*)inModel; -register B4SOIinstance *here; - -#ifdef STEPDEBUG - double debugtemp; -#endif /* STEPDEBUG */ - - for (; model != NULL; model = B4SOInextModel(model)) - { for (here = B4SOIinstances(model); here != NULL; - here = B4SOInextInstance(here)) - { - -#ifdef STEPDEBUG - debugtemp = *timeStep; -#endif /* STEPDEBUG */ - CKTterr(here->B4SOIqb,ckt,timeStep); - CKTterr(here->B4SOIqg,ckt,timeStep); - CKTterr(here->B4SOIqd,ckt,timeStep); -#ifdef STEPDEBUG - if(debugtemp != *timeStep) - { printf("device %s reduces step from %g to %g\n", - here->B4SOIname,debugtemp,*timeStep); - } -#endif /* STEPDEBUG */ - } - } - return(OK); -} - - - diff --git a/src/spicelib/devices/cccs/Makefile.am b/src/spicelib/devices/cccs/Makefile.am deleted file mode 100644 index 0563b829b..000000000 --- a/src/spicelib/devices/cccs/Makefile.am +++ /dev/null @@ -1,26 +0,0 @@ -## Process this file with automake to produce Makefile.in - -noinst_LTLIBRARIES = libcccs.la - -libcccs_la_SOURCES = \ - cccs.c \ - cccsask.c \ - cccsdefs.h \ - cccsext.h \ - cccsinit.c \ - cccsinit.h \ - cccsitf.h \ - cccsload.c \ - cccspar.c \ - cccspzld.c \ - cccssacl.c \ - cccsset.c \ - cccssld.c \ - cccssprt.c \ - cccssset.c - - - -AM_CPPFLAGS = @AM_CPPFLAGS@ -I$(top_srcdir)/src/include -AM_CFLAGS = $(STATIC) -MAINTAINERCLEANFILES = Makefile.in diff --git a/src/spicelib/devices/cccs/cccs.c b/src/spicelib/devices/cccs/cccs.c deleted file mode 100644 index a24ccf9f9..000000000 --- a/src/spicelib/devices/cccs/cccs.c +++ /dev/null @@ -1,45 +0,0 @@ -/********** -Copyright 1990 Regents of the University of California. All rights reserved. -Author: 1987 Thomas L. Quarles -**********/ - -#include "ngspice/ngspice.h" -#include "ngspice/ifsim.h" -#include "ngspice/devdefs.h" -#include "cccsdefs.h" -#include "ngspice/suffix.h" - -IFparm CCCSpTable[] = { /* parameters */ - IOPU("gain", CCCS_GAIN, IF_REAL ,"Gain of source"), - IOPU("control", CCCS_CONTROL, IF_INSTANCE,"Name of controlling source"), - IOP ( "m", CCCS_M, IF_REAL , "Parallel multiplier"), - IP("sens_gain",CCCS_GAIN_SENS,IF_FLAG, "flag to request sensitivity WRT gain"), - OPU("neg_node", CCCS_NEG_NODE,IF_INTEGER, "Negative node of source"), - OPU("pos_node", CCCS_POS_NODE,IF_INTEGER, "Positive node of source"), - OP("i", CCCS_CURRENT, IF_REAL, "CCCS output current"), - OP("v", CCCS_VOLTS, IF_REAL, "CCCS voltage at output"), - OP("p", CCCS_POWER, IF_REAL, "CCCS power"), - OPU("sens_dc", CCCS_QUEST_SENS_DC, IF_REAL, "dc sensitivity "), - OPU("sens_real",CCCS_QUEST_SENS_REAL,IF_REAL, "real part of ac sensitivity"), - OPU("sens_imag",CCCS_QUEST_SENS_IMAG,IF_REAL, "imag part of ac sensitivity"), - OPU("sens_mag", CCCS_QUEST_SENS_MAG, IF_REAL, "sensitivity of ac magnitude"), - OPU("sens_ph", CCCS_QUEST_SENS_PH, IF_REAL, "sensitivity of ac phase"), - OPU("sens_cplx",CCCS_QUEST_SENS_CPLX,IF_COMPLEX, "ac sensitivity") -}; - -#if 0 -static IFparm CCCSmPTable[] = { - /* model parameters */ -}; -#endif - -char *CCCSnames[] = { - "F+", - "F-" -}; - -int CCCSnSize = NUMELEMS(CCCSnames); -int CCCSpTSize = NUMELEMS(CCCSpTable); -int CCCSmPTSize = 0; -int CCCSiSize = sizeof(CCCSinstance); -int CCCSmSize = sizeof(CCCSmodel); diff --git a/src/spicelib/devices/cccs/cccsask.c b/src/spicelib/devices/cccs/cccsask.c deleted file mode 100644 index b674d8603..000000000 --- a/src/spicelib/devices/cccs/cccsask.c +++ /dev/null @@ -1,143 +0,0 @@ -/********** -Copyright 1990 Regents of the University of California. All rights reserved. -Author: 1987 -**********/ - -/* - * This routine gives access to the internal device parameters - * of Current Controlled Current Source - */ - -#include "ngspice/ngspice.h" -#include "ngspice/cktdefs.h" -#include "ngspice/devdefs.h" -#include "ngspice/ifsim.h" -#include "cccsdefs.h" -#include "ngspice/sperror.h" -#include "ngspice/suffix.h" - - -/* ARGSUSED */ -int -CCCSask(CKTcircuit *ckt, GENinstance *inst, int which, IFvalue *value, IFvalue *select) -{ - CCCSinstance *here = (CCCSinstance*)inst; - double vr; - double vi; - double sr; - double si; - double vm; - static char *msg = "Current and power not available for ac analysis"; - - switch(which) { - case CCCS_GAIN: - value->rValue = here->CCCScoeff; - return (OK); - case CCCS_CONTROL: - value->uValue = here->CCCScontName; - return (OK); - case CCCS_M: - value->rValue = here->CCCSmValue; - return (OK); - case CCCS_POS_NODE: - value->iValue = here->CCCSposNode; - return (OK); - case CCCS_NEG_NODE: - value->iValue = here->CCCSnegNode; - return (OK); - case CCCS_CONT_BR: - value->iValue = here->CCCScontBranch; - return (OK); - case CCCS_CURRENT : - if (ckt->CKTcurrentAnalysis & DOING_AC) { - errMsg = TMALLOC(char, strlen(msg) + 1); - errRtn = "CCCSask"; - strcpy(errMsg,msg); - return(E_ASKCURRENT); - } else { - value->rValue = *(ckt->CKTrhsOld + - here->CCCScontBranch) * here->CCCScoeff; - } - return(OK); - case CCCS_VOLTS : - value->rValue = (*(ckt->CKTrhsOld + here->CCCSposNode) - - *(ckt->CKTrhsOld + here->CCCSnegNode)); - return(OK); - case CCCS_POWER : - if (ckt->CKTcurrentAnalysis & DOING_AC) { - errMsg = TMALLOC(char, strlen(msg) + 1); - errRtn = "CCCSask"; - strcpy(errMsg,msg); - return(E_ASKPOWER); - } else { - value->rValue = *(ckt->CKTrhsOld + - here->CCCScontBranch) * here->CCCScoeff * - (*(ckt->CKTrhsOld + here->CCCSposNode) - - *(ckt->CKTrhsOld + here->CCCSnegNode)); - } - return(OK); - case CCCS_QUEST_SENS_DC: - if(ckt->CKTsenInfo){ - value->rValue = *(ckt->CKTsenInfo->SEN_Sap[select->iValue + 1]+ - here->CCCSsenParmNo); - } - return(OK); - case CCCS_QUEST_SENS_REAL: - if(ckt->CKTsenInfo){ - value->rValue = *(ckt->CKTsenInfo->SEN_RHS[select->iValue + 1]+ - here->CCCSsenParmNo); - } - return(OK); - case CCCS_QUEST_SENS_IMAG: - if(ckt->CKTsenInfo){ - value->rValue = *(ckt->CKTsenInfo->SEN_iRHS[select->iValue + 1]+ - here->CCCSsenParmNo); - } - return(OK); - case CCCS_QUEST_SENS_MAG: - if(ckt->CKTsenInfo){ - vr = *(ckt->CKTrhsOld + select->iValue + 1); - vi = *(ckt->CKTirhsOld + select->iValue + 1); - vm = sqrt(vr*vr + vi*vi); - if(vm == 0){ - value->rValue = 0; - return(OK); - } - sr = *(ckt->CKTsenInfo->SEN_RHS[select->iValue + 1]+ - here->CCCSsenParmNo); - si = *(ckt->CKTsenInfo->SEN_iRHS[select->iValue + 1]+ - here->CCCSsenParmNo); - value->rValue = (vr * sr + vi * si)/vm; - } - return(OK); - case CCCS_QUEST_SENS_PH: - if(ckt->CKTsenInfo){ - vr = *(ckt->CKTrhsOld + select->iValue + 1); - vi = *(ckt->CKTirhsOld + select->iValue + 1); - vm = vr*vr + vi*vi; - if(vm == 0){ - value->rValue = 0; - return(OK); - } - sr = *(ckt->CKTsenInfo->SEN_RHS[select->iValue + 1]+ - here->CCCSsenParmNo); - si = *(ckt->CKTsenInfo->SEN_iRHS[select->iValue + 1]+ - here->CCCSsenParmNo); - value->rValue = (vr * si - vi * sr)/vm; - } - return(OK); - case CCCS_QUEST_SENS_CPLX: - if(ckt->CKTsenInfo){ - value->cValue.real= - *(ckt->CKTsenInfo->SEN_RHS[select->iValue + 1]+ - here->CCCSsenParmNo); - value->cValue.imag= - *(ckt->CKTsenInfo->SEN_iRHS[select->iValue + 1]+ - here->CCCSsenParmNo); - } - return(OK); - default: - return (E_BADPARM); - } - /* NOTREACHED */ -} diff --git a/src/spicelib/devices/cccs/cccsdefs.h b/src/spicelib/devices/cccs/cccsdefs.h deleted file mode 100644 index d6c161495..000000000 --- a/src/spicelib/devices/cccs/cccsdefs.h +++ /dev/null @@ -1,92 +0,0 @@ -/********** -Copyright 1990 Regents of the University of California. All rights reserved. -Author: 1985 Thomas L. Quarles -**********/ - -#ifndef CCCS -#define CCCS - -#include "ngspice/ifsim.h" -#include "ngspice/gendefs.h" -#include "ngspice/complex.h" -#include "ngspice/cktdefs.h" - - /* structures used to describe Current Controlled Current Sources */ - -/* information needed for each instance */ - -typedef struct sCCCSinstance { - - struct GENinstance gen; - -#define CCCSmodPtr(inst) ((struct sCCCSmodel *)((inst)->gen.GENmodPtr)) -#define CCCSnextInstance(inst) ((struct sCCCSinstance *)((inst)->gen.GENnextInstance)) -#define CCCSname gen.GENname -#define CCCSstate gen.GENstate - - const int CCCSposNode; /* number of positive node of source */ - const int CCCSnegNode; /* number of negative node of source */ - int CCCScontBranch; /* number of branch eq of controlling source */ - - char *CCCScontName; /* pointer to name of controlling instance */ - - double CCCScoeff; /* coefficient */ - - double CCCSmValue; /* Parallel multiplier */ - - double *CCCSposContBrPtr; /* pointer to sparse matrix element at - *(positive node, control branch eq)*/ - double *CCCSnegContBrPtr; /* pointer to sparse matrix element at - *(negative node, control branch eq)*/ - unsigned CCCScoeffGiven :1 ; /* flag to indicate coeff given */ - unsigned CCCSmGiven :1 ; /* flag to indicate multiplier given */ - - int CCCSsenParmNo; /* parameter # for sensitivity use; - set equal to 0 if not a design parameter*/ - -} CCCSinstance ; - -/* per model data */ - -typedef struct sCCCSmodel { /* model structure for a source */ - - struct GENmodel gen; - -#define CCCSmodType gen.GENmodType -#define CCCSnextModel(inst) ((struct sCCCSmodel *)((inst)->gen.GENnextModel)) -#define CCCSinstances(inst) ((CCCSinstance *)((inst)->gen.GENinstances)) -#define CCCSmodName gen.GENmodName - -} CCCSmodel; - -/* device parameters */ -enum { - CCCS_GAIN = 1, - CCCS_CONTROL, - CCCS_POS_NODE, - CCCS_NEG_NODE, - CCCS_CONT_BR, - CCCS_GAIN_SENS, - CCCS_CURRENT, - CCCS_POWER, - CCCS_VOLTS, - CCCS_M, -}; - -/* model parameters */ - -/* device questions */ -enum { - CCCS_QUEST_SENS_REAL = 201, - CCCS_QUEST_SENS_IMAG, - CCCS_QUEST_SENS_MAG, - CCCS_QUEST_SENS_PH, - CCCS_QUEST_SENS_CPLX, - CCCS_QUEST_SENS_DC, -}; - -/* model questions */ - -#include "cccsext.h" - -#endif /*CCCS*/ diff --git a/src/spicelib/devices/cccs/cccsext.h b/src/spicelib/devices/cccs/cccsext.h deleted file mode 100644 index 030d24238..000000000 --- a/src/spicelib/devices/cccs/cccsext.h +++ /dev/null @@ -1,16 +0,0 @@ -/********** -Copyright 1990 Regents of the University of California. All rights reserved. -Author: 1985 Thomas L. Quarles -**********/ - - -extern int CCCSask(CKTcircuit*,GENinstance*,int,IFvalue*,IFvalue*); -extern int CCCSload(GENmodel*,CKTcircuit*); -extern int CCCSparam(int,IFvalue*,GENinstance*,IFvalue*); -extern int CCCSpzLoad(GENmodel*,CKTcircuit*,SPcomplex*); -extern int CCCSsAcLoad(GENmodel*,CKTcircuit*); -extern int CCCSsLoad(GENmodel*,CKTcircuit*); -extern void CCCSsPrint(GENmodel*,CKTcircuit*); -extern int CCCSsSetup(SENstruct*,GENmodel*); -extern int CCCSsetup(SMPmatrix*,GENmodel*,CKTcircuit*,int*); - diff --git a/src/spicelib/devices/cccs/cccsinit.c b/src/spicelib/devices/cccs/cccsinit.c deleted file mode 100644 index a8993aebc..000000000 --- a/src/spicelib/devices/cccs/cccsinit.c +++ /dev/null @@ -1,76 +0,0 @@ -#include "ngspice/config.h" - -#include "ngspice/devdefs.h" - -#include "cccsitf.h" -#include "cccsext.h" -#include "cccsinit.h" - - -SPICEdev CCCSinfo = { - .DEVpublic = { - .name = "CCCS", - .description = "Current controlled current source", - .terms = &CCCSnSize, - .numNames = &CCCSnSize, - .termNames = CCCSnames, - .numInstanceParms = &CCCSpTSize, - .instanceParms = CCCSpTable, - .numModelParms = NULL, - .modelParms = NULL, - .flags = DEV_DEFAULT, - -#ifdef XSPICE - .cm_func = NULL, - .num_conn = 0, - .conn = NULL, - .num_param = 0, - .param = NULL, - .num_inst_var = 0, - .inst_var = NULL, -#endif - }, - - .DEVparam = CCCSparam, - .DEVmodParam = NULL, - .DEVload = CCCSload, - .DEVsetup = CCCSsetup, - .DEVunsetup = NULL, - .DEVpzSetup = CCCSsetup, - .DEVtemperature = NULL, - .DEVtrunc = NULL, - .DEVfindBranch = NULL, - .DEVacLoad = CCCSload, - .DEVaccept = NULL, - .DEVdestroy = NULL, - .DEVmodDelete = NULL, - .DEVdelete = NULL, - .DEVsetic = NULL, - .DEVask = CCCSask, - .DEVmodAsk = NULL, - .DEVpzLoad = CCCSpzLoad, - .DEVconvTest = NULL, - .DEVsenSetup = CCCSsSetup, - .DEVsenLoad = CCCSsLoad, - .DEVsenUpdate = NULL, - .DEVsenAcLoad = CCCSsAcLoad, - .DEVsenPrint = CCCSsPrint, - .DEVsenTrunc = NULL, - .DEVdisto = NULL, - .DEVnoise = NULL, - .DEVsoaCheck = NULL, - .DEVinstSize = &CCCSiSize, - .DEVmodSize = &CCCSmSize, - -#ifdef CIDER - .DEVdump = NULL, - .DEVacct = NULL, -#endif -}; - - -SPICEdev * -get_cccs_info(void) -{ - return &CCCSinfo; -} diff --git a/src/spicelib/devices/cccs/cccsinit.h b/src/spicelib/devices/cccs/cccsinit.h deleted file mode 100644 index 4d7dd002c..000000000 --- a/src/spicelib/devices/cccs/cccsinit.h +++ /dev/null @@ -1,11 +0,0 @@ -#ifndef _CCCSINIT_H -#define _CCCSINIT_H - -extern IFparm CCCSpTable[ ]; -extern char *CCCSnames[ ]; -extern int CCCSpTSize; -extern int CCCSnSize; -extern int CCCSiSize; -extern int CCCSmSize; - -#endif diff --git a/src/spicelib/devices/cccs/cccsitf.h b/src/spicelib/devices/cccs/cccsitf.h deleted file mode 100644 index ce4f23661..000000000 --- a/src/spicelib/devices/cccs/cccsitf.h +++ /dev/null @@ -1,9 +0,0 @@ -/********** -Copyright 1990 Regents of the University of California. All rights reserved. -**********/ -#ifndef DEV_CCCS -#define DEV_CCCS - -SPICEdev *get_cccs_info(void); - -#endif diff --git a/src/spicelib/devices/cccs/cccsload.c b/src/spicelib/devices/cccs/cccsload.c deleted file mode 100644 index 8e29cd866..000000000 --- a/src/spicelib/devices/cccs/cccsload.c +++ /dev/null @@ -1,40 +0,0 @@ -/********** -Copyright 1990 Regents of the University of California. All rights reserved. -Author: 1985 Thomas L. Quarles -**********/ -/* - */ - -#include "ngspice/ngspice.h" -#include "ngspice/cktdefs.h" -#include "cccsdefs.h" -#include "ngspice/sperror.h" -#include "ngspice/suffix.h" - - -/*ARGSUSED*/ -int -CCCSload(GENmodel *inModel, CKTcircuit *ckt) - - /* actually load the current voltage value into the - * sparse matrix previously provided - */ -{ - CCCSmodel *model = (CCCSmodel*)inModel; - CCCSinstance *here; - - NG_IGNORE(ckt); - - /* loop through all the voltage source models */ - for( ; model != NULL; model = CCCSnextModel(model)) { - - /* loop through all the instances of the model */ - for (here = CCCSinstances(model); here != NULL ; - here=CCCSnextInstance(here)) { - - *(here->CCCSposContBrPtr) += here->CCCScoeff ; - *(here->CCCSnegContBrPtr) -= here->CCCScoeff ; - } - } - return(OK); -} diff --git a/src/spicelib/devices/cccs/cccspar.c b/src/spicelib/devices/cccs/cccspar.c deleted file mode 100644 index 4f10557ca..000000000 --- a/src/spicelib/devices/cccs/cccspar.c +++ /dev/null @@ -1,44 +0,0 @@ -/********** -Copyright 1990 Regents of the University of California. All rights reserved. -Author: 1985 Thomas L. Quarles -**********/ -/* - */ - -#include "ngspice/ngspice.h" -#include "ngspice/ifsim.h" -#include "cccsdefs.h" -#include "ngspice/sperror.h" -#include "ngspice/suffix.h" - - -/* ARGSUSED */ -int -CCCSparam(int param, IFvalue *value, GENinstance *inst, IFvalue *select) -{ - CCCSinstance *here = (CCCSinstance*)inst; - - NG_IGNORE(select); - - switch(param) { - case CCCS_GAIN: - here->CCCScoeff = value->rValue; - if (here->CCCSmGiven) - here->CCCScoeff *= here->CCCSmValue; - here->CCCScoeffGiven = TRUE; - break; - case CCCS_CONTROL: - here->CCCScontName = value->uValue; - break; - case CCCS_M: - here->CCCSmValue = value->rValue; - here->CCCSmGiven = TRUE; - break; - case CCCS_GAIN_SENS: - here->CCCSsenParmNo = value->iValue; - break; - default: - return(E_BADPARM); - } - return(OK); -} diff --git a/src/spicelib/devices/cccs/cccspzld.c b/src/spicelib/devices/cccs/cccspzld.c deleted file mode 100644 index 42a5977d7..000000000 --- a/src/spicelib/devices/cccs/cccspzld.c +++ /dev/null @@ -1,42 +0,0 @@ -/********** -Copyright 1990 Regents of the University of California. All rights reserved. -Author: 1985 Thomas L. Quarles -**********/ -/* - */ - -#include "ngspice/ngspice.h" -#include "ngspice/cktdefs.h" -#include "ngspice/complex.h" -#include "ngspice/sperror.h" -#include "cccsdefs.h" -#include "ngspice/suffix.h" - - -/*ARGSUSED*/ -int -CCCSpzLoad(GENmodel *inModel, CKTcircuit *ckt, SPcomplex *s) - - /* actually load the current voltage value into the - * sparse matrix previously provided - */ -{ - CCCSmodel *model = (CCCSmodel*)inModel; - CCCSinstance *here; - - NG_IGNORE(ckt); - NG_IGNORE(s); - - /* loop through all the voltage source models */ - for( ; model != NULL; model = CCCSnextModel(model)) { - - /* loop through all the instances of the model */ - for (here = CCCSinstances(model); here != NULL ; - here=CCCSnextInstance(here)) { - - *(here->CCCSposContBrPtr) += here->CCCScoeff ; - *(here->CCCSnegContBrPtr) -= here->CCCScoeff ; - } - } - return(OK); -} diff --git a/src/spicelib/devices/cccs/cccssacl.c b/src/spicelib/devices/cccs/cccssacl.c deleted file mode 100644 index 1b6d7c4bf..000000000 --- a/src/spicelib/devices/cccs/cccssacl.c +++ /dev/null @@ -1,51 +0,0 @@ -/********** -Copyright 1990 Regents of the University of California. All rights reserved. -Author: 1985 Thomas L. Quarles -**********/ -/* - */ - -/* actually load the current ac sensitivity information - * into the array previously provided - */ - -#include "ngspice/ngspice.h" -#include "ngspice/smpdefs.h" -#include "ngspice/cktdefs.h" -#include "cccsdefs.h" -#include "ngspice/sperror.h" -#include "ngspice/suffix.h" - - -int -CCCSsAcLoad(GENmodel *inModel, CKTcircuit *ckt) -{ - CCCSmodel *model = (CCCSmodel*)inModel; - CCCSinstance *here; - double ic; - double i_ic; - - /* loop through all the CCCS models */ - for( ; model != NULL; model = CCCSnextModel(model)) { - - /* loop through all the instances of the model */ - for (here = CCCSinstances(model); here != NULL ; - here=CCCSnextInstance(here)) { - - if(here->CCCSsenParmNo){ - - ic = *(ckt->CKTrhsOld + here->CCCScontBranch); - i_ic = *(ckt->CKTirhsOld + here->CCCScontBranch); - *(ckt->CKTsenInfo->SEN_RHS[here->CCCSposNode] + - here->CCCSsenParmNo) -= ic; - *(ckt->CKTsenInfo->SEN_iRHS[here->CCCSposNode] + - here->CCCSsenParmNo) -= i_ic; - *(ckt->CKTsenInfo->SEN_RHS[here->CCCSnegNode] + - here->CCCSsenParmNo) += ic; - *(ckt->CKTsenInfo->SEN_iRHS[here->CCCSnegNode] + - here->CCCSsenParmNo) += i_ic; - } - } - } - return(OK); -} diff --git a/src/spicelib/devices/cccs/cccsset.c b/src/spicelib/devices/cccs/cccsset.c deleted file mode 100644 index 0c1e7fa92..000000000 --- a/src/spicelib/devices/cccs/cccsset.c +++ /dev/null @@ -1,54 +0,0 @@ -/********** -Copyright 1990 Regents of the University of California. All rights reserved. -Author: 1985 Thomas L. Quarles -**********/ -/* - */ - - /* load the voltage source structure with those pointers needed later - * for fast matrix loading - */ - -#include "ngspice/ngspice.h" -#include "ngspice/smpdefs.h" -#include "ngspice/cktdefs.h" -#include "cccsdefs.h" -#include "ngspice/sperror.h" -#include "ngspice/suffix.h" - - -/*ARGSUSED*/ -int -CCCSsetup(SMPmatrix *matrix, GENmodel *inModel, CKTcircuit *ckt, int *states) -{ - CCCSmodel *model = (CCCSmodel*)inModel; - CCCSinstance *here; - - NG_IGNORE(states); - - /* loop through all the voltage source models */ - for( ; model != NULL; model = CCCSnextModel(model)) { - - /* loop through all the instances of the model */ - for (here = CCCSinstances(model); here != NULL ; - here=CCCSnextInstance(here)) { - - here->CCCScontBranch = CKTfndBranch(ckt,here->CCCScontName); - if(here->CCCScontBranch == 0) { - SPfrontEnd->IFerrorf (ERR_FATAL, - "%s: unknown controlling source %s", here->CCCSname, here->CCCScontName); - return(E_BADPARM); - } - -/* macro to make elements with built in test for out of memory */ -#define TSTALLOC(ptr,first,second) \ -do { if((here->ptr = SMPmakeElt(matrix, here->first, here->second)) == NULL){\ - return(E_NOMEM);\ -} } while(0) - - TSTALLOC(CCCSposContBrPtr,CCCSposNode,CCCScontBranch); - TSTALLOC(CCCSnegContBrPtr,CCCSnegNode,CCCScontBranch); - } - } - return(OK); -} diff --git a/src/spicelib/devices/cccs/cccssld.c b/src/spicelib/devices/cccs/cccssld.c deleted file mode 100644 index e0268db64..000000000 --- a/src/spicelib/devices/cccs/cccssld.c +++ /dev/null @@ -1,45 +0,0 @@ -/********** -Copyright 1990 Regents of the University of California. All rights reserved. -Author: 1985 Thomas L. Quarles -**********/ -/* - */ - -/* actually load the current sensitivity information - * into the array previously provided - */ - -#include "ngspice/ngspice.h" -#include "ngspice/smpdefs.h" -#include "ngspice/cktdefs.h" -#include "cccsdefs.h" -#include "ngspice/sperror.h" -#include "ngspice/suffix.h" - - -int -CCCSsLoad(GENmodel *inModel, CKTcircuit *ckt) -{ - CCCSmodel *model = (CCCSmodel*)inModel; - CCCSinstance *here; - double ic ; - - /* loop through all the CCCS models */ - for( ; model != NULL; model = CCCSnextModel(model)) { - - /* loop through all the instances of the model */ - for (here = CCCSinstances(model); here != NULL ; - here=CCCSnextInstance(here)) { - if(here->CCCSsenParmNo){ - - ic = *(ckt->CKTrhsOld + here->CCCScontBranch); - *(ckt->CKTsenInfo->SEN_RHS[here->CCCSposNode] + - here->CCCSsenParmNo) -= ic; - *(ckt->CKTsenInfo->SEN_RHS[here->CCCSnegNode] + - here->CCCSsenParmNo) += ic; - } - } - } - return(OK); -} - diff --git a/src/spicelib/devices/cccs/cccssprt.c b/src/spicelib/devices/cccs/cccssprt.c deleted file mode 100644 index 7f194bd71..000000000 --- a/src/spicelib/devices/cccs/cccssprt.c +++ /dev/null @@ -1,49 +0,0 @@ -/********** -Copyright 1990 Regents of the University of California. All rights reserved. -Author: 1985 Thomas L. Quarles -**********/ -/* - */ - -/* Pretty print the sensitivity info for all - * the CCCS in the circuit. - */ - -#include "ngspice/ngspice.h" -#include "ngspice/smpdefs.h" -#include "ngspice/cktdefs.h" -#include "cccsdefs.h" -#include "ngspice/sperror.h" -#include "ngspice/suffix.h" - - -void -CCCSsPrint(GENmodel *inModel, CKTcircuit *ckt) -{ - CCCSmodel *model = (CCCSmodel*)inModel; - CCCSinstance *here; - - printf("CURRENT CONTROLLED CURRENT SOURCES-----------------\n"); - /* loop through all the voltage source models */ - for( ; model != NULL; model = CCCSnextModel(model)) { - - printf("Model name:%s\n",model->CCCSmodName); - - /* loop through all the instances of the model */ - for (here = CCCSinstances(model); here != NULL ; - here=CCCSnextInstance(here)) { - - printf(" Instance name:%s\n",here->CCCSname); - printf(" Positive, negative nodes: %s, %s\n", - CKTnodName(ckt,here->CCCSposNode), - CKTnodName(ckt,here->CCCSnegNode)); - printf(" Controlling source name: %s\n", - here->CCCScontName); - printf(" Controlling Branch equation number: %s\n", - CKTnodName(ckt,here->CCCScontBranch)); - printf(" Coefficient: %f\n",here->CCCScoeff); - printf(" CCCSsenParmNo:%d\n",here->CCCSsenParmNo); - - } - } -} diff --git a/src/spicelib/devices/cccs/cccssset.c b/src/spicelib/devices/cccs/cccssset.c deleted file mode 100644 index e031c4d1b..000000000 --- a/src/spicelib/devices/cccs/cccssset.c +++ /dev/null @@ -1,40 +0,0 @@ -/********** -Copyright 1990 Regents of the University of California. All rights reserved. -Author: 1985 Thomas L. Quarles -**********/ -/* - */ - -/* loop through all the devices and - * allocate parameter #s to design parameters - */ - -#include "ngspice/ngspice.h" -#include "ngspice/smpdefs.h" -#include "ngspice/cktdefs.h" -#include "cccsdefs.h" -#include "ngspice/sperror.h" -#include "ngspice/suffix.h" - - -int -CCCSsSetup(SENstruct *info, GENmodel *inModel) -{ - CCCSmodel *model = (CCCSmodel*)inModel; - CCCSinstance *here; - - /* loop through all the CCCS models */ - for( ; model != NULL; model = CCCSnextModel(model)) { - - /* loop through all the instances of the model */ - for (here = CCCSinstances(model); here != NULL ; - here=CCCSnextInstance(here)) { - - if(here->CCCSsenParmNo){ - here->CCCSsenParmNo = ++(info->SENparms); - } - - } - } - return(OK); -} diff --git a/src/spicelib/devices/ccvs/Makefile.am b/src/spicelib/devices/ccvs/Makefile.am deleted file mode 100644 index d4919bc1b..000000000 --- a/src/spicelib/devices/ccvs/Makefile.am +++ /dev/null @@ -1,28 +0,0 @@ -## Process this file with automake to produce Makefile.in - -noinst_LTLIBRARIES = libccvs.la - -libccvs_la_SOURCES = \ - ccvs.c \ - ccvsask.c \ - ccvsdefs.h \ - ccvsext.h \ - ccvsfbr.c \ - ccvsinit.c \ - ccvsinit.h \ - ccvsitf.h \ - ccvsload.c \ - ccvspar.c \ - ccvspzld.c \ - ccvssacl.c \ - ccvsset.c \ - ccvssld.c \ - ccvssprt.c \ - ccvssset.c - - - -AM_CPPFLAGS = @AM_CPPFLAGS@ -I$(top_srcdir)/src/include -AM_CFLAGS = $(STATIC) - -MAINTAINERCLEANFILES = Makefile.in diff --git a/src/spicelib/devices/ccvs/ccvs.c b/src/spicelib/devices/ccvs/ccvs.c deleted file mode 100644 index 382a9170a..000000000 --- a/src/spicelib/devices/ccvs/ccvs.c +++ /dev/null @@ -1,40 +0,0 @@ -/********** -Copyright 1990 Regents of the University of California. All rights reserved. -Author: 1987 Thomas L. Quarles -**********/ - -#include "ngspice/ngspice.h" -#include "ngspice/ifsim.h" -#include "ngspice/devdefs.h" -#include "ccvsdefs.h" -#include "ngspice/suffix.h" - -/* current controlled voltage source */ -IFparm CCVSpTable[] = { /* parameters */ - IOPU("gain", CCVS_TRANS, IF_REAL ,"Transresistance (gain)"), - IOPU("control", CCVS_CONTROL, IF_INSTANCE,"Controlling voltage source"), - IP("sens_trans",CCVS_TRANS_SENS,IF_FLAG, - "flag to request sens. WRT transimpedance"), - OPU("pos_node", CCVS_POS_NODE,IF_INTEGER, "Positive node of source"), - OPU("neg_node", CCVS_NEG_NODE,IF_INTEGER, "Negative node of source"), - OP("i", CCVS_CURRENT, IF_REAL, "CCVS output current"), - OP("v", CCVS_VOLTS, IF_REAL, "CCVS output voltage"), - OP("p", CCVS_POWER, IF_REAL, "CCVS power"), - OPU("sens_dc", CCVS_QUEST_SENS_DC, IF_REAL,"dc sensitivity "), - OPU("sens_real", CCVS_QUEST_SENS_REAL,IF_REAL,"real part of ac sensitivity"), - OPU("sens_imag", CCVS_QUEST_SENS_IMAG,IF_REAL,"imag part of ac sensitivity"), - OPU("sens_mag", CCVS_QUEST_SENS_MAG, IF_REAL,"sensitivity of ac magnitude"), - OPU("sens_ph", CCVS_QUEST_SENS_PH, IF_REAL, "sensitivity of ac phase"), - OPU("sens_cplx", CCVS_QUEST_SENS_CPLX,IF_COMPLEX,"ac sensitivity") -}; - -char *CCVSnames[] = { - "H+", - "H-" -}; - -int CCVSnSize = NUMELEMS(CCVSnames); -int CCVSpTSize = NUMELEMS(CCVSpTable); -int CCVSmPTSize = 0; -int CCVSiSize = sizeof(CCVSinstance); -int CCVSmSize = sizeof(CCVSmodel); diff --git a/src/spicelib/devices/ccvs/ccvsask.c b/src/spicelib/devices/ccvs/ccvsask.c deleted file mode 100644 index 64eda11ca..000000000 --- a/src/spicelib/devices/ccvs/ccvsask.c +++ /dev/null @@ -1,139 +0,0 @@ -/********** -Copyright 1990 Regents of the University of California. All rights reserved. -Author: 1987 Thomas L. Quarles -**********/ - -/* - * This routine gives access to the internal device parameters - * of Current Controlled Voltage Source - */ - -#include "ngspice/ngspice.h" -#include "ngspice/cktdefs.h" -#include "ngspice/devdefs.h" -#include "ngspice/ifsim.h" -#include "ccvsdefs.h" -#include "ngspice/sperror.h" -#include "ngspice/suffix.h" - -/* ARGSUSED */ -int -CCVSask(CKTcircuit *ckt, GENinstance *inst, int which, IFvalue *value, IFvalue *select) -{ - CCVSinstance *here = (CCVSinstance*)inst; - double vr; - double vi; - double sr; - double si; - double vm; - static char *msg = "Current and power not available for ac analysis"; - switch(which) { - case CCVS_TRANS: - value->rValue = here->CCVScoeff; - return (OK); - case CCVS_CONTROL: - value->uValue = here->CCVScontName; - return (OK); - case CCVS_POS_NODE: - value->iValue = here->CCVSposNode; - return (OK); - case CCVS_NEG_NODE: - value->iValue = here->CCVSnegNode; - return (OK); - case CCVS_BR: - value->iValue = here->CCVSbranch; - return (OK); - case CCVS_CONT_BR: - value->iValue = here->CCVScontBranch; - return (OK); - case CCVS_CURRENT : - if (ckt->CKTcurrentAnalysis & DOING_AC) { - errMsg = TMALLOC(char, strlen(msg) + 1); - errRtn = "CCVSask"; - strcpy(errMsg,msg); - return(E_ASKCURRENT); - } else { - value->rValue = *(ckt->CKTrhsOld+here->CCVSbranch); - } - return(OK); - case CCVS_VOLTS : - value->rValue = (*(ckt->CKTrhsOld + here->CCVSposNode) - - *(ckt->CKTrhsOld + here->CCVSnegNode)); - return(OK); - case CCVS_POWER : - if (ckt->CKTcurrentAnalysis & DOING_AC) { - errMsg = TMALLOC(char, strlen(msg) + 1); - errRtn = "CCVSask"; - strcpy(errMsg,msg); - return(E_ASKPOWER); - } else { - value->rValue = *(ckt->CKTrhsOld + here->CCVSbranch) - * (*(ckt->CKTrhsOld + here->CCVSposNode) - - *(ckt->CKTrhsOld + here->CCVSnegNode)); - } - return(OK); - case CCVS_QUEST_SENS_DC: - if(ckt->CKTsenInfo){ - value->rValue = *(ckt->CKTsenInfo->SEN_Sap[select->iValue + 1]+ - here->CCVSsenParmNo); - } - return(OK); - case CCVS_QUEST_SENS_REAL: - if(ckt->CKTsenInfo){ - value->rValue = *(ckt->CKTsenInfo->SEN_RHS[select->iValue + 1]+ - here->CCVSsenParmNo); - } - return(OK); - case CCVS_QUEST_SENS_IMAG: - if(ckt->CKTsenInfo){ - value->rValue = *(ckt->CKTsenInfo->SEN_iRHS[select->iValue + 1]+ - here->CCVSsenParmNo); - } - return(OK); - case CCVS_QUEST_SENS_MAG: - if(ckt->CKTsenInfo){ - vr = *(ckt->CKTrhsOld + select->iValue + 1); - vi = *(ckt->CKTirhsOld + select->iValue + 1); - vm = sqrt(vr*vr + vi*vi); - if(vm == 0){ - value->rValue = 0; - return(OK); - } - sr = *(ckt->CKTsenInfo->SEN_RHS[select->iValue + 1]+ - here->CCVSsenParmNo); - si = *(ckt->CKTsenInfo->SEN_iRHS[select->iValue + 1]+ - here->CCVSsenParmNo); - value->rValue = (vr * sr + vi * si)/vm; - } - return(OK); - case CCVS_QUEST_SENS_PH: - if(ckt->CKTsenInfo){ - vr = *(ckt->CKTrhsOld + select->iValue + 1); - vi = *(ckt->CKTirhsOld + select->iValue + 1); - vm = vr*vr + vi*vi; - if(vm == 0){ - value->rValue = 0; - return(OK); - } - sr = *(ckt->CKTsenInfo->SEN_RHS[select->iValue + 1]+ - here->CCVSsenParmNo); - si = *(ckt->CKTsenInfo->SEN_iRHS[select->iValue + 1]+ - here->CCVSsenParmNo); - value->rValue = (vr * si - vi * sr)/vm; - } - return(OK); - case CCVS_QUEST_SENS_CPLX: - if(ckt->CKTsenInfo){ - value->cValue.real= - *(ckt->CKTsenInfo->SEN_RHS[select->iValue + 1]+ - here->CCVSsenParmNo); - value->cValue.imag= - *(ckt->CKTsenInfo->SEN_iRHS[select->iValue + 1]+ - here->CCVSsenParmNo); - } - return(OK); - default: - return (E_BADPARM); - } - /* NOTREACHED */ -} diff --git a/src/spicelib/devices/ccvs/ccvsdefs.h b/src/spicelib/devices/ccvs/ccvsdefs.h deleted file mode 100644 index 64276d340..000000000 --- a/src/spicelib/devices/ccvs/ccvsdefs.h +++ /dev/null @@ -1,96 +0,0 @@ -/********** -Copyright 1990 Regents of the University of California. All rights reserved. -Author: 1985 Thomas L. Quarles -**********/ - -#ifndef CCVS -#define CCVS - -#include "ngspice/ifsim.h" -#include "ngspice/cktdefs.h" -#include "ngspice/gendefs.h" -#include "ngspice/complex.h" - - /* structures used to describe current controlled voltage sources */ - -/* information used to describe a single instance */ - -typedef struct sCCVSinstance { - - struct GENinstance gen; - -#define CCVSmodPtr(inst) ((struct sCCVSmodel *)((inst)->gen.GENmodPtr)) -#define CCVSnextInstance(inst) ((struct sCCVSinstance *)((inst)->gen.GENnextInstance)) -#define CCVSname gen.GENname -#define CCVSstate gen.GENstate - - const int CCVSposNode; /* number of positive node of source */ - const int CCVSnegNode; /* number of negative node of source */ - - IFuid CCVScontName; /* pointer to name of controlling instance */ - int CCVSbranch; /* equation number of branch equation added for v source */ - int CCVScontBranch; /* number of branch eq of controlling source */ - - double CCVScoeff; /* coefficient */ - - double *CCVSposIbrPtr; /* pointer to sparse matrix element at - * (positive node, branch equation) */ - double *CCVSnegIbrPtr; /* pointer to sparse matrix element at - * (negative node, branch equation) */ - double *CCVSibrPosPtr; /* pointer to sparse matrix element at - * (branch equation, positive node) */ - double *CCVSibrNegPtr; /* pointer to sparse matrix element at - * (branch equation, negative node) */ - double *CCVSibrContBrPtr; /* pointer to sparse matrix element at - *(branch equation, control branch eq)*/ - unsigned CCVScoeffGiven :1 ; /* flag to indicate coeff given */ - - int CCVSsenParmNo; /* parameter # for sensitivity use; - set equal to 0 if not a design parameter*/ - -} CCVSinstance ; - -/* per model data */ - -typedef struct sCCVSmodel { /* model structure for a CCVsource */ - - struct GENmodel gen; - -#define CCVSmodType gen.GENmodType -#define CCVSnextModel(inst) ((struct sCCVSmodel *)((inst)->gen.GENnextModel)) -#define CCVSinstances(inst) ((CCVSinstance *)((inst)->gen.GENinstances)) -#define CCVSmodName gen.GENmodName - -} CCVSmodel; - -/* device parameters */ -enum { - CCVS_TRANS = 1, - CCVS_CONTROL, - CCVS_POS_NODE, - CCVS_NEG_NODE, - CCVS_BR, - CCVS_CONT_BR, - CCVS_TRANS_SENS, - CCVS_CURRENT, - CCVS_POWER, - CCVS_VOLTS, -}; - -/* model parameters */ - -/* device questions */ -enum { - CCVS_QUEST_SENS_REAL = 201, - CCVS_QUEST_SENS_IMAG, - CCVS_QUEST_SENS_MAG, - CCVS_QUEST_SENS_PH, - CCVS_QUEST_SENS_CPLX, - CCVS_QUEST_SENS_DC, -}; - -/* model questions */ - -#include "ccvsext.h" - -#endif /*CCVS*/ diff --git a/src/spicelib/devices/ccvs/ccvsext.h b/src/spicelib/devices/ccvs/ccvsext.h deleted file mode 100644 index 998ebb273..000000000 --- a/src/spicelib/devices/ccvs/ccvsext.h +++ /dev/null @@ -1,16 +0,0 @@ -/********** -Copyright 1990 Regents of the University of California. All rights reserved. -Author: 1985 Thomas L. Quarles -**********/ - -extern int CCVSask(CKTcircuit*,GENinstance*,int,IFvalue*,IFvalue*); -extern int CCVSfindBr(CKTcircuit*,GENmodel*,IFuid); -extern int CCVSload(GENmodel*,CKTcircuit*); -extern int CCVSparam(int,IFvalue*,GENinstance*,IFvalue*); -extern int CCVSpzLoad(GENmodel*,CKTcircuit*,SPcomplex*); -extern int CCVSsAcLoad(GENmodel*,CKTcircuit*); -extern int CCVSsLoad(GENmodel*,CKTcircuit*); -extern void CCVSsPrint(GENmodel*,CKTcircuit*); -extern int CCVSsSetup(SENstruct*,GENmodel*); -extern int CCVSsetup(SMPmatrix*,GENmodel*,CKTcircuit*,int*); -extern int CCVSunsetup(GENmodel*,CKTcircuit*); diff --git a/src/spicelib/devices/ccvs/ccvsfbr.c b/src/spicelib/devices/ccvs/ccvsfbr.c deleted file mode 100644 index e7d211a35..000000000 --- a/src/spicelib/devices/ccvs/ccvsfbr.c +++ /dev/null @@ -1,37 +0,0 @@ -/********** -Copyright 1990 Regents of the University of California. All rights reserved. -Author: 1985 Thomas L. Quarles -**********/ -/* - */ - -#include "ngspice/ngspice.h" -#include "ngspice/cktdefs.h" -#include "ccvsdefs.h" -#include "ngspice/sperror.h" -#include "ngspice/suffix.h" - - -int -CCVSfindBr(CKTcircuit *ckt, GENmodel *inModel, IFuid name) -{ - CCVSmodel *model = (CCVSmodel*)inModel; - CCVSinstance *here; - int error; - CKTnode *tmp; - - for( ; model != NULL; model = CCVSnextModel(model)) { - for (here = CCVSinstances(model); here != NULL; - here = CCVSnextInstance(here)) { - if(here->CCVSname == name) { - if(here->CCVSbranch == 0) { - error = CKTmkCur(ckt,&tmp, here->CCVSname,"branch"); - if(error) return(error); - here->CCVSbranch = tmp->number; - } - return(here->CCVSbranch); - } - } - } - return(0); -} diff --git a/src/spicelib/devices/ccvs/ccvsinit.c b/src/spicelib/devices/ccvs/ccvsinit.c deleted file mode 100644 index ba0710d48..000000000 --- a/src/spicelib/devices/ccvs/ccvsinit.c +++ /dev/null @@ -1,76 +0,0 @@ -#include "ngspice/config.h" - -#include "ngspice/devdefs.h" - -#include "ccvsitf.h" -#include "ccvsext.h" -#include "ccvsinit.h" - - -SPICEdev CCVSinfo = { - .DEVpublic = { - .name = "CCVS", - .description = "Linear current controlled current source", - .terms = &CCVSnSize, - .numNames = &CCVSnSize, - .termNames = CCVSnames, - .numInstanceParms = &CCVSpTSize, - .instanceParms = CCVSpTable, - .numModelParms = NULL, - .modelParms = NULL, - .flags = DEV_DEFAULT, - -#ifdef XSPICE - .cm_func = NULL, - .num_conn = 0, - .conn = NULL, - .num_param = 0, - .param = NULL, - .num_inst_var = 0, - .inst_var = NULL, -#endif - }, - - .DEVparam = CCVSparam, - .DEVmodParam = NULL, - .DEVload = CCVSload, - .DEVsetup = CCVSsetup, - .DEVunsetup = CCVSunsetup, - .DEVpzSetup = CCVSsetup, - .DEVtemperature = NULL, - .DEVtrunc = NULL, - .DEVfindBranch = CCVSfindBr, - .DEVacLoad = CCVSload, - .DEVaccept = NULL, - .DEVdestroy = NULL, - .DEVmodDelete = NULL, - .DEVdelete = NULL, - .DEVsetic = NULL, - .DEVask = CCVSask, - .DEVmodAsk = NULL, - .DEVpzLoad = CCVSpzLoad, - .DEVconvTest = NULL, - .DEVsenSetup = CCVSsSetup, - .DEVsenLoad = CCVSsLoad, - .DEVsenUpdate = NULL, - .DEVsenAcLoad = CCVSsAcLoad, - .DEVsenPrint = CCVSsPrint, - .DEVsenTrunc = NULL, - .DEVdisto = NULL, - .DEVnoise = NULL, - .DEVsoaCheck = NULL, - .DEVinstSize = &CCVSiSize, - .DEVmodSize = &CCVSmSize, - -#ifdef CIDER - .DEVdump = NULL, - .DEVacct = NULL, -#endif -}; - - -SPICEdev * -get_ccvs_info(void) -{ - return &CCVSinfo; -} diff --git a/src/spicelib/devices/ccvs/ccvsinit.h b/src/spicelib/devices/ccvs/ccvsinit.h deleted file mode 100644 index 59a0299ad..000000000 --- a/src/spicelib/devices/ccvs/ccvsinit.h +++ /dev/null @@ -1,11 +0,0 @@ -#ifndef _CCVSINIT_H -#define _CCVSINIT_H - -extern IFparm CCVSpTable[ ]; -extern char *CCVSnames[ ]; -extern int CCVSpTSize; -extern int CCVSnSize; -extern int CCVSiSize; -extern int CCVSmSize; - -#endif diff --git a/src/spicelib/devices/ccvs/ccvsitf.h b/src/spicelib/devices/ccvs/ccvsitf.h deleted file mode 100644 index e9b77d387..000000000 --- a/src/spicelib/devices/ccvs/ccvsitf.h +++ /dev/null @@ -1,9 +0,0 @@ -/********** -Copyright 1990 Regents of the University of California. All rights reserved. -**********/ -#ifndef DEV_CCVS -#define DEV_CCVS - -SPICEdev *get_ccvs_info(void); - -#endif diff --git a/src/spicelib/devices/ccvs/ccvsload.c b/src/spicelib/devices/ccvs/ccvsload.c deleted file mode 100644 index 22fa4665e..000000000 --- a/src/spicelib/devices/ccvs/ccvsload.c +++ /dev/null @@ -1,43 +0,0 @@ -/********** -Copyright 1990 Regents of the University of California. All rights reserved. -Author: 1985 Thomas L. Quarles -**********/ -/* - */ - -#include "ngspice/ngspice.h" -#include "ngspice/cktdefs.h" -#include "ccvsdefs.h" -#include "ngspice/sperror.h" -#include "ngspice/suffix.h" - - -/*ARGSUSED*/ -int -CCVSload(GENmodel *inModel, CKTcircuit *ckt) - - /* actually load the current voltage value into the - * sparse matrix previously provided - */ -{ - CCVSmodel *model = (CCVSmodel*)inModel; - CCVSinstance *here; - - NG_IGNORE(ckt); - - /* loop through all the voltage source models */ - for( ; model != NULL; model = CCVSnextModel(model)) { - - /* loop through all the instances of the model */ - for (here = CCVSinstances(model); here != NULL ; - here=CCVSnextInstance(here)) { - - *(here->CCVSposIbrPtr) += 1.0 ; - *(here->CCVSnegIbrPtr) -= 1.0 ; - *(here->CCVSibrPosPtr) += 1.0 ; - *(here->CCVSibrNegPtr) -= 1.0 ; - *(here->CCVSibrContBrPtr) -= here->CCVScoeff ; - } - } - return(OK); -} diff --git a/src/spicelib/devices/ccvs/ccvspar.c b/src/spicelib/devices/ccvs/ccvspar.c deleted file mode 100644 index 1228fe072..000000000 --- a/src/spicelib/devices/ccvs/ccvspar.c +++ /dev/null @@ -1,38 +0,0 @@ -/********** -Copyright 1990 Regents of the University of California. All rights reserved. -Author: 1985 Thomas L. Quarles -**********/ -/* - */ - -#include "ngspice/ngspice.h" -#include "ngspice/ifsim.h" -#include "ccvsdefs.h" -#include "ngspice/sperror.h" -#include "ngspice/suffix.h" - - -/* ARGSUSED */ -int -CCVSparam(int param, IFvalue *value, GENinstance *inst, IFvalue *select) -{ - CCVSinstance *here = (CCVSinstance*)inst; - - NG_IGNORE(select); - - switch(param) { - case CCVS_TRANS: - here->CCVScoeff = value->rValue; - here->CCVScoeffGiven = TRUE; - break; - case CCVS_CONTROL: - here->CCVScontName = value->uValue; - break; - case CCVS_TRANS_SENS: - here->CCVSsenParmNo = value->iValue; - break; - default: - return(E_BADPARM); - } - return(OK); -} diff --git a/src/spicelib/devices/ccvs/ccvspzld.c b/src/spicelib/devices/ccvs/ccvspzld.c deleted file mode 100644 index 6d50df09f..000000000 --- a/src/spicelib/devices/ccvs/ccvspzld.c +++ /dev/null @@ -1,45 +0,0 @@ -/********** -Copyright 1990 Regents of the University of California. All rights reserved. -Author: 1985 Thomas L. Quarles -**********/ -/* - */ - -#include "ngspice/ngspice.h" -#include "ngspice/cktdefs.h" -#include "ngspice/complex.h" -#include "ngspice/sperror.h" -#include "ccvsdefs.h" -#include "ngspice/suffix.h" - - -/*ARGSUSED*/ -int -CCVSpzLoad(GENmodel *inModel, CKTcircuit *ckt, SPcomplex *s) - - /* actually load the current voltage value into the - * sparse matrix previously provided - */ -{ - CCVSmodel *model = (CCVSmodel*)inModel; - CCVSinstance *here; - - NG_IGNORE(ckt); - NG_IGNORE(s); - - /* loop through all the voltage source models */ - for( ; model != NULL; model = CCVSnextModel(model)) { - - /* loop through all the instances of the model */ - for (here = CCVSinstances(model); here != NULL ; - here=CCVSnextInstance(here)) { - - *(here->CCVSposIbrPtr) += 1.0 ; - *(here->CCVSnegIbrPtr) -= 1.0 ; - *(here->CCVSibrPosPtr) += 1.0 ; - *(here->CCVSibrNegPtr) -= 1.0 ; - *(here->CCVSibrContBrPtr) += here->CCVScoeff ; - } - } - return(OK); -} diff --git a/src/spicelib/devices/ccvs/ccvssacl.c b/src/spicelib/devices/ccvs/ccvssacl.c deleted file mode 100644 index 3f444b513..000000000 --- a/src/spicelib/devices/ccvs/ccvssacl.c +++ /dev/null @@ -1,45 +0,0 @@ -/********** -Copyright 1990 Regents of the University of California. All rights reserved. -Author: 1985 Thomas L. Quarles -**********/ -/* - */ - -/* actually load the current ac sensitivity information - * into the array previously provided - */ - -#include "ngspice/ngspice.h" -#include "ngspice/cktdefs.h" -#include "ccvsdefs.h" -#include "ngspice/sperror.h" -#include "ngspice/suffix.h" - - -int -CCVSsAcLoad(GENmodel *inModel, CKTcircuit *ckt) -{ - CCVSmodel *model = (CCVSmodel*)inModel; - CCVSinstance *here; - double ic,i_ic; - - /* loop through all the voltage source models */ - for( ; model != NULL; model = CCVSnextModel(model)) { - - /* loop through all the instances of the model */ - for (here = CCVSinstances(model); here != NULL ; - here=CCVSnextInstance(here)) { - - if(here->CCVSsenParmNo){ - ic = *(ckt->CKTrhsOld + here->CCVScontBranch); - i_ic = *(ckt->CKTirhsOld + here->CCVScontBranch); - - *(ckt->CKTsenInfo->SEN_RHS[here->CCVSbranch] + - here->CCVSsenParmNo) -= ic; - *(ckt->CKTsenInfo->SEN_iRHS[here->CCVSbranch] + - here->CCVSsenParmNo) -= i_ic; - } - } - } - return(OK); -} diff --git a/src/spicelib/devices/ccvs/ccvsset.c b/src/spicelib/devices/ccvs/ccvsset.c deleted file mode 100644 index d3b68dc29..000000000 --- a/src/spicelib/devices/ccvs/ccvsset.c +++ /dev/null @@ -1,87 +0,0 @@ -/********** -Copyright 1990 Regents of the University of California. All rights reserved. -Author: 1985 Thomas L. Quarles -**********/ - -/* load the voltage source structure with those pointers needed later - * for fast matrix loading - */ - -#include "ngspice/ngspice.h" -#include "ngspice/cktdefs.h" -#include "ccvsdefs.h" -#include "ngspice/sperror.h" -#include "ngspice/suffix.h" - -/*ARGSUSED*/ -int -CCVSsetup(SMPmatrix *matrix, GENmodel *inModel, CKTcircuit *ckt, int *states) -{ - CCVSmodel *model = (CCVSmodel*)inModel; - CCVSinstance *here; - int error; - CKTnode *tmp; - - NG_IGNORE(states); - - /* loop through all the voltage source models */ - for( ; model != NULL; model = CCVSnextModel(model)) { - - /* loop through all the instances of the model */ - for (here = CCVSinstances(model); here != NULL ; - here=CCVSnextInstance(here)) { - - if(here->CCVSposNode == here->CCVSnegNode) { - SPfrontEnd->IFerrorf (ERR_FATAL, - "instance %s is a shorted CCVS", here->CCVSname); - return(E_UNSUPP); - } - - if(here->CCVSbranch==0) { - error = CKTmkCur(ckt,&tmp,here->CCVSname, "branch"); - if(error) return(error); - here->CCVSbranch = tmp->number; - } - here->CCVScontBranch = CKTfndBranch(ckt,here->CCVScontName); - if(here->CCVScontBranch == 0) { - SPfrontEnd->IFerrorf (ERR_FATAL, - "%s: unknown controlling source %s", here->CCVSname, here->CCVScontName); - return(E_BADPARM); - } - -/* macro to make elements with built in test for out of memory */ -#define TSTALLOC(ptr,first,second) \ -do { if((here->ptr = SMPmakeElt(matrix, here->first, here->second)) == NULL){\ - return(E_NOMEM);\ -} } while(0) - - TSTALLOC(CCVSposIbrPtr, CCVSposNode, CCVSbranch); - TSTALLOC(CCVSnegIbrPtr, CCVSnegNode, CCVSbranch); - TSTALLOC(CCVSibrNegPtr, CCVSbranch, CCVSnegNode); - TSTALLOC(CCVSibrPosPtr, CCVSbranch, CCVSposNode); - TSTALLOC(CCVSibrContBrPtr, CCVSbranch, CCVScontBranch); - } - } - return(OK); -} - -int -CCVSunsetup(GENmodel *inModel, CKTcircuit *ckt) -{ - CCVSmodel *model; - CCVSinstance *here; - - for (model = (CCVSmodel *)inModel; model != NULL; - model = CCVSnextModel(model)) - { - for (here = CCVSinstances(model); here != NULL; - here=CCVSnextInstance(here)) - { - if (here->CCVSbranch) { - CKTdltNNum(ckt, here->CCVSbranch); - here->CCVSbranch = 0; - } - } - } - return OK; -} diff --git a/src/spicelib/devices/ccvs/ccvssld.c b/src/spicelib/devices/ccvs/ccvssld.c deleted file mode 100644 index 5cc086cb7..000000000 --- a/src/spicelib/devices/ccvs/ccvssld.c +++ /dev/null @@ -1,41 +0,0 @@ -/********** -Copyright 1990 Regents of the University of California. All rights reserved. -Author: 1985 Thomas L. Quarles -**********/ -/* - */ - -/* actually load the current sensitivity information - * into the array previously provided - */ - -#include "ngspice/ngspice.h" -#include "ngspice/cktdefs.h" -#include "ccvsdefs.h" -#include "ngspice/sperror.h" -#include "ngspice/suffix.h" - - -int -CCVSsLoad(GENmodel *inModel, CKTcircuit *ckt) -{ - CCVSmodel *model = (CCVSmodel*)inModel; - CCVSinstance *here; - double ic; - - /* loop through all the voltage source models */ - for( ; model != NULL; model = CCVSnextModel(model)) { - - /* loop through all the instances of the model */ - for (here = CCVSinstances(model); here != NULL ; - here=CCVSnextInstance(here)) { - - if(here->CCVSsenParmNo){ - ic = *(ckt->CKTrhsOld + here->CCVScontBranch); - *(ckt->CKTsenInfo->SEN_RHS[here->CCVSbranch] + - here->CCVSsenParmNo) -= ic; - } - } - } - return(OK); -} diff --git a/src/spicelib/devices/ccvs/ccvssprt.c b/src/spicelib/devices/ccvs/ccvssprt.c deleted file mode 100644 index c9d915e37..000000000 --- a/src/spicelib/devices/ccvs/ccvssprt.c +++ /dev/null @@ -1,49 +0,0 @@ -/********** -Copyright 1990 Regents of the University of California. All rights reserved. -Author: 1985 Thomas L. Quarles -**********/ -/* - */ - -/* Pretty print the sensitivity info for all - * the CCVS in the circuit. - */ - -#include "ngspice/ngspice.h" -#include "ngspice/cktdefs.h" -#include "ccvsdefs.h" -#include "ngspice/sperror.h" -#include "ngspice/suffix.h" - - -void -CCVSsPrint(GENmodel *inModel, CKTcircuit *ckt) -{ - CCVSmodel *model = (CCVSmodel*)inModel; - CCVSinstance *here; - - printf("CURRENT CONTROLLED VOLTAGE SOURCES-----------------\n"); - /* loop through all the voltage source models */ - for( ; model != NULL; model = CCVSnextModel(model)) { - - printf("Model name:%s\n",model->CCVSmodName); - - /* loop through all the instances of the model */ - for (here = CCVSinstances(model); here != NULL ; - here=CCVSnextInstance(here)) { - - printf(" Instance name:%s\n",here->CCVSname); - printf(" Positive, negative nodes: %s, %s\n", - CKTnodName(ckt,here->CCVSposNode), - CKTnodName(ckt,here->CCVSnegNode)); - printf(" Controlling source name: %s\n", - here->CCVScontName); - printf(" Branch equation number: %s\n", - CKTnodName(ckt,here->CCVSbranch)); - printf(" Controlling Branch equation number: %s\n", - CKTnodName(ckt,here->CCVScontBranch)); - printf(" Coefficient: %f\n",here->CCVScoeff); - printf(" CCVSsenParmNo:%d\n",here->CCVSsenParmNo); - } - } -} diff --git a/src/spicelib/devices/ccvs/ccvssset.c b/src/spicelib/devices/ccvs/ccvssset.c deleted file mode 100644 index 62c33bce0..000000000 --- a/src/spicelib/devices/ccvs/ccvssset.c +++ /dev/null @@ -1,38 +0,0 @@ -/********** -Copyright 1990 Regents of the University of California. All rights reserved. -Author: 1985 Thomas L. Quarles -**********/ -/* - */ - -/* loop through all the devices and - * allocate parameter #s to design parameters - */ - -#include "ngspice/ngspice.h" -#include "ngspice/cktdefs.h" -#include "ccvsdefs.h" -#include "ngspice/sperror.h" -#include "ngspice/suffix.h" - - -int -CCVSsSetup(SENstruct *info, GENmodel *inModel) -{ - CCVSmodel *model = (CCVSmodel*)inModel; - CCVSinstance *here; - - /* loop through all the voltage source models */ - for( ; model != NULL; model = CCVSnextModel(model)) { - - /* loop through all the instances of the model */ - for (here = CCVSinstances(model); here != NULL ; - here=CCVSnextInstance(here)) { - - if(here->CCVSsenParmNo){ - here->CCVSsenParmNo = ++(info->SENparms); - } - } - } - return(OK); -} diff --git a/src/spicelib/devices/cpl/Makefile.am b/src/spicelib/devices/cpl/Makefile.am deleted file mode 100644 index efb1e3376..000000000 --- a/src/spicelib/devices/cpl/Makefile.am +++ /dev/null @@ -1,26 +0,0 @@ -## Process this file with automake to produce Makefile.in - -noinst_LTLIBRARIES = libcpl.la - -libcpl_la_SOURCES = \ - cpl.c \ - cplask.c \ - cpldefs.h \ - cplext.h \ - cplinit.h \ - cplitf.h \ - cplmask.c \ - cplparam.c \ - cplload.c \ - cplmpar.c \ - cplsetup.c \ - cplhash.c \ - cplhash.h \ - cplmdel.c \ - cpldelete.c \ - cplinit.c - -AM_CPPFLAGS = @AM_CPPFLAGS@ -I$(top_srcdir)/src/include -AM_CFLAGS = $(STATIC) - -MAINTAINERCLEANFILES = Makefile.in diff --git a/src/spicelib/devices/cpl/cpl.c b/src/spicelib/devices/cpl/cpl.c deleted file mode 100644 index 73216203e..000000000 --- a/src/spicelib/devices/cpl/cpl.c +++ /dev/null @@ -1,42 +0,0 @@ -/********** -Copyright 1992 Regents of the University of California. All rights -reserved. -Author: 1992 Charles Hough -**********/ - -#include "ngspice/ngspice.h" -#include "cpldefs.h" -#include "ngspice/devdefs.h" -#include "ngspice/ifsim.h" -#include "ngspice/suffix.h" - -IFparm CPLpTable[] = { - IOPU("pos_nodes", CPL_POS_NODE, IF_VECTOR|IF_STRING, "in nodes"), - IOPU("neg_nodes", CPL_NEG_NODE, IF_VECTOR|IF_STRING, "out nodes"), - IOP("dimension", CPL_DIM, IF_INTEGER, "number of coupled lines"), - IOP("length", CPL_LENGTH, IF_REAL, "length of lines"), -}; - -IFparm CPLmPTable[] = { /* model parameters */ - IOP( "r", CPL_R, IF_REALVEC,"resistance per length"), - IOP( "l", CPL_L, IF_REALVEC,"inductance per length"), - IOP( "c", CPL_C, IF_REALVEC,"capacitance per length"), - IOP( "g", CPL_G, IF_REALVEC,"conductance per length"), - IOP( "length", CPL_length, IF_REAL,"length"), - /* txl devices can be transformed to cpl devices in inpdomod.c - * Then we need to be able to swallow the 'txl' flag on a 'cpl' .model line - */ - IP( "cpl", CPL_MOD_R, IF_FLAG,"Device is a cpl model"), - IPR( "txl", CPL_MOD_R, IF_FLAG,"Device is a cpl model"), -}; - -char *CPLnames[] = { - "P+", - "P-" -}; - -int CPLnSize = NUMELEMS(CPLnames); -int CPLiSize = sizeof(CPLinstance); -int CPLmSize = sizeof(CPLmodel); -int CPLmPTSize = NUMELEMS(CPLmPTable); -int CPLpTSize = NUMELEMS(CPLpTable); diff --git a/src/spicelib/devices/cpl/cplask.c b/src/spicelib/devices/cpl/cplask.c deleted file mode 100644 index 4606e0313..000000000 --- a/src/spicelib/devices/cpl/cplask.c +++ /dev/null @@ -1,44 +0,0 @@ -/********** -Copyright 1992 Regents of the University of California. All rights -reserved. -Author: 2004 Paolo Nenzi -**********/ - - -#include "ngspice/ngspice.h" -#include "ngspice/const.h" -#include "ngspice/ifsim.h" -#include "ngspice/cktdefs.h" -#include "ngspice/devdefs.h" -#include "cpldefs.h" -#include "ngspice/sperror.h" -#include "ngspice/suffix.h" - - -int -CPLask(CKTcircuit *ckt, GENinstance *inst, int which, IFvalue *value, IFvalue *select) -{ - CPLinstance *here = (CPLinstance *)inst; - - NG_IGNORE(ckt); - NG_IGNORE(select); - - switch(which) { - case CPL_POS_NODE: - value->v.vec.sVec = here->in_node_names; - value->v.numValue = here->dimension; - return(OK); - case CPL_NEG_NODE: - value->v.vec.sVec = here->out_node_names; - value->v.numValue = here->dimension; - return(OK); - case CPL_DIM: - value->iValue = here->dimension; - return(OK); - case CPL_LENGTH: - value->rValue = here->CPLlength; - return(OK); - default: - return(E_BADPARM); - } -} diff --git a/src/spicelib/devices/cpl/cpldefs.h b/src/spicelib/devices/cpl/cpldefs.h deleted file mode 100644 index fb981a926..000000000 --- a/src/spicelib/devices/cpl/cpldefs.h +++ /dev/null @@ -1,113 +0,0 @@ -/********** -Copyright 1992 Regents of the University of California. All rights -reserved. -**********/ - -#ifndef CPL -#define CPL - -#include "ngspice/ifsim.h" -#include "ngspice/cktdefs.h" -#include "ngspice/gendefs.h" -#include "ngspice/complex.h" -#include "ngspice/noisedef.h" -#include "ngspice/swec.h" - -/* information used to describe a single instance */ - -typedef struct sCPLinstance { - - struct GENinstance gen; - -#define CPLmodPtr(inst) ((struct sCPLmodel *)((inst)->gen.GENmodPtr)) -#define CPLnextInstance(inst) ((struct sCPLinstance *)((inst)->gen.GENnextInstance)) -#define CPLname gen.GENname -#define CPLstate gen.GENstate - - int *CPLposNodes; - int *CPLnegNodes; - int dimension; - double CPLlength; - int *CPLibr1; - int *CPLibr2; - CPLine *cplines; /* pointer to SWEC cplines type */ - CPLine *cplines2; /* temporary pointer to SWEC cplines type */ - - char **in_node_names; - char **out_node_names; - - double **CPLibr1Ibr1Ptr; - double **CPLibr2Ibr2Ptr; - double **CPLposIbr1Ptr; - double **CPLnegIbr2Ptr; - /* trial */ - double **CPLposPosPtr; - double **CPLnegNegPtr; - double **CPLposNegPtr; - double **CPLnegPosPtr; - - double ***CPLibr1PosPtr; - double ***CPLibr2NegPtr; - double ***CPLibr1NegPtr; - double ***CPLibr2PosPtr; - double ***CPLibr1Ibr2Ptr; - double ***CPLibr2Ibr1Ptr; - - unsigned CPLibr1Given : 1; - unsigned CPLibr2Given : 1; - unsigned CPLdcGiven : 1; - unsigned CPLlengthGiven : 1; - -} CPLinstance ; - - -/* per model data */ - -typedef struct sCPLmodel { /* model structure for a cpl */ - - struct GENmodel gen; - -#define CPLmodType gen.GENmodType -#define CPLnextModel(inst) ((struct sCPLmodel *)((inst)->gen.GENnextModel)) -#define CPLinstances(inst) ((CPLinstance *)((inst)->gen.GENinstances)) -#define CPLmodName gen.GENmodName - - double *Rm; - int Rm_counter; - double *Gm; - int Gm_counter; - double *Lm; - int Lm_counter; - double *Cm; - int Cm_counter; - double length; - unsigned Rmgiven : 1; - unsigned Lmgiven : 1; - unsigned Gmgiven : 1; - unsigned Cmgiven : 1; - unsigned lengthgiven : 1; - -} CPLmodel; - -/* instance parameters */ -enum { - CPL_POS_NODE = 1, - CPL_NEG_NODE, - CPL_DIM, - CPL_LENGTH, -}; - -/* model parameters */ -enum { - CPL_R = 101, - CPL_C, - CPL_G, - CPL_L, - CPL_length, - CPL_MOD_R, -}; - -#include "cplext.h" -extern VI_list *pool_vi; - -#endif /*CPL*/ diff --git a/src/spicelib/devices/cpl/cpldelete.c b/src/spicelib/devices/cpl/cpldelete.c deleted file mode 100644 index 5bbe3bc86..000000000 --- a/src/spicelib/devices/cpl/cpldelete.c +++ /dev/null @@ -1,21 +0,0 @@ -/********** -Copyright 2021 The ngspice team All rights -reserved. -Author: 2021 Holger Vogt -3-clause BSD license -**********/ - -#include "ngspice/ngspice.h" -#include "cpldefs.h" -#include "ngspice/sperror.h" -#include "ngspice/suffix.h" -#include "cplhash.h" - -int -CPLDelete(GENinstance *gen_inst) -{ - NG_IGNORE(gen_inst); - - mem_delete(); - return OK; -} diff --git a/src/spicelib/devices/cpl/cplext.h b/src/spicelib/devices/cpl/cplext.h deleted file mode 100644 index 4c28a93a6..000000000 --- a/src/spicelib/devices/cpl/cplext.h +++ /dev/null @@ -1,15 +0,0 @@ -/********** -Copyright 1992 Regents of the University of California. All rights -reserved. -**********/ - -/* extern int CPLaccept(CKTcircuit*, GENmodel*); */ -extern int CPLask(CKTcircuit*, GENinstance*, int, IFvalue*, IFvalue*); -extern int CPLload(GENmodel*, CKTcircuit*); -extern int CPLmAsk(CKTcircuit*, GENmodel*, int, IFvalue*); -extern int CPLmParam(int,IFvalue*, GENmodel*); -extern int CPLparam(int,IFvalue*, GENinstance*, IFvalue*); -extern int CPLsetup(SMPmatrix*, GENmodel*, CKTcircuit*, int*); -extern int CPLunsetup(GENmodel*, CKTcircuit*); -extern int CPLmDelete(GENmodel*); -extern int CPLDelete(GENinstance*); diff --git a/src/spicelib/devices/cpl/cplhash.c b/src/spicelib/devices/cpl/cplhash.c deleted file mode 100644 index 2aaeb5a15..000000000 --- a/src/spicelib/devices/cpl/cplhash.c +++ /dev/null @@ -1,153 +0,0 @@ -/********** -Copyright 2021 The ngspice team All rights -reserved. -Author: 2021 Holger Vogt -3-clause BSD license -**********/ - -/* This is a test file including a local garbage collector and removal. -It might be especially useful, because cpl transmission lines have -several memory leaks during runtime in difficult to control process -sequence.. -At initialization in CPLsetup() mem_init() is called setting up a hash table -to store memory addresses. -Each time TMALLOC is called, the resulting address is stored. -Each time tfree() is called, the address is removed. -For realloc(), the old address is deleted, the new one is stored, -if there is a change in the address. -Upon exiting the program, mem_delete() is called, deleting all memory -at addresses still in the hash table, then the hash table itself is removed. -CPLunsetup() calls mem_delete(). */ - -#include "ngspice/ngspice.h" -#include "ngspice/iferrmsg.h" -#include "ngspice/hash.h" -#include "ngspice/fteext.h" -#include "cpldefs.h" - -// #define DB_FULL /* uncomment for debugging output, all addresses to files */ -#ifdef DB_FULL -#define DB -#else -#define DB /* uncomment for printing some debugging output */ -#endif - -void mem_init(void); -void mem_delete(void); - -int memsaved(void *ptr); -void memdeleted(const void *ptr); - -void my_free_func(void* data); -void my_key_free(void* key); - -int gc_is_on = 0; - -/* add some debugging printout */ -#ifdef DB -static int mem_in = 0, mem_out = 0, mem_freed = 0; -#endif -#ifdef DB_FULL -static FILE *alloclog, *freelog, *finallog; -#endif - -NGHASHPTR memory_table; - -/* initialize hash table to store allocated mem addresses */ -void mem_init(void) { - gc_is_on = 0; - memory_table = nghash_init_pointer(1024); - gc_is_on = 1; -#ifdef DB_FULL - alloclog = fopen("alloc_log.txt", "wt"); - freelog = fopen("free_log.txt", "wt"); - finallog = fopen("final_log.txt", "wt"); -#endif -} - -/* add to counter and hash table if memory is allocated */ -int memsaved(void *ptr) { - if (gc_is_on) { - gc_is_on = 0; - - if (nghash_insert(memory_table, ptr, NULL) == NULL) { -#ifdef DB - mem_in++; -#ifdef DB_FULL - fprintf(alloclog, "0x%p\n", ptr); -#endif -#endif - } else - fprintf(stderr, "Warning: CPL GC Could not insert item into hashtable at 0x%p\n", ptr); - gc_is_on = 1; - } - return OK; -} - -/* add to counter and remove from hash table if memory is deleted */ -void memdeleted(const void *ptr) { - if (gc_is_on) { - gc_is_on = 0; - if (nghash_delete_special(memory_table, (void*)ptr) == NULL) { -#ifdef DB - mem_out++; -#ifdef DB_FULL - fprintf(freelog, "0x%p\n", ptr); -#endif - } - else if (ft_ngdebug) - fprintf(stderr, "Warning: CPL GC Could not delete item from hashtable at 0x%p\n", ptr); -#else - } -#endif - gc_is_on = 1; - } -} - -/* helper functions */ -void my_free_func(void *data) -{ - if (data) - free(data); -} - -void my_key_free(void * key) -{ - if (key) { - free(key); - key = NULL; -#ifdef DB - mem_freed++; -#endif - } -} - -/* free hash table, all entries and then the table itself */ -void mem_delete(void) { -#ifdef DB - char buf[128]; - printf("CPL GC memory allocated %d times, freed %d times\n", mem_in, mem_out); - printf("CPL GC size of hash table to be freed: %d entries.\n", nghash_get_size(memory_table)); -#ifdef DB_FULL - void *data, *key; - data = nghash_enumeratek(memory_table, &key, TRUE); - for (void *hkey = key; hkey;) { - fprintf(finallog, "0x%p\n", hkey); - data = nghash_enumeratek(memory_table, &hkey, FALSE); - } - fclose(alloclog); - fclose(freelog); - fclose(finallog); -#endif -#endif - gc_is_on = 0; - nghash_free(memory_table, NULL, my_key_free); -#ifdef DB - /* printf via sh_printf will need some info from variables that have - been deleted already, therefore we use fputs */ - sprintf(buf, "CPL GC number of addresses freed: %d entries.\n", mem_freed); - fputs(buf, stdout); -#endif - pool_vi = NULL; - mem_freed = mem_in = mem_out = 0; -} diff --git a/src/spicelib/devices/cpl/cplhash.h b/src/spicelib/devices/cpl/cplhash.h deleted file mode 100644 index 1a6c28007..000000000 --- a/src/spicelib/devices/cpl/cplhash.h +++ /dev/null @@ -1,12 +0,0 @@ -/********** -Copyright 2021 The ngspice team All rights -reserved. -Author: 2021 Holger Vogt -3-clause BSD license -**********/ - -/* cplhash.c */ -extern void mem_init(void); -extern void mem_delete(void); -extern int memsaved(void *ptr); -extern void memdeleted(const void *ptr); diff --git a/src/spicelib/devices/cpl/cplinit.c b/src/spicelib/devices/cpl/cplinit.c deleted file mode 100644 index 4386a939b..000000000 --- a/src/spicelib/devices/cpl/cplinit.c +++ /dev/null @@ -1,76 +0,0 @@ -#include "ngspice/config.h" - -#include "ngspice/devdefs.h" - -#include "cplitf.h" -#include "cplext.h" -#include "cplinit.h" - - -SPICEdev CPLinfo = { - .DEVpublic = { - .name = "CplLines", - .description = "Simple Coupled Multiconductor Lines", - .terms = &CPLnSize, - .numNames = &CPLnSize, - .termNames = CPLnames, - .numInstanceParms = &CPLpTSize, - .instanceParms = CPLpTable, - .numModelParms = &CPLmPTSize, - .modelParms = CPLmPTable, - .flags = 0, - -#ifdef XSPICE - .cm_func = NULL, - .num_conn = 0, - .conn = NULL, - .num_param = 0, - .param = NULL, - .num_inst_var = 0, - .inst_var = NULL, -#endif - }, - - .DEVparam = CPLparam, - .DEVmodParam = CPLmParam, - .DEVload = CPLload, - .DEVsetup = CPLsetup, - .DEVunsetup = CPLunsetup, - .DEVpzSetup = NULL, - .DEVtemperature = NULL, - .DEVtrunc = NULL, - .DEVfindBranch = NULL, - .DEVacLoad = NULL, - .DEVaccept = NULL, - .DEVdestroy = NULL, - .DEVmodDelete = CPLmDelete, - .DEVdelete = CPLDelete, - .DEVsetic = NULL, - .DEVask = CPLask, - .DEVmodAsk = CPLmAsk, - .DEVpzLoad = NULL, - .DEVconvTest = NULL, - .DEVsenSetup = NULL, - .DEVsenLoad = NULL, - .DEVsenUpdate = NULL, - .DEVsenAcLoad = NULL, - .DEVsenPrint = NULL, - .DEVsenTrunc = NULL, - .DEVdisto = NULL, - .DEVnoise = NULL, - .DEVsoaCheck = NULL, - .DEVinstSize = &CPLiSize, - .DEVmodSize = &CPLmSize, - -#ifdef CIDER - .DEVdump = NULL, - .DEVacct = NULL, -#endif -}; - - -SPICEdev * -get_cpl_info(void) -{ - return &CPLinfo; -} diff --git a/src/spicelib/devices/cpl/cplinit.h b/src/spicelib/devices/cpl/cplinit.h deleted file mode 100644 index 17f4a5b24..000000000 --- a/src/spicelib/devices/cpl/cplinit.h +++ /dev/null @@ -1,13 +0,0 @@ -#ifndef _CPLINIT_H -#define _CPLINIT_H - -extern IFparm CPLpTable[ ]; -extern IFparm CPLmPTable[ ]; -extern int CPLmPTSize; -extern int CPLpTSize; -extern char *CPLnames[ ]; -extern int CPLiSize; -extern int CPLmSize; -extern int CPLnSize; - -#endif diff --git a/src/spicelib/devices/cpl/cplitf.h b/src/spicelib/devices/cpl/cplitf.h deleted file mode 100644 index 4a690f024..000000000 --- a/src/spicelib/devices/cpl/cplitf.h +++ /dev/null @@ -1,6 +0,0 @@ -#ifndef DEV_CPL -#define DEV_CPL - -SPICEdev *get_cpl_info(void); - -#endif diff --git a/src/spicelib/devices/cpl/cplload.c b/src/spicelib/devices/cpl/cplload.c deleted file mode 100644 index 6dbb3b434..000000000 --- a/src/spicelib/devices/cpl/cplload.c +++ /dev/null @@ -1,917 +0,0 @@ -/********** -Copyright 1992 Regents of the University of California. All rights -reserved. -Author: 1992 Charles Hough -**********/ - - -#include "ngspice/ngspice.h" -#include "cpldefs.h" -#include "ngspice/sperror.h" -#include "ngspice/suffix.h" -#include "cplhash.h" - -VI_list *pool_vi; -static double ratio[MAX_CP_TX_LINES]; -static VI_list *new_vi(void); -static void free_vi(VI_list*); -static int get_pvs_vi(int t1, int t2, - CPLine *cp, - double v1_i[MAX_CP_TX_LINES][MAX_CP_TX_LINES], - double v2_i[MAX_CP_TX_LINES][MAX_CP_TX_LINES], - double i1_i[MAX_CP_TX_LINES][MAX_CP_TX_LINES], - double i2_i[MAX_CP_TX_LINES][MAX_CP_TX_LINES], - double v1_o[MAX_CP_TX_LINES][MAX_CP_TX_LINES], - double v2_o[MAX_CP_TX_LINES][MAX_CP_TX_LINES], - double i1_o[MAX_CP_TX_LINES][MAX_CP_TX_LINES], - double i2_o[MAX_CP_TX_LINES][MAX_CP_TX_LINES]); -static int update_cnv(CPLine*, double); -static int add_new_vi(CPLinstance*, CKTcircuit*, int); -static int right_consts(CPLinstance*, CPLine*, int, int, double, double, int*, int*, CKTcircuit*); -static int update_delayed_cnv(CPLine*, double); -static int multC(double, double, double, double, double*, double*); -static int expC(double, double, double, double*, double*); -static int divC(double, double, double, double, double*, double*); -static void update_cnv_a(TMS*, double, double, double, double, double, double, double); -static void copy_cp(CPLine*, CPLine*); - -/*ARGSUSED*/ -int -CPLload(GENmodel *inModel, CKTcircuit *ckt) -{ - CPLmodel *model = (CPLmodel *)inModel; - CPLinstance *here; - CPLine *cp, *cp2; - int *k_p, *l_p; - int time, time2; - double h, h1, f; -/* int hint; never used */ - double hf; - NODE *nd; - double v, v1, g; - int i, j, k, l; - int cond1; - int noL, m, p, q; - CKTnode *node; - VI_list *vi, *vi_before; - int before, delta; - int resindex; - - double gmin; /* dc solution */ - - h = ckt->CKTdelta; - h1 = 0.5 * h; - time2 = (int) (ckt->CKTtime * 1e12); -/* hint = (int)(h * 1e12); never used */ - hf = h * 1e12; - time = (int) ((ckt->CKTtime - ckt->CKTdelta) * 1e12); - - cond1= ckt->CKTmode & MODEDC; - - gmin = 0.1 * ckt->CKTgmin; /* dc solution */ - - for( ; model != NULL; model = CPLnextModel(model)) { - for (here = CPLinstances(model); here != NULL ; - here=CPLnextInstance(here)) { - - cp = here->cplines; - - noL = cp->noL = here->dimension; - - for(m = 0 ; m < noL ; m++) /* dc solution */ - { - *here->CPLposPosPtr[m] += gmin; - *here->CPLnegNegPtr[m] += gmin; - *here->CPLnegPosPtr[m] += gmin; - *here->CPLposNegPtr[m] += gmin; - } - - if (cond1 || cp->vi_head == NULL) continue; - - if (cp->vi_tail->time > time) { - time = cp->vi_tail->time; -/* hint = time2 - time; never used */ - } - - before = cp->vi_tail->time; - vi_before = cp->vi_tail; - - if (time > cp->vi_tail->time) { - - copy_cp(cp, here->cplines2); - add_new_vi(here, ckt, time); - delta = time - before; - - for (m = 0; m < noL; m++) { - nd = cp->in_node[m]; - v = vi_before->v_i[m]; - v1 = nd->V = cp->vi_tail->v_i[m]; - nd->dv = (v1 - v) / delta; - } - for (m = 0; m < noL; m++) { - nd = cp->out_node[m]; - v = vi_before->v_o[m]; - v1 = nd->V = cp->vi_tail->v_o[m]; - nd->dv = (v1 - v) / delta; - } - - update_cnv(cp, delta); - if (cp->ext) update_delayed_cnv(cp, delta); - } - } - } - - model = (CPLmodel *)inModel; - /* loop through all the models */ - for( ; model != NULL; model = CPLnextModel(model)) { - - /* loop through all the instances of the model */ - for (here = CPLinstances(model); here != NULL ; - here=CPLnextInstance(here)) { - - double mintaul = 123456789.0; - - cp = here->cplines; - cp2 = here->cplines2; - - for (i = 0; i < cp->noL; i++) { - if (mintaul > cp->taul[i]) mintaul = cp->taul[i]; - } - if (mintaul < hf) { - - fprintf(stderr, "your time step was too large for CPL tau.\n"); -/* fprintf(stderr, "please decrease max time step in .tran card.\n"); - fprintf(stderr, ".tran tstep tstop tstart tmax.\n"); - fprintf(stderr, "make tmax smaller than %e and try again.\n", - mintaul * 1e-12); - return (1111); -*/ - fprintf(stderr, "tmax is now set to %e.\n", 0.9 * mintaul * 1e-12); - ckt->CKTmaxStep = 0.9 * mintaul * 1e-12; - - } - - noL = cp->noL = here->dimension; - if (cond1) { - resindex = 0; - for (m = 0; m < noL; m++) { - if (here->CPLlengthGiven) - g = model->Rm[resindex] * here->CPLlength; - else g = model->Rm[resindex] * CPLmodPtr(here)->length; - *(here->CPLposIbr1Ptr[m]) += 1.0; - *(here->CPLnegIbr2Ptr[m]) += 1.0; - *(here->CPLibr1Ibr1Ptr[m]) += 1.0; - *(here->CPLibr1Ibr2Ptr[m][m]) += 1.0; - *(here->CPLibr2PosPtr[m][m]) += 1.0; - *(here->CPLibr2NegPtr[m][m]) -= 1.0; - *(here->CPLibr2Ibr1Ptr[m][m]) -= g; - resindex = resindex + noL - m; - } - continue; - } - - /* dc setup */ - if (here->CPLdcGiven == 0 && !cond1) { - for (i = 0; i < cp->noL; i++) { - nd = cp->in_node[i]; - for(node = ckt->CKTnodes;node; node = node->next) { - if (strcmp(nd->name->id, node->name) == 0) { - cp->dc1[i] = ckt->CKTrhsOld[node->number]; - cp2->dc1[i] = nd->V = cp->dc1[i]; - break; - } - } - nd = cp->out_node[i]; - for(node = ckt->CKTnodes;node; node = node->next) { - if (strcmp(nd->name->id, node->name) == 0) { - cp->dc2[i] = ckt->CKTrhsOld[node->number]; - cp2->dc2[i] = nd->V = cp->dc2[i]; - break; - } - } - } - here->CPLdcGiven = 1; - - vi = new_vi(); - vi->time = 0; - { - for (i = 0; i < cp->noL; i++) { - for (j = 0; j < cp->noL; j++) { - TMS *tms; - double a, b; - - tms = cp->h1t[i][j]; - if (!tms) { - fprintf(stderr, "\nError in CPL %s: Forbidden combination of model parameters!\n", here->gen.GENname); - controlled_exit(1); - } - if (tms->ifImg) { - tms->tm[0].cnv_i = - cp->dc1[j] * - tms->tm[0].c / tms->tm[0].x; - tms->tm[0].cnv_o = - cp->dc2[j] * - tms->tm[0].c / tms->tm[0].x; - divC(tms->tm[1].c, tms->tm[2].c, - tms->tm[1].x, tms->tm[2].x, &a, &b); - tms->tm[1].cnv_i = - cp->dc1[j] * a; - tms->tm[1].cnv_o = - cp->dc2[j] * a; - tms->tm[2].cnv_i = - cp->dc1[j] * b; - tms->tm[2].cnv_o = - cp->dc2[j] * b; - } else - for (k = 0; k < 3; k++) { - tms->tm[k].cnv_i = - cp->dc1[j] * - tms->tm[k].c / tms->tm[k].x; - tms->tm[k].cnv_o = - cp->dc2[j] * - tms->tm[k].c / tms->tm[k].x; - } - - for (l = 0; l < cp->noL; l++) { - tms = cp->h2t[i][j][l]; - if (!tms) { - fprintf(stderr, "\nError in CPL %s: Forbidden combination of model parameters!\n", here->gen.GENname); - controlled_exit(1); - } - for (k = 0; k < 3; k++) { - tms->tm[k].cnv_i = 0.0; - tms->tm[k].cnv_o = 0.0; - } - } - for (l = 0; l < cp->noL; l++) { - tms = cp->h3t[i][j][l]; - if (!tms) { - fprintf(stderr, "\nError in CPL %s: Forbidden combination of model parameters!\n", here->gen.GENname); - controlled_exit(1); - } - if (tms->ifImg) { - tms->tm[0].cnv_i = - cp->dc1[j] * - tms->tm[0].c / tms->tm[0].x; - tms->tm[0].cnv_o = - cp->dc2[j] * - tms->tm[0].c / tms->tm[0].x; - divC(tms->tm[1].c, tms->tm[2].c, - tms->tm[1].x, tms->tm[2].x, &a, &b); - tms->tm[1].cnv_i = - cp->dc1[j] * a; - tms->tm[1].cnv_o = - cp->dc2[j] * a; - tms->tm[2].cnv_i = - cp->dc1[j] * b; - tms->tm[2].cnv_o = - cp->dc2[j] * b; - } else - for (k = 0; k < 3; k++) { - tms->tm[k].cnv_i = - cp->dc1[j] * - tms->tm[k].c / tms->tm[k].x; - tms->tm[k].cnv_o = - cp->dc2[j] * - tms->tm[k].c / tms->tm[k].x; - } - } - } - - for (j = 0; j < cp->noL; j++) { - vi->i_i[j] = vi->i_o[j] = 0.0; - vi->v_i[j] = cp->dc1[j]; - vi->v_o[j] = cp->dc2[j]; - } - } - - vi->next = NULL; - cp->vi_tail = vi; - cp->vi_head = vi; - cp2->vi_tail = vi; - cp2->vi_head = vi; - - } - } - - for (m = 0; m < noL; m++) { - *(here->CPLibr1Ibr1Ptr[m]) = -1.0; - *(here->CPLibr2Ibr2Ptr[m]) = -1.0; - } - - for (m = 0; m < noL; m++) { - *(here->CPLposIbr1Ptr[m]) = 1.0; - *(here->CPLnegIbr2Ptr[m]) = 1.0; - } - - for (m = 0; m < noL; m++) { - for (p = 0; p < noL; p++) { - *(here->CPLibr1PosPtr[m][p]) = - cp->h1t[m][p]->aten + h1 * cp->h1C[m][p]; - *(here->CPLibr2NegPtr[m][p]) = - cp->h1t[m][p]->aten + h1 * cp->h1C[m][p]; - } - } - - k_p = here->CPLibr1; - l_p = here->CPLibr2; - - copy_cp(cp2, cp); - - if (right_consts(here,cp2, time,time2,h,h1,k_p,l_p,ckt)) { - cp2->ext = 1; - for (q = 0; q < noL; q++) { - cp->ratio[q] = ratio[q]; - if (ratio[q] > 0.0) { - for (m = 0; m < noL; m++) { - for (p = 0; p < noL; p++) { - - - if (cp->h3t[m][p][q]) { - f = ratio[q] * (h1 * cp->h3C[m][p][q] + - cp->h3t[m][p][q]->aten); - *(here->CPLibr1NegPtr[m][p]) = -f; - *(here->CPLibr2PosPtr[m][p]) = -f; - } - if (cp->h2t[m][p][q]) { - f = ratio[q] * (h1 * cp->h2C[m][p][q] + - cp->h2t[m][p][q]->aten); - *(here->CPLibr1Ibr2Ptr[m][p]) = -f; - *(here->CPLibr2Ibr1Ptr[m][p]) = -f; - } - - } - } - } - } - } - else cp->ext = 0; - } - } - - return(OK); -} - -static void -copy_cp(CPLine *new, CPLine *old) -{ - int i, j, k, l, m; - VI_list *temp; - - new->noL = m = old->noL; - new->ext = old->ext; - for (i = 0; i < m; i++) { - new->ratio[i] = old->ratio[i]; - new->taul[i] = old->taul[i]; - - for (j = 0; j < m; j++) { - if (new->h1t[i][j] == NULL) { - TMS *nptr = new->h1t[i][j] = TMALLOC(TMS, 1); - memsaved(nptr); - } - new->h1t[i][j]->ifImg = old->h1t[i][j]->ifImg; - new->h1t[i][j]->aten = old->h1t[i][j]->aten; - new->h1C[i][j] = old->h1C[i][j]; - - for (k = 0; k < 3; k++) { - new->h1t[i][j]->tm[k].c = old->h1t[i][j]->tm[k].c; - new->h1t[i][j]->tm[k].x = old->h1t[i][j]->tm[k].x; - new->h1t[i][j]->tm[k].cnv_i = old->h1t[i][j]->tm[k].cnv_i; - new->h1t[i][j]->tm[k].cnv_o = old->h1t[i][j]->tm[k].cnv_o; - new->h1e[i][j][k] = old->h1e[i][j][k]; - } - for (l = 0; l < m; l++) { - if (new->h2t[i][j][l] == NULL) { - TMS *nptr = new->h2t[i][j][l] = TMALLOC(TMS, 1); - memsaved(nptr); - } - new->h2t[i][j][l]->ifImg = old->h2t[i][j][l]->ifImg; - new->h2t[i][j][l]->aten = old->h2t[i][j][l]->aten; - new->h2C[i][j][l] = old->h2C[i][j][l]; - new->h3C[i][j][l] = old->h3C[i][j][l]; - for (k = 0; k < 3; k++) { - new->h2t[i][j][l]->tm[k].c = old->h2t[i][j][l]->tm[k].c; - new->h2t[i][j][l]->tm[k].x = old->h2t[i][j][l]->tm[k].x; - new->h2t[i][j][l]->tm[k].cnv_i - = old->h2t[i][j][l]->tm[k].cnv_i; - new->h2t[i][j][l]->tm[k].cnv_o - = old->h2t[i][j][l]->tm[k].cnv_o; - } - - if (new->h3t[i][j][l] == NULL) { - TMS* nptr = new->h3t[i][j][l] = TMALLOC(TMS, 1); - memsaved(nptr); - } - new->h3t[i][j][l]->ifImg = old->h3t[i][j][l]->ifImg; - new->h3t[i][j][l]->aten = old->h3t[i][j][l]->aten; - for (k = 0; k < 3; k++) { - new->h3t[i][j][l]->tm[k].c = old->h3t[i][j][l]->tm[k].c; - new->h3t[i][j][l]->tm[k].x = old->h3t[i][j][l]->tm[k].x; - new->h3t[i][j][l]->tm[k].cnv_i - = old->h3t[i][j][l]->tm[k].cnv_i; - new->h3t[i][j][l]->tm[k].cnv_o - = old->h3t[i][j][l]->tm[k].cnv_o; - } - } - } - } - - - while (new->vi_head->time < old->vi_head->time) { - temp = new->vi_head; - new->vi_head = new->vi_head->next; - free_vi(temp); - } -} - - -static int -right_consts(CPLinstance *here, CPLine *cp, int t, int time, double h, double h1, - int *l1, int *l2, CKTcircuit *ckt) -{ - int i, j, k, l; - double e; - double ff[MAX_CP_TX_LINES], gg[MAX_CP_TX_LINES]; - double v1_i[MAX_CP_TX_LINES][MAX_CP_TX_LINES]; - double v2_i[MAX_CP_TX_LINES][MAX_CP_TX_LINES]; - double i1_i[MAX_CP_TX_LINES][MAX_CP_TX_LINES]; - double i2_i[MAX_CP_TX_LINES][MAX_CP_TX_LINES]; - double v1_o[MAX_CP_TX_LINES][MAX_CP_TX_LINES]; - double v2_o[MAX_CP_TX_LINES][MAX_CP_TX_LINES]; - double i1_o[MAX_CP_TX_LINES][MAX_CP_TX_LINES]; - double i2_o[MAX_CP_TX_LINES][MAX_CP_TX_LINES]; - int ext; - int noL; - - NG_IGNORE(here); - - noL = cp->noL; - - for (j = 0; j < noL; j++) { - double ff1; - - ff[j] = 0.0; - gg[j] = 0.0; - for (k = 0; k < noL; k++) - if (cp->h1t[j][k]) { - if (cp->h1t[j][k]->ifImg) { - double er, ei, a, b, a1, b1; - TMS *tms; - tms = cp->h1t[j][k]; - cp->h1e[j][k][0] = e = exp(tms->tm[0].x * h); - expC(tms->tm[1].x, tms->tm[2].x, h, &er, &ei); - cp->h1e[j][k][1] = er; - cp->h1e[j][k][2] = ei; - - ff1 = tms->tm[0].c * e * h1; - ff[j] -= tms->tm[0].cnv_i * e; - gg[j] -= tms->tm[0].cnv_o * e; - ff[j] -= ff1 * cp->in_node[k]->V; - gg[j] -= ff1 * cp->out_node[k]->V; - - multC(tms->tm[1].c, tms->tm[2].c, er, ei, &a1, &b1); - multC(tms->tm[1].cnv_i, tms->tm[2].cnv_i, er, ei, &a, &b); - ff[j] -= 2.0 * (a1 * h1 * cp->in_node[k]->V + a); - multC(tms->tm[1].cnv_o, tms->tm[2].cnv_o, er, ei, &a, &b); - gg[j] -= 2.0 * (a1 * h1 * cp->out_node[k]->V + a); - } else { - ff1 = 0.0; - for (i = 0; i < 3; i++) { - cp->h1e[j][k][i] = e = exp(cp->h1t[j][k]->tm[i].x * h); - ff1 -= cp->h1t[j][k]->tm[i].c * e; - ff[j] -= cp->h1t[j][k]->tm[i].cnv_i * e; - gg[j] -= cp->h1t[j][k]->tm[i].cnv_o * e; - } - ff[j] += ff1 * h1 * cp->in_node[k]->V; - gg[j] += ff1 * h1 * cp->out_node[k]->V; - } - } - } - - ext = get_pvs_vi(t, time, cp, v1_i, v2_i, i1_i, i2_i, - v1_o, v2_o, i1_o, i2_o); - - for (j = 0; j < noL; j++) { /** current eqn **/ - TERM *tm; - - for (k = 0; k < noL; k++) /** node voltage **/ - for (l = 0; l < noL; l++) /** different mode **/ - if (cp->h3t[j][k][l]) { - if (cp->h3t[j][k][l]->ifImg) { - double er, ei, a, b, a1, b1, a2, b2; - TMS *tms; - tms = cp->h3t[j][k][l]; - expC(tms->tm[1].x, tms->tm[2].x, h, &er, &ei); - a2 = h1 * tms->tm[1].c; - b2 = h1 * tms->tm[2].c; - a = tms->tm[1].cnv_i; - b = tms->tm[2].cnv_i; - multC(a, b, er, ei, &a, &b); - multC(a2, b2, v1_i[l][k] * er + v2_i[l][k], v1_i[l][k] * ei, &a1, &b1); - tms->tm[1].cnv_i = a + a1; - tms->tm[2].cnv_i = b + b1; - a = tms->tm[1].cnv_o; - b = tms->tm[2].cnv_o; - multC(a, b, er, ei, &a, &b); - multC(a2, b2, v1_o[l][k] * er + v2_o[l][k], v1_o[l][k] * ei, &a1, &b1); - tms->tm[1].cnv_o = a + a1; - tms->tm[2].cnv_o = b + b1; - tm = &(tms->tm[0]); - e = exp(tm->x * h); - tm->cnv_i = tm->cnv_i * e + h1 * tm->c * - (v1_i[l][k] * e + v2_i[l][k]); - tm->cnv_o = tm->cnv_o * e + h1 * tm->c * - (v1_o[l][k] * e + v2_o[l][k]); - ff[j] += tms->aten * v2_o[l][k] + tm->cnv_o + - 2.0 * tms->tm[1].cnv_o; - gg[j] += tms->aten * v2_i[l][k] + tm->cnv_i + - 2.0 * tms->tm[1].cnv_i; - } else { - for (i = 0; i < 3; i++) { /** 3 poles **/ - tm = &(cp->h3t[j][k][l]->tm[i]); - e = exp(tm->x * h); - tm->cnv_i = tm->cnv_i * e + h1 * tm->c * (v1_i[l][k] * e + v2_i[l][k]); - tm->cnv_o = tm->cnv_o * e + h1 * tm->c * (v1_o[l][k] * e + v2_o[l][k]); - ff[j] += tm->cnv_o; - gg[j] += tm->cnv_i; - } - - ff[j] += cp->h3t[j][k][l]->aten * v2_o[l][k]; - gg[j] += cp->h3t[j][k][l]->aten * v2_i[l][k]; - } - } - for (k = 0; k < noL; k++) /** line current **/ - for (l = 0; l < noL; l++) /** different mode **/ - if (cp->h2t[j][k][l]) { - if (cp->h2t[j][k][l]->ifImg) { - double er, ei, a, b, a1, b1, a2, b2; - TMS *tms; - tms = cp->h2t[j][k][l]; - expC(tms->tm[1].x, tms->tm[2].x, h, &er, &ei); - a2 = h1 * tms->tm[1].c; - b2 = h1 * tms->tm[2].c; - a = tms->tm[1].cnv_i; - b = tms->tm[2].cnv_i; - multC(a, b, er, ei, &a, &b); - multC(a2, b2, i1_i[l][k] * er + i2_i[l][k], i1_i[l][k] * ei, &a1, &b1); - tms->tm[1].cnv_i = a + a1; - tms->tm[2].cnv_i = b + b1; - a = tms->tm[1].cnv_o; - b = tms->tm[2].cnv_o; - multC(a, b, er, ei, &a, &b); - multC(a2, b2, i1_o[l][k] * er + i2_o[l][k], i1_o[l][k] * ei, &a1, &b1); - tms->tm[1].cnv_o = a + a1; - tms->tm[2].cnv_o = b + b1; - tm = &(tms->tm[0]); - e = exp(tm->x * h); - tm->cnv_i = tm->cnv_i * e + h1 * tm->c * - (i1_i[l][k] * e + i2_i[l][k]); - tm->cnv_o = tm->cnv_o * e + h1 * tm->c * - (i1_o[l][k] * e + i2_o[l][k]); - ff[j] += tms->aten * i2_o[l][k] + tm->cnv_o + - 2.0 * tms->tm[1].cnv_o; - gg[j] += tms->aten * i2_i[l][k] + tm->cnv_i + - 2.0 * tms->tm[1].cnv_i; - } else { - for (i = 0; i < 3; i++) { /** 3 poles **/ - tm = &(cp->h2t[j][k][l]->tm[i]); - e = exp(tm->x * h); - tm->cnv_i = tm->cnv_i * e + h1 * tm->c * (i1_i[l][k] * e + i2_i[l][k]); - tm->cnv_o = tm->cnv_o * e + h1 * tm->c * (i1_o[l][k] * e + i2_o[l][k]); - ff[j] += tm->cnv_o; - gg[j] += tm->cnv_i; - } - - ff[j] += cp->h2t[j][k][l]->aten * i2_o[l][k]; - gg[j] += cp->h2t[j][k][l]->aten * i2_i[l][k]; - } - } - } - - for (i = 0; i < noL; i++) { - *(ckt->CKTrhs + l1[i]) = ff[i]; - *(ckt->CKTrhs + l2[i]) = gg[i]; - } - - return(ext); -} - -static int -update_cnv(CPLine *cp, double h) -{ - int i, j, k; - int noL; - double ai, bi, ao, bo; - double e, t; - TMS *tms; - TERM *tm; - - noL = cp->noL; - for (j = 0; j < noL; j++) - for (k = 0; k < noL; k++) { - ai = cp->in_node[k]->V; - ao = cp->out_node[k]->V; - bi = cp->in_node[k]->dv; - bo = cp->out_node[k]->dv; - - if (cp->h1t[j][k]) { - if (cp->h1t[j][k]->ifImg) { - tms = cp->h1t[j][k]; - if (tms == NULL) - continue; - tm = &(tms->tm[0]); - e = cp->h1e[j][k][0]; - t = tm->c / tm->x; - update_cnv_a(tms, h, ai, ao, ai - bi * h, ao - bo * h, - cp->h1e[j][k][1], cp->h1e[j][k][2]); - bi *= t; - bo *= t; - tm->cnv_i = (tm->cnv_i - bi*h) * e + (e - 1.0)*(ai*t + - 1.0e+12*bi/tm->x); - tm->cnv_o = (tm->cnv_o - bo*h) * e + (e - 1.0)*(ao*t + - 1.0e+12*bo/tm->x); - } else - for (i = 0; i < 3; i++) { - tm = &(cp->h1t[j][k]->tm[i]); - - e = cp->h1e[j][k][i]; - - t = tm->c / tm->x; - bi *= t; - bo *= t; - - tm->cnv_i = (tm->cnv_i - bi*h) * e + (e - 1.0)*(ai*t + 1.0e+12*bi/tm->x); - tm->cnv_o = (tm->cnv_o - bo*h) * e + (e - 1.0)*(ao*t + 1.0e+12*bo/tm->x); - } - } - } - return 0; -} - -static VI_list -*new_vi(void) -{ - VI_list *q; - - if (pool_vi) { - q = pool_vi; - pool_vi = pool_vi->pool; - return(q); - } - else { - VI_list* nptr = TMALLOC(VI_list, 1); - memsaved(nptr); - return(nptr); - } -} - -static void -free_vi(VI_list *q) -{ - q->pool = pool_vi; - pool_vi = q; -} - - -static int -add_new_vi(CPLinstance *here, CKTcircuit *ckt, int time) -{ - VI_list *vi; - int i, noL; - CPLine *cp, *cp2; - - cp = here->cplines; - cp2 = here->cplines2; - - vi = new_vi(); - vi->time = time; - noL = cp->noL; - for (i = 0; i < noL; i++) { - /* - vi->v_i[i] = cp->in_node[i]->V; - vi->v_o[i] = cp->out_node[i]->V; - */ - vi->v_i[i] = *(ckt->CKTrhsOld + here->CPLposNodes[i]); - vi->v_o[i] = *(ckt->CKTrhsOld + here->CPLnegNodes[i]); - vi->i_i[i] = *(ckt->CKTrhsOld + here->CPLibr1[i]); - vi->i_o[i] = *(ckt->CKTrhsOld + here->CPLibr2[i]); - } - cp->vi_tail->next = vi; - cp2->vi_tail->next = vi; - vi->next = NULL; - cp->vi_tail = vi; - cp2->vi_tail = vi; - - return(1); -} - - -static int -get_pvs_vi(int t1, int t2, - CPLine *cp, - double v1_i[MAX_CP_TX_LINES][MAX_CP_TX_LINES], - double v2_i[MAX_CP_TX_LINES][MAX_CP_TX_LINES], - double i1_i[MAX_CP_TX_LINES][MAX_CP_TX_LINES], - double i2_i[MAX_CP_TX_LINES][MAX_CP_TX_LINES], - double v1_o[MAX_CP_TX_LINES][MAX_CP_TX_LINES], - double v2_o[MAX_CP_TX_LINES][MAX_CP_TX_LINES], - double i1_o[MAX_CP_TX_LINES][MAX_CP_TX_LINES], - double i2_o[MAX_CP_TX_LINES][MAX_CP_TX_LINES]) -{ - double ta[MAX_CP_TX_LINES], tb[MAX_CP_TX_LINES]; - VI_list *vi, *vi1; - double f; - int i, j; - int mini = -1; - double minta = 123456789.0; - int ext = 0; - int noL; - - noL = cp->noL; - - for (i = 0; i < noL; i++) { - ta[i] = t1 - cp->taul[i]; - tb[i] = t2 - cp->taul[i]; - if (ta[i] < minta) { - minta = ta[i]; - mini = i; - } - } - - for (i = 0; i < noL; i++) { - - ratio[i] = 0.0; - - if (tb[i] <= 0) { - for (j = 0; j < noL; j++) { - i1_i[i][j] = i2_i[i][j] = i1_o[i][j] = i2_o[i][j] = 0.0; - v1_i[i][j] = v2_i[i][j] = cp->dc1[j]; - v1_o[i][j] = v2_o[i][j] = cp->dc2[j]; - } - } else { - if (ta[i] <= 0) { - for (j = 0; j < noL; j++) { - i1_i[i][j] = i1_o[i][j] = 0.0; - v1_i[i][j] = cp->dc1[j]; - v1_o[i][j] = cp->dc2[j]; - } - vi1 = cp->vi_head; - vi = vi1->next; - } else { - vi1 = cp->vi_head; - for (vi = vi1->next; vi->time < ta[i]; ) { - /* if (i == mini) - free_vi(vi1); */ - vi1 = vi; - - /* new */ - vi = vi->next; - if (vi == NULL) goto errordetect; - } - f = (ta[i] - vi1->time) / (vi->time - vi1->time); - for (j = 0; j < noL; j++) { - v1_i[i][j] = vi1->v_i[j] + f * (vi->v_i[j] - vi1->v_i[j]); - v1_o[i][j] = vi1->v_o[j] + f * (vi->v_o[j] - vi1->v_o[j]); - i1_i[i][j] = vi1->i_i[j] + f * (vi->i_i[j] - vi1->i_i[j]); - i1_o[i][j] = vi1->i_o[j] + f * (vi->i_o[j] - vi1->i_o[j]); - } - if (i == mini) - cp->vi_head = vi1; - } - - if (tb[i] > t1) { - /* - fprintf(stderr, "pvs: time = %d\n", t2); - */ - ext = 1; - - ratio[i] = f = (tb[i] - t1) / (t2 - t1); - - if (vi) - for (; vi->next; vi = vi->next) - ; - else - vi = vi1; - f = 1 - f; - for (j = 0; j < noL; j++) { - v2_i[i][j] = vi->v_i[j] * f; - v2_o[i][j] = vi->v_o[j] * f; - i2_i[i][j] = vi->i_i[j] * f; - i2_o[i][j] = vi->i_o[j] * f; - } - } else { - for (; vi->time < tb[i];) { - vi1 = vi; - - /* new */ - vi = vi->next; - if (vi == NULL) goto errordetect; - } - - f = (tb[i] - vi1->time) / (vi->time - vi1->time); - for (j = 0; j < noL; j++) { - v2_i[i][j] = vi1->v_i[j] + f * (vi->v_i[j] - vi1->v_i[j]); - v2_o[i][j] = vi1->v_o[j] + f * (vi->v_o[j] - vi1->v_o[j]); - i2_i[i][j] = vi1->i_i[j] + f * (vi->i_i[j] - vi1->i_i[j]); - i2_o[i][j] = vi1->i_o[j] + f * (vi->i_o[j] - vi1->i_o[j]); - } - } - } - } - - return(ext); - -errordetect: - fprintf(stderr, "your maximum time step is too large for tau.\n"); - fprintf(stderr, "decrease max time step in .tran card and try again\n"); - controlled_exit(0); -} - - -static int update_delayed_cnv(CPLine *cp, double h) -{ - int i, j, k; - double *ratio1; - double f; - VI_list *vi; - TMS *tms; - int noL; - - h *= 0.5e-12; - ratio1 = cp->ratio; - vi = cp->vi_tail; - noL = cp->noL; - - for (k = 0; k < noL; k++) /* mode */ - if (ratio1[k] > 0.0) - for (i = 0; i < noL; i++) /* current eqn */ - for (j = 0; j < noL; j++) { - tms = cp->h3t[i][j][k]; - if (tms == NULL) - continue; - f = h * ratio1[k] * vi->v_i[j]; - tms->tm[0].cnv_i += f * tms->tm[0].c; - tms->tm[1].cnv_i += f * tms->tm[1].c; - tms->tm[2].cnv_i += f * tms->tm[2].c; - - f = h * ratio1[k] * vi->v_o[j]; - tms->tm[0].cnv_o += f * tms->tm[0].c; - tms->tm[1].cnv_o += f * tms->tm[1].c; - tms->tm[2].cnv_o += f * tms->tm[2].c; - - tms = cp->h2t[i][j][k]; - f = h * ratio1[k] * vi->i_i[j]; - tms->tm[0].cnv_i += f * tms->tm[0].c; - tms->tm[1].cnv_i += f * tms->tm[1].c; - tms->tm[2].cnv_i += f * tms->tm[2].c; - - f = h * ratio1[k] * vi->i_o[j]; - tms->tm[0].cnv_o += f * tms->tm[0].c; - tms->tm[1].cnv_o += f * tms->tm[1].c; - tms->tm[2].cnv_o += f * tms->tm[2].c; - } - return(1); -} - - -static int -expC(double ar, double ai, double h, double *cr, double *ci) -{ - double e, cs, si; - - e = exp(ar * h); - cs = cos(ai * h); - si = sin(ai * h); - *cr = e * cs; - *ci = e * si; - - return(1); -} - -static int -multC(double ar, double ai, double br, double bi, - double *cr, double *ci) -{ - double tp; - - tp = ar*br - ai*bi; - *ci = ar*bi+ai*br; - *cr = tp; - - return (1); - -} - -static void -update_cnv_a(TMS *tms, double h, double ai, double ao, double bi, double bo, - double er, double ei) -{ - double a, b, a1, b1; - - h *= 0.5e-12; - multC(tms->tm[1].c, tms->tm[2].c, er, ei, &a1, &b1); - multC(tms->tm[1].cnv_i, tms->tm[2].cnv_i, er, ei, &a, &b); - tms->tm[1].cnv_i = a + h * (a1 * bi + ai * tms->tm[1].c); - tms->tm[2].cnv_i = b + h * (b1 * bi + ai * tms->tm[2].c); - - multC(tms->tm[1].cnv_o, tms->tm[2].cnv_o, er, ei, &a, &b); - tms->tm[1].cnv_o = a + h * (a1 * bo + ao * tms->tm[1].c); - tms->tm[2].cnv_o = b + h * (b1 * bo + ao * tms->tm[2].c); -} - -static int -divC(double ar, double ai, double br, double bi, double *cr, double *ci) -{ - double t; - - t = br*br + bi*bi; - *cr = (ar*br + ai*bi) / t; - *ci = (ai*br - ar*bi) / t; - - return(1); -} - diff --git a/src/spicelib/devices/cpl/cplmask.c b/src/spicelib/devices/cpl/cplmask.c deleted file mode 100644 index adcb418b5..000000000 --- a/src/spicelib/devices/cpl/cplmask.c +++ /dev/null @@ -1,52 +0,0 @@ -/********** -Copyright 1992 Regents of the University of California. All rights -reserved. -Author: 2004 Paolo Nenzi -**********/ - - -#include "ngspice/ngspice.h" -#include "ngspice/const.h" -#include "ngspice/ifsim.h" -#include "ngspice/cktdefs.h" -#include "ngspice/devdefs.h" -#include "cpldefs.h" -#include "ngspice/sperror.h" -#include "ngspice/suffix.h" - -/*ARGSUSED*/ -int -CPLmAsk(CKTcircuit *ckt, GENmodel *inModel, int which, IFvalue *value) -{ - CPLmodel *model = (CPLmodel *)inModel; - - NG_IGNORE(ckt); - - switch(which) { - case CPL_R: - value->v.vec.rVec = model->Rm; - value->v.numValue = model->Rm_counter; - return(OK); - case CPL_L: - value->v.vec.rVec = model->Lm; - value->v.numValue = model->Lm_counter; - return(OK); - case CPL_G: - value->v.vec.rVec = model->Gm; - value->v.numValue = model->Gm_counter; - return(OK); - case CPL_C: - value->v.vec.rVec = model->Cm; - value->v.numValue = model->Cm_counter; - return(OK); - case CPL_length: - value->rValue = model->length; - return(OK); - case CPL_MOD_R: - /* No op */ - return(OK); - default: - return(E_BADPARM); - } - /* NOTREACHED */ -} diff --git a/src/spicelib/devices/cpl/cplmdel.c b/src/spicelib/devices/cpl/cplmdel.c deleted file mode 100644 index 5f493ec55..000000000 --- a/src/spicelib/devices/cpl/cplmdel.c +++ /dev/null @@ -1,24 +0,0 @@ -/********** -Copyright 2021 The ngspice team All rights -reserved. -Author: 2021 Holger Vogt -3-clause BSD license -**********/ - -#include "ngspice/ngspice.h" -#include "cpldefs.h" -#include "ngspice/sperror.h" -#include "ngspice/suffix.h" - - -int -CPLmDelete(GENmodel *gen_model) -{ - CPLmodel *model = (CPLmodel *)gen_model; - - FREE(model->Rm); - FREE(model->Lm); - FREE(model->Gm); - FREE(model->Cm); - return OK; -} diff --git a/src/spicelib/devices/cpl/cplmpar.c b/src/spicelib/devices/cpl/cplmpar.c deleted file mode 100644 index eea37b6bb..000000000 --- a/src/spicelib/devices/cpl/cplmpar.c +++ /dev/null @@ -1,66 +0,0 @@ -/********** -Copyright 1992 Regents of the University of California. All rights -reserved. -Author: 1992 Charles Hough -**********/ - - -#include "ngspice/ngspice.h" -#include "ngspice/const.h" -#include "ngspice/ifsim.h" -#include "cpldefs.h" -#include "ngspice/sperror.h" -#include "ngspice/suffix.h" -#include "cplhash.h" - - -static void copy_coeffs(double **dst, IFvalue *value) -{ - int n = value->v.numValue; - - if (*dst) { - tfree(*dst); - } - - *dst = TMALLOC(double, n); - - memcpy(*dst, value->v.vec.rVec, (size_t) n * sizeof(double)); -} - - -int -CPLmParam(int param, IFvalue *value, GENmodel *inModel) -{ - CPLmodel *model = (CPLmodel *)inModel; - switch(param) { - case CPL_R: - copy_coeffs(& model->Rm, value); - model->Rm_counter = value->v.numValue; - model->Rmgiven = TRUE; - break; - case CPL_L: - copy_coeffs(& model->Lm, value); - model->Lm_counter = value->v.numValue; - model->Lmgiven = TRUE; - break; - case CPL_G: - copy_coeffs(& model->Gm, value); - model->Gm_counter = value->v.numValue; - model->Gmgiven = TRUE; - break; - case CPL_C: - copy_coeffs(& model->Cm, value); - model->Cm_counter = value->v.numValue; - model->Cmgiven = TRUE; - break; - case CPL_length: - model->length = value->rValue; - model->lengthgiven = TRUE; - break; - case CPL_MOD_R: - break; - default: - return(E_BADPARM); - } - return(OK); -} diff --git a/src/spicelib/devices/cpl/cplparam.c b/src/spicelib/devices/cpl/cplparam.c deleted file mode 100644 index 31ebb9104..000000000 --- a/src/spicelib/devices/cpl/cplparam.c +++ /dev/null @@ -1,43 +0,0 @@ -/********** -Copyright 1992 Regents of the University of California. All rights -reserved. -Author: 1992 Charles Hough -**********/ - - -#include "ngspice/ngspice.h" -#include "ngspice/const.h" -#include "ngspice/ifsim.h" -#include "cpldefs.h" -#include "ngspice/sperror.h" -#include "ngspice/suffix.h" - - -/* ARGSUSED */ -int -CPLparam(int param, IFvalue *value, GENinstance *inst, IFvalue *select) -{ - - CPLinstance *here = (CPLinstance *)inst; - - NG_IGNORE(select); - - switch(param) { - case CPL_POS_NODE: - here->in_node_names = value->v.vec.sVec; - break; - case CPL_NEG_NODE: - here->out_node_names = value->v.vec.sVec; - break; - case CPL_DIM: - here->dimension = value->iValue; - break; - case CPL_LENGTH: - here->CPLlength = value->rValue; - here->CPLlengthGiven = TRUE; - break; - default: - return(E_BADPARM); - } - return(OK); -} diff --git a/src/spicelib/devices/cpl/cplsetup.c b/src/spicelib/devices/cpl/cplsetup.c deleted file mode 100644 index 351eaf28a..000000000 --- a/src/spicelib/devices/cpl/cplsetup.c +++ /dev/null @@ -1,2217 +0,0 @@ -/********** -Copyright 1992 Regents of the University of California. All rights -reserved. -Author: 1992 Charles Hough -Modified: 2004 Paolo Nenzi - (ng)spice integration -**********/ - - -#include "ngspice/ngspice.h" -#include "ngspice/smpdefs.h" -#include "cpldefs.h" -#include "ngspice/sperror.h" -#include "ngspice/suffix.h" - -#include "ngspice/multi_line.h" -#include "cplhash.h" - - - -#define VECTOR_ALLOC(type, vec, n) { \ - vec = TMALLOC(type *, n); \ - memsaved(vec); \ -} - -#define MATRIX_ALLOC(type, mat, m, j) { \ - int k; \ - mat = TMALLOC(type **, m); \ - memsaved(mat); \ - for (k = 0; k < m; k++) { \ - VECTOR_ALLOC(type, mat[k], j); \ - } \ -} - -#define VECTOR_FREE(vec) { \ - memdeleted(vec); \ - tfree(vec); \ -} - - -#define MATRIX_FREE(mat, m, j) { \ - int k; \ - for (k = 0; k < m; k++) { \ - memdeleted(mat[k]); \ - tfree(mat[k]); \ - } \ - memdeleted(mat); \ - tfree(mat); \ -} - - -#define CPLTFREE(ptr) { \ - memdeleted(ptr); \ - tfree(ptr); \ -} - -#define MAX_DEG 8 -#define epsilon 1.0e-88 -#define MAX_STRING 128 - -static double ZY[MAX_DIM][MAX_DIM]; -static double Sv[MAX_DIM][MAX_DIM]; -static double D[MAX_DIM]; -static double Y5[MAX_DIM][MAX_DIM]; -static double Y5_1[MAX_DIM][MAX_DIM]; -static double Sv_1[MAX_DIM][MAX_DIM]; - -static double R_m[MAX_DIM][MAX_DIM]; -static double G_m[MAX_DIM][MAX_DIM]; -static double L_m[MAX_DIM][MAX_DIM]; -static double C_m[MAX_DIM][MAX_DIM]; -static double length; -static double TAU[MAX_DIM]; - -static double A[MAX_DIM][2 * MAX_DIM]; - -static double frequency[MAX_DEG]; - -static double Si[MAX_DIM][MAX_DIM]; -static double Si_1[MAX_DIM][MAX_DIM]; - -/* MacLaurin Series */ -static double* SiSv_1[MAX_DIM][MAX_DIM]; -static double* Sip[MAX_DIM][MAX_DIM]; -static double* Si_1p[MAX_DIM][MAX_DIM]; -static double* Sv_1p[MAX_DIM][MAX_DIM]; -static double* W[MAX_DIM]; - -static Mult_Out IWI[MAX_DIM][MAX_DIM]; -static Mult_Out IWV[MAX_DIM][MAX_DIM]; -static Single_Out SIV[MAX_DIM][MAX_DIM]; -static double At[4][4]; -static double Scaling_F; -static double Scaling_F2; - -/* misc.c match */ -static void new_memory(int, int, int); -static double* vector(int, int); -static void free_vector(double*, int, int); -static void polint(double*, double*, int, double, double*, double*); -static int match(int, double*, double*, double*); -/* static int match_x(int, double*, double*, double*); */ -static int Gaussian_Elimination2(int, int); -static void eval_Si_Si_1(int, double); -static void loop_ZY(int, double); -static void poly_matrix(double* A[MAX_DIM][MAX_DIM], int dim, int deg); -/* static int checkW(double*, double); */ -static void poly_W(int, int); -static void eval_frequency(int, int); -static void store(int, int); -static void store_SiSv_1(int, int); -/*static int check(); quale è il prototipo ?*/ -static int coupled(int); -static int generate_out(int, int); -static int ReadCpL(CPLinstance*, CKTcircuit*); -/* static int divC(double, double, double, double, double*, double*); */ - -/* mult */ -static void mult_p(double*, double*, double*, int, int, int); -static void matrix_p_mult(double* A[MAX_DIM][MAX_DIM], - double* D[MAX_DIM], - double* B[MAX_DIM][MAX_DIM], - int dim, int deg, int deg_o, - Mult_Out X[MAX_DIM][MAX_DIM]); -static double approx_mode(double*, double*, double); -static double eval2(double, double, double, double); -static int get_c(double, double, double, double, double, double, double, double*, double*); -static int Pade_apx(double, double*, double*, double*, double*, double*, double*, double*); -static int Gaussian_Elimination(int); -static double root3(double, double, double, double); -static int div3(double, double, double, double, double*, double*); -static int find_roots(double, double, double, double*, double*, double*); - -static NODE* insert_node(char*); -static NDnamePt insert_ND(char*, NDnamePt*); -static NODE* NEW_node(void); -static NDnamePt ndn_btree; -static NODE* node_tab; -#define epsi_mult 1e-28 - -/* diag */ -static MAXE_PTR sort(MAXE_PTR, double, int, int, MAXE_PTR); -static void ordering(void); -static MAXE_PTR delete_1(MAXE_PTR*, int); -static void reordering(int, int); -static void diag(int); -static int rotate(int, int, int); - -#define epsi 1.0e-16 -static char* message = "tau of coupled lines is larger than max time step"; - -/* ARGSUSED */ -int -CPLsetup(SMPmatrix* matrix, GENmodel* inModel, CKTcircuit* ckt, int* state) -{ - CPLmodel* model = (CPLmodel*)inModel; - CPLinstance* here; - CKTnode* tmp, * node; - int error, m, p; - char** branchname; - int noL; - - NG_IGNORE(state); - - /* hash table for local gc */ - mem_init(); - - /* loop through all the models */ - for (; model != NULL; model = CPLnextModel(model)) { - - if (!model->Rmgiven) { - SPfrontEnd->IFerrorf(ERR_FATAL, - "model %s: lossy line series resistance not given", model->CPLmodName); - return(E_BADPARM); - } - if (!model->Gmgiven) { - SPfrontEnd->IFerrorf(ERR_FATAL, - "model %s: lossy line parallel conductance not given", model->CPLmodName); - return(E_BADPARM); - } - if (!model->Lmgiven) { - SPfrontEnd->IFerrorf(ERR_FATAL, - "model %s: lossy line series inductance not given", model->CPLmodName); - return (E_BADPARM); - } - if (!model->Cmgiven) { - SPfrontEnd->IFerrorf(ERR_FATAL, - "model %s: lossy line parallel capacitance not given", model->CPLmodName); - return (E_BADPARM); - } - if (!model->lengthgiven) { - SPfrontEnd->IFerrorf(ERR_FATAL, - "model %s: lossy line length must be given", model->CPLmodName); - return (E_BADPARM); - } - - /* loop through all the instances of the model */ - for (here = CPLinstances(model); here != NULL; - here = CPLnextInstance(here)) { - - if (!here->CPLlengthGiven) - here->CPLlength = 0.0; - - /* macro to make elements with built in test for out of memory */ -#define TSTALLOC(ptr,first,second) \ -do { if((here->ptr = SMPmakeElt(matrix, here->first, here->second)) == NULL){\ - return(E_NOMEM);\ -} } while(0) - - noL = here->dimension; - - here->CPLposNodes = TMALLOC(int, noL); - memsaved(here->CPLposNodes); - here->CPLnegNodes = TMALLOC(int, noL); - memsaved(here->CPLnegNodes); - here->CPLibr1 = TMALLOC(int, noL); - memsaved(here->CPLibr1); - here->CPLibr2 = TMALLOC(int, noL); - memsaved(here->CPLibr2); - - VECTOR_ALLOC(double, here->CPLibr1Ibr1Ptr, noL); - VECTOR_ALLOC(double, here->CPLibr2Ibr2Ptr, noL); - VECTOR_ALLOC(double, here->CPLposIbr1Ptr, noL); - VECTOR_ALLOC(double, here->CPLnegIbr2Ptr, noL); - VECTOR_ALLOC(double, here->CPLposPosPtr, noL); - VECTOR_ALLOC(double, here->CPLnegNegPtr, noL); - VECTOR_ALLOC(double, here->CPLnegPosPtr, noL); - VECTOR_ALLOC(double, here->CPLposNegPtr, noL); - - MATRIX_ALLOC(double, here->CPLibr1PosPtr, noL, noL); - MATRIX_ALLOC(double, here->CPLibr2NegPtr, noL, noL); - MATRIX_ALLOC(double, here->CPLibr1NegPtr, noL, noL); - MATRIX_ALLOC(double, here->CPLibr2PosPtr, noL, noL); - MATRIX_ALLOC(double, here->CPLibr1Ibr2Ptr, noL, noL); - MATRIX_ALLOC(double, here->CPLibr2Ibr1Ptr, noL, noL); - - - branchname = TMALLOC(char*, here->dimension); - memsaved(branchname); - if (!here->CPLibr1Given) { - for (m = 0; m < here->dimension; m++) { - branchname[m] = TMALLOC(char, MAX_STRING); - memsaved(branchname[m]); - sprintf(branchname[m], "branch1_%d", m); - error = - CKTmkCur(ckt, &tmp, here->CPLname, branchname[m]); - if (error) return (error); - here->CPLibr1[m] = tmp->number; - CPLTFREE(branchname[m]); - } - here->CPLibr1Given = 1; - } - CPLTFREE(branchname); - branchname = TMALLOC(char*, here->dimension); - memsaved(branchname); - if (!here->CPLibr2Given) { - for (m = 0; m < here->dimension; m++) { - branchname[m] = TMALLOC(char, MAX_STRING); - memsaved(branchname[m]); - sprintf(branchname[m], "branch2_%d", m); - error = - CKTmkCur(ckt, &tmp, here->CPLname, branchname[m]); - if (error) return (error); - here->CPLibr2[m] = tmp->number; - CPLTFREE(branchname[m]); - } - here->CPLibr2Given = 1; - } - CPLTFREE(branchname); - - for (m = 0; m < here->dimension; m++) { - for (node = ckt->CKTnodes; node; node = node->next) { - if (strcmp(here->in_node_names[m], - node->name) == 0) { - here->CPLposNodes[m] = node->number; - } - } - } - for (m = 0; m < here->dimension; m++) { - for (node = ckt->CKTnodes; node; node = node->next) { - if (strcmp(here->out_node_names[m], - node->name) == 0) { - here->CPLnegNodes[m] = node->number; - } - } - } - - for (m = 0; m < here->dimension; m++) { - TSTALLOC(CPLibr1Ibr1Ptr[m], CPLibr1[m], CPLibr1[m]); - TSTALLOC(CPLibr2Ibr2Ptr[m], CPLibr2[m], CPLibr2[m]); - TSTALLOC(CPLposIbr1Ptr[m], CPLposNodes[m], CPLibr1[m]); - TSTALLOC(CPLnegIbr2Ptr[m], CPLnegNodes[m], CPLibr2[m]); - TSTALLOC(CPLposPosPtr[m], CPLposNodes[m], CPLposNodes[m]); - TSTALLOC(CPLnegNegPtr[m], CPLnegNodes[m], CPLnegNodes[m]); - TSTALLOC(CPLnegPosPtr[m], CPLnegNodes[m], CPLposNodes[m]); - TSTALLOC(CPLposNegPtr[m], CPLposNodes[m], CPLnegNodes[m]); - - for (p = 0; p < here->dimension; p++) { - - TSTALLOC(CPLibr1PosPtr[m][p], CPLibr1[m], CPLposNodes[p]); - TSTALLOC(CPLibr2NegPtr[m][p], CPLibr2[m], CPLnegNodes[p]); - TSTALLOC(CPLibr1NegPtr[m][p], CPLibr1[m], CPLnegNodes[p]); - TSTALLOC(CPLibr2PosPtr[m][p], CPLibr2[m], CPLposNodes[p]); - TSTALLOC(CPLibr1Ibr2Ptr[m][p], CPLibr1[m], CPLibr2[p]); - TSTALLOC(CPLibr2Ibr1Ptr[m][p], CPLibr2[m], CPLibr1[p]); - - } - } - - ReadCpL(here, ckt); - - } - } - - return(OK); -} - - - -int -CPLunsetup(GENmodel* inModel, CKTcircuit* ckt) -{ - CPLmodel* model; - CPLinstance* here; - int m; - int noL; - - for (model = (CPLmodel*)inModel; model != NULL; - model = CPLnextModel(model)) { - for (here = CPLinstances(model); here != NULL; - here = CPLnextInstance(here)) { - - noL = here->dimension; - - VECTOR_FREE(here->CPLibr1Ibr1Ptr); - VECTOR_FREE(here->CPLibr2Ibr2Ptr); - VECTOR_FREE(here->CPLposIbr1Ptr); - VECTOR_FREE(here->CPLnegIbr2Ptr); - VECTOR_FREE(here->CPLposPosPtr); - VECTOR_FREE(here->CPLnegNegPtr); - VECTOR_FREE(here->CPLnegPosPtr); - VECTOR_FREE(here->CPLposNegPtr); - - - MATRIX_FREE(here->CPLibr1PosPtr, noL, noL); - MATRIX_FREE(here->CPLibr2NegPtr, noL, noL); - MATRIX_FREE(here->CPLibr1NegPtr, noL, noL); - MATRIX_FREE(here->CPLibr2PosPtr, noL, noL); - MATRIX_FREE(here->CPLibr1Ibr2Ptr, noL, noL); - MATRIX_FREE(here->CPLibr2Ibr1Ptr, noL, noL); - - - for (m = 0; m < noL; m++) { - if (here->CPLibr2[m]) { - CKTdltNNum(ckt, here->CPLibr2[m]); - here->CPLibr2[m] = 0; - } - } - - for (m = 0; m < noL; m++) { - if (here->CPLibr1[m]) { - CKTdltNNum(ckt, here->CPLibr1[m]); - here->CPLibr1[m] = 0; - } - } - - CPLTFREE(here->CPLposNodes); - CPLTFREE(here->CPLnegNodes); - CPLTFREE(here->CPLibr1); - CPLTFREE(here->CPLibr2); - - /* reset switches */ - here->CPLdcGiven = 0; - here->CPLibr1Given = 0; - here->CPLibr2Given = 0; - } - } - mem_delete(); - ndn_btree = NULL; - return OK; -} - - - -static int -ReadCpL(CPLinstance* here, CKTcircuit* ckt) -{ - int i, j, noL, counter; - double f; - char* name; - CPLine* c, * c2; - ECPLine* ec; - NODE* nd; - RLINE* lines[MAX_CP_TX_LINES]; - ERLINE* er; - - c = TMALLOC(CPLine, 1); - memsaved(c); - c2 = TMALLOC(CPLine, 1); - memsaved(c2); - c->vi_head = c->vi_tail = NULL; - noL = c->noL = here->dimension; - here->cplines = c; - here->cplines2 = c2; - - for (i = 0; i < noL; i++) { - ec = TMALLOC(ECPLine, 1); - memsaved(ec); - name = here->in_node_names[i]; - nd = insert_node(name); - ec->link = nd->cplptr; - nd->cplptr = ec; - ec->line = c; - c->in_node[i] = nd; - c2->in_node[i] = nd; - - er = TMALLOC(ERLINE, 1); - memsaved(er); - er->link = nd->rlptr; - nd->rlptr = er; - er->rl = lines[i] = TMALLOC(RLINE, 1); - memsaved(er->rl); - er->rl->in_node = nd; - - c->dc1[i] = c->dc2[i] = 0.0; - } - - for (i = 0; i < noL; i++) { - ec = TMALLOC(ECPLine, 1); - memsaved(ec); - name = here->out_node_names[i]; - nd = insert_node(name); - ec->link = nd->cplptr; - nd->cplptr = ec; - ec->line = c; - c->out_node[i] = nd; - c2->out_node[i] = nd; - - er = TMALLOC(ERLINE, 1); - memsaved(er); - er->link = nd->rlptr; - nd->rlptr = er; - er->rl = lines[i]; - er->rl->out_node = nd; - } - - - counter = 0; - for (i = 0; i < noL; i++) { - for (j = 0; j < noL; j++) { - if (i > j) { - R_m[i][j] = R_m[j][i]; - G_m[i][j] = G_m[j][i]; - C_m[i][j] = C_m[j][i]; - L_m[i][j] = L_m[j][i]; - } - else { - f = CPLmodPtr(here)->Rm[counter]; - R_m[i][j] = CPLmodPtr(here)->Rm[counter] = MAX(f, 1.0e-4); - G_m[i][j] = CPLmodPtr(here)->Gm[counter]; - L_m[i][j] = CPLmodPtr(here)->Lm[counter]; - C_m[i][j] = CPLmodPtr(here)->Cm[counter]; - counter++; - } - } - } - if (here->CPLlengthGiven) - length = here->CPLlength; - else length = CPLmodPtr(here)->length; - - for (i = 0; i < noL; i++) - lines[i]->g = 1.0 / (R_m[i][i] * length); - - coupled(noL); - - for (i = 0; i < noL; i++) { - double d, t; - int k; - - c->taul[i] = TAU[i] * 1.0e+12; - for (j = 0; j < noL; j++) { - if (SIV[i][j].C_0 == 0.0) - c->h1t[i][j] = NULL; - else { - c->h1t[i][j] = TMALLOC(TMS, 1); - memsaved(c->h1t[i][j]); - d = c->h1t[i][j]->aten = SIV[i][j].C_0; - c->h1t[i][j]->ifImg = (int)(SIV[i][j].Poly[6] - 1.0); - /* since originally 2 for img 1 for noimg */ - c->h1t[i][j]->tm[0].c = SIV[i][j].Poly[0] * d; - c->h1t[i][j]->tm[1].c = SIV[i][j].Poly[1] * d; - c->h1t[i][j]->tm[2].c = SIV[i][j].Poly[2] * d; - c->h1t[i][j]->tm[0].x = SIV[i][j].Poly[3]; - c->h1t[i][j]->tm[1].x = SIV[i][j].Poly[4]; - c->h1t[i][j]->tm[2].x = SIV[i][j].Poly[5]; - if (c->h1t[i][j]->ifImg) - c->h1C[i][j] = c->h1t[i][j]->tm[0].c + 2.0 * c->h1t[i][j]->tm[1].c; - else { - t = 0.0; - for (k = 0; k < 3; k++) - t += c->h1t[i][j]->tm[k].c; - c->h1C[i][j] = t; - } - } - - for (k = 0; k < noL; k++) { - if (IWI[i][j].C_0[k] == 0.0) - c->h2t[i][j][k] = NULL; - else { - c->h2t[i][j][k] = TMALLOC(TMS, 1); - memsaved(c->h2t[i][j][k]); - d = c->h2t[i][j][k]->aten = IWI[i][j].C_0[k]; - c->h2t[i][j][k]->ifImg = (int)(IWI[i][j].Poly[k][6] - 1.0); - /* since originally 2 for img 1 for noimg */ - c->h2t[i][j][k]->tm[0].c = IWI[i][j].Poly[k][0] * d; - c->h2t[i][j][k]->tm[1].c = IWI[i][j].Poly[k][1] * d; - c->h2t[i][j][k]->tm[2].c = IWI[i][j].Poly[k][2] * d; - c->h2t[i][j][k]->tm[0].x = IWI[i][j].Poly[k][3]; - c->h2t[i][j][k]->tm[1].x = IWI[i][j].Poly[k][4]; - c->h2t[i][j][k]->tm[2].x = IWI[i][j].Poly[k][5]; - if (c->h2t[i][j][k]->ifImg) - c->h2C[i][j][k] = c->h2t[i][j][k]->tm[0].c + 2.0 * - c->h2t[i][j][k]->tm[1].c; - else - c->h2C[i][j][k] = c->h2t[i][j][k]->tm[0].c + - c->h2t[i][j][k]->tm[1].c + - c->h2t[i][j][k]->tm[2].c; - } - if (IWV[i][j].C_0[k] == 0.0) - c->h3t[i][j][k] = NULL; - else { - c->h3t[i][j][k] = TMALLOC(TMS, 1); - memsaved(c->h3t[i][j][k]); - d = c->h3t[i][j][k]->aten = IWV[i][j].C_0[k]; - c->h3t[i][j][k]->ifImg = (int)(IWV[i][j].Poly[k][6] - 1.0); - /* since originally 2 for img 1 for noimg */ - c->h3t[i][j][k]->tm[0].c = IWV[i][j].Poly[k][0] * d; - c->h3t[i][j][k]->tm[1].c = IWV[i][j].Poly[k][1] * d; - c->h3t[i][j][k]->tm[2].c = IWV[i][j].Poly[k][2] * d; - c->h3t[i][j][k]->tm[0].x = IWV[i][j].Poly[k][3]; - c->h3t[i][j][k]->tm[1].x = IWV[i][j].Poly[k][4]; - c->h3t[i][j][k]->tm[2].x = IWV[i][j].Poly[k][5]; - if (c->h3t[i][j][k]->ifImg) - c->h3C[i][j][k] = c->h3t[i][j][k]->tm[0].c + 2.0 * - c->h3t[i][j][k]->tm[1].c; - else - c->h3C[i][j][k] = c->h3t[i][j][k]->tm[0].c + - c->h3t[i][j][k]->tm[1].c + - c->h3t[i][j][k]->tm[2].c; - } - } - } - } - - for (i = 0; i < noL; i++) { - if (c->taul[i] < ckt->CKTmaxStep) { - errMsg = TMALLOC(char, strlen(message) + 1); - memsaved(errMsg); - strcpy(errMsg, message); - return(-1); - } - } - - return(1); -} - - -/**************************************************************** - misc.c Miscellaneous procedures for simulation of - coupled transmission lines. - ****************************************************************/ - - -static void -new_memory(int dim, int deg, int deg_o) -{ - int i, j; - - NG_IGNORE(deg); - - for (i = 0; i < dim; i++) - for (j = 0; j < dim; j++) { - SiSv_1[i][j] = (double*)calloc((size_t)(deg_o + 1), sizeof(double)); - memsaved(SiSv_1[i][j]); - } - - for (i = 0; i < dim; i++) - for (j = 0; j < dim; j++) { - Sip[i][j] = (double*)calloc((size_t)(deg_o + 1), sizeof(double)); - memsaved(Sip[i][j]); - } - - for (i = 0; i < dim; i++) - for (j = 0; j < dim; j++) { - Si_1p[i][j] = (double*)calloc((size_t)(deg_o + 1), sizeof(double)); - memsaved(Si_1p[i][j]); - } - - for (i = 0; i < dim; i++) - for (j = 0; j < dim; j++) { - Sv_1p[i][j] = (double*)calloc((size_t)(deg_o + 1), sizeof(double)); - memsaved(Sv_1p[i][j]); - } - - for (i = 0; i < dim; i++) { - W[i] = (double*)calloc(MAX_DEG, sizeof(double)); - memsaved(W[i]); - } -} - -/*** - ***/ - - /**************************************************************** - match Create a polynomial matching given data points - ****************************************************************/ - - -static double* -vector(int nl, int nh) -{ - double* v = TMALLOC(double, nh - nl + 1); - memsaved(v); - - if (!v) { - fprintf(stderr, "Memory Allocation Error by tmalloc in vector().\n"); - fprintf(stderr, "...now exiting to system ...\n"); - controlled_exit(EXIT_FAILURE); - } - - return v - nl; -} - -static void -free_vector(double* v, int nl, int nh) -{ - NG_IGNORE(nh); - double* freev = v + nl; - CPLTFREE(freev); -} - -static void -polint(double* xa, double* ya, int n, double x, double* y, double* dy) -/* - Given arrays xa[1..n] and ya[1..n], and given a value x, this routine - returns a value y, and an error estimate dy. If P(x) is the - polynomial of degree n-1 such that P(xa) = ya, then the returned - value y = P(x) - */ -{ - int i, m, ns = 1; - double den, dif, dift, ho, hp, w; - double* c, * d; - - dif = ABS(x - xa[1]); - c = vector(1, n); - d = vector(1, n); - for (i = 1; i <= n; i++) { - if ((dift = ABS(x - xa[i])) < dif) { - ns = i; - dif = dift; - } - c[i] = ya[i]; - d[i] = ya[i]; - } - *y = ya[ns--]; - for (m = 1; m < n; m++) { - for (i = 1; i <= n - m; i++) { - ho = xa[i] - x; - hp = xa[i + m] - x; - w = c[i + 1] - d[i]; - if ((den = ho - hp) == 0.0) { - fprintf(stderr, "(Error) in routine POLINT\n"); - fprintf(stderr, "...now exiting to system ...\n"); - controlled_exit(EXIT_FAILURE); - } - den = w / den; - d[i] = hp * den; - c[i] = ho * den; - } - *y += (*dy = (2 * ns < (n - m) ? c[ns + 1] : d[ns--])); - } - free_vector(d, 1, n); - free_vector(c, 1, n); -} - -static int -match(int n, double* cof, double* xa, double* ya) -/* - Given arrays xa[0..n] and ya[0..n] containing a tabulated function - ya = f(xa), this routine returns an array of coefficients cof[0..n], - such that ya[i] = sum_j {cof[j]*xa[i]**j}. - */ -{ - int k, j, i; - double xmin, dy, * x, * y, * xx; - - x = vector(0, n); - y = vector(0, n); - xx = vector(0, n); - for (j = 0; j <= n; j++) { - x[j] = xa[j]; - xx[j] = y[j] = ya[j]; - } - for (j = 0; j <= n; j++) { - polint(x - 1, y - 1, n + 1 - j, 0.0, &cof[j], &dy); - xmin = 1.0e38; - k = -1; - for (i = 0; i <= n - j; i++) { - if (ABS(x[i]) < xmin) { - xmin = ABS(x[i]); - k = i; - } - if (x[i]) y[i] = (y[i] - cof[j]) / x[i]; - } - for (i = k + 1; i <= n - j; i++) { - y[i - 1] = y[i]; - x[i - 1] = x[i]; - } - } - free_vector(y, 0, n); - free_vector(x, 0, n); - free_vector(xx, 0, n); - - /**** check ****/ - /* - for (i = 0; i <= n; i++) { - xmin = xa[i]; - dy = cof[0]; - for (j = 1; j <= n; j++) { - dy += xmin * cof[j]; - xmin *= xa[i]; - } - printf("*** real x = %e y = %e\n", xa[i], xx[i]); - printf("*** calculated y = %e\n", dy); - printf("*** error = %e \% \n", (dy-xx[i])/xx[i]); - } - */ - return 0; -} - -/*** - ***/ - /*** - static int - match_x(int dim, double *Alfa, double *X, double *Y) - { - int i, j; - double f; - double scale; - - **** check **** - double xx[16]; - for (i = 0; i <= dim; i++) - xx[i] = Y[i]; - - if (Y[1] == Y[0]) - scale = 1.0; - else - scale = X[1] / (Y[1] - Y[0]); - for (i = 0; i < dim; i++) { - f = X[i+1]; - for (j = dim-1; j >= 0; j--) { - A[i][j] = f; - f *= X[i+1]; - } - A[i][dim] = (Y[i+1] - Y[0])*scale; - } - Gaussian_Elimination2(dim, 1); - Alfa[0] = Y[0]; - for (i = 1; i <= dim; i++) - Alfa[i] = A[dim-i][dim] / scale; - - **** check **** - * - for (i = 0; i <= dim; i++) { - f = X[i]; - scale = Alfa[0]; - for (j = 1; j <= dim; j++) { - scale += f * Alfa[j]; - f *= X[i]; - } - printf("*** real x = %e y = %e\n", X[i], xx[i]); - printf("*** calculated y = %e\n", scale); - printf("*** error = %e \% \n", (scale-xx[i])/xx[i]); - } - * - - return(1); - } - ***/ - /*** - ***/ - -static int -Gaussian_Elimination2(int dims, int type) -/* type = 1 : to solve a linear system - -1 : to inverse a matrix */ -{ - int i, j, k, dim; - double f; - double max; - int imax; - - if (type == -1) - dim = 2 * dims; - else - dim = dims; - - for (i = 0; i < dims; i++) { - imax = i; - max = ABS(A[i][i]); - for (j = i + 1; j < dim; j++) - if (ABS(A[j][i]) > max) { - imax = j; - max = ABS(A[j][i]); - } - if (max < epsilon) { - fprintf(stderr, " can not choose a pivot (misc)\n"); - controlled_exit(EXIT_FAILURE); - } - if (imax != i) - for (k = i; k <= dim; k++) { - SWAP(double, A[i][k], A[imax][k]); - } - - f = 1.0 / A[i][i]; - A[i][i] = 1.0; - - for (j = i + 1; j <= dim; j++) - A[i][j] *= f; - - for (j = 0; j < dims; j++) { - if (i == j) - continue; - f = A[j][i]; - A[j][i] = 0.0; - for (k = i + 1; k <= dim; k++) - A[j][k] -= f * A[i][k]; - } - } - - return(1); -} - -/*** - -static void -eval_Si_Si_1(int dim, double y) -{ - int i, j, k; - - for (i = 0; i < dim; i++) - for (j = 0; j < dim; j++) { - Si_1[i][j] = 0.0; - for (k = 0; k < dim; k++) - if (k == j) - Si_1[i][j] += Sv_1[i][k] * - (y * R_m[k][j] + Scaling_F * L_m[k][j]); - else - Si_1[i][j] += Sv_1[i][k] * L_m[k][j] * Scaling_F; - / - Si_1[i][j] *= Scaling_F; - / - } - - for (i = 0; i < dim; i++) - for (j = 0; j < dim; j++) - Si_1[i][j] /= sqrt((double) D[i]); - - for (i = 0; i < dim; i++) { - for (j = 0; j < dim; j++) - A[i][j] = Si_1[i][j]; - for (j = dim; j < 2* dim; j++) - A[i][j] = 0.0; - A[i][i+dim] = 1.0; - } - Gaussian_Elimination2(dim, -1); - - for (i = 0; i < dim; i++) - for (j = 0; j < dim; j++) - Si[i][j] = A[i][j+dim]; -} - -***/ - -static void -eval_Si_Si_1(int dim, double y) -{ - int i, j, k; - - for (i = 0; i < dim; i++) - for (j = 0; j < dim; j++) { - Si_1[i][j] = 0.0; - for (k = 0; k < dim; k++) - Si_1[i][j] += Sv_1[i][k] * (y * R_m[k][j] + Scaling_F * L_m[k][j]); - /* - else - Si_1[i][j] += Sv_1[i][k] * L_m[k][j] * Scaling_F; - Si_1[i][j] *= Scaling_F; - */ - } - - for (i = 0; i < dim; i++) - for (j = 0; j < dim; j++) - Si_1[i][j] /= sqrt(D[i]); - - for (i = 0; i < dim; i++) { - for (j = 0; j < dim; j++) - A[i][j] = Si_1[i][j]; - for (j = dim; j < 2 * dim; j++) - A[i][j] = 0.0; - A[i][i + dim] = 1.0; - } - Gaussian_Elimination2(dim, -1); - - for (i = 0; i < dim; i++) - for (j = 0; j < dim; j++) - Si[i][j] = A[i][j + dim]; -} - -/*** - -static void -loop_ZY(int dim, double y) -{ - int i, j, k; - double fmin, fmin1; - - for (i = 0; i < dim; i++) - for (j = 0; j < dim; j++) - if (i == j) - ZY[i][j] = Scaling_F * C_m[i][i] + G_m[i] * y; - else - ZY[i][j] = Scaling_F * C_m[i][j]; - diag(dim); - fmin = D[0]; - for (i = 1; i < dim; i++) - if (D[i] < fmin) - fmin = D[i]; - if (fmin < 0) { - fprintf(stderr, "(Error) The capacitance matrix of the multiconductor system is not positive definite.\n"); - exit(0); - } else { - fmin = sqrt(fmin); - fmin1 = 1 / fmin; - } - for (i = 0; i < dim; i++) - D[i] = sqrt((double) D[i]); - for (i = 0; i < dim; i++) - for (j = 0; j < dim; j++) { - Y5[i][j] = D[i] * Sv[j][i]; - Y5_1[i][j] = Sv[j][i] / D[i]; - } - for (i = 0; i < dim; i++) - for (j = 0; j < dim; j++) { - Sv_1[i][j] = 0.0; - for (k = 0; k < dim; k++) - Sv_1[i][j] += Sv[i][k] * Y5[k][j]; - } - for (i = 0; i < dim; i++) - for (j = 0; j < dim; j++) - Y5[i][j] = Sv_1[i][j]; - for (i = 0; i < dim; i++) - for (j = 0; j < dim; j++) { - Sv_1[i][j] = 0.0; - for (k = 0; k < dim; k++) - Sv_1[i][j] += Sv[i][k] * Y5_1[k][j]; - } - for (i = 0; i < dim; i++) - for (j = 0; j < dim; j++) - Y5_1[i][j] = Sv_1[i][j]; - - for (i = 0; i < dim; i++) - for (j = 0; j < dim; j++) { - ZY[i][j] = 0.0; - for (k = 0; k < dim; k++) - if (k == i) - ZY[i][j] += (Scaling_F * L_m[i][i] + R_m[i] * y) * - Y5[k][j]; - else - ZY[i][j] += L_m[i][k] * Y5[k][j] * Scaling_F; - } - for (i = 0; i < dim; i++) - for (j = 0; j < dim; j++) { - Sv_1[i][j] = 0.0; - for (k = 0; k < dim; k++) - Sv_1[i][j] += Y5[i][k] * ZY[k][j]; - } - for (i = 0; i < dim; i++) - for (j = 0; j < dim; j++) - ZY[i][j] = Sv_1[i][j]; - - diag(dim); - - for (i = 0; i < dim; i++) - for (j = 0; j < dim; j++) { - Sv_1[i][j] = 0.0; - for (k = 0; k < dim; k++) - Sv_1[i][j] += Sv[k][i] * Y5[k][j]; - Sv_1[i][j] *= fmin1; - } - for (i = 0; i < dim; i++) - for (j = 0; j < dim; j++) { - ZY[i][j] = 0.0; - for (k = 0; k < dim; k++) - ZY[i][j] += Y5_1[i][k] * Sv[k][j]; - ZY[i][j] *= fmin; - } - for (i = 0; i < dim; i++) - for (j = 0; j < dim; j++) - Sv[i][j] = ZY[i][j]; - -} -***/ - -static void -loop_ZY(int dim, double y) -{ - int i, j, k; - double fmin, fmin1 = 0.0; - - for (i = 0; i < dim; i++) - for (j = 0; j < dim; j++) - ZY[i][j] = Scaling_F * C_m[i][j] + G_m[i][j] * y; - /* - else - ZY[i][j] = Scaling_F * C_m[i][j]; - */ - diag(dim); - fmin = D[0]; - for (i = 1; i < dim; i++) - if (D[i] < fmin) - fmin = D[i]; - if (fmin < 0) { - fprintf(stderr, "(Error) The capacitance matrix of the multiconductor system is not positive definite.\n"); - controlled_exit(EXIT_FAILURE); - } - else { - fmin = sqrt(fmin); - fmin1 = 1 / fmin; - } - for (i = 0; i < dim; i++) - D[i] = sqrt(D[i]); - for (i = 0; i < dim; i++) - for (j = 0; j < dim; j++) { - Y5[i][j] = D[i] * Sv[j][i]; - Y5_1[i][j] = Sv[j][i] / D[i]; - } - for (i = 0; i < dim; i++) - for (j = 0; j < dim; j++) { - Sv_1[i][j] = 0.0; - for (k = 0; k < dim; k++) - Sv_1[i][j] += Sv[i][k] * Y5[k][j]; - } - for (i = 0; i < dim; i++) - for (j = 0; j < dim; j++) - Y5[i][j] = Sv_1[i][j]; - for (i = 0; i < dim; i++) - for (j = 0; j < dim; j++) { - Sv_1[i][j] = 0.0; - for (k = 0; k < dim; k++) - Sv_1[i][j] += Sv[i][k] * Y5_1[k][j]; - } - for (i = 0; i < dim; i++) - for (j = 0; j < dim; j++) - Y5_1[i][j] = Sv_1[i][j]; - - for (i = 0; i < dim; i++) - for (j = 0; j < dim; j++) { - ZY[i][j] = 0.0; - for (k = 0; k < dim; k++) - ZY[i][j] += (Scaling_F * L_m[i][k] + R_m[i][k] * y) * Y5[k][j]; - /* - else - ZY[i][j] += L_m[i][k] * Y5[k][j] * Scaling_F; - */ - } - for (i = 0; i < dim; i++) - for (j = 0; j < dim; j++) { - Sv_1[i][j] = 0.0; - for (k = 0; k < dim; k++) - Sv_1[i][j] += Y5[i][k] * ZY[k][j]; - } - for (i = 0; i < dim; i++) - for (j = 0; j < dim; j++) - ZY[i][j] = Sv_1[i][j]; - - diag(dim); - - for (i = 0; i < dim; i++) - for (j = 0; j < dim; j++) { - Sv_1[i][j] = 0.0; - for (k = 0; k < dim; k++) - Sv_1[i][j] += Sv[k][i] * Y5[k][j]; - Sv_1[i][j] *= fmin1; - } - for (i = 0; i < dim; i++) - for (j = 0; j < dim; j++) { - ZY[i][j] = 0.0; - for (k = 0; k < dim; k++) - ZY[i][j] += Y5_1[i][k] * Sv[k][j]; - ZY[i][j] *= fmin; - } - for (i = 0; i < dim; i++) - for (j = 0; j < dim; j++) - Sv[i][j] = ZY[i][j]; - -} - - -/*** - ***/ - -static void -poly_matrix( - double* A_in[MAX_DIM][MAX_DIM], - int dim, int deg) -{ - int i, j; - - for (i = 0; i < dim; i++) - for (j = 0; j < dim; j++) - match(deg, A_in[i][j], frequency, A_in[i][j]); -} - -/*** - ***/ - /*** - static int - checkW(double *W, double d) - { - double f, y; - float y1; - int k; - - printf("(W)y ="); - scanf("%f", &y1); - - f = W[0]; - y = y1; - f += y * W[1]; - for (k = 2; k < 6; k++) { - y *= y1; - f += y * W[k]; - } - printf("W[i]= %e\n ", f*exp((double)-d/y1)); - - return(1); - } - ***/ - /*** - ***/ - -static void -poly_W(int dim, int deg) -{ - int i; - - for (i = 0; i < dim; i++) { - match(deg, W[i], frequency, W[i]); - TAU[i] = approx_mode(W[i], W[i], length); - /* - checkW(W[i], TAU[i]); - */ - } -} - -/*** - ***/ - -static void -eval_frequency(int dim, int deg_o) -{ - int i; - double min; - - min = D[0]; - - for (i = 1; i < dim; i++) - if (D[i] < min) { - min = D[i]; - } - - if (min <= 0) { - fprintf(stderr, "A mode frequency is not positive. Abort!\n"); - controlled_exit(EXIT_FAILURE); - } - - Scaling_F2 = 1.0 / min; - Scaling_F = sqrt(Scaling_F2); - min = length * 8.0; - /* - min *= 1.0e18; - min = sqrt(min)*1.0e-9*length/8.0; - */ - - frequency[0] = 0.0; - - for (i = 1; i <= deg_o; i++) - frequency[i] = frequency[i - 1] + min; - - for (i = 0; i < dim; i++) - D[i] *= Scaling_F2; -} - -/*** - ***/ - -static void -store(int dim, int ind) -{ - int i, j; - - for (i = 0; i < dim; i++) { - for (j = 0; j < dim; j++) { - /* store_Sip */ - Sip[i][j][ind] = Si[i][j]; - /* store_Si_1p */ - Si_1p[i][j][ind] = Si_1[i][j]; - /* store_Sv_1p */ - Sv_1p[i][j][ind] = Sv_1[i][j]; - } - /* store_W */ - W[i][ind] = D[i]; - } -} - -/*** - ***/ - -static void -store_SiSv_1(int dim, int ind) -{ - int i, j, k; - double temp; - - for (i = 0; i < dim; i++) - for (j = 0; j < dim; j++) { - temp = 0.0; - for (k = 0; k < dim; k++) - temp += Si[i][k] * Sv_1[k][j]; - SiSv_1[i][j][ind] = temp; - } -} - -/*** - ***/ - /*** - static int - check(Sip, Si_1p, Sv_1p, SiSv_1p) - double *Sip[MAX_DIM][MAX_DIM]; - double *Si_1p[MAX_DIM][MAX_DIM]; - double *Sv_1p[MAX_DIM][MAX_DIM]; - double *SiSv_1p[MAX_DIM][MAX_DIM]; - { - double f, y; - float y1; - int i, j, k; - - printf("y ="); - scanf("%f", &y1); - - printf("\n"); - printf("Si =\n"); - for (i = 0; i < 4; i++) { - for (j = 0; j < 4; j++) { - f = Sip[i][j][0]; - y = y1; - f += y * Sip[i][j][1]; - for (k = 2; k < 8; k++) { - y *= y1; - f += y * Sip[i][j][k]; - } - printf("%e ", f); - } - printf("\n"); - } - printf("\n"); - printf("Si_1 =\n"); - for (i = 0; i < 4; i++) { - for (j = 0; j < 4; j++) { - f = Si_1p[i][j][0]; - y = y1; - f += y * Si_1p[i][j][1]; - for (k = 2; k < 8; k++) { - y *= y1; - f += y * Si_1p[i][j][k]; - } - printf("%e ", f); - } - printf("\n"); - } - printf("\n"); - printf("Sv_1 =\n"); - for (i = 0; i < 4; i++) { - for (j = 0; j < 4; j++) { - f = Sv_1p[i][j][0]; - y = y1; - f += y * Sv_1p[i][j][1]; - for (k = 2; k < 8; k++) { - y *= y1; - f += y * Sv_1p[i][j][k]; - } - printf("%e ", f); - } - printf("\n"); - } - printf("\n"); - printf("SiSv_1 =\n"); - for (i = 0; i < 4; i++) { - for (j = 0; j < 4; j++) { - f = SiSv_1p[i][j][0]; - y = y1; - f += y * SiSv_1p[i][j][1]; - for (k = 2; k < 8; k++) { - y *= y1; - f += y * SiSv_1p[i][j][k]; - } - printf("%e ", f); - } - printf("\n"); - } - return(1); - } - ***/ - /*** - ***/ - -static int -coupled(int dim) -{ - int deg, deg_o; - int i; - - deg = Right_deg; - deg_o = Left_deg; - new_memory(dim, deg, deg_o); - - Scaling_F = Scaling_F2 = 1.0; - - /*** y = 0 : ZY = LC ***/ - loop_ZY(dim, 0.0); - eval_frequency(dim, deg_o); - eval_Si_Si_1(dim, 0.0); - store_SiSv_1(dim, 0); - store(dim, 0); - - /*** Step 1 ***/ - /*** Step 2 ***/ - for (i = 1; i <= deg_o; i++) { - loop_ZY(dim, frequency[i]); - eval_Si_Si_1(dim, frequency[i]); - store_SiSv_1(dim, i); - store(dim, i); - } - poly_matrix(Sip, dim, deg_o); - poly_matrix(Si_1p, dim, deg_o); - poly_matrix(Sv_1p, dim, deg_o); - poly_W(dim, deg_o); - matrix_p_mult(Sip, W, Si_1p, dim, deg_o, deg_o, IWI); - matrix_p_mult(Sip, W, Sv_1p, dim, deg_o, deg_o, IWV); - - poly_matrix(SiSv_1, dim, deg_o); - - /*** - check(Sip, Si_1p, Sv_1p, SiSv_1); - ***/ - - generate_out(dim, deg_o); - - return(1); -} - -/*** - ***/ - -static int -generate_out(int dim, int deg_o) -{ - int i, j, k, rtv; - double C; - double* p; - double c1, c2, c3, x1, x2, x3; - - for (i = 0; i < dim; i++) - for (j = 0; j < dim; j++) { - p = SiSv_1[i][j]; - SIV[i][j].C_0 = C = p[0]; - if (C == 0.0) - continue; - for (k = 0; k <= deg_o; k++) - p[k] /= C; - if (i == j) { - rtv = Pade_apx(sqrt(G_m[i][i] / R_m[i][i]) / C, - p, &c1, &c2, &c3, &x1, &x2, &x3); - if (rtv == 0) { - SIV[i][j].C_0 = 0.0; - printf("SIV\n"); - continue; - } - } - else { - rtv = Pade_apx(0.0, - p, &c1, &c2, &c3, &x1, &x2, &x3); - if (rtv == 0) { - SIV[i][j].C_0 = 0.0; - printf("SIV\n"); - continue; - } - } - p = SIV[i][j].Poly = (double*)calloc(7, sizeof(double)); - memsaved(p); - p[0] = c1; - p[1] = c2; - p[2] = c3; - p[3] = x1; - p[4] = x2; - p[5] = x3; - p[6] = rtv; - } - for (i = 0; i < dim; i++) - for (j = 0; j < dim; j++) - for (k = 0; k < dim; k++) { - p = IWI[i][j].Poly[k]; - C = IWI[i][j].C_0[k]; - if (C == 0.0) - continue; - if (i == j && k == i) { - rtv = Pade_apx( - exp(-sqrt(G_m[i][i] * R_m[i][i]) * length) / C, - p, &c1, &c2, &c3, &x1, &x2, &x3); - if (rtv == 0) { - IWI[i][j].C_0[k] = 0.0; - printf("IWI %d %d %d\n", i, j, k); - continue; - } - } - else { - rtv = Pade_apx(0.0, - p, &c1, &c2, &c3, &x1, &x2, &x3); - if (rtv == 0) { - IWI[i][j].C_0[k] = 0.0; - printf("IWI %d %d %d\n", i, j, k); - continue; - } - } - p[0] = c1; - p[1] = c2; - p[2] = c3; - p[3] = x1; - p[4] = x2; - p[5] = x3; - p[6] = rtv; - } - - for (i = 0; i < dim; i++) - for (j = 0; j < dim; j++) - for (k = 0; k < dim; k++) { - p = IWV[i][j].Poly[k]; - C = IWV[i][j].C_0[k]; - if (C == 0.0) - continue; - if (i == j && k == i) { - rtv = Pade_apx(sqrt(G_m[i][i] / R_m[i][i]) * - exp(-sqrt(G_m[i][i] * R_m[i][i]) * length) / C, - p, &c1, &c2, &c3, &x1, &x2, &x3); - if (rtv == 0) { - IWV[i][j].C_0[k] = 0.0; - printf("IWV %d %d %d\n", i, j, k); - continue; - } - } - else { - rtv = Pade_apx(0.0, - p, &c1, &c2, &c3, &x1, &x2, &x3); - if (rtv == 0) { - IWV[i][j].C_0[k] = 0.0; - printf("IWV %d %d %d\n", i, j, k); - continue; - } - } - p[0] = c1; - p[1] = c2; - p[2] = c3; - p[3] = x1; - p[4] = x2; - p[5] = x3; - p[6] = rtv; - } - return(1); -} - -/**************************************************************** - mult.c Multiplication for Matrix of Polynomial - X(y) = A(y) D(y) B(y), - where D(y) is a diagonal matrix with each - diagonal entry of the form - e^{-a_i s}d(y), for which s = 1/y - and i = 1..N. - Each entry of X(y) will be of the form - \sum_{i=1}^N c_i e^{-a_i s} b_i(y), where - b_i(0) = 1; therefore, those - b_i(y)'s will be each entry's output. - ****************************************************************/ - -static void -mult_p(double* p1, double* p2, double* p3, int d1, int d2, int d3) -/* p3 = p1 * p2 */ -{ - int i, j, k; - - for (i = 0; i <= d3; i++) - p3[i] = 0.0; - for (i = 0; i <= d1; i++) - for (j = i, k = 0; k <= d2; j++, k++) { - if (j > d3) - break; - p3[j] += p1[i] * p2[k]; - } -} - - -static void matrix_p_mult( - double* A_in[MAX_DIM][MAX_DIM], - double* D1[MAX_DIM], - double* B[MAX_DIM][MAX_DIM], - int dim, int deg, int deg_o, - Mult_Out X[MAX_DIM][MAX_DIM]) -{ - int i, j, k, l; - double* p; - double* T[MAX_DIM][MAX_DIM]; - double t1; - - for (i = 0; i < dim; i++) - for (j = 0; j < dim; j++) { - p = T[i][j] = (double*)calloc((size_t)(deg_o + 1), sizeof(double)); - memsaved(p); - mult_p(B[i][j], D1[i], p, deg, deg_o, deg_o); - } - for (i = 0; i < dim; i++) - for (j = 0; j < dim; j++) - for (k = 0; k < dim; k++) { - p = X[i][j].Poly[k] = - (double*)calloc((size_t)(deg_o + 1), sizeof(double)); - memsaved(p); - mult_p(A_in[i][k], T[k][j], p, deg, deg_o, deg_o); - t1 = X[i][j].C_0[k] = p[0]; - if (t1 != 0.0) { - p[0] = 1.0; - for (l = 1; l <= deg_o; l++) - p[l] /= t1; - } - } - for (i = 0; i < dim; i++) - for (j = 0; j < dim; j++) - CPLTFREE(T[i][j]); - - /********** - for (i = 0; i < dim; i++) - for (j = 0; j < dim; j++) { - for (k = 0; k < dim; k++) { - fprintf(outFile, "(%5.3f)", X[i][j].C_0[k]); - p = X[i][j].Poly[k]; - for (l = 0; l <= deg_o; l++) - fprintf(outFile, "%5.3f ", p[l]); - fprintf(outFile, "\n"); - } - fprintf(outFile, "\n"); - } - ***********/ -} - -/**************************************************************** - mode approximation - - ****************************************************************/ - - /*** - ***/ - -static double -approx_mode(double* X, double* b, double length_in) -{ - double w0, w1, w2, w3, w4, w5; - double a[8]; - double delay, atten; - double y1, y2, y3, y4, y5, y6; - int i, j; - - w0 = X[0]; - w1 = X[1] / w0; /* a */ - w2 = X[2] / w0; /* b */ - w3 = X[3] / w0; /* c */ - w4 = X[4] / w0; /* d */ - w5 = X[5] / w0; /* e */ - - y1 = 0.5 * w1; - y2 = w2 - y1 * y1; - y3 = 3 * w3 - 3.0 * y1 * y2; - y4 = 12.0 * w4 - 3.0 * y2 * y2 - 4.0 * y1 * y3; - y5 = 60.0 * w5 - 5.0 * y1 * y4 - 10.0 * y2 * y3; - y6 = -10.0 * y3 * y3 - 15.0 * y2 * y4 - 6.0 * y1 * y5; - - delay = sqrt(w0) * length_in / Scaling_F; - atten = exp(-delay * y1); - - a[1] = y2 / 2.0; - a[2] = y3 / 6.0; - a[3] = y4 / 24.0; - a[4] = y5 / 120.0; - a[5] = y6 / 720.0; - - a[1] *= -delay; - a[2] *= -delay; - a[3] *= -delay; - a[4] *= -delay; - a[5] *= -delay; - - b[0] = 1.0; - b[1] = a[1]; - for (i = 2; i <= 5; i++) { - b[i] = 0.0; - for (j = 1; j <= i; j++) - b[i] += j * a[j] * b[i - j]; - b[i] = b[i] / (double)i; - } - - for (i = 0; i <= 5; i++) - b[i] *= atten; - - return(delay); -} - -/*** - ***/ - -static double -eval2(double a, double b, double c, double x) -{ - return(a * x * x + b * x + c); -} - -/*** - ***/ - -static int -get_c(double q1, double q2, double q3, double p1, double p2, double a, double b, - double* cr, double* ci) -{ - double d, n; - - d = (3.0 * (a * a - b * b) + 2.0 * p1 * a + p2) * (3.0 * (a * a - b * b) + 2.0 * p1 * a + p2); - d += (6.0 * a * b + 2.0 * p1 * b) * (6.0 * a * b + 2.0 * p1 * b); - n = -(q1 * (a * a - b * b) + q2 * a + q3) * (6.0 * a * b + 2.0 * p1 * b); - n += (2.0 * q1 * a * b + q2 * b) * (3.0 * (a * a - b * b) + 2.0 * p1 * a + p2); - *ci = n / d; - n = (3.0 * (a * a - b * b) + 2.0 * p1 * a + p2) * (q1 * (a * a - b * b) + q2 * a + q3); - n += (6.0 * a * b + 2.0 * p1 * b) * (2.0 * q1 * a * b + q2 * b); - *cr = n / d; - - return(1); -} - - -static int -Pade_apx(double a_b, double* b, double* c1, double* c2, double* c3, - double* x1, double* x2, double* x3) - /* - b[0] + b[1]*y + b[2]*y^2 + ... + b[5]*y^5 + ... - = (q3*y^3 + q2*y^2 + q1*y + 1) / (p3*y^3 + p2*y^2 + p1*y + 1) - - where b[0] is always equal to 1.0 and neglected, - and y = 1/s. - - (q3*y^3 + q2*y^2 + q1*y + 1) / (p3*y^3 + p2*y^2 + p1*y + 1) - = (s^3 + q1*s^2 + q2*s + q3) / (s^3 + p1*s^2 + p2*s + p3) - = c1 / (s - x1) + c2 / (s - x2) + c3 / (s - x3) + 1.0 - */ -{ - double p1, p2, p3, q1, q2, q3; - - At[0][0] = 1.0 - a_b; - At[0][1] = b[1]; - At[0][2] = b[2]; - At[0][3] = -b[3]; - - At[1][0] = b[1]; - At[1][1] = b[2]; - At[1][2] = b[3]; - At[1][3] = -b[4]; - - At[2][0] = b[2]; - At[2][1] = b[3]; - At[2][2] = b[4]; - At[2][3] = -b[5]; - - Gaussian_Elimination(3); - - p3 = At[0][3]; - p2 = At[1][3]; - p1 = At[2][3]; - /* - if (p3 < 0.0 || p2 < 0.0 || p1 < 0.0 || p1*p2 <= p3) - return(0); - */ - q1 = p1 + b[1]; - q2 = b[1] * p1 + p2 + b[2]; - q3 = p3 * a_b; - - if (find_roots(p1, p2, p3, x1, x2, x3)) { - /* - printf("complex roots : %e %e %e \n", *x1, *x2, *x3); - */ - *c1 = eval2(q1 - p1, q2 - p2, q3 - p3, *x1) / - eval2(3.0, 2.0 * p1, p2, *x1); - get_c(q1 - p1, q2 - p2, q3 - p3, p1, p2, *x2, *x3, c2, c3); - return(2); - } - else { - /* new - printf("roots are %e %e %e \n", *x1, *x2, *x3); - */ - *c1 = eval2(q1 - p1, q2 - p2, q3 - p3, *x1) / - eval2(3.0, 2.0 * p1, p2, *x1); - *c2 = eval2(q1 - p1, q2 - p2, q3 - p3, *x2) / - eval2(3.0, 2.0 * p1, p2, *x2); - *c3 = eval2(q1 - p1, q2 - p2, q3 - p3, *x3) / - eval2(3.0, 2.0 * p1, p2, *x3); - return(1); - } -} - -static int -Gaussian_Elimination(int dims) -{ - int i, j, k, dim; - double f; - double max; - int imax; - - dim = dims; - - for (i = 0; i < dim; i++) { - imax = i; - max = ABS(At[i][i]); - for (j = i + 1; j < dim; j++) - if (ABS(At[j][i]) > max) { - imax = j; - max = ABS(At[j][i]); - } - if (max < epsi_mult) { - fprintf(stderr, " can not choose a pivot (mult)\n"); - controlled_exit(EXIT_FAILURE); - } - if (imax != i) - for (k = i; k <= dim; k++) { - SWAP(double, At[i][k], At[imax][k]); - } - - f = 1.0 / At[i][i]; - At[i][i] = 1.0; - - for (j = i + 1; j <= dim; j++) - At[i][j] *= f; - - for (j = 0; j < dim; j++) { - if (i == j) - continue; - f = At[j][i]; - At[j][i] = 0.0; - for (k = i + 1; k <= dim; k++) - At[j][k] -= f * At[i][k]; - } - } - return(1); -} - -static double -root3(double a1, double a2, double a3, double x) -{ - double t1, t2; - - t1 = x * (x * (x + a1) + a2) + a3; - t2 = x * (2.0 * a1 + 3.0 * x) + a2; - - return(x - t1 / t2); -} - -static int -div3(double a1, double a2, double a3, double x, double* p1, double* p2) -{ - NG_IGNORE(a2); - - *p1 = a1 + x; - - /* *p2 = a2 + (a1 + x) * x; */ - - *p2 = -a3 / x; - - return(1); -} - - -static int -find_roots(double a1, double a2, double a3, double* x1, double* x2, double* x3) -{ - double x, t; - double p, q; - - /*********************************************** - double m,n; - p = a1*a1/3.0 - a2; - q = a1*a2/3.0 - a3 - 2.0*a1*a1*a1/27.0; - p = p*p*p/27.0; - t = q*q - 4.0*p; - if (t < 0.0) { - if (q != 0.0) { - t = atan(sqrt((double)-t)/q); - if (t < 0.0) - t += M_PI; - t /= 3.0; - x = 2.0 * pow(p, 0.16666667) * cos(t) - a1 / 3.0; - } else { - t /= -4.0; - x = pow(t, 0.16666667) * 1.732 - a1 / 3.0; - } - } else { - t = sqrt(t); - m = 0.5*(q - t); - n = 0.5*(q + t); - if (m < 0.0) - m = -pow((double) -m, (double) 0.3333333); - else - m = pow((double) m, (double) 0.3333333); - if (n < 0.0) - n = -pow((double) -n, (double) 0.3333333); - else - n = pow((double) n, (double) 0.3333333); - x = m + n - a1 / 3.0; - } - ************************************************/ - q = (a1 * a1 - 3.0 * a2) / 9.0; - p = (2.0 * a1 * a1 * a1 - 9.0 * a1 * a2 + 27.0 * a3) / 54.0; - t = q * q * q - p * p; - if (t >= 0.0) { - t = acos(p / (q * sqrt(q))); - x = -2.0 * sqrt(q) * cos(t / 3.0) - a1 / 3.0; - } - else { - if (p > 0.0) { - t = pow(sqrt(-t) + p, 1.0 / 3.0); - x = -(t + q / t) - a1 / 3.0; - } - else if (p == 0.0) { - x = -a1 / 3.0; - } - else { - t = pow(sqrt(-t) - p, 1.0 / 3.0); - x = (t + q / t) - a1 / 3.0; - } - } - /* - fprintf(stderr, "..1.. %e\n", x*x*x+a1*x*x+a2*x+a3); - */ - { - double x_backup = x; - int i = 0; - for (t = root3(a1, a2, a3, x); ABS(t - x) > 5.0e-4; - t = root3(a1, a2, a3, x)) - if (++i == 32) { - x = x_backup; - break; - } - else - x = t; - } - /* - fprintf(stderr, "..2.. %e\n", x*x*x+a1*x*x+a2*x+a3); - */ - - - *x1 = x; - div3(a1, a2, a3, x, &a1, &a2); - - t = a1 * a1 - 4.0 * a2; - if (t < 0) { - /* - fprintf(stderr, "***** Two Imaginary Roots.\n Update.\n"); - *x2 = -0.5 * a1; - *x3 = a2 / *x2; - */ - *x3 = 0.5 * sqrt(-t); - *x2 = -0.5 * a1; - return(1); - } - else { - t = sqrt(t); - if (a1 >= 0.0) - *x2 = t = -0.5 * (a1 + t); - else - *x2 = t = -0.5 * (a1 - t); - *x3 = a2 / t; - return(0); - } -} - - -static NDnamePt -insert_ND(char* name, NDnamePt* ndn) -{ - int cmp; - NDnamePt p; - - if (*ndn == NULL) { - p = *ndn = TMALLOC(NDname, 1); - memsaved(p); - p->nd = NULL; - p->right = p->left = NULL; - strcpy(p->id, name); - return(p); - } - cmp = strcmp((*ndn)->id, name); - if (cmp == 0) - return(*ndn); - else { - if (cmp < 0) - return(insert_ND(name, &((*ndn)->left))); - else - return(insert_ND(name, &((*ndn)->right))); - } -} - -static NODE* -insert_node(char* name) -{ - NDnamePt n; - NODE* p; - - n = insert_ND(name, &ndn_btree); - if (n->nd == NULL) { - p = NEW_node(); - p->name = n; - n->nd = p; - p->next = node_tab; - node_tab = p; - return(p); - } - else - return(n->nd); -} -/*** -static int divC(double ar, double ai, double br, double bi, double *cr, double *ci) -{ - double t; - - t = br*br + bi*bi; - *cr = (ar*br + ai*bi) / t; - *ci = (ai*br - ar*bi) / t; - - return(1); -} -***/ - -static NODE -* NEW_node(void) -{ - NODE* n; - - n = TMALLOC(NODE, 1); - memsaved(n); - n->mptr = NULL; - n->gptr = NULL; - n->cptr = NULL; - n->rptr = NULL; - n->tptr = NULL; - n->cplptr = NULL; - n->rlptr = NULL; - n->ddptr = NULL; - n->cvccsptr = NULL; - n->vccsptr = NULL; - n->CL = 0.001; - n->V = n->dv = 0.0; - n->gsum = n->cgsum = 0; - n->is = 0; - n->tag = 0; - n->flag = 0; - n->region = NULL; - n->ofile = NULL; - n->dvtag = 0; - - return(n); -} - - - -/**************************************************************** - diag.c This file contains the main(). - ****************************************************************/ - -#define epsi2 1.0e-8 - -static int dim; -static MAXE_PTR row; - -static MAXE_PTR -sort(MAXE_PTR list, double val, int r, int c, MAXE_PTR e) -{ - if (list == NULL || list->value < val) { - e->row = r; - e->col = c; - e->value = val; - e->next = list; - return(e); - } - else { - list->next = sort(list->next, val, r, c, e); - return(list); - } -} - - -static void -ordering(void) -{ - MAXE_PTR e; - int i, j, m; - double mv; - - for (i = 0; i < dim - 1; i++) { - m = i + 1; - mv = ABS(ZY[i][m]); - for (j = m + 1; j < dim; j++) - if ((int)(ABS(ZY[i][j]) * 1e7) > (int) (1e7 * mv)) { - - mv = ABS(ZY[i][j]); - m = j; - } - e = TMALLOC(MAXE, 1); - memsaved(e); - row = sort(row, mv, i, m, e); - } -} - - -static MAXE_PTR -delete_1(MAXE_PTR* list, int rc) -{ - MAXE_PTR list1, e; - - list1 = *list; - if ((*list)->row == rc) { - *list = (*list)->next; - return(list1); - } - for (e = list1->next; e->row != rc; e = e->next) - list1 = e; - list1->next = e->next; - return(e); -} - - -static void -reordering(int p, int q) -{ - MAXE_PTR e; - int j, m; - double mv; - - m = p + 1; - mv = ABS(ZY[p][m]); - for (j = m + 1; j < dim; j++) - if ((int)(ABS(ZY[p][j]) * 1e7) > (int) (1e7 * mv)) { - mv = ABS(ZY[p][j]); - m = j; - } - e = delete_1(&row, p); - row = sort(row, mv, p, m, e); - - m = q + 1; - if (m != dim) { - mv = ABS(ZY[q][m]); - for (j = m + 1; j < dim; j++) - if ((int)(ABS(ZY[q][j]) * 1e7) > (int) (1e7 * mv)) { - - mv = ABS(ZY[q][j]); - m = j; - } - e = delete_1(&row, q); - row = sort(row, mv, q, m, e); - } - -} - -static void -diag(int dims) -{ - int i, j, c; - double fmin, fmax; - - dim = dims; - row = NULL; - - fmin = fmax = ABS(ZY[0][0]); - for (i = 0; i < dim; i++) - for (j = i; j < dim; j++) - if (ABS(ZY[i][j]) > fmax) - fmax = ABS(ZY[i][j]); - else if (ABS(ZY[i][j]) < fmin) - fmin = ABS(ZY[i][j]); - fmin = 2.0 / (fmin + fmax); - for (i = 0; i < dim; i++) - for (j = i; j < dim; j++) - ZY[i][j] *= fmin; - - for (i = 0; i < dim; i++) { - for (j = 0; j < dim; j++) - if (i == j) - Sv[i][i] = 1.0; - else - Sv[i][j] = 0.0; - } - - ordering(); - - if (row) - for (c = 0; row->value > epsi2; c++) { - int p, q; - - p = row->row; - q = row->col; - - rotate(dim, p, q); - reordering(p, q); - } - - for (i = 0; i < dim; i++) - D[i] = ZY[i][i] / fmin; - - while (row) { - MAXE_PTR tmp_row = row->next; - CPLTFREE(row); - row = tmp_row; - } -} - -/**************************************************************** - rotate() rotation of the Jacobi's method - ****************************************************************/ - -static int rotate(int dim_in, int p, int q) -{ - int j; - double co, si; - double ve, mu, ld; - double T[MAX_DIM]; - double t; - - ld = -ZY[p][q]; - mu = 0.5 * (ZY[p][p] - ZY[q][q]); - ve = sqrt(ld * ld + mu * mu); - co = sqrt((ve + ABS(mu)) / (2.0 * ve)); - si = SGN(mu) * ld / (2.0 * ve * co); - - for (j = p + 1; j < dim_in; j++) - T[j] = ZY[p][j]; - for (j = 0; j < p; j++) - T[j] = ZY[j][p]; - - for (j = p + 1; j < dim_in; j++) { - if (j == q) - continue; - if (j > q) - ZY[p][j] = T[j] * co - ZY[q][j] * si; - else - ZY[p][j] = T[j] * co - ZY[j][q] * si; - } - for (j = q + 1; j < dim_in; j++) { - if (j == p) - continue; - ZY[q][j] = T[j] * si + ZY[q][j] * co; - } - for (j = 0; j < p; j++) { - if (j == q) - continue; - ZY[j][p] = T[j] * co - ZY[j][q] * si; - } - for (j = 0; j < q; j++) { - if (j == p) - continue; - ZY[j][q] = T[j] * si + ZY[j][q] * co; - } - - t = ZY[p][p]; - ZY[p][p] = t * co * co + ZY[q][q] * si * si - 2.0 * ZY[p][q] * si * co; - ZY[q][q] = t * si * si + ZY[q][q] * co * co + 2.0 * ZY[p][q] * si * co; - - ZY[p][q] = 0.0; - - { - double R[MAX_DIM]; - - for (j = 0; j < dim_in; j++) { - T[j] = Sv[j][p]; - R[j] = Sv[j][q]; - } - - for (j = 0; j < dim_in; j++) { - Sv[j][p] = T[j] * co - R[j] * si; - Sv[j][q] = T[j] * si + R[j] * co; - } - } - - return(1); - -} - diff --git a/src/spicelib/devices/csw/Makefile.am b/src/spicelib/devices/csw/Makefile.am deleted file mode 100644 index f5ac89b85..000000000 --- a/src/spicelib/devices/csw/Makefile.am +++ /dev/null @@ -1,27 +0,0 @@ -## Process this file with automake to produce Makefile.in - -noinst_LTLIBRARIES = libcsw.la - -libcsw_la_SOURCES = \ - csw.c \ - cswacld.c \ - cswask.c \ - cswdefs.h \ - cswext.h \ - cswinit.c \ - cswinit.h \ - cswitf.h \ - cswload.c \ - cswmask.c \ - cswmpar.c \ - cswnoise.c \ - cswparam.c \ - cswpzld.c \ - cswsetup.c \ - cswtrunc.c - - - -AM_CPPFLAGS = @AM_CPPFLAGS@ -I$(top_srcdir)/src/include -AM_CFLAGS = $(STATIC) -MAINTAINERCLEANFILES = Makefile.in diff --git a/src/spicelib/devices/csw/csw.c b/src/spicelib/devices/csw/csw.c deleted file mode 100644 index 47bc335fb..000000000 --- a/src/spicelib/devices/csw/csw.c +++ /dev/null @@ -1,42 +0,0 @@ -/********** -Copyright 1990 Regents of the University of California. All rights reserved. -Author: 1987 Thomas L. Quarles -**********/ - -#include "ngspice/ngspice.h" -#include "ngspice/ifsim.h" -#include "ngspice/devdefs.h" -#include "cswdefs.h" -#include "ngspice/suffix.h" - - -IFparm CSWpTable[] = { /* parameters */ - IOP("control", CSW_CONTROL, IF_INSTANCE, "Name of controlling source"), - IP("on", CSW_IC_ON, IF_FLAG, "Initially closed"), - IP("off", CSW_IC_OFF, IF_FLAG, "Initially open"), - OPU("pos_node", CSW_POS_NODE, IF_INTEGER, "Positive node of switch"), - OPU("neg_node", CSW_NEG_NODE, IF_INTEGER, "Negative node of switch"), - OP("i", CSW_CURRENT, IF_REAL, "Switch current"), - OP("p", CSW_POWER, IF_REAL, "Instantaneous power") -}; - -IFparm CSWmPTable[] = { /* model parameters */ - IOPU("csw", CSW_CSW, IF_FLAG, "Current controlled switch model"), - IOPU("it", CSW_ITH, IF_REAL, "Threshold current"), - IOPU("ih", CSW_IHYS, IF_REAL, "Hysterisis current"), - IOPU("ron", CSW_RON, IF_REAL, "Closed resistance"), - IOPU("roff", CSW_ROFF, IF_REAL, "Open resistance"), - OPU("gon", CSW_GON, IF_REAL, "Closed conductance"), - OPU("goff", CSW_GOFF, IF_REAL, "Open conductance") -}; - -char *CSWnames[] = { - "W+", - "W-" -}; - -int CSWnSize = NUMELEMS(CSWnames); -int CSWpTSize = NUMELEMS(CSWpTable); -int CSWmPTSize = NUMELEMS(CSWmPTable); -int CSWiSize = sizeof(CSWinstance); -int CSWmSize = sizeof(CSWmodel); diff --git a/src/spicelib/devices/csw/cswacld.c b/src/spicelib/devices/csw/cswacld.c deleted file mode 100644 index e9e21fada..000000000 --- a/src/spicelib/devices/csw/cswacld.c +++ /dev/null @@ -1,35 +0,0 @@ -/********** -Copyright 1990 Regents of the University of California. All rights reserved. -Author: 1985 Gordon Jacobs -**********/ - -#include "ngspice/ngspice.h" -#include "ngspice/cktdefs.h" -#include "cswdefs.h" -#include "ngspice/sperror.h" -#include "ngspice/suffix.h" - - -int -CSWacLoad(GENmodel *inModel, CKTcircuit *ckt) -{ - CSWmodel *model = (CSWmodel *) inModel; - CSWinstance *here; - double g_now; - int current_state; - - for (; model; model = CSWnextModel(model)) - for (here = CSWinstances(model); here; here = CSWnextInstance(here)) { - - current_state = (int) ckt->CKTstate0[here->CSWswitchstate]; - - g_now = current_state ? model->CSWonConduct : model->CSWoffConduct; - - *(here->CSWposPosPtr) += g_now; - *(here->CSWposNegPtr) -= g_now; - *(here->CSWnegPosPtr) -= g_now; - *(here->CSWnegNegPtr) += g_now; - } - - return OK; -} diff --git a/src/spicelib/devices/csw/cswask.c b/src/spicelib/devices/csw/cswask.c deleted file mode 100644 index 104c8920c..000000000 --- a/src/spicelib/devices/csw/cswask.c +++ /dev/null @@ -1,69 +0,0 @@ -/********** -Copyright 1990 Regents of the University of California. All rights reserved. -Author: 1987 Thomas L. Quarles -**********/ - -/* - * This routine gives access to the internal device parameters - * of Current controlled SWitch - */ - -#include "ngspice/ngspice.h" -#include "ngspice/cktdefs.h" -#include "ngspice/devdefs.h" -#include "ngspice/ifsim.h" -#include "cswdefs.h" -#include "ngspice/sperror.h" -#include "ngspice/suffix.h" - - -int -CSWask(CKTcircuit *ckt, GENinstance *inst, int which, IFvalue *value, IFvalue *select) -{ - CSWinstance *here = (CSWinstance *) inst; - static char *msg = "Current and power not available in ac analysis"; - - NG_IGNORE(select); - - switch (which) { - case CSW_CONTROL: - value->uValue = here->CSWcontName; - return OK; - case CSW_POS_NODE: - value->iValue = here->CSWposNode; - return OK; - case CSW_NEG_NODE: - value->iValue = here->CSWnegNode; - return OK; - case CSW_CURRENT: - if (ckt->CKTcurrentAnalysis & DOING_AC) { - errMsg = TMALLOC(char, strlen(msg) + 1); - errRtn = "CSWask"; - strcpy(errMsg, msg); - return E_ASKCURRENT; - } else { - value->rValue = - (ckt->CKTrhsOld[here->CSWposNode] - - ckt->CKTrhsOld[here->CSWnegNode]) * - here->CSWcond; - } - return OK; - case CSW_POWER: - if (ckt->CKTcurrentAnalysis & DOING_AC) { - errMsg = TMALLOC(char, strlen(msg) + 1); - errRtn = "CSWask"; - strcpy(errMsg, msg); - return E_ASKPOWER; - } else { - value->rValue = - (ckt->CKTrhsOld[here->CSWposNode] - - ckt->CKTrhsOld[here->CSWnegNode]) * - (ckt->CKTrhsOld[here->CSWposNode] - - ckt->CKTrhsOld[here->CSWnegNode]) * - here->CSWcond; - } - return OK; - default: - return E_BADPARM; - } -} diff --git a/src/spicelib/devices/csw/cswdefs.h b/src/spicelib/devices/csw/cswdefs.h deleted file mode 100644 index 30fc08568..000000000 --- a/src/spicelib/devices/csw/cswdefs.h +++ /dev/null @@ -1,115 +0,0 @@ -/********** -Copyright 1990 Regents of the University of California. All rights reserved. -Author: 1985 Gordon M. Jacobs -Modified: 2000 AlansFixes -**********/ - -#ifndef CSW -#define CSW - -#include "ngspice/ifsim.h" -#include "ngspice/gendefs.h" -#include "ngspice/cktdefs.h" -#include "ngspice/noisedef.h" -#include "ngspice/complex.h" - -/* structures used to describe current controlled switches */ - - -/* information to describe each instance */ - -typedef struct sCSWinstance { - - struct GENinstance gen; - -#define CSWmodPtr(inst) ((struct sCSWmodel *)((inst)->gen.GENmodPtr)) -#define CSWnextInstance(inst) ((struct sCSWinstance *)((inst)->gen.GENnextInstance)) -#define CSWname gen.GENname -#define CSWstate gen.GENstate - - const int CSWposNode; /* number of positive node of switch */ - const int CSWnegNode; /* number of negative node of switch */ - int CSWcontBranch; /* number of branch of controlling current */ - - IFuid CSWcontName; /* name of controlling source */ - - double *CSWposPosPtr; /* pointer to sparse matrix diagonal at - (positive,positive) for switch conductance */ - double *CSWnegPosPtr; /* pointer to sparse matrix offdiagonal at - (neagtive,positive) for switch conductance */ - double *CSWposNegPtr; /* pointer to sparse matrix offdiagonal at - (positive,neagtive) for switch conductance */ - double *CSWnegNegPtr; /* pointer to sparse matrix diagonal at - (neagtive,neagtive) for switch conductance */ - - double CSWcond; /* current conductance of switch */ - - unsigned CSWzero_stateGiven : 1; /* flag to indicate initial state */ -#ifndef NONOISE - double CSWnVar[NSTATVARS]; -#else - double *CSWnVar; -#endif -} CSWinstance; - -/* data per model */ - -#define CSW_ON_CONDUCTANCE 1.0 /* default on conductance = 1 mho */ -#define CSW_OFF_CONDUCTANCE ckt->CKTgmin /* default off conductance */ -#define CSW_NUM_STATES 2 - -#define CSWswitchstate CSWstate+0 -#define CSWctrlvalue CSWstate+1 - - -typedef struct sCSWmodel { /* model structure for a switch */ - - struct GENmodel gen; - -#define CSWmodType gen.GENmodType -#define CSWnextModel(inst) ((struct sCSWmodel *)((inst)->gen.GENnextModel)) -#define CSWinstances(inst) ((CSWinstance *) ((inst)->gen.GENinstances)) -#define CSWmodName gen.GENmodName - - double CSWonResistance; /* switch "on" resistance */ - double CSWoffResistance; /* switch "off" resistance */ - double CSWiThreshold; /* switching threshold current */ - double CSWiHysteresis; /* switching hysteresis current */ - double CSWonConduct; /* switch "on" conductance */ - double CSWoffConduct; /* switch "off" conductance */ - - unsigned CSWonGiven : 1; /* flag to indicate on-resistance was specified */ - unsigned CSWoffGiven : 1; /* flag to indicate off-resistance was " */ - unsigned CSWthreshGiven : 1; /* flag to indicate threshold volt was given */ - unsigned CSWhystGiven : 1; /* flag to indicate hysteresis volt was given */ -} CSWmodel; - -/* device parameters */ -enum { - CSW_CONTROL = 1, - CSW_IC_ON, - CSW_IC_OFF, - CSW_POS_NODE, - CSW_NEG_NODE, - CSW_CURRENT, - CSW_POWER, -}; - -/* model parameters */ -enum { - CSW_CSW = 101, - CSW_RON, - CSW_ROFF, - CSW_ITH, - CSW_IHYS, - CSW_GON, - CSW_GOFF, -}; - -/* device questions */ - -/* model questions */ - -#include "cswext.h" - -#endif diff --git a/src/spicelib/devices/csw/cswext.h b/src/spicelib/devices/csw/cswext.h deleted file mode 100644 index c5f1d3196..000000000 --- a/src/spicelib/devices/csw/cswext.h +++ /dev/null @@ -1,16 +0,0 @@ -/********** -Copyright 1990 Regents of the University of California. All rights reserved. -Author: 1985 Gordon M. Jacobs -Modified: 2000 AlansFixes -**********/ - -extern int CSWask(CKTcircuit *, GENinstance *, int, IFvalue *, IFvalue *); -extern int CSWacLoad(GENmodel *, CKTcircuit *); -extern int CSWload(GENmodel *, CKTcircuit *); -extern int CSWmAsk(CKTcircuit *, GENmodel *, int, IFvalue *); -extern int CSWmParam(int, IFvalue *, GENmodel *); -extern int CSWparam(int, IFvalue *, GENinstance *, IFvalue *); -extern int CSWpzLoad(GENmodel *, CKTcircuit *, SPcomplex *); -extern int CSWsetup(SMPmatrix *, GENmodel *, CKTcircuit *, int *); -extern int CSWnoise(int, int, GENmodel *, CKTcircuit *, Ndata *, double *); -extern int CSWtrunc(GENmodel *, CKTcircuit *, double *); diff --git a/src/spicelib/devices/csw/cswinit.c b/src/spicelib/devices/csw/cswinit.c deleted file mode 100644 index fe69c1a82..000000000 --- a/src/spicelib/devices/csw/cswinit.c +++ /dev/null @@ -1,78 +0,0 @@ -/* Modified: 2000 AlansFixes */ - -#include "ngspice/config.h" - -#include "ngspice/devdefs.h" - -#include "cswitf.h" -#include "cswext.h" -#include "cswinit.h" - - -SPICEdev CSWinfo = { - .DEVpublic = { - .name = "CSwitch", - .description = "Current controlled ideal switch", - .terms = &CSWnSize, - .numNames = &CSWnSize, - .termNames = CSWnames, - .numInstanceParms = &CSWpTSize, - .instanceParms = CSWpTable, - .numModelParms = &CSWmPTSize, - .modelParms = CSWmPTable, - .flags = 0, - -#ifdef XSPICE - .cm_func = NULL, - .num_conn = 0, - .conn = NULL, - .num_param = 0, - .param = NULL, - .num_inst_var = 0, - .inst_var = NULL, -#endif - }, - - .DEVparam = CSWparam, - .DEVmodParam = CSWmParam, - .DEVload = CSWload, - .DEVsetup = CSWsetup, - .DEVunsetup = NULL, - .DEVpzSetup = CSWsetup, - .DEVtemperature = NULL, - .DEVtrunc = CSWtrunc, - .DEVfindBranch = NULL, - .DEVacLoad = CSWacLoad, - .DEVaccept = NULL, - .DEVdestroy = NULL, - .DEVmodDelete = NULL, - .DEVdelete = NULL, - .DEVsetic = NULL, - .DEVask = CSWask, - .DEVmodAsk = CSWmAsk, - .DEVpzLoad = CSWpzLoad, - .DEVconvTest = NULL, - .DEVsenSetup = NULL, - .DEVsenLoad = NULL, - .DEVsenUpdate = NULL, - .DEVsenAcLoad = NULL, - .DEVsenPrint = NULL, - .DEVsenTrunc = NULL, - .DEVdisto = NULL, - .DEVnoise = CSWnoise, - .DEVsoaCheck = NULL, - .DEVinstSize = &CSWiSize, - .DEVmodSize = &CSWmSize, - -#ifdef CIDER - .DEVdump = NULL, - .DEVacct = NULL, -#endif -}; - - -SPICEdev * -get_csw_info(void) -{ - return &CSWinfo; -} diff --git a/src/spicelib/devices/csw/cswinit.h b/src/spicelib/devices/csw/cswinit.h deleted file mode 100644 index 2a08e4e68..000000000 --- a/src/spicelib/devices/csw/cswinit.h +++ /dev/null @@ -1,13 +0,0 @@ -#ifndef _CSWINIT_H -#define _CSWINIT_H - -extern IFparm CSWpTable[]; -extern IFparm CSWmPTable[]; -extern char *CSWnames[]; -extern int CSWpTSize; -extern int CSWmPTSize; -extern int CSWnSize; -extern int CSWiSize; -extern int CSWmSize; - -#endif diff --git a/src/spicelib/devices/csw/cswitf.h b/src/spicelib/devices/csw/cswitf.h deleted file mode 100644 index b8a6960ff..000000000 --- a/src/spicelib/devices/csw/cswitf.h +++ /dev/null @@ -1,9 +0,0 @@ -/********** -Copyright 1990 Regents of the University of California. All rights reserved. -**********/ -#ifndef DEV_CSW -#define DEV_CSW - -extern SPICEdev *get_csw_info(void); - -#endif diff --git a/src/spicelib/devices/csw/cswload.c b/src/spicelib/devices/csw/cswload.c deleted file mode 100644 index 4d6516177..000000000 --- a/src/spicelib/devices/csw/cswload.c +++ /dev/null @@ -1,150 +0,0 @@ -/********** -Copyright 1990 Regents of the University of California. All rights reserved. -Author: 1985 Gordon Jacobs -Modified: 2001 Jon Engelbert -**********/ - -#include "ngspice/ngspice.h" -#include "ngspice/cktdefs.h" -#include "cswdefs.h" -#include "ngspice/fteext.h" -#include "ngspice/trandefs.h" -#include "ngspice/sperror.h" -#include "ngspice/suffix.h" - - -int -CSWload(GENmodel *inModel, CKTcircuit *ckt) -{ - CSWmodel *model = (CSWmodel *) inModel; - CSWinstance *here; - double g_now; - double i_ctrl; - double previous_state = -1; - double current_state = -1, old_current_state = -1; - double REALLY_OFF = 0, REALLY_ON = 1; - /* switch is on or off, not in hysteresis region. */ - double HYST_OFF = 2, HYST_ON = 3; - /* switch is on or off while control value is in hysteresis region. */ - - for (; model; model = CSWnextModel(model)) - for (here = CSWinstances(model); here; here = CSWnextInstance(here)) { - - old_current_state = ckt->CKTstate0[here->CSWswitchstate]; - previous_state = ckt->CKTstate1[here->CSWswitchstate]; - i_ctrl = ckt->CKTrhsOld[here->CSWcontBranch]; - - /* decide the state of the switch */ - - if (ckt->CKTmode & (MODEINITFIX | MODEINITJCT)) { - - if (here->CSWzero_stateGiven) { - /* switch specified "on" */ - if (model->CSWiHysteresis >= 0 && i_ctrl > model->CSWiThreshold + model->CSWiHysteresis) - current_state = REALLY_ON; - else if (model->CSWiHysteresis < 0 && i_ctrl > model->CSWiThreshold - model->CSWiHysteresis) - current_state = REALLY_ON; - else - current_state = HYST_ON; - } else { - if (model->CSWiHysteresis >= 0 && i_ctrl < model->CSWiThreshold - model->CSWiHysteresis) - current_state = REALLY_OFF; - else if (model->CSWiHysteresis < 0 && i_ctrl < model->CSWiThreshold + model->CSWiHysteresis) - current_state = REALLY_OFF; - else - current_state = HYST_OFF; - } - - } else if (ckt->CKTmode & (MODEINITSMSIG)) { - - current_state = previous_state; - - } else if (ckt->CKTmode & (MODEINITFLOAT)) { - /* use state0 since INITTRAN or INITPRED already called */ - - if (model->CSWiHysteresis > 0) { - if (i_ctrl > (model->CSWiThreshold + model->CSWiHysteresis)) - current_state = REALLY_ON; - else if (i_ctrl < (model->CSWiThreshold - model->CSWiHysteresis)) - current_state = REALLY_OFF; - else - current_state = previous_state; - } else { - if (i_ctrl > (model->CSWiThreshold - model->CSWiHysteresis)) - current_state = REALLY_ON; - else if (i_ctrl < (model->CSWiThreshold + model->CSWiHysteresis)) - current_state = REALLY_OFF; - else { - /* in hysteresis... change value if going from low to hysteresis, - * or from hi to hysteresis. */ - - /* if previous state was in hysteresis, then don't change the state.. */ - if (previous_state == HYST_OFF || previous_state == HYST_ON) - current_state = previous_state; - else if (previous_state == REALLY_ON) - current_state = HYST_OFF; - else if (previous_state == REALLY_OFF) - current_state = HYST_ON; - else - internalerror("bad value for previous region in swload"); - } - } - - if (current_state != old_current_state) { - ckt->CKTnoncon++; /* ensure one more iteration */ - ckt->CKTtroubleElt = (GENinstance *) here; - } - - } else if (ckt->CKTmode & (MODEINITTRAN | MODEINITPRED)) { - - if (model->CSWiHysteresis > 0) { - if (i_ctrl > (model->CSWiThreshold + model->CSWiHysteresis)) - current_state = REALLY_ON; - else if (i_ctrl < (model->CSWiThreshold - model->CSWiHysteresis)) - current_state = REALLY_OFF; - else - current_state = previous_state; - } else { - if (i_ctrl > (model->CSWiThreshold - model->CSWiHysteresis)) - current_state = REALLY_ON; - else if (i_ctrl < (model->CSWiThreshold + model->CSWiHysteresis)) - current_state = REALLY_OFF; - else { - /* in hysteresis... change value if going from low to hysteresis, - * or from hi to hysteresis. */ - - /* if previous state was in hysteresis, then don't change the state.. */ - if (previous_state == HYST_OFF || previous_state == HYST_ON) - current_state = previous_state; - else if (previous_state == REALLY_ON) - current_state = HYST_OFF; - else if (previous_state == REALLY_OFF) - current_state = HYST_ON; - else - internalerror("bad value for previous region in cswload"); - } - } - } - - ckt->CKTstate0[here->CSWswitchstate] = current_state; - ckt->CKTstate1[here->CSWswitchstate] = previous_state; - -// ckt->CKTstate0[here->CSWctrlvalue] = i_ctrl; - /* FIXME: without this statement truncation is not used, as with SW. - But test are needed to check if improvments are possible. */ - - if (current_state == REALLY_ON || current_state == HYST_ON) - g_now = model->CSWonConduct; - else - g_now = model->CSWoffConduct; - - here->CSWcond = g_now; - - *(here->CSWposPosPtr) += g_now; - *(here->CSWposNegPtr) -= g_now; - *(here->CSWnegPosPtr) -= g_now; - *(here->CSWnegNegPtr) += g_now; - } - - return OK; -} diff --git a/src/spicelib/devices/csw/cswmask.c b/src/spicelib/devices/csw/cswmask.c deleted file mode 100644 index ae5f9d693..000000000 --- a/src/spicelib/devices/csw/cswmask.c +++ /dev/null @@ -1,49 +0,0 @@ -/********** -Copyright 1990 Regents of the University of California. All rights reserved. -Author: 1987 Thomas L. Quarles -**********/ - -/* - * This routine gives access to the internal model parameters - * of Current controlled SWitch - */ - -#include "ngspice/ngspice.h" -#include "ngspice/cktdefs.h" -#include "ngspice/devdefs.h" -#include "ngspice/ifsim.h" -#include "cswdefs.h" -#include "ngspice/sperror.h" -#include "ngspice/suffix.h" - - -int -CSWmAsk(CKTcircuit *ckt, GENmodel *inst, int which, IFvalue *value) -{ - CSWmodel *here = (CSWmodel *) inst; - - NG_IGNORE(ckt); - - switch (which) { - case CSW_RON: - value->rValue = here->CSWonResistance; - return OK; - case CSW_ROFF: - value->rValue = here->CSWoffResistance; - return OK; - case CSW_ITH: - value->rValue = here->CSWiThreshold; - return OK; - case CSW_IHYS: - value->rValue = here->CSWiHysteresis; - return OK; - case CSW_GON: - value->rValue = here->CSWonConduct; - return OK; - case CSW_GOFF: - value->rValue = here->CSWoffConduct; - return OK; - default: - return E_BADPARM; - } -} diff --git a/src/spicelib/devices/csw/cswmpar.c b/src/spicelib/devices/csw/cswmpar.c deleted file mode 100644 index 8c6e13a08..000000000 --- a/src/spicelib/devices/csw/cswmpar.c +++ /dev/null @@ -1,48 +0,0 @@ -/********** -Copyright 1990 Regents of the University of California. All rights reserved. -Author: 1985 Gordon Jacobs -Modified: 2001 Jon Englebert -**********/ - -#include "ngspice/ngspice.h" -#include "ngspice/ifsim.h" -#include "cswdefs.h" -#include "ngspice/sperror.h" -#include "ngspice/suffix.h" - - -int -CSWmParam(int param, IFvalue *value, GENmodel *inModel) -{ - CSWmodel *model = (CSWmodel *) inModel; - - switch (param) { - case CSW_CSW: - /* just says that this is a switch */ - break; - case CSW_RON: - model->CSWonResistance = value->rValue; - model->CSWonConduct = 1.0 / value->rValue; - model->CSWonGiven = TRUE; - break; - case CSW_ROFF: - model->CSWoffResistance = value->rValue; - model->CSWoffConduct = 1.0 / value->rValue; - model->CSWoffGiven = TRUE; - break; - case CSW_ITH: - model->CSWiThreshold = value->rValue; - model->CSWthreshGiven = TRUE; - break; - case CSW_IHYS: - /* take absolute value of hysteresis voltage */ - /* model->CSWiHysteresis = fabs(value->rValue); */ - model->CSWiHysteresis = value->rValue; - model->CSWhystGiven = TRUE; - break; - default: - return E_BADPARM; - } - - return OK; -} diff --git a/src/spicelib/devices/csw/cswnoise.c b/src/spicelib/devices/csw/cswnoise.c deleted file mode 100644 index 732383c9a..000000000 --- a/src/spicelib/devices/csw/cswnoise.c +++ /dev/null @@ -1,115 +0,0 @@ -/********** -Copyright 1990 Regents of the University of California. All rights reserved. -Author: 1987 Gary W. Ng -**********/ - -#include "ngspice/ngspice.h" -#include "cswdefs.h" -#include "ngspice/cktdefs.h" -#include "ngspice/iferrmsg.h" -#include "ngspice/noisedef.h" -#include "ngspice/suffix.h" - -/* - * CSWnoise (mode, operation, firstModel, ckt, data, OnDens) - * This routine names and evaluates all of the noise sources - * associated with current- controlled switches. It starts with the - * model *firstModel and traverses all of its instances. It then - * proceeds to any other models on the linked list. The total output - * noise density generated by the CSW's is summed in the variable - * "OnDens". - */ - - -int -CSWnoise(int mode, int operation, GENmodel *genmodel, CKTcircuit *ckt, Ndata *data, double *OnDens) -{ - NOISEAN *job = (NOISEAN *) ckt->CKTcurJob; - - CSWmodel *firstModel = (CSWmodel *) genmodel; - CSWmodel *model; - CSWinstance *inst; - double tempOutNoise; - double tempInNoise; - double noizDens; - double lnNdens; - int current_state; - - for (model = firstModel; model; model = CSWnextModel(model)) - for (inst = CSWinstances(model); inst; inst = CSWnextInstance(inst)) { - - switch (operation) { - - case N_OPEN: - - /* see if we have to to produce a summary report */ - /* if so, name the noise generator */ - - if (job->NStpsSm != 0) - switch (mode) { - case N_DENS: - NOISE_ADD_OUTVAR(ckt, data, "onoise_%s%s", inst->CSWname, ""); - break; - case INT_NOIZ: - NOISE_ADD_OUTVAR(ckt, data, "onoise_total_%s%s", inst->CSWname, ""); - NOISE_ADD_OUTVAR(ckt, data, "inoise_total_%s%s", inst->CSWname, ""); - break; - } - break; - - case N_CALC: - switch (mode) { - - case N_DENS: - current_state = (int) ckt->CKTstate0[inst->CSWswitchstate]; - NevalSrc(&noizDens, &lnNdens, ckt, THERMNOISE, - inst->CSWposNode, inst->CSWnegNode, - current_state ? model->CSWonConduct : model->CSWoffConduct); - - *OnDens += noizDens; - - if (data->delFreq == 0.0) { - - /* if we haven't done any previous integration, we need to */ - /* initialize our "history" variables */ - - inst->CSWnVar[LNLSTDENS] = lnNdens; - - /* clear out our integration variable if it's the first pass */ - - if (data->freq == job->NstartFreq) - inst->CSWnVar[OUTNOIZ] = 0.0; - } else { /* data->delFreq != 0.0 (we have to integrate) */ - tempOutNoise = Nintegrate(noizDens, lnNdens, - inst->CSWnVar[LNLSTDENS], data); - tempInNoise = Nintegrate(noizDens * - data->GainSqInv, lnNdens + data->lnGainInv, - inst->CSWnVar[LNLSTDENS] + data->lnGainInv, - data); - inst->CSWnVar[OUTNOIZ] += tempOutNoise; - inst->CSWnVar[INNOIZ] += tempInNoise; - data->outNoiz += tempOutNoise; - data->inNoise += tempInNoise; - inst->CSWnVar[LNLSTDENS] = lnNdens; - } - if (data->prtSummary) - data->outpVector[data->outNumber++] = noizDens; - break; - - case INT_NOIZ: /* already calculated, just output */ - if (job->NStpsSm != 0) { - data->outpVector[data->outNumber++] = inst->CSWnVar[OUTNOIZ]; - data->outpVector[data->outNumber++] = inst->CSWnVar[INNOIZ]; - } - break; - } - break; - - case N_CLOSE: - return OK; /* do nothing, the main calling routine will close */ - break; /* the plots */ - } - } - - return OK; -} diff --git a/src/spicelib/devices/csw/cswparam.c b/src/spicelib/devices/csw/cswparam.c deleted file mode 100644 index b52f1419c..000000000 --- a/src/spicelib/devices/csw/cswparam.c +++ /dev/null @@ -1,37 +0,0 @@ -/********** -Copyright 1990 Regents of the University of California. All rights reserved. -Author: 1985 Gordon Jacobs -**********/ - -#include "ngspice/ngspice.h" -#include "cswdefs.h" -#include "ngspice/ifsim.h" -#include "ngspice/sperror.h" -#include "ngspice/suffix.h" - - -int -CSWparam(int param, IFvalue *value, GENinstance *inst, IFvalue *select) -{ - CSWinstance *here = (CSWinstance *) inst; - - NG_IGNORE(select); - - switch (param) { - case CSW_CONTROL: - here->CSWcontName = value->uValue; - break; - case CSW_IC_ON: - if (value->iValue) - here->CSWzero_stateGiven = TRUE; - break; - case CSW_IC_OFF: - if (value->iValue) - here->CSWzero_stateGiven = FALSE; - break; - default: - return E_BADPARM; - } - - return OK; -} diff --git a/src/spicelib/devices/csw/cswpzld.c b/src/spicelib/devices/csw/cswpzld.c deleted file mode 100644 index 065cefec0..000000000 --- a/src/spicelib/devices/csw/cswpzld.c +++ /dev/null @@ -1,38 +0,0 @@ -/********** -Copyright 1990 Regents of the University of California. All rights reserved. -Author: 1985 Gordon Jacobs -**********/ - -#include "ngspice/ngspice.h" -#include "ngspice/cktdefs.h" -#include "cswdefs.h" -#include "ngspice/sperror.h" -#include "ngspice/complex.h" -#include "ngspice/suffix.h" - - -int -CSWpzLoad(GENmodel *inModel, CKTcircuit *ckt, SPcomplex *s) -{ - CSWmodel *model = (CSWmodel *) inModel; - CSWinstance *here; - double g_now; - int current_state; - - NG_IGNORE(s); - - for (; model; model = CSWnextModel(model)) - for (here = CSWinstances(model); here; here = CSWnextInstance(here)) { - - current_state = (int) ckt->CKTstate0[here->CSWswitchstate]; - - g_now = current_state ? model->CSWonConduct : model->CSWoffConduct; - - *(here->CSWposPosPtr) += g_now; - *(here->CSWposNegPtr) -= g_now; - *(here->CSWnegPosPtr) -= g_now; - *(here->CSWnegNegPtr) += g_now; - } - - return OK; -} diff --git a/src/spicelib/devices/csw/cswsetup.c b/src/spicelib/devices/csw/cswsetup.c deleted file mode 100644 index 7b3e3405e..000000000 --- a/src/spicelib/devices/csw/cswsetup.c +++ /dev/null @@ -1,62 +0,0 @@ -/********** -Copyright 1990 Regents of the University of California. All rights reserved. -Author: 1985 Gordon Jacobs -**********/ - -#include "ngspice/ngspice.h" -#include "ngspice/cktdefs.h" -#include "cswdefs.h" -#include "ngspice/sperror.h" -#include "ngspice/suffix.h" - -#define TSTALLOC(ptr, first, second) \ - do { \ - if ((here->ptr = SMPmakeElt(matrix, here->first, here->second)) == NULL) \ - return E_NOMEM; \ - } while (0) - - -int -CSWsetup(SMPmatrix *matrix, GENmodel *inModel, CKTcircuit *ckt, int *states) -{ - CSWmodel *model = (CSWmodel *) inModel; - CSWinstance *here; - - for (; model; model = CSWnextModel(model)) { - - /* Default Value Processing for Switch Model */ - if (!model->CSWthreshGiven) - model->CSWiThreshold = 0; - if (!model->CSWhystGiven) - model->CSWiHysteresis = 0; - if (!model->CSWonGiven) { - model->CSWonConduct = CSW_ON_CONDUCTANCE; - model->CSWonResistance = 1.0 / model->CSWonConduct; - } - if (!model->CSWoffGiven) { - model->CSWoffConduct = CSW_OFF_CONDUCTANCE; - model->CSWoffResistance = 1.0 / model->CSWoffConduct; - } - - for (here = CSWinstances(model); here; here = CSWnextInstance(here)) { - - /* Default Value Processing for Switch Instance */ - here->CSWstate = *states; - *states += CSW_NUM_STATES; - - here->CSWcontBranch = CKTfndBranch(ckt, here->CSWcontName); - if (here->CSWcontBranch == 0) { - SPfrontEnd->IFerrorf(ERR_FATAL, - "%s: unknown controlling source %s", here->CSWname, here->CSWcontName); - return E_BADPARM; - } - - TSTALLOC(CSWposPosPtr, CSWposNode, CSWposNode); - TSTALLOC(CSWposNegPtr, CSWposNode, CSWnegNode); - TSTALLOC(CSWnegPosPtr, CSWnegNode, CSWposNode); - TSTALLOC(CSWnegNegPtr, CSWnegNode, CSWnegNode); - } - } - - return OK; -} diff --git a/src/spicelib/devices/csw/cswtrunc.c b/src/spicelib/devices/csw/cswtrunc.c deleted file mode 100644 index e7be9559f..000000000 --- a/src/spicelib/devices/csw/cswtrunc.c +++ /dev/null @@ -1,52 +0,0 @@ -/********** -Copyright 1990 Regents of the University of California. All rights reserved. -Author: 1985 Thomas L. Quarles -Modified: 2000 AlansFixes -**********/ - -#include "ngspice/ngspice.h" -#include "ngspice/cktdefs.h" -#include "ngspice/sperror.h" -#include "ngspice/suffix.h" - -#include "cswdefs.h" - - -int -CSWtrunc(GENmodel *inModel, CKTcircuit *ckt, double *timeStep) -{ - CSWmodel *model = (CSWmodel *) inModel; - CSWinstance *here; - - double lastChange, maxChange, maxStep, ref; - - for (; model; model = CSWnextModel(model)) - for (here = CSWinstances(model); here; here = CSWnextInstance(here)) { - lastChange = - ckt->CKTstate0[here->CSWctrlvalue] - - ckt->CKTstate1[here->CSWctrlvalue]; - if (ckt->CKTstate0[here->CSWswitchstate] == 0) { - ref = model->CSWiThreshold + model->CSWiHysteresis; - if (ckt->CKTstate0[here->CSWctrlvalue] < ref && lastChange > 0) { - maxChange = - (ref - ckt->CKTstate0[here->CSWctrlvalue]) * 0.75 - + 0.00005; - maxStep = maxChange / lastChange * ckt->CKTdeltaOld[0]; - if (*timeStep > maxStep) - *timeStep = maxStep; - } - } else { - ref = model->CSWiThreshold - model->CSWiHysteresis; - if (ckt->CKTstate0[here->CSWctrlvalue] > ref && lastChange < 0) { - maxChange = - (ref - ckt->CKTstate0[here->CSWctrlvalue]) * 0.75 - - 0.00005; - maxStep = maxChange / lastChange * ckt->CKTdeltaOld[0]; - if (*timeStep > maxStep) - *timeStep = maxStep; - } - } - } - - return OK; -} diff --git a/src/spicelib/devices/dev.c b/src/spicelib/devices/dev.c index 43b5180c9..71c19bbe2 100644 --- a/src/spicelib/devices/dev.c +++ b/src/spicelib/devices/dev.c @@ -74,156 +74,27 @@ extern struct coreInfo_t coreInfo; /* cmexport.c */ #endif -#include "asrc/asrcitf.h" #include "bjt/bjtitf.h" -#include "bsim1/bsim1itf.h" -#include "bsim2/bsim2itf.h" -#include "bsim3/bsim3itf.h" -#include "bsim3v0/bsim3v0itf.h" -#include "bsim3v1/bsim3v1itf.h" -#include "bsim3v32/bsim3v32itf.h" -#include "bsim4/bsim4itf.h" -#include "bsim4v5/bsim4v5itf.h" -#include "bsim4v6/bsim4v6itf.h" -#include "bsim4v7/bsim4v7itf.h" -#include "bsim3soi_pd/b3soipditf.h" -#include "bsim3soi_fd/b3soifditf.h" -#include "bsim3soi_dd/b3soidditf.h" -#include "bsimsoi/b4soiitf.h" #include "cap/capitf.h" -#include "cccs/cccsitf.h" -#include "ccvs/ccvsitf.h" -#include "csw/cswitf.h" #include "dio/dioitf.h" -#include "hfet1/hfetitf.h" -#include "hfet2/hfet2itf.h" -#include "hicum2/hicum2itf.h" -#include "hisim2/hsm2itf.h" -#include "hisimhv1/hsmhvitf.h" -#include "hisimhv2/hsmhv2itf.h" #include "ind/inditf.h" #include "isrc/isrcitf.h" -#include "jfet/jfetitf.h" -#include "jfet2/jfet2itf.h" -#include "ltra/ltraitf.h" -#include "mes/mesitf.h" -#include "mesa/mesaitf.h" #include "mos1/mos1itf.h" -#include "mos2/mos2itf.h" -#include "mos3/mos3itf.h" -#include "mos6/mos6itf.h" -#include "mos9/mos9itf.h" -#include "cpl/cplitf.h" #include "res/resitf.h" -#include "soi3/soi3itf.h" -#include "sw/switf.h" -#include "tra/traitf.h" -#include "txl/txlitf.h" -#include "urc/urcitf.h" -#include "vbic/vbicitf.h" -#include "vccs/vccsitf.h" -#include "vcvs/vcvsitf.h" #include "vsrc/vsrcitf.h" -#include "vdmos/vdmositf.h" -#ifdef ADMS -#include "adms/hicum0/hicum0itf.h" -#include "adms/mextram/bjt504titf.h" -#include "adms/ekv/ekvitf.h" -#include "adms/psp102/psp102itf.h" -#include "adms/psp103/psp103itf.h" -#include "adms/bsimbulk/bsimbulkitf.h" -#include "adms/bsimcmg/bsimcmgitf.h" -#include "adms/r2_cmc/r2_cmcitf.h" -#endif -#ifdef CIDER -/* Numerical devices (Cider integration) */ -#include "nbjt/nbjtitf.h" -#include "nbjt2/nbjt2itf.h" -#include "numd/numditf.h" -#include "numd2/numd2itf.h" -#include "numos/numositf.h" -#endif -#ifdef NDEV -#include "ndev/ndevitf.h" -#endif static SPICEdev *(*static_devices[])(void) = { /* URC device MUST precede both resistors and capacitors */ - get_urc_info, - get_asrc_info, get_bjt_info, - get_bsim1_info, - get_bsim2_info, - get_bsim3_info, - get_bsim3v0_info, - get_bsim3v1_info, - get_bsim3v32_info, - get_b4soi_info, - get_bsim4_info, - get_bsim4v5_info, - get_bsim4v6_info, - get_bsim4v7_info, - get_b3soipd_info, - get_b3soifd_info, - get_b3soidd_info, get_cap_info, - get_cccs_info, - get_ccvs_info, - get_cpl_info, - get_csw_info, get_dio_info, - get_hfeta_info, - get_hfet2_info, - get_hicum_info, - get_hsm2_info, - get_hsmhv_info, - get_hsmhv2_info, get_ind_info, get_mut_info, get_isrc_info, - get_jfet_info, - get_jfet2_info, - get_ltra_info, - get_mes_info, - get_mesa_info, get_mos1_info, - get_mos2_info, - get_mos3_info, - get_mos6_info, - get_mos9_info, get_res_info, - get_soi3_info, - get_sw_info, - get_tra_info, - get_txl_info, - get_vbic_info, - get_vccs_info, - get_vcvs_info, get_vsrc_info, - get_vdmos_info, -#ifdef CIDER - get_nbjt_info, - get_nbjt2_info, - get_numd_info, - get_numd2_info, - get_numos_info, -#endif - -#ifdef ADMS - (SPICEdev *(*)(void)) get_hicum0_info, - (SPICEdev *(*)(void)) get_bjt504t_info, - (SPICEdev *(*)(void)) get_ekv_info, - (SPICEdev *(*)(void)) get_psp102_info, - (SPICEdev *(*)(void)) get_psp103_info, - (SPICEdev *(*)(void)) get_bsimbulk_info, - (SPICEdev *(*)(void)) get_bsimcmg_info, - (SPICEdev *(*)(void)) get_r2_cmc_info, -#endif - -#ifdef NDEV - get_ndev_info, -#endif }; diff --git a/src/spicelib/devices/hfet1/Makefile.am b/src/spicelib/devices/hfet1/Makefile.am deleted file mode 100644 index 6c777ab20..000000000 --- a/src/spicelib/devices/hfet1/Makefile.am +++ /dev/null @@ -1,28 +0,0 @@ -## Process this file with automake to produce Makefile.in - -noinst_LTLIBRARIES = libhfet.la - -libhfet_la_SOURCES = \ - hfet.c \ - hfetacl.c \ - hfetask.c \ - hfetdefs.h \ - hfetext.h \ - hfetgetic.c \ - hfetinit.c \ - hfetinit.h \ - hfetitf.h \ - hfetload.c \ - hfetmask.c \ - hfetmpar.c \ - hfetparam.c \ - hfetpzl.c \ - hfetsetup.c \ - hfettemp.c \ - hfettrunc.c - - - -AM_CPPFLAGS = @AM_CPPFLAGS@ -I$(top_srcdir)/src/include -AM_CFLAGS = $(STATIC) -MAINTAINERCLEANFILES = Makefile.in diff --git a/src/spicelib/devices/hfet1/hfet.c b/src/spicelib/devices/hfet1/hfet.c deleted file mode 100644 index bf93b3fc2..000000000 --- a/src/spicelib/devices/hfet1/hfet.c +++ /dev/null @@ -1,126 +0,0 @@ -/********** -Imported from MacSpice3f4 - Antony Wilson -Modified: Paolo Nenzi -**********/ - -#include "ngspice/ngspice.h" -#include "ngspice/ifsim.h" -#include "ngspice/devdefs.h" -#include "hfetdefs.h" -#include "ngspice/suffix.h" - - -IFparm HFETApTable[] = { /* parameters */ - OP("off", HFETA_OFF, IF_FLAG ,"Device initially off"), - IOP("l", HFETA_LENGTH, IF_REAL ,"Length of device"), - IOP("w", HFETA_WIDTH, IF_REAL ,"Width of device"), - IOP("m", HFETA_M, IF_REAL ,"Parallel Multiplier"), - IOP("icvds", HFETA_IC_VDS, IF_REAL ,"Initial D-S voltage"), - IOP("icvgs", HFETA_IC_VGS, IF_REAL ,"Initial G-S voltage"), - IOP("temp", HFETA_TEMP, IF_REAL ,"Instance temperature"), - IOP("dtemp", HFETA_DTEMP, IF_REAL ,"Instance temperature difference"), - OP("dnode", HFETA_DRAINNODE, IF_INTEGER,"Number of drain node"), - OP("gnode", HFETA_GATENODE, IF_INTEGER,"Number of gate node"), - OP("snode", HFETA_SOURCENODE, IF_INTEGER,"Number of source node"), - OP("dprimenode",HFETA_DRAINPRIMENODE, IF_INTEGER,"Number of internal drain node"), - OP("sprimenode",HFETA_SOURCEPRIMENODE,IF_INTEGER,"Number of internal source node"), - OP("vgs", HFETA_VGS, IF_REAL,"Gate-Source voltage"), - OP("vgd", HFETA_VGD, IF_REAL,"Gate-Drain voltage"), - OP("cg", HFETA_CG, IF_REAL,"Gate capacitance"), - OP("cd", HFETA_CD, IF_REAL,"Drain capacitance"), - OP("cgd", HFETA_CGD, IF_REAL,"Gate_Drain capacitance"), - OP("gm", HFETA_GM, IF_REAL,"Transconductance"), - OP("gds", HFETA_GDS, IF_REAL,"Drain-Source conductance"), - OP("ggs", HFETA_GGS, IF_REAL,"Gate-Source conductance"), - OP("ggd", HFETA_GGD, IF_REAL,"Gate-Drain conductance"), - OP("qgs", HFETA_QGS, IF_REAL,"Gate-Source charge storage"), - OP("cqgs", HFETA_CQGS, IF_REAL,"Capacitance due to gate-source charge storage"), - OP("qgd", HFETA_QGD, IF_REAL,"Gate-Drain charge storage"), - OP("cqgd", HFETA_CQGD, IF_REAL,"Capacitance due to gate-drain charge storage"), - OP("cs", HFETA_CS, IF_REAL ,"Source current"), - OP("p", HFETA_POWER, IF_REAL ,"Power dissipated by the mesfet") - -}; - -IFparm HFETAmPTable[] = { /* model parameters */ - IOP( "vt0", HFETA_MOD_VTO, IF_REAL,"Pinch-off voltage"), - IOPR("vto", HFETA_MOD_VTO, IF_REAL,"Pinch-off voltage"), - IOP( "lambda", HFETA_MOD_LAMBDA, IF_REAL,"Output conductance parameter"), - IOP( "rd", HFETA_MOD_RD, IF_REAL,"Drain ohmic resistance"), - IOP( "rs", HFETA_MOD_RS, IF_REAL,"Source ohmic resistance"), - IOP( "rg", HFETA_MOD_RG, IF_REAL,"Gate ohmic resistance"), - IOP( "rdi", HFETA_MOD_RDI, IF_REAL,"Drain ohmic resistance"), - IOP( "rsi", HFETA_MOD_RSI, IF_REAL,"Source ohmic resistance"), - IOP( "rgs", HFETA_MOD_RGS, IF_REAL,"Gate-source ohmic resistance"), - IOP( "rgd", HFETA_MOD_RGD, IF_REAL,"Gate-drain ohmic resistance"), - IOP( "ri", HFETA_MOD_RI, IF_REAL,""), - IOP( "rf", HFETA_MOD_RF, IF_REAL,""), - IOP( "eta", HFETA_MOD_ETA, IF_REAL,"Subthreshold ideality factor"), - IOP( "m", HFETA_MOD_M, IF_REAL,"Knee shape parameter"), - IOP( "mc", HFETA_MOD_MC, IF_REAL,"Knee shape parameter"), - IOP( "gamma", HFETA_MOD_GAMMA, IF_REAL,"Knee shape parameter"), - IOP( "sigma0", HFETA_MOD_SIGMA0, IF_REAL,"Threshold voltage coefficient"), - IOP( "vsigmat", HFETA_MOD_VSIGMAT,IF_REAL,""), - IOP( "vsigma", HFETA_MOD_VSIGMA, IF_REAL,""), - IOP( "mu", HFETA_MOD_MU, IF_REAL,"Moblity"), - IOP( "di", HFETA_MOD_DI, IF_REAL,"Depth of device"), - IOP( "delta", HFETA_MOD_DELTA, IF_REAL,""), - IOP( "vs", HFETA_MOD_VS, IF_REAL,"Saturation velocity"), - IOP( "nmax", HFETA_MOD_NMAX, IF_REAL,""), - IOP( "deltad", HFETA_MOD_DELTAD, IF_REAL,"Thickness correction"), - IOP( "js1d", HFETA_MOD_JS1D, IF_REAL,""), - IOP( "js2d", HFETA_MOD_JS2D, IF_REAL,""), - IOP( "js1s", HFETA_MOD_JS1S, IF_REAL,""), - IOP( "js2s", HFETA_MOD_JS2S, IF_REAL,""), - IOP( "m1d", HFETA_MOD_M1D, IF_REAL,""), - IOP( "m2d", HFETA_MOD_M2D, IF_REAL,""), - IOP( "m1s", HFETA_MOD_M1S, IF_REAL,""), - IOP( "m2s", HFETA_MOD_M2S, IF_REAL,""), - IOP( "epsi", HFETA_MOD_EPSI, IF_REAL,""), - IOP( "p", HFETA_MOD_P, IF_REAL,""), - IOP( "cm3", HFETA_MOD_CM3, IF_REAL,""), - IOP( "a1", HFETA_MOD_A1, IF_REAL,""), - IOP( "a2", HFETA_MOD_A2, IF_REAL,""), - IOP( "mv1", HFETA_MOD_MV1, IF_REAL,""), - IOP( "kappa", HFETA_MOD_KAPPA, IF_REAL,""), - IOP( "delf", HFETA_MOD_DELF, IF_REAL,""), - IOP( "fgds", HFETA_MOD_FGDS, IF_REAL,""), - IOP( "tf", HFETA_MOD_TF, IF_REAL,""), - IOP( "cds", HFETA_MOD_CDS, IF_REAL,""), - IOP( "phib", HFETA_MOD_PHIB, IF_REAL,""), - IOP( "talpha", HFETA_MOD_TALPHA, IF_REAL,""), - IOP( "mt1", HFETA_MOD_MT1, IF_REAL,""), - IOP( "mt2", HFETA_MOD_MT2, IF_REAL,""), - IOP( "ck1", HFETA_MOD_CK1, IF_REAL,""), - IOP( "ck2", HFETA_MOD_CK2, IF_REAL,""), - IOP( "cm1", HFETA_MOD_CM1, IF_REAL,""), - IOP( "cm2", HFETA_MOD_CM2, IF_REAL,""), - IOP( "astar", HFETA_MOD_ASTAR, IF_REAL,""), - IOP( "eta1", HFETA_MOD_ETA1, IF_REAL,""), - IOP( "d1", HFETA_MOD_D1, IF_REAL,""), - IOP( "vt1", HFETA_MOD_VT1, IF_REAL,""), - IOP( "eta2", HFETA_MOD_ETA2, IF_REAL,""), - IOP( "d2", HFETA_MOD_D2, IF_REAL,""), - IOP( "vt2", HFETA_MOD_VT2, IF_REAL,""), - IOP( "ggr", HFETA_MOD_GGR, IF_REAL,""), - IOP( "del", HFETA_MOD_DEL, IF_REAL,""), - IOP( "gatemod", HFETA_MOD_GATEMOD,IF_INTEGER,""), - IOP( "klambda", HFETA_MOD_KLAMBDA, IF_REAL,""), - IOP( "kmu", HFETA_MOD_KMU, IF_REAL,""), - IOP( "kvto", HFETA_MOD_KVTO, IF_REAL,""), - OP( "type", HFETA_MOD_TYPE, IF_STRING, "NHFET or PHFET"), - IOP( "nhfet", HFETA_MOD_NHFET, IF_FLAG,"N HFET device"), - IOP( "phfet", HFETA_MOD_PHFET, IF_FLAG,"P HFET device"), -}; - -char *HFETAnames[] = { - "Drain", - "Gate", - "Source" -}; - -int HFETAnSize = NUMELEMS(HFETAnames); -int HFETApTSize = NUMELEMS(HFETApTable); -int HFETAmPTSize = NUMELEMS(HFETAmPTable); -int HFETAiSize = sizeof(HFETAinstance); -int HFETAmSize = sizeof(HFETAmodel); diff --git a/src/spicelib/devices/hfet1/hfetacl.c b/src/spicelib/devices/hfet1/hfetacl.c deleted file mode 100644 index 727a3eed2..000000000 --- a/src/spicelib/devices/hfet1/hfetacl.c +++ /dev/null @@ -1,94 +0,0 @@ -/********** -Imported from MacSpice3f4 - Antony Wilson -Modified: Paolo Nenzi -**********/ - -#include "ngspice/ngspice.h" -#include "ngspice/cktdefs.h" -#include "hfetdefs.h" -#include "ngspice/sperror.h" -#include "ngspice/suffix.h" - - -int -HFETAacLoad(GENmodel *inModel, CKTcircuit *ckt) -{ - HFETAmodel *model = (HFETAmodel*)inModel; - HFETAinstance *here; - double gm; - double gds; - double xds; - double ggs; - double xgs; - double ggd; - double xgd; - double ggspp; - double ggdpp; - double f; - - double m; - - for( ; model != NULL; model = HFETAnextModel(model)) - { - for( here = HFETAinstances(model); here != NULL; - here = HFETAnextInstance(here)) { - - gm = *(ckt->CKTstate0 + here->HFETAgm); - gds = *(ckt->CKTstate0 + here->HFETAgds); - xds = CDS*ckt->CKTomega; - ggs = *(ckt->CKTstate0 + here->HFETAggs); - xgs = *(ckt->CKTstate0 + here->HFETAqgs) * ckt->CKTomega; - ggd = *(ckt->CKTstate0 + here->HFETAggd); - xgd = *(ckt->CKTstate0 + here->HFETAqgd) * ckt->CKTomega; - ggspp = *(ckt->CKTstate0 + here->HFETAggspp); - ggdpp = *(ckt->CKTstate0 + here->HFETAggdpp); - if(model->HFETAkappaGiven && here->HFETAdelf != 0.0) { - f = ckt->CKTomega/2/M_PI; - gds = gds*(1+0.5*model->HFETAkappa*(1+tanh((f-here->HFETAfgds)/here->HFETAdelf))); - } - - m = here->HFETAm; - - *(here->HFETAdrainDrainPtr) += m * (model->HFETAdrainConduct); - *(here->HFETAsourceSourcePtr) += m * (model->HFETAsourceConduct); - *(here->HFETAgatePrimeGatePrimePtr) += m * (ggd+ggs+ggspp+ggdpp+model->HFETAgateConduct); - *(here->HFETAdrainPrimeDrainPrimePtr) += m * (gds+ggd+model->HFETAdrainConduct+model->HFETAgf); - *(here->HFETAsourcePrimeSourcePrimePtr) += m * (gds+gm+ggs+model->HFETAsourceConduct+model->HFETAgi); - *(here->HFETAsourcePrmPrmSourcePrmPrmPtr) += m * (model->HFETAgi+ggspp); - *(here->HFETAdrainPrmPrmDrainPrmPrmPtr) += m * (model->HFETAgf+ggdpp); - *(here->HFETAdrainDrainPrimePtr) -= m * (model->HFETAdrainConduct); - *(here->HFETAdrainPrimeDrainPtr) -= m * (model->HFETAdrainConduct); - *(here->HFETAsourceSourcePrimePtr) -= m * (model->HFETAsourceConduct); - *(here->HFETAsourcePrimeSourcePtr) -= m * (model->HFETAsourceConduct); - *(here->HFETAgatePrimeDrainPrimePtr) -= m * (ggd); - *(here->HFETAdrainPrimeGatePrimePtr) += m * (gm-ggd); - *(here->HFETAgatePrimeSourcePrimePtr) -= m * (ggs); - *(here->HFETAsourcePrimeGatePrimePtr) += m * (-ggs-gm); - *(here->HFETAdrainPrimeSourcePrimePtr) += m * (-gds-gm); - *(here->HFETAsourcePrimeDrainPrimePtr) -= m * (gds); - *(here->HFETAsourcePrimeSourcePrmPrmPtr) -= m * (model->HFETAgi); - *(here->HFETAsourcePrmPrmSourcePrimePtr) -= m * (model->HFETAgi); - *(here->HFETAgatePrimeSourcePrmPrmPtr) -= m * (ggspp); - *(here->HFETAsourcePrmPrmGatePrimePtr) -= m * (ggspp); - *(here->HFETAdrainPrimeDrainPrmPrmPtr) -= m * (model->HFETAgf); - *(here->HFETAdrainPrmPrmDrainPrimePtr) -= m * (model->HFETAgf); - *(here->HFETAgatePrimeDrainPrmPrmPtr) -= m * (ggdpp); - *(here->HFETAdrainPrmPrmGatePrimePtr) -= m * (ggdpp); - *(here->HFETAgateGatePtr) += m * (model->HFETAgateConduct); - *(here->HFETAgateGatePrimePtr) -= m * (model->HFETAgateConduct); - *(here->HFETAgatePrimeGatePtr) -= m * (model->HFETAgateConduct); - *(here->HFETAgatePrimeGatePrimePtr+1) += m * (xgd+xgs); - *(here->HFETAdrainPrmPrmDrainPrmPrmPtr+1) += m * (xgd); - *(here->HFETAsourcePrmPrmSourcePrmPrmPtr+1) += m * (xgs); - *(here->HFETAgatePrimeDrainPrmPrmPtr+1) -= m * (xgd); - *(here->HFETAgatePrimeSourcePrmPrmPtr+1) -= m * (xgs); - *(here->HFETAdrainPrmPrmGatePrimePtr+1) -= m * (xgd); - *(here->HFETAsourcePrmPrmGatePrimePtr+1) -= m * (xgs); - *(here->HFETAdrainPrimeDrainPrimePtr+1) += m * (xds); - *(here->HFETAsourcePrimeSourcePrimePtr+1) += m * (xds); - *(here->HFETAdrainPrimeSourcePrimePtr+1) -= m * (xds); - *(here->HFETAsourcePrimeDrainPrimePtr+1) -= m * (xds); - } - } - return(OK); -} diff --git a/src/spicelib/devices/hfet1/hfetask.c b/src/spicelib/devices/hfet1/hfetask.c deleted file mode 100644 index d4fb5adbf..000000000 --- a/src/spicelib/devices/hfet1/hfetask.c +++ /dev/null @@ -1,151 +0,0 @@ -/********** -Copyright 1990 Regents of the University of California. All rights reserved. -Author: 1987 Thomas L. Quarles -**********/ -/* -Imported into HFETA source: Paolo Nenzi 2001 - */ - -#include "ngspice/ngspice.h" -#include "ngspice/cktdefs.h" -#include "ngspice/devdefs.h" -#include "ngspice/ifsim.h" -#include "hfetdefs.h" -#include "ngspice/sperror.h" -#include "ngspice/suffix.h" - - -/* ARGSUSED */ -int -HFETAask(CKTcircuit *ckt, GENinstance *inst, int which, IFvalue *value, IFvalue *select) -{ - HFETAinstance *here = (HFETAinstance*)inst; - static char *msg = "Current and power not available in ac analysis"; - - NG_IGNORE(select); - - switch(which) { - case HFETA_LENGTH: - value->rValue = here->HFETAlength; - return (OK); - case HFETA_WIDTH: - value->rValue = here->HFETAwidth; - value->rValue *= here->HFETAm; - return (OK); - case HFETA_M: - value->rValue = here->HFETAm; - return (OK); - case HFETA_IC_VDS: - value->rValue = here->HFETAicVDS; - return (OK); - case HFETA_IC_VGS: - value->rValue = here->HFETAicVGS; - return (OK); - case HFETA_OFF: - value->iValue = here->HFETAoff; - return (OK); - case HFETA_DRAINNODE: - value->iValue = here->HFETAdrainNode; - return (OK); - case HFETA_GATENODE: - value->iValue = here->HFETAgateNode; - return (OK); - case HFETA_SOURCENODE: - value->iValue = here->HFETAsourceNode; - return (OK); - case HFETA_DRAINPRIMENODE: - value->iValue = here->HFETAdrainPrimeNode; - return (OK); - case HFETA_SOURCEPRIMENODE: - value->iValue = here->HFETAsourcePrimeNode; - return (OK); - case HFETA_TEMP: - value->rValue = here->HFETAtemp - CONSTCtoK; - return(OK); - case HFETA_DTEMP: - value->rValue = here->HFETAdtemp; - return(OK); - case HFETA_VGS: - value->rValue = *(ckt->CKTstate0 + here->HFETAvgs); - return (OK); - case HFETA_VGD: - value->rValue = *(ckt->CKTstate0 + here->HFETAvgd); - return (OK); - case HFETA_CG: - value->rValue = *(ckt->CKTstate0 + here->HFETAcg); - value->rValue *= here->HFETAm; - return (OK); - case HFETA_CD: - value->rValue = *(ckt->CKTstate0 + here->HFETAcd); - value->rValue *= here->HFETAm; - return (OK); - case HFETA_CGD: - value->rValue = *(ckt->CKTstate0 + here->HFETAcgd); - value->rValue *= here->HFETAm; - return (OK); - case HFETA_GM: - value->rValue = *(ckt->CKTstate0 + here->HFETAgm); - value->rValue *= here->HFETAm; - return (OK); - case HFETA_GDS: - value->rValue = *(ckt->CKTstate0 + here->HFETAgds); - value->rValue *= here->HFETAm; - return (OK); - case HFETA_GGS: - value->rValue = *(ckt->CKTstate0 + here->HFETAggs); - value->rValue *= here->HFETAm; - return (OK); - case HFETA_GGD: - value->rValue = *(ckt->CKTstate0 + here->HFETAggd); - value->rValue *= here->HFETAm; - return (OK); - case HFETA_QGS: - value->rValue = *(ckt->CKTstate0 + here->HFETAqgs); - value->rValue *= here->HFETAm; - return (OK); - case HFETA_CQGS: - value->rValue = *(ckt->CKTstate0 + here->HFETAcqgs); - value->rValue *= here->HFETAm; - return (OK); - case HFETA_QGD: - value->rValue = *(ckt->CKTstate0 + here->HFETAqgd); - value->rValue *= here->HFETAm; - return (OK); - case HFETA_CQGD: - value->rValue = *(ckt->CKTstate0 + here->HFETAcqgd); - value->rValue *= here->HFETAm; - return (OK); - case HFETA_CS : - if (ckt->CKTcurrentAnalysis & DOING_AC) { - errMsg = TMALLOC(char, strlen(msg) + 1); - errRtn = "HFETAask"; - strcpy(errMsg,msg); - return(E_ASKCURRENT); - } else { - value->rValue = -*(ckt->CKTstate0 + here->HFETAcd); - value->rValue -= *(ckt->CKTstate0 + here->HFETAcg); - value->rValue *= here->HFETAm; - } - return(OK); - case HFETA_POWER : - if (ckt->CKTcurrentAnalysis & DOING_AC) { - errMsg = TMALLOC(char, strlen(msg) + 1); - errRtn = "HFETAask"; - strcpy(errMsg,msg); - return(E_ASKPOWER); - } else { - value->rValue = *(ckt->CKTstate0 + here->HFETAcd) * - *(ckt->CKTrhsOld + here->HFETAdrainNode); - value->rValue += *(ckt->CKTstate0 + here->HFETAcg) * - *(ckt->CKTrhsOld + here->HFETAgateNode); - value->rValue -= (*(ckt->CKTstate0+here->HFETAcd) + - *(ckt->CKTstate0 + here->HFETAcg)) * - *(ckt->CKTrhsOld + here->HFETAsourceNode); - value->rValue *= here->HFETAm; - } - return(OK); - default: - return (E_BADPARM); - } - /* NOTREACHED */ -} diff --git a/src/spicelib/devices/hfet1/hfetdefs.h b/src/spicelib/devices/hfet1/hfetdefs.h deleted file mode 100644 index 5e40379be..000000000 --- a/src/spicelib/devices/hfet1/hfetdefs.h +++ /dev/null @@ -1,492 +0,0 @@ -/********** -Imported from MacSpice3f4 - Antony Wilson -Modified: Paolo Nenzi -**********/ - -#ifndef HFETA -#define HFETA - -#include "ngspice/ifsim.h" -#include "ngspice/cktdefs.h" -#include "ngspice/gendefs.h" -#include "ngspice/complex.h" -#include "ngspice/noisedef.h" - -typedef struct sHFETAinstance { - - struct GENinstance gen; - -#define HFETAmodPtr(inst) ((struct sHFETAmodel *)((inst)->gen.GENmodPtr)) -#define HFETAnextInstance(inst) ((struct sHFETAinstance *)((inst)->gen.GENnextInstance)) -#define HFETAname gen.GENname -#define HFETAstate gen.GENstate - - const int HFETAdrainNode; - const int HFETAgateNode; - const int HFETAsourceNode; - int HFETAdrainPrimeNode; - int HFETAgatePrimeNode; - int HFETAsourcePrimeNode; - int HFETAdrainPrmPrmNode; - int HFETAsourcePrmPrmNode; - double HFETAlength; - double HFETAwidth; - double HFETAm; - double HFETAicVDS; - double HFETAicVGS; - double HFETAtemp; - double HFETAdtemp; - double HFETAtVto; - double HFETAtMu; - double HFETAtLambda; - double HFETAtLambdahf; - double *HFETAdrainDrainPrimePtr; - double *HFETAgatePrimeDrainPrimePtr; - double *HFETAgatePrimeSourcePrimePtr; - double *HFETAsourceSourcePrimePtr; - double *HFETAdrainPrimeDrainPtr; - double *HFETAdrainPrimeGatePrimePtr; - double *HFETAdrainPrimeSourcePrimePtr; - double *HFETAsourcePrimeGatePrimePtr; - double *HFETAsourcePrimeSourcePtr; - double *HFETAsourcePrimeDrainPrimePtr; - double *HFETAdrainDrainPtr; - double *HFETAgatePrimeGatePrimePtr; - double *HFETAsourceSourcePtr; - double *HFETAdrainPrimeDrainPrimePtr; - double *HFETAsourcePrimeSourcePrimePtr; - double *HFETAdrainPrmPrmDrainPrmPrmPtr; - double *HFETAdrainPrmPrmDrainPrimePtr; - double *HFETAdrainPrimeDrainPrmPrmPtr; - double *HFETAdrainPrmPrmGatePrimePtr; - double *HFETAgatePrimeDrainPrmPrmPtr; - double *HFETAsourcePrmPrmSourcePrmPrmPtr; - double *HFETAsourcePrmPrmSourcePrimePtr; - double *HFETAsourcePrimeSourcePrmPrmPtr; - double *HFETAsourcePrmPrmGatePrimePtr; - double *HFETAgatePrimeSourcePrmPrmPtr; - double *HFETAgateGatePtr; - double *HFETAgateGatePrimePtr; - double *HFETAgatePrimeGatePtr; - - -#define HFETAvgs HFETAstate -#define HFETAvgd HFETAstate+1 -#define HFETAcg HFETAstate+2 -#define HFETAcd HFETAstate+3 -#define HFETAcgd HFETAstate+4 -#define HFETAcgs HFETAstate+5 -#define HFETAgm HFETAstate+6 -#define HFETAgds HFETAstate+7 -#define HFETAggs HFETAstate+8 -#define HFETAggd HFETAstate+9 -#define HFETAqgs HFETAstate+10 -#define HFETAcqgs HFETAstate+11 -#define HFETAqgd HFETAstate+12 -#define HFETAcqgd HFETAstate+13 -#define HFETAvgspp HFETAstate+14 -#define HFETAggspp HFETAstate+15 -#define HFETAcgspp HFETAstate+16 -#define HFETAvgdpp HFETAstate+17 -#define HFETAggdpp HFETAstate+18 -#define HFETAcgdpp HFETAstate+19 -#define HFETAqds HFETAstate+20 -#define HFETAcqds HFETAstate+21 -#define HFETAgmg HFETAstate+22 -#define HFETAgmd HFETAstate+23 - -#define HFETAnumStates 24 - - - - int HFETAoff; - unsigned HFETAlengthGiven : 1; - unsigned HFETAwidthGiven : 1; - unsigned HFETAmGiven : 1; - unsigned HFETAicVDSGiven : 1; - unsigned HFETAicVGSGiven : 1; - unsigned HFETAtempGiven : 1; - unsigned HFETAdtempGiven : 1; - int HFETAmode; - - double HFETAn0; - double HFETAn01; - double HFETAn02; - double HFETAgchi0; - double HFETAcf; - double HFETAis1d; - double HFETAis2d; - double HFETAis1s; - double HFETAis2s; - double HFETAiso; - double HFETAimax; - double HFETAvcrit; - double HFETAdelf; - double HFETAfgds; - double HFETAggrwl; - -} HFETAinstance ; - - -/* per model data */ - -typedef struct sHFETAmodel { - - struct GENmodel gen; - -#define HFETAmodType gen.GENmodType -#define HFETAnextModel(inst) ((struct sHFETAmodel *)((inst)->gen.GENnextModel)) -#define HFETAinstances(inst) ((HFETAinstance *)((inst)->gen.GENinstances)) -#define HFETAmodName gen.GENmodName - - int HFETAtype; - int HFETAgatemod; - - double HFETAthreshold; - double HFETAlambda; - double HFETAeta; - double HFETAm; - double HFETAmc; - double HFETAgamma; - double HFETAsigma0; - double HFETAvsigmat; - double HFETAvsigma; - double HFETAmu; - double HFETAdi; - double HFETAdelta; - double HFETAvs; - double HFETAnmax; - double HFETAdeltad; - double HFETAjs1d; - double HFETAjs2d; - double HFETAjs1s; - double HFETAjs2s; - double HFETAm1d; - double HFETAm2d; - double HFETAm1s; - double HFETAm2s; - double HFETArd; - double HFETArs; - double HFETArg; - double HFETArdi; - double HFETArsi; - double HFETArgs; - double HFETArgd; - double HFETAri; - double HFETArf; - double HFETAepsi; - double HFETAa1; - double HFETAa2; - double HFETAmv1; - double HFETAp; - double HFETAkappa; - double HFETAdelf; - double HFETAfgds; - double HFETAtf; - double HFETAcds; - double HFETAphib; - double HFETAtalpha; - double HFETAmt1; - double HFETAmt2; - double HFETAck1; - double HFETAck2; - double HFETAcm1; - double HFETAcm2; - double HFETAcm3; - double HFETAastar; - double HFETAeta1; - double HFETAd1; - double HFETAvt1; - double HFETAeta2; - double HFETAd2; - double HFETAvt2; - double HFETAggr; - double HFETAdel; - double HFETAklambda; - double HFETAkmu; - double HFETAkvto; - - double HFETAdrainConduct; - double HFETAsourceConduct; - double HFETAgateConduct; - double HFETAgi; - double HFETAgf; - double HFETAdeltaSqr; - - unsigned HFETAgatemodGiven:1; - unsigned HFETAthresholdGiven:1; - unsigned HFETAlambdaGiven:1; - unsigned HFETAetaGiven:1; - unsigned HFETAmGiven:1; - unsigned HFETAmcGiven:1; - unsigned HFETAgammaGiven:1; - unsigned HFETAsigma0Given:1; - unsigned HFETAvsigmatGiven:1; - unsigned HFETAvsigmaGiven:1; - unsigned HFETAmuGiven:1; - unsigned HFETAdiGiven:1; - unsigned HFETAdeltaGiven:1; - unsigned HFETAvsGiven:1; - unsigned HFETAnmaxGiven:1; - unsigned HFETAdeltadGiven:1; - unsigned HFETAjs1dGiven:1; - unsigned HFETAjs2dGiven:1; - unsigned HFETAjs1sGiven:1; - unsigned HFETAjs2sGiven:1; - unsigned HFETAm1dGiven:1; - unsigned HFETAm2dGiven:1; - unsigned HFETAm1sGiven:1; - unsigned HFETAm2sGiven:1; - unsigned HFETArdGiven:1; - unsigned HFETArsGiven:1; - unsigned HFETArgGiven:1; - unsigned HFETArdiGiven:1; - unsigned HFETArsiGiven:1; - unsigned HFETArgsGiven:1; - unsigned HFETArgdGiven:1; - unsigned HFETAriGiven:1; - unsigned HFETArfGiven:1; - unsigned HFETAepsiGiven:1; - unsigned HFETAa1Given:1; - unsigned HFETAa2Given:1; - unsigned HFETAmv1Given:1; - unsigned HFETApGiven:1; - unsigned HFETAkappaGiven:1; - unsigned HFETAdelfGiven:1; - unsigned HFETAfgdsGiven:1; - unsigned HFETAtfGiven:1; - unsigned HFETAcdsGiven:1; - unsigned HFETAphibGiven:1; - unsigned HFETAtalphaGiven:1; - unsigned HFETAmt1Given:1; - unsigned HFETAmt2Given:1; - unsigned HFETAck1Given:1; - unsigned HFETAck2Given:1; - unsigned HFETAcm1Given:1; - unsigned HFETAcm2Given:1; - unsigned HFETAcm3Given:1; - unsigned HFETAastarGiven:1; - unsigned HFETAeta1Given:1; - unsigned HFETAd1Given:1; - unsigned HFETAvt1Given:1; - unsigned HFETAeta2Given:1; - unsigned HFETAd2Given:1; - unsigned HFETAvt2Given:1; - unsigned HFETAggrGiven:1; - unsigned HFETAdelGiven:1; - unsigned HFETAklambdaGiven:1; - unsigned HFETAkmuGiven:1; - unsigned HFETAkvtoGiven:1; - -} HFETAmodel; - -#ifndef NHFET -#define NHFET 1 -#define PHFET -1 -#endif - -/* device parameters */ -enum { - HFETA_LENGTH = 1, - HFETA_WIDTH, - HFETA_IC_VDS, - HFETA_IC_VGS, - HFETA_TEMP, - HFETA_IC, - HFETA_OFF, - HFETA_CS, - HFETA_POWER, - HFETA_DTEMP, - HFETA_M, -}; - -/* model parameters */ -enum { - HFETA_MOD_VTO = 101, - HFETA_MOD_LAMBDA, - HFETA_MOD_RD, - HFETA_MOD_RS, - HFETA_MOD_RG, - HFETA_MOD_RGS, - HFETA_MOD_RGD, - HFETA_MOD_RI, - HFETA_MOD_RF, - HFETA_MOD_ETA, - HFETA_MOD_M, - HFETA_MOD_MC, - HFETA_MOD_GAMMA, - HFETA_MOD_SIGMA0, - HFETA_MOD_VSIGMAT, - HFETA_MOD_VSIGMA, - HFETA_MOD_MU, - HFETA_MOD_DI, - HFETA_MOD_DELTA, - HFETA_MOD_VS, - HFETA_MOD_NMAX, - HFETA_MOD_DELTAD, - HFETA_MOD_JS1D, - HFETA_MOD_JS2D, - HFETA_MOD_JS1S, - HFETA_MOD_JS2S, - HFETA_MOD_M1D, - HFETA_MOD_M2D, - HFETA_MOD_M1S, - HFETA_MOD_M2S, -}; - -enum { - HFETA_MOD_EPSI = 132, - HFETA_MOD_RDI, - HFETA_MOD_RSI, - HFETA_MOD_A1, - HFETA_MOD_A2, - HFETA_MOD_MV1, - HFETA_MOD_P, - HFETA_MOD_KAPPA, - HFETA_MOD_DELF, - HFETA_MOD_FGDS, - HFETA_MOD_TF, - HFETA_MOD_CDS, - HFETA_MOD_PHIB, - HFETA_MOD_TALPHA, - HFETA_MOD_MT1, - HFETA_MOD_MT2, - HFETA_MOD_CK1, - HFETA_MOD_CK2, - HFETA_MOD_CM1, - HFETA_MOD_CM2, - HFETA_MOD_CM3, - HFETA_MOD_ASTAR, - HFETA_MOD_ETA1, - HFETA_MOD_D1, - HFETA_MOD_VT1, - HFETA_MOD_ETA2, - HFETA_MOD_D2, - HFETA_MOD_VT2, - HFETA_MOD_GGR, - HFETA_MOD_DEL, - HFETA_MOD_GATEMOD, - HFETA_MOD_KLAMBDA, - HFETA_MOD_KMU, - HFETA_MOD_KVTO, - HFETA_MOD_NHFET, - HFETA_MOD_PHFET, - HFETA_MOD_TYPE, -}; - -/* device questions */ - -enum { - HFETA_DRAINNODE = 201, - HFETA_GATENODE, - HFETA_SOURCENODE, - HFETA_DRAINPRIMENODE, - HFETA_SOURCEPRIMENODE, - HFETA_VGS, - HFETA_VGD, - HFETA_CG, - HFETA_CD, - HFETA_CGD, - HFETA_GM, - HFETA_GDS, - HFETA_GGS, - HFETA_GGD, - HFETA_QGS, - HFETA_CQGS, - HFETA_QGD, - HFETA_CQGD, -}; - -/* model questions */ - -enum { - HFETA_MOD_DRAINCONDUCT = 301, - HFETA_MOD_SOURCECONDUCT, - HFETA_MOD_DEPLETIONCAP, - HFETA_MOD_VCRIT, -}; - -#define L (here->HFETAlength) -#define W (here->HFETAwidth) -#define VTO (model->HFETAthreshold) -#define LAMBDA (model->HFETAlambda) -#define RDI (model->HFETArdi) -#define RSI (model->HFETArsi) -#define RD (model->HFETArd) -#define RS (model->HFETArs) -#define RG (model->HFETArg) -#define RF (model->HFETArf) -#define RI (model->HFETAri) -#define RGS (model->HFETArgs) -#define RGD (model->HFETArgd) -#define ETA (model->HFETAeta) -#define M (model->HFETAm) -#define MC (model->HFETAmc) -#define GAMMA (model->HFETAgamma) -#define SIGMA0 (model->HFETAsigma0) -#define VSIGMAT (model->HFETAvsigmat) -#define VSIGMA (model->HFETAvsigma) -#define MU (model->HFETAmu) -#define DI (model->HFETAdi) -#define DELTAD (model->HFETAdeltad) -#define DELTASQR (model->HFETAdeltaSqr) -#define VS (model->HFETAvs) -#define NMAX (model->HFETAnmax) -#define EPSI (model->HFETAepsi) -#define JS1D (model->HFETAjs1d) -#define JS2D (model->HFETAjs2d) -#define JS1S (model->HFETAjs1s) -#define JS2S (model->HFETAjs2s) -#define M1D (model->HFETAm1d) -#define M2D (model->HFETAm2d) -#define M1S (model->HFETAm1s) -#define M2S (model->HFETAm2s) -#define ASTAR (model->HFETAastar) -#define PHIB (model->HFETAphib) -#define TALPHA (model->HFETAtalpha) -#define MT1 (model->HFETAmt1) -#define MT2 (model->HFETAmt2) -#define CK1 (model->HFETAck1) -#define CK2 (model->HFETAck2) -#define CM1 (model->HFETAcm1) -#define CM2 (model->HFETAcm2) -#define CM3 (model->HFETAcm3) -#define A1 (model->HFETAa1) -#define A2 (model->HFETAa2) -#define MV1 (model->HFETAmv1) -#define PM (model->HFETAp) -#define CDS (model->HFETAcds) -#define ETA1 (model->HFETAeta1) -#define D1 (model->HFETAd1) -#define IN_VT1 (model->HFETAvt1) /* VT1 was defined in termios.h */ -#define ETA2 (model->HFETAeta2) -#define D2 (model->HFETAd2) -#define VT2 (model->HFETAvt2) -#define GGR (model->HFETAggr) -#define DEL (model->HFETAdel) -#define KLAMBDA (model->HFETAklambda) -#define KMU (model->HFETAkmu) -#define KVTO (model->HFETAkvto) - -#define GCHI0 (here->HFETAgchi0) -#define N0 (here->HFETAn0) -#define N01 (here->HFETAn01) -#define N02 (here->HFETAn02) -#define CF (here->HFETAcf) -#define IMAX (here->HFETAimax) -#define ISO (here->HFETAiso) -#define TEMP (here->HFETAtemp) -#define IS1D (here->HFETAis1d) -#define IS2D (here->HFETAis2d) -#define IS1S (here->HFETAis1s) -#define IS2S (here->HFETAis2s) -#define FGDS (here->HFETAfgds) -#define DELF (here->HFETAdelf) -#define GGRWL (here->HFETAggrwl) -#define TLAMBDA (here->HFETAtLambda) -#define TMU (here->HFETAtMu) -#define TVTO (here->HFETAtVto) - -#include "hfetext.h" - -#endif /*HFETA*/ diff --git a/src/spicelib/devices/hfet1/hfetext.h b/src/spicelib/devices/hfet1/hfetext.h deleted file mode 100644 index dc090f196..000000000 --- a/src/spicelib/devices/hfet1/hfetext.h +++ /dev/null @@ -1,17 +0,0 @@ -/********** -Imported from MacSpice3f4 - Antony Wilson -Modified: Paolo Nenzi -**********/ - -extern int HFETAacLoad(GENmodel*,CKTcircuit*); -extern int HFETAask(CKTcircuit*,GENinstance*,int,IFvalue*,IFvalue*); -extern int HFETAgetic(GENmodel*,CKTcircuit*); -extern int HFETAload(GENmodel*,CKTcircuit*); -extern int HFETAmAsk(CKTcircuit*,GENmodel*,int,IFvalue*); -extern int HFETAmParam(int,IFvalue*,GENmodel*); -extern int HFETAparam(int,IFvalue*,GENinstance*,IFvalue*); -extern int HFETApzLoad(GENmodel*, CKTcircuit*, SPcomplex*); -extern int HFETAsetup(SMPmatrix*,GENmodel*,CKTcircuit*,int*); -extern int HFETAtemp(GENmodel*,CKTcircuit*); -extern int HFETAtrunc(GENmodel*,CKTcircuit*,double*); -extern int HFETAunsetup(GENmodel*,CKTcircuit*); diff --git a/src/spicelib/devices/hfet1/hfetgetic.c b/src/spicelib/devices/hfet1/hfetgetic.c deleted file mode 100644 index 26ef89b72..000000000 --- a/src/spicelib/devices/hfet1/hfetgetic.c +++ /dev/null @@ -1,39 +0,0 @@ -/********** -Imported from MacSpice3f4 - Antony Wilson -Modified: Paolo Nenzi -**********/ - -#include "ngspice/ngspice.h" -#include "ngspice/cktdefs.h" -#include "hfetdefs.h" -#include "ngspice/sperror.h" -#include "ngspice/suffix.h" - - -int -HFETAgetic(GENmodel *inModel, CKTcircuit *ckt) -{ - HFETAmodel *model = (HFETAmodel*)inModel; - HFETAinstance *here; - /* - * grab initial conditions out of rhs array. User specified, so use - * external nodes to get values - */ - - for( ; model ; model = HFETAnextModel(model)) { - for(here = HFETAinstances(model); here ; here = HFETAnextInstance(here)) { - - if(!here->HFETAicVDSGiven) { - here->HFETAicVDS = - *(ckt->CKTrhs + here->HFETAdrainNode) - - *(ckt->CKTrhs + here->HFETAsourceNode); - } - if(!here->HFETAicVGSGiven) { - here->HFETAicVGS = - *(ckt->CKTrhs + here->HFETAgateNode) - - *(ckt->CKTrhs + here->HFETAsourceNode); - } - } - } - return(OK); -} diff --git a/src/spicelib/devices/hfet1/hfetinit.c b/src/spicelib/devices/hfet1/hfetinit.c deleted file mode 100644 index dd4487933..000000000 --- a/src/spicelib/devices/hfet1/hfetinit.c +++ /dev/null @@ -1,76 +0,0 @@ -#include "ngspice/config.h" - -#include "ngspice/devdefs.h" - -#include "hfetitf.h" -#include "hfetext.h" -#include "hfetinit.h" - - -SPICEdev HFETAinfo = { - .DEVpublic = { - .name = "HFET1", - .description = "HFET1 Model", - .terms = &HFETAnSize, - .numNames = &HFETAnSize, - .termNames = HFETAnames, - .numInstanceParms = &HFETApTSize, - .instanceParms = HFETApTable, - .numModelParms = &HFETAmPTSize, - .modelParms = HFETAmPTable, - .flags = DEV_DEFAULT, - -#ifdef XSPICE - .cm_func = NULL, - .num_conn = 0, - .conn = NULL, - .num_param = 0, - .param = NULL, - .num_inst_var = 0, - .inst_var = NULL, -#endif - }, - - .DEVparam = HFETAparam, - .DEVmodParam = HFETAmParam, - .DEVload = HFETAload, - .DEVsetup = HFETAsetup, - .DEVunsetup = HFETAunsetup, - .DEVpzSetup = HFETAsetup, - .DEVtemperature = HFETAtemp, - .DEVtrunc = HFETAtrunc, - .DEVfindBranch = NULL, - .DEVacLoad = HFETAacLoad, - .DEVaccept = NULL, - .DEVdestroy = NULL, - .DEVmodDelete = NULL, - .DEVdelete = NULL, - .DEVsetic = HFETAgetic, - .DEVask = HFETAask, - .DEVmodAsk = HFETAmAsk, - .DEVpzLoad = HFETApzLoad, - .DEVconvTest = NULL, - .DEVsenSetup = NULL, - .DEVsenLoad = NULL, - .DEVsenUpdate = NULL, - .DEVsenAcLoad = NULL, - .DEVsenPrint = NULL, - .DEVsenTrunc = NULL, - .DEVdisto = NULL, - .DEVnoise = NULL, - .DEVsoaCheck = NULL, - .DEVinstSize = &HFETAiSize, - .DEVmodSize = &HFETAmSize, - -#ifdef CIDER - .DEVdump = NULL, - .DEVacct = NULL, -#endif -}; - - -SPICEdev * -get_hfeta_info(void) -{ - return &HFETAinfo; -} diff --git a/src/spicelib/devices/hfet1/hfetinit.h b/src/spicelib/devices/hfet1/hfetinit.h deleted file mode 100644 index 5d82bdae0..000000000 --- a/src/spicelib/devices/hfet1/hfetinit.h +++ /dev/null @@ -1,13 +0,0 @@ -#ifndef _HFETAINIT_H -#define _HFETAINIT_H - -extern IFparm HFETApTable[ ]; -extern IFparm HFETAmPTable[ ]; -extern char *HFETAnames[ ]; -extern int HFETApTSize; -extern int HFETAmPTSize; -extern int HFETAnSize; -extern int HFETAiSize; -extern int HFETAmSize; - -#endif diff --git a/src/spicelib/devices/hfet1/hfetitf.h b/src/spicelib/devices/hfet1/hfetitf.h deleted file mode 100644 index cd9b3db79..000000000 --- a/src/spicelib/devices/hfet1/hfetitf.h +++ /dev/null @@ -1,7 +0,0 @@ -#ifndef DEV_HFETA -#define DEV_HFETA - -SPICEdev *get_hfeta_info(void); - -#endif - diff --git a/src/spicelib/devices/hfet1/hfetload.c b/src/spicelib/devices/hfet1/hfetload.c deleted file mode 100644 index c3c9c0530..000000000 --- a/src/spicelib/devices/hfet1/hfetload.c +++ /dev/null @@ -1,798 +0,0 @@ -/********** -Imported from MacSpice3f4 - Antony Wilson -Modified: Paolo Nenzi -**********/ - -#include "ngspice/ngspice.h" -#include "ngspice/devdefs.h" -#include "ngspice/cktdefs.h" -#include "hfetdefs.h" -#include "ngspice/const.h" -#include "ngspice/trandefs.h" -#include "ngspice/sperror.h" -#include "ngspice/suffix.h" -/* -#define true 1 -#define false 0 -*/ - -/* -#define PHIB 0.5 -*/ -double diode(double); - -static void leak(double gmin, double vt, double v, double rs, double is1, - double is2, double m1, double m2, double *il, double *gl); - -static void hfeta(HFETAmodel *model, HFETAinstance *here, CKTcircuit *ckt, - double vgs, double vds, double *cdrain, double *gm, - double *gds, double *capgs, double *capgd, - double *cgd, double *gmg, double *gmd, - double *cgs, double *ggs); - -void Pause(void); - -int HFETAload(GENmodel *inModel, CKTcircuit *ckt) -{ - HFETAmodel *model = (HFETAmodel*)inModel; - HFETAinstance *here; - double capgd; - double capgs; - double cd; - double cdhat = 0.0; - double cdrain; - double cdreq; - double ceq; - double ceqgd; - double ceqgs; - double cg; - double cgd=0; - double cgs=0; - double cghat = 0.0; - double delvds; - double delvgd; - double delvgs; - double delvgdpp=0; - double delvgspp=0; - double gds; - double geq; - double ggd=0; - double ggs=0; - double gm; - double vcrit; - double vds; - double vgd; - double vgs; - double vgs1; - double vgd1; - double vds1; -#ifndef PREDICTOR - double xfact; -#endif - double temp; - double vt; - double vgspp=0; - double vgdpp=0; - double cgspp=0; - double cgdpp=0; - double ggspp=0; - double ggdpp=0; - double gmg=0; - double gmd=0; - - int inverse=FALSE; - int icheck; - int error; - - double m; - - for( ; model != NULL; model = HFETAnextModel(model)) { - for (here = HFETAinstances(model); here != NULL ; - here=HFETAnextInstance(here)) { - - vcrit = here->HFETAvcrit; - vt = CONSTKoverQ * here->HFETAtemp; - icheck = 0; - if( ckt->CKTmode & MODEINITSMSIG) { - vgs = *(ckt->CKTstate0 + here->HFETAvgs); - vgd = *(ckt->CKTstate0 + here->HFETAvgd); - vgspp = *(ckt->CKTstate0 + here->HFETAvgspp); - vgdpp = *(ckt->CKTstate0 + here->HFETAvgdpp); - } else if (ckt->CKTmode & MODEINITTRAN) { - vgs = *(ckt->CKTstate1 + here->HFETAvgs); - vgd = *(ckt->CKTstate1 + here->HFETAvgd); - vgspp = *(ckt->CKTstate1 + here->HFETAvgspp); - vgdpp = *(ckt->CKTstate1 + here->HFETAvgdpp); - } else if ( (ckt->CKTmode & MODEINITJCT) && - (ckt->CKTmode & MODETRANOP) && - (ckt->CKTmode & MODEUIC) ) { - vds = model->HFETAtype*here->HFETAicVDS; - vgs = model->HFETAtype*here->HFETAicVGS; - vgd = vgs-vds; - vgspp = vgs; - vgdpp = vgd; - } else if ( (ckt->CKTmode & MODEINITJCT) && - (here->HFETAoff == 0) ) { - vgs = -1; - vgd = -1; - vgspp = 0; - vgdpp = 0; - } else if( (ckt->CKTmode & MODEINITJCT) || - ((ckt->CKTmode & MODEINITFIX) && (here->HFETAoff))) { - vgs = 0; - vgd = 0; - vgspp = 0; - vgdpp = 0; - } else { -#ifndef PREDICTOR - if(ckt->CKTmode & MODEINITPRED) { - xfact = ckt->CKTdelta/ckt->CKTdeltaOld[2]; - *(ckt->CKTstate0 + here->HFETAvgs) = - *(ckt->CKTstate1 + here->HFETAvgs); - vgs = (1+xfact) * *(ckt->CKTstate1 + here->HFETAvgs) - - xfact * *(ckt->CKTstate2 + here->HFETAvgs); - *(ckt->CKTstate0 + here->HFETAvgspp) = - *(ckt->CKTstate1 + here->HFETAvgspp); - vgspp = (1+xfact) * *(ckt->CKTstate1 + here->HFETAvgspp) - - xfact * *(ckt->CKTstate2 + here->HFETAvgspp); - *(ckt->CKTstate0 + here->HFETAvgd) = - *(ckt->CKTstate1 + here->HFETAvgd); - vgd = (1+xfact)* *(ckt->CKTstate1 + here->HFETAvgd) - - xfact * *(ckt->CKTstate2 + here->HFETAvgd); - *(ckt->CKTstate0 + here->HFETAvgdpp) = - *(ckt->CKTstate1 + here->HFETAvgdpp); - vgdpp = (1+xfact) * *(ckt->CKTstate1 + here->HFETAvgdpp) - - xfact * *(ckt->CKTstate2 + here->HFETAvgdpp); - *(ckt->CKTstate0 + here->HFETAcg) = - *(ckt->CKTstate1 + here->HFETAcg); - *(ckt->CKTstate0 + here->HFETAcd) = - *(ckt->CKTstate1 + here->HFETAcd); - *(ckt->CKTstate0 + here->HFETAcgd) = - *(ckt->CKTstate1 + here->HFETAcgd); - *(ckt->CKTstate0 + here->HFETAcgs) = - *(ckt->CKTstate1 + here->HFETAcgs); - *(ckt->CKTstate0 + here->HFETAcgspp) = - *(ckt->CKTstate1 + here->HFETAcgspp); - *(ckt->CKTstate0 + here->HFETAcgdpp) = - *(ckt->CKTstate1 + here->HFETAcgdpp); - *(ckt->CKTstate0 + here->HFETAgm) = - *(ckt->CKTstate1 + here->HFETAgm); - *(ckt->CKTstate0 + here->HFETAgds) = - *(ckt->CKTstate1 + here->HFETAgds); - *(ckt->CKTstate0 + here->HFETAggs) = - *(ckt->CKTstate1 + here->HFETAggs); - *(ckt->CKTstate0 + here->HFETAggspp) = - *(ckt->CKTstate1 + here->HFETAggspp); - *(ckt->CKTstate0 + here->HFETAggd) = - *(ckt->CKTstate1 + here->HFETAggd); - *(ckt->CKTstate0 + here->HFETAggdpp) = - *(ckt->CKTstate1 + here->HFETAggdpp); - *(ckt->CKTstate0 + here->HFETAgmg) = - *(ckt->CKTstate1 + here->HFETAgmg); - *(ckt->CKTstate0 + here->HFETAgmd) = - *(ckt->CKTstate1 + here->HFETAgmd); - } else { -#endif /* PREDICTOR */ - /* - * compute new nonlinear branch voltages - */ - vgs = model->HFETAtype* - (*(ckt->CKTrhsOld+ here->HFETAgatePrimeNode)- - *(ckt->CKTrhsOld+ - here->HFETAsourcePrimeNode)); - vgd = model->HFETAtype* - (*(ckt->CKTrhsOld+here->HFETAgatePrimeNode)- - *(ckt->CKTrhsOld+ - here->HFETAdrainPrimeNode)); - vgspp = model->HFETAtype* - (*(ckt->CKTrhsOld+ here->HFETAgatePrimeNode)- - *(ckt->CKTrhsOld+ - here->HFETAsourcePrmPrmNode)); - vgdpp = model->HFETAtype* - (*(ckt->CKTrhsOld+ here->HFETAgatePrimeNode)- - *(ckt->CKTrhsOld+ - here->HFETAdrainPrmPrmNode)); - -#ifndef PREDICTOR - } -#endif /* PREDICTOR */ - delvgs=vgs - *(ckt->CKTstate0 + here->HFETAvgs); - delvgd=vgd - *(ckt->CKTstate0 + here->HFETAvgd); - delvds=delvgs - delvgd; - delvgspp=vgspp - *(ckt->CKTstate0 + here->HFETAvgspp); - delvgdpp=vgdpp - *(ckt->CKTstate0 + here->HFETAvgdpp); - cghat= *(ckt->CKTstate0 + here->HFETAcg) + - *(ckt->CKTstate0 + here->HFETAgmg)*delvgs - - *(ckt->CKTstate0 + here->HFETAgmd)*delvds + - *(ckt->CKTstate0 + here->HFETAggd)*delvgd + - *(ckt->CKTstate0 + here->HFETAggs)*delvgs + - *(ckt->CKTstate0 + here->HFETAggdpp)*delvgdpp + - *(ckt->CKTstate0 + here->HFETAggspp)*delvgspp; - cdhat= *(ckt->CKTstate0 + here->HFETAcd) + - *(ckt->CKTstate0 + here->HFETAgm)*delvgs + - *(ckt->CKTstate0 + here->HFETAgds)*delvds - - *(ckt->CKTstate0 + here->HFETAggd)*delvgd - - (*(ckt->CKTstate0 + here->HFETAgmg)*delvgs - - *(ckt->CKTstate0 + here->HFETAgmd)*delvds); - /* - * bypass if solution has not changed - */ - if((ckt->CKTbypass) && - (!(ckt->CKTmode & MODEINITPRED)) && - (fabs(delvgs) < ckt->CKTreltol*MAX(fabs(vgs), - fabs(*(ckt->CKTstate0 + here->HFETAvgs)))+ - ckt->CKTvoltTol) ) - if ( (fabs(delvgd) < ckt->CKTreltol*MAX(fabs(vgd), - fabs(*(ckt->CKTstate0 + here->HFETAvgd)))+ - ckt->CKTvoltTol)) - if ( (fabs(delvgspp) < ckt->CKTreltol*MAX(fabs(vgspp), - fabs(*(ckt->CKTstate0 + here->HFETAvgspp)))+ - ckt->CKTvoltTol)) - if ( (fabs(delvgdpp) < ckt->CKTreltol*MAX(fabs(vgdpp), - fabs(*(ckt->CKTstate0 + here->HFETAvgdpp)))+ - ckt->CKTvoltTol)) - if ( (fabs(cghat-*(ckt->CKTstate0 + here->HFETAcg)) - < ckt->CKTreltol*MAX(fabs(cghat), - fabs(*(ckt->CKTstate0 + here->HFETAcg)))+ - ckt->CKTabstol) ) if ( /* hack - expression too big */ - (fabs(cdhat-*(ckt->CKTstate0 + here->HFETAcd)) - < ckt->CKTreltol*MAX(fabs(cdhat), - fabs(*(ckt->CKTstate0 + here->HFETAcd)))+ - ckt->CKTabstol) ) { - - /* we can do a bypass */ - vgs = *(ckt->CKTstate0 + here->HFETAvgs); - vgd = *(ckt->CKTstate0 + here->HFETAvgd); - vds = vgs-vgd; - vgspp = *(ckt->CKTstate0 + here->HFETAvgspp); - vgdpp = *(ckt->CKTstate0 + here->HFETAvgdpp); - cg = *(ckt->CKTstate0 + here->HFETAcg); - cd = *(ckt->CKTstate0 + here->HFETAcd); - cgd = *(ckt->CKTstate0 + here->HFETAcgd); - cgs = *(ckt->CKTstate0 + here->HFETAcgs); - cgdpp = *(ckt->CKTstate0 + here->HFETAcgdpp); - cgspp = *(ckt->CKTstate0 + here->HFETAcgspp); - gm = *(ckt->CKTstate0 + here->HFETAgm); - gds = *(ckt->CKTstate0 + here->HFETAgds); - ggs = *(ckt->CKTstate0 + here->HFETAggs); - ggd = *(ckt->CKTstate0 + here->HFETAggd); - ggdpp = *(ckt->CKTstate0 + here->HFETAggdpp); - ggspp = *(ckt->CKTstate0 + here->HFETAggspp); - gmg = *(ckt->CKTstate0 + here->HFETAgmg); - gmd = *(ckt->CKTstate0 + here->HFETAgmd); - goto load; - } - /* - * limit nonlinear branch voltages - */ - vgs = DEVfetlim(vgs,*(ckt->CKTstate0 + here->HFETAvgs),TVTO); - vgd = DEVfetlim(vgd,*(ckt->CKTstate0 + here->HFETAvgd),TVTO); - } - /* - * determine dc current and derivatives - */ - vds = vgs-vgd; - if(model->HFETAgatemod == 0) { - double arg; - double earg; - if(IS1S == 0 || IS2S == 0) { - cgs = 0; - ggs = 0; - } else - leak(ckt->CKTgmin,vt,vgs,RGS,IS1S,IS2S,M1S,M2S,&cgs,&ggs); - arg = -vgs*DEL/vt; - earg = exp(arg); - cgs += GGRWL*vgs*earg; - ggs += GGRWL*earg*(1-arg); - if(IS1D == 0 || IS2D == 0) { - cgd = 0; - ggd = 0; - } else - leak(ckt->CKTgmin,vt,vgd,RGD,IS1D,IS2D,M1D,M2D,&cgd,&ggd); - arg = -vgd*DEL/vt; - earg = exp(arg); - cgd += GGRWL*vgd*earg; - ggd += GGRWL*earg*(1-arg); - } else - ggd = 0; - if(vds < 0) { - vds = -vds; - inverse = TRUE; - } - hfeta(model,here,ckt,vds>0?vgs:vgd,vds,&cdrain,&gm,&gds,&capgs,&capgd, - &cgd,&gmg,&gmd,&cgs,&ggs); - cg = cgs+cgd; - if(inverse) { - cdrain = -cdrain; - vds = -vds; - temp = capgs; - capgs = capgd; - capgd = temp; - } - /* - * compute equivalent drain current source - */ - cd = cdrain - cgd; - if ( (ckt->CKTmode & (MODETRAN|MODEINITSMSIG)) || - ((ckt->CKTmode & MODETRANOP) && (ckt->CKTmode & MODEUIC)) ){ - /* - * charge storage elements - */ - vgs1 = *(ckt->CKTstate1 + here->HFETAvgspp); - vgd1 = *(ckt->CKTstate1 + here->HFETAvgdpp); - vds1 = *(ckt->CKTstate1 + here->HFETAvgs)- - *(ckt->CKTstate1 + here->HFETAvgd); - - if(ckt->CKTmode & MODEINITTRAN) { - *(ckt->CKTstate1 + here->HFETAqgs) = capgs*vgspp; - *(ckt->CKTstate1 + here->HFETAqgd) = capgd*vgdpp; - *(ckt->CKTstate1 + here->HFETAqds) = CDS*vds; - } - *(ckt->CKTstate0+here->HFETAqgs) = *(ckt->CKTstate1 + here->HFETAqgs) + - capgs*(vgspp-vgs1); - *(ckt->CKTstate0+here->HFETAqgd) = *(ckt->CKTstate1 + here->HFETAqgd) + - capgd*(vgdpp-vgd1); - *(ckt->CKTstate0+here->HFETAqds) = *(ckt->CKTstate1 + here->HFETAqds) + - CDS*(vds-vds1); - - /* - * store small-signal parameters - */ - if( (!(ckt->CKTmode & MODETRANOP)) || - (!(ckt->CKTmode & MODEUIC)) ) { - if(ckt->CKTmode & MODEINITSMSIG) { - *(ckt->CKTstate0 + here->HFETAqgs) = capgs; - *(ckt->CKTstate0 + here->HFETAqgd) = capgd; - *(ckt->CKTstate0 + here->HFETAqds) = CDS; - continue; /*go to 1000*/ - } - /* - * transient analysis - */ - if(ckt->CKTmode & MODEINITTRAN) { - *(ckt->CKTstate1 + here->HFETAqgs) = - *(ckt->CKTstate0 + here->HFETAqgs); - *(ckt->CKTstate1 + here->HFETAqgd) = - *(ckt->CKTstate0 + here->HFETAqgd); - *(ckt->CKTstate1 + here->HFETAqds) = - *(ckt->CKTstate0 + here->HFETAqds); - } - error = NIintegrate(ckt,&geq,&ceq,capgs,here->HFETAqgs); - if(error) return(error); - ggspp = geq; - cgspp = *(ckt->CKTstate0 + here->HFETAcqgs); - cg = cg + cgspp; - error = NIintegrate(ckt,&geq,&ceq,capgd,here->HFETAqgd); - if(error) return(error); - ggdpp = geq; - cgdpp = *(ckt->CKTstate0 + here->HFETAcqgd); - cg = cg + cgdpp; - cd = cd - cgdpp; - error = NIintegrate(ckt,&geq,&ceq,CDS,here->HFETAqds); - if(error) return(error); - gds += geq; - cd += *(ckt->CKTstate0 + here->HFETAcqds); - if (ckt->CKTmode & MODEINITTRAN) { - *(ckt->CKTstate1 + here->HFETAcqgs) = - *(ckt->CKTstate0 + here->HFETAcqgs); - *(ckt->CKTstate1 + here->HFETAcqgd) = - *(ckt->CKTstate0 + here->HFETAcqgd); - *(ckt->CKTstate1 + here->HFETAcqds) = - *(ckt->CKTstate0 + here->HFETAcqds); - } - } - } - /* - * check convergence - */ - if( (!(ckt->CKTmode & MODEINITFIX)) | (!(ckt->CKTmode & MODEUIC))) { - if( (icheck == 1) - || (fabs(cghat-cg) >= ckt->CKTreltol* - MAX(fabs(cghat),fabs(cg))+ckt->CKTabstol) || - (fabs(cdhat-cd) > ckt->CKTreltol* - MAX(fabs(cdhat),fabs(cd))+ckt->CKTabstol) - - ) { - ckt->CKTnoncon++; - ckt->CKTtroubleElt = (GENinstance *) here; - } - } - *(ckt->CKTstate0 + here->HFETAvgs) = vgs; - *(ckt->CKTstate0 + here->HFETAvgd) = vgd; - *(ckt->CKTstate0 + here->HFETAvgspp) = vgspp; - *(ckt->CKTstate0 + here->HFETAvgdpp) = vgdpp; - *(ckt->CKTstate0 + here->HFETAcg) = cg; - *(ckt->CKTstate0 + here->HFETAcd) = cd; - *(ckt->CKTstate0 + here->HFETAcgd) = cgd; - *(ckt->CKTstate0 + here->HFETAcgs) = cgs; - *(ckt->CKTstate0 + here->HFETAcgspp) = cgspp; - *(ckt->CKTstate0 + here->HFETAcgdpp) = cgdpp; - *(ckt->CKTstate0 + here->HFETAgm) = gm; - *(ckt->CKTstate0 + here->HFETAgds) = gds; - *(ckt->CKTstate0 + here->HFETAggs) = ggs; - *(ckt->CKTstate0 + here->HFETAggd) = ggd; - *(ckt->CKTstate0 + here->HFETAggspp) = ggspp; - *(ckt->CKTstate0 + here->HFETAggdpp) = ggdpp; - *(ckt->CKTstate0 + here->HFETAgmg) = gmg; - *(ckt->CKTstate0 + here->HFETAgmd) = gmd; - - /* - * load current vector - */ -load: - - m = here->HFETAm; - - ceqgd = model->HFETAtype*(cgd+cgdpp-ggd*vgd-gmg*vgs-gmd*vds-ggdpp*vgdpp); - ceqgs = model->HFETAtype*(cgs + cgspp - ggs*vgs - ggspp*vgspp); - cdreq = model->HFETAtype*(cd + cgd + cgdpp - gds*vds - gm*vgs); - *(ckt->CKTrhs + here->HFETAgatePrimeNode) += m * (-ceqgs-ceqgd); - ceqgd = model->HFETAtype*(cgd-ggd*vgd-gmg*vgs-gmd*vds); - *(ckt->CKTrhs + here->HFETAdrainPrimeNode) += m * (-cdreq+ceqgd); - ceqgd = model->HFETAtype*(cgdpp-ggdpp*vgdpp); - *(ckt->CKTrhs + here->HFETAdrainPrmPrmNode) += m * ceqgd; - ceqgs = model->HFETAtype*(cgs-ggs*vgs); - *(ckt->CKTrhs + here->HFETAsourcePrimeNode) += m * (cdreq+ceqgs); - ceqgs = model->HFETAtype*(cgspp-ggspp*vgspp); - *(ckt->CKTrhs + here->HFETAsourcePrmPrmNode) += m * ceqgs; - - /* - * load y matrix - */ - - *(here->HFETAdrainDrainPtr) += m * (model->HFETAdrainConduct); - *(here->HFETAsourceSourcePtr) += m * (model->HFETAsourceConduct); - *(here->HFETAgatePrimeGatePrimePtr) += m * (ggd+ggs+ggspp+ggdpp+gmg+model->HFETAgateConduct); - *(here->HFETAdrainPrimeDrainPrimePtr) += m * (gds+ggd-gmd+model->HFETAdrainConduct+model->HFETAgf); - *(here->HFETAsourcePrimeSourcePrimePtr) += m * (gds+gm+ggs+model->HFETAsourceConduct+model->HFETAgi); - *(here->HFETAsourcePrmPrmSourcePrmPrmPtr) += m * (model->HFETAgi+ggspp); - *(here->HFETAdrainPrmPrmDrainPrmPrmPtr) += m * (model->HFETAgf+ggdpp); - *(here->HFETAdrainDrainPrimePtr) -= m * (model->HFETAdrainConduct); - *(here->HFETAdrainPrimeDrainPtr) -= m * (model->HFETAdrainConduct); - *(here->HFETAsourceSourcePrimePtr) -= m * (model->HFETAsourceConduct); - *(here->HFETAsourcePrimeSourcePtr) -= m * (model->HFETAsourceConduct); - *(here->HFETAgatePrimeDrainPrimePtr) += m * (-ggd+gmd); - *(here->HFETAdrainPrimeGatePrimePtr) += m * (gm-ggd-gmg); - *(here->HFETAgatePrimeSourcePrimePtr) -= m * (ggs+gmg+gmd); - *(here->HFETAsourcePrimeGatePrimePtr) += m * (-ggs-gm); - *(here->HFETAdrainPrimeSourcePrimePtr) += m * (-gds-gm+gmg+gmd); - *(here->HFETAsourcePrimeDrainPrimePtr) -= m * (gds); - *(here->HFETAsourcePrimeSourcePrmPrmPtr) -= m * (model->HFETAgi); - *(here->HFETAsourcePrmPrmSourcePrimePtr) -= m * (model->HFETAgi); - *(here->HFETAgatePrimeSourcePrmPrmPtr) -= m * (ggspp); - *(here->HFETAsourcePrmPrmGatePrimePtr) -= m * (ggspp); - *(here->HFETAdrainPrimeDrainPrmPrmPtr) -= m * (model->HFETAgf); - *(here->HFETAdrainPrmPrmDrainPrimePtr) -= m * (model->HFETAgf); - *(here->HFETAgatePrimeDrainPrmPrmPtr) -= m * (ggdpp); - *(here->HFETAdrainPrmPrmGatePrimePtr) -= m * (ggdpp); - *(here->HFETAgateGatePtr) += m * (model->HFETAgateConduct); - *(here->HFETAgateGatePrimePtr) -= m * (model->HFETAgateConduct); - *(here->HFETAgatePrimeGatePtr) -= m * (model->HFETAgateConduct); - - - } - } - return(OK); -} - - - - -static void leak(double gmin, double vt, double v, double rs, double is1, double is2, - double m1, double m2, double *il, double *gl) - -{ - - double vt1 = vt*m1; - double vt2 = vt*m2; - - if(v > -10*vt1) { - double dvdi0; - double iaprox; - double iaprox1; - double iaprox2; - double v0; - double vteff = vt1 + vt2; - double iseff = is2*pow((is1/is2),(m1/(m1+m2))); - if(rs > 0) { - double unorm = (v + rs*is1)/vt1 + log(rs*is1/vt1); - iaprox1 = vt1*diode(unorm)/rs - is1; - unorm = (v + rs*iseff)/vteff + log(rs*iseff/vteff); - iaprox2 = vteff*diode(unorm)/rs - iseff; - } else { - iaprox1 = is1*(exp(v/vt1) - 1); - iaprox2 = iseff*(exp(v/vteff) - 1); - } - if((iaprox1*iaprox2) != 0.0) - iaprox = 1./(1./iaprox1 + 1./iaprox2); - else - iaprox = 0.5*(iaprox1 + iaprox2); - - dvdi0 = rs + vt1/(iaprox+is1) + vt2/(iaprox+is2); - v0 = rs*iaprox; - v0 += vt1*log(iaprox/is1 + 1) + vt2*log(iaprox/is2 + 1); - /* *il = __max(-is1,iaprox + (v - v0)/dvdi0)*0.99999; */ - *il = MAX(-is1,iaprox + (v - v0)/dvdi0)*0.99999; - *gl = 1./(rs + vt1/(*il+is1) + vt2/(*il+is2)); - } else { - *gl = gmin; - *il = (*gl)*v-is1; - } - -} - - - - - -static void hfeta(HFETAmodel *model, HFETAinstance *here, CKTcircuit *ckt, - double vgs, double vds, double *cdrain, double *gm, - double *gds, double *capgs, double *capgd, - double *cgd, double *gmg, double *gmd, - double *cgs, double *ggs) -{ - - double vt; - double vgt; - double vgt0; - double sigma; - double vgte; - double isat; - double isatm; - double ns; - double nsm; - double a; - double b; - double c; - double d; - double e; - double f; - double g; - double h; - double p; - double q; - double s; - double t; - double u; - double nsc = 0.0; - double nsn = 0.0; - double temp; - double etavth; - double gch; - double gchi; - double gchim; - double vsate = 0.0; - double vdse; - double cg1; - double cgc; - double rt; - double vl; - double delidgch; - double delgchgchi; - double delgchins; - double delnsnsm; - double delnsmvgt; - double delvgtevgt = 0.0; - double delidvsate; - double delvsateisat; - double delisatisatm; - double delisatmvgte; - double delisatmgchim; - double delvsategch; - double delidvds; - double delvgtvgs = 0.0; - double delvsatevgt = 0.0; - - vt = CONSTKoverQ*TEMP; - etavth = ETA*vt; - vl = VS/TMU*L; - rt = RSI+RDI; - vgt0 = vgs - TVTO; - s = exp((vgt0-VSIGMAT)/VSIGMA); - sigma = SIGMA0/(1+s); - vgt = vgt0+sigma*vds; - u = 0.5*vgt/vt-1; - t = sqrt(model->HFETAdeltaSqr+u*u); - vgte = vt*(2+u+t); - b = exp(vgt/etavth); - if(model->HFETAeta2Given && model->HFETAd2Given) { - nsc = N02*exp((vgt+TVTO-VT2)/(ETA2*vt)); - nsn = 2*N0*log(1+0.5*b); - nsm = nsn*nsc/(nsn+nsc); - } else { - nsm = 2*N0*log(1+0.5*b); - } - if(nsm < 1.0e-38) { - *cdrain = 0; - *gm = 0.0; - *gds = 0.0; - *capgs = CF; - *capgd = CF; - goto cgd_calc; - } - c = pow(nsm/NMAX,GAMMA); - q = pow(1+c,1.0/GAMMA); - ns = nsm/q; - gchi = GCHI0*ns; - gch = gchi/(1+gchi*rt); - gchim = GCHI0*nsm; - h = sqrt(1+2*gchim*RSI + vgte*vgte/(vl*vl)); - p = 1+gchim*RSI+h; - isatm = gchim*vgte/p; - g = pow(isatm/IMAX,GAMMA); - isat = isatm/pow(1+g,1/GAMMA); - vsate = isat/gch; - d = pow(vds/vsate,M); - e = pow(1+d,1.0/M); - delidgch = vds*(1+TLAMBDA*vds)/e; - *cdrain = gch*delidgch; - delidvsate = (*cdrain)*d/vsate/(1+d); - delidvds = gch*(1+2*TLAMBDA*vds)/e-(*cdrain)* - pow(vds/vsate,M-1)/(vsate*(1+d)); - a = 1+gchi*rt; - delgchgchi = 1.0/(a*a); - delgchins = GCHI0; - delnsnsm = ns/nsm*(1-c/(1+c)); - delvgtevgt = 0.5*(1+u/t); - delnsmvgt = N0/etavth/(1.0/b + 0.5); - if(model->HFETAeta2Given && model->HFETAd2Given) - delnsmvgt = nsc*(nsc*delnsmvgt+nsn*nsn/(ETA2*vt))/((nsc+nsn)*(nsc+nsn)); - delvsateisat = 1.0/gch; - delisatisatm = isat/isatm*(1-g/(1+g)); - delisatmvgte = gchim*(p - vgte*vgte/(vl*vl*h))/(p*p); - delvsategch = -vsate/gch; - delisatmgchim = vgte*(p - gchim*RSI*(1+1.0/h))/(p*p); - delvgtvgs = 1-vds*SIGMA0/VSIGMA*s/((1+s)*(1+s)); - p = delgchgchi*delgchins*delnsnsm*delnsmvgt; - delvsatevgt = (delvsateisat*delisatisatm*(delisatmvgte*delvgtevgt + - delisatmgchim*GCHI0*delnsmvgt)+delvsategch*p); - g = delidgch*p + delidvsate*delvsatevgt; - *gm = g*delvgtvgs; - *gds = delidvds + g*sigma; - - /* Capacitance calculations */ - temp = ETA1*vt; - cg1 = 1/(D1/EPSI+temp*exp(-(vgs-IN_VT1)/temp)); - cgc = W*L*(CHARGE*delnsnsm*delnsmvgt*delvgtvgs+cg1); - vdse = vds*pow(1+pow(vds/vsate,MC),-1.0/MC); - a = (vsate-vdse)/(2*vsate-vdse); - a = a*a; - temp = 2.0/3.0; - p = PM + (1-PM)*exp(-vds/vsate); - *capgs = CF+2*temp*cgc*(1-a)/(1+p); - a = vsate/(2*vsate-vdse); - a = a*a; - *capgd = CF+2*p*temp*cgc*(1-a)/(1+p); -/* - { - char buf[128]; - FILE *fp; - fp = fopen("d:\\temp\\debug.txt","at"); - sprintf(buf,"%f\t%f\t%e\t%e\n",vgs,vds,W*L*CHARGE*delnsnsm*delnsmvgt*delvgtvgs,cgc); - fputs(buf,fp); - fclose(fp); - } -*/ -cgd_calc: - - if(model->HFETAgatemod != 0) { - /* Gate-drain current calculation */ - double vkneet; - double vmax; - double td; - double delcgdvgs; - double delcgdtd; - double deltdvdse; - double deltdvkneet; - double delvdsevmax; - double delvdsevds; - double dvdsevgs; - double dvdsevds; - double dtdvgs; - double dtdvds; - - vkneet = CK1*vsate+CK2; - vmax = CM1*vsate+CM2; - a = pow(vds/vmax,MT2); - b = pow(1+a,1/MT2); - vdse = vds/b; - c = pow(vdse/vkneet,MT1); - d = pow(1+c,1/MT1); - td = TEMP+TALPHA*vdse*vdse/d; - e = CONSTKoverQ*td*M2D; - p = PHIB/(CONSTboltz*td); - f = exp(-p); - q = (vgs-vdse)/e; - g = exp(q); - h = ISO*td*td*f*g; - *cgd = h - ISO*TEMP*TEMP*exp(-PHIB/(CONSTboltz*TEMP)); - delcgdvgs = h/e; - delcgdtd = h*(p-q+2)/td; - deltdvdse = TALPHA*vdse*(2-c/(1+c))/d; - deltdvkneet = (td-TEMP)*c/((1+c)*vkneet); - delvdsevmax = vdse*a/((1+a)*vmax); - delvdsevds = (1-a/(1+a))/b; - temp = delvsatevgt*delvgtvgs; - dvdsevgs = delvdsevmax*CM1*temp; - dtdvgs = deltdvdse*dvdsevgs+deltdvkneet*CK1*temp; - *gmg = delcgdvgs+delcgdtd*dtdvgs; - temp = delvsatevgt*sigma; - dvdsevds = delvdsevds+delvdsevmax*CM1*temp; - dtdvds = deltdvdse*dvdsevds+deltdvkneet*CK1*temp; - *gmd = -delcgdvgs*dvdsevds+delcgdtd*dtdvds; - } else { - gmg = NULL; - gmd = NULL; - } - - if(model->HFETAgatemod != 0) { - /* Gate-source current calculation */ - double evgs; - double vtn = vt*M2S; - double csat = ISO*TEMP*TEMP*exp(-PHIB/(CONSTboltz*TEMP)); - if (vgs <= -5*vt) { - *ggs = -csat/vgs+ckt->CKTgmin; - *cgs = (*ggs)*vgs; - } else { - evgs = exp(vgs/vtn); - *ggs = csat*evgs/vtn+ckt->CKTgmin; - *cgs = csat*(evgs-1)+ckt->CKTgmin*vgs; - } - } - - if(model->HFETAgatemod != 0 && (A1 != 0.0 || A2 != 0.0)) { - /* Correction current calculations */ - double vmax; - double delvdsevmax; - double delvdsevds; - double dvdsevgs; - double dvdsevds; - vmax = CM3*vsate; - a = pow(vds/vmax,MV1); - b = pow(1+a,1/MV1); - vdse = vds/b; - delvdsevmax = vdse*a/((1+a)*vmax); - delvdsevds = (1-a/(1+a))/b; - dvdsevgs = delvdsevmax*CM3*delvsatevgt*delvgtvgs; - dvdsevds = delvdsevds+delvdsevmax*CM3*delvsatevgt*sigma; - c = vgte*vdse; - d = 1+A2*c; - e = vdse*delvgtevgt; - f = A2*(*cgd); - *cdrain += A1*(d*(*cgd) - (*cgs)); - *gds += A1*(d*(*gmd)+f*(vgte*dvdsevds+e*sigma)); - *gm += A1*(d*(*gmg)+f*(vgte*dvdsevgs+e*delvgtvgs) - (*ggs)); - } - -} - - -double diode(double u) -{ - -#define U0 (-2.303) -#define A (2.221) -#define B (6.804) -#define C (1.685) - double it; - double ut; - double b; - double c; - double i; - double expu=exp(u); - - if(u <= U0) - { - it = expu*(1-expu); - }else - { - b = 0.5*(u-U0); - it = u + A*exp((U0-u)/B) - log(b+sqrt(b*b + 0.25*C*C)); - } - - ut = it + log(it); - b = u-ut; - c = 1+it; - i = it*(1 + b/c + 0.5*b*b/c/c/c); - return(i); -} diff --git a/src/spicelib/devices/hfet1/hfetmask.c b/src/spicelib/devices/hfet1/hfetmask.c deleted file mode 100644 index 8842b3fc0..000000000 --- a/src/spicelib/devices/hfet1/hfetmask.c +++ /dev/null @@ -1,244 +0,0 @@ -/********** -Copyright 1990 Regents of the University of California. All rights reserved. -Author: 1987 Thomas L. Quarles -**********/ -/* -Imported into HFETA model: Paolo Nenzi 2001 - */ - -#include "ngspice/ngspice.h" -#include "ngspice/cktdefs.h" -#include "ngspice/devdefs.h" -#include "ngspice/ifsim.h" -#include "hfetdefs.h" -#include "ngspice/sperror.h" -#include "ngspice/suffix.h" - - -/* ARGSUSED */ -int -HFETAmAsk(CKTcircuit *ckt, GENmodel *inst, int which, IFvalue *value) -{ - HFETAmodel *here = (HFETAmodel*)inst; - - NG_IGNORE(ckt); - - switch(which) { - case HFETA_MOD_VTO: - value->rValue = here->HFETAthreshold; - return (OK); - case HFETA_MOD_LAMBDA: - value->rValue = here->HFETAlambda; - return (OK); - case HFETA_MOD_RD: - value->rValue = here->HFETArd; - return (OK); - case HFETA_MOD_RS: - value->rValue = here->HFETArs; - return (OK); - case HFETA_MOD_RG: - value->rValue = here->HFETArg; - return (OK); - case HFETA_MOD_RDI: - value->rValue = here->HFETArdi; - return (OK); - case HFETA_MOD_RSI: - value->rValue = here->HFETArsi; - return (OK); - case HFETA_MOD_RGS: - value->rValue = here->HFETArgs; - return (OK); - case HFETA_MOD_RGD: - value->rValue = here->HFETArgd; - return (OK); - case HFETA_MOD_RI: - value->rValue = here->HFETAri; - return (OK); - case HFETA_MOD_RF: - value->rValue = here->HFETArf; - return (OK); - case HFETA_MOD_ETA: - value->rValue = here->HFETAeta; - return (OK); - case HFETA_MOD_M: - value->rValue = here->HFETAm; - return (OK); - case HFETA_MOD_MC: - value->rValue = here->HFETAmc; - return (OK); - case HFETA_MOD_GAMMA: - value->rValue = here->HFETAgamma; - return (OK); - case HFETA_MOD_SIGMA0: - value->rValue = here->HFETAsigma0; - return (OK); - case HFETA_MOD_VSIGMAT: - value->rValue = here->HFETAvsigmat; - return (OK); - case HFETA_MOD_VSIGMA: - value->rValue = here->HFETAvsigma; - return (OK); - case HFETA_MOD_MU: - value->rValue = here->HFETAmu; - return (OK); - case HFETA_MOD_DI: - value->rValue = here->HFETAdi; - return (OK); - case HFETA_MOD_DELTA: - value->rValue = here->HFETAdelta; - return (OK); - case HFETA_MOD_VS: - value->rValue = here->HFETAvs; - return (OK); - case HFETA_MOD_NMAX: - value->rValue = here->HFETAnmax; - return (OK); - case HFETA_MOD_DELTAD: - value->rValue = here->HFETAdeltad; - return (OK); - case HFETA_MOD_JS1D: - value->rValue = here->HFETAjs1d; - return (OK); - case HFETA_MOD_JS2D: - value->rValue = here->HFETAjs2d; - return (OK); - case HFETA_MOD_JS1S: - value->rValue = here->HFETAjs1s; - return (OK); - case HFETA_MOD_JS2S: - value->rValue = here->HFETAjs2s; - return (OK); - case HFETA_MOD_M1D: - value->rValue = here->HFETAm1d; - return (OK); - case HFETA_MOD_M2D: - value->rValue = here->HFETAm2d; - return (OK); - case HFETA_MOD_M1S: - value->rValue = here->HFETAm1s; - return (OK); - case HFETA_MOD_M2S: - value->rValue = here->HFETAm2s; - return (OK); - case HFETA_MOD_EPSI: - value->rValue = here->HFETAepsi; - return (OK); - case HFETA_MOD_P: - value->rValue = here->HFETAp; - return (OK); - case HFETA_MOD_CM3: - value->rValue = here->HFETAcm3; - return (OK); - case HFETA_MOD_A1: - value->rValue = here->HFETAa1; - return (OK); - case HFETA_MOD_A2: - value->rValue = here->HFETAa2; - return (OK); - case HFETA_MOD_MV1: - value->rValue = here->HFETAmv1; - return (OK); - case HFETA_MOD_KAPPA: - value->rValue = here->HFETAkappa; - return (OK); - case HFETA_MOD_DELF: - value->rValue = here->HFETAdelf; - return (OK); - case HFETA_MOD_FGDS: - value->rValue = here->HFETAfgds; - return (OK); - case HFETA_MOD_TF: - value->rValue = here->HFETAtf; - return (OK); - case HFETA_MOD_CDS: - value->rValue = here->HFETAcds; - return (OK); - case HFETA_MOD_PHIB: - value->rValue = here->HFETAphib; - return (OK); - - case HFETA_MOD_TALPHA: - value->rValue = here->HFETAtalpha; - return (OK); - case HFETA_MOD_MT1: - value->rValue = here->HFETAmt1; - return (OK); - case HFETA_MOD_MT2: - value->rValue = here->HFETAmt2; - return (OK); - case HFETA_MOD_CK1: - value->rValue = here->HFETAck1; - return (OK); - case HFETA_MOD_CK2: - value->rValue = here->HFETAck2; - return (OK); - case HFETA_MOD_CM1: - value->rValue = here->HFETAcm1; - return (OK); - case HFETA_MOD_CM2: - value->rValue = here->HFETAcm2; - return (OK); - case HFETA_MOD_ASTAR: - value->rValue = here->HFETAastar; - return (OK); - case HFETA_MOD_ETA1: - value->rValue = here->HFETAeta1; - return (OK); - case HFETA_MOD_D1: - value->rValue = here->HFETAd1; - return (OK); - case HFETA_MOD_VT1: - value->rValue = here->HFETAvt1; - return (OK); - case HFETA_MOD_ETA2: - value->rValue = here->HFETAeta2; - return (OK); - case HFETA_MOD_D2: - value->rValue = here->HFETAd2; - return (OK); - case HFETA_MOD_VT2: - value->rValue = here->HFETAvt2; - return (OK); - case HFETA_MOD_GGR: - value->rValue = here->HFETAggr; - return (OK); - case HFETA_MOD_DEL: - value->rValue = here->HFETAdel; - return (OK); - case HFETA_MOD_GATEMOD: - value->iValue = here->HFETAgatemod; - return (OK); - case HFETA_MOD_KLAMBDA: - value->rValue = here->HFETAklambda; - return (OK); - case HFETA_MOD_KMU: - value->rValue = here->HFETAkmu; - return (OK); - case HFETA_MOD_KVTO: - value->rValue = here->HFETAkvto; - return (OK); - - case HFETA_MOD_DRAINCONDUCT: - value->rValue = here->HFETAdrainConduct; - return (OK); - case HFETA_MOD_SOURCECONDUCT: - value->rValue = here->HFETAsourceConduct; - return (OK); - /* case HFETA_MOD_DEPLETIONCAP: - value->rValue = here->HFETA???; - return(OK); */ - /* case HFETA_MOD_VCRIT: - value->rValue = here->HFETAvcrit; - return (OK); */ - - case HFETA_MOD_TYPE: - if (here->HFETAtype == NHFET) - value->sValue = "nhfet"; - else - value->sValue = "phfet"; - return (OK); - default: - return (E_BADPARM); - } - /* NOTREACHED */ -} diff --git a/src/spicelib/devices/hfet1/hfetmpar.c b/src/spicelib/devices/hfet1/hfetmpar.c deleted file mode 100644 index c7a2d74da..000000000 --- a/src/spicelib/devices/hfet1/hfetmpar.c +++ /dev/null @@ -1,290 +0,0 @@ -/********** -Imported from MacSpice3f4 - Antony Wilson -Modified: Paolo Nenzi -**********/ - -#include "ngspice/ngspice.h" -#include "ngspice/const.h" -#include "ngspice/ifsim.h" -#include "hfetdefs.h" -#include "ngspice/sperror.h" -#include "ngspice/suffix.h" - - -int -HFETAmParam(int param, IFvalue *value, GENmodel *inModel) -{ - HFETAmodel *model = (HFETAmodel*)inModel; - switch(param) - { - case HFETA_MOD_VTO: - model->HFETAthresholdGiven = TRUE; - model->HFETAthreshold = value->rValue; - break; - case HFETA_MOD_LAMBDA: - model->HFETAlambdaGiven = TRUE; - model->HFETAlambda = value->rValue; - break; - case HFETA_MOD_RD: - model->HFETArdGiven = TRUE; - model->HFETArd = value->rValue; - break; - case HFETA_MOD_RS: - model->HFETArsGiven = TRUE; - model->HFETArs = value->rValue; - break; - case HFETA_MOD_RG: - model->HFETArgGiven = TRUE; - model->HFETArg = value->rValue; - break; - case HFETA_MOD_RDI: - model->HFETArdiGiven = TRUE; - model->HFETArdi = value->rValue; - break; - case HFETA_MOD_RSI: - model->HFETArsiGiven = TRUE; - model->HFETArsi = value->rValue; - break; - case HFETA_MOD_RGS: - model->HFETArgsGiven = TRUE; - model->HFETArgs = value->rValue; - break; - case HFETA_MOD_RGD: - model->HFETArgdGiven = TRUE; - model->HFETArgd = value->rValue; - break; - case HFETA_MOD_RI: - model->HFETAriGiven = TRUE; - model->HFETAri = value->rValue; - break; - case HFETA_MOD_RF: - model->HFETArfGiven = TRUE; - model->HFETArf = value->rValue; - break; - case HFETA_MOD_ETA: - model->HFETAetaGiven = TRUE; - model->HFETAeta = value->rValue; - break; - case HFETA_MOD_M: - model->HFETAmGiven = TRUE; - model->HFETAm = value->rValue; - break; - case HFETA_MOD_MC: - model->HFETAmcGiven = TRUE; - model->HFETAmc = value->rValue; - break; - case HFETA_MOD_GAMMA: - model->HFETAgammaGiven = TRUE; - model->HFETAgamma = value->rValue; - break; - case HFETA_MOD_SIGMA0: - model->HFETAsigma0Given = TRUE; - model->HFETAsigma0 = value->rValue; - break; - case HFETA_MOD_VSIGMAT: - model->HFETAvsigmatGiven = TRUE; - model->HFETAvsigmat = value->rValue; - break; - case HFETA_MOD_VSIGMA: - model->HFETAvsigmaGiven = TRUE; - model->HFETAvsigma = value->rValue; - break; - case HFETA_MOD_MU: - model->HFETAmuGiven = TRUE; - model->HFETAmu = value->rValue; - break; - case HFETA_MOD_DI: - model->HFETAdiGiven = TRUE; - model->HFETAdi = value->rValue; - break; - case HFETA_MOD_DELTA: - model->HFETAdeltaGiven = TRUE; - model->HFETAdelta = value->rValue; - break; - case HFETA_MOD_VS: - model->HFETAvsGiven = TRUE; - model->HFETAvs = value->rValue; - break; - case HFETA_MOD_NMAX: - model->HFETAnmaxGiven = TRUE; - model->HFETAnmax = value->rValue; - break; - case HFETA_MOD_DELTAD: - model->HFETAdeltadGiven = TRUE; - model->HFETAdeltad = value->rValue; - break; - case HFETA_MOD_JS1D: - model->HFETAjs1dGiven = TRUE; - model->HFETAjs1d = value->rValue; - break; - case HFETA_MOD_JS2D: - model->HFETAjs2dGiven = TRUE; - model->HFETAjs2d = value->rValue; - break; - case HFETA_MOD_JS1S: - model->HFETAjs1sGiven = TRUE; - model->HFETAjs1s = value->rValue; - break; - case HFETA_MOD_JS2S: - model->HFETAjs2sGiven = TRUE; - model->HFETAjs2s = value->rValue; - break; - case HFETA_MOD_M1D: - model->HFETAm1dGiven = TRUE; - model->HFETAm1d = value->rValue; - break; - case HFETA_MOD_M2D: - model->HFETAm2dGiven = TRUE; - model->HFETAm2d = value->rValue; - break; - case HFETA_MOD_M1S: - model->HFETAm1sGiven = TRUE; - model->HFETAm1s = value->rValue; - break; - case HFETA_MOD_M2S: - model->HFETAm2sGiven = TRUE; - model->HFETAm2s = value->rValue; - break; - case HFETA_MOD_EPSI: - model->HFETAepsiGiven = TRUE; - model->HFETAepsi = value->rValue; - break; - case HFETA_MOD_A1: - model->HFETAa1Given = TRUE; - model->HFETAa1 = value->rValue; - break; - case HFETA_MOD_A2: - model->HFETAa2Given = TRUE; - model->HFETAa2 = value->rValue; - break; - case HFETA_MOD_MV1: - model->HFETAmv1Given = TRUE; - model->HFETAmv1 = value->rValue; - break; - case HFETA_MOD_P: - model->HFETApGiven = TRUE; - model->HFETAp = value->rValue; - break; - case HFETA_MOD_KAPPA: - model->HFETAkappaGiven = TRUE; - model->HFETAkappa = value->rValue; - break; - case HFETA_MOD_DELF: - model->HFETAdelfGiven = TRUE; - model->HFETAdelf = value->rValue; - break; - case HFETA_MOD_FGDS: - model->HFETAfgdsGiven = TRUE; - model->HFETAfgds = value->rValue; - break; - case HFETA_MOD_TF: - model->HFETAtfGiven = TRUE; - model->HFETAtf = value->rValue+CONSTCtoK; - break; - case HFETA_MOD_CDS: - model->HFETAcdsGiven = TRUE; - model->HFETAcds = value->rValue; - break; - case HFETA_MOD_PHIB: - model->HFETAphibGiven = TRUE; - model->HFETAphib = value->rValue*CHARGE; - break; - case HFETA_MOD_TALPHA: - model->HFETAtalphaGiven = TRUE; - model->HFETAtalpha = value->rValue; - break; - case HFETA_MOD_MT1: - model->HFETAmt1Given = TRUE; - model->HFETAmt1 = value->rValue; - break; - case HFETA_MOD_MT2: - model->HFETAmt2Given = TRUE; - model->HFETAmt2 = value->rValue; - break; - case HFETA_MOD_CK1: - model->HFETAck1Given = TRUE; - model->HFETAck1 = value->rValue; - break; - case HFETA_MOD_CK2: - model->HFETAck2Given = TRUE; - model->HFETAck2 = value->rValue; - break; - case HFETA_MOD_CM1: - model->HFETAcm1Given = TRUE; - model->HFETAcm1 = value->rValue; - break; - case HFETA_MOD_CM2: - model->HFETAcm2Given = TRUE; - model->HFETAcm2 = value->rValue; - break; - case HFETA_MOD_CM3: - model->HFETAcm3Given = TRUE; - model->HFETAcm3 = value->rValue; - break; - case HFETA_MOD_ASTAR: - model->HFETAastarGiven = TRUE; - model->HFETAastar = value->rValue; - break; - case HFETA_MOD_ETA1: - model->HFETAeta1Given = TRUE; - model->HFETAeta1 = value->rValue; - break; - case HFETA_MOD_D1: - model->HFETAd1Given = TRUE; - model->HFETAd1 = value->rValue; - break; - case HFETA_MOD_VT1: - model->HFETAvt1Given = TRUE; - model->HFETAvt1 = value->rValue; - break; - case HFETA_MOD_ETA2: - model->HFETAeta2Given = TRUE; - model->HFETAeta2 = value->rValue; - break; - case HFETA_MOD_D2: - model->HFETAd2Given = TRUE; - model->HFETAd2 = value->rValue; - break; - case HFETA_MOD_VT2: - model->HFETAvt2Given = TRUE; - model->HFETAvt2 = value->rValue; - break; - case HFETA_MOD_GGR: - model->HFETAggrGiven = TRUE; - model->HFETAggr = value->rValue; - break; - case HFETA_MOD_DEL: - model->HFETAdelGiven = TRUE; - model->HFETAdel = value->rValue; - break; - case HFETA_MOD_GATEMOD: - model->HFETAgatemodGiven = TRUE; - model->HFETAgatemod = value->iValue; - break; - case HFETA_MOD_KLAMBDA: - model->HFETAklambdaGiven = TRUE; - KLAMBDA = value->rValue; - break; - case HFETA_MOD_KMU: - model->HFETAkmuGiven = TRUE; - KMU = value->rValue; - break; - case HFETA_MOD_KVTO: - model->HFETAkvtoGiven = TRUE; - KVTO = value->rValue; - break; - case HFETA_MOD_NHFET: - if(value->iValue) { - model->HFETAtype = NHFET; - } - break; - case HFETA_MOD_PHFET: - if(value->iValue) { - model->HFETAtype = PHFET; - } - break; - default: - return(E_BADPARM); - } - return(OK); -} diff --git a/src/spicelib/devices/hfet1/hfetparam.c b/src/spicelib/devices/hfet1/hfetparam.c deleted file mode 100644 index 959964e48..000000000 --- a/src/spicelib/devices/hfet1/hfetparam.c +++ /dev/null @@ -1,73 +0,0 @@ -/********** -Imported from MacSpice3f4 - Antony Wilson -Modified: Paolo Nenzi -**********/ - -#include "ngspice/ngspice.h" -#include "ngspice/ifsim.h" -#include "hfetdefs.h" -#include "ngspice/sperror.h" -#include "ngspice/suffix.h" - - -/* ARGSUSED */ -int -HFETAparam(int param, IFvalue *value, GENinstance *inst, IFvalue *select) -{ - HFETAinstance *here = (HFETAinstance*)inst; - - NG_IGNORE(select); - - switch (param) { - case HFETA_LENGTH: - here->HFETAlength = value->rValue; - here->HFETAlengthGiven = TRUE; - break; - case HFETA_WIDTH: - here->HFETAwidth = value->rValue; - here->HFETAwidthGiven = TRUE; - break; - case HFETA_M: - here->HFETAm = value->rValue; - here->HFETAmGiven = TRUE; - break; - case HFETA_IC_VDS: - here->HFETAicVDS = value->rValue; - here->HFETAicVDSGiven = TRUE; - break; - case HFETA_IC_VGS: - here->HFETAicVGS = value->rValue; - here->HFETAicVGSGiven = TRUE; - break; - case HFETA_OFF: - here->HFETAoff = value->iValue; - break; - case HFETA_IC: - /* FALLTHROUGH added to suppress GCC warning due to - * -Wimplicit-fallthrough flag */ - switch (value->v.numValue) { - case 2: - here->HFETAicVGS = *(value->v.vec.rVec+1); - here->HFETAicVGSGiven = TRUE; - /* FALLTHROUGH */ - case 1: - here->HFETAicVDS = *(value->v.vec.rVec); - here->HFETAicVDSGiven = TRUE; - break; - default: - return(E_BADPARM); - } - break; - case HFETA_TEMP: - here->HFETAtemp = value->rValue + CONSTCtoK; - here->HFETAtempGiven = TRUE; - break; - case HFETA_DTEMP: - here->HFETAdtemp = value->rValue; - here->HFETAdtempGiven = TRUE; - break; - default: - return(E_BADPARM); - } - return(OK); -} diff --git a/src/spicelib/devices/hfet1/hfetpzl.c b/src/spicelib/devices/hfet1/hfetpzl.c deleted file mode 100644 index 444f7484c..000000000 --- a/src/spicelib/devices/hfet1/hfetpzl.c +++ /dev/null @@ -1,109 +0,0 @@ -/********** -Author: 2003 Paolo Nenzi -**********/ -/* - */ - - -#include "ngspice/ngspice.h" -#include "ngspice/cktdefs.h" -#include "ngspice/complex.h" -#include "hfetdefs.h" -#include "ngspice/sperror.h" -#include "ngspice/suffix.h" - - -int -HFETApzLoad(GENmodel *inModel, CKTcircuit *ckt, SPcomplex *s) -{ - HFETAmodel *model = (HFETAmodel*)inModel; - HFETAinstance *here; - double gm; - double gds; - double xds; - double ggs; - double xgs; - double ggd; - double xgd; - double ggspp; - double ggdpp; - double f; - - double m; - - for( ; model != NULL; model = HFETAnextModel(model)) - { - for( here = HFETAinstances(model); here != NULL; - here = HFETAnextInstance(here)) { - - gm = *(ckt->CKTstate0 + here->HFETAgm); - gds = *(ckt->CKTstate0 + here->HFETAgds); - xds = CDS*ckt->CKTomega; - ggs = *(ckt->CKTstate0 + here->HFETAggs); - xgs = *(ckt->CKTstate0 + here->HFETAqgs); - ggd = *(ckt->CKTstate0 + here->HFETAggd); - xgd = *(ckt->CKTstate0 + here->HFETAqgd); - ggspp = *(ckt->CKTstate0 + here->HFETAggspp); - ggdpp = *(ckt->CKTstate0 + here->HFETAggdpp); - if(model->HFETAkappaGiven && here->HFETAdelf != 0.0) { - f = ckt->CKTomega/2/M_PI; - gds = gds*(1+0.5*model->HFETAkappa*(1+tanh((f-here->HFETAfgds)/here->HFETAdelf))); - } - - m = here->HFETAm; - - *(here->HFETAdrainDrainPtr) += m * (model->HFETAdrainConduct); - *(here->HFETAsourceSourcePtr) += m * (model->HFETAsourceConduct); - *(here->HFETAgatePrimeGatePrimePtr) += m * (ggd+ggs+ggspp+ggdpp+model->HFETAgateConduct); - *(here->HFETAdrainPrimeDrainPrimePtr) += m * (gds+ggd+model->HFETAdrainConduct+model->HFETAgf); - *(here->HFETAsourcePrimeSourcePrimePtr) += m * (gds+gm+ggs+model->HFETAsourceConduct+model->HFETAgi); - *(here->HFETAsourcePrmPrmSourcePrmPrmPtr) += m * (model->HFETAgi+ggspp); - *(here->HFETAdrainPrmPrmDrainPrmPrmPtr) += m * (model->HFETAgf+ggdpp); - *(here->HFETAdrainDrainPrimePtr) -= m * (model->HFETAdrainConduct); - *(here->HFETAdrainPrimeDrainPtr) -= m * (model->HFETAdrainConduct); - *(here->HFETAsourceSourcePrimePtr) -= m * (model->HFETAsourceConduct); - *(here->HFETAsourcePrimeSourcePtr) -= m * (model->HFETAsourceConduct); - *(here->HFETAgatePrimeDrainPrimePtr) -= m * (ggd); - *(here->HFETAdrainPrimeGatePrimePtr) += m * (gm-ggd); - *(here->HFETAgatePrimeSourcePrimePtr) -= m * (ggs); - *(here->HFETAsourcePrimeGatePrimePtr) += m * (-ggs-gm); - *(here->HFETAdrainPrimeSourcePrimePtr) += m * (-gds-gm); - *(here->HFETAsourcePrimeDrainPrimePtr) -= m * (gds); - *(here->HFETAsourcePrimeSourcePrmPrmPtr) -= m * (model->HFETAgi); - *(here->HFETAsourcePrmPrmSourcePrimePtr) -= m * (model->HFETAgi); - *(here->HFETAgatePrimeSourcePrmPrmPtr) -= m * (ggspp); - *(here->HFETAsourcePrmPrmGatePrimePtr) -= m * (ggspp); - *(here->HFETAdrainPrimeDrainPrmPrmPtr) -= m * (model->HFETAgf); - *(here->HFETAdrainPrmPrmDrainPrimePtr) -= m * (model->HFETAgf); - *(here->HFETAgatePrimeDrainPrmPrmPtr) -= m * (ggdpp); - *(here->HFETAdrainPrmPrmGatePrimePtr) -= m * (ggdpp); - *(here->HFETAgateGatePtr) += m * (model->HFETAgateConduct); - *(here->HFETAgateGatePrimePtr) -= m * (model->HFETAgateConduct); - *(here->HFETAgatePrimeGatePtr) -= m * (model->HFETAgateConduct); - - *(here->HFETAgatePrimeGatePrimePtr) += m * ((xgd+xgs) * s->real); - *(here->HFETAgatePrimeGatePrimePtr+1) += m * ((xgd+xgs) * s->imag); - *(here->HFETAdrainPrmPrmDrainPrmPrmPtr) += m * (xgd * s->real); - *(here->HFETAdrainPrmPrmDrainPrmPrmPtr+1) += m * (xgd * s->imag); - *(here->HFETAsourcePrmPrmSourcePrmPrmPtr) += m * (xgs * s->real); - *(here->HFETAsourcePrmPrmSourcePrmPrmPtr+1) += m * (xgs * s->imag); - *(here->HFETAgatePrimeDrainPrmPrmPtr) -= m * (xgd * s->real); - *(here->HFETAgatePrimeDrainPrmPrmPtr+1) -= m * (xgd * s->imag); - *(here->HFETAgatePrimeSourcePrmPrmPtr) -= m * (xgs * s->real); - *(here->HFETAgatePrimeSourcePrmPrmPtr+1) -= m * (xgs * s->imag); - *(here->HFETAdrainPrmPrmGatePrimePtr) -= m * (xgd * s->real); - *(here->HFETAdrainPrmPrmGatePrimePtr+1) -= m * (xgd * s->imag); - *(here->HFETAsourcePrmPrmGatePrimePtr) -= m * (xgs * s->real); - *(here->HFETAsourcePrmPrmGatePrimePtr+1) -= m * (xgs * s->imag); - *(here->HFETAdrainPrimeDrainPrimePtr) += m * (xds * s->real); - *(here->HFETAdrainPrimeDrainPrimePtr+1) += m * (xds * s->imag); - *(here->HFETAsourcePrimeSourcePrimePtr) += m * (xds * s->real); - *(here->HFETAsourcePrimeSourcePrimePtr+1) += m * (xds * s->imag); - *(here->HFETAdrainPrimeSourcePrimePtr) -= m * (xds * s->real); - *(here->HFETAdrainPrimeSourcePrimePtr+1) -= m * (xds * s->imag); - *(here->HFETAsourcePrimeDrainPrimePtr) -= m * (xds * s->real); - *(here->HFETAsourcePrimeDrainPrimePtr+1) -= m * (xds * s->imag); - } - } - return(OK); -} diff --git a/src/spicelib/devices/hfet1/hfetsetup.c b/src/spicelib/devices/hfet1/hfetsetup.c deleted file mode 100644 index 4b45a477d..000000000 --- a/src/spicelib/devices/hfet1/hfetsetup.c +++ /dev/null @@ -1,443 +0,0 @@ -/********** -Imported from MacSpice3f4 - Antony Wilson -Modified: Paolo Nenzi -**********/ - -#include "ngspice/ngspice.h" -#include "ngspice/smpdefs.h" -#include "ngspice/cktdefs.h" -#include "hfetdefs.h" -#include "ngspice/const.h" -#include "ngspice/sperror.h" -#include "ngspice/suffix.h" - -/* -#define HFETAphibGiven -#define CHARGE 1.60219e-19 -*/ - -int -HFETAsetup(SMPmatrix *matrix, GENmodel *inModel, CKTcircuit *ckt, int *states) - /* load the diode structure with those pointers needed later - * for fast matrix loading - */ -{ - HFETAmodel *model = (HFETAmodel*)inModel; - HFETAinstance *here; - int error; - CKTnode *tmp; - - - /* loop through all the diode models */ - for( ; model != NULL; model = HFETAnextModel(model)) { - if( (model->HFETAtype != NHFET) && (model->HFETAtype != PHFET) ) { - model->HFETAtype = NHFET; - } - if(!model->HFETAthresholdGiven) { - if(model->HFETAtype == NHFET) - model->HFETAthreshold = 0.15; - else - model->HFETAthreshold = -0.15; - } - if(!model->HFETAdiGiven) { - model->HFETAdi = 0.04e-6; - } - if(!model->HFETAlambdaGiven) { - model->HFETAlambda = 0.15; - } - if(!model->HFETAetaGiven) { - if(model->HFETAtype == NHFET) - model->HFETAeta = 1.28; - else - model->HFETAeta = 1.4; - } - if(!model->HFETAmGiven) { - model->HFETAm = 3.0; - } - if(!model->HFETAmcGiven) { - model->HFETAmc = 3.0; - } - if(!model->HFETAgammaGiven) { - model->HFETAgamma = 3.0; - } - if(!model->HFETAsigma0Given) { - model->HFETAsigma0 = 0.057; - } - if(!model->HFETAvsigmatGiven) { - model->HFETAvsigmat = 0.3; - } - if(!model->HFETAvsigmaGiven) { - model->HFETAvsigma = 0.1; - } - if(!model->HFETAmuGiven) { - if(model->HFETAtype == NHFET) - model->HFETAmu = 0.4; - else - model->HFETAmu = 0.03; - } - if(!model->HFETAdeltaGiven) { - model->HFETAdelta = 3.0; - } - if(!model->HFETAvsGiven) { - if(model->HFETAtype == NHFET) - model->HFETAvs = 1.5e5; - else - model->HFETAvs = 0.8e5; - } - if(!model->HFETAnmaxGiven) { - model->HFETAnmax = 2e16; - } - if(!model->HFETAdeltadGiven) { - model->HFETAdeltad = 4.5e-9; - } - if(!model->HFETAjs1dGiven) { - model->HFETAjs1d = 1.0; - } - if(!model->HFETAjs2dGiven) { - model->HFETAjs2d = 1.15e6; - } - if(!model->HFETAjs1sGiven) { - model->HFETAjs1s = 1.0; - } - if(!model->HFETAjs2sGiven) { - model->HFETAjs2s = 1.15e6; - } - if(!model->HFETAm1dGiven) { - model->HFETAm1d = 1.32; - } - if(!model->HFETAm2dGiven) { - model->HFETAm2d = 6.9; - } - if(!model->HFETAm1sGiven) { - model->HFETAm1s = 1.32; - } - if(!model->HFETAm2sGiven) { - model->HFETAm2s = 6.9; - } - if(!model->HFETArdGiven) { - model->HFETArd = 0; - } - if(!model->HFETArsGiven) { - model->HFETArs = 0; - } - if(!model->HFETArdiGiven) { - model->HFETArdi = 0; - } - if(!model->HFETArsiGiven) { - model->HFETArsi = 0; - } - if(!model->HFETArgsGiven) { - model->HFETArgs = 90; - } - if(!model->HFETArgdGiven) { - model->HFETArgd = 90; - } - if(!model->HFETAriGiven) { - model->HFETAri = 0; - } - if(!model->HFETArfGiven) { - model->HFETArf = 0; - } - if(!model->HFETAepsiGiven) { - model->HFETAepsi = 12.244*8.85418e-12; - } - if(!model->HFETAa1Given) { - model->HFETAa1 = 0; - } - if(!model->HFETAa2Given) { - model->HFETAa2 = 0; - } - if(!model->HFETAmv1Given) { - model->HFETAmv1 = 3; - } - if(!model->HFETApGiven) { - model->HFETAp = 1; - } - if(!model->HFETAkappaGiven) { - model->HFETAkappa = 0; - } - if(!model->HFETAdelfGiven) { - model->HFETAdelf = 0; - } - if(!model->HFETAfgdsGiven) { - model->HFETAfgds = 0; - } - if(!model->HFETAtfGiven) { - model->HFETAtf = ckt->CKTtemp; - } - if(!model->HFETAcdsGiven) { - model->HFETAcds = 0; - } - if(!model->HFETAphibGiven) { - model->HFETAphib = 0.5*CHARGE; - } - if(!model->HFETAtalphaGiven) { - model->HFETAtalpha = 1200; - } - if(!model->HFETAmt1Given) { - model->HFETAmt1 = 3.5; - } - if(!model->HFETAmt2Given) { - model->HFETAmt2 = 9.9; - } - if(!model->HFETAck1Given) { - model->HFETAck1 = 1; - } - if(!model->HFETAck2Given) { - model->HFETAck2 = 0; - } - if(!model->HFETAcm1Given) { - model->HFETAcm1 = 3; - } - if(!model->HFETAcm2Given) { - model->HFETAcm2 = 0; - } - if(!model->HFETAcm3Given) { - model->HFETAcm3 = 0.17; - } - if(!model->HFETAastarGiven) { - model->HFETAastar = 4.0e4; - } - if(!model->HFETAeta1Given) { - model->HFETAeta1 = 2; - } - if(!model->HFETAd1Given) { - model->HFETAd1 = 0.03e-6; - } - if(!model->HFETAeta2Given) { - model->HFETAeta2 = 2; - } - if(!model->HFETAd2Given) { - model->HFETAd2 = 0.2e-6; - } - if(!model->HFETAvt2Given) { - /* initialized in HFETAtemp */ - model->HFETAvt2 = 0; - } - - if(!model->HFETAggrGiven) { - model->HFETAggr = 40; - } - if(!model->HFETAdelGiven) { - model->HFETAdel = 0.04; - } - if(!model->HFETAklambdaGiven) - KLAMBDA = 0; - if(!model->HFETAkmuGiven) - KMU = 0; - if(!model->HFETAkvtoGiven) - KVTO = 0; - - /* loop through all the instances of the model */ - for (here = HFETAinstances(model); here != NULL ; - here=HFETAnextInstance(here)) { - - if(!here->HFETAlengthGiven) { - here->HFETAlength = 1e-6; - } - if(!here->HFETAwidthGiven) { - here->HFETAwidth = 20e-6; - } - if(!here->HFETAmGiven) { - here->HFETAm = 1.0; - } - - here->HFETAstate = *states; - *states += HFETAnumStates; - - if(model->HFETArs != 0) { - if(here->HFETAsourcePrimeNode == 0) { - error = CKTmkVolt(ckt,&tmp,here->HFETAname,"source"); - if(error) return(error); - here->HFETAsourcePrimeNode = tmp->number; - -/* XXX: Applied AlansFixes */ - if (ckt->CKTcopyNodesets) { - CKTnode *tmpNode; - IFuid tmpName; - - if (CKTinst2Node(ckt,here,3,&tmpNode,&tmpName)==OK) { - if (tmpNode->nsGiven) { - tmp->nodeset=tmpNode->nodeset; - tmp->nsGiven=tmpNode->nsGiven; - } - } - } - } - - } else { - here->HFETAsourcePrimeNode = here->HFETAsourceNode; - } - - if(model->HFETArd != 0) { - if(here->HFETAdrainPrimeNode == 0) { - error = CKTmkVolt(ckt,&tmp,here->HFETAname,"drain"); - if(error) return(error); - here->HFETAdrainPrimeNode = tmp->number; - - if (ckt->CKTcopyNodesets) { - CKTnode *tmpNode; - IFuid tmpName; - - if (CKTinst2Node(ckt,here,1,&tmpNode,&tmpName)==OK) { - if (tmpNode->nsGiven) { - tmp->nodeset=tmpNode->nodeset; - tmp->nsGiven=tmpNode->nsGiven; - } - } - } - } - - } else { - here->HFETAdrainPrimeNode = here->HFETAdrainNode; - } - - if(model->HFETArg != 0) { - if(here->HFETAgatePrimeNode == 0) { - error = CKTmkVolt(ckt,&tmp,here->HFETAname,"gate"); - if(error) return(error); - here->HFETAgatePrimeNode = tmp->number; - - if (ckt->CKTcopyNodesets) { - CKTnode *tmpNode; - IFuid tmpName; - - if (CKTinst2Node(ckt,here,2,&tmpNode,&tmpName)==OK) { - if (tmpNode->nsGiven) { - tmp->nodeset=tmpNode->nodeset; - tmp->nsGiven=tmpNode->nsGiven; - } - } - } - } - - } else { - here->HFETAgatePrimeNode = here->HFETAgateNode; - } - if(model->HFETArf != 0) { - if(here->HFETAdrainPrmPrmNode == 0) { - error = CKTmkVolt(ckt,&tmp,here->HFETAname,"gd"); - if(error) return(error); - here->HFETAdrainPrmPrmNode = tmp->number; - - if (ckt->CKTcopyNodesets) { - CKTnode *tmpNode; - IFuid tmpName; - - if (CKTinst2Node(ckt,here,1,&tmpNode,&tmpName)==OK) { - if (tmpNode->nsGiven) { - tmp->nodeset=tmpNode->nodeset; - tmp->nsGiven=tmpNode->nsGiven; - } - } - } - } - - } else { - here->HFETAdrainPrmPrmNode = here->HFETAdrainPrimeNode; - } - - if(model->HFETAri != 0) { - if(here->HFETAsourcePrmPrmNode == 0) { - error = CKTmkVolt(ckt,&tmp,here->HFETAname,"gs"); - if(error) return(error); - here->HFETAsourcePrmPrmNode = tmp->number; - - if (ckt->CKTcopyNodesets) { - CKTnode *tmpNode; - IFuid tmpName; - - if (CKTinst2Node(ckt,here,3,&tmpNode,&tmpName)==OK) { - if (tmpNode->nsGiven) { - tmp->nodeset=tmpNode->nodeset; - tmp->nsGiven=tmpNode->nsGiven; - } - } - } - } - - } else { - here->HFETAsourcePrmPrmNode = here->HFETAsourcePrimeNode; - } - -/* macro to make elements with built in test for out of memory */ -#define TSTALLOC(ptr,first,second) \ -do { if((here->ptr = SMPmakeElt(matrix, here->first, here->second)) == NULL){\ - return(E_NOMEM);\ -} } while(0) - - TSTALLOC(HFETAdrainDrainPrimePtr,HFETAdrainNode,HFETAdrainPrimeNode); - TSTALLOC(HFETAgatePrimeDrainPrimePtr,HFETAgatePrimeNode,HFETAdrainPrimeNode); - TSTALLOC(HFETAgatePrimeSourcePrimePtr,HFETAgatePrimeNode,HFETAsourcePrimeNode); - TSTALLOC(HFETAsourceSourcePrimePtr,HFETAsourceNode,HFETAsourcePrimeNode); - TSTALLOC(HFETAdrainPrimeDrainPtr,HFETAdrainPrimeNode,HFETAdrainNode); - TSTALLOC(HFETAdrainPrimeGatePrimePtr,HFETAdrainPrimeNode,HFETAgatePrimeNode); - TSTALLOC(HFETAdrainPrimeSourcePrimePtr,HFETAdrainPrimeNode,HFETAsourcePrimeNode); - TSTALLOC(HFETAsourcePrimeGatePrimePtr,HFETAsourcePrimeNode,HFETAgatePrimeNode); - TSTALLOC(HFETAsourcePrimeSourcePtr,HFETAsourcePrimeNode,HFETAsourceNode); - TSTALLOC(HFETAsourcePrimeDrainPrimePtr,HFETAsourcePrimeNode,HFETAdrainPrimeNode); - TSTALLOC(HFETAdrainDrainPtr,HFETAdrainNode,HFETAdrainNode); - TSTALLOC(HFETAgatePrimeGatePrimePtr,HFETAgatePrimeNode,HFETAgatePrimeNode); - TSTALLOC(HFETAsourceSourcePtr,HFETAsourceNode,HFETAsourceNode); - TSTALLOC(HFETAdrainPrimeDrainPrimePtr,HFETAdrainPrimeNode,HFETAdrainPrimeNode); - TSTALLOC(HFETAsourcePrimeSourcePrimePtr,HFETAsourcePrimeNode,HFETAsourcePrimeNode); - TSTALLOC(HFETAdrainPrimeDrainPrmPrmPtr,HFETAdrainPrimeNode,HFETAdrainPrmPrmNode); - TSTALLOC(HFETAdrainPrmPrmDrainPrimePtr,HFETAdrainPrmPrmNode,HFETAdrainPrimeNode); - TSTALLOC(HFETAdrainPrmPrmGatePrimePtr,HFETAdrainPrmPrmNode,HFETAgatePrimeNode); - TSTALLOC(HFETAgatePrimeDrainPrmPrmPtr,HFETAgatePrimeNode,HFETAdrainPrmPrmNode); - TSTALLOC(HFETAdrainPrmPrmDrainPrmPrmPtr,HFETAdrainPrmPrmNode,HFETAdrainPrmPrmNode); - TSTALLOC(HFETAsourcePrimeSourcePrmPrmPtr,HFETAsourcePrimeNode,HFETAsourcePrmPrmNode); - TSTALLOC(HFETAsourcePrmPrmSourcePrimePtr,HFETAsourcePrmPrmNode,HFETAsourcePrimeNode); - TSTALLOC(HFETAsourcePrmPrmGatePrimePtr,HFETAsourcePrmPrmNode,HFETAgatePrimeNode); - TSTALLOC(HFETAgatePrimeSourcePrmPrmPtr,HFETAgatePrimeNode,HFETAsourcePrmPrmNode); - TSTALLOC(HFETAsourcePrmPrmSourcePrmPrmPtr,HFETAsourcePrmPrmNode,HFETAsourcePrmPrmNode); - TSTALLOC(HFETAgateGatePtr,HFETAgateNode,HFETAgateNode); - TSTALLOC(HFETAgateGatePrimePtr,HFETAgateNode,HFETAgatePrimeNode); - TSTALLOC(HFETAgatePrimeGatePtr,HFETAgatePrimeNode,HFETAgateNode); - } - } - return(OK); -} - -int -HFETAunsetup(GENmodel *inModel, CKTcircuit *ckt) -{ - HFETAmodel *model; - HFETAinstance *here; - - for (model = (HFETAmodel *)inModel; model != NULL; - model = HFETAnextModel(model)) - { - for (here = HFETAinstances(model); here != NULL; - here=HFETAnextInstance(here)) - { - if (here->HFETAsourcePrmPrmNode > 0 - && here->HFETAsourcePrmPrmNode != here->HFETAsourcePrimeNode) - CKTdltNNum(ckt, here->HFETAsourcePrmPrmNode); - here->HFETAsourcePrmPrmNode = 0; - - if (here->HFETAdrainPrmPrmNode > 0 - && here->HFETAdrainPrmPrmNode != here->HFETAdrainPrimeNode) - CKTdltNNum(ckt, here->HFETAdrainPrmPrmNode); - here->HFETAdrainPrmPrmNode = 0; - - if (here->HFETAgatePrimeNode > 0 - && here->HFETAgatePrimeNode != here->HFETAgateNode) - CKTdltNNum(ckt, here->HFETAgatePrimeNode); - here->HFETAgatePrimeNode = 0; - - if (here->HFETAdrainPrimeNode > 0 - && here->HFETAdrainPrimeNode != here->HFETAdrainNode) - CKTdltNNum(ckt, here->HFETAdrainPrimeNode); - here->HFETAdrainPrimeNode = 0; - - if (here->HFETAsourcePrimeNode > 0 - && here->HFETAsourcePrimeNode != here->HFETAsourceNode) - CKTdltNNum(ckt, here->HFETAsourcePrimeNode); - here->HFETAsourcePrimeNode = 0; - - } - } - return OK; -} - diff --git a/src/spicelib/devices/hfet1/hfettemp.c b/src/spicelib/devices/hfet1/hfettemp.c deleted file mode 100644 index 6970f8539..000000000 --- a/src/spicelib/devices/hfet1/hfettemp.c +++ /dev/null @@ -1,106 +0,0 @@ -/********** -Imported from MacSpice3f4 - Antony Wilson -Modified: Paolo Nenzi -**********/ - -#include "ngspice/ngspice.h" -#include "ngspice/smpdefs.h" -#include "ngspice/cktdefs.h" -#include "hfetdefs.h" -#include "ngspice/const.h" -#include "ngspice/sperror.h" -#include "ngspice/suffix.h" - - -/* ARGSUSED */ -int -HFETAtemp(GENmodel *inModel, CKTcircuit *ckt) -{ - HFETAmodel *model = (HFETAmodel*)inModel; - HFETAinstance *here; - double vt; - double temp; - - /* loop through all the diode models */ - for( ; model != NULL; model = HFETAnextModel(model)) { - if(model->HFETArd != 0) { - model->HFETAdrainConduct = 1/model->HFETArd; - } else { - model->HFETAdrainConduct = 0; - } - if(model->HFETArs != 0) { - model->HFETAsourceConduct = 1/model->HFETArs; - } else { - model->HFETAsourceConduct = 0; - } - if(model->HFETArg != 0) { - model->HFETAgateConduct = 1/model->HFETArg; - } else { - model->HFETAgateConduct = 0; - } - if(model->HFETAri != 0) { - model->HFETAgi = 1/model->HFETAri; - } else { - model->HFETAgi = 0; - } - if(model->HFETArf != 0) { - model->HFETAgf = 1/model->HFETArf; - } else { - model->HFETAgf = 0; - } - model->HFETAdeltaSqr = model->HFETAdelta*model->HFETAdelta; - model->HFETAthreshold *= model->HFETAtype; - - if(!model->HFETAvt2Given) - VT2 = VTO; - if(!model->HFETAvt1Given) - IN_VT1 = VTO+CHARGE*NMAX*DI/EPSI; - - for (here = HFETAinstances(model); here != NULL ; - here=HFETAnextInstance(here)) { - - if(!here->HFETAdtempGiven) { - here->HFETAdtemp = 0.0; - } - - if(!here->HFETAtempGiven) { - here->HFETAtemp = ckt->CKTtemp + here->HFETAdtemp; - } - - vt = CONSTKoverQ*TEMP; - TLAMBDA = LAMBDA + KLAMBDA*(TEMP-ckt->CKTnomTemp); - TMU = MU - KMU*(TEMP-ckt->CKTnomTemp); - TVTO = VTO - KVTO*(TEMP-ckt->CKTnomTemp); - N0 = EPSI*ETA*vt/2/CHARGE/(DI+DELTAD); - N01 = EPSI*ETA1*vt/2/CHARGE/D1; - if(model->HFETAeta2Given) - N02 = EPSI*ETA2*vt/2/CHARGE/D2; - else - N02 = 0.0; - GCHI0 = CHARGE*W*TMU/L; - CF = 0.5*EPSI*W; - IMAX = CHARGE*NMAX*VS*W; - IS1D = JS1D*W*L/2; - IS2D = JS2D*W*L/2; - IS1S = JS1S*W*L/2; - IS2S = JS2S*W*L/2; - ISO = ASTAR*W*L/2; - GGRWL = GGR*L*W/2; - temp = exp(TEMP/model->HFETAtf); - FGDS = model->HFETAfgds*temp; - DELF = model->HFETAdelf*temp; - if(model->HFETAgatemod == 0) { - if(IS1S != 0) - here->HFETAvcrit = vt*log(vt/(CONSTroot2*IS1S)); - else - here->HFETAvcrit = DBL_MAX; - } else { - if(ISO != 0.0) - here->HFETAvcrit = vt*log(vt/(CONSTroot2*ISO)); - else - here->HFETAvcrit = DBL_MAX; - } - } - } - return(OK); -} diff --git a/src/spicelib/devices/hfet1/hfettrunc.c b/src/spicelib/devices/hfet1/hfettrunc.c deleted file mode 100644 index 7670ddd42..000000000 --- a/src/spicelib/devices/hfet1/hfettrunc.c +++ /dev/null @@ -1,27 +0,0 @@ -/********** -Imported from MacSpice3f4 - Antony Wilson -Modified: Paolo Nenzi -**********/ - -#include "ngspice/ngspice.h" -#include "ngspice/cktdefs.h" -#include "hfetdefs.h" -#include "ngspice/sperror.h" -#include "ngspice/suffix.h" - - -int -HFETAtrunc(GENmodel *inModel, CKTcircuit *ckt, double *timeStep) -{ - HFETAmodel *model = (HFETAmodel*)inModel; - HFETAinstance *here; - - for( ; model != NULL; model = HFETAnextModel(model)) { - for(here=HFETAinstances(model);here!=NULL;here = HFETAnextInstance(here)){ - - CKTterr(here->HFETAqgs,ckt,timeStep); - CKTterr(here->HFETAqgd,ckt,timeStep); - } - } - return(OK); -} diff --git a/src/spicelib/devices/hfet2/Makefile.am b/src/spicelib/devices/hfet2/Makefile.am deleted file mode 100644 index 1dbd732ca..000000000 --- a/src/spicelib/devices/hfet2/Makefile.am +++ /dev/null @@ -1,28 +0,0 @@ -## Process this file with automake to produce Makefile.in - -noinst_LTLIBRARIES = libhfet2.la - -libhfet2_la_SOURCES = \ - hfet2.c \ - hfet2acl.c \ - hfet2ask.c \ - hfet2defs.h \ - hfet2ext.h \ - hfet2getic.c \ - hfet2init.c \ - hfet2init.h \ - hfet2itf.h \ - hfet2load.c \ - hfet2mask.c \ - hfet2mpar.c \ - hfet2param.c \ - hfet2pzl.c \ - hfet2setup.c \ - hfet2temp.c \ - hfet2trunc.c - - - -AM_CPPFLAGS = @AM_CPPFLAGS@ -I$(top_srcdir)/src/include -AM_CFLAGS = $(STATIC) -MAINTAINERCLEANFILES = Makefile.in diff --git a/src/spicelib/devices/hfet2/hfet2.c b/src/spicelib/devices/hfet2/hfet2.c deleted file mode 100644 index 0e08839db..000000000 --- a/src/spicelib/devices/hfet2/hfet2.c +++ /dev/null @@ -1,99 +0,0 @@ -/********** -Imported from MacSpice3f4 - Antony Wilson -Modified: Paolo Nenzi -**********/ - -#include "ngspice/ngspice.h" -#include "ngspice/ifsim.h" -#include "ngspice/devdefs.h" -#include "hfet2defs.h" -#include "ngspice/suffix.h" - - -IFparm HFET2pTable[] = { /* parameters */ - OP("off", HFET2_OFF, IF_FLAG ,"Device initialli OFF"), - IOP("l", HFET2_LENGTH, IF_REAL ,"Length of device"), - IOP("w", HFET2_WIDTH, IF_REAL ,"Width of device"), - IOP("m", HFET2_M, IF_REAL ,"Parallel Multiplier"), - IOP("icvds", HFET2_IC_VDS, IF_REAL ,"Initial D-S voltage"), - IOP("icvgs", HFET2_IC_VGS, IF_REAL ,"Initial G-S voltage"), - IOP("temp", HFET2_TEMP, IF_REAL ,"Instance temperature"), - IOP("dtemp", HFET2_DTEMP, IF_REAL ,"Instance temperature difference"), - OP("dnode", HFET2_DRAINNODE, IF_INTEGER ,"Number of drain node"), - OP("gnode", HFET2_GATENODE, IF_INTEGER ,"Number of gate node"), - OP("snode", HFET2_SOURCENODE, IF_INTEGER ,"Number of source node"), - OP("dprimenode",HFET2_DRAINPRIMENODE, IF_INTEGER ,"Number of internal drain node"), - OP("sprimenode",HFET2_SOURCEPRIMENODE,IF_INTEGER ,"Number of internal source node"), - OP("vgs", HFET2_VGS, IF_REAL ,"Gate-Source voltage"), - OP("vgd", HFET2_VGD, IF_REAL ,"Gate-Drain voltage"), - OP("cg", HFET2_CG, IF_REAL ,"Gate capacitance"), - OP("cd", HFET2_CD, IF_REAL ,"Drain capacitance"), - OP("cgd", HFET2_CGD, IF_REAL ,"Gate_Drain capacitance"), - OP("gm", HFET2_GM, IF_REAL ,"Transconductance"), - OP("gds", HFET2_GDS, IF_REAL ,"Drain-Source conductance"), - OP("ggs", HFET2_GGS, IF_REAL ,"Gate-Source conductance"), - OP("ggd", HFET2_GGD, IF_REAL ,"Gate-Drain conductance"), - OP("qgs", HFET2_QGS, IF_REAL ,"Gate-Source charge storage"), - OP("cqgs", HFET2_CQGS, IF_REAL ,"Capacitance due to gate-source charge storage"), - OP("qgd", HFET2_QGD, IF_REAL ,"Gate-Drain charge storage"), - OP("cqgd", HFET2_CQGD, IF_REAL ,"Capacitance due to gate-drain charge storage"), - OP("cs", HFET2_CS, IF_REAL ,"Source current"), - OP("p", HFET2_POWER, IF_REAL ,"Power dissipated by the mesfet") - -}; - -IFparm HFET2mPTable[] = { /* model parameters */ - OP( "type", HFET2_MOD_TYPE, IF_STRING,"NHFET or PHFET"), - IOP( "nhfet", HFET2_MOD_NHFET, IF_FLAG,"N type HFET model"), - IOP( "phfet", HFET2_MOD_PHFET, IF_FLAG,"P type HFET model"), - IOP( "cf", HFET2_MOD_CF, IF_REAL,""), - IOP( "d1", HFET2_MOD_D1, IF_REAL,""), - IOP( "d2", HFET2_MOD_D2, IF_REAL,""), - IOP( "del", HFET2_MOD_DEL, IF_REAL,""), - IOP( "delta", HFET2_MOD_DELTA, IF_REAL,""), - IOP( "deltad", HFET2_MOD_DELTAD, IF_REAL,"Thickness correction"), - IOP( "di", HFET2_MOD_DI, IF_REAL,"Depth of device"), - IOP( "epsi", HFET2_MOD_EPSI, IF_REAL,""), - IOP( "eta", HFET2_MOD_ETA, IF_REAL,"Subthreshold ideality factor"), - IOP( "eta1", HFET2_MOD_ETA1, IF_REAL,""), - IOP( "eta2", HFET2_MOD_ETA2, IF_REAL,""), - IOP( "gamma", HFET2_MOD_GAMMA, IF_REAL,"Knee shape parameter"), - IOP( "ggr", HFET2_MOD_GGR, IF_REAL,""), - IOP( "js", HFET2_MOD_JS, IF_REAL,""), - IOP( "klambda", HFET2_MOD_KLAMBDA, IF_REAL,""), - IOP( "kmu", HFET2_MOD_KMU, IF_REAL,""), - IOP( "knmax", HFET2_MOD_KNMAX, IF_REAL,""), - IOP( "kvto", HFET2_MOD_KVTO, IF_REAL,""), - IOP( "lambda", HFET2_MOD_LAMBDA, IF_REAL,"Output conductance parameter"), - IOP( "m", HFET2_MOD_M, IF_REAL,"Knee shape parameter"), - IOP( "mc", HFET2_MOD_MC, IF_REAL,"Knee shape parameter"), - IOP( "mu", HFET2_MOD_MU, IF_REAL,"Moblity"), - IOP( "n", HFET2_MOD_N, IF_REAL,""), - IOP( "nmax", HFET2_MOD_NMAX, IF_REAL,""), - IOP( "p", HFET2_MOD_P, IF_REAL,""), - IOP( "rd", HFET2_MOD_RD, IF_REAL,"Drain ohmic resistance"), - IOP( "rdi", HFET2_MOD_RDI, IF_REAL,"Drain ohmic resistance"), - IOP( "rs", HFET2_MOD_RS, IF_REAL,"Source ohmic resistance"), - IOP( "rsi", HFET2_MOD_RSI, IF_REAL,"Source ohmic resistance"), - IOP( "sigma0", HFET2_MOD_SIGMA0, IF_REAL,"DIBL parameter"), - IOP( "vs", HFET2_MOD_VS, IF_REAL,"Saturation velocity"), - IOP( "vsigma", HFET2_MOD_VSIGMA, IF_REAL,""), - IOP( "vsigmat", HFET2_MOD_VSIGMAT, IF_REAL,""), - IOP( "vt0", HFET2_MOD_VTO, IF_REAL,"Pinch-off voltage"), - IOPR("vto", HFET2_MOD_VTO, IF_REAL,"Pinch-off voltage"), - IOP( "vt1", HFET2_MOD_VT1, IF_REAL,""), - IOP( "vt2", HFET2_MOD_VT2, IF_REAL,"") - -}; - -char *HFET2names[] = { - "Drain", - "Gate", - "Source" -}; - -int HFET2nSize = NUMELEMS(HFET2names); -int HFET2pTSize = NUMELEMS(HFET2pTable); -int HFET2mPTSize = NUMELEMS(HFET2mPTable); -int HFET2iSize = sizeof(HFET2instance); -int HFET2mSize = sizeof(HFET2model); diff --git a/src/spicelib/devices/hfet2/hfet2acl.c b/src/spicelib/devices/hfet2/hfet2acl.c deleted file mode 100644 index 073f35353..000000000 --- a/src/spicelib/devices/hfet2/hfet2acl.c +++ /dev/null @@ -1,71 +0,0 @@ -/********** -Imported from MacSpice3f4 - Antony Wilson -Modified: Paolo Nenzi -**********/ - -#include "ngspice/ngspice.h" -#include "ngspice/cktdefs.h" -#include "hfet2defs.h" -#include "ngspice/sperror.h" -#include "ngspice/suffix.h" - - -int HFET2acLoad(GENmodel *inModel, CKTcircuit *ckt) -{ - - HFET2model *model = (HFET2model*)inModel; - HFET2instance *here; - double gdpr; - double gspr; - double gm; - double gds; - double ggs; - double xgs; - double ggd; - double xgd; - - double m; - - for( ; model != NULL; model = HFET2nextModel(model)) - { - for( here = HFET2instances(model); here != NULL; - here = HFET2nextInstance(here)) { - - m = here->HFET2m; - - gdpr=model->HFET2drainConduct; - gspr=model->HFET2sourceConduct; - gm= *(ckt->CKTstate0 + here->HFET2gm) ; - gds= *(ckt->CKTstate0 + here->HFET2gds) ; - ggs= *(ckt->CKTstate0 + here->HFET2ggs) ; - xgs= *(ckt->CKTstate0 + here->HFET2qgs) * ckt->CKTomega ; - ggd= *(ckt->CKTstate0 + here->HFET2ggd) ; - xgd= *(ckt->CKTstate0 + here->HFET2qgd) * ckt->CKTomega ; - - *(here->HFET2drainDrainPtr ) += m * (gdpr); - *(here->HFET2gateGatePtr ) += m * (ggd+ggs); - *(here->HFET2gateGatePtr +1) += m * (xgd+xgs); - *(here->HFET2sourceSourcePtr ) += m * (gspr); - *(here->HFET2drainPrimeDrainPrimePtr ) += m * (gdpr+gds+ggd); - *(here->HFET2drainPrimeDrainPrimePtr +1) += m * (xgd); - *(here->HFET2sourcePriHFET2ourcePrimePtr ) += m * (gspr+gds+gm+ggs); - *(here->HFET2sourcePriHFET2ourcePrimePtr +1) += m * (xgs); - *(here->HFET2drainDrainPrimePtr ) -= m * (gdpr); - *(here->HFET2gateDrainPrimePtr ) -= m * (ggd); - *(here->HFET2gateDrainPrimePtr +1) -= m * (xgd); - *(here->HFET2gateSourcePrimePtr ) -= m * (ggs); - *(here->HFET2gateSourcePrimePtr +1) -= m * (xgs); - *(here->HFET2sourceSourcePrimePtr ) -= m * (gspr); - *(here->HFET2drainPrimeDrainPtr ) -= m * (gdpr); - *(here->HFET2drainPrimeGatePtr ) += m * (-ggd+gm); - *(here->HFET2drainPrimeGatePtr +1) -= m * (xgd); - *(here->HFET2drainPriHFET2ourcePrimePtr ) += m * (-gds-gm); - *(here->HFET2sourcePrimeGatePtr ) += m * (-ggs-gm); - *(here->HFET2sourcePrimeGatePtr +1) -= m * (xgs); - *(here->HFET2sourcePriHFET2ourcePtr ) -= m * (gspr); - *(here->HFET2sourcePrimeDrainPrimePtr ) -= m * (gds); - } - } - return(OK); - -} diff --git a/src/spicelib/devices/hfet2/hfet2ask.c b/src/spicelib/devices/hfet2/hfet2ask.c deleted file mode 100644 index 780c25a7e..000000000 --- a/src/spicelib/devices/hfet2/hfet2ask.c +++ /dev/null @@ -1,149 +0,0 @@ -/********** -Copyright 1990 Regents of the University of California. All rights reserved. -Author: 1987 Thomas L. Quarles -**********/ -/* -Imported into HFET2 source: Paolo Nenzi 2001 - */ - -#include "ngspice/ngspice.h" -#include "ngspice/cktdefs.h" -#include "ngspice/devdefs.h" -#include "ngspice/ifsim.h" -#include "hfet2defs.h" -#include "ngspice/sperror.h" -#include "ngspice/suffix.h" - - -/* ARGSUSED */ -int -HFET2ask(CKTcircuit *ckt, GENinstance *inst, int which, IFvalue *value, - IFvalue *select) -{ - HFET2instance *here = (HFET2instance*)inst; - static char *msg = "Current and power not available in ac analysis"; - - NG_IGNORE(select); - - switch(which) { - case HFET2_LENGTH: - value->rValue = here->HFET2length; - return (OK); - case HFET2_WIDTH: - value->rValue = here->HFET2width; - value->rValue *= here->HFET2m; - return (OK); - case HFET2_IC_VDS: - value->rValue = here->HFET2icVDS; - return (OK); - case HFET2_IC_VGS: - value->rValue = here->HFET2icVGS; - return (OK); - case HFET2_OFF: - value->iValue = here->HFET2off; - return (OK); - case HFET2_DRAINNODE: - value->iValue = here->HFET2drainNode; - return (OK); - case HFET2_GATENODE: - value->iValue = here->HFET2gateNode; - return (OK); - case HFET2_SOURCENODE: - value->iValue = here->HFET2sourceNode; - return (OK); - case HFET2_DRAINPRIMENODE: - value->iValue = here->HFET2drainPrimeNode; - return (OK); - case HFET2_SOURCEPRIMENODE: - value->iValue = here->HFET2sourcePrimeNode; - return (OK); - case HFET2_TEMP: - value->rValue = here->HFET2temp - CONSTCtoK; - return (OK); - case HFET2_DTEMP: - value->rValue = here->HFET2dtemp; - return (OK); - case HFET2_VGS: - value->rValue = *(ckt->CKTstate0 + here->HFET2vgs); - return (OK); - case HFET2_VGD: - value->rValue = *(ckt->CKTstate0 + here->HFET2vgd); - return (OK); - case HFET2_CG: - value->rValue = *(ckt->CKTstate0 + here->HFET2cg); - value->rValue *= here->HFET2m; - return (OK); - case HFET2_CD: - value->rValue = *(ckt->CKTstate0 + here->HFET2cd); - value->rValue *= here->HFET2m; - return (OK); - case HFET2_CGD: - value->rValue = *(ckt->CKTstate0 + here->HFET2cgd); - value->rValue *= here->HFET2m; - return (OK); - case HFET2_GM: - value->rValue = *(ckt->CKTstate0 + here->HFET2gm); - value->rValue *= here->HFET2m; - return (OK); - case HFET2_GDS: - value->rValue = *(ckt->CKTstate0 + here->HFET2gds); - value->rValue *= here->HFET2m; - return (OK); - case HFET2_GGS: - value->rValue = *(ckt->CKTstate0 + here->HFET2ggs); - value->rValue *= here->HFET2m; - return (OK); - case HFET2_GGD: - value->rValue = *(ckt->CKTstate0 + here->HFET2ggd); - value->rValue *= here->HFET2m; - return (OK); - case HFET2_QGS: - value->rValue = *(ckt->CKTstate0 + here->HFET2qgs); - value->rValue *= here->HFET2m; - return (OK); - case HFET2_CQGS: - value->rValue = *(ckt->CKTstate0 + here->HFET2cqgs); - value->rValue *= here->HFET2m; - return (OK); - case HFET2_QGD: - value->rValue = *(ckt->CKTstate0 + here->HFET2qgd); - value->rValue *= here->HFET2m; - return (OK); - case HFET2_CQGD: - value->rValue = *(ckt->CKTstate0 + here->HFET2cqgd); - value->rValue *= here->HFET2m; - return (OK); - case HFET2_CS : - if (ckt->CKTcurrentAnalysis & DOING_AC) { - errMsg = TMALLOC(char, strlen(msg) + 1); - errRtn = "HFET2ask"; - strcpy(errMsg,msg); - return(E_ASKCURRENT); - } else { - value->rValue = -*(ckt->CKTstate0 + here->HFET2cd); - value->rValue -= *(ckt->CKTstate0 + here->HFET2cg); - value->rValue *= here->HFET2m; - } - return(OK); - case HFET2_POWER : - if (ckt->CKTcurrentAnalysis & DOING_AC) { - errMsg = TMALLOC(char, strlen(msg) + 1); - errRtn = "HFET2ask"; - strcpy(errMsg,msg); - return(E_ASKPOWER); - } else { - value->rValue = *(ckt->CKTstate0 + here->HFET2cd) * - *(ckt->CKTrhsOld + here->HFET2drainNode); - value->rValue += *(ckt->CKTstate0 + here->HFET2cg) * - *(ckt->CKTrhsOld + here->HFET2gateNode); - value->rValue -= (*(ckt->CKTstate0+here->HFET2cd) + - *(ckt->CKTstate0 + here->HFET2cg)) * - *(ckt->CKTrhsOld + here->HFET2sourceNode); - value->rValue *= here->HFET2m; - } - return(OK); - default: - return (E_BADPARM); - } - /* NOTREACHED */ -} diff --git a/src/spicelib/devices/hfet2/hfet2defs.h b/src/spicelib/devices/hfet2/hfet2defs.h deleted file mode 100644 index 9afff3d0f..000000000 --- a/src/spicelib/devices/hfet2/hfet2defs.h +++ /dev/null @@ -1,338 +0,0 @@ -#ifndef HFET2 -#define HFET2 - -#include "ngspice/ifsim.h" -#include "ngspice/cktdefs.h" -#include "ngspice/gendefs.h" -#include "ngspice/complex.h" -#include "ngspice/noisedef.h" - - -typedef struct sHFET2instance { - - struct GENinstance gen; - -#define HFET2modPtr(inst) ((struct sHFET2model *)((inst)->gen.GENmodPtr)) -#define HFET2nextInstance(inst) ((struct sHFET2instance *)((inst)->gen.GENnextInstance)) -#define HFET2name gen.GENname -#define HFET2state gen.GENstate - - int HFET2drainNode; - int HFET2gateNode; - int HFET2sourceNode; - int HFET2drainPrimeNode; - int HFET2sourcePrimeNode; - double HFET2length; - double HFET2width; - double HFET2m; - double HFET2temp; - double HFET2dtemp; - double HFET2tLambda; - double HFET2tMu; - double HFET2tNmax; - double HFET2tVto; - double HFET2icVDS; - double HFET2icVGS; - double *HFET2drainDrainPrimePtr; - double *HFET2gateDrainPrimePtr; - double *HFET2gateSourcePrimePtr; - double *HFET2sourceSourcePrimePtr; - double *HFET2drainPrimeDrainPtr; - double *HFET2drainPrimeGatePtr; - double *HFET2drainPriHFET2ourcePrimePtr; - double *HFET2sourcePrimeGatePtr; - double *HFET2sourcePriHFET2ourcePtr; - double *HFET2sourcePrimeDrainPrimePtr; - double *HFET2drainDrainPtr; - double *HFET2gateGatePtr; - double *HFET2sourceSourcePtr; - double *HFET2drainPrimeDrainPrimePtr; - double *HFET2sourcePriHFET2ourcePrimePtr; - - -#define HFET2vgs HFET2state -#define HFET2vgd HFET2state+1 -#define HFET2cg HFET2state+2 -#define HFET2cd HFET2state+3 -#define HFET2cgd HFET2state+4 -#define HFET2gm HFET2state+5 -#define HFET2gds HFET2state+6 -#define HFET2ggs HFET2state+7 -#define HFET2ggd HFET2state+8 -#define HFET2qgs HFET2state+9 -#define HFET2cqgs HFET2state+10 -#define HFET2qgd HFET2state+11 -#define HFET2cqgd HFET2state+12 - -#define HFET2numStates 13 - - int HFET2mode; - int HFET2off; - - unsigned HFET2icVDSGiven : 1; - unsigned HFET2icVGSGiven : 1; - unsigned HFET2lengthGiven : 1; - unsigned HFET2widthGiven : 1; - unsigned HFET2mGiven : 1; - unsigned HFET2tempGiven : 1; - unsigned HFET2dtempGiven : 1; - - double HFET2n0; - double HFET2n01; - double HFET2n02; - double HFET2gchi0; - double HFET2imax; - double HFET2vcrit; - double HFET2ggrlw; - double HFET2jslw; - -} HFET2instance ; - - - -typedef struct sHFET2model { - - struct GENmodel gen; - -#define HFET2modType gen.GENmodType -#define HFET2nextModel(inst) ((struct sHFET2model *)((inst)->gen.GENnextModel)) -#define HFET2instances(inst) ((HFET2instance *)((inst)->gen.GENinstances)) -#define HFET2modName gen.GENmodName - - int HFET2type; - - double HFET2cf; - double HFET2d1; - double HFET2d2; - double HFET2del; - double HFET2delta; - double HFET2deltad; - double HFET2di; - double HFET2epsi; - double HFET2eta; - double HFET2eta1; - double HFET2eta2; - double HFET2gamma; - double HFET2ggr; - double HFET2js; - double HFET2klambda; - double HFET2kmu; - double HFET2knmax; - double HFET2kvto; - double HFET2lambda; - double HFET2m; - double HFET2mc; - double HFET2mu; - double HFET2n; - double HFET2nmax; - double HFET2p; - double HFET2rd; - double HFET2rdi; - double HFET2rs; - double HFET2rsi; - double HFET2sigma0; - double HFET2vs; - double HFET2vsigma; - double HFET2vsigmat; - double HFET2vt1; - double HFET2vt2; - double HFET2vto; - - double HFET2drainConduct; - double HFET2sourceConduct; - double HFET2deltaSqr; - - unsigned HFET2cfGiven : 1; - unsigned HFET2d1Given : 1; - unsigned HFET2d2Given : 1; - unsigned HFET2delGiven : 1; - unsigned HFET2deltaGiven : 1; - unsigned HFET2deltadGiven : 1; - unsigned HFET2diGiven : 1; - unsigned HFET2epsiGiven : 1; - unsigned HFET2etaGiven : 1; - unsigned HFET2eta1Given : 1; - unsigned HFET2eta2Given : 1; - unsigned HFET2gammaGiven : 1; - unsigned HFET2ggrGiven : 1; - unsigned HFET2jsGiven : 1; - unsigned HFET2klambdaGiven : 1; - unsigned HFET2kmuGiven : 1; - unsigned HFET2knmaxGiven : 1; - unsigned HFET2kvtoGiven : 1; - unsigned HFET2lambdaGiven : 1; - unsigned HFET2mGiven : 1; - unsigned HFET2mcGiven : 1; - unsigned HFET2muGiven : 1; - unsigned HFET2nGiven : 1; - unsigned HFET2nmaxGiven : 1; - unsigned HFET2pGiven : 1; - unsigned HFET2rdGiven : 1; - unsigned HFET2rdiGiven : 1; - unsigned HFET2rsGiven : 1; - unsigned HFET2rsiGiven : 1; - unsigned HFET2sigma0Given : 1; - unsigned HFET2vsGiven : 1; - unsigned HFET2vsigmaGiven : 1; - unsigned HFET2vsigmatGiven : 1; - unsigned HFET2vt1Given : 1; - unsigned HFET2vt2Given : 1; - unsigned HFET2vtoGiven : 1; - -} HFET2model; - - -#ifndef NHFET -#define NHFET 1 -#define PHFET -1 -#endif /*NMF*/ - -/* device parameters */ -enum { - HFET2_LENGTH = 1, - HFET2_WIDTH, - HFET2_IC_VDS, - HFET2_IC_VGS, - HFET2_IC, - HFET2_OFF, - HFET2_CS, - HFET2_POWER, - HFET2_TEMP, - HFET2_DTEMP, - HFET2_M, -}; - -/* model parameters */ -enum { - HFET2_MOD_NHFET = 101, - HFET2_MOD_PHFET, - HFET2_MOD_CF, - HFET2_MOD_D1, - HFET2_MOD_D2, - HFET2_MOD_DEL, - HFET2_MOD_DELTA, - HFET2_MOD_DELTAD, - HFET2_MOD_DI, - HFET2_MOD_EPSI, - HFET2_MOD_ETA, - HFET2_MOD_ETA1, - HFET2_MOD_ETA2, - HFET2_MOD_GAMMA, - HFET2_MOD_GGR, - HFET2_MOD_JS, - HFET2_MOD_KLAMBDA, - HFET2_MOD_KMU, - HFET2_MOD_KNMAX, - HFET2_MOD_KVTO, - HFET2_MOD_LAMBDA, - HFET2_MOD_M, - HFET2_MOD_MC, - HFET2_MOD_MU, - HFET2_MOD_N, - HFET2_MOD_NMAX, - HFET2_MOD_P, - HFET2_MOD_RD, - HFET2_MOD_RDI, - HFET2_MOD_RS, - HFET2_MOD_RSI, - HFET2_MOD_SIGMA0, - HFET2_MOD_VS, - HFET2_MOD_VSIGMA, - HFET2_MOD_VSIGMAT, - HFET2_MOD_VT1, - HFET2_MOD_VT2, - HFET2_MOD_VTO, - HFET2_MOD_TYPE, -}; - -/* device questions */ - -enum { - HFET2_DRAINNODE = 201, - HFET2_GATENODE, - HFET2_SOURCENODE, - HFET2_DRAINPRIMENODE, - HFET2_SOURCEPRIMENODE, - HFET2_VGS, - HFET2_VGD, - HFET2_CG, - HFET2_CD, - HFET2_CGD, - HFET2_GM, - HFET2_GDS, - HFET2_GGS, - HFET2_GGD, - HFET2_QGS, - HFET2_CQGS, - HFET2_QGD, - HFET2_CQGD, -}; - -/* model questions */ - -enum { - HFET2_MOD_DRAINCONDUCT = 301, - HFET2_MOD_SOURCECONDUCT, - HFET2_MOD_DEPLETIONCAP, - HFET2_MOD_VCRIT, -}; - -#define CF (model->HFET2cf) -#define D1 (model->HFET2d1) -#define D2 (model->HFET2d2) -#define DEL (model->HFET2del) -#define DELTA (model->HFET2delta) -#define DELTAD (model->HFET2deltad) -#define DI (model->HFET2di) -#define EPSI (model->HFET2epsi) -#define ETA (model->HFET2eta) -#define ETA1 (model->HFET2eta1) -#define ETA2 (model->HFET2eta2) -#define GAMMA (model->HFET2gamma) -#define GGR (model->HFET2ggr) -#define JS (model->HFET2js) -#define KLAMBDA (model->HFET2klambda) -#define KMU (model->HFET2kmu) -#define KNMAX (model->HFET2knmax) -#define KVTO (model->HFET2kvto) -#define LAMBDA (model->HFET2lambda) -#define M (model->HFET2m) -#define MC (model->HFET2mc) -#define MU (model->HFET2mu) -#define N (model->HFET2n) -#define NMAX (model->HFET2nmax) -#define PP (model->HFET2p) -#define RD (model->HFET2rd) -#define RDI (model->HFET2rdi) -#define RS (model->HFET2rs) -#define RSI (model->HFET2rsi) -#define SIGMA0 (model->HFET2sigma0) -#define TYPE (model->HFET2type) -#define VS (model->HFET2vs) -#define VSIGMA (model->HFET2vsigma) -#define VSIGMAT (model->HFET2vsigmat) -#define HFET2_VT1 (model->HFET2vt1) /* Fix a redefinition in include files */ -#define VT2 (model->HFET2vt2) -#define VTO (model->HFET2vto) - -#define DELTA2 (model->HFET2deltaSqr) - -#define GCHI0 (here->HFET2gchi0) -#define GGRLW (here->HFET2ggrlw) -#define JSLW (here->HFET2jslw) -#define IMAX (here->HFET2imax) -#define L (here->HFET2length) -#define N0 (here->HFET2n0) -#define N01 (here->HFET2n01) -#define N02 (here->HFET2n02) -#define TEMP (here->HFET2temp) -#define TLAMBDA (here->HFET2tLambda) -#define TMU (here->HFET2tMu) -#define TNMAX (here->HFET2tNmax) -#define TVTO (here->HFET2tVto) -#define VCRIT (here->HFET2vcrit) -#define W (here->HFET2width) - -#include "hfet2ext.h" - -#endif /*HFET2*/ diff --git a/src/spicelib/devices/hfet2/hfet2ext.h b/src/spicelib/devices/hfet2/hfet2ext.h deleted file mode 100644 index 5ff6fd82b..000000000 --- a/src/spicelib/devices/hfet2/hfet2ext.h +++ /dev/null @@ -1,17 +0,0 @@ -/********** -Copyright 1993: T. Ytterdal, K. Lee, M. Shur and T. A. Fjeldly. All rights reserved. -Author: Trond Ytterdal -**********/ - -extern int HFET2acLoad(GENmodel*,CKTcircuit*); -extern int HFET2ask(CKTcircuit*,GENinstance*,int,IFvalue*,IFvalue*); -extern int HFET2getic(GENmodel*,CKTcircuit*); -extern int HFET2load(GENmodel*,CKTcircuit*); -extern int HFET2mAsk(CKTcircuit*,GENmodel*,int,IFvalue*); -extern int HFET2mParam(int,IFvalue*,GENmodel*); -extern int HFET2param(int,IFvalue*,GENinstance*,IFvalue*); -extern int HFET2pzLoad(GENmodel*, CKTcircuit*, SPcomplex*); -extern int HFET2setup(SMPmatrix*,GENmodel*,CKTcircuit*,int*); -extern int HFET2temp(GENmodel*,CKTcircuit*); -extern int HFET2trunc(GENmodel*,CKTcircuit*,double*); -extern int HFET2unsetup( GENmodel*,CKTcircuit*); diff --git a/src/spicelib/devices/hfet2/hfet2getic.c b/src/spicelib/devices/hfet2/hfet2getic.c deleted file mode 100644 index d605d9053..000000000 --- a/src/spicelib/devices/hfet2/hfet2getic.c +++ /dev/null @@ -1,34 +0,0 @@ -/********** -Imported from MacSpice3f4 - Antony Wilson -Modified: Paolo Nenzi -**********/ - -#include "ngspice/ngspice.h" -#include "ngspice/cktdefs.h" -#include "hfet2defs.h" -#include "ngspice/sperror.h" -#include "ngspice/suffix.h" - - -int HFET2getic(GENmodel *inModel, CKTcircuit *ckt) -{ - - HFET2model *model = (HFET2model*)inModel; - HFET2instance *here; - - for( ; model ; model = HFET2nextModel(model)) { - for(here = HFET2instances(model); here ; here = HFET2nextInstance(here)) { - - if(!here->HFET2icVDSGiven) { - here->HFET2icVDS = *(ckt->CKTrhs + here->HFET2drainNode) - - *(ckt->CKTrhs + here->HFET2sourceNode); - } - if(!here->HFET2icVGSGiven) { - here->HFET2icVGS = *(ckt->CKTrhs + here->HFET2gateNode) - - *(ckt->CKTrhs + here->HFET2sourceNode); - } - } - } - return(OK); - -} diff --git a/src/spicelib/devices/hfet2/hfet2init.c b/src/spicelib/devices/hfet2/hfet2init.c deleted file mode 100644 index 7901d9ed3..000000000 --- a/src/spicelib/devices/hfet2/hfet2init.c +++ /dev/null @@ -1,76 +0,0 @@ -#include "ngspice/config.h" - -#include "ngspice/devdefs.h" - -#include "hfet2itf.h" -#include "hfet2ext.h" -#include "hfet2init.h" - - -SPICEdev HFET2info = { - .DEVpublic = { - .name = "HFET2", - .description = "HFET2 Model", - .terms = &HFET2nSize, - .numNames = &HFET2nSize, - .termNames = HFET2names, - .numInstanceParms = &HFET2pTSize, - .instanceParms = HFET2pTable, - .numModelParms = &HFET2mPTSize, - .modelParms = HFET2mPTable, - .flags = DEV_DEFAULT, - -#ifdef XSPICE - .cm_func = NULL, - .num_conn = 0, - .conn = NULL, - .num_param = 0, - .param = NULL, - .num_inst_var = 0, - .inst_var = NULL, -#endif - }, - - .DEVparam = HFET2param, - .DEVmodParam = HFET2mParam, - .DEVload = HFET2load, - .DEVsetup = HFET2setup, - .DEVunsetup = HFET2unsetup, - .DEVpzSetup = HFET2setup, - .DEVtemperature = HFET2temp, - .DEVtrunc = HFET2trunc, - .DEVfindBranch = NULL, - .DEVacLoad = HFET2acLoad, - .DEVaccept = NULL, - .DEVdestroy = NULL, - .DEVmodDelete = NULL, - .DEVdelete = NULL, - .DEVsetic = HFET2getic, - .DEVask = HFET2ask, - .DEVmodAsk = HFET2mAsk, - .DEVpzLoad = HFET2pzLoad, - .DEVconvTest = NULL, - .DEVsenSetup = NULL, - .DEVsenLoad = NULL, - .DEVsenUpdate = NULL, - .DEVsenAcLoad = NULL, - .DEVsenPrint = NULL, - .DEVsenTrunc = NULL, - .DEVdisto = NULL, - .DEVnoise = NULL, - .DEVsoaCheck = NULL, - .DEVinstSize = &HFET2iSize, - .DEVmodSize = &HFET2mSize, - -#ifdef CIDER - .DEVdump = NULL, - .DEVacct = NULL, -#endif -}; - - -SPICEdev * -get_hfet2_info(void) -{ - return &HFET2info; -} diff --git a/src/spicelib/devices/hfet2/hfet2init.h b/src/spicelib/devices/hfet2/hfet2init.h deleted file mode 100644 index 30ec34c6c..000000000 --- a/src/spicelib/devices/hfet2/hfet2init.h +++ /dev/null @@ -1,13 +0,0 @@ -#ifndef _HFET2INIT_H -#define _HFET2INIT_H - -extern IFparm HFET2pTable[ ]; -extern IFparm HFET2mPTable[ ]; -extern char *HFET2names[ ]; -extern int HFET2pTSize; -extern int HFET2mPTSize; -extern int HFET2nSize; -extern int HFET2iSize; -extern int HFET2mSize; - -#endif diff --git a/src/spicelib/devices/hfet2/hfet2itf.h b/src/spicelib/devices/hfet2/hfet2itf.h deleted file mode 100644 index ef62a26b6..000000000 --- a/src/spicelib/devices/hfet2/hfet2itf.h +++ /dev/null @@ -1,7 +0,0 @@ -#ifndef DEV_HFET2 -#define DEV_HFET2 - -SPICEdev *get_hfet2_info(void); - -#endif - diff --git a/src/spicelib/devices/hfet2/hfet2load.c b/src/spicelib/devices/hfet2/hfet2load.c deleted file mode 100644 index ad891e435..000000000 --- a/src/spicelib/devices/hfet2/hfet2load.c +++ /dev/null @@ -1,468 +0,0 @@ -/********** -Imported from MacSpice3f4 - Antony Wilson -Modified: Paolo Nenzi -**********/ - -#include "ngspice/ngspice.h" -#include "ngspice/devdefs.h" -#include "ngspice/cktdefs.h" -#include "hfet2defs.h" -#include "ngspice/const.h" -#include "ngspice/trandefs.h" -#include "ngspice/sperror.h" -#include "ngspice/suffix.h" - -void Pause(void); - -static void hfeta2(HFET2model *model, HFET2instance *here, CKTcircuit *ckt, - double vgs, double vds, double *cdrain, double *gm, - double *gds, double *capgs, double *capgd); - - -int HFET2load(GENmodel *inModel, CKTcircuit *ckt) -{ - - HFET2model *model = (HFET2model*)inModel; - HFET2instance *here; - double capgd; - double capgs; - double cd; - double cdhat = 0.0; - double cdrain; - double cdreq; - double ceq; - double ceqgd; - double ceqgs; - double cg; - double cgd; - double cghat = 0.0; - double delvds; - double delvgd; - double delvgs; - double gdpr; - double gds; - double geq; - double ggd; - double ggs; - double gm; - double gspr; - double vcrit; - double vds; - double vgd; - double vgd1; - double vgs; - double vgs1; - double vt; - double vto; -#ifndef PREDICTOR - double xfact; -#endif - int icheck; - int ichk1; - int error; - int inverse; - - double m; - - for( ; model != NULL; model = HFET2nextModel(model)) { - for(here = HFET2instances(model); here != NULL; - here=HFET2nextInstance(here)) { - - gdpr = model->HFET2drainConduct; - gspr = model->HFET2sourceConduct; - vcrit = VCRIT; - vto = TVTO; - vt = CONSTKoverQ*TEMP; - icheck = 1; - if( ckt->CKTmode & MODEINITSMSIG) { - vgs = *(ckt->CKTstate0 + here->HFET2vgs); - vgd = *(ckt->CKTstate0 + here->HFET2vgd); - } else if(ckt->CKTmode & MODEINITTRAN) { - vgs = *(ckt->CKTstate1 + here->HFET2vgs); - vgd = *(ckt->CKTstate1 + here->HFET2vgd); - } else if((ckt->CKTmode & MODEINITJCT) && (ckt->CKTmode & MODETRANOP) && - (ckt->CKTmode & MODEUIC) ) { - vds = model->HFET2type*here->HFET2icVDS; - vgs = model->HFET2type*here->HFET2icVGS; - vgd = vgs-vds; - } else if ( (ckt->CKTmode & MODEINITJCT) && (here->HFET2off == 0) ) { - vgs = -1; - vgd = -1; - } else if((ckt->CKTmode & MODEINITJCT) || - ((ckt->CKTmode & MODEINITFIX) && (here->HFET2off))) { - vgs = 0; - vgd = 0; - } else { -#ifndef PREDICTOR - if(ckt->CKTmode & MODEINITPRED) { - xfact = ckt->CKTdelta/ckt->CKTdeltaOld[2]; - *(ckt->CKTstate0 + here->HFET2vgs) = - *(ckt->CKTstate1 + here->HFET2vgs); - vgs = (1+xfact) * *(ckt->CKTstate1 + here->HFET2vgs) - - xfact * *(ckt->CKTstate2 + here->HFET2vgs); - *(ckt->CKTstate0 + here->HFET2vgd) = - *(ckt->CKTstate1 + here->HFET2vgd); - vgd = (1+xfact)* *(ckt->CKTstate1 + here->HFET2vgd) - - xfact * *(ckt->CKTstate2 + here->HFET2vgd); - *(ckt->CKTstate0 + here->HFET2cg) = - *(ckt->CKTstate1 + here->HFET2cg); - *(ckt->CKTstate0 + here->HFET2cd) = - *(ckt->CKTstate1 + here->HFET2cd); - *(ckt->CKTstate0 + here->HFET2cgd) = - *(ckt->CKTstate1 + here->HFET2cgd); - *(ckt->CKTstate0 + here->HFET2gm) = - *(ckt->CKTstate1 + here->HFET2gm); - *(ckt->CKTstate0 + here->HFET2gds) = - *(ckt->CKTstate1 + here->HFET2gds); - *(ckt->CKTstate0 + here->HFET2ggs) = - *(ckt->CKTstate1 + here->HFET2ggs); - *(ckt->CKTstate0 + here->HFET2ggd) = - *(ckt->CKTstate1 + here->HFET2ggd); - } else { -#endif /* PREDICTOR */ - vgs = model->HFET2type* - (*(ckt->CKTrhsOld+ here->HFET2gateNode)- *(ckt->CKTrhsOld+ - here->HFET2sourcePrimeNode)); - vgd = model->HFET2type* - (*(ckt->CKTrhsOld+here->HFET2gateNode)- *(ckt->CKTrhsOld+ - here->HFET2drainPrimeNode)); -#ifndef PREDICTOR - } -#endif /* PREDICTOR */ - delvgs=vgs - *(ckt->CKTstate0 + here->HFET2vgs); - delvgd=vgd - *(ckt->CKTstate0 + here->HFET2vgd); - delvds=delvgs - delvgd; - cghat= *(ckt->CKTstate0 + here->HFET2cg) + - *(ckt->CKTstate0 + here->HFET2ggd)*delvgd + - *(ckt->CKTstate0 + here->HFET2ggs)*delvgs; - cdhat= *(ckt->CKTstate0 + here->HFET2cd) + - *(ckt->CKTstate0 + here->HFET2gm)*delvgs + - *(ckt->CKTstate0 + here->HFET2gds)*delvds - - *(ckt->CKTstate0 + here->HFET2ggd)*delvgd; - - /* bypass if solution has not changed */ - - if((ckt->CKTbypass) && - (!(ckt->CKTmode & MODEINITPRED)) && - (fabs(delvgs) < ckt->CKTreltol*MAX(fabs(vgs), - fabs(*(ckt->CKTstate0 + here->HFET2vgs)))+ - ckt->CKTvoltTol) ) - if ( (fabs(delvgd) < ckt->CKTreltol*MAX(fabs(vgd), - fabs(*(ckt->CKTstate0 + here->HFET2vgd)))+ - ckt->CKTvoltTol)) - if ( (fabs(cghat-*(ckt->CKTstate0 + here->HFET2cg)) - < ckt->CKTreltol*MAX(fabs(cghat), - fabs(*(ckt->CKTstate0 + here->HFET2cg)))+ - ckt->CKTabstol) ) if ( /* hack - expression too big */ - (fabs(cdhat-*(ckt->CKTstate0 + here->HFET2cd)) - < ckt->CKTreltol*MAX(fabs(cdhat), - fabs(*(ckt->CKTstate0 + here->HFET2cd)))+ - ckt->CKTabstol) ) { - - /* we can do a bypass */ - vgs= *(ckt->CKTstate0 + here->HFET2vgs); - vgd= *(ckt->CKTstate0 + here->HFET2vgd); - vds= vgs-vgd; - cg= *(ckt->CKTstate0 + here->HFET2cg); - cd= *(ckt->CKTstate0 + here->HFET2cd); - cgd= *(ckt->CKTstate0 + here->HFET2cgd); - gm= *(ckt->CKTstate0 + here->HFET2gm); - gds= *(ckt->CKTstate0 + here->HFET2gds); - ggs= *(ckt->CKTstate0 + here->HFET2ggs); - ggd= *(ckt->CKTstate0 + here->HFET2ggd); - goto load; - } - - /* limit nonlinear branch voltages */ - - ichk1=1; - vgs = DEVpnjlim(vgs,*(ckt->CKTstate0 + here->HFET2vgs),CONSTvt0,vcrit, &icheck); - vgd = DEVpnjlim(vgd,*(ckt->CKTstate0 + here->HFET2vgd),CONSTvt0,vcrit,&ichk1); - if(ichk1 == 1) { - icheck=1; - } - vgs = DEVfetlim(vgs,*(ckt->CKTstate0 + here->HFET2vgs),TVTO); - vgd = DEVfetlim(vgd,*(ckt->CKTstate0 + here->HFET2vgd),TVTO); - } - cg = 0; - cgd = 0; - ggd = 0; - ggs = 0; - vds = vgs-vgd; - { - double arg = -vgs*DEL/vt; - double earg = exp(arg); - double vtn = N*vt; - double expe = exp(vgs/vtn); - ggs = JSLW*expe/vtn+GGRLW*earg*(1-arg); - cg = JSLW*(expe-1)+GGRLW*vgs*earg; - arg = -vgd*DEL/vt; - earg = exp(arg); - expe = exp(vgd/vtn); - ggd = JSLW*expe/vtn+GGRLW*earg*(1-arg); - cgd = JSLW*(expe-1)+GGRLW*vgd*earg; - cg += cgd; - } - if(vds < 0) { - vds = -vds; - inverse = 1; - } else - inverse = 0; - hfeta2(model,here,ckt,vds>0?vgs:vgd,vds,&cdrain,&gm,&gds,&capgs,&capgd); - if(inverse) { - double temp; - cdrain = -cdrain; - vds = -vds; - temp = capgs; - capgs = capgd; - capgd = temp; - } - cd = cdrain - cgd; - if((ckt->CKTmode & (MODETRAN|MODEINITSMSIG)) || ((ckt->CKTmode & MODETRANOP) && - (ckt->CKTmode & MODEUIC)) ){ - /* charge storage elements */ - vgs1 = *(ckt->CKTstate1 + here->HFET2vgs); - vgd1 = *(ckt->CKTstate1 + here->HFET2vgd); - - if(ckt->CKTmode & MODEINITTRAN) { - *(ckt->CKTstate1 + here->HFET2qgs) = capgs*vgs; - *(ckt->CKTstate1 + here->HFET2qgd) = capgd*vgd; - } - *(ckt->CKTstate0+here->HFET2qgs) = *(ckt->CKTstate1+here->HFET2qgs) - + capgs*(vgs-vgs1); - *(ckt->CKTstate0+here->HFET2qgd) = *(ckt->CKTstate1+here->HFET2qgd) - + capgd*(vgd-vgd1); - - /* store small-signal parameters */ - - if( (!(ckt->CKTmode & MODETRANOP)) || (!(ckt->CKTmode & MODEUIC)) ) { - if(ckt->CKTmode & MODEINITSMSIG) { - *(ckt->CKTstate0 + here->HFET2qgs) = capgs; - *(ckt->CKTstate0 + here->HFET2qgd) = capgd; - continue; /*go to 1000*/ - } - - /* transient analysis */ - - if(ckt->CKTmode & MODEINITTRAN) { - *(ckt->CKTstate1 + here->HFET2qgs) = *(ckt->CKTstate0 + here->HFET2qgs); - *(ckt->CKTstate1 + here->HFET2qgd) = *(ckt->CKTstate0 + here->HFET2qgd); - } - error = NIintegrate(ckt,&geq,&ceq,capgs,here->HFET2qgs); - if(error) return(error); - ggs = ggs + geq; - cg = cg + *(ckt->CKTstate0 + here->HFET2cqgs); - error = NIintegrate(ckt,&geq,&ceq,capgd,here->HFET2qgd); - if(error) return(error); - ggd = ggd + geq; - cg = cg + *(ckt->CKTstate0 + here->HFET2cqgd); - cd = cd - *(ckt->CKTstate0 + here->HFET2cqgd); - cgd = cgd + *(ckt->CKTstate0 + here->HFET2cqgd); - if (ckt->CKTmode & MODEINITTRAN) { - *(ckt->CKTstate1 + here->HFET2cqgs) = *(ckt->CKTstate0 + here->HFET2cqgs); - *(ckt->CKTstate1 + here->HFET2cqgd) = *(ckt->CKTstate0 + here->HFET2cqgd); - } - } - } - - /* check convergence */ - - if( (!(ckt->CKTmode & MODEINITFIX)) | (!(ckt->CKTmode & MODEUIC))) { - if((icheck == 1) - || (fabs(cghat-cg) >= ckt->CKTreltol* - MAX(fabs(cghat),fabs(cg))+ckt->CKTabstol) || - (fabs(cdhat-cd) > ckt->CKTreltol* - MAX(fabs(cdhat),fabs(cd))+ckt->CKTabstol) - ) { - ckt->CKTnoncon++; - } - } - *(ckt->CKTstate0 + here->HFET2vgs) = vgs; - *(ckt->CKTstate0 + here->HFET2vgd) = vgd; - *(ckt->CKTstate0 + here->HFET2cg) = cg; - *(ckt->CKTstate0 + here->HFET2cd) = cd; - *(ckt->CKTstate0 + here->HFET2cgd) = cgd; - *(ckt->CKTstate0 + here->HFET2gm) = gm; - *(ckt->CKTstate0 + here->HFET2gds) = gds; - *(ckt->CKTstate0 + here->HFET2ggs) = ggs; - *(ckt->CKTstate0 + here->HFET2ggd) = ggd; - - /* load current vector */ - -load: - - m = here->HFET2m; - - ceqgd=model->HFET2type*(cgd-ggd*vgd); - ceqgs=model->HFET2type*((cg-cgd)-ggs*vgs); - cdreq=model->HFET2type*((cd+cgd)-gds*vds-gm*vgs); - *(ckt->CKTrhs + here->HFET2gateNode) += m * (-ceqgs-ceqgd); - *(ckt->CKTrhs + here->HFET2drainPrimeNode) += m * (-cdreq+ceqgd); - *(ckt->CKTrhs + here->HFET2sourcePrimeNode) += m * (cdreq+ceqgs); - - /* load y matrix */ - - *(here->HFET2drainDrainPrimePtr) += m * (-gdpr); - *(here->HFET2gateDrainPrimePtr) += m * (-ggd); - *(here->HFET2gateSourcePrimePtr) += m * (-ggs); - *(here->HFET2sourceSourcePrimePtr) += m * (-gspr); - *(here->HFET2drainPrimeDrainPtr) += m * (-gdpr); - *(here->HFET2drainPrimeGatePtr) += m * (gm-ggd); - *(here->HFET2drainPriHFET2ourcePrimePtr) += m * (-gds-gm); - *(here->HFET2sourcePrimeGatePtr) += m * (-ggs-gm); - *(here->HFET2sourcePriHFET2ourcePtr) += m * (-gspr); - *(here->HFET2sourcePrimeDrainPrimePtr) += m * (-gds); - *(here->HFET2drainDrainPtr) += m * (gdpr); - *(here->HFET2gateGatePtr) += m * (ggd+ggs); - *(here->HFET2sourceSourcePtr) += m * (gspr); - *(here->HFET2drainPrimeDrainPrimePtr) += m * (gdpr+gds+ggd); - *(here->HFET2sourcePriHFET2ourcePrimePtr) += m * (gspr+gds+gm+ggs); - } - } - return(OK); - -} - - - - -static void hfeta2(HFET2model *model, HFET2instance *here, CKTcircuit *ckt, - double vgs, double vds, double *cdrain, double *gm, - double *gds, double *capgs, double *capgd) - -{ - - double vt; - double vgt; - double vgt0; - double sigma; - double vgte; - double isat; - double isatm; - double ns; - double nsm; - double a; - double b; - double c; - double d; - double e; - double g; - double h; - double p; - double q; - double s; - double t; - double u; - double nsc = 0.0; - double nsn = 0.0; - double temp; - double etavth; - double gch; - double gchi; - double gchim; - double vsate; - double vdse; - double cg1; - double cgc; - double rt; - double vl; - double delidgch; - double delgchgchi; - double delgchins; - double delnsnsm; - double delnsmvgt; - double delvgtevgt; - double delidvsate; - double delvsateisat; - double delisatisatm; - double delisatmvgte; - double delisatmgchim; - double delvsategch; - double delidvds; - double delvgtvgs; - double delvsatevgt; - - NG_IGNORE(ckt); - - vt = CONSTKoverQ*TEMP; - etavth = ETA*vt; - vl = VS/TMU*L; - rt = RSI+RDI; - vgt0 = vgs - TVTO; - s = exp((vgt0-VSIGMAT)/VSIGMA); - sigma = SIGMA0/(1+s); - vgt = vgt0+sigma*vds; - u = 0.5*vgt/vt-1; - t = sqrt(DELTA2+u*u); - vgte = vt*(2+u+t); - b = exp(vgt/etavth); - if(model->HFET2eta2Given && model->HFET2d2Given) { - nsc = N02*exp((vgt+TVTO-VT2)/(ETA2*vt)); - nsn = 2*N0*log(1+0.5*b); - nsm = nsn*nsc/(nsn+nsc); - } else { - nsm = 2*N0*log(1+0.5*b); - } - if(nsm < 1.0e-38) { - *cdrain = 0; - *gm = 0.0; - *gds = 0.0; - *capgs = CF; - *capgd = CF; - return; - } - c = pow(nsm/TNMAX,GAMMA); - q = pow(1+c,1.0/GAMMA); - ns = nsm/q; - gchi = GCHI0*ns; - gch = gchi/(1+gchi*rt); - gchim = GCHI0*nsm; - h = sqrt(1+2*gchim*RSI + vgte*vgte/(vl*vl)); - p = 1+gchim*RSI+h; - isatm = gchim*vgte/p; - g = pow(isatm/IMAX,GAMMA); - isat = isatm/pow(1+g,1/GAMMA); - vsate = isat/gch; - d = pow(vds/vsate,M); - e = pow(1+d,1.0/M); - delidgch = vds*(1+TLAMBDA*vds)/e; - *cdrain = gch*delidgch; - delidvsate = (*cdrain)*d/vsate/(1+d); - delidvds = gch*(1+2*TLAMBDA*vds)/e-(*cdrain)* - pow(vds/vsate,M-1)/(vsate*(1+d)); - a = 1+gchi*rt; - delgchgchi = 1.0/(a*a); - delgchins = GCHI0; - delnsnsm = ns/nsm*(1-c/(1+c)); - delvgtevgt = 0.5*(1+u/t); - delnsmvgt = N0/etavth/(1.0/b + 0.5); - if(model->HFET2eta2Given && model->HFET2d2Given) - delnsmvgt = nsc*(nsc*delnsmvgt+nsn*nsn/(ETA2*vt))/((nsc+nsn)*(nsc+nsn)); - delvsateisat = 1.0/gch; - delisatisatm = isat/isatm*(1-g/(1+g)); - delisatmvgte = gchim*(p - vgte*vgte/(vl*vl*h))/(p*p); - delvsategch = -vsate/gch; - delisatmgchim = vgte*(p - gchim*RSI*(1+1.0/h))/(p*p); - delvgtvgs = 1-vds*SIGMA0/VSIGMA*s/((1+s)*(1+s)); - p = delgchgchi*delgchins*delnsnsm*delnsmvgt; - delvsatevgt = (delvsateisat*delisatisatm*(delisatmvgte*delvgtevgt + - delisatmgchim*GCHI0*delnsmvgt)+delvsategch*p); - g = delidgch*p + delidvsate*delvsatevgt; - *gm = g*delvgtvgs; - *gds = delidvds + g*sigma; - - /* Capacitance calculations */ - temp = ETA1*vt; - cg1 = 1/(D1/EPSI+temp*exp(-(vgs-HFET2_VT1)/temp)); - cgc = W*L*(CHARGE*delnsnsm*delnsmvgt*delvgtvgs+cg1); - vdse = vds*pow(1+pow(vds/vsate,MC),-1.0/MC); - a = (vsate-vdse)/(2*vsate-vdse); - a = a*a; - temp = 2.0/3.0; - p = PP + (1-PP)*exp(-vds/vsate); - *capgs = CF+2*temp*cgc*(1-a)/(1+p); - a = vsate/(2*vsate-vdse); - a = a*a; - *capgd = CF+2*p*temp*cgc*(1-a)/(1+p); - -} diff --git a/src/spicelib/devices/hfet2/hfet2mask.c b/src/spicelib/devices/hfet2/hfet2mask.c deleted file mode 100644 index 19134caef..000000000 --- a/src/spicelib/devices/hfet2/hfet2mask.c +++ /dev/null @@ -1,159 +0,0 @@ -/********** -Copyright 1990 Regents of the University of California. All rights reserved. -Author: 1987 Thomas L. Quarles -**********/ -/* -Imported into HFET2 model: Paolo Nenzi 2001 - */ - -#include "ngspice/ngspice.h" -#include "ngspice/cktdefs.h" -#include "ngspice/devdefs.h" -#include "ngspice/ifsim.h" -#include "hfet2defs.h" -#include "ngspice/sperror.h" -#include "ngspice/suffix.h" - - -/* ARGSUSED */ -int -HFET2mAsk(CKTcircuit *ckt, GENmodel *inst, int which, IFvalue *value) -{ - HFET2model *here = (HFET2model*)inst; - - NG_IGNORE(ckt); - - switch(which) { - case HFET2_MOD_VTO: - value->rValue = here->HFET2vto; - return (OK); - case HFET2_MOD_LAMBDA: - value->rValue = here->HFET2lambda; - return (OK); - case HFET2_MOD_RD: - value->rValue = here->HFET2rd; - return (OK); - case HFET2_MOD_RS: - value->rValue = here->HFET2rs; - return (OK); - case HFET2_MOD_RDI: - value->rValue = here->HFET2rdi; - return (OK); - case HFET2_MOD_RSI: - value->rValue = here->HFET2rsi; - return (OK); - case HFET2_MOD_ETA: - value->rValue = here->HFET2eta; - return (OK); - case HFET2_MOD_M: - value->rValue = here->HFET2m; - return (OK); - case HFET2_MOD_MC: - value->rValue = here->HFET2mc; - return (OK); - case HFET2_MOD_GAMMA: - value->rValue = here->HFET2gamma; - return (OK); - case HFET2_MOD_SIGMA0: - value->rValue = here->HFET2sigma0; - return (OK); - case HFET2_MOD_VSIGMAT: - value->rValue = here->HFET2vsigmat; - return (OK); - case HFET2_MOD_VSIGMA: - value->rValue = here->HFET2vsigma; - return (OK); - case HFET2_MOD_MU: - value->rValue = here->HFET2mu; - return (OK); - case HFET2_MOD_DI: - value->rValue = here->HFET2di; - return (OK); - case HFET2_MOD_DELTA: - value->rValue = here->HFET2delta; - return (OK); - case HFET2_MOD_VS: - value->rValue = here->HFET2vs; - return (OK); - case HFET2_MOD_NMAX: - value->rValue = here->HFET2nmax; - return (OK); - case HFET2_MOD_DELTAD: - value->rValue = here->HFET2deltad; - return (OK); - case HFET2_MOD_P: - value->rValue = here->HFET2p; - return (OK); - case HFET2_MOD_JS: - value->rValue = here->HFET2js; - return (OK); - case HFET2_MOD_ETA1: - value->rValue = here->HFET2eta1; - return (OK); - case HFET2_MOD_D1: - value->rValue = here->HFET2d1; - return (OK); - case HFET2_MOD_VT1: - value->rValue = here->HFET2vt1; - return (OK); - case HFET2_MOD_ETA2: - value->rValue = here->HFET2eta2; - return (OK); - case HFET2_MOD_D2: - value->rValue = here->HFET2d2; - return (OK); - case HFET2_MOD_VT2: - value->rValue = here->HFET2vt2; - return (OK); - case HFET2_MOD_GGR: - value->rValue = here->HFET2ggr; - return (OK); - case HFET2_MOD_DEL: - value->rValue = here->HFET2del; - return (OK); - case HFET2_MOD_KLAMBDA: - value->rValue = here->HFET2klambda; - return (OK); - case HFET2_MOD_KMU: - value->rValue = here->HFET2kmu; - return (OK); - case HFET2_MOD_KVTO: - value->rValue = here->HFET2kvto; - return (OK); - case HFET2_MOD_EPSI: - value->rValue = here->HFET2epsi; - return (OK); - case HFET2_MOD_KNMAX: - value->rValue = here->HFET2knmax; - return (OK); - case HFET2_MOD_N: - value->rValue = here->HFET2n; - return (OK); - case HFET2_MOD_CF: - value->rValue = here->HFET2cf; - return (OK); - - case HFET2_MOD_DRAINCONDUCT: - value->rValue = here->HFET2drainConduct; - return (OK); - case HFET2_MOD_SOURCECONDUCT: - value->rValue = here->HFET2sourceConduct; - return (OK); - /* case HFET2_MOD_DEPLETIONCAP: - value->rValue = here->HFET2???; - return(OK); */ - /* case HFET2_MOD_VCRIT: - value->rValue = here->HFET2vcrit; - return (OK); */ - - case HFET2_MOD_TYPE: - if (here->HFET2type == NHFET) - value->sValue = "nhfet"; - else - value->sValue = "phfet"; - return (OK); - default: - return (E_BADPARM); - } - /* NOTREACHED */ -} diff --git a/src/spicelib/devices/hfet2/hfet2mpar.c b/src/spicelib/devices/hfet2/hfet2mpar.c deleted file mode 100644 index 6f98a12db..000000000 --- a/src/spicelib/devices/hfet2/hfet2mpar.c +++ /dev/null @@ -1,177 +0,0 @@ -/********** -Imported from MacSpice3f4 - Antony Wilson -Modified: Paolo Nenzi -**********/ - -#include "ngspice/ngspice.h" -#include "ngspice/ifsim.h" -#include "hfet2defs.h" -#include "ngspice/sperror.h" -#include "ngspice/suffix.h" - - -int HFET2mParam(int param, IFvalue *value, GENmodel *inModel) -{ - - HFET2model *model = (HFET2model*)inModel; - switch(param) { - case HFET2_MOD_CF: - model->HFET2cfGiven = TRUE; - CF = value->rValue; - break; - case HFET2_MOD_D1: - model->HFET2d1Given = TRUE; - D1 = value->rValue; - break; - case HFET2_MOD_D2: - model->HFET2d2Given = TRUE; - D2 = value->rValue; - break; - case HFET2_MOD_DEL: - model->HFET2delGiven = TRUE; - DEL = value->rValue; - break; - case HFET2_MOD_DELTA: - model->HFET2deltaGiven = TRUE; - DELTA = value->rValue; - break; - case HFET2_MOD_DELTAD: - model->HFET2deltadGiven = TRUE; - DELTAD = value->rValue; - break; - case HFET2_MOD_DI: - model->HFET2diGiven = TRUE; - DI = value->rValue; - break; - case HFET2_MOD_EPSI: - model->HFET2epsiGiven = TRUE; - EPSI = value->rValue; - break; - case HFET2_MOD_ETA: - model->HFET2etaGiven = TRUE; - ETA = value->rValue; - break; - case HFET2_MOD_ETA1: - model->HFET2eta1Given = TRUE; - ETA1 = value->rValue; - break; - case HFET2_MOD_ETA2: - model->HFET2eta2Given = TRUE; - ETA2 = value->rValue; - break; - case HFET2_MOD_GAMMA: - model->HFET2gammaGiven = TRUE; - GAMMA = value->rValue; - break; - case HFET2_MOD_GGR: - model->HFET2ggrGiven = TRUE; - GGR = value->rValue; - break; - case HFET2_MOD_JS: - model->HFET2jsGiven = TRUE; - JS = value->rValue; - break; - case HFET2_MOD_KLAMBDA: - model->HFET2klambdaGiven = TRUE; - KLAMBDA = value->rValue; - break; - case HFET2_MOD_KMU: - model->HFET2kmuGiven = TRUE; - KMU = value->rValue; - break; - case HFET2_MOD_KNMAX: - model->HFET2knmaxGiven = TRUE; - KNMAX = value->rValue; - break; - case HFET2_MOD_KVTO: - model->HFET2kvtoGiven = TRUE; - KVTO = value->rValue; - break; - case HFET2_MOD_LAMBDA: - model->HFET2lambdaGiven = TRUE; - LAMBDA = value->rValue; - break; - case HFET2_MOD_M: - model->HFET2mGiven = TRUE; - M = value->rValue; - break; - case HFET2_MOD_MC: - model->HFET2mcGiven = TRUE; - MC = value->rValue; - break; - case HFET2_MOD_MU: - model->HFET2muGiven = TRUE; - MU = value->rValue; - break; - case HFET2_MOD_N: - model->HFET2nGiven = TRUE; - N = value->rValue; - break; - case HFET2_MOD_NMAX: - model->HFET2nmaxGiven = TRUE; - NMAX = value->rValue; - break; - case HFET2_MOD_P: - model->HFET2pGiven = TRUE; - PP = value->rValue; - break; - case HFET2_MOD_RD: - model->HFET2rdGiven = TRUE; - RD = value->rValue; - break; - case HFET2_MOD_RDI: - model->HFET2rdiGiven = TRUE; - RDI = value->rValue; - break; - case HFET2_MOD_RS: - model->HFET2rsGiven = TRUE; - RS = value->rValue; - break; - case HFET2_MOD_RSI: - model->HFET2rsiGiven = TRUE; - RSI = value->rValue; - break; - case HFET2_MOD_SIGMA0: - model->HFET2sigma0Given = TRUE; - SIGMA0 = value->rValue; - break; - case HFET2_MOD_VS: - model->HFET2vsGiven = TRUE; - VS = value->rValue; - break; - case HFET2_MOD_VSIGMA: - model->HFET2vsigmaGiven = TRUE; - VSIGMA = value->rValue; - break; - case HFET2_MOD_VSIGMAT: - model->HFET2vsigmatGiven = TRUE; - VSIGMAT = value->rValue; - break; - case HFET2_MOD_VT1: - model->HFET2vt1Given = TRUE; - HFET2_VT1 = value->rValue; - break; - case HFET2_MOD_VT2: - model->HFET2vt2Given = TRUE; - VT2 = value->rValue; - break; - case HFET2_MOD_VTO: - model->HFET2vtoGiven = TRUE; - VTO = value->rValue; - break; - case HFET2_MOD_NHFET: - if(value->iValue) { - TYPE = NHFET; - } - break; - case HFET2_MOD_PHFET: - if(value->iValue) { - TYPE = PHFET; - } - break; - default: - return(E_BADPARM); - } - return(OK); - -} diff --git a/src/spicelib/devices/hfet2/hfet2param.c b/src/spicelib/devices/hfet2/hfet2param.c deleted file mode 100644 index 3ceab0547..000000000 --- a/src/spicelib/devices/hfet2/hfet2param.c +++ /dev/null @@ -1,73 +0,0 @@ -/********** -Imported from MacSpice3f4 - Antony Wilson -Modified: Paolo Nenzi -**********/ - -#include "ngspice/ngspice.h" -#include "ngspice/ifsim.h" -#include "hfet2defs.h" -#include "ngspice/sperror.h" -#include "ngspice/suffix.h" - - -int HFET2param(int param, IFvalue *value, GENinstance *inst, IFvalue *select) -{ - - HFET2instance *here = (HFET2instance*)inst; - - NG_IGNORE(select); - - switch (param) { - case HFET2_LENGTH: - L = value->rValue; - here->HFET2lengthGiven = TRUE; - break; - case HFET2_IC_VDS: - here->HFET2icVDS = value->rValue; - here->HFET2icVDSGiven = TRUE; - break; - case HFET2_IC_VGS: - here->HFET2icVGS = value->rValue; - here->HFET2icVGSGiven = TRUE; - break; - case HFET2_OFF: - here->HFET2off = value->iValue; - break; - case HFET2_IC: - /* FALLTHROUGH added to suppress GCC warning due to - * -Wimplicit-fallthrough flag */ - switch (value->v.numValue) { - case 2: - here->HFET2icVGS = *(value->v.vec.rVec+1); - here->HFET2icVGSGiven = TRUE; - /* FALLTHROUGH */ - case 1: - here->HFET2icVDS = *(value->v.vec.rVec); - here->HFET2icVDSGiven = TRUE; - break; - default: - return(E_BADPARM); - } - break; - case HFET2_TEMP: - TEMP = value->rValue + CONSTCtoK; - here->HFET2tempGiven = TRUE; - break; - case HFET2_DTEMP: - here->HFET2dtemp = value->rValue; - here->HFET2dtempGiven = TRUE; - break; - case HFET2_WIDTH: - W = value->rValue; - here->HFET2widthGiven = TRUE; - break; - case HFET2_M: - here->HFET2m = value->rValue; - here->HFET2mGiven = TRUE; - break; - default: - return(E_BADPARM); - } - return(OK); - -} diff --git a/src/spicelib/devices/hfet2/hfet2pzl.c b/src/spicelib/devices/hfet2/hfet2pzl.c deleted file mode 100644 index 4c56d3d62..000000000 --- a/src/spicelib/devices/hfet2/hfet2pzl.c +++ /dev/null @@ -1,80 +0,0 @@ -/********** -Author: 2003 Paolo Nenzi -**********/ -/* - */ - - -#include "ngspice/ngspice.h" -#include "ngspice/cktdefs.h" -#include "hfet2defs.h" -#include "ngspice/sperror.h" -#include "ngspice/suffix.h" - - -int HFET2pzLoad(GENmodel *inModel, CKTcircuit *ckt, SPcomplex *s) -{ - - HFET2model *model = (HFET2model*)inModel; - HFET2instance *here; - double gdpr; - double gspr; - double gm; - double gds; - double ggs; - double xgs; - double ggd; - double xgd; - - double m; - - for( ; model != NULL; model = HFET2nextModel(model)) - { - for( here = HFET2instances(model); here != NULL; - here = HFET2nextInstance(here)) { - - m = here->HFET2m; - - gdpr=model->HFET2drainConduct; - gspr=model->HFET2sourceConduct; - gm= *(ckt->CKTstate0 + here->HFET2gm) ; - gds= *(ckt->CKTstate0 + here->HFET2gds) ; - ggs= *(ckt->CKTstate0 + here->HFET2ggs) ; - xgs= *(ckt->CKTstate0 + here->HFET2qgs) ; - ggd= *(ckt->CKTstate0 + here->HFET2ggd) ; - xgd= *(ckt->CKTstate0 + here->HFET2qgd) ; - - *(here->HFET2drainDrainPtr ) += m * (gdpr); - *(here->HFET2gateGatePtr ) += m * (ggd+ggs); - *(here->HFET2gateGatePtr) += m * ((xgd+xgs) * s->real); - *(here->HFET2gateGatePtr +1) += m * ((xgd+xgs) * s->imag); - *(here->HFET2sourceSourcePtr ) += m * (gspr); - *(here->HFET2drainPrimeDrainPrimePtr ) += m * (gdpr+gds+ggd); - *(here->HFET2drainPrimeDrainPrimePtr) += m * (xgd * s->real); - *(here->HFET2drainPrimeDrainPrimePtr +1) += m * (xgd * s->imag); - *(here->HFET2sourcePriHFET2ourcePrimePtr ) += m * (gspr+gds+gm+ggs); - *(here->HFET2sourcePriHFET2ourcePrimePtr) += m * (xgs * s->real); - *(here->HFET2sourcePriHFET2ourcePrimePtr +1) += m * (xgs * s->imag); - *(here->HFET2drainDrainPrimePtr ) -= m * (gdpr); - *(here->HFET2gateDrainPrimePtr ) -= m * (ggd); - *(here->HFET2gateDrainPrimePtr) -= m * (xgd * s->real); - *(here->HFET2gateDrainPrimePtr +1) -= m * (xgd * s->imag); - *(here->HFET2gateSourcePrimePtr ) -= m * (ggs); - *(here->HFET2gateSourcePrimePtr) -= m * (xgs * s->real); - *(here->HFET2gateSourcePrimePtr +1) -= m * (xgs * s->imag); - *(here->HFET2sourceSourcePrimePtr ) -= m * (gspr); - *(here->HFET2drainPrimeDrainPtr ) -= m * (gdpr); - *(here->HFET2drainPrimeGatePtr ) += m * (-ggd+gm); - *(here->HFET2drainPrimeGatePtr) -= m * (xgd * s->real); - *(here->HFET2drainPrimeGatePtr +1) -= m * (xgd * s->imag); - *(here->HFET2drainPriHFET2ourcePrimePtr ) += m * (-gds-gm); - *(here->HFET2sourcePrimeGatePtr ) += m * (-ggs-gm); - *(here->HFET2sourcePrimeGatePtr) -= m * (xgs * s->real); - *(here->HFET2sourcePrimeGatePtr +1) -= m * (xgs * s->imag); - *(here->HFET2sourcePriHFET2ourcePtr ) -= m * (gspr); - *(here->HFET2sourcePrimeDrainPrimePtr ) -= m * (gds); - } - } - return(OK); - -} diff --git a/src/spicelib/devices/hfet2/hfet2setup.c b/src/spicelib/devices/hfet2/hfet2setup.c deleted file mode 100644 index 5c94a8e60..000000000 --- a/src/spicelib/devices/hfet2/hfet2setup.c +++ /dev/null @@ -1,232 +0,0 @@ -/********** -Imported from MacSpice3f4 - Antony Wilson -Modified: Paolo Nenzi -**********/ - -#include "ngspice/ngspice.h" -#include "ngspice/smpdefs.h" -#include "ngspice/cktdefs.h" -#include "hfet2defs.h" -#include "ngspice/const.h" -#include "ngspice/sperror.h" -#include "ngspice/suffix.h" - - -int HFET2setup(SMPmatrix *matrix, GENmodel *inModel, CKTcircuit *ckt, int *states) -{ - - HFET2model *model = (HFET2model*)inModel; - HFET2instance *here; - int error; - CKTnode *tmp; - - for( ; model != NULL; model = HFET2nextModel(model)) { - if((TYPE != NHFET) && (TYPE != PHFET) ) - TYPE = NHFET; - if(!model->HFET2cfGiven) - CF = 0; - if(!model->HFET2d1Given) - D1 = 0.03e-6; - if(!model->HFET2d2Given) - D2 = 0.2e-6; - if(!model->HFET2delGiven) - DEL = 0.04; - if(!model->HFET2deltaGiven) - DELTA = 3.0; - if(!model->HFET2deltadGiven) - DELTAD = 4.5e-9; - if(!model->HFET2diGiven) - DI = 0.04e-6; - if(!model->HFET2epsiGiven) - EPSI = 12.244*8.85418e-12; - if(!model->HFET2etaGiven) - { - if(TYPE == NHFET) - ETA = 1.28; - else - ETA = 1.4; - } - if(!model->HFET2eta1Given) - ETA1 = 2; - if(!model->HFET2eta2Given) - ETA2 = 2; - if(!model->HFET2gammaGiven) - GAMMA = 3.0; - if(!model->HFET2ggrGiven) - GGR = 0; - if(!model->HFET2jsGiven) - JS = 0; - if(!model->HFET2klambdaGiven) - KLAMBDA = 0; - if(!model->HFET2kmuGiven) - KMU = 0; - if(!model->HFET2knmaxGiven) - KNMAX = 0; - if(!model->HFET2kvtoGiven) - KVTO = 0; - if(!model->HFET2lambdaGiven) - LAMBDA = 0.15; - if(!model->HFET2mGiven) - M = 3.0; - if(!model->HFET2mcGiven) - MC = 3.0; - if(!model->HFET2muGiven) - { - if(TYPE == NHFET) - MU = 0.4; - else - MU = 0.03; - } - if(!model->HFET2nGiven) - N = 5.0; - if(!model->HFET2nmaxGiven) - NMAX = 2e16; - if(!model->HFET2pGiven) - PP = 1; - if(!model->HFET2rdGiven) - RD = 0; - if(!model->HFET2rdiGiven) - RDI = 0; - if(!model->HFET2rsGiven) - RS = 0; - if(!model->HFET2rsiGiven) - RSI = 0; - if(!model->HFET2sigma0Given) - SIGMA0 = 0.057; - if(!model->HFET2vsGiven) - { - if(TYPE == NHFET) - VS = 1.5e5; - else - VS = 0.8e5; - } - if(!model->HFET2vsigmaGiven) - VSIGMA = 0.1; - if(!model->HFET2vsigmatGiven) - VSIGMAT = 0.3; - if(!model->HFET2vt1Given) - /* initialized in HFET2temp */ - HFET2_VT1 = 0; - if(!model->HFET2vt2Given) - /* initialized in HFET2temp */ - VT2 = 0; - if(!model->HFET2vtoGiven) { - if(model->HFET2type == NHFET) - VTO = 0.15; - else - VTO = -0.15; - } - - /* loop through all the instances of the model */ - - - for (here = HFET2instances(model); here != NULL; - here=HFET2nextInstance(here)) { - - CKTnode *tmpNode; - IFuid tmpName; - - here->HFET2state = *states; - *states += HFET2numStates; - - if(!here->HFET2lengthGiven) - L = 1e-6; - if(!here->HFET2widthGiven) - W = 20e-6; - if(!here->HFET2mGiven) - here->HFET2m = 1.0; - - if(model->HFET2rs != 0) { - if(here->HFET2sourcePrimeNode == 0) { - error = CKTmkVolt(ckt,&tmp,here->HFET2name,"source"); - if(error) return(error); - here->HFET2sourcePrimeNode = tmp->number; - - if (ckt->CKTcopyNodesets) { - if (CKTinst2Node(ckt,here,3,&tmpNode,&tmpName)==OK) { - if (tmpNode->nsGiven) { - tmp->nodeset=tmpNode->nodeset; - tmp->nsGiven=tmpNode->nsGiven; - } - } - } - } - - } else { - here->HFET2sourcePrimeNode = here->HFET2sourceNode; - } - if(model->HFET2rd != 0) { - if(here->HFET2drainPrimeNode == 0) { - error = CKTmkVolt(ckt,&tmp,here->HFET2name,"drain"); - if(error) return(error); - here->HFET2drainPrimeNode = tmp->number; - - if (ckt->CKTcopyNodesets) { - if (CKTinst2Node(ckt,here,1,&tmpNode,&tmpName)==OK) { - if (tmpNode->nsGiven) { - tmp->nodeset=tmpNode->nodeset; - tmp->nsGiven=tmpNode->nsGiven; - } - } - } - } - - } else { - here->HFET2drainPrimeNode = here->HFET2drainNode; - } - -/* macro to make elements with built in test for out of memory */ -#define TSTALLOC(ptr,first,second) \ -do { if((here->ptr = SMPmakeElt(matrix, here->first, here->second)) == NULL){\ - return(E_NOMEM);\ -} } while(0) - - TSTALLOC(HFET2drainDrainPrimePtr,HFET2drainNode,HFET2drainPrimeNode); - TSTALLOC(HFET2gateDrainPrimePtr,HFET2gateNode,HFET2drainPrimeNode); - TSTALLOC(HFET2gateSourcePrimePtr,HFET2gateNode,HFET2sourcePrimeNode); - TSTALLOC(HFET2sourceSourcePrimePtr,HFET2sourceNode,HFET2sourcePrimeNode); - TSTALLOC(HFET2drainPrimeDrainPtr,HFET2drainPrimeNode,HFET2drainNode); - TSTALLOC(HFET2drainPrimeGatePtr,HFET2drainPrimeNode,HFET2gateNode); - TSTALLOC(HFET2drainPriHFET2ourcePrimePtr,HFET2drainPrimeNode,HFET2sourcePrimeNode); - TSTALLOC(HFET2sourcePrimeGatePtr,HFET2sourcePrimeNode,HFET2gateNode); - TSTALLOC(HFET2sourcePriHFET2ourcePtr,HFET2sourcePrimeNode,HFET2sourceNode); - TSTALLOC(HFET2sourcePrimeDrainPrimePtr,HFET2sourcePrimeNode,HFET2drainPrimeNode); - TSTALLOC(HFET2drainDrainPtr,HFET2drainNode,HFET2drainNode); - TSTALLOC(HFET2gateGatePtr,HFET2gateNode,HFET2gateNode); - TSTALLOC(HFET2sourceSourcePtr,HFET2sourceNode,HFET2sourceNode); - TSTALLOC(HFET2drainPrimeDrainPrimePtr,HFET2drainPrimeNode,HFET2drainPrimeNode); - TSTALLOC(HFET2sourcePriHFET2ourcePrimePtr,HFET2sourcePrimeNode,HFET2sourcePrimeNode); - - } - } - return(OK); - -} - - -int -HFET2unsetup(GENmodel *inModel, CKTcircuit *ckt) -{ - HFET2model *model; - HFET2instance *here; - - for (model = (HFET2model *)inModel; model != NULL; - model = HFET2nextModel(model)) - { - for (here = HFET2instances(model); here != NULL; - here=HFET2nextInstance(here)) - { - if (here->HFET2drainPrimeNode > 0 - && here->HFET2drainPrimeNode != here->HFET2drainNode) - CKTdltNNum(ckt, here->HFET2drainPrimeNode); - here->HFET2drainPrimeNode = 0; - - if (here->HFET2sourcePrimeNode > 0 - && here->HFET2sourcePrimeNode != here->HFET2sourceNode) - CKTdltNNum(ckt, here->HFET2sourcePrimeNode); - here->HFET2sourcePrimeNode = 0; - } - - } - return OK; -} diff --git a/src/spicelib/devices/hfet2/hfet2temp.c b/src/spicelib/devices/hfet2/hfet2temp.c deleted file mode 100644 index 40492fd70..000000000 --- a/src/spicelib/devices/hfet2/hfet2temp.c +++ /dev/null @@ -1,69 +0,0 @@ -/********** -Imported from MacSpice3f4 - Antony Wilson -Modified: Paolo Nenzi -**********/ - -#include "ngspice/ngspice.h" -#include "ngspice/smpdefs.h" -#include "ngspice/cktdefs.h" -#include "hfet2defs.h" -#include "ngspice/const.h" -#include "ngspice/sperror.h" -#include "ngspice/suffix.h" - - -int HFET2temp( -GENmodel *inModel, -CKTcircuit *ckt) -{ - - HFET2instance *here; - HFET2model *model = (HFET2model*)inModel; - double vt; - double tdiff; - - for( ; model != NULL; model = HFET2nextModel(model)) { - if(model->HFET2rd != 0) - model->HFET2drainConduct = 1/model->HFET2rd; - else - model->HFET2drainConduct = 0; - if(model->HFET2rs != 0) - model->HFET2sourceConduct = 1/model->HFET2rs; - else - model->HFET2sourceConduct = 0; - if(!model->HFET2vt1Given) - HFET2_VT1 = VTO+CHARGE*NMAX*DI/EPSI; - if(!model->HFET2vt2Given) - VT2 = VTO; - DELTA2 = DELTA*DELTA; - for (here = HFET2instances(model); here != NULL; - here=HFET2nextInstance(here)) { - - if(!here->HFET2dtempGiven) - here->HFET2dtemp = 0.0; - if(!here->HFET2tempGiven) - TEMP = ckt->CKTtemp + here->HFET2dtemp; - - vt = CONSTKoverQ*TEMP; - tdiff = TEMP - ckt->CKTnomTemp; - - TLAMBDA = LAMBDA + KLAMBDA*tdiff; - TMU = MU - KMU*tdiff; - TNMAX = NMAX - KNMAX*tdiff; - TVTO = TYPE*VTO - KVTO*tdiff; - JSLW = JS*L*W/2; - GGRLW = GGR*L*W/2; - N0 = EPSI*ETA*vt/2/CHARGE/(DI+DELTAD); - N01 = EPSI*ETA1*vt/2/CHARGE/D1; - if(model->HFET2eta2Given) - N02 = EPSI*ETA2*vt/2/CHARGE/D2; - else - N02 = 0.0; - GCHI0 = CHARGE*W*TMU/L; - IMAX = CHARGE*TNMAX*VS*W; - VCRIT = vt*log(vt/(CONSTroot2 * 1e-11)); - } - } - return(OK); - -} diff --git a/src/spicelib/devices/hfet2/hfet2trunc.c b/src/spicelib/devices/hfet2/hfet2trunc.c deleted file mode 100644 index abe00f969..000000000 --- a/src/spicelib/devices/hfet2/hfet2trunc.c +++ /dev/null @@ -1,28 +0,0 @@ -#include "ngspice/ngspice.h" -#include -#include "ngspice/cktdefs.h" -#include "hfet2defs.h" -#include "ngspice/sperror.h" -#include "ngspice/suffix.h" - - -int HFET2trunc( -GENmodel *inModel, -CKTcircuit *ckt, -double *tiHFET2tep) -{ - - HFET2model *model = (HFET2model*)inModel; - HFET2instance *here; - - for( ; model != NULL; model = HFET2nextModel(model)) { - for(here=HFET2instances(model);here!=NULL; - here = HFET2nextInstance(here)){ - - CKTterr(here->HFET2qgs,ckt,tiHFET2tep); - CKTterr(here->HFET2qgd,ckt,tiHFET2tep); - } - } - return(OK); - -} diff --git a/src/spicelib/devices/hicum2/Makefile.am b/src/spicelib/devices/hicum2/Makefile.am deleted file mode 100644 index e49b30532..000000000 --- a/src/spicelib/devices/hicum2/Makefile.am +++ /dev/null @@ -1,33 +0,0 @@ -## Process this file with automake to produce Makefile.in - -noinst_LTLIBRARIES = libhicum2.la - -libhicum2_la_SOURCES = \ - hicum2.c \ - hicum2acld.c \ - hicum2ask.c \ - hicum2conv.c \ - hicum2defs.h \ - hicum2ext.h \ - hicum2getic.c \ - hicum2init.c \ - hicum2init.h \ - hicum2itf.h \ - hicumL2.hpp \ - hicumL2.cpp \ - hicumL2temp.hpp \ - hicumL2temp.cpp \ - hicum2mask.c \ - hicum2mpar.c \ - hicum2noise.c \ - hicum2param.c \ - hicum2pzld.c \ - hicum2setup.c \ - hicum2soachk.c \ - hicum2trunc.c - -AM_CFLAGS = -O -g -Wall -Wextra -I$(top_srcdir)/src/include -AM_CPPFLAGS = @AM_CPPFLAGS@ -O -g -Wall -Wextra -AM_CXXFLAGS = -I$(top_srcdir)/src/include/cppduals -I$(top_srcdir)/src/include -std=c++11 -O -g -Wall -Wextra - -MAINTAINERCLEANFILES = Makefile.in diff --git a/src/spicelib/devices/hicum2/hicum2.c b/src/spicelib/devices/hicum2/hicum2.c deleted file mode 100644 index b9e636f3c..000000000 --- a/src/spicelib/devices/hicum2/hicum2.c +++ /dev/null @@ -1,304 +0,0 @@ -/********** -License : 3-clause BSD -Spice3 Implementation: 2019-2020 Dietmar Warning, Markus Müller, Mario Krattenmacher -Model Author : 1990 Michael Schröter TU Dresden -**********/ - -/* - * This file defines the HICUM data structures that are - * available to the next level(s) up the calling hierarchy - */ - -#include "ngspice/ngspice.h" -#include "ngspice/devdefs.h" -#include "hicum2defs.h" -#include "ngspice/suffix.h" - -IFparm HICUMpTable[] = { /* parameters */ - IOPU("area", HICUM_AREA, IF_REAL, "Area factor"), - IOPU("off", HICUM_OFF, IF_FLAG, "Device initially off"), - IP("ic", HICUM_IC, IF_REALVEC, "Initial condition vector"), - -// these are left here for future. Sometimes it is advantageous for debugging if one can set the initial node voltages of all nodes. -// OP("icvb", HICUM_IC_VB, IF_REAL, "Initial B potential"), -// OP("icvc", HICUM_IC_VC, IF_REAL, "Initial C potential"), -// OP("icve", HICUM_IC_VE, IF_REAL, "Initial E potential"), -// OP("icvbi", HICUM_IC_VBi, IF_REAL, "Initial Bi potential"), -// OP("icvbp", HICUM_IC_VBp, IF_REAL, "Initial Bp potential"), -// OP("icvci", HICUM_IC_VCi, IF_REAL, "Initial Ci potential"), -// OP("icvt", HICUM_IC_Vt, IF_REAL, "Initial T potential"), -// OP("icvei", HICUM_IC_VEi, IF_REAL, "Initial Ei potential"), - - IOPU("m", HICUM_M, IF_REAL, "Multiplier"), - IOPU("temp", HICUM_TEMP, IF_REAL, "Instance temperature"), - IP("dt", HICUM_DTEMP, IF_REAL, "Instance delta temperature"), - IOPU("tk", HICUM_QUEST_TK, IF_REAL, "Actual device temperature"), - IOPU("dtsh", HICUM_QUEST_DTSH, IF_REAL, "Temperature increase due to self-heating"), - IOPU("it", HICUM_QUEST_IT, IF_REAL, "transfer current"), - - OPU("collnode", HICUM_QUEST_COLLNODE, IF_INTEGER, "Number of collector node"), - OPU("basenode", HICUM_QUEST_BASENODE, IF_INTEGER, "Number of base node"), - OPU("emitnode", HICUM_QUEST_EMITNODE, IF_INTEGER, "Number of emitter node"), - OPU("subsnode", HICUM_QUEST_SUBSNODE, IF_INTEGER, "Number of substrate node"), - OPU("tempnode", HICUM_QUEST_TEMPNODE, IF_INTEGER, "Number of temperature node"), - OPU("collCInode", HICUM_QUEST_COLLCINODE, IF_INTEGER, "Internal collector node"), - OPU("baseBPnode", HICUM_QUEST_BASEBPNODE, IF_INTEGER, "External base node"), - OPU("baseBInode", HICUM_QUEST_BASEBINODE, IF_INTEGER, "Internal base node"), - OPU("emitEInode", HICUM_QUEST_EMITEINODE, IF_INTEGER, "Internal emitter node"), - OPU("subsSInode", HICUM_QUEST_SUBSSINODE, IF_INTEGER, "Internal substrate node"), - OPU("xfnode", HICUM_QUEST_XFNODE, IF_INTEGER, "Internal phase node xf"), - OPU("xf1node", HICUM_QUEST_XF1NODE, IF_INTEGER, "Internal phase node xf1"), - OPU("xf2node", HICUM_QUEST_XF2NODE, IF_INTEGER, "Internal phase node xf2"), -/* voltages */ - OP("vbe", HICUM_QUEST_VBE, IF_REAL, "External BE voltage"), - OP("vbbp", HICUM_QUEST_VBBP, IF_REAL, "BBP voltage"), - OP("vbc", HICUM_QUEST_VBC, IF_REAL, "External BC voltage"), - OP("vce", HICUM_QUEST_VCE, IF_REAL, "External CE voltage"), - OP("vsc", HICUM_QUEST_VSC, IF_REAL, "External SC voltage"), - OP("vbiei", HICUM_QUEST_VBIEI, IF_REAL, "Internal BE voltage"), - OP("vbpbi", HICUM_QUEST_VBPBI, IF_REAL, "Peripheral Base to internal Base voltage"), - OP("vbici", HICUM_QUEST_VBICI, IF_REAL, "Internal BC voltage"), - OP("vciei", HICUM_QUEST_VCIEI, IF_REAL, "Internal CE voltage"), -/* currents */ - OP("ic", HICUM_QUEST_CC, IF_REAL, "Collector current"), - OP("iavl", HICUM_QUEST_CAVL, IF_REAL, "Avalanche current"), - OP("ib", HICUM_QUEST_CB, IF_REAL, "Base current"), - OP("ibei", HICUM_QUEST_CBEI, IF_REAL, "Intenral Base Emitter current"), - OP("ibci", HICUM_QUEST_CBCI, IF_REAL, "Internal Base Collector current"), - OP("ie", HICUM_QUEST_CE, IF_REAL, "Emitter current"), - OP("is", HICUM_QUEST_CS, IF_REAL, "Substrate current"), -/* resistances */ - OP("rcx_t", HICUM_QUEST_RCX_T, IF_REAL, "External (saturated) collector series resistance"), - OP("re_t", HICUM_QUEST_RE_T, IF_REAL, "Emitter series resistance"), - OP("rbi", HICUM_QUEST_RBI, IF_REAL, "Internal base resistance as calculated in the model"), - OP("rb", HICUM_QUEST_RB, IF_REAL, "Total base resistance as calculated in the model"), - -/* transconductances and capacitances */ - OP("betadc", HICUM_QUEST_BETADC, IF_REAL, "Common emitter forward current gain"), - OP("gmi", HICUM_QUEST_GMI, IF_REAL, "Internal transconductance"), - OP("gms", HICUM_QUEST_GMS, IF_REAL, "Transconductance of the parasitic substrate PNP"), - OP("rpii", HICUM_QUEST_RPII, IF_REAL, "Internal base-emitter (input) resistance"), - OP("rpix", HICUM_QUEST_RPIX, IF_REAL, "External base-emitter (input) resistance"), - OP("rmui", HICUM_QUEST_RMUI, IF_REAL, "Internal feedback resistance"), - OP("rmux", HICUM_QUEST_RMUX, IF_REAL, "External feedback resistance"), - OP("roi", HICUM_QUEST_ROI, IF_REAL, "Output resistance"), - OP("cpii", HICUM_QUEST_CPII, IF_REAL, "Total internal BE capacitance"), - OP("cpix", HICUM_QUEST_CPIX, IF_REAL, "Total external BE capacitance"), - OP("cmui", HICUM_QUEST_CMUI, IF_REAL, "Total internal BC capacitance"), - OP("cmux", HICUM_QUEST_CMUX, IF_REAL, "Total external BC capacitance"), - OP("ccs", HICUM_QUEST_CCS, IF_REAL, "CS junction capacitance"), - OP("betaac", HICUM_QUEST_BETAAC, IF_REAL, "Small signal current gain"), - OP("crbi", HICUM_QUEST_CRBI, IF_REAL, "Shunt capacitance across RBI as calculated in the model"), -/* transit time */ - OP("tf", HICUM_QUEST_TF, IF_REAL, "Forward transit time"), - OP("ft", HICUM_QUEST_FT, IF_REAL, "Transit frequency"), - OP("ick", HICUM_QUEST_ICK, IF_REAL, "Transit frequency"), -/* power */ - OP("p", HICUM_QUEST_POWER, IF_REAL, "Power dissipation") -}; - -IFparm HICUMmPTable[] = { /* model parameters */ -//Circuit simulator specific parameters - IOP("type", HICUM_MOD_TYPE, IF_STRING, "For transistor type NPN(+1) or PNP (-1)"), - IOPU("npn", HICUM_MOD_NPN, IF_FLAG, "NPN type device"), - IOPU("pnp", HICUM_MOD_PNP, IF_FLAG, "PNP type device"), - IOP("tnom", HICUM_MOD_TNOM, IF_REAL, "Temperature at which parameters are specified"), - IOPR("tref", HICUM_MOD_TNOM, IF_REAL, "Temperature at which parameters are specified"), - IOP("version", HICUM_MOD_VERSION, IF_STRING, " parameter for model version"), - -//Transfer current - IOP("c10", HICUM_MOD_C10 , IF_REAL, "GICCR constant"), - IOP("qp0", HICUM_MOD_QP0 , IF_REAL, "Zero-bias hole charge"), - IOP("ich", HICUM_MOD_ICH , IF_REAL, "High-current correction for 2D and 3D effects"), //`0' signifies infinity - IOP("hf0", HICUM_MOD_HF0 , IF_REAL, "Weight factor for the low current minority charge"), - IOP("hfe", HICUM_MOD_HFE , IF_REAL, "Emitter minority charge weighting factor in HBTs"), - IOP("hfc", HICUM_MOD_HFC , IF_REAL, "Collector minority charge weighting factor in HBTs"), - IOP("hjei", HICUM_MOD_HJEI , IF_REAL, "B-E depletion charge weighting factor in HBTs"), - IOP("ahjei", HICUM_MOD_AHJEI, IF_REAL, "Parameter describing the slope of hjEi(VBE)"), - IOP("rhjei", HICUM_MOD_RHJEI, IF_REAL, "Smoothing parameter for hjEi(VBE) at high voltage"), - IOP("hjci", HICUM_MOD_HJCI , IF_REAL, "B-C depletion charge weighting factor in HBTs"), - -//Base-Emitter diode currents - IOP("ibeis", HICUM_MOD_IBEIS, IF_REAL, "Internal B-E saturation current"), - IOP("mbei", HICUM_MOD_MBEI , IF_REAL, "Internal B-E current ideality factor"), - IOP("ireis", HICUM_MOD_IREIS, IF_REAL, "Internal B-E recombination saturation current"), - IOP("mrei", HICUM_MOD_MREI , IF_REAL, "Internal B-E recombination current ideality factor"), - IOP("ibeps", HICUM_MOD_IBEPS, IF_REAL, "Peripheral B-E saturation current"), - IOP("mbep", HICUM_MOD_MBEP , IF_REAL, "Peripheral B-E current ideality factor"), - IOP("ireps", HICUM_MOD_IREPS, IF_REAL, "Peripheral B-E recombination saturation current"), - IOP("mrep", HICUM_MOD_MREP , IF_REAL, "Peripheral B-E recombination current ideality factor"), - IOP("mcf", HICUM_MOD_MCF , IF_REAL, "Non-ideality factor for III-V HBTs"), - -//Transit time for excess recombination current at b-c barrier - IOP("tbhrec", HICUM_MOD_TBHREC, IF_REAL, "Base current recombination time constant at B-C barrier for high forward injection"), - -//Base-Collector diode currents - IOP("ibcis", HICUM_MOD_IBCIS, IF_REAL, "Internal B-C saturation current"), - IOP("mbci", HICUM_MOD_MBCI , IF_REAL, "Internal B-C current ideality factor"), - IOP("ibcxs", HICUM_MOD_IBCXS, IF_REAL, "External B-C saturation current"), - IOP("mbcx", HICUM_MOD_MBCX , IF_REAL, "External B-C current ideality factor"), - -//Base-Emitter tunneling current - IOP("ibets", HICUM_MOD_IBETS, IF_REAL, "B-E tunneling saturation current"), - IOP("abet", HICUM_MOD_ABET, IF_REAL, "Exponent factor for tunneling current"), - IOP("tunode",HICUM_MOD_TUNODE, IF_INTEGER, "Specifies the base node connection for the tunneling current"), // =1 signifies perimeter node - -//Base-Collector avalanche current - IOP("favl", HICUM_MOD_FAVL , IF_REAL, "Avalanche current factor"), - IOP("qavl", HICUM_MOD_QAVL , IF_REAL, "Exponent factor for avalanche current"), - IOP("kavl", HICUM_MOD_KAVL , IF_REAL, "Flag/factor for turning strong avalanche on"), - IOP("alfav", HICUM_MOD_ALFAV, IF_REAL, "Relative TC for FAVL"), - IOP("alqav", HICUM_MOD_ALQAV, IF_REAL, "Relative TC for QAVL"), - IOP("alkav", HICUM_MOD_ALKAV, IF_REAL, "Relative TC for KAVL"), - -//Series resistances - IOP("rbi0", HICUM_MOD_RBI0 , IF_REAL, "Zero bias internal base resistance"), - IOP("rbx", HICUM_MOD_RBX , IF_REAL, "External base series resistance"), - IOP("fgeo", HICUM_MOD_FGEO , IF_REAL, "Factor for geometry dependence of emitter current crowding"), - IOP("fdqr0", HICUM_MOD_FDQR0, IF_REAL, "Correction factor for modulation by B-E and B-C space charge layer"), - IOP("fcrbi", HICUM_MOD_FCRBI, IF_REAL, "Ratio of HF shunt to total internal capacitance (lateral NQS effect)"), - IOP("fqi", HICUM_MOD_FQI , IF_REAL, "Ration of internal to total minority charge"), - IOP("re", HICUM_MOD_RE , IF_REAL, "Emitter series resistance"), - IOP("rcx", HICUM_MOD_RCX , IF_REAL, "External collector series resistance"), - -//Substrate transistor - IOP("itss", HICUM_MOD_ITSS, IF_REAL, "Substrate transistor transfer saturation current"), - IOP("msf", HICUM_MOD_MSF , IF_REAL, "Forward ideality factor of substrate transfer current"), - IOP("iscs", HICUM_MOD_ISCS, IF_REAL, "C-S diode saturation current"), - IOP("msc", HICUM_MOD_MSC , IF_REAL, "Ideality factor of C-S diode current"), - IOP("tsf", HICUM_MOD_TSF , IF_REAL, "Transit time for forward operation of substrate transistor"), - -//Intra-device substrate coupling - IOP("rsu", HICUM_MOD_RSU, IF_REAL, "Substrate series resistance"), - IOP("csu", HICUM_MOD_CSU, IF_REAL, "Substrate shunt capacitance"), - -//Depletion Capacitances - IOP("cjei0", HICUM_MOD_CJEI0 , IF_REAL, "Internal B-E zero-bias depletion capacitance"), - IOP("vdei", HICUM_MOD_VDEI , IF_REAL, "Internal B-E built-in potential"), - IOP("zei", HICUM_MOD_ZEI , IF_REAL, "Internal B-E grading coefficient"), - IOP("ajei", HICUM_MOD_AJEI , IF_REAL, "Ratio of maximum to zero-bias value of internal B-E capacitance"), - IOPR("aljei", HICUM_MOD_AJEI , IF_REAL, "Ratio of maximum to zero-bias value of internal B-E capacitance"), - IOP("cjep0", HICUM_MOD_CJEP0 , IF_REAL, "Peripheral B-E zero-bias depletion capacitance"), - IOP("vdep", HICUM_MOD_VDEP , IF_REAL, "Peripheral B-E built-in potential"), - IOP("zep", HICUM_MOD_ZEP , IF_REAL, "Peripheral B-E grading coefficient"), - IOP("ajep", HICUM_MOD_AJEP , IF_REAL, "Ratio of maximum to zero-bias value of peripheral B-E capacitance"), - IOPR("aljep", HICUM_MOD_AJEP , IF_REAL, "Ratio of maximum to zero-bias value of peripheral B-E capacitance"), - IOP("cjci0", HICUM_MOD_CJCI0 , IF_REAL, "Internal B-C zero-bias depletion capacitance"), - IOP("vdci", HICUM_MOD_VDCI , IF_REAL, "Internal B-C built-in potential"), - IOP("zci", HICUM_MOD_ZCI , IF_REAL, "Internal B-C grading coefficient"), - IOP("vptci", HICUM_MOD_VPTCI , IF_REAL, "Internal B-C punch-through voltage"), - IOP("cjcx0", HICUM_MOD_CJCX0 , IF_REAL, "External B-C zero-bias depletion capacitance"), - IOP("vdcx", HICUM_MOD_VDCX , IF_REAL, "External B-C built-in potential"), - IOP("zcx", HICUM_MOD_ZCX , IF_REAL, "External B-C grading coefficient"), - IOP("vptcx", HICUM_MOD_VPTCX , IF_REAL, "External B-C punch-through voltage"), - IOP("fbcpar", HICUM_MOD_FBCPAR, IF_REAL, "Partitioning factor of parasitic B-C cap"), - IOPR("fbc", HICUM_MOD_FBCPAR, IF_REAL, "Partitioning factor of parasitic B-C cap"), - IOP("fbepar", HICUM_MOD_FBEPAR, IF_REAL, "Partitioning factor of parasitic B-E cap"), - IOPR("fbe", HICUM_MOD_FBEPAR, IF_REAL, "Partitioning factor of parasitic B-E cap"), - IOP("cjs0", HICUM_MOD_CJS0 , IF_REAL, "C-S zero-bias depletion capacitance"), - IOP("vds", HICUM_MOD_VDS , IF_REAL, "C-S built-in potential"), - IOP("zs", HICUM_MOD_ZS , IF_REAL, "C-S grading coefficient"), - IOP("vpts", HICUM_MOD_VPTS , IF_REAL, "C-S punch-through voltage"), - IOP("cscp0", HICUM_MOD_CSCP0 , IF_REAL, "Perimeter S-C zero-bias depletion capacitance"), - IOP("vdsp", HICUM_MOD_VDSP , IF_REAL, "Perimeter S-C built-in potential"), - IOP("zsp", HICUM_MOD_ZSP , IF_REAL, "Perimeter S-C grading coefficient"), - IOP("vptsp", HICUM_MOD_VPTSP , IF_REAL, "Perimeter S-C punch-through voltage"), - -//Diffusion Capacitances - IOP("t0", HICUM_MOD_T0 , IF_REAL, "Low current forward transit time at VBC=0V"), - IOP("dt0h", HICUM_MOD_DT0H , IF_REAL, "Time constant for base and B-C space charge layer width modulation"), - IOP("tbvl", HICUM_MOD_TBVL , IF_REAL, "Time constant for modeling carrier jam at low VCE"), - IOP("tef0", HICUM_MOD_TEF0 , IF_REAL, "Neutral emitter storage time"), - IOP("gtfe", HICUM_MOD_GTFE , IF_REAL, "Exponent factor for current dependence of neutral emitter storage time"), - IOP("thcs", HICUM_MOD_THCS , IF_REAL, "Saturation time constant at high current densities"), - IOP("ahc", HICUM_MOD_AHC , IF_REAL, "Smoothing factor for current dependence of base and collector transit time"), - IOPR("alhc", HICUM_MOD_AHC , IF_REAL, "Smoothing factor for current dependence of base and collector transit time"), - IOP("fthc", HICUM_MOD_FTHC , IF_REAL, "Partitioning factor for base and collector portion"), - IOP("rci0", HICUM_MOD_RCI0 , IF_REAL, "Internal collector resistance at low electric field"), - IOP("vlim", HICUM_MOD_VLIM , IF_REAL, "Voltage separating ohmic and saturation velocity regime"), - IOP("vces", HICUM_MOD_VCES , IF_REAL, "Internal C-E saturation voltage"), - IOP("vpt", HICUM_MOD_VPT , IF_REAL, "Collector punch-through voltage"), // `0' signifies infinity - IOP("aick", HICUM_MOD_AICK , IF_REAL, "Smoothing term for ICK"), - IOP("delck", HICUM_MOD_DELCK, IF_REAL, "Fitting factor for critical current"), - IOP("tr", HICUM_MOD_TR , IF_REAL, "Storage time for inverse operation"), - IOP("vcbar", HICUM_MOD_VCBAR, IF_REAL, "Barrier voltage"), - IOP("icbar", HICUM_MOD_ICBAR, IF_REAL, "Normalization parameter"), - IOP("acbar", HICUM_MOD_ACBAR, IF_REAL, "Smoothing parameter for barrier voltage"), - -//Isolation Capacitances - IOP("cbepar", HICUM_MOD_CBEPAR, IF_REAL, "Total parasitic B-E capacitance"), - IOPR("ceox", HICUM_MOD_CBEPAR, IF_REAL, "Total parasitic B-E capacitance"), - IOP("cbcpar", HICUM_MOD_CBCPAR, IF_REAL, "Total parasitic B-C capacitance"), - IOPR("ccox", HICUM_MOD_CBCPAR, IF_REAL, "Total parasitic B-C capacitance"), - -//Non-quasi-static Effect - IOP("alqf", HICUM_MOD_ALQF, IF_REAL, "Factor for additional delay time of minority charge"), - IOP("alit", HICUM_MOD_ALIT, IF_REAL, "Factor for additional delay time of transfer current"), - IOP("flnqs", HICUM_MOD_FLNQS, IF_INTEGER, "Flag for turning on and off of vertical NQS effect"), - -//Noise - IOP("kf", HICUM_MOD_KF , IF_REAL, "Flicker noise coefficient"), - IOP("af", HICUM_MOD_AF , IF_REAL, "Flicker noise exponent factor"), - IOP("cfbe", HICUM_MOD_CFBE , IF_INTEGER, "Flag for determining where to tag the flicker noise source"), - IOP("flcono", HICUM_MOD_FLCONO, IF_INTEGER, "Flag for turning on and off of correlated noise implementation"), - IOP("kfre", HICUM_MOD_KFRE , IF_REAL, "Emitter resistance flicker noise coefficient"), - IOP("afre", HICUM_MOD_AFRE , IF_REAL, "Emitter resistance flicker noise exponent factor"), - -//Lateral Geometry Scaling (at high current densities) - IOP("latb", HICUM_MOD_LATB, IF_REAL, "Scaling factor for collector minority charge in direction of emitter width"), - IOP("latl", HICUM_MOD_LATL, IF_REAL, "Scaling factor for collector minority charge in direction of emitter length"), - -//Temperature dependence - IOP("vgb", HICUM_MOD_VGB , IF_REAL, "Bandgap voltage extrapolated to 0 K"), - IOP("alt0", HICUM_MOD_ALT0 , IF_REAL, "First order relative TC of parameter T0"), - IOP("kt0", HICUM_MOD_KT0 , IF_REAL, "Second order relative TC of parameter T0"), - IOP("zetaci", HICUM_MOD_ZETACI , IF_REAL, "Temperature exponent for RCI0"), - IOP("alvs", HICUM_MOD_ALVS , IF_REAL, "Relative TC of saturation drift velocity"), - IOP("alces", HICUM_MOD_ALCES , IF_REAL, "Relative TC of VCES"), - IOP("zetarbi", HICUM_MOD_ZETARBI , IF_REAL, "Temperature exponent of internal base resistance"), - IOP("zetarbx", HICUM_MOD_ZETARBX , IF_REAL, "Temperature exponent of external base resistance"), - IOP("zetarcx", HICUM_MOD_ZETARCX , IF_REAL, "Temperature exponent of external collector resistance"), - IOP("zetare", HICUM_MOD_ZETARE , IF_REAL, "Temperature exponent of emitter resistance"), - IOP("zetacx", HICUM_MOD_ZETACX , IF_REAL, "Temperature exponent of mobility in substrate transistor transit time"), - IOP("vge", HICUM_MOD_VGE , IF_REAL, "Effective emitter bandgap voltage"), - IOP("vgc", HICUM_MOD_VGC , IF_REAL, "Effective collector bandgap voltage"), - IOP("vgs", HICUM_MOD_VGS , IF_REAL, "Effective substrate bandgap voltage"), - IOP("f1vg", HICUM_MOD_F1VG , IF_REAL, "Coefficient K1 in T-dependent band-gap equation"), - IOP("f2vg", HICUM_MOD_F2VG , IF_REAL, "Coefficient K2 in T-dependent band-gap equation"), - IOP("zetact", HICUM_MOD_ZETACT , IF_REAL, "Exponent coefficient in transfer current temperature dependence"), - IOP("zetabet", HICUM_MOD_ZETABET , IF_REAL, "Exponent coefficient in B-E junction current temperature dependence"), - IOP("alb", HICUM_MOD_ALB , IF_REAL, "Relative TC of forward current gain for V2.1 model"), - IOP("dvgbe", HICUM_MOD_DVGBE , IF_REAL, "Bandgap difference between B and B-E junction used for hjEi0 and hf0"), - IOP("zetahjei", HICUM_MOD_ZETAHJEI, IF_REAL, "Temperature coefficient for ahjEi"), - IOP("zetavgbe", HICUM_MOD_ZETAVGBE, IF_REAL, "Temperature coefficient for hjEi0"), - -//Self-Heating - IOP("flsh", HICUM_MOD_FLSH , IF_INTEGER, "Flag for turning on and off self-heating effect"), - IOP("rth", HICUM_MOD_RTH , IF_REAL, "Thermal resistance"), - IOP("zetarth", HICUM_MOD_ZETARTH, IF_REAL, "Temperature coefficient for Rth"), - IOP("alrth", HICUM_MOD_ALRTH , IF_REAL, "First order relative TC of parameter Rth"), - IOP("cth", HICUM_MOD_CTH , IF_REAL, "Thermal capacitance"), - -//Compatibility with V2.1 - IOP("flcomp", HICUM_MOD_FLCOMP, IF_REAL, "Flag for compatibility with v2.1 model (0=v2.1)"), - - IOP("vbe_max", HICUM_MOD_VBE_MAX, IF_REAL, "maximum voltage B-E junction"), - IOP("vbc_max", HICUM_MOD_VBC_MAX, IF_REAL, "maximum voltage B-C junction"), - IOP("vce_max", HICUM_MOD_VCE_MAX, IF_REAL, "maximum voltage C-E branch") - -}; - -char *HICUMnames[] = { - "collector", - "base", - "emitter", - "substrate", - "temp" -}; - - -int HICUMnSize = NUMELEMS(HICUMnames); -int HICUMpTSize = NUMELEMS(HICUMpTable); -int HICUMmPTSize = NUMELEMS(HICUMmPTable); -int HICUMiSize = sizeof(HICUMinstance); -int HICUMmSize = sizeof(HICUMmodel); diff --git a/src/spicelib/devices/hicum2/hicum2acld.c b/src/spicelib/devices/hicum2/hicum2acld.c deleted file mode 100644 index 66ee40e0a..000000000 --- a/src/spicelib/devices/hicum2/hicum2acld.c +++ /dev/null @@ -1,646 +0,0 @@ -/********** -License : 3-clause BSD -Spice3 Implementation: 2019-2020 Dietmar Warning, Markus Müller, Mario Krattenmacher -Model Author : 1990 Michael Schröter TU Dresden -**********/ - -/* - * Function to load the COMPLEX circuit matrix using the - * small signal parameters saved during a previous DC operating - * point analysis. - */ - -#include "ngspice/ngspice.h" -#include "ngspice/cktdefs.h" -#include "hicum2defs.h" -#include "ngspice/sperror.h" -#include "ngspice/suffix.h" - -int -HICUMacLoad(GENmodel *inModel, CKTcircuit *ckt) -{ - HICUMinstance *here; - HICUMmodel *model = (HICUMmodel*)inModel; - double Ibpei_Vbpei; - double Ibpei_Vrth; - - double Ibiei_Vbiei; - double Ibiei_Vxf; - double Ibiei_Vbici; - double Ibiei_Vrth; - - double Ibici_Vbici; - double Ibici_Vbiei; - double Ibici_Vrth; - - double Ibpci_Vbpci; - double Ibpci_Vrth; - - double Isici_Vsici; - double Isici_Vrth; - - double Iciei_Vbiei; - double Iciei_Vbici; - double Iciei_Vrth; - double Iciei_Vxf2; - - - double Ibpbi_Vbpbi; - double Ibpbi_Vbici; - double Ibpbi_Vbiei; - double Ibpbi_Vrth; - - double Isis_Vsis; - double Irth_Vrth; - double Icic_Vcic, Icic_Vrth; - double Ieie_Veie, Ieie_Vrth; - double Ibbp_Vbbp, Ibbp_Vrth; - - double Ibpsi_Vbpci; - double Ibpsi_Vsici; - double Ibpsi_Vrth; - - double XQrbi_Vbpbi; - double XQrbi_Vbiei; - double XQrbi_Vbici; - double XQrbi_Vrth; - double XQjei_Vbiei; - double XQjei_Vrth; - double XQjci_Vbici; - double XQjci_Vrth; - double XQjep_Vbpei; - double XQjep_Vrth; - double volatile Xqjcx0_t_i_Vbci; - double Xqjcx0_t_i_Vrth; - double volatile Xqjcx0_t_ii_Vbpci; - double Xqjcx0_t_ii_Vrth; - double XQdsu_Vbpci; - double XQdsu_Vsici; - double XQdsu_Vrth; - double XQjs_Vsici; - double XQjs_Vrth; - double XQscp_Vsc; - double XQscp_Vrth; - double XQbepar1_Vbe; - double XQbepar2_Vbpe; - double XQbcpar1_Vbci; - double XQbcpar2_Vbpci; - double XQsu_Vsis; - double XQcth_Vrth; - double XQf_Vbiei; - double XQf_Vbici; - double XQf_Vrth; - double XQf_Vxf; - double XQr_Vrth; - double XQr_Vbiei; - double XQr_Vbici; - - double XQxf_Vxf; - double XQxf1_Vxf1; - double XQxf2_Vxf2; - - double Ixf1_Vbiei; - double Ixf1_Vbici; - double Ixf1_Vxf2 ; - double Ixf1_Vxf1 ; - double Ixf1_Vrth ; - - double Ixf2_Vbiei; - double Ixf2_Vbici; - double Ixf2_Vxf2 ; - double Ixf2_Vxf1 ; - double Ixf2_Vrth ; - - double Ixf_Vbiei ; - double Ixf_Vbici ; - double Ixf_Vxf ; - double Ixf_Vrth ; - - double Ith_Vrth, Ith_Vbiei, Ith_Vbici, Ith_Vbpbi, Ith_Vbpci, Ith_Vbpei, Ith_Vciei, Ith_Vsici, Ith_Vcic, Ith_Vbbp, Ith_Veie; - - /* loop through all the models */ - for( ; model != NULL; model = HICUMnextModel(model)) { - - /* loop through all the instances of the model */ - for( here = HICUMinstances(model); here!= NULL; - here = HICUMnextInstance(here)) { - - - // get all derivatives of branch DC currents - if(model->HICUMrcxGiven && model->HICUMrcx != 0) { - Icic_Vcic = 1/here->HICUMrcx_t.rpart; - Icic_Vrth = -*(ckt->CKTstate0 + here->HICUMvcic)/here->HICUMrcx_t.rpart/here->HICUMrcx_t.rpart*here->HICUMrcx_t.dpart; - } else { - Icic_Vcic = 0.0; - Icic_Vrth = 0.0; - } - if(model->HICUMrbxGiven && model->HICUMrbx != 0) { - Ibbp_Vbbp = 1/here->HICUMrbx_t.rpart; - Ibbp_Vrth = -*(ckt->CKTstate0 + here->HICUMvbbp)/here->HICUMrbx_t.rpart/here->HICUMrbx_t.rpart*here->HICUMrbx_t.dpart; - } else { - Ibbp_Vbbp = 0.0; - Ibbp_Vrth = 0.0; - } - if(model->HICUMreGiven && model->HICUMre != 0) { - Ieie_Veie = 1/here->HICUMre_t.rpart; - Ieie_Vrth = -*(ckt->CKTstate0 + here->HICUMveie)/here->HICUMre_t.rpart/here->HICUMre_t.rpart*here->HICUMre_t.dpart; - } else { - Ieie_Veie = 0.0; - Ieie_Vrth = 0.0; - } - if(model->HICUMrsuGiven && model->HICUMrsu != 0) { - Isis_Vsis = 1/model->HICUMrsu*here->HICUMm; - } else { - Isis_Vsis = 0.0; - } - if(model->HICUMselfheat) { - Irth_Vrth = (1/here->HICUMrth_t.rpart - *(ckt->CKTstate0 + here->HICUMvrth)/(here->HICUMrth_t.rpart*here->HICUMrth_t.rpart) * here->HICUMrth_t.dpart); - } else { - Irth_Vrth = 0.0; - } - - - - Ibiei_Vbiei = *(ckt->CKTstate0 + here->HICUMibiei_Vbiei); - Ibiei_Vxf = *(ckt->CKTstate0 + here->HICUMibiei_Vxf); - Ibiei_Vbici = *(ckt->CKTstate0 + here->HICUMibiei_Vbici); - Ibiei_Vrth = *(ckt->CKTstate0 + here->HICUMibiei_Vrth); - - Ibpei_Vbpei = *(ckt->CKTstate0 + here->HICUMibpei_Vbpei); - Ibpei_Vrth = *(ckt->CKTstate0 + here->HICUMibpei_Vrth); - - Iciei_Vbiei = *(ckt->CKTstate0 + here->HICUMiciei_Vbiei); - Iciei_Vbici = *(ckt->CKTstate0 + here->HICUMiciei_Vbici); - Iciei_Vrth = *(ckt->CKTstate0 + here->HICUMiciei_Vrth); - Iciei_Vxf2 = *(ckt->CKTstate0 + here->HICUMiciei_Vxf2); - - Ibici_Vbici = *(ckt->CKTstate0 + here->HICUMibici_Vbici); - Ibici_Vbiei = *(ckt->CKTstate0 + here->HICUMibici_Vbiei); - Ibici_Vrth = *(ckt->CKTstate0 + here->HICUMibici_Vrth); - - Ibpbi_Vbpbi = *(ckt->CKTstate0 + here->HICUMibpbi_Vbpbi); - Ibpbi_Vbiei = *(ckt->CKTstate0 + here->HICUMibpbi_Vbiei); - Ibpbi_Vbici = *(ckt->CKTstate0 + here->HICUMibpbi_Vbici); - Ibpbi_Vrth = *(ckt->CKTstate0 + here->HICUMibpbi_Vrth); - - Ibpci_Vbpci = *(ckt->CKTstate0 + here->HICUMibpci_Vbpci); - Ibpci_Vrth = *(ckt->CKTstate0 + here->HICUMibpci_Vrth); - - Isici_Vsici = *(ckt->CKTstate0 + here->HICUMisici_Vsici); - Isici_Vrth = *(ckt->CKTstate0 + here->HICUMisici_Vrth); - - Ibpsi_Vbpci = *(ckt->CKTstate0 + here->HICUMibpsi_Vbpci); - Ibpsi_Vsici = *(ckt->CKTstate0 + here->HICUMibpsi_Vsici); - Ibpsi_Vrth = *(ckt->CKTstate0 + here->HICUMibpsi_Vrth); - - Ith_Vrth = *(ckt->CKTstate0 + here->HICUMith_Vrth); - Ith_Vbiei = *(ckt->CKTstate0 + here->HICUMith_Vbiei); - Ith_Vbici = *(ckt->CKTstate0 + here->HICUMith_Vbici); - Ith_Vbpbi = *(ckt->CKTstate0 + here->HICUMith_Vbpbi); - Ith_Vbpci = *(ckt->CKTstate0 + here->HICUMith_Vbpci); - Ith_Vbpei = *(ckt->CKTstate0 + here->HICUMith_Vbpei); - Ith_Vciei = *(ckt->CKTstate0 + here->HICUMith_Vciei); - Ith_Vsici = *(ckt->CKTstate0 + here->HICUMith_Vsici); - Ith_Vcic = *(ckt->CKTstate0 + here->HICUMith_Vcic); - Ith_Vbbp = *(ckt->CKTstate0 + here->HICUMith_Vbbp); - Ith_Veie = *(ckt->CKTstate0 + here->HICUMith_Veie); - - Ixf1_Vbiei = *(ckt->CKTstate0 + here->HICUMixf1_Vbiei); - Ixf1_Vbici = *(ckt->CKTstate0 + here->HICUMixf1_Vbici); - Ixf1_Vxf2 = *(ckt->CKTstate0 + here->HICUMixf1_Vxf2); - Ixf1_Vxf1 = *(ckt->CKTstate0 + here->HICUMixf1_Vxf1); - Ixf1_Vrth = *(ckt->CKTstate0 + here->HICUMixf1_Vrth); - - Ixf2_Vbiei = *(ckt->CKTstate0 + here->HICUMixf2_Vbiei); - Ixf2_Vbici = *(ckt->CKTstate0 + here->HICUMixf2_Vbici); - Ixf2_Vxf2 = *(ckt->CKTstate0 + here->HICUMixf2_Vxf2); - Ixf2_Vxf1 = *(ckt->CKTstate0 + here->HICUMixf2_Vxf1); - Ixf2_Vrth = *(ckt->CKTstate0 + here->HICUMixf2_Vrth); - - Ixf_Vbiei = *(ckt->CKTstate0 + here->HICUMixf_Vbiei); - Ixf_Vbici = *(ckt->CKTstate0 + here->HICUMixf_Vbici); - Ixf_Vxf = *(ckt->CKTstate0 + here->HICUMixf_Vxf); - Ixf_Vrth = *(ckt->CKTstate0 + here->HICUMixf_Vrth); - -//////////////////////////////////// -////////// The real part ///////// -//////////////////////////////////// - -// Stamp element: Ibiei - *(here->HICUMbaseBIBaseBIPtr) += Ibiei_Vbiei; - *(here->HICUMemitEIEmitEIPtr) += Ibiei_Vbiei; - *(here->HICUMbaseBIEmitEIPtr) += -Ibiei_Vbiei; - *(here->HICUMemitEIBaseBIPtr) += -Ibiei_Vbiei; - *(here->HICUMbaseBIBaseBIPtr) += Ibiei_Vbici; - *(here->HICUMemitEICollCIPtr) += Ibiei_Vbici; - *(here->HICUMbaseBICollCIPtr) += -Ibiei_Vbici; - *(here->HICUMemitEIBaseBIPtr) += -Ibiei_Vbici; - if (model->HICUMnqs) { - *(here->HICUMbaseBIXfPtr) += Ibiei_Vxf; - *(here->HICUMemitEIXfPtr) += -Ibiei_Vxf; - } - -// Stamp element: Ibpei - *(here->HICUMbaseBPBaseBPPtr) += Ibpei_Vbpei; - *(here->HICUMemitEIEmitEIPtr) += Ibpei_Vbpei; - *(here->HICUMbaseBPEmitEIPtr) += -Ibpei_Vbpei; - *(here->HICUMemitEIBaseBPPtr) += -Ibpei_Vbpei;; - -// Stamp element: Ibici - *(here->HICUMbaseBIBaseBIPtr) += Ibici_Vbici; - *(here->HICUMcollCICollCIPtr) += Ibici_Vbici; - *(here->HICUMcollCIBaseBIPtr) += -Ibici_Vbici; - *(here->HICUMbaseBICollCIPtr) += -Ibici_Vbici; - *(here->HICUMbaseBIBaseBIPtr) += Ibici_Vbiei; - *(here->HICUMcollCIEmitEIPtr) += Ibici_Vbiei; - *(here->HICUMcollCIBaseBIPtr) += -Ibici_Vbiei; - *(here->HICUMbaseBIEmitEIPtr) += -Ibici_Vbiei; - -// Stamp element: Iciei - *(here->HICUMcollCIBaseBIPtr) += Iciei_Vbiei; - *(here->HICUMemitEIEmitEIPtr) += Iciei_Vbiei; - *(here->HICUMcollCIEmitEIPtr) += -Iciei_Vbiei; - *(here->HICUMemitEIBaseBIPtr) += -Iciei_Vbiei; - *(here->HICUMcollCIBaseBIPtr) += Iciei_Vbici; - *(here->HICUMemitEICollCIPtr) += Iciei_Vbici; - *(here->HICUMcollCICollCIPtr) += -Iciei_Vbici; - *(here->HICUMemitEIBaseBIPtr) += -Iciei_Vbici; - if (model->HICUMnqs) { - *(here->HICUMcollCIXf2Ptr) += Iciei_Vxf2; - *(here->HICUMemitEIXf2Ptr) += -Iciei_Vxf2; - } - - -// Stamp element: Ibpci - *(here->HICUMbaseBPBaseBPPtr) += Ibpci_Vbpci; - *(here->HICUMcollCICollCIPtr) += Ibpci_Vbpci; - *(here->HICUMbaseBPCollCIPtr) += -Ibpci_Vbpci; - *(here->HICUMcollCIBaseBPPtr) += -Ibpci_Vbpci; - -// Stamp element: Rcx - *(here->HICUMcollCollPtr) += Icic_Vcic; - *(here->HICUMcollCICollCIPtr) += Icic_Vcic; - *(here->HICUMcollCICollPtr) += -Icic_Vcic; - *(here->HICUMcollCollCIPtr) += -Icic_Vcic; - -// Stamp element: Rbx - *(here->HICUMbaseBasePtr) += Ibbp_Vbbp; - *(here->HICUMbaseBPBaseBPPtr) += Ibbp_Vbbp; - *(here->HICUMbaseBPBasePtr) += -Ibbp_Vbbp; - *(here->HICUMbaseBaseBPPtr) += -Ibbp_Vbbp; - -// Stamp element: Re - *(here->HICUMemitEmitPtr) += Ieie_Veie; - *(here->HICUMemitEIEmitEIPtr) += Ieie_Veie; - *(here->HICUMemitEIEmitPtr) += -Ieie_Veie; - *(here->HICUMemitEmitEIPtr) += -Ieie_Veie; - -// Stamp element: Ibpbi - if (here->HICUMrbi>0.0) { - *(here->HICUMbaseBPBaseBPPtr) += Ibpbi_Vbpbi; - *(here->HICUMbaseBIBaseBIPtr) += Ibpbi_Vbpbi; - *(here->HICUMbaseBPBaseBIPtr) += -Ibpbi_Vbpbi; - *(here->HICUMbaseBIBaseBPPtr) += -Ibpbi_Vbpbi; - *(here->HICUMbaseBPBaseBIPtr) += Ibpbi_Vbiei; - *(here->HICUMbaseBIEmitEIPtr) += Ibpbi_Vbiei; - *(here->HICUMbaseBPEmitEIPtr) += -Ibpbi_Vbiei; - *(here->HICUMbaseBIBaseBIPtr) += -Ibpbi_Vbiei; - *(here->HICUMbaseBPBaseBIPtr) += Ibpbi_Vbici; - *(here->HICUMbaseBICollCIPtr) += Ibpbi_Vbici; - *(here->HICUMbaseBPCollCIPtr) += -Ibpbi_Vbici; - *(here->HICUMbaseBIBaseBIPtr) += -Ibpbi_Vbici; - }; - -// Stamp element: Isici - *(here->HICUMsubsSISubsSIPtr) += Isici_Vsici; - *(here->HICUMcollCICollCIPtr) += Isici_Vsici; - *(here->HICUMsubsSICollCIPtr) += -Isici_Vsici; - *(here->HICUMcollCISubsSIPtr) += -Isici_Vsici;; - -// Stamp element: Ibpsi - *(here->HICUMbaseBPSubsSIPtr) += Ibpsi_Vsici; - *(here->HICUMsubsSICollCIPtr) += Ibpsi_Vsici; - *(here->HICUMbaseBPCollCIPtr) += -Ibpsi_Vsici; - *(here->HICUMsubsSISubsSIPtr) += -Ibpsi_Vsici; - *(here->HICUMbaseBPBaseBPPtr) += Ibpsi_Vbpci; - *(here->HICUMsubsSICollCIPtr) += Ibpsi_Vbpci; - *(here->HICUMbaseBPCollCIPtr) += -Ibpsi_Vbpci; - *(here->HICUMsubsSIBaseBPPtr) += -Ibpsi_Vbpci;; - -// Stamp element: Rsu - *(here->HICUMsubsSubsPtr) += Isis_Vsis; - *(here->HICUMsubsSISubsSIPtr) += Isis_Vsis; - *(here->HICUMsubsSISubsPtr) += -Isis_Vsis; - *(here->HICUMsubsSubsSIPtr) += -Isis_Vsis; - - if (model->HICUMnqs) { - //Ixf1 - *(here->HICUMxf1BaseBIPtr) += +Ixf1_Vbiei; - *(here->HICUMxf1EmitEIPtr) += -Ixf1_Vbiei; - *(here->HICUMxf1BaseBIPtr) += +Ixf1_Vbici; - *(here->HICUMxf1CollCIPtr) += -Ixf1_Vbici; - *(here->HICUMxf1Xf2Ptr) += +Ixf1_Vxf2; - *(here->HICUMxf1Xf1Ptr) += +Ixf1_Vxf1; - //Ixf2 - *(here->HICUMxf2BaseBIPtr) += +Ixf2_Vbiei; - *(here->HICUMxf2EmitEIPtr) += -Ixf2_Vbiei; - *(here->HICUMxf2BaseBIPtr) += +Ixf2_Vbici; - *(here->HICUMxf2CollCIPtr) += -Ixf2_Vbici; - *(here->HICUMxf2Xf2Ptr) += +Ixf2_Vxf2; - *(here->HICUMxf2Xf1Ptr) += +Ixf2_Vxf1; - //Ixf - *(here->HICUMxfBaseBIPtr) += +Ixf_Vbiei; - *(here->HICUMxfEmitEIPtr) += -Ixf_Vbiei; - *(here->HICUMxfBaseBIPtr) += +Ixf_Vbici; - *(here->HICUMxfCollCIPtr) += -Ixf_Vbici; - *(here->HICUMxfXfPtr) += +Ixf_Vxf; - } - -//////////////////////////////////// -////////// The complex part ////// -//////////////////////////////////// - - //Qrbi - XQrbi_Vbpbi = *(ckt->CKTstate0 + here->HICUMcqrbi) * ckt->CKTomega; - XQrbi_Vbiei = here->HICUMqrbi_Vbiei * ckt->CKTomega; - XQrbi_Vbici = here->HICUMqrbi_Vbici * ckt->CKTomega; - XQrbi_Vrth = here->HICUMqrbi_Vrth * ckt->CKTomega; - //Qjei - XQjei_Vbiei = *(ckt->CKTstate0 + here->HICUMcqjei) * ckt->CKTomega; - XQjei_Vrth = here->HICUMqjei_Vrth * ckt->CKTomega; - //Qf - XQf_Vbiei = *(ckt->CKTstate0 + here->HICUMcqf) * ckt->CKTomega; - XQf_Vbici = here->HICUMqf_Vbici * ckt->CKTomega; - XQf_Vrth = here->HICUMqf_Vrth * ckt->CKTomega; - XQf_Vxf = here->HICUMqf_Vxf * ckt->CKTomega; - //Qr - XQr_Vbici = *(ckt->CKTstate0 + here->HICUMcqr) * ckt->CKTomega; - XQr_Vbiei = here->HICUMqr_Vbiei * ckt->CKTomega; - XQr_Vrth = here->HICUMqr_Vrth * ckt->CKTomega; - //Qjci - XQjci_Vbici = *(ckt->CKTstate0 + here->HICUMcqjci) * ckt->CKTomega; - XQjci_Vrth = here->HICUMqjci_Vrth * ckt->CKTomega; - //Qjep - XQjep_Vbpei = *(ckt->CKTstate0 + here->HICUMcqjep) * ckt->CKTomega; - XQjep_Vrth = here->HICUMqjep_Vrth * ckt->CKTomega; - //Qjcx_i - Xqjcx0_t_i_Vbci = *(ckt->CKTstate0 + here->HICUMcqcx0_t_i) * ckt->CKTomega; - Xqjcx0_t_i_Vrth = here->HICUMqjcx0_i_Vrth * ckt->CKTomega; - //Qjcx_ii - Xqjcx0_t_ii_Vbpci = *(ckt->CKTstate0 + here->HICUMcqcx0_t_ii) * ckt->CKTomega; - Xqjcx0_t_ii_Vrth = here->HICUMqjcx0_ii_Vrth * ckt->CKTomega; - //Qdsu - XQdsu_Vbpci = *(ckt->CKTstate0 + here->HICUMcqdsu) * ckt->CKTomega; - XQdsu_Vsici = here->HICUMqdsu_Vsici * ckt->CKTomega; - XQdsu_Vrth = here->HICUMqdsu_Vrth * ckt->CKTomega; - //Qjs - XQjs_Vsici = *(ckt->CKTstate0 + here->HICUMcqjs) * ckt->CKTomega; - XQjs_Vrth = here->HICUMqjs_Vrth * ckt->CKTomega; - //Qscp - XQscp_Vsc = *(ckt->CKTstate0 + here->HICUMcqscp) * ckt->CKTomega; - XQscp_Vrth = here->HICUMqscp_Vrth * ckt->CKTomega; - //Qbepar1 - XQbepar1_Vbe = *(ckt->CKTstate0 + here->HICUMcqbepar1) * ckt->CKTomega; - //Qbepar2 - XQbepar2_Vbpe = *(ckt->CKTstate0 + here->HICUMcqbepar2) * ckt->CKTomega; - //Qbcpar1 - XQbcpar1_Vbci = *(ckt->CKTstate0 + here->HICUMcqbcpar1) * ckt->CKTomega; - //Qbcpar2 - XQbcpar2_Vbpci = *(ckt->CKTstate0 + here->HICUMcqbcpar2) * ckt->CKTomega; - //Qsu - XQsu_Vsis = *(ckt->CKTstate0 + here->HICUMcqsu) * ckt->CKTomega; - //Qcth - XQcth_Vrth = *(ckt->CKTstate0 + here->HICUMcqcth) * ckt->CKTomega; - //Qxf - XQxf_Vxf = *(ckt->CKTstate0 + here->HICUMcqxf) * ckt->CKTomega; - XQxf1_Vxf1 = *(ckt->CKTstate0 + here->HICUMcqxf1) * ckt->CKTomega; - XQxf2_Vxf2 = *(ckt->CKTstate0 + here->HICUMcqxf2) * ckt->CKTomega; - - //Qrbi f_bp=+ f_bi=- - if (here->HICUMrbi>0.0) { - *(here->HICUMbaseBPBaseBPPtr + 1) += XQrbi_Vbpbi; - *(here->HICUMbaseBIBaseBIPtr + 1) += XQrbi_Vbpbi; - *(here->HICUMbaseBPBaseBIPtr + 1) += -XQrbi_Vbpbi; - *(here->HICUMbaseBIBaseBPPtr + 1) += -XQrbi_Vbpbi; - *(here->HICUMbaseBPBaseBIPtr + 1) += XQrbi_Vbiei; - *(here->HICUMbaseBIEmitEIPtr + 1) += XQrbi_Vbiei; - *(here->HICUMbaseBPEmitEIPtr + 1) += -XQrbi_Vbiei; - *(here->HICUMbaseBIBaseBIPtr + 1) += -XQrbi_Vbiei; - *(here->HICUMbaseBPBaseBIPtr + 1) += XQrbi_Vbici; - *(here->HICUMbaseBICollCIPtr + 1) += XQrbi_Vbici; - *(here->HICUMbaseBPCollCIPtr + 1) += -XQrbi_Vbici; - *(here->HICUMbaseBIBaseBIPtr + 1) += -XQrbi_Vbici; - } - //Qjei - *(here->HICUMbaseBIBaseBIPtr + 1) += XQjei_Vbiei; - *(here->HICUMemitEIEmitEIPtr + 1) += XQjei_Vbiei; - *(here->HICUMbaseBIEmitEIPtr + 1) += -XQjei_Vbiei; - *(here->HICUMemitEIBaseBIPtr + 1) += -XQjei_Vbiei; - //Qf f_Bi=+ f_Ei =- - *(here->HICUMbaseBIBaseBIPtr +1) += XQf_Vbiei; - *(here->HICUMemitEIEmitEIPtr +1) += XQf_Vbiei; - *(here->HICUMbaseBIEmitEIPtr +1) += -XQf_Vbiei; - *(here->HICUMemitEIBaseBIPtr +1) += -XQf_Vbiei; - *(here->HICUMbaseBIBaseBIPtr +1) += XQf_Vbici; - *(here->HICUMemitEICollCIPtr +1) += XQf_Vbici; - *(here->HICUMbaseBICollCIPtr +1) += -XQf_Vbici; - *(here->HICUMemitEIBaseBIPtr +1) += -XQf_Vbici; - if (model->HICUMnqs) { - *(here->HICUMbaseBIXfPtr +1) += XQf_Vxf; - *(here->HICUMemitEIXfPtr +1) += -XQf_Vxf; - } - //Qjci - *(here->HICUMbaseBIBaseBIPtr +1) += XQjci_Vbici; - *(here->HICUMcollCICollCIPtr +1) += XQjci_Vbici; - *(here->HICUMcollCIBaseBIPtr +1) += -XQjci_Vbici; - *(here->HICUMbaseBICollCIPtr +1) += -XQjci_Vbici; - //Qr f_bi = + f_ci=- - *(here->HICUMbaseBIBaseBIPtr +1) += XQr_Vbici; - *(here->HICUMcollCICollCIPtr +1) += XQr_Vbici; - *(here->HICUMcollCIBaseBIPtr +1) += -XQr_Vbici; - *(here->HICUMbaseBICollCIPtr +1) += -XQr_Vbici; - *(here->HICUMbaseBIBaseBIPtr +1) += XQr_Vbiei; - *(here->HICUMcollCIEmitEIPtr +1) += XQr_Vbiei; - *(here->HICUMcollCIBaseBIPtr +1) += -XQr_Vbiei; - *(here->HICUMbaseBIEmitEIPtr +1) += -XQr_Vbiei; - //Qjep - *(here->HICUMbaseBPBaseBPPtr +1) += XQjep_Vbpei; - *(here->HICUMemitEIEmitEIPtr +1) += XQjep_Vbpei; - *(here->HICUMbaseBPEmitEIPtr +1) += -XQjep_Vbpei; - *(here->HICUMemitEIBaseBPPtr +1) += -XQjep_Vbpei; - //Qjcx_i - *(here->HICUMbaseBasePtr +1) += Xqjcx0_t_i_Vbci; - *(here->HICUMcollCICollCIPtr +1) += Xqjcx0_t_i_Vbci; - *(here->HICUMbaseCollCIPtr +1) += -Xqjcx0_t_i_Vbci; - *(here->HICUMcollCIBasePtr +1) += -Xqjcx0_t_i_Vbci; - //Qjcx_ii - *(here->HICUMbaseBPBaseBPPtr +1) += Xqjcx0_t_ii_Vbpci; - *(here->HICUMcollCICollCIPtr +1) += Xqjcx0_t_ii_Vbpci; - *(here->HICUMbaseBPCollCIPtr +1) += -Xqjcx0_t_ii_Vbpci; - *(here->HICUMcollCIBaseBPPtr +1) += -Xqjcx0_t_ii_Vbpci; - //Qdsu f_bp=+ f_ci=- - *(here->HICUMbaseBPBaseBPPtr +1) += XQdsu_Vbpci; - *(here->HICUMcollCICollCIPtr +1) += XQdsu_Vbpci; - *(here->HICUMbaseBPCollCIPtr +1) += -XQdsu_Vbpci; - *(here->HICUMcollCIBaseBPPtr +1) += -XQdsu_Vbpci; - *(here->HICUMbaseBPSubsSIPtr +1) += XQdsu_Vsici; - *(here->HICUMcollCICollCIPtr +1) += XQdsu_Vsici; - *(here->HICUMbaseBPCollCIPtr +1) += -XQdsu_Vsici; - *(here->HICUMcollCISubsSIPtr +1) += -XQdsu_Vsici; - //Qjs - *(here->HICUMsubsSISubsSIPtr +1) += XQjs_Vsici; - *(here->HICUMcollCICollCIPtr +1) += XQjs_Vsici; - *(here->HICUMsubsSICollCIPtr +1) += -XQjs_Vsici; - *(here->HICUMcollCISubsSIPtr +1) += -XQjs_Vsici; - //Qscp - *(here->HICUMsubsSubsPtr + 1) += XQscp_Vsc; - *(here->HICUMcollCollPtr + 1) += XQscp_Vsc; - *(here->HICUMcollSubsPtr + 1) += -XQscp_Vsc; - *(here->HICUMsubsCollPtr + 1) += -XQscp_Vsc; - //Qbepar1 - *(here->HICUMbaseBasePtr + 1) += XQbepar1_Vbe; - *(here->HICUMemitEmitPtr + 1) += XQbepar1_Vbe; - *(here->HICUMbaseEmitPtr + 1) += -XQbepar1_Vbe; - *(here->HICUMemitBasePtr + 1) += -XQbepar1_Vbe; - //Qbepar2 - *(here->HICUMbaseBPBaseBPPtr + 1) += XQbepar2_Vbpe; - *(here->HICUMemitEmitPtr + 1) += XQbepar2_Vbpe; - *(here->HICUMemitBaseBPPtr + 1) += -XQbepar2_Vbpe; - *(here->HICUMbaseBPEmitPtr + 1) += -XQbepar2_Vbpe; - //Qbcpar1 - *(here->HICUMbaseBasePtr + 1) += XQbcpar1_Vbci; - *(here->HICUMcollCICollCIPtr + 1) += XQbcpar1_Vbci; - *(here->HICUMbaseCollCIPtr + 1) += -XQbcpar1_Vbci; - *(here->HICUMcollCIBasePtr + 1) += -XQbcpar1_Vbci; - //Qbcpar2 - *(here->HICUMbaseBPBaseBPPtr +1) += XQbcpar2_Vbpci; - *(here->HICUMcollCICollCIPtr +1) += XQbcpar2_Vbpci; - *(here->HICUMbaseBPCollCIPtr +1) += -XQbcpar2_Vbpci; - *(here->HICUMcollCIBaseBPPtr +1) += -XQbcpar2_Vbpci; - //Qsu - *(here->HICUMsubsSubsPtr + 1) += XQsu_Vsis; - *(here->HICUMsubsSISubsSIPtr + 1) += XQsu_Vsis; - *(here->HICUMsubsSISubsPtr + 1) += -XQsu_Vsis; - *(here->HICUMsubsSubsSIPtr + 1) += -XQsu_Vsis; - if (model->HICUMnqs) { - //Qxf1 - *(here->HICUMxf1Xf1Ptr + 1) += +XQxf1_Vxf1; - //Qxf2 - *(here->HICUMxf2Xf2Ptr + 1) += +XQxf2_Vxf2; - //Qxf - *(here->HICUMxfXfPtr + 1) += +XQxf_Vxf; - } - - // Stamps with SH - if (model->HICUMselfheat) { -// Stamp element: Ibiei f_Bi = + f_Ei = - - *(here->HICUMbaseBItempPtr) += Ibiei_Vrth; - *(here->HICUMemitEItempPtr) += -Ibiei_Vrth; -// Stamp element: Ibpei f_Bp = + f_Ei = - - // with respect to Potential Vrth - *(here->HICUMbaseBPtempPtr) += Ibpei_Vrth; - *(here->HICUMemitEItempPtr) += -Ibpei_Vrth; -// Stamp element: Ibici f_Bi = + f_Ci = - - *(here->HICUMbaseBItempPtr) += Ibici_Vrth; - *(here->HICUMcollCItempPtr) += -Ibici_Vrth; -// Stamp element: Iciei f_Ci = + f_Ei = - - *(here->HICUMcollCItempPtr) += Iciei_Vrth; - *(here->HICUMemitEItempPtr) += -Iciei_Vrth; -// Stamp element: Ibpci f_Bp = + f_Ci = - - *(here->HICUMbaseBPtempPtr) += Ibpci_Vrth; - *(here->HICUMcollCItempPtr) += -Ibpci_Vrth; -// Stamp element: Rcx f_Ci = + f_C = - - *(here->HICUMcollCItempPtr) += Icic_Vrth; - *(here->HICUMcollTempPtr) += -Icic_Vrth; -// Stamp element: Rbx f_B = + f_Bp = - - *(here->HICUMbaseTempPtr) += Ibbp_Vrth; - *(here->HICUMbaseBPtempPtr) += -Ibbp_Vrth; -// Stamp element: Re f_Ei = + f_E = - - *(here->HICUMemitEItempPtr) += Ieie_Vrth; - *(here->HICUMemitTempPtr) += -Ieie_Vrth; -// Stamp element: Rbi f_Bp = + f_Bi = - - *(here->HICUMbaseBPtempPtr) += Ibpbi_Vrth; - *(here->HICUMbaseBItempPtr) += -Ibpbi_Vrth; -// Stamp element: Isici f_Si = + f_Ci = - - *(here->HICUMsubsSItempPtr) += Isici_Vrth; - *(here->HICUMcollCItempPtr) += -Isici_Vrth; -// Branch: bpsi, Stamp element: Its - *(here->HICUMbaseBPtempPtr) += Ibpsi_Vrth; - *(here->HICUMsubsSItempPtr) += -Ibpsi_Vrth; - if (model->HICUMnqs) { - // Stamp element: Ixf f_xf = + - *(here->HICUMxfTempPtr) += Ixf_Vrth; - // Stamp element: Ixf1 f_xf1 = + - *(here->HICUMxf1TempPtr) += Ixf1_Vrth; - // Stamp element: Ixf2 f_xf2 = + - *(here->HICUMxf2TempPtr) += Ixf2_Vrth; - } - -// Stamp element: Rth f_T = + - *(here->HICUMtempTempPtr) += Irth_Vrth; - -// Stamp element: Ith f_T = - Ith - // with respect to Potential Vrth - *(here->HICUMtempTempPtr) += -Ith_Vrth; - // with respect to Potential Vbiei - *(here->HICUMtempBaseBIPtr) += -Ith_Vbiei; - *(here->HICUMtempEmitEIPtr) += +Ith_Vbiei; - // with respect to Potential Vbici - *(here->HICUMtempBaseBIPtr) += -Ith_Vbici; - *(here->HICUMtempCollCIPtr) += +Ith_Vbici; - // with respect to Potential Vciei - *(here->HICUMtempCollCIPtr) += -Ith_Vciei; - *(here->HICUMtempEmitEIPtr) += +Ith_Vciei; - // with respect to Potential Vbpei - *(here->HICUMtempBaseBPPtr) += -Ith_Vbpei; - *(here->HICUMtempEmitEIPtr) += +Ith_Vbpei; - // with respect to Potential Vbpci - *(here->HICUMtempBaseBPPtr) += -Ith_Vbpci; - *(here->HICUMtempCollCIPtr) += +Ith_Vbpci; - // with respect to Potential Vsici - *(here->HICUMtempSubsSIPtr) += -Ith_Vsici; - *(here->HICUMtempCollCIPtr) += +Ith_Vsici; - // with respect to Potential Vbpbi - *(here->HICUMtempBaseBPPtr) += -Ith_Vbpbi; - *(here->HICUMtempBaseBIPtr) += +Ith_Vbpbi; - // with respect to Potential Vcic - *(here->HICUMtempCollCIPtr) += -Ith_Vcic; - *(here->HICUMtempCollPtr) += +Ith_Vcic; - // with respect to Potential Vbbp - *(here->HICUMtempBasePtr) += -Ith_Vbbp; - *(here->HICUMtempBaseBPPtr) += +Ith_Vbbp; - // with respect to Potential Veie - *(here->HICUMtempEmitEIPtr) += -Ith_Veie; - *(here->HICUMtempEmitPtr) += +Ith_Veie; - - //the charges - *(here->HICUMbaseBItempPtr + 1) += +XQrbi_Vrth; - *(here->HICUMbaseBPtempPtr + 1) += -XQrbi_Vrth; - *(here->HICUMbaseBItempPtr + 1) += +XQjei_Vrth; - *(here->HICUMemitEItempPtr + 1) += -XQjei_Vrth; - *(here->HICUMbaseBItempPtr + 1) += +XQf_Vrth; - *(here->HICUMemitEItempPtr + 1) += -XQf_Vrth; - *(here->HICUMbaseBItempPtr + 1) += +XQr_Vrth; - *(here->HICUMcollCItempPtr + 1) += -XQr_Vrth; - *(here->HICUMbaseBItempPtr + 1) += +XQjci_Vrth; - *(here->HICUMcollCItempPtr + 1) += -XQjci_Vrth; - *(here->HICUMbaseBPtempPtr + 1) += +XQjep_Vrth; - *(here->HICUMemitEItempPtr + 1) += -XQjep_Vrth; - *(here->HICUMbaseTempPtr + 1) += +Xqjcx0_t_i_Vrth; - *(here->HICUMcollCItempPtr + 1) += -Xqjcx0_t_i_Vrth; - *(here->HICUMbaseBPtempPtr + 1) += +Xqjcx0_t_ii_Vrth; - *(here->HICUMcollCItempPtr + 1) += -Xqjcx0_t_ii_Vrth; - *(here->HICUMbaseBPtempPtr + 1) += +XQdsu_Vrth; - *(here->HICUMcollCItempPtr + 1) += -XQdsu_Vrth; - *(here->HICUMsubsSItempPtr + 1) += +XQjs_Vrth; - *(here->HICUMcollCItempPtr + 1) += -XQjs_Vrth; - *(here->HICUMsubsTempPtr + 1) += +XQscp_Vrth; - *(here->HICUMcollTempPtr + 1) += -XQscp_Vrth; - *(here->HICUMtempTempPtr + 1) += +XQcth_Vrth; - - } - - } - } - return(OK); -} diff --git a/src/spicelib/devices/hicum2/hicum2ask.c b/src/spicelib/devices/hicum2/hicum2ask.c deleted file mode 100644 index 4fb6d89d7..000000000 --- a/src/spicelib/devices/hicum2/hicum2ask.c +++ /dev/null @@ -1,253 +0,0 @@ -/********** -License : 3-clause BSD -Spice3 Implementation: 2019-2020 Dietmar Warning, Markus Müller, Mario Krattenmacher -Model Author : 1990 Michael Schröter TU Dresden -**********/ - -/* - * This routine gives access to the internal device - * parameters for HICUMs - */ - -#include "ngspice/ngspice.h" -#include "ngspice/const.h" -#include "ngspice/cktdefs.h" -#include "hicum2defs.h" -#include "ngspice/ifsim.h" -#include "ngspice/sperror.h" -#include "ngspice/suffix.h" - -/*ARGSUSED*/ -int -HICUMask(CKTcircuit *ckt, GENinstance *instPtr, int which, IFvalue *value, IFvalue *select) -{ - HICUMinstance *here = (HICUMinstance*)instPtr; - - NG_IGNORE(select); - double g_be; - IFvalue IC, IB, RPIi, RPIx, GMi; - IFvalue CPIi, CPIx, CMUi, CMUx; - IFvalue rcx_t, re_t, rb, BETAAC; - - switch(which) { - case HICUM_AREA: - value->rValue = here->HICUMarea; - return(OK); - case HICUM_OFF: - value->iValue = here->HICUMoff; - return(OK); - case HICUM_TEMP: - value->rValue = here->HICUMtemp - CONSTCtoK; - return(OK); - case HICUM_M: - value->rValue = here->HICUMm; - return(OK); - case HICUM_QUEST_COLLNODE: - value->iValue = here->HICUMcollNode; - return(OK); - case HICUM_QUEST_BASENODE: - value->iValue = here->HICUMbaseNode; - return(OK); - case HICUM_QUEST_EMITNODE: - value->iValue = here->HICUMemitNode; - return(OK); - case HICUM_QUEST_SUBSNODE: - value->iValue = here->HICUMsubsNode; - return(OK); - case HICUM_QUEST_COLLCINODE: - value->iValue = here->HICUMcollCINode; - return(OK); - case HICUM_QUEST_BASEBPNODE: - value->iValue = here->HICUMbaseBPNode; - return(OK); - case HICUM_QUEST_BASEBINODE: - value->iValue = here->HICUMbaseBINode; - return(OK); - case HICUM_QUEST_EMITEINODE: - value->iValue = here->HICUMemitEINode; - return(OK); - case HICUM_QUEST_SUBSSINODE: - value->iValue = here->HICUMsubsSINode; - return(OK); -/* voltages */ - case HICUM_QUEST_VBE: - value->rValue = *(ckt->CKTstate0 + here->HICUMbaseNode)-*(ckt->CKTstate0 + here->HICUMemitNode); - return(OK); - case HICUM_QUEST_VBBP: - value->rValue = *(ckt->CKTstate0 + here->HICUMbaseNode)-*(ckt->CKTstate0 + here->HICUMbaseBPNode); - return(OK); - case HICUM_QUEST_VBC: - value->rValue = *(ckt->CKTstate0 + here->HICUMbaseNode)-*(ckt->CKTstate0 + here->HICUMcollNode); - return(OK); - case HICUM_QUEST_VCE: - value->rValue = *(ckt->CKTstate0 + here->HICUMcollNode)-*(ckt->CKTstate0 + here->HICUMemitNode); - return(OK); - case HICUM_QUEST_VSC: - value->rValue = *(ckt->CKTstate0 + here->HICUMcollNode)-*(ckt->CKTstate0 + here->HICUMsubsNode); - return(OK); - case HICUM_QUEST_VBIEI: - value->rValue = *(ckt->CKTstate0 + here->HICUMvbiei); - return(OK); - case HICUM_QUEST_VBPBI: - value->rValue = *(ckt->CKTstate0 + here->HICUMvbpbi); - return(OK); - case HICUM_QUEST_VBICI: - value->rValue = *(ckt->CKTstate0 + here->HICUMvbici); - return(OK); - case HICUM_QUEST_VCIEI: - value->rValue = *(ckt->CKTstate0 + here->HICUMvbiei) - *(ckt->CKTstate0 + here->HICUMvbici); - return(OK); -/* currents */ - case HICUM_QUEST_CC: - value->rValue = *(ckt->CKTstate0 + here->HICUMiciei) - - *(ckt->CKTstate0 + here->HICUMibici) - - *(ckt->CKTstate0 + here->HICUMibpci) - - *(ckt->CKTstate0 + here->HICUMisici); - value->rValue *= HICUMmodPtr(here)->HICUMtype; - return(OK); - case HICUM_QUEST_CB: - value->rValue = *(ckt->CKTstate0 + here->HICUMibiei) + - *(ckt->CKTstate0 + here->HICUMibici) + - *(ckt->CKTstate0 + here->HICUMibpci) + - *(ckt->CKTstate0 + here->HICUMibpsi); - value->rValue *= HICUMmodPtr(here)->HICUMtype; - return(OK); - case HICUM_QUEST_CE: - value->rValue = - *(ckt->CKTstate0 + here->HICUMibiei) - - *(ckt->CKTstate0 + here->HICUMibpei) - - *(ckt->CKTstate0 + here->HICUMiciei); - value->rValue *= HICUMmodPtr(here)->HICUMtype; - return(OK); - case HICUM_QUEST_CS: - value->rValue = *(ckt->CKTstate0 + here->HICUMisici) - - *(ckt->CKTstate0 + here->HICUMibpsi); - value->rValue *= HICUMmodPtr(here)->HICUMtype; - return(OK); - case HICUM_QUEST_CAVL: - value->rValue = here->HICUMiavl; - return(OK); - case HICUM_QUEST_CBEI: - value->rValue = *(ckt->CKTstate0 + here->HICUMibiei); - return(OK); - case HICUM_QUEST_CBCI: - value->rValue = *(ckt->CKTstate0 + here->HICUMibici); - return(OK); -/* resistances */ - case HICUM_QUEST_RCX_T: - value->rValue = here->HICUMrcx_t.rpart; - return(OK); - case HICUM_QUEST_RE_T: - value->rValue = here->HICUMre_t.rpart; - return(OK); - case HICUM_QUEST_IT: - value->rValue = *(ckt->CKTstate0 + here->HICUMiciei); - return(OK); - case HICUM_QUEST_RBI: - value->rValue = here->HICUMrbi; - return(OK); - case HICUM_QUEST_RB: - value->rValue = here->HICUMrbi + here->HICUMrbx_t.rpart; - return(OK); -/* transconductances and capacitances */ - case HICUM_QUEST_BETADC: - HICUMask(ckt, instPtr, HICUM_QUEST_CC, &IC, select); - HICUMask(ckt, instPtr, HICUM_QUEST_CB, &IB, select); - if (IB.rValue != 0.0) { - value->rValue = IC.rValue/IB.rValue; - } else { - value->rValue = 0.0; - } - return(OK); - case HICUM_QUEST_GMI: - value->rValue = *(ckt->CKTstate0 + here->HICUMiciei_Vbiei); - return(OK); - case HICUM_QUEST_GMS: - value->rValue = *(ckt->CKTstate0 + here->HICUMibpsi_Vbpci); - return(OK); - case HICUM_QUEST_RPII: - value->rValue = 1/( *(ckt->CKTstate0 + here->HICUMibiei_Vbiei) ); - return(OK); - case HICUM_QUEST_RPIX: - value->rValue = 1/( *(ckt->CKTstate0 + here->HICUMibpei_Vbpei) ); - return(OK); - case HICUM_QUEST_RMUI: - value->rValue = 1/( *(ckt->CKTstate0 + here->HICUMibici_Vbici) + ckt->CKTgmin); - return(OK); - case HICUM_QUEST_RMUX: - value->rValue = 1/( *(ckt->CKTstate0 + here->HICUMibpci_Vbpci) + ckt->CKTgmin); - return(OK); - case HICUM_QUEST_ROI: - value->rValue = 1/( *(ckt->CKTstate0 + here->HICUMiciei_Vbiei) + ckt->CKTgmin); - return(OK); - case HICUM_QUEST_CPII: - value->rValue = here->HICUMcapjei + here->HICUMcapdeix; - return(OK); - case HICUM_QUEST_CPIX: - value->rValue = here->HICUMcapjep + here->HICUMcbepar_scaled; - return(OK); - case HICUM_QUEST_CMUI: - value->rValue = here->HICUMcapjci + here->HICUMcapdci; - return(OK); - case HICUM_QUEST_CMUX: - value->rValue = here->HICUMcapjcx_t_i + here->HICUMcapjcx_t_ii + here->HICUMcbcpar_scaled + here->HICUMcapdsu; - return(OK); - case HICUM_QUEST_CCS: - value->rValue = here->HICUMcapjs + here->HICUMcapscp; - return(OK); - case HICUM_QUEST_CRBI: - value->rValue = here->HICUMcaprbi; - return(OK); - case HICUM_QUEST_BETAAC: - HICUMask(ckt, instPtr, HICUM_QUEST_RPII, &RPIi, select); - HICUMask(ckt, instPtr, HICUM_QUEST_RPIX, &RPIx, select); - HICUMask(ckt, instPtr, HICUM_QUEST_GMI, &GMi, select); - g_be = 1/(RPIi.rValue + RPIx.rValue); - if (g_be > 0.0) { - value->rValue = GMi.rValue/g_be; - } else { - value->rValue = 0.0; - } - return(OK); -/* transit time */ - case HICUM_QUEST_TF: - value->rValue = here->HICUMtf; - return(OK); - case HICUM_QUEST_FT: - // FT = GMi/(2*`M_PI*(CPIi+CPIx+CMUi+CMUx+(rcx_t+re_t+(re_t+rb)/BETAAC)*GMi*(CMUi+CMUx))); - HICUMask(ckt, instPtr, HICUM_QUEST_GMI, &GMi, select); - HICUMask(ckt, instPtr, HICUM_QUEST_CPII, &CPIi, select); - HICUMask(ckt, instPtr, HICUM_QUEST_CPIX, &CPIx, select); - HICUMask(ckt, instPtr, HICUM_QUEST_CMUI, &CMUi, select); - HICUMask(ckt, instPtr, HICUM_QUEST_CMUX, &CMUx, select); - HICUMask(ckt, instPtr, HICUM_QUEST_RCX_T, &rcx_t, select); - HICUMask(ckt, instPtr, HICUM_QUEST_RE_T, &re_t, select); - HICUMask(ckt, instPtr, HICUM_QUEST_RB, &rb, select); - HICUMask(ckt, instPtr, HICUM_QUEST_BETAAC, &BETAAC, select); - - value->rValue = GMi.rValue/( - 2 * M_PI * ( - CPIi.rValue + CPIx.rValue + - CMUi.rValue + CMUx.rValue + - (rcx_t.rValue + re_t.rValue + (re_t.rValue + rb.rValue)/BETAAC.rValue) - ) * GMi.rValue * ( - CMUi.rValue + CMUx.rValue - ) - ); - return(OK); - case HICUM_QUEST_ICK: - value->rValue = here->HICUMick; - return(OK); - case HICUM_QUEST_POWER: - value->rValue = here->HICUMpterm; - return(OK); - case HICUM_QUEST_TK: - value->rValue = here->HICUMtemp; - return(OK); - case HICUM_QUEST_DTSH: - value->rValue = here->HICUMdtemp_sh; - return(OK); - default: - return(E_BADPARM); - } - /* NOTREACHED */ -} diff --git a/src/spicelib/devices/hicum2/hicum2conv.c b/src/spicelib/devices/hicum2/hicum2conv.c deleted file mode 100644 index 0be839408..000000000 --- a/src/spicelib/devices/hicum2/hicum2conv.c +++ /dev/null @@ -1,220 +0,0 @@ -/********** -License : 3-clause BSD -Spice3 Implementation: 2019-2020 Dietmar Warning, Markus Müller, Mario Krattenmacher -Model Author : 1990 Michael Schröter TU Dresden -**********/ - -/* - * This routine performs the device convergence test for - * HICUMs in the circuit. - */ - -#include "ngspice/ngspice.h" -#include "ngspice/cktdefs.h" -#include "hicum2defs.h" -#include "ngspice/sperror.h" -#include "ngspice/suffix.h" - -int -HICUMconvTest(GENmodel *inModel, CKTcircuit *ckt) -{ - HICUMinstance *here; - HICUMmodel *model = (HICUMmodel *) inModel; - double tol; - double delvbiei; - double delvbici; - double delvbpei; - double delvbpbi; - double delvbpci; - double delvsici; - double delvrth; - double delvciei; - double delvcic; - double delvbbp; - double delveie; - double delvxf; - - double ibieihat; - double ibicihat; - double icieihat; - double ibpeihat; - double ibpbihat; - double ibpcihat; - double ibpsihat; - double isicihat; - double volatile ithhat; - - - double Vbiei, Vbici, Vbpei, Vbpbi, Vbpci, Vsici, Vrth, Vcic, Vbbp, Veie, Vxf; - double Ibiei, Ibici, Iciei, Ibpei, Ibpbi, Ibpci, Ibpsi, Isici, Ith; - - for( ; model != NULL; model = HICUMnextModel(model)) { - for(here=HICUMinstances(model);here!=NULL;here = HICUMnextInstance(here)) { - Vbiei= model->HICUMtype*( - *(ckt->CKTrhsOld+here->HICUMbaseBINode)- - *(ckt->CKTrhsOld+here->HICUMemitEINode)); - Vbici = model->HICUMtype*( - *(ckt->CKTrhsOld+here->HICUMbaseBINode)- - *(ckt->CKTrhsOld+here->HICUMcollCINode)); - Vbpei = model->HICUMtype*( - *(ckt->CKTrhsOld+here->HICUMbaseBPNode)- - *(ckt->CKTrhsOld+here->HICUMemitEINode)); - Vbpbi = model->HICUMtype*( - *(ckt->CKTrhsOld+here->HICUMbaseBPNode)- - *(ckt->CKTrhsOld+here->HICUMbaseBINode)); - Vbpci = model->HICUMtype*( - *(ckt->CKTrhsOld+here->HICUMbaseBPNode)- - *(ckt->CKTrhsOld+here->HICUMcollCINode)); - Vsici = model->HICUMtype*( - *(ckt->CKTrhsOld+here->HICUMsubsSINode)- - *(ckt->CKTrhsOld+here->HICUMcollCINode)); - Vcic = model->HICUMtype*( - *(ckt->CKTrhsOld+here->HICUMcollCINode)- - *(ckt->CKTrhsOld+here->HICUMcollNode)); - Vbbp = model->HICUMtype*( - *(ckt->CKTrhsOld+here->HICUMbaseNode)- - *(ckt->CKTrhsOld+here->HICUMbaseBPNode)); - Veie = model->HICUMtype*( - *(ckt->CKTrhsOld+here->HICUMemitNode)- - *(ckt->CKTrhsOld+here->HICUMemitEINode)); - Vxf = *(ckt->CKTrhsOld+here->HICUMxfNode); - - Vrth = model->HICUMtype*(*(ckt->CKTrhsOld+here->HICUMtempNode)); - - delvrth = Vrth - *(ckt->CKTstate0 + here->HICUMvrth); - delvbiei = Vbiei - *(ckt->CKTstate0 + here->HICUMvbiei); - delvbici = Vbici - *(ckt->CKTstate0 + here->HICUMvbici); - delvbpei = Vbpei - *(ckt->CKTstate0 + here->HICUMvbpei); - delvbpbi = Vbpbi - *(ckt->CKTstate0 + here->HICUMvbpbi); - delvbpci = Vbpci - *(ckt->CKTstate0 + here->HICUMvbpci); - delvsici = Vsici - *(ckt->CKTstate0 + here->HICUMvsici); - delvciei = delvbiei-delvbici; - delvcic = Vcic - *(ckt->CKTstate0 + here->HICUMvcic); - delvbbp = Vbbp - *(ckt->CKTstate0 + here->HICUMvbbp); - delveie = Veie - *(ckt->CKTstate0 + here->HICUMveie); - delvxf = Vxf - *(ckt->CKTstate0 + here->HICUMvxf); - - //todo: maybe add ibiei_Vxf - ibieihat = *(ckt->CKTstate0 + here->HICUMibiei) + - *(ckt->CKTstate0 + here->HICUMibiei_Vbiei)*delvbiei + - *(ckt->CKTstate0 + here->HICUMibiei_Vrth)*delvrth + - *(ckt->CKTstate0 + here->HICUMibiei_Vbici)*delvbici + - *(ckt->CKTstate0 + here->HICUMibiei_Vxf)*delvxf; - ibicihat = *(ckt->CKTstate0 + here->HICUMibici) + - *(ckt->CKTstate0 + here->HICUMibici_Vbici)*delvbici+ - *(ckt->CKTstate0 + here->HICUMibici_Vrth)*delvrth+ - *(ckt->CKTstate0 + here->HICUMibici_Vbiei)*delvbiei; - icieihat = *(ckt->CKTstate0 + here->HICUMiciei) + - *(ckt->CKTstate0 + here->HICUMiciei_Vbiei)*delvbiei + - *(ckt->CKTstate0 + here->HICUMiciei_Vrth)*delvrth + - *(ckt->CKTstate0 + here->HICUMiciei_Vbici)*delvbici; - ibpeihat = *(ckt->CKTstate0 + here->HICUMibpei) + - *(ckt->CKTstate0 + here->HICUMibpei_Vrth)*delvrth+ - *(ckt->CKTstate0 + here->HICUMibpei_Vbpei)*delvbpei; - ibpbihat = *(ckt->CKTstate0 + here->HICUMibpbi) + - *(ckt->CKTstate0 + here->HICUMibpbi_Vbiei)*delvbiei + - *(ckt->CKTstate0 + here->HICUMibpbi_Vrth)*delvrth + - *(ckt->CKTstate0 + here->HICUMibpbi_Vbici)*delvbici; - ibpcihat = *(ckt->CKTstate0 + here->HICUMibpci) + - *(ckt->CKTstate0 + here->HICUMibpci_Vrth)*delvrth+ - *(ckt->CKTstate0 + here->HICUMibpci_Vbpci)*delvbici; - ibpsihat = *(ckt->CKTstate0 + here->HICUMibpsi) + - *(ckt->CKTstate0 + here->HICUMibpsi_Vbpci)*delvbpci + - *(ckt->CKTstate0 + here->HICUMibpsi_Vrth)*delvrth + - *(ckt->CKTstate0 + here->HICUMibpsi_Vsici)*delvsici; - isicihat = *(ckt->CKTstate0 + here->HICUMisici) + - *(ckt->CKTstate0 + here->HICUMisici_Vrth)*delvrth+ - *(ckt->CKTstate0 + here->HICUMisici_Vsici)*delvsici; - ithhat = *(ckt->CKTstate0 + here->HICUMith) + - *(ckt->CKTstate0 + here->HICUMith_Vrth)*delvrth+ - *(ckt->CKTstate0 + here->HICUMith_Vbiei)*delvbiei+ - *(ckt->CKTstate0 + here->HICUMith_Vbici)*delvbici+ - *(ckt->CKTstate0 + here->HICUMith_Vbpbi)*delvbpbi+ - *(ckt->CKTstate0 + here->HICUMith_Vbpci)*delvbpci+ - *(ckt->CKTstate0 + here->HICUMith_Vbpei)*delvbpei+ - *(ckt->CKTstate0 + here->HICUMith_Vciei)*delvciei+ - *(ckt->CKTstate0 + here->HICUMith_Vsici)*delvsici+ - *(ckt->CKTstate0 + here->HICUMith_Vcic)*delvcic+ - *(ckt->CKTstate0 + here->HICUMith_Vbbp)*delvbbp+ - *(ckt->CKTstate0 + here->HICUMith_Veie)*delveie; - - Ibiei = *(ckt->CKTstate0 + here->HICUMibiei); - Ibici = *(ckt->CKTstate0 + here->HICUMibici); - Iciei = *(ckt->CKTstate0 + here->HICUMiciei); - Ibpei = *(ckt->CKTstate0 + here->HICUMibpei); - Ibpbi = *(ckt->CKTstate0 + here->HICUMibpbi); - Ibpci = *(ckt->CKTstate0 + here->HICUMibpci); - Ibpsi = *(ckt->CKTstate0 + here->HICUMibpsi); - Isici = *(ckt->CKTstate0 + here->HICUMisici); - Ith = *(ckt->CKTstate0 + here->HICUMith); - - /* - * check convergence - */ - tol=ckt->CKTreltol*MAX(fabs(ibieihat),fabs(Ibiei))+ckt->CKTabstol; - if (fabs(ibieihat-Ibiei) > tol) { - ckt->CKTnoncon++; - ckt->CKTtroubleElt = (GENinstance *) here; - return(OK); /* no reason to continue - we've failed... */ - } else { - tol=ckt->CKTreltol*MAX(fabs(ibicihat),fabs(Ibici))+ckt->CKTabstol; - if (fabs(ibicihat-Ibici) > tol) { - ckt->CKTnoncon++; - ckt->CKTtroubleElt = (GENinstance *) here; - return(OK); /* no reason to continue - we've failed... */ - } else { - tol=ckt->CKTreltol*MAX(fabs(icieihat),fabs(Iciei))+ckt->CKTabstol; - if (fabs(icieihat-Iciei) > tol) { - ckt->CKTnoncon++; - ckt->CKTtroubleElt = (GENinstance *) here; - return(OK); /* no reason to continue - we've failed... */ - } else { - tol=ckt->CKTreltol*MAX(fabs(ibpeihat),fabs(Ibpei))+ckt->CKTabstol; - if (fabs(ibpeihat-Ibpei) > tol) { - ckt->CKTnoncon++; - ckt->CKTtroubleElt = (GENinstance *) here; - return(OK); /* no reason to continue - we've failed... */ - } else { - tol=ckt->CKTreltol*MAX(fabs(ibpbihat),fabs(Ibpbi))+ckt->CKTabstol; - if (fabs(ibpbihat-Ibpbi) > tol) { - ckt->CKTnoncon++; - ckt->CKTtroubleElt = (GENinstance *) here; - return(OK); /* no reason to continue - we've failed... */ - } else { - tol=ckt->CKTreltol*MAX(fabs(ibpcihat),fabs(Ibpci))+ckt->CKTabstol; - if (fabs(ibpcihat-Ibpci) > tol) { - ckt->CKTnoncon++; - ckt->CKTtroubleElt = (GENinstance *) here; - return(OK); /* no reason to continue - we've failed... */ - } else { - tol=ckt->CKTreltol*MAX(fabs(ibpsihat),fabs(Ibpsi))+ckt->CKTabstol; - if (fabs(ibpsihat-Ibpsi) > tol) { - ckt->CKTnoncon++; - ckt->CKTtroubleElt = (GENinstance *) here; - return(OK); /* no reason to continue - we've failed... */ - } else { - tol=ckt->CKTreltol*MAX(fabs(isicihat),fabs(Isici))+ckt->CKTabstol; - if (fabs(isicihat-Isici) > tol) { - ckt->CKTnoncon++; - ckt->CKTtroubleElt = (GENinstance *) here; - return(OK); /* no reason to continue - we've failed... */ - } else { - tol=ckt->CKTreltol*MAX(fabs(ithhat),fabs(Ith))+ckt->CKTabstol; - if (fabs(ithhat-Ith) > tol) { - ckt->CKTnoncon++; - ckt->CKTtroubleElt = (GENinstance *) here; - return(OK); /* no reason to continue - we've failed... */ - } - } - - } - } - } - } - } - } - } - } - } - return(OK); -} diff --git a/src/spicelib/devices/hicum2/hicum2defs.h b/src/spicelib/devices/hicum2/hicum2defs.h deleted file mode 100644 index 93d993f24..000000000 --- a/src/spicelib/devices/hicum2/hicum2defs.h +++ /dev/null @@ -1,1184 +0,0 @@ -/********** -License : 3-clause BSD -Spice3 Implementation: 2019-2020 Dietmar Warning, Markus Müller, Mario Krattenmacher -Model Author : 1990 Michael Schröter TU Dresden -**********/ - -#ifndef HICUM -#define HICUM - -#include "ngspice/cktdefs.h" -#include "ngspice/ifsim.h" -#include "ngspice/gendefs.h" -#include "ngspice/complex.h" -#include "ngspice/noisedef.h" - -/* structures to describe Bipolar Junction Transistors */ - -/* indices to array of HICUM noise sources */ - -enum { - HICUMRCNOIZ = 0, - HICUMRBNOIZ, - HICUMRBINOIZ, - HICUMRENOIZ, - HICUMRSNOIZ, - HICUMIAVLNOIZ, - HICUMIBCINOIZ, - HICUMIBEPNOIZ, - HICUMIBCXNOIZ, - HICUMIJSCNOIZ, - HICUMITNOIZ, - HICUMIBEINOIZ, - HICUMFLBENOIZ, - HICUMFLRENOIZ, - HICUMTOTNOIZ, - /* finally, the number of noise sources */ - HICUMNSRCS -}; - -typedef struct sDualDouble { - double rpart; - double dpart; -} dual_double; - -/* data needed to describe a single instance */ - -typedef struct sHICUMinstance { - - struct GENinstance gen; - -#define HICUMmodPtr(inst) ((struct sHICUMmodel *)((inst)->gen.GENmodPtr)) -#define HICUMnextInstance(inst) ((struct sHICUMinstance *)((inst)->gen.GENnextInstance)) -#define HICUMname gen.GENname -#define HICUMstate gen.GENstate - - const int HICUMcollNode; /* number of collector node of hicum */ - const int HICUMbaseNode; /* number of base node of hicum */ - const int HICUMemitNode; /* number of emitter node of hicum */ - const int HICUMsubsNode; /* number of substrate node of hicum */ - int HICUMtempNode; /* number of the temperature node of the hicum */ - int HICUMcollCINode; /* number of internal collector node of hicum */ - int HICUMbaseBINode; /* number of internal base node of hicum */ - int HICUMemitEINode; /* number of internal emitter node of hicum */ - int HICUMbaseBPNode; /* number of internal base node of hicum */ - int HICUMsubsSINode; /* number of internal substrate node */ - int HICUMxfNode; /* number of internal excess phase node qdei */ - int HICUMxf1Node; /* number of internal excess phase 1 node itf */ - int HICUMxf2Node; /* number of internal excess phase 2 node itf */ - - double HICUMarea; /* area factor for the hicum */ - //initial conditions - double HICUMicVBE; /* initial condition inner B-E branch */ - double HICUMicVCE; /* initial condition inner C-E branch */ - double HICUMicVCS; /* initial condition inner C-S branch */ - - double HICUMtemp; /* instance temperature */ - double HICUMtemp_Vrth;/* derivative device temperature to temperature at thermal node */ - double HICUMdtemp; /* instance delta temperature */ - double HICUMdtemp_sh; /* instance delta temperature because of self-heating */ - double HICUMm; /* multiply factor for the hicum */ - - double HICUMvt0; - dual_double HICUMvt; - dual_double HICUMdT; - dual_double HICUMibeis_t; - dual_double HICUMireis_t; - dual_double HICUMibeps_t; - dual_double HICUMireps_t; - dual_double HICUMibcis_t; - dual_double HICUMibcxs_t; - dual_double HICUMitss_t; - dual_double HICUMiscs_t; - dual_double HICUMqp0_t; - dual_double HICUMvlim_t; - dual_double HICUMtef0_t; - dual_double HICUMc10_t; - dual_double HICUMrci0_t; - dual_double HICUMvces_t; - dual_double HICUMt0_t; - dual_double HICUMthcs_t; - dual_double HICUMfavl_t; - dual_double HICUMqavl_t; - dual_double HICUMkavl_t; - dual_double HICUMrbi0_t; - dual_double HICUMibets_t; - dual_double HICUMabet_t; - dual_double HICUMcjcx01_t; - dual_double HICUMcjcx02_t; - dual_double HICUMrcx_t; - dual_double HICUMrbx_t; - dual_double HICUMre_t; - dual_double HICUMtsf_t; - dual_double HICUMcscp0_t; - dual_double HICUMvdsp_t; - dual_double HICUMvptsp_t; - dual_double HICUMahjei_t; - dual_double HICUMhjei0_t; - dual_double HICUMhf0_t; - dual_double HICUMhfc_t; - dual_double HICUMhfe_t; - dual_double HICUMrth_t; - - dual_double HICUMvdei_t; - dual_double HICUMajei_t; - dual_double HICUMcjci0_t; - dual_double HICUMvdci_t; - dual_double HICUMvptci_t; - dual_double HICUMvdep_t; - dual_double HICUMajep_t; - dual_double HICUMcjep0_t; - dual_double HICUMcjei0_t; - dual_double HICUMvdcx_t; - dual_double HICUMvptcx_t; - dual_double HICUMcjs0_t; - dual_double HICUMvds_t; - dual_double HICUMvpts_t; - - //model variables that depend on "area" and "m" and are needed in temp - double HICUMqp0_scaled; - double HICUMc10_scaled; - double HICUMicbar_scaled; - double HICUMrth_scaled; - double HICUMcth_scaled; - double HICUMcjei0_scaled; - double HICUMibeis_scaled; - double HICUMireis_scaled; - double HICUMibeps_scaled; - double HICUMireps_scaled; - double HICUMcjep0_scaled; - double HICUMcbepar_scaled; - double HICUMibets_scaled; - double HICUMibcis_scaled; - double HICUMcjci0_scaled; - double HICUMcjcx0_scaled; - double HICUMcbcpar_scaled; - double HICUMibcxs_scaled; - double HICUMqavl_scaled; - double HICUMre_scaled; - double HICUMrci0_scaled; - double HICUMrbx_scaled; - double HICUMrcx_scaled; - double HICUMrbi0_scaled; - double HICUMkf_scaled; - double HICUMkfre_scaled; - - double HICUMrbi; - double HICUMiavl; - double HICUMpterm; - - double HICUMtf; - double HICUMick; - - double *HICUMcollCollPtr; /* pointer to sparse matrix at - * (collector,collector) */ - double *HICUMbaseBasePtr; /* pointer to sparse matrix at - * (base,base) */ - double *HICUMemitEmitPtr; /* pointer to sparse matrix at - * (emitter,emitter) */ - double *HICUMsubsSubsPtr; /* pointer to sparse matrix at - * (substrate,substrate) */ - double *HICUMcollCICollCIPtr; /* pointer to sparse matrix at - * (collector prime,collector prime) */ - double *HICUMbaseBIBaseBIPtr; /* pointer to sparse matrix at - * (collector prime,collector prime) */ - double *HICUMbaseBPBaseBPPtr; /* pointer to sparse matrix at - * (collector prime,collector prime) */ - double *HICUMemitEIEmitEIPtr; /* pointer to sparse matrix at - * (emitter prime,emitter prime) */ - double *HICUMemitEIXfPtr; /* pointer to sparse matrix at - * (emitter prime,xf) */ - double *HICUMbaseBIXfPtr; /* pointer to sparse matrix at - * (base prime,xf) */ - - - double *HICUMsubsSISubsSIPtr; /* pointer to sparse matrix at - * (substrate prime, substrate prime) */ - - double *HICUMbaseEmitPtr; /* pointer to sparse matrix at - * (base,emit) */ - double *HICUMemitBasePtr; /* pointer to sparse matrix at - * (emit,base) */ - double *HICUMcollCollCIPtr; /* pointer to sparse matrix at - * (collector,collector prime) */ - double *HICUMbaseBaseBPPtr; /* pointer to sparse matrix at - * (base,base prime) */ - double *HICUMemitEmitEIPtr; /* pointer to sparse matrix at - * (emitter,emitter prime) */ - double *HICUMsubsSubsSIPtr; /* pointer to sparse matrix at - * (substrate, Substrate connection) */ - double *HICUMcollCIBaseBIPtr; /* pointer to sparse matrix at - * (collector prime,base) */ - double *HICUMcollCIEmitEIPtr; /* pointer to sparse matrix at - * (collector prime,emitter prime) */ - double *HICUMbaseBPBaseBIPtr; /* pointer to sparse matrix at - * (base prime,emitter prime) */ - double *HICUMbaseBPEmitEIPtr; /* pointer to sparse matrix at - * (base prime,emitter prime) */ - double *HICUMbaseBPSubsSIPtr; /* pointer to sparse matrix at - * (base prime,emitter prime) */ - double *HICUMbaseBIEmitEIPtr; /* pointer to sparse matrix at - * (base prime,emitter prime) */ - - double *HICUMcollCICollPtr; /* pointer to sparse matrix at - * (collector prime,collector) */ - double *HICUMbaseBPBasePtr; /* pointer to sparse matrix at - * (base prime,base ) */ - double *HICUMemitEIEmitPtr; /* pointer to sparse matrix at - * (emitter prime,emitter) */ - double *HICUMsubsSISubsPtr; /* pointer to sparse matrix at - * (Substrate connection, substrate) */ - double *HICUMbaseBPCollCIPtr; /* pointer to sparse matrix at - * (base,collector prime) */ - double *HICUMcollCIBaseBPPtr; /* pointer to sparse matrix at - * (collector prime,base) */ - - double *HICUMbaseBICollCIPtr; /* pointer to sparse matrix at - * (base,collector prime) */ - double *HICUMemitEICollCIPtr; /* pointer to sparse matrix at - * (emitter prime,collector prime) */ - double *HICUMsubsSICollCIPtr; /* pointer to sparse matrix at - * (substrate,collector prime) */ - double *HICUMcollCISubsSIPtr; /* pointer to sparse matrix at - * (collector prime,substrate) */ - double *HICUMbaseBIBaseBPPtr; /* pointer to sparse matrix at - * (base prime,emitter prime) */ - double *HICUMemitEIBaseBPPtr; /* pointer to sparse matrix at - * (emitter prime,base prime) */ - double *HICUMsubsSIBaseBPPtr; /* pointer to sparse matrix at - * (substrate,base) */ - double *HICUMsubsSIBaseBIPtr; /* pointer to sparse matrix at - * (substrate,base) */ - double *HICUMemitEIBaseBIPtr; /* pointer to sparse matrix at - * (emitter prime,base prime) */ - double *HICUMsubsTempPtr; /* pointer to sparse matrix at - * (subs ,T) */ - - - double *HICUMcollCIBasePtr; - double *HICUMbaseCollCIPtr; - - double *HICUMbaseBPEmitPtr; - double *HICUMemitBaseBPPtr; - - double *HICUMsubsCollPtr; - double *HICUMcollSubsPtr; - - /* excess phase */ - double *HICUMxfXfPtr; - double *HICUMxfBaseBIPtr; - double *HICUMxfEmitEIPtr; - double *HICUMxfCollCIPtr; - double *HICUMxfTempPtr; - - double *HICUMxf1Xf1Ptr; - double *HICUMxf1TempPtr; - double *HICUMxf1BaseBIPtr; - double *HICUMxf1EmitEIPtr; - double *HICUMxf1CollCIPtr; - double *HICUMxf1Xf2Ptr; - - double *HICUMxf2Xf1Ptr; - double *HICUMxf2TempPtr; - double *HICUMxf2BaseBIPtr; - double *HICUMxf2EmitEIPtr; - double *HICUMxf2CollCIPtr; - double *HICUMxf2Xf2Ptr; - double *HICUMemitXf2Ptr; - double *HICUMemitEIXf2Ptr; - double *HICUMcollCIXf2Ptr; - - /* self heating */ - double *HICUMcollTempPtr; - double *HICUMbaseTempPtr; - double *HICUMemitTempPtr; - - double *HICUMcollCItempPtr; - double *HICUMbaseBItempPtr; - double *HICUMbaseBPtempPtr; - double *HICUMemitEItempPtr; - double *HICUMsubsSItempPtr; - - double *HICUMtempCollPtr; - double *HICUMtempBasePtr; - double *HICUMtempEmitPtr; - - double *HICUMtempCollCIPtr; - double *HICUMtempBaseBIPtr; - double *HICUMtempBaseBPPtr; - double *HICUMtempEmitEIPtr; - double *HICUMtempSubsSIPtr; - double *HICUMtempTempPtr; - - unsigned HICUMareaGiven :1; /* flag to indicate area was specified */ - unsigned HICUMoff :1; /* 'off' flag for hicum */ - unsigned HICUMicVBEGiven :1; /* flag to indicate VBE init. cond. given */ - unsigned HICUMicVCEGiven :1; /* flag to indicate VCE init. cond. given */ - unsigned HICUMicVCSGiven :1; /* flag to indicate VCS init. cond. given */ - unsigned HICUMtempGiven :1; /* temperature given for hicum instance*/ - unsigned HICUMdtempGiven :1; /* delta temperature given for hicum instance*/ - unsigned HICUMmGiven :1; /* flag to indicate multiplier was specified */ - - double HICUMcaprbi; - double HICUMcapdeix; - double HICUMcapjei; - double HICUMcapdci; - double HICUMcapjci; - double HICUMcapjep; - double HICUMcapjcx_t_i; - double HICUMcapjcx_t_ii; - double HICUMcapdsu; - double HICUMcapjs; - double HICUMcapscp; - double HICUMcapsu; - double HICUMcapcth; - - //Caps due to coupling between branches - double HICUMqrbi_Vbiei; - double HICUMqrbi_Vbici; - double HICUMqrbi_Vrth; - double HICUMqjei_Vrth; - double HICUMqjep_Vrth; - double HICUMqf_Vbici; - double HICUMqf_Vxf; - double HICUMqf_Vrth; - double HICUMqr_Vbiei; - double HICUMqr_Vrth; - double HICUMqjci_Vrth; - double HICUMqjcx0_i_Vrth; - double HICUMqjcx0_ii_Vrth; - double HICUMqdsu_Vrth; - double HICUMqdsu_Vsici; - double HICUMqjs_Vrth; - double HICUMqscp_Vrth; - double HICUMicth_dT; - - double HICUMcapxf; - - double HICUMtVcrit; - double HICUMbetadc; - -#ifndef NONOISE - double HICUMnVar[NSTATVARS][HICUMNSRCS]; -#else /*NONOISE*/ - double **HICUMnVar; -#endif /*NONOISE*/ -/* the above to avoid allocating memory when it is not needed */ - -} HICUMinstance; - -/* entries in the state vector for hicum: */ - -#define HICUMvbiei HICUMstate -#define HICUMvbici HICUMstate+1 -#define HICUMvbpei HICUMstate+2 -#define HICUMvbpbi HICUMstate+3 -#define HICUMvbpci HICUMstate+4 -#define HICUMvsici HICUMstate+5 -#define HICUMvcic HICUMstate+6 -#define HICUMvbbp HICUMstate+7 -#define HICUMveie HICUMstate+8 -#define HICUMvrth HICUMstate+9 -#define HICUMvxf HICUMstate+10 -#define HICUMvxf1 HICUMstate+11 -#define HICUMvxf2 HICUMstate+12 - -#define HICUMibiei HICUMstate+13 -#define HICUMibiei_Vbiei HICUMstate+14 -#define HICUMibiei_Vxf HICUMstate+15 -#define HICUMibiei_Vbici HICUMstate+16 -#define HICUMibiei_Vrth HICUMstate+17 - -#define HICUMibpei HICUMstate+18 -#define HICUMibpei_Vbpei HICUMstate+19 -#define HICUMibpei_Vrth HICUMstate+20 - -#define HICUMiciei HICUMstate+21 -#define HICUMiciei_Vbiei HICUMstate+22 -#define HICUMiciei_Vbici HICUMstate+23 -#define HICUMiciei_Vxf2 HICUMstate+24 -#define HICUMiciei_Vrth HICUMstate+25 - -#define HICUMibici HICUMstate+26 -#define HICUMibici_Vbici HICUMstate+27 -#define HICUMibici_Vbiei HICUMstate+28 -#define HICUMibici_Vrth HICUMstate+29 - -#define HICUMibpbi HICUMstate+30 -#define HICUMibpbi_Vbpbi HICUMstate+31 -#define HICUMibpbi_Vbiei HICUMstate+32 -#define HICUMibpbi_Vbici HICUMstate+33 -#define HICUMibpbi_Vrth HICUMstate+34 - -#define HICUMibpci HICUMstate+35 -#define HICUMibpci_Vbpci HICUMstate+36 -#define HICUMibpci_Vrth HICUMstate+37 - -#define HICUMisici HICUMstate+38 -#define HICUMisici_Vsici HICUMstate+39 -#define HICUMisici_Vrth HICUMstate+40 - -#define HICUMibpsi HICUMstate+41 -#define HICUMibpsi_Vbpci HICUMstate+42 -#define HICUMibpsi_Vsici HICUMstate+43 -#define HICUMibpsi_Vrth HICUMstate+44 - -#define HICUMisis_Vsis HICUMstate+45 - -#define HICUMieie HICUMstate+46 // needed for re-flicker noise -#define HICUMieie_Vrth HICUMstate+47 - -#define HICUMqrbi HICUMstate+48 -#define HICUMcqrbi HICUMstate+49 - -#define HICUMqjei HICUMstate+50 -#define HICUMcqjei HICUMstate+51 - -#define HICUMqf HICUMstate+52 -#define HICUMcqf HICUMstate+53 - -#define HICUMqr HICUMstate+54 -#define HICUMcqr HICUMstate+55 - -#define HICUMqjci HICUMstate+56 -#define HICUMcqjci HICUMstate+57 - -#define HICUMqjep HICUMstate+58 -#define HICUMcqjep HICUMstate+59 - -#define HICUMqjcx0_i HICUMstate+60 -#define HICUMcqcx0_t_i HICUMstate+61 - -#define HICUMqjcx0_ii HICUMstate+62 -#define HICUMcqcx0_t_ii HICUMstate+63 - -#define HICUMqdsu HICUMstate+64 -#define HICUMcqdsu HICUMstate+65 - -#define HICUMqjs HICUMstate+66 -#define HICUMcqjs HICUMstate+67 - -#define HICUMqscp HICUMstate+68 -#define HICUMcqscp HICUMstate+69 - -#define HICUMqbepar1 HICUMstate+70 -#define HICUMcqbepar1 HICUMstate+71 -#define HICUMgqbepar1 HICUMstate+72 - -#define HICUMqbepar2 HICUMstate+73 -#define HICUMcqbepar2 HICUMstate+74 -#define HICUMgqbepar2 HICUMstate+75 - -#define HICUMqbcpar1 HICUMstate+76 -#define HICUMcqbcpar1 HICUMstate+77 -#define HICUMgqbcpar1 HICUMstate+78 - -#define HICUMqbcpar2 HICUMstate+79 -#define HICUMcqbcpar2 HICUMstate+80 -#define HICUMgqbcpar2 HICUMstate+81 - -#define HICUMqsu HICUMstate+82 -#define HICUMcqsu HICUMstate+83 -#define HICUMgqsu HICUMstate+84 - -#define HICUMqcth HICUMstate+85 -#define HICUMcqcth HICUMstate+86 - -#define HICUMqxf HICUMstate+87 -#define HICUMcqxf HICUMstate+88 -#define HICUMgqxf HICUMstate+89 -#define HICUMixf HICUMstate+90 -#define HICUMixf_Vbiei HICUMstate+91 -#define HICUMixf_Vbici HICUMstate+92 -#define HICUMixf_Vxf HICUMstate+93 -#define HICUMixf_Vrth HICUMstate+94 - -#define HICUMqxf1 HICUMstate+95 -#define HICUMcqxf1 HICUMstate+96 -#define HICUMgqxf1 HICUMstate+97 -#define HICUMixf1 HICUMstate+98 -#define HICUMixf1_Vbiei HICUMstate+99 -#define HICUMixf1_Vbici HICUMstate+100 -#define HICUMixf1_Vxf2 HICUMstate+101 -#define HICUMixf1_Vxf1 HICUMstate+102 -#define HICUMixf1_Vrth HICUMstate+103 - -#define HICUMqxf2 HICUMstate+104 -#define HICUMcqxf2 HICUMstate+105 -#define HICUMgqxf2 HICUMstate+106 -#define HICUMixf2 HICUMstate+107 -#define HICUMixf2_Vbiei HICUMstate+108 -#define HICUMixf2_Vbici HICUMstate+109 -#define HICUMixf2_Vxf1 HICUMstate+110 -#define HICUMixf2_Vxf2 HICUMstate+111 -#define HICUMixf2_Vrth HICUMstate+112 - -#define HICUMith HICUMstate+113 -#define HICUMith_Vrth HICUMstate+114 -#define HICUMith_Vbiei HICUMstate+115 -#define HICUMith_Vbici HICUMstate+116 -#define HICUMith_Vbpbi HICUMstate+117 -#define HICUMith_Vbpci HICUMstate+118 -#define HICUMith_Vbpei HICUMstate+119 -#define HICUMith_Vciei HICUMstate+120 -#define HICUMith_Vsici HICUMstate+121 -#define HICUMith_Vcic HICUMstate+122 -#define HICUMith_Vbbp HICUMstate+123 -#define HICUMith_Veie HICUMstate+124 - -#define HICUMit HICUMstate+125 //for noise - -#define HICUMnumStates 126 - -/* per model data */ -typedef struct sHICUMmodel { /* model structure for a hicum */ - - struct GENmodel gen; - -#define HICUMmodType gen.GENmodType -#define HICUMnextModel(inst) ((struct sHICUMmodel *)((inst)->gen.GENnextModel)) -#define HICUMinstances(inst) ((HICUMinstance *)((inst)->gen.GENinstances)) -#define HICUMmodName gen.GENmodName - -//Circuit simulator specific parameters - int HICUMtype; - double HICUMtnom; - - char *HICUMversion; - -//Transfer current - double HICUMc10; - double HICUMqp0; - double HICUMich; - double HICUMhf0; - double HICUMhfe; - double HICUMhfc; - double HICUMhjei; - double HICUMahjei; - double HICUMrhjei; - double HICUMhjci; - -//Base-Emitter diode; - double HICUMibeis; - double HICUMmbei; - double HICUMireis; - double HICUMmrei; - double HICUMibeps; - double HICUMmbep; - double HICUMireps; - double HICUMmrep; - double HICUMmcf; - -//Transit time for excess recombination current at b-c barrier - double HICUMtbhrec; - -//Base-Collector diode currents - double HICUMibcis; - double HICUMmbci; - double HICUMibcxs; - double HICUMmbcx; - -//Base-Emitter tunneling current - double HICUMibets; - double HICUMabet; - int HICUMtunode; - -//Base-Collector avalanche current - double HICUMfavl; - double HICUMqavl; - double HICUMkavl; - double HICUMalfav; - double HICUMalqav; - double HICUMalkav; - -//Series resistances - double HICUMrbi0; - double HICUMrbx; - double HICUMfgeo; - double HICUMfdqr0; - double HICUMfcrbi; - double HICUMfqi; - double HICUMre; - double HICUMrcx; - -//Substrate transistor - double HICUMitss; - double HICUMmsf; - double HICUMiscs; - double HICUMmsc; - double HICUMtsf; - -//Intra-device substrate coupling - double HICUMrsu; - double HICUMcsu; - -//Depletion Capacitances - double HICUMcjei0; - double HICUMvdei; - double HICUMzei; - double HICUMajei; - double HICUMcjep0; - double HICUMvdep; - double HICUMzep; - double HICUMajep; - double HICUMcjci0; - double HICUMvdci; - double HICUMzci; - double HICUMvptci; - double HICUMcjcx0; - double HICUMvdcx; - double HICUMzcx; - double HICUMvptcx; - double HICUMfbcpar; - double HICUMfbepar; - double HICUMcjs0; - double HICUMvds; - double HICUMzs; - double HICUMvpts; - double HICUMcscp0; - double HICUMvdsp; - double HICUMzsp; - double HICUMvptsp; - -//Diffusion Capacitances - double HICUMt0; - double HICUMdt0h; - double HICUMtbvl; - double HICUMtef0; - double HICUMgtfe; - double HICUMthcs; - double HICUMahc; - double HICUMfthc; - double HICUMrci0; - double HICUMvlim; - double HICUMvces; - double HICUMvpt; - double HICUMaick; - double HICUMdelck; - double HICUMtr; - double HICUMvcbar; - double HICUMicbar; - double HICUMacbar; - -//Isolation Capacitances - double HICUMcbepar; - double HICUMcbcpar; - -//Non-quasi-static Effect - double HICUMalqf; - double HICUMalit; - int HICUMflnqs; - -//Noise - double HICUMkf; - double HICUMaf; - int HICUMcfbe; - int HICUMflcono; - double HICUMkfre; - double HICUMafre; - -//Lateral Geometry Scaling (at high current densities) - double HICUMlatb; - double HICUMlatl; - -//Temperature dependence - double HICUMvgb; - double HICUMalt0; - double HICUMkt0; - double HICUMzetaci; - double HICUMalvs; - double HICUMalces; - double HICUMzetarbi; - double HICUMzetarbx; - double HICUMzetarcx; - double HICUMzetare; - double HICUMzetacx; - double HICUMvge; - double HICUMvgc; - double HICUMvgs; - double HICUMf1vg; - double HICUMf2vg; - double HICUMzetact; - double HICUMzetabet; - double HICUMalb; - double HICUMdvgbe; - double HICUMzetahjei; - double HICUMzetavgbe; - -//Self-Heating - int HICUMflsh; - double HICUMrth; - double HICUMzetarth; - double HICUMalrth; - double HICUMcth; - -//Compatibility with V2.1 - double HICUMflcomp; - -//SOA check parameters - double HICUMvbeMax; /* maximum voltage over B-E junction */ - double HICUMvbcMax; /* maximum voltage over B-C junction */ - double HICUMvceMax; /* maximum voltage over C-E branch */ - -//Model internal switches - int HICUMselfheat; - int HICUMnqs; - -//Circuit simulator specific parameters - unsigned HICUMtypeGiven : 1; - unsigned HICUMtnomGiven : 1; - - unsigned HICUMversionGiven :1; - -//Transfer current - unsigned HICUMc10Given : 1; - unsigned HICUMqp0Given : 1; - unsigned HICUMichGiven : 1; - unsigned HICUMhf0Given : 1; - unsigned HICUMhfeGiven : 1; - unsigned HICUMhfcGiven : 1; - unsigned HICUMhjeiGiven : 1; - unsigned HICUMahjeiGiven : 1; - unsigned HICUMrhjeiGiven : 1; - unsigned HICUMhjciGiven : 1; - -//Base-Emitter diodeGiven : 1; - unsigned HICUMibeisGiven : 1; - unsigned HICUMmbeiGiven : 1; - unsigned HICUMireisGiven : 1; - unsigned HICUMmreiGiven : 1; - unsigned HICUMibepsGiven : 1; - unsigned HICUMmbepGiven : 1; - unsigned HICUMirepsGiven : 1; - unsigned HICUMmrepGiven : 1; - unsigned HICUMmcfGiven : 1; - -//Transit time for excess recombination current at b-c barrier - unsigned HICUMtbhrecGiven : 1; - -//Base-Collector diode currents - unsigned HICUMibcisGiven : 1; - unsigned HICUMmbciGiven : 1; - unsigned HICUMibcxsGiven : 1; - unsigned HICUMmbcxGiven : 1; - -//Base-Emitter tunneling current - unsigned HICUMibetsGiven : 1; - unsigned HICUMabetGiven : 1; - unsigned HICUMtunodeGiven : 1; - -//Base-Collector avalanche current - unsigned HICUMfavlGiven : 1; - unsigned HICUMqavlGiven : 1; - unsigned HICUMkavlGiven : 1; - unsigned HICUMalfavGiven : 1; - unsigned HICUMalqavGiven : 1; - unsigned HICUMalkavGiven : 1; - -//Series resistances - unsigned HICUMrbi0Given : 1; - unsigned HICUMrbxGiven : 1; - unsigned HICUMfgeoGiven : 1; - unsigned HICUMfdqr0Given : 1; - unsigned HICUMfcrbiGiven : 1; - unsigned HICUMfqiGiven : 1; - unsigned HICUMreGiven : 1; - unsigned HICUMrcxGiven : 1; - -//Substrate transistor - unsigned HICUMitssGiven : 1; - unsigned HICUMmsfGiven : 1; - unsigned HICUMiscsGiven : 1; - unsigned HICUMmscGiven : 1; - unsigned HICUMtsfGiven : 1; - -//Intra-device substrate coupling - unsigned HICUMrsuGiven : 1; - unsigned HICUMcsuGiven : 1; - -//Depletion Capacitances - unsigned HICUMcjei0Given : 1; - unsigned HICUMvdeiGiven : 1; - unsigned HICUMzeiGiven : 1; - unsigned HICUMajeiGiven : 1; - unsigned HICUMcjep0Given : 1; - unsigned HICUMvdepGiven : 1; - unsigned HICUMzepGiven : 1; - unsigned HICUMajepGiven : 1; - unsigned HICUMcjci0Given : 1; - unsigned HICUMvdciGiven : 1; - unsigned HICUMzciGiven : 1; - unsigned HICUMvptciGiven : 1; - unsigned HICUMcjcx0Given : 1; - unsigned HICUMvdcxGiven : 1; - unsigned HICUMzcxGiven : 1; - unsigned HICUMvptcxGiven : 1; - unsigned HICUMfbcparGiven : 1; - unsigned HICUMfbeparGiven : 1; - unsigned HICUMcjs0Given : 1; - unsigned HICUMvdsGiven : 1; - unsigned HICUMzsGiven : 1; - unsigned HICUMvptsGiven : 1; - unsigned HICUMcscp0Given : 1; - unsigned HICUMvdspGiven : 1; - unsigned HICUMzspGiven : 1; - unsigned HICUMvptspGiven : 1; - -//Diffusion Capacitances - unsigned HICUMt0Given : 1; - unsigned HICUMdt0hGiven : 1; - unsigned HICUMtbvlGiven : 1; - unsigned HICUMtef0Given : 1; - unsigned HICUMgtfeGiven : 1; - unsigned HICUMthcsGiven : 1; - unsigned HICUMahcGiven : 1; - unsigned HICUMfthcGiven : 1; - unsigned HICUMrci0Given : 1; - unsigned HICUMvlimGiven : 1; - unsigned HICUMvcesGiven : 1; - unsigned HICUMvptGiven : 1; - unsigned HICUMaickGiven : 1; - unsigned HICUMdelckGiven : 1; - unsigned HICUMtrGiven : 1; - unsigned HICUMvcbarGiven : 1; - unsigned HICUMicbarGiven : 1; - unsigned HICUMacbarGiven : 1; - -//Isolation Capacitances - unsigned HICUMcbeparGiven : 1; - unsigned HICUMcbcparGiven : 1; - -//Non-quasi-static Effect - unsigned HICUMalqfGiven : 1; - unsigned HICUMalitGiven : 1; - unsigned HICUMflnqsGiven : 1; - -//Noise - unsigned HICUMkfGiven : 1; - unsigned HICUMafGiven : 1; - unsigned HICUMcfbeGiven : 1; - unsigned HICUMflconoGiven : 1; - unsigned HICUMkfreGiven : 1; - unsigned HICUMafreGiven : 1; - -//Lateral Geometry Scaling (at high current densities) - unsigned HICUMlatbGiven : 1; - unsigned HICUMlatlGiven : 1; - -//Temperature dependence - unsigned HICUMvgbGiven : 1; - unsigned HICUMalt0Given : 1; - unsigned HICUMkt0Given : 1; - unsigned HICUMzetaciGiven : 1; - unsigned HICUMalvsGiven : 1; - unsigned HICUMalcesGiven : 1; - unsigned HICUMzetarbiGiven : 1; - unsigned HICUMzetarbxGiven : 1; - unsigned HICUMzetarcxGiven : 1; - unsigned HICUMzetareGiven : 1; - unsigned HICUMzetacxGiven : 1; - unsigned HICUMvgeGiven : 1; - unsigned HICUMvgcGiven : 1; - unsigned HICUMvgsGiven : 1; - unsigned HICUMf1vgGiven : 1; - unsigned HICUMf2vgGiven : 1; - unsigned HICUMzetactGiven : 1; - unsigned HICUMzetabetGiven : 1; - unsigned HICUMalbGiven : 1; - unsigned HICUMdvgbeGiven : 1; - unsigned HICUMzetahjeiGiven : 1; - unsigned HICUMzetavgbeGiven : 1; - -//Self-Heating - unsigned HICUMflshGiven : 1; - unsigned HICUMrth_deGiven : 1; - unsigned HICUMrthGiven : 1; - unsigned HICUMzetarthGiven : 1; - unsigned HICUMalrthGiven : 1; - unsigned HICUMcthGiven : 1; - -//Compatibility with V2.1 - unsigned HICUMflcompGiven : 1; - - unsigned HICUMvbeMaxGiven : 1; - unsigned HICUMvbcMaxGiven : 1; - unsigned HICUMvceMaxGiven : 1; -} HICUMmodel; - -#ifndef NPN -#define NPN 1 -#define PNP -1 -#endif /*NPN*/ - -/* device parameters */ -enum { - HICUM_AREA = 1, - HICUM_OFF, - HICUM_IC, - HICUM_TEMP, - HICUM_DTEMP, - HICUM_M, -}; - -/* model parameters */ -enum { -//Circuit simulator specific parameters - HICUM_MOD_NPN = 101, - HICUM_MOD_PNP, - HICUM_MOD_TNOM, - - HICUM_MOD_VERSION, - -//Transfer current - HICUM_MOD_C10, - HICUM_MOD_QP0, - HICUM_MOD_ICH, - HICUM_MOD_HF0, - HICUM_MOD_HFE, - HICUM_MOD_HFC, - HICUM_MOD_HJEI, - HICUM_MOD_AHJEI, - HICUM_MOD_RHJEI, - HICUM_MOD_HJCI, - -//Base-Emitter diode, - HICUM_MOD_IBEIS, - HICUM_MOD_MBEI, - HICUM_MOD_IREIS, - HICUM_MOD_MREI, - HICUM_MOD_IBEPS, - HICUM_MOD_MBEP, - HICUM_MOD_IREPS, - HICUM_MOD_MREP, - HICUM_MOD_MCF, - -//Transit time for excess recombination current at b-c barrier - HICUM_MOD_TBHREC, - -//Base-Collector diode currents - HICUM_MOD_IBCIS, - HICUM_MOD_MBCI, - HICUM_MOD_IBCXS, - HICUM_MOD_MBCX, - -//Base-Emitter tunneling current - HICUM_MOD_IBETS, - HICUM_MOD_ABET, - HICUM_MOD_TUNODE, - -//Base-Collector avalanche current - HICUM_MOD_FAVL, - HICUM_MOD_QAVL, - HICUM_MOD_KAVL, - HICUM_MOD_ALFAV, - HICUM_MOD_ALQAV, - HICUM_MOD_ALKAV, - -//Series resistances - HICUM_MOD_RBI0, - HICUM_MOD_RBX, - HICUM_MOD_FGEO, - HICUM_MOD_FDQR0, - HICUM_MOD_FCRBI, - HICUM_MOD_FQI, - HICUM_MOD_RE, - HICUM_MOD_RCX, - -//Substrate transistor - HICUM_MOD_ITSS, - HICUM_MOD_MSF, - HICUM_MOD_ISCS, - HICUM_MOD_MSC, - HICUM_MOD_TSF, - -//Intra-device substrate coupling - HICUM_MOD_RSU, - HICUM_MOD_CSU, - -//Depletion Capacitances - HICUM_MOD_CJEI0, - HICUM_MOD_VDEI, - HICUM_MOD_ZEI, - HICUM_MOD_AJEI, - HICUM_MOD_CJEP0, - HICUM_MOD_VDEP, - HICUM_MOD_ZEP, - HICUM_MOD_AJEP, - HICUM_MOD_CJCI0, - HICUM_MOD_VDCI, - HICUM_MOD_ZCI, - HICUM_MOD_VPTCI, - HICUM_MOD_CJCX0, - HICUM_MOD_VDCX, - HICUM_MOD_ZCX, - HICUM_MOD_VPTCX, - HICUM_MOD_FBCPAR, - HICUM_MOD_FBEPAR, - HICUM_MOD_CJS0, - HICUM_MOD_VDS, - HICUM_MOD_ZS, - HICUM_MOD_VPTS, - HICUM_MOD_CSCP0, - HICUM_MOD_VDSP, - HICUM_MOD_ZSP, - HICUM_MOD_VPTSP, - -//Diffusion Capacitances - HICUM_MOD_T0, - HICUM_MOD_DT0H, - HICUM_MOD_TBVL, - HICUM_MOD_TEF0, - HICUM_MOD_GTFE, - HICUM_MOD_THCS, - HICUM_MOD_AHC, - HICUM_MOD_FTHC, - HICUM_MOD_RCI0, - HICUM_MOD_VLIM, - HICUM_MOD_VCES, - HICUM_MOD_VPT, - HICUM_MOD_AICK, - HICUM_MOD_DELCK, - HICUM_MOD_TR, - HICUM_MOD_VCBAR, - HICUM_MOD_ICBAR, - HICUM_MOD_ACBAR, - -//Isolation Capacitances - HICUM_MOD_CBEPAR, - HICUM_MOD_CBCPAR, - -//Non-quasi-static Effect - HICUM_MOD_ALQF, - HICUM_MOD_ALIT, - HICUM_MOD_FLNQS, - -//Noise - HICUM_MOD_KF, - HICUM_MOD_AF, - HICUM_MOD_CFBE, - HICUM_MOD_FLCONO, - - HICUM_MOD_KFRE, - HICUM_MOD_AFRE, - -//Lateral Geometry Scaling (at high current densities) - HICUM_MOD_LATB, - HICUM_MOD_LATL, - -//Temperature dependence - HICUM_MOD_VGB, - HICUM_MOD_ALT0, - HICUM_MOD_KT0, - HICUM_MOD_ZETACI, - HICUM_MOD_ALVS, - HICUM_MOD_ALCES, - HICUM_MOD_ZETARBI, - HICUM_MOD_ZETARBX, - HICUM_MOD_ZETARCX, - HICUM_MOD_ZETARE, - HICUM_MOD_ZETACX, - HICUM_MOD_VGE, - HICUM_MOD_VGC, - HICUM_MOD_VGS, - HICUM_MOD_F1VG, - HICUM_MOD_F2VG, - HICUM_MOD_ZETACT, - HICUM_MOD_ZETABET, - HICUM_MOD_ALB, - HICUM_MOD_DVGBE, - HICUM_MOD_ZETAHJEI, - HICUM_MOD_ZETAVGBE, - -//Self-Heating - HICUM_MOD_FLSH, - HICUM_MOD_RTH, - HICUM_MOD_ZETARTH, - HICUM_MOD_ALRTH, - HICUM_MOD_CTH, - -//Compatibility with V2.1 - HICUM_MOD_FLCOMP, - -//SOA check - HICUM_MOD_VBE_MAX, - HICUM_MOD_VBC_MAX, - HICUM_MOD_VCE_MAX, -}; - -/* device questions */ -enum { - HICUM_QUEST_COLLNODE = 251, - HICUM_QUEST_BASENODE, - HICUM_QUEST_EMITNODE, - HICUM_QUEST_SUBSNODE, - HICUM_QUEST_TEMPNODE, - HICUM_QUEST_COLLCINODE, - HICUM_QUEST_BASEBPNODE, - HICUM_QUEST_BASEBINODE, - HICUM_QUEST_EMITEINODE, - HICUM_QUEST_SUBSSINODE, - HICUM_QUEST_XFNODE, - HICUM_QUEST_XF1NODE, - HICUM_QUEST_XF2NODE, -/* temperature */ - HICUM_QUEST_TK, - HICUM_QUEST_DTSH, -/* voltages */ - HICUM_QUEST_VBE, - HICUM_QUEST_VBBP, - HICUM_QUEST_VBC, - HICUM_QUEST_VCE, - HICUM_QUEST_VSC, - HICUM_QUEST_VBIEI, - HICUM_QUEST_VBPBI, - HICUM_QUEST_VBICI, - HICUM_QUEST_VCIEI, -/* currents */ - HICUM_QUEST_CC, - HICUM_QUEST_CAVL, - HICUM_QUEST_CB, - HICUM_QUEST_CE, - HICUM_QUEST_CS, - HICUM_QUEST_CBEI, - HICUM_QUEST_CBCI, -/* resistances */ - HICUM_QUEST_RCX_T, - HICUM_QUEST_RE_T, - HICUM_QUEST_IT, - HICUM_QUEST_RBI, - HICUM_QUEST_RB, -/* transconductances and capacitances */ - HICUM_QUEST_BETADC, - HICUM_QUEST_GMI, - HICUM_QUEST_GMS, - HICUM_QUEST_RPII, - HICUM_QUEST_RPIX, - HICUM_QUEST_RMUI, - HICUM_QUEST_RMUX, - HICUM_QUEST_ROI, - HICUM_QUEST_CPII, - HICUM_QUEST_CPIX, - HICUM_QUEST_CMUI, - HICUM_QUEST_CMUX, - HICUM_QUEST_CCS, - HICUM_QUEST_BETAAC, - HICUM_QUEST_CRBI, -/* transit time */ - HICUM_QUEST_TF, - HICUM_QUEST_FT, - HICUM_QUEST_ICK, -/* power */ - HICUM_QUEST_POWER, -}; - -/* model questions */ -enum { - HICUM_MOD_COLLCONDUCT = 301, - HICUM_MOD_BASECONDUCT, - HICUM_MOD_EMITTERCONDUCT, - HICUM_MOD_SUBSTRATECONDUCT, - HICUM_MOD_TYPE, -}; - -#include "hicum2ext.h" -#endif /*HICUM*/ diff --git a/src/spicelib/devices/hicum2/hicum2ext.h b/src/spicelib/devices/hicum2/hicum2ext.h deleted file mode 100644 index 3af124bea..000000000 --- a/src/spicelib/devices/hicum2/hicum2ext.h +++ /dev/null @@ -1,27 +0,0 @@ -/********** -License : 3-clause BSD -Spice3 Implementation: 2019-2020 Dietmar Warning, Markus Müller, Mario Krattenmacher -Model Author : 1990 Michael Schröter TU Dresden -**********/ -#ifndef __HICUMEXT_H -#define __HICUMEXT_H - - -extern int HICUMacLoad(GENmodel *,CKTcircuit*); -extern int HICUMask(CKTcircuit *,GENinstance*,int,IFvalue*,IFvalue*); -extern int HICUMconvTest(GENmodel*,CKTcircuit*); -extern int HICUMmDelete(GENmodel*); -extern int HICUMgetic(GENmodel*,CKTcircuit*); -//extern int HICUMload(GENmodel*,CKTcircuit*);//moved to hicumL2.hpp -extern int HICUMmAsk(CKTcircuit*,GENmodel*,int,IFvalue*); -extern int HICUMmParam(int,IFvalue*,GENmodel*); -extern int HICUMparam(int,IFvalue*,GENinstance*,IFvalue*); -extern int HICUMpzLoad(GENmodel*, CKTcircuit*, SPcomplex*); -extern int HICUMsetup(SMPmatrix*,GENmodel*,CKTcircuit*,int*); -extern int HICUMunsetup(GENmodel*,CKTcircuit*); -// extern int HICUMtemp(GENmodel*,CKTcircuit*); // moved to hicum2temp.hpp -extern int HICUMtrunc(GENmodel*,CKTcircuit*,double*); -extern int HICUMnoise(int,int,GENmodel*,CKTcircuit*,Ndata*,double*); -extern int HICUMsoaCheck(CKTcircuit *, GENmodel *); - -#endif diff --git a/src/spicelib/devices/hicum2/hicum2getic.c b/src/spicelib/devices/hicum2/hicum2getic.c deleted file mode 100644 index ea36a6e62..000000000 --- a/src/spicelib/devices/hicum2/hicum2getic.c +++ /dev/null @@ -1,51 +0,0 @@ -/********** -License : 3-clause BSD -Spice3 Implementation: 2019-2020 Dietmar Warning, Markus Müller, Mario Krattenmacher -Model Author : 1990 Michael Schröter TU Dresden -**********/ - -/* - * This routine gets the device initial conditions for the HICUMs - * from the RHS vector - */ - -#include "ngspice/ngspice.h" -#include "ngspice/cktdefs.h" -#include "hicum2defs.h" -#include "ngspice/sperror.h" -#include "ngspice/suffix.h" - - -int -HICUMgetic(GENmodel *inModel, CKTcircuit *ckt) -{ - - HICUMmodel *model = (HICUMmodel*)inModel; - HICUMinstance *here; - /* - * grab initial conditions out of rhs array. User specified, so use - * external nodes to get values - */ - - for( ; model ; model = HICUMnextModel(model)) { - for(here = HICUMinstances(model); here ; here = HICUMnextInstance(here)) { - - if(!here->HICUMicVBEGiven) { - here->HICUMicVBE = - *(ckt->CKTrhs + here->HICUMbaseNode) - - *(ckt->CKTrhs + here->HICUMemitNode); - } - if(!here->HICUMicVCEGiven) { - here->HICUMicVCE = - *(ckt->CKTrhs + here->HICUMcollNode) - - *(ckt->CKTrhs + here->HICUMemitNode); - } - if(!here->HICUMicVCSGiven) { - here->HICUMicVCS = - *(ckt->CKTrhs + here->HICUMcollNode) - - *(ckt->CKTrhs + here->HICUMsubsNode); - } - } - } - return(OK); -} diff --git a/src/spicelib/devices/hicum2/hicum2init.c b/src/spicelib/devices/hicum2/hicum2init.c deleted file mode 100644 index 7ff355907..000000000 --- a/src/spicelib/devices/hicum2/hicum2init.c +++ /dev/null @@ -1,85 +0,0 @@ -/********** -License : 3-clause BSD -Spice3 Implementation: 2019-2020 Dietmar Warning, Markus Müller, Mario Krattenmacher -Model Author : 1990 Michael Schröter TU Dresden -**********/ - - -#include "ngspice/config.h" - -#include "ngspice/devdefs.h" - -#include "hicum2itf.h" -#include "hicum2ext.h" -#include "hicum2init.h" -#include "hicumL2.hpp" -#include "hicumL2temp.hpp" - - -SPICEdev HICUMinfo = { - .DEVpublic = { - .name = "hicum2", - .description = "High Current Model for BJT", - .terms = &HICUMnSize, - .numNames = &HICUMnSize, - .termNames = HICUMnames, - .numInstanceParms = &HICUMpTSize, - .instanceParms = HICUMpTable, - .numModelParms = &HICUMmPTSize, - .modelParms = HICUMmPTable, - .flags = DEV_DEFAULT, - -#ifdef XSPICE - .cm_func = NULL, - .num_conn = 0, - .conn = NULL, - .num_param = 0, - .param = NULL, - .num_inst_var = 0, - .inst_var = NULL, -#endif - }, - - .DEVparam = HICUMparam, - .DEVmodParam = HICUMmParam, - .DEVload = HICUMload, - .DEVsetup = HICUMsetup, - .DEVunsetup = HICUMunsetup, - .DEVpzSetup = HICUMsetup, - .DEVtemperature = HICUMtemp, - .DEVtrunc = HICUMtrunc, - .DEVfindBranch = NULL, - .DEVacLoad = HICUMacLoad, - .DEVaccept = NULL, - .DEVdestroy = NULL, - .DEVmodDelete = HICUMmDelete, - .DEVdelete = NULL, - .DEVsetic = HICUMgetic, - .DEVask = HICUMask, - .DEVmodAsk = HICUMmAsk, - .DEVpzLoad = HICUMpzLoad, - .DEVconvTest = HICUMconvTest, - .DEVsenSetup = NULL, - .DEVsenLoad = NULL, - .DEVsenUpdate = NULL, - .DEVsenAcLoad = NULL, - .DEVsenPrint = NULL, - .DEVsenTrunc = NULL, - .DEVdisto = NULL, - .DEVnoise = HICUMnoise, - .DEVsoaCheck = HICUMsoaCheck, - .DEVinstSize = &HICUMiSize, - .DEVmodSize = &HICUMmSize, - -#ifdef CIDER - .DEVdump = NULL, - .DEVacct = NULL, -#endif -}; - - -SPICEdev * -get_hicum_info(void) -{ - return &HICUMinfo; -} diff --git a/src/spicelib/devices/hicum2/hicum2init.h b/src/spicelib/devices/hicum2/hicum2init.h deleted file mode 100644 index a4e8b73e1..000000000 --- a/src/spicelib/devices/hicum2/hicum2init.h +++ /dev/null @@ -1,20 +0,0 @@ -/********** -License : 3-clause BSD -Spice3 Implementation: 2019-2020 Dietmar Warning, Markus Müller, Mario Krattenmacher -Model Author : 1990 Michael Schröter TU Dresden -**********/ - - -#ifndef _HICUMINIT_H -#define _HICUMINIT_H - -extern IFparm HICUMpTable[ ]; -extern IFparm HICUMmPTable[ ]; -extern char *HICUMnames[ ]; -extern int HICUMpTSize; -extern int HICUMmPTSize; -extern int HICUMnSize; -extern int HICUMiSize; -extern int HICUMmSize; - -#endif diff --git a/src/spicelib/devices/hicum2/hicum2itf.h b/src/spicelib/devices/hicum2/hicum2itf.h deleted file mode 100644 index f351542a9..000000000 --- a/src/spicelib/devices/hicum2/hicum2itf.h +++ /dev/null @@ -1,11 +0,0 @@ -/********** -License : 3-clause BSD -Spice3 Implementation: 2019-2020 Dietmar Warning, Markus Müller, Mario Krattenmacher -Model Author : 1990 Michael Schröter TU Dresden -**********/ -#ifndef DEV_HICUM -#define DEV_HICUM - -extern SPICEdev *get_hicum_info(void); - -#endif diff --git a/src/spicelib/devices/hicum2/hicum2mask.c b/src/spicelib/devices/hicum2/hicum2mask.c deleted file mode 100644 index ba2f43e25..000000000 --- a/src/spicelib/devices/hicum2/hicum2mask.c +++ /dev/null @@ -1,460 +0,0 @@ -/********** -License : 3-clause BSD -Spice3 Implementation: 2019-2020 Dietmar Warning, Markus Müller, Mario Krattenmacher -Model Author : 1990 Michael Schröter TU Dresden -**********/ - -#include "ngspice/ngspice.h" -#include "ngspice/const.h" -#include "ngspice/ifsim.h" -#include "ngspice/cktdefs.h" -#include "ngspice/devdefs.h" -#include "hicum2defs.h" -#include "ngspice/sperror.h" -#include "ngspice/suffix.h" - -#define MIN_R 0.001 - -/*ARGSUSED*/ -int -HICUMmAsk(CKTcircuit *ckt, GENmodel *instPtr, int which, IFvalue *value) -{ - HICUMmodel *model = (HICUMmodel*)instPtr; - - NG_IGNORE(ckt); - - switch(which) { - -//Circuit simulator specific parameters - case HICUM_MOD_TYPE: - if (model->HICUMtype == NPN) - value->sValue = "npn"; - else - value->sValue = "pnp"; - return(OK); - case HICUM_MOD_TNOM: - value->rValue = model->HICUMtnom; - return(OK); - - case HICUM_MOD_VERSION : - value->sValue = model->HICUMversion; - return(OK); - -//Transfer current - case HICUM_MOD_C10: - value->rValue = model->HICUMc10; - return(OK); - case HICUM_MOD_QP0: - value->rValue = model->HICUMqp0; - return(OK); - case HICUM_MOD_ICH: - value->rValue = model->HICUMich; - return(OK); - case HICUM_MOD_HF0: - value->rValue = model->HICUMhf0; - return(OK); - case HICUM_MOD_HFE: - value->rValue = model->HICUMhfe; - return(OK); - case HICUM_MOD_HFC: - value->rValue = model->HICUMhfc; - return(OK); - case HICUM_MOD_HJEI: - value->rValue = model->HICUMhjei; - return(OK); - case HICUM_MOD_AHJEI: - value->rValue = model->HICUMahjei; - return(OK); - case HICUM_MOD_RHJEI: - value->rValue = model->HICUMrhjei; - return(OK); - case HICUM_MOD_HJCI: - value->rValue = model->HICUMhjci; - return(OK); - -//Base-Emitter diode: - case HICUM_MOD_IBEIS: - value->rValue = model->HICUMibeis; - return(OK); - case HICUM_MOD_MBEI: - value->rValue = model->HICUMmbei; - return(OK); - case HICUM_MOD_IREIS: - value->rValue = model->HICUMireis; - return(OK); - case HICUM_MOD_MREI: - value->rValue = model->HICUMmrei; - return(OK); - case HICUM_MOD_IBEPS: - value->rValue = model->HICUMibeps; - return(OK); - case HICUM_MOD_MBEP: - value->rValue = model->HICUMmbep; - return(OK); - case HICUM_MOD_IREPS: - value->rValue = model->HICUMireps; - return(OK); - case HICUM_MOD_MREP: - value->rValue = model->HICUMmrep; - return(OK); - case HICUM_MOD_MCF: - value->rValue = model->HICUMmcf; - return(OK); - case HICUM_MOD_TBHREC: - value->rValue = model->HICUMtbhrec; - return(OK); - case HICUM_MOD_IBCIS: - value->rValue = model->HICUMibcis; - return(OK); - case HICUM_MOD_MBCI: - value->rValue = model->HICUMmbci; - return(OK); - case HICUM_MOD_IBCXS: - value->rValue = model->HICUMibcxs; - return(OK); - case HICUM_MOD_MBCX: - value->rValue = model->HICUMmbcx; - return(OK); - case HICUM_MOD_IBETS: - value->rValue = model->HICUMibets; - return(OK); - case HICUM_MOD_ABET: - value->rValue = model->HICUMabet; - return(OK); - case HICUM_MOD_TUNODE: - value->rValue = model->HICUMtunode = value->iValue; - return(OK); - case HICUM_MOD_FAVL: - value->rValue = model->HICUMfavl; - return(OK); - case HICUM_MOD_QAVL: - value->rValue = model->HICUMqavl; - return(OK); - case HICUM_MOD_KAVL: - value->rValue = model->HICUMkavl; - return(OK); - case HICUM_MOD_ALFAV: - value->rValue = model->HICUMalfav; - return(OK); - case HICUM_MOD_ALQAV: - value->rValue = model->HICUMalqav; - return(OK); - case HICUM_MOD_ALKAV: - value->rValue = model->HICUMalkav; - return(OK); - case HICUM_MOD_RBI0: - value->rValue = model->HICUMrbi0; - return(OK); - case HICUM_MOD_RBX: - value->rValue = model->HICUMrbx; - return(OK); - case HICUM_MOD_FGEO: - value->rValue = model->HICUMfgeo; - return(OK); - case HICUM_MOD_FDQR0: - value->rValue = model->HICUMfdqr0; - return(OK); - case HICUM_MOD_FCRBI: - value->rValue = model->HICUMfcrbi; - return(OK); - case HICUM_MOD_FQI: - value->rValue = model->HICUMfqi; - return(OK); - case HICUM_MOD_RE: - value->rValue = model->HICUMre; - return(OK); - case HICUM_MOD_RCX: - value->rValue = model->HICUMrcx; - return(OK); - case HICUM_MOD_ITSS: - value->rValue = model->HICUMitss; - return(OK); - case HICUM_MOD_MSF: - value->rValue = model->HICUMmsf; - return(OK); - case HICUM_MOD_ISCS: - value->rValue = model->HICUMiscs; - return(OK); - case HICUM_MOD_MSC: - value->rValue = model->HICUMmsc; - return(OK); - case HICUM_MOD_TSF: - value->rValue = model->HICUMtsf; - return(OK); - case HICUM_MOD_RSU: - value->rValue = model->HICUMrsu; - return(OK); - case HICUM_MOD_CSU: - value->rValue = model->HICUMcsu; - return(OK); - case HICUM_MOD_CJEI0: - value->rValue = model->HICUMcjei0; - return(OK); - case HICUM_MOD_VDEI: - value->rValue = model->HICUMvdei; - return(OK); - case HICUM_MOD_ZEI: - value->rValue = model->HICUMzei; - return(OK); - case HICUM_MOD_AJEI: - value->rValue = model->HICUMajei; - return(OK); - case HICUM_MOD_CJEP0: - value->rValue = model->HICUMcjep0; - return(OK); - case HICUM_MOD_VDEP: - value->rValue = model->HICUMvdep; - return(OK); - case HICUM_MOD_ZEP: - value->rValue = model->HICUMzep; - return(OK); - case HICUM_MOD_AJEP: - value->rValue = model->HICUMajep; - return(OK); - case HICUM_MOD_CJCI0: - value->rValue = model->HICUMcjci0; - return(OK); - case HICUM_MOD_VDCI: - value->rValue = model->HICUMvdci; - return(OK); - case HICUM_MOD_ZCI: - value->rValue = model->HICUMzci; - return(OK); - case HICUM_MOD_VPTCI: - value->rValue = model->HICUMvptci; - return(OK); - case HICUM_MOD_CJCX0: - value->rValue = model->HICUMcjcx0; - return(OK); - case HICUM_MOD_VDCX: - value->rValue = model->HICUMvdcx; - return(OK); - case HICUM_MOD_ZCX: - value->rValue = model->HICUMzcx; - return(OK); - case HICUM_MOD_VPTCX: - value->rValue = model->HICUMvptcx; - return(OK); - case HICUM_MOD_FBCPAR: - value->rValue = model->HICUMfbcpar; - return(OK); - case HICUM_MOD_FBEPAR: - value->rValue = model->HICUMfbepar; - return(OK); - case HICUM_MOD_CJS0: - value->rValue = model->HICUMcjs0; - return(OK); - case HICUM_MOD_VDS: - value->rValue = model->HICUMvds; - return(OK); - case HICUM_MOD_ZS: - value->rValue = model->HICUMzs; - return(OK); - case HICUM_MOD_VPTS: - value->rValue = model->HICUMvpts; - return(OK); - case HICUM_MOD_CSCP0: - value->rValue = model->HICUMcscp0; - return(OK); - case HICUM_MOD_VDSP: - value->rValue = model->HICUMvdsp; - return(OK); - case HICUM_MOD_ZSP: - value->rValue = model->HICUMzsp; - return(OK); - case HICUM_MOD_VPTSP: - value->rValue = model->HICUMvptsp; - return(OK); - case HICUM_MOD_T0: - value->rValue = model->HICUMt0; - return(OK); - case HICUM_MOD_DT0H: - value->rValue = model->HICUMdt0h; - return(OK); - case HICUM_MOD_TBVL: - value->rValue = model->HICUMtbvl; - return(OK); - case HICUM_MOD_TEF0: - value->rValue = model->HICUMtef0; - return(OK); - case HICUM_MOD_GTFE: - value->rValue = model->HICUMgtfe; - return(OK); - case HICUM_MOD_THCS: - value->rValue = model->HICUMthcs; - return(OK); - case HICUM_MOD_AHC: - value->rValue = model->HICUMahc; - return(OK); - case HICUM_MOD_FTHC: - value->rValue = model->HICUMfthc; - return(OK); - case HICUM_MOD_RCI0: - value->rValue = model->HICUMrci0; - return(OK); - case HICUM_MOD_VLIM: - value->rValue = model->HICUMvlim; - return(OK); - case HICUM_MOD_VCES: - value->rValue = model->HICUMvces; - return(OK); - case HICUM_MOD_VPT: - value->rValue = model->HICUMvpt; - return(OK); - case HICUM_MOD_AICK: - value->rValue = model->HICUMaick; - return(OK); - case HICUM_MOD_DELCK: - value->rValue = model->HICUMdelck; - return(OK); - case HICUM_MOD_TR: - value->rValue = model->HICUMtr; - return(OK); - case HICUM_MOD_VCBAR: - value->rValue = model->HICUMvcbar; - return(OK); - case HICUM_MOD_ICBAR: - value->rValue = model->HICUMicbar; - return(OK); - case HICUM_MOD_ACBAR: - value->rValue = model->HICUMacbar; - return(OK); - case HICUM_MOD_CBEPAR: - value->rValue = model->HICUMcbepar; - return(OK); - case HICUM_MOD_CBCPAR: - value->rValue = model->HICUMcbcpar; - return(OK); - case HICUM_MOD_ALQF: - value->rValue = model->HICUMalqf; - return(OK); - case HICUM_MOD_ALIT: - value->rValue = model->HICUMalit; - return(OK); - case HICUM_MOD_FLNQS: - value->iValue = model->HICUMflnqs; - return(OK); - case HICUM_MOD_KF: - value->rValue = model->HICUMkf; - return(OK); - case HICUM_MOD_AF: - value->rValue = model->HICUMaf; - return(OK); - case HICUM_MOD_CFBE: - value->rValue = model->HICUMcfbe; - return(OK); - case HICUM_MOD_FLCONO: - value->iValue = model->HICUMflcono; - return(OK); - case HICUM_MOD_KFRE: - value->rValue = model->HICUMkfre; - return(OK); - case HICUM_MOD_AFRE: - value->rValue = model->HICUMafre; - return(OK); - case HICUM_MOD_LATB: - value->rValue = model->HICUMlatb; - return(OK); - case HICUM_MOD_LATL: - value->rValue = model->HICUMlatl; - return(OK); - case HICUM_MOD_VGB: - value->rValue = model->HICUMvgb; - return(OK); - case HICUM_MOD_ALT0: - value->rValue = model->HICUMalt0; - return(OK); - case HICUM_MOD_KT0: - value->rValue = model->HICUMkt0; - return(OK); - case HICUM_MOD_ZETACI: - value->rValue = model->HICUMzetaci; - return(OK); - case HICUM_MOD_ALVS: - value->rValue = model->HICUMalvs; - return(OK); - case HICUM_MOD_ALCES: - value->rValue = model->HICUMalces; - return(OK); - case HICUM_MOD_ZETARBI: - value->rValue = model->HICUMzetarbi; - return(OK); - case HICUM_MOD_ZETARBX: - value->rValue = model->HICUMzetarbx; - return(OK); - case HICUM_MOD_ZETARCX: - value->rValue = model->HICUMzetarcx; - return(OK); - case HICUM_MOD_ZETARE: - value->rValue = model->HICUMzetare; - return(OK); - case HICUM_MOD_ZETACX: - value->rValue = model->HICUMzetacx; - return(OK); - case HICUM_MOD_VGE: - value->rValue = model->HICUMvge; - return(OK); - case HICUM_MOD_VGC: - value->rValue = model->HICUMvgc; - return(OK); - case HICUM_MOD_VGS: - value->rValue = model->HICUMvgs; - return(OK); - case HICUM_MOD_F1VG: - value->rValue = model->HICUMf1vg; - return(OK); - case HICUM_MOD_F2VG: - value->rValue = model->HICUMf2vg; - return(OK); - case HICUM_MOD_ZETACT: - value->rValue = model->HICUMzetact; - return(OK); - case HICUM_MOD_ZETABET: - value->rValue = model->HICUMzetabet; - return(OK); - case HICUM_MOD_ALB: - value->rValue = model->HICUMalb; - return(OK); - case HICUM_MOD_DVGBE: - value->rValue = model->HICUMdvgbe; - return(OK); - case HICUM_MOD_ZETAHJEI: - value->rValue = model->HICUMzetahjei; - return(OK); - case HICUM_MOD_ZETAVGBE: - value->rValue = model->HICUMzetavgbe; - return(OK); - case HICUM_MOD_FLSH: - value->iValue = model->HICUMflsh; - return(OK); - case HICUM_MOD_RTH: - value->rValue = model->HICUMrth; - return(OK); - case HICUM_MOD_ZETARTH: - value->rValue = model->HICUMzetarth; - return(OK); - case HICUM_MOD_ALRTH: - value->rValue = model->HICUMalrth; - return(OK); - case HICUM_MOD_CTH: - value->rValue = model->HICUMcth; - return(OK); - case HICUM_MOD_FLCOMP: - value->rValue = model->HICUMflcomp; - return(OK); - case HICUM_MOD_VBE_MAX: - value->rValue = model->HICUMvbeMax; - return(OK); - case HICUM_MOD_VBC_MAX: - value->rValue = model->HICUMvbcMax; - return(OK); - case HICUM_MOD_VCE_MAX: - value->rValue = model->HICUMvceMax; - return(OK); - - default: - return(E_BADPARM); - } - /* NOTREACHED */ -} - diff --git a/src/spicelib/devices/hicum2/hicum2mpar.c b/src/spicelib/devices/hicum2/hicum2mpar.c deleted file mode 100644 index 2c436f3d2..000000000 --- a/src/spicelib/devices/hicum2/hicum2mpar.c +++ /dev/null @@ -1,634 +0,0 @@ -/********** -License : 3-clause BSD -Spice3 Implementation: 2019-2020 Dietmar Warning, Markus Müller, Mario Krattenmacher -Model Author : 1990 Michael Schröter TU Dresden -**********/ - -/* - * This routine sets model parameters for - * HICUMs in the circuit. - */ - -#include "ngspice/ngspice.h" -#include "ngspice/const.h" -#include "ngspice/ifsim.h" -#include "hicum2defs.h" -#include "ngspice/sperror.h" -#include "ngspice/suffix.h" - -int -HICUMmParam(int param, IFvalue *value, GENmodel *inModel) -{ - HICUMmodel *model = (HICUMmodel*)inModel; - - switch(param) { - -//Circuit simulator specific parameters - - case HICUM_MOD_NPN: - if(value->iValue) { - model->HICUMtype = NPN; - } - break; - case HICUM_MOD_PNP: - if(value->iValue) { - model->HICUMtype = PNP; - } - break; - - case HICUM_MOD_TNOM: - model->HICUMtnom = value->rValue+CONSTCtoK; - model->HICUMtnomGiven = TRUE; - break; - - case HICUM_MOD_VERSION : - model->HICUMversion = value->sValue; - model->HICUMversionGiven = TRUE; - break; - -//Transfer current - case HICUM_MOD_C10: - model->HICUMc10 = value->rValue; - model->HICUMc10Given = TRUE; - break; - case HICUM_MOD_QP0: - model->HICUMqp0 = value->rValue; - model->HICUMqp0Given = TRUE; - break; - case HICUM_MOD_ICH: - model->HICUMich = value->rValue; - model->HICUMichGiven = TRUE; - break; - case HICUM_MOD_HF0: - model->HICUMhf0 = value->rValue; - model->HICUMhf0Given = TRUE; - break; - case HICUM_MOD_HFE: - model->HICUMhfe = value->rValue; - model->HICUMhfeGiven = TRUE; - break; - case HICUM_MOD_HFC: - model->HICUMhfc = value->rValue; - model->HICUMhfcGiven = TRUE; - break; - case HICUM_MOD_HJEI: - model->HICUMhjei = value->rValue; - model->HICUMhjeiGiven = TRUE; - break; - case HICUM_MOD_AHJEI: - model->HICUMahjei = value->rValue; - model->HICUMahjeiGiven = TRUE; - break; - case HICUM_MOD_RHJEI: - model->HICUMrhjei = value->rValue; - model->HICUMrhjeiGiven = TRUE; - break; - case HICUM_MOD_HJCI: - model->HICUMhjci = value->rValue; - model->HICUMhjciGiven = TRUE; - break; - -//Base-Emitter diode: - case HICUM_MOD_IBEIS: - model->HICUMibeis = value->rValue; - model->HICUMibeisGiven = TRUE; - break; - case HICUM_MOD_MBEI: - model->HICUMmbei = value->rValue; - model->HICUMmbeiGiven = TRUE; - break; - case HICUM_MOD_IREIS: - model->HICUMireis = value->rValue; - model->HICUMireisGiven = TRUE; - break; - case HICUM_MOD_MREI: - model->HICUMmrei = value->rValue; - model->HICUMmreiGiven = TRUE; - break; - case HICUM_MOD_IBEPS: - model->HICUMibeps = value->rValue; - model->HICUMibepsGiven = TRUE; - break; - case HICUM_MOD_MBEP: - model->HICUMmbep = value->rValue; - model->HICUMmbepGiven = TRUE; - break; - case HICUM_MOD_IREPS: - model->HICUMireps = value->rValue; - model->HICUMirepsGiven = TRUE; - break; - case HICUM_MOD_MREP: - model->HICUMmrep = value->rValue; - model->HICUMmrepGiven = TRUE; - break; - case HICUM_MOD_MCF: - model->HICUMmcf = value->rValue; - model->HICUMmcfGiven = TRUE; - break; - -//Transit time for excess recombination current at b-c barrier - case HICUM_MOD_TBHREC: - model->HICUMtbhrec = value->rValue; - model->HICUMtbhrecGiven = TRUE; - break; - -//Base-Collector diode currents - case HICUM_MOD_IBCIS: - model->HICUMibcis = value->rValue; - model->HICUMibcisGiven = TRUE; - break; - case HICUM_MOD_MBCI: - model->HICUMmbci = value->rValue; - model->HICUMmbciGiven = TRUE; - break; - case HICUM_MOD_IBCXS: - model->HICUMibcxs = value->rValue; - model->HICUMibcxsGiven = TRUE; - break; - case HICUM_MOD_MBCX: - model->HICUMmbcx = value->rValue; - model->HICUMmbcxGiven = TRUE; - break; - -//Base-Emitter tunneling current - case HICUM_MOD_IBETS: - model->HICUMibets = value->rValue; - model->HICUMibetsGiven = TRUE; - break; - case HICUM_MOD_ABET: - model->HICUMabet = value->rValue; - model->HICUMabetGiven = TRUE; - break; - case HICUM_MOD_TUNODE: - model->HICUMtunode = value->iValue; - model->HICUMtunodeGiven = TRUE; - break; - -//Base-Collector avalanche current - case HICUM_MOD_FAVL: - model->HICUMfavl = value->rValue; - model->HICUMfavlGiven = TRUE; - break; - case HICUM_MOD_QAVL: - model->HICUMqavl = value->rValue; - model->HICUMqavlGiven = TRUE; - break; - case HICUM_MOD_KAVL: - model->HICUMkavl = value->rValue; - model->HICUMkavlGiven = TRUE; - break; - case HICUM_MOD_ALFAV: - model->HICUMalfav = value->rValue; - model->HICUMalfavGiven = TRUE; - break; - case HICUM_MOD_ALQAV: - model->HICUMalqav = value->rValue; - model->HICUMalqavGiven = TRUE; - break; - case HICUM_MOD_ALKAV: - model->HICUMalkav = value->rValue; - model->HICUMalkavGiven = TRUE; - break; - -//Series resistances - case HICUM_MOD_RBI0: - model->HICUMrbi0 = value->rValue; - model->HICUMrbi0Given = TRUE; - break; - case HICUM_MOD_RBX: - model->HICUMrbx = value->rValue; - model->HICUMrbxGiven = TRUE; - break; - case HICUM_MOD_FGEO: - model->HICUMfgeo = value->rValue; - model->HICUMfgeoGiven = TRUE; - break; - case HICUM_MOD_FDQR0: - model->HICUMfdqr0 = value->rValue; - model->HICUMfdqr0Given = TRUE; - break; - case HICUM_MOD_FCRBI: - model->HICUMfcrbi = value->rValue; - model->HICUMfcrbiGiven = TRUE; - break; - case HICUM_MOD_FQI: - model->HICUMfqi = value->rValue; - model->HICUMfqiGiven = TRUE; - break; - case HICUM_MOD_RE: - model->HICUMre = value->rValue; - model->HICUMreGiven = TRUE; - break; - case HICUM_MOD_RCX: - model->HICUMrcx = value->rValue; - model->HICUMrcxGiven = TRUE; - break; - -//Substrate transistor - case HICUM_MOD_ITSS: - model->HICUMitss = value->rValue; - model->HICUMitssGiven = TRUE; - break; - case HICUM_MOD_MSF: - model->HICUMmsf = value->rValue; - model->HICUMmsfGiven = TRUE; - break; - case HICUM_MOD_ISCS: - model->HICUMiscs = value->rValue; - model->HICUMiscsGiven = TRUE; - break; - case HICUM_MOD_MSC: - model->HICUMmsc = value->rValue; - model->HICUMmscGiven = TRUE; - break; - case HICUM_MOD_TSF: - model->HICUMtsf = value->rValue; - model->HICUMtsfGiven = TRUE; - break; - -//Intra-device substrate coupling - case HICUM_MOD_RSU: - model->HICUMrsu = value->rValue; - model->HICUMrsuGiven = TRUE; - break; - case HICUM_MOD_CSU: - model->HICUMcsu = value->rValue; - model->HICUMcsuGiven = TRUE; - break; - -//Depletion Capacitances - case HICUM_MOD_CJEI0: - model->HICUMcjei0 = value->rValue; - model->HICUMcjei0Given = TRUE; - break; - case HICUM_MOD_VDEI: - model->HICUMvdei = value->rValue; - model->HICUMvdeiGiven = TRUE; - break; - case HICUM_MOD_ZEI: - model->HICUMzei = value->rValue; - model->HICUMzeiGiven = TRUE; - break; - case HICUM_MOD_AJEI: - model->HICUMajei = value->rValue; - model->HICUMajeiGiven = TRUE; - break; - case HICUM_MOD_CJEP0: - model->HICUMcjep0 = value->rValue; - model->HICUMcjep0Given = TRUE; - break; - case HICUM_MOD_VDEP: - model->HICUMvdep = value->rValue; - model->HICUMvdepGiven = TRUE; - break; - case HICUM_MOD_ZEP: - model->HICUMzep = value->rValue; - model->HICUMzepGiven = TRUE; - break; - case HICUM_MOD_AJEP: - model->HICUMajep = value->rValue; - model->HICUMajepGiven = TRUE; - break; - case HICUM_MOD_CJCI0: - model->HICUMcjci0 = value->rValue; - model->HICUMcjci0Given = TRUE; - break; - case HICUM_MOD_VDCI: - model->HICUMvdci = value->rValue; - model->HICUMvdciGiven = TRUE; - break; - case HICUM_MOD_ZCI: - model->HICUMzci = value->rValue; - model->HICUMzciGiven = TRUE; - break; - case HICUM_MOD_VPTCI: - model->HICUMvptci = value->rValue; - model->HICUMvptciGiven = TRUE; - break; - case HICUM_MOD_CJCX0: - model->HICUMcjcx0 = value->rValue; - model->HICUMcjcx0Given = TRUE; - break; - case HICUM_MOD_VDCX: - model->HICUMvdcx = value->rValue; - model->HICUMvdcxGiven = TRUE; - break; - case HICUM_MOD_ZCX: - model->HICUMzcx = value->rValue; - model->HICUMzcxGiven = TRUE; - break; - case HICUM_MOD_VPTCX: - model->HICUMvptcx = value->rValue; - model->HICUMvptcxGiven = TRUE; - break; - case HICUM_MOD_FBCPAR: - model->HICUMfbcpar = value->rValue; - model->HICUMfbcparGiven = TRUE; - break; - case HICUM_MOD_FBEPAR: - model->HICUMfbepar = value->rValue; - model->HICUMfbeparGiven = TRUE; - break; - case HICUM_MOD_CJS0: - model->HICUMcjs0 = value->rValue; - model->HICUMcjs0Given = TRUE; - break; - case HICUM_MOD_VDS: - model->HICUMvds = value->rValue; - model->HICUMvdsGiven = TRUE; - break; - case HICUM_MOD_ZS: - model->HICUMzs = value->rValue; - model->HICUMzsGiven = TRUE; - break; - case HICUM_MOD_VPTS: - model->HICUMvpts = value->rValue; - model->HICUMvptsGiven = TRUE; - break; - case HICUM_MOD_CSCP0: - model->HICUMcscp0 = value->rValue; - model->HICUMcscp0Given = TRUE; - break; - case HICUM_MOD_VDSP: - model->HICUMvdsp = value->rValue; - model->HICUMvdspGiven = TRUE; - break; - case HICUM_MOD_ZSP: - model->HICUMzsp = value->rValue; - model->HICUMzspGiven = TRUE; - break; - case HICUM_MOD_VPTSP: - model->HICUMvptsp = value->rValue; - model->HICUMvptspGiven = TRUE; - break; - -//Diffusion Capacitances - case HICUM_MOD_T0: - model->HICUMt0 = value->rValue; - model->HICUMt0Given = TRUE; - break; - case HICUM_MOD_DT0H: - model->HICUMdt0h = value->rValue; - model->HICUMdt0hGiven = TRUE; - break; - case HICUM_MOD_TBVL: - model->HICUMtbvl = value->rValue; - model->HICUMtbvlGiven = TRUE; - break; - case HICUM_MOD_TEF0: - model->HICUMtef0 = value->rValue; - model->HICUMtef0Given = TRUE; - break; - case HICUM_MOD_GTFE: - model->HICUMgtfe = value->rValue; - model->HICUMgtfeGiven = TRUE; - break; - case HICUM_MOD_THCS: - model->HICUMthcs = value->rValue; - model->HICUMthcsGiven = TRUE; - break; - case HICUM_MOD_AHC: - model->HICUMahc = value->rValue; - model->HICUMahcGiven = TRUE; - break; - case HICUM_MOD_FTHC: - model->HICUMfthc = value->rValue; - model->HICUMfthcGiven = TRUE; - break; - case HICUM_MOD_RCI0: - model->HICUMrci0 = value->rValue; - model->HICUMrci0Given = TRUE; - break; - case HICUM_MOD_VLIM: - model->HICUMvlim = value->rValue; - model->HICUMvlimGiven = TRUE; - break; - case HICUM_MOD_VCES: - model->HICUMvces = value->rValue; - model->HICUMvcesGiven = TRUE; - break; - case HICUM_MOD_VPT: - model->HICUMvpt = value->rValue; - model->HICUMvptGiven = TRUE; - break; - case HICUM_MOD_AICK: - model->HICUMaick = value->rValue; - model->HICUMaickGiven = TRUE; - break; - case HICUM_MOD_DELCK: - model->HICUMdelck = value->rValue; - model->HICUMdelckGiven = TRUE; - break; - case HICUM_MOD_TR: - model->HICUMtr = value->rValue; - model->HICUMtrGiven = TRUE; - break; - case HICUM_MOD_VCBAR: - model->HICUMvcbar = value->rValue; - model->HICUMvcbarGiven = TRUE; - break; - case HICUM_MOD_ICBAR: - model->HICUMicbar = value->rValue; - model->HICUMicbarGiven = TRUE; - break; - case HICUM_MOD_ACBAR: - model->HICUMacbar = value->rValue; - model->HICUMacbarGiven = TRUE; - break; - -//Isolation Capacitances - case HICUM_MOD_CBEPAR: - model->HICUMcbepar = value->rValue; - model->HICUMcbeparGiven = TRUE; - break; - case HICUM_MOD_CBCPAR: - model->HICUMcbcpar = value->rValue; - model->HICUMcbcparGiven = TRUE; - break; - -//Non-quasi-static Effect - case HICUM_MOD_ALQF: - model->HICUMalqf = value->rValue; - model->HICUMalqfGiven = TRUE; - break; - case HICUM_MOD_ALIT: - model->HICUMalit = value->rValue; - model->HICUMalitGiven = TRUE; - break; - case HICUM_MOD_FLNQS: - model->HICUMflnqs = value->iValue; - model->HICUMflnqsGiven = TRUE; - break; - -//Noise - case HICUM_MOD_KF: - model->HICUMkf = value->rValue; - model->HICUMkfGiven = TRUE; - break; - case HICUM_MOD_AF: - model->HICUMaf = value->rValue; - model->HICUMafGiven = TRUE; - break; - case HICUM_MOD_CFBE: - model->HICUMcfbe = value->iValue; - model->HICUMcfbeGiven = TRUE; - break; - case HICUM_MOD_FLCONO: - model->HICUMflcono = value->iValue; - model->HICUMflconoGiven = TRUE; - break; - case HICUM_MOD_KFRE: - model->HICUMkfre = value->rValue; - model->HICUMkfreGiven = TRUE; - break; - case HICUM_MOD_AFRE: - model->HICUMafre = value->rValue; - model->HICUMafreGiven = TRUE; - break; - -//Lateral Geometry Scaling (at high current densities) - case HICUM_MOD_LATB: - model->HICUMlatb = value->rValue; - model->HICUMlatbGiven = TRUE; - break; - case HICUM_MOD_LATL: - model->HICUMlatl = value->rValue; - model->HICUMlatlGiven = TRUE; - break; - -//Temperature dependence - case HICUM_MOD_VGB: - model->HICUMvgb = value->rValue; - model->HICUMvgbGiven = TRUE; - break; - case HICUM_MOD_ALT0: - model->HICUMalt0 = value->rValue; - model->HICUMalt0Given = TRUE; - break; - case HICUM_MOD_KT0: - model->HICUMkt0 = value->rValue; - model->HICUMkt0Given = TRUE; - break; - case HICUM_MOD_ZETACI: - model->HICUMzetaci = value->rValue; - model->HICUMzetaciGiven = TRUE; - break; - case HICUM_MOD_ALVS: - model->HICUMalvs = value->rValue; - model->HICUMalvsGiven = TRUE; - break; - case HICUM_MOD_ALCES: - model->HICUMalces = value->rValue; - model->HICUMalcesGiven = TRUE; - break; - case HICUM_MOD_ZETARBI: - model->HICUMzetarbi = value->rValue; - model->HICUMzetarbiGiven = TRUE; - break; - case HICUM_MOD_ZETARBX: - model->HICUMzetarbx = value->rValue; - model->HICUMzetarbxGiven = TRUE; - break; - case HICUM_MOD_ZETARCX: - model->HICUMzetarcx = value->rValue; - model->HICUMzetarcxGiven = TRUE; - break; - case HICUM_MOD_ZETARE: - model->HICUMzetare = value->rValue; - model->HICUMzetareGiven = TRUE; - break; - case HICUM_MOD_ZETACX: - model->HICUMzetacx = value->rValue; - model->HICUMzetacxGiven = TRUE; - break; - case HICUM_MOD_VGE: - model->HICUMvge = value->rValue; - model->HICUMvgeGiven = TRUE; - break; - case HICUM_MOD_VGC: - model->HICUMvgc = value->rValue; - model->HICUMvgcGiven = TRUE; - break; - case HICUM_MOD_VGS: - model->HICUMvgs = value->rValue; - model->HICUMvgsGiven = TRUE; - break; - case HICUM_MOD_F1VG: - model->HICUMf1vg = value->rValue; - model->HICUMf1vgGiven = TRUE; - break; - case HICUM_MOD_F2VG: - model->HICUMf2vg = value->rValue; - model->HICUMf2vgGiven = TRUE; - break; - case HICUM_MOD_ZETACT: - model->HICUMzetact = value->rValue; - model->HICUMzetactGiven = TRUE; - break; - case HICUM_MOD_ZETABET: - model->HICUMzetabet = value->rValue; - model->HICUMzetabetGiven = TRUE; - break; - case HICUM_MOD_ALB: - model->HICUMalb = value->rValue; - model->HICUMalbGiven = TRUE; - break; - case HICUM_MOD_DVGBE: - model->HICUMdvgbe = value->rValue; - model->HICUMdvgbeGiven = TRUE; - break; - case HICUM_MOD_ZETAHJEI: - model->HICUMzetahjei = value->rValue; - model->HICUMzetahjeiGiven = TRUE; - break; - case HICUM_MOD_ZETAVGBE: - model->HICUMzetavgbe = value->rValue; - model->HICUMzetavgbeGiven = TRUE; - break; - -//Self-Heating - case HICUM_MOD_FLSH: - model->HICUMflsh = value->iValue; - model->HICUMflshGiven = TRUE; - break; - case HICUM_MOD_RTH: - model->HICUMrth = value->rValue; - model->HICUMrthGiven = TRUE; - break; - case HICUM_MOD_ZETARTH: - model->HICUMzetarth = value->rValue; - model->HICUMzetarthGiven = TRUE; - break; - case HICUM_MOD_ALRTH: - model->HICUMalrth = value->rValue; - model->HICUMalrthGiven = TRUE; - break; - case HICUM_MOD_CTH: - model->HICUMcth = value->rValue; - model->HICUMcthGiven = TRUE; - break; - -//Compatibility with V2.1 - case HICUM_MOD_FLCOMP: - model->HICUMflcomp = value->rValue; - model->HICUMflcompGiven = TRUE; - break; - -//SOA-check - case HICUM_MOD_VBE_MAX: - model->HICUMvbeMax = value->rValue; - model->HICUMvbeMaxGiven = TRUE; - break; - case HICUM_MOD_VBC_MAX: - model->HICUMvbcMax = value->rValue; - model->HICUMvbcMaxGiven = TRUE; - break; - case HICUM_MOD_VCE_MAX: - model->HICUMvceMax = value->rValue; - model->HICUMvceMaxGiven = TRUE; - break; - default: - return(E_BADPARM); - } - return(OK); -} diff --git a/src/spicelib/devices/hicum2/hicum2noise.c b/src/spicelib/devices/hicum2/hicum2noise.c deleted file mode 100644 index ed19ad0e7..000000000 --- a/src/spicelib/devices/hicum2/hicum2noise.c +++ /dev/null @@ -1,293 +0,0 @@ -/********** -License : 3-clause BSD -Spice3 Implementation: 2019-2020 Dietmar Warning, Markus Müller, Mario Krattenmacher -Model Author : 1990 Michael Schröter TU Dresden -**********/ - -#include "ngspice/ngspice.h" -#include "hicum2defs.h" -#include "ngspice/cktdefs.h" -#include "ngspice/iferrmsg.h" -#include "ngspice/noisedef.h" -#include "ngspice/suffix.h" - -/* - * HICUMnoise (mode, operation, firstModel, ckt, data, OnDens) - * - * This routine names and evaluates all of the noise sources - * associated with HICUM's. It starts with the model *firstModel and - * traverses all of its insts. It then proceeds to any other models - * on the linked list. The total output noise density generated by - * all of the HICUM's is summed with the variable "OnDens". - */ - - -int -HICUMnoise (int mode, int operation, GENmodel *genmodel, CKTcircuit *ckt, Ndata *data, double *OnDens) -{ - NOISEAN *job = (NOISEAN *) ckt->CKTcurJob; - - HICUMmodel *firstModel = (HICUMmodel *) genmodel; - HICUMmodel *model; - HICUMinstance *here; - double tempOnoise; - double tempInoise; - double noizDens[HICUMNSRCS]; - double lnNdens[HICUMNSRCS]; - int i; - - double Ibbp_Vbbp; - double Icic_Vcic; - double Ibpbi_Vbpbi; - double Ieie_Veie; - double Isis_Vsis; - - /* define the names of the noise sources */ - - static char *HICUMnNames[HICUMNSRCS] = { - /* Note that we have to keep the order consistent with the - strchr definitions in HICUMdefs.h */ - "_rcx", /* thermal noise due to rcx */ - "_rbx", /* thermal noise due to rbx */ - "_rbi", /* thermal noise due to rbi */ - "_re", /* thermal noise due to re */ - "_rsu", /* thermal noise due to rsu */ - "_iavl", /* shot noise due to iavl */ - "_ibci", /* shot noise due to ibci */ - "_ibep", /* shot noise due to ibep */ - "_ijbcx", /* shot noise due to ijbcx */ - "_ijsc", /* shot noise due to ijsc */ - "_it", /* shot noise due to iciei */ - "_ibei", /* shot noise due to ibiei */ - "_1overfbe", /* flicker (1/f) noise ibe */ - "_1overfre", /* flicker (1/f) noise re */ - "" /* total transistor noise */ - }; - - for (model=firstModel; model != NULL; model=HICUMnextModel(model)) { - for (here=HICUMinstances(model); here != NULL; - here=HICUMnextInstance(here)) { - - // get all derivatives of branch DC currents - if(model->HICUMrcxGiven && model->HICUMrcx != 0) { - Icic_Vcic = 1/here->HICUMrcx_t.rpart; - } else { - Icic_Vcic = 0.0; - } - if(model->HICUMrbxGiven && model->HICUMrbx != 0) { - Ibbp_Vbbp = 1/here->HICUMrbx_t.rpart; - } else { - Ibbp_Vbbp = 0.0; - } - if(model->HICUMreGiven && model->HICUMre != 0) { - Ieie_Veie = 1/here->HICUMre_t.rpart; - } else { - Ieie_Veie = 0.0; - } - if(model->HICUMrsuGiven && model->HICUMrsu != 0) { - Isis_Vsis = 1/model->HICUMrsu*here->HICUMm; - } else { - Isis_Vsis = 0.0; - } - if(here->HICUMrbi > 0) { - Ibpbi_Vbpbi = 1/here->HICUMrbi; - } else { - Ibpbi_Vbpbi = 0.0; - } - - switch (operation) { - - case N_OPEN: - - /* see if we have to to produce a summary report */ - /* if so, name all the noise generators */ - - if (job->NStpsSm != 0) { - switch (mode) { - - case N_DENS: - for (i=0; i < HICUMNSRCS; i++) { - NOISE_ADD_OUTVAR(ckt, data, "onoise_%s%s", here->HICUMname, HICUMnNames[i]); - } - break; - - case INT_NOIZ: - for (i=0; i < HICUMNSRCS; i++) { - NOISE_ADD_OUTVAR(ckt, data, "onoise_total_%s%s", here->HICUMname, HICUMnNames[i]); - NOISE_ADD_OUTVAR(ckt, data, "inoise_total_%s%s", here->HICUMname, HICUMnNames[i]); - } - break; - } - } - break; - - case N_CALC: - switch (mode) { - - case N_DENS: - NevalSrc(&noizDens[HICUMRCNOIZ],&lnNdens[HICUMRCNOIZ], - ckt,THERMNOISE,here->HICUMcollCINode,here->HICUMcollNode, - Icic_Vcic); - - NevalSrc(&noizDens[HICUMRBNOIZ],&lnNdens[HICUMRBNOIZ], - ckt,THERMNOISE,here->HICUMbaseNode,here->HICUMbaseBPNode, - Ibbp_Vbbp); - - NevalSrc(&noizDens[HICUMRBINOIZ],&lnNdens[HICUMRBINOIZ], - ckt,THERMNOISE,here->HICUMbaseBPNode,here->HICUMbaseBINode, - Ibpbi_Vbpbi); - - NevalSrc(&noizDens[HICUMRENOIZ],&lnNdens[HICUMRENOIZ], - ckt,THERMNOISE,here->HICUMemitEINode,here->HICUMemitNode, - Ieie_Veie); - - NevalSrc(&noizDens[HICUMRSNOIZ],&lnNdens[HICUMRSNOIZ], - ckt,THERMNOISE,here->HICUMsubsSINode,here->HICUMsubsNode, - Isis_Vsis); - - - NevalSrc(&noizDens[HICUMIAVLNOIZ],&lnNdens[HICUMIAVLNOIZ], - ckt,SHOTNOISE,here->HICUMcollCINode,here->HICUMbaseBINode, - here->HICUMiavl); - - NevalSrc(&noizDens[HICUMIBCINOIZ],&lnNdens[HICUMIBCINOIZ], - ckt,SHOTNOISE,here->HICUMbaseBINode,here->HICUMcollCINode, - *(ckt->CKTstate0 + here->HICUMibici)+here->HICUMiavl); - - NevalSrc(&noizDens[HICUMIBEPNOIZ],&lnNdens[HICUMIBEPNOIZ], - ckt,SHOTNOISE,here->HICUMbaseBPNode,here->HICUMemitEINode, - *(ckt->CKTstate0 + here->HICUMibpei)); - - NevalSrc(&noizDens[HICUMIBCXNOIZ],&lnNdens[HICUMIBCXNOIZ], - ckt,SHOTNOISE,here->HICUMbaseBPNode,here->HICUMcollCINode, - *(ckt->CKTstate0 + here->HICUMibpci)); - - NevalSrc(&noizDens[HICUMIJSCNOIZ],&lnNdens[HICUMIJSCNOIZ], - ckt,SHOTNOISE,here->HICUMsubsSINode,here->HICUMcollCINode, - *(ckt->CKTstate0 + here->HICUMisici)); - - NevalSrc(&noizDens[HICUMITNOIZ],&lnNdens[HICUMITNOIZ], - ckt,SHOTNOISE,here->HICUMcollCINode,here->HICUMemitEINode, - *(ckt->CKTstate0 + here->HICUMit)); - - NevalSrc(&noizDens[HICUMIBEINOIZ],&lnNdens[HICUMIBEINOIZ], - ckt,SHOTNOISE,here->HICUMbaseBINode,here->HICUMemitEINode, - *(ckt->CKTstate0 + here->HICUMibiei)); - - - if (model->HICUMcfbe == -1) { - NevalSrc(&noizDens[HICUMFLBENOIZ], NULL, ckt, - N_GAIN,here->HICUMbaseBINode, here->HICUMemitEINode, - (double)0.0); - } else { - NevalSrc(&noizDens[HICUMFLBENOIZ], NULL, ckt, - N_GAIN,here->HICUMbaseBPNode, here->HICUMemitEINode, - (double)0.0); - } - noizDens[HICUMFLBENOIZ] *= here->HICUMkf_scaled * - exp(model->HICUMaf * - log(MAX(fabs((*(ckt->CKTstate0 + here->HICUMibiei)+*(ckt->CKTstate0 + here->HICUMibpei))),N_MINLOG))) / - data->freq; - lnNdens[HICUMFLBENOIZ] = - log(MAX(noizDens[HICUMFLBENOIZ],N_MINLOG)); - - NevalSrc(&noizDens[HICUMFLRENOIZ], NULL, ckt, - N_GAIN,here->HICUMemitEINode, here->HICUMemitNode, - (double)0.0); - noizDens[HICUMFLRENOIZ] *= here->HICUMkfre_scaled * - exp(model->HICUMafre * - log(MAX(fabs(*(ckt->CKTstate0 + here->HICUMieie)),N_MINLOG))) / - data->freq; - lnNdens[HICUMFLRENOIZ] = - log(MAX(noizDens[HICUMFLRENOIZ],N_MINLOG)); - - - noizDens[HICUMTOTNOIZ] = noizDens[HICUMRCNOIZ] + - noizDens[HICUMRBNOIZ] + - noizDens[HICUMRBINOIZ] + - noizDens[HICUMRENOIZ] + - noizDens[HICUMRSNOIZ] + - noizDens[HICUMIAVLNOIZ] + - noizDens[HICUMIBCINOIZ] + - noizDens[HICUMIBEPNOIZ] + - noizDens[HICUMIBCXNOIZ] + - noizDens[HICUMIJSCNOIZ] + - noizDens[HICUMITNOIZ] + - noizDens[HICUMIBEINOIZ] + - noizDens[HICUMFLBENOIZ] + - noizDens[HICUMFLRENOIZ]; - - - lnNdens[HICUMTOTNOIZ] = - log(noizDens[HICUMTOTNOIZ]); - - *OnDens += noizDens[HICUMTOTNOIZ]; - - if (data->delFreq == 0.0) { - - /* if we haven't done any previous integration, we need to */ - /* initialize our "history" variables */ - - for (i=0; i < HICUMNSRCS; i++) { - here->HICUMnVar[LNLSTDENS][i] = lnNdens[i]; - } - - /* clear out our integration variables if it's the first pass */ - - if (data->freq == job->NstartFreq) { - for (i=0; i < HICUMNSRCS; i++) { - here->HICUMnVar[OUTNOIZ][i] = 0.0; - here->HICUMnVar[INNOIZ][i] = 0.0; - } - } - } else { /* data->delFreq != 0.0 (we have to integrate) */ - -/* In order to get the best curve fit, we have to integrate each component separately */ - - for (i=0; i < HICUMNSRCS; i++) { - if (i != HICUMTOTNOIZ) { - tempOnoise = Nintegrate(noizDens[i], lnNdens[i], - here->HICUMnVar[LNLSTDENS][i], data); - tempInoise = Nintegrate(noizDens[i] * data->GainSqInv , - lnNdens[i] + data->lnGainInv, - here->HICUMnVar[LNLSTDENS][i] + data->lnGainInv, - data); - here->HICUMnVar[LNLSTDENS][i] = lnNdens[i]; - data->outNoiz += tempOnoise; - data->inNoise += tempInoise; - if (job->NStpsSm != 0) { - here->HICUMnVar[OUTNOIZ][i] += tempOnoise; - here->HICUMnVar[OUTNOIZ][HICUMTOTNOIZ] += tempOnoise; - here->HICUMnVar[INNOIZ][i] += tempInoise; - here->HICUMnVar[INNOIZ][HICUMTOTNOIZ] += tempInoise; - } - } - } - } - if (data->prtSummary) { - for (i=0; i < HICUMNSRCS; i++) { /* print a summary report */ - data->outpVector[data->outNumber++] = noizDens[i]; - } - } - break; - - case INT_NOIZ: /* already calculated, just output */ - if (job->NStpsSm != 0) { - for (i=0; i < HICUMNSRCS; i++) { - data->outpVector[data->outNumber++] = here->HICUMnVar[OUTNOIZ][i]; - data->outpVector[data->outNumber++] = here->HICUMnVar[INNOIZ][i]; - } - } /* if */ - break; - } /* switch (mode) */ - break; - - case N_CLOSE: - return (OK); /* do nothing, the main calling routine will close */ - break; /* the plots */ - } /* switch (operation) */ - } /* for here */ - } /* for model */ - -return(OK); -} diff --git a/src/spicelib/devices/hicum2/hicum2param.c b/src/spicelib/devices/hicum2/hicum2param.c deleted file mode 100644 index 8191e511e..000000000 --- a/src/spicelib/devices/hicum2/hicum2param.c +++ /dev/null @@ -1,70 +0,0 @@ -/********** -License : 3-clause BSD -Spice3 Implementation: 2019-2020 Dietmar Warning, Markus Müller, Mario Krattenmacher -Model Author : 1990 Michael Schröter TU Dresden -**********/ - -/* - * This routine sets instance parameters for - * HICUMs in the circuit. - */ - -#include "ngspice/ngspice.h" -#include "ngspice/const.h" -#include "ngspice/ifsim.h" -#include "hicum2defs.h" -#include "ngspice/sperror.h" -#include "ngspice/suffix.h" - - -/* ARGSUSED */ -int -HICUMparam(int param, IFvalue *value, GENinstance *instPtr, IFvalue *select) -{ - HICUMinstance *here = (HICUMinstance*)instPtr; - - NG_IGNORE(select); - - switch(param) { - case HICUM_AREA: - here->HICUMarea = value->rValue; - here->HICUMareaGiven = TRUE; - break; - case HICUM_OFF: - here->HICUMoff = (value->iValue != 0); - break; - case HICUM_TEMP: - here->HICUMtemp = value->rValue+CONSTCtoK; - here->HICUMtempGiven = TRUE; - break; - case HICUM_DTEMP: - here->HICUMdtemp = value->rValue; - here->HICUMdtempGiven = TRUE; - break; - case HICUM_M: - here->HICUMm = value->rValue; - here->HICUMmGiven = TRUE; - break; - case HICUM_IC : - switch(value->v.numValue) { - case 3: - here->HICUMicVCS = *(value->v.vec.rVec+2); - here->HICUMicVCSGiven = TRUE; - /* fallthrough */ - case 2: - here->HICUMicVCE = *(value->v.vec.rVec+1); - here->HICUMicVCEGiven = TRUE; - /* fallthrough */ - case 1: - here->HICUMicVBE = *(value->v.vec.rVec); - here->HICUMicVBEGiven = TRUE; - break; - default: - return(E_BADPARM); - } - break; - default: - return(E_BADPARM); - } - return(OK); -} diff --git a/src/spicelib/devices/hicum2/hicum2pzld.c b/src/spicelib/devices/hicum2/hicum2pzld.c deleted file mode 100644 index ca76a982c..000000000 --- a/src/spicelib/devices/hicum2/hicum2pzld.c +++ /dev/null @@ -1,759 +0,0 @@ -/********** -License : 3-clause BSD -Spice3 Implementation: 2019-2020 Dietmar Warning, Markus Müller, Mario Krattenmacher -Model Author : 1990 Michael Schröter TU Dresden -**********/ - - -/* - * Function to load the COMPLEX circuit matrix using the - * small signal parameters saved during a previous DC operating - * point analysis. - */ - -#include "ngspice/ngspice.h" -#include "ngspice/cktdefs.h" -#include "hicum2defs.h" -#include "ngspice/sperror.h" -#include "ngspice/suffix.h" - -int -HICUMpzLoad(GENmodel *inModel, CKTcircuit *ckt, SPcomplex *s) -{ - HICUMinstance *here; - HICUMmodel *model = (HICUMmodel*)inModel; - double Ibpei_Vbpei; - double Ibpei_Vrth; - - double Ibiei_Vbiei; - double Ibiei_Vxf; - double Ibiei_Vbici; - double Ibiei_Vrth; - - double Ibici_Vbici; - double Ibici_Vbiei; - double Ibici_Vrth; - - double Ibpci_Vbpci; - double Ibpci_Vrth; - - double Isici_Vsici; - double Isici_Vrth; - - double Iciei_Vbiei; - double Iciei_Vbici; - double Iciei_Vrth; - double Iciei_Vxf2; - - - double Ibpbi_Vbpbi; - double Ibpbi_Vbici; - double Ibpbi_Vbiei; - double Ibpbi_Vrth; - - double Isis_Vsis; - double Icic_Vcic, Icic_Vrth; - double Ieie_Veie, Ieie_Vrth; - double Ibbp_Vbbp, Ibbp_Vrth; - double Irth_Vrth; - - double Ibpsi_Vbpci; - double Ibpsi_Vsici; - double Ibpsi_Vrth; - - double XQrbi_Vbpbi; - double XQrbi_Vbiei; - double XQrbi_Vbici; - double XQrbi_Vrth; - double XQjei_Vbiei; - double XQjei_Vrth; - double XQjci_Vbici; - double XQjci_Vrth; - double XQjep_Vbpei; - double XQjep_Vrth; - double volatile Xqjcx0_t_i_Vbci; - double Xqjcx0_t_i_Vrth; - double volatile Xqjcx0_t_ii_Vbpci; - double Xqjcx0_t_ii_Vrth; - double XQdsu_Vbpci; - double XQdsu_Vsici; - double XQdsu_Vrth; - double XQjs_Vsici; - double XQjs_Vrth; - double XQscp_Vsc; - double XQscp_Vrth; - double XQbepar1_Vbe; - double XQbepar2_Vbpe; - double XQbcpar1_Vbci; - double XQbcpar2_Vbpci; - double XQsu_Vsis; - double XQcth_Vrth; - double XQf_Vbiei; - double XQf_Vbici; - double XQf_Vrth; - double XQf_Vxf; - double XQr_Vrth; - double XQr_Vbiei; - double XQr_Vbici; - - double XQxf_Vxf; - double XQxf1_Vxf1; - double XQxf2_Vxf2; - - double Ixf1_Vbiei; - double Ixf1_Vbici; - double Ixf1_Vxf2 ; - double Ixf1_Vxf1 ; - double Ixf1_Vrth ; - - double Ixf2_Vbiei; - double Ixf2_Vbici; - double Ixf2_Vxf2 ; - double Ixf2_Vxf1 ; - double Ixf2_Vrth ; - - double Ixf_Vbiei ; - double Ixf_Vbici ; - double Ixf_Vxf ; - double Ixf_Vrth ; - - double Ith_Vrth, Ith_Vbiei, Ith_Vbici, Ith_Vbpbi, Ith_Vbpci, Ith_Vbpei, Ith_Vciei, Ith_Vsici, Ith_Vcic, Ith_Vbbp, Ith_Veie; - - /* loop through all the models */ - for( ; model != NULL; model = HICUMnextModel(model)) { - - /* loop through all the instances of the model */ - for( here = HICUMinstances(model); here!= NULL; - here = HICUMnextInstance(here)) { - - - // get all derivatives of branch DC currents - if(model->HICUMrcxGiven && model->HICUMrcx != 0) { - Icic_Vcic = 1/here->HICUMrcx_t.rpart; - Icic_Vrth = -*(ckt->CKTstate0 + here->HICUMvcic)/here->HICUMrcx_t.rpart/here->HICUMrcx_t.rpart*here->HICUMrcx_t.dpart; - } else { - Icic_Vcic = 0.0; - Icic_Vrth = 0.0; - } - if(model->HICUMrbxGiven && model->HICUMrbx != 0) { - Ibbp_Vbbp = 1/here->HICUMrbx_t.rpart; - Ibbp_Vrth = -*(ckt->CKTstate0 + here->HICUMvbbp)/here->HICUMrbx_t.rpart/here->HICUMrbx_t.rpart*here->HICUMrbx_t.dpart; - } else { - Ibbp_Vbbp = 0.0; - Ibbp_Vrth = 0.0; - } - if(model->HICUMreGiven && model->HICUMre != 0) { - Ieie_Veie = 1/here->HICUMre_t.rpart; - Ieie_Vrth = -*(ckt->CKTstate0 + here->HICUMveie)/here->HICUMre_t.rpart/here->HICUMre_t.rpart*here->HICUMre_t.dpart; - } else { - Ieie_Veie = 0.0; - Ieie_Vrth = 0.0; - } - if(model->HICUMrsuGiven && model->HICUMrsu != 0) { - Isis_Vsis = 1/model->HICUMrsu*here->HICUMm; - } else { - Isis_Vsis = 0.0; - } - if(model->HICUMselfheat) { - Irth_Vrth = (1/here->HICUMrth_t.rpart - *(ckt->CKTstate0 + here->HICUMvrth)/(here->HICUMrth_t.rpart*here->HICUMrth_t.rpart) * here->HICUMrth_t.dpart); - } else { - Irth_Vrth = 0.0; - } - - Ibiei_Vbiei = *(ckt->CKTstate0 + here->HICUMibiei_Vbiei); - Ibiei_Vxf = *(ckt->CKTstate0 + here->HICUMibiei_Vxf); - Ibiei_Vbici = *(ckt->CKTstate0 + here->HICUMibiei_Vbici); - Ibiei_Vrth = *(ckt->CKTstate0 + here->HICUMibiei_Vrth); - - Ibpei_Vbpei = *(ckt->CKTstate0 + here->HICUMibpei_Vbpei); - Ibpei_Vrth = *(ckt->CKTstate0 + here->HICUMibpei_Vrth); - - Iciei_Vbiei = *(ckt->CKTstate0 + here->HICUMiciei_Vbiei); - Iciei_Vbici = *(ckt->CKTstate0 + here->HICUMiciei_Vbici); - Iciei_Vrth = *(ckt->CKTstate0 + here->HICUMiciei_Vrth); - Iciei_Vxf2 = *(ckt->CKTstate0 + here->HICUMiciei_Vxf2); - - Ibici_Vbici = *(ckt->CKTstate0 + here->HICUMibici_Vbici); - Ibici_Vbiei = *(ckt->CKTstate0 + here->HICUMibici_Vbiei); - Ibici_Vrth = *(ckt->CKTstate0 + here->HICUMibici_Vrth); - - Ibpbi_Vbpbi = *(ckt->CKTstate0 + here->HICUMibpbi_Vbpbi); - Ibpbi_Vbiei = *(ckt->CKTstate0 + here->HICUMibpbi_Vbiei); - Ibpbi_Vbici = *(ckt->CKTstate0 + here->HICUMibpbi_Vbici); - Ibpbi_Vrth = *(ckt->CKTstate0 + here->HICUMibpbi_Vrth); - - Ibpci_Vbpci = *(ckt->CKTstate0 + here->HICUMibpci_Vbpci); - Ibpci_Vrth = *(ckt->CKTstate0 + here->HICUMibpci_Vrth); - - Isici_Vsici = *(ckt->CKTstate0 + here->HICUMisici_Vsici); - Isici_Vrth = *(ckt->CKTstate0 + here->HICUMisici_Vrth); - - Ibpsi_Vbpci = *(ckt->CKTstate0 + here->HICUMibpsi_Vbpci); - Ibpsi_Vsici = *(ckt->CKTstate0 + here->HICUMibpsi_Vsici); - Ibpsi_Vrth = *(ckt->CKTstate0 + here->HICUMibpsi_Vrth); - - Ith_Vrth = *(ckt->CKTstate0 + here->HICUMith_Vrth); - Ith_Vbiei = *(ckt->CKTstate0 + here->HICUMith_Vbiei); - Ith_Vbici = *(ckt->CKTstate0 + here->HICUMith_Vbici); - Ith_Vbpbi = *(ckt->CKTstate0 + here->HICUMith_Vbpbi); - Ith_Vbpci = *(ckt->CKTstate0 + here->HICUMith_Vbpci); - Ith_Vbpei = *(ckt->CKTstate0 + here->HICUMith_Vbpei); - Ith_Vciei = *(ckt->CKTstate0 + here->HICUMith_Vciei); - Ith_Vsici = *(ckt->CKTstate0 + here->HICUMith_Vsici); - Ith_Vcic = *(ckt->CKTstate0 + here->HICUMith_Vcic); - Ith_Vbbp = *(ckt->CKTstate0 + here->HICUMith_Vbbp); - Ith_Veie = *(ckt->CKTstate0 + here->HICUMith_Veie); - - Ixf1_Vbiei = *(ckt->CKTstate0 + here->HICUMixf1_Vbiei); - Ixf1_Vbici = *(ckt->CKTstate0 + here->HICUMixf1_Vbici); - Ixf1_Vxf2 = *(ckt->CKTstate0 + here->HICUMixf1_Vxf2); - Ixf1_Vxf1 = *(ckt->CKTstate0 + here->HICUMixf1_Vxf1); - Ixf1_Vrth = *(ckt->CKTstate0 + here->HICUMixf1_Vrth); - - Ixf2_Vbiei = *(ckt->CKTstate0 + here->HICUMixf2_Vbiei); - Ixf2_Vbici = *(ckt->CKTstate0 + here->HICUMixf2_Vbici); - Ixf2_Vxf2 = *(ckt->CKTstate0 + here->HICUMixf2_Vxf2); - Ixf2_Vxf1 = *(ckt->CKTstate0 + here->HICUMixf2_Vxf1); - Ixf2_Vrth = *(ckt->CKTstate0 + here->HICUMixf2_Vrth); - - Ixf_Vbiei = *(ckt->CKTstate0 + here->HICUMixf_Vbiei); - Ixf_Vbici = *(ckt->CKTstate0 + here->HICUMixf_Vbici); - Ixf_Vxf = *(ckt->CKTstate0 + here->HICUMixf_Vxf); - Ixf_Vrth = *(ckt->CKTstate0 + here->HICUMixf_Vrth); - -//////////////////////////////////// -////////// The real part ///////// -//////////////////////////////////// - -// Stamp element: Ibiei - *(here->HICUMbaseBIBaseBIPtr) += Ibiei_Vbiei; - *(here->HICUMemitEIEmitEIPtr) += Ibiei_Vbiei; - *(here->HICUMbaseBIEmitEIPtr) += -Ibiei_Vbiei; - *(here->HICUMemitEIBaseBIPtr) += -Ibiei_Vbiei; - *(here->HICUMbaseBIBaseBIPtr) += Ibiei_Vbici; - *(here->HICUMemitEICollCIPtr) += Ibiei_Vbici; - *(here->HICUMbaseBICollCIPtr) += -Ibiei_Vbici; - *(here->HICUMemitEIBaseBIPtr) += -Ibiei_Vbici; - if (model->HICUMnqs) { - *(here->HICUMbaseBIXfPtr) += Ibiei_Vxf; - *(here->HICUMemitEIXfPtr) += -Ibiei_Vxf; - } - -// Stamp element: Ibpei - *(here->HICUMbaseBPBaseBPPtr) += Ibpei_Vbpei; - *(here->HICUMemitEIEmitEIPtr) += Ibpei_Vbpei; - *(here->HICUMbaseBPEmitEIPtr) += -Ibpei_Vbpei; - *(here->HICUMemitEIBaseBPPtr) += -Ibpei_Vbpei;; - -// Stamp element: Ibici - *(here->HICUMbaseBIBaseBIPtr) += Ibici_Vbici; - *(here->HICUMcollCICollCIPtr) += Ibici_Vbici; - *(here->HICUMcollCIBaseBIPtr) += -Ibici_Vbici; - *(here->HICUMbaseBICollCIPtr) += -Ibici_Vbici; - *(here->HICUMbaseBIBaseBIPtr) += Ibici_Vbiei; - *(here->HICUMcollCIEmitEIPtr) += Ibici_Vbiei; - *(here->HICUMcollCIBaseBIPtr) += -Ibici_Vbiei; - *(here->HICUMbaseBIEmitEIPtr) += -Ibici_Vbiei; - -// Stamp element: Iciei - *(here->HICUMcollCIBaseBIPtr) += Iciei_Vbiei; - *(here->HICUMemitEIEmitEIPtr) += Iciei_Vbiei; - *(here->HICUMcollCIEmitEIPtr) += -Iciei_Vbiei; - *(here->HICUMemitEIBaseBIPtr) += -Iciei_Vbiei; - *(here->HICUMcollCIBaseBIPtr) += Iciei_Vbici; - *(here->HICUMemitEICollCIPtr) += Iciei_Vbici; - *(here->HICUMcollCICollCIPtr) += -Iciei_Vbici; - *(here->HICUMemitEIBaseBIPtr) += -Iciei_Vbici; - if (model->HICUMnqs) { - *(here->HICUMcollCIXf2Ptr) += Iciei_Vxf2; - *(here->HICUMemitEIXf2Ptr) += -Iciei_Vxf2; - } - - -// Stamp element: Ibpci - *(here->HICUMbaseBPBaseBPPtr) += Ibpci_Vbpci; - *(here->HICUMcollCICollCIPtr) += Ibpci_Vbpci; - *(here->HICUMbaseBPCollCIPtr) += -Ibpci_Vbpci; - *(here->HICUMcollCIBaseBPPtr) += -Ibpci_Vbpci; - -// Stamp element: Rcx - *(here->HICUMcollCollPtr) += Icic_Vcic; - *(here->HICUMcollCICollCIPtr) += Icic_Vcic; - *(here->HICUMcollCICollPtr) += -Icic_Vcic; - *(here->HICUMcollCollCIPtr) += -Icic_Vcic; - -// Stamp element: Rbx - *(here->HICUMbaseBasePtr) += Ibbp_Vbbp; - *(here->HICUMbaseBPBaseBPPtr) += Ibbp_Vbbp; - *(here->HICUMbaseBPBasePtr) += -Ibbp_Vbbp; - *(here->HICUMbaseBaseBPPtr) += -Ibbp_Vbbp; - -// Stamp element: Re - *(here->HICUMemitEmitPtr) += Ieie_Veie; - *(here->HICUMemitEIEmitEIPtr) += Ieie_Veie; - *(here->HICUMemitEIEmitPtr) += -Ieie_Veie; - *(here->HICUMemitEmitEIPtr) += -Ieie_Veie; - -// Stamp element: Ibpbi - if (here->HICUMrbi>0.0) { - *(here->HICUMbaseBPBaseBPPtr) += Ibpbi_Vbpbi; - *(here->HICUMbaseBIBaseBIPtr) += Ibpbi_Vbpbi; - *(here->HICUMbaseBPBaseBIPtr) += -Ibpbi_Vbpbi; - *(here->HICUMbaseBIBaseBPPtr) += -Ibpbi_Vbpbi; - *(here->HICUMbaseBPBaseBIPtr) += Ibpbi_Vbiei; - *(here->HICUMbaseBIEmitEIPtr) += Ibpbi_Vbiei; - *(here->HICUMbaseBPEmitEIPtr) += -Ibpbi_Vbiei; - *(here->HICUMbaseBIBaseBIPtr) += -Ibpbi_Vbiei; - *(here->HICUMbaseBPBaseBIPtr) += Ibpbi_Vbici; - *(here->HICUMbaseBICollCIPtr) += Ibpbi_Vbici; - *(here->HICUMbaseBPCollCIPtr) += -Ibpbi_Vbici; - *(here->HICUMbaseBIBaseBIPtr) += -Ibpbi_Vbici; - }; - -// Stamp element: Isici - *(here->HICUMsubsSISubsSIPtr) += Isici_Vsici; - *(here->HICUMcollCICollCIPtr) += Isici_Vsici; - *(here->HICUMsubsSICollCIPtr) += -Isici_Vsici; - *(here->HICUMcollCISubsSIPtr) += -Isici_Vsici;; - -// Stamp element: Ibpsi - *(here->HICUMbaseBPSubsSIPtr) += Ibpsi_Vsici; - *(here->HICUMsubsSICollCIPtr) += Ibpsi_Vsici; - *(here->HICUMbaseBPCollCIPtr) += -Ibpsi_Vsici; - *(here->HICUMsubsSISubsSIPtr) += -Ibpsi_Vsici; - *(here->HICUMbaseBPBaseBPPtr) += Ibpsi_Vbpci; - *(here->HICUMsubsSICollCIPtr) += Ibpsi_Vbpci; - *(here->HICUMbaseBPCollCIPtr) += -Ibpsi_Vbpci; - *(here->HICUMsubsSIBaseBPPtr) += -Ibpsi_Vbpci;; - -// Stamp element: Rsu - *(here->HICUMsubsSubsPtr) += Isis_Vsis; - *(here->HICUMsubsSISubsSIPtr) += Isis_Vsis; - *(here->HICUMsubsSISubsPtr) += -Isis_Vsis; - *(here->HICUMsubsSubsSIPtr) += -Isis_Vsis; - - if (model->HICUMnqs) { - //Ixf1 - *(here->HICUMxf1BaseBIPtr) += +Ixf1_Vbiei; - *(here->HICUMxf1EmitEIPtr) += -Ixf1_Vbiei; - *(here->HICUMxf1BaseBIPtr) += +Ixf1_Vbici; - *(here->HICUMxf1CollCIPtr) += -Ixf1_Vbici; - *(here->HICUMxf1Xf2Ptr) += +Ixf1_Vxf2; - *(here->HICUMxf1Xf1Ptr) += +Ixf1_Vxf1; - //Ixf2 - *(here->HICUMxf2BaseBIPtr) += +Ixf2_Vbiei; - *(here->HICUMxf2EmitEIPtr) += -Ixf2_Vbiei; - *(here->HICUMxf2BaseBIPtr) += +Ixf2_Vbici; - *(here->HICUMxf2CollCIPtr) += -Ixf2_Vbici; - *(here->HICUMxf2Xf2Ptr) += +Ixf2_Vxf2; - *(here->HICUMxf2Xf1Ptr) += +Ixf2_Vxf1; - //Ixf - *(here->HICUMxfBaseBIPtr) += +Ixf_Vbiei; - *(here->HICUMxfEmitEIPtr) += -Ixf_Vbiei; - *(here->HICUMxfBaseBIPtr) += +Ixf_Vbici; - *(here->HICUMxfCollCIPtr) += -Ixf_Vbici; - *(here->HICUMxfXfPtr) += +Ixf_Vxf; - } - -//////////////////////////////////// -////////// The complex part ////// -//////////////////////////////////// - - //Qrbi - XQrbi_Vbpbi = *(ckt->CKTstate0 + here->HICUMcqrbi); - XQrbi_Vbiei = here->HICUMqrbi_Vbiei; - XQrbi_Vbici = here->HICUMqrbi_Vbici; - XQrbi_Vrth = here->HICUMqrbi_Vrth; - //Qjei - XQjei_Vbiei = *(ckt->CKTstate0 + here->HICUMcqjei); - XQjei_Vrth = here->HICUMqjei_Vrth; - //Qf - XQf_Vbiei = *(ckt->CKTstate0 + here->HICUMcqf); - XQf_Vbici = here->HICUMqf_Vbici; - XQf_Vrth = here->HICUMqf_Vrth; - XQf_Vxf = here->HICUMqf_Vxf; - //Qr - XQr_Vbici = *(ckt->CKTstate0 + here->HICUMcqr); - XQr_Vbiei = here->HICUMqr_Vbiei; - XQr_Vrth = here->HICUMqr_Vrth; - //Qjci - XQjci_Vbici = *(ckt->CKTstate0 + here->HICUMcqjci); - XQjci_Vrth = here->HICUMqjci_Vrth; - //Qjep - XQjep_Vbpei = *(ckt->CKTstate0 + here->HICUMcqjep); - XQjep_Vrth = here->HICUMqjep_Vrth; - //Qjcx_i - Xqjcx0_t_i_Vbci = *(ckt->CKTstate0 + here->HICUMcqcx0_t_i); - Xqjcx0_t_i_Vrth = here->HICUMqjcx0_i_Vrth; - //Qjcx_ii - Xqjcx0_t_ii_Vbpci = *(ckt->CKTstate0 + here->HICUMcqcx0_t_ii); - Xqjcx0_t_ii_Vrth = here->HICUMqjcx0_ii_Vrth; - //Qdsu - XQdsu_Vbpci = *(ckt->CKTstate0 + here->HICUMcqdsu); - XQdsu_Vsici = here->HICUMqdsu_Vsici; - XQdsu_Vrth = here->HICUMqdsu_Vrth; - //Qjs - XQjs_Vsici = *(ckt->CKTstate0 + here->HICUMcqjs); - XQjs_Vrth = here->HICUMqjs_Vrth; - //Qscp - XQscp_Vsc = *(ckt->CKTstate0 + here->HICUMcqscp); - XQscp_Vrth = here->HICUMqscp_Vrth; - //Qbepar1 - XQbepar1_Vbe = *(ckt->CKTstate0 + here->HICUMcqbepar1); - //Qbepar2 - XQbepar2_Vbpe = *(ckt->CKTstate0 + here->HICUMcqbepar2); - //Qbcpar1 - XQbcpar1_Vbci = *(ckt->CKTstate0 + here->HICUMcqbcpar1); - //Qbcpar2 - XQbcpar2_Vbpci = *(ckt->CKTstate0 + here->HICUMcqbcpar2); - //Qsu - XQsu_Vsis = *(ckt->CKTstate0 + here->HICUMcqsu); - //Qcth - XQcth_Vrth = *(ckt->CKTstate0 + here->HICUMcqcth); - //Qxf - XQxf_Vxf = *(ckt->CKTstate0 + here->HICUMcqxf); - XQxf1_Vxf1 = *(ckt->CKTstate0 + here->HICUMcqxf1); - XQxf2_Vxf2 = *(ckt->CKTstate0 + here->HICUMcqxf2); - - //Qrbi f_bp=+ f_bi=- - if (here->HICUMrbi>0.0) { - *(here->HICUMbaseBPBaseBPPtr + 1) += XQrbi_Vbpbi*(s->imag); - *(here->HICUMbaseBPBaseBPPtr ) += XQrbi_Vbpbi*(s->real); - *(here->HICUMbaseBIBaseBIPtr + 1) += XQrbi_Vbpbi*(s->imag); - *(here->HICUMbaseBIBaseBIPtr ) += XQrbi_Vbpbi*(s->real); - *(here->HICUMbaseBPBaseBIPtr + 1) += -XQrbi_Vbpbi*(s->imag); - *(here->HICUMbaseBPBaseBIPtr ) += -XQrbi_Vbpbi*(s->real); - *(here->HICUMbaseBIBaseBPPtr + 1) += -XQrbi_Vbpbi*(s->imag); - *(here->HICUMbaseBIBaseBPPtr ) += -XQrbi_Vbpbi*(s->real); - *(here->HICUMbaseBPBaseBIPtr + 1) += XQrbi_Vbiei*(s->imag); - *(here->HICUMbaseBPBaseBIPtr ) += XQrbi_Vbiei*(s->real); - *(here->HICUMbaseBIEmitEIPtr + 1) += XQrbi_Vbiei*(s->imag); - *(here->HICUMbaseBIEmitEIPtr ) += XQrbi_Vbiei*(s->real); - *(here->HICUMbaseBPEmitEIPtr + 1) += -XQrbi_Vbiei*(s->imag); - *(here->HICUMbaseBPEmitEIPtr ) += -XQrbi_Vbiei*(s->real); - *(here->HICUMbaseBIBaseBIPtr + 1) += -XQrbi_Vbiei*(s->imag); - *(here->HICUMbaseBIBaseBIPtr ) += -XQrbi_Vbiei*(s->real); - *(here->HICUMbaseBPBaseBIPtr + 1) += XQrbi_Vbici*(s->imag); - *(here->HICUMbaseBPBaseBIPtr ) += XQrbi_Vbici*(s->real); - *(here->HICUMbaseBICollCIPtr + 1) += XQrbi_Vbici*(s->imag); - *(here->HICUMbaseBICollCIPtr ) += XQrbi_Vbici*(s->real); - *(here->HICUMbaseBPCollCIPtr + 1) += -XQrbi_Vbici*(s->imag); - *(here->HICUMbaseBPCollCIPtr ) += -XQrbi_Vbici*(s->real); - *(here->HICUMbaseBIBaseBIPtr + 1) += -XQrbi_Vbici*(s->imag); - *(here->HICUMbaseBIBaseBIPtr ) += -XQrbi_Vbici*(s->real); - }; - //Qjei - *(here->HICUMbaseBIBaseBIPtr + 1) += XQjei_Vbiei*(s->imag); - *(here->HICUMbaseBIBaseBIPtr ) += XQjei_Vbiei*(s->real); - *(here->HICUMemitEIEmitEIPtr + 1) += XQjei_Vbiei*(s->imag); - *(here->HICUMemitEIEmitEIPtr ) += XQjei_Vbiei*(s->real); - *(here->HICUMbaseBIEmitEIPtr + 1) += -XQjei_Vbiei*(s->imag); - *(here->HICUMbaseBIEmitEIPtr ) += -XQjei_Vbiei*(s->real); - *(here->HICUMemitEIBaseBIPtr + 1) += -XQjei_Vbiei*(s->imag); - *(here->HICUMemitEIBaseBIPtr ) += -XQjei_Vbiei*(s->real); - //Qf f_Bi=+ f_Ei =- - *(here->HICUMbaseBIBaseBIPtr +1) += XQf_Vbiei*(s->imag); - *(here->HICUMbaseBIBaseBIPtr) += XQf_Vbiei*(s->real); - *(here->HICUMemitEIEmitEIPtr +1) += XQf_Vbiei*(s->imag); - *(here->HICUMemitEIEmitEIPtr) += XQf_Vbiei*(s->real); - *(here->HICUMbaseBIEmitEIPtr +1) += -XQf_Vbiei*(s->imag); - *(here->HICUMbaseBIEmitEIPtr) += -XQf_Vbiei*(s->real); - *(here->HICUMemitEIBaseBIPtr +1) += -XQf_Vbiei*(s->imag); - *(here->HICUMemitEIBaseBIPtr) += -XQf_Vbiei*(s->real); - *(here->HICUMbaseBIBaseBIPtr +1) += XQf_Vbici*(s->imag); - *(here->HICUMbaseBIBaseBIPtr) += XQf_Vbici*(s->real); - *(here->HICUMemitEICollCIPtr +1) += XQf_Vbici*(s->imag); - *(here->HICUMemitEICollCIPtr) += XQf_Vbici*(s->real); - *(here->HICUMbaseBICollCIPtr +1) += -XQf_Vbici*(s->imag); - *(here->HICUMbaseBICollCIPtr) += -XQf_Vbici*(s->real); - *(here->HICUMemitEIBaseBIPtr +1) += -XQf_Vbici*(s->imag); - *(here->HICUMemitEIBaseBIPtr) += -XQf_Vbici*(s->real); - if (model->HICUMnqs) { - *(here->HICUMbaseBIXfPtr +1) += XQf_Vxf*(s->imag); - *(here->HICUMbaseBIXfPtr ) += XQf_Vxf*(s->real); - *(here->HICUMemitEIXfPtr +1) += -XQf_Vxf*(s->imag); - *(here->HICUMemitEIXfPtr ) += -XQf_Vxf*(s->real); - } - //Qjci - *(here->HICUMbaseBIBaseBIPtr +1) += XQjci_Vbici*(s->imag); - *(here->HICUMbaseBIBaseBIPtr) += XQjci_Vbici*(s->real); - *(here->HICUMcollCICollCIPtr +1) += XQjci_Vbici*(s->imag); - *(here->HICUMcollCICollCIPtr) += XQjci_Vbici*(s->real); - *(here->HICUMcollCIBaseBIPtr +1) += -XQjci_Vbici*(s->imag); - *(here->HICUMcollCIBaseBIPtr) += -XQjci_Vbici*(s->real); - *(here->HICUMbaseBICollCIPtr +1) += -XQjci_Vbici*(s->imag); - *(here->HICUMbaseBICollCIPtr) += -XQjci_Vbici*(s->real); - //Qr f_bi = + f_ci=- - *(here->HICUMbaseBIBaseBIPtr +1) += XQr_Vbici*(s->imag); - *(here->HICUMbaseBIBaseBIPtr) += XQr_Vbici*(s->real); - *(here->HICUMcollCICollCIPtr +1) += XQr_Vbici*(s->imag); - *(here->HICUMcollCICollCIPtr) += XQr_Vbici*(s->real); - *(here->HICUMcollCIBaseBIPtr +1) += -XQr_Vbici*(s->imag); - *(here->HICUMcollCIBaseBIPtr) += -XQr_Vbici*(s->real); - *(here->HICUMbaseBICollCIPtr +1) += -XQr_Vbici*(s->imag); - *(here->HICUMbaseBICollCIPtr) += -XQr_Vbici*(s->real); - *(here->HICUMbaseBIBaseBIPtr +1) += XQr_Vbiei*(s->imag); - *(here->HICUMbaseBIBaseBIPtr) += XQr_Vbiei*(s->real); - *(here->HICUMcollCIEmitEIPtr +1) += XQr_Vbiei*(s->imag); - *(here->HICUMcollCIEmitEIPtr) += XQr_Vbiei*(s->real); - *(here->HICUMcollCIBaseBIPtr +1) += -XQr_Vbiei*(s->imag); - *(here->HICUMcollCIBaseBIPtr) += -XQr_Vbiei*(s->real); - *(here->HICUMbaseBIEmitEIPtr +1) += -XQr_Vbiei*(s->imag); - *(here->HICUMbaseBIEmitEIPtr) += -XQr_Vbiei*(s->real); - //Qjep - *(here->HICUMbaseBPBaseBPPtr +1) += XQjep_Vbpei*(s->imag); - *(here->HICUMbaseBPBaseBPPtr) += XQjep_Vbpei*(s->real); - *(here->HICUMemitEIEmitEIPtr +1) += XQjep_Vbpei*(s->imag); - *(here->HICUMemitEIEmitEIPtr) += XQjep_Vbpei*(s->real); - *(here->HICUMbaseBPEmitEIPtr +1) += -XQjep_Vbpei*(s->imag); - *(here->HICUMbaseBPEmitEIPtr) += -XQjep_Vbpei*(s->real); - *(here->HICUMemitEIBaseBPPtr +1) += -XQjep_Vbpei*(s->imag); - *(here->HICUMemitEIBaseBPPtr) += -XQjep_Vbpei*(s->real); - //Qjcx_i - *(here->HICUMbaseBasePtr +1) += Xqjcx0_t_i_Vbci*(s->imag); - *(here->HICUMbaseBasePtr) += Xqjcx0_t_i_Vbci*(s->real); - *(here->HICUMcollCICollCIPtr +1) += Xqjcx0_t_i_Vbci*(s->imag); - *(here->HICUMcollCICollCIPtr) += Xqjcx0_t_i_Vbci*(s->real); - *(here->HICUMbaseCollCIPtr +1) += -Xqjcx0_t_i_Vbci*(s->imag); - *(here->HICUMbaseCollCIPtr) += -Xqjcx0_t_i_Vbci*(s->real); - *(here->HICUMcollCIBasePtr +1) += -Xqjcx0_t_i_Vbci*(s->imag); - *(here->HICUMcollCIBasePtr) += -Xqjcx0_t_i_Vbci*(s->real); - //Qjcx_ii - *(here->HICUMbaseBPBaseBPPtr +1) += Xqjcx0_t_ii_Vbpci*(s->imag); - *(here->HICUMbaseBPBaseBPPtr) += Xqjcx0_t_ii_Vbpci*(s->real); - *(here->HICUMcollCICollCIPtr +1) += Xqjcx0_t_ii_Vbpci*(s->imag); - *(here->HICUMcollCICollCIPtr) += Xqjcx0_t_ii_Vbpci*(s->real); - *(here->HICUMbaseBPCollCIPtr +1) += -Xqjcx0_t_ii_Vbpci*(s->imag); - *(here->HICUMbaseBPCollCIPtr) += -Xqjcx0_t_ii_Vbpci*(s->real); - *(here->HICUMcollCIBaseBPPtr +1) += -Xqjcx0_t_ii_Vbpci*(s->imag); - *(here->HICUMcollCIBaseBPPtr) += -Xqjcx0_t_ii_Vbpci*(s->real); - //Qdsu f_bp=+ f_ci=- - *(here->HICUMbaseBPBaseBPPtr +1) += XQdsu_Vbpci*(s->imag); - *(here->HICUMbaseBPBaseBPPtr) += XQdsu_Vbpci*(s->real); - *(here->HICUMcollCICollCIPtr +1) += XQdsu_Vbpci*(s->imag); - *(here->HICUMcollCICollCIPtr) += XQdsu_Vbpci*(s->real); - *(here->HICUMbaseBPCollCIPtr +1) += -XQdsu_Vbpci*(s->imag); - *(here->HICUMbaseBPCollCIPtr) += -XQdsu_Vbpci*(s->real); - *(here->HICUMcollCIBaseBPPtr +1) += -XQdsu_Vbpci*(s->imag); - *(here->HICUMcollCIBaseBPPtr) += -XQdsu_Vbpci*(s->real); - *(here->HICUMbaseBPSubsSIPtr +1) += XQdsu_Vsici*(s->imag); - *(here->HICUMbaseBPSubsSIPtr) += XQdsu_Vsici*(s->real); - *(here->HICUMcollCICollCIPtr +1) += XQdsu_Vsici*(s->imag); - *(here->HICUMcollCICollCIPtr) += XQdsu_Vsici*(s->real); - *(here->HICUMbaseBPCollCIPtr +1) += -XQdsu_Vsici*(s->imag); - *(here->HICUMbaseBPCollCIPtr) += -XQdsu_Vsici*(s->real); - *(here->HICUMcollCISubsSIPtr +1) += -XQdsu_Vsici*(s->imag); - *(here->HICUMcollCISubsSIPtr) += -XQdsu_Vsici*(s->real); - //Qjs - *(here->HICUMsubsSISubsSIPtr +1) += XQjs_Vsici*(s->imag); - *(here->HICUMsubsSISubsSIPtr) += XQjs_Vsici*(s->real); - *(here->HICUMcollCICollCIPtr +1) += XQjs_Vsici*(s->imag); - *(here->HICUMcollCICollCIPtr) += XQjs_Vsici*(s->real); - *(here->HICUMsubsSICollCIPtr +1) += -XQjs_Vsici*(s->imag); - *(here->HICUMsubsSICollCIPtr) += -XQjs_Vsici*(s->real); - *(here->HICUMcollCISubsSIPtr +1) += -XQjs_Vsici*(s->imag); - *(here->HICUMcollCISubsSIPtr) += -XQjs_Vsici*(s->real); - //Qscp - *(here->HICUMsubsSubsPtr + 1) += XQscp_Vsc*(s->imag); - *(here->HICUMsubsSubsPtr ) += XQscp_Vsc*(s->real); - *(here->HICUMcollCollPtr + 1) += XQscp_Vsc*(s->imag); - *(here->HICUMcollCollPtr ) += XQscp_Vsc*(s->real); - *(here->HICUMcollSubsPtr + 1) += -XQscp_Vsc*(s->imag); - *(here->HICUMcollSubsPtr ) += -XQscp_Vsc*(s->real); - *(here->HICUMsubsCollPtr + 1) += -XQscp_Vsc*(s->imag); - *(here->HICUMsubsCollPtr ) += -XQscp_Vsc*(s->real); - //Qbepar1 - *(here->HICUMbaseBasePtr + 1) += XQbepar1_Vbe*(s->imag); - *(here->HICUMbaseBasePtr ) += XQbepar1_Vbe*(s->real); - *(here->HICUMemitEmitPtr + 1) += XQbepar1_Vbe*(s->imag); - *(here->HICUMemitEmitPtr ) += XQbepar1_Vbe*(s->real); - *(here->HICUMbaseEmitPtr + 1) += -XQbepar1_Vbe*(s->imag); - *(here->HICUMbaseEmitPtr ) += -XQbepar1_Vbe*(s->real); - *(here->HICUMemitBasePtr + 1) += -XQbepar1_Vbe*(s->imag); - *(here->HICUMemitBasePtr ) += -XQbepar1_Vbe*(s->real); - //Qbepar2 - *(here->HICUMbaseBPBaseBPPtr + 1) += XQbepar2_Vbpe*(s->imag); - *(here->HICUMbaseBPBaseBPPtr ) += XQbepar2_Vbpe*(s->real); - *(here->HICUMemitEmitPtr + 1) += XQbepar2_Vbpe*(s->imag); - *(here->HICUMemitEmitPtr ) += XQbepar2_Vbpe*(s->real); - *(here->HICUMemitBaseBPPtr + 1) += -XQbepar2_Vbpe*(s->imag); - *(here->HICUMemitBaseBPPtr ) += -XQbepar2_Vbpe*(s->real); - *(here->HICUMbaseBPEmitPtr + 1) += -XQbepar2_Vbpe*(s->imag); - *(here->HICUMbaseBPEmitPtr ) += -XQbepar2_Vbpe*(s->real); - //Qbcpar1 - *(here->HICUMbaseBasePtr + 1) += XQbcpar1_Vbci*(s->imag); - *(here->HICUMbaseBasePtr ) += XQbcpar1_Vbci*(s->real); - *(here->HICUMcollCICollCIPtr + 1) += XQbcpar1_Vbci*(s->imag); - *(here->HICUMcollCICollCIPtr ) += XQbcpar1_Vbci*(s->real); - *(here->HICUMbaseCollCIPtr + 1) += -XQbcpar1_Vbci*(s->imag); - *(here->HICUMbaseCollCIPtr ) += -XQbcpar1_Vbci*(s->real); - *(here->HICUMcollCIBasePtr + 1) += -XQbcpar1_Vbci*(s->imag); - *(here->HICUMcollCIBasePtr ) += -XQbcpar1_Vbci*(s->real); - //Qbcpar2 - *(here->HICUMbaseBPBaseBPPtr +1) += XQbcpar2_Vbpci*(s->imag); - *(here->HICUMbaseBPBaseBPPtr) += XQbcpar2_Vbpci*(s->real); - *(here->HICUMcollCICollCIPtr +1) += XQbcpar2_Vbpci*(s->imag); - *(here->HICUMcollCICollCIPtr) += XQbcpar2_Vbpci*(s->real); - *(here->HICUMbaseBPCollCIPtr +1) += -XQbcpar2_Vbpci*(s->imag); - *(here->HICUMbaseBPCollCIPtr) += -XQbcpar2_Vbpci*(s->real); - *(here->HICUMcollCIBaseBPPtr +1) += -XQbcpar2_Vbpci*(s->imag); - *(here->HICUMcollCIBaseBPPtr) += -XQbcpar2_Vbpci*(s->real); - //Qsu - *(here->HICUMsubsSubsPtr + 1) += XQsu_Vsis*(s->imag); - *(here->HICUMsubsSubsPtr ) += XQsu_Vsis*(s->real); - *(here->HICUMsubsSISubsSIPtr + 1) += XQsu_Vsis*(s->imag); - *(here->HICUMsubsSISubsSIPtr ) += XQsu_Vsis*(s->real); - *(here->HICUMsubsSISubsPtr + 1) += -XQsu_Vsis*(s->imag); - *(here->HICUMsubsSISubsPtr ) += -XQsu_Vsis*(s->real); - *(here->HICUMsubsSubsSIPtr + 1) += -XQsu_Vsis*(s->imag); - *(here->HICUMsubsSubsSIPtr ) += -XQsu_Vsis*(s->real); - if (model->HICUMnqs) { - //Qxf1 - *(here->HICUMxf1Xf1Ptr + 1) += +XQxf1_Vxf1*(s->imag); - *(here->HICUMxf1Xf1Ptr) += +XQxf1_Vxf1*(s->real); - //Qxf2 - *(here->HICUMxf2Xf2Ptr + 1) += +XQxf2_Vxf2*(s->imag); - *(here->HICUMxf2Xf2Ptr ) += +XQxf2_Vxf2*(s->real); - //Qxf - *(here->HICUMxfXfPtr + 1) += +XQxf_Vxf*(s->imag); - *(here->HICUMxfXfPtr ) += +XQxf_Vxf*(s->real); - } - - // Stamps with SH - if (model->HICUMselfheat) { -// Stamp element: Ibiei f_Bi = + f_Ei = - - *(here->HICUMbaseBItempPtr) += Ibiei_Vrth; - *(here->HICUMemitEItempPtr) += -Ibiei_Vrth; -// Stamp element: Ibpei f_Bp = + f_Ei = - - // with respect to Potential Vrth - *(here->HICUMbaseBPtempPtr) += Ibpei_Vrth; - *(here->HICUMemitEItempPtr) += -Ibpei_Vrth; -// Stamp element: Ibici f_Bi = + f_Ci = - - *(here->HICUMbaseBItempPtr) += Ibici_Vrth; - *(here->HICUMcollCItempPtr) += -Ibici_Vrth; -// Stamp element: Iciei f_Ci = + f_Ei = - - *(here->HICUMcollCItempPtr) += Iciei_Vrth; - *(here->HICUMemitEItempPtr) += -Iciei_Vrth; -// Stamp element: Ibpci f_Bp = + f_Ci = - - *(here->HICUMbaseBPtempPtr) += Ibpci_Vrth; - *(here->HICUMcollCItempPtr) += -Ibpci_Vrth; -// Stamp element: Rcx f_Ci = + f_C = - - *(here->HICUMcollCItempPtr) += Icic_Vrth; - *(here->HICUMcollTempPtr) += -Icic_Vrth; -// Stamp element: Rbx f_B = + f_Bp = - - *(here->HICUMbaseTempPtr) += Ibbp_Vrth; - *(here->HICUMbaseBPtempPtr) += -Ibbp_Vrth; -// Stamp element: Re f_Ei = + f_E = - - *(here->HICUMemitEItempPtr) += Ieie_Vrth; - *(here->HICUMemitTempPtr) += -Ieie_Vrth; - if (here->HICUMrbi>0.0) { -// Stamp element: Rbi f_Bp = + f_Bi = - - *(here->HICUMbaseBPtempPtr) += Ibpbi_Vrth; - *(here->HICUMbaseBItempPtr) += -Ibpbi_Vrth; - }; -// Stamp element: Isici f_Si = + f_Ci = - - *(here->HICUMsubsSItempPtr) += Isici_Vrth; - *(here->HICUMcollCItempPtr) += -Isici_Vrth; -// Branch: bpsi, Stamp element: Its - *(here->HICUMbaseBPtempPtr) += Ibpsi_Vrth; - *(here->HICUMsubsSItempPtr) += -Ibpsi_Vrth; - if (model->HICUMnqs) { - // Stamp element: Ixf f_xf = + - *(here->HICUMxfTempPtr) += Ixf_Vrth; - // Stamp element: Ixf1 f_xf1 = + - *(here->HICUMxf1TempPtr) += Ixf1_Vrth; - // Stamp element: Ixf2 f_xf2 = + - *(here->HICUMxf2TempPtr) += Ixf2_Vrth; - } - -// Stamp element: Rth f_T = + - *(here->HICUMtempTempPtr) += Irth_Vrth; - -// Stamp element: Ith f_T = - Ith - // with respect to Potential Vrth - *(here->HICUMtempTempPtr) += -Ith_Vrth; - // with respect to Potential Vbiei - *(here->HICUMtempBaseBIPtr) += -Ith_Vbiei; - *(here->HICUMtempEmitEIPtr) += +Ith_Vbiei; - // with respect to Potential Vbici - *(here->HICUMtempBaseBIPtr) += -Ith_Vbici; - *(here->HICUMtempCollCIPtr) += +Ith_Vbici; - // with respect to Potential Vciei - *(here->HICUMtempCollCIPtr) += -Ith_Vciei; - *(here->HICUMtempEmitEIPtr) += +Ith_Vciei; - // with respect to Potential Vbpei - *(here->HICUMtempBaseBPPtr) += -Ith_Vbpei; - *(here->HICUMtempEmitEIPtr) += +Ith_Vbpei; - // with respect to Potential Vbpci - *(here->HICUMtempBaseBPPtr) += -Ith_Vbpci; - *(here->HICUMtempCollCIPtr) += +Ith_Vbpci; - // with respect to Potential Vsici - *(here->HICUMtempSubsSIPtr) += -Ith_Vsici; - *(here->HICUMtempCollCIPtr) += +Ith_Vsici; - // with respect to Potential Vbpbi - *(here->HICUMtempBaseBPPtr) += -Ith_Vbpbi; - *(here->HICUMtempBaseBIPtr) += +Ith_Vbpbi; - // with respect to Potential Vcic - *(here->HICUMtempCollCIPtr) += -Ith_Vcic; - *(here->HICUMtempCollPtr) += +Ith_Vcic; - // with respect to Potential Vbbp - *(here->HICUMtempBasePtr) += -Ith_Vbbp; - *(here->HICUMtempBaseBPPtr) += +Ith_Vbbp; - // with respect to Potential Veie - *(here->HICUMtempEmitEIPtr) += -Ith_Veie; - *(here->HICUMtempEmitPtr) += +Ith_Veie; - - //the charges - *(here->HICUMbaseBItempPtr + 1) += +XQrbi_Vrth*(s->imag); - *(here->HICUMbaseBItempPtr ) += +XQrbi_Vrth*(s->real); - *(here->HICUMbaseBPtempPtr + 1) += -XQrbi_Vrth*(s->imag); - *(here->HICUMbaseBPtempPtr ) += -XQrbi_Vrth*(s->real); - *(here->HICUMbaseBItempPtr + 1) += +XQjei_Vrth*(s->imag); - *(here->HICUMbaseBItempPtr ) += +XQjei_Vrth*(s->real); - *(here->HICUMemitEItempPtr + 1) += -XQjei_Vrth*(s->imag); - *(here->HICUMemitEItempPtr ) += -XQjei_Vrth*(s->real); - *(here->HICUMbaseBItempPtr + 1) += +XQf_Vrth*(s->imag); - *(here->HICUMbaseBItempPtr ) += +XQf_Vrth*(s->real); - *(here->HICUMemitEItempPtr + 1) += -XQf_Vrth*(s->imag); - *(here->HICUMemitEItempPtr ) += -XQf_Vrth*(s->real); - *(here->HICUMbaseBItempPtr + 1) += +XQr_Vrth*(s->imag); - *(here->HICUMbaseBItempPtr ) += +XQr_Vrth*(s->real); - *(here->HICUMcollCItempPtr + 1) += -XQr_Vrth*(s->imag); - *(here->HICUMcollCItempPtr ) += -XQr_Vrth*(s->real); - *(here->HICUMbaseBItempPtr + 1) += +XQjci_Vrth*(s->imag); - *(here->HICUMbaseBItempPtr ) += +XQjci_Vrth*(s->real); - *(here->HICUMcollCItempPtr + 1) += -XQjci_Vrth*(s->imag); - *(here->HICUMcollCItempPtr ) += -XQjci_Vrth*(s->real); - *(here->HICUMbaseBPtempPtr + 1) += +XQjep_Vrth*(s->imag); - *(here->HICUMbaseBPtempPtr ) += +XQjep_Vrth*(s->real); - *(here->HICUMemitEItempPtr + 1) += -XQjep_Vrth*(s->imag); - *(here->HICUMemitEItempPtr ) += -XQjep_Vrth*(s->real); - *(here->HICUMbaseTempPtr + 1) += +Xqjcx0_t_i_Vrth*(s->imag); - *(here->HICUMbaseTempPtr ) += +Xqjcx0_t_i_Vrth*(s->real); - *(here->HICUMcollCItempPtr + 1) += -Xqjcx0_t_i_Vrth*(s->imag); - *(here->HICUMcollCItempPtr ) += -Xqjcx0_t_i_Vrth*(s->real); - *(here->HICUMbaseBPtempPtr + 1) += +Xqjcx0_t_ii_Vrth*(s->imag); - *(here->HICUMbaseBPtempPtr ) += +Xqjcx0_t_ii_Vrth*(s->real); - *(here->HICUMcollCItempPtr + 1) += -Xqjcx0_t_ii_Vrth*(s->imag); - *(here->HICUMcollCItempPtr ) += -Xqjcx0_t_ii_Vrth*(s->real); - *(here->HICUMbaseBPtempPtr + 1) += +XQdsu_Vrth*(s->imag); - *(here->HICUMbaseBPtempPtr ) += +XQdsu_Vrth*(s->real); - *(here->HICUMcollCItempPtr + 1) += -XQdsu_Vrth*(s->imag); - *(here->HICUMcollCItempPtr ) += -XQdsu_Vrth*(s->real); - *(here->HICUMsubsSItempPtr + 1) += +XQjs_Vrth*(s->imag); - *(here->HICUMsubsSItempPtr ) += +XQjs_Vrth*(s->real); - *(here->HICUMcollCItempPtr + 1) += -XQjs_Vrth*(s->imag); - *(here->HICUMcollCItempPtr ) += -XQjs_Vrth*(s->real); - *(here->HICUMsubsTempPtr + 1) += +XQscp_Vrth*(s->imag); - *(here->HICUMsubsTempPtr ) += +XQscp_Vrth*(s->real); - *(here->HICUMcollTempPtr + 1) += -XQscp_Vrth*(s->imag); - *(here->HICUMcollTempPtr ) += -XQscp_Vrth*(s->real); - *(here->HICUMtempTempPtr + 1) += +XQcth_Vrth*(s->imag); - *(here->HICUMtempTempPtr ) += +XQcth_Vrth*(s->real); - - } - - } - } - return(OK); -} diff --git a/src/spicelib/devices/hicum2/hicum2setup.c b/src/spicelib/devices/hicum2/hicum2setup.c deleted file mode 100644 index 24c7ccd58..000000000 --- a/src/spicelib/devices/hicum2/hicum2setup.c +++ /dev/null @@ -1,868 +0,0 @@ -/********** -License : 3-clause BSD -Spice3 Implementation: 2019-2020 Dietmar Warning, Markus Müller, Mario Krattenmacher -Model Author : 1990 Michael Schröter TU Dresden -**********/ - -/* - * This routine should only be called when circuit topology - * changes, since its computations do not depend on most - * device or model parameters, only on topology (as - * affected by emitter, collector, and base resistances) - */ - -#include "ngspice/ngspice.h" -#include "ngspice/cktdefs.h" -#include "ngspice/smpdefs.h" -#include "hicum2defs.h" -#include "ngspice/const.h" -#include "ngspice/sperror.h" -#include "ngspice/ifsim.h" -#include "ngspice/suffix.h" - -int -HICUMsetup(SMPmatrix *matrix, GENmodel *inModel, CKTcircuit *ckt, int *states) - /* load the HICUM structure with those pointers needed later - * for fast matrix loading - */ -{ - HICUMmodel *model = (HICUMmodel*)inModel; - HICUMinstance *here; - int error; - CKTnode *tmp; - - /* loop through all the transistor models */ - for( ; model != NULL; model = HICUMnextModel(model)) { - -//Circuit simulator specific parameters - if(model->HICUMtype != NPN && model->HICUMtype != PNP) - model->HICUMtype = NPN; - - if(!model->HICUMtnomGiven) - model->HICUMtnom = ckt->CKTnomTemp; - - if (!model->HICUMversionGiven) - model->HICUMversion = copy("2.4.0"); - -//Transfer current - if(!model->HICUMc10Given) - model->HICUMc10 = 2e-30; - - if(!model->HICUMqp0Given) - model->HICUMqp0 = 2e-14; - - if(!model->HICUMichGiven) - model->HICUMich = 0.0; - - if(!model->HICUMhf0Given) - model->HICUMhf0 = 1.0; - - if(!model->HICUMhfeGiven) - model->HICUMhfe = 1.0; - - if(!model->HICUMhfcGiven) - model->HICUMhfc = 1.0; - - if(!model->HICUMhjeiGiven) - model->HICUMhjei = 1.0; - - if(!model->HICUMahjeiGiven) - model->HICUMahjei = 0.0; - - if(!model->HICUMrhjeiGiven) - model->HICUMrhjei = 1.0; - - if(!model->HICUMhjciGiven) - model->HICUMhjci = 1.0; - -//Base-Emitter diode; - if(!model->HICUMibeisGiven) - model->HICUMibeis = 1e-18; - - if(!model->HICUMmbeiGiven) - model->HICUMmbei = 1.0; - - if(!model->HICUMireisGiven) - model->HICUMireis = 0.0; - - if(!model->HICUMmreiGiven) - model->HICUMmrei = 2.0; - - if(!model->HICUMibepsGiven) - model->HICUMibeps = 0.0; - - if(!model->HICUMmbepGiven) - model->HICUMmbep = 1.0; - - if(!model->HICUMirepsGiven) - model->HICUMireps = 0.0; - - if(!model->HICUMmrepGiven) - model->HICUMmrep = 2.0; - - if(!model->HICUMmcfGiven) - model->HICUMmcf = 1.0; - -//Transit time for excess recombination current at b-c barrier - if(!model->HICUMtbhrecGiven) - model->HICUMtbhrec = 0.0; - -//Base-Collector diode currents - if(!model->HICUMibcisGiven) - model->HICUMibcis = 1e-16; - - if(!model->HICUMmbciGiven) - model->HICUMmbci = 1.0; - - if(!model->HICUMibcxsGiven) - model->HICUMibcxs = 0.0; - - if(!model->HICUMmbcxGiven) - model->HICUMmbcx = 1.0; - -//Base-Emitter tunneling current - if(!model->HICUMibetsGiven) - model->HICUMibets = 0.0; - - if(!model->HICUMabetGiven) - model->HICUMabet = 40.0; - - if(!model->HICUMtunodeGiven) - model->HICUMtunode = 1; - -//Base-Collector avalanche current - if(!model->HICUMfavlGiven) - model->HICUMfavl = 0.0; - - if(!model->HICUMqavlGiven) - model->HICUMqavl = 0.0; - - if(!model->HICUMkavlGiven) - model->HICUMkavl = 0.0; - - if(!model->HICUMalfavGiven) - model->HICUMalfav = 0.0; - - if(!model->HICUMalqavGiven) - model->HICUMalqav = 0.0; - - if(!model->HICUMalkavGiven) - model->HICUMalkav = 0.0; - -//Series resistances - if(!model->HICUMrbi0Given) - model->HICUMrbi0 = 0.0; - - if(!model->HICUMrbxGiven) - model->HICUMrbx = 0.0; - - if(!model->HICUMfgeoGiven) - model->HICUMfgeo = 0.6557; - - if(!model->HICUMfdqr0Given) - model->HICUMfdqr0 = 0.0; - - if(!model->HICUMfcrbiGiven) - model->HICUMfcrbi = 0.0; - - if(!model->HICUMfqiGiven) - model->HICUMfqi = 1.0; - - if(!model->HICUMreGiven) - model->HICUMre = 0.0; - - if(!model->HICUMrcxGiven) - model->HICUMrcx = 0.0; - -//Substrate transistor - if(!model->HICUMitssGiven) - model->HICUMitss = 0.0; - - if(!model->HICUMmsfGiven) - model->HICUMmsf = 1.0; - - if(!model->HICUMiscsGiven) - model->HICUMiscs = 0.0; - - if(!model->HICUMmscGiven) - model->HICUMmsc = 1.0; - - if(!model->HICUMtsfGiven) - model->HICUMtsf = 0.0; - -//Intra-device substrate coupling - if(!model->HICUMrsuGiven) - model->HICUMrsu = 0.0; - - if(!model->HICUMcsuGiven) - model->HICUMcsu = 0.0; - -//Depletion Capacitances - if(!model->HICUMcjei0Given) - model->HICUMcjei0 = 1.0e-20; - - if(!model->HICUMvdeiGiven) - model->HICUMvdei = 0.9; - - if(!model->HICUMzeiGiven) - model->HICUMzei = 0.5; - - if(!model->HICUMajeiGiven) - model->HICUMajei = 2.5; - - if(!model->HICUMcjep0Given) - model->HICUMcjep0 = 1.0e-20; - - if(!model->HICUMvdepGiven) - model->HICUMvdep = 0.9; - - if(!model->HICUMzepGiven) - model->HICUMzep = 0.5; - - if(!model->HICUMajepGiven) - model->HICUMajep = 2.5; - - if(!model->HICUMcjci0Given) - model->HICUMcjci0 = 1.0e-20; - - if(!model->HICUMvdciGiven) - model->HICUMvdci = 0.7; - - if(!model->HICUMzciGiven) - model->HICUMzci = 0.4; - - if(!model->HICUMvptciGiven) - model->HICUMvptci = 100.0; - - if(!model->HICUMcjcx0Given) - model->HICUMcjcx0 = 1.0e-20; - - if(!model->HICUMvdcxGiven) - model->HICUMvdcx = 0.7; - - if(!model->HICUMzcxGiven) - model->HICUMzcx = 0.4; - - if(!model->HICUMvptcxGiven) - model->HICUMvptcx = 100.0; - - if(!model->HICUMfbcparGiven) - model->HICUMfbcpar = 0.0; - - if(!model->HICUMfbeparGiven) - model->HICUMfbepar = 1.0; - - if(!model->HICUMcjs0Given) - model->HICUMcjs0 = 0.0; - - if(!model->HICUMvdsGiven) - model->HICUMvds = 0.6; - - if(!model->HICUMzsGiven) - model->HICUMzs = 0.5; - - if(!model->HICUMvptsGiven) - model->HICUMvpts = 100.0; - - if(!model->HICUMcscp0Given) - model->HICUMcscp0 = 0.0; - - if(!model->HICUMvdspGiven) - model->HICUMvdsp = 0.6; - - if(!model->HICUMzspGiven) - model->HICUMzsp = 0.5; - - if(!model->HICUMvptspGiven) - model->HICUMvptsp = 100.0; - -//Diffusion Capacitances - if(!model->HICUMt0Given) - model->HICUMt0 = 0.0; - - if(!model->HICUMdt0hGiven) - model->HICUMdt0h = 0.0; - - if(!model->HICUMtbvlGiven) - model->HICUMtbvl = 0.0; - - if(!model->HICUMtef0Given) - model->HICUMtef0 = 0.0; - - if(!model->HICUMgtfeGiven) - model->HICUMgtfe = 1.0; - - if(!model->HICUMthcsGiven) - model->HICUMthcs = 0.0; - - if(!model->HICUMahcGiven) - model->HICUMahc = 0.1; - - if(!model->HICUMfthcGiven) - model->HICUMfthc = 0.0; - - if(!model->HICUMrci0Given) - model->HICUMrci0 = 150; - - if(!model->HICUMvlimGiven) - model->HICUMvlim = 0.5; - - if(!model->HICUMvcesGiven) - model->HICUMvces = 0.1; - - if(!model->HICUMvptGiven) - model->HICUMvpt = 100.0; - - if(!model->HICUMaickGiven) - model->HICUMaick = 1.0e-03; - - if(!model->HICUMdelckGiven) - model->HICUMdelck = 2.0; - - if(!model->HICUMtrGiven) - model->HICUMtr = 0.0; - - if(!model->HICUMvcbarGiven) - model->HICUMvcbar = 0.0; - - if(!model->HICUMicbarGiven) - model->HICUMicbar = 0.0; - - if(!model->HICUMacbarGiven) - model->HICUMacbar = 0.01; - -//Isolation Capacitances - if(!model->HICUMcbeparGiven) - model->HICUMcbepar = 0.0; - - if(!model->HICUMcbcparGiven) - model->HICUMcbcpar = 0.0; - -//Non-quasi-static Effect - if(!model->HICUMalqfGiven) - model->HICUMalqf = 0.167; - - if(!model->HICUMalitGiven) - model->HICUMalit = 0.333; - - if(!model->HICUMflnqsGiven) - model->HICUMflnqs = 0; - -//Noise - if(!model->HICUMkfGiven) - model->HICUMkf = 0.0; - - if(!model->HICUMafGiven) - model->HICUMaf = 2.0; - - if(!model->HICUMcfbeGiven) - model->HICUMcfbe = -1; - - if(!model->HICUMflconoGiven) - model->HICUMflcono = 0; - - if(!model->HICUMkfreGiven) - model->HICUMkfre = 0.0; - - if(!model->HICUMafreGiven) - model->HICUMafre = 2.0; - -//Lateral Geometry Scaling (at high current densities) - if(!model->HICUMlatbGiven) - model->HICUMlatb = 0.0; - - if(!model->HICUMlatlGiven) - model->HICUMlatl = 0.0; - -//Temperature dependence - if(!model->HICUMvgbGiven) - model->HICUMvgb = 1.17; - - if(!model->HICUMalt0Given) - model->HICUMalt0 = 0.0; - - if(!model->HICUMkt0Given) - model->HICUMkt0 = 0.0; - - if(!model->HICUMzetaciGiven) - model->HICUMzetaci = 0.0; - - if(!model->HICUMalvsGiven) - model->HICUMalvs = 0.0; - - if(!model->HICUMalcesGiven) - model->HICUMalces = 0.0; - - if(!model->HICUMzetarbiGiven) - model->HICUMzetarbi = 0.0; - - if(!model->HICUMzetarbxGiven) - model->HICUMzetarbx = 0.0; - - if(!model->HICUMzetarcxGiven) - model->HICUMzetarcx = 0.0; - - if(!model->HICUMzetareGiven) - model->HICUMzetare = 0.0; - - if(!model->HICUMzetacxGiven) - model->HICUMzetacx = 1.0; - - if(!model->HICUMvgeGiven) - model->HICUMvge = 1.17; - - if(!model->HICUMvgcGiven) - model->HICUMvgc = 1.17; - - if(!model->HICUMvgsGiven) - model->HICUMvgs = 1.17; - - if(!model->HICUMf1vgGiven) - model->HICUMf1vg = -1.02377e-4; - - if(!model->HICUMf2vgGiven) - model->HICUMf2vg = 4.3215e-4; - - if(!model->HICUMzetactGiven) - model->HICUMzetact = 3.0; - - if(!model->HICUMzetabetGiven) - model->HICUMzetabet = 3.5; - - if(!model->HICUMalbGiven) - model->HICUMalb = 0.0; - - if(!model->HICUMdvgbeGiven) - model->HICUMdvgbe = 0.0; - - if(!model->HICUMzetahjeiGiven) - model->HICUMzetahjei = 1.0; - - if(!model->HICUMzetavgbeGiven) - model->HICUMzetavgbe = 1.0; - -//Self-Heating - if(!model->HICUMflshGiven) - model->HICUMflsh = 0; - - if(!model->HICUMrthGiven) - model->HICUMrth = 0.0; - - if(!model->HICUMzetarthGiven) - model->HICUMzetarth = 0.0; - - if(!model->HICUMalrthGiven) - model->HICUMalrth = 0.0; - - if(!model->HICUMcthGiven) - model->HICUMcth = 0.0; - - if((model->HICUMrthGiven) && (model->HICUMcth < 1e-12)) - model->HICUMcth = 1e-12; - -//Compatibility with V2.1 - if(!model->HICUMflcompGiven) - model->HICUMflcomp = 0.0; - - if(!model->HICUMvbeMaxGiven) - model->HICUMvbeMax = 1e99; - - if(!model->HICUMvbcMaxGiven) - model->HICUMvbcMax = 1e99; - - if(!model->HICUMvceMaxGiven) - model->HICUMvceMax = 1e99; - - model->HICUMselfheat = (((model->HICUMflsh == 1) || (model->HICUMflsh == 2)) && (model->HICUMrthGiven) && (model->HICUMrth > 0.0)); - model->HICUMnqs = ((model->HICUMflnqs != 0 || model->HICUMflcomp < 2.3) && (model->HICUMt0Given) && (model->HICUMt0 > 0.0) && (model->HICUMalit > 0 || model->HICUMalqf > 0)); - - /* loop through all the instances of the model */ - for (here = HICUMinstances(model); here != NULL ; - here=HICUMnextInstance(here)) { - CKTnode *tmpNode; - IFuid tmpName; - - if(!here->HICUMareaGiven) { - here->HICUMarea = 1.0; - } - if(!here->HICUMmGiven) { - here->HICUMm = 1.0; - } - if(!here->HICUMdtempGiven) { - here->HICUMdtemp = 0.0; - } - - // Warning: - // The scaling with HICUMm and HICUMarea is done here from model to here variables in order to save memory. - // Classical spice scaling with "area" is implemented, but it is not recommended to be used. If you want - // scaling, more sophisticated expressions should be used. Those can be found in modern PDKs or should be - // provided by modeling engineers. - // For discrete devices, the multiplication factor "m" should give reasonable results. - // - // The HICUMm device multiplicaton factor can be exected to give good results. - // The following variables need scaling in HICUM: - // IT : qp0 ~ (area m)**2 qp0 ~ area m icbar ~ area m - // BE junction: cjei0 ~ area m cjep0 ~ m - // ibeis ~ area m ibeps ~ m - // cbepar ~ m -> area scaling not reasonable - // BC junction: cjci0 ~ area m cjcx0 ~ m - // ibcis ~ area m ibcxs ~ m - // ireis ~ area m ireps ~ m - // cbcpar ~ m -> area scaling not reasonable - // qavl ~ area m - // re ~1/(area*m) - // rci0 ~1/(area*m) - // rbx ~1/(area*m) -> assume that scaling with "area" is due to lE0 increase - // rcx ~1/(area*m) -> assume that scaling with "area" is due to lE0 increase - // rbi0 ~1/(area*m) -> assume that scaling with "area" is due to lE0 increase - // rth ~1/(area*m) -> bad assumption, but more transistor geometry needs to be known for accurate scaling - // cth ~ area*m -> bad assumption, but more transistor geometry needs to be known for accurate scaling - // Substrate related parameters not scaled on purpose. This is very geometry dependent? - - double area_times_m = here->HICUMm*here->HICUMarea; - //IT - here->HICUMqp0_scaled = model->HICUMqp0 * area_times_m; - here->HICUMc10_scaled = model->HICUMc10 * area_times_m*area_times_m; - here->HICUMicbar_scaled = model->HICUMicbar * area_times_m; - here->HICUMrth_scaled = model->HICUMrth / area_times_m; //very poor assumption - here->HICUMcth_scaled = model->HICUMcth * area_times_m; //very poor assumption - //BE junction - here->HICUMcjei0_scaled = model->HICUMcjei0 * area_times_m; - here->HICUMibeis_scaled = model->HICUMibeis * area_times_m; - here->HICUMireis_scaled = model->HICUMireis * area_times_m; - here->HICUMibeps_scaled = model->HICUMibeps * here->HICUMm; - here->HICUMireps_scaled = model->HICUMireps * here->HICUMm; - here->HICUMcjep0_scaled = model->HICUMcjep0 * here->HICUMm; - here->HICUMcbepar_scaled = model->HICUMcbepar * here->HICUMm; - here->HICUMibets_scaled = model->HICUMibets * area_times_m; - //BC junction - here->HICUMibcis_scaled = model->HICUMibcis * area_times_m; - here->HICUMcjci0_scaled = model->HICUMcjci0 * area_times_m; - here->HICUMcjcx0_scaled = model->HICUMcjcx0 * here->HICUMm; - here->HICUMcbcpar_scaled = model->HICUMcbcpar * here->HICUMm; - here->HICUMibcxs_scaled = model->HICUMibcxs * here->HICUMm; - here->HICUMqavl_scaled = model->HICUMqavl * area_times_m; - //resistances - here->HICUMre_scaled = model->HICUMre / area_times_m; - here->HICUMrci0_scaled = model->HICUMrci0 / area_times_m; - here->HICUMrbx_scaled = model->HICUMrbx / area_times_m; - here->HICUMrcx_scaled = model->HICUMrcx / area_times_m; - here->HICUMrbi0_scaled = model->HICUMrbi0 / area_times_m; - //noise - here->HICUMkf_scaled = model->HICUMkf * pow(here->HICUMm, (1-model->HICUMaf)); - here->HICUMkfre_scaled = model->HICUMkfre * pow(here->HICUMm, (1-model->HICUMafre)); - - here->HICUMstate = *states; - *states += HICUMnumStates; - - if(model->HICUMrcx == 0) { - here->HICUMcollCINode = here->HICUMcollNode; - } else if(here->HICUMcollCINode == 0) { - error = CKTmkVolt(ckt,&tmp,here->HICUMname,"collCI"); - if(error) return(error); - here->HICUMcollCINode = tmp->number; - if (ckt->CKTcopyNodesets) { - if (CKTinst2Node(ckt,here,1,&tmpNode,&tmpName)==OK) { - if (tmpNode->nsGiven) { - tmp->nodeset=tmpNode->nodeset; - tmp->nsGiven=tmpNode->nsGiven; - } - } - } - } - if(model->HICUMrbx == 0) { - here->HICUMbaseBPNode = here->HICUMbaseNode; - } else if(here->HICUMbaseBPNode == 0){ - error = CKTmkVolt(ckt,&tmp,here->HICUMname, "baseBP"); - if(error) return(error); - here->HICUMbaseBPNode = tmp->number; - if (ckt->CKTcopyNodesets) { - if (CKTinst2Node(ckt,here,2,&tmpNode,&tmpName)==OK) { - if (tmpNode->nsGiven) { - tmp->nodeset=tmpNode->nodeset; - tmp->nsGiven=tmpNode->nsGiven; - } - } - } - } - if(model->HICUMre == 0) { - here->HICUMemitEINode = here->HICUMemitNode; - } else if(here->HICUMemitEINode == 0) { - error = CKTmkVolt(ckt,&tmp,here->HICUMname, "emitEI"); - if(error) return(error); - here->HICUMemitEINode = tmp->number; - if (ckt->CKTcopyNodesets) { - if (CKTinst2Node(ckt,here,3,&tmpNode,&tmpName)==OK) { - if (tmpNode->nsGiven) { - tmp->nodeset=tmpNode->nodeset; - tmp->nsGiven=tmpNode->nsGiven; - } - } - } - } - if(model->HICUMrsu == 0) { - here->HICUMsubsSINode = here->HICUMsubsNode; - } else if(here->HICUMsubsSINode == 0) { - error = CKTmkVolt(ckt,&tmp,here->HICUMname, "subsSI"); - if(error) return(error); - here->HICUMsubsSINode = tmp->number; - if (ckt->CKTcopyNodesets) { - if (CKTinst2Node(ckt,here,4,&tmpNode,&tmpName)==OK) { - if (tmpNode->nsGiven) { - tmp->nodeset=tmpNode->nodeset; - tmp->nsGiven=tmpNode->nsGiven; - } - } - } - } - if(model->HICUMrbi0 == 0) { - here->HICUMbaseBINode = here->HICUMbaseBPNode; - } else if(here->HICUMbaseBINode == 0) { - error = CKTmkVolt(ckt, &tmp, here->HICUMname, "baseBI"); - if(error) return(error); - here->HICUMbaseBINode = tmp->number; - if (ckt->CKTcopyNodesets) { - if (CKTinst2Node(ckt,here,5,&tmpNode,&tmpName)==OK) { - if (tmpNode->nsGiven) { - tmp->nodeset=tmpNode->nodeset; - tmp->nsGiven=tmpNode->nsGiven; - } - } - } - } - - if (model->HICUMselfheat) { - if (here->HICUMtempNode == 0) { // no external node for temperature - error = CKTmkVolt(ckt,&tmp,here->HICUMname,"dT"); // create internal node - if (error) return(error); - here->HICUMtempNode = tmp->number; - } - } else { - if (here->HICUMtempNode > 0) { // external temp node is given, but no she parameter - here->HICUMtempNode = 0; - } - } - - if (model->HICUMnqs) { - if(here->HICUMxfNode == 0) { - error = CKTmkVolt(ckt, &tmp, here->HICUMname, "xf"); - if(error) return(error); - here->HICUMxfNode = tmp->number; - } - if(here->HICUMxf1Node == 0) { - error = CKTmkVolt(ckt, &tmp, here->HICUMname, "xf1"); - if(error) return(error); - here->HICUMxf1Node = tmp->number; - } - if(here->HICUMxf2Node == 0) { - error = CKTmkVolt(ckt, &tmp, here->HICUMname, "xf2"); - if(error) return(error); - here->HICUMxf2Node = tmp->number; - } - } else { - here->HICUMxfNode = 0; - here->HICUMxf1Node = 0; - here->HICUMxf2Node = 0; - } - -/* macro to make elements with built in test for out of memory */ -#define TSTALLOC(ptr,first,second) \ -do { if((here->ptr = SMPmakeElt(matrix, here->first, here->second)) == NULL){\ - return(E_NOMEM);\ -} } while(0) - TSTALLOC(HICUMcollCollPtr,HICUMcollNode,HICUMcollNode); - TSTALLOC(HICUMbaseBasePtr,HICUMbaseNode,HICUMbaseNode); - TSTALLOC(HICUMemitEmitPtr,HICUMemitNode,HICUMemitNode); - TSTALLOC(HICUMsubsSubsPtr,HICUMsubsNode,HICUMsubsNode); - - TSTALLOC(HICUMcollCICollCIPtr,HICUMcollCINode,HICUMcollCINode); - TSTALLOC(HICUMbaseBIBaseBIPtr,HICUMbaseBINode,HICUMbaseBINode); - TSTALLOC(HICUMemitEIEmitEIPtr,HICUMemitEINode,HICUMemitEINode); - TSTALLOC(HICUMbaseBPBaseBPPtr,HICUMbaseBPNode,HICUMbaseBPNode); - TSTALLOC(HICUMsubsSISubsSIPtr,HICUMsubsSINode,HICUMsubsSINode); - - TSTALLOC(HICUMbaseEmitPtr,HICUMbaseNode,HICUMemitNode); //b-e - TSTALLOC(HICUMemitBasePtr,HICUMemitNode,HICUMbaseNode); //e-b - - TSTALLOC(HICUMbaseBaseBPPtr,HICUMbaseNode,HICUMbaseBPNode); //b-bp - TSTALLOC(HICUMbaseBPBasePtr,HICUMbaseBPNode,HICUMbaseNode); //bp-b - TSTALLOC(HICUMemitEmitEIPtr,HICUMemitNode,HICUMemitEINode); //e-ei - TSTALLOC(HICUMemitEIEmitPtr,HICUMemitEINode,HICUMemitNode); //ei-e - - TSTALLOC(HICUMsubsSubsSIPtr,HICUMsubsNode,HICUMsubsSINode); //s-si - TSTALLOC(HICUMsubsSISubsPtr,HICUMsubsSINode,HICUMsubsNode); //si-s - - TSTALLOC(HICUMcollCIBasePtr,HICUMcollCINode,HICUMbaseNode); //b-ci - TSTALLOC(HICUMbaseCollCIPtr,HICUMbaseNode,HICUMcollCINode); //ci-b - - TSTALLOC(HICUMcollCIEmitEIPtr,HICUMcollCINode,HICUMemitEINode); //ci-ei - TSTALLOC(HICUMemitEICollCIPtr,HICUMemitEINode,HICUMcollCINode); //ei-ci - - TSTALLOC(HICUMbaseBPBaseBIPtr,HICUMbaseBPNode,HICUMbaseBINode); //bp-bi - TSTALLOC(HICUMbaseBIBaseBPPtr,HICUMbaseBINode,HICUMbaseBPNode); //bi-bp - - TSTALLOC(HICUMbaseBPEmitEIPtr,HICUMbaseBPNode,HICUMemitEINode); //bp-ei - TSTALLOC(HICUMemitEIBaseBPPtr,HICUMemitEINode,HICUMbaseBPNode); //ei-bp - - TSTALLOC(HICUMbaseBPEmitPtr,HICUMbaseBPNode,HICUMemitNode); //bp-e - TSTALLOC(HICUMemitBaseBPPtr,HICUMemitNode,HICUMbaseBPNode); //e-bp - - TSTALLOC(HICUMbaseBPSubsSIPtr,HICUMbaseBPNode,HICUMsubsSINode); //bp-si - TSTALLOC(HICUMsubsSIBaseBPPtr,HICUMsubsSINode,HICUMbaseBPNode); //si-bp - - TSTALLOC(HICUMbaseBIEmitEIPtr,HICUMbaseBINode,HICUMemitEINode); //ei-bi - TSTALLOC(HICUMemitEIBaseBIPtr,HICUMemitEINode,HICUMbaseBINode); //bi-ei - if (model->HICUMnqs) { - TSTALLOC(HICUMbaseBIXfPtr ,HICUMbaseBINode,HICUMxfNode); //bi - xf - TSTALLOC(HICUMemitEIXfPtr ,HICUMemitEINode,HICUMxfNode); //ei - xf - } - - TSTALLOC(HICUMbaseBICollCIPtr,HICUMbaseBINode,HICUMcollCINode); //ci-bi - TSTALLOC(HICUMcollCIBaseBIPtr,HICUMcollCINode,HICUMbaseBINode); //bi-ci - - TSTALLOC(HICUMbaseBPCollCIPtr,HICUMbaseBPNode,HICUMcollCINode); //bp-ci - TSTALLOC(HICUMcollCIBaseBPPtr,HICUMcollCINode,HICUMbaseBPNode); //ci-bp - - TSTALLOC(HICUMsubsSICollCIPtr,HICUMsubsSINode,HICUMcollCINode); //si-ci - TSTALLOC(HICUMcollCISubsSIPtr,HICUMcollCINode,HICUMsubsSINode); //ci-si - - TSTALLOC(HICUMcollCICollPtr,HICUMcollCINode,HICUMcollNode); //ci-c - TSTALLOC(HICUMcollCollCIPtr,HICUMcollNode,HICUMcollCINode); //c-ci - - TSTALLOC(HICUMsubsCollPtr,HICUMsubsNode,HICUMcollNode); //s-c - TSTALLOC(HICUMcollSubsPtr,HICUMcollNode,HICUMsubsNode); //c-s - - if (model->HICUMnqs) { - TSTALLOC(HICUMxf1Xf1Ptr ,HICUMxf1Node ,HICUMxf1Node); - TSTALLOC(HICUMxf1BaseBIPtr,HICUMxf1Node ,HICUMbaseBINode); - TSTALLOC(HICUMxf1EmitEIPtr,HICUMxf1Node ,HICUMemitEINode); - TSTALLOC(HICUMxf1CollCIPtr,HICUMxf1Node ,HICUMcollCINode); - TSTALLOC(HICUMxf1Xf2Ptr ,HICUMxf1Node ,HICUMxf2Node); - - TSTALLOC(HICUMxf2Xf1Ptr ,HICUMxf2Node ,HICUMxf1Node); - TSTALLOC(HICUMxf2BaseBIPtr,HICUMxf2Node ,HICUMbaseBINode); - TSTALLOC(HICUMxf2EmitEIPtr,HICUMxf2Node ,HICUMemitEINode); - TSTALLOC(HICUMxf2CollCIPtr,HICUMxf2Node ,HICUMcollCINode); - TSTALLOC(HICUMxf2Xf2Ptr ,HICUMxf2Node ,HICUMxf2Node); - TSTALLOC(HICUMemitEIXf2Ptr,HICUMemitEINode,HICUMxf2Node); - TSTALLOC(HICUMcollCIXf2Ptr,HICUMcollCINode,HICUMxf2Node); - - TSTALLOC(HICUMxfXfPtr ,HICUMxfNode,HICUMxfNode); - TSTALLOC(HICUMxfEmitEIPtr ,HICUMxfNode,HICUMemitEINode); - TSTALLOC(HICUMxfCollCIPtr ,HICUMxfNode,HICUMcollCINode); - TSTALLOC(HICUMxfBaseBIPtr ,HICUMxfNode,HICUMbaseBINode); - - } - - if (model->HICUMselfheat) { - TSTALLOC(HICUMcollTempPtr, HICUMcollNode, HICUMtempNode); - TSTALLOC(HICUMbaseTempPtr,HICUMbaseNode,HICUMtempNode); - TSTALLOC(HICUMemitTempPtr,HICUMemitNode,HICUMtempNode); - - TSTALLOC(HICUMcollCItempPtr,HICUMcollCINode,HICUMtempNode); - TSTALLOC(HICUMbaseBItempPtr,HICUMbaseBINode,HICUMtempNode); - TSTALLOC(HICUMbaseBPtempPtr,HICUMbaseBPNode,HICUMtempNode); - TSTALLOC(HICUMemitEItempPtr,HICUMemitEINode,HICUMtempNode); - TSTALLOC(HICUMsubsSItempPtr,HICUMsubsSINode,HICUMtempNode); - TSTALLOC(HICUMsubsTempPtr ,HICUMsubsNode ,HICUMtempNode); - TSTALLOC(HICUMcollTempPtr ,HICUMcollNode ,HICUMtempNode); - - TSTALLOC(HICUMtempCollPtr,HICUMtempNode,HICUMcollNode); - TSTALLOC(HICUMtempBasePtr,HICUMtempNode,HICUMbaseNode); - TSTALLOC(HICUMtempEmitPtr,HICUMtempNode,HICUMemitNode); - - TSTALLOC(HICUMtempCollCIPtr,HICUMtempNode,HICUMcollCINode); - TSTALLOC(HICUMtempBaseBIPtr,HICUMtempNode,HICUMbaseBINode); - TSTALLOC(HICUMtempBaseBPPtr,HICUMtempNode,HICUMbaseBPNode); - TSTALLOC(HICUMtempEmitEIPtr,HICUMtempNode,HICUMemitEINode); - TSTALLOC(HICUMtempSubsSIPtr,HICUMtempNode,HICUMsubsSINode); - - TSTALLOC(HICUMtempTempPtr,HICUMtempNode,HICUMtempNode); - - if (model->HICUMnqs) { - TSTALLOC(HICUMxfTempPtr ,HICUMxfNode,HICUMtempNode); - TSTALLOC(HICUMxf2TempPtr ,HICUMxf2Node ,HICUMtempNode); - TSTALLOC(HICUMxf1TempPtr ,HICUMxf1Node ,HICUMtempNode); - } - } - } - } - return(OK); -} - -int -HICUMunsetup( - GENmodel *inModel, - CKTcircuit *ckt) -{ - HICUMmodel *model; - HICUMinstance *here; - - for (model = (HICUMmodel *)inModel; model != NULL; - model = HICUMnextModel(model)) - { - - for (here = HICUMinstances(model); here != NULL; - here=HICUMnextInstance(here)) - { - if (here->HICUMcollCINode > 0 - && here->HICUMcollCINode != here->HICUMcollNode) - CKTdltNNum(ckt, here->HICUMcollCINode); - here->HICUMcollCINode = 0; - - if (here->HICUMbaseBINode > 0 - && here->HICUMbaseBPNode != here->HICUMbaseBINode) - CKTdltNNum(ckt, here->HICUMbaseBINode); - here->HICUMbaseBINode = 0; - - if (here->HICUMbaseBPNode > 0 - && here->HICUMbaseBPNode != here->HICUMbaseNode) - CKTdltNNum(ckt, here->HICUMbaseBPNode); - here->HICUMbaseBPNode = 0; - - if (here->HICUMemitEINode > 0 - && here->HICUMemitEINode != here->HICUMemitNode) - CKTdltNNum(ckt, here->HICUMemitEINode); - here->HICUMemitEINode = 0; - - if (here->HICUMsubsSINode > 0 - && here->HICUMsubsSINode != here->HICUMsubsNode) - CKTdltNNum(ckt, here->HICUMsubsSINode); - here->HICUMsubsSINode = 0; - - if (model->HICUMselfheat) { - if (here->HICUMtempNode > 6) { // it is an internal node - CKTdltNNum(ckt, here->HICUMtempNode); - here->HICUMtempNode = 0; - } - } - - if (model->HICUMnqs) { - - if(here->HICUMxfNode > 0) - CKTdltNNum(ckt, here->HICUMxfNode); - here->HICUMxfNode = 0; - - if(here->HICUMxf1Node > 0) - CKTdltNNum(ckt, here->HICUMxf1Node); - here->HICUMxf1Node = 0; - - if(here->HICUMxf2Node > 0) - CKTdltNNum(ckt, here->HICUMxf2Node); - here->HICUMxf2Node = 0; - } - - } - } - return OK; -} - -int -HICUMmDelete(GENmodel* gen_model) -{ - HICUMmodel* model = (HICUMmodel*)gen_model; - - FREE(model->HICUMversion); - - return OK; -} diff --git a/src/spicelib/devices/hicum2/hicum2soachk.c b/src/spicelib/devices/hicum2/hicum2soachk.c deleted file mode 100644 index ac010e186..000000000 --- a/src/spicelib/devices/hicum2/hicum2soachk.c +++ /dev/null @@ -1,73 +0,0 @@ -/********** -License : 3-clause BSD -Spice3 Implementation: 2019-2020 Dietmar Warning, Markus Müller, Mario Krattenmacher -Model Author : 1990 Michael Schröter TU Dresden -**********/ - -#include "ngspice/ngspice.h" -#include "ngspice/cktdefs.h" -#include "hicum2defs.h" -#include "ngspice/trandefs.h" -#include "ngspice/sperror.h" -#include "ngspice/suffix.h" -#include "ngspice/cpdefs.h" - - -int -HICUMsoaCheck(CKTcircuit *ckt, GENmodel *inModel) -{ - HICUMmodel *model = (HICUMmodel *) inModel; - HICUMinstance *here; - double vbe, vbc, vce; /* actual bjt voltages */ - int maxwarns; - static int warns_vbe = 0, warns_vbc = 0, warns_vce = 0; - - if (!ckt) { - warns_vbe = 0; - warns_vbc = 0; - warns_vce = 0; - return OK; - } - - maxwarns = ckt->CKTsoaMaxWarns; - - for (; model; model = HICUMnextModel(model)) { - - for (here = HICUMinstances(model); here; here=HICUMnextInstance(here)) { - - vbe = fabs(ckt->CKTrhsOld [here->HICUMbaseNode] - - ckt->CKTrhsOld [here->HICUMemitNode]); - vbc = fabs(ckt->CKTrhsOld [here->HICUMbaseNode] - - ckt->CKTrhsOld [here->HICUMcollNode]); - vce = fabs(ckt->CKTrhsOld [here->HICUMcollNode] - - ckt->CKTrhsOld [here->HICUMemitNode]); - - if (vbe > model->HICUMvbeMax) - if (warns_vbe < maxwarns) { - soa_printf(ckt, (GENinstance*) here, - "|Vbe|=%g has exceeded Vbe_max=%g\n", - vbe, model->HICUMvbeMax); - warns_vbe++; - } - - if (vbc > model->HICUMvbcMax) - if (warns_vbc < maxwarns) { - soa_printf(ckt, (GENinstance*) here, - "|Vbc|=%g has exceeded Vbc_max=%g\n", - vbc, model->HICUMvbcMax); - warns_vbc++; - } - - if (vce > model->HICUMvceMax) - if (warns_vce < maxwarns) { - soa_printf(ckt, (GENinstance*) here, - "|Vce|=%g has exceeded Vce_max=%g\n", - vce, model->HICUMvceMax); - warns_vce++; - } - - } - } - - return OK; -} diff --git a/src/spicelib/devices/hicum2/hicum2trunc.c b/src/spicelib/devices/hicum2/hicum2trunc.c deleted file mode 100644 index d59990668..000000000 --- a/src/spicelib/devices/hicum2/hicum2trunc.c +++ /dev/null @@ -1,43 +0,0 @@ -/********** -License : 3-clause BSD -Spice3 Implementation: 2019-2020 Dietmar Warning, Markus Müller, Mario Krattenmacher -Model Author : 1990 Michael Schröter TU Dresden -**********/ - -/* - * This routine performs truncation error calculations for - * HICUMs in the circuit. - */ - -#include "ngspice/ngspice.h" -#include "ngspice/cktdefs.h" -#include "hicum2defs.h" -#include "ngspice/sperror.h" -#include "ngspice/suffix.h" - - -int -HICUMtrunc(GENmodel *inModel, CKTcircuit *ckt, double *timeStep) -{ - HICUMmodel *model = (HICUMmodel*)inModel; - HICUMinstance *here; - - for( ; model != NULL; model = HICUMnextModel(model)) { - for(here=HICUMinstances(model);here!=NULL; - here = HICUMnextInstance(here)){ - - CKTterr(here->HICUMqrbi, ckt, timeStep); - CKTterr(here->HICUMqjei, ckt, timeStep); - CKTterr(here->HICUMqf, ckt, timeStep); - CKTterr(here->HICUMqjci, ckt, timeStep); - CKTterr(here->HICUMqr, ckt, timeStep); - CKTterr(here->HICUMqjep, ckt, timeStep); - CKTterr(here->HICUMqjcx0_i, ckt, timeStep); - CKTterr(here->HICUMqjcx0_ii, ckt, timeStep); - CKTterr(here->HICUMqdsu, ckt, timeStep); - CKTterr(here->HICUMqjs, ckt, timeStep); - CKTterr(here->HICUMqscp, ckt, timeStep); - } - } - return(OK); -} diff --git a/src/spicelib/devices/hicum2/hicumL2.cpp b/src/spicelib/devices/hicum2/hicumL2.cpp deleted file mode 100644 index 537e60e5a..000000000 --- a/src/spicelib/devices/hicum2/hicumL2.cpp +++ /dev/null @@ -1,3324 +0,0 @@ -/********** -License : 3-clause BSD -Spice3 Implementation: 2019-2020 Dietmar Warning, Markus Müller, Mario Krattenmacher -Model Author : 1990 Michael Schröter TU Dresden -**********/ - -/* - * This file defines the HICUM L2.4.0 model load function - * Comments on the Code: - * - We use dual numbers to calculate derivatives, this is readable and error proof. - * - The code is targeted to be readable and maintainable, speed is sacrificed for this purpose. - * - The verilog a code is available at the website of TU Dresden, Michael Schroeter's chair. - * - lambda functions are used to calculate derivatives of larger Verilog Macros - */ - -#include -#ifndef M_PI -#define M_PI 3.1415926535897932384626433832795 -#endif -#include "duals/dual" -#include "hicumL2.hpp" -#include "hicumL2temp.hpp" -#include - -//ngspice header files written in C -#ifdef __cplusplus -extern "C" -{ -#endif -#include "ngspice/typedefs.h" -#include "ngspice/devdefs.h" -#include "ngspice/const.h" -#include "ngspice/trandefs.h" -#include "ngspice/sperror.h" -#include "hicum2defs.h" -#include "ngspice/ngspice.h" -#include "ngspice/cktdefs.h" -#ifdef __cplusplus -} -#endif - -//HICUM DEFINITIONS -#define VPT_thresh 1.0e2 -#define Dexp_lim 80.0 -#define Cexp_lim 80.0 -#define DFa_fj 1.921812 -#define RTOLC 1.0e-5 -#define l_itmax 100 -#define MIN_R 0.001 - -using namespace duals::literals; - -// IDEAL DIODE (WITHOUT CAPACITANCE): -// conductance calculation not required -// INPUT: -// IS, IST : saturation currents (model parameter related) -// UM1 : ideality factor -// U : branch voltage -// IMPLICIT INPUT: -// T : Temperature -// OUTPUT: -// Iz : diode current -duals::duald HICDIO(duals::duald T, duals::duald IST, double UM1, duals::duald U) -{ -duals::duald DIOY, le, vt; - - vt = CONSTboltz * T / CHARGE; - DIOY = U/(UM1*vt); - // le = exp(DIOY); // would be the best way... But stay close to HICUML2.va - // return IST*(le-1.0); - if (IST > 0.0) { - if (DIOY > Dexp_lim) { - le = (1 + (DIOY - Dexp_lim)); - DIOY = Dexp_lim; - return IST*(le*exp(DIOY)-1.0); - } else if (DIOY <= -14.0) { - return -IST; - } else { - le = exp(DIOY); - return IST*(le-1.0); - } - } else { - return 0.0; - } -} - -// DEPLETION CHARGE CALCULATION -// Hyperbolic smoothing used; no punch-through -// INPUT: -// c_0 : zero-bias capacitance -// u_d : built-in voltage -// z : exponent coefficient -// a_j : control parameter for C peak value at high forward bias -// U_cap : voltage across junction -// IMPLICIT INPUT: -// T : Temperature -// OUTPUT: -// Qz : depletion Charge -// C : depletion capacitance -void QJMODF(duals::duald T, duals::duald c_0, duals::duald u_d, double z, duals::duald a_j, duals::duald U_cap, duals::duald * C, duals::duald * Qz) -{ - duals::duald DFV_f, DFv_e, DFs_q, DFs_q2, DFv_j, DFdvj_dv, DFQ_j, DFC_j1, DFb, vt; - vt = CONSTboltz * T / CHARGE; - if (c_0 > 0.0) { - DFV_f = u_d*(1.0-exp(-log(a_j)/z)); - DFv_e = (DFV_f-U_cap)/vt; - DFs_q = sqrt(DFv_e*DFv_e+DFa_fj); - DFs_q2 = (DFv_e+DFs_q)*0.5; - DFv_j = DFV_f-vt*DFs_q2; - DFdvj_dv = DFs_q2/DFs_q; - DFb = log(1.0-DFv_j/u_d); - DFC_j1 = c_0*exp(-z*DFb)*DFdvj_dv; - *C = DFC_j1+a_j*c_0*(1.0-DFdvj_dv); - DFQ_j = c_0*u_d*(1.0-exp(DFb*(1.0-z)))/(1.0-z); - *Qz = DFQ_j+a_j*c_0*(U_cap-DFv_j); - } else { - *C = 0.0; - *Qz = 0.0; - } -} - -// DEPLETION CHARGE CALCULATION CONSIDERING PUNCH THROUGH -// smoothing of reverse bias region (punch-through) -// and limiting to a_j=Cj,max/Cj0 for forward bias. -// Important for base-collector and collector-substrate junction -// INPUT: -// c_0 : zero-bias capacitance -// u_d : built-in voltage -// z : exponent coefficient -// a_j : control parameter for C peak value at high forward bias -// v_pt : punch-through voltage (defined as qNw^2/2e) -// U_cap : voltage across junction -// IMPLICIT INPUT: -// VT : thermal voltage -// OUTPUT: -// Qz : depletion charge -// C : depletion capacitance -void QJMOD(duals::duald T, duals::duald c_0, duals::duald u_d, double z, double a_j, duals::duald v_pt, duals::duald U_cap, duals::duald * C, duals::duald * Qz) -{ - duals::duald DQ_j1, DQ_j2, DQ_j3, DC_j1, DC_j2, DC_j3, De_1, De_2, Dzr1, DCln1, DCln2, Dz1, Dv_j1, Dv_j2, De, Da, Dv_r, Dv_j4, Dv_e, DC_c, DC_max, DV_f, Dv_p, Dz_r, vt; - vt = CONSTboltz * T / CHARGE; - if (c_0 > 0.0){ - Dz_r = z/4.0; - Dv_p = v_pt-u_d; - DV_f = u_d*(1.0-exp(-log(a_j)/z)); - DC_max = a_j*c_0; - DC_c = c_0*exp((Dz_r-z)*log(v_pt/u_d)); - Dv_e = (DV_f-U_cap)/vt; - if(Dv_e < Cexp_lim) { - De = exp(Dv_e); - De_1 = De/(1.0+De); - Dv_j1 = DV_f-vt*log(1.0+De); - } else { - De_1 = 1.0; - Dv_j1 = U_cap; - } - Da = 0.1*Dv_p+4.0*vt; - Dv_r = (Dv_p+Dv_j1)/Da; - if(Dv_r < Cexp_lim){ - De = exp(Dv_r); - De_2 = De/(1.0+De); - Dv_j2 = -Dv_p+Da*(log(1.0+De)-exp(-(Dv_p+DV_f)/Da)); - } else { - De_2 = 1.0; - Dv_j2 = Dv_j1; - } - Dv_j4 = U_cap-Dv_j1; - DCln1 = log(1.0-Dv_j1/u_d); - DCln2 = log(1.0-Dv_j2/u_d); - Dz1 = 1.0-z; - Dzr1 = 1.0-Dz_r; - DC_j1 = c_0*exp(DCln2*(-z))*De_1*De_2; - DC_j2 = DC_c*exp(DCln1*(-Dz_r))*(1.0-De_2); - DC_j3 = DC_max*(1.0-De_1); - *C = DC_j1+DC_j2+DC_j3; - DQ_j1 = c_0*(1.0-exp(DCln2*Dz1))/Dz1; - DQ_j2 = DC_c*(1.0-exp(DCln1*Dzr1))/Dzr1; - DQ_j3 = DC_c*(1.0-exp(DCln2*Dzr1))/Dzr1; - *Qz = (DQ_j1+DQ_j2-DQ_j3)*u_d+DC_max*Dv_j4; - } else { - *C = 0.0; - *Qz = 0.0; - } -} - -// A CALCULATION NEEDED FOR COLLECTOR MINORITY CHARGE FORMULATION -// INPUT: -// zb,zl : zeta_b and zeta_l (model parameters, TED 10/96) -// w : normalized injection width -// OUTPUT: -// hicfcio : function of equation (2.1.17-10) -void HICFCI(double zb, double zl, duals::duald w, duals::duald * hicfcio, duals::duald * dhicfcio_dw) -{ - duals::duald a, a2, a3, r, lnzb, x, z; - z = zb*w; - lnzb = log(1+zb*w); - if(z > 1.0e-6){ - x = 1.0+z; - a = x*x; - a2 = 0.250*(a*(2.0*lnzb-1.0)+1.0); - a3 = (a*x*(3.0*lnzb-1.0)+1.0)/9.0; - r = zl/zb; - *hicfcio = ((1.0-r)*a2+r*a3)/zb; - *dhicfcio_dw = ((1.0-r)*x+r*a)*lnzb; - } else { - a = z*z; - a2 = 3.0+z-0.25*a+0.10*z*a; - a3 = 2.0*z+0.75*a-0.20*a*z; - *hicfcio = (zb*a2+zl*a3)*w*w/6.0; - *dhicfcio_dw = (1+zl*w)*(1+z)*lnzb; - } -} - -// NEEDED TO CALCULATE WEIGHTED ICCR COLLECTOR MINORITY CHARGE -// INPUT: -// z : zeta_b or zeta_l -// w : normalized injection width -// OUTPUT: -// hicfcto : output -// dhicfcto_dw : derivative of output wrt w -void HICFCT(double z, duals::duald w, duals::duald * hicfcto, duals::duald *dhicfcto_dw) -{ - duals::duald a, lnz; - a = z*w; - lnz = log(1+z*w); - if (a > 1.0e-6){ - *hicfcto = (a - lnz)/z; - *dhicfcto_dw = a / (1.0 + a); - } else { - *hicfcto = 0.5 * a * w; - *dhicfcto_dw = a; - } -} - -// DEPLETION CHARGE & CAPACITANCE CALCULATION SELECTOR -// Dependent on junction punch-through voltage -// Important for collector related junctions -void HICJQ(duals::duald T, duals::duald c_0, duals::duald u_d, double z, duals::duald v_pt, duals::duald U_cap, duals::duald * C,duals::duald * Qz) -{ - if(v_pt.rpart() < VPT_thresh){ - QJMOD(T,c_0,u_d,z,2.4,v_pt,U_cap,C,Qz); - } else { - QJMODF(T,c_0,u_d,z,2.4,U_cap,C,Qz); - } -} - -duals::duald calc_hjei_vbe(duals::duald Vbiei, duals::duald T, HICUMinstance * here, HICUMmodel * model){ - //calculates hje_vbe - //wrapping in a routine allows easy calculation of derivatives with dual numbers - duals::duald vj, vj_z, vt, vdei_t, hjei0_t, ahjei_t; - if (model->HICUMahjei == 0.0){ - return model->HICUMhjei; - }else{ - double T_dpart = T.dpart(); - vt = CONSTboltz * T / CHARGE; - vdei_t = here->HICUMvdei_t.rpart; - hjei0_t = here->HICUMhjei0_t.rpart; - ahjei_t = here->HICUMahjei_t.rpart; - if (T_dpart!=0.0){ - vdei_t.dpart(here->HICUMvdei_t.dpart); - hjei0_t.dpart(here->HICUMhjei0_t.dpart); - ahjei_t.dpart(here->HICUMahjei_t.dpart); - } - //vendhjei = vdei_t*(1.0-exp(-ln(ajei_t)/z_h)); - vj = (vdei_t-Vbiei)/(model->HICUMrhjei*vt); - vj = vdei_t-model->HICUMrhjei*vt*(vj+sqrt(vj*vj+DFa_fj))*0.5; - vj = (vj-vt)/vt; - vj = vt*(1.0+(vj+sqrt(vj*vj+DFa_fj))*0.5); - vj_z = (1.0-exp(model->HICUMzei*log(1.0-vj/vdei_t)))*ahjei_t; - return hjei0_t*(exp(vj_z)-1.0)/vj_z; - } -} - - -void hicum_diode(duals::duald T, dual_double IS, double UM1, double U, double *Iz, double *Gz, double *Tz) -{ - // T is T_dev + 1_e*T_dev_Vrth - //wrapper for hicum diode equation that also generates derivatives - duals::duald result = 0; - - duals::duald is_t = IS.rpart; - result = HICDIO(T.rpart(), is_t, UM1, U+1_e); - *Iz = result.rpart(); - *Gz = result.dpart(); //derivative for U - is_t = IS.rpart + 1_e*IS.dpart; - result = HICDIO(T, is_t, UM1, U); - *Tz = result.dpart(); //derivative for T -} - -void hicum_qjmodf(duals::duald T, dual_double c_0, dual_double u_d, double z, dual_double a_j, double U_cap, double *C, double *C_dU, double *C_dT, double *Qz, double *Qz_dU, double *Qz_dT) -{ - //wrapper for QJMODF that also generates derivatives - duals::duald Cresult = 0; - duals::duald Qresult = 0; - duals::duald c_0_t = c_0.rpart; - duals::duald u_d_t = u_d.rpart; - duals::duald a_j_t = a_j.rpart; - QJMODF(T.rpart(), c_0_t, u_d_t, z, a_j_t, U_cap+1_e, &Cresult, &Qresult); - *C = Cresult.rpart(); - *C_dU = Cresult.dpart(); - *Qz = Qresult.rpart(); - *Qz_dU = Qresult.dpart(); - - c_0_t.dpart(c_0.dpart); - u_d_t.dpart(u_d.dpart); - a_j_t.dpart(a_j.dpart); - QJMODF(T, c_0_t, u_d_t, z, a_j_t, U_cap, &Cresult, &Qresult); - *Qz_dT = Qresult.dpart(); - *C_dT = Cresult.dpart(); -} - -void hicum_HICJQ(duals::duald T, dual_double c_0, dual_double u_d, double z, dual_double v_pt, double U_cap, double * C, double * C_dU, double * C_dT, double * Qz, double * Qz_dU, double * Qz_dT) -{ - //wrapper for HICJQ that also generates derivatives - duals::duald Cresult = 0; - duals::duald Qresult = 0; - duals::duald c_0_t = c_0.rpart; - duals::duald u_d_t = u_d.rpart; - duals::duald v_pt_t = v_pt.rpart; - HICJQ(T.rpart(), c_0_t, u_d_t, z, v_pt_t, U_cap+1_e, &Cresult, &Qresult); - *C = Cresult.rpart(); - *C_dU = Cresult.dpart(); - *Qz = Qresult.rpart(); - *Qz_dU = Qresult.dpart(); - - c_0_t.dpart(c_0.dpart); - u_d_t.dpart(u_d.dpart); - v_pt_t.dpart(v_pt.dpart); - HICJQ(T, c_0_t, u_d_t, z, v_pt_t, U_cap, &Cresult, &Qresult); - *Qz_dT = Qresult.dpart(); - *C_dT = Cresult.dpart(); -} - -int -HICUMload(GENmodel *inModel, CKTcircuit *ckt) -{ - HICUMmodel *model = (HICUMmodel*)inModel; - HICUMinstance *here; - - //Declaration of variables - - double cbcpar1,cbcpar2,cbepar2,cbepar1,Oich,Otbhrec; - - //Charges, capacitances and currents - double Qjci,Qjei,Qjep; - double Qdei,Qrbi; - double Qdei_Vbiei, Qdei_Vbici, Qdei_dT; - double it,ibei,irei,ibci,ibep,irep,ibh_rec; - double ibet,iavl,iavl_dT,iavl_Vbiei,iavl_Vbici; - double ijbcx,ijbcx_dT,ijbcx_Vbpci,ijsc,ijsc_Vsici,ijsc_Vrth,Qjs,Qscp,HSI_Tsu,Qdsu; - double HSI_Tsu_Vbpci, HSI_Tsu_Vsici, HSI_Tsu_dT; - double Qdsu_Vbpci, Qdsu_Vsici, Qdsu_dT; - duals::duald result_Qdsu, result_HSI_TSU; - double Qscp_Vsc, Qscp_dT; - double Cscp_Vsc, Cscp_dT; - - //Base resistance and self-heating power - double rbi=0.0,pterm,pterm_dT; - - //Model initialization - double C_1; - - //Model evaluation - double Crbi,Cjci,Cjei,Cjep,Cscp; - double Cjs, Cjs_dT; - double Cjcx_i, Cjcx_i_Vbci, Cjcx_i_dT; - double Cjcx_ii, Cjcx_ii_Vbpci, Cjcx_ii_dT; - double Qjcx_i , Qjcx_i_Vbci , Qjcx_i_dT ; - double Qjcx_ii, Qjcx_ii_Vbpci, Qjcx_ii_dT; - double Qjs_Vsici, Qjs_dT; - - double itf,itr,Tf,Tr,a_bpt,Q_0; - double itf_Vbiei, itf_Vbici, itf_dT; - double itr_Vbiei, itr_Vbici, itr_dT; - double Tf_Vbiei, Tf_Vbici, Tf_dT; - double it_Vbiei, it_Vbici, it_dT; - double Qf_Vbiei, Qf_Vbici, Qf_dT; - double Qr_Vbiei, Qr_Vbici, Qr_dT; - duals::duald result_itf, result_itr, result_Qf, result_Qr, result_Q_bf, result_a_h, result_Q_p, result_Tf; //intermediate variables when calling void dual functions - double T_f0, Q_p, a_h; - double Q_bf, Q_bf_Vbiei, Q_bf_Vbici, Q_bf_dT; - double Q_pT, Q_pT_dVbiei, Q_pT_dVbici, Q_pT_dT; - double Qf, Cdei, Qr, Cdci; - double Cdei_Vbiei, Cdei_Vbici, Cdei_Vrth; - double Cdci_Vbiei, Cdci_Vbici, Cdci_Vrth; - double Crbi_Vbiei, Crbi_Vbici, Crbi_Vrth; - double ick, ick_Vciei, ick_dT; - - //NQS - double Ixf1,Ixf2,Qxf1,Qxf2; - double Ixf1_Vxf1, Ixf1_Vxf2, Ixf1_ditf, Ixf1_dTf, Ixf1_Vbiei, Ixf1_Vbici, Ixf1_dT; - double Ixf2_Vxf1, Ixf2_Vbiei, Ixf2_Vbici, Ixf2_dT; - double Ixf_Vxf, Ixf_Tf,Ixf_Qdei,Ixf_Vbiei, Ixf_Vbici, Ixf_dT; - double Ixf2_Vxf2, Ixf2_dTf; - double Itxf, Qdeix; - double Itxf_Vxf2, Itxf_Vbici, Itxf_Vbiei, Itxf_dT; - double Qdeix_Vxf, Qdeix_dT, Qdeix_Vbici, Qdeix_Vbiei; - double Qxf, Ixf, Vxf; - double Vxf1, Vxf2; - - double hjei_vbe; - - double Vbiei, Vbici, Vciei, Vbpei, Vbpbi, Vbpci, Vsici, Vbci, Vsc; - double Vbici_temp, Vaval; - - //Model flags - int use_aval; - - //helpers for ngspice implementation - duals::duald result; - - //end of variables - -#ifndef PREDICTOR - double xfact; -#endif - double delvbiei, delvbici, delvbpei, delvbpbi, delvbpci, delvsici, delvbbp, delveie, delvciei, delvcic, delvxf2; - double ibieihat; - double ibpeihat; - double icieihat; - double ibicihat; - double ibpcihat; - double ibpbihat; - double isicihat; - double ibpsihat; - double ithhat; - double ceq, geq; - double rhs_current; - int icheck=1; - int ichk1, ichk2, ichk3, ichk4, ichk5, ichk6; - int error; - double Vbe, Vcic, Vbbp, Veie, Vsis, Vbpe; - - double Ibiei, Ibiei_Vbiei, Ibiei_Vxf=0.0, Ibiei_Vbici; - double Ibici, Ibici_Vbici, Ibici_Vbiei; - double Ibpei, Ibpei_Vbpei; - double Ibpci, Ibpci_Vbpci; - double Isici, Isici_Vsici;// - double Isc=0.0, Isc_Vsc=0.0; - double Iciei, Iciei_Vbiei, Iciei_Vbici, Iciei_Vrth, Iciei_Vxf2; - double Ibbp_Vbbp=0.0; - double Isis_Vsis; - double Ieie, Ieie_Veie=0.0; - double Ibpbi, Ibpbi_Vbpbi, Ibpbi_Vbici, Ibpbi_Vbiei; - double Ibpsi, Ibpsi_Vbpci, Ibpsi_Vsici, Ibpsi_Vrth; - double Icic_Vcic=0.0; - double Ibci=0.0, Ibci_Vbci=0.0; - double hjei_vbe_Vbiei, hjei_vbe_dT, ibet_Vbpei, ibet_dT, ibet_Vbiei, ibh_rec_Vbiei, ibh_rec_dT, ibh_rec_Vbici; - double irei_Vbiei, irei_dT; - double ibep_Vbpei, ibep_dT; - double irep_Vbpei, irep_dT, rbi_dT, rbi_Vbiei, rbi_Vbici; - double ibei_Vbiei, ibei_dT; - double ibci_Vbici, ibci_dT; - double Q_0_Vbiei, Q_0_Vbici, Q_0_dT; - - double Temp; - double Tdev_Vrth; //derivative device temperature to Vrth - - //below variable has a real part equal to the device temperature and a dual part equal to dTdev/dVrth - //this is necessary, since for some Vrth, HICUM sets Tdev constant (eg very high self heating beyond 300K) - //then, dTdev/dVrth. Else it is equal to 1. - duals::duald Temp_dual; - - double Cjei_Vbiei,Cjci_Vbici,Cjep_Vbpei,Cjep_dT,Cjs_Vsici; - double Cjei_dT, Cjci_dT; - double Qjei_Vbiei, Qjei_dT, Qjci_Vbici, Qjci_dT; - double T_f0_Vbici,T_f0_dT; - double Qbepar1; - double Qbepar2; - double Qbcpar1; - double Qbcpar2; - double Qsu; - double Qcth; - double Qcth_Vrth; - - double Qrbi_Vbpbi; - double Qrbi_Vrth; - double Qrbi_Vbiei; - double Qrbi_Vbici; - double Qjep_Vbpei,Qjep_dT; - double Qbepar1_Vbe; - double Qbepar2_Vbpe; - double Qbcpar1_Vbci; - double Qbcpar2_Vbpci; - double Qsu_Vsis; - - double cqbepar1, gqbepar1; - double cqbepar2, gqbepar2; - double cqbcpar1, gqbcpar1; - double cqbcpar2, gqbcpar2; - double cqsu, gqsu; - - double Qxf_Vxf, Qxf1_Vxf1, Qxf2_Vxf2; - - double Ith=0.0, Vrth=0.0, Icth, Icth_Vrth, delvrth; - - double Ibiei_Vrth; - double Ibici_Vrth; - double Ibpei_Vrth; - double Ibpci_Vrth; - double Isici_Vrth; - double Ibpbi_Vrth; - double Ieie_Vrth; - double Icic_Vrth=0.0; - double Irth_Vrth=0.0; - double Ibbp_Vrth=0.0; - - double Ith_Vrth=0.0; - double Ith_Vciei=0.0; - double Ith_Vbiei=0.0; - double Ith_Vbici=0.0; - double Ith_Vbpei=0.0; - double Ith_Vbpci=0.0; - - double Ith_Vsici=0.0; - double Ith_Vbpbi=0.0; - double Ith_Veie=0.0; - double Ith_Vcic=0.0; - double Ith_Vbbp=0.0; - - // COLLECTOR CURRENT SPREADING CALCULATION - // collector minority charge incl. 2D/3D current spreading (TED 10/96) - // INPUT: - // Ix : forward transport current component (itf) - // I_CK : critical current - // FFT_pcS : dependent on fthc and thcs (parameters) - // IMPLICIT INPUT: - // ahc, latl, latb : model parameters - // VT : thermal voltage - // OUTPUT: - // Q_fC, Q_CT: actual and ICCR (weighted) hole charge - // T_fC, T_cT: actual and ICCR (weighted) transit time - // Derivative dfCT_ditf not properly implemented yet - std::function HICQFC = [&](duals::duald T, duals::duald Ix, duals::duald I_CK, duals::duald FFT_pcS, duals::duald * Q_fC, duals::duald * Q_CT, duals::duald * T_fC, duals::duald * T_cT) - { - duals::duald FCln, FCa, FCa1, FCd_a, FCw, FCdw_daick, FCda1_dw, FCf_ci, FCdfCT_ditf, FCw2, FCz, FCdfc_dw, FFdVc_ditf, FCf_CT, FCf1, FCf2, FCrt; - duals::duald FCa_ck, FCdaick_ditf, FCxl, FCxb, FCdf1_dw, FCz_1, FCf3, FCdf2_dw, FCdf3_dw, FCdw_ditf, FCdfc_ditf; - duals::duald FCdfCT_dw, FCd_f, FFdVc; - - duals::duald vt; - - vt = CONSTboltz * T / CHARGE; - - *Q_fC = FFT_pcS*Ix; - FCa = 1.0-I_CK/Ix; - FCrt = sqrt(FCa*FCa+model->HICUMahc); - FCa_ck = 1.0-(FCa+FCrt)/(1.0+sqrt(1.0+model->HICUMahc)); - FCdaick_ditf = (FCa_ck-1.0)*(1-FCa)/(FCrt*Ix); - if(model->HICUMlatb > model->HICUMlatl){ - FCz = model->HICUMlatb-model->HICUMlatl; - FCxl = 1.0+model->HICUMlatl; - FCxb = 1.0+model->HICUMlatb; - if(model->HICUMlatb > 0.01){ - FCln = log(FCxb/FCxl); - FCa1 = exp((FCa_ck-1.0)*FCln); - FCd_a = 1.0/(model->HICUMlatl-FCa1*model->HICUMlatb); - FCw = (FCa1-1.0)*FCd_a; - FCdw_daick = -FCz*FCa1*FCln*FCd_a*FCd_a; - FCa1 = log((1.0+model->HICUMlatb*FCw)/(1.0+model->HICUMlatl*FCw)); - FCda1_dw = model->HICUMlatb/(1.0+model->HICUMlatb*FCw) - model->HICUMlatl/(1.0+model->HICUMlatl*FCw); - } else { - FCf1 = 1.0-FCa_ck; - FCd_a = 1.0/(1.0+FCa_ck*model->HICUMlatb); - FCw = FCf1*FCd_a; - FCdw_daick = -1.0*FCd_a*FCd_a*FCxb*FCd_a; - FCa1 = FCz*FCw; - FCda1_dw = FCz; - } - FCf_CT = 2.0/FCz; - FCw2 = FCw*FCw; - FCf1 = model->HICUMlatb*model->HICUMlatl*FCw*FCw2/3.0+(model->HICUMlatb+model->HICUMlatl)*FCw2/2.0+FCw; - FCdf1_dw = model->HICUMlatb*model->HICUMlatl*FCw2 + (model->HICUMlatb+model->HICUMlatl)*FCw + 1.0; - HICFCI(model->HICUMlatb,model->HICUMlatl,FCw,&FCf2,&FCdf2_dw); - HICFCI(model->HICUMlatl,model->HICUMlatb,FCw,&FCf3,&FCdf3_dw); - FCf_ci = FCf_CT*(FCa1*FCf1-FCf2+FCf3); - FCdfc_dw = FCf_CT*(FCa1*FCdf1_dw+FCda1_dw*FCf1-FCdf2_dw+FCdf3_dw); - FCdw_ditf = FCdw_daick*FCdaick_ditf; - FCdfc_ditf = FCdfc_dw*FCdw_ditf; - if(model->HICUMflcomp < 2.3) { - HICFCT(model->HICUMlatb,FCw,&FCf2,&FCdf2_dw); - HICFCT(model->HICUMlatl,FCw,&FCf3,&FCdf3_dw); - FCf_CT = FCf_CT*(FCf2-FCf3); - FCdfCT_dw = FCf_CT*(FCdf2_dw-FCdf3_dw); - FCdfCT_ditf = FCdfCT_dw*FCdw_ditf; - } else { - FCf_CT = FCf_ci; - FCdfCT_ditf = FCdfc_ditf; - } - } else { - if(model->HICUMlatb > 0.01) { - FCd_a = 1.0/(1.0+FCa_ck*model->HICUMlatb); - FCw = (1.0-FCa_ck)*FCd_a; - FCdw_daick = -(1.0+model->HICUMlatb)*FCd_a*FCd_a; - } else { - FCw = 1.0-FCa_ck-FCa_ck*model->HICUMlatb; - FCdw_daick = -(1.0+model->HICUMlatb); - } - FCw2 = FCw*FCw; - FCz = model->HICUMlatb*FCw; - FCz_1 = 1.0+FCz; - FCd_f = 1.0/(FCz_1); - FCf_ci = FCw2*(1.0+FCz/3.0)*FCd_f; - FCdfc_dw = 2.0*FCw*(FCz_1+FCz*FCz/3.0)*FCd_f*FCd_f; - FCdw_ditf = FCdw_daick*FCdaick_ditf; - FCdfc_ditf = FCdfc_dw*FCdw_ditf; - if(model->HICUMflcomp < 2.3){ - if (FCz > 0.001){ - FCf_CT = 2.0*(FCz_1*log(FCz_1)-FCz)/(model->HICUMlatb*model->HICUMlatb*FCz_1); - FCdfCT_dw = 2.0*FCw*FCd_f*FCd_f; - } else { - FCf_CT = FCw2*(1.0-FCz/3.0)*FCd_f; - FCdfCT_dw = 2.0*FCw*(1.0-FCz*FCz/3.0)*FCd_f*FCd_f; - } - FCdfCT_ditf = FCdfCT_dw*FCdw_ditf; - } else { - FCf_CT = FCf_ci; - FCdfCT_ditf = FCdfc_ditf; - } - } - *Q_CT = *Q_fC*FCf_CT*exp((FFdVc-model->HICUMvcbar)/vt); - *Q_fC = *Q_fC*FCf_ci*exp((FFdVc-model->HICUMvcbar)/vt); - *T_fC = FFT_pcS*exp((FFdVc-model->HICUMvcbar)/vt)*(FCf_ci+Ix*FCdfc_ditf) +*Q_fC/vt*FFdVc_ditf; - *T_cT = FFT_pcS*exp((FFdVc-model->HICUMvcbar)/vt)*(FCf_CT+Ix*FCdfCT_ditf)+*Q_CT/vt*FFdVc_ditf; - }; - - // TRANSIT-TIME AND STORED MINORITY CHARGE - // INPUT: - // itf : forward transport current - // I_CK : critical current - // T_f : transit time - // Q_f : minority charge / for low current - // IMPLICIT INPUT: - // tef0, gtfe, fthc, thcs, ahc, latl, latb : model parameters - // OUTPUT: - // T_f : transit time - // Q_f : minority charge transient analysis - // T_fT : transit time - // Q_fT : minority charge ICCR (transfer current) - // Q_bf : excess base charge - std::function HICQFF = [&](duals::duald T, duals::duald itf, duals::duald I_CK, duals::duald * T_f, duals::duald * Q_f, duals::duald * T_fT, duals::duald * Q_fT, duals::duald * Q_bf) - { - duals::duald FFitf_ick, FFdTef, FFdQef, FFdVc, FFdVc_ditf, FFib, FFfcbar, FFdib_ditf; - duals::duald vt,tef0_t,thcs_t,hf0_t,hfe_t,hfc_t; - duals::duald FFdQbfb, FFdTbfb, FFdQfhc, FFdTfhc, FFdQcfc,FFdTcfc, FFdQbfc,FFdTbfc; - duals::duald FFdQcfcT, FFic, FFw, FFdTcfcT; - double T_dpart = T.dpart(); - vt = CONSTboltz * T / CHARGE; - tef0_t = here->HICUMtef0_t.rpart; - thcs_t = here->HICUMthcs_t.rpart; - hf0_t = here->HICUMhf0_t.rpart; - hfe_t = here->HICUMhfe_t.rpart; - hfc_t = here->HICUMhfc_t.rpart; - if (T_dpart!=0.0){ - tef0_t.dpart(here->HICUMtef0_t.dpart); - thcs_t.dpart(here->HICUMthcs_t.dpart); - hf0_t.dpart(here->HICUMhf0_t.dpart); - hfe_t.dpart(here->HICUMhfe_t.dpart); - hfc_t.dpart(here->HICUMhfc_t.dpart); - } - - if(itf < 1.0e-6*I_CK){ - *Q_fT = *Q_f; - *T_fT = *T_f; - *Q_bf = 0; - } else { - FFitf_ick = itf/I_CK; - FFdTef = tef0_t*exp(model->HICUMgtfe*log(FFitf_ick)); - FFdQef = FFdTef*itf/(1+model->HICUMgtfe); - if (here->HICUMicbar_scaled<0.05*(model->HICUMvlim/here->HICUMrci0_scaled)) { - FFdVc = 0; - FFdVc_ditf = 0; - } else { - FFib = (itf-I_CK)/here->HICUMicbar_scaled; - if (FFib < -1.0e10) { - FFib = -1.0e10; - } - FFfcbar = (FFib+sqrt(FFib*FFib+model->HICUMacbar))/2.0; - FFdib_ditf = FFfcbar/sqrt(FFib*FFib+model->HICUMacbar)/here->HICUMicbar_scaled; - FFdVc = model->HICUMvcbar*exp(-1.0/FFfcbar); - FFdVc_ditf = FFdVc/(FFfcbar*FFfcbar)*FFdib_ditf; - } - FFdQbfb = (1-model->HICUMfthc)*thcs_t*itf*(exp(FFdVc/vt)-1); - FFdTbfb = FFdQbfb/itf+(1-model->HICUMfthc)*thcs_t*itf*exp(FFdVc/vt)/vt*FFdVc_ditf; - FFic = 1-1.0/FFitf_ick; - FFw = (FFic+sqrt(FFic*FFic+model->HICUMahc))/(1+sqrt(1+model->HICUMahc)); - FFdQfhc = thcs_t*itf*FFw*FFw*exp((FFdVc-model->HICUMvcbar)/vt); - FFdTfhc = FFdQfhc*(1.0/itf*(1.0+2.0/(FFitf_ick*sqrt(FFic*FFic+model->HICUMahc)))+1.0/vt*FFdVc_ditf); - if(model->HICUMlatb <= 0.0 && model->HICUMlatl <= 0.0){ - FFdQcfc = model->HICUMfthc*FFdQfhc; - FFdTcfc = model->HICUMfthc*FFdTfhc; - FFdQcfcT = FFdQcfc; - FFdTcfcT = FFdTcfc; - } else { - HICQFC(T, itf,I_CK,model->HICUMfthc*thcs_t,&FFdQcfc,&FFdQcfcT,&FFdTcfc,&FFdTcfcT); - } - FFdQbfc = (1-model->HICUMfthc)*FFdQfhc; - FFdTbfc = (1-model->HICUMfthc)*FFdTfhc; - *Q_fT = hf0_t*(*Q_f)+FFdQbfb+FFdQbfc+hfe_t*FFdQef+hfc_t*FFdQcfcT; - *T_fT = hf0_t*(*T_f)+FFdTbfb+FFdTbfc+hfe_t*FFdTef+hfc_t*FFdTcfcT; - *Q_f = *Q_f+(FFdQbfb+FFdQbfc)+FFdQef+FFdQcfc; - *T_f = *T_f+(FFdTbfb+FFdTbfc)+FFdTef+FFdTcfc; - *Q_bf = FFdQbfb+FFdQbfc; - } - }; - //Hole charge at low bias - std::function calc_Q_0 = [&](duals::duald T, duals::duald Qjei, duals::duald Qjci, duals::duald hjei_vbe){ - duals::duald Q_0, b_q, Q_bpt, qp0_t; - qp0_t = here->HICUMqp0_t.rpart; - double T_dpart = T.dpart(); - if (T_dpart!=0.0){ - qp0_t.dpart(here->HICUMqp0_t.dpart); - } - a_bpt = 0.05; - Q_0 = qp0_t + hjei_vbe*Qjei + model->HICUMhjci*Qjci; - Q_bpt = a_bpt*qp0_t; - b_q = Q_0/Q_bpt-1; - Q_0 = Q_bpt*(1+(b_q +sqrt(b_q*b_q+1.921812))/2); - return Q_0; - }; - - std::function calc_T_f0 = [&](duals::duald T, duals::duald Vbici){ - //Transit time calculation at low current density - duals::duald vt, vdci_t, cjci0_t, t0_t; - duals::duald cV_f,cv_e,cs_q,cs_q2,cv_j,cdvj_dv,Cjcit,cc; - double T_dpart = T.dpart(); - - vt = CONSTboltz * T / CHARGE; - vdci_t = here->HICUMvdci_t.rpart; - cjci0_t = here->HICUMcjci0_t.rpart; - t0_t = here->HICUMt0_t.rpart; - if (T_dpart!=0.0){ - vdci_t.dpart(here->HICUMvdci_t.dpart); - cjci0_t.dpart(here->HICUMcjci0_t.dpart); - t0_t.dpart(here->HICUMt0_t.dpart); - } - if(here->HICUMcjci0_t.rpart > 0.0){ // CJMODF - cV_f = vdci_t*(1.0-exp(-log(2.4)/model->HICUMzci)); - cv_e = (cV_f-Vbici)/vt; - cs_q = sqrt(cv_e*cv_e+1.921812); - cs_q2 = (cv_e+cs_q)*0.5; - cv_j = cV_f-vt*cs_q2; - cdvj_dv = cs_q2/cs_q; - Cjcit = cjci0_t*exp(-model->HICUMzci*log(1.0-cv_j/vdci_t))*cdvj_dv+2.4*cjci0_t*(1.0-cdvj_dv); - } else { - Cjcit = 0.0; - } - if(Cjcit > 0.0) { - cc = cjci0_t/Cjcit; - } else { - cc = 1.0; - } - return t0_t+model->HICUMdt0h*(cc-1.0)+model->HICUMtbvl*(1/cc-1.0); - }; - std::function calc_ick = [&](duals::duald T, duals::duald Vciei){ - duals::duald ick, vces_t, rci0_t, vlim_t, Orci0_t; - duals::duald Ovpt,a,d1,vceff,a1,a11,Odelck,ick1,ick2,ICKa, vc, vt; - double T_dpart = T.dpart(); - - vces_t = here->HICUMvces_t.rpart; - rci0_t = here->HICUMrci0_t.rpart; - vlim_t = here->HICUMvlim_t.rpart; - if (T_dpart!=0.0){ - vces_t.dpart(here->HICUMvces_t.dpart); - rci0_t.dpart(here->HICUMrci0_t.dpart); - vlim_t.dpart(here->HICUMvlim_t.dpart); - } - //Effective collector voltage - vc = Vciei-vces_t; - vt = CONSTboltz * T / CHARGE; - - //Inverse of low-field internal collector resistance: needed in HICICK - Orci0_t = 1.0/rci0_t; - - //Critical current for onset of high-current effects - //begin : HICICK - Ovpt = 1.0/model->HICUMvpt; - a = vc/vt; - d1 = a-1; - vceff = (1.0+((d1+sqrt(d1*d1+1.921812))/2))*vt; - // a = vceff/vlim_t; - // ick = vceff*Orci0_t/sqrt(1.0+a*a); - // ICKa = (vceff-vlim_t)*Ovpt; - // ick = ick*(1.0+0.5*(ICKa+sqrt(ICKa*ICKa+1.0e-3))); - - a1 = vceff/vlim_t; - a11 = vceff*Orci0_t; - Odelck = 1/model->HICUMdelck; - ick1 = exp(Odelck*log(1+exp(model->HICUMdelck*log(a1)))); - ick2 = a11/ick1; - ICKa = (vceff-vlim_t)*Ovpt; - ick = ick2*(1.0+0.5*(ICKa+sqrt(ICKa*ICKa+model->HICUMaick))); - return ick; - - //end - }; - - - std::function calc_ibet = [&](duals::duald Vbiei, duals::duald Vbpei, duals::duald T){ - //Tunneling current - duals::duald ibet; - if (here->HICUMibets_scaled > 0 && (Vbpei <0.0 || Vbiei < 0.0)){ //begin : HICTUN - duals::duald pocce,czz, cje0_t, vde_t, ibets_t, abet_t; - double T_dpart = T.dpart(); - ibets_t = here->HICUMibets_t.rpart; - abet_t = here->HICUMabet_t.rpart; - if (T_dpart!=0.0){ - abet_t.dpart(here->HICUMabet_t.dpart); - ibets_t.dpart(here->HICUMibets_t.dpart); - } - if(model->HICUMtunode==1 && here->HICUMcjep0_t.rpart > 0.0 && here->HICUMvdep_t.rpart >0.0){ - cje0_t = here->HICUMcjep0_t.rpart; - vde_t = here->HICUMvdep_t.rpart; - if (T_dpart!=0.0){ - cje0_t.dpart(here->HICUMcjep0_t.dpart); - vde_t.dpart(here->HICUMvdep_t.dpart); - } - pocce = exp((1-1/model->HICUMzep)*log(Cjep/cje0_t)); - czz = -(Vbpei/vde_t)*ibets_t*pocce; - ibet = czz*exp(-abet_t/pocce); - } else if (model->HICUMtunode==0 && here->HICUMcjei0_t.rpart > 0.0 && here->HICUMvdei_t.rpart >0.0){ - cje0_t = here->HICUMcjei0_t.rpart; - vde_t = here->HICUMvdei_t.rpart; - if (T_dpart!=0.0){ - cje0_t.dpart(here->HICUMcjei0_t.dpart); - vde_t.dpart(here->HICUMvdei_t.dpart); - } - pocce = exp((1-1/model->HICUMzei)*log(Cjei/cje0_t)); - czz = -(Vbiei/vde_t)*ibets_t*pocce; - ibet = czz*exp(-abet_t/pocce); - } else { - ibet = 0.0; - } - } else { - ibet = 0.0; - } - return ibet; - }; - - std::function calc_iavl = [&](duals::duald Vbici, duals::duald Cjci, duals::duald itf, duals::duald T){ - //Avalanche current - duals::duald iavl; - duals::duald v_bord,v_q,U0,av,avl,cjci0_t, vdci_t, qavl_t,favl_t, kavl_t; - if (use_aval == 1) {//begin : HICAVL - double T_dpart = T.dpart(); - cjci0_t = here->HICUMcjci0_t.rpart; - vdci_t = here->HICUMvdci_t.rpart; - qavl_t = here->HICUMqavl_t.rpart; - favl_t = here->HICUMfavl_t.rpart; - kavl_t = here->HICUMkavl_t.rpart; - if (T_dpart!=0.0){ - cjci0_t.dpart(here->HICUMcjci0_t.dpart); - vdci_t.dpart(here->HICUMvdci_t.dpart); - qavl_t.dpart(here->HICUMqavl_t.dpart); - favl_t.dpart(here->HICUMfavl_t.dpart); - kavl_t.dpart(here->HICUMkavl_t.dpart); - } - v_bord = vdci_t-Vbici; - if (v_bord > 0) { - v_q = qavl_t/Cjci; - U0 = qavl_t/cjci0_t; - if(v_bord > U0){ - av = favl_t*exp(-v_q/U0); - avl = av*(U0+(1.0+v_q/U0)*(v_bord-U0)); - } else { - avl = favl_t * v_bord * exp(-v_q / v_bord); - } - /* This model turns strong avalanche on. The parameter kavl can turn this - * model extension off (kavl = 0). Although this is numerically stable, a - * conditional statement is applied in order to reduce the numerical over- - * head for simulations without the new model. - */ - if (model->HICUMkavl > 0) { //: HICAVLHIGH - duals::duald denom,sq_smooth,hl; - denom = 1-kavl_t*avl; - // Avoid denom < 0 using a smoothing function - sq_smooth = sqrt(denom*denom+0.01); - hl = 0.5*(denom+sq_smooth); - iavl = itf*avl/hl; - } else { - iavl = itf*avl; - } - } else { - iavl = 0.0; - } - } else{ - iavl = 0; - } - return iavl; - }; - - std::function calc_rbi = [&](duals::duald T, duals::duald Qjei, duals::duald Qf){ - //Internal base resistance - duals::duald vt,rbi; - vt = CONSTboltz * T / CHARGE; - if(here->HICUMrbi0_t.rpart > 0.0){ //: HICRBI - duals::duald Qz_nom,f_QR,ETA,Qz0,fQz, qp0_t; - double T_dpart = T.dpart(); - rbi = here->HICUMrbi0_t.rpart; - qp0_t = here->HICUMqp0_t.rpart; - if (T_dpart!=0.0) { - rbi.dpart(here->HICUMrbi0_t.dpart); - qp0_t.dpart(here->HICUMqp0_t.dpart); - } - // Consideration of conductivity modulation - // To avoid convergence problem hyperbolic smoothing used - f_QR = (1+model->HICUMfdqr0)*qp0_t; - Qz0 = Qjei+Qjci+Qf; - Qz_nom = 1+Qz0/f_QR; - fQz = 0.5*(Qz_nom+sqrt(Qz_nom*Qz_nom+0.01)); - rbi = rbi/fQz; - // Consideration of emitter current crowding - if( ibei > 0.0) { - ETA = rbi*ibei*model->HICUMfgeo/vt; - if(ETA < 1.0e-6) { - rbi = rbi*(1.0-0.5*ETA); - } else { - rbi = rbi*log(1.0+ETA)/ETA; - } - } - // Consideration of peripheral charge - if(Qf > 0.0) { - rbi = rbi*(Qjei+Qf*model->HICUMfqi)/(Qjei+Qf); - } - } else { - rbi = 0.0; - } - return rbi; - }; - - std::function calc_it_final = [&](duals::duald T, duals::duald Vbiei, duals::duald Vbici, duals::duald Q_pT, duals::duald T_f0, duals::duald ick, duals::duald *itf, duals::duald *itr, duals::duald *Qf, duals::duald *Qr, duals::duald *Q_bf, duals::duald * Tf){ - // given T,Q_pT, ick, T_f0, Tr, Vbiei, Vbici -> calculate itf, itr, Qf, Qr - duals::duald VT, VT_f, i_0f, i_0r, I_Tf1, a_h, Q_fT,T_fT; - duals::duald c10_t; - - double T_dpart = T.dpart(); - - VT = CONSTboltz * T / CHARGE; - c10_t = here->HICUMc10_t.rpart; - if (T_dpart!=0.0) { - c10_t.dpart(here->HICUMc10_t.dpart); - } - VT_f = model->HICUMmcf*VT; - i_0f = c10_t * exp(Vbiei/VT_f); - i_0r = c10_t * exp(Vbici/VT); - - - I_Tf1 = i_0f/Q_pT; - a_h = Oich*I_Tf1; - *itf = I_Tf1*(1.0+a_h); - *itr = i_0r/Q_pT; - - //Final transit times, charges and transport current components - *Tf = T_f0; - *Qf = T_f0*(*itf); - HICQFF(T,*itf,ick,Tf,Qf,&T_fT,&Q_fT,Q_bf); - *Qr = Tr*(*itr); - }; - - std::function calc_it_initial = [&](duals::duald T, duals::duald Vbiei, duals::duald Vbici, duals::duald Q_0, duals::duald T_f0, duals::duald ick, duals::duald *itf, duals::duald *itr, duals::duald *Qf, duals::duald *Qr, duals::duald *Q_bf, duals::duald *a_h, duals::duald *Q_p, duals::duald *Tf){ - // given T,Q_pT, ick, T_f0, Tr, Vbiei, Vbici -> calculate itf, itr, Qf, Qr - duals::duald VT, VT_f, i_0f, i_0r, I_Tf1, Q_fT, T_fT, A; - duals::duald c10_t; - double T_dpart = T.dpart(); - - VT = CONSTboltz * T / CHARGE; - c10_t = here->HICUMc10_t.rpart; - if (T_dpart!=0.0) { - c10_t.dpart(here->HICUMc10_t.dpart); - } - VT_f = model->HICUMmcf*VT; - i_0f = c10_t * exp(Vbiei/VT_f); - i_0r = c10_t * exp(Vbici/VT); - - *Q_p = Q_0; - if (T_f0 > 0.0 || Tr > 0.0) { - A = 0.5*Q_0; - *Q_p = A+sqrt(A*A+T_f0*i_0f+Tr*i_0r); - } - I_Tf1 =i_0f/(*Q_p); - *a_h = Oich*I_Tf1; - *itf = I_Tf1*(1.0+*a_h); - *itr = i_0r/(*Q_p); - - //Initial formulation of forward transit time, diffusion, GICCR and excess b-c charge - *Q_bf = 0.0; - *Tf = T_f0; - *Qf = T_f0*(*itf); - HICQFF(T,*itf,ick,Tf,Qf,&T_fT,&Q_fT,Q_bf); - - //Initial formulation of reverse diffusion charge - *Qr = Tr*(*itr); - }; - - std::function calc_it = [&](duals::duald T, duals::duald Vbiei, duals::duald Vbici, duals::duald Q_0, duals::duald T_f0, duals::duald ick){ - // This function calculates Q_pT in a dual way - // Tr also as argument here? - duals::duald VT, VT_f,i_0f,i_0r, Q_p, A, I_Tf1,itf, itr, a_h, Qf, Qr, d_Q0, Q_pT, a, d_Q, Tf, T_fT, Q_bf, Q_fT; - duals::duald c10_t; - int extra_round=0; - double T_dpart = T.dpart(); - int l_it; - - VT = CONSTboltz * T / CHARGE; - c10_t = here->HICUMc10_t.rpart; - if (T_dpart!=0.0) { - c10_t.dpart(here->HICUMc10_t.dpart); - } - VT_f = model->HICUMmcf*VT; - i_0f = c10_t * exp(Vbiei/VT_f); - i_0r = c10_t * exp(Vbici/VT); - - //Initial formulation of forward and reverse component of transfer current - Q_p = Q_0; - if (T_f0 > 0.0 || Tr > 0.0) { - A = 0.5*Q_0; - Q_p = A+sqrt(A*A+T_f0*i_0f+Tr*i_0r); - } - I_Tf1 = i_0f/Q_p; - a_h = Oich*I_Tf1; - itf = I_Tf1*(1.0+a_h); - itr = i_0r/Q_p; - - //Initial formulation of forward transit time, diffusion, GICCR and excess b-c charge - Q_bf = 0.0; - Tf = T_f0; - Qf = T_f0*itf; - HICQFF(T,itf,ick,&Tf,&Qf,&T_fT,&Q_fT,&Q_bf); - - //Initial formulation of reverse diffusion charge - Qr = Tr*itr; - - //Preparation for iteration to get total hole charge and related variables - l_it = 0; - extra_round = 1; - if(Qf > RTOLC*Q_p || a_h > RTOLC) { - //Iteration for Q_pT is required for improved initial solution - Qf = sqrt(T_f0*itf*Q_fT); - Q_pT = Q_0+Qf+Qr; - d_Q = Q_pT; - while ( ((abs(d_Q) >= RTOLC*abs(Q_pT)) && (l_it <= l_itmax)) || (extra_round < 5)) { - d_Q0 = d_Q; - I_Tf1 = i_0f/Q_pT; - a_h = Oich*I_Tf1; - itf = I_Tf1*(1.0+a_h); - itr = i_0r/Q_pT; - Tf = T_f0; - Qf = T_f0*itf; - HICQFF(T,itf,ick,&Tf,&Qf,&T_fT,&Q_fT,&Q_bf); - Qr = Tr*itr; - if(Oich == 0.0) { - a = 1.0+(T_fT*itf+Qr)/Q_pT; - } else { - a = 1.0+(T_fT*I_Tf1*(1.0+2.0*a_h)+Qr)/Q_pT; - } - d_Q = -(Q_pT-(Q_0+Q_fT+Qr))/a; - //Limit maximum change of Q_pT - a = abs(0.3*Q_pT); - if(abs(d_Q) > a) { - if (d_Q>=0) { - d_Q = a; - } else { - d_Q = -a; - } - } - Q_pT = Q_pT+d_Q; - l_it = l_it+1; - if (!(abs(d_Q) >= RTOLC*abs(Q_pT))) { //extra_rounds to get rid of derivative noise - extra_round = extra_round + 1; - } - } - - //final calculations afterwards, see later in load where this is called - - } - return Q_pT; - - }; - - std::function calc_itss = [&](duals::duald T, duals::duald Vbpci, duals::duald Vsici, duals::duald * HSI_Tsu, duals::duald * Qdsu){ - duals::duald HSUM, vt, HSa, HSb, itss_t, tsf_t; - double T_dpart = T.dpart(); - vt = CONSTboltz * T / CHARGE; - itss_t = here->HICUMitss_t.rpart; - tsf_t = here->HICUMtsf_t.rpart; - if (T_dpart!=0.0){ - itss_t.dpart(here->HICUMitss_t.dpart); - tsf_t.dpart(here->HICUMtsf_t.dpart); - } - if(model->HICUMitss > 0.0) { // : Sub_Transfer - HSUM = model->HICUMmsf*vt; - HSa = exp(Vbpci/HSUM); - HSb = exp(Vsici/HSUM); - *HSI_Tsu = itss_t*(HSa-HSb); - if(model->HICUMtsf > 0.0) { - *Qdsu = tsf_t*itss_t*HSa; - } else { - *Qdsu = 0.0; - } - } else { - *HSI_Tsu = 0.0; - *Qdsu = 0.0; - }; - }; - - - /* loop through all the models */ - for (; model != NULL; model = HICUMnextModel(model)) { - - // Avoid divide-by-zero and define infinity other way - // High current correction for 2D and 3D effects - if (model->HICUMich != 0.0) { - Oich = 1.0 / model->HICUMich; - } - else { - Oich = 0.0; - } - - // Base current recombination time constant at b-c barrier - if (model->HICUMtbhrec != 0.0) { - Otbhrec = 1.0 / model->HICUMtbhrec; - } - else { - Otbhrec = 0.0; - } - - // Turn avalanche calculation on depending of parameters - if ((model->HICUMfavl > 0.0) && (model->HICUMcjci0 > 0.0)) { - use_aval = 1; - } else { - use_aval = 0; - } - - // end of Model_initialization - - /* loop through all the instances of the model */ - for (here = HICUMinstances(model); here != NULL ; - here=HICUMnextInstance(here)) { - - // Depletion capacitance splitting at b-c junction - // Capacitances at peripheral and external base node - C_1 = (1.0 - model->HICUMfbcpar) * - (here->HICUMcjcx0_scaled + here->HICUMcbcpar_scaled); - if (C_1 >= here->HICUMcbcpar_scaled) { - cbcpar1 = here->HICUMcbcpar_scaled; - cbcpar2 = 0.0; - } - else { - cbcpar1 = C_1; - cbcpar2 = here->HICUMcbcpar_scaled - cbcpar1; - } - - // Parasitic b-e capacitance partitioning: No temperature dependence - cbepar2 = model->HICUMfbepar * here->HICUMcbepar_scaled; - cbepar1 = here->HICUMcbepar_scaled - cbepar2; - - gqbepar1 = 0.0; - gqbepar2 = 0.0; - gqbcpar1 = 0.0; - gqbcpar2 = 0.0; - gqsu = 0.0; - Icth = 0.0, Icth_Vrth = 0.0; - - /* - * initialization - */ - icheck=1; - if(ckt->CKTmode & MODEINITSMSIG) { - Vbiei = *(ckt->CKTstate0 + here->HICUMvbiei); - Vbici = *(ckt->CKTstate0 + here->HICUMvbici); - // dead assign: - //Vciei = Vbiei - Vbici; - Vbpei = *(ckt->CKTstate0 + here->HICUMvbpei); - Vbpci = *(ckt->CKTstate0 + here->HICUMvbpci); - Vbci = model->HICUMtype*( - *(ckt->CKTrhsOld+here->HICUMbaseNode)- - *(ckt->CKTrhsOld+here->HICUMcollCINode)); - Vsici = *(ckt->CKTstate0 + here->HICUMvsici); - Vsc = model->HICUMtype*( - *(ckt->CKTrhsOld+here->HICUMsubsNode)- - *(ckt->CKTrhsOld+here->HICUMcollNode)); - - Vbpbi = *(ckt->CKTstate0 + here->HICUMvbpbi); - Vbe = model->HICUMtype*( - *(ckt->CKTrhsOld+here->HICUMbaseNode)- - *(ckt->CKTrhsOld+here->HICUMemitNode)); - Vcic = model->HICUMtype*( - *(ckt->CKTrhsOld+here->HICUMcollCINode)- - *(ckt->CKTrhsOld+here->HICUMcollNode)); - Vbbp = model->HICUMtype*( - *(ckt->CKTrhsOld+here->HICUMbaseNode)- - *(ckt->CKTrhsOld+here->HICUMbaseBPNode)); - Vbpe = model->HICUMtype*( - *(ckt->CKTrhsOld+here->HICUMbaseBPNode)- - *(ckt->CKTrhsOld+here->HICUMemitNode)); - Veie = model->HICUMtype*( - *(ckt->CKTrhsOld+here->HICUMemitEINode)- - *(ckt->CKTrhsOld+here->HICUMemitNode)); - Vsis = model->HICUMtype*( - *(ckt->CKTrhsOld+here->HICUMsubsSINode)- - *(ckt->CKTrhsOld+here->HICUMsubsNode)); - Vxf = *(ckt->CKTrhsOld + here->HICUMxfNode); - Vxf1 = *(ckt->CKTrhsOld + here->HICUMxf1Node); - Vxf2 = *(ckt->CKTrhsOld + here->HICUMxf2Node); - if (model->HICUMselfheat) { - Vrth = *(ckt->CKTstate0 + here->HICUMvrth); - } - } else if(ckt->CKTmode & MODEINITTRAN) { - Vbiei = *(ckt->CKTstate1 + here->HICUMvbiei); - Vbici = *(ckt->CKTstate1 + here->HICUMvbici); - // dead assign: - //Vciei = Vbiei - Vbici; - Vbpei = *(ckt->CKTstate1 + here->HICUMvbpei); - Vbpci = *(ckt->CKTstate1 + here->HICUMvbpci); - Vbci = model->HICUMtype*( - *(ckt->CKTrhsOld+here->HICUMbaseNode)- - *(ckt->CKTrhsOld+here->HICUMcollCINode)); - Vsici = *(ckt->CKTstate1 + here->HICUMvsici); - Vsc = model->HICUMtype*( - *(ckt->CKTrhsOld+here->HICUMsubsNode)- - *(ckt->CKTrhsOld+here->HICUMcollNode)); - - Vbpbi = *(ckt->CKTstate1 + here->HICUMvbpbi); - Vbe = model->HICUMtype*( - *(ckt->CKTrhsOld+here->HICUMbaseNode)- - *(ckt->CKTrhsOld+here->HICUMemitNode)); - Vcic = model->HICUMtype*( - *(ckt->CKTrhsOld+here->HICUMcollCINode)- - *(ckt->CKTrhsOld+here->HICUMcollNode)); - Vbbp = model->HICUMtype*( - *(ckt->CKTrhsOld+here->HICUMbaseNode)- - *(ckt->CKTrhsOld+here->HICUMbaseBPNode)); - Vbpe = model->HICUMtype*( - *(ckt->CKTrhsOld+here->HICUMbaseBPNode)- - *(ckt->CKTrhsOld+here->HICUMemitNode)); - Veie = model->HICUMtype*( - *(ckt->CKTrhsOld+here->HICUMemitEINode)- - *(ckt->CKTrhsOld+here->HICUMemitNode)); - Vsis = model->HICUMtype*( - *(ckt->CKTrhsOld+here->HICUMsubsSINode)- - *(ckt->CKTrhsOld+here->HICUMsubsNode)); - Vxf = *(ckt->CKTrhsOld + here->HICUMxfNode); - Vxf1 = *(ckt->CKTrhsOld + here->HICUMxf1Node); - Vxf2 = *(ckt->CKTrhsOld + here->HICUMxf2Node); - if (model->HICUMselfheat) { - Vrth = *(ckt->CKTstate1 + here->HICUMvrth); - } - } else if((ckt->CKTmode & MODEINITJCT) && - (ckt->CKTmode & MODETRANOP) && (ckt->CKTmode & MODEUIC)){ - Vbiei = model->HICUMtype * here->HICUMicVBE; // multiplication by type has historical reasons - Vciei = model->HICUMtype * here->HICUMicVCE; // the user sets anytime positive numbers independent from type - Vbici = Vbiei - Vciei; - Vsc = Vsici = model->HICUMtype * here->HICUMicVCS; - Vbe = Vbpei = Vbiei; - Vbci = Vbpci = Vbici; - Vbpbi = 0.0; - Vbbp = 0.0; - Vbpe = 0.0; - Vcic = 0.0; - Veie = 0.0; - Vrth = 0.0; - Vsis = 0.0; - Icth = 0.0, Icth_Vrth=0.0; - Vxf=Vxf1=Vxf2=0.0; - } else if((ckt->CKTmode & MODEINITJCT) && (here->HICUMoff==0)) { - Vbiei = here->HICUMtVcrit; - Vbici = 0.0; - // dead assign: - //Vciei = Vbiei - Vbici; - Vsc = Vsici = 0.0; - Vbe = Vbpei = Vbiei; - Vbci = Vbpci = Vbici; - Vbpbi = 0.0; - Vbbp = 0.0; - Vbpe = 0.0; - Vcic = 0.0; - Veie = 0.0; - Vrth = 0.0; - Vsis = 0.0; - Icth = 0.0, Icth_Vrth=0.0; - Vxf=Vxf1=Vxf2=0.0; - } else if((ckt->CKTmode & MODEINITJCT) || - ( (ckt->CKTmode & MODEINITFIX) && (here->HICUMoff!=0))) { - Vbe=0.0; - Vbiei=Vbe; - // dead assign: - //Vciei=0.0; - Vbci=Vbici=Vbpci=0.0; - Vbpei=0.0; - Vsc=Vsici=0.0; - Vbpbi=Vbbp=Vbpe=0.0; - Vcic=Veie=Vsis=0.0; - Vrth=0.0,Icth=0.0,Icth_Vrth=0.0; - Vxf=Vxf1=Vxf2=0.0; - } else { -#ifndef PREDICTOR - if(ckt->CKTmode & MODEINITPRED) { - xfact = ckt->CKTdelta/ckt->CKTdeltaOld[1]; - Vbiei = (1+xfact) * *(ckt->CKTstate1 + here->HICUMvbiei)- - xfact * *(ckt->CKTstate2 + here->HICUMvbiei); - Vbici = (1+xfact) * *(ckt->CKTstate1 + here->HICUMvbici)- - xfact * *(ckt->CKTstate2 + here->HICUMvbici); - Vciei = Vbiei - Vbici; - Vbpei = (1+xfact) * *(ckt->CKTstate1 + here->HICUMvbpei)- - xfact * *(ckt->CKTstate2 + here->HICUMvbpei); - Vbpci = (1+xfact) * *(ckt->CKTstate1 + here->HICUMvbpci)- - xfact * *(ckt->CKTstate2 + here->HICUMvbpci); - Vsici = (1+xfact) * *(ckt->CKTstate1 + here->HICUMvsici)- - xfact * *(ckt->CKTstate2 + here->HICUMvsici); - Vbpbi = (1+xfact) * *(ckt->CKTstate1 + here->HICUMvbpbi)- - xfact * *(ckt->CKTstate2 + here->HICUMvbpbi); - // dead assign: - // Vxf = (1+xfact) * *(ckt->CKTstate1 + here->HICUMvxf)- - // xfact * *(ckt->CKTstate2 + here->HICUMvxf); - // Vxf1 = (1+xfact) * *(ckt->CKTstate1 + here->HICUMvxf1)- - // xfact * *(ckt->CKTstate2 + here->HICUMvxf1); - Vxf2 = (1+xfact) * *(ckt->CKTstate1 + here->HICUMvxf2)- - xfact * *(ckt->CKTstate2 + here->HICUMvxf2); - Vrth = (1+xfact) * *(ckt->CKTstate1 + here->HICUMvrth); - Veie = (1+xfact) * *(ckt->CKTstate1 + here->HICUMveie)- - xfact * *(ckt->CKTstate2 + here->HICUMveie); - Vcic = (1+xfact) * *(ckt->CKTstate1 + here->HICUMvcic)- - xfact * *(ckt->CKTstate2 + here->HICUMvcic); - Vbbp = (1+xfact) * *(ckt->CKTstate1 + here->HICUMvbbp)- - xfact * *(ckt->CKTstate2 + here->HICUMvbbp); - ///////////////////////// - // begin copy state vector - ///////////////////////// - *(ckt->CKTstate0+here->HICUMvbiei)=*(ckt->CKTstate1+here->HICUMvbiei); - *(ckt->CKTstate0+here->HICUMvbici)=*(ckt->CKTstate1+here->HICUMvbici); - *(ckt->CKTstate0+here->HICUMvbpei)=*(ckt->CKTstate1+here->HICUMvbpei); - *(ckt->CKTstate0+here->HICUMvbpbi)=*(ckt->CKTstate1+here->HICUMvbpbi); - *(ckt->CKTstate0+here->HICUMvbpci)=*(ckt->CKTstate1+here->HICUMvbpci); - *(ckt->CKTstate0+here->HICUMvsici)=*(ckt->CKTstate1+here->HICUMvsici); - *(ckt->CKTstate0+here->HICUMvcic)=*(ckt->CKTstate1+here->HICUMvcic); - *(ckt->CKTstate0+here->HICUMvbbp)=*(ckt->CKTstate1+here->HICUMvbbp); - *(ckt->CKTstate0+here->HICUMveie)=*(ckt->CKTstate1+here->HICUMveie); - *(ckt->CKTstate0+here->HICUMibiei)=*(ckt->CKTstate1+here->HICUMibiei); - *(ckt->CKTstate0+here->HICUMibiei_Vbiei)=*(ckt->CKTstate1+here->HICUMibiei_Vbiei); - *(ckt->CKTstate0+here->HICUMibiei_Vxf)=*(ckt->CKTstate1+here->HICUMibiei_Vxf); - *(ckt->CKTstate0+here->HICUMibiei_Vbici)=*(ckt->CKTstate1+here->HICUMibiei_Vbici); - *(ckt->CKTstate0+here->HICUMibiei_Vrth)=*(ckt->CKTstate1+here->HICUMibiei_Vrth); - *(ckt->CKTstate0+here->HICUMibpei)=*(ckt->CKTstate1+here->HICUMibpei); - *(ckt->CKTstate0+here->HICUMibpei_Vbpei)=*(ckt->CKTstate1+here->HICUMibpei_Vbpei); - *(ckt->CKTstate0+here->HICUMibpei_Vrth)=*(ckt->CKTstate1+here->HICUMibpei_Vrth); - *(ckt->CKTstate0+here->HICUMiciei)=*(ckt->CKTstate1+here->HICUMiciei); - *(ckt->CKTstate0+here->HICUMiciei_Vbiei)=*(ckt->CKTstate1+here->HICUMiciei_Vbiei); - *(ckt->CKTstate0+here->HICUMiciei_Vbici)=*(ckt->CKTstate1+here->HICUMiciei_Vbici); - *(ckt->CKTstate0+here->HICUMiciei_Vxf2)=*(ckt->CKTstate1+here->HICUMiciei_Vxf2); - *(ckt->CKTstate0+here->HICUMiciei_Vrth)=*(ckt->CKTstate1+here->HICUMiciei_Vrth); - *(ckt->CKTstate0+here->HICUMibici)=*(ckt->CKTstate1+here->HICUMibici); - *(ckt->CKTstate0+here->HICUMibici_Vbici)=*(ckt->CKTstate1+here->HICUMibici_Vbici); - *(ckt->CKTstate0+here->HICUMibici_Vbiei)=*(ckt->CKTstate1+here->HICUMibici_Vbiei); - *(ckt->CKTstate0+here->HICUMibici_Vrth)=*(ckt->CKTstate1+here->HICUMibici_Vrth); - *(ckt->CKTstate0+here->HICUMibpbi)=*(ckt->CKTstate1+here->HICUMibpbi); - *(ckt->CKTstate0+here->HICUMibpbi_Vbpbi)=*(ckt->CKTstate1+here->HICUMibpbi_Vbpbi); - *(ckt->CKTstate0+here->HICUMibpbi_Vbiei)=*(ckt->CKTstate1+here->HICUMibpbi_Vbiei); - *(ckt->CKTstate0+here->HICUMibpbi_Vbici)=*(ckt->CKTstate1+here->HICUMibpbi_Vbici); - *(ckt->CKTstate0+here->HICUMibpbi_Vrth)=*(ckt->CKTstate1+here->HICUMibpbi_Vrth); - *(ckt->CKTstate0+here->HICUMibpci)=*(ckt->CKTstate1+here->HICUMibpci); - *(ckt->CKTstate0+here->HICUMibpci_Vbpci)=*(ckt->CKTstate1+here->HICUMibpci_Vbpci); - *(ckt->CKTstate0+here->HICUMibpci_Vrth)=*(ckt->CKTstate1+here->HICUMibpci_Vrth); - *(ckt->CKTstate0+here->HICUMisici)=*(ckt->CKTstate1+here->HICUMisici); - *(ckt->CKTstate0+here->HICUMisici_Vsici)=*(ckt->CKTstate1+here->HICUMisici_Vsici); - *(ckt->CKTstate0+here->HICUMisici_Vrth)=*(ckt->CKTstate1+here->HICUMisici_Vrth); - *(ckt->CKTstate0+here->HICUMibpsi)=*(ckt->CKTstate1+here->HICUMibpsi); - *(ckt->CKTstate0+here->HICUMibpsi_Vbpci)=*(ckt->CKTstate1+here->HICUMibpsi_Vbpci); - *(ckt->CKTstate0+here->HICUMibpsi_Vsici)=*(ckt->CKTstate1+here->HICUMibpsi_Vsici); - *(ckt->CKTstate0+here->HICUMibpsi_Vrth)=*(ckt->CKTstate1+here->HICUMibpsi_Vrth); - *(ckt->CKTstate0+here->HICUMisis_Vsis)=*(ckt->CKTstate1+here->HICUMisis_Vsis); - *(ckt->CKTstate0+here->HICUMieie)=*(ckt->CKTstate1+here->HICUMieie); - *(ckt->CKTstate0+here->HICUMieie_Vrth)=*(ckt->CKTstate1+here->HICUMieie_Vrth); - *(ckt->CKTstate0+here->HICUMqrbi)=*(ckt->CKTstate1+here->HICUMqrbi); - *(ckt->CKTstate0+here->HICUMcqrbi)=*(ckt->CKTstate1+here->HICUMcqrbi); - *(ckt->CKTstate0+here->HICUMqjei)=*(ckt->CKTstate1+here->HICUMqjei); - *(ckt->CKTstate0+here->HICUMcqjei)=*(ckt->CKTstate1+here->HICUMcqjei); - *(ckt->CKTstate0+here->HICUMqf)=*(ckt->CKTstate1+here->HICUMqf); - *(ckt->CKTstate0+here->HICUMcqf)=*(ckt->CKTstate1+here->HICUMcqf); - *(ckt->CKTstate0+here->HICUMqr)=*(ckt->CKTstate1+here->HICUMqr); - *(ckt->CKTstate0+here->HICUMcqr)=*(ckt->CKTstate1+here->HICUMcqr); - *(ckt->CKTstate0+here->HICUMqjci)=*(ckt->CKTstate1+here->HICUMqjci); - *(ckt->CKTstate0+here->HICUMcqjci)=*(ckt->CKTstate1+here->HICUMcqjci); - *(ckt->CKTstate0+here->HICUMqjep)=*(ckt->CKTstate1+here->HICUMqjep); - *(ckt->CKTstate0+here->HICUMcqjep)=*(ckt->CKTstate1+here->HICUMcqjep); - *(ckt->CKTstate0+here->HICUMqjcx0_i)=*(ckt->CKTstate1+here->HICUMqjcx0_i); - *(ckt->CKTstate0+here->HICUMcqcx0_t_i)=*(ckt->CKTstate1+here->HICUMcqcx0_t_i); - *(ckt->CKTstate0+here->HICUMqjcx0_ii)=*(ckt->CKTstate1+here->HICUMqjcx0_ii); - *(ckt->CKTstate0+here->HICUMcqcx0_t_ii)=*(ckt->CKTstate1+here->HICUMcqcx0_t_ii); - *(ckt->CKTstate0+here->HICUMqdsu)=*(ckt->CKTstate1+here->HICUMqdsu); - *(ckt->CKTstate0+here->HICUMcqdsu)=*(ckt->CKTstate1+here->HICUMcqdsu); - *(ckt->CKTstate0+here->HICUMqjs)=*(ckt->CKTstate1+here->HICUMqjs); - *(ckt->CKTstate0+here->HICUMcqjs)=*(ckt->CKTstate1+here->HICUMcqjs); - *(ckt->CKTstate0+here->HICUMqscp)=*(ckt->CKTstate1+here->HICUMqscp); - *(ckt->CKTstate0+here->HICUMcqscp)=*(ckt->CKTstate1+here->HICUMcqscp); - *(ckt->CKTstate0+here->HICUMqbepar1)=*(ckt->CKTstate1+here->HICUMqbepar1); - *(ckt->CKTstate0+here->HICUMcqbepar1)=*(ckt->CKTstate1+here->HICUMcqbepar1); - *(ckt->CKTstate0+here->HICUMgqbepar1)=*(ckt->CKTstate1+here->HICUMgqbepar1); - *(ckt->CKTstate0+here->HICUMqbepar2)=*(ckt->CKTstate1+here->HICUMqbepar2); - *(ckt->CKTstate0+here->HICUMcqbepar2)=*(ckt->CKTstate1+here->HICUMcqbepar2); - *(ckt->CKTstate0+here->HICUMgqbepar2)=*(ckt->CKTstate1+here->HICUMgqbepar2); - *(ckt->CKTstate0+here->HICUMqbcpar1)=*(ckt->CKTstate1+here->HICUMqbcpar1); - *(ckt->CKTstate0+here->HICUMcqbcpar1)=*(ckt->CKTstate1+here->HICUMcqbcpar1); - *(ckt->CKTstate0+here->HICUMgqbcpar1)=*(ckt->CKTstate1+here->HICUMgqbcpar1); - *(ckt->CKTstate0+here->HICUMqbcpar2)=*(ckt->CKTstate1+here->HICUMqbcpar2); - *(ckt->CKTstate0+here->HICUMcqbcpar2)=*(ckt->CKTstate1+here->HICUMcqbcpar2); - *(ckt->CKTstate0+here->HICUMgqbcpar2)=*(ckt->CKTstate1+here->HICUMgqbcpar2); - *(ckt->CKTstate0+here->HICUMqsu)=*(ckt->CKTstate1+here->HICUMqsu); - *(ckt->CKTstate0+here->HICUMcqsu)=*(ckt->CKTstate1+here->HICUMcqsu); - *(ckt->CKTstate0+here->HICUMgqsu)=*(ckt->CKTstate1+here->HICUMgqsu); - *(ckt->CKTstate0+here->HICUMqcth)=*(ckt->CKTstate1+here->HICUMqcth); - *(ckt->CKTstate0+here->HICUMcqcth)=*(ckt->CKTstate1+here->HICUMcqcth); - *(ckt->CKTstate0+here->HICUMvrth)=*(ckt->CKTstate1+here->HICUMvrth); - *(ckt->CKTstate0+here->HICUMvxf)=*(ckt->CKTstate1+here->HICUMvxf); - *(ckt->CKTstate0+here->HICUMqxf)=*(ckt->CKTstate1+here->HICUMqxf); - *(ckt->CKTstate0+here->HICUMcqxf)=*(ckt->CKTstate1+here->HICUMcqxf); - *(ckt->CKTstate0+here->HICUMgqxf)=*(ckt->CKTstate1+here->HICUMgqxf); - *(ckt->CKTstate0+here->HICUMixf_Vbiei)=*(ckt->CKTstate1+here->HICUMixf_Vbiei); - *(ckt->CKTstate0+here->HICUMixf_Vbici)=*(ckt->CKTstate1+here->HICUMixf_Vbici); - *(ckt->CKTstate0+here->HICUMixf_Vxf)=*(ckt->CKTstate1+here->HICUMixf_Vxf); - *(ckt->CKTstate0+here->HICUMixf_Vrth)=*(ckt->CKTstate1+here->HICUMixf_Vrth); - *(ckt->CKTstate0+here->HICUMvxf1)=*(ckt->CKTstate1+here->HICUMvxf1); - *(ckt->CKTstate0+here->HICUMqxf1)=*(ckt->CKTstate1+here->HICUMqxf1); - *(ckt->CKTstate0+here->HICUMcqxf1)=*(ckt->CKTstate1+here->HICUMcqxf1); - *(ckt->CKTstate0+here->HICUMgqxf1)=*(ckt->CKTstate1+here->HICUMgqxf1); - *(ckt->CKTstate0+here->HICUMixf1_Vbiei)=*(ckt->CKTstate1+here->HICUMixf1_Vbiei); - *(ckt->CKTstate0+here->HICUMixf1_Vbici)=*(ckt->CKTstate1+here->HICUMixf1_Vbici); - *(ckt->CKTstate0+here->HICUMixf1_Vxf2)=*(ckt->CKTstate1+here->HICUMixf1_Vxf2); - *(ckt->CKTstate0+here->HICUMixf1_Vxf1)=*(ckt->CKTstate1+here->HICUMixf1_Vxf1); - *(ckt->CKTstate0+here->HICUMixf1_Vrth)=*(ckt->CKTstate1+here->HICUMixf1_Vrth); - *(ckt->CKTstate0+here->HICUMvxf2)=*(ckt->CKTstate1+here->HICUMvxf2); - *(ckt->CKTstate0+here->HICUMqxf2)=*(ckt->CKTstate1+here->HICUMqxf2); - *(ckt->CKTstate0+here->HICUMcqxf2)=*(ckt->CKTstate1+here->HICUMcqxf2); - *(ckt->CKTstate0+here->HICUMgqxf2)=*(ckt->CKTstate1+here->HICUMgqxf2); - *(ckt->CKTstate0+here->HICUMixf2_Vbiei)=*(ckt->CKTstate1+here->HICUMixf2_Vbiei); - *(ckt->CKTstate0+here->HICUMixf2_Vbici)=*(ckt->CKTstate1+here->HICUMixf2_Vbici); - *(ckt->CKTstate0+here->HICUMixf2_Vxf1)=*(ckt->CKTstate1+here->HICUMixf2_Vxf1); - *(ckt->CKTstate0+here->HICUMixf2_Vxf2)=*(ckt->CKTstate1+here->HICUMixf2_Vxf2); - *(ckt->CKTstate0+here->HICUMixf2_Vrth)=*(ckt->CKTstate1+here->HICUMixf2_Vrth); - *(ckt->CKTstate0+here->HICUMith)=*(ckt->CKTstate1+here->HICUMith); - *(ckt->CKTstate0+here->HICUMith_Vrth)=*(ckt->CKTstate1+here->HICUMith_Vrth); - *(ckt->CKTstate0+here->HICUMith_Vbiei)=*(ckt->CKTstate1+here->HICUMith_Vbiei); - *(ckt->CKTstate0+here->HICUMith_Vbici)=*(ckt->CKTstate1+here->HICUMith_Vbici); - *(ckt->CKTstate0+here->HICUMith_Vbpbi)=*(ckt->CKTstate1+here->HICUMith_Vbpbi); - *(ckt->CKTstate0+here->HICUMith_Vbpci)=*(ckt->CKTstate1+here->HICUMith_Vbpci); - *(ckt->CKTstate0+here->HICUMith_Vbpei)=*(ckt->CKTstate1+here->HICUMith_Vbpei); - *(ckt->CKTstate0+here->HICUMith_Vciei)=*(ckt->CKTstate1+here->HICUMith_Vciei); - *(ckt->CKTstate0+here->HICUMith_Vsici)=*(ckt->CKTstate1+here->HICUMith_Vsici); - *(ckt->CKTstate0+here->HICUMith_Vcic)=*(ckt->CKTstate1+here->HICUMith_Vcic); - *(ckt->CKTstate0+here->HICUMith_Vbbp)=*(ckt->CKTstate1+here->HICUMith_Vbbp); - *(ckt->CKTstate0+here->HICUMith_Veie)=*(ckt->CKTstate1+here->HICUMith_Veie); - *(ckt->CKTstate0+here->HICUMit)=*(ckt->CKTstate1+here->HICUMit); - ///////////////////////// - // end copy state vector - ///////////////////////// - } else { -#endif /* PREDICTOR */ - /* - * compute new nonlinear branch voltages - */ - Vbiei = model->HICUMtype*( - *(ckt->CKTrhsOld+here->HICUMbaseBINode)- - *(ckt->CKTrhsOld+here->HICUMemitEINode)); - // no direct Vbe branch exists, dont need this voltage: - // Vbe = model->HICUMtype*( - // *(ckt->CKTrhsOld+here->HICUMbaseNode)- - // *(ckt->CKTrhsOld+here->HICUMemitNode)); - Vbici = model->HICUMtype*( - *(ckt->CKTrhsOld+here->HICUMbaseBINode)- - *(ckt->CKTrhsOld+here->HICUMcollCINode)); - Vbpei = model->HICUMtype*( - *(ckt->CKTrhsOld+here->HICUMbaseBPNode)- - *(ckt->CKTrhsOld+here->HICUMemitEINode)); - Vbpbi = model->HICUMtype*( - *(ckt->CKTrhsOld+here->HICUMbaseBPNode)- - *(ckt->CKTrhsOld+here->HICUMbaseBINode)); - Veie = model->HICUMtype*( - *(ckt->CKTrhsOld+here->HICUMemitEINode)- - *(ckt->CKTrhsOld+here->HICUMemitNode)); - Vcic = model->HICUMtype*( - *(ckt->CKTrhsOld+here->HICUMcollCINode)- - *(ckt->CKTrhsOld+here->HICUMcollNode)); - Vbbp = model->HICUMtype*( - *(ckt->CKTrhsOld+here->HICUMbaseNode)- - *(ckt->CKTrhsOld+here->HICUMbaseBPNode)); - Vbpci = model->HICUMtype*( - *(ckt->CKTrhsOld+here->HICUMbaseBPNode)- - *(ckt->CKTrhsOld+here->HICUMcollCINode)); - Vsici = model->HICUMtype*( - *(ckt->CKTrhsOld+here->HICUMsubsSINode)- - *(ckt->CKTrhsOld+here->HICUMcollCINode)); - // not needed because convergence in NQS network is not checked here - //Vxf = *(ckt->CKTrhsOld + here->HICUMxfNode); - //Vxf1 = *(ckt->CKTrhsOld + here->HICUMxf1Node); - Vxf2 = *(ckt->CKTrhsOld + here->HICUMxf2Node); - Vciei = Vbiei - Vbici; - if (model->HICUMselfheat) { - Vrth = *(ckt->CKTrhsOld + here->HICUMtempNode); - } - -#ifndef PREDICTOR - } -#endif /* PREDICTOR */ - delvbiei = Vbiei - *(ckt->CKTstate0 + here->HICUMvbiei); - delvbici = Vbici - *(ckt->CKTstate0 + here->HICUMvbici); - delvbpei = Vbpei - *(ckt->CKTstate0 + here->HICUMvbpei); - delvbpbi = Vbpbi - *(ckt->CKTstate0 + here->HICUMvbpbi); - delvbpci = Vbpci - *(ckt->CKTstate0 + here->HICUMvbpci); - delvsici = Vsici - *(ckt->CKTstate0 + here->HICUMvsici); - delvcic = Vcic - *(ckt->CKTstate0 + here->HICUMvcic); - delvbbp = Vbbp - *(ckt->CKTstate0 + here->HICUMvbbp); - delveie = Veie - *(ckt->CKTstate0 + here->HICUMveie); - delvxf2 = Vxf2 - *(ckt->CKTstate0 + here->HICUMvxf2); - delvciei = delvbiei-delvbici; - if (model->HICUMselfheat) { - delvrth = Vrth - *(ckt->CKTstate0 + here->HICUMvrth); - } else { - delvrth = 0; - } - Vbe = model->HICUMtype*( - *(ckt->CKTrhsOld+here->HICUMbaseNode)- - *(ckt->CKTrhsOld+here->HICUMemitNode)); - Vsc = model->HICUMtype*( - *(ckt->CKTrhsOld+here->HICUMsubsNode)- - *(ckt->CKTrhsOld+here->HICUMcollNode)); - Vbci = model->HICUMtype*( - *(ckt->CKTrhsOld+here->HICUMbaseNode)- - *(ckt->CKTrhsOld+here->HICUMcollCINode)); - Vbpe = model->HICUMtype*( - *(ckt->CKTrhsOld+here->HICUMbaseBPNode)- - *(ckt->CKTrhsOld+here->HICUMemitNode)); - Veie = model->HICUMtype*( - *(ckt->CKTrhsOld+here->HICUMemitEINode)- - *(ckt->CKTrhsOld+here->HICUMemitNode)); - Vcic = model->HICUMtype*( - *(ckt->CKTrhsOld+here->HICUMcollCINode)- - *(ckt->CKTrhsOld+here->HICUMcollNode)); - Vbbp = model->HICUMtype*( - *(ckt->CKTrhsOld+here->HICUMbaseNode)- - *(ckt->CKTrhsOld+here->HICUMbaseBPNode)); - Vsis = model->HICUMtype*( - *(ckt->CKTrhsOld+here->HICUMsubsSINode)- - *(ckt->CKTrhsOld+here->HICUMsubsNode)); - Vxf = *(ckt->CKTrhsOld + here->HICUMxfNode); - Vxf1 = *(ckt->CKTrhsOld + here->HICUMxf1Node); - Vxf2 = *(ckt->CKTrhsOld + here->HICUMxf2Node); - if (model->HICUMselfheat) { - Vrth = *(ckt->CKTrhsOld + here->HICUMtempNode); - } - //todo: maybe add ibiei_Vxf - ibieihat = *(ckt->CKTstate0 + here->HICUMibiei) + - *(ckt->CKTstate0 + here->HICUMibiei_Vbiei)*delvbiei+ - *(ckt->CKTstate0 + here->HICUMibiei_Vrth)*delvrth+ - *(ckt->CKTstate0 + here->HICUMibiei_Vbici)*delvbici; - ibicihat = *(ckt->CKTstate0 + here->HICUMibici) + - *(ckt->CKTstate0 + here->HICUMibici_Vbici)*delvbici+ - *(ckt->CKTstate0 + here->HICUMibici_Vrth)*delvrth+ - *(ckt->CKTstate0 + here->HICUMibici_Vbiei)*delvbiei; - ibpeihat = *(ckt->CKTstate0 + here->HICUMibpei) + - *(ckt->CKTstate0 + here->HICUMibpei_Vbpei)*delvbpei+ - *(ckt->CKTstate0 + here->HICUMibpei_Vrth)*delvrth; - ibpcihat = *(ckt->CKTstate0 + here->HICUMibpci) + - *(ckt->CKTstate0 + here->HICUMibpci_Vbpci)*delvbpci+ - *(ckt->CKTstate0 + here->HICUMibpci_Vrth)*delvrth; - icieihat = *(ckt->CKTstate0 + here->HICUMiciei) + - *(ckt->CKTstate0 + here->HICUMiciei_Vbiei)*delvbiei + - *(ckt->CKTstate0 + here->HICUMiciei_Vrth)*delvrth + - *(ckt->CKTstate0 + here->HICUMiciei_Vxf2)*delvxf2 + - *(ckt->CKTstate0 + here->HICUMiciei_Vbici)*delvbici; - ibpbihat = *(ckt->CKTstate0 + here->HICUMibpbi) + - *(ckt->CKTstate0 + here->HICUMibpbi_Vbpbi)*delvbpbi + - *(ckt->CKTstate0 + here->HICUMibpbi_Vrth)*delvrth + - *(ckt->CKTstate0 + here->HICUMibpbi_Vbiei)*delvbiei + - *(ckt->CKTstate0 + here->HICUMibpbi_Vbici)*delvbici; - isicihat = *(ckt->CKTstate0 + here->HICUMisici) + - *(ckt->CKTstate0 + here->HICUMisici_Vsici)*delvsici+ - *(ckt->CKTstate0 + here->HICUMisici_Vrth)*delvrth; - ibpsihat = *(ckt->CKTstate0 + here->HICUMibpsi) + - *(ckt->CKTstate0 + here->HICUMibpsi_Vbpci)*delvbpci + - *(ckt->CKTstate0 + here->HICUMibpsi_Vrth)*delvrth + - *(ckt->CKTstate0 + here->HICUMibpsi_Vsici)*delvsici; - ithhat = *(ckt->CKTstate0 + here->HICUMith) + - *(ckt->CKTstate0 + here->HICUMith_Vbiei)*delvbiei+ - *(ckt->CKTstate0 + here->HICUMith_Vbici)*delvbici+ - *(ckt->CKTstate0 + here->HICUMith_Vbpbi)*delvbpbi+ - *(ckt->CKTstate0 + here->HICUMith_Vbpci)*delvbpci+ - *(ckt->CKTstate0 + here->HICUMith_Vbpei)*delvbpei+ - *(ckt->CKTstate0 + here->HICUMith_Vciei)*delvciei+ - *(ckt->CKTstate0 + here->HICUMith_Vsici)*delvsici+ - *(ckt->CKTstate0 + here->HICUMith_Vcic)*delvcic+ - *(ckt->CKTstate0 + here->HICUMith_Vbbp)*delvbbp+ - *(ckt->CKTstate0 + here->HICUMith_Veie)*delveie+ - *(ckt->CKTstate0 + here->HICUMith_Vrth)*delvrth; - /* - * bypass if solution has not changed - */ - /* the following collections of if's would be just one - * if the average compiler could handle it, but many - * find the expression too complicated, thus the split. - * ... no bypass in case of selfheating - */ - if( (ckt->CKTbypass) && (!(ckt->CKTmode & MODEINITPRED)) && !model->HICUMselfheat && - (fabs(delvbiei) < (ckt->CKTreltol*MAX(fabs(Vbiei), - fabs(*(ckt->CKTstate0 + here->HICUMvbiei)))+ - ckt->CKTvoltTol)) ) - if( (fabs(delvbici) < ckt->CKTreltol*MAX(fabs(Vbici), - fabs(*(ckt->CKTstate0 + here->HICUMvbici)))+ - ckt->CKTvoltTol) ) - if( (fabs(delvbpei) < ckt->CKTreltol*MAX(fabs(Vbpei), - fabs(*(ckt->CKTstate0 + here->HICUMvbpei)))+ - ckt->CKTvoltTol) ) - if( (fabs(delvbpbi) < ckt->CKTreltol*MAX(fabs(Vbpbi), - fabs(*(ckt->CKTstate0 + here->HICUMvbpbi)))+ - ckt->CKTvoltTol) ) - if( (fabs(delvsici) < ckt->CKTreltol*MAX(fabs(Vsici), - fabs(*(ckt->CKTstate0 + here->HICUMvsici)))+ - ckt->CKTvoltTol) ) - if( (fabs(delvcic) < ckt->CKTreltol*MAX(fabs(Vcic), - fabs(*(ckt->CKTstate0 + here->HICUMvcic)))+ - ckt->CKTvoltTol) ) - if( (fabs(delvbbp) < ckt->CKTreltol*MAX(fabs(Vbbp), - fabs(*(ckt->CKTstate0 + here->HICUMvbbp)))+ - ckt->CKTvoltTol) ) - if( (fabs(delveie) < ckt->CKTreltol*MAX(fabs(Veie), - fabs(*(ckt->CKTstate0 + here->HICUMveie)))+ - ckt->CKTvoltTol) ) - if( (fabs(ibieihat-*(ckt->CKTstate0 + here->HICUMibiei)) < - ckt->CKTreltol* MAX(fabs(ibieihat), - fabs(*(ckt->CKTstate0 + here->HICUMibiei)))+ - ckt->CKTabstol) ) - if( (fabs(ibpeihat-*(ckt->CKTstate0 + here->HICUMibpei)) < - ckt->CKTreltol* MAX(fabs(ibpeihat), - fabs(*(ckt->CKTstate0 + here->HICUMibpei)))+ - ckt->CKTabstol) ) - if( (fabs(icieihat-*(ckt->CKTstate0 + here->HICUMiciei)) < - ckt->CKTreltol* MAX(fabs(icieihat), - fabs(*(ckt->CKTstate0 + here->HICUMiciei)))+ - ckt->CKTabstol) ) - if( (fabs(ibicihat-*(ckt->CKTstate0 + here->HICUMibici)) < - ckt->CKTreltol* MAX(fabs(ibicihat), - fabs(*(ckt->CKTstate0 + here->HICUMibici)))+ - ckt->CKTabstol) ) - if( (fabs(ibpcihat-*(ckt->CKTstate0 + here->HICUMibpci)) < - ckt->CKTreltol* MAX(fabs(ibpcihat), - fabs(*(ckt->CKTstate0 + here->HICUMibpci)))+ - ckt->CKTabstol) ) - if( (fabs(ibpbihat-*(ckt->CKTstate0 + here->HICUMibpbi)) < - ckt->CKTreltol* MAX(fabs(ibpbihat), - fabs(*(ckt->CKTstate0 + here->HICUMibpbi)))+ - ckt->CKTabstol) ) - if( (fabs(isicihat-*(ckt->CKTstate0 + here->HICUMisici)) < - ckt->CKTreltol* MAX(fabs(isicihat), - fabs(*(ckt->CKTstate0 + here->HICUMisici)))+ - ckt->CKTabstol) ) - if( (fabs(ithhat-*(ckt->CKTstate0 + here->HICUMith)) < - ckt->CKTreltol* MAX(fabs(ithhat), - fabs(*(ckt->CKTstate0 + here->HICUMith)))+ - ckt->CKTabstol) ) - if( (fabs(ibpsihat-*(ckt->CKTstate0 + here->HICUMibpsi)) < - ckt->CKTreltol* MAX(fabs(ibpsihat), - fabs(*(ckt->CKTstate0 + here->HICUMibpsi)))+ - ckt->CKTabstol) ) { - /* - * bypassing.... - */ - Vbiei = *(ckt->CKTstate0 + here->HICUMvbiei); - Vbici = *(ckt->CKTstate0 + here->HICUMvbici); - Vbpei = *(ckt->CKTstate0 + here->HICUMvbpei); - Vbpbi = *(ckt->CKTstate0 + here->HICUMvbpbi); - Vbpci = *(ckt->CKTstate0 + here->HICUMvbpci); - Vsici = *(ckt->CKTstate0 + here->HICUMvsici); - Vcic = *(ckt->CKTstate0 + here->HICUMvcic); - Vbbp = *(ckt->CKTstate0 + here->HICUMvbbp); - Veie = *(ckt->CKTstate0 + here->HICUMveie); - Vrth = *(ckt->CKTstate0 + here->HICUMvrth); - Vxf = *(ckt->CKTstate0 + here->HICUMvxf); - Vxf1 = *(ckt->CKTstate0 + here->HICUMvxf1); - Vxf2 = *(ckt->CKTstate0 + here->HICUMvxf2); - - Ibiei = *(ckt->CKTstate0 + here->HICUMibiei); - Ibiei_Vbiei = *(ckt->CKTstate0 + here->HICUMibiei_Vbiei); - Ibiei_Vxf = *(ckt->CKTstate0 + here->HICUMibiei_Vxf); - Ibiei_Vbici = *(ckt->CKTstate0 + here->HICUMibiei_Vbici); - Ibiei_Vrth = *(ckt->CKTstate0 + here->HICUMibiei_Vrth); - - Ibpei = *(ckt->CKTstate0 + here->HICUMibpei); - Ibpei_Vbpei = *(ckt->CKTstate0 + here->HICUMibpei_Vbpei); - Ibpei_Vrth = *(ckt->CKTstate0 + here->HICUMibpei_Vrth); - - Iciei = *(ckt->CKTstate0 + here->HICUMiciei); - Iciei_Vbiei = *(ckt->CKTstate0 + here->HICUMiciei_Vbiei); - Iciei_Vbici = *(ckt->CKTstate0 + here->HICUMiciei_Vbici); - Iciei_Vrth = *(ckt->CKTstate0 + here->HICUMiciei_Vrth); - Iciei_Vxf2 = *(ckt->CKTstate0 + here->HICUMiciei_Vxf2); - - Ibici = *(ckt->CKTstate0 + here->HICUMibici); - Ibici_Vbici = *(ckt->CKTstate0 + here->HICUMibici_Vbici); - Ibici_Vbiei = *(ckt->CKTstate0 + here->HICUMibici_Vbiei); - Ibici_Vrth = *(ckt->CKTstate0 + here->HICUMibici_Vrth); - - Ibpbi = *(ckt->CKTstate0 + here->HICUMibpbi); - Ibpbi_Vbpbi = *(ckt->CKTstate0 + here->HICUMibpbi_Vbpbi); - Ibpbi_Vbiei = *(ckt->CKTstate0 + here->HICUMibpbi_Vbiei); - Ibpbi_Vbici = *(ckt->CKTstate0 + here->HICUMibpbi_Vbici); - Ibpbi_Vrth = *(ckt->CKTstate0 + here->HICUMibpbi_Vrth); - - Isici = *(ckt->CKTstate0 + here->HICUMisici); - Isici_Vsici = *(ckt->CKTstate0 + here->HICUMisici_Vsici); - Isici_Vrth = *(ckt->CKTstate0 + here->HICUMisici_Vrth); - - Ibpsi = *(ckt->CKTstate0 + here->HICUMibpsi); - Ibpsi_Vbpci = *(ckt->CKTstate0 + here->HICUMibpsi_Vbpci); - Ibpsi_Vsici = *(ckt->CKTstate0 + here->HICUMibpsi_Vsici); - Ibpsi_Vrth = *(ckt->CKTstate0 + here->HICUMibpsi_Vrth); - - Ibpci = *(ckt->CKTstate0 + here->HICUMibpci); - Ibpci_Vbpci = *(ckt->CKTstate0 + here->HICUMibpci_Vbpci); - Ibpci_Vrth = *(ckt->CKTstate0 + here->HICUMibpci_Vrth); - - //dead assign: - //Ieie = *(ckt->CKTstate0 + here->HICUMieie); - Ieie_Vrth = *(ckt->CKTstate0 + here->HICUMieie_Vrth); - - Isis_Vsis = *(ckt->CKTstate0 + here->HICUMisis_Vsis); - - gqbepar1 = *(ckt->CKTstate0 + here->HICUMgqbepar1); - gqbepar2 = *(ckt->CKTstate0 + here->HICUMgqbepar2); - gqbcpar1 = *(ckt->CKTstate0 + here->HICUMgqbcpar1); - gqbcpar2 = *(ckt->CKTstate0 + here->HICUMgqbcpar2); - - Ixf = *(ckt->CKTstate0 + here->HICUMixf) ; - Ixf_Vbiei = *(ckt->CKTstate0 + here->HICUMixf_Vbiei) ; - Ixf_Vbici = *(ckt->CKTstate0 + here->HICUMixf_Vbici) ; - Ixf_Vxf = *(ckt->CKTstate0 + here->HICUMixf_Vxf) ; - Ixf_dT = *(ckt->CKTstate0 + here->HICUMixf_Vrth) ; - Ixf1 = *(ckt->CKTstate0 + here->HICUMixf1) ; - Ixf1_Vbiei = *(ckt->CKTstate0 + here->HICUMixf1_Vbiei) ; - Ixf1_Vbici = *(ckt->CKTstate0 + here->HICUMixf1_Vbici) ; - Ixf1_Vxf2 = *(ckt->CKTstate0 + here->HICUMixf1_Vxf2) ; - Ixf1_Vxf1 = *(ckt->CKTstate0 + here->HICUMixf1_Vxf1) ; - Ixf1_dT = *(ckt->CKTstate0 + here->HICUMixf1_Vrth) ; - Ixf2 = *(ckt->CKTstate0 + here->HICUMixf2) ; - Ixf2_Vbiei = *(ckt->CKTstate0 + here->HICUMixf2_Vbiei) ; - Ixf2_Vbici = *(ckt->CKTstate0 + here->HICUMixf2_Vbici) ; - Ixf2_Vxf1 = *(ckt->CKTstate0 + here->HICUMixf2_Vxf1) ; - Ixf2_Vxf2 = *(ckt->CKTstate0 + here->HICUMixf2_Vxf2) ; - Ixf2_dT = *(ckt->CKTstate0 + here->HICUMixf2_Vrth) ; - - goto load; - } - /* - * limit nonlinear branch voltages - */ - ichk1 = 1, ichk2 = 1, ichk3 = 1, ichk4 = 1, ichk5=1, ichk6 = 0; - Vbiei = DEVpnjlim(Vbiei,*(ckt->CKTstate0 + here->HICUMvbiei),here->HICUMvt.rpart, - here->HICUMtVcrit,&icheck); - Vaval = 3 * here->HICUMvdci_t.rpart;//limit step around 3*vdci_t -> somehow this brings convergence - if ((model->HICUMfavlGiven) && (Vbici < MIN(0, -Vaval))) { - Vbici_temp = -(Vbici + Vaval); - Vbici_temp = DEVpnjlim( - Vbici_temp, - -(*(ckt->CKTstate0 + here->HICUMvbici) + Vaval), - here->HICUMvt.rpart, - here->HICUMtVcrit, - &ichk1 - ); - Vbici = -(Vbici_temp + Vaval); - } else { - Vbici = DEVpnjlim(Vbici,*(ckt->CKTstate0 + here->HICUMvbici),here->HICUMvt.rpart, - here->HICUMtVcrit,&ichk1); - } - Vbpei = DEVpnjlim(Vbpei,*(ckt->CKTstate0 + here->HICUMvbpei),here->HICUMvt.rpart, - here->HICUMtVcrit,&ichk2); - Vbpci = DEVpnjlim(Vbpci,*(ckt->CKTstate0 + here->HICUMvbpci),here->HICUMvt.rpart, - here->HICUMtVcrit,&ichk3); - Vsici = DEVpnjlim(Vsici,*(ckt->CKTstate0 + here->HICUMvsici),here->HICUMvt.rpart, - here->HICUMtVcrit,&ichk4); - Vbpbi = DEVpnjlim(Vbpbi,*(ckt->CKTstate0 + here->HICUMvbpbi),here->HICUMvt.rpart, - here->HICUMtVcrit,&ichk5); - if (model->HICUMselfheat) { - Vrth = DEVlimitlog(Vrth, - *(ckt->CKTstate0 + here->HICUMvrth),1,&ichk6); - } - if ((ichk1 == 1) || (ichk2 == 1) || (ichk3 == 1) || (ichk4 == 1) || (ichk5 == 1) || (ichk6 == 1)) icheck=1; - } - /* - * determine dc current and derivatives - */ - Vbiei = model->HICUMtype*Vbiei; - Vbici = model->HICUMtype*Vbici; - Vciei = (Vbiei-Vbici); - Vbpei = model->HICUMtype*Vbpei; - Vbpci = model->HICUMtype*Vbpci; - Vbci = model->HICUMtype*Vbci; - Vsici = model->HICUMtype*Vsici; - Vsc = model->HICUMtype*Vsc; - - // Thermal update - if (model->HICUMselfheat) { - Temp = here->HICUMtemp+Vrth; - hicum_thermal_update(model, here, &Temp, &Tdev_Vrth); - - here->HICUMdtemp_sh = Temp - here->HICUMtemp; - here->HICUMtemp_Vrth = Tdev_Vrth; - } else { - Temp = here->HICUMtemp; - Tdev_Vrth = 0; - here->HICUMdtemp_sh = 0; - here->HICUMtemp_Vrth = 0; - } - - Temp_dual = Temp + 1_e*Tdev_Vrth; - - // Model_evaluation - - //Intrinsic transistor - //Internal base currents across b-e junction - hicum_diode(Temp_dual,here->HICUMibeis_t,model->HICUMmbei, Vbiei, &ibei, &ibei_Vbiei, &ibei_dT); - hicum_diode(Temp_dual,here->HICUMireis_t,model->HICUMmrei, Vbiei, &irei, &irei_Vbiei, &irei_dT); - - //Internal b-e and b-c junction capacitances and charges - //Cjei = ddx(Qjei,V(bi)); - hicum_qjmodf(Temp_dual,here->HICUMcjei0_t,here->HICUMvdei_t,model->HICUMzei,here->HICUMajei_t,Vbiei,&Cjei,&Cjei_Vbiei, &Cjei_dT,&Qjei, &Qjei_Vbiei, &Qjei_dT); - - result = calc_hjei_vbe(Vbiei+1_e, Temp, here, model); - hjei_vbe = result.rpart(); - hjei_vbe_Vbiei = result.dpart(); - result = calc_hjei_vbe(Vbiei, Temp_dual, here, model); - hjei_vbe_dT = result.dpart(); - - - //Cjci = ddx(Qjci,V(bi)); - hicum_HICJQ(Temp_dual, here->HICUMcjci0_t,here->HICUMvdci_t,model->HICUMzci,here->HICUMvptci_t, Vbici, &Cjci, &Cjci_Vbici, &Cjci_dT, &Qjci, &Qjci_Vbici, &Qjci_dT); - - //Hole charge at low bias - result = calc_Q_0(Temp , Qjei+1_e*Qjei_Vbiei, Qjci, hjei_vbe+1_e*hjei_vbe_Vbiei); - Q_0 = result.rpart(); - Q_0_Vbiei = result.dpart(); - - result = calc_Q_0(Temp , Qjei, Qjci+1_e*Qjci_Vbici, hjei_vbe); - Q_0_Vbici = result.dpart(); - - result = calc_Q_0(Temp_dual , Qjei+1_e*Qjei_dT, Qjci+1_e*Qjci_dT, hjei_vbe+1_e*hjei_vbe_dT); - Q_0_dT = result.dpart(); - - //Transit time calculation at low current density - result = calc_T_f0(Temp, Vbici+1_e); - T_f0 = result.rpart(); - T_f0_Vbici = result.dpart(); - - result = calc_T_f0(Temp_dual, Vbici); - T_f0_dT = result.dpart() ; - - //Critical current - result = calc_ick(Temp, Vciei+1_e); - ick = result.rpart(); - ick_Vciei = result.dpart(); - - result = calc_ick(Temp_dual, Vciei); - ick_dT = result.dpart(); - - here->HICUMick = ick; - - //begin Q_pT calculation - - //Initial formulation of forward and reverse component of transfer current - - Tr = model->HICUMtr; - - //begin initial transfer current calculations -> itf, itr, Qf, Qr------------ - calc_it_initial(Temp_dual, Vbiei , Vbici , Q_0+1_e*Q_0_dT , T_f0+1_e*T_f0_dT , ick+1_e*ick_dT , &result_itf, &result_itr, &result_Qf, &result_Qr, &result_Q_bf, &result_a_h, &result_Q_p, &result_Tf); - itf = result_itf.rpart(); - itr = result_itr.rpart(); - Qf = result_Qf.rpart(); - Qr = result_Qr.rpart(); - Q_bf = result_Q_bf.rpart(); - a_h = result_a_h.rpart(); //needed to check if newton iteration needed - Q_p = result_Q_p.rpart(); //needed to check if newton iteration needed - Tf = result_Tf.rpart(); //needed to check if newton iteration needed - // dead assign: - //itf_dT = result_itf.dpart(); - //itr_dT = result_itr.dpart(); - //Qf_dT = result_Qf.dpart(); - //Qr_dT = result_Qr.dpart(); - //Q_bf_dT= result_Q_bf.dpart(); - //Tf_dT = result_Tf.dpart(); - - if (!(Qf > RTOLC*Q_p || a_h > RTOLC)) { // in this case the newton is not run and the derivatives of the initial solution are needed - calc_it_initial(Temp_dual, Vbiei , Vbici , Q_0+1_e*Q_0_dT , T_f0+1_e*T_f0_dT , ick+1_e*ick_dT , &result_itf, &result_itr, &result_Qf, &result_Qr, &result_Q_bf, &result_a_h, &result_Q_p, &result_Tf); - itf_dT = result_itf.dpart(); - itr_dT = result_itr.dpart(); - Qf_dT = result_Qf.dpart(); - Qr_dT = result_Qr.dpart(); - Q_bf_dT = result_Q_bf.dpart(); - Tf_dT = result_Tf.dpart(); - - calc_it_initial(Temp , Vbiei+1_e, Vbici , Q_0+1_e*Q_0*Vbiei , T_f0 , ick+1_e*ick_Vciei , &result_itf, &result_itr, &result_Qf, &result_Qr, &result_Q_bf, &result_a_h, &result_Q_p, &result_Tf); - itf_Vbiei = result_itf.dpart(); - itr_Vbiei = result_itr.dpart(); - Qf_Vbiei = result_Qf.dpart(); - Qr_Vbiei = result_Qr.dpart(); - Q_bf_Vbiei = result_Q_bf.dpart(); - Tf_Vbiei = result_Tf.dpart(); - - calc_it_initial(Temp , Vbiei , Vbici+1_e, Q_0+1_e*Q_0_Vbici , T_f0+1_e*T_f0_Vbici , ick-1_e*ick_Vciei , &result_itf, &result_itr, &result_Qf, &result_Qr, &result_Q_bf, &result_a_h, &result_Q_p, &result_Tf); - itf_Vbici = result_itf.dpart(); - itr_Vbici = result_itr.dpart(); - Qf_Vbici = result_Qf.dpart(); - Qr_Vbici = result_Qr.dpart(); - Q_bf_Vbici= result_Q_bf.dpart(); - Tf_Vbici = result_Tf.dpart(); - - } else { //Newton needed - result = calc_it(Temp_dual, Vbiei , Vbici , Q_0+1_e*Q_0_dT , T_f0+1_e*T_f0_dT , ick+1_e*ick_dT ); - Q_pT = result.rpart(); - Q_pT_dT = result.dpart(); - result = calc_it(Temp , Vbiei+1_e, Vbici , Q_0+1_e*Q_0_Vbiei , T_f0 , ick+1_e*ick_Vciei ); - Q_pT_dVbiei = result.dpart(); - result = calc_it(Temp , Vbiei , Vbici+1_e, Q_0+1_e*Q_0_Vbici , T_f0+1_e*T_f0_Vbici , ick-1_e*ick_Vciei ); - Q_pT_dVbici = result.dpart(); - - //end Q_pT ------------------------------------------------------------------------------- - - //begin final transfer current calculations -> itf, itr, Qf, Qr------------ - calc_it_final(Temp_dual, Vbiei , Vbici , Q_pT+1_e*Q_pT_dT , T_f0+1_e*T_f0_dT , ick+1_e*ick_dT , &result_itf, &result_itr, &result_Qf, &result_Qr, &result_Q_bf, &result_Tf); - itf = result_itf.rpart(); - itr = result_itr.rpart(); - Qf = result_Qf.rpart(); - Qr = result_Qr.rpart(); - Q_bf = result_Q_bf.rpart(); - Tf = result_Tf.rpart(); - itf_dT = result_itf.dpart(); - itr_dT = result_itr.dpart(); - Qf_dT = result_Qf.dpart(); - Qr_dT = result_Qr.dpart(); - Q_bf_dT= result_Q_bf.dpart(); - Tf_dT = result_Tf.dpart(); - - calc_it_final(Temp , Vbiei+1_e , Vbici , Q_pT+1_e*Q_pT_dVbiei , T_f0 , ick+1_e*ick_Vciei , &result_itf, &result_itr, &result_Qf, &result_Qr, &result_Q_bf, &result_Tf); - itf_Vbiei = result_itf.dpart(); - itr_Vbiei = result_itr.dpart(); - Qf_Vbiei = result_Qf.dpart(); - Qr_Vbiei = result_Qr.dpart(); - Q_bf_Vbiei = result_Q_bf.dpart(); - Tf_Vbiei = result_Tf.dpart(); - - calc_it_final(Temp , Vbiei , Vbici+1_e, Q_pT+1_e*Q_pT_dVbici , T_f0+1_e*T_f0_Vbici , ick-1_e*ick_Vciei , &result_itf, &result_itr, &result_Qf, &result_Qr, &result_Q_bf, &result_Tf); - itf_Vbici = result_itf.dpart(); - itr_Vbici = result_itr.dpart(); - Qf_Vbici = result_Qf.dpart(); - Qr_Vbici = result_Qr.dpart(); - Q_bf_Vbici= result_Q_bf.dpart(); - Tf_Vbici = result_Tf.dpart(); - - } - - // finally the transfer current - it = itf - itr; - it_Vbiei = itf_Vbiei - itr_Vbiei; - it_Vbici = itf_Vbici - itr_Vbici; - it_dT = itf_dT - itr_dT; - - //end final calculations -------------------------------------------------- - - here->HICUMtf = Tf; - - //NQS effect implemented with gyrator network - //Once the delay in ITF is considered, IT_NQS is calculated afterwards - - //Diffusion charges for further use (remember derivatives if this will be used someday) - Qdei = Qf; - Qdei_Vbici = Qf_Vbici; - Qdei_Vbiei = Qf_Vbiei; - Qdei_dT = Qf_dT; - //Qdci = Qr; //we just use Qr herein - - //High-frequency emitter current crowding (lateral NQS) - Cdei = T_f0*itf/here->HICUMvt.rpart; - Cdei_Vbiei = T_f0*itf_Vbiei/here->HICUMvt.rpart; - Cdei_Vbici = T_f0_Vbici*itf/here->HICUMvt.rpart; - Cdei_Vbici+= T_f0*itf_Vbici/here->HICUMvt.rpart; - Cdei_Vrth = T_f0_dT*itf/here->HICUMvt.rpart + T_f0*itf_dT/here->HICUMvt.rpart - T_f0*itf/here->HICUMvt.rpart/here->HICUMvt.rpart*here->HICUMvt.dpart; - - Cdci = model->HICUMtr*itr/here->HICUMvt.rpart; - Cdci_Vbiei = model->HICUMtr*itr_Vbiei/here->HICUMvt.rpart; - Cdci_Vbici = model->HICUMtr*itr_Vbici/here->HICUMvt.rpart; - Cdci_Vrth = model->HICUMtr*itr_dT/here->HICUMvt.rpart - model->HICUMtr*itr/here->HICUMvt.rpart/here->HICUMvt.rpart*here->HICUMvt.dpart; - - Crbi = model->HICUMfcrbi*(Cjei+Cjci+Cdei+Cdci); - Crbi_Vrth = model->HICUMfcrbi*(Cjei_dT+Cjci_dT+Cdei_Vrth+Cdci_Vrth); - Crbi_Vbiei = model->HICUMfcrbi*(Cjei_Vbiei+Cdei_Vbiei+Cdci_Vbiei); - Crbi_Vbici = model->HICUMfcrbi*(Cjci_Vbici+Cdei_Vbici+Cdci_Vbici); - - Qrbi = Crbi*Vbpbi; //Vbpbi=(Vbpei-Vbiei)=(Vbpci-Vbici) - Qrbi_Vbpbi = Crbi; - Qrbi_Vbiei = Vbpbi*Crbi_Vbiei; - Qrbi_Vbici = Vbpbi*Crbi_Vbici; - Qrbi_Vrth = Vbpbi*Crbi_Vrth; - - //HICCR: } - - //Internal base current across b-c junction - hicum_diode(Temp_dual,here->HICUMibcis_t,model->HICUMmbci, Vbici, &ibci, &ibci_Vbici, &ibci_dT); - - //Avalanche current - result = calc_iavl(Vbici+1_e, Cjci+1_e*Cjci_Vbici, itf+1_e*itf_Vbici , Temp); - iavl = result.rpart(); - iavl_Vbici = result.dpart(); - - result = calc_iavl(Vbici, Cjci, itf+1_e*itf_Vbiei , Temp); - iavl_Vbiei = result.dpart(); - - result = calc_iavl(Vbici , Cjci+1_e*Cjci_dT , itf+1_e*itf_dT , Temp_dual); - iavl_dT = result.dpart(); - - here->HICUMiavl = iavl; - - //Excess base current from recombination at the b-c barrier - ibh_rec = Q_bf*Otbhrec; - ibh_rec_Vbiei = Otbhrec*Q_bf_Vbiei ; - ibh_rec_Vbici = Otbhrec*Q_bf_Vbici ; - ibh_rec_dT = Otbhrec*Q_bf_dT ; - - //internal base resistance - result = calc_rbi(Temp_dual, Qjei+1_e*Qjei_dT , Qf+1_e*Qf_dT ); - rbi = result.rpart(); - rbi_dT = result.dpart(); - - result = calc_rbi(Temp, Qjei+1_e*Qjei_Vbiei , Qf+1_e*Qf_Vbiei ); - rbi_Vbiei = result.dpart(); - - result = calc_rbi(Temp, Qjei , Qf+1_e*Qf_Vbici ); - rbi_Vbici = result.dpart(); - - here->HICUMrbi = rbi; - - //Base currents across peripheral b-e junction - hicum_diode(Temp_dual,here->HICUMibeps_t,model->HICUMmbep, Vbpei, &ibep, &ibep_Vbpei, &ibep_dT); - hicum_diode(Temp_dual,here->HICUMireps_t,model->HICUMmrep, Vbpei, &irep, &irep_Vbpei, &irep_dT); - - //Peripheral b-e junction capacitance and charge - hicum_qjmodf(Temp_dual,here->HICUMcjep0_t,here->HICUMvdep_t,model->HICUMzep,here->HICUMajep_t,Vbpei,&Cjep,&Cjep_Vbpei, &Cjep_dT,&Qjep, &Qjep_Vbpei, &Qjep_dT); - - //Tunneling current - result = calc_ibet(Vbiei , Vbpei+1_e, Temp); - ibet = result.rpart(); - ibet_Vbpei = result.dpart(); - - result = calc_ibet(Vbiei+1_e, Vbpei, Temp); - ibet_Vbiei = result.dpart(); - - result = calc_ibet(Vbiei , Vbpei, Temp_dual); - ibet_dT = result.dpart(); - - //Base currents across peripheral b-c junction (bp,ci) - hicum_diode(Temp_dual,here->HICUMibcxs_t,model->HICUMmbcx, Vbpci, &ijbcx, &ijbcx_Vbpci, &ijbcx_dT); - - //Depletion capacitance and charge at external b-c junction (b,ci) - hicum_HICJQ(Temp_dual, here->HICUMcjcx01_t,here->HICUMvdcx_t,model->HICUMzcx,here->HICUMvptcx_t, Vbci, &Cjcx_i, &Cjcx_i_Vbci, &Cjcx_i_dT, &Qjcx_i, &Qjcx_i_Vbci, &Qjcx_i_dT); - - //Depletion capacitance and charge at peripheral b-c junction (bp,ci) - hicum_HICJQ(Temp_dual, here->HICUMcjcx02_t,here->HICUMvdcx_t,model->HICUMzcx,here->HICUMvptcx_t, Vbpci, &Cjcx_ii, &Cjcx_ii_Vbpci, &Cjcx_ii_dT, &Qjcx_ii, &Qjcx_ii_Vbpci, &Qjcx_ii_dT); - - //Depletion substrate capacitance and charge at inner s-c junction (si,ci) - hicum_HICJQ(Temp_dual, here->HICUMcjs0_t,here->HICUMvds_t,model->HICUMzs,here->HICUMvpts_t, Vsici, &Cjs, &Cjs_Vsici, &Cjs_dT, &Qjs, &Qjs_Vsici, &Qjs_dT); - /* - * Peripheral substrate capacitance and charge at s-c junction (s,c) - * Bias dependent only if model->HICUMvdsp > 0 - */ - if (model->HICUMvdsp > 0) { - hicum_HICJQ(Temp_dual, here->HICUMcscp0_t,here->HICUMvdsp_t,model->HICUMzsp,here->HICUMvptsp_t, Vsc, &Cscp, &Cscp_Vsc, &Cscp_dT, &Qscp, &Qscp_Vsc, &Qscp_dT); - } else { - // Constant, temperature independent capacitance - Cscp = model->HICUMcscp0; - Cscp_Vsc = 0; - Cscp_dT = 0; - Qscp = model->HICUMcscp0*Vsc; - Qscp_Vsc = model->HICUMcscp0; - Qscp_dT = 0; - } - - //Parasitic substrate transistor transfer current and diffusion charge - calc_itss(Temp_dual, Vbpci , Vsici , &result_HSI_TSU, &result_Qdsu); - HSI_Tsu = result_HSI_TSU.rpart(); - Qdsu = result_Qdsu.rpart(); - HSI_Tsu_dT = result_HSI_TSU.dpart(); - Qdsu_dT = result_Qdsu.dpart(); - - calc_itss(Temp , Vbpci+1_e, Vsici , &result_HSI_TSU, &result_Qdsu); - HSI_Tsu_Vbpci = result_HSI_TSU.dpart(); - Qdsu_Vbpci = result_Qdsu.dpart(); - calc_itss(Temp , Vbpci , Vsici+1_e, &result_HSI_TSU, &result_Qdsu); - HSI_Tsu_Vsici = result_HSI_TSU.dpart(); - Qdsu_Vsici = result_Qdsu.dpart(); - - // Current gain computation for correlated noise implementation - if (ibei > 0.0) { - here->HICUMbetadc=it/ibei; - } else { - here->HICUMbetadc=0.0; - } - if (here->HICUMre_t.rpart >= MIN_R) { - Ieie = Veie/here->HICUMre_t.rpart; // only needed for re flicker noise - } else { - Ieie = 0.0; - } - - //Diode current for s-c junction (si,ci) - hicum_diode(Temp_dual,here->HICUMiscs_t,model->HICUMmsc, Vsici, &ijsc, &ijsc_Vsici, &ijsc_Vrth); - - // Self-heating calculation - if (model->HICUMflsh == 1 && here->HICUMrth_scaled >= MIN_R) { - pterm = (Vbiei-Vbici)*it + (here->HICUMvdci_t.rpart-Vbici)*iavl; - pterm_dT = (Vbiei-Vbici)*it_dT + (here->HICUMvdci_t.rpart-Vbici)*iavl_dT + here->HICUMvdci_t.dpart*iavl; - } else if (model->HICUMflsh == 2 && here->HICUMrth_scaled >= MIN_R) { - pterm = (Vbiei-Vbici)*it + (here->HICUMvdci_t.rpart-Vbici)*iavl + ibei*Vbiei + ibci*Vbici + ibep*Vbpei + ijbcx*Vbpci + ijsc*Vsici; - pterm_dT = (Vbiei-Vbici)*it_dT + (here->HICUMvdci_t.rpart-Vbici)*iavl_dT + here->HICUMvdci_t.dpart*iavl + - ibei_dT*Vbiei + ibci_dT*Vbici + ibep_dT*Vbpei + ijbcx_dT*Vbpci + ijsc_Vrth*Vsici; - - if (rbi > 0.0) { - pterm += Vbpbi*Vbpbi/rbi; - pterm_dT += -Vbpbi*Vbpbi*rbi_dT/rbi/rbi; - } - if (here->HICUMre_t.rpart >= MIN_R) { - pterm += Veie*Veie/here->HICUMre_t.rpart; - pterm_dT += -Veie*Veie*here->HICUMre_t.dpart/here->HICUMre_t.rpart/here->HICUMre_t.rpart; - } - if (here->HICUMrcx_t.rpart >= MIN_R) { - pterm += Vcic*Vcic/here->HICUMrcx_t.rpart; - pterm_dT += -Vcic*Vcic*here->HICUMrcx_t.dpart/here->HICUMrcx_t.rpart/here->HICUMrcx_t.rpart; - } - if (here->HICUMrbx_t.rpart >= MIN_R) { - pterm += Vbbp*Vbbp/here->HICUMrbx_t.rpart; - pterm_dT += -Vbbp*Vbbp*here->HICUMrbx_t.dpart/here->HICUMrbx_t.rpart/here->HICUMrbx_t.rpart; - } - } else { - pterm = 0; // default value... - pterm_dT = 0; - } - here->HICUMpterm = pterm; - - Itxf = itf; - Itxf_Vbici = itf_Vbici; - Itxf_Vbiei = itf_Vbiei; - Itxf_dT = itf_dT; - Itxf_Vxf2 = 0.0; - Qdeix = Qdei; - Qdeix_Vbiei = Qdei_Vbiei; - Qdeix_Vbici = Qdei_Vbici; - Qdeix_dT = Qdei_dT; - Qdeix_Vxf = 0.0; - - // Excess Phase calculation -> hand implementation instead of dual numbers - if (model->HICUMnqs) { // && (ckt->CKTmode & (MODETRAN | MODEAC) ) ) { //evaluate nqs network only in TRANSIENT and AC modes. - Ixf1 = (Vxf2-itf)/Tf*model->HICUMt0; - Ixf1_Vxf1 = 0.0; - Ixf1_Vxf2 = 1.0/Tf*model->HICUMt0; - Ixf1_ditf = -Ixf1_Vxf2; - Ixf1_dTf = -Ixf1/Tf; //Tf(Vbiei,Vciei=Vbiei-Vbici) - Ixf1_Vbiei = Ixf1_ditf*itf_Vbiei + Ixf1_dTf*Tf_Vbiei; - Ixf1_Vbici = Ixf1_ditf*itf_Vbici + Ixf1_dTf*Tf_Vbici; - Ixf1_dT = Ixf1_ditf*itf_dT + Ixf1_dTf*Tf_dT; - - Ixf2 = (Vxf2-Vxf1)/Tf*model->HICUMt0; - Ixf2_Vxf2 = 1.0/Tf*model->HICUMt0; - Ixf2_Vxf1 = -Ixf2_Vxf2; - Ixf2_dTf = -Ixf2/Tf; - Ixf2_Vbiei = Ixf2_dTf*Tf_Vbiei; - Ixf2_Vbici = Ixf2_dTf*Tf_Vbici; - Ixf2_dT = Ixf2_dTf*Tf_dT; - - Qxf1 = model->HICUMalit*model->HICUMt0*Vxf1; - Qxf1_Vxf1 = model->HICUMalit*model->HICUMt0; - Qxf2 = model->HICUMalit*model->HICUMt0*Vxf2/3; - Qxf2_Vxf2 = model->HICUMalit*model->HICUMt0/3; - - Itxf = Vxf2; - Itxf_Vbiei = 0; - Itxf_Vbici = 0; - Itxf_dT = 0; - Itxf_Vxf2 = 1.0; - - Ixf = (Vxf - Qdei)*model->HICUMt0/Tf; //for RC nw - Ixf_Vxf = 1.0*model->HICUMt0/Tf; - Ixf_Qdei = -Ixf_Vxf; - Ixf_Tf = -Ixf/Tf; - Ixf_Vbiei = Ixf_Tf*Tf_Vbiei + Ixf_Qdei * Qdei_Vbiei; - Ixf_Vbici = Ixf_Tf*Tf_Vbici + Ixf_Qdei * Qdei_Vbici; - Ixf_dT = Ixf_Tf*Tf_dT + Ixf_Qdei * Qdei_dT; - - Qxf = model->HICUMalqf*model->HICUMt0*Vxf; //for RC nw - Qxf_Vxf = model->HICUMalqf*model->HICUMt0; //for RC nw - - Qdeix = Vxf; //for RC nw - Qdeix_Vxf = 1.0; - Qdeix_Vbiei = 0; - Qdeix_Vbici = 0; - Qdeix_dT = 0; - } else { - Ixf1 = Vxf1; - Ixf1_Vxf1 = 1.0; - Ixf1_Vxf2 = 0; - // dead assign: - //Ixf1_ditf = 0; - //Ixf1_dTf = 0; - Ixf1_Vbiei = 0; - Ixf1_Vbici = 0; - Ixf1_dT = 0; - - Ixf2 = Vxf2; - Ixf2_Vxf2 = 1.0; - Ixf2_Vxf1 = 0; - // dead assign: - //Ixf2_dTf = 0; - Ixf2_Vbiei = 0; - Ixf2_Vbici = 0; - Ixf2_dT = 0; - - Qxf1 = 0; - Qxf1_Vxf1 = 0; - - Qxf2 = 0; - Qxf2_Vxf2 = 0; - - Ixf = Vxf; - Ixf_Vxf = 1.0; - // dead assign: - //Ixf_Tf = 0; - //Ixf_Qdei = 0; - Ixf_Vbiei = 0; - Ixf_Vbici = 0; - Ixf_dT = 0; - - Qxf = 0; - Qxf_Vxf = 0; - - } - - // end of Model_evaluation - - //resistors - if(model->HICUMrcxGiven && model->HICUMrcx != 0) { - Icic_Vcic = 1/here->HICUMrcx_t.rpart; - Icic_Vrth = -Vcic*here->HICUMrcx_t.dpart/here->HICUMrcx_t.rpart/here->HICUMrcx_t.rpart; - } else { - Icic_Vcic = 0.0; - Icic_Vrth = 0.0; - } - if(model->HICUMrbxGiven && model->HICUMrbx != 0) { - Ibbp_Vbbp = 1/here->HICUMrbx_t.rpart; - Ibbp_Vrth = -Vbbp*here->HICUMrbx_t.dpart/here->HICUMrbx_t.rpart/here->HICUMrbx_t.rpart; - } else { - Ibbp_Vbbp = 0.0; - Ibbp_Vrth = 0.0; - } - if(model->HICUMreGiven && model->HICUMre != 0) { - Ieie_Veie = 1/here->HICUMre_t.rpart; - Ieie_Vrth = -Veie*here->HICUMre_t.dpart /here->HICUMre_t.rpart/here->HICUMre_t.rpart; - } else { - Ieie_Veie = 0.0; - Ieie_Vrth = 0.0; - } - if(model->HICUMrsuGiven && model->HICUMrsu != 0) { - Isis_Vsis = 1/model->HICUMrsu*here->HICUMm; - } else { - Isis_Vsis = 0.0; - } - if(model->HICUMselfheat){ - Irth_Vrth = (1/here->HICUMrth_t.rpart - Vrth/(here->HICUMrth_t.rpart*here->HICUMrth_t.rpart) * here->HICUMrth_t.dpart); - } else { - Irth_Vrth = 0.0; - } - - Ibpei = model->HICUMtype*ibep; - Ibpei += model->HICUMtype*irep; - Ibpei_Vbpei = model->HICUMtype*ibep_Vbpei; - Ibpei_Vbpei += model->HICUMtype*irep_Vbpei; - Ibpei_Vrth = model->HICUMtype*ibep_dT; - Ibpei_Vrth += model->HICUMtype*irep_dT; - - Ibiei = model->HICUMtype*ibei; - Ibiei_Vbiei = model->HICUMtype*ibei_Vbiei; - Ibiei_Vrth = model->HICUMtype*ibei_dT; - Ibiei += model->HICUMtype*irei; - Ibiei_Vbiei += model->HICUMtype*irei_Vbiei; - Ibiei_Vrth += model->HICUMtype*irei_dT; - Ibiei += model->HICUMtype*ibh_rec; - Ibiei_Vbiei += model->HICUMtype*ibh_rec_Vbiei; - Ibiei_Vrth += model->HICUMtype*ibh_rec_dT; - Ibiei_Vbici = model->HICUMtype*ibh_rec_Vbici; - - if (model->HICUMtunode==1.0) { - Ibpei += -model->HICUMtype*ibet; - Ibpei_Vbpei += -model->HICUMtype*ibet_Vbpei; - Ibpei_Vrth += -model->HICUMtype*ibet_dT; - } else { - Ibiei += -model->HICUMtype*ibet; - Ibiei_Vbiei += -model->HICUMtype*ibet_Vbiei; - Ibiei_Vrth += -model->HICUMtype*ibet_dT; - } - - Ibpsi = model->HICUMtype*HSI_Tsu; - Ibpsi_Vbpci = model->HICUMtype*HSI_Tsu_Vbpci; - Ibpsi_Vsici = model->HICUMtype*HSI_Tsu_Vsici; - Ibpsi_Vrth = model->HICUMtype*HSI_Tsu_dT; - - Ibpci = model->HICUMtype*ijbcx; - Ibpci_Vbpci = model->HICUMtype*ijbcx_Vbpci; - Ibpci_Vrth = model->HICUMtype*ijbcx_dT; - - Ibici = model->HICUMtype*(ibci - iavl); - Ibici_Vbici = model->HICUMtype*(ibci_Vbici - iavl_Vbici); - Ibici_Vbiei = model->HICUMtype*( - iavl_Vbiei); - Ibici_Vrth = model->HICUMtype*(ibci_dT - iavl_dT); - - Isici = model->HICUMtype*ijsc; - Isici_Vsici = model->HICUMtype*ijsc_Vsici; - Isici_Vrth = model->HICUMtype*ijsc_Vrth; - - Iciei = model->HICUMtype*(Itxf - itr); - Iciei_Vbiei = model->HICUMtype*(Itxf_Vbiei - itr_Vbiei); - Iciei_Vbici = model->HICUMtype*(Itxf_Vbici - itr_Vbici); - Iciei_Vrth = model->HICUMtype*(Itxf_dT - itr_dT); - Iciei_Vxf2 = model->HICUMtype*Itxf_Vxf2; - - if (rbi > 0.0) { - Ibpbi = Vbpbi / rbi; - Ibpbi_Vbpbi = 1 / rbi; - Ibpbi_Vbiei = -Vbpbi * rbi_Vbiei / (rbi*rbi); - Ibpbi_Vbici = -Vbpbi * rbi_Vbici / (rbi*rbi); - Ibpbi_Vrth = -Vbpbi * rbi_dT / (rbi*rbi); - } else { - // fallback in case bp-bi nodes are collapsed - Ibpbi = 0.0; - Ibpbi_Vbpbi = 0.0; - Ibpbi_Vbiei = 0.0; - Ibpbi_Vbici = 0.0; - Ibpbi_Vrth = 0.0; - }; - - Ith_Vbiei = 0.0; - Ith_Vbici = 0.0; - Ith_Vbpbi = 0.0; - Ith_Vbpci = 0.0; - Ith_Vbpei = 0.0; - Ith_Vciei = 0.0; - Ith_Vsici = 0.0; - Ith_Vcic = 0.0; - Ith_Vbbp = 0.0; - Ith_Veie = 0.0; - Ith_Vrth = 0.0; - if(!model->HICUMselfheat) { - Ith = 0; - } else { - Ith = pterm; //Current from gnd to T - Ith_Vrth = pterm_dT; - if (model->HICUMflsh == 1) { - //it(Vbiei,Vbici)*(Vbiei-Vbici) - Ith_Vbiei += it_Vbiei*(Vbiei-Vbici) + it; - Ith_Vbici += it_Vbici*(Vbiei-Vbici) - it; - //avalanche current - Ith_Vbici += (here->HICUMvdci_t.rpart-Vbici)*iavl_Vbici - iavl; - Ith_Vbiei += (here->HICUMvdci_t.rpart-Vbici)*iavl_Vbiei; - } else if (model->HICUMflsh == 2) { - //remember: - //pterm = (Vbiei-Vbici)*it + (here->HICUMvdci_t.rpart-Vbici)*iavl + ibei*Vbiei + ibci*Vbici + ibep*Vbpei + ijbcx*Vbpci + ijsc*Vsici; - //it(Vbiei,Vbici)*(Vbiei-Vbici) - Ith_Vbiei += it_Vbiei*(Vbiei-Vbici) + it; - Ith_Vbici += it_Vbici*(Vbiei-Vbici) - it; - //Vbiei*Ibiei(Vbiei) - Ith_Vbiei += ibei + ibei_Vbiei*Vbiei; - //Vbici*Ibici(Vbici,Vbiei) - Ith_Vbici += ibci + ibci_Vbici*Vbici; - Ith_Vbici += (here->HICUMvdci_t.rpart-Vbici)*iavl_Vbici - iavl; - Ith_Vbiei += (here->HICUMvdci_t.rpart-Vbici)*iavl_Vbiei; - //Vbpei*Ibpei(Vbpei) - Ith_Vbpei += ibep + ibep_Vbpei*Vbpei; - //Vpbci*Ibpci(Vbpci) - Ith_Vbpci += Ibpci + Ibpci_Vbpci*Vbpci; - //Vsici*Isici(Vsici) - Ith_Vsici += Isici + Isici_Vsici*Vsici; - if (rbi > 0.0) { - //Vbpbi*Ibpbi(Vbpbi,Vbiei,Vbici) - Ith_Vbpbi += Ibpbi + Ibpbi_Vbpbi*Vbpbi; - Ith_Vbiei += Ibpbi_Vbiei*Vbpbi; - Ith_Vbici += Ibpbi_Vbici*Vbpbi; - } - if (here->HICUMre_t.rpart >= MIN_R) { - Ith_Veie = 2*Veie/here->HICUMre_t.rpart; - } - if (here->HICUMrcx_t.rpart >= MIN_R) { - Ith_Vcic = 2*Vcic/here->HICUMrcx_t.rpart; - } - if (here->HICUMrbx_t.rpart >= MIN_R) { - Ith_Vbbp = 2*Vbbp/here->HICUMrbx_t.rpart; - } - } - - } - // ******************************************** - - // add gmin over parallel to all non-linear branches - Ibiei += ckt->CKTgmin*Vbiei; - Ibiei_Vbiei += ckt->CKTgmin; - Ibici += ckt->CKTgmin*Vbici; - Ibici_Vbici += ckt->CKTgmin; - Ibpei += ckt->CKTgmin*Vbpei; - Ibpei_Vbpei += ckt->CKTgmin; - Ibpci += ckt->CKTgmin*Vbpci; - Ibpci_Vbpci += ckt->CKTgmin; - Isici += ckt->CKTgmin*Vsici; - Isici_Vsici += ckt->CKTgmin; - - // calculate charge derivatives for electrostatic caps - Qbepar1_Vbe = cbepar1; - Qbepar2_Vbpe = cbepar2; - Qbcpar1_Vbci = cbcpar1; - Qbcpar2_Vbpci = cbcpar2; - Qsu_Vsis = model->HICUMcsu; - Qcth_Vrth = here->HICUMcth_scaled; - if( (ckt->CKTmode & (MODEDCTRANCURVE | MODETRAN | MODEAC)) || - ((ckt->CKTmode & MODETRANOP) && (ckt->CKTmode & MODEUIC)) || - (ckt->CKTmode & MODEINITSMSIG)) { - - // calculate charges over electrostatic caps - Qbepar1 = cbepar1*Vbe; - Qbepar2 = cbepar2*Vbpe; - Qbcpar1 = cbcpar1*Vbci; - Qbcpar2 = cbcpar2*Vbpci; - Qsu = model->HICUMcsu*Vsis; - if (model->HICUMselfheat) { - Qcth = here->HICUMcth_scaled*Vrth; - } else { - Qcth = 0; - } - - // store charges and their derivatives in state vector - //Qrbi - *(ckt->CKTstate0 + here->HICUMqrbi) = Qrbi; - *(ckt->CKTstate0 + here->HICUMcqrbi) = Qrbi_Vbpbi; - //Qjei - *(ckt->CKTstate0 + here->HICUMqjei) = Qjei; - *(ckt->CKTstate0 + here->HICUMcqjei) = Qjei_Vbiei; - //Qf - *(ckt->CKTstate0 + here->HICUMqf) = Qdeix; - *(ckt->CKTstate0 + here->HICUMcqf) = Qdeix_Vbiei; - //Qr - *(ckt->CKTstate0 + here->HICUMqr) = Qr; - *(ckt->CKTstate0 + here->HICUMcqr) = Qr_Vbici; - //Qjci - *(ckt->CKTstate0 + here->HICUMqjci) = Qjci; - *(ckt->CKTstate0 + here->HICUMcqjci) = Qjci_Vbici; - //Qjep - *(ckt->CKTstate0 + here->HICUMqjep) = Qjep; - *(ckt->CKTstate0 + here->HICUMcqjep) = Qjep_Vbpei; - //Qjcx_i - *(ckt->CKTstate0 + here->HICUMqjcx0_i) = Qjcx_i; - *(ckt->CKTstate0 + here->HICUMcqcx0_t_i) = Qjcx_i_Vbci; - //Qjcx_ii - *(ckt->CKTstate0 + here->HICUMqjcx0_ii) = Qjcx_ii; - *(ckt->CKTstate0 + here->HICUMcqcx0_t_ii) = Qjcx_ii_Vbpci; - //Qdsu - *(ckt->CKTstate0 + here->HICUMqdsu) = Qdsu; - *(ckt->CKTstate0 + here->HICUMcqdsu) = Qdsu_Vbpci; - //Qs - *(ckt->CKTstate0 + here->HICUMqjs) = Qjs; - *(ckt->CKTstate0 + here->HICUMcqjs) = Qjs_Vsici; - //Qscp - *(ckt->CKTstate0 + here->HICUMqscp) = Qscp; - *(ckt->CKTstate0 + here->HICUMcqscp) = Qscp_Vsc; - //Qbepar1 - *(ckt->CKTstate0 + here->HICUMqbepar1) = Qbepar1; - *(ckt->CKTstate0 + here->HICUMcqbepar1) = Qbepar1_Vbe; - //Qbepar2 - *(ckt->CKTstate0 + here->HICUMqbepar2) = Qbepar2; - *(ckt->CKTstate0 + here->HICUMcqbepar2) = Qbepar2_Vbpe; - //Qbcpar1 - *(ckt->CKTstate0 + here->HICUMqbcpar1) = Qbcpar1; - *(ckt->CKTstate0 + here->HICUMcqbcpar1) = Qbcpar1_Vbci; - //Qbcpar2 - *(ckt->CKTstate0 + here->HICUMqbcpar2) = Qbcpar2; - *(ckt->CKTstate0 + here->HICUMcqbcpar2) = Qbcpar2_Vbpci; - //Qsu - *(ckt->CKTstate0 + here->HICUMqsu) = Qsu; - *(ckt->CKTstate0 + here->HICUMcqsu) = Qsu_Vsis; - - *(ckt->CKTstate0 + here->HICUMqxf1) = Qxf1; - *(ckt->CKTstate0 + here->HICUMcqxf1) = Qxf1_Vxf1; - *(ckt->CKTstate0 + here->HICUMqxf2) = Qxf2; - *(ckt->CKTstate0 + here->HICUMcqxf2) = Qxf2_Vxf2; - *(ckt->CKTstate0 + here->HICUMqxf) = Qxf; - *(ckt->CKTstate0 + here->HICUMcqxf) = Qxf_Vxf; - if (model->HICUMselfheat) { - //Qth - *(ckt->CKTstate0 + here->HICUMqcth) = Qcth; - *(ckt->CKTstate0 + here->HICUMcqcth) = Qcth_Vrth; - } - - //below is not important for load - here->HICUMcaprbi = Qrbi_Vbpbi; - here->HICUMcapdeix = Cdei; - here->HICUMcapjei = Cjei; - here->HICUMcapdci = Cdci; - here->HICUMcapjci = Cjci; - here->HICUMcapjep = Cjep; - here->HICUMcapjcx_t_i = Cjcx_i; - here->HICUMcapjcx_t_ii = Cjcx_ii; - here->HICUMcapdsu = Qdsu_Vbpci; - here->HICUMcapjs = Cjs; - here->HICUMcapscp = Cscp; - here->HICUMcapsu = model->HICUMcsu; - here->HICUMcapcth = here->HICUMcth_scaled; - - //derivatives of charges due to cross coupling - here->HICUMqrbi_Vbiei = Qrbi_Vbiei; - here->HICUMqrbi_Vbici = Qrbi_Vbici; - here->HICUMqrbi_Vrth = Qrbi_Vrth; - here->HICUMqjei_Vrth = Qjei_dT; - here->HICUMqjep_Vrth = Qjep_dT; - here->HICUMqf_Vbici = Qdeix_Vbici; - here->HICUMqf_Vxf = Qdeix_Vxf; - here->HICUMqf_Vrth = Qdeix_dT; - here->HICUMqr_Vbiei = Qr_Vbiei; - here->HICUMqr_Vrth = Qr_dT; - here->HICUMqjci_Vrth = Qjci_dT; - here->HICUMqjcx0_i_Vrth = Qjcx_i_dT; - here->HICUMqjcx0_ii_Vrth = Qjcx_ii_dT; - here->HICUMqdsu_Vrth = Qdsu_dT; - here->HICUMqdsu_Vsici = Qdsu_Vsici; - here->HICUMqjs_Vrth = Qjs_dT; - here->HICUMqscp_Vrth = Qscp_dT; - here->HICUMicth_dT = Icth_Vrth; - - /* - * store small-signal parameters - */ - if ( (!(ckt->CKTmode & MODETRANOP))|| - (!(ckt->CKTmode & MODEUIC)) ) { - if(ckt->CKTmode & MODEINITSMSIG) { - - *(ckt->CKTstate0 + here->HICUMcqrbi) = Qrbi_Vbpbi; - *(ckt->CKTstate0 + here->HICUMcqf) = Qdeix_Vbiei; - *(ckt->CKTstate0 + here->HICUMcqr) = Qr_Vbici; - - *(ckt->CKTstate0 + here->HICUMcqjei) = Cjei; - *(ckt->CKTstate0 + here->HICUMcqjci) = Cjci; - *(ckt->CKTstate0 + here->HICUMcqjep) = Qjep_Vbpei; - *(ckt->CKTstate0 + here->HICUMcqcx0_t_i) = Qjcx_i_Vbci; - *(ckt->CKTstate0 + here->HICUMcqcx0_t_ii) = Qjcx_ii_Vbpci; - *(ckt->CKTstate0 + here->HICUMcqdsu) = Qdsu_Vbpci; - *(ckt->CKTstate0 + here->HICUMcqjs) = Qjs_Vsici; - *(ckt->CKTstate0 + here->HICUMcqscp) = Qscp_Vsc; - *(ckt->CKTstate0 + here->HICUMcqbepar1) = Qbepar1_Vbe; - *(ckt->CKTstate0 + here->HICUMcqbepar2) = Qbepar2_Vbpe; - *(ckt->CKTstate0 + here->HICUMcqbcpar1) = Qbcpar1_Vbci; - *(ckt->CKTstate0 + here->HICUMcqbcpar2) = Qbcpar2_Vbpci; - *(ckt->CKTstate0 + here->HICUMcqsu) = Qsu_Vsis; - - *(ckt->CKTstate0 + here->HICUMcqxf1) = Qxf1_Vxf1; - *(ckt->CKTstate0 + here->HICUMcqxf2) = Qxf2_Vxf2; - *(ckt->CKTstate0 + here->HICUMcqxf) = Qxf_Vxf; - if (model->HICUMselfheat) - *(ckt->CKTstate0 + here->HICUMcqcth) = here->HICUMcth_scaled; - continue; /* go to 1000 */ - } - //transient analysis - if(ckt->CKTmode & MODEINITTRAN) { - *(ckt->CKTstate1 + here->HICUMqrbi) = - *(ckt->CKTstate0 + here->HICUMqrbi) ; - *(ckt->CKTstate1 + here->HICUMqjei) = - *(ckt->CKTstate0 + here->HICUMqjei) ; - *(ckt->CKTstate1 + here->HICUMqf) = - *(ckt->CKTstate0 + here->HICUMqf) ; - *(ckt->CKTstate1 + here->HICUMqr) = - *(ckt->CKTstate0 + here->HICUMqr) ; - *(ckt->CKTstate1 + here->HICUMqjci) = - *(ckt->CKTstate0 + here->HICUMqjci) ; - *(ckt->CKTstate1 + here->HICUMqjep) = - *(ckt->CKTstate0 + here->HICUMqjep) ; - *(ckt->CKTstate1 + here->HICUMqjcx0_i) = - *(ckt->CKTstate0 + here->HICUMqjcx0_i) ; - *(ckt->CKTstate1 + here->HICUMqjcx0_ii) = - *(ckt->CKTstate0 + here->HICUMqjcx0_ii) ; - *(ckt->CKTstate1 + here->HICUMqdsu) = - *(ckt->CKTstate0 + here->HICUMqdsu) ; - *(ckt->CKTstate1 + here->HICUMqjs) = - *(ckt->CKTstate0 + here->HICUMqjs) ; - *(ckt->CKTstate1 + here->HICUMqscp) = - *(ckt->CKTstate0 + here->HICUMqscp) ; - *(ckt->CKTstate1 + here->HICUMqbepar1) = - *(ckt->CKTstate0 + here->HICUMqbepar1) ; - *(ckt->CKTstate1 + here->HICUMqbepar2) = - *(ckt->CKTstate0 + here->HICUMqbepar2) ; - *(ckt->CKTstate1 + here->HICUMqbcpar1) = - *(ckt->CKTstate0 + here->HICUMqbcpar1) ; - *(ckt->CKTstate1 + here->HICUMqbcpar2) = - *(ckt->CKTstate0 + here->HICUMqbcpar2) ; - *(ckt->CKTstate1 + here->HICUMqsu) = - *(ckt->CKTstate0 + here->HICUMqsu) ; - *(ckt->CKTstate1 + here->HICUMqxf1) = - *(ckt->CKTstate0 + here->HICUMqxf1) ; - *(ckt->CKTstate1 + here->HICUMqxf2) = - *(ckt->CKTstate0 + here->HICUMqxf2) ; - *(ckt->CKTstate1 + here->HICUMqxf) = - *(ckt->CKTstate0 + here->HICUMqxf) ; - - if (model->HICUMselfheat) - *(ckt->CKTstate1 + here->HICUMqcth) = - *(ckt->CKTstate0 + here->HICUMqcth) ; - } - - //Integrate all charges and add the displacement current to the branch currents - //Qrbi - error = NIintegrate(ckt,&geq,&ceq,Qrbi_Vbpbi,here->HICUMqrbi); - if(error) return(error); - Ibpbi_Vbpbi += geq; - Ibpbi += *(ckt->CKTstate0 + here->HICUMcqrbi); - //Qjei - error = NIintegrate(ckt,&geq,&ceq,Cjei,here->HICUMqjei); - if(error) return(error); - Ibiei_Vbiei += geq; - Ibiei += *(ckt->CKTstate0 + here->HICUMcqjei); - //Qdeix - if (!model->HICUMnqs) { - error = NIintegrate(ckt,&geq,&ceq,Qdeix_Vbiei,here->HICUMqf); - if(error) return(error); - Ibiei_Vbiei += geq; - Ibiei_Vxf = 0; - Ibiei += *(ckt->CKTstate0 + here->HICUMcqf); - } else { //Qdeix is now a function of Vxf(t) - error = NIintegrate(ckt,&geq,&ceq,Qdeix_Vxf,here->HICUMqf); - if(error) return(error); - Ibiei_Vxf = geq; - Ibiei += *(ckt->CKTstate0 + here->HICUMcqf); - } - //Qr - error = NIintegrate(ckt,&geq,&ceq,Qr_Vbici,here->HICUMqr); - if(error) return(error); - Ibici_Vbici += geq; - Ibici += *(ckt->CKTstate0 + here->HICUMcqr); - //Qjci - error = NIintegrate(ckt,&geq,&ceq,Cjci,here->HICUMqjci); - if(error) return(error); - Ibici_Vbici += geq; - Ibici += *(ckt->CKTstate0 + here->HICUMcqjci); - //Qjep - error = NIintegrate(ckt,&geq,&ceq,Cjep,here->HICUMqjep); - if(error) return(error); - Ibpei_Vbpei += geq; - Ibpei += *(ckt->CKTstate0 + here->HICUMcqjep); - //Qjcx_i - error = NIintegrate(ckt,&geq,&ceq,Cjcx_i,here->HICUMqjcx0_i); - if(error) return(error); - Ibci_Vbci = geq; - Ibci = *(ckt->CKTstate0 + here->HICUMcqcx0_t_i); - //Qjcx_ii - error = NIintegrate(ckt,&geq,&ceq,Cjcx_ii,here->HICUMqjcx0_ii); - if(error) return(error); - Ibpci_Vbpci += geq; - Ibpci += *(ckt->CKTstate0 + here->HICUMcqcx0_t_ii); - //Qdsu - error = NIintegrate(ckt,&geq,&ceq,Qdsu_Vbpci,here->HICUMqdsu); - if(error) return(error); - Ibpci_Vbpci += geq; - Ibpci += *(ckt->CKTstate0 + here->HICUMcqdsu); - //Qjs - error = NIintegrate(ckt,&geq,&ceq,Cjs,here->HICUMqjs); - if(error) return(error); - Isici_Vsici += geq; - Isici += *(ckt->CKTstate0 + here->HICUMcqjs); - //Qscp - error = NIintegrate(ckt,&geq,&ceq,Cscp,here->HICUMqscp); - if(error) return(error); - Isc_Vsc = geq; - Isc = *(ckt->CKTstate0 + here->HICUMcqscp); - if (model->HICUMnqs) { - //Qxf1 - error = NIintegrate(ckt,&geq,&ceq,Qxf1_Vxf1,here->HICUMqxf1); - if(error) return(error); - Ixf1_Vxf1 += geq; - Ixf1 += *(ckt->CKTstate0 + here->HICUMcqxf1); - //Qxf2 - error = NIintegrate(ckt,&geq,&ceq,Qxf2_Vxf2,here->HICUMqxf2); - if(error) return(error); - Ixf2_Vxf2 += geq; - Ixf2 += *(ckt->CKTstate0 + here->HICUMcqxf2); - //Qxf - error = NIintegrate(ckt,&geq,&ceq,Qxf_Vxf,here->HICUMqxf); - if(error) return(error); - Ixf_Vxf += geq; - Ixf += *(ckt->CKTstate0 + here->HICUMcqxf); - } - - if (model->HICUMselfheat) - { - //Qth - error = NIintegrate(ckt,&geq,&ceq,here->HICUMcth_scaled,here->HICUMqcth); - if(error) return(error); - Icth_Vrth = geq; - Icth = *(ckt->CKTstate0 + here->HICUMcqcth); - } - - if(ckt->CKTmode & MODEINITTRAN) { - //copy from state1 to state0 - *(ckt->CKTstate1 + here->HICUMcqrbi) = - *(ckt->CKTstate0 + here->HICUMcqrbi) ; - *(ckt->CKTstate1 + here->HICUMcqjei) = - *(ckt->CKTstate0 + here->HICUMcqjei) ; - *(ckt->CKTstate1 + here->HICUMcqf) = - *(ckt->CKTstate0 + here->HICUMcqf) ; - *(ckt->CKTstate1 + here->HICUMcqr) = - *(ckt->CKTstate0 + here->HICUMcqr) ; - *(ckt->CKTstate1 + here->HICUMcqjci) = - *(ckt->CKTstate0 + here->HICUMcqjci) ; - *(ckt->CKTstate1 + here->HICUMcqjep) = - *(ckt->CKTstate0 + here->HICUMcqjep) ; - *(ckt->CKTstate1 + here->HICUMcqcx0_t_i) = - *(ckt->CKTstate0 + here->HICUMcqcx0_t_i) ; - *(ckt->CKTstate1 + here->HICUMcqcx0_t_ii) = - *(ckt->CKTstate0 + here->HICUMcqcx0_t_ii) ; - *(ckt->CKTstate1 + here->HICUMcqdsu) = - *(ckt->CKTstate0 + here->HICUMcqdsu) ; - *(ckt->CKTstate1 + here->HICUMcqjs) = - *(ckt->CKTstate0 + here->HICUMcqjs) ; - *(ckt->CKTstate1 + here->HICUMcqscp) = - *(ckt->CKTstate0 + here->HICUMcqscp) ; - *(ckt->CKTstate1 + here->HICUMcqxf1) = - *(ckt->CKTstate0 + here->HICUMcqxf1) ; - *(ckt->CKTstate1 + here->HICUMcqxf2) = - *(ckt->CKTstate0 + here->HICUMcqxf2) ; - *(ckt->CKTstate1 + here->HICUMcqxf) = - *(ckt->CKTstate0 + here->HICUMcqxf) ; - if (model->HICUMselfheat) - *(ckt->CKTstate1 + here->HICUMcqcth) = - *(ckt->CKTstate0 + here->HICUMcqcth) ; - } - } - } - - /* - * check convergence - */ - if ( (!(ckt->CKTmode & MODEINITFIX))||(!(here->HICUMoff))) { - if (icheck == 1) { - ckt->CKTnoncon++; - ckt->CKTtroubleElt = (GENinstance *) here; - } - } - - /* - * charge storage for electrostatic caps - */ - if(ckt->CKTmode & (MODETRAN | MODEAC)) { -// Ibe += ddt(cbepar1*Vbe); - error = NIintegrate(ckt,&gqbepar1,&cqbepar1,cbepar1,here->HICUMqbepar1); - if(error) return(error); -// Ibpe += ddt(cbepar2*Vbpe); - error = NIintegrate(ckt,&gqbepar2,&cqbepar2,cbepar2,here->HICUMqbepar2); - if(error) return(error); -// Ibci += ddt(cbcpar1*Vbci); - error = NIintegrate(ckt,&gqbcpar1,&cqbcpar1,cbcpar1,here->HICUMqbcpar1); - if(error) return(error); -// Ibpci += ddt(cbcpar2*Vbpci); - error = NIintegrate(ckt,&gqbcpar2,&cqbcpar2,cbcpar2,here->HICUMqbcpar2); - if(error) return(error); -// Isis += ddt(model->HICUMcsu*Vsis); - error = NIintegrate(ckt,&gqsu,&cqsu,model->HICUMcsu,here->HICUMqsu); - if(error) return(error); - if(ckt->CKTmode & MODEINITTRAN) { - *(ckt->CKTstate1 + here->HICUMcqbepar1) = - *(ckt->CKTstate0 + here->HICUMcqbepar1); - *(ckt->CKTstate1 + here->HICUMcqbepar2) = - *(ckt->CKTstate0 + here->HICUMcqbepar2); - *(ckt->CKTstate1 + here->HICUMcqbcpar1) = - *(ckt->CKTstate0 + here->HICUMcqbcpar1); - *(ckt->CKTstate1 + here->HICUMcqbcpar2) = - *(ckt->CKTstate0 + here->HICUMcqbcpar2); - *(ckt->CKTstate1 + here->HICUMcqsu) = - *(ckt->CKTstate0 + here->HICUMcqsu); - } - } - - // Write branch currents and voltages to state vector - *(ckt->CKTstate0 + here->HICUMvbiei) = Vbiei; - *(ckt->CKTstate0 + here->HICUMvbici) = Vbici; - *(ckt->CKTstate0 + here->HICUMvbpei) = Vbpei; - *(ckt->CKTstate0 + here->HICUMvbpbi) = Vbpbi; - *(ckt->CKTstate0 + here->HICUMvbpci) = Vbpci; - *(ckt->CKTstate0 + here->HICUMvsici) = Vsici; - *(ckt->CKTstate0 + here->HICUMvcic) = Vcic; - *(ckt->CKTstate0 + here->HICUMvbbp) = Vbbp; - *(ckt->CKTstate0 + here->HICUMveie) = Veie; - *(ckt->CKTstate0 + here->HICUMvxf1) = Vxf1; - *(ckt->CKTstate0 + here->HICUMvxf2) = Vxf2; - *(ckt->CKTstate0 + here->HICUMvxf) = Vxf; - - *(ckt->CKTstate0 + here->HICUMibiei) = Ibiei; - *(ckt->CKTstate0 + here->HICUMibiei_Vbiei) = Ibiei_Vbiei; - *(ckt->CKTstate0 + here->HICUMibiei_Vxf) = Ibiei_Vxf; - *(ckt->CKTstate0 + here->HICUMibiei_Vbici) = Ibiei_Vbici; - *(ckt->CKTstate0 + here->HICUMibiei_Vrth) = Ibiei_Vrth; - - *(ckt->CKTstate0 + here->HICUMibpei) = Ibpei; - *(ckt->CKTstate0 + here->HICUMibpei_Vbpei) = Ibpei_Vbpei; - *(ckt->CKTstate0 + here->HICUMibpei_Vrth) = Ibpei_Vrth; - - *(ckt->CKTstate0 + here->HICUMiciei) = Iciei; - *(ckt->CKTstate0 + here->HICUMiciei_Vbiei) = Iciei_Vbiei; - *(ckt->CKTstate0 + here->HICUMiciei_Vbici) = Iciei_Vbici; - *(ckt->CKTstate0 + here->HICUMiciei_Vrth) = Iciei_Vrth; - *(ckt->CKTstate0 + here->HICUMiciei_Vxf2) = Iciei_Vxf2; - - *(ckt->CKTstate0 + here->HICUMibici) = Ibici; - *(ckt->CKTstate0 + here->HICUMibici_Vbici) = Ibici_Vbici; - *(ckt->CKTstate0 + here->HICUMibici_Vbiei) = Ibici_Vbiei; - *(ckt->CKTstate0 + here->HICUMibici_Vrth) = Ibici_Vrth; - - *(ckt->CKTstate0 + here->HICUMibpbi) = Ibpbi; - *(ckt->CKTstate0 + here->HICUMibpbi_Vbpbi) = Ibpbi_Vbpbi; - *(ckt->CKTstate0 + here->HICUMibpbi_Vbiei) = Ibpbi_Vbiei; - *(ckt->CKTstate0 + here->HICUMibpbi_Vbici) = Ibpbi_Vbici; - *(ckt->CKTstate0 + here->HICUMibpbi_Vrth) = Ibpbi_Vrth; - - *(ckt->CKTstate0 + here->HICUMibpci) = Ibpci; - *(ckt->CKTstate0 + here->HICUMibpci_Vbpci) = Ibpci_Vbpci; - *(ckt->CKTstate0 + here->HICUMibpci_Vrth) = Ibpci_Vrth; - - *(ckt->CKTstate0 + here->HICUMisici) = Isici; - *(ckt->CKTstate0 + here->HICUMisici_Vsici) = Isici_Vsici; - *(ckt->CKTstate0 + here->HICUMisici_Vrth) = Isici_Vrth; - - *(ckt->CKTstate0 + here->HICUMibpsi) = Ibpsi; - *(ckt->CKTstate0 + here->HICUMibpsi_Vbpci) = Ibpsi_Vbpci; - *(ckt->CKTstate0 + here->HICUMibpsi_Vsici) = Ibpsi_Vsici; - *(ckt->CKTstate0 + here->HICUMibpsi_Vrth) = Ibpsi_Vrth; - - *(ckt->CKTstate0 + here->HICUMisis_Vsis) = Isis_Vsis; - - *(ckt->CKTstate0 + here->HICUMieie) = Ieie; - *(ckt->CKTstate0 + here->HICUMieie_Vrth) = Ieie_Vrth; - - *(ckt->CKTstate0 + here->HICUMcqcth) = Icth; - *(ckt->CKTstate0 + here->HICUMvrth) = Vrth; - - *(ckt->CKTstate0 + here->HICUMgqbepar1) = gqbepar1; - *(ckt->CKTstate0 + here->HICUMgqbepar2) = gqbepar2; - - *(ckt->CKTstate0 + here->HICUMgqbcpar1) = gqbcpar1; - *(ckt->CKTstate0 + here->HICUMgqbcpar2) = gqbcpar2; - - *(ckt->CKTstate0 + here->HICUMgqsu) = gqsu; - - *(ckt->CKTstate0 + here->HICUMith) = Ith; - *(ckt->CKTstate0 + here->HICUMith_Vrth) = Ith_Vrth; - *(ckt->CKTstate0 + here->HICUMith_Vbiei) = Ith_Vbiei; - *(ckt->CKTstate0 + here->HICUMith_Vbici) = Ith_Vbici; - *(ckt->CKTstate0 + here->HICUMith_Vbpbi) = Ith_Vbpbi; - *(ckt->CKTstate0 + here->HICUMith_Vbpci) = Ith_Vbpci; - *(ckt->CKTstate0 + here->HICUMith_Vbpei) = Ith_Vbpei; - *(ckt->CKTstate0 + here->HICUMith_Vciei) = Ith_Vciei; - *(ckt->CKTstate0 + here->HICUMith_Vsici) = Ith_Vsici; - *(ckt->CKTstate0 + here->HICUMith_Vcic) = Ith_Vcic; - *(ckt->CKTstate0 + here->HICUMith_Vbbp) = Ith_Vbbp; - *(ckt->CKTstate0 + here->HICUMith_Veie) = Ith_Veie; - - *(ckt->CKTstate0 + here->HICUMixf) = Ixf; - *(ckt->CKTstate0 + here->HICUMixf_Vbiei) = Ixf_Vbiei; - *(ckt->CKTstate0 + here->HICUMixf_Vbici) = Ixf_Vbici; - *(ckt->CKTstate0 + here->HICUMixf_Vxf) = Ixf_Vxf; - *(ckt->CKTstate0 + here->HICUMixf_Vrth) = Ixf_dT; - - *(ckt->CKTstate0 + here->HICUMixf1) = Ixf1; - *(ckt->CKTstate0 + here->HICUMixf1_Vbiei) = Ixf1_Vbiei; - *(ckt->CKTstate0 + here->HICUMixf1_Vbici) = Ixf1_Vbici; - *(ckt->CKTstate0 + here->HICUMixf1_Vxf2) = Ixf1_Vxf2; - *(ckt->CKTstate0 + here->HICUMixf1_Vxf1) = Ixf1_Vxf1; - *(ckt->CKTstate0 + here->HICUMixf1_Vrth) = Ixf1_dT; - - *(ckt->CKTstate0 + here->HICUMixf2) = Ixf2; - *(ckt->CKTstate0 + here->HICUMixf2_Vbiei) = Ixf2_Vbiei; - *(ckt->CKTstate0 + here->HICUMixf2_Vbici) = Ixf2_Vbici; - *(ckt->CKTstate0 + here->HICUMixf2_Vxf1) = Ixf2_Vxf1; - *(ckt->CKTstate0 + here->HICUMixf2_Vxf2) = Ixf2_Vxf2; - *(ckt->CKTstate0 + here->HICUMixf2_Vrth) = Ixf2_dT; - *(ckt->CKTstate0 + here->HICUMit) = it; - -load: -// ############################################################# -// ############### STAMPS NO SH ############################## -// ############################################################# - -// Branch: sc, Stamp element: Cscp - rhs_current = model->HICUMtype * (Isc - Isc_Vsc*Vsc); - *(ckt->CKTrhs + here->HICUMsubsNode) += -rhs_current; - *(ckt->CKTrhs + here->HICUMcollNode) += rhs_current; - // with respect to Vsc - *(here->HICUMsubsSubsPtr) += Isc_Vsc; - *(here->HICUMcollCollPtr) += Isc_Vsc; - *(here->HICUMsubsCollPtr) += -Isc_Vsc; - *(here->HICUMcollSubsPtr) += -Isc_Vsc; - -// Branch: bci, Stamp element: Qbcx - rhs_current = model->HICUMtype * (Ibci - Ibci_Vbci*Vbci); - *(ckt->CKTrhs + here->HICUMbaseNode) += -rhs_current; - *(ckt->CKTrhs + here->HICUMcollCINode) += rhs_current; - //with respect to Vbci - *(here->HICUMbaseBasePtr) += Ibci_Vbci; - *(here->HICUMcollCICollCIPtr) += Ibci_Vbci; - *(here->HICUMbaseCollCIPtr) += -Ibci_Vbci; - *(here->HICUMcollCIBasePtr) += -Ibci_Vbci; - -// Branch: be, Stamp element: Cbepar1 - rhs_current = model->HICUMtype * (*(ckt->CKTstate0 + here->HICUMcqbepar1) - Vbe * gqbepar1); - *(ckt->CKTrhs + here->HICUMbaseNode) += -rhs_current; - *(ckt->CKTrhs + here->HICUMemitNode) += rhs_current; - // with respect to Vbe - *(here->HICUMbaseBasePtr) += gqbepar1; - *(here->HICUMemitEmitPtr) += gqbepar1; - *(here->HICUMbaseEmitPtr) += -gqbepar1; - *(here->HICUMemitBasePtr) += -gqbepar1; - -// Branch: bpe, Stamp element: Cbepar2 - rhs_current = model->HICUMtype * (*(ckt->CKTstate0 + here->HICUMcqbepar2) - Vbpe * gqbepar2); - *(ckt->CKTrhs + here->HICUMbaseBPNode) += -rhs_current; - *(ckt->CKTrhs + here->HICUMemitNode) += rhs_current; - // with respect to Vbpe - *(here->HICUMbaseBPBaseBPPtr) += gqbepar2; - *(here->HICUMemitEmitPtr) += gqbepar2; - *(here->HICUMbaseBPEmitPtr) += -gqbepar2; - *(here->HICUMemitBaseBPPtr) += -gqbepar2; - -// Branch: bci, Stamp element: Cbcpar1 - rhs_current = model->HICUMtype * (*(ckt->CKTstate0 + here->HICUMcqbcpar1) - Vbci * gqbcpar1); - *(ckt->CKTrhs + here->HICUMbaseNode) += -rhs_current; - *(ckt->CKTrhs + here->HICUMcollCINode) += rhs_current; - // with respect to Vbci - *(here->HICUMbaseBasePtr) += gqbcpar1; - *(here->HICUMcollCICollCIPtr) += gqbcpar1; - *(here->HICUMbaseCollCIPtr) += -gqbcpar1; - *(here->HICUMcollCIBasePtr) += -gqbcpar1; - -// Branch: bpci, Stamp element: Cbcpar2 - rhs_current = model->HICUMtype * (*(ckt->CKTstate0 + here->HICUMcqbcpar2) - Vbpci * gqbcpar2); - *(ckt->CKTrhs + here->HICUMbaseBPNode) += -rhs_current; - *(ckt->CKTrhs + here->HICUMcollCINode) += rhs_current; - // with respect to Vbpci - *(here->HICUMbaseBPBaseBPPtr) += gqbcpar2; - *(here->HICUMcollCICollCIPtr) += gqbcpar2; - *(here->HICUMbaseBPCollCIPtr) += -gqbcpar2; - *(here->HICUMcollCIBaseBPPtr) += -gqbcpar2; - -// Branch: ssi, Stamp element: Csu //Markus: I think rhs sign is wrong here - rhs_current = model->HICUMtype * (*(ckt->CKTstate0 + here->HICUMcqsu) - Vsis * gqsu); - *(ckt->CKTrhs + here->HICUMsubsNode) += +rhs_current; - *(ckt->CKTrhs + here->HICUMsubsSINode) += -rhs_current; - // with respect to Vsis - *(here->HICUMsubsSubsPtr) += gqsu; - *(here->HICUMsubsSISubsSIPtr) += gqsu; - *(here->HICUMsubsSubsSIPtr) += -gqsu; - *(here->HICUMsubsSISubsPtr) += -gqsu; - -// Branch: biei, Stamp element: Ibiei = Ibei + Irei ( was Ijbei ) - rhs_current = model->HICUMtype * (Ibiei - Ibiei_Vbiei*Vbiei - Ibiei_Vxf*Vxf - Ibiei_Vbici*Vbici); - *(ckt->CKTrhs + here->HICUMbaseBINode) += -rhs_current; - *(ckt->CKTrhs + here->HICUMemitEINode) += rhs_current; - // with respect to Vbiei - *(here->HICUMbaseBIBaseBIPtr) += Ibiei_Vbiei; - *(here->HICUMemitEIEmitEIPtr) += Ibiei_Vbiei; - *(here->HICUMbaseBIEmitEIPtr) += -Ibiei_Vbiei; - *(here->HICUMemitEIBaseBIPtr) += -Ibiei_Vbiei; - // with respect to Vbici - *(here->HICUMbaseBIBaseBIPtr) += Ibiei_Vbici; - *(here->HICUMemitEICollCIPtr) += Ibiei_Vbici; - *(here->HICUMbaseBICollCIPtr) += -Ibiei_Vbici; - *(here->HICUMemitEIBaseBIPtr) += -Ibiei_Vbici; - if (model->HICUMnqs) { - *(here->HICUMbaseBIXfPtr) += Ibiei_Vxf; - *(here->HICUMemitEIXfPtr) += -Ibiei_Vxf; - } - -// Branch: bpei, Stamp element: Ibpei = Ibep + Irep ( was Ijbep ) - rhs_current = model->HICUMtype * (Ibpei - Ibpei_Vbpei*Vbpei); - *(ckt->CKTrhs + here->HICUMbaseBPNode) += -rhs_current; - *(ckt->CKTrhs + here->HICUMemitEINode) += rhs_current; - // with respect to Vbpei - *(here->HICUMbaseBPBaseBPPtr) += Ibpei_Vbpei; - *(here->HICUMemitEIEmitEIPtr) += Ibpei_Vbpei; - *(here->HICUMbaseBPEmitEIPtr) += -Ibpei_Vbpei; - *(here->HICUMemitEIBaseBPPtr) += -Ibpei_Vbpei; - -// Branch: bici, Stamp element: Ibici ( was Ijbci ) f_bi=+ f_ci=- - rhs_current = model->HICUMtype * (Ibici - Ibici_Vbici*Vbici - Ibici_Vbiei*Vbiei); - *(ckt->CKTrhs + here->HICUMbaseBINode) += -rhs_current; - *(ckt->CKTrhs + here->HICUMcollCINode) += rhs_current; - // with respect to Vbici - *(here->HICUMbaseBIBaseBIPtr) += Ibici_Vbici; - *(here->HICUMcollCICollCIPtr) += Ibici_Vbici; - *(here->HICUMcollCIBaseBIPtr) += -Ibici_Vbici; - *(here->HICUMbaseBICollCIPtr) += -Ibici_Vbici; - // with respect to Vbiei - *(here->HICUMbaseBIBaseBIPtr) += Ibici_Vbiei; - *(here->HICUMcollCIEmitEIPtr) += Ibici_Vbiei; - *(here->HICUMcollCIBaseBIPtr) += -Ibici_Vbiei; - *(here->HICUMbaseBIEmitEIPtr) += -Ibici_Vbiei; - -// Branch: ciei, Stamp element: It - rhs_current = model->HICUMtype * (Iciei - Iciei_Vbiei*Vbiei - Iciei_Vbici*Vbici- Iciei_Vxf2*Vxf2); - *(ckt->CKTrhs + here->HICUMcollCINode) += -rhs_current; - *(ckt->CKTrhs + here->HICUMemitEINode) += rhs_current; - // with respect to Vbiei f_CI = + f_EI = - - *(here->HICUMcollCIBaseBIPtr) += Iciei_Vbiei; - *(here->HICUMemitEIEmitEIPtr) += Iciei_Vbiei; - *(here->HICUMcollCIEmitEIPtr) += -Iciei_Vbiei; - *(here->HICUMemitEIBaseBIPtr) += -Iciei_Vbiei; - // with respect to Vbici - *(here->HICUMcollCIBaseBIPtr) += Iciei_Vbici; - *(here->HICUMemitEICollCIPtr) += Iciei_Vbici; - *(here->HICUMcollCICollCIPtr) += -Iciei_Vbici; - *(here->HICUMemitEIBaseBIPtr) += -Iciei_Vbici; - if (model->HICUMnqs) { - // with respect to Vxf2 - *(here->HICUMcollCIXf2Ptr) += Iciei_Vxf2; - *(here->HICUMemitEIXf2Ptr) += -Iciei_Vxf2; - } - -// Branch: bpci, Stamp element: Ibpci ( was Ijbcx ) - rhs_current = model->HICUMtype * (Ibpci - Ibpci_Vbpci*Vbpci); - *(ckt->CKTrhs + here->HICUMbaseBPNode) += -rhs_current; - *(ckt->CKTrhs + here->HICUMcollCINode) += rhs_current; - // with respect to Vbpci - *(here->HICUMbaseBPBaseBPPtr) += Ibpci_Vbpci; - *(here->HICUMcollCICollCIPtr) += Ibpci_Vbpci; - *(here->HICUMbaseBPCollCIPtr) += -Ibpci_Vbpci; - *(here->HICUMcollCIBaseBPPtr) += -Ibpci_Vbpci; - -// Branch: cic, Stamp element: Rcx - // with respect to Vcic - *(here->HICUMcollCollPtr) += Icic_Vcic; - *(here->HICUMcollCICollCIPtr) += Icic_Vcic; - *(here->HICUMcollCICollPtr) += -Icic_Vcic; - *(here->HICUMcollCollCIPtr) += -Icic_Vcic; - -// Branch: bbp, Stamp element: Rbx - // with respect to Vbbp - *(here->HICUMbaseBasePtr) += Ibbp_Vbbp; - *(here->HICUMbaseBPBaseBPPtr) += Ibbp_Vbbp; - *(here->HICUMbaseBPBasePtr) += -Ibbp_Vbbp; - *(here->HICUMbaseBaseBPPtr) += -Ibbp_Vbbp; - -// Branch: eie, Stamp element: Re - // with respect to Veie - *(here->HICUMemitEmitPtr) += Ieie_Veie; - *(here->HICUMemitEIEmitEIPtr) += Ieie_Veie; - *(here->HICUMemitEIEmitPtr) += -Ieie_Veie; - *(here->HICUMemitEmitEIPtr) += -Ieie_Veie; - - if (rbi > 0.0) { -// Branch: bpbi, Stamp element: Rbi, Crbi - rhs_current = model->HICUMtype * (Ibpbi - Ibpbi_Vbpbi*Vbpbi - Ibpbi_Vbiei*Vbiei - Ibpbi_Vbici*Vbici); - *(ckt->CKTrhs + here->HICUMbaseBPNode) += -rhs_current; - *(ckt->CKTrhs + here->HICUMbaseBINode) += rhs_current; - //f_Bp = + f_Bi = - - // with respect to Vbpbi - *(here->HICUMbaseBPBaseBPPtr) += Ibpbi_Vbpbi; - *(here->HICUMbaseBIBaseBIPtr) += Ibpbi_Vbpbi; - *(here->HICUMbaseBPBaseBIPtr) += -Ibpbi_Vbpbi; - *(here->HICUMbaseBIBaseBPPtr) += -Ibpbi_Vbpbi; - // with respect to Vbiei - *(here->HICUMbaseBPBaseBIPtr) += Ibpbi_Vbiei; - *(here->HICUMbaseBIEmitEIPtr) += Ibpbi_Vbiei; - *(here->HICUMbaseBPEmitEIPtr) += -Ibpbi_Vbiei; - *(here->HICUMbaseBIBaseBIPtr) += -Ibpbi_Vbiei; - // with respect to Vbici - *(here->HICUMbaseBPBaseBIPtr) += Ibpbi_Vbici; - *(here->HICUMbaseBICollCIPtr) += Ibpbi_Vbici; - *(here->HICUMbaseBPCollCIPtr) += -Ibpbi_Vbici; - *(here->HICUMbaseBIBaseBIPtr) += -Ibpbi_Vbici; - } - -// Branch: sici, Stamp element: Ijsc - rhs_current = model->HICUMtype * (Isici - Isici_Vsici*Vsici); - *(ckt->CKTrhs + here->HICUMsubsSINode) += -rhs_current; - *(ckt->CKTrhs + here->HICUMcollCINode) += rhs_current; - // with respect to Vsici - *(here->HICUMsubsSISubsSIPtr) += Isici_Vsici; - *(here->HICUMcollCICollCIPtr) += Isici_Vsici; - *(here->HICUMsubsSICollCIPtr) += -Isici_Vsici; - *(here->HICUMcollCISubsSIPtr) += -Isici_Vsici; - -// Branch: bpsi, Stamp element: Its - rhs_current = model->HICUMtype * (Ibpsi - Ibpsi_Vbpci*Vbpci - Ibpsi_Vsici*Vsici); - *(ckt->CKTrhs + here->HICUMbaseBPNode) += -rhs_current; - *(ckt->CKTrhs + here->HICUMsubsSINode) += rhs_current; - // f_Bp = + f_Si = - - // with respect to Vsici - *(here->HICUMbaseBPSubsSIPtr) += Ibpsi_Vsici; - *(here->HICUMsubsSICollCIPtr) += Ibpsi_Vsici; - *(here->HICUMbaseBPCollCIPtr) += -Ibpsi_Vsici; - *(here->HICUMsubsSISubsSIPtr) += -Ibpsi_Vsici; - // with respect to Vbpci - *(here->HICUMbaseBPBaseBPPtr) += Ibpsi_Vbpci; - *(here->HICUMsubsSICollCIPtr) += Ibpsi_Vbpci; - *(here->HICUMbaseBPCollCIPtr) += -Ibpsi_Vbpci; - *(here->HICUMsubsSIBaseBPPtr) += -Ibpsi_Vbpci; - -// Branch: sis, Stamp element: Rsu - // with respect to Vsis - *(here->HICUMsubsSubsPtr) += Isis_Vsis; - *(here->HICUMsubsSISubsSIPtr) += Isis_Vsis; - *(here->HICUMsubsSISubsPtr) += -Isis_Vsis; - *(here->HICUMsubsSubsSIPtr) += -Isis_Vsis; - - if (model->HICUMnqs) { - // Branch: xf1-ground, Stamp element: Ixf1 f_xf1=+ - rhs_current = Ixf1 - Ixf1_Vbici*Vbici - Ixf1_Vbiei*Vbiei -Ixf1_Vxf1*Vxf1 - Ixf1_Vxf2*Vxf2; - *(ckt->CKTrhs + here->HICUMxf1Node) += -rhs_current; // rhs_current; // into xf1 node - *(here->HICUMxf1BaseBIPtr) += +Ixf1_Vbiei; - *(here->HICUMxf1EmitEIPtr) += -Ixf1_Vbiei; - *(here->HICUMxf1BaseBIPtr) += +Ixf1_Vbici; - *(here->HICUMxf1CollCIPtr) += -Ixf1_Vbici; - *(here->HICUMxf1Xf2Ptr) += +Ixf1_Vxf2; - *(here->HICUMxf1Xf1Ptr) += +Ixf1_Vxf1; - - // Branch: xf2-ground, Stamp element: Ixf2 f_xf2=+ - rhs_current = Ixf2 - Ixf2_Vbici*Vbici - Ixf2_Vbiei*Vbiei - Ixf2_Vxf1*Vxf1 - Ixf2_Vxf2*Vxf2; - *(ckt->CKTrhs + here->HICUMxf2Node) += -rhs_current; // rhs_current; // into xf2 node - *(here->HICUMxf2BaseBIPtr) += +Ixf2_Vbiei; - *(here->HICUMxf2EmitEIPtr) += -Ixf2_Vbiei; - *(here->HICUMxf2BaseBIPtr) += +Ixf2_Vbici; - *(here->HICUMxf2CollCIPtr) += -Ixf2_Vbici; - *(here->HICUMxf2Xf2Ptr) += +Ixf2_Vxf2; - *(here->HICUMxf2Xf1Ptr) += +Ixf2_Vxf1; - - // Branch: xf-ground, Stamp element: Ixf f_xf=+ - rhs_current = Ixf - Ixf_Vbici*Vbici - Ixf_Vbiei*Vbiei - Ixf_Vxf*Vxf; - *(ckt->CKTrhs + here->HICUMxfNode) += -rhs_current; // rhs_current; // into xf node - *(here->HICUMxfBaseBIPtr) += +Ixf_Vbiei; - *(here->HICUMxfEmitEIPtr) += -Ixf_Vbiei; - *(here->HICUMxfBaseBIPtr) += +Ixf_Vbici; - *(here->HICUMxfCollCIPtr) += -Ixf_Vbici; - *(here->HICUMxfXfPtr) += +Ixf_Vxf; - } - - -// ############################################################# -// ############### FINISH STAMPS NO SH ######################### -// ############################################################# - - if (model->HICUMselfheat) { - -// ############################################################# -// ############### STAMP WITH SH ADDITIONS ##################### -// ############################################################# - -// Stamp element: Ibiei f_Bi = + f_Ei = - - rhs_current = -Ibiei_Vrth*Vrth; - *(ckt->CKTrhs + here->HICUMbaseBINode) += -rhs_current; - *(ckt->CKTrhs + here->HICUMemitEINode) += rhs_current; - // with respect to Potential Vrth - *(here->HICUMbaseBItempPtr) += Ibiei_Vrth; - *(here->HICUMemitEItempPtr) += -Ibiei_Vrth; - -// Stamp element: Ibpei f_Bp = + f_Ei = - - rhs_current = -Ibpei_Vrth*Vrth; - *(ckt->CKTrhs + here->HICUMbaseBPNode) += -rhs_current; - *(ckt->CKTrhs + here->HICUMemitEINode) += rhs_current; - // with respect to Potential Vrth - *(here->HICUMbaseBPtempPtr) += Ibpei_Vrth; - *(here->HICUMemitEItempPtr) += -Ibpei_Vrth; - -// Stamp element: Ibici f_Bi = + f_Ci = - - rhs_current = -Ibici_Vrth*Vrth; - *(ckt->CKTrhs + here->HICUMbaseBINode) += -rhs_current; - *(ckt->CKTrhs + here->HICUMcollCINode) += rhs_current; - // with respect to Potential Vrth - *(here->HICUMbaseBItempPtr) += Ibici_Vrth; - *(here->HICUMcollCItempPtr) += -Ibici_Vrth; - -// Stamp element: Iciei f_Ci = + f_Ei = - - rhs_current = -Iciei_Vrth*Vrth; - *(ckt->CKTrhs + here->HICUMcollCINode) += -rhs_current; - *(ckt->CKTrhs + here->HICUMemitEINode) += rhs_current; - // with respect to Potential Vrth - *(here->HICUMcollCItempPtr) += Iciei_Vrth; - *(here->HICUMemitEItempPtr) += -Iciei_Vrth; - -// Stamp element: Ibpci f_Bp = + f_Ci = - - rhs_current = -Ibpci_Vrth*Vrth; - *(ckt->CKTrhs + here->HICUMbaseBPNode) += -rhs_current; - *(ckt->CKTrhs + here->HICUMcollCINode) += rhs_current; - // with respect to Potential Vrth - *(here->HICUMbaseBPtempPtr) += Ibpci_Vrth; - *(here->HICUMcollCItempPtr) += -Ibpci_Vrth; - -// Stamp element: Rcx f_Ci = + f_C = - - rhs_current = -Icic_Vrth*Vrth; - *(ckt->CKTrhs + here->HICUMcollCINode) += -rhs_current; - *(ckt->CKTrhs + here->HICUMcollNode) += rhs_current; - // with respect to Potential Vrth - *(here->HICUMcollCItempPtr) += Icic_Vrth; - *(here->HICUMcollTempPtr) += -Icic_Vrth; - -// Stamp element: Rbx f_B = + f_Bp = - - rhs_current = -Ibbp_Vrth*Vrth; - *(ckt->CKTrhs + here->HICUMbaseNode) += -rhs_current; - *(ckt->CKTrhs + here->HICUMbaseBPNode) += rhs_current; - // with respect to Potential Vrth - *(here->HICUMbaseTempPtr) += Ibbp_Vrth; - *(here->HICUMbaseBPtempPtr) += -Ibbp_Vrth; - -// Stamp element: Re f_Ei = + f_E = - - rhs_current = - Ieie_Vrth*Vrth; - *(ckt->CKTrhs + here->HICUMemitEINode) += -rhs_current; - *(ckt->CKTrhs + here->HICUMemitNode) += +rhs_current; - // with respect to Potential Vrth - *(here->HICUMemitEItempPtr) += +Ieie_Vrth; - *(here->HICUMemitTempPtr) += -Ieie_Vrth; - - if (rbi > 0.0) { -// Stamp element: Rbi f_Bp = + f_Bi = - - rhs_current = -Ibpbi_Vrth*Vrth; - *(ckt->CKTrhs + here->HICUMbaseBPNode) += -rhs_current; - *(ckt->CKTrhs + here->HICUMbaseBINode) += rhs_current; - // with respect to Potential Vrth - *(here->HICUMbaseBPtempPtr) += Ibpbi_Vrth; - *(here->HICUMbaseBItempPtr) += -Ibpbi_Vrth; - }; - -// Stamp element: Isici f_Si = + f_Ci = - - rhs_current = -Isici_Vrth*Vrth; - *(ckt->CKTrhs + here->HICUMsubsSINode) += -rhs_current; - *(ckt->CKTrhs + here->HICUMcollCINode) += rhs_current; - // with respect to Potential Vrth - *(here->HICUMsubsSItempPtr) += Isici_Vrth; - *(here->HICUMcollCItempPtr) += -Isici_Vrth; - -// Branch: bpsi, Stamp element: Its - rhs_current = - Ibpsi_Vrth*Vrth; - *(ckt->CKTrhs + here->HICUMbaseBPNode) += -rhs_current; - *(ckt->CKTrhs + here->HICUMsubsSINode) += rhs_current; - // f_Bp = + f_Si = - - // with respect to Vrth - *(here->HICUMbaseBPtempPtr) += Ibpsi_Vrth; - *(here->HICUMsubsSItempPtr) += -Ibpsi_Vrth; - - if (model->HICUMnqs) { - // Stamp element: Ixf f_xf = + - rhs_current = -Ixf_dT*Vrth; - *(ckt->CKTrhs + here->HICUMxfNode) += -rhs_current; - // with respect to Potential Vxf - *(here->HICUMxfTempPtr) += Ixf_dT; - - // Stamp element: Ixf1 f_xf1 = + - rhs_current = -Ixf1_dT*Vrth; - *(ckt->CKTrhs + here->HICUMxf1Node) += -rhs_current; - // with respect to Potential Vxf1 - *(here->HICUMxf1TempPtr) += Ixf1_dT; - - // Stamp element: Ixf2 f_xf2 = + - rhs_current = -Ixf2_dT*Vrth; - *(ckt->CKTrhs + here->HICUMxf2Node) += -rhs_current; - // with respect to Potential Vxf2 - *(here->HICUMxf2TempPtr) += Ixf2_dT; - } - - - -// Stamp element: Ith f_T = - Ith - // Ith = -Vrth/here->HICUMrth_t.rpart; //Current from gnd to T - // Ith_Vrth = (-1/here->HICUMrth_t.rpart + Vrth/(here->HICUMrth_t.rpart*here->HICUMrth_t.rpart) * here->HICUMrth_t.dpart); - rhs_current = Ith - - Ith_Vbiei*Vbiei - Ith_Vbici*Vbici - Ith_Vciei*Vciei - - Ith_Vbpei*Vbpei - Ith_Vbpci*Vbpci - Ith_Vsici*Vsici - - Ith_Vbpbi*Vbpbi - - Ith_Vcic*Vcic - Ith_Vbbp*Vbbp - Ith_Veie*Veie - - Ith_Vrth*Vrth; - - *(ckt->CKTrhs + here->HICUMtempNode) += rhs_current; - // with respect to Potential Vrth - *(here->HICUMtempTempPtr) += -Ith_Vrth; - // with respect to Potential Vbiei - *(here->HICUMtempBaseBIPtr) += -Ith_Vbiei; - *(here->HICUMtempEmitEIPtr) += +Ith_Vbiei; - // with respect to Potential Vbici - *(here->HICUMtempBaseBIPtr) += -Ith_Vbici; - *(here->HICUMtempCollCIPtr) += +Ith_Vbici; - // with respect to Potential Vciei - *(here->HICUMtempCollCIPtr) += -Ith_Vciei; - *(here->HICUMtempEmitEIPtr) += +Ith_Vciei; - // with respect to Potential Vbpei - *(here->HICUMtempBaseBPPtr) += -Ith_Vbpei; - *(here->HICUMtempEmitEIPtr) += +Ith_Vbpei; - // with respect to Potential Vbpci - *(here->HICUMtempBaseBPPtr) += -Ith_Vbpci; - *(here->HICUMtempCollCIPtr) += +Ith_Vbpci; - // with respect to Potential Vsici - *(here->HICUMtempSubsSIPtr) += -Ith_Vsici; - *(here->HICUMtempCollCIPtr) += +Ith_Vsici; - // with respect to Potential Vbpbi - *(here->HICUMtempBaseBPPtr) += -Ith_Vbpbi; - *(here->HICUMtempBaseBIPtr) += +Ith_Vbpbi; - // with respect to Potential Vcic - *(here->HICUMtempCollCIPtr) += -Ith_Vcic; - *(here->HICUMtempCollPtr) += +Ith_Vcic; - // with respect to Potential Vbbp - *(here->HICUMtempBasePtr) += -Ith_Vbbp; - *(here->HICUMtempBaseBPPtr) += +Ith_Vbbp; - // with respect to Potential Veie - *(here->HICUMtempEmitEIPtr) += -Ith_Veie; - *(here->HICUMtempEmitPtr) += +Ith_Veie; - -// Cth f_T = - (put this separate to Ith to get signs right) - rhs_current = Icth - Vrth * Icth_Vrth; - *(ckt->CKTrhs + here->HICUMtempNode) += -rhs_current; - *(here->HICUMtempTempPtr) += +Icth_Vrth; - -// Stamp element: Rth f_T = + - rhs_current = Vrth/here->HICUMrth_t.rpart - Irth_Vrth*Vrth; - *(ckt->CKTrhs + here->HICUMtempNode) += -rhs_current; - *(here->HICUMtempTempPtr) += Irth_Vrth; - } - } - - } - return(OK); -} diff --git a/src/spicelib/devices/hicum2/hicumL2.hpp b/src/spicelib/devices/hicum2/hicumL2.hpp deleted file mode 100644 index 799e29856..000000000 --- a/src/spicelib/devices/hicum2/hicumL2.hpp +++ /dev/null @@ -1,22 +0,0 @@ -/********** -License : 3-clause BSD -Spice3 Implementation: 2019-2020 Dietmar Warning, Markus Müller, Mario Krattenmacher -Model Author : 1990 Michael Schröter TU Dresden -**********/ -#ifndef hicumL2_H -#define hicumL2_H -#include "hicum2defs.h" - -#ifdef __cplusplus -extern "C" { -#endif - void hicum_diode(double T, double IS, double UM1, double U, double *Iz, double *Gz, double *Tz); - void hicum_qjmodf(double T, double c_0, double u_d, double z, double a_j, double U_cap, double *C, double *C_dU, double *C_dvt, double *Qz, double *Qz_dU, double *Qz_dvt); - void hicum_thermal_update(HICUMmodel *, HICUMinstance *, double * Temp, double * Tdev_Vrth); - int HICUMload(GENmodel *inModel, CKTcircuit *ckt); - int HICUMtemp(GENmodel *inModel, CKTcircuit *ckt); -#ifdef __cplusplus -} -#endif - -#endif /* hicumL2_H */ \ No newline at end of file diff --git a/src/spicelib/devices/hicum2/hicumL2temp.cpp b/src/spicelib/devices/hicum2/hicumL2temp.cpp deleted file mode 100644 index e76acfd4d..000000000 --- a/src/spicelib/devices/hicum2/hicumL2temp.cpp +++ /dev/null @@ -1,519 +0,0 @@ -/********** -License : 3-clause BSD -Spice3 Implementation: 2019-2020 Dietmar Warning, Markus Müller, Mario Krattenmacher -Model Author : 1990 Michael Schröter TU Dresden -**********/ - -#include -#ifndef M_PI -#define M_PI 3.1415926535897932384626433832795 -#endif -#include "duals/dual" -#include "hicumL2.hpp" -#include - -//ngspice header files written in C -#ifdef __cplusplus -extern "C" -{ -#endif -#include "ngspice/ngspice.h" -#include "ngspice/cktdefs.h" -#include "ngspice/smpdefs.h" -#include "hicum2defs.h" -#include "ngspice/const.h" -#include "ngspice/sperror.h" -#include "ngspice/ifsim.h" -#include "ngspice/suffix.h" -#ifdef __cplusplus -} -#endif - -using namespace duals::literals; - -#define TMAX 326.85 -#define TMIN -100.0 -#define LN_EXP_LIMIT 11.0 - -duals::duald clip_temperature(duals::duald T){ - // smooth clipping function for device temperature, if self heating increases temperature beyond - // T0+TMAX or below T0-TMIN - duals::duald Tdev; - Tdev = T; - if (T<(TMIN+CONSTCtoK+1.0)){ - Tdev = TMIN+CONSTCtoK+exp(T-TMIN+CONSTCtoK-1.0); - } else if (T>(TMAX+CONSTCtoK-1.0)) { - Tdev = TMAX+CONSTCtoK-exp(TMAX+CONSTCtoK-T-1.0); - }; - return Tdev; -}; - -void TMPHICJ(double , double , double , double , double , - double , double , double , double , double , double , - double *, double *, double *); - -// TEMPERATURE UPDATE OF JUNCTION CAPACITANCE RELATED PARAMETERS -// INPUT: -// mostly model parameters -// x : zero bias junction capacitance -// y : junction built-in potential -// z : grading co-efficient -// w : ratio of maximum to zero-bias value of capacitance or punch-through voltage -// is_al : condition factor to check what "w" stands for -// vgeff : band-gap voltage -// IMPLICIT INPUT: -// vt : thermal voltage -// vt0,qtt0,ln_qtt0,mg : other model variables -// OUTPUT: -// c_j_t : temperature update of "c_j" -// vd_t : temperature update of "vd0" -// w_t : temperature update of "w" -void TMPHICJ(duals::duald vt, double vt0, duals::duald qtt0, duals::duald ln_qtt0, double mg, - double c_j, double vd0, double z, double w, double is_al, double vgeff, - duals::duald *c_j_t, duals::duald *vd_t, duals::duald *w_t) -{ -duals::duald vdj0,vdjt,vdt; - -if (c_j > 0.0) { - vdj0 = 2*vt0*log(exp(vd0*0.5/vt0)-exp(-0.5*vd0/vt0)); - vdjt = vdj0*qtt0+vgeff*(1-qtt0)-mg*vt*ln_qtt0; - vdt = vdjt+2*vt*log(0.5*(1+sqrt(1+4*exp(-vdjt/vt)))); - *vd_t = vdt; - *c_j_t = c_j*exp(z*log(vd0/(*vd_t))); - if (is_al == 1) { - *w_t = w*(*vd_t)/vd0; - } else { - *w_t = w; - } - } else { - *c_j_t = c_j; - *vd_t = vd0; - *w_t = w; - } -} - -void hicum_TMPHICJ(duals::duald vt, double vt0, duals::duald qtt0, duals::duald ln_qtt0, double mg, - double c_j, double vd0, double z, double w, double is_al, double vgeff, - double *c_j_t, double *vd_t, double *w_t, - double *c_j_t_dT, double *vd_t_dT, double *w_t_dT) -{ - duals::duald c_j_t_result; - duals::duald vd_t_result; - duals::duald w_t_result; - TMPHICJ(vt, vt0, qtt0, ln_qtt0, mg, c_j, vd0, z, w, is_al, vgeff, &c_j_t_result, &vd_t_result, &w_t_result); - *c_j_t = c_j_t_result.rpart(); - *c_j_t_dT = c_j_t_result.dpart(); - *vd_t = vd_t_result.rpart(); - *vd_t_dT = vd_t_result.dpart(); - *w_t = w_t_result.rpart(); - *w_t_dT = w_t_result.dpart(); -} - - -int -HICUMtemp(GENmodel *inModel, CKTcircuit *ckt) - /* Pre-compute many useful parameters - */ -{ - HICUMmodel *model = (HICUMmodel *)inModel; - HICUMinstance *here; - - /* loop through all the bipolar models */ - for( ; model != NULL; model = HICUMnextModel(model)) { - - /* loop through all the instances of the model */ - for (here = HICUMinstances(model); here != NULL ; - here=HICUMnextInstance(here)) { - - if(!here->HICUMtempGiven) here->HICUMtemp = ckt->CKTtemp; - - if(here->HICUMdtempGiven) here->HICUMtemp = here->HICUMtemp + here->HICUMdtemp; - - hicum_thermal_update(model, here, &here -> HICUMtemp, &here->HICUMtemp_Vrth); - - } - } - return(OK); -} - -void hicum_thermal_update(HICUMmodel *inModel, HICUMinstance *inInstance, double * HICUMTemp, double * Tdev_Vrth) -{ - HICUMmodel *model = (HICUMmodel *)inModel; - HICUMinstance *here = (HICUMinstance *)inInstance; - - double mg,k10,k20,avs,vgb_t0,vge_t0,vgbe_t0,vgbe0,vgbc0,vgsc0; - double zetabci,zetabcxt,zetasct; - duals::duald temp, dT, vt, qtt0, ln_qtt0; - duals::duald k1,k2,dvg0,vge_t,vgb_t,vgbe_t,cratio_t,a; - double cratio_t_real, cratio_t_dual; - double Tnom, zetatef, cjcx01, cjcx02, C_1; - duals::duald cjei0_t, vdei_t, cjep0_t, vdep_t; - - Tnom = model->HICUMtnom; - k10 = model->HICUMf1vg*Tnom*log(Tnom); - k20 = model->HICUMf2vg*Tnom; - avs = model->HICUMalvs*Tnom; - vgb_t0 = model->HICUMvgb+k10+k20; - vge_t0 = model->HICUMvge+k10+k20; - vgbe_t0 = (vgb_t0+vge_t0)/2; - - vgbe0 = (model->HICUMvgb+model->HICUMvge)/2; - vgbc0 = (model->HICUMvgb+model->HICUMvgc)/2; - vgsc0 = (model->HICUMvgs+model->HICUMvgc)/2; - - mg = 3-model->HICUMf1vg/CONSTKoverQ; - zetabci = mg+1-model->HICUMzetaci; - zetabcxt= mg+1-model->HICUMzetacx; - zetasct = mg-1.5; - - - // Smooth ngspice T clipping - temp = clip_temperature( *(HICUMTemp)+1_e ); - *(HICUMTemp) = temp.rpart(); - *(Tdev_Vrth) = temp.dpart(); - - // original HICUM clipping for Tdev => left here for reference - // *(Tdev_Vrth) = 1.0; - // if(*(HICUMTemp) < TMIN + CONSTCtoK) { - // *(HICUMTemp) = TMIN + CONSTCtoK; - // *(Tdev_Vrth) = 0.0; - // } else { - // if (*(HICUMTemp) > TMAX + CONSTCtoK) { - // *(HICUMTemp) = TMAX + CONSTCtoK; - // *(Tdev_Vrth) = 0.0; - // } - //} - - //This routine calculates the derivatives with respect to Vrth. Since at some point - // Tdev becomes constant (see above), we need to account for this like below. - //temp = *(HICUMTemp)+1_e* *(Tdev_Vrth); // dual number device temperature - - vt = temp*CONSTKoverQ; // dual valued temperature voltage - - here->HICUMvt0 = Tnom * CONSTKoverQ; - here->HICUMvt.rpart = vt.rpart(); - here->HICUMvt.dpart = vt.dpart(); - dT = temp-Tnom; - qtt0 = temp/Tnom; - ln_qtt0 = log(qtt0); - - k1 = model->HICUMf1vg*temp*log(temp); - k2 = model->HICUMf2vg*temp; - vgb_t = model->HICUMvgb+k1+k2; - vge_t = model->HICUMvge+k1+k2; - vgbe_t = (vgb_t+vge_t)/2; - - here->HICUMtVcrit = here->HICUMvt.rpart * - log(here->HICUMvt.rpart / (CONSTroot2*here->HICUMibeis_scaled)); - - //Internal b-e junction capacitance - hicum_TMPHICJ(vt, here->HICUMvt0, qtt0, ln_qtt0, mg, - here->HICUMcjei0_scaled, model->HICUMvdei, model->HICUMzei, model->HICUMajei, 1, vgbe0, - &here->HICUMcjei0_t.rpart, &here->HICUMvdei_t.rpart, &here->HICUMajei_t.rpart, - &here->HICUMcjei0_t.dpart, &here->HICUMvdei_t.dpart, &here->HICUMajei_t.dpart); - cjei0_t.rpart(here->HICUMcjei0_t.rpart); - cjei0_t.dpart(here->HICUMcjei0_t.dpart); - vdei_t.rpart(here->HICUMvdei_t.rpart); - vdei_t.dpart(here->HICUMvdei_t.dpart); - - if (model->HICUMflcomp < 2.3) { - duals::duald V_gT, r_VgVT, k; - V_gT = 3.0*vt*ln_qtt0 + model->HICUMvgb*(qtt0-1.0); - r_VgVT = V_gT/vt; - //Internal b-e diode saturation currents - a = model->HICUMmcf*r_VgVT/model->HICUMmbei - model->HICUMalb*dT; - a = here->HICUMibeis_scaled*exp(a); - here->HICUMibeis_t.rpart = a.rpart(); - here->HICUMibeis_t.dpart = a.dpart(); - - a = model->HICUMmcf*r_VgVT/model->HICUMmrei - model->HICUMalb*dT; - a = here->HICUMireis_scaled*exp(a); - here->HICUMireis_t.rpart = a.rpart(); - here->HICUMireis_t.dpart = a.dpart(); - - //Peripheral b-e diode saturation currents - a = model->HICUMmcf*r_VgVT/model->HICUMmbep - model->HICUMalb*dT; - a = here->HICUMibeps_scaled*exp(a); - here->HICUMibeps_t.rpart = a.rpart(); - here->HICUMibeps_t.dpart = a.dpart(); - - a = model->HICUMmcf*r_VgVT/model->HICUMmrep - model->HICUMalb*dT; - a = here->HICUMireps_scaled*exp(a); - here->HICUMireps_t.rpart = a.rpart(); - here->HICUMireps_t.dpart = a.dpart(); - //Internal b-c diode saturation current - a = r_VgVT/model->HICUMmbci; - a = here->HICUMibcis_scaled*exp(a); - here->HICUMibcis_t.rpart = a.rpart(); - here->HICUMibcis_t.dpart = a.dpart(); - //External b-c diode saturation currents - a = r_VgVT/model->HICUMmbcx; - a = here->HICUMibcxs_scaled*exp(a); - here->HICUMibcxs_t.rpart = a.rpart(); - here->HICUMibcxs_t.dpart = a.dpart(); - //Saturation transfer current for substrate transistor - a = r_VgVT/model->HICUMmsf; - a = model->HICUMitss*exp(a); - here->HICUMitss_t.rpart = a.rpart(); - here->HICUMitss_t.rpart = a.dpart(); - //Saturation current for c-s diode - a = r_VgVT/model->HICUMmsc; - a = model->HICUMiscs*exp(a); - here->HICUMiscs_t.rpart = a.rpart(); - here->HICUMiscs_t.dpart = a.dpart(); - //Zero bias hole charge - a = vdei_t/model->HICUMvdei; - a = here->HICUMqp0_scaled*(1.0+0.5*model->HICUMzei*(1.0-a)); - here->HICUMqp0_t.rpart = a.rpart(); - here->HICUMqp0_t.dpart = a.dpart(); - //Voltage separating ohmic and saturation velocity regime - a = model->HICUMvlim*(1.0-model->HICUMalvs*dT)*exp(model->HICUMzetaci*ln_qtt0); - k = (a-vt)/vt; - if (k.rpart() < LN_EXP_LIMIT) { - a = vt + vt*log(1.0+exp(k)); - } - here->HICUMvlim_t.rpart = a.rpart(); - here->HICUMvlim_t.dpart = a.dpart(); - - //Neutral emitter storage time - a = 1.0+model->HICUMalb*dT; - k = 0.5*(a+sqrt(a*a+0.01)); - a = model->HICUMtef0*qtt0/k; - here->HICUMtef0_t.rpart = a.rpart(); - here->HICUMtef0_t.dpart = a.dpart(); - } else { - //Internal b-e diode saturation currents - a = here->HICUMibeis_scaled*exp(model->HICUMzetabet*ln_qtt0+model->HICUMvge/vt*(qtt0-1)); - here->HICUMibeis_t.rpart = a.rpart(); - here->HICUMibeis_t.dpart = a.dpart(); - if (model->HICUMflcomp>=2.3) { - a = here->HICUMireis_scaled*exp(mg/model->HICUMmrei*ln_qtt0+vgbe0/(model->HICUMmrei*vt)*(qtt0-1)); - } else { - a = here->HICUMireis_scaled*exp(0.5*mg*ln_qtt0+0.5*vgbe0/vt*(qtt0-1)); - } - here->HICUMireis_t.rpart = a.rpart(); - here->HICUMireis_t.dpart = a.dpart(); - //Peripheral b-e diode saturation currents - a = here->HICUMibeps_scaled*exp(model->HICUMzetabet*ln_qtt0+model->HICUMvge/vt*(qtt0-1)); - here->HICUMibeps_t.rpart = a.rpart(); - here->HICUMibeps_t.dpart = a.dpart(); - if (model->HICUMflcomp>=2.3) { - a = here->HICUMireps_scaled*exp(mg/model->HICUMmrep*ln_qtt0+vgbe0/(model->HICUMmrep*vt)*(qtt0-1)); - } else { - a = here->HICUMireps_scaled*exp(0.5*mg*qtt0+0.5*vgbe0/vt*(qtt0-1)); - } - here->HICUMireps_t.rpart = a.rpart(); - here->HICUMireps_t.dpart = a.dpart(); - //Internal b-c diode saturation currents - a = here->HICUMibcis_scaled*exp(zetabci*ln_qtt0+model->HICUMvgc/vt*(qtt0-1)); - here->HICUMibcis_t.rpart = a.rpart(); - here->HICUMibcis_t.dpart = a.dpart(); - //External b-c diode saturation currents - a = here->HICUMibcxs_scaled*exp(zetabcxt*ln_qtt0+model->HICUMvgc/vt*(qtt0-1)); - here->HICUMibcxs_t.rpart = a.rpart(); - here->HICUMibcxs_t.dpart = a.dpart(); - //Saturation transfer current for substrate transistor - a = model->HICUMitss*exp(zetasct*ln_qtt0+model->HICUMvgc/vt*(qtt0-1)); - here->HICUMitss_t.rpart = a.rpart(); - here->HICUMitss_t.dpart = a.dpart(); - //Saturation current for c-s diode - a = model->HICUMiscs*exp(zetasct*ln_qtt0+model->HICUMvgs/vt*(qtt0-1)); - here->HICUMiscs_t.rpart = a.rpart(); - here->HICUMiscs_t.dpart = a.dpart(); - //Zero bias hole charge - a = exp(model->HICUMzei*log(vdei_t/model->HICUMvdei)); - a = here->HICUMqp0_scaled*(2.0-a); - here->HICUMqp0_t.rpart = a.rpart(); - here->HICUMqp0_t.dpart = a.dpart(); - //Voltage separating ohmic and saturation velocity regime - a = model->HICUMvlim*exp((model->HICUMzetaci-avs)*ln_qtt0); - here->HICUMvlim_t.rpart = a.rpart(); - here->HICUMvlim_t.dpart = a.dpart(); - //Neutral emitter storage time - if (model->HICUMflcomp >= 2.3) { - a = model->HICUMtef0; - } else { - zetatef = model->HICUMzetabet-model->HICUMzetact-0.5; - dvg0 = model->HICUMvgb-model->HICUMvge; - a = model->HICUMtef0*exp(zetatef*ln_qtt0-dvg0/vt*(qtt0-1)); - } - here->HICUMtef0_t.rpart = a.rpart(); - here->HICUMtef0_t.dpart = a.dpart(); - } - - //GICCR prefactor - a = here->HICUMc10_scaled*exp(model->HICUMzetact*ln_qtt0+model->HICUMvgb/vt*(qtt0-1)); - here->HICUMc10_t.rpart = a.rpart(); - here->HICUMc10_t.dpart = a.dpart(); - - // Low-field internal collector resistance - a = here->HICUMrci0_scaled*exp(model->HICUMzetaci*ln_qtt0); - here->HICUMrci0_t.rpart = a.rpart(); - here->HICUMrci0_t.dpart = a.dpart(); - - //Internal c-e saturation voltage - a = model->HICUMvces*(1+model->HICUMalces*dT); - here->HICUMvces_t.rpart = a.rpart(); - here->HICUMvces_t.dpart = a.dpart(); - - //Internal b-c junction capacitance - hicum_TMPHICJ(vt, here->HICUMvt0, qtt0, ln_qtt0, mg, - here->HICUMcjci0_scaled, model->HICUMvdci, model->HICUMzci, model->HICUMvptci, 0, vgbc0, - &here->HICUMcjci0_t.rpart, &here->HICUMvdci_t.rpart, &here->HICUMvptci_t.rpart, - &here->HICUMcjci0_t.dpart, &here->HICUMvdci_t.dpart, &here->HICUMvptci_t.dpart); - - //Low-current forward transit time - a = model->HICUMt0*(1+model->HICUMalt0*dT+model->HICUMkt0*dT*dT); - here->HICUMt0_t.rpart = a.rpart(); - here->HICUMt0_t.dpart = a.dpart(); - - //Saturation time constant at high current densities - a = model->HICUMthcs*exp((model->HICUMzetaci-1)*ln_qtt0); - here->HICUMthcs_t.rpart = a.rpart(); - here->HICUMthcs_t.dpart = a.dpart(); - - //Avalanche current factors - a = model->HICUMfavl*exp(model->HICUMalfav*dT); - here->HICUMfavl_t.rpart = a.rpart(); - here->HICUMfavl_t.dpart = a.dpart(); - a = here->HICUMqavl_scaled*exp(model->HICUMalqav*dT); - here->HICUMqavl_t.rpart = a.rpart(); - here->HICUMqavl_t.dpart = a.dpart(); - a = model->HICUMkavl*exp(model->HICUMalkav*dT); - here->HICUMkavl_t.rpart = a.rpart(); - here->HICUMkavl_t.dpart = a.dpart(); - - //Zero bias internal base resistance - a = here->HICUMrbi0_scaled*exp(model->HICUMzetarbi*ln_qtt0); - here->HICUMrbi0_t.rpart = a.rpart(); - here->HICUMrbi0_t.dpart = a.dpart(); - - //Peripheral b-e junction capacitance - hicum_TMPHICJ(vt, here->HICUMvt0, qtt0, ln_qtt0, mg, - here->HICUMcjep0_scaled, model->HICUMvdep, model->HICUMzep, model->HICUMajep, 1, vgbe0, - &here->HICUMcjep0_t.rpart, &here->HICUMvdep_t.rpart, &here->HICUMajep_t.rpart, - &here->HICUMcjep0_t.dpart, &here->HICUMvdep_t.dpart, &here->HICUMajep_t.dpart); - cjep0_t.rpart(here->HICUMcjep0_t.rpart); - cjep0_t.dpart(here->HICUMcjep0_t.dpart); - vdep_t.rpart(here->HICUMvdep_t.rpart); - vdep_t.dpart(here->HICUMvdep_t.dpart); - - //Tunneling current factors - if (here->HICUMibets_scaled > 0) { // HICTUN_T - duals::duald a_eg,ab,aa; - ab = 1.0; - aa = 1.0; - a_eg = vgbe_t0/vgbe_t; - if(model->HICUMtunode==1 && here->HICUMcjep0_scaled > 0.0 && model->HICUMvdep >0.0) { - ab = (cjep0_t/here->HICUMcjep0_scaled)*sqrt(a_eg)*vdep_t*vdep_t/(model->HICUMvdep*model->HICUMvdep); - aa = (model->HICUMvdep/vdep_t)*(here->HICUMcjep0_scaled/cjep0_t)*pow(a_eg,-1.5); - } else if (model->HICUMtunode==0 && here->HICUMcjei0_scaled > 0.0 && model->HICUMvdei >0.0) { - ab = (cjei0_t/here->HICUMcjei0_scaled)*sqrt(a_eg)*vdei_t*vdei_t/(model->HICUMvdei*model->HICUMvdei); - aa = (model->HICUMvdei/vdei_t)*(here->HICUMcjei0_scaled/cjei0_t)*pow(a_eg,-1.5); - } - a = here->HICUMibets_scaled*ab; - here->HICUMibets_t.rpart = a.rpart(); - here->HICUMibets_t.dpart = a.dpart(); - a = model->HICUMabet*aa; - here->HICUMabet_t.rpart = a.rpart(); - here->HICUMabet_t.dpart = a.dpart(); - } else { - here->HICUMibets_t.rpart = 0; - here->HICUMibets_t.dpart = 0; - here->HICUMabet_t.rpart = 1; - here->HICUMabet_t.dpart = 0; - } - - //Depletion capacitance splitting at b-c junction - //Capacitances at peripheral and external base node - C_1 = (1.0-model->HICUMfbcpar)*(here->HICUMcjcx0_scaled+here->HICUMcbcpar_scaled); - if (C_1 >= here->HICUMcbcpar_scaled) { - cjcx01 = C_1-here->HICUMcbcpar_scaled; - cjcx02 = here->HICUMcjcx0_scaled-cjcx01; - } else { - cjcx01 = 0.0; - cjcx02 = here->HICUMcjcx0_scaled; - } - - //Temperature mapping for tunneling current is done inside HICTUN - hicum_TMPHICJ(vt, here->HICUMvt0, qtt0, ln_qtt0, mg, - 1.0, model->HICUMvdcx, model->HICUMzcx, model->HICUMvptcx, 0, vgbc0, - &cratio_t_real, &here->HICUMvdcx_t.rpart, &here->HICUMvptcx_t.rpart, - &cratio_t_dual, &here->HICUMvdcx_t.dpart, &here->HICUMvptcx_t.dpart); - cratio_t.rpart(cratio_t_real); - cratio_t.dpart(cratio_t_dual); - a = cratio_t*cjcx01; - here->HICUMcjcx01_t.rpart = a.rpart(); - here->HICUMcjcx01_t.dpart = a.dpart(); - a = cratio_t*cjcx02; - here->HICUMcjcx02_t.rpart = a.rpart(); - here->HICUMcjcx02_t.dpart = a.dpart(); - - //Constant external series resistances - a = here->HICUMrcx_scaled*exp(model->HICUMzetarcx*ln_qtt0); - here->HICUMrcx_t.rpart = a.rpart(); - here->HICUMrcx_t.dpart = a.dpart(); - a = here->HICUMrbx_scaled*exp(model->HICUMzetarbx*ln_qtt0); - here->HICUMrbx_t.rpart = a.rpart(); - here->HICUMrbx_t.dpart = a.dpart(); - a = here->HICUMre_scaled*exp(model->HICUMzetare*ln_qtt0); - here->HICUMre_t.rpart = a.rpart(); - here->HICUMre_t.dpart = a.dpart(); - - //Forward transit time in substrate transistor - a = model->HICUMtsf*exp((model->HICUMzetacx-1.0)*ln_qtt0); - here->HICUMtsf_t.rpart = a.rpart(); - here->HICUMtsf_t.dpart = a.dpart(); - - //Capacitance for c-s junction - hicum_TMPHICJ(vt, here->HICUMvt0, qtt0, ln_qtt0, mg, - model->HICUMcjs0, model->HICUMvds, model->HICUMzs, model->HICUMvpts, 0, vgsc0, - &here->HICUMcjs0_t.rpart, &here->HICUMvds_t.rpart, &here->HICUMvpts_t.rpart, - &here->HICUMcjs0_t.dpart, &here->HICUMvds_t.dpart, &here->HICUMvpts_t.dpart); - /*Peripheral s-c capacitance - * Note, thermal update only required for model->HICUMvds > 0 - * Save computional effort otherwise - */ - if (model->HICUMvdsp > 0) { - hicum_TMPHICJ(vt, here->HICUMvt0, qtt0, ln_qtt0, mg, - model->HICUMcscp0, model->HICUMvdsp, model->HICUMzsp, model->HICUMvptsp, 0, vgsc0, - &here->HICUMcscp0_t.rpart, &here->HICUMvdsp_t.rpart, &here->HICUMvptsp_t.rpart, - &here->HICUMcscp0_t.dpart, &here->HICUMvdsp_t.dpart, &here->HICUMvptsp_t.dpart); - } else { - // Avoid uninitialized variables - here->HICUMcscp0_t.rpart = model->HICUMcscp0; - here->HICUMcscp0_t.dpart = 0; - here->HICUMvdsp_t.rpart = model->HICUMvdsp; - here->HICUMvdsp_t.dpart = 0; - here->HICUMvptsp_t.rpart = model->HICUMvptsp; - here->HICUMvptsp_t.dpart = 0; - } - - a = model->HICUMahjei*exp(model->HICUMzetahjei*ln_qtt0); - here->HICUMahjei_t.rpart = a.rpart(); - here->HICUMahjei_t.dpart = a.dpart(); - a = model->HICUMhjei*exp(model->HICUMdvgbe/vt*(exp(model->HICUMzetavgbe*log(qtt0))-1)); - here->HICUMhjei0_t.rpart = a.rpart(); - here->HICUMhjei0_t.dpart = a.dpart(); - a = model->HICUMhf0*exp(model->HICUMdvgbe/vt*(qtt0-1)); - here->HICUMhf0_t.rpart = a.rpart(); - here->HICUMhf0_t.dpart = a.dpart(); - if (model->HICUMflcomp >= 2.3) { - a = model->HICUMhfe*exp((model->HICUMvgb-model->HICUMvge)/vt*(qtt0-1)); - here->HICUMhfe_t.rpart = a.rpart(); - here->HICUMhfe_t.dpart = a.dpart(); - a = model->HICUMhfc*exp((model->HICUMvgb-model->HICUMvgc)/vt*(qtt0-1)); - here->HICUMhfc_t.rpart = a.rpart(); - here->HICUMhfc_t.dpart = a.dpart(); - } else { - here->HICUMhfe_t.rpart = model->HICUMhfe; - here->HICUMhfe_t.dpart = 0; - here->HICUMhfc_t.rpart = model->HICUMhfc; - here->HICUMhfc_t.dpart = 0; - } - - a = here->HICUMrth_scaled*exp(model->HICUMzetarth*ln_qtt0)*(1+model->HICUMalrth*dT); - here->HICUMrth_t.rpart = a.rpart(); - here->HICUMrth_t.dpart = a.dpart(); - -} diff --git a/src/spicelib/devices/hicum2/hicumL2temp.hpp b/src/spicelib/devices/hicum2/hicumL2temp.hpp deleted file mode 100644 index 02a648d85..000000000 --- a/src/spicelib/devices/hicum2/hicumL2temp.hpp +++ /dev/null @@ -1,17 +0,0 @@ -/********** -License : 3-clause BSD -Spice3 Implementation: 2019-2020 Dietmar Warning, Markus Müller, Mario Krattenmacher -Model Author : 1990 Michael Schröter TU Dresden -**********/ -#ifndef hicumL2_temp -#define hicumL2_temp -#include "hicum2defs.h" - -#ifdef __cplusplus -extern "C" { -#endif -#ifdef __cplusplus -} -#endif - -#endif /* hicumL2_temp */ \ No newline at end of file diff --git a/src/spicelib/devices/hisim2/Makefile.am b/src/spicelib/devices/hisim2/Makefile.am deleted file mode 100644 index 8d9090512..000000000 --- a/src/spicelib/devices/hisim2/Makefile.am +++ /dev/null @@ -1,37 +0,0 @@ -## Process this file with automake to produce Makefile.in - -EXTRA_DIST = - -noinst_LTLIBRARIES = libhisim2.la - -libhisim2_la_SOURCES = hisim2.h \ - hsm2.c \ - hsm2acld.c \ - hsm2ask.c \ - hsm2cvtest.c \ - hsm2def.h \ - hsm2eval.c \ - hsm2evalenv.h \ - hsm2eval_dep.h \ - hsm2ext.h \ - hsm2getic.c \ - hsm2init.c \ - hsm2init.h \ - hsm2itf.h \ - hsm2ld.c \ - hsm2mask.c \ - hsm2mdel.c \ - hsm2mpar.c \ - hsm2noi.c \ - hsm2par.c \ - hsm2pzld.c \ - hsm2set.c \ - hsm2soachk.c \ - hsm2temp.c \ - hsm2trunc.c - - -AM_CPPFLAGS = @AM_CPPFLAGS@ -I$(top_srcdir)/src/include -AM_CFLAGS = $(STATIC) - -MAINTAINERCLEANFILES = Makefile.in diff --git a/src/spicelib/devices/hisim2/hisim2.h b/src/spicelib/devices/hisim2/hisim2.h deleted file mode 100644 index 5acf36f46..000000000 --- a/src/spicelib/devices/hisim2/hisim2.h +++ /dev/null @@ -1,72 +0,0 @@ -/*********************************************************************** - - HiSIM (Hiroshima University STARC IGFET Model) - Copyright (C) 2014 Hiroshima University & STARC - - MODEL NAME : HiSIM - ( VERSION : 2 SUBVERSION : 8 REVISION : 0 ) - - FILE : hisim2.h - - Date : 2014.6.5 - - released by - Hiroshima University & - Semiconductor Technology Academic Research Center (STARC) -***********************************************************************/ - -#include "hsm2def.h" -#include "ngspice/cktdefs.h" - -#ifndef _HiSIM2_H -#define _HiSIM2_H - -/* return value */ -#ifndef OK -#define HiSIM_OK 0 -#define HiSIM_ERROR 1 -#else -#define HiSIM_OK OK -#define HiSIM_ERROR E_PANIC -#endif - -/* MOS type */ -#ifndef NMOS -#define NMOS 1 -#define PMOS -1 -#endif - -/* device working mode */ -#ifndef CMI_NORMAL_MODE -#define HiSIM_NORMAL_MODE 1 -#define HiSIM_REVERSE_MODE -1 -#else -#define HiSIM_NORMAL_MODE CMI_NORMAL_MODE -#define HiSIM_REVERSE_MODE CMI_REVERSE_MODE -#endif - -/* others */ -#ifndef NULL -#define NULL 0 -#endif - -#define HiSIM_FALSE 0 -#define HiSIM_TRUE 1 - -#ifndef return_if_error -#define return_if_error(s) { int error = s; if(error) return(error); } -#endif - -extern int HSM2evaluate -( - double ivds, - double ivgs, - double ivbs, - double vbs_jct, - double vbd_jct, - HSM2instance *here, - HSM2model *model, - CKTcircuit *ckt - ) ; - -#endif /* _HiSIM2_H */ diff --git a/src/spicelib/devices/hisim2/hsm2.c b/src/spicelib/devices/hisim2/hsm2.c deleted file mode 100644 index 59b8b5aa2..000000000 --- a/src/spicelib/devices/hisim2/hsm2.c +++ /dev/null @@ -1,727 +0,0 @@ -/*********************************************************************** - - HiSIM (Hiroshima University STARC IGFET Model) - Copyright (C) 2014 Hiroshima University & STARC - - MODEL NAME : HiSIM - ( VERSION : 2 SUBVERSION : 8 REVISION : 0 ) - - FILE : hsm2.c - - Date : 2014.6.5 - - released by - Hiroshima University & - Semiconductor Technology Academic Research Center (STARC) -***********************************************************************/ - -/********************************************************************** - -The following source code, and all copyrights, trade secrets or other -intellectual property rights in and to the source code in its entirety, -is owned by the Hiroshima University and the STARC organization. - -All users need to follow the "HiSIM2 Distribution Statement and -Copyright Notice" attached to HiSIM2 model. - ------HiSIM2 Distribution Statement and Copyright Notice-------------- - -Software is distributed as is, completely without warranty or service -support. Hiroshima University or STARC and its employees are not liable -for the condition or performance of the software. - -Hiroshima University and STARC own the copyright and grant users a perpetual, -irrevocable, worldwide, non-exclusive, royalty-free license with respect -to the software as set forth below. - -Hiroshima University and STARC hereby disclaim all implied warranties. - -Hiroshima University and STARC grant the users the right to modify, copy, -and redistribute the software and documentation, both within the user's -organization and externally, subject to the following restrictions - -1. The users agree not to charge for Hiroshima University and STARC code -itself but may charge for additions, extensions, or support. - -2. In any product based on the software, the users agree to acknowledge -Hiroshima University and STARC that developed the software. This -acknowledgment shall appear in the product documentation. - -3. The users agree to reproduce any copyright notice which appears on -the software on any copy or modification of such made available -to others." - - -*************************************************************************/ - -#include "ngspice/ngspice.h" -#include "ngspice/devdefs.h" -#include "hsm2def.h" -#include "ngspice/suffix.h" - -IFparm HSM2pTable[] = { /* parameters */ - IOP( "l", HSM2_L, IF_REAL , "Length"), - IOP( "w", HSM2_W, IF_REAL , "Width"), - IOP( "ad", HSM2_AD, IF_REAL , "Drain area"), - IOP( "as", HSM2_AS, IF_REAL , "Source area"), - IOP( "pd", HSM2_PD, IF_REAL , "Drain perimeter"), - IOP( "ps", HSM2_PS, IF_REAL , "Source perimeter"), - IOP( "nrd", HSM2_NRD, IF_REAL , "Number of squares in drain"), - IOP( "nrs", HSM2_NRS, IF_REAL , "Number of squares in source"), - IOP( "temp", HSM2_TEMP, IF_REAL , "Lattice temperature [K]"), - IOP( "dtemp", HSM2_DTEMP,IF_REAL , ""), - IOP( "off", HSM2_OFF, IF_FLAG , "Device is initially off"), - IP ( "ic", HSM2_IC, IF_REALVEC , "Vector of DS,GS,BS initial voltages"), - IOP("corbnet", HSM2_CORBNET, IF_INTEGER, "activate body resistance (1) or not (0)"), - IOP("rbpb", HSM2_RBPB, IF_REAL, ""), - IOP("rbpd", HSM2_RBPD, IF_REAL, ""), - IOP("rbps", HSM2_RBPS, IF_REAL, ""), - IOP("rbdb", HSM2_RBDB, IF_REAL, ""), - IOP("rbsb", HSM2_RBSB, IF_REAL, ""), - IOP("corg", HSM2_CORG, IF_INTEGER, "activate gate resistance (1) or not (0)"), -/* IOP("rshg", HSM2_RSHG, IF_REAL, "gate-elecrode sheet resistance"), */ - IOP("ngcon", HSM2_NGCON, IF_REAL, "number of gate contacts"), - IOP("xgw", HSM2_XGW, IF_REAL, "distance from gate contact to channel edge"), - IOP("xgl", HSM2_XGL, IF_REAL, "offset of gate length due to variation in patterning"), - IOP("nf", HSM2_NF, IF_REAL, "number of fingers"), - IOP("sa", HSM2_SA, IF_REAL, "distance from STI edge to Gate edge [m]"), - IOP("sb", HSM2_SB, IF_REAL, "distance from STI edge to Gate edge [m]"), - IOP("sd", HSM2_SD, IF_REAL, "distance from Gate edge to Gate edge [m]"), - IOP("nsubcdfm", HSM2_NSUBCDFM, IF_REAL, "constant part of Nsub for DFM [1/cm^3]"), - IOP("mphdfm", HSM2_MPHDFM, IF_REAL, "NSUBCDFM dependence of phonon scattering for DFM"), - IOP("m", HSM2_M, IF_REAL, "Multiplication factor [-]"), -/* WPE */ - IOP("sca", HSM2_SCA, IF_REAL, "WPE sca"), - IOP("scb", HSM2_SCB, IF_REAL, "WPE scb"), - IOP("scc", HSM2_SCC, IF_REAL, "WPE scc"), - - /* Output Physical Values: */ - OP ( "ids", HSM2_CD, IF_REAL , "Ids"), /* Drain-Source current */ - OP ( "isub", HSM2_ISUB, IF_REAL , "Isub"), /* Substrate current */ - OP ( "igidl", HSM2_IGIDL, IF_REAL , "Igidl"), /* Gate-Induced Drain Leakage current */ - OP ( "igisl", HSM2_IGISL, IF_REAL , "Igisl"), /* Gate-Induced Source Leakage current */ - OP ( "igd", HSM2_IGD, IF_REAL , "Igd"), /* Gate-Drain current */ - OP ( "igs", HSM2_IGS, IF_REAL , "Igs"), /* Gate-Source current */ - OP ( "igb", HSM2_IGB, IF_REAL , "Igb"), /* Gate-Substrate current */ - OP ( "gm", HSM2_GM, IF_REAL , "Gm"), /* Transconductance */ - OP ( "gds", HSM2_GDS, IF_REAL , "Gds"), /* Channel conductance */ - OP ( "gmbs", HSM2_GMBS, IF_REAL , "Gmbs"), /* Body effect (Back gate) transconductance */ - OP ( "von", HSM2_VON, IF_REAL , "Von"), /* Threshold voltage */ - OP ( "vdsat", HSM2_VDSAT, IF_REAL , "Vdsat"), /* Saturation voltage */ - OP ( "qb", HSM2_QB, IF_REAL , "Qb"), /* Bulk charge */ - OP ( "qg", HSM2_QG, IF_REAL , "Qg"), /* Gate charge */ - OP ( "qd", HSM2_QD, IF_REAL , "Qd"), /* Drain charge */ - OP ( "cgg", HSM2_CGG, IF_REAL , "Cgg"), /* MOSFET capacitance */ - OP ( "cgd", HSM2_CGD, IF_REAL , "Cgd"), /* MOSFET capacitance */ - OP ( "cgs", HSM2_CGS, IF_REAL , "Cgs"), /* MOSFET capacitance */ - OP ( "cbg", HSM2_CBG, IF_REAL , "Cbg"), /* MOSFET capacitance */ - OP ( "cbs", HSM2_CBSB, IF_REAL , "Cbs"), /* MOSFET capacitance */ - OP ( "cbd", HSM2_CBDB, IF_REAL , "Cbd"), /* MOSFET capacitance */ - OP ( "cdg", HSM2_CDG, IF_REAL , "Cdg"), /* MOSFET capacitance */ - OP ( "cdd", HSM2_CDD, IF_REAL , "Cdd"), /* MOSFET capacitance */ - OP ( "cds", HSM2_CDS, IF_REAL , "Cds"), /* MOSFET capacitance */ - OP ( "cgdo", HSM2_CGDO, IF_REAL , "Cgdo"), /* MOSFET overlap capacitance */ - OP ( "cgso", HSM2_CGSO, IF_REAL , "Cgso"), /* MOSFET overlap capacitance */ - OP ( "cgbo", HSM2_CGBO, IF_REAL , "Cgbo"), /* MOSFET overlap capacitance */ - OP ( "ibd", HSM2_CBD, IF_REAL , "Ibd"), /* Diode current */ - OP ( "ibs", HSM2_CBS, IF_REAL , "Ibs"), /* Diode current */ - OP ( "gbd", HSM2_GBD, IF_REAL , "Gbd"), /* Diode conductance */ - OP ( "gbs", HSM2_GBS, IF_REAL , "Gbs"), /* Diode conductance */ - OP ( "capbd", HSM2_CAPBD, IF_REAL , "Capbd"), /* Diode capacitance */ - OP ( "capbs", HSM2_CAPBS, IF_REAL , "Capbs") /* Diode capacitance */ -}; - -IFparm HSM2mPTable[] = { /* model parameters */ - IP("nmos", HSM2_MOD_NMOS, IF_FLAG, ""), - IP("pmos", HSM2_MOD_PMOS, IF_FLAG, ""), - IOP("level", HSM2_MOD_LEVEL, IF_INTEGER, ""), - IOP("info", HSM2_MOD_INFO, IF_INTEGER, "information level (for debug, etc.)"), - IOP("noise", HSM2_MOD_NOISE, IF_INTEGER, "noise model selector"), - IOP("version", HSM2_MOD_VERSION, IF_INTEGER, "model version 280"), - IOP("show", HSM2_MOD_SHOW, IF_INTEGER, "show physical value"), - IOP("corsrd", HSM2_MOD_CORSRD, IF_INTEGER, "solve equations accounting Rs and Rd."), - IOP("corg", HSM2_MOD_CORG, IF_INTEGER, "solve equations accounting Rg."), - IOP("coiprv", HSM2_MOD_COIPRV, IF_INTEGER, "use ids_prv as initial guess of Ids (internal flag)"), - IOP("copprv", HSM2_MOD_COPPRV, IF_INTEGER, "use ps{0/l}_prv as initial guess of Ps{0/l} (internal flag)"), - IOP("coadov", HSM2_MOD_COADOV, IF_INTEGER, "add overlap to intrisic"), - IOP("coisub", HSM2_MOD_COISUB, IF_INTEGER, "calculate isub"), - IOP("coiigs", HSM2_MOD_COIIGS, IF_INTEGER, "calculate igate"), - IOP("cogidl", HSM2_MOD_COGIDL, IF_INTEGER, "calculate igidl"), - IOP("coovlp", HSM2_MOD_COOVLP, IF_INTEGER, "calculate overlap charge"), - IOP("coflick", HSM2_MOD_COFLICK, IF_INTEGER, "calculate 1/f noise"), - IOP("coisti", HSM2_MOD_COISTI, IF_INTEGER, "calculate STI"), - IOP("conqs", HSM2_MOD_CONQS, IF_INTEGER, "calculate in nqs mode or qs mode"), - IOP("corbnet", HSM2_MOD_CORBNET, IF_INTEGER, ""), - IOP("cothrml", HSM2_MOD_COTHRML, IF_INTEGER, "calculate thermal noise"), - IOP("coign", HSM2_MOD_COIGN, IF_INTEGER, "calculate induced gate noise"), - IOP("codfm", HSM2_MOD_CODFM, IF_INTEGER, "calculation of model for DFM"), - IOP("corecip", HSM2_MOD_CORECIP, IF_INTEGER, "capacitance reciprocity takes first priority"), - IOP("coqy", HSM2_MOD_COQY, IF_INTEGER, "calculate lateral-field-induced charge/capacitance"), - IOP("coqovsm", HSM2_MOD_COQOVSM, IF_INTEGER, "select smoothing method of Qover"), - IOP("coerrrep", HSM2_MOD_COERRREP, IF_INTEGER, "selector for error report"), - IOP("codep", HSM2_MOD_CODEP, IF_INTEGER, "selector for depletion device"), - IOP("coddlt", HSM2_MOD_CODDLT, IF_INTEGER, "selector for ddlt model "), - IOP("vmax", HSM2_MOD_VMAX, IF_REAL, "saturation velocity [cm/s]"), - IOP("bgtmp1", HSM2_MOD_BGTMP1, IF_REAL, "first order temp. coeff. for band gap [V/K]"), - IOP("bgtmp2", HSM2_MOD_BGTMP2, IF_REAL, "second order temp. coeff. for band gap [V/K^2]"), - IOP("eg0", HSM2_MOD_EG0, IF_REAL, ""), - IOP("tox", HSM2_MOD_TOX, IF_REAL, "oxide thickness [m]"), - IOP("xld", HSM2_MOD_XLD, IF_REAL, "lateral diffusion of S/D under the gate [m]"), - IOP("lover", HSM2_MOD_LOVER, IF_REAL, "overlap length"), - IOP("ddltmax", HSM2_MOD_DDLTMAX, IF_REAL, ""), /* Vdseff */ - IOP("ddltslp", HSM2_MOD_DDLTSLP, IF_REAL, ""), /* Vdseff */ - IOP("ddltict", HSM2_MOD_DDLTICT, IF_REAL, ""), /* Vdseff */ - IOP("vfbover", HSM2_MOD_VFBOVER, IF_REAL, ""), - IOP("nover", HSM2_MOD_NOVER, IF_REAL, ""), - IOP("xwd", HSM2_MOD_XWD, IF_REAL, "lateral diffusion along the width dir. [m]"), - IOP("xl", HSM2_MOD_XL, IF_REAL, "gate length offset due to mask/etch effect [m]"), - IOP("xw", HSM2_MOD_XW, IF_REAL, "gate width offset due to mask/etch effect [m]"), - IOP("saref", HSM2_MOD_SAREF, IF_REAL, "reference distance from STI edge to Gate edge [m]"), - IOP("sbref", HSM2_MOD_SBREF, IF_REAL, "reference distance from STI edge to Gate edge [m]"), - IOP("ll", HSM2_MOD_LL, IF_REAL, "gate length parameter"), - IOP("lld", HSM2_MOD_LLD, IF_REAL, "gate length parameter"), - IOP("lln", HSM2_MOD_LLN, IF_REAL, "gate length parameter"), - IOP("wl", HSM2_MOD_WL, IF_REAL, "gate width parameter"), - IOP("wl1", HSM2_MOD_WL1, IF_REAL, "gate width parameter"), - IOP("wl1p", HSM2_MOD_WL1P, IF_REAL, "gate width parameter"), - IOP("wl2", HSM2_MOD_WL2, IF_REAL, "gate width parameter"), - IOP("wl2p", HSM2_MOD_WL2P, IF_REAL, "gate width parameter"), - IOP("wld", HSM2_MOD_WLD, IF_REAL, "gate width parameter"), - IOP("wln", HSM2_MOD_WLN, IF_REAL, "gate width parameter"), - IOP("xqy", HSM2_MOD_XQY, IF_REAL, "[m]"), - IOP("xqy1", HSM2_MOD_XQY1, IF_REAL, "[F m^{XQY2}]"), - IOP("xqy2", HSM2_MOD_XQY2, IF_REAL, "[-]"), - IOP("qyrat", HSM2_MOD_QYRAT, IF_REAL, ""), - IOP("rs", HSM2_MOD_RS, IF_REAL, "source contact resistance [ohm m]"), - IOP("rd", HSM2_MOD_RD, IF_REAL, "drain contact resistance [ohm m]"), - IOP("rsh", HSM2_MOD_RSH, IF_REAL, "source/drain diffusion sheet resistance [ohm]"), - IOP("rshg", HSM2_MOD_RSHG, IF_REAL, "gate-elecrode sheet resistance"), -/* IOP("ngcon", HSM2_MOD_NGCON, IF_REAL, "number of gate contacts"), */ -/* IOP("xgw", HSM2_MOD_XGW, IF_REAL, "distance from gate contact to channel edge"), */ -/* IOP("xgl", HSM2_MOD_XGL, IF_REAL, "offset of gate length due to variation in patterning"), */ -/* IOP("nf", HSM2_MOD_NF, IF_REAL, "number of fingers"), */ - IOP("vfbc", HSM2_MOD_VFBC, IF_REAL, "constant part of Vfb [V]"), - IOP("vbi", HSM2_MOD_VBI, IF_REAL, "built-in potential [V]"), - IOP("nsubc", HSM2_MOD_NSUBC, IF_REAL, "constant part of Nsub [1/cm^3]"), - IOP("vfbcl", HSM2_MOD_VFBCL, IF_REAL, "gate-length dependence of VFBC [um]"), - IOP("vfbclp", HSM2_MOD_VFBCLP, IF_REAL, "gate-length dependence of VFBC [-]"), - IOP("parl2", HSM2_MOD_PARL2, IF_REAL, "under diffusion [m]"), - IOP("lp", HSM2_MOD_LP, IF_REAL, "length of pocket potential [m]"), - IOP("nsubp", HSM2_MOD_NSUBP, IF_REAL, "[1/cm^3]"), - IOP("nsubpl", HSM2_MOD_NSUBPL, IF_REAL, "gate-length dependence of NSUBP"), - IOP("nsubpfac", HSM2_MOD_NSUBPFAC, IF_REAL, "gate-length dependence of NSUBP"), - IOP("nsubpdlt", HSM2_MOD_NSUBPDLT, IF_REAL, "Delta for nsubp smoothing [-]"), - IOP("nsubpw", HSM2_MOD_NSUBPW, IF_REAL, "pocket implant parameter"), - IOP("nsubpwp", HSM2_MOD_NSUBPWP, IF_REAL, "pocket implant parameter"), - IOP("scp1", HSM2_MOD_SCP1, IF_REAL, "parameter for pocket [-]"), - IOP("scp2", HSM2_MOD_SCP2, IF_REAL, "parameter for pocket [1/V]"), - IOP("scp3", HSM2_MOD_SCP3, IF_REAL, "parameter for pocket [m/V]"), - IOP("sc1", HSM2_MOD_SC1, IF_REAL, "parameter for SCE [-]"), - IOP("sc2", HSM2_MOD_SC2, IF_REAL, "parameter for SCE [1/V]"), - IOP("sc3", HSM2_MOD_SC3, IF_REAL, "parameter for SCE [m/V]"), - IOP("sc4", HSM2_MOD_SC4, IF_REAL, "parameter for SCE []"), - IOP("pgd1", HSM2_MOD_PGD1, IF_REAL, "parameter for gate-poly depletion [V]"), - IOP("pgd2", HSM2_MOD_PGD2, IF_REAL, "parameter for gate-poly depletion [V]"), -//IOP("pgd3", HSM2_MOD_PGD3, IF_REAL, "parameter for gate-poly depletion [-]"), - IOP("pgd4", HSM2_MOD_PGD4, IF_REAL, "parameter for gate-poly depletion [-]"), - IOP("ndep", HSM2_MOD_NDEP, IF_REAL, "coeff. of Qbm for Eeff [-]"), - IOP("ndepl", HSM2_MOD_NDEPL, IF_REAL, "coeff. of Qbm for Eeff [-]"), - IOP("ndeplp", HSM2_MOD_NDEPLP, IF_REAL, "coeff. of Qbm for Eeff [-]"), - IOP("ndepw", HSM2_MOD_NDEPW, IF_REAL, "coeff. of Qbm for Eeff [-]"), - IOP("ndepwp", HSM2_MOD_NDEPWP, IF_REAL, "coeff. of Qbm for Eeff [-]"), - IOP("ninv", HSM2_MOD_NINV, IF_REAL, "coeff. of Qnm for Eeff [-]"), - IOP("ninvd", HSM2_MOD_NINVD, IF_REAL, "modification of Vdse dependence on Eeff [1/V]"), - IOP("ninvdl", HSM2_MOD_NINVDL, IF_REAL, " LG dependence of NINVD "), - IOP("ninvdlp", HSM2_MOD_NINVDLP, IF_REAL, " LG dependence of NINVD "), - IOP("muecb0", HSM2_MOD_MUECB0, IF_REAL, "const. part of coulomb scattering [cm^2/Vs]"), - IOP("muecb1", HSM2_MOD_MUECB1, IF_REAL, "coeff. for coulomb scattering [cm^2/Vs]"), - IOP("mueph0", HSM2_MOD_MUEPH0, IF_REAL, "power of Eeff for phonon scattering [-]"), - IOP("mueph1", HSM2_MOD_MUEPH1, IF_REAL, ""), - IOP("muephw", HSM2_MOD_MUEPHW, IF_REAL, ""), - IOP("muepwp", HSM2_MOD_MUEPWP, IF_REAL, "phonon scattering parameter"), - IOP("muepwd", HSM2_MOD_MUEPWD, IF_REAL, "phonon scattering parameter"), - IOP("muephl", HSM2_MOD_MUEPHL, IF_REAL, "phonon scattering parameter"), - IOP("mueplp", HSM2_MOD_MUEPLP, IF_REAL, "phonon scattering parameter"), - IOP("muepld", HSM2_MOD_MUEPLD, IF_REAL, "phonon scattering parameter"), - IOP("muephs", HSM2_MOD_MUEPHS, IF_REAL, ""), - IOP("muepsp", HSM2_MOD_MUEPSP, IF_REAL, ""), - IOP("vtmp", HSM2_MOD_VTMP, IF_REAL, ""), - IOP("wvth0", HSM2_MOD_WVTH0, IF_REAL, ""), - IOP("muesr0", HSM2_MOD_MUESR0, IF_REAL, "power of Eeff for S.R. scattering [-]"), - IOP("muesr1", HSM2_MOD_MUESR1, IF_REAL, "coeff. for S.R. scattering [-]"), - IOP("muesrl", HSM2_MOD_MUESRL, IF_REAL, "surface roughness parameter"), - IOP("muesrw", HSM2_MOD_MUESRW, IF_REAL, "change of surface roughness related mobility"), - IOP("mueswp", HSM2_MOD_MUESWP, IF_REAL, "change of surface roughness related mobility"), - IOP("mueslp", HSM2_MOD_MUESLP, IF_REAL, "surface roughness parameter"), - IOP("muetmp", HSM2_MOD_MUETMP, IF_REAL, "parameter for mobility [-]"), - IOP("bb", HSM2_MOD_BB, IF_REAL, "empirical mobility model coefficient [-]"), - IOP("sub1", HSM2_MOD_SUB1, IF_REAL, "parameter for Isub [1/V]"), - IOP("sub2", HSM2_MOD_SUB2, IF_REAL, "parameter for Isub [V]"), - IOP("svgs", HSM2_MOD_SVGS, IF_REAL, "coefficient for Vg of Psislsat"), - IOP("svbs", HSM2_MOD_SVBS, IF_REAL, "coefficient for Vbs of Psislsat"), - IOP("svbsl", HSM2_MOD_SVBSL, IF_REAL, " "), - IOP("svds", HSM2_MOD_SVDS, IF_REAL, " "), - IOP("slg", HSM2_MOD_SLG, IF_REAL, " "), - IOP("sub1l", HSM2_MOD_SUB1L, IF_REAL, " "), - IOP("sub2l", HSM2_MOD_SUB2L, IF_REAL, " "), - IOP("svgsl", HSM2_MOD_SVGSL, IF_REAL, " "), - IOP("svgslp", HSM2_MOD_SVGSLP, IF_REAL, " "), - IOP("svgswp", HSM2_MOD_SVGSWP, IF_REAL, " "), - IOP("svgsw", HSM2_MOD_SVGSW, IF_REAL, " "), - IOP("svbslp", HSM2_MOD_SVBSLP, IF_REAL, " "), - IOP("slgl", HSM2_MOD_SLGL, IF_REAL, " "), - IOP("slglp", HSM2_MOD_SLGLP, IF_REAL, " "), - IOP("sub1lp", HSM2_MOD_SUB1LP, IF_REAL, " "), - IOP("nsti", HSM2_MOD_NSTI, IF_REAL, "parameter for STI [1/cm^3]"), - IOP("wsti", HSM2_MOD_WSTI, IF_REAL, "parameter for STI [m]"), - IOP("wstil", HSM2_MOD_WSTIL, IF_REAL, "parameter for STI [?]"), - IOP("wstilp", HSM2_MOD_WSTILP, IF_REAL, "parameter for STI [?]"), - IOP("wstiw", HSM2_MOD_WSTIW, IF_REAL, "parameter for STI [?]"), - IOP("wstiwp", HSM2_MOD_WSTIWP, IF_REAL, "parameter for STI [?]"), - IOP("scsti1", HSM2_MOD_SCSTI1, IF_REAL, "parameter for STI [-]"), - IOP("scsti2", HSM2_MOD_SCSTI2, IF_REAL, "parameter for STI [1/V]"), - IOP("vthsti", HSM2_MOD_VTHSTI, IF_REAL, "parameter for STI"), - IOP("vdsti", HSM2_MOD_VDSTI, IF_REAL, "parameter for STI [-]"), - IOP("muesti1", HSM2_MOD_MUESTI1, IF_REAL, "STI Stress mobility parameter"), - IOP("muesti2", HSM2_MOD_MUESTI2, IF_REAL, "STI Stress mobility parameter"), - IOP("muesti3", HSM2_MOD_MUESTI3, IF_REAL, "STI Stress mobility parameter"), - IOP("nsubpsti1", HSM2_MOD_NSUBPSTI1, IF_REAL, "STI Stress pocket impla parameter"), - IOP("nsubpsti2", HSM2_MOD_NSUBPSTI2, IF_REAL, "STI Stress pocket impla parameter"), - IOP("nsubpsti3", HSM2_MOD_NSUBPSTI3, IF_REAL, "STI Stress pocket impla parameter"), - IOP("nsubcsti1", HSM2_MOD_NSUBCSTI1, IF_REAL, "STI Stress Parameter for Nsubc [-]"), - IOP("nsubcsti2", HSM2_MOD_NSUBCSTI2, IF_REAL, "STI Stress Parameter for Nsubc [-]"), - IOP("nsubcsti3", HSM2_MOD_NSUBCSTI3, IF_REAL, "STI Stress Parameter for Nsubc [-]"), - IOP("lpext", HSM2_MOD_LPEXT, IF_REAL, "Pocket extension"), - IOP("npext", HSM2_MOD_NPEXT, IF_REAL, "Pocket extension"), - IOP("npextw", HSM2_MOD_NPEXTW, IF_REAL, "new model parameter NPEXTW"), - IOP("npextwp", HSM2_MOD_NPEXTWP, IF_REAL, "new model parameter NPEXTWP"), - IOP("scp22", HSM2_MOD_SCP22, IF_REAL, ""), - IOP("scp21", HSM2_MOD_SCP21, IF_REAL, ""), - IOP("bs1", HSM2_MOD_BS1, IF_REAL, ""), - IOP("bs2", HSM2_MOD_BS2, IF_REAL, ""), - IOP("cgso", HSM2_MOD_CGSO, IF_REAL, "G-S overlap capacitance per unit W [F/m]"), - IOP("cgdo", HSM2_MOD_CGDO, IF_REAL, "G-D overlap capacitance per unit W [F/m]"), - IOP("cgbo", HSM2_MOD_CGBO, IF_REAL, "G-B overlap capacitance per unit L [F/m]"), - IOP("tpoly", HSM2_MOD_TPOLY, IF_REAL, "hight of poly gate [m]"), - IOP("js0", HSM2_MOD_JS0, IF_REAL, "Saturation current density [A/m^2]"), - IOP("js0sw", HSM2_MOD_JS0SW, IF_REAL, "Side wall saturation current density [A/m]"), - IOP("nj", HSM2_MOD_NJ, IF_REAL, "Emission coefficient [-]"), - IOP("njsw", HSM2_MOD_NJSW, IF_REAL, "Sidewall emission coefficient"), - IOP("xti", HSM2_MOD_XTI, IF_REAL, "Junction current temparature exponent coefficient [-]"), - IOP("cj", HSM2_MOD_CJ, IF_REAL, "Bottom junction capacitance per unit area at zero bias [F/m^2]"), - IOP("cjsw", HSM2_MOD_CJSW, IF_REAL, "Source/drain sidewall junction capacitance grading coefficient per unit length at zero bias [F/m]"), - IOP("cjswg", HSM2_MOD_CJSWG, IF_REAL, "Source/drain gate sidewall junction capacitance per unit length at zero bias [F/m]"), - IOP("mj", HSM2_MOD_MJ, IF_REAL, "Bottom junction capacitance grading coefficient"), - IOP("mjsw", HSM2_MOD_MJSW, IF_REAL, "Source/drain sidewall junction capacitance grading coefficient"), - IOP("mjswg", HSM2_MOD_MJSWG, IF_REAL, "Source/drain gate sidewall junction capacitance grading coefficient"), - IOP("pb", HSM2_MOD_PB, IF_REAL, "Bottom junction build-in potential [V]"), - IOP("pbsw", HSM2_MOD_PBSW, IF_REAL, "Source/drain sidewall junction build-in potential [V]"), - IOP("pbswg", HSM2_MOD_PBSWG, IF_REAL, "Source/drain gate sidewall junction build-in potential [V]"), - - IOP("tcjbd", HSM2_MOD_TCJBD, IF_REAL, "Temperature dependence of czbd"), - IOP("tcjbs", HSM2_MOD_TCJBS, IF_REAL, "Temperature dependence of czbs"), - IOP("tcjbdsw", HSM2_MOD_TCJBDSW, IF_REAL, "Temperature dependence of czbdsw"), - IOP("tcjbssw", HSM2_MOD_TCJBSSW, IF_REAL, "Temperature dependence of czbssw"), - IOP("tcjbdswg", HSM2_MOD_TCJBDSWG, IF_REAL, "Temperature dependence of czbdswg"), - IOP("tcjbsswg", HSM2_MOD_TCJBSSWG, IF_REAL, "Temperature dependence of czbsswg"), - - IOP("xti2", HSM2_MOD_XTI2, IF_REAL, " temperature coefficient [-]"), - IOP("cisb", HSM2_MOD_CISB, IF_REAL, " reverse bias saturation current [-]"), - IOP("cvb", HSM2_MOD_CVB, IF_REAL, " bias dependence coefficient of cisb [-]"), - IOP("ctemp", HSM2_MOD_CTEMP, IF_REAL, " temperature coefficient [-]"), - IOP("cisbk", HSM2_MOD_CISBK, IF_REAL, " reverse bias saturation current [A]"), - IOP("cvbk", HSM2_MOD_CVBK, IF_REAL, " bias dependence coefficient of cisb [-]"), - IOP("divx", HSM2_MOD_DIVX, IF_REAL, " [1/V]"), - - IOP("clm1", HSM2_MOD_CLM1, IF_REAL, "parameter for CLM [-]"), - IOP("clm2", HSM2_MOD_CLM2, IF_REAL, "parameter for CLM [1/m]"), - IOP("clm3", HSM2_MOD_CLM3, IF_REAL, "parameter for CLM [-]"), - IOP("clm5", HSM2_MOD_CLM5, IF_REAL, "parameter for CLM [-]"), - IOP("clm6", HSM2_MOD_CLM6, IF_REAL, "parameter for CLM [um^{-clm5}]"), - IOP("vover", HSM2_MOD_VOVER, IF_REAL, "parameter for overshoot [m^{voverp}]"), - IOP("voverp", HSM2_MOD_VOVERP, IF_REAL, "parameter for overshoot [-]"), - IOP("vovers", HSM2_MOD_VOVERS, IF_REAL, "parameter for overshoot [-]"), - IOP("voversp", HSM2_MOD_VOVERSP, IF_REAL, "parameter for overshoot [-]"), - - IOP("wfc", HSM2_MOD_WFC, IF_REAL, "parameter for narrow channel effect [m*F/(cm^2)]"), - IOP("nsubcw", HSM2_MOD_NSUBCW, IF_REAL, "Parameter for narrow channel effect "), - IOP("nsubcwp", HSM2_MOD_NSUBCWP, IF_REAL, "Parameter for narrow channel effect "), - IOP("nsubcmax", HSM2_MOD_NSUBCMAX, IF_REAL, "Parameter for narrow channel effect "), - IOP("qme1", HSM2_MOD_QME1, IF_REAL, "parameter for quantum effect [mV]"), - IOP("qme2", HSM2_MOD_QME2, IF_REAL, "parameter for quantum effect [V]"), - IOP("qme3", HSM2_MOD_QME3, IF_REAL, "parameter for quantum effect [m]"), - IOP("gidl1", HSM2_MOD_GIDL1, IF_REAL, "parameter for GIDL [?]"), - IOP("gidl2", HSM2_MOD_GIDL2, IF_REAL, "parameter for GIDL [?]"), - IOP("gidl3", HSM2_MOD_GIDL3, IF_REAL, "parameter for GIDL [?]"), - IOP("gidl4", HSM2_MOD_GIDL4, IF_REAL, "parameter for GIDL [?]"), - IOP("gidl5", HSM2_MOD_GIDL5, IF_REAL, "parameter for GIDL [?]"), - IOP("gidl6", HSM2_MOD_GIDL6, IF_REAL, "parameter for GIDL [-]"), - IOP("gidl7", HSM2_MOD_GIDL7, IF_REAL, "parameter for GIDL [-]"), - IOP("gleak1", HSM2_MOD_GLEAK1, IF_REAL, "parameter for gate current [A*V^(-3/2)/C]"), - IOP("gleak2", HSM2_MOD_GLEAK2, IF_REAL, "parameter for gate current [V^(-1/2)/m ]"), - IOP("gleak3", HSM2_MOD_GLEAK3, IF_REAL, "parameter for gate current [-]"), - IOP("gleak4", HSM2_MOD_GLEAK4, IF_REAL, "parameter for gate current [1/m]"), - IOP("gleak5", HSM2_MOD_GLEAK5, IF_REAL, "parameter for gate current [V/m]"), - IOP("gleak6", HSM2_MOD_GLEAK6, IF_REAL, "parameter for gate current [V]"), - IOP("gleak7", HSM2_MOD_GLEAK7, IF_REAL, "parameter for gate current [m^2]"), - IOP("glksd1", HSM2_MOD_GLKSD1, IF_REAL, "parameter for gate current [A*m/V^2]"), - IOP("glksd2", HSM2_MOD_GLKSD2, IF_REAL, "parameter for gate current [1/(V*m)]"), - IOP("glksd3", HSM2_MOD_GLKSD3, IF_REAL, "parameter for gate current [1/m]"), - IOP("glkb1", HSM2_MOD_GLKB1, IF_REAL, "parameter for gate current [A/V^2]"), - IOP("glkb2", HSM2_MOD_GLKB2, IF_REAL, "parameter for gate current [m/V]"), - IOP("glkb3", HSM2_MOD_GLKB3, IF_REAL, "parameter for gate current [V]"), - IOP("egig", HSM2_MOD_EGIG, IF_REAL, "parameter for gate current [V]"), - IOP("igtemp2", HSM2_MOD_IGTEMP2, IF_REAL, "parameter for gate current [V*k]"), - IOP("igtemp3", HSM2_MOD_IGTEMP3, IF_REAL, "parameter for gate current [V*k^2]"), - IOP("vzadd0", HSM2_MOD_VZADD0, IF_REAL, "Vzadd at Vds=0 [V]"), - IOP("pzadd0", HSM2_MOD_PZADD0, IF_REAL, "Pzadd at Vds=0 [V]"), - IOP("nftrp", HSM2_MOD_NFTRP, IF_REAL, ""), - IOP("nfalp", HSM2_MOD_NFALP, IF_REAL, ""), - IOP("falph", HSM2_MOD_FALPH, IF_REAL, "parameter for 1/f noise"), - IOP("cit", HSM2_MOD_CIT, IF_REAL, ""), - IOP("kappa", HSM2_MOD_KAPPA, IF_REAL, "dielectric constant for high-k stacked gate"), - IOP("vdiffj", HSM2_MOD_VDIFFJ, IF_REAL, "threshold voltage for S/D junction diode [V]"), - IOP("dly1", HSM2_MOD_DLY1, IF_REAL, "parameter for transit time [-]"), - IOP("dly2", HSM2_MOD_DLY2, IF_REAL, "parameter for transit time [-]"), - IOP("dly3", HSM2_MOD_DLY3, IF_REAL, "parameter for trandforming bulk charge [s/F]"), - IOP("tnom", HSM2_MOD_TNOM, IF_REAL, "nominal temperature [K]"), - IOP("ovslp", HSM2_MOD_OVSLP, IF_REAL, ""), - IOP("ovmag", HSM2_MOD_OVMAG, IF_REAL, ""), - - IOP("gbmin", HSM2_MOD_GBMIN, IF_REAL, ""), - IOP("rbpb", HSM2_MOD_RBPB, IF_REAL, ""), - IOP("rbpd", HSM2_MOD_RBPD, IF_REAL, ""), - IOP("rbps", HSM2_MOD_RBPS, IF_REAL, ""), - IOP("rbdb", HSM2_MOD_RBDB, IF_REAL, ""), - IOP("rbsb", HSM2_MOD_RBSB, IF_REAL, ""), - - IOP("ibpc1", HSM2_MOD_IBPC1, IF_REAL, "parameter for Impact-Ionization Induced Bulk Potential Change"), - IOP("ibpc2", HSM2_MOD_IBPC2, IF_REAL, "parameter for Impact-Ionization Induced Bulk Potential Change"), - - IOP("mphdfm", HSM2_MOD_MPHDFM, IF_REAL, "NSUBCDFM dependence of phonon scattering for DFM"), - - - IOP("ptl", HSM2_MOD_PTL, IF_REAL, ""), - IOP("ptp", HSM2_MOD_PTP, IF_REAL, ""), - IOP("pt2", HSM2_MOD_PT2, IF_REAL, ""), - IOP("ptlp", HSM2_MOD_PTLP, IF_REAL, ""), - IOP("gdl", HSM2_MOD_GDL, IF_REAL, ""), - IOP("gdlp", HSM2_MOD_GDLP, IF_REAL, ""), - - IOP("gdld", HSM2_MOD_GDLD, IF_REAL, ""), - IOP("pt4", HSM2_MOD_PT4, IF_REAL, ""), - IOP("pt4p", HSM2_MOD_PT4P, IF_REAL, ""), - IOP("muephl2", HSM2_MOD_MUEPHL2, IF_REAL, ""), - IOP("mueplp2", HSM2_MOD_MUEPLP2, IF_REAL, ""), - IOP("nsubcw2", HSM2_MOD_NSUBCW2, IF_REAL, ""), - IOP("nsubcwp2", HSM2_MOD_NSUBCWP2, IF_REAL, ""), - IOP("muephw2", HSM2_MOD_MUEPHW2, IF_REAL, ""), - IOP("muepwp2", HSM2_MOD_MUEPWP2, IF_REAL, ""), - -/* WPE */ - IOP("web", HSM2_MOD_WEB, IF_REAL, "Description for the model parameter WPE web"), - IOP("wec", HSM2_MOD_WEC, IF_REAL, "Description for the model parameter WPE wec"), - IOP("nsubcwpe" , HSM2_MOD_NSUBCWPE, IF_REAL, "Description for the model parameter WPE nsubcwpe"), - IOP("npextwpe" , HSM2_MOD_NPEXTWPE, IF_REAL, "Description for the model parameter WPE npextwpe"), - IOP("nsubpwpe" , HSM2_MOD_NSUBPWPE, IF_REAL, "Description for the model parameter WPE nsubpwpe"), - IOP("vgsmin", HSM2_MOD_VGSMIN, IF_REAL, "minimal/maximal expected Vgs (NMOS/PMOS) [V]"), - IOP("sc3vbs", HSM2_MOD_SC3VBS, IF_REAL, "Vbs value for clamping sc3 [V]"), - IOP("byptol", HSM2_MOD_BYPTOL, IF_REAL, "BYP_TOL_FACTOR for bypass control"), - IOP("muecb0lp", HSM2_MOD_MUECB0LP, IF_REAL, "L dependence of MUECB0"), - IOP("muecb1lp", HSM2_MOD_MUECB1LP, IF_REAL, "L dependence of MUECB1"), - - /* Depletion Mode MOSFET */ - IOP("ndepm", HSM2_MOD_NDEPM, IF_REAL, "N- layer concentlation of the depletion MOS model"), - IOP("ndepml", HSM2_MOD_NDEPML, IF_REAL, "L dependence of NDEPM "), - IOP("ndepmlp", HSM2_MOD_NDEPMLP, IF_REAL, "L dependence of NDEPM "), - IOP("tndep", HSM2_MOD_TNDEP, IF_REAL, "N- layer depth of the depletion MOS model"), - IOP("depleak", HSM2_MOD_DEPLEAK, IF_REAL, "leakage current modification parameter for the depletion MOS model"), - IOP("depleakl", HSM2_MOD_DEPLEAKL, IF_REAL, "L dependence of DEPLEAK"), - IOP("depleaklp", HSM2_MOD_DEPLEAKLP, IF_REAL, "L dependence of DEPLEAK"), - IOP("depeta", HSM2_MOD_DEPETA, IF_REAL, "Vds dependence of threshold voltage for the depletion MOS model"), - IOP("depmue0", HSM2_MOD_DEPMUE0, IF_REAL, " [-]"), - IOP("depmue0l", HSM2_MOD_DEPMUE0L, IF_REAL, " [-]"), - IOP("depmue0lp", HSM2_MOD_DEPMUE0LP, IF_REAL, " [-]"), - IOP("depmue1", HSM2_MOD_DEPMUE1, IF_REAL, " [-]"), - IOP("depmue1l", HSM2_MOD_DEPMUE1L, IF_REAL, " [-]"), - IOP("depmue1lp", HSM2_MOD_DEPMUE1LP, IF_REAL, " [-]"), - IOP("depmueback0", HSM2_MOD_DEPMUEBACK0, IF_REAL, " [-]"), - IOP("depmueback0l", HSM2_MOD_DEPMUEBACK0L, IF_REAL, " [-]"), - IOP("depmueback0lp", HSM2_MOD_DEPMUEBACK0LP, IF_REAL, " [-]"), - IOP("depmueback1", HSM2_MOD_DEPMUEBACK1, IF_REAL, " [-]"), - IOP("depmueback1l", HSM2_MOD_DEPMUEBACK1L, IF_REAL, " [-]"), - IOP("depmueback1lp", HSM2_MOD_DEPMUEBACK1LP, IF_REAL, " [-]"), - IOP("depmueph0", HSM2_MOD_DEPMUEPH0, IF_REAL, " [-]"), - IOP("depmueph1", HSM2_MOD_DEPMUEPH1, IF_REAL, " [-]"), - IOP("depvmax", HSM2_MOD_DEPVMAX, IF_REAL, " [-]"), - IOP("depvmaxl", HSM2_MOD_DEPVMAXL, IF_REAL, " [-]"), - IOP("depvmaxlp", HSM2_MOD_DEPVMAXLP, IF_REAL, " [-]"), - IOP("depvdsef1", HSM2_MOD_DEPVDSEF1, IF_REAL, " [-]"), - IOP("depvdsef1l", HSM2_MOD_DEPVDSEF1L, IF_REAL, " [-]"), - IOP("depvdsef1lp", HSM2_MOD_DEPVDSEF1LP, IF_REAL, " [-]"), - IOP("depvdsef2", HSM2_MOD_DEPVDSEF2, IF_REAL, " [-]"), - IOP("depvdsef2l", HSM2_MOD_DEPVDSEF2L, IF_REAL, " [-]"), - IOP("depvdsef2lp", HSM2_MOD_DEPVDSEF2LP, IF_REAL, " [-]"), - IOP("depbb", HSM2_MOD_DEPBB, IF_REAL, " [-]"), - IOP("depmuetmp", HSM2_MOD_DEPMUETMP, IF_REAL, " [-]"), - - /* binning parameters */ - IOP("lmin", HSM2_MOD_LMIN, IF_REAL, "Minimum length for the model"), - IOP("lmax", HSM2_MOD_LMAX, IF_REAL, "Maximum length for the model"), - IOP("wmin", HSM2_MOD_WMIN, IF_REAL, "Minimum width for the model"), - IOP("wmax", HSM2_MOD_WMAX, IF_REAL, "Maximum width for the model"), - IOP("lbinn", HSM2_MOD_LBINN, IF_REAL, "L modulation coefficient for binning"), - IOP("wbinn", HSM2_MOD_WBINN, IF_REAL, "W modulation coefficient for binning"), - - /* Length dependence */ - IOP("lvmax", HSM2_MOD_LVMAX, IF_REAL, "Length dependence of vmax"), - IOP("lbgtmp1", HSM2_MOD_LBGTMP1, IF_REAL, "Length dependence of bgtmp1"), - IOP("lbgtmp2", HSM2_MOD_LBGTMP2, IF_REAL, "Length dependence of bgtmp2"), - IOP("leg0", HSM2_MOD_LEG0, IF_REAL, "Length dependence of eg0"), - IOP("llover", HSM2_MOD_LLOVER, IF_REAL, "Length dependence of lover"), - IOP("lvfbover", HSM2_MOD_LVFBOVER, IF_REAL, "Length dependence of vfbover"), - IOP("lnover", HSM2_MOD_LNOVER, IF_REAL, "Length dependence of nover"), - IOP("lwl2", HSM2_MOD_LWL2, IF_REAL, "Length dependence of wl2"), - IOP("lvfbc", HSM2_MOD_LVFBC, IF_REAL, "Length dependence of vfbc"), - IOP("lnsubc", HSM2_MOD_LNSUBC, IF_REAL, "Length dependence of nsubc"), - IOP("lnsubp", HSM2_MOD_LNSUBP, IF_REAL, "Length dependence of nsubp"), - IOP("lscp1", HSM2_MOD_LSCP1, IF_REAL, "Length dependence of scp1"), - IOP("lscp2", HSM2_MOD_LSCP2, IF_REAL, "Length dependence of scp2"), - IOP("lscp3", HSM2_MOD_LSCP3, IF_REAL, "Length dependence of scp3"), - IOP("lsc1", HSM2_MOD_LSC1, IF_REAL, "Length dependence of sc1"), - IOP("lsc2", HSM2_MOD_LSC2, IF_REAL, "Length dependence of sc2"), - IOP("lsc3", HSM2_MOD_LSC3, IF_REAL, "Length dependence of sc3"), - IOP("lsc4", HSM2_MOD_LSC4, IF_REAL, "Length dependence of sc4"), - IOP("lpgd1", HSM2_MOD_LPGD1, IF_REAL, "Length dependence of pgd1"), -//IOP("lpgd3", HSM2_MOD_LPGD3, IF_REAL, "Length dependence of pgd3"), - IOP("lndep", HSM2_MOD_LNDEP, IF_REAL, "Length dependence of ndep"), - IOP("lninv", HSM2_MOD_LNINV, IF_REAL, "Length dependence of ninv"), - IOP("lmuecb0", HSM2_MOD_LMUECB0, IF_REAL, "Length dependence of muecb0"), - IOP("lmuecb1", HSM2_MOD_LMUECB1, IF_REAL, "Length dependence of muecb1"), - IOP("lmueph1", HSM2_MOD_LMUEPH1, IF_REAL, "Length dependence of mueph1"), - IOP("lvtmp", HSM2_MOD_LVTMP, IF_REAL, "Length dependence of vtmp"), - IOP("lwvth0", HSM2_MOD_LWVTH0, IF_REAL, "Length dependence of wvth0"), - IOP("lmuesr1", HSM2_MOD_LMUESR1, IF_REAL, "Length dependence of muesr1"), - IOP("lmuetmp", HSM2_MOD_LMUETMP, IF_REAL, "Length dependence of muetmp"), - IOP("lsub1", HSM2_MOD_LSUB1, IF_REAL, "Length dependence of sub1"), - IOP("lsub2", HSM2_MOD_LSUB2, IF_REAL, "Length dependence of sub2"), - IOP("lsvds", HSM2_MOD_LSVDS, IF_REAL, "Length dependence of svds"), - IOP("lsvbs", HSM2_MOD_LSVBS, IF_REAL, "Length dependence of svbs"), - IOP("lsvgs", HSM2_MOD_LSVGS, IF_REAL, "Length dependence of svgs"), - IOP("lnsti", HSM2_MOD_LNSTI, IF_REAL, "Length dependence of nsti"), - IOP("lwsti", HSM2_MOD_LWSTI, IF_REAL, "Length dependence of wsti"), - IOP("lscsti1", HSM2_MOD_LSCSTI1, IF_REAL, "Length dependence of scsti1"), - IOP("lscsti2", HSM2_MOD_LSCSTI2, IF_REAL, "Length dependence of scsti2"), - IOP("lvthsti", HSM2_MOD_LVTHSTI, IF_REAL, "Length dependence of vthsti"), - IOP("lmuesti1", HSM2_MOD_LMUESTI1, IF_REAL, "Length dependence of muesti1"), - IOP("lmuesti2", HSM2_MOD_LMUESTI2, IF_REAL, "Length dependence of muesti2"), - IOP("lmuesti3", HSM2_MOD_LMUESTI3, IF_REAL, "Length dependence of muesti3"), - IOP("lnsubpsti1", HSM2_MOD_LNSUBPSTI1, IF_REAL, "Length dependence of nsubpsti1"), - IOP("lnsubpsti2", HSM2_MOD_LNSUBPSTI2, IF_REAL, "Length dependence of nsubpsti2"), - IOP("lnsubpsti3", HSM2_MOD_LNSUBPSTI3, IF_REAL, "Length dependence of nsubpsti3"), - IOP("lnsubcsti1", HSM2_MOD_LNSUBCSTI1, IF_REAL, "Length dependence of nsubcsti1"), - IOP("lnsubcsti2", HSM2_MOD_LNSUBCSTI2, IF_REAL, "Length dependence of nsubcsti2"), - IOP("lnsubcsti3", HSM2_MOD_LNSUBCSTI3, IF_REAL, "Length dependence of nsubcsti3"), - IOP("lcgso", HSM2_MOD_LCGSO, IF_REAL, "Length dependence of cgso"), - IOP("lcgdo", HSM2_MOD_LCGDO, IF_REAL, "Length dependence of cgdo"), - IOP("ljs0", HSM2_MOD_LJS0, IF_REAL, "Length dependence of js0"), - IOP("ljs0sw", HSM2_MOD_LJS0SW, IF_REAL, "Length dependence of js0sw"), - IOP("lnj", HSM2_MOD_LNJ, IF_REAL, "Length dependence of nj"), - IOP("lcisbk", HSM2_MOD_LCISBK, IF_REAL, "Length dependence of cisbk"), - IOP("lclm1", HSM2_MOD_LCLM1, IF_REAL, "Length dependence of clm1"), - IOP("lclm2", HSM2_MOD_LCLM2, IF_REAL, "Length dependence of clm2"), - IOP("lclm3", HSM2_MOD_LCLM3, IF_REAL, "Length dependence of clm3"), - IOP("lwfc", HSM2_MOD_LWFC, IF_REAL, "Length dependence of wfc"), - IOP("lgidl1", HSM2_MOD_LGIDL1, IF_REAL, "Length dependence of gidl1"), - IOP("lgidl2", HSM2_MOD_LGIDL2, IF_REAL, "Length dependence of gidl2"), - IOP("lgleak1", HSM2_MOD_LGLEAK1, IF_REAL, "Length dependence of gleak1"), - IOP("lgleak2", HSM2_MOD_LGLEAK2, IF_REAL, "Length dependence of gleak2"), - IOP("lgleak3", HSM2_MOD_LGLEAK3, IF_REAL, "Length dependence of gleak3"), - IOP("lgleak6", HSM2_MOD_LGLEAK6, IF_REAL, "Length dependence of gleak6"), - IOP("lglksd1", HSM2_MOD_LGLKSD1, IF_REAL, "Length dependence of glksd1"), - IOP("lglksd2", HSM2_MOD_LGLKSD2, IF_REAL, "Length dependence of glksd2"), - IOP("lglkb1", HSM2_MOD_LGLKB1, IF_REAL, "Length dependence of glkb1"), - IOP("lglkb2", HSM2_MOD_LGLKB2, IF_REAL, "Length dependence of glkb2"), - IOP("lnftrp", HSM2_MOD_LNFTRP, IF_REAL, "Length dependence of nftrp"), - IOP("lnfalp", HSM2_MOD_LNFALP, IF_REAL, "Length dependence of nfalp"), - IOP("lvdiffj", HSM2_MOD_LVDIFFJ, IF_REAL, "Length dependence of vdiffj"), - IOP("libpc1", HSM2_MOD_LIBPC1, IF_REAL, "Length dependence of ibpc1"), - IOP("libpc2", HSM2_MOD_LIBPC2, IF_REAL, "Length dependence of ibpc2"), - - /* Width dependence */ - IOP("wvmax", HSM2_MOD_WVMAX, IF_REAL, "Width dependence of vmax"), - IOP("wbgtmp1", HSM2_MOD_WBGTMP1, IF_REAL, "Width dependence of bgtmp1"), - IOP("wbgtmp2", HSM2_MOD_WBGTMP2, IF_REAL, "Width dependence of bgtmp2"), - IOP("weg0", HSM2_MOD_WEG0, IF_REAL, "Width dependence of eg0"), - IOP("wlover", HSM2_MOD_WLOVER, IF_REAL, "Width dependence of lover"), - IOP("wvfbover", HSM2_MOD_WVFBOVER, IF_REAL, "Width dependence of vfbover"), - IOP("wnover", HSM2_MOD_WNOVER, IF_REAL, "Width dependence of nover"), - IOP("wwl2", HSM2_MOD_WWL2, IF_REAL, "Width dependence of wl2"), - IOP("wvfbc", HSM2_MOD_WVFBC, IF_REAL, "Width dependence of vfbc"), - IOP("wnsubc", HSM2_MOD_WNSUBC, IF_REAL, "Width dependence of nsubc"), - IOP("wnsubp", HSM2_MOD_WNSUBP, IF_REAL, "Width dependence of nsubp"), - IOP("wscp1", HSM2_MOD_WSCP1, IF_REAL, "Width dependence of scp1"), - IOP("wscp2", HSM2_MOD_WSCP2, IF_REAL, "Width dependence of scp2"), - IOP("wscp3", HSM2_MOD_WSCP3, IF_REAL, "Width dependence of scp3"), - IOP("wsc1", HSM2_MOD_WSC1, IF_REAL, "Width dependence of sc1"), - IOP("wsc2", HSM2_MOD_WSC2, IF_REAL, "Width dependence of sc2"), - IOP("wsc3", HSM2_MOD_WSC3, IF_REAL, "Width dependence of sc3"), - IOP("wsc4", HSM2_MOD_WSC4, IF_REAL, "Width dependence of sc4"), - IOP("wpgd1", HSM2_MOD_WPGD1, IF_REAL, "Width dependence of pgd1"), -//IOP("wpgd3", HSM2_MOD_WPGD3, IF_REAL, "Width dependence of pgd3"), - IOP("wndep", HSM2_MOD_WNDEP, IF_REAL, "Width dependence of ndep"), - IOP("wninv", HSM2_MOD_WNINV, IF_REAL, "Width dependence of ninv"), - IOP("wmuecb0", HSM2_MOD_WMUECB0, IF_REAL, "Width dependence of muecb0"), - IOP("wmuecb1", HSM2_MOD_WMUECB1, IF_REAL, "Width dependence of muecb1"), - IOP("wmueph1", HSM2_MOD_WMUEPH1, IF_REAL, "Width dependence of mueph1"), - IOP("wvtmp", HSM2_MOD_WVTMP, IF_REAL, "Width dependence of vtmp"), - IOP("wwvth0", HSM2_MOD_WWVTH0, IF_REAL, "Width dependence of wvth0"), - IOP("wmuesr1", HSM2_MOD_WMUESR1, IF_REAL, "Width dependence of muesr1"), - IOP("wmuetmp", HSM2_MOD_WMUETMP, IF_REAL, "Width dependence of muetmp"), - IOP("wsub1", HSM2_MOD_WSUB1, IF_REAL, "Width dependence of sub1"), - IOP("wsub2", HSM2_MOD_WSUB2, IF_REAL, "Width dependence of sub2"), - IOP("wsvds", HSM2_MOD_WSVDS, IF_REAL, "Width dependence of svds"), - IOP("wsvbs", HSM2_MOD_WSVBS, IF_REAL, "Width dependence of svbs"), - IOP("wsvgs", HSM2_MOD_WSVGS, IF_REAL, "Width dependence of svgs"), - IOP("wnsti", HSM2_MOD_WNSTI, IF_REAL, "Width dependence of nsti"), - IOP("wwsti", HSM2_MOD_WWSTI, IF_REAL, "Width dependence of wsti"), - IOP("wscsti1", HSM2_MOD_WSCSTI1, IF_REAL, "Width dependence of scsti1"), - IOP("wscsti2", HSM2_MOD_WSCSTI2, IF_REAL, "Width dependence of scsti2"), - IOP("wvthsti", HSM2_MOD_WVTHSTI, IF_REAL, "Width dependence of vthsti"), - IOP("wmuesti1", HSM2_MOD_WMUESTI1, IF_REAL, "Width dependence of muesti1"), - IOP("wmuesti2", HSM2_MOD_WMUESTI2, IF_REAL, "Width dependence of muesti2"), - IOP("wmuesti3", HSM2_MOD_WMUESTI3, IF_REAL, "Width dependence of muesti3"), - IOP("wnsubpsti1", HSM2_MOD_WNSUBPSTI1, IF_REAL, "Width dependence of nsubpsti1"), - IOP("wnsubpsti2", HSM2_MOD_WNSUBPSTI2, IF_REAL, "Width dependence of nsubpsti2"), - IOP("wnsubpsti3", HSM2_MOD_WNSUBPSTI3, IF_REAL, "Width dependence of nsubpsti3"), - IOP("wnsubcsti1", HSM2_MOD_WNSUBCSTI1, IF_REAL, "Wength dependence of nsubcsti1"), - IOP("wnsubcsti2", HSM2_MOD_WNSUBCSTI2, IF_REAL, "Wength dependence of nsubcsti2"), - IOP("wnsubcsti3", HSM2_MOD_WNSUBCSTI3, IF_REAL, "Wength dependence of nsubcsti3"), - IOP("wcgso", HSM2_MOD_WCGSO, IF_REAL, "Width dependence of cgso"), - IOP("wcgdo", HSM2_MOD_WCGDO, IF_REAL, "Width dependence of cgdo"), - IOP("wjs0", HSM2_MOD_WJS0, IF_REAL, "Width dependence of js0"), - IOP("wjs0sw", HSM2_MOD_WJS0SW, IF_REAL, "Width dependence of js0sw"), - IOP("wnj", HSM2_MOD_WNJ, IF_REAL, "Width dependence of nj"), - IOP("wcisbk", HSM2_MOD_WCISBK, IF_REAL, "Width dependence of cisbk"), - IOP("wclm1", HSM2_MOD_WCLM1, IF_REAL, "Width dependence of clm1"), - IOP("wclm2", HSM2_MOD_WCLM2, IF_REAL, "Width dependence of clm2"), - IOP("wclm3", HSM2_MOD_WCLM3, IF_REAL, "Width dependence of clm3"), - IOP("wwfc", HSM2_MOD_WWFC, IF_REAL, "Width dependence of wfc"), - IOP("wgidl1", HSM2_MOD_WGIDL1, IF_REAL, "Width dependence of gidl1"), - IOP("wgidl2", HSM2_MOD_WGIDL2, IF_REAL, "Width dependence of gidl2"), - IOP("wgleak1", HSM2_MOD_WGLEAK1, IF_REAL, "Width dependence of gleak1"), - IOP("wgleak2", HSM2_MOD_WGLEAK2, IF_REAL, "Width dependence of gleak2"), - IOP("wgleak3", HSM2_MOD_WGLEAK3, IF_REAL, "Width dependence of gleak3"), - IOP("wgleak6", HSM2_MOD_WGLEAK6, IF_REAL, "Width dependence of gleak6"), - IOP("wglksd1", HSM2_MOD_WGLKSD1, IF_REAL, "Width dependence of glksd1"), - IOP("wglksd2", HSM2_MOD_WGLKSD2, IF_REAL, "Width dependence of glksd2"), - IOP("wglkb1", HSM2_MOD_WGLKB1, IF_REAL, "Width dependence of glkb1"), - IOP("wglkb2", HSM2_MOD_WGLKB2, IF_REAL, "Width dependence of glkb2"), - IOP("wnftrp", HSM2_MOD_WNFTRP, IF_REAL, "Width dependence of nftrp"), - IOP("wnfalp", HSM2_MOD_WNFALP, IF_REAL, "Width dependence of nfalp"), - IOP("wvdiffj", HSM2_MOD_WVDIFFJ, IF_REAL, "Width dependence of vdiffj"), - IOP("wibpc1", HSM2_MOD_WIBPC1, IF_REAL, "Width dependence of ibpc1"), - IOP("wibpc2", HSM2_MOD_WIBPC2, IF_REAL, "Width dependence of ibpc2"), - - /* Cross-term dependence */ - IOP("pvmax", HSM2_MOD_PVMAX, IF_REAL, "Cross-term dependence of vmax"), - IOP("pbgtmp1", HSM2_MOD_PBGTMP1, IF_REAL, "Cross-term dependence of bgtmp1"), - IOP("pbgtmp2", HSM2_MOD_PBGTMP2, IF_REAL, "Cross-term dependence of bgtmp2"), - IOP("peg0", HSM2_MOD_PEG0, IF_REAL, "Cross-term dependence of eg0"), - IOP("plover", HSM2_MOD_PLOVER, IF_REAL, "Cross-term dependence of lover"), - IOP("pvfbover", HSM2_MOD_PVFBOVER, IF_REAL, "Cross-term dependence of vfbover"), - IOP("pnover", HSM2_MOD_PNOVER, IF_REAL, "Cross-term dependence of nover"), - IOP("pwl2", HSM2_MOD_PWL2, IF_REAL, "Cross-term dependence of wl2"), - IOP("pvfbc", HSM2_MOD_PVFBC, IF_REAL, "Cross-term dependence of vfbc"), - IOP("pnsubc", HSM2_MOD_PNSUBC, IF_REAL, "Cross-term dependence of nsubc"), - IOP("pnsubp", HSM2_MOD_PNSUBP, IF_REAL, "Cross-term dependence of nsubp"), - IOP("pscp1", HSM2_MOD_PSCP1, IF_REAL, "Cross-term dependence of scp1"), - IOP("pscp2", HSM2_MOD_PSCP2, IF_REAL, "Cross-term dependence of scp2"), - IOP("pscp3", HSM2_MOD_PSCP3, IF_REAL, "Cross-term dependence of scp3"), - IOP("psc1", HSM2_MOD_PSC1, IF_REAL, "Cross-term dependence of sc1"), - IOP("psc2", HSM2_MOD_PSC2, IF_REAL, "Cross-term dependence of sc2"), - IOP("psc3", HSM2_MOD_PSC3, IF_REAL, "Cross-term dependence of sc3"), - IOP("psc4", HSM2_MOD_PSC4, IF_REAL, "Cross-term dependence of sc4"), - IOP("ppgd1", HSM2_MOD_PPGD1, IF_REAL, "Cross-term dependence of pgd1"), -//IOP("ppgd3", HSM2_MOD_PPGD3, IF_REAL, "Cross-term dependence of pgd3"), - IOP("pndep", HSM2_MOD_PNDEP, IF_REAL, "Cross-term dependence of ndep"), - IOP("pninv", HSM2_MOD_PNINV, IF_REAL, "Cross-term dependence of ninv"), - IOP("pmuecb0", HSM2_MOD_PMUECB0, IF_REAL, "Cross-term dependence of muecb0"), - IOP("pmuecb1", HSM2_MOD_PMUECB1, IF_REAL, "Cross-term dependence of muecb1"), - IOP("pmueph1", HSM2_MOD_PMUEPH1, IF_REAL, "Cross-term dependence of mueph1"), - IOP("pvtmp", HSM2_MOD_PVTMP, IF_REAL, "Cross-term dependence of vtmp"), - IOP("pwvth0", HSM2_MOD_PWVTH0, IF_REAL, "Cross-term dependence of wvth0"), - IOP("pmuesr1", HSM2_MOD_PMUESR1, IF_REAL, "Cross-term dependence of muesr1"), - IOP("pmuetmp", HSM2_MOD_PMUETMP, IF_REAL, "Cross-term dependence of muetmp"), - IOP("psub1", HSM2_MOD_PSUB1, IF_REAL, "Cross-term dependence of sub1"), - IOP("psub2", HSM2_MOD_PSUB2, IF_REAL, "Cross-term dependence of sub2"), - IOP("psvds", HSM2_MOD_PSVDS, IF_REAL, "Cross-term dependence of svds"), - IOP("psvbs", HSM2_MOD_PSVBS, IF_REAL, "Cross-term dependence of svbs"), - IOP("psvgs", HSM2_MOD_PSVGS, IF_REAL, "Cross-term dependence of svgs"), - IOP("pnsti", HSM2_MOD_PNSTI, IF_REAL, "Cross-term dependence of nsti"), - IOP("pwsti", HSM2_MOD_PWSTI, IF_REAL, "Cross-term dependence of wsti"), - IOP("pscsti1", HSM2_MOD_PSCSTI1, IF_REAL, "Cross-term dependence of scsti1"), - IOP("pscsti2", HSM2_MOD_PSCSTI2, IF_REAL, "Cross-term dependence of scsti2"), - IOP("pvthsti", HSM2_MOD_PVTHSTI, IF_REAL, "Cross-term dependence of vthsti"), - IOP("pmuesti1", HSM2_MOD_PMUESTI1, IF_REAL, "Cross-term dependence of muesti1"), - IOP("pmuesti2", HSM2_MOD_PMUESTI2, IF_REAL, "Cross-term dependence of muesti2"), - IOP("pmuesti3", HSM2_MOD_PMUESTI3, IF_REAL, "Cross-term dependence of muesti3"), - IOP("pnsubpsti1", HSM2_MOD_PNSUBPSTI1, IF_REAL, "Cross-term dependence of nsubpsti1"), - IOP("pnsubpsti2", HSM2_MOD_PNSUBPSTI2, IF_REAL, "Cross-term dependence of nsubpsti2"), - IOP("pnsubpsti3", HSM2_MOD_PNSUBPSTI3, IF_REAL, "Cross-term dependence of nsubpsti3"), - IOP("pnsubcsti1", HSM2_MOD_PNSUBCSTI1, IF_REAL, "Cross-term dependence of nsubcsti1"), - IOP("pnsubcsti2", HSM2_MOD_PNSUBCSTI2, IF_REAL, "Cross-term dependence of nsubcsti2"), - IOP("pnsubcsti3", HSM2_MOD_PNSUBCSTI3, IF_REAL, "Cross-term dependence of nsubcsti3"), - IOP("pcgso", HSM2_MOD_PCGSO, IF_REAL, "Cross-term dependence of cgso"), - IOP("pcgdo", HSM2_MOD_PCGDO, IF_REAL, "Cross-term dependence of cgdo"), - IOP("pjs0", HSM2_MOD_PJS0, IF_REAL, "Cross-term dependence of js0"), - IOP("pjs0sw", HSM2_MOD_PJS0SW, IF_REAL, "Cross-term dependence of js0sw"), - IOP("pnj", HSM2_MOD_PNJ, IF_REAL, "Cross-term dependence of nj"), - IOP("pcisbk", HSM2_MOD_PCISBK, IF_REAL, "Cross-term dependence of cisbk"), - IOP("pclm1", HSM2_MOD_PCLM1, IF_REAL, "Cross-term dependence of clm1"), - IOP("pclm2", HSM2_MOD_PCLM2, IF_REAL, "Cross-term dependence of clm2"), - IOP("pclm3", HSM2_MOD_PCLM3, IF_REAL, "Cross-term dependence of clm3"), - IOP("pwfc", HSM2_MOD_PWFC, IF_REAL, "Cross-term dependence of wfc"), - IOP("pgidl1", HSM2_MOD_PGIDL1, IF_REAL, "Cross-term dependence of gidl1"), - IOP("pgidl2", HSM2_MOD_PGIDL2, IF_REAL, "Cross-term dependence of gidl2"), - IOP("pgleak1", HSM2_MOD_PGLEAK1, IF_REAL, "Cross-term dependence of gleak1"), - IOP("pgleak2", HSM2_MOD_PGLEAK2, IF_REAL, "Cross-term dependence of gleak2"), - IOP("pgleak3", HSM2_MOD_PGLEAK3, IF_REAL, "Cross-term dependence of gleak3"), - IOP("pgleak6", HSM2_MOD_PGLEAK6, IF_REAL, "Cross-term dependence of gleak6"), - IOP("pglksd1", HSM2_MOD_PGLKSD1, IF_REAL, "Cross-term dependence of glksd1"), - IOP("pglksd2", HSM2_MOD_PGLKSD2, IF_REAL, "Cross-term dependence of glksd2"), - IOP("pglkb1", HSM2_MOD_PGLKB1, IF_REAL, "Cross-term dependence of glkb1"), - IOP("pglkb2", HSM2_MOD_PGLKB2, IF_REAL, "Cross-term dependence of glkb2"), - IOP("pnftrp", HSM2_MOD_PNFTRP, IF_REAL, "Cross-term dependence of nftrp"), - IOP("pnfalp", HSM2_MOD_PNFALP, IF_REAL, "Cross-term dependence of nfalp"), - IOP("pvdiffj", HSM2_MOD_PVDIFFJ, IF_REAL, "Cross-term dependence of vdiffj"), - IOP("pibpc1", HSM2_MOD_PIBPC1, IF_REAL, "Cross-term dependence of ibpc1"), - IOP("pibpc2", HSM2_MOD_PIBPC2, IF_REAL, "Cross-term dependence of ibpc2"), - - IOP("vgs_max", HSM2_MOD_VGS_MAX, IF_REAL, "maximum voltage G-S branch"), - IOP("vgd_max", HSM2_MOD_VGD_MAX, IF_REAL, "maximum voltage G-D branch"), - IOP("vgb_max", HSM2_MOD_VGB_MAX, IF_REAL, "maximum voltage G-B branch"), - IOP("vds_max", HSM2_MOD_VDS_MAX, IF_REAL, "maximum voltage D-S branch"), - IOP("vbs_max", HSM2_MOD_VBS_MAX, IF_REAL, "maximum voltage B-S branch"), - IOP("vbd_max", HSM2_MOD_VBD_MAX, IF_REAL, "maximum voltage B-D branch"), - IOP("vgsr_max", HSM2_MOD_VGSR_MAX, IF_REAL, "maximum voltage G-S branch"), - IOP("vgdr_max", HSM2_MOD_VGDR_MAX, IF_REAL, "maximum voltage G-D branch"), - IOP("vgbr_max", HSM2_MOD_VGBR_MAX, IF_REAL, "maximum voltage G-B branch"), - IOP("vbsr_max", HSM2_MOD_VBSR_MAX, IF_REAL, "maximum voltage B-S branch"), - IOP("vbdr_max", HSM2_MOD_VBDR_MAX, IF_REAL, "maximum voltage B-D branch") - -}; - -char *HSM2names[] = { - "Drain", - "Gate", - "Source", - "Bulk" -}; - -int HSM2nSize = NUMELEMS(HSM2names); -int HSM2pTSize = NUMELEMS(HSM2pTable); -int HSM2mPTSize = NUMELEMS(HSM2mPTable); -int HSM2iSize = sizeof(HSM2instance); -int HSM2mSize = sizeof(HSM2model); - diff --git a/src/spicelib/devices/hisim2/hsm2acld.c b/src/spicelib/devices/hisim2/hsm2acld.c deleted file mode 100644 index 4193597db..000000000 --- a/src/spicelib/devices/hisim2/hsm2acld.c +++ /dev/null @@ -1,683 +0,0 @@ -/*********************************************************************** - - HiSIM (Hiroshima University STARC IGFET Model) - Copyright (C) 2014 Hiroshima University & STARC - - MODEL NAME : HiSIM - ( VERSION : 2 SUBVERSION : 8 REVISION : 0 ) - - FILE : hsm2acld.c - - Date : 2014.6.5 - - released by - Hiroshima University & - Semiconductor Technology Academic Research Center (STARC) -***********************************************************************/ - -/********************************************************************** - -The following source code, and all copyrights, trade secrets or other -intellectual property rights in and to the source code in its entirety, -is owned by the Hiroshima University and the STARC organization. - -All users need to follow the "HiSIM2 Distribution Statement and -Copyright Notice" attached to HiSIM2 model. - ------HiSIM2 Distribution Statement and Copyright Notice-------------- - -Software is distributed as is, completely without warranty or service -support. Hiroshima University or STARC and its employees are not liable -for the condition or performance of the software. - -Hiroshima University and STARC own the copyright and grant users a perpetual, -irrevocable, worldwide, non-exclusive, royalty-free license with respect -to the software as set forth below. - -Hiroshima University and STARC hereby disclaim all implied warranties. - -Hiroshima University and STARC grant the users the right to modify, copy, -and redistribute the software and documentation, both within the user's -organization and externally, subject to the following restrictions - -1. The users agree not to charge for Hiroshima University and STARC code -itself but may charge for additions, extensions, or support. - -2. In any product based on the software, the users agree to acknowledge -Hiroshima University and STARC that developed the software. This -acknowledgment shall appear in the product documentation. - -3. The users agree to reproduce any copyright notice which appears on -the software on any copy or modification of such made available -to others." - - -*************************************************************************/ - -#include "ngspice/ngspice.h" -#include "ngspice/cktdefs.h" -#include "ngspice/sperror.h" -#include "ngspice/suffix.h" -#include "hsm2def.h" - - -int HSM2acLoad( - GENmodel *inModel, - CKTcircuit *ckt) -{ - HSM2model *model = (HSM2model*)inModel; - HSM2instance *here; - double xcggb_r, xcgdb_r, xcgsb_r, xcgbb_r, xcggb_i, xcgdb_i, xcgsb_i, xcgbb_i; - double xcbgb_r, xcbdb_r, xcbsb_r, xcbbb_r, xcbgb_i, xcbdb_i, xcbsb_i, xcbbb_i; - double xcdgb_r, xcddb_r, xcdsb_r, xcdbb_r, xcdgb_i, xcddb_i, xcdsb_i, xcdbb_i; - double xcsgb_r, xcsdb_r, xcssb_r, xcsbb_r, xcsgb_i, xcsdb_i, xcssb_i, xcsbb_i; - double gdpr, gspr, gds, gbd, gbs, capbd, capbs, omega; - double FwdSum, RevSum, gm, gmbs; - double gbspsp, gbbdp, gbbsp, gbspg, gbspb; - double gbspdp, gbdpdp, gbdpg, gbdpb, gbdpsp; - double gIbtotg, gIbtotd, gIbtots, gIbtotb; - double gIgtotg, gIgtotd, gIgtots, gIgtotb; - double gIdtotg, gIdtotd, gIdtots, gIdtotb; - double gIstotg, gIstotd, gIstots, gIstotb; - double cggb_real = 0.0, cgsb_real = 0.0, cgdb_real = 0.0, cggb_imag = 0.0, cgsb_imag = 0.0, cgdb_imag = 0.0; - double cdgb_real = 0.0, cdsb_real = 0.0, cddb_real = 0.0, cdgb_imag = 0.0, cdsb_imag = 0.0, cddb_imag = 0.0; - double csgb_real = 0.0, cssb_real = 0.0, csdb_real = 0.0, csgb_imag = 0.0, cssb_imag = 0.0, csdb_imag = 0.0; - double cbgb_real = 0.0, cbsb_real = 0.0, cbdb_real = 0.0, cbgb_imag = 0.0, cbsb_imag = 0.0, cbdb_imag = 0.0; - double pyggb_r = 0.0, pygdb_r = 0.0, pygsb_r = 0.0, pygbb_r = 0.0; - double pybgb_r = 0.0, pybdb_r = 0.0, pybsb_r = 0.0, pybbb_r = 0.0; - double pydgb_r = 0.0, pyddb_r = 0.0, pydsb_r = 0.0, pydbb_r = 0.0; - double pysgb_r = 0.0, pysdb_r = 0.0, pyssb_r = 0.0, pysbb_r = 0.0; - double pyggb_i = 0.0, pygdb_i = 0.0, pygsb_i = 0.0, pygbb_i = 0.0; - double pybgb_i = 0.0, pybdb_i = 0.0, pybsb_i = 0.0, pybbb_i = 0.0; - double pydgb_i = 0.0, pyddb_i = 0.0, pydsb_i = 0.0, pydbb_i = 0.0; - double pysgb_i = 0.0, pysdb_i = 0.0, pyssb_i = 0.0, pysbb_i = 0.0; - double yggb_r, ygdb_r, ygsb_r, ygbb_r, yggb_i, ygdb_i, ygsb_i, ygbb_i; - double ybgb_r, ybdb_r, ybsb_r, ybbb_r, ybgb_i, ybdb_i, ybsb_i, ybbb_i; - double ydgb_r, yddb_r, ydsb_r, ydbb_r, ydgb_i, yddb_i, ydsb_i, ydbb_i; - double ysgb_r, ysdb_r, yssb_r, ysbb_r, ysgb_i, ysdb_i, yssb_i, ysbb_i; - double grg = 0.0, pxcbdb_i = 0.0, pxcbsb_i = 0.0; - - double Qi, Qi_dVgs, Qi_dVbs, Qi_dVds ; -#ifdef DEBUG_HISIM2CGG - double Qb ; -#endif - double Qb_dVgs, Qb_dVbs, Qb_dVds ; - double tau ; - double taub ; - double Xd, Xd_dVgs, Xd_dVbs, Xd_dVds ; - double T1, T2, T3, T4 ; - double cdbs_real, cgbs_real, csbs_real, cbbs_real; - double cdbs_imag, cgbs_imag, csbs_imag, cbbs_imag; - - omega = ckt->CKTomega; - for ( ; model != NULL; model = HSM2nextModel(model)) { - for ( here = HSM2instances(model); here!= NULL; here = HSM2nextInstance(here)) { - - gdpr = here->HSM2drainConductance; - gspr = here->HSM2sourceConductance; - gds = here->HSM2_gds; - gbd = here->HSM2_gbd; - gbs = here->HSM2_gbs; - capbd = here->HSM2_capbd; - capbs = here->HSM2_capbs; - - if (model->HSM2_conqs) { /* for nqs mode */ - - tau = here->HSM2_tau ; - - taub = here->HSM2_taub ; - - Xd = here->HSM2_Xd; - Xd_dVgs = here->HSM2_Xd_dVgs ; - Xd_dVds = here->HSM2_Xd_dVds ; - Xd_dVbs = here->HSM2_Xd_dVbs ; - - Qi = here->HSM2_Qi ; - Qi_dVgs = here->HSM2_Qi_dVgs ; - Qi_dVds = here->HSM2_Qi_dVds ; - Qi_dVbs = here->HSM2_Qi_dVbs ; - -#ifdef DEBUG_HISIM2CGG - Qb = here->HSM2_Qb ; -#endif - Qb_dVgs = here->HSM2_Qb_dVgs ; - Qb_dVds = here->HSM2_Qb_dVds ; - Qb_dVbs = here->HSM2_Qb_dVbs ; - - T1 = 1.0 + (tau * omega) * (tau * omega); - T2 = tau * omega / T1; - T3 = 1.0 + (taub * omega) * (taub * omega); - T4 = taub * omega / T3; - - cddb_real = Xd_dVds*Qi + Xd/T1*Qi_dVds; - cdgb_real = Xd_dVgs*Qi + Xd/T1*Qi_dVgs; - cdbs_real = Xd_dVbs*Qi + Xd/T1*Qi_dVbs; - cdsb_real = - (cddb_real + cdgb_real + cdbs_real); - - cddb_imag = - T2*Xd*Qi_dVds; - cdgb_imag = - T2*Xd*Qi_dVgs; - cdbs_imag = - T2*Xd*Qi_dVbs; - cdsb_imag = - (cddb_imag + cdgb_imag + cdbs_imag); - - csdb_real = - Xd_dVds*Qi + (1.0-Xd)/T1*Qi_dVds; - csgb_real = - Xd_dVgs*Qi + (1.0-Xd)/T1*Qi_dVgs; - csbs_real = - Xd_dVbs*Qi + (1.0-Xd)/T1*Qi_dVbs; - cssb_real = - (csdb_real + csgb_real + csbs_real); - - csdb_imag = - T2*(1.0-Xd)*Qi_dVds; - csgb_imag = - T2*(1.0-Xd)*Qi_dVgs; - csbs_imag = - T2*(1.0-Xd)*Qi_dVbs; - cssb_imag = - (csdb_imag + csgb_imag + csbs_imag); - - cbdb_real = Qb_dVds/T3; - cbgb_real = Qb_dVgs/T3; - cbbs_real = Qb_dVbs/T3; - cbsb_real = - (cbdb_real + cbgb_real + cbbs_real); - - cbdb_imag = - T4*Qb_dVds; - cbgb_imag = - T4*Qb_dVgs; - cbbs_imag = - T4*Qb_dVbs; - cbsb_imag = - (cbdb_imag + cbgb_imag + cbbs_imag); - - cgdb_real = - Qi_dVds/T1 - Qb_dVds/T3; - cggb_real = - Qi_dVgs/T1 - Qb_dVgs/T3; - cgbs_real = - Qi_dVbs/T1 - Qb_dVbs/T3; - cgsb_real = - (cgdb_real + cggb_real + cgbs_real); - - cgdb_imag = T2*Qi_dVds + T4*Qb_dVds; - cggb_imag = T2*Qi_dVgs + T4*Qb_dVgs; - cgbs_imag = T2*Qi_dVbs + T4*Qb_dVbs; - cgsb_imag = - (cgdb_imag + cggb_imag + cgbs_imag); - - - -#ifdef DEBUG_HISIM2CGG - printf("Freq. %e ", omega/(2*3.14159265358979) ) ; - printf("mag[Cgg] %e ", sqrt( cggb_real * cggb_real + cggb_imag * cggb_imag ) ) ; - printf("qi %e ", ( sqrt(T1) / T1 ) * Qi ) ; - printf("qb %e ", ( sqrt(T3) / T3 ) * Qb ) ; - printf("\n") ; -#endif - -#ifdef DEBUG_HISIM2AC - printf ("#1 cssb, cggb, cgdb, cgsb, cdgb, cddb, cdsb, csgb, csdb %e %e %e %e %e %e %e %e %e %e %e %e\n", cggb_real, cgdb_real, cgsb_real, cdgb_real, cddb_real, cdsb_real, csgb_real, csdb_real, cssb_real); -#endif - } - - if ( here->HSM2_mode >= 0 ) { - gm = here->HSM2_gm; - gmbs = here->HSM2_gmbs; - FwdSum = gm + gmbs; - RevSum = 0.0; - - gbbdp = -here->HSM2_gbds; - gbbsp = here->HSM2_gbds + here->HSM2_gbgs + here->HSM2_gbbs; - - gbdpg = here->HSM2_gbgs; - gbdpb = here->HSM2_gbbs; - gbdpdp = here->HSM2_gbds; - gbdpsp = -(gbdpg + gbdpb + gbdpdp); - - gbspdp = 0.0; - gbspg = 0.0; - gbspb = 0.0; - gbspsp = 0.0; - - if (model->HSM2_coiigs) { - gIbtotg = here->HSM2_gigbg; - gIbtotd = here->HSM2_gigbd; - gIbtots = here->HSM2_gigbs; - gIbtotb = here->HSM2_gigbb; - - gIstotg = here->HSM2_gigsg; - gIstotd = here->HSM2_gigsd; - gIstots = here->HSM2_gigss; - gIstotb = here->HSM2_gigsb; - - gIdtotg = here->HSM2_gigdg; - gIdtotd = here->HSM2_gigdd; - gIdtots = here->HSM2_gigds; - gIdtotb = here->HSM2_gigdb; - } else { - gIbtotg = gIbtotd = gIbtots = gIbtotb = 0.0; - gIstotg = gIstotd = gIstots = gIstotb = 0.0; - gIdtotg = gIdtotd = gIdtots = gIdtotb = 0.0; - } - - if (model->HSM2_coiigs) { - gIgtotg = gIbtotg + gIstotg + gIdtotg; - gIgtotd = gIbtotd + gIstotd + gIdtotd; - gIgtots = gIbtots + gIstots + gIdtots; - gIgtotb = gIbtotb + gIstotb + gIdtotb; - } else { - gIgtotg = gIgtotd = gIgtots = gIgtotb = 0.0; - } - - if (model->HSM2_conqs) { /* for nqs mode */ - /* - cggb_real, cgsb_real, cgdb_real - cggb_imag, cgsb_imag, cgdb_imag - cdgb_real, cdsb_real, cddb_real - cdgb_imag, cdsb_imag, cddb_imag - csgb_real, cssb_real, csdb_real - csgb_imag, cssb_imag, csdb_imag - cbgb_real, cbsb_real, cbdb_real - cbgb_imag, cbsb_imag, cbdb_imag - have already obtained. - */ - if (model->HSM2_coadov == 1) { /* add overlap caps to intrinsic caps */ - pydgb_i = (here->HSM2_cdgo - here->HSM2_cqyg) * omega ; - pyddb_i = (here->HSM2_cddo - here->HSM2_cqyd) * omega ; - pydsb_i = (here->HSM2_cdso + here->HSM2_cqyg + here->HSM2_cqyd + here->HSM2_cqyb) * omega ; - pydbb_i = -(pydgb_i + pyddb_i + pydsb_i) ; - - pysgb_i = here->HSM2_csgo * omega ; - pysdb_i = here->HSM2_csdo * omega ; - pyssb_i = here->HSM2_csso * omega ; - pysbb_i = -(pysgb_i + pysdb_i + pyssb_i) ; - - pyggb_i = (-(here->HSM2_cgdo + here->HSM2_cgbo + here->HSM2_cgso) + here->HSM2_cqyg) * omega ; - pygdb_i = (here->HSM2_cgdo + here->HSM2_cqyd) * omega ; - pygsb_i = (here->HSM2_cgso - here->HSM2_cqyg - here->HSM2_cqyd - here->HSM2_cqyb) * omega ; - pygbb_i = -(pyggb_i + pygdb_i + pygsb_i) ; - } - - } else { /* for qs mode */ - /* if coadov = 1, coverlap caps have been arleady added to intrinsic caps (QS mode)*/ - cggb_real = here->HSM2_cggb; - cgsb_real = here->HSM2_cgsb; - cgdb_real = here->HSM2_cgdb; - cggb_imag = cgsb_imag = cgdb_imag = 0.0; - - cbgb_real = here->HSM2_cbgb; - cbsb_real = here->HSM2_cbsb; - cbdb_real = here->HSM2_cbdb; - cbgb_imag = cbsb_imag = cbdb_imag = 0.0; - - cdgb_real = here->HSM2_cdgb; - cdsb_real = here->HSM2_cdsb; - cddb_real = here->HSM2_cddb; - cdgb_imag = cdsb_imag = cddb_imag = 0.0; - - csgb_real = -(cdgb_real + cggb_real + cbgb_real); - cssb_real = -(cdsb_real + cgsb_real + cbsb_real); - csdb_real = -(cddb_real + cgdb_real + cbdb_real); - csgb_imag = cssb_imag = csdb_imag = 0.0; - - pyggb_i = 0.0; pygdb_i = 0.0; pygsb_i = 0.0; pygbb_i = 0.0; - pybgb_i = 0.0; pybdb_i = 0.0; pybsb_i = 0.0; pybbb_i = 0.0; - pydgb_i = 0.0; pyddb_i = 0.0; pydsb_i = 0.0; pydbb_i = 0.0; - pysgb_i = 0.0; pysdb_i = 0.0; pyssb_i = 0.0; pysbb_i = 0.0; - } - - } else { /* reverse mode */ - gm = -here->HSM2_gm; - gmbs = -here->HSM2_gmbs; - FwdSum = 0.0; - RevSum = -(gm + gmbs); - - gbbsp = -here->HSM2_gbds; - gbbdp = here->HSM2_gbds + here->HSM2_gbgs + here->HSM2_gbbs; - - gbdpg = 0.0; - gbdpsp = 0.0; - gbdpb = 0.0; - gbdpdp = 0.0; - - gbspg = here->HSM2_gbgs; - gbspsp = here->HSM2_gbds; - gbspb = here->HSM2_gbbs; - gbspdp = -(gbspg + gbspsp + gbspb); - - if (model->HSM2_coiigs) { - gIbtotg = here->HSM2_gigbg; - gIbtotd = here->HSM2_gigbd; - gIbtots = here->HSM2_gigbs; - gIbtotb = here->HSM2_gigbb; - - gIstotg = here->HSM2_gigsg; - gIstotd = here->HSM2_gigsd; - gIstots = here->HSM2_gigss; - gIstotb = here->HSM2_gigsb; - - gIdtotg = here->HSM2_gigdg; - gIdtotd = here->HSM2_gigdd; - gIdtots = here->HSM2_gigds; - gIdtotb = here->HSM2_gigdb; - } else { - gIbtotg = gIbtotd = gIbtots = gIbtotb = 0.0; - gIstotg = gIstotd = gIstots = gIstotb = 0.0; - gIdtotg = gIdtotd = gIdtots = gIdtotb = 0.0; - } - - if (model->HSM2_coiigs) { - gIgtotg = gIbtotg + gIstotg + gIdtotg; - gIgtotd = gIbtotd + gIstotd + gIdtotd; - gIgtots = gIbtots + gIstots + gIdtots; - gIgtotb = gIbtotb + gIstotb + gIdtotb; - } else { - gIgtotg = gIgtotd = gIgtots = gIgtotb = 0.0; - } - - if (model->HSM2_conqs) { /* for nqs mode */ - /* swap d with s, s with d */ - /* cggb_real has already obtained. */ - T1 = cgsb_real; - cgsb_real = cgdb_real; - cgdb_real = T1; - /* cggb_imag has already obtained. */ - T1 = cgsb_imag; - cgsb_imag = cgdb_imag; - cgdb_imag = T1; - - T1 = cdgb_real; - cdgb_real = csgb_real; - csgb_real = T1; - T1 = cdsb_real; - cdsb_real = csdb_real; - csdb_real = T1; - T1 = cddb_real; - cddb_real = cssb_real; - cssb_real = T1; - T1 = cdgb_imag; - cdgb_imag = csgb_imag; - csgb_imag = T1; - T1 = cdsb_imag; - cdsb_imag = csdb_imag; - csdb_imag = T1; - T1 = cddb_imag; - cddb_imag = cssb_imag; - cssb_imag = T1; - - /* cbgb_real has already obtained. */ - T1 = cbsb_real; - cbsb_real = cbdb_real; - cbdb_real = T1; - /* cbgb_imag has already obtained. */ - T1 = cbsb_imag; - cbsb_imag = cbdb_imag; - cbdb_imag = T1; - - if (model->HSM2_coadov == 1) { /* add overlap caps to intrinsic caps */ - pydgb_i = here->HSM2_csgo * omega ; - pyddb_i = here->HSM2_csso * omega ; - pydsb_i = here->HSM2_csdo * omega ; - pydbb_i = -(pydgb_i + pyddb_i + pydsb_i) ; - - pysgb_i = (here->HSM2_cdgo - here->HSM2_cqyg) * omega ; - pysdb_i = (here->HSM2_cdso + here->HSM2_cqyg + here->HSM2_cqyd + here->HSM2_cqyb) * omega ; - pyssb_i = (here->HSM2_cddo - here->HSM2_cqyd) * omega ; - pysbb_i = -(pysgb_i + pysdb_i + pyssb_i) ; - - pyggb_i = (-(here->HSM2_cgdo + here->HSM2_cgbo + here->HSM2_cgso) + here->HSM2_cqyg) * omega ; - pygdb_i = (here->HSM2_cgso - here->HSM2_cqyg - here->HSM2_cqyd - here->HSM2_cqyb) * omega ; - pygsb_i = (here->HSM2_cgdo + here->HSM2_cqyd) * omega ; - pygbb_i = -(pyggb_i + pygdb_i + pygsb_i) ; - } - - } else { /* for qs mode */ - /* if coadov = 1, coverlap caps have already been added to intrinsic caps (QS mode)*/ - cggb_real = here->HSM2_cggb; - cgsb_real = here->HSM2_cgdb; - cgdb_real = here->HSM2_cgsb; - cggb_imag = cgsb_imag = cgdb_imag = 0.0; - - cbgb_real = here->HSM2_cbgb; - cbsb_real = here->HSM2_cbdb; - cbdb_real = here->HSM2_cbsb; - cbgb_imag = cbsb_imag = cbdb_imag = 0.0; - - csgb_real = here->HSM2_cdgb ; - cssb_real = here->HSM2_cddb ; - csdb_real = here->HSM2_cdsb ; - csgb_imag = cssb_imag = csdb_imag = 0.0; - - cdgb_real = -(csgb_real + cggb_real + cbgb_real); - cdsb_real = -(cssb_real + cgsb_real + cbsb_real); - cddb_real = -(csdb_real + cgdb_real + cbdb_real); - cdgb_imag = cdsb_imag = cddb_imag = 0.0; - - pyggb_i = 0.0; pygdb_i = 0.0; pygsb_i = 0.0; pygbb_i = 0.0; - pybgb_i = 0.0; pybdb_i = 0.0; pybsb_i = 0.0; pybbb_i = 0.0; - pydgb_i = 0.0; pyddb_i = 0.0; pydsb_i = 0.0; pydbb_i = 0.0; - pysgb_i = 0.0; pysdb_i = 0.0; pyssb_i = 0.0; pysbb_i = 0.0; - } - - } -#ifdef DEBUG_HISIM2AC - printf ("#2 cssb, cggb, cgdb, cgsb, cdgb, cddb, cdsb, csgb, csdb %e %e %e %e %e %e %e %e %e %e %e %e\n", cggb_real, cgdb_real, cgsb_real, cdgb_real, cddb_real, cdsb_real, csgb_real, csdb_real, cssb_real); -#endif - - /* matrix elements for ac analysis (including real and imaginary parts) */ - xcdgb_r = cdgb_real * omega; - xcddb_r = cddb_real * omega; - xcdsb_r = cdsb_real * omega; - xcdbb_r = -(xcdgb_r + xcddb_r + xcdsb_r); - - xcsgb_r = csgb_real * omega; - xcsdb_r = csdb_real * omega; - xcssb_r = cssb_real * omega; - xcsbb_r = -(xcsgb_r + xcsdb_r + xcssb_r); - - xcggb_r = cggb_real * omega; - xcgdb_r = cgdb_real * omega; - xcgsb_r = cgsb_real * omega; - xcgbb_r = -(xcggb_r + xcgdb_r + xcgsb_r); - - xcbgb_r = cbgb_real * omega; - xcbdb_r = cbdb_real * omega; - xcbsb_r = cbsb_real * omega; - xcbbb_r = -(xcbgb_r + xcbdb_r + xcbsb_r); - - xcdgb_i = cdgb_imag * omega; - xcddb_i = cddb_imag * omega; - xcdsb_i = cdsb_imag * omega; - xcdbb_i = -(xcddb_i + xcdgb_i + xcdsb_i); - - xcsgb_i = csgb_imag * omega; - xcsdb_i = csdb_imag * omega; - xcssb_i = cssb_imag * omega; - xcsbb_i = -(xcsdb_i + xcsgb_i + xcssb_i); - - xcggb_i = cggb_imag * omega; - xcgdb_i = cgdb_imag * omega; - xcgsb_i = cgsb_imag * omega; - xcgbb_i = -(xcggb_i + xcgdb_i + xcgsb_i); - - xcbgb_i = cbgb_imag * omega; - xcbdb_i = cbdb_imag * omega; - xcbsb_i = cbsb_imag * omega; - xcbbb_i = -(xcbgb_i + xcbdb_i + xcbsb_i); - - /* stamp intrinsic y-parameters */ - yggb_r = - xcggb_i; yggb_i = xcggb_r; - ygdb_r = - xcgdb_i; ygdb_i = xcgdb_r; - ygsb_r = - xcgsb_i; ygsb_i = xcgsb_r; - ygbb_r = - xcgbb_i; ygbb_i = xcgbb_r; - - ydgb_r = - xcdgb_i; ydgb_i = xcdgb_r; - yddb_r = - xcddb_i; yddb_i = xcddb_r; - ydsb_r = - xcdsb_i; ydsb_i = xcdsb_r; - ydbb_r = - xcdbb_i; ydbb_i = xcdbb_r; - ydgb_r += gm; - yddb_r += gds + RevSum; - ydsb_r += - gds - FwdSum; - ydbb_r += gmbs; - - ysgb_r = - xcsgb_i; ysgb_i = xcsgb_r; - ysdb_r = - xcsdb_i; ysdb_i = xcsdb_r; - yssb_r = - xcssb_i; yssb_i = xcssb_r; - ysbb_r = - xcsbb_i; ysbb_i = xcsbb_r; - ysgb_r += - gm; - ysdb_r += - gds - RevSum; - yssb_r += gds + FwdSum; - ysbb_r += - gmbs; - - ybgb_r = - xcbgb_i; ybgb_i = xcbgb_r; - ybdb_r = - xcbdb_i; ybdb_i = xcbdb_r; - ybsb_r = - xcbsb_i; ybsb_i = xcbsb_r; - ybbb_r = - xcbbb_i; ybbb_i = xcbbb_r; - - /* Ibd, Ibs, Igate, Igd, Igs, Igb, Igidl, Igisl, Isub */ - pydgb_r = gbdpg - gIdtotg + here->HSM2_gigidlgs ; - pyddb_r = gbd + gbdpdp - gIdtotd + here->HSM2_gigidlds ; - pydsb_r = gbdpsp - gIdtots - (here->HSM2_gigidlgs + here->HSM2_gigidlds + here->HSM2_gigidlbs); - pydbb_r = gbdpb - gIdtotb + here->HSM2_gigidlbs ; - if (!here->HSM2_corbnet) pydbb_r += - gbd; - - pysgb_r = gbspg - gIstotg + here->HSM2_gigislgd ; - pysdb_r = gbspdp - gIstotd - (here->HSM2_gigislsd + here->HSM2_gigislgd + here->HSM2_gigislbd); - pyssb_r = gbs + gbspsp - gIstots + here->HSM2_gigislsd ; - pysbb_r =gbspb - gIstotb + here->HSM2_gigislbd ; - if (!here->HSM2_corbnet) pysbb_r += - gbs; - - pyggb_r = gIgtotg ; - if (here->HSM2_corg == 1) { - grg = here->HSM2_grg; - pyggb_r += grg; - } - pygdb_r = gIgtotd ; - pygsb_r = gIgtots ; - pygbb_r = gIgtotb ; - - pybgb_r = - here->HSM2_gbgs - gIbtotg - here->HSM2_gigidlgs - here->HSM2_gigislgd ; - pybdb_r = gbbdp - gIbtotd - - here->HSM2_gigidlds + (here->HSM2_gigislgd + here->HSM2_gigislsd + here->HSM2_gigislbd) ; - if (!here->HSM2_corbnet) pybdb_r += - gbd ; - pybsb_r = gbbsp - gIbtots - + (here->HSM2_gigidlgs + here->HSM2_gigidlds + here->HSM2_gigidlbs) - here->HSM2_gigislsd ; - if (!here->HSM2_corbnet) pybsb_r += - gbs ; - pybbb_r = - here->HSM2_gbbs - gIbtotb - here->HSM2_gigidlbs - here->HSM2_gigislbd ; - if (!here->HSM2_corbnet) pybbb_r += gbd + gbs ; - - pybdb_i = -(pyddb_i + pygdb_i + pysdb_i); - pybgb_i = -(pydgb_i + pyggb_i + pysgb_i); - pybsb_i = -(pydsb_i + pygsb_i + pyssb_i); - pybbb_i = -(pydbb_i + pygbb_i + pysbb_i); - - /* Cbd, Cbs */ - pyddb_i += capbd * omega ; - pyssb_i += capbs * omega ; - if (!here->HSM2_corbnet) { - pydbb_i -= capbd * omega ; - pysbb_i -= capbs * omega ; - - pybdb_i -= capbd * omega ; - pybsb_i -= capbs * omega ; - pybbb_i += (capbd + capbs) * omega ; - } else { - pxcbdb_i = - capbd * omega ; - pxcbsb_i = - capbs * omega ; - } - -#ifdef DEBUG_HISIM2AC - /* for representing y-parameters */ - printf("f ygg_r ygg_i %e %e %e\n",omega/(2.0*3.141592653589793),yggb_r+pyggb_r,yggb_i+pyggb_i); - printf("f ygd_r ygd_i %e %e %e\n",omega/(2.0*3.141592653589793),ygdb_r+pygdb_r,ygdb_i+pygdb_i); - printf("f ygs_r ygs_i %e %e %e\n",omega/(2.0*3.141592653589793),ygsb_r+pygsb_r,ygsb_i+pygsb_i); - printf("f ygb_r ygb_i %e %e %e\n",omega/(2.0*3.141592653589793),ygbb_r+pygbb_r,ygbb_i+pygbb_i); - - printf("f ydg_r ydg_i %e %e %e\n",omega/(2.0*3.141592653589793),ydgb_r+pydgb_r,ydgb_i+pydgb_i); - printf("f ydd_r ydd_i %e %e %e\n",omega/(2.0*3.141592653589793),yddb_r+pyddb_r,yddb_i+pyddb_i); - printf("f yds_r yds_i %e %e %e\n",omega/(2.0*3.141592653589793),ydsb_r+pydsb_r,ydsb_i+pydsb_i); - printf("f ydb_r ydb_i %e %e %e\n",omega/(2.0*3.141592653589793),ydbb_r+pydbb_r,ydbb_i+pydbb_i); - - printf("f ybg_r ybg_i %e %e %e\n",omega/(2.0*3.141592653589793),ybgb_r+pybgb_r,ybgb_i+pybgb_i); - printf("f ybd_r ybd_i %e %e %e\n",omega/(2.0*3.141592653589793),ybdb_r+pybdb_r,ybdb_i+pybdb_i); - printf("f ybs_r ybs_i %e %e %e\n",omega/(2.0*3.141592653589793),ybsb_r+pybsb_r,ybsb_i+pybsb_i); - printf("f ybb_r ybb_i %e %e %e\n",omega/(2.0*3.141592653589793),ybbb_r+pybbb_r,ybbb_i+pybbb_i); - - printf("f ysg_r ysg_i %e %e %e\n",omega/(2.0*3.141592653589793),ysgb_r+pysgb_r,ysgb_i+pysgb_i); - printf("f ysd_r ysd_i %e %e %e\n",omega/(2.0*3.141592653589793),ysdb_r+pysdb_r,ysdb_i+pysdb_i); - printf("f yss_r yss_i %e %e %e\n",omega/(2.0*3.141592653589793),yssb_r+pyssb_r,yssb_i+pyssb_i); - printf("f ysb_r ysb_i %e %e %e\n",omega/(2.0*3.141592653589793),ysbb_r+pysbb_r,ysbb_i+pysbb_i); - - printf("f y11r y11i y12r y12i y21r y21i y22r y22i %e %e %e %e %e %e %e %e %e\n",omega/(2.0*3.141592653589793),yggb_r+pyggb_r,yggb_i+pyggb_i, ygdb_r+pygdb_r,ygdb_i+pygdb_i, ydgb_r+pydgb_r,ydgb_i+pydgb_i, yddb_r+pyddb_r,yddb_i+pyddb_i); -#endif - - if (here->HSM2_corg == 1) { - *(here->HSM2GgPtr) += grg; - *(here->HSM2GPgPtr) -= grg; - *(here->HSM2GgpPtr) -= grg; - } - - *(here->HSM2GPgpPtr +1) += yggb_i + pyggb_i; - *(here->HSM2GPgpPtr) += yggb_r + pyggb_r; - *(here->HSM2GPdpPtr +1) += ygdb_i + pygdb_i; - *(here->HSM2GPdpPtr) += ygdb_r + pygdb_r; - *(here->HSM2GPspPtr +1) += ygsb_i + pygsb_i; - *(here->HSM2GPspPtr) += ygsb_r + pygsb_r; - *(here->HSM2GPbpPtr +1) += ygbb_i + pygbb_i; - *(here->HSM2GPbpPtr) += ygbb_r + pygbb_r; - - *(here->HSM2DPdpPtr +1) += yddb_i + pyddb_i; - *(here->HSM2DPdpPtr) += yddb_r + pyddb_r + gdpr; - *(here->HSM2DPdPtr) -= gdpr; - *(here->HSM2DPgpPtr +1) += ydgb_i + pydgb_i; - *(here->HSM2DPgpPtr) += ydgb_r + pydgb_r; - *(here->HSM2DPspPtr +1) += ydsb_i + pydsb_i; - *(here->HSM2DPspPtr) += ydsb_r + pydsb_r; - *(here->HSM2DPbpPtr +1) += ydbb_i + pydbb_i; - *(here->HSM2DPbpPtr) += ydbb_r + pydbb_r; - - *(here->HSM2DdpPtr) -= gdpr; - *(here->HSM2DdPtr) += gdpr; - - *(here->HSM2SPdpPtr +1) += ysdb_i + pysdb_i; - *(here->HSM2SPdpPtr) += ysdb_r + pysdb_r; - *(here->HSM2SPgpPtr +1) += ysgb_i + pysgb_i; - *(here->HSM2SPgpPtr) += ysgb_r + pysgb_r; - *(here->HSM2SPspPtr +1) += yssb_i + pyssb_i; - *(here->HSM2SPspPtr) += yssb_r + pyssb_r + gspr; - *(here->HSM2SPsPtr) -= gspr ; - *(here->HSM2SPbpPtr +1) += ysbb_i + pysbb_i; - *(here->HSM2SPbpPtr) += ysbb_r + pysbb_r; - - *(here->HSM2SspPtr) -= gspr; - *(here->HSM2SsPtr) += gspr; - - *(here->HSM2BPdpPtr +1) += ybdb_i + pybdb_i; - *(here->HSM2BPdpPtr) += ybdb_r + pybdb_r; - *(here->HSM2BPgpPtr +1) += ybgb_i + pybgb_i; - *(here->HSM2BPgpPtr) += ybgb_r + pybgb_r; - *(here->HSM2BPspPtr +1) += ybsb_i + pybsb_i; - *(here->HSM2BPspPtr) += ybsb_r + pybsb_r; - *(here->HSM2BPbpPtr +1) += ybbb_i + pybbb_i; - *(here->HSM2BPbpPtr) += ybbb_r + pybbb_r; - - if (here->HSM2_corbnet == 1) { - *(here->HSM2DPdbPtr +1) += pxcbdb_i; - *(here->HSM2DPdbPtr) -= gbd; - *(here->HSM2SPsbPtr +1) += pxcbsb_i; - *(here->HSM2SPsbPtr) -= gbs; - - *(here->HSM2DBdpPtr +1) += pxcbdb_i; - *(here->HSM2DBdpPtr) -= gbd; - *(here->HSM2DBdbPtr +1) -= pxcbdb_i; - *(here->HSM2DBdbPtr) += gbd + here->HSM2_grbpd + here->HSM2_grbdb; - *(here->HSM2DBbpPtr) -= here->HSM2_grbpd; - *(here->HSM2DBbPtr) -= here->HSM2_grbdb; - - *(here->HSM2BPdbPtr) -= here->HSM2_grbpd; - *(here->HSM2BPbPtr) -= here->HSM2_grbpb; - *(here->HSM2BPsbPtr) -= here->HSM2_grbps; - *(here->HSM2BPbpPtr) += here->HSM2_grbpd + here->HSM2_grbps + here->HSM2_grbpb; - - *(here->HSM2SBspPtr +1) += pxcbsb_i; - *(here->HSM2SBspPtr) -= gbs; - *(here->HSM2SBbpPtr) -= here->HSM2_grbps; - *(here->HSM2SBbPtr) -= here->HSM2_grbsb; - *(here->HSM2SBsbPtr +1) -= pxcbsb_i; - *(here->HSM2SBsbPtr) += gbs + here->HSM2_grbps + here->HSM2_grbsb; - - *(here->HSM2BdbPtr) -= here->HSM2_grbdb; - *(here->HSM2BbpPtr) -= here->HSM2_grbpb; - *(here->HSM2BsbPtr) -= here->HSM2_grbsb; - *(here->HSM2BbPtr) += here->HSM2_grbsb + here->HSM2_grbdb + here->HSM2_grbpb; - } - - } - } - - return(OK); -} diff --git a/src/spicelib/devices/hisim2/hsm2ask.c b/src/spicelib/devices/hisim2/hsm2ask.c deleted file mode 100644 index 43f42f4fe..000000000 --- a/src/spicelib/devices/hisim2/hsm2ask.c +++ /dev/null @@ -1,337 +0,0 @@ -/*********************************************************************** - - HiSIM (Hiroshima University STARC IGFET Model) - Copyright (C) 2014 Hiroshima University & STARC - - MODEL NAME : HiSIM - ( VERSION : 2 SUBVERSION : 8 REVISION : 0 ) - - FILE : hsm2ask.c - - Date : 2014.6.5 - - released by - Hiroshima University & - Semiconductor Technology Academic Research Center (STARC) -***********************************************************************/ - -/********************************************************************** - -The following source code, and all copyrights, trade secrets or other -intellectual property rights in and to the source code in its entirety, -is owned by the Hiroshima University and the STARC organization. - -All users need to follow the "HiSIM2 Distribution Statement and -Copyright Notice" attached to HiSIM2 model. - ------HiSIM2 Distribution Statement and Copyright Notice-------------- - -Software is distributed as is, completely without warranty or service -support. Hiroshima University or STARC and its employees are not liable -for the condition or performance of the software. - -Hiroshima University and STARC own the copyright and grant users a perpetual, -irrevocable, worldwide, non-exclusive, royalty-free license with respect -to the software as set forth below. - -Hiroshima University and STARC hereby disclaim all implied warranties. - -Hiroshima University and STARC grant the users the right to modify, copy, -and redistribute the software and documentation, both within the user's -organization and externally, subject to the following restrictions - -1. The users agree not to charge for Hiroshima University and STARC code -itself but may charge for additions, extensions, or support. - -2. In any product based on the software, the users agree to acknowledge -Hiroshima University and STARC that developed the software. This -acknowledgment shall appear in the product documentation. - -3. The users agree to reproduce any copyright notice which appears on -the software on any copy or modification of such made available -to others." - - -*************************************************************************/ - -#include "ngspice/ngspice.h" -#include "ngspice/ifsim.h" -#include "ngspice/cktdefs.h" -#include "ngspice/devdefs.h" -#include "hsm2def.h" -#include "ngspice/sperror.h" -#include "ngspice/suffix.h" - -int HSM2ask( - CKTcircuit *ckt, - GENinstance *inst, - int which, - IFvalue *value, - IFvalue *select) -{ - HSM2instance *here = (HSM2instance*)inst; - - NG_IGNORE(select); - - switch (which) { - case HSM2_L: - value->rValue = here->HSM2_l; - return(OK); - case HSM2_W: - value->rValue = here->HSM2_w; - return(OK); - case HSM2_AS: - value->rValue = here->HSM2_as; - return(OK); - case HSM2_AD: - value->rValue = here->HSM2_ad; - return(OK); - case HSM2_PS: - value->rValue = here->HSM2_ps; - return(OK); - case HSM2_PD: - value->rValue = here->HSM2_pd; - return(OK); - case HSM2_NRS: - value->rValue = here->HSM2_nrs; - return(OK); - case HSM2_NRD: - value->rValue = here->HSM2_nrd; - return(OK); - case HSM2_TEMP: - value->rValue = here->HSM2_temp; - return(OK); - case HSM2_DTEMP: - value->rValue = here->HSM2_dtemp; - return(OK); - case HSM2_OFF: - value->iValue = here->HSM2_off; - return(OK); - case HSM2_IC_VBS: - value->rValue = here->HSM2_icVBS; - return(OK); - case HSM2_IC_VDS: - value->rValue = here->HSM2_icVDS; - return(OK); - case HSM2_IC_VGS: - value->rValue = here->HSM2_icVGS; - return(OK); - case HSM2_DNODE: - value->iValue = here->HSM2dNode; - return(OK); - case HSM2_GNODE: - value->iValue = here->HSM2gNode; - return(OK); - case HSM2_SNODE: - value->iValue = here->HSM2sNode; - return(OK); - case HSM2_BNODE: - value->iValue = here->HSM2bNode; - return(OK); - case HSM2_DNODEPRIME: - value->iValue = here->HSM2dNodePrime; - return(OK); - case HSM2_SNODEPRIME: - value->iValue = here->HSM2sNodePrime; - return(OK); - case HSM2_SOURCECONDUCT: - value->rValue = here->HSM2sourceConductance; - return(OK); - case HSM2_DRAINCONDUCT: - value->rValue = here->HSM2drainConductance; - return(OK); - case HSM2_VBD: - value->rValue = *(ckt->CKTstate0 + here->HSM2vbd); - return(OK); - case HSM2_VBS: - value->rValue = *(ckt->CKTstate0 + here->HSM2vbs); - return(OK); - case HSM2_VGS: - value->rValue = *(ckt->CKTstate0 + here->HSM2vgs); - return(OK); - case HSM2_VDS: - value->rValue = *(ckt->CKTstate0 + here->HSM2vds); - return(OK); - case HSM2_CD: - value->rValue = here->HSM2_ids; - return(OK); - case HSM2_ISUB: - value->rValue = here->HSM2_isub; - return(OK); - case HSM2_IGIDL: - value->rValue = here->HSM2_igidl; - return(OK); - case HSM2_IGISL: - value->rValue = here->HSM2_igisl; - return(OK); - case HSM2_IGD: - value->rValue = here->HSM2_igd; - return(OK); - case HSM2_IGS: - value->rValue = here->HSM2_igs; - return(OK); - case HSM2_IGB: - value->rValue = here->HSM2_igb; - return(OK); - case HSM2_CBS: - value->rValue = here->HSM2_ibs; - return(OK); - case HSM2_CBD: - value->rValue = here->HSM2_ibd; - return(OK); - case HSM2_GM: - value->rValue = here->HSM2_gm; - return(OK); - case HSM2_GDS: - value->rValue = here->HSM2_gds; - return(OK); - case HSM2_GMBS: - value->rValue = here->HSM2_gmbs; - return(OK); - case HSM2_GBD: - value->rValue = here->HSM2_gbd; - return(OK); - case HSM2_GBS: - value->rValue = here->HSM2_gbs; - return(OK); - case HSM2_QB: - value->rValue = *(ckt->CKTstate0 + here->HSM2qb); - return(OK); - case HSM2_CQB: - value->rValue = *(ckt->CKTstate0 + here->HSM2cqb); - return(OK); - case HSM2_QG: - value->rValue = *(ckt->CKTstate0 + here->HSM2qg); - return(OK); - case HSM2_CQG: - value->rValue = *(ckt->CKTstate0 + here->HSM2cqg); - return(OK); - case HSM2_QD: - value->rValue = *(ckt->CKTstate0 + here->HSM2qd); - return(OK); - case HSM2_CQD: - value->rValue = *(ckt->CKTstate0 + here->HSM2cqd); - return(OK); - case HSM2_CGG: - value->rValue = here->HSM2_cggb; - return(OK); - case HSM2_CGD: - value->rValue = here->HSM2_cgdb; - return(OK); - case HSM2_CGS: - value->rValue = here->HSM2_cgsb; - return(OK); - case HSM2_CDG: - value->rValue = here->HSM2_cdgb; - return(OK); - case HSM2_CDD: - value->rValue = here->HSM2_cddb; - return(OK); - case HSM2_CDS: - value->rValue = here->HSM2_cdsb; - return(OK); - case HSM2_CBG: - value->rValue = here->HSM2_cbgb; - return(OK); - case HSM2_CBDB: - value->rValue = here->HSM2_cbdb; - return(OK); - case HSM2_CBSB: - value->rValue = here->HSM2_cbsb; - return(OK); - case HSM2_CGDO: - value->rValue = here->HSM2_cgdo; - return(OK); - case HSM2_CGSO: - value->rValue = here->HSM2_cgso; - return(OK); - case HSM2_CGBO: - value->rValue = here->HSM2_cgbo; - return(OK); - case HSM2_CAPBD: - value->rValue = here->HSM2_capbd; - return(OK); - case HSM2_CAPBS: - value->rValue = here->HSM2_capbs; - return(OK); - case HSM2_VON: - value->rValue = here->HSM2_von; - return(OK); - case HSM2_VDSAT: - value->rValue = here->HSM2_vdsat; - return(OK); - case HSM2_QBS: - value->rValue = *(ckt->CKTstate0 + here->HSM2qbs); - return(OK); - case HSM2_QBD: - value->rValue = *(ckt->CKTstate0 + here->HSM2qbd); - return(OK); - case HSM2_CORBNET: - value->iValue = here->HSM2_corbnet; - return(OK); - case HSM2_RBPB: - value->rValue = here->HSM2_rbpb; - return (OK); - case HSM2_RBPD: - value->rValue = here->HSM2_rbpd; - return(OK); - case HSM2_RBPS: - value->rValue = here->HSM2_rbps; - return(OK); - case HSM2_RBDB: - value->rValue = here->HSM2_rbdb; - return(OK); - case HSM2_RBSB: - value->rValue = here->HSM2_rbsb; - return(OK); - case HSM2_CORG: - value->iValue = here->HSM2_corg; - return(OK); -/* case HSM2_RSHG: */ -/* value->rValue = here->HSM2_rshg; */ -/* return(OK); */ - case HSM2_NGCON: - value->rValue = here->HSM2_ngcon; - return(OK); - case HSM2_XGW: - value->rValue = here->HSM2_xgw; - return(OK); - case HSM2_XGL: - value->rValue = here->HSM2_xgl; - return(OK); - case HSM2_NF: - value->rValue = here->HSM2_nf; - return(OK); - case HSM2_SA: - value->rValue = here->HSM2_sa; - return(OK); - case HSM2_SB: - value->rValue = here->HSM2_sb; - return(OK); - case HSM2_SD: - value->rValue = here->HSM2_sd; - return(OK); - case HSM2_NSUBCDFM: - value->rValue = here->HSM2_nsubcdfm; - return(OK); - case HSM2_MPHDFM: - value->rValue = here->HSM2_mphdfm; - return(OK); - case HSM2_M: - value->rValue = here->HSM2_m; - return(OK); -/* WPE */ - case HSM2_SCA: - value->rValue = here->HSM2_sca; - return(OK); - case HSM2_SCB: - value->rValue = here->HSM2_scb; - return(OK); - case HSM2_SCC: - value->rValue = here->HSM2_scc; - return(OK); - default: - return(E_BADPARM); - } - /* NOTREACHED */ -} diff --git a/src/spicelib/devices/hisim2/hsm2cvtest.c b/src/spicelib/devices/hisim2/hsm2cvtest.c deleted file mode 100644 index af3257ad8..000000000 --- a/src/spicelib/devices/hisim2/hsm2cvtest.c +++ /dev/null @@ -1,172 +0,0 @@ -/*********************************************************************** - - HiSIM (Hiroshima University STARC IGFET Model) - Copyright (C) 2014 Hiroshima University & STARC - - MODEL NAME : HiSIM - ( VERSION : 2 SUBVERSION : 8 REVISION : 0 ) - - FILE : hsm2cvtest.c - - Date : 2014.6.5 - - released by - Hiroshima University & - Semiconductor Technology Academic Research Center (STARC) -***********************************************************************/ - -/********************************************************************** - -The following source code, and all copyrights, trade secrets or other -intellectual property rights in and to the source code in its entirety, -is owned by the Hiroshima University and the STARC organization. - -All users need to follow the "HiSIM2 Distribution Statement and -Copyright Notice" attached to HiSIM2 model. - ------HiSIM2 Distribution Statement and Copyright Notice-------------- - -Software is distributed as is, completely without warranty or service -support. Hiroshima University or STARC and its employees are not liable -for the condition or performance of the software. - -Hiroshima University and STARC own the copyright and grant users a perpetual, -irrevocable, worldwide, non-exclusive, royalty-free license with respect -to the software as set forth below. - -Hiroshima University and STARC hereby disclaim all implied warranties. - -Hiroshima University and STARC grant the users the right to modify, copy, -and redistribute the software and documentation, both within the user's -organization and externally, subject to the following restrictions - -1. The users agree not to charge for Hiroshima University and STARC code -itself but may charge for additions, extensions, or support. - -2. In any product based on the software, the users agree to acknowledge -Hiroshima University and STARC that developed the software. This -acknowledgment shall appear in the product documentation. - -3. The users agree to reproduce any copyright notice which appears on -the software on any copy or modification of such made available -to others." - - -*************************************************************************/ - -#include "ngspice/ngspice.h" -#include "ngspice/cktdefs.h" -#include "hsm2def.h" -#include "ngspice/trandefs.h" -#include "ngspice/const.h" -#include "ngspice/devdefs.h" -#include "ngspice/sperror.h" -#include "ngspice/suffix.h" - -int HSM2convTest( - GENmodel *inModel, - CKTcircuit *ckt) -{ - HSM2model *model = (HSM2model*)inModel; - HSM2instance *here; - double delvbd, delvbs, delvds, delvgd, delvgs, vbd, vbs, vds; - double cd, cdhat, tol0, tol1, tol2, tol3, tol4, vgd, vgdo, vgs; - double Ibtot, cbhat, Igstot, cgshat, Igdtot, cgdhat, Igbtot, cgbhat; - - /* loop through all the HSM2 device models */ - for ( ; model != NULL; model = HSM2nextModel(model)) { - /* loop through all the instances of the model */ - for ( here = HSM2instances(model); here != NULL ; - here = HSM2nextInstance(here)) { - vbs = model->HSM2_type * - (*(ckt->CKTrhsOld+here->HSM2bNode) - - *(ckt->CKTrhsOld+here->HSM2sNodePrime)); - vgs = model->HSM2_type * - (*(ckt->CKTrhsOld+here->HSM2gNode) - - *(ckt->CKTrhsOld+here->HSM2sNodePrime)); - vds = model->HSM2_type * - (*(ckt->CKTrhsOld+here->HSM2dNodePrime) - - *(ckt->CKTrhsOld+here->HSM2sNodePrime)); - vbd = vbs - vds; - vgd = vgs - vds; - vgdo = *(ckt->CKTstate0 + here->HSM2vgs) - - *(ckt->CKTstate0 + here->HSM2vds); - delvbs = vbs - *(ckt->CKTstate0 + here->HSM2vbs); - delvbd = vbd - *(ckt->CKTstate0 + here->HSM2vbd); - delvgs = vgs - *(ckt->CKTstate0 + here->HSM2vgs); - delvds = vds - *(ckt->CKTstate0 + here->HSM2vds); - delvgd = vgd - vgdo; - - cd = here->HSM2_ids - here->HSM2_ibd; - if ( here->HSM2_mode >= 0 ) { - cd += here->HSM2_isub + here->HSM2_igidl; - cdhat = cd - here->HSM2_gbd * delvbd - + (here->HSM2_gmbs + here->HSM2_gbbs + here->HSM2_gigidlbs) * delvbs - + (here->HSM2_gm + here->HSM2_gbgs + here->HSM2_gigidlgs) * delvgs - + (here->HSM2_gds + here->HSM2_gbds + here->HSM2_gigidlds) * delvds; - Ibtot = here->HSM2_ibs + here->HSM2_ibd - here->HSM2_isub - - here->HSM2_igidl - here->HSM2_igisl; - cbhat = Ibtot + here->HSM2_gbd * delvbd - + (here->HSM2_gbs - here->HSM2_gbbs - here->HSM2_gigidlbs) * delvbs - - (here->HSM2_gbgs + here->HSM2_gigidlgs) * delvgs - - (here->HSM2_gbds + here->HSM2_gigidlds) * delvds - - here->HSM2_gigislgd * delvgd - here->HSM2_gigislbd * delvbd - + here->HSM2_gigislsd * delvds; - Igstot = here->HSM2_igs; - cgshat = Igstot + here->HSM2_gigsg * delvgs + - here->HSM2_gigsd * delvds + here->HSM2_gigsb * delvbs; - Igdtot = here->HSM2_igd; - cgdhat = Igdtot + here->HSM2_gigdg * delvgs + - here->HSM2_gigdd * delvds + here->HSM2_gigdb * delvbs; - Igbtot = here->HSM2_igb; - cgbhat = Igbtot + here->HSM2_gigbg * delvgs + - here->HSM2_gigbd * delvds + here->HSM2_gigbb * delvbs; - } - else { - cd -= here->HSM2_igidl; - cdhat = cd - + (here->HSM2_gmbs + here->HSM2_gbd - here->HSM2_gigidlbs) * delvbd - + (here->HSM2_gm - here->HSM2_gigidlgs) * delvgd - + (- here->HSM2_gds + here->HSM2_gigidlds) * delvds; - Ibtot = here->HSM2_ibs + here->HSM2_ibd - here->HSM2_isub - - here->HSM2_igidl - here->HSM2_igisl; - cbhat = Ibtot + here->HSM2_gbs * delvbs - + (here->HSM2_gbd - here->HSM2_gbbs - here->HSM2_gigidlbs) * delvbd - - (here->HSM2_gbgs + here->HSM2_gigidlgs) * delvgd - + (here->HSM2_gbds + here->HSM2_gigidlds) * delvds - - here->HSM2_gigislgd * delvgd - here->HSM2_gigislbd * delvbd - + here->HSM2_gigislsd * delvds; - Igbtot = here->HSM2_igb; - cgbhat = Igbtot + here->HSM2_gigbg * delvgd - - here->HSM2_gigbs * delvds + here->HSM2_gigbb * delvbd; - Igstot = here->HSM2_igs; - cgshat = Igstot + here->HSM2_gigsg * delvgd - - here->HSM2_gigss * delvds + here->HSM2_gigsb * delvbd; - Igdtot = here->HSM2_igd; - cgdhat = Igdtot + here->HSM2_gigdg * delvgd - - here->HSM2_gigds * delvds + here->HSM2_gigdb * delvbd; - } - - /* - * check convergence - */ - if ( here->HSM2_off == 0 || !(ckt->CKTmode & MODEINITFIX) ) { - tol0 = ckt->CKTreltol * MAX(fabs(cdhat), fabs(cd)) + ckt->CKTabstol; - tol1 = ckt->CKTreltol * MAX(fabs(cgshat), fabs(Igstot)) + ckt->CKTabstol; - tol2 = ckt->CKTreltol * MAX(fabs(cgdhat), fabs(Igdtot)) + ckt->CKTabstol; - tol3 = ckt->CKTreltol * MAX(fabs(cgbhat), fabs(Igbtot)) + ckt->CKTabstol; - tol4 = ckt->CKTreltol * MAX(fabs(cbhat), fabs(Ibtot)) + ckt->CKTabstol; - - if ( (fabs(cdhat - cd) >= tol0) - || (fabs(cgshat - Igstot) >= tol1) - || (fabs(cgdhat - Igdtot) >= tol2) - || (fabs(cgbhat - Igbtot) >= tol3) - || (fabs(cbhat - Ibtot) >= tol4) ) { - ckt->CKTnoncon++; - return(OK); - } - } - } - } - return(OK); -} diff --git a/src/spicelib/devices/hisim2/hsm2def.h b/src/spicelib/devices/hisim2/hsm2def.h deleted file mode 100644 index 1ffe6f8b1..000000000 --- a/src/spicelib/devices/hisim2/hsm2def.h +++ /dev/null @@ -1,2555 +0,0 @@ -/*********************************************************************** - - HiSIM (Hiroshima University STARC IGFET Model) - Copyright (C) 2014 Hiroshima University & STARC - - MODEL NAME : HiSIM - ( VERSION : 2 SUBVERSION : 8 REVISION : 0 ) - - FILE : hsm2def.h - - Date : 2014.6.5 - - released by - Hiroshima University & - Semiconductor Technology Academic Research Center (STARC) -***********************************************************************/ - -#ifndef HSM2 -#define HSM2 - -#include "ngspice/ifsim.h" -#include "ngspice/gendefs.h" -#include "ngspice/cktdefs.h" -#include "ngspice/complex.h" -#include "ngspice/noisedef.h" - -/* declarations for HiSIM2 MOSFETs */ - -/* unit-converted model parameters */ -typedef struct sHSM2modelMKSParam { - double HSM2_npext ; - double HSM2_nsubcwpe ; - double HSM2_nsubpwpe ; - double HSM2_npextwpe ; - double HSM2_ll ; - double HSM2_wl ; - double HSM2_svgsl ; - double HSM2_svgsw ; - double HSM2_svbsl ; - double HSM2_slgl ; - double HSM2_sub1l ; - double HSM2_slg ; - double HSM2_sub2l ; - double HSM2_nsubcmax ; - double HSM2_glksd3 ; - double HSM2_gleak2 ; - double HSM2_gleak4 ; - double HSM2_gleak5 ; - double HSM2_gleak7 ; - double HSM2_cit ; - double HSM2_ovslp ; - double HSM2_dly3 ; - double HSM2_ndepm ; -} HSM2modelMKSParam ; - -/* binning parameters */ -typedef struct sHSM2binningParam { - double HSM2_vmax ; - double HSM2_bgtmp1 ; - double HSM2_bgtmp2 ; - double HSM2_eg0 ; - double HSM2_lover ; - double HSM2_vfbover ; - double HSM2_nover ; - double HSM2_wl2 ; - double HSM2_vfbc ; - double HSM2_nsubc ; - double HSM2_nsubp ; - double HSM2_scp1 ; - double HSM2_scp2 ; - double HSM2_scp3 ; - double HSM2_sc1 ; - double HSM2_sc2 ; - double HSM2_sc3 ; - double HSM2_sc4 ; - double HSM2_pgd1 ; -//double HSM2_pgd3 ; - double HSM2_ndep ; - double HSM2_ninv ; - double HSM2_muecb0 ; - double HSM2_muecb1 ; - double HSM2_mueph1 ; - double HSM2_vtmp ; - double HSM2_wvth0 ; - double HSM2_muesr1 ; - double HSM2_muetmp ; - double HSM2_sub1 ; - double HSM2_sub2 ; - double HSM2_svds ; - double HSM2_svbs ; - double HSM2_svgs ; - double HSM2_nsti ; - double HSM2_wsti ; - double HSM2_scsti1 ; - double HSM2_scsti2 ; - double HSM2_vthsti ; - double HSM2_muesti1 ; - double HSM2_muesti2 ; - double HSM2_muesti3 ; - double HSM2_nsubpsti1 ; - double HSM2_nsubpsti2 ; - double HSM2_nsubpsti3 ; - double HSM2_nsubcsti1; - double HSM2_nsubcsti2; - double HSM2_nsubcsti3; - double HSM2_cgso ; - double HSM2_cgdo ; - double HSM2_js0 ; - double HSM2_js0sw ; - double HSM2_nj ; - double HSM2_cisbk ; - double HSM2_clm1 ; - double HSM2_clm2 ; - double HSM2_clm3 ; - double HSM2_wfc ; - double HSM2_gidl1 ; - double HSM2_gidl2 ; - double HSM2_gleak1 ; - double HSM2_gleak2 ; - double HSM2_gleak3 ; - double HSM2_gleak6 ; - double HSM2_glksd1 ; - double HSM2_glksd2 ; - double HSM2_glkb1 ; - double HSM2_glkb2 ; - double HSM2_nftrp ; - double HSM2_nfalp ; - double HSM2_vdiffj ; - double HSM2_ibpc1 ; - double HSM2_ibpc2 ; -} HSM2binningParam ; - -/* unit-converted parameters for each instance */ -typedef struct sHSM2hereMKSParam { - double HSM2_nsubcdfm ; -} HSM2hereMKSParam ; - -/* information needed for each instance */ -typedef struct sHSM2instance { - - struct GENinstance gen; - -#define HSM2modPtr(inst) ((struct sHSM2model *)((inst)->gen.GENmodPtr)) -#define HSM2nextInstance(inst) ((struct sHSM2instance *)((inst)->gen.GENnextInstance)) -#define HSM2name gen.GENname -#define HSM2states gen.GENstate - - const int HSM2dNode; /* number of the drain node of the mosfet */ - const int HSM2gNode; /* number of the gate node of the mosfet */ - const int HSM2sNode; /* number of the source node of the mosfet */ - const int HSM2bNode; /* number of the bulk node of the mosfet */ - int HSM2dNodePrime; /* number od the inner drain node */ - int HSM2gNodePrime; /* number of the inner gate node */ - int HSM2sNodePrime; /* number od the inner source node */ - int HSM2bNodePrime; - int HSM2dbNode; - int HSM2sbNode; - - double HSM2_noiflick; /* for 1/f noise calc. */ - double HSM2_noithrml; /* for thermal noise calc. */ - double HSM2_noiigate; /* for induced gate noise */ - double HSM2_noicross; /* for induced gate noise */ - double HSM2_Qdrat; /* for induced gate noise */ - - /* instance */ - double HSM2_l; /* the length of the channel region */ - double HSM2_w; /* the width of the channel region */ - double HSM2_ad; /* the area of the drain diffusion */ - double HSM2_as; /* the area of the source diffusion */ - double HSM2_pd; /* perimeter of drain junction [m] */ - double HSM2_ps; /* perimeter of source junction [m] */ - double HSM2_nrd; /* equivalent num of squares of drain [-] (unused) */ - double HSM2_nrs; /* equivalent num of squares of source [-] (unused) */ - double HSM2_temp; /* lattice temperature [C] */ - double HSM2_dtemp; - - double HSM2_weff; /* the effective width of the channel region */ - double HSM2_weff_nf; /* Weff * NF */ - double HSM2_leff; /* the effective length of the channel region */ - - int HSM2_corbnet ; - double HSM2_rbpb ; - double HSM2_rbpd ; - double HSM2_rbps ; - double HSM2_rbdb ; - double HSM2_rbsb ; - - int HSM2_corg ; -/* double HSM2_rshg; */ - double HSM2_ngcon; - double HSM2_xgw; - double HSM2_xgl; - double HSM2_nf; - - double HSM2_sa; - double HSM2_sb; - double HSM2_sd; - double HSM2_nsubcdfm; /* DFM */ - double HSM2_mphdfm; /* DFM */ - double HSM2_m; - -/* WPE */ - double HSM2_sca; /* scc */ - double HSM2_scb; /* scb */ - double HSM2_scc; /* scc */ - - int HSM2_called; /* flag to check the first call */ - /* previous values to evaluate initial guess */ - double HSM2_mode_prv; - double HSM2_vbsc_prv; - double HSM2_vdsc_prv; - double HSM2_vgsc_prv; - double HSM2_ps0_prv; - double HSM2_ps0_dvbs_prv; - double HSM2_ps0_dvds_prv; - double HSM2_ps0_dvgs_prv; - double HSM2_pds_prv; - double HSM2_pds_dvbs_prv; - double HSM2_pds_dvds_prv; - double HSM2_pds_dvgs_prv; - double HSM2_ids_prv; - double HSM2_ids_dvbs_prv; - double HSM2_ids_dvds_prv; - double HSM2_ids_dvgs_prv; - double HSM2_mode_prv2; - double HSM2_vbsc_prv2; - double HSM2_vdsc_prv2; - double HSM2_vgsc_prv2; - double HSM2_ps0_prv2; - double HSM2_ps0_dvbs_prv2; - double HSM2_ps0_dvds_prv2; - double HSM2_ps0_dvgs_prv2; - double HSM2_pds_prv2; - double HSM2_pds_dvbs_prv2; - double HSM2_pds_dvds_prv2; - double HSM2_pds_dvgs_prv2; - double HSM2_PS0Z_SCE_prv ; - double HSM2_PS0Z_SCE_dvds_prv ; - double HSM2_PS0Z_SCE_dvgs_prv ; - double HSM2_PS0Z_SCE_dvbs_prv ; - - /* output */ - int HSM2_capop; - double HSM2_gd; - double HSM2_gs; - double HSM2_cgso; - double HSM2_cgdo; - double HSM2_cgbo; - double HSM2_cdso; - double HSM2_cddo; - double HSM2_cdgo; - double HSM2_csso; - double HSM2_csdo; - double HSM2_csgo; - double HSM2_cqyd; - double HSM2_cqyg; - double HSM2_cqyb; - double HSM2_von; /* vth */ - double HSM2_vdsat; - double HSM2_ids; /* cdrain, HSM2_cd */ - double HSM2_gds; - double HSM2_gm; - double HSM2_gmbs; - double HSM2_ibs; /* HSM2_cbs */ - double HSM2_ibd; /* HSM2_cbd */ - double HSM2_gbs; - double HSM2_gbd; - double HSM2_capbs; - double HSM2_capbd; - double HSM2_capgs; - double HSM2_capgd; - double HSM2_capgb; - double HSM2_isub; /* HSM2_csub */ - double HSM2_gbgs; - double HSM2_gbds; - double HSM2_gbbs; - double HSM2_qg; - double HSM2_qd; - double HSM2_qs; - double HSM2_qb; /* bulk charge qb = -(qg + qd + qs) */ - double HSM2_cggb; - double HSM2_cgdb; - double HSM2_cgsb; - double HSM2_cbgb; - double HSM2_cbdb; - double HSM2_cbsb; - double HSM2_cdgb; - double HSM2_cddb; - double HSM2_cdsb; - - double HSM2_mu; /* mobility */ - double HSM2_igidl; /* gate induced drain leakage */ - double HSM2_gigidlgs; - double HSM2_gigidlds; - double HSM2_gigidlbs; - double HSM2_igisl; /* gate induced source leakage */ - double HSM2_gigislgd; - double HSM2_gigislsd; - double HSM2_gigislbd; - double HSM2_igb; /* gate tunneling current (gate to bulk) */ - double HSM2_gigbg; - double HSM2_gigbd; - double HSM2_gigbb; - double HSM2_gigbs; - double HSM2_igs; /* gate tunneling current (gate to source) */ - double HSM2_gigsg; - double HSM2_gigsd; - double HSM2_gigsb; - double HSM2_gigss; - double HSM2_igd; /* gate tunneling current (gate to drain) */ - double HSM2_gigdg; - double HSM2_gigdd; - double HSM2_gigdb; - double HSM2_gigds; - - /* NQS */ - double HSM2_tau ; - double HSM2_tau_dVgs ; - double HSM2_tau_dVds ; - double HSM2_tau_dVbs ; - double HSM2_Xd ; - double HSM2_Xd_dVgs ; - double HSM2_Xd_dVds ; - double HSM2_Xd_dVbs ; - double HSM2_Qi ; - double HSM2_Qi_dVgs ; - double HSM2_Qi_dVds ; - double HSM2_Qi_dVbs ; - double HSM2_taub ; - double HSM2_taub_dVgs ; - double HSM2_taub_dVds ; - double HSM2_taub_dVbs ; - double HSM2_Qb ; - double HSM2_Qb_dVgs ; - double HSM2_Qb_dVds ; - double HSM2_Qb_dVbs ; - - /* internal variables */ - double HSM2_depleak ; - double HSM2_depvmax ; - double HSM2_depmphn0 ; - double HSM2_depmphn1 ; - double HSM2_depmue0 ; - double HSM2_depmue1 ; - double HSM2_depmueback0 ; - double HSM2_depmueback1 ; - double HSM2_depvdsef1 ; - double HSM2_depvdsef2 ; - double HSM2_eg ; - double HSM2_beta ; - double HSM2_beta_inv ; - double HSM2_beta2 ; - double HSM2_betatnom ; - double HSM2_nin ; - double HSM2_egp12 ; - double HSM2_egp32 ; - double HSM2_lgate ; - double HSM2_wgate ; - double HSM2_lg ; - double HSM2_wg ; - double HSM2_mueph ; - double HSM2_mphn0 ; - double HSM2_mphn1 ; - double HSM2_muesr ; - double HSM2_nsub ; - double HSM2_qnsub ; - double HSM2_qnsub_esi ; - double HSM2_2qnsub_esi ; - double HSM2_ptovr0 ; - double HSM2_ptovr ; - double HSM2_vmax0 ; - double HSM2_vmax ; - double HSM2_pb2 ; - double HSM2_pb20 ; - double HSM2_pb2c ; - double HSM2_cnst0 ; - double HSM2_cnst1 ; - double HSM2_isbd ; - double HSM2_isbd2 ; - double HSM2_isbs ; - double HSM2_isbs2 ; - double HSM2_vbdt ; - double HSM2_vbst ; - double HSM2_exptemp ; - double HSM2_wsti ; - double HSM2_cnstpgd ; - double HSM2_ninvp0 ; - double HSM2_ninv0 ; - double HSM2_grbpb ; - double HSM2_grbpd ; - double HSM2_grbps ; - double HSM2_grbdb ; - double HSM2_grbsb ; - double HSM2_grg ; - double HSM2_rs ; - double HSM2_rd ; - double HSM2_clmmod ; - double HSM2_lgatesm ; - double HSM2_dVthsm ; - double HSM2_ddlt ; - /* 2007.02.20--03.15 */ - double HSM2_xsub1 ; - double HSM2_xsub2 ; - double HSM2_xgate ; - double HSM2_xvbs ; - double HSM2_vg2const ; - double HSM2_wdpl ; - double HSM2_wdplp ; - double HSM2_cfrng ; - double HSM2_jd_nvtm_inv ; - double HSM2_jd_expcd ; - double HSM2_jd_expcs ; - double HSM2_sqrt_eg ; - - double HSM2_egtnom ; - double HSM2_cecox ; - double HSM2_msc ; - int HSM2_flg_pgd ; - double HSM2_ndep_o_esi ; - double HSM2_ninv_o_esi ; - double HSM2_ninvd ; - double HSM2_cqyb0 ; - double HSM2_cnst0over ; - double HSM2_costi00 ; - double HSM2_nsti_p2 ; - double HSM2_costi0 ; - double HSM2_costi0_p2 ; - double HSM2_costi1 ; - double HSM2_pb2over ; /* for Qover model */ -//double HSM2_ps0ldinib ; - double HSM2_ptl0; - double HSM2_pt40; - double HSM2_gdl0; - double HSM2_muecb0; - double HSM2_muecb1; - double HSM2_ktemp; /* lattice temperature [K] */ - double HSM2_mueph1 ; - double HSM2_nsubp ; - double HSM2_nsubc ; - /* Depletion Mode MOSFET */ - double HSM2_ndepm ; - double HSM2_Pb2n ; - double HSM2_Vbipn ; - - HSM2hereMKSParam hereMKS ; /* unit-converted parameters */ - HSM2binningParam pParam ; /* binning parameters */ - - /* no use in SPICE3f5 - double HSM2drainSquares; the length of the drain in squares - double HSM2sourceSquares; the length of the source in squares */ - double HSM2sourceConductance; /* cond. of source (or 0): set in setup */ - double HSM2drainConductance; /* cond. of drain (or 0): set in setup */ - double HSM2internalGs; /* internal cond. of source for thermal noise calc. */ - double HSM2internalGd; /* internal cond. of drain for thermal noise calc. */ - - double HSM2_icVBS; /* initial condition B-S voltage */ - double HSM2_icVDS; /* initial condition D-S voltage */ - double HSM2_icVGS; /* initial condition G-S voltage */ - int HSM2_off; /* non-zero to indicate device is off for dc analysis */ - int HSM2_mode; /* device mode : 1 = normal, -1 = inverse */ - - unsigned HSM2_l_Given :1; - unsigned HSM2_w_Given :1; - unsigned HSM2_ad_Given :1; - unsigned HSM2_as_Given :1; - /* unsigned HSM2drainSquaresGiven :1; - unsigned HSM2sourceSquaresGiven :1;*/ - unsigned HSM2_pd_Given :1; - unsigned HSM2_ps_Given :1; - unsigned HSM2_nrd_Given :1; - unsigned HSM2_nrs_Given :1; - unsigned HSM2_temp_Given :1; - unsigned HSM2_dtemp_Given :1; - unsigned HSM2_icVBS_Given :1; - unsigned HSM2_icVDS_Given :1; - unsigned HSM2_icVGS_Given :1; - unsigned HSM2_corbnet_Given :1; - unsigned HSM2_rbpb_Given :1; - unsigned HSM2_rbpd_Given :1; - unsigned HSM2_rbps_Given :1; - unsigned HSM2_rbdb_Given :1; - unsigned HSM2_rbsb_Given :1; - unsigned HSM2_corg_Given :1; -/* unsigned HSM2_rshg_Given :1; */ - unsigned HSM2_ngcon_Given :1; - unsigned HSM2_xgw_Given :1; - unsigned HSM2_xgl_Given :1; - unsigned HSM2_nf_Given :1; - unsigned HSM2_sa_Given :1; - unsigned HSM2_sb_Given :1; - unsigned HSM2_sd_Given :1; - unsigned HSM2_nsubcdfm_Given :1; /* DFM */ - unsigned HSM2_mphdfm_Given :1; /* DFM */ - unsigned HSM2_m_Given :1; - - /* WPE */ - unsigned HSM2_sca_Given :1; /* sca */ - unsigned HSM2_scb_Given :1; /* scb */ - unsigned HSM2_scc_Given :1; /* scc */ - /* pointer to sparse matrix */ - - double *HSM2GgPtr; /* pointer to sparse matrix element at (gate node,gate node) */ - double *HSM2GgpPtr; /* pointer to sparse matrix element at (gate node,gate prime node) */ - double *HSM2GdpPtr; /* pointer to sparse matrix element at (gate node,drain prime node) */ - double *HSM2GspPtr; /* pointer to sparse matrix element at (gate node,source prime node) */ - double *HSM2GbpPtr; /* pointer to sparse matrix element at (gate node,bulk prime node) */ - - double *HSM2GPgPtr; /* pointer to sparse matrix element at (gate prime node,gate node) */ - double *HSM2GPgpPtr; /* pointer to sparse matrix element at (gate prime node,gate prime node) */ - double *HSM2GPdpPtr; /* pointer to sparse matrix element at (gate prime node,drain prime node) */ - double *HSM2GPspPtr; /* pointer to sparse matrix element at (gate prime node,source prime node) */ - double *HSM2GPbpPtr; /* pointer to sparse matrix element at (gate prime node,bulk prime node) */ - - double *HSM2DPdPtr; /* pointer to sparse matrix element at (drain prime node,drain node) */ - double *HSM2DPdpPtr; /* pointer to sparse matrix element at (drain prime node,drain prime node) */ - double *HSM2DPgpPtr; /* pointer to sparse matrix element at (drain prime node,gate prime node) */ - double *HSM2DPspPtr; /* pointer to sparse matrix element at (drain prime node,source prime node) */ - double *HSM2DPbpPtr; /* pointer to sparse matrix element at (drain prime node,bulk prime node) */ - double *HSM2DPdbPtr; /* pointer to sparse matrix element at (drain prime node,drain body node) */ - - double *HSM2DdPtr; /* pointer to sparse matrix element at (Drain node,drain node) */ - double *HSM2DdpPtr; /* pointer to sparse matrix element at (drain node,drain prime node) */ - - double *HSM2SPsPtr; /* pointer to sparse matrix element at (source prime node,source node) */ - double *HSM2SPspPtr; /* pointer to sparse matrix element at (source prime node,source prime node) */ - double *HSM2SPgpPtr; /* pointer to sparse matrix element at (source prime node,gate prime node) */ - double *HSM2SPdpPtr; /* pointer to sparse matrix element at (source prime node,drain prime node) */ - double *HSM2SPbpPtr; /* pointer to sparse matrix element at (source prime node,bulk prime node) */ - double *HSM2SPsbPtr; /* pointer to sparse matrix element at (source prime node,source body node) */ - - double *HSM2SsPtr; /* pointer to sparse matrix element at (source node,source node) */ - double *HSM2SspPtr; /* pointer to sparse matrix element at (source node,source prime node) */ - - double *HSM2BPgpPtr; /* pointer to sparse matrix element at (bulk prime node,gate prime node) */ - double *HSM2BPbpPtr; /* pointer to sparse matrix element at (bulk prime node,bulk prime node) */ - double *HSM2BPdpPtr; /* pointer to sparse matrix element at (bulk prime node,drain prime node) */ - double *HSM2BPspPtr; /* pointer to sparse matrix element at (bulk prime node,source prime node) */ - double *HSM2BPbPtr; /* pointer to sparse matrix element at (bulk prime node,bulk node) */ - double *HSM2BPdbPtr; /* pointer to sparse matrix element at (bulk prime node,source body node) */ - double *HSM2BPsbPtr; /* pointer to sparse matrix element at (bulk prime node,source body node) */ - - double *HSM2DBdpPtr; /* pointer to sparse matrix element at (drain body node,drain prime node) */ - double *HSM2DBdbPtr; /* pointer to sparse matrix element at (drain body node,drain body node) */ - double *HSM2DBbpPtr; /* pointer to sparse matrix element at (drain body node,bulk prime node) */ - double *HSM2DBbPtr; /* pointer to sparse matrix element at (drain body node,bulk node) */ - - double *HSM2SBspPtr; /* pointer to sparse matrix element at (source body node,drain prime node) */ - double *HSM2SBbpPtr; /* pointer to sparse matrix element at (source body node,drain body node) */ - double *HSM2SBbPtr; /* pointer to sparse matrix element at (source body node,bulk prime node) */ - double *HSM2SBsbPtr; /* pointer to sparse matrix element at (source body node,bulk node) */ - - double *HSM2BsbPtr; /* pointer to sparse matrix element at (bulk node,source body node) */ - double *HSM2BbpPtr; /* pointer to sparse matrix element at (bulk node,bulk prime node) */ - double *HSM2BdbPtr; /* pointer to sparse matrix element at (bulk node,drain body node) */ - double *HSM2BbPtr; /* pointer to sparse matrix element at (bulk node,bulk node) */ - -#ifdef USE_OMP - /* per instance storage of results, to update matrix and rhs at a later stage */ - double HSM2rhsdPrime; - double HSM2rhsgPrime; - double HSM2rhsbPrime; - double HSM2rhssPrime; - double HSM2rhsdb; - double HSM2rhssb; - - double HSM2_1; - double HSM2_2; - double HSM2_3; - double HSM2_4; - double HSM2_5; - double HSM2_6; - double HSM2_7; - double HSM2_8; - double HSM2_9; - double HSM2_10; - double HSM2_11; - double HSM2_12; - double HSM2_13; - double HSM2_14; - double HSM2_15; - double HSM2_16; - double HSM2_17; - double HSM2_18; - double HSM2_19; - double HSM2_20; - double HSM2_21; - double HSM2_22; - double HSM2_23; - double HSM2_24; - double HSM2_25; - double HSM2_26; - double HSM2_27; - double HSM2_28; - double HSM2_29; - double HSM2_30; - double HSM2_31; - double HSM2_32; - double HSM2_33; - double HSM2_34; - double HSM2_35; - double HSM2_36; - double HSM2_37; - double HSM2_38; - double HSM2_39; - double HSM2_40; - double HSM2_41; - double HSM2_42; - double HSM2_43; - double HSM2_44; - double HSM2_45; - double HSM2_46; - double HSM2_47; - double HSM2_48; - double HSM2_49; - double HSM2_50; - double HSM2_51; - double HSM2_52; - double HSM2_53; - double HSM2_54; - double HSM2_55; - double HSM2_56; - double HSM2_57; - double HSM2_58; - double HSM2_59; - double HSM2_60; - double HSM2_61; - double HSM2_62; - double HSM2_63; -#endif - - /* common state values in hisim module */ -#define HSM2vbd HSM2states+ 0 -#define HSM2vbs HSM2states+ 1 -#define HSM2vgs HSM2states+ 2 -#define HSM2vds HSM2states+ 3 -#define HSM2vdbs HSM2states+ 4 -#define HSM2vdbd HSM2states+ 5 -#define HSM2vsbs HSM2states+ 6 -#define HSM2vges HSM2states+ 7 - -#define HSM2qb HSM2states+ 8 -#define HSM2cqb HSM2states+ 9 -#define HSM2qg HSM2states+ 10 -#define HSM2cqg HSM2states+ 11 -#define HSM2qd HSM2states+ 12 -#define HSM2cqd HSM2states+ 13 - -#define HSM2qbs HSM2states+ 14 -#define HSM2cqbs HSM2states+ 15 -#define HSM2qbd HSM2states+ 16 -#define HSM2cqbd HSM2states+ 17 - -#define HSM2numStates 18 - -/* nqs charges */ -#define HSM2qi_nqs HSM2states+ 19 -#define HSM2qb_nqs HSM2states+ 20 - -#define HSM2numStatesNqs 21 - - /* indices to the array of HiSIM2 NOISE SOURCES (the same as BSIM3) */ -#define HSM2RDNOIZ 0 -#define HSM2RSNOIZ 1 -#define HSM2IDNOIZ 2 -#define HSM2FLNOIZ 3 -#define HSM2IGSNOIZ 4 /* shot noise */ -#define HSM2IGDNOIZ 5 /* shot noise */ -#define HSM2IGBNOIZ 6 /* shot noise */ -#define HSM2IGNOIZ 7 /* induced gate noise */ -#define HSM2TOTNOIZ 8 - -#define HSM2NSRCS 9 /* the number of HiSIM2 MOSFET noise sources */ - -#ifndef NONOISE - double HSM2nVar[NSTATVARS][HSM2NSRCS]; -#else /* NONOISE */ - double **HSM2nVar; -#endif /* NONOISE */ - -} HSM2instance ; - - -/* per model data */ - -typedef struct sHSM2model { /* model structure for a resistor */ - - struct GENmodel gen; - -#define HSM2modType gen.GENmodType -#define HSM2nextModel(inst) ((struct sHSM2model *)((inst)->gen.GENnextModel)) -#define HSM2instances(inst) ((HSM2instance *)((inst)->gen.GENinstances)) -#define HSM2modName gen.GENmodName - - int HSM2_type; /* device type: 1 = nmos, -1 = pmos */ - int HSM2_level; /* level */ - int HSM2_info; /* information */ - int HSM2_noise; /* noise model selecter see hsm2noi.c */ - int HSM2_version; /* model version 2.80 */ - int HSM2_show; /* show physical value 1, 2, ... , 11 */ - - /* flags for initial guess */ - int HSM2_corsrd ; - int HSM2_corg ; - int HSM2_coiprv ; - int HSM2_copprv ; - int HSM2_coadov ; - int HSM2_coisub ; - int HSM2_coiigs ; - int HSM2_cogidl ; - int HSM2_coovlp ; - int HSM2_coflick ; - int HSM2_coisti ; - int HSM2_conqs ; /* HiSIM2 */ - int HSM2_corbnet ; - int HSM2_cothrml; - int HSM2_coign; /* induced gate noise */ - int HSM2_codfm; /* DFM */ - int HSM2_corecip; - int HSM2_coqy; - int HSM2_coqovsm ; - int HSM2_coerrrep; - int HSM2_codep; - int HSM2_coddlt; /* add in version 2.80 */ - - /* HiSIM original */ - double HSM2_vmax ; - double HSM2_bgtmp1 ; - double HSM2_bgtmp2 ; - double HSM2_eg0 ; - double HSM2_tox ; - double HSM2_xld ; - double HSM2_lover ; - double HSM2_ddltmax ; /* Vdseff */ - double HSM2_ddltslp ; /* Vdseff */ - double HSM2_ddltict ; /* Vdseff */ - double HSM2_vfbover ; - double HSM2_nover ; - double HSM2_xwd ; - double HSM2_xl ; - double HSM2_xw ; - double HSM2_saref ; - double HSM2_sbref ; - double HSM2_ll ; - double HSM2_lld ; - double HSM2_lln ; - double HSM2_wl ; - double HSM2_wl1 ; - double HSM2_wl1p ; - double HSM2_wl2 ; - double HSM2_wl2p ; - double HSM2_wld ; - double HSM2_wln ; - double HSM2_xqy ; - double HSM2_xqy1 ; - double HSM2_xqy2 ; - double HSM2_qyrat ; - double HSM2_rs; /* source contact resistance */ - double HSM2_rd; /* drain contact resistance */ - double HSM2_rsh; /* source/drain diffusion sheet resistance */ - double HSM2_rshg; -/* double HSM2_ngcon; */ -/* double HSM2_xgw; */ -/* double HSM2_xgl; */ -/* double HSM2_nf; */ - double HSM2_vfbc ; - double HSM2_vbi ; - double HSM2_vfbcl; - double HSM2_vfbclp; - double HSM2_nsubc ; - double HSM2_parl2 ; - double HSM2_lp ; - double HSM2_nsubp ; - double HSM2_nsubpl ; - double HSM2_nsubpdlt; - double HSM2_nsubpfac ; - double HSM2_nsubpw ; - double HSM2_nsubpwp ; - double HSM2_scp1 ; - double HSM2_scp2 ; - double HSM2_scp3 ; - double HSM2_sc1 ; - double HSM2_sc2 ; - double HSM2_sc3 ; - double HSM2_sc4 ; - double HSM2_pgd1 ; - double HSM2_pgd2 ; -//double HSM2_pgd3 ; - double HSM2_pgd4 ; - double HSM2_ndep ; - double HSM2_ndepl ; - double HSM2_ndeplp ; - double HSM2_ndepw ; - double HSM2_ndepwp ; - double HSM2_ninv ; - double HSM2_ninvd ; - double HSM2_ninvdl ; - double HSM2_ninvdlp ; - double HSM2_muecb0 ; - double HSM2_muecb1 ; - double HSM2_mueph1 ; - double HSM2_mueph0 ; - double HSM2_muephw ; - double HSM2_muepwp ; - double HSM2_muepwd ; - double HSM2_muephl ; - double HSM2_mueplp ; - double HSM2_muepld ; - double HSM2_muephs ; - double HSM2_muepsp ; - double HSM2_vtmp ; - double HSM2_wvth0 ; - double HSM2_muesr1 ; - double HSM2_muesr0 ; - double HSM2_muesrw ; - double HSM2_mueswp ; - double HSM2_muesrl ; - double HSM2_mueslp ; - double HSM2_bb ; - double HSM2_sub1 ; - double HSM2_sub2 ; - double HSM2_svgs ; - double HSM2_svbs ; - double HSM2_svbsl ; - double HSM2_svds ; - double HSM2_slg ; - double HSM2_sub1l ; - double HSM2_sub2l ; - double HSM2_svgsl ; - double HSM2_svgslp ; - double HSM2_svgswp ; - double HSM2_svgsw ; - double HSM2_svbslp ; - double HSM2_slgl ; - double HSM2_slglp ; - double HSM2_sub1lp ; - double HSM2_nsti ; - double HSM2_wsti ; - double HSM2_wstil ; - double HSM2_wstilp ; - double HSM2_wstiw ; - double HSM2_wstiwp ; - double HSM2_scsti1 ; - double HSM2_scsti2 ; - double HSM2_vthsti ; - double HSM2_vdsti ; - double HSM2_muesti1 ; - double HSM2_muesti2 ; - double HSM2_muesti3 ; - double HSM2_nsubpsti1 ; - double HSM2_nsubpsti2 ; - double HSM2_nsubcsti1; - double HSM2_nsubcsti2; - double HSM2_nsubcsti3; - double HSM2_nsubpsti3 ; - double HSM2_lpext ; - double HSM2_npext ; - double HSM2_npextw ; - double HSM2_npextwp ; - double HSM2_scp22 ; - double HSM2_scp21 ; - double HSM2_bs1 ; - double HSM2_bs2 ; - double HSM2_cgso ; - double HSM2_cgdo ; - double HSM2_cgbo ; - double HSM2_tpoly ; - double HSM2_js0 ; - double HSM2_js0sw ; - double HSM2_nj ; - double HSM2_njsw ; - double HSM2_xti ; - double HSM2_cj ; - double HSM2_cjsw ; - double HSM2_cjswg ; - double HSM2_mj ; - double HSM2_mjsw ; - double HSM2_mjswg ; - double HSM2_xti2 ; - double HSM2_cisb ; - double HSM2_cvb ; - double HSM2_ctemp ; - double HSM2_cisbk ; - double HSM2_cvbk ; - double HSM2_divx ; - double HSM2_pb ; - double HSM2_pbsw ; - double HSM2_pbswg ; - double HSM2_tcjbd ; - double HSM2_tcjbs ; - double HSM2_tcjbdsw ; - double HSM2_tcjbssw ; - double HSM2_tcjbdswg ; - double HSM2_tcjbsswg ; - - double HSM2_clm1 ; - double HSM2_clm2 ; - double HSM2_clm3 ; - double HSM2_clm5 ; - double HSM2_clm6 ; - double HSM2_muetmp ; - double HSM2_vover ; - double HSM2_voverp ; - double HSM2_vovers ; - double HSM2_voversp ; - double HSM2_wfc ; - double HSM2_nsubcw ; - double HSM2_nsubcwp ; - double HSM2_nsubcmax ; - double HSM2_qme1 ; - double HSM2_qme2 ; - double HSM2_qme3 ; - double HSM2_gidl1 ; - double HSM2_gidl2 ; - double HSM2_gidl3 ; - double HSM2_gidl4 ; - double HSM2_gidl6; - double HSM2_gidl7; - double HSM2_gidl5 ; - double HSM2_gleak1 ; - double HSM2_gleak2 ; - double HSM2_gleak3 ; - double HSM2_gleak4 ; - double HSM2_gleak5 ; - double HSM2_gleak6 ; - double HSM2_gleak7 ; - double HSM2_glksd1 ; - double HSM2_glksd2 ; - double HSM2_glksd3 ; - double HSM2_glkb1 ; - double HSM2_glkb2 ; - double HSM2_glkb3 ; - double HSM2_egig; - double HSM2_igtemp2; - double HSM2_igtemp3; - double HSM2_vzadd0 ; - double HSM2_pzadd0 ; - double HSM2_nftrp ; - double HSM2_nfalp ; - double HSM2_falph ; - double HSM2_cit ; - double HSM2_kappa ; - double HSM2_vdiffj ; - double HSM2_dly1 ; - double HSM2_dly2 ; - double HSM2_dly3; - double HSM2_tnom ; - double HSM2_ovslp ; - double HSM2_ovmag ; - /* substrate resistances */ - double HSM2_gbmin; - double HSM2_rbpb ; - double HSM2_rbpd ; - double HSM2_rbps ; - double HSM2_rbdb ; - double HSM2_rbsb ; - /* IBPC */ - double HSM2_ibpc1 ; - double HSM2_ibpc2 ; - /* DFM */ - double HSM2_mphdfm ; - - double HSM2_ptl, HSM2_ptp, HSM2_pt2, HSM2_ptlp, HSM2_gdl, HSM2_gdlp ; - - double HSM2_gdld ; - double HSM2_pt4 ; - double HSM2_pt4p ; - double HSM2_muephl2 ; - double HSM2_mueplp2 ; - double HSM2_nsubcw2 ; - double HSM2_nsubcwp2 ; - double HSM2_muephw2 ; - double HSM2_muepwp2 ; - - /* variables for WPE */ - double HSM2_web ; - double HSM2_wec ; - double HSM2_nsubcwpe ; - double HSM2_npextwpe ; - double HSM2_nsubpwpe ; - /* for Ps0_min */ - double HSM2_Vgsmin ; - double HSM2_sc3Vbs ; /* SC3 clamping */ - double HSM2_byptol ; /* bypass control */ - double HSM2_muecb0lp; - double HSM2_muecb1lp; - - /* Depletion Mode MOSFET */ - double HSM2_ndepm ; - double HSM2_ndepml ; - double HSM2_ndepmlp ; - double HSM2_tndep ; - double HSM2_depleak ; - double HSM2_depleakl ; - double HSM2_depleaklp ; - double HSM2_depmue0; - double HSM2_depmue0l; - double HSM2_depmue0lp; - double HSM2_depmue1; - double HSM2_depmue1l; - double HSM2_depmue1lp; - double HSM2_depmueback0; - double HSM2_depmueback0l; - double HSM2_depmueback0lp; - double HSM2_depmueback1; - double HSM2_depmueback1l; - double HSM2_depmueback1lp; - double HSM2_depmueph0; - double HSM2_depmueph1; - double HSM2_depvmax; - double HSM2_depvmaxl; - double HSM2_depvmaxlp; - double HSM2_depvdsef1; - double HSM2_depvdsef1l; - double HSM2_depvdsef1lp; - double HSM2_depvdsef2; - double HSM2_depvdsef2l; - double HSM2_depvdsef2lp; - double HSM2_depbb; - double HSM2_depmuetmp; - double HSM2_depeta ; - - /* binning parameters */ - double HSM2_lmin ; - double HSM2_lmax ; - double HSM2_wmin ; - double HSM2_wmax ; - double HSM2_lbinn ; - double HSM2_wbinn ; - - /* Length dependence */ - double HSM2_lvmax ; - double HSM2_lbgtmp1 ; - double HSM2_lbgtmp2 ; - double HSM2_leg0 ; - double HSM2_llover ; - double HSM2_lvfbover ; - double HSM2_lnover ; - double HSM2_lwl2 ; - double HSM2_lvfbc ; - double HSM2_lnsubc ; - double HSM2_lnsubp ; - double HSM2_lscp1 ; - double HSM2_lscp2 ; - double HSM2_lscp3 ; - double HSM2_lsc1 ; - double HSM2_lsc2 ; - double HSM2_lsc3 ; - double HSM2_lsc4 ; - double HSM2_lpgd1 ; -//double HSM2_lpgd3 ; - double HSM2_lndep ; - double HSM2_lninv ; - double HSM2_lmuecb0 ; - double HSM2_lmuecb1 ; - double HSM2_lmueph1 ; - double HSM2_lvtmp ; - double HSM2_lwvth0 ; - double HSM2_lmuesr1 ; - double HSM2_lmuetmp ; - double HSM2_lsub1 ; - double HSM2_lsub2 ; - double HSM2_lsvds ; - double HSM2_lsvbs ; - double HSM2_lsvgs ; - double HSM2_lnsti ; - double HSM2_lwsti ; - double HSM2_lscsti1 ; - double HSM2_lscsti2 ; - double HSM2_lvthsti ; - double HSM2_lmuesti1 ; - double HSM2_lmuesti2 ; - double HSM2_lmuesti3 ; - double HSM2_lnsubpsti1 ; - double HSM2_lnsubpsti2 ; - double HSM2_lnsubcsti1; - double HSM2_lnsubcsti2; - double HSM2_lnsubcsti3; - double HSM2_lnsubpsti3 ; - double HSM2_lcgso ; - double HSM2_lcgdo ; - double HSM2_ljs0 ; - double HSM2_ljs0sw ; - double HSM2_lnj ; - double HSM2_lcisbk ; - double HSM2_lclm1 ; - double HSM2_lclm2 ; - double HSM2_lclm3 ; - double HSM2_lwfc ; - double HSM2_lgidl1 ; - double HSM2_lgidl2 ; - double HSM2_lgleak1 ; - double HSM2_lgleak2 ; - double HSM2_lgleak3 ; - double HSM2_lgleak6 ; - double HSM2_lglksd1 ; - double HSM2_lglksd2 ; - double HSM2_lglkb1 ; - double HSM2_lglkb2 ; - double HSM2_lnftrp ; - double HSM2_lnfalp ; - double HSM2_lvdiffj ; - double HSM2_libpc1 ; - double HSM2_libpc2 ; - - /* Width dependence */ - double HSM2_wvmax ; - double HSM2_wbgtmp1 ; - double HSM2_wbgtmp2 ; - double HSM2_weg0 ; - double HSM2_wlover ; - double HSM2_wvfbover ; - double HSM2_wnover ; - double HSM2_wwl2 ; - double HSM2_wvfbc ; - double HSM2_wnsubc ; - double HSM2_wnsubp ; - double HSM2_wscp1 ; - double HSM2_wscp2 ; - double HSM2_wscp3 ; - double HSM2_wsc1 ; - double HSM2_wsc2 ; - double HSM2_wsc3 ; - double HSM2_wsc4 ; - double HSM2_wpgd1 ; -//double HSM2_wpgd3 ; - double HSM2_wndep ; - double HSM2_wninv ; - double HSM2_wmuecb0 ; - double HSM2_wmuecb1 ; - double HSM2_wmueph1 ; - double HSM2_wvtmp ; - double HSM2_wwvth0 ; - double HSM2_wmuesr1 ; - double HSM2_wmuetmp ; - double HSM2_wsub1 ; - double HSM2_wsub2 ; - double HSM2_wsvds ; - double HSM2_wsvbs ; - double HSM2_wsvgs ; - double HSM2_wnsti ; - double HSM2_wwsti ; - double HSM2_wscsti1 ; - double HSM2_wscsti2 ; - double HSM2_wvthsti ; - double HSM2_wmuesti1 ; - double HSM2_wmuesti2 ; - double HSM2_wmuesti3 ; - double HSM2_wnsubpsti1 ; - double HSM2_wnsubpsti2 ; - double HSM2_wnsubcsti1; - double HSM2_wnsubcsti2; - double HSM2_wnsubcsti3; - double HSM2_wnsubpsti3 ; - double HSM2_wcgso ; - double HSM2_wcgdo ; - double HSM2_wjs0 ; - double HSM2_wjs0sw ; - double HSM2_wnj ; - double HSM2_wcisbk ; - double HSM2_wclm1 ; - double HSM2_wclm2 ; - double HSM2_wclm3 ; - double HSM2_wwfc ; - double HSM2_wgidl1 ; - double HSM2_wgidl2 ; - double HSM2_wgleak1 ; - double HSM2_wgleak2 ; - double HSM2_wgleak3 ; - double HSM2_wgleak6 ; - double HSM2_wglksd1 ; - double HSM2_wglksd2 ; - double HSM2_wglkb1 ; - double HSM2_wglkb2 ; - double HSM2_wnftrp ; - double HSM2_wnfalp ; - double HSM2_wvdiffj ; - double HSM2_wibpc1 ; - double HSM2_wibpc2 ; - - /* Cross-term dependence */ - double HSM2_pvmax ; - double HSM2_pbgtmp1 ; - double HSM2_pbgtmp2 ; - double HSM2_peg0 ; - double HSM2_plover ; - double HSM2_pvfbover ; - double HSM2_pnover ; - double HSM2_pwl2 ; - double HSM2_pvfbc ; - double HSM2_pnsubc ; - double HSM2_pnsubp ; - double HSM2_pscp1 ; - double HSM2_pscp2 ; - double HSM2_pscp3 ; - double HSM2_psc1 ; - double HSM2_psc2 ; - double HSM2_psc3 ; - double HSM2_psc4 ; - double HSM2_ppgd1 ; -//double HSM2_ppgd3 ; - double HSM2_pndep ; - double HSM2_pninv ; - double HSM2_pmuecb0 ; - double HSM2_pmuecb1 ; - double HSM2_pmueph1 ; - double HSM2_pvtmp ; - double HSM2_pwvth0 ; - double HSM2_pmuesr1 ; - double HSM2_pmuetmp ; - double HSM2_psub1 ; - double HSM2_psub2 ; - double HSM2_psvds ; - double HSM2_psvbs ; - double HSM2_psvgs ; - double HSM2_pnsti ; - double HSM2_pwsti ; - double HSM2_pscsti1 ; - double HSM2_pscsti2 ; - double HSM2_pvthsti ; - double HSM2_pmuesti1 ; - double HSM2_pmuesti2 ; - double HSM2_pmuesti3 ; - double HSM2_pnsubpsti1 ; - double HSM2_pnsubpsti2 ; - double HSM2_pnsubcsti1; - double HSM2_pnsubcsti2; - double HSM2_pnsubcsti3; - double HSM2_pnsubpsti3 ; - double HSM2_pcgso ; - double HSM2_pcgdo ; - double HSM2_pjs0 ; - double HSM2_pjs0sw ; - double HSM2_pnj ; - double HSM2_pcisbk ; - double HSM2_pclm1 ; - double HSM2_pclm2 ; - double HSM2_pclm3 ; - double HSM2_pwfc ; - double HSM2_pgidl1 ; - double HSM2_pgidl2 ; - double HSM2_pgleak1 ; - double HSM2_pgleak2 ; - double HSM2_pgleak3 ; - double HSM2_pgleak6 ; - double HSM2_pglksd1 ; - double HSM2_pglksd2 ; - double HSM2_pglkb1 ; - double HSM2_pglkb2 ; - double HSM2_pnftrp ; - double HSM2_pnfalp ; - double HSM2_pvdiffj ; - double HSM2_pibpc1 ; - double HSM2_pibpc2 ; - - /* internal variables */ - double HSM2_vcrit ; - int HSM2_flg_qme ; - double HSM2_qme12 ; - double HSM2_ktnom ; - int HSM2_bypass_enable ; -//int HSM2_subversion ; -//int HSM2_revision ; - - double HSM2vgsMax; - double HSM2vgdMax; - double HSM2vgbMax; - double HSM2vdsMax; - double HSM2vbsMax; - double HSM2vbdMax; - double HSM2vgsrMax; - double HSM2vgdrMax; - double HSM2vgbrMax; - double HSM2vbsrMax; - double HSM2vbdrMax; - - HSM2modelMKSParam modelMKS ; /* unit-converted parameters */ - -#ifdef USE_OMP - int HSM2InstCount; - struct sHSM2instance **HSM2InstanceArray; -#endif - - /* flag for model */ - unsigned HSM2_type_Given :1; - unsigned HSM2_level_Given :1; - unsigned HSM2_info_Given :1; - unsigned HSM2_noise_Given :1; - unsigned HSM2_version_Given :1; - unsigned HSM2_show_Given :1; - unsigned HSM2_corsrd_Given :1; - unsigned HSM2_corg_Given :1; - unsigned HSM2_coiprv_Given :1; - unsigned HSM2_copprv_Given :1; - unsigned HSM2_coadov_Given :1; - unsigned HSM2_coisub_Given :1; - unsigned HSM2_coiigs_Given :1; - unsigned HSM2_cogidl_Given :1; - unsigned HSM2_coovlp_Given :1; - unsigned HSM2_coflick_Given :1; - unsigned HSM2_coisti_Given :1; - unsigned HSM2_conqs_Given :1; - unsigned HSM2_corbnet_Given :1; - unsigned HSM2_cothrml_Given :1; - unsigned HSM2_coign_Given :1; /* induced gate noise */ - unsigned HSM2_codfm_Given :1; /* DFM */ - unsigned HSM2_corecip_Given :1; - unsigned HSM2_coqy_Given :1; - unsigned HSM2_coqovsm_Given :1; - unsigned HSM2_coerrrep_Given :1; - unsigned HSM2_codep_Given :1; - unsigned HSM2_coddlt_Given :1; - unsigned HSM2_kappa_Given :1; - unsigned HSM2_vdiffj_Given :1; - unsigned HSM2_vmax_Given :1; - unsigned HSM2_bgtmp1_Given :1; - unsigned HSM2_bgtmp2_Given :1; - unsigned HSM2_eg0_Given :1; - unsigned HSM2_tox_Given :1; - unsigned HSM2_xld_Given :1; - unsigned HSM2_lover_Given :1; - unsigned HSM2_ddltmax_Given :1; /* Vdseff */ - unsigned HSM2_ddltslp_Given :1; /* Vdseff */ - unsigned HSM2_ddltict_Given :1; /* Vdseff */ - unsigned HSM2_vfbover_Given :1; - unsigned HSM2_nover_Given :1; - unsigned HSM2_xwd_Given :1; - unsigned HSM2_xl_Given :1; - unsigned HSM2_xw_Given :1; - unsigned HSM2_saref_Given :1; - unsigned HSM2_sbref_Given :1; - unsigned HSM2_ll_Given :1; - unsigned HSM2_lld_Given :1; - unsigned HSM2_lln_Given :1; - unsigned HSM2_wl_Given :1; - unsigned HSM2_wl1_Given :1; - unsigned HSM2_wl1p_Given :1; - unsigned HSM2_wl2_Given :1; - unsigned HSM2_wl2p_Given :1; - unsigned HSM2_wld_Given :1; - unsigned HSM2_wln_Given :1; - unsigned HSM2_xqy_Given :1; - unsigned HSM2_xqy1_Given :1; - unsigned HSM2_xqy2_Given :1; - unsigned HSM2_qyrat_Given :1; - unsigned HSM2_rs_Given :1; - unsigned HSM2_rd_Given :1; - unsigned HSM2_rsh_Given :1; - unsigned HSM2_rshg_Given :1; -/* unsigned HSM2_ngcon_Given :1; */ -/* unsigned HSM2_xgw_Given :1; */ -/* unsigned HSM2_xgl_Given :1; */ -/* unsigned HSM2_nf_Given :1; */ - unsigned HSM2_vfbc_Given :1; - unsigned HSM2_vbi_Given :1; - unsigned HSM2_vfbcl_Given :1; - unsigned HSM2_vfbclp_Given :1; - unsigned HSM2_nsubc_Given :1; - unsigned HSM2_parl2_Given :1; - unsigned HSM2_lp_Given :1; - unsigned HSM2_nsubp_Given :1; - unsigned HSM2_nsubpl_Given :1; - unsigned HSM2_nsubpdlt_Given :1; - unsigned HSM2_nsubpfac_Given :1; - unsigned HSM2_nsubpw_Given :1; - unsigned HSM2_nsubpwp_Given :1; - unsigned HSM2_scp1_Given :1; - unsigned HSM2_scp2_Given :1; - unsigned HSM2_scp3_Given :1; - unsigned HSM2_sc1_Given :1; - unsigned HSM2_sc2_Given :1; - unsigned HSM2_sc3_Given :1; - unsigned HSM2_sc4_Given :1; - unsigned HSM2_pgd1_Given :1; - unsigned HSM2_pgd2_Given :1; -//unsigned HSM2_pgd3_Given :1; - unsigned HSM2_pgd4_Given :1; - unsigned HSM2_ndep_Given :1; - unsigned HSM2_ndepl_Given :1; - unsigned HSM2_ndeplp_Given :1; - unsigned HSM2_ndepw_Given :1; - unsigned HSM2_ndepwp_Given :1; - unsigned HSM2_ninv_Given :1; - unsigned HSM2_ninvd_Given :1; - unsigned HSM2_ninvdl_Given :1; - unsigned HSM2_ninvdlp_Given :1; - unsigned HSM2_muecb0_Given :1; - unsigned HSM2_muecb1_Given :1; - unsigned HSM2_mueph1_Given :1; - unsigned HSM2_mueph0_Given :1; - unsigned HSM2_muephw_Given :1; - unsigned HSM2_muepwp_Given :1; - unsigned HSM2_muepwd_Given :1; - unsigned HSM2_muephl_Given :1; - unsigned HSM2_mueplp_Given :1; - unsigned HSM2_muepld_Given :1; - unsigned HSM2_muephs_Given :1; - unsigned HSM2_muepsp_Given :1; - unsigned HSM2_vtmp_Given :1; - unsigned HSM2_wvth0_Given :1; - unsigned HSM2_muesr1_Given :1; - unsigned HSM2_muesr0_Given :1; - unsigned HSM2_muesrl_Given :1; - unsigned HSM2_mueslp_Given :1; - unsigned HSM2_muesrw_Given :1; - unsigned HSM2_mueswp_Given :1; - unsigned HSM2_bb_Given :1; - unsigned HSM2_sub1_Given :1; - unsigned HSM2_sub2_Given :1; - unsigned HSM2_svgs_Given :1; - unsigned HSM2_svbs_Given :1; - unsigned HSM2_svbsl_Given :1; - unsigned HSM2_svds_Given :1; - unsigned HSM2_slg_Given :1; - unsigned HSM2_sub1l_Given :1; - unsigned HSM2_sub2l_Given :1; - unsigned HSM2_svgsl_Given :1; - unsigned HSM2_svgslp_Given :1; - unsigned HSM2_svgswp_Given :1; - unsigned HSM2_svgsw_Given :1; - unsigned HSM2_svbslp_Given :1; - unsigned HSM2_slgl_Given :1; - unsigned HSM2_slglp_Given :1; - unsigned HSM2_sub1lp_Given :1; - unsigned HSM2_nsti_Given :1; - unsigned HSM2_wsti_Given :1; - unsigned HSM2_wstil_Given :1; - unsigned HSM2_wstilp_Given :1; - unsigned HSM2_wstiw_Given :1; - unsigned HSM2_wstiwp_Given :1; - unsigned HSM2_scsti1_Given :1; - unsigned HSM2_scsti2_Given :1; - unsigned HSM2_vthsti_Given :1; - unsigned HSM2_vdsti_Given :1; - unsigned HSM2_muesti1_Given :1; - unsigned HSM2_muesti2_Given :1; - unsigned HSM2_muesti3_Given :1; - unsigned HSM2_nsubpsti1_Given :1; - unsigned HSM2_nsubpsti2_Given :1; - unsigned HSM2_nsubcsti1_Given :1; - unsigned HSM2_nsubcsti2_Given :1; - unsigned HSM2_nsubcsti3_Given :1; - unsigned HSM2_nsubpsti3_Given :1; - unsigned HSM2_lpext_Given :1; - unsigned HSM2_npext_Given :1; - unsigned HSM2_npextw_Given :1; - unsigned HSM2_npextwp_Given :1; - unsigned HSM2_scp22_Given :1; - unsigned HSM2_scp21_Given :1; - unsigned HSM2_bs1_Given :1; - unsigned HSM2_bs2_Given :1; - unsigned HSM2_cgso_Given :1; - unsigned HSM2_cgdo_Given :1; - unsigned HSM2_cgbo_Given :1; - unsigned HSM2_tpoly_Given :1; - unsigned HSM2_js0_Given :1; - unsigned HSM2_js0sw_Given :1; - unsigned HSM2_nj_Given :1; - unsigned HSM2_njsw_Given :1; - unsigned HSM2_xti_Given :1; - unsigned HSM2_cj_Given :1; - unsigned HSM2_cjsw_Given :1; - unsigned HSM2_cjswg_Given :1; - unsigned HSM2_mj_Given :1; - unsigned HSM2_mjsw_Given :1; - unsigned HSM2_mjswg_Given :1; - unsigned HSM2_xti2_Given :1; - unsigned HSM2_cisb_Given :1; - unsigned HSM2_cvb_Given :1; - unsigned HSM2_ctemp_Given :1; - unsigned HSM2_cisbk_Given :1; - unsigned HSM2_cvbk_Given :1; - unsigned HSM2_divx_Given :1; - unsigned HSM2_pb_Given :1; - unsigned HSM2_pbsw_Given :1; - unsigned HSM2_pbswg_Given :1; - unsigned HSM2_tcjbd_Given :1; - unsigned HSM2_tcjbs_Given :1; - unsigned HSM2_tcjbdsw_Given :1; - unsigned HSM2_tcjbssw_Given :1; - unsigned HSM2_tcjbdswg_Given :1; - unsigned HSM2_tcjbsswg_Given :1; - - unsigned HSM2_clm1_Given :1; - unsigned HSM2_clm2_Given :1; - unsigned HSM2_clm3_Given :1; - unsigned HSM2_clm5_Given :1; - unsigned HSM2_clm6_Given :1; - unsigned HSM2_muetmp_Given :1; - unsigned HSM2_vover_Given :1; - unsigned HSM2_voverp_Given :1; - unsigned HSM2_vovers_Given :1; - unsigned HSM2_voversp_Given :1; - unsigned HSM2_wfc_Given :1; - unsigned HSM2_nsubcw_Given :1; - unsigned HSM2_nsubcwp_Given :1; - unsigned HSM2_nsubcmax_Given :1; - unsigned HSM2_qme1_Given :1; - unsigned HSM2_qme2_Given :1; - unsigned HSM2_qme3_Given :1; - unsigned HSM2_gidl1_Given :1; - unsigned HSM2_gidl2_Given :1; - unsigned HSM2_gidl3_Given :1; - unsigned HSM2_gidl4_Given :1; - unsigned HSM2_gidl6_Given :1; - unsigned HSM2_gidl7_Given :1; - unsigned HSM2_gidl5_Given :1; - unsigned HSM2_gleak1_Given :1; - unsigned HSM2_gleak2_Given :1; - unsigned HSM2_gleak3_Given :1; - unsigned HSM2_gleak4_Given :1; - unsigned HSM2_gleak5_Given :1; - unsigned HSM2_gleak6_Given :1; - unsigned HSM2_gleak7_Given :1; - unsigned HSM2_glksd1_Given :1; - unsigned HSM2_glksd2_Given :1; - unsigned HSM2_glksd3_Given :1; - unsigned HSM2_glkb1_Given :1; - unsigned HSM2_glkb2_Given :1; - unsigned HSM2_glkb3_Given :1; - unsigned HSM2_egig_Given :1; - unsigned HSM2_igtemp2_Given :1; - unsigned HSM2_igtemp3_Given :1; - unsigned HSM2_vzadd0_Given :1; - unsigned HSM2_pzadd0_Given :1; - unsigned HSM2_nftrp_Given :1; - unsigned HSM2_nfalp_Given :1; - unsigned HSM2_cit_Given :1; - unsigned HSM2_falph_Given :1; - unsigned HSM2_dly1_Given :1; - unsigned HSM2_dly2_Given :1; - unsigned HSM2_dly3_Given :1; - unsigned HSM2_tnom_Given :1; - unsigned HSM2_ovslp_Given :1; - unsigned HSM2_ovmag_Given :1; - unsigned HSM2_gbmin_Given :1; - unsigned HSM2_rbpb_Given :1; - unsigned HSM2_rbpd_Given :1; - unsigned HSM2_rbps_Given :1; - unsigned HSM2_rbdb_Given :1; - unsigned HSM2_rbsb_Given :1; - unsigned HSM2_ibpc1_Given :1; - unsigned HSM2_ibpc2_Given :1; - unsigned HSM2_mphdfm_Given :1; - - unsigned HSM2_ptl_Given :1; - unsigned HSM2_ptp_Given :1; - unsigned HSM2_pt2_Given :1; - unsigned HSM2_ptlp_Given :1; - unsigned HSM2_gdl_Given :1; - unsigned HSM2_gdlp_Given :1; - - unsigned HSM2_gdld_Given :1; - unsigned HSM2_pt4_Given :1; - unsigned HSM2_pt4p_Given :1; - unsigned HSM2_muephl2_Given :1; - unsigned HSM2_mueplp2_Given :1; - unsigned HSM2_nsubcw2_Given :1; - unsigned HSM2_nsubcwp2_Given :1; - unsigned HSM2_muephw2_Given :1; - unsigned HSM2_muepwp2_Given :1; - - /* val set flag for WPE */ - unsigned HSM2_web_Given :1; - unsigned HSM2_wec_Given :1; - unsigned HSM2_nsubcwpe_Given :1; - unsigned HSM2_npextwpe_Given :1; - unsigned HSM2_nsubpwpe_Given :1; - unsigned HSM2_Vgsmin_Given :1; - unsigned HSM2_sc3Vbs_Given :1; - unsigned HSM2_byptol_Given :1; - unsigned HSM2_muecb0lp_Given :1; - unsigned HSM2_muecb1lp_Given :1; - - /* Depletion Mode MOSFET */ - unsigned HSM2_ndepm_Given :1; - unsigned HSM2_ndepml_Given :1; - unsigned HSM2_ndepmlp_Given :1; - unsigned HSM2_tndep_Given :1; - unsigned HSM2_depleak_Given :1; - unsigned HSM2_depleakl_Given :1; - unsigned HSM2_depleaklp_Given :1; - unsigned HSM2_depmue0_Given :1; - unsigned HSM2_depmue0l_Given :1; - unsigned HSM2_depmue0lp_Given :1; - unsigned HSM2_depmue1_Given :1; - unsigned HSM2_depmue1l_Given :1; - unsigned HSM2_depmue1lp_Given :1; - unsigned HSM2_depmueback0_Given :1; - unsigned HSM2_depmueback0l_Given :1; - unsigned HSM2_depmueback0lp_Given :1; - unsigned HSM2_depmueback1_Given :1; - unsigned HSM2_depmueback1l_Given :1; - unsigned HSM2_depmueback1lp_Given :1; - unsigned HSM2_depmueph0_Given :1; - unsigned HSM2_depmueph1_Given :1; - unsigned HSM2_depvmax_Given :1; - unsigned HSM2_depvmaxl_Given :1; - unsigned HSM2_depvmaxlp_Given :1; - unsigned HSM2_depvdsef1_Given :1; - unsigned HSM2_depvdsef1l_Given :1; - unsigned HSM2_depvdsef1lp_Given :1; - unsigned HSM2_depvdsef2_Given :1; - unsigned HSM2_depvdsef2l_Given :1; - unsigned HSM2_depvdsef2lp_Given :1; - unsigned HSM2_depbb_Given :1; - unsigned HSM2_depmuetmp_Given :1; - unsigned HSM2_depeta_Given :1; - - /* binning parameters */ - unsigned HSM2_lmin_Given :1; - unsigned HSM2_lmax_Given :1; - unsigned HSM2_wmin_Given :1; - unsigned HSM2_wmax_Given :1; - unsigned HSM2_lbinn_Given :1; - unsigned HSM2_wbinn_Given :1; - - /* Length dependence */ - unsigned HSM2_lvmax_Given :1; - unsigned HSM2_lbgtmp1_Given :1; - unsigned HSM2_lbgtmp2_Given :1; - unsigned HSM2_leg0_Given :1; - unsigned HSM2_llover_Given :1; - unsigned HSM2_lvfbover_Given :1; - unsigned HSM2_lnover_Given :1; - unsigned HSM2_lwl2_Given :1; - unsigned HSM2_lvfbc_Given :1; - unsigned HSM2_lnsubc_Given :1; - unsigned HSM2_lnsubp_Given :1; - unsigned HSM2_lscp1_Given :1; - unsigned HSM2_lscp2_Given :1; - unsigned HSM2_lscp3_Given :1; - unsigned HSM2_lsc1_Given :1; - unsigned HSM2_lsc2_Given :1; - unsigned HSM2_lsc3_Given :1; - unsigned HSM2_lsc4_Given :1; - unsigned HSM2_lpgd1_Given :1; -//unsigned HSM2_lpgd3_Given :1; - unsigned HSM2_lndep_Given :1; - unsigned HSM2_lninv_Given :1; - unsigned HSM2_lmuecb0_Given :1; - unsigned HSM2_lmuecb1_Given :1; - unsigned HSM2_lmueph1_Given :1; - unsigned HSM2_lvtmp_Given :1; - unsigned HSM2_lwvth0_Given :1; - unsigned HSM2_lmuesr1_Given :1; - unsigned HSM2_lmuetmp_Given :1; - unsigned HSM2_lsub1_Given :1; - unsigned HSM2_lsub2_Given :1; - unsigned HSM2_lsvds_Given :1; - unsigned HSM2_lsvbs_Given :1; - unsigned HSM2_lsvgs_Given :1; - unsigned HSM2_lnsti_Given :1; - unsigned HSM2_lwsti_Given :1; - unsigned HSM2_lscsti1_Given :1; - unsigned HSM2_lscsti2_Given :1; - unsigned HSM2_lvthsti_Given :1; - unsigned HSM2_lmuesti1_Given :1; - unsigned HSM2_lmuesti2_Given :1; - unsigned HSM2_lmuesti3_Given :1; - unsigned HSM2_lnsubpsti1_Given :1; - unsigned HSM2_lnsubpsti2_Given :1; - unsigned HSM2_lnsubcsti1_Given :1; - unsigned HSM2_lnsubcsti2_Given :1; - unsigned HSM2_lnsubcsti3_Given :1; - unsigned HSM2_lnsubpsti3_Given :1; - unsigned HSM2_lcgso_Given :1; - unsigned HSM2_lcgdo_Given :1; - unsigned HSM2_ljs0_Given :1; - unsigned HSM2_ljs0sw_Given :1; - unsigned HSM2_lnj_Given :1; - unsigned HSM2_lcisbk_Given :1; - unsigned HSM2_lclm1_Given :1; - unsigned HSM2_lclm2_Given :1; - unsigned HSM2_lclm3_Given :1; - unsigned HSM2_lwfc_Given :1; - unsigned HSM2_lgidl1_Given :1; - unsigned HSM2_lgidl2_Given :1; - unsigned HSM2_lgleak1_Given :1; - unsigned HSM2_lgleak2_Given :1; - unsigned HSM2_lgleak3_Given :1; - unsigned HSM2_lgleak6_Given :1; - unsigned HSM2_lglksd1_Given :1; - unsigned HSM2_lglksd2_Given :1; - unsigned HSM2_lglkb1_Given :1; - unsigned HSM2_lglkb2_Given :1; - unsigned HSM2_lnftrp_Given :1; - unsigned HSM2_lnfalp_Given :1; - unsigned HSM2_lvdiffj_Given :1; - unsigned HSM2_libpc1_Given :1; - unsigned HSM2_libpc2_Given :1; - - /* Width dependence */ - unsigned HSM2_wvmax_Given :1; - unsigned HSM2_wbgtmp1_Given :1; - unsigned HSM2_wbgtmp2_Given :1; - unsigned HSM2_weg0_Given :1; - unsigned HSM2_wlover_Given :1; - unsigned HSM2_wvfbover_Given :1; - unsigned HSM2_wnover_Given :1; - unsigned HSM2_wwl2_Given :1; - unsigned HSM2_wvfbc_Given :1; - unsigned HSM2_wnsubc_Given :1; - unsigned HSM2_wnsubp_Given :1; - unsigned HSM2_wscp1_Given :1; - unsigned HSM2_wscp2_Given :1; - unsigned HSM2_wscp3_Given :1; - unsigned HSM2_wsc1_Given :1; - unsigned HSM2_wsc2_Given :1; - unsigned HSM2_wsc3_Given :1; - unsigned HSM2_wsc4_Given :1; - unsigned HSM2_wpgd1_Given :1; -//unsigned HSM2_wpgd3_Given :1; - unsigned HSM2_wndep_Given :1; - unsigned HSM2_wninv_Given :1; - unsigned HSM2_wmuecb0_Given :1; - unsigned HSM2_wmuecb1_Given :1; - unsigned HSM2_wmueph1_Given :1; - unsigned HSM2_wvtmp_Given :1; - unsigned HSM2_wwvth0_Given :1; - unsigned HSM2_wmuesr1_Given :1; - unsigned HSM2_wmuetmp_Given :1; - unsigned HSM2_wsub1_Given :1; - unsigned HSM2_wsub2_Given :1; - unsigned HSM2_wsvds_Given :1; - unsigned HSM2_wsvbs_Given :1; - unsigned HSM2_wsvgs_Given :1; - unsigned HSM2_wnsti_Given :1; - unsigned HSM2_wwsti_Given :1; - unsigned HSM2_wscsti1_Given :1; - unsigned HSM2_wscsti2_Given :1; - unsigned HSM2_wvthsti_Given :1; - unsigned HSM2_wmuesti1_Given :1; - unsigned HSM2_wmuesti2_Given :1; - unsigned HSM2_wmuesti3_Given :1; - unsigned HSM2_wnsubpsti1_Given :1; - unsigned HSM2_wnsubpsti2_Given :1; - unsigned HSM2_wnsubcsti1_Given :1; - unsigned HSM2_wnsubcsti2_Given :1; - unsigned HSM2_wnsubcsti3_Given :1; - unsigned HSM2_wnsubpsti3_Given :1; - unsigned HSM2_wcgso_Given :1; - unsigned HSM2_wcgdo_Given :1; - unsigned HSM2_wjs0_Given :1; - unsigned HSM2_wjs0sw_Given :1; - unsigned HSM2_wnj_Given :1; - unsigned HSM2_wcisbk_Given :1; - unsigned HSM2_wclm1_Given :1; - unsigned HSM2_wclm2_Given :1; - unsigned HSM2_wclm3_Given :1; - unsigned HSM2_wwfc_Given :1; - unsigned HSM2_wgidl1_Given :1; - unsigned HSM2_wgidl2_Given :1; - unsigned HSM2_wgleak1_Given :1; - unsigned HSM2_wgleak2_Given :1; - unsigned HSM2_wgleak3_Given :1; - unsigned HSM2_wgleak6_Given :1; - unsigned HSM2_wglksd1_Given :1; - unsigned HSM2_wglksd2_Given :1; - unsigned HSM2_wglkb1_Given :1; - unsigned HSM2_wglkb2_Given :1; - unsigned HSM2_wnftrp_Given :1; - unsigned HSM2_wnfalp_Given :1; - unsigned HSM2_wvdiffj_Given :1; - unsigned HSM2_wibpc1_Given :1; - unsigned HSM2_wibpc2_Given :1; - - /* Cross-term dependence */ - unsigned HSM2_pvmax_Given :1; - unsigned HSM2_pbgtmp1_Given :1; - unsigned HSM2_pbgtmp2_Given :1; - unsigned HSM2_peg0_Given :1; - unsigned HSM2_plover_Given :1; - unsigned HSM2_pvfbover_Given :1; - unsigned HSM2_pnover_Given :1; - unsigned HSM2_pwl2_Given :1; - unsigned HSM2_pvfbc_Given :1; - unsigned HSM2_pnsubc_Given :1; - unsigned HSM2_pnsubp_Given :1; - unsigned HSM2_pscp1_Given :1; - unsigned HSM2_pscp2_Given :1; - unsigned HSM2_pscp3_Given :1; - unsigned HSM2_psc1_Given :1; - unsigned HSM2_psc2_Given :1; - unsigned HSM2_psc3_Given :1; - unsigned HSM2_psc4_Given :1; - unsigned HSM2_ppgd1_Given :1; -//unsigned HSM2_ppgd3_Given :1; - unsigned HSM2_pndep_Given :1; - unsigned HSM2_pninv_Given :1; - unsigned HSM2_pmuecb0_Given :1; - unsigned HSM2_pmuecb1_Given :1; - unsigned HSM2_pmueph1_Given :1; - unsigned HSM2_pvtmp_Given :1; - unsigned HSM2_pwvth0_Given :1; - unsigned HSM2_pmuesr1_Given :1; - unsigned HSM2_pmuetmp_Given :1; - unsigned HSM2_psub1_Given :1; - unsigned HSM2_psub2_Given :1; - unsigned HSM2_psvds_Given :1; - unsigned HSM2_psvbs_Given :1; - unsigned HSM2_psvgs_Given :1; - unsigned HSM2_pnsti_Given :1; - unsigned HSM2_pwsti_Given :1; - unsigned HSM2_pscsti1_Given :1; - unsigned HSM2_pscsti2_Given :1; - unsigned HSM2_pvthsti_Given :1; - unsigned HSM2_pmuesti1_Given :1; - unsigned HSM2_pmuesti2_Given :1; - unsigned HSM2_pmuesti3_Given :1; - unsigned HSM2_pnsubpsti1_Given :1; - unsigned HSM2_pnsubpsti2_Given :1; - unsigned HSM2_pnsubcsti1_Given :1; - unsigned HSM2_pnsubcsti2_Given :1; - unsigned HSM2_pnsubcsti3_Given :1; - unsigned HSM2_pnsubpsti3_Given :1; - unsigned HSM2_pcgso_Given :1; - unsigned HSM2_pcgdo_Given :1; - unsigned HSM2_pjs0_Given :1; - unsigned HSM2_pjs0sw_Given :1; - unsigned HSM2_pnj_Given :1; - unsigned HSM2_pcisbk_Given :1; - unsigned HSM2_pclm1_Given :1; - unsigned HSM2_pclm2_Given :1; - unsigned HSM2_pclm3_Given :1; - unsigned HSM2_pwfc_Given :1; - unsigned HSM2_pgidl1_Given :1; - unsigned HSM2_pgidl2_Given :1; - unsigned HSM2_pgleak1_Given :1; - unsigned HSM2_pgleak2_Given :1; - unsigned HSM2_pgleak3_Given :1; - unsigned HSM2_pgleak6_Given :1; - unsigned HSM2_pglksd1_Given :1; - unsigned HSM2_pglksd2_Given :1; - unsigned HSM2_pglkb1_Given :1; - unsigned HSM2_pglkb2_Given :1; - unsigned HSM2_pnftrp_Given :1; - unsigned HSM2_pnfalp_Given :1; - unsigned HSM2_pvdiffj_Given :1; - unsigned HSM2_pibpc1_Given :1; - unsigned HSM2_pibpc2_Given :1; - - unsigned HSM2vgsMaxGiven :1; - unsigned HSM2vgdMaxGiven :1; - unsigned HSM2vgbMaxGiven :1; - unsigned HSM2vdsMaxGiven :1; - unsigned HSM2vbsMaxGiven :1; - unsigned HSM2vbdMaxGiven :1; - unsigned HSM2vgsrMaxGiven :1; - unsigned HSM2vgdrMaxGiven :1; - unsigned HSM2vgbrMaxGiven :1; - unsigned HSM2vbsrMaxGiven :1; - unsigned HSM2vbdrMaxGiven :1; - -} HSM2model; - -#ifndef NMOS -#define NMOS 1 -#define PMOS -1 -#endif /*NMOS*/ - -#define HSM2_BAD_PARAM -1 - -/* flags */ -#define HSM2_MOD_NMOS 1 -#define HSM2_MOD_PMOS 2 -#define HSM2_MOD_LEVEL 3 -#define HSM2_MOD_INFO 4 -#define HSM2_MOD_NOISE 5 -#define HSM2_MOD_VERSION 6 -#define HSM2_MOD_SHOW 7 -#define HSM2_MOD_CORSRD 11 -#define HSM2_MOD_COIPRV 12 -#define HSM2_MOD_COPPRV 13 -#define HSM2_MOD_COADOV 17 -#define HSM2_MOD_COISUB 21 -#define HSM2_MOD_COIIGS 22 -#define HSM2_MOD_COGIDL 23 -#define HSM2_MOD_COOVLP 24 -#define HSM2_MOD_COFLICK 25 -#define HSM2_MOD_COISTI 26 -#define HSM2_MOD_CONQS 29 /* HiSIM2 */ -#define HSM2_MOD_COTHRML 30 -#define HSM2_MOD_COIGN 31 /* induced gate noise */ -#define HSM2_MOD_CORG 32 -#define HSM2_MOD_CORBNET 33 -#define HSM2_MOD_CODFM 36 /* DFM */ -#define HSM2_MOD_CORECIP 37 -#define HSM2_MOD_COQY 38 -#define HSM2_MOD_COQOVSM 39 -#define HSM2_MOD_COERRREP 153 -#define HSM2_MOD_CODEP 45 -#define HSM2_MOD_CODDLT 40 - -/* device parameters */ -#define HSM2_L 51 -#define HSM2_W 52 -#define HSM2_AD 53 -#define HSM2_AS 54 -#define HSM2_PD 55 -#define HSM2_PS 56 -#define HSM2_NRD 57 -#define HSM2_NRS 58 -#define HSM2_TEMP 59 -#define HSM2_DTEMP 60 -#define HSM2_OFF 61 -#define HSM2_IC_VBS 62 -#define HSM2_IC_VDS 63 -#define HSM2_IC_VGS 64 -#define HSM2_IC 65 -#define HSM2_CORBNET 66 -#define HSM2_RBPB 67 -#define HSM2_RBPD 68 -#define HSM2_RBPS 69 -#define HSM2_RBDB 70 -#define HSM2_RBSB 71 -#define HSM2_CORG 72 -/* #define HSM2_RSHG 73 */ -#define HSM2_NGCON 74 -#define HSM2_XGW 75 -#define HSM2_XGL 76 -#define HSM2_NF 77 -#define HSM2_SA 78 -#define HSM2_SB 79 -#define HSM2_SD 80 -#define HSM2_NSUBCDFM 82 -#define HSM2_MPHDFM 84 -#define HSM2_M 83 - -/* val symbol for WPE */ -#define HSM2_SCA 85 /* sca */ -#define HSM2_SCB 86 /* scb */ -#define HSM2_SCC 87 /* scc */ - -/* model parameters */ -#define HSM2_MOD_VMAX 100 -#define HSM2_MOD_BGTMP1 101 -#define HSM2_MOD_BGTMP2 102 -#define HSM2_MOD_EG0 103 -#define HSM2_MOD_TOX 104 -#define HSM2_MOD_XLD 105 -#define HSM2_MOD_LOVER 106 -#define HSM2_MOD_DDLTMAX 421 /* Vdseff */ -#define HSM2_MOD_DDLTSLP 422 /* Vdseff */ -#define HSM2_MOD_DDLTICT 423 /* Vdseff */ -#define HSM2_MOD_VFBOVER 428 -#define HSM2_MOD_NOVER 430 -#define HSM2_MOD_XWD 107 -#define HSM2_MOD_XL 112 -#define HSM2_MOD_XW 117 -#define HSM2_MOD_SAREF 433 -#define HSM2_MOD_SBREF 434 -#define HSM2_MOD_LL 108 -#define HSM2_MOD_LLD 109 -#define HSM2_MOD_LLN 110 -#define HSM2_MOD_WL 111 -#define HSM2_MOD_WL1 113 -#define HSM2_MOD_WL1P 114 -#define HSM2_MOD_WL2 407 -#define HSM2_MOD_WL2P 408 -#define HSM2_MOD_WLD 115 -#define HSM2_MOD_WLN 116 - -#define HSM2_MOD_XQY 178 -#define HSM2_MOD_XQY1 118 -#define HSM2_MOD_XQY2 120 -#define HSM2_MOD_QYRAT 991 - -#define HSM2_MOD_RSH 119 -#define HSM2_MOD_RSHG 384 -/* #define HSM2_MOD_NGCON 385 */ -/* #define HSM2_MOD_XGW 386 */ -/* #define HSM2_MOD_XGL 387 */ -/* #define HSM2_MOD_NF 388 */ -#define HSM2_MOD_RS 398 -#define HSM2_MOD_RD 399 - -#define HSM2_MOD_VFBC 121 -#define HSM2_MOD_VBI 122 -#define HSM2_MOD_NSUBC 123 -#define HSM2_MOD_VFBCL 272 -#define HSM2_MOD_VFBCLP 273 -#define HSM2_MOD_TNOM 124 -#define HSM2_MOD_PARL2 125 -#define HSM2_MOD_SC1 126 -#define HSM2_MOD_SC2 127 -#define HSM2_MOD_SC3 128 -#define HSM2_MOD_SC4 460 -#define HSM2_MOD_NDEP 129 -#define HSM2_MOD_NDEPL 419 -#define HSM2_MOD_NDEPLP 420 -#define HSM2_MOD_NDEPW 469 -#define HSM2_MOD_NDEPWP 470 -#define HSM2_MOD_NINV 130 -#define HSM2_MOD_NINVD 300 -#define HSM2_MOD_NINVDL 301 -#define HSM2_MOD_NINVDLP 302 -#define HSM2_MOD_MUECB0 131 -#define HSM2_MOD_MUECB1 132 -#define HSM2_MOD_MUEPH1 133 -#define HSM2_MOD_MUEPH0 134 -#define HSM2_MOD_MUEPHW 135 -#define HSM2_MOD_MUEPWP 136 -#define HSM2_MOD_MUEPWD 333 -#define HSM2_MOD_MUEPHL 137 -#define HSM2_MOD_MUEPLP 138 -#define HSM2_MOD_MUEPLD 150 -#define HSM2_MOD_MUEPHS 139 -#define HSM2_MOD_MUEPSP 140 -#define HSM2_MOD_VTMP 141 -#define HSM2_MOD_WVTH0 142 -#define HSM2_MOD_MUESR1 143 -#define HSM2_MOD_MUESR0 144 -#define HSM2_MOD_MUESRL 145 -#define HSM2_MOD_MUESLP 146 -#define HSM2_MOD_MUESRW 147 -#define HSM2_MOD_MUESWP 148 -#define HSM2_MOD_BB 149 - -#define HSM2_MOD_SUB1 151 -#define HSM2_MOD_SUB2 152 -#define HSM2_MOD_CGSO 154 -#define HSM2_MOD_CGDO 155 -#define HSM2_MOD_CGBO 156 -#define HSM2_MOD_JS0 157 -#define HSM2_MOD_JS0SW 158 -#define HSM2_MOD_NJ 159 -#define HSM2_MOD_NJSW 160 -#define HSM2_MOD_XTI 161 -#define HSM2_MOD_CJ 162 -#define HSM2_MOD_CJSW 163 -#define HSM2_MOD_CJSWG 164 -#define HSM2_MOD_MJ 165 -#define HSM2_MOD_MJSW 166 -#define HSM2_MOD_MJSWG 167 -#define HSM2_MOD_XTI2 168 -#define HSM2_MOD_CISB 169 -#define HSM2_MOD_CVB 170 -#define HSM2_MOD_CTEMP 171 -#define HSM2_MOD_CISBK 172 -#define HSM2_MOD_CVBK 173 -#define HSM2_MOD_DIVX 174 -#define HSM2_MOD_PB 175 -#define HSM2_MOD_PBSW 176 -#define HSM2_MOD_PBSWG 177 -#define HSM2_MOD_TPOLY 179 -#define HSM2_MOD_LP 180 -#define HSM2_MOD_NSUBP 181 -#define HSM2_MOD_NSUBPL 196 -#define HSM2_MOD_NSUBPFAC 197 -#define HSM2_MOD_NSUBPDLT 274 -#define HSM2_MOD_NSUBPW 182 -#define HSM2_MOD_NSUBPWP 183 -#define HSM2_MOD_SCP1 184 -#define HSM2_MOD_SCP2 185 -#define HSM2_MOD_SCP3 186 -#define HSM2_MOD_PGD1 187 -#define HSM2_MOD_PGD2 188 -//#define HSM2_MOD_PGD3 189 -#define HSM2_MOD_PGD4 190 -#define HSM2_MOD_CLM1 191 -#define HSM2_MOD_CLM2 192 -#define HSM2_MOD_CLM3 193 -#define HSM2_MOD_CLM5 402 -#define HSM2_MOD_CLM6 403 -#define HSM2_MOD_MUETMP 195 - -#define HSM2_MOD_VOVER 199 -#define HSM2_MOD_VOVERP 200 -#define HSM2_MOD_WFC 201 -#define HSM2_MOD_NSUBCW 249 -#define HSM2_MOD_NSUBCWP 250 -#define HSM2_MOD_NSUBCMAX 248 -#define HSM2_MOD_QME1 202 -#define HSM2_MOD_QME2 203 -#define HSM2_MOD_QME3 204 -#define HSM2_MOD_GIDL1 205 -#define HSM2_MOD_GIDL2 206 -#define HSM2_MOD_GIDL3 207 -#define HSM2_MOD_GLEAK1 208 -#define HSM2_MOD_GLEAK2 209 -#define HSM2_MOD_GLEAK3 210 -#define HSM2_MOD_GLEAK4 211 -#define HSM2_MOD_GLEAK5 212 -#define HSM2_MOD_GLEAK6 213 -#define HSM2_MOD_GLEAK7 214 -#define HSM2_MOD_GLKSD1 215 -#define HSM2_MOD_GLKSD2 216 -#define HSM2_MOD_GLKSD3 217 -#define HSM2_MOD_GLKB1 218 -#define HSM2_MOD_GLKB2 219 -#define HSM2_MOD_GLKB3 429 -#define HSM2_MOD_EGIG 220 -#define HSM2_MOD_IGTEMP2 221 -#define HSM2_MOD_IGTEMP3 222 -#define HSM2_MOD_VZADD0 223 -#define HSM2_MOD_PZADD0 224 -#define HSM2_MOD_NSTI 225 -#define HSM2_MOD_WSTI 226 -#define HSM2_MOD_WSTIL 227 -#define HSM2_MOD_WSTILP 231 -#define HSM2_MOD_WSTIW 234 -#define HSM2_MOD_WSTIWP 228 -#define HSM2_MOD_SCSTI1 229 -#define HSM2_MOD_SCSTI2 230 -#define HSM2_MOD_VTHSTI 232 -#define HSM2_MOD_VDSTI 233 -#define HSM2_MOD_MUESTI1 235 -#define HSM2_MOD_MUESTI2 236 -#define HSM2_MOD_MUESTI3 237 -#define HSM2_MOD_NSUBPSTI1 238 -#define HSM2_MOD_NSUBPSTI2 239 -#define HSM2_MOD_NSUBPSTI3 240 -#define HSM2_MOD_NSUBCSTI1 198 -#define HSM2_MOD_NSUBCSTI2 247 -#define HSM2_MOD_NSUBCSTI3 252 -#define HSM2_MOD_LPEXT 241 -#define HSM2_MOD_NPEXT 242 -#define HSM2_MOD_NPEXTW 471 -#define HSM2_MOD_NPEXTWP 472 -#define HSM2_MOD_SCP22 243 -#define HSM2_MOD_SCP21 244 -#define HSM2_MOD_BS1 245 -#define HSM2_MOD_BS2 246 -#define HSM2_MOD_KAPPA 251 -#define HSM2_MOD_VDIFFJ 254 -#define HSM2_MOD_DLY1 255 -#define HSM2_MOD_DLY2 256 -#define HSM2_MOD_DLY3 257 -#define HSM2_MOD_NFTRP 258 -#define HSM2_MOD_NFALP 259 -#define HSM2_MOD_FALPH 263 -#define HSM2_MOD_CIT 260 -#define HSM2_MOD_OVSLP 261 -#define HSM2_MOD_OVMAG 262 -#define HSM2_MOD_GIDL4 281 -#define HSM2_MOD_GIDL5 282 -#define HSM2_MOD_GIDL6 189 -#define HSM2_MOD_GIDL7 194 -#define HSM2_MOD_SVGS 283 -#define HSM2_MOD_SVBS 284 -#define HSM2_MOD_SVBSL 285 -#define HSM2_MOD_SVDS 286 -#define HSM2_MOD_SLG 287 -#define HSM2_MOD_SUB1L 290 -#define HSM2_MOD_SUB2L 292 -#define HSM2_MOD_VOVERS 303 -#define HSM2_MOD_VOVERSP 304 -#define HSM2_MOD_SVGSL 305 -#define HSM2_MOD_SVGSLP 306 -#define HSM2_MOD_SVGSWP 307 -#define HSM2_MOD_SVGSW 308 -#define HSM2_MOD_SVBSLP 309 -#define HSM2_MOD_SLGL 310 -#define HSM2_MOD_SLGLP 311 -#define HSM2_MOD_SUB1LP 312 -#define HSM2_MOD_IBPC1 404 -#define HSM2_MOD_IBPC2 405 -#define HSM2_MOD_MPHDFM 409 - -#define HSM2_MOD_PTL 450 -#define HSM2_MOD_PTP 451 -#define HSM2_MOD_PT2 452 -#define HSM2_MOD_PTLP 455 -#define HSM2_MOD_GDL 453 -#define HSM2_MOD_GDLP 454 - -#define HSM2_MOD_GDLD 456 -#define HSM2_MOD_PT4 457 -#define HSM2_MOD_PT4P 465 -#define HSM2_MOD_MUEPHL2 458 -#define HSM2_MOD_MUEPLP2 459 -#define HSM2_MOD_NSUBCW2 461 -#define HSM2_MOD_NSUBCWP2 462 -#define HSM2_MOD_MUEPHW2 463 -#define HSM2_MOD_MUEPWP2 464 - -/* val symbol for WPE */ -#define HSM2_MOD_WEB 88 -#define HSM2_MOD_WEC 89 -#define HSM2_MOD_NSUBCWPE 91 -#define HSM2_MOD_NPEXTWPE 41 -#define HSM2_MOD_NSUBPWPE 43 - -#define HSM2_MOD_VGSMIN 466 -#define HSM2_MOD_SC3VBS 467 -#define HSM2_MOD_BYPTOL 468 -#define HSM2_MOD_MUECB0LP 473 -#define HSM2_MOD_MUECB1LP 474 - -#define HSM2_MOD_NDEPM 600 -#define HSM2_MOD_NDEPML 610 -#define HSM2_MOD_NDEPMLP 611 -#define HSM2_MOD_TNDEP 601 -#define HSM2_MOD_DEPLEAK 608 -#define HSM2_MOD_DEPLEAKL 614 -#define HSM2_MOD_DEPLEAKLP 615 -#define HSM2_MOD_DEPETA 609 -#define HSM2_MOD_DEPMUE0 275 -#define HSM2_MOD_DEPMUE0L 276 -#define HSM2_MOD_DEPMUE0LP 277 -#define HSM2_MOD_DEPMUE1 278 -#define HSM2_MOD_DEPMUE1L 279 -#define HSM2_MOD_DEPMUE1LP 280 -#define HSM2_MOD_DEPMUEBACK0 288 -#define HSM2_MOD_DEPMUEBACK0L 289 -#define HSM2_MOD_DEPMUEBACK0LP 291 -#define HSM2_MOD_DEPMUEBACK1 293 -#define HSM2_MOD_DEPMUEBACK1L 294 -#define HSM2_MOD_DEPMUEBACK1LP 295 -#define HSM2_MOD_DEPMUEPH0 296 -#define HSM2_MOD_DEPMUEPH1 297 -#define HSM2_MOD_DEPVMAX 298 -#define HSM2_MOD_DEPVMAXL 299 -#define HSM2_MOD_DEPVMAXLP 313 -#define HSM2_MOD_DEPVDSEF1 314 -#define HSM2_MOD_DEPVDSEF1L 315 -#define HSM2_MOD_DEPVDSEF1LP 316 -#define HSM2_MOD_DEPVDSEF2 317 -#define HSM2_MOD_DEPVDSEF2L 318 -#define HSM2_MOD_DEPVDSEF2LP 319 -#define HSM2_MOD_DEPBB 320 -#define HSM2_MOD_DEPMUETMP 321 - - -/* binning parameters */ -#define HSM2_MOD_LMIN 1000 -#define HSM2_MOD_LMAX 1001 -#define HSM2_MOD_WMIN 1002 -#define HSM2_MOD_WMAX 1003 -#define HSM2_MOD_LBINN 1004 -#define HSM2_MOD_WBINN 1005 - -/* Length dependence */ -#define HSM2_MOD_LVMAX 1100 -#define HSM2_MOD_LBGTMP1 1101 -#define HSM2_MOD_LBGTMP2 1102 -#define HSM2_MOD_LEG0 1103 -#define HSM2_MOD_LLOVER 1106 -#define HSM2_MOD_LVFBOVER 1428 -#define HSM2_MOD_LNOVER 1430 -#define HSM2_MOD_LWL2 1407 -#define HSM2_MOD_LVFBC 1121 -#define HSM2_MOD_LNSUBC 1123 -#define HSM2_MOD_LNSUBP 1181 -#define HSM2_MOD_LSCP1 1184 -#define HSM2_MOD_LSCP2 1185 -#define HSM2_MOD_LSCP3 1186 -#define HSM2_MOD_LSC1 1126 -#define HSM2_MOD_LSC2 1127 -#define HSM2_MOD_LSC3 1128 -#define HSM2_MOD_LSC4 1270 -#define HSM2_MOD_LPGD1 1187 -//#define HSM2_MOD_LPGD3 1189 -#define HSM2_MOD_LNDEP 1129 -#define HSM2_MOD_LNINV 1130 -#define HSM2_MOD_LMUECB0 1131 -#define HSM2_MOD_LMUECB1 1132 -#define HSM2_MOD_LMUEPH1 1133 -#define HSM2_MOD_LVTMP 1141 -#define HSM2_MOD_LWVTH0 1142 -#define HSM2_MOD_LMUESR1 1143 -#define HSM2_MOD_LMUETMP 1195 -#define HSM2_MOD_LSUB1 1151 -#define HSM2_MOD_LSUB2 1152 -#define HSM2_MOD_LSVDS 1286 -#define HSM2_MOD_LSVBS 1284 -#define HSM2_MOD_LSVGS 1283 -#define HSM2_MOD_LNSTI 1225 -#define HSM2_MOD_LWSTI 1226 -#define HSM2_MOD_LSCSTI1 1229 -#define HSM2_MOD_LSCSTI2 1230 -#define HSM2_MOD_LVTHSTI 1232 -#define HSM2_MOD_LMUESTI1 1235 -#define HSM2_MOD_LMUESTI2 1236 -#define HSM2_MOD_LMUESTI3 1237 -#define HSM2_MOD_LNSUBPSTI1 1238 -#define HSM2_MOD_LNSUBPSTI2 1239 -#define HSM2_MOD_LNSUBPSTI3 1240 -#define HSM2_MOD_LNSUBCSTI1 253 -#define HSM2_MOD_LNSUBCSTI2 264 -#define HSM2_MOD_LNSUBCSTI3 265 -#define HSM2_MOD_LCGSO 1154 -#define HSM2_MOD_LCGDO 1155 -#define HSM2_MOD_LJS0 1157 -#define HSM2_MOD_LJS0SW 1158 -#define HSM2_MOD_LNJ 1159 -#define HSM2_MOD_LCISBK 1172 -#define HSM2_MOD_LCLM1 1191 -#define HSM2_MOD_LCLM2 1192 -#define HSM2_MOD_LCLM3 1193 -#define HSM2_MOD_LWFC 1201 -#define HSM2_MOD_LGIDL1 1205 -#define HSM2_MOD_LGIDL2 1206 -#define HSM2_MOD_LGLEAK1 1208 -#define HSM2_MOD_LGLEAK2 1209 -#define HSM2_MOD_LGLEAK3 1210 -#define HSM2_MOD_LGLEAK6 1213 -#define HSM2_MOD_LGLKSD1 1215 -#define HSM2_MOD_LGLKSD2 1216 -#define HSM2_MOD_LGLKB1 1218 -#define HSM2_MOD_LGLKB2 1219 -#define HSM2_MOD_LNFTRP 1258 -#define HSM2_MOD_LNFALP 1259 -#define HSM2_MOD_LVDIFFJ 1254 -#define HSM2_MOD_LIBPC1 1404 -#define HSM2_MOD_LIBPC2 1405 - -/* Width dependence */ -#define HSM2_MOD_WVMAX 2100 -#define HSM2_MOD_WBGTMP1 2101 -#define HSM2_MOD_WBGTMP2 2102 -#define HSM2_MOD_WEG0 2103 -#define HSM2_MOD_WLOVER 2106 -#define HSM2_MOD_WVFBOVER 2428 -#define HSM2_MOD_WNOVER 2430 -#define HSM2_MOD_WWL2 2407 -#define HSM2_MOD_WVFBC 2121 -#define HSM2_MOD_WNSUBC 2123 -#define HSM2_MOD_WNSUBP 2181 -#define HSM2_MOD_WSCP1 2184 -#define HSM2_MOD_WSCP2 2185 -#define HSM2_MOD_WSCP3 2186 -#define HSM2_MOD_WSC1 2126 -#define HSM2_MOD_WSC2 2127 -#define HSM2_MOD_WSC3 2128 -#define HSM2_MOD_WSC4 2270 -#define HSM2_MOD_WPGD1 2187 -//#define HSM2_MOD_WPGD3 2189 -#define HSM2_MOD_WNDEP 2129 -#define HSM2_MOD_WNINV 2130 -#define HSM2_MOD_WMUECB0 2131 -#define HSM2_MOD_WMUECB1 2132 -#define HSM2_MOD_WMUEPH1 2133 -#define HSM2_MOD_WVTMP 2141 -#define HSM2_MOD_WWVTH0 2142 -#define HSM2_MOD_WMUESR1 2143 -#define HSM2_MOD_WMUETMP 2195 -#define HSM2_MOD_WSUB1 2151 -#define HSM2_MOD_WSUB2 2152 -#define HSM2_MOD_WSVDS 2286 -#define HSM2_MOD_WSVBS 2284 -#define HSM2_MOD_WSVGS 2283 -#define HSM2_MOD_WNSTI 2225 -#define HSM2_MOD_WWSTI 2226 -#define HSM2_MOD_WSCSTI1 2229 -#define HSM2_MOD_WSCSTI2 2230 -#define HSM2_MOD_WVTHSTI 2232 -#define HSM2_MOD_WMUESTI1 2235 -#define HSM2_MOD_WMUESTI2 2236 -#define HSM2_MOD_WMUESTI3 2237 -#define HSM2_MOD_WNSUBPSTI1 2238 -#define HSM2_MOD_WNSUBPSTI2 2239 -#define HSM2_MOD_WNSUBPSTI3 2240 -#define HSM2_MOD_WNSUBCSTI1 266 -#define HSM2_MOD_WNSUBCSTI2 267 -#define HSM2_MOD_WNSUBCSTI3 268 -#define HSM2_MOD_WCGSO 2154 -#define HSM2_MOD_WCGDO 2155 -#define HSM2_MOD_WJS0 2157 -#define HSM2_MOD_WJS0SW 2158 -#define HSM2_MOD_WNJ 2159 -#define HSM2_MOD_WCISBK 2172 -#define HSM2_MOD_WCLM1 2191 -#define HSM2_MOD_WCLM2 2192 -#define HSM2_MOD_WCLM3 2193 -#define HSM2_MOD_WWFC 2201 -#define HSM2_MOD_WGIDL1 2205 -#define HSM2_MOD_WGIDL2 2206 -#define HSM2_MOD_WGLEAK1 2208 -#define HSM2_MOD_WGLEAK2 2209 -#define HSM2_MOD_WGLEAK3 2210 -#define HSM2_MOD_WGLEAK6 2213 -#define HSM2_MOD_WGLKSD1 2215 -#define HSM2_MOD_WGLKSD2 2216 -#define HSM2_MOD_WGLKB1 2218 -#define HSM2_MOD_WGLKB2 2219 -#define HSM2_MOD_WNFTRP 2258 -#define HSM2_MOD_WNFALP 2259 -#define HSM2_MOD_WVDIFFJ 2254 -#define HSM2_MOD_WIBPC1 2404 -#define HSM2_MOD_WIBPC2 2405 - -/* Cross-term dependence */ -#define HSM2_MOD_PVMAX 3100 -#define HSM2_MOD_PBGTMP1 3101 -#define HSM2_MOD_PBGTMP2 3102 -#define HSM2_MOD_PEG0 3103 -#define HSM2_MOD_PLOVER 3106 -#define HSM2_MOD_PVFBOVER 3428 -#define HSM2_MOD_PNOVER 3430 -#define HSM2_MOD_PWL2 3407 -#define HSM2_MOD_PVFBC 3121 -#define HSM2_MOD_PNSUBC 3123 -#define HSM2_MOD_PNSUBP 3181 -#define HSM2_MOD_PSCP1 3184 -#define HSM2_MOD_PSCP2 3185 -#define HSM2_MOD_PSCP3 3186 -#define HSM2_MOD_PSC1 3126 -#define HSM2_MOD_PSC2 3127 -#define HSM2_MOD_PSC3 3128 -#define HSM2_MOD_PSC4 3270 -#define HSM2_MOD_PPGD1 3187 -//#define HSM2_MOD_PPGD3 3189 -#define HSM2_MOD_PNDEP 3129 -#define HSM2_MOD_PNINV 3130 -#define HSM2_MOD_PMUECB0 3131 -#define HSM2_MOD_PMUECB1 3132 -#define HSM2_MOD_PMUEPH1 3133 -#define HSM2_MOD_PVTMP 3141 -#define HSM2_MOD_PWVTH0 3142 -#define HSM2_MOD_PMUESR1 3143 -#define HSM2_MOD_PMUETMP 3195 -#define HSM2_MOD_PSUB1 3151 -#define HSM2_MOD_PSUB2 3152 -#define HSM2_MOD_PSVDS 3286 -#define HSM2_MOD_PSVBS 3284 -#define HSM2_MOD_PSVGS 3283 -#define HSM2_MOD_PNSTI 3225 -#define HSM2_MOD_PWSTI 3226 -#define HSM2_MOD_PSCSTI1 3229 -#define HSM2_MOD_PSCSTI2 3230 -#define HSM2_MOD_PVTHSTI 3232 -#define HSM2_MOD_PMUESTI1 3235 -#define HSM2_MOD_PMUESTI2 3236 -#define HSM2_MOD_PMUESTI3 3237 -#define HSM2_MOD_PNSUBPSTI1 3238 -#define HSM2_MOD_PNSUBPSTI2 3239 -#define HSM2_MOD_PNSUBPSTI3 3240 -#define HSM2_MOD_PNSUBCSTI1 269 -#define HSM2_MOD_PNSUBCSTI2 270 -#define HSM2_MOD_PNSUBCSTI3 271 -#define HSM2_MOD_PCGSO 3154 -#define HSM2_MOD_PCGDO 3155 -#define HSM2_MOD_PJS0 3157 -#define HSM2_MOD_PJS0SW 3158 -#define HSM2_MOD_PNJ 3159 -#define HSM2_MOD_PCISBK 3172 -#define HSM2_MOD_PCLM1 3191 -#define HSM2_MOD_PCLM2 3192 -#define HSM2_MOD_PCLM3 3193 -#define HSM2_MOD_PWFC 3201 -#define HSM2_MOD_PGIDL1 3205 -#define HSM2_MOD_PGIDL2 3206 -#define HSM2_MOD_PGLEAK1 3208 -#define HSM2_MOD_PGLEAK2 3209 -#define HSM2_MOD_PGLEAK3 3210 -#define HSM2_MOD_PGLEAK6 3213 -#define HSM2_MOD_PGLKSD1 3215 -#define HSM2_MOD_PGLKSD2 3216 -#define HSM2_MOD_PGLKB1 3218 -#define HSM2_MOD_PGLKB2 3219 -#define HSM2_MOD_PNFTRP 3258 -#define HSM2_MOD_PNFALP 3259 -#define HSM2_MOD_PVDIFFJ 3254 -#define HSM2_MOD_PIBPC1 3404 -#define HSM2_MOD_PIBPC2 3405 - -/* device questions */ -#define HSM2_DNODE 341 -#define HSM2_GNODE 342 -#define HSM2_SNODE 343 -#define HSM2_BNODE 344 -#define HSM2_DNODEPRIME 345 -#define HSM2_SNODEPRIME 346 -#define HSM2_BNODEPRIME 395 -#define HSM2_DBNODE 396 -#define HSM2_SBNODE 397 -#define HSM2_VBD 347 -#define HSM2_VBS 348 -#define HSM2_VGS 349 -#define HSM2_VDS 350 -#define HSM2_CD 351 -#define HSM2_CBS 352 -#define HSM2_CBD 353 -#define HSM2_GM 354 -#define HSM2_GDS 355 -#define HSM2_GMBS 356 -#define HSM2_GBD 357 -#define HSM2_GBS 358 -#define HSM2_QB 359 -#define HSM2_CQB 360 -#define HSM2_QG 361 -#define HSM2_CQG 362 -#define HSM2_QD 363 -#define HSM2_CQD 364 -#define HSM2_CGG 365 -#define HSM2_CGD 366 -#define HSM2_CGS 367 -#define HSM2_CBG 368 -#define HSM2_CAPBD 369 -#define HSM2_CQBD 370 -#define HSM2_CAPBS 371 -#define HSM2_CQBS 372 -#define HSM2_CDG 373 -#define HSM2_CDD 374 -#define HSM2_CDS 375 -#define HSM2_VON 376 -#define HSM2_VDSAT 377 -#define HSM2_QBS 378 -#define HSM2_QBD 379 -#define HSM2_SOURCECONDUCT 380 -#define HSM2_DRAINCONDUCT 381 -#define HSM2_CBDB 382 -#define HSM2_CBSB 383 -#define HSM2_MOD_RBPB 389 -#define HSM2_MOD_RBPD 390 -#define HSM2_MOD_RBPS 391 -#define HSM2_MOD_RBDB 392 -#define HSM2_MOD_RBSB 393 -#define HSM2_MOD_GBMIN 394 - -#define HSM2_ISUB 410 -#define HSM2_IGIDL 411 -#define HSM2_IGISL 412 -#define HSM2_IGD 413 -#define HSM2_IGS 414 -#define HSM2_IGB 415 -#define HSM2_CGSO 416 -#define HSM2_CGBO 417 -#define HSM2_CGDO 418 - -#define HSM2_MOD_TCJBD 92 -#define HSM2_MOD_TCJBS 93 -#define HSM2_MOD_TCJBDSW 94 -#define HSM2_MOD_TCJBSSW 95 -#define HSM2_MOD_TCJBDSWG 96 -#define HSM2_MOD_TCJBSSWG 97 - -#define HSM2_MOD_VGS_MAX 4001 -#define HSM2_MOD_VGD_MAX 4002 -#define HSM2_MOD_VGB_MAX 4003 -#define HSM2_MOD_VDS_MAX 4004 -#define HSM2_MOD_VBS_MAX 4005 -#define HSM2_MOD_VBD_MAX 4006 -#define HSM2_MOD_VGSR_MAX 4007 -#define HSM2_MOD_VGDR_MAX 4008 -#define HSM2_MOD_VGBR_MAX 4009 -#define HSM2_MOD_VBSR_MAX 4010 -#define HSM2_MOD_VBDR_MAX 4011 - -#include "hsm2ext.h" - -/* -#ifdef __STDC__ -extern void HSM2evaluate(double,double,double,HSM2instance*,HSM2model*, - double*,double*,double*, double*, double*, double*, double*, - double*, double*, double*, double*, double*, double*, double*, - double*, double*, double*, double*, CKTcircuit*); -#else -extern void HSM2evaluate(); -#endif -*/ - -#endif /*HSM2*/ - diff --git a/src/spicelib/devices/hisim2/hsm2eval.c b/src/spicelib/devices/hisim2/hsm2eval.c deleted file mode 100644 index 87fa9ce5e..000000000 --- a/src/spicelib/devices/hisim2/hsm2eval.c +++ /dev/null @@ -1,8240 +0,0 @@ -/*********************************************************************** - - HiSIM (Hiroshima University STARC IGFET Model) - Copyright (C) 2014 Hiroshima University & STARC - - MODEL NAME : HiSIM - ( VERSION : 2 SUBVERSION : 8 REVISION : 0 ) - - FILE : hsm2eval.c - - Date : 2014.6.5 - - released by - Hiroshima University & - Semiconductor Technology Academic Research Center (STARC) -***********************************************************************/ - -/********************************************************************** - -The following source code, and all copyrights, trade secrets or other -intellectual property rights in and to the source code in its entirety, -is owned by the Hiroshima University and the STARC organization. - -All users need to follow the "HiSIM2 Distribution Statement and -Copyright Notice" attached to HiSIM2 model. - ------HiSIM2 Distribution Statement and Copyright Notice-------------- - -Software is distributed as is, completely without warranty or service -support. Hiroshima University or STARC and its employees are not liable -for the condition or performance of the software. - -Hiroshima University and STARC own the copyright and grant users a perpetual, -irrevocable, worldwide, non-exclusive, royalty-free license with respect -to the software as set forth below. - -Hiroshima University and STARC hereby disclaim all implied warranties. - -Hiroshima University and STARC grant the users the right to modify, copy, -and redistribute the software and documentation, both within the user's -organization and externally, subject to the following restrictions - -1. The users agree not to charge for Hiroshima University and STARC code -itself but may charge for additions, extensions, or support. - -2. In any product based on the software, the users agree to acknowledge -Hiroshima University and STARC that developed the software. This -acknowledgment shall appear in the product documentation. - -3. The users agree to reproduce any copyright notice which appears on -the software on any copy or modification of such made available -to others." - - -*************************************************************************/ - -/********************************************************************* -* Memorandum on programming -* -* (1) Bias (x: b|d|g) -* . vxs : Input argument. -* . Vxse: External bias taking account device type (pMOS->nMOS). -* . Vxsc: Confined bias within a specified region. -* . Vxs : Internal bias. -* . Y_dVxs denotes the partial derivative of Y w.r.t. Vxs. -* -* (2) Device Mode -* . Normal mode (Vds>0 for nMOS) is assumed. -* . In case of reverse mode, parent routines have to properly -* transform or interchange inputs and outputs except ones -* related to junction diodes, which are regarded as being -* fixed to the nodal S/D. -* -* (3) Modification for symmetry at Vds=0 -* . Vxsz: Modified bias. (x: b|d|g) -* . Ps0z: Modified Ps0. -* . The following variables are calculated as a function of -* modified biases or potential. -* Tox, Cox, (-- with quantum effect) -* Vth*, dVth*, dPpg, Igate, Igidl, Igisl. -* . The following variables are calculated using a transform -* function. -* Lred -* -* (4) Zones and Cases (terminology) -* -* Chi:=beta*(Ps0-Vbs)= 0 3 5 -* -* Zone: A | D1 | D2 | D3 -* | -* (accumulation)|(depletion) -* | -* Vgs = Vgs_fb Vth -* / / -* Case: Nonconductive / Conductive -* / -* VgVt:=Qn0/Cox= VgVt_small -* -* . Ids is regarded as zero in zone-A. -* . Procedure to calculate Psl and dependent variables is -* omitted in the nonconductive case. Ids and Qi are regarded -* as zero in this case. -* -*********************************************************************/ - -/*===========================================================* -* Preamble. -*=================*/ -/*---------------------------------------------------* -* Header files. -*-----------------*/ -#include "ngspice/ngspice.h" -#ifdef __STDC__ -/* #include */ -#endif -#include "ngspice/cktdefs.h" - -/*-----------------------------------* -* HiSIM macros -*-----------------*/ -#include "hisim2.h" -#include "hsm2evalenv.h" - -/*-----------------------------------* -* HiSIM constants -*-----------------*/ -#define C_sce_dlt (1.0e-2) -#define C_gidl_delta 0.5 -#define C_PSLK_DELTA 1e-3 /* delta for Pslk smoothing */ -#define C_PSLK_SHIFT 1.0 /* constant value for temporary shift */ -#define C_IDD_MIN 1.0e-15 - -/*===========================================================* -* pow -*=================*/ -#ifdef POW_TO_EXP_AND_LOG -#define Fn_Pow( x , y ) ( (x==0.0) ? 0.0 : exp( (y) * log( x ) ) ) -#else -#define Fn_Pow( x , y ) ( (x==0.0) ? 0.0 : pow( x , y ) ) -#endif - -/*===========================================================* -* Exp() for PGD. -* - ExpLim(-3)=0 -*=================*/ - -#define Fn_ExpLim( y , x , dx ) { \ - if ( (x) < -3.0 ) { \ - dx = 0.0 ; \ - y = 0.0 ; \ - } else if ( (x) < 0.0 ) { \ - dx = 1.0 + (x) * ( 2 * (1.0/3.0) + (x) * 3 * (1.0/27.0) ) ; \ - y = 1.0 + (x) * ( 1.0 + (x) * ( (1.0/3.0) + (x) * (1.0/27.0) ) ) ; \ - } else { \ - dx = 1.0 + (x) * ( 2 * (1.0/3.0) + (x) * ( 3 * 0.0402052934513951 \ - + (x) * 4 * 0.148148111111111 ) ) ; \ - y = 1.0 + (x) * ( 1.0 + (x) * ( (1.0/3.0) + (x) * ( 0.0402052934513951 \ - + (x) * 0.148148111111111 ) ) ) ; \ - } \ -} - -/*===========================================================* -* Ceiling, smoothing functions. -*=================*/ -/*---------------------------------------------------* -* smoothUpper: ceiling. -* y = xmax - 0.5 ( arg + sqrt( arg^2 + 4 xmax delta ) ) -* arg = xmax - x - delta -*-----------------*/ - -#define Fn_SU( y , x , xmax , delta , dx ) { \ - double TMF1, TMF2; \ - TMF1 = ( xmax ) - ( x ) - ( delta ) ; \ - TMF2 = 4.0 * ( xmax ) * ( delta) ; \ - TMF2 = TMF2 > 0.0 ? TMF2 : - ( TMF2 ) ; \ - TMF2 = sqrt ( TMF1 * TMF1 + TMF2 ) ; \ - dx = 0.5 * ( 1.0 + TMF1 / TMF2 ) ; \ - y = ( xmax ) - 0.5 * ( TMF1 + TMF2 ) ; \ - } - -#define Fn_SU2( y , x , xmax , delta , dy_dx , dy_dxmax ) { \ - double TMF1, TMF2; \ - TMF1 = ( xmax ) - ( x ) - ( delta ) ; \ - TMF2 = 4.0 * ( xmax ) * ( delta) ; \ - TMF2 = TMF2 > 0.0 ? TMF2 : - ( TMF2 ) ; \ - TMF2 = sqrt ( TMF1 * TMF1 + TMF2 ) ; \ - dy_dx = 0.5 * ( 1.0 + TMF1 / TMF2 ) ; \ - dy_dxmax = 0.5 * ( 1.0 - ( TMF1 + 2.0 * delta ) / TMF2 ) ; \ - y = ( xmax ) - 0.5 * ( TMF1 + TMF2 ) ; \ - } - -/*---------------------------------------------------* -* smoothLower: flooring. -* y = xmin + 0.5 ( arg + sqrt( arg^2 + 4 xmin delta ) ) -* arg = x - xmin - delta -*-----------------*/ - -#define Fn_SL( y , x , xmin , delta , dx ) { \ - double TMF1, TMF2; \ - TMF1 = ( x ) - ( xmin ) - ( delta ) ; \ - TMF2 = 4.0 * ( xmin ) * ( delta ) ; \ - TMF2 = TMF2 > 0.0 ? TMF2 : - ( TMF2 ) ; \ - TMF2 = sqrt ( TMF1 * TMF1 + TMF2 ) ; \ - dx = 0.5 * ( 1.0 + TMF1 / TMF2 ) ; \ - y = ( xmin ) + 0.5 * ( TMF1 + TMF2 ) ; \ - } - -/*---------------------------------------------------* -* smoothZero: flooring to zero. -* y = 0.5 ( x + sqrt( x^2 + 4 delta^2 ) ) -*-----------------*/ - -#define Fn_SZ( y , x , delta , dx ) { \ - double TMF2; \ - TMF2 = sqrt ( ( x ) * ( x ) + 4.0 * ( delta ) * ( delta) ) ; \ - dx = 0.5 * ( 1.0 + ( x ) / TMF2 ) ; \ - y = 0.5 * ( ( x ) + TMF2 ) ; \ - if( y < 0.0 ) { y=0.0; dx=0.0; } \ - } -#if 0 -/*---------------------------------------------------* -* smoothZero: flooring to zero. -* y = 0.5 ( x + sqrt( x^2 + 4 delta^2 ) ) -*-----------------*/ -static double smoothZero -( - double x, - double delta, - double *dx - ) -{ - double sqr = sqrt ( x * x + 4.0 * delta * delta) ; - if (dx) *dx = 0.5 * ( 1.0 + x / sqr ) ; - return 0.5 * ( x + sqr ) ; -} -/*---------------------------------------------------* -* CeilingPow: ceiling for positive x, flooring for negative x. -* y = x * xmax / ( x^{2m} + xmax^{2m} )^{1/(2m)} -* note: -* - xmax has to be positive. -* - -xmax < y < xmax. -* - dy/dx|_{x=0} = 1. -*-----------------*/ -static double CeilingPow -( - double x, - double xmax, - int pw, - double *dx - ) -{ - double x2 = x * x ; - double xmax2 = xmax * xmax ; - double xp = 1.0 , xmp = 1.0 ; - int m , mm ; - double arg , dnm ; - double result ; - - for ( m = 0 ; m < pw ; m ++ ) { - xp *= x2 ; - xmp *= xmax2 ; - } - arg = xp + xmp ; - dnm = arg ; - if ( pw == 1 || pw == 2 || pw == 4 || pw == 8 ) { - if ( pw == 1 ) { - mm = 1 ; - } else if ( pw == 2 ) { - mm = 2 ; - } else if ( pw == 4 ) { - mm = 3 ; - } else if ( pw == 8 ) { - mm = 4 ; - } - for ( m = 0 ; m < mm ; m ++ ) { - dnm = sqrt( dnm ) ; - } - } else { - dnm = pow( dnm , 1.0 / ( 2.0 * pw ) ) ; - } - dnm = 1.0 / dnm ; - result = x * xmax * dnm ; - (*dx) = xmax * xmp * dnm / arg ; - return result ; -} -#endif -/*---------------------------------------------------* -* CeilingPow: ceiling for positive x, flooring for negative x. -* y = x * xmax / ( x^{2m} + xmax^{2m} )^{1/(2m)} -* note: -* - xmax has to be positive. -* - -xmax < y < xmax. -* - dy/dx|_{x=0} = 1. -*-----------------*/ - -#define Fn_CP( y , x , xmax , pw , dx ) { \ - double x2 = (x) * (x) ; \ - double xmax2 = (xmax) * (xmax) ; \ - double xp = 1.0 , xmp = 1.0 ; \ - int m , mm ; \ - double arg_cp , dnm ; \ - for ( m = 0 ; m < pw ; m ++ ) { xp *= x2 ; xmp *= xmax2 ; } \ - arg_cp = xp + xmp ; \ - dnm = arg_cp ; \ - if ( pw == 1 || pw == 2 || pw == 4 || pw == 8 ) { \ - if ( pw == 1 ) { mm = 1 ; \ - } else if ( pw == 2 ) { mm = 2 ; \ - } else if ( pw == 4 ) { mm = 3 ; \ - } else if ( pw == 8 ) { mm = 4 ; } \ - for ( m = 0 ; m < mm ; m ++ ) { dnm = sqrt( dnm ) ; } \ - } else { dnm = Fn_Pow( dnm , 1.0 / ( 2.0 * pw ) ) ; } \ - dnm = 1.0 / dnm ; \ - y = (x) * (xmax) * dnm ; \ - dx = (xmax) * xmp * dnm / arg_cp ; \ -} - -#define Fn_SU_CP2( y , x , xmax , delta , pw , dx , dxmax ) { \ - if(x > xmax - delta && delta >= 0.0) { \ - double TMF0, TMF1; \ - TMF1 = x - xmax + delta ; \ - Fn_CP( TMF0 , TMF1 , delta , pw , dx ) \ - y = xmax - delta + TMF0 ; \ - dx = dx ; \ - dxmax = 1.0-dx ; \ - } else { \ - y = x ; \ - dx = 1.0 ; \ - dxmax = 0.0 ; \ - } \ -} - -#define Fn_CP2( y , x , xmax , pw , dx , dxmax ) { \ - double x2 = (x) * (x) ; \ - double xmax2 = (xmax) * (xmax) ; \ - double xp = 1.0 , xmp = 1.0 ; \ - int m =0, mm =0; \ - double arg_cp2 =0.0, dnm =0.0; \ - for ( m = 0 ; m < pw ; m ++ ) { xp *= x2 ; xmp *= xmax2 ; } \ - arg_cp2 = xp + xmp ; \ - dnm = arg_cp2 ; \ - if ( pw == 1 || pw == 2 || pw == 4 || pw == 8 ) { \ - if ( pw == 1 ) { mm = 1 ; \ - } else if ( pw == 2 ) { mm = 2 ; \ - } else if ( pw == 4 ) { mm = 3 ; \ - } else if ( pw == 8 ) { mm = 4 ; } \ - for ( m = 0 ; m < mm ; m ++ ) { dnm = sqrt( dnm ) ; } \ - } else { dnm = Fn_Pow( dnm , 1.0 / ( 2.0 * pw ) ) ; } \ - dnm = 1.0 / dnm ; \ - y = (x) * (xmax) * dnm ; \ - dx = (xmax) * xmp * dnm / arg_cp2 ; \ - dxmax = (x) * xp * dnm / arg_cp2 ; \ -} - -#define Fn_SU_CP3( y , x , xmax , delta , pw , dx , dxmax , ddelta ) { \ - if(x > xmax - delta && delta >= 0.0) { \ - double TMF0, TMF1; \ - TMF1 = x - xmax + delta ; \ - Fn_CP2( TMF0 , TMF1 , delta , pw , dx , ddelta ) \ - y = xmax - delta + TMF0 ; \ - dx = dx ; \ - dxmax = 1.0-dx ; \ - ddelta = -1.0+dx+ddelta; \ - } else { \ - y = x ; \ - dx = 1.0 ; \ - dxmax = 0.0 ; \ - ddelta = 0.0 ; \ - } \ -} - -#define Fn_SU_CP( y , x , xmax , delta , pw , dx ) { \ - if(x > xmax - delta && delta >= 0.0) { \ - double TMF0, TMF1; \ - TMF1 = x - xmax + delta ; \ - Fn_CP( TMF0 , TMF1 , delta , pw , dx ) \ - y = xmax - delta + TMF0 ; \ - dx = dx ; \ - } else { \ - y = x ; \ - dx = 1.0 ; \ - } \ -} - -#define Fn_SL_CP2( y , x , xmin , delta , pw , dx , dxmin) { \ - if(x < xmin + delta && delta >= 0.0) { \ - double TMF0, TMF1; \ - TMF1 = xmin + delta - x ; \ - Fn_CP( TMF0 , TMF1 , delta , pw , dx ) \ - y = xmin + delta - TMF0 ; \ - dx = dx ; \ - dxmin = 1.0-dx ; \ - } else { \ - y = x ; \ - dx = 1.0 ; \ - dxmin = 0.0 ; \ - } \ -} -#define Fn_SL_CP( y , x , xmin , delta , pw , dx ) { \ - if(x < xmin + delta && delta >= 0.0) { \ - double TMF0, TMF1; \ - TMF1 = xmin + delta - x ; \ - Fn_CP( TMF0 , TMF1 , delta , pw , dx ) \ - y = xmin + delta - TMF0 ; \ - dx = dx ; \ - } else { \ - y = x ; \ - dx = 1.0 ; \ - } \ -} - - - -/*===========================================================* -* Functions for symmetry. -*=================*/ - -/*---------------------------------------------------* -* Declining function using a polynomial. -*-----------------*/ - -#define Fn_DclPoly4( y , x , dx ) { \ - double TMF2, TMF3, TMF4; \ - TMF2 = (x) * (x) ; \ - TMF3 = TMF2 * (x) ; \ - TMF4 = TMF2 * TMF2 ; \ - y = 1.0 / ( 1.0 + (x) + TMF2 + TMF3 + TMF4 ) ; \ - dx = - ( 1.0 + 2.0 * (x) + 3.0 * TMF2 + 4.0 * TMF3 ) * y * y ; \ -} - -/*---------------------------------------------------* -* "smoothUpper" uasing a polynomial -*-----------------*/ - -#define Fn_SUPoly4( y , x , xmax , dx ) { \ - double TMF1; \ - TMF1 = (x) / xmax ; \ - Fn_DclPoly4( y , TMF1 , dx ) ; \ - y = xmax * ( 1.0 - y ) ; \ - dx = - dx ; \ -} - -#define Fn_SUPoly4m( y , x , xmax , dx , dxmax ) { \ - double TMF0, TMF1; \ - TMF1 = (x) / xmax ; \ - Fn_DclPoly4( TMF0 , TMF1 , dx ) ; \ - y = xmax * ( 1.0 - TMF0 ) ; \ - dxmax = 1.0 - TMF0 + TMF1 * dx ; \ - dx = - dx ; \ -} - - -/*---------------------------------------------------* -* SymAdd: evaluate additional term for symmetry. -*-----------------*/ - -#define Fn_SymAdd( y , x , add0 , dx ) \ -{ \ - double TMF1, TMF2, TMF3; \ - TMF1 = 2.0 * ( x ) / ( add0 ) ; \ - TMF2 = 1.0 + TMF1 * ( (1.0/2) + TMF1 * ( (1.0/6) \ - + TMF1 * ( (1.0/24) + TMF1 * ( (1.0/120) \ - + TMF1 * ( (1.0/720) + TMF1 * (1.0/5040) ) ) ) ) ) ; \ - TMF3 = (1.0/2) + TMF1 * ( (1.0/3) \ - + TMF1 * ( (1.0/8) + TMF1 * ( (1.0/30) \ - + TMF1 * ( (1.0/144) + TMF1 * (1.0/840) ) ) ) ) ; \ - y = add0 / TMF2 ; \ - dx = - 2.0 * TMF3 / ( TMF2 * TMF2 ) ; \ -} - -/*===========================================================* -* Function hsm2evaluate. -*=================*/ -int HSM2evaluate -( - double vds, - double vgs, - double vbs, - double vbs_jct, - double vbd_jct, - HSM2instance *here, - HSM2model *model, - CKTcircuit *ckt - ) -{ - HSM2binningParam *pParam = &here->pParam ; - HSM2modelMKSParam *modelMKS = &model->modelMKS ; - /*-----------------------------------* - * Constants for Smoothing functions - *---------------*/ - const double vth_dlt = 1.0e-3 ; - /* const double cclmmdf = 1.0e-2 ;*/ - const double cclmmdf = 1.0e-1 ; - const double qme_dlt = 1.0e-4 ; - const double eef_dlt = 1.0e-2 * C_m2cm ; - const double sti2_dlt = 2.0e-3 ; - const double pol_dlt = 5.0e-2 ; -//const double psia_dlt = 1.0e-3 ; -//const double psia2_dlt = 5.0e-3 ; - const double psisti_dlt = 5.0e-3 ; -//const double jct_dlt = 1.0e-2 ; - - /*---------------------------------------------------* - * Local variables. - *-----------------*/ - /* Constants ----------------------- */ - const int lp_s0_max = 20 ; - const int lp_sl_max = 20 ; - const int lp_se_max = 150 ; - - int lp_bs_max = 10 ; - const double Ids_tol = 1.0e-10 ; - const double Ids_maxvar = 1.0e-1 ; - const double dP_max = 0.1e0 ; - const double ps_conv = 5.0e-13 ; - const double ps_conv2 = 1.0e-10 ; - - /* double ps_conv = 1.0e-13 ;*/ - const double gs_conv = 1.0e-8 ; - const double mini_current = 1.0e-15 ; - /** depletion **/ - const double znbd3 = 3.0e0 ; - const double znbd5 = 5.0e0 ; - const double cn_nc3 = C_SQRT_2 / 108e0 ; - /* 5-degree, contact:Chi=5 */ - const double cn_nc51 = 0.707106781186548 ; /* sqrt(2)/2 */ - const double cn_nc52 = -0.117851130197758 ; /* -sqrt(2)/12 */ - const double cn_nc53 = 0.0178800506338833 ; /* (187 - 112*sqrt(2))/1600 */ - const double cn_nc54 = -0.00163730162779191 ; /* (-131 + 88*sqrt(2))/4000 */ - const double cn_nc55 = 6.36964918866352e-5 ; /* (1509-1040*sqrt(2))/600000 */ - /** inversion **/ - /* 3-degree polynomial approx for ( exp[Chi]-1 )^{1/2} */ - const double cn_im53 = 2.9693154855770998e-1 ; - const double cn_im54 = -7.0536542840097616e-2 ; - const double cn_im55 = 6.1152888951331797e-3 ; - /** initial guess **/ - const double c_ps0ini_2 = 8.0e-4 ; - const double c_pslini_1 = 0.3e0 ; - const double c_pslini_2 = 3.0e-2 ; - - const double VgVt_small = 1.0e-12 ; - const double Vbs_min = -10.5e0 ; - const double epsm10 = 10.0e0 * C_EPS_M ; - const double small = 1.0e-50 ; - const double small2 = 1.0e-12 ; /* for Qover */ - - double Vbs_max = 0.8e0 ; - double Vbs_bnd = 0.4e0 ; /* start point of positive Vbs bending */ - double Gdsmin = 0.0 ; - double Gjmin = ckt->CKTgmin ; - - /* Internal flags --------------------*/ - int flg_err = 0 ; /* error level */ - int flg_rsrd = 0 ; /* Flag for bias loop accounting Rs and Rd */ - int flg_iprv = 0 ; /* Flag for initial guess of Ids */ - int flg_pprv = 0 ; /* Flag for initial guesses of Ps0 and Pds */ - int flg_noqi =0; /* Flag for the cases regarding Qi=Qd=0 */ - int flg_vbsc = 0 ; /* Flag for Vbs confining */ - int flg_info = 0 ; - int flg_conv = 0 ; /* Flag for Poisson loop convergence */ - int flg_qme = 0 ; /* Flag for QME */ - - /* flag for NQS calculation */ - int flg_nqs=0 ; - - /* Important Variables in HiSIM -------*/ - /* external bias */ - double Vbse =0.0, Vdse =0.0, Vgse =0.0 ; - /* confine bias */ - double Vbsc =0.0, Vdsc =0.0, Vgsc =0.0 ; - double Vbsc_dVbse =1.0, Vbsc_dVbse_dVbs =0.0 ; - /* internal bias */ - double Vbs =0.0, Vds =0.0, Vgs =0.0, Vdb =0.0, Vsb =0.0 ; - double Vbs_dVbse = 1.0 , Vbs_dVdse = 0.0 , Vbs_dVgse = 0.0 ; - double Vds_dVbse = 0.0 , Vds_dVdse = 1.0 , Vds_dVgse = 0.0 ; - double Vgs_dVbse = 0.0 , Vgs_dVdse = 0.0 , Vgs_dVgse = 1.0 ; - double Vgp =0.0 ; - double Vgp_dVbs =0.0, Vgp_dVds =0.0, Vgp_dVgs =0.0 ; - double Vgs_fb =0.0 ; - /* Ps0 : surface potential at the source side */ - double Ps0 =0.0 ; - double Ps0_dVbs =0.0, Ps0_dVds =0.0, Ps0_dVgs =0.0 ; - double Ps0_ini =0.0, Ps0_iniA =0.0, Ps0_iniB =0.0 ; - /* Psl : surface potential at the drain side */ - double Psl =0.0 ; - double Psl_dVbs =0.0, Psl_dVds =0.0, Psl_dVgs =0.0 ; - double Psl_lim =0.0, dPlim =0.0 ; - /* Pds := Psl - Ps0 */ - double Pds = 0.0 , Pdsz = 0.0 ; - double Pds_dVbs = 0.0, Pds_dVds = 0.0 , Pds_dVgs = 0.0 ; - double Pdsz_dVbs = 0.0, Pdsz_dVds = 0.0 , Pdsz_dVgs = 0.0 ; - double Pds_ini =0.0 ; - double Pds_max =0.0 ; - /* iteration numbers of Ps0 and Psl equations. */ - int lp_s0 = 0 , lp_sl = 0 ; - /* Xi0 := beta * ( Ps0 - Vbs ) - 1. */ - double Xi0 =0.0 ; - double Xi0_dVbs =0.0, Xi0_dVds =0.0, Xi0_dVgs =0.0 ; - double Xi0p12 =0.0 ; - double Xi0p12_dVbs =0.0, Xi0p12_dVds =0.0, Xi0p12_dVgs =0.0 ; - double Xi0p32 =0.0 ; - /* Xil := beta * ( Psl - Vbs ) - 1. */ - double Xilp12 =0.0 ; - double Xilp32 =0.0 ; - double Xil =0.0 ; - /* modified bias and potential for sym.*/ - double Vbsz =0.0, Vdsz =0.0, Vgsz =0.0 ; - double Vbsz_dVbs =0.0, Vbsz_dVds =0.0 ; - double Vdsz_dVds =0.0, Vdsz_dVbs =0.0 ; - double Vgsz_dVgs =0.0, Vgsz_dVbs =0.0, Vgsz_dVds =0.0 ; - double Vzadd =0.0, Vzadd_dVds =0.0, Vzadd_dVbs =0.0 ; - double Ps0z =0.0, Ps0z_dVbs =0.0, Ps0z_dVds =0.0, Ps0z_dVgs =0.0 ; - double Pzadd =0.0, Pzadd_dVbs =0.0, Pzadd_dVds =0.0, Pzadd_dVgs =0.0 ; - double Vgpz = 0.0 , Vgpz_dVbs = 0.0 , Vgpz_dVds = 0.0 , Vgpz_dVgs = 0.0 ; /* (tmp) */ - - /* IBPC */ - double dVbsIBPC =0.0, dVbsIBPC_dVbs =0.0, dVbsIBPC_dVds =0.0, dVbsIBPC_dVgs =0.0 ; - double betaWL =0.0, betaWL_dVbs =0.0, betaWL_dVds =0.0, betaWL_dVgs =0.0 ; - double Xi0p32_dVbs =0.0, Xi0p32_dVds =0.0, Xi0p32_dVgs =0.0 ; - double Xil_dVbs =0.0, Xil_dVds =0.0, Xil_dVgs =0.0 ; - double Xilp12_dVbs =0.0, Xilp12_dVds =0.0, Xilp12_dVgs =0.0 ; - double Xilp32_dVbs =0.0, Xilp32_dVds =0.0, Xilp32_dVgs =0.0 ; - double dG3 =0.0, dG3_dVbs =0.0, dG3_dVds =0.0, dG3_dVgs =0.0 ; - double dG4 =0.0, dG4_dVbs =0.0, dG4_dVds =0.0, dG4_dVgs =0.0 ; - double dIdd =0.0, dIdd_dVbs =0.0, dIdd_dVds =0.0, dIdd_dVgs =0.0 ; - - /* Chi := beta * ( Ps{0/l} - Vbs ) */ - double Chi =0.0 ; - double Chi_dVbs =0.0, Chi_dVds =0.0, Chi_dVgs =0.0 ; - /* Rho := beta * ( Psl - Vds ) */ - double Rho =0.0 ; - /* threshold voltage */ - double Vth =0.0 ; - double Vth0 =0.0 ; - double Vth0_dVb =0.0, Vth0_dVd =0.0, Vth0_dVg =0.0 ; - /* variation of threshold voltage */ - double dVth =0.0 ; - double dVth_dVb =0.0, dVth_dVd =0.0, dVth_dVg =0.0 ; - double dVth0 =0.0 ; - double dVth0_dVb =0.0, dVth0_dVd =0.0, dVth0_dVg =0.0 ; - double dVthSC =0.0 ; - double dVthSC_dVb =0.0, dVthSC_dVd =0.0, dVthSC_dVg =0.0 ; - double Pb20b =0.0 ; - double Pb20b_dVg =0.0, Pb20b_dVb =0.0, Pb20b_dVd =0.0 ; - double dVthW =0.0 ; - double dVthW_dVb =0.0, dVthW_dVd =0.0, dVthW_dVg =0.0 ; - /* Alpha and related parameters */ - double Alpha =0.0 ; - double Alpha_dVbs =0.0, Alpha_dVds =0.0, Alpha_dVgs =0.0 ; - double Achi =0.0 ; - double Achi_dVbs =0.0, Achi_dVds =0.0, Achi_dVgs =0.0 ; - double VgVt = 0.0 ; - double VgVt_dVbs = 0.0, VgVt_dVds = 0.0, VgVt_dVgs = 0.0 ; - double Pslsat = 0.0 ; - double Vdsat = 0.0 ; - double VdsatS = 0.0 ; - double VdsatS_dVbs = 0.0, VdsatS_dVds = 0.0, VdsatS_dVgs = 0.0 ; - double Delta =0.0 ; - /* Q_B and capacitances */ - double Qb =0.0, Qb_dVbs =0.0, Qb_dVds =0.0, Qb_dVgs =0.0 ; - double Qb_dVbse =0.0, Qb_dVdse =0.0, Qb_dVgse =0.0 ; - double Qbu = 0.0 , Qbu_dVbs = 0.0 , Qbu_dVds = 0.0 , Qbu_dVgs = 0.0 ; - /* Q_I and capacitances */ - double Qi =0.0, Qi_dVbs =0.0, Qi_dVds =0.0, Qi_dVgs =0.0 ; - double Qi_dVbse =0.0, Qi_dVdse =0.0, Qi_dVgse =0.0 ; - double Qiu = 0.0 , Qiu_dVbs = 0.0 , Qiu_dVds = 0.0 , Qiu_dVgs = 0.0 ; - /* Q_D and capacitances */ - double Qd =0.0, Qd_dVbs =0.0, Qd_dVds =0.0, Qd_dVgs =0.0 ; - double Qd_dVbse =0.0, Qd_dVdse =0.0, Qd_dVgse =0.0 ; - double qd_dVgse=0.0, qd_dVdse=0.0, qd_dVbse=0.0, qd_dVsse =0.0 ; - /* channel current */ - double Ids =0.0 ; - double Ids_dVbs =0.0, Ids_dVds =0.0, Ids_dVgs =0.0 ; - double Ids_dVbse =0.0, Ids_dVdse =0.0, Ids_dVgse =0.0 ; - double Ids0 =0.0 ; - double Ids0_dVbs =0.0, Ids0_dVds =0.0, Ids0_dVgs =0.0 ; - /* STI */ - double dVthSCSTI =0.0 ; - double dVthSCSTI_dVg =0.0, dVthSCSTI_dVd =0.0, dVthSCSTI_dVb =0.0 ; - double Vgssti =0.0 ; - double Vgssti_dVbs =0.0, Vgssti_dVds =0.0, Vgssti_dVgs =0.0 ; - double costi0 =0.0, costi1 =0.0, costi3 =0.0 ; - double costi4 =0.0, costi5 =0.0, costi6 =0.0, costi7 =0.0 ; - double costi3_dVb =0.0, costi3_dVd=0.0, costi3_dVg =0.0 ; - double costi3_dVb_c3 =0.0, costi3_dVd_c3=0.0, costi3_dVg_c3 =0.0 ; - double Psasti =0.0 ; - double Psasti_dVbs =0.0, Psasti_dVds =0.0, Psasti_dVgs =0.0 ; - double Psbsti =0.0 ; - double Psbsti_dVbs =0.0, Psbsti_dVds =0.0, Psbsti_dVgs =0.0 ; - double Psab =0.0 ; - double Psab_dVbs =0.0, Psab_dVds =0.0, Psab_dVgs =0.0 ; - double Psti =0.0 ; - double Psti_dVbs =0.0, Psti_dVds =0.0, Psti_dVgs =0.0 ; - double sq1sti =0.0 ; - double sq1sti_dVbs =0.0, sq1sti_dVds =0.0, sq1sti_dVgs =0.0 ; - double sq2sti =0.0 ; - double sq2sti_dVbs =0.0, sq2sti_dVds =0.0, sq2sti_dVgs =0.0 ; - double Qn0sti =0.0 ; - double Qn0sti_dVbs =0.0, Qn0sti_dVds =0.0, Qn0sti_dVgs =0.0 ; - double Idssti =0.0 ; - double Idssti_dVbs =0.0, Idssti_dVds =0.0, Idssti_dVgs =0.0 ; - /* constants */ - double beta =0.0, beta_inv =0.0 ; - double beta2 =0.0 ; - double Pb2 =0.0 ; - double Pb20 =0.0 ; - double Pb2c =0.0 ; - double Vfb =0.0 ; - double c_eox =0.0 ; - double Leff=0.0, Weff =0.0 ; - double q_Nsub =0.0 ; - /* PART-1 */ - /* Accumulation zone */ - double Psa =0.0 ; - double Psa_dVbs =0.0, Psa_dVds =0.0, Psa_dVgs =0.0 ; - /* CLM*/ - double Psdl =0.0, Psdl_dVbs =0.0, Psdl_dVds =0.0, Psdl_dVgs =0.0 ; - double Lred =0.0, Lred_dVbs =0.0, Lred_dVds =0.0, Lred_dVgs =0.0 ; - double Lch =0.0, Lch_dVbs =0.0, Lch_dVds =0.0, Lch_dVgs =0.0 ; - double Wd =0.0, Wd_dVbs =0.0, Wd_dVds =0.0, Wd_dVgs =0.0 ; - double Aclm =0.0 ; - /* Pocket Implant */ - double Vthp=0.0, Vthp_dVb=0.0, Vthp_dVd=0.0, Vthp_dVg =0.0 ; - double dVthLP=0.0, dVthLP_dVb=0.0, dVthLP_dVd=0.0, dVthLP_dVg =0.0 ; - double bs12=0.0, bs12_dVb=0.0, bs12_dVd =0.0, bs12_dVg =0.0 ; - double Qbmm=0.0, Qbmm_dVb=0.0, Qbmm_dVd =0.0, Qbmm_dVg =0.0 ; - double dqb=0.0, dqb_dVb=0.0, dqb_dVg=0.0, dqb_dVd =0.0 ; - double Vdx=0.0, Vdx2 =0.0 ; - double Vdx_dVbs =0.0, Vdx2_dVbs =0.0 ; - double Pbsum=0.0, sqrt_Pbsum =0.0 ; - double Pbsum_dVb=0.0, Pbsum_dVd=0.0, Pbsum_dVg =0.0 ; - /* Poly-Depletion Effect */ - const double pol_b = 1.0 ; - double dPpg =0.0, dPpg_dVb =0.0, dPpg_dVd =0.0, dPpg_dVg =0.0; - /* Quantum Effect */ - double Tox =0.0, Tox_dVb =0.0, Tox_dVd =0.0, Tox_dVg =0.0 ; - double dTox =0.0, dTox_dVb =0.0, dTox_dVd =0.0, dTox_dVg =0.0 ; - double Cox =0.0, Cox_dVb =0.0, Cox_dVd =0.0, Cox_dVg =0.0 ; - double Cox_inv =0.0, Cox_inv_dVb =0.0, Cox_inv_dVd =0.0, Cox_inv_dVg =0.0 ; - double Tox0 =0.0, Cox0 =0.0, Cox0_inv =0.0 ; - double Vthq=0.0, Vthq_dVb =0.0, Vthq_dVd =0.0 ; - /* Igate , Igidl , Igisl */ - const double igate_dlt = 1.0e-2 ; - double Psdlz =0.0, Psdlz_dVbs =0.0, Psdlz_dVds =0.0, Psdlz_dVgs =0.0 ; - double Egp12 =0.0, Egp32 =0.0 ; - double E1 =0.0, E1_dVb =0.0, E1_dVd =0.0, E1_dVg =0.0 ; - double Qb0Cox =0.0, Qb0Cox_dVb =0.0, Qb0Cox_dVd =0.0, Qb0Cox_dVg =0.0 ; - double Etun =0.0, Etun_dVbs =0.0, Etun_dVds =0.0, Etun_dVgs =0.0 ; - double Egidl =0.0, Egidl_dVb =0.0, Egidl_dVd =0.0, Egidl_dVg =0.0 ; - double Egisl =0.0, Egisl_dVb =0.0, Egisl_dVd =0.0, Egisl_dVg =0.0 ; - double Igate =0.0, Igate_dVbs =0.0, Igate_dVds =0.0, Igate_dVgs =0.0 ; - double Igate_dVbse =0.0, Igate_dVdse =0.0, Igate_dVgse =0.0 ; - double Igs =0.0, Igd =0.0, Igb =0.0 ; - double Igs_dVbs =0.0, Igs_dVds =0.0, Igs_dVgs =0.0 ; - double Igs_dVbse =0.0, Igs_dVdse =0.0, Igs_dVgse =0.0 ; - double Igd_dVbs =0.0, Igd_dVds =0.0, Igd_dVgs =0.0 ; - double Igd_dVbse =0.0, Igd_dVdse =0.0, Igd_dVgse =0.0 ; - double Igb_dVbs =0.0, Igb_dVds =0.0, Igb_dVgs =0.0 ; - double Igb_dVbse =0.0, Igb_dVdse =0.0, Igb_dVgse =0.0 ; - double Igidl =0.0, Igidl_dVbs =0.0, Igidl_dVds =0.0, Igidl_dVgs =0.0 ; - double Igidl_dVbse =0.0, Igidl_dVdse =0.0, Igidl_dVgse =0.0 ; - double Igisl =0.0, Igisl_dVbs =0.0, Igisl_dVds =0.0, Igisl_dVgs =0.0 ; - double Igisl_dVbse =0.0, Igisl_dVdse =0.0, Igisl_dVgse =0.0 ; - /* connecting function */ - double FD2 =0.0, FD2_dVbs =0.0, FD2_dVds =0.0, FD2_dVgs =0.0 ; - double FMDVDS =0.0, FMDVDS_dVbs =0.0, FMDVDS_dVds =0.0, FMDVDS_dVgs =0.0 ; - - double cnst0 =0.0, cnst1 =0.0 ; - double cnstCoxi =0.0 , cnstCoxi_dVg =0.0 , cnstCoxi_dVd =0.0 , cnstCoxi_dVb =0.0 ; - double fac1 =0.0 ; - double fac1_dVbs =0.0, fac1_dVds =0.0, fac1_dVgs =0.0 ; - double fac1p2 =0.0 ; - double fs01 =0.0 ; - double fs01_dPs0 =0.0 ; - double fs01_dVbs =0.0, fs01_dVds =0.0, fs01_dVgs =0.0 ; - double fs02 =0.0 ; - double fs02_dPs0 =0.0 ; - double fs02_dVbs =0.0, fs02_dVds =0.0, fs02_dVgs =0.0 ; - double fsl1 =0.0 ; - double fsl1_dPsl =0.0 ; - double fsl1_dVbs =0.0, fsl1_dVds =0.0, fsl1_dVgs =0.0; /* Vdseff */ - double fsl2 =0.0 ; - double fsl2_dPsl =0.0 ; - double fsl2_dVbs =0.0, fsl2_dVds =0.0, fsl2_dVgs =0.0; /* Vdseff */ - double cfs1 =0.0 ; - double fb =0.0, fb_dChi =0.0 ; - double fi =0.0, fi_dChi =0.0 ; - double exp_Chi =0.0, exp_Rho =0.0, exp_bVbs =0.0, exp_bVbsVds =0.0 ; - double Fs0=0.0, Fsl =0.0 ; - double Fs0_dPs0 =0.0, Fsl_dPsl =0.0 ; - double dPs0 =0.0, dPsl =0.0 ; - double Qn0 = 0.0e0 ; - double Qn0_dVbs =0.0, Qn0_dVds =0.0, Qn0_dVgs =0.0 ; - double Qb0 =0.0 ; - double Qb0_dVb =0.0, Qb0_dVd =0.0, Qb0_dVg =0.0 ; - double Qbnm =0.0 ; - double Qbnm_dVbs =0.0, Qbnm_dVds =0.0, Qbnm_dVgs =0.0 ; - double DtPds =0.0 ; - double DtPds_dVbs =0.0, DtPds_dVds =0.0, DtPds_dVgs =0.0 ; - double Qinm =0.0 ; - double Qinm_dVbs =0.0, Qinm_dVds =0.0, Qinm_dVgs =0.0 ; - double Qidn =0.0 ; - double Qidn_dVbs =0.0, Qidn_dVds =0.0, Qidn_dVgs =0.0 ; - double Qdnm =0.0 ; - double Qdnm_dVbs =0.0, Qdnm_dVds =0.0, Qdnm_dVgs =0.0 ; - double Qddn =0.0 ; - double Qddn_dVbs =0.0, Qddn_dVds =0.0, Qddn_dVgs =0.0 ; - double Quot =0.0 ; - double Qdrat = 0.5 ; - double Qdrat_dVbs = 0.0 , Qdrat_dVds = 0.0, Qdrat_dVgs = 0.0 ; - double Qdrat_dVbse =0.0, Qdrat_dVdse =0.0, Qdrat_dVgse =0.0 ; - double Idd =0.0 ; - double Idd_dVbs =0.0, Idd_dVds =0.0, Idd_dVgs =0.0 ; - double Fdd =0.0 ; - double Fdd_dVbs =0.0, Fdd_dVds =0.0, Fdd_dVgs =0.0 ; - double Eeff =0.0 ; - double Eeff_dVbs =0.0, Eeff_dVds =0.0, Eeff_dVgs =0.0 ; - double Rns =0.0 ; - double Mu = 0.0 ; - double Mu_dVbs =0.0, Mu_dVds =0.0, Mu_dVgs =0.0 ; - double Muun =0.0, Muun_dVbs =0.0, Muun_dVds =0.0, Muun_dVgs =0.0 ; - double Ey = 0e0 ; - double Ey_dVbs =0.0, Ey_dVds =0.0, Ey_dVgs =0.0 ; - double Em =0.0 ; - double Em_dVbs =0.0, Em_dVds =0.0, Em_dVgs =0.0 ; - double Vmax =0.0 ; - double Eta =0.0 ; - double Eta_dVbs =0.0, Eta_dVds =0.0, Eta_dVgs =0.0 ; - double Eta1 =0.0, Eta1p12 =0.0, Eta1p32 =0.0, Eta1p52 =0.0 ; - double Zeta12 =0.0, Zeta32 =0.0, Zeta52 =0.0 ; - double F00 =0.0 ; - double F00_dVbs =0.0, F00_dVds =0.0, F00_dVgs =0.0 ; - double F10 =0.0 ; - double F10_dVbs =0.0, F10_dVds =0.0, F10_dVgs =0.0 ; - double F30 =0.0 ; - double F30_dVbs =0.0, F30_dVds =0.0, F30_dVgs =0.0 ; - double F11 =0.0 ; - double F11_dVbs =0.0, F11_dVds =0.0, F11_dVgs =0.0 ; - double Ps0_min =0.0 ; - double Ps0_min_dVbs =0.0, Ps0_min_dVds =0.0, Ps0_min_dVgs =0.0 ; - double Acn =0.0, Acd =0.0, Ac1 =0.0, Ac2 =0.0, Ac3 =0.0, Ac4 =0.0, Ac31 =0.0, Ac41 =0.0 ; - double Acn_dVbs =0.0, Acn_dVds =0.0, Acn_dVgs =0.0 ; - double Acd_dVbs =0.0, Acd_dVds =0.0, Acd_dVgs =0.0 ; - double Ac1_dVbs =0.0, Ac1_dVds =0.0, Ac1_dVgs =0.0 ; - double Ac2_dVbs =0.0, Ac2_dVds =0.0, Ac2_dVgs =0.0 ; - double Ac3_dVbs =0.0, Ac3_dVds =0.0, Ac3_dVgs =0.0 ; - double Ac4_dVbs =0.0, Ac4_dVds =0.0, Ac4_dVgs =0.0 ; - double Ac31_dVbs =0.0, Ac31_dVds =0.0, Ac31_dVgs =0.0 ; - /* PART-2 (Isub) */ - double Isub =0.0 ; - double Isub_dVbs =0.0, Isub_dVds =0.0, Isub_dVgs =0.0 ; - double Isub_dVbse =0.0, Isub_dVdse =0.0, Isub_dVgse =0.0 ; - double Psislsat=0.0, Psisubsat =0.0 ; - double Psislsat_dVd=0.0, Psislsat_dVg=0.0, Psislsat_dVb =0.0 ; - double Psisubsat_dVd=0.0, Psisubsat_dVg=0.0, Psisubsat_dVb =0.0 ; - /* PART-3 (overlap) */ - double cov_slp =0.0, cov_mag =0.0, covvg =0.0, covvg_dVgs =0.0 ; - double Lov =0.0 ; - double Qgos = 0.0, Qgos_dVbs = 0.0, Qgos_dVds = 0.0, Qgos_dVgs = 0.0 ; - double Qgos_dVbse =0.0, Qgos_dVdse =0.0, Qgos_dVgse =0.0 ; - double Qgod = 0.0, Qgod_dVbs = 0.0, Qgod_dVds = 0.0, Qgod_dVgs = 0.0 ; - double Qgod_dVbse =0.0, Qgod_dVdse =0.0, Qgod_dVgse =0.0 ; - - int flg_overgiven =0 ; - - double Qgbo =0.0, Qgbo_dVbs =0.0, Qgbo_dVds =0.0, Qgbo_dVgs =0.0 ; - double Qgbo_dVbse =0.0, Qgbo_dVdse =0.0, Qgbo_dVgse =0.0 ; - double Cggo = 0.0 , Cgdo = 0.0 , Cgso = 0.0 , Cgbo = 0.0 , Cgbo_loc=0.0 ; - /* fringing capacitance */ - double Cf =0.0 ; - double Qfd =0.0, Qfs =0.0 ; - /* Cqy */ - double Ec =0.0, Ec_dVbs =0.0, Ec_dVds =0.0, Ec_dVgs =0.0 ; - double Pslk =0.0, Pslk_dVbs =0.0, Pslk_dVds =0.0, Pslk_dVgs =0.0 ; - double Qy =0.0 ; - double Cqyd=0.0, Cqyg=0.0, Cqys=0.0, Cqyb =0.0 ; - double Qy_dVbs =0.0, Qy_dVds =0.0, Qy_dVgs=0.0 ; - double Qy_dVbse =0.0, Qy_dVdse=0.0, Qy_dVgse=0.0 ; - double Qys=0.0, Qys_dVbse =0.0, Qys_dVdse=0.0, Qys_dVgse=0.0 ; - /* PART-4 (junction diode) */ - double Ibs =0.0, Ibd =0.0, Gbs =0.0, Gbd =0.0, Gbse =0.0, Gbde =0.0 ; - /* junction capacitance */ - double Qbs =0.0, Qbd =0.0, Capbs =0.0, Capbd =0.0, Capbse =0.0, Capbde =0.0 ; - double czbd =0.0, czbdsw =0.0, czbdswg =0.0, czbs =0.0, czbssw =0.0, czbsswg =0.0 ; - double arg =0.0, sarg =0.0 ; - /* PART-5 (NQS) */ - double tau=0.0, Qi_prev =0.0; - double tau_dVgs=0.0, tau_dVds=0.0, tau_dVbs =0.0 ; - double tau_dVgse=0.0, tau_dVdse=0.0, tau_dVbse =0.0 ; - double Qi_nqs =0.0 ; - double Qi_dVbs_nqs=0.0, Qi_dVds_nqs=0.0, Qi_dVgs_nqs =0.0 ; - double Qi_dVbse_nqs=0.0, Qi_dVdse_nqs=0.0, Qi_dVgse_nqs =0.0 ; - double taub=0.0, Qb_prev =0.0; - double taub_dVgs=0.0, taub_dVds=0.0, taub_dVbs =0.0 ; - double taub_dVgse=0.0, taub_dVdse=0.0, taub_dVbse =0.0 ; - double Qb_nqs =0.0 ; - double Qb_dVbs_nqs=0.0, Qb_dVds_nqs=0.0, Qb_dVgs_nqs =0.0 ; - double Qb_dVbse_nqs=0.0, Qb_dVdse_nqs=0.0, Qb_dVgse_nqs =0.0 ; - /* PART-6 (noise) */ - /* 1/f */ - double NFalp =0.0, NFtrp =0.0, Cit =0.0, Nflic =0.0 ; - double Qi_noi =0.0 , Qiu_noi =0.0 ; - /* thermal */ - double Eyd=0.0, Mu_Ave=0.0, Nthrml=0.0, Mud_hoso =0.0 ; - /* induced gate noise ( Part 0/3 ) */ - double kusai00 =0.0, kusaidd =0.0, kusaiL =0.0, kusai00L =0.0 ; - int flg_ign = 0 ; - double sqrtkusaiL =0.0, kusai_ig =0.0, gds0_ign =0.0, gds0_h2 =0.0, GAMMA =0.0, crl_f =0.0 ; - const double c_sqrt_15 = 3.872983346207417e0 ; /* sqrt(15) */ - const double Cox_small = 1.0e-6 ; - const double c_16o135 = 1.185185185185185e-1 ; /* 16/135 */ - double Nign0 =0.0, MuModA =0.0, MuModB =0.0, correct_w1 =0.0 ; - - /* Bias iteration accounting Rs/Rd */ - int lp_bs =0 ; - double Ids_last =0.0 ; - double vtol_iprv = 2.0e-1 ; - double vtol_pprv = 1.01e-1 ; - double Vbsc_dif =0.0, Vdsc_dif =0.0, Vgsc_dif =0.0, sum_vdif =0.0 ; - double Vbsc_dif2 =0.0, Vdsc_dif2 =0.0, Vgsc_dif2 =0.0, sum_vdif2 =0.0 ; - double Rs =0.0, Rd =0.0 ; - double Fbs =0.0, Fds =0.0, Fgs =0.0 ; - double DJ =0.0, DJI =0.0 ; - double JI11 =0.0, JI12 =0.0, JI13 =0.0, JI21 =0.0, JI22 =0.0, JI23 =0.0, JI31 =0.0, JI32 =0.0, JI33 =0.0 ; - double dVbs =0.0, dVds =0.0, dVgs =0.0 ; - double dV_sum =0.0 ; - /* temporary vars. */ - double T0, T1, T2, T3, T4, T5, T6, T7, T8, T9 = 0.0, T10 = 0.0, T11 = 0.0, T12 ; - double TX =0.0, TX_dVbs =0.0, TX_dVds =0.0, TX_dVgs =0.0 ; - double TY =0.0, TY_dVbs =0.0, TY_dVds =0.0, TY_dVgs =0.0 ; - double T1_dVb =0.0, T1_dVd =0.0, T1_dVg =0.0 ; - double T2_dVb =0.0, T2_dVd =0.0, T2_dVg =0.0 ; - double T3_dVb =0.0, T3_dVd =0.0, T3_dVg =0.0 ; - double T4_dVb =0.0, T4_dVd =0.0, T4_dVg =0.0 ; - double T5_dVb =0.0, T5_dVd =0.0, T5_dVg =0.0 ; - double T6_dVb =0.0, T6_dVd =0.0, T6_dVg =0.0 ; - double T7_dVb =0.0, T7_dVd =0.0, T7_dVg =0.0 ; - double T8_dVb =0.0, T8_dVd =0.0, T8_dVg =0.0 ; - double T9_dVb =0.0, T9_dVd =0.0, T9_dVg =0.0 ; - double T10_dVb =0.0, T10_dVd =0.0, T10_dVg =0.0 ; - double T15, T16, T17 ; - - int flg_zone = 0 ; - - /* Vdseff */ - double Vdseff =0.0, Vdsorg =0.0 ; - double Vdseff_dVbs =0.0, Vdseff_dVds =0.0, Vdseff_dVgs =0.0 ; - - /* G/S and G/D Overlap Charges: Qovs/Qovd */ - double Qovd = 0.0, Qovd_dVbse = 0.0, Qovd_dVdse = 0.0, Qovd_dVgse = 0.0 ; - double Qovd_dVbs = 0.0, Qovd_dVds = 0.0, Qovd_dVgs = 0.0 ; - double Qovs = 0.0, Qovs_dVbse = 0.0, Qovs_dVdse = 0.0, Qovs_dVgse = 0.0 ; - double Qovs_dVbs = 0.0, Qovs_dVds = 0.0, Qovs_dVgs = 0.0 ; - int lcover = 0, flg_ovloops = 0, flg_ovloopd = 0 ; - int flg_overs = 0, flg_overd = 0 ; - double VgpLD =0.0 ; - double QbdLD = 0.0 , QbdLD_dVbs = 0.0 , QbdLD_dVds = 0.0 , QbdLD_dVgs = 0.0 ; - double QidLD = 0.0 , QidLD_dVbs = 0.0 , QidLD_dVds = 0.0 , QidLD_dVgs = 0.0 ; - double QbsLD = 0.0 , QbsLD_dVbs = 0.0 , QbsLD_dVds = 0.0 , QbsLD_dVgs = 0.0 ; - double QisLD = 0.0 , QisLD_dVbs = 0.0 , QisLD_dVds = 0.0 , QisLD_dVgs = 0.0 ; - double QbdLD_dVbse = 0.0 , QbdLD_dVdse = 0.0 , QbdLD_dVgse = 0.0 ; - double QidLD_dVbse = 0.0 , QidLD_dVdse = 0.0 , QidLD_dVgse = 0.0 ; - double QbsLD_dVbse = 0.0 , QbsLD_dVdse = 0.0 , QbsLD_dVgse = 0.0 ; - double QisLD_dVbse = 0.0 , QisLD_dVdse = 0.0 , QisLD_dVgse = 0.0 ; - double QbuLD = 0.0 , QbuLD_dVbs = 0.0 , QbuLD_dVds = 0.0 , QbuLD_dVgs = 0.0 ; - double QsuLD = 0.0 , QsuLD_dVbs = 0.0 , QsuLD_dVds = 0.0 , QsuLD_dVgs = 0.0 ; - double QiuLD = 0.0 , QiuLD_dVbs = 0.0 , QiuLD_dVds = 0.0 , QiuLD_dVgs = 0.0 ; - double Ps0LD = 0.0 , Ps0LD_dVds = 0.0 ; - double QbuLD_dVxb = 0.0 , QbuLD_dVgb = 0.0 ; - double QsuLD_dVxb = 0.0 , QsuLD_dVgb = 0.0 ; - int flg_ovzone = 0 ; - - /* Vgsz for SCE and PGD */ - double Vbsz2 =0.0, Vbsz2_dVbs =0.0, Vbsz2_dVds =0.0, Vbsz2_dVgs =0.0 ; - - /* Multiplication factor of a MOSFET instance */ - double M = 1.0 ; - - /* Mode flag ( = 0 | 1 ) */ - double ModeNML =0.0, ModeRVS =0.0 ; - - /* For Gate Leak Current Partitioning */ - double GLPART1 ; - double GLPART1_dVgs=0.0, GLPART1_dVds=0.0, GLPART1_dVbs =0.0; - double GLPART1_dVgse=0.0, GLPART1_dVdse=0.0, GLPART1_dVbse =0.0; - - /* IBPC */ - double IdsIBPC = 0.0 ; - double IdsIBPC_dVbs = 0.0 , IdsIBPC_dVds = 0.0 , IdsIBPC_dVgs = 0.0 ; - double IdsIBPC_dVbse = 0.0 , IdsIBPC_dVdse = 0.0 , IdsIBPC_dVgse = 0.0 ; - - /* Overlap Charge: Qover */ - double Vbsgmt =0.0, Vdsgmt =0.0, Vgsgmt =0.0, Vdbgmt =0.0, Vgbgmt =0.0, Vsbgmt =0.0, Vxbgmt =0.0 ; - double Vxbgmtcl = 0.0, Vxbgmtcl_dVxbgmt = 0.0 ; - - double Pb2over =0.0 ; - - /* Qover Iterative and Analytical Model */ - const double large_arg = 80 ; - int lp_ld =0 ; - double T1_dVxb=0.0, T1_dVgb=0.0, T5_dVxb=0.0, T5_dVgb =0.0 ; - double Vgb_fb_LD=0.0, VgpLD_dVgb =0.0 ; - double VgpLD_shift=0.0, VgpLD_shift_dVxb=0.0, VgpLD_shift_dVgb =0.0 ; - double TX_dVxb=0.0, TX_dVgb=0.0, TY_dVxb=0.0, TY_dVgb =0.0 ; - double Ac1_dVxb=0.0, Ac1_dVgb=0.0, Ac2_dVxb=0.0, Ac2_dVgb =0.0 ; - double Ac3_dVxb=0.0, Ac3_dVgb=0.0, Ac31_dVxb=0.0, Ac31_dVgb =0.0; - double Acd_dVxb=0.0, Acd_dVgb=0.0, Acn_dVxb=0.0, Acn_dVgb =0.0; - double Ta = 9.3868e-3, Tb = -0.1047839 ; - double Tc=0.0, Tp =0.0 ; - double Td=0.0, Td_dVxb=0.0, Td_dVgb =0.0 ; - double Tq=0.0, Tq_dVxb=0.0, Tq_dVgb =0.0 ; - double Tu=0.0, Tu_dVxb=0.0, Tu_dVgb =0.0 ; - double Tv=0.0, Tv_dVxb=0.0, Tv_dVgb =0.0 ; - double exp_bVbs_dVxb=0.0, exp_bPs0 =0.0 ; - double cnst1over =0.0; - double gamma=0.0, gamma_dVxb =0.0; - double Chi_dVxb=0.0, Chi_dVgb =0.0 ; - double Chi_A=0.0, Chi_A_dVxb=0.0, Chi_A_dVgb =0.0 ; - double Chi_B=0.0, Chi_B_dVxb=0.0, Chi_B_dVgb =0.0 ; - double Chi_1=0.0, Chi_1_dVxb=0.0, Chi_1_dVgb =0.0 ; - double psi_B=0.0, arg_B =0.0 ; - double psi=0.0, psi_dVgb=0.0, psi_dVxb =0.0 ; - double Ps0_iniA_dVxb=0.0, Ps0_iniA_dVgb =0.0 ; - double Ps0_iniB_dVxb=0.0, Ps0_iniB_dVgb =0.0 ; - double Psa_dVxb=0.0, Psa_dVgb=0.0, Ps0LD_dVxb=0.0, Ps0LD_dVgb =0.0 ; - double fs02_dVxb=0.0, fs02_dVgb =0.0 ; - - /* SCE LOOP */ - double A =0.0, A_dVgs=0.0, A_dVds=0.0, A_dVbs =0.0 ; - int NNN =0 ; - double PS0_SCE=0 , PS0_SCE_dVgs = 0 , PS0_SCE_dVds = 0 , PS0_SCE_dVbs = 0 ; - double PS0Z_SCE=0 , PS0Z_SCE_dVgs = 0 , PS0Z_SCE_dVds = 0 , PS0Z_SCE_dVbs = 0 ; - /* double arg0 = 0.01 , arg1 = 0.04 ; */ - double arg0 = 0.01 ; - double arg2 = here->HSM2_2qnsub_esi * 1.0e-4 ; - int MAX_LOOP_SCE =0 ; - - int codqb = 0 ; - int corecip = model->HSM2_corecip ; - int START_OF_SCE_LOOP = 1 , end_of_part_1 = 0 ; - - - /* modify Qy in accumulation region */ - double Aclm_eff=0.0, Aclm_eff_dVds=0.0, Aclm_eff_dVgs=0.0, Aclm_eff_dVbs =0.0 ; - - double Idd1 =0.0, Idd1_dVbs =0.0, Idd1_dVgs =0.0, Idd1_dVds =0.0 ; - - double tcjbs=0.0, tcjbssw=0.0, tcjbsswg=0.0, - tcjbd=0.0, tcjbdsw=0.0, tcjbdswg=0.0 ; - double TTEMP =0.0 ; - - double PS0_SCE_tol = 4.0e-7 ; - double PS0_SCE_deriv_tol = 1.0e-8 ; - double Ps0_ini_dVds =0.0, Ps0_ini_dVgs =0.0, Ps0_ini_dVbs =0.0 ; - double Ps0_iniA_dVds =0.0, Ps0_iniA_dVgs =0.0, Ps0_iniA_dVbs =0.0 ; - double Ps0_iniB_dVds =0.0, Ps0_iniB_dVgs =0.0, Ps0_iniB_dVbs =0.0 ; - - double A_dPS0Z = 0.0, dqb_dPS0Z = 0.0, dVth_dPS0Z = 0.0, dVth0_dPS0Z = 0.0, - dVthLP_dPS0Z = 0.0, dVthSC_dPS0Z = 0.0, Qbmm_dPS0Z = 0.0, - Vgp_dPS0Z = 0.0, Vgpz_dPS0Z = 0.0, Vthp_dPS0Z = 0.0, - Vth0_dPS0Z = 0.0 ; - double T1_dPS0Z=0.0, T3_dPS0Z=0.0, T4_dPS0Z=0.0, T5_dPS0Z=0.0, - T6_dPS0Z=0.0, T7_dPS0Z=0.0, T8_dPS0Z=0.0, T9_dPS0Z=0.0, - T10_dPS0Z=0.0, TX_dPS0Z =0.0 ; - double Ac1_dPS0Z=0.0, Ac2_dPS0Z=0.0, Ac3_dPS0Z=0.0, Ac31_dPS0Z=0.0, - Acd_dPS0Z=0.0, Acn_dPS0Z=0.0, Chi_dPS0Z=0.0, Psa_dPS0Z =0.0 ; - double Fs0_dPS0Z=0.0, Fsl_dPS0Z=0.0, Ps0_dPS0Z=0.0, Psl_dPS0Z=0.0, - Pds_dPS0Z=0.0, Pzadd_dPS0Z=0.0, Ps0z_dPS0Z =0.0 ; - double G=0.0, delta_PS0Z_SCE=0.0, delta_PS0Z_SCE_dVds=0.0, - delta_PS0Z_SCE_dVgs=0.0, delta_PS0Z_SCE_dVbs =0.0 ; - - - double Vgs_min =0.0 ; - - - /*================ Start of executable code.=================*/ - - if (here->HSM2_mode == HiSIM_NORMAL_MODE) { - ModeNML = 1.0 ; - ModeRVS = 0.0 ; - } else { - ModeNML = 0.0 ; - ModeRVS = 1.0 ; - } - - T1 = vbs + vds + vgs + vbd_jct + vbs_jct ; - if ( ! finite (T1) ) { - fprintf (stderr , - "*** warning(HiSIM): Unacceptable Bias(es).\n" ) ; - fprintf (stderr , "----- bias information (HiSIM)\n" ) ; - fprintf (stderr , "name: %s\n" , here->HSM2name ) ; - fprintf (stderr , "states: %d\n" , here->HSM2states ) ; - fprintf (stderr , "vds= %12.5e vgs=%12.5e vbs=%12.5e\n" - , vds , vgs , vbs ) ; - fprintf (stderr , "vbs_jct= %12.5e vbd_jct= %12.5e\n" - , vbs_jct , vbd_jct ) ; - fprintf (stderr , "vd= %12.5e vg= %12.5e vb= %12.5e vs= %12.5e\n" - , *( ckt->CKTrhsOld + here->HSM2dNodePrime ) - , *( ckt->CKTrhsOld + here->HSM2gNodePrime ) - , *( ckt->CKTrhsOld + here->HSM2bNodePrime ) - , *( ckt->CKTrhsOld + here->HSM2sNodePrime ) ) ; - if ( here->HSM2_called >= 1 ) { - fprintf (stderr , "vdsc_prv= %12.5e vgsc_prv=%12.5e vbsc_prv=%12.5e\n" - , here->HSM2_vdsc_prv , here->HSM2_vgsc_prv - , here->HSM2_vbsc_prv ) ; - } - fprintf (stderr , "----- bias information (end)\n" ) ; - return ( HiSIM_ERROR ) ; - } - - flg_info = model->HSM2_info ; - flg_nqs = model->HSM2_conqs ; - - /*-----------------------------------------------------------* - * Start of the routine. (label) - *-----------------*/ -/*start_of_routine:*/ - - TTEMP = ckt->CKTtemp ; - if ( here->HSM2_dtemp_Given ) { TTEMP = TTEMP + here->HSM2_dtemp ; } - - beta = here->HSM2_beta ; - - /* Inverse of the thermal voltage */ - beta_inv = here->HSM2_beta_inv ; - beta2 = here->HSM2_beta2 ; - - /* Bandgap */ - Egp12 = here->HSM2_egp12 ; - Egp32 = here->HSM2_egp32 ; - - /* Metallurgical channel geometry */ - Leff = here->HSM2_leff ; - Weff = here->HSM2_weff ; - - /* Flat band voltage */ - Vfb = pParam->HSM2_vfbc ; - - /* Surface impurity profile */ - q_Nsub = here->HSM2_qnsub ; - - /* Velocity Temperature Dependence */ - Vmax = here->HSM2_vmax ; - - /* 2 phi_B */ - Pb2 = here->HSM2_pb2 ; - Pb20 = here->HSM2_pb20 ; - Pb2c = here->HSM2_pb2c ; - - /* Coefficient of the F function for bulk charge */ - cnst0 = here->HSM2_cnst0 ; - - /* cnst1: n_{p0} / p_{p0} */ - cnst1 = here->HSM2_cnst1 ; - - /* c_eox: Permitivity in ox */ - c_eox = here->HSM2_cecox ; - - /* Tox and Cox without QME */ - Tox0 = model->HSM2_tox ; - Cox0 = c_eox / Tox0 ; - Cox0_inv = 1.0 / Cox0 ; - - /* for calculation of Ps0_min */ - Vgs_min = model->HSM2_type * model->HSM2_Vgsmin ; - - /*-----------------------------------------------------------* - * Exchange bias conditions according to MOS type. - * - Vxse are external biases for HiSIM. ( type=NMOS , Vds >= 0 - * are assumed.) - *-----------------*/ - Vbse = vbs ; - Vdse = vds ; - Vgse = vgs ; - - /*---------------------------------------------------* - * Clamp too large biases. - * -note: Quantities are extrapolated in PART-5. - *-----------------*/ - - if ( Pb2 - model->HSM2_vzadd0 < Vbs_max ) { - Vbs_max = Pb2 - model->HSM2_vzadd0 ; - } - if ( Pb20 - model->HSM2_vzadd0 < Vbs_max ) { - Vbs_max = Pb20 - model->HSM2_vzadd0 ; - } - if ( Pb2c - model->HSM2_vzadd0 < Vbs_max ) { - Vbs_max = Pb2c - model->HSM2_vzadd0 ; - } - - if ( Vbs_bnd > Vbs_max * 0.5 ) { - Vbs_bnd = 0.5 * Vbs_max ; - } - - if ( Vbse > Vbs_bnd ) { - flg_vbsc = 1 ; - T1 = Vbse - Vbs_bnd ; - T2 = Vbs_max - Vbs_bnd ; - Fn_SUPoly4m( TY , T1 , T2 , Vbsc_dVbse , T0 ) ; - Vbsc = Vbs_bnd + TY ; - - T3 = 1 / T2 ; - /* x/xmax */ - T4 = T1 * T3 ; - T4_dVb = T3 ; - - T5 = T4 * T4; - T5_dVb = 2 * T4_dVb * T4 ; - T15 = 2 * T4_dVb * T4_dVb ; /* T15 = T5_dVb_dVb */ - - T6 = T4 * T5 ; - T6_dVb = T4_dVb * T5 + T4 * T5_dVb ; - T16 = T4_dVb * T5_dVb + T4_dVb * T5_dVb + T4 * T15 ; /* T16 = T6_dVb_dVb */ - - /* T7 = Z T7_dVb = dZ_dVb T17 = dZ_dVb_dVb */ - T7 = 1 + T4 + T5 + T6 + T5 * T5 ; - T7_dVb = T4_dVb + T5_dVb + T6_dVb + 2 * T5_dVb * T5 ; - T17 = T15 + T16 + 2 * T15 * T5 + 2 * T5_dVb * T5_dVb ; - - T8 = T7 * T7 ; - T8_dVb = 2 * T7_dVb * T7 ; - - T9 = 1 / T8 ; - T9_dVb = - T8_dVb * T9 * T9 ; - - Vbsc_dVbse = T2 * T7_dVb * T9 ; - Vbsc_dVbse_dVbs = T2 * ( T17 * T9 + T7_dVb * T9_dVb ) ; - - } else if ( Vbse < Vbs_min ) { - flg_vbsc = -1 ; - Vbsc = Vbs_min ; - Vbsc_dVbse_dVbs = 0.0 ; - } else { - flg_vbsc = 0 ; - Vbsc = Vbse ; - Vbsc_dVbse = 1.0 ; - Vbsc_dVbse_dVbs = 0.0 ; - } - - Vdsc = Vdse ; - Vgsc = Vgse ; - - if (here->HSM2_rs > 0.0 || here->HSM2_rd > 0.0) { - if ( model->HSM2_corsrd == 1 ) flg_rsrd = 1 ; - if ( model->HSM2_corsrd == 2 ) flg_rsrd = 2 ; - } - - /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ - * PART-1: Basic device characteristics. - *+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ - /*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++* - * Prepare for potential initial guesses using previous values - *++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ - - flg_pprv = 0 ; - - if ( here->HSM2_called >= 1 ) { - - Vbsc_dif = Vbsc - here->HSM2_vbsc_prv ; - Vdsc_dif = Vdsc - here->HSM2_vdsc_prv ; - Vgsc_dif = Vgsc - here->HSM2_vgsc_prv ; - - sum_vdif = fabs( Vbsc_dif ) + fabs( Vdsc_dif ) - + fabs( Vgsc_dif ) ; - - if ( model->HSM2_copprv >= 1 && sum_vdif <= vtol_pprv && - here->HSM2_mode * here->HSM2_mode_prv > 0 ) { flg_pprv = 1 ;} - - if ( here->HSM2_called >= 2 && flg_pprv == 1 ) { - Vbsc_dif2 = here->HSM2_vbsc_prv - here->HSM2_vbsc_prv2 ; - Vdsc_dif2 = here->HSM2_vdsc_prv - here->HSM2_vdsc_prv2 ; - Vgsc_dif2 = here->HSM2_vgsc_prv - here->HSM2_vgsc_prv2 ; - sum_vdif2 = fabs( Vbsc_dif2 ) + fabs( Vdsc_dif2 ) - + fabs( Vgsc_dif2 ) ; - if ( epsm10 < sum_vdif2 && sum_vdif2 <= vtol_pprv && - here->HSM2_mode_prv * here->HSM2_mode_prv2 > 0 ) { flg_pprv = 2 ; } - } - } else { - Vbsc_dif = 0.0 ; - Vdsc_dif = 0.0 ; - Vgsc_dif = 0.0 ; - sum_vdif = 0.0 ; - Vbsc_dif2 = 0.0 ; - Vdsc_dif2 = 0.0 ; - Vgsc_dif2 = 0.0 ; - sum_vdif2 = 0.0 ; - flg_iprv = 0 ; - flg_pprv = 0 ; - } - - dVbs = Vbsc_dif ; - dVds = Vdsc_dif ; - dVgs = Vgsc_dif ; - - if ( flg_pprv >= 1 ) { - Ps0 = here->HSM2_ps0_prv ; - Ps0_dVbs = here->HSM2_ps0_dvbs_prv ; - Ps0_dVds = here->HSM2_ps0_dvds_prv ; - Ps0_dVgs = here->HSM2_ps0_dvgs_prv ; - - Pds = here->HSM2_pds_prv ; - Pds_dVbs = here->HSM2_pds_dvbs_prv ; - Pds_dVds = here->HSM2_pds_dvds_prv ; - Pds_dVgs = here->HSM2_pds_dvgs_prv ; - } - - - /*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++* - * Bias loop: iteration to solve the system of equations of - * the small circuit taking into account Rs and Rd. - * - Vxs are internal (or effective) biases. - * - Equations: - * Vbs = Vbsc - Rs * Ids - * Vds = Vdsc - ( Rs + Rd ) * Ids - * Vgs = Vgsc - Rs * Ids - *++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ - - if ( flg_rsrd == 1 ) { - - if (here->HSM2_mode == HiSIM_NORMAL_MODE) { - Rs = here->HSM2_rs ; - Rd = here->HSM2_rd ; - } else { - Rs = here->HSM2_rd ; - Rd = here->HSM2_rs ; - } - - if ( here->HSM2_called >= 1 ) { - - if ( model->HSM2_coiprv >= 1 && - 0.0 < sum_vdif && sum_vdif <= vtol_iprv ) { flg_iprv = 1 ;} - } - - /*-----------------------------------------------------------* - * Initial guesses using the previous values. - *-----------------*/ - if ( flg_iprv == 1 ) { - here->HSM2_ids_dvbs_prv = Fn_Max( 0.0 , here->HSM2_ids_dvbs_prv ) ; - here->HSM2_ids_dvds_prv = Fn_Max( 0.0 , here->HSM2_ids_dvds_prv ) ; - here->HSM2_ids_dvgs_prv = Fn_Max( 0.0 , here->HSM2_ids_dvgs_prv ) ; - - dVbs = Vbsc_dif * ( 1.0 - 1.0 / ( 1.0 + Rs * here->HSM2_ids_dvbs_prv ) ) ; - dVds = Vdsc_dif * ( 1.0 - 1.0 / ( 1.0 + ( Rs + Rd ) * here->HSM2_ids_dvds_prv ) ) ; - dVgs = Vgsc_dif * ( 1.0 - 1.0 / ( 1.0 + Rs * here->HSM2_ids_dvgs_prv ) ) ; - - Ids = here->HSM2_ids_prv - + here->HSM2_ids_dvbs_prv * dVbs - + here->HSM2_ids_dvds_prv * dVds - + here->HSM2_ids_dvgs_prv * dVgs ; - - T1 = ( Ids - here->HSM2_ids_prv ) ; - T2 = fabs( T1 ) ; - if ( Ids_maxvar * here->HSM2_ids_prv < T2 ) { - Ids = here->HSM2_ids_prv * ( 1.0 + Fn_Sgn( T1 ) * Ids_maxvar ) ; - } - if ( Ids < 0 ) Ids = 0.0 ; - - } else { - Ids = 0.0 ; - if ( flg_pprv >= 1 ) { - dVbs = Vbsc_dif ; - dVds = Vdsc_dif ; - dVgs = Vgsc_dif ; - } - } /* end of flg_iprv if-blocks */ - - Vbs = Vbsc - Ids * Rs ; - Vds = Vdsc - Ids * ( Rs + Rd ) ; - if ( Vds * Vdsc <= 0.0 ) { Vds = 0.0 ; } - - Vgs = Vgsc - Ids * Rs ; - - } else { - lp_bs_max = 1 ; - Ids = 0.0 ; - Vbs = Vbsc ; - Vds = Vdsc ; - Vgs = Vgsc ; - } /* end of flg_rsrd if-blocks */ - - - if( model->HSM2_codep == 1 ) { - /*---------------------------------------------------* - * CODEP=1 : Depletion mode MOSFET - *-----------------*/ - - /*-----------------------------------------------------------* - * Vxsz: Modified bias introduced to realize symmetry at Vds=0. - *-----------------*/ - - T1 = Vbsc_dVbse * Vds / 2 ; - Fn_SymAdd( Vzadd , T1 , model->HSM2_vzadd0 , T2 ) ; - Vzadd_dVbs = T2 * Vbsc_dVbse_dVbs * Vds / 2 ; - T2 *= Vbsc_dVbse / 2 ; - Vzadd_dVds = T2 ; - - if ( Vzadd < ps_conv ) { - Vzadd = ps_conv ; - Vzadd_dVds = 0.0 ; - Vzadd_dVbs = 0.0 ; - } - - Vbsz = Vbs + Vzadd ; - Vbsz_dVbs = 1.0 ; - Vbsz_dVds = Vzadd_dVds ; - - Vdsz = Vds + 2.0 * Vzadd ; - Vdsz_dVbs = 0.0 ; - Vdsz_dVds = 1.0 + 2.0 * Vzadd_dVds ; - - Vgsz = Vgs + Vzadd ; - Vgsz_dVgs = 1.0 ; - Vgsz_dVbs = 0.0 ; - Vgsz_dVds = Vzadd_dVds ; - - - /*---------------------------------------------------* - * Factor of modification for symmetry. - *-----------------*/ - - T1 = here->HSM2_qnsub_esi * Cox0_inv * Cox0_inv ; - T2 = Vgs - Vfb ; - T3 = 1 + 2.0 / T1 * ( T2 - beta_inv - Vbs ) ; - Fn_SZ( T4 , T3 , 1e-3 , T5 ) ; - TX = sqrt( T4 ) ; - Pslsat = T2 + T1 * ( 1.0 - TX ) ; - VdsatS = Pslsat - Pb2 ; - Fn_SL( VdsatS , VdsatS , 0.1 , 5e-2 , T6 ) ; - - VdsatS_dVbs = ( TX ? (T6 * T5 / TX ) : 0.0 ) ; - VdsatS_dVds = 0.0 ; - VdsatS_dVgs = ( TX ? (T6 * ( 1.0 - T5 / TX )) : 0.0 ) ; - - - T1 = Vds / VdsatS ; - Fn_SUPoly4( TX , T1 , 1.0 , T0 ) ; - FMDVDS = TX * TX ; - T2 = 2 * TX * T0 ; - T3 = T2 / ( VdsatS * VdsatS ) ; - FMDVDS_dVbs = T3 * ( - Vds * VdsatS_dVbs ) ; - FMDVDS_dVds = T3 * ( 1.0 * VdsatS - Vds * VdsatS_dVds ) ; - FMDVDS_dVgs = T3 * ( - Vds * VdsatS_dVgs ) ; - - /*-----------------------------------------------------------* - * Quantum effect - *-----------------*/ - if ( model->HSM2_flg_qme == 0 ) { - flg_qme = 0 ; - } else { - flg_qme = 1 ; - } - - - T1 = here->HSM2_2qnsub_esi ; - T2 = sqrt( T1 * Pb20 ) ; - Vthq = Pb20 + Vfb + T2 * Cox0_inv ; - Vthq_dVb = 0.0 ; - Vthq_dVd = 0.0 ; - - if ( flg_qme == 0 ) { - Tox = Tox0 ; - Tox_dVb = 0.0 ; - Tox_dVd = 0.0 ; - Tox_dVg = 0.0 ; - - Cox = Cox0 ; - Cox_dVb = 0.0 ; - Cox_dVd = 0.0 ; - Cox_dVg = 0.0 ; - - Cox_inv = Cox0_inv ; - Cox_inv_dVb = 0.0 ; - Cox_inv_dVd = 0.0 ; - Cox_inv_dVg = 0.0 ; - - T0 = cnst0 * cnst0 * Cox_inv ; - cnstCoxi = T0 * Cox_inv ; - cnstCoxi_dVb = 0.0 ; - cnstCoxi_dVd = 0.0 ; - cnstCoxi_dVg = 0.0 ; - - } else { - - T5 = Vgs - Vbs - Vthq + model->HSM2_qme2 ; - T5_dVb = -1.0 - Vthq_dVb ; - T5_dVd = - Vthq_dVd ; - T5_dVg = 1.0 ; - Fn_SZ( T2 , T5 , qme_dlt, T3) ; - T2 = T2 + small ; - T2_dVb = T3 * T5_dVb ; - T2_dVd = T3 * T5_dVd ; - T2_dVg = T3 * T5_dVg ; - - T3 = 1.0 / T2 ; - T7 = -1.0 / ( T2 * T2 ) ; - T3_dVb = T7 * T2_dVb ; - T3_dVd = T7 * T2_dVd ; - T3_dVg = T7 * T2_dVg ; - - T4 = 2.0 * fabs(Vthq) ; - T6 = Vfb - Vthq + model->HSM2_qme2 ; - if(T6 > T4) { T4 = T6; } - - Fn_SU( T2 , T3 , 1.0 / T4 , qme_dlt, T6 ) ; - T2_dVb = T6 * T3_dVb ; - T2_dVd = T6 * T3_dVd ; - T2_dVg = T6 * T3_dVg ; - - dTox = model->HSM2_qme1 * T2 + model->HSM2_qme3 ; - T7 = model->HSM2_qme1 ; - dTox_dVb = T7 * T2_dVb ; - dTox_dVd = T7 * T2_dVd ; - dTox_dVg = T7 * T2_dVg ; - - if ( dTox * 1.0e12 < Tox0 ) { - dTox = 0.0 ; - dTox_dVb = 0.0 ; - dTox_dVd = 0.0 ; - dTox_dVg = 0.0 ; - flg_qme = 0 ; - } - - Tox = Tox0 + dTox ; - Tox_dVb = dTox_dVb ; - Tox_dVd = dTox_dVd ; - Tox_dVg = dTox_dVg ; - - Cox = c_eox / Tox ; - T1 = - c_eox / ( Tox * Tox ) ; - Cox_dVb = T1 * Tox_dVb ; - Cox_dVd = T1 * Tox_dVd ; - Cox_dVg = T1 * Tox_dVg ; - - Cox_inv = Tox / c_eox ; - T1 = 1.0 / c_eox ; - Cox_inv_dVb = T1 * Tox_dVb ; - Cox_inv_dVd = T1 * Tox_dVd ; - Cox_inv_dVg = T1 * Tox_dVg ; - - T0 = cnst0 * cnst0 * Cox_inv ; - cnstCoxi = T0 * Cox_inv ; - T1 = 2.0 * T0 ; - cnstCoxi_dVb = T1 * Cox_inv_dVb ; - cnstCoxi_dVd = T1 * Cox_inv_dVd ; - cnstCoxi_dVg = T1 * Cox_inv_dVg ; - } - - - fac1 = cnst0 * Cox_inv ; - fac1_dVds = cnst0 * Cox_inv_dVd ; - fac1_dVgs = cnst0 * Cox_inv_dVg ; - fac1_dVbs = cnst0 * Cox_inv_dVb ; - fac1p2 = fac1 * fac1 ; - - /* Ps0_min: approx. solution of Poisson equation at Vgs_min */ - /* ( easy to improve, if necessary ) */ - Ps0_min = 2.0 * beta_inv * log(-Vgs_min/fac1) ; - Ps0_min_dVds = -2.0 * beta_inv * fac1_dVds / fac1 ; - Ps0_min_dVgs = -2.0 * beta_inv * fac1_dVgs / fac1 ; - Ps0_min_dVbs = -2.0 * beta_inv * fac1_dVbs / fac1 ; - - - /*---------------------------------------------------* - * Vbsz2 : Vbs for dVth - *-----------------*/ - Vbsz2 = Vbsz ; - Vbsz2_dVbs = Vbsz_dVbs ; - Vbsz2_dVds = Vbsz_dVds ; - Vbsz2_dVgs = 0.0 ; - - /*---------------------------------------------------* - * Vthp : Vth with pocket. - *-----------------*/ - T1 = here->HSM2_2qnsub_esi ; - Qb0 = sqrt (T1 * (Pb20 - Vbsz2)) ; - T2 = 0.5 * T1 / Qb0 ; - Qb0_dVb = T2 * (- Vbsz2_dVbs) ; - Qb0_dVd = T2 * (- Vbsz2_dVds) ; - Qb0_dVg = T2 * (- Vbsz2_dVgs) ; - - Vthp = Pb20 + Vfb + Qb0 * Cox_inv + here->HSM2_ptovr; - Vthp_dVb = Qb0_dVb * Cox_inv + Qb0 * Cox_inv_dVb ; - Vthp_dVd = Qb0_dVd * Cox_inv + Qb0 * Cox_inv_dVd ; - Vthp_dVg = Qb0_dVg * Cox_inv + Qb0 * Cox_inv_dVg ; - - Pb20b = Pb20 ; - Pb20b_dVb = 0.0 ; - Pb20b_dVd = 0.0 ; - Pb20b_dVg = 0.0 ; - - T0 = 0.95 ; - T1 = T0 * Pb20b - Vbsz2 - 1.0e-3 ; - T1_dVb = T0 * Pb20b_dVb - Vbsz2_dVbs ; - T1_dVd = T0 * Pb20b_dVd - Vbsz2_dVds ; - T1_dVg = T0 * Pb20b_dVg - Vbsz2_dVgs ; - T2 = sqrt (T1 * T1 + 4.0 * T0 * Pb20b * 1.0e-3) ; - T3 = T0 * Pb20b - 0.5 * (T1 + T2) ; - T4 = 2.0 * T0 * 1.0e-3 ; - T5 = T1 / T2 ; - T6 = T4 / T2 ; - T3_dVb = T0 * Pb20b_dVb - - 0.5 * (T1_dVb + (T1_dVb * T5 + T6 * Pb20b_dVb ) ) ; - T3_dVd = T0 * Pb20b_dVd - - 0.5 * (T1_dVd + (T1_dVd * T5 + T6 * Pb20b_dVd ) ) ; - T3_dVg = T0 * Pb20b_dVg - - 0.5 * (T1_dVg + (T1_dVg * T5 + T6 * Pb20b_dVg ) ) ; - Pbsum = Pb20b - T3 ; - Pbsum_dVb = Pb20b_dVb - T3_dVb ; - Pbsum_dVd = Pb20b_dVd - T3_dVd ; - Pbsum_dVg = Pb20b_dVg - T3_dVg ; - - if( model->HSM2_codep ) { - Pbsum = Pbsum + model->HSM2_depeta * Vdsz ; - Pbsum_dVb = Pbsum_dVb + model->HSM2_depeta * Vdsz_dVbs ; - Pbsum_dVd = Pbsum_dVd + model->HSM2_depeta * Vdsz_dVds ; - } - - sqrt_Pbsum = sqrt( Pbsum ) ; - - /*-------------------------------------------* - * dVthLP : Short-channel effect induced by pocket. - * - Vth0 : Vth without pocket. - *-----------------*/ - if ( model->HSM2_lp != 0.0 ) { - T1 = here->HSM2_2qnsub_esi ; - T2 = model->HSM2_bs2 - Vbsz2 ; - T3 = T2 + small ; - T4 = sqrt (T3 * T3 + 4.0 * vth_dlt) ; - T5 = 0.5 * (T3 + T4) ; - T6 = 0.5 * (1.0 + T3 / T4) ; - T5_dVb = - Vbsz2_dVbs * T6 ; - T5_dVd = - Vbsz2_dVds * T6 ; - T5_dVg = - Vbsz2_dVgs * T6 ; - T7 = 1.0 / T5 ; - bs12 = model->HSM2_bs1 * T7 ; - T8 = - bs12 * T7 ; - bs12_dVb = T8 * T5_dVb ; - bs12_dVd = T8 * T5_dVd ; - bs12_dVg = T8 * T5_dVg ; - Fn_SU( T10 , Vbsz2 + bs12, 0.93 * Pb20, vth_dlt, T0) ; - Qbmm = sqrt (T1 * (Pb20 - T10 )) ; - T9 = T0 / Qbmm ; - Qbmm_dVb = 0.5 * T1 * - (Vbsz2_dVbs + bs12_dVb) * T9 ; - Qbmm_dVd = 0.5 * T1 * - (Vbsz2_dVds + bs12_dVd) * T9 ; - Qbmm_dVg = 0.5 * T1 * - (Vbsz2_dVgs + bs12_dVg) * T9 ; - - dqb = (Qb0 - Qbmm) * Cox_inv ; - dqb_dVb = Vthp_dVb - Qbmm_dVb * Cox_inv - Qbmm * Cox_inv_dVb ; - dqb_dVd = Vthp_dVd - Qbmm_dVd * Cox_inv - Qbmm * Cox_inv_dVd ; - dqb_dVg = Vthp_dVg - Qbmm_dVg * Cox_inv - Qbmm * Cox_inv_dVg ; - - T1 = 2.0 * C_QE * here->HSM2_nsubc * C_ESI ; - T2 = sqrt( T1 * ( Pb2c - Vbsz2 ) ) ; - Vth0 = Pb2c + Vfb + T2 * Cox_inv ; - T3 = 0.5 * T1 / T2 * Cox_inv ; - Vth0_dVb = T3 * ( - Vbsz2_dVbs ) + T2 * Cox_inv_dVb ; - Vth0_dVd = T3 * ( - Vbsz2_dVds ) + T2 * Cox_inv_dVd ; - Vth0_dVg = T3 * ( - Vbsz2_dVgs ) + T2 * Cox_inv_dVg ; - - T1 = C_ESI * Cox_inv ; - T2 = here->HSM2_wdplp ; - T4 = 1.0e0 / ( model->HSM2_lp * model->HSM2_lp ) ; - T5 = 2.0e0 * ( model->HSM2_vbi - Pb20b ) * T1 * T2 * T4 ; - dVth0 = T5 * sqrt_Pbsum ; - T6 = 0.5 * T5 / sqrt_Pbsum ; - T7 = 2.0e0 * ( model->HSM2_vbi - Pb20b ) * C_ESI * T2 * T4 * sqrt_Pbsum ; - T8 = - 2.0e0 * T1 * T2 * T4 * sqrt_Pbsum ; - dVth0_dVb = T6 * Pbsum_dVb + T7 * Cox_inv_dVb + T8 * Pb20b_dVb ; - dVth0_dVd = T6 * Pbsum_dVd + T7 * Cox_inv_dVd + T8 * Pb20b_dVd ; - dVth0_dVg = T6 * Pbsum_dVg + T7 * Cox_inv_dVg + T8 * Pb20b_dVg ; - - T1 = Vthp - Vth0 ; - T1_dVb = Vthp_dVb - Vth0_dVb ; - T2 = pParam->HSM2_scp1 + pParam->HSM2_scp3 * Pbsum / model->HSM2_lp ; - T2_dVb = pParam->HSM2_scp3 * Pbsum_dVb / model->HSM2_lp ; - T3 = T2 + pParam->HSM2_scp2 * Vdsz ; - T3_dVb = T2_dVb + pParam->HSM2_scp2 * Vdsz_dVbs ; - - - Vdx = model->HSM2_scp21 + Vdsz ; - Vdx_dVbs = Vdsz_dVbs ; - Vdx2 = Vdx * Vdx ; - Vdx2_dVbs = 2 * Vdx_dVbs * Vdx ; - - dVthLP = T1 * dVth0 * T3 + dqb - here->HSM2_msc / Vdx2 ; - dVthLP_dVb = T1_dVb * dVth0 * T3 + T1 * dVth0_dVb * T3 + T1 * dVth0 * T3_dVb - + dqb_dVb + here->HSM2_msc / Vdx2 /Vdx2 *Vdx2_dVbs; - T4 = T1 * dVth0 * pParam->HSM2_scp3 / model->HSM2_lp ; - dVthLP_dVd = (Vthp_dVd - Vth0_dVd) * dVth0 * T3 + T1 * dVth0_dVd * T3 - + T4 * Pbsum_dVd - + T1 * dVth0 * pParam->HSM2_scp2 * Vdsz_dVds - + dqb_dVd - + 2.0e0 * here->HSM2_msc * Vdx * Vdsz_dVds / ( Vdx2 * Vdx2 ) ; - dVthLP_dVg = (Vthp_dVg - Vth0_dVg) * dVth0 * T3 + T1 * dVth0_dVg * T3 - + T4 * Pbsum_dVg + dqb_dVg ; - } else { - dVthLP = 0.0e0 ; - dVthLP_dVb = 0.0e0 ; - dVthLP_dVd = 0.0e0 ; - dVthLP_dVg = 0.0e0 ; - } - - /*---------------------------------------------------* - * dVthSC : Short-channel effect induced by Vds. - *-----------------*/ - T1 = C_ESI * Cox_inv ; - T2 = here->HSM2_wdpl ; - T3 = here->HSM2_lgate - model->HSM2_parl2 ; - T4 = 1.0e0 / ( T3 * T3 ) ; - T5 = 2.0e0 * ( model->HSM2_vbi - Pb20b ) * T1 * T2 * T4 ; - - dVth0 = T5 * sqrt_Pbsum ; - - T6 = T5 / 2.0 / sqrt_Pbsum ; - T7 = 2.0e0 * ( model->HSM2_vbi - Pb20b ) * C_ESI * T2 * T4 * sqrt_Pbsum ; - T8 = - 2.0e0 * T1 * T2 * T4 * sqrt_Pbsum ; - dVth0_dVb = T6 * Pbsum_dVb + T7 * Cox_inv_dVb + T8 * Pb20b_dVb ; - dVth0_dVd = T6 * Pbsum_dVd + T7 * Cox_inv_dVd + T8 * Pb20b_dVd ; - dVth0_dVg = T6 * Pbsum_dVg + T7 * Cox_inv_dVg + T8 * Pb20b_dVg ; - - T1 = pParam->HSM2_sc3 / here->HSM2_lgate ; - T4 = pParam->HSM2_sc1 + T1 * Pbsum ; - T4_dVb = T1 * Pbsum_dVb ; - T4_dVd = T1 * Pbsum_dVd ; - T4_dVg = T1 * Pbsum_dVg ; - - T5 = T4 + pParam->HSM2_sc2 * Vdsz * ( 1.0 + model->HSM2_sc4 * Pbsum ); - T5_dVb = T4_dVb + pParam->HSM2_sc2 * Vdsz * model->HSM2_sc4 * Pbsum_dVb - + pParam->HSM2_sc2 * Vdsz_dVbs * model->HSM2_sc4 * Pbsum; - T5_dVd = T4_dVd + pParam->HSM2_sc2 * Vdsz_dVds * ( 1.0 + model->HSM2_sc4 * Pbsum ) - + pParam->HSM2_sc2 * Vdsz * model->HSM2_sc4 * Pbsum_dVd; - T5_dVg = T4_dVg + pParam->HSM2_sc2 * Vdsz * model->HSM2_sc4 * Pbsum_dVg; - - - dVthSC = dVth0 * T5 ; - dVthSC_dVb = dVth0_dVb * T5 + dVth0 * T5_dVb ; - dVthSC_dVd = dVth0_dVd * T5 + dVth0 * T5_dVd ; - dVthSC_dVg = dVth0_dVg * T5 + dVth0 * T5_dVg ; - - /*---------------------------------------------------* - * dVthW : narrow-channel effect. - *-----------------*/ - T1 = 1.0 / Cox ; - T2 = T1 * T1 ; - T3 = 1.0 / ( Cox + pParam->HSM2_wfc / Weff ) ; - T4 = T3 * T3 ; - T5 = T1 - T3 ; - T6 = Qb0 * ( T2 - T4 ) ; - - dVthW = Qb0 * T5 + pParam->HSM2_wvth0 / here->HSM2_wg ; - dVthW_dVb = Qb0_dVb * T5 - Cox_dVb * T6 ; - dVthW_dVd = Qb0_dVd * T5 - Cox_dVd * T6 ; - dVthW_dVg = - Cox_dVg * T6 ; - - /*---------------------------------------------------* - * dVth : Total variation. - * - Positive dVth means the decrease in Vth. - *-----------------*/ - dVth = dVthSC + dVthLP + dVthW + here->HSM2_dVthsm ; - dVth_dVb = dVthSC_dVb + dVthLP_dVb + dVthW_dVb ; - dVth_dVd = dVthSC_dVd + dVthLP_dVd + dVthW_dVd ; - dVth_dVg = dVthSC_dVg + dVthLP_dVg + dVthW_dVg ; - - /*---------------------------------------------------* - * Vth : Threshold voltagei for OP. - *-----------------*/ - T2 = sqrt( here->HSM2_2qnsub_esi * (Pb2-Vbsz) ) ; - Vth = Pb2 + Vfb + T2 * Cox0_inv - dVth ; - - /*-----------------------------------------------------------* - * Constants in the equation of Ps0 . - *-----------------*/ - - fac1 = cnst0 * Cox_inv ; - fac1_dVbs = cnst0 * Cox_inv_dVb ; - fac1_dVds = cnst0 * Cox_inv_dVd ; - fac1_dVgs = cnst0 * Cox_inv_dVg ; - - fac1p2 = fac1 * fac1 ; - - /*---------------------------------------------------* - * Poly-Depletion Effect - *-----------------*/ - - dPpg = 0.0 ; - dPpg_dVb = 0.0 ; - dPpg_dVd = 0.0 ; - dPpg_dVg = 0.0 ; - - if ( here->HSM2_flg_pgd == 1 ) { - - T7 = Vgsz ; - T7_dVb = Vgsz_dVbs ; - T7_dVd = Vgsz_dVds ; - T7_dVg = Vgsz_dVgs ; - - T0 = here->HSM2_cnstpgd ; - - T3 = T7 - model->HSM2_pgd2 ; - T3_dVb = T7_dVb ; - T3_dVd = T7_dVd ; - T3_dVg = T7_dVg ; - - Fn_ExpLim( dPpg , T3 , T6 ) ; - dPpg_dVb = T6 * T3_dVb ; - dPpg_dVd = T6 * T3_dVd ; - dPpg_dVg = T6 * T3_dVg ; - - Fn_SZ( dPpg , dPpg - 1.0 , pol_dlt , T6 ) ; - dPpg_dVb *= T6 ; - dPpg_dVd *= T6 ; - dPpg_dVg *= T6 ; - - dPpg *= T0 ; - dPpg_dVb *= T0 ; - dPpg_dVd *= T0 ; - dPpg_dVg *= T0 ; - - Fn_SU( dPpg , dPpg , pol_b , pol_dlt , T9 ) ; - dPpg_dVb *= T9 ; - dPpg_dVd *= T9 ; - dPpg_dVg *= T9 ; - - } - - /*---------------------------------------------------* - * Vgp : Effective gate bias with SCE & RSCE & flatband. - *-----------------*/ - Vgp = Vgs - Vfb + dVth - dPpg ; - Vgp_dVbs = dVth_dVb - dPpg_dVb ; - Vgp_dVds = dVth_dVd - dPpg_dVd ; - Vgp_dVgs = 1.0e0 + dVth_dVg - dPpg_dVg ; - - /*---------------------------------------------------* - * Vgs_fb : Actual flatband voltage taking account Vbs. - * - note: if Vgs == Vgs_fb then Vgp == Ps0 == Vbs . - *------------------*/ - Vgs_fb = Vfb - dVth + dPpg + Vbs ; - -#include "hsm2eval_dep.h" - - } else { - - /*---------------------------------------------------* - * Normal mode MOSFET - *------------------*/ - - /*-----------------------------------------------------------* - * start of the loop. - *-----------------*/ - for ( lp_bs = 1 ; lp_bs <= lp_bs_max ; lp_bs ++ ) { - - Ids_last = Ids ; - /* Initialization of counters is needed for restart. */ - lp_s0 = 0 ; - lp_sl = 0 ; - - /*-----------------------------------------------------------* - * Vxsz: Modified bias introduced to realize symmetry at Vds=0. - *-----------------*/ - - T1 = Vbsc_dVbse * Vds / 2 ; - Fn_SymAdd( Vzadd , T1 , model->HSM2_vzadd0 , T2 ) ; - T2 *= Vbsc_dVbse / 2 ; - Vzadd_dVds = T2 ; - - if ( Vzadd < ps_conv ) { - Vzadd = ps_conv ; - Vzadd_dVds = 0.0 ; - } - - Vbsz = Vbs + Vzadd ; - Vbsz_dVbs = 1.0 ; - Vbsz_dVds = Vzadd_dVds ; - - Vdsz = Vds + 2.0 * Vzadd ; - Vdsz_dVds = 1.0 + 2.0 * Vzadd_dVds ; - - Vgsz = Vgs + Vzadd ; - Vgsz_dVgs = 1.0 ; - Vgsz_dVds = Vzadd_dVds ; - - /*---------------------------------------------------* - * Factor of modification for symmetry. - *-----------------*/ - - T1 = here->HSM2_qnsub_esi * Cox0_inv * Cox0_inv ; - T2 = Vgs - Vfb ; - T3 = 1 + 2.0 / T1 * ( T2 - beta_inv - Vbs ) ; - Fn_SZ( T4 , T3 , 1e-3 , T5 ) ; - TX = sqrt( T4 ) ; - Pslsat = T2 + T1 * ( 1.0 - TX ) ; - VdsatS = Pslsat - Pb2 ; - Fn_SL( VdsatS , VdsatS , 0.1 , 5e-2 , T6 ) ; - - VdsatS_dVbs = ( TX ? (T6 * T5 / TX ) : 0.0 ) ; - VdsatS_dVds = 0.0 ; - VdsatS_dVgs = ( TX ? (T6 * ( 1.0 - T5 / TX )) : 0.0 ) ; - - - T1 = Vds / VdsatS ; - Fn_SUPoly4( TX , T1 , 1.0 , T0 ) ; - FMDVDS = TX * TX ; - T2 = 2 * TX * T0 ; - T3 = T2 / ( VdsatS * VdsatS ) ; - FMDVDS_dVbs = T3 * ( - Vds * VdsatS_dVbs ) ; - FMDVDS_dVds = T3 * ( 1.0 * VdsatS - Vds * VdsatS_dVds ) ; - FMDVDS_dVgs = T3 * ( - Vds * VdsatS_dVgs ) ; - - /*-----------------------------------------------------------* - * Quantum effect - *-----------------*/ - if ( model->HSM2_flg_qme == 0 ) { - flg_qme = 0 ; - } else { - flg_qme = 1 ; - } - - - T1 = here->HSM2_2qnsub_esi ; - T2 = sqrt( T1 * Pb20 ) ; - Vthq = Pb20 + Vfb + T2 * Cox0_inv ; - Vthq_dVb = 0.0 ; - Vthq_dVd = 0.0 ; - - if ( flg_qme == 0 ) { - Tox = Tox0 ; - Tox_dVb = 0.0 ; - Tox_dVd = 0.0 ; - Tox_dVg = 0.0 ; - - Cox = Cox0 ; - Cox_dVb = 0.0 ; - Cox_dVd = 0.0 ; - Cox_dVg = 0.0 ; - - Cox_inv = Cox0_inv ; - Cox_inv_dVb = 0.0 ; - Cox_inv_dVd = 0.0 ; - Cox_inv_dVg = 0.0 ; - - T0 = cnst0 * cnst0 * Cox_inv ; - cnstCoxi = T0 * Cox_inv ; - cnstCoxi_dVb = 0.0 ; - cnstCoxi_dVd = 0.0 ; - cnstCoxi_dVg = 0.0 ; - } else { - - T5 = Vgs - Vbs - Vthq + model->HSM2_qme2 ; - T5_dVb = -1.0 - Vthq_dVb ; - T5_dVd = - Vthq_dVd ; - T5_dVg = 1.0 ; - Fn_SZ( T2 , T5 , qme_dlt, T3) ; - T2 = T2 + small ; - T2_dVb = T3 * T5_dVb ; - T2_dVd = T3 * T5_dVd ; - T2_dVg = T3 * T5_dVg ; - - T3 = 1.0 / T2 ; - T7 = -1.0 / ( T2 * T2 ) ; - T3_dVb = T7 * T2_dVb ; - T3_dVd = T7 * T2_dVd ; - T3_dVg = T7 * T2_dVg ; - - T4 = 2.0 * fabs(Vthq) ; - T6 = Vfb - Vthq + model->HSM2_qme2 ; - if(T6 > T4) { T4 = T6; } - - Fn_SU( T2 , T3 , 1.0 / T4 , qme_dlt, T6 ) ; - T2_dVb = T6 * T3_dVb ; - T2_dVd = T6 * T3_dVd ; - T2_dVg = T6 * T3_dVg ; - - dTox = model->HSM2_qme1 * T2 + model->HSM2_qme3 ; - T7 = model->HSM2_qme1 ; - dTox_dVb = T7 * T2_dVb ; - dTox_dVd = T7 * T2_dVd ; - dTox_dVg = T7 * T2_dVg ; - - if ( dTox * 1.0e12 < Tox0 ) { - dTox = 0.0 ; - dTox_dVb = 0.0 ; - dTox_dVd = 0.0 ; - dTox_dVg = 0.0 ; - flg_qme = 0 ; - } - - Tox = Tox0 + dTox ; - Tox_dVb = dTox_dVb ; - Tox_dVd = dTox_dVd ; - Tox_dVg = dTox_dVg ; - - Cox = c_eox / Tox ; - T1 = - c_eox / ( Tox * Tox ) ; - Cox_dVb = T1 * Tox_dVb ; - Cox_dVd = T1 * Tox_dVd ; - Cox_dVg = T1 * Tox_dVg ; - - Cox_inv = Tox / c_eox ; - T1 = 1.0 / c_eox ; - Cox_inv_dVb = T1 * Tox_dVb ; - Cox_inv_dVd = T1 * Tox_dVd ; - Cox_inv_dVg = T1 * Tox_dVg ; - - T0 = cnst0 * cnst0 * Cox_inv ; - cnstCoxi = T0 * Cox_inv ; - T1 = 2.0 * T0 ; - cnstCoxi_dVb = T1 * Cox_inv_dVb ; - cnstCoxi_dVd = T1 * Cox_inv_dVd ; - cnstCoxi_dVg = T1 * Cox_inv_dVg ; - } - - - fac1 = cnst0 * Cox_inv ; - fac1_dVds = cnst0 * Cox_inv_dVd ; - fac1_dVgs = cnst0 * Cox_inv_dVg ; - fac1_dVbs = cnst0 * Cox_inv_dVb ; - fac1p2 = fac1 * fac1 ; - - /* Ps0_min: approx. solution of Poisson equation at Vgs_min */ - /* ( easy to improve, if necessary ) */ - Ps0_min = 2.0 * beta_inv * log(-Vgs_min/fac1) ; - Ps0_min_dVds = -2.0 * beta_inv * fac1_dVds / fac1 ; - Ps0_min_dVgs = -2.0 * beta_inv * fac1_dVgs / fac1 ; - Ps0_min_dVbs = -2.0 * beta_inv * fac1_dVbs / fac1 ; - - - /*---------------------------------------------------* - * Vbsz2 : Vbs for dVth - *-----------------*/ - Vbsz2 = Vbsz ; - Vbsz2_dVbs = Vbsz_dVbs ; - Vbsz2_dVds = Vbsz_dVds ; - Vbsz2_dVgs = 0.0 ; - - if ( corecip ) { - - /* ************************** */ - /* Initial value for PS0Z_SCE */ - /* ************************** */ - - T1 = dP_max + dP_max ; - - if ( flg_pprv >= 1 ) { - /* -------------------------- * - * Extrapolate previous value * - * -------------------------- */ - - T1 = here->HSM2_PS0Z_SCE_dvbs_prv * dVbs - + here->HSM2_PS0Z_SCE_dvds_prv * dVds - + here->HSM2_PS0Z_SCE_dvgs_prv * dVgs ; - - if ( fabs(T1) <= dP_max ) { - Ps0_ini = here->HSM2_PS0Z_SCE_prv + T1 ; /* take extrapolated value */ - Ps0_ini_dVds = here->HSM2_PS0Z_SCE_dvds_prv ; - Ps0_ini_dVgs = here->HSM2_PS0Z_SCE_dvgs_prv ; - Ps0_ini_dVbs = here->HSM2_PS0Z_SCE_dvbs_prv ; - } - } /* end of (flg_pprv >=1) if-block */ - - if ( fabs(T1) > dP_max) { - /* ------------------------------------- * - * Analytical initial value for PS0Z_SCE * - * ------------------------------------- */ - - - T1 = here->HSM2_2qnsub_esi ; - T2 = sqrt( T1 * ( Pb20 - Vbsz ) ) ; - Vthq = Pb20 + Vfb + T2 * Cox0_inv ; - Vth = Vthq ; - - TX = 4.0e0 * ( beta * ( Vgs - Vbs ) - 1.0e0 ) / ( fac1p2 * beta2 ) ; - TX_dVds = - 2.0 * TX / fac1 * fac1_dVds ; - TX_dVgs = - 2.0 * TX / fac1 * fac1_dVgs + 4.0 * beta / ( fac1p2 * beta2 ) ; - TX_dVbs = - 2.0 * TX / fac1 * fac1_dVbs - 4.0 * beta / ( fac1p2 * beta2 ) ; - TX += 1.0 ; - if ( TX > epsm10 ) { - T3 = sqrt( TX ) ; - T3_dVd = 0.5 * TX_dVds / T3 ; - T3_dVg = 0.5 * TX_dVgs / T3 ; - T3_dVb = 0.5 * TX_dVbs / T3 ; - } else { - T3 = sqrt( epsm10 ) ; - T3_dVd = T3_dVg = T3_dVb = 0.0 ; - } - Ps0_iniA = Vgs + fac1p2 * beta * 0.5 * ( 1.0e0 - T3 ) ; - Ps0_iniA_dVds = fac1 * beta * ( 1.0 - T3 ) * fac1_dVds - fac1p2 * beta * 0.5 * T3_dVd ; - Ps0_iniA_dVgs = 1.0 + fac1 * beta * ( 1.0 - T3 ) * fac1_dVgs - fac1p2 * beta * 0.5 * T3_dVg ; - Ps0_iniA_dVbs = fac1 * beta * ( 1.0 - T3 ) * fac1_dVbs - fac1p2 * beta * 0.5 * T3_dVb ; - - Chi = beta * ( Ps0_iniA - Vbs ) ; - - if ( Chi < znbd3 ) { - /*-----------------------------------* - * zone-D1/D2 - * - Ps0_ini is the analytical solution of Qs=Qb0 with - * Qb0 being approximated to 3-degree polynomial. - *-----------------*/ - TY = beta * ( Vgs - Vbs ) ; - TY_dVds = 0.0 ; - TY_dVgs = beta ; - TY_dVbs = - beta ; - T1 = 1.0e0 / ( cn_nc3 * beta * fac1 ) ; - T1_dVd = - T1 / fac1 * fac1_dVds ; - T1_dVg = - T1 / fac1 * fac1_dVgs ; - T1_dVb = - T1 / fac1 * fac1_dVbs ; - T2 = 81.0 + 3.0 * T1 ; - T2_dVd = 3.0 * T1_dVd ; - T2_dVg = 3.0 * T1_dVg ; - T2_dVb = 3.0 * T1_dVb ; - T3 = -2916.0 - 81.0 * T1 + 27.0 * T1 * TY ; - T3_dVd = ( - 81.0 + 27.0 * TY ) * T1_dVd + 27.0 * T1 * TY_dVds ; - T3_dVg = ( - 81.0 + 27.0 * TY ) * T1_dVg + 27.0 * T1 * TY_dVgs ; - T3_dVb = ( - 81.0 + 27.0 * TY ) * T1_dVb + 27.0 * T1 * TY_dVbs ; - T4 = T3 ; - T4_dVd = T3_dVd ; - T4_dVg = T3_dVg ; - T4_dVb = T3_dVb ; - T6 = sqrt( 4 * T2 * T2 * T2 + T4 * T4 ) ; - T6_dVd = ( 6.0 * T2 * T2 * T2_dVd + T4 * T4_dVd ) / T6 ; - T6_dVg = ( 6.0 * T2 * T2 * T2_dVg + T4 * T4_dVg ) / T6 ; - T6_dVb = ( 6.0 * T2 * T2 * T2_dVb + T4 * T4_dVb ) / T6 ; - T5 = Fn_Pow( T3 + T6 , C_1o3 ) ; - T5_dVd = ( T3_dVd + T6_dVd ) / ( 3.0 * T5 * T5 ) ; - T5_dVg = ( T3_dVg + T6_dVg ) / ( 3.0 * T5 * T5 ) ; - T5_dVb = ( T3_dVb + T6_dVb ) / ( 3.0 * T5 * T5 ) ; - - TX = 3.0 - ( C_2p_1o3 * T2 ) / ( 3.0 * T5 ) - + 1 / ( 3.0 * C_2p_1o3 ) * T5 ; - TX_dVds = - C_2p_1o3 / (3.0 * T5) * T2_dVd + ( C_2p_1o3 * T2 / (3.0 * T5 * T5) + 1.0 / (3.0 * C_2p_1o3) ) * T5_dVd ; - TX_dVgs = - C_2p_1o3 / (3.0 * T5) * T2_dVg + ( C_2p_1o3 * T2 / (3.0 * T5 * T5) + 1.0 / (3.0 * C_2p_1o3) ) * T5_dVg ; - TX_dVbs = - C_2p_1o3 / (3.0 * T5) * T2_dVb + ( C_2p_1o3 * T2 / (3.0 * T5 * T5) + 1.0 / (3.0 * C_2p_1o3) ) * T5_dVb ; - - Ps0_iniA = TX * beta_inv + Vbs ; - Ps0_iniA_dVds = TX_dVds * beta_inv ; - Ps0_iniA_dVgs = TX_dVgs * beta_inv ; - Ps0_iniA_dVbs = TX_dVbs * beta_inv + 1.0 ; - Ps0_ini = Ps0_iniA ; - Ps0_ini_dVds = Ps0_iniA_dVds ; - Ps0_ini_dVgs = Ps0_iniA_dVgs ; - Ps0_ini_dVbs = Ps0_iniA_dVbs ; - - } else if ( Vgs <= Vth ) { - /*-----------------------------------* - * Weak inversion zone. - *-----------------*/ - Ps0_ini = Ps0_iniA ; - Ps0_ini_dVds = Ps0_iniA_dVds ; - Ps0_ini_dVgs = Ps0_iniA_dVgs ; - Ps0_ini_dVbs = Ps0_iniA_dVbs ; - - } else { - /*-----------------------------------* - * Strong inversion zone. - * - Ps0_iniB : upper bound. - *-----------------*/ - T1 = 1.0 / cnst1 / cnstCoxi ; - T1_dVd = - T1 / cnstCoxi * cnstCoxi_dVd ; - T1_dVg = - T1 / cnstCoxi * cnstCoxi_dVg ; - T1_dVb = - T1 / cnstCoxi * cnstCoxi_dVb ; - T0 = Vgs - Vfb ; - T2 = T1 * T0 * T0 ; - T2_dVd = T1_dVd * T0 * T0 ; - T2_dVg = T1_dVg * T0 * T0 + 2.0 * T1 * T0 ; - T2_dVb = T1_dVb * T0 * T0 ; - T3 = beta + 2.0 / T0 ; - T3_dVg = -2.0 / (T0 * T0) ; - - Ps0_iniB = log( T2 + small ) / T3 ; - Ps0_iniB_dVds = T2_dVd / (T2 * T3) ; - Ps0_iniB_dVgs = T2_dVg / (T2 * T3) - T3_dVg * Ps0_iniB / T3 ; - Ps0_iniB_dVbs = T2_dVb / (T2 * T3) ; - - Fn_SU2( Ps0_ini , Ps0_iniA, Ps0_iniB, c_ps0ini_2, T1,T2) ; - Ps0_ini_dVds = Ps0_iniA_dVds * T1 + Ps0_iniB_dVds * T2 ; - Ps0_ini_dVgs = Ps0_iniA_dVgs * T1 + Ps0_iniB_dVgs * T2 ; - Ps0_ini_dVbs = Ps0_iniA_dVbs * T1 + Ps0_iniB_dVbs * T2 ; - } - } /* end of initial value calulation */ - - /**************************/ - - /* initial value for SCE LOOP */ - PS0_SCE = Ps0_ini ; - PS0_SCE_dVds = Ps0_ini_dVds ; - PS0_SCE_dVgs = Ps0_ini_dVgs ; - PS0_SCE_dVbs = Ps0_ini_dVbs ; - - PS0Z_SCE = Ps0_ini ; - PS0Z_SCE_dVds = Ps0_ini_dVds ; - PS0Z_SCE_dVgs = Ps0_ini_dVgs ; - PS0Z_SCE_dVbs = Ps0_ini_dVbs ; - } /* end of corecip=1 case (initial value calculation) */ - - MAX_LOOP_SCE = 5 ; - NNN = 0 ; - - /* ************************************************************************* */ - -// START_OF_SCE_LOOP : /* outer loop of multi level Newton framework */ - START_OF_SCE_LOOP = 1 ; end_of_part_1 = 0 ; -while( START_OF_SCE_LOOP ) { /* Begin: 1st SCE LOOP */ - while( START_OF_SCE_LOOP ) { /* Begin: 2nd SCE LOOP */ - while( START_OF_SCE_LOOP ) { /* Begin: 3rd SCE LOOP */ - START_OF_SCE_LOOP = 0 ; - - /* ************************************************************************* */ - - /* for multi level Newton method we need the derivatives */ - /* with respect to PS0Z_SCE */ - /* naming convention: ..._dPS0Z means d.../dPS0Z_SCE */ - - - if ( flg_qme == 1 ) { - /*---------------------------------------------------* - * Vthp : Vth with pocket. - *-----------------*/ - - if( corecip ){ - - T1 = here->HSM2_2qnsub_esi ; - Qb0 = sqrt ( T1 ) ; - Qb0_dVb = 0.0 ; - Qb0_dVd = 0.0 ; - Qb0_dVg = 0.0 ; - - Vthp = PS0Z_SCE + Vfb + Qb0 * Cox_inv + here->HSM2_ptovr ; - Vthp_dVb = PS0Z_SCE_dVbs + Qb0_dVb * Cox_inv + Qb0 * Cox_inv_dVb ; - Vthp_dVd = PS0Z_SCE_dVds + Qb0_dVd * Cox_inv + Qb0 * Cox_inv_dVd ; - Vthp_dVg = PS0Z_SCE_dVgs + Qb0_dVg * Cox_inv + Qb0 * Cox_inv_dVg ; - Vthp_dPS0Z = 1.0 ; - - }else{ /* original */ - T1 = here->HSM2_2qnsub_esi ; - Qb0 = sqrt (T1 * (Pb20 - Vbsz2)) ; - T2 = 0.5 * T1 / Qb0 ; - Qb0_dVb = T2 * (- Vbsz2_dVbs) ; - Qb0_dVd = T2 * (- Vbsz2_dVds) ; - Qb0_dVg = T2 * (- Vbsz2_dVgs) ; - - Vthp = Pb20 + Vfb + Qb0 * Cox_inv + here->HSM2_ptovr; - Vthp_dVb = Qb0_dVb * Cox_inv + Qb0 * Cox_inv_dVb ; - Vthp_dVd = Qb0_dVd * Cox_inv + Qb0 * Cox_inv_dVd ; - Vthp_dVg = Qb0_dVg * Cox_inv + Qb0 * Cox_inv_dVg ; - } - - - Pb20b = Pb20 ; - Pb20b_dVb = 0.0 ; - Pb20b_dVd = 0.0 ; - Pb20b_dVg = 0.0 ; - - T0 = 0.95 ; - T1 = T0 * Pb20b - Vbsz2 - 1.0e-3 ; - T1_dVb = T0 * Pb20b_dVb - Vbsz2_dVbs ; - T1_dVd = T0 * Pb20b_dVd - Vbsz2_dVds ; - T1_dVg = T0 * Pb20b_dVg - Vbsz2_dVgs ; - T2 = sqrt (T1 * T1 + 4.0 * T0 * Pb20b * 1.0e-3) ; - T3 = T0 * Pb20b - 0.5 * (T1 + T2) ; - T4 = 2.0 * T0 * 1.0e-3 ; - T5 = T1 / T2 ; - T6 = T4 / T2 ; - T3_dVb = T0 * Pb20b_dVb - - 0.5 * (T1_dVb + (T1_dVb * T5 + T6 * Pb20b_dVb ) ) ; - T3_dVd = T0 * Pb20b_dVd - - 0.5 * (T1_dVd + (T1_dVd * T5 + T6 * Pb20b_dVd ) ) ; - T3_dVg = T0 * Pb20b_dVg - - 0.5 * (T1_dVg + (T1_dVg * T5 + T6 * Pb20b_dVg ) ) ; - Pbsum = Pb20b - T3 ; - Pbsum_dVb = Pb20b_dVb - T3_dVb ; - Pbsum_dVd = Pb20b_dVd - T3_dVd ; - Pbsum_dVg = Pb20b_dVg - T3_dVg ; - - sqrt_Pbsum = sqrt( Pbsum ) ; - - /*-------------------------------------------* - * dVthLP : Short-channel effect induced by pocket. - * - Vth0 : Vth without pocket. - *-----------------*/ - if ( model->HSM2_lp != 0.0 ) { - - if( corecip ){ - - T1 = here->HSM2_2qnsub_esi ; - T2 = model->HSM2_bs2 - Vbsz2 ; - T3 = T2 + small ; - T4 = sqrt (T3 * T3 + 4.0 * vth_dlt) ; - T5 = 0.5 * (T3 + T4) ; - T6 = 0.5 * (1.0 + T3 / T4) ; - T5_dVb = - Vbsz2_dVbs * T6 ; - T5_dVd = - Vbsz2_dVds * T6 ; - T5_dVg = - Vbsz2_dVgs * T6 ; - T7 = 1.0 / T5 ; - bs12 = model->HSM2_bs1 * T7 ; - T8 = - bs12 * T7 ; - bs12_dVb = T8 * T5_dVb ; - bs12_dVd = T8 * T5_dVd ; - bs12_dVg = T8 * T5_dVg ; - - T1 = 0.93 * ( PS0Z_SCE + Ps0_min - Vbsz2 ); - T1_dVb = 0.93 * ( PS0Z_SCE_dVbs + Ps0_min_dVbs - Vbsz2_dVbs ); - T1_dVd = 0.93 * ( PS0Z_SCE_dVds + Ps0_min_dVds - Vbsz2_dVds ); - T1_dVg = 0.93 * ( PS0Z_SCE_dVgs + Ps0_min_dVgs - Vbsz2_dVgs ); - T1_dPS0Z = 0.93 ; - - T2 = bs12 ; - T2_dVb = bs12_dVb ; - T2_dVd = bs12_dVd ; - T2_dVg = bs12_dVg ; - - Fn_SU2( T10 , T2 , T1 , vth_dlt, T0, T3 ) ; - T10_dVb = T2_dVb * T0 + T1_dVb * T3 ; - T10_dVd = T2_dVd * T0 + T1_dVd * T3 ; - T10_dVg = T2_dVg * T0 + T1_dVg * T3 ; - T10_dPS0Z = T1_dPS0Z * T3 ; - - T4 = here->HSM2_2qnsub_esi * ( PS0Z_SCE + Ps0_min - Vbsz2 - T10 ) ; - T4_dVb = here->HSM2_2qnsub_esi * ( PS0Z_SCE_dVbs + Ps0_min_dVbs - Vbsz2_dVbs - T10_dVb ) ; - T4_dVd = here->HSM2_2qnsub_esi * ( PS0Z_SCE_dVds + Ps0_min_dVds - Vbsz2_dVds - T10_dVd ) ; - T4_dVg = here->HSM2_2qnsub_esi * ( PS0Z_SCE_dVgs + Ps0_min_dVgs - Vbsz2_dVgs - T10_dVg ) ; - T4_dPS0Z = here->HSM2_2qnsub_esi * ( 1.0 - T10_dPS0Z ) ; - - if (T4 > arg2){ - Qbmm = sqrt ( T4 ) ; - Qbmm_dVb = 0.5 / Qbmm * T4_dVb ; - Qbmm_dVd = 0.5 / Qbmm * T4_dVd ; - Qbmm_dVg = 0.5 / Qbmm * T4_dVg ; - Qbmm_dPS0Z = 0.5 / Qbmm * T4_dPS0Z ; - } else { - Qbmm = sqrt(arg2) + 0.5 / sqrt(arg2) * ( T4 - arg2) ; - Qbmm_dVb = 0.5 / sqrt(arg2) * T4_dVb ; - Qbmm_dVd = 0.5 / sqrt(arg2) * T4_dVd ; - Qbmm_dVg = 0.5 / sqrt(arg2) * T4_dVg ; - Qbmm_dPS0Z = 0.5 / sqrt(arg2) * T4_dPS0Z ; - } - - dqb = ( Qb0 - Qbmm ) * Cox_inv ; - dqb_dVb = ( Qb0_dVb - Qbmm_dVb ) * Cox_inv + ( Qb0 - Qbmm ) * Cox_inv_dVb ; - dqb_dVd = ( Qb0_dVd - Qbmm_dVd ) * Cox_inv + ( Qb0 - Qbmm ) * Cox_inv_dVd ; - dqb_dVg = ( Qb0_dVg - Qbmm_dVg ) * Cox_inv + ( Qb0 - Qbmm ) * Cox_inv_dVg ; - dqb_dPS0Z = - Qbmm_dPS0Z * Cox_inv ; - - if( codqb == 0 ){ - dqb = 0.0 ; - dqb_dVb = 0.0 ; - dqb_dVd = 0.0 ; - dqb_dVg = 0.0 ; - dqb_dPS0Z = 0.0 ; - } - - T1 = 2.0 * C_QE * here->HSM2_nsubc * C_ESI ; - T2 = sqrt( T1 ) ; - T2_dVb = 0.0 ; - T2_dVd = 0.0 ; - T2_dVg = 0.0 ; - - Vth0 = PS0Z_SCE + Vfb + T2 * Cox_inv ; - Vth0_dVb = PS0Z_SCE_dVbs + T2_dVb * Cox_inv + T2 * Cox_inv_dVb ; - Vth0_dVd = PS0Z_SCE_dVds + T2_dVd * Cox_inv + T2 * Cox_inv_dVd ; - Vth0_dVg = PS0Z_SCE_dVgs + T2_dVg * Cox_inv + T2 * Cox_inv_dVg ; - Vth0_dPS0Z = 1.0 ; - - T1 = C_ESI * Cox_inv ; - T1_dVb = C_ESI * Cox_inv_dVb ; - T1_dVd = C_ESI * Cox_inv_dVd ; - T1_dVg = C_ESI * Cox_inv_dVg ; - T2 = here->HSM2_wdplp ; - - T4 = 1.0e0 / ( model->HSM2_lp * model->HSM2_lp ) ; - T3 = 2.0 * ( model->HSM2_vbi - Pb20 ) * T2 * T4 ; - - T5 = T1 * T3 ; - T5_dVb = T1_dVb * T3 ; - T5_dVd = T1_dVd * T3 ; - T5_dVg = T1_dVg * T3 ; - - T6 = PS0Z_SCE - Vbsz ; - T6_dVb = PS0Z_SCE_dVbs - Vbsz_dVbs ; - T6_dVd = PS0Z_SCE_dVds - Vbsz_dVds ; - T6_dVg = PS0Z_SCE_dVgs ; - T6_dPS0Z = 1.0 ; - - Fn_SZ( T6, T6, C_sce_dlt, T0 ); - T6_dVb *= T0 ; - T6_dVd *= T0 ; - T6_dVg *= T0 ; - T6_dPS0Z *= T0 ; - - dVth0 = T5 * sqrt( T6 ) ; - dVth0_dVb = T5 * 0.5 / sqrt( T6 ) * T6_dVb + T5_dVb * sqrt( T6 ); - dVth0_dVd = T5 * 0.5 / sqrt( T6 ) * T6_dVd + T5_dVd * sqrt( T6 ) ; - dVth0_dVg = T5 * 0.5 / sqrt( T6 ) * T6_dVg + T5_dVg * sqrt( T6 ) ; - dVth0_dPS0Z = T5 * 0.5 / sqrt( T6 ) * T6_dPS0Z ; - - T1 = Vthp - Vth0 ; - T1_dVb = Vthp_dVb - Vth0_dVb ; - T1_dVd = Vthp_dVd - Vth0_dVd ; - T1_dVg = Vthp_dVg - Vth0_dVg ; - T1_dPS0Z = Vthp_dPS0Z - Vth0_dPS0Z ; - - T9 = PS0Z_SCE - Vbsz2 ; - T9_dVb = PS0Z_SCE_dVbs - Vbsz2_dVbs ; - T9_dVd = PS0Z_SCE_dVds - Vbsz2_dVds ; - T9_dVg = PS0Z_SCE_dVgs - Vbsz2_dVgs ; - T9_dPS0Z = 1.0 ; - - T3 = pParam->HSM2_scp1 + pParam->HSM2_scp3 * T9 / model->HSM2_lp + pParam->HSM2_scp2 * Vdsz ; - T3_dVb = pParam->HSM2_scp3 * T9_dVb / model->HSM2_lp ; - T3_dVd = pParam->HSM2_scp3 * T9_dVd / model->HSM2_lp + pParam->HSM2_scp2 * Vdsz_dVds ; - T3_dVg = pParam->HSM2_scp3 * T9_dVg / model->HSM2_lp ; - T3_dPS0Z = pParam->HSM2_scp3 * T9_dPS0Z / model->HSM2_lp ; - - Vdx = model->HSM2_scp21 + Vdsz ; - Vdx2 = Vdx * Vdx + small ; - T4 = Vdx * Vdx + small ; - T4_dVb = 0.0 ; - T4_dVd = 2.0 * Vdx * Vdsz_dVds ; - T4_dVg = 0.0 ; - - T5 = 1.0 / T4 ; - T5_dVb = - T4_dVb / T4 / T4 ; - T5_dVd = - T4_dVd / T4 / T4 ; - T5_dVg = - T4_dVg / T4 / T4 ; - - dVthLP = T1 * dVth0 * T3 + dqb - here->HSM2_msc * T5 ; - dVthLP_dVb = T1_dVb * dVth0 * T3 + T1 * dVth0_dVb * T3 + T1 * dVth0 * T3_dVb + dqb_dVb - here->HSM2_msc * T5_dVb ; - dVthLP_dVd = T1_dVd * dVth0 * T3 + T1 * dVth0_dVd * T3 + T1 * dVth0 * T3_dVd + dqb_dVd - here->HSM2_msc * T5_dVd ; - dVthLP_dVg = T1_dVg * dVth0 * T3 + T1 * dVth0_dVg * T3 + T1 * dVth0 * T3_dVg + dqb_dVg - here->HSM2_msc * T5_dVg ; - dVthLP_dPS0Z = T1_dPS0Z * dVth0 * T3 + T1 * dVth0_dPS0Z * T3 + T1 * dVth0 * T3_dPS0Z + dqb_dPS0Z ; - - }else{ /* original */ - - T1 = here->HSM2_2qnsub_esi ; - T2 = model->HSM2_bs2 - Vbsz2 ; - T3 = T2 + small ; - T4 = sqrt (T3 * T3 + 4.0 * vth_dlt) ; - T5 = 0.5 * (T3 + T4) ; - T6 = 0.5 * (1.0 + T3 / T4) ; - T5_dVb = - Vbsz2_dVbs * T6 ; - T5_dVd = - Vbsz2_dVds * T6 ; - T5_dVg = - Vbsz2_dVgs * T6 ; - T7 = 1.0 / T5 ; - bs12 = model->HSM2_bs1 * T7 ; - T8 = - bs12 * T7 ; - bs12_dVb = T8 * T5_dVb ; - bs12_dVd = T8 * T5_dVd ; - bs12_dVg = T8 * T5_dVg ; - Fn_SU( T10 , Vbsz2 + bs12, 0.93 * Pb20, vth_dlt, T0) ; - Qbmm = sqrt (T1 * (Pb20 - T10 )) ; - T9 = T0 / Qbmm ; - Qbmm_dVb = 0.5 * T1 * - (Vbsz2_dVbs + bs12_dVb) * T9 ; - Qbmm_dVd = 0.5 * T1 * - (Vbsz2_dVds + bs12_dVd) * T9 ; - Qbmm_dVg = 0.5 * T1 * - (Vbsz2_dVgs + bs12_dVg) * T9 ; - - dqb = (Qb0 - Qbmm) * Cox_inv ; - dqb_dVb = Vthp_dVb - Qbmm_dVb * Cox_inv - Qbmm * Cox_inv_dVb ; - dqb_dVd = Vthp_dVd - Qbmm_dVd * Cox_inv - Qbmm * Cox_inv_dVd ; - dqb_dVg = Vthp_dVg - Qbmm_dVg * Cox_inv - Qbmm * Cox_inv_dVg ; - - T1 = 2.0 * C_QE * here->HSM2_nsubc * C_ESI ; - T2 = sqrt( T1 * ( Pb2c - Vbsz2 ) ) ; - Vth0 = Pb2c + Vfb + T2 * Cox_inv ; - T3 = 0.5 * T1 / T2 * Cox_inv ; - Vth0_dVb = T3 * ( - Vbsz2_dVbs ) + T2 * Cox_inv_dVb ; - Vth0_dVd = T3 * ( - Vbsz2_dVds ) + T2 * Cox_inv_dVd ; - Vth0_dVg = T3 * ( - Vbsz2_dVgs ) + T2 * Cox_inv_dVg ; - - T1 = C_ESI * Cox_inv ; - T2 = here->HSM2_wdplp ; - T4 = 1.0e0 / ( model->HSM2_lp * model->HSM2_lp ) ; - T5 = 2.0e0 * ( model->HSM2_vbi - Pb20b ) * T1 * T2 * T4 ; - dVth0 = T5 * sqrt_Pbsum ; - T6 = 0.5 * T5 / sqrt_Pbsum ; - T7 = 2.0e0 * ( model->HSM2_vbi - Pb20b ) * C_ESI * T2 * T4 * sqrt_Pbsum ; - T8 = - 2.0e0 * T1 * T2 * T4 * sqrt_Pbsum ; - dVth0_dVb = T6 * Pbsum_dVb + T7 * Cox_inv_dVb + T8 * Pb20b_dVb ; - dVth0_dVd = T6 * Pbsum_dVd + T7 * Cox_inv_dVd + T8 * Pb20b_dVd ; - dVth0_dVg = T6 * Pbsum_dVg + T7 * Cox_inv_dVg + T8 * Pb20b_dVg ; - - T1 = Vthp - Vth0 ; - T2 = pParam->HSM2_scp1 + pParam->HSM2_scp3 * Pbsum / model->HSM2_lp ; - T3 = T2 + pParam->HSM2_scp2 * Vdsz ; - - Vdx = model->HSM2_scp21 + Vdsz ; - Vdx2 = Vdx * Vdx + small ; - - dVthLP = T1 * dVth0 * T3 + dqb - here->HSM2_msc / Vdx2 ; - T4 = T1 * dVth0 * pParam->HSM2_scp3 / model->HSM2_lp ; - dVthLP_dVb = (Vthp_dVb - Vth0_dVb) * dVth0 * T3 + T1 * dVth0_dVb * T3 - + T4 * Pbsum_dVb + dqb_dVb ; - dVthLP_dVd = (Vthp_dVd - Vth0_dVd) * dVth0 * T3 + T1 * dVth0_dVd * T3 - + T4 * Pbsum_dVd - + T1 * dVth0 * pParam->HSM2_scp2 * Vdsz_dVds - + dqb_dVd - + 2.0e0 * here->HSM2_msc * Vdx * Vdsz_dVds / ( Vdx2 * Vdx2 ) ; - dVthLP_dVg = (Vthp_dVg - Vth0_dVg) * dVth0 * T3 + T1 * dVth0_dVg * T3 - + T4 * Pbsum_dVg + dqb_dVg ; - } - - } else { - dVthLP = 0.0e0 ; - dVthLP_dVb = 0.0e0 ; - dVthLP_dVd = 0.0e0 ; - dVthLP_dVg = 0.0e0 ; - } - - /*---------------------------------------------------* - * dVthSC : Short-channel effect induced by Vds. - *-----------------*/ - - if( corecip ){ - - T3 = here->HSM2_lgate - model->HSM2_parl2 ; - T4 = 1.0e0 / ( T3 * T3 ) ; - T5 = pParam->HSM2_sc3 / here->HSM2_lgate ; - - T6 = pParam->HSM2_sc1 + T5 * ( PS0Z_SCE - Vbsz ) ; - T6_dVb = T5 * ( PS0Z_SCE_dVbs - Vbsz_dVbs ); - T6_dVd = T5 * ( PS0Z_SCE_dVds - Vbsz_dVds ); - T6_dVg = T5 * PS0Z_SCE_dVgs ; - T6_dPS0Z = T5 ; - - /* QME:1 CORECIP:1 */ - if( pParam->HSM2_sc4 != 0 ){ - T8 = pParam->HSM2_sc4 * Vdsz * ( PS0Z_SCE - Vbsz ) ; - T8_dVd = pParam->HSM2_sc4 * ( Vdsz_dVds * ( PS0Z_SCE - Vbsz ) + Vdsz * ( PS0Z_SCE_dVds - Vbsz_dVds ) ) ; - T8_dVb = pParam->HSM2_sc4 * Vdsz * ( PS0Z_SCE_dVbs - Vbsz_dVbs ) ; - T8_dVg = pParam->HSM2_sc4 * Vdsz * PS0Z_SCE_dVgs ; - T8_dPS0Z = pParam->HSM2_sc4 * Vdsz ; - - T1 = T6 + pParam->HSM2_sc2 * Vdsz + T8 ; - T1_dVd = T6_dVd + pParam->HSM2_sc2 * Vdsz_dVds + T8_dVd ; - T1_dVb = T6_dVb + T8_dVb ; - T1_dVg = T6_dVg + T8_dVg ; - T1_dPS0Z = T6_dPS0Z + T8_dPS0Z ; - }else{ - T1 = T6 + pParam->HSM2_sc2 * Vdsz ; - T1_dVb = T6_dVb ; - T1_dVd = T6_dVd + pParam->HSM2_sc2 * Vdsz_dVds ; - T1_dVg = T6_dVg ; - T1_dPS0Z = T6_dPS0Z ; - } - - T0 = C_ESI * here->HSM2_wdpl * 2.0e0 * ( model->HSM2_vbi - Pb20 ) * T4 ; - - T2 = T0 * Cox_inv ; - T2_dVb = T0 * Cox_inv_dVb ; - T2_dVd = T0 * Cox_inv_dVd ; - T2_dVg = T0 * Cox_inv_dVg ; - - A = T2 * T1 ; - A_dVbs = T2 * T1_dVb + T1 * T2_dVb ; - A_dVds = T2 * T1_dVd + T1 * T2_dVd ; - A_dVgs = T2 * T1_dVg + T1 * T2_dVg ; - A_dPS0Z = T2 * T1_dPS0Z ; - - T9 = PS0Z_SCE - Vbsz + Ps0_min ; - T9_dVb = PS0Z_SCE_dVbs - Vbsz_dVbs + Ps0_min_dVbs ; - T9_dVd = PS0Z_SCE_dVds - Vbsz_dVds + Ps0_min_dVds ; - T9_dVg = PS0Z_SCE_dVgs + Ps0_min_dVgs ; - T9_dPS0Z = 1.0 ; - - if ( T9 > arg0 ) { - T8 = sqrt( T9 ) ; - T8_dVb = 0.5 * T9_dVb / T8 ; - T8_dVd = 0.5 * T9_dVd / T8 ; - T8_dVg = 0.5 * T9_dVg / T8 ; - T8_dPS0Z = 0.5 * T9_dPS0Z / T8 ; - } else { - T8 = sqrt(arg0) + 0.5 / sqrt(arg0) * ( T9 - arg0) ; - T8_dVb = 0.5 / sqrt(arg0) * T9_dVb ; - T8_dVd = 0.5 / sqrt(arg0) * T9_dVd ; - T8_dVg = 0.5 / sqrt(arg0) * T9_dVg ; - T8_dPS0Z = 0.5 / sqrt(arg0) * T9_dPS0Z ; - } - - dVthSC = A * T8 ; - dVthSC_dVb = A * T8_dVb + A_dVbs * T8; - dVthSC_dVd = A * T8_dVd + A_dVds * T8; - dVthSC_dVg = A * T8_dVg + A_dVgs * T8; - dVthSC_dPS0Z = A * T8_dPS0Z + A_dPS0Z * T8; - - - }else{ /* original */ - - T1 = C_ESI * Cox_inv ; - T2 = here->HSM2_wdpl ; - T3 = here->HSM2_lgate - model->HSM2_parl2 ; - T4 = 1.0e0 / ( T3 * T3 ) ; - T5 = 2.0e0 * ( model->HSM2_vbi - Pb20b ) * T1 * T2 * T4 ; - - dVth0 = T5 * sqrt_Pbsum ; - T6 = T5 / 2.0 / sqrt_Pbsum ; - T7 = 2.0e0 * ( model->HSM2_vbi - Pb20b ) * C_ESI * T2 * T4 * sqrt_Pbsum ; - T8 = - 2.0e0 * T1 * T2 * T4 * sqrt_Pbsum ; - dVth0_dVb = T6 * Pbsum_dVb + T7 * Cox_inv_dVb + T8 * Pb20b_dVb ; - dVth0_dVd = T6 * Pbsum_dVd + T7 * Cox_inv_dVd + T8 * Pb20b_dVd ; - dVth0_dVg = T6 * Pbsum_dVg + T7 * Cox_inv_dVg + T8 * Pb20b_dVg ; - - T1 = pParam->HSM2_sc3 / here->HSM2_lgate ; - T4 = pParam->HSM2_sc1 + T1 * Pbsum ; - T4_dVb = T1 * Pbsum_dVb ; - T4_dVd = T1 * Pbsum_dVd ; - T4_dVg = T1 * Pbsum_dVg ; - - /* QME:1 CORECIP:0 */ - if( pParam->HSM2_sc4 != 0 ){ - T8 = pParam->HSM2_sc4 * Vdsz * Pbsum ; - T8_dVd = pParam->HSM2_sc4 * ( Vdsz_dVds * Pbsum + Vdsz * Pbsum_dVd ) ; - T8_dVb = pParam->HSM2_sc4 * Vdsz * Pbsum_dVb ; - T8_dVg = pParam->HSM2_sc4 * Vdsz * Pbsum_dVg ; - - T5 = T4 + pParam->HSM2_sc2 * Vdsz + T8 ; - T5_dVd = T4_dVd + pParam->HSM2_sc2 * Vdsz_dVds + T8_dVd ; - T5_dVb = T4_dVb + T8_dVb ; - T5_dVg = T4_dVg + T8_dVg ; - }else{ - T5 = T4 + pParam->HSM2_sc2 * Vdsz ; - T5_dVb = T4_dVb ; - T5_dVd = T4_dVd + pParam->HSM2_sc2 * Vdsz_dVds ; - T5_dVg = T4_dVg ; - } - - dVthSC = dVth0 * T5 ; - dVthSC_dVb = dVth0_dVb * T5 + dVth0 * T5_dVb ; - dVthSC_dVd = dVth0_dVd * T5 + dVth0 * T5_dVd ; - dVthSC_dVg = dVth0_dVg * T5 + dVth0 * T5_dVg ; - - } - - - /*---------------------------------------------------* - * dVthW : narrow-channel effect. - *-----------------*/ - T1 = 1.0 / Cox ; - T2 = T1 * T1 ; - T3 = 1.0 / ( Cox + pParam->HSM2_wfc / Weff ) ; - T4 = T3 * T3 ; - T5 = T1 - T3 ; - T6 = Qb0 * ( T2 - T4 ) ; - - if( corecip ){ - dVthW = Qb0 * T5 + pParam->HSM2_wvth0 / here->HSM2_wg ; - dVthW_dVb = Qb0_dVb * T5 - Cox_dVb * T6 ; - dVthW_dVd = Qb0_dVd * T5 - Cox_dVd * T6 ; - dVthW_dVg = Qb0_dVg * T5 - Cox_dVg * T6 ; - }else{ /* original */ - dVthW = Qb0 * T5 + pParam->HSM2_wvth0 / here->HSM2_wg ; - dVthW_dVb = Qb0_dVb * T5 - Cox_dVb * T6 ; - dVthW_dVd = Qb0_dVd * T5 - Cox_dVd * T6 ; - dVthW_dVg = - Cox_dVg * T6 ; - } - - /* end of case flg_qme = 1 */ - - } else { - - /* now case flg_qme = 0 */ - - /*---------------------------------------------------* - * Vthp : Vth with pocket. - *-----------------*/ - - if( corecip ){ - T1 = here->HSM2_2qnsub_esi ; - Qb0 = sqrt ( T1 ) ; - Qb0_dVb = 0.0 ; - Qb0_dVd = 0.0 ; - Qb0_dVg = 0.0 ; - - Vthp = PS0Z_SCE + Vfb + Qb0 * Cox_inv + here->HSM2_ptovr; - Vthp_dVb = PS0Z_SCE_dVbs + Qb0_dVb * Cox_inv ; - Vthp_dVd = PS0Z_SCE_dVds + Qb0_dVd * Cox_inv ; - Vthp_dVg = PS0Z_SCE_dVgs + Qb0_dVg * Cox_inv ; - Vthp_dPS0Z = 1.0 ; - }else{ /* original */ - T1 = here->HSM2_2qnsub_esi ; - Qb0 = sqrt (T1 * (Pb20 - Vbsz2)) ; - T2 = 0.5 * T1 / Qb0 ; - Qb0_dVb = T2 * (- Vbsz2_dVbs) ; - Qb0_dVd = T2 * (- Vbsz2_dVds) ; - Qb0_dVg = T2 * (- Vbsz2_dVgs) ; - - Vthp = Pb20 + Vfb + Qb0 * Cox_inv + here->HSM2_ptovr; - Vthp_dVb = Qb0_dVb * Cox_inv ; - Vthp_dVd = Qb0_dVd * Cox_inv ; - Vthp_dVg = Qb0_dVg * Cox_inv ; - } - - Pb20b = Pb20 ; - Pb20b_dVb = 0.0 ; - Pb20b_dVd = 0.0 ; - Pb20b_dVg = 0.0 ; - - T0 = 0.95 ; - T1 = T0 * Pb20b - Vbsz2 - 1.0e-3 ; - T1_dVb = T0 * Pb20b_dVb - Vbsz2_dVbs ; - T1_dVd = T0 * Pb20b_dVd - Vbsz2_dVds ; - T1_dVg = T0 * Pb20b_dVg - Vbsz2_dVgs ; - T2 = sqrt (T1 * T1 + 4.0 * T0 * Pb20b * 1.0e-3) ; - T3 = T0 * Pb20b - 0.5 * (T1 + T2) ; - T4 = 2.0 * T0 * 1.0e-3 ; - T5 = T1 / T2 ; - T6 = T4 / T2 ; - T3_dVb = T0 * Pb20b_dVb - - 0.5 * (T1_dVb + (T1_dVb * T5 + T6 * Pb20b_dVb ) ) ; - T3_dVd = T0 * Pb20b_dVd - - 0.5 * (T1_dVd + (T1_dVd * T5 + T6 * Pb20b_dVd ) ) ; - T3_dVg = T0 * Pb20b_dVg - - 0.5 * (T1_dVg + (T1_dVg * T5 + T6 * Pb20b_dVg ) ) ; - Pbsum = Pb20b - T3 ; - Pbsum_dVb = Pb20b_dVb - T3_dVb ; - Pbsum_dVd = Pb20b_dVd - T3_dVd ; - Pbsum_dVg = Pb20b_dVg - T3_dVg ; - - sqrt_Pbsum = sqrt( Pbsum ) ; - - /*-------------------------------------------* - * dVthLP : Short-channel effect induced by pocket. - * - Vth0 : Vth without pocket. - *-----------------*/ - if ( model->HSM2_lp != 0.0 ) { - - if( corecip ){ - T1 = here->HSM2_2qnsub_esi ; - T2 = model->HSM2_bs2 - Vbsz2 ; - T3 = T2 + small ; - T4 = sqrt (T3 * T3 + 4.0 * vth_dlt) ; - T5 = 0.5 * (T3 + T4) ; - T6 = 0.5 * (1.0 + T3 / T4) ; - T5_dVb = - Vbsz2_dVbs * T6 ; - T5_dVd = - Vbsz2_dVds * T6 ; - T5_dVg = - Vbsz2_dVgs * T6 ; - T7 = 1.0 / T5 ; - bs12 = model->HSM2_bs1 * T7 ; - T8 = - bs12 * T7 ; - bs12_dVb = T8 * T5_dVb ; - bs12_dVd = T8 * T5_dVd ; - bs12_dVg = T8 * T5_dVg ; - - T1 = 0.93 * ( PS0Z_SCE + Ps0_min - Vbsz2 ); - T1_dVb = 0.93 * ( PS0Z_SCE_dVbs + Ps0_min_dVbs - Vbsz2_dVbs ); - T1_dVd = 0.93 * ( PS0Z_SCE_dVds + Ps0_min_dVds - Vbsz2_dVds ); - T1_dVg = 0.93 * ( PS0Z_SCE_dVgs + Ps0_min_dVgs - Vbsz2_dVgs ); - T1_dPS0Z = 0.93 ; - - T2 = bs12 ; - T2_dVb = bs12_dVb ; - T2_dVd = bs12_dVd ; - T2_dVg = bs12_dVg ; - - Fn_SU2( T10 , T2 , T1 , vth_dlt, T0, T3 ) ; - T10_dVb = T2_dVb * T0 + T1_dVb * T3 ; - T10_dVd = T2_dVd * T0 + T1_dVd * T3 ; - T10_dVg = T2_dVg * T0 + T1_dVg * T3 ; - T10_dPS0Z = T1_dPS0Z * T3 ; - - T4 = here->HSM2_2qnsub_esi * ( PS0Z_SCE + Ps0_min - Vbsz2 - T10 ) ; - T4_dVb = here->HSM2_2qnsub_esi * ( PS0Z_SCE_dVbs + Ps0_min_dVbs - Vbsz2_dVbs - T10_dVb ) ; - T4_dVd = here->HSM2_2qnsub_esi * ( PS0Z_SCE_dVds + Ps0_min_dVds - Vbsz2_dVds - T10_dVd ) ; - T4_dVg = here->HSM2_2qnsub_esi * ( PS0Z_SCE_dVgs + Ps0_min_dVgs - Vbsz2_dVgs - T10_dVg ) ; - T4_dPS0Z = here->HSM2_2qnsub_esi * ( 1.0 - T10_dPS0Z ) ; - - if (T4 > arg2){ - Qbmm = sqrt ( T4 ) ; - Qbmm_dVb = 0.5 / Qbmm * T4_dVb ; - Qbmm_dVd = 0.5 / Qbmm * T4_dVd ; - Qbmm_dVg = 0.5 / Qbmm * T4_dVg ; - Qbmm_dPS0Z = 0.5 / Qbmm * T4_dPS0Z ; - } else { - Qbmm = sqrt(arg2) + 0.5 / sqrt(arg2) * ( T4 - arg2) ; - Qbmm_dVb = 0.5 / sqrt(arg2) * T4_dVb ; - Qbmm_dVd = 0.5 / sqrt(arg2) * T4_dVd ; - Qbmm_dVg = 0.5 / sqrt(arg2) * T4_dVg ; - Qbmm_dPS0Z = 0.5 / sqrt(arg2) * T4_dPS0Z ; - } - - dqb = ( Qb0 - Qbmm ) * Cox_inv ; - dqb_dVb = ( Qb0_dVb - Qbmm_dVb ) * Cox_inv ; - dqb_dVd = ( Qb0_dVd - Qbmm_dVd ) * Cox_inv ; - dqb_dVg = ( Qb0_dVg - Qbmm_dVg ) * Cox_inv ; - dqb_dPS0Z = ( - Qbmm_dPS0Z ) * Cox_inv ; - - /* W/O QME PART */ - if( codqb == 0 ){ - dqb = 0 ; - dqb_dVb = 0 ; - dqb_dVd = 0 ; - dqb_dVg = 0 ; - dqb_dPS0Z = 0.0 ; - } - - T1 = 2.0 * C_QE * here->HSM2_nsubc * C_ESI ; - T2 = sqrt( T1 ) ; - T2_dVb = 0.0 ; - T2_dVd = 0.0 ; - T2_dVg = 0.0 ; - - Vth0 = PS0Z_SCE + Vfb + T2 * Cox_inv ; - Vth0_dVb = PS0Z_SCE_dVbs + T2_dVb * Cox_inv ; - Vth0_dVd = PS0Z_SCE_dVds + T2_dVd * Cox_inv ; - Vth0_dVg = PS0Z_SCE_dVgs + T2_dVg * Cox_inv ; - Vth0_dPS0Z = 1.0 ; - - T1 = C_ESI * Cox_inv ; - T2 = here->HSM2_wdplp ; - - T4 = 1.0e0 / ( model->HSM2_lp * model->HSM2_lp ) ; - T5 = 2.0e0 * ( model->HSM2_vbi - Pb20 ) * T1 * T2 * T4 ; - T5_dVb = 0.0 ; - T5_dVd = 0.0 ; - T5_dVg = 0.0 ; - - T6 = PS0Z_SCE - Vbsz ; - T6_dVb = PS0Z_SCE_dVbs - Vbsz_dVbs ; - T6_dVd = PS0Z_SCE_dVds - Vbsz_dVds ; - T6_dVg = PS0Z_SCE_dVgs ; - T6_dPS0Z = 1.0 ; - - Fn_SZ(T6, T6, C_sce_dlt, T0 ); - T6 += small ; - T6_dVb *= T0 ; - T6_dVd *= T0 ; - T6_dVg *= T0 ; - T6_dPS0Z *= T0 ; - - dVth0 = T5 * sqrt( T6 ) ; - dVth0_dVb = T5 * 0.5 / sqrt( T6 ) * T6_dVb + T5_dVb * sqrt( T6 ); - dVth0_dVd = T5 * 0.5 / sqrt( T6 ) * T6_dVd + T5_dVd * sqrt( T6 ) ; - dVth0_dVg = T5 * 0.5 / sqrt( T6 ) * T6_dVg + T5_dVg * sqrt( T6 ) ; - dVth0_dPS0Z = T5 * 0.5 / sqrt( T6 ) * T6_dPS0Z ; - - T1 = Vthp - Vth0 ; - T1_dVb = Vthp_dVb - Vth0_dVb ; - T1_dVd = Vthp_dVd - Vth0_dVd ; - T1_dVg = Vthp_dVg - Vth0_dVg ; - T1_dPS0Z = Vthp_dPS0Z - Vth0_dPS0Z ; - - T9 = PS0Z_SCE - Vbsz2 ; - T9_dVb = PS0Z_SCE_dVbs - Vbsz2_dVbs ; - T9_dVd = PS0Z_SCE_dVds - Vbsz2_dVds ; - T9_dVg = PS0Z_SCE_dVgs - Vbsz2_dVgs ; - T9_dPS0Z = 1.0 ; - - T3 = pParam->HSM2_scp1 + pParam->HSM2_scp3 * T9 / model->HSM2_lp + pParam->HSM2_scp2 * Vdsz ; - T3_dVb = pParam->HSM2_scp3 * T9_dVb / model->HSM2_lp ; - T3_dVd = pParam->HSM2_scp3 * T9_dVd / model->HSM2_lp + pParam->HSM2_scp2 * Vdsz_dVds ; - T3_dVg = pParam->HSM2_scp3 * T9_dVg / model->HSM2_lp ; - T3_dPS0Z = pParam->HSM2_scp3 * T9_dPS0Z / model->HSM2_lp ; - - Vdx = model->HSM2_scp21 + Vdsz ; - Vdx2 = Vdx * Vdx + small ; - T4 = Vdx * Vdx + small ; - T4_dVb = 0.0 ; - T4_dVd = 2.0 * Vdx * Vdsz_dVds ; - T4_dVg = 0.0 ; - - T5 = 1.0 / T4 ; - T5_dVb = - T4_dVb / T4 / T4 ; - T5_dVd = - T4_dVd / T4 / T4 ; - T5_dVg = - T4_dVg / T4 / T4 ; - - dVthLP = T1 * dVth0 * T3 + dqb - here->HSM2_msc * T5 ; - dVthLP_dVb = T1_dVb * dVth0 * T3 + T1 * dVth0_dVb * T3 + T1 * dVth0 * T3_dVb + dqb_dVb - here->HSM2_msc * T5_dVb ; - dVthLP_dVd = T1_dVd * dVth0 * T3 + T1 * dVth0_dVd * T3 + T1 * dVth0 * T3_dVd + dqb_dVd - here->HSM2_msc * T5_dVd ; - dVthLP_dVg = T1_dVg * dVth0 * T3 + T1 * dVth0_dVg * T3 + T1 * dVth0 * T3_dVg + dqb_dVg - here->HSM2_msc * T5_dVg ; - dVthLP_dPS0Z = T1_dPS0Z * dVth0 * T3 + T1 * dVth0_dPS0Z * T3 + T1 * dVth0 * T3_dPS0Z + dqb_dPS0Z ; - - }else{ /* Original */ - - T1 = here->HSM2_2qnsub_esi ; - T2 = model->HSM2_bs2 - Vbsz2 ; - T3 = T2 + small ; - T4 = sqrt (T3 * T3 + 4.0 * vth_dlt) ; - T5 = 0.5 * (T3 + T4) ; - T6 = 0.5 * (1.0 + T3 / T4) ; - T5_dVb = - Vbsz2_dVbs * T6 ; - T5_dVd = - Vbsz2_dVds * T6 ; - T5_dVg = - Vbsz2_dVgs * T6 ; - T7 = 1.0 / T5 ; - bs12 = model->HSM2_bs1 * T7 ; - T8 = - bs12 * T7 ; - bs12_dVb = T8 * T5_dVb ; - bs12_dVd = T8 * T5_dVd ; - bs12_dVg = T8 * T5_dVg ; - Fn_SU( T10 , Vbsz2 + bs12, 0.93 * Pb20, vth_dlt, T0) ; - Qbmm = sqrt (T1 * (Pb20 - T10 )) ; - - T9 = T0 / Qbmm ; - Qbmm_dVb = 0.5 * T1 * - (Vbsz2_dVbs + bs12_dVb) * T9 ; - Qbmm_dVd = 0.5 * T1 * - (Vbsz2_dVds + bs12_dVd) * T9 ; - Qbmm_dVg = 0.5 * T1 * - (Vbsz2_dVgs + bs12_dVg) * T9 ; - - dqb = (Qb0 - Qbmm) * Cox_inv ; - dqb_dVb = Vthp_dVb - Qbmm_dVb * Cox_inv ; - dqb_dVd = Vthp_dVd - Qbmm_dVd * Cox_inv ; - dqb_dVg = Vthp_dVg - Qbmm_dVg * Cox_inv ; - - T1 = 2.0 * C_QE * here->HSM2_nsubc * C_ESI ; - T2 = sqrt( T1 * ( Pb2c - Vbsz2 ) ) ; - Vth0 = Pb2c + Vfb + T2 * Cox_inv ; - T3 = 0.5 * T1 / T2 * Cox_inv ; - Vth0_dVb = T3 * ( - Vbsz2_dVbs ) ; - Vth0_dVd = T3 * ( - Vbsz2_dVds ) ; - Vth0_dVg = T3 * ( - Vbsz2_dVgs ) ; - - T1 = C_ESI * Cox_inv ; - T2 = here->HSM2_wdplp ; - - T4 = 1.0e0 / ( model->HSM2_lp * model->HSM2_lp ) ; - T5 = 2.0e0 * ( model->HSM2_vbi - Pb20b ) * T1 * T2 * T4 ; - dVth0 = T5 * sqrt_Pbsum ; - T6 = 0.5 * T5 / sqrt_Pbsum ; - T7 = 2.0e0 * ( model->HSM2_vbi - Pb20b ) * C_ESI * T2 * T4 * sqrt_Pbsum ; - T8 = - 2.0e0 * T1 * T2 * T4 * sqrt_Pbsum ; - dVth0_dVb = T6 * Pbsum_dVb + T8 * Pb20b_dVb ; - dVth0_dVd = T6 * Pbsum_dVd + T8 * Pb20b_dVd ; - dVth0_dVg = T6 * Pbsum_dVg + T8 * Pb20b_dVg ; - - T1 = Vthp - Vth0 ; - T2 = pParam->HSM2_scp1 + pParam->HSM2_scp3 * Pbsum / model->HSM2_lp ; - T3 = T2 + pParam->HSM2_scp2 * Vdsz ; - - Vdx = model->HSM2_scp21 + Vdsz ; - Vdx2 = Vdx * Vdx + small ; - - dVthLP = T1 * dVth0 * T3 + dqb - here->HSM2_msc / Vdx2 ; - T4 = T1 * dVth0 * pParam->HSM2_scp3 / model->HSM2_lp ; - dVthLP_dVb = (Vthp_dVb - Vth0_dVb) * dVth0 * T3 + T1 * dVth0_dVb * T3 - + T4 * Pbsum_dVb + dqb_dVb ; - dVthLP_dVd = (Vthp_dVd - Vth0_dVd) * dVth0 * T3 + T1 * dVth0_dVd * T3 - + T4 * Pbsum_dVd - + T1 * dVth0 * pParam->HSM2_scp2 * Vdsz_dVds - + dqb_dVd - + 2.0e0 * here->HSM2_msc * Vdx * Vdsz_dVds / ( Vdx2 * Vdx2 ) ; - dVthLP_dVg = (Vthp_dVg - Vth0_dVg) * dVth0 * T3 + T1 * dVth0_dVg * T3 - + T4 * Pbsum_dVg + dqb_dVg ; - - } - - } else { - dVthLP = 0.0e0 ; - dVthLP_dVb = 0.0e0 ; - dVthLP_dVd = 0.0e0 ; - dVthLP_dVg = 0.0e0 ; - } - - /*---------------------------------------------------* - * dVthSC : Short-channel effect induced by Vds. - *-----------------*/ - - if( corecip ){ - T3 = here->HSM2_lgate - model->HSM2_parl2 ; - T4 = 1.0e0 / ( T3 * T3 ) ; - T5 = pParam->HSM2_sc3 / here->HSM2_lgate ; - - T6 = pParam->HSM2_sc1 + T5 * ( PS0Z_SCE - Vbsz ) ; - T6_dVb = T5 * ( PS0Z_SCE_dVbs - Vbsz_dVbs ); - T6_dVd = T5 * ( PS0Z_SCE_dVds - Vbsz_dVds ); - T6_dVg = T5 * PS0Z_SCE_dVgs ; - T6_dPS0Z = T5 ; - - /* QME:0 CORECIP:1 */ - if( pParam->HSM2_sc4 != 0 ){ - T8 = pParam->HSM2_sc4 * Vdsz * ( PS0Z_SCE - Vbsz ) ; - T8_dVd = pParam->HSM2_sc4 * ( Vdsz_dVds * ( PS0Z_SCE - Vbsz ) + Vdsz * ( PS0Z_SCE_dVds - Vbsz_dVds ) ) ; - T8_dVb = pParam->HSM2_sc4 * Vdsz * ( PS0Z_SCE_dVbs - Vbsz_dVbs ) ; - T8_dVg = pParam->HSM2_sc4 * Vdsz * PS0Z_SCE_dVgs ; - T8_dPS0Z = pParam->HSM2_sc4 * Vdsz ; - - T1 = T6 + pParam->HSM2_sc2 * Vdsz + T8 ; - T1_dVd = T6_dVd + pParam->HSM2_sc2 * Vdsz_dVds + T8_dVd ; - T1_dVb = T6_dVb + T8_dVb ; - T1_dVg = T6_dVg + T8_dVg ; - T1_dPS0Z = T6_dPS0Z + T8_dPS0Z ; - }else{ - T1 = T6 + pParam->HSM2_sc2 * Vdsz ; - T1_dVb = T6_dVb ; - T1_dVd = T6_dVd + pParam->HSM2_sc2 * Vdsz_dVds ; - T1_dVg = T6_dVg ; - T1_dPS0Z = T6_dPS0Z ; - } - - T2 = C_ESI * Cox_inv * here->HSM2_wdpl * 2.0e0 * ( model->HSM2_vbi - Pb20 ) * T4 ; - - A = T2 * T1 ; - A_dVbs = T2 * T1_dVb ; - A_dVds = T2 * T1_dVd ; - A_dVgs = T2 * T1_dVg ; - A_dPS0Z = T2 * T1_dPS0Z ; - - T7 = PS0Z_SCE - Vbsz + Ps0_min ; - T7_dVb = PS0Z_SCE_dVbs - Vbsz_dVbs + Ps0_min_dVbs; - T7_dVd = PS0Z_SCE_dVds - Vbsz_dVds + Ps0_min_dVds ; - T7_dVg = PS0Z_SCE_dVgs + Ps0_min_dVgs ; - T7_dPS0Z = 1.0 ; - - if ( T7 > arg0 ) { - T8 = sqrt( T7 ) ; - T8_dVb = 0.5 * T7_dVb / T8 ; - T8_dVd = 0.5 * T7_dVd / T8 ; - T8_dVg = 0.5 * T7_dVg / T8 ; - T8_dPS0Z = 0.5 * T7_dPS0Z / T8 ; - } else { - T8 = sqrt(arg0) + 0.5 / sqrt(arg0) * ( T7 - arg0) ; - T8_dVb = 0.5 / sqrt(arg0) * T7_dVb ; - T8_dVd = 0.5 / sqrt(arg0) * T7_dVd ; - T8_dVg = 0.5 / sqrt(arg0) * T7_dVg ; - T8_dPS0Z = 0.5 / sqrt(arg0) * T7_dPS0Z ; - } - - dVthSC = A * T8 ; - dVthSC_dVb = A * T8_dVb + A_dVbs * T8; - dVthSC_dVd = A * T8_dVd + A_dVds * T8; - dVthSC_dVg = A * T8_dVg + A_dVgs * T8; - dVthSC_dPS0Z = A * T8_dPS0Z + A_dPS0Z * T8; - - }else{ /* original */ - - T1 = C_ESI * Cox_inv ; - T2 = here->HSM2_wdpl ; - T3 = here->HSM2_lgate - model->HSM2_parl2 ; - T4 = 1.0e0 / ( T3 * T3 ) ; - T5 = 2.0e0 * ( model->HSM2_vbi - Pb20b ) * T1 * T2 * T4 ; - - dVth0 = T5 * sqrt_Pbsum ; - T6 = T5 / 2.0 / sqrt_Pbsum ; - T7 = 2.0e0 * ( model->HSM2_vbi - Pb20b ) * C_ESI * T2 * T4 * sqrt_Pbsum ; - T8 = - 2.0e0 * T1 * T2 * T4 * sqrt_Pbsum ; - dVth0_dVb = T6 * Pbsum_dVb + T8 * Pb20b_dVb ; - dVth0_dVd = T6 * Pbsum_dVd + T8 * Pb20b_dVd ; - dVth0_dVg = T6 * Pbsum_dVg + T8 * Pb20b_dVg ; - - T1 = pParam->HSM2_sc3 / here->HSM2_lgate ; - T4 = pParam->HSM2_sc1 + T1 * Pbsum ; - T4_dVb = T1 * Pbsum_dVb ; - T4_dVd = T1 * Pbsum_dVd ; - T4_dVg = T1 * Pbsum_dVg ; - - /* QME:0 CORECIP:0 */ - if( pParam->HSM2_sc4 != 0 ){ - T8 = pParam->HSM2_sc4 * Vdsz * Pbsum ; - T8_dVd = pParam->HSM2_sc4 * ( Vdsz_dVds * Pbsum + Vdsz * Pbsum_dVd ) ; - T8_dVb = pParam->HSM2_sc4 * Vdsz * Pbsum_dVb ; - T8_dVg = pParam->HSM2_sc4 * Vdsz * Pbsum_dVg ; - - T5 = T4 + pParam->HSM2_sc2 * Vdsz + T8 ; - T5_dVd = T4_dVd + pParam->HSM2_sc2 * Vdsz_dVds + T8_dVd ; - T5_dVb = T4_dVb + T8_dVb ; - T5_dVg = T4_dVg + T8_dVg ; - }else{ - T5 = T4 + pParam->HSM2_sc2 * Vdsz ; - T5_dVb = T4_dVb ; - T5_dVd = T4_dVd + pParam->HSM2_sc2 * Vdsz_dVds ; - T5_dVg = T4_dVg ; - } - - dVthSC = dVth0 * T5 ; - dVthSC_dVb = dVth0_dVb * T5 + dVth0 * T5_dVb ; - dVthSC_dVd = dVth0_dVd * T5 + dVth0 * T5_dVd ; - dVthSC_dVg = dVth0_dVg * T5 + dVth0 * T5_dVg ; - - } - - /*---------------------------------------------------* - * dVthW : narrow-channel effect. - *-----------------*/ - T1 = 1.0 / Cox ; - T3 = 1.0 / ( Cox + pParam->HSM2_wfc / Weff ) ; - T5 = T1 - T3 ; - - if( corecip ){ - dVthW = Qb0 * T5 + pParam->HSM2_wvth0 / here->HSM2_wg ; - dVthW_dVb = Qb0_dVb * T5 ; - dVthW_dVd = Qb0_dVd * T5 ; - dVthW_dVg = Qb0_dVg * T5 ; - }else{ /* original */ - dVthW = Qb0 * T5 + pParam->HSM2_wvth0 / here->HSM2_wg ; - dVthW_dVb = Qb0_dVb * T5 ; - dVthW_dVd = Qb0_dVd * T5 ; - dVthW_dVg = 0.0 ; - } - - - - } /* end of flg_qme if-blocks */ - - /*---------------------------------------------------* - * dVth : Total variation. - * - Positive dVth means the decrease in Vth. - *-----------------*/ - dVth = dVthSC + dVthLP + dVthW + here->HSM2_dVthsm ; - dVth_dVb = dVthSC_dVb + dVthLP_dVb + dVthW_dVb ; - dVth_dVd = dVthSC_dVd + dVthLP_dVd + dVthW_dVd ; - dVth_dVg = dVthSC_dVg + dVthLP_dVg + dVthW_dVg ; - dVth_dPS0Z = dVthSC_dPS0Z + dVthLP_dPS0Z ; - - /*---------------------------------------------------* - * Vth : Threshold voltagei for OP. - *-----------------*/ - T2 = sqrt( here->HSM2_2qnsub_esi * Pb2 ) ; - Vth = Pb2 + Vfb + T2 * Cox0_inv - dVth ; - - /*-----------------------------------------------------------* - * Constants in the equation of Ps0 . - *-----------------*/ - - fac1 = cnst0 * Cox_inv ; - fac1_dVbs = cnst0 * Cox_inv_dVb ; - fac1_dVds = cnst0 * Cox_inv_dVd ; - fac1_dVgs = cnst0 * Cox_inv_dVg ; - - fac1p2 = fac1 * fac1 ; - /*---------------------------------------------------* - * Poly-Depletion Effect - *-----------------*/ - - if ( here->HSM2_flg_pgd == 0 ) { - dPpg = 0.0 ; - dPpg_dVb = 0.0 ; - dPpg_dVd = 0.0 ; - dPpg_dVg = 0.0 ; - } else { - - T7 = Vgsz ; - T7_dVb = 0.0 ; - T7_dVd = Vgsz_dVds ; - T7_dVg = Vgsz_dVgs ; - - T0 = here->HSM2_cnstpgd ; - - T3 = T7 - model->HSM2_pgd2 ; - T3_dVb = T7_dVb ; - T3_dVd = T7_dVd ; - T3_dVg = T7_dVg ; - - Fn_ExpLim( dPpg , T3 , T6 ) ; - dPpg_dVb = T6 * T3_dVb ; - dPpg_dVd = T6 * T3_dVd ; - dPpg_dVg = T6 * T3_dVg ; - - Fn_SZ( dPpg , dPpg - 1.0 , 0.1 , T6 ) ; - dPpg_dVb *= T6 ; - dPpg_dVd *= T6 ; - dPpg_dVg *= T6 ; - - dPpg *= T0 ; - dPpg_dVb *= T0 ; - dPpg_dVd *= T0 ; - dPpg_dVg *= T0 ; - - Fn_SU( dPpg , dPpg , pol_b , pol_dlt , T9 ) ; - dPpg_dVb *= T9 ; - dPpg_dVd *= T9 ; - dPpg_dVg *= T9 ; - - } - - /*---------------------------------------------------* - * Vgp : Effective gate bias with SCE & RSCE & flatband. - *-----------------*/ - Vgp = Vgs - Vfb + dVth - dPpg ; - Vgp_dVbs = dVth_dVb - dPpg_dVb ; - Vgp_dVds = dVth_dVd - dPpg_dVd ; - Vgp_dVgs = 1.0e0 + dVth_dVg - dPpg_dVg ; - Vgp_dPS0Z = dVth_dPS0Z ; - - Vgpz = Vgsz - Vfb + dVth - dPpg ; /* (tmp) */ - Vgpz_dVbs = dVth_dVb ; - Vgpz_dVds = Vgsz_dVds + dVth_dVd - dPpg_dVd ; - Vgpz_dVgs = Vgsz_dVgs + dVth_dVg - dPpg_dVg ; - Vgpz_dPS0Z = dVth_dPS0Z ; - - /*---------------------------------------------------* - * Vgs_fb : Actual flatband voltage taking account Vbs. - * - note: if Vgs == Vgs_fb then Vgp == Ps0 == Vbs . - *------------------*/ - Vgs_fb = Vfb - dVth + dPpg + Vbs ; - - /*-----------------------------------------------------------* - * Accumulation zone. (zone-A) - * - evaluate basic characteristics and exit from this part. - *-----------------*/ - if ( Vgs < Vgs_fb ) { - - flg_zone = -1 ; - - /*---------------------------------------------------* - * Evaluation of Ps0. - * - Psa : Analytical solution of - * Cox( Vgp - Psa ) = cnst0 * Qacc - * where Qacc is the 3-degree series of (fdep)^{1/2}. - * The unkown is transformed to Chi=beta(Ps0-Vbs). - * - Ps0_min : |Ps0_min| when Vbs=0. - *-----------------*/ - - /* Ps0_min = here->HSM2_eg - Pb2 ; */ - /* -> replaced by approx. solving Poisson equation at Vgs=Vgs_min */ - /* Ps0_min = 2.0 * beta_inv * log(-Vgs_min/fac1) ; already done above */ - - TX = beta * ( Vgp - Vbs ) ; - TX_dVbs = beta * ( Vgp_dVbs - 1.0 ) ; - TX_dVds = beta * Vgp_dVds ; - TX_dVgs = beta * Vgp_dVgs ; - TX_dPS0Z = beta * Vgp_dPS0Z ; - - T1 = 1.0 / ( beta * cnst0 ) ; - TY = T1 * Cox ; - TY_dVbs = T1 * Cox_dVb ; - TY_dVds = T1 * Cox_dVd ; - TY_dVgs = T1 * Cox_dVg ; - - Ac41 = 2.0 + 3.0 * C_SQRT_2 * TY ; - - Ac4 = 8.0 * Ac41 * Ac41 * Ac41 ; - T1 = 72.0 * Ac41 * Ac41 * C_SQRT_2 ; - Ac4_dVbs = T1 * TY_dVbs ; - Ac4_dVds = T1 * TY_dVds ; - Ac4_dVgs = T1 * TY_dVgs ; - - T4 = ( TX - 2.0 ) ; - T5 = 9.0 * TY * T4 ; - T5_dVb = 9.0 * ( TY_dVbs * T4 + TY * TX_dVbs ) ; - T5_dVd = 9.0 * ( TY_dVds * T4 + TY * TX_dVds ) ; - T5_dVg = 9.0 * ( TY_dVgs * T4 + TY * TX_dVgs ) ; - T5_dPS0Z = 9.0 * ( TY * TX_dPS0Z ) ; - - Ac31 = 7.0 * C_SQRT_2 - T5 ; - Ac31_dVbs = -T5_dVb ; - Ac31_dVds = -T5_dVd ; - Ac31_dVgs = -T5_dVg ; - Ac31_dPS0Z = -T5_dPS0Z ; - - Ac3 = Ac31 * Ac31 ; - T1 = 2.0 * Ac31 ; - Ac3_dVbs = T1 * Ac31_dVbs ; - Ac3_dVds = T1 * Ac31_dVds ; - Ac3_dVgs = T1 * Ac31_dVgs ; - Ac3_dPS0Z = T1 * Ac31_dPS0Z ; - - Ac2 = sqrt( Ac4 + Ac3 ) ; - T1 = 0.5 / Ac2 ; - Ac2_dVbs = T1 * ( Ac4_dVbs + Ac3_dVbs ) ; - Ac2_dVds = T1 * ( Ac4_dVds + Ac3_dVds ) ; - Ac2_dVgs = T1 * ( Ac4_dVgs + Ac3_dVgs ) ; - Ac2_dPS0Z = T1 * ( Ac3_dPS0Z ) ; - - Ac1 = -7.0 * C_SQRT_2 + Ac2 + T5 ; - Ac1_dVbs = Ac2_dVbs + T5_dVb ; - Ac1_dVds = Ac2_dVds + T5_dVd ; - Ac1_dVgs = Ac2_dVgs + T5_dVg ; - Ac1_dPS0Z = Ac2_dPS0Z + T5_dPS0Z ; - - Acd = Fn_Pow( Ac1 , C_1o3 ) ; - T1 = C_1o3 / ( Acd * Acd ) ; - Acd_dVbs = Ac1_dVbs * T1 ; - Acd_dVds = Ac1_dVds * T1 ; - Acd_dVgs = Ac1_dVgs * T1 ; - Acd_dPS0Z = Ac1_dPS0Z * T1 ; - - Acn = -4.0 * C_SQRT_2 - 12.0 * TY + 2.0 * Acd + C_SQRT_2 * Acd * Acd ; - T1 = 2.0 + 2.0 * C_SQRT_2 * Acd ; - Acn_dVbs = - 12.0 * TY_dVbs + T1 * Acd_dVbs ; - Acn_dVds = - 12.0 * TY_dVds + T1 * Acd_dVds ; - Acn_dVgs = - 12.0 * TY_dVgs + T1 * Acd_dVgs ; - Acn_dPS0Z = T1 * Acd_dPS0Z ; - - T1 = 1.0 / Acd ; - Chi = Acn * T1 ; - Chi_dVbs = ( Acn_dVbs - Chi * Acd_dVbs ) * T1 ; - Chi_dVds = ( Acn_dVds - Chi * Acd_dVds ) * T1 ; - Chi_dVgs = ( Acn_dVgs - Chi * Acd_dVgs ) * T1 ; - Chi_dPS0Z = ( Acn_dPS0Z - Chi * Acd_dPS0Z ) * T1 ; - - Psa = Chi * beta_inv + Vbs ; - Psa_dVbs = Chi_dVbs * beta_inv + 1.0 ; - Psa_dVds = Chi_dVds * beta_inv ; - Psa_dVgs = Chi_dVgs * beta_inv ; - Psa_dPS0Z = Chi_dPS0Z * beta_inv ; - - T1 = Psa - Vbs ; - T2 = T1 / Ps0_min ; - T3 = sqrt( 1.0 + ( T2 * T2 ) ) ; - - T9 = T2 / T3 / Ps0_min ; - T3_dVb = T9 * ( Psa_dVbs - 1.0 ) ; - T3_dVd = T9 * ( Psa_dVds ) ; - T3_dVg = T9 * ( Psa_dVgs ) ; - T3_dPS0Z = T9 * ( Psa_dPS0Z ) ; - - Ps0 = T1 / T3 + Vbs ; - T9 = 1.0 / ( T3 * T3 ) ; - Ps0_dVbs = T9 * ( ( Psa_dVbs - 1.0 ) * T3 - T1 * T3_dVb ) + 1.0 ; - Ps0_dVds = T9 * ( Psa_dVds * T3 - T1 * T3_dVd ) ; - Ps0_dVgs = T9 * ( Psa_dVgs * T3 - T1 * T3_dVg ) ; - Ps0_dPS0Z = T9 * ( Psa_dPS0Z * T3 - T1 * T3_dPS0Z ) ; - - /*---------------------------------------------------* - * Characteristics. - *-----------------*/ - Psl = Ps0 ; - Psl_dVbs = Ps0_dVbs ; - Psl_dVds = Ps0_dVds ; - Psl_dVgs = Ps0_dVgs ; - - T2 = ( Vgp - Ps0 ) ; - Qbu = Cox * T2 ; - Qbu_dVbs = Cox * ( Vgp_dVbs - Ps0_dVbs ) + Cox_dVb * T2 ; - Qbu_dVds = Cox * ( Vgp_dVds - Ps0_dVds ) + Cox_dVd * T2 ; - Qbu_dVgs = Cox * ( Vgp_dVgs - Ps0_dVgs ) + Cox_dVg * T2 ; - - Qiu = 0.0e0 ; - Qiu_dVbs = 0.0e0 ; - Qiu_dVds = 0.0e0 ; - Qiu_dVgs = 0.0e0 ; - - Qdrat = 0.5e0 ; - Qdrat_dVbs = 0.0e0 ; - Qdrat_dVds = 0.0e0 ; - Qdrat_dVgs = 0.0e0 ; - - Lred = 0.0e0 ; - Lred_dVbs = 0.0e0 ; - Lred_dVds = 0.0e0 ; - Lred_dVgs = 0.0e0 ; - - Ids = 0.0e0 ; - Ids_dVbs = 0.0e0 ; - Ids_dVds = 0.0e0 ; - Ids_dVgs = 0.0e0 ; - - VgVt = 0.0 ; - - flg_noqi = 1 ; - - DJI = 1.0 ; - - if( corecip ){ - /*!! This is for Accumulation Region !!*/ - - T1 = Vds * 0.5 ; - Fn_SymAdd( Pzadd , T1 , model->HSM2_pzadd0 , T2 ) ; - T2 /= 2 ; - Pzadd_dVbs = 0.0 ; - Pzadd_dVds = T2 * ( 1.0 ) ; - Pzadd_dVgs = 0.0 ; - Pzadd_dPS0Z = 0.0 ; - - if ( Pzadd < epsm10 ) { - Pzadd = epsm10 ; - Pzadd_dVbs = 0.0 ; - Pzadd_dVds = 0.0 ; - Pzadd_dVgs = 0.0 ; - Pzadd_dPS0Z = 0.0 ; - } - - Ps0z = Ps0 + Pzadd ; - Ps0z_dVbs = Ps0_dVbs + Pzadd_dVbs ; - Ps0z_dVds = Ps0_dVds + Pzadd_dVds ; - Ps0z_dVgs = Ps0_dVgs + Pzadd_dVgs ; - Ps0z_dPS0Z = Ps0_dPS0Z + Pzadd_dPS0Z ; - - /* calculate Newton correction: */ - G = PS0Z_SCE - Ps0z ; - delta_PS0Z_SCE = - G / (1.0 - Ps0z_dPS0Z) ; - - delta_PS0Z_SCE_dVbs = Ps0z_dVbs - PS0Z_SCE_dVbs; - delta_PS0Z_SCE_dVds = Ps0z_dVds - PS0Z_SCE_dVds; - delta_PS0Z_SCE_dVgs = Ps0z_dVgs - PS0Z_SCE_dVgs; - PS0Z_SCE += delta_PS0Z_SCE ; - PS0Z_SCE_dVbs = Ps0z_dVbs ; - PS0Z_SCE_dVds = Ps0z_dVds ; - PS0Z_SCE_dVgs = Ps0z_dVgs ; - - PS0_SCE = PS0Z_SCE - Pzadd ; - PS0_SCE_dVbs = Ps0_dVbs ; - PS0_SCE_dVds = Ps0_dVds ; - PS0_SCE_dVgs = Ps0_dVgs ; - - NNN += 1 ; - - if( ( fabs(delta_PS0Z_SCE) > PS0_SCE_tol - || fabs(delta_PS0Z_SCE_dVbs) > PS0_SCE_deriv_tol - || fabs(delta_PS0Z_SCE_dVds) > PS0_SCE_deriv_tol - || fabs(delta_PS0Z_SCE_dVgs) > PS0_SCE_deriv_tol - ) && (NNN < MAX_LOOP_SCE) ){ - // goto START_OF_SCE_LOOP; - START_OF_SCE_LOOP = 1 ; - } - } - - //goto end_of_part_1 ; - if( START_OF_SCE_LOOP==0 ) end_of_part_1 = 1 ; - } - - } /* End of 3rd SCE_LOOP */ - if ( end_of_part_1 == 0 ) { /* skip to end_of_part_1 */ - - /*-----------------------------------------------------------* - * Initial guess for Ps0. - *-----------------*/ - - /*---------------------------------------------------* - * Ps0_iniA: solution of subthreshold equation assuming zone-D1/D2. - *-----------------*/ - TX = 1.0e0 + 4.0e0 - * ( beta * ( Vgp - Vbs ) - 1.0e0 ) / ( fac1p2 * beta2 ) ; - TX = Fn_Max( TX , epsm10 ) ; - Ps0_iniA = Vgp + fac1p2 * beta * 0.5 * ( 1.0e0 - sqrt( TX ) ) ; - - /* use analitical value in subthreshold region. */ - if ( Vgs < ( Vfb + Vth ) * 0.5 ) { - flg_pprv = 0 ; - } - - if ( flg_pprv >= 1 ) { - /*---------------------------------------------------* - * Use previous value. - *-----------------*/ - - T1 = Ps0_dVbs * dVbs + Ps0_dVds * dVds + Ps0_dVgs * dVgs ; - Ps0_ini = Ps0 + T1 ; - - if ( flg_pprv == 2 ) { - /* TX_dVxs = d^2 Ps0 / d Vxs^2 here */ - if ( Vbsc_dif2 > epsm10 ) { - TX_dVbs = ( here->HSM2_ps0_dvbs_prv - here->HSM2_ps0_dvbs_prv2 ) - / Vbsc_dif2 ; - } else { - TX_dVbs = 0.0 ; - } - if ( Vdsc_dif2 > epsm10 ) { - TX_dVds = ( here->HSM2_ps0_dvds_prv - here->HSM2_ps0_dvds_prv2 ) - / Vdsc_dif2 ; - } else { - TX_dVds = 0.0 ; - } - if ( Vgsc_dif2 > epsm10 ) { - TX_dVgs = ( here->HSM2_ps0_dvgs_prv - here->HSM2_ps0_dvgs_prv2 ) - / Vgsc_dif2 ; - } else { - TX_dVgs = 0.0 ; - } - T2 = ( dVbs * dVbs ) / 2 * TX_dVbs - + ( dVds * dVds ) / 2 * TX_dVds - + ( dVgs * dVgs ) / 2 * TX_dVgs ; - - if ( fabs( T2 ) < fabs( 0.5 * T1 ) ) { - Ps0_ini += T2 ; - } else { - flg_pprv = 1 ; - } - } - - T1 = Ps0_ini - Ps0 ; - if ( T1 < - dP_max || T1 > dP_max ) { - flg_pprv = 0 ; /* flag changes to analitical */ - } else { - Ps0_iniA = Fn_Max( Ps0_ini , Ps0_iniA ) ; - } - } /* end of (flg_pprv >=1) if-block */ - - if ( flg_pprv == 0 ) { - - /*---------------------------------------------------* - * Analytical initial guess. - *-----------------*/ - /*-------------------------------------------* - * Common part. - *-----------------*/ - Chi = beta * ( Ps0_iniA - Vbs ) ; - - if ( Chi < znbd3 ) { - /*-----------------------------------* - * zone-D1/D2 - * - Ps0_ini is the analytical solution of Qs=Qb0 with - * Qb0 being approximated to 3-degree polynomial. - *-----------------*/ - TY = beta * ( Vgp - Vbs ) ; - T1 = 1.0e0 / ( cn_nc3 * beta * fac1 ) ; - T2 = 81.0 + 3.0 * T1 ; - T3 = -2916.0 - 81.0 * T1 + 27.0 * T1 * TY ; - T4 = 1458.0 - 81.0 * ( 54.0 + T1 ) + 27.0 * T1 * TY ; - T4 = T4 * T4 ; - T5 = Fn_Pow( T3 + sqrt( 4 * T2 * T2 * T2 + T4 ) , C_1o3 ) ; - TX = 3.0 - ( C_2p_1o3 * T2 ) / ( 3.0 * T5 ) - + 1 / ( 3.0 * C_2p_1o3 ) * T5 ; - - Ps0_iniA = TX * beta_inv + Vbs ; - Ps0_ini = Ps0_iniA ; - - } else if ( Vgs <= Vth ) { - /*-----------------------------------* - * Weak inversion zone. - *-----------------*/ - Ps0_ini = Ps0_iniA ; - - } else { - /*-----------------------------------* - * Strong inversion zone. - * - Ps0_iniB : upper bound. - *-----------------*/ - T1 = 1.0 / cnst1 / cnstCoxi ; - T2 = T1 * Vgp * Vgp ; - T3 = beta + 2.0 / Vgp ; - - Ps0_iniB = log( T2 + small ) / T3 ; - - Fn_SU( Ps0_ini , Ps0_iniA, Ps0_iniB, c_ps0ini_2, T1) ; - } - } - - TX = Vbs + ps_conv / 2 ; - if ( Ps0_ini < TX ) Ps0_ini = TX ; - - - /*---------------------------------------------------* - * Assign initial guess. - *-----------------*/ - if ( NNN == 0 ) { - Ps0 = Ps0_ini ; - } - Psl_lim = Ps0_iniA ; - - /*---------------------------------------------------* - * Calculation of Ps0. (beginning of Newton loop) - * - Fs0 : Fs0 = 0 is the equation to be solved. - * - dPs0 : correction value. - *-----------------*/ - exp_bVbs = exp( beta * Vbs ) ; - cfs1 = cnst1 * exp_bVbs ; - - flg_conv = 0 ; - for ( lp_s0 = 1 ; lp_s0 <= lp_s0_max + 1 ; lp_s0 ++ ) { - - Chi = beta * ( Ps0 - Vbs ) ; - - if ( Chi < znbd5 ) { - /*-------------------------------------------* - * zone-D1/D2. (Ps0) - * - Qb0 is approximated to 5-degree polynomial. - *-----------------*/ - fi = Chi * Chi * Chi - * ( cn_im53 + Chi * ( cn_im54 + Chi * cn_im55 ) ) ; - fi_dChi = Chi * Chi - * ( 3 * cn_im53 + Chi * ( 4 * cn_im54 + Chi * 5 * cn_im55 ) ) ; - - fs01 = cfs1 * fi * fi ; - fs01_dPs0 = cfs1 * beta * 2 * fi * fi_dChi ; - - fb = Chi * ( cn_nc51 - + Chi * ( cn_nc52 - + Chi * ( cn_nc53 - + Chi * ( cn_nc54 + Chi * cn_nc55 ) ) ) ) ; - fb_dChi = cn_nc51 - + Chi * ( 2 * cn_nc52 - + Chi * ( 3 * cn_nc53 - + Chi * ( 4 * cn_nc54 + Chi * 5 * cn_nc55 ) ) ) ; - - fs02 = sqrt( fb * fb + fs01 ) ; - fs02_dPs0 = ( beta * fb_dChi * 2 * fb + fs01_dPs0 ) / ( fs02 + fs02 ) ; - - } else { - /*-------------------------------------------* - * zone-D3. (Ps0) - *-----------------*/ - if ( Chi < large_arg ) { /* avoid exp_Chi to become extremely large */ - exp_Chi = exp( Chi ) ; - fs01 = cfs1 * ( exp_Chi - 1.0e0 ) ; - fs01_dPs0 = cfs1 * beta * ( exp_Chi ) ; - } else { - exp_bPs0 = exp( beta*Ps0 ) ; - fs01 = cnst1 * ( exp_bPs0 - exp_bVbs ) ; - fs01_dPs0 = cnst1 * beta * exp_bPs0 ; - } - fs02 = sqrt( Chi - 1.0 + fs01 ) ; - fs02_dPs0 = ( beta + fs01_dPs0 ) / ( fs02 + fs02 ) ; - } /* end of if ( Chi ... ) else block */ - - Fs0 = Vgp - Ps0 - fac1 * fs02 ; - Fs0_dPs0 = - 1.0e0 - fac1 * fs02_dPs0 ; - - if ( flg_conv == 1 ) break ; - - dPs0 = - Fs0 / Fs0_dPs0 ; - - /*-------------------------------------------* - * Update Ps0 . - * - clamped to Vbs if Ps0 < Vbs . - *-----------------*/ - dPlim = 0.5*dP_max*(1.0 + Fn_Max(1.e0,fabs(Ps0))) ; - if ( fabs( dPs0 ) > dPlim ) dPs0 = dPlim * Fn_Sgn( dPs0 ) ; - - Ps0 = Ps0 + dPs0 ; - - TX = Vbs + ps_conv / 2 ; - if ( Ps0 < TX ) Ps0 = TX ; - - /*-------------------------------------------* - * Check convergence. - * NOTE: This condition may be too rigid. - *-----------------*/ - if ( fabs( dPs0 ) <= ps_conv && fabs( Fs0 ) <= gs_conv ) { - flg_conv = 1 ; - } - - } /* end of Ps0 Newton loop */ - - /* Eliminate loop count to take account of the derivative loop */ - lp_s0 -- ; - - /*-------------------------------------------* - * Procedure for diverged case. - *-----------------*/ - if ( flg_conv == 0 ) { - fprintf( stderr , - "*** warning(HiSIM): Went Over Iteration Maximum (Ps0)\n" ) ; - fprintf( stderr , - " Vbse = %7.3f Vdse = %7.3f Vgse = %7.3f\n" , - Vbse , Vdse , Vgse ) ; - if ( flg_info >= 2 ) { - printf( "*** warning(HiSIM): Went Over Iteration Maximum (Ps0)\n" ) ; - } - } - - /*---------------------------------------------------* - * Evaluate derivatives of Ps0. - * - note: Here, fs01_dVbs and fs02_dVbs are derivatives - * w.r.t. explicit Vbs. So, Ps0 in the fs01 and fs02 - * expressions is regarded as a constant. - *-----------------*/ - - /* derivatives of fs0* w.r.t. explicit Vbs */ - if ( Chi < znbd5 ) { - fs01_dVbs = cfs1 * beta * fi * ( fi - 2 * fi_dChi ) ; - T2 = 1.0e0 / ( fs02 + fs02 ) ; - fs02_dVbs = ( - beta * fb_dChi * 2 * fb + fs01_dVbs ) * T2 ; - } else { - fs01_dVbs = - cfs1 * beta ; - T2 = 0.5e0 / fs02 ; - fs02_dVbs = ( - beta + fs01_dVbs ) * T2 ; - } - - T1 = 1.0 / Fs0_dPs0 ; - Ps0_dVbs = - ( Vgp_dVbs - ( fac1 * fs02_dVbs + fac1_dVbs * fs02 ) ) * T1 ; - Ps0_dVds = - ( Vgp_dVds - fac1_dVds * fs02 ) * T1 ; - Ps0_dVgs = - ( Vgp_dVgs - fac1_dVgs * fs02 ) * T1 ; - - if ( Chi < znbd5 ) { - /*-------------------------------------------* - * zone-D1/D2. (Ps0) - * Xi0 := fdep0^2 = fb * fb [D1,D2] - *-----------------*/ - Xi0 = fb * fb + epsm10 ; - T1 = 2 * fb * fb_dChi * beta ; - Xi0_dVbs = T1 * ( Ps0_dVbs - 1.0 ) ; - Xi0_dVds = T1 * Ps0_dVds ; - Xi0_dVgs = T1 * Ps0_dVgs ; - - Xi0p12 = fb + epsm10 ; - T1 = fb_dChi * beta ; - Xi0p12_dVbs = T1 * ( Ps0_dVbs - 1.0 ) ; - Xi0p12_dVds = T1 * Ps0_dVds ; - Xi0p12_dVgs = T1 * Ps0_dVgs ; - - Xi0p32 = fb * fb * fb + epsm10 ; - T1 = 3 * fb * fb * fb_dChi * beta ; - Xi0p32_dVbs = T1 * ( Ps0_dVbs - 1.0 ) ; - Xi0p32_dVds = T1 * Ps0_dVds ; - Xi0p32_dVgs = T1 * Ps0_dVgs ; - - } else { - /*-------------------------------------------* - * zone-D3. (Ps0) - *-----------------*/ - flg_zone = 3 ; - flg_noqi = 0 ; - - /*-----------------------------------* - * Xi0 := fdep0^2 = Chi - 1 = beta * ( Ps0 - Vbs ) - 1 [D3] - *-----------------*/ - Xi0 = Chi - 1.0e0 ; - Xi0_dVbs = beta * ( Ps0_dVbs - 1.0e0 ) ; - Xi0_dVds = beta * Ps0_dVds ; - Xi0_dVgs = beta * Ps0_dVgs ; - - Xi0p12 = sqrt( Xi0 ) ; - T1 = 0.5e0 / Xi0p12 ; - Xi0p12_dVbs = T1 * Xi0_dVbs ; - Xi0p12_dVds = T1 * Xi0_dVds ; - Xi0p12_dVgs = T1 * Xi0_dVgs ; - - Xi0p32 = Xi0 * Xi0p12 ; - T1 = 1.5e0 * Xi0p12 ; - Xi0p32_dVbs = T1 * Xi0_dVbs ; - Xi0p32_dVds = T1 * Xi0_dVds ; - Xi0p32_dVgs = T1 * Xi0_dVgs ; - - } /* end of if ( Chi ... ) block */ - - /*-----------------------------------------------------------* - * - Recalculate the derivatives of fs01 and fs02. - * note: fs01 = cnst1 * exp( Vbs ) * ( exp( Chi ) - Chi - 1.0e0 ) ; - * fs02 = sqrt( Xi0 + fs01 ) ; - *-----------------*/ - fs01_dVbs = Ps0_dVbs * fs01_dPs0 + fs01_dVbs ; - fs01_dVds = Ps0_dVds * fs01_dPs0 ; - fs01_dVgs = Ps0_dVgs * fs01_dPs0 ; - fs02_dVbs = Ps0_dVbs * fs02_dPs0 + fs02_dVbs ; - fs02_dVds = Ps0_dVds * fs02_dPs0 ; - fs02_dVgs = Ps0_dVgs * fs02_dPs0 ; - - /*-----------------------------------------------------------* - * Qb0 : Qb at source side. - * Qn0 : Qi at source side. - *-----------------*/ - - Qb0 = cnst0 * Xi0p12 ; - Qb0_dVb = cnst0 * Xi0p12_dVbs ; - Qb0_dVd = cnst0 * Xi0p12_dVds ; - Qb0_dVg = cnst0 * Xi0p12_dVgs ; - - T1 = 1.0 / ( fs02 + Xi0p12 ) ; - Qn0 = cnst0 * fs01 * T1 ; - - T2 = 1.0 / ( fs01 + epsm10 ) ; - - Qn0_dVbs = Qn0 * ( fs01_dVbs * T2 - ( fs02_dVbs + Xi0p12_dVbs ) * T1 ) ; - Qn0_dVds = Qn0 * ( fs01_dVds * T2 - ( fs02_dVds + Xi0p12_dVds ) * T1 ) ; - Qn0_dVgs = Qn0 * ( fs01_dVgs * T2 - ( fs02_dVgs + Xi0p12_dVgs ) * T1 ) ; - - - /*-----------------------------------------------------------* - * zone-D1 and D2 - *-----------------*/ - if ( Chi < znbd5 ) { - if ( Chi < znbd3 ) { - /*-------------------------------------------* - * zone-D1. (Ps0) - *-----------------*/ - flg_zone = 1 ; - flg_noqi = 1 ; /** !! to be revisited !! **/ - - Qiu = Qn0 ; - Qiu_dVbs = Qn0_dVbs ; - Qiu_dVds = Qn0_dVds ; - Qiu_dVgs = Qn0_dVgs ; - - Qbu = Qb0 ; - Qbu_dVbs = Qb0_dVb ; - Qbu_dVds = Qb0_dVd ; - Qbu_dVgs = Qb0_dVg ; - - Qdrat = 0.5 ; - Qdrat_dVbs = 0.0 ; - Qdrat_dVds = 0.0 ; - Qdrat_dVgs = 0.0 ; - - Lred = 0.0e0 ; - Lred_dVbs = 0.0e0 ; - Lred_dVds = 0.0e0 ; - Lred_dVgs = 0.0e0 ; - - } else { - /*-------------------------------------------* - * zone-D2 (Ps0) - *-----------------*/ - flg_zone = 2 ; - flg_noqi = 0 ; - /*-----------------------------------------------------------* - * FD2 : connecting function for zone-D2. - * - Qiu, Qbu, Qdrat and Lred should be interpolated later. - *-----------------*/ - T1 = 1.0 / ( znbd5 - znbd3 ) ; - TX = T1 * ( Chi - znbd3 ) ; - TX_dVbs = beta * T1 * ( Ps0_dVbs - 1.0 ) ; - TX_dVds = beta * T1 * Ps0_dVds ; - TX_dVgs = beta * T1 * Ps0_dVgs ; - - FD2 = TX * TX * TX * ( 10.0 + TX * ( -15.0 + TX * 6.0 ) ) ; - T4 = TX * TX * ( 30.0 + TX * ( -60.0 + TX * 30.0 ) ) ; - - FD2_dVbs = T4 * TX_dVbs ; - FD2_dVds = T4 * TX_dVds ; - FD2_dVgs = T4 * TX_dVgs ; - } /* end of zone-D2 */ - } - - - /*---------------------------------------------------* - * VgVt : Vgp - Vth_qi. ( Vth_qi is Vth for Qi evaluation. ) - *-----------------*/ - VgVt = Qn0 * Cox_inv ; - VgVt_dVbs = Qn0_dVbs * Cox_inv + Qn0 * Cox_inv_dVb ; - VgVt_dVds = Qn0_dVds * Cox_inv + Qn0 * Cox_inv_dVd ; - VgVt_dVgs = Qn0_dVgs * Cox_inv + Qn0 * Cox_inv_dVg ; - - /*-----------------------------------------------------------* - * make Qi=Qd=Ids=0 if VgVt <= VgVt_small - *-----------------*/ - if ( VgVt <= VgVt_small && model->HSM2_bypass_enable ) { - flg_zone = 4 ; - flg_noqi = 1 ; - - Psl = Ps0 ; - Psl_dVbs = Ps0_dVbs ; - Psl_dVds = Ps0_dVds ; - Psl_dVgs = Ps0_dVgs ; - - - Pds = 0.0 ; - Pds_dVbs = 0.0 ; - Pds_dVds = 0.0 ; - Pds_dVgs = 0.0 ; - - Qbu = Qb0 ; - Qbu_dVbs = Qb0_dVb ; - Qbu_dVds = Qb0_dVd ; - Qbu_dVgs = Qb0_dVg ; - - Qiu = 0.0 ; - Qiu_dVbs = 0.0 ; - Qiu_dVds = 0.0 ; - Qiu_dVgs = 0.0 ; - - Qdrat = 0.5 ; - Qdrat_dVbs = 0.0 ; - Qdrat_dVds = 0.0 ; - Qdrat_dVgs = 0.0 ; - - Lred = 0.0 ; - Lred_dVbs = 0.0 ; - Lred_dVds = 0.0 ; - Lred_dVgs = 0.0 ; - - Ids = 0.0e0 ; - Ids_dVbs = 0.0e0 ; - Ids_dVds = 0.0e0 ; - Ids_dVgs = 0.0e0 ; - - DJI = 1.0 ; - - - if( corecip ){ - - Fs0_dPS0Z = Vgp_dPS0Z ; - Ps0_dPS0Z = - Fs0_dPS0Z / Fs0_dPs0 ; - - T1 = Vds * 0.5 ; - Fn_SymAdd( Pzadd , T1 , model->HSM2_pzadd0 , T2 ) ; - T2 /= 2 ; - Pzadd_dVbs = 0.0 ; - Pzadd_dVds = T2 * ( 1.0 ) ; - Pzadd_dVgs = 0.0 ; - Pzadd_dPS0Z = 0.0 ; - if ( Pzadd < epsm10 ) { - Pzadd = epsm10 ; - Pzadd_dVbs = 0.0 ; - Pzadd_dVds = 0.0 ; - Pzadd_dVgs = 0.0 ; - Pzadd_dPS0Z = 0.0 ; - } - - Ps0z = Ps0 + Pzadd ; - Ps0z_dVbs = Ps0_dVbs + Pzadd_dVbs ; - Ps0z_dVds = Ps0_dVds + Pzadd_dVds ; - Ps0z_dVgs = Ps0_dVgs + Pzadd_dVgs ; - Ps0z_dPS0Z = Ps0_dPS0Z + Pzadd_dPS0Z ; - - /* calculate Newton correction: */ - G = PS0Z_SCE - Ps0z ; - delta_PS0Z_SCE = - G / (1.0 - Ps0z_dPS0Z) ; - - delta_PS0Z_SCE_dVbs = Ps0z_dVbs - PS0Z_SCE_dVbs; - delta_PS0Z_SCE_dVds = Ps0z_dVds - PS0Z_SCE_dVds; - delta_PS0Z_SCE_dVgs = Ps0z_dVgs - PS0Z_SCE_dVgs; - PS0Z_SCE += delta_PS0Z_SCE ; - PS0Z_SCE_dVbs = Ps0z_dVbs ; - PS0Z_SCE_dVds = Ps0z_dVds ; - PS0Z_SCE_dVgs = Ps0z_dVgs ; - - PS0_SCE = PS0Z_SCE - Pzadd ; - PS0_SCE_dVbs = Ps0_dVbs ; - PS0_SCE_dVds = Ps0_dVds ; - PS0_SCE_dVgs = Ps0_dVgs ; - - - NNN += 1 ; - - if( ( fabs(delta_PS0Z_SCE) > PS0_SCE_tol - || fabs(delta_PS0Z_SCE_dVbs) > PS0_SCE_deriv_tol - || fabs(delta_PS0Z_SCE_dVds) > PS0_SCE_deriv_tol - || fabs(delta_PS0Z_SCE_dVgs) > PS0_SCE_deriv_tol - ) && (NNN < MAX_LOOP_SCE) ){ - //go to START_OF_SCE_LOOP; - START_OF_SCE_LOOP = 1 ; - } - - } - - //goto end_of_part_1 ; - if( START_OF_SCE_LOOP==0 ) end_of_part_1 = 1 ; - - } - - } /* skip end_of_part_1 */ - } /* End of 2nd SCE_LOOP */ - if( end_of_part_1 == 0 ) { /* skip to end_of_part_1 */ - - /*-----------------------------------------------------------* - * Start point of Psl (= Ps0 + Pds) calculation. (label) - *-----------------*/ -/* start_of_Psl:*/ - - - /* Vdseff (begin) */ - Vdsorg = Vds ; - - T2 = here->HSM2_qnsub_esi / ( Cox * Cox ) ; - T4 = - 2.0e0 * T2 / Cox ; - T2_dVb = T4 * Cox_dVb ; - T2_dVd = T4 * Cox_dVd ; - T2_dVg = T4 * Cox_dVg ; - - T5 = Vgpz - beta_inv - Vbsz ; - T5_dVb = Vgpz_dVbs - Vbsz_dVbs ; - T5_dVd = Vgpz_dVds - Vbsz_dVds ; - T5_dVg = Vgpz_dVgs ; - - T0 = 2.0 / T2 ; - T1 = 1.0e0 + T0 * T5 ; - T1_dVb = ( T5_dVb * T2 - T5 * T2_dVb ) * T0 / T2 ; - T1_dVd = ( T5_dVd * T2 - T5 * T2_dVd ) * T0 / T2 ; - T1_dVg = ( T5_dVg * T2 - T5 * T2_dVg ) * T0 / T2 ; - - Fn_SZ( T1 , T1 , 0.05 , T9 ) ; - T1 += small ; - T1_dVb *= T9 ; - T1_dVd *= T9 ; - T1_dVg *= T9 ; - - T3 = sqrt( T1 ) ; - T3_dVb = 0.5 / T3 * T1_dVb ; - T3_dVd = 0.5 / T3 * T1_dVd ; - T3_dVg = 0.5 / T3 * T1_dVg ; - - T10 = Vgpz + T2 * ( 1.0e0 - T3 ) ; - T10_dVb = Vgpz_dVbs + T2_dVb * ( 1.0e0 - T3 ) - T2 * T3_dVb ; - T10_dVd = Vgpz_dVds + T2_dVd * ( 1.0e0 - T3 ) - T2 * T3_dVd ; - T10_dVg = Vgpz_dVgs + T2_dVg * ( 1.0e0 - T3 ) - T2 * T3_dVg ; - Fn_SZ( T10 , T10 , 0.01 , T0 ) ; - T10 += epsm10 ; - T10_dVb *= T0 ; - T10_dVd *= T0 ; - T10_dVg *= T0 ; - - - T1 = Vds / T10 ; - T2 = Fn_Pow( T1 , here->HSM2_ddlt - 1.0e0 ) ; - T7 = T2 * T1 ; - T0 = here->HSM2_ddlt * T2 / ( T10 * T10 ) ; - T7_dVb = T0 * ( - Vds * T10_dVb ) ; - T7_dVd = T0 * ( T10 - Vds * T10_dVd ) ; - T7_dVg = T0 * ( - Vds * T10_dVg ) ; - - T3 = 1.0 + T7 ; - T4 = Fn_Pow( T3 , 1.0 / here->HSM2_ddlt - 1.0 ) ; - T6 = T4 * T3 ; - T0 = T4 / here->HSM2_ddlt ; - T6_dVb = T0 * T7_dVb ; - T6_dVd = T0 * T7_dVd ; - T6_dVg = T0 * T7_dVg ; - - Vdseff = Vds / T6 ; - T0 = 1.0 / ( T6 * T6 ) ; - Vdseff_dVbs = - Vds * T6_dVb * T0 ; - Vdseff_dVds = ( T6 - Vds * T6_dVd ) * T0 ; - Vdseff_dVgs = - Vds * T6_dVg * T0 ; - - Vds = Vdseff ; - /* Vdseff (end) */ - - - exp_bVbsVds = exp( beta * ( Vbs - Vds ) ) ; - - - /*---------------------------------------------------* - * Skip Psl calculation when Vds is very small. - *-----------------*/ - if ( Vds <= 0.0 ) { - Pds = 0.0 ; - Psl = Ps0 ; - flg_conv = 1 ; - goto start_of_loopl ; - } - - /*-----------------------------------------------------------* - * Initial guess for Pds ( = Psl - Ps0 ). - *-----------------*/ - if ( flg_pprv >= 1 ) { - /*---------------------------------------------------* - * Use previous value. - *-----------------*/ - - T1 = Pds_dVbs * dVbs + Pds_dVds * dVds + Pds_dVgs * dVgs ; - Pds_ini = Pds + T1 ; - - if ( flg_pprv == 2 ) { - /* TX_dVxs = d^2 Pds / d Vxs^2 here */ - if ( Vbsc_dif2 > epsm10 ) { - TX_dVbs = ( here->HSM2_pds_dvbs_prv - here->HSM2_pds_dvbs_prv2 ) - / Vbsc_dif2 ; - } else { - TX_dVbs = 0.0 ; - } - if ( Vdsc_dif2 > epsm10 ) { - TX_dVds = ( here->HSM2_pds_dvds_prv - here->HSM2_pds_dvds_prv2 ) - / Vdsc_dif2 ; - } else { - TX_dVds = 0.0 ; - } - if ( Vgsc_dif2 > epsm10 ) { - TX_dVgs = ( here->HSM2_pds_dvgs_prv - here->HSM2_pds_dvgs_prv2 ) - / Vgsc_dif2 ; - } else { - TX_dVgs = 0.0 ; - } - T2 = ( dVbs * dVbs ) / 2 * TX_dVbs - + ( dVds * dVds ) / 2 * TX_dVds - + ( dVgs * dVgs ) / 2 * TX_dVgs ; - - if ( fabs( T2 ) < fabs( 0.5 * T1 ) ) { - Pds_ini += T2 ; - } else { - flg_pprv = 1 ; - } - } - - T1 = Pds_ini - Pds ; - if ( T1 < - dP_max || T1 > dP_max ) flg_pprv = 0 ; /* flag changes */ - - } /* end of (flg_pprv>=1) if-block */ - - if ( flg_pprv == 0 ) { - /*---------------------------------------------------* - * Analytical initial guess. - *-----------------*/ - Pds_max = Fn_Max( Psl_lim - Ps0 , 0.0e0 ) ; - - Fn_SU( Pds_ini , Vds, (1.0e0 + c_pslini_1) * Pds_max, c_pslini_2, T1 ) ; - Pds_ini = Fn_Min( Pds_ini , Pds_max ) ; - } - - if ( Pds_ini < 0.0 ) Pds_ini = 0.0 ; - else if ( Pds_ini > Vds ) Pds_ini = Vds ; - - - /*---------------------------------------------------* - * Assign initial guess. - *-----------------*/ - if ( NNN == 0 ) { - Pds = Pds_ini ; - Psl = Ps0 + Pds ; - } else { - /* take solution from previous PS0_SCE_loop as initial value */ - Pds = Psl - Ps0 ; - } - TX = Vbs + ps_conv / 2 ; - if ( Psl < TX ) Psl = TX ; - - /*---------------------------------------------------* - * Calculation of Psl by solving Poisson eqn. - * (beginning of Newton loop) - * - Fsl : Fsl = 0 is the equation to be solved. - * - dPsl : correction value. - *-----------------*/ - flg_conv = 0 ; - - /*---------------------------------------------------* - * start of Psl calculation. (label) - *-----------------*/ -start_of_loopl: - - for ( lp_sl = 1 ; lp_sl <= lp_sl_max + 1 ; lp_sl ++ ) { - - Chi = beta * ( Psl - Vbs ) ; - - if ( Chi < znbd5 ) { - /*-------------------------------------------* - * zone-D2. (Psl) - * - Qb0 is approximated to 5-degree polynomial. - *-----------------*/ - - fi = Chi * Chi * Chi - * ( cn_im53 + Chi * ( cn_im54 + Chi * cn_im55 ) ) ; - fi_dChi = Chi * Chi - * ( 3 * cn_im53 + Chi * ( 4 * cn_im54 + Chi * 5 * cn_im55 ) ) ; - - cfs1 = cnst1 * exp_bVbsVds ; - fsl1 = cfs1 * fi * fi ; - fsl1_dPsl = cfs1 * beta * 2 * fi * fi_dChi ; - - fb = Chi * ( cn_nc51 - + Chi * ( cn_nc52 - + Chi * ( cn_nc53 - + Chi * ( cn_nc54 + Chi * cn_nc55 ) ) ) ) ; - fb_dChi = cn_nc51 - + Chi * ( 2 * cn_nc52 - + Chi * ( 3 * cn_nc53 - + Chi * ( 4 * cn_nc54 + Chi * 5 * cn_nc55 ) ) ) ; - - fsl2 = sqrt( fb * fb + fsl1 ) ; - fsl2_dPsl = ( beta * fb_dChi * 2 * fb + fsl1_dPsl ) / ( fsl2 + fsl2 ) ; - - } else { - /*-------------------------------------------* - * zone-D3. (Psl) - *-----------------*/ - Rho = beta * ( Psl - Vds ) ; - exp_Rho = exp( Rho ) ; - - fsl1 = cnst1 * ( exp_Rho - exp_bVbsVds ) ; - fsl1_dPsl = cnst1 * beta * ( exp_Rho ) ; - Xil = Chi - 1.0e0 ; - fsl2 = sqrt( Xil + fsl1 ) ; - fsl2_dPsl = ( beta + fsl1_dPsl ) / ( fsl2 + fsl2 ) ; - } - - Fsl = Vgp - Psl - fac1 * fsl2 ; - Fsl_dPsl = - 1.0e0 - fac1 * fsl2_dPsl ; - - if ( flg_conv == 1 ) break ; - - dPsl = - Fsl / Fsl_dPsl ; - - /*-------------------------------------------* - * Update Psl . - * - clamped to Vbs if Psl < Vbs . - *-----------------*/ - dPlim = 0.5*dP_max*(1.0 + Fn_Max(1.e0,fabs(Psl))) ; - if ( fabs( dPsl ) > dPlim ) dPsl = dPlim * Fn_Sgn( dPsl ) ; - - Psl = Psl + dPsl ; - - TX = Vbs + ps_conv / 2 ; - if ( Psl < TX ) Psl = TX ; - - /*-------------------------------------------* - * Check convergence. - * NOTE: This condition may be too rigid. - *-----------------*/ - if ( fabs( dPsl ) <= ps_conv && fabs( Fsl ) <= gs_conv ) { - flg_conv = 1 ; - } - } /* end of Psl Newton loop */ - - /* Eliminate loop count to take account of the derivative loop */ - lp_sl -- ; - - /*-------------------------------------------* - * Procedure for diverged case. - *-----------------*/ - if ( flg_conv == 0 ) { - fprintf( stderr , - "*** warning(HiSIM): Went Over Iteration Maximum (Psl)\n" ) ; - fprintf( stderr , - " Vbse = %7.3f Vdse = %7.3f Vgse = %7.3f\n" , - Vbse , Vdse , Vgse ) ; - if ( flg_info >= 2 ) { - printf("*** warning(HiSIM): Went Over Iteration Maximum (Psl)\n" ) ; - } - } - - - /*---------------------------------------------------* - * Evaluate derivatives of Psl. - * - note: Here, fsl1_dVbs and fsl2_dVbs are derivatives - * w.r.t. explicit Vbs. So, Psl in the fsl1 and fsl2 - * expressions is regarded as a constant. - *-----------------*/ - if ( Chi < znbd5 ) { - T1 = cfs1 * beta * fi ; - fsl1_dVbs = T1 * ( ( 1.0 - Vdseff_dVbs ) * fi - 2.0 * fi_dChi ) ; - fsl1_dVds = - T1 * fi * Vdseff_dVds ; - fsl1_dVgs = - T1 * fi * Vdseff_dVgs ; - T2 = 0.5 / fsl2 ; - fsl2_dVbs = ( - beta * fb_dChi * 2 * fb + fsl1_dVbs ) * T2 ; - fsl2_dVds = fsl1_dVds * T2 ; - fsl2_dVgs = fsl1_dVgs * T2 ; - } else { - T1 = cnst1 * beta ; - fsl1_dVbs = - T1 * ( exp_Rho * Vdseff_dVbs - + ( 1.0 - Vdseff_dVbs ) * exp_bVbsVds ); - fsl1_dVds = - T1 * Vdseff_dVds * ( exp_Rho - exp_bVbsVds ); - fsl1_dVgs = T1 * Vdseff_dVgs * ( - exp_Rho + exp_bVbsVds ); - T2 = 0.5e0 / fsl2 ; - fsl2_dVbs = ( - beta + fsl1_dVbs ) * T2 ; - fsl2_dVds = ( fsl1_dVds ) * T2 ; - fsl2_dVgs = ( fsl1_dVgs ) * T2 ; - } - - T1 = 1.0 / Fsl_dPsl ; - Psl_dVbs = - ( Vgp_dVbs - ( fac1 * fsl2_dVbs + fac1_dVbs * fsl2 ) ) * T1 ; - Psl_dVds = - ( Vgp_dVds - ( fac1 * fsl2_dVds + fac1_dVds * fsl2 ) ) * T1 ; - Psl_dVgs = - ( Vgp_dVgs - ( fac1 * fsl2_dVgs + fac1_dVgs * fsl2 ) ) * T1 ; - - if ( Chi < znbd5 ) { - /*-------------------------------------------* - * zone-D1/D2. (Psl) - *-----------------*/ - Xil = fb * fb + epsm10 ; - T1 = 2 * fb * fb_dChi * beta ; - Xil_dVbs = T1 * ( Psl_dVbs - 1.0 ) ; - Xil_dVds = T1 * Psl_dVds ; - Xil_dVgs = T1 * Psl_dVgs ; - - Xilp12 = fb + epsm10 ; - T1 = fb_dChi * beta ; - Xilp12_dVbs = T1 * ( Psl_dVbs - 1.0 ) ; - Xilp12_dVds = T1 * Psl_dVds ; - Xilp12_dVgs = T1 * Psl_dVgs ; - - Xilp32 = fb * fb * fb + epsm10 ; - T1 = 3 * fb * fb * fb_dChi * beta ; - Xilp32_dVbs = T1 * ( Psl_dVbs - 1.0 ) ; - Xilp32_dVds = T1 * Psl_dVds ; - Xilp32_dVgs = T1 * Psl_dVgs ; - - } else { - /*-------------------------------------------* - * zone-D3. (Psl) - *-----------------*/ - - Xil = Chi - 1.0e0 ; - Xil_dVbs = beta * ( Psl_dVbs - 1.0e0 ) ; - Xil_dVds = beta * Psl_dVds ; - Xil_dVgs = beta * Psl_dVgs ; - - Xilp12 = sqrt( Xil ) ; - T1 = 0.5e0 / Xilp12 ; - Xilp12_dVbs = T1 * Xil_dVbs ; - Xilp12_dVds = T1 * Xil_dVds ; - Xilp12_dVgs = T1 * Xil_dVgs ; - - Xilp32 = Xil * Xilp12 ; - T1 = 1.5e0 * Xilp12 ; - Xilp32_dVbs = T1 * Xil_dVbs ; - Xilp32_dVds = T1 * Xil_dVds ; - Xilp32_dVgs = T1 * Xil_dVgs ; - - } - - /*---------------------------------------------------* - * Assign Pds. - *-----------------*/ - Pds = Psl - Ps0 ; - - if ( Pds < 0.0 ) { - Pds = 0.0 ; - Psl = Ps0 ; - } - - Pds_dVbs = Psl_dVbs - Ps0_dVbs ; - Pds_dVds = Psl_dVds - Ps0_dVds ; - Pds_dVgs = Psl_dVgs - Ps0_dVgs ; - - if ( Pds < ps_conv ) { - Pds_dVbs = 0.0 ; - Pds_dVgs = 0.0 ; - Psl_dVbs = Ps0_dVbs ; - Psl_dVgs = Ps0_dVgs ; - } - - /* Vdseff */ - Vds = Vdsorg; - - - if( corecip ){ - - /* For multi level Newton method to calculate PS0Z_SCE */ - /* remember that for the inner Newton: */ - /* Fs0(PS0Z_SCE,Ps0) = Vgp(PSOZ_SCE) - Ps0 - fac1 * fs02(Ps0) */ - /* -> dPs0/dPS0Z_SCE = - (dFs0/dPS0Z_SCE) / (dFs0/dPs0) */ - /* and */ - /* Fsl(PS0Z_SCE,Psl) = Vgp(PS0Z_SCE) - Psl - fac1 * fsl1(Psl) */ - /* -> dPsl/dPS0Z_SCE = - (dFsl/dPS0Z_SCE) / (dFsl/dPsl) */ - - /* Outer Newton: */ - /* PS0Z_SCE = Ps0 + Pzadd(Ps0,Psl) */ - /* -> G(PS0Z_SCE) := PS0Z_SCE - Ps0(PS0Z_SCE) - Pzadd(Ps0(PS0Z_SCE),Psl(Ps0Z_SCE)) = 0 */ - /* -> Newton correction delta_PS0Z_SCE from: */ - /* (1.0 - dPs0/dPS0Z_SCE - dPzadd/dPS0Z_SCE) * delta_PS0Z_SCE = - G */ - - Fs0_dPS0Z = Vgp_dPS0Z ; - Ps0_dPS0Z = - Fs0_dPS0Z / Fs0_dPs0 ; - - Fsl_dPS0Z = Vgp_dPS0Z ; - Psl_dPS0Z = - Fsl_dPS0Z / Fsl_dPsl ; - - if ( Pds < ps_conv ) { - Pds_dPS0Z = 0.0 ; - } else { - Pds_dPS0Z = Psl_dPS0Z - Ps0_dPS0Z ; - } - - T1 = ( Vds - Pds ) / 2 ; - Fn_SymAdd( Pzadd , T1 , model->HSM2_pzadd0 , T2 ) ; - T2 /= 2 ; - Pzadd_dVbs = T2 * ( - Pds_dVbs ) ; - Pzadd_dVds = T2 * ( 1.0 - Pds_dVds ) ; - Pzadd_dVgs = T2 * ( - Pds_dVgs ) ; - Pzadd_dPS0Z = T2 * ( - Pds_dPS0Z) ; - - if ( Pzadd < epsm10 ) { - Pzadd = epsm10 ; - Pzadd_dVbs = 0.0 ; - Pzadd_dVds = 0.0 ; - Pzadd_dVgs = 0.0 ; - Pzadd_dPS0Z = 0.0 ; - } - - Ps0z = Ps0 + Pzadd ; - Ps0z_dVbs = Ps0_dVbs + Pzadd_dVbs ; - Ps0z_dVds = Ps0_dVds + Pzadd_dVds ; - Ps0z_dVgs = Ps0_dVgs + Pzadd_dVgs ; - Ps0z_dPS0Z = Ps0_dPS0Z + Pzadd_dPS0Z ; - - - /* calculate Newton correction: */ - G = PS0Z_SCE - Ps0z ; - delta_PS0Z_SCE = - G / (1.0 - Ps0z_dPS0Z) ; - - delta_PS0Z_SCE_dVbs = Ps0z_dVbs - PS0Z_SCE_dVbs; - delta_PS0Z_SCE_dVds = Ps0z_dVds - PS0Z_SCE_dVds; - delta_PS0Z_SCE_dVgs = Ps0z_dVgs - PS0Z_SCE_dVgs; - PS0Z_SCE += delta_PS0Z_SCE ; - PS0Z_SCE_dVbs = Ps0z_dVbs ; - PS0Z_SCE_dVds = Ps0z_dVds ; - PS0Z_SCE_dVgs = Ps0z_dVgs ; - - PS0_SCE = PS0Z_SCE - Pzadd ; - PS0_SCE_dVbs = Ps0_dVbs ; - PS0_SCE_dVds = Ps0_dVds ; - PS0_SCE_dVgs = Ps0_dVgs ; - - NNN += 1 ; - - if( ( fabs(delta_PS0Z_SCE) > PS0_SCE_tol - || fabs(delta_PS0Z_SCE_dVbs) > PS0_SCE_deriv_tol - || fabs(delta_PS0Z_SCE_dVds) > PS0_SCE_deriv_tol - || fabs(delta_PS0Z_SCE_dVgs) > PS0_SCE_deriv_tol - ) && (NNN < MAX_LOOP_SCE) ){ - // goto START_OF_SCE_LOOP; - START_OF_SCE_LOOP = 1 ; - } - - - } - - } /* skip end_of_part_1 */ -} /* End of 1st SCE_LOOP */ - if ( end_of_part_1 == 0 ) { /* skip to end_of_part_1 */ - - /*-----------------------------------------------------------* - * Evaluate Idd. - * - Eta : substantial variable of QB'/Pds and Idd/Pds. - * - note: Eta = 4 * GAMMA_{hisim_0} - *-----------------*/ - T1 = beta / Xi0 ; - Eta = T1 * Pds ; - T2 = Eta * beta_inv ; - Eta_dVbs = T1 * ( Pds_dVbs - Xi0_dVbs * T2 ) ; - Eta_dVds = T1 * ( Pds_dVds - Xi0_dVds * T2 ) ; - Eta_dVgs = T1 * ( Pds_dVgs - Xi0_dVgs * T2 ) ; - - /* ( Eta + 1 )^n */ - Eta1 = Eta + 1.0e0 ; - Eta1p12 = sqrt( Eta1 ) ; - Eta1p32 = Eta1p12 * Eta1 ; - Eta1p52 = Eta1p32 * Eta1 ; - - /* 1 / ( ( Eta + 1 )^n + 1 ) */ - Zeta12 = 1.0e0 / ( Eta1p12 + 1.0e0 ) ; - Zeta32 = 1.0e0 / ( Eta1p32 + 1.0e0 ) ; - Zeta52 = 1.0e0 / ( Eta1p52 + 1.0e0 ) ; - - /*---------------------------------------------------* - * F00 := PS00/Pds (n=1/2) - *-----------------*/ - F00 = Zeta12 / Xi0p12 ; - T3 = - 1 / Xi0 ; - T4 = - 0.5e0 / Eta1p12 * F00 ; - T5 = Zeta12 * T3 ; - T6 = Zeta12 * T4 ; - F00_dVbs = ( Xi0p12_dVbs * T5 + Eta_dVbs * T6 ) ; - F00_dVds = ( Xi0p12_dVds * T5 + Eta_dVds * T6 ) ; - F00_dVgs = ( Xi0p12_dVgs * T5 + Eta_dVgs * T6 ) ; - - /*---------------------------------------------------* - * F10 := PS10/Pds (n=3/2) - *-----------------*/ - T1 = 3.0e0 + Eta * ( 3.0e0 + Eta ) ; - F10 = C_2o3 * Xi0p12 * Zeta32 * T1 ; - T2 = 3.0e0 + Eta * 2.0e0 ; - T3 = C_2o3 * T1 ; - T4 = - 1.5e0 * Eta1p12 * F10 + C_2o3 * Xi0p12 * T2 ; - T5 = Zeta32 * T3 ; - T6 = Zeta32 * T4 ; - F10_dVbs = ( Xi0p12_dVbs * T5 + Eta_dVbs * T6 ) ; - F10_dVds = ( Xi0p12_dVds * T5 + Eta_dVds * T6 ) ; - F10_dVgs = ( Xi0p12_dVgs * T5 + Eta_dVgs * T6 ) ; - - /*---------------------------------------------------* - * F30 := PS30/Pds (n=5/2) - *-----------------*/ - T1 = 5e0 + Eta * ( 10e0 + Eta * ( 10e0 + Eta * ( 5e0 + Eta ) ) ) ; - F30 = 4e0 / ( 15e0 * beta ) * Xi0p32 * Zeta52 * T1 ; - T2 = 10e0 + Eta * ( 20e0 + Eta * ( 15e0 + Eta * 4e0 ) ) ; - T3 = 4e0 / ( 15e0 * beta ) * T1 ; - T4 = - ( 5e0 / 2e0 ) * Eta1p32 * F30 + 4e0 / ( 15e0 * beta ) * Xi0p32 * T2 ; - T5 = Zeta52 * T3 ; - T6 = Zeta52 * T4 ; - F30_dVbs = ( Xi0p32_dVbs * T5 + Eta_dVbs * T6 ) ; - F30_dVds = ( Xi0p32_dVds * T5 + Eta_dVds * T6 ) ; - F30_dVgs = ( Xi0p32_dVgs * T5 + Eta_dVgs * T6 ) ; - - /*---------------------------------------------------* - * F11 := PS11/Pds. - *-----------------*/ - F11 = Ps0 * F10 + C_2o3 * beta_inv * Xilp32 - F30 ; - T1 = C_2o3 * beta_inv ; - F11_dVbs = Ps0_dVbs * F10 + Ps0 * F10_dVbs - + T1 * Xilp32_dVbs - F30_dVbs ; - F11_dVds = Ps0_dVds * F10 + Ps0 * F10_dVds - + T1 * Xilp32_dVds - F30_dVds ; - F11_dVgs = Ps0_dVgs * F10 + Ps0 * F10_dVgs - + T1 * Xilp32_dVgs - F30_dVgs ; - - /*---------------------------------------------------* - * Fdd := Idd/Pds. - *-----------------*/ - T1 = Vgp + beta_inv - 0.5e0 * ( 2.0e0 * Ps0 + Pds ) ; - T2 = - F10 + F00 ; - T3 = beta * Cox ; - T4 = beta * cnst0 ; - Fdd = T3 * T1 + T4 * T2 ; - Fdd_dVbs = T3 * ( Vgp_dVbs - Ps0_dVbs - 0.5e0 * Pds_dVbs ) - + beta * Cox_dVb * T1 + T4 * ( - F10_dVbs + F00_dVbs ) ; - Fdd_dVds = T3 * ( Vgp_dVds - Ps0_dVds - 0.5e0 * Pds_dVds ) - + beta * Cox_dVd * T1 + T4 * ( - F10_dVds + F00_dVds ) ; - Fdd_dVgs = T3 * ( Vgp_dVgs - Ps0_dVgs - 0.5e0 * Pds_dVgs ) - + beta * Cox_dVg * T1 + T4 * ( - F10_dVgs + F00_dVgs ) ; - - - /*---------------------------------------------------* - * Idd: - *-----------------*/ - Idd = Pds * Fdd ; - Idd_dVbs = Pds_dVbs * Fdd + Pds * Fdd_dVbs ; - Idd_dVds = Pds_dVds * Fdd + Pds * Fdd_dVds ; - Idd_dVgs = Pds_dVgs * Fdd + Pds * Fdd_dVgs ; - - /*-----------------------------------------------------------* - * Skip CLM and integrated charges if zone==D1 - *-----------------*/ - if( flg_zone == 1 ) { - goto start_of_mobility ; - } - - /*-----------------------------------------------------------* - * Channel Length Modulation. Lred: \Delta L - *-----------------*/ - if( pParam->HSM2_clm2 < epsm10 && pParam->HSM2_clm3 < epsm10 ) { - Lred = 0.0e0 ; - Lred_dVbs = 0.0e0 ; - Lred_dVds = 0.0e0 ; - Lred_dVgs = 0.0e0 ; - - Psdl = Psl ; - Psdl_dVbs = Psl_dVbs ; - Psdl_dVds = Psl_dVds ; - Psdl_dVgs = Psl_dVgs ; - if ( Psdl > Ps0 + Vds - epsm10 ) { - Psdl = Ps0 + Vds - epsm10 ; - Psdl_dVbs = Ps0_dVbs ; - Psdl_dVds = Ps0_dVds + 1.0 ; - Psdl_dVgs = Ps0_dVgs ; - } - - } else { - T1 = here->HSM2_wdpl ; - T8 = sqrt (Psl - Vbs) ; - Wd = T1 * T8 ; - T9 = 0.5 * T1 / T8 ; - Wd_dVbs = T9 * (Psl_dVbs - 1.0) ; - Wd_dVds = T9 * Psl_dVds ; - Wd_dVgs = T9 * Psl_dVgs ; - - T0 = 1.0 / Wd ; - T1 = Qn0 * T0 ; - T2 = pParam->HSM2_clm3 * T1 ; - T3 = pParam->HSM2_clm3 * T0 ; - T2_dVb = T3 * (Qn0_dVbs - T1 * Wd_dVbs) ; - T2_dVd = T3 * (Qn0_dVds - T1 * Wd_dVds) ; - T2_dVg = T3 * (Qn0_dVgs - T1 * Wd_dVgs) ; - - T5 = pParam->HSM2_clm2 * q_Nsub + T2 ; - T1 = 1.0 / T5 ; - T4 = C_ESI * T1 ; - T4_dVb = - T4 * T2_dVb * T1 ; - T4_dVd = - T4 * T2_dVd * T1 ; - T4_dVg = - T4 * T2_dVg * T1 ; - - T1 = (1.0e0 - pParam->HSM2_clm1) ; - Psdl = pParam->HSM2_clm1 * (Vds + Ps0) + T1 * Psl ; - Psdl_dVbs = pParam->HSM2_clm1 * Ps0_dVbs + T1 * Psl_dVbs ; - Psdl_dVds = pParam->HSM2_clm1 * (1.0 + Ps0_dVds) + T1 * Psl_dVds ; - Psdl_dVgs = pParam->HSM2_clm1 * Ps0_dVgs + T1 * Psl_dVgs ; - if ( Psdl > Ps0 + Vds - epsm10 ) { - Psdl = Ps0 + Vds - epsm10 ; - Psdl_dVbs = Ps0_dVbs ; - Psdl_dVds = Ps0_dVds + 1.0 ; - Psdl_dVgs = Ps0_dVgs ; - } - T6 = Psdl - Psl ; - T6_dVb = Psdl_dVbs - Psl_dVbs ; - T6_dVd = Psdl_dVds - Psl_dVds ; - T6_dVg = Psdl_dVgs - Psl_dVgs ; - - T3 = beta * Qn0 ; - T1 = 1.0 / T3 ; - T5 = Idd * T1 ; - T2 = T5 * beta ; - T5_dVb = (Idd_dVbs - T2 * Qn0_dVbs) * T1 ; - T5_dVd = (Idd_dVds - T2 * Qn0_dVds) * T1 ; - T5_dVg = (Idd_dVgs - T2 * Qn0_dVgs) * T1 ; - - T10 = q_Nsub / C_ESI ; - T1 = C_E0_p2 ; // E0^2 - T2 = 1.0 / Leff ; - T11 = (2.0 * T5 + 2.0 * T10 * T6 * T4 + T1 * T4) * T2 ; - T3 = T2 * T4 ; - T7 = T11 * T4 ; - T7_dVb = (2.0 * T5_dVb + 2.0 * T10 * (T6_dVb * T4 + T6 * T4_dVb) + T1 * T4_dVb) * T3 + T11 * T4_dVb ; - T7_dVd = (2.0 * T5_dVd + 2.0 * T10 * (T6_dVd * T4 + T6 * T4_dVd) + T1 * T4_dVd) * T3 + T11 * T4_dVd ; - T7_dVg = (2.0 * T5_dVg + 2.0 * T10 * (T6_dVg * T4 + T6 * T4_dVg) + T1 * T4_dVg) * T3 + T11 * T4_dVg ; - - T11 = 4.0 * (2.0 * T10 * T6 + T1) ; - T1 = 8.0 * T10 * T4 * T4 ; - T2 = 2.0 * T11 * T4 ; - T8 = T11 * T4 * T4 ; - T8_dVb = ( T1 * T6_dVb + T2 * T4_dVb) ; - T8_dVd = ( T1 * T6_dVd + T2 * T4_dVd) ; - T8_dVg = ( T1 * T6_dVg + T2 * T4_dVg) ; - - T9 = sqrt (T7 * T7 + T8); - T1 = 1.0 / T9 ; - T2 = T7 * T1 ; - T3 = 0.5 * T1 ; - T9_dVb = (T2 * T7_dVb + T3 * T8_dVb) ; - T9_dVd = (T2 * T7_dVd + T3 * T8_dVd) ; - T9_dVg = (T2 * T7_dVg + T3 * T8_dVg) ; - - Lred = 0.5 * (- T7 + T9) ; - Lred_dVbs = 0.5 * (- T7_dVb + T9_dVb) ; - Lred_dVds = 0.5 * (- T7_dVd + T9_dVd) ; - Lred_dVgs = 0.5 * (- T7_dVg + T9_dVg) ; - - /*---------------------------------------------------* - * Modify Lred for symmetry. - *-----------------*/ - T1 = Lred ; - Lred = FMDVDS * T1 ; - Lred_dVbs = FMDVDS_dVbs * T1 + FMDVDS * Lred_dVbs ; - Lred_dVds = FMDVDS_dVds * T1 + FMDVDS * Lred_dVds ; - Lred_dVgs = FMDVDS_dVgs * T1 + FMDVDS * Lred_dVgs ; - } - - /* CLM5 & CLM6 */ - Lred *= here->HSM2_clmmod ; - Lred_dVbs *= here->HSM2_clmmod ; - Lred_dVds *= here->HSM2_clmmod ; - Lred_dVgs *= here->HSM2_clmmod ; - - - /*---------------------------------------------------* - * Qbu : -Qb in unit area. - *-----------------*/ - T1 = Vgp + beta_inv ; - T2 = T1 * F10 - F11 ; - - Qbnm = cnst0 * ( cnst0 * ( 1.5e0 - ( Xi0 + 1.0e0 ) - 0.5e0 * beta * Pds ) - + Cox * T2 ) ; - Qbnm_dVbs = cnst0 * ( cnst0 * ( - Xi0_dVbs - 0.5e0 * beta * Pds_dVbs ) - + Cox * ( Vgp_dVbs * F10 + T1 * F10_dVbs - F11_dVbs ) - + Cox_dVb * T2 ) ; - Qbnm_dVds = cnst0 * ( cnst0 * ( - Xi0_dVds - 0.5e0 * beta * Pds_dVds ) - + Cox * ( Vgp_dVds * F10 + T1 * F10_dVds - F11_dVds ) - + Cox_dVd * T2 ) ; - Qbnm_dVgs = cnst0 * ( cnst0 * ( - Xi0_dVgs - 0.5e0 * beta * Pds_dVgs ) - + Cox * ( Vgp_dVgs * F10 + T1 * F10_dVgs - F11_dVgs ) - + Cox_dVg * T2 ) ; - - T1 = beta ; - Qbu = T1 * Qbnm / Fdd ; - T2 = T1 / ( Fdd * Fdd ) ; - Qbu_dVbs = T2 * ( Fdd * Qbnm_dVbs - Qbnm * Fdd_dVbs ) ; - Qbu_dVds = T2 * ( Fdd * Qbnm_dVds - Qbnm * Fdd_dVds ) ; - Qbu_dVgs = T2 * ( Fdd * Qbnm_dVgs - Qbnm * Fdd_dVgs ) ; - - /*---------------------------------------------------* - * preparation for Qi and Qd. - * - DtPds: Delta * Pds ; - * - Achi: (1+Delta) * Pds ; - *-----------------*/ - T1 = 2.0e0 * fac1 ; - DtPds = T1 * ( F10 - Xi0p12 ) ; - T2 = 2.0 * ( F10 - Xi0p12 ) ; - DtPds_dVbs = T1 * ( F10_dVbs - Xi0p12_dVbs ) - + T2 * fac1_dVbs ; - DtPds_dVds = T1 * ( F10_dVds - Xi0p12_dVds ) - + T2 * fac1_dVds ; - DtPds_dVgs = T1 * ( F10_dVgs - Xi0p12_dVgs ) - + T2 * fac1_dVgs ; - - Achi = Pds + DtPds ; - Achi_dVbs = Pds_dVbs + DtPds_dVbs ; - Achi_dVds = Pds_dVds + DtPds_dVds ; - Achi_dVgs = Pds_dVgs + DtPds_dVgs ; - - /*-----------------------------------------------------------* - * Alpha : parameter to evaluate charges. - * - Achi: (1+Delta) * Pds ; - * - clamped to 0 if Alpha < 0. - *-----------------*/ - T1 = 1.0 / VgVt ; - T2 = Achi * T1 ; - T3 = 1.0e0 - T2 ; - TX = 1.0 - T3 ; - Fn_CP( TY , TX , 1.0 , 4 , T4 ) ; - Alpha = 1.0 - TY ; - T5 = T1 * T4 ; - Alpha_dVbs = - ( Achi_dVbs - T2 * VgVt_dVbs ) * T5 ; - Alpha_dVds = - ( Achi_dVds - T2 * VgVt_dVds ) * T5 ; - Alpha_dVgs = - ( Achi_dVgs - T2 * VgVt_dVgs ) * T5 ; - - - /*-----------------------------------------------------------* - * Qiu : -Qi in unit area. - *-----------------*/ - - Qinm = 1.0e0 + Alpha * ( 1.0e0 + Alpha ) ; - T1 = 1.0e0 + Alpha + Alpha ; - Qinm_dVbs = Alpha_dVbs * T1 ; - Qinm_dVds = Alpha_dVds * T1 ; - Qinm_dVgs = Alpha_dVgs * T1 ; - - Qidn = Fn_Max( 1.0e0 + Alpha , epsm10 ) ; - Qidn_dVbs = Alpha_dVbs ; - Qidn_dVds = Alpha_dVds ; - Qidn_dVgs = Alpha_dVgs ; - - T1 = C_2o3 * VgVt * Qinm / Qidn ; - Qiu = T1 * Cox ; - T2 = 1.0 / VgVt ; - T3 = 1.0 / Qinm ; - T4 = 1.0 / Qidn ; - Qiu_dVbs = Qiu * ( VgVt_dVbs * T2 + Qinm_dVbs * T3 - Qidn_dVbs * T4 ) - + T1 * Cox_dVb ; - Qiu_dVds = Qiu * ( VgVt_dVds * T2 + Qinm_dVds * T3 - Qidn_dVds * T4) - + T1 * Cox_dVd ; - Qiu_dVgs = Qiu * ( VgVt_dVgs * T2 + Qinm_dVgs * T3 - Qidn_dVgs * T4) - + T1 * Cox_dVg ; - - /*-----------------------------------------------------------* - * Qdrat : Qd/Qi - *-----------------*/ - Qdnm = 0.5e0 + Alpha ; - Qdnm_dVbs = Alpha_dVbs ; - Qdnm_dVds = Alpha_dVds ; - Qdnm_dVgs = Alpha_dVgs ; - - Qddn = Qidn * Qinm ; - Qddn_dVbs = Qidn_dVbs * Qinm + Qidn * Qinm_dVbs ; - Qddn_dVds = Qidn_dVds * Qinm + Qidn * Qinm_dVds ; - Qddn_dVgs = Qidn_dVgs * Qinm + Qidn * Qinm_dVgs ; - - Quot = 0.4e0 * Qdnm / Qddn ; - Qdrat = 0.6e0 - Quot ; - - if ( Qdrat <= 0.5e0 ) { - T1 = 1.0 / Qddn ; - T2 = 1.0 / Qdnm ; - Qdrat_dVbs = Quot * ( Qddn_dVbs * T1 - Qdnm_dVbs * T2 ) ; - Qdrat_dVds = Quot * ( Qddn_dVds * T1 - Qdnm_dVds * T2 ) ; - Qdrat_dVgs = Quot * ( Qddn_dVgs * T1 - Qdnm_dVgs * T2 ) ; - } else { - Qdrat = 0.5e0 ; - Qdrat_dVbs = 0.0e0 ; - Qdrat_dVds = 0.0e0 ; - Qdrat_dVgs = 0.0e0 ; - } - - - /*-----------------------------------------------------------* - * Interpolate charges and CLM for zone-D2. - *-----------------*/ - - if ( flg_zone == 2 ) { - T1 = Qbu ; - Qbu = FD2 * Qbu + ( 1.0 - FD2 ) * Qb0 ; - Qbu_dVbs = FD2 * Qbu_dVbs + FD2_dVbs * T1 - + ( 1.0 - FD2 ) * Qb0_dVb - FD2_dVbs * Qb0 ; - Qbu_dVds = FD2 * Qbu_dVds + FD2_dVds * T1 - + ( 1.0 - FD2 ) * Qb0_dVd - FD2_dVds * Qb0 ; - Qbu_dVgs = FD2 * Qbu_dVgs + FD2_dVgs * T1 - + ( 1.0 - FD2 ) * Qb0_dVg - FD2_dVgs * Qb0 ; - - if ( Qbu < 0.0 ) { - Qbu = 0.0 ; - Qbu_dVbs = 0.0 ; - Qbu_dVds = 0.0 ; - Qbu_dVgs = 0.0 ; - } - T1 = Qiu ; - Qiu = FD2 * Qiu + ( 1.0 - FD2 ) * Qn0 ; - Qiu_dVbs = FD2 * Qiu_dVbs + FD2_dVbs * T1 - + ( 1.0 - FD2 ) * Qn0_dVbs - FD2_dVbs * Qn0 ; - Qiu_dVds = FD2 * Qiu_dVds + FD2_dVds * T1 - + ( 1.0 - FD2 ) * Qn0_dVds - FD2_dVds * Qn0 ; - Qiu_dVgs = FD2 * Qiu_dVgs + FD2_dVgs * T1 - + ( 1.0 - FD2 ) * Qn0_dVgs - FD2_dVgs * Qn0 ; - if ( Qiu < 0.0 ) { - Qiu = 0.0 ; - Qiu_dVbs = 0.0 ; - Qiu_dVds = 0.0 ; - Qiu_dVgs = 0.0 ; - } - - T1 = Qdrat ; - Qdrat = FD2 * Qdrat + ( 1.0 - FD2 ) * 0.5e0 ; - Qdrat_dVbs = FD2 * Qdrat_dVbs + FD2_dVbs * T1 - FD2_dVbs * 0.5e0 ; - Qdrat_dVds = FD2 * Qdrat_dVds + FD2_dVds * T1 - FD2_dVds * 0.5e0 ; - Qdrat_dVgs = FD2 * Qdrat_dVgs + FD2_dVgs * T1 - FD2_dVgs * 0.5e0 ; - - /* note: Lred=0 in zone-D1 */ - T1 = Lred ; - Lred = FD2 * Lred ; - Lred_dVbs = FD2 * Lred_dVbs + FD2_dVbs * T1 ; - Lred_dVds = FD2 * Lred_dVds + FD2_dVds * T1 ; - Lred_dVgs = FD2 * Lred_dVgs + FD2_dVgs * T1 ; - } /* end of flg_zone==2 if-block */ - - -start_of_mobility: - - Lch = Leff - Lred ; - if ( Lch < 1.0e-9 ) { - Lch = 1.0e-9 ; Lch_dVbs = Lch_dVds = Lch_dVgs = 0.0 ; - } else { Lch_dVbs = - Lred_dVbs ; Lch_dVds = - Lred_dVds ; Lch_dVgs = - Lred_dVgs ; } - - - - /*-----------------------------------------------------------* - * Muun : universal mobility. (CGS unit) - *-----------------*/ - - T1 = here->HSM2_ndep_o_esi / C_m2cm ; /* fix in version 2.8 */ - T2 = here->HSM2_ninv_o_esi / C_m2cm ; /* fix in version 2.8 */ - - T0 = here->HSM2_ninvd ; - T3 = sqrt(Pds*Pds + model->HSM2_vzadd0) ; - Pdsz = T3 - sqrt(model->HSM2_vzadd0) ; - Pdsz_dVbs = Pds_dVbs * Pds / T3 ; - Pdsz_dVds = Pds_dVds * Pds / T3 ; - Pdsz_dVgs = Pds_dVgs * Pds / T3 ; - - T4 = 1.0 + Pdsz * T0 ; - T4_dVb = Pdsz_dVbs * T0 ; - T4_dVd = Pdsz_dVds * T0 ; - T4_dVg = Pdsz_dVgs * T0 ; - - T5 = T1 * Qbu + T2 * Qiu ; - T5_dVb = T1 * Qbu_dVbs + T2 * Qiu_dVbs ; - T5_dVd = T1 * Qbu_dVds + T2 * Qiu_dVds ; - T5_dVg = T1 * Qbu_dVgs + T2 * Qiu_dVgs ; - - T3 = T5 / T4 ; - T3_dVb = ( - T4_dVb * T5 + T4 * T5_dVb ) / T4 / T4 ; - T3_dVd = ( - T4_dVd * T5 + T4 * T5_dVd ) / T4 / T4 ; - T3_dVg = ( - T4_dVg * T5 + T4 * T5_dVg ) / T4 / T4 ; - - Eeff = T3 ; - Eeff_dVbs = T3_dVb ; - Eeff_dVds = T3_dVd ; - Eeff_dVgs = T3_dVg ; - - T5 = Fn_Pow( Eeff , model->HSM2_mueph0 - 1.0e0 ) ; - T8 = T5 * Eeff ; - T7 = Fn_Pow( Eeff , here->HSM2_muesr - 1.0e0 ) ; - T6 = T7 * Eeff ; - - - T9 = C_QE * C_m2cm_p2 ; - Rns = Qiu / T9 ; - T1 = 1.0e0 / ( here->HSM2_muecb0 + here->HSM2_muecb1 * Rns / 1.0e11 ) - + here->HSM2_mphn0 * T8 + T6 / pParam->HSM2_muesr1 ; - Muun = 1.0e0 / T1 ; - - T1 = 1.0e0 / ( T1 * T1 ) ; - T2 = here->HSM2_muecb0 + here->HSM2_muecb1 * Rns / 1.0e11 ; - T2 = 1.0e0 / ( T2 * T2 ) ; - T3 = here->HSM2_mphn1 * T5 ; - T4 = here->HSM2_muesr * T7 / pParam->HSM2_muesr1 ; - T5 = - 1.0e-11 * here->HSM2_muecb1 / C_QE * T2 / C_m2cm_p2 ; - Muun_dVbs = - ( T5 * Qiu_dVbs - + Eeff_dVbs * T3 + Eeff_dVbs * T4 ) * T1 ; - Muun_dVds = - ( T5 * Qiu_dVds - + Eeff_dVds * T3 + Eeff_dVds * T4 ) * T1 ; - Muun_dVgs = - ( T5 * Qiu_dVgs - + Eeff_dVgs * T3 + Eeff_dVgs * T4 ) * T1 ; - - /* Change to MKS unit */ - Muun /= C_m2cm_p2 ; - Muun_dVbs /= C_m2cm_p2 ; - Muun_dVds /= C_m2cm_p2 ; - Muun_dVgs /= C_m2cm_p2 ; - /*-----------------------------------------------------------* - * Mu : mobility - *-----------------*/ - T2 = beta * (Qn0 + small) * Lch ; - - - T1 = 1.0e0 / T2 ; - T3 = T1 * T1 ; - T4 = - beta * T3 ; - T5 = T4 * Lch ; - T6 = T4 * (Qn0 + small) ; - T1_dVb = ( T5 * Qn0_dVbs + T6 * Lch_dVbs) ; - T1_dVd = ( T5 * Qn0_dVds + T6 * Lch_dVds) ; - T1_dVg = ( T5 * Qn0_dVgs + T6 * Lch_dVgs) ; - - TY = Idd * T1 ; - TY_dVbs = Idd_dVbs * T1 + Idd * T1_dVb ; - TY_dVds = Idd_dVds * T1 + Idd * T1_dVd ; - TY_dVgs = Idd_dVgs * T1 + Idd * T1_dVg ; - - T2 = 0.2 * Vmax / Muun ; - T3 = - T2 / Muun ; - T2_dVb = T3 * Muun_dVbs ; - T2_dVd = T3 * Muun_dVds ; - T2_dVg = T3 * Muun_dVgs ; - - Ey = sqrt( TY * TY + T2 * T2 ) ; - T4 = 1.0 / Ey ; - Ey_dVbs = T4 * ( TY * TY_dVbs + T2 * T2_dVb ) ; - Ey_dVds = T4 * ( TY * TY_dVds + T2 * T2_dVd ) ; - Ey_dVgs = T4 * ( TY * TY_dVgs + T2 * T2_dVg ) ; - - Em = Muun * Ey ; - Em_dVbs = Muun_dVbs * Ey + Muun * Ey_dVbs ; - Em_dVds = Muun_dVds * Ey + Muun * Ey_dVds ; - Em_dVgs = Muun_dVgs * Ey + Muun * Ey_dVgs ; - - T1 = Em / Vmax ; - - /* note: model->HSM2_bb = 2 (electron) ;1 (hole) */ - if ( 1.0e0 - epsm10 <= model->HSM2_bb && model->HSM2_bb <= 1.0e0 + epsm10 ) { - T3 = 1.0e0 ; - } else if ( 2.0e0 - epsm10 <= model->HSM2_bb && model->HSM2_bb <= 2.0e0 + epsm10 ) { - T3 = T1 ; - } else { - T3 = Fn_Pow( T1 , model->HSM2_bb - 1.0e0 ) ; - } - T2 = T1 * T3 ; - T4 = 1.0e0 + T2 ; - - if ( 1.0e0 - epsm10 <= model->HSM2_bb && model->HSM2_bb <= 1.0e0 + epsm10 ) { - T5 = 1.0 / T4 ; - T6 = T5 / T4 ; - } else if ( 2.0e0 - epsm10 <= model->HSM2_bb && model->HSM2_bb <= 2.0e0 + epsm10 ) { - T5 = 1.0 / sqrt( T4 ) ; - T6 = T5 / T4 ; - } else { - T6 = Fn_Pow( T4 , ( - 1.0e0 / model->HSM2_bb - 1.0e0 ) ) ; - T5 = T4 * T6 ; - } - - T7 = Muun / Vmax * T6 * T3 ; - - Mu = Muun * T5 ; - Mu_dVbs = Muun_dVbs * T5 - T7 * Em_dVbs ; - Mu_dVds = Muun_dVds * T5 - T7 * Em_dVds ; - Mu_dVgs = Muun_dVgs * T5 - T7 * Em_dVgs ; - -/* end_of_mobility : */ - - /*-----------------------------------------------------------* - * Ids: channel current. - *-----------------*/ - betaWL = here->HSM2_weff_nf * beta_inv / Lch ; - T1 = - betaWL / Lch ; - betaWL_dVbs = T1 * Lch_dVbs ; - betaWL_dVds = T1 * Lch_dVds ; - betaWL_dVgs = T1 * Lch_dVgs ; - - Ids0 = betaWL * Idd * Mu ; - T1 = betaWL * Idd ; - T2 = Idd * Mu ; - T3 = Mu * betaWL ; - Ids0_dVbs = T3 * Idd_dVbs + T1 * Mu_dVbs + T2 * betaWL_dVbs ; - Ids0_dVds = T3 * Idd_dVds + T1 * Mu_dVds + T2 * betaWL_dVds ; - Ids0_dVgs = T3 * Idd_dVgs + T1 * Mu_dVgs + T2 * betaWL_dVgs ; - - /*-----------------------------------------------------------* - * Adding parasitic components to the channel current. - *-----------------*/ - if( model->HSM2_ptl != 0 ){ - T1 = 0.5 * ( Vds - Pds ) ; - Fn_SymAdd( T6 , T1 , 0.01 , T2 ) ; - T2 *= 0.5 ; - T6_dVb = T2 * ( - Pds_dVbs ) ; - T6_dVd = T2 * ( 1.0 - Pds_dVds ) ; - T6_dVg = T2 * ( - Pds_dVgs ) ; - - T1 = 1.1 - ( Ps0 + T6 ); - T1_dVb = - ( Ps0_dVbs + T6_dVb ); - T1_dVd = - ( Ps0_dVds + T6_dVd ); - T1_dVg = - ( Ps0_dVgs + T6_dVg ); - - Fn_SZ( T2 , T1 , 0.05 , T0 ) ; - T2 += small ; - T2_dVb = T1_dVb * T0 ; - T2_dVd = T1_dVd * T0 ; - T2_dVg = T1_dVg * T0 ; - - T0 = beta * here->HSM2_ptl0 ; - T3 = Cox * T0 ; - T3_dVb = Cox_dVb * T0 ; - T3_dVd = Cox_dVd * T0 ; - T3_dVg = Cox_dVg * T0 ; - T0 = pow( T2 , model->HSM2_ptp ) ; - T9 = T3 * T0 ; - T9_dVb = T3 * model->HSM2_ptp * T0 / T2 * T2_dVb + T3_dVb * T0 ; - T9_dVd = T3 * model->HSM2_ptp * T0 / T2 * T2_dVd + T3_dVd * T0 ; - T9_dVg = T3 * model->HSM2_ptp * T0 / T2 * T2_dVg + T3_dVg * T0 ; - - - T4 = 1.0 + Vdsz * model->HSM2_pt2 ; - T4_dVb = 0.0 ; - T4_dVd = Vdsz_dVds * model->HSM2_pt2 ; - T4_dVg = 0.0 ; - - T0 = here->HSM2_pt40 ; - T5 = Ps0 + T6 - Vbsz ; - T5_dVb = Ps0_dVbs + T6_dVb - Vbsz_dVbs ; - T5_dVd = Ps0_dVds + T6_dVd - Vbsz_dVds ; - T5_dVg = Ps0_dVgs + T6_dVg ; - T4 += Vdsz * T0 * T5 ; - T4_dVb += Vdsz * T0 * T5_dVb ; - T4_dVd += Vdsz * T0 * T5_dVd + Vdsz_dVds * T0 * T5 ; - T4_dVg += Vdsz * T0 * T5_dVg ; - - T6 = T9 * T4 ; - T9_dVb = T9_dVb * T4 + T9 * T4_dVb ; - T9_dVd = T9_dVd * T4 + T9 * T4_dVd ; - T9_dVg = T9_dVg * T4 + T9 * T4_dVg ; - T9 = T6 ; - - }else{ - T9 = 0.0 ; - T9_dVb = 0.0 ; - T9_dVd = 0.0 ; - T9_dVg = 0.0 ; - } - - - if( model->HSM2_gdl != 0 ){ - T1 = beta * here->HSM2_gdl0 ; - T2 = Cox * T1 ; - T2_dVb = Cox_dVb * T1 ; - T2_dVd = Cox_dVd * T1 ; - T2_dVg = Cox_dVg * T1 ; - T8 = T2 * Vdsz ; - T8_dVb = T2_dVb * Vdsz ; - T8_dVd = T2_dVd * Vdsz + T2 * Vdsz_dVds ; - T8_dVg = T2_dVg * Vdsz ; - }else{ - T8 = 0.0 ; - T8_dVb = 0.0 ; - T8_dVd = 0.0 ; - T8_dVg = 0.0 ; - } - - - if ( ( T9 + T8 ) > 0.0 ) { - Idd1 = Pds * ( T9 + T8 ) ; - Idd1_dVbs = Pds_dVbs * ( T9 + T8 ) + Pds * ( T9_dVb + T8_dVb ) ; - Idd1_dVds = Pds_dVds * ( T9 + T8 ) + Pds * ( T9_dVd + T8_dVd ) ; - Idd1_dVgs = Pds_dVgs * ( T9 + T8 ) + Pds * ( T9_dVg + T8_dVg ) ; - - Ids0 += betaWL * Idd1 * Mu ; - T1 = betaWL * Idd1 ; - T2 = Idd1 * Mu ; - T3 = Mu * betaWL ; - Ids0_dVbs += T3 * Idd1_dVbs + T1 * Mu_dVbs + T2 * betaWL_dVbs ; - Ids0_dVds += T3 * Idd1_dVds + T1 * Mu_dVds + T2 * betaWL_dVds ; - Ids0_dVgs += T3 * Idd1_dVgs + T1 * Mu_dVgs + T2 * betaWL_dVgs ; - } - - - /* (note: rpock procedure was removed. (2006.04.20) */ - if ( flg_rsrd == 2 ) { - Rd = here->HSM2_rd ; - T0 = Rd * Ids0 ; - T1 = Vds + small ; - T2 = 1.0 / T1 ; - T3 = 1.0 + T0 * T2 ; - T3_dVb = Rd * Ids0_dVbs * T2 ; - T3_dVd = ( Rd * Ids0_dVds * T1 - T0 ) * T2 * T2 ; - T3_dVg = Rd * Ids0_dVgs * T2 ; - T4 = 1.0 / T3 ; - Ids = Ids0 * T4 ; - T5 = T4 * T4 ; - Ids_dVbs = ( Ids0_dVbs * T3 - Ids0 * T3_dVb ) * T5 ; - Ids_dVds = ( Ids0_dVds * T3 - Ids0 * T3_dVd ) * T5 ; - Ids_dVgs = ( Ids0_dVgs * T3 - Ids0 * T3_dVg ) * T5 ; - } else { - Ids = Ids0 ; - Ids_dVbs = Ids0_dVbs ; - Ids_dVds = Ids0_dVds ; - Ids_dVgs = Ids0_dVgs ; - } - - if ( Pds < ps_conv ) { - Ids_dVbs = 0.0 ; - Ids_dVgs = 0.0 ; - } - - Ids += Gdsmin * Vds ; - Ids_dVds += Gdsmin ; - - - /*-----------------------------------------------------------* - * STI - *-----------------*/ - if ( model->HSM2_coisti != 0 ) { - /*---------------------------------------------------* - * dVthSCSTI : Short-channel effect induced by Vds (STI). - *-----------------*/ - T1 = C_ESI * Cox_inv ; - T2 = here->HSM2_wdpl ; - T3 = here->HSM2_lgatesm - model->HSM2_parl2 ; - T4 = 1.0 / (T3 * T3) ; - T5 = 2.0 * (model->HSM2_vbi - Pb20b) * T1 * T2 * T4 ; - - dVth0 = T5 * sqrt_Pbsum ; - T6 = T5 * 0.5 / sqrt_Pbsum ; - T7 = 2.0 * (model->HSM2_vbi - Pb20b) * C_ESI * T2 * T4 * sqrt_Pbsum ; - T8 = - 2.0 * T1 * T2 * T4 * sqrt_Pbsum ; - dVth0_dVb = T6 * Pbsum_dVb + T7 * Cox_inv_dVb + T8 * Pb20b_dVb ; - dVth0_dVd = T6 * Pbsum_dVd + T7 * Cox_inv_dVd + T8 * Pb20b_dVd ; - dVth0_dVg = T6 * Pbsum_dVg + T7 * Cox_inv_dVg + T8 * Pb20b_dVg ; - - T4 = pParam->HSM2_scsti1 ; - T6 = pParam->HSM2_scsti2 ; - T1 = T4 + T6 * Vdsz ; - dVthSCSTI = dVth0 * T1 ; - dVthSCSTI_dVb = dVth0_dVb * T1 ; - dVthSCSTI_dVd = dVth0_dVd * T1 + dVth0 * T6 * Vdsz_dVds ; - dVthSCSTI_dVg = dVth0_dVg * T1 ; - - T1 = pParam->HSM2_vthsti - model->HSM2_vdsti * Vds ; - T1_dVd = - model->HSM2_vdsti ; - - Vgssti = Vgsz - Vfb + T1 + dVthSCSTI ; - Vgssti_dVbs = dVthSCSTI_dVb ; - Vgssti_dVds = Vgsz_dVds + T1_dVd + dVthSCSTI_dVd ; - Vgssti_dVgs = Vgsz_dVgs + dVthSCSTI_dVg ; - - costi0 = here->HSM2_costi0 ; - costi1 = here->HSM2_costi1 ; - - costi3 = here->HSM2_costi0_p2 * Cox_inv * Cox_inv ; - T1 = 2.0 * here->HSM2_costi0_p2 * Cox_inv ; - costi3_dVb = T1 * Cox_inv_dVb ; - costi3_dVd = T1 * Cox_inv_dVd ; - costi3_dVg = T1 * Cox_inv_dVg ; - T2 = 1.0 / costi3 ; - costi3_dVb_c3 = costi3_dVb * T2 ; - costi3_dVd_c3 = costi3_dVd * T2 ; - costi3_dVg_c3 = costi3_dVg * T2 ; - - costi4 = costi3 * beta * 0.5 ; - costi5 = costi4 * beta * 2.0 ; - - T11 = beta * 0.25 ; - T10 = beta_inv - costi3 * T11 + Vfb - pParam->HSM2_vthsti - dVthSCSTI + small ; - T10_dVb = - T11 * costi3_dVb - dVthSCSTI_dVb ; - T10_dVd = - T11 * costi3_dVd - dVthSCSTI_dVd ; - T10_dVg = - T11 * costi3_dVg - dVthSCSTI_dVg ; - T1 = Vgsz - T10 - psisti_dlt ; - T1_dVb = - T10_dVb ; - T1_dVd = Vgsz_dVds - T10_dVd ; - T1_dVg = Vgsz_dVgs - T10_dVg ; - T0 = Fn_Sgn(T10) ; - T2 = sqrt (T1 * T1 + T0 * 4.0 * T10 * psisti_dlt) ; - T3 = T10 + 0.5 * (T1 + T2) - Vfb + pParam->HSM2_vthsti + dVthSCSTI - Vbsz ; - T3_dVb = T10_dVb + 0.5 * (T1_dVb + (T1 * T1_dVb + T0 * 2.0 * T10_dVb * psisti_dlt) / T2) - + dVthSCSTI_dVb - Vbsz_dVbs ; - T3_dVd = T10_dVd + 0.5 * (T1_dVd + (T1 * T1_dVd + T0 * 2.0 * T10_dVd * psisti_dlt) / T2) - + dVthSCSTI_dVd - Vbsz_dVds ; - T3_dVg = T10_dVg + 0.5 * (T1_dVg + (T1 * T1_dVg + T0 * 2.0 * T10_dVg * psisti_dlt) / T2) - + dVthSCSTI_dVg ; - T4 = beta * T3 - 1.0 ; - T5 = 4.0 / costi5 ; - T1 = 1.0 + T4 * T5 ; - T6 = beta * T5 ; - T7 = T4 * T5 ; - T1_dVb = (T6 * T3_dVb - T7 * costi3_dVb_c3) ; - T1_dVd = (T6 * T3_dVd - T7 * costi3_dVd_c3) ; - T1_dVg = (T6 * T3_dVg - T7 * costi3_dVg_c3) ; - Fn_SZ( T1 , T1, 1.0e-2, T2) ; - T1 += small ; - T1_dVb *= T2 ; - T1_dVd *= T2 ; - T1_dVg *= T2 ; - costi6 = sqrt (T1) ; - T0 = costi4 * (1.0 - costi6) ; - Psasti = Vgssti + T0 ; - T2 = 0.5 * costi4 / costi6 ; - Psasti_dVbs = Vgssti_dVbs + costi3_dVb_c3 * T0 - T2 * T1_dVb ; - Psasti_dVds = Vgssti_dVds + costi3_dVd_c3 * T0 - T2 * T1_dVd ; - Psasti_dVgs = Vgssti_dVgs + costi3_dVg_c3 * T0 - T2 * T1_dVg ; - - T0 = 1.0 / (beta + 2.0 / (Vgssti + small)) ; - Psbsti = log (1.0 / costi1 / costi3 * (Vgssti * Vgssti)) * T0 ; - T2 = 2.0 * T0 / (Vgssti + small) ; - T3 = Psbsti / (Vgssti + small) ; - Psbsti_dVbs = T2 * (Vgssti_dVbs - 0.5 * costi3_dVb_c3 * Vgssti - + T3 * Vgssti_dVbs ) ; - Psbsti_dVds = T2 * (Vgssti_dVds - 0.5 * costi3_dVd_c3 * Vgssti - + T3 * Vgssti_dVds ) ; - Psbsti_dVgs = T2 * (Vgssti_dVgs - 0.5 * costi3_dVg_c3 * Vgssti - + T3 * Vgssti_dVgs ) ; - - Psab = Psbsti - Psasti - sti2_dlt ; - Psab_dVbs = Psbsti_dVbs - Psasti_dVbs ; - Psab_dVds = Psbsti_dVds - Psasti_dVds ; - Psab_dVgs = Psbsti_dVgs - Psasti_dVgs ; - T0 = sqrt (Psab * Psab + 4.0 * sti2_dlt * Psbsti) ; - Psti = Psbsti - 0.5 * (Psab + T0) ; - T1 = 1.0 / T0 ; - Psti_dVbs = Psbsti_dVbs - - 0.5 * ( Psab_dVbs - + ( Psab * Psab_dVbs + 2.0 * sti2_dlt * Psbsti_dVbs ) * T1 ) ; - Psti_dVds = Psbsti_dVds - - 0.5 * ( Psab_dVds - + ( Psab * Psab_dVds + 2.0 * sti2_dlt * Psbsti_dVds ) * T1 ) ; - Psti_dVgs = Psbsti_dVgs - - 0.5 * ( Psab_dVgs - + ( Psab * Psab_dVgs + 2.0 * sti2_dlt * Psbsti_dVgs ) * T1 ) ; - - T0 = costi1 * exp (beta * Psti) ; - T1 = beta * (Psti - Vbsz) - 1.0 + T0 ; - T1_dVb = beta * ((Psti_dVbs - Vbsz_dVbs) + T0 * Psti_dVbs) ; - T1_dVd = beta * ((Psti_dVds - Vbsz_dVds) + T0 * Psti_dVds) ; - T1_dVg = beta * (Psti_dVgs + T0 * Psti_dVgs) ; - Fn_SZ ( T1 , T1, 1.0e-2, T0) ; - T1 += epsm10 ; - T1_dVb *= T0 ; - T1_dVd *= T0 ; - T1_dVg *= T0 ; - sq1sti = sqrt (T1); - T2 = 0.5 / sq1sti ; - sq1sti_dVbs = T2 * T1_dVb ; - sq1sti_dVds = T2 * T1_dVd ; - sq1sti_dVgs = T2 * T1_dVg ; - - T1 = beta * (Psti - Vbsz) - 1.0; - T1_dVb = beta * (Psti_dVbs - Vbsz_dVbs) ; - T1_dVd = beta * (Psti_dVds - Vbsz_dVds) ; - T1_dVg = beta * Psti_dVgs ; - Fn_SZ( T1 , T1, 1.0e-2, T0) ; - T1 += epsm10 ; - T1_dVb *= T0 ; - T1_dVd *= T0 ; - T1_dVg *= T0 ; - sq2sti = sqrt (T1); - T2 = 0.5 / sq2sti ; - sq2sti_dVbs = T2 * T1_dVb ; - sq2sti_dVds = T2 * T1_dVd ; - sq2sti_dVgs = T2 * T1_dVg ; - - Qn0sti = costi0 * (sq1sti - sq2sti) ; - Qn0sti_dVbs = costi0 * (sq1sti_dVbs - sq2sti_dVbs) ; - Qn0sti_dVds = costi0 * (sq1sti_dVds - sq2sti_dVds) ; - Qn0sti_dVgs = costi0 * (sq1sti_dVgs - sq2sti_dVgs) ; - - /* T1: Vdsatsti */ - T1 = Psasti - Psti ; - T1_dVb = Psasti_dVbs - Psti_dVbs ; - T1_dVd = Psasti_dVds - Psti_dVds ; - T1_dVg = Psasti_dVgs - Psti_dVgs ; - - Fn_SZ( T1 , T1 , 1.0e-1 , T2 ) ; - T1 += epsm10 ; - T1_dVb *= T2 ; - T1_dVd *= T2 ; - T1_dVg *= T2 ; - - - TX = Vds / T1 ; - T2 = 1.0 / ( T1 * T1 ) ; - TX_dVbs = T2 * ( - Vds * T1_dVb ) ; - TX_dVds = T2 * ( T1 - Vds * T1_dVd ) ; - TX_dVgs = T2 * ( - Vds * T1_dVg ) ; - - Fn_CP( TY , TX , 1.0 , 4 , T2 ) ; - TY_dVbs = T2 * TX_dVbs ; - TY_dVds = T2 * TX_dVds ; - TY_dVgs = T2 * TX_dVgs ; - - costi7 = 2.0 * here->HSM2_wsti * here->HSM2_nf * beta_inv ; - T1 = Lch ; - Idssti = costi7 * Mu * Qn0sti * TY / T1; - T3 = 1.0 / T1 ; - T4 = Mu * Qn0sti * TY / T1 / T1 ; - T5 = Mu * Qn0sti ; - Idssti_dVbs = costi7 * (((Mu_dVbs * Qn0sti + Mu * Qn0sti_dVbs) * TY - + T5 * TY_dVbs ) * T3 - - Lch_dVbs * T4 ) ; - Idssti_dVds = costi7 * (((Mu_dVds * Qn0sti + Mu * Qn0sti_dVds) * TY - + T5 * TY_dVds ) * T3 - - Lch_dVds * T4 ) ; - Idssti_dVgs = costi7 * (((Mu_dVgs * Qn0sti + Mu * Qn0sti_dVgs) * TY - + T5 * TY_dVgs ) * T3 - - Lch_dVgs * T4 ) ; - - Ids = Ids + Idssti ; - Ids_dVbs = Ids_dVbs + Idssti_dVbs ; - Ids_dVds = Ids_dVds + Idssti_dVds ; - Ids_dVgs = Ids_dVgs + Idssti_dVgs ; - - } - - /*-----------------------------------------------------------* - * Break point for the case of Rs=Rd=0. - *-----------------*/ - if ( flg_rsrd == 0 ) { - DJI = 1.0 ; - break ; - } - - /*-----------------------------------------------------------* - * calculate corrections of biases. - * - Fbs = 0, etc. are the small ciucuit equations. - * - DJ, Jacobian of the small circuit matrix, is g.t. 1 - * provided Rs, Rd and conductances are positive. - *-----------------*/ - Fbs = Vbs - Vbsc + Ids * Rs ; - Fds = Vds - Vdsc + Ids * ( Rs + Rd ) ; - Fgs = Vgs - Vgsc + Ids * Rs ; - - DJ = 1.0 + Rs * Ids_dVbs + ( Rs + Rd ) * Ids_dVds + Rs * Ids_dVgs ; - DJI = 1.0 / DJ ; - - JI11 = 1 + ( Rs + Rd ) * Ids_dVds + Rs * Ids_dVgs ; - JI12 = - Rs * Ids_dVds ; - JI13 = - Rs * Ids_dVgs ; - JI21 = - ( Rs + Rd ) * Ids_dVbs ; - JI22 = 1 + Rs * Ids_dVbs + Rs * Ids_dVgs ; - JI23 = - ( Rs + Rd ) * Ids_dVgs ; - JI31 = - Rs * Ids_dVbs ; - JI32 = - Rs * Ids_dVds ; - JI33 = 1 + Rs * Ids_dVbs + ( Rs + Rd ) * Ids_dVds ; - - dVbs = - DJI * ( JI11 * Fbs + JI12 * Fds + JI13 * Fgs ) ; - dVds = - DJI * ( JI21 * Fbs + JI22 * Fds + JI23 * Fgs ) ; - dVgs = - DJI * ( JI31 * Fbs + JI32 * Fds + JI33 * Fgs ) ; - - dV_sum = fabs( dVbs ) + fabs( dVds ) + fabs( dVgs ) ; - - - /*-----------------------------------------------------------* - * Break point for converged case. - * - Exit from the bias loop. - * - NOTE: Update of internal biases is avoided. - *-----------------*/ - if ( Ids_last * Ids_tol >= fabs( Ids_last - Ids ) || mini_current >= fabs( Ids_last - Ids ) - || dV_sum < ps_conv ) break ; - - /*-----------------------------------------------------------* - * Update the internal biases. - *-----------------*/ - Vbs = Vbs + dVbs ; - Vds = Vds + dVds ; - Vgs = Vgs + dVgs ; - if ( Vds < 0.0 ) { - Vds = 0.0 ; - dVds = 0.0 ; - } - - /*-----------------------------------------------------------* - * Bottom of bias loop. (label) - *-----------------*/ -/* bottom_of_bias_loop :*/ - - /*-----------------------------------------------------------* - * Make initial guess flag of potential ON. - * - This effects for the 2nd and later iterations of bias loop. - *-----------------*/ - flg_pprv = 1 ; - - } /* skip to end_of_part_1 */ - - } /*++ End of the bias loop +++++++++++++++++++++++++++++*/ - if ( end_of_part_1 == 0 ) { - - if ( lp_bs > lp_bs_max ) { lp_bs -- ; } - - - - /*----------------------------------------------------------* - * induced gate noise. ( Part 1/3 ) - *----------------------*/ - if ( model->HSM2_coign != 0 && model->HSM2_cothrml != 0 ) { - kusai00 = VgVt * VgVt ; - kusaidd = 2.0e0 * beta_inv * Cox_inv * Idd ; - kusaiL = kusai00 - kusaidd ; - Fn_SZ( kusai00 , kusai00 , 1.0e-3 , T0 ) ; - Fn_SZ( kusaiL , kusaiL , 1.0e-3 , T0 ) ; - kusai00L = kusai00 - kusaiL ; - if ( Qn0 < epsm10 || kusai00L < epsm10 ) flg_ign = 0 ; - else flg_ign = 1 ; - } - - - /*-----------------------------------------------------------* - * End of PART-1. (label) - *-----------------*/ - } /* skip end_of_part_1 */ -/* end_of_part_1: */ - end_of_part_1 = 0; - - // Qiu for noise calcs - Qiu_noi = Qiu ; - - } // end of Normal mode MOSFET - - - /*----------------------------------------------------------* - * Evaluate integrated chages in unit [C]. - *----------------------*/ - - T1 = - here->HSM2_weff_nf * Leff ; - - Qb = T1 * Qbu ; - Qb_dVbs = T1 * Qbu_dVbs ; - Qb_dVds = T1 * Qbu_dVds ; - Qb_dVgs = T1 * Qbu_dVgs ; - - Qi = T1 * Qiu ; - Qi_dVbs = T1 * Qiu_dVbs ; - Qi_dVds = T1 * Qiu_dVds ; - Qi_dVgs = T1 * Qiu_dVgs ; - - Qi_noi = T1 * Qiu_noi ; // for noise calc. - - Qd = Qi * Qdrat ; - Qd_dVbs = Qi_dVbs * Qdrat + Qi * Qdrat_dVbs ; - Qd_dVds = Qi_dVds * Qdrat + Qi * Qdrat_dVds ; - Qd_dVgs = Qi_dVgs * Qdrat + Qi * Qdrat_dVgs ; - - - /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ - * PART-2: Substrate / gate / leak currents - *++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ - - /*-----------------------------------------------------------* - * Modified potential for symmetry. - *-----------------*/ - T1 = ( Vds - Pds ) / 2 ; - Fn_SymAdd( Pzadd , T1 , model->HSM2_pzadd0 , T2 ) ; - T2 /= 2 ; - Pzadd_dVbs = T2 * ( - Pds_dVbs ) ; - Pzadd_dVds = T2 * ( 1.0 - Pds_dVds ) ; - Pzadd_dVgs = T2 * ( - Pds_dVgs ) ; - - if ( Pzadd < epsm10 ) { - Pzadd = epsm10 ; - Pzadd_dVbs = 0.0 ; - Pzadd_dVds = 0.0 ; - Pzadd_dVgs = 0.0 ; - } - - Ps0z = Ps0 + Pzadd ; - Ps0z_dVbs = Ps0_dVbs + Pzadd_dVbs ; - Ps0z_dVds = Ps0_dVds + Pzadd_dVds ; - Ps0z_dVgs = Ps0_dVgs + Pzadd_dVgs ; - /*-----------------------------------------------------------* - * Isub : substrate current induced by impact ionization. - *-----------------*/ - - if ( flg_noqi == 1 || model->HSM2_coisub == 0 ) { - /* Accumulation zone or nonconductive case, in which Ids==0. */ - Isub = 0.0e0 ; - Isub_dVbs = Isub_dVds = Isub_dVgs = 0.0e0 ; - } else { - /*-------------------------------------------* - * Conductive case. - *-----------------*/ - if ( pParam->HSM2_sub1 > 0.0e0 && pParam->HSM2_vmax > 0.0e0 ) { - T0 = here->HSM2_vg2const ; - T1 = T0 * Vgp ; - T1_dVd = T0 * Vgp_dVds ; - T1_dVg = T0 * Vgp_dVgs ; - T1_dVb = T0 * Vgp_dVbs ; - - T7 = Cox0 * Cox0 ; - T8 = here->HSM2_qnsub_esi ; - T3 = T8 / T7 ; - - T9 = 2.0 / T8 ; - T4 = T9 * T7 ; /* bugfix in version 2.80 */ - - T2 = here->HSM2_xvbs ; - T5 = T1 - beta_inv - T2 * Vbsz ; - T5_dVd = T1_dVd - T2 * Vbsz_dVds; - T5_dVg = T1_dVg ; - T5_dVb = T1_dVb - T2 * Vbsz_dVbs; - - T6 = 1.0 + T4 * T5 ; /* bugfix in version 2.80 */ - T6_dVd = T4 * T5_dVd ; - T6_dVg = T4 * T5_dVg ; - T6_dVb = T4 * T5_dVb ; - Fn_SZ( T6 , T6, 1.0e-3, T9) ; - T6 += small ; - T6_dVd *= T9 ; - T6_dVg *= T9 ; - T6_dVb *= T9 ; - T6 = sqrt( T6 ) ; - T9 = 0.5 / T6 ; - T6_dVd = T9 * T6_dVd ; - T6_dVg = T9 * T6_dVg ; - T6_dVb = T9 * T6_dVb ; - - Psislsat = T1 + T3 * ( 1.0 - T6 ) ; - Psislsat_dVd = T1_dVd - T3 * T6_dVd ; - Psislsat_dVg = T1_dVg - T3 * T6_dVg ; - Psislsat_dVb = T1_dVb - T3 * T6_dVb ; - - T2 = here->HSM2_lgate / (here->HSM2_xgate + here->HSM2_lgate) ; - - Psisubsat = pParam->HSM2_svds * Vdsz + Ps0z - T2 * Psislsat ; - Psisubsat_dVd = pParam->HSM2_svds * Vdsz_dVds + Ps0z_dVds - T2 * Psislsat_dVd ; - Psisubsat_dVg = Ps0z_dVgs - T2 * Psislsat_dVg ; - Psisubsat_dVb = Ps0z_dVbs - T2 * Psislsat_dVb ; - Fn_SZ( Psisubsat , Psisubsat, 1.0e-3, T9 ) ; - Psisubsat += small ; - Psisubsat_dVd *= T9 ; - Psisubsat_dVg *= T9 ; - Psisubsat_dVb *= T9 ; - - T5 = here->HSM2_xsub1 ; - T6 = here->HSM2_xsub2 ; - T2 = exp( - T6 / Psisubsat ) ; - T3 = T2 * T6 / ( Psisubsat * Psisubsat ) ; - T2_dVd = T3 * Psisubsat_dVd ; - T2_dVg = T3 * Psisubsat_dVg ; - T2_dVb = T3 * Psisubsat_dVb ; - - Isub = T5 * Psisubsat * Ids * T2 ; - Isub_dVds = T5 * ( Psisubsat_dVd * Ids * T2 - + Psisubsat * Ids_dVds * T2 - + Psisubsat * Ids * T2_dVd ) ; - Isub_dVgs = T5 * ( Psisubsat_dVg * Ids * T2 - + Psisubsat * Ids_dVgs * T2 - + Psisubsat * Ids * T2_dVg ) ; - Isub_dVbs = T5 * ( Psisubsat_dVb * Ids * T2 - + Psisubsat * Ids_dVbs * T2 - + Psisubsat * Ids * T2_dVb ) ; - } else { - Isub = 0.0e0 ; - Isub_dVbs = Isub_dVds = Isub_dVgs = 0.0e0 ; - } /* end of if ( pParam->HSM2_sub1 ... ) else block. */ - } - - - /*---------------------------------------------------* - * Impact-Ionization Induced Bulk Potential Change (IBPC) - *-----------------*/ - if ( flg_noqi == 0 && Isub > 0e0 && pParam->HSM2_ibpc1 != 0e0 ) { - - /* delta Vbs */ - T0 = 1e0 + pParam->HSM2_ibpc2 * dVth ; - dVbsIBPC = pParam->HSM2_ibpc1 * T0 * Isub ; - dVbsIBPC_dVbs = pParam->HSM2_ibpc1 * ( pParam->HSM2_ibpc2 * dVth_dVb * Isub + T0 * Isub_dVbs ) ; - dVbsIBPC_dVds = pParam->HSM2_ibpc1 * ( pParam->HSM2_ibpc2 * dVth_dVd * Isub + T0 * Isub_dVds ) ; - dVbsIBPC_dVgs = pParam->HSM2_ibpc1 * ( pParam->HSM2_ibpc2 * dVth_dVg * Isub + T0 * Isub_dVgs ) ; - - /* dG3 & dG4 */ - T10 = 1e0 / Xi0 ; - T1 = beta * dVbsIBPC * T10 ; - T10 *= T10 ; - T1_dVb = beta * ( dVbsIBPC_dVbs * Xi0 - dVbsIBPC * Xi0_dVbs ) * T10 ; - T1_dVd = beta * ( dVbsIBPC_dVds * Xi0 - dVbsIBPC * Xi0_dVds ) * T10 ; - T1_dVg = beta * ( dVbsIBPC_dVgs * Xi0 - dVbsIBPC * Xi0_dVgs ) * T10 ; - - T10 = 1e0 / Xil ; - T2 = beta * dVbsIBPC * T10 ; - T10 *= T10 ; - T2_dVb = beta * ( dVbsIBPC_dVbs * Xil - dVbsIBPC * Xil_dVbs ) * T10 ; - T2_dVd = beta * ( dVbsIBPC_dVds * Xil - dVbsIBPC * Xil_dVds ) * T10 ; - T2_dVg = beta * ( dVbsIBPC_dVgs * Xil - dVbsIBPC * Xil_dVgs ) * T10 ; - - dG3 = cnst0 * ( Xilp32 * T2 - Xi0p32 * T1 ) ; - dG3_dVbs = cnst0 * ( Xilp32_dVbs * T2 + Xilp32 * T2_dVb - Xi0p32_dVbs * T1 - Xi0p32 * T1_dVb ) ; - dG3_dVds = cnst0 * ( Xilp32_dVds * T2 + Xilp32 * T2_dVd - Xi0p32_dVds * T1 - Xi0p32 * T1_dVd ) ; - dG3_dVgs = cnst0 * ( Xilp32_dVgs * T2 + Xilp32 * T2_dVg - Xi0p32_dVgs * T1 - Xi0p32 * T1_dVg ) ; - dG4 = cnst0 * 0.5 * ( - Xilp12 * T2 + Xi0p12 * T1 ) ; - dG4_dVbs = cnst0 * 0.5 * ( - Xilp12_dVbs * T2 - Xilp12 * T2_dVb + Xi0p12_dVbs * T1 + Xi0p12 * T1_dVb ) ; - dG4_dVds = cnst0 * 0.5 * ( - Xilp12_dVds * T2 - Xilp12 * T2_dVd + Xi0p12_dVds * T1 + Xi0p12 * T1_dVd ) ; - dG4_dVgs = cnst0 * 0.5 * ( - Xilp12_dVgs * T2 - Xilp12 * T2_dVg + Xi0p12_dVgs * T1 + Xi0p12 * T1_dVg ) ; - - /* Add IBPC current into Ids */ - dIdd = dG3 + dG4 ; - dIdd_dVbs = dG3_dVbs + dG4_dVbs ; - dIdd_dVds = dG3_dVds + dG4_dVds ; - dIdd_dVgs = dG3_dVgs + dG4_dVgs ; - IdsIBPC = betaWL * dIdd * Mu ; - IdsIBPC_dVbs = betaWL * ( Mu * dIdd_dVbs + dIdd * Mu_dVbs ) + betaWL_dVbs * Mu * dIdd ; - IdsIBPC_dVds = betaWL * ( Mu * dIdd_dVds + dIdd * Mu_dVds ) + betaWL_dVds * Mu * dIdd ; - IdsIBPC_dVgs = betaWL * ( Mu * dIdd_dVgs + dIdd * Mu_dVgs ) + betaWL_dVgs * Mu * dIdd ; - - } /* End if (IBPC) */ - - /*-----------------------------------------------------------* - * Igate : Gate current induced by tunneling. - *-----------------*/ - if ( model->HSM2_coiigs == 0 ) { - Igate = 0.0 ; - Igate_dVbs = Igate_dVds = Igate_dVgs = 0.0 ; - Igs = 0.0 ; - Igs_dVbs = Igs_dVds = Igs_dVgs = 0.0 ; - Igd = 0.0 ; - Igd_dVbs = Igd_dVds = Igd_dVgs = 0.0 ; - Igb = 0.0 ; - Igb_dVbs = Igb_dVds = Igb_dVgs = 0.0 ; - GLPART1 = 0.0 ; - GLPART1_dVgs = GLPART1_dVds = GLPART1_dVbs = 0.0 ; - } else { - - - /* Igate */ - if ( flg_noqi == 0 ) { - Psdlz = Ps0z + Vdsz - epsm10 ; - Psdlz_dVbs = Ps0z_dVbs ; - Psdlz_dVds = Ps0z_dVds + Vdsz_dVds ; - Psdlz_dVgs = Ps0z_dVgs ; - - T1 = Vgsz - Vfb + modelMKS->HSM2_gleak4 * (dVth - dPpg) * Leff - Psdlz * pParam->HSM2_gleak3 ; - T1_dVg = Vgsz_dVgs + modelMKS->HSM2_gleak4 * (dVth_dVg - dPpg_dVg) * Leff - Psdlz_dVgs * pParam->HSM2_gleak3 ; - T1_dVd = Vgsz_dVds + modelMKS->HSM2_gleak4 * (dVth_dVd - dPpg_dVd) * Leff - Psdlz_dVds * pParam->HSM2_gleak3 ; - T1_dVb = modelMKS->HSM2_gleak4 * ( dVth_dVb - dPpg_dVb ) * Leff - Psdlz_dVbs * pParam->HSM2_gleak3 ; - - T3 = 1.0 / Tox0 ; - T2 = T1 * T3 ; - T2_dVg = (T1_dVg ) * T3 ; - T2_dVd = (T1_dVd ) * T3 ; - T2_dVb = (T1_dVb ) * T3 ; - - T3 = 1.0 / modelMKS->HSM2_gleak5 ; - - if ( VgVt <= VgVt_small ) { - Ey = 0.0 ; - Ey_dVgs = 0.0 ; - Ey_dVds = 0.0 ; - Ey_dVbs = 0.0 ; - } - T7 = 1.0 + Ey * T3 ; - T7_dVg = Ey_dVgs * T3 ; - T7_dVd = Ey_dVds * T3 ; - T7_dVb = Ey_dVbs * T3 ; - - Etun = T2 * T7 ; - Etun_dVgs = T2_dVg * T7 + T7_dVg * T2 ; - Etun_dVds = T2_dVd * T7 + T7_dVd * T2 ; - Etun_dVbs = T2_dVb * T7 + T7_dVb * T2 ; - - Fn_SZ( Etun , Etun , igate_dlt , T5 ) ; - Etun_dVgs *= T5 ; - Etun_dVds *= T5 ; - Etun_dVbs *= T5 ; - - Fn_SZ( T3 , Vgsz , 1.0e-3 , T4 ) ; - T3 -= model->HSM2_vzadd0 ; - TX = T3 / cclmmdf ; - T2 = 1.0 + TX * TX ; - T1 = 1.0 - 1.0 / T2 ; - T1_dVg = 2.0 * TX * T4 / ( T2 * T2 * cclmmdf ) ; - T1_dVd = T1_dVg * Vgsz_dVds ; - Etun_dVgs = T1 * Etun_dVgs + Etun * T1_dVg ; - Etun_dVds = T1 * Etun_dVds + Etun * T1_dVd ; - Etun_dVbs *= T1 ; - Etun *= T1 ; - - T0 = Leff * here->HSM2_weff_nf ; - T7 = modelMKS->HSM2_gleak7 / (modelMKS->HSM2_gleak7 + T0) ; - - T6 = pParam->HSM2_gleak6 ; - T9 = T6 / (T6 + Vdsz) ; - T9_dVd = - T9 / (T6 + Vdsz) * Vdsz_dVds ; - - T1 = - pParam->HSM2_gleak2 * Egp32 / (Etun + small) ; - - if ( T1 < - EXP_THR ) { - Igate = 0.0 ; - Igate_dVbs = Igate_dVds = Igate_dVgs = 0.0 ; - } else { - T2 = exp ( T1 ) ; - T3 = pParam->HSM2_gleak1 / Egp12 * C_QE * T0 ; - - T4 = T2 * T3 * sqrt ((Qiu + Cox0 * VgVt_small ) / cnst0) ; - T5 = T4 * Etun ; - T6 = 0.5 * Etun / (Qiu + Cox0 * VgVt_small ) ; - T10 = T5 * Etun ; - T10_dVb = T5 * (2.0 * Etun_dVbs - T1 * Etun_dVbs + T6 * Qiu_dVbs) ; - T10_dVd = T5 * (2.0 * Etun_dVds - T1 * Etun_dVds + T6 * Qiu_dVds) ; - T10_dVg = T5 * (2.0 * Etun_dVgs - T1 * Etun_dVgs + T6 * Qiu_dVgs) ; - - Igate = T7 * T9 * T10 ; - Igate_dVbs = T7 * T9 * T10_dVb ; - Igate_dVds = T7 * (T9_dVd * T10 + T9 * T10_dVd) ; - Igate_dVgs = T7 * T9 * T10_dVg ; - } - } else { - Igate = 0.0 ; - Igate_dVbs = Igate_dVds = Igate_dVgs = 0.0 ; - } - - /* Igs */ - T0 = - pParam->HSM2_glksd2 * Vgs + modelMKS->HSM2_glksd3 ; - T2 = exp (Tox0 * T0); - T2_dVg = (- Tox0 * pParam->HSM2_glksd2) * T2; - - T0 = Vgs / Tox0 / Tox0 ; - T3 = Vgs * T0 ; - T3_dVg = 2.0 * T0 * (1.0 ) ; - T4 = pParam->HSM2_glksd1 / 1.0e6 * here->HSM2_weff_nf ; - Igs = T4 * T2 * T3 ; - Igs_dVgs = T4 * (T2_dVg * T3 + T2 * T3_dVg) ; - Igs_dVds = 0.0 ; - Igs_dVbs = 0.0 ; - - if ( Vgs >= 0.0e0 ){ - Igs *= -1.0 ; - Igs_dVgs *= -1.0 ; - Igs_dVds *= -1.0 ; - Igs_dVbs *= -1.0 ; - } - - - /* Igd */ - T1 = Vgs - Vds ; - T0 = - pParam->HSM2_glksd2 * T1 + modelMKS->HSM2_glksd3 ; - T2 = exp (Tox0 * T0); - T2_dVg = (- Tox0 * pParam->HSM2_glksd2) * T2; - T2_dVd = (+ Tox0 * pParam->HSM2_glksd2) * T2; - T2_dVb = 0.0 ; - - T0 = T1 / Tox0 / Tox0 ; - T3 = T1 * T0 ; - T3_dVg = 2.0 * T0 ; - T3_dVd = - 2.0 * T0 ; - T3_dVb = 0.0 ; - T4 = pParam->HSM2_glksd1 / 1.0e6 * here->HSM2_weff_nf ; - Igd = T4 * T2 * T3 ; - Igd_dVgs = T4 * (T2_dVg * T3 + T2 * T3_dVg) ; - Igd_dVds = T4 * (T2_dVd * T3 + T2 * T3_dVd) ; - Igd_dVbs = 0.0 ; - - if( T1 >= 0.0e0 ){ - Igd *= -1.0 ; - Igd_dVgs *= -1.0 ; - Igd_dVds *= -1.0 ; - Igd_dVbs *= -1.0 ; - } - - - /* Igb */ - Etun = (- Vgs + Vbs + Vfb + model->HSM2_glkb3 ) / Tox0 ; - - Etun_dVgs = - 1.0 / Tox0 ; - Etun_dVds = 0.0 ; - Etun_dVbs = 1.0 / Tox0 ; - - Fn_SZ( Etun , Etun, igate_dlt, T5) ; - Etun += small ; - Etun_dVgs *= T5 ; - Etun_dVbs *= T5 ; - - T1 = - pParam->HSM2_glkb2 / Etun ; - if ( T1 < - EXP_THR ) { - Igb = 0.0 ; - Igb_dVgs = Igb_dVds = Igb_dVbs = 0.0 ; - } else { - T2 = exp ( T1 ); - T3 = pParam->HSM2_glkb2 / ( Etun * Etun ) * T2 ; - T2_dVg = T3 * Etun_dVgs ; - T2_dVb = T3 * Etun_dVbs ; - - T3 = pParam->HSM2_glkb1 * here->HSM2_weff_nf * Leff ; - Igb = T3 * Etun * Etun * T2 ; - Igb_dVgs = T3 * (2.0 * Etun * Etun_dVgs * T2 + Etun * Etun * T2_dVg); - Igb_dVds = 0.0 ; - Igb_dVbs = T3 * (2.0 * Etun * Etun_dVbs * T2 + Etun * Etun * T2_dVb); - } - - GLPART1 = 0.5 ; - GLPART1_dVgs = 0.0 ; - GLPART1_dVds = 0.0 ; - GLPART1_dVbs = 0.0 ; - - } /* if ( model->HSM2_coiigs == 0 ) */ - - - - - /*-----------------------------------------------------------* - * Igidl : GIDL - *-----------------*/ - if( model->HSM2_cogidl == 0 ){ - Igidl = 0.0e0 ; - Igidl_dVbs = 0.0e0 ; - Igidl_dVds = 0.0e0 ; - Igidl_dVgs = 0.0e0 ; - } else { - T3 = here->HSM2_2qnsub_esi ; - Qb0 = sqrt (T3 * (Pb20 - Vbsz2)) ; - T4 = 0.5 * T3 / Qb0 ; - Qb0_dVb = T4 * (- Vbsz2_dVbs) ; - Qb0_dVd = T4 * (- Vbsz2_dVds) ; - Qb0_dVg = T4 * (- Vbsz2_dVgs) ; - - Qb0Cox = model->HSM2_gidl6 * Qb0 * Cox_inv ; - Qb0Cox_dVb = model->HSM2_gidl6 * ( Qb0_dVb * Cox_inv + Qb0 * Cox_inv_dVb ) ; - Qb0Cox_dVd = model->HSM2_gidl6 * ( Qb0_dVd * Cox_inv + Qb0 * Cox_inv_dVd ) ; - Qb0Cox_dVg = model->HSM2_gidl6 * ( Qb0_dVg * Cox_inv + Qb0 * Cox_inv_dVg ) ; - - T1 = model->HSM2_gidl3 * (Vds + model->HSM2_gidl4) - Vgs + (dVthSC + dVthLP) * model->HSM2_gidl5 - Qb0Cox ; - - T2 = 1.0 / Tox0 ; - E1 = T1 * T2 ; - - E1_dVb = ( model->HSM2_gidl5 * (dVthSC_dVb + dVthLP_dVb) - Qb0Cox_dVb ) * T2 ; - E1_dVd = ( model->HSM2_gidl3 + model->HSM2_gidl5 * (dVthSC_dVd + dVthLP_dVd) - Qb0Cox_dVd ) * T2 ; - E1_dVg = ( -1.0 + model->HSM2_gidl5 * (dVthSC_dVg + dVthLP_dVg) - Qb0Cox_dVg ) * T2 ; - - Fn_SZ( Egidl , E1, eef_dlt, T5) ; - Egidl_dVb = T5 * E1_dVb ; - Egidl_dVd = T5 * E1_dVd ; - Egidl_dVg = T5 * E1_dVg ; - Egidl += small ; - - T6 = pow(Egidl,model->HSM2_gidl7) ; - T1 = model->HSM2_gidl7 * pow(Egidl,model->HSM2_gidl7 -1.0) ; - T6_dVb = Egidl_dVb * T1 ; - T6_dVd = Egidl_dVd * T1 ; - T6_dVg = Egidl_dVg * T1 ; - - T0 = - pParam->HSM2_gidl2 * Egp32 / T6 ; - if ( T0 < - EXP_THR ) { - Igidl = 0.0 ; - Igidl_dVbs = Igidl_dVds = Igidl_dVgs = 0.0 ; - } else { - T1 = exp ( T0 ) ; - T2 = pParam->HSM2_gidl1 / Egp12 * C_QE * here->HSM2_weff_nf ; - Igidl = T2 * Egidl * Egidl * T1 ; - T3 = T2 * T1 * Egidl * (2.0 + pParam->HSM2_gidl2 * Egp32 * Egidl / T6 / T6 ) ; - Igidl_dVbs = T3 * Egidl_dVb ; - Igidl_dVds = T3 * Egidl_dVd ; - Igidl_dVgs = T3 * Egidl_dVg ; - } - - Vdb = Vds - Vbs ; - if ( Vdb > 0.0 ) { - T2 = Vdb * Vdb ; - T4 = T2 * Vdb ; - T0 = T4 + C_gidl_delta ; - T5 = T4 / T0 ; - T7 = ( 3.0 * T2 * T0 - T4 * 3.0 * T2 ) / ( T0 * T0 ) ; /* == T5_dVdb */ - Igidl_dVbs = Igidl_dVbs * T5 + Igidl * T7 * ( - 1.0 ) ; /* Vdb_dVbs = -1 */ - Igidl_dVds = Igidl_dVds * T5 + Igidl * T7 * ( + 1.0 ) ; /* Vdb_dVds = +1 */ - Igidl_dVgs = Igidl_dVgs * T5 ; /* Vdb_dVgs = 0 */ - Igidl *= T5 ; - } else { - Igidl = 0.0 ; - Igidl_dVbs = Igidl_dVds = Igidl_dVgs = 0.0 ; - } - - } - - - /*-----------------------------------------------------------* - * Igisl : GISL - *-----------------*/ - if( model->HSM2_cogidl == 0){ - Igisl = 0.0e0 ; - Igisl_dVbs = 0.0e0 ; - Igisl_dVds = 0.0e0 ; - Igisl_dVgs = 0.0e0 ; - } else { - T1 = model->HSM2_gidl3 * ( - Vds + model->HSM2_gidl4 ) - - ( Vgs - Vds ) + ( dVthSC + dVthLP ) * model->HSM2_gidl5 - Qb0Cox ; - - T2 = 1.0 / Tox0 ; - E1 = T1 * T2 ; - E1_dVb = ( model->HSM2_gidl5 * (dVthSC_dVb + dVthLP_dVb) - Qb0Cox_dVb ) * T2 ; - E1_dVd = ( -1.0 * model->HSM2_gidl3 + 1.0 + model->HSM2_gidl5 * (dVthSC_dVd + dVthLP_dVd) - Qb0Cox_dVd ) * T2 ; - E1_dVg = ( -1.0 + model->HSM2_gidl5 * (dVthSC_dVg + dVthLP_dVg) - Qb0Cox_dVg ) * T2 ; - - Fn_SZ( Egisl , E1, eef_dlt, T5) ; - Egisl_dVb = T5 * E1_dVb ; - Egisl_dVd = T5 * E1_dVd ; - Egisl_dVg = T5 * E1_dVg ; - Egisl += small ; - - T6 = pow(Egisl,model->HSM2_gidl7) ; - T1 = model->HSM2_gidl7 * pow(Egisl,model->HSM2_gidl7 -1.0) ; - T6_dVb = Egisl_dVb * T1 ; - T6_dVd = Egisl_dVd * T1 ; - T6_dVg = Egisl_dVg * T1 ; - - T0 = - pParam->HSM2_gidl2 * Egp32 / T6 ; - if ( T0 < - EXP_THR ) { - Igisl = 0.0 ; - Igisl_dVbs = Igisl_dVds = Igisl_dVgs = 0.0 ; - } else { - T1 = exp ( T0 ) ; - T2 = pParam->HSM2_gidl1 / Egp12 * C_QE * here->HSM2_weff_nf ; - Igisl = T2 * Egisl * Egisl * T1 ; - T3 = T2 * T1 * Egisl * (2.0 + pParam->HSM2_gidl2 * Egp32 * Egisl / T6 / T6) ; - Igisl_dVbs = T3 * Egisl_dVb ; - Igisl_dVds = T3 * Egisl_dVd ; - Igisl_dVgs = T3 * Egisl_dVg ; - } - - Vsb = - Vbs ; - if ( Vsb > 0.0 ) { - T2 = Vsb * Vsb ; - T4 = T2 * Vsb ; - T0 = T4 + C_gidl_delta ; - T5 = T4 / T0 ; - T7 = ( 3.0 * T2 * T0 - T4 * 3.0 * T2 ) / ( T0 * T0 ) ; /* == T5_dVsb */ - Igisl_dVbs = Igisl_dVbs * T5 + Igisl * T7 * ( - 1.0 ) ; /* Vsb_dVbs = -1 */ - Igisl_dVds = Igisl_dVds * T5 ; /* Vsb_dVds = 0 */ - Igisl_dVgs = Igisl_dVgs * T5 ; /* Vsb_dVgs = 0 */ - Igisl *= T5 ; - } else { - Igisl = 0.0 ; - Igisl_dVbs = Igisl_dVds = Igisl_dVgs = 0.0 ; - } - - } - - - /*-----------------------------------------------------------* - * End of PART-2. (label) - *-----------------*/ -/* end_of_part_2: */ - - /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ - * PART-3: Overlap charge - *++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ - Aclm = pParam->HSM2_clm1 ; - if ( flg_noqi != 0 ) { - /*-------------------------------------------* - * Calculation of Psdl for cases of flg_noqi==1. - *-----------------*/ - Psdl = Aclm * (Vds + Ps0) + (1.0e0 - Aclm) * Psl ; - Psdl_dVbs = Aclm * Ps0_dVbs + (1.0e0 - Aclm) * Psl_dVbs ; - Psdl_dVds = Aclm * (1.0e0 + Ps0_dVds) + (1.0e0 - Aclm) * Psl_dVds ; - Psdl_dVgs = Aclm * Ps0_dVgs + (1.0e0 - Aclm) * Psl_dVgs ; - if ( Psdl > Ps0 + Vds - epsm10 ) { - Psdl = Ps0 + Vds - epsm10 ; - Psdl_dVbs = Ps0_dVbs ; - Psdl_dVds = Ps0_dVds + 1.0 ; - Psdl_dVgs = Ps0_dVgs ; - } - - if (model->HSM2_xqy !=0) { - Ec = 0.0e0 ; - Ec_dVbs =0.0e0 ; - Ec_dVds =0.0e0 ; - Ec_dVgs =0.0e0 ; - } - } else { - /* Ec is removed from Lred calc. part */ - if (model->HSM2_xqy !=0) { - if ( Idd < C_IDD_MIN ) { - Ec = 0.0e0 ; - Ec_dVbs =0.0e0 ; - Ec_dVds =0.0e0 ; - Ec_dVgs =0.0e0 ; - } else { - T1 = beta_inv / Leff ; - T2 = 1.0 / (Qn0 + 1e-20) ; - T3 = T2 * T2 ; - Ec = Idd * T1 * T2 ; - Ec_dVbs = T1 * (Idd_dVbs * T2 - Idd * Qn0_dVbs * T3 ) ; - Ec_dVds = T1 * (Idd_dVds * T2 - Idd * Qn0_dVds * T3 ) ; - Ec_dVgs = T1 * (Idd_dVgs * T2 - Idd * Qn0_dVgs * T3 ) ; - } - } - } - - - /*-------------------------------------------* - * Overlap charges: Qgod, Qgos, and Qover - *-----------------*/ - if ( model->HSM2_coovlp >= 1 && pParam->HSM2_lover > 0.0 ){ - cov_slp = modelMKS->HSM2_ovslp ; - cov_mag = model->HSM2_ovmag ; - - covvg = Vgs ; - covvg_dVgs = 1.0 ; - - T1 = Cox0 * here->HSM2_weff_nf ; - Lov = pParam->HSM2_lover ; - - if ( pParam->HSM2_nover == 0.0 ){ - T4 = cov_slp * T1 * ( cov_mag + covvg ) ; - T4_dVg = cov_slp * T1 * covvg_dVgs ; - T4_dVd = 0.0 ; - T5 = Lov * T1 ; - - TX = Ps0 ; - TX_dVbs = Ps0_dVbs ; - TX_dVds = Ps0_dVds ; - TX_dVgs = Ps0_dVgs ; - - T9 = 1.2e0 - TX ; - Qgos = Vgs * T5 - T9 * T4 ; - Qgos_dVbs = T4 * TX_dVbs ; - Qgos_dVds = T4 * TX_dVds - T9 * T4_dVd ; - Qgos_dVgs = T5 + T4 * TX_dVgs - T9 * T4_dVg ; - - T4 = cov_slp * T1 * ( cov_mag + covvg - Vds ) ; - T4_dVg = cov_slp * T1 * covvg_dVgs ; - T4_dVd = - cov_slp * T1 ; - TX = Psl - Vds ; - TX_dVbs = Psl_dVbs ; - TX_dVds = Psl_dVds - 1.0 ; - TX_dVgs = Psl_dVgs ; - T9 = 1.2e0 - TX ; - Qgod = (Vgs - Vds) * T5 - T4 * T9 ; - Qgod_dVbs = T4 * TX_dVbs ; - Qgod_dVds = - T5 + T4 * TX_dVds - T9 * T4_dVd ; - Qgod_dVgs = T5 + T4 * TX_dVgs - T9 * T4_dVg ; - } else { - for ( lcover = -1 ; lcover <= +1 ; lcover += 2 ) { - flg_ovloops = ( 1 - lcover ) / 2 ; /* 1 in Source overlap calc. */ - flg_ovloopd = ( 1 + lcover ) / 2 ; /* 1 in Drain overlap calc. */ - /*-------------------------------------------* - * Qover (G/D overlap charge) | note: _dVxs means _dVxse - *------------------------*/ - Vbsgmt = ModeNML * Vbse + ModeRVS * ( Vbse - Vdse ) ; - Vdsgmt = ModeNML * Vdse + ModeRVS * ( - Vdse ) ; - Vgsgmt = ModeNML * Vgse + ModeRVS * ( Vgse - Vdse ) ; - Vdbgmt = Vdsgmt - Vbsgmt ; - Vgbgmt = Vgsgmt - Vbsgmt ; - Vsbgmt = - Vbsgmt ; - flg_overs = flg_ovloops * (int)ModeNML + flg_ovloopd * (int)ModeRVS ; /* geometrical source */ - flg_overd = flg_ovloops * (int)ModeRVS + flg_ovloopd * (int)ModeNML ; /* geometrical drain */ - Vxbgmt = flg_overs * Vsbgmt + flg_overd * Vdbgmt + epsm10 ; - - - /*---------------------------------------------------* - * Clamp -Vxbgmt. - *-----------------*/ - T0 = - Vxbgmt; - if ( T0 > Vbs_bnd ) { - T1 = T0 - Vbs_bnd; - T2 = Vbs_max - Vbs_bnd; - - Fn_SUPoly4( TY, T1, T2, T11 ); - - T10 = Vbs_bnd + TY ; - } else { - T10 = T0 ; - T11 = 1.0 ; - } - Vxbgmtcl = - T10 - small2 ; - Vxbgmtcl_dVxbgmt = T11; - - fac1 = here->HSM2_cnst0over * Cox0_inv ; - fac1_dVbs = 0.0; fac1_dVds = 0.0; fac1_dVgs = 0.0; - - fac1p2 = fac1 * fac1 ; - - VgpLD = - Vgbgmt + pParam->HSM2_vfbover; - VgpLD_dVgb = - 1.0e0 ; - - T0 = pParam->HSM2_nover / here->HSM2_nin ; - Pb2over = 2.0 / beta * log( T0 ) ; - - Vgb_fb_LD = - Vxbgmtcl ; - - /*-----------------------------------* - * QsuLD: total charge = Accumulation | Depletion+inversion - *-----------------*/ - if ( VgpLD < Vgb_fb_LD ){ - /*---------------------------* - * Accumulation - *-----------------*/ - flg_ovzone = -1 ; - T1 = 1.0 / ( beta * here->HSM2_cnst0over ) ; - TY = T1 * Cox0 ; - Ac41 = 2.0 + 3.0 * C_SQRT_2 * TY ; - Ac4 = 8.0 * Ac41 * Ac41 * Ac41 ; - - Ps0_min = here->HSM2_eg - Pb2over ; - - TX = beta * ( VgpLD + Vxbgmtcl ) ; - TX_dVxb = beta * Vxbgmtcl_dVxbgmt ; - TX_dVgb = beta * VgpLD_dVgb ; - - Ac31 = 7.0 * C_SQRT_2 - 9.0 * TY * ( TX - 2.0 ) ; - Ac31_dVxb = - 9.0 * TY * TX_dVxb ; - Ac31_dVgb = - 9.0 * TY * TX_dVgb ; - - Ac3 = Ac31 * Ac31 ; - T1 = 2.0 * Ac31 ; - Ac3_dVxb = T1 * Ac31_dVxb ; - Ac3_dVgb = T1 * Ac31_dVgb ; - - Ac2 = sqrt( Ac4 + Ac3 ) ; - T1 = 0.5 / Ac2 ; - Ac2_dVxb = T1 * Ac3_dVxb ; - Ac2_dVgb = T1 * Ac3_dVgb ; - - Ac1 = -7.0 * C_SQRT_2 + Ac2 + 9.0 * TY * ( TX - 2.0 ) ; - Ac1_dVxb = Ac2_dVxb + 9.0 * TY * TX_dVxb ; - Ac1_dVgb = Ac2_dVgb + 9.0 * TY * TX_dVgb ; - - Acd = pow( Ac1 , C_1o3 ) ; - T1 = C_1o3 / ( Acd * Acd ) ; - Acd_dVxb = Ac1_dVxb * T1 ; - Acd_dVgb = Ac1_dVgb * T1 ; - - Acn = -4.0 * C_SQRT_2 - 12.0 * TY + 2.0 * Acd + C_SQRT_2 * Acd * Acd ; - T1 = 2.0 + 2.0 * C_SQRT_2 * Acd ; - Acn_dVxb = T1 * Acd_dVxb ; - Acn_dVgb = T1 * Acd_dVgb ; - - Chi = Acn / Acd ; - T1 = 1.0 / ( Acd * Acd ) ; - Chi_dVxb = ( Acn_dVxb * Acd - Acn * Acd_dVxb ) * T1 ; - Chi_dVgb = ( Acn_dVgb * Acd - Acn * Acd_dVgb ) * T1 ; - - Psa = Chi * beta_inv - Vxbgmtcl ; - Psa_dVxb = Chi_dVxb * beta_inv - Vxbgmtcl_dVxbgmt ; - Psa_dVgb = Chi_dVgb * beta_inv ; - - T1 = Psa + Vxbgmtcl ; - T2 = T1 / Ps0_min ; - T3 = sqrt( 1.0 + ( T2 * T2 ) ) ; - - T9 = T2 / T3 / Ps0_min ; - T3_dVd = T9 * ( Psa_dVxb + Vxbgmtcl_dVxbgmt ) ; - T3_dVg = T9 * Psa_dVgb ; - - Ps0LD = T1 / T3 - Vxbgmtcl ; - T9 = 1.0 / ( T3 * T3 ) ; - Ps0LD_dVxb = T9 * ( ( Psa_dVxb + Vxbgmtcl_dVxbgmt ) * T3 - T1 * T3_dVd ) - Vxbgmtcl_dVxbgmt ; - Ps0LD_dVgb = T9 * ( Psa_dVgb * T3 - T1 * T3_dVg ); - - T2 = ( VgpLD - Ps0LD ) ; - QsuLD = Cox0 * T2 ; - QsuLD_dVxb = - Cox0 * Ps0LD_dVxb ; - QsuLD_dVgb = Cox0 * ( VgpLD_dVgb - Ps0LD_dVgb ) ; - - QbuLD = QsuLD ; - QbuLD_dVxb = QsuLD_dVxb ; - QbuLD_dVgb = QsuLD_dVgb ; - - } else { - - /*---------------------------* - * Depletion and inversion - *-----------------*/ - - /* initial value for a few fixpoint iterations - to get Ps0_iniA from simplified Poisson equation: */ - flg_ovzone = 2 ; - Chi = znbd3 ; - Chi_dVxb = 0.0 ; Chi_dVgb = 0.0 ; - - Ps0_iniA= Chi/beta - Vxbgmtcl ; - Ps0_iniA_dVxb = Chi_dVxb/beta - Vxbgmtcl_dVxbgmt ; - Ps0_iniA_dVgb = Chi_dVgb/beta ; - - /* 1 .. 2 relaxation steps should be sufficient */ - for ( lp_ld = 1; lp_ld <= 2; lp_ld ++ ) { - TY = exp(-Chi); - TY_dVxb = -Chi_dVxb * TY; - TY_dVgb = -Chi_dVgb * TY; - TX = 1.0e0 + 4.0e0 - * ( beta * ( VgpLD + Vxbgmtcl ) - 1.0e0 + TY ) / ( fac1p2 * beta2 ) ; - TX_dVxb = 4.0e0 * ( beta * ( Vxbgmtcl_dVxbgmt ) + TY_dVxb ) / ( fac1p2 * beta2 ); - TX_dVgb = 4.0e0 * ( beta * ( VgpLD_dVgb ) + TY_dVgb ) / ( fac1p2 * beta2 ); - T1 = ( beta * ( VgpLD + Vxbgmtcl ) - 1.0e0 + TY ); - T3 = fac1p2 * beta2 ; - if ( TX < epsm10) { - TX = epsm10; TX_dVxb = 0.0; TX_dVgb = 0.0; - } - - Ps0_iniA = VgpLD + fac1p2 * beta / 2.0e0 * ( 1.0e0 - sqrt( TX ) ) ; - Ps0_iniA_dVxb = - fac1p2 * beta / 2.0e0 * TX_dVxb * 0.5 / sqrt( TX ); - Ps0_iniA_dVgb = VgpLD_dVgb - fac1p2 * beta / 2.0e0 * TX_dVgb * 0.5 / sqrt( TX ); - T1 = fac1p2 * beta ; - T2 = 1.0 - sqrt( TX ); - - Chi = beta * ( Ps0_iniA + Vxbgmtcl ) ; - Chi_dVxb = beta * ( Ps0_iniA_dVxb + Vxbgmtcl_dVxbgmt ) ; - Chi_dVgb = beta * ( Ps0_iniA_dVgb ) ; - } /* End of iteration */ - - if ( Chi < znbd3 ) { - - flg_ovzone = 1 ; - - /*-----------------------------------* - * zone-D1 - * - Ps0_iniA is the analytical solution of QovLD=Qb0 with - * Qb0 being approximated by 3-degree polynomial. - * - * new: Inclusion of exp(-Chi) term at right border - *-----------------*/ - Ta = 1.0/(9.0*sqrt(2.0)) - (5.0+7.0*exp(-3.0)) / (54.0*sqrt(2.0+exp(-3.0))); - Tb = (1.0+exp(-3.0)) / (2.0*sqrt(2.0+exp(-3.0))) - sqrt(2.0) / 3.0; - Tc = 1.0/sqrt(2.0) + 1.0/(beta*fac1); - Td = - (VgpLD + Vxbgmtcl) / fac1; - Td_dVxb = - Vxbgmtcl_dVxbgmt / fac1; - Td_dVgb = - VgpLD_dVgb / fac1; - Tq = Tb*Tb*Tb / (27.0*Ta*Ta*Ta) - Tb*Tc/(6.0*Ta*Ta) + Td/(2.0*Ta); - Tq_dVxb = Td_dVxb/(2.0*Ta); - Tq_dVgb = Td_dVgb / (2.0*Ta); - Tp = (3.0*Ta*Tc-Tb*Tb)/(9.0*Ta*Ta); - T5 = sqrt(Tq*Tq + Tp*Tp*Tp); - T5_dVxb = 2.0*Tq*Tq_dVxb / (2.0*T5); - T5_dVgb = 2.0*Tq*Tq_dVgb / (2.0*T5); - Tu = pow(-Tq + T5,C_1o3); - Tu_dVxb = Tu / (3.0 * (-Tq + T5)) * (-Tq_dVxb + T5_dVxb); - Tu_dVgb = Tu / (3.0 * (-Tq + T5)) * (-Tq_dVgb + T5_dVgb); - Tv = -pow(Tq + T5,C_1o3); - Tv_dVxb = Tv / (3.0 * (-Tq - T5)) * (-Tq_dVxb - T5_dVxb); - Tv_dVgb = Tv / (3.0 * (-Tq - T5)) * (-Tq_dVgb - T5_dVgb); - TX = Tu + Tv - Tb/(3.0*Ta); - TX_dVxb = Tu_dVxb + Tv_dVxb; - TX_dVgb = Tu_dVgb + Tv_dVgb; - - Ps0_iniA = TX * beta_inv - Vxbgmtcl ; - Ps0_iniA_dVxb = TX_dVxb * beta_inv - Vxbgmtcl_dVxbgmt; - Ps0_iniA_dVgb = TX_dVgb * beta_inv; - - Chi = beta * ( Ps0_iniA + Vxbgmtcl ) ; - Chi_dVxb = beta * ( Ps0_iniA_dVxb + Vxbgmtcl_dVxbgmt ) ; - Chi_dVgb = beta * ( Ps0_iniA_dVgb ) ; - } - - if ( model->HSM2_coqovsm > 0 ) { - /*-----------------------------------* - * - Ps0_iniB : upper bound. - *-----------------*/ - flg_ovzone += 2; - - VgpLD_shift = VgpLD + Vxbgmtcl + 0.1; - VgpLD_shift_dVgb = VgpLD_dVgb; - VgpLD_shift_dVxb = Vxbgmtcl_dVxbgmt; - exp_bVbs = exp( beta * - Vxbgmtcl ) + small ; - exp_bVbs_dVxb = - exp_bVbs * beta * Vxbgmtcl_dVxbgmt; - T0 = here->HSM2_nin / pParam->HSM2_nover; - cnst1over = T0 * T0; - gamma = cnst1over * exp_bVbs ; - gamma_dVxb = cnst1over * exp_bVbs_dVxb; - - T0 = beta2 * fac1p2; - - psi = beta*VgpLD_shift; - psi_dVgb = beta*VgpLD_shift_dVgb; - psi_dVxb = beta*VgpLD_shift_dVxb; - Chi_1 = log(gamma*T0 + psi*psi) - log(cnst1over*T0) + beta*Vxbgmtcl; - Chi_1_dVgb = 2.0*psi*psi_dVgb/ (gamma*T0 + psi*psi); - Chi_1_dVxb = (gamma_dVxb*T0+2.0*psi*psi_dVxb)/(gamma*T0+psi*psi) - + beta*Vxbgmtcl_dVxbgmt; - - Fn_SU2( Chi_1, Chi_1, psi, 1.0, T1, T2 ); - Chi_1_dVgb = Chi_1_dVgb*T1 + psi_dVgb*T2; - Chi_1_dVxb = Chi_1_dVxb*T1 + psi_dVxb*T2; - - /* 1 fixpoint step for getting more accurate Chi_B */ - psi -= Chi_1 ; - psi_dVgb -= Chi_1_dVgb ; - psi_dVxb -= Chi_1_dVxb ; - - psi += beta*0.1 ; - - psi_B = psi; - arg_B = psi*psi/(gamma*T0); - Chi_B = log(gamma*T0 + psi*psi) - log(cnst1over*T0) + beta*Vxbgmtcl; - Chi_B_dVgb = 2.0*psi*psi_dVgb/ (gamma*T0 + psi*psi); - Chi_B_dVxb = (gamma_dVxb*T0+2.0*psi*psi_dVxb)/(gamma*T0+psi*psi) - + beta*Vxbgmtcl_dVxbgmt; - Ps0_iniB = Chi_B/beta - Vxbgmtcl ; - Ps0_iniB_dVgb = Chi_B_dVgb/beta; - Ps0_iniB_dVxb = Chi_B_dVxb/beta- Vxbgmtcl_dVxbgmt; - - - /* construction of Ps0LD by taking Ps0_iniB as an upper limit of Ps0_iniA - * - * Limiting is done for Chi rather than for Ps0LD, to avoid shifting - * for Fn_SU2 */ - - Chi_A = Chi; - Chi_A_dVxb = Chi_dVxb; - Chi_A_dVgb = Chi_dVgb; - - Fn_SU2( Chi, Chi_A, Chi_B, c_ps0ini_2*75.00, T1, T2 ); /* org: 50 */ - Chi_dVgb = Chi_A_dVgb * T1 + Chi_B_dVgb * T2; - Chi_dVxb = Chi_A_dVxb * T1 + Chi_B_dVxb * T2; - - } - - /* updating Ps0LD */ - Ps0LD= Chi/beta - Vxbgmtcl ; - Ps0LD_dVgb = Chi_dVgb/beta; - Ps0LD_dVxb = Chi_dVxb/beta- Vxbgmtcl_dVxbgmt; - - T1 = Chi - 1.0 + exp(-Chi); - T1_dVxb = (1.0 - exp(-Chi)) * Chi_dVxb ; - T1_dVgb = (1.0 - exp(-Chi)) * Chi_dVgb ; - if (T1 < epsm10) { - T1 = epsm10 ; - T1_dVxb = 0.0 ; - T1_dVgb = 0.0 ; - } - T2 = sqrt(T1); - QbuLD = here->HSM2_cnst0over * T2 ; - T3 = here->HSM2_cnst0over * 0.5 / T2 ; - QbuLD_dVxb = T3 * T1_dVxb ; - QbuLD_dVgb = T3 * T1_dVgb ; - - /*-----------------------------------------------------------* - * QsuLD : Qovs or Qovd in unit area. - * note: QsuLD = Qdep+Qinv. - *-----------------*/ - QsuLD = Cox0 * ( VgpLD - Ps0LD ) ; - QsuLD_dVxb = Cox0 * ( - Ps0LD_dVxb ) ; - QsuLD_dVgb = Cox0 * ( VgpLD_dVgb - Ps0LD_dVgb ) ; - - if ( model->HSM2_coqovsm == 1 ) { /* take initial values from analytical model */ - - - /*---------------------------------------------------* - * Calculation of Ps0LD. (beginning of Newton loop) - * - Fs0 : Fs0 = 0 is the equation to be solved. - * - dPs0 : correction value. - *-----------------*/ - - /* initial value too close to flat band should not be used */ - exp_bVbs = exp( beta * - Vxbgmtcl ) ; - T0 = here->HSM2_nin / pParam->HSM2_nover; - cnst1over = T0 * T0; - cfs1 = cnst1over * exp_bVbs ; - - flg_conv = 0 ; - for ( lp_s0 = 1 ; lp_s0 <= 2*lp_s0_max + 1 ; lp_s0 ++ ) { - - Chi = beta * ( Ps0LD + Vxbgmtcl ) ; - - if ( Chi < znbd5 ) { - /*-------------------------------------------* - * zone-D1/D2. (Ps0LD) - *-----------------*/ - fi = Chi * Chi * Chi - * ( cn_im53 + Chi * ( cn_im54 + Chi * cn_im55 ) ) ; - fi_dChi = Chi * Chi - * ( 3 * cn_im53 + Chi * ( 4 * cn_im54 + Chi * 5 * cn_im55 ) ) ; - - fs01 = cfs1 * fi * fi ; - fs01_dPs0 = cfs1 * beta * 2 * fi * fi_dChi ; - - fb = Chi * ( cn_nc51 - + Chi * ( cn_nc52 - + Chi * ( cn_nc53 - + Chi * ( cn_nc54 + Chi * cn_nc55 ) ) ) ) ; - fb_dChi = cn_nc51 - + Chi * ( 2 * cn_nc52 - + Chi * ( 3 * cn_nc53 - + Chi * ( 4 * cn_nc54 + Chi * 5 * cn_nc55 ) ) ) ; - - fs02 = sqrt( fb * fb + fs01 + small ) ; - fs02_dPs0 = ( beta * fb_dChi * 2 * fb + fs01_dPs0 ) / ( fs02 + fs02 ) ; - - } else { - /*-------------------------------------------* - * zone-D3. (Ps0LD) - *-----------------*/ - if ( Chi < large_arg ) { /* avoid exp_Chi to become extremely large */ - exp_Chi = exp( Chi ) ; - fs01 = cfs1 * ( exp_Chi - 1.0e0 ) ; - fs01_dPs0 = cfs1 * beta * ( exp_Chi ) ; - } else { - exp_bPs0 = exp( beta*Ps0LD ) ; - fs01 = cnst1over * ( exp_bPs0 - exp_bVbs ) ; - fs01_dPs0 = cnst1over * beta * exp_bPs0 ; - } - fs02 = sqrt( Chi - 1.0 + fs01 ) ; - fs02_dPs0 = ( beta + fs01_dPs0 ) / fs02 * 0.5 ; - - } /* end of if ( Chi ... ) block */ - /*-----------------------------------------------------------* - * Fs0 - *-----------------*/ - Fs0 = VgpLD - Ps0LD - fac1 * fs02 ; - Fs0_dPs0 = - 1.0e0 - fac1 * fs02_dPs0 ; - - if ( flg_conv == 1 ) break ; - - dPs0 = - Fs0 / Fs0_dPs0 ; - - /*-------------------------------------------* - * Update Ps0LD . - *-----------------*/ - dPlim = 0.5*dP_max*(1.0 + Fn_Max(1.e0,fabs(Ps0LD))) ; - if ( fabs( dPs0 ) > dPlim ) dPs0 = dPlim * Fn_Sgn( dPs0 ) ; - - Ps0LD = Ps0LD + dPs0 ; - - TX = -Vxbgmtcl + ps_conv / 2 ; - if ( Ps0LD < TX ) Ps0LD = TX ; - - /*-------------------------------------------* - * Check convergence. - *-----------------*/ - if ( fabs( dPs0 ) <= ps_conv && fabs( Fs0 ) <= gs_conv ) { - flg_conv = 1 ; - } - - } /* end of Ps0LD Newton loop */ - - /*-------------------------------------------* - * Procedure for diverged case. - *-----------------*/ - if ( flg_conv == 0 ) { - fprintf( stderr , - "*** warning(HiSIM_HV): Went Over Iteration Maximum (Ps0LD)\n" ) ; - fprintf( stderr , " -Vxbgmtcl = %e Vgbgmt = %e\n" , -Vxbgmtcl , Vgbgmt ) ; - } - - /*---------------------------------------------------* - * Evaluate derivatives of Ps0LD. - *-----------------*/ - - if ( Chi < znbd5 ) { - fs01_dVbs = cfs1 * beta * fi * ( - fi + 2 * fi_dChi ) ; /* fs01_dVxbgmtcl */ - T2 = 1.0e0 / ( fs02 + fs02 ) ; - fs02_dVbs = ( + beta * fb_dChi * 2 * fb + fs01_dVbs ) * T2 ; /* fs02_dVxbgmtcl */ - } else { - if ( Chi < large_arg ) { - fs01_dVbs = + cfs1 * beta ; /* fs01_dVxbgmtcl */ - } else { - fs01_dVbs = + cfs1 * beta ; - } - T2 = 0.5e0 / fs02 ; - fs02_dVbs = ( + beta + fs01_dVbs ) * T2 ; /* fs02_dVxbgmtcl */ - } - - T1 = 1.0 / Fs0_dPs0 ; - Ps0LD_dVxb = - ( - fac1 * fs02_dVbs ) * T1 ; - Ps0LD_dVds = 0.0 ; - Ps0LD_dVgb = - ( VgpLD_dVgb - fac1_dVgs * fs02 ) * T1 ; - - - if ( Chi < znbd5 ) { - /*-------------------------------------------* - * zone-D1/D2. (Ps0LD) - *-----------------*/ - if ( Chi < znbd3 ) { flg_ovzone = 1; } - else { flg_ovzone = 2; } - - Xi0 = fb * fb + epsm10 ; - T1 = 2 * fb * fb_dChi * beta ; - Xi0_dVbs = T1 * ( Ps0LD_dVxb + 1.0 ) ; /* Xi0_dVxbgmtcl */ - Xi0_dVds = T1 * Ps0LD_dVds ; - Xi0_dVgs = T1 * Ps0LD_dVgb ; - - Xi0p12 = fb + epsm10 ; - T1 = fb_dChi * beta ; - Xi0p12_dVbs = T1 * ( Ps0LD_dVxb + 1.0 ) ; /* Xi0p12_dVxbgmtcl */ - Xi0p12_dVds = T1 * Ps0LD_dVds ; - Xi0p12_dVgs = T1 * Ps0LD_dVgb ; - - Xi0p32 = fb * fb * fb + epsm10 ; - T1 = 3 * fb * fb * fb_dChi * beta ; - Xi0p32_dVbs = T1 * ( Ps0LD_dVxb + 1.0 ) ; /* Xi0p32_dVxbgmtcl */ - Xi0p32_dVds = T1 * Ps0LD_dVds ; - Xi0p32_dVgs = T1 * Ps0LD_dVgb ; - - } else { - /*-------------------------------------------* - * zone-D3. (Ps0LD) - *-----------------*/ - flg_ovzone = 3 ; - - Xi0 = Chi - 1.0e0 ; - Xi0_dVbs = beta * ( Ps0LD_dVxb + 1.0e0 ) ; /* Xi0_dVxbgmtcl */ - Xi0_dVds = beta * Ps0LD_dVds ; - Xi0_dVgs = beta * Ps0LD_dVgb ; - - Xi0p12 = sqrt( Xi0 ) ; - T1 = 0.5e0 / Xi0p12 ; - Xi0p12_dVbs = T1 * Xi0_dVbs ; - Xi0p12_dVds = T1 * Xi0_dVds ; - Xi0p12_dVgs = T1 * Xi0_dVgs ; - - Xi0p32 = Xi0 * Xi0p12 ; - T1 = 1.5e0 * Xi0p12 ; - Xi0p32_dVbs = T1 * Xi0_dVbs ; - Xi0p32_dVds = T1 * Xi0_dVds ; - Xi0p32_dVgs = T1 * Xi0_dVgs ; - - if ( Chi < large_arg ) { - } else { - } - } /* end of if ( Chi ... ) block */ - - /*-----------------------------------------------------------* - * - Recalculate the derivatives of fs01 and fs02. - *-----------------*/ - fs01_dVbs = Ps0LD_dVxb * fs01_dPs0 + fs01_dVbs ; - fs01_dVds = Ps0LD_dVds * fs01_dPs0 ; - fs01_dVgs = Ps0LD_dVgb * fs01_dPs0 ; - fs02_dVbs = Ps0LD_dVxb * fs02_dPs0 + fs02_dVbs ; - fs02_dVxb = Ps0LD_dVds * fs02_dPs0 ; - fs02_dVgb = Ps0LD_dVgb * fs02_dPs0 ; - - /*-----------------------------------------------------------* - * QbuLD and QiuLD - *-----------------*/ - QbuLD = here->HSM2_cnst0over * Xi0p12 ; - QbuLD_dVxb = here->HSM2_cnst0over * Xi0p12_dVbs ; - QbuLD_dVgb = here->HSM2_cnst0over * Xi0p12_dVgs ; - - T1 = 1.0 / ( fs02 + Xi0p12 ) ; - QiuLD = here->HSM2_cnst0over * fs01 * T1 ; - T2 = 1.0 / ( fs01 + epsm10 ) ; - QiuLD_dVbs = QiuLD * ( fs01_dVbs * T2 - ( fs02_dVbs + Xi0p12_dVbs ) * T1 ) ; - QiuLD_dVgs = QiuLD * ( fs01_dVgs * T2 - ( fs02_dVgb + Xi0p12_dVgs ) * T1 ) ; - - /*-----------------------------------------------------------* - * Extrapolation: X_dVxbgmt = X_dVxbgmtcl * Vxbgmtcl_dVxbgmt - *-----------------*/ - QbuLD_dVxb *= Vxbgmtcl_dVxbgmt ; - QiuLD_dVbs *= Vxbgmtcl_dVxbgmt ; - - /*-----------------------------------------------------------* - * Total overlap charge - *-----------------*/ - QsuLD = QbuLD + QiuLD; - QsuLD_dVxb = QbuLD_dVxb + QiuLD_dVbs; - QsuLD_dVgb = QbuLD_dVgb + QiuLD_dVgs; - - } /* end of COQOVSM branches */ - - } /* end of Vgbgmt region blocks */ - - - /* convert to source ref. */ - QsuLD_dVbs = - (QsuLD_dVxb + QsuLD_dVgb) ; - QsuLD_dVds = QsuLD_dVxb * flg_overd ; - QsuLD_dVgs = QsuLD_dVgb ; - - QbuLD_dVbs = - (QbuLD_dVxb + QbuLD_dVgb) ; - QbuLD_dVds = QbuLD_dVxb * flg_overd ; - QbuLD_dVgs = QbuLD_dVgb ; - - /* inversion charge = total - depletion */ - QiuLD = QsuLD - QbuLD ; - QiuLD_dVbs = QsuLD_dVbs - QbuLD_dVbs ; - QiuLD_dVds = QsuLD_dVds - QbuLD_dVds ; - QiuLD_dVgs = QsuLD_dVgs - QbuLD_dVgs ; - - /* assign final outputs of Qover model */ - /* note: Qovs and Qovd are exchanged in reverse mode */ - T4 = here->HSM2_weff_nf * Lov ; - - if(flg_ovloops) { - Qovs = T4 * QsuLD ; - Qovs_dVbs = T4 * QsuLD_dVbs ; - Qovs_dVds = T4 * QsuLD_dVds ; - Qovs_dVgs = T4 * QsuLD_dVgs ; - QisLD = T4 * QiuLD ; - QisLD_dVbs = T4 * QiuLD_dVbs ; - QisLD_dVds = T4 * QiuLD_dVds ; - QisLD_dVgs = T4 * QiuLD_dVgs ; - QbsLD = T4 * QbuLD ; - QbsLD_dVbs = T4 * QbuLD_dVbs ; - QbsLD_dVds = T4 * QbuLD_dVds ; - QbsLD_dVgs = T4 * QbuLD_dVgs ; - } - - if(flg_ovloopd) { - Qovd = T4 * QsuLD ; - Qovd_dVbs = T4 * QsuLD_dVbs ; - Qovd_dVds = T4 * QsuLD_dVds ; - Qovd_dVgs = T4 * QsuLD_dVgs ; - QidLD = T4 * QiuLD ; - QidLD_dVbs = T4 * QiuLD_dVbs ; - QidLD_dVds = T4 * QiuLD_dVds ; - QidLD_dVgs = T4 * QiuLD_dVgs ; - QbdLD = T4 * QbuLD ; - QbdLD_dVbs = T4 * QbuLD_dVbs ; - QbdLD_dVds = T4 * QbuLD_dVds ; - QbdLD_dVgs = T4 * QbuLD_dVgs ; - } - - } /* end of lcover loop */ - - /* convert to the derivatives w.r.t. mode-dependent biases */ - Qovs_dVds = ModeNML * Qovs_dVds - - ModeRVS * ( Qovs_dVds + Qovs_dVgs + Qovs_dVbs ) ; - QisLD_dVds = ModeNML * QisLD_dVds - - ModeRVS * ( QisLD_dVds + QisLD_dVgs + QisLD_dVbs ) ; - QbsLD_dVds = ModeNML * QbsLD_dVds - - ModeRVS * ( QbsLD_dVds + QbsLD_dVgs + QbsLD_dVbs ) ; - Qovd_dVds = ModeNML * Qovd_dVds - - ModeRVS * ( Qovd_dVds + Qovd_dVgs + Qovd_dVbs ); - QidLD_dVds = ModeNML * QidLD_dVds - - ModeRVS * ( QidLD_dVds + QidLD_dVgs + QidLD_dVbs ) ; - QbdLD_dVds = ModeNML * QbdLD_dVds - - ModeRVS * ( QbdLD_dVds + QbdLD_dVgs + QbdLD_dVbs ) ; - - } /* end of if ( pParam->HSM2_nover == 0.0 ) */ - - /*-----------------------------------* - * Additional constant capacitance model - *-----------------*/ - flg_overgiven = ( (int)ModeRVS * model->HSM2_cgso_Given - + (int)ModeNML * model->HSM2_cgdo_Given ) ; - if ( flg_overgiven ) { - Cgdo = ModeRVS * pParam->HSM2_cgso + ModeNML * pParam->HSM2_cgdo ; - Cgdo *= - here->HSM2_weff_nf ; - - Qgod += - Cgdo * (Vgs - Vds) ; - Qgod_dVds += Cgdo ; - Qgod_dVgs += -Cgdo ; - } - - flg_overgiven = ( (int)ModeNML * model->HSM2_cgso_Given - + (int)ModeRVS * model->HSM2_cgdo_Given ) ; - if(flg_overgiven) { - Cgso = ModeNML * pParam->HSM2_cgso + ModeRVS * pParam->HSM2_cgdo ; - Cgso *= - here->HSM2_weff_nf ; - - Qgos += - Cgso * Vgs ; - Qgos_dVgs += -Cgso ; - } - - } else { /* else case of if ( model->HSM2_coovlp >= 1 ) */ - if ( (here->HSM2_mode == HiSIM_NORMAL_MODE && !model->HSM2_cgdo_Given) || - (here->HSM2_mode != HiSIM_NORMAL_MODE && !model->HSM2_cgso_Given) ) { - Cgdo = - Cox0 * pParam->HSM2_lover * here->HSM2_weff_nf ; - } else { - Cgdo = ModeRVS * pParam->HSM2_cgso + ModeNML * pParam->HSM2_cgdo ; - Cgdo *= - here->HSM2_weff_nf ; - } - Qgod = - Cgdo * (Vgs - Vds) ; - Qgod_dVbs = 0.0 ; - Qgod_dVds = Cgdo ; - Qgod_dVgs = - Cgdo ; - - if ( (here->HSM2_mode == HiSIM_NORMAL_MODE && !model->HSM2_cgso_Given) || - (here->HSM2_mode != HiSIM_NORMAL_MODE && !model->HSM2_cgdo_Given) ) { - Cgso = - Cox0 * pParam->HSM2_lover * here->HSM2_weff_nf ; - } else { - Cgso = ModeNML * pParam->HSM2_cgso + ModeRVS * pParam->HSM2_cgdo ; - Cgso *= - here->HSM2_weff_nf ; - } - Qgos = - Cgso * Vgs ; - Qgos_dVbs = 0.0 ; - Qgos_dVds = 0.0 ; - Qgos_dVgs = - Cgso ; - } /* end of if ( model->HSM2_coovlp >= 1 ) */ - - /*-------------------------------------------* - * Gate/Bulk overlap charge: Qgbo - *-----------------*/ - Cgbo_loc = - model->HSM2_cgbo * here->HSM2_lgate ; - Qgbo = - Cgbo_loc * (Vgs -Vbs) ; - Qgbo_dVgs = - Cgbo_loc ; - Qgbo_dVbs = Cgbo_loc ; - Qgbo_dVds = 0.0 ; - - /*---------------------------------------------------* - * Lateral-field-induced capacitance. - *-----------------*/ - if ( model->HSM2_coqy == 0 || model->HSM2_xqy == 0 ){ - Qy = 0.0e0 ; - Qy_dVds = 0.0e0 ; - Qy_dVgs = 0.0e0 ; - Qy_dVbs = 0.0e0 ; - } else { - Pslk = Ec * Leff + Ps0 ; - Pslk_dVbs = Ec_dVbs * Leff + Ps0_dVbs; - Pslk_dVds = Ec_dVds * Leff + Ps0_dVds; - Pslk_dVgs = Ec_dVgs * Leff + Ps0_dVgs; - Fn_SU2( T10, (Pslk + C_PSLK_SHIFT), (Psdl + C_PSLK_SHIFT), C_PSLK_DELTA, T1, T2 ); - Pslk_dVbs = Pslk_dVbs * T1 + Psdl_dVbs * T2; - Pslk_dVds = Pslk_dVds * T1 + Psdl_dVds * T2; - Pslk_dVgs = Pslk_dVgs * T1 + Psdl_dVgs * T2; - Pslk = T10 - C_PSLK_SHIFT; - - /* suppress Qy in accumulation region */ - /* - Aclm_eff = 1.0 - Pds / (eps_qy + Pds) * (1.0 - Aclm) ; - Aclm_eff_dVds = eps_qy * Pds_dVds / ((eps_qy + Pds)*(eps_qy + Pds)) ; - Aclm_eff_dVgs = eps_qy * Pds_dVgs / ((eps_qy + Pds)*(eps_qy + Pds)) ; - Aclm_eff_dVbs = eps_qy * Pds_dVbs / ((eps_qy + Pds)*(eps_qy + Pds)) ; - */ - - Aclm_eff = Aclm ; Aclm_eff_dVds = Aclm_eff_dVgs = Aclm_eff_dVbs = 0.0 ; - - T1 = Aclm_eff * ( Vds + Ps0 ) + ( 1.0e0 - Aclm_eff ) * Pslk ; - T1_dVb = Aclm_eff * ( Ps0_dVbs ) + ( 1.0e0 - Aclm_eff ) * Pslk_dVbs - + Aclm_eff_dVbs * ( Vds + Ps0 - Pslk ) ; - T1_dVd = Aclm_eff * ( 1.0 + Ps0_dVds ) + ( 1.0e0 - Aclm_eff ) * Pslk_dVds - + Aclm_eff_dVds * ( Vds + Ps0 - Pslk ) ; - T1_dVg = Aclm_eff * ( Ps0_dVgs ) + ( 1.0e0 - Aclm_eff ) * Pslk_dVgs - + Aclm_eff_dVgs * ( Vds + Ps0 - Pslk ) ; - T10 = here->HSM2_wdpl ; - T3 = T10 * 1.3 ; - T2 = C_ESI * here->HSM2_weff_nf * T3 ; - T7 = 1.0e-9 ; /* 1nm */ - T0 = Fn_Max( model->HSM2_xqy , T7 ) ; - T4 = T2 / T0 ; - Qy = - ( Ps0 + Vds - T1 ) * T4 ; - Qy_dVds = - ( Ps0_dVds + 1.0e0 - T1_dVd ) * T4 ; - Qy_dVgs = - ( Ps0_dVgs - T1_dVg ) * T4 ; - Qy_dVbs = - ( Ps0_dVbs - T1_dVb ) * T4 ; - - - } - - if ( model->HSM2_xqy1 != 0.0 ){ - Qy += here->HSM2_cqyb0 * Vbs ; - Qy_dVbs += here->HSM2_cqyb0 ; - } - - Qy = Qy * FMDVDS ; - Qy_dVbs = Qy_dVbs * FMDVDS + Qy * FMDVDS_dVbs ; - Qy_dVds = Qy_dVds * FMDVDS + Qy * FMDVDS_dVds ; - Qy_dVgs = Qy_dVgs * FMDVDS + Qy * FMDVDS_dVgs ; - - /*---------------------------------------------------* - * Fringing capacitance. - *-----------------*/ - Cf = here->HSM2_cfrng ; - Qfd = Cf * ( Vgs - Vds ) ; - Qfs = Cf * Vgs ; - - /*-----------------------------------------------------------* - * End of PART-3. (label) - *-----------------*/ - -/* end_of_part_3:*/ - - /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ - * PART-4: Substrate-source/drain junction diode. - *++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ - - /*-----------------------------------------------------------* - * Cbsj, Cbdj: node-base S/D biases. - *-----------------*/ - - T10 = model->HSM2_cvb * here->HSM2_jd_nvtm_inv ; - T11 = model->HSM2_cvbk * here->HSM2_jd_nvtm_inv ; - - T9 = model->HSM2_cisb * here->HSM2_exptemp ; - T0 = here->HSM2_isbd2 * T9 ; - - T2 = exp (- vbd_jct * T10 ); - T2_dVb = - T2 * T10 ; - - T3 = exp (- vbd_jct * T11 ); - T3_dVb = - T3 * T11 ; - - - /* ibd */ - if ( vbd_jct < here->HSM2_vbdt ) { - TX = vbd_jct * here->HSM2_jd_nvtm_inv ; - if ( TX < - EXP_THR ) { - T1 = 0.0 ; - T1_dVb = 0.0 ; - } else { - T1 = exp ( TX ) ; - T1_dVb = T1 * here->HSM2_jd_nvtm_inv ; - } - - Ibd = here->HSM2_isbd * (T1 - 1.0) - + T0 * (T2 - 1.0) - + pParam->HSM2_cisbk * (T3 - 1.0); - Gbd = here->HSM2_isbd * T1_dVb - + T0 * T2_dVb - + pParam->HSM2_cisbk * T3_dVb ; - - } else { - T1 = here->HSM2_jd_expcd ; - - T4 = here->HSM2_isbd * here->HSM2_jd_nvtm_inv * T1 ; - - Ibd = here->HSM2_isbd * (T1 - 1.0) - + T4 * (vbd_jct - here->HSM2_vbdt) - + T0 * (T2 - 1.0) - + pParam->HSM2_cisbk * (T3 - 1.0) ; - Gbd = T4 - + T0 * T2_dVb - + pParam->HSM2_cisbk * T3_dVb ; - } - T12 = model->HSM2_divx * here->HSM2_isbd2 ; - Ibd += T12 * vbd_jct ; - Gbd += T12 ; - - /* ibs */ - T0 = here->HSM2_isbs2 * T9 ; - - TX = - vbs_jct * T10 ; - if ( TX < - EXP_THR ) { - T2 = 0.0 ; - T2_dVb = 0.0 ; - } else { - T2 = exp ( TX ); - T2_dVb = - T2 * T10 ; - } - - TX = - vbs_jct * T11 ; - if ( TX < - EXP_THR ) { - T3 = 0.0 ; - T3_dVb = 0.0 ; - } else { - T3 = exp ( TX ); - T3_dVb = - T3 * T11 ; - } - - if ( vbs_jct < here->HSM2_vbst ) { - TX = vbs_jct * here->HSM2_jd_nvtm_inv ; - if ( TX < - EXP_THR ) { - T1 = 0.0 ; - T1_dVb = 0.0 ; - } else { - T1 = exp ( TX ) ; - T1_dVb = T1 * here->HSM2_jd_nvtm_inv ; - } - Ibs = here->HSM2_isbs * (T1 - 1.0) - + T0 * (T2 - 1.0) - + pParam->HSM2_cisbk * (T3 - 1.0); - Gbs = here->HSM2_isbs * T1_dVb - + T0 * T2_dVb - + pParam->HSM2_cisbk * T3_dVb ; - } else { - T1 = here->HSM2_jd_expcs ; - - T4 = here->HSM2_isbs * here->HSM2_jd_nvtm_inv * T1 ; - - Ibs = here->HSM2_isbs * (T1 - 1.0) - + T4 * (vbs_jct - here->HSM2_vbst) - + T0 * (T2 - 1.0) - + pParam->HSM2_cisbk * (T3 - 1.0) ; - Gbs = T4 - + T0 * T2_dVb - + pParam->HSM2_cisbk * T3_dVb ; - } - T12 = model->HSM2_divx * here->HSM2_isbs2 ; - Ibs += T12 * vbs_jct ; - Gbs += T12 ; - - /*---------------------------------------------------* - * Add Gjmin. - *-----------------*/ - Ibd += Gjmin * vbd_jct ; - Ibs += Gjmin * vbs_jct ; - - Gbd += Gjmin ; - Gbs += Gjmin ; - - /*-----------------------------------------------------------* - * Charges and Capacitances. - *-----------------*/ - /* charge storage elements - * bulk-drain and bulk-source depletion capacitances - * czbd : zero bias drain junction capacitance - * czbs : zero bias source junction capacitance - * czbdsw:zero bias drain junction sidewall capacitance - * czbssw:zero bias source junction sidewall capacitance - */ - /* add new parameters - tcjbs : temperature dependence of czbs - tcjbd : temperature dependence of czbd - tcjbssw : temperature dependence of czbssw - tcjbdsw : temperature dependence of czbdsw - tcjbsswg : temperature dependence of czbsswg - tcjbdswg : temperature dependence of czbdswg - */ - tcjbd=model->HSM2_tcjbd; - tcjbs=model->HSM2_tcjbs; - tcjbdsw=model->HSM2_tcjbdsw; - tcjbssw=model->HSM2_tcjbssw; - tcjbdswg=model->HSM2_tcjbdswg; - tcjbsswg=model->HSM2_tcjbsswg; - - czbs = model->HSM2_cj * here->HSM2_as ; - czbs = czbs * ( 1.0 + tcjbs * ( TTEMP - model->HSM2_ktnom )) ; - - czbd = model->HSM2_cj * here->HSM2_ad ; - czbd = czbd * ( 1.0 + tcjbd * ( TTEMP - model->HSM2_ktnom )) ; - - /* Source Bulk Junction */ - if (here->HSM2_ps > here->HSM2_weff_nf) { - czbssw = model->HSM2_cjsw * ( here->HSM2_ps - here->HSM2_weff_nf ) ; - czbssw = czbssw * ( 1.0 + tcjbssw * ( TTEMP - model->HSM2_ktnom )) ; - - czbsswg = model->HSM2_cjswg * here->HSM2_weff_nf ; - czbsswg = czbsswg * ( 1.0 + tcjbsswg * ( TTEMP - model->HSM2_ktnom )) ; - - if (vbs_jct == 0.0) { - Qbs = 0.0 ; - Capbs = czbs + czbssw + czbsswg ; - } else if (vbs_jct < 0.0) { - if (czbs > 0.0) { - arg = 1.0 - vbs_jct / model->HSM2_pb ; - if (model->HSM2_mj == 0.5) - sarg = 1.0 / sqrt(arg) ; - else - sarg = Fn_Pow( arg , -model->HSM2_mj ) ; - Qbs = model->HSM2_pb * czbs * (1.0 - arg * sarg) / (1.0 - model->HSM2_mj) ; - Capbs = czbs * sarg ; - } else { - Qbs = 0.0 ; - Capbs = 0.0 ; - } - if (czbssw > 0.0) { - arg = 1.0 - vbs_jct / model->HSM2_pbsw ; - if (model->HSM2_mjsw == 0.5) - sarg = 1.0 / sqrt(arg) ; - else - sarg = Fn_Pow( arg , -model->HSM2_mjsw ) ; - Qbs += model->HSM2_pbsw * czbssw * (1.0 - arg * sarg) / (1.0 - model->HSM2_mjsw) ; - Capbs += czbssw * sarg ; - } - if (czbsswg > 0.0) { - arg = 1.0 - vbs_jct / model->HSM2_pbswg ; - if (model->HSM2_mjswg == 0.5) - sarg = 1.0 / sqrt(arg) ; - else - sarg = Fn_Pow( arg , -model->HSM2_mjswg ) ; - Qbs += model->HSM2_pbswg * czbsswg * (1.0 - arg * sarg) / (1.0 - model->HSM2_mjswg) ; - Capbs += czbsswg * sarg ; - } - } else { - T1 = czbs + czbssw + czbsswg ; - T2 = czbs * model->HSM2_mj / model->HSM2_pb - + czbssw * model->HSM2_mjsw / model->HSM2_pbsw - + czbsswg * model->HSM2_mjswg / model->HSM2_pbswg ; - Qbs = vbs_jct * (T1 + vbs_jct * 0.5 * T2) ; - Capbs = T1 + vbs_jct * T2 ; - } - } else { - czbsswg = model->HSM2_cjswg * here->HSM2_ps ; - czbsswg = czbsswg * ( 1.0 + tcjbsswg * ( TTEMP - model->HSM2_ktnom )) ; - if (vbs_jct == 0.0) { - Qbs = 0.0 ; - Capbs = czbs + czbsswg ; - } else if (vbs_jct < 0.0) { - if (czbs > 0.0) { - arg = 1.0 - vbs_jct / model->HSM2_pb ; - if (model->HSM2_mj == 0.5) - sarg = 1.0 / sqrt(arg) ; - else - sarg = Fn_Pow( arg , -model->HSM2_mj ) ; - Qbs = model->HSM2_pb * czbs * (1.0 - arg * sarg) / (1.0 - model->HSM2_mj) ; - Capbs = czbs * sarg ; - } else { - Qbs = 0.0 ; - Capbs = 0.0 ; - } - if (czbsswg > 0.0) { - arg = 1.0 - vbs_jct / model->HSM2_pbswg ; - if (model->HSM2_mjswg == 0.5) - sarg = 1.0 / sqrt(arg) ; - else - sarg = Fn_Pow( arg , -model->HSM2_mjswg ) ; - Qbs += model->HSM2_pbswg * czbsswg * (1.0 - arg * sarg) / (1.0 - model->HSM2_mjswg) ; - Capbs += czbsswg * sarg ; - } - } else { - T1 = czbs + czbsswg ; - T2 = czbs * model->HSM2_mj / model->HSM2_pb - + czbsswg * model->HSM2_mjswg / model->HSM2_pbswg ; - Qbs = vbs_jct * (T1 + vbs_jct * 0.5 * T2) ; - Capbs = T1 + vbs_jct * T2 ; - } - } - - /* Drain Bulk Junction */ - if (here->HSM2_pd > here->HSM2_weff_nf) { - czbdsw = model->HSM2_cjsw * ( here->HSM2_pd - here->HSM2_weff_nf ) ; - czbdsw = czbdsw * ( 1.0 + tcjbdsw * ( TTEMP - model->HSM2_ktnom )) ; - czbdswg = model->HSM2_cjswg * here->HSM2_weff_nf ; - czbdswg = czbdswg * ( 1.0 + tcjbdswg * ( TTEMP - model->HSM2_ktnom )) ; - if (vbd_jct == 0.0) { - Qbd = 0.0 ; - Capbd = czbd + czbdsw + czbdswg ; - } else if (vbd_jct < 0.0) { - if (czbd > 0.0) { - arg = 1.0 - vbd_jct / model->HSM2_pb ; - if (model->HSM2_mj == 0.5) - sarg = 1.0 / sqrt(arg) ; - else - sarg = Fn_Pow( arg , -model->HSM2_mj ) ; - Qbd = model->HSM2_pb * czbd * (1.0 - arg * sarg) / (1.0 - model->HSM2_mj) ; - Capbd = czbd * sarg ; - } else { - Qbd = 0.0 ; - Capbd = 0.0 ; - } - if (czbdsw > 0.0) { - arg = 1.0 - vbd_jct / model->HSM2_pbsw ; - if (model->HSM2_mjsw == 0.5) - sarg = 1.0 / sqrt(arg) ; - else - sarg = Fn_Pow( arg , -model->HSM2_mjsw ) ; - Qbd += model->HSM2_pbsw * czbdsw * (1.0 - arg * sarg) / (1.0 - model->HSM2_mjsw) ; - Capbd += czbdsw * sarg ; - } - if (czbdswg > 0.0) { - arg = 1.0 - vbd_jct / model->HSM2_pbswg ; - if (model->HSM2_mjswg == 0.5) - sarg = 1.0 / sqrt(arg) ; - else - sarg = Fn_Pow( arg , -model->HSM2_mjswg ) ; - Qbd += model->HSM2_pbswg * czbdswg * (1.0 - arg * sarg) / (1.0 - model->HSM2_mjswg) ; - Capbd += czbdswg * sarg ; - } - } else { - T1 = czbd + czbdsw + czbdswg ; - T2 = czbd * model->HSM2_mj / model->HSM2_pb - + czbdsw * model->HSM2_mjsw / model->HSM2_pbsw - + czbdswg * model->HSM2_mjswg / model->HSM2_pbswg ; - Qbd = vbd_jct * (T1 + vbd_jct * 0.5 * T2) ; - Capbd = T1 + vbd_jct * T2 ; - } - - } else { - czbdswg = model->HSM2_cjswg * here->HSM2_pd ; - czbdswg = czbdswg * ( 1.0 + tcjbdswg * ( TTEMP - model->HSM2_ktnom )) ; - if (vbd_jct == 0.0) { - Qbd = 0.0 ; - Capbd = czbd + czbdswg ; - } else if (vbd_jct < 0.0) { - if (czbd > 0.0) { - arg = 1.0 - vbd_jct / model->HSM2_pb ; - if (model->HSM2_mj == 0.5) - sarg = 1.0 / sqrt(arg) ; - else - sarg = Fn_Pow( arg , -model->HSM2_mj ) ; - Qbd = model->HSM2_pb * czbd * (1.0 - arg * sarg) / (1.0 - model->HSM2_mj) ; - Capbd = czbd * sarg ; - } else { - Qbd = 0.0 ; - Capbd = 0.0 ; - } - if (czbdswg > 0.0) { - arg = 1.0 - vbd_jct / model->HSM2_pbswg ; - if (model->HSM2_mjswg == 0.5) - sarg = 1.0 / sqrt(arg) ; - else - sarg = Fn_Pow( arg , -model->HSM2_mjswg ) ; - Qbd += model->HSM2_pbswg * czbdswg * (1.0 - arg * sarg) / (1.0 - model->HSM2_mjswg) ; - Capbd += czbdswg * sarg ; - } - } else { - T1 = czbd + czbdswg ; - T2 = czbd * model->HSM2_mj / model->HSM2_pb - + czbdswg * model->HSM2_mjswg / model->HSM2_pbswg ; - Qbd = vbd_jct * (T1 + vbd_jct * 0.5 * T2) ; - Capbd = T1 + vbd_jct * T2 ; - } - } - - /*-----------------------------------------------------------* - * End of PART-4. (label) - *-----------------*/ - -/* end_of_part_4:*/ - - - - /*-----------------------------------------------------------* - * PART-5: NQS. (label) - *-----------------*/ - if (flg_nqs) { - - if(ckt->CKTmode & MODETRAN){ - if( ckt->CKTmode & MODEINITTRAN ){ - Qi_nqs = Qi ; - Qi_dVgs_nqs = Qi_dVgs ; - Qi_dVds_nqs = Qi_dVds ; - Qi_dVbs_nqs = Qi_dVbs ; - - Qb_nqs = Qb ; - Qb_dVgs_nqs = Qb_dVgs ; - Qb_dVds_nqs = Qb_dVds ; - Qb_dVbs_nqs = Qb_dVbs ; - } else { - /* tau for inversion charge */ - if (flg_noqi == 0) { - T12 = model->HSM2_dly1; - T10 = model->HSM2_dly2; - - T3 = Lch ; - T1 = T10 * T12 * T3 * T3 ; - T2 = Mu * VgVt * T12 + T10 * T3 * T3 + small ; - tau = T1 / T2 ; - - T1_dVg = T10 * T12 * 2.0 * T3 * Lch_dVgs ; - T1_dVd = T10 * T12 * 2.0 * T3 * Lch_dVds ; - T1_dVb = T10 * T12 * 2.0 * T3 * Lch_dVbs ; - - T2_dVg = T12 * Mu_dVgs * VgVt - + T12 * Mu * VgVt_dVgs + T10 * 2.0 * T3 * Lch_dVgs ; - T2_dVd = T12 * Mu_dVds * VgVt - + T12 * Mu * VgVt_dVds + T10 * 2.0 * T3 * Lch_dVds ; - T2_dVb = T12 * Mu_dVbs * VgVt - + T12 * Mu * VgVt_dVbs + T10 * 2.0 * T3 * Lch_dVbs ; - - T4 = 1.0 / ( T2 * T2 ) ; - tau_dVgs = ( T2 * T1_dVg - T1 * T2_dVg ) * T4 ; - tau_dVds = ( T2 * T1_dVd - T1 * T2_dVd ) * T4 ; - tau_dVbs = ( T2 * T1_dVb - T1 * T2_dVb ) * T4 ; - } else { - tau = model->HSM2_dly1 + small ; - tau_dVgs = tau_dVds = tau_dVbs = 0.0 ; - } - - T1 = ckt->CKTdelta ; - - /* Calculation of Qi */ - Qi_prev = *(ckt->CKTstate1 + here->HSM2qi_nqs) ; - T2 = T1 + tau ; - T0 = Qi - Qi_prev ; - Qi_nqs = Qi_prev + T1 / T2 * T0; - T3 = T1 / T2 ; - T4 = T0 / T2 ; - Qi_dVgs_nqs = T3 * (Qi_dVgs - T4 * tau_dVgs); - Qi_dVds_nqs = T3 * (Qi_dVds - T4 * tau_dVds); - Qi_dVbs_nqs = T3 * (Qi_dVbs - T4 * tau_dVbs); - - /* tau for bulk charge */ - T2 = modelMKS->HSM2_dly3 ; - taub = T2 * Cox ; - taub_dVgs = T2 * Cox_dVg ; - taub_dVds = T2 * Cox_dVd ; - taub_dVbs = T2 * Cox_dVb ; - /* Calculation of Qb */ - Qb_prev = *(ckt->CKTstate1 + here->HSM2qb_nqs) ; - T2 = T1 + taub ; - T0 = Qb - Qb_prev ; - Qb_nqs = Qb_prev + T1 / T2 * T0 ; - T3 = T1 / T2 ; - T4 = T0 / T2 ; - Qb_dVgs_nqs = T3 * (Qb_dVgs - T4 * taub_dVgs) ; - Qb_dVds_nqs = T3 * (Qb_dVds - T4 * taub_dVds) ; - Qb_dVbs_nqs = T3 * (Qb_dVbs - T4 * taub_dVbs) ; - } - } else { /* !(CKT_mode & MODETRAN) */ - Qi_nqs = Qi ; - Qi_dVgs_nqs = Qi_dVgs ; - Qi_dVds_nqs = Qi_dVds ; - Qi_dVbs_nqs = Qi_dVbs ; - - Qb_nqs = Qb ; - Qb_dVgs_nqs = Qb_dVgs ; - Qb_dVds_nqs = Qb_dVds ; - Qb_dVbs_nqs = Qb_dVbs ; - } - } - - if ( flg_nqs && (ckt->CKTmode & (MODEDCOP | MODEINITSMSIG)) ) { /* ACNQS */ - - if (flg_noqi == 0) { - T10 = model->HSM2_dly1 ; - T11 = model->HSM2_dly2 ; - T12 = Lch ; - - T1 = T10 * T11 * T12 * T12 ; - T2 = Mu * VgVt * T10 + T11 * T12 * T12 + small ; - tau = T1 / T2 ; - - T1_dVg = T10 * T11 * 2.0 * T12 * Lch_dVgs ; - T1_dVd = T10 * T11 * 2.0 * T12 * Lch_dVds ; - T1_dVb = T10 * T11 * 2.0 * T12 * Lch_dVbs ; - T2_dVg = T10 * Mu_dVgs * VgVt + T10 * Mu * VgVt_dVgs - + T11 * 2.0 * T12 * Lch_dVgs ; - T2_dVd = T10 * Mu_dVds * VgVt + T10 * Mu * VgVt_dVds - + T11 * 2.0 * T12 * Lch_dVds ; - T2_dVb = T10 * Mu_dVbs * VgVt + T10 * Mu * VgVt_dVbs - + T11 * 2.0 * T12 * Lch_dVbs ; - - T3 = 1.0 / T2 ; - tau_dVgs = (T1_dVg - tau * T2_dVg) * T3 ; - tau_dVds = (T1_dVd - tau * T2_dVd) * T3 ; - tau_dVbs = (T1_dVb - tau * T2_dVb) * T3 ; - } else { - tau = model->HSM2_dly1 + small ; - tau_dVgs = tau_dVds = tau_dVbs = 0.0 ; - } - - T1 = modelMKS->HSM2_dly3 ; - taub = T1 * Cox ; - taub_dVgs = T1 * Cox_dVg ; - taub_dVds = T1 * Cox_dVd ; - taub_dVbs = T1 * Cox_dVb ; - } - - /*-----------------------------------------------------------* - * End of PART-5. (label) - *-----------------*/ -/* end_of_part_5: */ - - /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ - * PART-6: Noise Calculation. - *++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ - - /*-----------------------------------------------------------* - * 1/f noise. - *-----------------*/ - if ( model->HSM2_coflick != 0 && !flg_noqi ) { - - NFalp = pParam->HSM2_nfalp ; - NFtrp = pParam->HSM2_nftrp ; - Cit = modelMKS->HSM2_cit ; - - T1 = Qn0 / C_QE ; - T2 = ( Cox + Qn0 / ( Ps0 - Vbs ) + Cit ) * beta_inv / C_QE ; - T3 = -2.0E0 * Qi_noi / C_QE / Lch / here->HSM2_weff_nf - T1 ; - if ( T3 != T1 ) { - T4 = 1.0E0 / ( T1 + T2 ) / ( T3 + T2 ) + 2.0E0 * NFalp * Ey * Mu / ( T3 - T1 ) - * log( ( T3 + T2 ) / ( T1 + T2 ) ) + NFalp * Ey * Mu * NFalp * Ey * Mu ; - } else { - T4 = 1.0 / ( T1 + T2 ) / ( T3 + T2 ) + 2.0 * NFalp * Ey * Mu / ( T1 + T2 ) - + NFalp * Ey * Mu * NFalp * Ey * Mu; - } - Nflic = Ids * Ids * NFtrp / ( Lch * beta * here->HSM2_weff_nf ) * T4 ; - } else { - Nflic = 0.0 ; - } - - /*-----------------------------------------------------------* - * thermal noise. - *-----------------*/ - if ( model->HSM2_cothrml != 0 && !flg_noqi ) { - - Eyd = ( Psdl - Ps0 ) / Lch ; - T12 = Muun * Eyd / C_vmax ; - /* note: model->HSM2_bb = 2 (electron) ;1 (hole) */ - if ( 1.0e0 - epsm10 <= model->HSM2_bb && model->HSM2_bb <= 1.0e0 + epsm10 ) { - T7 = 1.0e0 ; - } else if ( 2.0e0 - epsm10 <= model->HSM2_bb && model->HSM2_bb <= 2.0e0 + epsm10 ) { - T7 = T12 ; - } else { - T7 = Fn_Pow( Eyd, model->HSM2_bb - 1.0e0 ) ; - } - T8 = T12 * T7 ; - T9 = 1.0e0 + T8 ; - T10 = Fn_Pow( T9, ( - 1.0e0 / model->HSM2_bb - 1.0e0 ) ) ; - T11 = T9 * T10 ; - Mud_hoso = Muun * T11 ; - Mu_Ave = ( Mu + Mud_hoso ) / 2.0 ; - - /* Sid_h = GAMMA * 4.0 * C_KB * model->HSM2_temp * gds0_h2; */ - T0 = Alpha * Alpha ; - Nthrml = here->HSM2_weff_nf * Cox * VgVt * Mu - * ( ( 1e0 + 3e0 * Alpha + 6e0 * T0 ) * Mud_hoso * Mud_hoso - + ( 3e0 + 4e0 * Alpha + 3e0 * T0 ) * Mud_hoso * Mu - + ( 6e0 + 3e0 * Alpha + T0 ) * Mu * Mu ) - / ( 15e0 * Lch * ( 1e0 + Alpha ) * Mu_Ave * Mu_Ave ) ; - } else { - Nthrml = 0e0 ; - } - - - /*----------------------------------------------------------* - * induced gate noise. ( Part 2/3 ) - *----------------------*/ - if ( model->HSM2_coign != 0 && model->HSM2_cothrml != 0 && flg_ign == 1 && !flg_noqi ) { - sqrtkusaiL = sqrt( kusaiL ) ; - T2 = VgVt + sqrtkusaiL ; - T3 = kusai00 * kusai00 ; - T4 = kusaiL * kusaiL ; - T5 = 42.0e0 * kusai00 * kusaiL ; - T5 += 4.0e0 * ( T3 + T4 ) ; - T5 += 20.0e0 * sqrtkusaiL * VgVt * ( kusai00 + kusaiL ) ; - T10 = T2 * T2 ; - T10 *= T10 ; - kusai_ig = T5 / ( T10 * T2 ) ; /* Induced Gate Noise parameter */ - gds0_ign = here->HSM2_weff_nf / Lch * Mu * Cox ; - gds0_h2 = gds0_ign * VgVt ; - GAMMA = Nthrml / gds0_h2 ; - T7 = kusai00 + 4.0e0 * VgVt * sqrtkusaiL + kusaiL ; - /* cross-correlation coefficient (= Sigid/sqrt(Sig*Sid) ) */ - crl_f = c_sqrt_15 * kusai00L * T7 - / ( 6.0e0 * T2 * sqrt( GAMMA * T2 * VgVt * T5 ) ) ; - } - - - /*-----------------------------------------------------------* - * End of PART-6. (label) - *-----------------*/ -/* end_of_part_6: */ - - - /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ - * PART-7: Evaluation of outputs. - *++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ - - /*-----------------------------------------------------------* - * Implicit quantities related to Alpha. - *-----------------*/ - /* note: T1 = 1 + Delta */ - if ( flg_noqi == 0 && VgVt > VgVt_small ) { - Delta = fac1 * beta / ( 2 * Xi0p12 ) ; - Pslsat = VgVt / ( 1.0 + Delta ) + Ps0 ; - } else { - Pslsat = 0.0 ; - } - Vdsat = Pslsat - Pb2 ; - if ( Vdsat < 0.0 ) { - Vdsat = 0.0 ; - } - - /*-----------------------------------------------------------* - * Evaluate the derivatives w.r.t. external biases. - * - All derivatives that influence outputs must be modified here. - *-----------------*/ - - /*---------------------------------------------------* - * Case ignoring Rs/Rd. - *-----------------*/ - if ( flg_rsrd != 1 || Ids < 0.0 ) { - Ids_dVbse = Ids_dVbs ; Ids_dVdse = Ids_dVds ; Ids_dVgse = Ids_dVgs ; - Qb_dVbse = Qb_dVbs ; Qb_dVdse = Qb_dVds ; Qb_dVgse = Qb_dVgs ; - Qi_dVbse = Qi_dVbs ; Qi_dVdse = Qi_dVds ; Qi_dVgse = Qi_dVgs ; - Qd_dVbse = Qd_dVbs ; Qd_dVdse = Qd_dVds ; Qd_dVgse = Qd_dVgs ; - Isub_dVbse = Isub_dVbs ; Isub_dVdse = Isub_dVds ; Isub_dVgse = Isub_dVgs ; - IdsIBPC_dVbse = IdsIBPC_dVbs ; IdsIBPC_dVdse = IdsIBPC_dVds ; IdsIBPC_dVgse = IdsIBPC_dVgs ; - Igate_dVbse = Igate_dVbs ; Igate_dVdse = Igate_dVds ; Igate_dVgse = Igate_dVgs ; - Igd_dVbse = Igd_dVbs ; Igd_dVdse = Igd_dVds ; Igd_dVgse = Igd_dVgs ; - Igs_dVbse = Igs_dVbs ; Igs_dVdse = Igs_dVds ; Igs_dVgse = Igs_dVgs ; - Igb_dVbse = Igb_dVbs ; Igb_dVdse = Igb_dVds ; Igb_dVgse = Igb_dVgs ; - Igidl_dVbse = Igidl_dVbs ; Igidl_dVdse = Igidl_dVds ; Igidl_dVgse = Igidl_dVgs ; - Igisl_dVbse = Igisl_dVbs ; Igisl_dVdse = Igisl_dVds ; Igisl_dVgse = Igisl_dVgs ; - Qgos_dVbse = Qgos_dVbs ; Qgos_dVdse = Qgos_dVds ; Qgos_dVgse = Qgos_dVgs ; - Qgod_dVbse = Qgod_dVbs ; Qgod_dVdse = Qgod_dVds ; Qgod_dVgse = Qgod_dVgs ; - Qgbo_dVbse = Qgbo_dVbs ; Qgbo_dVdse = Qgbo_dVds ; Qgbo_dVgse = Qgbo_dVgs ; - Qovd_dVbse = Qovd_dVbs ; Qovd_dVdse = Qovd_dVds ; Qovd_dVgse = Qovd_dVgs ; - QidLD_dVbse = QidLD_dVbs ; QidLD_dVdse = QidLD_dVds ; QidLD_dVgse = QidLD_dVgs ; - QbdLD_dVbse = QbdLD_dVbs ; QbdLD_dVdse = QbdLD_dVds ; QbdLD_dVgse = QbdLD_dVgs ; - Qovs_dVbse = Qovs_dVbs ; Qovs_dVdse = Qovs_dVds ; Qovs_dVgse = Qovs_dVgs ; - QisLD_dVbse = QisLD_dVbs ; QisLD_dVdse = QisLD_dVds ; QisLD_dVgse = QisLD_dVgs ; - QbsLD_dVbse = QbsLD_dVbs ; QbsLD_dVdse = QbsLD_dVds ; QbsLD_dVgse = QbsLD_dVgs ; - Qy_dVbse = Qy_dVbs ; Qy_dVdse = Qy_dVds ; Qy_dVgse = Qy_dVgs ; - Qdrat_dVbse = Qdrat_dVbs; Qdrat_dVdse = Qdrat_dVds; Qdrat_dVgse = Qdrat_dVgs; - GLPART1_dVbse = GLPART1_dVbs ;GLPART1_dVdse = GLPART1_dVds ;GLPART1_dVgse = GLPART1_dVgs ; - - if (flg_nqs) { /* NQS */ - Qi_dVgse_nqs = Qi_dVgs_nqs; Qi_dVdse_nqs = Qi_dVds_nqs; Qi_dVbse_nqs = Qi_dVbs_nqs; - Qb_dVgse_nqs = Qb_dVgs_nqs; Qb_dVdse_nqs = Qb_dVds_nqs; Qb_dVbse_nqs = Qb_dVbs_nqs; - } - if (flg_nqs && (ckt->CKTmode & (MODEDCOP | MODEINITSMSIG))) { /* ACNQS */ - tau_dVgse = tau_dVgs ; tau_dVdse = tau_dVds ; tau_dVbse = tau_dVbs ; - taub_dVgse = taub_dVgs ; taub_dVdse = taub_dVds ; taub_dVbse = taub_dVbs ; - } - - } else { - /*---------------------------------------------------* - * Case Rs>0 or Rd>0 - *-----------------*/ - - /*-------------------------------------------* - * Conductances w.r.t. confined biases. - *-----------------*/ - Ids_dVbse = Ids_dVbs * DJI ; - Ids_dVdse = Ids_dVds * DJI ; - Ids_dVgse = Ids_dVgs * DJI ; - - /*-------------------------------------------* - * Derivatives of internal biases w.r.t. external biases. - *-----------------*/ - Vbs_dVbse = ( 1.0 - Rs * Ids_dVbse ) ; - Vbs_dVdse = - Rs * Ids_dVdse ; - Vbs_dVgse = - Rs * Ids_dVgse ; - - Vds_dVbse = - ( Rs + Rd ) * Ids_dVbse ; - Vds_dVdse = ( 1.0 - ( Rs + Rd ) * Ids_dVdse ) ; - Vds_dVgse = - ( Rs + Rd ) * Ids_dVgse ; - - Vgs_dVbse = - Rs * Ids_dVbse ; - Vgs_dVdse = - Rs * Ids_dVdse ; - Vgs_dVgse = ( 1.0 - Rs * Ids_dVgse ) ; - - /*-------------------------------------------* - * Derivatives of charges. - *-----------------*/ - Qb_dVbse = Qb_dVbs * Vbs_dVbse + Qb_dVds * Vds_dVbse + Qb_dVgs * Vgs_dVbse ; - Qb_dVdse = Qb_dVbs * Vbs_dVdse + Qb_dVds * Vds_dVdse + Qb_dVgs * Vgs_dVdse ; - Qb_dVgse = Qb_dVbs * Vbs_dVgse + Qb_dVds * Vds_dVgse + Qb_dVgs * Vgs_dVgse ; - Qi_dVbse = Qi_dVbs * Vbs_dVbse + Qi_dVds * Vds_dVbse + Qi_dVgs * Vgs_dVbse ; - Qi_dVdse = Qi_dVbs * Vbs_dVdse + Qi_dVds * Vds_dVdse + Qi_dVgs * Vgs_dVdse ; - Qi_dVgse = Qi_dVbs * Vbs_dVgse + Qi_dVds * Vds_dVgse + Qi_dVgs * Vgs_dVgse ; - Qd_dVbse = Qd_dVbs * Vbs_dVbse + Qd_dVds * Vds_dVbse + Qd_dVgs * Vgs_dVbse ; - Qd_dVdse = Qd_dVbs * Vbs_dVdse + Qd_dVds * Vds_dVdse + Qd_dVgs * Vgs_dVdse ; - Qd_dVgse = Qd_dVbs * Vbs_dVgse + Qd_dVds * Vds_dVgse + Qd_dVgs * Vgs_dVgse ; - - /*-------------------------------------------* - * Substrate/gate/leak conductances. - *-----------------*/ - Isub_dVbse = Isub_dVbs * Vbs_dVbse + Isub_dVds * Vds_dVbse + Isub_dVgs * Vgs_dVbse ; - Isub_dVdse = Isub_dVbs * Vbs_dVdse + Isub_dVds * Vds_dVdse + Isub_dVgs * Vgs_dVdse ; - Isub_dVgse = Isub_dVbs * Vbs_dVgse + Isub_dVds * Vds_dVgse + Isub_dVgs * Vgs_dVgse ; - IdsIBPC_dVbse = IdsIBPC_dVbs * Vbs_dVbse + IdsIBPC_dVds * Vds_dVbse + IdsIBPC_dVgs * Vgs_dVbse ; - IdsIBPC_dVdse = IdsIBPC_dVbs * Vbs_dVdse + IdsIBPC_dVds * Vds_dVdse + IdsIBPC_dVgs * Vgs_dVdse ; - IdsIBPC_dVgse = IdsIBPC_dVbs * Vbs_dVgse + IdsIBPC_dVds * Vds_dVgse + IdsIBPC_dVgs * Vgs_dVgse ; - Igate_dVbse = Igate_dVbs * Vbs_dVbse + Igate_dVds * Vds_dVbse + Igate_dVgs * Vgs_dVbse ; - Igate_dVdse = Igate_dVbs * Vbs_dVdse + Igate_dVds * Vds_dVdse + Igate_dVgs * Vgs_dVdse ; - Igate_dVgse = Igate_dVbs * Vbs_dVgse + Igate_dVds * Vds_dVgse + Igate_dVgs * Vgs_dVgse ; - Igb_dVbse = Igb_dVbs * Vbs_dVbse + Igb_dVds * Vds_dVbse + Igb_dVgs * Vgs_dVbse ; - Igb_dVdse = Igb_dVbs * Vbs_dVdse + Igb_dVds * Vds_dVdse + Igb_dVgs * Vgs_dVdse ; - Igb_dVgse = Igb_dVbs * Vbs_dVgse + Igb_dVds * Vds_dVgse + Igb_dVgs * Vgs_dVgse ; - Igd_dVbse = Igd_dVbs * Vbs_dVbse + Igd_dVds * Vds_dVbse + Igd_dVgs * Vgs_dVbse ; - Igd_dVdse = Igd_dVbs * Vbs_dVdse + Igd_dVds * Vds_dVdse + Igd_dVgs * Vgs_dVdse ; - Igd_dVgse = Igd_dVbs * Vbs_dVgse + Igd_dVds * Vds_dVgse + Igd_dVgs * Vgs_dVgse ; - Igs_dVbse = Igs_dVbs * Vbs_dVbse + Igs_dVds * Vds_dVbse + Igs_dVgs * Vgs_dVbse ; - Igs_dVdse = Igs_dVbs * Vbs_dVdse + Igs_dVds * Vds_dVdse + Igs_dVgs * Vgs_dVdse ; - Igs_dVgse = Igs_dVbs * Vbs_dVgse + Igs_dVds * Vds_dVgse + Igs_dVgs * Vgs_dVgse ; - Igidl_dVbse = Igidl_dVbs * Vbs_dVbse + Igidl_dVds * Vds_dVbse + Igidl_dVgs * Vgs_dVbse ; - Igidl_dVdse = Igidl_dVbs * Vbs_dVdse + Igidl_dVds * Vds_dVdse + Igidl_dVgs * Vgs_dVdse ; - Igidl_dVgse = Igidl_dVbs * Vbs_dVgse + Igidl_dVds * Vds_dVgse + Igidl_dVgs * Vgs_dVgse ; - Igisl_dVbse = Igisl_dVbs * Vbs_dVbse + Igisl_dVds * Vds_dVbse + Igisl_dVgs * Vgs_dVbse ; - Igisl_dVdse = Igisl_dVbs * Vbs_dVdse + Igisl_dVds * Vds_dVdse + Igisl_dVgs * Vgs_dVdse ; - Igisl_dVgse = Igisl_dVbs * Vbs_dVgse + Igisl_dVds * Vds_dVgse + Igisl_dVgs * Vgs_dVgse ; - - GLPART1_dVbse = GLPART1_dVbs * Vbs_dVbse + GLPART1_dVds * Vds_dVbse + GLPART1_dVgs * Vgs_dVbse ; - GLPART1_dVdse = GLPART1_dVbs * Vbs_dVdse + GLPART1_dVds * Vds_dVdse + GLPART1_dVgs * Vgs_dVdse ; - GLPART1_dVgse = GLPART1_dVbs * Vbs_dVgse + GLPART1_dVds * Vds_dVgse + GLPART1_dVgs * Vgs_dVgse ; - - /*---------------------------------------------------* - * Derivatives of overlap charges. - *-----------------*/ - Qgos_dVbse = Qgos_dVbs * Vbs_dVbse + Qgos_dVds * Vds_dVbse + Qgos_dVgs * Vgs_dVbse ; - Qgos_dVdse = Qgos_dVbs * Vbs_dVdse + Qgos_dVds * Vds_dVdse + Qgos_dVgs * Vgs_dVdse ; - Qgos_dVgse = Qgos_dVbs * Vbs_dVgse + Qgos_dVds * Vds_dVgse + Qgos_dVgs * Vgs_dVgse ; - Qgod_dVbse = Qgod_dVbs * Vbs_dVbse + Qgod_dVds * Vds_dVbse + Qgod_dVgs * Vgs_dVbse ; - Qgod_dVdse = Qgod_dVbs * Vbs_dVdse + Qgod_dVds * Vds_dVdse + Qgod_dVgs * Vgs_dVdse ; - Qgod_dVgse = Qgod_dVbs * Vbs_dVgse + Qgod_dVds * Vds_dVgse + Qgod_dVgs * Vgs_dVgse ; - Qgbo_dVbse = Qgbo_dVbs * Vbs_dVbse + Qgbo_dVds * Vds_dVbse + Qgbo_dVgs * Vgs_dVbse ; - Qgbo_dVdse = Qgbo_dVbs * Vbs_dVdse + Qgbo_dVds * Vds_dVdse + Qgbo_dVgs * Vgs_dVdse ; - Qgbo_dVgse = Qgbo_dVbs * Vbs_dVgse + Qgbo_dVds * Vds_dVgse + Qgbo_dVgs * Vgs_dVgse ; - Qovd_dVbse = Qovd_dVbs * Vbs_dVbse + Qovd_dVds * Vds_dVbse + Qovd_dVgs * Vgs_dVbse ; - Qovd_dVdse = Qovd_dVbs * Vbs_dVdse + Qovd_dVds * Vds_dVdse + Qovd_dVgs * Vgs_dVdse ; - Qovd_dVgse = Qovd_dVbs * Vbs_dVgse + Qovd_dVds * Vds_dVgse + Qovd_dVgs * Vgs_dVgse ; - QidLD_dVbse = QidLD_dVbs * Vbs_dVbse + QidLD_dVds * Vds_dVbse + QidLD_dVgs * Vgs_dVbse ; - QidLD_dVdse = QidLD_dVbs * Vbs_dVdse + QidLD_dVds * Vds_dVdse + QidLD_dVgs * Vgs_dVdse ; - QidLD_dVgse = QidLD_dVbs * Vbs_dVgse + QidLD_dVds * Vds_dVgse + QidLD_dVgs * Vgs_dVgse ; - QbdLD_dVbse = QbdLD_dVbs * Vbs_dVbse + QbdLD_dVds * Vds_dVbse + QbdLD_dVgs * Vgs_dVbse ; - QbdLD_dVdse = QbdLD_dVbs * Vbs_dVdse + QbdLD_dVds * Vds_dVdse + QbdLD_dVgs * Vgs_dVdse ; - QbdLD_dVgse = QbdLD_dVbs * Vbs_dVgse + QbdLD_dVds * Vds_dVgse + QbdLD_dVgs * Vgs_dVgse ; - Qovs_dVbse = Qovs_dVbs * Vbs_dVbse + Qovs_dVds * Vds_dVbse + Qovs_dVgs * Vgs_dVbse ; - Qovs_dVdse = Qovs_dVbs * Vbs_dVdse + Qovs_dVds * Vds_dVdse + Qovs_dVgs * Vgs_dVdse ; - Qovs_dVgse = Qovs_dVbs * Vbs_dVgse + Qovs_dVds * Vds_dVgse + Qovs_dVgs * Vgs_dVgse ; - QisLD_dVbse = QisLD_dVbs * Vbs_dVbse + QisLD_dVds * Vds_dVbse + QisLD_dVgs * Vgs_dVbse ; - QisLD_dVdse = QisLD_dVbs * Vbs_dVdse + QisLD_dVds * Vds_dVdse + QisLD_dVgs * Vgs_dVdse ; - QisLD_dVgse = QisLD_dVbs * Vbs_dVgse + QisLD_dVds * Vds_dVgse + QisLD_dVgs * Vgs_dVgse ; - QbsLD_dVbse = QbsLD_dVbs * Vbs_dVbse + QbsLD_dVds * Vds_dVbse + QbsLD_dVgs * Vgs_dVbse ; - QbsLD_dVdse = QbsLD_dVbs * Vbs_dVdse + QbsLD_dVds * Vds_dVdse + QbsLD_dVgs * Vgs_dVdse ; - QbsLD_dVgse = QbsLD_dVbs * Vbs_dVgse + QbsLD_dVds * Vds_dVgse + QbsLD_dVgs * Vgs_dVgse ; - Qy_dVbse = Qy_dVbs * Vbs_dVbse + Qy_dVds * Vds_dVbse + Qy_dVgs * Vgs_dVbse ; - Qy_dVdse = Qy_dVbs * Vbs_dVdse + Qy_dVds * Vds_dVdse + Qy_dVgs * Vgs_dVdse ; - Qy_dVgse = Qy_dVbs * Vbs_dVgse + Qy_dVds * Vds_dVgse + Qy_dVgs * Vgs_dVgse ; - Qdrat_dVbse = Qdrat_dVbs * Vbs_dVbse + Qdrat_dVds * Vds_dVbse + Qdrat_dVgs * Vgs_dVbse ; - Qdrat_dVdse = Qdrat_dVbs * Vbs_dVdse + Qdrat_dVds * Vds_dVdse + Qdrat_dVgs * Vgs_dVdse ; - Qdrat_dVgse = Qdrat_dVbs * Vbs_dVgse + Qdrat_dVds * Vds_dVgse + Qdrat_dVgs * Vgs_dVgse ; - - if (flg_nqs) { /* NQS */ - Qi_dVgse_nqs = Qi_dVgs_nqs * Vgs_dVgse + Qi_dVds_nqs * Vds_dVgse + Qi_dVbs_nqs * Vbs_dVgse; - Qi_dVdse_nqs = Qi_dVgs_nqs * Vgs_dVdse + Qi_dVds_nqs * Vds_dVdse + Qi_dVbs_nqs * Vbs_dVdse; - Qi_dVbse_nqs = Qi_dVgs_nqs * Vgs_dVbse + Qi_dVds_nqs * Vds_dVbse + Qi_dVbs_nqs * Vbs_dVbse; - Qb_dVgse_nqs = Qb_dVgs_nqs * Vgs_dVgse + Qb_dVds_nqs * Vds_dVgse + Qb_dVbs_nqs * Vbs_dVgse; - Qb_dVdse_nqs = Qb_dVgs_nqs * Vgs_dVdse + Qb_dVds_nqs * Vds_dVdse + Qb_dVbs_nqs * Vbs_dVdse; - Qb_dVbse_nqs = Qb_dVgs_nqs * Vgs_dVbse + Qb_dVds_nqs * Vds_dVbse + Qb_dVbs_nqs * Vbs_dVbse; - } - if (flg_nqs && (ckt->CKTmode & (MODEDCOP | MODEINITSMSIG))) { /* ACNQS */ - tau_dVgse = tau_dVgs * Vgs_dVgse + tau_dVds * Vds_dVgse + tau_dVbs * Vbs_dVgse; - tau_dVdse = tau_dVgs * Vgs_dVdse + tau_dVds * Vds_dVdse + tau_dVbs * Vbs_dVdse; - tau_dVbse = tau_dVgs * Vgs_dVbse + tau_dVds * Vds_dVbse + tau_dVbs * Vbs_dVbse; - taub_dVgse = taub_dVgs * Vgs_dVgse + taub_dVds * Vds_dVgse + taub_dVbs * Vbs_dVgse; - taub_dVdse = taub_dVgs * Vgs_dVdse + taub_dVds * Vds_dVdse + taub_dVbs * Vbs_dVdse; - taub_dVbse = taub_dVgs * Vgs_dVbse + taub_dVds * Vds_dVbse + taub_dVbs * Vbs_dVbse; - } - } /* end of if ( flg_rsrd == 0 ) blocks */ - - /*-------------------------------------------* - * Add IdsIBPC to Ids. - *-----------------*/ - Ids += IdsIBPC ; - Ids_dVbse += IdsIBPC_dVbse ; - Ids_dVdse += IdsIBPC_dVdse ; - Ids_dVgse += IdsIBPC_dVgse ; - - /*---------------------------------------------------* - * Derivatives of junction diode currents and charges. - * - NOTE: These quantities are regarded as functions of - * external biases. - * - NOTE: node-base S/D - *-----------------*/ - Gbse = Gbs ; - Gbde = Gbd ; - Capbse = Capbs ; - Capbde = Capbd ; - - /*---------------------------------------------------* - * Extrapolate quantities if external biases are out of bounds. - *-----------------*/ - if ( flg_vbsc == 1 ) { - Ids_dVbse *= Vbsc_dVbse ; - Qb_dVbse *= Vbsc_dVbse ; - Qi_dVbse *= Vbsc_dVbse ; - Qd_dVbse *= Vbsc_dVbse ; - Isub_dVbse *= Vbsc_dVbse ; - Igate_dVbse *= Vbsc_dVbse ; - Igs_dVbse *= Vbsc_dVbse ; - Igd_dVbse *= Vbsc_dVbse ; - Igb_dVbse *= Vbsc_dVbse ; - Igidl_dVbse *= Vbsc_dVbse ; - Igisl_dVbse *= Vbsc_dVbse ; - Qgos_dVbse *= Vbsc_dVbse ; - Qgod_dVbse *= Vbsc_dVbse ; - Qgbo_dVbse *= Vbsc_dVbse ; - Qy_dVbse *= Vbsc_dVbse ; - if (flg_nqs) { - Qi_dVbse_nqs *= Vbsc_dVbse ; - Qb_dVbse_nqs *= Vbsc_dVbse ; - } - if (flg_nqs && (ckt->CKTmode & (MODEDCOP | MODEINITSMSIG))) { /* ACNQS */ - tau_dVbse *= Vbsc_dVbse ; - taub_dVbse *= Vbsc_dVbse ; - } - } else if ( flg_vbsc == -1 ) { - T1 = Vbse - Vbsc ; - - TX = Ids + T1 * Ids_dVbse ; - if ( TX * Ids >= 0.0 ) { - Ids = TX ; - } else { - Ids_dVbse = 0.0 ; - Ids_dVdse = 0.0 ; - Ids_dVgse = 0.0 ; - Ids = 0.0 ; - } - - TX = Qb + T1 * Qb_dVbse ; - /*note: The sign of Qb can be changed.*/ - Qb = TX ; - - TX = Qd + T1 * Qd_dVbse ; - if ( TX * Qd >= 0.0 ) { - Qd = TX ; - } else { - Qd_dVbse = 0.0 ; - Qd_dVdse = 0.0 ; - Qd_dVgse = 0.0 ; - Qd = 0.0 ; - } - - TX = Qi + T1 * Qi_dVbse ; - if ( TX * Qi >= 0.0 ) { - Qi = TX ; - } else { - Qi_dVbse = 0.0 ; - Qi_dVdse = 0.0 ; - Qi_dVgse = 0.0 ; - Qi = 0.0 ; - } - - TX = Isub + T1 * Isub_dVbse ; - if ( TX * Isub >= 0.0 ) { - Isub = TX ; - } else { - Isub_dVbse = 0.0 ; - Isub_dVdse = 0.0 ; - Isub_dVgse = 0.0 ; - Isub = 0.0 ; - } - - TX = Igate + T1 * Igate_dVbse ; - if ( TX * Igate >= 0.0 ) { - Igate = TX ; - } else { - Igate_dVbse = 0.0 ; - Igate_dVdse = 0.0 ; - Igate_dVgse = 0.0 ; - Igate = 0.0 ; - } - - TX = Igs + T1 * Igs_dVbse ; - if ( TX * Igs >= 0.0 ) { - Igs = TX ; - } else { - Igs_dVbse = 0.0 ; - Igs_dVdse = 0.0 ; - Igs_dVgse = 0.0 ; - Igs = 0.0 ; - } - - TX = Igd + T1 * Igd_dVbse ; - if ( TX * Igd >= 0.0 ) { - Igd = TX ; - } else { - Igd_dVbse = 0.0 ; - Igd_dVdse = 0.0 ; - Igd_dVgse = 0.0 ; - Igd = 0.0 ; - } - - TX = Igb + T1 * Igb_dVbse ; - if ( TX * Igb >= 0.0 ) { - Igb = TX ; - } else { - Igb_dVbse = 0.0 ; - Igb_dVdse = 0.0 ; - Igb_dVgse = 0.0 ; - Igb = 0.0 ; - } - - TX = Igidl + T1 * Igidl_dVbse ; - if ( TX * Igidl >= 0.0 ) { - Igidl = TX ; - } else { - Igidl_dVbse = 0.0 ; - Igidl_dVdse = 0.0 ; - Igidl_dVgse = 0.0 ; - Igidl = 0.0 ; - } - - TX = Igisl + T1 * Igisl_dVbse ; - if ( TX * Igisl >= 0.0 ) { - Igisl = TX ; - } else { - Igisl_dVbse = 0.0 ; - Igisl_dVdse = 0.0 ; - Igisl_dVgse = 0.0 ; - Igisl = 0.0 ; - } - - TX = GLPART1 + T1 * GLPART1_dVbse ; - if ( TX * GLPART1 >= 0.0 ) { - GLPART1 = TX ; - } else{ - GLPART1_dVbse = 0.0 ; - GLPART1_dVdse = 0.0 ; - GLPART1_dVgse = 0.0 ; - GLPART1 = 0.0 ; - } - - TX = Qgod + T1 * Qgod_dVbse ; - if ( TX * Qgod >= 0.0 ) { - Qgod = TX ; - } else { - Qgod_dVbse = 0.0 ; - Qgod_dVdse = 0.0 ; - Qgod_dVgse = 0.0 ; - Qgod = 0.0 ; - } - - TX = Qgos + T1 * Qgos_dVbse ; - if ( TX * Qgos >= 0.0 ) { - Qgos = TX ; - } else { - Qgos_dVbse = 0.0 ; - Qgos_dVdse = 0.0 ; - Qgos_dVgse = 0.0 ; - Qgos = 0.0 ; - } - - TX = Qgbo + T1 * Qgbo_dVbse ; - if ( TX * Qgbo >= 0.0 ) { - Qgbo = TX ; - } else { - Qgbo_dVbse = 0.0 ; - Qgbo_dVdse = 0.0 ; - Qgbo_dVgse = 0.0 ; - Qgbo = 0.0 ; - } - - TX = Qy + T1 * Qy_dVbse ; - if ( TX * Qy >= 0.0 ) { - Qy = TX ; - } else { - Qy_dVbse = 0.0 ; - Qy_dVdse = 0.0 ; - Qy_dVgse = 0.0 ; - Qy = 0.0 ; - } - - TX = Qdrat + T1 * Qdrat_dVbse ; - if ( TX * Qdrat >= 0.0 ) { - Qdrat = TX ; - } else{ - Qdrat_dVbse = 0.0 ; - Qdrat_dVdse = 0.0 ; - Qdrat_dVgse = 0.0 ; - Qdrat = 0.0 ; - } - - TX = Qovd + T1 * Qovd_dVbse ; - if ( TX * Qovd >= 0.0 ) { - Qovd = TX ; - } else{ - Qovd_dVbse = 0.0 ; - Qovd_dVdse = 0.0 ; - Qovd_dVgse = 0.0 ; - Qovd = 0.0 ; - } - - TX = QidLD + T1 * QidLD_dVbse ; - if ( TX * QidLD >= 0.0 ) { - QidLD = TX ; - } else{ - QidLD_dVbse = 0.0 ; - QidLD_dVdse = 0.0 ; - QidLD_dVgse = 0.0 ; - QidLD = 0.0 ; - } - - TX = QbdLD + T1 * QbdLD_dVbse ; - if ( TX * QbdLD >= 0.0 ) { - QbdLD = TX ; - } else{ - QbdLD_dVbse = 0.0 ; - QbdLD_dVdse = 0.0 ; - QbdLD_dVgse = 0.0 ; - QbdLD = 0.0 ; - } - - TX = Qovs + T1 * Qovs_dVbse ; - if ( TX * Qovs >= 0.0 ) { - Qovs = TX ; - } else{ - T7 = Qovs / ( Qovs - TX ) ; - Qovs_dVbse *= T7 ; - Qovs_dVdse *= T7 ; - Qovs_dVgse *= T7 ; - Qovs = 0.0 ; - } - - TX = QisLD + T1 * QisLD_dVbse ; - if ( TX * QisLD >= 0.0 ) { - QisLD = TX ; - } else{ - QisLD_dVbse = 0.0 ; - QisLD_dVdse = 0.0 ; - QisLD_dVgse = 0.0 ; - QisLD = 0.0 ; - } - - TX = QbsLD + T1 * QbsLD_dVbse ; - if ( TX * QbsLD >= 0.0 ) { - QbsLD = TX ; - } else{ - QbsLD_dVbse = 0.0 ; - QbsLD_dVdse = 0.0 ; - QbsLD_dVgse = 0.0 ; - QbsLD = 0.0 ; - } - - if (flg_nqs) { /* for NQS charge */ - TX = Qi_nqs + T1 * Qi_dVbse_nqs ; - if ( TX * Qi_nqs >= 0.0 ) { - Qi_nqs = TX ; - } else { - Qi_dVbse_nqs = 0.0 ; - Qi_dVdse_nqs = 0.0 ; - Qi_dVgse_nqs = 0.0 ; - Qi_nqs = 0.0 ; - } - - TX = Qb_nqs + T1 * Qb_dVbse_nqs ; - Qb_nqs = TX ; - } - - if (flg_nqs && (ckt->CKTmode & (MODEDCOP | MODEINITSMSIG))) { /* ACNQS */ - TX = tau + T1 * tau_dVbse ; - if ( TX * tau >= 0.0 ) { - tau = TX ; - } else { - tau_dVbse = 0.0 ; - tau_dVdse = 0.0 ; - tau_dVgse = 0.0 ; - tau = 0.0 ; - } - - TX = taub + T1 * taub_dVbse ; - if ( TX * taub >= 0.0 ) { - taub = TX ; - } else { - taub_dVbse = 0.0 ; - taub_dVdse = 0.0 ; - taub_dVgse = 0.0 ; - taub = 0.0 ; - } - } - } - - /*-----------------------------------------------------------* - * Warn negative conductance. - * - T1 ( = d Ids / d Vds ) is the derivative w.r.t. circuit bias. - *-----------------*/ - if ( here->HSM2_mode == HiSIM_NORMAL_MODE ) { - T1 = Ids_dVdse ; - } else { - T1 = Ids_dVbse + Ids_dVdse + Ids_dVgse ; /* Ids_dVss * -1 */ - } - - if ( flg_info >= 1 && - (Ids_dVbse < 0.0 || T1 < 0.0 || Ids_dVgse < 0.0) ) { - printf( "*** warning(HiSIM): Negative Conductance\n" ) ; - printf( " type = %d mode = %d\n" , model->HSM2_type , here->HSM2_mode ) ; - printf( " Vbse = %12.5e Vdse = %12.5e Vgse = %12.5e\n" , - Vbse , Vdse , Vgse ) ; - printf( " Ids_dVbse = %12.5e\n" , Ids_dVbse ) ; - printf( " Ids_dVdse = %12.5e\n" , T1 ) ; - printf( " Ids_dVgse = %12.5e\n" , Ids_dVgse ) ; - } - - /*-----------------------------------------------------------* - * Redefine overlap charges/capacitances. - *-----------------*/ - /*---------------------------------------------------* - * Overlap capacitance. - *-----------------*/ - Cggo = Qgos_dVgse + Qgod_dVgse + Qgbo_dVgse ; - Cgdo = Qgos_dVdse + Qgod_dVdse ; - Cgso = - (Qgos_dVbse + Qgod_dVbse + Qgos_dVdse + Qgod_dVdse - + Qgos_dVgse + Qgod_dVgse) ; - Cgbo = Qgos_dVbse + Qgod_dVbse + Qgbo_dVbse ; - - /*---------------------------------------------------* - * Add fringing charge/capacitance to overlap. - *-----------------*/ - Qgod += Qfd ; - Qgos += Qfs ; - - Cggo += 2.0 * Cf ; - Cgdo += - Cf ; - Cgso += - Cf ; - /*-----------------------------------------------------------* - * Assign outputs. - *-----------------*/ - - /*---------------------------------------------------* - * Multiplication factor of a MOSFET instance. - *-----------------*/ - M = here->HSM2_m ; - - /*---------------------------------------------------* - * Channel current and conductances. - *-----------------*/ - here->HSM2_ids = M * Ids ; - here->HSM2_gmbs = M * Ids_dVbse ; - here->HSM2_gds = M * Ids_dVdse ; - here->HSM2_gm = M * Ids_dVgse ; - - /*---------------------------------------------------* - * Overlap capacitances. - *-----------------*/ - /* Q_dVsx */ - T2 = - ( Qovd_dVbse + Qovd_dVdse + Qovd_dVgse ) ; - T6 = - ( Qovs_dVbse + Qovs_dVdse + Qovs_dVgse ) ; - T5 = - ( QbdLD_dVbse + QbdLD_dVdse + QbdLD_dVgse ) ; - T7 = - ( QbsLD_dVbse + QbsLD_dVdse + QbsLD_dVgse ) ; - - here->HSM2_cgdo = M * ( Cgdo - Qovd_dVdse - Qovs_dVdse ) ; - here->HSM2_cgso = M * ( Cgso - T2 - T6 ) ; - here->HSM2_cgbo = M * ( Cgbo - Qovd_dVbse - Qovs_dVbse ) ; - - here->HSM2_cdgo = M * ( - Qgod_dVgse - Cf + QbdLD_dVgse ) ; - here->HSM2_cddo = M * ( - Qgod_dVdse + Cf + QbdLD_dVdse ) ; - here->HSM2_cdso = M * ( Qgod_dVbse + Qgod_dVdse + Qgod_dVgse + T5 ) ; - - here->HSM2_csgo = M * ( - Qgos_dVgse - Cf + QbsLD_dVgse ) ; - here->HSM2_csdo = M * ( - Qgos_dVdse + QbsLD_dVdse ) ; - here->HSM2_csso = M * ( Qgos_dVbse + Qgos_dVdse + Qgos_dVgse + Cf + T7 ) ; - - /*---------------------------------------------------* - * Lateral-field-induced capacitance. - *-----------------*/ - T0 = model->HSM2_qyrat ; - T1 = 1.0 - T0 ; - Qys = Qy * T1 ; - Qys_dVdse = Qy_dVdse * T1 ; - Qys_dVgse = Qy_dVgse * T1 ; - Qys_dVbse = Qy_dVbse * T1 ; - Qy = Qy * T0 ; - Qy_dVdse = Qy_dVdse * T0 ; - Qy_dVgse = Qy_dVgse * T0 ; - Qy_dVbse = Qy_dVbse * T0 ; - - Cqyd = Qy_dVdse ; - Cqyg = Qy_dVgse ; - Cqyb = Qy_dVbse ; - Cqys = - ( Cqyb + Cqyd + Cqyg ) ; - here->HSM2_cqyd = M * Cqyd ; - here->HSM2_cqyg = M * Cqyg ; - here->HSM2_cqyb = M * Cqyb ; - - /* -------------------------------------* - * Intrinsic charges / capacitances. - *-----------------*/ - if ( flg_nqs && ((ckt->CKTmode & MODETRAN) || - (ckt->CKTmode & MODEINITFIX)) ) { /* NQS (tran. analysis) */ - - *(ckt->CKTstate0 + here->HSM2qi_nqs) = Qi_nqs ; - *(ckt->CKTstate0 + here->HSM2qb_nqs) = Qb_nqs ; - - here->HSM2_qg = M * - (Qb_nqs + Qi_nqs) ; - here->HSM2_qd = M * Qi_nqs * Qdrat ; - here->HSM2_qs = M * Qi_nqs * (1.0 - Qdrat) ; - - here->HSM2_cbgb = M * Qb_dVgse_nqs ; - here->HSM2_cbdb = M * Qb_dVdse_nqs ; - here->HSM2_cbsb = M * - (Qb_dVbse_nqs + Qb_dVdse_nqs + Qb_dVgse_nqs) ; - - here->HSM2_cggb = M * ( - Qb_dVgse_nqs - Qi_dVgse_nqs ) ; - here->HSM2_cgdb = M * ( - Qb_dVdse_nqs - Qi_dVdse_nqs ) ; - here->HSM2_cgsb = M * ( Qb_dVbse_nqs + Qb_dVdse_nqs + Qb_dVgse_nqs - + Qi_dVbse_nqs + Qi_dVdse_nqs + Qi_dVgse_nqs ) ; - - qd_dVgse = Qi_dVgse_nqs * Qdrat + Qdrat_dVgse * Qi_nqs ; - qd_dVdse = Qi_dVdse_nqs * Qdrat + Qdrat_dVdse * Qi_nqs ; - qd_dVbse = Qi_dVbse_nqs * Qdrat + Qdrat_dVbse * Qi_nqs ; - qd_dVsse = - ( qd_dVgse + qd_dVdse + qd_dVbse ) ; - here->HSM2_cdgb = M * qd_dVgse ; - here->HSM2_cddb = M * qd_dVdse ; - here->HSM2_cdsb = M * qd_dVsse ; - } else { /* QS or NQS (ac dc analysis) */ - - here->HSM2_qg = M * - (Qb + Qi) ; - here->HSM2_qd = M * Qd ; - here->HSM2_qs = M * ( Qi - Qd ) ; - - here->HSM2_cbgb = M * Qb_dVgse ; - here->HSM2_cbdb = M * Qb_dVdse ; - here->HSM2_cbsb = M * - (Qb_dVbse + Qb_dVdse + Qb_dVgse) ; - - here->HSM2_cggb = M * ( - Qb_dVgse - Qi_dVgse ) ; - here->HSM2_cgdb = M * ( - Qb_dVdse - Qi_dVdse ) ; - here->HSM2_cgsb = M * ( Qb_dVbse + Qb_dVdse + Qb_dVgse - + Qi_dVbse + Qi_dVdse + Qi_dVgse ) ; - - here->HSM2_cdgb = M * Qd_dVgse ; - here->HSM2_cddb = M * Qd_dVdse ; - here->HSM2_cdsb = M * - (Qd_dVgse + Qd_dVdse + Qd_dVbse) ; - } - - - /*---------------------------------------------------* - * Add lateral-field-induced charges/capacitances to intrinsic ones. - * - NOTE: This function depends on coqy, a control option. - *-----------------*/ - if ( model->HSM2_coqy == 1 ) { - here->HSM2_qg += M * ( Qy + Qys ) ; - here->HSM2_qd += M * ( - Qy ) ; - here->HSM2_qs += M * ( - Qys ) ; - - T8 = - ( Qys_dVbse + Qys_dVdse + Qys_dVgse ) ; - here->HSM2_cggb += M * ( Cqyg + Qys_dVgse ) ; - here->HSM2_cgdb += M * ( Cqyd + Qys_dVdse ) ; - here->HSM2_cgsb += M * ( Cqys + T8 ) ; - - here->HSM2_cdgb += M * ( - Cqyg ) ; - here->HSM2_cddb += M * ( - Cqyd ) ; - here->HSM2_cdsb += M * ( - Cqys ) ; - } - - /*---------------------------------------------------* - * Add S/D overlap charges/capacitances to intrinsic ones. - * - NOTE: This function depends on coadov, a control option. - *-----------------*/ - if ( model->HSM2_coadov == 1 ) { - /* Q_dVsb */ - T0 = - ( Qgbo_dVbse + Qgbo_dVdse + Qgbo_dVgse ) ; - T1 = - ( Qovd_dVbse + Qovd_dVdse + Qovd_dVgse ) ; - T3 = - ( Qovs_dVbse + Qovs_dVdse + Qovs_dVgse ) ; - T4 = - ( QidLD_dVbse + QidLD_dVdse + QidLD_dVgse + QisLD_dVbse + QisLD_dVdse + QisLD_dVgse ) ; - T5 = - ( QbdLD_dVbse + QbdLD_dVdse + QbdLD_dVgse ) ; - T7 = - ( Qgod_dVbse + Qgod_dVdse + Qgod_dVgse ) ; - - here->HSM2_qg += M * ( Qgod + Qgos + Qgbo - Qovd - Qovs ) ; - here->HSM2_qd += M * ( - Qgod + QbdLD ) ; - here->HSM2_qs += M * ( - Qgos + QbsLD ) ; - - here->HSM2_cbgb += M * ( - Qgbo_dVgse + QidLD_dVgse + QisLD_dVgse ) ; - here->HSM2_cbdb += M * ( - Qgbo_dVdse + QidLD_dVdse + QisLD_dVdse ) ; - here->HSM2_cbsb += M * ( - T0 + T4 ) ; - - here->HSM2_cggb += M * ( Cggo - Qovd_dVgse - Qovs_dVgse ) ; - here->HSM2_cgdb += M * ( Cgdo - Qovd_dVdse - Qovs_dVdse ) ; - here->HSM2_cgsb += M * ( Cgso - T1 - T3 ) ; - - here->HSM2_cdgb += M * ( - Qgod_dVgse - Cf + QbdLD_dVgse ) ; - here->HSM2_cddb += M * ( - Qgod_dVdse + Cf + QbdLD_dVdse ) ; - here->HSM2_cdsb += M * ( - T7 + T5 ) ; - } - - - - /*---------------------------------------------------* - * tau (channel/bulk charge) for ACNQS. - *-----------------*/ - if (flg_nqs && (ckt->CKTmode & (MODEDCOP | MODEINITSMSIG))) { - here->HSM2_tau = tau ; - here->HSM2_tau_dVgs = tau_dVgse ; - here->HSM2_tau_dVds = tau_dVdse ; - here->HSM2_tau_dVbs = tau_dVbse ; - - here->HSM2_taub = taub ; - here->HSM2_taub_dVgs = taub_dVgse ; - here->HSM2_taub_dVds = taub_dVdse ; - here->HSM2_taub_dVbs = taub_dVbse ; - - here->HSM2_Xd = Qdrat; - here->HSM2_Xd_dVgs = Qdrat_dVgse ; - here->HSM2_Xd_dVds = Qdrat_dVdse ; - here->HSM2_Xd_dVbs = Qdrat_dVbse ; - - here->HSM2_Qb = M * Qb ; - here->HSM2_Qb_dVgs = M * Qb_dVgse ; - here->HSM2_Qb_dVds = M * Qb_dVdse ; - here->HSM2_Qb_dVbs = M * Qb_dVbse ; - - here->HSM2_Qi = M * Qi ; - here->HSM2_Qi_dVgs = M * Qi_dVgse ; - here->HSM2_Qi_dVds = M * Qi_dVdse ; - here->HSM2_Qi_dVbs = M * Qi_dVbse ; - - } - - /*---------------------------------------------------* - * Substrate/gate/leak currents. - *-----------------*/ - - here->HSM2_isub = M * Isub ; - here->HSM2_gbbs = M * Isub_dVbse ; - here->HSM2_gbds = M * Isub_dVdse ; - here->HSM2_gbgs = M * Isub_dVgse ; - - here->HSM2_igb = M * -Igb ; - here->HSM2_gigbb = M * -Igb_dVbse ; - here->HSM2_gigbg = M * -Igb_dVgse ; - if (here->HSM2_mode == HiSIM_NORMAL_MODE) { - here->HSM2_gigbd = M * -Igb_dVdse ; - here->HSM2_gigbs = M * ( Igb_dVbse + Igb_dVdse + Igb_dVgse ) ; - } else { - here->HSM2_gigbd = M * ( Igb_dVbse + Igb_dVdse + Igb_dVgse ) ; - here->HSM2_gigbs = M * -Igb_dVdse ; - } - - if (here->HSM2_mode == HiSIM_NORMAL_MODE) { - - here->HSM2_igd = M * ( GLPART1 * Igate - Igd ) ; - here->HSM2_gigdb = M * ( GLPART1 * Igate_dVbse + GLPART1_dVbse * Igate - Igd_dVbse ) ; - here->HSM2_gigdd = M * ( GLPART1 * Igate_dVdse + GLPART1_dVdse * Igate - Igd_dVdse ) ; - here->HSM2_gigdg = M * ( GLPART1 * Igate_dVgse + GLPART1_dVgse * Igate - Igd_dVgse ) ; - - } else { - - T1 = 1.0 - GLPART1 ; - T1_dVb = - GLPART1_dVbse ; - T1_dVd = - GLPART1_dVdse ; - T1_dVg = - GLPART1_dVgse ; - here->HSM2_igd = M * ( T1 * Igate - Igs ) ; - here->HSM2_gigdb = M * ( T1 * Igate_dVbse + T1_dVb * Igate - Igs_dVbse ) ; - here->HSM2_gigdd = M * ( T1 * - ( Igate_dVgse + Igate_dVbse + Igate_dVdse ) - + ( - T1_dVb - T1_dVg - T1_dVd ) * Igate + ( Igs_dVgse + Igs_dVbse + Igs_dVdse ) ) ; - here->HSM2_gigdg = M * ( T1 * Igate_dVgse + T1_dVg * Igate - Igs_dVgse ) ; - } - here->HSM2_gigds = -(here->HSM2_gigdb + here->HSM2_gigdd + here->HSM2_gigdg) ; - - if (here->HSM2_mode == HiSIM_NORMAL_MODE) { - - T1 = 1.0 - GLPART1 ; - T1_dVb = - GLPART1_dVbse ; - T1_dVd = - GLPART1_dVdse ; - T1_dVg = - GLPART1_dVgse ; - here->HSM2_igs = M * ( T1 * Igate - Igs ) ; - here->HSM2_gigsb = M * ( T1 * Igate_dVbse + T1_dVb * Igate - Igs_dVbse ) ; - here->HSM2_gigsd = M * ( T1 * Igate_dVdse + T1_dVd * Igate - Igs_dVdse ) ; - here->HSM2_gigsg = M * ( T1 * Igate_dVgse + T1_dVg * Igate - Igs_dVgse ) ; - - } else { - - here->HSM2_igs = M * ( GLPART1 * Igate - Igd ) ; - here->HSM2_gigsb = M * ( GLPART1 * Igate_dVbse + GLPART1_dVbse * Igate - Igd_dVbse ) ; - here->HSM2_gigsd = M * ( GLPART1 * -(Igate_dVgse + Igate_dVbse + Igate_dVdse) - - Igate * ( GLPART1_dVbse + GLPART1_dVdse + GLPART1_dVgse ) + (Igs_dVgse + Igs_dVbse + Igs_dVdse) ) ; - here->HSM2_gigsg = M * ( GLPART1 * Igate_dVgse + GLPART1_dVgse * Igate - Igd_dVgse ) ; - - } - here->HSM2_gigss = -(here->HSM2_gigsb + here->HSM2_gigsd + here->HSM2_gigsg) ; - - here->HSM2_igidl = (here->HSM2_mode == HiSIM_NORMAL_MODE) ? M * Igidl : M * Igisl ; - here->HSM2_gigidlbs = (here->HSM2_mode == HiSIM_NORMAL_MODE) ? M * Igidl_dVbse : M * Igisl_dVbse ; - here->HSM2_gigidlds = (here->HSM2_mode == HiSIM_NORMAL_MODE) ? M * Igidl_dVdse : M * ( - Igisl_dVbse - Igisl_dVdse - Igisl_dVgse ) ; - here->HSM2_gigidlgs = (here->HSM2_mode == HiSIM_NORMAL_MODE) ? M * Igidl_dVgse : M * Igisl_dVgse ; - - here->HSM2_igisl = (here->HSM2_mode == HiSIM_NORMAL_MODE) ? M * Igisl : M * Igidl ; - here->HSM2_gigislbd = (here->HSM2_mode == HiSIM_NORMAL_MODE) ? M * Igisl_dVbse : M * Igidl_dVbse ; - here->HSM2_gigislsd = (here->HSM2_mode == HiSIM_NORMAL_MODE) ? M * Igisl_dVdse : M * ( - Igidl_dVbse - Igidl_dVdse - Igidl_dVgse ) ; - here->HSM2_gigislgd = (here->HSM2_mode == HiSIM_NORMAL_MODE) ? M * Igisl_dVgse : M * Igidl_dVgse ; - - /*---------------------------------------------------* - * Von, Vdsat. - *-----------------*/ - here->HSM2_von = Vth ; - here->HSM2_vdsat = Vdsat ; - - /*---------------------------------------------------* - * Junction diode. - *-----------------*/ - here->HSM2_ibs = M * Ibs ; - here->HSM2_ibd = M * Ibd ; - here->HSM2_gbs = M * Gbse ; - here->HSM2_gbd = M * Gbde ; - *(ckt->CKTstate0 + here->HSM2qbs) = M * Qbs ; - *(ckt->CKTstate0 + here->HSM2qbd) = M * Qbd ; - here->HSM2_capbs = M * Capbse ; - here->HSM2_capbd = M * Capbde ; - - /*-----------------------------------------------------------* - * Warn floating-point exceptions. - * - Function finite() in libm is called. - * - Go to start with info==5. - *-----------------*/ - T1 = here->HSM2_ids + here->HSM2_gmbs + here->HSM2_gds + here->HSM2_gm ; - T1 = T1 + here->HSM2_qd + here->HSM2_cdsb ; - if ( ! finite (T1) ) { - flg_err = 1 ; - fprintf (stderr , - "*** warning(HiSIM): FP-exception (PART-1)\n" ) ; - if ( flg_info >= 1 ) { - printf ( "*** warning(HiSIM): FP-exception\n") ; - printf ( "here->HSM2_ids = %12.5e\n" , here->HSM2_ids ) ; - printf ( "here->HSM2_gmbs = %12.5e\n" , here->HSM2_gmbs) ; - printf ( "here->HSM2_gds = %12.5e\n" , here->HSM2_gds ) ; - printf ( "here->HSM2_gm = %12.5e\n" , here->HSM2_gm ) ; - printf ( "here->HSM2_qd = %12.5e\n" , here->HSM2_qd ) ; - printf ( "here->HSM2_cdsb = %12.5e\n" , here->HSM2_cdsb) ; - } - } - - T1 = here->HSM2_isub + here->HSM2_gbbs + here->HSM2_gbds + here->HSM2_gbgs ; - if ( ! finite (T1) ) { - flg_err = 1 ; - fprintf (stderr , - "*** warning(HiSIM): FP-exception (PART-2)\n") ; - if ( flg_info >= 1 ) { - printf ("*** warning(HiSIM): FP-exception\n") ; - } - } - - T1 = here->HSM2_cgbo + Cgdo + Cgso + Cggo ; - if ( ! finite (T1) ) { - flg_err = 1 ; - fprintf(stderr , - "*** warning(HiSIM): FP-exception (PART-3)\n") ; - if ( flg_info >= 1 ) { - printf ("*** warning(HiSIM): FP-exception\n") ; - } - } - - T1 = here->HSM2_ibs + here->HSM2_ibd + here->HSM2_gbs + here->HSM2_gbd ; - T1 = T1 + *(ckt->CKTstate0 + here->HSM2qbs) + *(ckt->CKTstate0 + here->HSM2qbd) - + here->HSM2_capbs + here->HSM2_capbd ; - if ( ! finite (T1) ) { - flg_err = 1 ; - fprintf(stderr , - "*** warning(HiSIM): FP-exception (PART-4)\n") ; - if ( flg_info >= 1 ) { - printf ("*** warning(HiSIM): FP-exception\n") ; - } - } - - /*-----------------------------------------------------------* - * Exit for error case. - *-----------------*/ - if ( flg_err != 0 ) { - fprintf (stderr , "----- bias information (HiSIM)\n" ) ; - fprintf (stderr , "name: %s\n" , here->HSM2name ) ; - fprintf (stderr , "stetes: %d\n" , here->HSM2states ) ; - fprintf (stderr , "vds= %12.5e vgs=%12.5e vbs=%12.5e\n" - , vds , vgs , vbs ) ; - fprintf (stderr , "vbs_jct= %12.5e vbd_jct= %12.5e\n" - , vbs_jct , vbd_jct ) ; - fprintf (stderr , "vd= %12.5e vg= %12.5e vb= %12.5e vs= %12.5e\n" - , *( ckt->CKTrhsOld + here->HSM2dNodePrime ) - , *( ckt->CKTrhsOld + here->HSM2gNodePrime ) - , *( ckt->CKTrhsOld + here->HSM2bNodePrime ) - , *( ckt->CKTrhsOld + here->HSM2sNodePrime ) ) ; - if ( here->HSM2_called >= 1 ) { - fprintf (stderr , "vdsc_prv= %12.5e vgsc_prv=%12.5e vbsc_prv=%12.5e\n" - , here->HSM2_vdsc_prv , here->HSM2_vgsc_prv - , here->HSM2_vbsc_prv ) ; - } - fprintf (stderr , "----- bias information (end)\n" ) ; - } - - if ( flg_err != 0 ) return ( HiSIM_ERROR ) ; - - /*-----------------------------------------------------------* - * Noise. - *-----------------*/ - here->HSM2_noiflick = M * Nflic ; - here->HSM2_noithrml = M * Nthrml ; - - /*----------------------------------------------------------* - * induced gate noise. ( Part 3/3 ) - *----------------------*/ - if ( model->HSM2_coign != 0 && model->HSM2_cothrml != 0 && flg_ign == 1 && !flg_noqi ) { - T0 = Cox_small * Cox * here->HSM2_weff_nf * Leff ; - T1 = here->HSM2_cgsb / M ; - if( - T1 > T0 ){ - Nign0 = c_16o135 * C_QE * beta_inv * T1 * T1 / gds0_ign ; - if ( kusai00L > epsm10 && Vds > epsm10 ) { - MuModA = Muun / Mu ; - MuModB = ( Muun / Mud_hoso - MuModA ) / Vds ; - correct_w1 = MuModA + C_2o3 * MuModB - * ( kusai00 + VgVt * sqrtkusaiL + kusaiL ) - / ( VgVt + sqrtkusaiL ) ; - } else { - correct_w1 = Muun / Mud_hoso ; - } - here->HSM2_noiigate = M * Nign0 * kusai_ig * correct_w1 ; - here->HSM2_noicross = crl_f ; - if ( here->HSM2_noiigate < 0.0 ) here->HSM2_noiigate = 0.0e0 ; - }else{ - here->HSM2_noiigate = 0.0e0 ; - here->HSM2_noicross = 0.0e0 ; - } - here->HSM2_Qdrat = Qdrat ; /* needed for calculating induced gate noise */ - }else{ - here->HSM2_noiigate = 0.0e0 ; - here->HSM2_noicross = 0.0e0 ; - } - - /*-----------------------------------------------------------* - * Restore values for next calculation. - *-----------------*/ - - /* Confined biases */ - if ( here->HSM2_called >= 1 ) { - here->HSM2_vbsc_prv2 = here->HSM2_vbsc_prv ; - here->HSM2_vdsc_prv2 = here->HSM2_vdsc_prv ; - here->HSM2_vgsc_prv2 = here->HSM2_vgsc_prv ; - here->HSM2_mode_prv2 = here->HSM2_mode_prv ; - } - here->HSM2_vbsc_prv = Vbsc ; - here->HSM2_vdsc_prv = Vdsc ; - here->HSM2_vgsc_prv = Vgsc ; - here->HSM2_mode_prv = here->HSM2_mode ; - - /* Surface potentials and derivatives w.r.t. internal biases */ - if ( here->HSM2_called >= 1 ) { - here->HSM2_ps0_prv2 = here->HSM2_ps0_prv ; - here->HSM2_ps0_dvbs_prv2 = here->HSM2_ps0_dvbs_prv ; - here->HSM2_ps0_dvds_prv2 = here->HSM2_ps0_dvds_prv ; - here->HSM2_ps0_dvgs_prv2 = here->HSM2_ps0_dvgs_prv ; - here->HSM2_pds_prv2 = here->HSM2_pds_prv ; - here->HSM2_pds_dvbs_prv2 = here->HSM2_pds_dvbs_prv ; - here->HSM2_pds_dvds_prv2 = here->HSM2_pds_dvds_prv ; - here->HSM2_pds_dvgs_prv2 = here->HSM2_pds_dvgs_prv ; - } - - here->HSM2_ps0_prv = Ps0 ; - here->HSM2_ps0_dvbs_prv = Ps0_dVbs ; - here->HSM2_ps0_dvds_prv = Ps0_dVds ; - here->HSM2_ps0_dvgs_prv = Ps0_dVgs ; - here->HSM2_pds_prv = Pds ; - here->HSM2_pds_dvbs_prv = Pds_dVbs ; - here->HSM2_pds_dvds_prv = Pds_dVds ; - here->HSM2_pds_dvgs_prv = Pds_dVgs ; - - /* Derivatives of channel current w.r.t. internal biases */ - here->HSM2_ids_prv = Ids ; - here->HSM2_ids_dvbs_prv = Ids_dVbs ; - here->HSM2_ids_dvds_prv = Ids_dVds ; - here->HSM2_ids_dvgs_prv = Ids_dVgs ; - - /* For CORECIP = 1 */ - if ( corecip ) { - here->HSM2_PS0Z_SCE_prv = PS0Z_SCE ; - here->HSM2_PS0Z_SCE_dvds_prv = PS0Z_SCE_dVds ; - here->HSM2_PS0Z_SCE_dvgs_prv = PS0Z_SCE_dVgs ; - here->HSM2_PS0Z_SCE_dvbs_prv = PS0Z_SCE_dVbs ; - /* here->HSM2_nnn = NNN ; */ - } - - /*-----------------------------------------------------------* - * End of PART-7. (label) - *-----------------*/ -/* end_of_part_7: */ - - /*-----------------------------------------------------------* - * Bottom of hsm2eval. - *-----------------*/ - - - return ( HiSIM_OK ) ; - -} /* end of hsm2eval */ - diff --git a/src/spicelib/devices/hisim2/hsm2eval_dep.h b/src/spicelib/devices/hisim2/hsm2eval_dep.h deleted file mode 100644 index 3ea2b5d39..000000000 --- a/src/spicelib/devices/hisim2/hsm2eval_dep.h +++ /dev/null @@ -1,2112 +0,0 @@ -/*********************************************************************** - - HiSIM (Hiroshima University STARC IGFET Model) - Copyright (C) 2014 Hiroshima University & STARC - - MODEL NAME : HiSIM_HV - ( VERSION : 2 SUBVERSION : 8 REVISION : 0 ) - Model Parameter 'VERSION' : 2.80 - FILE : hsm2eval_dep.h - - DATE : 2014.5.12 - - released by - Hiroshima University & - Semiconductor Technology Academic Research Center (STARC) -***********************************************************************/ - -/********************************************************************** - -The following source code, and all copyrights, trade secrets or other -intellectual property rights in and to the source code in its entirety, -is owned by the Hiroshima University and the STARC organization. - -All users need to follow the "HISIM_HV Distribution Statement and -Copyright Notice" attached to HiSIM model. - ------HISIM Distribution Statement and Copyright Notice-------------- - -Software is distributed as is, completely without warranty or service -support. Hiroshima University or STARC and its employees are not liable -for the condition or performance of the software. - -Hiroshima University and STARC own the copyright and grant users a perpetual, -irrevocable, worldwide, non-exclusive, royalty-free license with respect -to the software as set forth below. - -Hiroshima University and STARC hereby disclaims all implied warranties. - -Hiroshima University and STARC grant the users the right to modify, copy, -and redistribute the software and documentation, both within the user's -organization and externally, subject to the following restrictions - -1. The users agree not to charge for Hiroshima University and STARC code -itself but may charge for additions, extensions, or support. - -2. In any product based on the software, the users agree to acknowledge -Hiroshima University and STARC that developed the software. This -acknowledgment shall appear in the product documentation. - -3. The users agree to reproduce any copyright notice which appears on -the software on any copy or modification of such made available -to others." - -Toshimasa Asahara, President, Hiroshima University -Mitiko Miura-Mattausch, Professor, Hiroshima University -Katsuhiro Shimohigashi, President&CEO, STARC -June 2008 (revised October 2011) -*************************************************************************/ - -{ // Begin : hsm2eval_dep - -/* define local variavles */ - int depmode ; - double afact, afact2, afact3, bfact, cfact ; - double W_bsub0, W_bsubL, W_s0, W_sL, W_sub0, W_subL, W_b0, W_bL, vthn ; - double phi_s0_DEP = 0.0, phi_sL_DEP = 0.0 , Vbi_DEP ; - double phi_s0_DEP_dVgs, phi_s0_DEP_dVbs, phi_s0_DEP_dVds ; - double phi_sL_DEP_dVgs, phi_sL_DEP_dVbs, phi_sL_DEP_dVds ; - double phi_j0_DEP, phi_jL_DEP, Psbmax, phi_b0_DEP_lim, phi_bL_DEP_lim ; - - - double phi_jL_DEP_dVgs, phi_jL_DEP_dVds, phi_jL_DEP_dVbs ; - - double Vgp0, Vgp1, Vgp0old, phi_j0_DEP_old, phi_jL_DEP_old, phi_b0_DEP_old, phi_bL_DEP_old, phi_s0_DEP_old, phi_sL_DEP_old ; - double phi_j0_DEP_acc, phi_jL_DEP_acc ; - - - double Q_s0, Q_sL = 0.0 ; - double Q_s0_dVgs, Q_sL_dVgs = 0.0, Q_s0_dVds, Q_sL_dVds = 0.0, Q_s0_dVbs, Q_sL_dVbs = 0.0 ; - double Q_sub0, Q_subL, Q_sub0_dVgs, Q_subL_dVgs, Q_sub0_dVds, Q_subL_dVds, Q_sub0_dVbs, Q_subL_dVbs ; - double Qn_res0, Qn_res0_dVgs, Qn_res0_dVds, Qn_res0_dVbs ; - - - double y1, y2, dety ; - double y11, y12 ; - double y21, y22 ; - - double y1_dVgs, y1_dVds, y1_dVbs ; - double y2_dVgs, y2_dVds, y2_dVbs ; - - double rev11 = 0.0, rev12 = 0.0 ; - double rev21 = 0.0, rev22 = 0.0 ; - - double phi_b0_DEP_ini ; - double y0, dydPsm ; - - double W_b0_dVgs, W_b0_dVds, W_b0_dVbs ; - - double W_res0 ; - double W_s0_dVgs, W_s0_dVds, W_s0_dVbs ; - - double phi_b0_DEP, Q_b0_dep, Q_sub0_dep ; - double phi_b0_DEP_dVgs, phi_b0_DEP_dVds, phi_b0_DEP_dVbs ; - double phi_j0_DEP_dVgs, phi_j0_DEP_dVds, phi_j0_DEP_dVbs ; - double Q_b0_dep_dVgs, Q_b0_dep_dVds, Q_b0_dep_dVbs ; - double Q_sub0_dep_dVgs, Q_sub0_dep_dVds, Q_sub0_dep_dVbs ; - - double phi_bL_DEP, Q_bL_dep, Q_subL_dep ; - double phi_bL_DEP_dVgs, phi_bL_DEP_dVds, phi_bL_DEP_dVbs ; - double Q_bL_dep_dVgs, Q_bL_dep_dVds, Q_bL_dep_dVbs ; - double Q_subL_dep_dVgs, Q_subL_dep_dVds, Q_subL_dep_dVbs ; - - double q_Ndepm_esi, Idd_drift,Idd_diffu ; - double Qn_bac0 ; - double Qn_bac0_dVgs, Qn_bac0_dVds, Qn_bac0_dVbs ; - - double Mu_res, Mu_bac ; - double Mu_res_dVgs, Mu_res_dVds, Mu_res_dVbs ; - double Mu_bac_dVgs, Mu_bac_dVds, Mu_bac_dVbs ; - - double Q_n0_cur, Q_nL_cur ; - double Q_n0_cur_dVgs, Q_n0_cur_dVds, Q_n0_cur_dVbs ; - double Q_nL_cur_dVgs, Q_nL_cur_dVds, Q_nL_cur_dVbs ; - - double Q_s0_dep, Q_sL_dep ; - double Q_s0_dep_dVgs, Q_s0_dep_dVds, Q_s0_dep_dVbs ; - double Q_sL_dep_dVgs, Q_sL_dep_dVds, Q_sL_dep_dVbs ; - - double sm_delta ; - double phib_ref, phib_ref_dPs, phib_ref_dPd ; - double Q_s0_dPs, Q_sL_dPs, Q_s0_dPb, Q_sL_dPb ; - double Q_b0_dep_dPb, Q_bL_dep_dPb, Q_b0_dep_dPd, Q_bL_dep_dPd, Q_sub0_dep_dPd, Q_subL_dep_dPd ; - double phi_j0_DEP_dPb, phi_jL_DEP_dPb ; - double NdepmpNsub_inv1, NdepmpNsub ; - - - - double Q_n0, Q_n0_dVgs, Q_n0_dVds, Q_n0_dVbs ; - double Q_nL, Q_nL_dVgs, Q_nL_dVds, Q_nL_dVbs ; - - double phi_s0_DEP_ini, phi_sL_DEP_ini ; - - - double C_QE2, C_ESI2, Tn2 ; - double Ndepm2, q_Ndepm ; - double C_2ESIpq_Ndepm, C_2ESIpq_Ndepm_inv , C_2ESI_q_Ndepm ; - double C_2ESIpq_Nsub , C_2ESIpq_Nsub_inv ; - double ps_conv3 , ps_conv23 ; - double Ids_res, Ids_bac, Edri ; - double Ids_res_dVgs, Ids_res_dVds, Ids_res_dVbs ; - double Ids_bac_dVgs, Ids_bac_dVds, Ids_bac_dVbs ; - double Edri_dVgs, Edri_dVds, Edri_dVbs ; - - double T0_dVg, T0_dVb,T0_dVd ; - double T1_dVgs, T1_dVds, T1_dVbs ; - double T2_dVgs, T2_dVds, T2_dVbs ; - double T3_dVgs, T3_dVds, T3_dVbs ; - double T4_dVgs, T4_dVds, T4_dVbs ; - double T5_dVgs, T5_dVds, T5_dVbs ; - - - double Vgpp ; - double Vgpp_dVgs, Vgpp_dVds, Vgpp_dVbs ; - double Vdseff0, Vdseff0_dVgs, Vdseff0_dVds, Vdseff0_dVbs ; - double phib_ref_dVgs, phib_ref_dVds, phib_ref_dVbs ; - - double Qn_delta ; - double Qn_drift, Qn_drift_dVgs, Qn_drift_dVds, Qn_drift_dVbs ; - - double Ey_suf, Ey_suf_dVgs, Ey_suf_dVds, Ey_suf_dVbs ; - - double DEPQFN1 = 2.0 ; - double DEPQFN3 = 0.3 ; - double DEPQFN_dlt = 2.0 ; - double Ps_delta = 0.06 ; - double Ps_delta0 = 0.08 ; - -/*--------------------------------------* - * CeilingPow with derivatives for delta - *-----------------*/ -#define Fn_SL_CP3( y , x , xmin , delta , pw , dx , dxmin, ddelta) { \ - if(x < xmin + delta && delta >= 0.0) { \ - double TMF0, TMF1; \ - TMF1 = xmin + delta - x ; \ - Fn_CP2( TMF0 , TMF1 , delta , pw , dx , ddelta ) \ - y = xmin + delta - TMF0 ; \ - dx = dx ; \ - dxmin = 1.0-dx ; \ - ddelta = 1.0-dx-ddelta; \ - } else { \ - y = x ; \ - dx = 1.0 ; \ - dxmin = 0.0 ; \ - ddelta = 0.0 ; \ - } \ -} - - - // Constants - Vbi_DEP = here->HSM2_Vbipn ; - q_Ndepm = C_QE * here->HSM2_ndepm ; - Ndepm2 = here->HSM2_ndepm * here->HSM2_ndepm ; - q_Ndepm_esi = C_QE * here->HSM2_ndepm * C_ESI ; - q_Nsub = C_QE * here->HSM2_nsub ; - C_QE2 = C_QE * C_QE ; - C_ESI2 = C_ESI * C_ESI ; - Tn2 = model->HSM2_tndep * model->HSM2_tndep ; - C_2ESIpq_Ndepm = 2.0 * C_ESI/q_Ndepm ; - C_2ESIpq_Ndepm_inv = q_Ndepm / (2.0 * C_ESI) ; - C_2ESI_q_Ndepm = 2.0 * C_ESI * q_Ndepm ; - C_2ESIpq_Nsub = 2.0 * C_ESI / q_Nsub ; - C_2ESIpq_Nsub_inv = q_Nsub / (2.0 * C_ESI) ; - NdepmpNsub = here->HSM2_ndepm / here->HSM2_nsub ; - NdepmpNsub_inv1 = 1.0 / (1.0 + NdepmpNsub ) ; - ps_conv3 = ps_conv * 1000.0 ; - ps_conv23 = ps_conv2 * 1000.0 ; - here->HSM2_qnsub_esi = q_Ndepm_esi ; - - - //---------------------------------------------------* - // depletion MOS mode - //------------------// - - Vbsc = Vbs ; - Vbsc_dVbse = 1.0 ; - - /*---------------------------------------------------* - * initial potential phi_s0_DEP,phi_b0_DEP,phi_j0_DEP calculated. - *------------------*/ - - Vgp = Vgp + epsm10 * 1.0e7 ; - - - afact = Cox * Cox / here->HSM2_cnst0 / here->HSM2_cnst0 ; - afact2 = afact / here->HSM2_nin / here->HSM2_nin * Ndepm2 ; - W_bsub0 = sqrt(2.0e0 * C_ESI / C_QE * here->HSM2_nsub / (here->HSM2_nsub - + here->HSM2_ndepm) / here->HSM2_ndepm * ( - Vbsc + Vbi_DEP)) ; - - if( W_bsub0 > model->HSM2_tndep ) { - - Vgp0 = 0.0; - - W_b0 = model->HSM2_tndep ; - phi_b0_DEP = 0.0 ; - phi_j0_DEP = phi_b0_DEP - C_2ESIpq_Ndepm_inv * W_b0 * W_b0 ; - phi_b0_DEP_lim = 0.0 ; - - Vgp0old = Vgp0 ; - phi_j0_DEP_old = phi_j0_DEP ; - - for ( lp_s0 = 1 ; lp_s0 <= lp_se_max + 1 ; lp_s0 ++ ) { - - W_b0 = sqrt(C_2ESIpq_Ndepm * (phi_b0_DEP - phi_j0_DEP) ) ; - Fn_SU_CP( W_b0 , W_b0 , model->HSM2_tndep , 1e-8, 2 , T0 ) - W_sub0 = sqrt(C_2ESIpq_Nsub * (phi_j0_DEP - Vbsc + Vbi_DEP) ) ; - - Q_b0_dep = W_b0 * q_Ndepm ; - Q_b0_dep_dPd = - C_ESI / W_b0 * T0 ; - Q_sub0_dep = - W_sub0 * q_Nsub ; - Q_sub0_dep_dPd = - C_ESI / W_sub0 ; - - y1 = Cox * (Vgp0 - phi_b0_DEP) + Q_b0_dep + Q_sub0_dep ; - y11 = Cox ; - y12 = Q_b0_dep_dPd + Q_sub0_dep_dPd ; - - y2 = phi_j0_DEP - NdepmpNsub_inv1 * (NdepmpNsub * phi_b0_DEP + Vbsc - Vbi_DEP) ; - y21 = 0.0 ; - y22 = 1.0 ; - - dety = y11 * y22 - y21 * y12; - rev11 = (y22) / dety ; - rev12 = ( - y12) / dety ; - rev21 = ( - y21) / dety ; - rev22 = (y11) / dety ; - - if( fabs( rev11 * y1 + rev12 * y2 ) > 0.5 ) { - Vgp0 = Vgp0 - 0.5 * Fn_Sgn( rev11 * y1 + rev12 * y2 ) ; - phi_j0_DEP = phi_j0_DEP - 0.5 * Fn_Sgn( rev21 * y1 + rev22 * y2 ) ; - } else { - Vgp0 = Vgp0 - ( rev11 * y1 + rev12 * y2 ) ; - phi_j0_DEP = phi_j0_DEP - ( rev21 * y1 + rev22 * y2 ) ; - } - - if( fabs(Vgp0 - Vgp0old) <= ps_conv && - fabs(phi_j0_DEP - phi_j0_DEP_old) <= ps_conv ) lp_s0=lp_se_max + 1 ; - - Vgp0old = Vgp0 ; - phi_j0_DEP_old = phi_j0_DEP ; - } - phi_j0_DEP_acc = phi_j0_DEP ; - - W_sub0 = model->HSM2_tndep * NdepmpNsub ; - phi_j0_DEP = C_2ESIpq_Nsub_inv * W_sub0 * W_sub0 + Vbsc - Vbi_DEP ; - phi_b0_DEP = phi_j0_DEP + C_2ESIpq_Ndepm_inv * Tn2 ; - phi_s0_DEP = phi_b0_DEP ; - Psbmax = phi_b0_DEP ; - Vgp1 = phi_b0_DEP ; - if( Vgp > Vgp0 ) { - depmode = 1 ; - } else if(Vgp > Vgp1 ) { - depmode = 3 ; - } else { - depmode = 2 ; - } - - } else { - Vgp0 = 0.0 ; - Vgp1 = Vgp0 ; - Psbmax = 0.0 ; - phi_b0_DEP_lim = Vgp0 ; - W_b0 = W_bsub0 ; - W_sub0 = W_b0 * NdepmpNsub ; - phi_j0_DEP = C_2ESIpq_Nsub_inv * W_sub0 * W_sub0 + Vbsc - Vbi_DEP ; - phi_b0_DEP = C_2ESIpq_Ndepm_inv * W_b0 * W_b0 + phi_j0_DEP ; - phi_j0_DEP_acc = phi_j0_DEP ; - if( Vgp > Vgp0 ) { - depmode = 1 ; - } else { - depmode = 2 ; - } - - } - - - T1 = C_2ESI_q_Ndepm * ( Psbmax - ( - here->HSM2_Pb2n + Vbsc)) ; - if ( T1 > 0.0 ) { - vthn = - here->HSM2_Pb2n + Vbsc - sqrt(T1) / Cox ; - } else { - vthn = - here->HSM2_Pb2n + Vbsc ; - } - - /* primary value */ - - if( Vgp > Vgp0 ) { - /* accumulation region */ - phi_j0_DEP = phi_j0_DEP_acc ; - phi_b0_DEP = 0.0 ; - phi_s0_DEP_ini = log(afact * Vgp * Vgp) / (beta + 2.0 / Vgp) + phi_b0_DEP ; - - if( phi_s0_DEP_ini < phi_b0_DEP_lim + ps_conv23 ) phi_s0_DEP_ini = phi_b0_DEP_lim + ps_conv23 ; - - } else if( Vgp > Vgp1 ) { - /* depletion region */ - - phi_s0_DEP_ini = phi_s0_DEP ; - - } else { - /* depletion and inversion region */ - - if( Vgp > vthn ) { - /* depletion */ - bfact = - 2.0 * afact * Vgp + beta ; - cfact = afact * Vgp * Vgp - beta * phi_b0_DEP ; - phi_b0_DEP_old = phi_b0_DEP ; - - phi_s0_DEP_ini = ( - bfact + sqrt(bfact * bfact - 4.0 * afact * cfact)) / 2.0 / afact ; - if( phi_s0_DEP_ini > Psbmax - ps_conv3 ) phi_s0_DEP_ini = Psbmax - ps_conv3 ; - - W_s0 = sqrt(C_2ESIpq_Ndepm * (phi_b0_DEP - phi_s0_DEP_ini) ) ; - W_b0 = sqrt(C_2ESIpq_Ndepm * (phi_b0_DEP - phi_j0_DEP) ) ; - - if( W_s0 + W_b0 > model->HSM2_tndep ) { - for ( lp_s0 = 1 ; lp_s0 <= lp_se_max + 1 ; lp_s0 ++ ) { - - y0 = W_s0 + W_b0 - model->HSM2_tndep ; - - dydPsm = C_ESI / q_Ndepm / W_s0 - + C_ESI / q_Ndepm * ( 1.0 - (here->HSM2_ndepm - / here->HSM2_nsub) / ( 1.0 + (NdepmpNsub))) / W_b0 ; - - if( fabs(y0 / dydPsm) > 0.5 ) { - phi_b0_DEP = phi_b0_DEP - 0.5 * Fn_Sgn(y0 / dydPsm) ; - } else { - phi_b0_DEP = phi_b0_DEP - y0 / dydPsm ; - } - - if( (phi_b0_DEP - Vbsc + Vbi_DEP) < epsm10 ) - phi_b0_DEP=Vbsc - Vbi_DEP + epsm10 ; - - cfact = afact * Vgp * Vgp - beta * phi_b0_DEP ; - T1 = bfact * bfact - 4.0 * afact * cfact ; - if( T1 > 0.0 ) { - phi_s0_DEP_ini = ( - bfact + sqrt(T1)) / 2.0 / afact ; - } else { - phi_s0_DEP_ini = ( - bfact) / 2.0 / afact ; - } - - if( phi_s0_DEP_ini > Psbmax ) phi_s0_DEP_ini = Psbmax ; - if( phi_s0_DEP_ini > phi_b0_DEP ) { - phi_s0_DEP_ini = phi_b0_DEP - ps_conv23 ; - lp_s0=lp_se_max + 1 ; - } - - W_s0 = sqrt(C_2ESIpq_Ndepm * (phi_b0_DEP - phi_s0_DEP_ini) ) ; - phi_j0_DEP = ( NdepmpNsub * phi_b0_DEP - + Vbsc - Vbi_DEP) / (1.0 + NdepmpNsub) ; - W_b0 = sqrt(C_2ESIpq_Ndepm * (phi_b0_DEP - phi_j0_DEP) ) ; - - if( fabs(phi_b0_DEP - phi_b0_DEP_old) <= 1.0e-8 ) lp_s0=lp_se_max + 1 ; - phi_b0_DEP_old = phi_b0_DEP ; - } - } - - } else { - afact3 = afact2 / exp(beta * Vbsc) ; - phi_b0_DEP_old = phi_b0_DEP ; - phi_s0_DEP_ini = log(afact3 * Vgp * Vgp) / ( - beta + 2.0 / Vgp) ; - W_s0 = sqrt(C_2ESIpq_Ndepm * (phi_b0_DEP - phi_s0_DEP_ini) ) ; - W_b0 = sqrt(C_2ESIpq_Ndepm * (phi_b0_DEP - phi_j0_DEP) ) ; - if( W_s0 + W_b0 > model->HSM2_tndep ) { - for ( lp_s0 = 1 ; lp_s0 <= lp_s0_max + 1 ; lp_s0 ++ ) { - - y0 = W_s0 + W_b0 - model->HSM2_tndep ; - dydPsm = C_ESI / q_Ndepm / W_s0 - + C_ESI / q_Ndepm * ( 1.0 - (here->HSM2_ndepm / - here->HSM2_nsub) / ( 1.0 + (NdepmpNsub))) / W_b0 ; - - if( fabs(y0 / dydPsm) > 0.5 ) { - phi_b0_DEP = phi_b0_DEP - 0.5 * Fn_Sgn(y0 / dydPsm) ; - } else { - phi_b0_DEP = phi_b0_DEP - y0 / dydPsm ; - } - if( (phi_b0_DEP - Vbsc + Vbi_DEP) < epsm10 ) - phi_b0_DEP=Vbsc - Vbi_DEP + epsm10 ; - - W_s0 = sqrt(C_2ESIpq_Ndepm * (phi_b0_DEP - phi_s0_DEP_ini) ) ; - phi_j0_DEP = ( NdepmpNsub * phi_b0_DEP - + Vbsc - Vbi_DEP) / (1.0 + NdepmpNsub) ; - W_b0 = sqrt(C_2ESIpq_Ndepm * (phi_b0_DEP - phi_j0_DEP) ) ; - - if( fabs(phi_b0_DEP - phi_b0_DEP_old) <= 1.0e-5 ) lp_s0=lp_s0_max + 1 ; - phi_b0_DEP_old = phi_b0_DEP ; - } - - } - } // end of phi_b0_DEP loop // - - } - phi_b0_DEP_ini = phi_b0_DEP ; - - /* */ - /* solve poisson at source side */ - /* */ - - sm_delta = 0.12 ; - - flg_conv = 0 ; - - phi_s0_DEP = phi_s0_DEP_ini ; - phi_b0_DEP = phi_b0_DEP_ini ; - - phi_s0_DEP_old = phi_s0_DEP ; - phi_b0_DEP_old = phi_b0_DEP ; - - for ( lp_s0 = 1 ; lp_s0 <= lp_se_max + 1 ; lp_s0 ++ ) { - - phi_j0_DEP = NdepmpNsub_inv1 * (NdepmpNsub * phi_b0_DEP + Vbsc - Vbi_DEP) ; - phi_j0_DEP_dPb = NdepmpNsub_inv1 * NdepmpNsub ; - - T1 = phi_b0_DEP - phi_j0_DEP ; - Fn_SL_CP( T2 , T1 , 0.0 , 0.1, 2 , T7 ) - W_b0 = sqrt(C_2ESIpq_Ndepm * (T2) ) ; - Fn_SU_CP( W_b0 , W_b0 , model->HSM2_tndep, 1e-8, 2 , T8 ) - W_sub0 = sqrt(C_2ESIpq_Nsub * (phi_j0_DEP - Vbsc + Vbi_DEP) ) ; - Q_b0_dep = W_b0 * q_Ndepm ; - Q_b0_dep_dPb = C_ESI / W_b0 * T7 * T8 ; - Q_b0_dep_dPd = - C_ESI / W_b0 * T7 * T8 ; - Q_sub0_dep = - W_sub0 * q_Nsub ; - Q_sub0_dep_dPd = - C_ESI / W_sub0 ; - - T10 = 8.0 * q_Ndepm_esi * Tn2 ; - phib_ref = (4.0 * phi_j0_DEP * phi_j0_DEP * C_ESI2 - 8.0 * phi_j0_DEP * C_ESI2 * phi_s0_DEP - + 4.0 * C_ESI2 * phi_s0_DEP * phi_s0_DEP - + 4.0 * phi_j0_DEP * q_Ndepm_esi * Tn2 - + 4.0 * phi_s0_DEP * q_Ndepm_esi * Tn2 - + Ndepm2 * C_QE2 * Tn2 * Tn2 ) / T10 ; - phib_ref_dPs = ( - 8.0 * phi_j0_DEP * C_ESI2 + 8.0 * C_ESI2 * phi_s0_DEP - + 4.0 * q_Ndepm_esi * Tn2 ) / T10 ; - phib_ref_dPd = ( 8.0 * phi_j0_DEP * C_ESI2 - 8.0 * C_ESI2 * phi_s0_DEP - + 4.0 * q_Ndepm_esi * Tn2 ) / T10 ; - - T1 = beta * (phi_s0_DEP - phi_b0_DEP) ; - T2 = exp(T1) ; - if( phi_s0_DEP >= phi_b0_DEP ) { - Q_s0 = - here->HSM2_cnst0 * sqrt(T2 - 1.0 - T1 + 1e-15) ; - Q_s0_dPs = 0.5 * here->HSM2_cnst0 * here->HSM2_cnst0 / Q_s0 * (beta * T2 - beta ) ; - Q_s0_dPb = - Q_s0_dPs ; - } else { - T3 = exp( - beta * (phi_s0_DEP - Vbsc)) ; - T4 = exp( - beta * (phi_b0_DEP - Vbsc)) ; - Q_s0 = here->HSM2_cnst0 * sqrt(T2 - 1.0 - T1 + 1e-15 + here->HSM2_cnst1 * (T3 - T4) ) ; - T5 = 0.5 * here->HSM2_cnst0 * here->HSM2_cnst0 / Q_s0 ; - Q_s0_dPs = T5 * (beta * T2 - beta + here->HSM2_cnst1 * ( - beta * T3) ) ; - Q_s0_dPb = T5 * ( - beta * T2 + beta + here->HSM2_cnst1 * beta * T4 ) ; - } - - Fn_SU_CP( T1 , phib_ref , phi_b0_DEP_lim , sm_delta, 4 , T9 ) - - y1 = phi_b0_DEP - T1 ; - y11 = - phib_ref_dPs * T9 ; - y12 = 1.0 - phib_ref_dPd * phi_j0_DEP_dPb * T9 ; - - y2 = Cox * (Vgp - phi_s0_DEP) + Q_s0 + Q_b0_dep + Q_sub0_dep ; - y21 = - Cox + Q_s0_dPs ; - y22 = Q_s0_dPb + Q_b0_dep_dPb + Q_b0_dep_dPd * phi_j0_DEP_dPb + Q_sub0_dep_dPd * phi_j0_DEP_dPb ; - - dety = y11 * y22 - y21 * y12; - rev11 = (y22) / dety ; - rev12 = ( - y12) / dety ; - rev21 = ( - y21) / dety ; - rev22 = (y11) / dety ; - if( fabs( rev21 * y1 + rev22 * y2 ) > 0.5 ) { - phi_s0_DEP = phi_s0_DEP - 0.5 * Fn_Sgn( rev11 * y1 + rev12 * y2 ) ; - phi_b0_DEP = phi_b0_DEP - 0.5 * Fn_Sgn( rev21 * y1 + rev22 * y2 ) ; - } else { - phi_s0_DEP = phi_s0_DEP - ( rev11 * y1 + rev12 * y2 ) ; - phi_b0_DEP = phi_b0_DEP - ( rev21 * y1 + rev22 * y2 ) ; - } - - if( fabs(phi_s0_DEP - phi_s0_DEP_old) <= ps_conv && fabs(phi_b0_DEP - phi_b0_DEP_old) <= ps_conv ) { - lp_s0=lp_se_max + 1 ; - flg_conv = 1 ; - } - - phi_s0_DEP_old = phi_s0_DEP ; - phi_b0_DEP_old = phi_b0_DEP ; - - } - - if( flg_conv == 0 ) { - printf( "*** warning(HiSIM(%s)): Went Over Iteration Maximum(Ps0)\n",model->HSM2modName ) ; - printf( " Vbse = %7.3f Vdse = %7.3f Vgse = %7.3f\n" ,Vbse , Vdse , Vgse ) ; - } - - /* caluculate derivative */ - - y1_dVgs = 0.0 ; - y1_dVds = 0.0 ; - y1_dVbs = - (8.0 * phi_j0_DEP * C_ESI2 - 8.0 * C_ESI2 * phi_s0_DEP - + 4.0 * q_Ndepm_esi * Tn2) / T10 - * T9 * NdepmpNsub_inv1 * Vbsc_dVbse ; - - Q_b0_dep_dVbs = - C_ESI / W_b0 * T7 * T8 * NdepmpNsub_inv1 * Vbsc_dVbse ; - - Q_sub0_dep_dVbs = - C_ESI / W_sub0 * (NdepmpNsub_inv1 * Vbsc_dVbse - Vbsc_dVbse) ; - - T1 = beta * (phi_s0_DEP - phi_b0_DEP) ; - T2 = exp(T1) ; - if( phi_s0_DEP >= phi_b0_DEP ) { - Q_s0_dVbs = 0.0 ; - } else { - T3 = exp( - beta * (phi_s0_DEP - Vbsc)) ; - T4 = exp( - beta * (phi_b0_DEP - Vbsc)) ; - T5 = sqrt(T2 - 1.0 - T1 + 1e-15 + here->HSM2_cnst1 * (T3 - T4)) ; - Q_s0_dVbs = here->HSM2_cnst0 / 2.0 / T5 * - (here->HSM2_cnst1 * (beta * T3 * Vbsc_dVbse - beta * T4 * Vbsc_dVbse) ) ; - } - - y2_dVgs = Cox_dVg * (Vgp - phi_s0_DEP) + Cox * Vgp_dVgs ; - y2_dVds = Cox_dVd * (Vgp - phi_s0_DEP) + Cox * Vgp_dVds ; - y2_dVbs = Cox_dVb * (Vgp - phi_s0_DEP) + Cox * Vgp_dVbs + Q_s0_dVbs + Q_b0_dep_dVbs + Q_sub0_dep_dVbs ; - - phi_s0_DEP_dVgs = - ( rev11 * y1_dVgs + rev12 * y2_dVgs ) ; - phi_s0_DEP_dVds = - ( rev11 * y1_dVds + rev12 * y2_dVds ) ; - phi_s0_DEP_dVbs = - ( rev11 * y1_dVbs + rev12 * y2_dVbs ) ; - - phi_b0_DEP_dVgs = - ( rev21 * y1_dVgs + rev22 * y2_dVgs ) ; - phi_b0_DEP_dVds = - ( rev21 * y1_dVds + rev22 * y2_dVds ) ; - phi_b0_DEP_dVbs = - ( rev21 * y1_dVbs + rev22 * y2_dVbs ) ; - - if( W_bsub0 > model->HSM2_tndep && depmode !=2 ) { - Fn_SU_CP2(phi_b0_DEP , phi_b0_DEP , phi_s0_DEP , 0.04, 2 , T1, T2 ) // HV_dlt=0.02 - phi_b0_DEP_dVgs = phi_b0_DEP_dVgs * T1 + phi_s0_DEP_dVgs * T2 ; - phi_b0_DEP_dVds = phi_b0_DEP_dVds * T1 + phi_s0_DEP_dVds * T2 ; - phi_b0_DEP_dVbs = phi_b0_DEP_dVbs * T1 + phi_s0_DEP_dVbs * T2 ; - } - - phi_j0_DEP = NdepmpNsub_inv1 * (NdepmpNsub * phi_b0_DEP + Vbsc - Vbi_DEP) ; - phi_j0_DEP_dVgs = NdepmpNsub_inv1 * NdepmpNsub * phi_b0_DEP_dVgs ; - phi_j0_DEP_dVds = NdepmpNsub_inv1 * NdepmpNsub * phi_b0_DEP_dVds ; - phi_j0_DEP_dVbs = NdepmpNsub_inv1 * NdepmpNsub * phi_b0_DEP_dVbs + NdepmpNsub_inv1 * Vbsc_dVbse ; - - phib_ref = (4.0 * phi_j0_DEP * phi_j0_DEP * C_ESI2 - 8.0 * phi_j0_DEP * C_ESI2 * phi_s0_DEP - + 4.0 * C_ESI2 * phi_s0_DEP * phi_s0_DEP - + 4.0 * phi_j0_DEP * q_Ndepm_esi * Tn2 - + 4.0 * phi_s0_DEP * q_Ndepm_esi * Tn2 - + Ndepm2 * C_QE2 * Tn2 * Tn2 ) / T10 ; - - phib_ref_dVgs = ( 8.0 * phi_j0_DEP * phi_j0_DEP_dVgs * C_ESI2 - 8.0 * phi_j0_DEP_dVgs * C_ESI2 * phi_s0_DEP - - 8.0 * phi_j0_DEP * C_ESI2 * phi_s0_DEP_dVgs + 8.0 * C_ESI2 * phi_s0_DEP * phi_s0_DEP_dVgs - + 4.0 * phi_j0_DEP_dVgs * q_Ndepm_esi * Tn2 - + 4.0 * phi_s0_DEP_dVgs * q_Ndepm_esi * Tn2 ) / T10 ; - phib_ref_dVds = ( 8.0 * phi_j0_DEP * phi_j0_DEP_dVds * C_ESI2 - 8.0 * phi_j0_DEP_dVds * C_ESI2 * phi_s0_DEP - - 8.0 * phi_j0_DEP * C_ESI2 * phi_s0_DEP_dVds + 8.0 * C_ESI2 * phi_s0_DEP * phi_s0_DEP_dVds - + 4.0 * phi_j0_DEP_dVds * q_Ndepm_esi * Tn2 - + 4.0 * phi_s0_DEP_dVds * q_Ndepm_esi * Tn2 ) / T10 ; - phib_ref_dVbs = ( 8.0 * phi_j0_DEP * phi_j0_DEP_dVbs * C_ESI2 - 8.0 * phi_j0_DEP_dVbs * C_ESI2 * phi_s0_DEP - - 8.0 * phi_j0_DEP * C_ESI2 * phi_s0_DEP_dVbs + 8.0 * C_ESI2 * phi_s0_DEP * phi_s0_DEP_dVbs - + 4.0 * phi_j0_DEP_dVbs * q_Ndepm_esi * Tn2 - + 4.0 * phi_s0_DEP_dVbs * q_Ndepm_esi * Tn2 ) / T10 ; - - T1 = beta * (phi_s0_DEP - phi_b0_DEP) ; - T1_dVgs = beta * (phi_s0_DEP_dVgs - phi_b0_DEP_dVgs) ; - T1_dVds = beta * (phi_s0_DEP_dVds - phi_b0_DEP_dVds) ; - T1_dVbs = beta * (phi_s0_DEP_dVbs - phi_b0_DEP_dVbs) ; - - T2 = exp(T1) ; - T2_dVgs = T1_dVgs * T2 ; - T2_dVds = T1_dVds * T2 ; - T2_dVbs = T1_dVbs * T2 ; - - if( phi_s0_DEP >= phi_b0_DEP ) { - - T3 = sqrt(T2 - 1.0e0 - T1 + 1e-15 ) ; - T3_dVgs = (T2_dVgs - T1_dVgs) / 2.0 / T3 ; - T3_dVds = (T2_dVds - T1_dVds) / 2.0 / T3 ; - T3_dVbs = (T2_dVbs - T1_dVbs) / 2.0 / T3 ; - - Q_s0 = - here->HSM2_cnst0 * T3 ; - - Q_s0_dep = 0.0 ; - Q_sub0 = 0.0 ; - - W_b0 = sqrt(C_2ESIpq_Ndepm * (phi_b0_DEP - phi_j0_DEP) ) ; - Fn_SU_CP( T9 , W_b0 , model->HSM2_tndep, 5e-8, 2 , T4 ) // HV_dlt=1e-8 - - W_sub0 = sqrt(C_2ESIpq_Nsub * (phi_j0_DEP - Vbsc + Vbi_DEP) ) ; - Q_b0_dep = T9 * q_Ndepm ; - Q_sub0_dep = - W_sub0 * q_Nsub ; - - /* derivative */ - Q_s0_dVgs = - here->HSM2_cnst0 * T3_dVgs ; - Q_s0_dVds = - here->HSM2_cnst0 * T3_dVds ; - Q_s0_dVbs = - here->HSM2_cnst0 * T3_dVbs ; - - Q_n0 = Q_s0 ; - Q_n0_dVgs = Q_s0_dVgs ; - Q_n0_dVds = Q_s0_dVds ; - Q_n0_dVbs = Q_s0_dVbs ; - - Q_b0_dep_dVgs = C_ESI / W_b0 * (phi_b0_DEP_dVgs - phi_j0_DEP_dVgs) * T4 ; - Q_b0_dep_dVds = C_ESI / W_b0 * (phi_b0_DEP_dVds - phi_j0_DEP_dVds) * T4 ; - Q_b0_dep_dVbs = C_ESI / W_b0 * (phi_b0_DEP_dVbs - phi_j0_DEP_dVbs) * T4 ; - - Q_sub0_dep_dVgs = - C_ESI / W_sub0 * phi_j0_DEP_dVgs ; - Q_sub0_dep_dVds = - C_ESI / W_sub0 * phi_j0_DEP_dVds ; - Q_sub0_dep_dVbs = - C_ESI / W_sub0 * (phi_j0_DEP_dVbs - Vbsc_dVbse) ; - - Q_sub0_dVgs = 0.0 ; - Q_sub0_dVds = 0.0 ; - Q_sub0_dVbs = 0.0 ; - - Q_s0_dep_dVgs = 0.0 ; - Q_s0_dep_dVds = 0.0 ; - Q_s0_dep_dVbs = 0.0 ; - - } else { - - T3 = exp( - beta * (phi_s0_DEP - Vbsc)) ; - T4 = exp( - beta * (phi_b0_DEP - Vbsc)) ; - T5 = sqrt(T2 - 1.0 - T1 + here->HSM2_cnst1 * (T3 - T4) + 1e-15) ; - Q_s0 = here->HSM2_cnst0 * T5 ; - - T3_dVgs = - beta * T3 * phi_s0_DEP_dVgs ; - T3_dVds = - beta * T3 * phi_s0_DEP_dVds ; - T3_dVbs = - beta * T3 * (phi_s0_DEP_dVbs - Vbsc_dVbse) ; - - T4_dVgs = - beta * T4 * phi_b0_DEP_dVgs ; - T4_dVds = - beta * T4 * phi_b0_DEP_dVds ; - T4_dVbs = - beta * T4 * (phi_b0_DEP_dVbs - Vbsc_dVbse) ; - - T5_dVgs = (T2_dVgs - T1_dVgs + here->HSM2_cnst1 * (T3_dVgs - T4_dVgs)) / 2.0 / T5 ; - T5_dVds = (T2_dVds - T1_dVds + here->HSM2_cnst1 * (T3_dVds - T4_dVds)) / 2.0 / T5 ; - T5_dVbs = (T2_dVbs - T1_dVbs + here->HSM2_cnst1 * (T3_dVbs - T4_dVbs)) / 2.0 / T5 ; - - Q_s0_dVgs = here->HSM2_cnst0 * T5_dVgs ; - Q_s0_dVds = here->HSM2_cnst0 * T5_dVds ; - Q_s0_dVbs = here->HSM2_cnst0 * T5_dVbs ; - - if( W_bsub0 > model->HSM2_tndep && depmode !=2 ) { - Q_sub0 = 0.0 ; - Q_s0_dep = 0.0 ; - - Q_sub0_dVgs = 0.0 ; - Q_sub0_dVds = 0.0 ; - Q_sub0_dVbs = 0.0 ; - - Q_s0_dep_dVgs = 0.0 ; - Q_s0_dep_dVds = 0.0 ; - Q_s0_dep_dVbs = 0.0 ; - } else { - T3 = exp( - beta * (phi_s0_DEP - Vbsc)) ; - T4 = exp( - beta * (phi_b0_DEP - Vbsc)) ; - T5 = sqrt( - T1 + here->HSM2_cnst1 * (T3 - T4)) ; - Q_sub0 = here->HSM2_cnst0 * T5 - here->HSM2_cnst0 * sqrt( - T1) ; - T6 = sqrt(T2 - 1.0e0 - T1 + 1e-15) ; - Q_s0_dep = here->HSM2_cnst0 * T6 ; - - Q_sub0_dVgs = here->HSM2_cnst0 / 2.0 / T5 * ( - beta * (phi_s0_DEP_dVgs - phi_b0_DEP_dVgs) - + here->HSM2_cnst1 * ( - beta * T3 * phi_s0_DEP_dVgs + beta * T4 * phi_b0_DEP_dVgs)) - - here->HSM2_cnst0 / 2.0 / sqrt( - T1) * ( - beta * (phi_s0_DEP_dVgs - phi_b0_DEP_dVgs)) ; - Q_sub0_dVds = here->HSM2_cnst0 / 2.0 / T5 * ( - beta * (phi_s0_DEP_dVds - phi_b0_DEP_dVds) - + here->HSM2_cnst1 * ( - beta * T3 * phi_s0_DEP_dVds + beta * T4 * phi_b0_DEP_dVds)) - - here->HSM2_cnst0 / 2.0 / sqrt( - T1) * ( - beta * (phi_s0_DEP_dVds - phi_b0_DEP_dVds)) ; - Q_sub0_dVbs = here->HSM2_cnst0 / 2.0 / T5 * ( - beta * (phi_s0_DEP_dVbs - phi_b0_DEP_dVbs) - + here->HSM2_cnst1 * ( - beta * T3 * (phi_s0_DEP_dVbs - Vbsc_dVbse) + beta * T4 * (phi_b0_DEP_dVbs - Vbsc_dVbse))) - - here->HSM2_cnst0 / 2.0 / sqrt( - T1) * ( - beta * (phi_s0_DEP_dVbs - phi_b0_DEP_dVbs)) ; - - Q_s0_dep_dVgs = here->HSM2_cnst0 / 2.0 / T6 * beta * (phi_s0_DEP_dVgs - phi_b0_DEP_dVgs) * (T2 - 1) ; - Q_s0_dep_dVds = here->HSM2_cnst0 / 2.0 / T6 * beta * (phi_s0_DEP_dVds - phi_b0_DEP_dVds) * (T2 - 1) ; - Q_s0_dep_dVbs = here->HSM2_cnst0 / 2.0 / T6 * beta * (phi_s0_DEP_dVbs - phi_b0_DEP_dVbs) * (T2 - 1) ; - - } - - Q_n0 = 0.0 ; - Q_n0_dVgs = 0.0 ; - Q_n0_dVds = 0.0 ; - Q_n0_dVbs = 0.0 ; - - - T1 = phi_b0_DEP - phi_j0_DEP ; - Fn_SL_CP( T2 , T1 , 0.0 , 0.1, 2 , T0 ) - W_b0 = sqrt(C_2ESIpq_Ndepm * (T2) ) ; - Fn_SU_CP( T9 , W_b0 , model->HSM2_tndep, 5e-8, 2 , T3 ) // HV_dlt=1e-8 - W_sub0 = sqrt(C_2ESIpq_Nsub * (phi_j0_DEP - Vbsc + Vbi_DEP) ) ; - Q_b0_dep = T9 * q_Ndepm ; - Q_sub0_dep = - W_sub0 * q_Nsub ; - - Q_b0_dep_dVgs = C_ESI / W_b0 * (phi_b0_DEP_dVgs - phi_j0_DEP_dVgs) * T0 * T3 ; - Q_b0_dep_dVds = C_ESI / W_b0 * (phi_b0_DEP_dVds - phi_j0_DEP_dVds) * T0 * T3 ; - Q_b0_dep_dVbs = C_ESI / W_b0 * (phi_b0_DEP_dVbs - phi_j0_DEP_dVbs) * T0 * T3 ; - - Q_sub0_dep_dVgs = - C_ESI / W_sub0 * phi_j0_DEP_dVgs ; - Q_sub0_dep_dVds = - C_ESI / W_sub0 * phi_j0_DEP_dVds ; - Q_sub0_dep_dVbs = - C_ESI / W_sub0 * (phi_j0_DEP_dVbs - Vbsc_dVbse) ; - - } - - T1 = phi_b0_DEP - phi_j0_DEP ; - Fn_SL_CP( T2 , T1 , 0.0 , 0.1, 2 , T0 ) - W_b0 = sqrt(C_2ESIpq_Ndepm * (T2) ) ; - Fn_SU_CP( T9, W_b0, model->HSM2_tndep, 1e-8, 2 , T3 ) - W_b0_dVgs = C_ESI / q_Ndepm / W_b0 * (phi_b0_DEP_dVgs - phi_j0_DEP_dVgs) * T0 * T3 ; - W_b0_dVds = C_ESI / q_Ndepm / W_b0 * (phi_b0_DEP_dVds - phi_j0_DEP_dVds) * T0 * T3 ; - W_b0_dVbs = C_ESI / q_Ndepm / W_b0 * (phi_b0_DEP_dVbs - phi_j0_DEP_dVbs) * T0 * T3 ; - - T1 = phi_b0_DEP - phi_s0_DEP ; - Fn_SL_CP( T2 , T1 , 0.0 , 0.1, 2 , T0 ) // HV_dlt=0.05 - W_s0 = sqrt(C_2ESIpq_Ndepm * (T2) ) ; - - W_s0_dVgs = C_ESI / q_Ndepm / W_s0 * (phi_b0_DEP_dVgs - phi_s0_DEP_dVgs) * T0 ; - W_s0_dVds = C_ESI / q_Ndepm / W_s0 * (phi_b0_DEP_dVds - phi_s0_DEP_dVds) * T0 ; - W_s0_dVbs = C_ESI / q_Ndepm / W_s0 * (phi_b0_DEP_dVbs - phi_s0_DEP_dVbs) * T0 ; - - T1 = model->HSM2_tndep - T9 - W_s0 ; - Fn_SL_CP( W_res0 , T1 , 1.0e-20 , 1.0e-14, 2 , T0 ) // HV_dlt=1.0e-25,1.0e-18 - - Qn_res0 = - W_res0 * q_Ndepm ; - Qn_res0_dVgs = (W_s0_dVgs + W_b0_dVgs) * q_Ndepm * T0 ; - Qn_res0_dVds = (W_s0_dVds + W_b0_dVds) * q_Ndepm * T0 ; - Qn_res0_dVbs = (W_s0_dVbs + W_b0_dVbs) * q_Ndepm * T0 ; - - if( W_bsub0 > model->HSM2_tndep && depmode !=2 ) { - Fn_SU_CP(T3 , phi_s0_DEP , phi_b0_DEP_lim , 0.8, 2 , T1 ) - T3_dVgs = phi_s0_DEP_dVgs * T1 ; - T3_dVds = phi_s0_DEP_dVds * T1 ; - T3_dVbs = phi_s0_DEP_dVbs * T1 ; - } else { - Fn_SU_CP(T3 , phib_ref , phi_b0_DEP_lim , 0.8, 2 , T0 ) - T3_dVgs = phib_ref_dVgs * T0 ; - T3_dVds = phib_ref_dVds * T0 ; - T3_dVbs = phib_ref_dVbs * T0 ; - } - - T4 = exp(beta * (T3 - phi_b0_DEP_lim)) ; - T5 = - C_QE * here->HSM2_ndepm ; - Qn_bac0 = T5 * T4 * T9 ; - Qn_bac0_dVgs = T5 * (beta * T4 * T3_dVgs * T9 + T4 * W_b0_dVgs) ; - Qn_bac0_dVds = T5 * (beta * T4 * T3_dVds * T9 + T4 * W_b0_dVds) ; - Qn_bac0_dVbs = T5 * (beta * T4 * T3_dVbs * T9 + T4 * W_b0_dVbs) ; - - - T1 = phi_s0_DEP - phi_b0_DEP_lim ; - Fn_SL_CP( T2 , T1 , 0.0, Ps_delta, 2 , T0 ) - T2_dVgs = phi_s0_DEP_dVgs * T0 ; - T2_dVds = phi_s0_DEP_dVds * T0 ; - T2_dVbs = phi_s0_DEP_dVbs * T0 ; - - T3 = exp(beta * (T2)) ; - T3_dVgs = beta * T3 * T2_dVgs ; - T3_dVds = beta * T3 * T2_dVds ; - T3_dVbs = beta * T3 * T2_dVbs ; - - T4 = T3 - 1.0 - beta * T2 ; - - T4_dVgs = T3_dVgs - beta * T2_dVgs ; - T4_dVds = T3_dVds - beta * T2_dVds ; - T4_dVbs = T3_dVbs - beta * T2_dVbs ; - - T5 = sqrt(T4) ; - Q_n0_cur = - here->HSM2_cnst0 * T5 ; - Q_n0_cur_dVgs = - here->HSM2_cnst0 / 2.0 / T5 * T4_dVgs ; - Q_n0_cur_dVds = - here->HSM2_cnst0 / 2.0 / T5 * T4_dVds ; - Q_n0_cur_dVbs = - here->HSM2_cnst0 / 2.0 / T5 * T4_dVbs ; - - T4 = exp(beta * Ps_delta0) - 1.0 - beta * Ps_delta0 ; - T5 = sqrt(T4) ; - Qn_delta = here->HSM2_cnst0 * T5 ; - - - - /*-----------------------------------------------------------* - * Start point of phi_sL_DEP(= phi_s0_DEP + Pds) calculation.(label) - *-----------------*/ - - /* Vdseff (begin) */ - Vdsorg = Vds ; - - if( Vds > 1e-3 ) { - - T2 = q_Ndepm_esi / ( Cox * Cox ) ; - T4 = - 2.0e0 * T2 / Cox ; - T2_dVb = T4 * Cox_dVb ; - T2_dVd = T4 * Cox_dVd ; - T2_dVg = T4 * Cox_dVg ; - - T0 = Vgp + DEPQFN1 - beta_inv - Vbsz ; - T0_dVg = Vgp_dVgs ; - T0_dVd = Vgp_dVds - Vbsz_dVds ; - T0_dVb = Vgp_dVbs - Vbsz_dVbs ; - - T4 = 1.0e0 + 2.0e0 / T2 * T0 ; - T4_dVg = 2.0 / T2 * T0_dVg - 2.0 / T2 / T2 * T0 * T2_dVg ; - T4_dVd = 2.0 / T2 * T0_dVd - 2.0 / T2 / T2 * T0 * T2_dVd ; - T4_dVb = 2.0 / T2 * T0_dVb - 2.0 / T2 / T2 * T0 * T2_dVb ; - - Fn_SL_CP( T9 , T4 , 0 , DEPQFN_dlt, 2 , T0 ) - T9_dVg = T4_dVg * T0 ; - T9_dVd = T4_dVd * T0 ; - T9_dVb = T4_dVb * T0 ; - - T9 +=small ; - T3 = sqrt( T9 ) ; - T3_dVg = 0.5 / T3 * T9_dVg ; - T3_dVd = 0.5 / T3 * T9_dVd ; - T3_dVb = 0.5 / T3 * T9_dVb ; - - T10 = Vgp + DEPQFN1 + T2 * ( 1.0e0 - T3 ) ; - T10_dVb = Vgp_dVbs + T2_dVb * ( 1.0e0 - T3 ) - T2 * T3_dVb ; - T10_dVd = Vgp_dVds + T2_dVd * ( 1.0e0 - T3 ) - T2 * T3_dVd ; - T10_dVg = Vgp_dVgs + T2_dVg * ( 1.0e0 - T3 ) - T2 * T3_dVg ; - - Fn_SL_CP( T10 , T10 , DEPQFN3, 0.2, 4 , T0 ) -// T10 = T10 + epsm10 ; - T10_dVb *=T0 ; - T10_dVd *=T0 ; - T10_dVg *=T0 ; - - T1 = Vds / T10 ; - T2 = Fn_Pow( T1 , here->HSM2_ddlt - 1.0e0 ) ; - T7 = T2 * T1 ; - T0 = here->HSM2_ddlt * T2 / ( T10 * T10 ) ; - T7_dVb = T0 * ( - Vds * T10_dVb ) ; - T7_dVd = T0 * ( T10 - Vds * T10_dVd ) ; - T7_dVg = T0 * ( - Vds * T10_dVg ) ; - - T3 = 1.0 + T7 ; - T4 = Fn_Pow( T3 , 1.0 / here->HSM2_ddlt - 1.0 ) ; - T6 = T4 * T3 ; - T0 = T4 / here->HSM2_ddlt ; - T6_dVb = T0 * T7_dVb ; - T6_dVd = T0 * T7_dVd ; - T6_dVg = T0 * T7_dVg ; - - Vdseff = Vds / T6 ; - T0 = 1.0 / ( T6 * T6 ) ; - Vdseff0_dVbs = - Vds * T6_dVb * T0 ; - Vdseff0_dVds = ( T6 - Vds * T6_dVd ) * T0 ; - Vdseff0_dVgs = - Vds * T6_dVg * T0 ; - - Fn_SL_CP( Vgpp , Vgp , 0.0 , 0.5, 2 , T0 ) - Vgpp_dVgs = T0 * Vgp_dVgs ; - Vgpp_dVds = T0 * Vgp_dVds ; - Vgpp_dVbs = T0 * Vgp_dVbs ; - - T1 = Vgpp * 0.8 ; - T1_dVg = Vgpp_dVgs * 0.8 ; - T1_dVd = Vgpp_dVds * 0.8 ; - T1_dVb = Vgpp_dVbs * 0.8 ; - - Fn_SU_CP3( Vds , Vdseff , Vgpp , T1, 2 , T3, T4, T5 ) - Vdseff_dVgs = Vdseff0_dVgs * T3 + Vgpp_dVgs * T4 + T1_dVg * T5 ; - Vdseff_dVds = Vdseff0_dVds * T3 + Vgpp_dVds * T4 + T1_dVd * T5 ; - Vdseff_dVbs = Vdseff0_dVbs * T3 + Vgpp_dVbs * T4 + T1_dVb * T5 ; - - } else { - - Vdseff = Vds ; - Vdseff0_dVgs = 0.0 ; - Vdseff0_dVds = 1.0 ; - Vdseff0_dVbs = 0.0 ; - - Vdseff_dVgs = 0.0 ; - Vdseff_dVds = 1.0 ; - Vdseff_dVbs = 0.0 ; - - } - /* Vdseff (end) */ - - /*---------------------------------------------------* - * start of phi_sL_DEP calculation. (label) - *--------------------------------*/ - - if( Vds < 0.0e0 ) { - - phi_sL_DEP = phi_s0_DEP ; - phi_sL_DEP_dVgs = phi_s0_DEP_dVgs ; - phi_sL_DEP_dVds = phi_s0_DEP_dVds ; - phi_sL_DEP_dVbs = phi_s0_DEP_dVbs ; - - phi_bL_DEP = phi_b0_DEP ; - phi_bL_DEP_dVgs = phi_b0_DEP_dVgs ; - phi_bL_DEP_dVds = phi_b0_DEP_dVds ; - phi_bL_DEP_dVbs = phi_b0_DEP_dVbs ; - - phi_jL_DEP = phi_j0_DEP ; - phi_jL_DEP_dVgs = phi_j0_DEP_dVgs ; - phi_jL_DEP_dVds = phi_j0_DEP_dVds ; - phi_jL_DEP_dVbs = phi_j0_DEP_dVbs ; - - Q_subL = Q_sub0 ; - Q_subL_dVgs = Q_sub0_dVgs ; - Q_subL_dVds = Q_sub0_dVds ; - Q_subL_dVbs = Q_sub0_dVbs ; - - Q_nL = Q_n0 ; - Q_nL_dVgs = Q_n0_dVgs ; - Q_nL_dVds = Q_n0_dVds ; - Q_nL_dVbs = Q_n0_dVbs ; - - Q_bL_dep = Q_b0_dep ; - Q_bL_dep_dVgs = Q_b0_dep_dVgs ; - Q_bL_dep_dVds = Q_b0_dep_dVds ; - Q_bL_dep_dVbs = Q_b0_dep_dVbs ; - - Q_subL_dep = Q_sub0_dep ; - Q_subL_dep_dVgs = Q_sub0_dep_dVgs ; - Q_subL_dep_dVds = Q_sub0_dep_dVds ; - Q_subL_dep_dVbs = Q_sub0_dep_dVbs ; - - Q_sL_dep = Q_s0_dep ; - Q_sL_dep_dVgs = Q_s0_dep_dVgs ; - Q_sL_dep_dVds = Q_s0_dep_dVds ; - Q_sL_dep_dVbs = Q_s0_dep_dVbs ; - - Q_nL_cur = Q_n0_cur ; - Q_nL_cur_dVgs = Q_n0_cur_dVgs ; - Q_nL_cur_dVds = Q_n0_cur_dVds ; - Q_nL_cur_dVbs = Q_n0_cur_dVbs ; - - } else { - - W_bsubL = sqrt(C_2ESIpq_Ndepm * here->HSM2_nsub / (here->HSM2_nsub + here->HSM2_ndepm) * (Vds - Vbsc + Vbi_DEP)) ; - - /*---------------------------------------------------* - * region judgement - *------------------*/ - - /* fully depleted case */ - if( W_bsubL > model->HSM2_tndep ) { - - Vgp0 = Vds ; - W_bL = model->HSM2_tndep ; - phi_bL_DEP = Vds ; - phi_bL_DEP_lim = Vds ; - phi_jL_DEP = phi_bL_DEP - C_2ESIpq_Ndepm_inv * W_bL * W_bL ; - - Vgp0old = Vgp0 ; - phi_jL_DEP_old = phi_jL_DEP ; - - Q_bL_dep = W_bL * q_Ndepm ; - - for ( lp_s0 = 1 ; lp_s0 <= lp_se_max + 1 ; lp_s0 ++ ) { - - W_bL = sqrt(C_2ESIpq_Ndepm * (phi_bL_DEP - phi_jL_DEP) ) ; - Fn_SU_CP( W_bL , W_bL , model->HSM2_tndep , 1e-8, 2 , T0 ) - W_subL = sqrt(C_2ESIpq_Nsub * (phi_jL_DEP - Vbsc + Vbi_DEP) ) ; - - Q_bL_dep = W_bL * q_Ndepm ; - Q_bL_dep_dPd = - C_ESI / W_bL * T0 ; - Q_subL_dep = - W_subL * q_Nsub ; - Q_subL_dep_dPd = - C_ESI / W_subL ; - - y1 = Cox * (Vgp0 - phi_bL_DEP) + Q_bL_dep + Q_subL_dep ; - y11 = Cox ; - y12 = Q_bL_dep_dPd + Q_subL_dep_dPd ; - - y2 = phi_jL_DEP - NdepmpNsub_inv1 * (NdepmpNsub * phi_bL_DEP + Vbsc - Vbi_DEP) ; - y21 = 0.0 ; - y22 = 1.0 ; - - dety = y11 * y22 - y21 * y12; - rev11 = (y22) / dety ; - rev12 = ( - y12) / dety ; - rev21 = ( - y21) / dety ; - rev22 = (y11) / dety ; - - if( fabs( rev11 * y1 + rev12 * y2 ) > 0.5 ) { - Vgp0 = Vgp0 - 0.5 * Fn_Sgn( rev11 * y1 + rev12 * y2 ) ; - phi_jL_DEP = phi_jL_DEP - 0.5 * Fn_Sgn( rev21 * y1 + rev22 * y2 ) ; - } else { - Vgp0 = Vgp0 - ( rev11 * y1 + rev12 * y2 ) ; - phi_jL_DEP = phi_jL_DEP - ( rev21 * y1 + rev22 * y2 ) ; - } - - if( fabs(Vgp0 - Vgp0old) <= ps_conv && - fabs(phi_jL_DEP - phi_jL_DEP_old) <= ps_conv ) lp_s0=lp_se_max + 1 ; - - Vgp0old = Vgp0 ; - phi_jL_DEP_old = phi_jL_DEP ; - } - phi_jL_DEP_acc = phi_jL_DEP ; - - W_subL = model->HSM2_tndep * NdepmpNsub ; - phi_jL_DEP = C_2ESIpq_Nsub_inv * W_subL * W_subL + Vbsc - Vbi_DEP ; - phi_bL_DEP = phi_jL_DEP + C_2ESIpq_Ndepm_inv * Tn2 ; - phi_sL_DEP = phi_bL_DEP ; - Psbmax = phi_bL_DEP ; - Vgp1 = phi_bL_DEP ; - if( Vgp > Vgp0 ) { - depmode = 1 ; - } else if(Vgp > Vgp1 ) { - depmode = 3 ; - } else { - depmode = 2 ; - } - - /* else */ - } else { - Vgp0 = Vds ; - Vgp1 = Vgp0 ; - Psbmax = Vgp0 ; - phi_bL_DEP_lim = Vgp0 ; - W_bL = W_bsubL ; - W_subL = W_bL * NdepmpNsub ; - phi_jL_DEP = C_2ESIpq_Nsub_inv * W_subL * W_subL + Vbsc - Vbi_DEP ; - phi_bL_DEP = C_2ESIpq_Ndepm_inv * W_bL * W_bL + phi_jL_DEP ; - phi_jL_DEP_acc = phi_jL_DEP ; - if( Vgp > Vgp0 ) { - depmode = 1 ; - } else { - depmode = 2 ; - } - - } - - T1 = C_2ESI_q_Ndepm * ( Psbmax - ( - here->HSM2_Pb2n + Vbsc)) ; - if ( T1 > 0.0 ) { - vthn = - here->HSM2_Pb2n + Vbsc - sqrt(T1) / Cox ; - } else { - vthn = - here->HSM2_Pb2n + Vbsc ; - } - - /*---------------------------------------------------* - * initial potential phi_s0_DEP,phi_bL_DEP,phi_jL_DEP calculated. - *------------------*/ - - - /* accumulation region */ - if( Vgp > Vgp0 ) { - phi_jL_DEP = phi_jL_DEP_acc ; - phi_bL_DEP = Vds ; - phi_sL_DEP_ini = log(afact * Vgp * Vgp) / (beta + 2.0 / Vgp) + Vds ; - - if( phi_sL_DEP_ini < phi_bL_DEP_lim + ps_conv23 ) phi_sL_DEP_ini = phi_bL_DEP_lim + ps_conv23 ; - - /* fully depleted region */ - } else if( Vgp > Vgp1 ) { - - phi_sL_DEP_ini = phi_sL_DEP ; - - /* depletion & inversion */ - - } else { - - /* depletion */ - if( Vgp > vthn ) { - bfact = - 2.0 * afact * Vgp + beta ; - cfact = afact * Vgp * Vgp - beta * phi_bL_DEP ; - phi_bL_DEP_old = phi_bL_DEP ; - phi_sL_DEP_ini = ( - bfact + sqrt(bfact * bfact - 4.0 * afact * cfact)) / 2.0 / afact ; - if( phi_sL_DEP_ini > Psbmax - ps_conv23 ) phi_sL_DEP_ini = Psbmax - ps_conv23 ; - W_sL = sqrt(C_2ESIpq_Ndepm * (phi_bL_DEP - phi_sL_DEP_ini) ) ; - W_bL = sqrt(C_2ESIpq_Ndepm * (phi_bL_DEP - phi_jL_DEP) ) ; - - if( W_sL + W_bL > model->HSM2_tndep ) { - for ( lp_s0 = 1 ; lp_s0 <= lp_se_max + 1 ; lp_s0 ++ ) { - - y0 = W_sL + W_bL - model->HSM2_tndep ; - - dydPsm = C_ESI / q_Ndepm / W_sL - + C_ESI / q_Ndepm * ( 1.0 - (here->HSM2_ndepm - / here->HSM2_nsub) / ( 1.0 + (NdepmpNsub))) / W_bL ; - - if( fabs(y0 / dydPsm) > 0.5 ) { - phi_bL_DEP = phi_bL_DEP - 0.5 * Fn_Sgn(y0 / dydPsm) ; - } else { - phi_bL_DEP = phi_bL_DEP - y0 / dydPsm ; - } - if( (phi_bL_DEP - Vbsc + Vbi_DEP) < epsm10 ) - phi_bL_DEP=Vbsc - Vbi_DEP + epsm10 ; - - cfact = afact * Vgp * Vgp - beta * phi_bL_DEP ; - T1 = bfact * bfact - 4.0 * afact * cfact ; - if( T1 > 0.0 ) { - phi_sL_DEP_ini = ( - bfact + sqrt(T1)) / 2.0 / afact ; - } else { - phi_sL_DEP_ini = ( - bfact) / 2.0 / afact ; - } - - if( phi_sL_DEP_ini > Psbmax ) phi_sL_DEP_ini = Psbmax ; - if( phi_sL_DEP_ini > phi_bL_DEP ) { - phi_sL_DEP_ini = phi_bL_DEP - ps_conv23 ; - lp_s0=lp_se_max + 1 ; - } - W_sL = sqrt(C_2ESIpq_Ndepm * (phi_bL_DEP - phi_sL_DEP_ini) ) ; - phi_jL_DEP = ( NdepmpNsub * phi_bL_DEP - + Vbsc - Vbi_DEP) / (1.0 + NdepmpNsub) ; - W_bL = sqrt(C_2ESIpq_Ndepm * (phi_bL_DEP - phi_jL_DEP) ) ; - - if( fabs(phi_bL_DEP - phi_bL_DEP_old) <= 1.0e-8 ) lp_s0=lp_se_max + 1 ; - phi_bL_DEP_old = phi_bL_DEP ; - } - } - - /* inversion */ - } else { - - phi_bL_DEP = phi_b0_DEP ; - phi_jL_DEP = phi_j0_DEP ; - phi_sL_DEP_ini = phi_s0_DEP ; - - } - - } - - phi_b0_DEP_ini = phi_bL_DEP ; - /* */ - /* solve poisson at drain side */ - /* */ - - flg_conv = 0 ; - - /* accumulation */ - - phi_sL_DEP = phi_sL_DEP_ini ; - phi_bL_DEP = phi_b0_DEP_ini ; - - phi_sL_DEP_old = phi_sL_DEP ; - phi_bL_DEP_old = phi_bL_DEP ; - - for ( lp_s0 = 1 ; lp_s0 <= lp_se_max + 1 ; lp_s0 ++ ) { - - phi_jL_DEP = NdepmpNsub_inv1 * (NdepmpNsub * phi_bL_DEP + Vbsc - Vbi_DEP) ; - phi_jL_DEP_dPb = NdepmpNsub_inv1 * NdepmpNsub ; - - T1 = phi_bL_DEP - phi_jL_DEP ; - Fn_SL_CP( T2 , T1 , 0.0 , 0.1, 2 , T7 ) - W_bL = sqrt(C_2ESIpq_Ndepm * (T2) ) ; - Fn_SU_CP( W_bL , W_bL , model->HSM2_tndep , 1e-8, 2 , T8 ) - W_subL = sqrt(C_2ESIpq_Nsub * (phi_jL_DEP - Vbsc + Vbi_DEP) ) ; - Q_bL_dep = W_bL * q_Ndepm ; - Q_bL_dep_dPb = C_ESI / W_bL * T7 * T8 ; - Q_bL_dep_dPd = - C_ESI / W_bL * T7 * T8 ; - Q_subL_dep = - W_subL * q_Nsub ; - Q_subL_dep_dPd = - C_ESI / W_subL ; - - T10 = 8.0 * q_Ndepm_esi * Tn2 ; - phib_ref = (4.0 * phi_jL_DEP * phi_jL_DEP * C_ESI2 - 8.0 * phi_jL_DEP * C_ESI2 * phi_sL_DEP - + 4.0 * C_ESI2 * phi_sL_DEP * phi_sL_DEP - + 4.0 * phi_jL_DEP * q_Ndepm_esi * Tn2 - + 4.0 * phi_sL_DEP * q_Ndepm_esi * Tn2 - + Ndepm2 * C_QE2 * Tn2 * Tn2 ) / T10 ; - phib_ref_dPs = ( - 8.0 * phi_jL_DEP * C_ESI2 + 8.0 * C_ESI2 * phi_sL_DEP - + 4.0 * q_Ndepm_esi * Tn2 ) / T10 ; - phib_ref_dPd = ( 8.0 * phi_jL_DEP * C_ESI2 - 8.0 * C_ESI2 * phi_sL_DEP - + 4.0 * q_Ndepm_esi * Tn2 ) / T10 ; - - T1 = beta * (phi_sL_DEP - phi_bL_DEP) ; - T2 = exp(T1) ; - if( phi_sL_DEP >= phi_bL_DEP ) { - Q_sL = - here->HSM2_cnst0 * sqrt(T2 - 1.0 - T1 + 1e-15) ; - Q_sL_dPs = 0.5 * here->HSM2_cnst0 * here->HSM2_cnst0 / Q_sL * (beta * T2 - beta) ; - Q_sL_dPb = - Q_sL_dPs ; - } else { - T3 = exp( - beta * (phi_sL_DEP - Vbsc)) ; - T4 = exp( - beta * (phi_bL_DEP - Vbsc)) ; - Q_sL = here->HSM2_cnst0 * sqrt(T2 - 1.0 - T1 + here->HSM2_cnst1 * (T3 - T4) + 1e-15) ; - T5 = 0.5 * here->HSM2_cnst0 * here->HSM2_cnst0 / Q_sL ; - Q_sL_dPs = T5 * (beta * T2 - beta + here->HSM2_cnst1 * ( - beta * T3) ) ; - Q_sL_dPb = T5 * ( - beta * T2 + beta + here->HSM2_cnst1 * beta * T4 ) ; - } - - Fn_SU_CP2( T1 , phib_ref , phi_bL_DEP_lim , sm_delta, 4 , T9, T11 ) - - y1 = phi_bL_DEP - T1 ; - y11 = - phib_ref_dPs * T9 ; - y12 = 1.0 - phib_ref_dPd * phi_jL_DEP_dPb * T9 ; - - y2 = Cox * (Vgp - phi_sL_DEP) + Q_sL + Q_bL_dep + Q_subL_dep ; - y21 = - Cox + Q_sL_dPs ; - y22 = Q_sL_dPb + Q_bL_dep_dPb + Q_bL_dep_dPd * phi_jL_DEP_dPb + Q_subL_dep_dPd * phi_jL_DEP_dPb ; - - dety = y11 * y22 - y21 * y12; - rev11 = (y22) / dety ; - rev12 = ( - y12) / dety ; - rev21 = ( - y21) / dety ; - rev22 = (y11) / dety ; - if( fabs( rev21 * y1 + rev22 * y2 ) > 0.2 ) { // HV_dlt=0.5 - phi_sL_DEP = phi_sL_DEP - 0.2 * Fn_Sgn( rev11 * y1 + rev12 * y2 ) ; - phi_bL_DEP = phi_bL_DEP - 0.2 * Fn_Sgn( rev21 * y1 + rev22 * y2 ) ; - } else { - phi_sL_DEP = phi_sL_DEP - ( rev11 * y1 + rev12 * y2 ) ; - phi_bL_DEP = phi_bL_DEP - ( rev21 * y1 + rev22 * y2 ) ; - } - - if( fabs(phi_sL_DEP - phi_sL_DEP_old) <= ps_conv && fabs(phi_bL_DEP - phi_bL_DEP_old) <= ps_conv ) { - lp_s0=lp_se_max + 1 ; - flg_conv = 1 ; - } - - phi_sL_DEP_old = phi_sL_DEP ; - phi_bL_DEP_old = phi_bL_DEP ; - - } - if( flg_conv == 0 ) { - printf( "*** warning(HiSIM(%s)): Went Over Iteration Maximum(Psl)\n",model->HSM2modName ) ; - printf( " Vbse = %7.3f Vdse = %7.3f Vgse = %7.3f\n" ,Vbse , Vdse , Vgse ) ; - } - - /* caluculate derivative */ - - y1_dVgs = - Vdseff_dVgs * T11 ; - y1_dVds = - Vdseff_dVds * T11 ; - y1_dVbs = - (8.0 * phi_jL_DEP * C_ESI2 - 8.0 * C_ESI2 * phi_sL_DEP - + 4.0 * q_Ndepm_esi * Tn2) / T10 - * T9 * NdepmpNsub_inv1 * Vbsc_dVbse - Vdseff_dVbs * T11 ; - - Q_bL_dep_dVbs = - C_ESI / W_bL * T7 * T8 * NdepmpNsub_inv1 * Vbsc_dVbse ; - - Q_subL_dep_dVbs = - C_ESI / W_subL * (NdepmpNsub_inv1 * Vbsc_dVbse - Vbsc_dVbse) ; - - T1 = beta * (phi_sL_DEP - phi_bL_DEP) ; - T2 = exp(T1) ; - if( phi_sL_DEP >= phi_bL_DEP ) { - Q_sL_dVbs = 0.0 ; - } else { - T3 = exp( - beta * (phi_sL_DEP - Vbsc)) ; - T4 = exp( - beta * (phi_bL_DEP - Vbsc)) ; - T5 = sqrt(T2 - 1.0 - T1 + 1e-15 + here->HSM2_cnst1 * (T3 - T4)) ; - Q_sL_dVbs = here->HSM2_cnst0 / 2.0 / T5 * - (here->HSM2_cnst1 * (beta * T3 * Vbsc_dVbse - beta * T4 * Vbsc_dVbse) ) ; - } - - y2_dVgs = Cox_dVg * (Vgp - phi_sL_DEP) + Cox * Vgp_dVgs ; - y2_dVds = Cox_dVd * (Vgp - phi_sL_DEP) + Cox * Vgp_dVds ; - y2_dVbs = Cox_dVb * (Vgp - phi_sL_DEP) + Cox * Vgp_dVbs + Q_sL_dVbs + Q_bL_dep_dVbs + Q_subL_dep_dVbs ; - - phi_sL_DEP_dVgs = - ( rev11 * y1_dVgs + rev12 * y2_dVgs ) ; - phi_sL_DEP_dVds = - ( rev11 * y1_dVds + rev12 * y2_dVds ) ; - phi_sL_DEP_dVbs = - ( rev11 * y1_dVbs + rev12 * y2_dVbs ) ; - - phi_bL_DEP_dVgs = - ( rev21 * y1_dVgs + rev22 * y2_dVgs ) ; - phi_bL_DEP_dVds = - ( rev21 * y1_dVds + rev22 * y2_dVds ) ; - phi_bL_DEP_dVbs = - ( rev21 * y1_dVbs + rev22 * y2_dVbs ) ; - - if( W_bsubL > model->HSM2_tndep && depmode !=2 ) { - Fn_SU_CP2(phi_bL_DEP , phi_bL_DEP , phi_sL_DEP , 0.04, 2 , T1, T2 ) // HV_dlt=0.02 - phi_bL_DEP_dVgs = phi_bL_DEP_dVgs * T1 + phi_sL_DEP_dVgs * T2 ; - phi_bL_DEP_dVds = phi_bL_DEP_dVds * T1 + phi_sL_DEP_dVds * T2 ; - phi_bL_DEP_dVbs = phi_bL_DEP_dVbs * T1 + phi_sL_DEP_dVbs * T2 ; - } - - phi_jL_DEP = NdepmpNsub_inv1 * (NdepmpNsub * phi_bL_DEP + Vbsc - Vbi_DEP) ; - phi_jL_DEP_dVgs = NdepmpNsub_inv1 * NdepmpNsub * phi_bL_DEP_dVgs ; - phi_jL_DEP_dVds = NdepmpNsub_inv1 * NdepmpNsub * phi_bL_DEP_dVds ; - phi_jL_DEP_dVbs = NdepmpNsub_inv1 * NdepmpNsub * phi_bL_DEP_dVbs + NdepmpNsub_inv1 * Vbsc_dVbse ; - - phib_ref = (4.0 * phi_jL_DEP * phi_jL_DEP * C_ESI2 - 8.0 * phi_jL_DEP * C_ESI2 * phi_sL_DEP - + 4.0 * C_ESI2 * phi_sL_DEP * phi_sL_DEP - + 4.0 * phi_jL_DEP * q_Ndepm_esi * Tn2 - + 4.0 * phi_sL_DEP * q_Ndepm_esi * Tn2 - + Ndepm2 * C_QE2 * Tn2 * Tn2 ) / T10 ; - - phib_ref_dVgs = ( 8.0 * phi_jL_DEP * phi_jL_DEP_dVgs * C_ESI2 - 8.0 * phi_jL_DEP_dVgs * C_ESI2 * phi_sL_DEP - - 8.0 * phi_jL_DEP * C_ESI2 * phi_sL_DEP_dVgs + 8.0 * C_ESI2 * phi_sL_DEP * phi_sL_DEP_dVgs - + 4.0 * phi_jL_DEP_dVgs * q_Ndepm_esi * Tn2 - + 4.0 * phi_sL_DEP_dVgs * q_Ndepm_esi * Tn2 ) / T10 ; - phib_ref_dVds = ( 8.0 * phi_jL_DEP * phi_jL_DEP_dVds * C_ESI2 - 8.0 * phi_jL_DEP_dVds * C_ESI2 * phi_sL_DEP - - 8.0 * phi_jL_DEP * C_ESI2 * phi_sL_DEP_dVds + 8.0 * C_ESI2 * phi_sL_DEP * phi_sL_DEP_dVds - + 4.0 * phi_jL_DEP_dVds * q_Ndepm_esi * Tn2 - + 4.0 * phi_sL_DEP_dVds * q_Ndepm_esi * Tn2 ) / T10 ; - phib_ref_dVbs = ( 8.0 * phi_jL_DEP * phi_jL_DEP_dVbs * C_ESI2 - 8.0 * phi_jL_DEP_dVbs * C_ESI2 * phi_sL_DEP - - 8.0 * phi_jL_DEP * C_ESI2 * phi_sL_DEP_dVbs + 8.0 * C_ESI2 * phi_sL_DEP * phi_sL_DEP_dVbs - + 4.0 * phi_jL_DEP_dVbs * q_Ndepm_esi * Tn2 - + 4.0 * phi_sL_DEP_dVbs * q_Ndepm_esi * Tn2 ) / T10 ; - - T1 = beta * (phi_sL_DEP - phi_bL_DEP) ; - T1_dVgs = beta * (phi_sL_DEP_dVgs - phi_bL_DEP_dVgs) ; - T1_dVds = beta * (phi_sL_DEP_dVds - phi_bL_DEP_dVds) ; - T1_dVbs = beta * (phi_sL_DEP_dVbs - phi_bL_DEP_dVbs) ; - - T2 = exp(T1) ; - T2_dVgs = T1_dVgs * T2 ; - T2_dVds = T1_dVds * T2 ; - T2_dVbs = T1_dVbs * T2 ; - - if( phi_sL_DEP >= phi_bL_DEP ) { - T3 = sqrt(T2 - 1.0e0 - T1 + 1e-15 ) ; - T3_dVgs = (T2_dVgs - T1_dVgs) / 2.0 / T3 ; - T3_dVds = (T2_dVds - T1_dVds) / 2.0 / T3 ; - T3_dVbs = (T2_dVbs - T1_dVbs) / 2.0 / T3 ; - - Q_sL = - here->HSM2_cnst0 * T3 ; - - Q_sL_dep = 0.0 ; - Q_subL = 0.0 ; - - W_bL = sqrt(C_2ESIpq_Ndepm * (phi_bL_DEP - phi_jL_DEP) ) ; - Fn_SU_CP( T9 , W_bL , model->HSM2_tndep, 1e-8, 2 , T4 ) - - W_subL = sqrt(C_2ESIpq_Nsub * (phi_jL_DEP - Vbsc + Vbi_DEP) ) ; - Q_bL_dep = T9 * q_Ndepm ; - Q_subL_dep = - W_subL * q_Nsub ; - - /* derivative */ - Q_sL_dVgs = - here->HSM2_cnst0 * T3_dVgs ; - Q_sL_dVds = - here->HSM2_cnst0 * T3_dVds ; - Q_sL_dVbs = - here->HSM2_cnst0 * T3_dVbs ; - - Q_nL = Q_sL ; - Q_nL_dVgs = Q_sL_dVgs ; - Q_nL_dVds = Q_sL_dVds ; - Q_nL_dVbs = Q_sL_dVbs ; - - Q_bL_dep_dVgs = C_ESI / W_bL * (phi_bL_DEP_dVgs - phi_jL_DEP_dVgs) * T4 ; - Q_bL_dep_dVds = C_ESI / W_bL * (phi_bL_DEP_dVds - phi_jL_DEP_dVds) * T4 ; - Q_bL_dep_dVbs = C_ESI / W_bL * (phi_bL_DEP_dVbs - phi_jL_DEP_dVbs) * T4 ; - - Q_subL_dep_dVgs = - C_ESI / W_subL * phi_jL_DEP_dVgs ; - Q_subL_dep_dVds = - C_ESI / W_subL * phi_jL_DEP_dVds ; - Q_subL_dep_dVbs = - C_ESI / W_subL * (phi_jL_DEP_dVbs - Vbsc_dVbse) ; - - Q_subL_dVgs = 0.0 ; - Q_subL_dVds = 0.0 ; - Q_subL_dVbs = 0.0 ; - - Q_sL_dep_dVgs = 0.0 ; - Q_sL_dep_dVds = 0.0 ; - Q_sL_dep_dVbs = 0.0 ; - - } else { - - T3 = exp( - beta * (phi_sL_DEP - Vbsc)) ; - T4 = exp( - beta * (phi_bL_DEP - Vbsc)) ; - T5 = sqrt(T2 - 1.0 - T1 + here->HSM2_cnst1 * (T3 - T4) + 1e-15) ; - Q_sL = here->HSM2_cnst0 * T5 ; - - T3_dVgs = - beta * T3 * phi_sL_DEP_dVgs ; - T3_dVds = - beta * T3 * phi_sL_DEP_dVds ; - T3_dVbs = - beta * T3 * (phi_sL_DEP_dVbs - Vbsc_dVbse) ; - - T4_dVgs = - beta * T4 * phi_bL_DEP_dVgs ; - T4_dVds = - beta * T4 * phi_bL_DEP_dVds ; - T4_dVbs = - beta * T4 * (phi_bL_DEP_dVbs - Vbsc_dVbse) ; - - T5_dVgs = (T2_dVgs - T1_dVgs + here->HSM2_cnst1 * (T3_dVgs - T4_dVgs)) / 2.0 / T5 ; - T5_dVds = (T2_dVds - T1_dVds + here->HSM2_cnst1 * (T3_dVds - T4_dVds)) / 2.0 / T5 ; - T5_dVbs = (T2_dVbs - T1_dVbs + here->HSM2_cnst1 * (T3_dVbs - T4_dVbs)) / 2.0 / T5 ; - - Q_sL_dVgs = here->HSM2_cnst0 * T5_dVgs ; - Q_sL_dVds = here->HSM2_cnst0 * T5_dVds ; - Q_sL_dVbs = here->HSM2_cnst0 * T5_dVbs ; - - if( W_bsubL > model->HSM2_tndep && depmode !=2 ) { - Q_subL = 0.0 ; - Q_sL_dep = 0.0 ; - - Q_subL_dVgs = 0.0 ; - Q_subL_dVds = 0.0 ; - Q_subL_dVbs = 0.0 ; - - Q_sL_dep_dVgs = 0.0 ; - Q_sL_dep_dVds = 0.0 ; - Q_sL_dep_dVbs = 0.0 ; - - } else { - T3 = exp( - beta * (phi_sL_DEP - Vbsc)) ; - T4 = exp( - beta * (phi_bL_DEP - Vbsc)) ; - T5 = sqrt( - T1 + here->HSM2_cnst1 * (T3 - T4)) ; - Q_subL = here->HSM2_cnst0 * T5 - here->HSM2_cnst0 * sqrt( - T1) ; - T6 = sqrt(T2 - 1.0e0 - T1 + 1e-15) ; - Q_sL_dep = here->HSM2_cnst0 * T6 ; - - Q_subL_dVgs = here->HSM2_cnst0 / 2.0 / T5 * ( - beta * (phi_sL_DEP_dVgs - phi_bL_DEP_dVgs) - + here->HSM2_cnst1 * ( - beta * T3 * phi_sL_DEP_dVgs + beta * T4 * phi_bL_DEP_dVgs)) - - here->HSM2_cnst0 / 2.0 / sqrt( - T1) * ( - beta * (phi_sL_DEP_dVgs - phi_bL_DEP_dVgs)) ; - Q_subL_dVds = here->HSM2_cnst0 / 2.0 / T5 * ( - beta * (phi_sL_DEP_dVds - phi_bL_DEP_dVds) - + here->HSM2_cnst1 * ( - beta * T3 * phi_sL_DEP_dVds + beta * T4 * phi_bL_DEP_dVds)) - - here->HSM2_cnst0 / 2.0 / sqrt( - T1) * ( - beta * (phi_sL_DEP_dVds - phi_bL_DEP_dVds)) ; - Q_subL_dVbs = here->HSM2_cnst0 / 2.0 / T5 * ( - beta * (phi_sL_DEP_dVbs - phi_bL_DEP_dVbs) - + here->HSM2_cnst1 * ( - beta * T3 * (phi_sL_DEP_dVbs - Vbsc_dVbse) + beta * T4 * (phi_bL_DEP_dVbs - Vbsc_dVbse))) - - here->HSM2_cnst0 / 2.0 / sqrt( - T1) * ( - beta * (phi_sL_DEP_dVbs - phi_bL_DEP_dVbs)) ; - - Q_sL_dep_dVgs = here->HSM2_cnst0 / 2.0 / T6 * beta * (phi_sL_DEP_dVgs - phi_bL_DEP_dVgs) * (T2 - 1) ; - Q_sL_dep_dVds = here->HSM2_cnst0 / 2.0 / T6 * beta * (phi_sL_DEP_dVds - phi_bL_DEP_dVds) * (T2 - 1) ; - Q_sL_dep_dVbs = here->HSM2_cnst0 / 2.0 / T6 * beta * (phi_sL_DEP_dVbs - phi_bL_DEP_dVbs) * (T2 - 1) ; - - } - - Q_nL = 0.0 ; - Q_nL_dVgs = 0.0 ; - Q_nL_dVds = 0.0 ; - Q_nL_dVbs = 0.0 ; - -/// Qg = Cox * (Vgp - phi_sL_DEP) ; - - T1 = phi_bL_DEP - phi_jL_DEP ; - Fn_SL_CP( T2 , T1 , 0.0 , 0.1, 2 , T0 ) - W_bL = sqrt(C_2ESIpq_Ndepm * (T2) ) ; - Fn_SU_CP( T9 , W_bL , model->HSM2_tndep, 1e-8, 2 , T3 ) - W_subL = sqrt(C_2ESIpq_Nsub * (phi_jL_DEP - Vbsc + Vbi_DEP) ) ; - Q_bL_dep = T9 * q_Ndepm ; - Q_subL_dep = - W_subL * q_Nsub ; - - Q_bL_dep_dVgs = C_ESI / W_bL * (phi_bL_DEP_dVgs - phi_jL_DEP_dVgs) * T0 * T3 ; - Q_bL_dep_dVds = C_ESI / W_bL * (phi_bL_DEP_dVds - phi_jL_DEP_dVds) * T0 * T3 ; - Q_bL_dep_dVbs = C_ESI / W_bL * (phi_bL_DEP_dVbs - phi_jL_DEP_dVbs) * T0 * T3 ; - - Q_subL_dep_dVgs = - C_ESI / W_subL * phi_jL_DEP_dVgs ; - Q_subL_dep_dVds = - C_ESI / W_subL * phi_jL_DEP_dVds ; - Q_subL_dep_dVbs = - C_ESI / W_subL * (phi_jL_DEP_dVbs - Vbsc_dVbse) ; - - } - - - T1 = phi_sL_DEP - phi_bL_DEP_lim ; - Fn_SL_CP( T2 , T1 , 0.0, Ps_delta, 2 , T0 ) - T2_dVgs = (phi_sL_DEP_dVgs - Vdseff_dVgs) * T0 ; - T2_dVds = (phi_sL_DEP_dVds - Vdseff_dVds) * T0 ; - T2_dVbs = (phi_sL_DEP_dVbs - Vdseff_dVbs) * T0 ; - - T3 = exp(beta * (T2)) ; - T3_dVgs = beta * T3 * T2_dVgs ; - T3_dVds = beta * T3 * T2_dVds ; - T3_dVbs = beta * T3 * T2_dVbs ; - - T4 = T3 - 1.0 - beta * T2 ; - - T4_dVgs = T3_dVgs - beta * T2_dVgs ; - T4_dVds = T3_dVds - beta * T2_dVds ; - T4_dVbs = T3_dVbs - beta * T2_dVbs ; - - T5 = sqrt(T4) ; - Q_nL_cur = - here->HSM2_cnst0 * T5 ; - Q_nL_cur_dVgs = - here->HSM2_cnst0 / 2.0 / T5 * T4_dVgs ; - Q_nL_cur_dVds = - here->HSM2_cnst0 / 2.0 / T5 * T4_dVds ; - Q_nL_cur_dVbs = - here->HSM2_cnst0 / 2.0 / T5 * T4_dVbs ; - - } - - /*---------------------------------------------------* - * Assign Pds. - *-----------------*/ - Ps0 = phi_s0_DEP ; - Psl = phi_sL_DEP ; - Pds = phi_sL_DEP - phi_s0_DEP + epsm10 ; - - Pds_dVgs = phi_sL_DEP_dVgs - phi_s0_DEP_dVgs ; - Pds_dVds = phi_sL_DEP_dVds - phi_s0_DEP_dVds ; - Pds_dVbs = phi_sL_DEP_dVbs - phi_s0_DEP_dVbs ; - - if( Pds < 0.0 ) { // take care of numerical noise // - Pds = 0.0 ; - Pds_dVgs = 0.0 ; - Pds_dVds = 0.0 ; - Pds_dVbs = 0.0 ; - - phi_sL_DEP = phi_s0_DEP ; - phi_sL_DEP_dVgs = phi_s0_DEP_dVgs ; - phi_sL_DEP_dVds = phi_s0_DEP_dVds ; - phi_sL_DEP_dVbs = phi_s0_DEP_dVbs ; - - Idd = 0.0 ; - Idd_dVgs = 0.0 ; - Idd_dVds = 0.0 ; - Idd_dVbs = 0.0 ; - - } else { - - T1 = - (Q_s0 + Q_sL) ; - T1_dVgs = - (Q_s0_dVgs + Q_sL_dVgs) ; - T1_dVds = - (Q_s0_dVds + Q_sL_dVds) ; - T1_dVbs = - (Q_s0_dVbs + Q_sL_dVbs) ; - - Fn_SL_CP3( Qn_drift , T1 , 0.0, Qn_delta , 2 , T3, T4, T5 ) - Qn_drift_dVgs = T1_dVgs * T3 ; - Qn_drift_dVds = T1_dVds * T3 ; - Qn_drift_dVbs = T1_dVbs * T3 ; - - Idd_drift = beta * Qn_drift / 2.0 * Pds ; - Idd_diffu = - ( - Q_nL_cur + Q_n0_cur); - - Idd = Idd_drift + Idd_diffu ; - Idd_dVgs = beta * Qn_drift_dVgs / 2.0 * Pds + beta * Qn_drift / 2.0 * Pds_dVgs - - ( - Q_nL_cur_dVgs + Q_n0_cur_dVgs ) ; - Idd_dVds = beta * Qn_drift_dVds / 2.0 * Pds + beta * Qn_drift / 2.0 * Pds_dVds - - ( - Q_nL_cur_dVds + Q_n0_cur_dVds ) ; - Idd_dVbs = beta * Qn_drift_dVbs / 2.0 * Pds + beta * Qn_drift / 2.0 * Pds_dVbs - - ( - Q_nL_cur_dVbs + Q_n0_cur_dVbs ) ; - - } - - - Qiu = - Q_n0_cur ; - Qiu_dVgs = - Q_n0_cur_dVgs ; - Qiu_dVds = - Q_n0_cur_dVds ; - Qiu_dVbs = - Q_n0_cur_dVbs ; - - Lch = Leff ; - - /*-----------------------------------------------------------* - * Muun : universal mobility. (CGS unit) - *-----------------*/ - - T2 = here->HSM2_ninv_o_esi / C_m2cm ; - - T0 = here->HSM2_ninvd ; - T3 = sqrt(Pds*Pds + model->HSM2_vzadd0) ; - Pdsz = T3 - sqrt(model->HSM2_vzadd0) ; - Pdsz_dVbs = Pds_dVbs * Pds / T3 ; - Pdsz_dVds = Pds_dVds * Pds / T3 ; - Pdsz_dVgs = Pds_dVgs * Pds / T3 ; - - T4 = 1.0 + ( Pdsz ) * T0 ; - T4_dVb = ( Pdsz_dVbs ) * T0 ; - T4_dVd = ( Pdsz_dVds ) * T0 ; - T4_dVg = ( Pdsz_dVgs ) * T0 ; - - T5 = T2 * Qiu ; - T5_dVb = T2 * Qiu_dVbs ; - T5_dVd = T2 * Qiu_dVds ; - T5_dVg = T2 * Qiu_dVgs ; - - T3 = T5 / T4 ; - T3_dVb = ( - T4_dVb * T5 + T4 * T5_dVb ) / T4 / T4 ; - T3_dVd = ( - T4_dVd * T5 + T4 * T5_dVd ) / T4 / T4 ; - T3_dVg = ( - T4_dVg * T5 + T4 * T5_dVg ) / T4 / T4 ; - - Eeff = T3 ; - Eeff_dVbs = T3_dVb ; - Eeff_dVds = T3_dVd ; - Eeff_dVgs = T3_dVg ; - - T5 = Fn_Pow( Eeff , model->HSM2_mueph0 - 1.0e0 ) ; - T8 = T5 * Eeff ; - T7 = Fn_Pow( Eeff , here->HSM2_muesr - 1.0e0 ) ; - T6 = T7 * Eeff ; - - T9 = C_QE * C_m2cm_p2 ; - Rns = Qiu / T9 ; - - T1 = 1.0e0 / ( here->HSM2_muecb0 + here->HSM2_muecb1 * Rns / 1.0e11 ) - + here->HSM2_mphn0 * T8 + T6 / pParam->HSM2_muesr1 ; - - Muun = 1.0e0 / T1 ; - - T1 = 1.0e0 / ( T1 * T1 ) ; - T2 = here->HSM2_muecb0 + here->HSM2_muecb1 * Rns / 1.0e11 ; - T2 = 1.0e0 / ( T2 * T2 ) ; - /* here->HSM2_mphn1 = here->HSM2_mphn0 * model->HSM2_mueph0 */ - T3 = here->HSM2_mphn1 * T5 ; - T4 = here->HSM2_muesr * T7 / pParam->HSM2_muesr1 ; - T5 = - 1.0e-11 * here->HSM2_muecb1 / C_QE * T2 / C_m2cm_p2 ; - Muun_dVbs = - ( T5 * Qiu_dVbs - + Eeff_dVbs * T3 + Eeff_dVbs * T4 ) * T1 ; - Muun_dVds = - ( T5 * Qiu_dVds - + Eeff_dVds * T3 + Eeff_dVds * T4 ) * T1 ; - Muun_dVgs = - ( T5 * Qiu_dVgs - + Eeff_dVgs * T3 + Eeff_dVgs * T4 ) * T1 ; - - /* Change to MKS unit */ - Muun /=C_m2cm_p2 ; - Muun_dVbs /=C_m2cm_p2 ; - Muun_dVds /=C_m2cm_p2 ; - Muun_dVgs /=C_m2cm_p2 ; - - /*-----------------------------------------------------------* - * Mu : mobility - *-----------------*/ - T2 = beta * (Qiu + small) * Lch ; - - T1 = 1.0e0 / T2 ; - T3 = T1 * T1 ; - T4 = - beta * T3 ; - T5 = T4 * Lch ; - T6 = T4 * (Qiu + small) ; - T1_dVb = ( T5 * Qiu_dVbs ) ; - T1_dVd = ( T5 * Qiu_dVds ) ; - T1_dVg = ( T5 * Qiu_dVgs ) ; - - TY = Idd * T1 ; - TY_dVbs = Idd_dVbs * T1 + Idd * T1_dVb ; - TY_dVds = Idd_dVds * T1 + Idd * T1_dVd ; - TY_dVgs = Idd_dVgs * T1 + Idd * T1_dVg ; - - T2 = 0.2 * Vmax / Muun ; - T3 = - T2 / Muun ; - T2_dVb = T3 * Muun_dVbs ; - T2_dVd = T3 * Muun_dVds ; - T2_dVg = T3 * Muun_dVgs ; - - Ey = sqrt( TY * TY + T2 * T2 ) ; - T4 = 1.0 / Ey ; - Ey_dVbs = T4 * ( TY * TY_dVbs + T2 * T2_dVb ) ; - Ey_dVds = T4 * ( TY * TY_dVds + T2 * T2_dVd ) ; - Ey_dVgs = T4 * ( TY * TY_dVgs + T2 * T2_dVg ) ; - - Em = Muun * Ey ; - Em_dVbs = Muun_dVbs * Ey + Muun * Ey_dVbs ; - Em_dVds = Muun_dVds * Ey + Muun * Ey_dVds ; - Em_dVgs = Muun_dVgs * Ey + Muun * Ey_dVgs ; - - T1 = Em / Vmax ; - - Ey_suf = Ey ; - Ey_suf_dVgs = Ey_dVgs ; - Ey_suf_dVds = Ey_dVds ; - Ey_suf_dVbs = Ey_dVbs ; - - /* note: model->HSM2_bb = 2 (electron) ;1 (hole) */ - if ( 1.0e0 - epsm10 <= model->HSM2_bb && model->HSM2_bb <= 1.0e0 + epsm10 ) { - T3 = 1.0e0 ; - } else if ( 2.0e0 - epsm10 <= model->HSM2_bb && model->HSM2_bb <= 2.0e0 + epsm10 ) { - T3 = T1 ; - } else { - T3 = Fn_Pow( T1 , model->HSM2_bb - 1.0e0 ) ; - } - T2 = T1 * T3 ; - T4 = 1.0e0 + T2 ; - - if ( 1.0e0 - epsm10 <= model->HSM2_bb && model->HSM2_bb <= 1.0e0 + epsm10 ) { - T5 = 1.0 / T4 ; - T6 = T5 / T4 ; - } else if ( 2.0e0 - epsm10 <= model->HSM2_bb && model->HSM2_bb <= 2.0e0 + epsm10 ) { - T5 = 1.0 / sqrt( T4 ) ; - T6 = T5 / T4 ; - } else { - T6 = Fn_Pow( T4 , ( - 1.0e0 / model->HSM2_bb - 1.0e0 ) ) ; - T5 = T4 * T6 ; - } - - T7 = Muun / Vmax * T6 * T3 ; - - Mu = Muun * T5 ; - - Mu_dVbs = Muun_dVbs * T5 - T7 * Em_dVbs ; - Mu_dVds = Muun_dVds * T5 - T7 * Em_dVds ; - Mu_dVgs = Muun_dVgs * T5 - T7 * Em_dVgs ; - - //-----------------------------------------------------------* - //* resistor region current. (CGS unit) - //*-----------------// - - if( Vdsorg > 1e-3 ) { - - T2 = q_Ndepm_esi / ( Cox * Cox ) ; - T4 = - 2.0e0 * T2 / Cox ; - T2_dVb = T4 * Cox_dVb ; - T2_dVd = T4 * Cox_dVd ; - T2_dVg = T4 * Cox_dVg ; - - T0 = Vgp + here->HSM2_depvdsef1 - beta_inv - Vbsz ; - T0_dVg = Vgp_dVgs ; - T0_dVd = Vgp_dVds - Vbsz_dVds ; - T0_dVb = Vgp_dVbs - Vbsz_dVbs ; - - T4 = 1.0e0 + 2.0e0 / T2 * T0 ; - T4_dVg = 2.0 / T2 * T0_dVg - 2.0 / T2 / T2 * T0 * T2_dVg ; - T4_dVd = 2.0 / T2 * T0_dVd - 2.0 / T2 / T2 * T0 * T2_dVd ; - T4_dVb = 2.0 / T2 * T0_dVb - 2.0 / T2 / T2 * T0 * T2_dVb ; - - Fn_SL_CP( T9 , T4 , 0 , DEPQFN_dlt, 2 , T0 ) - T9_dVg = T4_dVg * T0 ; - T9_dVd = T4_dVd * T0 ; - T9_dVb = T4_dVb * T0 ; - - T9 = T9 + small ; - T3 = sqrt( T9 ) ; - T3_dVg = 0.5 / T3 * T9_dVg ; - T3_dVd = 0.5 / T3 * T9_dVd ; - T3_dVb = 0.5 / T3 * T9_dVb ; - - T10 = Vgp + here->HSM2_depvdsef1 + T2 * ( 1.0e0 - T3 ) ; - T10 = T10 * here->HSM2_depvdsef2 ; - T10_dVb = (Vgp_dVbs + T2_dVb * ( 1.0e0 - T3 ) - T2 * T3_dVb) - * here->HSM2_depvdsef2 ; - T10_dVd = (Vgp_dVds + T2_dVd * ( 1.0e0 - T3 ) - T2 * T3_dVd) - * here->HSM2_depvdsef2 ; - T10_dVg = (Vgp_dVgs + T2_dVg * ( 1.0e0 - T3 ) - T2 * T3_dVg) - * here->HSM2_depvdsef2 ; - - Fn_SL_CP( T10 , T10 , here->HSM2_depleak, 1.0, 4 , T0 ) - T10 = T10 + epsm10 ; - T10_dVb *=T0 ; - T10_dVd *=T0 ; - T10_dVg *=T0 ; - - T1 = Vdsorg / T10 ; - T2 = Fn_Pow( T1 , here->HSM2_ddlt - 1.0e0 ) ; - T7 = T2 * T1 ; - T0 = here->HSM2_ddlt * T2 / ( T10 * T10 ) ; - T7_dVb = T0 * ( - Vdsorg * T10_dVb ) ; - T7_dVd = T0 * ( T10 - Vdsorg * T10_dVd ) ; - T7_dVg = T0 * ( - Vdsorg * T10_dVg ) ; - - T3 = 1.0 + T7 ; - T4 = Fn_Pow( T3 , 1.0 / here->HSM2_ddlt - 1.0 ) ; - T6 = T4 * T3 ; - T0 = T4 / here->HSM2_ddlt ; - T6_dVb = T0 * T7_dVb ; - T6_dVd = T0 * T7_dVd ; - T6_dVg = T0 * T7_dVg ; - - Vdseff0 = Vdsorg / T6 ; - T0 = 1.0 / ( T6 * T6 ) ; - Vdseff0_dVbs = - Vdsorg * T6_dVb * T0 ; - Vdseff0_dVds = ( T6 - Vdsorg * T6_dVd ) * T0 ; - Vdseff0_dVgs = - Vdsorg * T6_dVg * T0 ; - - } else { - - Vdseff0 = Vdsorg ; - Vdseff0_dVgs = 0.0 ; - Vdseff0_dVds = 1.0 ; - Vdseff0_dVbs = 0.0 ; - - } - - T0 = here->HSM2_ninvd ; - - T4 = 1.0 + ( Pdsz ) * T0 ; - T4_dVb = ( Pdsz_dVbs ) * T0 ; - T4_dVd = ( Pdsz_dVds ) * T0 ; - T4_dVg = ( Pdsz_dVgs ) * T0 ; - - Qiu = - Qn_res0 ; - Qiu_dVgs = - Qn_res0_dVgs ; - Qiu_dVds = - Qn_res0_dVds ; - Qiu_dVbs = - Qn_res0_dVbs ; - - T5 = Qiu ; - T5_dVb = Qiu_dVbs ; - T5_dVd = Qiu_dVds ; - T5_dVg = Qiu_dVgs ; - - T3 = T5 / T4 ; - T3_dVb = ( - T4_dVb * T5 + T4 * T5_dVb ) / T4 / T4 ; - T3_dVd = ( - T4_dVd * T5 + T4 * T5_dVd ) / T4 / T4 ; - T3_dVg = ( - T4_dVg * T5 + T4 * T5_dVg ) / T4 / T4 ; - - Eeff = T3 ; - Eeff_dVbs = T3_dVb ; - Eeff_dVds = T3_dVd ; - Eeff_dVgs = T3_dVg ; - - T5 = Fn_Pow( Eeff , model->HSM2_depmueph0 - 1.0e0 ) ; - T8 = T5 * Eeff ; - - T9 = C_QE * C_m2cm_p2 ; - Rns = Qiu / T9 ; - - T1 = 1.0e0 / ( here->HSM2_depmue0 + here->HSM2_depmue1 * Rns / 1.0e11 ) - + here->HSM2_depmphn0 * T8 ; - - Muun = 1.0e0 / T1 ; - - T1 = 1.0e0 / ( T1 * T1 ) ; - T2 = here->HSM2_depmue0 + here->HSM2_depmue1 * Rns / 1.0e11 ; - T2 = 1.0e0 / ( T2 * T2 ) ; - T3 = here->HSM2_depmphn1 * T5 ; - T5 = - 1.0e-11 * here->HSM2_depmue1 / C_QE * T2 / C_m2cm_p2 ; - Muun_dVbs = - ( T5 * Qiu_dVbs - + Eeff_dVbs * T3 ) * T1 ; - Muun_dVds = - ( T5 * Qiu_dVds - + Eeff_dVds * T3 ) * T1 ; - Muun_dVgs = - ( T5 * Qiu_dVgs - + Eeff_dVgs * T3 ) * T1 ; - - /* Change to MKS unit */ - Muun /=C_m2cm_p2 ; - Muun_dVbs /=C_m2cm_p2 ; - Muun_dVds /=C_m2cm_p2 ; - Muun_dVgs /=C_m2cm_p2 ; - - Edri = Vdseff0 / Lch ; - Edri_dVgs = Vdseff0_dVgs / Lch ; - Edri_dVds = Vdseff0_dVds / Lch ; - Edri_dVbs = Vdseff0_dVbs / Lch ; - - T1 = Muun * Edri / here->HSM2_depvmax ; - T1_dVgs = (Muun_dVgs * Edri + Muun * Edri_dVgs) / here->HSM2_depvmax ; - T1_dVds = (Muun_dVds * Edri + Muun * Edri_dVds) / here->HSM2_depvmax ; - T1_dVbs = (Muun_dVbs * Edri + Muun * Edri_dVbs) / here->HSM2_depvmax ; - - T1 = T1 + small ; - T2 = Fn_Pow(T1,model->HSM2_depbb) ; - T2_dVgs = model->HSM2_depbb * T1_dVgs / T1 * T2 ; - T2_dVds = model->HSM2_depbb * T1_dVds / T1 * T2 ; - T2_dVbs = model->HSM2_depbb * T1_dVbs / T1 * T2 ; - - T3 = 1.0 + T2 ; - T4 = Fn_Pow(T3,1.0 / model->HSM2_depbb) ; - T4_dVgs = 1.0 / model->HSM2_depbb * T2_dVgs / T3 * T4 ; - T4_dVds = 1.0 / model->HSM2_depbb * T2_dVds / T3 * T4 ; - T4_dVbs = 1.0 / model->HSM2_depbb * T2_dVbs / T3 * T4 ; - - Mu_res = Muun / T4 ; - Mu_res_dVgs = Muun_dVgs / T4 - Muun / T4 / T4 * T4_dVgs ; - Mu_res_dVds = Muun_dVds / T4 - Muun / T4 / T4 * T4_dVds ; - Mu_res_dVbs = Muun_dVbs / T4 - Muun / T4 / T4 * T4_dVbs ; - - Ids_res = here->HSM2_weff_nf * ( - Qn_res0) * Mu_res * Edri ; - Ids_res_dVgs = here->HSM2_weff_nf * ( - Qn_res0_dVgs * Mu_res * Edri - - Qn_res0 * Mu_res_dVgs * Edri - Qn_res0 * Mu_res * Edri_dVgs) ; - Ids_res_dVds = here->HSM2_weff_nf * ( - Qn_res0_dVds * Mu_res * Edri - - Qn_res0 * Mu_res_dVds * Edri - Qn_res0 * Mu_res * Edri_dVds) ; - Ids_res_dVbs = here->HSM2_weff_nf * ( - Qn_res0_dVbs * Mu_res * Edri - - Qn_res0 * Mu_res_dVbs * Edri - Qn_res0 * Mu_res * Edri_dVbs) ; - - - //-----------------------------------------------------------* - //* back region universal mobility. (CGS unit) - //*-----------------// - - T0 = here->HSM2_ninvd ; - - T4 = 1.0 + ( Pdsz ) * T0 ; - T4_dVb = ( Pdsz_dVbs ) * T0 ; - T4_dVd = ( Pdsz_dVds ) * T0 ; - T4_dVg = ( Pdsz_dVgs ) * T0 ; - - Qiu = - Qn_bac0 ; - Qiu_dVgs = - Qn_bac0_dVgs ; - Qiu_dVds = - Qn_bac0_dVds ; - Qiu_dVbs = - Qn_bac0_dVbs ; - - T5 = Qiu ; - T5_dVb = Qiu_dVbs ; - T5_dVd = Qiu_dVds ; - T5_dVg = Qiu_dVgs ; - - T3 = T5 / T4 ; - T3_dVb = ( - T4_dVb * T5 + T4 * T5_dVb ) / T4 / T4 ; - T3_dVd = ( - T4_dVd * T5 + T4 * T5_dVd ) / T4 / T4 ; - T3_dVg = ( - T4_dVg * T5 + T4 * T5_dVg ) / T4 / T4 ; - - Eeff = T3 ; - Eeff_dVbs = T3_dVb ; - Eeff_dVds = T3_dVd ; - Eeff_dVgs = T3_dVg ; - - T5 = Fn_Pow( Eeff , model->HSM2_depmueph0 - 1.0e0 ) ; - T8 = T5 * Eeff ; - - T9 = C_QE * C_m2cm_p2 ; - Rns = Qiu / T9 ; - - T1 = 1.0e0 / ( here->HSM2_depmueback0 + here->HSM2_depmueback1 * Rns / 1.0e11 ) - + here->HSM2_depmphn0 * T8 ; - - Muun = 1.0e0 / T1 ; - - T1 = 1.0e0 / ( T1 * T1 ) ; - T2 = here->HSM2_depmueback0 + here->HSM2_depmueback1 * Rns / 1.0e11 ; - T2 = 1.0e0 / ( T2 * T2 ) ; - T3 = here->HSM2_depmphn1 * T5 ; - T5 = - 1.0e-11 * here->HSM2_depmueback1 / C_QE * T2 / C_m2cm_p2 ; - Muun_dVbs = - ( T5 * Qiu_dVbs - + Eeff_dVbs * T3 ) * T1 ; - Muun_dVds = - ( T5 * Qiu_dVds - + Eeff_dVds * T3 ) * T1 ; - Muun_dVgs = - ( T5 * Qiu_dVgs - + Eeff_dVgs * T3 ) * T1 ; - - /* Change to MKS unit */ - Muun /=C_m2cm_p2 ; - Muun_dVbs /=C_m2cm_p2 ; - Muun_dVds /=C_m2cm_p2 ; - Muun_dVgs /=C_m2cm_p2 ; - - Edri = Vdseff0 / Lch ; - Edri_dVgs = Vdseff0_dVgs / Lch ; - Edri_dVds = Vdseff0_dVds / Lch ; - Edri_dVbs = Vdseff0_dVbs / Lch ; - - T1 = Muun * Edri / here->HSM2_depvmax ; - T1_dVgs = (Muun_dVgs * Edri + Muun * Edri_dVgs) / here->HSM2_depvmax ; - T1_dVds = (Muun_dVds * Edri + Muun * Edri_dVds) / here->HSM2_depvmax ; - T1_dVbs = (Muun_dVbs * Edri + Muun * Edri_dVbs) / here->HSM2_depvmax ; - - T1 = T1 + small ; - T2 = Fn_Pow(T1,model->HSM2_depbb) ; - T2_dVgs = model->HSM2_depbb * T1_dVgs / T1 * T2 ; - T2_dVds = model->HSM2_depbb * T1_dVds / T1 * T2 ; - T2_dVbs = model->HSM2_depbb * T1_dVbs / T1 * T2 ; - - T3 = 1.0 + T2 ; - T4 = Fn_Pow(T3,1.0 / model->HSM2_depbb) ; - T4_dVgs = 1.0 / model->HSM2_depbb * T2_dVgs / T3 * T4 ; - T4_dVds = 1.0 / model->HSM2_depbb * T2_dVds / T3 * T4 ; - T4_dVbs = 1.0 / model->HSM2_depbb * T2_dVbs / T3 * T4 ; - - - Mu_bac = Muun / T4 ; - Mu_bac_dVgs = Muun_dVgs / T4 - Muun / T4 / T4 * T4_dVgs ; - Mu_bac_dVds = Muun_dVds / T4 - Muun / T4 / T4 * T4_dVds ; - Mu_bac_dVbs = Muun_dVbs / T4 - Muun / T4 / T4 * T4_dVbs ; - - Ids_bac = here->HSM2_weff_nf * ( - Qn_bac0) * Mu_bac * Edri ; - Ids_bac_dVgs = here->HSM2_weff_nf * ( - Qn_bac0_dVgs * Mu_bac * Edri - - Qn_bac0 * Mu_bac_dVgs * Edri - Qn_bac0 * Mu_bac * Edri_dVgs) ; - Ids_bac_dVds = here->HSM2_weff_nf * ( - Qn_bac0_dVds * Mu_bac * Edri - - Qn_bac0 * Mu_bac_dVds * Edri - Qn_bac0 * Mu_bac * Edri_dVds) ; - Ids_bac_dVbs = here->HSM2_weff_nf * ( - Qn_bac0_dVbs * Mu_bac * Edri - - Qn_bac0 * Mu_bac_dVbs * Edri - Qn_bac0 * Mu_bac * Edri_dVbs) ; - - - /*-----------------------------------------------------------* - * Ids: channel current. - *-----------------*/ - betaWL = here->HSM2_weff_nf * beta_inv / Lch ; - T1 = - betaWL / Lch ; - - Ids0 = betaWL * Idd * Mu + Ids_res + Ids_bac ; - - Ids0_dVgs = betaWL * ( Idd_dVgs * Mu + Idd * Mu_dVgs ) - + Ids_res_dVgs + Ids_bac_dVgs ; - Ids0_dVds = betaWL * ( Idd_dVds * Mu + Idd * Mu_dVds ) - + Ids_res_dVds + Ids_bac_dVds ; - Ids0_dVbs = betaWL * ( Idd_dVbs * Mu + Idd * Mu_dVbs ) - + Ids_res_dVbs + Ids_bac_dVbs ; - - - // Vdseff // - - Vds = Vdsorg; - - /*-----------------------------------------------------------* - * Adding parasitic components to the channel current. - *-----------------*/ - if( model->HSM2_ptl != 0 ){ - T1 = 0.5 * ( Vds - Pds ) ; - Fn_SymAdd( T6 , T1 , 0.01 , T2 ) ; - T2 = T2 * 0.5 ; - T6_dVb = T2 * ( - Pds_dVbs ) ; - T6_dVd = T2 * ( 1.0 - Pds_dVds ) ; - T6_dVg = T2 * ( - Pds_dVgs ) ; - - T1 = 1.1 - ( phi_s0_DEP + T6 ); - T1_dVb = - ( phi_s0_DEP_dVbs + T6_dVb ); - T1_dVd = - ( phi_s0_DEP_dVds + T6_dVd ); - T1_dVg = - ( phi_s0_DEP_dVgs + T6_dVg ); - - Fn_SZ( T2 , T1 , 0.05 , T0 ) ; - T2 = T2 + small ; - T2_dVb = T1_dVb * T0 ; - T2_dVd = T1_dVd * T0 ; - T2_dVg = T1_dVg * T0 ; - - T0 = beta * here->HSM2_ptl0 ; - T3 = Cox * T0 ; - T3_dVb = Cox_dVb * T0 ; - T3_dVd = Cox_dVd * T0 ; - T3_dVg = Cox_dVg * T0 ; - T0 = pow( T2 , model->HSM2_ptp ) ; - T9 = T3 * T0 ; - T9_dVb = T3 * model->HSM2_ptp * T0 / T2 * T2_dVb + T3_dVb * T0 ; - T9_dVd = T3 * model->HSM2_ptp * T0 / T2 * T2_dVd + T3_dVd * T0 ; - T9_dVg = T3 * model->HSM2_ptp * T0 / T2 * T2_dVg + T3_dVg * T0 ; - - - T4 = 1.0 + Vdsz * model->HSM2_pt2 ; - T4_dVb = Vdsz_dVbs * model->HSM2_pt2 ; - T4_dVd = Vdsz_dVds * model->HSM2_pt2 ; - T4_dVg = 0.0 ; - - T0 = here->HSM2_pt40 ; - T5 = phi_s0_DEP + T6 - Vbsz ; - T5_dVb = phi_s0_DEP_dVbs + T6_dVb - Vbsz_dVbs ; - T5_dVd = phi_s0_DEP_dVds + T6_dVd - Vbsz_dVds ; - T5_dVg = phi_s0_DEP_dVgs + T6_dVg ; - T4 = T4 + Vdsz * T0 * T5 ; - T4_dVb = T4_dVb + Vdsz * T0 * T5_dVb + Vdsz_dVbs * T0 * T5 ; - T4_dVd = T4_dVd + Vdsz * T0 * T5_dVd + Vdsz_dVds * T0 * T5 ; - T4_dVg = T4_dVg + Vdsz * T0 * T5_dVg ; - T6 = T9 * T4 ; - T9_dVb = T9_dVb * T4 + T9 * T4_dVb ; - T9_dVd = T9_dVd * T4 + T9 * T4_dVd ; - T9_dVg = T9_dVg * T4 + T9 * T4_dVg ; - T9 = T6 ; - - } else { - T9 = 0.0 ; - T9_dVb = 0.0 ; - T9_dVd = 0.0 ; - T9_dVg = 0.0 ; - } - - if( model->HSM2_gdl != 0 ){ - T1 = beta * here->HSM2_gdl0 ; - T2 = Cox * T1 ; - T2_dVb = Cox_dVb * T1 ; - T2_dVd = Cox_dVd * T1 ; - T2_dVg = Cox_dVg * T1 ; - T8 = T2 * Vdsz ; - T8_dVb = T2_dVb * Vdsz + T2 * Vdsz_dVbs ; - T8_dVd = T2_dVd * Vdsz + T2 * Vdsz_dVds ; - T8_dVg = T2_dVg * Vdsz ; - } else { - T8 = 0.0 ; - T8_dVb = 0.0 ; - T8_dVd = 0.0 ; - T8_dVg = 0.0 ; - } - - if ( ( T9 + T8 ) > 0.0 ) { - Idd1 = Pds * ( T9 + T8 ) ; - Idd1_dVbs = Pds_dVbs * ( T9 + T8 ) + Pds * ( T9_dVb + T8_dVb ) ; - Idd1_dVds = Pds_dVds * ( T9 + T8 ) + Pds * ( T9_dVd + T8_dVd ) ; - Idd1_dVgs = Pds_dVgs * ( T9 + T8 ) + Pds * ( T9_dVg + T8_dVg ) ; - - Ids0 = Ids0 +betaWL * Idd1 * Mu ; - T1 = betaWL * Idd1 ; - T2 = Idd1 * Mu ; - T3 = Mu * betaWL ; - Ids0_dVbs +=T3 * Idd1_dVbs + T1 * Mu_dVbs + T2 * betaWL_dVbs ; - Ids0_dVds +=T3 * Idd1_dVds + T1 * Mu_dVds + T2 * betaWL_dVds ; - Ids0_dVgs +=T3 * Idd1_dVgs + T1 * Mu_dVgs + T2 * betaWL_dVgs ; - } - - /* Ids calculation */ - if ( flg_rsrd == 2 ) { - Rd = here->HSM2_rd ; - T0 = Rd * Ids0 ; - T1 = Vds + small ; - T2 = 1.0 / T1 ; - T3 = 1.0 + T0 * T2 ; - T3_dVb = Rd * Ids0_dVbs * T2 ; - T3_dVd = ( Rd * Ids0_dVds * T1 - T0 ) * T2 * T2 ; - T3_dVg = Rd * Ids0_dVgs * T2 ; - T4 = 1.0 / T3 ; - Ids = Ids0 * T4 ; - T5 = T4 * T4 ; - Ids_dVbs = ( Ids0_dVbs * T3 - Ids0 * T3_dVb ) * T5 ; - Ids_dVds = ( Ids0_dVds * T3 - Ids0 * T3_dVd ) * T5 ; - Ids_dVgs = ( Ids0_dVgs * T3 - Ids0 * T3_dVg ) * T5 ; - } else { - Ids = Ids0 ; - Ids_dVbs = Ids0_dVbs ; - Ids_dVds = Ids0_dVds ; - Ids_dVgs = Ids0_dVgs ; - } - - /* charge calculation */ - /*---------------------------------------------------* - * Qbu : - Qb in unit area. - *-----------------*/ - Qbu = - 0.5 * (Q_sub0 + Q_subL + Q_sub0_dep + Q_subL_dep ) ; - Qbu_dVgs = - 0.5 * ( Q_sub0_dVgs + Q_subL_dVgs + Q_sub0_dep_dVgs + Q_subL_dep_dVgs ) ; - Qbu_dVds = - 0.5 * ( Q_sub0_dVds + Q_subL_dVds + Q_sub0_dep_dVds + Q_subL_dep_dVds ) ; - Qbu_dVbs = - 0.5 * ( Q_sub0_dVbs + Q_subL_dVbs + Q_sub0_dep_dVbs + Q_subL_dep_dVbs ) ; - - Qiu = - 0.5 * (Q_n0 + Q_nL + Q_s0_dep + Q_sL_dep + Q_b0_dep + Q_bL_dep) ; - Qiu_dVgs = - 0.5 * ( Q_n0_dVgs + Q_nL_dVgs + Q_s0_dep_dVgs + Q_sL_dep_dVgs + Q_b0_dep_dVgs + Q_bL_dep_dVgs ) ; - Qiu_dVds = - 0.5 * ( Q_n0_dVds + Q_nL_dVds + Q_s0_dep_dVds + Q_sL_dep_dVds + Q_b0_dep_dVds + Q_bL_dep_dVds ) ; - Qiu_dVbs = - 0.5 * ( Q_n0_dVbs + Q_nL_dVbs + Q_s0_dep_dVbs + Q_sL_dep_dVbs + Q_b0_dep_dVbs + Q_bL_dep_dVbs ) ; - - Qdrat = 0.5; - Qdrat_dVgs = 0.0 ; - Qdrat_dVds = 0.0 ; - Qdrat_dVbs = 0.0 ; - - /*-------------------------------------------------* - * set flg_noqi , Qn0 , Ey for noise calc. - *-----------------*/ - Qiu_noi = - 0.5 * (Q_n0 + Q_nL ) ; - Qn0 = - Q_n0 ; - Qn0_dVgs = - Q_n0_dVgs ; - Qn0_dVds = - Q_n0_dVds ; - Qn0_dVbs = - Q_n0_dVbs ; - - Ey = Ey_suf ; - Ey_dVbs = Ey_suf_dVbs ; - Ey_dVds = Ey_suf_dVds ; - Ey_dVgs = Ey_suf_dVgs ; - - if( Qn0 < small ) { flg_noqi = 1; } - -} /* End of hsmhveval_dep */ - - diff --git a/src/spicelib/devices/hisim2/hsm2evalenv.h b/src/spicelib/devices/hisim2/hsm2evalenv.h deleted file mode 100644 index 52b2dbe9c..000000000 --- a/src/spicelib/devices/hisim2/hsm2evalenv.h +++ /dev/null @@ -1,96 +0,0 @@ -/*********************************************************************** - - HiSIM (Hiroshima University STARC IGFET Model) - Copyright (C) 2014 Hiroshima University & STARC - - MODEL NAME : HiSIM - ( VERSION : 2 SUBVERSION : 8 REVISION : 0 ) - - FILE : hsm2evalenv.h - - Date : 2014.6.5 - - released by - Hiroshima University & - Semiconductor Technology Academic Research Center (STARC) -***********************************************************************/ - -#ifndef HSM2_EVAL_ENV_H -#define HSM2_EVAL_ENV_H - -/* macros and constants used in hsm2eval2yz.c */ - -/*---------------------------------------------------* -* Numerical constants. (macro) -*-----------------*/ - -/* machine epsilon */ -#if defined(_FLOAT_H) && defined(DBL_EPSILON) -#define C_EPS_M (DBL_EPSILON) -#else -#define C_EPS_M (2.2204460492503131e-16) -#endif - -#define MAX_EXP 5.834617425e14 -#define MIN_EXP 1.713908431e-15 -#define EXP_THR 34.0 - -/* sqrt(2) */ -#define C_SQRT_2 (1.414213562373095e+00) - -/* 1/3 */ -#define C_1o3 (3.333333333333333e-01) -/* 2/3 */ -#define C_2o3 (6.666666666666667e-01) -/* 2^(1/3) */ -#define C_2p_1o3 (1.259921049894873e+00) - -/* Pi */ -#define C_Pi (3.141592653589793) -#define C_Pio2 (1.570796326794897) - -/* Unit change */ -#define C_m2cm (1.0e2) -#define C_m2cm_p2 (1.0e4) -#define C_m2cm_p1o2 (1.0e1) -#define C_m2um (1.0e6) -#define C_cm2m_p3 (1.0e-6) -#define C_vmax (1.0e5) -#define C_E0_p2 (1.0e9) - -/*---------------------------------------------------* -* Physical constants/properties. (macro) -*-----------------*/ -/* Elemental charge */ -#define C_QE (1.6021918e-19) - -/* Boltzmann constant */ -#define C_KB (1.3806226e-23) - -/* Permitivity of Si, SiO2 and vacuum */ -#define C_ESI (1.034943e-10) -#define C_EOX (3.453133e-11) -#define C_VAC (8.8541878e-12) - -/* Room temperature constants */ -#define C_T300 (300e+00) -#define C_b300 (3.868283e+01) -/* #define C_Eg0 (1.1785e0) */ /*changed to parameter sIN.eg0*/ - -/* Build-in potential */ -/*#define C_Vbi (1.0e0)*/ /* changed to parameter sIN.vbi */ - - -/* Intrinsic carrier density at 300K */ -#define C_Nin0 (1.04e+16) - - -/*---------------------------------------------------* -* Functions. (macro) Take care of the arguments. -*-----------------*/ -#define Fn_Sqr(x) ( (x)*(x) ) /* x^2 */ -#define Fn_Max(x,y) ( (x) >= (y) ? (x) : (y) ) /* max[x,y] */ -#define Fn_Min(x,y) ( (x) <= (y) ? (x) : (y) ) /* min[x,y] */ -#define Fn_Sgn(x) ( (x) >= 0 ? (1) : (-1) ) /* sign[x] */ - -#endif /* HSM2_EVAL_ENV_H */ diff --git a/src/spicelib/devices/hisim2/hsm2ext.h b/src/spicelib/devices/hisim2/hsm2ext.h deleted file mode 100644 index 50ae6e39e..000000000 --- a/src/spicelib/devices/hisim2/hsm2ext.h +++ /dev/null @@ -1,38 +0,0 @@ -/*********************************************************************** - - HiSIM (Hiroshima University STARC IGFET Model) - Copyright (C) 2014 Hiroshima University & STARC - - MODEL NAME : HiSIM - ( VERSION : 2 SUBVERSION : 8 REVISION : 0 ) - - FILE : hsm2ext.h - - Date : 2014.6.5 - - released by - Hiroshima University & - Semiconductor Technology Academic Research Center (STARC) -***********************************************************************/ - -extern int HSM2acLoad(GENmodel *,CKTcircuit*); -extern int HSM2ask(CKTcircuit *,GENinstance*,int,IFvalue*,IFvalue*); -extern int HSM2convTest(GENmodel *,CKTcircuit*); -extern int HSM2getic(GENmodel*,CKTcircuit*); -extern int HSM2load(GENmodel*,CKTcircuit*); -extern int HSM2mAsk(CKTcircuit*,GENmodel *,int, IFvalue*); -extern int HSM2mDelete(GENmodel*); -extern int HSM2mParam(int,IFvalue*,GENmodel*); -extern void HSM2mosCap(CKTcircuit*, double, double, double, double*, - double, double, double, double, double, double, - double*, double*, double*, double*, double*, double*, double*, double*, - double*, double*, double*, double*, double*, double*, double*, - double*); -extern int HSM2param(int,IFvalue*,GENinstance*,IFvalue*); -extern int HSM2pzLoad(GENmodel*,CKTcircuit*,SPcomplex*); -extern int HSM2setup(SMPmatrix*,GENmodel*,CKTcircuit*,int*); -extern int HSM2unsetup(GENmodel*,CKTcircuit*); -extern int HSM2temp(GENmodel*,CKTcircuit*); -extern int HSM2trunc(GENmodel*,CKTcircuit*,double*); -extern int HSM2noise(int,int,GENmodel*,CKTcircuit*,Ndata*,double*); -extern int HSM2soaCheck(CKTcircuit *, GENmodel *); diff --git a/src/spicelib/devices/hisim2/hsm2getic.c b/src/spicelib/devices/hisim2/hsm2getic.c deleted file mode 100644 index 1db04b2ee..000000000 --- a/src/spicelib/devices/hisim2/hsm2getic.c +++ /dev/null @@ -1,95 +0,0 @@ -/*********************************************************************** - - HiSIM (Hiroshima University STARC IGFET Model) - Copyright (C) 2014 Hiroshima University & STARC - - MODEL NAME : HiSIM - ( VERSION : 2 SUBVERSION : 8 REVISION : 0 ) - - FILE : hsm2getic.c - - Date : 2014.6.5 - - released by - Hiroshima University & - Semiconductor Technology Academic Research Center (STARC) -***********************************************************************/ - -/********************************************************************** - -The following source code, and all copyrights, trade secrets or other -intellectual property rights in and to the source code in its entirety, -is owned by the Hiroshima University and the STARC organization. - -All users need to follow the "HiSIM2 Distribution Statement and -Copyright Notice" attached to HiSIM2 model. - ------HiSIM2 Distribution Statement and Copyright Notice-------------- - -Software is distributed as is, completely without warranty or service -support. Hiroshima University or STARC and its employees are not liable -for the condition or performance of the software. - -Hiroshima University and STARC own the copyright and grant users a perpetual, -irrevocable, worldwide, non-exclusive, royalty-free license with respect -to the software as set forth below. - -Hiroshima University and STARC hereby disclaim all implied warranties. - -Hiroshima University and STARC grant the users the right to modify, copy, -and redistribute the software and documentation, both within the user's -organization and externally, subject to the following restrictions - -1. The users agree not to charge for Hiroshima University and STARC code -itself but may charge for additions, extensions, or support. - -2. In any product based on the software, the users agree to acknowledge -Hiroshima University and STARC that developed the software. This -acknowledgment shall appear in the product documentation. - -3. The users agree to reproduce any copyright notice which appears on -the software on any copy or modification of such made available -to others." - - -*************************************************************************/ - -#include "ngspice/ngspice.h" -#include "ngspice/cktdefs.h" -#include "hsm2def.h" -#include "ngspice/sperror.h" -#include "ngspice/suffix.h" - -int HSM2getic( - GENmodel *inModel, - CKTcircuit *ckt) -{ - HSM2model *model = (HSM2model*)inModel; - HSM2instance *here; - /* - * grab initial conditions out of rhs array. User specified, so use - * external nodes to get values - */ - - for ( ;model ;model = HSM2nextModel(model)) { - for ( here = HSM2instances(model); here ;here = HSM2nextInstance(here)) { - if (!here->HSM2_icVBS_Given) { - here->HSM2_icVBS = - *(ckt->CKTrhs + here->HSM2bNode) - - *(ckt->CKTrhs + here->HSM2sNode); - } - if (!here->HSM2_icVDS_Given) { - here->HSM2_icVDS = - *(ckt->CKTrhs + here->HSM2dNode) - - *(ckt->CKTrhs + here->HSM2sNode); - } - if (!here->HSM2_icVGS_Given) { - here->HSM2_icVGS = - *(ckt->CKTrhs + here->HSM2gNode) - - *(ckt->CKTrhs + here->HSM2sNode); - } - } - } - return(OK); -} - diff --git a/src/spicelib/devices/hisim2/hsm2init.c b/src/spicelib/devices/hisim2/hsm2init.c deleted file mode 100644 index 5ee42c8c0..000000000 --- a/src/spicelib/devices/hisim2/hsm2init.c +++ /dev/null @@ -1,76 +0,0 @@ -#include "ngspice/config.h" - -#include "ngspice/devdefs.h" - -#include "hsm2def.h" -#include "hsm2itf.h" -#include "hsm2init.h" - - -SPICEdev HSM2info = { - .DEVpublic = { - .name = "HiSIM2", - .description = "Hiroshima University STARC IGFET Model 2.8.0", - .terms = &HSM2nSize, - .numNames = &HSM2nSize, - .termNames = HSM2names, - .numInstanceParms = &HSM2pTSize, - .instanceParms = HSM2pTable, - .numModelParms = &HSM2mPTSize, - .modelParms = HSM2mPTable, - .flags = DEV_DEFAULT, - -#ifdef XSPICE - .cm_func = NULL, - .num_conn = 0, - .conn = NULL, - .num_param = 0, - .param = NULL, - .num_inst_var = 0, - .inst_var = NULL, -#endif - }, - - .DEVparam = HSM2param, - .DEVmodParam = HSM2mParam, - .DEVload = HSM2load, - .DEVsetup = HSM2setup, - .DEVunsetup = HSM2unsetup, - .DEVpzSetup = HSM2setup, - .DEVtemperature = HSM2temp, - .DEVtrunc = HSM2trunc, - .DEVfindBranch = NULL, - .DEVacLoad = HSM2acLoad, - .DEVaccept = NULL, - .DEVdestroy = NULL, - .DEVmodDelete = HSM2mDelete, - .DEVdelete = NULL, - .DEVsetic = HSM2getic, - .DEVask = HSM2ask, - .DEVmodAsk = HSM2mAsk, - .DEVpzLoad = HSM2pzLoad, - .DEVconvTest = HSM2convTest, - .DEVsenSetup = NULL, - .DEVsenLoad = NULL, - .DEVsenUpdate = NULL, - .DEVsenAcLoad = NULL, - .DEVsenPrint = NULL, - .DEVsenTrunc = NULL, - .DEVdisto = NULL, - .DEVnoise = HSM2noise, - .DEVsoaCheck = HSM2soaCheck, - .DEVinstSize = &HSM2iSize, - .DEVmodSize = &HSM2mSize, - -#ifdef CIDER - .DEVdump = NULL, - .DEVacct = NULL, -#endif -}; - - -SPICEdev * -get_hsm2_info(void) -{ - return &HSM2info; -} diff --git a/src/spicelib/devices/hisim2/hsm2init.h b/src/spicelib/devices/hisim2/hsm2init.h deleted file mode 100644 index 1651437a8..000000000 --- a/src/spicelib/devices/hisim2/hsm2init.h +++ /dev/null @@ -1,13 +0,0 @@ -#ifndef _HISIM2INIT_H -#define _HISIM2INIT_H - -extern IFparm HSM2pTable[ ]; -extern IFparm HSM2mPTable[ ]; -extern char *HSM2names[ ]; -extern int HSM2pTSize; -extern int HSM2mPTSize; -extern int HSM2nSize; -extern int HSM2iSize; -extern int HSM2mSize; - -#endif diff --git a/src/spicelib/devices/hisim2/hsm2itf.h b/src/spicelib/devices/hisim2/hsm2itf.h deleted file mode 100644 index 2c64588d8..000000000 --- a/src/spicelib/devices/hisim2/hsm2itf.h +++ /dev/null @@ -1,7 +0,0 @@ - -#ifndef DEV_HISIM2 -#define DEV_HISIM2 - -SPICEdev *get_hsm2_info(void); - -#endif diff --git a/src/spicelib/devices/hisim2/hsm2ld.c b/src/spicelib/devices/hisim2/hsm2ld.c deleted file mode 100644 index cf694177a..000000000 --- a/src/spicelib/devices/hisim2/hsm2ld.c +++ /dev/null @@ -1,1616 +0,0 @@ -/*********************************************************************** - - HiSIM (Hiroshima University STARC IGFET Model) - Copyright (C) 2014 Hiroshima University & STARC - - MODEL NAME : HiSIM - ( VERSION : 2 SUBVERSION : 8 REVISION : 0 ) - - FILE : hsm2ld.c - - Date : 2014.6.5 - - released by - Hiroshima University & - Semiconductor Technology Academic Research Center (STARC) -***********************************************************************/ - -/********************************************************************** - -The following source code, and all copyrights, trade secrets or other -intellectual property rights in and to the source code in its entirety, -is owned by the Hiroshima University and the STARC organization. - -All users need to follow the "HiSIM2 Distribution Statement and -Copyright Notice" attached to HiSIM2 model. - ------HiSIM2 Distribution Statement and Copyright Notice-------------- - -Software is distributed as is, completely without warranty or service -support. Hiroshima University or STARC and its employees are not liable -for the condition or performance of the software. - -Hiroshima University and STARC own the copyright and grant users a perpetual, -irrevocable, worldwide, non-exclusive, royalty-free license with respect -to the software as set forth below. - -Hiroshima University and STARC hereby disclaim all implied warranties. - -Hiroshima University and STARC grant the users the right to modify, copy, -and redistribute the software and documentation, both within the user's -organization and externally, subject to the following restrictions - -1. The users agree not to charge for Hiroshima University and STARC code -itself but may charge for additions, extensions, or support. - -2. In any product based on the software, the users agree to acknowledge -Hiroshima University and STARC that developed the software. This -acknowledgment shall appear in the product documentation. - -3. The users agree to reproduce any copyright notice which appears on -the software on any copy or modification of such made available -to others." - - -*************************************************************************/ - -#include "ngspice/ngspice.h" -#include "ngspice/cktdefs.h" -#include "hsm2def.h" -#include "hisim2.h" -#include "ngspice/trandefs.h" -#include "ngspice/const.h" -#include "ngspice/sperror.h" -#include "ngspice/devdefs.h" -#include "ngspice/suffix.h" - -#define SHOW_EPS_QUANT 1.0e-15 -#define BYP_TOL_FACTOR model->HSM2_byptol - -#ifdef MOS_MODEL_TIME -#ifdef USE_OMP -#error "MOS_MODEL_TIME is not supported when USE_OMP is active" -#endif -/** MOS Model Time **/ -#include -extern char *mos_model_name ; -extern double mos_model_time ; -double gtodsecld(void) { - struct timeval tv; - const double sec2000 = 9.46e8 ; - gettimeofday(&tv, NULL); - return ( tv.tv_sec - sec2000 ) + (double)tv.tv_usec*1e-6; -} -double tm0 , tm1 ; -#ifdef PARAMOS_TIME -#include -double vsum ; -static double vsum0 = 1.0e5 ; -#endif -#endif - -#ifdef USE_OMP -int HSM2LoadOMP(HSM2instance *here, CKTcircuit *ckt); -void HSM2LoadRhsMat(GENmodel *inModel, CKTcircuit *ckt); -#endif - -static void ShowPhysVals -( - HSM2instance *here, - HSM2model *model, - int isFirst, - double vds, - double vgs, - double vbs, - double vgd, - double vbd, - double vgb -) -{ - NG_IGNORE(vgd); - NG_IGNORE(vbd); - /* regard the epsilon-quantity as 0.0 */ - vds = (fabs(vds) < SHOW_EPS_QUANT) ? 0.0 : vds; - vgs = (fabs(vgs) < SHOW_EPS_QUANT) ? 0.0 : vgs; - vbs = (fabs(vbs) < SHOW_EPS_QUANT) ? 0.0 : vbs; - vgb = (fabs(vgb) < SHOW_EPS_QUANT) ? 0.0 : vgb; - switch (model->HSM2_show) { - case 1: - if (isFirst) printf("Vds Ids\n"); - printf("%e %e\n", model->HSM2_type*vds, here->HSM2_mode*here->HSM2_ids); - break; - case 2: - if (isFirst) printf("Vgs Ids\n"); - printf("%e %e\n", model->HSM2_type*vgs, here->HSM2_mode*here->HSM2_ids); - break; - case 3: - if (isFirst) printf("Vgs log10(|Ids|)\n"); - printf("%e %e\n", model->HSM2_type*vgs, log10(here->HSM2_ids)); - break; - case 4: - if (isFirst) printf("log10(|Ids|) gm/|Ids|\n"); - if (here->HSM2_ids == 0.0) - printf("I can't show gm/Ids - log10(Ids), because Ids = 0.\n"); - else - printf("%e %e\n", log10(here->HSM2_ids), here->HSM2_gm/here->HSM2_ids); - break; - case 5: - if (isFirst) printf("Vds gds\n"); - printf("%e %e\n", model->HSM2_type*vds, here->HSM2_gds); - break; - case 6: - if (isFirst) printf("Vgs gm\n"); - printf("%e %e\n", model->HSM2_type*vgs, here->HSM2_gm); - break; - case 7: - if (isFirst) printf("Vbs gbs\n"); - printf("%e %e\n", model->HSM2_type*vbs, here->HSM2_gmbs); - break; - case 8: - if (isFirst) printf("Vgs Cgg\n"); - printf("%e %e\n", model->HSM2_type*vgs, here->HSM2_cggb); - break; - case 9: - if (isFirst) printf("Vgs Cgs\n"); - printf("%e %e\n", model->HSM2_type*vgs, here->HSM2_cgsb); - break; - case 10: - if (isFirst) printf("Vgs Cgd\n"); - printf("%e %e\n", model->HSM2_type*vgs, here->HSM2_cgdb); - break; - case 11: - if (isFirst) printf("Vgs Cgb\n"); - printf("%e %e\n", model->HSM2_type*vgs, -(here->HSM2_cggb+here->HSM2_cgsb+here->HSM2_cgdb)); - break; - case 12: - if (isFirst) printf("Vds Csg\n"); - printf("%e %e\n", model->HSM2_type*vds, -(here->HSM2_cggb+here->HSM2_cbgb+here->HSM2_cdgb)); - break; - case 13: - if (isFirst) printf("Vds Cdg\n"); - printf("%e %e\n", model->HSM2_type*vds, here->HSM2_cdgb); - break; - case 14: - if (isFirst) printf("Vds Cbg\n"); - printf("%e %e\n", model->HSM2_type*vds, here->HSM2_cbgb); - break; - case 15: - if (isFirst) printf("Vds Cgg\n"); - printf("%e %e\n", model->HSM2_type*vds, here->HSM2_cggb); - break; - case 16: - if (isFirst) printf("Vds Cgs\n"); - printf("%e %e\n", model->HSM2_type*vds, here->HSM2_cgsb); - break; - case 17: - if (isFirst) printf("Vds Cgd\n"); - printf("%e %e\n", model->HSM2_type*vds, here->HSM2_cgdb); - break; - case 18: - if (isFirst) printf("Vds Cgb\n"); - printf("%e %e\n", model->HSM2_type*vds, -(here->HSM2_cggb+here->HSM2_cgsb+here->HSM2_cgdb)); - break; - case 19: - if (isFirst) printf("Vgs Csg\n"); - printf("%e %e\n", model->HSM2_type*vgs, -(here->HSM2_cggb+here->HSM2_cbgb+here->HSM2_cdgb)); - break; - case 20: - if (isFirst) printf("Vgs Cdg\n"); - printf("%e %e\n", model->HSM2_type*vgs, here->HSM2_cdgb); - break; - case 21: - if (isFirst) printf("Vgs Cbg\n"); - printf("%e %e\n", model->HSM2_type*vgs, here->HSM2_cbgb); - break; - case 22: - if (isFirst) printf("Vgb Cgb\n"); - printf("%e %e\n", model->HSM2_type*vgb, -(here->HSM2_cggb+here->HSM2_cgsb+here->HSM2_cgdb)); - break; - case 50: - if (isFirst) printf("Vgs Vds Vbs Vgb Ids log10(|Ids|) gm/|Ids| gm gds gbs Cgg Cgs Cgb Cgd Csg Cbg Cdg\n"); - printf("%e %e %e %e %e %e %e %e %e %e %e %e %e %e %e %e %e\n", model->HSM2_type*vgs, model->HSM2_type*vds, model->HSM2_type*vbs, model->HSM2_type*vgb, here->HSM2_mode*here->HSM2_ids, log10(here->HSM2_ids), here->HSM2_gm/here->HSM2_ids, here->HSM2_gm, here->HSM2_gds, here->HSM2_gmbs, here->HSM2_cggb, here->HSM2_cgsb, -(here->HSM2_cggb+here->HSM2_cgsb+here->HSM2_cgdb), here->HSM2_cgdb, -(here->HSM2_cggb+here->HSM2_cbgb+here->HSM2_cdgb), here->HSM2_cbgb, here->HSM2_cdgb); - break; - default: - /* - printf("There is no physical value corrsponding to %d\n", flag); - */ - break; - } -} - -int HSM2load( - GENmodel *inModel, - CKTcircuit *ckt) - /* actually load the current value into the - * sparse matrix previously provided - */ -{ -#ifdef USE_OMP - int idx; - HSM2model *model = (HSM2model*)inModel; - int error = 0; - HSM2instance **InstArray; - InstArray = model->HSM2InstanceArray; - -#pragma omp parallel for - for (idx = 0; idx < model->HSM2InstCount; idx++) { - HSM2instance *here = InstArray[idx]; - int local_error = HSM2LoadOMP(here, ckt); - if (local_error) - error = local_error; - } - - HSM2LoadRhsMat(inModel, ckt); - - return error; -} - -int HSM2LoadOMP(HSM2instance *here, CKTcircuit *ckt) -{ - HSM2model *model = HSM2modPtr(here); -#else - HSM2model *model = (HSM2model*)inModel; - HSM2instance *here; -#endif -/* HSM2binningParam *pParam;*/ - double cbhat=0.0, cdrain=0.0, cdhat=0.0, cdreq=0.0, cgbhat=0.0, cgshat=0.0, cgdhat=0.0 ; - double Ibtot=0.0, Idtot=0.0, Igbtot=0.0, Igstot=0.0, Igdtot=0.0 ; - double ceq=0.0, ceqbd=0.0, ceqbs=0.0, ceqqb=0.0, ceqqd=0.0, ceqqg=0.0 ; - double ceqjs=0.0, ceqjd=0.0, ceqqjs=0.0, ceqqjd=0.0 ; - double delvbd=0.0, delvbs=0.0, delvds=0.0, delvgd=0.0, delvgs=0.0 ; - double gcbdb=0.0, gcbgb=0.0, gcbsb=0.0, gcddb=0.0, gcdgb=0.0, gcdsb=0.0 ; - double gcgdb=0.0, gcggb=0.0, gcgsb=0.0, gcgbb=0.0, gcsdb=0.0, gcsgb=0.0, gcssb=0.0 ; - double geq=0.0, xfact=0.0 ; - double vbd=0.0, vbs=0.0, vds=0.0, vgb=0.0, vgd=0.0, vgdo=0.0, vgs=0.0, von=0.0 ; - double gbbdp=0.0, gbbsp=0.0, gbspg=0.0, gbspdp=0.0, gbspb=0.0, gbspsp=0.0 ; - double qgate=0.0, qbulk=0.0, qdrn=0.0 ; - double cqgate=0.0, cqbulk=0.0, cqdrn=0.0 ; - double gbdpdp=0.0, gbdpg=0.0, gbdpb=0.0, gbdpsp=0.0; - double gm=0.0, gmbs=0.0, FwdSum=0.0, RevSum=0.0 ; - double ag0=0.0 ; - double Ibtoteq=0.0, gIbtotg=0.0, gIbtotd=0.0, gIbtots=0.0, gIbtotb=0.0 ; - double Igtoteq=0.0, gIgtotg=0.0, gIgtotd=0.0, gIgtots=0.0, gIgtotb=0.0 ; - double Idtoteq=0.0, gIdtotg=0.0, gIdtotd=0.0, gIdtots=0.0, gIdtotb=0.0 ; - double Istoteq=0.0, gIstotg=0.0, gIstotd=0.0, gIstots=0.0, gIstotb=0.0 ; - double ivds=0.0, ivgs=0.0, ivbs=0.0 ; - double gjbs=0.0, gjbd=0.0, gcdbdb=0.0, gcsbsb=0.0, gcbbb=0.0, gcdbb=0.0, gcsbb=0.0, grg=0.0 ; - double vdbs=0.0, vsbs=0.0, vdbd=0.0, delvdbs=0.0, delvsbs=0.0, delvdbd=0.0 ; - double vges=0.0, vged=0.0, delvges=0.0, delvged=0.0, vgedo=0.0 ; - double vsbdo=0.0, vsbd=0.0; - double vbs_jct=0.0, vbd_jct=0.0, delvbs_jct=0.0, delvbd_jct=0.0 ; - int ByPass=0, Check=0, Check1=0, Check2=0 ; - int BYPASS_enable =0 ; -#ifndef NOBYPASS - double tempv=0.0 ; -#endif /*NOBYPASS*/ -#ifndef NEWCONV - double tol=0.0, tol2=0.0, tol3=0.0, tol4=0.0 ; -#endif - int ChargeComputationNeeded = - ((ckt->CKTmode & (MODEAC | MODETRAN | MODEINITSMSIG)) || - ((ckt->CKTmode & MODETRANOP) && (ckt->CKTmode & MODEUIC))) - ? 1 : 0; - int showPhysVal; - int isConv; - double vds_pre = 0.0; - double reltol, abstol , voltTol ; - -#ifdef MOS_MODEL_TIME -tm0 = gtodsecld() ; -#endif - -#ifdef USE_OMP - reltol = ckt->CKTreltol * BYP_TOL_FACTOR ; - abstol = ckt->CKTabstol * BYP_TOL_FACTOR ; - voltTol= ckt->CKTvoltTol* BYP_TOL_FACTOR ; - BYPASS_enable = (BYP_TOL_FACTOR > 0.0 && ckt->CKTbypass) ; - model->HSM2_bypass_enable = BYPASS_enable ; -#else - /* loop through all the HSM2 device models */ - for ( ; model != NULL; model = HSM2nextModel(model)) { - /* loop through all the instances of the model */ - - reltol = ckt->CKTreltol * BYP_TOL_FACTOR ; - abstol = ckt->CKTabstol * BYP_TOL_FACTOR ; - voltTol= ckt->CKTvoltTol* BYP_TOL_FACTOR ; - BYPASS_enable = (BYP_TOL_FACTOR > 0.0 && ckt->CKTbypass) ; - model->HSM2_bypass_enable = BYPASS_enable ; - - for (here = HSM2instances(model); here != NULL ; - here = HSM2nextInstance(here)) { -#endif -/* pParam = &here->pParam ;*/ - showPhysVal = 0; - Check=1; - ByPass = 0; - -#ifdef DEBUG_HISIM2LD_VX - printf("mode = %x\n", ckt->CKTmode); - printf("Vd Vg Vs Vb %e %e %e %e\n", *(ckt->CKTrhsOld+here->HSM2dNodePrime), - *(ckt->CKTrhsOld+here->HSM2gNodePrime), - *(ckt->CKTrhsOld+here->HSM2sNodePrime), - *(ckt->CKTrhsOld+here->HSM2bNodePrime)); -#endif - - if ( ckt->CKTmode & MODEINITSMSIG ) { - vbs = *(ckt->CKTstate0 + here->HSM2vbs); - vgs = *(ckt->CKTstate0 + here->HSM2vgs); - vds = *(ckt->CKTstate0 + here->HSM2vds); - - vges = *(ckt->CKTstate0 + here->HSM2vges); - vdbs = *(ckt->CKTstate0 + here->HSM2vdbs); - vsbs = *(ckt->CKTstate0 + here->HSM2vsbs); - } - else if ( ckt->CKTmode & MODEINITTRAN ) { - vbs = *(ckt->CKTstate1 + here->HSM2vbs); - vgs = *(ckt->CKTstate1 + here->HSM2vgs); - vds = *(ckt->CKTstate1 + here->HSM2vds); - - vges = *(ckt->CKTstate1 + here->HSM2vges); - vdbs = *(ckt->CKTstate1 + here->HSM2vdbs); - vsbs = *(ckt->CKTstate1 + here->HSM2vsbs); - } - else if ( (ckt->CKTmode & MODEINITJCT) && !here->HSM2_off ) { - vds = model->HSM2_type * here->HSM2_icVDS; - vgs = vges = model->HSM2_type * here->HSM2_icVGS; - vbs = vdbs = vsbs = model->HSM2_type * here->HSM2_icVBS; - if ( (vds == 0.0) && (vgs == 0.0) && (vbs == 0.0) && - ( (ckt->CKTmode & (MODETRAN|MODEAC|MODEDCOP|MODEDCTRANCURVE)) || - !(ckt->CKTmode & MODEUIC) ) ) { - /* set biases for starting analysis */ - vbs = vdbs = vsbs = 0.0; - /* - vgs = vges = model->HSM2_type * pParam->HSM2_vfbc + 0.1; - */ - vgs = vges = 0.1; - vds = 0.1; - } - } - else if ( ( ckt->CKTmode & (MODEINITJCT | MODEINITFIX) ) && - here->HSM2_off ) { - vbs = vgs = vds = 0.0; vges = 0.0; vdbs = vsbs = 0.0; - } - else { -#ifndef PREDICTOR /* BSIM3 style */ - if (ckt->CKTmode & MODEINITPRED) { - xfact = ckt->CKTdelta / ckt->CKTdeltaOld[1]; - *(ckt->CKTstate0 + here->HSM2vbs) = - *(ckt->CKTstate1 + here->HSM2vbs); - vbs = (1.0 + xfact)* (*(ckt->CKTstate1 + here->HSM2vbs)) - -(xfact * (*(ckt->CKTstate2 + here->HSM2vbs))); - *(ckt->CKTstate0 + here->HSM2vgs) = - *(ckt->CKTstate1 + here->HSM2vgs); - vgs = (1.0 + xfact)* (*(ckt->CKTstate1 + here->HSM2vgs)) - -(xfact * (*(ckt->CKTstate2 + here->HSM2vgs))); - *(ckt->CKTstate0 + here->HSM2vds) = - *(ckt->CKTstate1 + here->HSM2vds); - vds = (1.0 + xfact)* (*(ckt->CKTstate1 + here->HSM2vds)) - -(xfact * (*(ckt->CKTstate2 + here->HSM2vds))); - *(ckt->CKTstate0 + here->HSM2vbd) = - *(ckt->CKTstate0 + here->HSM2vbs)- - *(ckt->CKTstate0 + here->HSM2vds); - - *(ckt->CKTstate0 + here->HSM2vges) = - *(ckt->CKTstate1 + here->HSM2vges); - vges = (1.0 + xfact)* (*(ckt->CKTstate1 + here->HSM2vges)) - -(xfact * (*(ckt->CKTstate2 + here->HSM2vges))); - *(ckt->CKTstate0 + here->HSM2vdbs) = - *(ckt->CKTstate1 + here->HSM2vdbs); - vdbs = (1.0 + xfact)* (*(ckt->CKTstate1 + here->HSM2vdbs)) - - (xfact * (*(ckt->CKTstate2 + here->HSM2vdbs))); - *(ckt->CKTstate0 + here->HSM2vdbd) = - *(ckt->CKTstate0 + here->HSM2vdbs) - - *(ckt->CKTstate0 + here->HSM2vds); - *(ckt->CKTstate0 + here->HSM2vsbs) = - *(ckt->CKTstate1 + here->HSM2vsbs); - vsbs = (1.0 + xfact)* (*(ckt->CKTstate1 + here->HSM2vsbs)) - - (xfact * (*(ckt->CKTstate2 + here->HSM2vsbs))); - } - else { -#endif /* PREDICTOR */ - /* get biases from CKT */ - vbs = model->HSM2_type * - (*(ckt->CKTrhsOld+here->HSM2bNodePrime) - - *(ckt->CKTrhsOld+here->HSM2sNodePrime)); - vgs = model->HSM2_type * - (*(ckt->CKTrhsOld+here->HSM2gNodePrime) - - *(ckt->CKTrhsOld+here->HSM2sNodePrime)); - vds = model->HSM2_type * - (*(ckt->CKTrhsOld+here->HSM2dNodePrime) - - *(ckt->CKTrhsOld+here->HSM2sNodePrime)); - - vges = model->HSM2_type * - (*(ckt->CKTrhsOld+here->HSM2gNode) - - *(ckt->CKTrhsOld+here->HSM2sNodePrime)); - vdbs = model->HSM2_type - * (*(ckt->CKTrhsOld + here->HSM2dbNode) - - *(ckt->CKTrhsOld + here->HSM2sNodePrime)); - vsbs = model->HSM2_type - * (*(ckt->CKTrhsOld + here->HSM2sbNode) - - *(ckt->CKTrhsOld + here->HSM2sNodePrime)); -#ifndef PREDICTOR - } -#endif /* PREDICTOR */ - - vbd = vbs - vds; - vgd = vgs - vds; - vged = vges - vds; - vdbd = vdbs - vds; - vgdo = *(ckt->CKTstate0 + here->HSM2vgs) - *(ckt->CKTstate0 + here->HSM2vds); - vgedo = *(ckt->CKTstate0 + here->HSM2vges) - *(ckt->CKTstate0 + here->HSM2vds); - delvbs = vbs - *(ckt->CKTstate0 + here->HSM2vbs); - delvbd = vbd - *(ckt->CKTstate0 + here->HSM2vbd); - delvgs = vgs - *(ckt->CKTstate0 + here->HSM2vgs); - delvges = vges - *(ckt->CKTstate0 + here->HSM2vges); - delvds = vds - *(ckt->CKTstate0 + here->HSM2vds); - delvdbs = vdbs - *(ckt->CKTstate0 + here->HSM2vdbs); - delvsbs = vsbs - *(ckt->CKTstate0 + here->HSM2vsbs); - delvdbd = vdbd - *(ckt->CKTstate0 + here->HSM2vdbd); - delvgd = vgd - vgdo; - delvged = vged - vgedo; - - delvbd_jct = (!here->HSM2_corbnet) ? delvbd : delvdbd; - delvbs_jct = (!here->HSM2_corbnet) ? delvbs : delvsbs; - if (here->HSM2_mode >= 0) { - Idtot = here->HSM2_ids + here->HSM2_isub - here->HSM2_ibd - + here->HSM2_igidl; - cdhat = Idtot - here->HSM2_gbd * delvbd_jct - + (here->HSM2_gmbs + here->HSM2_gbbs + here->HSM2_gigidlbs) * delvbs - + (here->HSM2_gm + here->HSM2_gbgs + here->HSM2_gigidlgs) * delvgs - + (here->HSM2_gds + here->HSM2_gbds + here->HSM2_gigidlds) * delvds; - Ibtot = here->HSM2_ibs + here->HSM2_ibd - here->HSM2_isub - - here->HSM2_igidl - here->HSM2_igisl; - cbhat = Ibtot + here->HSM2_gbd * delvbd_jct - + here->HSM2_gbs * delvbs_jct - (here->HSM2_gbbs + here->HSM2_gigidlbs) * delvbs - - (here->HSM2_gbgs + here->HSM2_gigidlgs) * delvgs - - (here->HSM2_gbds + here->HSM2_gigidlds) * delvds - - here->HSM2_gigislgd * delvgd - here->HSM2_gigislbd * delvbd - + here->HSM2_gigislsd * delvds; - Igstot = here->HSM2_igs; - cgshat = Igstot + here->HSM2_gigsg * delvgs + - here->HSM2_gigsd * delvds + here->HSM2_gigsb * delvbs; - Igdtot = here->HSM2_igd; - cgdhat = Igdtot + here->HSM2_gigdg * delvgs + - here->HSM2_gigdd * delvds + here->HSM2_gigdb * delvbs; - Igbtot = here->HSM2_igb; - cgbhat = Igbtot + here->HSM2_gigbg * delvgs + - here->HSM2_gigbd * delvds + here->HSM2_gigbb * delvbs; - } - else { - Idtot = here->HSM2_ids + here->HSM2_ibd - here->HSM2_igidl; - cdhat = Idtot + here->HSM2_gbd * delvbd_jct + here->HSM2_gmbs * delvbd - + here->HSM2_gm * delvgd - here->HSM2_gds * delvds - - here->HSM2_gigidlgs * delvgd - here->HSM2_gigidlbs * delvbd - + here->HSM2_gigidlds * delvds ; - Ibtot = here->HSM2_ibs + here->HSM2_ibd - here->HSM2_isub - - here->HSM2_igidl - here->HSM2_igisl; - cbhat = Ibtot + here->HSM2_gbs * delvbs_jct - + here->HSM2_gbd * delvbd_jct - (here->HSM2_gbbs + here->HSM2_gigidlbs) * delvbd - - (here->HSM2_gbgs + here->HSM2_gigidlgs) * delvgd - + (here->HSM2_gbds + here->HSM2_gigidlds) * delvds - - here->HSM2_gigislgd * delvgd - here->HSM2_gigislbd * delvbd - + here->HSM2_gigislsd * delvds; - Igbtot = here->HSM2_igb; - cgbhat = Igbtot + here->HSM2_gigbg * delvgd - - here->HSM2_gigbs * delvds + here->HSM2_gigbb * delvbd; - Igstot = here->HSM2_igs; - cgshat = Igstot + here->HSM2_gigsg * delvgd - - here->HSM2_gigss * delvds + here->HSM2_gigsb * delvbd; - Igdtot = here->HSM2_igd; - cgdhat = Igdtot + here->HSM2_gigdg * delvgd - - here->HSM2_gigds * delvds + here->HSM2_gigdb * delvbd; - } - - vds_pre = vds; - -#ifndef NOBYPASS /* BSIM3 style */ - /* now lets see if we can bypass (ugh) */ - - /* following should be one big if connected by && all over - * the place, but some C compilers can't handle that, so - * we split it up here to let them digest it in stages - */ - if ( !(ckt->CKTmode & MODEINITPRED) && BYPASS_enable ) - if ((!here->HSM2_corbnet) || - (fabs(delvdbs) < - (reltol - * MAX(fabs(vdbs), fabs(*(ckt->CKTstate0 + here->HSM2vdbs))) - + voltTol))) - if ((!here->HSM2_corbnet) || - (fabs(delvdbd) < - (reltol - * MAX(fabs(vdbd), fabs(*(ckt->CKTstate0 + here->HSM2vdbd))) - + voltTol))) - if ((!here->HSM2_corbnet) || - (fabs(delvsbs) < - (reltol - * MAX(fabs(vsbs), fabs(*(ckt->CKTstate0 + here->HSM2vsbs))) - + voltTol))) - if ((here->HSM2_corg == 0) || (here->HSM2_corg == 1) || - (fabs(delvges) < - (reltol - * MAX(fabs(vges), fabs(*(ckt->CKTstate0 + here->HSM2vges))) - + voltTol))) - if ( fabs(delvbs) < - ( reltol * - MAX(fabs(vbs), fabs(*(ckt->CKTstate0+here->HSM2vbs))) + - voltTol ) ) - if ( fabs(delvbd) < - ( reltol * - MAX(fabs(vbd), fabs(*(ckt->CKTstate0+here->HSM2vbd))) + - voltTol ) ) - if ( fabs(delvgs) < - ( reltol * - MAX(fabs(vgs), fabs(*(ckt->CKTstate0+here->HSM2vgs))) + - voltTol ) ) - if ( fabs(delvds) < - ( reltol * - MAX(fabs(vds), fabs(*(ckt->CKTstate0+here->HSM2vds))) + - voltTol ) ) - if ( fabs(cdhat - Idtot) < - ( reltol * - MAX(fabs(cdhat),fabs(Idtot)) + abstol ) ) - if (!model->HSM2_coiigs || - (fabs(cgbhat - Igbtot) < reltol - * MAX(fabs(cgbhat), fabs(Igbtot)) + abstol)) - if (!model->HSM2_coiigs || - (fabs(cgshat - Igstot) < reltol - * MAX(fabs(cgshat), fabs(Igstot)) + abstol)) - if (!model->HSM2_coiigs || - (fabs(cgdhat - Igdtot) < reltol - * MAX(fabs(cgdhat), fabs(Igdtot)) + abstol)){ - tempv = MAX(fabs(cbhat),fabs(Ibtot)) + abstol; - if ((fabs(cbhat - Ibtot)) < reltol * tempv) { - /* bypass code */ - vbs = *(ckt->CKTstate0 + here->HSM2vbs); - vbd = *(ckt->CKTstate0 + here->HSM2vbd); - vgs = *(ckt->CKTstate0 + here->HSM2vgs); - vds = *(ckt->CKTstate0 + here->HSM2vds); - - vges = *(ckt->CKTstate0 + here->HSM2vges); - vdbs = *(ckt->CKTstate0 + here->HSM2vdbs); - vdbd = *(ckt->CKTstate0 + here->HSM2vdbd); - vsbs = *(ckt->CKTstate0 + here->HSM2vsbs); - - vgd = vgs - vds; - vgb = vgs - vbs; - vged = vges - vds; - - vbs_jct = (!here->HSM2_corbnet) ? vbs : vsbs; - vbd_jct = (!here->HSM2_corbnet) ? vbd : vdbd; - - cdrain = here->HSM2_ids; - if ((ckt->CKTmode & (MODETRAN | MODEAC)) || - ((ckt->CKTmode & MODETRANOP) && - (ckt->CKTmode & MODEUIC))) { - ByPass = 1; - qgate = here->HSM2_qg; - qbulk = here->HSM2_qb; - qdrn = here->HSM2_qd; - goto line755; - } - else - goto line850; - } - } -#endif /*NOBYPASS*/ - -#ifdef DEBUG_HISIM2LD_VX - printf( "vbd_p = %12.5e\n" , vbd ); - printf( "vbs_p = %12.5e\n" , vbs ); - printf( "vgs_p = %12.5e\n" , vgs ); - printf( "vds_p = %12.5e\n" , vds ); -#endif - - von = here->HSM2_von; - if(*(ckt->CKTstate0 + here->HSM2vds) >= 0.0) { - vgs = DEVfetlim(vgs, *(ckt->CKTstate0 + here->HSM2vgs), von); - vds = vgs - vgd; - vds = DEVlimvds(vds, *(ckt->CKTstate0 + here->HSM2vds)); - vgd = vgs - vds; - - if (here->HSM2_corg == 1) { - vges = DEVfetlim(vges, *(ckt->CKTstate0 + here->HSM2vges), von); - vged = vges - vds; - } - } - else { - vgd = DEVfetlim(vgd, vgdo, von); - vds = vgs - vgd; - vds = -DEVlimvds(-vds, -(*(ckt->CKTstate0 + here->HSM2vds))); - vgs = vgd + vds; - - if (here->HSM2_corg == 1) { - vged = DEVfetlim(vged, vgedo, von); - vges = vged + vds; - } - } - if (vds >= 0.0) { - vbs = DEVpnjlim(vbs, *(ckt->CKTstate0 + here->HSM2vbs), - CONSTvt0, model->HSM2_vcrit, &Check); - vbd = vbs - vds; - if (here->HSM2_corbnet) { - vdbs = DEVpnjlim(vdbs, *(ckt->CKTstate0 + here->HSM2vdbs), - CONSTvt0, model->HSM2_vcrit, &Check1); - vdbd = vdbs - vds; - vsbs = DEVpnjlim(vsbs, *(ckt->CKTstate0 + here->HSM2vsbs), - CONSTvt0, model->HSM2_vcrit, &Check2); - if ((Check1 == 0) && (Check2 == 0)) Check = 0; - else Check = 1; - } - } - else { - vbd = DEVpnjlim(vbd, *(ckt->CKTstate0 + here->HSM2vbd), - CONSTvt0, model->HSM2_vcrit, &Check); - vbs = vbd + vds; - if (here->HSM2_corbnet) { - vdbd = DEVpnjlim(vdbd, *(ckt->CKTstate0 + here->HSM2vdbd), - CONSTvt0, model->HSM2_vcrit, &Check1); - vdbs = vdbd + vds; - vsbdo = *(ckt->CKTstate0 + here->HSM2vsbs) - - *(ckt->CKTstate0 + here->HSM2vds); - vsbd = vsbs - vds; - vsbd = DEVpnjlim(vsbd, vsbdo, CONSTvt0, model->HSM2_vcrit, &Check2); - vsbs = vsbd + vds; - if ((Check1 == 0) && (Check2 == 0)) Check = 0; - else Check = 1; - } - } - } - - vbd = vbs - vds; - vgd = vgs - vds; - vgb = vgs - vbs; - vged = vges - vds; - vdbd = vdbs - vds; - - vbs_jct = (!here->HSM2_corbnet) ? vbs : vsbs; - vbd_jct = (!here->HSM2_corbnet) ? vbd : vdbd; - -#ifdef DEBUG_HISIM2LD_VX - printf( "vbd = %12.5e\n" , vbd ); - printf( "vbs = %12.5e\n" , vbs ); - printf( "vgs = %12.5e\n" , vgs ); - printf( "vds = %12.5e\n" , vds ); -#endif - - if (vds >= 0) { /* normal mode */ - here->HSM2_mode = 1; - ivds = vds; - ivgs = vgs; - ivbs = vbs; - } else { /* reverse mode */ - here->HSM2_mode = -1; - ivds = -vds; - ivgs = vgd; - ivbs = vbd; - } - - if ( model->HSM2_info >= 5 ) { /* mode, bias conditions ... */ - printf( "--- variables given to HSM2evaluate() ----\n" ); - printf( "type = %s\n" , (model->HSM2_type>0) ? "NMOS" : "PMOS" ); - printf( "mode = %s\n" , (here->HSM2_mode>0) ? "NORMAL" : "REVERSE" ); - - printf( "vbs = %12.5e\n" , ivbs ); - printf( "vds = %12.5e\n" , ivds ); - printf( "vgs = %12.5e\n" , ivgs ); - } - if ( model->HSM2_info >= 6 ) { /* input flags */ - printf( "corsrd = %s\n" , (model->HSM2_corsrd) ? "true" : "false" ) ; - printf( "coadov = %s\n" , (model->HSM2_coadov) ? "true" : "false" ) ; - printf( "coisub = %s\n" , (model->HSM2_coisub) ? "true" : "false" ) ; - printf( "coiigs = %s\n" , (model->HSM2_coiigs) ? "true" : "false" ) ; - printf( "cogidl = %s\n" , (model->HSM2_cogidl) ? "true" : "false" ) ; - printf( "coovlp = %s\n" , (model->HSM2_coovlp) ? "true" : "false" ) ; - printf( "coflick = %s\n" , (model->HSM2_coflick) ? "true" : "false" ) ; - printf( "coisti = %s\n" , (model->HSM2_coisti) ? "true" : "false" ) ; - printf( "conqs = %s\n" , (model->HSM2_conqs) ? "true" : "false" ) ; - printf( "cothrml = %s\n" , (model->HSM2_cothrml) ? "true" : "false" ) ; - printf( "coign = %s\n" , (model->HSM2_coign) ? "true" : "false" ) ; - } - /* print inputs ------------AA */ - -#ifdef DEBUG_HISIM2CGG - /* Print convergence flag */ - printf("isConv %d ", isConv ); - printf("CKTtime %e ", ckt->CKTtime ); - printf("Vb %1.3e ", (model->HSM2_type>0) ? vbs:-vbs ); - printf("Vd %1.3e ", (model->HSM2_type>0) ? vds:-vds ); - printf("Vg %1.3e ", (model->HSM2_type>0) ? vgs:-vgs ); -#endif - - /* call model evaluation */ - if ( HSM2evaluate(ivds, ivgs, ivbs, vbs_jct, vbd_jct, here, model, ckt) == HiSIM_ERROR ) - return (HiSIM_ERROR); - - -#ifdef DEBUG_HISIM2CGG - printf("HSM2_ids %e ", here->HSM2_ids ) ; - printf("HSM2_cggb %e ", here->HSM2_cggb ) ; - printf("\n") ; -#endif - - /* modified by T.Y. 2006.05.31 - * if ( !here->HSM2_called ) here->HSM2_called = 1; - */ - here->HSM2_called += 1; - - cdrain = here->HSM2_ids ; /* cdrain */ - qgate = here->HSM2_qg ; /* gate */ - qdrn = here->HSM2_qd ; /* drain */ - qbulk = here->HSM2_qb = -1.0 * (here->HSM2_qg + here->HSM2_qd + here->HSM2_qs); /* bulk */ - - /* print all outputs ------------VV */ - if ( model->HSM2_info >= 4 ) { - printf( "--- variables returned from HSM2evaluate() ----\n" ) ; - - printf( "von = %12.5e\n" , here->HSM2_von ) ; - printf( "vdsat = %12.5e\n" , here->HSM2_vdsat ) ; - printf( "ids = %12.5e\n" , here->HSM2_ids ) ; - - printf( "gds = %12.5e\n" , here->HSM2_gds ) ; - printf( "gm = %12.5e\n" , here->HSM2_gm ) ; - printf( "gmbs = %12.5e\n" , here->HSM2_gmbs ) ; - - printf( "cggo = %12.5e\n" , -(here->HSM2_cgdo + here->HSM2_cgso +here->HSM2_cgbo) ) ; - printf( "cgdo = %12.5e\n" , here->HSM2_cgdo ) ; - printf( "cgso = %12.5e\n" , here->HSM2_cgso ) ; - printf( "cdgo = %12.5e\n" , here->HSM2_cdgo ) ; - printf( "cddo = %12.5e\n" , here->HSM2_cddo ) ; - printf( "cdso = %12.5e\n" , here->HSM2_cdso ) ; - printf( "csgo = %12.5e\n" , here->HSM2_csgo ) ; - printf( "csdo = %12.5e\n" , here->HSM2_csdo ) ; - printf( "csso = %12.5e\n" , here->HSM2_csso ) ; - - printf( "qg = %12.5e\n" , here->HSM2_qg ) ; - printf( "qd = %12.5e\n" , here->HSM2_qd ) ; - printf( "qs = %12.5e\n" , here->HSM2_qs ) ; - - printf( "cggb = %12.5e\n" , here->HSM2_cggb ) ; - printf( "cgsb = %12.5e\n" , here->HSM2_cgsb ) ; - printf( "cgdb = %12.5e\n" , here->HSM2_cgdb ) ; - printf( "cbgb = %12.5e\n" , here->HSM2_cbgb ) ; - printf( "cbsb = %12.5e\n" , here->HSM2_cbsb ) ; - printf( "cbdb = %12.5e\n" , here->HSM2_cbdb ) ; - printf( "cdgb = %12.5e\n" , here->HSM2_cdgb ) ; - printf( "cdsb = %12.5e\n" , here->HSM2_cdsb ) ; - printf( "cddb = %12.5e\n" , here->HSM2_cddb ) ; - - printf( "ibd = %12.5e\n" , here->HSM2_ibd ) ; - printf( "ibs = %12.5e\n" , here->HSM2_ibs ) ; - printf( "gbd = %12.5e\n" , here->HSM2_gbd ) ; - printf( "gbs = %12.5e\n" , here->HSM2_gbs ) ; - printf( "capbd = %12.5e\n" , here->HSM2_capbd ) ; - printf( "capbs = %12.5e\n" , here->HSM2_capbs ) ; - printf( "qbd = %12.5e\n" , *(ckt->CKTstate0 + here->HSM2qbd) ) ; - printf( "qbs = %12.5e\n" , *(ckt->CKTstate0 + here->HSM2qbs) ) ; - - printf( "isub = %12.5e\n" , here->HSM2_isub ) ; - printf( "gbgs = %12.5e\n" , here->HSM2_gbgs ) ; - printf( "gbds = %12.5e\n" , here->HSM2_gbds ) ; - printf( "gbbs = %12.5e\n" , here->HSM2_gbbs ) ; - - printf( "S_flicker_noise * ( freq / gain ) = %.16e\n" , here->HSM2_noiflick ) ; - printf( "S_thermal_noise / ( gain * 4kT ) = %.16e\n" , here->HSM2_noithrml ) ; - printf( "S_induced_gate_noise / ( gain * freq^2 ) = %.16e\n" , here->HSM2_noiigate ) ; - printf( "cross-correlation coefficient (= Sigid/sqrt(Sig*Sid) ) = %.16e\n" , here->HSM2_noicross ) ; - /* print Surface Potentials */ - printf( "ivds %e ivgs %e ivbs %e Ps0 %.16e Pds %.16e\n" , - ivds, ivgs, ivbs, here->HSM2_ps0_prv, here->HSM2_pds_prv ) ; - } - /* print all outputs ------------AA */ - - if ( model->HSM2_info >= 3 ) { /* physical valiables vs bias */ - static int isFirst = 1; - if (isFirst) { - printf("# vbs vds vgs cggb cgdb cgsb cbgb cbdb cbsb cdgb cddb cdsb\n"); -#ifndef USE_OMP - isFirst = 0; -#endif - } - printf("%12.5e %12.5e %12.5e %12.5e %12.5e %12.5e %12.5e %12.5e %12.5e %12.5e %12.5e %12.5e\n", - vbs, vds, vgs , - here->HSM2_cggb, here->HSM2_cgdb, here->HSM2_cgsb, - here->HSM2_cbgb, here->HSM2_cbdb, here->HSM2_cbsb, - here->HSM2_cdgb, here->HSM2_cddb, here->HSM2_cdsb); - - } - /* - * check convergence - */ - isConv = 1; - if ( (here->HSM2_off == 0) || !(ckt->CKTmode & MODEINITFIX) ) { - if (Check == 1) { - ckt->CKTnoncon++; - isConv = 0; -#ifndef NEWCONV - } - else { - if (here->HSM2_mode >= 0) - Idtot = here->HSM2_ids + here->HSM2_isub - here->HSM2_ibd + here->HSM2_igidl; - else - Idtot = here->HSM2_ids + here->HSM2_ibd - here->HSM2_igidl; - tol = ckt->CKTreltol * MAX(fabs(cdhat), fabs(Idtot)) + ckt->CKTabstol; - tol2 = ckt->CKTreltol * MAX(fabs(cgbhat), fabs(Igbtot)) + ckt->CKTabstol; - tol3 = ckt->CKTreltol * MAX(fabs(cgshat), fabs(Igstot)) + ckt->CKTabstol; - tol4 = ckt->CKTreltol * MAX(fabs(cgdhat), fabs(Igdtot)) + ckt->CKTabstol; - if (fabs(cdhat - Idtot) >= tol) { - ckt->CKTnoncon++; - isConv = 0; - } - else if (fabs(cgbhat - Igbtot) >= tol2 || - fabs(cgshat - Igstot) >= tol3 || - fabs(cgdhat - Igdtot) >= tol4) { - ckt->CKTnoncon++; - isConv = 0; - } - else { - Ibtot = here->HSM2_ibs + here->HSM2_ibd - - here->HSM2_isub - here->HSM2_igidl - here->HSM2_igisl; - tol = ckt->CKTreltol * MAX(fabs(cbhat), fabs(Ibtot)) + ckt->CKTabstol; - if (fabs(cbhat - Ibtot) > tol) { - ckt->CKTnoncon++; - isConv = 0; - } - } - } -#endif /* NEWCONV */ - } - } - *(ckt->CKTstate0 + here->HSM2vbs) = vbs; - *(ckt->CKTstate0 + here->HSM2vbd) = vbd; - *(ckt->CKTstate0 + here->HSM2vgs) = vgs; - *(ckt->CKTstate0 + here->HSM2vds) = vds; - *(ckt->CKTstate0 + here->HSM2vsbs) = vsbs; - *(ckt->CKTstate0 + here->HSM2vdbs) = vdbs; - *(ckt->CKTstate0 + here->HSM2vdbd) = vdbd; - *(ckt->CKTstate0 + here->HSM2vges) = vges; - - if ((ckt->CKTmode & MODEDC) && - !(ckt->CKTmode & MODEINITFIX) && !(ckt->CKTmode & MODEINITJCT)) - showPhysVal = 1; - if (model->HSM2_show_Given && showPhysVal && isConv) { - static int isFirst = 1; - if (vds != vds_pre) - ShowPhysVals(here, model, isFirst, vds_pre, vgs, vbs, vgd, vbd, vgb); - else - ShowPhysVals(here, model, isFirst, vds, vgs, vbs, vgd, vbd, vgb); -#ifndef USE_OMP - if (isFirst) isFirst = 0; -#endif - } - - /* bulk and channel charge plus overlaps */ - - if (!ChargeComputationNeeded) goto line850; - -#ifndef NOBYPASS -line755: -#endif - - ag0 = ckt->CKTag[0]; - if (here->HSM2_mode > 0) { /* NORMAL mode */ - gcggb = here->HSM2_cggb * ag0; - gcgdb = here->HSM2_cgdb * ag0; - gcgsb = here->HSM2_cgsb * ag0; - gcgbb = -(gcggb + gcgdb + gcgsb); - - gcdgb = here->HSM2_cdgb * ag0; - gcddb = (here->HSM2_cddb + here->HSM2_capbd) * ag0; - gcdsb = here->HSM2_cdsb * ag0; - - gcsgb = -(here->HSM2_cggb + here->HSM2_cbgb + here->HSM2_cdgb) * ag0; - gcsdb = -(here->HSM2_cgdb + here->HSM2_cbdb + here->HSM2_cddb) * ag0; - gcssb = (here->HSM2_capbs - - (here->HSM2_cgsb + here->HSM2_cbsb + here->HSM2_cdsb)) * ag0; - - gcbgb = here->HSM2_cbgb * ag0; - - if ( !here->HSM2_corbnet ) { - gcdbb = -(gcdgb + gcddb + gcdsb); - gcsbb = -(gcsgb + gcsdb + gcssb); - gcbdb = (here->HSM2_cbdb - here->HSM2_capbd) * ag0; - gcbsb = (here->HSM2_cbsb - here->HSM2_capbs) * ag0; - gcdbdb = 0.0; gcsbsb = 0.0; - } else { - gcdbb = -(gcdgb + gcddb + gcdsb) + here->HSM2_capbd * ag0; - gcsbb = -(gcsgb + gcsdb + gcssb) + here->HSM2_capbs * ag0; - gcbdb = here->HSM2_cbdb * ag0; - gcbsb = here->HSM2_cbsb * ag0; - gcdbdb = - here->HSM2_capbd * ag0; - gcsbsb = - here->HSM2_capbs * ag0; - } - gcbbb = -(gcbdb + gcbgb + gcbsb); - - } - else { /* REVERSE mode */ - gcggb = here->HSM2_cggb * ag0; - gcgdb = here->HSM2_cgsb * ag0; - gcgsb = here->HSM2_cgdb * ag0; - gcgbb = -(gcggb + gcgdb + gcgsb); - - gcdgb = -(here->HSM2_cggb + here->HSM2_cbgb + here->HSM2_cdgb) * ag0; - gcddb = (here->HSM2_capbd - - (here->HSM2_cgsb + here->HSM2_cbsb + here->HSM2_cdsb)) * ag0; - gcdsb = -(here->HSM2_cgdb + here->HSM2_cbdb + here->HSM2_cddb) * ag0; - - gcsgb = here->HSM2_cdgb * ag0; - gcsdb = here->HSM2_cdsb * ag0; - gcssb = (here->HSM2_cddb + here->HSM2_capbs) * ag0; - - gcbgb = here->HSM2_cbgb * ag0; - - if ( !here->HSM2_corbnet ){ - gcdbb = -(gcdgb + gcddb + gcdsb); - gcsbb = -(gcsgb + gcsdb + gcssb); - gcbdb = (here->HSM2_cbsb - here->HSM2_capbd) * ag0; - gcbsb = (here->HSM2_cbdb - here->HSM2_capbs) * ag0; - gcdbdb = 0.0; gcsbsb = 0.0; - } else { - gcdbb = -(gcdgb + gcddb + gcdsb) + here->HSM2_capbd * ag0; - gcsbb = -(gcsgb + gcsdb + gcssb) + here->HSM2_capbs * ag0; - gcbdb = here->HSM2_cbsb * ag0; - gcbsb = here->HSM2_cbdb * ag0; - gcdbdb = - here->HSM2_capbd * ag0; - gcsbsb = - here->HSM2_capbs * ag0; - } - gcbbb = -(gcbgb + gcbdb + gcbsb); - - qdrn = -(qgate + qbulk + qdrn); - } - - if (ByPass) goto line860; - - *(ckt->CKTstate0 + here->HSM2qg) = qgate; - *(ckt->CKTstate0 + here->HSM2qd) = qdrn - *(ckt->CKTstate0 + here->HSM2qbd); - if ( !here->HSM2_corbnet ) { - *(ckt->CKTstate0 + here->HSM2qb) = qbulk - + *(ckt->CKTstate0 + here->HSM2qbd) + *(ckt->CKTstate0 + here->HSM2qbs); - } else { - *(ckt->CKTstate0 + here->HSM2qb) = qbulk; - } - -#ifdef DEBUG_HISIM2LD - printf( "qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq\n" ) ; - printf( "HSM2qg = %12.5e\n" , *(ckt->CKTstate0 + here->HSM2qg) ) ; - printf( "HSM2qd = %12.5e\n" , *(ckt->CKTstate0 + here->HSM2qd) ) ; - printf( "HSM2qb = %12.5e\n" , *(ckt->CKTstate0 + here->HSM2qb) ) ; - printf( "qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq\n" ) ; -#endif - - /* store small signal parameters */ - if (ckt->CKTmode & MODEINITSMSIG) goto line1000; - if (!ChargeComputationNeeded) goto line850; - - if (ckt->CKTmode & MODEINITTRAN) { - *(ckt->CKTstate1 + here->HSM2qb) = *(ckt->CKTstate0 + here->HSM2qb); - *(ckt->CKTstate1 + here->HSM2qg) = *(ckt->CKTstate0 + here->HSM2qg); - *(ckt->CKTstate1 + here->HSM2qd) = *(ckt->CKTstate0 + here->HSM2qd); - if ( here->HSM2_corbnet ) { - *(ckt->CKTstate1 + here->HSM2qbs) = *(ckt->CKTstate0 + here->HSM2qbs); - *(ckt->CKTstate1 + here->HSM2qbd) = *(ckt->CKTstate0 + here->HSM2qbd); - } - } - - return_if_error (NIintegrate(ckt, &geq, &ceq, 0.0, here->HSM2qb)); - return_if_error (NIintegrate(ckt, &geq, &ceq, 0.0, here->HSM2qg)); - return_if_error (NIintegrate(ckt, &geq, &ceq, 0.0, here->HSM2qd)); - if ( here->HSM2_corbnet ) { - return_if_error (NIintegrate(ckt, &geq, &ceq, 0.0, here->HSM2qbs)); - return_if_error (NIintegrate(ckt, &geq, &ceq, 0.0, here->HSM2qbd)); - } - - goto line860; - - line850: - /* initialize to zero charge conductance and current */ - ceqqg = ceqqb = ceqqd = 0.0; - ceqqjd = ceqqjs = 0.0; - - gcdgb = gcddb = gcdsb = gcdbb = 0.0; - gcsgb = gcsdb = gcssb = gcsbb = 0.0; - gcggb = gcgdb = gcgsb = gcgbb = 0.0; - gcbgb = gcbdb = gcbsb = gcbbb = 0.0; - - gcdbdb = gcsbsb = 0.0; - - goto line900; - - line860: - /* evaluate equivalent charge current */ - - cqgate = *(ckt->CKTstate0 + here->HSM2cqg); - cqbulk = *(ckt->CKTstate0 + here->HSM2cqb); - cqdrn = *(ckt->CKTstate0 + here->HSM2cqd); - -#ifdef DEBUG_HISIM2LD - printf( "iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii\n" ) ; - printf( "cqgate = %12.5e\n" , cqgate ) ; - printf( "cqbulk = %12.5e\n" , cqbulk ) ; - printf( "cqdrn = %12.5e\n" , cqdrn ) ; - printf( "iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii\n" ) ; -#endif - - ceqqg = cqgate - gcggb * vgb + gcgdb * vbd + gcgsb * vbs; - ceqqd = cqdrn - gcdgb * vgb + (gcddb + gcdbdb) * vbd - gcdbdb * vbd_jct + gcdsb * vbs; - ceqqb = cqbulk - gcbgb * vgb + gcbdb * vbd + gcbsb * vbs; - - if (here->HSM2_corbnet) { - ceqqjs = *(ckt->CKTstate0 + here->HSM2cqbs) + gcsbsb * vbs_jct; - ceqqjd = *(ckt->CKTstate0 + here->HSM2cqbd) + gcdbdb * vbd_jct; - } - - if (ckt->CKTmode & MODEINITTRAN) { - *(ckt->CKTstate1 + here->HSM2cqb) = *(ckt->CKTstate0 + here->HSM2cqb); - *(ckt->CKTstate1 + here->HSM2cqg) = *(ckt->CKTstate0 + here->HSM2cqg); - *(ckt->CKTstate1 + here->HSM2cqd) = *(ckt->CKTstate0 + here->HSM2cqd); - if (here->HSM2_corbnet) { - *(ckt->CKTstate1 + here->HSM2cqbs) = *(ckt->CKTstate0 + here->HSM2cqbs); - *(ckt->CKTstate1 + here->HSM2cqbd) = *(ckt->CKTstate0 + here->HSM2cqbd); - } - } - - /* - * load current vector - */ - line900: - - if (here->HSM2_mode >= 0) { /* NORMAL mode */ - gm = here->HSM2_gm; - gmbs = here->HSM2_gmbs; - FwdSum = gm + gmbs; - RevSum = 0.0; - - cdreq = model->HSM2_type * - (cdrain - here->HSM2_gds * vds - gm * vgs - gmbs * vbs); - ceqbd = model->HSM2_type * (here->HSM2_isub + here->HSM2_igidl - - (here->HSM2_gbds + here->HSM2_gigidlds) * vds - - (here->HSM2_gbgs + here->HSM2_gigidlgs) * vgs - - (here->HSM2_gbbs + here->HSM2_gigidlbs) * vbs); - ceqbs = model->HSM2_type * (here->HSM2_igisl - + here->HSM2_gigislsd * vds - - here->HSM2_gigislgd * vgd - - here->HSM2_gigislbd * vbd); - - gbbdp = -here->HSM2_gbds; - gbbsp = here->HSM2_gbds + here->HSM2_gbgs + here->HSM2_gbbs; - - gbdpg = here->HSM2_gbgs; - gbdpdp = here->HSM2_gbds; - gbdpb = here->HSM2_gbbs; - gbdpsp = -(gbdpg + gbdpdp + gbdpb); - - gbspg = 0.0; - gbspdp = 0.0; - gbspb = 0.0; - gbspsp = 0.0; - - if (model->HSM2_coiigs) { - gIbtotg = here->HSM2_gigbg; - gIbtotd = here->HSM2_gigbd; - gIbtots = here->HSM2_gigbs; - gIbtotb = here->HSM2_gigbb; - Ibtoteq = model->HSM2_type * - (here->HSM2_igb - here->HSM2_gigbg * vgs - - here->HSM2_gigbd * vds - here->HSM2_gigbb * vbs); - - gIstotg = here->HSM2_gigsg; - gIstotd = here->HSM2_gigsd; - gIstots = here->HSM2_gigss; - gIstotb = here->HSM2_gigsb; - Istoteq = model->HSM2_type * - (here->HSM2_igs - here->HSM2_gigsg * vgs - - here->HSM2_gigsd * vds - here->HSM2_gigsb * vbs); - - gIdtotg = here->HSM2_gigdg; - gIdtotd = here->HSM2_gigdd; - gIdtots = here->HSM2_gigds; - gIdtotb = here->HSM2_gigdb; - Idtoteq = model->HSM2_type * - (here->HSM2_igd - here->HSM2_gigdg * vgs - - here->HSM2_gigdd * vds - here->HSM2_gigdb * vbs); - } - else { - gIbtotg = gIbtotd = gIbtots = gIbtotb = Ibtoteq = 0.0; - gIstotg = gIstotd = gIstots = gIstotb = Istoteq = 0.0; - gIdtotg = gIdtotd = gIdtots = gIdtotb = Idtoteq = 0.0; - } - - if (model->HSM2_coiigs) { - gIgtotg = gIbtotg + gIstotg + gIdtotg; - gIgtotd = gIbtotd + gIstotd + gIdtotd; - gIgtots = gIbtots + gIstots + gIdtots; - gIgtotb = gIbtotb + gIstotb + gIdtotb; - Igtoteq = Ibtoteq + Istoteq + Idtoteq; - } - else - gIgtotg = gIgtotd = gIgtots = gIgtotb = Igtoteq = 0.0; - - } - else { /* REVERSE mode */ - gm = - here->HSM2_gm; - gmbs = - here->HSM2_gmbs; - FwdSum = 0.0; - RevSum = -(gm + gmbs); - cdreq = -model->HSM2_type * (cdrain + here->HSM2_gds * vds + gm * vgd + gmbs * vbd); - - ceqbs = model->HSM2_type * (here->HSM2_isub + here->HSM2_igisl - + (here->HSM2_gbds + here->HSM2_gigislsd) * vds - - (here->HSM2_gbgs + here->HSM2_gigislgd) * vgd - - (here->HSM2_gbbs + here->HSM2_gigislbd) * vbd); - ceqbd = model->HSM2_type * (here->HSM2_igidl - - here->HSM2_gigidlds * vds - - here->HSM2_gigidlgs * vgs - - here->HSM2_gigidlbs * vbs); - - gbbsp = - here->HSM2_gbds; - gbbdp = here->HSM2_gbds + here->HSM2_gbgs + here->HSM2_gbbs; - - gbdpg = 0.0; - gbdpsp = 0.0; - gbdpb = 0.0; - gbdpdp = 0.0; - - gbspg = here->HSM2_gbgs; - gbspsp = here->HSM2_gbds; - gbspb = here->HSM2_gbbs; - gbspdp = -(gbspg + gbspsp + gbspb); - - if (model->HSM2_coiigs) { - gIbtotg = here->HSM2_gigbg; - gIbtotd = here->HSM2_gigbd; - gIbtots = here->HSM2_gigbs; - gIbtotb = here->HSM2_gigbb; - Ibtoteq = model->HSM2_type * - (here->HSM2_igb - here->HSM2_gigbg * vgd - + here->HSM2_gigbs * vds - here->HSM2_gigbb * vbd); - - gIstotg = here->HSM2_gigsg; - gIstotd = here->HSM2_gigsd; - gIstots = here->HSM2_gigss; - gIstotb = here->HSM2_gigsb; - Istoteq = model->HSM2_type * - (here->HSM2_igs - here->HSM2_gigsg * vgd - + here->HSM2_gigss * vds - here->HSM2_gigsb * vbd); - - gIdtotg = here->HSM2_gigdg; - gIdtotd = here->HSM2_gigdd; - gIdtots = here->HSM2_gigds; - gIdtotb = here->HSM2_gigdb; - Idtoteq = model->HSM2_type * - (here->HSM2_igd - here->HSM2_gigdg * vgd - + here->HSM2_gigds * vds - here->HSM2_gigdb * vbd); - } - else { - gIbtotg = gIbtotd = gIbtots = gIbtotb = Ibtoteq = 0.0; - gIstotg = gIstotd = gIstots = gIstotb = Istoteq = 0.0; - gIdtotg = gIdtotd = gIdtots = gIdtotb = Idtoteq = 0.0; - } - - if (model->HSM2_coiigs) { - gIgtotg = gIbtotg + gIstotg + gIdtotg; - gIgtotd = gIbtotd + gIstotd + gIdtotd; - gIgtots = gIbtots + gIstots + gIdtots; - gIgtotb = gIbtotb + gIstotb + gIdtotb; - Igtoteq = Ibtoteq + Istoteq + Idtoteq; - } - else - gIgtotg = gIgtotd = gIgtots = gIgtotb = Igtoteq = 0.0; - - } - - if (model->HSM2_type > 0) { - ceqjs = here->HSM2_ibs - here->HSM2_gbs * vbs_jct; - ceqjd = here->HSM2_ibd - here->HSM2_gbd * vbd_jct; - } - else { - ceqjs = -(here->HSM2_ibs - here->HSM2_gbs * vbs_jct); - ceqjd = -(here->HSM2_ibd - here->HSM2_gbd * vbd_jct); - ceqqg = -ceqqg; - ceqqb = -ceqqb; - ceqqd = -ceqqd; - - if (here->HSM2_corbnet) { - ceqqjs = -ceqqjs; - ceqqjd = -ceqqjd; - } - } - -#ifdef DEBUG_HISIM2LD - printf( "----------------------------------------------------\n" ) ; - printf( "ceqqg = %12.5e\n" , ceqqg ) ; - printf( "....................................................\n" ) ; - printf( "ceqbs = %12.5e\n" , ceqbs ) ; - printf( "ceqbd = %12.5e\n" , ceqbd ) ; - printf( "ceqqb = %12.5e\n" , ceqqb ) ; - printf( "....................................................\n" ) ; - printf( "ceqbd = %12.5e\n" , ceqbd ) ; - printf( "cdreq = %12.5e\n" , cdreq ) ; - printf( "ceqqd = %12.5e\n" , ceqqd ) ; - printf( "----------------------------------------------------\n" ) ; -#endif - -#ifdef USE_OMP - here->HSM2rhsdPrime = ceqjd - ceqbd - cdreq - ceqqd + Idtoteq; - here->HSM2rhsgPrime = ceqqg + Igtoteq; - - if ( !here->HSM2_corbnet ) { - here->HSM2rhsbPrime = ceqbd + ceqbs - ceqjd - ceqjs - ceqqb + Ibtoteq; - here->HSM2rhssPrime = cdreq - ceqbs + ceqjs + ceqqg + ceqqb + ceqqd + Istoteq; - } else { - here->HSM2rhsdb = ceqjd + ceqqjd; - here->HSM2rhsbPrime = ceqbd + ceqbs - ceqqb + Ibtoteq; - here->HSM2rhssb = ceqjs + ceqqjs; - here->HSM2rhssPrime = cdreq - ceqbs + ceqjs + ceqqd - + ceqqg + ceqqb + ceqqjd + ceqqjs + Istoteq; - } -#else - *(ckt->CKTrhs + here->HSM2dNodePrime) += ceqjd - ceqbd - cdreq - ceqqd + Idtoteq; - *(ckt->CKTrhs + here->HSM2gNodePrime) -= ceqqg + Igtoteq; - - if ( !here->HSM2_corbnet ) { - *(ckt->CKTrhs + here->HSM2bNodePrime) += ceqbd + ceqbs - ceqjd - ceqjs - ceqqb + Ibtoteq; - *(ckt->CKTrhs + here->HSM2sNodePrime) += cdreq - ceqbs + ceqjs + ceqqg + ceqqb + ceqqd + Istoteq; - } else { - *(ckt->CKTrhs + here->HSM2dbNode) -= ceqjd + ceqqjd; - *(ckt->CKTrhs + here->HSM2bNodePrime) += ceqbd + ceqbs - ceqqb + Ibtoteq; - *(ckt->CKTrhs + here->HSM2sbNode) -= ceqjs + ceqqjs; - *(ckt->CKTrhs + here->HSM2sNodePrime) += cdreq - ceqbs + ceqjs + ceqqd - + ceqqg + ceqqb + ceqqjd + ceqqjs + Istoteq; - } -#endif - -#ifdef DEBUG_HISIM2LD - printf ("id ig ib is %12.5e %12.5e %12.5e %12.5e\n", ceqjd - ceqbd - cdreq - ceqqd + Idtoteq, - -(ceqqg + Igtoteq), ceqbd + ceqbs - ceqjd - ceqjs - ceqqb + Ibtoteq, - cdreq - ceqbs + ceqjs + ceqqg + ceqqb + ceqqd + Istoteq); -#endif - - /* - * load y matrix - */ - - if ( !here->HSM2_corbnet ){ - gjbd = here->HSM2_gbd; - gjbs = here->HSM2_gbs; - } else - gjbd = gjbs = 0.0; - -#ifdef USE_OMP - if (here->HSM2_corg == 1) { - grg = here->HSM2_grg; - here->HSM2_1 = grg; - here->HSM2_2 = grg; - here->HSM2_3 = grg; - here->HSM2_4 = gcggb + grg + gIgtotg; - here->HSM2_5 = gcgdb + gIgtotd; - here->HSM2_6 = gcgsb + gIgtots; - here->HSM2_7 = gcgbb + gIgtotb; - } else { - here->HSM2_8 = gcggb + gIgtotg; - here->HSM2_9 = gcgdb + gIgtotd; - here->HSM2_10 = gcgsb + gIgtots; - here->HSM2_11 = gcgbb + gIgtotb; - } - - here->HSM2_12 = here->HSM2drainConductance - + here->HSM2_gds + here->HSM2_gbd + RevSum + gcddb + gbdpdp - gIdtotd; - here->HSM2_13 = here->HSM2drainConductance; - here->HSM2_14 = gm + gcdgb + gbdpg - gIdtotg; - here->HSM2_15 = here->HSM2_gds + FwdSum - gcdsb - gbdpsp + gIdtots; - here->HSM2_16 = gjbd - gmbs - gcdbb - gbdpb + gIdtotb; - - here->HSM2_17 = here->HSM2drainConductance; - here->HSM2_18 = here->HSM2drainConductance; - - here->HSM2_19 = here->HSM2_gds + RevSum - gcsdb - gbspdp + gIstotd; - here->HSM2_20 = gcsgb - gm + gbspg - gIstotg; - here->HSM2_21 = here->HSM2sourceConductance - + here->HSM2_gds + here->HSM2_gbs + FwdSum + gcssb + gbspsp - gIstots; - here->HSM2_22 = here->HSM2sourceConductance; - here->HSM2_23 = gjbs + gmbs - gcsbb - gbspb + gIstotb; - - here->HSM2_24 = here->HSM2sourceConductance; - here->HSM2_25 = here->HSM2sourceConductance; - - here->HSM2_26 = gcbdb - gjbd + gbbdp - gIbtotd; - here->HSM2_27 = gcbgb - here->HSM2_gbgs - gIbtotg; - here->HSM2_28 = gcbsb - gjbs + gbbsp - gIbtots; - here->HSM2_29 = gjbd + gjbs + gcbbb - here->HSM2_gbbs - gIbtotb; - - if (model->HSM2_cogidl) { - /* stamp GIDL */ - here->HSM2_30 = here->HSM2_gigidlds; - here->HSM2_31 = here->HSM2_gigidlgs; - here->HSM2_32 = (here->HSM2_gigidlgs + - here->HSM2_gigidlds + here->HSM2_gigidlbs); - here->HSM2_33 = here->HSM2_gigidlbs; - here->HSM2_34 = here->HSM2_gigidlds; - here->HSM2_35 = here->HSM2_gigidlgs; - here->HSM2_36 = (here->HSM2_gigidlgs + - here->HSM2_gigidlds + here->HSM2_gigidlbs); - here->HSM2_37 = here->HSM2_gigidlbs; - /* stamp GISL */ - here->HSM2_38 = (here->HSM2_gigislsd + - here->HSM2_gigislgd + here->HSM2_gigislbd); - here->HSM2_39 = here->HSM2_gigislgd; - here->HSM2_40 = here->HSM2_gigislsd; - here->HSM2_41 = here->HSM2_gigislbd; - here->HSM2_42 = (here->HSM2_gigislgd + - here->HSM2_gigislsd + here->HSM2_gigislbd); - here->HSM2_43 = here->HSM2_gigislgd; - here->HSM2_44 = here->HSM2_gigislsd; - here->HSM2_45 = here->HSM2_gigislbd; - } - - if (here->HSM2_corbnet) { /* body resistance network */ - here->HSM2_46 = gcdbdb - here->HSM2_gbd; - here->HSM2_47 = here->HSM2_gbs - gcsbsb; - - here->HSM2_48 = gcdbdb - here->HSM2_gbd; - here->HSM2_49 = here->HSM2_gbd - gcdbdb - + here->HSM2_grbpd + here->HSM2_grbdb; - here->HSM2_50 = here->HSM2_grbpd; - here->HSM2_51 = here->HSM2_grbdb; - - here->HSM2_52 = here->HSM2_grbpd; - here->HSM2_53 = here->HSM2_grbpb; - here->HSM2_54 = here->HSM2_grbps; - here->HSM2_55 = here->HSM2_grbpd + here->HSM2_grbps + here->HSM2_grbpb; - - here->HSM2_56 = gcsbsb - here->HSM2_gbs; - here->HSM2_57 = here->HSM2_grbps; - here->HSM2_58 = here->HSM2_grbsb; - here->HSM2_59 = here->HSM2_gbs - gcsbsb - + here->HSM2_grbps + here->HSM2_grbsb; - - here->HSM2_60 = here->HSM2_grbdb; - here->HSM2_61 = here->HSM2_grbpb; - here->HSM2_62 = here->HSM2_grbsb; - here->HSM2_63 = here->HSM2_grbsb + here->HSM2_grbdb + here->HSM2_grbpb; - } -#else - if (here->HSM2_corg == 1) { - grg = here->HSM2_grg; - *(here->HSM2GgPtr) += grg; - *(here->HSM2GPgPtr) -= grg; - *(here->HSM2GgpPtr) -= grg; - *(here->HSM2GPgpPtr) += gcggb + grg + gIgtotg; - *(here->HSM2GPdpPtr) += gcgdb + gIgtotd; - *(here->HSM2GPspPtr) += gcgsb + gIgtots; - *(here->HSM2GPbpPtr) += gcgbb + gIgtotb; - } else { - *(here->HSM2GPgpPtr) += gcggb + gIgtotg; - *(here->HSM2GPdpPtr) += gcgdb + gIgtotd; - *(here->HSM2GPspPtr) += gcgsb + gIgtots; - *(here->HSM2GPbpPtr) += gcgbb + gIgtotb; - } - - *(here->HSM2DPdpPtr) += here->HSM2drainConductance - + here->HSM2_gds + here->HSM2_gbd + RevSum + gcddb + gbdpdp - gIdtotd; - *(here->HSM2DPdPtr) -= here->HSM2drainConductance; - *(here->HSM2DPgpPtr) += gm + gcdgb + gbdpg - gIdtotg; - *(here->HSM2DPspPtr) -= here->HSM2_gds + FwdSum - gcdsb - gbdpsp + gIdtots; - *(here->HSM2DPbpPtr) -= gjbd - gmbs - gcdbb - gbdpb + gIdtotb; - - *(here->HSM2DdpPtr) -= here->HSM2drainConductance; - *(here->HSM2DdPtr) += here->HSM2drainConductance; - - *(here->HSM2SPdpPtr) -= here->HSM2_gds + RevSum - gcsdb - gbspdp + gIstotd; - *(here->HSM2SPgpPtr) += gcsgb - gm + gbspg - gIstotg; - *(here->HSM2SPspPtr) += here->HSM2sourceConductance - + here->HSM2_gds + here->HSM2_gbs + FwdSum + gcssb + gbspsp - gIstots; - *(here->HSM2SPsPtr) -= here->HSM2sourceConductance; - *(here->HSM2SPbpPtr) -= gjbs + gmbs - gcsbb - gbspb + gIstotb; - - *(here->HSM2SspPtr) -= here->HSM2sourceConductance; - *(here->HSM2SsPtr) += here->HSM2sourceConductance; - - *(here->HSM2BPdpPtr) += gcbdb - gjbd + gbbdp - gIbtotd; - *(here->HSM2BPgpPtr) += gcbgb - here->HSM2_gbgs - gIbtotg; - *(here->HSM2BPspPtr) += gcbsb - gjbs + gbbsp - gIbtots; - *(here->HSM2BPbpPtr) += gjbd + gjbs + gcbbb - here->HSM2_gbbs - gIbtotb; - - if (model->HSM2_cogidl) { - /* stamp GIDL */ - *(here->HSM2DPdpPtr) += here->HSM2_gigidlds; - *(here->HSM2DPgpPtr) += here->HSM2_gigidlgs; - *(here->HSM2DPspPtr) -= (here->HSM2_gigidlgs + - here->HSM2_gigidlds + here->HSM2_gigidlbs); - *(here->HSM2DPbpPtr) += here->HSM2_gigidlbs; - *(here->HSM2BPdpPtr) -= here->HSM2_gigidlds; - *(here->HSM2BPgpPtr) -= here->HSM2_gigidlgs; - *(here->HSM2BPspPtr) += (here->HSM2_gigidlgs + - here->HSM2_gigidlds + here->HSM2_gigidlbs); - *(here->HSM2BPbpPtr) -= here->HSM2_gigidlbs; - /* stamp GISL */ - *(here->HSM2SPdpPtr) -= (here->HSM2_gigislsd + - here->HSM2_gigislgd + here->HSM2_gigislbd); - *(here->HSM2SPgpPtr) += here->HSM2_gigislgd; - *(here->HSM2SPspPtr) += here->HSM2_gigislsd; - *(here->HSM2SPbpPtr) += here->HSM2_gigislbd; - *(here->HSM2BPdpPtr) += (here->HSM2_gigislgd + - here->HSM2_gigislsd + here->HSM2_gigislbd); - *(here->HSM2BPgpPtr) -= here->HSM2_gigislgd; - *(here->HSM2BPspPtr) -= here->HSM2_gigislsd; - *(here->HSM2BPbpPtr) -= here->HSM2_gigislbd; - } - - if (here->HSM2_corbnet) { /* body resistance network */ - *(here->HSM2DPdbPtr) += gcdbdb - here->HSM2_gbd; - *(here->HSM2SPsbPtr) -= here->HSM2_gbs - gcsbsb; - - *(here->HSM2DBdpPtr) += gcdbdb - here->HSM2_gbd; - *(here->HSM2DBdbPtr) += here->HSM2_gbd - gcdbdb - + here->HSM2_grbpd + here->HSM2_grbdb; - *(here->HSM2DBbpPtr) -= here->HSM2_grbpd; - *(here->HSM2DBbPtr) -= here->HSM2_grbdb; - - *(here->HSM2BPdbPtr) -= here->HSM2_grbpd; - *(here->HSM2BPbPtr) -= here->HSM2_grbpb; - *(here->HSM2BPsbPtr) -= here->HSM2_grbps; - *(here->HSM2BPbpPtr) += here->HSM2_grbpd + here->HSM2_grbps + here->HSM2_grbpb; - - *(here->HSM2SBspPtr) += gcsbsb - here->HSM2_gbs; - *(here->HSM2SBbpPtr) -= here->HSM2_grbps; - *(here->HSM2SBbPtr) -= here->HSM2_grbsb; - *(here->HSM2SBsbPtr) += here->HSM2_gbs - gcsbsb - + here->HSM2_grbps + here->HSM2_grbsb; - - *(here->HSM2BdbPtr) -= here->HSM2_grbdb; - *(here->HSM2BbpPtr) -= here->HSM2_grbpb; - *(here->HSM2BsbPtr) -= here->HSM2_grbsb; - *(here->HSM2BbPtr) += here->HSM2_grbsb + here->HSM2_grbdb + here->HSM2_grbpb; - } -#endif - - line1000: - ; - -#ifndef USE_OMP - } /* End of MOSFET Instance */ - } /* End of Model Instance */ -#endif - -#ifdef MOS_MODEL_TIME -tm1 = gtodsecld() ; -mos_model_time += ( tm1 - tm0 ) ; -sprintf( mos_model_name , "HiSIM 240BSC1" ) ; -#ifdef PARAMOS_TIME -vsum = vbs + vds + vgs ; -if ( vsum < vsum0 - 1e-6 || vsum > vsum0 + 1e-6 ) { -printf( "PMVbs= %12.5e\n" , vbs ) ; -printf( "PMVds= %12.5e\n" , vds ) ; -printf( "PMVgs= %12.5e\n" , vgs ) ; -printf( "PMTime= %12.5e\n" , tm1 - tm0 ) ; -} -vsum0 = vsum ; -#endif -#endif - - return(OK); -} - -#ifdef USE_OMP -void HSM2LoadRhsMat(GENmodel *inModel, CKTcircuit *ckt) -{ - int InstCount, idx; - HSM2instance **InstArray; - HSM2instance *here; - HSM2model *model = (HSM2model*)inModel; - - InstArray = model->HSM2InstanceArray; - InstCount = model->HSM2InstCount; - - for (idx = 0; idx < InstCount; idx++) { - here = InstArray[idx]; - model = HSM2modPtr(here); - /* Update b for Ax = b */ - *(ckt->CKTrhs + here->HSM2dNodePrime) += here->HSM2rhsdPrime; - *(ckt->CKTrhs + here->HSM2gNodePrime) -= here->HSM2rhsgPrime; - - if ( !here->HSM2_corbnet ) { - *(ckt->CKTrhs + here->HSM2bNodePrime) += here->HSM2rhsbPrime; - *(ckt->CKTrhs + here->HSM2sNodePrime) += here->HSM2rhssPrime; - } else { - *(ckt->CKTrhs + here->HSM2dbNode) -= here->HSM2rhsdb; - *(ckt->CKTrhs + here->HSM2bNodePrime) += here->HSM2rhsbPrime; - *(ckt->CKTrhs + here->HSM2sbNode) -= here->HSM2rhssb; - *(ckt->CKTrhs + here->HSM2sNodePrime) += here->HSM2rhssPrime; - } - - /* Update A for Ax = b */ - if (here->HSM2_corg == 1) { - *(here->HSM2GgPtr) += here->HSM2_1; - *(here->HSM2GPgPtr) -= here->HSM2_2; - *(here->HSM2GgpPtr) -= here->HSM2_3; - *(here->HSM2GPgpPtr) += here->HSM2_4; - *(here->HSM2GPdpPtr) += here->HSM2_5; - *(here->HSM2GPspPtr) += here->HSM2_6; - *(here->HSM2GPbpPtr) += here->HSM2_7; - } else { - *(here->HSM2GPgpPtr) += here->HSM2_8; - *(here->HSM2GPdpPtr) += here->HSM2_9; - *(here->HSM2GPspPtr) += here->HSM2_10; - *(here->HSM2GPbpPtr) += here->HSM2_11; - } - - *(here->HSM2DPdpPtr) += here->HSM2_12; - - *(here->HSM2DPdPtr) -= here->HSM2_13; - *(here->HSM2DPgpPtr) += here->HSM2_14; - *(here->HSM2DPspPtr) -= here->HSM2_15; - *(here->HSM2DPbpPtr) -= here->HSM2_16; - - *(here->HSM2DdpPtr) -= here->HSM2_17; - *(here->HSM2DdPtr) += here->HSM2_18; - - *(here->HSM2SPdpPtr) -= here->HSM2_19; - *(here->HSM2SPgpPtr) += here->HSM2_20; - *(here->HSM2SPspPtr) += here->HSM2_21; - - *(here->HSM2SPsPtr) -= here->HSM2_22; - *(here->HSM2SPbpPtr) -= here->HSM2_23; - - *(here->HSM2SspPtr) -= here->HSM2_24; - *(here->HSM2SsPtr) += here->HSM2_25; - - *(here->HSM2BPdpPtr) += here->HSM2_26; - *(here->HSM2BPgpPtr) += here->HSM2_27; - *(here->HSM2BPspPtr) += here->HSM2_28; - *(here->HSM2BPbpPtr) += here->HSM2_29; - - if (model->HSM2_cogidl) { - /* stamp GIDL */ - *(here->HSM2DPdpPtr) += here->HSM2_30; - *(here->HSM2DPgpPtr) += here->HSM2_31; - *(here->HSM2DPspPtr) -= here->HSM2_32; - - *(here->HSM2DPbpPtr) += here->HSM2_33; - *(here->HSM2BPdpPtr) -= here->HSM2_34; - *(here->HSM2BPgpPtr) -= here->HSM2_35; - *(here->HSM2BPspPtr) += here->HSM2_36; - - *(here->HSM2BPbpPtr) -= here->HSM2_37; - /* stamp GISL */ - *(here->HSM2SPdpPtr) -= here->HSM2_38; - - *(here->HSM2SPgpPtr) += here->HSM2_39; - *(here->HSM2SPspPtr) += here->HSM2_40; - *(here->HSM2SPbpPtr) += here->HSM2_41; - *(here->HSM2BPdpPtr) += here->HSM2_42; - - *(here->HSM2BPgpPtr) -= here->HSM2_43; - *(here->HSM2BPspPtr) -= here->HSM2_44; - *(here->HSM2BPbpPtr) -= here->HSM2_45; - } - - if (here->HSM2_corbnet) { /* body resistance network */ - *(here->HSM2DPdbPtr) += here->HSM2_46; - *(here->HSM2SPsbPtr) -= here->HSM2_47; - - *(here->HSM2DBdpPtr) += here->HSM2_48; - *(here->HSM2DBdbPtr) += here->HSM2_49; - - *(here->HSM2DBbpPtr) -= here->HSM2_50; - *(here->HSM2DBbPtr) -= here->HSM2_51; - - *(here->HSM2BPdbPtr) -= here->HSM2_52; - *(here->HSM2BPbPtr) -= here->HSM2_53; - *(here->HSM2BPsbPtr) -= here->HSM2_54; - *(here->HSM2BPbpPtr) += here->HSM2_55; - - *(here->HSM2SBspPtr) += here->HSM2_56; - *(here->HSM2SBbpPtr) -= here->HSM2_57; - *(here->HSM2SBbPtr) -= here->HSM2_58; - *(here->HSM2SBsbPtr) += here->HSM2_59; - - - *(here->HSM2BdbPtr) -= here->HSM2_60; - *(here->HSM2BbpPtr) -= here->HSM2_61; - *(here->HSM2BsbPtr) -= here->HSM2_62; - *(here->HSM2BbPtr) += here->HSM2_63; - } - } -} -#endif diff --git a/src/spicelib/devices/hisim2/hsm2mask.c b/src/spicelib/devices/hisim2/hsm2mask.c deleted file mode 100644 index 832747b54..000000000 --- a/src/spicelib/devices/hisim2/hsm2mask.c +++ /dev/null @@ -1,1761 +0,0 @@ -/*********************************************************************** - - HiSIM (Hiroshima University STARC IGFET Model) - Copyright (C) 2014 Hiroshima University & STARC - - MODEL NAME : HiSIM - ( VERSION : 2 SUBVERSION : 8 REVISION : 0 ) - - FILE : hsm2mask.c - - Date : 2014.6.5 - - released by - Hiroshima University & - Semiconductor Technology Academic Research Center (STARC) -***********************************************************************/ - -/********************************************************************** - -The following source code, and all copyrights, trade secrets or other -intellectual property rights in and to the source code in its entirety, -is owned by the Hiroshima University and the STARC organization. - -All users need to follow the "HiSIM2 Distribution Statement and -Copyright Notice" attached to HiSIM2 model. - ------HiSIM2 Distribution Statement and Copyright Notice-------------- - -Software is distributed as is, completely without warranty or service -support. Hiroshima University or STARC and its employees are not liable -for the condition or performance of the software. - -Hiroshima University and STARC own the copyright and grant users a perpetual, -irrevocable, worldwide, non-exclusive, royalty-free license with respect -to the software as set forth below. - -Hiroshima University and STARC hereby disclaim all implied warranties. - -Hiroshima University and STARC grant the users the right to modify, copy, -and redistribute the software and documentation, both within the user's -organization and externally, subject to the following restrictions - -1. The users agree not to charge for Hiroshima University and STARC code -itself but may charge for additions, extensions, or support. - -2. In any product based on the software, the users agree to acknowledge -Hiroshima University and STARC that developed the software. This -acknowledgment shall appear in the product documentation. - -3. The users agree to reproduce any copyright notice which appears on -the software on any copy or modification of such made available -to others." - - -*************************************************************************/ - -#include "ngspice/ngspice.h" -#include "ngspice/ifsim.h" -#include "ngspice/cktdefs.h" -#include "ngspice/devdefs.h" -#include "hsm2def.h" -#include "ngspice/sperror.h" -#include "ngspice/suffix.h" - -int HSM2mAsk( - CKTcircuit *ckt, - GENmodel *inst, - int which, - IFvalue *value) -{ - HSM2model *model = (HSM2model *)inst; - - NG_IGNORE(ckt); - - switch (which) { - case HSM2_MOD_NMOS: - value->iValue = model->HSM2_type; - return(OK); - case HSM2_MOD_PMOS: - value->iValue = model->HSM2_type; - return(OK); - case HSM2_MOD_LEVEL: - value->iValue = model->HSM2_level; - return(OK); - case HSM2_MOD_INFO: - value->iValue = model->HSM2_info; - return(OK); - case HSM2_MOD_NOISE: - value->iValue = model->HSM2_noise; - return(OK); - case HSM2_MOD_VERSION: - value->iValue = model->HSM2_version; - return(OK); - case HSM2_MOD_SHOW: - value->iValue = model->HSM2_show; - return(OK); - case HSM2_MOD_CORSRD: - value->iValue = model->HSM2_corsrd; - return(OK); - case HSM2_MOD_CORG: - value->iValue = model->HSM2_corg; - return(OK); - case HSM2_MOD_COIPRV: - value->iValue = model->HSM2_coiprv; - return(OK); - case HSM2_MOD_COPPRV: - value->iValue = model->HSM2_copprv; - return(OK); - case HSM2_MOD_COADOV: - value->iValue = model->HSM2_coadov; - return(OK); - case HSM2_MOD_COISUB: - value->iValue = model->HSM2_coisub; - return(OK); - case HSM2_MOD_COIIGS: - value->iValue = model->HSM2_coiigs; - return(OK); - case HSM2_MOD_COGIDL: - value->iValue = model->HSM2_cogidl; - return(OK); - case HSM2_MOD_COOVLP: - value->iValue = model->HSM2_coovlp; - return(OK); - case HSM2_MOD_COFLICK: - value->iValue = model->HSM2_coflick; - return(OK); - case HSM2_MOD_COISTI: - value->iValue = model->HSM2_coisti; - return(OK); - case HSM2_MOD_CONQS: - value->iValue = model->HSM2_conqs; - return(OK); - case HSM2_MOD_CORBNET: - value->iValue = model->HSM2_corbnet; - return(OK); - case HSM2_MOD_COTHRML: - value->iValue = model->HSM2_cothrml; - return(OK); - case HSM2_MOD_COIGN: - value->iValue = model->HSM2_coign; - return(OK); - case HSM2_MOD_CODFM: - value->iValue = model->HSM2_codfm; - return(OK); - case HSM2_MOD_CORECIP: - value->iValue = model->HSM2_corecip; - return(OK); - case HSM2_MOD_COQY: - value->iValue = model->HSM2_coqy; - return(OK); - case HSM2_MOD_COQOVSM: - value->iValue = model->HSM2_coqovsm; - return(OK); - case HSM2_MOD_COERRREP: - value->iValue = model->HSM2_coerrrep; - return(OK); - case HSM2_MOD_CODEP: - value->iValue = model->HSM2_codep; - return(OK); - case HSM2_MOD_CODDLT: - value->iValue = model->HSM2_coddlt; - return(OK); - - case HSM2_MOD_VMAX: - value->rValue = model->HSM2_vmax; - return(OK); - case HSM2_MOD_BGTMP1: - value->rValue = model->HSM2_bgtmp1; - return(OK); - case HSM2_MOD_BGTMP2: - value->rValue = model->HSM2_bgtmp2; - return(OK); - case HSM2_MOD_EG0: - value->rValue = model->HSM2_eg0; - return(OK); - case HSM2_MOD_TOX: - value->rValue = model->HSM2_tox; - return(OK); - case HSM2_MOD_XLD: - value->rValue = model->HSM2_xld; - return(OK); - case HSM2_MOD_LOVER: - value->rValue = model->HSM2_lover; - return(OK); - case HSM2_MOD_DDLTMAX: /* Vdseff */ - value->rValue = model->HSM2_ddltmax; - return(OK); - case HSM2_MOD_DDLTSLP: /* Vdseff */ - value->rValue = model->HSM2_ddltslp; - return(OK); - case HSM2_MOD_DDLTICT: /* Vdseff */ - value->rValue = model->HSM2_ddltict; - return(OK); - case HSM2_MOD_VFBOVER: - value->rValue = model->HSM2_vfbover; - return(OK); - case HSM2_MOD_NOVER: - value->rValue = model->HSM2_nover; - return(OK); - case HSM2_MOD_XWD: - value->rValue = model->HSM2_xwd; - return(OK); - case HSM2_MOD_XL: - value->rValue = model->HSM2_xl; - return(OK); - case HSM2_MOD_XW: - value->rValue = model->HSM2_xw; - return(OK); - case HSM2_MOD_SAREF: - value->rValue = model->HSM2_saref; - return(OK); - case HSM2_MOD_SBREF: - value->rValue = model->HSM2_sbref; - return(OK); - case HSM2_MOD_LL: - value->rValue = model->HSM2_ll; - return(OK); - case HSM2_MOD_LLD: - value->rValue = model->HSM2_lld; - return(OK); - case HSM2_MOD_LLN: - value->rValue = model->HSM2_lln; - return(OK); - case HSM2_MOD_WL: - value->rValue = model->HSM2_wl; - return(OK); - case HSM2_MOD_WL1: - value->rValue = model->HSM2_wl1; - return(OK); - case HSM2_MOD_WL1P: - value->rValue = model->HSM2_wl1p; - return(OK); - case HSM2_MOD_WL2: - value->rValue = model->HSM2_wl2; - return(OK); - case HSM2_MOD_WL2P: - value->rValue = model->HSM2_wl2p; - return(OK); - case HSM2_MOD_WLD: - value->rValue = model->HSM2_wld; - return(OK); - case HSM2_MOD_WLN: - value->rValue = model->HSM2_wln; - return(OK); - case HSM2_MOD_XQY: - value->rValue = model->HSM2_xqy; - return(OK); - case HSM2_MOD_XQY1: - value->rValue = model->HSM2_xqy1; - return(OK); - case HSM2_MOD_XQY2: - value->rValue = model->HSM2_xqy2; - return(OK); - case HSM2_MOD_QYRAT: - value->rValue = model->HSM2_qyrat; - return(OK); - case HSM2_MOD_RS: - value->rValue = model->HSM2_rs; - return(OK); - case HSM2_MOD_RD: - value->rValue = model->HSM2_rd; - return(OK); - case HSM2_MOD_RSH: - value->rValue = model->HSM2_rsh; - return(OK); - case HSM2_MOD_RSHG: - value->rValue = model->HSM2_rshg; - return(OK); -/* case HSM2_MOD_NGCON: */ -/* value->rValue = model->HSM2_ngcon; */ -/* return(OK); */ -/* case HSM2_MOD_XGW: */ -/* value->rValue = model->HSM2_xgw; */ -/* return(OK); */ -/* case HSM2_MOD_XGL: */ -/* value->rValue = model->HSM2_xgl; */ -/* return(OK); */ -/* case HSM2_MOD_NF: */ -/* value->rValue = model->HSM2_nf; */ -/* return(OK); */ - case HSM2_MOD_VFBC: - value->rValue = model->HSM2_vfbc; - return(OK); - case HSM2_MOD_VBI: - value->rValue = model->HSM2_vbi; - return(OK); - case HSM2_MOD_NSUBC: - value->rValue = model->HSM2_nsubc; - return(OK); - case HSM2_MOD_VFBCL: - value->rValue = model->HSM2_vfbcl; - return(OK); - case HSM2_MOD_VFBCLP: - value->rValue = model->HSM2_vfbclp; - return(OK); - case HSM2_MOD_PARL2: - value->rValue = model->HSM2_parl2; - return(OK); - case HSM2_MOD_LP: - value->rValue = model->HSM2_lp; - return(OK); - case HSM2_MOD_NSUBP: - value->rValue = model->HSM2_nsubp; - return(OK); - case HSM2_MOD_NSUBPL: - value->rValue = model->HSM2_nsubpl; - return(OK); - case HSM2_MOD_NSUBPFAC: - value->rValue = model->HSM2_nsubpfac; - return(OK); - case HSM2_MOD_NSUBPDLT: - value->rValue = model->HSM2_nsubpdlt; - return(OK); - case HSM2_MOD_NSUBPW: - value->rValue = model->HSM2_nsubpw; - return(OK); - case HSM2_MOD_NSUBPWP: - value->rValue = model->HSM2_nsubpwp; - return(OK); - case HSM2_MOD_SCP1: - value->rValue = model->HSM2_scp1; - return(OK); - case HSM2_MOD_SCP2: - value->rValue = model->HSM2_scp2; - return(OK); - case HSM2_MOD_SCP3: - value->rValue = model->HSM2_scp3; - return(OK); - case HSM2_MOD_SC1: - value->rValue = model->HSM2_sc1; - return(OK); - case HSM2_MOD_SC2: - value->rValue = model->HSM2_sc2; - return(OK); - case HSM2_MOD_SC3: - value->rValue = model->HSM2_sc3; - return(OK); - case HSM2_MOD_SC4: - value->rValue = model->HSM2_sc4; - return(OK); - case HSM2_MOD_PGD1: - value->rValue = model->HSM2_pgd1; - return(OK); - case HSM2_MOD_PGD2: - value->rValue = model->HSM2_pgd2; - return(OK); - - case HSM2_MOD_PGD4: - value->rValue = model->HSM2_pgd4; - return(OK); - case HSM2_MOD_NDEP: - value->rValue = model->HSM2_ndep; - return(OK); - case HSM2_MOD_NDEPL: - value->rValue = model->HSM2_ndepl; - return(OK); - case HSM2_MOD_NDEPLP: - value->rValue = model->HSM2_ndeplp; - return(OK); - case HSM2_MOD_NDEPW: - value->rValue = model->HSM2_ndepw; - return(OK); - case HSM2_MOD_NDEPWP: - value->rValue = model->HSM2_ndepwp; - return(OK); - case HSM2_MOD_NINV: - value->rValue = model->HSM2_ninv; - return(OK); - case HSM2_MOD_NINVD: - value->rValue = model->HSM2_ninvd; - return(OK); - case HSM2_MOD_NINVDL: - value->rValue = model->HSM2_ninvdl; - return(OK); - case HSM2_MOD_NINVDLP: - value->rValue = model->HSM2_ninvdlp; - return(OK); - case HSM2_MOD_MUECB0: - value->rValue = model->HSM2_muecb0; - return(OK); - case HSM2_MOD_MUECB1: - value->rValue = model->HSM2_muecb1; - return(OK); - case HSM2_MOD_MUEPH1: - value->rValue = model->HSM2_mueph1; - return(OK); - case HSM2_MOD_MUEPH0: - value->rValue = model->HSM2_mueph0; - return(OK); - case HSM2_MOD_MUEPHW: - value->rValue = model->HSM2_muephw; - return(OK); - case HSM2_MOD_MUEPWP: - value->rValue = model->HSM2_muepwp; - return(OK); - case HSM2_MOD_MUEPWD: - value->rValue = model->HSM2_muepwd; - return(OK); - case HSM2_MOD_MUEPHL: - value->rValue = model->HSM2_muephl; - return(OK); - case HSM2_MOD_MUEPLP: - value->rValue = model->HSM2_mueplp; - return(OK); - case HSM2_MOD_MUEPLD: - value->rValue = model->HSM2_muepld; - return(OK); - case HSM2_MOD_MUEPHS: - value->rValue = model->HSM2_muephs; - return(OK); - case HSM2_MOD_MUEPSP: - value->rValue = model->HSM2_muepsp; - return(OK); - case HSM2_MOD_VTMP: - value->rValue = model->HSM2_vtmp; - return(OK); - case HSM2_MOD_WVTH0: - value->rValue = model->HSM2_wvth0; - return(OK); - case HSM2_MOD_MUESR1: - value->rValue = model->HSM2_muesr1; - return(OK); - case HSM2_MOD_MUESR0: - value->rValue = model->HSM2_muesr0; - return(OK); - case HSM2_MOD_MUESRL: - value->rValue = model->HSM2_muesrl; - return(OK); - case HSM2_MOD_MUESLP: - value->rValue = model->HSM2_mueslp; - return(OK); - case HSM2_MOD_MUESRW: - value->rValue = model->HSM2_muesrw; - return(OK); - case HSM2_MOD_MUESWP: - value->rValue = model->HSM2_mueswp; - return(OK); - case HSM2_MOD_BB: - value->rValue = model->HSM2_bb; - return(OK); - case HSM2_MOD_SUB1: - value->rValue = model->HSM2_sub1; - return(OK); - case HSM2_MOD_SUB2: - value->rValue = model->HSM2_sub2; - return(OK); - case HSM2_MOD_SVGS: - value->rValue = model->HSM2_svgs; - return(OK); - case HSM2_MOD_SVGSL: - value->rValue = model->HSM2_svgsl; - return(OK); - case HSM2_MOD_SVGSLP: - value->rValue = model->HSM2_svgslp; - return(OK); - case HSM2_MOD_SVGSW: - value->rValue = model->HSM2_svgsw; - return(OK); - case HSM2_MOD_SVGSWP: - value->rValue = model->HSM2_svgswp; - return(OK); - case HSM2_MOD_SVBS: - value->rValue = model->HSM2_svbs; - return(OK); - case HSM2_MOD_SVBSL: - value->rValue = model->HSM2_svbsl; - return(OK); - case HSM2_MOD_SVBSLP: - value->rValue = model->HSM2_svbslp; - return(OK); - case HSM2_MOD_SVDS: - value->rValue = model->HSM2_svds; - return(OK); - case HSM2_MOD_SLG: - value->rValue = model->HSM2_slg; - return(OK); - case HSM2_MOD_SLGL: - value->rValue = model->HSM2_slgl; - return(OK); - case HSM2_MOD_SLGLP: - value->rValue = model->HSM2_slglp; - return(OK); - case HSM2_MOD_SUB1L: - value->rValue = model->HSM2_sub1l; - return(OK); - case HSM2_MOD_SUB1LP: - value->rValue = model->HSM2_sub1lp; - return(OK); - case HSM2_MOD_SUB2L: - value->rValue = model->HSM2_sub2l; - return(OK); - case HSM2_MOD_NSTI: - value->rValue = model->HSM2_nsti; - return(OK); - case HSM2_MOD_WSTI: - value->rValue = model->HSM2_wsti; - return(OK); - case HSM2_MOD_WSTIL: - value->rValue = model->HSM2_wstil; - return(OK); - case HSM2_MOD_WSTILP: - value->rValue = model->HSM2_wstilp; - return(OK); - case HSM2_MOD_WSTIW: - value->rValue = model->HSM2_wstiw; - return(OK); - case HSM2_MOD_WSTIWP: - value->rValue = model->HSM2_wstiwp; - return(OK); - case HSM2_MOD_SCSTI1: - value->rValue = model->HSM2_scsti1; - return(OK); - case HSM2_MOD_SCSTI2: - value->rValue = model->HSM2_scsti2; - return(OK); - case HSM2_MOD_VTHSTI: - value->rValue = model->HSM2_vthsti; - return(OK); - case HSM2_MOD_VDSTI: - value->rValue = model->HSM2_vdsti; - return(OK); - case HSM2_MOD_MUESTI1: - value->rValue = model->HSM2_muesti1; - return(OK); - case HSM2_MOD_MUESTI2: - value->rValue = model->HSM2_muesti2; - return(OK); - case HSM2_MOD_MUESTI3: - value->rValue = model->HSM2_muesti3; - return(OK); - case HSM2_MOD_NSUBPSTI1: - value->rValue = model->HSM2_nsubpsti1; - return(OK); - case HSM2_MOD_NSUBPSTI2: - value->rValue = model->HSM2_nsubpsti2; - return(OK); - case HSM2_MOD_NSUBPSTI3: - value->rValue = model->HSM2_nsubpsti3; - return(OK); - case HSM2_MOD_NSUBCSTI1: - value->rValue = model->HSM2_nsubcsti1; - return(OK); - case HSM2_MOD_NSUBCSTI2: - value->rValue = model->HSM2_nsubcsti2; - return(OK); - case HSM2_MOD_NSUBCSTI3: - value->rValue = model->HSM2_nsubcsti3; - return(OK); - case HSM2_MOD_LPEXT: - value->rValue = model->HSM2_lpext; - return(OK); - case HSM2_MOD_NPEXT: - value->rValue = model->HSM2_npext; - return(OK); - case HSM2_MOD_NPEXTW: - value->rValue = model->HSM2_npextw; - return(OK); - case HSM2_MOD_NPEXTWP: - value->rValue = model->HSM2_npextwp; - return(OK); - case HSM2_MOD_SCP22: - value->rValue = model->HSM2_scp22; - return(OK); - case HSM2_MOD_SCP21: - value->rValue = model->HSM2_scp21; - return(OK); - case HSM2_MOD_BS1: - value->rValue = model->HSM2_bs1; - return(OK); - case HSM2_MOD_BS2: - value->rValue = model->HSM2_bs2; - return(OK); - case HSM2_MOD_CGSO: - value->rValue = model->HSM2_cgso; - return(OK); - case HSM2_MOD_CGDO: - value->rValue = model->HSM2_cgdo; - return(OK); - case HSM2_MOD_CGBO: - value->rValue = model->HSM2_cgbo; - return(OK); - case HSM2_MOD_TPOLY: - value->rValue = model->HSM2_tpoly; - return(OK); - case HSM2_MOD_JS0: - value->rValue = model->HSM2_js0; - return(OK); - case HSM2_MOD_JS0SW: - value->rValue = model->HSM2_js0sw; - return(OK); - case HSM2_MOD_NJ: - value->rValue = model->HSM2_nj; - return(OK); - case HSM2_MOD_NJSW: - value->rValue = model->HSM2_njsw; - return(OK); - case HSM2_MOD_XTI: - value->rValue = model->HSM2_xti; - return(OK); - case HSM2_MOD_CJ: - value->rValue = model->HSM2_cj; - return(OK); - case HSM2_MOD_CJSW: - value->rValue = model->HSM2_cjsw; - return(OK); - case HSM2_MOD_CJSWG: - value->rValue = model->HSM2_cjswg; - return(OK); - case HSM2_MOD_MJ: - value->rValue = model->HSM2_mj; - return(OK); - case HSM2_MOD_MJSW: - value->rValue = model->HSM2_mjsw; - return(OK); - case HSM2_MOD_MJSWG: - value->rValue = model->HSM2_mjswg; - return(OK); - case HSM2_MOD_PB: - value->rValue = model->HSM2_pb; - return(OK); - case HSM2_MOD_PBSW: - value->rValue = model->HSM2_pbsw; - return(OK); - case HSM2_MOD_PBSWG: - value->rValue = model->HSM2_pbswg; - return(OK); - - case HSM2_MOD_TCJBD: - value->rValue = model->HSM2_tcjbd; - return(OK); - case HSM2_MOD_TCJBS: - value->rValue = model->HSM2_tcjbs; - return(OK); - case HSM2_MOD_TCJBDSW: - value->rValue = model->HSM2_tcjbdsw; - return(OK); - case HSM2_MOD_TCJBSSW: - value->rValue = model->HSM2_tcjbssw; - return(OK); - case HSM2_MOD_TCJBDSWG: - value->rValue = model->HSM2_tcjbdswg; - return(OK); - case HSM2_MOD_TCJBSSWG: - value->rValue = model->HSM2_tcjbsswg; - return(OK); - case HSM2_MOD_XTI2: - value->rValue = model->HSM2_xti2; - return(OK); - case HSM2_MOD_CISB: - value->rValue = model->HSM2_cisb; - return(OK); - case HSM2_MOD_CVB: - value->rValue = model->HSM2_cvb; - return(OK); - case HSM2_MOD_CTEMP: - value->rValue = model->HSM2_ctemp; - return(OK); - case HSM2_MOD_CISBK: - value->rValue = model->HSM2_cisbk; - return(OK); - case HSM2_MOD_CVBK: - value->rValue = model->HSM2_cvbk; - return(OK); - case HSM2_MOD_DIVX: - value->rValue = model->HSM2_divx; - return(OK); - case HSM2_MOD_CLM1: - value->rValue = model->HSM2_clm1; - return(OK); - case HSM2_MOD_CLM2: - value->rValue = model->HSM2_clm2; - return(OK); - case HSM2_MOD_CLM3: - value->rValue = model->HSM2_clm3; - return(OK); - case HSM2_MOD_CLM5: - value->rValue = model->HSM2_clm5; - return(OK); - case HSM2_MOD_CLM6: - value->rValue = model->HSM2_clm6; - return(OK); - case HSM2_MOD_MUETMP: - value->rValue = model->HSM2_muetmp; - return(OK); - case HSM2_MOD_VOVER: - value->rValue = model->HSM2_vover; - return(OK); - case HSM2_MOD_VOVERP: - value->rValue = model->HSM2_voverp; - return(OK); - case HSM2_MOD_VOVERS: - value->rValue = model->HSM2_vovers; - return(OK); - case HSM2_MOD_VOVERSP: - value->rValue = model->HSM2_voversp; - return(OK); - case HSM2_MOD_WFC: - value->rValue = model->HSM2_wfc; - return(OK); - case HSM2_MOD_NSUBCW: - value->rValue = model->HSM2_nsubcw; - return(OK); - case HSM2_MOD_NSUBCWP: - value->rValue = model->HSM2_nsubcwp; - return(OK); - case HSM2_MOD_NSUBCMAX: - value->rValue = model->HSM2_nsubcmax; - return(OK); - case HSM2_MOD_QME1: - value->rValue = model->HSM2_qme1; - return(OK); - case HSM2_MOD_QME2: - value->rValue = model->HSM2_qme2; - return(OK); - case HSM2_MOD_QME3: - value->rValue = model->HSM2_qme3; - return(OK); - case HSM2_MOD_GIDL1: - value->rValue = model->HSM2_gidl1; - return(OK); - case HSM2_MOD_GIDL2: - value->rValue = model->HSM2_gidl2; - return(OK); - case HSM2_MOD_GIDL3: - value->rValue = model->HSM2_gidl3; - return(OK); - case HSM2_MOD_GIDL4: - value->rValue = model->HSM2_gidl4; - return(OK); - case HSM2_MOD_GIDL5: - value->rValue = model->HSM2_gidl5; - return(OK); - case HSM2_MOD_GIDL6: - value->rValue = model->HSM2_gidl6; - return(OK); - case HSM2_MOD_GIDL7: - value->rValue = model->HSM2_gidl7; - return(OK); - case HSM2_MOD_GLEAK1: - value->rValue = model->HSM2_gleak1; - return(OK); - case HSM2_MOD_GLEAK2: - value->rValue = model->HSM2_gleak2; - return(OK); - case HSM2_MOD_GLEAK3: - value->rValue = model->HSM2_gleak3; - return(OK); - case HSM2_MOD_GLEAK4: - value->rValue = model->HSM2_gleak4; - return(OK); - case HSM2_MOD_GLEAK5: - value->rValue = model->HSM2_gleak5; - return(OK); - case HSM2_MOD_GLEAK6: - value->rValue = model->HSM2_gleak6; - return(OK); - case HSM2_MOD_GLEAK7: - value->rValue = model->HSM2_gleak7; - return(OK); - case HSM2_MOD_GLKSD1: - value->rValue = model->HSM2_glksd1; - return(OK); - case HSM2_MOD_GLKSD2: - value->rValue = model->HSM2_glksd2; - return(OK); - case HSM2_MOD_GLKSD3: - value->rValue = model->HSM2_glksd3; - return(OK); - case HSM2_MOD_GLKB1: - value->rValue = model->HSM2_glkb1; - return(OK); - case HSM2_MOD_GLKB2: - value->rValue = model->HSM2_glkb2; - return(OK); - case HSM2_MOD_GLKB3: - value->rValue = model->HSM2_glkb3; - return(OK); - case HSM2_MOD_EGIG: - value->rValue = model->HSM2_egig; - return(OK); - case HSM2_MOD_IGTEMP2: - value->rValue = model->HSM2_igtemp2; - return(OK); - case HSM2_MOD_IGTEMP3: - value->rValue = model->HSM2_igtemp3; - return(OK); - case HSM2_MOD_VZADD0: - value->rValue = model->HSM2_vzadd0; - return(OK); - case HSM2_MOD_PZADD0: - value->rValue = model->HSM2_pzadd0; - return(OK); - case HSM2_MOD_NFTRP: - value->rValue = model->HSM2_nftrp; - return(OK); - case HSM2_MOD_NFALP: - value->rValue = model->HSM2_nfalp; - return(OK); - case HSM2_MOD_CIT: - value->rValue = model->HSM2_cit; - return(OK); - case HSM2_MOD_FALPH: - value->rValue = model->HSM2_falph; - return(OK); - case HSM2_MOD_KAPPA: - value->rValue = model->HSM2_kappa; - return(OK); - case HSM2_MOD_VDIFFJ: - value->rValue = model->HSM2_vdiffj; - return(OK); - case HSM2_MOD_DLY1: - value->rValue = model->HSM2_dly1; - return(OK); - case HSM2_MOD_DLY2: - value->rValue = model->HSM2_dly2; - return(OK); - case HSM2_MOD_DLY3: - value->rValue = model->HSM2_dly3; - return(OK); - case HSM2_MOD_TNOM: - value->rValue = model->HSM2_tnom; - return(OK); - case HSM2_MOD_OVSLP: - value->rValue = model->HSM2_ovslp; - return(OK); - case HSM2_MOD_OVMAG: - value->rValue = model->HSM2_ovmag; - return(OK); - case HSM2_MOD_GBMIN: - value->rValue = model->HSM2_gbmin; - return(OK); - case HSM2_MOD_RBPB: - value->rValue = model->HSM2_rbpb; - return(OK); - case HSM2_MOD_RBPD: - value->rValue = model->HSM2_rbpd; - return(OK); - case HSM2_MOD_RBPS: - value->rValue = model->HSM2_rbps; - return(OK); - case HSM2_MOD_RBDB: - value->rValue = model->HSM2_rbdb; - return(OK); - case HSM2_MOD_RBSB: - value->rValue = model->HSM2_rbsb; - return(OK); - case HSM2_MOD_IBPC1: - value->rValue = model->HSM2_ibpc1; - return(OK); - case HSM2_MOD_IBPC2: - value->rValue = model->HSM2_ibpc2; - return(OK); - case HSM2_MOD_MPHDFM: - value->rValue = model->HSM2_mphdfm; - return(OK); - - - case HSM2_MOD_PTL: - value->rValue = model->HSM2_ptl; - return(OK); - case HSM2_MOD_PTP: - value->rValue = model->HSM2_ptp; - return(OK); - case HSM2_MOD_PT2: - value->rValue = model->HSM2_pt2; - return(OK); - case HSM2_MOD_PTLP: - value->rValue = model->HSM2_ptlp; - return(OK); - case HSM2_MOD_GDL: - value->rValue = model->HSM2_gdl; - return(OK); - case HSM2_MOD_GDLP: - value->rValue = model->HSM2_gdlp; - return(OK); - - case HSM2_MOD_GDLD: - value->rValue = model->HSM2_gdld; - return(OK); - case HSM2_MOD_PT4: - value->rValue = model->HSM2_pt4; - return(OK); - case HSM2_MOD_PT4P: - value->rValue = model->HSM2_pt4p; - return(OK); - case HSM2_MOD_MUEPHL2: - value->rValue = model->HSM2_muephl2; - return(OK); - case HSM2_MOD_MUEPLP2: - value->rValue = model->HSM2_mueplp2; - return(OK); - case HSM2_MOD_NSUBCW2: - value->rValue = model->HSM2_nsubcw2; - return(OK); - case HSM2_MOD_NSUBCWP2: - value->rValue = model->HSM2_nsubcwp2; - return(OK); - case HSM2_MOD_MUEPHW2: - value->rValue = model->HSM2_muephw2; - return(OK); - case HSM2_MOD_MUEPWP2: - value->rValue = model->HSM2_muepwp2; - return(OK); -/* WPE */ - case HSM2_MOD_WEB: - value->rValue = model->HSM2_web; - return(OK); - case HSM2_MOD_WEC: - value->rValue = model->HSM2_wec; - return(OK); - case HSM2_MOD_NSUBCWPE: - value->rValue = model->HSM2_nsubcwpe; - return(OK); - case HSM2_MOD_NPEXTWPE: - value->rValue = model->HSM2_npextwpe; - return(OK); - case HSM2_MOD_NSUBPWPE: - value->rValue = model->HSM2_nsubpwpe; - return(OK); - case HSM2_MOD_VGSMIN: - value->rValue = model->HSM2_Vgsmin; - return(OK); - case HSM2_MOD_SC3VBS: - value->rValue = model->HSM2_sc3Vbs; - return(OK); - case HSM2_MOD_BYPTOL: - value->rValue = model->HSM2_byptol; - return(OK); - case HSM2_MOD_MUECB0LP: - value->rValue = model->HSM2_muecb0lp; - return(OK); - case HSM2_MOD_MUECB1LP: - value->rValue = model->HSM2_muecb1lp; - return(OK); - - /* Depletion Mode MOSFET */ - case HSM2_MOD_NDEPM: - value->rValue = model->HSM2_ndepm; - return(OK); - case HSM2_MOD_NDEPML: - value->rValue = model->HSM2_ndepml; - return(OK); - case HSM2_MOD_NDEPMLP: - value->rValue = model->HSM2_ndepmlp; - return(OK); - case HSM2_MOD_TNDEP: - value->rValue = model->HSM2_tndep; - return(OK); - case HSM2_MOD_DEPLEAK: - value->rValue = model->HSM2_depleak; - return(OK); - case HSM2_MOD_DEPLEAKL: - value->rValue = model->HSM2_depleakl; - return(OK); - case HSM2_MOD_DEPLEAKLP: - value->rValue = model->HSM2_depleaklp; - return(OK); - case HSM2_MOD_DEPETA: - value->rValue = model->HSM2_depeta; - return(OK); - case HSM2_MOD_DEPMUE0: - value->rValue = model->HSM2_depmue0; - return(OK); - case HSM2_MOD_DEPMUE0L: - value->rValue = model->HSM2_depmue0l; - return(OK); - case HSM2_MOD_DEPMUE0LP: - value->rValue = model->HSM2_depmue0lp; - return(OK); - case HSM2_MOD_DEPMUE1: - value->rValue = model->HSM2_depmue1; - return(OK); - case HSM2_MOD_DEPMUE1L: - value->rValue = model->HSM2_depmue1l; - return(OK); - case HSM2_MOD_DEPMUE1LP: - value->rValue = model->HSM2_depmue1lp; - return(OK); - case HSM2_MOD_DEPMUEBACK0: - value->rValue = model->HSM2_depmueback0; - return(OK); - case HSM2_MOD_DEPMUEBACK0L: - value->rValue = model->HSM2_depmueback0l; - return(OK); - case HSM2_MOD_DEPMUEBACK0LP: - value->rValue = model->HSM2_depmueback0lp; - return(OK); - case HSM2_MOD_DEPMUEBACK1: - value->rValue = model->HSM2_depmueback1; - return(OK); - case HSM2_MOD_DEPMUEBACK1L: - value->rValue = model->HSM2_depmueback1l; - return(OK); - case HSM2_MOD_DEPMUEBACK1LP: - value->rValue = model->HSM2_depmueback1lp; - return(OK); - case HSM2_MOD_DEPMUEPH0: - value->rValue = model->HSM2_depmueph0; - return(OK); - case HSM2_MOD_DEPMUEPH1: - value->rValue = model->HSM2_depmueph1; - return(OK); - case HSM2_MOD_DEPVMAX: - value->rValue = model->HSM2_depvmax; - return(OK); - case HSM2_MOD_DEPVMAXL: - value->rValue = model->HSM2_depvmaxl; - return(OK); - case HSM2_MOD_DEPVMAXLP: - value->rValue = model->HSM2_depvmaxlp; - return(OK); - case HSM2_MOD_DEPVDSEF1: - value->rValue = model->HSM2_depvdsef1; - return(OK); - case HSM2_MOD_DEPVDSEF1L: - value->rValue = model->HSM2_depvdsef1l; - return(OK); - case HSM2_MOD_DEPVDSEF1LP: - value->rValue = model->HSM2_depvdsef1lp; - return(OK); - case HSM2_MOD_DEPVDSEF2: - value->rValue = model->HSM2_depvdsef2; - return(OK); - case HSM2_MOD_DEPVDSEF2L: - value->rValue = model->HSM2_depvdsef2l; - return(OK); - case HSM2_MOD_DEPVDSEF2LP: - value->rValue = model->HSM2_depvdsef2lp; - return(OK); - case HSM2_MOD_DEPBB: - value->rValue = model->HSM2_depbb; - return(OK); - case HSM2_MOD_DEPMUETMP: - value->rValue = model->HSM2_depmuetmp; - return(OK); - - - /* binning parameters */ - case HSM2_MOD_LMIN: - value->rValue = model->HSM2_lmin; - return(OK); - case HSM2_MOD_LMAX: - value->rValue = model->HSM2_lmax; - return(OK); - case HSM2_MOD_WMIN: - value->rValue = model->HSM2_wmin; - return(OK); - case HSM2_MOD_WMAX: - value->rValue = model->HSM2_wmax; - return(OK); - case HSM2_MOD_LBINN: - value->rValue = model->HSM2_lbinn; - return(OK); - case HSM2_MOD_WBINN: - value->rValue = model->HSM2_wbinn; - return(OK); - - /* Length dependence */ - case HSM2_MOD_LVMAX: - value->rValue = model->HSM2_lvmax; - return(OK); - case HSM2_MOD_LBGTMP1: - value->rValue = model->HSM2_lbgtmp1; - return(OK); - case HSM2_MOD_LBGTMP2: - value->rValue = model->HSM2_lbgtmp2; - return(OK); - case HSM2_MOD_LEG0: - value->rValue = model->HSM2_leg0; - return(OK); - case HSM2_MOD_LLOVER: - value->rValue = model->HSM2_llover; - return(OK); - case HSM2_MOD_LVFBOVER: - value->rValue = model->HSM2_lvfbover; - return(OK); - case HSM2_MOD_LNOVER: - value->rValue = model->HSM2_lnover; - return(OK); - case HSM2_MOD_LWL2: - value->rValue = model->HSM2_lwl2; - return(OK); - case HSM2_MOD_LVFBC: - value->rValue = model->HSM2_lvfbc; - return(OK); - case HSM2_MOD_LNSUBC: - value->rValue = model->HSM2_lnsubc; - return(OK); - case HSM2_MOD_LNSUBP: - value->rValue = model->HSM2_lnsubp; - return(OK); - case HSM2_MOD_LSCP1: - value->rValue = model->HSM2_lscp1; - return(OK); - case HSM2_MOD_LSCP2: - value->rValue = model->HSM2_lscp2; - return(OK); - case HSM2_MOD_LSCP3: - value->rValue = model->HSM2_lscp3; - return(OK); - case HSM2_MOD_LSC1: - value->rValue = model->HSM2_lsc1; - return(OK); - case HSM2_MOD_LSC2: - value->rValue = model->HSM2_lsc2; - return(OK); - case HSM2_MOD_LSC3: - value->rValue = model->HSM2_lsc3; - return(OK); - case HSM2_MOD_LSC4: - value->rValue = model->HSM2_lsc4; - return(OK); - case HSM2_MOD_LPGD1: - value->rValue = model->HSM2_lpgd1; - return(OK); -//case HSM2_MOD_LPGD3: -// value->rValue = model->HSM2_lpgd3; -// return(OK); - case HSM2_MOD_LNDEP: - value->rValue = model->HSM2_lndep; - return(OK); - case HSM2_MOD_LNINV: - value->rValue = model->HSM2_lninv; - return(OK); - case HSM2_MOD_LMUECB0: - value->rValue = model->HSM2_lmuecb0; - return(OK); - case HSM2_MOD_LMUECB1: - value->rValue = model->HSM2_lmuecb1; - return(OK); - case HSM2_MOD_LMUEPH1: - value->rValue = model->HSM2_lmueph1; - return(OK); - case HSM2_MOD_LVTMP: - value->rValue = model->HSM2_lvtmp; - return(OK); - case HSM2_MOD_LWVTH0: - value->rValue = model->HSM2_lwvth0; - return(OK); - case HSM2_MOD_LMUESR1: - value->rValue = model->HSM2_lmuesr1; - return(OK); - case HSM2_MOD_LMUETMP: - value->rValue = model->HSM2_lmuetmp; - return(OK); - case HSM2_MOD_LSUB1: - value->rValue = model->HSM2_lsub1; - return(OK); - case HSM2_MOD_LSUB2: - value->rValue = model->HSM2_lsub2; - return(OK); - case HSM2_MOD_LSVDS: - value->rValue = model->HSM2_lsvds; - return(OK); - case HSM2_MOD_LSVBS: - value->rValue = model->HSM2_lsvbs; - return(OK); - case HSM2_MOD_LSVGS: - value->rValue = model->HSM2_lsvgs; - return(OK); - case HSM2_MOD_LNSTI: - value->rValue = model->HSM2_lnsti; - return(OK); - case HSM2_MOD_LWSTI: - value->rValue = model->HSM2_lwsti; - return(OK); - case HSM2_MOD_LSCSTI1: - value->rValue = model->HSM2_lscsti1; - return(OK); - case HSM2_MOD_LSCSTI2: - value->rValue = model->HSM2_lscsti2; - return(OK); - case HSM2_MOD_LVTHSTI: - value->rValue = model->HSM2_lvthsti; - return(OK); - case HSM2_MOD_LMUESTI1: - value->rValue = model->HSM2_lmuesti1; - return(OK); - case HSM2_MOD_LMUESTI2: - value->rValue = model->HSM2_lmuesti2; - return(OK); - case HSM2_MOD_LMUESTI3: - value->rValue = model->HSM2_lmuesti3; - return(OK); - case HSM2_MOD_LNSUBPSTI1: - value->rValue = model->HSM2_lnsubpsti1; - return(OK); - case HSM2_MOD_LNSUBPSTI2: - value->rValue = model->HSM2_lnsubpsti2; - return(OK); - case HSM2_MOD_LNSUBPSTI3: - value->rValue = model->HSM2_lnsubpsti3; - return(OK); - case HSM2_MOD_LNSUBCSTI1: - value->rValue = model->HSM2_lnsubcsti1; - return(OK); - case HSM2_MOD_LNSUBCSTI2: - value->rValue = model->HSM2_lnsubcsti2; - return(OK); - case HSM2_MOD_LNSUBCSTI3: - value->rValue = model->HSM2_lnsubcsti3; - return(OK); - case HSM2_MOD_LCGSO: - value->rValue = model->HSM2_lcgso; - return(OK); - case HSM2_MOD_LCGDO: - value->rValue = model->HSM2_lcgdo; - return(OK); - case HSM2_MOD_LJS0: - value->rValue = model->HSM2_ljs0; - return(OK); - case HSM2_MOD_LJS0SW: - value->rValue = model->HSM2_ljs0sw; - return(OK); - case HSM2_MOD_LNJ: - value->rValue = model->HSM2_lnj; - return(OK); - case HSM2_MOD_LCISBK: - value->rValue = model->HSM2_lcisbk; - return(OK); - case HSM2_MOD_LCLM1: - value->rValue = model->HSM2_lclm1; - return(OK); - case HSM2_MOD_LCLM2: - value->rValue = model->HSM2_lclm2; - return(OK); - case HSM2_MOD_LCLM3: - value->rValue = model->HSM2_lclm3; - return(OK); - case HSM2_MOD_LWFC: - value->rValue = model->HSM2_lwfc; - return(OK); - case HSM2_MOD_LGIDL1: - value->rValue = model->HSM2_lgidl1; - return(OK); - case HSM2_MOD_LGIDL2: - value->rValue = model->HSM2_lgidl2; - return(OK); - case HSM2_MOD_LGLEAK1: - value->rValue = model->HSM2_lgleak1; - return(OK); - case HSM2_MOD_LGLEAK2: - value->rValue = model->HSM2_lgleak2; - return(OK); - case HSM2_MOD_LGLEAK3: - value->rValue = model->HSM2_lgleak3; - return(OK); - case HSM2_MOD_LGLEAK6: - value->rValue = model->HSM2_lgleak6; - return(OK); - case HSM2_MOD_LGLKSD1: - value->rValue = model->HSM2_lglksd1; - return(OK); - case HSM2_MOD_LGLKSD2: - value->rValue = model->HSM2_lglksd2; - return(OK); - case HSM2_MOD_LGLKB1: - value->rValue = model->HSM2_lglkb1; - return(OK); - case HSM2_MOD_LGLKB2: - value->rValue = model->HSM2_lglkb2; - return(OK); - case HSM2_MOD_LNFTRP: - value->rValue = model->HSM2_lnftrp; - return(OK); - case HSM2_MOD_LNFALP: - value->rValue = model->HSM2_lnfalp; - return(OK); - case HSM2_MOD_LVDIFFJ: - value->rValue = model->HSM2_lvdiffj; - return(OK); - case HSM2_MOD_LIBPC1: - value->rValue = model->HSM2_libpc1; - return(OK); - case HSM2_MOD_LIBPC2: - value->rValue = model->HSM2_libpc2; - return(OK); - - /* Width dependence */ - case HSM2_MOD_WVMAX: - value->rValue = model->HSM2_wvmax; - return(OK); - case HSM2_MOD_WBGTMP1: - value->rValue = model->HSM2_wbgtmp1; - return(OK); - case HSM2_MOD_WBGTMP2: - value->rValue = model->HSM2_wbgtmp2; - return(OK); - case HSM2_MOD_WEG0: - value->rValue = model->HSM2_weg0; - return(OK); - case HSM2_MOD_WLOVER: - value->rValue = model->HSM2_wlover; - return(OK); - case HSM2_MOD_WVFBOVER: - value->rValue = model->HSM2_wvfbover; - return(OK); - case HSM2_MOD_WNOVER: - value->rValue = model->HSM2_wnover; - return(OK); - case HSM2_MOD_WWL2: - value->rValue = model->HSM2_wwl2; - return(OK); - case HSM2_MOD_WVFBC: - value->rValue = model->HSM2_wvfbc; - return(OK); - case HSM2_MOD_WNSUBC: - value->rValue = model->HSM2_wnsubc; - return(OK); - case HSM2_MOD_WNSUBP: - value->rValue = model->HSM2_wnsubp; - return(OK); - case HSM2_MOD_WSCP1: - value->rValue = model->HSM2_wscp1; - return(OK); - case HSM2_MOD_WSCP2: - value->rValue = model->HSM2_wscp2; - return(OK); - case HSM2_MOD_WSCP3: - value->rValue = model->HSM2_wscp3; - return(OK); - case HSM2_MOD_WSC1: - value->rValue = model->HSM2_wsc1; - return(OK); - case HSM2_MOD_WSC2: - value->rValue = model->HSM2_wsc2; - return(OK); - case HSM2_MOD_WSC3: - value->rValue = model->HSM2_wsc3; - return(OK); - case HSM2_MOD_WSC4: - value->rValue = model->HSM2_wsc4; - return(OK); - case HSM2_MOD_WPGD1: - value->rValue = model->HSM2_wpgd1; - return(OK); -//case HSM2_MOD_WPGD3: -// value->rValue = model->HSM2_wpgd3; -// return(OK); - case HSM2_MOD_WNDEP: - value->rValue = model->HSM2_wndep; - return(OK); - case HSM2_MOD_WNINV: - value->rValue = model->HSM2_wninv; - return(OK); - case HSM2_MOD_WMUECB0: - value->rValue = model->HSM2_wmuecb0; - return(OK); - case HSM2_MOD_WMUECB1: - value->rValue = model->HSM2_wmuecb1; - return(OK); - case HSM2_MOD_WMUEPH1: - value->rValue = model->HSM2_wmueph1; - return(OK); - case HSM2_MOD_WVTMP: - value->rValue = model->HSM2_wvtmp; - return(OK); - case HSM2_MOD_WWVTH0: - value->rValue = model->HSM2_wwvth0; - return(OK); - case HSM2_MOD_WMUESR1: - value->rValue = model->HSM2_wmuesr1; - return(OK); - case HSM2_MOD_WMUETMP: - value->rValue = model->HSM2_wmuetmp; - return(OK); - case HSM2_MOD_WSUB1: - value->rValue = model->HSM2_wsub1; - return(OK); - case HSM2_MOD_WSUB2: - value->rValue = model->HSM2_wsub2; - return(OK); - case HSM2_MOD_WSVDS: - value->rValue = model->HSM2_wsvds; - return(OK); - case HSM2_MOD_WSVBS: - value->rValue = model->HSM2_wsvbs; - return(OK); - case HSM2_MOD_WSVGS: - value->rValue = model->HSM2_wsvgs; - return(OK); - case HSM2_MOD_WNSTI: - value->rValue = model->HSM2_wnsti; - return(OK); - case HSM2_MOD_WWSTI: - value->rValue = model->HSM2_wwsti; - return(OK); - case HSM2_MOD_WSCSTI1: - value->rValue = model->HSM2_wscsti1; - return(OK); - case HSM2_MOD_WSCSTI2: - value->rValue = model->HSM2_wscsti2; - return(OK); - case HSM2_MOD_WVTHSTI: - value->rValue = model->HSM2_wvthsti; - return(OK); - case HSM2_MOD_WMUESTI1: - value->rValue = model->HSM2_wmuesti1; - return(OK); - case HSM2_MOD_WMUESTI2: - value->rValue = model->HSM2_wmuesti2; - return(OK); - case HSM2_MOD_WMUESTI3: - value->rValue = model->HSM2_wmuesti3; - return(OK); - case HSM2_MOD_WNSUBPSTI1: - value->rValue = model->HSM2_wnsubpsti1; - return(OK); - case HSM2_MOD_WNSUBPSTI2: - value->rValue = model->HSM2_wnsubpsti2; - return(OK); - case HSM2_MOD_WNSUBPSTI3: - value->rValue = model->HSM2_wnsubpsti3; - return(OK); - case HSM2_MOD_WNSUBCSTI1: - value->rValue = model->HSM2_wnsubcsti1; - return(OK); - case HSM2_MOD_WNSUBCSTI2: - value->rValue = model->HSM2_wnsubcsti2; - return(OK); - case HSM2_MOD_WNSUBCSTI3: - value->rValue = model->HSM2_wnsubcsti3; - return(OK); - case HSM2_MOD_WCGSO: - value->rValue = model->HSM2_wcgso; - return(OK); - case HSM2_MOD_WCGDO: - value->rValue = model->HSM2_wcgdo; - return(OK); - case HSM2_MOD_WJS0: - value->rValue = model->HSM2_wjs0; - return(OK); - case HSM2_MOD_WJS0SW: - value->rValue = model->HSM2_wjs0sw; - return(OK); - case HSM2_MOD_WNJ: - value->rValue = model->HSM2_wnj; - return(OK); - case HSM2_MOD_WCISBK: - value->rValue = model->HSM2_wcisbk; - return(OK); - case HSM2_MOD_WCLM1: - value->rValue = model->HSM2_wclm1; - return(OK); - case HSM2_MOD_WCLM2: - value->rValue = model->HSM2_wclm2; - return(OK); - case HSM2_MOD_WCLM3: - value->rValue = model->HSM2_wclm3; - return(OK); - case HSM2_MOD_WWFC: - value->rValue = model->HSM2_wwfc; - return(OK); - case HSM2_MOD_WGIDL1: - value->rValue = model->HSM2_wgidl1; - return(OK); - case HSM2_MOD_WGIDL2: - value->rValue = model->HSM2_wgidl2; - return(OK); - case HSM2_MOD_WGLEAK1: - value->rValue = model->HSM2_wgleak1; - return(OK); - case HSM2_MOD_WGLEAK2: - value->rValue = model->HSM2_wgleak2; - return(OK); - case HSM2_MOD_WGLEAK3: - value->rValue = model->HSM2_wgleak3; - return(OK); - case HSM2_MOD_WGLEAK6: - value->rValue = model->HSM2_wgleak6; - return(OK); - case HSM2_MOD_WGLKSD1: - value->rValue = model->HSM2_wglksd1; - return(OK); - case HSM2_MOD_WGLKSD2: - value->rValue = model->HSM2_wglksd2; - return(OK); - case HSM2_MOD_WGLKB1: - value->rValue = model->HSM2_wglkb1; - return(OK); - case HSM2_MOD_WGLKB2: - value->rValue = model->HSM2_wglkb2; - return(OK); - case HSM2_MOD_WNFTRP: - value->rValue = model->HSM2_wnftrp; - return(OK); - case HSM2_MOD_WNFALP: - value->rValue = model->HSM2_wnfalp; - return(OK); - case HSM2_MOD_WVDIFFJ: - value->rValue = model->HSM2_wvdiffj; - return(OK); - case HSM2_MOD_WIBPC1: - value->rValue = model->HSM2_wibpc1; - return(OK); - case HSM2_MOD_WIBPC2: - value->rValue = model->HSM2_wibpc2; - return(OK); - - /* Cross-term dependence */ - case HSM2_MOD_PVMAX: - value->rValue = model->HSM2_pvmax; - return(OK); - case HSM2_MOD_PBGTMP1: - value->rValue = model->HSM2_pbgtmp1; - return(OK); - case HSM2_MOD_PBGTMP2: - value->rValue = model->HSM2_pbgtmp2; - return(OK); - case HSM2_MOD_PEG0: - value->rValue = model->HSM2_peg0; - return(OK); - case HSM2_MOD_PLOVER: - value->rValue = model->HSM2_plover; - return(OK); - case HSM2_MOD_PVFBOVER: - value->rValue = model->HSM2_pvfbover; - return(OK); - case HSM2_MOD_PNOVER: - value->rValue = model->HSM2_pnover; - return(OK); - case HSM2_MOD_PWL2: - value->rValue = model->HSM2_pwl2; - return(OK); - case HSM2_MOD_PVFBC: - value->rValue = model->HSM2_pvfbc; - return(OK); - case HSM2_MOD_PNSUBC: - value->rValue = model->HSM2_pnsubc; - return(OK); - case HSM2_MOD_PNSUBP: - value->rValue = model->HSM2_pnsubp; - return(OK); - case HSM2_MOD_PSCP1: - value->rValue = model->HSM2_pscp1; - return(OK); - case HSM2_MOD_PSCP2: - value->rValue = model->HSM2_pscp2; - return(OK); - case HSM2_MOD_PSCP3: - value->rValue = model->HSM2_pscp3; - return(OK); - case HSM2_MOD_PSC1: - value->rValue = model->HSM2_psc1; - return(OK); - case HSM2_MOD_PSC2: - value->rValue = model->HSM2_psc2; - return(OK); - case HSM2_MOD_PSC3: - value->rValue = model->HSM2_psc3; - return(OK); - case HSM2_MOD_PSC4: - value->rValue = model->HSM2_psc4; - return(OK); - case HSM2_MOD_PPGD1: - value->rValue = model->HSM2_ppgd1; - return(OK); -//case HSM2_MOD_PPGD3: -// value->rValue = model->HSM2_ppgd3; -// return(OK); - case HSM2_MOD_PNDEP: - value->rValue = model->HSM2_pndep; - return(OK); - case HSM2_MOD_PNINV: - value->rValue = model->HSM2_pninv; - return(OK); - case HSM2_MOD_PMUECB0: - value->rValue = model->HSM2_pmuecb0; - return(OK); - case HSM2_MOD_PMUECB1: - value->rValue = model->HSM2_pmuecb1; - return(OK); - case HSM2_MOD_PMUEPH1: - value->rValue = model->HSM2_pmueph1; - return(OK); - case HSM2_MOD_PVTMP: - value->rValue = model->HSM2_pvtmp; - return(OK); - case HSM2_MOD_PWVTH0: - value->rValue = model->HSM2_pwvth0; - return(OK); - case HSM2_MOD_PMUESR1: - value->rValue = model->HSM2_pmuesr1; - return(OK); - case HSM2_MOD_PMUETMP: - value->rValue = model->HSM2_pmuetmp; - return(OK); - case HSM2_MOD_PSUB1: - value->rValue = model->HSM2_psub1; - return(OK); - case HSM2_MOD_PSUB2: - value->rValue = model->HSM2_psub2; - return(OK); - case HSM2_MOD_PSVDS: - value->rValue = model->HSM2_psvds; - return(OK); - case HSM2_MOD_PSVBS: - value->rValue = model->HSM2_psvbs; - return(OK); - case HSM2_MOD_PSVGS: - value->rValue = model->HSM2_psvgs; - return(OK); - case HSM2_MOD_PNSTI: - value->rValue = model->HSM2_pnsti; - return(OK); - case HSM2_MOD_PWSTI: - value->rValue = model->HSM2_pwsti; - return(OK); - case HSM2_MOD_PSCSTI1: - value->rValue = model->HSM2_pscsti1; - return(OK); - case HSM2_MOD_PSCSTI2: - value->rValue = model->HSM2_pscsti2; - return(OK); - case HSM2_MOD_PVTHSTI: - value->rValue = model->HSM2_pvthsti; - return(OK); - case HSM2_MOD_PMUESTI1: - value->rValue = model->HSM2_pmuesti1; - return(OK); - case HSM2_MOD_PMUESTI2: - value->rValue = model->HSM2_pmuesti2; - return(OK); - case HSM2_MOD_PMUESTI3: - value->rValue = model->HSM2_pmuesti3; - return(OK); - case HSM2_MOD_PNSUBPSTI1: - value->rValue = model->HSM2_pnsubpsti1; - return(OK); - case HSM2_MOD_PNSUBPSTI2: - value->rValue = model->HSM2_pnsubpsti2; - return(OK); - case HSM2_MOD_PNSUBPSTI3: - value->rValue = model->HSM2_pnsubpsti3; - return(OK); - case HSM2_MOD_PNSUBCSTI1: - value->rValue = model->HSM2_pnsubcsti1; - return(OK); - case HSM2_MOD_PNSUBCSTI2: - value->rValue = model->HSM2_pnsubcsti2; - return(OK); - case HSM2_MOD_PNSUBCSTI3: - value->rValue = model->HSM2_pnsubcsti3; - return(OK); - case HSM2_MOD_PCGSO: - value->rValue = model->HSM2_pcgso; - return(OK); - case HSM2_MOD_PCGDO: - value->rValue = model->HSM2_pcgdo; - return(OK); - case HSM2_MOD_PJS0: - value->rValue = model->HSM2_pjs0; - return(OK); - case HSM2_MOD_PJS0SW: - value->rValue = model->HSM2_pjs0sw; - return(OK); - case HSM2_MOD_PNJ: - value->rValue = model->HSM2_pnj; - return(OK); - case HSM2_MOD_PCISBK: - value->rValue = model->HSM2_pcisbk; - return(OK); - case HSM2_MOD_PCLM1: - value->rValue = model->HSM2_pclm1; - return(OK); - case HSM2_MOD_PCLM2: - value->rValue = model->HSM2_pclm2; - return(OK); - case HSM2_MOD_PCLM3: - value->rValue = model->HSM2_pclm3; - return(OK); - case HSM2_MOD_PWFC: - value->rValue = model->HSM2_pwfc; - return(OK); - case HSM2_MOD_PGIDL1: - value->rValue = model->HSM2_pgidl1; - return(OK); - case HSM2_MOD_PGIDL2: - value->rValue = model->HSM2_pgidl2; - return(OK); - case HSM2_MOD_PGLEAK1: - value->rValue = model->HSM2_pgleak1; - return(OK); - case HSM2_MOD_PGLEAK2: - value->rValue = model->HSM2_pgleak2; - return(OK); - case HSM2_MOD_PGLEAK3: - value->rValue = model->HSM2_pgleak3; - return(OK); - case HSM2_MOD_PGLEAK6: - value->rValue = model->HSM2_pgleak6; - return(OK); - case HSM2_MOD_PGLKSD1: - value->rValue = model->HSM2_pglksd1; - return(OK); - case HSM2_MOD_PGLKSD2: - value->rValue = model->HSM2_pglksd2; - return(OK); - case HSM2_MOD_PGLKB1: - value->rValue = model->HSM2_pglkb1; - return(OK); - case HSM2_MOD_PGLKB2: - value->rValue = model->HSM2_pglkb2; - return(OK); - case HSM2_MOD_PNFTRP: - value->rValue = model->HSM2_pnftrp; - return(OK); - case HSM2_MOD_PNFALP: - value->rValue = model->HSM2_pnfalp; - return(OK); - case HSM2_MOD_PVDIFFJ: - value->rValue = model->HSM2_pvdiffj; - return(OK); - case HSM2_MOD_PIBPC1: - value->rValue = model->HSM2_pibpc1; - return(OK); - case HSM2_MOD_PIBPC2: - value->rValue = model->HSM2_pibpc2; - return(OK); - - case HSM2_MOD_VGS_MAX: - value->rValue = model->HSM2vgsMax; - return(OK); - case HSM2_MOD_VGD_MAX: - value->rValue = model->HSM2vgdMax; - return(OK); - case HSM2_MOD_VGB_MAX: - value->rValue = model->HSM2vgbMax; - return(OK); - case HSM2_MOD_VDS_MAX: - value->rValue = model->HSM2vdsMax; - return(OK); - case HSM2_MOD_VBS_MAX: - value->rValue = model->HSM2vbsMax; - return(OK); - case HSM2_MOD_VBD_MAX: - value->rValue = model->HSM2vbdMax; - return(OK); - case HSM2_MOD_VGSR_MAX: - value->rValue = model->HSM2vgsrMax; - return(OK); - case HSM2_MOD_VGDR_MAX: - value->rValue = model->HSM2vgdrMax; - return(OK); - case HSM2_MOD_VGBR_MAX: - value->rValue = model->HSM2vgbrMax; - return(OK); - case HSM2_MOD_VBSR_MAX: - value->rValue = model->HSM2vbsrMax; - return(OK); - case HSM2_MOD_VBDR_MAX: - value->rValue = model->HSM2vbdrMax; - return(OK); - - default: - return(E_BADPARM); - } - /* NOTREACHED */ -} - - diff --git a/src/spicelib/devices/hisim2/hsm2mdel.c b/src/spicelib/devices/hisim2/hsm2mdel.c deleted file mode 100644 index bd9331fb6..000000000 --- a/src/spicelib/devices/hisim2/hsm2mdel.c +++ /dev/null @@ -1,74 +0,0 @@ -/*********************************************************************** - - HiSIM (Hiroshima University STARC IGFET Model) - Copyright (C) 2014 Hiroshima University & STARC - - MODEL NAME : HiSIM - ( VERSION : 2 SUBVERSION : 8 REVISION : 0 ) - - FILE : hsm2mdel.c - - Date : 2014.6.5 - - released by - Hiroshima University & - Semiconductor Technology Academic Research Center (STARC) -***********************************************************************/ - -/********************************************************************** - -The following source code, and all copyrights, trade secrets or other -intellectual property rights in and to the source code in its entirety, -is owned by the Hiroshima University and the STARC organization. - -All users need to follow the "HiSIM2 Distribution Statement and -Copyright Notice" attached to HiSIM2 model. - ------HiSIM2 Distribution Statement and Copyright Notice-------------- - -Software is distributed as is, completely without warranty or service -support. Hiroshima University or STARC and its employees are not liable -for the condition or performance of the software. - -Hiroshima University and STARC own the copyright and grant users a perpetual, -irrevocable, worldwide, non-exclusive, royalty-free license with respect -to the software as set forth below. - -Hiroshima University and STARC hereby disclaim all implied warranties. - -Hiroshima University and STARC grant the users the right to modify, copy, -and redistribute the software and documentation, both within the user's -organization and externally, subject to the following restrictions - -1. The users agree not to charge for Hiroshima University and STARC code -itself but may charge for additions, extensions, or support. - -2. In any product based on the software, the users agree to acknowledge -Hiroshima University and STARC that developed the software. This -acknowledgment shall appear in the product documentation. - -3. The users agree to reproduce any copyright notice which appears on -the software on any copy or modification of such made available -to others." - - -*************************************************************************/ - -#include "ngspice/ngspice.h" -#include "hsm2def.h" -#include "ngspice/sperror.h" -#include "ngspice/suffix.h" - - -int -HSM2mDelete(GENmodel *gen_model) -{ - NG_IGNORE(gen_model); - -#ifdef USE_OMP - HSM2model *model = (HSM2model *) gen_model; - FREE(model->HSM2InstanceArray); -#endif - - return OK; -} diff --git a/src/spicelib/devices/hisim2/hsm2mpar.c b/src/spicelib/devices/hisim2/hsm2mpar.c deleted file mode 100644 index 699ceb13e..000000000 --- a/src/spicelib/devices/hisim2/hsm2mpar.c +++ /dev/null @@ -1,2313 +0,0 @@ -/*********************************************************************** - - HiSIM (Hiroshima University STARC IGFET Model) - Copyright (C) 2014 Hiroshima University & STARC - - MODEL NAME : HiSIM - ( VERSION : 2 SUBVERSION : 8 REVISION : 0 ) - - FILE : hsm2mpar.c - - Date : 2014.6.5 - - released by - Hiroshima University & - Semiconductor Technology Academic Research Center (STARC) -***********************************************************************/ - -/********************************************************************** - -The following source code, and all copyrights, trade secrets or other -intellectual property rights in and to the source code in its entirety, -is owned by the Hiroshima University and the STARC organization. - -All users need to follow the "HiSIM2 Distribution Statement and -Copyright Notice" attached to HiSIM2 model. - ------HiSIM2 Distribution Statement and Copyright Notice-------------- - -Software is distributed as is, completely without warranty or service -support. Hiroshima University or STARC and its employees are not liable -for the condition or performance of the software. - -Hiroshima University and STARC own the copyright and grant users a perpetual, -irrevocable, worldwide, non-exclusive, royalty-free license with respect -to the software as set forth below. - -Hiroshima University and STARC hereby disclaim all implied warranties. - -Hiroshima University and STARC grant the users the right to modify, copy, -and redistribute the software and documentation, both within the user's -organization and externally, subject to the following restrictions - -1. The users agree not to charge for Hiroshima University and STARC code -itself but may charge for additions, extensions, or support. - -2. In any product based on the software, the users agree to acknowledge -Hiroshima University and STARC that developed the software. This -acknowledgment shall appear in the product documentation. - -3. The users agree to reproduce any copyright notice which appears on -the software on any copy or modification of such made available -to others." - - -*************************************************************************/ - -#include "ngspice/ngspice.h" -#include "hsm2def.h" -#include "ngspice/ifsim.h" -#include "ngspice/sperror.h" -#include "ngspice/suffix.h" - -int HSM2mParam( - int param, - IFvalue *value, - GENmodel *inMod) -{ - HSM2model *mod = (HSM2model*)inMod; - switch (param) { - case HSM2_MOD_NMOS : - if (value->iValue) { - mod->HSM2_type = 1; - mod->HSM2_type_Given = TRUE; - } - break; - case HSM2_MOD_PMOS : - if (value->iValue) { - mod->HSM2_type = - 1; - mod->HSM2_type_Given = TRUE; - } - break; - case HSM2_MOD_LEVEL: - mod->HSM2_level = value->iValue; - mod->HSM2_level_Given = TRUE; - break; - case HSM2_MOD_INFO: - mod->HSM2_info = value->iValue; - mod->HSM2_info_Given = TRUE; - break; - case HSM2_MOD_NOISE: - mod->HSM2_noise = value->iValue; - mod->HSM2_noise_Given = TRUE; - break; - case HSM2_MOD_VERSION: - mod->HSM2_version = value->iValue; - mod->HSM2_version_Given = TRUE; - break; - case HSM2_MOD_SHOW: - mod->HSM2_show = value->iValue; - mod->HSM2_show_Given = TRUE; - break; - case HSM2_MOD_CORSRD: - mod->HSM2_corsrd = value->iValue; - mod->HSM2_corsrd_Given = TRUE; - break; - case HSM2_MOD_CORG: - mod->HSM2_corg = value->iValue; - mod->HSM2_corg_Given = TRUE; - break; - case HSM2_MOD_COIPRV: - mod->HSM2_coiprv = value->iValue; - mod->HSM2_coiprv_Given = TRUE; - break; - case HSM2_MOD_COPPRV: - mod->HSM2_copprv = value->iValue; - mod->HSM2_copprv_Given = TRUE; - break; - case HSM2_MOD_COADOV: - mod->HSM2_coadov = value->iValue; - mod->HSM2_coadov_Given = TRUE; - break; - case HSM2_MOD_COISUB: - mod->HSM2_coisub = value->iValue; - mod->HSM2_coisub_Given = TRUE; - break; - case HSM2_MOD_COIIGS: - mod->HSM2_coiigs = value->iValue; - mod->HSM2_coiigs_Given = TRUE; - break; - case HSM2_MOD_COGIDL: - mod->HSM2_cogidl = value->iValue; - mod->HSM2_cogidl_Given = TRUE; - break; - case HSM2_MOD_COOVLP: - mod->HSM2_coovlp = value->iValue; - mod->HSM2_coovlp_Given = TRUE; - break; - case HSM2_MOD_COFLICK: - mod->HSM2_coflick = value->iValue; - mod->HSM2_coflick_Given = TRUE; - break; - case HSM2_MOD_COISTI: - mod->HSM2_coisti = value->iValue; - mod->HSM2_coisti_Given = TRUE; - break; - case HSM2_MOD_CONQS: /* HiSIM2 */ - mod->HSM2_conqs = value->iValue; - mod->HSM2_conqs_Given = TRUE; - break; - case HSM2_MOD_CORBNET: - mod->HSM2_corbnet = value->iValue; - mod->HSM2_corbnet_Given = TRUE; - break; - case HSM2_MOD_COTHRML: - mod->HSM2_cothrml = value->iValue; - mod->HSM2_cothrml_Given = TRUE; - break; - case HSM2_MOD_COIGN: - mod->HSM2_coign = value->iValue; - mod->HSM2_coign_Given = TRUE; - break; - case HSM2_MOD_CODFM: - mod->HSM2_codfm = value->iValue; - mod->HSM2_codfm_Given = TRUE; - break; - case HSM2_MOD_CORECIP: - mod->HSM2_corecip = value->iValue; - mod->HSM2_corecip_Given = TRUE; - break; - case HSM2_MOD_COQY: - mod->HSM2_coqy = value->iValue; - mod->HSM2_coqy_Given = TRUE; - break; - case HSM2_MOD_COQOVSM: - mod->HSM2_coqovsm = value->iValue; - mod->HSM2_coqovsm_Given = TRUE; - break; - case HSM2_MOD_COERRREP: - mod->HSM2_coerrrep = value->iValue; - mod->HSM2_coerrrep_Given = TRUE; - break; - case HSM2_MOD_CODEP: - mod->HSM2_codep = value->iValue; - mod->HSM2_codep_Given = TRUE; - break; - case HSM2_MOD_CODDLT: - mod->HSM2_coddlt = value->iValue; - mod->HSM2_coddlt_Given = TRUE; - break; - - case HSM2_MOD_VMAX: - mod->HSM2_vmax = value->rValue; - mod->HSM2_vmax_Given = TRUE; - break; - case HSM2_MOD_BGTMP1: - mod->HSM2_bgtmp1 = value->rValue; - mod->HSM2_bgtmp1_Given = TRUE; - break; - case HSM2_MOD_BGTMP2: - mod->HSM2_bgtmp2 = value->rValue; - mod->HSM2_bgtmp2_Given = TRUE; - break; - case HSM2_MOD_EG0: - mod->HSM2_eg0 = value->rValue; - mod->HSM2_eg0_Given = TRUE; - break; - case HSM2_MOD_TOX: - mod->HSM2_tox = value->rValue; - mod->HSM2_tox_Given = TRUE; - break; - case HSM2_MOD_XLD: - mod->HSM2_xld = value->rValue; - mod->HSM2_xld_Given = TRUE; - break; - case HSM2_MOD_LOVER: - mod->HSM2_lover = value->rValue; - mod->HSM2_lover_Given = TRUE; - break; - case HSM2_MOD_DDLTMAX: /* Vdseff */ - mod->HSM2_ddltmax = value->rValue; - mod->HSM2_ddltmax_Given = TRUE; - break; - case HSM2_MOD_DDLTSLP: /* Vdseff */ - mod->HSM2_ddltslp = value->rValue; - mod->HSM2_ddltslp_Given = TRUE; - break; - case HSM2_MOD_DDLTICT: /* Vdseff */ - mod->HSM2_ddltict = value->rValue; - mod->HSM2_ddltict_Given = TRUE; - break; - case HSM2_MOD_VFBOVER: - mod->HSM2_vfbover = value->rValue; - mod->HSM2_vfbover_Given = TRUE; - break; - case HSM2_MOD_NOVER: - mod->HSM2_nover = value->rValue; - mod->HSM2_nover_Given = TRUE; - break; - case HSM2_MOD_XWD: - mod->HSM2_xwd = value->rValue; - mod->HSM2_xwd_Given = TRUE; - break; - case HSM2_MOD_XL: - mod->HSM2_xl = value->rValue; - mod->HSM2_xl_Given = TRUE; - break; - case HSM2_MOD_XW: - mod->HSM2_xw = value->rValue; - mod->HSM2_xw_Given = TRUE; - break; - case HSM2_MOD_SAREF: - mod->HSM2_saref = value->rValue; - mod->HSM2_saref_Given = TRUE; - break; - case HSM2_MOD_SBREF: - mod->HSM2_sbref = value->rValue; - mod->HSM2_sbref_Given = TRUE; - break; - case HSM2_MOD_LL: - mod->HSM2_ll = value->rValue; - mod->HSM2_ll_Given = TRUE; - break; - case HSM2_MOD_LLD: - mod->HSM2_lld = value->rValue; - mod->HSM2_lld_Given = TRUE; - break; - case HSM2_MOD_LLN: - mod->HSM2_lln = value->rValue; - mod->HSM2_lln_Given = TRUE; - break; - case HSM2_MOD_WL: - mod->HSM2_wl = value->rValue; - mod->HSM2_wl_Given = TRUE; - break; - case HSM2_MOD_WL1: - mod->HSM2_wl1 = value->rValue; - mod->HSM2_wl1_Given = TRUE; - break; - case HSM2_MOD_WL1P: - mod->HSM2_wl1p = value->rValue; - mod->HSM2_wl1p_Given = TRUE; - break; - case HSM2_MOD_WL2: - mod->HSM2_wl2 = value->rValue; - mod->HSM2_wl2_Given = TRUE; - break; - case HSM2_MOD_WL2P: - mod->HSM2_wl2p = value->rValue; - mod->HSM2_wl2p_Given = TRUE; - break; - case HSM2_MOD_WLD: - mod->HSM2_wld = value->rValue; - mod->HSM2_wld_Given = TRUE; - break; - case HSM2_MOD_WLN: - mod->HSM2_wln = value->rValue; - mod->HSM2_wln_Given = TRUE; - break; - case HSM2_MOD_XQY: - mod->HSM2_xqy = value->rValue; - mod->HSM2_xqy_Given = TRUE; - break; - case HSM2_MOD_XQY1: - mod->HSM2_xqy1 = value->rValue; - mod->HSM2_xqy1_Given = TRUE; - break; - case HSM2_MOD_XQY2: - mod->HSM2_xqy2 = value->rValue; - mod->HSM2_xqy2_Given = TRUE; - break; - case HSM2_MOD_QYRAT: - mod->HSM2_qyrat = value->rValue; - mod->HSM2_qyrat_Given = TRUE; - break; - case HSM2_MOD_RS: - mod->HSM2_rs = value->rValue; - mod->HSM2_rs_Given = TRUE; - break; - case HSM2_MOD_RD: - mod->HSM2_rd = value->rValue; - mod->HSM2_rd_Given = TRUE; - break; - case HSM2_MOD_RSH: - mod->HSM2_rsh = value->rValue; - mod->HSM2_rsh_Given = TRUE; - break; - case HSM2_MOD_RSHG: - mod->HSM2_rshg = value->rValue; - mod->HSM2_rshg_Given = TRUE; - break; -/* case HSM2_MOD_NGCON: */ -/* mod->HSM2_ngcon = value->rValue; */ -/* mod->HSM2_ngcon_Given = TRUE; */ -/* break; */ -/* case HSM2_MOD_XGW: */ -/* mod->HSM2_xgw = value->rValue; */ -/* mod->HSM2_xgw_Given = TRUE; */ -/* break; */ -/* case HSM2_MOD_XGL: */ -/* mod->HSM2_xgl = value->rValue; */ -/* mod->HSM2_xgl_Given = TRUE; */ -/* break; */ -/* case HSM2_MOD_NF: */ -/* mod->HSM2_nf = value->rValue; */ -/* mod->HSM2_nf_Given = TRUE; */ -/* break; */ - case HSM2_MOD_VFBC: - mod->HSM2_vfbc = value->rValue; - mod->HSM2_vfbc_Given = TRUE; - break; - case HSM2_MOD_VBI: - mod->HSM2_vbi = value->rValue; - mod->HSM2_vbi_Given = TRUE; - break; - case HSM2_MOD_NSUBC: - mod->HSM2_nsubc = value->rValue; - mod->HSM2_nsubc_Given = TRUE; - break; - case HSM2_MOD_VFBCL: - mod->HSM2_vfbcl = value->rValue; - mod->HSM2_vfbcl_Given = TRUE; - break; - case HSM2_MOD_VFBCLP: - mod->HSM2_vfbclp = value->rValue; - mod->HSM2_vfbclp_Given = TRUE; - break; - case HSM2_MOD_PARL2: - mod->HSM2_parl2 = value->rValue; - mod->HSM2_parl2_Given = TRUE; - break; - case HSM2_MOD_LP: - mod->HSM2_lp = value->rValue; - mod->HSM2_lp_Given = TRUE; - break; - case HSM2_MOD_NSUBP: - mod->HSM2_nsubp = value->rValue; - mod->HSM2_nsubp_Given = TRUE; - break; - case HSM2_MOD_NSUBPL: - mod->HSM2_nsubpl = value->rValue; - mod->HSM2_nsubpl_Given = TRUE; - break; - case HSM2_MOD_NSUBPFAC: - mod->HSM2_nsubpfac = value->rValue; - mod->HSM2_nsubpfac_Given = TRUE; - break; - case HSM2_MOD_NSUBPDLT: - mod->HSM2_nsubpdlt = value->rValue; - mod->HSM2_nsubpdlt_Given = TRUE; - break; - case HSM2_MOD_NSUBPW: - mod->HSM2_nsubpw = value->rValue; - mod->HSM2_nsubpw_Given = TRUE; - break; - case HSM2_MOD_NSUBPWP: - mod->HSM2_nsubpwp = value->rValue; - mod->HSM2_nsubpwp_Given = TRUE; - break; - case HSM2_MOD_SCP1: - mod->HSM2_scp1 = value->rValue; - mod->HSM2_scp1_Given = TRUE; - break; - case HSM2_MOD_SCP2: - mod->HSM2_scp2 = value->rValue; - mod->HSM2_scp2_Given = TRUE; - break; - case HSM2_MOD_SCP3: - mod->HSM2_scp3 = value->rValue; - mod->HSM2_scp3_Given = TRUE; - break; - case HSM2_MOD_SC1: - mod->HSM2_sc1 = value->rValue; - mod->HSM2_sc1_Given = TRUE; - break; - case HSM2_MOD_SC2: - mod->HSM2_sc2 = value->rValue; - mod->HSM2_sc2_Given = TRUE; - break; - case HSM2_MOD_SC3: - mod->HSM2_sc3 = value->rValue; - mod->HSM2_sc3_Given = TRUE; - break; - case HSM2_MOD_SC4: - mod->HSM2_sc4 = value->rValue; - mod->HSM2_sc4_Given = TRUE; - break; - case HSM2_MOD_PGD1: - mod->HSM2_pgd1 = value->rValue; - mod->HSM2_pgd1_Given = TRUE; - break; - case HSM2_MOD_PGD2: - mod->HSM2_pgd2 = value->rValue; - mod->HSM2_pgd2_Given = TRUE; - break; -//case HSM2_MOD_PGD3: -// mod->HSM2_pgd3 = value->rValue; -// mod->HSM2_pgd3_Given = TRUE; -// break; - case HSM2_MOD_PGD4: - mod->HSM2_pgd4 = value->rValue; - mod->HSM2_pgd4_Given = TRUE; - break; - case HSM2_MOD_NDEP: - mod->HSM2_ndep = value->rValue; - mod->HSM2_ndep_Given = TRUE; - break; - case HSM2_MOD_NDEPL: - mod->HSM2_ndepl = value->rValue; - mod->HSM2_ndepl_Given = TRUE; - break; - case HSM2_MOD_NDEPLP: - mod->HSM2_ndeplp = value->rValue; - mod->HSM2_ndeplp_Given = TRUE; - break; - case HSM2_MOD_NDEPW: - mod->HSM2_ndepw = value->rValue; - mod->HSM2_ndepw_Given = TRUE; - break; - case HSM2_MOD_NDEPWP: - mod->HSM2_ndepwp = value->rValue; - mod->HSM2_ndepwp_Given = TRUE; - break; - case HSM2_MOD_NINV: - mod->HSM2_ninv = value->rValue; - mod->HSM2_ninv_Given = TRUE; - break; - case HSM2_MOD_NINVD: - mod->HSM2_ninvd = value->rValue; - mod->HSM2_ninvd_Given = TRUE; - break; - case HSM2_MOD_NINVDL: - mod->HSM2_ninvdl = value->rValue; - mod->HSM2_ninvdl_Given = TRUE; - break; - case HSM2_MOD_NINVDLP: - mod->HSM2_ninvdlp = value->rValue; - mod->HSM2_ninvdlp_Given = TRUE; - break; - case HSM2_MOD_MUECB0: - mod->HSM2_muecb0 = value->rValue; - mod->HSM2_muecb0_Given = TRUE; - break; - case HSM2_MOD_MUECB1: - mod->HSM2_muecb1 = value->rValue; - mod->HSM2_muecb1_Given = TRUE; - break; - case HSM2_MOD_MUEPH1: - mod->HSM2_mueph1 = value->rValue; - mod->HSM2_mueph1_Given = TRUE; - break; - case HSM2_MOD_MUEPH0: - mod->HSM2_mueph0 = value->rValue; - mod->HSM2_mueph0_Given = TRUE; - break; - case HSM2_MOD_MUEPHW: - mod->HSM2_muephw = value->rValue; - mod->HSM2_muephw_Given = TRUE; - break; - case HSM2_MOD_MUEPWP: - mod->HSM2_muepwp = value->rValue; - mod->HSM2_muepwp_Given = TRUE; - break; - case HSM2_MOD_MUEPWD: - mod->HSM2_muepwd = value->rValue; - mod->HSM2_muepwd_Given = TRUE; - break; - case HSM2_MOD_MUEPHL: - mod->HSM2_muephl = value->rValue; - mod->HSM2_muephl_Given = TRUE; - break; - case HSM2_MOD_MUEPLP: - mod->HSM2_mueplp = value->rValue; - mod->HSM2_mueplp_Given = TRUE; - break; - case HSM2_MOD_MUEPLD: - mod->HSM2_muepld = value->rValue; - mod->HSM2_muepld_Given = TRUE; - break; - case HSM2_MOD_MUEPHS: - mod->HSM2_muephs = value->rValue; - mod->HSM2_muephs_Given = TRUE; - break; - case HSM2_MOD_MUEPSP: - mod->HSM2_muepsp = value->rValue; - mod->HSM2_muepsp_Given = TRUE; - break; - case HSM2_MOD_VTMP: - mod->HSM2_vtmp = value->rValue; - mod->HSM2_vtmp_Given = TRUE; - break; - case HSM2_MOD_WVTH0: - mod->HSM2_wvth0 = value->rValue; - mod->HSM2_wvth0_Given = TRUE; - break; - case HSM2_MOD_MUESR1: - mod->HSM2_muesr1 = value->rValue; - mod->HSM2_muesr1_Given = TRUE; - break; - case HSM2_MOD_MUESR0: - mod->HSM2_muesr0 = value->rValue; - mod->HSM2_muesr0_Given = TRUE; - break; - case HSM2_MOD_MUESRL: - mod->HSM2_muesrl = value->rValue; - mod->HSM2_muesrl_Given = TRUE; - break; - case HSM2_MOD_MUESLP: - mod->HSM2_mueslp = value->rValue; - mod->HSM2_mueslp_Given = TRUE; - break; - case HSM2_MOD_MUESRW: - mod->HSM2_muesrw = value->rValue; - mod->HSM2_muesrw_Given = TRUE; - break; - case HSM2_MOD_MUESWP: - mod->HSM2_mueswp = value->rValue; - mod->HSM2_mueswp_Given = TRUE; - break; - case HSM2_MOD_BB: - mod->HSM2_bb = value->rValue; - mod->HSM2_bb_Given = TRUE; - break; - case HSM2_MOD_SUB1: - mod->HSM2_sub1 = value->rValue; - mod->HSM2_sub1_Given = TRUE; - break; - case HSM2_MOD_SUB2: - mod->HSM2_sub2 = value->rValue; - mod->HSM2_sub2_Given = TRUE; - break; - case HSM2_MOD_SVGS: - mod->HSM2_svgs = value->rValue; - mod->HSM2_svgs_Given = TRUE; - break; - case HSM2_MOD_SVBS: - mod->HSM2_svbs = value->rValue; - mod->HSM2_svbs_Given = TRUE; - break; - case HSM2_MOD_SVBSL: - mod->HSM2_svbsl = value->rValue; - mod->HSM2_svbsl_Given = TRUE; - break; - case HSM2_MOD_SVDS: - mod->HSM2_svds = value->rValue; - mod->HSM2_svds_Given = TRUE; - break; - case HSM2_MOD_SLG: - mod->HSM2_slg = value->rValue; - mod->HSM2_slg_Given = TRUE; - break; - case HSM2_MOD_SUB1L: - mod->HSM2_sub1l = value->rValue; - mod->HSM2_sub1l_Given = TRUE; - break; - case HSM2_MOD_SUB2L: - mod->HSM2_sub2l = value->rValue; - mod->HSM2_sub2l_Given = TRUE; - break; - case HSM2_MOD_SVGSL: - mod->HSM2_svgsl = value->rValue; - mod->HSM2_svgsl_Given = TRUE; - break; - case HSM2_MOD_SVGSLP: - mod->HSM2_svgslp = value->rValue; - mod->HSM2_svgslp_Given = TRUE; - break; - case HSM2_MOD_SVGSWP: - mod->HSM2_svgswp = value->rValue; - mod->HSM2_svgswp_Given = TRUE; - break; - case HSM2_MOD_SVGSW: - mod->HSM2_svgsw = value->rValue; - mod->HSM2_svgsw_Given = TRUE; - break; - case HSM2_MOD_SVBSLP: - mod->HSM2_svbslp = value->rValue; - mod->HSM2_svbslp_Given = TRUE; - break; - case HSM2_MOD_SLGL: - mod->HSM2_slgl = value->rValue; - mod->HSM2_slgl_Given = TRUE; - break; - case HSM2_MOD_SLGLP: - mod->HSM2_slglp = value->rValue; - mod->HSM2_slglp_Given = TRUE; - break; - case HSM2_MOD_SUB1LP: - mod->HSM2_sub1lp = value->rValue; - mod->HSM2_sub1lp_Given = TRUE; - break; - case HSM2_MOD_NSTI: - mod->HSM2_nsti = value->rValue; - mod->HSM2_nsti_Given = TRUE; - break; - case HSM2_MOD_WSTI: - mod->HSM2_wsti = value->rValue; - mod->HSM2_wsti_Given = TRUE; - break; - case HSM2_MOD_WSTIL: - mod->HSM2_wstil = value->rValue; - mod->HSM2_wstil_Given = TRUE; - break; - case HSM2_MOD_WSTILP: - mod->HSM2_wstilp = value->rValue; - mod->HSM2_wstilp_Given = TRUE; - break; - case HSM2_MOD_WSTIW: - mod->HSM2_wstiw = value->rValue; - mod->HSM2_wstiw_Given = TRUE; - break; - case HSM2_MOD_WSTIWP: - mod->HSM2_wstiwp = value->rValue; - mod->HSM2_wstiwp_Given = TRUE; - break; - case HSM2_MOD_SCSTI1: - mod->HSM2_scsti1 = value->rValue; - mod->HSM2_scsti1_Given = TRUE; - break; - case HSM2_MOD_SCSTI2: - mod->HSM2_scsti2 = value->rValue; - mod->HSM2_scsti2_Given = TRUE; - break; - case HSM2_MOD_VTHSTI: - mod->HSM2_vthsti = value->rValue; - mod->HSM2_vthsti_Given = TRUE; - break; - case HSM2_MOD_VDSTI: - mod->HSM2_vdsti = value->rValue; - mod->HSM2_vdsti_Given = TRUE; - break; - case HSM2_MOD_MUESTI1: - mod->HSM2_muesti1 = value->rValue; - mod->HSM2_muesti1_Given = TRUE; - break; - case HSM2_MOD_MUESTI2: - mod->HSM2_muesti2 = value->rValue; - mod->HSM2_muesti2_Given = TRUE; - break; - case HSM2_MOD_MUESTI3: - mod->HSM2_muesti3 = value->rValue; - mod->HSM2_muesti3_Given = TRUE; - break; - case HSM2_MOD_NSUBPSTI1: - mod->HSM2_nsubpsti1 = value->rValue; - mod->HSM2_nsubpsti1_Given = TRUE; - break; - case HSM2_MOD_NSUBPSTI2: - mod->HSM2_nsubpsti2 = value->rValue; - mod->HSM2_nsubpsti2_Given = TRUE; - break; - case HSM2_MOD_NSUBPSTI3: - mod->HSM2_nsubpsti3 = value->rValue; - mod->HSM2_nsubpsti3_Given = TRUE; - break; - case HSM2_MOD_NSUBCSTI1: - mod->HSM2_nsubcsti1 = value->rValue; - mod->HSM2_nsubcsti1_Given = TRUE; - break; - case HSM2_MOD_NSUBCSTI2: - mod->HSM2_nsubcsti2 = value->rValue; - mod->HSM2_nsubcsti2_Given = TRUE; - break; - case HSM2_MOD_NSUBCSTI3: - mod->HSM2_nsubcsti3 = value->rValue; - mod->HSM2_nsubcsti3_Given = TRUE; - break; - case HSM2_MOD_LPEXT: - mod->HSM2_lpext = value->rValue; - mod->HSM2_lpext_Given = TRUE; - break; - case HSM2_MOD_NPEXT: - mod->HSM2_npext = value->rValue; - mod->HSM2_npext_Given = TRUE; - break; - case HSM2_MOD_NPEXTW: - mod->HSM2_npextw = value->rValue; - mod->HSM2_npextw_Given = TRUE; - break; - case HSM2_MOD_NPEXTWP: - mod->HSM2_npextwp = value->rValue; - mod->HSM2_npextwp_Given = TRUE; - break; - case HSM2_MOD_SCP22: - mod->HSM2_scp22 = value->rValue; - mod->HSM2_scp22_Given = TRUE; - break; - case HSM2_MOD_SCP21: - mod->HSM2_scp21 = value->rValue; - mod->HSM2_scp21_Given = TRUE; - break; - case HSM2_MOD_BS1: - mod->HSM2_bs1 = value->rValue; - mod->HSM2_bs1_Given = TRUE; - break; - case HSM2_MOD_BS2: - mod->HSM2_bs2 = value->rValue; - mod->HSM2_bs2_Given = TRUE; - break; - case HSM2_MOD_CGSO: - mod->HSM2_cgso = value->rValue; - mod->HSM2_cgso_Given = TRUE; - break; - case HSM2_MOD_CGDO: - mod->HSM2_cgdo = value->rValue; - mod->HSM2_cgdo_Given = TRUE; - break; - case HSM2_MOD_CGBO: - mod->HSM2_cgbo = value->rValue; - mod->HSM2_cgbo_Given = TRUE; - break; - case HSM2_MOD_TPOLY: - mod->HSM2_tpoly = value->rValue; - mod->HSM2_tpoly_Given = TRUE; - break; - case HSM2_MOD_JS0: - mod->HSM2_js0 = value->rValue; - mod->HSM2_js0_Given = TRUE; - break; - case HSM2_MOD_JS0SW: - mod->HSM2_js0sw = value->rValue; - mod->HSM2_js0sw_Given = TRUE; - break; - case HSM2_MOD_NJ: - mod->HSM2_nj = value->rValue; - mod->HSM2_nj_Given = TRUE; - break; - case HSM2_MOD_NJSW: - mod->HSM2_njsw = value->rValue; - mod->HSM2_njsw_Given = TRUE; - break; - case HSM2_MOD_XTI: - mod->HSM2_xti = value->rValue; - mod->HSM2_xti_Given = TRUE; - break; - case HSM2_MOD_CJ: - mod->HSM2_cj = value->rValue; - mod->HSM2_cj_Given = TRUE; - break; - case HSM2_MOD_CJSW: - mod->HSM2_cjsw = value->rValue; - mod->HSM2_cjsw_Given = TRUE; - break; - case HSM2_MOD_CJSWG: - mod->HSM2_cjswg = value->rValue; - mod->HSM2_cjswg_Given = TRUE; - break; - case HSM2_MOD_MJ: - mod->HSM2_mj = value->rValue; - mod->HSM2_mj_Given = TRUE; - break; - case HSM2_MOD_MJSW: - mod->HSM2_mjsw = value->rValue; - mod->HSM2_mjsw_Given = TRUE; - break; - case HSM2_MOD_MJSWG: - mod->HSM2_mjswg = value->rValue; - mod->HSM2_mjswg_Given = TRUE; - break; - case HSM2_MOD_PB: - mod->HSM2_pb = value->rValue; - mod->HSM2_pb_Given = TRUE; - break; - case HSM2_MOD_PBSW: - mod->HSM2_pbsw = value->rValue; - mod->HSM2_pbsw_Given = TRUE; - break; - case HSM2_MOD_PBSWG: - mod->HSM2_pbswg = value->rValue; - mod->HSM2_pbswg_Given = TRUE; - break; - - case HSM2_MOD_TCJBD: - mod->HSM2_tcjbd = value->rValue; - mod->HSM2_tcjbd_Given = TRUE; - break; - case HSM2_MOD_TCJBS: - mod->HSM2_tcjbs = value->rValue; - mod->HSM2_tcjbs_Given = TRUE; - break; - case HSM2_MOD_TCJBDSW: - mod->HSM2_tcjbdsw = value->rValue; - mod->HSM2_tcjbdsw_Given = TRUE; - break; - case HSM2_MOD_TCJBSSW: - mod->HSM2_tcjbssw = value->rValue; - mod->HSM2_tcjbssw_Given = TRUE; - break; - case HSM2_MOD_TCJBDSWG: - mod->HSM2_tcjbdswg = value->rValue; - mod->HSM2_tcjbdswg_Given = TRUE; - break; - case HSM2_MOD_TCJBSSWG: - mod->HSM2_tcjbsswg = value->rValue; - mod->HSM2_tcjbsswg_Given = TRUE; - break; - - case HSM2_MOD_XTI2: - mod->HSM2_xti2 = value->rValue; - mod->HSM2_xti2_Given = TRUE; - break; - case HSM2_MOD_CISB: - mod->HSM2_cisb = value->rValue; - mod->HSM2_cisb_Given = TRUE; - break; - case HSM2_MOD_CVB: - mod->HSM2_cvb = value->rValue; - mod->HSM2_cvb_Given = TRUE; - break; - case HSM2_MOD_CTEMP: - mod->HSM2_ctemp = value->rValue; - mod->HSM2_ctemp_Given = TRUE; - break; - case HSM2_MOD_CISBK: - mod->HSM2_cisbk = value->rValue; - mod->HSM2_cisbk_Given = TRUE; - break; - case HSM2_MOD_CVBK: - mod->HSM2_cvbk = value->rValue; - mod->HSM2_cvbk_Given = TRUE; - break; - case HSM2_MOD_DIVX: - mod->HSM2_divx = value->rValue; - mod->HSM2_divx_Given = TRUE; - break; - case HSM2_MOD_CLM1: - mod->HSM2_clm1 = value->rValue; - mod->HSM2_clm1_Given = TRUE; - break; - case HSM2_MOD_CLM2: - mod->HSM2_clm2 = value->rValue; - mod->HSM2_clm2_Given = TRUE; - break; - case HSM2_MOD_CLM3: - mod->HSM2_clm3 = value->rValue; - mod->HSM2_clm3_Given = TRUE; - break; - case HSM2_MOD_CLM5: - mod->HSM2_clm5 = value->rValue; - mod->HSM2_clm5_Given = TRUE; - break; - case HSM2_MOD_CLM6: - mod->HSM2_clm6 = value->rValue; - mod->HSM2_clm6_Given = TRUE; - break; - case HSM2_MOD_MUETMP: - mod->HSM2_muetmp = value->rValue; - mod->HSM2_muetmp_Given = TRUE; - break; - case HSM2_MOD_VOVER: - mod->HSM2_vover = value->rValue; - mod->HSM2_vover_Given = TRUE; - break; - case HSM2_MOD_VOVERP: - mod->HSM2_voverp = value->rValue; - mod->HSM2_voverp_Given = TRUE; - break; - case HSM2_MOD_VOVERS: - mod->HSM2_vovers = value->rValue; - mod->HSM2_vovers_Given = TRUE; - break; - case HSM2_MOD_VOVERSP: - mod->HSM2_voversp = value->rValue; - mod->HSM2_voversp_Given = TRUE; - break; - case HSM2_MOD_WFC: - mod->HSM2_wfc = value->rValue; - mod->HSM2_wfc_Given = TRUE; - break; - case HSM2_MOD_NSUBCW: - mod->HSM2_nsubcw = value->rValue; - mod->HSM2_nsubcw_Given = TRUE; - break; - case HSM2_MOD_NSUBCWP: - mod->HSM2_nsubcwp = value->rValue; - mod->HSM2_nsubcwp_Given = TRUE; - break; - case HSM2_MOD_NSUBCMAX: - mod->HSM2_nsubcmax = value->rValue; - mod->HSM2_nsubcmax_Given = TRUE; - break; - case HSM2_MOD_QME1: - mod->HSM2_qme1 = value->rValue; - mod->HSM2_qme1_Given = TRUE; - break; - case HSM2_MOD_QME2: - mod->HSM2_qme2 = value->rValue; - mod->HSM2_qme2_Given = TRUE; - break; - case HSM2_MOD_QME3: - mod->HSM2_qme3 = value->rValue; - mod->HSM2_qme3_Given = TRUE; - break; - case HSM2_MOD_GIDL1: - mod->HSM2_gidl1 = value->rValue; - mod->HSM2_gidl1_Given = TRUE; - break; - case HSM2_MOD_GIDL2: - mod->HSM2_gidl2 = value->rValue; - mod->HSM2_gidl2_Given = TRUE; - break; - case HSM2_MOD_GIDL3: - mod->HSM2_gidl3 = value->rValue; - mod->HSM2_gidl3_Given = TRUE; - break; - case HSM2_MOD_GIDL4: - mod->HSM2_gidl4 = value->rValue; - mod->HSM2_gidl4_Given = TRUE; - break; - case HSM2_MOD_GIDL5: - mod->HSM2_gidl5 = value->rValue; - mod->HSM2_gidl5_Given = TRUE; - break; - case HSM2_MOD_GIDL6: - mod->HSM2_gidl6 = value->rValue; - mod->HSM2_gidl6_Given = TRUE; - break; - case HSM2_MOD_GIDL7: - mod->HSM2_gidl7 = value->rValue; - mod->HSM2_gidl7_Given = TRUE; - break; - case HSM2_MOD_GLEAK1: - mod->HSM2_gleak1 = value->rValue; - mod->HSM2_gleak1_Given = TRUE; - break; - case HSM2_MOD_GLEAK2: - mod->HSM2_gleak2 = value->rValue; - mod->HSM2_gleak2_Given = TRUE; - break; - case HSM2_MOD_GLEAK3: - mod->HSM2_gleak3 = value->rValue; - mod->HSM2_gleak3_Given = TRUE; - break; - case HSM2_MOD_GLEAK4: - mod->HSM2_gleak4 = value->rValue; - mod->HSM2_gleak4_Given = TRUE; - break; - case HSM2_MOD_GLEAK5: - mod->HSM2_gleak5 = value->rValue; - mod->HSM2_gleak5_Given = TRUE; - break; - case HSM2_MOD_GLEAK6: - mod->HSM2_gleak6 = value->rValue; - mod->HSM2_gleak6_Given = TRUE; - break; - case HSM2_MOD_GLEAK7: - mod->HSM2_gleak7 = value->rValue; - mod->HSM2_gleak7_Given = TRUE; - break; - case HSM2_MOD_GLKSD1: - mod->HSM2_glksd1 = value->rValue; - mod->HSM2_glksd1_Given = TRUE; - break; - case HSM2_MOD_GLKSD2: - mod->HSM2_glksd2 = value->rValue; - mod->HSM2_glksd2_Given = TRUE; - break; - case HSM2_MOD_GLKSD3: - mod->HSM2_glksd3 = value->rValue; - mod->HSM2_glksd3_Given = TRUE; - break; - case HSM2_MOD_GLKB1: - mod->HSM2_glkb1 = value->rValue; - mod->HSM2_glkb1_Given = TRUE; - break; - case HSM2_MOD_GLKB2: - mod->HSM2_glkb2 = value->rValue; - mod->HSM2_glkb2_Given = TRUE; - break; - case HSM2_MOD_GLKB3: - mod->HSM2_glkb3 = value->rValue; - mod->HSM2_glkb3_Given = TRUE; - break; - case HSM2_MOD_EGIG: - mod->HSM2_egig = value->rValue; - mod->HSM2_egig_Given = TRUE; - break; - case HSM2_MOD_IGTEMP2: - mod->HSM2_igtemp2 = value->rValue; - mod->HSM2_igtemp2_Given = TRUE; - break; - case HSM2_MOD_IGTEMP3: - mod->HSM2_igtemp3 = value->rValue; - mod->HSM2_igtemp3_Given = TRUE; - break; - case HSM2_MOD_VZADD0: - mod->HSM2_vzadd0 = value->rValue; - mod->HSM2_vzadd0_Given = TRUE; - break; - case HSM2_MOD_PZADD0: - mod->HSM2_pzadd0 = value->rValue; - mod->HSM2_pzadd0_Given = TRUE; - break; - case HSM2_MOD_NFTRP: - mod->HSM2_nftrp = value->rValue; - mod->HSM2_nftrp_Given = TRUE; - break; - case HSM2_MOD_NFALP: - mod->HSM2_nfalp = value->rValue; - mod->HSM2_nfalp_Given = TRUE; - break; - case HSM2_MOD_CIT: - mod->HSM2_cit = value->rValue; - mod->HSM2_cit_Given = TRUE; - break; - case HSM2_MOD_FALPH: - mod->HSM2_falph = value->rValue; - mod->HSM2_falph_Given = TRUE; - break; - case HSM2_MOD_KAPPA: - mod->HSM2_kappa = value->rValue; - mod->HSM2_kappa_Given = TRUE; - break; - case HSM2_MOD_VDIFFJ: - mod->HSM2_vdiffj = value->rValue; - mod->HSM2_vdiffj_Given = TRUE; - break; - case HSM2_MOD_DLY1: - mod->HSM2_dly1 = value->rValue; - mod->HSM2_dly1_Given = TRUE; - break; - case HSM2_MOD_DLY2: - mod->HSM2_dly2 = value->rValue; - mod->HSM2_dly2_Given = TRUE; - break; - case HSM2_MOD_DLY3: - mod->HSM2_dly3 = value->rValue; - mod->HSM2_dly3_Given = TRUE; - break; - case HSM2_MOD_TNOM: - mod->HSM2_tnom = value->rValue; - mod->HSM2_tnom_Given = TRUE; - break; - case HSM2_MOD_OVSLP: - mod->HSM2_ovslp = value->rValue; - mod->HSM2_ovslp_Given = TRUE; - break; - case HSM2_MOD_OVMAG: - mod->HSM2_ovmag = value->rValue; - mod->HSM2_ovmag_Given = TRUE; - break; - case HSM2_MOD_GBMIN: - mod->HSM2_gbmin = value->rValue; - mod->HSM2_gbmin_Given = TRUE; - break; - case HSM2_MOD_RBPB: - mod->HSM2_rbpb = value->rValue; - mod->HSM2_rbpb_Given = TRUE; - break; - case HSM2_MOD_RBPD: - mod->HSM2_rbpd = value->rValue; - mod->HSM2_rbpd_Given = TRUE; - break; - case HSM2_MOD_RBPS: - mod->HSM2_rbps = value->rValue; - mod->HSM2_rbps_Given = TRUE; - break; - case HSM2_MOD_RBDB: - mod->HSM2_rbdb = value->rValue; - mod->HSM2_rbdb_Given = TRUE; - break; - case HSM2_MOD_RBSB: - mod->HSM2_rbsb = value->rValue; - mod->HSM2_rbsb_Given = TRUE; - break; - case HSM2_MOD_IBPC1: - mod->HSM2_ibpc1 = value->rValue; - mod->HSM2_ibpc1_Given = TRUE; - break; - case HSM2_MOD_IBPC2: - mod->HSM2_ibpc2 = value->rValue; - mod->HSM2_ibpc2_Given = TRUE; - break; - case HSM2_MOD_MPHDFM: - mod->HSM2_mphdfm = value->rValue; - mod->HSM2_mphdfm_Given = TRUE; - break; - - case HSM2_MOD_PTL: - mod->HSM2_ptl = value->rValue; - mod->HSM2_ptl_Given = TRUE; - break; - case HSM2_MOD_PTP: - mod->HSM2_ptp = value->rValue; - mod->HSM2_ptp_Given = TRUE; - break; - case HSM2_MOD_PT2: - mod->HSM2_pt2 = value->rValue; - mod->HSM2_pt2_Given = TRUE; - break; - case HSM2_MOD_PTLP: - mod->HSM2_ptlp = value->rValue; - mod->HSM2_ptlp_Given = TRUE; - break; - case HSM2_MOD_GDL: - mod->HSM2_gdl = value->rValue; - mod->HSM2_gdl_Given = TRUE; - break; - case HSM2_MOD_GDLP: - mod->HSM2_gdlp = value->rValue; - mod->HSM2_gdlp_Given = TRUE; - break; - - case HSM2_MOD_GDLD: - mod->HSM2_gdld = value->rValue; - mod->HSM2_gdld_Given = TRUE; - break; - case HSM2_MOD_PT4: - mod->HSM2_pt4 = value->rValue; - mod->HSM2_pt4_Given = TRUE; - break; - case HSM2_MOD_PT4P: - mod->HSM2_pt4p = value->rValue; - mod->HSM2_pt4p_Given = TRUE; - break; - case HSM2_MOD_MUEPHL2: - mod->HSM2_muephl2 = value->rValue; - mod->HSM2_muephl2_Given = TRUE; - break; - case HSM2_MOD_MUEPLP2: - mod->HSM2_mueplp2 = value->rValue; - mod->HSM2_mueplp2_Given = TRUE; - break; - case HSM2_MOD_NSUBCW2: - mod->HSM2_nsubcw2 = value->rValue; - mod->HSM2_nsubcw2_Given = TRUE; - break; - case HSM2_MOD_NSUBCWP2: - mod->HSM2_nsubcwp2 = value->rValue; - mod->HSM2_nsubcwp2_Given = TRUE; - break; - case HSM2_MOD_MUEPHW2: - mod->HSM2_muephw2 = value->rValue; - mod->HSM2_muephw2_Given = TRUE; - break; - case HSM2_MOD_MUEPWP2: - mod->HSM2_muepwp2 = value->rValue; - mod->HSM2_muepwp2_Given = TRUE; - break; -/* WPE */ - case HSM2_MOD_WEB: - mod->HSM2_web = value->rValue; - mod->HSM2_web_Given = TRUE; - break; - case HSM2_MOD_WEC: - mod->HSM2_wec = value->rValue; - mod->HSM2_wec_Given = TRUE; - break; - case HSM2_MOD_NSUBCWPE: - mod->HSM2_nsubcwpe = value->rValue; - mod->HSM2_nsubcwpe_Given = TRUE; - break; - case HSM2_MOD_NPEXTWPE: - mod->HSM2_npextwpe = value->rValue; - mod->HSM2_npextwpe_Given = TRUE; - break; - case HSM2_MOD_NSUBPWPE: - mod->HSM2_nsubpwpe = value->rValue; - mod->HSM2_nsubpwpe_Given = TRUE; - break; - case HSM2_MOD_VGSMIN: - mod->HSM2_Vgsmin = value->rValue; - mod->HSM2_Vgsmin_Given = TRUE; - break; - case HSM2_MOD_SC3VBS: - mod->HSM2_sc3Vbs = value->rValue; - mod->HSM2_sc3Vbs_Given = TRUE; - break; - case HSM2_MOD_BYPTOL: - mod->HSM2_byptol = value->rValue; - mod->HSM2_byptol_Given = TRUE; - break; - case HSM2_MOD_MUECB0LP: - mod->HSM2_muecb0lp = value->rValue; - mod->HSM2_muecb0lp_Given = TRUE; - break; - case HSM2_MOD_MUECB1LP: - mod->HSM2_muecb1lp = value->rValue; - mod->HSM2_muecb1lp_Given = TRUE; - break; - - /* Depletion Mode MODFET */ - case HSM2_MOD_NDEPM: - mod->HSM2_ndepm = value->rValue; - mod->HSM2_ndepm_Given = TRUE; - break; - case HSM2_MOD_NDEPML: - mod->HSM2_ndepml = value->rValue; - mod->HSM2_ndepml_Given = TRUE; - break; - case HSM2_MOD_NDEPMLP: - mod->HSM2_ndepmlp = value->rValue; - mod->HSM2_ndepmlp_Given = TRUE; - break; - case HSM2_MOD_TNDEP: - mod->HSM2_tndep = value->rValue; - mod->HSM2_tndep_Given = TRUE; - break; - case HSM2_MOD_DEPLEAK: - mod->HSM2_depleak = value->rValue; - mod->HSM2_depleak_Given = TRUE; - break; - case HSM2_MOD_DEPLEAKL: - mod->HSM2_depleakl = value->rValue; - mod->HSM2_depleakl_Given = TRUE; - break; - case HSM2_MOD_DEPLEAKLP: - mod->HSM2_depleaklp = value->rValue; - mod->HSM2_depleaklp_Given = TRUE; - break; - case HSM2_MOD_DEPETA: - mod->HSM2_depeta = value->rValue; - mod->HSM2_depeta_Given = TRUE; - break; - case HSM2_MOD_DEPMUE0: - mod->HSM2_depmue0 = value->rValue; - mod->HSM2_depmue0_Given = TRUE; - break; - case HSM2_MOD_DEPMUE0L: - mod->HSM2_depmue0l = value->rValue; - mod->HSM2_depmue0l_Given = TRUE; - break; - case HSM2_MOD_DEPMUE0LP: - mod->HSM2_depmue0lp = value->rValue; - mod->HSM2_depmue0lp_Given = TRUE; - break; - case HSM2_MOD_DEPMUE1: - mod->HSM2_depmue1 = value->rValue; - mod->HSM2_depmue1_Given = TRUE; - break; - case HSM2_MOD_DEPMUE1L: - mod->HSM2_depmue1l = value->rValue; - mod->HSM2_depmue1l_Given = TRUE; - break; - case HSM2_MOD_DEPMUE1LP: - mod->HSM2_depmue1lp = value->rValue; - mod->HSM2_depmue1lp_Given = TRUE; - break; - case HSM2_MOD_DEPMUEBACK0: - mod->HSM2_depmueback0 = value->rValue; - mod->HSM2_depmueback0_Given = TRUE; - break; - case HSM2_MOD_DEPMUEBACK0L: - mod->HSM2_depmueback0l = value->rValue; - mod->HSM2_depmueback0l_Given = TRUE; - break; - case HSM2_MOD_DEPMUEBACK0LP: - mod->HSM2_depmueback0lp = value->rValue; - mod->HSM2_depmueback0lp_Given = TRUE; - break; - case HSM2_MOD_DEPMUEBACK1: - mod->HSM2_depmueback1 = value->rValue; - mod->HSM2_depmueback1_Given = TRUE; - break; - case HSM2_MOD_DEPMUEBACK1L: - mod->HSM2_depmueback1l = value->rValue; - mod->HSM2_depmueback1l_Given = TRUE; - break; - case HSM2_MOD_DEPMUEBACK1LP: - mod->HSM2_depmueback1lp = value->rValue; - mod->HSM2_depmueback1lp_Given = TRUE; - break; - case HSM2_MOD_DEPMUEPH0: - mod->HSM2_depmueph0 = value->rValue; - mod->HSM2_depmueph0_Given = TRUE; - break; - case HSM2_MOD_DEPMUEPH1: - mod->HSM2_depmueph1 = value->rValue; - mod->HSM2_depmueph1_Given = TRUE; - break; - case HSM2_MOD_DEPVMAX: - mod->HSM2_depvmax = value->rValue; - mod->HSM2_depvmax_Given = TRUE; - break; - case HSM2_MOD_DEPVMAXL: - mod->HSM2_depvmaxl = value->rValue; - mod->HSM2_depvmaxl_Given = TRUE; - break; - case HSM2_MOD_DEPVMAXLP: - mod->HSM2_depvmaxlp = value->rValue; - mod->HSM2_depvmaxlp_Given = TRUE; - break; - case HSM2_MOD_DEPVDSEF1: - mod->HSM2_depvdsef1 = value->rValue; - mod->HSM2_depvdsef1_Given = TRUE; - break; - case HSM2_MOD_DEPVDSEF1L: - mod->HSM2_depvdsef1l = value->rValue; - mod->HSM2_depvdsef1l_Given = TRUE; - break; - case HSM2_MOD_DEPVDSEF1LP: - mod->HSM2_depvdsef1lp = value->rValue; - mod->HSM2_depvdsef1lp_Given = TRUE; - break; - case HSM2_MOD_DEPVDSEF2: - mod->HSM2_depvdsef2 = value->rValue; - mod->HSM2_depvdsef2_Given = TRUE; - break; - case HSM2_MOD_DEPVDSEF2L: - mod->HSM2_depvdsef2l = value->rValue; - mod->HSM2_depvdsef2l_Given = TRUE; - break; - case HSM2_MOD_DEPVDSEF2LP: - mod->HSM2_depvdsef2lp = value->rValue; - mod->HSM2_depvdsef2lp_Given = TRUE; - break; - case HSM2_MOD_DEPBB: - mod->HSM2_depbb = value->rValue; - mod->HSM2_depbb_Given = TRUE; - break; - case HSM2_MOD_DEPMUETMP: - mod->HSM2_depmuetmp = value->rValue; - mod->HSM2_depmuetmp_Given = TRUE; - break; - - /* binning parameters */ - case HSM2_MOD_LMIN: - mod->HSM2_lmin = value->rValue; - mod->HSM2_lmin_Given = TRUE; - break; - case HSM2_MOD_LMAX: - mod->HSM2_lmax = value->rValue; - mod->HSM2_lmax_Given = TRUE; - break; - case HSM2_MOD_WMIN: - mod->HSM2_wmin = value->rValue; - mod->HSM2_wmin_Given = TRUE; - break; - case HSM2_MOD_WMAX: - mod->HSM2_wmax = value->rValue; - mod->HSM2_wmax_Given = TRUE; - break; - case HSM2_MOD_LBINN: - mod->HSM2_lbinn = value->rValue; - mod->HSM2_lbinn_Given = TRUE; - break; - case HSM2_MOD_WBINN: - mod->HSM2_wbinn = value->rValue; - mod->HSM2_wbinn_Given = TRUE; - break; - - /* Length dependence */ - case HSM2_MOD_LVMAX: - mod->HSM2_lvmax = value->rValue; - mod->HSM2_lvmax_Given = TRUE; - break; - case HSM2_MOD_LBGTMP1: - mod->HSM2_lbgtmp1 = value->rValue; - mod->HSM2_lbgtmp1_Given = TRUE; - break; - case HSM2_MOD_LBGTMP2: - mod->HSM2_lbgtmp2 = value->rValue; - mod->HSM2_lbgtmp2_Given = TRUE; - break; - case HSM2_MOD_LEG0: - mod->HSM2_leg0 = value->rValue; - mod->HSM2_leg0_Given = TRUE; - break; - case HSM2_MOD_LLOVER: - mod->HSM2_llover = value->rValue; - mod->HSM2_llover_Given = TRUE; - break; - case HSM2_MOD_LVFBOVER: - mod->HSM2_lvfbover = value->rValue; - mod->HSM2_lvfbover_Given = TRUE; - break; - case HSM2_MOD_LNOVER: - mod->HSM2_lnover = value->rValue; - mod->HSM2_lnover_Given = TRUE; - break; - case HSM2_MOD_LWL2: - mod->HSM2_lwl2 = value->rValue; - mod->HSM2_lwl2_Given = TRUE; - break; - case HSM2_MOD_LVFBC: - mod->HSM2_lvfbc = value->rValue; - mod->HSM2_lvfbc_Given = TRUE; - break; - case HSM2_MOD_LNSUBC: - mod->HSM2_lnsubc = value->rValue; - mod->HSM2_lnsubc_Given = TRUE; - break; - case HSM2_MOD_LNSUBP: - mod->HSM2_lnsubp = value->rValue; - mod->HSM2_lnsubp_Given = TRUE; - break; - case HSM2_MOD_LSCP1: - mod->HSM2_lscp1 = value->rValue; - mod->HSM2_lscp1_Given = TRUE; - break; - case HSM2_MOD_LSCP2: - mod->HSM2_lscp2 = value->rValue; - mod->HSM2_lscp2_Given = TRUE; - break; - case HSM2_MOD_LSCP3: - mod->HSM2_lscp3 = value->rValue; - mod->HSM2_lscp3_Given = TRUE; - break; - case HSM2_MOD_LSC1: - mod->HSM2_lsc1 = value->rValue; - mod->HSM2_lsc1_Given = TRUE; - break; - case HSM2_MOD_LSC2: - mod->HSM2_lsc2 = value->rValue; - mod->HSM2_lsc2_Given = TRUE; - break; - case HSM2_MOD_LSC3: - mod->HSM2_lsc3 = value->rValue; - mod->HSM2_lsc3_Given = TRUE; - break; - case HSM2_MOD_LSC4: - mod->HSM2_lsc4 = value->rValue; - mod->HSM2_lsc4_Given = TRUE; - break; - case HSM2_MOD_LPGD1: - mod->HSM2_lpgd1 = value->rValue; - mod->HSM2_lpgd1_Given = TRUE; - break; -//case HSM2_MOD_LPGD3: -// mod->HSM2_lpgd3 = value->rValue; -// mod->HSM2_lpgd3_Given = TRUE; -// break; - case HSM2_MOD_LNDEP: - mod->HSM2_lndep = value->rValue; - mod->HSM2_lndep_Given = TRUE; - break; - case HSM2_MOD_LNINV: - mod->HSM2_lninv = value->rValue; - mod->HSM2_lninv_Given = TRUE; - break; - case HSM2_MOD_LMUECB0: - mod->HSM2_lmuecb0 = value->rValue; - mod->HSM2_lmuecb0_Given = TRUE; - break; - case HSM2_MOD_LMUECB1: - mod->HSM2_lmuecb1 = value->rValue; - mod->HSM2_lmuecb1_Given = TRUE; - break; - case HSM2_MOD_LMUEPH1: - mod->HSM2_lmueph1 = value->rValue; - mod->HSM2_lmueph1_Given = TRUE; - break; - case HSM2_MOD_LVTMP: - mod->HSM2_lvtmp = value->rValue; - mod->HSM2_lvtmp_Given = TRUE; - break; - case HSM2_MOD_LWVTH0: - mod->HSM2_lwvth0 = value->rValue; - mod->HSM2_lwvth0_Given = TRUE; - break; - case HSM2_MOD_LMUESR1: - mod->HSM2_lmuesr1 = value->rValue; - mod->HSM2_lmuesr1_Given = TRUE; - break; - case HSM2_MOD_LMUETMP: - mod->HSM2_lmuetmp = value->rValue; - mod->HSM2_lmuetmp_Given = TRUE; - break; - case HSM2_MOD_LSUB1: - mod->HSM2_lsub1 = value->rValue; - mod->HSM2_lsub1_Given = TRUE; - break; - case HSM2_MOD_LSUB2: - mod->HSM2_lsub2 = value->rValue; - mod->HSM2_lsub2_Given = TRUE; - break; - case HSM2_MOD_LSVDS: - mod->HSM2_lsvds = value->rValue; - mod->HSM2_lsvds_Given = TRUE; - break; - case HSM2_MOD_LSVBS: - mod->HSM2_lsvbs = value->rValue; - mod->HSM2_lsvbs_Given = TRUE; - break; - case HSM2_MOD_LSVGS: - mod->HSM2_lsvgs = value->rValue; - mod->HSM2_lsvgs_Given = TRUE; - break; - case HSM2_MOD_LNSTI: - mod->HSM2_lnsti = value->rValue; - mod->HSM2_lnsti_Given = TRUE; - break; - case HSM2_MOD_LWSTI: - mod->HSM2_lwsti = value->rValue; - mod->HSM2_lwsti_Given = TRUE; - break; - case HSM2_MOD_LSCSTI1: - mod->HSM2_lscsti1 = value->rValue; - mod->HSM2_lscsti1_Given = TRUE; - break; - case HSM2_MOD_LSCSTI2: - mod->HSM2_lscsti2 = value->rValue; - mod->HSM2_lscsti2_Given = TRUE; - break; - case HSM2_MOD_LVTHSTI: - mod->HSM2_lvthsti = value->rValue; - mod->HSM2_lvthsti_Given = TRUE; - break; - case HSM2_MOD_LMUESTI1: - mod->HSM2_lmuesti1 = value->rValue; - mod->HSM2_lmuesti1_Given = TRUE; - break; - case HSM2_MOD_LMUESTI2: - mod->HSM2_lmuesti2 = value->rValue; - mod->HSM2_lmuesti2_Given = TRUE; - break; - case HSM2_MOD_LMUESTI3: - mod->HSM2_lmuesti3 = value->rValue; - mod->HSM2_lmuesti3_Given = TRUE; - break; - case HSM2_MOD_LNSUBPSTI1: - mod->HSM2_lnsubpsti1 = value->rValue; - mod->HSM2_lnsubpsti1_Given = TRUE; - break; - case HSM2_MOD_LNSUBPSTI2: - mod->HSM2_lnsubpsti2 = value->rValue; - mod->HSM2_lnsubpsti2_Given = TRUE; - break; - case HSM2_MOD_LNSUBPSTI3: - mod->HSM2_lnsubpsti3 = value->rValue; - mod->HSM2_lnsubpsti3_Given = TRUE; - break; - case HSM2_MOD_LNSUBCSTI1: - mod->HSM2_lnsubcsti1 = value->rValue; - mod->HSM2_lnsubcsti1_Given = TRUE; - break; - case HSM2_MOD_LNSUBCSTI2: - mod->HSM2_lnsubcsti2 = value->rValue; - mod->HSM2_lnsubcsti2_Given = TRUE; - break; - case HSM2_MOD_LNSUBCSTI3: - mod->HSM2_lnsubcsti3 = value->rValue; - mod->HSM2_lnsubcsti3_Given = TRUE; - break; - case HSM2_MOD_LCGSO: - mod->HSM2_lcgso = value->rValue; - mod->HSM2_lcgso_Given = TRUE; - break; - case HSM2_MOD_LCGDO: - mod->HSM2_lcgdo = value->rValue; - mod->HSM2_lcgdo_Given = TRUE; - break; - case HSM2_MOD_LJS0: - mod->HSM2_ljs0 = value->rValue; - mod->HSM2_ljs0_Given = TRUE; - break; - case HSM2_MOD_LJS0SW: - mod->HSM2_ljs0sw = value->rValue; - mod->HSM2_ljs0sw_Given = TRUE; - break; - case HSM2_MOD_LNJ: - mod->HSM2_lnj = value->rValue; - mod->HSM2_lnj_Given = TRUE; - break; - case HSM2_MOD_LCISBK: - mod->HSM2_lcisbk = value->rValue; - mod->HSM2_lcisbk_Given = TRUE; - break; - case HSM2_MOD_LCLM1: - mod->HSM2_lclm1 = value->rValue; - mod->HSM2_lclm1_Given = TRUE; - break; - case HSM2_MOD_LCLM2: - mod->HSM2_lclm2 = value->rValue; - mod->HSM2_lclm2_Given = TRUE; - break; - case HSM2_MOD_LCLM3: - mod->HSM2_lclm3 = value->rValue; - mod->HSM2_lclm3_Given = TRUE; - break; - case HSM2_MOD_LWFC: - mod->HSM2_lwfc = value->rValue; - mod->HSM2_lwfc_Given = TRUE; - break; - case HSM2_MOD_LGIDL1: - mod->HSM2_lgidl1 = value->rValue; - mod->HSM2_lgidl1_Given = TRUE; - break; - case HSM2_MOD_LGIDL2: - mod->HSM2_lgidl2 = value->rValue; - mod->HSM2_lgidl2_Given = TRUE; - break; - case HSM2_MOD_LGLEAK1: - mod->HSM2_lgleak1 = value->rValue; - mod->HSM2_lgleak1_Given = TRUE; - break; - case HSM2_MOD_LGLEAK2: - mod->HSM2_lgleak2 = value->rValue; - mod->HSM2_lgleak2_Given = TRUE; - break; - case HSM2_MOD_LGLEAK3: - mod->HSM2_lgleak3 = value->rValue; - mod->HSM2_lgleak3_Given = TRUE; - break; - case HSM2_MOD_LGLEAK6: - mod->HSM2_lgleak6 = value->rValue; - mod->HSM2_lgleak6_Given = TRUE; - break; - case HSM2_MOD_LGLKSD1: - mod->HSM2_lglksd1 = value->rValue; - mod->HSM2_lglksd1_Given = TRUE; - break; - case HSM2_MOD_LGLKSD2: - mod->HSM2_lglksd2 = value->rValue; - mod->HSM2_lglksd2_Given = TRUE; - break; - case HSM2_MOD_LGLKB1: - mod->HSM2_lglkb1 = value->rValue; - mod->HSM2_lglkb1_Given = TRUE; - break; - case HSM2_MOD_LGLKB2: - mod->HSM2_lglkb2 = value->rValue; - mod->HSM2_lglkb2_Given = TRUE; - break; - case HSM2_MOD_LNFTRP: - mod->HSM2_lnftrp = value->rValue; - mod->HSM2_lnftrp_Given = TRUE; - break; - case HSM2_MOD_LNFALP: - mod->HSM2_lnfalp = value->rValue; - mod->HSM2_lnfalp_Given = TRUE; - break; - case HSM2_MOD_LVDIFFJ: - mod->HSM2_lvdiffj = value->rValue; - mod->HSM2_lvdiffj_Given = TRUE; - break; - case HSM2_MOD_LIBPC1: - mod->HSM2_libpc1 = value->rValue; - mod->HSM2_libpc1_Given = TRUE; - break; - case HSM2_MOD_LIBPC2: - mod->HSM2_libpc2 = value->rValue; - mod->HSM2_libpc2_Given = TRUE; - break; - - /* Width dependence */ - case HSM2_MOD_WVMAX: - mod->HSM2_wvmax = value->rValue; - mod->HSM2_wvmax_Given = TRUE; - break; - case HSM2_MOD_WBGTMP1: - mod->HSM2_wbgtmp1 = value->rValue; - mod->HSM2_wbgtmp1_Given = TRUE; - break; - case HSM2_MOD_WBGTMP2: - mod->HSM2_wbgtmp2 = value->rValue; - mod->HSM2_wbgtmp2_Given = TRUE; - break; - case HSM2_MOD_WEG0: - mod->HSM2_weg0 = value->rValue; - mod->HSM2_weg0_Given = TRUE; - break; - case HSM2_MOD_WLOVER: - mod->HSM2_wlover = value->rValue; - mod->HSM2_wlover_Given = TRUE; - break; - case HSM2_MOD_WVFBOVER: - mod->HSM2_wvfbover = value->rValue; - mod->HSM2_wvfbover_Given = TRUE; - break; - case HSM2_MOD_WNOVER: - mod->HSM2_wnover = value->rValue; - mod->HSM2_wnover_Given = TRUE; - break; - case HSM2_MOD_WWL2: - mod->HSM2_wwl2 = value->rValue; - mod->HSM2_wwl2_Given = TRUE; - break; - case HSM2_MOD_WVFBC: - mod->HSM2_wvfbc = value->rValue; - mod->HSM2_wvfbc_Given = TRUE; - break; - case HSM2_MOD_WNSUBC: - mod->HSM2_wnsubc = value->rValue; - mod->HSM2_wnsubc_Given = TRUE; - break; - case HSM2_MOD_WNSUBP: - mod->HSM2_wnsubp = value->rValue; - mod->HSM2_wnsubp_Given = TRUE; - break; - case HSM2_MOD_WSCP1: - mod->HSM2_wscp1 = value->rValue; - mod->HSM2_wscp1_Given = TRUE; - break; - case HSM2_MOD_WSCP2: - mod->HSM2_wscp2 = value->rValue; - mod->HSM2_wscp2_Given = TRUE; - break; - case HSM2_MOD_WSCP3: - mod->HSM2_wscp3 = value->rValue; - mod->HSM2_wscp3_Given = TRUE; - break; - case HSM2_MOD_WSC1: - mod->HSM2_wsc1 = value->rValue; - mod->HSM2_wsc1_Given = TRUE; - break; - case HSM2_MOD_WSC2: - mod->HSM2_wsc2 = value->rValue; - mod->HSM2_wsc2_Given = TRUE; - break; - case HSM2_MOD_WSC3: - mod->HSM2_wsc3 = value->rValue; - mod->HSM2_wsc3_Given = TRUE; - break; - case HSM2_MOD_WSC4: - mod->HSM2_wsc4 = value->rValue; - mod->HSM2_wsc4_Given = TRUE; - break; - case HSM2_MOD_WPGD1: - mod->HSM2_wpgd1 = value->rValue; - mod->HSM2_wpgd1_Given = TRUE; - break; -//case HSM2_MOD_WPGD3: -// mod->HSM2_wpgd3 = value->rValue; -// mod->HSM2_wpgd3_Given = TRUE; -// break; - case HSM2_MOD_WNDEP: - mod->HSM2_wndep = value->rValue; - mod->HSM2_wndep_Given = TRUE; - break; - case HSM2_MOD_WNINV: - mod->HSM2_wninv = value->rValue; - mod->HSM2_wninv_Given = TRUE; - break; - case HSM2_MOD_WMUECB0: - mod->HSM2_wmuecb0 = value->rValue; - mod->HSM2_wmuecb0_Given = TRUE; - break; - case HSM2_MOD_WMUECB1: - mod->HSM2_wmuecb1 = value->rValue; - mod->HSM2_wmuecb1_Given = TRUE; - break; - case HSM2_MOD_WMUEPH1: - mod->HSM2_wmueph1 = value->rValue; - mod->HSM2_wmueph1_Given = TRUE; - break; - case HSM2_MOD_WVTMP: - mod->HSM2_wvtmp = value->rValue; - mod->HSM2_wvtmp_Given = TRUE; - break; - case HSM2_MOD_WWVTH0: - mod->HSM2_wwvth0 = value->rValue; - mod->HSM2_wwvth0_Given = TRUE; - break; - case HSM2_MOD_WMUESR1: - mod->HSM2_wmuesr1 = value->rValue; - mod->HSM2_wmuesr1_Given = TRUE; - break; - case HSM2_MOD_WMUETMP: - mod->HSM2_wmuetmp = value->rValue; - mod->HSM2_wmuetmp_Given = TRUE; - break; - case HSM2_MOD_WSUB1: - mod->HSM2_wsub1 = value->rValue; - mod->HSM2_wsub1_Given = TRUE; - break; - case HSM2_MOD_WSUB2: - mod->HSM2_wsub2 = value->rValue; - mod->HSM2_wsub2_Given = TRUE; - break; - case HSM2_MOD_WSVDS: - mod->HSM2_wsvds = value->rValue; - mod->HSM2_wsvds_Given = TRUE; - break; - case HSM2_MOD_WSVBS: - mod->HSM2_wsvbs = value->rValue; - mod->HSM2_wsvbs_Given = TRUE; - break; - case HSM2_MOD_WSVGS: - mod->HSM2_wsvgs = value->rValue; - mod->HSM2_wsvgs_Given = TRUE; - break; - case HSM2_MOD_WNSTI: - mod->HSM2_wnsti = value->rValue; - mod->HSM2_wnsti_Given = TRUE; - break; - case HSM2_MOD_WWSTI: - mod->HSM2_wwsti = value->rValue; - mod->HSM2_wwsti_Given = TRUE; - break; - case HSM2_MOD_WSCSTI1: - mod->HSM2_wscsti1 = value->rValue; - mod->HSM2_wscsti1_Given = TRUE; - break; - case HSM2_MOD_WSCSTI2: - mod->HSM2_wscsti2 = value->rValue; - mod->HSM2_wscsti2_Given = TRUE; - break; - case HSM2_MOD_WVTHSTI: - mod->HSM2_wvthsti = value->rValue; - mod->HSM2_wvthsti_Given = TRUE; - break; - case HSM2_MOD_WMUESTI1: - mod->HSM2_wmuesti1 = value->rValue; - mod->HSM2_wmuesti1_Given = TRUE; - break; - case HSM2_MOD_WMUESTI2: - mod->HSM2_wmuesti2 = value->rValue; - mod->HSM2_wmuesti2_Given = TRUE; - break; - case HSM2_MOD_WMUESTI3: - mod->HSM2_wmuesti3 = value->rValue; - mod->HSM2_wmuesti3_Given = TRUE; - break; - case HSM2_MOD_WNSUBPSTI1: - mod->HSM2_wnsubpsti1 = value->rValue; - mod->HSM2_wnsubpsti1_Given = TRUE; - break; - case HSM2_MOD_WNSUBPSTI2: - mod->HSM2_wnsubpsti2 = value->rValue; - mod->HSM2_wnsubpsti2_Given = TRUE; - break; - case HSM2_MOD_WNSUBPSTI3: - mod->HSM2_wnsubpsti3 = value->rValue; - mod->HSM2_wnsubpsti3_Given = TRUE; - break; - case HSM2_MOD_WNSUBCSTI1: - mod->HSM2_wnsubcsti1 = value->rValue; - mod->HSM2_wnsubcsti1_Given = TRUE; - break; - case HSM2_MOD_WNSUBCSTI2: - mod->HSM2_wnsubcsti2 = value->rValue; - mod->HSM2_wnsubcsti2_Given = TRUE; - break; - case HSM2_MOD_WNSUBCSTI3: - mod->HSM2_wnsubcsti3 = value->rValue; - mod->HSM2_wnsubcsti3_Given = TRUE; - break; - case HSM2_MOD_WCGSO: - mod->HSM2_wcgso = value->rValue; - mod->HSM2_wcgso_Given = TRUE; - break; - case HSM2_MOD_WCGDO: - mod->HSM2_wcgdo = value->rValue; - mod->HSM2_wcgdo_Given = TRUE; - break; - case HSM2_MOD_WJS0: - mod->HSM2_wjs0 = value->rValue; - mod->HSM2_wjs0_Given = TRUE; - break; - case HSM2_MOD_WJS0SW: - mod->HSM2_wjs0sw = value->rValue; - mod->HSM2_wjs0sw_Given = TRUE; - break; - case HSM2_MOD_WNJ: - mod->HSM2_wnj = value->rValue; - mod->HSM2_wnj_Given = TRUE; - break; - case HSM2_MOD_WCISBK: - mod->HSM2_wcisbk = value->rValue; - mod->HSM2_wcisbk_Given = TRUE; - break; - case HSM2_MOD_WCLM1: - mod->HSM2_wclm1 = value->rValue; - mod->HSM2_wclm1_Given = TRUE; - break; - case HSM2_MOD_WCLM2: - mod->HSM2_wclm2 = value->rValue; - mod->HSM2_wclm2_Given = TRUE; - break; - case HSM2_MOD_WCLM3: - mod->HSM2_wclm3 = value->rValue; - mod->HSM2_wclm3_Given = TRUE; - break; - case HSM2_MOD_WWFC: - mod->HSM2_wwfc = value->rValue; - mod->HSM2_wwfc_Given = TRUE; - break; - case HSM2_MOD_WGIDL1: - mod->HSM2_wgidl1 = value->rValue; - mod->HSM2_wgidl1_Given = TRUE; - break; - case HSM2_MOD_WGIDL2: - mod->HSM2_wgidl2 = value->rValue; - mod->HSM2_wgidl2_Given = TRUE; - break; - case HSM2_MOD_WGLEAK1: - mod->HSM2_wgleak1 = value->rValue; - mod->HSM2_wgleak1_Given = TRUE; - break; - case HSM2_MOD_WGLEAK2: - mod->HSM2_wgleak2 = value->rValue; - mod->HSM2_wgleak2_Given = TRUE; - break; - case HSM2_MOD_WGLEAK3: - mod->HSM2_wgleak3 = value->rValue; - mod->HSM2_wgleak3_Given = TRUE; - break; - case HSM2_MOD_WGLEAK6: - mod->HSM2_wgleak6 = value->rValue; - mod->HSM2_wgleak6_Given = TRUE; - break; - case HSM2_MOD_WGLKSD1: - mod->HSM2_wglksd1 = value->rValue; - mod->HSM2_wglksd1_Given = TRUE; - break; - case HSM2_MOD_WGLKSD2: - mod->HSM2_wglksd2 = value->rValue; - mod->HSM2_wglksd2_Given = TRUE; - break; - case HSM2_MOD_WGLKB1: - mod->HSM2_wglkb1 = value->rValue; - mod->HSM2_wglkb1_Given = TRUE; - break; - case HSM2_MOD_WGLKB2: - mod->HSM2_wglkb2 = value->rValue; - mod->HSM2_wglkb2_Given = TRUE; - break; - case HSM2_MOD_WNFTRP: - mod->HSM2_wnftrp = value->rValue; - mod->HSM2_wnftrp_Given = TRUE; - break; - case HSM2_MOD_WNFALP: - mod->HSM2_wnfalp = value->rValue; - mod->HSM2_wnfalp_Given = TRUE; - break; - case HSM2_MOD_WVDIFFJ: - mod->HSM2_wvdiffj = value->rValue; - mod->HSM2_wvdiffj_Given = TRUE; - break; - case HSM2_MOD_WIBPC1: - mod->HSM2_wibpc1 = value->rValue; - mod->HSM2_wibpc1_Given = TRUE; - break; - case HSM2_MOD_WIBPC2: - mod->HSM2_wibpc2 = value->rValue; - mod->HSM2_wibpc2_Given = TRUE; - break; - - /* Cross-term dependence */ - case HSM2_MOD_PVMAX: - mod->HSM2_pvmax = value->rValue; - mod->HSM2_pvmax_Given = TRUE; - break; - case HSM2_MOD_PBGTMP1: - mod->HSM2_pbgtmp1 = value->rValue; - mod->HSM2_pbgtmp1_Given = TRUE; - break; - case HSM2_MOD_PBGTMP2: - mod->HSM2_pbgtmp2 = value->rValue; - mod->HSM2_pbgtmp2_Given = TRUE; - break; - case HSM2_MOD_PEG0: - mod->HSM2_peg0 = value->rValue; - mod->HSM2_peg0_Given = TRUE; - break; - case HSM2_MOD_PLOVER: - mod->HSM2_plover = value->rValue; - mod->HSM2_plover_Given = TRUE; - break; - case HSM2_MOD_PVFBOVER: - mod->HSM2_pvfbover = value->rValue; - mod->HSM2_pvfbover_Given = TRUE; - break; - case HSM2_MOD_PNOVER: - mod->HSM2_pnover = value->rValue; - mod->HSM2_pnover_Given = TRUE; - break; - case HSM2_MOD_PWL2: - mod->HSM2_pwl2 = value->rValue; - mod->HSM2_pwl2_Given = TRUE; - break; - case HSM2_MOD_PVFBC: - mod->HSM2_pvfbc = value->rValue; - mod->HSM2_pvfbc_Given = TRUE; - break; - case HSM2_MOD_PNSUBC: - mod->HSM2_pnsubc = value->rValue; - mod->HSM2_pnsubc_Given = TRUE; - break; - case HSM2_MOD_PNSUBP: - mod->HSM2_pnsubp = value->rValue; - mod->HSM2_pnsubp_Given = TRUE; - break; - case HSM2_MOD_PSCP1: - mod->HSM2_pscp1 = value->rValue; - mod->HSM2_pscp1_Given = TRUE; - break; - case HSM2_MOD_PSCP2: - mod->HSM2_pscp2 = value->rValue; - mod->HSM2_pscp2_Given = TRUE; - break; - case HSM2_MOD_PSCP3: - mod->HSM2_pscp3 = value->rValue; - mod->HSM2_pscp3_Given = TRUE; - break; - case HSM2_MOD_PSC1: - mod->HSM2_psc1 = value->rValue; - mod->HSM2_psc1_Given = TRUE; - break; - case HSM2_MOD_PSC2: - mod->HSM2_psc2 = value->rValue; - mod->HSM2_psc2_Given = TRUE; - break; - case HSM2_MOD_PSC3: - mod->HSM2_psc3 = value->rValue; - mod->HSM2_psc3_Given = TRUE; - break; - case HSM2_MOD_PSC4: - mod->HSM2_psc4 = value->rValue; - mod->HSM2_psc4_Given = TRUE; - break; - case HSM2_MOD_PPGD1: - mod->HSM2_ppgd1 = value->rValue; - mod->HSM2_ppgd1_Given = TRUE; - break; -//case HSM2_MOD_PPGD3: -// mod->HSM2_ppgd3 = value->rValue; -// mod->HSM2_ppgd3_Given = TRUE; -// break; - case HSM2_MOD_PNDEP: - mod->HSM2_pndep = value->rValue; - mod->HSM2_pndep_Given = TRUE; - break; - case HSM2_MOD_PNINV: - mod->HSM2_pninv = value->rValue; - mod->HSM2_pninv_Given = TRUE; - break; - case HSM2_MOD_PMUECB0: - mod->HSM2_pmuecb0 = value->rValue; - mod->HSM2_pmuecb0_Given = TRUE; - break; - case HSM2_MOD_PMUECB1: - mod->HSM2_pmuecb1 = value->rValue; - mod->HSM2_pmuecb1_Given = TRUE; - break; - case HSM2_MOD_PMUEPH1: - mod->HSM2_pmueph1 = value->rValue; - mod->HSM2_pmueph1_Given = TRUE; - break; - case HSM2_MOD_PVTMP: - mod->HSM2_pvtmp = value->rValue; - mod->HSM2_pvtmp_Given = TRUE; - break; - case HSM2_MOD_PWVTH0: - mod->HSM2_pwvth0 = value->rValue; - mod->HSM2_pwvth0_Given = TRUE; - break; - case HSM2_MOD_PMUESR1: - mod->HSM2_pmuesr1 = value->rValue; - mod->HSM2_pmuesr1_Given = TRUE; - break; - case HSM2_MOD_PMUETMP: - mod->HSM2_pmuetmp = value->rValue; - mod->HSM2_pmuetmp_Given = TRUE; - break; - case HSM2_MOD_PSUB1: - mod->HSM2_psub1 = value->rValue; - mod->HSM2_psub1_Given = TRUE; - break; - case HSM2_MOD_PSUB2: - mod->HSM2_psub2 = value->rValue; - mod->HSM2_psub2_Given = TRUE; - break; - case HSM2_MOD_PSVDS: - mod->HSM2_psvds = value->rValue; - mod->HSM2_psvds_Given = TRUE; - break; - case HSM2_MOD_PSVBS: - mod->HSM2_psvbs = value->rValue; - mod->HSM2_psvbs_Given = TRUE; - break; - case HSM2_MOD_PSVGS: - mod->HSM2_psvgs = value->rValue; - mod->HSM2_psvgs_Given = TRUE; - break; - case HSM2_MOD_PNSTI: - mod->HSM2_pnsti = value->rValue; - mod->HSM2_pnsti_Given = TRUE; - break; - case HSM2_MOD_PWSTI: - mod->HSM2_pwsti = value->rValue; - mod->HSM2_pwsti_Given = TRUE; - break; - case HSM2_MOD_PSCSTI1: - mod->HSM2_pscsti1 = value->rValue; - mod->HSM2_pscsti1_Given = TRUE; - break; - case HSM2_MOD_PSCSTI2: - mod->HSM2_pscsti2 = value->rValue; - mod->HSM2_pscsti2_Given = TRUE; - break; - case HSM2_MOD_PVTHSTI: - mod->HSM2_pvthsti = value->rValue; - mod->HSM2_pvthsti_Given = TRUE; - break; - case HSM2_MOD_PMUESTI1: - mod->HSM2_pmuesti1 = value->rValue; - mod->HSM2_pmuesti1_Given = TRUE; - break; - case HSM2_MOD_PMUESTI2: - mod->HSM2_pmuesti2 = value->rValue; - mod->HSM2_pmuesti2_Given = TRUE; - break; - case HSM2_MOD_PMUESTI3: - mod->HSM2_pmuesti3 = value->rValue; - mod->HSM2_pmuesti3_Given = TRUE; - break; - case HSM2_MOD_PNSUBPSTI1: - mod->HSM2_pnsubpsti1 = value->rValue; - mod->HSM2_pnsubpsti1_Given = TRUE; - break; - case HSM2_MOD_PNSUBPSTI2: - mod->HSM2_pnsubpsti2 = value->rValue; - mod->HSM2_pnsubpsti2_Given = TRUE; - break; - case HSM2_MOD_PNSUBPSTI3: - mod->HSM2_pnsubpsti3 = value->rValue; - mod->HSM2_pnsubpsti3_Given = TRUE; - break; - case HSM2_MOD_PNSUBCSTI1: - mod->HSM2_pnsubcsti1 = value->rValue; - mod->HSM2_pnsubcsti1_Given = TRUE; - break; - case HSM2_MOD_PNSUBCSTI2: - mod->HSM2_pnsubcsti2 = value->rValue; - mod->HSM2_pnsubcsti2_Given = TRUE; - break; - case HSM2_MOD_PNSUBCSTI3: - mod->HSM2_pnsubcsti3 = value->rValue; - mod->HSM2_pnsubcsti3_Given = TRUE; - break; - case HSM2_MOD_PCGSO: - mod->HSM2_pcgso = value->rValue; - mod->HSM2_pcgso_Given = TRUE; - break; - case HSM2_MOD_PCGDO: - mod->HSM2_pcgdo = value->rValue; - mod->HSM2_pcgdo_Given = TRUE; - break; - case HSM2_MOD_PJS0: - mod->HSM2_pjs0 = value->rValue; - mod->HSM2_pjs0_Given = TRUE; - break; - case HSM2_MOD_PJS0SW: - mod->HSM2_pjs0sw = value->rValue; - mod->HSM2_pjs0sw_Given = TRUE; - break; - case HSM2_MOD_PNJ: - mod->HSM2_pnj = value->rValue; - mod->HSM2_pnj_Given = TRUE; - break; - case HSM2_MOD_PCISBK: - mod->HSM2_pcisbk = value->rValue; - mod->HSM2_pcisbk_Given = TRUE; - break; - case HSM2_MOD_PCLM1: - mod->HSM2_pclm1 = value->rValue; - mod->HSM2_pclm1_Given = TRUE; - break; - case HSM2_MOD_PCLM2: - mod->HSM2_pclm2 = value->rValue; - mod->HSM2_pclm2_Given = TRUE; - break; - case HSM2_MOD_PCLM3: - mod->HSM2_pclm3 = value->rValue; - mod->HSM2_pclm3_Given = TRUE; - break; - case HSM2_MOD_PWFC: - mod->HSM2_pwfc = value->rValue; - mod->HSM2_pwfc_Given = TRUE; - break; - case HSM2_MOD_PGIDL1: - mod->HSM2_pgidl1 = value->rValue; - mod->HSM2_pgidl1_Given = TRUE; - break; - case HSM2_MOD_PGIDL2: - mod->HSM2_pgidl2 = value->rValue; - mod->HSM2_pgidl2_Given = TRUE; - break; - case HSM2_MOD_PGLEAK1: - mod->HSM2_pgleak1 = value->rValue; - mod->HSM2_pgleak1_Given = TRUE; - break; - case HSM2_MOD_PGLEAK2: - mod->HSM2_pgleak2 = value->rValue; - mod->HSM2_pgleak2_Given = TRUE; - break; - case HSM2_MOD_PGLEAK3: - mod->HSM2_pgleak3 = value->rValue; - mod->HSM2_pgleak3_Given = TRUE; - break; - case HSM2_MOD_PGLEAK6: - mod->HSM2_pgleak6 = value->rValue; - mod->HSM2_pgleak6_Given = TRUE; - break; - case HSM2_MOD_PGLKSD1: - mod->HSM2_pglksd1 = value->rValue; - mod->HSM2_pglksd1_Given = TRUE; - break; - case HSM2_MOD_PGLKSD2: - mod->HSM2_pglksd2 = value->rValue; - mod->HSM2_pglksd2_Given = TRUE; - break; - case HSM2_MOD_PGLKB1: - mod->HSM2_pglkb1 = value->rValue; - mod->HSM2_pglkb1_Given = TRUE; - break; - case HSM2_MOD_PGLKB2: - mod->HSM2_pglkb2 = value->rValue; - mod->HSM2_pglkb2_Given = TRUE; - break; - case HSM2_MOD_PNFTRP: - mod->HSM2_pnftrp = value->rValue; - mod->HSM2_pnftrp_Given = TRUE; - break; - case HSM2_MOD_PNFALP: - mod->HSM2_pnfalp = value->rValue; - mod->HSM2_pnfalp_Given = TRUE; - break; - case HSM2_MOD_PVDIFFJ: - mod->HSM2_pvdiffj = value->rValue; - mod->HSM2_pvdiffj_Given = TRUE; - break; - case HSM2_MOD_PIBPC1: - mod->HSM2_pibpc1 = value->rValue; - mod->HSM2_pibpc1_Given = TRUE; - break; - case HSM2_MOD_PIBPC2: - mod->HSM2_pibpc2 = value->rValue; - mod->HSM2_pibpc2_Given = TRUE; - break; - - case HSM2_MOD_VGS_MAX: - mod->HSM2vgsMax = value->rValue; - mod->HSM2vgsMaxGiven = TRUE; - break; - case HSM2_MOD_VGD_MAX: - mod->HSM2vgdMax = value->rValue; - mod->HSM2vgdMaxGiven = TRUE; - break; - case HSM2_MOD_VGB_MAX: - mod->HSM2vgbMax = value->rValue; - mod->HSM2vgbMaxGiven = TRUE; - break; - case HSM2_MOD_VDS_MAX: - mod->HSM2vdsMax = value->rValue; - mod->HSM2vdsMaxGiven = TRUE; - break; - case HSM2_MOD_VBS_MAX: - mod->HSM2vbsMax = value->rValue; - mod->HSM2vbsMaxGiven = TRUE; - break; - case HSM2_MOD_VBD_MAX: - mod->HSM2vbdMax = value->rValue; - mod->HSM2vbdMaxGiven = TRUE; - break; - case HSM2_MOD_VGSR_MAX: - mod->HSM2vgsrMax = value->rValue; - mod->HSM2vgsrMaxGiven = TRUE; - break; - case HSM2_MOD_VGDR_MAX: - mod->HSM2vgdrMax = value->rValue; - mod->HSM2vgdrMaxGiven = TRUE; - break; - case HSM2_MOD_VGBR_MAX: - mod->HSM2vgbrMax = value->rValue; - mod->HSM2vgbrMaxGiven = TRUE; - break; - case HSM2_MOD_VBSR_MAX: - mod->HSM2vbsrMax = value->rValue; - mod->HSM2vbsrMaxGiven = TRUE; - break; - case HSM2_MOD_VBDR_MAX: - mod->HSM2vbdrMax = value->rValue; - mod->HSM2vbdrMaxGiven = TRUE; - break; - - default: - return(E_BADPARM); - } - return(OK); -} - diff --git a/src/spicelib/devices/hisim2/hsm2noi.c b/src/spicelib/devices/hisim2/hsm2noi.c deleted file mode 100644 index dff810e4b..000000000 --- a/src/spicelib/devices/hisim2/hsm2noi.c +++ /dev/null @@ -1,340 +0,0 @@ -/*********************************************************************** - - HiSIM (Hiroshima University STARC IGFET Model) - Copyright (C) 2014 Hiroshima University & STARC - - MODEL NAME : HiSIM - ( VERSION : 2 SUBVERSION : 8 REVISION : 0 ) - - FILE : hsm2noi.c - - Date : 2014.6.5 - - released by - Hiroshima University & - Semiconductor Technology Academic Research Center (STARC) -***********************************************************************/ - -/********************************************************************** - -The following source code, and all copyrights, trade secrets or other -intellectual property rights in and to the source code in its entirety, -is owned by the Hiroshima University and the STARC organization. - -All users need to follow the "HiSIM2 Distribution Statement and -Copyright Notice" attached to HiSIM2 model. - ------HiSIM2 Distribution Statement and Copyright Notice-------------- - -Software is distributed as is, completely without warranty or service -support. Hiroshima University or STARC and its employees are not liable -for the condition or performance of the software. - -Hiroshima University and STARC own the copyright and grant users a perpetual, -irrevocable, worldwide, non-exclusive, royalty-free license with respect -to the software as set forth below. - -Hiroshima University and STARC hereby disclaim all implied warranties. - -Hiroshima University and STARC grant the users the right to modify, copy, -and redistribute the software and documentation, both within the user's -organization and externally, subject to the following restrictions - -1. The users agree not to charge for Hiroshima University and STARC code -itself but may charge for additions, extensions, or support. - -2. In any product based on the software, the users agree to acknowledge -Hiroshima University and STARC that developed the software. This -acknowledgment shall appear in the product documentation. - -3. The users agree to reproduce any copyright notice which appears on -the software on any copy or modification of such made available -to others." - - -*************************************************************************/ - -#include "ngspice/ngspice.h" -#include "hsm2def.h" -#include "ngspice/cktdefs.h" -#include "ngspice/iferrmsg.h" -#include "ngspice/noisedef.h" -#include "ngspice/suffix.h" -#include "ngspice/const.h" /* jwan */ - -/* - * HSM2noise (mode, operation, firstModel, ckt, data, OnDens) - * This routine names and evaluates all of the noise sources - * associated with MOSFET's. It starts with the model *firstModel and - * traverses all of its insts. It then proceeds to any other models - * on the linked list. The total output noise density generated by - * all of the MOSFET's is summed with the variable "OnDens". - */ - -int HSM2noise ( - int mode, int operation, - GENmodel *inModel, - CKTcircuit *ckt, - Ndata *data, - double *OnDens) -{ - HSM2model *model = (HSM2model *)inModel; - HSM2instance *here; - double tempOnoise; - double tempInoise; - double noizDens[HSM2NSRCS]; - double lnNdens[HSM2NSRCS]; - int i; - double G = 0.0 ; - double TTEMP = 0.0 ; - - /* for induced gate noise calculation: */ - double omega = ckt->CKTomega; - double sid, ci, sigrat, Qdrat; - double realXds, imagXds, realXgs, imagXgs ; - - /* define the names of the noise sources */ - static char * HSM2nNames[HSM2NSRCS] = { - /* Note that we have to keep the order - consistent with the index definitions - in hsm2defs.h */ - ".rd", /* noise due to rd */ - ".rs", /* noise due to rs */ - ".id", /* noise due to id */ - ".1ovf", /* flicker (1/f) noise */ - ".igs", /* shot noise due to Igs */ - ".igd", /* shot noise due to Igd */ - ".igb", /* shot noise due to Igb */ - ".ign", /* induced gate noise component at the drain node */ - "" /* total transistor noise */ - }; - - for ( ;model != NULL; model = HSM2nextModel(model)) { - for ( here = HSM2instances(model); here != NULL; - here = HSM2nextInstance(here)) { - switch (operation) { - case N_OPEN: - /* see if we have to to produce a summary report */ - /* if so, name all the noise generators */ - - if (((NOISEAN*)ckt->CKTcurJob)->NStpsSm != 0) { - switch (mode) { - case N_DENS: - for ( i = 0; i < HSM2NSRCS; i++ ) { - NOISE_ADD_OUTVAR(ckt, data, "onoise.%s%s", here->HSM2name, HSM2nNames[i]); - } - break; - case INT_NOIZ: - for ( i = 0; i < HSM2NSRCS; i++ ) { - NOISE_ADD_OUTVAR(ckt, data, "onoise_total.%s%s", here->HSM2name, HSM2nNames[i]); - NOISE_ADD_OUTVAR(ckt, data, "inoise_total.%s%s", here->HSM2name, HSM2nNames[i]); - } - break; - } - } - break; - case N_CALC: - switch (mode) { - case N_DENS: - - /* temperature */ - TTEMP = ckt->CKTtemp ; - if ( here->HSM2_temp_Given ) TTEMP = here->HSM2_ktemp ; - if ( here->HSM2_dtemp_Given ) { - TTEMP = TTEMP + here->HSM2_dtemp ; - } - - /* rs/rd thermal noise */ - if ( model->HSM2_corsrd < 0 ) { - NevalSrc(&noizDens[HSM2RDNOIZ], NULL, - ckt, N_GAIN, - here->HSM2dNodePrime, here->HSM2dNode, - 0.0); - noizDens[HSM2RDNOIZ] *= 4 * CONSTboltz * TTEMP * here->HSM2drainConductance ; - lnNdens[HSM2RDNOIZ] = log( MAX(noizDens[HSM2RDNOIZ],N_MINLOG) ) ; - - NevalSrc(&noizDens[HSM2RSNOIZ], NULL, - ckt, N_GAIN, - here->HSM2sNodePrime, here->HSM2sNode, - 0.0); - noizDens[HSM2RSNOIZ] *= 4 * CONSTboltz * TTEMP * here->HSM2sourceConductance ; - lnNdens[HSM2RSNOIZ] = log( MAX(noizDens[HSM2RSNOIZ],N_MINLOG) ) ; - - /* - NevalSrc(&noizDens[HSM2RDNOIZ], &lnNdens[HSM2RDNOIZ], - ckt, THERMNOISE, - here->HSM2dNodePrime, here->HSM2dNode, - here->HSM2_weff / model->HSM2_rsh); - - NevalSrc(&noizDens[HSM2RSNOIZ], &lnNdens[HSM2RSNOIZ], - ckt, THERMNOISE, - here->HSM2sNodePrime, here->HSM2sNode, - here->HSM2_weff / model->HSM2_rsh); - */ - } else { - noizDens[HSM2RDNOIZ] = 0e0 ; - lnNdens[HSM2RDNOIZ] = N_MINLOG ; - noizDens[HSM2RSNOIZ] = 0e0 ; - lnNdens[HSM2RSNOIZ] = N_MINLOG ; - } - - /* channel thermal noise */ - switch( model->HSM2_noise ) { - case 1: - /* HiSIM2 model */ - if ( model->HSM2_corsrd <= 0 || here->HSM2internalGd <= 0.0 ) { - G = here->HSM2_noithrml ; - } else { - if ( here->HSM2_noithrml * here->HSM2internalGd * here->HSM2internalGs > 0.0 ) { - G = here->HSM2_noithrml * here->HSM2internalGd * here->HSM2internalGs - / ( here->HSM2_noithrml * here->HSM2internalGd - + here->HSM2internalGd * here->HSM2internalGs - + here->HSM2_noithrml * here->HSM2internalGs ); - } else { - G = 0.0; - } - } - NevalSrc(&noizDens[HSM2IDNOIZ], NULL, - ckt, N_GAIN, - here->HSM2dNodePrime, here->HSM2sNodePrime, - 0.0); - noizDens[HSM2IDNOIZ] *= 4 * CONSTboltz * TTEMP * G ; - lnNdens[HSM2IDNOIZ] = log( MAX(noizDens[HSM2IDNOIZ],N_MINLOG) ); - break; - } - - /* flicker noise */ - NevalSrc(&noizDens[HSM2FLNOIZ], NULL, - ckt, N_GAIN, - here->HSM2dNodePrime, here->HSM2sNodePrime, - 0.0); - switch ( model->HSM2_noise ) { - case 1: - /* HiSIM model */ - noizDens[HSM2FLNOIZ] *= here->HSM2_noiflick / pow(data->freq, model->HSM2_falph) ; - break; - } - lnNdens[HSM2FLNOIZ] = log(MAX(noizDens[HSM2FLNOIZ], N_MINLOG)); - - /* shot noise */ - NevalSrc(&noizDens[HSM2IGSNOIZ], - &lnNdens[HSM2IGSNOIZ], ckt, SHOTNOISE, - here->HSM2gNodePrime, here->HSM2sNodePrime, - here->HSM2_igs); - NevalSrc(&noizDens[HSM2IGDNOIZ], - &lnNdens[HSM2IGDNOIZ], ckt, SHOTNOISE, - here->HSM2gNodePrime, here->HSM2dNodePrime, - here->HSM2_igd); - NevalSrc(&noizDens[HSM2IGBNOIZ], - &lnNdens[HSM2IGBNOIZ], ckt, SHOTNOISE, - here->HSM2gNodePrime, here->HSM2bNodePrime, - here->HSM2_igb); - - /* induced gate noise */ - switch ( model->HSM2_noise ) { - case 1: - /* HiSIM model */ - sid = 4.0 * CONSTboltz * TTEMP * here->HSM2_noithrml ; - ci = here->HSM2_noicross ; - sigrat = (sid > 0.0 && here->HSM2_noiigate > 0.0) ? sqrt(here->HSM2_noiigate/sid) : 0.0 ; - Qdrat = here->HSM2_Qdrat ; - - realXds = *(ckt->CKTrhs +here->HSM2dNodePrime) - *(ckt->CKTrhs +here->HSM2sNodePrime); - imagXds = *(ckt->CKTirhs+here->HSM2dNodePrime) - *(ckt->CKTirhs+here->HSM2sNodePrime); - realXgs = *(ckt->CKTrhs +here->HSM2gNodePrime) - *(ckt->CKTrhs +here->HSM2sNodePrime); - imagXgs = *(ckt->CKTirhs+here->HSM2gNodePrime) - *(ckt->CKTirhs+here->HSM2sNodePrime); - - noizDens[HSM2IGNOIZ] = 2.0 * omega * ci * sigrat * sid * ( realXgs*imagXds - realXds*imagXgs ) - + omega*omega * sigrat*sigrat * sid * ( (realXgs-Qdrat*realXds) * (realXgs-Qdrat*realXds) - +(imagXgs-Qdrat*imagXds) * (imagXgs-Qdrat*imagXds) ) ; - lnNdens[HSM2IGNOIZ] = log(MAX(noizDens[HSM2IGNOIZ], N_MINLOG)); - break; - } - - /* total */ - noizDens[HSM2TOTNOIZ] = noizDens[HSM2RDNOIZ] + noizDens[HSM2RSNOIZ] - + noizDens[HSM2IDNOIZ] + noizDens[HSM2FLNOIZ] - + noizDens[HSM2IGSNOIZ] + noizDens[HSM2IGDNOIZ] + noizDens[HSM2IGBNOIZ] - + noizDens[HSM2IGNOIZ]; - lnNdens[HSM2TOTNOIZ] = log(MAX(noizDens[HSM2TOTNOIZ], N_MINLOG)); -/* printf("f %e Sid %.16e Srd %.16e Srs %.16e Sflick %.16e Stherm %.16e Sign %.16e\n", */ -/* data->freq,noizDens[HSM2TOTNOIZ],noizDens[HSM2RDNOIZ],noizDens[HSM2RSNOIZ],noizDens[HSM2FLNOIZ],noizDens[HSM2IDNOIZ],noizDens[HSM2IGNOIZ]); */ - - *OnDens += noizDens[HSM2TOTNOIZ]; - - if ( data->delFreq == 0.0 ) { - /* if we haven't done any previous - integration, we need to initialize our - "history" variables. - */ - - for ( i = 0; i < HSM2NSRCS; i++ ) - here->HSM2nVar[LNLSTDENS][i] = lnNdens[i]; - - /* clear out our integration variables - if it's the first pass - */ - if (data->freq == ((NOISEAN*) ckt->CKTcurJob)->NstartFreq) { - for (i = 0; i < HSM2NSRCS; i++) { - here->HSM2nVar[OUTNOIZ][i] = 0.0; - here->HSM2nVar[INNOIZ][i] = 0.0; - } - } - } - else { - /* data->delFreq != 0.0, - we have to integrate. - */ - for ( i = 0; i < HSM2NSRCS; i++ ) { - if ( i != HSM2TOTNOIZ ) { - tempOnoise = - Nintegrate(noizDens[i], lnNdens[i], - here->HSM2nVar[LNLSTDENS][i], data); - tempInoise = - Nintegrate(noizDens[i] * data->GainSqInv, - lnNdens[i] + data->lnGainInv, - here->HSM2nVar[LNLSTDENS][i] + data->lnGainInv, - data); - here->HSM2nVar[LNLSTDENS][i] = lnNdens[i]; - data->outNoiz += tempOnoise; - data->inNoise += tempInoise; - if ( ((NOISEAN*)ckt->CKTcurJob)->NStpsSm != 0 ) { - here->HSM2nVar[OUTNOIZ][i] += tempOnoise; - here->HSM2nVar[OUTNOIZ][HSM2TOTNOIZ] += tempOnoise; - here->HSM2nVar[INNOIZ][i] += tempInoise; - here->HSM2nVar[INNOIZ][HSM2TOTNOIZ] += tempInoise; - } - } - } - } - if ( data->prtSummary ) { - for (i = 0; i < HSM2NSRCS; i++) { - /* print a summary report */ - data->outpVector[data->outNumber++] = noizDens[i]; - } - } - break; - case INT_NOIZ: - /* already calculated, just output */ - if ( ((NOISEAN*)ckt->CKTcurJob)->NStpsSm != 0 ) { - for ( i = 0; i < HSM2NSRCS; i++ ) { - data->outpVector[data->outNumber++] = here->HSM2nVar[OUTNOIZ][i]; - data->outpVector[data->outNumber++] = here->HSM2nVar[INNOIZ][i]; - } - } - break; - } - break; - case N_CLOSE: - /* do nothing, the main calling routine will close */ - return (OK); - break; /* the plots */ - } /* switch (operation) */ - } /* for here */ - } /* for model */ - - return(OK); -} - - - diff --git a/src/spicelib/devices/hisim2/hsm2par.c b/src/spicelib/devices/hisim2/hsm2par.c deleted file mode 100644 index 62ae8cbee..000000000 --- a/src/spicelib/devices/hisim2/hsm2par.c +++ /dev/null @@ -1,245 +0,0 @@ -/*********************************************************************** - - HiSIM (Hiroshima University STARC IGFET Model) - Copyright (C) 2014 Hiroshima University & STARC - - MODEL NAME : HiSIM - ( VERSION : 2 SUBVERSION : 8 REVISION : 0 ) - - FILE : hsm2par.c - - Date : 2014.6.5 - - released by - Hiroshima University & - Semiconductor Technology Academic Research Center (STARC) -***********************************************************************/ - -/********************************************************************** - -The following source code, and all copyrights, trade secrets or other -intellectual property rights in and to the source code in its entirety, -is owned by the Hiroshima University and the STARC organization. - -All users need to follow the "HiSIM2 Distribution Statement and -Copyright Notice" attached to HiSIM2 model. - ------HiSIM2 Distribution Statement and Copyright Notice-------------- - -Software is distributed as is, completely without warranty or service -support. Hiroshima University or STARC and its employees are not liable -for the condition or performance of the software. - -Hiroshima University and STARC own the copyright and grant users a perpetual, -irrevocable, worldwide, non-exclusive, royalty-free license with respect -to the software as set forth below. - -Hiroshima University and STARC hereby disclaim all implied warranties. - -Hiroshima University and STARC grant the users the right to modify, copy, -and redistribute the software and documentation, both within the user's -organization and externally, subject to the following restrictions - -1. The users agree not to charge for Hiroshima University and STARC code -itself but may charge for additions, extensions, or support. - -2. In any product based on the software, the users agree to acknowledge -Hiroshima University and STARC that developed the software. This -acknowledgment shall appear in the product documentation. - -3. The users agree to reproduce any copyright notice which appears on -the software on any copy or modification of such made available -to others." - - -*************************************************************************/ - -#include "ngspice/ngspice.h" -#include "ngspice/ifsim.h" -#include "hsm2def.h" -#include "ngspice/sperror.h" -#include "ngspice/suffix.h" -#include "ngspice/fteext.h" - -int HSM2param( - int param, - IFvalue *value, - GENinstance *inst, - IFvalue *select) -{ - double scale; - - HSM2instance *here = (HSM2instance*)inst; - - NG_IGNORE(select); - - if (!cp_getvar("scale", CP_REAL, &scale, 0)) - scale = 1; - - switch (param) { - case HSM2_W: - here->HSM2_w = value->rValue * scale; - here->HSM2_w_Given = TRUE; - break; - case HSM2_L: - here->HSM2_l = value->rValue * scale; - here->HSM2_l_Given = TRUE; - break; - case HSM2_AS: - here->HSM2_as = value->rValue * scale * scale; - here->HSM2_as_Given = TRUE; - break; - case HSM2_AD: - here->HSM2_ad = value->rValue * scale * scale; - here->HSM2_ad_Given = TRUE; - break; - case HSM2_PS: - here->HSM2_ps = value->rValue * scale; - here->HSM2_ps_Given = TRUE; - break; - case HSM2_PD: - here->HSM2_pd = value->rValue * scale; - here->HSM2_pd_Given = TRUE; - break; - case HSM2_NRS: - here->HSM2_nrs = value->rValue; - here->HSM2_nrs_Given = TRUE; - break; - case HSM2_NRD: - here->HSM2_nrd = value->rValue; - here->HSM2_nrd_Given = TRUE; - break; - case HSM2_TEMP: - here->HSM2_temp = value->rValue; - here->HSM2_temp_Given = TRUE; - break; - case HSM2_DTEMP: - here->HSM2_dtemp = value->rValue; - here->HSM2_dtemp_Given = TRUE; - break; - case HSM2_OFF: - here->HSM2_off = value->iValue; - break; - case HSM2_IC_VBS: - here->HSM2_icVBS = value->rValue; - here->HSM2_icVBS_Given = TRUE; - break; - case HSM2_IC_VDS: - here->HSM2_icVDS = value->rValue; - here->HSM2_icVDS_Given = TRUE; - break; - case HSM2_IC_VGS: - here->HSM2_icVGS = value->rValue; - here->HSM2_icVGS_Given = TRUE; - break; - case HSM2_IC: - /* FALLTHROUGH added to suppress GCC warning due to - * -Wimplicit-fallthrough flag */ - switch (value->v.numValue) { - case 3: - here->HSM2_icVBS = *(value->v.vec.rVec + 2); - here->HSM2_icVBS_Given = TRUE; - /* FALLTHROUGH */ - case 2: - here->HSM2_icVGS = *(value->v.vec.rVec + 1); - here->HSM2_icVGS_Given = TRUE; - /* FALLTHROUGH */ - case 1: - here->HSM2_icVDS = *(value->v.vec.rVec); - here->HSM2_icVDS_Given = TRUE; - break; - default: - return(E_BADPARM); - } - break; - case HSM2_CORBNET: - here->HSM2_corbnet = value->iValue; - here->HSM2_corbnet_Given = TRUE; - break; - case HSM2_RBPB: - here->HSM2_rbpb = value->rValue; - here->HSM2_rbpb_Given = TRUE; - break; - case HSM2_RBPD: - here->HSM2_rbpd = value->rValue; - here->HSM2_rbpd_Given = TRUE; - break; - case HSM2_RBPS: - here->HSM2_rbps = value->rValue; - here->HSM2_rbps_Given = TRUE; - break; - case HSM2_RBDB: - here->HSM2_rbdb = value->rValue; - here->HSM2_rbdb_Given = TRUE; - break; - case HSM2_RBSB: - here->HSM2_rbsb = value->rValue; - here->HSM2_rbsb_Given = TRUE; - break; - case HSM2_CORG: - here->HSM2_corg = value->iValue; - here->HSM2_corg_Given = TRUE; - break; -/* case HSM2_RSHG: */ -/* here->HSM2_rshg = value->rValue; */ -/* here->HSM2_rshg_Given = TRUE; */ -/* break; */ - case HSM2_NGCON: - here->HSM2_ngcon = value->rValue; - here->HSM2_ngcon_Given = TRUE; - break; - case HSM2_XGW: - here->HSM2_xgw = value->rValue; - here->HSM2_xgw_Given = TRUE; - break; - case HSM2_XGL: - here->HSM2_xgl = value->rValue; - here->HSM2_xgl_Given = TRUE; - break; - case HSM2_NF: - here->HSM2_nf = value->rValue; - here->HSM2_nf_Given = TRUE; - break; - case HSM2_SA: - here->HSM2_sa = value->rValue; - here->HSM2_sa_Given = TRUE; - break; - case HSM2_SB: - here->HSM2_sb = value->rValue; - here->HSM2_sb_Given = TRUE; - break; - case HSM2_SD: - here->HSM2_sd = value->rValue; - here->HSM2_sd_Given = TRUE; - break; - case HSM2_NSUBCDFM: - here->HSM2_nsubcdfm = value->rValue; - here->HSM2_nsubcdfm_Given = TRUE; - break; - case HSM2_MPHDFM: - here->HSM2_mphdfm = value->rValue; - here->HSM2_mphdfm_Given = TRUE; - break; - case HSM2_M: - here->HSM2_m = value->rValue; - here->HSM2_m_Given = TRUE; - break; - -/* WPE */ - case HSM2_SCA: - here->HSM2_sca = value->rValue; - here->HSM2_sca_Given = TRUE; - break; - case HSM2_SCB: - here->HSM2_scb = value->rValue; - here->HSM2_scb_Given = TRUE; - break; - case HSM2_SCC: - here->HSM2_scc= value->rValue; - here->HSM2_scc_Given = TRUE; - break; - default: - return(E_BADPARM); - } - return(OK); -} diff --git a/src/spicelib/devices/hisim2/hsm2pzld.c b/src/spicelib/devices/hisim2/hsm2pzld.c deleted file mode 100644 index 2ae6886f7..000000000 --- a/src/spicelib/devices/hisim2/hsm2pzld.c +++ /dev/null @@ -1,367 +0,0 @@ -/*********************************************************************** - - HiSIM (Hiroshima University STARC IGFET Model) - Copyright (C) 2014 Hiroshima University & STARC - - MODEL NAME : HiSIM - ( VERSION : 2 SUBVERSION : 8 REVISION : 0 ) - - FILE : hsm2pzld.c - - Date : 2014.6.5 - - released by - Hiroshima University & - Semiconductor Technology Academic Research Center (STARC) -***********************************************************************/ - -#include "ngspice/ngspice.h" -#include "ngspice/cktdefs.h" -#include "ngspice/complex.h" -#include "ngspice/sperror.h" -#include "hsm2def.h" -#include "ngspice/suffix.h" - -int HSM2pzLoad( - GENmodel *inModel, - CKTcircuit *ckt, - SPcomplex *s) -{ - HSM2model *model = (HSM2model*)inModel; - HSM2instance *here; - double xcggb, xcgdb, xcgsb, xcgbb, xcbgb, xcbdb, xcbsb, xcbbb; - double xcdgb, xcddb, xcdsb, xcdbb, xcsgb, xcsdb, xcssb, xcsbb; - double xcdbdb = 0.0, xcsbsb = 0.0; - double gdpr, gspr, gds, gbd, gbs, capbd, capbs, FwdSum, RevSum, gm, gmbs; - double gjbd, gjbs, grg; - double cggb, cgdb, cgsb, cbgb, cbdb, cbsb, cddb, cdgb, cdsb; - double gbspsp, gbbdp, gbbsp, gbspg, gbspb; - double gbspdp, gbdpdp, gbdpg, gbdpb, gbdpsp; - double gIbtotg, gIbtotd, gIbtots, gIbtotb; - double gIgtotg, gIgtotd, gIgtots, gIgtotb; - double gIdtotg, gIdtotd, gIdtots, gIdtotb; - double gIstotg, gIstotd, gIstots, gIstotb; - - NG_IGNORE(ckt); - - for ( ;model != NULL ;model = HSM2nextModel(model)) { - for ( here = HSM2instances(model);here!= NULL ; - here = HSM2nextInstance(here)) { - if ( here->HSM2_mode >= 0 ) { - gm = here->HSM2_gm; - gmbs = here->HSM2_gmbs; - FwdSum = gm + gmbs; - RevSum = 0.0; - - gbbdp = -here->HSM2_gbds; - gbbsp = here->HSM2_gbds + here->HSM2_gbgs + here->HSM2_gbbs; - - gbdpg = here->HSM2_gbgs; - gbdpdp = here->HSM2_gbds; - gbdpb = here->HSM2_gbbs; - gbdpsp = -(gbdpg + gbdpdp + gbdpb); - - gbspg = 0.0; - gbspdp = 0.0; - gbspb = 0.0; - gbspsp = 0.0; - - if (model->HSM2_coiigs) { - gIbtotg = here->HSM2_gigbg; - gIbtotd = here->HSM2_gigbd; - gIbtots = here->HSM2_gigbs; - gIbtotb = here->HSM2_gigbb; - - gIstotg = here->HSM2_gigsg; - gIstotd = here->HSM2_gigsd; - gIstots = here->HSM2_gigss; - gIstotb = here->HSM2_gigsb; - - gIdtotg = here->HSM2_gigdg; - gIdtotd = here->HSM2_gigdd; - gIdtots = here->HSM2_gigds; - gIdtotb = here->HSM2_gigdb; - - } - else { - gIbtotg = gIbtotd = gIbtots = gIbtotb = 0.0; - gIstotg = gIstotd = gIstots = gIstotb = 0.0; - gIdtotg = gIdtotd = gIdtots = gIdtotb = 0.0; - } - - if (model->HSM2_coiigs) { - gIgtotg = gIbtotg + gIstotg + gIdtotg; - gIgtotd = gIbtotd + gIstotd + gIdtotd; - gIgtots = gIbtots + gIstots + gIdtots; - gIgtotb = gIbtotb + gIstotb + gIdtotb; - } - else - gIgtotg = gIgtotd = gIgtots = gIgtotb = 0.0; - - cggb = here->HSM2_cggb; - cgsb = here->HSM2_cgsb; - cgdb = here->HSM2_cgdb; - - cbgb = here->HSM2_cbgb; - cbsb = here->HSM2_cbsb; - cbdb = here->HSM2_cbdb; - - cdgb = here->HSM2_cdgb; - cdsb = here->HSM2_cdsb; - cddb = here->HSM2_cddb; - - } - else { - gm = -here->HSM2_gm; - gmbs = -here->HSM2_gmbs; - FwdSum = 0.0; - RevSum = -(gm + gmbs); - - gbbsp = -here->HSM2_gbds; - gbbdp = here->HSM2_gbds + here->HSM2_gbgs + here->HSM2_gbbs; - - gbdpg = 0.0; - gbdpsp = 0.0; - gbdpb = 0.0; - gbdpdp = 0.0; - - if (model->HSM2_coiigs) { - gIbtotg = here->HSM2_gigbg; - gIbtotd = here->HSM2_gigbd; - gIbtots = here->HSM2_gigbs; - gIbtotb = here->HSM2_gigbb; - - gIstotg = here->HSM2_gigsg; - gIstotd = here->HSM2_gigsd; - gIstots = here->HSM2_gigss; - gIstotb = here->HSM2_gigsb; - - gIdtotg = here->HSM2_gigdg; - gIdtotd = here->HSM2_gigdd; - gIdtots = here->HSM2_gigds; - gIdtotb = here->HSM2_gigdb; - } - else { - gIbtotg = gIbtotd = gIbtots = gIbtotb = 0.0; - gIstotg = gIstotd = gIstots = gIstotb = 0.0; - gIdtotg = gIdtotd = gIdtots = gIdtotb = 0.0; - } - - if (model->HSM2_coiigs) { - gIgtotg = gIbtotg + gIstotg + gIdtotg; - gIgtotd = gIbtotd + gIstotd + gIdtotd; - gIgtots = gIbtots + gIstots + gIdtots; - gIgtotb = gIbtotb + gIstotb + gIdtotb; - } - else - gIgtotg = gIgtotd = gIgtots = gIgtotb = 0.0; - - gbspg = here->HSM2_gbgs; - gbspsp = here->HSM2_gbds; - gbspb = here->HSM2_gbbs; - gbspdp = -(gbspg + gbspsp + gbspb); - - cggb = here->HSM2_cggb; - cgsb = here->HSM2_cgdb; - cgdb = here->HSM2_cgsb; - - cbgb = here->HSM2_cbgb; - cbsb = here->HSM2_cbdb; - cbdb = here->HSM2_cbsb; - - cdgb = -(here->HSM2_cdgb + cggb + cbgb); - cdsb = -(here->HSM2_cddb + cgsb + cbsb); - cddb = -(here->HSM2_cdsb + cgdb + cbdb); - } - - gdpr = here->HSM2drainConductance; - gspr = here->HSM2sourceConductance; - gds = here->HSM2_gds; - gbd = here->HSM2_gbd; - gbs = here->HSM2_gbs; - capbd = here->HSM2_capbd; - capbs = here->HSM2_capbs; - - xcdgb = cdgb; - xcddb = cddb + capbd; - xcdsb = cdsb; - xcdbb = -(xcdgb + xcddb + xcdsb); - if (here->HSM2_corbnet == 1) xcdbb += capbd; - - xcsgb = -(cggb + cbgb + cdgb); - xcsdb = -(cgdb + cbdb + cddb); - xcssb = capbs - (cgsb + cbsb + cdsb); - xcsbb = -(xcsgb + xcsdb + xcssb); - if (here->HSM2_corbnet == 1) xcsbb += capbs; - - xcggb = cggb; - xcgdb = cgdb; - xcgsb = cgsb; - xcgbb = -(xcggb + xcgdb + xcgsb); - - xcbgb = cbgb; - if (!here->HSM2_corbnet) { - xcbdb = cbdb - capbd; - xcbsb = cbsb - capbs; - } else { - xcbdb = cbdb; - xcbsb = cbsb; - xcdbdb = - capbd; - xcsbsb = - capbs; - } - xcbbb = -(xcbgb + xcbdb + xcbsb); - - if (!here->HSM2_corbnet) { - gjbd = gbd; - gjbs = gbs; - } else - gjbd = gjbs = 0.0; - - if (here->HSM2_corg == 1) { - grg = here->HSM2_grg; - *(here->HSM2GgPtr) += grg; - *(here->HSM2GPgPtr) -= grg; - *(here->HSM2GgpPtr) -= grg; - - *(here->HSM2GPdpPtr ) += xcgdb * s->real; - *(here->HSM2GPdpPtr +1) += xcgdb * s->imag; - *(here->HSM2GPdpPtr) += grg + gIgtotd; - *(here->HSM2GPgpPtr ) += xcggb * s->real; - *(here->HSM2GPgpPtr +1) += xcggb * s->imag; - *(here->HSM2GPgpPtr) += gIgtotg; - *(here->HSM2GPspPtr ) += xcgsb * s->real; - *(here->HSM2GPspPtr +1) += xcgsb * s->imag; - *(here->HSM2GPspPtr) += gIgtots; - *(here->HSM2GPbpPtr ) += xcgbb * s->real; - *(here->HSM2GPbpPtr +1) += xcgbb * s->imag; - *(here->HSM2GPbpPtr) += gIgtotb; - - } else { - *(here->HSM2GPdpPtr ) += xcgdb * s->real; - *(here->HSM2GPdpPtr +1) += xcgdb * s->imag; - *(here->HSM2GPdpPtr) += gIgtotd; - *(here->HSM2GPgpPtr ) += xcggb * s->real; - *(here->HSM2GPgpPtr +1) += xcggb * s->imag; - *(here->HSM2GPgpPtr) += gIgtotg; - *(here->HSM2GPspPtr ) += xcgsb * s->real; - *(here->HSM2GPspPtr +1) += xcgsb * s->imag; - *(here->HSM2GPspPtr) += gIgtots; - *(here->HSM2GPbpPtr ) += xcgbb * s->real; - *(here->HSM2GPbpPtr +1) += xcgbb * s->imag; - *(here->HSM2GPbpPtr) += gIgtotb; - } - - *(here->HSM2DPdpPtr ) += xcddb * s->real; - *(here->HSM2DPdpPtr +1) += xcddb * s->imag; - *(here->HSM2DPdpPtr) += gdpr + gds + gbd + RevSum + gbdpdp - gIdtotd; - *(here->HSM2DPdPtr) -= gdpr; - *(here->HSM2DPgpPtr ) += xcdgb * s->real; - *(here->HSM2DPgpPtr +1) += xcdgb * s->imag; - *(here->HSM2DPgpPtr) += gm + gbdpg - gIdtotg; - *(here->HSM2DPspPtr ) += xcdsb * s->real; - *(here->HSM2DPspPtr +1) += xcdsb * s->imag; - *(here->HSM2DPspPtr) -= gds + FwdSum - gbdpsp + gIdtots; - *(here->HSM2DPbpPtr ) += xcdbb * s->real; - *(here->HSM2DPbpPtr +1) += xcdbb * s->imag; - *(here->HSM2DPbpPtr) -= gjbd - gmbs - gbdpb + gIdtotb; - - *(here->HSM2DdpPtr) -= gdpr; - *(here->HSM2DdPtr) += gdpr; - - *(here->HSM2SPdpPtr ) += xcsdb * s->real; - *(here->HSM2SPdpPtr +1) += xcsdb * s->imag; - *(here->HSM2SPdpPtr) -= gds + RevSum - gbspdp + gIstotd; - *(here->HSM2SPgpPtr ) += xcsgb * s->real; - *(here->HSM2SPgpPtr +1) += xcsgb * s->imag; - *(here->HSM2SPgpPtr) -= gm - gbspg + gIstotg; - *(here->HSM2SPspPtr ) += xcssb * s->real; - *(here->HSM2SPspPtr +1) += xcssb * s->imag; - *(here->HSM2SPspPtr) += gspr + gds + gbs + FwdSum + gbspsp - gIstots; - *(here->HSM2SPsPtr) -= gspr; - *(here->HSM2SPbpPtr ) += xcsbb * s->real; - *(here->HSM2SPbpPtr +1) += xcsbb * s->imag; - *(here->HSM2SPbpPtr) -= gjbs + gmbs - gbspb + gIstotb; - - *(here->HSM2SspPtr) -= gspr; - *(here->HSM2SsPtr) += gspr; - - *(here->HSM2BPdpPtr ) += xcbdb * s->real; - *(here->HSM2BPdpPtr +1) += xcbdb * s->imag; - *(here->HSM2BPdpPtr) -= gjbd - gbbdp + gIbtotd; - *(here->HSM2BPgpPtr ) += xcbgb * s->real; - *(here->HSM2BPgpPtr +1) += xcbgb * s->imag; - *(here->HSM2BPgpPtr) -= here->HSM2_gbgs + gIbtotg; - *(here->HSM2BPspPtr ) += xcbsb * s->real; - *(here->HSM2BPspPtr +1) += xcbsb * s->imag; - *(here->HSM2BPspPtr) -= gjbs - gbbsp + gIbtots; - *(here->HSM2BPbpPtr ) += xcbbb * s->real; - *(here->HSM2BPbpPtr +1) += xcbbb * s->imag; - *(here->HSM2BPbpPtr) += gjbd + gjbs - here->HSM2_gbbs - gIbtotb; - - if (model->HSM2_cogidl) { - /* stamp gidl */ - *(here->HSM2DPdpPtr) += here->HSM2_gigidlds; - *(here->HSM2DPgpPtr) += here->HSM2_gigidlgs; - *(here->HSM2DPspPtr) -= (here->HSM2_gigidlgs + - here->HSM2_gigidlds + here->HSM2_gigidlbs); - *(here->HSM2DPbpPtr) += here->HSM2_gigidlbs; - *(here->HSM2BPdpPtr) -= here->HSM2_gigidlds; - *(here->HSM2BPgpPtr) -= here->HSM2_gigidlgs; - *(here->HSM2BPspPtr) += (here->HSM2_gigidlgs + - here->HSM2_gigidlds + here->HSM2_gigidlbs); - *(here->HSM2BPbpPtr) -= here->HSM2_gigidlbs; - /* stamp gisl */ - *(here->HSM2SPdpPtr) -= (here->HSM2_gigislsd + - here->HSM2_gigislgd + here->HSM2_gigislbd); - *(here->HSM2SPgpPtr) += here->HSM2_gigislgd; - *(here->HSM2SPspPtr) += here->HSM2_gigislsd; - *(here->HSM2SPbpPtr) += here->HSM2_gigislbd; - *(here->HSM2BPdpPtr) += (here->HSM2_gigislgd + - here->HSM2_gigislsd + here->HSM2_gigislbd); - *(here->HSM2BPgpPtr) -= here->HSM2_gigislgd; - *(here->HSM2BPspPtr) -= here->HSM2_gigislsd; - *(here->HSM2BPbpPtr) -= here->HSM2_gigislbd; - } - - if (here->HSM2_corbnet) { - *(here->HSM2DPdbPtr ) += xcdbdb * s->real; - *(here->HSM2DPdbPtr +1) += xcdbdb * s->imag; - *(here->HSM2DPdbPtr) -= gbd; - *(here->HSM2SPsbPtr ) += xcsbsb * s->real; - *(here->HSM2SPsbPtr +1) += xcsbsb * s->imag; - *(here->HSM2SPsbPtr) -= gbs; - - *(here->HSM2DBdpPtr ) += xcdbdb * s->real; - *(here->HSM2DBdpPtr +1) += xcdbdb * s->imag; - *(here->HSM2DBdpPtr) -= gbd; - *(here->HSM2DBdbPtr ) -= xcdbdb * s->real; - *(here->HSM2DBdbPtr +1) -= xcdbdb * s->imag; - *(here->HSM2DBdbPtr) += gbd + here->HSM2_grbpd + here->HSM2_grbdb; - *(here->HSM2DBbpPtr) -= here->HSM2_grbpd; - *(here->HSM2DBbPtr) -= here->HSM2_grbdb; - - *(here->HSM2BPdbPtr) -= here->HSM2_grbpd; - *(here->HSM2BPbPtr) -= here->HSM2_grbpb; - *(here->HSM2BPsbPtr) -= here->HSM2_grbps; - *(here->HSM2BPbpPtr) += here->HSM2_grbpd + here->HSM2_grbps + here->HSM2_grbpb; - - *(here->HSM2SBspPtr ) += xcsbsb * s->real; - *(here->HSM2SBspPtr +1) += xcsbsb * s->imag; - *(here->HSM2SBspPtr) -= gbs; - *(here->HSM2SBbpPtr) -= here->HSM2_grbps; - *(here->HSM2SBbPtr) -= here->HSM2_grbsb; - *(here->HSM2SBsbPtr ) -= xcsbsb * s->real; - *(here->HSM2SBsbPtr +1) -= xcsbsb * s->imag; - *(here->HSM2SBsbPtr) += gbs + here->HSM2_grbps + here->HSM2_grbsb; - - *(here->HSM2BdbPtr) -= here->HSM2_grbdb; - *(here->HSM2BbpPtr) -= here->HSM2_grbpb; - *(here->HSM2BsbPtr) -= here->HSM2_grbsb; - *(here->HSM2BbPtr) += here->HSM2_grbsb + here->HSM2_grbdb + here->HSM2_grbpb; - } - - } - } - return(OK); -} - diff --git a/src/spicelib/devices/hisim2/hsm2set.c b/src/spicelib/devices/hisim2/hsm2set.c deleted file mode 100644 index be54ac7ca..000000000 --- a/src/spicelib/devices/hisim2/hsm2set.c +++ /dev/null @@ -1,1348 +0,0 @@ -/*********************************************************************** - - HiSIM (Hiroshima University STARC IGFET Model) - Copyright (C) 2014 Hiroshima University & STARC - - MODEL NAME : HiSIM - ( VERSION : 2 SUBVERSION : 8 REVISION : 0 ) - - FILE : hsm2set.c - - Date : 2014.6.5 - - released by - Hiroshima University & - Semiconductor Technology Academic Research Center (STARC) -***********************************************************************/ - -/********************************************************************** - -The following source code, and all copyrights, trade secrets or other -intellectual property rights in and to the source code in its entirety, -is owned by the Hiroshima University and the STARC organization. - -All users need to follow the "HiSIM2 Distribution Statement and -Copyright Notice" attached to HiSIM2 model. - ------HiSIM2 Distribution Statement and Copyright Notice-------------- - -Software is distributed as is, completely without warranty or service -support. Hiroshima University or STARC and its employees are not liable -for the condition or performance of the software. - -Hiroshima University and STARC own the copyright and grant users a perpetual, -irrevocable, worldwide, non-exclusive, royalty-free license with respect -to the software as set forth below. - -Hiroshima University and STARC hereby disclaim all implied warranties. - -Hiroshima University and STARC grant the users the right to modify, copy, -and redistribute the software and documentation, both within the user's -organization and externally, subject to the following restrictions - -1. The users agree not to charge for Hiroshima University and STARC code -itself but may charge for additions, extensions, or support. - -2. In any product based on the software, the users agree to acknowledge -Hiroshima University and STARC that developed the software. This -acknowledgment shall appear in the product documentation. - -3. The users agree to reproduce any copyright notice which appears on -the software on any copy or modification of such made available -to others." - - -*************************************************************************/ - -#include "ngspice/ngspice.h" -#include "ngspice/smpdefs.h" -#include "ngspice/cktdefs.h" -#include "hsm2def.h" -#include "hsm2evalenv.h" -#include "ngspice/const.h" -#include "ngspice/sperror.h" -#include "ngspice/suffix.h" - - -#ifdef USE_OMP -#include "ngspice/cpextern.h" -#endif - -#define BINNING(param) pParam->HSM2_##param = model->HSM2_##param \ - + model->HSM2_l##param / Lbin + model->HSM2_w##param / Wbin \ - + model->HSM2_p##param / LWbin ; - -#define RANGECHECK(param, min, max, pname) \ - if ( model->HSM2_coerrrep && ((param) < (min) || (param) > (max)) ) { \ - printf("warning: (%s = %g) range [%g , %g].\n", \ - (pname), (param), (min), (max) ); \ - } -#define RANGERESET(param, min, max, pname) \ - if ( model->HSM2_coerrrep && ((param) > (max)) ) { \ - printf("reset : (%s = %g to %g) range [%g , %g].\n", \ - (pname), (param), (max), (min), (max) ); \ - } \ - if ( model->HSM2_coerrrep && ((param) < (min)) ) { \ - printf("reset : (%s = %g to %g) range [%g , %g].\n", \ - (pname), (param), (min), (min), (max) ); \ - } \ - if ( (param) < (min) ) { param = (min); } \ - if ( (param) > (max) ) { param = (max); } -#define MINCHECK(param, min, pname) \ - if ( model->HSM2_coerrrep && ((param) < (min)) ) { \ - printf("warning: (%s = %g) range [%g , %g].\n", \ - (pname), (param), (min), (min) ); \ - } - - -int HSM2setup( - SMPmatrix *matrix, - GENmodel *inModel, - CKTcircuit *ckt, - int *states) - /* load the HSM2 device structure with those pointers needed later - * for fast matrix loading - */ -{ - HSM2model *model = (HSM2model*)inModel; - HSM2instance *here; - int error; - CKTnode *tmp; - HSM2binningParam *pParam ; - HSM2modelMKSParam *modelMKS ; - HSM2hereMKSParam *hereMKS ; - double Lgate =0.0, LG =0.0, Wgate =0.0, WG=0.0 ; - double Lbin=0.0, Wbin=0.0, LWbin =0.0; /* binning */ - -#ifdef USE_OMP - int idx, InstCount; - HSM2instance **InstArray; -#endif - - /* loop through all the HSM2 device models */ - for ( ;model != NULL ;model = HSM2nextModel(model)) { - /* Default value Processing for HSM2 MOSFET Models */ - if ( !model->HSM2_type_Given ) - model->HSM2_type = NMOS ; - /***/ - if ( !model->HSM2_info_Given ) model->HSM2_info = 0 ; - /* if ( !model->HSM2_noise_Given) model->HSM2_noise = 1;*/ - model->HSM2_noise = 1; /* allways noise is set to be 1 */ - - if ( !model->HSM2_version_Given) { - model->HSM2_version = 280; /* default 2.80 */ - printf(" 2.80 is selected for VERSION. (default) \n"); - } else { - if (model->HSM2_version < 280 || model->HSM2_version > 280 ) { - printf(" %d is not available for VERSION. \n", model->HSM2_version ); - model->HSM2_version = 280; /* 2.80 */ - } - printf(" 2.80 is selected for VERSION. \n"); - } - /* set subversion & revision */ -// model->HSM2_subversion = fmod(model->HSM2_version * 10 , 10 ); -// model->HSM2_revision = fmod(model->HSM2_version * 100 , 10 ); - - if ( !model->HSM2_corsrd_Given ) model->HSM2_corsrd = 0 ; - if ( !model->HSM2_corg_Given ) model->HSM2_corg = 0 ; - if ( !model->HSM2_coiprv_Given ) model->HSM2_coiprv = 1 ; - if ( !model->HSM2_copprv_Given ) model->HSM2_copprv = 1 ; - if ( !model->HSM2_coadov_Given ) model->HSM2_coadov = 1 ; - if ( !model->HSM2_coisub_Given ) model->HSM2_coisub = 0 ; - if ( !model->HSM2_coiigs_Given ) model->HSM2_coiigs = 0 ; - if ( !model->HSM2_cogidl_Given ) model->HSM2_cogidl = 0 ; - if ( !model->HSM2_coovlp_Given ) model->HSM2_coovlp = 1 ; - if ( !model->HSM2_coflick_Given ) model->HSM2_coflick = 0 ; - if ( !model->HSM2_coisti_Given ) model->HSM2_coisti = 0 ; - if ( !model->HSM2_conqs_Given ) model->HSM2_conqs = 0 ; /* QS (default) */ - if ( !model->HSM2_cothrml_Given ) model->HSM2_cothrml = 0 ; - if ( !model->HSM2_coign_Given ) model->HSM2_coign = 0 ; /* induced gate noise */ - if ( !model->HSM2_codfm_Given ) model->HSM2_codfm = 0 ; /* DFM */ - if ( !model->HSM2_corbnet_Given ) model->HSM2_corbnet = 0 ; - else if ( model->HSM2_corbnet != 0 && model->HSM2_corbnet != 1 ) { - model->HSM2_corbnet = 0; - printf("warning(HiSIM): CORBNET has been set to its default value: %d.\n", model->HSM2_corbnet); - } - if ( !model->HSM2_corecip_Given ) model->HSM2_corecip = 1 ; - if ( !model->HSM2_coqy_Given ) model->HSM2_coqy = 0 ; - if ( !model->HSM2_coqovsm_Given ) model->HSM2_coqovsm = 1 ; - if ( !model->HSM2_coerrrep_Given ) model->HSM2_coerrrep = 1 ; - if ( !model->HSM2_codep_Given ) model->HSM2_codep = 0 ; - if ( !model->HSM2_coddlt_Given ) model->HSM2_coddlt = 1 ; - - if ( model->HSM2_codep_Given ) { - if( model->HSM2_codep != 0 && model->HSM2_codep != 1 ) { - printf("warning(HiSIM): Invalid CODEP (%d) was specified, reset to 0.\n",model->HSM2_codep); - model->HSM2_codep = 0 ; - } - } - if ( model->HSM2_coddlt_Given ) { - if( model->HSM2_coddlt != 0 && model->HSM2_coddlt != 1 ) { - printf("warning(HiSIM): Invalid CODDLT (%d) was specified, reset to 0.\n",model->HSM2_coddlt); - model->HSM2_coddlt = 0 ; - } - } - - - if ( !model->HSM2_vmax_Given ) model->HSM2_vmax = 1.0e7 ; - if ( !model->HSM2_bgtmp1_Given ) model->HSM2_bgtmp1 = 90.25e-6 ; - if ( !model->HSM2_bgtmp2_Given ) model->HSM2_bgtmp2 = 1.0e-7 ; - if ( !model->HSM2_eg0_Given ) model->HSM2_eg0 = 1.1785e0 ; - if ( !model->HSM2_tox_Given ) model->HSM2_tox = 3.0e-9 ; - if ( !model->HSM2_xld_Given ) model->HSM2_xld = 0.0 ; - if ( !model->HSM2_lover_Given ) model->HSM2_lover = 30e-9 ; - if ( !model->HSM2_ddltmax_Given ) model->HSM2_ddltmax = 10.0 ; /* Vdseff */ - if ( model->HSM2_coddlt == 0 ) { - if ( !model->HSM2_ddltslp_Given ) model->HSM2_ddltslp = 0.0 ; /* Vdseff */ - if ( !model->HSM2_ddltict_Given ) model->HSM2_ddltict = 10.0 ; /* Vdseff */ - } else { - if ( !model->HSM2_ddltslp_Given ) model->HSM2_ddltslp = 10.0 ; /* Vdseff */ - if ( !model->HSM2_ddltict_Given ) model->HSM2_ddltict = 0.0 ; /* Vdseff */ - } - if ( !model->HSM2_vfbover_Given ) model->HSM2_vfbover = 0.0 ; - if ( !model->HSM2_nover_Given ) model->HSM2_nover = 1E19 ; - if ( !model->HSM2_xwd_Given ) model->HSM2_xwd = 0.0 ; - - if ( !model->HSM2_xl_Given ) model->HSM2_xl = 0.0 ; - if ( !model->HSM2_xw_Given ) model->HSM2_xw = 0.0 ; - if ( !model->HSM2_saref_Given ) model->HSM2_saref = 1e-6 ; - if ( !model->HSM2_sbref_Given ) model->HSM2_sbref = 1e-6 ; - if ( !model->HSM2_ll_Given ) model->HSM2_ll = 0.0 ; - if ( !model->HSM2_lld_Given ) model->HSM2_lld = 0.0 ; - if ( !model->HSM2_lln_Given ) model->HSM2_lln = 0.0 ; - if ( !model->HSM2_wl_Given ) model->HSM2_wl = 0.0 ; - if ( !model->HSM2_wl1_Given ) model->HSM2_wl1 = 0.0 ; - if ( !model->HSM2_wl1p_Given ) model->HSM2_wl1p = 1.0 ; - if ( !model->HSM2_wl2_Given ) model->HSM2_wl2 = 0.0 ; - if ( !model->HSM2_wl2p_Given ) model->HSM2_wl2p = 1.0 ; - if ( !model->HSM2_wld_Given ) model->HSM2_wld = 0.0 ; - if ( !model->HSM2_wln_Given ) model->HSM2_wln = 0.0 ; - - if ( !model->HSM2_rsh_Given ) model->HSM2_rsh = 0.0 ; - if ( !model->HSM2_rshg_Given ) model->HSM2_rshg = 0.0 ; - - if ( !model->HSM2_xqy_Given ) model->HSM2_xqy = 10e-9 ; - if ( !model->HSM2_xqy1_Given ) model->HSM2_xqy1 = 0.0 ; - if ( !model->HSM2_xqy2_Given ) model->HSM2_xqy2 = 2.0 ; - if ( !model->HSM2_qyrat_Given ) model->HSM2_qyrat = 0.5 ; - if ( !model->HSM2_rs_Given ) model->HSM2_rs = 0.0 ; - if ( !model->HSM2_rd_Given ) model->HSM2_rd = 0.0 ; - if ( !model->HSM2_vfbc_Given ) model->HSM2_vfbc = -1.0 ; - if ( !model->HSM2_vbi_Given ) model->HSM2_vbi = 1.1 ; - if ( !model->HSM2_nsubc_Given ) model->HSM2_nsubc = 5.0e17 ; - if ( !model->HSM2_vfbcl_Given ) model->HSM2_vfbcl = 0 ; - if ( !model->HSM2_vfbclp_Given ) model->HSM2_vfbclp = 1 ; - if ( !model->HSM2_parl2_Given ) model->HSM2_parl2 = 10.0e-9 ; - if ( !model->HSM2_lp_Given ) model->HSM2_lp = 15.0e-9 ; - if ( !model->HSM2_nsubp_Given ) model->HSM2_nsubp = 1.0e18 ; - if ( !model->HSM2_nsubpl_Given ) model->HSM2_nsubpl = 0.001 ; /* um */ - if ( !model->HSM2_nsubpfac_Given ) model->HSM2_nsubpfac = 1.0 ; - if ( !model->HSM2_nsubpdlt_Given ) model->HSM2_nsubpdlt = 0.01 ; - - if ( !model->HSM2_nsubpw_Given ) model->HSM2_nsubpw = 0.0 ; - if ( !model->HSM2_nsubpwp_Given ) model->HSM2_nsubpwp = 1.0 ; - - if ( !model->HSM2_scp1_Given ) model->HSM2_scp1 = 1.0 ; - if ( !model->HSM2_scp2_Given ) model->HSM2_scp2 = 0.0 ; - if ( !model->HSM2_scp3_Given ) model->HSM2_scp3 = 0.0 ; - if ( !model->HSM2_sc1_Given ) model->HSM2_sc1 = 1.0 ; - if ( !model->HSM2_sc2_Given ) model->HSM2_sc2 = 0.0 ; - if ( !model->HSM2_sc3_Given ) model->HSM2_sc3 = 0.0 ; - if ( !model->HSM2_sc4_Given ) model->HSM2_sc4 = 0.0 ; - if ( !model->HSM2_pgd1_Given ) model->HSM2_pgd1 = 0.0 ; - if ( !model->HSM2_pgd2_Given ) model->HSM2_pgd2 = 0.3 ; - if ( !model->HSM2_pgd4_Given ) model->HSM2_pgd4 = 0.0 ; - - if ( !model->HSM2_ndep_Given ) model->HSM2_ndep = 1.0 ; - if ( !model->HSM2_ndepl_Given ) model->HSM2_ndepl = 0.0 ; - if ( !model->HSM2_ndeplp_Given ) model->HSM2_ndeplp = 1.0 ; - if ( !model->HSM2_ndepw_Given ) model->HSM2_ndepw = 0.0 ; - if ( !model->HSM2_ndepwp_Given ) model->HSM2_ndepwp = 1.0 ; - if ( !model->HSM2_ninv_Given ) model->HSM2_ninv = 0.5 ; - if ( !model->HSM2_ninvd_Given ) model->HSM2_ninvd = 0.0 ; - if ( !model->HSM2_ninvdl_Given ) model->HSM2_ninvdl = 0.0 ; - if ( !model->HSM2_ninvdlp_Given ) model->HSM2_ninvdlp = 1.0 ; - if ( !model->HSM2_muecb0_Given ) model->HSM2_muecb0 = 1.0e3 ; - if ( !model->HSM2_muecb1_Given ) model->HSM2_muecb1 = 100.0 ; - if ( !model->HSM2_mueph0_Given ) model->HSM2_mueph0 = 300.0e-3 ; - if ( !model->HSM2_mueph1_Given ) { - if (model->HSM2_type == NMOS) model->HSM2_mueph1 = 25.0e3 ; - else model->HSM2_mueph1 = 9.0e3 ; - } - if ( !model->HSM2_muephw_Given ) model->HSM2_muephw = 0.0 ; - if ( !model->HSM2_muepwp_Given ) model->HSM2_muepwp = 1.0 ; - if ( !model->HSM2_muepwd_Given ) model->HSM2_muepwd = 0.0 ; - if ( !model->HSM2_muephl_Given ) model->HSM2_muephl = 0.0 ; - if ( !model->HSM2_mueplp_Given ) model->HSM2_mueplp = 1.0 ; - if ( !model->HSM2_muepld_Given ) model->HSM2_muepld = 0.0 ; - if ( !model->HSM2_muephs_Given ) model->HSM2_muephs = 0.0 ; - if ( !model->HSM2_muepsp_Given ) model->HSM2_muepsp = 1.0 ; - - if ( !model->HSM2_vtmp_Given ) model->HSM2_vtmp = 0.0 ; - - if ( !model->HSM2_wvth0_Given ) model->HSM2_wvth0 = 0.0 ; - - if ( !model->HSM2_muesr0_Given ) model->HSM2_muesr0 = 2.0 ; - if ( !model->HSM2_muesr1_Given ) model->HSM2_muesr1 = 1.0e15 ; - if ( !model->HSM2_muesrl_Given ) model->HSM2_muesrl = 0.0 ; - if ( !model->HSM2_muesrw_Given ) model->HSM2_muesrw = 0.0 ; - if ( !model->HSM2_mueswp_Given ) model->HSM2_mueswp = 1.0 ; - if ( !model->HSM2_mueslp_Given ) model->HSM2_mueslp = 1.0 ; - - if ( !model->HSM2_muetmp_Given ) model->HSM2_muetmp = 1.5 ; - - if ( !model->HSM2_bb_Given ) { - if (model->HSM2_type == NMOS) model->HSM2_bb = 2.0 ; - else model->HSM2_bb = 1.0 ; - } - - if ( !model->HSM2_sub1_Given ) model->HSM2_sub1 = 10e0 ; - if ( !model->HSM2_sub2_Given ) model->HSM2_sub2 = 25e0 ; - if ( !model->HSM2_svgs_Given ) model->HSM2_svgs = 0.8e0 ; - if ( !model->HSM2_svbs_Given ) model->HSM2_svbs = 0.5e0 ; - if ( !model->HSM2_svbsl_Given ) model->HSM2_svbsl = 0e0 ; - if ( !model->HSM2_svds_Given ) model->HSM2_svds = 0.8e0 ; - if ( !model->HSM2_slg_Given ) model->HSM2_slg = 30e-9 ; - if ( !model->HSM2_sub1l_Given ) model->HSM2_sub1l = 2.5e-3 ; - if ( !model->HSM2_sub2l_Given ) model->HSM2_sub2l = 2e-6 ; - - if ( !model->HSM2_svgsl_Given ) model->HSM2_svgsl = 0.0 ; - if ( !model->HSM2_svgslp_Given ) model->HSM2_svgslp = 1.0 ; - if ( !model->HSM2_svgswp_Given ) model->HSM2_svgswp = 1.0 ; - if ( !model->HSM2_svgsw_Given ) model->HSM2_svgsw = 0.0 ; - if ( !model->HSM2_svbslp_Given ) model->HSM2_svbslp = 1.0 ; - if ( !model->HSM2_slgl_Given ) model->HSM2_slgl = 0.0 ; - if ( !model->HSM2_slglp_Given ) model->HSM2_slglp = 1.0 ; - if ( !model->HSM2_sub1lp_Given ) model->HSM2_sub1lp = 1.0 ; - - if ( !model->HSM2_nsti_Given ) model->HSM2_nsti = 5.0e17 ; - if ( !model->HSM2_wsti_Given ) model->HSM2_wsti = 0.0 ; - if ( !model->HSM2_wstil_Given ) model->HSM2_wstil = 0.0 ; - if ( !model->HSM2_wstilp_Given ) model->HSM2_wstilp = 1.0 ; - if ( !model->HSM2_wstiw_Given ) model->HSM2_wstiw = 0.0 ; - if ( !model->HSM2_wstiwp_Given ) model->HSM2_wstiwp = 1.0 ; - if ( !model->HSM2_scsti1_Given ) model->HSM2_scsti1 = 0.0 ; - if ( !model->HSM2_scsti2_Given ) model->HSM2_scsti2 = 0.0 ; - if ( !model->HSM2_vthsti_Given ) model->HSM2_vthsti = 0.0 ; - if ( !model->HSM2_vdsti_Given ) model->HSM2_vdsti = 0.0 ; - if ( !model->HSM2_muesti1_Given ) model->HSM2_muesti1 = 0.0 ; - if ( !model->HSM2_muesti2_Given ) model->HSM2_muesti2 = 0.0 ; - if ( !model->HSM2_muesti3_Given ) model->HSM2_muesti3 = 1.0 ; - if ( !model->HSM2_nsubpsti1_Given ) model->HSM2_nsubpsti1 = 0.0 ; - if ( !model->HSM2_nsubpsti2_Given ) model->HSM2_nsubpsti2 = 0.0 ; - if ( !model->HSM2_nsubpsti3_Given ) model->HSM2_nsubpsti3 = 1.0 ; - if ( !model->HSM2_nsubcsti1_Given ) model->HSM2_nsubcsti1 = 0.0 ; - if ( !model->HSM2_nsubcsti2_Given ) model->HSM2_nsubcsti2 = 0.0 ; - if ( !model->HSM2_nsubcsti3_Given ) model->HSM2_nsubcsti3 = 1.0 ; - - if ( !model->HSM2_lpext_Given ) model->HSM2_lpext = 1.0e-50 ; - if ( !model->HSM2_npext_Given ) model->HSM2_npext = 5.0e17 ; - if ( !model->HSM2_npextw_Given ) model->HSM2_npextw = 0.0 ; - if ( !model->HSM2_npextwp_Given ) model->HSM2_npextwp = 1.0 ; - if ( !model->HSM2_scp21_Given ) model->HSM2_scp21 = 0.0 ; - if ( !model->HSM2_scp22_Given ) model->HSM2_scp22 = 0.0 ; - if ( !model->HSM2_bs1_Given ) model->HSM2_bs1 = 0.0 ; - if ( !model->HSM2_bs2_Given ) model->HSM2_bs2 = 0.9 ; - - if ( !model->HSM2_tpoly_Given ) model->HSM2_tpoly = 200e-9 ; - if ( !model->HSM2_cgbo_Given ) model->HSM2_cgbo = 0.0 ; - if ( !model->HSM2_js0_Given ) model->HSM2_js0 = 0.5e-6 ; - if ( !model->HSM2_js0sw_Given ) model->HSM2_js0sw = 0.0 ; - if ( !model->HSM2_nj_Given ) model->HSM2_nj = 1.0 ; - if ( !model->HSM2_njsw_Given ) model->HSM2_njsw = 1.0 ; - if ( !model->HSM2_xti_Given ) model->HSM2_xti = 2.0 ; - if ( !model->HSM2_cj_Given ) model->HSM2_cj = 5.0e-04 ; - if ( !model->HSM2_cjsw_Given ) model->HSM2_cjsw = 5.0e-10 ; - if ( !model->HSM2_cjswg_Given ) model->HSM2_cjswg = 5.0e-10 ; - if ( !model->HSM2_mj_Given ) model->HSM2_mj = 0.5e0 ; - if ( !model->HSM2_mjsw_Given ) model->HSM2_mjsw = 0.33e0 ; - if ( !model->HSM2_mjswg_Given ) model->HSM2_mjswg = 0.33e0 ; - if ( !model->HSM2_pb_Given ) model->HSM2_pb = 1.0e0 ; - if ( !model->HSM2_pbsw_Given ) model->HSM2_pbsw = 1.0e0 ; - if ( !model->HSM2_pbswg_Given ) model->HSM2_pbswg = 1.0e0 ; - - if ( !model->HSM2_tcjbd_Given ) model->HSM2_tcjbd = 0.0 ; - if ( !model->HSM2_tcjbs_Given ) model->HSM2_tcjbs = 0.0 ; - if ( !model->HSM2_tcjbdsw_Given ) model->HSM2_tcjbdsw = 0.0 ; - if ( !model->HSM2_tcjbssw_Given ) model->HSM2_tcjbssw = 0.0 ; - if ( !model->HSM2_tcjbdswg_Given ) model->HSM2_tcjbdswg = 0.0 ; - if ( !model->HSM2_tcjbsswg_Given ) model->HSM2_tcjbsswg = 0.0 ; - - if ( !model->HSM2_xti2_Given ) model->HSM2_xti2 = 0.0e0 ; - if ( !model->HSM2_cisb_Given ) model->HSM2_cisb = 0.0e0 ; - if ( !model->HSM2_cvb_Given ) model->HSM2_cvb = 0.0e0 ; - if ( !model->HSM2_ctemp_Given ) model->HSM2_ctemp = 0.0e0 ; - if ( !model->HSM2_cisbk_Given ) model->HSM2_cisbk = 0.0e0 ; - if ( !model->HSM2_cvbk_Given ) model->HSM2_cvbk = 0.0e0 ; - if ( !model->HSM2_divx_Given ) model->HSM2_divx = 0.0e0 ; - - if ( !model->HSM2_clm1_Given ) model->HSM2_clm1 = 700.0e-3 ; - if ( !model->HSM2_clm2_Given ) model->HSM2_clm2 = 2.0 ; - if ( !model->HSM2_clm3_Given ) model->HSM2_clm3 = 1.0 ; - if ( !model->HSM2_clm5_Given ) model->HSM2_clm5 = 1.0 ; - if ( !model->HSM2_clm6_Given ) model->HSM2_clm6 = 0.0 ; - if ( !model->HSM2_vover_Given ) model->HSM2_vover = 0.3 ; - if ( !model->HSM2_voverp_Given ) model->HSM2_voverp = 0.3 ; - if ( !model->HSM2_wfc_Given ) model->HSM2_wfc = 0.0 ; - if ( !model->HSM2_nsubcw_Given ) model->HSM2_nsubcw = 0.0 ; - if ( !model->HSM2_nsubcwp_Given ) model->HSM2_nsubcwp = 1.0 ; - if ( !model->HSM2_nsubcmax_Given ) model->HSM2_nsubcmax = 5e18 ; - - if ( !model->HSM2_qme1_Given ) model->HSM2_qme1 = 0.0 ; - if ( !model->HSM2_qme2_Given ) model->HSM2_qme2 = 2.0 ; /* fix in version 2.80 */ - if ( !model->HSM2_qme3_Given ) model->HSM2_qme3 = 0.0 ; - - if ( !model->HSM2_vovers_Given ) model->HSM2_vovers = 0.0 ; - if ( !model->HSM2_voversp_Given ) model->HSM2_voversp = 0.0 ; - - if ( !model->HSM2_gidl1_Given ) model->HSM2_gidl1 = 2e0 ; - if ( !model->HSM2_gidl2_Given ) model->HSM2_gidl2 = 3e7 ; - if ( !model->HSM2_gidl3_Given ) model->HSM2_gidl3 = 0.9e0 ; - if ( !model->HSM2_gidl4_Given ) model->HSM2_gidl4 = 0.0 ; - if ( !model->HSM2_gidl5_Given ) model->HSM2_gidl5 = 0.2e0 ; - if ( !model->HSM2_gidl6_Given ) model->HSM2_gidl6 = 0 ; - if ( !model->HSM2_gidl7_Given ) model->HSM2_gidl7 = 1 ; - - if ( !model->HSM2_gleak1_Given ) model->HSM2_gleak1 = 50e0 ; - if ( !model->HSM2_gleak2_Given ) model->HSM2_gleak2 = 10e6 ; - if ( !model->HSM2_gleak3_Given ) model->HSM2_gleak3 = 60e-3 ; - if ( !model->HSM2_gleak4_Given ) model->HSM2_gleak4 = 4e0 ; - if ( !model->HSM2_gleak5_Given ) model->HSM2_gleak5 = 7.5e3 ; - if ( !model->HSM2_gleak6_Given ) model->HSM2_gleak6 = 250e-3 ; - if ( !model->HSM2_gleak7_Given ) model->HSM2_gleak7 = 1e-6 ; - - if ( !model->HSM2_glksd1_Given ) model->HSM2_glksd1 = 1.0e-15 ; - if ( !model->HSM2_glksd2_Given ) model->HSM2_glksd2 = 5e6 ; - if ( !model->HSM2_glksd3_Given ) model->HSM2_glksd3 = -5e6 ; - if ( !model->HSM2_glkb1_Given ) model->HSM2_glkb1 = 5e-16 ; - if ( !model->HSM2_glkb2_Given ) model->HSM2_glkb2 = 1e0 ; - if ( !model->HSM2_glkb3_Given ) model->HSM2_glkb3 = 0e0 ; - if ( !model->HSM2_egig_Given ) model->HSM2_egig = 0e0 ; - if ( !model->HSM2_igtemp2_Given ) model->HSM2_igtemp2 = 0e0 ; - if ( !model->HSM2_igtemp3_Given ) model->HSM2_igtemp3 = 0e0 ; - if ( !model->HSM2_vzadd0_Given ) model->HSM2_vzadd0 = 20.0e-3 ; - if ( !model->HSM2_pzadd0_Given ) model->HSM2_pzadd0 = 20.0e-3 ; - if ( !model->HSM2_nftrp_Given ) model->HSM2_nftrp = 10e9 ; - if ( !model->HSM2_nfalp_Given ) model->HSM2_nfalp = 1.0e-19 ; - if ( !model->HSM2_falph_Given ) model->HSM2_falph = 1.0 ; - if ( !model->HSM2_cit_Given ) model->HSM2_cit = 0e0 ; - - if ( !model->HSM2_kappa_Given ) model->HSM2_kappa = 3.90e0 ; - if ( !model->HSM2_cgso_Given ) model->HSM2_cgso = 0.0 ; - if ( !model->HSM2_cgdo_Given ) model->HSM2_cgdo = 0.0 ; - - - if ( !model->HSM2_vdiffj_Given ) model->HSM2_vdiffj = 0.6e-3 ; - if ( !model->HSM2_dly1_Given ) model->HSM2_dly1 = 100.0e-12 ; - if ( !model->HSM2_dly2_Given ) model->HSM2_dly2 = 0.7e0 ; - if ( !model->HSM2_dly3_Given ) model->HSM2_dly3 = 0.8e-6 ; - if ( !model->HSM2_tnom_Given ) model->HSM2_tnom = 27.0 ; /* [C] */ - - if ( !model->HSM2_ovslp_Given ) model->HSM2_ovslp = 2.1e-7 ; - if ( !model->HSM2_ovmag_Given ) model->HSM2_ovmag = 0.6e0 ; - - if ( !model->HSM2_gbmin_Given ) model->HSM2_gbmin = 1.0e-12; /* in mho */ - if ( !model->HSM2_rbpb_Given ) model->HSM2_rbpb = 50.0e0 ; - if ( !model->HSM2_rbpd_Given ) model->HSM2_rbpd = 50.0e0 ; - if ( !model->HSM2_rbps_Given ) model->HSM2_rbps = 50.0e0 ; - if ( !model->HSM2_rbdb_Given ) model->HSM2_rbdb = 50.0e0 ; - if ( !model->HSM2_rbsb_Given ) model->HSM2_rbsb = 50.0e0 ; - - if ( !model->HSM2_ibpc1_Given ) model->HSM2_ibpc1 = 0.0 ; - if ( !model->HSM2_ibpc2_Given ) model->HSM2_ibpc2 = 0.0 ; - - if ( !model->HSM2_mphdfm_Given ) model->HSM2_mphdfm = -0.3 ; - - - if ( !model->HSM2_ptl_Given ) model->HSM2_ptl = 0.0 ; - if ( !model->HSM2_ptp_Given ) model->HSM2_ptp = 3.5 ; - if ( !model->HSM2_pt2_Given ) model->HSM2_pt2 = 0.0 ; - if ( !model->HSM2_ptlp_Given ) model->HSM2_ptlp = 1.0 ; - if ( !model->HSM2_gdl_Given ) model->HSM2_gdl = 0.0 ; - if ( !model->HSM2_gdlp_Given ) model->HSM2_gdlp = 0.0 ; - - if ( !model->HSM2_gdld_Given ) model->HSM2_gdld = 0.0 ; - if ( !model->HSM2_pt4_Given ) model->HSM2_pt4 = 0.0 ; - if ( !model->HSM2_pt4p_Given ) model->HSM2_pt4p = 1.0 ; - if ( !model->HSM2_muephl2_Given ) model->HSM2_muephl2 = 0.0 ; - if ( !model->HSM2_mueplp2_Given ) model->HSM2_mueplp2 = 1.0 ; - if ( !model->HSM2_nsubcw2_Given ) model->HSM2_nsubcw2 = 0.0 ; - if ( !model->HSM2_nsubcwp2_Given ) model->HSM2_nsubcwp2 = 1.0 ; - if ( !model->HSM2_muephw2_Given ) model->HSM2_muephw2 = 0.0 ; - if ( !model->HSM2_muepwp2_Given ) model->HSM2_muepwp2 = 1.0 ; - - /* WPE set default Model parameter value */ - if ( !model->HSM2_web_Given ) model->HSM2_web = 0.0 ; - if ( !model->HSM2_wec_Given ) model->HSM2_wec = 0.0 ; - if ( !model->HSM2_nsubcwpe_Given ) model->HSM2_nsubcwpe = 0.0 ; - if ( !model->HSM2_npextwpe_Given ) model->HSM2_npextwpe = 0.0 ; - if ( !model->HSM2_nsubpwpe_Given ) model->HSM2_nsubpwpe = 0.0 ; - - if ( !model->HSM2_Vgsmin_Given ) model->HSM2_Vgsmin = -5.0 * model->HSM2_type ; - if ( !model->HSM2_sc3Vbs_Given ) model->HSM2_sc3Vbs = 0.0 ; - if ( !model->HSM2_byptol_Given ) model->HSM2_byptol = 0.0 ; - if ( !model->HSM2_muecb0lp_Given ) model->HSM2_muecb0lp = 0.0; - if ( !model->HSM2_muecb1lp_Given ) model->HSM2_muecb1lp = 0.0; - - /* Depletion Mode MOSFET */ - if ( !model->HSM2_ndepm_Given ) model->HSM2_ndepm = 1e17 ; - if ( !model->HSM2_ndepml_Given ) model->HSM2_ndepml = 0.0 ; - if ( !model->HSM2_ndepmlp_Given ) model->HSM2_ndepmlp = 1.0 ; - if ( !model->HSM2_tndep_Given ) model->HSM2_tndep = 0.2e-6 ; - if ( !model->HSM2_depleak_Given ) model->HSM2_depleak = 0.5 ; - if ( !model->HSM2_depleakl_Given ) model->HSM2_depleakl = 0.0 ; - if ( !model->HSM2_depleaklp_Given ) model->HSM2_depleaklp = 1.0 ; - if ( !model->HSM2_depeta_Given ) model->HSM2_depeta = 0.0 ; - if ( !model->HSM2_depmue0_Given ) model->HSM2_depmue0 = 1e3 ; - if ( !model->HSM2_depmue0l_Given ) model->HSM2_depmue0l = 0.0 ; - if ( !model->HSM2_depmue0lp_Given ) model->HSM2_depmue0lp = 1.0 ; - if ( !model->HSM2_depmue1_Given ) model->HSM2_depmue1 = 0.0 ; - if ( !model->HSM2_depmue1l_Given ) model->HSM2_depmue1l = 0.0 ; - if ( !model->HSM2_depmue1lp_Given ) model->HSM2_depmue1lp = 1.0 ; - if ( !model->HSM2_depmueback0_Given ) model->HSM2_depmueback0 = 1e2 ; - if ( !model->HSM2_depmueback0l_Given ) model->HSM2_depmueback0l = 0.0 ; - if ( !model->HSM2_depmueback0lp_Given ) model->HSM2_depmueback0lp = 1.0 ; - if ( !model->HSM2_depmueback1_Given ) model->HSM2_depmueback1 = 0.0 ; - if ( !model->HSM2_depmueback1l_Given ) model->HSM2_depmueback1l = 0.0 ; - if ( !model->HSM2_depmueback1lp_Given ) model->HSM2_depmueback1lp = 1.0 ; - if ( !model->HSM2_depmueph0_Given ) model->HSM2_depmueph0 = 0.3 ; - if ( !model->HSM2_depmueph1_Given ) model->HSM2_depmueph1 = 5e3 ; - if ( !model->HSM2_depvmax_Given ) model->HSM2_depvmax = 3e7 ; - if ( !model->HSM2_depvmaxl_Given ) model->HSM2_depvmaxl = 0.0 ; - if ( !model->HSM2_depvmaxlp_Given ) model->HSM2_depvmaxlp = 1.0 ; - if ( !model->HSM2_depvdsef1_Given ) model->HSM2_depvdsef1 = 2.0 ; - if ( !model->HSM2_depvdsef1l_Given ) model->HSM2_depvdsef1l = 0.0 ; - if ( !model->HSM2_depvdsef1lp_Given ) model->HSM2_depvdsef1lp = 1.0 ; - if ( !model->HSM2_depvdsef2_Given ) model->HSM2_depvdsef2 = 0.5 ; - if ( !model->HSM2_depvdsef2l_Given ) model->HSM2_depvdsef2l = 0.0 ; - if ( !model->HSM2_depvdsef2lp_Given ) model->HSM2_depvdsef2lp = 1.0 ; - if ( !model->HSM2_depbb_Given ) model->HSM2_depbb = 1.0 ; - if ( !model->HSM2_depmuetmp_Given ) model->HSM2_depmuetmp = 1.5 ; - - if ( model->HSM2_codep ) { /* change default value for depletion mod MOSFET */ - if ( !model->HSM2_corecip_Given ) model->HSM2_corecip = 0 ; - if ( !model->HSM2_copprv_Given ) model->HSM2_copprv = 0 ; - if ( !model->HSM2_vfbc_Given ) model->HSM2_vfbc = 0.2 ; - if ( !model->HSM2_nsubc_Given ) model->HSM2_nsubc = 5.0e16 ; - if ( !model->HSM2_lp_Given ) model->HSM2_lp = 0.0 ; - if ( !model->HSM2_nsubp_Given ) model->HSM2_nsubp = 1.0e17 ; - if ( !model->HSM2_muesr1_Given ) model->HSM2_muesr1 = 5.0e15 ; - } - - /* binning parameters */ - if ( !model->HSM2_lmin_Given ) model->HSM2_lmin = 0.0 ; - if ( !model->HSM2_lmax_Given ) model->HSM2_lmax = 1.0 ; - if ( !model->HSM2_wmin_Given ) model->HSM2_wmin = 0.0 ; - if ( !model->HSM2_wmax_Given ) model->HSM2_wmax = 1.0 ; - if ( !model->HSM2_lbinn_Given ) model->HSM2_lbinn = 1.0 ; - if ( !model->HSM2_wbinn_Given ) model->HSM2_wbinn = 1.0 ; - - /* Length dependence */ - if ( !model->HSM2_lvmax_Given ) model->HSM2_lvmax = 0.0 ; - if ( !model->HSM2_lbgtmp1_Given ) model->HSM2_lbgtmp1 = 0.0 ; - if ( !model->HSM2_lbgtmp2_Given ) model->HSM2_lbgtmp2 = 0.0 ; - if ( !model->HSM2_leg0_Given ) model->HSM2_leg0 = 0.0 ; - if ( !model->HSM2_llover_Given ) model->HSM2_llover = 0.0 ; - if ( !model->HSM2_lvfbover_Given ) model->HSM2_lvfbover = 0.0 ; - if ( !model->HSM2_lnover_Given ) model->HSM2_lnover = 0.0 ; - if ( !model->HSM2_lwl2_Given ) model->HSM2_lwl2 = 0.0 ; - if ( !model->HSM2_lvfbc_Given ) model->HSM2_lvfbc = 0.0 ; - if ( !model->HSM2_lnsubc_Given ) model->HSM2_lnsubc = 0.0 ; - if ( !model->HSM2_lnsubp_Given ) model->HSM2_lnsubp = 0.0 ; - if ( !model->HSM2_lscp1_Given ) model->HSM2_lscp1 = 0.0 ; - if ( !model->HSM2_lscp2_Given ) model->HSM2_lscp2 = 0.0 ; - if ( !model->HSM2_lscp3_Given ) model->HSM2_lscp3 = 0.0 ; - if ( !model->HSM2_lsc1_Given ) model->HSM2_lsc1 = 0.0 ; - if ( !model->HSM2_lsc2_Given ) model->HSM2_lsc2 = 0.0 ; - if ( !model->HSM2_lsc3_Given ) model->HSM2_lsc3 = 0.0 ; - if ( !model->HSM2_lsc4_Given ) model->HSM2_lsc4 = 0.0 ; - if ( !model->HSM2_lpgd1_Given ) model->HSM2_lpgd1 = 0.0 ; - if ( !model->HSM2_lndep_Given ) model->HSM2_lndep = 0.0 ; - if ( !model->HSM2_lninv_Given ) model->HSM2_lninv = 0.0 ; - if ( !model->HSM2_lmuecb0_Given ) model->HSM2_lmuecb0 = 0.0 ; - if ( !model->HSM2_lmuecb1_Given ) model->HSM2_lmuecb1 = 0.0 ; - if ( !model->HSM2_lmueph1_Given ) model->HSM2_lmueph1 = 0.0 ; - if ( !model->HSM2_lvtmp_Given ) model->HSM2_lvtmp = 0.0 ; - if ( !model->HSM2_lwvth0_Given ) model->HSM2_lwvth0 = 0.0 ; - if ( !model->HSM2_lmuesr1_Given ) model->HSM2_lmuesr1 = 0.0 ; - if ( !model->HSM2_lmuetmp_Given ) model->HSM2_lmuetmp = 0.0 ; - if ( !model->HSM2_lsub1_Given ) model->HSM2_lsub1 = 0.0 ; - if ( !model->HSM2_lsub2_Given ) model->HSM2_lsub2 = 0.0 ; - if ( !model->HSM2_lsvds_Given ) model->HSM2_lsvds = 0.0 ; - if ( !model->HSM2_lsvbs_Given ) model->HSM2_lsvbs = 0.0 ; - if ( !model->HSM2_lsvgs_Given ) model->HSM2_lsvgs = 0.0 ; - if ( !model->HSM2_lnsti_Given ) model->HSM2_lnsti = 0.0 ; - if ( !model->HSM2_lwsti_Given ) model->HSM2_lwsti = 0.0 ; - if ( !model->HSM2_lscsti1_Given ) model->HSM2_lscsti1 = 0.0 ; - if ( !model->HSM2_lscsti2_Given ) model->HSM2_lscsti2 = 0.0 ; - if ( !model->HSM2_lvthsti_Given ) model->HSM2_lvthsti = 0.0 ; - if ( !model->HSM2_lmuesti1_Given ) model->HSM2_lmuesti1 = 0.0 ; - if ( !model->HSM2_lmuesti2_Given ) model->HSM2_lmuesti2 = 0.0 ; - if ( !model->HSM2_lmuesti3_Given ) model->HSM2_lmuesti3 = 0.0 ; - if ( !model->HSM2_lnsubpsti1_Given ) model->HSM2_lnsubpsti1 = 0.0 ; - if ( !model->HSM2_lnsubpsti2_Given ) model->HSM2_lnsubpsti2 = 0.0 ; - if ( !model->HSM2_lnsubpsti3_Given ) model->HSM2_lnsubpsti3 = 0.0 ; - if ( !model->HSM2_lnsubcsti1_Given ) model->HSM2_lnsubcsti1 = 0.0 ; - if ( !model->HSM2_lnsubcsti2_Given ) model->HSM2_lnsubcsti2 = 0.0 ; - if ( !model->HSM2_lnsubcsti3_Given ) model->HSM2_lnsubcsti3 = 0.0 ; - if ( !model->HSM2_lcgso_Given ) model->HSM2_lcgso = 0.0 ; - if ( !model->HSM2_lcgdo_Given ) model->HSM2_lcgdo = 0.0 ; - if ( !model->HSM2_ljs0_Given ) model->HSM2_ljs0 = 0.0 ; - if ( !model->HSM2_ljs0sw_Given ) model->HSM2_ljs0sw = 0.0 ; - if ( !model->HSM2_lnj_Given ) model->HSM2_lnj = 0.0 ; - if ( !model->HSM2_lcisbk_Given ) model->HSM2_lcisbk = 0.0 ; - if ( !model->HSM2_lclm1_Given ) model->HSM2_lclm1 = 0.0 ; - if ( !model->HSM2_lclm2_Given ) model->HSM2_lclm2 = 0.0 ; - if ( !model->HSM2_lclm3_Given ) model->HSM2_lclm3 = 0.0 ; - if ( !model->HSM2_lwfc_Given ) model->HSM2_lwfc = 0.0 ; - if ( !model->HSM2_lgidl1_Given ) model->HSM2_lgidl1 = 0.0 ; - if ( !model->HSM2_lgidl2_Given ) model->HSM2_lgidl2 = 0.0 ; - if ( !model->HSM2_lgleak1_Given ) model->HSM2_lgleak1 = 0.0 ; - if ( !model->HSM2_lgleak2_Given ) model->HSM2_lgleak2 = 0.0 ; - if ( !model->HSM2_lgleak3_Given ) model->HSM2_lgleak3 = 0.0 ; - if ( !model->HSM2_lgleak6_Given ) model->HSM2_lgleak6 = 0.0 ; - if ( !model->HSM2_lglksd1_Given ) model->HSM2_lglksd1 = 0.0 ; - if ( !model->HSM2_lglksd2_Given ) model->HSM2_lglksd2 = 0.0 ; - if ( !model->HSM2_lglkb1_Given ) model->HSM2_lglkb1 = 0.0 ; - if ( !model->HSM2_lglkb2_Given ) model->HSM2_lglkb2 = 0.0 ; - if ( !model->HSM2_lnftrp_Given ) model->HSM2_lnftrp = 0.0 ; - if ( !model->HSM2_lnfalp_Given ) model->HSM2_lnfalp = 0.0 ; - if ( !model->HSM2_lvdiffj_Given ) model->HSM2_lvdiffj = 0.0 ; - if ( !model->HSM2_libpc1_Given ) model->HSM2_libpc1 = 0.0 ; - if ( !model->HSM2_libpc2_Given ) model->HSM2_libpc2 = 0.0 ; - - /* Width dependence */ - if ( !model->HSM2_wvmax_Given ) model->HSM2_wvmax = 0.0 ; - if ( !model->HSM2_wbgtmp1_Given ) model->HSM2_wbgtmp1 = 0.0 ; - if ( !model->HSM2_wbgtmp2_Given ) model->HSM2_wbgtmp2 = 0.0 ; - if ( !model->HSM2_weg0_Given ) model->HSM2_weg0 = 0.0 ; - if ( !model->HSM2_wlover_Given ) model->HSM2_wlover = 0.0 ; - if ( !model->HSM2_wvfbover_Given ) model->HSM2_wvfbover = 0.0 ; - if ( !model->HSM2_wnover_Given ) model->HSM2_wnover = 0.0 ; - if ( !model->HSM2_wwl2_Given ) model->HSM2_wwl2 = 0.0 ; - if ( !model->HSM2_wvfbc_Given ) model->HSM2_wvfbc = 0.0 ; - if ( !model->HSM2_wnsubc_Given ) model->HSM2_wnsubc = 0.0 ; - if ( !model->HSM2_wnsubp_Given ) model->HSM2_wnsubp = 0.0 ; - if ( !model->HSM2_wscp1_Given ) model->HSM2_wscp1 = 0.0 ; - if ( !model->HSM2_wscp2_Given ) model->HSM2_wscp2 = 0.0 ; - if ( !model->HSM2_wscp3_Given ) model->HSM2_wscp3 = 0.0 ; - if ( !model->HSM2_wsc1_Given ) model->HSM2_wsc1 = 0.0 ; - if ( !model->HSM2_wsc2_Given ) model->HSM2_wsc2 = 0.0 ; - if ( !model->HSM2_wsc3_Given ) model->HSM2_wsc3 = 0.0 ; - if ( !model->HSM2_wsc4_Given ) model->HSM2_wsc4 = 0.0 ; - if ( !model->HSM2_wpgd1_Given ) model->HSM2_wpgd1 = 0.0 ; - if ( !model->HSM2_wndep_Given ) model->HSM2_wndep = 0.0 ; - if ( !model->HSM2_wninv_Given ) model->HSM2_wninv = 0.0 ; - if ( !model->HSM2_wmuecb0_Given ) model->HSM2_wmuecb0 = 0.0 ; - if ( !model->HSM2_wmuecb1_Given ) model->HSM2_wmuecb1 = 0.0 ; - if ( !model->HSM2_wmueph1_Given ) model->HSM2_wmueph1 = 0.0 ; - if ( !model->HSM2_wvtmp_Given ) model->HSM2_wvtmp = 0.0 ; - if ( !model->HSM2_wwvth0_Given ) model->HSM2_wwvth0 = 0.0 ; - if ( !model->HSM2_wmuesr1_Given ) model->HSM2_wmuesr1 = 0.0 ; - if ( !model->HSM2_wmuetmp_Given ) model->HSM2_wmuetmp = 0.0 ; - if ( !model->HSM2_wsub1_Given ) model->HSM2_wsub1 = 0.0 ; - if ( !model->HSM2_wsub2_Given ) model->HSM2_wsub2 = 0.0 ; - if ( !model->HSM2_wsvds_Given ) model->HSM2_wsvds = 0.0 ; - if ( !model->HSM2_wsvbs_Given ) model->HSM2_wsvbs = 0.0 ; - if ( !model->HSM2_wsvgs_Given ) model->HSM2_wsvgs = 0.0 ; - if ( !model->HSM2_wnsti_Given ) model->HSM2_wnsti = 0.0 ; - if ( !model->HSM2_wwsti_Given ) model->HSM2_wwsti = 0.0 ; - if ( !model->HSM2_wscsti1_Given ) model->HSM2_wscsti1 = 0.0 ; - if ( !model->HSM2_wscsti2_Given ) model->HSM2_wscsti2 = 0.0 ; - if ( !model->HSM2_wvthsti_Given ) model->HSM2_wvthsti = 0.0 ; - if ( !model->HSM2_wmuesti1_Given ) model->HSM2_wmuesti1 = 0.0 ; - if ( !model->HSM2_wmuesti2_Given ) model->HSM2_wmuesti2 = 0.0 ; - if ( !model->HSM2_wmuesti3_Given ) model->HSM2_wmuesti3 = 0.0 ; - if ( !model->HSM2_wnsubpsti1_Given ) model->HSM2_wnsubpsti1 = 0.0 ; - if ( !model->HSM2_wnsubpsti2_Given ) model->HSM2_wnsubpsti2 = 0.0 ; - if ( !model->HSM2_wnsubpsti3_Given ) model->HSM2_wnsubpsti3 = 0.0 ; - if ( !model->HSM2_wnsubcsti1_Given ) model->HSM2_wnsubcsti1 = 0.0 ; - if ( !model->HSM2_wnsubcsti2_Given ) model->HSM2_wnsubcsti2 = 0.0 ; - if ( !model->HSM2_wnsubcsti3_Given ) model->HSM2_wnsubcsti3 = 0.0 ; - if ( !model->HSM2_wcgso_Given ) model->HSM2_wcgso = 0.0 ; - if ( !model->HSM2_wcgdo_Given ) model->HSM2_wcgdo = 0.0 ; - if ( !model->HSM2_wjs0_Given ) model->HSM2_wjs0 = 0.0 ; - if ( !model->HSM2_wjs0sw_Given ) model->HSM2_wjs0sw = 0.0 ; - if ( !model->HSM2_wnj_Given ) model->HSM2_wnj = 0.0 ; - if ( !model->HSM2_wcisbk_Given ) model->HSM2_wcisbk = 0.0 ; - if ( !model->HSM2_wclm1_Given ) model->HSM2_wclm1 = 0.0 ; - if ( !model->HSM2_wclm2_Given ) model->HSM2_wclm2 = 0.0 ; - if ( !model->HSM2_wclm3_Given ) model->HSM2_wclm3 = 0.0 ; - if ( !model->HSM2_wwfc_Given ) model->HSM2_wwfc = 0.0 ; - if ( !model->HSM2_wgidl1_Given ) model->HSM2_wgidl1 = 0.0 ; - if ( !model->HSM2_wgidl2_Given ) model->HSM2_wgidl2 = 0.0 ; - if ( !model->HSM2_wgleak1_Given ) model->HSM2_wgleak1 = 0.0 ; - if ( !model->HSM2_wgleak2_Given ) model->HSM2_wgleak2 = 0.0 ; - if ( !model->HSM2_wgleak3_Given ) model->HSM2_wgleak3 = 0.0 ; - if ( !model->HSM2_wgleak6_Given ) model->HSM2_wgleak6 = 0.0 ; - if ( !model->HSM2_wglksd1_Given ) model->HSM2_wglksd1 = 0.0 ; - if ( !model->HSM2_wglksd2_Given ) model->HSM2_wglksd2 = 0.0 ; - if ( !model->HSM2_wglkb1_Given ) model->HSM2_wglkb1 = 0.0 ; - if ( !model->HSM2_wglkb2_Given ) model->HSM2_wglkb2 = 0.0 ; - if ( !model->HSM2_wnftrp_Given ) model->HSM2_wnftrp = 0.0 ; - if ( !model->HSM2_wnfalp_Given ) model->HSM2_wnfalp = 0.0 ; - if ( !model->HSM2_wvdiffj_Given ) model->HSM2_wvdiffj = 0.0 ; - if ( !model->HSM2_wibpc1_Given ) model->HSM2_wibpc1 = 0.0 ; - if ( !model->HSM2_wibpc2_Given ) model->HSM2_wibpc2 = 0.0 ; - - /* Cross-term dependence */ - if ( !model->HSM2_pvmax_Given ) model->HSM2_pvmax = 0.0 ; - if ( !model->HSM2_pbgtmp1_Given ) model->HSM2_pbgtmp1 = 0.0 ; - if ( !model->HSM2_pbgtmp2_Given ) model->HSM2_pbgtmp2 = 0.0 ; - if ( !model->HSM2_peg0_Given ) model->HSM2_peg0 = 0.0 ; - if ( !model->HSM2_plover_Given ) model->HSM2_plover = 0.0 ; - if ( !model->HSM2_pvfbover_Given ) model->HSM2_pvfbover = 0.0 ; - if ( !model->HSM2_pnover_Given ) model->HSM2_pnover = 0.0 ; - if ( !model->HSM2_pwl2_Given ) model->HSM2_pwl2 = 0.0 ; - if ( !model->HSM2_pvfbc_Given ) model->HSM2_pvfbc = 0.0 ; - if ( !model->HSM2_pnsubc_Given ) model->HSM2_pnsubc = 0.0 ; - if ( !model->HSM2_pnsubp_Given ) model->HSM2_pnsubp = 0.0 ; - if ( !model->HSM2_pscp1_Given ) model->HSM2_pscp1 = 0.0 ; - if ( !model->HSM2_pscp2_Given ) model->HSM2_pscp2 = 0.0 ; - if ( !model->HSM2_pscp3_Given ) model->HSM2_pscp3 = 0.0 ; - if ( !model->HSM2_psc1_Given ) model->HSM2_psc1 = 0.0 ; - if ( !model->HSM2_psc2_Given ) model->HSM2_psc2 = 0.0 ; - if ( !model->HSM2_psc3_Given ) model->HSM2_psc3 = 0.0 ; - if ( !model->HSM2_psc4_Given ) model->HSM2_psc4 = 0.0 ; - if ( !model->HSM2_ppgd1_Given ) model->HSM2_ppgd1 = 0.0 ; - if ( !model->HSM2_pndep_Given ) model->HSM2_pndep = 0.0 ; - if ( !model->HSM2_pninv_Given ) model->HSM2_pninv = 0.0 ; - if ( !model->HSM2_pmuecb0_Given ) model->HSM2_pmuecb0 = 0.0 ; - if ( !model->HSM2_pmuecb1_Given ) model->HSM2_pmuecb1 = 0.0 ; - if ( !model->HSM2_pmueph1_Given ) model->HSM2_pmueph1 = 0.0 ; - if ( !model->HSM2_pvtmp_Given ) model->HSM2_pvtmp = 0.0 ; - if ( !model->HSM2_pwvth0_Given ) model->HSM2_pwvth0 = 0.0 ; - if ( !model->HSM2_pmuesr1_Given ) model->HSM2_pmuesr1 = 0.0 ; - if ( !model->HSM2_pmuetmp_Given ) model->HSM2_pmuetmp = 0.0 ; - if ( !model->HSM2_psub1_Given ) model->HSM2_psub1 = 0.0 ; - if ( !model->HSM2_psub2_Given ) model->HSM2_psub2 = 0.0 ; - if ( !model->HSM2_psvds_Given ) model->HSM2_psvds = 0.0 ; - if ( !model->HSM2_psvbs_Given ) model->HSM2_psvbs = 0.0 ; - if ( !model->HSM2_psvgs_Given ) model->HSM2_psvgs = 0.0 ; - if ( !model->HSM2_pnsti_Given ) model->HSM2_pnsti = 0.0 ; - if ( !model->HSM2_pwsti_Given ) model->HSM2_pwsti = 0.0 ; - if ( !model->HSM2_pscsti1_Given ) model->HSM2_pscsti1 = 0.0 ; - if ( !model->HSM2_pscsti2_Given ) model->HSM2_pscsti2 = 0.0 ; - if ( !model->HSM2_pvthsti_Given ) model->HSM2_pvthsti = 0.0 ; - if ( !model->HSM2_pmuesti1_Given ) model->HSM2_pmuesti1 = 0.0 ; - if ( !model->HSM2_pmuesti2_Given ) model->HSM2_pmuesti2 = 0.0 ; - if ( !model->HSM2_pmuesti3_Given ) model->HSM2_pmuesti3 = 0.0 ; - if ( !model->HSM2_pnsubpsti1_Given ) model->HSM2_pnsubpsti1 = 0.0 ; - if ( !model->HSM2_pnsubpsti2_Given ) model->HSM2_pnsubpsti2 = 0.0 ; - if ( !model->HSM2_pnsubpsti3_Given ) model->HSM2_pnsubpsti3 = 0.0 ; - if ( !model->HSM2_pnsubcsti1_Given ) model->HSM2_pnsubcsti1 = 0.0 ; - if ( !model->HSM2_pnsubcsti2_Given ) model->HSM2_pnsubcsti2 = 0.0 ; - if ( !model->HSM2_pnsubcsti3_Given ) model->HSM2_pnsubcsti3 = 0.0 ; - if ( !model->HSM2_pcgso_Given ) model->HSM2_pcgso = 0.0 ; - if ( !model->HSM2_pcgdo_Given ) model->HSM2_pcgdo = 0.0 ; - if ( !model->HSM2_pjs0_Given ) model->HSM2_pjs0 = 0.0 ; - if ( !model->HSM2_pjs0sw_Given ) model->HSM2_pjs0sw = 0.0 ; - if ( !model->HSM2_pnj_Given ) model->HSM2_pnj = 0.0 ; - if ( !model->HSM2_pcisbk_Given ) model->HSM2_pcisbk = 0.0 ; - if ( !model->HSM2_pclm1_Given ) model->HSM2_pclm1 = 0.0 ; - if ( !model->HSM2_pclm2_Given ) model->HSM2_pclm2 = 0.0 ; - if ( !model->HSM2_pclm3_Given ) model->HSM2_pclm3 = 0.0 ; - if ( !model->HSM2_pwfc_Given ) model->HSM2_pwfc = 0.0 ; - if ( !model->HSM2_pgidl1_Given ) model->HSM2_pgidl1 = 0.0 ; - if ( !model->HSM2_pgidl2_Given ) model->HSM2_pgidl2 = 0.0 ; - if ( !model->HSM2_pgleak1_Given ) model->HSM2_pgleak1 = 0.0 ; - if ( !model->HSM2_pgleak2_Given ) model->HSM2_pgleak2 = 0.0 ; - if ( !model->HSM2_pgleak3_Given ) model->HSM2_pgleak3 = 0.0 ; - if ( !model->HSM2_pgleak6_Given ) model->HSM2_pgleak6 = 0.0 ; - if ( !model->HSM2_pglksd1_Given ) model->HSM2_pglksd1 = 0.0 ; - if ( !model->HSM2_pglksd2_Given ) model->HSM2_pglksd2 = 0.0 ; - if ( !model->HSM2_pglkb1_Given ) model->HSM2_pglkb1 = 0.0 ; - if ( !model->HSM2_pglkb2_Given ) model->HSM2_pglkb2 = 0.0 ; - if ( !model->HSM2_pnftrp_Given ) model->HSM2_pnftrp = 0.0 ; - if ( !model->HSM2_pnfalp_Given ) model->HSM2_pnfalp = 0.0 ; - if ( !model->HSM2_pvdiffj_Given ) model->HSM2_pvdiffj = 0.0 ; - if ( !model->HSM2_pibpc1_Given ) model->HSM2_pibpc1 = 0.0 ; - if ( !model->HSM2_pibpc2_Given ) model->HSM2_pibpc2 = 0.0 ; - - if (!model->HSM2vgsMaxGiven) model->HSM2vgsMax = 1e99; - if (!model->HSM2vgdMaxGiven) model->HSM2vgdMax = 1e99; - if (!model->HSM2vgbMaxGiven) model->HSM2vgbMax = 1e99; - if (!model->HSM2vdsMaxGiven) model->HSM2vdsMax = 1e99; - if (!model->HSM2vbsMaxGiven) model->HSM2vbsMax = 1e99; - if (!model->HSM2vbdMaxGiven) model->HSM2vbdMax = 1e99; - if (!model->HSM2vgsrMaxGiven) model->HSM2vgsrMax = 1e99; - if (!model->HSM2vgdrMaxGiven) model->HSM2vgdrMax = 1e99; - if (!model->HSM2vgbrMaxGiven) model->HSM2vgbrMax = 1e99; - if (!model->HSM2vbsrMaxGiven) model->HSM2vbsrMax = 1e99; - if (!model->HSM2vbdrMaxGiven) model->HSM2vbdrMax = 1e99; - - if ( model->HSM2_codep ) { - RANGERESET(model->HSM2_ndepm, 5e15, 2e17, "NDEPM" ) ; - RANGERESET(model->HSM2_tndep, 1e-7, 1e-6, "TNDEP" ) ; - RANGECHECK(model->HSM2_depleak, 0.0, 10.0, "DEPLEAK" ) ; - - if( model->HSM2_corecip ) { - printf("warning(HiSIM): CORECIP is not supported yet in depletion mode MOSFET, reset to 0.\n"); - model->HSM2_corecip = 0; - } - if( model->HSM2_copprv ) { - printf("warning(HiSIM): COPPRV is not supported yet in depletion mode MOSFET, reset to 0.\n"); - model->HSM2_copprv = 0; - } - if( model->HSM2_corsrd == 1 ) { - printf("warning(HiSIM): CORSRD=1 is not supported yet in depletion mode MOSFET, reset to -1.\n"); - model->HSM2_corsrd = -1; - } - if( model->HSM2_coisti ) { - printf("warning(HiSIM): STI leak model is not supported yet in depletion mode MOSFET, skipped\n"); - model->HSM2_coisti = 0 ; - } - if( model->HSM2_cothrml ) { - printf("warning(HiSIM): Thermal noise model is not supported yet in depletion mode MOSFET, skipped\n"); - model->HSM2_cothrml = 0 ; - } - if( model->HSM2_coign ) { - printf("warning(HiSIM): Induced gate noise model is not supported yet in depletion mode MOSFET, skipped\n"); - model->HSM2_coign = 0 ; - } - } - if ( model->HSM2_corecip ){ - model->HSM2_sc2 = 0.0 ; model->HSM2_lsc2 = 0.0 ; model->HSM2_wsc2 = 0.0 ; model->HSM2_psc2 = 0.0 ; - model->HSM2_scp2 = 0.0 ; model->HSM2_lscp2 = 0.0 ; model->HSM2_wscp2 = 0.0 ; model->HSM2_pscp2 = 0.0 ; - model->HSM2_sc4 = 0.0 ; model->HSM2_lsc4 = 0.0 ; model->HSM2_wsc4 = 0.0 ; model->HSM2_psc4 = 0.0 ; - model->HSM2_coqy = 0 ; - } - - modelMKS = &model->modelMKS ; - - /* loop through all the instances of the model */ - for ( here = HSM2instances(model);here != NULL ; - here = HSM2nextInstance(here)) { - /* allocate a chunk of the state vector */ - here->HSM2states = *states; - if (model->HSM2_conqs) - *states += HSM2numStatesNqs; - else - *states += HSM2numStates; - - hereMKS = &here->hereMKS ; - /* perform the parameter defaulting */ - if ( !here->HSM2_l_Given ) here->HSM2_l = 5.0e-6 ; - if ( !here->HSM2_w_Given ) here->HSM2_w = 5.0e-6 ; - if ( !here->HSM2_ad_Given ) here->HSM2_ad = 0.0 ; - if ( !here->HSM2_as_Given ) here->HSM2_as = 0.0 ; - if ( !here->HSM2_pd_Given ) here->HSM2_pd = 0.0 ; - if ( !here->HSM2_ps_Given ) here->HSM2_ps = 0.0 ; - if ( !here->HSM2_nrd_Given ) here->HSM2_nrd = 0.0 ; - if ( !here->HSM2_nrs_Given ) here->HSM2_nrs = 0.0 ; - if ( !here->HSM2_ngcon_Given ) here->HSM2_ngcon = 1.0 ; - if ( !here->HSM2_xgw_Given ) here->HSM2_xgw = 0e0 ; - if ( !here->HSM2_xgl_Given ) here->HSM2_xgl = 0e0 ; - if ( !here->HSM2_nf_Given ) here->HSM2_nf = 1.0 ; - if ( !here->HSM2_sa_Given ) here->HSM2_sa = 0 ; - if ( !here->HSM2_sb_Given ) here->HSM2_sb = 0 ; - if ( !here->HSM2_sd_Given ) here->HSM2_sd = 0 ; - if ( !here->HSM2_temp_Given ) here->HSM2_temp = 27.0 ; /* [C] */ - if ( !here->HSM2_dtemp_Given ) here->HSM2_dtemp = 0.0 ; - - if ( !here->HSM2_icVBS_Given ) here->HSM2_icVBS = 0.0; - if ( !here->HSM2_icVDS_Given ) here->HSM2_icVDS = 0.0; - if ( !here->HSM2_icVGS_Given ) here->HSM2_icVGS = 0.0; - - if ( !here->HSM2_corbnet_Given ) - here->HSM2_corbnet = model->HSM2_corbnet ; - else if ( here->HSM2_corbnet != 0 && here->HSM2_corbnet != 1 ) { - here->HSM2_corbnet = model->HSM2_corbnet ; - if(model->HSM2_coerrrep) - printf("warning(HiSIM): CORBNET has been set to its default value: %d.\n", here->HSM2_corbnet); - } - if ( !here->HSM2_rbdb_Given) here->HSM2_rbdb = model->HSM2_rbdb; /* in ohm */ - if ( !here->HSM2_rbsb_Given) here->HSM2_rbsb = model->HSM2_rbsb; - if ( !here->HSM2_rbpb_Given) here->HSM2_rbpb = model->HSM2_rbpb; - if ( !here->HSM2_rbps_Given) here->HSM2_rbps = model->HSM2_rbps; - if ( !here->HSM2_rbpd_Given) here->HSM2_rbpd = model->HSM2_rbpd; - - if ( !here->HSM2_corg_Given ) - here->HSM2_corg = model->HSM2_corg ; - else if ( here->HSM2_corg != 0 && here->HSM2_corg != 1 ) { - here->HSM2_corg = model->HSM2_corg ; - if(model->HSM2_coerrrep) - printf("warning(HiSIM): CORG has been set to its default value: %d.\n", here->HSM2_corg); - } - - if ( !here->HSM2_mphdfm_Given ) here->HSM2_mphdfm = model->HSM2_mphdfm ; - if ( !here->HSM2_m_Given ) here->HSM2_m = 1.0 ; - - /* WPE */ - if ( !here->HSM2_sca_Given ) here->HSM2_sca = 0.0 ; /* default value */ - if ( !here->HSM2_scb_Given ) here->HSM2_scb = 0.0 ; /* default value */ - if ( !here->HSM2_scc_Given ) here->HSM2_scc = 0.0 ; /* default value */ - - /* process drain series resistance */ - if ((model->HSM2_corsrd < 0 && - (model->HSM2_rsh > 0.0 || model->HSM2_rd > 0.0))) { - if(here->HSM2dNodePrime <= 0) { - error = CKTmkVolt(ckt, &tmp, here->HSM2name, "drain"); - if (error) return(error); - here->HSM2dNodePrime = tmp->number; - } - } else { - here->HSM2dNodePrime = here->HSM2dNode; - } - - /* process source series resistance */ - if ((model->HSM2_corsrd < 0 && - (model->HSM2_rsh > 0.0 || model->HSM2_rs > 0.0))) { - if(here->HSM2sNodePrime == 0) { - error = CKTmkVolt(ckt, &tmp, here->HSM2name, "source"); - if (error) return(error); - here->HSM2sNodePrime = tmp->number; - } - } else { - here->HSM2sNodePrime = here->HSM2sNode; - } - - /* process gate resistance */ - if ((here->HSM2_corg == 1 && model->HSM2_rshg > 0.0)) { - if(here->HSM2gNodePrime <= 0) { - error = CKTmkVolt(ckt, &tmp, here->HSM2name, "gate"); - if (error) return(error); - here->HSM2gNodePrime = tmp->number; - } - } else { - here->HSM2gNodePrime = here->HSM2gNode; - } - - /* internal body nodes for body resistance model */ - if ( here->HSM2_corbnet == 1 ) { - if (here->HSM2dbNode == 0) { - error = CKTmkVolt(ckt, &tmp, here->HSM2name, "dbody"); - if (error) return(error); - here->HSM2dbNode = tmp->number; - } - if (here->HSM2bNodePrime == 0) { - error = CKTmkVolt(ckt, &tmp,here->HSM2name, "body"); - if (error) return(error); - here->HSM2bNodePrime = tmp->number; - } - if (here->HSM2sbNode == 0) { - error = CKTmkVolt(ckt, &tmp, here->HSM2name,"sbody"); - if (error) return(error); - here->HSM2sbNode = tmp->number; - } - } else { - here->HSM2dbNode = here->HSM2bNodePrime = here->HSM2sbNode = here->HSM2bNode; - } - - /* set Sparse Matrix Pointers */ - - /* macro to make elements with built in test for out of memory */ -#define TSTALLOC(ptr,first,second) \ -do { if((here->ptr = SMPmakeElt(matrix,here->first,here->second))==(double *)NULL){\ - return(E_NOMEM);\ -} } while(0) - - TSTALLOC(HSM2DPbpPtr, HSM2dNodePrime, HSM2bNodePrime); - TSTALLOC(HSM2SPbpPtr, HSM2sNodePrime, HSM2bNodePrime); - TSTALLOC(HSM2GPbpPtr, HSM2gNodePrime, HSM2bNodePrime); - - TSTALLOC(HSM2BPdpPtr, HSM2bNodePrime, HSM2dNodePrime); - TSTALLOC(HSM2BPspPtr, HSM2bNodePrime, HSM2sNodePrime); - TSTALLOC(HSM2BPgpPtr, HSM2bNodePrime, HSM2gNodePrime); - TSTALLOC(HSM2BPbpPtr, HSM2bNodePrime, HSM2bNodePrime); - - TSTALLOC(HSM2DdPtr, HSM2dNode, HSM2dNode); - TSTALLOC(HSM2GPgpPtr, HSM2gNodePrime, HSM2gNodePrime); - TSTALLOC(HSM2SsPtr, HSM2sNode, HSM2sNode); - TSTALLOC(HSM2DPdpPtr, HSM2dNodePrime, HSM2dNodePrime); - TSTALLOC(HSM2SPspPtr, HSM2sNodePrime, HSM2sNodePrime); - TSTALLOC(HSM2DdpPtr, HSM2dNode, HSM2dNodePrime); - TSTALLOC(HSM2GPdpPtr, HSM2gNodePrime, HSM2dNodePrime); - TSTALLOC(HSM2GPspPtr, HSM2gNodePrime, HSM2sNodePrime); - TSTALLOC(HSM2SspPtr, HSM2sNode, HSM2sNodePrime); - TSTALLOC(HSM2DPspPtr, HSM2dNodePrime, HSM2sNodePrime); - TSTALLOC(HSM2DPdPtr, HSM2dNodePrime, HSM2dNode); - TSTALLOC(HSM2DPgpPtr, HSM2dNodePrime, HSM2gNodePrime); - TSTALLOC(HSM2SPgpPtr, HSM2sNodePrime, HSM2gNodePrime); - TSTALLOC(HSM2SPsPtr, HSM2sNodePrime, HSM2sNode); - TSTALLOC(HSM2SPdpPtr, HSM2sNodePrime, HSM2dNodePrime); - - if ( here->HSM2_corg == 1 ) { - TSTALLOC(HSM2GgPtr, HSM2gNode, HSM2gNode); - TSTALLOC(HSM2GgpPtr, HSM2gNode, HSM2gNodePrime); - TSTALLOC(HSM2GPgPtr, HSM2gNodePrime, HSM2gNode); - TSTALLOC(HSM2GdpPtr, HSM2gNode, HSM2dNodePrime); - TSTALLOC(HSM2GspPtr, HSM2gNode, HSM2sNodePrime); - TSTALLOC(HSM2GbpPtr, HSM2gNode, HSM2bNodePrime); - } - - if ( here->HSM2_corbnet == 1 ) { /* consider body resistance net */ - TSTALLOC(HSM2DPdbPtr, HSM2dNodePrime, HSM2dbNode); - TSTALLOC(HSM2SPsbPtr, HSM2sNodePrime, HSM2sbNode); - - TSTALLOC(HSM2DBdpPtr, HSM2dbNode, HSM2dNodePrime); - TSTALLOC(HSM2DBdbPtr, HSM2dbNode, HSM2dbNode); - TSTALLOC(HSM2DBbpPtr, HSM2dbNode, HSM2bNodePrime); - TSTALLOC(HSM2DBbPtr, HSM2dbNode, HSM2bNode); - - TSTALLOC(HSM2BPdbPtr, HSM2bNodePrime, HSM2dbNode); - TSTALLOC(HSM2BPbPtr, HSM2bNodePrime, HSM2bNode); - TSTALLOC(HSM2BPsbPtr, HSM2bNodePrime, HSM2sbNode); - - TSTALLOC(HSM2SBspPtr, HSM2sbNode, HSM2sNodePrime); - TSTALLOC(HSM2SBbpPtr, HSM2sbNode, HSM2bNodePrime); - TSTALLOC(HSM2SBbPtr, HSM2sbNode, HSM2bNode); - TSTALLOC(HSM2SBsbPtr, HSM2sbNode, HSM2sbNode); - - TSTALLOC(HSM2BdbPtr, HSM2bNode, HSM2dbNode); - TSTALLOC(HSM2BbpPtr, HSM2bNode, HSM2bNodePrime); - TSTALLOC(HSM2BsbPtr, HSM2bNode, HSM2sbNode); - TSTALLOC(HSM2BbPtr, HSM2bNode, HSM2bNode); - } - - - /*-----------------------------------------------------------* - * Range check of instance parameters - *-----------------*/ - RANGECHECK(here->HSM2_l, model->HSM2_lmin, model->HSM2_lmax, "L") ; - RANGECHECK(here->HSM2_w/here->HSM2_nf, model->HSM2_wmin, model->HSM2_wmax, "W/NF") ; - RANGECHECK(here->HSM2_mphdfm, -3.0, 3.0, "MPHDFM") ; - - - /*-----------------------------------------------------------* - * Change unit into Kelvin. - *-----------------*/ - here->HSM2_ktemp = here->HSM2_temp + 273.15 ; /* [C] -> [K] */ - - here->HSM2_lgate = Lgate = here->HSM2_l + model->HSM2_xl ; - here->HSM2_wgate = Wgate = here->HSM2_w / here->HSM2_nf + model->HSM2_xw ; - - here->HSM2_lg = LG = Lgate * C_m2um ; - here->HSM2_wg = WG = Wgate * C_m2um ; - - /* binning calculation */ - pParam = &here->pParam ; - Lbin = pow(LG, model->HSM2_lbinn) ; - Wbin = pow(WG, model->HSM2_wbinn) ; - LWbin = Lbin * Wbin ; - - BINNING(vmax); - BINNING(bgtmp1); - BINNING(bgtmp2); - BINNING(eg0); - BINNING(lover); - BINNING(vfbover); - BINNING(nover); - BINNING(wl2); - BINNING(vfbc); - BINNING(nsubc); - BINNING(nsubp); - BINNING(scp1); - BINNING(scp2); - BINNING(scp3); - BINNING(sc1); - BINNING(sc2); - BINNING(sc3); - BINNING(sc4); - BINNING(pgd1); - BINNING(ndep); - BINNING(ninv); - BINNING(muecb0); - BINNING(muecb1); - BINNING(mueph1); - BINNING(vtmp); - BINNING(wvth0); - BINNING(muesr1); - BINNING(muetmp); - BINNING(sub1); - BINNING(sub2); - BINNING(svds); - BINNING(svbs); - BINNING(svgs); - BINNING(nsti); - BINNING(wsti); - BINNING(scsti1); - BINNING(scsti2); - BINNING(vthsti); - BINNING(muesti1); - BINNING(muesti2); - BINNING(muesti3); - BINNING(nsubpsti1); - BINNING(nsubpsti2); - BINNING(nsubpsti3); - BINNING(nsubcsti1); - BINNING(nsubcsti2); - BINNING(nsubcsti3); - BINNING(cgso); - BINNING(cgdo); - BINNING(js0); - BINNING(js0sw); - BINNING(nj); - BINNING(cisbk); - BINNING(clm1); - BINNING(clm2); - BINNING(clm3); - BINNING(wfc); - BINNING(gidl1); - BINNING(gidl2); - BINNING(gleak1); - BINNING(gleak2); - BINNING(gleak3); - BINNING(gleak6); - BINNING(glksd1); - BINNING(glksd2); - BINNING(glkb1); - BINNING(glkb2); - BINNING(nftrp); - BINNING(nfalp); - BINNING(vdiffj); - BINNING(ibpc1); - BINNING(ibpc2); - - /*-----------------------------------------------------------* - * Range check of binning parameters - *-----------------*/ - RANGECHECK(pParam->HSM2_vmax, 1.0e5, 20.0e6, "VMAX") ; - RANGECHECK(pParam->HSM2_bgtmp1, 50.0e-6, 1.0e-3, "BGTMP1") ; - RANGECHECK(pParam->HSM2_bgtmp2, -1.0e-6, 1.0e-6, "BGTMP2") ; - RANGECHECK(pParam->HSM2_eg0, 1.0, 1.3, "EG0") ; - if( model->HSM2_codep == 0 ) - { RANGECHECK(pParam->HSM2_vfbc, -1.2, 0.0, "VFBC") ; } - else { RANGECHECK(pParam->HSM2_vfbc, -1.2, 0.8, "VFBC") ; } - RANGECHECK(pParam->HSM2_vfbover, -0.2, 0.2, "VFBOVER") ; - RANGECHECK(pParam->HSM2_nsubc, 1.0e16, 1.0e19, "NSUBC") ; - RANGECHECK(pParam->HSM2_nsubp, 1.0e16, 1.0e19, "NSUBP") ; - RANGECHECK(pParam->HSM2_scp1, 0.0, 20.0, "SCP1") ; - RANGECHECK(pParam->HSM2_scp2, 0.0, 2.0, "SCP2") ; - RANGECHECK(pParam->HSM2_scp3, 0.0, 100.0e-9, "SCP3") ; - RANGECHECK(pParam->HSM2_sc1, 0.0, 20.0, "SC1") ; - RANGECHECK(pParam->HSM2_sc2, 0.0, 2.0, "SC2") ; - RANGECHECK(pParam->HSM2_sc3, 0.0, 200.0e-9, "SC3") ; - RANGECHECK(pParam->HSM2_pgd1, 0.0, 50.0e-3, "PGD1") ; - RANGECHECK(pParam->HSM2_ndep, 0.0, 1.0, "NDEP") ; - RANGECHECK(pParam->HSM2_ninv, 0.0, 1.0, "NINV") ; - RANGECHECK(pParam->HSM2_muecb0, 10.0, 100.0e3, "MUECB0") ; - RANGECHECK(pParam->HSM2_muecb1, 5.0, 1.0e4, "MUECB1") ; - RANGECHECK(pParam->HSM2_mueph1, 2.0e3, 35.0e3, "MUEPH1") ; - RANGECHECK(pParam->HSM2_vtmp, -5.0, 1.0, "VTMP") ; - RANGECHECK(pParam->HSM2_muesr1, 1.0e13, 1.0e16, "MUESR1") ; - RANGECHECK(pParam->HSM2_muetmp, 0.5, 2.0, "MUETMP") ; - RANGECHECK(pParam->HSM2_clm1, 0.5, 1.0, "CLM1") ; - RANGECHECK(pParam->HSM2_clm2, 1.0, 4.0, "CLM2") ; - RANGECHECK(pParam->HSM2_clm3, 0.5, 5.0, "CLM3") ; - RANGECHECK(pParam->HSM2_wfc, -5.0e-15, 1.0e-6, "WFC") ; - RANGECHECK(pParam->HSM2_cgso, 0.0, 100e-9 * 100*C_VAC*model->HSM2_kappa/model->HSM2_tox*C_m2cm, "CGSO") ; - RANGECHECK(pParam->HSM2_cgdo, 0.0, 100e-9 * 100*C_VAC*model->HSM2_kappa/model->HSM2_tox*C_m2cm, "CGDO") ; - RANGECHECK(pParam->HSM2_ibpc1, 0.0, 1.0e12, "IBPC1") ; - RANGECHECK(pParam->HSM2_ibpc2, 0.0, 1.0e12, "IBPC2") ; - RANGECHECK(pParam->HSM2_nsti, 1.0e16, 1.0e19, "NSTI") ; - - /*-----------------------------------------------------------* - * Lg dependence of binning parameters - *-----------------*/ - - /* Vfbc */ - pParam->HSM2_vfbc = pParam->HSM2_vfbc - * (1.0e0 + (model->HSM2_vfbcl / pow (LG, model->HSM2_vfbclp))) ; - - /*-----------------------------------------------------------* - * Conversion to MKS unit for instance parameters. - *-----------------*/ - hereMKS->HSM2_nsubcdfm = here->HSM2_nsubcdfm / C_cm2m_p3 ; - - pParam->HSM2_nsubc = pParam->HSM2_nsubc / C_cm2m_p3 ; - pParam->HSM2_nsubp = pParam->HSM2_nsubp / C_cm2m_p3 ; - pParam->HSM2_nsti = pParam->HSM2_nsti / C_cm2m_p3 ; - pParam->HSM2_nover = pParam->HSM2_nover / C_cm2m_p3 ; - pParam->HSM2_nsubpsti1 = pParam->HSM2_nsubpsti1 / C_m2cm ; - pParam->HSM2_nsubcsti1 = pParam->HSM2_nsubcsti1 / C_m2cm ; - pParam->HSM2_muesti1 = pParam->HSM2_muesti1 / C_m2cm ; - - pParam->HSM2_vmax = pParam->HSM2_vmax / C_m2cm ; - pParam->HSM2_wfc = pParam->HSM2_wfc * C_m2cm_p2 ; - pParam->HSM2_glksd1 = pParam->HSM2_glksd1 / C_m2cm ; - pParam->HSM2_glksd2 = pParam->HSM2_glksd2 * C_m2cm ; - pParam->HSM2_gleak2 = pParam->HSM2_gleak2 * C_m2cm ; - pParam->HSM2_glkb2 = pParam->HSM2_glkb2 * C_m2cm ; - pParam->HSM2_gidl1 = pParam->HSM2_gidl1 / C_m2cm_p1o2 ; - pParam->HSM2_gidl2 = pParam->HSM2_gidl2 * C_m2cm ; - pParam->HSM2_nfalp = pParam->HSM2_nfalp / C_m2cm ; - pParam->HSM2_nftrp = pParam->HSM2_nftrp * C_m2cm_p2 ; - - } /* End of instance */ - - /*-----------------------------------------------------------* - * Range check of model parameters - *-----------------*/ - MINCHECK (model->HSM2_tox, 0.0, "TOX") ; - RANGECHECK(model->HSM2_xld, 0.0, 50.0e-9, "XLD") ; - RANGECHECK(model->HSM2_xwd, -10.0e-9, 100.0e-9, "XWD") ; - RANGECHECK(model->HSM2_rsh, 0.0, 200.0, "RSH") ; /* fix in version 2.80 */ - RANGECHECK(model->HSM2_rshg, 0.0, 100.0, "RSHG") ; - RANGECHECK(model->HSM2_xqy, 10.0e-9, 50.0e-9, "XQY") ; - RANGECHECK(model->HSM2_rs, 0.0, 10.0e-3, "RS") ; - RANGECHECK(model->HSM2_rd, 0.0, 10.0e-3, "RD") ; - RANGECHECK(model->HSM2_vbi, 1.0, 1.2, "VBI") ; - RANGECHECK(model->HSM2_parl2, 0.0, 50.0e-9, "PARL2") ; - RANGECHECK(model->HSM2_lp, 0.0, 300.0e-9, "LP") ; - RANGECHECK(model->HSM2_pgd2, 0.0, 1.5, "PGD2") ; - RANGECHECK(model->HSM2_pgd4, 0.0, 3.0, "PGD4") ; - RANGECHECK(model->HSM2_muecb0lp, 0.0, 2.0, "MUECB0LP") ; - RANGECHECK(model->HSM2_muecb1lp, 0.0, 2.0, "MUECB1LP") ; - RANGECHECK(model->HSM2_mueph0, 0.25, 0.35, "MUEPH0") ; - RANGECHECK(model->HSM2_muesr0, 1.8, 2.2, "MUESR0") ; - RANGECHECK(model->HSM2_lpext, 1.0e-50, 10.0e-6, "LPEXT") ; - RANGECHECK(model->HSM2_npext, 1.0e16, 1.0e18, "NPEXT") ; - RANGECHECK(model->HSM2_scp21, 0.0, 5.0, "SCP21") ; - RANGECHECK(model->HSM2_scp22, 0.0, 0.0, "SCP22") ; - RANGECHECK(model->HSM2_bs1, -1.0, 50.0e-3, "BS1") ; - RANGECHECK(model->HSM2_bs2, 0.5, 1.0, "BS2") ; - MINCHECK (model->HSM2_cgbo, 0.0, "CGBO") ; - RANGECHECK(model->HSM2_clm5, 0.0, 2.0, "CLM5") ; - RANGECHECK(model->HSM2_clm6, 0.0, 20.0, "CLM6") ; - RANGECHECK(model->HSM2_vover, 0.0, 50.0, "VOVER") ; - RANGECHECK(model->HSM2_voverp, 0.0, 2.0, "VOVERP") ; - RANGECHECK(model->HSM2_qme1, 0.0, 300.0e-9, "QME1") ; - RANGECHECK(model->HSM2_qme2, 1.0, 3.0, "QME2") ; - RANGECHECK(model->HSM2_qme3, 0.0, 1.0e-9, "QME3") ; - RANGECHECK(model->HSM2_tnom, 22.0, 32.0, "TNOM") ; - RANGECHECK(model->HSM2_ddltmax, 1.0, 20.0, "DDLTMAX") ; - RANGECHECK(model->HSM2_ddltict, -3.0, 20.0, "DDLTICT") ; - RANGECHECK(model->HSM2_ddltslp, 0.0, 20.0, "DDLTSLP") ; - RANGECHECK(model->HSM2_cvb, -0.1, 0.2, "CVB") ; - RANGECHECK(model->HSM2_cvbk, -0.1, 0.2, "CVBK") ; - RANGECHECK(model->HSM2_byptol, 0.0, 1.0, "BYPTOL") ; - RANGECHECK(model->HSM2_sc3Vbs, -3.0, 0.0, "SC3VBS") ; - RANGERESET(model->HSM2_nsubpfac, 0.2, 1.0, "NSUBPFAC") ; - RANGERESET(model->HSM2_nsubpdlt, 1E-50, 0.1, "NSUBPDLT") ; - - /*-----------------------------------------------------------* - * Conversion to MKS unit for model parameters. - *-----------------*/ - modelMKS->HSM2_npext = model->HSM2_npext / C_cm2m_p3 ; - modelMKS->HSM2_nsubcwpe = model->HSM2_nsubcwpe / C_cm2m_p3 ; - modelMKS->HSM2_nsubpwpe = model->HSM2_nsubpwpe / C_cm2m_p3 ; - modelMKS->HSM2_npextwpe = model->HSM2_npextwpe / C_cm2m_p3 ; - modelMKS->HSM2_ll = model->HSM2_ll / pow( C_m2cm , model->HSM2_lln ) ; - modelMKS->HSM2_wl = model->HSM2_wl / pow( C_m2cm , model->HSM2_wln ) ; - modelMKS->HSM2_svgsl = model->HSM2_svgsl / pow( C_m2cm , model->HSM2_svgslp ) ; - modelMKS->HSM2_svgsw = model->HSM2_svgsw / pow( C_m2cm , model->HSM2_svgswp ) ; - modelMKS->HSM2_svbsl = model->HSM2_svbsl / pow( C_m2cm , model->HSM2_svbslp ) ; - modelMKS->HSM2_slgl = model->HSM2_slgl / pow( C_m2cm , model->HSM2_slglp ) ; - modelMKS->HSM2_sub1l = model->HSM2_sub1l / pow( C_m2cm , model->HSM2_sub1lp ) ; - modelMKS->HSM2_slg = model->HSM2_slg / C_m2cm ; - modelMKS->HSM2_sub2l = model->HSM2_sub2l / C_m2cm ; - modelMKS->HSM2_nsubcmax = model->HSM2_nsubcmax / C_cm2m_p3 ; - - modelMKS->HSM2_glksd3 = model->HSM2_glksd3 * C_m2cm ; - modelMKS->HSM2_gleak2 = model->HSM2_gleak2 * C_m2cm ; - modelMKS->HSM2_gleak4 = model->HSM2_gleak4 * C_m2cm ; - modelMKS->HSM2_gleak5 = model->HSM2_gleak5 * C_m2cm ; - modelMKS->HSM2_gleak7 = model->HSM2_gleak7 / C_m2cm_p2 ; - modelMKS->HSM2_cit = model->HSM2_cit * C_m2cm_p2 ; - modelMKS->HSM2_ovslp = model->HSM2_ovslp / C_m2cm ; - modelMKS->HSM2_dly3 = model->HSM2_dly3 / C_m2cm_p2 ; - - modelMKS->HSM2_ndepm = model->HSM2_ndepm / C_cm2m_p3 ; - - /*-----------------------------------------------------------* - * Change unit into Kelvin. - *-----------------*/ - model->HSM2_ktnom = model->HSM2_tnom + 273.15 ; /* [C] -> [K] */ - - /* SourceSatCurrent = 1.0e-14 */ - /* DrainSatCurrent = 1.0e-14 */ - model->HSM2_vcrit = CONSTvt0 * log( CONSTvt0 / (CONSTroot2 * 1.0e-14) ) ; - - /* Quantum Mechanical Effect */ - if ( ( model->HSM2_qme1 == 0.0 && model->HSM2_qme3 == 0.0 ) || model->HSM2_qme2 == 0.0 ) { - model->HSM2_flg_qme = 0 ; - } else { - model->HSM2_flg_qme = 1 ; - model->HSM2_qme12 = model->HSM2_qme1 / ( model->HSM2_qme2 * model->HSM2_qme2 ) ; - } - - } /* End of model */ - -#ifdef USE_OMP - InstCount = 0; - model = (HSM2model*)inModel; - /* loop through all the HSM2 device models - to count the number of instances */ - - for ( ; model != NULL; model = HSM2nextModel(model)) - { - /* loop through all the instances of the model */ - for (here = HSM2instances(model); here != NULL ; - here = HSM2nextInstance(here)) - { - InstCount++; - } - model->HSM2InstCount = 0; - model->HSM2InstanceArray = NULL; - } - InstArray = TMALLOC(HSM2instance*, InstCount); - model = (HSM2model*)inModel; - /* store this in the first model only */ - model->HSM2InstCount = InstCount; - model->HSM2InstanceArray = InstArray; - idx = 0; - for ( ; model != NULL; model = HSM2nextModel(model)) - { - /* loop through all the instances of the model */ - for (here = HSM2instances(model); here != NULL ; - here = HSM2nextInstance(here)) - { - InstArray[idx] = here; - idx++; - } - } -#endif - - return(OK); -} - -int -HSM2unsetup( - GENmodel *inModel, - CKTcircuit *ckt) -{ -#ifndef HAS_BATCHSIM - HSM2model *model; - HSM2instance *here; - - for (model = (HSM2model *)inModel; model != NULL; - model = HSM2nextModel(model)) - { - for (here = HSM2instances(model); here != NULL; - here=HSM2nextInstance(here)) - { - if (here->HSM2sbNode > 0 - && here->HSM2sbNode != here->HSM2bNode) - CKTdltNNum(ckt, here->HSM2sbNode); - here->HSM2sbNode = 0; - - if (here->HSM2bNodePrime > 0 - && here->HSM2bNodePrime != here->HSM2bNode) - CKTdltNNum(ckt, here->HSM2bNodePrime); - here->HSM2bNodePrime = 0; - - if (here->HSM2dbNode > 0 - && here->HSM2dbNode != here->HSM2bNode) - CKTdltNNum(ckt, here->HSM2dbNode); - here->HSM2dbNode = 0; - - if (here->HSM2gNodePrime > 0 - && here->HSM2gNodePrime != here->HSM2gNode) - CKTdltNNum(ckt, here->HSM2gNodePrime); - here->HSM2gNodePrime = 0; - - if (here->HSM2sNodePrime > 0 - && here->HSM2sNodePrime != here->HSM2sNode) - CKTdltNNum(ckt, here->HSM2sNodePrime); - here->HSM2sNodePrime = 0; - - if (here->HSM2dNodePrime > 0 - && here->HSM2dNodePrime != here->HSM2dNode) - CKTdltNNum(ckt, here->HSM2dNodePrime); - here->HSM2dNodePrime = 0; - } - } -#endif - return OK; -} diff --git a/src/spicelib/devices/hisim2/hsm2soachk.c b/src/spicelib/devices/hisim2/hsm2soachk.c deleted file mode 100644 index ae12d0f48..000000000 --- a/src/spicelib/devices/hisim2/hsm2soachk.c +++ /dev/null @@ -1,341 +0,0 @@ -/********** -Copyright 2013 Dietmar Warning. All rights reserved. -Author: 2013 Dietmar Warning -**********/ - -#include "ngspice/ngspice.h" -#include "ngspice/cktdefs.h" -#include "hsm2def.h" -#include "ngspice/trandefs.h" -#include "ngspice/sperror.h" -#include "ngspice/suffix.h" -#include "ngspice/cpdefs.h" - - -int -HSM2soaCheck(CKTcircuit *ckt, GENmodel *inModel) -{ - HSM2model *model = (HSM2model *) inModel; - HSM2instance *here; - double vgs, vgd, vgb, vds, vbs, vbd; /* actual mos voltages */ - int maxwarns; - static int warns_vgs = 0, warns_vgd = 0, warns_vgb = 0, warns_vds = 0, warns_vbs = 0, warns_vbd = 0; - - if (!ckt) { - warns_vgs = 0; - warns_vgd = 0; - warns_vgb = 0; - warns_vds = 0; - warns_vbs = 0; - warns_vbd = 0; - return OK; - } - - maxwarns = ckt->CKTsoaMaxWarns; - - for (; model; model = HSM2nextModel(model)) { - - for (here = HSM2instances(model); here; here = HSM2nextInstance(here)) { - - vgs = ckt->CKTrhsOld [here->HSM2gNode] - - ckt->CKTrhsOld [here->HSM2sNodePrime]; - - vgd = ckt->CKTrhsOld [here->HSM2gNode] - - ckt->CKTrhsOld [here->HSM2dNodePrime]; - - vgb = ckt->CKTrhsOld [here->HSM2gNode] - - ckt->CKTrhsOld [here->HSM2bNodePrime]; - - vds = ckt->CKTrhsOld [here->HSM2dNode] - - ckt->CKTrhsOld [here->HSM2sNodePrime]; - - vbs = ckt->CKTrhsOld [here->HSM2bNode] - - ckt->CKTrhsOld [here->HSM2sNodePrime]; - - vbd = ckt->CKTrhsOld [here->HSM2bNode] - - ckt->CKTrhsOld [here->HSM2dNodePrime]; - - if (!model->HSM2vgsrMaxGiven) { - if (fabs(vgs) > model->HSM2vgsMax) - if (warns_vgs < maxwarns) { - soa_printf(ckt, (GENinstance*) here, - "Vgs=%g has exceeded Vgs_max=%g\n", - vgs, model->HSM2vgsMax); - warns_vgs++; - } - if (!model->HSM2vgbMaxGiven) { - if (fabs(vgb) > model->HSM2vgsMax) - if (warns_vgb < maxwarns) { - soa_printf(ckt, (GENinstance*) here, - "Vgb=%g has exceeded Vgs_max=%g\n", - vgb, model->HSM2vgsMax); - warns_vgb++; - } - } else { - if (fabs(vgb) > model->HSM2vgbMax) - if (warns_vgb < maxwarns) { - soa_printf(ckt, (GENinstance*) here, - "Vgb=%g has exceeded Vgb_max=%g\n", - vgb, model->HSM2vgbMax); - warns_vgb++; - } - } - } else { - if (model->HSM2_type > 0) { - if (vgs > model->HSM2vgsMax) - if (warns_vgs < maxwarns) { - soa_printf(ckt, (GENinstance*) here, - "Vgs=%g has exceeded Vgs_max=%g\n", - vgs, model->HSM2vgsMax); - warns_vgs++; - } - if (-1*vgs > model->HSM2vgsrMax) - if (warns_vgs < maxwarns) { - soa_printf(ckt, (GENinstance*) here, - "Vgs=%g has exceeded Vgsr_max=%g\n", - vgs, model->HSM2vgsrMax); - warns_vgs++; - } - } else { - if (vgs > model->HSM2vgsrMax) - if (warns_vgs < maxwarns) { - soa_printf(ckt, (GENinstance*) here, - "Vgs=%g has exceeded Vgsr_max=%g\n", - vgs, model->HSM2vgsrMax); - warns_vgs++; - } - if (-1*vgs > model->HSM2vgsMax) - if (warns_vgs < maxwarns) { - soa_printf(ckt, (GENinstance*) here, - "Vgs=%g has exceeded Vgs_max=%g\n", - vgs, model->HSM2vgsMax); - warns_vgs++; - } - } - } - - if (!model->HSM2vgdrMaxGiven) { - if (fabs(vgd) > model->HSM2vgdMax) - if (warns_vgd < maxwarns) { - soa_printf(ckt, (GENinstance*) here, - "Vgd=%g has exceeded Vgd_max=%g\n", - vgd, model->HSM2vgdMax); - warns_vgd++; - } - } else { - if (model->HSM2_type > 0) { - if (vgd > model->HSM2vgdMax) - if (warns_vgd < maxwarns) { - soa_printf(ckt, (GENinstance*) here, - "Vgd=%g has exceeded Vgd_max=%g\n", - vgd, model->HSM2vgdMax); - warns_vgd++; - } - if (-1*vgd > model->HSM2vgdrMax) - if (warns_vgd < maxwarns) { - soa_printf(ckt, (GENinstance*) here, - "Vgd=%g has exceeded Vgdr_max=%g\n", - vgd, model->HSM2vgdrMax); - warns_vgd++; - } - } else { - if (vgd > model->HSM2vgdrMax) - if (warns_vgd < maxwarns) { - soa_printf(ckt, (GENinstance*) here, - "Vgd=%g has exceeded Vgdr_max=%g\n", - vgd, model->HSM2vgdrMax); - warns_vgd++; - } - if (-1*vgd > model->HSM2vgdMax) - if (warns_vgd < maxwarns) { - soa_printf(ckt, (GENinstance*) here, - "Vgd=%g has exceeded Vgd_max=%g\n", - vgd, model->HSM2vgdMax); - warns_vgd++; - } - } - } - - if (fabs(vds) > model->HSM2vdsMax) - if (warns_vds < maxwarns) { - soa_printf(ckt, (GENinstance*) here, - "Vds=%g has exceeded Vds_max=%g\n", - vds, model->HSM2vdsMax); - warns_vds++; - } - - if (!model->HSM2vgbrMaxGiven) { - if (fabs(vgb) > model->HSM2vgbMax) - if (warns_vgb < maxwarns) { - soa_printf(ckt, (GENinstance*) here, - "Vgb=%g has exceeded Vgb_max=%g\n", - vgb, model->HSM2vgbMax); - warns_vgb++; - } - } else { - if (model->HSM2_type > 0) { - if (vgb > model->HSM2vgbMax) - if (warns_vgb < maxwarns) { - soa_printf(ckt, (GENinstance*) here, - "Vgb=%g has exceeded Vgb_max=%g\n", - vgb, model->HSM2vgbMax); - warns_vgb++; - } - if (-1*vgb > model->HSM2vgbrMax) - if (warns_vgb < maxwarns) { - soa_printf(ckt, (GENinstance*) here, - "Vgb=%g has exceeded Vgbr_max=%g\n", - vgb, model->HSM2vgbrMax); - warns_vgb++; - } - } else { - if (vgb > model->HSM2vgbrMax) - if (warns_vgb < maxwarns) { - soa_printf(ckt, (GENinstance*) here, - "Vgb=%g has exceeded Vgbr_max=%g\n", - vgb, model->HSM2vgbrMax); - warns_vgb++; - } - if (-1*vgb > model->HSM2vgbMax) - if (warns_vgb < maxwarns) { - soa_printf(ckt, (GENinstance*) here, - "Vgb=%g has exceeded Vgb_max=%g\n", - vgb, model->HSM2vgbMax); - warns_vgb++; - } - } - } - - if (!model->HSM2vbsrMaxGiven) { - if (!model->HSM2vbsMaxGiven) { - if (fabs(vbs) > model->HSM2vbdMax) - if (warns_vbs < maxwarns) { - soa_printf(ckt, (GENinstance*) here, - "Vbs=%g has exceeded Vbd_max=%g\n", - vbs, model->HSM2vbdMax); - warns_vbs++; - } - } else { - if (fabs(vbs) > model->HSM2vbsMax) - if (warns_vbs < maxwarns) { - soa_printf(ckt, (GENinstance*) here, - "Vbs=%g has exceeded Vbs_max=%g\n", - vbs, model->HSM2vbsMax); - warns_vbs++; - } - } - } else { - if (!model->HSM2vbsMaxGiven) { - if (model->HSM2_type > 0) { - if (vbs > model->HSM2vbdMax) - if (warns_vbs < maxwarns) { - soa_printf(ckt, (GENinstance*) here, - "Vbs=%g has exceeded Vbd_max=%g\n", - vbs, model->HSM2vbdMax); - warns_vbs++; - } - if (-1*vbs > model->HSM2vbsrMax) - if (warns_vbs < maxwarns) { - soa_printf(ckt, (GENinstance*) here, - "Vbs=%g has exceeded Vbsr_max=%g\n", - vbs, model->HSM2vbsrMax); - warns_vbs++; - } - } else { - if (vbs > model->HSM2vbsrMax) - if (warns_vbs < maxwarns) { - soa_printf(ckt, (GENinstance*) here, - "Vbs=%g has exceeded Vbsr_max=%g\n", - vbs, model->HSM2vbsrMax); - warns_vbs++; - } - if (-1*vbs > model->HSM2vbdMax) - if (warns_vbs < maxwarns) { - soa_printf(ckt, (GENinstance*) here, - "Vbs=%g has exceeded Vbd_max=%g\n", - vbs, model->HSM2vbdMax); - warns_vbs++; - } - } - } else { - if (model->HSM2_type > 0) { - if (vbs > model->HSM2vbsMax) - if (warns_vbs < maxwarns) { - soa_printf(ckt, (GENinstance*) here, - "Vbs=%g has exceeded Vbs_max=%g\n", - vbs, model->HSM2vbsMax); - warns_vbs++; - } - if (-1*vbs > model->HSM2vbsrMax) - if (warns_vbs < maxwarns) { - soa_printf(ckt, (GENinstance*) here, - "Vbs=%g has exceeded Vbsr_max=%g\n", - vbs, model->HSM2vbsrMax); - warns_vbs++; - } - } else { - if (vbs > model->HSM2vbsrMax) - if (warns_vbs < maxwarns) { - soa_printf(ckt, (GENinstance*) here, - "Vbs=%g has exceeded Vbsr_max=%g\n", - vbs, model->HSM2vbsrMax); - warns_vbs++; - } - if (-1*vbs > model->HSM2vbsMax) - if (warns_vbs < maxwarns) { - soa_printf(ckt, (GENinstance*) here, - "Vbs=%g has exceeded Vbs_max=%g\n", - vbs, model->HSM2vbsMax); - warns_vbs++; - } - } - } - } - - if (!model->HSM2vbdrMaxGiven) { - if (fabs(vbd) > model->HSM2vbdMax) - if (warns_vbd < maxwarns) { - soa_printf(ckt, (GENinstance*) here, - "Vbd=%g has exceeded Vbd_max=%g\n", - vbd, model->HSM2vbdMax); - warns_vbd++; - } - } else { - if (model->HSM2_type > 0) { - if (vbd > model->HSM2vbdMax) - if (warns_vbd < maxwarns) { - soa_printf(ckt, (GENinstance*) here, - "Vbd=%g has exceeded Vbd_max=%g\n", - vbd, model->HSM2vbdMax); - warns_vbd++; - } - if (-1*vbd > model->HSM2vbdrMax) - if (warns_vbd < maxwarns) { - soa_printf(ckt, (GENinstance*) here, - "Vbd=%g has exceeded Vbdr_max=%g\n", - vbd, model->HSM2vbdrMax); - warns_vbd++; - } - } else { - if (vbd > model->HSM2vbdrMax) - if (warns_vbd < maxwarns) { - soa_printf(ckt, (GENinstance*) here, - "Vbd=%g has exceeded Vbdr_max=%g\n", - vbd, model->HSM2vbdrMax); - warns_vbd++; - } - if (-1*vbd > model->HSM2vbdMax) - if (warns_vbd < maxwarns) { - soa_printf(ckt, (GENinstance*) here, - "Vbd=%g has exceeded Vbd_max=%g\n", - vbd, model->HSM2vbdMax); - warns_vbd++; - } - } - } - - } - } - - return OK; -} diff --git a/src/spicelib/devices/hisim2/hsm2temp.c b/src/spicelib/devices/hisim2/hsm2temp.c deleted file mode 100644 index 2aa645a42..000000000 --- a/src/spicelib/devices/hisim2/hsm2temp.c +++ /dev/null @@ -1,808 +0,0 @@ -/*********************************************************************** - - HiSIM (Hiroshima University STARC IGFET Model) - Copyright (C) 2014 Hiroshima University & STARC - - MODEL NAME : HiSIM - ( VERSION : 2 SUBVERSION : 8 REVISION : 0 ) - - FILE : hsm2temp.c - - Date : 2014.6.5 - - released by - Hiroshima University & - Semiconductor Technology Academic Research Center (STARC) -***********************************************************************/ - -/********************************************************************** - -The following source code, and all copyrights, trade secrets or other -intellectual property rights in and to the source code in its entirety, -is owned by the Hiroshima University and the STARC organization. - -All users need to follow the "HiSIM2 Distribution Statement and -Copyright Notice" attached to HiSIM2 model. - ------HiSIM2 Distribution Statement and Copyright Notice-------------- - -Software is distributed as is, completely without warranty or service -support. Hiroshima University or STARC and its employees are not liable -for the condition or performance of the software. - -Hiroshima University and STARC own the copyright and grant users a perpetual, -irrevocable, worldwide, non-exclusive, royalty-free license with respect -to the software as set forth below. - -Hiroshima University and STARC hereby disclaim all implied warranties. - -Hiroshima University and STARC grant the users the right to modify, copy, -and redistribute the software and documentation, both within the user's -organization and externally, subject to the following restrictions - -1. The users agree not to charge for Hiroshima University and STARC code -itself but may charge for additions, extensions, or support. - -2. In any product based on the software, the users agree to acknowledge -Hiroshima University and STARC that developed the software. This -acknowledgment shall appear in the product documentation. - -3. The users agree to reproduce any copyright notice which appears on -the software on any copy or modification of such made available -to others." - - -*************************************************************************/ - -#include "ngspice/ngspice.h" -#include "ngspice/smpdefs.h" -#include "ngspice/cktdefs.h" -#include "hsm2def.h" -#include "hsm2evalenv.h" -#include "ngspice/const.h" -#include "ngspice/sperror.h" -#include "ngspice/suffix.h" - -#define Nsubmin (1e15 / C_cm2m_p3) -#define Nsubmin_dlt (0.01 / C_cm2m_p3) -#define lpext_dlt (1e-8 / C_m2cm) - -#define RANGECHECK(param, min, max, pname) \ - if ( model->HSM2_coerrrep && ((param) < (min) || (param) > (max)) ) { \ - printf("warning: (%s = %g) range [%g , %g].\n", \ - (pname), (param), (min), (max) ); \ - } - -/*---------------------------------------------------* -* smoothZero: flooring to zero. -* y = 0.5 ( x + sqrt( x^2 + 4 delta^2 ) ) -*-----------------*/ - -#define Fn_SZtemp( y , x , delta ) { \ - T1 = sqrt ( ( x ) * ( x ) + 4.0 * ( delta ) * ( delta) ) ; \ - y = 0.5 * ( ( x ) + T1 ) ; \ - } - -#define Fn_SUtemp( y , x , xmax , delta ) { \ - T1 = ( xmax ) - ( x ) - ( delta ) ; \ - T2 = 4.0 * ( xmax ) * ( delta) ; \ - T2 = T2 > 0.0 ? T2 : - ( T2 ) ; \ - T2 = sqrt ( T1 * T1 + T2 ) ; \ - y = ( xmax ) - 0.5 * ( T1 + T2 ) ; \ - } - -#define Fn_SLtemp( y , x , xmin , delta ) { \ - T1 = ( x ) - ( xmin ) - ( delta ) ; \ - T2 = 4.0 * ( xmin ) * ( delta ) ; \ - T2 = T2 > 0.0 ? T2 : - ( T2 ) ; \ - T2 = sqrt ( T1 * T1 + T2 ) ; \ - y = ( xmin ) + 0.5 * ( T1 + T2 ) ; \ - } - -/*===========================================================* -* pow -*=================*/ -#ifdef POW_TO_EXP_AND_LOG -#define Fn_Pow( x , y ) ( (x==0.0) ? 0.0 : exp( (y) * log( x ) ) ) -#else -#define Fn_Pow( x , y ) ( (x==0.0) ? 0.0 : pow( x , y ) ) -#endif - -int HSM2temp( - GENmodel *inModel, - CKTcircuit *ckt) -{ - HSM2model *model = (HSM2model *)inModel ; - HSM2instance *here ; - HSM2binningParam *pParam ; - HSM2modelMKSParam *modelMKS ; - HSM2hereMKSParam *hereMKS ; - double mueph ; - double Leff, dL , LG, Weff, dW , WG , WL , Lgate , Wgate; - double Nsubpp, Nsubps, Nsub, q_Nsub, Nsubb, Npext ; - double Lod_half, Lod_half_ref ; - double MUEPWD = 0.0 ; - double MUEPLD = 0.0 ; - double GDLD = 0.0 ; - double T1, T2, T3 ; - const double small = 1.0e-50 ; - /* temperature-dependent variables */ - double Eg ,TTEMP, beta, Nin; - double js, jssw, js2, jssw2 ; - double Tratio ; - int i; - - /* declarations for the sc3 clamping part */ - double A, beta_inv, c_eox, cnst0, cnst1, Cox, Cox_inv; - double Denom, dPpg, dVth, dVthLP, dVthLP_dVb, dVthSC, dVthW; - double dVth0, dVth0_dVb, fac1, limVgp_dVbs, Pb20, Ps0, Ps0_dVbs; - double Ps0_min, Qb0, sc3lim, sc3Vbs, sc3Vgs, term1, term2, term3, term4; - double Tox, T0, T3_dVb, T4, T5, T6, T6_dVb, T8, T8_dVb; - double T9, T9_dVb, Vgp, Vgs_min, Vfb, Vthp, Vth0; - - - for ( ;model ;model = HSM2nextModel(model)) { - - modelMKS = &model->modelMKS ; - - for ( here = HSM2instances(model); here; here = HSM2nextInstance(here)) { - pParam = &here->pParam ; - hereMKS = &here->hereMKS ; - - Lgate = here->HSM2_lgate ; - Wgate = here->HSM2_wgate ; - - LG = here->HSM2_lg ; - WG = here->HSM2_wg ; - WL = WG * LG ; - MUEPWD = model->HSM2_muepwd * C_m2um ; - MUEPLD = model->HSM2_muepld * C_m2um ; - - /* Band gap */ - here->HSM2_egtnom = pParam->HSM2_eg0 - model->HSM2_ktnom - * ( 90.25e-6 + model->HSM2_ktnom * 1.0e-7 ) ; - - /* C_EOX */ - here->HSM2_cecox = C_VAC * model->HSM2_kappa ; - - /* Vth reduction for small Vds */ - here->HSM2_msc = model->HSM2_scp22 ; - - /* Poly-Si Gate Depletion */ - if ( pParam->HSM2_pgd1 == 0.0 ) { - here->HSM2_flg_pgd = 0 ; - } else { - here->HSM2_flg_pgd = 1 ; - } - - - /* CLM5 & CLM6 */ - here->HSM2_clmmod = 1e0 + pow( LG , model->HSM2_clm5 ) * model->HSM2_clm6 ; - - /* Half length of diffusion */ - T1 = 1.0 / (model->HSM2_saref + 0.5 * here->HSM2_l) - + 1.0 / (model->HSM2_sbref + 0.5 * here->HSM2_l); - Lod_half_ref = 2.0 / T1 ; - - if (here->HSM2_sa > 0.0 && here->HSM2_sb > 0.0 && - (here->HSM2_nf == 1.0 || - (here->HSM2_nf > 1.0 && here->HSM2_sd > 0.0))) { - T1 = 0.0; - for (i = 0; i < here->HSM2_nf; i++) { - T1 = T1 + 1.0 / (here->HSM2_sa + 0.5 * here->HSM2_l - + i * (here->HSM2_sd + here->HSM2_l)) - + 1.0 / (here->HSM2_sb + 0.5 * here->HSM2_l - + i * (here->HSM2_sd + here->HSM2_l)); - } - Lod_half = 2.0 * here->HSM2_nf / T1; - } else { - Lod_half = 0.0; - } - - Npext = modelMKS->HSM2_npext * ( 1.0 + model->HSM2_npextw / pow( WG, model->HSM2_npextwp ) ); /* new */ - here->HSM2_mueph1 = pParam->HSM2_mueph1 ; - here->HSM2_nsubp = pParam->HSM2_nsubp ; - here->HSM2_nsubc = pParam->HSM2_nsubc ; - - /* DFM */ - if ( model->HSM2_codfm == 1 && here->HSM2_nsubcdfm_Given ) { - RANGECHECK(here->HSM2_nsubcdfm, 1.0e16, 1.0e19, "NSUBCDFM") ; - here->HSM2_mueph1 = here->HSM2_mueph1 * ( here->HSM2_mphdfm - * ( log(hereMKS->HSM2_nsubcdfm) - log(here->HSM2_nsubc) ) + 1.0 ) ; - here->HSM2_nsubp = here->HSM2_nsubp + hereMKS->HSM2_nsubcdfm - here->HSM2_nsubc ; - Npext = Npext + hereMKS->HSM2_nsubcdfm - here->HSM2_nsubc ; - here->HSM2_nsubc = hereMKS->HSM2_nsubcdfm ; - } - - /* WPE */ - T0 = modelMKS->HSM2_nsubcwpe * - ( here->HSM2_sca - + model->HSM2_web * here->HSM2_scb - + model->HSM2_wec * here->HSM2_scc ) ; - here->HSM2_nsubc = here->HSM2_nsubc + T0 ; - Fn_SLtemp( here->HSM2_nsubc , here->HSM2_nsubc , Nsubmin , Nsubmin_dlt ) ; - T0 = modelMKS->HSM2_nsubpwpe * - ( here->HSM2_sca - + model->HSM2_web * here->HSM2_scb - + model->HSM2_wec * here->HSM2_scc ) ; - here->HSM2_nsubp = here->HSM2_nsubp + T0 ; - Fn_SLtemp( here->HSM2_nsubp , here->HSM2_nsubp , Nsubmin , Nsubmin_dlt ) ; - T0 = modelMKS->HSM2_npextwpe * - ( here->HSM2_sca - + model->HSM2_web * here->HSM2_scb - + model->HSM2_wec * here->HSM2_scc ) ; - Npext = Npext + T0 ; - Fn_SLtemp( Npext , Npext , Nsubmin , Nsubmin_dlt ) ; - /* WPE end */ - - /* Coulomb Scattering */ - here->HSM2_muecb0 = pParam->HSM2_muecb0 * pow( LG, model->HSM2_muecb0lp ); - here->HSM2_muecb1 = pParam->HSM2_muecb1 * pow( LG, model->HSM2_muecb1lp ); - - /* Phonon Scattering (temperature-independent part) */ - mueph = here->HSM2_mueph1 - * (1.0e0 + (model->HSM2_muephw / pow( WG + MUEPWD , model->HSM2_muepwp))) - * (1.0e0 + (model->HSM2_muephl / pow( LG + MUEPLD , model->HSM2_mueplp))) - * (1.0e0 + (model->HSM2_muephw2 / pow( WG, model->HSM2_muepwp2))) - * (1.0e0 + (model->HSM2_muephl2 / pow( LG, model->HSM2_mueplp2))) - * (1.0e0 + (model->HSM2_muephs / pow( WL, model->HSM2_muepsp))); - if (Lod_half > 0.0) { - T1 = 1.0e0 / (1.0e0 + pParam->HSM2_muesti2) ; - T2 = pow (pParam->HSM2_muesti1 / Lod_half, pParam->HSM2_muesti3) ; - T3 = pow (pParam->HSM2_muesti1 / Lod_half_ref, pParam->HSM2_muesti3) ; - here->HSM2_mueph = mueph * (1.0e0 + T1 * T2) / (1.0e0 + T1 * T3); - } else { - here->HSM2_mueph = mueph; - } - - /* Surface Roughness Scattering */ - here->HSM2_muesr = model->HSM2_muesr0 - * (1.0e0 + (model->HSM2_muesrl / pow (LG, model->HSM2_mueslp))) - * (1.0e0 + (model->HSM2_muesrw / pow (WG, model->HSM2_mueswp))) ; - - /* Coefficients of Qbm for Eeff */ - T1 = pow( LG, model->HSM2_ndeplp ) ; - T2 = pow( WG, model->HSM2_ndepwp ) ; /* new */ - T3 = T1 + model->HSM2_ndepl ; - T4 = T2 + model->HSM2_ndepw ; - if( T3 < 1e-8 ) { T3 = 1e-8; } - if( T4 < 1e-8 ) { T4 = 1e-8; } - here->HSM2_ndep_o_esi = ( pParam->HSM2_ndep * T1 ) / T3 * T2 / T4 - / C_ESI ; - here->HSM2_ninv_o_esi = pParam->HSM2_ninv / C_ESI ; - - /* LG dependence of NINVD */ - here->HSM2_ninvd = model->HSM2_ninvd * ( 1.0 + (model->HSM2_ninvdl / pow( LG, model->HSM2_ninvdlp))); - - /* Metallurgical channel geometry */ - dL = model->HSM2_xld - + (modelMKS->HSM2_ll / pow (Lgate + model->HSM2_lld, model->HSM2_lln)) ; - dW = model->HSM2_xwd - + (modelMKS->HSM2_wl / pow (Wgate + model->HSM2_wld, model->HSM2_wln)) ; - - Leff = Lgate - 2.0e0 * dL ; - if ( Leff <= 1.0e-9 ) { - SPfrontEnd->IFerrorf - ( - ERR_FATAL, - "HiSIM2: MOSFET(%s) MODEL(%s): effective channel length is smaller than 1nm", - model->HSM2modName, here->HSM2name); - return (E_BADPARM); - } - here->HSM2_leff = Leff ; - - /* Wg dependence for short channel devices */ - here->HSM2_lgatesm = Lgate + model->HSM2_wl1 / pow( WL , model->HSM2_wl1p ) ; - here->HSM2_dVthsm = pParam->HSM2_wl2 / pow( WL , model->HSM2_wl2p ) ; - - /* Lg dependence of wsti */ - T1 = 1.0e0 + model->HSM2_wstil / pow( here->HSM2_lgatesm * C_m2um , model->HSM2_wstilp ) ; - T2 = 1.0e0 + model->HSM2_wstiw / pow( WG , model->HSM2_wstiwp ) ; - here->HSM2_wsti = pParam->HSM2_wsti * T1 * T2 ; - - here->HSM2_weff = Weff = Wgate - 2.0e0 * dW ; - if ( Weff <= 0.0 ) { - SPfrontEnd->IFerrorf - ( - ERR_FATAL, - "HiSIM2: MOSFET(%s) MODEL(%s): effective channel width is negative or 0", - model->HSM2modName, here->HSM2name); - return (E_BADPARM); - } - here->HSM2_weff_nf = Weff * here->HSM2_nf ; - - /* Surface impurity profile */ - /* Nsubp */ - if(model->HSM2_nsubpfac < 1.0) { - T1 = 2.0 * ( 1.0 - model->HSM2_nsubpfac ) / model->HSM2_nsubpl * LG + 2.0 * model->HSM2_nsubpfac - 1.0 ; - Fn_SUtemp( T1 , T1 , 1 , model->HSM2_nsubpdlt ) ; - Fn_SLtemp( T1 , T1 , model->HSM2_nsubpfac , model->HSM2_nsubpdlt ) ; - here->HSM2_nsubp = here->HSM2_nsubp * T1 ; - } - - /* Note: Sign Changed --> */ - Nsubpp = here->HSM2_nsubp - * (1.0e0 + (model->HSM2_nsubpw / pow (WG, model->HSM2_nsubpwp))) ; - /* <-- Note: Sign Changed */ - - if (Lod_half > 0.0) { - T1 = 1.0e0 / (1.0e0 + pParam->HSM2_nsubpsti2) ; - T2 = pow (pParam->HSM2_nsubpsti1 / Lod_half, pParam->HSM2_nsubpsti3) ; - T3 = pow (pParam->HSM2_nsubpsti1 / Lod_half_ref, pParam->HSM2_nsubpsti3) ; - Nsubps = Nsubpp * (1.0e0 + T1 * T2) / (1.0e0 + T1 * T3) ; - } else { - Nsubps = Nsubpp ; - } - - T2 = 1.0e0 + ( model->HSM2_nsubcw / pow ( WG, model->HSM2_nsubcwp )) ; - T2 = T2 * ( 1.0e0 + ( model->HSM2_nsubcw2 / pow ( WG, model->HSM2_nsubcwp2 )) ) ; - T3 = modelMKS->HSM2_nsubcmax / here->HSM2_nsubc ; - - Fn_SUtemp( T1 , T2 , T3 , 0.01 ) ; - here->HSM2_nsubc = here->HSM2_nsubc * T1 ; - - if (Lod_half > 0.0) { - T1 = 1.0e0 / (1.0e0 + pParam->HSM2_nsubcsti2) ; - T2 = pow (pParam->HSM2_nsubcsti1 / Lod_half, pParam->HSM2_nsubcsti3) ; - T3 = pow (pParam->HSM2_nsubcsti1 / Lod_half_ref, pParam->HSM2_nsubcsti3) ; - here->HSM2_nsubc = here->HSM2_nsubc * (1.0e0 + T1 * T2) / (1.0e0 + T1 * T3) ; - } - - if(model->HSM2_coerrrep && (here->HSM2_nsubc <= 0.0)) { - fprintf ( stderr , "*** warning(HiSIM): actual NSUBC value is negative -> reset to 1E+15.\n" ) ; - fprintf ( stderr , " The model parameter NSUBCW/NSUBCWP and/or NSUBCW2/NSUBCW2P might be wrong.\n" ) ; - here->HSM2_nsubc = 1e15 / C_cm2m_p3 ; - } - if( (model->HSM2_codep==0) && model->HSM2_coerrrep && (Npext < here->HSM2_nsubc || Npext > here->HSM2_nsubp)) { - fprintf ( stderr , "*** warning(HiSIM): actual NPEXT value is smaller than NSUBC and/or greater than NSUBP.\n" ) ; - fprintf ( stderr , " ( Npext = %e , NSUBC = %e , NSUBP = %e ) \n",Npext,here->HSM2_nsubc,here->HSM2_nsubp); - fprintf ( stderr , " The model parameter NPEXTW and/or NPEXTWP might be wrong.\n" ) ; - } - - if( Lgate > model->HSM2_lp ){ - Nsub = (here->HSM2_nsubc * (Lgate - model->HSM2_lp) - + Nsubps * model->HSM2_lp) / Lgate ; - } else { - Nsub = Nsubps - + (Nsubps - here->HSM2_nsubc) * (model->HSM2_lp - Lgate) - / model->HSM2_lp ; - } - T3 = 0.5e0 * Lgate - model->HSM2_lp ; - Fn_SZtemp( T3 , T3 , lpext_dlt ) ; - T1 = Fn_Max(0.0e0, model->HSM2_lpext ) ; - T2 = T3 * T1 / ( T3 + T1 ) ; - - here->HSM2_nsub = - Nsub = Nsub + T2 * (Npext - here->HSM2_nsubc) / Lgate ; - here->HSM2_qnsub = q_Nsub = C_QE * Nsub ; - here->HSM2_qnsub_esi = q_Nsub * C_ESI ; - here->HSM2_2qnsub_esi = 2.0 * here->HSM2_qnsub_esi ; - - /* Pocket Overlap (temperature-independent part) */ - if ( Lgate <= 2.0e0 * model->HSM2_lp ) { - Nsubb = 2.0e0 * Nsubps - - (Nsubps - here->HSM2_nsubc) * Lgate - / model->HSM2_lp - here->HSM2_nsubc ; - here->HSM2_ptovr0 = log (Nsubb / here->HSM2_nsubc) ; - } else { - here->HSM2_ptovr0 = 0.0e0 ; - } - - /* costi0 and costi1 for STI transistor model (temperature-independent part) */ - here->HSM2_costi00 = sqrt (2.0 * C_QE * pParam->HSM2_nsti * C_ESI ) ; - here->HSM2_nsti_p2 = 1.0 / ( pParam->HSM2_nsti * pParam->HSM2_nsti ) ; - - /* Velocity Temperature Dependence (Temperature-dependent part will be multiplied later.) */ - here->HSM2_vmax0 = (1.0e0 + (model->HSM2_vover / pow (LG, model->HSM2_voverp))) - * (1.0e0 + (model->HSM2_vovers / pow (WL, model->HSM2_voversp))) ; - - /* 2 phi_B (temperature-independent) */ - /* @300K, with pocket */ - here->HSM2_pb20 = 2.0e0 / C_b300 * log (Nsub / C_Nin0) ; - /* @300K, w/o pocket */ - here->HSM2_pb2c = 2.0e0 / C_b300 * log (here->HSM2_nsubc / C_Nin0) ; - - - /* constant for Poly depletion */ - here->HSM2_cnstpgd = pow ( 1e0 + 1e0 / LG , model->HSM2_pgd4 ) - * pParam->HSM2_pgd1 ; - - - - - /* Gate resistance */ - if ( here->HSM2_corg == 1 ) { - T1 = here->HSM2_xgw + Weff / (3.0e0 * here->HSM2_ngcon); - T2 = Lgate - here->HSM2_xgl; - here->HSM2_grg = model->HSM2_rshg * T1 / (here->HSM2_ngcon * T2 * here->HSM2_nf); - if (here->HSM2_grg > 1.0e-3) here->HSM2_grg = here->HSM2_m / here->HSM2_grg; - else { - here->HSM2_grg = here->HSM2_m * 1.0e3; - if(model->HSM2_coerrrep) - printf("warning(HiSIM2): The gate conductance reset to 1.0e3 mho.\n"); - } - } - - /* Process source/drain series resistamce */ - here->HSM2_rd = 0.0; - if ( model->HSM2_rsh > 0.0 ) { - here->HSM2_rd = here->HSM2_rd + model->HSM2_rsh * here->HSM2_nrd ; - } - if ( model->HSM2_rd > 0.0 ) { - here->HSM2_rd = here->HSM2_rd + model->HSM2_rd / here->HSM2_weff_nf ; - } - - here->HSM2_rs = 0.0; - if ( model->HSM2_rsh > 0.0 ) { - here->HSM2_rs = here->HSM2_rs + model->HSM2_rsh * here->HSM2_nrs ; - } - if ( model->HSM2_rs > 0.0 ) { - here->HSM2_rs = here->HSM2_rs + model->HSM2_rs / here->HSM2_weff_nf ; - } - - if (model->HSM2_corsrd < 0) { - if ( here->HSM2_rd > 0.0 ) { - here->HSM2drainConductance = here->HSM2_m / here->HSM2_rd ; - } else { - here->HSM2drainConductance = 0.0; - } - if ( here->HSM2_rs > 0.0 ) { - here->HSM2sourceConductance = here->HSM2_m / here->HSM2_rs ; - } else { - here->HSM2sourceConductance = 0.0; - } - } else if (model->HSM2_corsrd > 0) { - here->HSM2drainConductance = 0.0 ; - here->HSM2sourceConductance = 0.0 ; - if ( here->HSM2_rd > 0.0 && model->HSM2_cothrml != 0 ) { - here->HSM2internalGd = here->HSM2_m / here->HSM2_rd ; - } else { - here->HSM2internalGd = 0.0; - } - if ( here->HSM2_rs > 0.0 && model->HSM2_cothrml != 0 ) { - here->HSM2internalGs = here->HSM2_m / here->HSM2_rs ; - } else { - here->HSM2internalGs = 0.0; - } - } else { - here->HSM2drainConductance = 0.0 ; - here->HSM2sourceConductance = 0.0 ; - } - - - /* Body resistance */ - if ( here->HSM2_corbnet == 1 ) { - if (here->HSM2_rbdb < 1.0e-3) here->HSM2_grbdb = here->HSM2_m * 1.0e3 ; /* in mho */ - else here->HSM2_grbdb = here->HSM2_m * ( model->HSM2_gbmin + 1.0 / here->HSM2_rbdb ) ; - - if (here->HSM2_rbpb < 1.0e-3) here->HSM2_grbpb = here->HSM2_m * 1.0e3 ; - else here->HSM2_grbpb = here->HSM2_m * ( model->HSM2_gbmin + 1.0 / here->HSM2_rbpb ) ; - - if (here->HSM2_rbps < 1.0e-3) here->HSM2_grbps = here->HSM2_m * 1.0e3 ; - else here->HSM2_grbps = here->HSM2_m * ( model->HSM2_gbmin + 1.0 / here->HSM2_rbps ) ; - - if (here->HSM2_rbsb < 1.0e-3) here->HSM2_grbsb = here->HSM2_m * 1.0e3 ; - else here->HSM2_grbsb = here->HSM2_m * ( model->HSM2_gbmin + 1.0 / here->HSM2_rbsb ) ; - - if (here->HSM2_rbpd < 1.0e-3) here->HSM2_grbpd = here->HSM2_m * 1.0e3 ; - else here->HSM2_grbpd = here->HSM2_m * ( model->HSM2_gbmin + 1.0 / here->HSM2_rbpd ) ; - } - - /* Vdseff */ - if ( model->HSM2_coddlt == 0 ) { - T1 = model->HSM2_ddltslp * LG + model->HSM2_ddltict ; - here->HSM2_ddlt = T1 * model->HSM2_ddltmax / ( T1 + model->HSM2_ddltmax ) + 1.0 ; - } else { /* fix in version 2.80 */ - T1 = model->HSM2_ddltslp * LG ; - here->HSM2_ddlt = T1 * model->HSM2_ddltmax / ( T1 + model->HSM2_ddltmax ) + model->HSM2_ddltict + small ; - } - - /* Isub */ - T2 = pow( Weff , model->HSM2_svgswp ) ; - here->HSM2_vg2const = pParam->HSM2_svgs - * ( 1.0e0 - + modelMKS->HSM2_svgsl / pow( here->HSM2_lgate , model->HSM2_svgslp ) ) - * ( T2 / ( T2 + modelMKS->HSM2_svgsw ) ) ; - - here->HSM2_xvbs = pParam->HSM2_svbs - * ( 1.0e0 - + modelMKS->HSM2_svbsl / pow( here->HSM2_lgate , model->HSM2_svbslp ) ) ; - here->HSM2_xgate = modelMKS->HSM2_slg - * ( 1.0 - + modelMKS->HSM2_slgl / pow( here->HSM2_lgate , model->HSM2_slglp ) ) ; - - here->HSM2_xsub1 = pParam->HSM2_sub1 - * ( 1.0 - + modelMKS->HSM2_sub1l / pow( here->HSM2_lgate , model->HSM2_sub1lp ) ) ; - - here->HSM2_xsub2 = pParam->HSM2_sub2 - * ( 1.0 + modelMKS->HSM2_sub2l / here->HSM2_lgate ) ; - - /* Fringing capacitance */ - here->HSM2_cfrng = C_EOX / ( C_Pi / 2.0e0 ) * here->HSM2_weff_nf - * log( 1.0e0 + model->HSM2_tpoly / model->HSM2_tox ) ; - - /* Additional term of lateral-field-induced capacitance */ - here->HSM2_cqyb0 = C_m2um * here->HSM2_weff_nf - * model->HSM2_xqy1 / pow( LG , model->HSM2_xqy2 ) ; - - /* Parasitic component of the channel current */ - GDLD = model->HSM2_gdld * C_m2um ; - here->HSM2_ptl0 = model->HSM2_ptl * pow( LG , - model->HSM2_ptlp ) ; - here->HSM2_pt40 = model->HSM2_pt4 * pow( LG , - model->HSM2_pt4p ) ; - here->HSM2_gdl0 = model->HSM2_gdl * pow( LG + GDLD , - model->HSM2_gdlp ) ; - - - /*-----------------------------------------------------------* - * Temperature dependent constants. - *-----------------*/ - TTEMP = ckt->CKTtemp ; - if ( here->HSM2_temp_Given ) TTEMP = here->HSM2_ktemp ; - if ( here->HSM2_dtemp_Given ) { - TTEMP = TTEMP + here->HSM2_dtemp ; - here->HSM2_ktemp = TTEMP ; - } - - /* Band gap */ - T1 = TTEMP - model->HSM2_ktnom ; - T2 = TTEMP * TTEMP - model->HSM2_ktnom * model->HSM2_ktnom ; - here->HSM2_eg = Eg = here->HSM2_egtnom - pParam->HSM2_bgtmp1 * T1 - - pParam->HSM2_bgtmp2 * T2 ; - here->HSM2_sqrt_eg = sqrt( Eg ) ; - - - T1 = 1.0 / TTEMP ; - T2 = 1.0 / model->HSM2_ktnom ; - T3 = here->HSM2_egtnom + model->HSM2_egig - + model->HSM2_igtemp2 * ( T1 - T2 ) - + model->HSM2_igtemp3 * ( T1 * T1 - T2 * T2 ) ; - here->HSM2_egp12 = sqrt ( T3 ) ; - here->HSM2_egp32 = T3 * here->HSM2_egp12 ; - - - /* Inverse of the thermal voltage */ - here->HSM2_beta = beta = C_QE / (C_KB * TTEMP) ; - here->HSM2_beta_inv = 1.0 / beta ; - here->HSM2_beta2 = beta * beta ; - here->HSM2_betatnom = C_QE / (C_KB * model->HSM2_ktnom) ; - - Tratio = TTEMP / model->HSM2_ktnom ; - - /* Intrinsic carrier concentration */ - here->HSM2_nin = Nin = C_Nin0 * pow (Tratio, 1.5e0) - * exp (- Eg / 2.0e0 * beta + here->HSM2_egtnom / 2.0e0 * here->HSM2_betatnom) ; - - - /* Phonon Scattering (temperature-dependent part) */ - T1 = pow (Tratio, pParam->HSM2_muetmp) ; - here->HSM2_mphn0 = T1 / here->HSM2_mueph ; - here->HSM2_mphn1 = here->HSM2_mphn0 * model->HSM2_mueph0 ; - - - /* Pocket Overlap (temperature-dependent part) */ - here->HSM2_ptovr = here->HSM2_ptovr0 / beta ; - - - /* Velocity Temperature Dependence */ - here->HSM2_vmax = here->HSM2_vmax0 * pParam->HSM2_vmax - / (1.8 + 0.4 * Tratio + 0.1 * Tratio * Tratio - pParam->HSM2_vtmp * (1.0e0 - Tratio)) ; - - - /* Coefficient of the F function for bulk charge */ - /* Depletion mode MOSFET */ - if( model->HSM2_codep ) { - T3 = pow(here->HSM2_lg,model->HSM2_ndepmlp) ; - here->HSM2_ndepm = modelMKS->HSM2_ndepm * ( 1.0 + model->HSM2_ndepml / T3 ); - if ( here->HSM2_ndepm < 1e+21 ) { here->HSM2_ndepm = 1e+21 ; } - here->HSM2_Pb2n = 2.0/beta*log(here->HSM2_ndepm/Nin) ; - here->HSM2_Vbipn = 1.0/beta*log(here->HSM2_ndepm*here->HSM2_nsub/Nin/Nin) ; - here->HSM2_cnst0 = sqrt ( 2.0 * C_ESI * C_QE * here->HSM2_ndepm / beta ) ; - here->HSM2_cnst1 = Nin*Nin/here->HSM2_ndepm/here->HSM2_ndepm ; - - T1 = Fn_Pow(Tratio, model->HSM2_depmuetmp) ; - here->HSM2_depmphn0 = T1 / model->HSM2_depmueph1 ; - here->HSM2_depmphn1 = here->HSM2_depmphn0 * model->HSM2_depmueph0 ; -// T0 = 1.8 + 0.4 * Tratio + 0.1 * Tratio * Tratio - model->HSM2_depvtmp * ( 1.0 - Tratio ) ; - T0 = 1.0 ; // ignore DEPVTMP in HiSIM2 - here->HSM2_depvmax = model->HSM2_depvmax / T0 / C_m2cm ; - - // LG dependence DEPVMAX - T3 = pow( here->HSM2_lg, model->HSM2_depvmaxlp ) ; - here->HSM2_depvmax = here->HSM2_depvmax * ( 1.0 + model->HSM2_depvmaxl / T3 ) ; - if( here->HSM2_depvmax < 0.0 ) { here->HSM2_depvmax = 0.0; } - - // LG dependence DEPLEAK - T3 = pow( here->HSM2_lg, model->HSM2_depleaklp ) ; - here->HSM2_depleak = model->HSM2_depleak * ( 1.0 + model->HSM2_depleakl / T3 ) ; - if( here->HSM2_depleak < 0.0 ) { here->HSM2_depleak = 0.0; } - - // LG dependence DEPMUE0 & DEPMUE1 - T3 = pow( here->HSM2_lg, model->HSM2_depmue0lp ) ; - here->HSM2_depmue0 = model->HSM2_depmue0 * ( 1.0 + model->HSM2_depmue0l / T3 ) ; - if( here->HSM2_depmue0 < 1.0 ) { here->HSM2_depmue0 = 1.0; } - T3 = pow( here->HSM2_lg, model->HSM2_depmue1lp ) ; - here->HSM2_depmue1 = model->HSM2_depmue1 * ( 1.0 + model->HSM2_depmue1l / T3 ) ; - if( here->HSM2_depmue1 < 0.0 ) { here->HSM2_depmue1 = 0.0; } - - // LG dependence DEPMUEBACK0 & DEPMUEBACK1 - T3 = pow( here->HSM2_lg, model->HSM2_depmueback0lp ) ; - here->HSM2_depmueback0 = model->HSM2_depmueback0 * ( 1.0 + model->HSM2_depmueback0l / T3 ) ; - if( here->HSM2_depmueback0 < 0.0 ) { here->HSM2_depmueback0 = 0.0; } - T3 = pow( here->HSM2_lg, model->HSM2_depmueback1lp ) ; - here->HSM2_depmueback1 = model->HSM2_depmueback1 * ( 1.0 + model->HSM2_depmueback1l / T3 ) ; - if( here->HSM2_depmueback1 < 0.0 ) { here->HSM2_depmueback1 = 0.0; } - - // LG dependence DEPVDSEF1 & DEPVDSEF2 - T3 = pow( here->HSM2_lg, model->HSM2_depvdsef1lp ) ; - here->HSM2_depvdsef1 = model->HSM2_depvdsef1 * ( 1.0 + model->HSM2_depvdsef1l / T3 ) ; - if( here->HSM2_depvdsef1 < 0.0 ) { here->HSM2_depvdsef1 = 0.0; } - T3 = pow( here->HSM2_lg, model->HSM2_depvdsef2lp ) ; - here->HSM2_depvdsef2 = model->HSM2_depvdsef2 * ( 1.0 + model->HSM2_depvdsef2l / T3 ) ; - if( here->HSM2_depvdsef2 < 0.1 ) { here->HSM2_depvdsef2 = 0.1; } - - } else { - /* Normal mode MOSFET */ - here->HSM2_cnst0 = sqrt ( 2.0 * C_ESI * C_QE * here->HSM2_nsub / beta ) ; - /* cnst1: n_{p0} / p_{p0} */ - T1 = Nin / here->HSM2_nsub ; - here->HSM2_cnst1 = T1 * T1 ; - } - - /* 2 phi_B (temperature-dependent) */ - /* @temp, with pocket */ - here->HSM2_pb2 = 2.0e0 / beta * log (here->HSM2_nsub / Nin) ; - if ( pParam->HSM2_nover != 0.0) { - here->HSM2_pb2over = 2.0 / beta * log( pParam->HSM2_nover / Nin ) ; - here->HSM2_cnst0over = sqrt ( 2.0 * C_ESI * C_QE * pParam->HSM2_nover / beta ) ; - }else { - here->HSM2_pb2over = 0.0 ; - here->HSM2_cnst0over = 0.0 ; - } - - - /* Depletion Width */ - T1 = 2.0e0 * C_ESI / C_QE ; - here->HSM2_wdpl = sqrt ( T1 / here->HSM2_nsub ) ; - here->HSM2_wdplp = sqrt( T1 / ( here->HSM2_nsubp ) ) ; - - - /* for substrate-source/drain junction diode. */ - js = pParam->HSM2_js0 - * exp ((here->HSM2_egtnom * here->HSM2_betatnom - Eg * beta - + model->HSM2_xti * log (Tratio)) / pParam->HSM2_nj) ; - jssw = pParam->HSM2_js0sw - * exp ((here->HSM2_egtnom * here->HSM2_betatnom - Eg * beta - + model->HSM2_xti * log (Tratio)) / model->HSM2_njsw) ; - - js2 = pParam->HSM2_js0 - * exp ((here->HSM2_egtnom * here->HSM2_betatnom - Eg * beta - + model->HSM2_xti2 * log (Tratio)) / pParam->HSM2_nj) ; - jssw2 = pParam->HSM2_js0sw - * exp ((here->HSM2_egtnom * here->HSM2_betatnom - Eg * beta - + model->HSM2_xti2 * log (Tratio)) / model->HSM2_njsw) ; - - here->HSM2_isbd = here->HSM2_ad * js + here->HSM2_pd * jssw ; - here->HSM2_isbd2 = here->HSM2_ad * js2 + here->HSM2_pd * jssw2 ; - here->HSM2_isbs = here->HSM2_as * js + here->HSM2_ps * jssw ; - here->HSM2_isbs2 = here->HSM2_as * js2 + here->HSM2_ps * jssw2 ; - - here->HSM2_vbdt = pParam->HSM2_nj / beta - * log (pParam->HSM2_vdiffj * (Tratio) * (Tratio) - / (here->HSM2_isbd + 1.0e-50) + 1) ; - here->HSM2_vbst = pParam->HSM2_nj / beta - * log (pParam->HSM2_vdiffj * (Tratio) * (Tratio) - / (here->HSM2_isbs + 1.0e-50) + 1) ; - - here->HSM2_exptemp = exp (((Tratio) - 1) * model->HSM2_ctemp) ; - here->HSM2_jd_nvtm_inv = 1.0 / ( pParam->HSM2_nj / beta ) ; - here->HSM2_jd_expcd = exp (here->HSM2_vbdt * here->HSM2_jd_nvtm_inv ) ; - here->HSM2_jd_expcs = exp (here->HSM2_vbst * here->HSM2_jd_nvtm_inv ) ; - - /* costi0 and costi1 for STI transistor model (temperature-dependent part) */ - here->HSM2_costi0 = here->HSM2_costi00 * sqrt(here->HSM2_beta_inv) ; - here->HSM2_costi0_p2 = here->HSM2_costi0 * here->HSM2_costi0 ; - here->HSM2_costi1 = here->HSM2_nin * here->HSM2_nin * here->HSM2_nsti_p2 ; - - /* check if SC3 is too large */ - if (pParam->HSM2_sc3 && model->HSM2_sc3Vbs < 0.0) { - - beta = here->HSM2_beta ; - beta_inv = here->HSM2_beta_inv ; - Weff = here->HSM2_weff ; - Vfb = pParam->HSM2_vfbc ; - Pb20 = here->HSM2_pb20 ; - cnst0 = here->HSM2_cnst0 ; - cnst1 = here->HSM2_cnst1 ; - c_eox = here->HSM2_cecox ; - Tox = model->HSM2_tox ; - Cox = c_eox / Tox ; - Cox_inv = 1.0 / Cox ; - fac1 = cnst0 * Cox_inv ; - Vgs_min = model->HSM2_type * model->HSM2_Vgsmin ; - sc3Vbs = model->HSM2_sc3Vbs ; - sc3Vgs = 2.0 ; - Ps0_min = 2.0 * beta_inv * log(-Vgs_min/fac1) ; - - /* approximate solution of Poisson equation for large - Vgs and negative Vbs (3 iterations!)*/ - Vgp = sc3Vgs - Vfb; - Denom = fac1*sqrt(cnst1); - Ps0 = 2.0 * beta_inv * log(Vgp/Denom); - Ps0 = 2.0 * beta_inv * log((Vgp-Ps0)/Denom); - Ps0 = 2.0 * beta_inv * log((Vgp-Ps0)/Denom); - Ps0 = 2.0 * beta_inv * log((Vgp-Ps0)/Denom); - Ps0_dVbs = 0.0; - - T1 = here->HSM2_2qnsub_esi ; - Qb0 = sqrt ( T1 ) ; - Vthp = Ps0 + Vfb + Qb0 * Cox_inv + here->HSM2_ptovr ; - - T1 = 2.0 * C_QE * here->HSM2_nsubc * C_ESI ; - T2 = sqrt( T1 ) ; - Vth0 = Ps0 + Vfb + T2 * Cox_inv ; - T1 = C_ESI * Cox_inv ; - T2 = here->HSM2_wdplp ; - T4 = 1.0e0 / ( model->HSM2_lp * model->HSM2_lp ) ; - T3 = 2.0 * ( model->HSM2_vbi - Pb20 ) * T2 * T4 ; - T5 = T1 * T3 ; - T6 = Ps0 - sc3Vbs ; - T6_dVb = Ps0_dVbs - 1.0 ; - dVth0 = T5 * sqrt( T6 ) ; - dVth0_dVb = T5 * 0.5 / sqrt( T6 ) * T6_dVb; - T1 = Vthp - Vth0 ; - T9 = Ps0 - sc3Vbs ; - T9_dVb = Ps0_dVbs - 1.0 ; - T3 = pParam->HSM2_scp1 + pParam->HSM2_scp3 * T9 / model->HSM2_lp; - T3_dVb = pParam->HSM2_scp3 * T9_dVb / model->HSM2_lp ; - dVthLP = T1 * dVth0 * T3 ; - dVthLP_dVb = T1 * dVth0_dVb * T3 + T1 * dVth0 * T3_dVb; - - T3 = here->HSM2_lgate - model->HSM2_parl2 ; - T4 = 1.0e0 / ( T3 * T3 ) ; - T0 = C_ESI * here->HSM2_wdpl * 2.0e0 * ( model->HSM2_vbi - Pb20 ) * T4 ; - T2 = T0 * Cox_inv ; - T5 = pParam->HSM2_sc3 / here->HSM2_lgate ; - T6 = pParam->HSM2_sc1 + T5 * ( Ps0 - sc3Vbs ) ; - T1 = T6 ; - A = T2 * T1 ; - T9 = Ps0 - sc3Vbs + Ps0_min ; - T9_dVb = Ps0_dVbs - 1.0 ; - T8 = sqrt( T9 ) ; - T8_dVb = 0.5 * T9_dVb / T8 ; - dVthSC = A * T8 ; - - T1 = 1.0 / Cox ; - T3 = 1.0 / ( Cox + pParam->HSM2_wfc / Weff ) ; - T5 = T1 - T3 ; - dVthW = Qb0 * T5 + pParam->HSM2_wvth0 / here->HSM2_wg ; - - dVth = dVthSC + dVthLP + dVthW + here->HSM2_dVthsm ; - dPpg = 0.0 ; - Vgp = sc3Vgs - Vfb + dVth - dPpg ; - - /* Recalculation of Ps0, using more accurate Vgp */ - Ps0 = 2.0 * beta_inv * log(Vgp/Denom); - Ps0 = 2.0 * beta_inv * log((Vgp-Ps0)/Denom); - Ps0 = 2.0 * beta_inv * log((Vgp-Ps0)/Denom); - Ps0 = 2.0 * beta_inv * log((Vgp-Ps0)/Denom); - - term1 = Vgp - Ps0; - term2 = sqrt(beta*(Ps0-sc3Vbs)-1.0); - term3 = term1 + fac1 * term2; - term4 = cnst1 * exp(beta*Ps0); - limVgp_dVbs = - beta * (term3 + 0.5*fac1 * term4/term2) - / (2.0*term1/fac1/fac1*term3 - term4); - T2 = T0 * Cox_inv ; - sc3lim = here->HSM2_lgate / T2 - * (limVgp_dVbs - dVthLP_dVb - T2*pParam->HSM2_sc1*T8_dVb) - / ((Ps0-sc3Vbs)*T8_dVb +(Ps0_dVbs-1.0)*T8); - if (sc3lim < 1.0e-20) - sc3lim = 1e-20 ; - if (sc3lim < pParam->HSM2_sc3 * 0.999) { - pParam->HSM2_sc3 = sc3lim; - } - } - } /* End of instance loop */ - } - return(OK); -} diff --git a/src/spicelib/devices/hisim2/hsm2trunc.c b/src/spicelib/devices/hisim2/hsm2trunc.c deleted file mode 100644 index e18e605e5..000000000 --- a/src/spicelib/devices/hisim2/hsm2trunc.c +++ /dev/null @@ -1,93 +0,0 @@ -/*********************************************************************** - - HiSIM (Hiroshima University STARC IGFET Model) - Copyright (C) 2014 Hiroshima University & STARC - - MODEL NAME : HiSIM - ( VERSION : 2 SUBVERSION : 8 REVISION : 0 ) - - FILE : hsm2trunc.c - - Date : 2014.6.5 - - released by - Hiroshima University & - Semiconductor Technology Academic Research Center (STARC) -***********************************************************************/ - -/********************************************************************** - -The following source code, and all copyrights, trade secrets or other -intellectual property rights in and to the source code in its entirety, -is owned by the Hiroshima University and the STARC organization. - -All users need to follow the "HiSIM2 Distribution Statement and -Copyright Notice" attached to HiSIM2 model. - ------HiSIM2 Distribution Statement and Copyright Notice-------------- - -Software is distributed as is, completely without warranty or service -support. Hiroshima University or STARC and its employees are not liable -for the condition or performance of the software. - -Hiroshima University and STARC own the copyright and grant users a perpetual, -irrevocable, worldwide, non-exclusive, royalty-free license with respect -to the software as set forth below. - -Hiroshima University and STARC hereby disclaim all implied warranties. - -Hiroshima University and STARC grant the users the right to modify, copy, -and redistribute the software and documentation, both within the user's -organization and externally, subject to the following restrictions - -1. The users agree not to charge for Hiroshima University and STARC code -itself but may charge for additions, extensions, or support. - -2. In any product based on the software, the users agree to acknowledge -Hiroshima University and STARC that developed the software. This -acknowledgment shall appear in the product documentation. - -3. The users agree to reproduce any copyright notice which appears on -the software on any copy or modification of such made available -to others." - - -*************************************************************************/ - -#include "ngspice/ngspice.h" -#include "ngspice/cktdefs.h" -#include "hsm2def.h" -#include "ngspice/sperror.h" -#include "ngspice/suffix.h" - -int HSM2trunc( - GENmodel *inModel, - CKTcircuit *ckt, - double *timeStep) -{ - HSM2model *model = (HSM2model*)inModel; - HSM2instance *here; -#ifdef STEPDEBUG - double debugtemp; -#endif /* STEPDEBUG */ - - for ( ;model != NULL ;model = HSM2nextModel(model)) { - for ( here=HSM2instances(model);here!=NULL ; - here = HSM2nextInstance(here)) { -#ifdef STEPDEBUG - debugtemp = *timeStep; -#endif /* STEPDEBUG */ - CKTterr(here->HSM2qb,ckt,timeStep); - CKTterr(here->HSM2qg,ckt,timeStep); - CKTterr(here->HSM2qd,ckt,timeStep); -#ifdef STEPDEBUG - if ( debugtemp != *timeStep ) - printf("device %s reduces step from %g to %g\n", - here->HSM2name, debugtemp, *timeStep); -#endif /* STEPDEBUG */ - } - } - return(OK); -} - - diff --git a/src/spicelib/devices/hisimhv1/Makefile.am b/src/spicelib/devices/hisimhv1/Makefile.am deleted file mode 100644 index a4d828d56..000000000 --- a/src/spicelib/devices/hisimhv1/Makefile.am +++ /dev/null @@ -1,35 +0,0 @@ -## Process this file with automake to produce Makefile.in - -noinst_LTLIBRARIES = libhisimhv1.la - -libhisimhv1_la_SOURCES = hisimhv.h \ - hsmhv.c \ - hsmhvacld.c \ - hsmhvask.c \ - hsmhvcvtest.c \ - hsmhvdef.h \ - hsmhveval.c \ - hsmhveval_qover.h \ - hsmhvevalenv.h \ - hsmhvext.h \ - hsmhvgetic.c \ - hsmhvinit.c \ - hsmhvinit.h \ - hsmhvitf.h \ - hsmhvld.c \ - hsmhvld_info_eval.h \ - hsmhvmask.c \ - hsmhvmpar.c \ - hsmhvnoi.c \ - hsmhvpar.c \ - hsmhvpzld.c \ - hsmhvset.c \ - hsmhvsoachk.c \ - hsmhvtemp.c \ - hsmhvtemp_eval.h \ - hsmhvtrunc.c - -AM_CPPFLAGS = @AM_CPPFLAGS@ -I$(top_srcdir)/src/include -AM_CFLAGS = $(STATIC) - -MAINTAINERCLEANFILES = Makefile.in diff --git a/src/spicelib/devices/hisimhv1/hisimhv.h b/src/spicelib/devices/hisimhv1/hisimhv.h deleted file mode 100644 index 8a4ce50b8..000000000 --- a/src/spicelib/devices/hisimhv1/hisimhv.h +++ /dev/null @@ -1,77 +0,0 @@ -/*********************************************************************** - - HiSIM (Hiroshima University STARC IGFET Model) - Copyright (C) 2012 Hiroshima University & STARC - - MODEL NAME : HiSIM_HV - ( VERSION : 1 SUBVERSION : 2 REVISION : 4 ) - Model Parameter VERSION : 1.23 - FILE : hisimhv.h - - DATE : 2013.04.30 - - released by - Hiroshima University & - Semiconductor Technology Academic Research Center (STARC) -***********************************************************************/ - -#include "hsmhvdef.h" -#include "ngspice/cktdefs.h" - -#ifndef _HiSIMHV_H -#define _HiSIMHV_H - -/* return value */ -#ifndef OK -#define HiSIM_OK 0 -#define HiSIM_ERROR 1 -#else -#define HiSIM_OK OK -#define HiSIM_ERROR E_PANIC -#endif - -/* MOS type */ -#ifndef NMOS -#define NMOS 1 -#define PMOS -1 -#endif - -/* device working mode */ -#ifndef CMI_NORMAL_MODE -#define HiSIM_NORMAL_MODE 1 -#define HiSIM_REVERSE_MODE -1 -#else -#define HiSIM_NORMAL_MODE CMI_NORMAL_MODE -#define HiSIM_REVERSE_MODE CMI_REVERSE_MODE -#endif - -/* others */ -#ifndef NULL -#define NULL 0 -#endif - -#define HiSIM_FALSE 0 -#define HiSIM_TRUE 1 - -#ifndef return_if_error -#define return_if_error(s) { int error = s; if(error) return(error); } -#endif - -extern int HSMHVevaluate -( - double ivds, - double ivgs, - double ivbs, - double ivdsi, - double ivgsi, - double ivbsi, - double vbs_jct, - double vbd_jct, - double vsubs, - double deltemp, - HSMHVinstance *here, - HSMHVmodel *model, - CKTcircuit *ckt - ) ; - -#endif /* _HiSIMHV_H */ diff --git a/src/spicelib/devices/hisimhv1/hsmhv.c b/src/spicelib/devices/hisimhv1/hsmhv.c deleted file mode 100644 index 898159919..000000000 --- a/src/spicelib/devices/hisimhv1/hsmhv.c +++ /dev/null @@ -1,751 +0,0 @@ -/*********************************************************************** - - HiSIM (Hiroshima University STARC IGFET Model) - Copyright (C) 2012 Hiroshima University & STARC - - MODEL NAME : HiSIM_HV - ( VERSION : 1 SUBVERSION : 2 REVISION : 4 ) - Model Parameter VERSION : 1.23 - FILE : hsmhv.c - - DATE : 2013.04.30 - - - released by - Hiroshima University & - Semiconductor Technology Academic Research Center (STARC) -***********************************************************************/ - -#include "ngspice/ngspice.h" -#include "ngspice/devdefs.h" -#include "hsmhvdef.h" -#include "ngspice/suffix.h" - -IFparm HSMHVpTable[] = { /* parameters */ - IOP( "coselfheat", HSMHV_COSELFHEAT, IF_INTEGER, "Calculation of self heating model"), - IOP( "cosubnode", HSMHV_COSUBNODE, IF_INTEGER, "Switch tempNode to subNode"), - IOP( "l", HSMHV_L, IF_REAL , "Length"), - IOP( "w", HSMHV_W, IF_REAL , "Width"), - IOP( "ad", HSMHV_AD, IF_REAL , "Drain area"), - IOP( "as", HSMHV_AS, IF_REAL , "Source area"), - IOP( "pd", HSMHV_PD, IF_REAL , "Drain perimeter"), - IOP( "ps", HSMHV_PS, IF_REAL , "Source perimeter"), - IOP( "nrd", HSMHV_NRD, IF_REAL , "Number of squares in drain"), - IOP( "nrs", HSMHV_NRS, IF_REAL , "Number of squares in source"), - IOP( "dtemp", HSMHV_DTEMP,IF_REAL , ""), - IOP( "off", HSMHV_OFF, IF_FLAG , "Device is initially off"), - IP ( "ic", HSMHV_IC, IF_REALVEC , "Vector of DS,GS,BS initial voltages"), - IOP("corbnet", HSMHV_CORBNET, IF_INTEGER, "Activate body resistance (1) or not (0)"), - IOP("rbpb", HSMHV_RBPB, IF_REAL, ""), - IOP("rbpd", HSMHV_RBPD, IF_REAL, ""), - IOP("rbps", HSMHV_RBPS, IF_REAL, ""), - IOP("rbdb", HSMHV_RBDB, IF_REAL, ""), - IOP("rbsb", HSMHV_RBSB, IF_REAL, ""), - IOP("corg", HSMHV_CORG, IF_INTEGER, "Activate gate resistance (1) or not (0)"), - IOP("ngcon", HSMHV_NGCON, IF_REAL, "Number of gate contacts"), - IOP("xgw", HSMHV_XGW, IF_REAL, "Distance from gate contact to channel edge"), - IOP("xgl", HSMHV_XGL, IF_REAL, "Offset of gate length due to variation in patterning"), - IOP("nf", HSMHV_NF, IF_REAL, "Number of fingers"), - IOP("sa", HSMHV_SA, IF_REAL, "Distance from STI edge to Gate edge [m]"), - IOP("sb", HSMHV_SB, IF_REAL, "Distance from STI edge to Gate edge [m]"), - IOP("sd", HSMHV_SD, IF_REAL, "Distance from Gate edge to Gate edge [m]"), - IOP("nsubcdfm", HSMHV_NSUBCDFM, IF_REAL, "Constant part of Nsub for DFM [1/cm^3]"), - IOP("m", HSMHV_M, IF_REAL, "Multiplication factor [-]"), - IOP("subld1", HSMHV_SUBLD1, IF_REAL, "Parameter for impact-ionization current in the drift region [-]"), - IOP("subld2", HSMHV_SUBLD2, IF_REAL, "Parameter for impact-ionization current in the drift region [m^{-1}*V^{3/2}]"), - IOP("lover", HSMHV_LOVER, IF_REAL, "Overlap length on source side [m]"), - IOP("lovers", HSMHV_LOVERS, IF_REAL, "Overlap length on source side [m]"), - IOP("loverld", HSMHV_LOVERLD, IF_REAL, "Overlap length on drain side [m]"), - IOP("ldrift1", HSMHV_LDRIFT1, IF_REAL, "Parameter for drift region length-1 [m]"), - IOP("ldrift2", HSMHV_LDRIFT2, IF_REAL, "Parameter for drift region length-2 [m]"), - IOP("ldrift1s", HSMHV_LDRIFT1S, IF_REAL, "Parameter for drift region length-1 on source side[m]"), - IOP("ldrift2s", HSMHV_LDRIFT2S, IF_REAL, "Parameter for drift region length-2 on source side[m]"), - - /* Output Physical Values: */ - OP ( "ids", HSMHV_CD, IF_REAL , "Ids"), /* Drain-Source current */ - OP ( "isub", HSMHV_ISUB, IF_REAL , "Isub"), /* Substrate current */ - OP ( "igidl", HSMHV_IGIDL, IF_REAL , "Igidl"), /* Gate-Induced Drain Leakage current */ - OP ( "igisl", HSMHV_IGISL, IF_REAL , "Igisl"), /* Gate-Induced Source Leakage current */ - OP ( "igd", HSMHV_IGD, IF_REAL , "Igd"), /* Gate-Drain current */ - OP ( "igs", HSMHV_IGS, IF_REAL , "Igs"), /* Gate-Source current */ - OP ( "igb", HSMHV_IGB, IF_REAL , "Igb"), /* Gate-Substrate current */ - OP ( "gm", HSMHV_GM, IF_REAL , "Gm"), /* Transconductance */ - OP ( "gds", HSMHV_GDS, IF_REAL , "Gds"), /* Channel conductance */ - OP ( "gmbs", HSMHV_GMBS, IF_REAL , "Gmbs"), /* Body effect (Back gate) transconductance */ - OP ( "gmt", HSMHV_GMT, IF_REAL , "GmT"), /* Temp - transconductance ----SHE----*/ - OP ( "von", HSMHV_VON, IF_REAL , "Von"), /* Threshold voltage */ - OP ( "vdsat", HSMHV_VDSAT, IF_REAL , "Vdsat"), /* Saturation voltage */ - OP ( "qb", HSMHV_QB, IF_REAL , "Qb"), /* Bulk charge */ - OP ( "qg", HSMHV_QG, IF_REAL , "Qg"), /* Gate charge */ - OP ( "qd", HSMHV_QD, IF_REAL , "Qd"), /* Drain charge */ - OP ( "cgg", HSMHV_CGG, IF_REAL , "Cgg"), /* MOSFET capacitance */ - OP ( "cgd", HSMHV_CGD, IF_REAL , "Cgd"), /* MOSFET capacitance */ - OP ( "cgs", HSMHV_CGS, IF_REAL , "Cgs"), /* MOSFET capacitance */ - OP ( "cbg", HSMHV_CBG, IF_REAL , "Cbg"), /* MOSFET capacitance */ - OP ( "cbs", HSMHV_CBSB, IF_REAL , "Cbs"), /* MOSFET capacitance */ - OP ( "cbd", HSMHV_CBDB, IF_REAL , "Cbd"), /* MOSFET capacitance */ - OP ( "cdg", HSMHV_CDG, IF_REAL , "Cdg"), /* MOSFET capacitance */ - OP ( "cdd", HSMHV_CDD, IF_REAL , "Cdd"), /* MOSFET capacitance */ - OP ( "cds", HSMHV_CDS, IF_REAL , "Cds"), /* MOSFET capacitance */ - OP ( "cgdo", HSMHV_CGDO, IF_REAL , "Cgdo"), /* MOSFET overlap capacitance */ - OP ( "cgso", HSMHV_CGSO, IF_REAL , "Cgso"), /* MOSFET overlap capacitance */ - OP ( "cgbo", HSMHV_CGBO, IF_REAL , "Cgbo"), /* MOSFET overlap capacitance */ - OP ( "ibd", HSMHV_CBD, IF_REAL , "Ibd"), /* Diode current */ - OP ( "ibs", HSMHV_CBS, IF_REAL , "Ibs"), /* Diode current */ - OP ( "gbd", HSMHV_GBD, IF_REAL , "Gbd"), /* Diode conductance */ - OP ( "gbs", HSMHV_GBS, IF_REAL , "Gbs"), /* Diode conductance */ - OP ( "capbd", HSMHV_CAPBD, IF_REAL , "Capbd"), /* Diode capacitance */ - OP ( "capbs", HSMHV_CAPBS, IF_REAL , "Capbs") /* Diode capacitance */ -}; - -IFparm HSMHVmPTable[] = { /* model parameters */ - IP("nmos", HSMHV_MOD_NMOS, IF_FLAG, ""), - IP("pmos", HSMHV_MOD_PMOS, IF_FLAG, ""), - IOP("level", HSMHV_MOD_LEVEL, IF_INTEGER, ""), - IOP("info", HSMHV_MOD_INFO, IF_INTEGER, "Information level (for debug, etc.)"), - IOP("noise", HSMHV_MOD_NOISE, IF_INTEGER, "Noise model selector"), - IOP("version", HSMHV_MOD_VERSION, IF_STRING, "Model version"), - IOP("show", HSMHV_MOD_SHOW, IF_INTEGER, "Show physical value"), - IOP("corsrd", HSMHV_MOD_CORSRD, IF_INTEGER, "Handling of Rs and Rd"), - IOP("corg", HSMHV_MOD_CORG, IF_INTEGER, "Activate gate resistance (1) or not (0)"), - IOP("coiprv", HSMHV_MOD_COIPRV, IF_INTEGER, "Use ids_prv as initial guess of Ids (internal flag)"), - IOP("copprv", HSMHV_MOD_COPPRV, IF_INTEGER, "Use ps{0/l}_prv as initial guess of Ps{0/l} (internal flag)"), - IOP("coadov", HSMHV_MOD_COADOV, IF_INTEGER, "Add overlap to intrisic"), - IOP("coisub", HSMHV_MOD_COISUB, IF_INTEGER, "Calculate isub"), - IOP("coiigs", HSMHV_MOD_COIIGS, IF_INTEGER, "Calculate igate"), - IOP("cogidl", HSMHV_MOD_COGIDL, IF_INTEGER, "Calculate igidl"), - IOP("coovlp", HSMHV_MOD_COOVLP, IF_INTEGER, "Calculate overlap charge on the drain side"), - IOP("coovlps", HSMHV_MOD_COOVLPS, IF_INTEGER, "Calculate overlap charge on the source side"), - IOP("coflick", HSMHV_MOD_COFLICK, IF_INTEGER, "Calculate 1/f noise"), - IOP("coisti", HSMHV_MOD_COISTI, IF_INTEGER, "Calculate STI"), - IOP("conqs", HSMHV_MOD_CONQS, IF_INTEGER, "Calculate in nqs mode or qs mode"), - IOP("corbnet", HSMHV_MOD_CORBNET, IF_INTEGER, ""), - IOP("cothrml", HSMHV_MOD_COTHRML, IF_INTEGER, "Calculate thermal noise"), - IOP("coign", HSMHV_MOD_COIGN, IF_INTEGER, "Calculate induced gate noise"), - IOP("codfm", HSMHV_MOD_CODFM, IF_INTEGER, "Calculation of model for DFM"), - IOP("coqovsm", HSMHV_MOD_COQOVSM, IF_INTEGER, "select smoothing method of Qover"), - IOP("coselfheat", HSMHV_MOD_COSELFHEAT, IF_INTEGER, "Calculation of self heating model"), - IOP("cosubnode", HSMHV_MOD_COSUBNODE, IF_INTEGER, "Switch tempNode to subNode"), - IOP("cosym", HSMHV_MOD_COSYM, IF_INTEGER, "Model selector for symmetry device"), - IOP("cotemp", HSMHV_MOD_COTEMP, IF_INTEGER, "Model flag for temperature dependence"), - IOP("coldrift", HSMHV_MOD_COLDRIFT, IF_INTEGER, "selector for Ldrift parameter"), - - IOP("vbsmin", HSMHV_MOD_VBSMIN, IF_REAL, "Minimum back bias voltage to be treated in hsmhveval [V]"), - - IOP("vmax", HSMHV_MOD_VMAX, IF_REAL, "Saturation velocity [cm/s]"), - IOP("vmaxt1", HSMHV_MOD_VMAXT1, IF_REAL, "Saturation velocity coeff. [-]"), - IOP("vmaxt2", HSMHV_MOD_VMAXT2, IF_REAL, "Saturation velocity coeff. [-]"), - IOP("bgtmp1", HSMHV_MOD_BGTMP1, IF_REAL, "First order temp. coeff. for band gap [V/K]"), - IOP("bgtmp2", HSMHV_MOD_BGTMP2, IF_REAL, "Second order temp. coeff. for band gap [V/K^2]"), - IOP("eg0", HSMHV_MOD_EG0, IF_REAL, ""), - IOP("tox", HSMHV_MOD_TOX, IF_REAL, "Oxide thickness [m]"), - IOP("xld", HSMHV_MOD_XLD, IF_REAL, "Lateral diffusion of S/D under the gate [m]"), - IOP("xldld", HSMHV_MOD_XLDLD, IF_REAL, "Lateral diffusion of Drain under the gate [m]"), - IOP("xwdld", HSMHV_MOD_XWDLD, IF_REAL, ""), - IOP("lover", HSMHV_MOD_LOVER, IF_REAL, "Overlap length on source side [m], alias for lovers"), - IOP("lovers", HSMHV_MOD_LOVERS, IF_REAL, "Overlap length on source side [m]"), - IOP("rdov11", HSMHV_MOD_RDOV11, IF_REAL, "Dependence coeff. for overlap length"), - IOP("rdov12", HSMHV_MOD_RDOV12, IF_REAL, "Dependence coeff. for overlap length"), - IOP("rdov13", HSMHV_MOD_RDOV13, IF_REAL, "Dependence coeff. for overlap length"), - IOP("rdslp1", HSMHV_MOD_RDSLP1, IF_REAL, "LDRIFT1 dependence of resistance for CORSRD=1,3"), - IOP("rdict1", HSMHV_MOD_RDICT1, IF_REAL, "LDRIFT1 dependence of resistance for CORSRD=1,3"), - IOP("rdslp2", HSMHV_MOD_RDSLP2, IF_REAL, "LDRIFT2 dependence of resistance for CORSRD=1,3"), - IOP("rdict2", HSMHV_MOD_RDICT2, IF_REAL, "LDRIFT2 dependence of resistance for CORSRD=1,3"), - IOP("loverld", HSMHV_MOD_LOVERLD, IF_REAL, "Overlap length on the drain side"), - IOP("ldrift1", HSMHV_MOD_LDRIFT1, IF_REAL, "Drift region length-1 on the drain side[m]"), - IOP("ldrift2", HSMHV_MOD_LDRIFT2, IF_REAL, "Drift region length-2 on the drain side[m]"), - IOP("ldrift1s", HSMHV_MOD_LDRIFT1S, IF_REAL, "Drift region length-1 on the source side[m]"), - IOP("ldrift2s", HSMHV_MOD_LDRIFT2S, IF_REAL, "Drift region length-2 on the source side[m]"), - IOP("subld1", HSMHV_MOD_SUBLD1, IF_REAL, "Impact-ionization current in the drift region [-]"), - IOP("subld2", HSMHV_MOD_SUBLD2, IF_REAL, "Impact-ionization current in the drift region [m^{-1}*V^{3/2}]"), - IOP("ddltmax", HSMHV_MOD_DDLTMAX, IF_REAL, ""), /* Vdseff */ - IOP("ddltslp", HSMHV_MOD_DDLTSLP, IF_REAL, ""), /* Vdseff */ - IOP("ddltict", HSMHV_MOD_DDLTICT, IF_REAL, ""), /* Vdseff */ - IOP("vfbover", HSMHV_MOD_VFBOVER, IF_REAL, ""), - IOP("nover", HSMHV_MOD_NOVER, IF_REAL, ""), - IOP("novers", HSMHV_MOD_NOVERS, IF_REAL, ""), - IOP("xwd", HSMHV_MOD_XWD, IF_REAL, "Lateral diffusion along the width dir. [m]"), - IOP("xwdc", HSMHV_MOD_XWDC, IF_REAL, "Lateral diffusion along the width dir. for capacitance [m]"), - IOP("xl", HSMHV_MOD_XL, IF_REAL, "Gate length offset due to mask/etch effect [m]"), - IOP("xw", HSMHV_MOD_XW, IF_REAL, "Gate width offset due to mask/etch effect [m]"), - IOP("saref", HSMHV_MOD_SAREF, IF_REAL, "Reference distance from STI edge to Gate edge [m]"), - IOP("sbref", HSMHV_MOD_SBREF, IF_REAL, "Reference distance from STI edge to Gate edge [m]"), - IOP("ll", HSMHV_MOD_LL, IF_REAL, "Gate length parameter"), - IOP("lld", HSMHV_MOD_LLD, IF_REAL, "Gate length parameter"), - IOP("lln", HSMHV_MOD_LLN, IF_REAL, "Gate length parameter"), - IOP("wl", HSMHV_MOD_WL, IF_REAL, "Gate width parameter"), - IOP("wl1", HSMHV_MOD_WL1, IF_REAL, "Gate width parameter"), - IOP("wl1p", HSMHV_MOD_WL1P, IF_REAL, "Gate width parameter"), - IOP("wl2", HSMHV_MOD_WL2, IF_REAL, "Gate width parameter"), - IOP("wl2p", HSMHV_MOD_WL2P, IF_REAL, "Gate width parameter"), - IOP("wld", HSMHV_MOD_WLD, IF_REAL, "Gate width parameter"), - IOP("wln", HSMHV_MOD_WLN, IF_REAL, "Gate width parameter"), - IOP("xqy", HSMHV_MOD_XQY, IF_REAL, "[m]"), - IOP("xqy1", HSMHV_MOD_XQY1, IF_REAL, "[F m^{XQY2}]"), - IOP("xqy2", HSMHV_MOD_XQY2, IF_REAL, "[-]"), - IOP("rs", HSMHV_MOD_RS, IF_REAL, "Source contact resistance [ohm m]"), - IOP("rd", HSMHV_MOD_RD, IF_REAL, "Drain contact resistance [ohm m]"), - IOP("rsh", HSMHV_MOD_RSH, IF_REAL, "Source/drain diffusion sheet resistance [ohm]"), - IOP("rshg", HSMHV_MOD_RSHG, IF_REAL, "Gate-elecrode sheet resistance"), - IOP("vfbc", HSMHV_MOD_VFBC, IF_REAL, "Constant part of Vfb [V]"), - IOP("vbi", HSMHV_MOD_VBI, IF_REAL, "Built-in potential [V]"), - IOP("nsubc", HSMHV_MOD_NSUBC, IF_REAL, "Constant part of Nsub [1/cm^3]"), - IOP("parl2", HSMHV_MOD_PARL2, IF_REAL, "Under diffusion [m]"), - IOP("lp", HSMHV_MOD_LP, IF_REAL, "Length of pocket potential [m]"), - IOP("nsubp", HSMHV_MOD_NSUBP, IF_REAL, "[1/cm^3]"), - IOP("nsubp0", HSMHV_MOD_NSUBP0, IF_REAL, "Pocket implant parameter"), - IOP("nsubwp", HSMHV_MOD_NSUBWP, IF_REAL, "Pocket implant parameter"), - IOP("scp1", HSMHV_MOD_SCP1, IF_REAL, "Parameter for pocket [-]"), - IOP("scp2", HSMHV_MOD_SCP2, IF_REAL, "Parameter for pocket [1/V]"), - IOP("scp3", HSMHV_MOD_SCP3, IF_REAL, "Parameter for pocket [m/V]"), - IOP("sc1", HSMHV_MOD_SC1, IF_REAL, "Parameter for SCE [-]"), - IOP("sc2", HSMHV_MOD_SC2, IF_REAL, "Parameter for SCE [1/V]"), - IOP("sc3", HSMHV_MOD_SC3, IF_REAL, "Parameter for SCE [m/V]"), - IOP("sc4", HSMHV_MOD_SC4, IF_REAL, "Parameter for SCE [1/V]"), - IOP("pgd1", HSMHV_MOD_PGD1, IF_REAL, "Parameter for gate-poly depletion [V]"), - IOP("pgd2", HSMHV_MOD_PGD2, IF_REAL, "Parameter for gate-poly depletion [V]"), - IOP("pgd3", HSMHV_MOD_PGD3, IF_REAL, "Parameter for gate-poly depletion [-]"), - IOP("pgd4", HSMHV_MOD_PGD4, IF_REAL, "Parameter for gate-poly depletion [-]"), - IOP("ndep", HSMHV_MOD_NDEP, IF_REAL, "Coeff. of Qbm for Eeff [-]"), - IOP("ndepl", HSMHV_MOD_NDEPL, IF_REAL, "Coeff. of Qbm for Eeff [-]"), - IOP("ndeplp", HSMHV_MOD_NDEPLP, IF_REAL, "Coeff. of Qbm for Eeff [-]"), - IOP("ninv", HSMHV_MOD_NINV, IF_REAL, "Coeff. of Qnm for Eeff [-]"), - IOP("ninvd", HSMHV_MOD_NINVD, IF_REAL, "Modification of Vdse dependence on Eeff [1/V]"), - IOP("ninvdw", HSMHV_MOD_NINVDW, IF_REAL, "Coeff of modification of Vdse dependence on Eeff [-]"), - IOP("ninvdwp", HSMHV_MOD_NINVDWP, IF_REAL, "Coeff of modification of Vdse dependence on Eeff [-]"), - IOP("ninvdt1", HSMHV_MOD_NINVDT1, IF_REAL, "Coeff of modification of Vdse dependence on Eeff [-]"), - IOP("ninvdt2", HSMHV_MOD_NINVDT2, IF_REAL, "Coeff of modification of Vdse dependence on Eeff [-]"), - IOP("muecb0", HSMHV_MOD_MUECB0, IF_REAL, "Const. part of coulomb scattering [cm^2/Vs]"), - IOP("muecb1", HSMHV_MOD_MUECB1, IF_REAL, "Coeff. for coulomb scattering [cm^2/Vs]"), - IOP("mueph0", HSMHV_MOD_MUEPH0, IF_REAL, "Power of Eeff for phonon scattering [-]"), - IOP("mueph1", HSMHV_MOD_MUEPH1, IF_REAL, ""), - IOP("muephw", HSMHV_MOD_MUEPHW, IF_REAL, ""), - IOP("muepwp", HSMHV_MOD_MUEPWP, IF_REAL, "Phonon scattering parameter"), - IOP("muephl", HSMHV_MOD_MUEPHL, IF_REAL, "Phonon scattering parameter"), - IOP("mueplp", HSMHV_MOD_MUEPLP, IF_REAL, "Phonon scattering parameter"), - IOP("muephs", HSMHV_MOD_MUEPHS, IF_REAL, ""), - IOP("muepsp", HSMHV_MOD_MUEPSP, IF_REAL, ""), - IOP("vtmp", HSMHV_MOD_VTMP, IF_REAL, ""), - IOP("wvth0", HSMHV_MOD_WVTH0, IF_REAL, ""), - IOP("muesr0", HSMHV_MOD_MUESR0, IF_REAL, "Power of Eeff for S.R. scattering [-]"), - IOP("muesr1", HSMHV_MOD_MUESR1, IF_REAL, "Coeff. for S.R. scattering [-]"), - IOP("muesrl", HSMHV_MOD_MUESRL, IF_REAL, "Surface roughness parameter"), - IOP("muesrw", HSMHV_MOD_MUESRW, IF_REAL, "Change of surface roughness related mobility"), - IOP("mueswp", HSMHV_MOD_MUESWP, IF_REAL, "Change of surface roughness related mobility"), - IOP("mueslp", HSMHV_MOD_MUESLP, IF_REAL, "Surface roughness parameter"), - IOP("muetmp", HSMHV_MOD_MUETMP, IF_REAL, "Parameter for mobility [-]"), - IOP("bb", HSMHV_MOD_BB, IF_REAL, "Empirical mobility model coefficient [-]"), - IOP("sub1", HSMHV_MOD_SUB1, IF_REAL, "Parameter for Isub [1/V]"), - IOP("sub2", HSMHV_MOD_SUB2, IF_REAL, "Parameter for Isub [V]"), - IOP("svgs", HSMHV_MOD_SVGS, IF_REAL, "Coefficient for Vg of Psislsat"), - IOP("svbs", HSMHV_MOD_SVBS, IF_REAL, "Coefficient for Vbs of Psislsat"), - IOP("svbsl", HSMHV_MOD_SVBSL, IF_REAL, " "), - IOP("svds", HSMHV_MOD_SVDS, IF_REAL, " "), - IOP("slg", HSMHV_MOD_SLG, IF_REAL, " "), - IOP("sub1l", HSMHV_MOD_SUB1L, IF_REAL, " "), - IOP("sub2l", HSMHV_MOD_SUB2L, IF_REAL, " "), - IOP("fn1", HSMHV_MOD_FN1, IF_REAL, " "), - IOP("fn2", HSMHV_MOD_FN2, IF_REAL, " "), - IOP("fn3", HSMHV_MOD_FN3, IF_REAL, " "), - IOP("fvbs", HSMHV_MOD_FVBS, IF_REAL, " "), - IOP("svgsl", HSMHV_MOD_SVGSL, IF_REAL, " "), - IOP("svgslp", HSMHV_MOD_SVGSLP, IF_REAL, " "), - IOP("svgswp", HSMHV_MOD_SVGSWP, IF_REAL, " "), - IOP("svgsw", HSMHV_MOD_SVGSW, IF_REAL, " "), - IOP("svbslp", HSMHV_MOD_SVBSLP, IF_REAL, " "), - IOP("slgl", HSMHV_MOD_SLGL, IF_REAL, " "), - IOP("slglp", HSMHV_MOD_SLGLP, IF_REAL, " "), - IOP("sub1lp", HSMHV_MOD_SUB1LP, IF_REAL, " "), - IOP("nsti", HSMHV_MOD_NSTI, IF_REAL, "Parameter for STI [1/cm^3]"), - IOP("wsti", HSMHV_MOD_WSTI, IF_REAL, "Parameter for STI [m]"), - IOP("wstil", HSMHV_MOD_WSTIL, IF_REAL, "Parameter for STI [?]"), - IOP("wstilp", HSMHV_MOD_WSTILP, IF_REAL, "Parameter for STI [?]"), - IOP("wstiw", HSMHV_MOD_WSTIW, IF_REAL, "Parameter for STI [?]"), - IOP("wstiwp", HSMHV_MOD_WSTIWP, IF_REAL, "Parameter for STI [?]"), - IOP("scsti1", HSMHV_MOD_SCSTI1, IF_REAL, "Parameter for STI [-]"), - IOP("scsti2", HSMHV_MOD_SCSTI2, IF_REAL, "Parameter for STI [1/V]"), - IOP("vthsti", HSMHV_MOD_VTHSTI, IF_REAL, "Parameter for STI"), - IOP("vdsti", HSMHV_MOD_VDSTI, IF_REAL, "Parameter for STI [-]"), - IOP("muesti1", HSMHV_MOD_MUESTI1, IF_REAL, "STI Stress mobility parameter"), - IOP("muesti2", HSMHV_MOD_MUESTI2, IF_REAL, "STI Stress mobility parameter"), - IOP("muesti3", HSMHV_MOD_MUESTI3, IF_REAL, "STI Stress mobility parameter"), - IOP("nsubpsti1", HSMHV_MOD_NSUBPSTI1, IF_REAL, "STI Stress pocket implant parameter"), - IOP("nsubpsti2", HSMHV_MOD_NSUBPSTI2, IF_REAL, "STI Stress pocket implant parameter"), - IOP("nsubpsti3", HSMHV_MOD_NSUBPSTI3, IF_REAL, "STI Stress pocket implant parameter"), - IOP("lpext", HSMHV_MOD_LPEXT, IF_REAL, "Pocket extension"), - IOP("npext", HSMHV_MOD_NPEXT, IF_REAL, "Pocket extension"), - IOP("scp22", HSMHV_MOD_SCP22, IF_REAL, ""), - IOP("scp21", HSMHV_MOD_SCP21, IF_REAL, ""), - IOP("bs1", HSMHV_MOD_BS1, IF_REAL, ""), - IOP("bs2", HSMHV_MOD_BS2, IF_REAL, ""), - IOP("cgso", HSMHV_MOD_CGSO, IF_REAL, "G-S overlap capacitance per unit W [F/m]"), - IOP("cgdo", HSMHV_MOD_CGDO, IF_REAL, "G-D overlap capacitance per unit W [F/m]"), - IOP("cgbo", HSMHV_MOD_CGBO, IF_REAL, "G-B overlap capacitance per unit L [F/m]"), - IOP("tpoly", HSMHV_MOD_TPOLY, IF_REAL, "Height of poly gate on the source side[m]"), - IOP("js0", HSMHV_MOD_JS0, IF_REAL, "Saturation current density [A/m^2]"), - IOP("js0sw", HSMHV_MOD_JS0SW, IF_REAL, "Side wall saturation current density [A/m]"), - IOP("nj", HSMHV_MOD_NJ, IF_REAL, "Emission coefficient [-]"), - IOP("njsw", HSMHV_MOD_NJSW, IF_REAL, "Sidewall emission coefficient"), - IOP("xti", HSMHV_MOD_XTI, IF_REAL, "Junction current temparature exponent coefficient [-]"), - IOP("cj", HSMHV_MOD_CJ, IF_REAL, "Bottom junction capacitance per unit area at zero bias [F/m^2]"), - IOP("cjsw", HSMHV_MOD_CJSW, IF_REAL, "Source/drain sidewall junction capacitance grading coefficient per unit length at zero bias [F/m]"), - IOP("cjswg", HSMHV_MOD_CJSWG, IF_REAL, "Source/drain gate sidewall junction capacitance per unit length at zero bias [F/m]"), - IOP("mj", HSMHV_MOD_MJ, IF_REAL, "Bottom junction capacitance grading coefficient"), - IOP("mjsw", HSMHV_MOD_MJSW, IF_REAL, "Source/drain sidewall junction capacitance grading coefficient"), - IOP("mjswg", HSMHV_MOD_MJSWG, IF_REAL, "Source/drain gate sidewall junction capacitance grading coefficient"), - IOP("pb", HSMHV_MOD_PB, IF_REAL, "Bottom junction build-in potential [V]"), - IOP("pbsw", HSMHV_MOD_PBSW, IF_REAL, "Source/drain sidewall junction build-in potential [V]"), - IOP("pbswg", HSMHV_MOD_PBSWG, IF_REAL, "Source/drain gate sidewall junction build-in potential [V]"), - - IOP("xti2", HSMHV_MOD_XTI2, IF_REAL, "Temperature coefficient [-]"), - IOP("cisb", HSMHV_MOD_CISB, IF_REAL, "Reverse bias saturation current [-]"), - IOP("cvb", HSMHV_MOD_CVB, IF_REAL, "Bias dependence coefficient of cisb [-]"), - IOP("ctemp", HSMHV_MOD_CTEMP, IF_REAL, "Temperature coefficient [-]"), - IOP("cisbk", HSMHV_MOD_CISBK, IF_REAL, "Reverse bias saturation current [A]"), - IOP("cvbk", HSMHV_MOD_CVBK, IF_REAL, "Bias dependence coefficient of cisb [-]"), - IOP("divx", HSMHV_MOD_DIVX, IF_REAL, " [1/V]"), - - IOP("clm1", HSMHV_MOD_CLM1, IF_REAL, "Parameter for CLM [-]"), - IOP("clm2", HSMHV_MOD_CLM2, IF_REAL, "Parameter for CLM [1/m]"), - IOP("clm3", HSMHV_MOD_CLM3, IF_REAL, "Parameter for CLM [-]"), - IOP("clm5", HSMHV_MOD_CLM5, IF_REAL, "Parameter for CLM [-]"), - IOP("clm6", HSMHV_MOD_CLM6, IF_REAL, "Parameter for CLM [um^{-clm5}]"), - IOP("vover", HSMHV_MOD_VOVER, IF_REAL, "Parameter for overshoot [m^{voverp}]"), - IOP("voverp", HSMHV_MOD_VOVERP, IF_REAL, "Parameter for overshoot [-]"), - IOP("vovers", HSMHV_MOD_VOVERS, IF_REAL, "Parameter for overshoot [-]"), - IOP("voversp", HSMHV_MOD_VOVERSP, IF_REAL, "Parameter for overshoot [-]"), - - IOP("wfc", HSMHV_MOD_WFC, IF_REAL, "Parameter for narrow channel effect [m*F/(cm^2)]"), - IOP("nsubcw", HSMHV_MOD_NSUBCW, IF_REAL, "Parameter for narrow channel effect "), - IOP("nsubcwp", HSMHV_MOD_NSUBCWP, IF_REAL, "Parameter for narrow channel effect "), - IOP("qme1", HSMHV_MOD_QME1, IF_REAL, "Parameter for quantum effect [mV]"), - IOP("qme2", HSMHV_MOD_QME2, IF_REAL, "Parameter for quantum effect [V]"), - IOP("qme3", HSMHV_MOD_QME3, IF_REAL, "Parameter for quantum effect [m]"), - IOP("gidl1", HSMHV_MOD_GIDL1, IF_REAL, "Parameter for GIDL [?]"), - IOP("gidl2", HSMHV_MOD_GIDL2, IF_REAL, "Parameter for GIDL [?]"), - IOP("gidl3", HSMHV_MOD_GIDL3, IF_REAL, "Parameter for GIDL [?]"), - IOP("gidl4", HSMHV_MOD_GIDL4, IF_REAL, "Parameter for GIDL [?]"), - IOP("gidl5", HSMHV_MOD_GIDL5, IF_REAL, "Parameter for GIDL [?]"), - IOP("glpart1", HSMHV_MOD_GLPART1, IF_REAL, "Parameter for gate current [-]"), - IOP("gleak1", HSMHV_MOD_GLEAK1, IF_REAL, "Parameter for gate current [A*V^(-3/2)/C]"), - IOP("gleak2", HSMHV_MOD_GLEAK2, IF_REAL, "Parameter for gate current [V^(-1/2)/m ]"), - IOP("gleak3", HSMHV_MOD_GLEAK3, IF_REAL, "Parameter for gate current [-]"), - IOP("gleak4", HSMHV_MOD_GLEAK4, IF_REAL, "Parameter for gate current [1/m]"), - IOP("gleak5", HSMHV_MOD_GLEAK5, IF_REAL, "Parameter for gate current [V/m]"), - IOP("gleak6", HSMHV_MOD_GLEAK6, IF_REAL, "Parameter for gate current [V]"), - IOP("gleak7", HSMHV_MOD_GLEAK7, IF_REAL, "Parameter for gate current [m^2]"), - IOP("glksd1", HSMHV_MOD_GLKSD1, IF_REAL, "Parameter for gate current [A*m/V^2]"), - IOP("glksd2", HSMHV_MOD_GLKSD2, IF_REAL, "Parameter for gate current [1/(V*m)]"), - IOP("glksd3", HSMHV_MOD_GLKSD3, IF_REAL, "Parameter for gate current [1/m]"), - IOP("glkb1", HSMHV_MOD_GLKB1, IF_REAL, "Parameter for gate current [A/V^2]"), - IOP("glkb2", HSMHV_MOD_GLKB2, IF_REAL, "Parameter for gate current [m/V]"), - IOP("glkb3", HSMHV_MOD_GLKB3, IF_REAL, "Parameter for gate current [V]"), - IOP("egig", HSMHV_MOD_EGIG, IF_REAL, "Parameter for gate current [V]"), - IOP("igtemp2", HSMHV_MOD_IGTEMP2, IF_REAL, "Parameter for gate current [V*k]"), - IOP("igtemp3", HSMHV_MOD_IGTEMP3, IF_REAL, "Parameter for gate current [V*k^2]"), - IOP("vzadd0", HSMHV_MOD_VZADD0, IF_REAL, "Vzadd at Vds=0 [V]"), - IOP("pzadd0", HSMHV_MOD_PZADD0, IF_REAL, "Pzadd at Vds=0 [V]"), - IOP("nftrp", HSMHV_MOD_NFTRP, IF_REAL, ""), - IOP("nfalp", HSMHV_MOD_NFALP, IF_REAL, ""), - IOP("cit", HSMHV_MOD_CIT, IF_REAL, ""), - IOP("falph", HSMHV_MOD_FALPH, IF_REAL, "Parameter for 1/f noise"), - IOP("kappa", HSMHV_MOD_KAPPA, IF_REAL, "Dielectric constant for high-k stacked gate"), - IOP("pthrou", HSMHV_MOD_PTHROU, IF_REAL, "Modify subthreshold slope [-]"), - IOP("vdiffj", HSMHV_MOD_VDIFFJ, IF_REAL, "Threshold voltage for S/D junction diode [V]"), - IOP("dly1", HSMHV_MOD_DLY1, IF_REAL, "Parameter for transit time [-]"), - IOP("dly2", HSMHV_MOD_DLY2, IF_REAL, "Parameter for transit time [-]"), - IOP("dly3", HSMHV_MOD_DLY3, IF_REAL, "Parameter for transforming bulk charge [s/F]"), - IOP("dlyov", HSMHV_MOD_DLYOV, IF_REAL, "Parameter for transforming overlap charge [s/F]"), /* not used */ - IOP("tnom", HSMHV_MOD_TNOM, IF_REAL, "Nominal temperature [K]"), - IOP("ovslp", HSMHV_MOD_OVSLP, IF_REAL, ""), - IOP("ovmag", HSMHV_MOD_OVMAG, IF_REAL, ""), - - IOP("gbmin", HSMHV_MOD_GBMIN, IF_REAL, ""), - IOP("rbpb", HSMHV_MOD_RBPB, IF_REAL, ""), - IOP("rbpd", HSMHV_MOD_RBPD, IF_REAL, ""), /* not used */ - IOP("rbps", HSMHV_MOD_RBPS, IF_REAL, ""), /* not used */ - IOP("rbdb", HSMHV_MOD_RBDB, IF_REAL, ""), - IOP("rbsb", HSMHV_MOD_RBSB, IF_REAL, ""), - - IOP("ibpc1", HSMHV_MOD_IBPC1, IF_REAL, "Parameter for impact-ionization induced bulk potential change"), - IOP("ibpc2", HSMHV_MOD_IBPC2, IF_REAL, "Parameter for impact-ionization induced bulk potential change"), - - IOP("mphdfm", HSMHV_MOD_MPHDFM, IF_REAL, "NSUBCDFM dependence of phonon scattering for DFM"), - - IOP("rdvg11", HSMHV_MOD_RDVG11, IF_REAL, ""), - IOP("rdvg12", HSMHV_MOD_RDVG12, IF_REAL, ""), - IOP("rth0", HSMHV_MOD_RTH0, IF_REAL, "Thermal resistance"), /* Self-heating model --SHE---*/ - IOP("cth0", HSMHV_MOD_CTH0, IF_REAL, "Thermal capacitance"), /* Self-heating model --SHE--- */ - IOP("powrat", HSMHV_MOD_POWRAT, IF_REAL, ""), /* Self-heating model --SHE--- */ - - IOP("rthtemp1", HSMHV_MOD_RTHTEMP1, IF_REAL, "Thermal resistance"), /* Self-heating model --SHE---*/ - IOP("rthtemp2", HSMHV_MOD_RTHTEMP2, IF_REAL, "Thermal resistance"), /* Self-heating model --SHE---*/ - IOP("prattemp1", HSMHV_MOD_PRATTEMP1, IF_REAL, ""), /* Self-heating model --SHE--- */ - IOP("prattemp2", HSMHV_MOD_PRATTEMP2, IF_REAL, ""), /* Self-heating model --SHE--- */ - - IOP("tcjbd", HSMHV_MOD_TCJBD, IF_REAL, "Temperature dependence of cjbd"), /* Self-heating model --SHE--- */ - IOP("tcjbs", HSMHV_MOD_TCJBS, IF_REAL, "Temperature dependence of cjbs"), /* Self-heating model --SHE--- */ - IOP("tcjbdsw", HSMHV_MOD_TCJBDSW, IF_REAL, "Temperature dependence of cjbdsw"), /* Self-heating model --SHE--- */ - IOP("tcjbssw", HSMHV_MOD_TCJBSSW, IF_REAL, "Temperature dependence of cjbssw"), /* Self-heating model --SHE--- */ - IOP("tcjbdswg", HSMHV_MOD_TCJBDSWG, IF_REAL, "Temperature dependence of cjbdswg"), /* Self-heating model --SHE--- */ - IOP("tcjbsswg", HSMHV_MOD_TCJBSSWG, IF_REAL, "Temperature dependence of cjbsswg"), /* Self-heating model --SHE--- */ - - IOP("qdftvd", HSMHV_MOD_QDFTVD, IF_REAL, "Qdrift Vd dependence "), - IOP("rdvd", HSMHV_MOD_RDVD, IF_REAL, ""), - IOP("rdvb", HSMHV_MOD_RDVB, IF_REAL, ""), - IOP("rd20", HSMHV_MOD_RD20, IF_REAL, ""), - IOP("rd21", HSMHV_MOD_RD21, IF_REAL, ""), - IOP("rd22", HSMHV_MOD_RD22, IF_REAL, ""), - IOP("rd22d", HSMHV_MOD_RD22D, IF_REAL, ""), - IOP("rd23", HSMHV_MOD_RD23, IF_REAL, ""), - IOP("rd24", HSMHV_MOD_RD24, IF_REAL, ""), - IOP("rd25", HSMHV_MOD_RD25, IF_REAL, ""), - IOP("rd26", HSMHV_MOD_RD26, IF_REAL, "alias for qovsm"), - IOP("rdvdl", HSMHV_MOD_RDVDL, IF_REAL, ""), - IOP("rdvdlp", HSMHV_MOD_RDVDLP, IF_REAL, ""), - IOP("rdvds", HSMHV_MOD_RDVDS, IF_REAL, ""), - IOP("rdvdsp", HSMHV_MOD_RDVDSP, IF_REAL, ""), - IOP("rd23l", HSMHV_MOD_RD23L, IF_REAL, ""), - IOP("rd23lp", HSMHV_MOD_RD23LP, IF_REAL, ""), - IOP("rd23s", HSMHV_MOD_RD23S, IF_REAL, ""), - IOP("rd23sp", HSMHV_MOD_RD23SP, IF_REAL, ""), - IOP("rds", HSMHV_MOD_RDS, IF_REAL, ""), - IOP("rdsp", HSMHV_MOD_RDSP, IF_REAL, ""), - IOP("qovsm", HSMHV_MOD_QOVSM, IF_REAL, "Smoothing Qover at depletion/inversion transition"), - IOP("ldrift", HSMHV_MOD_LDRIFT, IF_REAL, "alias for ldrift2"), - IOP("rdtemp1", HSMHV_MOD_RDTEMP1, IF_REAL, "Temperature-dependence of Rd"), - IOP("rdtemp2", HSMHV_MOD_RDTEMP2, IF_REAL, "Temperature-dependence of Rd"), - IOP("rth0r", HSMHV_MOD_RTH0R, IF_REAL, "Heat radiation for SHE"), /* not used */ - IOP("rdvdtemp1", HSMHV_MOD_RDVDTEMP1, IF_REAL, "Temperature-dependence of RDVD"), - IOP("rdvdtemp2", HSMHV_MOD_RDVDTEMP2, IF_REAL, "Temperature-dependence of RDVD"), - IOP("rth0w", HSMHV_MOD_RTH0W, IF_REAL, "Width-dependence of RTH0"), - IOP("rth0wp", HSMHV_MOD_RTH0WP, IF_REAL, "Width-dependence of RTH0"), - IOP("rth0nf", HSMHV_MOD_RTH0NF, IF_REAL, "nf-dependence of RTH0"), - IOP("cvdsover", HSMHV_MOD_CVDSOVER, IF_REAL, "vds drop along the overlap"), - - IOP("rdvsub", HSMHV_MOD_RDVSUB, IF_REAL, "model parameter for the substrate effect"), - IOP("rdvdsub", HSMHV_MOD_RDVDSUB, IF_REAL, "model parameter for the substrate effect"), - IOP("ddrift", HSMHV_MOD_DDRIFT, IF_REAL, "model parameter for the substrate effect"), - IOP("vbisub", HSMHV_MOD_VBISUB, IF_REAL, "model parameter for the substrate effect"), - IOP("nsubsub", HSMHV_MOD_NSUBSUB, IF_REAL, "model parameter for the substrate effect"), - IOP("shemax", HSMHV_MOD_SHEMAX, IF_REAL, "Maximum rise temperatue for SHE [C]"), - - /* binning parameters */ - IOP("lmin", HSMHV_MOD_LMIN, IF_REAL, "Minimum length for the model"), - IOP("lmax", HSMHV_MOD_LMAX, IF_REAL, "Maximum length for the model"), - IOP("wmin", HSMHV_MOD_WMIN, IF_REAL, "Minimum width for the model"), - IOP("wmax", HSMHV_MOD_WMAX, IF_REAL, "Maximum width for the model"), - IOP("lbinn", HSMHV_MOD_LBINN, IF_REAL, "L modulation coefficient for binning"), - IOP("wbinn", HSMHV_MOD_WBINN, IF_REAL, "W modulation coefficient for binning"), - - /* Length dependence */ - IOP("lvmax", HSMHV_MOD_LVMAX, IF_REAL, "Length dependence of vmax"), - IOP("lbgtmp1", HSMHV_MOD_LBGTMP1, IF_REAL, "Length dependence of bgtmp1"), - IOP("lbgtmp2", HSMHV_MOD_LBGTMP2, IF_REAL, "Length dependence of bgtmp2"), - IOP("leg0", HSMHV_MOD_LEG0, IF_REAL, "Length dependence of eg0"), - IOP("lvfbover", HSMHV_MOD_LVFBOVER, IF_REAL, "Length dependence of vfbover"), - IOP("lnover", HSMHV_MOD_LNOVER, IF_REAL, "Length dependence of nover"), - IOP("lnovers", HSMHV_MOD_LNOVERS, IF_REAL, "Length dependence of nover on source size"), - IOP("lwl2", HSMHV_MOD_LWL2, IF_REAL, "Length dependence of wl2"), - IOP("lvfbc", HSMHV_MOD_LVFBC, IF_REAL, "Length dependence of vfbc"), - IOP("lnsubc", HSMHV_MOD_LNSUBC, IF_REAL, "Length dependence of nsubc"), - IOP("lnsubp", HSMHV_MOD_LNSUBP, IF_REAL, "Length dependence of nsubp"), - IOP("lscp1", HSMHV_MOD_LSCP1, IF_REAL, "Length dependence of scp1"), - IOP("lscp2", HSMHV_MOD_LSCP2, IF_REAL, "Length dependence of scp2"), - IOP("lscp3", HSMHV_MOD_LSCP3, IF_REAL, "Length dependence of scp3"), - IOP("lsc1", HSMHV_MOD_LSC1, IF_REAL, "Length dependence of sc1"), - IOP("lsc2", HSMHV_MOD_LSC2, IF_REAL, "Length dependence of sc2"), - IOP("lsc3", HSMHV_MOD_LSC3, IF_REAL, "Length dependence of sc3"), - IOP("lpgd1", HSMHV_MOD_LPGD1, IF_REAL, "Length dependence of pgd1"), - IOP("lpgd3", HSMHV_MOD_LPGD3, IF_REAL, "Length dependence of pgd3"), - IOP("lndep", HSMHV_MOD_LNDEP, IF_REAL, "Length dependence of ndep"), - IOP("lninv", HSMHV_MOD_LNINV, IF_REAL, "Length dependence of ninv"), - IOP("lmuecb0", HSMHV_MOD_LMUECB0, IF_REAL, "Length dependence of muecb0"), - IOP("lmuecb1", HSMHV_MOD_LMUECB1, IF_REAL, "Length dependence of muecb1"), - IOP("lmueph1", HSMHV_MOD_LMUEPH1, IF_REAL, "Length dependence of mueph1"), - IOP("lvtmp", HSMHV_MOD_LVTMP, IF_REAL, "Length dependence of vtmp"), - IOP("lwvth0", HSMHV_MOD_LWVTH0, IF_REAL, "Length dependence of wvth0"), - IOP("lmuesr1", HSMHV_MOD_LMUESR1, IF_REAL, "Length dependence of muesr1"), - IOP("lmuetmp", HSMHV_MOD_LMUETMP, IF_REAL, "Length dependence of muetmp"), - IOP("lsub1", HSMHV_MOD_LSUB1, IF_REAL, "Length dependence of sub1"), - IOP("lsub2", HSMHV_MOD_LSUB2, IF_REAL, "Length dependence of sub2"), - IOP("lsvds", HSMHV_MOD_LSVDS, IF_REAL, "Length dependence of svds"), - IOP("lsvbs", HSMHV_MOD_LSVBS, IF_REAL, "Length dependence of svbs"), - IOP("lsvgs", HSMHV_MOD_LSVGS, IF_REAL, "Length dependence of svgs"), - IOP("lfn1", HSMHV_MOD_LFN1, IF_REAL, "Length dependence of fn1"), - IOP("lfn2", HSMHV_MOD_LFN2, IF_REAL, "Length dependence of fn2"), - IOP("lfn3", HSMHV_MOD_LFN3, IF_REAL, "Length dependence of fn3"), - IOP("lfvbs", HSMHV_MOD_LFVBS, IF_REAL, "Length dependence of fvbs"), - IOP("lnsti", HSMHV_MOD_LNSTI, IF_REAL, "Length dependence of nsti"), - IOP("lwsti", HSMHV_MOD_LWSTI, IF_REAL, "Length dependence of wsti"), - IOP("lscsti1", HSMHV_MOD_LSCSTI1, IF_REAL, "Length dependence of scsti1"), - IOP("lscsti2", HSMHV_MOD_LSCSTI2, IF_REAL, "Length dependence of scsti2"), - IOP("lvthsti", HSMHV_MOD_LVTHSTI, IF_REAL, "Length dependence of vthsti"), - IOP("lmuesti1", HSMHV_MOD_LMUESTI1, IF_REAL, "Length dependence of muesti1"), - IOP("lmuesti2", HSMHV_MOD_LMUESTI2, IF_REAL, "Length dependence of muesti2"), - IOP("lmuesti3", HSMHV_MOD_LMUESTI3, IF_REAL, "Length dependence of muesti3"), - IOP("lnsubpsti1", HSMHV_MOD_LNSUBPSTI1, IF_REAL, "Length dependence of nsubpsti1"), - IOP("lnsubpsti2", HSMHV_MOD_LNSUBPSTI2, IF_REAL, "Length dependence of nsubpsti2"), - IOP("lnsubpsti3", HSMHV_MOD_LNSUBPSTI3, IF_REAL, "Length dependence of nsubpsti3"), - IOP("lcgso", HSMHV_MOD_LCGSO, IF_REAL, "Length dependence of cgso"), - IOP("lcgdo", HSMHV_MOD_LCGDO, IF_REAL, "Length dependence of cgdo"), - IOP("ljs0", HSMHV_MOD_LJS0, IF_REAL, "Length dependence of js0"), - IOP("ljs0sw", HSMHV_MOD_LJS0SW, IF_REAL, "Length dependence of js0sw"), - IOP("lnj", HSMHV_MOD_LNJ, IF_REAL, "Length dependence of nj"), - IOP("lcisbk", HSMHV_MOD_LCISBK, IF_REAL, "Length dependence of cisbk"), - IOP("lclm1", HSMHV_MOD_LCLM1, IF_REAL, "Length dependence of clm1"), - IOP("lclm2", HSMHV_MOD_LCLM2, IF_REAL, "Length dependence of clm2"), - IOP("lclm3", HSMHV_MOD_LCLM3, IF_REAL, "Length dependence of clm3"), - IOP("lwfc", HSMHV_MOD_LWFC, IF_REAL, "Length dependence of wfc"), - IOP("lgidl1", HSMHV_MOD_LGIDL1, IF_REAL, "Length dependence of gidl1"), - IOP("lgidl2", HSMHV_MOD_LGIDL2, IF_REAL, "Length dependence of gidl2"), - IOP("lgleak1", HSMHV_MOD_LGLEAK1, IF_REAL, "Length dependence of gleak1"), - IOP("lgleak2", HSMHV_MOD_LGLEAK2, IF_REAL, "Length dependence of gleak2"), - IOP("lgleak3", HSMHV_MOD_LGLEAK3, IF_REAL, "Length dependence of gleak3"), - IOP("lgleak6", HSMHV_MOD_LGLEAK6, IF_REAL, "Length dependence of gleak6"), - IOP("lglksd1", HSMHV_MOD_LGLKSD1, IF_REAL, "Length dependence of glksd1"), - IOP("lglksd2", HSMHV_MOD_LGLKSD2, IF_REAL, "Length dependence of glksd2"), - IOP("lglkb1", HSMHV_MOD_LGLKB1, IF_REAL, "Length dependence of glkb1"), - IOP("lglkb2", HSMHV_MOD_LGLKB2, IF_REAL, "Length dependence of glkb2"), - IOP("lnftrp", HSMHV_MOD_LNFTRP, IF_REAL, "Length dependence of nftrp"), - IOP("lnfalp", HSMHV_MOD_LNFALP, IF_REAL, "Length dependence of nfalp"), - IOP("lpthrou", HSMHV_MOD_LPTHROU, IF_REAL, "Length dependence of pthrou"), - IOP("lvdiffj", HSMHV_MOD_LVDIFFJ, IF_REAL, "Length dependence of vdiffj"), - IOP("libpc1", HSMHV_MOD_LIBPC1, IF_REAL, "Length dependence of ibpc1"), - IOP("libpc2", HSMHV_MOD_LIBPC2, IF_REAL, "Length dependence of ibpc2"), - IOP("lcgbo", HSMHV_MOD_LCGBO, IF_REAL, "Length dependence of cgbo"), - IOP("lcvdsover", HSMHV_MOD_LCVDSOVER, IF_REAL, "Length dependence of cvdsover"), - IOP("lfalph", HSMHV_MOD_LFALPH, IF_REAL, "Length dependence of falph"), - IOP("lnpext", HSMHV_MOD_LNPEXT, IF_REAL, "Length dependence of npext"), - IOP("lpowrat", HSMHV_MOD_LPOWRAT, IF_REAL, "Length dependence of powrat"), - IOP("lrd", HSMHV_MOD_LRD, IF_REAL, "Length dependence of rd"), - IOP("lrd22", HSMHV_MOD_LRD22, IF_REAL, "Length dependence of rd22"), - IOP("lrd23", HSMHV_MOD_LRD23, IF_REAL, "Length dependence of rd23"), - IOP("lrd24", HSMHV_MOD_LRD24, IF_REAL, "Length dependence of rd24"), - IOP("lrdict1", HSMHV_MOD_LRDICT1, IF_REAL, "Length dependence of rdict1"), - IOP("lrdov13", HSMHV_MOD_LRDOV13, IF_REAL, "Length dependence of rdov13"), - IOP("lrdslp1", HSMHV_MOD_LRDSLP1, IF_REAL, "Length dependence of rdslp1"), - IOP("lrdvb", HSMHV_MOD_LRDVB, IF_REAL, "Length dependence of rdvb"), - IOP("lrdvd", HSMHV_MOD_LRDVD, IF_REAL, "Length dependence of rdvd"), - IOP("lrdvg11", HSMHV_MOD_LRDVG11, IF_REAL, "Length dependence of rdvg11"), - IOP("lrs", HSMHV_MOD_LRS, IF_REAL, "Length dependence of rs"), - IOP("lrth0", HSMHV_MOD_LRTH0, IF_REAL, "Length dependence of rth0"), - IOP("lvover", HSMHV_MOD_LVOVER, IF_REAL, "Length dependence of vover"), - - /* Width dependence */ - IOP("wvmax", HSMHV_MOD_WVMAX, IF_REAL, "Width dependence of vmax"), - IOP("wbgtmp1", HSMHV_MOD_WBGTMP1, IF_REAL, "Width dependence of bgtmp1"), - IOP("wbgtmp2", HSMHV_MOD_WBGTMP2, IF_REAL, "Width dependence of bgtmp2"), - IOP("weg0", HSMHV_MOD_WEG0, IF_REAL, "Width dependence of eg0"), - IOP("wvfbover", HSMHV_MOD_WVFBOVER, IF_REAL, "Width dependence of vfbover"), - IOP("wnover", HSMHV_MOD_WNOVER, IF_REAL, "Width dependence of nover"), - IOP("wnovers", HSMHV_MOD_WNOVERS, IF_REAL, "Width dependence of novers on source size"), - IOP("wwl2", HSMHV_MOD_WWL2, IF_REAL, "Width dependence of wl2"), - IOP("wvfbc", HSMHV_MOD_WVFBC, IF_REAL, "Width dependence of vfbc"), - IOP("wnsubc", HSMHV_MOD_WNSUBC, IF_REAL, "Width dependence of nsubc"), - IOP("wnsubp", HSMHV_MOD_WNSUBP, IF_REAL, "Width dependence of nsubp"), - IOP("wscp1", HSMHV_MOD_WSCP1, IF_REAL, "Width dependence of scp1"), - IOP("wscp2", HSMHV_MOD_WSCP2, IF_REAL, "Width dependence of scp2"), - IOP("wscp3", HSMHV_MOD_WSCP3, IF_REAL, "Width dependence of scp3"), - IOP("wsc1", HSMHV_MOD_WSC1, IF_REAL, "Width dependence of sc1"), - IOP("wsc2", HSMHV_MOD_WSC2, IF_REAL, "Width dependence of sc2"), - IOP("wsc3", HSMHV_MOD_WSC3, IF_REAL, "Width dependence of sc3"), - IOP("wpgd1", HSMHV_MOD_WPGD1, IF_REAL, "Width dependence of pgd1"), - IOP("wpgd3", HSMHV_MOD_WPGD3, IF_REAL, "Width dependence of pgd3"), - IOP("wndep", HSMHV_MOD_WNDEP, IF_REAL, "Width dependence of ndep"), - IOP("wninv", HSMHV_MOD_WNINV, IF_REAL, "Width dependence of ninv"), - IOP("wmuecb0", HSMHV_MOD_WMUECB0, IF_REAL, "Width dependence of muecb0"), - IOP("wmuecb1", HSMHV_MOD_WMUECB1, IF_REAL, "Width dependence of muecb1"), - IOP("wmueph1", HSMHV_MOD_WMUEPH1, IF_REAL, "Width dependence of mueph1"), - IOP("wvtmp", HSMHV_MOD_WVTMP, IF_REAL, "Width dependence of vtmp"), - IOP("wwvth0", HSMHV_MOD_WWVTH0, IF_REAL, "Width dependence of wvth0"), - IOP("wmuesr1", HSMHV_MOD_WMUESR1, IF_REAL, "Width dependence of muesr1"), - IOP("wmuetmp", HSMHV_MOD_WMUETMP, IF_REAL, "Width dependence of muetmp"), - IOP("wsub1", HSMHV_MOD_WSUB1, IF_REAL, "Width dependence of sub1"), - IOP("wsub2", HSMHV_MOD_WSUB2, IF_REAL, "Width dependence of sub2"), - IOP("wsvds", HSMHV_MOD_WSVDS, IF_REAL, "Width dependence of svds"), - IOP("wsvbs", HSMHV_MOD_WSVBS, IF_REAL, "Width dependence of svbs"), - IOP("wsvgs", HSMHV_MOD_WSVGS, IF_REAL, "Width dependence of svgs"), - IOP("wfn1", HSMHV_MOD_WFN1, IF_REAL, "Width dependence of fn1"), - IOP("wfn2", HSMHV_MOD_WFN2, IF_REAL, "Width dependence of fn2"), - IOP("wfn3", HSMHV_MOD_WFN3, IF_REAL, "Width dependence of fn3"), - IOP("wfvbs", HSMHV_MOD_WFVBS, IF_REAL, "Width dependence of fvbs"), - IOP("wnsti", HSMHV_MOD_WNSTI, IF_REAL, "Width dependence of nsti"), - IOP("wwsti", HSMHV_MOD_WWSTI, IF_REAL, "Width dependence of wsti"), - IOP("wscsti1", HSMHV_MOD_WSCSTI1, IF_REAL, "Width dependence of scsti1"), - IOP("wscsti2", HSMHV_MOD_WSCSTI2, IF_REAL, "Width dependence of scsti2"), - IOP("wvthsti", HSMHV_MOD_WVTHSTI, IF_REAL, "Width dependence of vthsti"), - IOP("wmuesti1", HSMHV_MOD_WMUESTI1, IF_REAL, "Width dependence of muesti1"), - IOP("wmuesti2", HSMHV_MOD_WMUESTI2, IF_REAL, "Width dependence of muesti2"), - IOP("wmuesti3", HSMHV_MOD_WMUESTI3, IF_REAL, "Width dependence of muesti3"), - IOP("wnsubpsti1", HSMHV_MOD_WNSUBPSTI1, IF_REAL, "Width dependence of nsubpsti1"), - IOP("wnsubpsti2", HSMHV_MOD_WNSUBPSTI2, IF_REAL, "Width dependence of nsubpsti2"), - IOP("wnsubpsti3", HSMHV_MOD_WNSUBPSTI3, IF_REAL, "Width dependence of nsubpsti3"), - IOP("wcgso", HSMHV_MOD_WCGSO, IF_REAL, "Width dependence of cgso"), - IOP("wcgdo", HSMHV_MOD_WCGDO, IF_REAL, "Width dependence of cgdo"), - IOP("wjs0", HSMHV_MOD_WJS0, IF_REAL, "Width dependence of js0"), - IOP("wjs0sw", HSMHV_MOD_WJS0SW, IF_REAL, "Width dependence of js0sw"), - IOP("wnj", HSMHV_MOD_WNJ, IF_REAL, "Width dependence of nj"), - IOP("wcisbk", HSMHV_MOD_WCISBK, IF_REAL, "Width dependence of cisbk"), - IOP("wclm1", HSMHV_MOD_WCLM1, IF_REAL, "Width dependence of clm1"), - IOP("wclm2", HSMHV_MOD_WCLM2, IF_REAL, "Width dependence of clm2"), - IOP("wclm3", HSMHV_MOD_WCLM3, IF_REAL, "Width dependence of clm3"), - IOP("wwfc", HSMHV_MOD_WWFC, IF_REAL, "Width dependence of wfc"), - IOP("wgidl1", HSMHV_MOD_WGIDL1, IF_REAL, "Width dependence of gidl1"), - IOP("wgidl2", HSMHV_MOD_WGIDL2, IF_REAL, "Width dependence of gidl2"), - IOP("wgleak1", HSMHV_MOD_WGLEAK1, IF_REAL, "Width dependence of gleak1"), - IOP("wgleak2", HSMHV_MOD_WGLEAK2, IF_REAL, "Width dependence of gleak2"), - IOP("wgleak3", HSMHV_MOD_WGLEAK3, IF_REAL, "Width dependence of gleak3"), - IOP("wgleak6", HSMHV_MOD_WGLEAK6, IF_REAL, "Width dependence of gleak6"), - IOP("wglksd1", HSMHV_MOD_WGLKSD1, IF_REAL, "Width dependence of glksd1"), - IOP("wglksd2", HSMHV_MOD_WGLKSD2, IF_REAL, "Width dependence of glksd2"), - IOP("wglkb1", HSMHV_MOD_WGLKB1, IF_REAL, "Width dependence of glkb1"), - IOP("wglkb2", HSMHV_MOD_WGLKB2, IF_REAL, "Width dependence of glkb2"), - IOP("wnftrp", HSMHV_MOD_WNFTRP, IF_REAL, "Width dependence of nftrp"), - IOP("wnfalp", HSMHV_MOD_WNFALP, IF_REAL, "Width dependence of nfalp"), - IOP("wpthrou", HSMHV_MOD_WPTHROU, IF_REAL, "Width dependence of pthrou"), - IOP("wvdiffj", HSMHV_MOD_WVDIFFJ, IF_REAL, "Width dependence of vdiffj"), - IOP("wibpc1", HSMHV_MOD_WIBPC1, IF_REAL, "Width dependence of ibpc1"), - IOP("wibpc2", HSMHV_MOD_WIBPC2, IF_REAL, "Width dependence of ibpc2"), - IOP("wcgbo", HSMHV_MOD_WCGBO, IF_REAL, "Width dependence of cgbo"), - IOP("wcvdsover", HSMHV_MOD_WCVDSOVER, IF_REAL, "Width dependence of cvdsover"), - IOP("wfalph", HSMHV_MOD_WFALPH, IF_REAL, "Width dependence of falph"), - IOP("wnpext", HSMHV_MOD_WNPEXT, IF_REAL, "Width dependence of npext"), - IOP("wpowrat", HSMHV_MOD_WPOWRAT, IF_REAL, "Width dependence of powrat"), - IOP("wrd", HSMHV_MOD_WRD, IF_REAL, "Width dependence of rd"), - IOP("wrd22", HSMHV_MOD_WRD22, IF_REAL, "Width dependence of rd22"), - IOP("wrd23", HSMHV_MOD_WRD23, IF_REAL, "Width dependence of rd23"), - IOP("wrd24", HSMHV_MOD_WRD24, IF_REAL, "Width dependence of rd24"), - IOP("wrdict1", HSMHV_MOD_WRDICT1, IF_REAL, "Width dependence of rdict1"), - IOP("wrdov13", HSMHV_MOD_WRDOV13, IF_REAL, "Width dependence of rdov13"), - IOP("wrdslp1", HSMHV_MOD_WRDSLP1, IF_REAL, "Width dependence of rdslp1"), - IOP("wrdvb", HSMHV_MOD_WRDVB, IF_REAL, "Width dependence of rdvb"), - IOP("wrdvd", HSMHV_MOD_WRDVD, IF_REAL, "Width dependence of rdvd"), - IOP("wrdvg11", HSMHV_MOD_WRDVG11, IF_REAL, "Width dependence of rdvg11"), - IOP("wrs", HSMHV_MOD_WRS, IF_REAL, "Width dependence of rs"), - IOP("wrth0", HSMHV_MOD_WRTH0, IF_REAL, "Width dependence of rth0"), - IOP("wvover", HSMHV_MOD_WVOVER, IF_REAL, "Width dependence of vover"), - - /* Cross-term dependence */ - IOP("pvmax", HSMHV_MOD_PVMAX, IF_REAL, "Cross-term dependence of vmax"), - IOP("pbgtmp1", HSMHV_MOD_PBGTMP1, IF_REAL, "Cross-term dependence of bgtmp1"), - IOP("pbgtmp2", HSMHV_MOD_PBGTMP2, IF_REAL, "Cross-term dependence of bgtmp2"), - IOP("peg0", HSMHV_MOD_PEG0, IF_REAL, "Cross-term dependence of eg0"), - IOP("pvfbover", HSMHV_MOD_PVFBOVER, IF_REAL, "Cross-term dependence of vfbover"), - IOP("pnover", HSMHV_MOD_PNOVER, IF_REAL, "Cross-term dependence of nover"), - IOP("pnovers", HSMHV_MOD_PNOVERS, IF_REAL, "Cross-term dependence of nover on source size"), - IOP("pwl2", HSMHV_MOD_PWL2, IF_REAL, "Cross-term dependence of wl2"), - IOP("pvfbc", HSMHV_MOD_PVFBC, IF_REAL, "Cross-term dependence of vfbc"), - IOP("pnsubc", HSMHV_MOD_PNSUBC, IF_REAL, "Cross-term dependence of nsubc"), - IOP("pnsubp", HSMHV_MOD_PNSUBP, IF_REAL, "Cross-term dependence of nsubp"), - IOP("pscp1", HSMHV_MOD_PSCP1, IF_REAL, "Cross-term dependence of scp1"), - IOP("pscp2", HSMHV_MOD_PSCP2, IF_REAL, "Cross-term dependence of scp2"), - IOP("pscp3", HSMHV_MOD_PSCP3, IF_REAL, "Cross-term dependence of scp3"), - IOP("psc1", HSMHV_MOD_PSC1, IF_REAL, "Cross-term dependence of sc1"), - IOP("psc2", HSMHV_MOD_PSC2, IF_REAL, "Cross-term dependence of sc2"), - IOP("psc3", HSMHV_MOD_PSC3, IF_REAL, "Cross-term dependence of sc3"), - IOP("ppgd1", HSMHV_MOD_PPGD1, IF_REAL, "Cross-term dependence of pgd1"), - IOP("ppgd3", HSMHV_MOD_PPGD3, IF_REAL, "Cross-term dependence of pgd3"), - IOP("pndep", HSMHV_MOD_PNDEP, IF_REAL, "Cross-term dependence of ndep"), - IOP("pninv", HSMHV_MOD_PNINV, IF_REAL, "Cross-term dependence of ninv"), - IOP("pmuecb0", HSMHV_MOD_PMUECB0, IF_REAL, "Cross-term dependence of muecb0"), - IOP("pmuecb1", HSMHV_MOD_PMUECB1, IF_REAL, "Cross-term dependence of muecb1"), - IOP("pmueph1", HSMHV_MOD_PMUEPH1, IF_REAL, "Cross-term dependence of mueph1"), - IOP("pvtmp", HSMHV_MOD_PVTMP, IF_REAL, "Cross-term dependence of vtmp"), - IOP("pwvth0", HSMHV_MOD_PWVTH0, IF_REAL, "Cross-term dependence of wvth0"), - IOP("pmuesr1", HSMHV_MOD_PMUESR1, IF_REAL, "Cross-term dependence of muesr1"), - IOP("pmuetmp", HSMHV_MOD_PMUETMP, IF_REAL, "Cross-term dependence of muetmp"), - IOP("psub1", HSMHV_MOD_PSUB1, IF_REAL, "Cross-term dependence of sub1"), - IOP("psub2", HSMHV_MOD_PSUB2, IF_REAL, "Cross-term dependence of sub2"), - IOP("psvds", HSMHV_MOD_PSVDS, IF_REAL, "Cross-term dependence of svds"), - IOP("psvbs", HSMHV_MOD_PSVBS, IF_REAL, "Cross-term dependence of svbs"), - IOP("psvgs", HSMHV_MOD_PSVGS, IF_REAL, "Cross-term dependence of svgs"), - IOP("pfn1", HSMHV_MOD_PFN1, IF_REAL, "Cross-term dependence of fn1"), - IOP("pfn2", HSMHV_MOD_PFN2, IF_REAL, "Cross-term dependence of fn2"), - IOP("pfn3", HSMHV_MOD_PFN3, IF_REAL, "Cross-term dependence of fn3"), - IOP("pfvbs", HSMHV_MOD_PFVBS, IF_REAL, "Cross-term dependence of fvbs"), - IOP("pnsti", HSMHV_MOD_PNSTI, IF_REAL, "Cross-term dependence of nsti"), - IOP("pwsti", HSMHV_MOD_PWSTI, IF_REAL, "Cross-term dependence of wsti"), - IOP("pscsti1", HSMHV_MOD_PSCSTI1, IF_REAL, "Cross-term dependence of scsti1"), - IOP("pscsti2", HSMHV_MOD_PSCSTI2, IF_REAL, "Cross-term dependence of scsti2"), - IOP("pvthsti", HSMHV_MOD_PVTHSTI, IF_REAL, "Cross-term dependence of vthsti"), - IOP("pmuesti1", HSMHV_MOD_PMUESTI1, IF_REAL, "Cross-term dependence of muesti1"), - IOP("pmuesti2", HSMHV_MOD_PMUESTI2, IF_REAL, "Cross-term dependence of muesti2"), - IOP("pmuesti3", HSMHV_MOD_PMUESTI3, IF_REAL, "Cross-term dependence of muesti3"), - IOP("pnsubpsti1", HSMHV_MOD_PNSUBPSTI1, IF_REAL, "Cross-term dependence of nsubpsti1"), - IOP("pnsubpsti2", HSMHV_MOD_PNSUBPSTI2, IF_REAL, "Cross-term dependence of nsubpsti2"), - IOP("pnsubpsti3", HSMHV_MOD_PNSUBPSTI3, IF_REAL, "Cross-term dependence of nsubpsti3"), - IOP("pcgso", HSMHV_MOD_PCGSO, IF_REAL, "Cross-term dependence of cgso"), - IOP("pcgdo", HSMHV_MOD_PCGDO, IF_REAL, "Cross-term dependence of cgdo"), - IOP("pjs0", HSMHV_MOD_PJS0, IF_REAL, "Cross-term dependence of js0"), - IOP("pjs0sw", HSMHV_MOD_PJS0SW, IF_REAL, "Cross-term dependence of js0sw"), - IOP("pnj", HSMHV_MOD_PNJ, IF_REAL, "Cross-term dependence of nj"), - IOP("pcisbk", HSMHV_MOD_PCISBK, IF_REAL, "Cross-term dependence of cisbk"), - IOP("pclm1", HSMHV_MOD_PCLM1, IF_REAL, "Cross-term dependence of clm1"), - IOP("pclm2", HSMHV_MOD_PCLM2, IF_REAL, "Cross-term dependence of clm2"), - IOP("pclm3", HSMHV_MOD_PCLM3, IF_REAL, "Cross-term dependence of clm3"), - IOP("pwfc", HSMHV_MOD_PWFC, IF_REAL, "Cross-term dependence of wfc"), - IOP("pgidl1", HSMHV_MOD_PGIDL1, IF_REAL, "Cross-term dependence of gidl1"), - IOP("pgidl2", HSMHV_MOD_PGIDL2, IF_REAL, "Cross-term dependence of gidl2"), - IOP("pgleak1", HSMHV_MOD_PGLEAK1, IF_REAL, "Cross-term dependence of gleak1"), - IOP("pgleak2", HSMHV_MOD_PGLEAK2, IF_REAL, "Cross-term dependence of gleak2"), - IOP("pgleak3", HSMHV_MOD_PGLEAK3, IF_REAL, "Cross-term dependence of gleak3"), - IOP("pgleak6", HSMHV_MOD_PGLEAK6, IF_REAL, "Cross-term dependence of gleak6"), - IOP("pglksd1", HSMHV_MOD_PGLKSD1, IF_REAL, "Cross-term dependence of glksd1"), - IOP("pglksd2", HSMHV_MOD_PGLKSD2, IF_REAL, "Cross-term dependence of glksd2"), - IOP("pglkb1", HSMHV_MOD_PGLKB1, IF_REAL, "Cross-term dependence of glkb1"), - IOP("pglkb2", HSMHV_MOD_PGLKB2, IF_REAL, "Cross-term dependence of glkb2"), - IOP("pnftrp", HSMHV_MOD_PNFTRP, IF_REAL, "Cross-term dependence of nftrp"), - IOP("pnfalp", HSMHV_MOD_PNFALP, IF_REAL, "Cross-term dependence of nfalp"), - IOP("ppthrou", HSMHV_MOD_PPTHROU, IF_REAL, "Cross-term dependence of pthrou"), - IOP("pvdiffj", HSMHV_MOD_PVDIFFJ, IF_REAL, "Cross-term dependence of vdiffj"), - IOP("pibpc1", HSMHV_MOD_PIBPC1, IF_REAL, "Cross-term dependence of ibpc1"), - IOP("pibpc2", HSMHV_MOD_PIBPC2, IF_REAL, "Cross-term dependence of ibpc2"), - IOP("pcgbo", HSMHV_MOD_PCGBO, IF_REAL, "Cross-term dependence of cgbo"), - IOP("pcvdsover", HSMHV_MOD_PCVDSOVER, IF_REAL, "Cross-term dependence of cvdsover"), - IOP("pfalph", HSMHV_MOD_PFALPH, IF_REAL, "Cross-term dependence of falph"), - IOP("pnpext", HSMHV_MOD_PNPEXT, IF_REAL, "Cross-term dependence of npext"), - IOP("ppowrat", HSMHV_MOD_PPOWRAT, IF_REAL, "Cross-term dependence of powrat"), - IOP("prd", HSMHV_MOD_PRD, IF_REAL, "Cross-term dependence of rd"), - IOP("prd22", HSMHV_MOD_PRD22, IF_REAL, "Cross-term dependence of rd22"), - IOP("prd23", HSMHV_MOD_PRD23, IF_REAL, "Cross-term dependence of rd23"), - IOP("prd24", HSMHV_MOD_PRD24, IF_REAL, "Cross-term dependence of rd24"), - IOP("prdict1", HSMHV_MOD_PRDICT1, IF_REAL, "Cross-term dependence of rdict1"), - IOP("prdov13", HSMHV_MOD_PRDOV13, IF_REAL, "Cross-term dependence of rdov13"), - IOP("prdslp1", HSMHV_MOD_PRDSLP1, IF_REAL, "Cross-term dependence of rdslp1"), - IOP("prdvb", HSMHV_MOD_PRDVB, IF_REAL, "Cross-term dependence of rdvb"), - IOP("prdvd", HSMHV_MOD_PRDVD, IF_REAL, "Cross-term dependence of rdvd"), - IOP("prdvg11", HSMHV_MOD_PRDVG11, IF_REAL, "Cross-term dependence of rdvg11"), - IOP("prs", HSMHV_MOD_PRS, IF_REAL, "Cross-term dependence of rs"), - IOP("prth0", HSMHV_MOD_PRTH0, IF_REAL, "Cross-term dependence of rth0"), - IOP("pvover", HSMHV_MOD_PVOVER, IF_REAL, "Cross-term dependence of vover"), - - IOP("vgs_max", HSMHV_MOD_VGS_MAX, IF_REAL, "maximum voltage G-S branch"), - IOP("vgd_max", HSMHV_MOD_VGD_MAX, IF_REAL, "maximum voltage G-D branch"), - IOP("vgb_max", HSMHV_MOD_VGB_MAX, IF_REAL, "maximum voltage G-B branch"), - IOP("vds_max", HSMHV_MOD_VDS_MAX, IF_REAL, "maximum voltage D-S branch"), - IOP("vbs_max", HSMHV_MOD_VBS_MAX, IF_REAL, "maximum voltage B-S branch"), - IOP("vbd_max", HSMHV_MOD_VBD_MAX, IF_REAL, "maximum voltage B-D branch"), - IOP("vgsr_max", HSMHV_MOD_VGSR_MAX, IF_REAL, "maximum voltage G-S branch"), - IOP("vgdr_max", HSMHV_MOD_VGDR_MAX, IF_REAL, "maximum voltage G-D branch"), - IOP("vgbr_max", HSMHV_MOD_VGBR_MAX, IF_REAL, "maximum voltage G-B branch"), - IOP("vbsr_max", HSMHV_MOD_VBSR_MAX, IF_REAL, "maximum voltage B-S branch"), - IOP("vbdr_max", HSMHV_MOD_VBDR_MAX, IF_REAL, "maximum voltage B-D branch") - -}; - -char *HSMHVnames[] = { - "Drain", - "Gate", - "Source", - "Bulk", - "Substrate", - "Temp" -}; - -int HSMHVnSize = NUMELEMS(HSMHVnames); -int HSMHVpTSize = NUMELEMS(HSMHVpTable); -int HSMHVmPTSize = NUMELEMS(HSMHVmPTable); -int HSMHViSize = sizeof(HSMHVinstance); -int HSMHVmSize = sizeof(HSMHVmodel); - diff --git a/src/spicelib/devices/hisimhv1/hsmhvacld.c b/src/spicelib/devices/hisimhv1/hsmhvacld.c deleted file mode 100644 index 45e6f828c..000000000 --- a/src/spicelib/devices/hisimhv1/hsmhvacld.c +++ /dev/null @@ -1,298 +0,0 @@ -/*********************************************************************** - - HiSIM (Hiroshima University STARC IGFET Model) - Copyright (C) 2012 Hiroshima University & STARC - - MODEL NAME : HiSIM_HV - ( VERSION : 1 SUBVERSION : 2 REVISION : 4 ) - Model Parameter VERSION : 1.23 - FILE : hsmhvacld.c - - DATE : 2013.04.30 - - released by - Hiroshima University & - Semiconductor Technology Academic Research Center (STARC) -***********************************************************************/ - -#include "ngspice/ngspice.h" -#include "ngspice/cktdefs.h" -#include "ngspice/sperror.h" -#include "ngspice/suffix.h" -#include "hsmhvdef.h" - -int HSMHVacLoad( - GENmodel *inModel, - register CKTcircuit *ckt) -{ - register HSMHVmodel *model = (HSMHVmodel*)inModel; - register HSMHVinstance *here; - - double omega=0.0 ; - int flg_nqs =0 ; - int flg_subNode = 0 ; - -#define dNode 0 -#define dNodePrime 1 -#define gNode 2 -#define gNodePrime 3 -#define sNode 4 -#define sNodePrime 5 -#define bNodePrime 6 -#define bNode 7 -#define dbNode 8 -#define sbNode 9 -#define subNode 10 -#define tempNode 11 -#define qiNode 12 -#define qbNode 13 - - - omega = ckt->CKTomega; - for ( ; model != NULL; model = HSMHVnextModel(model)) { - for ( here = HSMHVinstances(model); here!= NULL; here = HSMHVnextInstance(here)) { - - flg_nqs = model->HSMHV_conqs ; - flg_subNode = here->HSMHVsubNode ; /* if flg_subNode > 0, external(/internal) substrate node exists */ - - /* stamp matrix */ - - /*drain*/ - *(here->HSMHVDdPtr) += here->HSMHV_ydc_d[dNode] ; - *(here->HSMHVDdPtr +1) += omega*here->HSMHV_ydyn_d[dNode] ; - *(here->HSMHVDdpPtr) += here->HSMHV_ydc_d[dNodePrime] ; - *(here->HSMHVDdpPtr +1) += omega*here->HSMHV_ydyn_d[dNodePrime]; - *(here->HSMHVDgpPtr) += here->HSMHV_ydc_d[gNodePrime]; - *(here->HSMHVDgpPtr +1) += omega*here->HSMHV_ydyn_d[gNodePrime]; - *(here->HSMHVDsPtr) += here->HSMHV_ydc_d[sNode]; - *(here->HSMHVDsPtr +1) += omega*here->HSMHV_ydyn_d[sNode]; - *(here->HSMHVDbpPtr) += here->HSMHV_ydc_d[bNodePrime]; - *(here->HSMHVDbpPtr +1) += omega*here->HSMHV_ydyn_d[bNodePrime]; - *(here->HSMHVDdbPtr) += here->HSMHV_ydc_d[dbNode]; - *(here->HSMHVDdbPtr +1) += omega*here->HSMHV_ydyn_d[dbNode]; - if (flg_subNode > 0) { - *(here->HSMHVDsubPtr) += here->HSMHV_ydc_d[subNode]; - } - if( here->HSMHVtempNode > 0) { - *(here->HSMHVDtempPtr) += model->HSMHV_type*here->HSMHV_ydc_d[tempNode]; - *(here->HSMHVDtempPtr +1) += model->HSMHV_type*omega*here->HSMHV_ydyn_d[tempNode]; - } - - /*drain prime*/ - *(here->HSMHVDPdPtr) += here->HSMHV_ydc_dP[dNode] ; - *(here->HSMHVDPdPtr +1) += omega*here->HSMHV_ydyn_dP[dNode]; - *(here->HSMHVDPdpPtr) += here->HSMHV_ydc_dP[dNodePrime]; - *(here->HSMHVDPdpPtr +1) += omega*here->HSMHV_ydyn_dP[dNodePrime]; - *(here->HSMHVDPgpPtr) += here->HSMHV_ydc_dP[gNodePrime]; - *(here->HSMHVDPgpPtr +1) += omega*here->HSMHV_ydyn_dP[gNodePrime]; - *(here->HSMHVDPsPtr) += here->HSMHV_ydc_dP[sNode] ; - *(here->HSMHVDPsPtr +1) += omega*here->HSMHV_ydyn_dP[sNode]; - *(here->HSMHVDPspPtr) += here->HSMHV_ydc_dP[sNodePrime] ; - *(here->HSMHVDPspPtr +1) += omega*here->HSMHV_ydyn_dP[sNodePrime]; - *(here->HSMHVDPbpPtr) += here->HSMHV_ydc_dP[bNodePrime] ; - *(here->HSMHVDPbpPtr +1) += omega*here->HSMHV_ydyn_dP[bNodePrime]; - if (flg_subNode > 0) { - *(here->HSMHVDPsubPtr) += here->HSMHV_ydc_dP[subNode]; - } - if( here->HSMHVtempNode > 0) { - *(here->HSMHVDPtempPtr) += model->HSMHV_type*here->HSMHV_ydc_dP[tempNode]; - *(here->HSMHVDPtempPtr +1) += model->HSMHV_type*omega*here->HSMHV_ydyn_dP[tempNode]; - } - if (flg_nqs) { - *(here->HSMHVDPqiPtr) += model->HSMHV_type*here->HSMHV_ydc_dP[qiNode]; - *(here->HSMHVDPqiPtr+1) += model->HSMHV_type*omega*here->HSMHV_ydyn_dP[qiNode]; - } - - - /*gate*/ - *(here->HSMHVGgPtr) += here->HSMHV_ydc_g[gNode] ; - *(here->HSMHVGgPtr +1) += omega*here->HSMHV_ydyn_g[gNode]; - *(here->HSMHVGgpPtr) += here->HSMHV_ydc_g[gNodePrime] ; - *(here->HSMHVGgpPtr +1) += omega*here->HSMHV_ydyn_g[gNodePrime]; - - /*gate prime*/ - *(here->HSMHVGPdPtr) += here->HSMHV_ydc_gP[dNode] ; - *(here->HSMHVGPdPtr +1) += omega*here->HSMHV_ydyn_gP[dNode]; - *(here->HSMHVGPdpPtr) += here->HSMHV_ydc_gP[dNodePrime] ; - *(here->HSMHVGPdpPtr +1) += omega*here->HSMHV_ydyn_gP[dNodePrime]; - *(here->HSMHVGPgPtr) += here->HSMHV_ydc_gP[gNode]; - *(here->HSMHVGPgPtr +1) += omega*here->HSMHV_ydyn_gP[gNode]; - *(here->HSMHVGPgpPtr) += here->HSMHV_ydc_gP[gNodePrime] ; - *(here->HSMHVGPgpPtr +1) += omega*here->HSMHV_ydyn_gP[gNodePrime]; - *(here->HSMHVGPsPtr) += here->HSMHV_ydc_gP[sNode]; - *(here->HSMHVGPsPtr +1) += omega*here->HSMHV_ydyn_gP[sNode]; - *(here->HSMHVGPspPtr) += here->HSMHV_ydc_gP[sNodePrime] ; - *(here->HSMHVGPspPtr +1) += omega*here->HSMHV_ydyn_gP[sNodePrime]; - *(here->HSMHVGPbpPtr) += here->HSMHV_ydc_gP[bNodePrime] ; - *(here->HSMHVGPbpPtr +1) += omega*here->HSMHV_ydyn_gP[bNodePrime]; - if( here->HSMHVtempNode > 0) { - *(here->HSMHVGPtempPtr) += model->HSMHV_type*here->HSMHV_ydc_gP[tempNode] ; - *(here->HSMHVGPtempPtr +1) += model->HSMHV_type*omega*here->HSMHV_ydyn_gP[tempNode]; - } - if (flg_nqs) { - *(here->HSMHVGPqiPtr) += model->HSMHV_type*here->HSMHV_ydc_gP[qiNode]; - *(here->HSMHVGPqiPtr+1) += model->HSMHV_type*omega*here->HSMHV_ydyn_gP[qiNode]; - *(here->HSMHVGPqbPtr) += model->HSMHV_type*here->HSMHV_ydc_gP[qbNode]; - *(here->HSMHVGPqbPtr+1) += model->HSMHV_type*omega*here->HSMHV_ydyn_gP[qbNode]; - } - - /*source*/ - *(here->HSMHVSdPtr) += here->HSMHV_ydc_s[dNode]; - *(here->HSMHVSdPtr +1) += omega*here->HSMHV_ydyn_s[dNode]; - *(here->HSMHVSgpPtr) += here->HSMHV_ydc_s[gNodePrime]; - *(here->HSMHVSgpPtr +1) += omega*here->HSMHV_ydyn_s[gNodePrime]; - *(here->HSMHVSsPtr) += here->HSMHV_ydc_s[sNode] ; - *(here->HSMHVSsPtr +1) += omega*here->HSMHV_ydyn_s[sNode]; - *(here->HSMHVSspPtr) += here->HSMHV_ydc_s[sNodePrime] ; - *(here->HSMHVSspPtr +1) += omega*here->HSMHV_ydyn_s[sNodePrime]; - *(here->HSMHVSbpPtr) += here->HSMHV_ydc_s[bNodePrime]; - *(here->HSMHVSbpPtr +1) += omega*here->HSMHV_ydyn_s[bNodePrime]; - *(here->HSMHVSsbPtr) += here->HSMHV_ydc_s[sbNode] ; - *(here->HSMHVSsbPtr +1) += omega*here->HSMHV_ydyn_s[sbNode]; - if (flg_subNode > 0) { - *(here->HSMHVSsubPtr) += here->HSMHV_ydc_s[subNode]; - } - if( here->HSMHVtempNode > 0) { - *(here->HSMHVStempPtr) += model->HSMHV_type*here->HSMHV_ydc_s[tempNode]; - *(here->HSMHVStempPtr +1) += model->HSMHV_type*omega*here->HSMHV_ydyn_s[tempNode]; - } - - /*source prime*/ - *(here->HSMHVSPdPtr) += here->HSMHV_ydc_sP[dNode] ; - *(here->HSMHVSPdPtr +1) += omega*here->HSMHV_ydyn_sP[dNode]; - *(here->HSMHVSPdpPtr) += here->HSMHV_ydc_sP[dNodePrime] ; - *(here->HSMHVSPdpPtr +1) += omega*here->HSMHV_ydyn_sP[dNodePrime]; - *(here->HSMHVSPgpPtr) += here->HSMHV_ydc_sP[gNodePrime] ; - *(here->HSMHVSPgpPtr +1) += omega*here->HSMHV_ydyn_sP[gNodePrime]; - *(here->HSMHVSPsPtr) += here->HSMHV_ydc_sP[sNode] ; - *(here->HSMHVSPsPtr +1) += omega*here->HSMHV_ydyn_sP[sNode]; - *(here->HSMHVSPspPtr) += here->HSMHV_ydc_sP[sNodePrime] ; - *(here->HSMHVSPspPtr +1) += omega*here->HSMHV_ydyn_sP[sNodePrime]; - *(here->HSMHVSPbpPtr) += here->HSMHV_ydc_sP[bNodePrime]; - *(here->HSMHVSPbpPtr +1) += omega*here->HSMHV_ydyn_sP[bNodePrime]; - if (flg_subNode > 0) { - *(here->HSMHVSPsubPtr) += here->HSMHV_ydc_sP[subNode]; - } - if( here->HSMHVtempNode > 0) { - *(here->HSMHVSPtempPtr) += model->HSMHV_type*here->HSMHV_ydc_sP[tempNode] ; - *(here->HSMHVSPtempPtr +1) += model->HSMHV_type*omega*here->HSMHV_ydyn_sP[tempNode]; - } - if (flg_nqs) { - *(here->HSMHVSPqiPtr) += model->HSMHV_type*here->HSMHV_ydc_sP[qiNode]; - *(here->HSMHVSPqiPtr+1) += model->HSMHV_type*omega*here->HSMHV_ydyn_sP[qiNode]; - } - - /*bulk prime*/ - *(here->HSMHVBPdPtr) += here->HSMHV_ydc_bP[dNode]; - *(here->HSMHVBPdPtr +1) += omega*here->HSMHV_ydyn_bP[dNode]; - *(here->HSMHVBPsPtr) += here->HSMHV_ydc_bP[sNode]; - *(here->HSMHVBPsPtr +1) += omega*here->HSMHV_ydyn_bP[sNode]; - *(here->HSMHVBPdpPtr) += here->HSMHV_ydc_bP[dNodePrime]; - *(here->HSMHVBPdpPtr +1) += omega*here->HSMHV_ydyn_bP[dNodePrime]; - *(here->HSMHVBPgpPtr) += here->HSMHV_ydc_bP[gNodePrime] ; - *(here->HSMHVBPgpPtr +1) += omega*here->HSMHV_ydyn_bP[gNodePrime]; - *(here->HSMHVBPspPtr) += here->HSMHV_ydc_bP[sNodePrime]; - *(here->HSMHVBPspPtr +1) += omega*here->HSMHV_ydyn_bP[sNodePrime]; - *(here->HSMHVBPbpPtr) += here->HSMHV_ydc_bP[bNodePrime]; - *(here->HSMHVBPbpPtr +1) += omega*here->HSMHV_ydyn_bP[bNodePrime]; - *(here->HSMHVBPbPtr) += here->HSMHV_ydc_bP[bNode]; - *(here->HSMHVBPbPtr +1) += omega*here->HSMHV_ydyn_bP[bNode]; - *(here->HSMHVBPdbPtr) += here->HSMHV_ydc_bP[dbNode] ; - *(here->HSMHVBPdbPtr +1) += omega*here->HSMHV_ydyn_bP[dbNode]; - *(here->HSMHVBPsbPtr) += here->HSMHV_ydc_bP[sbNode] ; - *(here->HSMHVBPsbPtr +1) += omega*here->HSMHV_ydyn_bP[sbNode]; - if( here->HSMHVtempNode > 0) { - *(here->HSMHVBPtempPtr) += model->HSMHV_type*here->HSMHV_ydc_bP[tempNode] ; - *(here->HSMHVBPtempPtr +1) += model->HSMHV_type*omega*here->HSMHV_ydyn_bP[tempNode]; - } - if (flg_nqs) { - *(here->HSMHVBPqbPtr) += model->HSMHV_type*here->HSMHV_ydc_bP[qbNode]; - *(here->HSMHVBPqbPtr+1) += model->HSMHV_type*omega*here->HSMHV_ydyn_bP[qbNode]; - } - - /*bulk*/ - *(here->HSMHVBbpPtr) += here->HSMHV_ydc_b[bNodePrime] ; - *(here->HSMHVBbpPtr +1) += omega*here->HSMHV_ydyn_b[bNodePrime]; - *(here->HSMHVBbPtr) += here->HSMHV_ydc_b[bNode] ; - *(here->HSMHVBbPtr +1) += omega*here->HSMHV_ydyn_b[bNode]; - - /*drain bulk*/ - *(here->HSMHVDBdPtr) += here->HSMHV_ydc_db[dNode] ; - *(here->HSMHVDBdPtr +1) += omega*here->HSMHV_ydyn_db[dNode]; - *(here->HSMHVDBbpPtr) += here->HSMHV_ydc_db[bNodePrime] ; - *(here->HSMHVDBbpPtr +1) += omega*here->HSMHV_ydyn_db[bNodePrime]; - *(here->HSMHVDBdbPtr) += here->HSMHV_ydc_db[dbNode] ; - *(here->HSMHVDBdbPtr +1) += omega*here->HSMHV_ydyn_db[dbNode]; - if( here->HSMHVtempNode > 0) { - *(here->HSMHVDBtempPtr) += model->HSMHV_type*here->HSMHV_ydc_db[tempNode] ; - *(here->HSMHVDBtempPtr +1) += model->HSMHV_type*omega*here->HSMHV_ydyn_db[tempNode]; - } - - /*source bulk*/ - *(here->HSMHVSBsPtr) += here->HSMHV_ydc_sb[sNode] ; - *(here->HSMHVSBsPtr +1) += omega*here->HSMHV_ydyn_sb[sNode]; - *(here->HSMHVSBbpPtr) += here->HSMHV_ydc_sb[bNodePrime]; - *(here->HSMHVSBbpPtr +1) += omega*here->HSMHV_ydyn_sb[bNodePrime]; - *(here->HSMHVSBsbPtr) += here->HSMHV_ydc_sb[sbNode] ; - *(here->HSMHVSBsbPtr +1) += omega*here->HSMHV_ydyn_sb[sbNode]; - if( here->HSMHVtempNode > 0) { - *(here->HSMHVSBtempPtr) += model->HSMHV_type*here->HSMHV_ydc_sb[tempNode]; - *(here->HSMHVSBtempPtr +1) += model->HSMHV_type*omega*here->HSMHV_ydyn_sb[tempNode]; - } - - /*temp*/ - if( here->HSMHVtempNode > 0) { - *(here->HSMHVTempdPtr) += model->HSMHV_type*here->HSMHV_ydc_t[dNode] ; - *(here->HSMHVTempdPtr +1) += model->HSMHV_type*omega*here->HSMHV_ydyn_t[dNode]; - *(here->HSMHVTempdpPtr) += model->HSMHV_type*here->HSMHV_ydc_t[dNodePrime] ; - *(here->HSMHVTempdpPtr +1) += model->HSMHV_type*omega*here->HSMHV_ydyn_t[dNodePrime]; - *(here->HSMHVTempgpPtr) += model->HSMHV_type*here->HSMHV_ydc_t[gNodePrime]; - *(here->HSMHVTempgpPtr +1) += model->HSMHV_type*omega*here->HSMHV_ydyn_t[gNodePrime]; - *(here->HSMHVTempsPtr) += model->HSMHV_type*here->HSMHV_ydc_t[sNode] ; - *(here->HSMHVTempsPtr +1) += model->HSMHV_type*omega*here->HSMHV_ydyn_t[sNode]; - *(here->HSMHVTempspPtr) += model->HSMHV_type*here->HSMHV_ydc_t[sNodePrime] ; - *(here->HSMHVTempspPtr +1) += model->HSMHV_type*omega*here->HSMHV_ydyn_t[sNodePrime]; - *(here->HSMHVTempbpPtr) += model->HSMHV_type*here->HSMHV_ydc_t[bNodePrime] ; - *(here->HSMHVTempbpPtr +1) += model->HSMHV_type*omega*here->HSMHV_ydyn_t[bNodePrime]; - *(here->HSMHVTemptempPtr) += here->HSMHV_ydc_t[tempNode] ; - *(here->HSMHVTemptempPtr +1) += omega*here->HSMHV_ydyn_t[tempNode]; - } - /* additional entries for flat nqs handling */ - if ( flg_nqs ) { - /*qi*/ - *(here->HSMHVQIdpPtr) += model->HSMHV_type*here->HSMHV_ydc_qi[dNodePrime]; - *(here->HSMHVQIdpPtr+1) += model->HSMHV_type*omega*here->HSMHV_ydyn_qi[dNodePrime]; - *(here->HSMHVQIgpPtr) += model->HSMHV_type*here->HSMHV_ydc_qi[gNodePrime]; - *(here->HSMHVQIgpPtr+1) += model->HSMHV_type*omega*here->HSMHV_ydyn_qi[gNodePrime]; - *(here->HSMHVQIspPtr) += model->HSMHV_type*here->HSMHV_ydc_qi[sNodePrime]; - *(here->HSMHVQIspPtr+1) += model->HSMHV_type*omega*here->HSMHV_ydyn_qi[sNodePrime]; - *(here->HSMHVQIbpPtr) += model->HSMHV_type*here->HSMHV_ydc_qi[bNodePrime]; - *(here->HSMHVQIbpPtr+1) += model->HSMHV_type*omega*here->HSMHV_ydyn_qi[bNodePrime]; - *(here->HSMHVQIqiPtr) += here->HSMHV_ydc_qi[qiNode]; - *(here->HSMHVQIqiPtr+1) += omega*here->HSMHV_ydyn_qi[qiNode]; - if ( here->HSMHVtempNode > 0 ) { - *(here->HSMHVQItempPtr) += here->HSMHV_ydc_qi[tempNode]; - *(here->HSMHVQItempPtr+1) += omega*here->HSMHV_ydyn_qi[tempNode]; - } - - /*qb*/ - *(here->HSMHVQBdpPtr) += model->HSMHV_type*here->HSMHV_ydc_qb[dNodePrime]; - *(here->HSMHVQBdpPtr+1) += model->HSMHV_type*omega*here->HSMHV_ydyn_qb[dNodePrime]; - *(here->HSMHVQBgpPtr) += model->HSMHV_type*here->HSMHV_ydc_qb[gNodePrime]; - *(here->HSMHVQBgpPtr+1) += model->HSMHV_type*omega*here->HSMHV_ydyn_qb[gNodePrime]; - *(here->HSMHVQBspPtr) += model->HSMHV_type*here->HSMHV_ydc_qb[sNodePrime]; - *(here->HSMHVQBspPtr+1) += model->HSMHV_type*omega*here->HSMHV_ydyn_qb[sNodePrime]; - *(here->HSMHVQBbpPtr) += model->HSMHV_type*here->HSMHV_ydc_qb[bNodePrime]; - *(here->HSMHVQBbpPtr+1) += model->HSMHV_type*omega*here->HSMHV_ydyn_qb[bNodePrime]; - *(here->HSMHVQBqbPtr) += here->HSMHV_ydc_qb[qbNode]; - *(here->HSMHVQBqbPtr+1) += omega*here->HSMHV_ydyn_qb[qbNode]; - if ( here->HSMHVtempNode > 0 ) { - *(here->HSMHVQBtempPtr) += here->HSMHV_ydc_qb[tempNode]; - *(here->HSMHVQBtempPtr+1) += omega*here->HSMHV_ydyn_qb[tempNode]; - } - } - } - } - - return(OK); -} diff --git a/src/spicelib/devices/hisimhv1/hsmhvask.c b/src/spicelib/devices/hisimhv1/hsmhvask.c deleted file mode 100644 index 9363a2ca7..000000000 --- a/src/spicelib/devices/hisimhv1/hsmhvask.c +++ /dev/null @@ -1,421 +0,0 @@ -/*********************************************************************** - - HiSIM (Hiroshima University STARC IGFET Model) - Copyright (C) 2012 Hiroshima University & STARC - - MODEL NAME : HiSIM_HV - ( VERSION : 1 SUBVERSION : 2 REVISION : 4 ) - Model Parameter VERSION : 1.23 - FILE : hsmhvask.c - - DATE : 2013.04.30 - - released by - Hiroshima University & - Semiconductor Technology Academic Research Center (STARC) -***********************************************************************/ - -#include "ngspice/ngspice.h" -#include "ngspice/ifsim.h" -#include "ngspice/cktdefs.h" -#include "ngspice/devdefs.h" -#include "hsmhvdef.h" -#include "ngspice/sperror.h" -#include "ngspice/suffix.h" - -int HSMHVask( - CKTcircuit *ckt, - GENinstance *inst, - int which, - IFvalue *value, - IFvalue *select) -{ - HSMHVinstance *here = (HSMHVinstance*)inst; - - int flg_nqs ; - double cggb_nqs, cgdb_nqs, cgsb_nqs, cdgb_nqs, cddb_nqs, cdsb_nqs, cbgb_nqs, cbdb_nqs, cbsb_nqs ; - double Qi_nqs, dQi_nqs_dVds, dQi_nqs_dVgs, dQi_nqs_dVbs, - dQb_nqs_dVds, dQb_nqs_dVgs, dQb_nqs_dVbs ; - double Qdrat, dQdrat_dVds, dQdrat_dVgs, dQdrat_dVbs, - dQi_dVds, dQi_dVgs, dQi_dVbs, - dQbulk_dVds, dQbulk_dVgs, dQbulk_dVbs ; - double dQd_nqs_dVds, dQd_nqs_dVgs, dQd_nqs_dVbs, dQd_nqs_dQi_nqs ; - double dQg_nqs_dQi_nqs, dQg_nqs_dQb_nqs ; - - NG_IGNORE(select); - - here->HSMHV_csdo = - (here->HSMHV_cddo + here->HSMHV_cgdo + here->HSMHV_cbdo) ; - here->HSMHV_csgo = - (here->HSMHV_cdgo + here->HSMHV_cggo + here->HSMHV_cbgo) ; - here->HSMHV_csbo = - (here->HSMHV_cdbo + here->HSMHV_cgbo + here->HSMHV_cbbo) ; - - here->HSMHV_cdso = - (here->HSMHV_cddo + here->HSMHV_cdgo + here->HSMHV_cdbo) ; - here->HSMHV_cgso = - (here->HSMHV_cgdo + here->HSMHV_cggo + here->HSMHV_cgbo) ; - here->HSMHV_csso = - (here->HSMHV_csdo + here->HSMHV_csgo + here->HSMHV_csbo) ; - - /* NQS? */ - if (here->HSMHVQIqiPtr == NULL) { - flg_nqs = 0 ; - } else { - flg_nqs = 1 ; - } - /* printf("HSMHVask: flg_nqs = %d\n", flg_nqs) ; */ - - if (flg_nqs) { /* collect data for NQS case (DC operating point only!) */ - Qi_nqs = *(ckt->CKTstate0 + here->HSMHVqi_nqs) ; - if ( here->HSMHV_mode > 0 ) { /* forward mode */ - Qdrat = here->HSMHV_Xd ; - dQdrat_dVds = here->HSMHV_Xd_dVdsi ; - dQdrat_dVgs = here->HSMHV_Xd_dVgsi ; - dQdrat_dVbs = here->HSMHV_Xd_dVbsi ; - dQi_dVds = here->HSMHV_Qi_dVdsi ; - dQi_dVgs = here->HSMHV_Qi_dVgsi ; - dQi_dVbs = here->HSMHV_Qi_dVbsi ; - dQbulk_dVds = here->HSMHV_Qbulk_dVdsi ; - dQbulk_dVgs = here->HSMHV_Qbulk_dVgsi ; - dQbulk_dVbs = here->HSMHV_Qbulk_dVbsi ; - } else { /* reverse mode */ - Qdrat = 1.0 - here->HSMHV_Xd ; - dQdrat_dVds = +(here->HSMHV_Xd_dVdsi + here->HSMHV_Xd_dVgsi + here->HSMHV_Xd_dVbsi) ; - dQdrat_dVgs = - here->HSMHV_Xd_dVgsi ; - dQdrat_dVbs = - here->HSMHV_Xd_dVbsi ; - dQi_dVds = -(here->HSMHV_Qi_dVdsi + here->HSMHV_Qi_dVgsi + here->HSMHV_Qi_dVbsi) ; - dQi_dVgs = here->HSMHV_Qi_dVgsi ; - dQi_dVbs = here->HSMHV_Qi_dVbsi ; - dQbulk_dVds = -(here->HSMHV_Qbulk_dVdsi + here->HSMHV_Qbulk_dVgsi + here->HSMHV_Qbulk_dVbsi) ; - dQbulk_dVgs = here->HSMHV_Qbulk_dVgsi ; - dQbulk_dVbs = here->HSMHV_Qbulk_dVbsi ; - } - /* from Qg_nqs = - Qi_nqs - Qb_nqs: */ - dQg_nqs_dQi_nqs = - 1.0 ; - dQg_nqs_dQb_nqs = - 1.0 ; - /* from Qd_nqs = Qi_nqs * Qdrat: */ - dQd_nqs_dVds = Qi_nqs * dQdrat_dVds ; - dQd_nqs_dVgs = Qi_nqs * dQdrat_dVgs ; - dQd_nqs_dVbs = Qi_nqs * dQdrat_dVbs ; - dQd_nqs_dQi_nqs = Qdrat ; - - /* by implicit differentiation of the NQS equations (DC operating point only!): */ - dQi_nqs_dVds = dQi_dVds ; - dQi_nqs_dVgs = dQi_dVgs ; - dQi_nqs_dVbs = dQi_dVbs ; - dQb_nqs_dVds = dQbulk_dVds ; - dQb_nqs_dVgs = dQbulk_dVgs ; - dQb_nqs_dVbs = dQbulk_dVbs ; - - cggb_nqs = dQg_nqs_dQi_nqs * dQi_nqs_dVgs + dQg_nqs_dQb_nqs * dQb_nqs_dVgs ; - cgdb_nqs = dQg_nqs_dQi_nqs * dQi_nqs_dVds + dQg_nqs_dQb_nqs * dQb_nqs_dVds ; - cgsb_nqs = - dQg_nqs_dQi_nqs * (dQi_nqs_dVds + dQi_nqs_dVgs + dQi_nqs_dVbs) - - dQg_nqs_dQb_nqs * (dQb_nqs_dVds + dQb_nqs_dVgs + dQb_nqs_dVbs) ; - cdgb_nqs = dQd_nqs_dVgs + dQd_nqs_dQi_nqs * dQi_nqs_dVgs ; - cddb_nqs = dQd_nqs_dVds + dQd_nqs_dQi_nqs * dQi_nqs_dVds ; - cdsb_nqs = -(dQd_nqs_dVds + dQd_nqs_dVgs + dQd_nqs_dVbs) - dQd_nqs_dQi_nqs * (dQi_nqs_dVds + dQi_nqs_dVgs + dQi_nqs_dVbs) ; - cbgb_nqs = dQb_nqs_dVgs ; - cbdb_nqs = dQb_nqs_dVds ; - cbsb_nqs = -(dQb_nqs_dVds + dQb_nqs_dVgs + dQb_nqs_dVbs) ; - } else { /* QS case */ - cggb_nqs = cgdb_nqs = cgsb_nqs = cdgb_nqs = cddb_nqs = cdsb_nqs = cbgb_nqs = cbdb_nqs = cbsb_nqs = 0.0 ; - } - - - switch (which) { - case HSMHV_COSELFHEAT: - value->iValue = here->HSMHV_coselfheat; - return(OK); - case HSMHV_COSUBNODE: - value->iValue = here->HSMHV_cosubnode; - return(OK); - case HSMHV_L: - value->rValue = here->HSMHV_l; - return(OK); - case HSMHV_W: - value->rValue = here->HSMHV_w; - return(OK); - case HSMHV_AS: - value->rValue = here->HSMHV_as; - return(OK); - case HSMHV_AD: - value->rValue = here->HSMHV_ad; - return(OK); - case HSMHV_PS: - value->rValue = here->HSMHV_ps; - return(OK); - case HSMHV_PD: - value->rValue = here->HSMHV_pd; - return(OK); - case HSMHV_NRS: - value->rValue = here->HSMHV_nrs; - return(OK); - case HSMHV_NRD: - value->rValue = here->HSMHV_nrd; - return(OK); - case HSMHV_DTEMP: - value->rValue = here->HSMHV_dtemp; - return(OK); - case HSMHV_OFF: - value->iValue = here->HSMHV_off; - return(OK); - case HSMHV_IC_VBS: - value->rValue = here->HSMHV_icVBS; - return(OK); - case HSMHV_IC_VDS: - value->rValue = here->HSMHV_icVDS; - return(OK); - case HSMHV_IC_VGS: - value->rValue = here->HSMHV_icVGS; - return(OK); - case HSMHV_DNODE: - value->iValue = here->HSMHVdNode; - return(OK); - case HSMHV_GNODE: - value->iValue = here->HSMHVgNode; - return(OK); - case HSMHV_SNODE: - value->iValue = here->HSMHVsNode; - return(OK); - case HSMHV_BNODE: - value->iValue = here->HSMHVbNode; - return(OK); - case HSMHV_DNODEPRIME: - value->iValue = here->HSMHVdNodePrime; - return(OK); - case HSMHV_SNODEPRIME: - value->iValue = here->HSMHVsNodePrime; - return(OK); - case HSMHV_SOURCECONDUCT: - value->rValue = here->HSMHVsourceConductance; - return(OK); - case HSMHV_DRAINCONDUCT: - value->rValue = here->HSMHVdrainConductance; - return(OK); - case HSMHV_VBD: - value->rValue = *(ckt->CKTstate0 + here->HSMHVvbd); - return(OK); - case HSMHV_VBS: - value->rValue = *(ckt->CKTstate0 + here->HSMHVvbs); - return(OK); - case HSMHV_VGS: - value->rValue = *(ckt->CKTstate0 + here->HSMHVvgs); - return(OK); - case HSMHV_VDS: - value->rValue = *(ckt->CKTstate0 + here->HSMHVvds); - return(OK); - case HSMHV_CD: - value->rValue = here->HSMHV_ids; - return(OK); - case HSMHV_ISUB: - value->rValue = here->HSMHV_isub; - return(OK); - case HSMHV_IGIDL: - value->rValue = here->HSMHV_igidl; - return(OK); - case HSMHV_IGISL: - value->rValue = here->HSMHV_igisl; - return(OK); - case HSMHV_IGD: - value->rValue = here->HSMHV_igd; - return(OK); - case HSMHV_IGS: - value->rValue = here->HSMHV_igs; - return(OK); - case HSMHV_IGB: - value->rValue = here->HSMHV_igb; - return(OK); - case HSMHV_CBS: - value->rValue = here->HSMHV_ibs; - return(OK); - case HSMHV_CBD: - value->rValue = here->HSMHV_ibd; - return(OK); - case HSMHV_GM: - value->rValue = here->HSMHV_dIds_dVgsi; - return(OK); - case HSMHV_GMT: - value->rValue = here->HSMHV_dIds_dTi; - return(OK); - case HSMHV_GDS: - value->rValue = here->HSMHV_dIds_dVdsi; - return(OK); - case HSMHV_GMBS: - value->rValue = here->HSMHV_dIds_dVbsi; - return(OK); - case HSMHV_GBD: - value->rValue = here->HSMHV_gbd; - return(OK); - case HSMHV_GBS: - value->rValue = here->HSMHV_gbs; - return(OK); - case HSMHV_QB: - value->rValue = *(ckt->CKTstate0 + here->HSMHVqb); - return(OK); - case HSMHV_CQB: - value->rValue = *(ckt->CKTstate0 + here->HSMHVcqb); - return(OK); - case HSMHV_QG: - value->rValue = *(ckt->CKTstate0 + here->HSMHVqg); - return(OK); - case HSMHV_CQG: - value->rValue = *(ckt->CKTstate0 + here->HSMHVcqg); - return(OK); - case HSMHV_QD: - value->rValue = *(ckt->CKTstate0 + here->HSMHVqd); - return(OK); - case HSMHV_CQD: - value->rValue = *(ckt->CKTstate0 + here->HSMHVcqd); - return(OK); - case HSMHV_CGG: - value->rValue = here->HSMHV_dQg_dVgsi - here->HSMHV_cggo; - if (flg_nqs) value->rValue += cggb_nqs; - return(OK); - case HSMHV_CGD: - value->rValue = (here->HSMHV_mode > 0) ? here->HSMHV_dQg_dVdsi - here->HSMHV_cgdo - : - (here->HSMHV_dQg_dVdsi + here->HSMHV_dQg_dVgsi + here->HSMHV_dQg_dVbsi) - - here->HSMHV_cgso; - if (flg_nqs) value->rValue += cgdb_nqs; - return(OK); - case HSMHV_CGS: - value->rValue = (here->HSMHV_mode > 0) ? - (here->HSMHV_dQg_dVdsi + here->HSMHV_dQg_dVgsi + here->HSMHV_dQg_dVbsi) - - here->HSMHV_cgso - : here->HSMHV_dQg_dVdsi - here->HSMHV_cgdo; - if (flg_nqs) value->rValue += cgsb_nqs; - return(OK); - case HSMHV_CDG: - value->rValue = (here->HSMHV_mode > 0) ? here->HSMHV_dQdi_dVgsi - here->HSMHV_cdgo - : here->HSMHV_dQsi_dVgsi - here->HSMHV_csgo; - if (flg_nqs) value->rValue += cdgb_nqs; - return(OK); - case HSMHV_CDD: - value->rValue = (here->HSMHV_mode > 0) ? here->HSMHV_dQdi_dVdsi - here->HSMHV_cddo - : - (here->HSMHV_dQsi_dVdsi + here->HSMHV_dQsi_dVgsi + here->HSMHV_dQsi_dVbsi) - - here->HSMHV_csso; - if (flg_nqs) value->rValue += cddb_nqs; - return(OK); - case HSMHV_CDS: - value->rValue = (here->HSMHV_mode > 0) ? - (here->HSMHV_dQdi_dVdsi + here->HSMHV_dQdi_dVgsi + here->HSMHV_dQdi_dVbsi) - - here->HSMHV_cdso - : here->HSMHV_dQsi_dVdsi - here->HSMHV_csdo; - if (flg_nqs) value->rValue += cdsb_nqs; - return(OK); - case HSMHV_CBG: - value->rValue = here->HSMHV_dQb_dVgsi - here->HSMHV_cbgo; - if (flg_nqs) value->rValue += cbgb_nqs; - return(OK); - case HSMHV_CBDB: - value->rValue = (here->HSMHV_mode > 0) ? here->HSMHV_dQb_dVdsi - here->HSMHV_cbdo - : - (here->HSMHV_dQb_dVdsi + here->HSMHV_dQb_dVgsi + here->HSMHV_dQb_dVbsi) - + (here->HSMHV_cbdo+here->HSMHV_cbgo+here->HSMHV_cbbo); - if (flg_nqs) value->rValue += cbdb_nqs; - return(OK); - case HSMHV_CBSB: - value->rValue = (here->HSMHV_mode > 0) ? - (here->HSMHV_dQb_dVdsi + here->HSMHV_dQb_dVgsi + here->HSMHV_dQb_dVbsi) - + (here->HSMHV_cbdo + here->HSMHV_cbgo + here->HSMHV_cbbo) - : here->HSMHV_dQb_dVdsi - here->HSMHV_cbdo; - if (flg_nqs) value->rValue += cbsb_nqs; - return(OK); - case HSMHV_CGDO: - value->rValue = (here->HSMHV_mode > 0) ? here->HSMHV_cgdo : here->HSMHV_cgso; - - return(OK); - case HSMHV_CGSO: - value->rValue = (here->HSMHV_mode > 0) ? here->HSMHV_cgso : here->HSMHV_cgdo; - return(OK); - case HSMHV_CGBO: - value->rValue = here->HSMHV_cgbo; - return(OK); - case HSMHV_CAPBD: - value->rValue = here->HSMHV_capbd; - return(OK); - case HSMHV_CAPBS: - value->rValue = here->HSMHV_capbs; - return(OK); - case HSMHV_VON: - value->rValue = here->HSMHV_von; - return(OK); - case HSMHV_VDSAT: - value->rValue = here->HSMHV_vdsat; - return(OK); - case HSMHV_QBS: - value->rValue = *(ckt->CKTstate0 + here->HSMHVqbs); - return(OK); - case HSMHV_QBD: - value->rValue = *(ckt->CKTstate0 + here->HSMHVqbd); - return(OK); - case HSMHV_CORBNET: - value->iValue = here->HSMHV_corbnet; - return(OK); - case HSMHV_RBPB: - value->rValue = here->HSMHV_rbpb; - return (OK); - case HSMHV_RBPD: - value->rValue = here->HSMHV_rbpd; - return(OK); - case HSMHV_RBPS: - value->rValue = here->HSMHV_rbps; - return(OK); - case HSMHV_RBDB: - value->rValue = here->HSMHV_rbdb; - return(OK); - case HSMHV_RBSB: - value->rValue = here->HSMHV_rbsb; - return(OK); - case HSMHV_CORG: - value->iValue = here->HSMHV_corg; - return(OK); - case HSMHV_NGCON: - value->rValue = here->HSMHV_ngcon; - return(OK); - case HSMHV_XGW: - value->rValue = here->HSMHV_xgw; - return(OK); - case HSMHV_XGL: - value->rValue = here->HSMHV_xgl; - return(OK); - case HSMHV_NF: - value->rValue = here->HSMHV_nf; - return(OK); - case HSMHV_SA: - value->rValue = here->HSMHV_sa; - return(OK); - case HSMHV_SB: - value->rValue = here->HSMHV_sb; - return(OK); - case HSMHV_SD: - value->rValue = here->HSMHV_sd; - return(OK); - case HSMHV_NSUBCDFM: - value->rValue = here->HSMHV_nsubcdfm; - return(OK); - case HSMHV_M: - value->rValue = here->HSMHV_m; - return(OK); - case HSMHV_SUBLD1: - value->rValue = here->HSMHV_subld1; - return(OK); - case HSMHV_SUBLD2: - value->rValue = here->HSMHV_subld2; - return(OK); - case HSMHV_LOVER: - value->rValue = here->HSMHV_lover; - return(OK); - case HSMHV_LOVERS: - value->rValue = here->HSMHV_lovers; - return(OK); - case HSMHV_LOVERLD: - value->rValue = here->HSMHV_loverld; - return(OK); - case HSMHV_LDRIFT1: - value->rValue = here->HSMHV_ldrift1; - return(OK); - case HSMHV_LDRIFT2: - value->rValue = here->HSMHV_ldrift2; - return(OK); - case HSMHV_LDRIFT1S: - value->rValue = here->HSMHV_ldrift1s; - return(OK); - case HSMHV_LDRIFT2S: - value->rValue = here->HSMHV_ldrift2s; - return(OK); - default: - return(E_BADPARM); - } - /* NOTREACHED */ -} diff --git a/src/spicelib/devices/hisimhv1/hsmhvcvtest.c b/src/spicelib/devices/hisimhv1/hsmhvcvtest.c deleted file mode 100644 index 86539194c..000000000 --- a/src/spicelib/devices/hisimhv1/hsmhvcvtest.c +++ /dev/null @@ -1,253 +0,0 @@ -/*********************************************************************** - - HiSIM (Hiroshima University STARC IGFET Model) - Copyright (C) 2012 Hiroshima University & STARC - - MODEL NAME : HiSIM_HV - ( VERSION : 1 SUBVERSION : 2 REVISION : 4 ) - Model Parameter VERSION : 1.23 - FILE : hsmhvcvtest.c - - DATE : 2013.04.30 - - released by - Hiroshima University & - Semiconductor Technology Academic Research Center (STARC) -***********************************************************************/ - -#include "ngspice/ngspice.h" -#include "ngspice/cktdefs.h" -#include "hsmhvdef.h" -#include "ngspice/trandefs.h" -#include "ngspice/const.h" -#include "ngspice/devdefs.h" -#include "ngspice/sperror.h" -#include "ngspice/suffix.h" - -int HSMHVconvTest( - GENmodel *inModel, - register CKTcircuit *ckt) -{ - register HSMHVmodel *model = (HSMHVmodel*)inModel; - register HSMHVinstance *here; - double vds=0.0, vgs=0.0, vbs=0.0, vdse=0.0, vgse=0.0, vbse=0.0, vdbd=0.0, vsbs=0.0, deltemp =0.0 ; - double delvds=0.0, delvgs=0.0, delvbs=0.0, delvdse=0.0, delvgse=0.0, delvbse=0.0, delvdbd=0.0, delvsbs=0.0, deldeltemp =0.0 ; - double Ids=0.0, gds=0.0, gm=0.0, gmbs=0.0, gmT=0.0, gmbs_ext=0.0, gds_ext=0.0, gm_ext=0.0, - Isub=0.0, dIsub_dVds=0.0, dIsub_dVgs=0.0, dIsub_dVbs=0.0, dIsub_dT=0.0, - Isubs=0.0, dIsubs_dVds=0.0, dIsubs_dVgs=0.0, dIsubs_dVbs=0.0, dIsubs_dT=0.0, - Igidl=0.0, dIgidl_dVds=0.0, dIgidl_dVgs=0.0, dIgidl_dVbs=0.0, dIgidl_dT=0.0, - Igisl=0.0, dIgisl_dVds=0.0, dIgisl_dVgs=0.0, dIgisl_dVbs=0.0, dIgisl_dT=0.0, - Igd=0.0, dIgd_dVd=0.0, dIgd_dVg=0.0, dIgd_dVb=0.0, dIgd_dT=0.0, - Igs=0.0, dIgs_dVd=0.0, dIgs_dVg=0.0, dIgs_dVb=0.0, dIgs_dT=0.0, - Igb=0.0, dIgb_dVd=0.0, dIgb_dVg=0.0, dIgb_dVb=0.0, dIgb_dT=0.0, - Ibd=0.0, Gbd=0.0, Gbdt=0.0, - Ibs=0.0, Gbs=0.0, Gbst =0.0 ; - double i_dP=0.0, i_gP=0.0, i_sP=0.0, i_db=0.0, i_sb=0.0, - i_dP_hat=0.0, i_gP_hat=0.0, i_sP_hat=0.0, i_db_hat=0.0, i_sb_hat =0.0 ; - double tol0=0.0, tol1=0.0, tol2=0.0, tol3=0.0, tol4 =0.0 ; - - - /* loop through all the HSMHV device models */ - for ( ; model != NULL; model = HSMHVnextModel(model)) { - /* loop through all the instances of the model */ - for ( here = HSMHVinstances(model); here != NULL ; - here = HSMHVnextInstance(here)) { - - vds = model->HSMHV_type * - (*(ckt->CKTrhsOld+here->HSMHVdNodePrime) - - *(ckt->CKTrhsOld+here->HSMHVsNodePrime)); - vgs = model->HSMHV_type * - (*(ckt->CKTrhsOld+here->HSMHVgNodePrime) - - *(ckt->CKTrhsOld+here->HSMHVsNodePrime)); - vbs = model->HSMHV_type * - (*(ckt->CKTrhsOld+here->HSMHVbNodePrime) - - *(ckt->CKTrhsOld+here->HSMHVsNodePrime)); - vdse = model->HSMHV_type * - (*(ckt->CKTrhsOld+here->HSMHVdNode) - - *(ckt->CKTrhsOld+here->HSMHVsNode)); - vgse = model->HSMHV_type * - (*(ckt->CKTrhsOld+here->HSMHVgNodePrime) - - *(ckt->CKTrhsOld+here->HSMHVsNode)); - vbse = model->HSMHV_type * - (*(ckt->CKTrhsOld+here->HSMHVbNodePrime) - - *(ckt->CKTrhsOld+here->HSMHVsNode)); - vdbd = model->HSMHV_type - * (*(ckt->CKTrhsOld + here->HSMHVdbNode) - - *(ckt->CKTrhsOld + here->HSMHVdNode)); - vsbs = model->HSMHV_type - * (*(ckt->CKTrhsOld + here->HSMHVsbNode) - - *(ckt->CKTrhsOld + here->HSMHVsNode)); - if( here->HSMHVtempNode > 0 ){ - deltemp = *(ckt->CKTrhsOld + here->HSMHVtempNode); - } else { - deltemp = 0.0 ; - } - - delvds = vds - *(ckt->CKTstate0 + here->HSMHVvds) ; - delvgs = vgs - *(ckt->CKTstate0 + here->HSMHVvgs) ; - delvbs = vbs - *(ckt->CKTstate0 + here->HSMHVvbs) ; - delvdse = vdse - *(ckt->CKTstate0 + here->HSMHVvdse) ; - delvgse = vgse - *(ckt->CKTstate0 + here->HSMHVvgse) ; - delvbse = vbse - *(ckt->CKTstate0 + here->HSMHVvbse) ; - delvdbd = vdbd - *(ckt->CKTstate0 + here->HSMHVvdbd) ; - delvsbs = vsbs - *(ckt->CKTstate0 + here->HSMHVvsbs) ; - if( here->HSMHVtempNode > 0 ){ - deldeltemp = deltemp - *(ckt->CKTstate0 + here->HSMHVdeltemp) ; - } else { - deldeltemp = 0.0 ; - } - - if ( here->HSMHV_mode > 0 ) { /* forward mode */ - Ids = here->HSMHV_ids ; - gds = here->HSMHV_dIds_dVdsi ; - gm = here->HSMHV_dIds_dVgsi ; - gmbs = here->HSMHV_dIds_dVbsi ; - gmT = (here->HSMHVtempNode > 0) ? here->HSMHV_dIds_dTi : 0.0 ; - gmbs_ext = here->HSMHV_dIds_dVbse; - gds_ext = here->HSMHV_dIds_dVdse ; - gm_ext = here->HSMHV_dIds_dVgse; - Isub = here->HSMHV_isub ; - dIsub_dVds = here->HSMHV_dIsub_dVdsi ; - dIsub_dVgs = here->HSMHV_dIsub_dVgsi ; - dIsub_dVbs = here->HSMHV_dIsub_dVbsi ; - dIsub_dT = (here->HSMHVtempNode > 0) ? here->HSMHV_dIsub_dTi : 0.0 ; - Isubs = 0.0 ; - dIsubs_dVds = 0.0 ; - dIsubs_dVgs = 0.0 ; - dIsubs_dVbs = 0.0 ; - dIsubs_dT = 0.0 ; - Igidl = here->HSMHV_igidl ; - dIgidl_dVds = here->HSMHV_dIgidl_dVdsi ; - dIgidl_dVgs = here->HSMHV_dIgidl_dVgsi ; - dIgidl_dVbs = here->HSMHV_dIgidl_dVbsi ; - dIgidl_dT = (here->HSMHVtempNode > 0) ? here->HSMHV_dIgidl_dTi : 0.0 ; - Igisl = here->HSMHV_igisl ; - dIgisl_dVds = here->HSMHV_dIgisl_dVdsi ; - dIgisl_dVgs = here->HSMHV_dIgisl_dVgsi ; - dIgisl_dVbs = here->HSMHV_dIgisl_dVbsi ; - dIgisl_dT = (here->HSMHVtempNode > 0) ? here->HSMHV_dIgisl_dTi : 0.0 ; - Igd = here->HSMHV_igd ; - dIgd_dVd = here->HSMHV_dIgd_dVdsi ; - dIgd_dVg = here->HSMHV_dIgd_dVgsi ; - dIgd_dVb = here->HSMHV_dIgd_dVbsi ; - dIgd_dT = (here->HSMHVtempNode > 0) ? here->HSMHV_dIgd_dTi : 0.0 ; - Igs = here->HSMHV_igs ; - dIgs_dVd = here->HSMHV_dIgs_dVdsi ; - dIgs_dVg = here->HSMHV_dIgs_dVgsi ; - dIgs_dVb = here->HSMHV_dIgs_dVbsi ; - dIgs_dT = (here->HSMHVtempNode > 0) ? here->HSMHV_dIgs_dTi : 0.0 ; - Igb = here->HSMHV_igb ; - dIgb_dVd = here->HSMHV_dIgb_dVdsi ; - dIgb_dVg = here->HSMHV_dIgb_dVgsi ; - dIgb_dVb = here->HSMHV_dIgb_dVbsi ; - dIgb_dT = (here->HSMHVtempNode > 0) ? here->HSMHV_dIgb_dTi : 0.0 ; - Ibd = here->HSMHV_ibd ; - Gbd = here->HSMHV_gbd ; - Gbdt = (here->HSMHVtempNode > 0) ? here->HSMHV_gbdT : 0.0 ; - Ibs = here->HSMHV_ibs ; - Gbs = here->HSMHV_gbs ; - Gbst = (here->HSMHVtempNode > 0) ? here->HSMHV_gbsT : 0.0 ; - } else { /* reverse mode */ - Ids = - here->HSMHV_ids ; - gds = + (here->HSMHV_dIds_dVdsi + here->HSMHV_dIds_dVgsi + here->HSMHV_dIds_dVbsi) ; - gm = - here->HSMHV_dIds_dVgsi ; - gmbs = - here->HSMHV_dIds_dVbsi ; - gmT = (here->HSMHVtempNode > 0) ? - here->HSMHV_dIds_dTi : 0.0 ; - gds_ext = + (here->HSMHV_dIds_dVdse + here->HSMHV_dIds_dVgse + here->HSMHV_dIds_dVbse) ; - gm_ext = - here->HSMHV_dIds_dVgse; - gmbs_ext = - here->HSMHV_dIds_dVbse; - Isub = 0.0 ; - dIsub_dVds = 0.0 ; - dIsub_dVgs = 0.0 ; - dIsub_dVbs = 0.0 ; - dIsub_dT = 0.0 ; - Isubs = here->HSMHV_isub ; - dIsubs_dVds = - (here->HSMHV_dIsub_dVdsi + here->HSMHV_dIsub_dVgsi + here->HSMHV_dIsub_dVbsi) ; - dIsubs_dVgs = here->HSMHV_dIsub_dVgsi ; - dIsubs_dVbs = here->HSMHV_dIsub_dVbsi ; - dIsubs_dT = (here->HSMHVtempNode > 0) ? here->HSMHV_dIsub_dTi : 0.0 ; - Igidl = here->HSMHV_igisl ; - dIgidl_dVds = - (here->HSMHV_dIgisl_dVdsi + here->HSMHV_dIgisl_dVgsi + here->HSMHV_dIgisl_dVbsi) ; - dIgidl_dVgs = here->HSMHV_dIgisl_dVgsi ; - dIgidl_dVbs = here->HSMHV_dIgisl_dVbsi ; - dIgidl_dT = (here->HSMHVtempNode > 0) ? here->HSMHV_dIgisl_dTi : 0.0 ; - Igisl = here->HSMHV_igidl ; - dIgisl_dVds = - (here->HSMHV_dIgidl_dVdsi + here->HSMHV_dIgidl_dVgsi + here->HSMHV_dIgidl_dVbsi) ; - dIgisl_dVgs = here->HSMHV_dIgidl_dVgsi ; - dIgisl_dVbs = here->HSMHV_dIgidl_dVbsi ; - dIgisl_dT = (here->HSMHVtempNode > 0) ? here->HSMHV_dIgidl_dTi : 0.0 ; - Igd = here->HSMHV_igd ; - dIgd_dVd = - (here->HSMHV_dIgs_dVdsi + here->HSMHV_dIgs_dVgsi + here->HSMHV_dIgs_dVbsi) ; - dIgd_dVg = here->HSMHV_dIgs_dVgsi ; - dIgd_dVb = here->HSMHV_dIgs_dVbsi ; - dIgd_dT = (here->HSMHVtempNode > 0) ? here->HSMHV_dIgs_dTi : 0.0 ; - Igs = here->HSMHV_igs ; - dIgs_dVd = - (here->HSMHV_dIgd_dVdsi + here->HSMHV_dIgd_dVgsi + here->HSMHV_dIgd_dVbsi) ; - dIgs_dVg = here->HSMHV_dIgd_dVgsi ; - dIgs_dVb = here->HSMHV_dIgd_dVbsi ; - dIgs_dT = (here->HSMHVtempNode > 0) ? here->HSMHV_dIgd_dTi : 0.0 ; - Igb = here->HSMHV_igb ; - dIgb_dVd = - (here->HSMHV_dIgb_dVdsi + here->HSMHV_dIgb_dVgsi + here->HSMHV_dIgb_dVbsi) ; - dIgb_dVg = here->HSMHV_dIgb_dVgsi ; - dIgb_dVb = here->HSMHV_dIgb_dVbsi ; - dIgb_dT = (here->HSMHVtempNode > 0) ? here->HSMHV_dIgb_dTi : 0.0 ; - Ibd = here->HSMHV_ibd ; - Gbd = here->HSMHV_gbd ; - Gbdt = (here->HSMHVtempNode > 0) ? here->HSMHV_gbdT : 0.0 ; - Ibs = here->HSMHV_ibs ; - Gbs = here->HSMHV_gbs ; - Gbst = (here->HSMHVtempNode > 0) ? here->HSMHV_gbsT : 0.0 ; - } /* end of reverse mode */ - - /* for convergence control, only nonlinear static currents are considered: */ - i_dP = Ids + Isub + Igidl - Igd ; - i_dP_hat = i_dP + gm *delvgs + gds *delvds + gmbs *delvbs + gmT *deldeltemp - + dIsub_dVgs *delvgs + dIsub_dVds *delvds + dIsub_dVbs *delvbs + dIsub_dT *deldeltemp - + dIgidl_dVgs*delvgs + dIgidl_dVds*delvds + dIgidl_dVbs*delvbs + dIgidl_dT*deldeltemp - -(dIgd_dVg *delvgs + dIgd_dVd *delvds + dIgd_dVb *delvbs + dIgd_dT *deldeltemp) - + gm_ext *delvgse + gds_ext *delvdse + gmbs_ext *delvbse ; - - i_gP = Igd + Igs + Igb ; - i_gP_hat = i_gP + dIgd_dVg *delvgs + dIgd_dVd *delvds + dIgd_dVb *delvbs + dIgd_dT *deldeltemp - + dIgs_dVg *delvgs + dIgs_dVd *delvds + dIgs_dVb *delvbs + dIgs_dT *deldeltemp - + dIgb_dVg *delvgs + dIgb_dVd *delvds + dIgb_dVb *delvbs + dIgb_dT *deldeltemp ; - - i_sP =-Ids + Isubs + Igisl - Igs ; - i_sP_hat = i_sP -(gm *delvgs + gds *delvds + gmbs *delvbs + gmT *deldeltemp) - + dIsubs_dVgs*delvgs + dIsubs_dVds*delvds + dIsubs_dVbs*delvbs + dIsubs_dT*deldeltemp - + dIgisl_dVgs*delvgs + dIgisl_dVds*delvds + dIgisl_dVbs*delvbs + dIgisl_dT*deldeltemp - -(dIgs_dVg *delvgs + dIgs_dVd *delvds + dIgs_dVb *delvbs + dIgs_dT *deldeltemp) - -(gm_ext *delvgse + gds_ext *delvdse + gmbs_ext *delvbse) ; - - i_db = Ibd ; - i_db_hat = i_db + Gbd*delvdbd + Gbdt*deldeltemp ; - - i_sb = Ibs ; - i_sb_hat = i_sb + Gbs*delvsbs + Gbst*deldeltemp ; - - /* to be added: power source for thermal network */ - - - /* - * check convergence - */ - if ( here->HSMHV_off == 0 || !(ckt->CKTmode & MODEINITFIX) ) { - tol0 = ckt->CKTreltol * MAX(fabs(i_dP_hat), fabs(i_dP)) + ckt->CKTabstol; - tol1 = ckt->CKTreltol * MAX(fabs(i_gP_hat), fabs(i_gP)) + ckt->CKTabstol; - tol2 = ckt->CKTreltol * MAX(fabs(i_sP_hat), fabs(i_sP)) + ckt->CKTabstol; - tol3 = ckt->CKTreltol * MAX(fabs(i_db_hat), fabs(i_db)) + ckt->CKTabstol; - tol4 = ckt->CKTreltol * MAX(fabs(i_sb_hat), fabs(i_sb)) + ckt->CKTabstol; - - if ( (fabs(i_dP_hat - i_dP) >= tol0) - || (fabs(i_gP_hat - i_gP) >= tol1) - || (fabs(i_sP_hat - i_sP) >= tol2) - || (fabs(i_db_hat - i_db) >= tol3) - || (fabs(i_sb_hat - i_sb) >= tol4) ) { - ckt->CKTnoncon++; - return(OK); - } - } - } - } - return(OK); -} diff --git a/src/spicelib/devices/hisimhv1/hsmhvdef.h b/src/spicelib/devices/hisimhv1/hsmhvdef.h deleted file mode 100644 index d93015c53..000000000 --- a/src/spicelib/devices/hisimhv1/hsmhvdef.h +++ /dev/null @@ -1,2981 +0,0 @@ -/*********************************************************************** - - HiSIM (Hiroshima University STARC IGFET Model) - Copyright (C) 2012 Hiroshima University & STARC - - MODEL NAME : HiSIM_HV - ( VERSION : 1 SUBVERSION : 2 REVISION : 4 ) - Model Parameter VERSION : 1.23 - FILE : hsmhvdef - - DATE : 2013.04.30 - - released by - Hiroshima University & - Semiconductor Technology Academic Research Center (STARC) -***********************************************************************/ - -#ifndef HSMHV -#define HSMHV - -#include "ngspice/ifsim.h" -#include "ngspice/gendefs.h" -#include "ngspice/cktdefs.h" -#include "ngspice/complex.h" -#include "ngspice/noisedef.h" - -/* declarations for HiSIMHV MOSFETs */ - -/* unit-converted model parameters */ -typedef struct sHSMHVmodelMKSParam { - double HSMHV_npext ; - double HSMHV_vmax ; - double HSMHV_ll ; - double HSMHV_wl ; - double HSMHV_svgsl ; - double HSMHV_svgsw ; - double HSMHV_svbsl ; - double HSMHV_slgl ; - double HSMHV_sub1l ; - double HSMHV_slg ; - double HSMHV_sub2l ; - double HSMHV_subld2 ; - double HSMHV_rd22 ; - double HSMHV_rd23 ; - double HSMHV_rd24 ; - double HSMHV_rdtemp1 ; - double HSMHV_rdtemp2 ; - double HSMHV_rdvd ; - double HSMHV_rdvdtemp1 ; - double HSMHV_rdvdtemp2 ; -//double HSMHV_muecb0 ; -//double HSMHV_muecb1 ; -//double HSMHV_muesr1 ; -//double HSMHV_mueph1 ; - double HSMHV_nsubsub ; - double HSMHV_nsubpsti1 ; - double HSMHV_muesti1 ; - double HSMHV_wfc ; - double HSMHV_glksd1 ; - double HSMHV_glksd2 ; - double HSMHV_glksd3 ; - double HSMHV_gleak2 ; - double HSMHV_gleak4 ; - double HSMHV_gleak5 ; - double HSMHV_gleak7 ; - double HSMHV_glkb2 ; - double HSMHV_fn2 ; - double HSMHV_gidl1 ; - double HSMHV_gidl2 ; - double HSMHV_nfalp ; - double HSMHV_nftrp ; - double HSMHV_cit ; - double HSMHV_ovslp ; - double HSMHV_dly3 ; - double HSMHV_rth0 ; - double HSMHV_cth0 ; -} HSMHVmodelMKSParam ; - - -/* binning parameters */ -typedef struct sHSMHVbinningParam { - double HSMHV_vmax ; - double HSMHV_bgtmp1 ; - double HSMHV_bgtmp2 ; - double HSMHV_eg0 ; - double HSMHV_vfbover ; - double HSMHV_nover ; - double HSMHV_novers ; - double HSMHV_wl2 ; - double HSMHV_vfbc ; - double HSMHV_nsubc ; - double HSMHV_nsubp ; - double HSMHV_scp1 ; - double HSMHV_scp2 ; - double HSMHV_scp3 ; - double HSMHV_sc1 ; - double HSMHV_sc2 ; - double HSMHV_sc3 ; - double HSMHV_pgd1 ; - double HSMHV_pgd3 ; - double HSMHV_ndep ; - double HSMHV_ninv ; - double HSMHV_muecb0 ; - double HSMHV_muecb1 ; - double HSMHV_mueph1 ; - double HSMHV_vtmp ; - double HSMHV_wvth0 ; - double HSMHV_muesr1 ; - double HSMHV_muetmp ; - double HSMHV_sub1 ; - double HSMHV_sub2 ; - double HSMHV_svds ; - double HSMHV_svbs ; - double HSMHV_svgs ; - double HSMHV_fn1 ; - double HSMHV_fn2 ; - double HSMHV_fn3 ; - double HSMHV_fvbs ; - double HSMHV_nsti ; - double HSMHV_wsti ; - double HSMHV_scsti1 ; - double HSMHV_scsti2 ; - double HSMHV_vthsti ; - double HSMHV_muesti1 ; - double HSMHV_muesti2 ; - double HSMHV_muesti3 ; - double HSMHV_nsubpsti1 ; - double HSMHV_nsubpsti2 ; - double HSMHV_nsubpsti3 ; - double HSMHV_cgso ; - double HSMHV_cgdo ; - double HSMHV_js0 ; - double HSMHV_js0sw ; - double HSMHV_nj ; - double HSMHV_cisbk ; - double HSMHV_clm1 ; - double HSMHV_clm2 ; - double HSMHV_clm3 ; - double HSMHV_wfc ; - double HSMHV_gidl1 ; - double HSMHV_gidl2 ; - double HSMHV_gleak1 ; - double HSMHV_gleak2 ; - double HSMHV_gleak3 ; - double HSMHV_gleak6 ; - double HSMHV_glksd1 ; - double HSMHV_glksd2 ; - double HSMHV_glkb1 ; - double HSMHV_glkb2 ; - double HSMHV_nftrp ; - double HSMHV_nfalp ; - double HSMHV_pthrou ; - double HSMHV_vdiffj ; - double HSMHV_ibpc1 ; - double HSMHV_ibpc2 ; - double HSMHV_cgbo ; - double HSMHV_cvdsover ; - double HSMHV_falph ; - double HSMHV_npext ; - double HSMHV_powrat ; - double HSMHV_rd ; - double HSMHV_rd22 ; - double HSMHV_rd23 ; - double HSMHV_rd24 ; - double HSMHV_rdict1 ; - double HSMHV_rdov13 ; - double HSMHV_rdslp1 ; - double HSMHV_rdvb ; - double HSMHV_rdvd ; - double HSMHV_rdvg11 ; - double HSMHV_rs ; - double HSMHV_rth0 ; - double HSMHV_vover ; - /*-----------SHE--------------*/ - double HSMHV_rth ; - double HSMHV_cth ; - /*-----------------------------*/ - -} HSMHVbinningParam ; - - -/* unit-converted parameters for each instance */ -typedef struct sHSMHVhereMKSParam { - double HSMHV_vmax ; - double HSMHV_subld2 ; -//double HSMHV_muecb0 ; -//double HSMHV_muecb1 ; -//double HSMHV_muesr1 ; -//double HSMHV_mueph1 ; - double HSMHV_ndep ; - double HSMHV_ninv ; - double HSMHV_nsubc ; - double HSMHV_nsubcdfm ; - double HSMHV_nsubp ; - double HSMHV_nsubpsti1 ; - double HSMHV_muesti1 ; - double HSMHV_nsti ; - double HSMHV_npext ; - double HSMHV_nover ; - double HSMHV_novers ; - double HSMHV_wfc ; - double HSMHV_glksd1 ; - double HSMHV_glksd2 ; - double HSMHV_gleak2 ; - double HSMHV_glkb2 ; - double HSMHV_fn2 ; - double HSMHV_gidl1 ; - double HSMHV_gidl2 ; - double HSMHV_nfalp ; - double HSMHV_nftrp ; -} HSMHVhereMKSParam ; - - -/* information needed for each instance */ -typedef struct sHSMHVinstance { - - struct GENinstance gen; - -#define HSMHVmodPtr(inst) ((struct sHSMHVmodel *)((inst)->gen.GENmodPtr)) -#define HSMHVnextInstance(inst) ((struct sHSMHVinstance *)((inst)->gen.GENnextInstance)) -#define HSMHVname gen.GENname -#define HSMHVstates gen.GENstate - - const int HSMHVdNode; /* number of the drain node of the mosfet */ - const int HSMHVgNode; /* number of the gate node of the mosfet */ - const int HSMHVsNode; /* number of the source node of the mosfet */ - const int HSMHVbNode; /* number of the bulk node of the mosfet */ - const int HSMHVsubNodeExt; /* number of the substrate node */ - const int HSMHVtempNodeExt;/* number of the temp node----------SHE--------*/ - int HSMHVsubNode; /* number of the substrate node */ - int HSMHVtempNode; /* number of the temp node */ - int HSMHVdNodePrime; /* number od the inner drain node */ - int HSMHVgNodePrime; /* number of the inner gate node */ - int HSMHVsNodePrime; /* number od the inner source node */ - int HSMHVbNodePrime; - int HSMHVdbNode; - int HSMHVsbNode; - int HSMHVqiNode; /* number of the qi node in case of NQS */ - int HSMHVqbNode; /* number of the qb node in case of NQS */ - - double HSMHV_noiflick; /* for 1/f noise calc. */ - double HSMHV_noithrml; /* for thrmal noise calc. */ - double HSMHV_noiigate; /* for induced gate noise */ - double HSMHV_noicross; /* for induced gate noise */ - - /* instance */ - int HSMHV_coselfheat; /* Self-heating model */ - int HSMHV_cosubnode; /* switch tempNode to subNode */ - double HSMHV_l; /* the length of the channel region */ - double HSMHV_w; /* the width of the channel region */ - double HSMHV_ad; /* the area of the drain diffusion */ - double HSMHV_as; /* the area of the source diffusion */ - double HSMHV_pd; /* perimeter of drain junction [m] */ - double HSMHV_ps; /* perimeter of source junction [m] */ - double HSMHV_nrd; /* equivalent num of squares of drain [-] (unused) */ - double HSMHV_nrs; /* equivalent num of squares of source [-] (unused) */ - double HSMHV_dtemp; - - double HSMHV_weff; /* the effective width of the channel region */ - double HSMHV_weff_ld; /* the effective width of the drift region */ - double HSMHV_weff_cv; /* the effective width of the drift region for capacitance */ - double HSMHV_weff_nf; /* Weff * NF */ - double HSMHV_weffcv_nf; /* Weffcv * NF */ - double HSMHV_leff; /* the effective length of the channel region */ - - int HSMHV_corbnet ; - double HSMHV_rbpb ; - double HSMHV_rbpd ; - double HSMHV_rbps ; - double HSMHV_rbdb ; - double HSMHV_rbsb ; - - int HSMHV_corg ; - double HSMHV_ngcon; - double HSMHV_xgw; - double HSMHV_xgl; - double HSMHV_nf; - - double HSMHV_sa; - double HSMHV_sb; - double HSMHV_sd; - double HSMHV_nsubcdfm; - double HSMHV_m; - double HSMHV_subld1; - double HSMHV_subld2; - double HSMHV_lover; - double HSMHV_lovers; - double HSMHV_loverld; - double HSMHV_ldrift1; - double HSMHV_ldrift2; - double HSMHV_ldrift1s; - double HSMHV_ldrift2s; - - int HSMHV_called; /* flag to check the first call */ - /* previous values to evaluate initial guess */ - double HSMHV_mode_prv; - double HSMHV_vbsc_prv; - double HSMHV_vdsc_prv; - double HSMHV_vgsc_prv; - double HSMHV_ps0_prv; - double HSMHV_ps0_dvbs_prv; - double HSMHV_ps0_dvds_prv; - double HSMHV_ps0_dvgs_prv; - double HSMHV_ps0_dtemp_prv; - double HSMHV_pds_prv; - double HSMHV_pds_dvbs_prv; - double HSMHV_pds_dvds_prv; - double HSMHV_pds_dvgs_prv; - double HSMHV_pds_dtemp_prv; - /* double HSMHV_ids_prv; not used */ - /* double HSMHV_ids_dvbs_prv; not used */ - /* double HSMHV_ids_dvds_prv; not used */ - /* double HSMHV_ids_dvgs_prv; not used */ - /* double HSMHV_ids_dtemp_prv; not used */ - double HSMHV_mode_prv2; - double HSMHV_vbsc_prv2; - double HSMHV_vdsc_prv2; - double HSMHV_vgsc_prv2; - double HSMHV_ps0_prv2; /* assigned but not used */ - double HSMHV_ps0_dvbs_prv2; - double HSMHV_ps0_dvds_prv2; - double HSMHV_ps0_dvgs_prv2; - double HSMHV_pds_prv2; /* assigned but not used */ - double HSMHV_pds_dvbs_prv2; - double HSMHV_pds_dvds_prv2; - double HSMHV_pds_dvgs_prv2; - double HSMHV_temp_prv; -/* double HSMHV_time; /\* for debug print *\/ */ - - /* output */ - /* int HSMHV_capop; not used */ - /* double HSMHV_gd; not used */ - /* double HSMHV_gs; not used */ - double HSMHV_cgso; /* can be made local */ - double HSMHV_cgdo; - double HSMHV_cgbo; - double HSMHV_cggo; - double HSMHV_cdso; /* can be made local */ - double HSMHV_cddo; - double HSMHV_cdgo; - double HSMHV_cdbo; - double HSMHV_csso; /* can be made local */ - double HSMHV_csdo; /* can be made local */ - double HSMHV_csgo; /* can be made local */ - double HSMHV_csbo; /* can be made local */ - double HSMHV_cbdo; - double HSMHV_cbgo; - double HSMHV_cbbo; - /* double HSMHV_cqyd; not used */ - /* double HSMHV_cqyg; not used */ - /* double HSMHV_cqyb; not used */ - double HSMHV_von; /* vth */ - double HSMHV_vdsat; - /* double HSMHV_capgs; not used */ - /* double HSMHV_capgd; not used */ - /* double HSMHV_capgb; not used */ - - /* double HSMHV_rth0; not used */ - /* double HSMHV_cth0; not used */ - /* double HSMHV_cth; not used */ - - -#define XDIM 14 - double HSMHV_ydc_d[XDIM], HSMHV_ydc_dP[XDIM], HSMHV_ydc_g[XDIM], HSMHV_ydc_gP[XDIM], HSMHV_ydc_s[XDIM], HSMHV_ydc_sP[XDIM], - HSMHV_ydc_bP[XDIM], HSMHV_ydc_b[XDIM], HSMHV_ydc_db[XDIM], HSMHV_ydc_sb[XDIM], HSMHV_ydc_t[XDIM], HSMHV_ydc_qi[XDIM], - HSMHV_ydc_qb[XDIM]; - double HSMHV_ydyn_d[XDIM], HSMHV_ydyn_dP[XDIM], HSMHV_ydyn_g[XDIM], HSMHV_ydyn_gP[XDIM], HSMHV_ydyn_s[XDIM], HSMHV_ydyn_sP[XDIM], - HSMHV_ydyn_bP[XDIM], HSMHV_ydyn_b[XDIM], HSMHV_ydyn_db[XDIM], HSMHV_ydyn_sb[XDIM], HSMHV_ydyn_t[XDIM], HSMHV_ydyn_qi[XDIM], - HSMHV_ydyn_qb[XDIM]; - - /* resistances */ - double HSMHV_Rd ; /* different from HSMHV_rd */ - double HSMHV_dRd_dVdse ; - double HSMHV_dRd_dVgse ; - double HSMHV_dRd_dVbse ; - double HSMHV_dRd_dVsubs ; - double HSMHV_dRd_dTi ; - double HSMHV_Rs ; /* different from HSMHV_rs */ - double HSMHV_dRs_dVdse ; - double HSMHV_dRs_dVgse ; - double HSMHV_dRs_dVbse ; - double HSMHV_dRs_dVsubs ; - double HSMHV_dRs_dTi ; - /* drain current */ - double HSMHV_ids; - double HSMHV_gds; /* used for printout, but not loaded */ - double HSMHV_gm; /* used for printout, but not loaded */ - double HSMHV_gmbs; /* used for printout, but not loaded */ - double HSMHV_dIds_dVdse ; - double HSMHV_dIds_dVgse ; - double HSMHV_dIds_dVbse ; - double HSMHV_dIds_dVdsi ; - double HSMHV_dIds_dVgsi ; - double HSMHV_dIds_dVbsi ; - double HSMHV_dIds_dTi ; - /* substrate current */ - double HSMHV_isub; - /* double HSMHV_gbgs; not used */ - /* double HSMHV_gbds; not used */ - /* double HSMHV_gbbs; not used */ - double HSMHV_dIsub_dVdsi ; - double HSMHV_dIsub_dVgsi ; - double HSMHV_dIsub_dVbsi ; - double HSMHV_dIsub_dTi ; - double HSMHV_dIsub_dVdse ; - /* gidl and gisl current */ - double HSMHV_igidl; /* gate induced drain leakage */ - /* double HSMHV_gigidlgs; not used */ - /* double HSMHV_gigidlds; not used */ - /* double HSMHV_gigidlbs; not used */ - double HSMHV_dIgidl_dVdsi ; - double HSMHV_dIgidl_dVgsi ; - double HSMHV_dIgidl_dVbsi ; - double HSMHV_dIgidl_dTi ; - double HSMHV_igisl; /* gate induced source leakage */ - /* double HSMHV_gigislgd; not used */ - /* double HSMHV_gigislsd; not used */ - /* double HSMHV_gigislbd; not used */ - double HSMHV_dIgisl_dVdsi ; - double HSMHV_dIgisl_dVgsi ; - double HSMHV_dIgisl_dVbsi ; - double HSMHV_dIgisl_dTi ; - /* gate leakage currents */ - double HSMHV_igb; /* gate tunneling current (gate to bulk) */ - /* double HSMHV_gigbg; not used */ - /* double HSMHV_gigbd; not used */ - /* double HSMHV_gigbb; not used */ - /* double HSMHV_gigbs; not used */ - double HSMHV_dIgb_dVdsi ; - double HSMHV_dIgb_dVgsi ; - double HSMHV_dIgb_dVbsi ; - double HSMHV_dIgb_dTi ; - double HSMHV_igd; /* gate tunneling current (gate to drain) */ - /* double HSMHV_gigdg; not used */ - /* double HSMHV_gigdd; not used */ - /* double HSMHV_gigdb; not used */ - /* double HSMHV_gigds; not used */ - double HSMHV_dIgd_dVdsi ; - double HSMHV_dIgd_dVgsi ; - double HSMHV_dIgd_dVbsi ; - double HSMHV_dIgd_dTi ; - double HSMHV_igs; /* gate tunneling current (gate to source) */ - /* double HSMHV_gigsg; not used */ - /* double HSMHV_gigsd; not used */ - /* double HSMHV_gigsb; not used */ - /* double HSMHV_gigss; not used */ - double HSMHV_dIgs_dVdsi ; - double HSMHV_dIgs_dVgsi ; - double HSMHV_dIgs_dVbsi ; - double HSMHV_dIgs_dTi ; - /* charges */ - double HSMHV_qd; - double HSMHV_cdgb; /* used for printout, but not loaded */ - /* double HSMHV_cddb; not used */ - /* double HSMHV_cdsb; not used */ - /* double HSMHVcdT; not used */ - double HSMHV_dQdi_dVdsi ; - double HSMHV_dQdi_dVgsi ; - double HSMHV_dQdi_dVbsi ; - double HSMHV_dQdi_dTi ; - double HSMHV_qg; - double HSMHV_cggb; /* used for printout, but not loaded */ - double HSMHV_cgdb; /* used for printout, but not loaded */ - double HSMHV_cgsb; /* used for printout, but not loaded */ - /* double HSMHVcgT; not used */ - double HSMHV_dQg_dVdsi ; - double HSMHV_dQg_dVgsi ; - double HSMHV_dQg_dVbsi ; - double HSMHV_dQg_dTi ; - double HSMHV_qs; - double HSMHV_dQsi_dVdsi ; - double HSMHV_dQsi_dVgsi ; - double HSMHV_dQsi_dVbsi ; - double HSMHV_dQsi_dTi ; - double HSMHV_qb; /* bulk charge qb = -(qg + qd + qs) */ - double HSMHV_cbgb; /* used for printout, but not loaded */ - /* double HSMHV_cbdb; not used */ - /* double HSMHV_cbsb; not used */ - /* double HSMHVcbT; not used */ - double HSMHV_dQb_dVdsi ; /* Qb: bulk charge inclusive overlaps, Qbulk: bulk charge without overlaps (see above) */ - double HSMHV_dQb_dVgsi ; - double HSMHV_dQb_dVbsi ; - double HSMHV_dQb_dTi ; - /* outer charges (fringing etc.) */ - double HSMHV_qdp ; - double HSMHV_dqdp_dVdse ; - double HSMHV_dqdp_dVgse ; - double HSMHV_dqdp_dVbse ; - double HSMHV_dqdp_dTi ; - double HSMHV_qsp ; - double HSMHV_dqsp_dVdse ; - double HSMHV_dqsp_dVgse ; - double HSMHV_dqsp_dVbse ; - double HSMHV_dqsp_dTi ; - double HSMHV_qgext ; - double HSMHV_dQgext_dVdse ; - double HSMHV_dQgext_dVgse ; - double HSMHV_dQgext_dVbse ; - double HSMHV_dQgext_dTi ; - double HSMHV_qdext ; - double HSMHV_dQdext_dVdse ; - double HSMHV_dQdext_dVgse ; - double HSMHV_dQdext_dVbse ; - double HSMHV_dQdext_dTi ; - double HSMHV_qbext ; - double HSMHV_dQbext_dVdse ; - double HSMHV_dQbext_dVgse ; - double HSMHV_dQbext_dVbse ; - double HSMHV_dQbext_dTi ; - double HSMHV_qsext ; - double HSMHV_dQsext_dVdse ; - double HSMHV_dQsext_dVgse ; - double HSMHV_dQsext_dVbse ; - double HSMHV_dQsext_dTi ; - /* junctions */ - double HSMHV_ibd; - double HSMHV_gbd; - double HSMHV_gbdT; - double HSMHV_ibs; - double HSMHV_gbs; - double HSMHV_gbsT; - double HSMHV_qbd; - double HSMHV_capbd; - double HSMHV_gcbdT; - double HSMHV_qbs; - double HSMHV_capbs; - double HSMHV_gcbsT; - - /* double HSMHV_gtempg; not used */ - /* double HSMHV_gtempt; not used */ - /* double HSMHV_gtempd; not used */ - /* double HSMHV_gtempb; not used */ - - /* double HSMHV_gmt; not used */ - /* double HSMHV_isubt; not used */ - - - /* NQS */ - double HSMHV_tau ; - double HSMHV_tau_dVgsi ; - double HSMHV_tau_dVdsi ; - double HSMHV_tau_dVbsi ; - double HSMHV_tau_dTi ; - double HSMHV_Xd ; - double HSMHV_Xd_dVgsi ; - double HSMHV_Xd_dVdsi ; - double HSMHV_Xd_dVbsi ; - double HSMHV_Xd_dTi ; - double HSMHV_Qi ; - double HSMHV_Qi_dVgsi ; - double HSMHV_Qi_dVdsi ; - double HSMHV_Qi_dVbsi ; - double HSMHV_Qi_dTi ; - double HSMHV_taub ; - double HSMHV_taub_dVgsi ; - double HSMHV_taub_dVdsi ; - double HSMHV_taub_dVbsi ; - double HSMHV_taub_dTi ; - double HSMHV_Qbulk ; /* Qbulk: without overlaps, Qb: inclusive overlaps (see below) */ - double HSMHV_Qbulk_dVgsi ; - double HSMHV_Qbulk_dVdsi ; - double HSMHV_Qbulk_dVbsi ; - double HSMHV_Qbulk_dTi ; - - - - - /* internal variables */ - double HSMHV_eg ; - double HSMHV_beta ; - double HSMHV_beta_inv ; - double HSMHV_beta2 ; - double HSMHV_betatnom ; - double HSMHV_nin ; - double HSMHV_egp12 ; - double HSMHV_egp32 ; - double HSMHV_lgate ; - double HSMHV_wg ; - double HSMHV_mueph ; - double HSMHV_mphn0 ; - double HSMHV_mphn1 ; - double HSMHV_muesr ; - double HSMHV_rdvd ; - double HSMHV_rsvd ; /* for the reverse mode */ - double HSMHV_rd23 ; - - double HSMHV_ninvd ; - double HSMHV_ninvd0 ; - - double HSMHV_nsub ; - double HSMHV_qnsub ; - double HSMHV_qnsub_esi ; - double HSMHV_2qnsub_esi ; - double HSMHV_ptovr0 ; - double HSMHV_ptovr ; - double HSMHV_vmax0 ; - double HSMHV_vmax ; - double HSMHV_pb2 ; - double HSMHV_pb20 ; - double HSMHV_pb2c ; - double HSMHV_cnst0 ; - double HSMHV_cnst1 ; - double HSMHV_isbd ; - double HSMHV_isbd2 ; - double HSMHV_isbs ; - double HSMHV_isbs2 ; - double HSMHV_vbdt ; - double HSMHV_vbst ; - double HSMHV_exptemp ; - double HSMHV_wsti ; - double HSMHV_cnstpgd ; - /* double HSMHV_ninvp0 ; not used */ - /* double HSMHV_ninv0 ; not used */ - double HSMHV_grbpb ; - double HSMHV_grbpd ; - double HSMHV_grbps ; - double HSMHV_grg ; - double HSMHV_rs ; - double HSMHV_rs0 ; - double HSMHV_rd ; - double HSMHV_rd0 ; - double HSMHV_rdtemp0 ; - double HSMHV_clmmod ; - double HSMHV_lgatesm ; - double HSMHV_dVthsm ; - double HSMHV_ddlt ; - double HSMHV_xsub1 ; - double HSMHV_xsub2 ; - double HSMHV_xgate ; - double HSMHV_xvbs ; - double HSMHV_vg2const ; - double HSMHV_wdpl ; - double HSMHV_wdplp ; - double HSMHV_cfrng ; - double HSMHV_jd_nvtm_inv ; - double HSMHV_jd_expcd ; - double HSMHV_jd_expcs ; - double HSMHV_sqrt_eg ; - - double HSMHV_egtnom ; - double HSMHV_cecox ; - double HSMHV_msc ; - int HSMHV_flg_pgd ; - double HSMHV_ndep_o_esi ; - double HSMHV_ninv_o_esi ; - double HSMHV_cqyb0 ; - double HSMHV_cnst0over ; - double HSMHV_cnst0overs ; - double HSMHV_costi00 ; - double HSMHV_nsti_p2 ; - double HSMHV_costi0 ; - double HSMHV_costi0_p2 ; - double HSMHV_costi1 ; - double HSMHV_ps0ldinib ; - double HSMHV_ps0ldinibs ; - double HSMHV_rdvdtemp0 ; - double HSMHV_rthtemp0 ; - double HSMHV_powratio ; - - double HSMHV_mueph1 ; - double HSMHV_nsubp; - double HSMHV_nsubc; - - - HSMHVhereMKSParam hereMKS ; /* unit-converted parameters */ - - HSMHVbinningParam pParam ; /* binning parameters */ - - /* no use in SPICE3f5 - double HSMHVdrainSquares; the length of the drain in squares - double HSMHVsourceSquares; the length of the source in squares */ - double HSMHVsourceConductance; /* cond. of source (or 0): set in setup */ - double HSMHVdrainConductance; /* cond. of drain (or 0): set in setup */ - - double HSMHV_icVBS; /* initial condition B-S voltage */ - double HSMHV_icVDS; /* initial condition D-S voltage */ - double HSMHV_icVGS; /* initial condition G-S voltage */ - int HSMHV_off; /* non-zero to indicate device is off for dc analysis */ - int HSMHV_mode; /* device mode : 1 = normal, -1 = inverse */ - - unsigned HSMHV_coselfheat_Given :1; - unsigned HSMHV_cosubnode_Given :1; - unsigned HSMHV_l_Given :1; - unsigned HSMHV_w_Given :1; - unsigned HSMHV_ad_Given :1; - unsigned HSMHV_as_Given :1; - unsigned HSMHV_pd_Given :1; - unsigned HSMHV_ps_Given :1; - unsigned HSMHV_nrd_Given :1; - unsigned HSMHV_nrs_Given :1; - unsigned HSMHV_dtemp_Given :1; - unsigned HSMHV_icVBS_Given :1; - unsigned HSMHV_icVDS_Given :1; - unsigned HSMHV_icVGS_Given :1; - unsigned HSMHV_corbnet_Given :1; - unsigned HSMHV_rbpb_Given :1; - unsigned HSMHV_rbpd_Given :1; - unsigned HSMHV_rbps_Given :1; - unsigned HSMHV_rbdb_Given :1; - unsigned HSMHV_rbsb_Given :1; - unsigned HSMHV_corg_Given :1; - unsigned HSMHV_ngcon_Given :1; - unsigned HSMHV_xgw_Given :1; - unsigned HSMHV_xgl_Given :1; - unsigned HSMHV_nf_Given :1; - unsigned HSMHV_sa_Given :1; - unsigned HSMHV_sb_Given :1; - unsigned HSMHV_sd_Given :1; - unsigned HSMHV_nsubcdfm_Given :1; - unsigned HSMHV_m_Given :1; - unsigned HSMHV_subld1_Given :1; - unsigned HSMHV_subld2_Given :1; - unsigned HSMHV_lover_Given :1; - unsigned HSMHV_lovers_Given :1; - unsigned HSMHV_loverld_Given :1; - unsigned HSMHV_ldrift1_Given :1; - unsigned HSMHV_ldrift2_Given :1; - unsigned HSMHV_ldrift1s_Given :1; - unsigned HSMHV_ldrift2s_Given :1; - - /* unsigned HSMHV_rth0_Given :1; not used */ - /* unsigned HSMHV_cth0_Given :1; not used */ - - - - /* pointers to sparse matrix */ - - double *HSMHVGgPtr; /* pointer to sparse matrix element at (gate node,gate node) */ - double *HSMHVGgpPtr; /* pointer to sparse matrix element at (gate node,gate prime node) */ - /* double *HSMHVGdpPtr; not used */ - /* double *HSMHVGspPtr; not used */ - /* double *HSMHVGbpPtr; not used */ - - double *HSMHVGPgPtr; /* pointer to sparse matrix element at (gate prime node,gate node) */ - double *HSMHVGPgpPtr; /* pointer to sparse matrix element at (gate prime node,gate prime node) */ - double *HSMHVGPdpPtr; /* pointer to sparse matrix element at (gate prime node,drain prime node) */ - double *HSMHVGPspPtr; /* pointer to sparse matrix element at (gate prime node,source prime node) */ - double *HSMHVGPbpPtr; /* pointer to sparse matrix element at (gate prime node,bulk prime node) */ - - double *HSMHVDPdPtr; /* pointer to sparse matrix element at (drain prime node,drain node) */ - double *HSMHVDPdpPtr; /* pointer to sparse matrix element at (drain prime node,drain prime node) */ - double *HSMHVDPgpPtr; /* pointer to sparse matrix element at (drain prime node,gate prime node) */ - double *HSMHVDPspPtr; /* pointer to sparse matrix element at (drain prime node,source prime node) */ - double *HSMHVDPbpPtr; /* pointer to sparse matrix element at (drain prime node,bulk prime node) */ - - double *HSMHVDdPtr; /* pointer to sparse matrix element at (Drain node,drain node) */ - double *HSMHVDdpPtr; /* pointer to sparse matrix element at (drain node,drain prime node) */ - double *HSMHVDspPtr; /* pointer to sparse matrix element at (drain node,source prime node) */ - double *HSMHVDdbPtr; /* pointer to sparse matrix element at (drain node,drain body node) */ - - double *HSMHVSPsPtr; /* pointer to sparse matrix element at (source prime node,source node) */ - double *HSMHVSPspPtr; /* pointer to sparse matrix element at (source prime node,source prime node) */ - double *HSMHVSPgpPtr; /* pointer to sparse matrix element at (source prime node,gate prime node) */ - double *HSMHVSPdpPtr; /* pointer to sparse matrix element at (source prime node,drain prime node) */ - double *HSMHVSPbpPtr; /* pointer to sparse matrix element at (source prime node,bulk prime node) */ - - double *HSMHVSsPtr; /* pointer to sparse matrix element at (source node,source node) */ - double *HSMHVSspPtr; /* pointer to sparse matrix element at (source node,source prime node) */ - double *HSMHVSdpPtr; /* pointer to sparse matrix element at (source node,drain prime node) */ - double *HSMHVSsbPtr; /* pointer to sparse matrix element at (source node,source body node) */ - - double *HSMHVBPgpPtr; /* pointer to sparse matrix element at (bulk prime node,gate prime node) */ - double *HSMHVBPbpPtr; /* pointer to sparse matrix element at (bulk prime node,bulk prime node) */ - double *HSMHVBPdPtr; /* pointer to sparse matrix element at (bulk prime node,drain node) */ - double *HSMHVBPdpPtr; /* pointer to sparse matrix element at (bulk prime node,drain prime node) */ - double *HSMHVBPspPtr; /* pointer to sparse matrix element at (bulk prime node,source prime node) */ - double *HSMHVBPsPtr; /* pointer to sparse matrix element at (bulk prime node,source node) */ - double *HSMHVBPbPtr; /* pointer to sparse matrix element at (bulk prime node,bulk node) */ - double *HSMHVBPdbPtr; /* pointer to sparse matrix element at (bulk prime node,source body node) */ - double *HSMHVBPsbPtr; /* pointer to sparse matrix element at (bulk prime node,source body node) */ - - double *HSMHVDBdPtr; /* pointer to sparse matrix element at (drain body node,drain node) */ - double *HSMHVDBdbPtr; /* pointer to sparse matrix element at (drain body node,drain body node) */ - double *HSMHVDBbpPtr; /* pointer to sparse matrix element at (drain body node,bulk prime node) */ - /* double *HSMHVDBbPtr; not used */ - - double *HSMHVSBsPtr; /* pointer to sparse matrix element at (source body node,source node) */ - double *HSMHVSBbpPtr; /* pointer to sparse matrix element at (source body node,bulk prime node) */ - /* double *HSMHVSBbPtr; not used */ - double *HSMHVSBsbPtr; /* pointer to sparse matrix element at (source body node,source body node) */ - - /* double *HSMHVBsbPtr; not used */ - double *HSMHVBbpPtr; /* pointer to sparse matrix element at (bulk node,bulk prime node) */ - /* double *HSMHVBdbPtr; not used */ - double *HSMHVBbPtr; /* pointer to sparse matrix element at (bulk node,bulk node) */ - - double *HSMHVTemptempPtr; /* pointer to sparse matrix element at (temp node, temp node) */ - double *HSMHVTempdPtr; /* pointer to sparse matrix element at (temp node, drain node) */ - double *HSMHVTempdpPtr; /* pointer to sparse matrix element at (temp node, drain prime node) */ - double *HSMHVTempsPtr; /* pointer to sparse matrix element at (temp node, source node) */ - double *HSMHVTempspPtr; /* pointer to sparse matrix element at (temp node, source prime node) */ - /* double *HSMHVTempgPtr; not used */ - double *HSMHVTempgpPtr; /* pointer to sparse matrix element at (temp node, gate prime node) */ - /* double *HSMHVTempbPtr; not used */ - double *HSMHVTempbpPtr; /* pointer to sparse matrix element at (temp node, bulk prime node) */ - /* double *HSMHVGtempPtr; not used */ - double *HSMHVGPtempPtr; /* pointer to sparse matrix element at (gate prime node, temp node) */ - double *HSMHVDPtempPtr; /* pointer to sparse matrix element at (drain prime node, temp node) */ - double *HSMHVSPtempPtr; /* pointer to sparse matrix element at (source prime node, temp node) */ - /* double *HSMHVBtempPtr; not used */ - double *HSMHVBPtempPtr; /* pointer to sparse matrix element at (bulk prime node, temp node) */ - double *HSMHVDBtempPtr; /* pointer to sparse matrix element at (drain bulk node, temp node) */ - double *HSMHVSBtempPtr; /* pointer to sparse matrix element at (source bulk node, temp node) */ - - double *HSMHVDgpPtr; /* pointer to sparse matrix element at (drain node, gate prime node) */ - double *HSMHVDsPtr; /* pointer to sparse matrix element at (drain node, source node) */ - double *HSMHVDbpPtr; /* pointer to sparse matrix element at (drain node, bulk prime node) */ - double *HSMHVDtempPtr; /* pointer to sparse matrix element at (drain node, temp node) */ - double *HSMHVDPsPtr; /* pointer to sparse matrix element at (drain prime node, source node) */ - double *HSMHVGPdPtr; /* pointer to sparse matrix element at (gate prime node, drain node) */ - double *HSMHVGPsPtr; /* pointer to sparse matrix element at (gate prime node, source node) */ - double *HSMHVSdPtr; /* pointer to sparse matrix element at (source node, drain node) */ - double *HSMHVSgpPtr; /* pointer to sparse matrix element at (source node, gate prime node) */ - double *HSMHVSbpPtr; /* pointer to sparse matrix element at (source node, bulk prime node) */ - double *HSMHVStempPtr; /* pointer to sparse matrix element at (source node, temp node) */ - double *HSMHVSPdPtr; /* pointer to sparse matrix element at (source prime node, drain node) */ - - /* nqs related pointers */ - double *HSMHVDPqiPtr; /* pointer to sparse matrix element at (drain prime node, qi_nqs node) */ - double *HSMHVGPqiPtr; /* pointer to sparse matrix element at (gate prime node, qi_nqs node) */ - double *HSMHVGPqbPtr; /* pointer to sparse matrix element at (gate prime node, qb_nqs node) */ - double *HSMHVSPqiPtr; /* pointer to sparse matrix element at (source prime node, qi_nqs node) */ - double *HSMHVBPqbPtr; /* pointer to sparse matrix element at (bulk prime node, qb_nqs node) */ - double *HSMHVQIdpPtr; /* pointer to sparse matrix element at (qi_nqs node, drain prime node) */ - double *HSMHVQIgpPtr; /* pointer to sparse matrix element at (qi_nqs node, gate prime node) */ - double *HSMHVQIspPtr; /* pointer to sparse matrix element at (qi_nqs node, source prime node) */ - double *HSMHVQIbpPtr; /* pointer to sparse matrix element at (qi_nqs node, bulk prime node) */ - double *HSMHVQIqiPtr; /* pointer to sparse matrix element at (qi_nqs node, qi_nqs node) */ - double *HSMHVQBdpPtr; /* pointer to sparse matrix element at (qb_nqs node, drain prime node) */ - double *HSMHVQBgpPtr; /* pointer to sparse matrix element at (qb_nqs node, gate prime node) */ - double *HSMHVQBspPtr; /* pointer to sparse matrix element at (qb_nqs node, source prime node) */ - double *HSMHVQBbpPtr; /* pointer to sparse matrix element at (qb_nqs node, bulk prime node) */ - double *HSMHVQBqbPtr; /* pointer to sparse matrix element at (qb_nqs node, qb_nqs node) */ - double *HSMHVQItempPtr; /* pointer to sparse matrix element at (qi_nqs node, temp node) */ - double *HSMHVQBtempPtr; /* pointer to sparse matrix element at (qb_nqs node, temp node) */ - - /* Substrate effect related pointers */ - double *HSMHVDsubPtr; /* pointer to sparse matrix element at (drain node, substrate node) */ - double *HSMHVDPsubPtr; /* pointer to sparse matrix element at (drain prime node, substrate node) */ - double *HSMHVSsubPtr; /* pointer to sparse matrix element at (source node, substrate node) */ - double *HSMHVSPsubPtr; /* pointer to sparse matrix element at (source prime node, substrate node) */ - - - /* common state values in hisim module */ -#define HSMHVvbd HSMHVstates+ 0 -#define HSMHVvbs HSMHVstates+ 1 -#define HSMHVvgs HSMHVstates+ 2 -#define HSMHVvds HSMHVstates+ 3 -#define HSMHVvdbs HSMHVstates+ 4 -#define HSMHVvdbd HSMHVstates+ 5 -#define HSMHVvsbs HSMHVstates+ 6 -#define HSMHVvges HSMHVstates+ 7 -#define HSMHVvsubs HSMHVstates+ 8 /* substrate bias */ -#define HSMHVdeltemp HSMHVstates+ 9 -#define HSMHVvdse HSMHVstates+ 10 -#define HSMHVvgse HSMHVstates+ 11 -#define HSMHVvbse HSMHVstates+ 12 - -#define HSMHVqb HSMHVstates+ 13 -#define HSMHVcqb HSMHVstates+ 14 -#define HSMHVqg HSMHVstates+ 15 -#define HSMHVcqg HSMHVstates+ 16 -#define HSMHVqd HSMHVstates+ 17 -#define HSMHVcqd HSMHVstates+ 18 - -#define HSMHVqbs HSMHVstates+ 19 -#define HSMHVcqbs HSMHVstates+ 20 -#define HSMHVqbd HSMHVstates+ 21 -#define HSMHVcqbd HSMHVstates+ 22 - -#define HSMHVqth HSMHVstates+ 23 -#define HSMHVcqth HSMHVstates+ 24 - -/*add fringing capacitance*/ -#define HSMHVqfd HSMHVstates+ 25 -#define HSMHVcqfd HSMHVstates+ 26 -#define HSMHVqfs HSMHVstates+ 27 -#define HSMHVcqfs HSMHVstates+ 28 - -/*add external drain capacitance*/ -#define HSMHVqdE HSMHVstates+ 29 -#define HSMHVcqdE HSMHVstates+ 30 - -#define HSMHVnumStates 31 - -/* nqs charges */ -#define HSMHVqi_nqs HSMHVstates+ 32 -#define HSMHVdotqi_nqs HSMHVstates + 33 -#define HSMHVqb_nqs HSMHVstates+ 34 -#define HSMHVdotqb_nqs HSMHVstates + 35 - -#define HSMHVnumStatesNqs 36 - -/* indices to the array of HiSIMHV NOISE SOURCES */ -#define HSMHVRDNOIZ 0 -#define HSMHVRSNOIZ 1 -#define HSMHVIDNOIZ 2 -#define HSMHVFLNOIZ 3 -#define HSMHVIGNOIZ 4 -#define HSMHVTOTNOIZ 5 - -#define HSMHVNSRCS 6 /* the number of HiSIMHV MOSFET noise sources */ - -#ifndef NONOISE - double HSMHVnVar[NSTATVARS][HSMHVNSRCS]; -#else /* NONOISE */ - double **HSMHVnVar; -#endif /* NONOISE */ - -} HSMHVinstance ; - - -/* per model data */ - -typedef struct sHSMHVmodel { /* model structure for a resistor */ - - struct GENmodel gen; - -#define HSMHVmodType gen.GENmodType -#define HSMHVnextModel(inst) ((struct sHSMHVmodel *)((inst)->gen.GENnextModel)) -#define HSMHVinstances(inst) ((HSMHVinstance *)((inst)->gen.GENinstances)) -#define HSMHVmodName gen.GENmodName - - int HSMHV_type; /* device type: 1 = nmos, -1 = pmos */ - int HSMHV_level; /* level */ - int HSMHV_info; /* information */ - int HSMHV_noise; /* noise model selecter see hsmhvnoi.c */ - char *HSMHV_version; /* model version */ - int HSMHV_show; /* show physical value 1, 2, ... , 11 */ - - - int HSMHV_corsrd ; - int HSMHV_corg ; - int HSMHV_coiprv ; - int HSMHV_copprv ; - int HSMHV_coadov ; - int HSMHV_coisub ; - int HSMHV_coiigs ; - int HSMHV_cogidl ; - int HSMHV_coovlp ; - int HSMHV_coovlps ; - int HSMHV_coflick ; - int HSMHV_coisti ; - int HSMHV_conqs ; - int HSMHV_corbnet ; - int HSMHV_cothrml; - int HSMHV_coign; /* Induced gate noise */ - int HSMHV_codfm; /* DFM */ - int HSMHV_coqovsm ; - int HSMHV_coselfheat; /* Self-heating model */ - int HSMHV_cosubnode; /* switch tempNode to subNode */ - int HSMHV_cosym; /* Symmetry model for HV */ - int HSMHV_cotemp; - int HSMHV_coldrift; - - - double HSMHV_vmax ; - double HSMHV_vmaxt1 ; - double HSMHV_vmaxt2 ; - double HSMHV_bgtmp1 ; - double HSMHV_bgtmp2 ; - double HSMHV_eg0 ; - double HSMHV_tox ; - double HSMHV_xld ; - double HSMHV_xldld ; - double HSMHV_xwdld ; - double HSMHV_lover ; - double HSMHV_lovers ; - double HSMHV_rdov11 ; - double HSMHV_rdov12 ; - double HSMHV_rdov13 ; - double HSMHV_rdslp1 ; - double HSMHV_rdict1 ; - double HSMHV_rdslp2 ; - double HSMHV_rdict2 ; - double HSMHV_loverld ; - double HSMHV_ldrift1 ; - double HSMHV_ldrift2 ; - double HSMHV_ldrift1s ; - double HSMHV_ldrift2s ; - double HSMHV_subld1 ; - double HSMHV_subld2 ; - double HSMHV_ddltmax ; - double HSMHV_ddltslp ; - double HSMHV_ddltict ; - double HSMHV_vfbover ; - double HSMHV_nover ; - double HSMHV_novers ; - double HSMHV_xwd ; - double HSMHV_xwdc ; - double HSMHV_xl ; - double HSMHV_xw ; - double HSMHV_saref ; - double HSMHV_sbref ; - double HSMHV_ll ; - double HSMHV_lld ; - double HSMHV_lln ; - double HSMHV_wl ; - double HSMHV_wl1 ; - double HSMHV_wl1p ; - double HSMHV_wl2 ; - double HSMHV_wl2p ; - double HSMHV_wld ; - double HSMHV_wln ; - double HSMHV_xqy ; - double HSMHV_xqy1 ; - double HSMHV_xqy2 ; - double HSMHV_rs; /* source contact resistance */ - double HSMHV_rd; /* drain contact resistance */ - double HSMHV_rsh; /* source/drain diffusion sheet resistance */ - double HSMHV_rshg; -/* double HSMHV_ngcon; */ -/* double HSMHV_xgw; */ -/* double HSMHV_xgl; */ -/* double HSMHV_nf; */ - double HSMHV_vfbc ; - double HSMHV_vbi ; - double HSMHV_nsubc ; - double HSMHV_qdftvd ; - double HSMHV_parl2 ; - double HSMHV_lp ; - double HSMHV_nsubp ; - double HSMHV_nsubp0 ; - double HSMHV_nsubwp ; - double HSMHV_scp1 ; - double HSMHV_scp2 ; - double HSMHV_scp3 ; - double HSMHV_sc1 ; - double HSMHV_sc2 ; - double HSMHV_sc3 ; - double HSMHV_sc4 ; - double HSMHV_pgd1 ; - double HSMHV_pgd2 ; - double HSMHV_pgd3 ; - double HSMHV_pgd4 ; - double HSMHV_ndep ; - double HSMHV_ndepl ; - double HSMHV_ndeplp ; - double HSMHV_ninv ; - double HSMHV_ninvd ; - double HSMHV_ninvdw ; - double HSMHV_ninvdwp ; - double HSMHV_ninvdt1 ; - double HSMHV_ninvdt2 ; - double HSMHV_muecb0 ; - double HSMHV_muecb1 ; - double HSMHV_mueph1 ; - double HSMHV_mueph0 ; - double HSMHV_muephw ; - double HSMHV_muepwp ; - double HSMHV_muephl ; - double HSMHV_mueplp ; - double HSMHV_muephs ; - double HSMHV_muepsp ; - double HSMHV_vtmp ; - double HSMHV_wvth0 ; - double HSMHV_muesr1 ; - double HSMHV_muesr0 ; - double HSMHV_muesrw ; - double HSMHV_mueswp ; - double HSMHV_muesrl ; - double HSMHV_mueslp ; - double HSMHV_bb ; - double HSMHV_sub1 ; - double HSMHV_sub2 ; - double HSMHV_svgs ; - double HSMHV_svbs ; - double HSMHV_svbsl ; - double HSMHV_svds ; - double HSMHV_slg ; - double HSMHV_sub1l ; - double HSMHV_sub2l ; - double HSMHV_fn1 ; - double HSMHV_fn2 ; - double HSMHV_fn3 ; - double HSMHV_fvbs ; - double HSMHV_svgsl ; - double HSMHV_svgslp ; - double HSMHV_svgswp ; - double HSMHV_svgsw ; - double HSMHV_svbslp ; - double HSMHV_slgl ; - double HSMHV_slglp ; - double HSMHV_sub1lp ; - double HSMHV_nsti ; - double HSMHV_wsti ; - double HSMHV_wstil ; - double HSMHV_wstilp ; - double HSMHV_wstiw ; - double HSMHV_wstiwp ; - double HSMHV_scsti1 ; - double HSMHV_scsti2 ; - double HSMHV_vthsti ; - double HSMHV_vdsti ; - double HSMHV_muesti1 ; - double HSMHV_muesti2 ; - double HSMHV_muesti3 ; - double HSMHV_nsubpsti1 ; - double HSMHV_nsubpsti2 ; - double HSMHV_nsubpsti3 ; - double HSMHV_lpext ; - double HSMHV_npext ; - double HSMHV_scp22 ; - double HSMHV_scp21 ; - double HSMHV_bs1 ; - double HSMHV_bs2 ; - double HSMHV_cgso ; - double HSMHV_cgdo ; - double HSMHV_cgbo ; - double HSMHV_tpoly ; - double HSMHV_js0 ; - double HSMHV_js0sw ; - double HSMHV_nj ; - double HSMHV_njsw ; - double HSMHV_xti ; - double HSMHV_cj ; - double HSMHV_cjsw ; - double HSMHV_cjswg ; - double HSMHV_mj ; - double HSMHV_mjsw ; - double HSMHV_mjswg ; - double HSMHV_xti2 ; - double HSMHV_cisb ; - double HSMHV_cvb ; - double HSMHV_ctemp ; - double HSMHV_cisbk ; - double HSMHV_cvbk ; - double HSMHV_divx ; - double HSMHV_pb ; - double HSMHV_pbsw ; - double HSMHV_pbswg ; - double HSMHV_clm1 ; - double HSMHV_clm2 ; - double HSMHV_clm3 ; - double HSMHV_clm5 ; - double HSMHV_clm6 ; - double HSMHV_muetmp ; - double HSMHV_vover ; - double HSMHV_voverp ; - double HSMHV_vovers ; - double HSMHV_voversp ; - double HSMHV_wfc ; - double HSMHV_nsubcw ; - double HSMHV_nsubcwp ; - double HSMHV_qme1 ; - double HSMHV_qme2 ; - double HSMHV_qme3 ; - double HSMHV_gidl1 ; - double HSMHV_gidl2 ; - double HSMHV_gidl3 ; - double HSMHV_gidl4 ; - double HSMHV_gidl5 ; - double HSMHV_gleak1 ; - double HSMHV_gleak2 ; - double HSMHV_gleak3 ; - double HSMHV_gleak4 ; - double HSMHV_gleak5 ; - double HSMHV_gleak6 ; - double HSMHV_gleak7 ; - double HSMHV_glpart1 ; - double HSMHV_glksd1 ; - double HSMHV_glksd2 ; - double HSMHV_glksd3 ; - double HSMHV_glkb1 ; - double HSMHV_glkb2 ; - double HSMHV_glkb3 ; - double HSMHV_egig; - double HSMHV_igtemp2; - double HSMHV_igtemp3; - double HSMHV_vzadd0 ; - double HSMHV_pzadd0 ; - double HSMHV_nftrp ; - double HSMHV_nfalp ; - double HSMHV_cit ; - double HSMHV_falph ; - double HSMHV_kappa ; - double HSMHV_pthrou ; - double HSMHV_vdiffj ; - double HSMHV_dly1 ; - double HSMHV_dly2 ; - double HSMHV_dly3 ; - double HSMHV_dlyov; - double HSMHV_tnom ; - double HSMHV_ovslp ; - double HSMHV_ovmag ; - /* substrate resistances */ - double HSMHV_gbmin; - double HSMHV_rbpb ; - double HSMHV_rbpd ; - double HSMHV_rbps ; - double HSMHV_rbdb ; - double HSMHV_rbsb ; - /* IBPC */ - double HSMHV_ibpc1 ; - double HSMHV_ibpc2 ; - /* DFM */ - double HSMHV_mphdfm ; - - double HSMHV_vbsmin ; - double HSMHV_rdvg11 ; - double HSMHV_rdvg12 ; - double HSMHV_rd20 ; - double HSMHV_qovsm ; - double HSMHV_ldrift ; - double HSMHV_rd21 ; - double HSMHV_rd22 ; - double HSMHV_rd22d ; - double HSMHV_rd23 ; - double HSMHV_rd24 ; - double HSMHV_rd25 ; - double HSMHV_rd26 ; - double HSMHV_rdvdl ; - double HSMHV_rdvdlp ; - double HSMHV_rdvds ; - double HSMHV_rdvdsp ; - double HSMHV_rd23l ; - double HSMHV_rd23lp ; - double HSMHV_rd23s ; - double HSMHV_rd23sp ; - double HSMHV_rds ; - double HSMHV_rdsp ; - - double HSMHV_rdvd ; - double HSMHV_rdvb ; - - double HSMHV_rdvsub ; /* substrate effect */ - double HSMHV_rdvdsub ; /* substrate effect */ - double HSMHV_ddrift ; /* substrate effect */ - double HSMHV_vbisub ; /* substrate effect */ - double HSMHV_nsubsub ; /* substrate effect */ - - double HSMHV_rth0 ; - double HSMHV_cth0 ; - double HSMHV_powrat ; - - double HSMHV_tcjbd ; - double HSMHV_tcjbs ; - double HSMHV_tcjbdsw ; - double HSMHV_tcjbssw ; - double HSMHV_tcjbdswg ; - double HSMHV_tcjbsswg ; - - - double HSMHV_rdtemp1 ; - double HSMHV_rdtemp2 ; - double HSMHV_rth0r ; /* heat radiation for SHE */ - double HSMHV_rdvdtemp1 ; - double HSMHV_rdvdtemp2 ; - double HSMHV_rth0w ; - double HSMHV_rth0wp ; - double HSMHV_rth0nf ; - - double HSMHV_rthtemp1 ; - double HSMHV_rthtemp2 ; - double HSMHV_prattemp1 ; - double HSMHV_prattemp2 ; - - - double HSMHV_cvdsover ; - double HSMHV_shemax; - - /* binning parameters */ - double HSMHV_lmin ; - double HSMHV_lmax ; - double HSMHV_wmin ; - double HSMHV_wmax ; - double HSMHV_lbinn ; - double HSMHV_wbinn ; - - /* Length dependence */ - double HSMHV_lvmax ; - double HSMHV_lbgtmp1 ; - double HSMHV_lbgtmp2 ; - double HSMHV_leg0 ; - double HSMHV_lvfbover ; - double HSMHV_lnover ; - double HSMHV_lnovers ; - double HSMHV_lwl2 ; - double HSMHV_lvfbc ; - double HSMHV_lnsubc ; - double HSMHV_lnsubp ; - double HSMHV_lscp1 ; - double HSMHV_lscp2 ; - double HSMHV_lscp3 ; - double HSMHV_lsc1 ; - double HSMHV_lsc2 ; - double HSMHV_lsc3 ; - double HSMHV_lpgd1 ; - double HSMHV_lpgd3 ; - double HSMHV_lndep ; - double HSMHV_lninv ; - double HSMHV_lmuecb0 ; - double HSMHV_lmuecb1 ; - double HSMHV_lmueph1 ; - double HSMHV_lvtmp ; - double HSMHV_lwvth0 ; - double HSMHV_lmuesr1 ; - double HSMHV_lmuetmp ; - double HSMHV_lsub1 ; - double HSMHV_lsub2 ; - double HSMHV_lsvds ; - double HSMHV_lsvbs ; - double HSMHV_lsvgs ; - double HSMHV_lfn1 ; - double HSMHV_lfn2 ; - double HSMHV_lfn3 ; - double HSMHV_lfvbs ; - double HSMHV_lnsti ; - double HSMHV_lwsti ; - double HSMHV_lscsti1 ; - double HSMHV_lscsti2 ; - double HSMHV_lvthsti ; - double HSMHV_lmuesti1 ; - double HSMHV_lmuesti2 ; - double HSMHV_lmuesti3 ; - double HSMHV_lnsubpsti1 ; - double HSMHV_lnsubpsti2 ; - double HSMHV_lnsubpsti3 ; - double HSMHV_lcgso ; - double HSMHV_lcgdo ; - double HSMHV_ljs0 ; - double HSMHV_ljs0sw ; - double HSMHV_lnj ; - double HSMHV_lcisbk ; - double HSMHV_lclm1 ; - double HSMHV_lclm2 ; - double HSMHV_lclm3 ; - double HSMHV_lwfc ; - double HSMHV_lgidl1 ; - double HSMHV_lgidl2 ; - double HSMHV_lgleak1 ; - double HSMHV_lgleak2 ; - double HSMHV_lgleak3 ; - double HSMHV_lgleak6 ; - double HSMHV_lglksd1 ; - double HSMHV_lglksd2 ; - double HSMHV_lglkb1 ; - double HSMHV_lglkb2 ; - double HSMHV_lnftrp ; - double HSMHV_lnfalp ; - double HSMHV_lpthrou ; - double HSMHV_lvdiffj ; - double HSMHV_libpc1 ; - double HSMHV_libpc2 ; - double HSMHV_lcgbo ; - double HSMHV_lcvdsover ; - double HSMHV_lfalph ; - double HSMHV_lnpext ; - double HSMHV_lpowrat ; - double HSMHV_lrd ; - double HSMHV_lrd22 ; - double HSMHV_lrd23 ; - double HSMHV_lrd24 ; - double HSMHV_lrdict1 ; - double HSMHV_lrdov13 ; - double HSMHV_lrdslp1 ; - double HSMHV_lrdvb ; - double HSMHV_lrdvd ; - double HSMHV_lrdvg11 ; - double HSMHV_lrs ; - double HSMHV_lrth0 ; - double HSMHV_lvover ; - - /* Width dependence */ - double HSMHV_wvmax ; - double HSMHV_wbgtmp1 ; - double HSMHV_wbgtmp2 ; - double HSMHV_weg0 ; - double HSMHV_wvfbover ; - double HSMHV_wnover ; - double HSMHV_wnovers ; - double HSMHV_wwl2 ; - double HSMHV_wvfbc ; - double HSMHV_wnsubc ; - double HSMHV_wnsubp ; - double HSMHV_wscp1 ; - double HSMHV_wscp2 ; - double HSMHV_wscp3 ; - double HSMHV_wsc1 ; - double HSMHV_wsc2 ; - double HSMHV_wsc3 ; - double HSMHV_wpgd1 ; - double HSMHV_wpgd3 ; - double HSMHV_wndep ; - double HSMHV_wninv ; - double HSMHV_wmuecb0 ; - double HSMHV_wmuecb1 ; - double HSMHV_wmueph1 ; - double HSMHV_wvtmp ; - double HSMHV_wwvth0 ; - double HSMHV_wmuesr1 ; - double HSMHV_wmuetmp ; - double HSMHV_wsub1 ; - double HSMHV_wsub2 ; - double HSMHV_wsvds ; - double HSMHV_wsvbs ; - double HSMHV_wsvgs ; - double HSMHV_wfn1 ; - double HSMHV_wfn2 ; - double HSMHV_wfn3 ; - double HSMHV_wfvbs ; - double HSMHV_wnsti ; - double HSMHV_wwsti ; - double HSMHV_wscsti1 ; - double HSMHV_wscsti2 ; - double HSMHV_wvthsti ; - double HSMHV_wmuesti1 ; - double HSMHV_wmuesti2 ; - double HSMHV_wmuesti3 ; - double HSMHV_wnsubpsti1 ; - double HSMHV_wnsubpsti2 ; - double HSMHV_wnsubpsti3 ; - double HSMHV_wcgso ; - double HSMHV_wcgdo ; - double HSMHV_wjs0 ; - double HSMHV_wjs0sw ; - double HSMHV_wnj ; - double HSMHV_wcisbk ; - double HSMHV_wclm1 ; - double HSMHV_wclm2 ; - double HSMHV_wclm3 ; - double HSMHV_wwfc ; - double HSMHV_wgidl1 ; - double HSMHV_wgidl2 ; - double HSMHV_wgleak1 ; - double HSMHV_wgleak2 ; - double HSMHV_wgleak3 ; - double HSMHV_wgleak6 ; - double HSMHV_wglksd1 ; - double HSMHV_wglksd2 ; - double HSMHV_wglkb1 ; - double HSMHV_wglkb2 ; - double HSMHV_wnftrp ; - double HSMHV_wnfalp ; - double HSMHV_wpthrou ; - double HSMHV_wvdiffj ; - double HSMHV_wibpc1 ; - double HSMHV_wibpc2 ; - double HSMHV_wcgbo ; - double HSMHV_wcvdsover ; - double HSMHV_wfalph ; - double HSMHV_wnpext ; - double HSMHV_wpowrat ; - double HSMHV_wrd ; - double HSMHV_wrd22 ; - double HSMHV_wrd23 ; - double HSMHV_wrd24 ; - double HSMHV_wrdict1 ; - double HSMHV_wrdov13 ; - double HSMHV_wrdslp1 ; - double HSMHV_wrdvb ; - double HSMHV_wrdvd ; - double HSMHV_wrdvg11 ; - double HSMHV_wrs ; - double HSMHV_wrth0 ; - double HSMHV_wvover ; - - /* Cross-term dependence */ - double HSMHV_pvmax ; - double HSMHV_pbgtmp1 ; - double HSMHV_pbgtmp2 ; - double HSMHV_peg0 ; - double HSMHV_pvfbover ; - double HSMHV_pnover ; - double HSMHV_pnovers ; - double HSMHV_pwl2 ; - double HSMHV_pvfbc ; - double HSMHV_pnsubc ; - double HSMHV_pnsubp ; - double HSMHV_pscp1 ; - double HSMHV_pscp2 ; - double HSMHV_pscp3 ; - double HSMHV_psc1 ; - double HSMHV_psc2 ; - double HSMHV_psc3 ; - double HSMHV_ppgd1 ; - double HSMHV_ppgd3 ; - double HSMHV_pndep ; - double HSMHV_pninv ; - double HSMHV_pmuecb0 ; - double HSMHV_pmuecb1 ; - double HSMHV_pmueph1 ; - double HSMHV_pvtmp ; - double HSMHV_pwvth0 ; - double HSMHV_pmuesr1 ; - double HSMHV_pmuetmp ; - double HSMHV_psub1 ; - double HSMHV_psub2 ; - double HSMHV_psvds ; - double HSMHV_psvbs ; - double HSMHV_psvgs ; - double HSMHV_pfn1 ; - double HSMHV_pfn2 ; - double HSMHV_pfn3 ; - double HSMHV_pfvbs ; - double HSMHV_pnsti ; - double HSMHV_pwsti ; - double HSMHV_pscsti1 ; - double HSMHV_pscsti2 ; - double HSMHV_pvthsti ; - double HSMHV_pmuesti1 ; - double HSMHV_pmuesti2 ; - double HSMHV_pmuesti3 ; - double HSMHV_pnsubpsti1 ; - double HSMHV_pnsubpsti2 ; - double HSMHV_pnsubpsti3 ; - double HSMHV_pcgso ; - double HSMHV_pcgdo ; - double HSMHV_pjs0 ; - double HSMHV_pjs0sw ; - double HSMHV_pnj ; - double HSMHV_pcisbk ; - double HSMHV_pclm1 ; - double HSMHV_pclm2 ; - double HSMHV_pclm3 ; - double HSMHV_pwfc ; - double HSMHV_pgidl1 ; - double HSMHV_pgidl2 ; - double HSMHV_pgleak1 ; - double HSMHV_pgleak2 ; - double HSMHV_pgleak3 ; - double HSMHV_pgleak6 ; - double HSMHV_pglksd1 ; - double HSMHV_pglksd2 ; - double HSMHV_pglkb1 ; - double HSMHV_pglkb2 ; - double HSMHV_pnftrp ; - double HSMHV_pnfalp ; - double HSMHV_ppthrou ; - double HSMHV_pvdiffj ; - double HSMHV_pibpc1 ; - double HSMHV_pibpc2 ; - double HSMHV_pcgbo ; - double HSMHV_pcvdsover ; - double HSMHV_pfalph ; - double HSMHV_pnpext ; - double HSMHV_ppowrat ; - double HSMHV_prd ; - double HSMHV_prd22 ; - double HSMHV_prd23 ; - double HSMHV_prd24 ; - double HSMHV_prdict1 ; - double HSMHV_prdov13 ; - double HSMHV_prdslp1 ; - double HSMHV_prdvb ; - double HSMHV_prdvd ; - double HSMHV_prdvg11 ; - double HSMHV_prs ; - double HSMHV_prth0 ; - double HSMHV_pvover ; - - /* internal variables */ - double HSMHV_vcrit ; - int HSMHV_flg_qme ; - double HSMHV_qme12 ; - double HSMHV_ktnom ; - - double HSMHVvgsMax; - double HSMHVvgdMax; - double HSMHVvgbMax; - double HSMHVvdsMax; - double HSMHVvbsMax; - double HSMHVvbdMax; - double HSMHVvgsrMax; - double HSMHVvgdrMax; - double HSMHVvgbrMax; - double HSMHVvbsrMax; - double HSMHVvbdrMax; - - HSMHVmodelMKSParam modelMKS ; /* unit-converted parameters */ - - - /* flag for model */ - unsigned HSMHV_type_Given :1; - unsigned HSMHV_level_Given :1; - unsigned HSMHV_info_Given :1; - unsigned HSMHV_noise_Given :1; - unsigned HSMHV_version_Given :1; - unsigned HSMHV_show_Given :1; - unsigned HSMHV_corsrd_Given :1; - unsigned HSMHV_corg_Given :1; - unsigned HSMHV_coiprv_Given :1; - unsigned HSMHV_copprv_Given :1; - unsigned HSMHV_coadov_Given :1; - unsigned HSMHV_coisub_Given :1; - unsigned HSMHV_coiigs_Given :1; - unsigned HSMHV_cogidl_Given :1; - unsigned HSMHV_coovlp_Given :1; - unsigned HSMHV_coovlps_Given :1; - unsigned HSMHV_coflick_Given :1; - unsigned HSMHV_coisti_Given :1; - unsigned HSMHV_conqs_Given :1; - unsigned HSMHV_corbnet_Given :1; - unsigned HSMHV_cothrml_Given :1; - unsigned HSMHV_coign_Given :1; /* Induced gate noise */ - unsigned HSMHV_codfm_Given :1; /* DFM */ - unsigned HSMHV_coqovsm_Given :1; - unsigned HSMHV_coselfheat_Given :1; /* Self-heating model */ - unsigned HSMHV_cosubnode_Given :1; /* switch tempNode to subNode */ - unsigned HSMHV_cosym_Given :1; /* Symmetry model for HV */ - unsigned HSMHV_cotemp_Given :1; - unsigned HSMHV_coldrift_Given :1; - unsigned HSMHV_kappa_Given :1; - unsigned HSMHV_pthrou_Given :1; - unsigned HSMHV_vdiffj_Given :1; - unsigned HSMHV_vmax_Given :1; - unsigned HSMHV_vmaxt1_Given :1; - unsigned HSMHV_vmaxt2_Given :1; - unsigned HSMHV_bgtmp1_Given :1; - unsigned HSMHV_bgtmp2_Given :1; - unsigned HSMHV_eg0_Given :1; - unsigned HSMHV_tox_Given :1; - unsigned HSMHV_xld_Given :1; - unsigned HSMHV_xldld_Given :1; - unsigned HSMHV_xwdld_Given :1; - unsigned HSMHV_lover_Given :1; - unsigned HSMHV_lovers_Given :1; - unsigned HSMHV_rdov11_Given :1; - unsigned HSMHV_rdov12_Given :1; - unsigned HSMHV_rdov13_Given :1; - unsigned HSMHV_rdslp1_Given :1; - unsigned HSMHV_rdict1_Given :1; - unsigned HSMHV_rdslp2_Given :1; - unsigned HSMHV_rdict2_Given :1; - unsigned HSMHV_loverld_Given :1; - unsigned HSMHV_ldrift1_Given :1; - unsigned HSMHV_ldrift2_Given :1; - unsigned HSMHV_ldrift1s_Given :1; - unsigned HSMHV_ldrift2s_Given :1; - unsigned HSMHV_subld1_Given :1; - unsigned HSMHV_subld2_Given :1; - unsigned HSMHV_ddltmax_Given :1; - unsigned HSMHV_ddltslp_Given :1; - unsigned HSMHV_ddltict_Given :1; - unsigned HSMHV_vfbover_Given :1; - unsigned HSMHV_nover_Given :1; - unsigned HSMHV_novers_Given :1; - unsigned HSMHV_xwd_Given :1; - unsigned HSMHV_xwdc_Given :1; - unsigned HSMHV_xl_Given :1; - unsigned HSMHV_xw_Given :1; - unsigned HSMHV_saref_Given :1; - unsigned HSMHV_sbref_Given :1; - unsigned HSMHV_ll_Given :1; - unsigned HSMHV_lld_Given :1; - unsigned HSMHV_lln_Given :1; - unsigned HSMHV_wl_Given :1; - unsigned HSMHV_wl1_Given :1; - unsigned HSMHV_wl1p_Given :1; - unsigned HSMHV_wl2_Given :1; - unsigned HSMHV_wl2p_Given :1; - unsigned HSMHV_wld_Given :1; - unsigned HSMHV_wln_Given :1; - unsigned HSMHV_xqy_Given :1; - unsigned HSMHV_xqy1_Given :1; - unsigned HSMHV_xqy2_Given :1; - unsigned HSMHV_rs_Given :1; - unsigned HSMHV_rd_Given :1; - unsigned HSMHV_rsh_Given :1; - unsigned HSMHV_rshg_Given :1; -/* unsigned HSMHV_ngcon_Given :1; */ -/* unsigned HSMHV_xgw_Given :1; */ -/* unsigned HSMHV_xgl_Given :1; */ -/* unsigned HSMHV_nf_Given :1; */ - unsigned HSMHV_vfbc_Given :1; - unsigned HSMHV_vbi_Given :1; - unsigned HSMHV_nsubc_Given :1; - unsigned HSMHV_parl2_Given :1; - unsigned HSMHV_lp_Given :1; - unsigned HSMHV_nsubp_Given :1; - unsigned HSMHV_nsubp0_Given :1; - unsigned HSMHV_nsubwp_Given :1; - unsigned HSMHV_scp1_Given :1; - unsigned HSMHV_scp2_Given :1; - unsigned HSMHV_scp3_Given :1; - unsigned HSMHV_sc1_Given :1; - unsigned HSMHV_sc2_Given :1; - unsigned HSMHV_sc3_Given :1; - unsigned HSMHV_sc4_Given :1; - unsigned HSMHV_pgd1_Given :1; - unsigned HSMHV_pgd2_Given :1; - unsigned HSMHV_pgd3_Given :1; - unsigned HSMHV_pgd4_Given :1; - unsigned HSMHV_ndep_Given :1; - unsigned HSMHV_ndepl_Given :1; - unsigned HSMHV_ndeplp_Given :1; - unsigned HSMHV_ninv_Given :1; - unsigned HSMHV_muecb0_Given :1; - unsigned HSMHV_muecb1_Given :1; - unsigned HSMHV_mueph1_Given :1; - unsigned HSMHV_mueph0_Given :1; - unsigned HSMHV_muephw_Given :1; - unsigned HSMHV_muepwp_Given :1; - unsigned HSMHV_muephl_Given :1; - unsigned HSMHV_mueplp_Given :1; - unsigned HSMHV_muephs_Given :1; - unsigned HSMHV_muepsp_Given :1; - unsigned HSMHV_vtmp_Given :1; - unsigned HSMHV_wvth0_Given :1; - unsigned HSMHV_muesr1_Given :1; - unsigned HSMHV_muesr0_Given :1; - unsigned HSMHV_muesrl_Given :1; - unsigned HSMHV_mueslp_Given :1; - unsigned HSMHV_muesrw_Given :1; - unsigned HSMHV_mueswp_Given :1; - unsigned HSMHV_bb_Given :1; - unsigned HSMHV_sub1_Given :1; - unsigned HSMHV_sub2_Given :1; - unsigned HSMHV_svgs_Given :1; - unsigned HSMHV_svbs_Given :1; - unsigned HSMHV_svbsl_Given :1; - unsigned HSMHV_svds_Given :1; - unsigned HSMHV_slg_Given :1; - unsigned HSMHV_sub1l_Given :1; - unsigned HSMHV_sub2l_Given :1; - unsigned HSMHV_fn1_Given :1; - unsigned HSMHV_fn2_Given :1; - unsigned HSMHV_fn3_Given :1; - unsigned HSMHV_fvbs_Given :1; - unsigned HSMHV_svgsl_Given :1; - unsigned HSMHV_svgslp_Given :1; - unsigned HSMHV_svgswp_Given :1; - unsigned HSMHV_svgsw_Given :1; - unsigned HSMHV_svbslp_Given :1; - unsigned HSMHV_slgl_Given :1; - unsigned HSMHV_slglp_Given :1; - unsigned HSMHV_sub1lp_Given :1; - unsigned HSMHV_nsti_Given :1; - unsigned HSMHV_wsti_Given :1; - unsigned HSMHV_wstil_Given :1; - unsigned HSMHV_wstilp_Given :1; - unsigned HSMHV_wstiw_Given :1; - unsigned HSMHV_wstiwp_Given :1; - unsigned HSMHV_scsti1_Given :1; - unsigned HSMHV_scsti2_Given :1; - unsigned HSMHV_vthsti_Given :1; - unsigned HSMHV_vdsti_Given :1; - unsigned HSMHV_muesti1_Given :1; - unsigned HSMHV_muesti2_Given :1; - unsigned HSMHV_muesti3_Given :1; - unsigned HSMHV_nsubpsti1_Given :1; - unsigned HSMHV_nsubpsti2_Given :1; - unsigned HSMHV_nsubpsti3_Given :1; - unsigned HSMHV_lpext_Given :1; - unsigned HSMHV_npext_Given :1; - unsigned HSMHV_scp22_Given :1; - unsigned HSMHV_scp21_Given :1; - unsigned HSMHV_bs1_Given :1; - unsigned HSMHV_bs2_Given :1; - unsigned HSMHV_cgso_Given :1; - unsigned HSMHV_cgdo_Given :1; - unsigned HSMHV_cgbo_Given :1; - unsigned HSMHV_tpoly_Given :1; - unsigned HSMHV_js0_Given :1; - unsigned HSMHV_js0sw_Given :1; - unsigned HSMHV_nj_Given :1; - unsigned HSMHV_njsw_Given :1; - unsigned HSMHV_xti_Given :1; - unsigned HSMHV_cj_Given :1; - unsigned HSMHV_cjsw_Given :1; - unsigned HSMHV_cjswg_Given :1; - unsigned HSMHV_mj_Given :1; - unsigned HSMHV_mjsw_Given :1; - unsigned HSMHV_mjswg_Given :1; - unsigned HSMHV_xti2_Given :1; - unsigned HSMHV_cisb_Given :1; - unsigned HSMHV_cvb_Given :1; - unsigned HSMHV_ctemp_Given :1; - unsigned HSMHV_cisbk_Given :1; - unsigned HSMHV_cvbk_Given :1; - unsigned HSMHV_divx_Given :1; - unsigned HSMHV_pb_Given :1; - unsigned HSMHV_pbsw_Given :1; - unsigned HSMHV_pbswg_Given :1; - unsigned HSMHV_clm1_Given :1; - unsigned HSMHV_clm2_Given :1; - unsigned HSMHV_clm3_Given :1; - unsigned HSMHV_clm5_Given :1; - unsigned HSMHV_clm6_Given :1; - unsigned HSMHV_muetmp_Given :1; - unsigned HSMHV_vover_Given :1; - unsigned HSMHV_voverp_Given :1; - unsigned HSMHV_vovers_Given :1; - unsigned HSMHV_voversp_Given :1; - unsigned HSMHV_wfc_Given :1; - unsigned HSMHV_nsubcw_Given :1; - unsigned HSMHV_nsubcwp_Given :1; - unsigned HSMHV_qme1_Given :1; - unsigned HSMHV_qme2_Given :1; - unsigned HSMHV_qme3_Given :1; - unsigned HSMHV_gidl1_Given :1; - unsigned HSMHV_gidl2_Given :1; - unsigned HSMHV_gidl3_Given :1; - unsigned HSMHV_gidl4_Given :1; - unsigned HSMHV_gidl5_Given :1; - unsigned HSMHV_gleak1_Given :1; - unsigned HSMHV_gleak2_Given :1; - unsigned HSMHV_gleak3_Given :1; - unsigned HSMHV_gleak4_Given :1; - unsigned HSMHV_gleak5_Given :1; - unsigned HSMHV_gleak6_Given :1; - unsigned HSMHV_gleak7_Given :1; - unsigned HSMHV_glpart1_Given :1; - unsigned HSMHV_glksd1_Given :1; - unsigned HSMHV_glksd2_Given :1; - unsigned HSMHV_glksd3_Given :1; - unsigned HSMHV_glkb1_Given :1; - unsigned HSMHV_glkb2_Given :1; - unsigned HSMHV_glkb3_Given :1; - unsigned HSMHV_egig_Given :1; - unsigned HSMHV_igtemp2_Given :1; - unsigned HSMHV_igtemp3_Given :1; - unsigned HSMHV_vzadd0_Given :1; - unsigned HSMHV_pzadd0_Given :1; - unsigned HSMHV_nftrp_Given :1; - unsigned HSMHV_nfalp_Given :1; - unsigned HSMHV_cit_Given :1; - unsigned HSMHV_falph_Given :1; - unsigned HSMHV_dly1_Given :1; - unsigned HSMHV_dly2_Given :1; - unsigned HSMHV_dly3_Given :1; - unsigned HSMHV_dlyov_Given :1; - unsigned HSMHV_tnom_Given :1; - unsigned HSMHV_ovslp_Given :1; - unsigned HSMHV_ovmag_Given :1; - unsigned HSMHV_gbmin_Given :1; - unsigned HSMHV_rbpb_Given :1; - unsigned HSMHV_rbpd_Given :1; - unsigned HSMHV_rbps_Given :1; - unsigned HSMHV_rbdb_Given :1; - unsigned HSMHV_rbsb_Given :1; - unsigned HSMHV_ibpc1_Given :1; - unsigned HSMHV_ibpc2_Given :1; - unsigned HSMHV_mphdfm_Given :1; - unsigned HSMHV_rdvg11_Given :1; - unsigned HSMHV_rdvg12_Given :1; - unsigned HSMHV_qovsm_Given :1; - unsigned HSMHV_ldrift_Given :1; - unsigned HSMHV_rd20_Given :1; - unsigned HSMHV_rd21_Given :1; - unsigned HSMHV_rd22_Given :1; - unsigned HSMHV_rd22d_Given :1; - unsigned HSMHV_rd23_Given :1; - unsigned HSMHV_rd24_Given :1; - unsigned HSMHV_rd25_Given :1; - unsigned HSMHV_rd26_Given :1; - unsigned HSMHV_rdvdl_Given :1; - unsigned HSMHV_rdvdlp_Given :1; - unsigned HSMHV_rdvds_Given :1; - unsigned HSMHV_rdvdsp_Given :1; - unsigned HSMHV_rd23l_Given :1; - unsigned HSMHV_rd23lp_Given :1; - unsigned HSMHV_rd23s_Given :1; - unsigned HSMHV_rd23sp_Given :1; - unsigned HSMHV_rds_Given :1; - unsigned HSMHV_rdsp_Given :1; - unsigned HSMHV_vbsmin_Given :1; - unsigned HSMHV_ninvd_Given :1; - unsigned HSMHV_ninvdw_Given :1; - unsigned HSMHV_ninvdwp_Given :1; - unsigned HSMHV_ninvdt1_Given :1; - unsigned HSMHV_ninvdt2_Given :1; - unsigned HSMHV_rdvb_Given :1; - unsigned HSMHV_rth0nf_Given :1; - - unsigned HSMHV_rthtemp1_Given :1; - unsigned HSMHV_rthtemp2_Given :1; - unsigned HSMHV_prattemp1_Given :1; - unsigned HSMHV_prattemp2_Given :1; - - - unsigned HSMHV_rth0_Given :1; - unsigned HSMHV_cth0_Given :1; - unsigned HSMHV_powrat_Given :1; - - - unsigned HSMHV_tcjbd_Given :1; - unsigned HSMHV_tcjbs_Given :1; - unsigned HSMHV_tcjbdsw_Given :1; - unsigned HSMHV_tcjbssw_Given :1; - unsigned HSMHV_tcjbdswg_Given :1; - unsigned HSMHV_tcjbsswg_Given :1; - - -/* unsigned HSMHV_wth0_Given :1; */ - unsigned HSMHV_qdftvd_Given :1; - unsigned HSMHV_rdvd_Given :1; - unsigned HSMHV_rdtemp1_Given :1; - unsigned HSMHV_rdtemp2_Given :1; - unsigned HSMHV_rth0r_Given :1; - unsigned HSMHV_rdvdtemp1_Given :1; - unsigned HSMHV_rdvdtemp2_Given :1; - unsigned HSMHV_rth0w_Given :1; - unsigned HSMHV_rth0wp_Given :1; - - unsigned HSMHV_cvdsover_Given :1; - - /* substrate effect */ - unsigned HSMHV_rdvsub_Given :1; /* substrate effect */ - unsigned HSMHV_rdvdsub_Given :1; /* substrate effect */ - unsigned HSMHV_ddrift_Given :1; /* substrate effect */ - unsigned HSMHV_vbisub_Given :1; /* substrate effect */ - unsigned HSMHV_nsubsub_Given :1; /* substrate effect */ - unsigned HSMHV_shemax_Given :1; - - /* binning parameters */ - unsigned HSMHV_lmin_Given :1; - unsigned HSMHV_lmax_Given :1; - unsigned HSMHV_wmin_Given :1; - unsigned HSMHV_wmax_Given :1; - unsigned HSMHV_lbinn_Given :1; - unsigned HSMHV_wbinn_Given :1; - - /* Length dependence */ - unsigned HSMHV_lvmax_Given :1; - unsigned HSMHV_lbgtmp1_Given :1; - unsigned HSMHV_lbgtmp2_Given :1; - unsigned HSMHV_leg0_Given :1; - unsigned HSMHV_lvfbover_Given :1; - unsigned HSMHV_lnover_Given :1; - unsigned HSMHV_lnovers_Given :1; - unsigned HSMHV_lwl2_Given :1; - unsigned HSMHV_lvfbc_Given :1; - unsigned HSMHV_lnsubc_Given :1; - unsigned HSMHV_lnsubp_Given :1; - unsigned HSMHV_lscp1_Given :1; - unsigned HSMHV_lscp2_Given :1; - unsigned HSMHV_lscp3_Given :1; - unsigned HSMHV_lsc1_Given :1; - unsigned HSMHV_lsc2_Given :1; - unsigned HSMHV_lsc3_Given :1; - unsigned HSMHV_lpgd1_Given :1; - unsigned HSMHV_lpgd3_Given :1; - unsigned HSMHV_lndep_Given :1; - unsigned HSMHV_lninv_Given :1; - unsigned HSMHV_lmuecb0_Given :1; - unsigned HSMHV_lmuecb1_Given :1; - unsigned HSMHV_lmueph1_Given :1; - unsigned HSMHV_lvtmp_Given :1; - unsigned HSMHV_lwvth0_Given :1; - unsigned HSMHV_lmuesr1_Given :1; - unsigned HSMHV_lmuetmp_Given :1; - unsigned HSMHV_lsub1_Given :1; - unsigned HSMHV_lsub2_Given :1; - unsigned HSMHV_lsvds_Given :1; - unsigned HSMHV_lsvbs_Given :1; - unsigned HSMHV_lsvgs_Given :1; - unsigned HSMHV_lfn1_Given :1; - unsigned HSMHV_lfn2_Given :1; - unsigned HSMHV_lfn3_Given :1; - unsigned HSMHV_lfvbs_Given :1; - unsigned HSMHV_lnsti_Given :1; - unsigned HSMHV_lwsti_Given :1; - unsigned HSMHV_lscsti1_Given :1; - unsigned HSMHV_lscsti2_Given :1; - unsigned HSMHV_lvthsti_Given :1; - unsigned HSMHV_lmuesti1_Given :1; - unsigned HSMHV_lmuesti2_Given :1; - unsigned HSMHV_lmuesti3_Given :1; - unsigned HSMHV_lnsubpsti1_Given :1; - unsigned HSMHV_lnsubpsti2_Given :1; - unsigned HSMHV_lnsubpsti3_Given :1; - unsigned HSMHV_lcgso_Given :1; - unsigned HSMHV_lcgdo_Given :1; - unsigned HSMHV_ljs0_Given :1; - unsigned HSMHV_ljs0sw_Given :1; - unsigned HSMHV_lnj_Given :1; - unsigned HSMHV_lcisbk_Given :1; - unsigned HSMHV_lclm1_Given :1; - unsigned HSMHV_lclm2_Given :1; - unsigned HSMHV_lclm3_Given :1; - unsigned HSMHV_lwfc_Given :1; - unsigned HSMHV_lgidl1_Given :1; - unsigned HSMHV_lgidl2_Given :1; - unsigned HSMHV_lgleak1_Given :1; - unsigned HSMHV_lgleak2_Given :1; - unsigned HSMHV_lgleak3_Given :1; - unsigned HSMHV_lgleak6_Given :1; - unsigned HSMHV_lglksd1_Given :1; - unsigned HSMHV_lglksd2_Given :1; - unsigned HSMHV_lglkb1_Given :1; - unsigned HSMHV_lglkb2_Given :1; - unsigned HSMHV_lnftrp_Given :1; - unsigned HSMHV_lnfalp_Given :1; - unsigned HSMHV_lpthrou_Given :1; - unsigned HSMHV_lvdiffj_Given :1; - unsigned HSMHV_libpc1_Given :1; - unsigned HSMHV_libpc2_Given :1; - unsigned HSMHV_lcgbo_Given :1; - unsigned HSMHV_lcvdsover_Given :1; - unsigned HSMHV_lfalph_Given :1; - unsigned HSMHV_lnpext_Given :1; - unsigned HSMHV_lpowrat_Given :1; - unsigned HSMHV_lrd_Given :1; - unsigned HSMHV_lrd22_Given :1; - unsigned HSMHV_lrd23_Given :1; - unsigned HSMHV_lrd24_Given :1; - unsigned HSMHV_lrdict1_Given :1; - unsigned HSMHV_lrdov13_Given :1; - unsigned HSMHV_lrdslp1_Given :1; - unsigned HSMHV_lrdvb_Given :1; - unsigned HSMHV_lrdvd_Given :1; - unsigned HSMHV_lrdvg11_Given :1; - unsigned HSMHV_lrs_Given :1; - unsigned HSMHV_lrth0_Given :1; - unsigned HSMHV_lvover_Given :1; - - /* Width dependence */ - unsigned HSMHV_wvmax_Given :1; - unsigned HSMHV_wbgtmp1_Given :1; - unsigned HSMHV_wbgtmp2_Given :1; - unsigned HSMHV_weg0_Given :1; - unsigned HSMHV_wvfbover_Given :1; - unsigned HSMHV_wnover_Given :1; - unsigned HSMHV_wnovers_Given :1; - unsigned HSMHV_wwl2_Given :1; - unsigned HSMHV_wvfbc_Given :1; - unsigned HSMHV_wnsubc_Given :1; - unsigned HSMHV_wnsubp_Given :1; - unsigned HSMHV_wscp1_Given :1; - unsigned HSMHV_wscp2_Given :1; - unsigned HSMHV_wscp3_Given :1; - unsigned HSMHV_wsc1_Given :1; - unsigned HSMHV_wsc2_Given :1; - unsigned HSMHV_wsc3_Given :1; - unsigned HSMHV_wpgd1_Given :1; - unsigned HSMHV_wpgd3_Given :1; - unsigned HSMHV_wndep_Given :1; - unsigned HSMHV_wninv_Given :1; - unsigned HSMHV_wmuecb0_Given :1; - unsigned HSMHV_wmuecb1_Given :1; - unsigned HSMHV_wmueph1_Given :1; - unsigned HSMHV_wvtmp_Given :1; - unsigned HSMHV_wwvth0_Given :1; - unsigned HSMHV_wmuesr1_Given :1; - unsigned HSMHV_wmuetmp_Given :1; - unsigned HSMHV_wsub1_Given :1; - unsigned HSMHV_wsub2_Given :1; - unsigned HSMHV_wsvds_Given :1; - unsigned HSMHV_wsvbs_Given :1; - unsigned HSMHV_wsvgs_Given :1; - unsigned HSMHV_wfn1_Given :1; - unsigned HSMHV_wfn2_Given :1; - unsigned HSMHV_wfn3_Given :1; - unsigned HSMHV_wfvbs_Given :1; - unsigned HSMHV_wnsti_Given :1; - unsigned HSMHV_wwsti_Given :1; - unsigned HSMHV_wscsti1_Given :1; - unsigned HSMHV_wscsti2_Given :1; - unsigned HSMHV_wvthsti_Given :1; - unsigned HSMHV_wmuesti1_Given :1; - unsigned HSMHV_wmuesti2_Given :1; - unsigned HSMHV_wmuesti3_Given :1; - unsigned HSMHV_wnsubpsti1_Given :1; - unsigned HSMHV_wnsubpsti2_Given :1; - unsigned HSMHV_wnsubpsti3_Given :1; - unsigned HSMHV_wcgso_Given :1; - unsigned HSMHV_wcgdo_Given :1; - unsigned HSMHV_wjs0_Given :1; - unsigned HSMHV_wjs0sw_Given :1; - unsigned HSMHV_wnj_Given :1; - unsigned HSMHV_wcisbk_Given :1; - unsigned HSMHV_wclm1_Given :1; - unsigned HSMHV_wclm2_Given :1; - unsigned HSMHV_wclm3_Given :1; - unsigned HSMHV_wwfc_Given :1; - unsigned HSMHV_wgidl1_Given :1; - unsigned HSMHV_wgidl2_Given :1; - unsigned HSMHV_wgleak1_Given :1; - unsigned HSMHV_wgleak2_Given :1; - unsigned HSMHV_wgleak3_Given :1; - unsigned HSMHV_wgleak6_Given :1; - unsigned HSMHV_wglksd1_Given :1; - unsigned HSMHV_wglksd2_Given :1; - unsigned HSMHV_wglkb1_Given :1; - unsigned HSMHV_wglkb2_Given :1; - unsigned HSMHV_wnftrp_Given :1; - unsigned HSMHV_wnfalp_Given :1; - unsigned HSMHV_wpthrou_Given :1; - unsigned HSMHV_wvdiffj_Given :1; - unsigned HSMHV_wibpc1_Given :1; - unsigned HSMHV_wibpc2_Given :1; - unsigned HSMHV_wcgbo_Given :1; - unsigned HSMHV_wcvdsover_Given :1; - unsigned HSMHV_wfalph_Given :1; - unsigned HSMHV_wnpext_Given :1; - unsigned HSMHV_wpowrat_Given :1; - unsigned HSMHV_wrd_Given :1; - unsigned HSMHV_wrd22_Given :1; - unsigned HSMHV_wrd23_Given :1; - unsigned HSMHV_wrd24_Given :1; - unsigned HSMHV_wrdict1_Given :1; - unsigned HSMHV_wrdov13_Given :1; - unsigned HSMHV_wrdslp1_Given :1; - unsigned HSMHV_wrdvb_Given :1; - unsigned HSMHV_wrdvd_Given :1; - unsigned HSMHV_wrdvg11_Given :1; - unsigned HSMHV_wrs_Given :1; - unsigned HSMHV_wrth0_Given :1; - unsigned HSMHV_wvover_Given :1; - - /* Cross-term dependence */ - unsigned HSMHV_pvmax_Given :1; - unsigned HSMHV_pbgtmp1_Given :1; - unsigned HSMHV_pbgtmp2_Given :1; - unsigned HSMHV_peg0_Given :1; - unsigned HSMHV_pvfbover_Given :1; - unsigned HSMHV_pnover_Given :1; - unsigned HSMHV_pnovers_Given :1; - unsigned HSMHV_pwl2_Given :1; - unsigned HSMHV_pvfbc_Given :1; - unsigned HSMHV_pnsubc_Given :1; - unsigned HSMHV_pnsubp_Given :1; - unsigned HSMHV_pscp1_Given :1; - unsigned HSMHV_pscp2_Given :1; - unsigned HSMHV_pscp3_Given :1; - unsigned HSMHV_psc1_Given :1; - unsigned HSMHV_psc2_Given :1; - unsigned HSMHV_psc3_Given :1; - unsigned HSMHV_ppgd1_Given :1; - unsigned HSMHV_ppgd3_Given :1; - unsigned HSMHV_pndep_Given :1; - unsigned HSMHV_pninv_Given :1; - unsigned HSMHV_pmuecb0_Given :1; - unsigned HSMHV_pmuecb1_Given :1; - unsigned HSMHV_pmueph1_Given :1; - unsigned HSMHV_pvtmp_Given :1; - unsigned HSMHV_pwvth0_Given :1; - unsigned HSMHV_pmuesr1_Given :1; - unsigned HSMHV_pmuetmp_Given :1; - unsigned HSMHV_psub1_Given :1; - unsigned HSMHV_psub2_Given :1; - unsigned HSMHV_psvds_Given :1; - unsigned HSMHV_psvbs_Given :1; - unsigned HSMHV_psvgs_Given :1; - unsigned HSMHV_pfn1_Given :1; - unsigned HSMHV_pfn2_Given :1; - unsigned HSMHV_pfn3_Given :1; - unsigned HSMHV_pfvbs_Given :1; - unsigned HSMHV_pnsti_Given :1; - unsigned HSMHV_pwsti_Given :1; - unsigned HSMHV_pscsti1_Given :1; - unsigned HSMHV_pscsti2_Given :1; - unsigned HSMHV_pvthsti_Given :1; - unsigned HSMHV_pmuesti1_Given :1; - unsigned HSMHV_pmuesti2_Given :1; - unsigned HSMHV_pmuesti3_Given :1; - unsigned HSMHV_pnsubpsti1_Given :1; - unsigned HSMHV_pnsubpsti2_Given :1; - unsigned HSMHV_pnsubpsti3_Given :1; - unsigned HSMHV_pcgso_Given :1; - unsigned HSMHV_pcgdo_Given :1; - unsigned HSMHV_pjs0_Given :1; - unsigned HSMHV_pjs0sw_Given :1; - unsigned HSMHV_pnj_Given :1; - unsigned HSMHV_pcisbk_Given :1; - unsigned HSMHV_pclm1_Given :1; - unsigned HSMHV_pclm2_Given :1; - unsigned HSMHV_pclm3_Given :1; - unsigned HSMHV_pwfc_Given :1; - unsigned HSMHV_pgidl1_Given :1; - unsigned HSMHV_pgidl2_Given :1; - unsigned HSMHV_pgleak1_Given :1; - unsigned HSMHV_pgleak2_Given :1; - unsigned HSMHV_pgleak3_Given :1; - unsigned HSMHV_pgleak6_Given :1; - unsigned HSMHV_pglksd1_Given :1; - unsigned HSMHV_pglksd2_Given :1; - unsigned HSMHV_pglkb1_Given :1; - unsigned HSMHV_pglkb2_Given :1; - unsigned HSMHV_pnftrp_Given :1; - unsigned HSMHV_pnfalp_Given :1; - unsigned HSMHV_ppthrou_Given :1; - unsigned HSMHV_pvdiffj_Given :1; - unsigned HSMHV_pibpc1_Given :1; - unsigned HSMHV_pibpc2_Given :1; - unsigned HSMHV_pcgbo_Given :1; - unsigned HSMHV_pcvdsover_Given :1; - unsigned HSMHV_pfalph_Given :1; - unsigned HSMHV_pnpext_Given :1; - unsigned HSMHV_ppowrat_Given :1; - unsigned HSMHV_prd_Given :1; - unsigned HSMHV_prd22_Given :1; - unsigned HSMHV_prd23_Given :1; - unsigned HSMHV_prd24_Given :1; - unsigned HSMHV_prdict1_Given :1; - unsigned HSMHV_prdov13_Given :1; - unsigned HSMHV_prdslp1_Given :1; - unsigned HSMHV_prdvb_Given :1; - unsigned HSMHV_prdvd_Given :1; - unsigned HSMHV_prdvg11_Given :1; - unsigned HSMHV_prs_Given :1; - unsigned HSMHV_prth0_Given :1; - unsigned HSMHV_pvover_Given :1; - - unsigned HSMHVvgsMaxGiven :1; - unsigned HSMHVvgdMaxGiven :1; - unsigned HSMHVvgbMaxGiven :1; - unsigned HSMHVvdsMaxGiven :1; - unsigned HSMHVvbsMaxGiven :1; - unsigned HSMHVvbdMaxGiven :1; - unsigned HSMHVvgsrMaxGiven :1; - unsigned HSMHVvgdrMaxGiven :1; - unsigned HSMHVvgbrMaxGiven :1; - unsigned HSMHVvbsrMaxGiven :1; - unsigned HSMHVvbdrMaxGiven :1; - -} HSMHVmodel; - -#ifndef NMOS -#define NMOS 1 -#define PMOS -1 -#endif /*NMOS*/ - -#define HSMHV_BAD_PARAM -1 - -/* flags */ -#define HSMHV_MOD_NMOS 1 -#define HSMHV_MOD_PMOS 2 -#define HSMHV_MOD_LEVEL 3 -#define HSMHV_MOD_INFO 4 -#define HSMHV_MOD_NOISE 5 -#define HSMHV_MOD_VERSION 6 -#define HSMHV_MOD_SHOW 7 -#define HSMHV_MOD_CORSRD 11 -#define HSMHV_MOD_COIPRV 12 -#define HSMHV_MOD_COPPRV 13 -#define HSMHV_MOD_COADOV 17 -#define HSMHV_MOD_COISUB 21 -#define HSMHV_MOD_COIIGS 22 -#define HSMHV_MOD_COGIDL 23 -#define HSMHV_MOD_COOVLP 24 -#define HSMHV_MOD_COOVLPS 8 -#define HSMHV_MOD_COFLICK 25 -#define HSMHV_MOD_COISTI 26 -#define HSMHV_MOD_CONQS 29 -#define HSMHV_MOD_COTHRML 30 -#define HSMHV_MOD_COIGN 31 /* Induced gate noise */ -#define HSMHV_MOD_CORG 32 -#define HSMHV_MOD_CORBNET 33 -#define HSMHV_MOD_CODFM 36 /* DFM */ -#define HSMHV_MOD_COQOVSM 34 -#define HSMHV_MOD_COSELFHEAT 35 /* Self-heating model--SHE-- */ -#define HSMHV_MOD_COSUBNODE 48 -#define HSMHV_MOD_COSYM 37 /* Symmery model for HV */ -#define HSMHV_MOD_COTEMP 38 -#define HSMHV_MOD_COLDRIFT 39 -/* device parameters */ -#define HSMHV_COSELFHEAT 49 -#define HSMHV_COSUBNODE 50 -#define HSMHV_L 51 -#define HSMHV_W 52 -#define HSMHV_AD 53 -#define HSMHV_AS 54 -#define HSMHV_PD 55 -#define HSMHV_PS 56 -#define HSMHV_NRD 57 -#define HSMHV_NRS 58 -/* #define HSMHV_TEMP 59 not used */ -#define HSMHV_DTEMP 60 -#define HSMHV_OFF 61 -#define HSMHV_IC_VBS 62 -#define HSMHV_IC_VDS 63 -#define HSMHV_IC_VGS 64 -#define HSMHV_IC 65 -#define HSMHV_CORBNET 66 -#define HSMHV_RBPB 67 -#define HSMHV_RBPD 68 -#define HSMHV_RBPS 69 -#define HSMHV_RBDB 70 -#define HSMHV_RBSB 71 -#define HSMHV_CORG 72 -/* #define HSMHV_RSHG 73 */ -#define HSMHV_NGCON 74 -#define HSMHV_XGW 75 -#define HSMHV_XGL 76 -#define HSMHV_NF 77 -#define HSMHV_SA 78 -#define HSMHV_SB 79 -#define HSMHV_SD 80 -#define HSMHV_NSUBCDFM 82 -#define HSMHV_M 83 -#define HSMHV_SUBLD1 86 -#define HSMHV_SUBLD2 87 -#define HSMHV_LOVER 41 -#define HSMHV_LOVERS 42 -#define HSMHV_LOVERLD 43 -#define HSMHV_LDRIFT1 88 -#define HSMHV_LDRIFT2 89 -#define HSMHV_LDRIFT1S 90 -#define HSMHV_LDRIFT2S 91 -/* #define HSMHV_RTH0 84 not used */ -/* #define HSMHV_CTH0 85 not used */ - - - - -/* model parameters */ -#define HSMHV_MOD_VBSMIN 198 -#define HSMHV_MOD_VMAX 500 -#define HSMHV_MOD_VMAXT1 503 -#define HSMHV_MOD_VMAXT2 504 -#define HSMHV_MOD_BGTMP1 101 -#define HSMHV_MOD_BGTMP2 102 -#define HSMHV_MOD_EG0 103 -#define HSMHV_MOD_TOX 104 -#define HSMHV_MOD_XLD 105 -#define HSMHV_MOD_LOVER 106 -#define HSMHV_MOD_LOVERS 385 -#define HSMHV_MOD_RDOV11 313 -#define HSMHV_MOD_RDOV12 314 -#define HSMHV_MOD_RDOV13 476 -#define HSMHV_MOD_RDSLP1 315 -#define HSMHV_MOD_RDICT1 316 -#define HSMHV_MOD_RDSLP2 317 -#define HSMHV_MOD_RDICT2 318 -#define HSMHV_MOD_LOVERLD 436 -#define HSMHV_MOD_LDRIFT1 319 -#define HSMHV_MOD_LDRIFT2 320 -#define HSMHV_MOD_LDRIFT1S 324 -#define HSMHV_MOD_LDRIFT2S 325 -#define HSMHV_MOD_SUBLD1 321 -#define HSMHV_MOD_SUBLD2 322 -#define HSMHV_MOD_DDLTMAX 421 /* Vdseff */ -#define HSMHV_MOD_DDLTSLP 422 /* Vdseff */ -#define HSMHV_MOD_DDLTICT 423 /* Vdseff */ -#define HSMHV_MOD_VFBOVER 428 -#define HSMHV_MOD_NOVER 430 -#define HSMHV_MOD_NOVERS 431 -#define HSMHV_MOD_XWD 107 -#define HSMHV_MOD_XWDC 513 -#define HSMHV_MOD_XL 112 -#define HSMHV_MOD_XW 117 -#define HSMHV_MOD_SAREF 433 -#define HSMHV_MOD_SBREF 434 -#define HSMHV_MOD_LL 108 -#define HSMHV_MOD_LLD 109 -#define HSMHV_MOD_LLN 110 -#define HSMHV_MOD_WL 111 -#define HSMHV_MOD_WL1 113 -#define HSMHV_MOD_WL1P 114 -#define HSMHV_MOD_WL2 407 -#define HSMHV_MOD_WL2P 408 -#define HSMHV_MOD_WLD 115 -#define HSMHV_MOD_WLN 116 - -#define HSMHV_MOD_XQY 178 -#define HSMHV_MOD_XQY1 118 -#define HSMHV_MOD_XQY2 120 -#define HSMHV_MOD_RSH 119 - -#define HSMHV_MOD_RSHG 384 -/* #define HSMHV_MOD_NGCON 385 */ -/* #define HSMHV_MOD_XGW 386 */ -/* #define HSMHV_MOD_XGL 387 */ -/* #define HSMHV_MOD_NF 388 */ -#define HSMHV_MOD_RS 398 -#define HSMHV_MOD_RD 399 - -#define HSMHV_MOD_VFBC 121 -#define HSMHV_MOD_VBI 122 -#define HSMHV_MOD_NSUBC 123 -#define HSMHV_MOD_TNOM 124 -#define HSMHV_MOD_PARL2 125 -#define HSMHV_MOD_SC1 126 -#define HSMHV_MOD_SC2 127 -#define HSMHV_MOD_SC3 128 -#define HSMHV_MOD_SC4 248 -#define HSMHV_MOD_NDEP 129 -#define HSMHV_MOD_NDEPL 419 -#define HSMHV_MOD_NDEPLP 420 -#define HSMHV_MOD_NINV 130 -#define HSMHV_MOD_NINVD 505 -#define HSMHV_MOD_NINVDW 506 -#define HSMHV_MOD_NINVDWP 507 -#define HSMHV_MOD_NINVDT1 508 -#define HSMHV_MOD_NINVDT2 509 -#define HSMHV_MOD_MUECB0 131 -#define HSMHV_MOD_MUECB1 132 -#define HSMHV_MOD_MUEPH1 133 -#define HSMHV_MOD_MUEPH0 134 -#define HSMHV_MOD_MUEPHW 135 -#define HSMHV_MOD_MUEPWP 136 -#define HSMHV_MOD_MUEPHL 137 -#define HSMHV_MOD_MUEPLP 138 -#define HSMHV_MOD_MUEPHS 139 -#define HSMHV_MOD_MUEPSP 140 -#define HSMHV_MOD_VTMP 141 -#define HSMHV_MOD_WVTH0 142 -#define HSMHV_MOD_MUESR1 143 -#define HSMHV_MOD_MUESR0 144 -#define HSMHV_MOD_MUESRL 145 -#define HSMHV_MOD_MUESLP 146 -#define HSMHV_MOD_MUESRW 147 -#define HSMHV_MOD_MUESWP 148 -#define HSMHV_MOD_BB 149 - -#define HSMHV_MOD_SUB1 151 -#define HSMHV_MOD_SUB2 152 -#define HSMHV_MOD_CGSO 154 -#define HSMHV_MOD_CGDO 155 -#define HSMHV_MOD_CGBO 156 -#define HSMHV_MOD_JS0 157 -#define HSMHV_MOD_JS0SW 158 -#define HSMHV_MOD_NJ 159 -#define HSMHV_MOD_NJSW 160 -#define HSMHV_MOD_XTI 161 -#define HSMHV_MOD_CJ 162 -#define HSMHV_MOD_CJSW 163 -#define HSMHV_MOD_CJSWG 164 -#define HSMHV_MOD_MJ 165 -#define HSMHV_MOD_MJSW 166 -#define HSMHV_MOD_MJSWG 167 -#define HSMHV_MOD_XTI2 168 -#define HSMHV_MOD_CISB 169 -#define HSMHV_MOD_CVB 170 -#define HSMHV_MOD_CTEMP 171 -#define HSMHV_MOD_CISBK 172 -#define HSMHV_MOD_CVBK 173 -#define HSMHV_MOD_DIVX 174 -#define HSMHV_MOD_PB 175 -#define HSMHV_MOD_PBSW 176 -#define HSMHV_MOD_PBSWG 177 -#define HSMHV_MOD_TPOLY 179 -/* #define HSMHV_MOD_TPOLYLD 477 not used */ -#define HSMHV_MOD_LP 180 -#define HSMHV_MOD_NSUBP 181 -#define HSMHV_MOD_NSUBP0 182 -#define HSMHV_MOD_NSUBWP 183 -#define HSMHV_MOD_SCP1 184 -#define HSMHV_MOD_SCP2 185 -#define HSMHV_MOD_SCP3 186 -#define HSMHV_MOD_PGD1 187 -#define HSMHV_MOD_PGD2 188 -#define HSMHV_MOD_PGD3 189 -#define HSMHV_MOD_PGD4 190 -#define HSMHV_MOD_CLM1 191 -#define HSMHV_MOD_CLM2 192 -#define HSMHV_MOD_CLM3 193 -#define HSMHV_MOD_CLM5 402 -#define HSMHV_MOD_CLM6 403 -#define HSMHV_MOD_MUETMP 195 - -#define HSMHV_MOD_VOVER 199 -#define HSMHV_MOD_VOVERP 200 -#define HSMHV_MOD_WFC 201 -#define HSMHV_MOD_NSUBCW 249 -#define HSMHV_MOD_NSUBCWP 250 -#define HSMHV_MOD_QME1 202 -#define HSMHV_MOD_QME2 203 -#define HSMHV_MOD_QME3 204 -#define HSMHV_MOD_GIDL1 205 -#define HSMHV_MOD_GIDL2 206 -#define HSMHV_MOD_GIDL3 207 -#define HSMHV_MOD_GLEAK1 208 -#define HSMHV_MOD_GLEAK2 209 -#define HSMHV_MOD_GLEAK3 210 -#define HSMHV_MOD_GLEAK4 211 -#define HSMHV_MOD_GLEAK5 212 -#define HSMHV_MOD_GLEAK6 213 -#define HSMHV_MOD_GLEAK7 214 -#define HSMHV_MOD_GLPART1 406 -#define HSMHV_MOD_GLKSD1 215 -#define HSMHV_MOD_GLKSD2 216 -#define HSMHV_MOD_GLKSD3 217 -#define HSMHV_MOD_GLKB1 218 -#define HSMHV_MOD_GLKB2 219 -#define HSMHV_MOD_GLKB3 429 -#define HSMHV_MOD_EGIG 220 -#define HSMHV_MOD_IGTEMP2 221 -#define HSMHV_MOD_IGTEMP3 222 -#define HSMHV_MOD_VZADD0 223 -#define HSMHV_MOD_PZADD0 224 -#define HSMHV_MOD_NSTI 225 -#define HSMHV_MOD_WSTI 226 -#define HSMHV_MOD_WSTIL 227 -#define HSMHV_MOD_WSTILP 231 -#define HSMHV_MOD_WSTIW 234 -#define HSMHV_MOD_WSTIWP 228 -#define HSMHV_MOD_SCSTI1 229 -#define HSMHV_MOD_SCSTI2 230 -#define HSMHV_MOD_VTHSTI 232 -#define HSMHV_MOD_VDSTI 233 -#define HSMHV_MOD_MUESTI1 235 -#define HSMHV_MOD_MUESTI2 236 -#define HSMHV_MOD_MUESTI3 237 -#define HSMHV_MOD_NSUBPSTI1 238 -#define HSMHV_MOD_NSUBPSTI2 239 -#define HSMHV_MOD_NSUBPSTI3 240 -#define HSMHV_MOD_LPEXT 241 -#define HSMHV_MOD_NPEXT 242 -#define HSMHV_MOD_SCP22 243 -#define HSMHV_MOD_SCP21 244 -#define HSMHV_MOD_BS1 245 -#define HSMHV_MOD_BS2 246 -#define HSMHV_MOD_KAPPA 251 -#define HSMHV_MOD_PTHROU 253 -#define HSMHV_MOD_VDIFFJ 254 -#define HSMHV_MOD_DLY1 255 -#define HSMHV_MOD_DLY2 256 -#define HSMHV_MOD_DLY3 257 -#define HSMHV_MOD_NFTRP 258 -#define HSMHV_MOD_NFALP 259 -#define HSMHV_MOD_CIT 260 -#define HSMHV_MOD_FALPH 263 -#define HSMHV_MOD_OVSLP 261 -#define HSMHV_MOD_OVMAG 262 -#define HSMHV_MOD_GIDL4 281 -#define HSMHV_MOD_GIDL5 282 -#define HSMHV_MOD_SVGS 283 -#define HSMHV_MOD_SVBS 284 -#define HSMHV_MOD_SVBSL 285 -#define HSMHV_MOD_SVDS 286 -#define HSMHV_MOD_SLG 287 -#define HSMHV_MOD_SUB1L 290 -#define HSMHV_MOD_SUB2L 292 -#define HSMHV_MOD_FN1 294 -#define HSMHV_MOD_FN2 295 -#define HSMHV_MOD_FN3 296 -#define HSMHV_MOD_FVBS 297 -#define HSMHV_MOD_VOVERS 303 -#define HSMHV_MOD_VOVERSP 304 -#define HSMHV_MOD_SVGSL 305 -#define HSMHV_MOD_SVGSLP 306 -#define HSMHV_MOD_SVGSWP 307 -#define HSMHV_MOD_SVGSW 308 -#define HSMHV_MOD_SVBSLP 309 -#define HSMHV_MOD_SLGL 310 -#define HSMHV_MOD_SLGLP 311 -#define HSMHV_MOD_SUB1LP 312 -#define HSMHV_MOD_IBPC1 404 -#define HSMHV_MOD_IBPC2 405 -#define HSMHV_MOD_MPHDFM 409 -#define HSMHV_MOD_RDVG11 424 -#define HSMHV_MOD_RDVG12 425 -#define HSMHV_MOD_RTH0 432 -#define HSMHV_MOD_CTH0 462 -#define HSMHV_MOD_POWRAT 463 -/* #define HSMHV_MOD_WTH0 463 /\*---------SHE----------*\/ */ -#define HSMHV_MOD_DLYOV 437 -#define HSMHV_MOD_QDFTVD 438 -#define HSMHV_MOD_XLDLD 439 -#define HSMHV_MOD_XWDLD 494 -#define HSMHV_MOD_RDVD 510 -#define HSMHV_MOD_RDVB 301 - -#define HSMHV_MOD_RDVSUB 481 /* substrate effect */ -#define HSMHV_MOD_RDVDSUB 482 /* substrate effect */ -#define HSMHV_MOD_DDRIFT 483 /* substrate effect */ -#define HSMHV_MOD_VBISUB 484 /* substrate effect */ -#define HSMHV_MOD_NSUBSUB 485 /* substrate effect */ - -#define HSMHV_MOD_QOVSM 323 -#define HSMHV_MOD_LDRIFT 458 -#define HSMHV_MOD_RD20 447 -#define HSMHV_MOD_RD21 441 -#define HSMHV_MOD_RD22 442 -#define HSMHV_MOD_RD22D 478 -#define HSMHV_MOD_RD23 443 -#define HSMHV_MOD_RD24 444 -#define HSMHV_MOD_RD25 445 -#define HSMHV_MOD_RD26 446 -#define HSMHV_MOD_RDVDL 448 -#define HSMHV_MOD_RDVDLP 449 -#define HSMHV_MOD_RDVDS 450 -#define HSMHV_MOD_RDVDSP 451 -#define HSMHV_MOD_RD23L 452 -#define HSMHV_MOD_RD23LP 453 -#define HSMHV_MOD_RD23S 454 -#define HSMHV_MOD_RD23SP 455 -#define HSMHV_MOD_RDS 456 -#define HSMHV_MOD_RDSP 457 -#define HSMHV_MOD_RDTEMP1 461 -#define HSMHV_MOD_RDTEMP2 464 -#define HSMHV_MOD_RTH0R 470 -#define HSMHV_MOD_RDVDTEMP1 471 -#define HSMHV_MOD_RDVDTEMP2 472 -#define HSMHV_MOD_RTH0W 473 -#define HSMHV_MOD_RTH0WP 474 -#define HSMHV_MOD_RTH0NF 475 - -#define HSMHV_MOD_RTHTEMP1 490 -#define HSMHV_MOD_RTHTEMP2 491 -#define HSMHV_MOD_PRATTEMP1 492 -#define HSMHV_MOD_PRATTEMP2 493 - - -#define HSMHV_MOD_CVDSOVER 480 -#define HSMHV_MOD_SHEMAX 100 - -/* binning parameters */ -#define HSMHV_MOD_LMIN 1000 -#define HSMHV_MOD_LMAX 1001 -#define HSMHV_MOD_WMIN 1002 -#define HSMHV_MOD_WMAX 1003 -#define HSMHV_MOD_LBINN 1004 -#define HSMHV_MOD_WBINN 1005 - -/* Length dependence */ -#define HSMHV_MOD_LVMAX 1100 -#define HSMHV_MOD_LBGTMP1 1101 -#define HSMHV_MOD_LBGTMP2 1102 -#define HSMHV_MOD_LEG0 1103 -#define HSMHV_MOD_LVFBOVER 1428 -#define HSMHV_MOD_LNOVER 1430 -#define HSMHV_MOD_LNOVERS 1431 -#define HSMHV_MOD_LWL2 1407 -#define HSMHV_MOD_LVFBC 1121 -#define HSMHV_MOD_LNSUBC 1123 -#define HSMHV_MOD_LNSUBP 1181 -#define HSMHV_MOD_LSCP1 1184 -#define HSMHV_MOD_LSCP2 1185 -#define HSMHV_MOD_LSCP3 1186 -#define HSMHV_MOD_LSC1 1126 -#define HSMHV_MOD_LSC2 1127 -#define HSMHV_MOD_LSC3 1128 -#define HSMHV_MOD_LPGD1 1187 -#define HSMHV_MOD_LPGD3 1189 -#define HSMHV_MOD_LNDEP 1129 -#define HSMHV_MOD_LNINV 1130 -#define HSMHV_MOD_LMUECB0 1131 -#define HSMHV_MOD_LMUECB1 1132 -#define HSMHV_MOD_LMUEPH1 1133 -#define HSMHV_MOD_LVTMP 1141 -#define HSMHV_MOD_LWVTH0 1142 -#define HSMHV_MOD_LMUESR1 1143 -#define HSMHV_MOD_LMUETMP 1195 -#define HSMHV_MOD_LSUB1 1151 -#define HSMHV_MOD_LSUB2 1152 -#define HSMHV_MOD_LSVDS 1286 -#define HSMHV_MOD_LSVBS 1284 -#define HSMHV_MOD_LSVGS 1283 -#define HSMHV_MOD_LFN1 1294 -#define HSMHV_MOD_LFN2 1295 -#define HSMHV_MOD_LFN3 1296 -#define HSMHV_MOD_LFVBS 1297 -#define HSMHV_MOD_LNSTI 1225 -#define HSMHV_MOD_LWSTI 1226 -#define HSMHV_MOD_LSCSTI1 1229 -#define HSMHV_MOD_LSCSTI2 1230 -#define HSMHV_MOD_LVTHSTI 1232 -#define HSMHV_MOD_LMUESTI1 1235 -#define HSMHV_MOD_LMUESTI2 1236 -#define HSMHV_MOD_LMUESTI3 1237 -#define HSMHV_MOD_LNSUBPSTI1 1238 -#define HSMHV_MOD_LNSUBPSTI2 1239 -#define HSMHV_MOD_LNSUBPSTI3 1240 -#define HSMHV_MOD_LCGSO 1154 -#define HSMHV_MOD_LCGDO 1155 -#define HSMHV_MOD_LJS0 1157 -#define HSMHV_MOD_LJS0SW 1158 -#define HSMHV_MOD_LNJ 1159 -#define HSMHV_MOD_LCISBK 1172 -#define HSMHV_MOD_LCLM1 1191 -#define HSMHV_MOD_LCLM2 1192 -#define HSMHV_MOD_LCLM3 1193 -#define HSMHV_MOD_LWFC 1201 -#define HSMHV_MOD_LGIDL1 1205 -#define HSMHV_MOD_LGIDL2 1206 -#define HSMHV_MOD_LGLEAK1 1208 -#define HSMHV_MOD_LGLEAK2 1209 -#define HSMHV_MOD_LGLEAK3 1210 -#define HSMHV_MOD_LGLEAK6 1213 -#define HSMHV_MOD_LGLKSD1 1215 -#define HSMHV_MOD_LGLKSD2 1216 -#define HSMHV_MOD_LGLKB1 1218 -#define HSMHV_MOD_LGLKB2 1219 -#define HSMHV_MOD_LNFTRP 1258 -#define HSMHV_MOD_LNFALP 1259 -#define HSMHV_MOD_LPTHROU 1253 -#define HSMHV_MOD_LVDIFFJ 1254 -#define HSMHV_MOD_LIBPC1 1404 -#define HSMHV_MOD_LIBPC2 1405 -#define HSMHV_MOD_LCGBO 1156 -#define HSMHV_MOD_LCVDSOVER 1480 -#define HSMHV_MOD_LFALPH 1263 -#define HSMHV_MOD_LNPEXT 1242 -#define HSMHV_MOD_LPOWRAT 1463 -#define HSMHV_MOD_LRD 1399 -#define HSMHV_MOD_LRD22 1442 -#define HSMHV_MOD_LRD23 1443 -#define HSMHV_MOD_LRD24 1444 -#define HSMHV_MOD_LRDICT1 1316 -#define HSMHV_MOD_LRDOV13 1476 -#define HSMHV_MOD_LRDSLP1 1315 -#define HSMHV_MOD_LRDVB 1301 -#define HSMHV_MOD_LRDVD 1510 -#define HSMHV_MOD_LRDVG11 1424 -#define HSMHV_MOD_LRS 1398 -#define HSMHV_MOD_LRTH0 1432 -#define HSMHV_MOD_LVOVER 1199 - -/* Width dependence */ -#define HSMHV_MOD_WVMAX 2100 -#define HSMHV_MOD_WBGTMP1 2101 -#define HSMHV_MOD_WBGTMP2 2102 -#define HSMHV_MOD_WEG0 2103 -#define HSMHV_MOD_WVFBOVER 2428 -#define HSMHV_MOD_WNOVER 2430 -#define HSMHV_MOD_WNOVERS 2431 -#define HSMHV_MOD_WWL2 2407 -#define HSMHV_MOD_WVFBC 2121 -#define HSMHV_MOD_WNSUBC 2123 -#define HSMHV_MOD_WNSUBP 2181 -#define HSMHV_MOD_WSCP1 2184 -#define HSMHV_MOD_WSCP2 2185 -#define HSMHV_MOD_WSCP3 2186 -#define HSMHV_MOD_WSC1 2126 -#define HSMHV_MOD_WSC2 2127 -#define HSMHV_MOD_WSC3 2128 -#define HSMHV_MOD_WPGD1 2187 -#define HSMHV_MOD_WPGD3 2189 -#define HSMHV_MOD_WNDEP 2129 -#define HSMHV_MOD_WNINV 2130 -#define HSMHV_MOD_WMUECB0 2131 -#define HSMHV_MOD_WMUECB1 2132 -#define HSMHV_MOD_WMUEPH1 2133 -#define HSMHV_MOD_WVTMP 2141 -#define HSMHV_MOD_WWVTH0 2142 -#define HSMHV_MOD_WMUESR1 2143 -#define HSMHV_MOD_WMUETMP 2195 -#define HSMHV_MOD_WSUB1 2151 -#define HSMHV_MOD_WSUB2 2152 -#define HSMHV_MOD_WSVDS 2286 -#define HSMHV_MOD_WSVBS 2284 -#define HSMHV_MOD_WSVGS 2283 -#define HSMHV_MOD_WFN1 2294 -#define HSMHV_MOD_WFN2 2295 -#define HSMHV_MOD_WFN3 2296 -#define HSMHV_MOD_WFVBS 2297 -#define HSMHV_MOD_WNSTI 2225 -#define HSMHV_MOD_WWSTI 2226 -#define HSMHV_MOD_WSCSTI1 2229 -#define HSMHV_MOD_WSCSTI2 2230 -#define HSMHV_MOD_WVTHSTI 2232 -#define HSMHV_MOD_WMUESTI1 2235 -#define HSMHV_MOD_WMUESTI2 2236 -#define HSMHV_MOD_WMUESTI3 2237 -#define HSMHV_MOD_WNSUBPSTI1 2238 -#define HSMHV_MOD_WNSUBPSTI2 2239 -#define HSMHV_MOD_WNSUBPSTI3 2240 -#define HSMHV_MOD_WCGSO 2154 -#define HSMHV_MOD_WCGDO 2155 -#define HSMHV_MOD_WJS0 2157 -#define HSMHV_MOD_WJS0SW 2158 -#define HSMHV_MOD_WNJ 2159 -#define HSMHV_MOD_WCISBK 2172 -#define HSMHV_MOD_WCLM1 2191 -#define HSMHV_MOD_WCLM2 2192 -#define HSMHV_MOD_WCLM3 2193 -#define HSMHV_MOD_WWFC 2201 -#define HSMHV_MOD_WGIDL1 2205 -#define HSMHV_MOD_WGIDL2 2206 -#define HSMHV_MOD_WGLEAK1 2208 -#define HSMHV_MOD_WGLEAK2 2209 -#define HSMHV_MOD_WGLEAK3 2210 -#define HSMHV_MOD_WGLEAK6 2213 -#define HSMHV_MOD_WGLKSD1 2215 -#define HSMHV_MOD_WGLKSD2 2216 -#define HSMHV_MOD_WGLKB1 2218 -#define HSMHV_MOD_WGLKB2 2219 -#define HSMHV_MOD_WNFTRP 2258 -#define HSMHV_MOD_WNFALP 2259 -#define HSMHV_MOD_WPTHROU 2253 -#define HSMHV_MOD_WVDIFFJ 2254 -#define HSMHV_MOD_WIBPC1 2404 -#define HSMHV_MOD_WIBPC2 2405 -#define HSMHV_MOD_WCGBO 2156 -#define HSMHV_MOD_WCVDSOVER 2480 -#define HSMHV_MOD_WFALPH 2263 -#define HSMHV_MOD_WNPEXT 2242 -#define HSMHV_MOD_WPOWRAT 2463 -#define HSMHV_MOD_WRD 2399 -#define HSMHV_MOD_WRD22 2442 -#define HSMHV_MOD_WRD23 2443 -#define HSMHV_MOD_WRD24 2444 -#define HSMHV_MOD_WRDICT1 2316 -#define HSMHV_MOD_WRDOV13 2476 -#define HSMHV_MOD_WRDSLP1 2315 -#define HSMHV_MOD_WRDVB 2301 -#define HSMHV_MOD_WRDVD 2510 -#define HSMHV_MOD_WRDVG11 2424 -#define HSMHV_MOD_WRS 2398 -#define HSMHV_MOD_WRTH0 2432 -#define HSMHV_MOD_WVOVER 2199 - -/* Cross-term dependence */ -#define HSMHV_MOD_PVMAX 3100 -#define HSMHV_MOD_PBGTMP1 3101 -#define HSMHV_MOD_PBGTMP2 3102 -#define HSMHV_MOD_PEG0 3103 -#define HSMHV_MOD_PVFBOVER 3428 -#define HSMHV_MOD_PNOVER 3430 -#define HSMHV_MOD_PNOVERS 3431 -#define HSMHV_MOD_PWL2 3407 -#define HSMHV_MOD_PVFBC 3121 -#define HSMHV_MOD_PNSUBC 3123 -#define HSMHV_MOD_PNSUBP 3181 -#define HSMHV_MOD_PSCP1 3184 -#define HSMHV_MOD_PSCP2 3185 -#define HSMHV_MOD_PSCP3 3186 -#define HSMHV_MOD_PSC1 3126 -#define HSMHV_MOD_PSC2 3127 -#define HSMHV_MOD_PSC3 3128 -#define HSMHV_MOD_PPGD1 3187 -#define HSMHV_MOD_PPGD3 3189 -#define HSMHV_MOD_PNDEP 3129 -#define HSMHV_MOD_PNINV 3130 -#define HSMHV_MOD_PMUECB0 3131 -#define HSMHV_MOD_PMUECB1 3132 -#define HSMHV_MOD_PMUEPH1 3133 -#define HSMHV_MOD_PVTMP 3141 -#define HSMHV_MOD_PWVTH0 3142 -#define HSMHV_MOD_PMUESR1 3143 -#define HSMHV_MOD_PMUETMP 3195 -#define HSMHV_MOD_PSUB1 3151 -#define HSMHV_MOD_PSUB2 3152 -#define HSMHV_MOD_PSVDS 3286 -#define HSMHV_MOD_PSVBS 3284 -#define HSMHV_MOD_PSVGS 3283 -#define HSMHV_MOD_PFN1 3294 -#define HSMHV_MOD_PFN2 3295 -#define HSMHV_MOD_PFN3 3296 -#define HSMHV_MOD_PFVBS 3297 -#define HSMHV_MOD_PNSTI 3225 -#define HSMHV_MOD_PWSTI 3226 -#define HSMHV_MOD_PSCSTI1 3229 -#define HSMHV_MOD_PSCSTI2 3230 -#define HSMHV_MOD_PVTHSTI 3232 -#define HSMHV_MOD_PMUESTI1 3235 -#define HSMHV_MOD_PMUESTI2 3236 -#define HSMHV_MOD_PMUESTI3 3237 -#define HSMHV_MOD_PNSUBPSTI1 3238 -#define HSMHV_MOD_PNSUBPSTI2 3239 -#define HSMHV_MOD_PNSUBPSTI3 3240 -#define HSMHV_MOD_PCGSO 3154 -#define HSMHV_MOD_PCGDO 3155 -#define HSMHV_MOD_PJS0 3157 -#define HSMHV_MOD_PJS0SW 3158 -#define HSMHV_MOD_PNJ 3159 -#define HSMHV_MOD_PCISBK 3172 -#define HSMHV_MOD_PCLM1 3191 -#define HSMHV_MOD_PCLM2 3192 -#define HSMHV_MOD_PCLM3 3193 -#define HSMHV_MOD_PWFC 3201 -#define HSMHV_MOD_PGIDL1 3205 -#define HSMHV_MOD_PGIDL2 3206 -#define HSMHV_MOD_PGLEAK1 3208 -#define HSMHV_MOD_PGLEAK2 3209 -#define HSMHV_MOD_PGLEAK3 3210 -#define HSMHV_MOD_PGLEAK6 3213 -#define HSMHV_MOD_PGLKSD1 3215 -#define HSMHV_MOD_PGLKSD2 3216 -#define HSMHV_MOD_PGLKB1 3218 -#define HSMHV_MOD_PGLKB2 3219 -#define HSMHV_MOD_PNFTRP 3258 -#define HSMHV_MOD_PNFALP 3259 -#define HSMHV_MOD_PPTHROU 3253 -#define HSMHV_MOD_PVDIFFJ 3254 -#define HSMHV_MOD_PIBPC1 3404 -#define HSMHV_MOD_PIBPC2 3405 -#define HSMHV_MOD_PCGBO 3156 -#define HSMHV_MOD_PCVDSOVER 3480 -#define HSMHV_MOD_PFALPH 3263 -#define HSMHV_MOD_PNPEXT 3242 -#define HSMHV_MOD_PPOWRAT 3463 -#define HSMHV_MOD_PRD 3399 -#define HSMHV_MOD_PRD22 3442 -#define HSMHV_MOD_PRD23 3443 -#define HSMHV_MOD_PRD24 3444 -#define HSMHV_MOD_PRDICT1 3316 -#define HSMHV_MOD_PRDOV13 3476 -#define HSMHV_MOD_PRDSLP1 3315 -#define HSMHV_MOD_PRDVB 3301 -#define HSMHV_MOD_PRDVD 3510 -#define HSMHV_MOD_PRDVG11 3424 -#define HSMHV_MOD_PRS 3398 -#define HSMHV_MOD_PRTH0 3432 -#define HSMHV_MOD_PVOVER 3199 - -/* device requests */ -#define HSMHV_DNODE 341 -#define HSMHV_GNODE 342 -#define HSMHV_SNODE 343 -#define HSMHV_BNODE 344 -/* #define HSMHV_TEMPNODE 345 not used */ -#define HSMHV_DNODEPRIME 346 -#define HSMHV_SNODEPRIME 347 -/* #define HSMHV_BNODEPRIME 395 not used */ -/* #define HSMHV_DBNODE 396 not used */ -/* #define HSMHV_SBNODE 397 not used */ -/* #define HSMHV_VBD 347 */ -#define HSMHV_VBD 466 -#define HSMHV_VBS 348 -#define HSMHV_VGS 349 -#define HSMHV_VDS 350 -#define HSMHV_CD 351 -#define HSMHV_CBS 352 -#define HSMHV_CBD 353 -#define HSMHV_GM 354 -#define HSMHV_GDS 355 -#define HSMHV_GMBS 356 -#define HSMHV_GMT 465 -/* #define HSMHV_ISUBT 466 */ -#define HSMHV_GBD 357 -#define HSMHV_GBS 358 -#define HSMHV_QB 359 -#define HSMHV_CQB 360 -/* #define HSMHV_QTH 467 not used */ -/* #define HSMHV_CQTH 468 not used */ -/* #define HSMHV_CTH 469 not used */ -#define HSMHV_QG 361 -#define HSMHV_CQG 362 -#define HSMHV_QD 363 -#define HSMHV_CQD 364 -#define HSMHV_CGG 365 -#define HSMHV_CGD 366 -#define HSMHV_CGS 367 -#define HSMHV_CBG 368 -#define HSMHV_CAPBD 369 -/* #define HSMHV_CQBD 370 not used */ -#define HSMHV_CAPBS 371 -/* #define HSMHV_CQBS 372 not used */ -#define HSMHV_CDG 373 -#define HSMHV_CDD 374 -#define HSMHV_CDS 375 -#define HSMHV_VON 376 -#define HSMHV_VDSAT 377 -#define HSMHV_QBS 378 -#define HSMHV_QBD 379 -#define HSMHV_SOURCECONDUCT 380 -#define HSMHV_DRAINCONDUCT 381 -#define HSMHV_CBDB 382 -#define HSMHV_CBSB 383 -#define HSMHV_MOD_RBPB 389 -#define HSMHV_MOD_RBPD 390 -#define HSMHV_MOD_RBPS 391 -#define HSMHV_MOD_RBDB 392 -#define HSMHV_MOD_RBSB 393 -#define HSMHV_MOD_GBMIN 394 - -#define HSMHV_ISUB 410 -#define HSMHV_IGIDL 411 -#define HSMHV_IGISL 412 -#define HSMHV_IGD 413 -#define HSMHV_IGS 414 -#define HSMHV_IGB 415 -#define HSMHV_CGSO 416 -#define HSMHV_CGBO 417 -#define HSMHV_CGDO 418 - -#define HSMHV_MOD_TCJBD 92 -#define HSMHV_MOD_TCJBS 93 -#define HSMHV_MOD_TCJBDSW 94 -#define HSMHV_MOD_TCJBSSW 95 -#define HSMHV_MOD_TCJBDSWG 96 -#define HSMHV_MOD_TCJBSSWG 97 - -#define HSMHV_MOD_VGS_MAX 4001 -#define HSMHV_MOD_VGD_MAX 4002 -#define HSMHV_MOD_VGB_MAX 4003 -#define HSMHV_MOD_VDS_MAX 4004 -#define HSMHV_MOD_VBS_MAX 4005 -#define HSMHV_MOD_VBD_MAX 4006 -#define HSMHV_MOD_VGSR_MAX 4007 -#define HSMHV_MOD_VGDR_MAX 4008 -#define HSMHV_MOD_VGBR_MAX 4009 -#define HSMHV_MOD_VBSR_MAX 4010 -#define HSMHV_MOD_VBDR_MAX 4011 - -#include "hsmhvext.h" - -/* Prototype has to be adapted! -extern void HSMHVevaluate(double,double,double,HSMHVinstance*,HSMHVmodel*, - double*,double*,double*, double*, double*, double*, double*, - double*, double*, double*, double*, double*, double*, double*, - double*, double*, double*, double*, CKTcircuit*); -*/ - -#endif /*HSMHV*/ - diff --git a/src/spicelib/devices/hisimhv1/hsmhveval.c b/src/spicelib/devices/hisimhv1/hsmhveval.c deleted file mode 100644 index 9c4df2feb..000000000 --- a/src/spicelib/devices/hisimhv1/hsmhveval.c +++ /dev/null @@ -1,6525 +0,0 @@ -/*********************************************************************** - - HiSIM (Hiroshima University STARC IGFET Model) - Copyright (C) 2012 Hiroshima University & STARC - - MODEL NAME : HiSIM_HV - ( VERSION : 1 SUBVERSION : 2 REVISION : 4 ) - Model Parameter VERSION : 1.23 - FILE : hsmhveval.c - - DATE : 2013.04.30 - - released by - Hiroshima University & - Semiconductor Technology Academic Research Center (STARC) -***********************************************************************/ - -/********************************************************************** - -The following source code, and all copyrights, trade secrets or other -intellectual property rights in and to the source code in its entirety, -is owned by the Hiroshima University and the STARC organization. - -All users need to follow the "HISIM_HV Distribution Statement and -Copyright Notice" attached to HiSIM_HV model. - ------HISIM_HV Distribution Statement and Copyright Notice-------------- - Hiroshima University and/or Semiconductor Technology Academic Research -Center ("STARC") grants to Licensee a worldwide, royalty-free, -sub-licensable, retroactive, perpetual, irrevocable license to make, -have made, offer to sell, sell, import, export, use, copy, redistribute, -perform, display and incorporate HiSIM_HV intellectual property (the -"License") subject to the conditions set forth below. - This License includes rights to use and modify copyrighted material -for any purpose if the copyright is acknowledged as well as the use of -related patents which STARC owns, has applied for or will apply for -in connection with HiSIM_HV intellectual property for the purpose of -implementing and using he HiSIM_HV intellectual property in connection -with the standard. This license applies to all past and future versions -of HiSIM_HV. - -1. HiSIM_HV intellectual property is offered "as is" without any warranty, -explicit or implied, or service support. Hiroshima University, STARC, -its University staff and employees assume no liability for the quality -and performance of HiSIM_HV intellectual property. - -2. As the owner of the HiSIM_HV intellectual property, and all other -related rights, Hiroshima University and/or STARC grant the License -as set forth above. - -3. A Licensee may not charge an end user a fee for the HiSIM_HV source -code, which Hiroshima University and STARC own, by itself, however, -a Licensee may charge an end user a fee for alterations or additions -to the HiSIM_HV source code or for maintenance service. - -4. A Licensee of HiSIM_HV intellectual property agrees that Hiroshima -University and STARC are the developers of HiSIM_HV in all products -containing HiSIM_HV and the alteration thereof (subject to Licensee's -ownership of the alterations). -If future versions of HiSIM_HV incorporate elements of other CMC models -the copyrights of those elements remains with the original developers. -For this purpose the copyright notice as shown below shall be used. - -"The HiSIM_HV source code, and all copyrights, trade secrets or other -intellectual property rights in and to the source code, is owned -by Hiroshima University and/or STARC." - -5. A Licensee of HiSIM_HV intellectual property will comply with the -export obligations pertaining to the export of the HiSIM_HV intellectual -property. - -6. By using HiSIM_HV intellectual property owned by Hiroshima University -and/or STARC, Licensee agrees not to prosecute any patents or patent -held by Licensee that are required for implementation of HiSIM_HV against -any party who is infringing those patents solely by implementing and/or -using the HiSIM_HV standard. - - -Toshimasa Asahara, President, Hiroshima University -Mitiko Miura-Mattausch, Professor, Hiroshima University -Katsuhiro Shimohigashi, President&CEO, STARC -June. 2008 (revised in June 2011) -*************************************************************************/ - -/********************************************************************* -* Memorandum on programming -* -* (1) Bias (x: b|d|g) -* . vxs : Input arguments: Outer branch voltages. -* . vxsi: Input arguments: Inner branch voltages. -* . deltemp: Input argument: delta temperature. -* . Vxse: Internal name for outer branch voltages. -* . Vxs: Internal name for inner branch voltages. -* . Vbscl:Inner bulk source voltage is clamped within a specified region. -* . Y_dVxs denotes the partial derivative of Y w.r.t. Vxs. -* . Y_dVxse denotes the partial derivative of Y w.r.t. Vxse. -* . Y_dT denotes derivatives with respect to deltemp. -* -* (2) Device Mode -* . Normal mode (Vds>=0 for nMOS) is assumed. -* . The sign of Vdse is assumed to be changed simultaneously, if the sign of Vds is changed; -* hence Vdse may become negative even thogh Vds >=0. -* . In case of reverse mode, parent routines have to properly -* transform or interchange inputs and outputs except ones -* related to junction diodes, which are regarded as being -* fixed to the nodal S/D. -* -* (3) Modification for symmetry at Vds=0 -* . Vxsz: Modified bias. (x: b|d|g) -* . Ps0z: Modified Ps0. -* . The following variables are calculated as a function of -* modified biases or potential. -* Tox, Cox, (-- with quantum effect) -* Vth*, dVth*, dPpg, Igate, Igidl, Igisl. -* . The following variables are calculated using a transform -* function. -* Lred -* -* (4) Zones and Cases (terminology) -* -* Chi:=beta*(Ps0-Vbs)= 0 3 5 -* -* Zone: A | D1 | D2 | D3 -* | -* (accumulation)|(depletion) -* | -* Vgs = Vgs_fb Vth -* / / -* Case: Nonconductive / Conductive -* / -* VgVt:=Qn0/Cox= VgVt_small -* -* . Ids is regarded as zero in zone-A. -* . Procedure to calculate Psl and dependent variables is -* omitted in the nonconductive case. Ids and Qi are regarded -* as zero in this case. -* -*********************************************************************/ - -/*===========================================================* -* Preamble. -*=================*/ -/*---------------------------------------------------* -* Header files. -*-----------------*/ -#include "ngspice/ngspice.h" -#ifdef __STDC__ -/* #include */ -#endif - - -/*-----------------------------------* -* HiSIM macros -*-----------------*/ -#include "hisimhv.h" -#include "hsmhvevalenv.h" -#define C_IDD_MIN 1.0e-15 -#define C_sub_delta 0.1 /* CHECK! */ -#define C_sub_delta2 1.0e-9 /* CHECK! */ -#define C_gidl_delta 0.5 - -/* local variables used in macro functions */ -static double TMF0 , TMF1 , TMF2 , TMF3 , TMF4 ; -/*===========================================================* -* pow -*=================*/ -#ifdef POW_TO_EXP_AND_LOG -#define Fn_Pow( x , y ) exp( y * log( x ) ) -#else -#define Fn_Pow( x , y ) pow( x , y ) -#endif - -/*===========================================================* -* Exp() for PGD. -* - ExpLim(-3)=0 -*=================*/ - -#define Fn_ExpLim( y , x , dx ) { \ - if ( (x) < -3.0 ) { \ - dx = 0.0 ; \ - y = 0.0 ; \ - } else if ( (x) < 0.0 ) { \ - dx = 1.0 + (x) * ( 2 * (1.0/3.0) + (x) * 3 * (1.0/27.0) ) ; \ - y = 1.0 + (x) * ( 1.0 + (x) * ( (1.0/3.0) + (x) * (1.0/27.0) ) ) ; \ - } else { \ - dx = 1.0 + (x) * ( 2 * (1.0/3.0) + (x) * ( 3 * 0.0402052934513951 \ - + (x) * 4 * 0.148148111111111 ) ) ; \ - y = 1.0 + (x) * ( 1.0 + (x) * ( (1.0/3.0) + (x) * ( 0.0402052934513951 \ - + (x) * 0.148148111111111 ) ) ) ; \ - } \ -} - -/*===========================================================* -* Macro Functions for ceiling/flooring/symmetrization. -*=================*/ - -/*---------------------------------------------------* -* smoothUpper: ceiling. -* y = xmax - 0.5 ( arg + sqrt( arg^2 + 4 xmax delta ) ) -* arg = xmax - x - delta -*-----------------*/ - -#define Fn_SU( y , x , xmax , delta , dx ) { \ - TMF1 = ( xmax ) - ( x ) - ( delta ) ; \ - TMF2 = 4.0 * ( xmax ) * ( delta) ; \ - TMF2 = TMF2 > 0.0 ? TMF2 : - ( TMF2 ) ; \ - TMF2 = sqrt ( TMF1 * TMF1 + TMF2 ) ; \ - dx = 0.5 * ( 1.0 + TMF1 / TMF2 ) ; \ - y = ( xmax ) - 0.5 * ( TMF1 + TMF2 ) ; \ - } - -#define Fn_SU2( y , x , xmax , delta , dy_dx , dy_dxmax ) { \ - TMF1 = ( xmax ) - ( x ) - ( delta ) ; \ - TMF2 = 4.0 * ( xmax ) * ( delta) ; \ - TMF2 = TMF2 > 0.0 ? TMF2 : - ( TMF2 ) ; \ - TMF2 = sqrt ( TMF1 * TMF1 + TMF2 ) ; \ - dy_dx = 0.5 * ( 1.0 + TMF1 / TMF2 ) ; \ - dy_dxmax = 0.5 * ( 1.0 - ( TMF1 + 2.0 * delta ) / TMF2 ) ; \ - y = ( xmax ) - 0.5 * ( TMF1 + TMF2 ) ; \ - } - - -/*---------------------------------------------------* -* smoothLower: flooring. -* y = xmin + 0.5 ( arg + sqrt( arg^2 + 4 xmin delta ) ) -* arg = x - xmin - delta -*-----------------*/ - -#define Fn_SL( y , x , xmin , delta , dx ) { \ - TMF1 = ( x ) - ( xmin ) - ( delta ) ; \ - TMF2 = 4.0 * ( xmin ) * ( delta ) ; \ - TMF2 = TMF2 > 0.0 ? TMF2 : - ( TMF2 ) ; \ - TMF2 = sqrt ( TMF1 * TMF1 + TMF2 ) ; \ - dx = 0.5 * ( 1.0 + TMF1 / TMF2 ) ; \ - y = ( xmin ) + 0.5 * ( TMF1 + TMF2 ) ; \ - } - -#define Fn_SL2( y , x , xmin , delta , dy_dx, dy_dxmin ) { \ - TMF1 = ( x ) - ( xmin ) - ( delta ) ; \ - TMF2 = 4.0 * ( xmin ) * ( delta ) ; \ - TMF2 = TMF2 > 0.0 ? TMF2 : - ( TMF2 ) ; \ - TMF2 = sqrt ( TMF1 * TMF1 + TMF2 ) ; \ - dy_dx = 0.5 * ( 1.0 + TMF1 / TMF2 ) ; \ - dy_dxmin = 0.5 * ( 1.0 - ( TMF1 - 2.0 * delta ) / TMF2 ) ; \ - y = ( xmin ) + 0.5 * ( TMF1 + TMF2 ) ; \ - } - -/*---------------------------------------------------* -* smoothZero: flooring to zero. -* y = 0.5 ( x + sqrt( x^2 + 4 delta^2 ) ) -*-----------------*/ - -#define Fn_SZ( y , x , delta , dx ) { \ - TMF2 = sqrt ( ( x ) * ( x ) + 4.0 * ( delta ) * ( delta) ) ; \ - dx = 0.5 * ( 1.0 + ( x ) / TMF2 ) ; \ - y = 0.5 * ( ( x ) + TMF2 ) ; \ - if( y < 0.0 ) { y=0.0; dx=0.0; } \ - } - - -/*---------------------------------------------------* -* CeilingPow: ceiling for positive x, flooring for negative x. -* y = x * xmax / ( x^{2m} + xmax^{2m} )^{1/(2m)} -* note: -* - xmax has to be positive. -* - -xmax < y < xmax. -* - dy/dx|_{x=0} = 1. -*-----------------*/ - -#define Fn_CP( y , x , xmax , pw , dx ) { \ - double x2 = (x) * (x) ; \ - double xmax2 = (xmax) * (xmax) ; \ - double xp = 1.0 , xmp = 1.0 ; \ - int m =0, mm =0; \ - double arg_cp =0.0, dnm =0.0; \ - for ( m = 0 ; m < pw ; m ++ ) { xp *= x2 ; xmp *= xmax2 ; } \ - arg_cp = xp + xmp ; \ - dnm = arg_cp ; \ - if ( pw == 1 || pw == 2 || pw == 4 || pw == 8 ) { \ - if ( pw == 1 ) { mm = 1 ; \ - } else if ( pw == 2 ) { mm = 2 ; \ - } else if ( pw == 4 ) { mm = 3 ; \ - } else if ( pw == 8 ) { mm = 4 ; } \ - for ( m = 0 ; m < mm ; m ++ ) { dnm = sqrt( dnm ) ; } \ - } else { dnm = Fn_Pow( dnm , 1.0 / ( 2.0 * pw ) ) ; } \ - dnm = 1.0 / dnm ; \ - y = (x) * (xmax) * dnm ; \ - dx = (xmax) * xmp * dnm / arg_cp ; \ -} - -/*---------------------------------------------------* -* Declining function using a polynomial. -*-----------------*/ - -#define Fn_DclPoly4( y , x , dx ) { \ - TMF2 = (x) * (x) ; \ - TMF3 = TMF2 * (x) ; \ - TMF4 = TMF2 * TMF2 ; \ - y = 1.0 / ( 1.0 + (x) + TMF2 + TMF3 + TMF4 ) ; \ - dx = - ( 1.0 + 2.0 * (x) + 3.0 * TMF2 + 4.0 * TMF3 ) * y * y ; \ -} - -#define Fn_DclPoly6( y , x , dx ) { \ - TMF2 = (x) * (x) ; \ - TMF3 = TMF2 * (x) ; \ - TMF4 = TMF2 * TMF2 ; \ - TMF5 = TMF2 * TMF3 ; \ - TMF6 = TMF3 * TMF3 ; \ - y = 1.0 / ( 1.0 + (x) + TMF2 + TMF3 + TMF4 + TMF5 + TMF6 ) ; \ - dx = - ( 1.0 + 2.0 * (x) + 3.0 * TMF2 + 4.0 * TMF3 \ - + 5.0 * TMF4 + 6.0 * TMF5 ) * y * y ; \ -} - -/*---------------------------------------------------* -* "smoothUpper" using a polynomial -*-----------------*/ - -#define Fn_SUPoly4( y , x , xmax , dx ) { \ - TMF1 = (x) / xmax ; \ - Fn_DclPoly4( y , TMF1 , dx ) ; \ - y = xmax * ( 1.0 - y ) ; \ - dx = - dx ; \ -} - - -#define Fn_SUPoly4m( y , x , xmax , dx , dxmax ) { \ - TMF1 = (x) / xmax ; \ - Fn_DclPoly4( TMF0 , TMF1 , dx ) ; \ - y = xmax * ( 1.0 - TMF0 ) ; \ - dxmax = 1.0 - TMF0 + TMF1 * dx ; \ - dx = - dx ; \ -} - - -#define Fn_SUPoly6m( y , x , xmax , dx , dxmax ) { \ - TMF1 = (x) / xmax ; \ - Fn_DclPoly6( TMF0 , TMF1 , dx ) ; \ - y = xmax * ( 1.0 - TMF0 ) ; \ - dxmax = 1.0 - TMF0 + TMF1 * dx ; \ - dx = - dx ; \ -} - -/*---------------------------------------------------* -* SymAdd: evaluate additional term for symmetry. -*-----------------*/ - -#define Fn_SymAdd( y , x , add0 , dx ) \ -{ \ - TMF1 = 2.0 * ( x ) / ( add0 ) ; \ - TMF2 = 1.0 + TMF1 * ( (1.0/2) + TMF1 * ( (1.0/6) \ - + TMF1 * ( (1.0/24) + TMF1 * ( (1.0/120) \ - + TMF1 * ( (1.0/720) + TMF1 * (1.0/5040) ) ) ) ) ) ; \ - TMF3 = (1.0/2) + TMF1 * ( (1.0/3) \ - + TMF1 * ( (1.0/8) + TMF1 * ( (1.0/30) \ - + TMF1 * ( (1.0/144) + TMF1 * (1.0/840) ) ) ) ) ; \ - y = add0 / TMF2 ; \ - dx = - 2.0 * TMF3 / ( TMF2 * TMF2 ) ; \ -} - -/*===========================================================* -* Function hsmhvevaluate. -*=================*/ -int HSMHVevaluate -( - double Vdse, /* external branch voltage ( Vds >= 0 are assumed -> Vdse might be negative.) */ - double Vgse, /* external branch voltage */ - double Vbse, /* external branch voltage */ - double Vds, /* inner branch voltage */ - double Vgs, /* inner branch voltage */ - double Vbs, /* inner branch voltage */ - double vbs_jct, - double vbd_jct, - double Vsubs, /* substrate-source voltage */ - double deltemp, - HSMHVinstance *here, - HSMHVmodel *model, - CKTcircuit *ckt - ) -{ - HSMHVbinningParam *pParam = &here->pParam ; - HSMHVmodelMKSParam *modelMKS = &model->modelMKS ; - HSMHVhereMKSParam *hereMKS = &here->hereMKS ; - /*-----------------------------------* - * Constants for Smoothing functions - *---------------*/ - const double vth_dlt = 1.0e-3 ; - /* const double cclmmdf = 1.0e-2 ;*/ - const double cclmmdf = 1.0e-1 ; - const double C_cm2m = 1.0e-2 ; - const double qme_dlt = 1.0e-9 * C_cm2m ; - const double rdsl2_dlt = 10.0e-3 * C_cm2m ; - const double rdsu2_dlt = 50.0e-6 * C_cm2m ; - const double rdsz_dlt = 0.1e-3 * C_cm2m ; - const double qme2_dlt = 5.0e-2 ; - const double eef_dlt = 1.0e-2 / C_cm2m ; - const double sti2_dlt = 2.0e-3 ; - const double pol_dlt = 5.0e-2 ; - const double psia_dlt = 1.0e-3 ; - const double psia2_dlt = 5.0e-3 ; - const double psisti_dlt = 5.0e-3 ; - - /*---------------------------------------------------* - * Local variables. - *-----------------*/ - /* Constants ----------------------- */ - const int lp_s0_max = 20 ; - const int lp_sl_max = 40 ; - const double dP_max = 0.1e0 ; - const double ps_conv = 1.0e-12 ; - /* double ps_conv = 1.0e-13 ;*/ - const double gs_conv = 1.0e-8 ; - /** depletion **/ - const double znbd3 = 3.0e0 ; - const double znbd5 = 5.0e0 ; - const double cn_nc3 = C_SQRT_2 / 108e0 ; - /* 5-degree, contact:Chi=5 */ - const double cn_nc51 = 0.707106781186548 ; /* sqrt(2)/2 */ - const double cn_nc52 = -0.117851130197758 ; /* -sqrt(2)/12 */ - const double cn_nc53 = 0.0178800506338833 ; /* (187 - 112*sqrt(2))/1600 */ - const double cn_nc54 = -0.00163730162779191 ; /* (-131 + 88*sqrt(2))/4000 */ - const double cn_nc55 = 6.36964918866352e-5 ; /* (1509-1040*sqrt(2))/600000 */ - /** inversion **/ - /* 3-degree polynomial approx for ( exp[Chi]-1 )^{1/2} */ - const double cn_im53 = 2.9693154855770998e-1 ; - const double cn_im54 = -7.0536542840097616e-2 ; - const double cn_im55 = 6.1152888951331797e-3 ; - /** initial guess **/ - const double c_ps0ini_2 = 8.0e-4 ; - const double c_pslini_1 = 0.3e0 ; - const double c_pslini_2 = 3.0e-2 ; - - const double VgVt_small = 1.0e-12 ; - /* const double Vbs_min = model->HSMHV_vbsmin ; */ - /* const double Vds_max = 10.5e0 ; */ - /* const double Vgs_max = 10.5e0 ; */ - const double epsm10 = 10.0e0 * C_EPS_M ; - const double small = 1.0e-50 ; - const double small2= 1e-12 ; /* for Ra(Vdse) dependence */ - const double c_exp_2 = 7.38905609893065 ; - const double large_arg = 80 ; // log(1.0e100) ; - - double Vbs_max = 0.8e0, Vbs_max_dT =0.0 ; - double Vbs_bnd = 0.4e0, Vbs_bnd_dT =0.0 ; /* start point of positive Vbs bending */ - double Gdsmin = 0.0 ; - double Gjmin = ckt->CKTgmin ; - - /* Internal flags --------------------*/ - int flg_err = 0 ; /* error level */ - int flg_rsrd = 0 ; /* Flag for handling Rs and Rd */ - /* int flg_iprv = 0 ; */ /* Flag for initial guess of Ids -> not necessary any more */ - int flg_pprv = 0 ; /* Flag for initial guesses of Ps0 and Pds */ - int flg_noqi =0; /* Flag for the cases regarding Qi=Qd=0 */ - /* int flg_vbsc = 0 ; */ /* Flag for Vbs confining -> not necessary any more */ - int flg_info = 0 ; - int flg_conv = 0 ; /* Flag for Poisson loop convergence */ - int flg_qme = 0 ; /* Flag for QME */ - int flg_nqs=0 ; /* Flag for NQS calculation */ - - /* Important Variables in HiSIM -------*/ - /* confined bias */ - double Vbscl=0.0, Vbscl_dVbs=0.0, Vbscl_dT=0.0, Vbscl_dVbs_dVbs = 0.0, Vbscl_dVbs_dT = 0.0 ; - double Vgp =0.0, Vgp_dVbs =0.0, Vgp_dVds =0.0, Vgp_dVgs =0.0, Vgp_dT =0.0 ; - double Vgs_fb =0.0 ; - /* Ps0 : surface potential at the source side */ - double Ps0 =0.0, Ps0_dVbs =0.0, Ps0_dVds =0.0, Ps0_dVgs =0.0, Ps0_dT =0.0 ; - double Ps0_ini =0.0 ; - double Ps0_iniA =0.0, Ps0_iniA_dVxb =0.0, Ps0_iniA_dVgb =0.0, Ps0_iniA_dT =0.0 ; - double Ps0_iniB =0.0;/*, Ps0_iniB_dVxb =0.0, Ps0_iniB_dVgb =0.0, Ps0_iniB_dT =0.0 ;*/ - /* Psl : surface potential at the drain side */ - double Psl =0.0, Psl_dVbs =0.0, Psl_dVds =0.0, Psl_dVgs =0.0, Psl_dT =0.0 ; - double Psl_lim =0.0, dPlim =0.0 ; - /* Pds := Psl - Ps0 */ - double Pds = 0.0, Pds_dVbs = 0.0, Pds_dVds = 0.0, Pds_dVgs =0.0, Pds_dT =0.0 ; - double Pds_ini =0.0 ; - double Pds_max =0.0 ; - /* iteration numbers of Ps0 and Psl equations. */ - int lp_s0 = 0 , lp_sl = 0 ; - /* Xi0 := beta * ( Ps0 - Vbs ) - 1. */ - double Xi0 =0.0, Xi0_dVbs =0.0, Xi0_dVds =0.0, Xi0_dVgs =0.0, Xi0_dT =0.0 ; - double Xi0p12 =0.0, Xi0p12_dVbs =0.0, Xi0p12_dVds =0.0, Xi0p12_dVgs =0.0, Xi0p12_dT =0.0 ; - double Xi0p32 =0.0, Xi0p32_dVbs =0.0, Xi0p32_dVds =0.0, Xi0p32_dVgs =0.0, Xi0p32_dT =0.0 ; - /* Xil := beta * ( Psl - Vbs ) - 1. */ - double Xil =0.0, Xil_dVbs =0.0, Xil_dVds =0.0, Xil_dVgs =0.0, Xil_dT =0.0 ; - double Xilp12 =0.0, Xilp12_dVbs =0.0, Xilp12_dVds =0.0, Xilp12_dVgs =0.0, Xilp12_dT =0.0 ; - double Xilp32 =0.0, Xilp32_dVbs =0.0, Xilp32_dVds =0.0, Xilp32_dVgs =0.0, Xilp32_dT =0.0 ; - /* modified bias and potential for sym.*/ - double Vbsz =0.0, Vbsz_dVbs =0.0, Vbsz_dVds =0.0, Vbsz_dT =0.0 ; - double Vdsz =0.0, Vdsz_dVbs =0.0, Vdsz_dVds =0.0, Vdsz_dT =0.0 ; - double Vgsz =0.0, Vgsz_dVbs =0.0, Vgsz_dVds =0.0, Vgsz_dVgs =0.0, Vgsz_dT =0.0 ; - double Vzadd =0.0, Vzadd_dVbs =0.0, Vzadd_dVds = 0.0, Vzadd_dT = 0.0 ; - double Ps0z =0.0, Ps0z_dVbs =0.0, Ps0z_dVds =0.0, Ps0z_dVgs =0.0, Ps0z_dT =0.0 ; - double Pzadd =0.0, Pzadd_dVbs =0.0, Pzadd_dVds =0.0, Pzadd_dVgs =0.0, Pzadd_dT =0.0 ; - - /* IBPC */ - double dVbsIBPC =0.0, dVbsIBPC_dVbs =0.0, dVbsIBPC_dVds =0.0, dVbsIBPC_dVgs =0.0, dVbsIBPC_dT =0.0 ; - double dG3 =0.0, dG3_dVbs =0.0, dG3_dVds =0.0, dG3_dVgs =0.0, dG3_dT =0.0 ; - double dG4 =0.0, dG4_dVbs =0.0, dG4_dVds =0.0, dG4_dVgs =0.0, dG4_dT =0.0 ; - double dIdd =0.0, dIdd_dVbs =0.0, dIdd_dVds =0.0, dIdd_dVgs =0.0, dIdd_dT =0.0 ; - - double betaWL =0.0, betaWL_dVbs =0.0, betaWL_dVds =0.0, betaWL_dVgs =0.0, betaWL_dT =0.0 ; - - /* Chi := beta * ( Ps{0/l} - Vbs ) */ - double Chi =0.0, Chi_dVbs =0.0, Chi_dVds =0.0, Chi_dVgs =0.0, Chi_dT =0.0 ; - /* Rho := beta * ( Psl - Vds ) */ - double Rho =0.0, Rho_dT =0.0 ; - /* threshold voltage */ - double Vth =0.0 ; - double Vth0 =0.0, Vth0_dVb =0.0, Vth0_dVd =0.0, Vth0_dVg =0.0, Vth0_dT =0.0 ; - /* variation of threshold voltage */ - double dVth =0.0, dVth_dVb =0.0, dVth_dVd =0.0, dVth_dVg =0.0, dVth_dT = 0.0 ; - double dVth0 =0.0 ; - double dVth0_dVb =0.0, dVth0_dVd =0.0, dVth0_dVg =0.0, dVth0_dT =0.0 ; - double dVthSC =0.0 ; - double dVthSC_dVb =0.0, dVthSC_dVd =0.0, dVthSC_dVg =0.0, dVthSC_dT =0.0 ; - double delta0 = 5.0e-3 ; - double Psi_a =0.0, Psi_a_dVg =0.0, Psi_a_dVb =0.0, Psi_a_dVd =0.0, Psi_a_dT =0.0 ; - double Pb20a =0.0, Pb20a_dVg =0.0, Pb20a_dVb =0.0, Pb20a_dVd =0.0, Pb20a_dT =0.0 ; - double Pb20b =0.0, Pb20b_dVg =0.0, Pb20b_dVb =0.0, Pb20b_dVd =0.0, Pb20b_dT =0.0 ; - double dVthW =0.0, dVthW_dVb =0.0, dVthW_dVd =0.0, dVthW_dVg =0.0, dVthW_dT =0.0 ; - /* Alpha and related parameters */ - double Alpha =0.0, Alpha_dVbs =0.0, Alpha_dVds =0.0, Alpha_dVgs =0.0, Alpha_dT =0.0 ; - double Achi =0.0, Achi_dVbs =0.0, Achi_dVds =0.0, Achi_dVgs =0.0, Achi_dT =0.0 ; - double VgVt =0.0, VgVt_dVbs =0.0, VgVt_dVds =0.0, VgVt_dVgs =0.0, VgVt_dT =0.0 ; - double Pslsat =0.0 ; - double Vdsat =0.0 ; - double VdsatS =0.0, VdsatS_dVbs =0.0, VdsatS_dVds =0.0, VdsatS_dVgs =0.0, VdsatS_dT =0.0 ; - double Delta =0.0 ; - /* Q_B and capacitances */ - double Qb =0.0, Qb_dVbs =0.0, Qb_dVds =0.0, Qb_dVgs =0.0, Qb_dT=0.0 ; - double Qbu =0.0, Qbu_dVbs =0.0, Qbu_dVds =0.0, Qbu_dVgs =0.0, Qbu_dT =0.0 ; - /* Q_I and capacitances */ - double Qi =0.0, Qi_dVbs =0.0, Qi_dVds =0.0, Qi_dVgs =0.0, Qi_dT=0.0 ; - double Qiu =0.0, Qiu_dVbs =0.0, Qiu_dVds =0.0, Qiu_dVgs =0.0, Qiu_dT =0.0 ; - /* Q_D and capacitances */ - double Qd =0.0, Qd_dVbs =0.0, Qd_dVds =0.0, Qd_dVgs =0.0, Qd_dT =0.0 ; - /* channel current */ - double Ids =0.0, Ids_dVbs =0.0, Ids_dVds =0.0, Ids_dVgs =0.0, Ids_dT =0.0, Ids_dRa =0.0 ; - double Ids0 =0.0, Ids0_dVbs =0.0, Ids0_dVds =0.0, Ids0_dVgs =0.0, Ids0_dT =0.0 ; - /* STI */ - double dVthSCSTI =0.0, dVthSCSTI_dVg =0.0, dVthSCSTI_dVd =0.0, dVthSCSTI_dVb =0.0, dVthSCSTI_dT =0.0 ; - double Vgssti =0.0, Vgssti_dVbs =0.0, Vgssti_dVds =0.0, Vgssti_dVgs =0.0, Vgssti_dT =0.0 ; - double costi0 =0.0 ; - double costi1 =0.0, costi1_dT =0.0 ; - double costi3 =0.0, costi3_dVb =0.0, costi3_dVd =0.0, costi3_dVg =0.0, costi3_dT =0.0 ; - double costi3_dVb_c3 =0.0, costi3_dVd_c3 =0.0, costi3_dVg_c3 =0.0;/*, costi3_dT_c3 =0.0 ;*/ - double costi4 =0.0, costi4_dT =0.0 ; - double costi5 =0.0, costi5_dT =0.0 ; - double costi6 =0.0, costi6_dT =0.0 ; - double costi7 =0.0, costi7_dT =0.0 ; - double Psasti =0.0, Psasti_dVbs =0.0, Psasti_dVds =0.0, Psasti_dVgs =0.0, Psasti_dT =0.0 ; - double Psbsti =0.0, Psbsti_dVbs =0.0, Psbsti_dVds =0.0, Psbsti_dVgs =0.0, Psbsti_dT =0.0 ; - double Psab =0.0, Psab_dVbs =0.0, Psab_dVds =0.0, Psab_dVgs =0.0, Psab_dT =0.0 ; - double Psti =0.0, Psti_dVbs =0.0, Psti_dVds =0.0, Psti_dVgs =0.0, Psti_dT =0.0 ; - double sq1sti =0.0, sq1sti_dVbs =0.0, sq1sti_dVds =0.0, sq1sti_dVgs =0.0, sq1sti_dT =0.0 ; - double sq2sti =0.0, sq2sti_dVbs =0.0, sq2sti_dVds =0.0, sq2sti_dVgs =0.0, sq2sti_dT =0.0 ; - double Qn0sti =0.0, Qn0sti_dVbs =0.0, Qn0sti_dVds =0.0, Qn0sti_dVgs =0.0, Qn0sti_dT =0.0 ; - double Idssti =0.0, Idssti_dVbs =0.0, Idssti_dVds =0.0, Idssti_dVgs =0.0, Idssti_dT=0.0 ; - /* constants */ - double beta =0.0, beta_dT =0.0 ; - double beta_inv =0.0, beta_inv_dT =0.0 ; - double beta2 =0.0 ; - double Pb2 =0.0, Pb2_dT =0.0 ; - double Pb20 =0.0 ; - double Pb2c =0.0 ; - double Vfb =0.0 ; - double c_eox =0.0 ; - double Leff =0.0, Weff =0.0, WeffLD_nf =0.0, Ldrift =0.0 ; - double Ldrift0 =0.0 ; - double q_Nsub =0.0 ; - /* PART-1 */ - /* Accumulation zone */ - double Psa =0.0 ; - double Psa_dVbs =0.0, Psa_dVds =0.0, Psa_dVgs =0.0, Psa_dT =0.0 ; - /* CLM*/ - double Psdl =0.0, Psdl_dVbs =0.0, Psdl_dVds =0.0, Psdl_dVgs =0.0, Psdl_dT =0.0 ; - double Lred =0.0, Lred_dVbs =0.0, Lred_dVds =0.0, Lred_dVgs =0.0, Lred_dT =0.0 ; - double Lch =0.0, Lch_dVbs =0.0, Lch_dVds =0.0, Lch_dVgs =0.0, Lch_dT =0.0 ; - double Wd =0.0, Wd_dVbs =0.0, Wd_dVds =0.0, Wd_dVgs =0.0, Wd_dT =0.0 ; - double Aclm =0.0 ; - /* Pocket Implant */ - double Vthp=0.0, Vthp_dVb=0.0, Vthp_dVd=0.0, Vthp_dVg =0.0, Vthp_dT =0.0 ; - double dVthLP=0.0, dVthLP_dVb=0.0, dVthLP_dVd=0.0, dVthLP_dVg =0.0, dVthLP_dT =0.0 ; - double bs12=0.0, bs12_dVb=0.0, bs12_dVd =0.0, bs12_dVg =0.0, bs12_dT =0.0 ; - double Qbmm=0.0, Qbmm_dVb=0.0, Qbmm_dVd =0.0, Qbmm_dVg =0.0, Qbmm_dT =0.0 ; - double dqb=0.0, dqb_dVb=0.0, dqb_dVg=0.0, dqb_dVd =0.0, dqb_dT =0.0 ; - double Vdx=0.0, Vdx_dVbs=0.0;/*, Vdx_dT=0.0 ;*/ - double Vdx2=0.0, Vdx2_dVbs=0.0;/*, Vdx2_dT=0.0 ;*/ - double Pbsum=0.0, Pbsum_dVb=0.0, Pbsum_dVd=0.0, Pbsum_dVg =0.0, Pbsum_dT =0.0 ; - double sqrt_Pbsum =0.0 ; - /* Poly-Depletion Effect */ - const double pol_b = 1.0 ; - double dPpg =0.0, dPpg_dVb =0.0, dPpg_dVd =0.0, dPpg_dVg =0.0, dPpg_dT = 0.0 ; - /* Quantum Effect */ - double Tox =0.0, Tox_dVb =0.0, Tox_dVd =0.0, Tox_dVg =0.0, Tox_dT =0.0 ; - double dTox =0.0, dTox_dVb =0.0, dTox_dVd =0.0, dTox_dVg =0.0, dTox_dT =0.0 ; - double Cox =0.0, Cox_dVb =0.0, Cox_dVd =0.0, Cox_dVg =0.0, Cox_dT =0.0 ; - double Cox_inv =0.0, Cox_inv_dVb =0.0, Cox_inv_dVd =0.0, Cox_inv_dVg =0.0, Cox_inv_dT =0.0 ; - double Tox0 =0.0, Cox0 =0.0, Cox0_inv =0.0 ; - double Vthq=0.0, Vthq_dVb =0.0, Vthq_dVd =0.0 ; - /* Igate , Igidl , Igisl */ - const double igate_dlt = 1.0e-2 / C_cm2m ; - const double gidlvds_dlt = 1.0e-5 ; - const double gidla = 100.0 ; - double Psdlz =0.0, Psdlz_dVbs =0.0, Psdlz_dVds =0.0, Psdlz_dVgs =0.0, Psdlz_dT =0.0 ; - double Egp12 =0.0, Egp12_dT =0.0 ; - double Egp32 =0.0, Egp32_dT =0.0 ; - double E1 =0.0, E1_dVb =0.0, E1_dVd =0.0, E1_dVg =0.0, E1_dT =0.0 ; - double Etun =0.0, Etun_dVbs =0.0, Etun_dVds =0.0, Etun_dVgs =0.0, Etun_dT =0.0 ; - double Vdsp=0.0, Vdsp_dVd =0.0 ; - double Egidl =0.0, Egidl_dVb =0.0, Egidl_dVd =0.0, Egidl_dVg =0.0, Egidl_dT =0.0 ; - double Egisl =0.0, Egisl_dVb =0.0, Egisl_dVd =0.0, Egisl_dVg =0.0, Egisl_dT =0.0 ; - double Igate =0.0, Igate_dVbs =0.0, Igate_dVds =0.0, Igate_dVgs =0.0, Igate_dT =0.0 ; - double Igs =0.0, Igs_dVbs =0.0, Igs_dVds =0.0, Igs_dVgs =0.0, Igs_dT =0.0 ; - double Igd =0.0, Igd_dVbs =0.0, Igd_dVds =0.0, Igd_dVgs =0.0, Igd_dT =0.0 ; - double Igb =0.0, Igb_dVbs =0.0, Igb_dVds =0.0, Igb_dVgs =0.0, Igb_dT =0.0 ; - double Igidl =0.0, Igidl_dVbs =0.0, Igidl_dVds =0.0, Igidl_dVgs =0.0, Igidl_dT =0.0 ; - double Igisl =0.0, Igisl_dVbs =0.0, Igisl_dVds =0.0, Igisl_dVgs =0.0, Igisl_dT =0.0 ; - double Vdb =0.0, Vsb =0.0 ; - /* connecting function */ - double FD2 =0.0, FD2_dVbs =0.0, FD2_dVds =0.0, FD2_dVgs =0.0, FD2_dT =0.0 ; - double FMDVDS =0.0, FMDVDS_dVbs =0.0, FMDVDS_dVds =0.0, FMDVDS_dVgs =0.0, FMDVDS_dT =0.0 ; - double FMDVGS =0.0, FMDVGS_dVgs =0.0 ; - double FMDPG =0.0, FMDPG_dVbs =0.0, FMDPG_dVds =0.0, FMDPG_dVgs =0.0, FMDPG_dT =0.0 ; - - double cnst0 =0.0, cnst0_dT =0.0; - double cnst1 =0.0, cnst1_dT =0.0; - double cnstCoxi =0.0, cnstCoxi_dVb =0.0, cnstCoxi_dVd =0.0, cnstCoxi_dVg =0.0, cnstCoxi_dT =0.0 ; - double fac1 =0.0, fac1_dVbs =0.0, fac1_dVds =0.0, fac1_dVgs =0.0, fac1_dT =0.0 ; - double fac1p2 =0.0, fac1p2_dT =0.0 ; - double fs01 =0.0, fs01_dVbs =0.0, fs01_dVds =0.0, fs01_dVgs =0.0, fs01_dT =0.0, fs01_dPs0 =0.0 ; - double fs02 =0.0, fs02_dVbs =0.0, fs02_dVds =0.0, fs02_dVgs =0.0, fs02_dT =0.0, fs02_dPs0 =0.0 ; - double fsl1 =0.0, fsl1_dVbs =0.0, fsl1_dVds =0.0, fsl1_dVgs =0.0, fsl1_dT =0.0, fsl1_dPsl =0.0 ; - double fsl2 =0.0, fsl2_dVbs =0.0, fsl2_dVds =0.0, fsl2_dVgs =0.0, fsl2_dT =0.0, fsl2_dPsl =0.0 ; - double cfs1 =0.0, cfs1_dT =0.0 ; - double fb =0.0, fb_dChi =0.0 ; - double fi =0.0, fi_dChi =0.0 ; - double exp_Chi =0.0, exp_Chi_dT =0.0 ; - double exp_Rho =0.0, exp_Rho_dT =0.0 ; - double exp_bVbs =0.0, exp_bVbs_dT =0.0 ; - double exp_bVbsVds =0.0, exp_bVbsVds_dT =0.0 ; - double exp_bPs0 =0.0, exp_bPs0_dT =0.0 ; - double Fs0 =0.0, Fs0_dPs0 =0.0 ; - double Fsl =0.0, Fsl_dPsl =0.0 ; - double dPs0 =0.0, dPsl =0.0 ; - double Qn0 =0.0, Qn0_dVbs =0.0, Qn0_dVds =0.0, Qn0_dVgs =0.0, Qn0_dT =0.0 ; - double Qb0 =0.0, Qb0_dVb =0.0, Qb0_dVd =0.0, Qb0_dVg =0.0, Qb0_dT =0.0 ; - double Qbnm =0.0, Qbnm_dVbs =0.0, Qbnm_dVds =0.0, Qbnm_dVgs =0.0, Qbnm_dT =0.0 ; - double DtPds =0.0, DtPds_dVbs =0.0, DtPds_dVds =0.0, DtPds_dVgs =0.0, DtPds_dT =0.0 ; - double Qinm =0.0, Qinm_dVbs =0.0, Qinm_dVds =0.0, Qinm_dVgs =0.0, Qinm_dT =0.0 ; - double Qidn =0.0, Qidn_dVbs =0.0, Qidn_dVds =0.0, Qidn_dVgs =0.0, Qidn_dT =0.0 ; - double Qdnm =0.0, Qdnm_dVbs =0.0, Qdnm_dVds =0.0, Qdnm_dVgs =0.0, Qdnm_dT =0.0 ; - double Qddn =0.0, Qddn_dVbs =0.0, Qddn_dVds =0.0, Qddn_dVgs =0.0, Qddn_dT =0.0 ; - double Quot =0.0 ; - double Qdrat =0.5, Qdrat_dVbs =0.0, Qdrat_dVds =0.0, Qdrat_dVgs =0.0, Qdrat_dT =0.0 ; - double Idd =0.0, Idd_dVbs =0.0, Idd_dVds =0.0, Idd_dVgs =0.0, Idd_dT =0.0 ; - double Fdd =0.0, Fdd_dVbs =0.0, Fdd_dVds =0.0, Fdd_dVgs =0.0, Fdd_dT =0.0 ; - double Eeff =0.0, Eeff_dVbs =0.0, Eeff_dVds =0.0, Eeff_dVgs =0.0, Eeff_dT =0.0 ; - double Rns =0.0, Rns_dT =0.0 ; - double Mu = 0.0, Mu_dVbs =0.0, Mu_dVds =0.0, Mu_dVgs =0.0, Mu_dT =0.0 ; - double Muun =0.0, Muun_dVbs =0.0, Muun_dVds =0.0, Muun_dVgs =0.0, Muun_dT =0.0 ; - double Ey =0.0, Ey_dVbs =0.0, Ey_dVds =0.0, Ey_dVgs =0.0, Ey_dT =0.0 ; - double Em =0.0, Em_dVbs =0.0, Em_dVds =0.0, Em_dVgs =0.0, Em_dT =0.0 ; - double Vmax =0.0, Vmax_dT =0.0 ; - double Eta =0.0, Eta_dVbs =0.0, Eta_dVds =0.0, Eta_dVgs =0.0, Eta_dT =0.0 ; - double Eta1 =0.0, Eta1_dT =0.0 ; - double Eta1p12 =0.0, Eta1p12_dT =0.0 ; - double Eta1p32 =0.0, Eta1p32_dT =0.0 ; - double Eta1p52 =0.0, Eta1p52_dT =0.0 ; - double Zeta12 =0.0, Zeta12_dT =0.0 ; - double Zeta32 =0.0, Zeta32_dT =0.0 ; - double Zeta52 =0.0, Zeta52_dT =0.0 ; - double F00 =0.0, F00_dVbs =0.0, F00_dVds =0.0, F00_dVgs =0.0, F00_dT =0.0 ; - double F10 =0.0, F10_dVbs =0.0, F10_dVds =0.0, F10_dVgs =0.0, F10_dT =0.0 ; - double F30 =0.0, F30_dVbs =0.0, F30_dVds =0.0, F30_dVgs =0.0, F30_dT =0.0 ; - double F11 =0.0, F11_dVbs =0.0, F11_dVds =0.0, F11_dVgs =0.0, F11_dT =0.0 ; - double Ps0_min =0.0, Ps0_min_dT =0.0 ; - double Acn =0.0, Acn_dVbs =0.0, Acn_dVds =0.0, Acn_dVgs =0.0, Acn_dT =0.0 ; - double Acd =0.0, Acd_dVbs =0.0, Acd_dVds =0.0, Acd_dVgs =0.0, Acd_dT =0.0 ; - double Ac1 =0.0, Ac1_dVbs =0.0, Ac1_dVds =0.0, Ac1_dVgs =0.0, Ac1_dT =0.0 ; - double Ac2 =0.0, Ac2_dVbs =0.0, Ac2_dVds =0.0, Ac2_dVgs =0.0, Ac2_dT =0.0 ; - double Ac3 =0.0, Ac3_dVbs =0.0, Ac3_dVds =0.0, Ac3_dVgs =0.0, Ac3_dT =0.0 ; - double Ac4 =0.0, Ac4_dVbs =0.0, Ac4_dVds =0.0, Ac4_dVgs =0.0, Ac4_dT =0.0 ; - double Ac31 =0.0, Ac31_dVbs =0.0, Ac31_dVds =0.0, Ac31_dVgs =0.0, Ac31_dT =0.0 ; - double Ac41 =0.0, Ac41_dT =0.0 ; - double ninvd_dT =0.0 ; - /* PART-2 (Isub) */ - double Isub =0.0, Isub_dVbs =0.0, Isub_dVds =0.0, Isub_dVgs =0.0, Isub_dT=0.0 ; - double Isub_dVdse = 0.0 ; - double Psislsat =0.0, Psislsat_dVb =0.0, Psislsat_dVd =0.0, Psislsat_dVg =0.0, Psislsat_dT =0.0 ; - double Psisubsat =0.0, Psisubsat_dVb =0.0, Psisubsat_dVd =0.0, Psisubsat_dVg =0.0, Psisubsat_dT =0.0 ; - double Ifn =0.0, Ifn_dVb =0.0, Ifn_dVd=0.0, Ifn_dVg=0.0, Ifn_dT = 0.0 ; - double Eg12=0.0, Eg32 =0.0 ; - /* PART-3 (overlap) */ - /* const double cov_dlt = 1.0e-1 ; */ - /* const double covvgmax = 5.0 ; */ - double cov_slp =0.0, cov_mag =0.0 ; - double Qgos =0.0, Qgos_dVbs =0.0, Qgos_dVds =0.0, Qgos_dVgs =0.0, Qgos_dT =0.0 ; - double Qgod =0.0, Qgod_dVbs =0.0, Qgod_dVds =0.0, Qgod_dVgs =0.0, Qgod_dT =0.0 ; - double Qgbo =0.0, Qgbo_dVbs =0.0, Qgbo_dVds =0.0, Qgbo_dVgs =0.0, Qgbo_dT = 0.0 ; - double Cgdo =0.0, Cgso =0.0, Cgbo_loc =0.0 ; - double Qgso =0.0, Qgso_dVbse =0.0, Qgso_dVdse =0.0, Qgso_dVgse =0.0 ; - double Qgdo =0.0, Qgdo_dVbse =0.0, Qgdo_dVdse =0.0, Qgdo_dVgse =0.0 ; - /* fringe capacitance */ - double Qfd =0.0, Cfd =0.0 ; - double Qfs =0.0, Cfs =0.0 ; - /* Cqy */ - double Ec =0.0, Ec_dVbs =0.0, Ec_dVds =0.0, Ec_dVgs =0.0, Ec_dT =0.0 ; - double Pslk =0.0, Pslk_dVbs =0.0, Pslk_dVds =0.0, Pslk_dVgs =0.0, Pslk_dT =0.0 ; - double Qy =0.0, Qy_dVbs =0.0, Qy_dVds =0.0, Qy_dVgs =0.0, Qy_dT =0.0 ; - /* PART-4 (junction diode) */ - double Ibs =0.0, Gbs =0.0, Gbse =0.0, Ibs_dT =0.0 ; - double Ibd =0.0, Gbd =0.0, Gbde =0.0, Ibd_dT =0.0 ; -/* double Nvtm =0.0 ;*/ - /* junction capacitance */ - double Qbs =0.0, Capbs =0.0, Capbse =0.0, Qbs_dT =0.0 ; - double Qbd =0.0, Capbd =0.0, Capbde =0.0, Qbd_dT =0.0 ; - double czbd =0.0, czbd_dT=0.0 ; - double czbdsw =0.0, czbdsw_dT=0.0 ; - double czbdswg =0.0, czbdswg_dT=0.0 ; - double czbs =0.0, czbs_dT=0.0 ; - double czbssw =0.0, czbssw_dT=0.0 ; - double czbsswg =0.0, czbsswg_dT=0.0 ; - double arg =0.0, sarg =0.0 ; - /* PART-5 (NQS) */ - double tau =0.0, tau_dVbs=0.0, tau_dVds=0.0, tau_dVgs =0.0, tau_dT=0.0 ; - double taub =0.0, taub_dVbs=0.0, taub_dVds=0.0, taub_dVgs =0.0, taub_dT =0.0 ; - /* PART-6 (noise) */ - /* 1/f */ - double NFalp =0.0, NFtrp =0.0, Cit =0.0, Nflic =0.0 ; - /* thermal */ - double Eyd =0.0, Mu_Ave= 0.0, Nthrml =0.0, Mud_hoso =0.0 ; - /* induced gate noise ( Part 0/3 ) */ - double kusai00 =0.0, kusaidd =0.0, kusaiL =0.0, kusai00L =0.0 ; - int flg_ign = 0 ; - double sqrtkusaiL =0.0, kusai_ig =0.0, gds0_ign =0.0, gds0_h2 =0.0, GAMMA =0.0, crl_f =0.0 ; - const double c_sqrt_15 =3.872983346207417e0 ; /* sqrt(15) */ - const double Cox_small =1.0e-6 ; - const double c_16o135 =1.185185185185185e-1 ; /* 16/135 */ - double Nign0 =0.0, MuModA =0.0, MuModB =0.0, correct_w1 =0.0 ; - - /* usage of previously calculated values */ - double vtol_pprv =1.01e-1 ; - double Vbsc_dif =0.0, Vdsc_dif =0.0, Vgsc_dif =0.0, sum_vdif =0.0 ; - double Vbsc_dif2 =0.0, Vdsc_dif2 =0.0, Vgsc_dif2 =0.0, sum_vdif2 =0.0 ; - double dVbs =0.0, dVds =0.0, dVgs =0.0 ; - - /* temporary vars. & derivatives*/ - double TX =0.0, TX_dVbs =0.0, TX_dVds =0.0, TX_dVgs =0.0, TX_dT =0.0 ; - double TY =0.0, TY_dVbs =0.0, TY_dVds =0.0, TY_dVgs =0.0, TY_dT =0.0 ; - double T0 =0.0, T0_dVb =0.0, T0_dVd =0.0, T0_dVg =0.0, T0_dT =0.0 ; - double T1 =0.0, T1_dVb =0.0, T1_dVd =0.0, T1_dVg =0.0, T1_dT =0.0, T1_dVdse_eff =0.0 ; - double T2 =0.0, T2_dVb =0.0, T2_dVd =0.0, T2_dVg =0.0, T2_dT =0.0 ; - double T3 =0.0, T3_dVb =0.0, T3_dVd =0.0, T3_dVg =0.0, T3_dT =0.0 ; - double T4 =0.0, T4_dVb =0.0, T4_dVd =0.0, T4_dVg =0.0, T4_dT =0.0 ; - double T5 =0.0, T5_dVb =0.0, T5_dVd =0.0, T5_dVg =0.0, T5_dT =0.0 ; - double T6 =0.0, T6_dVb =0.0, T6_dVd =0.0, T6_dVg =0.0, T6_dT =0.0 ; - double T7 =0.0, T7_dVb =0.0, T7_dVd =0.0, T7_dVg =0.0, T7_dT =0.0 ; - double T8 =0.0, T8_dVb =0.0, T8_dVd =0.0, T8_dVg =0.0, T8_dT =0.0 ; - double T9 =0.0, T9_dVb =0.0, T9_dVd =0.0, T9_dVg =0.0, T9_dT =0.0, T9_dVdse_eff =0.0 ; - double T10 =0.0, T10_dVb =0.0, T10_dVd =0.0, T10_dVg =0.0, T10_dT =0.0 ; - double T11 =0.0, T11_dT =0.0 ; - double T12 =0.0, T12_dT =0.0 ; - double T15 =0.0, T16 =0.0, T17 =0.0 ; - double T2_dVdse = 0.0, T5_dVdse = 0.0 ; - double T4_dVb_dT, T5_dVb_dT, T6_dVb_dT, T7_dVb_dT ; - - int flg_zone =0 ; - double Vfbsft =0.0, Vfbsft_dVbs =0.0, Vfbsft_dVds =0.0, Vfbsft_dVgs =0.0, Vfbsft_dT =0.0 ; - - /* Vdseff */ - double Vdseff =0.0, Vdseff_dVbs =0.0, Vdseff_dVds =0.0, Vdseff_dVgs =0.0, Vdseff_dT =0.0 ; - double Vdsorg =0.0 ; - - /* D/S Overlap Charges: Qovd/Qovs */ - double CVDSOVER =0.0 ; - double Qovdext =0.0, Qovdext_dVbse =0.0, Qovdext_dVdse =0.0, Qovdext_dVgse =0.0, Qovdext_dT =0.0 ; - double Qovsext =0.0, Qovsext_dVbse =0.0, Qovsext_dVdse =0.0, Qovsext_dVgse =0.0, Qovsext_dT =0.0 ; - double Qovd =0.0, Qovd_dVbs =0.0, Qovd_dVds =0.0, Qovd_dVgs =0.0, Qovd_dT =0.0 ; - double Qovs =0.0, Qovs_dVbs =0.0, Qovs_dVds =0.0, Qovs_dVgs =0.0, Qovs_dT =0.0 ; - double QbuLD =0.0, QbuLD_dVbs =0.0, QbuLD_dVds =0.0, QbuLD_dVgs =0.0, QbuLD_dT =0.0 ; - double QbdLD =0.0, QbdLD_dVbs =0.0, QbdLD_dVds =0.0, QbdLD_dVgs =0.0, QbdLD_dT =0.0 ; - double QbsLD =0.0;/*, QbsLD_dVbs =0.0, QbsLD_dVds =0.0, QbsLD_dVgs =0.0, QbsLD_dT =0.0 ;*/ - double QbdLDext =0.0, QbdLDext_dVbse =0.0, QbdLDext_dVdse =0.0, QbdLDext_dVgse =0.0, QbdLDext_dT =0.0 ; - double QbsLDext =0.0;/*, QbsLDext_dVbse =0.0, QbsLDext_dVdse =0.0, QbsLDext_dVgse =0.0, QbsLDext_dT =0.0 ;*/ - - /* Vgsz for SCE and PGD */ - double dmpacc =0.0, dmpacc_dVbs =0.0, dmpacc_dVds =0.0, dmpacc_dVgs =0.0 ; - double Vbsz2 =0.0, Vbsz2_dVbs =0.0, Vbsz2_dVds =0.0, Vbsz2_dVgs =0.0 , Vbsz2_dT =0.0; - - /* Multiplication factor * number of gate fingers */ - double Mfactor = here->HSMHV_m ; - - - /*-----------------------------------------------------------* - * HiSIM-HV - *-----------------*/ - /* bias-dependent Rd, Rs */ - double Rdrift =0.0, Rdrift_dVbse =0.0, Rdrift_dVdse =0.0, Rdrift_dVgse =0.0, Rdrift_dT =0.0 ; - double Rsdrift =0.0, Rsdrift_dVbse =0.0, Rsdrift_dVdse =0.0, Rsdrift_dVgse =0.0, Rsdrift_dT =0.0 ; - double Rd =0.0, Rd_dVbse =0.0, Rd_dVdse =0.0, Rd_dVgse =0.0, Rd_dT =0.0 ; - double Rs =0.0, Rs_dVbse =0.0, Rs_dVdse =0.0, Rs_dVgse =0.0, Rs_dT =0.0 ; - double Ra =0.0, Ra_dVbse =0.0, Ra_dVdse =0.0, Ra_dVgse =0.0 ; - double Ra_dVbs =0.0, Ra_dVds =0.0, Ra_dVgs =0.0 ; - double Ra_dVdse_eff =0.0 ; - const double delta_rd = 10e-3 * C_cm2m ; - const double Ra_N = 20.0; /* smoothing parameter for Ra */ - const double Res_min = 1.0e-4 ; - double Rd0_dT =0.0, Rs0_dT =0.0, Rdvd_dT =0.0, Rsvd_dT =0.0 ; - double Vdse_eff =0.0, Vdse_eff_dVbse =0.0, Vdse_eff_dVdse =0.0, Vdse_eff_dVgse =0.0, - Vdse_eff_dVbs =0.0, Vdse_eff_dVds =0.0, Vdse_eff_dVgs =0.0 ; - double VdseModeNML =0.0, VdseModeRVS =0.0 ; - double Vbsegmt =0.0, Vdsegmt =0.0, Vgsegmt =0.0 ; - double Vbserev =0.0, Vdserev =0.0, Vgserev =0.0 ; - double Ra_alpha, Ra_beta ; - - /* modified external biases for symmetry */ - double /*Vzadd_ext = 0.0,*/ Vzadd_ext_dVd = 0.0 ; - double Vdserevz = 0.0, Vdserevz_dVd = 0.0 ; - double Vgserevz = 0.0, Vgserevz_dVd = 0.0 ; - double Vbserevz = 0.0, Vbserevz_dVd = 0.0 ; - - /* Substrate Effect */ - const double RDVSUB = model->HSMHV_rdvsub ; - const double RDVDSUB = model->HSMHV_rdvdsub ; - const double DDRIFT = model->HSMHV_ddrift ; - const double VBISUB = model->HSMHV_vbisub ; - const double NSUBSUB = modelMKS->HSMHV_nsubsub ; - double Vsubsrev = 0.0 ; - double Wdep = 0.0, Wdep_dVdserev = 0.0, Wdep_dVsubsrev = 0.0 ; - double T1_dVdserev = 0.0, T1_dVsubsrev = 0.0, T6_dVdserev = 0.0, T6_dVsubsrev = 0.0 ; - double Rs_dVsubs = 0.0, Rd_dVsubs = 0.0, Rdrift_dVsubs = 0.0, Rsdrift_dVsubs = 0.0 ; - - - /* temperature-dependent variables for SHE model */ - double TTEMP =0.0, TTEMP0 =0.0 ; - double/* Tdiff0 = 0.0, Tdiff0_2 = 0.0,*/ Tdiff = 0.0, Tdiff_2 = 0.0 ; - double Eg =0.0, Eg_dT =0.0 ; - double Nin =0.0, Nin_dT =0.0 ; - double js =0.0, js_dT =0.0 ; - double jssw =0.0, jssw_dT =0.0 ; - double js2 =0.0, js2_dT =0.0 ; - double jssw2 =0.0, jssw2_dT =0.0 ; - - /* Qover 5/1 ckt-bias use */ - double Vgbgmt =0.0, Vgbgmt_dVbs =0.0, Vgbgmt_dVds =0.0, Vgbgmt_dVgs =0.0 ; - double Vxbgmt =0.0, Vxbgmt_dVbs =0.0, Vxbgmt_dVds =0.0, Vxbgmt_dVgs =0.0 ; - double Vxbgmtcl =0.0, Vxbgmtcl_dVxbgmt =0.0, Vxbgmtcl_dT =0.0 ; - - double ModeNML =0.0, ModeRVS =0.0 ; - - double QsuLD =0.0, QsuLD_dVbs =0.0, QsuLD_dVds =0.0, QsuLD_dVgs =0.0, QsuLD_dT =0.0 ; - double QiuLD =0.0, QiuLD_dVbs =0.0, QiuLD_dVds =0.0, QiuLD_dVgs =0.0, QiuLD_dT =0.0 ; - double /*QidLD =0.0,*/ QidLD_dVbs =0.0, QidLD_dVds =0.0, QidLD_dVgs =0.0, QidLD_dT =0.0 ; - double /*QisLD =0.0,*/ QisLD_dVbs =0.0, QisLD_dVds =0.0, QisLD_dVgs =0.0, QisLD_dT =0.0 ; - double /*QidLDext =0.0,*/ QidLDext_dVbse =0.0, QidLDext_dVdse =0.0, QidLDext_dVgse =0.0, QidLDext_dT =0.0 ; - double /*QisLDext =0.0,*/ QisLDext_dVbse =0.0, QisLDext_dVdse =0.0, QisLDext_dVgse =0.0, QisLDext_dT =0.0 ; - - /* Self heating */ - double mphn0_dT =0.0 ; - double ps0ldinib_dT =0.0, cnst0over_dT =0.0 ; - double ps0ldinibs_dT =0.0, cnst0overs_dT =0.0 ; - double Temp_dif =0.0 ; - /* for SCE */ - double ptovr_dT =0.0 ; - - /* IBPC */ - double IdsIBPC =0.0, IdsIBPC_dVbs =0.0, IdsIBPC_dVds =0.0, IdsIBPC_dVgs =0.0, IdsIBPC_dT =0.0 ; - - /* Qover */ - int flg_ovzone = 0 ; - double VgpLD =0.0, VgpLD_dVgb =0.0 ; - double /*VthLD =0.0,*/ Vgb_fb_LD =0.0 ; - double Ac31_dVgb =0.0, Ac31_dVxb =0.0 ; - double Ac1_dVgb =0.0, Ac1_dVxb =0.0 ; - double Ac2_dVgb =0.0, Ac2_dVxb =0.0 ; - double Ac3_dVgb =0.0, Ac3_dVxb =0.0 ; - double Acn_dVgb =0.0, Acn_dVxb =0.0 ; - double Acd_dVgb =0.0, Acd_dVxb =0.0 ; - double Chi_dVgb =0.0, Chi_dVxb =0.0 ; - double Psa_dVgb =0.0, Psa_dVxb =0.0 ; - double QsuLD_dVgb =0.0, QsuLD_dVxb =0.0 ; - double QbuLD_dVgb =0.0, QbuLD_dVxb =0.0 ; - double fs02_dVgb =0.0 ;/*, fs02_dVxb =0.0 ;*/ - double TX_dVgb =0.0, TX_dVxb =0.0 ; - double TY_dVgb =0.0, TY_dVxb =0.0 ; - double Ps0LD =0.0, Ps0LD_dVgb =0.0, Ps0LD_dVxb =0.0, Ps0LD_dT =0.0 ; - double /*Ps0LD_dVbs =0.0,*/ Ps0LD_dVds =0.0; /*Ps0LD_dVgs =0.0 ;*/ - double Pb2over =0.0, Pb2over_dT =0.0 ; - - int flg_overgiven =0 ; - int Coovlps =0, Coovlpd =0 ; - double Lovers =0.0, Loverd =0.0 ; - double Novers =0.0, Noverd =0.0 ; - double Nover_func =0.0 ; -/* double ps0ldinib_func =0.0, ps0ldinib_func_dT =0.0 ;*/ - double cnst0over_func =0.0, cnst0over_func_dT =0.0 ; - double cnst1over =0.0, cnst1over_dT =0.0; - /* Qover Analytical Model */ - int lp_ld; - double Ta = 9.3868e-3, Tb = -0.1047839 ; - double Tc, Tc_dT ; - double Td, Td_dVxb, Td_dVgb, Td_dT ; - double Tv, Tv_dVxb, Tv_dVgb, Tv_dT ; - double Tu, Tu_dVxb, Tu_dVgb, Tu_dT ; - double Tp, Tp_dT ; - double Tq, Tq_dVxb, Tq_dVgb, Tq_dT ; - double T1_dVxb, T1_dVgb ; -/* double T2_dVxb, T2_dVgb ;*/ -/* double T3_dVxb, T3_dVgb ;*/ - double T5_dVxb, T5_dVgb ; - double VgpLD_shift, VgpLD_shift_dT ; - double VgpLD_shift_dVgb, VgpLD_shift_dVxb, exp_bVbs_dVxb ; - double gamma, gamma_dVxb, gamma_dT ; - double psi , psi_dVgb , psi_dVxb , psi_dT ; -/* double psi_B, arg_B ;*/ - double Chi_1, Chi_1_dVgb, Chi_1_dVxb ,Chi_1_dT ; - double Chi_A, Chi_A_dVgb, Chi_A_dVxb, Chi_A_dT ; - double Chi_B, Chi_B_dVgb, Chi_B_dVxb, Chi_B_dT;/*, Chi_B_dpsi , Chi_B_dgamma ;*/ - - /* X_dT for leakage currents & junction diodes */ - double isbd_dT =0.0, isbs_dT =0.0 ; - double isbd2_dT =0.0, isbs2_dT =0.0 ; - double vbdt_dT =0.0, vbst_dT = 0.0 ; - double jd_expcd_dT =0.0 , jd_expcs_dT =0.0 ; - double jd_nvtm_inv_dT =0.0 ; - double exptemp_dT = 0.0 ; - double tcjbd =0.0, tcjbs =0.0, - tcjbdsw =0.0, tcjbssw =0.0, - tcjbdswg =0.0, tcjbsswg =0.0 ; - - /*================ Start of executable code.=================*/ - - - if (here->HSMHV_mode == HiSIM_NORMAL_MODE) { - ModeNML = 1.0 ; - ModeRVS = 0.0 ; - } else { - ModeNML = 0.0 ; - ModeRVS = 1.0 ; - } - - T1 = Vdse + Vgse + Vbse + Vds + Vgs + Vbs + vbd_jct + vbs_jct ; - if ( ! finite (T1) ) { - fprintf (stderr , - "*** warning(HiSIM_HV): Unacceptable Bias(es).\n" ) ; - fprintf (stderr , "----- bias information (HiSIM_HV)\n" ) ; - fprintf (stderr , "name: %s\n" , here->HSMHVname ) ; - fprintf (stderr , "states: %d\n" , here->HSMHVstates ) ; - fprintf (stderr , "Vdse= %.3e Vgse=%.3e Vbse=%.3e\n" - , Vdse , Vgse , Vbse ) ; - fprintf (stderr , "Vdsi= %.3e Vgsi=%.3e Vbsi=%.3e\n" - , Vds , Vgs , Vbs ) ; - fprintf (stderr , "vbs_jct= %12.5e vbd_jct= %12.5e\n" - , vbs_jct , vbd_jct ) ; - fprintf (stderr , "vd= %.3e vs= %.3e vdp= %.3e vgp= %.3e vbp= %.3e vsp= %.3e\n" - , *( ckt->CKTrhsOld + here->HSMHVdNode ) - , *( ckt->CKTrhsOld + here->HSMHVsNode ) - , *( ckt->CKTrhsOld + here->HSMHVdNodePrime ) - , *( ckt->CKTrhsOld + here->HSMHVgNodePrime ) - , *( ckt->CKTrhsOld + here->HSMHVbNodePrime ) - , *( ckt->CKTrhsOld + here->HSMHVsNodePrime ) ) ; - fprintf (stderr , "----- bias information (end)\n" ) ; - return ( HiSIM_ERROR ) ; - } - - flg_info = model->HSMHV_info ; - flg_nqs = model->HSMHV_conqs ; - - /*-----------------------------------------------------------* - * Start of the routine. (label) - *-----------------*/ -/* start_of_routine: */ - - /*-----------------------------------------------------------* - * Temperature dependent constants. - *-----------------*/ - if ( here->HSMHVtempNode > 0 && pParam->HSMHV_rth0 != 0.0 ) { - -#define HSMHVEVAL -#include "hsmhvtemp_eval.h" - - } else { - beta = here->HSMHV_beta ; - TTEMP = ckt->CKTtemp ; - if ( here->HSMHV_dtemp_Given ) { TTEMP = TTEMP + here->HSMHV_dtemp ; } - Eg_dT = 0.0 ; - beta_dT = 0.0 ; - beta_inv_dT = 0.0 ; - mphn0_dT = 0.0 ; - ptovr_dT = 0.0 ; - Vmax_dT = 0.0 ; - Pb2_dT = 0.0 ; - cnst0_dT = 0.0 ; - cnst1_dT = 0.0 ; - } - - /* Inverse of the thermal voltage */ - beta_inv = here->HSMHV_beta_inv ; - beta2 = here->HSMHV_beta2 ; - - /* Bandgap */ - Egp12 = here->HSMHV_egp12 ; - Egp32 = here->HSMHV_egp32 ; - - /* Metallurgical channel geometry */ - Leff = here->HSMHV_leff ; - Weff = here->HSMHV_weff ; - WeffLD_nf = here->HSMHV_weff_ld * here->HSMHV_nf ; - - Ldrift0 = here->HSMHV_ldrift1 + here->HSMHV_ldrift2 ; - Ldrift = (model->HSMHV_coldrift) ? Ldrift0 - : Ldrift0 + here->HSMHV_loverld ; - - /* Flat band voltage */ - Vfb = pParam->HSMHV_vfbc ; - - /* Surface impurity profile */ - q_Nsub = here->HSMHV_qnsub ; - - /* Velocity Temperature Dependence */ - Vmax = here->HSMHV_vmax ; - - /* 2 phi_B */ - Pb2 = here->HSMHV_pb2 ; - Pb20 = here->HSMHV_pb20 ; - Pb2c = here->HSMHV_pb2c ; - - /* Coefficient of the F function for bulk charge */ - cnst0 = here->HSMHV_cnst0 ; - - /* cnst1: n_{p0} / p_{p0} */ - cnst1 = here->HSMHV_cnst1 ; - - /* c_eox: Permitivity in ox */ - c_eox = here->HSMHV_cecox ; - - /* Tox and Cox without QME */ - Tox0 = model->HSMHV_tox ; - Cox0 = c_eox / Tox0 ; - Cox0_inv = 1.0 / Cox0 ; - - /*---------------------------------------------------* - * Determine clamping limits for too large Vbs (internal). - *-----------------*/ - - Fn_SU( T1 , Pb2 - model->HSMHV_vzadd0 , Vbs_max , 0.1 , T0 ) ; - Vbs_max = T1 ; - Vbs_max_dT = Pb2_dT * T0 ; - if ( Pb20 - model->HSMHV_vzadd0 < Vbs_max ) { - Vbs_max = Pb20 - model->HSMHV_vzadd0 ; - Vbs_max_dT = 0.0 ; - } - if ( Pb2c - model->HSMHV_vzadd0 < Vbs_max ) { - Vbs_max = Pb2c - model->HSMHV_vzadd0 ; - Vbs_max_dT = 0.0 ; - } - - if ( Vbs_bnd > Vbs_max * 0.5 ) { - Vbs_bnd = 0.5 * Vbs_max ; - Vbs_bnd_dT = 0.5 * Vbs_max_dT ; - } - - - if (here->HSMHV_rs > 0.0 || here->HSMHV_rd > 0.0) { - if ( model->HSMHV_corsrd == 1 ) flg_rsrd = 1 ; - if ( model->HSMHV_corsrd == 2 ) flg_rsrd = 2 ; - if ( model->HSMHV_corsrd == 3 ) flg_rsrd = 3 ; - } - - /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ - * PART-1: Basic device characteristics. - *+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ - /*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++* - * Prepare for potential initial guesses using previous values - *++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ - - flg_pprv = 0 ; - - if ( here->HSMHV_called >= 1 ) { - - Vbsc_dif = Vbs - here->HSMHV_vbsc_prv ; - Vdsc_dif = Vds - here->HSMHV_vdsc_prv ; - Vgsc_dif = Vgs- here->HSMHV_vgsc_prv ; - - sum_vdif = fabs( Vbsc_dif ) + fabs( Vdsc_dif ) - + fabs( Vgsc_dif ) ; - - if ( model->HSMHV_copprv >= 1 && sum_vdif <= vtol_pprv && - here->HSMHV_mode * here->HSMHV_mode_prv > 0 ) { flg_pprv = 1 ;} - - if ( here->HSMHV_called >= 2 && flg_pprv == 1 ) { - Vbsc_dif2 = here->HSMHV_vbsc_prv - here->HSMHV_vbsc_prv2 ; - Vdsc_dif2 = here->HSMHV_vdsc_prv - here->HSMHV_vdsc_prv2 ; - Vgsc_dif2 = here->HSMHV_vgsc_prv - here->HSMHV_vgsc_prv2 ; - sum_vdif2 = fabs( Vbsc_dif2 ) + fabs( Vdsc_dif2 ) - + fabs( Vgsc_dif2 ) ; - if ( epsm10 < sum_vdif2 && sum_vdif2 <= vtol_pprv && - here->HSMHV_mode_prv * here->HSMHV_mode_prv2 > 0 ) { flg_pprv = 2 ; } - } - Temp_dif = TTEMP - here->HSMHV_temp_prv ; - - } else { - - Vbsc_dif = 0.0 ; - Vdsc_dif = 0.0 ; - Vgsc_dif = 0.0 ; - sum_vdif = 0.0 ; - Vbsc_dif2 = 0.0 ; - Vdsc_dif2 = 0.0 ; - Vgsc_dif2 = 0.0 ; - sum_vdif2 = 0.0 ; - flg_pprv = 0 ; - Temp_dif = 0.0 ; - } - - dVbs = Vbsc_dif ; - dVds = Vdsc_dif ; - dVgs = Vgsc_dif ; - - if ( flg_pprv >= 1 ) { - Ps0 = here->HSMHV_ps0_prv ; - Ps0_dVbs = here->HSMHV_ps0_dvbs_prv ; - Ps0_dVds = here->HSMHV_ps0_dvds_prv ; - Ps0_dVgs = here->HSMHV_ps0_dvgs_prv ; - - Pds = here->HSMHV_pds_prv ; - Pds_dVbs = here->HSMHV_pds_dvbs_prv ; - Pds_dVds = here->HSMHV_pds_dvds_prv ; - Pds_dVgs = here->HSMHV_pds_dvgs_prv ; - } - - - if ( flg_rsrd == 1 || flg_rsrd == 3 ) { - - /*----------------------------------------------------------* - * Considering these special cases: - * ( here->HSMHV_mode == HiSIM_NORMAL_MODE && Vdse < 0.0 ) - * ( here->HSMHV_mode == HiSIM_REVERSE_MODE && Vdse < 0.0 ) - *----------------------------------------------------------*/ - Vdsegmt = here->HSMHV_mode * Vdse ; /* geometrical outer bias */ - Vgsegmt = Vgse - ModeRVS * Vdse ; /* geometrical outer bias */ - Vbsegmt = Vbse - ModeRVS * Vdse ; /* geometrical outer bias */ - if ( Vdsegmt >= 0.0 ) { /* vdse normal mode */ - VdseModeNML = 1 ; - VdseModeRVS = 0 ; - Vdserev = Vdsegmt ; - Vgserev = Vgsegmt ; - Vbserev = Vbsegmt ; - Vsubsrev = Vsubs ; - } else { /* vdse reverse mode */ - VdseModeNML = 0 ; - VdseModeRVS = 1 ; - Vdserev = - Vdsegmt ; - Vgserev = Vgsegmt - Vdsegmt ; - Vbserev = Vbsegmt - Vdsegmt ; - Vsubsrev = Vsubs - Vdsegmt ; - } - - - if ( here->HSMHV_rdvd > 0.0 || here->HSMHV_rsvd > 0.0 || pParam->HSMHV_rdvg11 > 0.0 || pParam->HSMHV_rdvb > 0.0 || here->HSMHVsubNode >= 0 ) { - /*-----------------------------------------------------------* - * Vxserevz: Modified bias introduced to realize symmetry at Vds=0. - *-----------------*/ - Fn_SymAdd( Vzadd , Vdserev / 2 , model->HSMHV_vzadd0 , T2 ) ; - Vzadd_ext_dVd = T2 / 2 ; - if ( Vzadd < ps_conv ) { - Vzadd = ps_conv ; - Vzadd_ext_dVd = 0.0 ; - } - Vdserevz = Vdserev + 2.0 * Vzadd ; - Vdserevz_dVd = 1.0 + 2.0 * Vzadd_ext_dVd ; - Vgserevz = Vgserev + Vzadd ; - Vgserevz_dVd = Vzadd_ext_dVd ; - Vbserevz = Vbserev + Vzadd ; - Vbserevz_dVd = Vzadd_ext_dVd ; - - - /* bias-dependent Rdrift for HVMOS/LDMOS */ - - if ( model->HSMHV_cosym == 1 || VdseModeNML == 1 ) { /* HVMOS or normal mode LDMOS: */ - /* ... Vdse dependence */ - T1 = VdseModeNML * here->HSMHV_rd + VdseModeRVS * here->HSMHV_rs ; - T1_dT = VdseModeNML * Rd0_dT + VdseModeRVS * Rs0_dT ; - T0 = VdseModeNML * here->HSMHV_rdvd + VdseModeRVS * here->HSMHV_rsvd ; - T0_dT = VdseModeNML * Rdvd_dT + VdseModeRVS * Rsvd_dT ; - T4 = T1 + T0 * Vdserevz ; - T4_dVd = T0 * Vdserevz_dVd ; - T4_dT = T1_dT + T0_dT * Vdserevz ; - - /* ... Vgse dependence */ - T10 = model->HSMHV_rdvg12 + small ; - T1 = T4 * ( 1.0 + pParam->HSMHV_rdvg11 * ( 1.0 - Vgserevz / T10 ) ) ; - T1_dVd = T4_dVd * ( 1.0 + pParam->HSMHV_rdvg11 * ( 1.0 - Vgserevz / T10 ) ) - + T4 * pParam->HSMHV_rdvg11 * ( - Vgserevz_dVd / T10 ) ; - T1_dVg = T4 * pParam->HSMHV_rdvg11 * ( - 1.0 ) / T10 ; - T1_dT = T4_dT * ( 1.0 + pParam->HSMHV_rdvg11 * ( 1.0 - Vgserevz / T10 ) ) ; - Fn_SL2( T2 , T1 , T4 , rdsl2_dlt , T0 , T5 ) ; - T2_dVd = T0 * T1_dVd + T5 * T4_dVd ; - T2_dVg = T0 * T1_dVg ; - T2_dT = T0 * T1_dT + T5 * T4_dT ; - - T3 = T4 * ( 1.0 + pParam->HSMHV_rdvg11 ) ; - T3_dVd = T4_dVd * ( 1.0 + pParam->HSMHV_rdvg11 ) ; - T3_dT = T4_dT * ( 1.0 + pParam->HSMHV_rdvg11 ) ; - Fn_SU2( Rdrift , T2 , T3 , rdsu2_dlt , T0, T5 ) ; - Rdrift_dVdse = T0 * T2_dVd + T5 * T3_dVd ; - Rdrift_dVgse = T0 * T2_dVg ; - Rdrift_dT = T0 * T2_dT + T5 * T3_dT ; - - /* ... Vbse dependence */ - T1 = 1.0 - pParam->HSMHV_rdvb * Vbserevz ; - T1_dVb = - pParam->HSMHV_rdvb ; - T1_dVd = - pParam->HSMHV_rdvb * Vbserevz_dVd ; - Fn_SZ( T3 , T1 , rdsz_dlt , T4 ) ; - T3_dVb = T4 * T1_dVb ; - T3_dVd = T4 * T1_dVd ; - T0 = Rdrift ; - Rdrift = Rdrift * T3 ; - Rdrift_dVdse = Rdrift_dVdse * T3 + T0 * T3_dVd ; - Rdrift_dVgse = Rdrift_dVgse * T3 ; - Rdrift_dVbse = + T0 * T3_dVb ; - Rdrift_dT = Rdrift_dT * T3 ; - - } else { /* reverse mode LDMOS: */ - Rdrift = here->HSMHV_rs ; - Rdrift_dVdse = 0.0 ; - Rdrift_dVgse = 0.0 ; - Rdrift_dVbse = 0.0 ; - Rdrift_dT = Rs0_dT ; - } - - - /* Rsdrift */ - T4 = ( VdseModeNML * here->HSMHV_rs + VdseModeRVS * here->HSMHV_rd ) ; - T4_dT = VdseModeNML * Rs0_dT + VdseModeRVS * Rd0_dT ; - T4_dVd = 0.0 ; - - if ( model->HSMHV_cosym == 1 || VdseModeRVS == 1 ) { /* HVMOS or reverse mode LDMOS: */ - /* ... Vdse dependence */ - T0 = VdseModeNML * here->HSMHV_rsvd + VdseModeRVS * here->HSMHV_rdvd ; - T0_dT = VdseModeNML * Rsvd_dT + VdseModeRVS * Rdvd_dT ; -/* if ( model->HSMHV_cosym == 2 ) { /\* latest case with bugfix: *\/ */ -/* T4 = T4 + T0 * Vdserevz ; */ -/* T4_dVd = T0 * Vdserevz_dVd ; */ -/* T4_dT = T4_dT + T0_dT * Vdserevz ; */ -/* } else { /\* HiSIM_HV 1.1.1 compatible case *\/ */ - T4 = T4 + T0 * ( 2.0 * model->HSMHV_vzadd0 ) ; /* 2.0 * Fn_SymAdd( x=0, add0=model->HSMHV_vzadd0 ) */ - T4_dT = T4_dT + T0_dT * ( 2.0 * model->HSMHV_vzadd0 ) ; -/* } */ - - /* ... Vgse dependence */ - T10 = model->HSMHV_rdvg12 + small ; - T1 = T4 * ( 1.0 + pParam->HSMHV_rdvg11 * ( 1.0 - Vgserevz / T10 ) ) ; - T1_dVd = T4_dVd * ( 1.0 + pParam->HSMHV_rdvg11 * ( 1.0 - Vgserevz / T10 ) ) - + T4 * pParam->HSMHV_rdvg11 * ( - Vgserevz_dVd / T10 ) ; - T1_dVg = T4 * pParam->HSMHV_rdvg11 * ( - 1.0 ) / T10 ; - T1_dT = T4_dT * ( 1.0 + pParam->HSMHV_rdvg11 * ( 1.0 - Vgserevz / T10 ) ) ; - Fn_SL2( T2 , T1 , T4 , rdsl2_dlt , T0 , T5 ) ; - T2_dVd = T0 * T1_dVd + T5 * T4_dVd ; - T2_dVg = T0 * T1_dVg ; - T2_dT = T0 * T1_dT + T5 * T4_dT ; - - T3 = T4 * ( 1.0 + pParam->HSMHV_rdvg11 ) ; - T3_dVd = T4_dVd * ( 1.0 + pParam->HSMHV_rdvg11 ) ; - T3_dT = T4_dT * ( 1.0 + pParam->HSMHV_rdvg11 ) ; - Fn_SU2( Rsdrift , T2 , T3 , rdsu2_dlt , T0, T5 ) ; - Rsdrift_dVdse = T0 * T2_dVd + T5 * T3_dVd ; - Rsdrift_dVgse = T0 * T2_dVg ; - Rsdrift_dT = T0 * T2_dT + T5 * T3_dT ; - - /* ... Vbse dependence */ - T1 = 1.0 - pParam->HSMHV_rdvb * Vbserevz ; - T1_dVb = - pParam->HSMHV_rdvb ; - T1_dVd = - pParam->HSMHV_rdvb * Vbserevz_dVd ; - Fn_SZ( T3 , T1 , rdsz_dlt , T4 ) ; - T3_dVb = T4 * T1_dVb ; - T3_dVd = T4 * T1_dVd ; - T0 = Rsdrift ; - Rsdrift = Rsdrift * T3 ; - Rsdrift_dVdse = Rsdrift_dVdse * T3 + T0 * T3_dVd ; - Rsdrift_dVgse = Rsdrift_dVgse * T3 ; - Rsdrift_dVbse = + T0 * T3_dVb ; - Rsdrift_dT = Rsdrift_dT * T3 ; - } else { /* LDMOS normal mode: */ - Rsdrift = here->HSMHV_rs ; - Rsdrift_dVdse = 0.0 ; - Rsdrift_dVgse = 0.0 ; - Rsdrift_dVbse = 0.0 ; - Rsdrift_dT = Rs0_dT ; - } - - - if ( here->HSMHVsubNode >= 0 && model->HSMHV_cosym == 0 && - ( pParam->HSMHV_nover * ( NSUBSUB + pParam->HSMHV_nover ) ) > 0 ) { - /* external substrate node exists && LDMOS case: */ - /* Substrate Effect */ - T0 = VBISUB - RDVDSUB * Vdserevz - RDVSUB * Vsubsrev ; - Fn_SZ( T1, T0, 10.0, T2 ) ; - T1_dVdserev = - RDVDSUB * Vdserevz_dVd * T2 ; - T1_dVsubsrev = - RDVSUB * T2 ; - - T0 = NSUBSUB / ( pParam->HSMHV_nover * ( NSUBSUB + pParam->HSMHV_nover ) ) ; - T4 = 2 * C_ESI / C_QE * T0 ; - Wdep = sqrt ( T4 * T1 ) + small ; - Wdep_dVdserev = 0.5 * T4 * T1_dVdserev / Wdep ; - Wdep_dVsubsrev = 0.5 * T4 * T1_dVsubsrev / Wdep ; - - Fn_SU( Wdep, Wdep, DDRIFT, C_sub_delta * DDRIFT, T0 ) ; - Wdep_dVdserev *= T0 ; - Wdep_dVsubsrev *= T0 ; - - T0 = DDRIFT - Wdep ; - Fn_SZ( T0, T0, C_sub_delta2, T2 ) ; - T6 = Ldrift0 / T0 ; - T6_dVdserev = T2 * Wdep_dVdserev * T6 / T0 ; - T6_dVsubsrev = T2 * Wdep_dVsubsrev * T6 / T0 ; - - if ( VdseModeNML == 1 ) { /* Vdse normal mode: */ - T0 = Rdrift ; - Rdrift = T0 * T6 ; - Rdrift_dVdse = Rdrift_dVdse * T6 + T0 * T6_dVdserev ; - Rdrift_dVgse = Rdrift_dVgse * T6 ; - Rdrift_dVbse = Rdrift_dVbse * T6 ; - Rdrift_dVsubs= T0 * T6_dVsubsrev ; - Rdrift_dT = Rdrift_dT * T6 ; - } else { /* Vdse reverse mode: */ - T0 = Rsdrift ; - Rsdrift = T0 * T6 ; - Rsdrift_dVdse = Rsdrift_dVdse * T6 + T0 * T6_dVdserev ; - Rsdrift_dVgse = Rsdrift_dVgse * T6 ; - Rsdrift_dVbse = Rsdrift_dVbse * T6 ; - Rsdrift_dVsubs = T0 * T6_dVsubsrev ; - Rsdrift_dT = Rsdrift_dT * T6 ; - } - } - - Rd = Rdrift ; - Rd_dVgse = Rdrift_dVgse ; - Rd_dVdse = Rdrift_dVdse ; - Rd_dVbse = Rdrift_dVbse ; - Rd_dVsubs = Rdrift_dVsubs ; - Rd_dT = Rdrift_dT ; - Rs = Rsdrift ; - Rs_dVgse = Rsdrift_dVgse ; - Rs_dVdse = Rsdrift_dVdse ; - Rs_dVbse = Rsdrift_dVbse ; - Rs_dVsubs = Rsdrift_dVsubs ; - Rs_dT = Rsdrift_dT ; - - } else { /* bias-independent Rs/Rd */ - Rd = VdseModeNML * here->HSMHV_rd + VdseModeRVS * here->HSMHV_rs ; - Rd_dT = VdseModeNML * Rd0_dT + VdseModeRVS * Rs0_dT ; - Rs = VdseModeNML * here->HSMHV_rs + VdseModeRVS * here->HSMHV_rd ; - Rs_dT = VdseModeNML * Rs0_dT + VdseModeRVS * Rd0_dT ; - } - - /* Weff dependence of the resistances */ - Rd = Rd / WeffLD_nf ; - Rd_dVgse /= WeffLD_nf ; - Rd_dVdse /= WeffLD_nf ; - Rd_dVbse /= WeffLD_nf ; - Rd_dVsubs /= WeffLD_nf ; - Rd_dT /= WeffLD_nf ; - Rs = Rs / WeffLD_nf ; - Rs_dVgse /= WeffLD_nf ; - Rs_dVdse /= WeffLD_nf ; - Rs_dVbse /= WeffLD_nf ; - Rs_dVsubs /= WeffLD_nf ; - Rs_dT /= WeffLD_nf ; - - /* Sheet resistances are added. */ - Rd += VdseModeNML * here->HSMHV_rd0 + VdseModeRVS * here->HSMHV_rs0 ; - Rs += VdseModeNML * here->HSMHV_rs0 + VdseModeRVS * here->HSMHV_rd0 ; - - /* Re-stamps for hsmhvnoi.c */ - /* Please see hsmhvnoi.c */ - T0 = VdseModeNML * Rd + VdseModeRVS * Rs ; /* mode-dependent --> geometrical */ - if ( T0 > 0.0 && model->HSMHV_cothrml != 0 ) here->HSMHVdrainConductance = Mfactor / T0 ; - else here->HSMHVdrainConductance = 0.0 ; - T0 = VdseModeNML * Rs + VdseModeRVS * Rd ; /* mode-dependent --> geometrical */ - if ( T0 > 0.0 && model->HSMHV_cothrml != 0 ) here->HSMHVsourceConductance = Mfactor / T0 ; - else here->HSMHVsourceConductance = 0.0 ; - - } /* end of case flg_rsrd=1 or flg_rsrd=3 */ - - - - - /* Clamping for Vbs > Vbs_bnd */ - if ( Vbs > Vbs_bnd ) { - T1 = Vbs - Vbs_bnd ; - T2 = Vbs_max - Vbs_bnd ; - T1_dT = - Vbs_bnd_dT ; - T2_dT = Vbs_max_dT - Vbs_bnd_dT ; - - Fn_SUPoly4m( TY , T1 , T2 , Vbscl_dVbs , T0 ) ; - TY_dT = T1_dT * Vbscl_dVbs + T2_dT * T0 ; - - Vbscl = Vbs_bnd + TY ; - Vbscl_dT = Vbs_bnd_dT + TY_dT ; - - T3 = 1 / T2 ; - - /* x/xmax */ - T4 = T1 * T3 ; - T4_dVb = T3 ; - T4_dT = T1_dT * T3 - T1*T3*T3*T2_dT; - T4_dVb_dT = -T3*T3*T2_dT ; - - T5 = T4 * T4; - T5_dVb = 2 * T4_dVb * T4 ; - T5_dT = 2.0*T4*T4_dT; - T5_dVb_dT = 2 * T4_dVb_dT * T4 + 2 * T4_dVb * T4_dT ; - T15 = 2 * T4_dVb * T4_dVb ; /* T15 = T5_dVb_dVb */ - - T6 = T4 * T5 ; - T6_dVb = T4_dVb * T5 + T4 * T5_dVb ; - T6_dT = T4_dT * T5 + T4 * T5_dT ; - T6_dVb_dT = T4_dVb_dT * T5 + T4_dVb * T5_dT + T4_dT * T5_dVb + T4*T5_dVb_dT ; - T16 = T4_dVb * T5_dVb + T4_dVb * T5_dVb + T4 * T15 ; /* T16 = T6_dVb_dVb */ - - /* T7 = Z T7_dVb = dZ_dVb T17 = dZ_dVb_dVb */ - T7 = 1 + T4 + T5 + T6 + T5 * T5 ; - T7_dVb = T4_dVb + T5_dVb + T6_dVb + 2 * T5_dVb * T5 ; - T7_dT = T4_dT + T5_dT + T6_dT + 2 * T5_dT * T5 ; - T7_dVb_dT = T4_dVb_dT + T5_dVb_dT + T6_dVb_dT + 2 * T5_dVb_dT * T5 + 2 * T5_dVb * T5_dT ; - T17 = T15 + T16 + 2 * T15 * T5 + 2 * T5_dVb * T5_dVb ; - - T8 = T7 * T7 ; - T8_dVb = 2 * T7_dVb * T7 ; - T8_dT = 2 * T7_dT * T7 ; - - T9 = 1 / T8 ; - T9_dVb = - T8_dVb * T9 * T9 ; - T9_dT = - T8_dT * T9 * T9 ; - - Vbscl_dVbs = T2 * T7_dVb * T9 ; - Vbscl_dVbs_dT = T2_dT * T7_dVb * T9 + T2*(T7_dVb_dT * T9+ T7_dVb * T9_dT); - Vbscl_dVbs_dVbs = T2 * ( T17 * T9 + T7_dVb * T9_dVb ) ; - } else { - Vbscl = Vbs ; - Vbscl_dVbs = 1.0 ; - Vbscl_dT = 0.0 ; - Vbscl_dVbs_dVbs = 0.0 ; - } - - /*-----------------------------------------------------------* - * Vxsz: Modified bias introduced to realize symmetry at Vds=0. - *-----------------*/ - - - T1 = Vbscl_dVbs * Vds / 2 ; - Fn_SymAdd( Vzadd , T1 , model->HSMHV_vzadd0 , T2 ) ; - Vzadd_dVbs = T2 * Vbscl_dVbs_dVbs * Vds / 2 ; - Vzadd_dT = T2 * Vbscl_dVbs_dT * Vds / 2 ; - T2 *= Vbscl_dVbs / 2 ; - Vzadd_dVds = T2 ; - - if ( Vzadd < ps_conv ) { - Vzadd = ps_conv ; - Vzadd_dVds = 0.0 ; - Vzadd_dVbs = 0.0 ; - Vzadd_dT = 0.0 ; - } - - Vbsz = Vbscl + Vzadd ; - Vbsz_dVbs = Vbscl_dVbs + Vzadd_dVbs ; - Vbsz_dVds = Vzadd_dVds ; - Vbsz_dT = Vbscl_dT + Vzadd_dT; - - Vdsz = Vds + 2.0 * Vzadd ; - Vdsz_dVbs = 2.0 * Vzadd_dVbs ; - Vdsz_dVds = 1.0 + 2.0 * Vzadd_dVds ; - Vdsz_dT = 2.0 * Vzadd_dT ; - - Vgsz = Vgs + Vzadd ; - Vgsz_dVbs = Vzadd_dVbs ; - Vgsz_dVgs = 1.0 ; - Vgsz_dVds = Vzadd_dVds ; - Vgsz_dT = Vzadd_dT ; - - /*---------------------------------------------------* - * Factor of modification for symmetry. - *-----------------*/ - - T1 = here->HSMHV_qnsub_esi * Cox0_inv * Cox0_inv ; - T2 = Vgs - Vfb ; - T3 = 1 + 2.0 / T1 * ( T2 - 1.0 / here->HSMHV_betatnom - Vbscl ) ; - - Fn_SZ( T4 , T3 , 1e-3 , T5 ) ; - TX = sqrt( T4 ) ; - Pslsat = T2 + T1 * ( 1.0 - TX ) ; - VdsatS = Pslsat - Pb2c ; - Fn_SL( VdsatS , VdsatS , 0.1 , 5e-2 , T6 ) ; - - VdsatS_dVbs = ( TX ? (T6 * T5 / TX * Vbscl_dVbs) : 0.0 ) ; - VdsatS_dVds = 0.0 ; - VdsatS_dVgs = ( TX ? (T6 * ( 1.0 - T5 / TX )) : 0.0 ) ; - VdsatS_dT = (TX ? (T6* T5/TX * Vbscl_dT) : 0) ; - - T1 = Vds / VdsatS ; - Fn_SUPoly4( TX , T1 , 1.0 , T0 ) ; - FMDVDS = TX * TX ; - T2 = 2 * TX * T0 ; - T3 = T2 / ( VdsatS * VdsatS ) ; - FMDVDS_dVbs = T3 * ( - Vds * VdsatS_dVbs ) ; - FMDVDS_dVds = T3 * ( 1.0 * VdsatS - Vds * VdsatS_dVds ) ; - FMDVDS_dVgs = T3 * ( - Vds * VdsatS_dVgs ) ; - FMDVDS_dT = T3 * ( - Vds * VdsatS_dT ) ; - - /*-----------------------------------------------------------* - * Quantum effect - *-----------------*/ - if ( model->HSMHV_flg_qme == 0 ) { - flg_qme = 0 ; - } else { - flg_qme = 1 ; - } - - T1 = here->HSMHV_2qnsub_esi ; - T2 = sqrt( T1 * Pb20 ) ; - Vthq = Pb20 + Vfb + T2 * Cox0_inv ; - Vthq_dVb = 0.0 ; - Vthq_dVd = 0.0 ; - - if ( flg_qme == 0 ) { - Tox = Tox0 ; - Tox_dVb = 0.0 ; - Tox_dVd = 0.0 ; - Tox_dVg = 0.0 ; - - Cox = Cox0 ; - Cox_dVb = 0.0 ; - Cox_dVd = 0.0 ; - Cox_dVg = 0.0 ; - - Cox_inv = Cox0_inv ; - Cox_inv_dVb = 0.0 ; - Cox_inv_dVd = 0.0 ; - Cox_inv_dVg = 0.0 ; - - T0 = cnst0 * cnst0 * Cox_inv ; - cnstCoxi = T0 * Cox_inv ; - cnstCoxi_dVb = 0.0 ; - cnstCoxi_dVd = 0.0 ; - cnstCoxi_dVg = 0.0 ; - cnstCoxi_dT = 2.0 * cnst0 * cnst0_dT * Cox_inv * Cox_inv ; - - } else { - - T1 = - model->HSMHV_qme2 ; - T5 = Vgsz - Vthq - model->HSMHV_qme2 ; - T5_dVb = Vgsz_dVbs - Vthq_dVb ; - T5_dVd = Vgsz_dVds - Vthq_dVd ; - T5_dVg = Vgsz_dVgs ; - T5_dT = Vgsz_dT ; - Fn_SZ( T2 , - T5 , qme2_dlt, T3) ; - T2 = T2 + small ; - T2_dVb = - T3 * T5_dVb ; - T2_dVd = - T3 * T5_dVd ; - T2_dVg = - T3 * T5_dVg ; - T2_dT = - T3 * T5_dT ; - T3 = model->HSMHV_qme12 * T1 * T1 ; - T4 = model->HSMHV_qme12 * T2 * T2 + model->HSMHV_qme3 ; - Fn_SU( dTox , T4 , T3 , qme_dlt , T6 ) ; - T7 = 2 * model->HSMHV_qme12 * T2 * T6 ; - dTox_dVb = T7 * T2_dVb ; - dTox_dVd = T7 * T2_dVd ; - dTox_dVg = T7 * T2_dVg ; - dTox_dT = T7 * T2_dT ; - - - if ( dTox * 1.0e12 < Tox0 ) { - dTox = 0.0 ; - dTox_dVb = 0.0 ; - dTox_dVd = 0.0 ; - dTox_dVg = 0.0 ; - dTox_dT = 0.0 ; - flg_qme = 0 ; - } - - Tox = Tox0 + dTox ; - Tox_dVb = dTox_dVb ; - Tox_dVd = dTox_dVd ; - Tox_dVg = dTox_dVg ; - Tox_dT = dTox_dT ; - - Cox = c_eox / Tox ; - T1 = - c_eox / ( Tox * Tox ) ; - Cox_dVb = T1 * Tox_dVb ; - Cox_dVd = T1 * Tox_dVd ; - Cox_dVg = T1 * Tox_dVg ; - Cox_dT = T1 * Tox_dT ; - - Cox_inv = Tox / c_eox ; - T1 = 1.0 / c_eox ; - Cox_inv_dVb = T1 * Tox_dVb ; - Cox_inv_dVd = T1 * Tox_dVd ; - Cox_inv_dVg = T1 * Tox_dVg ; - Cox_inv_dT = T1 * Tox_dT ; - - T0 = cnst0 * cnst0 * Cox_inv ; - cnstCoxi = T0 * Cox_inv ; - T1 = 2.0 * T0 ; - cnstCoxi_dVb = T1 * Cox_inv_dVb ; - cnstCoxi_dVd = T1 * Cox_inv_dVd ; - cnstCoxi_dVg = T1 * Cox_inv_dVg ; - cnstCoxi_dT = 2.0 * cnst0 * cnst0_dT * Cox_inv * Cox_inv + T1 * Cox_inv_dT; - } - - /*---------------------------------------------------* - * Vbsz2 : Vbs for dVth - *-----------------*/ - Vbsz2 = Vbsz ; - Vbsz2_dVbs = Vbsz_dVbs ; - Vbsz2_dVds = Vbsz_dVds ; - Vbsz2_dVgs = 0.0 ; - Vbsz2_dT = Vbsz_dT ; - - /*---------------------------------------------------* - * Vthp : Vth with pocket. - *-----------------*/ - T1 = here->HSMHV_2qnsub_esi ; - Qb0 = sqrt (T1 * (Pb20 - Vbsz2)) ; - T2 = 0.5 * T1 / Qb0 ; - Qb0_dVb = T2 * (- Vbsz2_dVbs) ; - Qb0_dVd = T2 * (- Vbsz2_dVds) ; - Qb0_dVg = T2 * (- Vbsz2_dVgs) ; - Qb0_dT = T2 * (- Vbsz2_dT) ; - - Vthp = Pb20 + Vfb + Qb0 * Cox_inv + here->HSMHV_ptovr; - Vthp_dVb = Qb0_dVb * Cox_inv + Qb0 * Cox_inv_dVb ; - Vthp_dVd = Qb0_dVd * Cox_inv + Qb0 * Cox_inv_dVd ; - Vthp_dVg = Qb0_dVg * Cox_inv + Qb0 * Cox_inv_dVg ; - Vthp_dT = Qb0_dT * Cox_inv + Qb0 * Cox_inv_dT + ptovr_dT ; - - if ( pParam->HSMHV_pthrou != 0.0 ) { - /* Modify Pb20 to Pb20b */ - T11 = beta * 0.25 ; - T10 = beta_inv - cnstCoxi * T11 + small ; - T10_dVg = - T11 * cnstCoxi_dVg ; - T10_dVd = - T11 * cnstCoxi_dVd ; - T10_dVb = - T11 * cnstCoxi_dVb ; - T10_dT = beta_inv_dT - ( T11 * cnstCoxi_dT + beta_dT * 0.25 * cnstCoxi ) ; - - T1 = Vgsz - T10 - psia2_dlt ; - T1_dVg = Vgsz_dVgs - T10_dVg ; - T1_dVd = Vgsz_dVds - T10_dVd ; - T1_dVb = Vgsz_dVbs - T10_dVb ; - T1_dT = Vgsz_dT - T10_dT ; - T0 = Fn_Sgn (T10) ; - T2 = sqrt (T1 * T1 + T0 * 4.0 * T10 * psia2_dlt) ; - T3 = T10 + 0.5 * (T1 + T2) - Vfb ; /* Vgpa for sqrt calc. */ - T4 = T1 / T2 ; - T5 = T0 * 2.0 * psia2_dlt / T2 ; - T3_dVg = T10_dVg - + 0.5 * (T1_dVg - + (T4 * T1_dVg + T5 * T10_dVg ) ) ; - T3_dVd = T10_dVd - + 0.5 * (T1_dVd - + (T4 * T1_dVd + T5 * T10_dVd ) ) ; - T3_dVb = T10_dVb - + 0.5 * (T1_dVb - + (T4 * T1_dVb + T5 * T10_dVb ) ) ; - T3_dT = T10_dT - + 0.5 * (T1_dT - + (T4 * T1_dT + T5 * T10_dT ) ) ; - T4 = 4.0 / cnstCoxi * beta_inv * beta_inv ; - T8 = 4.0 / cnstCoxi ; - T9 = beta_inv * beta_inv ; - T4_dT = - 4.0 * cnstCoxi_dT / ( cnstCoxi * cnstCoxi ) * T9 - + T8 * 2.0 * beta_inv * beta_inv_dT ; - T5 = beta * T3 - 1.0 ; - T5_dT = beta_dT * T3 + beta * T3_dT ; - T6 = T5 / cnstCoxi ; - T1 = 1.0 + T5 * T4 ; - T2 = beta * T4 ; - T6 = T6 * T4 ; - T1_dVg = (T2 * T3_dVg - T6 * cnstCoxi_dVg ) ; - T1_dVd = (T2 * T3_dVd - T6 * cnstCoxi_dVd ) ; - T1_dVb = (T2 * T3_dVb - T6 * cnstCoxi_dVb ) ; - T1_dT = T5_dT * T4 + T5 * T4_dT ; - Fn_SZ( T1 ,T1, psia_dlt, T7) ; - T1 += epsm10 ; - - T1_dVg *= T7 ; - T1_dVd *= T7 ; - T1_dVb *= T7 ; - T1_dT *= T7 ; - - T2 = sqrt (T1) ; - T5 = 0.5 / T2 ; - T2_dVg = T1_dVg * T5 ; - T2_dVd = T1_dVd * T5 ; - T2_dVb = T1_dVb * T5 ; - T2_dT = T1_dT * T5 ; - - T4 = 0.5 * beta ; - Psi_a = T3 + cnstCoxi * T4 * (1.0 - T2) ; - T5 = T4 * (1.0 - T2) ; - T6 = T4 * cnstCoxi ; - Psi_a_dVg = T3_dVg - + (cnstCoxi_dVg * T5 - T6 * T2_dVg) ; - Psi_a_dVd = T3_dVd - + (cnstCoxi_dVd * T5 - T6 * T2_dVd) ; - Psi_a_dVb = T3_dVb - + (cnstCoxi_dVb * T5 - T6 * T2_dVb) ; - Psi_a_dT = T3_dT - + (cnstCoxi_dT * T5 - T6 * T2_dT) - + cnstCoxi * 0.5 * beta_dT * ( 1.0 - T2 ) ; - - Fn_SU( Pb20a , Psi_a, Pb20, delta0, T2) ; - Pb20a_dVb = T2 * Psi_a_dVb ; - Pb20a_dVd = T2 * Psi_a_dVd ; - Pb20a_dVg = T2 * Psi_a_dVg ; - Pb20a_dT = T2 * Psi_a_dT ; - } - - T1 = pParam->HSMHV_pthrou ; - Pb20b = Pb20 + T1 * (Pb20a - Pb20) ; - Pb20b_dVb = T1 * Pb20a_dVb ; - Pb20b_dVd = T1 * Pb20a_dVd ; - Pb20b_dVg = T1 * Pb20a_dVg ; - Pb20b_dT = T1 * Pb20a_dT ; - - T0 = 0.95 ; - T1 = T0 * Pb20b - Vbsz2 - 1.0e-3 ; - T1_dVb = T0 * Pb20b_dVb - Vbsz2_dVbs ; - T1_dVd = T0 * Pb20b_dVd - Vbsz2_dVds ; - T1_dVg = T0 * Pb20b_dVg - Vbsz2_dVgs ; - T1_dT = T0 * Pb20b_dT - Vbsz2_dT ; - T2 = sqrt (T1 * T1 + 4.0 * T0 * Pb20b * 1.0e-3) ; - T3 = T0 * Pb20b - 0.5 * (T1 + T2) ; - T4 = 2.0 * T0 * 1.0e-3 ; - T5 = T1 / T2 ; - T6 = T4 / T2 ; - T3_dVb = T0 * Pb20b_dVb - - 0.5 * (T1_dVb + (T1_dVb * T5 + T6 * Pb20b_dVb ) ) ; - T3_dVd = T0 * Pb20b_dVd - - 0.5 * (T1_dVd + (T1_dVd * T5 + T6 * Pb20b_dVd ) ) ; - T3_dVg = T0 * Pb20b_dVg - - 0.5 * (T1_dVg + (T1_dVg * T5 + T6 * Pb20b_dVg ) ) ; - T3_dT = T0 * Pb20b_dT - - 0.5 * (T1_dT + (T1_dT * T5 + T6 * Pb20b_dT ) ) ; - Pbsum = Pb20b - T3 ; - Pbsum_dVb = Pb20b_dVb - T3_dVb ; - Pbsum_dVd = Pb20b_dVd - T3_dVd ; - Pbsum_dVg = Pb20b_dVg - T3_dVg ; - Pbsum_dT = Pb20b_dT - T3_dT ; - - sqrt_Pbsum = sqrt( Pbsum ) ; - - /*-------------------------------------------* - * dVthLP : Short-channel effect induced by pocket. - * - Vth0 : Vth without pocket. - *-----------------*/ - if ( model->HSMHV_lp != 0.0 ) { - T1 = here->HSMHV_2qnsub_esi ; - T2 = model->HSMHV_bs2 - Vbsz2 ; - T3 = T2 + small ; - T4 = sqrt (T3 * T3 + 4.0 * vth_dlt) ; - T5 = 0.5 * (T3 + T4) ; - T6 = 0.5 * (1.0 + T3 / T4) ; - T5_dVb = - Vbsz2_dVbs * T6 ; - T5_dVd = - Vbsz2_dVds * T6 ; - T5_dVg = - Vbsz2_dVgs * T6 ; - T5_dT = - Vbsz2_dT * T6 ; - T7 = 1.0 / T5 ; - bs12 = model->HSMHV_bs1 * T7 ; - T8 = - bs12 * T7 ; - bs12_dVb = T8 * T5_dVb ; - bs12_dVd = T8 * T5_dVd ; - bs12_dVg = T8 * T5_dVg ; - bs12_dT = T8 * T5_dT ; - Fn_SU( T10 , Vbsz2 + bs12, 0.93 * Pb20, vth_dlt, T0) ; - Qbmm = sqrt (T1 * (Pb20 - T10 )) ; - T9 = T0 / Qbmm ; - Qbmm_dVb = 0.5 * T1 * - (Vbsz2_dVbs + bs12_dVb) * T9 ; - Qbmm_dVd = 0.5 * T1 * - (Vbsz2_dVds + bs12_dVd) * T9 ; - Qbmm_dVg = 0.5 * T1 * - (Vbsz2_dVgs + bs12_dVg) * T9 ; - Qbmm_dT = 0.5 * T1 * - (Vbsz2_dT + bs12_dT) * T9 ; - - dqb = (Qb0 - Qbmm) * Cox_inv ; - dqb_dVb = Vthp_dVb - Qbmm_dVb * Cox_inv - Qbmm * Cox_inv_dVb ; - dqb_dVd = Vthp_dVd - Qbmm_dVd * Cox_inv - Qbmm * Cox_inv_dVd ; - dqb_dVg = Vthp_dVg - Qbmm_dVg * Cox_inv - Qbmm * Cox_inv_dVg ; - dqb_dT = Qb0_dT * Cox_inv + Qb0 * Cox_inv_dT - Qbmm_dT * Cox_inv - Qbmm * Cox_inv_dT ; - - T1 = 2.0 * C_QE * here->HSMHV_nsubc * C_ESI ; - T2 = sqrt( T1 * ( Pb2c - Vbsz2 ) ) ; - Vth0 = Pb2c + Vfb + T2 * Cox_inv ; - T3 = 0.5 * T1 / T2 * Cox_inv ; - Vth0_dVb = T3 * ( - Vbsz2_dVbs ) + T2 * Cox_inv_dVb ; - Vth0_dVd = T3 * ( - Vbsz2_dVds ) + T2 * Cox_inv_dVd ; - Vth0_dVg = T3 * ( - Vbsz2_dVgs ) + T2 * Cox_inv_dVg ; - Vth0_dT = T3 * ( - Vbsz2_dT ) + T2 * Cox_inv_dT ; - - T1 = C_ESI * Cox_inv ; - T2 = here->HSMHV_wdplp ; - T4 = 1.0e0 / ( model->HSMHV_lp * model->HSMHV_lp ) ; - T5 = 2.0e0 * ( model->HSMHV_vbi - Pb20b ) * T1 * T2 * T4 ; - dVth0 = T5 * sqrt_Pbsum ; - T6 = 0.5 * T5 / sqrt_Pbsum ; - T7 = 2.0e0 * ( model->HSMHV_vbi - Pb20b ) * C_ESI * T2 * T4 * sqrt_Pbsum ; - T8 = - 2.0e0 * T1 * T2 * T4 * sqrt_Pbsum ; - dVth0_dVb = T6 * Pbsum_dVb + T7 * Cox_inv_dVb + T8 * Pb20b_dVb ; - dVth0_dVd = T6 * Pbsum_dVd + T7 * Cox_inv_dVd + T8 * Pb20b_dVd ; - dVth0_dVg = T6 * Pbsum_dVg + T7 * Cox_inv_dVg + T8 * Pb20b_dVg ; - dVth0_dT = T6 * Pbsum_dT + T7 * Cox_inv_dT + T8 * Pb20b_dT ; - - T1 = Vthp - Vth0 ; - T1_dVb = Vthp_dVb - Vth0_dVb ; - T2 = pParam->HSMHV_scp1 + pParam->HSMHV_scp3 * Pbsum / model->HSMHV_lp ; - T2_dVb = pParam->HSMHV_scp3 * Pbsum_dVb / model->HSMHV_lp ; - T3 = T2 + pParam->HSMHV_scp2 * Vdsz ; - T3_dVb = T2_dVb + pParam->HSMHV_scp2 * Vdsz_dVbs ; - - - Vdx = model->HSMHV_scp21 + Vdsz ; - Vdx_dVbs = Vdsz_dVbs ; -/* Vdx_dT = Vdsz_dT ;*/ - Vdx2 = Vdx * Vdx ; - Vdx2_dVbs = 2 * Vdx_dVbs * Vdx ; -/* Vdx2_dT = 2 * Vdx_dT * Vdx ;*/ - - dVthLP = T1 * dVth0 * T3 + dqb - here->HSMHV_msc / Vdx2 ; - dVthLP_dVb = T1_dVb * dVth0 * T3 + T1 * dVth0_dVb * T3 + T1 * dVth0 * T3_dVb - + dqb_dVb + here->HSMHV_msc / Vdx2 /Vdx2 *Vdx2_dVbs; - T4 = T1 * dVth0 * pParam->HSMHV_scp3 / model->HSMHV_lp ; - dVthLP_dVd = (Vthp_dVd - Vth0_dVd) * dVth0 * T3 + T1 * dVth0_dVd * T3 - + T4 * Pbsum_dVd - + T1 * dVth0 * pParam->HSMHV_scp2 * Vdsz_dVds - + dqb_dVd - + 2.0e0 * here->HSMHV_msc * Vdx * Vdsz_dVds / ( Vdx2 * Vdx2 ) ; - dVthLP_dVg = (Vthp_dVg - Vth0_dVg) * dVth0 * T3 + T1 * dVth0_dVg * T3 - + T4 * Pbsum_dVg + dqb_dVg ; - dVthLP_dT = (Vthp_dT - Vth0_dT) * dVth0 * T3 + T1 * dVth0_dT * T3 - + T4 * Pbsum_dT - + T1 * dVth0 * pParam->HSMHV_scp2 * Vdsz_dT - + dqb_dT - + 2.0e0 * here->HSMHV_msc * Vdx * Vdsz_dT / ( Vdx2 * Vdx2 ); - } else { - dVthLP = 0.0e0 ; - dVthLP_dVb = 0.0e0 ; - dVthLP_dVd = 0.0e0 ; - dVthLP_dVg = 0.0e0 ; - dVthLP_dT = 0.0e0 ; - } - - /*---------------------------------------------------* - * dVthSC : Short-channel effect induced by Vds. - *-----------------*/ - T1 = C_ESI * Cox_inv ; - T2 = here->HSMHV_wdpl ; - T3 = here->HSMHV_lgate - model->HSMHV_parl2 ; - T4 = 1.0e0 / ( T3 * T3 ) ; - T5 = 2.0e0 * ( model->HSMHV_vbi - Pb20b ) * T1 * T2 * T4 ; - - dVth0 = T5 * sqrt_Pbsum ; - T6 = T5 / 2.0 / sqrt_Pbsum ; - T7 = 2.0e0 * ( model->HSMHV_vbi - Pb20b ) * C_ESI * T2 * T4 * sqrt_Pbsum ; - T8 = - 2.0e0 * T1 * T2 * T4 * sqrt_Pbsum ; - dVth0_dVb = T6 * Pbsum_dVb + T7 * Cox_inv_dVb + T8 * Pb20b_dVb ; - dVth0_dVd = T6 * Pbsum_dVd + T7 * Cox_inv_dVd + T8 * Pb20b_dVd ; - dVth0_dVg = T6 * Pbsum_dVg + T7 * Cox_inv_dVg + T8 * Pb20b_dVg ; - dVth0_dT = T6 * Pbsum_dT + T7 * Cox_inv_dT + T8 * Pb20b_dT ; - - T1 = pParam->HSMHV_sc3 / here->HSMHV_lgate ; - T4 = pParam->HSMHV_sc1 + T1 * Pbsum ; - T4_dVb = T1 * Pbsum_dVb ; - T4_dVd = T1 * Pbsum_dVd ; - T4_dVg = T1 * Pbsum_dVg ; - T4_dT = T1 * Pbsum_dT ; - - T5 = T4 + pParam->HSMHV_sc2 * Vdsz * ( 1.0 + model->HSMHV_sc4 * Pbsum ); - T5_dVb = T4_dVb + pParam->HSMHV_sc2 * Vdsz * model->HSMHV_sc4 * Pbsum_dVb - + pParam->HSMHV_sc2 * Vdsz_dVbs * model->HSMHV_sc4 * Pbsum; - T5_dVd = T4_dVd + pParam->HSMHV_sc2 * Vdsz_dVds * ( 1.0 + model->HSMHV_sc4 * Pbsum ) - + pParam->HSMHV_sc2 * Vdsz * model->HSMHV_sc4 * Pbsum_dVd; - T5_dVg = T4_dVg + pParam->HSMHV_sc2 * Vdsz * model->HSMHV_sc4 * Pbsum_dVg; - T5_dT = T4_dT + pParam->HSMHV_sc2 * Vdsz * model->HSMHV_sc4 * Pbsum_dT - + pParam->HSMHV_sc2 * Vdsz_dT * model->HSMHV_sc4 * Pbsum; - - dVthSC = dVth0 * T5 ; - dVthSC_dVb = dVth0_dVb * T5 + dVth0 * T5_dVb ; - dVthSC_dVd = dVth0_dVd * T5 + dVth0 * T5_dVd ; - dVthSC_dVg = dVth0_dVg * T5 + dVth0 * T5_dVg ; - dVthSC_dT = dVth0_dT * T5 + dVth0 * T5_dT ; - - /*---------------------------------------------------* - * dVthW : narrow-channel effect. - *-----------------*/ - T1 = 1.0 / Cox ; - T2 = T1 * T1 ; - T3 = 1.0 / ( Cox + pParam->HSMHV_wfc / Weff ) ; - T4 = T3 * T3 ; - T5 = T1 - T3 ; - T6 = Qb0 * ( T2 - T4 ) ; - - dVthW = Qb0 * T5 + pParam->HSMHV_wvth0 / here->HSMHV_wg ; - dVthW_dVb = Qb0_dVb * T5 - Cox_dVb * T6 ; - dVthW_dVd = Qb0_dVd * T5 - Cox_dVd * T6 ; - dVthW_dVg = - Cox_dVg * T6 ; - dVthW_dT = Qb0_dT * T5 - Cox_dT * T6 ; - - /*---------------------------------------------------* - * dVth : Total variation. - * - Positive dVth means the decrease in Vth. - *-----------------*/ - dVth = dVthSC + dVthLP + dVthW + here->HSMHV_dVthsm ; - dVth_dVb = dVthSC_dVb + dVthLP_dVb + dVthW_dVb ; - dVth_dVd = dVthSC_dVd + dVthLP_dVd + dVthW_dVd ; - dVth_dVg = dVthSC_dVg + dVthLP_dVg + dVthW_dVg ; - dVth_dT = dVthSC_dT + dVthLP_dT + dVthW_dT ; - - /*---------------------------------------------------* - * Vth : Threshold voltage. - *-----------------*/ - Vth = Vthq - dVth ; - - /*-----------------------------------------------------------* - * Constants in the equation of Ps0 . - *-----------------*/ - - fac1 = cnst0 * Cox_inv ; - fac1_dVbs = cnst0 * Cox_inv_dVb ; - fac1_dVds = cnst0 * Cox_inv_dVd ; - fac1_dVgs = cnst0 * Cox_inv_dVg ; - - fac1p2 = fac1 * fac1 ; - fac1_dT = Cox_inv * cnst0_dT ; - fac1p2_dT = 2.0 * fac1 * fac1_dT ; - - /*---------------------------------------------------* - * Poly-Depletion Effect - *-----------------*/ - - if ( here->HSMHV_flg_pgd == 0 ) { - dPpg = 0.0 ; - dPpg_dVb = 0.0 ; - dPpg_dVd = 0.0 ; - dPpg_dVg = 0.0 ; - dPpg_dT = 0.0 ; - } else { - T7 = Vgs ; - T7_dVd = 0.0 ; - T7_dVg = 1.0 ; - - T8 = Vds ; - T8_dVd = 1.0 ; - - T0 = here->HSMHV_cnstpgd ; - - TX = pParam->HSMHV_pgd3 ; - TY = FMDVDS * TX + ( 1.0 - FMDVDS ) * 0.5 ; - T1 = TX - 0.5 ; - TY_dVbs = T1 * FMDVDS_dVbs ; - TY_dVds = T1 * FMDVDS_dVds ; - TY_dVgs = T1 * FMDVDS_dVgs ; - - FMDVGS = 1.0 ; - FMDVGS_dVgs = 0.0 ; - if ( model->HSMHV_pgd2 > Vfb ) { - T1 = model->HSMHV_pgd2 - Vfb ; - T2 = ( Vgs - Vfb ) / T1 ; - Fn_SZ( T3 , T2 , 1e-3 , T4 ) ; - Fn_SU( T5 , T3 , 1.0 , 1e-3 , T6 ) ; - T5_dVg = T4 * T6 / T1 ; - FMDVGS = T5 * T5 ; - FMDVGS_dVgs = 2 * T5 * T5_dVg ; - } - FMDPG = FMDVDS * FMDVGS ; - FMDPG_dVbs = FMDVDS_dVbs * FMDVGS ; - FMDPG_dVds = FMDVDS_dVds * FMDVGS ; - FMDPG_dVgs = FMDVDS_dVgs * FMDVGS + FMDVDS * FMDVGS_dVgs ; - FMDPG_dT = FMDVDS_dT * FMDVGS ; - - - TX = pParam->HSMHV_pgd3 ; - TY = FMDPG * TX + ( 1.0 - FMDPG ) * 0.5 ; - T1 = TX - 0.5 ; - TY_dVbs = T1 * FMDPG_dVbs ; - TY_dVds = T1 * FMDPG_dVds ; - TY_dVgs = T1 * FMDPG_dVgs ; - TY_dT = T1 * FMDPG_dT ; - if ( TX == 0.0 ) { TY =0.0 ; TY_dVbs =0.0 ; TY_dVds =0.0 ; TY_dVgs =0.0 ; TY_dT =0.0 ; } - - T3 = T7 - model->HSMHV_pgd2 - TY * T8 ; - T3_dVb = - TY_dVbs * T8 ; - T3_dVd = T7_dVd - ( TY_dVds * T8 + TY * T8_dVd ) ; - T3_dVg = T7_dVg - ( TY_dVgs * T8 ) ; - T3_dT = - TY_dT * T8; - - Fn_ExpLim( dPpg , T3 , T6 ) ; - dPpg *= T0 ; - dPpg_dVb = T0 * T6 * T3_dVb ; - dPpg_dVd = T0 * T6 * T3_dVd ; - dPpg_dVg = T0 * T6 * T3_dVg ; - dPpg_dT = T0 * T6 * T3_dT ; - - Fn_SU( dPpg , dPpg , pol_b , pol_dlt , T9 ) ; - dPpg_dVb *= T9 ; - dPpg_dVd *= T9 ; - dPpg_dVg *= T9 ; - dPpg_dT *= T9 ; - - /* damping in accumulation zone */ - - T0 = Vfb + Vbsz ; - T0_dVb = Vbsz_dVbs ; - T1 = 0.6 * ( Vthq - T0 ) ; - T1_dVb = 0.6 * ( Vthq_dVb - Vbsz_dVbs ) ; - T1_dVd = 0.6 * ( Vthq_dVd - Vbsz_dVds ) ; - Fn_SZ( T1 , T1 , 1e-2 , T2 ) ; - T1_dVb *= T2 ; - T1_dVd *= T2 ; - T1 += T0 ; - T1_dVb += Vbsz_dVbs ; - T4 = 1.0 / ( T1 - T0 ) ; - T5 = T4 * T4 ; - T4_dVb = - ( T1_dVb - Vbsz_dVbs ) * T5 ; - T4_dVd = - ( T1_dVd ) * T5 ; - - T6 = Vgsz - T0 ; - T6_dVb = Vgsz_dVbs - T0_dVb ; - dmpacc = T6 * T4 ; - dmpacc_dVbs = T6 * T4_dVb + T6_dVb * T4 ; - dmpacc_dVds = T6 * T4_dVd + ( Vgsz_dVds - Vbsz_dVds ) * T4 ; - dmpacc_dVgs = Vgsz_dVgs * T4 ; - Fn_SZ( dmpacc , dmpacc , 0.3 , T1 ) ; - dmpacc_dVbs *= T1 ; - dmpacc_dVds *= T1 ; - dmpacc_dVgs *= T1 ; - Fn_SU( dmpacc , dmpacc ,1.0 , 0.1 , T1 ) ; - dmpacc_dVbs *= T1 ; - dmpacc_dVds *= T1 ; - dmpacc_dVgs *= T1 ; - - } - - /*---------------------------------------------------* - * Vgp : Effective gate bias with SCE & RSCE & flatband. - *-----------------*/ - Vgp = Vgs - Vfb + dVth - dPpg ; - Vgp_dVbs = dVth_dVb - dPpg_dVb ; - Vgp_dVds = dVth_dVd - dPpg_dVd ; - Vgp_dVgs = 1.0e0 + dVth_dVg - dPpg_dVg ; - Vgp_dT = dVth_dT - dPpg_dT ; - - - /*---------------------------------------------------* - * Vgs_fb : Actual flatband voltage taking account Vbscl. - * - note: if Vgs == Vgs_fb then Vgp == Ps0 == Vbscl . - *------------------*/ - Vgs_fb = Vfb - dVth + dPpg + Vbscl ; - - - /*---------------------------------------------------* - * Vfbsft : Vfb shift (trial for Vbscl >> 0) - *-----------------*/ - Vfbsft = 0.0 ; - Vfbsft_dVbs = 0.0 ; - Vfbsft_dVds = 0.0 ; - Vfbsft_dVgs = 0.0 ; - - if ( Vbscl > 0.0 ) { - /* values at D2/D3 boundary + beta */ - /* Ps0 */ - T1 = Vbscl + ( znbd5 + 1 ) * beta_inv ; - T1_dT = Vbscl_dT + ( znbd5 + 1 ) * beta_inv_dT ; - /* Qb0 */ - /* T2 = cnst0 * sqrt( znbd5 ) */ - T2 = cnst0 * 2.23606797749979 ; - T2_dT = cnst0_dT * 2.23606797749979 ; - - /* Vgp assuming Qn0=0 */ - T3 = T2 * Cox_inv + T1 ; - T3_dT = T2_dT * Cox_inv + T1_dT ; - - /* Vgp difference */ - TX = T3 - Vgp ; - TX_dVbs = T2 * Cox_inv_dVb + Vbscl_dVbs - Vgp_dVbs ; - TX_dVds = T2 * Cox_inv_dVd - Vgp_dVds ; - TX_dVgs = T2 * Cox_inv_dVg - Vgp_dVgs ; - TX_dT = T3_dT - Vgp_dT ; - - /* set lower limit to 0 */ - Fn_SZ( TX , TX , 0.1 , T4 ) ; - TX_dVbs *= T4 ; - TX_dVds *= T4 ; - TX_dVgs *= T4 ; - TX_dT *= T4 ; - - /* TY: damping factor */ - T1 = 0.5 ; - T5 = Vbscl / T1 ; - T5_dVb = Vbscl_dVbs / T1 ; - T5_dT = Vbscl_dT / T1 ; - T0 = T5 * T5 ; - T6 = T0 * T0 ; - T6_dVb = 4 * T0 * T5 * T5_dVb ; - T6_dT = 4 * T0 * T5 * T5_dT ; - T7 = 1.0 / ( 1.0 + T6 ) ; - T8 = T7 * T7 ; - TY = 1.0 - T7 ; - TY_dVbs = T8 * T6_dVb ; - TY_dT = T8 * T6_dT ; - - TX = TY = 0.0 ; - Vfbsft = TX * TY ; - Vfbsft_dVbs = TX_dVbs * TY + TX * TY_dVbs ; - Vfbsft_dVds = TX_dVds * TY ; - Vfbsft_dVgs = TX_dVgs * TY ; - Vfbsft_dT = TX_dT * TY + TX * TY_dT ; - - Vgs_fb -= Vfbsft ; - - Vgp += Vfbsft ; - Vgp_dVbs += Vfbsft_dVbs ; - Vgp_dVds += Vfbsft_dVds ; - Vgp_dVgs += Vfbsft_dVgs ; - Vgp_dT += Vfbsft_dT ; - - } - - - /*-----------------------------------------------------------* - * Accumulation zone. (zone-A) - * - evaluate basic characteristics and exit from this part. - *-----------------*/ - if ( Vgs < Vgs_fb ) { - - flg_zone = -1 ; - - /*---------------------------------------------------* - * Evaluation of Ps0. - * - Psa : Analytical solution of - * Cox( Vgp - Psa ) = cnst0 * Qacc - * where Qacc is the 3-degree series of (fdep)^{1/2}. - * The unkown is transformed to Chi=beta(Ps0-Vbs). - * - Ps0_min : |Ps0_min| when Vbs=0. - *-----------------*/ - Ps0_min = here->HSMHV_eg - Pb2 ; - Ps0_min_dT = Eg_dT - Pb2_dT ; - - TX = beta * ( Vgp - Vbscl ) ; - TX_dVbs = beta * ( Vgp_dVbs - Vbscl_dVbs ) ; - TX_dVds = beta * Vgp_dVds ; - TX_dVgs = beta * Vgp_dVgs ; - TX_dT = beta_dT * ( Vgp - Vbscl ) + beta * ( Vgp_dT - Vbscl_dT ); - - T1 = 1.0 / ( beta * cnst0 ) ; - TY = T1 * Cox ; - TY_dVbs = T1 * Cox_dVb ; - TY_dVds = T1 * Cox_dVd ; - TY_dVgs = T1 * Cox_dVg ; - T1_dT = - T1 / ( beta * cnst0 ) * ( beta_dT * cnst0 + beta * cnst0_dT ) ; - TY_dT = T1_dT * Cox ; - - Ac41 = 2.0 + 3.0 * C_SQRT_2 * TY ; - - Ac4 = 8.0 * Ac41 * Ac41 * Ac41 ; - T1 = 72.0 * Ac41 * Ac41 * C_SQRT_2 ; - Ac4_dVbs = T1 * TY_dVbs ; - Ac4_dVds = T1 * TY_dVds ; - Ac4_dVgs = T1 * TY_dVgs ; - Ac4_dT = T1 * TY_dT ; - - T4 = ( TX - 2.0 ) ; - T5 = 9.0 * TY * T4 ; - T5_dVb = 9.0 * ( TY_dVbs * T4 + TY * TX_dVbs ) ; - T5_dVd = 9.0 * ( TY_dVds * T4 + TY * TX_dVds ) ; - T5_dVg = 9.0 * ( TY_dVgs * T4 + TY * TX_dVgs ) ; - T5_dT = 9.0 * ( TY_dT * T4 + TY * TX_dT ) ; - - - Ac31 = 7.0 * C_SQRT_2 - T5 ; - Ac31_dVbs = -T5_dVb ; - Ac31_dVds = -T5_dVd ; - Ac31_dVgs = -T5_dVg ; - Ac31_dT = -T5_dT ; - - Ac3 = Ac31 * Ac31 ; - T1 = 2.0 * Ac31 ; - Ac3_dVbs = T1 * Ac31_dVbs ; - Ac3_dVds = T1 * Ac31_dVds ; - Ac3_dVgs = T1 * Ac31_dVgs ; - Ac3_dT = T1 * Ac31_dT ; - - Ac2 = sqrt( Ac4 + Ac3 ) ; - T1 = 0.5 / Ac2 ; - Ac2_dVbs = T1 * ( Ac4_dVbs + Ac3_dVbs ) ; - Ac2_dVds = T1 * ( Ac4_dVds + Ac3_dVds ) ; - Ac2_dVgs = T1 * ( Ac4_dVgs + Ac3_dVgs ) ; - Ac2_dT = T1 * ( Ac4_dT + Ac3_dT ) ; - - - Ac1 = -7.0 * C_SQRT_2 + Ac2 + T5 ; - Ac1_dVbs = Ac2_dVbs + T5_dVb ; - Ac1_dVds = Ac2_dVds + T5_dVd ; - Ac1_dVgs = Ac2_dVgs + T5_dVg ; - Ac1_dT = Ac2_dT + T5_dT ; - - Acd = Fn_Pow( Ac1 , C_1o3 ) ; - T1 = C_1o3 / ( Acd * Acd ) ; - Acd_dVbs = Ac1_dVbs * T1 ; - Acd_dVds = Ac1_dVds * T1 ; - Acd_dVgs = Ac1_dVgs * T1 ; - Acd_dT = Ac1_dT * T1 ; - - Acn = -4.0 * C_SQRT_2 - 12.0 * TY + 2.0 * Acd + C_SQRT_2 * Acd * Acd ; - T1 = 2.0 + 2.0 * C_SQRT_2 * Acd ; - Acn_dVbs = - 12.0 * TY_dVbs + T1 * Acd_dVbs ; - Acn_dVds = - 12.0 * TY_dVds + T1 * Acd_dVds ; - Acn_dVgs = - 12.0 * TY_dVgs + T1 * Acd_dVgs ; - Acn_dT = - 12.0 * TY_dT + T1 * Acd_dT ; - - - T1 = 1.0 / Acd ; - Chi = Acn * T1 ; - Chi_dVbs = ( Acn_dVbs - Chi * Acd_dVbs ) * T1 ; - Chi_dVds = ( Acn_dVds - Chi * Acd_dVds ) * T1 ; - Chi_dVgs = ( Acn_dVgs - Chi * Acd_dVgs ) * T1 ; - Chi_dT = ( Acn_dT - Chi * Acd_dT ) * T1 ; - - - Psa = Chi * beta_inv + Vbscl ; - Psa_dVbs = Chi_dVbs * beta_inv + Vbscl_dVbs ; - Psa_dVds = Chi_dVds * beta_inv ; - Psa_dVgs = Chi_dVgs * beta_inv ; - Psa_dT = Chi_dT * beta_inv + Chi * beta_inv_dT + Vbscl_dT; - - T1 = Psa - Vbscl ; - T1_dT = Psa_dT - Vbscl_dT ; - T2 = T1 / Ps0_min ; - T2_dT = ( T1_dT * Ps0_min - T1 * Ps0_min_dT ) / ( Ps0_min * Ps0_min ) ; - T3 = sqrt( 1.0 + ( T2 * T2 ) ) ; - - T3_dT = 1.0 / T3 * T2 * T2_dT ; - - T9 = T2 / T3 / Ps0_min ; - T3_dVb = T9 * ( Psa_dVbs - Vbscl_dVbs ) ; - T3_dVd = T9 * ( Psa_dVds ) ; - T3_dVg = T9 * ( Psa_dVgs ) ; - - Ps0 = T1 / T3 + Vbscl ; - T9 = 1.0 / ( T3 * T3 ) ; - Ps0_dVbs = T9 * ( ( Psa_dVbs - Vbscl_dVbs ) * T3 - T1 * T3_dVb ) + Vbscl_dVbs ; - Ps0_dVds = T9 * ( Psa_dVds * T3 - T1 * T3_dVd ) ; - Ps0_dVgs = T9 * ( Psa_dVgs * T3 - T1 * T3_dVg ) ; - Ps0_dT = T9 * ( ( Psa_dT - Vbscl_dT )* T3 - T1 * T3_dT ) + Vbscl_dT; - - /*---------------------------------------------------* - * Characteristics. - *-----------------*/ - Psl = Ps0 ; - Psl_dVbs = Ps0_dVbs ; - Psl_dVds = Ps0_dVds ; - Psl_dVgs = Ps0_dVgs ; - Psl_dT = Ps0_dT ; - - /** (reminder) - Psdl = Psl ; - Psdl_dVbs = Psl_dVbs ; - Psdl_dVds = Psl_dVds ; - Psdl_dVgs = Psl_dVgs ; - **/ - - T2 = ( Vgp - Ps0 ) ; - T2_dT = Vgp_dT - Ps0_dT ; - Qbu = Cox * T2 ; - Qbu_dVbs = Cox * ( Vgp_dVbs - Ps0_dVbs ) + Cox_dVb * T2 ; - Qbu_dVds = Cox * ( Vgp_dVds - Ps0_dVds ) + Cox_dVd * T2 ; - Qbu_dVgs = Cox * ( Vgp_dVgs - Ps0_dVgs ) + Cox_dVg * T2 ; - Qbu_dT = Cox * T2_dT ; - - Qiu = 0.0e0 ; - Qiu_dVbs = 0.0e0 ; - Qiu_dVds = 0.0e0 ; - Qiu_dVgs = 0.0e0 ; - Qiu_dT = 0.0e0 ; - - Qdrat = 0.0e0 ; - Qdrat_dVbs = 0.0e0 ; - Qdrat_dVds = 0.0e0 ; - Qdrat_dVgs = 0.0e0 ; - Qdrat_dT = 0.0 ; - - Lred = 0.0e0 ; - Lred_dVbs = 0.0e0 ; - Lred_dVds = 0.0e0 ; - Lred_dVgs = 0.0e0 ; - Lred_dT = 0.0e0 ; - - Ids = 0.0e0 ; - Ids_dVbs = 0.0e0 ; - Ids_dVds = 0.0e0 ; - Ids_dVgs = 0.0e0 ; - Ids_dT = 0.0e0 ; - - VgVt = 0.0 ; - - flg_noqi = 1 ; - - goto end_of_part_1 ; - } - - - /*-----------------------------------------------------------* - * Initial guess for Ps0. - *-----------------*/ - - /*---------------------------------------------------* - * Ps0_iniA: solution of subthreshold equation assuming zone-D1/D2. - *-----------------*/ - TX = 1.0e0 + 4.0e0 - * ( beta * ( Vgp - Vbscl ) - 1.0e0 ) / ( fac1p2 * beta2 ) ; - TX = Fn_Max( TX , epsm10 ) ; - Ps0_iniA = Vgp + fac1p2 * beta * 0.5 * ( 1.0e0 - sqrt( TX ) ) ; - - /* use analytical value in subthreshold region. */ - if ( Vgs < ( Vfb + Vth ) * 0.5 ) { - flg_pprv = 0 ; - } - - - if ( flg_pprv >= 1 ) { - /*---------------------------------------------------* - * Use previous value. - *-----------------*/ - - T1 = Ps0_dVbs * dVbs + Ps0_dVds * dVds + Ps0_dVgs * dVgs ; - Ps0_ini = Ps0 + T1 ; - - T2 = here->HSMHV_ps0_dtemp_prv * Temp_dif ; - if ( fabs( T1 + T2 ) < dP_max ) { Ps0_ini += T2 ; } - - if ( flg_pprv == 2 ) { - /* TX_dVxs = d^2 Ps0 / d Vxs^2 here */ - if ( Vbsc_dif2 > epsm10 ) { - TX_dVbs = ( here->HSMHV_ps0_dvbs_prv - here->HSMHV_ps0_dvbs_prv2 ) - / Vbsc_dif2 ; - } else { - TX_dVbs = 0.0 ; - } - if ( Vdsc_dif2 > epsm10 ) { - TX_dVds = ( here->HSMHV_ps0_dvds_prv - here->HSMHV_ps0_dvds_prv2 ) - / Vdsc_dif2 ; - } else { - TX_dVds = 0.0 ; - } - if ( Vgsc_dif2 > epsm10 ) { - TX_dVgs = ( here->HSMHV_ps0_dvgs_prv - here->HSMHV_ps0_dvgs_prv2 ) - / Vgsc_dif2 ; - } else { - TX_dVgs = 0.0 ; - } - T2 = ( dVbs * dVbs ) / 2 * TX_dVbs - + ( dVds * dVds ) / 2 * TX_dVds - + ( dVgs * dVgs ) / 2 * TX_dVgs ; - - if ( fabs( T2 ) < fabs( 0.5 * T1 ) ) { - Ps0_ini += T2 ; - } else { - flg_pprv = 1 ; - } - } - - T1 = Ps0_ini - Ps0 ; - if ( T1 < - dP_max || T1 > dP_max ) { - flg_pprv = 0 ; /* flag changes to analytical */ - } else { - Ps0_iniA = Fn_Max( Ps0_ini , Ps0_iniA ) ; - } - } /* end of (flg_pprv >=1) if-block */ - - if ( flg_pprv == 0 ) { - - /*---------------------------------------------------* - * Analytical initial guess. - *-----------------*/ - /*-------------------------------------------* - * Common part. - *-----------------*/ - Chi = beta * ( Ps0_iniA - Vbscl ) ; - - if ( Chi < znbd3 ) { - /*-----------------------------------* - * zone-D1/D2 - * - Ps0_ini is the analytical solution of Qs=Qb0 with - * Qb0 being approximated to 3-degree polynomial. - *-----------------*/ - TY = beta * ( Vgp - Vbscl ) ; - T1 = 1.0e0 / ( cn_nc3 * beta * fac1 ) ; - T2 = 81.0 + 3.0 * T1 ; - T3 = -2916.0 - 81.0 * T1 + 27.0 * T1 * TY ; - T4 = 1458.0 - 81.0 * ( 54.0 + T1 ) + 27.0 * T1 * TY ; - T4 = T4 * T4 ; - T5 = Fn_Pow( T3 + sqrt( 4 * T2 * T2 * T2 + T4 ) , C_1o3 ) ; - TX = 3.0 - ( C_2p_1o3 * T2 ) / ( 3.0 * T5 ) - + 1 / ( 3.0 * C_2p_1o3 ) * T5 ; - - Ps0_iniA = TX * beta_inv + Vbscl ; - Ps0_ini = Ps0_iniA ; - - } else if ( Vgs <= Vth ) { - /*-----------------------------------* - * Weak inversion zone. - *-----------------*/ - Ps0_ini = Ps0_iniA ; - - } else { - /*-----------------------------------* - * Strong inversion zone. - * - Ps0_iniB : upper bound. - *-----------------*/ - T1 = 1.0 / cnst1 / cnstCoxi ; - T2 = T1 * Vgp * Vgp ; - T3 = beta + 2.0 / Vgp ; - - Ps0_iniB = log( T2 ) / T3 ; - - Fn_SU( Ps0_ini , Ps0_iniA, Ps0_iniB, c_ps0ini_2, T1) ; - } - } - - TX = Vbscl + ps_conv / 2 ; - if ( Ps0_ini < TX ) Ps0_ini = TX ; - - - /*---------------------------------------------------* - * Assign initial guess. - *-----------------*/ - Ps0 = Ps0_ini ; - Psl_lim = Ps0_iniA ; - - /*---------------------------------------------------* - * Calculation of Ps0. (beginning of Newton loop) - * - Fs0 : Fs0 = 0 is the equation to be solved. - * - dPs0 : correction value. - *-----------------*/ - exp_bVbs = exp( beta * Vbscl ) ; - cfs1 = cnst1 * exp_bVbs ; - - flg_conv = 0 ; - for ( lp_s0 = 1 ; lp_s0 <= lp_s0_max + 1 ; lp_s0 ++ ) { - - Chi = beta * ( Ps0 - Vbscl ) ; - - if ( Chi < znbd5 ) { - /*-------------------------------------------* - * zone-D1/D2. (Ps0) - * - Qb0 is approximated to 5-degree polynomial. - *-----------------*/ - fi = Chi * Chi * Chi - * ( cn_im53 + Chi * ( cn_im54 + Chi * cn_im55 ) ) ; - fi_dChi = Chi * Chi - * ( 3 * cn_im53 + Chi * ( 4 * cn_im54 + Chi * 5 * cn_im55 ) ) ; - - fs01 = cfs1 * fi * fi ; - fs01_dPs0 = cfs1 * beta * 2 * fi * fi_dChi ; - - fb = Chi * ( cn_nc51 - + Chi * ( cn_nc52 - + Chi * ( cn_nc53 - + Chi * ( cn_nc54 + Chi * cn_nc55 ) ) ) ) ; - fb_dChi = cn_nc51 - + Chi * ( 2 * cn_nc52 - + Chi * ( 3 * cn_nc53 - + Chi * ( 4 * cn_nc54 + Chi * 5 * cn_nc55 ) ) ) ; - - fs02 = sqrt( fb * fb + fs01 ) ; - fs02_dPs0 = ( beta * fb_dChi * 2 * fb + fs01_dPs0 ) / ( fs02 + fs02 ) ; - - } else { - /*-------------------------------------------* - * zone-D3. (Ps0) - *-----------------*/ - if ( Chi < large_arg ) { /* avoid exp_Chi to become extremely large */ - exp_Chi = exp( Chi ) ; - fs01 = cfs1 * ( exp_Chi - 1.0e0 ) ; - fs01_dPs0 = cfs1 * beta * ( exp_Chi ) ; - } else { - exp_bPs0 = exp( beta*Ps0 ) ; - fs01 = cnst1 * ( exp_bPs0 - exp_bVbs ) ; - fs01_dPs0 = cnst1 * beta * exp_bPs0 ; - } - fs02 = sqrt( Chi - 1.0 + fs01 ) ; - fs02_dPs0 = ( beta + fs01_dPs0 ) / ( fs02 + fs02 ) ; - } /* end of if ( Chi ... ) else block */ - - Fs0 = Vgp - Ps0 - fac1 * fs02 ; - Fs0_dPs0 = - 1.0e0 - fac1 * fs02_dPs0 ; - - if ( flg_conv == 1 ) break ; - - dPs0 = - Fs0 / Fs0_dPs0 ; - - - /*-------------------------------------------* - * Update Ps0 . - * - clamped to Vbscl if Ps0 < Vbscl . - *-----------------*/ - dPlim = 0.5*dP_max*(1.0 + Fn_Max(1.e0,fabs(Ps0))) ; - if ( fabs( dPs0 ) > dPlim ) dPs0 = dPlim * Fn_Sgn( dPs0 ) ; - - Ps0 = Ps0 + dPs0 ; - - TX = Vbscl + ps_conv / 2 ; - if ( Ps0 < TX ) Ps0 = TX ; - - /*-------------------------------------------* - * Check convergence. - * NOTE: This condition may be too rigid. - *-----------------*/ - if ( fabs( dPs0 ) <= ps_conv && fabs( Fs0 ) <= gs_conv ) { - flg_conv = 1 ; - } - - } /* end of Ps0 Newton loop */ - - /* Reduce loop count to exclude the sweep for derivative calculation */ - lp_s0 -- ; - - /*-------------------------------------------* - * Procedure for diverged case. - *-----------------*/ - if ( flg_conv == 0 ) { - fprintf( stderr , - "*** warning(HiSIM_HV): Went Over Iteration Maximum (Ps0)\n" ) ; - fprintf( stderr , - " Vbse = %7.3f Vdse = %7.3f Vgse = %7.3f\n" , - Vbse , Vdse , Vgse ) ; - if ( flg_info >= 2 ) { - printf( "*** warning(HiSIM_HV): Went Over Iteration Maximum (Ps0)\n" ) ; - } - } - - /*---------------------------------------------------* - * Evaluate derivatives of Ps0. - * - note: Here, fs01_dVbs and fs02_dVbs are derivatives - * w.r.t. explicit Vbs. So, Ps0 in the fs01 and fs02 - * expressions is regarded as a constant. - *-----------------*/ - /* self heating */ - Chi_dT = beta_dT *( Ps0 - Vbscl ) - beta * Vbscl_dT ; - exp_bVbs_dT = ( beta_dT * Vbscl + beta * Vbscl_dT ) * exp_bVbs ; - cfs1_dT = exp_bVbs * cnst1_dT + exp_bVbs_dT * cnst1 ; - - /* derivatives of fs0* w.r.t. explicit Vbs */ - if ( Chi < znbd5 ) { - fs01_dVbs = cfs1 * beta * fi * ( fi - 2 * fi_dChi ) * Vbscl_dVbs ; - fs01_dT = cfs1 * 2 * fi * fi_dChi * Chi_dT + fi * fi * cfs1_dT ; - T2 = 1.0e0 / ( fs02 + fs02 ) ; - fs02_dVbs = ( - beta * Vbscl_dVbs * fb_dChi * 2 * fb + fs01_dVbs ) * T2 ; - fs02_dT = ( 2 * fb * fb_dChi * Chi_dT + fs01_dT ) * T2 ; - } else { - if ( Chi < large_arg ) { - fs01_dVbs = - cfs1 * beta * Vbscl_dVbs ; - exp_Chi_dT = exp_Chi * Chi_dT ; - fs01_dT = ( exp_Chi - 1.0e0 ) * cfs1_dT + cfs1 * exp_Chi_dT ; - } else { - fs01_dVbs = - cfs1 * beta * Vbscl_dVbs ; - exp_bPs0_dT = exp_bPs0 * Ps0 * beta_dT ; - fs01_dT = cnst1_dT*(exp_bPs0-exp_bVbs) + cnst1*(exp_bPs0_dT-exp_bVbs_dT) ; - } - T2 = 0.5e0 / fs02 ; - fs02_dVbs = ( - beta * Vbscl_dVbs + fs01_dVbs ) * T2 ; - fs02_dT = T2 * ( Chi_dT + fs01_dT ) ; - } - - T1 = 1.0 / Fs0_dPs0 ; - Ps0_dVbs = - ( Vgp_dVbs - ( fac1 * fs02_dVbs + fac1_dVbs * fs02 ) ) * T1 ; - Ps0_dVds = - ( Vgp_dVds - fac1_dVds * fs02 ) * T1 ; - Ps0_dVgs = - ( Vgp_dVgs - fac1_dVgs * fs02 ) * T1 ; - Ps0_dT = - ( Vgp_dT - ( fac1 * fs02_dT + fac1_dT * fs02 ) ) * T1 ; - - Chi_dT = beta_dT *( Ps0 - Vbscl ) + beta * ( Ps0_dT - Vbscl_dT ) ; - - if ( Chi < znbd5 ) { - /*-------------------------------------------* - * zone-D1/D2. (Ps0) - * Xi0 := fdep0^2 = fb * fb [D1,D2] - *-----------------*/ - Xi0 = fb * fb + epsm10 ; - T1 = 2 * fb * fb_dChi * beta ; - Xi0_dVbs = T1 * ( Ps0_dVbs - Vbscl_dVbs ) ; - Xi0_dVds = T1 * Ps0_dVds ; - Xi0_dVgs = T1 * Ps0_dVgs ; - Xi0_dT = 2 * fb * fb_dChi * Chi_dT ; - - Xi0p12 = fb + epsm10 ; - T1 = fb_dChi * beta ; - Xi0p12_dVbs = T1 * ( Ps0_dVbs - Vbscl_dVbs ) ; - Xi0p12_dVds = T1 * Ps0_dVds ; - Xi0p12_dVgs = T1 * Ps0_dVgs ; - Xi0p12_dT = fb_dChi * Chi_dT ; - - Xi0p32 = fb * fb * fb + epsm10 ; - T1 = 3 * fb * fb * fb_dChi * beta ; - Xi0p32_dVbs = T1 * ( Ps0_dVbs - Vbscl_dVbs ) ; - Xi0p32_dVds = T1 * Ps0_dVds ; - Xi0p32_dVgs = T1 * Ps0_dVgs ; - Xi0p32_dT = 3 * fb * fb * fb_dChi * Chi_dT ; - - fs01_dT = cfs1 * 2 * fi * fi_dChi * Chi_dT + fi * fi * cfs1_dT ; - fs02_dT = ( 2 * fb * fb_dChi * Chi_dT + fs01_dT ) * T2 ; - - } else { - /*-------------------------------------------* - * zone-D3. (Ps0) - *-----------------*/ - flg_zone = 3 ; - flg_noqi = 0 ; - - /*-----------------------------------* - * Xi0 := fdep0^2 = Chi - 1 = beta * ( Ps0 - Vbscl ) - 1 [D3] - *-----------------*/ - Xi0 = Chi - 1.0e0 ; - Xi0_dVbs = beta * ( Ps0_dVbs - Vbscl_dVbs ) ; - Xi0_dVds = beta * Ps0_dVds ; - Xi0_dVgs = beta * Ps0_dVgs ; - Xi0_dT = Chi_dT ; - - Xi0p12 = sqrt( Xi0 ) ; - T1 = 0.5e0 / Xi0p12 ; - Xi0p12_dVbs = T1 * Xi0_dVbs ; - Xi0p12_dVds = T1 * Xi0_dVds ; - Xi0p12_dVgs = T1 * Xi0_dVgs ; - Xi0p12_dT = T1 * Xi0_dT ; - - Xi0p32 = Xi0 * Xi0p12 ; - T1 = 1.5e0 * Xi0p12 ; - Xi0p32_dVbs = T1 * Xi0_dVbs ; - Xi0p32_dVds = T1 * Xi0_dVds ; - Xi0p32_dVgs = T1 * Xi0_dVgs ; - Xi0p32_dT = T1 * Xi0_dT ; - - if ( Chi < large_arg ) { - exp_Chi_dT = exp_Chi * Chi_dT ; - fs01_dT = ( exp_Chi - 1.0e0 ) * cfs1_dT + cfs1 * exp_Chi_dT ; - } else { - exp_bPs0_dT = exp_bPs0 * (beta_dT * Ps0 + beta * Ps0_dT) ; - fs01_dT = cnst1_dT*(exp_bPs0-exp_bVbs) + cnst1*(exp_bPs0_dT-exp_bVbs_dT) ; - } - fs02_dT = T2 * ( Chi_dT + fs01_dT ) ; - - } /* end of if ( Chi ... ) block */ - - /*-----------------------------------------------------------* - * - Recalculate the derivatives of fs01 and fs02. - * note: fs01 = cnst1 * exp( Vbs ) * ( exp( Chi ) - Chi - 1.0e0 ) ; - * fs02 = sqrt( Xi0 + fs01 ) ; - *-----------------*/ - fs01_dVbs = Ps0_dVbs * fs01_dPs0 + fs01_dVbs ; - fs01_dVds = Ps0_dVds * fs01_dPs0 ; - fs01_dVgs = Ps0_dVgs * fs01_dPs0 ; - fs02_dVbs = Ps0_dVbs * fs02_dPs0 + fs02_dVbs ; - fs02_dVds = Ps0_dVds * fs02_dPs0 ; - fs02_dVgs = Ps0_dVgs * fs02_dPs0 ; - - /*-----------------------------------------------------------* - * Qb0 : Qb at source side. - * Qn0 : Qi at source side. - *-----------------*/ - - Qb0 = cnst0 * Xi0p12 ; - Qb0_dVb = cnst0 * Xi0p12_dVbs ; - Qb0_dVd = cnst0 * Xi0p12_dVds ; - Qb0_dVg = cnst0 * Xi0p12_dVgs ; - Qb0_dT = cnst0 * Xi0p12_dT + cnst0_dT * Xi0p12 ; - - T1 = 1.0 / ( fs02 + Xi0p12 ) ; - Qn0 = cnst0 * fs01 * T1 ; - T1_dT = - T1 * T1 * ( fs02_dT + Xi0p12_dT ) ; - Qn0_dT = cnst0 * ( fs01 * T1_dT + T1 * fs01_dT ) + fs01 * T1 * cnst0_dT ; - - T2 = 1.0 / ( fs01 + epsm10 ) ; - - Qn0_dVbs = Qn0 * ( fs01_dVbs * T2 - ( fs02_dVbs + Xi0p12_dVbs ) * T1 ) ; - Qn0_dVds = Qn0 * ( fs01_dVds * T2 - ( fs02_dVds + Xi0p12_dVds ) * T1 ) ; - Qn0_dVgs = Qn0 * ( fs01_dVgs * T2 - ( fs02_dVgs + Xi0p12_dVgs ) * T1 ) ; - - - /*-----------------------------------------------------------* - * zone-D1 and D2 - *-----------------*/ - if ( Chi < znbd5 ) { - if ( Chi < znbd3 ) { - /*-------------------------------------------* - * zone-D1. (Ps0) - *-----------------*/ - flg_zone = 1 ; - flg_noqi = 1 ; /** !! to be revisited !! **/ - - Qiu = Qn0 ; - Qiu_dVbs = Qn0_dVbs ; - Qiu_dVds = Qn0_dVds ; - Qiu_dVgs = Qn0_dVgs ; - Qiu_dT = Qn0_dT; - - Qbu = Qb0 ; - Qbu_dVbs = Qb0_dVb ; - Qbu_dVds = Qb0_dVd ; - Qbu_dVgs = Qb0_dVg ; - Qbu_dT = Qb0_dT ; - - Qdrat = 0.5 ; - Qdrat_dVbs = 0.0 ; - Qdrat_dVds = 0.0 ; - Qdrat_dVgs = 0.0 ; - Qdrat_dT = 0.0; - - Lred = 0.0e0 ; - Lred_dVbs = 0.0e0 ; - Lred_dVds = 0.0e0 ; - Lred_dVgs = 0.0e0 ; - Lred_dT = 0.0e0 ; - - /** (reminder) - *Psdl = Psl ; - *Psdl_dVbs = Psl_dVbs ; - *Psdl_dVds = Psl_dVds ; - *Psdl_dVgs = Psl_dVgs ; - **/ - - } else { - /*-------------------------------------------* - * zone-D2 (Ps0) - *-----------------*/ - flg_zone = 2 ; - flg_noqi = 0 ; - /*-----------------------------------------------------------* - * FD2 : connecting function for zone-D2. - * - Qiu, Qbu, Qdrat and Lred should be interpolated later. - *-----------------*/ - T1 = 1.0 / ( znbd5 - znbd3 ) ; - TX = T1 * ( Chi - znbd3 ) ; - TX_dVbs = beta * T1 * ( Ps0_dVbs - Vbscl_dVbs ) ; - TX_dVds = beta * T1 * Ps0_dVds ; - TX_dVgs = beta * T1 * Ps0_dVgs ; - TX_dT = T1 * Chi_dT ; - - FD2 = TX * TX * TX * ( 10.0 + TX * ( -15.0 + TX * 6.0 ) ) ; - T4 = TX * TX * ( 30.0 + TX * ( -60.0 + TX * 30.0 ) ) ; - - FD2_dVbs = T4 * TX_dVbs ; - FD2_dVds = T4 * TX_dVds ; - FD2_dVgs = T4 * TX_dVgs ; - FD2_dT = T4 * TX_dT ; - - } /* end of zone-D2 */ - } - - - /*---------------------------------------------------* - * VgVt : Vgp - Vth_qi. ( Vth_qi is Vth for Qi evaluation. ) - *-----------------*/ - VgVt = Qn0 * Cox_inv ; - VgVt_dVbs = Qn0_dVbs * Cox_inv + Qn0 * Cox_inv_dVb ; - VgVt_dVds = Qn0_dVds * Cox_inv + Qn0 * Cox_inv_dVd ; - VgVt_dVgs = Qn0_dVgs * Cox_inv + Qn0 * Cox_inv_dVg ; - VgVt_dT = Qn0_dT * Cox_inv ; - - /*-----------------------------------------------------------* - * make Qi=Qd=Ids=0 if VgVt <= VgVt_small - *-----------------*/ - if ( VgVt <= VgVt_small ) { - flg_zone = 4 ; - flg_noqi = 1 ; - - Psl = Ps0 ; - Psl_dVbs = Ps0_dVbs ; - Psl_dVds = Ps0_dVds ; - Psl_dVgs = Ps0_dVgs ; - Psl_dT = Ps0_dT ; - - /** (reminder) - *Psdl = Psl ; - *Psdl_dVbs = Psl_dVbs ; - *Psdl_dVds = Psl_dVds ; - *Psdl_dVgs = Psl_dVgs ; - **/ - - Pds = 0.0 ; - Pds_dVbs = 0.0 ; - Pds_dVds = 0.0 ; - Pds_dVgs = 0.0 ; - Pds_dT = 0.0 ; - - Qbu = Qb0 ; - Qbu_dVbs = Qb0_dVb ; - Qbu_dVds = Qb0_dVd ; - Qbu_dVgs = Qb0_dVg ; - Qbu_dT = Qb0_dT ; - - Qiu = 0.0 ; - Qiu_dVbs = 0.0 ; - Qiu_dVds = 0.0 ; - Qiu_dVgs = 0.0 ; - Qiu_dT = 0.0 ; - - Qdrat = 0.5 ; - Qdrat_dVbs = 0.0 ; - Qdrat_dVds = 0.0 ; - Qdrat_dVgs = 0.0 ; - Qdrat_dT = 0.0 ; - - Lred = 0.0 ; - Lred_dVbs = 0.0 ; - Lred_dVds = 0.0 ; - Lred_dVgs = 0.0 ; - Lred_dT = 0.0 ; - - Ids = 0.0e0 ; - Ids_dVbs = 0.0e0 ; - Ids_dVds = 0.0e0 ; - Ids_dVgs = 0.0e0 ; - Ids_dT = 0.0e0 ; - - goto end_of_part_1 ; - } - - - /*-----------------------------------------------------------* - * Start point of Psl (= Ps0 + Pds) calculation. (label) - *-----------------*/ -/* start_of_Psl: */ - - - /* Vdseff (begin) */ - Vdsorg = Vds ; - - T2 = here->HSMHV_qnsub_esi / ( Cox * Cox ) ; - T4 = - 2.0e0 * T2 / Cox ; - T2_dVb = T4 * Cox_dVb ; - T2_dVd = T4 * Cox_dVd ; - T2_dVg = T4 * Cox_dVg ; - T2_dT = T4 * Cox_dT ; - - T0 = Vgp - beta_inv - Vbsz ; - T0_dT = Vgp_dT - beta_inv_dT - Vbsz_dT ; - Fn_SZ( T9, 1.0e0 + 2.0e0 / T2 * T0, 1e-3, TX ) ; - T3 = sqrt( T9 ) ; - T4 = 0.5e0 / T3 ; - T5 = 1.0e0 / ( T2 * T2 ) ; - T6 = T4 * 2.0e0 * T5 * TX ; - T7 = T6 * T0 ; - T8 = T6 * T2 ; - T3_dVb = - T2_dVb * T7 + T8 * ( Vgp_dVbs - Vbsz_dVbs ) ; - T3_dVd = - T2_dVd * T7 + T8 * ( Vgp_dVds - Vbsz_dVds ) ; - T3_dVg = - T2_dVg * T7 + T8 * Vgp_dVgs ; - T3_dT = - T2_dT * T7 + T8 * T0_dT ; - - T10 = Vgp + T2 * ( 1.0e0 - T3 ) ; - T10_dVb = Vgp_dVbs + T2_dVb * ( 1.0e0 - T3 ) - T2 * T3_dVb ; - T10_dVd = Vgp_dVds + T2_dVd * ( 1.0e0 - T3 ) - T2 * T3_dVd ; - T10_dVg = Vgp_dVgs + T2_dVg * ( 1.0e0 - T3 ) - T2 * T3_dVg ; - T10_dT = Vgp_dT + T2_dT * ( 1.0e0 - T3 ) - T2 * T3_dT ; - Fn_SZ( T10 , T10 , 0.01 , T0 ) ; - T10 += epsm10 ; - T10_dVb *= T0 ; - T10_dVd *= T0 ; - T10_dVg *= T0 ; - T10_dT *= T0 ; - - T1 = Vds / T10 ; - T2 = Fn_Pow( T1 , here->HSMHV_ddlt - 1.0e0 ) ; - T7 = T2 * T1 ; - T0 = here->HSMHV_ddlt * T2 / ( T10 * T10 ) ; - T7_dVb = T0 * ( - Vds * T10_dVb ) ; - T7_dVd = T0 * ( T10 - Vds * T10_dVd ) ; - T7_dVg = T0 * ( - Vds * T10_dVg ) ; - T7_dT = T0 * ( - Vds * T10_dT ) ; - - T3 = 1.0 + T7 ; - T4 = Fn_Pow( T3 , 1.0 / here->HSMHV_ddlt - 1.0 ) ; - T6 = T4 * T3 ; - T0 = T4 / here->HSMHV_ddlt ; - T6_dVb = T0 * T7_dVb ; - T6_dVd = T0 * T7_dVd ; - T6_dVg = T0 * T7_dVg ; - T6_dT = T0 * T7_dT ; - - Vdseff = Vds / T6 ; - T0 = 1.0 / ( T6 * T6 ) ; - Vdseff_dVbs = - Vds * T6_dVb * T0 ; - Vdseff_dVds = ( T6 - Vds * T6_dVd ) * T0 ; - Vdseff_dVgs = - Vds * T6_dVg * T0 ; - Vdseff_dT = - Vds * T6_dT * T0 ; - - Vds = Vdseff ; - /* Vdseff (end) */ - - - exp_bVbsVds = exp( beta * ( Vbscl - Vds ) ) ; - exp_bVbsVds_dT = ( beta_dT * ( Vbscl - Vds ) + beta * (Vbscl_dT - Vdseff_dT) ) * exp_bVbsVds ; - - - /*---------------------------------------------------* - * Skip Psl calculation when Vds is very small. - *-----------------*/ - if ( Vds <= 0.0 ) { - Pds = 0.0 ; - Psl = Ps0 ; -// flg_conv = 1 ; - goto start_of_loopl ; - } - - /*-----------------------------------------------------------* - * Initial guess for Pds ( = Psl - Ps0 ). - *-----------------*/ - if ( flg_pprv >= 1 ) { - /*---------------------------------------------------* - * Use previous value. - *-----------------*/ - - T1 = Pds_dVbs * dVbs + Pds_dVds * dVds + Pds_dVgs * dVgs ; - Pds_ini = Pds + T1 ; - - /* self heating */ - T2 = here->HSMHV_pds_dtemp_prv * Temp_dif ; - if ( fabs( T1 + T2 ) < dP_max ) { Pds_ini += T2 ; } - - if ( flg_pprv == 2 ) { - /* TX_dVxs = d^2 Pds / d Vxs^2 here */ - if ( Vbsc_dif2 > epsm10 ) { - TX_dVbs = ( here->HSMHV_pds_dvbs_prv - here->HSMHV_pds_dvbs_prv2 ) - / Vbsc_dif2 ; - } else { - TX_dVbs = 0.0 ; - } - if ( Vdsc_dif2 > epsm10 ) { - TX_dVds = ( here->HSMHV_pds_dvds_prv - here->HSMHV_pds_dvds_prv2 ) - / Vdsc_dif2 ; - } else { - TX_dVds = 0.0 ; - } - if ( Vgsc_dif2 > epsm10 ) { - TX_dVgs = ( here->HSMHV_pds_dvgs_prv - here->HSMHV_pds_dvgs_prv2 ) - / Vgsc_dif2 ; - } else { - TX_dVgs = 0.0 ; - } - T2 = ( dVbs * dVbs ) / 2 * TX_dVbs - + ( dVds * dVds ) / 2 * TX_dVds - + ( dVgs * dVgs ) / 2 * TX_dVgs ; - - if ( fabs( T2 ) < fabs( 0.5 * T1 ) ) { - Pds_ini += T2 ; - } else { - flg_pprv = 1 ; - } - } - - T1 = Pds_ini - Pds ; - if ( T1 < - dP_max || T1 > dP_max ) flg_pprv = 0 ; /* flag changes */ - - } /* end of (flg_pprv>=1) if-block */ - - if ( flg_pprv == 0 ) { - /*---------------------------------------------------* - * Analytical initial guess. - *-----------------*/ - Pds_max = Fn_Max( Psl_lim - Ps0 , 0.0e0 ) ; - - Fn_SU( Pds_ini , Vds, (1.0e0 + c_pslini_1) * Pds_max, c_pslini_2, T1 ) ; - Pds_ini = Fn_Min( Pds_ini , Pds_max ) ; - } - - if ( Pds_ini < 0.0 ) Pds_ini = 0.0 ; - else if ( Pds_ini > Vds ) Pds_ini = Vds ; - - - /*---------------------------------------------------* - * Assign initial guess. - *-----------------*/ - Pds = Pds_ini ; - Psl = Ps0 + Pds ; - TX = Vbscl + ps_conv / 2 ; - if ( Psl < TX ) Psl = TX ; - - /*---------------------------------------------------* - * Calculation of Psl by solving Poisson eqn. - * (beginning of Newton loop) - * - Fsl : Fsl = 0 is the equation to be solved. - * - dPsl : correction value. - *-----------------*/ - flg_conv = 0 ; - - /*---------------------------------------------------* - * start of Psl calculation. (label) - *-----------------*/ -start_of_loopl: - - for ( lp_sl = 1 ; lp_sl <= lp_sl_max + 1 ; lp_sl ++ ) { - - Chi = beta * ( Psl - Vbscl ) ; - - if ( Chi < znbd5 ) { - /*-------------------------------------------* - * zone-D2. (Psl) - * - Qb0 is approximated to 5-degree polynomial. - *-----------------*/ - - fi = Chi * Chi * Chi - * ( cn_im53 + Chi * ( cn_im54 + Chi * cn_im55 ) ) ; - fi_dChi = Chi * Chi - * ( 3 * cn_im53 + Chi * ( 4 * cn_im54 + Chi * 5 * cn_im55 ) ) ; - - cfs1 = cnst1 * exp_bVbsVds ; - - fsl1 = cfs1 * fi * fi ; - fsl1_dPsl = cfs1 * beta * 2 * fi * fi_dChi ; - - fb = Chi * ( cn_nc51 - + Chi * ( cn_nc52 - + Chi * ( cn_nc53 - + Chi * ( cn_nc54 + Chi * cn_nc55 ) ) ) ) ; - fb_dChi = cn_nc51 - + Chi * ( 2 * cn_nc52 - + Chi * ( 3 * cn_nc53 - + Chi * ( 4 * cn_nc54 + Chi * 5 * cn_nc55 ) ) ) ; - - fsl2 = sqrt( fb * fb + fsl1 ) ; - fsl2_dPsl = ( beta * fb_dChi * 2 * fb + fsl1_dPsl ) / ( fsl2 + fsl2 ) ; - - } else { - /*-------------------------------------------* - * zone-D3. (Psl) - *-----------------*/ - Rho = beta * ( Psl - Vds ) ; - exp_Rho = exp( Rho ) ; - - fsl1 = cnst1 * ( exp_Rho - exp_bVbsVds ) ; - fsl1_dPsl = cnst1 * beta * ( exp_Rho ) ; - Xil = Chi - 1.0e0 ; - fsl2 = sqrt( Xil + fsl1 ) ; - fsl2_dPsl = ( beta + fsl1_dPsl ) / ( fsl2 + fsl2 ) ; - } - - Fsl = Vgp - Psl - fac1 * fsl2 ; - Fsl_dPsl = - 1.0e0 - fac1 * fsl2_dPsl ; - - if ( flg_conv == 1 ) break ; - - dPsl = - Fsl / Fsl_dPsl ; - - /*-------------------------------------------* - * Update Psl . - * - clamped to Vbscl if Psl < Vbscl . - *-----------------*/ - dPlim = 0.5*dP_max*(1.0 + Fn_Max(1.e0,fabs(Psl))) ; - if ( fabs( dPsl ) > dPlim ) dPsl = dPlim * Fn_Sgn( dPsl ) ; - if (Psl + dPsl < Ps0 ) { - dPsl = Ps0 - Psl; - Psl = Ps0 ; - } else { - Psl = Psl + dPsl ; - } - - TX = Vbscl + ps_conv / 2 ; - if ( Psl < TX ) Psl = TX ; - - /*-------------------------------------------* - * Check convergence. - * NOTE: This condition may be too rigid. - *-----------------*/ - if ( fabs( dPsl ) <= ps_conv && fabs( Fsl ) <= gs_conv ) { - flg_conv = 1 ; - } - } /* end of Psl Newton loop */ - - /* Reduce loop count to exclude derivative calculation sweep */ - lp_sl -- ; - - /*-------------------------------------------* - * Procedure for diverged case. - *-----------------*/ - if ( flg_conv == 0 ) { - fprintf( stderr , - "*** warning(HiSIM_HV): Went Over Iteration Maximum (Psl)\n" ) ; - fprintf( stderr , - " Vbse = %7.3f Vdse = %7.3f Vgse = %7.3f\n" , - Vbse , Vdse , Vgse ) ; - if ( flg_info >= 2 ) { - printf("*** warning(HiSIM_HV): Went Over Iteration Maximum (Psl)\n" ) ; - } - } - - - /*---------------------------------------------------* - * Evaluate derivatives of Psl. - * - note: Here, fsl1_dVbs and fsl2_dVbs are derivatives - * w.r.t. explicit Vbscl. So, Psl in the fsl1 and fsl2 - * expressions is regarded as a constant. - *-----------------*/ - Chi_dT = ( Psl - Vbscl ) * beta_dT - Vbscl_dT * beta ; - - if ( Chi < znbd5 ) { - T1 = cfs1 * beta * fi ; - fsl1_dVbs = T1 * ( ( Vbscl_dVbs - Vdseff_dVbs ) * fi - 2.0 * fi_dChi * Vbscl_dVbs ) ; - fsl1_dVds = - T1 * fi * Vdseff_dVds ; - fsl1_dVgs = - T1 * fi * Vdseff_dVgs ; - cfs1_dT = exp_bVbsVds * cnst1_dT + cnst1 * exp_bVbsVds_dT ; - fsl1_dT = fi * fi * cfs1_dT + 2 * cfs1 * fi * fi_dChi * Chi_dT ; - T2 = 0.5 / fsl2 ; - fsl2_dVbs = ( - beta * fb_dChi * 2 * fb * Vbscl_dVbs + fsl1_dVbs ) * T2 ; - fsl2_dVds = fsl1_dVds * T2 ; - fsl2_dVgs = fsl1_dVgs * T2 ; - fsl2_dT = ( 2 * fb * fb_dChi * Chi_dT + fsl1_dT ) * T2 ; - } else { - Rho_dT = beta_dT * ( Psl - Vds ) - beta * Vdseff_dT ; - exp_Rho_dT = Rho_dT * exp_Rho ; - - T1 = cnst1 * beta ; - fsl1_dVbs = - T1 * ( exp_Rho * Vdseff_dVbs - + ( Vbscl_dVbs - Vdseff_dVbs ) * exp_bVbsVds ); - fsl1_dVds = - T1 * Vdseff_dVds * ( exp_Rho - exp_bVbsVds ); - fsl1_dVgs = T1 * Vdseff_dVgs * ( - exp_Rho + exp_bVbsVds ); - fsl1_dT = cnst1 * ( exp_Rho_dT - exp_bVbsVds_dT ) + cnst1_dT * ( exp_Rho - exp_bVbsVds ) ; - T2 = 0.5e0 / fsl2 ; - fsl2_dVbs = ( - beta * Vbscl_dVbs + fsl1_dVbs ) * T2 ; - fsl2_dVds = ( fsl1_dVds ) * T2 ; - fsl2_dVgs = ( fsl1_dVgs ) * T2 ; - fsl2_dT = ( Chi_dT + fsl1_dT ) * T2 ; - } - - T1 = 1.0 / Fsl_dPsl ; - Psl_dVbs = - ( Vgp_dVbs - ( fac1 * fsl2_dVbs + fac1_dVbs * fsl2 ) ) * T1 ; - Psl_dVds = - ( Vgp_dVds - ( fac1 * fsl2_dVds + fac1_dVds * fsl2 ) ) * T1 ; - Psl_dVgs = - ( Vgp_dVgs - ( fac1 * fsl2_dVgs + fac1_dVgs * fsl2 ) ) * T1 ; - Psl_dT = - ( Vgp_dT - ( fac1 * fsl2_dT + fac1_dT * fsl2 ) ) * T1 ; - - Chi_dT = ( Psl - Vbscl ) * beta_dT + beta * ( Psl_dT - Vbscl_dT ); - exp_Chi_dT = exp_Chi * Chi_dT ; - - - if ( Chi < znbd5 ) { - /*-------------------------------------------* - * zone-D1/D2. (Psl) - *-----------------*/ - Xil = fb * fb + epsm10 ; - T1 = 2 * fb * fb_dChi * beta ; - Xil_dVbs = T1 * ( Psl_dVbs - Vbscl_dVbs ) ; - Xil_dVds = T1 * Psl_dVds ; - Xil_dVgs = T1 * Psl_dVgs ; - Xil_dT = 2 * fb * fb_dChi * Chi_dT ; - - Xilp12 = fb + epsm10 ; - T1 = fb_dChi * beta ; - Xilp12_dVbs = T1 * ( Psl_dVbs - Vbscl_dVbs ) ; - Xilp12_dVds = T1 * Psl_dVds ; - Xilp12_dVgs = T1 * Psl_dVgs ; - Xilp12_dT = fb_dChi * Chi_dT ; - - Xilp32 = fb * fb * fb + epsm10 ; - T1 = 3 * fb * fb * fb_dChi * beta ; - Xilp32_dVbs = T1 * ( Psl_dVbs - Vbscl_dVbs ) ; - Xilp32_dVds = T1 * Psl_dVds ; - Xilp32_dVgs = T1 * Psl_dVgs ; - Xilp32_dT = 3 * fb * fb * fb_dChi * Chi_dT ; - - } else { - /*-------------------------------------------* - * zone-D3. (Psl) - *-----------------*/ - - Xil = Chi - 1.0e0 ; - Xil_dVbs = beta * ( Psl_dVbs - Vbscl_dVbs ) ; - Xil_dVds = beta * Psl_dVds ; - Xil_dVgs = beta * Psl_dVgs ; - Xil_dT = Chi_dT ; - - Xilp12 = sqrt( Xil ) ; - T1 = 0.5e0 / Xilp12 ; - Xilp12_dVbs = T1 * Xil_dVbs ; - Xilp12_dVds = T1 * Xil_dVds ; - Xilp12_dVgs = T1 * Xil_dVgs ; - Xilp12_dT = T1 * Xil_dT ; - - Xilp32 = Xil * Xilp12 ; - T1 = 1.5e0 * Xilp12 ; - Xilp32_dVbs = T1 * Xil_dVbs ; - Xilp32_dVds = T1 * Xil_dVds ; - Xilp32_dVgs = T1 * Xil_dVgs ; - Xilp32_dT = T1 * Xil_dT ; - - } - - /*---------------------------------------------------* - * Assign Pds. - *-----------------*/ - Pds = Psl - Ps0 ; - - /* if ( Pds < ps_conv ) { */ - if ( Pds < 0.0 ) { /* take care of numerical noise */ - Pds = 0.0 ; - Psl = Ps0 ; - } - - Pds_dVbs = Psl_dVbs - Ps0_dVbs ; - Pds_dVds = Psl_dVds - Ps0_dVds ; - Pds_dVgs = Psl_dVgs - Ps0_dVgs ; - Pds_dT = Psl_dT - Ps0_dT ; - - /* if ( Pds < ps_conv ) { */ - if ( Pds < 0.0 ) { - Pds_dVbs = 0.0 ; - Pds_dVgs = 0.0 ; - Psl_dVbs = Ps0_dVbs ; - Psl_dVgs = Ps0_dVgs ; - Pds_dT = 0.0 ; - Psl_dT = Ps0_dT ; - } - - /* Vdseff */ - Vds = Vdsorg; - - /*-----------------------------------------------------------* - * Evaluate Idd. - * - Eta : substantial variable of QB'/Pds and Idd/Pds. - * - note: Eta = 4 * GAMMA_{hisim_0} - *-----------------*/ - T1 = beta / Xi0 ; - Eta = T1 * Pds ; - T2 = Eta * beta_inv ; - Eta_dVbs = T1 * ( Pds_dVbs - Xi0_dVbs * T2 ) ; - Eta_dVds = T1 * ( Pds_dVds - Xi0_dVds * T2 ) ; - Eta_dVgs = T1 * ( Pds_dVgs - Xi0_dVgs * T2 ) ; - T1_dT = ( beta_dT * Xi0 - beta * Xi0_dT ) / Xi0 / Xi0 ; - Eta_dT = T1_dT * Pds + T1 * Pds_dT ; - - /* ( Eta + 1 )^n */ - Eta1 = Eta + 1.0e0 ; - Eta1p12 = sqrt( Eta1 ) ; - Eta1p32 = Eta1p12 * Eta1 ; - Eta1p52 = Eta1p32 * Eta1 ; - Eta1_dT = Eta_dT ; - Eta1p12_dT = 0.5e0 / Eta1p12 * Eta1_dT ; - Eta1p32_dT = Eta1p12_dT * Eta1 + Eta1p12 * Eta1_dT ; - Eta1p52_dT = Eta1p32_dT * Eta1 + Eta1p32 * Eta1_dT ; - - /* 1 / ( ( Eta + 1 )^n + 1 ) */ - Zeta12 = 1.0e0 / ( Eta1p12 + 1.0e0 ) ; - Zeta32 = 1.0e0 / ( Eta1p32 + 1.0e0 ) ; - Zeta52 = 1.0e0 / ( Eta1p52 + 1.0e0 ) ; - Zeta12_dT = - 1.0e0 / ( Eta1p12 + 1.0e0 ) / ( Eta1p12 + 1.0e0 ) * Eta1p12_dT ; - Zeta32_dT = - 1.0e0 / ( Eta1p32 + 1.0e0 ) / ( Eta1p32 + 1.0e0 ) * Eta1p32_dT ; - Zeta52_dT = - 1.0e0 / ( Eta1p52 + 1.0e0 ) / ( Eta1p52 + 1.0e0 ) * Eta1p52_dT ; - - /*---------------------------------------------------* - * F00 := PS00/Pds (n=1/2) - *-----------------*/ - F00 = Zeta12 / Xi0p12 ; - T3 = - 1 / Xi0 ; - T4 = - 0.5e0 / Eta1p12 * F00 ; - T5 = Zeta12 * T3 ; - T6 = Zeta12 * T4 ; - F00_dVbs = ( Xi0p12_dVbs * T5 + Eta_dVbs * T6 ) ; - F00_dVds = ( Xi0p12_dVds * T5 + Eta_dVds * T6 ) ; - F00_dVgs = ( Xi0p12_dVgs * T5 + Eta_dVgs * T6 ) ; - F00_dT = ( Zeta12_dT * Xi0p12 - Zeta12 * Xi0p12_dT ) / Xi0p12 / Xi0p12 ; - - /*---------------------------------------------------* - * F10 := PS10/Pds (n=3/2) - *-----------------*/ - T1 = 3.0e0 + Eta * ( 3.0e0 + Eta ) ; - F10 = C_2o3 * Xi0p12 * Zeta32 * T1 ; - T2 = 3.0e0 + Eta * 2.0e0 ; - T3 = C_2o3 * T1 ; - T4 = - 1.5e0 * Eta1p12 * F10 + C_2o3 * Xi0p12 * T2 ; - T5 = Zeta32 * T3 ; - T6 = Zeta32 * T4 ; - F10_dVbs = ( Xi0p12_dVbs * T5 + Eta_dVbs * T6 ) ; - F10_dVds = ( Xi0p12_dVds * T5 + Eta_dVds * T6 ) ; - F10_dVgs = ( Xi0p12_dVgs * T5 + Eta_dVgs * T6 ) ; - T1_dT = Eta_dT * ( 3.0e0 + Eta ) + Eta * Eta_dT ; - F10_dT = C_2o3 * Xi0p12 * Zeta32 * T1_dT - + C_2o3 * T1 * ( Xi0p12 * Zeta32_dT + Zeta32 * Xi0p12_dT ) ; - - /*---------------------------------------------------* - * F30 := PS30/Pds (n=5/2) - *-----------------*/ - T1 = 5e0 + Eta * ( 10e0 + Eta * ( 10e0 + Eta * ( 5e0 + Eta ) ) ) ; - F30 = 4e0 / ( 15e0 * beta ) * Xi0p32 * Zeta52 * T1 ; - T2 = 10e0 + Eta * ( 20e0 + Eta * ( 15e0 + Eta * 4e0 ) ) ; - T3 = 4e0 / ( 15e0 * beta ) * T1 ; - T4 = - ( 5e0 / 2e0 ) * Eta1p32 * F30 + 4e0 / ( 15e0 * beta ) * Xi0p32 * T2 ; - T5 = Zeta52 * T3 ; - T6 = Zeta52 * T4 ; - F30_dVbs = ( Xi0p32_dVbs * T5 + Eta_dVbs * T6 ) ; - F30_dVds = ( Xi0p32_dVds * T5 + Eta_dVds * T6 ) ; - F30_dVgs = ( Xi0p32_dVgs * T5 + Eta_dVgs * T6 ) ; - T1_dT = ( 10e0 + 20e0 * Eta + 15e0 * Eta * Eta + 4e0 * Eta * Eta * Eta ) * Eta_dT ; - F30_dT = 4e0 / 15e0 * beta_inv_dT * ( Xi0p32 * Zeta52 * T1 ) - + 4e0 / 15e0 * beta_inv * ( Xi0p32_dT * Zeta52 * T1 + Xi0p32 * Zeta52_dT * T1 + Xi0p32 * Zeta52 * T1_dT ) ; - - /*---------------------------------------------------* - * F11 := PS11/Pds. - *-----------------*/ - F11 = Ps0 * F10 + C_2o3 * beta_inv * Xilp32 - F30 ; - T1 = C_2o3 * beta_inv ; - F11_dVbs = Ps0_dVbs * F10 + Ps0 * F10_dVbs - + T1 * Xilp32_dVbs - F30_dVbs ; - F11_dVds = Ps0_dVds * F10 + Ps0 * F10_dVds - + T1 * Xilp32_dVds - F30_dVds ; - F11_dVgs = Ps0_dVgs * F10 + Ps0 * F10_dVgs - + T1 * Xilp32_dVgs - F30_dVgs ; - F11_dT = Ps0_dT * F10 + Ps0 * F10_dT - + C_2o3 *( beta_inv_dT * Xilp32 + beta_inv * Xilp32_dT ) - F30_dT ; - - /*---------------------------------------------------* - * Fdd := Idd/Pds. - *-----------------*/ - T1 = Vgp + beta_inv - 0.5e0 * ( 2.0e0 * Ps0 + Pds ) ; - T2 = - F10 + F00 ; - T3 = beta * Cox ; - T4 = beta * cnst0 ; - Fdd = T3 * T1 + T4 * T2 ; - Fdd_dVbs = T3 * ( Vgp_dVbs - Ps0_dVbs - 0.5e0 * Pds_dVbs ) - + beta * Cox_dVb * T1 + T4 * ( - F10_dVbs + F00_dVbs ) ; - Fdd_dVds = T3 * ( Vgp_dVds - Ps0_dVds - 0.5e0 * Pds_dVds ) - + beta * Cox_dVd * T1 + T4 * ( - F10_dVds + F00_dVds ) ; - Fdd_dVgs = T3 * ( Vgp_dVgs - Ps0_dVgs - 0.5e0 * Pds_dVgs ) - + beta * Cox_dVg * T1 + T4 * ( - F10_dVgs + F00_dVgs ) ; - T1_dT = Vgp_dT + beta_inv_dT - 0.5e0 * ( 2.0e0 * Ps0_dT + Pds_dT ) ; - T2_dT = -F10_dT + F00_dT ; - T3_dT = Cox * beta_dT ; - T4_dT = beta * cnst0_dT + cnst0 * beta_dT ; - Fdd_dT = T1 * T3_dT + T3 * T1_dT + T2 * T4_dT + T4 * T2_dT ; - - - /*---------------------------------------------------* - * Idd: - *-----------------*/ - Idd = Pds * Fdd ; - Idd_dVbs = Pds_dVbs * Fdd + Pds * Fdd_dVbs ; - Idd_dVds = Pds_dVds * Fdd + Pds * Fdd_dVds ; - Idd_dVgs = Pds_dVgs * Fdd + Pds * Fdd_dVgs ; - Idd_dT = Fdd * Pds_dT + Pds * Fdd_dT ; - - /*-----------------------------------------------------------* - * Skip CLM and integrated charges if zone==D1 - *-----------------*/ - if( flg_zone == 1 ) { - goto start_of_mobility ; - } - - /*-----------------------------------------------------------* - * Channel Length Modulation. Lred: \Delta L - *-----------------*/ - if( pParam->HSMHV_clm2 < epsm10 && pParam->HSMHV_clm3 < epsm10 ) { - Lred = 0.0e0 ; - Lred_dVbs = 0.0e0 ; - Lred_dVds = 0.0e0 ; - Lred_dVgs = 0.0e0 ; - Lred_dT = 0.0e0 ; - - Psdl = Psl ; - Psdl_dVbs = Psl_dVbs ; - Psdl_dVds = Psl_dVds ; - Psdl_dVgs = Psl_dVgs ; - Psdl_dT = Psl_dT ; - - if ( Psdl > Ps0 + Vds - epsm10 ) { - Psdl = Ps0 + Vds - epsm10 ; - Psdl_dVbs = Ps0_dVbs ; - Psdl_dVds = Ps0_dVds + 1.0 ; - Psdl_dVgs = Ps0_dVgs ; - Psdl_dT = Ps0_dT ; - } - - } else { - T1 = here->HSMHV_wdpl ; - T8 = sqrt (Psl - Vbscl) ; - Wd = T1 * T8 ; - T9 = 0.5 * T1 / T8 ; - Wd_dVbs = T9 * (Psl_dVbs - Vbscl_dVbs) ; - Wd_dVds = T9 * Psl_dVds ; - Wd_dVgs = T9 * Psl_dVgs ; - Wd_dT = T9 * (Psl_dT - Vbscl_dT) ; - - T0 = 1.0 / Wd ; - T1 = Qn0 * T0 ; - T2 = pParam->HSMHV_clm3 * T1 ; - T3 = pParam->HSMHV_clm3 * T0 ; - T2_dVb = T3 * (Qn0_dVbs - T1 * Wd_dVbs) ; - T2_dVd = T3 * (Qn0_dVds - T1 * Wd_dVds) ; - T2_dVg = T3 * (Qn0_dVgs - T1 * Wd_dVgs) ; - T2_dT = T3 * (Qn0_dT - T1 * Wd_dT) ; - - T5 = pParam->HSMHV_clm2 * q_Nsub + T2 ; - T1 = 1.0 / T5 ; - T4 = C_ESI * T1 ; - T4_dVb = - T4 * T2_dVb * T1 ; - T4_dVd = - T4 * T2_dVd * T1 ; - T4_dVg = - T4 * T2_dVg * T1 ; - T4_dT = -T4 * T2_dT * T1 ; - - T1 = (1.0e0 - pParam->HSMHV_clm1) ; - Psdl = pParam->HSMHV_clm1 * (Vds + Ps0) + T1 * Psl ; - Psdl_dVbs = pParam->HSMHV_clm1 * Ps0_dVbs + T1 * Psl_dVbs ; - Psdl_dVds = pParam->HSMHV_clm1 * (1.0 + Ps0_dVds) + T1 * Psl_dVds ; - Psdl_dVgs = pParam->HSMHV_clm1 * Ps0_dVgs + T1 * Psl_dVgs ; - Psdl_dT = pParam->HSMHV_clm1 * Ps0_dT + T1 * Psl_dT ; - - if ( Psdl > Ps0 + Vds - epsm10 ) { - Psdl = Ps0 + Vds - epsm10 ; - Psdl_dVbs = Ps0_dVbs ; - Psdl_dVds = Ps0_dVds + 1.0 ; - Psdl_dVgs = Ps0_dVgs ; - Psdl_dT = Ps0_dT ; - } - T6 = Psdl - Psl ; - T6_dVb = Psdl_dVbs - Psl_dVbs ; - T6_dVd = Psdl_dVds - Psl_dVds ; - T6_dVg = Psdl_dVgs - Psl_dVgs ; - T6_dT = Psdl_dT - Psl_dT ; - - T3 = beta * Qn0 ; - T1 = 1.0 / T3 ; - T5 = Idd * T1 ; - T3_dT = beta * Qn0_dT + beta_dT * Qn0 ; - T1_dT = - T1 * T1 * T3_dT ; - T5_dT = Idd_dT * T1 + Idd * T1_dT ; - T2 = T5 * beta ; - T5_dVb = (Idd_dVbs - T2 * Qn0_dVbs) * T1 ; - T5_dVd = (Idd_dVds - T2 * Qn0_dVds) * T1 ; - T5_dVg = (Idd_dVgs - T2 * Qn0_dVgs) * T1 ; - - T10 = q_Nsub / C_ESI ; - T1 = 1.0e5 ; - T2 = 1.0 / Leff ; - T11 = (2.0 * T5 + 2.0 * T10 * T6 * T4 + T1 * T4) * T2 ; - T3 = T2 * T4 ; - T7 = T11 * T4 ; - T7_dVb = (2.0 * T5_dVb + 2.0 * T10 * (T6_dVb * T4 + T6 * T4_dVb) + T1 * T4_dVb) * T3 + T11 * T4_dVb ; - T7_dVd = (2.0 * T5_dVd + 2.0 * T10 * (T6_dVd * T4 + T6 * T4_dVd) + T1 * T4_dVd) * T3 + T11 * T4_dVd ; - T7_dVg = (2.0 * T5_dVg + 2.0 * T10 * (T6_dVg * T4 + T6 * T4_dVg) + T1 * T4_dVg) * T3 + T11 * T4_dVg ; - T7_dT = (2.0 * T5_dT + 2.0 * T10 * ( T6_dT * T4 + T6 * T4_dT ) + T1 * T4_dT ) * T3 + T11 * T4_dT ; - - T11 = 4.0 * (2.0 * T10 * T6 + T1) ; - T1 = 8.0 * T10 * T4 * T4 ; - T2 = 2.0 * T11 * T4 ; - T8 = T11 * T4 * T4 ; - T8_dVb = ( T1 * T6_dVb + T2 * T4_dVb) ; - T8_dVd = ( T1 * T6_dVd + T2 * T4_dVd) ; - T8_dVg = ( T1 * T6_dVg + T2 * T4_dVg) ; - T8_dT = ( T1 * T6_dT + T2 * T4_dT) ; - - T9 = sqrt (T7 * T7 + T8); - T1 = 1.0 / T9 ; - T2 = T7 * T1 ; - T3 = 0.5 * T1 ; - T9_dVb = (T2 * T7_dVb + T3 * T8_dVb) ; - T9_dVd = (T2 * T7_dVd + T3 * T8_dVd) ; - T9_dVg = (T2 * T7_dVg + T3 * T8_dVg) ; - T9_dT = (T2 * T7_dT + T3 * T8_dT) ; - - Lred = 0.5 * (- T7 + T9) ; - Lred_dVbs = 0.5 * (- T7_dVb + T9_dVb) ; - Lred_dVds = 0.5 * (- T7_dVd + T9_dVd) ; - Lred_dVgs = 0.5 * (- T7_dVg + T9_dVg) ; - Lred_dT = 0.5 * (- T7_dT + T9_dT ) ; - /*---------------------------------------------------* - * Modify Lred for symmetry. - *-----------------*/ - T1 = Lred ; - Lred = FMDVDS * T1 ; - Lred_dVbs = FMDVDS_dVbs * T1 + FMDVDS * Lred_dVbs ; - Lred_dVds = FMDVDS_dVds * T1 + FMDVDS * Lred_dVds ; - Lred_dVgs = FMDVDS_dVgs * T1 + FMDVDS * Lred_dVgs ; - Lred_dT = FMDVDS_dT * T1 + FMDVDS * Lred_dT ; - } - - /* CLM5 & CLM6 */ - Lred *= here->HSMHV_clmmod ; - Lred_dVbs *= here->HSMHV_clmmod ; - Lred_dVds *= here->HSMHV_clmmod ; - Lred_dVgs *= here->HSMHV_clmmod ; - Lred_dT *= here->HSMHV_clmmod ; - - /*---------------------------------------------------* - * Qbu : -Qb in unit area. - *-----------------*/ - T1 = Vgp + beta_inv ; - T2 = T1 * F10 - F11 ; - T1_dT = Vgp_dT + beta_inv_dT ; - T2_dT = T1_dT * F10 + T1 * F10_dT - F11_dT ; - - - Qbnm = cnst0 * ( cnst0 * ( 1.5e0 - ( Xi0 + 1.0e0 ) - 0.5e0 * beta * Pds ) - + Cox * T2 ) ; - Qbnm_dVbs = cnst0 * ( cnst0 * ( - Xi0_dVbs - 0.5e0 * beta * Pds_dVbs ) - + Cox * ( Vgp_dVbs * F10 + T1 * F10_dVbs - F11_dVbs ) - + Cox_dVb * T2 ) ; - Qbnm_dVds = cnst0 * ( cnst0 * ( - Xi0_dVds - 0.5e0 * beta * Pds_dVds ) - + Cox * ( Vgp_dVds * F10 + T1 * F10_dVds - F11_dVds ) - + Cox_dVd * T2 ) ; - Qbnm_dVgs = cnst0 * ( cnst0 * ( - Xi0_dVgs - 0.5e0 * beta * Pds_dVgs ) - + Cox * ( Vgp_dVgs * F10 + T1 * F10_dVgs - F11_dVgs ) - + Cox_dVg * T2 ) ; - Qbnm_dT = cnst0_dT * ( cnst0 * ( 1.5e0 - ( Xi0 + 1.0e0 ) - 0.5e0 * beta * Pds ) - + Cox * T2 ) - + cnst0 * ( cnst0_dT * ( 1.5e0 - ( Xi0 + 1.0e0 ) - 0.5e0 * beta * Pds ) - + cnst0 * ( - Xi0_dT - 0.5 * beta_dT * Pds - 0.5 * beta * Pds_dT ) - + Cox * T2_dT ); - - T1 = beta ; - Qbu = T1 * Qbnm / Fdd ; - T2 = T1 / ( Fdd * Fdd ) ; - Qbu_dVbs = T2 * ( Fdd * Qbnm_dVbs - Qbnm * Fdd_dVbs ) ; - Qbu_dVds = T2 * ( Fdd * Qbnm_dVds - Qbnm * Fdd_dVds ) ; - Qbu_dVgs = T2 * ( Fdd * Qbnm_dVgs - Qbnm * Fdd_dVgs ) ; - T1_dT = beta_dT ; - Qbu_dT = ( Fdd * ( T1_dT * Qbnm + T1 * Qbnm_dT ) - T1 * Qbnm * Fdd_dT ) / ( Fdd * Fdd ) ; - - /*---------------------------------------------------* - * preparation for Qi and Qd. - * - DtPds: Delta * Pds ; - * - Achi: (1+Delta) * Pds ; - *-----------------*/ - T1 = 2.0e0 * fac1 ; - DtPds = T1 * ( F10 - Xi0p12 ) ; - T2 = 2.0 * ( F10 - Xi0p12 ) ; - DtPds_dVbs = T1 * ( F10_dVbs - Xi0p12_dVbs ) - + T2 * fac1_dVbs ; - DtPds_dVds = T1 * ( F10_dVds - Xi0p12_dVds ) - + T2 * fac1_dVds ; - DtPds_dVgs = T1 * ( F10_dVgs - Xi0p12_dVgs ) - + T2 * fac1_dVgs ; - T1_dT = 2.0e0 * fac1_dT ; - DtPds_dT = T1_dT * ( F10 - Xi0p12 ) + T1 * ( F10_dT -Xi0p12_dT ) ; - - Achi = Pds + DtPds ; - Achi_dVbs = Pds_dVbs + DtPds_dVbs ; - Achi_dVds = Pds_dVds + DtPds_dVds ; - Achi_dVgs = Pds_dVgs + DtPds_dVgs ; - Achi_dT = Pds_dT + DtPds_dT ; - - /*-----------------------------------------------------------* - * Alpha : parameter to evaluate charges. - * - Achi: (1+Delta) * Pds ; - * - clamped to 0 if Alpha < 0. - *-----------------*/ - T1 = 1.0 / VgVt ; - T2 = Achi * T1 ; - T3 = 1.0e0 - T2 ; - TX = 1.0 - T3 ; - Fn_CP( TY , TX , 1.0 , 4 , T4 ) ; - Alpha = 1.0 - TY ; - T5 = T1 * T4 ; - Alpha_dVbs = - ( Achi_dVbs - T2 * VgVt_dVbs ) * T5 ; - Alpha_dVds = - ( Achi_dVds - T2 * VgVt_dVds ) * T5 ; - Alpha_dVgs = - ( Achi_dVgs - T2 * VgVt_dVgs ) * T5 ; - Alpha_dT = - ( Achi_dT - T2 * VgVt_dT ) * T5 ; - - - /*-----------------------------------------------------------* - * Qiu : -Qi in unit area. - *-----------------*/ - - Qinm = 1.0e0 + Alpha * ( 1.0e0 + Alpha ) ; - T1 = 1.0e0 + Alpha + Alpha ; - Qinm_dVbs = Alpha_dVbs * T1 ; - Qinm_dVds = Alpha_dVds * T1 ; - Qinm_dVgs = Alpha_dVgs * T1 ; - Qinm_dT = Alpha_dT * T1 ; - - Qidn = Fn_Max( 1.0e0 + Alpha , epsm10 ) ; - Qidn_dVbs = Alpha_dVbs ; - Qidn_dVds = Alpha_dVds ; - Qidn_dVgs = Alpha_dVgs ; - Qidn_dT = Alpha_dT ; - - T1 = C_2o3 * VgVt * Qinm / Qidn ; - Qiu = T1 * Cox ; - T2 = 1.0 / VgVt ; - T3 = 1.0 / Qinm ; - T4 = 1.0 / Qidn ; - Qiu_dVbs = Qiu * ( VgVt_dVbs * T2 + Qinm_dVbs * T3 - Qidn_dVbs * T4 ) - + T1 * Cox_dVb ; - Qiu_dVds = Qiu * ( VgVt_dVds * T2 + Qinm_dVds * T3 - Qidn_dVds * T4) - + T1 * Cox_dVd ; - Qiu_dVgs = Qiu * ( VgVt_dVgs * T2 + Qinm_dVgs * T3 - Qidn_dVgs * T4) - + T1 * Cox_dVg ; - T1_dT = C_2o3 * ( Qidn * ( VgVt_dT * Qinm + VgVt * Qinm_dT ) - Qidn_dT * VgVt * Qinm ) - / ( Qidn * Qidn ) ; - Qiu_dT = Cox * T1_dT ; - - - /*-----------------------------------------------------------* - * Qdrat : Qd/Qi - *-----------------*/ - Qdnm = 0.5e0 + Alpha ; - Qdnm_dVbs = Alpha_dVbs ; - Qdnm_dVds = Alpha_dVds ; - Qdnm_dVgs = Alpha_dVgs ; - Qdnm_dT = Alpha_dT ; - - Qddn = Qidn * Qinm ; - Qddn_dVbs = Qidn_dVbs * Qinm + Qidn * Qinm_dVbs ; - Qddn_dVds = Qidn_dVds * Qinm + Qidn * Qinm_dVds ; - Qddn_dVgs = Qidn_dVgs * Qinm + Qidn * Qinm_dVgs ; - Qddn_dT = Qidn_dT * Qinm + Qidn * Qinm_dT ; - - Quot = 0.4e0 * Qdnm / Qddn ; - Qdrat = 0.6e0 - Quot ; - - if ( Qdrat <= 0.5e0 ) { - T1 = 1.0 / Qddn ; - T2 = 1.0 / Qdnm ; - Qdrat_dVbs = Quot * ( Qddn_dVbs * T1 - Qdnm_dVbs * T2 ) ; - Qdrat_dVds = Quot * ( Qddn_dVds * T1 - Qdnm_dVds * T2 ) ; - Qdrat_dVgs = Quot * ( Qddn_dVgs * T1 - Qdnm_dVgs * T2 ) ; - Qdrat_dT = Quot * ( Qddn_dT * T1 - Qdnm_dT * T2 ) ; - } else { - Qdrat = 0.5e0 ; - Qdrat_dVbs = 0.0e0 ; - Qdrat_dVds = 0.0e0 ; - Qdrat_dVgs = 0.0e0 ; - Qdrat_dT = 0.0e0 ; - - } - - - /*-----------------------------------------------------------* - * Interpolate charges and CLM for zone-D2. - *-----------------*/ - - if ( flg_zone == 2 ) { - T1 = Qbu ; - Qbu = FD2 * Qbu + ( 1.0 - FD2 ) * Qb0 ; - Qbu_dVbs = FD2 * Qbu_dVbs + FD2_dVbs * T1 - + ( 1.0 - FD2 ) * Qb0_dVb - FD2_dVbs * Qb0 ; - Qbu_dVds = FD2 * Qbu_dVds + FD2_dVds * T1 - + ( 1.0 - FD2 ) * Qb0_dVd - FD2_dVds * Qb0 ; - Qbu_dVgs = FD2 * Qbu_dVgs + FD2_dVgs * T1 - + ( 1.0 - FD2 ) * Qb0_dVg - FD2_dVgs * Qb0 ; - Qbu_dT = FD2 * Qbu_dT + FD2_dT * T1 - + ( 1.0 - FD2 ) * Qb0_dT - FD2_dT * Qb0 ; - - if ( Qbu < 0.0 ) { - Qbu = 0.0 ; - Qbu_dVbs = 0.0 ; - Qbu_dVds = 0.0 ; - Qbu_dVgs = 0.0 ; - Qbu_dT = 0.0 ; - } - T1 = Qiu ; - Qiu = FD2 * Qiu + ( 1.0 - FD2 ) * Qn0 ; - Qiu_dVbs = FD2 * Qiu_dVbs + FD2_dVbs * T1 - + ( 1.0 - FD2 ) * Qn0_dVbs - FD2_dVbs * Qn0 ; - Qiu_dVds = FD2 * Qiu_dVds + FD2_dVds * T1 - + ( 1.0 - FD2 ) * Qn0_dVds - FD2_dVds * Qn0 ; - Qiu_dVgs = FD2 * Qiu_dVgs + FD2_dVgs * T1 - + ( 1.0 - FD2 ) * Qn0_dVgs - FD2_dVgs * Qn0 ; - Qiu_dT = FD2 * Qiu_dT + FD2_dT * T1 - + ( 1.0 - FD2 ) * Qn0_dT - FD2_dT * Qn0 ; - - if ( Qiu < 0.0 ) { - Qiu = 0.0 ; - Qiu_dVbs = 0.0 ; - Qiu_dVds = 0.0 ; - Qiu_dVgs = 0.0 ; - Qiu_dT = 0.0 ; - } - - T1 = Qdrat ; - Qdrat = FD2 * Qdrat + ( 1.0 - FD2 ) * 0.5e0 ; - Qdrat_dVbs = FD2 * Qdrat_dVbs + FD2_dVbs * T1 - FD2_dVbs * 0.5e0 ; - Qdrat_dVds = FD2 * Qdrat_dVds + FD2_dVds * T1 - FD2_dVds * 0.5e0 ; - Qdrat_dVgs = FD2 * Qdrat_dVgs + FD2_dVgs * T1 - FD2_dVgs * 0.5e0 ; - Qdrat_dT = FD2 * Qdrat_dT + FD2_dT * T1 - FD2_dT * 0.5e0 ; - - /* note: Lred=0 in zone-D1 */ - T1 = Lred ; - Lred = FD2 * Lred ; - Lred_dVbs = FD2 * Lred_dVbs + FD2_dVbs * T1 ; - Lred_dVds = FD2 * Lred_dVds + FD2_dVds * T1 ; - Lred_dVgs = FD2 * Lred_dVgs + FD2_dVgs * T1 ; - Lred_dT = FD2 * Lred_dT + FD2_dT * T1 ; - - } /* end of flg_zone==2 if-block */ - - -start_of_mobility: - - Lch = Leff - Lred ; - if ( Lch < 1.0e-9 ) { - fprintf ( stderr , "*** warning(HiSIM_HV): actual channel length is too small. (Lch=%e[m])\n" , Lch ) ; - fprintf ( stderr , " CLM5 and/or CLM6 might be too large.\n" ) ; - Lch = 1.0e-9 ; Lch_dVbs = Lch_dVds = Lch_dVgs = 0.0 ; - Lch_dT = 0.0 ; - } else { Lch_dVbs = - Lred_dVbs ; Lch_dVds = - Lred_dVds ; Lch_dVgs = - Lred_dVgs ; - Lch_dT = - Lred_dT ; - } - - /*-----------------------------------------------------------* - * Muun : universal mobility. (CGS unit) - *-----------------*/ - - T1 = here->HSMHV_ndep_o_esi ; - T2 = here->HSMHV_ninv_o_esi ; - - T0 = here->HSMHV_ninvd ; - T4 = 1.0 + ( Psl - Ps0 ) * T0 ; - T4_dVb = ( Psl_dVbs - Ps0_dVbs ) * T0 ; - T4_dVd = ( Psl_dVds - Ps0_dVds ) * T0 ; - T4_dVg = ( Psl_dVgs - Ps0_dVgs ) * T0 ; - T4_dT = ( Psl_dT - Ps0_dT ) * T0 + ( Psl - Ps0 ) * ninvd_dT ; - - T5 = T1 * Qbu + T2 * Qiu ; - T5_dVb = T1 * Qbu_dVbs + T2 * Qiu_dVbs ; - T5_dVd = T1 * Qbu_dVds + T2 * Qiu_dVds ; - T5_dVg = T1 * Qbu_dVgs + T2 * Qiu_dVgs ; - T5_dT = T1 * Qbu_dT + T2 * Qiu_dT ; - - T3 = T5 / T4 ; - T3_dVb = ( - T4_dVb * T5 + T4 * T5_dVb ) / T4 / T4 ; - T3_dVd = ( - T4_dVd * T5 + T4 * T5_dVd ) / T4 / T4 ; - T3_dVg = ( - T4_dVg * T5 + T4 * T5_dVg ) / T4 / T4 ; - T3_dT = ( - T4_dT * T5 + T4 * T5_dT ) / T4 / T4 ; - - Eeff = T3 ; - Eeff_dVbs = T3_dVb ; - Eeff_dVds = T3_dVd ; - Eeff_dVgs = T3_dVg ; - Eeff_dT = T3_dT ; - - T5 = Fn_Pow( Eeff , model->HSMHV_mueph0 - 1.0e0 ) ; - T8 = T5 * Eeff ; - T7 = Fn_Pow( Eeff , here->HSMHV_muesr - 1.0e0 ) ; - T6 = T7 * Eeff ; - T8_dT = model->HSMHV_mueph0 * T5 * Eeff_dT ; - T6_dT = here->HSMHV_muesr * T7 * Eeff_dT ; - - - T9 = C_QE * C_m2cm_p2 ; - Rns = Qiu / T9 ; - Rns_dT = Qiu_dT / T9 ; - - T1 = 1.0e0 / ( pParam->HSMHV_muecb0 + pParam->HSMHV_muecb1 * Rns / 1.0e11 ) - + here->HSMHV_mphn0 * T8 + T6 / pParam->HSMHV_muesr1 ; - - - T1_dT = - 1.0e0 / ( pParam->HSMHV_muecb0 + pParam->HSMHV_muecb1 * Rns / 1.0e11 ) - / ( pParam->HSMHV_muecb0 + pParam->HSMHV_muecb1 * Rns / 1.0e11 ) - * pParam->HSMHV_muecb1 * Rns_dT / 1.0e11 - + here->HSMHV_mphn0 * T8_dT + mphn0_dT * T8 + T6_dT / pParam->HSMHV_muesr1 ; - - Muun = 1.0e0 / T1 ; - Muun_dT = - Muun / T1 * T1_dT ; - - T1 = 1.0e0 / ( T1 * T1 ) ; - T2 = pParam->HSMHV_muecb0 + pParam->HSMHV_muecb1 * Rns / 1.0e11 ; - T2 = 1.0e0 / ( T2 * T2 ) ; - T3 = here->HSMHV_mphn1 * T5 ; - T4 = here->HSMHV_muesr * T7 / pParam->HSMHV_muesr1 ; - T5 = - 1.0e-11 * pParam->HSMHV_muecb1 / C_QE * T2 / C_m2cm_p2 ; - Muun_dVbs = - ( T5 * Qiu_dVbs - + Eeff_dVbs * T3 + Eeff_dVbs * T4 ) * T1 ; - Muun_dVds = - ( T5 * Qiu_dVds - + Eeff_dVds * T3 + Eeff_dVds * T4 ) * T1 ; - Muun_dVgs = - ( T5 * Qiu_dVgs - + Eeff_dVgs * T3 + Eeff_dVgs * T4 ) * T1 ; - - /* Change to MKS unit */ - Muun /= C_m2cm_p2 ; - Muun_dT /= C_m2cm_p2 ; - Muun_dVbs /= C_m2cm_p2 ; - Muun_dVds /= C_m2cm_p2 ; - Muun_dVgs /= C_m2cm_p2 ; - - /*-----------------------------------------------------------* - * Mu : mobility - *-----------------*/ - T2 = beta * (Qn0 + small) * Lch ; - - - T1 = 1.0e0 / T2 ; - T3 = T1 * T1 ; - T4 = - beta * T3 ; - T5 = T4 * Lch ; - T6 = T4 * (Qn0 + small) ; - T1_dVb = ( T5 * Qn0_dVbs + T6 * Lch_dVbs) ; - T1_dVd = ( T5 * Qn0_dVds + T6 * Lch_dVds) ; - T1_dVg = ( T5 * Qn0_dVgs + T6 * Lch_dVgs) ; - T2_dT = beta_dT * (Qn0 + small) * Lch + beta * Qn0_dT * Lch + beta * (Qn0 + small) * Lch_dT ; - T1_dT = - T1 / T2 * T2_dT ; - - TY = Idd * T1 ; - TY_dVbs = Idd_dVbs * T1 + Idd * T1_dVb ; - TY_dVds = Idd_dVds * T1 + Idd * T1_dVd ; - TY_dVgs = Idd_dVgs * T1 + Idd * T1_dVg ; - TY_dT = Idd_dT * T1 + Idd * T1_dT ; - - T2 = 0.2 * Vmax / Muun ; - T3 = - T2 / Muun ; - T2_dVb = T3 * Muun_dVbs ; - T2_dVd = T3 * Muun_dVds ; - T2_dVg = T3 * Muun_dVgs ; - T2_dT = 0.2 * ( Vmax_dT * Muun - Muun_dT * Vmax )/ ( Muun * Muun ) ; - - Ey = sqrt( TY * TY + T2 * T2 ) ; - T4 = 1.0 / Ey ; - Ey_dVbs = T4 * ( TY * TY_dVbs + T2 * T2_dVb ) ; - Ey_dVds = T4 * ( TY * TY_dVds + T2 * T2_dVd ) ; - Ey_dVgs = T4 * ( TY * TY_dVgs + T2 * T2_dVg ) ; - Ey_dT = T4 * ( TY * TY_dT + T2 * T2_dT ) ; - - Em = Muun * Ey ; - Em_dVbs = Muun_dVbs * Ey + Muun * Ey_dVbs ; - Em_dVds = Muun_dVds * Ey + Muun * Ey_dVds ; - Em_dVgs = Muun_dVgs * Ey + Muun * Ey_dVgs ; - Em_dT = Ey * Muun_dT + Ey_dT * Muun ; - - T1 = Em / Vmax ; - T1_dT = ( Em_dT * Vmax - Vmax_dT * Em ) / ( Vmax * Vmax ); - - /* note: model->HSMHV_bb = 2 (electron) ;1 (hole) */ - if ( 1.0e0 - epsm10 <= model->HSMHV_bb && model->HSMHV_bb <= 1.0e0 + epsm10 ) { - T3 = 1.0e0 ; - T3_dT = 0.0e0 ; - } else if ( 2.0e0 - epsm10 <= model->HSMHV_bb && model->HSMHV_bb <= 2.0e0 + epsm10 ) { - T3 = T1 ; - T3_dT = T1_dT ; - } else { - T3 = Fn_Pow( T1 , model->HSMHV_bb - 1.0e0 ) ; - T3_dT = ( model->HSMHV_bb - 1.0e0 )* Fn_Pow( T1 , model->HSMHV_bb - 2.0e0 ) * T1_dT ; - } - T2 = T1 * T3 ; - T4 = 1.0e0 + T2 ; - T2_dT = T1 * T3_dT + T3 * T1_dT ; - T4_dT = T2_dT ; - - if ( 1.0e0 - epsm10 <= model->HSMHV_bb && model->HSMHV_bb <= 1.0e0 + epsm10 ) { - T5 = 1.0 / T4 ; - T6 = T5 / T4 ; - T5_dT = - T5 * T5 * T4_dT ; - T6_dT = T5 * T5 * ( T5_dT * T4 - T5 * T4_dT ) ; - } else if ( 2.0e0 - epsm10 <= model->HSMHV_bb && model->HSMHV_bb <= 2.0e0 + epsm10 ) { - T5 = 1.0 / sqrt( T4 ) ; - T6 = T5 / T4 ; - T5_dT = - 0.5e0 / ( T4 * sqrt(T4)) * T4_dT ; - T6_dT = ( T5_dT * T4 - T5 * T4_dT ) / T4 / T4 ; - } else { - T6 = Fn_Pow( T4 , ( - 1.0e0 / model->HSMHV_bb - 1.0e0 ) ) ; - T5 = T4 * T6 ; - T6_dT =( - 1.0e0 / model->HSMHV_bb - 1.0e0 ) * Fn_Pow( T4 , ( - 1.0e0 / model->HSMHV_bb - 2.0e0 ) ) * T4_dT ; - T5_dT = T4_dT * T6 + T4 * T6_dT ; - } - - T7 = Muun / Vmax * T6 * T3 ; - - Mu = Muun * T5 ; - Mu_dVbs = Muun_dVbs * T5 - T7 * Em_dVbs ; - Mu_dVds = Muun_dVds * T5 - T7 * Em_dVds ; - Mu_dVgs = Muun_dVgs * T5 - T7 * Em_dVgs ; - Mu_dT = Muun_dT * T5 + Muun * T5_dT ; - -/* end_of_mobility : */ - - /*-----------------------------------------------------------* - * Ids: channel current. - *-----------------*/ - betaWL = here->HSMHV_weff_nf * beta_inv / Lch ; - T1 = - betaWL / Lch ; - betaWL_dVbs = T1 * Lch_dVbs ; - betaWL_dVds = T1 * Lch_dVds ; - betaWL_dVgs = T1 * Lch_dVgs ; - betaWL_dT = here->HSMHV_weff_nf * ( beta_inv_dT * Lch - beta_inv * Lch_dT ) / ( Lch * Lch ) ; - - Ids0 = betaWL * Idd * Mu ; - T1 = betaWL * Idd ; - T2 = Idd * Mu ; - T3 = Mu * betaWL ; - Ids0_dVbs = T3 * Idd_dVbs + T1 * Mu_dVbs + T2 * betaWL_dVbs ; - Ids0_dVds = T3 * Idd_dVds + T1 * Mu_dVds + T2 * betaWL_dVds ; - Ids0_dVgs = T3 * Idd_dVgs + T1 * Mu_dVgs + T2 * betaWL_dVgs ; - Ids0_dT = T3 * Idd_dT + T1 * Mu_dT + T2 * betaWL_dT ; - - /* note: rpock procedure was removed. */ - if( flg_rsrd == 2 || flg_rsrd == 3 ){ - if( model->HSMHV_rd20 > 0.0 ){ - T4 = here->HSMHV_rd23 ; - T1 = pParam->HSMHV_rd24 * ( Vgse - model->HSMHV_rd25 ) ; - T1_dVg = pParam->HSMHV_rd24 ; - - Fn_SL( T2 , T1 , T4 , delta_rd , T0 ) ; - T2_dVg = T1_dVg * T0 ; - T3 = T4 * ( model->HSMHV_rd20 + 1.0 ) ; - Fn_SU( T7 , T2 , T3 , delta_rd , T0 ) ; - T7_dVg = T2_dVg * T0 ; - - }else{ - T7 = here->HSMHV_rd23; - T7_dVg = 0.0e0 ; - } - - /* after testing we can remove Vdse_eff_dVbs, Vdse_eff_dVds, Vdse_eff_dVgs - and Vdse_eff_dVbse, Vdse_eff_dVgse */ - if (Vdse >= 0.0) { - Vdse_eff = Vdse ; - /* Vdse_eff_dVbs = 0.0 ; */ - /* Vdse_eff_dVds = 0.0 ; */ - /* Vdse_eff_dVgs = 0.0 ; */ - /* Vdse_eff_dVbse = 0.0 ; */ - Vdse_eff_dVdse = 1.0 ; - /* Vdse_eff_dVgse = 0.0 ; */ - } else { - Vdse_eff = 0.0 ; - /* Vdse_eff_dVbs = 0.0 ; */ - /* Vdse_eff_dVds = 0.0 ; */ - /* Vdse_eff_dVgs = 0.0 ; */ - /* Vdse_eff_dVbse = 0.0 ; */ - Vdse_eff_dVdse = 0.0 ; - /* Vdse_eff_dVgse = 0.0 ; */ - } - - /* smoothing of Ra for Vdse_eff close to zero */ - /* ... smoothing parameter is Ra_N */ - if (Vdse_eff < Ra_N * small2) { - Ra_alpha = pow( Ra_N+1.0 , model->HSMHV_rd21-1.0 ) - * (Ra_N+1.0-0.5*model->HSMHV_rd21*Ra_N) - * pow( small2,model->HSMHV_rd21 ); - Ra_beta = 0.5*model->HSMHV_rd21 - * pow( Ra_N+1.0 , model->HSMHV_rd21-1.0 ) / Ra_N - * pow( small2, model->HSMHV_rd21-2.0 ); - T1 = Ra_alpha + Ra_beta*Vdse_eff*Vdse_eff; - T1_dVdse_eff = 2.0 * Ra_beta * Vdse_eff; - } else { - T1 = pow( Vdse_eff + small2 , model->HSMHV_rd21 ) ; - T1_dVdse_eff = model->HSMHV_rd21 * pow( Vdse_eff + small2 , model->HSMHV_rd21 - 1.0 ) ; - } - - T9 = pow( Vdse_eff + small2 , model->HSMHV_rd22d ) ; - T9_dVdse_eff = model->HSMHV_rd22d * pow( Vdse_eff + small2 , model->HSMHV_rd22d - 1.0 ) ; - - Ra = ( T7 * T1 + Vbse * pParam->HSMHV_rd22 * T9 ) / here->HSMHV_weff_nf ; - Ra_dVdse_eff = ( T7 * T1_dVdse_eff + Vbse * pParam->HSMHV_rd22 * T9_dVdse_eff ) / here->HSMHV_weff_nf ; - Ra_dVbs = Ra_dVdse_eff * Vdse_eff_dVbs ; - Ra_dVds = Ra_dVdse_eff * Vdse_eff_dVds ; - Ra_dVgs = Ra_dVdse_eff * Vdse_eff_dVgs + T7_dVg * T1 / here->HSMHV_weff_nf ; - Ra_dVbse = Ra_dVdse_eff * Vdse_eff_dVbse + pParam->HSMHV_rd22 * T9 / here->HSMHV_weff_nf ; - Ra_dVdse = Ra_dVdse_eff * Vdse_eff_dVdse ; - Ra_dVgse = Ra_dVdse_eff * Vdse_eff_dVgse ; - - T0 = Ra * Ids0 ; - T0_dVb = Ra_dVbs * Ids0 + Ra * Ids0_dVbs ; - T0_dVd = Ra_dVds * Ids0 + Ra * Ids0_dVds ; - T0_dVg = Ra_dVgs * Ids0 + Ra * Ids0_dVgs ; - T0_dT = Ra * Ids0_dT ; - - T1 = Vds + small2 ; - T2 = 1.0 / T1 ; - T3 = 1.0 + T0 * T2 ; - T3_dVb = T0_dVb * T2 ; - T3_dVd = ( T0_dVd * T1 - T0 ) * T2 * T2 ; - T3_dVg = T0_dVg * T2 ; - T3_dT = T0_dT * T2 ; - - T4 = 1.0 / T3 ; - Ids = Ids0 * T4 ; - T5 = T4 * T4 ; - Ids_dVbs = ( Ids0_dVbs * T3 - Ids0 * T3_dVb ) * T5 ; - Ids_dVds = ( Ids0_dVds * T3 - Ids0 * T3_dVd ) * T5 ; - Ids_dVgs = ( Ids0_dVgs * T3 - Ids0 * T3_dVg ) * T5 ; - Ids_dT = ( Ids0_dT * T3 - Ids0 * T3_dT ) * T5 ; - Ids_dRa = - Ids * Ids / ( Vds + small ) ; - - } else { - Ids = Ids0 ; - Ids_dVbs = Ids0_dVbs ; - Ids_dVds = Ids0_dVds ; - Ids_dVgs = Ids0_dVgs ; - Ids_dT = Ids0_dT ; - Ra = 0.0 ; - Ra_dVbs = Ra_dVds = Ra_dVgs = 0.0 ; - Ra_dVbse = Ra_dVdse = Ra_dVgse = 0.0 ; - Ids_dRa = 0.0 ; - } - /* just for testing -- can be removed */ - /* if (!(ckt->CKTmode & MODEINITPRED)) - printf("rrb %e %e %e %e %e %e\n",ckt->CKTtime,here->HSMHV_mode*Vdse,Ra,Ra_dVdse, - Vdse_eff,Vdse_eff_dVdse) ; */ - - /* if ( Pds < ps_conv ) { */ - if ( Pds < 0.0 ) { - Ids_dVbs = 0.0 ; - Ids_dVgs = 0.0 ; - Ids_dT = 0.0 ; - } - - Ids += Gdsmin * Vds ; - Ids_dVds += Gdsmin ; - - - /*-----------------------------------------------------------* - * STI - *-----------------*/ - if ( model->HSMHV_coisti != 0 ) { - /*---------------------------------------------------* - * dVthSCSTI : Short-channel effect induced by Vds (STI). - *-----------------*/ - T1 = C_ESI * Cox_inv ; - T2 = here->HSMHV_wdpl ; - T3 = here->HSMHV_lgatesm - model->HSMHV_parl2 ; - T4 = 1.0 / (T3 * T3) ; - T5 = 2.0 * (model->HSMHV_vbi - Pb20b) * T1 * T2 * T4 ; - - dVth0 = T5 * sqrt_Pbsum ; - T6 = T5 * 0.5 / sqrt_Pbsum ; - T7 = 2.0 * (model->HSMHV_vbi - Pb20b) * C_ESI * T2 * T4 * sqrt_Pbsum ; - T8 = - 2.0 * T1 * T2 * T4 * sqrt_Pbsum ; - dVth0_dVb = T6 * Pbsum_dVb + T7 * Cox_inv_dVb + T8 * Pb20b_dVb ; - dVth0_dVd = T6 * Pbsum_dVd + T7 * Cox_inv_dVd + T8 * Pb20b_dVd ; - dVth0_dVg = T6 * Pbsum_dVg + T7 * Cox_inv_dVg + T8 * Pb20b_dVg ; - dVth0_dT = T6 * Pbsum_dT + T8 * Pb20b_dT ; - - T4 = pParam->HSMHV_scsti1 ; - T6 = pParam->HSMHV_scsti2 ; - T1 = T4 + T6 * Vdsz ; - dVthSCSTI = dVth0 * T1 ; - dVthSCSTI_dVb = dVth0_dVb * T1 + dVth0 * T6 * Vdsz_dVbs ; - dVthSCSTI_dVd = dVth0_dVd * T1 + dVth0 * T6 * Vdsz_dVds ; - dVthSCSTI_dVg = dVth0_dVg * T1 ; - dVthSCSTI_dT = dVth0_dT * T1 + dVth0 * T6 * Vdsz_dT ; - - T1 = pParam->HSMHV_vthsti - model->HSMHV_vdsti * Vds ; - T1_dVd = - model->HSMHV_vdsti ; - - Vgssti = Vgsz - Vfb + T1 + dVthSCSTI ; - Vgssti_dVbs = Vgsz_dVbs + dVthSCSTI_dVb ; - Vgssti_dVds = Vgsz_dVds + T1_dVd + dVthSCSTI_dVd ; - Vgssti_dVgs = Vgsz_dVgs + dVthSCSTI_dVg ; - Vgssti_dT = Vgsz_dT + dVthSCSTI_dT ; - - costi0 = here->HSMHV_costi0 ; - costi1 = here->HSMHV_costi1 ; - - costi3 = here->HSMHV_costi0_p2 * Cox_inv * Cox_inv ; - T1 = 2.0 * here->HSMHV_costi0_p2 * Cox_inv ; - costi3_dVb = T1 * Cox_inv_dVb ; - costi3_dVd = T1 * Cox_inv_dVd ; - costi3_dVg = T1 * Cox_inv_dVg ; - costi3_dT = 2 * here->HSMHV_costi0 * here->HSMHV_costi00 * 0.5 / sqrt(here->HSMHV_beta_inv) * beta_inv_dT * Cox_inv * Cox_inv ; - T2 = 1.0 / costi3 ; - costi3_dVb_c3 = costi3_dVb * T2 ; - costi3_dVd_c3 = costi3_dVd * T2 ; - costi3_dVg_c3 = costi3_dVg * T2 ; -/* costi3_dT_c3 = costi3_dT * T2 ;*/ - - costi4 = costi3 * beta * 0.5 ; - costi4_dT = ( costi3_dT * beta + costi3 * beta_dT ) * 0.5 ; - costi5 = costi4 * beta * 2.0 ; - costi5_dT = ( costi4_dT * beta + costi4 * beta_dT ) * 2.0 ; - - T11 = beta * 0.25 ; - T11_dT = beta_dT * 0.25 ; - T10 = beta_inv - costi3 * T11 + Vfb - pParam->HSMHV_vthsti - dVthSCSTI + small ; - T10_dVb = - T11 * costi3_dVb - dVthSCSTI_dVb ; - T10_dVd = - T11 * costi3_dVd - dVthSCSTI_dVd ; - T10_dVg = - T11 * costi3_dVg - dVthSCSTI_dVg ; - T10_dT = beta_inv_dT - ( costi3_dT * T11 + costi3 * T11_dT ) - dVthSCSTI_dT ; - - T1 = Vgsz - T10 - psisti_dlt ; - T1_dVb = Vgsz_dVbs - T10_dVb ; - T1_dVd = Vgsz_dVds - T10_dVd ; - T1_dVg = Vgsz_dVgs - T10_dVg ; - T1_dT = - T10_dT ; - T0 = Fn_Sgn(T10) ; - T2 = sqrt (T1 * T1 + T0 * 4.0 * T10 * psisti_dlt) ; - T3 = T10 + 0.5 * (T1 + T2) - Vfb + pParam->HSMHV_vthsti + dVthSCSTI - Vbsz ; - T3_dVb = T10_dVb + 0.5 * (T1_dVb + (T1 * T1_dVb + T0 * 2.0 * T10_dVb * psisti_dlt) / T2) - + dVthSCSTI_dVb - Vbsz_dVbs ; - T3_dVd = T10_dVd + 0.5 * (T1_dVd + (T1 * T1_dVd + T0 * 2.0 * T10_dVd * psisti_dlt) / T2) - + dVthSCSTI_dVd - Vbsz_dVds ; - T3_dVg = T10_dVg + 0.5 * (T1_dVg + (T1 * T1_dVg + T0 * 2.0 * T10_dVg * psisti_dlt) / T2) - + dVthSCSTI_dVg ; - T3_dT = T10_dT + 0.5 * (T1_dT + (T1 * T1_dT + T0 * 2.0 * T10_dT * psisti_dlt) / T2) - + dVthSCSTI_dT - Vbsz_dT ; - - T4 = beta * T3 - 1.0 ; - T4_dT = beta_dT * T3 + beta * T3_dT ; - T5 = 4.0 / costi5 ; - T5_dT = - 4.0 / ( costi5 * costi5 ) * costi5_dT ; - T1 = 1.0 + T4 * T5 ; - T6 = beta * T5 ; - T7 = T4 * T5 ; - T1_dVb = (T6 * T3_dVb - T7 * costi3_dVb_c3) ; - T1_dVd = (T6 * T3_dVd - T7 * costi3_dVd_c3) ; - T1_dVg = (T6 * T3_dVg - T7 * costi3_dVg_c3) ; - T1_dT = T4_dT * T5 + T4 * T5_dT ; - Fn_SZ( T1 , T1, 1.0e-2, T2) ; - T1_dVb *= T2 ; - T1_dVd *= T2 ; - T1_dVg *= T2 ; - T1_dT *= T2 ; - costi6 = sqrt(T1) ; - costi6_dT = 0.5 / sqrt(T1) * T1_dT ; - T0 = costi4 * (1.0 - costi6) ; - T0_dT = costi4_dT * (1.0 - costi6) + costi4 * ( - costi6_dT ) ; - Psasti = Vgssti + T0 ; - T2 = 0.5 * costi4 / costi6 ; - Psasti_dVbs = Vgssti_dVbs + costi3_dVb_c3 * T0 - T2 * T1_dVb ; - Psasti_dVds = Vgssti_dVds + costi3_dVd_c3 * T0 - T2 * T1_dVd ; - Psasti_dVgs = Vgssti_dVgs + costi3_dVg_c3 * T0 - T2 * T1_dVg ; - Psasti_dT = Vgssti_dT + T0_dT ; - - T0 = 1.0 / (beta + 2.0 / (Vgssti + small)) ; - T0_dT = - 1.0 / ((beta + 2.0 / (Vgssti + small)) * (beta + 2.0 / (Vgssti + small))) * ( beta_dT - 2 / ((Vgssti + small) * (Vgssti + small)) * Vgssti_dT ); - Psbsti = log (1.0 / costi1 / costi3 * (Vgssti * Vgssti)) * T0 ; - T1 = 1 / costi1 / costi3 * (Vgssti * Vgssti) ; - - costi1_dT = 2 * here->HSMHV_nin * Nin_dT * here->HSMHV_nsti_p2 ; - - T1_dT = ( - 1 / costi1 / costi1 * costi1_dT / costi3 - 1 / costi3 / costi3 * costi3_dT / costi1 ) * Vgssti * Vgssti + 1 / costi1 / costi3 * 2 * Vgssti * Vgssti_dT ; - T2 = 2.0 * T0 / (Vgssti + small) ; - T3 = Psbsti / (Vgssti + small) ; - Psbsti_dVbs = T2 * (Vgssti_dVbs - 0.5 * costi3_dVb_c3 * Vgssti - + T3 * Vgssti_dVbs ) ; - Psbsti_dVds = T2 * (Vgssti_dVds - 0.5 * costi3_dVd_c3 * Vgssti - + T3 * Vgssti_dVds ) ; - Psbsti_dVgs = T2 * (Vgssti_dVgs - 0.5 * costi3_dVg_c3 * Vgssti - + T3 * Vgssti_dVgs ) ; - Psbsti_dT = 1 / T1 * T1_dT * T0 + log( T1 ) * T0_dT ; - - Psab = Psbsti - Psasti - sti2_dlt ; - Psab_dVbs = Psbsti_dVbs - Psasti_dVbs ; - Psab_dVds = Psbsti_dVds - Psasti_dVds ; - Psab_dVgs = Psbsti_dVgs - Psasti_dVgs ; - Psab_dT = Psbsti_dT - Psasti_dT ; - T0 = sqrt (Psab * Psab + 4.0 * sti2_dlt * Psbsti) ; - Psti = Psbsti - 0.5 * (Psab + T0) ; - T1 = 1.0 / T0 ; - Psti_dVbs = Psbsti_dVbs - - 0.5 * ( Psab_dVbs - + ( Psab * Psab_dVbs + 2.0 * sti2_dlt * Psbsti_dVbs ) * T1 ) ; - Psti_dVds = Psbsti_dVds - - 0.5 * ( Psab_dVds - + ( Psab * Psab_dVds + 2.0 * sti2_dlt * Psbsti_dVds ) * T1 ) ; - Psti_dVgs = Psbsti_dVgs - - 0.5 * ( Psab_dVgs - + ( Psab * Psab_dVgs + 2.0 * sti2_dlt * Psbsti_dVgs ) * T1 ) ; - Psti_dT = Psbsti_dT - - 0.5 * ( Psab_dT - + ( Psab * Psab_dT + 2.0 * sti2_dlt * Psbsti_dT ) * T1 ) ; - - T0 = costi1 * exp (beta * Psti) ; - T0_dT = costi1_dT * exp(beta * Psti) + costi1 * exp(beta * Psti) * ( beta_dT * Psti + beta * Psti_dT ) ; - T1 = beta * (Psti - Vbsz) - 1.0 + T0 ; - T1_dVb = beta * ((Psti_dVbs - Vbsz_dVbs) + T0 * Psti_dVbs) ; - T1_dVd = beta * ((Psti_dVds - Vbsz_dVds) + T0 * Psti_dVds) ; - T1_dVg = beta * (Psti_dVgs + T0 * Psti_dVgs) ; - T1_dT = beta_dT * (Psti - Vbsz) + beta * (Psti_dT - Vbsz_dT) + T0_dT ; - Fn_SZ ( T1 , T1, 1.0e-2, T0) ; - T1 += epsm10 ; - T1_dVb *= T0 ; - T1_dVd *= T0 ; - T1_dVg *= T0 ; - T1_dT *= T0 ; - sq1sti = sqrt (T1); - T2 = 0.5 / sq1sti ; - sq1sti_dVbs = T2 * T1_dVb ; - sq1sti_dVds = T2 * T1_dVd ; - sq1sti_dVgs = T2 * T1_dVg ; - sq1sti_dT = T2 * T1_dT ; - - T1 = beta * (Psti - Vbsz) - 1.0; - T1_dVb = beta * (Psti_dVbs - Vbsz_dVbs) ; - T1_dVd = beta * (Psti_dVds - Vbsz_dVds) ; - T1_dVg = beta * Psti_dVgs ; - T1_dT = beta_dT * ( Psti - Vbsz ) + beta * (Psti_dT - Vbsz_dT) ; - Fn_SZ( T1 , T1, 1.0e-2, T0) ; - T1 += epsm10 ; - T1_dVb *= T0 ; - T1_dVd *= T0 ; - T1_dVg *= T0 ; - T1_dT *= T0 ; - sq2sti = sqrt (T1); - T2 = 0.5 / sq2sti ; - sq2sti_dVbs = T2 * T1_dVb ; - sq2sti_dVds = T2 * T1_dVd ; - sq2sti_dVgs = T2 * T1_dVg ; - sq2sti_dT = T2 * T1_dT ; - - Qn0sti = costi0 * (sq1sti - sq2sti) ; - Qn0sti_dVbs = costi0 * (sq1sti_dVbs - sq2sti_dVbs) ; - Qn0sti_dVds = costi0 * (sq1sti_dVds - sq2sti_dVds) ; - Qn0sti_dVgs = costi0 * (sq1sti_dVgs - sq2sti_dVgs) ; - Qn0sti_dT = costi0 * (sq1sti_dT - sq2sti_dT) + here->HSMHV_costi00 * 0.5 / sqrt( here->HSMHV_beta_inv ) * beta_inv_dT * (sq1sti - sq2sti) ; - - /* T1: Vdsatsti */ - T1 = Psasti - Psti ; - T1_dVb = Psasti_dVbs - Psti_dVbs ; - T1_dVd = Psasti_dVds - Psti_dVds ; - T1_dVg = Psasti_dVgs - Psti_dVgs ; - T1_dT = Psasti_dT - Psti_dT ; - - Fn_SZ( T1 , T1 , 1.0e-1 , T2 ) ; - T1_dVb *= T2 ; - T1_dVd *= T2 ; - T1_dVg *= T2 ; - T1_dT *= T2 ; - - TX = Vds / T1 ; - T2 = 1.0 / ( T1 * T1 ) ; - TX_dVbs = T2 * ( - Vds * T1_dVb ) ; - TX_dVds = T2 * ( T1 - Vds * T1_dVd ) ; - TX_dVgs = T2 * ( - Vds * T1_dVg ) ; - TX_dT = T2 * ( - Vds * T1_dT ) ; - - Fn_CP( TY , TX , 1.0 , 4 , T2 ) ; - TY_dVbs = T2 * TX_dVbs ; - TY_dVds = T2 * TX_dVds ; - TY_dVgs = T2 * TX_dVgs ; - TY_dT = T2 * TX_dT ; - - costi7 = 2.0 * here->HSMHV_wsti * here->HSMHV_nf * beta_inv ; - costi7_dT = 2.0 * here->HSMHV_wsti * here->HSMHV_nf * beta_inv_dT ; - T1 = Lch ; - Idssti = costi7 * Mu * Qn0sti * TY / T1 ; - T3 = 1.0 / T1 ; - T4 = Mu * Qn0sti * TY / T1 / T1 ; - T5 = Mu * Qn0sti ; - Idssti_dVbs = costi7 * (((Mu_dVbs * Qn0sti + Mu * Qn0sti_dVbs) * TY - + T5 * TY_dVbs ) * T3 - - Lch_dVbs * T4 ) ; - Idssti_dVds = costi7 * (((Mu_dVds * Qn0sti + Mu * Qn0sti_dVds) * TY - + T5 * TY_dVds ) * T3 - - Lch_dVds * T4 ) ; - Idssti_dVgs = costi7 * (((Mu_dVgs * Qn0sti + Mu * Qn0sti_dVgs) * TY - + T5 * TY_dVgs ) * T3 - - Lch_dVgs * T4 ) ; - Idssti_dT = costi7 * (((Mu_dT * Qn0sti + Mu * Qn0sti_dT) * TY - + T5 * TY_dT ) * T3 - - Lch_dT * T4 ) + costi7_dT * Mu * Qn0sti * TY / T1 ; - - Ids = Ids + Idssti ; - Ids_dVbs = Ids_dVbs + Idssti_dVbs ; - Ids_dVds = Ids_dVds + Idssti_dVds ; - Ids_dVgs = Ids_dVgs + Idssti_dVgs ; - Ids_dT = Ids_dT + Idssti_dT ; - - } - - - - /*----------------------------------------------------------* - * induced gate noise. ( Part 1/3 ) - *----------------------*/ - if ( model->HSMHV_coign != 0 && model->HSMHV_cothrml != 0 ) { - kusai00 = VgVt * VgVt ; - kusaidd = 2.0e0 * beta_inv * Cox_inv * Idd ; - kusaiL = kusai00 - kusaidd ; - Fn_SZ( kusai00 , kusai00 , 1.0e-3 , T0 ) ; - Fn_SZ( kusaiL , kusaiL , 1.0e-3 , T0 ) ; - kusai00L = kusai00 - kusaiL ; - if ( Qn0 < epsm10 || kusai00L < epsm10 ) flg_ign = 0 ; - else flg_ign = 1 ; - } - - /*-----------------------------------------------------------* - * End of PART-1. (label) - *-----------------*/ - end_of_part_1: - - /*----------------------------------------------------------* - * Evaluate integrated charges in unit [C]. - *----------------------*/ - - T1 = - here->HSMHV_weffcv_nf * Leff ; - - Qb = T1 * Qbu ; - Qb_dVbs = T1 * Qbu_dVbs ; - Qb_dVds = T1 * Qbu_dVds ; - Qb_dVgs = T1 * Qbu_dVgs ; - Qb_dT = T1 * Qbu_dT ; - - Qi = T1 * Qiu ; - Qi_dVbs = T1 * Qiu_dVbs ; - Qi_dVds = T1 * Qiu_dVds ; - Qi_dVgs = T1 * Qiu_dVgs ; - Qi_dT = T1 * Qiu_dT ; - - Qd = Qi * Qdrat ; - Qd_dVbs = Qi_dVbs * Qdrat + Qi * Qdrat_dVbs ; - Qd_dVds = Qi_dVds * Qdrat + Qi * Qdrat_dVds ; - Qd_dVgs = Qi_dVgs * Qdrat + Qi * Qdrat_dVgs ; - Qd_dT = Qi_dT * Qdrat + Qi * Qdrat_dT ; - - - /*-----------------------------------------------------------* - * Modified potential for symmetry. - *-----------------*/ - T1 = ( Vds - Pds ) / 2 ; - Fn_SymAdd( Pzadd , T1 , model->HSMHV_pzadd0 , T2 ) ; - T2 /= 2 ; - Pzadd_dVbs = T2 * ( - Pds_dVbs ) ; - Pzadd_dVds = T2 * ( 1.0 - Pds_dVds ) ; - Pzadd_dVgs = T2 * ( - Pds_dVgs ) ; - Pzadd_dT = T2 * ( -Pds_dT ); - - - if ( Pzadd < epsm10 ) { - Pzadd = epsm10 ; - Pzadd_dVbs = 0.0 ; - Pzadd_dVds = 0.0 ; - Pzadd_dVgs = 0.0 ; - Pzadd_dT = 0.0 ; - } - - Ps0z = Ps0 + Pzadd ; - Ps0z_dVbs = Ps0_dVbs + Pzadd_dVbs ; - Ps0z_dVds = Ps0_dVds + Pzadd_dVds ; - Ps0z_dVgs = Ps0_dVgs + Pzadd_dVgs ; - Ps0z_dT = Ps0_dT + Pzadd_dT ; - - - /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ - * PART-2: Substrate / gate / leak currents - *++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ - - /*-----------------------------------------------------------* - * Isub : substrate current induced by impact ionization. - *-----------------*/ - - if ( flg_noqi == 1 || model->HSMHV_coisub == 0 ) { - /* Accumulation zone or nonconductive case, in which Ids==0. */ - Isub = 0.0e0 ; - Isub_dVbs = Isub_dVds = Isub_dVgs = 0.0e0 ; - Isub_dT = 0.0; - } else { - /*-------------------------------------------* - * Conductive case. - *-----------------*/ - if ( pParam->HSMHV_sub1 > 0.0e0 && pParam->HSMHV_vmax > 0.0e0 ) { - T0 = here->HSMHV_vg2const ; - T1 = T0 * Vgp ; - T1_dVd = T0 * Vgp_dVds ; - T1_dVg = T0 * Vgp_dVgs ; - T1_dVb = T0 * Vgp_dVbs ; - T1_dT = T0 * Vgp_dT ; - - T7 = Cox0 * Cox0 ; - T8 = here->HSMHV_qnsub_esi ; - T3 = T8 / T7 ; - - T9 = 2.0 / T8 ; - T4 = 1.0e0 + T9 * T7 ; - - T2 = here->HSMHV_xvbs ; - T5 = T1 - beta_inv - T2 * Vbsz ; - T5_dVd = T1_dVd - T2 * Vbsz_dVds; - T5_dVg = T1_dVg ; - T5_dVb = T1_dVb - T2 * Vbsz_dVbs; - T5_dT = - beta_inv_dT + T1_dT - T2 * Vbsz_dT ; - - T6 = T4 * T5 ; - T6_dVd = T4 * T5_dVd ; - T6_dVg = T4 * T5_dVg ; - T6_dVb = T4 * T5_dVb ; - T6_dT = T4 * T5_dT ; - Fn_SZ( T6 , T6, 1.0e-3, T9) ; - T6 += small ; - T6_dVd *= T9 ; - T6_dVg *= T9 ; - T6_dVb *= T9 ; - T6_dT *= T9 ; - T6 = sqrt( T6 ) ; - T9 = 0.5 / T6 ; - T6_dVd = T9 * T6_dVd ; - T6_dVg = T9 * T6_dVg ; - T6_dVb = T9 * T6_dVb ; - T6_dT = T9 * T6_dT ; - - Psislsat = T1 + T3 * ( 1.0 - T6 ) ; - Psislsat_dVd = T1_dVd - T3 * T6_dVd ; - Psislsat_dVg = T1_dVg - T3 * T6_dVg ; - Psislsat_dVb = T1_dVb - T3 * T6_dVb ; - Psislsat_dT = T1_dT - T3 * T6_dT ; - - T2 = here->HSMHV_lgate / (here->HSMHV_xgate + here->HSMHV_lgate) ; - - Psisubsat = pParam->HSMHV_svds * Vdsz + Ps0z - T2 * Psislsat ; - Psisubsat_dVd = pParam->HSMHV_svds * Vdsz_dVds + Ps0z_dVds - T2 * Psislsat_dVd ; - Psisubsat_dVg = Ps0z_dVgs - T2 * Psislsat_dVg ; - Psisubsat_dVb = pParam->HSMHV_svds * Vdsz_dVbs + Ps0z_dVbs - T2 * Psislsat_dVb ; - Psisubsat_dT = pParam->HSMHV_svds * Vdsz_dT + Ps0z_dT - T2 * Psislsat_dT ; - Fn_SZ( Psisubsat , Psisubsat, 1.0e-3, T9 ) ; - Psisubsat += small ; - Psisubsat_dVd *= T9 ; - Psisubsat_dVg *= T9 ; - Psisubsat_dVb *= T9 ; - Psisubsat_dT *= T9 ; - - T5 = here->HSMHV_xsub1 ; - T6 = here->HSMHV_xsub2 ; - T2 = exp( - T6 / Psisubsat ) ; - T3 = T2 * T6 / ( Psisubsat * Psisubsat ) ; - T2_dVd = T3 * Psisubsat_dVd ; - T2_dVg = T3 * Psisubsat_dVg ; - T2_dVb = T3 * Psisubsat_dVb ; - T2_dT = T3 * Psisubsat_dT ; - - Isub = T5 * Psisubsat * Ids * T2 ; - Isub_dVds = T5 * ( Psisubsat_dVd * Ids * T2 - + Psisubsat * Ids_dVds * T2 - + Psisubsat * Ids * T2_dVd ) ; - Isub_dVgs = T5 * ( Psisubsat_dVg * Ids * T2 - + Psisubsat * Ids_dVgs * T2 - + Psisubsat * Ids * T2_dVg ) ; - Isub_dVbs = T5 * ( Psisubsat_dVb * Ids * T2 - + Psisubsat * Ids_dVbs * T2 - + Psisubsat * Ids * T2_dVb ) ; - Isub_dT = T5 * ( Psisubsat_dT * Ids * T2 - + Psisubsat * Ids_dT * T2 - + Psisubsat * Ids * T2_dT ) ; - - } else { - Isub = 0.0e0 ; - Isub_dVbs = Isub_dVds = Isub_dVgs = 0.0e0 ; - Isub_dT = 0.0e0 ; - } /* end of if ( pParam->HSMHV_sub1 ... ) else block. */ - - /*---------------------------------------------------* - * Impact-Ionization Current in the Drift Region - *-----------------*/ - T8 = here->HSMHV_subld1 ; - if ( T8 != 0.0 ) { - T0 = ( Vdse + Ps0 - Psdl ) ; - T0_dVb = Ps0_dVbs - Psdl_dVbs ; - T0_dVd = Ps0_dVds - Psdl_dVds ; - T0_dVg = Ps0_dVgs - Psdl_dVgs ; - T0_dT = Ps0_dT - Psdl_dT ; - - Fn_SZ( T0, T0, 1e-6, T1 ) ; - T0_dVb *= T1 ; - T0_dVd *= T1 ; - T0_dVg *= T1 ; - T0_dT *= T1 ; - - T1 = sqrt( VgVt + small ) ; - T3 = 1.0 / ( 2.0 * T1 ) ; - T1_dVb = VgVt_dVbs * T3 ; - T1_dVd = VgVt_dVds * T3 ; - T1_dVg = VgVt_dVgs * T3 ; - T1_dT = VgVt_dT * T3 ; - - T4 = 1.0 / ( T0 * T1 ) ; - T7 = Ldrift * hereMKS->HSMHV_subld2 ; - T2= exp( - T7 * T4 ); - T6 = T7 * T2 * T4 * T4 ; - T2_dVb = ( T0_dVb * T1 + T0 * T1_dVb ) * T6 ; - T2_dVd = ( T0_dVd * T1 + T0 * T1_dVd ) * T6 ; - T2_dVg = ( T0_dVg * T1 + T0 * T1_dVg ) * T6 ; - T2_dT = ( T0_dT * T1 + T0 * T1_dT ) * T6 ; - T2_dVdse = T1 * T6 ; - - T5 = T8 * Ids * T0 * T2 ; - T5_dVb = T8 * ( Ids_dVbs * T0 * T2 + Ids * T0_dVb * T2 + Ids * T0 * T2_dVb ) ; - T5_dVd = T8 * ( Ids_dVds * T0 * T2 + Ids * T0_dVd * T2 + Ids * T0 * T2_dVd ) ; - T5_dVg = T8 * ( Ids_dVgs * T0 * T2 + Ids * T0_dVg * T2 + Ids * T0 * T2_dVg ) ; - T5_dT = T8 * ( Ids_dT * T0 * T2 + Ids * T0_dT * T2 + Ids * T0 * T2_dT ) ; - T5_dVdse = T8 * ( Ids_dRa * Ra_dVdse * T0 * T2 + Ids * T2 + Ids * T0 * T2_dVdse ) ; - - Isub += T5 ; - Isub_dVgs += T5_dVg ; - Isub_dVds += T5_dVd ; - Isub_dVbs += T5_dVb ; - Isub_dT += T5_dT ; - Isub_dVdse += T5_dVdse ; - } - - } - - - /*---------------------------------------------------* - * Impact-Ionization Induced Bulk Potential Change (IBPC) - *-----------------*/ - if ( flg_noqi == 0 && Isub > 0e0 && pParam->HSMHV_ibpc1 != 0e0 ) { - - /* delta Vbs */ - T0 = 1e0 + pParam->HSMHV_ibpc2 * dVth ; - dVbsIBPC = pParam->HSMHV_ibpc1 * T0 * Isub ; - dVbsIBPC_dVbs = pParam->HSMHV_ibpc1 * ( pParam->HSMHV_ibpc2 * dVth_dVb * Isub + T0 * Isub_dVbs ) ; - dVbsIBPC_dVds = pParam->HSMHV_ibpc1 * ( pParam->HSMHV_ibpc2 * dVth_dVd * Isub + T0 * Isub_dVds ) ; - dVbsIBPC_dVgs = pParam->HSMHV_ibpc1 * ( pParam->HSMHV_ibpc2 * dVth_dVg * Isub + T0 * Isub_dVgs ) ; - dVbsIBPC_dT = pParam->HSMHV_ibpc1 * ( pParam->HSMHV_ibpc2 * dVth_dT * Isub + T0 * Isub_dT ) ; - - /* dG3 & dG4 */ - T10 = 1e0 / Xi0 ; - T10_dT = - T10 / Xi0 * Xi0_dT ; - T1 = beta * dVbsIBPC * T10 ; - T11 = T10 * T10; - T1_dVb = beta * ( dVbsIBPC_dVbs * Xi0 - dVbsIBPC * Xi0_dVbs ) * T11 ; - T1_dVd = beta * ( dVbsIBPC_dVds * Xi0 - dVbsIBPC * Xi0_dVds ) * T11 ; - T1_dVg = beta * ( dVbsIBPC_dVgs * Xi0 - dVbsIBPC * Xi0_dVgs ) * T11 ; - T1_dT = beta_dT * dVbsIBPC * T10 + beta * dVbsIBPC_dT * T10 + beta * dVbsIBPC * T10_dT ; - - - T10 = 1e0 / Xil ; - T10_dT = - T10 / Xil * Xil_dT ; - T2 = beta * dVbsIBPC * T10 ; - T11 = T10 * T10; - T2_dVb = beta * ( dVbsIBPC_dVbs * Xil - dVbsIBPC * Xil_dVbs ) * T11 ; - T2_dVd = beta * ( dVbsIBPC_dVds * Xil - dVbsIBPC * Xil_dVds ) * T11 ; - T2_dVg = beta * ( dVbsIBPC_dVgs * Xil - dVbsIBPC * Xil_dVgs ) * T11 ; - T2_dT = beta_dT * dVbsIBPC * T10 + beta * dVbsIBPC_dT * T10 + beta * dVbsIBPC * T10_dT ; - - - dG3 = cnst0 * ( Xilp32 * T2 - Xi0p32 * T1 ) ; - dG3_dVbs = cnst0 * ( Xilp32_dVbs * T2 + Xilp32 * T2_dVb - Xi0p32_dVbs * T1 - Xi0p32 * T1_dVb ) ; - dG3_dVds = cnst0 * ( Xilp32_dVds * T2 + Xilp32 * T2_dVd - Xi0p32_dVds * T1 - Xi0p32 * T1_dVd ) ; - dG3_dVgs = cnst0 * ( Xilp32_dVgs * T2 + Xilp32 * T2_dVg - Xi0p32_dVgs * T1 - Xi0p32 * T1_dVg ) ; - dG3_dT = cnst0 * ( Xilp32_dT * T2 + Xilp32 * T2_dT - Xi0p32_dT * T1 - Xi0p32 * T1_dT ) - + cnst0_dT * ( Xilp32 * T2 - Xi0p32 * T1 ) ; - - dG4 = cnst0 * 0.5 * ( - Xilp12 * T2 + Xi0p12 * T1 ) ; - dG4_dVbs = cnst0 * 0.5 * ( - Xilp12_dVbs * T2 - Xilp12 * T2_dVb + Xi0p12_dVbs * T1 + Xi0p12 * T1_dVb ) ; - dG4_dVds = cnst0 * 0.5 * ( - Xilp12_dVds * T2 - Xilp12 * T2_dVd + Xi0p12_dVds * T1 + Xi0p12 * T1_dVd ) ; - dG4_dVgs = cnst0 * 0.5 * ( - Xilp12_dVgs * T2 - Xilp12 * T2_dVg + Xi0p12_dVgs * T1 + Xi0p12 * T1_dVg ) ; - dG4_dT = cnst0 * 0.5 * ( - Xilp12_dT * T2 - Xilp12 * T2_dT + Xi0p12_dT * T1 + Xi0p12 * T1_dT ) - + cnst0_dT *0.5 * ( - Xilp12 * T2 + Xi0p12 * T1 ) ; - - /* Add IBPC current into Ids */ - dIdd = dG3 + dG4 ; - dIdd_dVbs = dG3_dVbs + dG4_dVbs ; - dIdd_dVds = dG3_dVds + dG4_dVds ; - dIdd_dVgs = dG3_dVgs + dG4_dVgs ; - dIdd_dT = dG3_dT + dG4_dT ; - - IdsIBPC = betaWL * dIdd * Mu ; - IdsIBPC_dVbs = betaWL * ( Mu * dIdd_dVbs + dIdd * Mu_dVbs ) + betaWL_dVbs * Mu * dIdd ; - IdsIBPC_dVds = betaWL * ( Mu * dIdd_dVds + dIdd * Mu_dVds ) + betaWL_dVds * Mu * dIdd ; - IdsIBPC_dVgs = betaWL * ( Mu * dIdd_dVgs + dIdd * Mu_dVgs ) + betaWL_dVgs * Mu * dIdd ; - IdsIBPC_dT = betaWL * ( Mu * dIdd_dT + dIdd * Mu_dT ) + betaWL_dT * Mu * dIdd ; - - - } /* End if (IBPC) */ - - T3 = 1 / TTEMP ; - T0 =- model->HSMHV_igtemp2 * T3 * T3 - - 2 * model->HSMHV_igtemp3 * T3 * T3 * T3 ; - Egp12_dT = 0.5 * T0 / Egp12; - Egp32_dT = 1.5 * T0 * Egp12; - - /*-----------------------------------------------------------* - * Igate : Gate current induced by tunneling. - *-----------------*/ - if ( model->HSMHV_coiigs != 0 ) { - /* Igate */ - if ( flg_noqi == 0 ) { - Psdlz = Ps0z + Vdsz - epsm10 ; - Psdlz_dVbs = Ps0z_dVbs + Vdsz_dVbs ; - Psdlz_dVds = Ps0z_dVds + Vdsz_dVds ; - Psdlz_dVgs = Ps0z_dVgs ; - Psdlz_dT = Ps0z_dT ; - - T1 = Vgsz - Vfb + modelMKS->HSMHV_gleak4 * (dVth - dPpg) * Leff - Psdlz * pParam->HSMHV_gleak3 ; - T3 = modelMKS->HSMHV_gleak4 * Leff ; - T1_dVg = Vgsz_dVgs + T3 * (dVth_dVg - dPpg_dVg) - Psdlz_dVgs * pParam->HSMHV_gleak3 ; - T1_dVd = Vgsz_dVds + T3 * (dVth_dVd - dPpg_dVd) - Psdlz_dVds * pParam->HSMHV_gleak3 ; - T1_dVb = Vgsz_dVbs + T3 * ( dVth_dVb - dPpg_dVb ) - Psdlz_dVbs * pParam->HSMHV_gleak3 ; - T1_dT = Vgsz_dT + T3 * ( dVth_dT - dPpg_dT ) - Psdlz_dT * pParam->HSMHV_gleak3 ; - - T3 = 2.0 * T1 ; - T1_dVg = T3 * T1_dVg ; - T1_dVd = T3 * T1_dVd ; - T1_dVb = T3 * T1_dVb ; - T1_dT = T3 * T1_dT ; - T1 *= T1 ; - - T3 = 1.0 / Tox0 ; - T2 = T1 * T3 ; - T2_dVg = (T1_dVg ) * T3 ; - T2_dVd = (T1_dVd ) * T3 ; - T2_dVb = (T1_dVb ) * T3 ; - T2_dT = T1_dT * T3 ; - - T3 = 1.0 / modelMKS->HSMHV_gleak5 ; - T7 = 1.0 + Ey * T3 ; - T7_dVg = Ey_dVgs * T3 ; - T7_dVd = Ey_dVds * T3 ; - T7_dVb = Ey_dVbs * T3 ; - T7_dT = Ey_dT * T3 ; - - Etun = T2 * T7 ; - Etun_dVgs = T2_dVg * T7 + T7_dVg * T2 ; - Etun_dVds = T2_dVd * T7 + T7_dVd * T2 ; - Etun_dVbs = T2_dVb * T7 + T7_dVb * T2 ; - Etun_dT = T2_dT * T7 + T7_dT * T2 ; - - Fn_SZ( Etun , Etun , igate_dlt , T5 ) ; - Etun_dVgs *= T5 ; - Etun_dVds *= T5 ; - Etun_dVbs *= T5 ; - Etun_dT *= T5 ; - - Fn_SZ( T3 , Vgsz , 1.0e-3 , T4 ) ; - T3 -= model->HSMHV_vzadd0 ; - T3_dVb = 0.5 * (Vgsz_dVbs + Vgsz * Vgsz_dVbs/TMF2); - TX = T3 / cclmmdf ; - TX_dVbs = T3_dVb / cclmmdf ; - T2 = 1.0 + TX * TX ; - T2_dVb = 2 * TX_dVbs * TX ; - T1 = 1.0 - 1.0 / T2 ; - T1_dVb = T2_dVb / T2 / T2 ; - T1_dVg = 2.0 * TX * T4 / ( T2 * T2 * cclmmdf ) ; - T1_dVd = T1_dVg * Vgsz_dVds ; - Etun_dVgs = T1 * Etun_dVgs + Etun * T1_dVg ; - Etun_dVds = T1 * Etun_dVds + Etun * T1_dVd ; - Etun_dVbs = Etun_dVbs * T1 + Etun * T1_dVb ; - Etun_dT *= T1 ; - Etun *= T1 ; - - T0 = Leff * here->HSMHV_weff_nf ; - T7 = modelMKS->HSMHV_gleak7 / (modelMKS->HSMHV_gleak7 + T0) ; - - T6 = pParam->HSMHV_gleak6 ; - T9 = T6 / (T6 + Vdsz) ; - T9_dVb = - T9 / (T6 + Vdsz) * Vdsz_dVbs ; - T9_dVd = - T9 / (T6 + Vdsz) * Vdsz_dVds ; - - T4 = 1 / (Etun + small ) ; - T1 = - pParam->HSMHV_gleak2 * Egp32 * T4 ; - T3 = pParam->HSMHV_gleak2 * T4 * T4; - T1_dT = T3 * (Egp32 * Etun_dT - Egp32_dT * (Etun + small )) ; - - if ( T1 < - EXP_THR ) { - Igate = 0.0 ; - Igate_dVbs = Igate_dVds = Igate_dVgs = Igate_dT = 0.0 ; - } else { - T2 = exp ( T1 ) ; - T2_dT = T1_dT * T2 ; - - T3 = pParam->HSMHV_gleak1 / Egp12 * C_QE * T0 ; - T3_dT = - Egp12_dT * pParam->HSMHV_gleak1 / Egp12 / Egp12 * C_QE * T0 ; - - T5 = 1 / cnst0 ; - T6 = sqrt ((Qiu + Cox0 * VgVt_small )* T5 ) ; - T6_dT = ( ( ( cnst0 * Qiu_dT - cnst0_dT * ( Qiu + Cox0 * VgVt_small ) ) * T5 * T5 ) ) / T6 * 0.5 ; - T4 = T2 * T3 * T6 ; - T4_dT = T2_dT * T3 * T6 + T2 * T3_dT * T6 + T2 * T3 * T6_dT; - T5 = T4 * Etun ; - T6 = 0.5 * Etun / (Qiu + Cox0 * VgVt_small ) ; - T10 = T5 * Etun ; - T10_dVb = T5 * (2.0 * Etun_dVbs - T1 * Etun_dVbs + T6 * Qiu_dVbs) ; - T10_dVd = T5 * (2.0 * Etun_dVds - T1 * Etun_dVds + T6 * Qiu_dVds) ; - T10_dVg = T5 * (2.0 * Etun_dVgs - T1 * Etun_dVgs + T6 * Qiu_dVgs) ; - T10_dT = 2 * T5 * Etun_dT + T4_dT * Etun * Etun ; - - Igate = T7 * T9 * T10 ; - Igate_dVbs = T7 * (T9 * T10_dVb + T9_dVb * T10) ; - Igate_dVds = T7 * (T9_dVd * T10 + T9 * T10_dVd) ; - Igate_dVgs = T7 * T9 * T10_dVg ; - Igate_dT = T7 * T9 * T10_dT ; - } - } - - /* Igs */ - T0 = - pParam->HSMHV_glksd2 * Vgs + modelMKS->HSMHV_glksd3 ; - T2 = exp (Tox0 * T0); - T2_dVg = (- Tox0 * pParam->HSMHV_glksd2) * T2; - - T0 = Vgs / Tox0 / Tox0 ; - T3 = Vgs * T0 ; - T3_dVg = 2.0 * T0 * (1.0 ) ; - T4 = pParam->HSMHV_glksd1 / 1.0e6 * here->HSMHV_weff_nf ; - Igs = T4 * T2 * T3 ; - Igs_dVgs = T4 * (T2_dVg * T3 + T2 * T3_dVg) ; - Igs_dVds = 0.0 ; - Igs_dVbs = 0.0 ; - Igs_dT = 0.0 ; - - if ( Vgs >= 0.0e0 ){ - Igs *= -1.0 ; - Igs_dVgs *= -1.0 ; - Igs_dVds *= -1.0 ; - Igs_dVbs *= -1.0 ; - } - - - /* Igd */ - T1 = Vgs - Vds ; - T0 = - pParam->HSMHV_glksd2 * T1 + modelMKS->HSMHV_glksd3 ; - T2 = exp (Tox0 * T0); - T2_dVg = (- Tox0 * pParam->HSMHV_glksd2) * T2; - T2_dVd = (+ Tox0 * pParam->HSMHV_glksd2) * T2; - T2_dVb = 0.0 ; - - T0 = T1 / Tox0 / Tox0 ; - T3 = T1 * T0 ; - T3_dVg = 2.0 * T0 ; - T3_dVd = - 2.0 * T0 ; - T3_dVb = 0.0 ; - T4 = pParam->HSMHV_glksd1 / 1.0e6 * here->HSMHV_weff_nf ; - Igd = T4 * T2 * T3 ; - Igd_dVgs = T4 * (T2_dVg * T3 + T2 * T3_dVg) ; - Igd_dVds = T4 * (T2_dVd * T3 + T2 * T3_dVd) ; - Igd_dVbs = 0.0 ; - Igd_dT = 0.0 ; - - if( T1 >= 0.0e0 ){ - Igd *= -1.0 ; - Igd_dVgs *= -1.0 ; - Igd_dVds *= -1.0 ; - Igd_dVbs *= -1.0 ; - } - - - /* Igb */ - Etun = ( - ( Vgs - Vbs ) + Vfb + model->HSMHV_glkb3 ) / Tox0 ; - Etun_dVgs = - 1.0 / Tox0 ; - Etun_dVds = 0.0 ; - Etun_dVbs = 1.0 / Tox0 ; - - Fn_SZ( Etun , Etun, igate_dlt, T5) ; - Etun += small ; - Etun_dVgs *= T5 ; - Etun_dVbs *= T5 ; - - T1 = - pParam->HSMHV_glkb2 / Etun ; - if ( T1 < - EXP_THR ) { - Igb = 0.0 ; - Igb_dVgs = Igb_dVds = Igb_dVbs = Igb_dT = 0.0 ; - } else { - T2 = exp ( T1 ); - T3 = pParam->HSMHV_glkb2 / ( Etun * Etun ) * T2 ; - T2_dVg = T3 * Etun_dVgs ; - T2_dVb = T3 * Etun_dVbs ; - - T3 = pParam->HSMHV_glkb1 * here->HSMHV_weff_nf * Leff ; - Igb = T3 * Etun * Etun * T2 ; - Igb_dVgs = T3 * (2.0 * Etun * Etun_dVgs * T2 + Etun * Etun * T2_dVg); - Igb_dVds = 0.0 ; - Igb_dVbs = T3 * (2.0 * Etun * Etun_dVbs * T2 + Etun * Etun * T2_dVb); - Igb_dT = 0.0; - } - - /* Ifn: Fowler-Nordheim tunneling current */ - Eg12 = here->HSMHV_sqrt_eg ; - Eg32 = here->HSMHV_eg * Eg12 ; - T2 = - ( pParam->HSMHV_fvbs * Vbsz - Vgsz + dVthSC + dVthLP - pParam->HSMHV_fn3 ) / Tox0 ; - T2_dVd = - ( pParam->HSMHV_fvbs * Vbsz_dVds - Vgsz_dVds + dVthSC_dVd + dVthLP_dVd - ) / Tox0 ; - T2_dVg = - ( - Vgsz_dVgs + dVthSC_dVg + dVthLP_dVg - ) / Tox0 ; - T2_dVb = - ( pParam->HSMHV_fvbs * Vbsz_dVbs -Vgsz_dVbs + dVthSC_dVb + dVthLP_dVb - ) / Tox0 ; - T2_dT = - ( pParam->HSMHV_fvbs * Vbsz_dT -Vgsz_dT + dVthSC_dT + dVthLP_dT - ) / Tox0 ; - - T0 = T2 * T2 ; - T1 = pParam->HSMHV_fn2 * Eg32 ; - T1_dT = 1.5 * Eg_dT * pParam->HSMHV_fn2 * Eg12 ; - T3 = - T1 / T2 ; - if ( T3 < - EXP_THR ) { - T5 = 0.0 ; - T5_dVd = T5_dVg = T5_dVb = T5_dT = 0.0 ; - - } else { - T5 = exp( T3 ) ; - T5_dVd = T5 * T1 * T2_dVd / T0 ; - T5_dVg = T5 * T1 * T2_dVg / T0 ; - T5_dVb = T5 * T1 * T2_dVb / T0 ; - T5_dT = T5 * T1 * T2_dT / T0 ; - } - - T4 = C_QE * pParam->HSMHV_fn1 * here->HSMHV_weff_nf * here->HSMHV_lgate / Eg12 ; - T4_dT = (- 0.5) * Eg_dT * T4 / here->HSMHV_eg ; - if ( 2e0 * T2 + T1 < 0e0 ){ - Ifn = 0.25e0 * T4 * T1 * T1 * c_exp_2 ; /* minimum value */ - Ifn_dVd = 0e0 ; - Ifn_dVg = 0e0 ; - Ifn_dVb = 0e0 ; - Ifn_dT = 0.25e0 * T4_dT * T1 * T1 * c_exp_2 ; - } else { - Ifn = T4 * T0 * T5 ; - Ifn_dVd = T4 * ( 2.0 * T2 * T2_dVd * T5 + T0 * T5_dVd ) ; - Ifn_dVg = T4 * ( 2.0 * T2 * T2_dVg * T5 + T0 * T5_dVg ) ; - Ifn_dVb = T4 * ( 2.0 * T2 * T2_dVb * T5 + T0 * T5_dVb ) ; - Ifn_dT = T4 * ( 2.0 * T2 * T2_dT * T5 + T0 * T5_dT ) +T4_dT * T0 * T5; - } - Igb -= Ifn ; - Igb_dVbs -= Ifn_dVb ; - Igb_dVds -= Ifn_dVd ; - Igb_dVgs -= Ifn_dVg ; - Igb_dT -= Ifn_dT ; - } /* if ( model->HSMHV_coiigs == 0 ) */ - - - /*-----------------------------------------------------------* - * Vdsp : Vds modification for GIDL/GISL - *-----------------*/ - if ( model->HSMHV_cogidl != 0 ) { - T1 = Vds * (1.0 - gidla * Vds) - gidlvds_dlt ; - T2 = sqrt (T1 * T1 + 4.0 * gidlvds_dlt * Vds) ; - Vdsp = Vds - 0.5 * (T1 + T2) ; - T3 = 1.0 - 2.0 * gidla * Vds ; - Vdsp_dVd = 1.0 - 0.5 * (T3 + (T1 * T3 + 2.0 * gidlvds_dlt) / T2) ; - } - - /*-----------------------------------------------------------* - * Igidl : GIDL - *-----------------*/ - if( model->HSMHV_cogidl == 0 ){ - Igidl = 0.0e0 ; - Igidl_dVbs = 0.0e0 ; - Igidl_dVds = 0.0e0 ; - Igidl_dVgs = 0.0e0 ; - Igidl_dT = 0.0e0 ; - } else { - T1 = model->HSMHV_gidl3 * (Vdsp + model->HSMHV_gidl4) - Vgs + (dVthSC + dVthLP) * model->HSMHV_gidl5 ; - T1_dT = (dVthSC_dT + dVthLP_dT) * model->HSMHV_gidl5 ; - T2 = 1.0 / Tox0 ; - E1 = T1 * T2 ; - E1_dVb = ((model->HSMHV_gidl5 * (dVthSC_dVb + dVthLP_dVb)) ) * T2 ; - E1_dVd = ((model->HSMHV_gidl3 * Vdsp_dVd) + model->HSMHV_gidl5 * (dVthSC_dVd + dVthLP_dVd)) * T2 ; - E1_dVg = (-1.0 + model->HSMHV_gidl5 * (dVthSC_dVg + dVthLP_dVg) ) * T2 ; - E1_dT = T1_dT * T2 ; - - Fn_SZ( Egidl , E1, eef_dlt, T5) ; - Egidl_dVb = T5 * E1_dVb ; - Egidl_dVd = T5 * E1_dVd ; - Egidl_dVg = T5 * E1_dVg ; - Egidl_dT = T5 * E1_dT ; - - T3 = 1 / (Egidl + small) ; - T0 = - pParam->HSMHV_gidl2 * Egp32 * T3 ; - T0_dT = - pParam->HSMHV_gidl2 * T3 *( Egp32_dT - Egidl_dT * T3 * Egp32 ) ; - if ( T0 < - EXP_THR ) { - Igidl = 0.0 ; - Igidl_dVbs = Igidl_dVds = Igidl_dVgs = Igidl_dT = 0.0 ; - } else { - T1 = exp ( T0 ) ; - T1_dT = T0_dT * T1 ; - T2 = pParam->HSMHV_gidl1 / Egp12 * C_QE * here->HSMHV_weff_nf ; - T2_dT = - Egp12_dT * pParam->HSMHV_gidl1 / Egp12 / Egp12 * C_QE * here->HSMHV_weff_nf ; - Igidl = T2 * Egidl * Egidl * T1 ; - T3 = T2 * T1 * Egidl * (2.0 + pParam->HSMHV_gidl2 * Egp32 * Egidl / (Egidl + small) / (Egidl + small)) ; - Igidl_dVbs = T3 * Egidl_dVb ; - Igidl_dVds = T3 * Egidl_dVd ; - Igidl_dVgs = T3 * Egidl_dVg ; - Igidl_dT = T2 * T1 * Egidl * 2.0 * Egidl_dT + T2 * Egidl * Egidl * T1_dT + T2_dT * Egidl * Egidl * T1; - } - - /* bug-fix */ - Vdb = Vds - Vbs ; - if ( Vdb > 0.0 ) { - T2 = Vdb * Vdb ; - T4 = T2 * Vdb ; - T0 = T4 + C_gidl_delta ; - T5 = T4 / T0 ; - T7 = ( 3.0 * T2 * T0 - T4 * 3.0 * T2 ) / ( T0 * T0 ) ; /* == T5_dVdb */ - Igidl_dVbs = Igidl_dVbs * T5 + Igidl * T7 * ( - 1.0 ) ; /* Vdb_dVbs = -1 */ - Igidl_dVds = Igidl_dVds * T5 + Igidl * T7 * ( + 1.0 ) ; /* Vdb_dVds = +1 */ - Igidl_dVgs = Igidl_dVgs * T5 ; /* Vdb_dVgs = 0 */ - Igidl_dT = Igidl_dT * T5 ; /* Vdb_dT = 0 */ - Igidl *= T5 ; - } else { - Igidl = 0.0 ; - Igidl_dVbs = Igidl_dVds = Igidl_dVgs = Igidl_dT = 0.0 ; - } - } - - - /*-----------------------------------------------------------* - * Igisl : GISL - *-----------------*/ - if( model->HSMHV_cogidl == 0){ - Igisl = 0.0e0 ; - Igisl_dVbs = 0.0e0 ; - Igisl_dVds = 0.0e0 ; - Igisl_dVgs = 0.0e0 ; - Igisl_dT = 0.0e0 ; - } else { - T1 = model->HSMHV_gidl3 * ( - Vdsp + model->HSMHV_gidl4 ) - - ( Vgs - Vdsp ) + ( dVthSC + dVthLP ) * model->HSMHV_gidl5 ; - - T1_dT = ( dVthSC_dT + dVthLP_dT ) * model->HSMHV_gidl5 ; - T2 = 1.0 / Tox0 ; - E1 = T1 * T2 ; - E1_dVb = ((model->HSMHV_gidl5 * (dVthSC_dVb + dVthLP_dVb)) ) * T2 ; - E1_dVd = (((1.0-model->HSMHV_gidl3 ) * Vdsp_dVd) + model->HSMHV_gidl5 * (dVthSC_dVd + dVthLP_dVd)) * T2 ; - E1_dVg = (-1.0 + model->HSMHV_gidl5 * (dVthSC_dVg + dVthLP_dVg) ) * T2 ; - E1_dT = T1_dT * T2 ; - - Fn_SZ( Egisl , E1, eef_dlt, T5) ; - Egisl_dVb = T5 * E1_dVb ; - Egisl_dVd = T5 * E1_dVd ; - Egisl_dVg = T5 * E1_dVg ; - Egisl_dT = T5 * E1_dT ; - - T3 = 1 / (Egisl + small) ; - T0 = - pParam->HSMHV_gidl2 * Egp32 * T3 ; - T0_dT = - pParam->HSMHV_gidl2 * T3 * ( Egp32_dT - Egisl_dT * T3 * Egp32 ) ; - if ( T0 < - EXP_THR ) { - Igisl = 0.0 ; - Igisl_dVbs = Igisl_dVds = Igisl_dVgs = Igisl_dT = 0.0 ; - } else { - T1 = exp ( T0 ) ; - T1_dT = T0_dT * T1 ; - T3 = 1 / Egp12 ; - T2 = pParam->HSMHV_gidl1 * T3 * C_QE * here->HSMHV_weff_nf ; - T2_dT = - pParam->HSMHV_gidl1 * Egp12_dT * T3 * T3 * C_QE * here->HSMHV_weff_nf ; - Igisl = T2 * Egisl * Egisl * T1 ; - T3 = T2 * T1 * Egisl * (2.0 + pParam->HSMHV_gidl2 * Egp32 * Egisl / (Egisl + small) / (Egisl + small)) ; - Igisl_dVbs = T3 * Egisl_dVb ; - Igisl_dVds = T3 * Egisl_dVd ; - Igisl_dVgs = T3 * Egisl_dVg ; - Igisl_dT = T2 * T1 * Egisl * 2.0 * Egisl_dT + T2_dT * Egisl * Egisl * T1 + T2 * Egisl * Egisl * T1_dT ; - } - - /* bug-fix */ - Vsb = - Vbs ; - if ( Vsb > 0.0 ) { - T2 = Vsb * Vsb ; - T4 = T2 * Vsb ; - T0 = T4 + C_gidl_delta ; - T5 = T4 / T0 ; - T7 = ( 3.0 * T2 * T0 - T4 * 3.0 * T2 ) / ( T0 * T0 ) ; /* == T5_dVsb */ - Igisl_dVbs = Igisl_dVbs * T5 + Igisl * T7 * ( - 1.0 ) ; /* Vsb_dVbs = -1 */ - Igisl_dVds = Igisl_dVds * T5 ; /* Vsb_dVds = 0 */ - Igisl_dVgs = Igisl_dVgs * T5 ; /* Vsb_dVgs = 0 */ - Igisl_dT = Igisl_dT * T5 ; /* Vsb_dT = 0 */ - Igisl *= T5 ; - } else { - Igisl = 0.0 ; - Igisl_dVbs = Igisl_dVds = Igisl_dVgs = Igisl_dT = 0.0 ; - } - } - - - /*-----------------------------------------------------------* - * End of PART-2. (label) - *-----------------*/ -/* end_of_part_2: */ - - - /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ - * PART-3: Overlap charge - *++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ - Aclm = pParam->HSMHV_clm1 ; - if ( flg_noqi != 0 ) { - /*-------------------------------------------* - * Calculation of Psdl for cases of flg_noqi==1. - *-----------------*/ - Psdl = Aclm * (Vds + Ps0) + (1.0e0 - Aclm) * Psl ; - Psdl_dVbs = Aclm * Ps0_dVbs + (1.0e0 - Aclm) * Psl_dVbs ; - Psdl_dVds = Aclm * (1.0e0 + Ps0_dVds) + (1.0e0 - Aclm) * Psl_dVds ; - Psdl_dVgs = Aclm * Ps0_dVgs + (1.0e0 - Aclm) * Psl_dVgs ; - if ( Psdl > Ps0 + Vds - epsm10 ) { - Psdl = Ps0 + Vds - epsm10 ; - Psdl_dVbs = Ps0_dVbs ; - Psdl_dVds = Ps0_dVds + 1.0 ; - Psdl_dVgs = Ps0_dVgs ; - } - - if (model->HSMHV_xqy !=0) { - Ec = 0.0e0 ; - Ec_dVbs =0.0e0 ; - Ec_dVds =0.0e0 ; - Ec_dVgs =0.0e0 ; - Ec_dT =0.0e0 ; - } - } else { - /* Ec is removed from Lred calc. part */ - if (model->HSMHV_xqy !=0) { - if ( Idd < C_IDD_MIN ) { - Ec = 0.0e0 ; - Ec_dVbs =0.0e0 ; - Ec_dVds =0.0e0 ; - Ec_dVgs =0.0e0 ; - } else { - T1 = beta_inv / Leff ; - T1_dT = beta_inv_dT / Leff ; - T2 = 1.0 / Qn0 ; - T3 = T2 * T2 ; - Ec = Idd * T1 * T2 ; - Ec_dVbs = T1 * (Idd_dVbs * T2 - Idd * Qn0_dVbs * T3 ) ; - Ec_dVds = T1 * (Idd_dVds * T2 - Idd * Qn0_dVds * T3 ) ; - Ec_dVgs = T1 * (Idd_dVgs * T2 - Idd * Qn0_dVgs * T3 ) ; - Ec_dT = T1 * (Idd_dT * T2 - Idd * Qn0_dT * T3 ) - + T1_dT * Idd * T2 ; - } - } - } - - /*-----------------------------------------------------------* - * Overlap charges - *-----------------*/ - Coovlps = (int)ModeNML * model->HSMHV_coovlps + (int)ModeRVS * model->HSMHV_coovlp ; - Coovlpd = (int)ModeRVS * model->HSMHV_coovlps + (int)ModeNML * model->HSMHV_coovlp ; - Lovers = ModeNML * here->HSMHV_lovers + ModeRVS * here->HSMHV_loverld ; - Loverd = ModeRVS * here->HSMHV_lovers + ModeNML * here->HSMHV_loverld ; - Novers = ModeNML * pParam->HSMHV_novers + ModeRVS * pParam->HSMHV_nover ; - Noverd = ModeRVS * pParam->HSMHV_novers + ModeNML * pParam->HSMHV_nover ; - CVDSOVER = pParam->HSMHV_cvdsover ; - - /*---------------------------------------------------* - * Source side (mode-dependent) - *-----------------*/ - /*-----------------------------------* - * Constant capacitance model - *-----------------*/ - if ( Coovlps == 0 ) { - flg_overgiven = ( (int)ModeNML * model->HSMHV_cgso_Given - + (int)ModeRVS * model->HSMHV_cgdo_Given ) ; - if ( flg_overgiven ) { - Cgso = ModeNML * pParam->HSMHV_cgso + ModeRVS * pParam->HSMHV_cgdo ; - Cgso *= - here->HSMHV_weffcv_nf ; - } else { - Cgso = - Cox0 * Lovers * here->HSMHV_weffcv_nf ; - } - - Qgso = - Cgso * Vgse ; - Qgso_dVbse = 0.0 ; - Qgso_dVdse = 0.0 ; - Qgso_dVgse = - Cgso ; - - /*-----------------------------------* - * Simplified model - *-----------------*/ - } else { /* Coovlps != 0 begin */ - if ( Lovers > 0.0 && Novers == 0.0 ){ - cov_slp = modelMKS->HSMHV_ovslp ; - cov_mag = model->HSMHV_ovmag ; - T1 = Cox0 * here->HSMHV_weffcv_nf ; - T4 = cov_slp * T1 * ( cov_mag + Vgs ) ; - T4_dVg = cov_slp * T1 ; - T4_dVd = 0.0 ; - T5 = Lovers * T1 ; - T9 = 1.2e0 - Ps0 ; - Qgos = Vgs * T5 - T4 * T9 ; - Qgos_dVbs = T4 * Ps0_dVbs ; - Qgos_dVds = T4 * Ps0_dVds - T9 * T4_dVd ; - Qgos_dVgs = T5 + T4 * Ps0_dVgs - T9 * T4_dVg ; - Qgos_dT = T4 * Ps0_dT; - - /*-----------------------------------* - * Surface potential model - *------------------------*/ - } else if ( Lovers > 0.0 && Novers >= 0.0 ) { - - Vgbgmt = Vgs - Vbs ; - Vgbgmt_dVbs = -1.0 ; - Vgbgmt_dVds = 0.0 ; - Vgbgmt_dVgs = 1.0 ; - Vxbgmt = - Vbs ; - Vxbgmt_dVbs = -1.0 ; - Vxbgmt_dVds = 0.0 ; - Vxbgmt_dVgs = 0.0 ; - - Nover_func = Novers ; - cnst0over_func = ModeNML * here->HSMHV_cnst0overs + ModeRVS * here->HSMHV_cnst0over ; - cnst0over_func_dT = ModeNML * cnst0overs_dT + ModeRVS * cnst0over_dT ; -/* ps0ldinib_func = ModeNML * here->HSMHV_ps0ldinibs + ModeRVS * here->HSMHV_ps0ldinib ;*/ -/* ps0ldinib_func_dT = ModeNML * ps0ldinibs_dT + ModeRVS * ps0ldinib_dT ;*/ -#include "hsmhveval_qover.h" - - T4 = here->HSMHV_weffcv_nf * Lovers * ( 1 - CVDSOVER ) ; - - Qovs = T4 * QsuLD ; - Qovs_dVds = T4 * QsuLD_dVds ; - Qovs_dVgs = T4 * QsuLD_dVgs ; - Qovs_dVbs = T4 * QsuLD_dVbs ; - Qovs_dT = T4 * QsuLD_dT ; - -/* QisLD = T4 * QiuLD ;*/ - QisLD_dVbs = T4 * QiuLD_dVbs ; - QisLD_dVds = T4 * QiuLD_dVds ; - QisLD_dVgs = T4 * QiuLD_dVgs ; - QisLD_dT = T4 * QiuLD_dT ; - - QbsLD = T4 * QbuLD ; -/* QbsLD_dVbs = T4 * QbuLD_dVbs ; - QbsLD_dVds = T4 * QbuLD_dVds ; - QbsLD_dVgs = T4 * QbuLD_dVgs ; - QbsLD_dT = T4 * QbuLD_dT ; -*/ - - - if ( CVDSOVER != 0.0 ) { /* Qovsext begin */ - Vgbgmt = Vgse - Vbse ; - Vgbgmt_dVbs = -1.0 ; - Vgbgmt_dVds = 0.0 ; - Vgbgmt_dVgs = 1.0 ; - Vxbgmt = - Vbse ; - Vxbgmt_dVbs = -1.0 ; - Vxbgmt_dVds = 0.0 ; - Vxbgmt_dVgs = 0.0 ; - -#include "hsmhveval_qover.h" - - T4 = here->HSMHV_weffcv_nf * Lovers * CVDSOVER ; - Qovsext = T4 * QsuLD ; - Qovsext_dVdse = T4 * QsuLD_dVds ; - Qovsext_dVgse = T4 * QsuLD_dVgs ; - Qovsext_dVbse = T4 * QsuLD_dVbs ; - Qovsext_dT = T4 * QsuLD_dT ; - -/* QisLDext = T4 * QiuLD ;*/ - QisLDext_dVbse = T4 * QiuLD_dVbs ; - QisLDext_dVdse = T4 * QiuLD_dVds ; - QisLDext_dVgse = T4 * QiuLD_dVgs ; - QisLDext_dT = T4 * QiuLD_dT ; - - QbsLDext = T4 * QbuLD ; -/* QbsLDext_dVbse = T4 * QbuLD_dVbs ; - QbsLDext_dVdse = T4 * QbuLD_dVds ; - QbsLDext_dVgse = T4 * QbuLD_dVgs ; - QbsLDext_dT = T4 * QbuLD_dT ; -*/ - } /* Qovsext end */ - - } - - /*-----------------------------------* - * Additional constant capacitance model - *-----------------*/ - flg_overgiven = ( (int)ModeNML * model->HSMHV_cgso_Given - + (int)ModeRVS * model->HSMHV_cgdo_Given ) ; - if ( flg_overgiven ) { - Cgso = ModeNML * pParam->HSMHV_cgso + ModeRVS * pParam->HSMHV_cgdo ; - Cgso *= - here->HSMHV_weffcv_nf ; - } - Qgso = - Cgso * Vgse ; - Qgso_dVbse = 0.0 ; - Qgso_dVdse = 0.0 ; - Qgso_dVgse = - Cgso ; - } /* Coovlps != 0 end */ - - /*---------------------------------------------------* - * Drain side (mode-dependent) - *-----------------*/ - /*-----------------------------------* - * Constant capacitance model - *-----------------*/ - if ( Coovlpd == 0 ) { - flg_overgiven = ( (int)ModeRVS * model->HSMHV_cgso_Given - + (int)ModeNML * model->HSMHV_cgdo_Given ) ; - if ( flg_overgiven ) { - Cgdo = ModeRVS * pParam->HSMHV_cgso + ModeNML * pParam->HSMHV_cgdo ; - Cgdo *= - here->HSMHV_weffcv_nf ; - } else { - Cgdo = - Cox0 * Loverd * here->HSMHV_weffcv_nf ; - } - - Qgdo = - Cgdo * (Vgse - Vdse) ; - Qgdo_dVbse = 0.0 ; - Qgdo_dVdse = Cgdo ; - Qgdo_dVgse = - Cgdo ; - - /*-----------------------------------* - * Simplified model - *-----------------*/ - } else { /* Coovlpd != 0 begin */ - if ( Loverd > 0.0 && Noverd == 0.0 ){ - cov_slp = modelMKS->HSMHV_ovslp ; - cov_mag = model->HSMHV_ovmag ; - T1 = Cox0 * here->HSMHV_weffcv_nf ; - T4 = cov_slp * T1 * ( cov_mag + Vgs - Vds ) ; - T4_dVg = cov_slp * T1 ; - T4_dVd = - cov_slp * T1 ; - T5 = Loverd * T1 ; - T9 = 1.2e0 + Vds - Psl ; - Qgod = ( Vgs - Vds ) * T5 - T4 * T9 ; - Qgod_dVbs = + T4 * Psl_dVbs ; - Qgod_dVds = - T5 + T4 * ( -1.0 + Psl_dVds ) - T9 * T4_dVd ; - Qgod_dVgs = + T5 + T4 * Psl_dVgs - T9 * T4_dVg ; - Qgod_dT = T4 * Psl_dT; - - - /*-----------------------------------* - * Surface potential model - *------------------------*/ - } else if ( Loverd > 0.0 && Noverd >= 0.0 ) { - - Vgbgmt = Vgs - Vbs ; - Vgbgmt_dVbs = -1.0 ; - Vgbgmt_dVds = 0.0 ; - Vgbgmt_dVgs = 1.0 ; - Vxbgmt = Vds - Vbs ; - Vxbgmt_dVbs = -1.0 ; - Vxbgmt_dVds = 1.0 ; - Vxbgmt_dVgs = 0.0 ; - - Nover_func = Noverd ; - cnst0over_func = ModeNML * here->HSMHV_cnst0over + ModeRVS * here->HSMHV_cnst0overs ; - cnst0over_func_dT = ModeNML * cnst0over_dT + ModeRVS * cnst0overs_dT ; -/* ps0ldinib_func = ModeNML * here->HSMHV_ps0ldinib + ModeRVS * here->HSMHV_ps0ldinibs ;*/ -/* ps0ldinib_func_dT = ModeNML * ps0ldinib_dT + ModeRVS * ps0ldinibs_dT ;*/ -#include "hsmhveval_qover.h" - - T4 = here->HSMHV_weffcv_nf * Loverd * ( 1 - CVDSOVER ) ; - Qovd = T4 * QsuLD ; - Qovd_dVds = T4 * QsuLD_dVds ; - Qovd_dVgs = T4 * QsuLD_dVgs ; - Qovd_dVbs = T4 * QsuLD_dVbs ; - Qovd_dT = T4 * QsuLD_dT ; - -/* QidLD = T4 * QiuLD ;*/ - QidLD_dVbs = T4 * QiuLD_dVbs ; - QidLD_dVds = T4 * QiuLD_dVds ; - QidLD_dVgs = T4 * QiuLD_dVgs ; - QidLD_dT = T4 * QiuLD_dT ; - - QbdLD = T4 * QbuLD ; - QbdLD_dVbs = T4 * QbuLD_dVbs ; - QbdLD_dVds = T4 * QbuLD_dVds ; - QbdLD_dVgs = T4 * QbuLD_dVgs ; - QbdLD_dT = T4 * QbuLD_dT ; - - - if ( CVDSOVER != 0.0 ) { /* Qovdext begin */ - Vgbgmt = Vgse - Vbse ; - Vgbgmt_dVbs = -1.0 ; - Vgbgmt_dVds = 0.0 ; - Vgbgmt_dVgs = 1.0 ; - Vxbgmt = Vdse - Vbse ; - Vxbgmt_dVbs = -1.0 ; - Vxbgmt_dVds = 1.0 ; - Vxbgmt_dVgs = 0.0 ; - -#include "hsmhveval_qover.h" - - T4 = here->HSMHV_weffcv_nf * Loverd * CVDSOVER ; - Qovdext = T4 * QsuLD ; - Qovdext_dVdse = T4 * QsuLD_dVds ; - Qovdext_dVgse = T4 * QsuLD_dVgs ; - Qovdext_dVbse = T4 * QsuLD_dVbs ; - Qovdext_dT = T4 * QsuLD_dT ; - -/* QidLDext = T4 * QiuLD ;*/ - QidLDext_dVbse = T4 * QiuLD_dVbs ; - QidLDext_dVdse = T4 * QiuLD_dVds ; - QidLDext_dVgse = T4 * QiuLD_dVgs ; - QidLDext_dT = T4 * QiuLD_dT ; - - QbdLDext = T4 * QbuLD ; - QbdLDext_dVbse = T4 * QbuLD_dVbs ; - QbdLDext_dVdse= T4 * QbuLD_dVds ; - QbdLDext_dVgse= T4 * QbuLD_dVgs ; - QbdLDext_dT = T4 * QbuLD_dT ; - - } /* Qovdext end */ - - } - /*-----------------------------------* - * Additional constant capacitance model - *-----------------*/ - flg_overgiven = ( (int)ModeRVS * model->HSMHV_cgso_Given - + (int)ModeNML * model->HSMHV_cgdo_Given ) ; - if ( flg_overgiven ) { - Cgdo = ModeRVS * pParam->HSMHV_cgso + ModeNML * pParam->HSMHV_cgdo ; - Cgdo *= - here->HSMHV_weffcv_nf ; - } - Qgdo = - Cgdo * (Vgse - Vdse) ; - Qgdo_dVbse = 0.0 ; - Qgdo_dVdse = Cgdo ; - Qgdo_dVgse = - Cgdo ; - } /* Coovlpd != 0 end */ - - /*-------------------------------------------* - * Gate/Bulk overlap charge: Qgbo - *-----------------*/ - Cgbo_loc = - pParam->HSMHV_cgbo * here->HSMHV_lgate ; - Qgbo = - Cgbo_loc * (Vgs -Vbs) ; - Qgbo_dVgs = - Cgbo_loc ; - Qgbo_dVbs = Cgbo_loc ; - Qgbo_dVds = 0.0 ; - - /*---------------------------------------------------* - * Lateral-field-induced capacitance. - *-----------------*/ - if ( model->HSMHV_xqy == 0 ){ - Qy = 0.0e0 ; - Qy_dVds = 0.0e0 ; - Qy_dVgs = 0.0e0 ; - Qy_dVbs = 0.0e0 ; - Qy_dT = 0.0e0 ; - } else { - Pslk = Ec * Leff + Ps0 ; - Pslk_dVbs = Ec_dVbs * Leff + Ps0_dVbs; - Pslk_dVds = Ec_dVds * Leff + Ps0_dVds; - Pslk_dVgs = Ec_dVgs * Leff + Ps0_dVgs; - Pslk_dT = Ec_dT * Leff + Ps0_dT; - - T1 = Aclm * ( Vds + Ps0 ) + ( 1.0e0 - Aclm ) * Pslk ; - T1_dVb = Aclm * ( Ps0_dVbs ) + ( 1.0e0 - Aclm ) * Pslk_dVbs ; - T1_dVd = Aclm * ( 1.0 + Ps0_dVds ) + ( 1.0e0 - Aclm ) * Pslk_dVds ; - T1_dVg = Aclm * ( Ps0_dVgs ) + ( 1.0e0 - Aclm ) * Pslk_dVgs ; - T1_dT = Aclm * ( Ps0_dT ) + ( 1.0e0 - Aclm ) * Pslk_dT ; - T10 = here->HSMHV_wdpl ; - T3 = T10 * 1.3 ; - T2 = C_ESI * here->HSMHV_weffcv_nf * T3 ; - Qy = - ( ( Ps0 + Vds - T1 ) / model->HSMHV_xqy ) * T2 ; - Qy_dVds = - ( ( Ps0_dVds + 1.0e0 - T1_dVd ) / model->HSMHV_xqy ) * T2 ; - Qy_dVgs = - ( ( Ps0_dVgs - T1_dVg ) / model->HSMHV_xqy ) * T2 ; - Qy_dVbs = - ( ( Ps0_dVbs - T1_dVb ) / model->HSMHV_xqy ) * T2 ; - Qy_dT = - ( ( Ps0_dT - T1_dT ) / model->HSMHV_xqy ) * T2 ; - } - - if ( model->HSMHV_xqy1 != 0.0 ){ - Qy += here->HSMHV_cqyb0 * Vbs ; - Qy_dVbs += here->HSMHV_cqyb0 ; - } - - /*---------------------------------------------------* - * Fringing capacitance. - *-----------------*/ - Cfd = here->HSMHV_cfrng ; - Cfs = here->HSMHV_cfrng ; - Qfd = Cfd * ( Vgse - Vdse ) ; - Qfs = Cfs * Vgse ; - - /*-----------------------------------------------------------* - * End of PART-3. (label) - *-----------------*/ - -/* end_of_part_3: */ - - /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ - * PART-4: Substrate-source/drain junction diode. - *++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ - - - /*-----------------------------------------------------------* - * Cbsj, Cbdj: node-base S/D biases. - *-----------------*/ - - T10 = model->HSMHV_cvb * here->HSMHV_jd_nvtm_inv ; - T11 = model->HSMHV_cvbk * here->HSMHV_jd_nvtm_inv ; - - T9 = model->HSMHV_cisb * here->HSMHV_exptemp ; - T0 = here->HSMHV_isbd2 * T9 ; - - T2 = exp (- vbd_jct * T10 ); - T2_dVb = - T2 * T10 ; - - T3 = exp (- vbd_jct * T11 ); - T3_dVb = - T3 * T11 ; - - /* self heating */ - T10_dT = model->HSMHV_cvb * beta_dT / pParam->HSMHV_nj ; - T11_dT = model->HSMHV_cvbk * beta_dT / pParam->HSMHV_nj ; - T9_dT = model->HSMHV_cisb * exptemp_dT ; - T0_dT = here->HSMHV_isbd2 * T9_dT + isbd2_dT * T9 ; - T2_dT = -vbd_jct * T10 * T2 * beta_dT * beta_inv ; - T3_dT = -vbd_jct * T11 * T3 * beta_dT * beta_inv ; - - - /* ibd */ - if ( vbd_jct < here->HSMHV_vbdt ) { - TX = vbd_jct * here->HSMHV_jd_nvtm_inv ; - - - if ( TX < - EXP_THR ) { - T1 = 0.0 ; - T1_dVb = 0.0 ; - T1_dT = 0.0 ; - } else { - T1 = exp ( TX ) ; - T1_dVb = T1 * here->HSMHV_jd_nvtm_inv ; - T1_dT = T1 * TX * beta_dT * beta_inv ; - - } - - Ibd = here->HSMHV_isbd * (T1 - 1.0) - + T0 * (T2 - 1.0) - + pParam->HSMHV_cisbk * (T3 - 1.0); - Gbd = here->HSMHV_isbd * T1_dVb - + T0 * T2_dVb - + pParam->HSMHV_cisbk * T3_dVb ; - Ibd_dT = here->HSMHV_isbd * T1_dT + isbd_dT * ( T1 - 1.0 ) - + T0 * T2_dT + T0_dT * ( T2 - 1.0 ) - + pParam->HSMHV_cisbk * T3_dT ; - - } else { - T1 = here->HSMHV_jd_expcd ; - - T4 = here->HSMHV_isbd * here->HSMHV_jd_nvtm_inv * T1 ; - - Ibd = here->HSMHV_isbd * (T1 - 1.0) - + T4 * (vbd_jct - here->HSMHV_vbdt) - + T0 * (T2 - 1.0) - + pParam->HSMHV_cisbk * (T3 - 1.0) ; - Gbd = T4 - + T0 * T2_dVb - + pParam->HSMHV_cisbk * T3_dVb ; - - T1_dT = jd_expcd_dT ; - T4_dT = isbd_dT * here->HSMHV_jd_nvtm_inv * T1 - + here->HSMHV_isbd * jd_nvtm_inv_dT * T1 - + here->HSMHV_isbd * here->HSMHV_jd_nvtm_inv * T1_dT ; - Ibd_dT = isbd_dT * ( T1 - 1.0 ) + here->HSMHV_isbd * T1_dT - + T4_dT * ( vbd_jct - here->HSMHV_vbdt ) - T4 * vbdt_dT - + T0_dT * ( T2 - 1.0 ) + T0 * T2_dT - + pParam->HSMHV_cisbk * T3_dT ; - } - T12 = model->HSMHV_divx * here->HSMHV_isbd2 ; - Ibd += T12 * vbd_jct ; - Gbd += T12 ; - - T12_dT = model->HSMHV_divx * isbd2_dT ; - Ibd_dT += T12_dT * vbd_jct ; - - /* ibs */ - T0 = here->HSMHV_isbs2 * T9 ; - T0_dT = here->HSMHV_isbs2 * T9_dT + isbs2_dT * T9 ; - - TX = - vbs_jct * T10 ; - if ( TX < - EXP_THR ) { - T2 = 0.0 ; - T2_dVb = 0.0 ; - T2_dT = 0.0 ; - } else { - T2 = exp ( TX ); - T2_dVb = - T2 * T10 ; - T2_dT = T2 * TX * beta_dT * beta_inv ; - } - - TX = - vbs_jct * T11 ; - if ( TX < - EXP_THR ) { - T3 = 0.0 ; - T3_dVb = 0.0 ; - T3_dT = 0.0 ; - } else { - T3 = exp ( TX ); - T3_dVb = - T3 * T11 ; - T3_dT = T3 * TX * beta_dT * beta_inv ; - } - - if ( vbs_jct < here->HSMHV_vbst ) { - TX = vbs_jct * here->HSMHV_jd_nvtm_inv ; - if ( TX < - EXP_THR ) { - T1 = 0.0 ; - T1_dVb = 0.0 ; - T1_dT = 0.0 ; - } else { - T1 = exp ( TX ) ; - T1_dVb = T1 * here->HSMHV_jd_nvtm_inv ; - T1_dT = T1 * TX * beta_dT * beta_inv ; - } - Ibs = here->HSMHV_isbs * (T1 - 1.0) - + T0 * (T2 - 1.0) - + pParam->HSMHV_cisbk * (T3 - 1.0); - Gbs = here->HSMHV_isbs * T1_dVb - + T0 * T2_dVb - + pParam->HSMHV_cisbk * T3_dVb ; - Ibs_dT = here->HSMHV_isbs * T1_dT + isbs_dT * ( T1 - 1.0 ) - + T0 * T2_dT + T0_dT * ( T2 - 1.0 ) - + pParam->HSMHV_cisbk * T3_dT ; - } else { - T1 = here->HSMHV_jd_expcs ; - - T4 = here->HSMHV_isbs * here->HSMHV_jd_nvtm_inv * T1 ; - - Ibs = here->HSMHV_isbs * (T1 - 1.0) - + T4 * (vbs_jct - here->HSMHV_vbst) - + T0 * (T2 - 1.0) - + pParam->HSMHV_cisbk * (T3 - 1.0) ; - Gbs = T4 - + T0 * T2_dVb - + pParam->HSMHV_cisbk * T3_dVb ; - - T1_dT = jd_expcs_dT ; - T4_dT = isbs_dT * here->HSMHV_jd_nvtm_inv * T1 - + here->HSMHV_isbs * jd_nvtm_inv_dT * T1 - + here->HSMHV_isbs * here->HSMHV_jd_nvtm_inv * T1_dT ; - Ibs_dT = isbs_dT * ( T1 - 1.0 ) + here->HSMHV_isbs * T1_dT - + T4_dT * ( vbs_jct - here->HSMHV_vbst) - T4 * vbst_dT - + T0_dT * ( T2 - 1.0 ) + T0 * T2_dT - + pParam->HSMHV_cisbk * T3_dT ; - } - T12 = model->HSMHV_divx * here->HSMHV_isbs2 ; - Ibs += T12 * vbs_jct ; - Gbs += T12 ; - - T12_dT = model->HSMHV_divx * isbs2_dT ; - Ibs_dT += T12_dT * vbs_jct ; - - - /*-----------------------------------------------------------* - * Charges and Capacitances. - *-----------------*/ - /* charge storage elements - * bulk-drain and bulk-source depletion capacitances - * czbd : zero bias drain junction capacitance - * czbs : zero bias source junction capacitance - * czbdsw:zero bias drain junction sidewall capacitance - * czbssw:zero bias source junction sidewall capacitance - */ - tcjbd = model->HSMHV_tcjbd ; - tcjbs = model->HSMHV_tcjbs ; - tcjbdsw = model->HSMHV_tcjbdsw ; - tcjbssw = model->HSMHV_tcjbssw ; - tcjbdswg = model->HSMHV_tcjbdswg ; - tcjbsswg = model->HSMHV_tcjbsswg ; - - czbs = model->HSMHV_cj * here->HSMHV_as ; - czbs = czbs * ( 1.0 + tcjbs * ( TTEMP - model->HSMHV_ktnom )) ; - czbs_dT = ( model->HSMHV_cj * here->HSMHV_as ) * tcjbs ; - - czbd = model->HSMHV_cj * here->HSMHV_ad ; - czbd = czbd * ( 1.0 + tcjbd * ( TTEMP - model->HSMHV_ktnom )) ; - czbd_dT = ( model->HSMHV_cj * here->HSMHV_ad ) * tcjbd ; - - /* Source Bulk Junction */ - if (here->HSMHV_ps > here->HSMHV_weff_nf) { - czbssw = model->HSMHV_cjsw * ( here->HSMHV_ps - here->HSMHV_weff_nf ) ; - czbssw = czbssw * ( 1.0 + tcjbssw * ( TTEMP - model->HSMHV_ktnom )) ; - czbssw_dT = ( model->HSMHV_cjsw * ( here->HSMHV_ps - here->HSMHV_weff_nf )) * tcjbssw ; - - czbsswg = model->HSMHV_cjswg * here->HSMHV_weff_nf ; - czbsswg = czbsswg * ( 1.0 + tcjbsswg * ( TTEMP - model->HSMHV_ktnom )) ; - czbsswg_dT = ( model->HSMHV_cjswg * here->HSMHV_weff_nf ) * tcjbsswg ; - -// if (vbs_jct == 0.0) { - if (0) { - Qbs = 0.0 ; - Qbs_dT = 0.0 ; - Capbs = czbs + czbssw + czbsswg ; - } else if (vbs_jct < 0.0) { - if (czbs > 0.0) { - arg = 1.0 - vbs_jct / model->HSMHV_pb ; - if (model->HSMHV_mj == 0.5) - sarg = 1.0 / sqrt(arg) ; - else - sarg = Fn_Pow( arg , -model->HSMHV_mj ) ; - Qbs = model->HSMHV_pb * czbs * (1.0 - arg * sarg) / (1.0 - model->HSMHV_mj) ; - Qbs_dT = model->HSMHV_pb * czbs_dT * (1.0 - arg * sarg) / (1.0 - model->HSMHV_mj) ; - Capbs = czbs * sarg ; - } else { - Qbs = 0.0 ; - Qbs_dT = 0.0 ; - Capbs = 0.0 ; - } - if (czbssw > 0.0) { - arg = 1.0 - vbs_jct / model->HSMHV_pbsw ; - if (model->HSMHV_mjsw == 0.5) - sarg = 1.0 / sqrt(arg) ; - else - sarg = Fn_Pow( arg , -model->HSMHV_mjsw ) ; - Qbs += model->HSMHV_pbsw * czbssw * (1.0 - arg * sarg) / (1.0 - model->HSMHV_mjsw) ; - Qbs_dT += model->HSMHV_pbsw * czbssw_dT * (1.0 - arg * sarg) / (1.0 - model->HSMHV_mjsw) ; - Capbs += czbssw * sarg ; - } - if (czbsswg > 0.0) { - arg = 1.0 - vbs_jct / model->HSMHV_pbswg ; - if (model->HSMHV_mjswg == 0.5) - sarg = 1.0 / sqrt(arg) ; - else - sarg = Fn_Pow( arg , -model->HSMHV_mjswg ) ; - Qbs += model->HSMHV_pbswg * czbsswg * (1.0 - arg * sarg) / (1.0 - model->HSMHV_mjswg) ; - Qbs_dT += model->HSMHV_pbswg * czbsswg_dT * (1.0 - arg * sarg) / (1.0 - model->HSMHV_mjswg) ; - Capbs += czbsswg * sarg ; - } - } else { - T1 = czbs + czbssw + czbsswg ; - T1_dT = czbs_dT + czbssw_dT + czbsswg_dT ; - T2 = czbs * model->HSMHV_mj / model->HSMHV_pb - + czbssw * model->HSMHV_mjsw / model->HSMHV_pbsw - + czbsswg * model->HSMHV_mjswg / model->HSMHV_pbswg ; - T2_dT = czbs_dT * model->HSMHV_mj / model->HSMHV_pb - + czbssw_dT * model->HSMHV_mjsw / model->HSMHV_pbsw - + czbsswg_dT * model->HSMHV_mjswg / model->HSMHV_pbswg ; - Qbs = vbs_jct * (T1 + vbs_jct * 0.5 * T2) ; - Qbs_dT = vbs_jct * (T1_dT + vbs_jct * 0.5 * T2_dT) ; - Capbs = T1 + vbs_jct * T2 ; - } - } else { - czbsswg = model->HSMHV_cjswg * here->HSMHV_ps ; - czbsswg = czbsswg * ( 1.0 + tcjbsswg * ( TTEMP - model->HSMHV_ktnom )) ; - czbsswg_dT = ( model->HSMHV_cjswg * here->HSMHV_ps ) * tcjbsswg ; -// if (vbs_jct == 0.0) { - if (0) { - Qbs = 0.0 ; - Qbs_dT = 0.0 ; - Capbs = czbs + czbsswg ; - } else if (vbs_jct < 0.0) { - if (czbs > 0.0) { - arg = 1.0 - vbs_jct / model->HSMHV_pb ; - if (model->HSMHV_mj == 0.5) - sarg = 1.0 / sqrt(arg) ; - else - sarg = Fn_Pow( arg , -model->HSMHV_mj ) ; - Qbs = model->HSMHV_pb * czbs * (1.0 - arg * sarg) / (1.0 - model->HSMHV_mj) ; - Qbs_dT = model->HSMHV_pb * czbs_dT * (1.0 - arg * sarg) / (1.0 - model->HSMHV_mj) ; - Capbs = czbs * sarg ; - } else { - Qbs = 0.0 ; - Qbs_dT = 0.0 ; - Capbs = 0.0 ; - } - if (czbsswg > 0.0) { - arg = 1.0 - vbs_jct / model->HSMHV_pbswg ; - if (model->HSMHV_mjswg == 0.5) - sarg = 1.0 / sqrt(arg) ; - else - sarg = Fn_Pow( arg , -model->HSMHV_mjswg ) ; - Qbs += model->HSMHV_pbswg * czbsswg * (1.0 - arg * sarg) / (1.0 - model->HSMHV_mjswg) ; - Qbs_dT += model->HSMHV_pbswg * czbsswg_dT * (1.0 - arg * sarg) / (1.0 - model->HSMHV_mjswg) ; - Capbs += czbsswg * sarg ; - } - } else { - T1 = czbs + czbsswg ; - T1_dT = czbs_dT + czbsswg_dT ; - T2 = czbs * model->HSMHV_mj / model->HSMHV_pb - + czbsswg * model->HSMHV_mjswg / model->HSMHV_pbswg ; - T2_dT = czbs_dT * model->HSMHV_mj / model->HSMHV_pb - + czbsswg_dT * model->HSMHV_mjswg / model->HSMHV_pbswg ; - Qbs = vbs_jct * (T1 + vbs_jct * 0.5 * T2) ; - Qbs_dT = vbs_jct * (T1_dT + vbs_jct * 0.5 * T2_dT) ; - Capbs = T1 + vbs_jct * T2 ; - } - } - - /* Drain Bulk Junction */ - if (here->HSMHV_pd > here->HSMHV_weff_nf) { - - czbdsw = model->HSMHV_cjsw * ( here->HSMHV_pd - here->HSMHV_weff_nf ) ; - czbdsw = czbdsw * ( 1.0 + tcjbdsw * ( TTEMP - model->HSMHV_ktnom )) ; - czbdsw_dT = ( model->HSMHV_cjsw * ( here->HSMHV_pd - here->HSMHV_weff_nf )) * tcjbdsw ; - - czbdswg = model->HSMHV_cjswg * here->HSMHV_weff_nf ; - czbdswg = czbdswg * ( 1.0 + tcjbdswg * ( TTEMP - model->HSMHV_ktnom )) ; - czbdswg_dT = ( model->HSMHV_cjswg * here->HSMHV_weff_nf ) * tcjbdswg ; -// if (vbd_jct == 0.0) { - if (0) { - Qbd = 0.0 ; - Qbd_dT = 0.0 ; - Capbd = czbd + czbdsw + czbdswg ; - } else if (vbd_jct < 0.0) { - if (czbd > 0.0) { - arg = 1.0 - vbd_jct / model->HSMHV_pb ; - if (model->HSMHV_mj == 0.5) - sarg = 1.0 / sqrt(arg) ; - else - sarg = Fn_Pow( arg , -model->HSMHV_mj ) ; - Qbd = model->HSMHV_pb * czbd * (1.0 - arg * sarg) / (1.0 - model->HSMHV_mj) ; - Qbd_dT = model->HSMHV_pb * czbd_dT * (1.0 - arg * sarg) / (1.0 - model->HSMHV_mj) ; - Capbd = czbd * sarg ; - } else { - Qbd = 0.0 ; - Qbd_dT = 0.0 ; - Capbd = 0.0 ; - } - if (czbdsw > 0.0) { - arg = 1.0 - vbd_jct / model->HSMHV_pbsw ; - if (model->HSMHV_mjsw == 0.5) - sarg = 1.0 / sqrt(arg) ; - else - sarg = Fn_Pow( arg , -model->HSMHV_mjsw ) ; - Qbd += model->HSMHV_pbsw * czbdsw * (1.0 - arg * sarg) / (1.0 - model->HSMHV_mjsw) ; - Qbd_dT += model->HSMHV_pbsw * czbdsw_dT * (1.0 - arg * sarg) / (1.0 - model->HSMHV_mjsw) ; - Capbd += czbdsw * sarg ; - } - if (czbdswg > 0.0) { - arg = 1.0 - vbd_jct / model->HSMHV_pbswg ; - if (model->HSMHV_mjswg == 0.5) - sarg = 1.0 / sqrt(arg) ; - else - sarg = Fn_Pow( arg , -model->HSMHV_mjswg ) ; - Qbd += model->HSMHV_pbswg * czbdswg * (1.0 - arg * sarg) / (1.0 - model->HSMHV_mjswg) ; - Qbd_dT += model->HSMHV_pbswg * czbdswg_dT * (1.0 - arg * sarg) / (1.0 - model->HSMHV_mjswg) ; - Capbd += czbdswg * sarg ; - - } - } else { - T1 = czbd + czbdsw + czbdswg ; - T1_dT = czbd_dT + czbdsw_dT + czbdswg_dT ; - T2 = czbd * model->HSMHV_mj / model->HSMHV_pb - + czbdsw * model->HSMHV_mjsw / model->HSMHV_pbsw - + czbdswg * model->HSMHV_mjswg / model->HSMHV_pbswg ; - T2_dT = czbd_dT * model->HSMHV_mj / model->HSMHV_pb - + czbdsw_dT * model->HSMHV_mjsw / model->HSMHV_pbsw - + czbdswg_dT * model->HSMHV_mjswg / model->HSMHV_pbswg ; - Qbd = vbd_jct * (T1 + vbd_jct * 0.5 * T2) ; - Qbd_dT = vbd_jct * (T1_dT + vbd_jct * 0.5 * T2_dT) ; - Capbd = T1 + vbd_jct * T2 ; - } - - } else { - czbdswg = model->HSMHV_cjswg * here->HSMHV_pd ; - czbdswg = czbdswg * ( 1.0 + tcjbdswg * ( TTEMP - model->HSMHV_ktnom )) ; - czbdswg_dT = ( model->HSMHV_cjswg * here->HSMHV_pd ) * tcjbdswg ; - -// if (vbd_jct == 0.0) { - if (0) { - Qbd = 0.0 ; - Qbd_dT = 0.0 ; - Capbd = czbd + czbdswg ; - } else if (vbd_jct < 0.0) { - if (czbd > 0.0) { - arg = 1.0 - vbd_jct / model->HSMHV_pb ; - if (model->HSMHV_mj == 0.5) - sarg = 1.0 / sqrt(arg) ; - else - sarg = Fn_Pow( arg , -model->HSMHV_mj ) ; - Qbd = model->HSMHV_pb * czbd * (1.0 - arg * sarg) / (1.0 - model->HSMHV_mj) ; - Qbd_dT = model->HSMHV_pb * czbd_dT * (1.0 - arg * sarg) / (1.0 - model->HSMHV_mj) ; - Capbd = czbd * sarg ; - } else { - Qbd = 0.0 ; - Qbd_dT = 0.0 ; - Capbd = 0.0 ; - } - if (czbdswg > 0.0) { - arg = 1.0 - vbd_jct / model->HSMHV_pbswg ; - if (model->HSMHV_mjswg == 0.5) - sarg = 1.0 / sqrt(arg) ; - else - sarg = Fn_Pow( arg , -model->HSMHV_mjswg ) ; - Qbd += model->HSMHV_pbswg * czbdswg * (1.0 - arg * sarg) / (1.0 - model->HSMHV_mjswg) ; - Qbd_dT += model->HSMHV_pbswg * czbdswg_dT * (1.0 - arg * sarg) / (1.0 - model->HSMHV_mjswg) ; - Capbd += czbdswg * sarg ; - } - } else { - T1 = czbd + czbdswg ; - T1_dT = czbd_dT + czbdswg_dT ; - T2 = czbd * model->HSMHV_mj / model->HSMHV_pb - + czbdswg * model->HSMHV_mjswg / model->HSMHV_pbswg ; - T2_dT = czbd_dT * model->HSMHV_mj / model->HSMHV_pb - + czbdswg_dT * model->HSMHV_mjswg / model->HSMHV_pbswg ; - Qbd = vbd_jct * (T1 + vbd_jct * 0.5 * T2) ; - Qbd_dT = vbd_jct * (T1_dT + vbd_jct * 0.5 * T2_dT) ; - Capbd = T1 + vbd_jct * T2 ; - } - } - - /*-----------------------------------------------------------* - * End of PART-4. (label) - *-----------------*/ - -/* end_of_part_4: */ - - - - /*-----------------------------------------------------------* - * PART-5: NQS. (label) - *-----------------*/ - if (flg_nqs) { - if(ckt->CKTmode & MODETRAN){ - if( ckt->CKTmode & MODEINITTRAN ){ - - tau = tau_dVds = tau_dVgs = tau_dVbs = tau_dT = 0.0 ; - taub = taub_dVds = taub_dVgs = taub_dVbs = taub_dT = 0.0 ; - - } else { - /* tau for inversion charge */ - if (flg_noqi == 0) { - T12 = model->HSMHV_dly1; - T10 = model->HSMHV_dly2; - - T3 = Lch ; - T1 = T10 * T12 * T3 * T3 ; - T2 = Mu * VgVt * T12 + T10 * T3 * T3 + small ; - tau = T1 / T2 ; - - T1_dVg = T10 * T12 * 2.0 * T3 * Lch_dVgs ; - T1_dVd = T10 * T12 * 2.0 * T3 * Lch_dVds ; - T1_dVb = T10 * T12 * 2.0 * T3 * Lch_dVbs ; - T1_dT = T10 * T12 * 2.0 * T3 * Lch_dT ; - - T2_dVg = T12 * Mu_dVgs * VgVt - + T12 * Mu * VgVt_dVgs + T10 * 2.0 * T3 * Lch_dVgs ; - T2_dVd = T12 * Mu_dVds * VgVt - + T12 * Mu * VgVt_dVds + T10 * 2.0 * T3 * Lch_dVds ; - T2_dVb = T12 * Mu_dVbs * VgVt - + T12 * Mu * VgVt_dVbs + T10 * 2.0 * T3 * Lch_dVbs ; - T2_dT = T12 * Mu_dT * VgVt - + T12 * Mu * VgVt_dT + T10 * 2.0 * T3 * Lch_dT ; - - T4 = 1.0 / T2 ; - tau_dVgs = ( T1_dVg - tau * T2_dVg ) * T4 ; - tau_dVds = ( T1_dVd - tau * T2_dVd ) * T4 ; - tau_dVbs = ( T1_dVb - tau * T2_dVb ) * T4 ; - tau_dT = ( T1_dT - tau * T2_dT ) * T4 ; - } else { - tau = model->HSMHV_dly1 ; - tau_dVgs = tau_dVds = tau_dVbs = tau_dT = 0.0 ; - } - - T1 = ckt->CKTdelta ; - - /* tau for bulk charge */ - T2 = modelMKS->HSMHV_dly3 ; - taub = T2 * Cox ; - taub_dVgs = T2 * Cox_dVg ; - taub_dVds = T2 * Cox_dVd ; - taub_dVbs = T2 * Cox_dVb ; - taub_dT = 0.0 ; - - } - } else { /* !(CKT_mode & MODETRAN) */ - - tau = tau_dVds = tau_dVgs = tau_dVbs = tau_dT = 0.0 ; - taub = taub_dVds = taub_dVgs = taub_dVbs = taub_dT = 0.0 ; - } - } - - if ( flg_nqs && (ckt->CKTmode & (MODEDCOP | MODEINITSMSIG)) ) { /* ACNQS */ - - if (flg_noqi == 0) { - T12 = model->HSMHV_dly1 ; - T10 = model->HSMHV_dly2 ; - - T3 = Lch ; - T1 = T12 * T10 * T3 * T3 ; - T2 = Mu * VgVt * T12 + T10 * T3 * T3 + small ; - tau = T1 / T2 ; - - T1_dVg = T10 * T12 * 2.0 * T3 * Lch_dVgs ; - T1_dVd = T10 * T12 * 2.0 * T3 * Lch_dVds ; - T1_dVb = T10 * T12 * 2.0 * T3 * Lch_dVbs ; - T1_dT = T10 * T12 * 2.0 * T3 * Lch_dT ; - - T2_dVg = T12 * Mu_dVgs * VgVt + T12 * Mu * VgVt_dVgs - + T10 * 2.0 * T3 * Lch_dVgs ; - T2_dVd = T12 * Mu_dVds * VgVt + T12 * Mu * VgVt_dVds - + T10 * 2.0 * T3 * Lch_dVds ; - T2_dVb = T12 * Mu_dVbs * VgVt + T12 * Mu * VgVt_dVbs - + T10 * 2.0 * T3 * Lch_dVbs ; - T2_dT = T12 * Mu_dT * VgVt + T12 * Mu * VgVt_dT - + T10 * 2.0 * T3 * Lch_dT ; - - T4 = 1.0 / T2 ; - tau_dVgs = (T1_dVg - tau * T2_dVg) * T4 ; - tau_dVds = (T1_dVd - tau * T2_dVd) * T4 ; - tau_dVbs = (T1_dVb - tau * T2_dVb) * T4 ; - tau_dT = (T1_dT - tau * T2_dT) * T4 ; - } else { - tau = model->HSMHV_dly1 ; - tau_dVgs = tau_dVds = tau_dVbs = tau_dT = 0.0 ; - } - - T2 = modelMKS->HSMHV_dly3 ; - taub = T2 * Cox; - taub_dVgs = T2 * Cox_dVg ; - taub_dVds = T2 * Cox_dVd ; - taub_dVbs = T2 * Cox_dVb ; - taub_dT = 0.0 ; - } - - /*-----------------------------------------------------------* - * End of PART-5. (label) - *-----------------*/ -/* end_of_part_5: */ - - /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ - * PART-6: Noise Calculation. - *++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ - - /*-----------------------------------------------------------* - * 1/f noise. - *-----------------*/ - if ( model->HSMHV_coflick != 0 && !flg_noqi ) { - - NFalp = pParam->HSMHV_nfalp ; - NFtrp = pParam->HSMHV_nftrp ; - Cit = modelMKS->HSMHV_cit ; - - T1 = Qn0 / C_QE ; - T2 = ( Cox + Qn0 / ( Ps0 - Vbscl ) + Cit ) * beta_inv / C_QE ; - T3 = -2.0E0 * Qi / C_QE / Lch / here->HSMHV_weff_nf - T1 ; - if ( T3 != T1 ) { - T4 = 1.0E0 / ( T1 + T2 ) / ( T3 + T2 ) + 2.0E0 * NFalp * Ey * Mu / ( T3 - T1 ) - * log( ( T3 + T2 ) / ( T1 + T2 ) ) + NFalp * Ey * Mu * NFalp * Ey * Mu ; - } else { - T4 = 1.0 / ( T1 + T2 ) / ( T3 + T2 ) + 2.0 * NFalp * Ey * Mu / ( T1 + T2 ) - + NFalp * Ey * Mu * NFalp * Ey * Mu; - } - Nflic = Ids * Ids * NFtrp / ( Lch * beta * here->HSMHV_weff_nf ) * T4 ; - } else { - Nflic = 0.0 ; - } - - /*-----------------------------------------------------------* - * thermal noise. - *-----------------*/ - if ( model->HSMHV_cothrml != 0 && !flg_noqi ) { - - Eyd = ( Psdl - Ps0 ) / Lch + small ; - T12 = Muun * Eyd / 1.0e7 ; - /* note: model->HSMHV_bb = 2 (electron) ;1 (hole) */ - if ( 1.0e0 - epsm10 <= model->HSMHV_bb && model->HSMHV_bb <= 1.0e0 + epsm10 ) { - T7 = 1.0e0 ; - } else if ( 2.0e0 - epsm10 <= model->HSMHV_bb && model->HSMHV_bb <= 2.0e0 + epsm10 ) { - T7 = T12 ; - } else { - T7 = Fn_Pow( Eyd, model->HSMHV_bb - 1.0e0 ) ; - } - T8 = T12 * T7 ; - T9 = 1.0e0 + T8 ; - T10 = Fn_Pow( T9, ( - 1.0e0 / model->HSMHV_bb - 1.0e0 ) ) ; - T11 = T9 * T10 ; - Mud_hoso = Muun * T11 ; - Mu_Ave = ( Mu + Mud_hoso ) / 2.0 ; - - /* Sid_h = GAMMA * 4.0 * C_KB * model->HSMHV_temp * gds0_h2; */ - T0 = Alpha * Alpha ; - Nthrml = here->HSMHV_weff_nf * Cox * VgVt * Mu - * ( ( 1e0 + 3e0 * Alpha + 6e0 * T0 ) * Mud_hoso * Mud_hoso - + ( 3e0 + 4e0 * Alpha + 3e0 * T0 ) * Mud_hoso * Mu - + ( 6e0 + 3e0 * Alpha + T0 ) * Mu * Mu ) - / ( 15e0 * Lch * ( 1e0 + Alpha ) * Mu_Ave * Mu_Ave ) ; - } else { - Nthrml = 0e0 ; - } - - - /*----------------------------------------------------------* - * induced gate noise. ( Part 2/3 ) - *----------------------*/ - if ( model->HSMHV_coign != 0 && model->HSMHV_cothrml != 0 && flg_ign == 1 && !flg_noqi ) { - sqrtkusaiL = sqrt( kusaiL ) ; - T2 = VgVt + sqrtkusaiL ; - T3 = kusai00 * kusai00 ; - T4 = kusaiL * kusaiL ; - T5 = 42.0e0 * kusai00 * kusaiL ; - T5 += 4.0e0 * ( T3 + T4 ) ; - T5 += 20.0e0 * sqrtkusaiL * VgVt * ( kusai00 + kusaiL ) ; - T10 = T2 * T2 ; - T10 *= T10 ; - kusai_ig = T5 / ( T10 * T2 ) ; /* Induced Gate Noise parameter */ - gds0_ign = here->HSMHV_weff_nf / Lch * Mu * Cox ; - gds0_h2 = gds0_ign * VgVt ; - GAMMA = Nthrml / gds0_h2 ; - T7 = kusai00 + 4.0e0 * VgVt * sqrtkusaiL + kusaiL ; - /* cross-correlation coefficient (= Sigid/sqrt(Sig*Sid) ) */ - crl_f = c_sqrt_15 * kusai00L * T7 - / ( 6.0e0 * T2 * sqrt( GAMMA * T2 * VgVt * T5 ) ) ; - } - - - /*-----------------------------------------------------------* - * End of PART-6. (label) - *-----------------*/ -/* end_of_part_6: */ - - - /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ - * PART-7: Evaluation of outputs. - *++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ - - /*-----------------------------------------------------------* - * Implicit quantities related to Alpha. - *-----------------*/ - if ( flg_noqi == 0 && VgVt > VgVt_small ) { - Delta = fac1 * beta / ( 2 * Xi0p12 ) ; - Pslsat = VgVt / ( 1.0 + Delta ) + Ps0 ; - } else { - Pslsat = 0.0 ; - } - Vdsat = Pslsat - Pb2 ; - if ( Vdsat < 0.0 ) { - Vdsat = 0.0 ; - } - - /*-----------------------------------------------------------* - * Evaluate the derivatives w.r.t. external biases. - * -> not to be done for the flat and Schur version! - *-----------------*/ - - Ids += IdsIBPC ; - Ids_dVbs += IdsIBPC_dVbs ; - Ids_dVds += IdsIBPC_dVds ; - Ids_dVgs += IdsIBPC_dVgs ; - Ids_dT += IdsIBPC_dT ; - - /*---------------------------------------------------* - * Derivatives of junction diode currents and charges. - * - NOTE: These quantities are regarded as functions of - * external biases. - * - NOTE: node-base S/D - *-----------------*/ - Gbse = Gbs ; - Gbde = Gbd ; - Capbse = Capbs ; - Capbde = Capbd ; - - /*---------------------------------------------------* - * Extrapolate quantities if external biases are out of bounds. - * -> not necessary here - *-----------------*/ - - /*-----------------------------------------------------------* - * Warn negative conductance. - * - T1 ( = d Ids / d Vds ) is the derivative w.r.t. circuit bias. - *-----------------*/ - T1 = ModeNML * Ids_dVds + ModeRVS * ( Ids_dVbs + Ids_dVds + Ids_dVgs ) ; - - if ( flg_info >= 1 && - (Ids_dVbs < 0.0 || T1 < 0.0 || Ids_dVgs < 0.0) ) { - printf( "*** warning(HiSIM_HV): Negative Conductance\n" ) ; - printf( " type = %d mode = %d\n" , model->HSMHV_type , here->HSMHV_mode ) ; - printf( " Vbs = %12.5e Vds = %12.5e Vgse= %12.5e\n" , - Vbs , Vds , Vgs ) ; - printf( " Ids_dVbs = %12.5e\n" , Ids_dVbs ) ; - printf( " Ids_dVds = %12.5e\n" , T1 ) ; - printf( " Ids_dVgs = %12.5e\n" , Ids_dVgs ) ; - } - - - /*-----------------------------------------------------------* - * Assign outputs. - *-----------------*/ - - - /*---------------------------------------------------* - * Channel current and conductances. - *-----------------*/ - here->HSMHV_ids = Mfactor * Ids ; - here->HSMHV_dIds_dVdsi = Mfactor * Ids_dVds ; - here->HSMHV_dIds_dVgsi = Mfactor * Ids_dVgs ; - here->HSMHV_dIds_dVbsi = Mfactor * Ids_dVbs ; - here->HSMHV_dIds_dTi = Mfactor * Ids_dT ; - - - /* -------------------------------------* - * Intrinsic charges / capacitances. - *-----------------*/ - if (flg_nqs) { /* for flat handling of NQS: the NQS charges are added in hsmhvld */ - - here->HSMHV_qg = 0.0 ; - here->HSMHV_qd = 0.0 ; - here->HSMHV_qs = 0.0 ; - - here->HSMHV_qdp = 0.0 ; - here->HSMHV_qsp = 0.0 ; - - here->HSMHV_dqdp_dVdse = 0.0 ; - here->HSMHV_dqdp_dVgse = 0.0 ; - here->HSMHV_dqdp_dVbse = 0.0 ; - here->HSMHV_dqdp_dTi = 0.0 ; - here->HSMHV_dqsp_dVdse = 0.0 ; - here->HSMHV_dqsp_dVgse = 0.0 ; - here->HSMHV_dqsp_dVbse = 0.0 ; - here->HSMHV_dqsp_dTi = 0.0 ; - - here->HSMHV_dQdi_dVdsi = 0.0 ; - here->HSMHV_dQdi_dVgsi = 0.0 ; - here->HSMHV_dQdi_dVbsi = 0.0 ; - here->HSMHV_dQdi_dTi = 0.0 ; - here->HSMHV_dQg_dVdsi = 0.0 ; - here->HSMHV_dQg_dVgsi = 0.0 ; - here->HSMHV_dQg_dVbsi = 0.0 ; - here->HSMHV_dQg_dTi = 0.0 ; - here->HSMHV_dQb_dVdsi = 0.0 ; - here->HSMHV_dQb_dVgsi = 0.0 ; - here->HSMHV_dQb_dVbsi = 0.0 ; - here->HSMHV_dQb_dTi = 0.0 ; - - here->HSMHV_qgext = 0.0 ; - here->HSMHV_qdext = 0.0 ; - here->HSMHV_qsext = 0.0 ; - - here->HSMHV_dQdext_dVdse = 0.0 ; - here->HSMHV_dQdext_dVgse = 0.0 ; - here->HSMHV_dQdext_dVbse = 0.0 ; - here->HSMHV_dQdext_dTi = 0.0 ; - here->HSMHV_dQgext_dVdse = 0.0 ; - here->HSMHV_dQgext_dVgse = 0.0 ; - here->HSMHV_dQgext_dVbse = 0.0 ; - here->HSMHV_dQgext_dTi = 0.0 ; - here->HSMHV_dQbext_dVdse = 0.0 ; - here->HSMHV_dQbext_dVgse = 0.0 ; - here->HSMHV_dQbext_dVbse = 0.0 ; - here->HSMHV_dQbext_dTi = 0.0 ; - here->HSMHV_tau = tau ; - here->HSMHV_tau_dVgsi = tau_dVgs ; - here->HSMHV_tau_dVdsi = tau_dVds ; - here->HSMHV_tau_dVbsi = tau_dVbs ; - here->HSMHV_tau_dTi = tau_dT ; - - here->HSMHV_taub = taub ; - here->HSMHV_taub_dVgsi = taub_dVgs ; - here->HSMHV_taub_dVdsi = taub_dVds ; - here->HSMHV_taub_dVbsi = taub_dVbs ; - here->HSMHV_taub_dTi = taub_dT ; - - here->HSMHV_Xd = Qdrat; - here->HSMHV_Xd_dVgsi = Qdrat_dVgs ; - here->HSMHV_Xd_dVdsi = Qdrat_dVds ; - here->HSMHV_Xd_dVbsi = Qdrat_dVbs ; - here->HSMHV_Xd_dTi = Qdrat_dT ; - - here->HSMHV_Qbulk = Mfactor * Qb ; - here->HSMHV_Qbulk_dVgsi = Mfactor * Qb_dVgs ; - here->HSMHV_Qbulk_dVdsi = Mfactor * Qb_dVds ; - here->HSMHV_Qbulk_dVbsi = Mfactor * Qb_dVbs ; - here->HSMHV_Qbulk_dTi = Mfactor * Qb_dT ; - - here->HSMHV_Qi = Mfactor * Qi ; - here->HSMHV_Qi_dVgsi = Mfactor * Qi_dVgs ; - here->HSMHV_Qi_dVdsi = Mfactor * Qi_dVds ; - here->HSMHV_Qi_dVbsi = Mfactor * Qi_dVbs ; - here->HSMHV_Qi_dTi = Mfactor * Qi_dT ; - - } else { /* QS */ - - here->HSMHV_qg = Mfactor * - (Qb + Qi) ; - here->HSMHV_qd = Mfactor * Qd ; - here->HSMHV_qs = Mfactor * ( Qi - Qd ) ; - here->HSMHV_qdp = 0.0 ; - here->HSMHV_qsp = 0.0 ; - - here->HSMHV_dqdp_dVdse = 0.0 ; - here->HSMHV_dqdp_dVgse = 0.0 ; - here->HSMHV_dqdp_dVbse = 0.0 ; - here->HSMHV_dqdp_dTi = 0.0 ; - here->HSMHV_dqsp_dVdse = 0.0 ; - here->HSMHV_dqsp_dVgse = 0.0 ; - here->HSMHV_dqsp_dVbse = 0.0 ; - here->HSMHV_dqsp_dTi = 0.0 ; - - here->HSMHV_qgext = 0.0 ; - here->HSMHV_qdext = 0.0 ; - here->HSMHV_qsext = 0.0 ; - - here->HSMHV_dQdext_dVdse = 0.0 ; - here->HSMHV_dQdext_dVgse = 0.0 ; - here->HSMHV_dQdext_dVbse = 0.0 ; - here->HSMHV_dQdext_dTi = 0.0 ; - here->HSMHV_dQgext_dVdse = 0.0 ; - here->HSMHV_dQgext_dVgse = 0.0 ; - here->HSMHV_dQgext_dVbse = 0.0 ; - here->HSMHV_dQgext_dTi = 0.0 ; - here->HSMHV_dQbext_dVdse = 0.0 ; - here->HSMHV_dQbext_dVgse = 0.0 ; - here->HSMHV_dQbext_dVbse = 0.0 ; - here->HSMHV_dQbext_dTi = 0.0 ; - here->HSMHV_dQdi_dVdsi = Mfactor * Qd_dVds ; - here->HSMHV_dQdi_dVgsi = Mfactor * Qd_dVgs ; - here->HSMHV_dQdi_dVbsi = Mfactor * Qd_dVbs ; - here->HSMHV_dQdi_dTi = Mfactor * Qd_dT ; - here->HSMHV_dQg_dVdsi = Mfactor * ( - Qb_dVds - Qi_dVds ) ; - here->HSMHV_dQg_dVgsi = Mfactor * ( - Qb_dVgs - Qi_dVgs ) ; - here->HSMHV_dQg_dVbsi = Mfactor * ( - Qb_dVbs - Qi_dVbs ) ; - here->HSMHV_dQg_dTi = Mfactor * ( - Qb_dT - Qi_dT ) ; - here->HSMHV_dQb_dVdsi = Mfactor * Qb_dVds ; - here->HSMHV_dQb_dVgsi = Mfactor * Qb_dVgs ; - here->HSMHV_dQb_dVbsi = Mfactor * Qb_dVbs ; - here->HSMHV_dQb_dTi = Mfactor * Qb_dT ; - } - - /*---------------------------------------------------* - * Add S/D overlap charges/capacitances to intrinsic ones. - * - NOTE: This function depends on coadov, a control option. - *-----------------*/ - if ( model->HSMHV_coadov == 1 ) { - here->HSMHV_qg += Mfactor * ( Qgod + Qgos + Qgbo + Qy - Qovd - Qovs ) ; - here->HSMHV_qd += Mfactor * ( - Qgod - Qy + QbdLD ) ; - here->HSMHV_qs += Mfactor * ( - Qgos + QbsLD ) ; - - here->HSMHV_qdp += Mfactor * ( - Qfd - Qgdo ) ; - here->HSMHV_qsp += Mfactor * ( - Qfs - Qgso ) ; - - here->HSMHV_cddo = Mfactor * ( - Qgod_dVds - Qy_dVds + QbdLD_dVds ) ; - here->HSMHV_dQdi_dVdsi += here->HSMHV_cddo ; - here->HSMHV_cdgo = Mfactor * ( - Qgod_dVgs - Qy_dVgs + QbdLD_dVgs ) ; - here->HSMHV_dQdi_dVgsi += here->HSMHV_cdgo ; - here->HSMHV_cdbo = Mfactor * ( - Qgod_dVbs - Qy_dVbs + QbdLD_dVbs ) ; - here->HSMHV_dQdi_dVbsi += here->HSMHV_cdbo ; - here->HSMHV_dQdi_dTi += Mfactor * ( - Qgod_dT - Qy_dT + QbdLD_dT ) ; - here->HSMHV_cgdo = Mfactor * ( Qgod_dVds + Qgos_dVds + Qgbo_dVds + Qy_dVds - Qovd_dVds - Qovs_dVds ) ; - here->HSMHV_dQg_dVdsi += here->HSMHV_cgdo ; - here->HSMHV_cggo = Mfactor * ( Qgod_dVgs + Qgos_dVgs + Qgbo_dVgs + Qy_dVgs - Qovd_dVgs - Qovs_dVgs ) ; - here->HSMHV_dQg_dVgsi += here->HSMHV_cggo ; - here->HSMHV_cgbo = Mfactor * ( Qgod_dVbs + Qgos_dVbs + Qgbo_dVbs + Qy_dVbs - Qovd_dVbs - Qovs_dVbs ) ; - here->HSMHV_dQg_dVbsi += here->HSMHV_cgbo ; - here->HSMHV_dQg_dTi += Mfactor * ( Qgod_dT + Qgos_dT + Qgbo_dT + Qy_dT - Qovd_dT - Qovs_dT ) ; - here->HSMHV_cbdo = Mfactor * ( - Qgbo_dVds + QidLD_dVds + QisLD_dVds ) ; - here->HSMHV_dQb_dVdsi += here->HSMHV_cbdo ; - here->HSMHV_cbgo = Mfactor * ( - Qgbo_dVgs + QidLD_dVgs + QisLD_dVgs ) ; - here->HSMHV_dQb_dVgsi += here->HSMHV_cbgo ; - here->HSMHV_cbbo = Mfactor * ( - Qgbo_dVbs + QidLD_dVbs + QisLD_dVbs ) ; - here->HSMHV_dQb_dVbsi += here->HSMHV_cbbo ; - here->HSMHV_dQb_dTi += Mfactor * ( - Qgbo_dT + QidLD_dT + QisLD_dT ) ; - - /* for fringing capacitances */ - here->HSMHV_dqdp_dVdse += Mfactor * ( Cfd - Qgdo_dVdse ) ; - here->HSMHV_dqdp_dVgse += Mfactor * ( - Cfd - Qgdo_dVgse ) ; - here->HSMHV_dqdp_dVbse += Mfactor * ( - Qgdo_dVbse ) ; - here->HSMHV_dqdp_dTi += 0.0 ; - here->HSMHV_dqsp_dVdse += Mfactor * ( - Qgso_dVdse ) ; - here->HSMHV_dqsp_dVgse += Mfactor * ( - Cfs - Qgso_dVgse ) ; - here->HSMHV_dqsp_dVbse += Mfactor * ( - Qgso_dVbse ) ; - here->HSMHV_dqsp_dTi += 0.0 ; - - here->HSMHV_qgext += Mfactor * ( - Qovdext - Qovsext ) ; - here->HSMHV_qdext += Mfactor * QbdLDext ; - here->HSMHV_qsext += Mfactor * QbsLDext ; - - here->HSMHV_dQdext_dVdse += Mfactor * ( QbdLDext_dVdse ) ; - here->HSMHV_dQdext_dVgse += Mfactor * ( QbdLDext_dVgse ) ; - here->HSMHV_dQdext_dVbse += Mfactor * ( QbdLDext_dVbse ) ; - here->HSMHV_dQdext_dTi += Mfactor * ( QbdLDext_dT ) ; - here->HSMHV_dQgext_dVdse += Mfactor * ( - Qovdext_dVdse - Qovsext_dVdse ) ; - here->HSMHV_dQgext_dVgse += Mfactor * ( - Qovdext_dVgse - Qovsext_dVgse ) ; - here->HSMHV_dQgext_dVbse += Mfactor * ( - Qovdext_dVbse - Qovsext_dVbse ) ; - here->HSMHV_dQgext_dTi += Mfactor * ( - Qovdext_dT - Qovsext_dT ) ; - here->HSMHV_dQbext_dVdse += Mfactor * ( QidLDext_dVdse + QisLDext_dVdse ) ; - here->HSMHV_dQbext_dVgse += Mfactor * ( QidLDext_dVgse + QisLDext_dVgse ) ; - here->HSMHV_dQbext_dVbse += Mfactor * ( QidLDext_dVbse + QisLDext_dVbse ) ; - here->HSMHV_dQbext_dTi += Mfactor * ( QidLDext_dT + QisLDext_dT ) ; - - } - here->HSMHV_dQsi_dVdsi = - (here->HSMHV_dQdi_dVdsi + here->HSMHV_dQg_dVdsi + here->HSMHV_dQb_dVdsi) ; - here->HSMHV_dQsi_dVgsi = - (here->HSMHV_dQdi_dVgsi + here->HSMHV_dQg_dVgsi + here->HSMHV_dQb_dVgsi) ; - here->HSMHV_dQsi_dVbsi = - (here->HSMHV_dQdi_dVbsi + here->HSMHV_dQg_dVbsi + here->HSMHV_dQb_dVbsi) ; - here->HSMHV_dQsi_dTi = - (here->HSMHV_dQdi_dTi + here->HSMHV_dQg_dTi + here->HSMHV_dQb_dTi ) ; - - here->HSMHV_dQsext_dVdse = - (here->HSMHV_dQdext_dVdse + here->HSMHV_dQgext_dVdse + here->HSMHV_dQbext_dVdse) ; - here->HSMHV_dQsext_dVgse = - (here->HSMHV_dQdext_dVgse + here->HSMHV_dQgext_dVgse + here->HSMHV_dQbext_dVgse) ; - here->HSMHV_dQsext_dVbse = - (here->HSMHV_dQdext_dVbse + here->HSMHV_dQgext_dVbse + here->HSMHV_dQbext_dVbse) ; - here->HSMHV_dQsext_dTi = - (here->HSMHV_dQdext_dTi + here->HSMHV_dQgext_dTi + here->HSMHV_dQbext_dTi ) ; - - /*---------------------------------------------------* - * Substrate/gate/leak currents. - *-----------------*/ - - here->HSMHV_isub = Mfactor * Isub ; - here->HSMHV_dIsub_dVdsi = Mfactor * Isub_dVds ; - here->HSMHV_dIsub_dVgsi = Mfactor * Isub_dVgs ; - here->HSMHV_dIsub_dVbsi = Mfactor * Isub_dVbs ; - here->HSMHV_dIsub_dTi = Mfactor * Isub_dT ; - here->HSMHV_dIsub_dVdse = Mfactor * Isub_dVdse ; - - here->HSMHV_igb = Mfactor * -Igb ; - here->HSMHV_dIgb_dVdsi = - Mfactor * Igb_dVds ; - here->HSMHV_dIgb_dVgsi = - Mfactor * Igb_dVgs ; - here->HSMHV_dIgb_dVbsi = - Mfactor * Igb_dVbs ; - here->HSMHV_dIgb_dTi = - Mfactor * Igb_dT ; - - if (here->HSMHV_mode == HiSIM_NORMAL_MODE) { - here->HSMHV_igd = Mfactor * ( model->HSMHV_glpart1 * Igate - Igd ) ; - } else { - here->HSMHV_igd = Mfactor * ( (1.0e0 - model->HSMHV_glpart1 ) * Igate - Igs ) ; - } - - if (here->HSMHV_mode == HiSIM_NORMAL_MODE) { - here->HSMHV_igs = Mfactor * ( (1.0e0 - model->HSMHV_glpart1) * Igate - Igs ) ; - } else { - here->HSMHV_igs = Mfactor * ( model->HSMHV_glpart1 * Igate - Igd ) ; - } - - /* note: here->HSMHV_igd and here->HSMHV_igs are already subjected to mode handling, - while the following derivatives here->HSMHV_dIgd_dVdsi, ... are not! */ - here->HSMHV_dIgd_dVdsi = Mfactor * ( model->HSMHV_glpart1 * Igate_dVds - Igd_dVds ) ; - here->HSMHV_dIgd_dVgsi = Mfactor * ( model->HSMHV_glpart1 * Igate_dVgs - Igd_dVgs ) ; - here->HSMHV_dIgd_dVbsi = Mfactor * ( model->HSMHV_glpart1 * Igate_dVbs - Igd_dVbs ) ; - here->HSMHV_dIgd_dTi = Mfactor * ( model->HSMHV_glpart1 * Igate_dT - Igd_dT ) ; - here->HSMHV_dIgs_dVdsi = Mfactor * ( (1.0 - model->HSMHV_glpart1) * Igate_dVds - Igs_dVds ) ; - here->HSMHV_dIgs_dVgsi = Mfactor * ( (1.0 - model->HSMHV_glpart1) * Igate_dVgs - Igs_dVgs ) ; - here->HSMHV_dIgs_dVbsi = Mfactor * ( (1.0 - model->HSMHV_glpart1) * Igate_dVbs - Igs_dVbs ) ; - here->HSMHV_dIgs_dTi = Mfactor * ( (1.0 - model->HSMHV_glpart1) * Igate_dT - Igs_dT ) ; - - here->HSMHV_igidl = Mfactor * Igidl ; - here->HSMHV_dIgidl_dVdsi = Mfactor * Igidl_dVds ; - here->HSMHV_dIgidl_dVgsi = Mfactor * Igidl_dVgs ; - here->HSMHV_dIgidl_dVbsi = Mfactor * Igidl_dVbs ; - here->HSMHV_dIgidl_dTi = Mfactor * Igidl_dT ; - - here->HSMHV_igisl = Mfactor * Igisl ; - here->HSMHV_dIgisl_dVdsi = Mfactor * Igisl_dVds ; - here->HSMHV_dIgisl_dVgsi = Mfactor * Igisl_dVgs ; - here->HSMHV_dIgisl_dVbsi = Mfactor * Igisl_dVbs ; - here->HSMHV_dIgisl_dTi = Mfactor * Igisl_dT ; - - /*---------------------------------------------------* - * Von, Vdsat. - *-----------------*/ - here->HSMHV_von = Vth ; - here->HSMHV_vdsat = Vdsat ; - - - - /*---------------------------------------------------* - * Junction diode. - *-----------------*/ - here->HSMHV_ibs = Mfactor * Ibs ; - here->HSMHV_ibd = Mfactor * Ibd ; - here->HSMHV_gbs = Mfactor * Gbse ; - here->HSMHV_gbd = Mfactor * Gbde ; - *(ckt->CKTstate0 + here->HSMHVqbs) = Mfactor * Qbs ; - *(ckt->CKTstate0 + here->HSMHVqbd) = Mfactor * Qbd ; - here->HSMHV_capbs = Mfactor * Capbse ; - here->HSMHV_capbd = Mfactor * Capbde ; - - here->HSMHV_gbdT = Mfactor * Ibd_dT ; - here->HSMHV_gbsT = Mfactor * Ibs_dT ; - here->HSMHV_gcbdT = Mfactor * Qbd_dT ; - here->HSMHV_gcbsT = Mfactor * Qbs_dT ; - - /*---------------------------------------------------* - * Add Gjmin (gmin). - *-----------------*/ - here->HSMHV_ibs += Mfactor * Gjmin * vbs_jct ; - here->HSMHV_ibd += Mfactor * Gjmin * vbd_jct ; - here->HSMHV_gbs += Mfactor * Gjmin ; - here->HSMHV_gbd += Mfactor * Gjmin ; - - /*-----------------------------------------------------------* - * Warn floating-point exceptions. - * - Function finite() in libm is called. - * - Go to start with info==5. - *-----------------*/ - T1 = here->HSMHV_ids + here->HSMHV_dIds_dVdsi + here->HSMHV_dIds_dVgsi + here->HSMHV_dIds_dVbsi ; - T1 = T1 + here->HSMHV_qd - (here->HSMHV_dQdi_dVdsi + here->HSMHV_dQdi_dVgsi + here->HSMHV_dQdi_dVbsi) ; - if ( ! finite (T1) ) { - flg_err = 1 ; - fprintf (stderr , - "*** warning(HiSIM_HV): FP-exception (PART-1)\n" ) ; - if ( flg_info >= 1 ) { - printf ( "*** warning(HiSIM_HV): FP-exception\n") ; - printf ( "Ids = %e\n" , here->HSMHV_ids ) ; - printf ( "Gmbs = %e\n" , here->HSMHV_dIds_dVbsi ) ; - printf ( "Gds = %e\n" , here->HSMHV_dIds_dVdsi ) ; - printf ( "Gm = %e\n" , here->HSMHV_dIds_dVgsi ) ; - printf ( "Qd = %e\n" , here->HSMHV_qd ) ; - printf ( "Cds = %e\n" , -(here->HSMHV_dQdi_dVdsi - + here->HSMHV_dQdi_dVgsi - + here->HSMHV_dQdi_dVbsi) ) ; - } - } - - T1 = here->HSMHV_isub + here->HSMHV_dIsub_dVbsi + here->HSMHV_dIsub_dVdsi + here->HSMHV_dIsub_dVgsi ; - if ( ! finite (T1) ) { - flg_err = 1 ; - fprintf (stderr , - "*** warning(HiSIM_HV): FP-exception (PART-2)\n") ; - if ( flg_info >= 1 ) { - printf ("*** warning(HiSIM_HV): FP-exception\n") ; - } - } - - T1 = here->HSMHV_dQg_dVdsi + here->HSMHV_dQg_dVgsi + here->HSMHV_dQg_dVbsi ; - if ( ! finite (T1) ) { - flg_err = 1 ; - fprintf(stderr , - "*** warning(HiSIM_HV): FP-exception (PART-3)\n") ; - if ( flg_info >= 1 ) { - printf ("*** warning(HiSIM_HV): FP-exception\n") ; - } - } - - T1 = here->HSMHV_ibs + here->HSMHV_ibd + here->HSMHV_gbs + here->HSMHV_gbd ; - T1 = T1 + *(ckt->CKTstate0 + here->HSMHVqbs) + *(ckt->CKTstate0 + here->HSMHVqbd) + here->HSMHV_capbs + here->HSMHV_capbd ; - if ( ! finite (T1) ) { - flg_err = 1 ; - fprintf(stderr , - "*** warning(HiSIM_HV): FP-exception (PART-4)\n") ; - if ( flg_info >= 1 ) { - printf ("*** warning(HiSIM_HV): FP-exception\n") ; - } - } - - /*-----------------------------------------------------------* - * Exit for error case. - *-----------------*/ - if ( flg_err != 0 ) { - fprintf (stderr , "----- bias information (HiSIM_HV)\n" ) ; - fprintf (stderr , "name: %s\n" , here->HSMHVname ) ; - fprintf (stderr , "states: %d\n" , here->HSMHVstates ) ; - fprintf (stderr , "Vdse= %.3e Vgse=%.3e Vbse=%.3e\n" - , Vdse , Vgse , Vbse ) ; - fprintf (stderr , "Vdsi= %.3e Vgsi=%.3e Vbsi=%.3e\n" - , Vds , Vgs , Vbs ) ; - fprintf (stderr , "vbs_jct= %12.5e vbd_jct= %12.5e\n" - , vbs_jct , vbd_jct ) ; - fprintf (stderr , "vd= %.3e vs= %.3e vdp= %.3e vgp= %.3e vbp= %.3e vsp= %.3e\n" - , *( ckt->CKTrhsOld + here->HSMHVdNode ) - , *( ckt->CKTrhsOld + here->HSMHVsNode ) - , *( ckt->CKTrhsOld + here->HSMHVdNodePrime ) - , *( ckt->CKTrhsOld + here->HSMHVgNodePrime ) - , *( ckt->CKTrhsOld + here->HSMHVbNodePrime ) - , *( ckt->CKTrhsOld + here->HSMHVsNodePrime ) ) ; - fprintf (stderr , "----- bias information (end)\n" ) ; - return ( HiSIM_ERROR ) ; - } - - - /*-----------------------------------------------------------* - * Noise. - *-----------------*/ - here->HSMHV_noiflick = Mfactor * Nflic ; - here->HSMHV_noithrml = Mfactor * Nthrml ; - - /*----------------------------------------------------------* - * induced gate noise. ( Part 3/3 ) - *----------------------*/ - if ( model->HSMHV_coign != 0 && model->HSMHV_cothrml != 0 && flg_ign == 1 && !flg_noqi ) { - T0 = Cox_small * Cox * here->HSMHV_weff_nf * Leff ; - T1 = -( here->HSMHV_dQg_dVdsi + here->HSMHV_dQg_dVgsi + here->HSMHV_dQg_dVbsi ) / Mfactor ; /* NQS case is not supported. */ - if( - T1 > T0 ){ - Nign0 = c_16o135 * C_QE * beta_inv * T1 * T1 / gds0_ign ; - if ( kusai00L > epsm10 && Vds > epsm10 ) { - MuModA = Muun / Mu ; - MuModB = ( Muun / Mud_hoso - MuModA ) / Vds ; - correct_w1 = MuModA + C_2o3 * MuModB - * ( kusai00 + VgVt * sqrtkusaiL + kusaiL ) - / ( VgVt + sqrtkusaiL ) ; - } else { - correct_w1 = Muun / Mud_hoso ; - } - here->HSMHV_noiigate = Mfactor * Nign0 * kusai_ig * correct_w1 ; - here->HSMHV_noicross = crl_f ; - if ( here->HSMHV_noiigate < 0.0 ) here->HSMHV_noiigate = 0.0e0 ; - }else{ - here->HSMHV_noiigate = 0.0e0 ; - here->HSMHV_noicross = 0.0e0 ; - } - }else{ - here->HSMHV_noiigate = 0.0e0 ; - here->HSMHV_noicross = 0.0e0 ; - } - - /*-----------------------------------------------------------* - * Store values for next calculation. - *-----------------*/ - - /* Internal biases */ - if ( here->HSMHV_called >= 1 ) { - here->HSMHV_vbsc_prv2 = here->HSMHV_vbsc_prv ; - here->HSMHV_vdsc_prv2 = here->HSMHV_vdsc_prv ; - here->HSMHV_vgsc_prv2 = here->HSMHV_vgsc_prv ; - here->HSMHV_mode_prv2 = here->HSMHV_mode_prv ; - } - here->HSMHV_vbsc_prv = Vbs ; - here->HSMHV_vdsc_prv = Vds ; - here->HSMHV_vgsc_prv = Vgs ; - here->HSMHV_mode_prv = here->HSMHV_mode ; - here->HSMHV_temp_prv = TTEMP ; - - /* Surface potentials and derivatives w.r.t. internal biases */ - if ( here->HSMHV_called >= 1 ) { - here->HSMHV_ps0_prv2 = here->HSMHV_ps0_prv ; - here->HSMHV_ps0_dvbs_prv2 = here->HSMHV_ps0_dvbs_prv ; - here->HSMHV_ps0_dvds_prv2 = here->HSMHV_ps0_dvds_prv ; - here->HSMHV_ps0_dvgs_prv2 = here->HSMHV_ps0_dvgs_prv ; - here->HSMHV_pds_prv2 = here->HSMHV_pds_prv ; - here->HSMHV_pds_dvbs_prv2 = here->HSMHV_pds_dvbs_prv ; - here->HSMHV_pds_dvds_prv2 = here->HSMHV_pds_dvds_prv ; - here->HSMHV_pds_dvgs_prv2 = here->HSMHV_pds_dvgs_prv ; - } - - here->HSMHV_ps0_prv = Ps0 ; - here->HSMHV_ps0_dvbs_prv = Ps0_dVbs ; - here->HSMHV_ps0_dvds_prv = Ps0_dVds ; - here->HSMHV_ps0_dvgs_prv = Ps0_dVgs ; - here->HSMHV_ps0_dtemp_prv = Ps0_dT ; - here->HSMHV_pds_prv = Pds ; - here->HSMHV_pds_dvbs_prv = Pds_dVbs ; - here->HSMHV_pds_dvds_prv = Pds_dVds ; - here->HSMHV_pds_dvgs_prv = Pds_dVgs ; - here->HSMHV_pds_dtemp_prv = Pds_dT ; - - - /* derivatives of channel current w.r.t. external bias (only due to Ra-dependencies!) */ - here->HSMHV_dIds_dVdse = Ids_dRa * Ra_dVdse * Mfactor ; - here->HSMHV_dIds_dVgse = Ids_dRa * Ra_dVgse * Mfactor ; - here->HSMHV_dIds_dVbse = Ids_dRa * Ra_dVbse * Mfactor ; - - if ( VdseModeNML > 0.0 ) { - here->HSMHV_Rd = Rd / Mfactor ; - here->HSMHV_dRd_dVdse = Rd_dVdse / Mfactor ; - here->HSMHV_dRd_dVgse = Rd_dVgse / Mfactor ; - here->HSMHV_dRd_dVbse = Rd_dVbse / Mfactor ; - here->HSMHV_dRd_dVsubs = Rd_dVsubs / Mfactor ; - here->HSMHV_dRd_dTi = Rd_dT / Mfactor ; - here->HSMHV_Rs = Rs / Mfactor ; - here->HSMHV_dRs_dVdse = Rs_dVdse / Mfactor ; - here->HSMHV_dRs_dVgse = Rs_dVgse / Mfactor ; - here->HSMHV_dRs_dVbse = Rs_dVbse / Mfactor ; - here->HSMHV_dRs_dVsubs = Rs_dVsubs / Mfactor ; - here->HSMHV_dRs_dTi = Rs_dT / Mfactor ; - } else { - here->HSMHV_Rd = Rs / Mfactor ; - here->HSMHV_dRd_dVdse = - ( Rs_dVdse + Rs_dVgse + Rs_dVbse + Rs_dVsubs ) / Mfactor ; - here->HSMHV_dRd_dVgse = Rs_dVgse / Mfactor ; - here->HSMHV_dRd_dVbse = Rs_dVbse / Mfactor ; - here->HSMHV_dRd_dVsubs = Rs_dVsubs / Mfactor ; - here->HSMHV_dRd_dTi = Rs_dT / Mfactor ; - here->HSMHV_Rs = Rd / Mfactor ; - here->HSMHV_dRs_dVdse = - ( Rd_dVdse + Rd_dVgse + Rd_dVbse + Rd_dVsubs ) / Mfactor ; - here->HSMHV_dRs_dVgse = Rd_dVgse / Mfactor ; - here->HSMHV_dRs_dVbse = Rd_dVbse / Mfactor ; - here->HSMHV_dRs_dVsubs = Rd_dVsubs / Mfactor ; - here->HSMHV_dRs_dTi = Rd_dT / Mfactor ; - } - /* Clamping to Res_min */ - if(here->HSMHV_Rd < Res_min) { - here->HSMHV_Rd = Res_min ; - here->HSMHV_dRd_dVdse = 0.0 ; - here->HSMHV_dRd_dVgse = 0.0 ; - here->HSMHV_dRd_dVbse = 0.0 ; - here->HSMHV_dRd_dVsubs = 0.0 ; - here->HSMHV_dRd_dTi = 0.0 ; - } - if(here->HSMHV_Rs < Res_min) { - here->HSMHV_Rs = Res_min ; - here->HSMHV_dRs_dVdse = 0.0 ; - here->HSMHV_dRs_dVgse = 0.0 ; - here->HSMHV_dRs_dVbse = 0.0 ; - here->HSMHV_dRs_dVsubs = 0.0 ; - here->HSMHV_dRs_dTi = 0.0 ; - } - - /*-----------------------------------------------------------* - * End of PART-7. (label) - *-----------------*/ -/* end_of_part_7: */ - - /*-----------------------------------------------------------* - * Bottom of hsmhveval. - *-----------------*/ - - return ( HiSIM_OK ) ; - -} /* end of hsmhveval */ diff --git a/src/spicelib/devices/hisimhv1/hsmhveval_qover.h b/src/spicelib/devices/hisimhv1/hsmhveval_qover.h deleted file mode 100644 index 8b6f7ef64..000000000 --- a/src/spicelib/devices/hisimhv1/hsmhveval_qover.h +++ /dev/null @@ -1,638 +0,0 @@ -/*********************************************************************** - - HiSIM (Hiroshima University STARC IGFET Model) - Copyright (C) 2012 Hiroshima University & STARC - - MODEL NAME : HiSIM_HV - ( VERSION : 1 SUBVERSION : 2 REVISION : 4 ) - Model Parameter VERSION : 1.23 - FILE : hsmhveval_qover.h - - DATE : 2013.04.30 - - released by - Hiroshima University & - Semiconductor Technology Academic Research Center (STARC) -***********************************************************************/ - -/* Begin HSMHVevalQover */ - - /*---------------------------------------------------* - * Clamp -Vxbgmt. - *-----------------*/ - T0 = - Vxbgmt; - if ( T0 > Vbs_bnd ) { - T1 = T0 - Vbs_bnd; - T1_dT = - Vbs_bnd_dT; - T2 = Vbs_max - Vbs_bnd; - T2_dT = Vbs_max_dT - Vbs_bnd_dT; - - Fn_SUPoly4m( TY, T1, T2, T11, T0 ); - TY_dT = T1_dT * T11 + T2_dT * T0; - - T10 = Vbs_bnd + TY ; - T10_dT = Vbs_bnd_dT + TY_dT ; - } else { - T10 = T0 ; - T11 = 1.0 ; - T10_dT = 0.0; - } - Vxbgmtcl = - T10 - small2 ; - Vxbgmtcl_dVxbgmt = T11; - Vxbgmtcl_dT = - T10_dT; - - fac1 = cnst0over_func * Cox0_inv ; - fac1_dVbs = 0.0; fac1_dVds = 0.0; fac1_dVgs = 0.0; - fac1_dT = cnst0over_func_dT * Cox0_inv ; - - fac1p2 = fac1 * fac1 ; - fac1p2_dT = 2.0 * fac1 * fac1_dT ; - - VgpLD = - Vgbgmt + pParam->HSMHV_vfbover; - VgpLD_dVgb = - 1.0e0 ; - - T0 = Nover_func / here->HSMHV_nin ; - Pb2over = 2.0 / beta * log( T0 ) ; - T0_dT = - T0 / here->HSMHV_nin * Nin_dT ; - Pb2over_dT = - Pb2over / beta * beta_dT + 2.0 / beta / T0 * T0_dT ; - - Vgb_fb_LD = - Vxbgmtcl ; - - /*-----------------------------------* - * QsuLD: total charge = Accumulation | Depletion+inversion - *-----------------*/ - if ( VgpLD < Vgb_fb_LD ){ - /*---------------------------* - * Accumulation - *-----------------*/ - flg_ovzone = -1 ; - T1 = 1.0 / ( beta * cnst0over_func ) ; - T1_dT = - T1 * T1 * ( beta_dT * cnst0over_func + beta * cnst0over_func_dT ) ; - TY = T1 * Cox0 ; - Ac41 = 2.0 + 3.0 * C_SQRT_2 * TY ; - Ac4 = 8.0 * Ac41 * Ac41 * Ac41 ; - TY_dT = T1_dT * Cox0 ; - Ac41_dT = 3.0 * C_SQRT_2 * TY_dT ; - Ac4_dT = 8.0 * 3.0 * Ac41 * Ac41 * Ac41_dT ; - - Ps0_min = here->HSMHV_eg - Pb2over ; - Ps0_min_dT = Eg_dT - Pb2over_dT ; - - TX = beta * ( VgpLD + Vxbgmtcl ) ; - TX_dVxb = beta * Vxbgmtcl_dVxbgmt ; - TX_dVgb = beta * VgpLD_dVgb ; - TX_dT = beta_dT * ( VgpLD + Vxbgmtcl ) + beta * Vxbgmtcl_dT; - - Ac31 = 7.0 * C_SQRT_2 - 9.0 * TY * ( TX - 2.0 ) ; - Ac31_dVxb = - 9.0 * TY * TX_dVxb ; - Ac31_dVgb = - 9.0 * TY * TX_dVgb ; - Ac31_dT = - 9.0 * ( TY_dT * ( TX - 2.0 ) + TY * TX_dT ); - - Ac3 = Ac31 * Ac31 ; - T1 = 2.0 * Ac31 ; - Ac3_dVxb = T1 * Ac31_dVxb ; - Ac3_dVgb = T1 * Ac31_dVgb ; - Ac3_dT = T1 * Ac31_dT ; - - Ac2 = sqrt( Ac4 + Ac3 ) ; - T1 = 0.5 / Ac2 ; - Ac2_dVxb = T1 * Ac3_dVxb ; - Ac2_dVgb = T1 * Ac3_dVgb ; - Ac2_dT = T1 * ( Ac4_dT + Ac3_dT ); - - Ac1 = -7.0 * C_SQRT_2 + Ac2 + 9.0 * TY * ( TX - 2.0 ) ; - Ac1_dVxb = Ac2_dVxb + 9.0 * TY * TX_dVxb ; - Ac1_dVgb = Ac2_dVgb + 9.0 * TY * TX_dVgb ; - Ac1_dT = Ac2_dT + 9.0 * ( TY_dT * ( TX - 2.0 ) + TY * TX_dT ) ; - - Acd = pow( Ac1 , C_1o3 ) ; - T1 = C_1o3 / ( Acd * Acd ) ; - Acd_dVxb = Ac1_dVxb * T1 ; - Acd_dVgb = Ac1_dVgb * T1 ; - Acd_dT = Ac1_dT * T1 ; - - Acn = -4.0 * C_SQRT_2 - 12.0 * TY + 2.0 * Acd + C_SQRT_2 * Acd * Acd ; - T1 = 2.0 + 2.0 * C_SQRT_2 * Acd ; - Acn_dVxb = T1 * Acd_dVxb ; - Acn_dVgb = T1 * Acd_dVgb ; - Acn_dT = - 12.0 * TY_dT + T1 * Acd_dT ; - - Chi = Acn / Acd ; - T1 = 1.0 / ( Acd * Acd ) ; - Chi_dVxb = ( Acn_dVxb * Acd - Acn * Acd_dVxb ) * T1 ; - Chi_dVgb = ( Acn_dVgb * Acd - Acn * Acd_dVgb ) * T1 ; - Chi_dT = ( Acn_dT * Acd - Acn * Acd_dT ) * T1 ; - - Psa = Chi * beta_inv - Vxbgmtcl ; - Psa_dVxb = Chi_dVxb * beta_inv - Vxbgmtcl_dVxbgmt ; - Psa_dVgb = Chi_dVgb * beta_inv ; - Psa_dT = Chi_dT * beta_inv + Chi * beta_inv_dT - Vxbgmtcl_dT ; - - T1 = Psa + Vxbgmtcl ; - T1_dT = Psa_dT + Vxbgmtcl_dT ; - T2 = T1 / Ps0_min ; - T2_dT = ( T1_dT * Ps0_min - T1 * Ps0_min_dT ) / ( Ps0_min * Ps0_min ) ; - T3 = sqrt( 1.0 + ( T2 * T2 ) ) ; - - T9 = T2 / T3 / Ps0_min ; - T3_dVd = T9 * ( Psa_dVxb + Vxbgmtcl_dVxbgmt ) ; - T3_dVg = T9 * Psa_dVgb ; - T3_dT = T2_dT * T2 / T3; - - Ps0LD = T1 / T3 - Vxbgmtcl ; - T9 = 1.0 / ( T3 * T3 ) ; - Ps0LD_dVxb = T9 * ( ( Psa_dVxb + Vxbgmtcl_dVxbgmt ) * T3 - T1 * T3_dVd ) - Vxbgmtcl_dVxbgmt ; - Ps0LD_dVgb = T9 * ( Psa_dVgb * T3 - T1 * T3_dVg ); - Ps0LD_dT = T9 * ( T1_dT * T3 - T1 * T3_dT ) - Vxbgmtcl_dT; - - T2 = ( VgpLD - Ps0LD ) ; - QsuLD = Cox0 * T2 ; - QsuLD_dVxb = - Cox0 * Ps0LD_dVxb ; - QsuLD_dVgb = Cox0 * ( VgpLD_dVgb - Ps0LD_dVgb ) ; - QsuLD_dT = Cox0 * ( - Ps0LD_dT ) ; - - QbuLD = QsuLD ; - QbuLD_dVxb = QsuLD_dVxb ; - QbuLD_dVgb = QsuLD_dVgb ; - QbuLD_dT = QsuLD_dT ; - - } else { - - /*---------------------------* - * Depletion and inversion - *-----------------*/ - - /* initial value for a few fixpoint iterations - to get Ps0_iniA from simplified Poisson equation: */ - flg_ovzone = 2 ; - Chi = znbd3 ; - Chi_dVxb = 0.0 ; Chi_dVgb = 0.0 ; Chi_dT = 0.0 ; - - Ps0_iniA= Chi/beta - Vxbgmtcl ; - Ps0_iniA_dVxb = Chi_dVxb/beta - Vxbgmtcl_dVxbgmt ; - Ps0_iniA_dVgb = Chi_dVgb/beta ; - Ps0_iniA_dT = Chi_dT/beta - Chi*beta_dT/(beta*beta) - Vxbgmtcl_dT; - - /* 1 .. 2 relaxation steps should be sufficient */ - for ( lp_ld = 1; lp_ld <= 2; lp_ld ++ ) { - TY = exp(-Chi); - TY_dVxb = -Chi_dVxb * TY; - TY_dVgb = -Chi_dVgb * TY; - TY_dT = - Chi_dT * TY; - TX = 1.0e0 + 4.0e0 - * ( beta * ( VgpLD + Vxbgmtcl ) - 1.0e0 + TY ) / ( fac1p2 * beta2 ) ; - TX_dVxb = 4.0e0 * ( beta * ( Vxbgmtcl_dVxbgmt ) + TY_dVxb ) / ( fac1p2 * beta2 ); - TX_dVgb = 4.0e0 * ( beta * ( VgpLD_dVgb ) + TY_dVgb ) / ( fac1p2 * beta2 ); - T1 = ( beta * ( VgpLD + Vxbgmtcl ) - 1.0e0 + TY ); - T1_dT = beta_dT * ( VgpLD + Vxbgmtcl ) + beta * Vxbgmtcl_dT + TY_dT; - T3 = fac1p2 * beta2 ; - T3_dT = fac1p2_dT * beta2 + fac1p2 * ( 2 * beta * beta_dT ) ; - TX_dT = 4 * ( T1_dT * T3 - T1 * T3_dT ) / ( T3 * T3 ); - if ( TX < epsm10) { - TX = epsm10; - TX_dVxb = TX_dVgb = TX_dT = 0.0; - } - - Ps0_iniA = VgpLD + fac1p2 * beta / 2.0e0 * ( 1.0e0 - sqrt( TX ) ) ; - Ps0_iniA_dVxb = - fac1p2 * beta / 2.0e0 * TX_dVxb * 0.5 / sqrt( TX ); - Ps0_iniA_dVgb = VgpLD_dVgb - fac1p2 * beta / 2.0e0 * TX_dVgb * 0.5 / sqrt( TX ); - T1 = fac1p2 * beta ; - T1_dT = fac1p2_dT * beta + fac1p2 * beta_dT ; - T2 = 1.0 - sqrt( TX ); - T2_dT = - 1.0e0 / ( 2.0e0 * sqrt( TX ) ) * TX_dT ; - Ps0_iniA_dT = ( T1_dT * T2 + T1 * T2_dT ) / 2.0e0 ; - - Chi = beta * ( Ps0_iniA + Vxbgmtcl ) ; - Chi_dVxb = beta * ( Ps0_iniA_dVxb + Vxbgmtcl_dVxbgmt ) ; - Chi_dVgb = beta * ( Ps0_iniA_dVgb ) ; - Chi_dT = beta_dT * ( Ps0_iniA + Vxbgmtcl ) + beta * ( Ps0_iniA_dT + Vxbgmtcl_dT ); - } /* End of iteration */ - - if ( Chi < znbd3 ) { - - flg_ovzone = 1 ; - - /*-----------------------------------* - * zone-D1 - * - Ps0_iniA is the analytical solution of QovLD=Qb0 with - * Qb0 being approximated by 3-degree polynomial. - * - * new: Inclusion of exp(-Chi) term at right border - *-----------------*/ - Ta = 1.0/(9.0*sqrt(2.0)) - (5.0+7.0*exp(-3.0)) / (54.0*sqrt(2.0+exp(-3.0))); - Tb = (1.0+exp(-3.0)) / (2.0*sqrt(2.0+exp(-3.0))) - sqrt(2.0) / 3.0; - Tc = 1.0/sqrt(2.0) + 1.0/(beta*fac1); - Tc_dT = - (beta_dT*fac1 + beta*fac1_dT)/(beta2*fac1p2); - Td = - (VgpLD + Vxbgmtcl) / fac1; - Td_dVxb = - Vxbgmtcl_dVxbgmt / fac1; - Td_dVgb = - VgpLD_dVgb / fac1; - Td_dT = - (Vxbgmtcl_dT*fac1 - (VgpLD+Vxbgmtcl)*fac1_dT)/fac1p2; - Tq = Tb*Tb*Tb / (27.0*Ta*Ta*Ta) - Tb*Tc/(6.0*Ta*Ta) + Td/(2.0*Ta); - Tq_dVxb = Td_dVxb/(2.0*Ta); - Tq_dVgb = Td_dVgb / (2.0*Ta); - Tq_dT = - Tb/(6.0*Ta*Ta)*Tc_dT + Td_dT/(2.0*Ta); - Tp = (3.0*Ta*Tc-Tb*Tb)/(9.0*Ta*Ta); - Tp_dT = Tc_dT/(3.0*Ta); - T5 = sqrt(Tq*Tq + Tp*Tp*Tp); - T5_dVxb = 2.0*Tq*Tq_dVxb / (2.0*T5); - T5_dVgb = 2.0*Tq*Tq_dVgb / (2.0*T5); - T5_dT = (2.0*Tq*Tq_dT + 3.0*Tp*Tp*Tp_dT) / (2.0*T5); - Tu = pow(-Tq + T5,C_1o3); - Tu_dVxb = Tu / (3.0 * (-Tq + T5)) * (-Tq_dVxb + T5_dVxb); - Tu_dVgb = Tu / (3.0 * (-Tq + T5)) * (-Tq_dVgb + T5_dVgb); - Tu_dT = Tu / (3.0 * (-Tq + T5)) * (-Tq_dT + T5_dT); - Tv = -pow(Tq + T5,C_1o3); - Tv_dVxb = Tv / (3.0 * (-Tq - T5)) * (-Tq_dVxb - T5_dVxb); - Tv_dVgb = Tv / (3.0 * (-Tq - T5)) * (-Tq_dVgb - T5_dVgb); - Tv_dT = Tv / (3.0 * (-Tq - T5)) * (-Tq_dT - T5_dT ); - TX = Tu + Tv - Tb/(3.0*Ta); - TX_dVxb = Tu_dVxb + Tv_dVxb; - TX_dVgb = Tu_dVgb + Tv_dVgb; - TX_dT = Tu_dT + Tv_dT ; - - Ps0_iniA = TX * beta_inv - Vxbgmtcl ; - Ps0_iniA_dVxb = TX_dVxb * beta_inv - Vxbgmtcl_dVxbgmt; - Ps0_iniA_dVgb = TX_dVgb * beta_inv; - Ps0_iniA_dT = TX_dT * beta_inv + TX * beta_inv_dT - Vxbgmtcl_dT; - - Chi = beta * ( Ps0_iniA + Vxbgmtcl ) ; - Chi_dVxb = beta * ( Ps0_iniA_dVxb + Vxbgmtcl_dVxbgmt ) ; - Chi_dVgb = beta * ( Ps0_iniA_dVgb ) ; - Chi_dT = beta_dT * ( Ps0_iniA + Vxbgmtcl ) + beta * ( Ps0_iniA_dT + Vxbgmtcl_dT ); - } - - if ( model->HSMHV_coqovsm > 0 ) { - /*-----------------------------------* - * - Ps0_iniB : upper bound. - *-----------------*/ - flg_ovzone += 2; - - VgpLD_shift = VgpLD + Vxbgmtcl + 0.1; - VgpLD_shift_dVgb = VgpLD_dVgb; - VgpLD_shift_dVxb = Vxbgmtcl_dVxbgmt; - VgpLD_shift_dT = Vxbgmtcl_dT; - exp_bVbs = exp( beta * - Vxbgmtcl ) + small ; - exp_bVbs_dVxb = - exp_bVbs * beta * Vxbgmtcl_dVxbgmt; - exp_bVbs_dT = - exp_bVbs * (beta_dT*Vxbgmtcl + beta*Vxbgmtcl_dT); - T0 = here->HSMHV_nin / Nover_func; - T0_dT = Nin_dT / Nover_func; - cnst1over = T0 * T0; - cnst1over_dT = 2.0 * T0 * T0_dT; - gamma = cnst1over * exp_bVbs ; - gamma_dVxb = cnst1over * exp_bVbs_dVxb; - gamma_dT = cnst1over_dT * exp_bVbs + cnst1over * exp_bVbs_dT; - - T0 = beta2 * fac1p2; - T0_dT = 2.0 * beta * fac1 * (beta_dT*fac1+beta*fac1_dT); - - psi = beta*VgpLD_shift; - psi_dVgb = beta*VgpLD_shift_dVgb; - psi_dVxb = beta*VgpLD_shift_dVxb; - psi_dT = beta_dT*VgpLD_shift + beta*VgpLD_shift_dT; - Chi_1 = log(gamma*T0 + psi*psi) - log(cnst1over*T0) + beta*Vxbgmtcl; - Chi_1_dVgb = 2.0*psi*psi_dVgb/ (gamma*T0 + psi*psi); - Chi_1_dVxb = (gamma_dVxb*T0+2.0*psi*psi_dVxb)/(gamma*T0+psi*psi) - + beta*Vxbgmtcl_dVxbgmt; - Chi_1_dT = (gamma_dT*T0+gamma*T0_dT+2.0*psi*psi_dT)/(gamma*T0+psi*psi) - - (cnst1over_dT*T0 + cnst1over*T0_dT)/(cnst1over*T0) - + beta_dT*Vxbgmtcl + beta*Vxbgmtcl_dT; - - Fn_SU2( Chi_1, Chi_1, psi, 1.0, T1, T2 ); - Chi_1_dVgb = Chi_1_dVgb*T1 + psi_dVgb*T2; - Chi_1_dVxb = Chi_1_dVxb*T1 + psi_dVxb*T2; - Chi_1_dT = Chi_1_dT *T1 + psi_dT *T2; - - /* 1 fixpoint step for getting more accurate Chi_B */ - psi -= Chi_1 ; - psi_dVgb -= Chi_1_dVgb ; - psi_dVxb -= Chi_1_dVxb ; - psi_dT -= Chi_1_dT ; - - psi += beta*0.1 ; - psi_dT += beta_dT*0.1 ; - -/* psi_B = psi;*/ -/* arg_B = psi*psi/(gamma*T0);*/ - Chi_B = log(gamma*T0 + psi*psi) - log(cnst1over*T0) + beta*Vxbgmtcl; - Chi_B_dVgb = 2.0*psi*psi_dVgb/ (gamma*T0 + psi*psi); - Chi_B_dVxb = (gamma_dVxb*T0+2.0*psi*psi_dVxb)/(gamma*T0+psi*psi) - + beta*Vxbgmtcl_dVxbgmt; - Chi_B_dT = (gamma_dT*T0+gamma*T0_dT+2.0*psi*psi_dT)/(gamma*T0+psi*psi) - - (cnst1over_dT*T0 + cnst1over*T0_dT)/(cnst1over*T0) - + beta_dT*Vxbgmtcl + beta*Vxbgmtcl_dT; - Ps0_iniB = Chi_B/beta - Vxbgmtcl ; -/* Ps0_iniB_dVgb = Chi_B_dVgb/beta; - Ps0_iniB_dVxb = Chi_B_dVxb/beta- Vxbgmtcl_dVxbgmt; - Ps0_iniB_dT = Chi_B_dT/beta - Chi_B/(beta*beta)*beta_dT - Vxbgmtcl_dT; -*/ - - /* construction of Ps0LD by taking Ps0_iniB as an upper limit of Ps0_iniA - * - * Limiting is done for Chi rather than for Ps0LD, to avoid shifting - * for Fn_SU2 */ - - Chi_A = Chi; - Chi_A_dVxb = Chi_dVxb; - Chi_A_dVgb = Chi_dVgb; - Chi_A_dT = Chi_dT; - - Fn_SU2( Chi, Chi_A, Chi_B, c_ps0ini_2*75.00, T1, T2 ); /* org: 50 */ - Chi_dVgb = Chi_A_dVgb * T1 + Chi_B_dVgb * T2; - Chi_dVxb = Chi_A_dVxb * T1 + Chi_B_dVxb * T2; - Chi_dT = Chi_A_dT * T1 + Chi_B_dT * T2; - - } - - /* updating Ps0LD */ - Ps0LD= Chi/beta - Vxbgmtcl ; - Ps0LD_dVgb = Chi_dVgb/beta; - Ps0LD_dVxb = Chi_dVxb/beta- Vxbgmtcl_dVxbgmt; - Ps0LD_dT = Chi_dT/beta - Chi/(beta*beta)*beta_dT - Vxbgmtcl_dT; - - T1 = Chi - 1.0 + exp(-Chi); - T1_dVxb = (1.0 - exp(-Chi)) * Chi_dVxb ; - T1_dVgb = (1.0 - exp(-Chi)) * Chi_dVgb ; - T1_dT = (1.0 - exp(-Chi)) * Chi_dT ; - if (T1 < epsm10) { - T1 = epsm10 ; - T1_dVxb = 0.0 ; - T1_dVgb = 0.0 ; - T1_dT = 0.0 ; - } - T2 = sqrt(T1); - QbuLD = cnst0over_func * T2 ; - T3 = cnst0over_func * 0.5 / T2 ; - QbuLD_dVxb = T3 * T1_dVxb ; - QbuLD_dVgb = T3 * T1_dVgb ; - QbuLD_dT = T3 * T1_dT + cnst0over_func_dT * T2 ; - - /*-----------------------------------------------------------* - * QsuLD : Qovs or Qovd in unit area. - * note: QsuLD = Qdep+Qinv. - *-----------------*/ - QsuLD = Cox0 * ( VgpLD - Ps0LD ) ; - QsuLD_dVxb = Cox0 * ( - Ps0LD_dVxb ) ; - QsuLD_dVgb = Cox0 * ( VgpLD_dVgb - Ps0LD_dVgb ) ; - QsuLD_dT = Cox0 * ( - Ps0LD_dT ) ; - - if ( model->HSMHV_coqovsm == 1 ) { /* take initial values from analytical model */ - - - /*---------------------------------------------------* - * Calculation of Ps0LD. (beginning of Newton loop) - * - Fs0 : Fs0 = 0 is the equation to be solved. - * - dPs0 : correction value. - *-----------------*/ - - /* initial value too close to flat band should not be used */ -// if (Ps0LD+Vxbgmtcl < 1.0e-2) Ps0LD = 1.0e-2 - Vxbgmtcl; - exp_bVbs = exp( beta * - Vxbgmtcl ) ; - T0 = here->HSMHV_nin / Nover_func; - cnst1over = T0 * T0; - cnst1over_dT = 2.0 * T0 * ( Nin_dT / Nover_func ); - cfs1 = cnst1over * exp_bVbs ; - - flg_conv = 0 ; - for ( lp_s0 = 1 ; lp_s0 <= 2*lp_s0_max + 1 ; lp_s0 ++ ) { - - Chi = beta * ( Ps0LD + Vxbgmtcl ) ; - - if ( Chi < znbd5 ) { - /*-------------------------------------------* - * zone-D1/D2. (Ps0LD) - *-----------------*/ - fi = Chi * Chi * Chi - * ( cn_im53 + Chi * ( cn_im54 + Chi * cn_im55 ) ) ; - fi_dChi = Chi * Chi - * ( 3 * cn_im53 + Chi * ( 4 * cn_im54 + Chi * 5 * cn_im55 ) ) ; - - fs01 = cfs1 * fi * fi ; - fs01_dPs0 = cfs1 * beta * 2 * fi * fi_dChi ; - - fb = Chi * ( cn_nc51 - + Chi * ( cn_nc52 - + Chi * ( cn_nc53 - + Chi * ( cn_nc54 + Chi * cn_nc55 ) ) ) ) ; - fb_dChi = cn_nc51 - + Chi * ( 2 * cn_nc52 - + Chi * ( 3 * cn_nc53 - + Chi * ( 4 * cn_nc54 + Chi * 5 * cn_nc55 ) ) ) ; - - fs02 = sqrt( fb * fb + fs01 + small ) ; - fs02_dPs0 = ( beta * fb_dChi * 2 * fb + fs01_dPs0 ) / ( fs02 + fs02 ) ; - - } else { - /*-------------------------------------------* - * zone-D3. (Ps0LD) - *-----------------*/ - if ( Chi < large_arg ) { /* avoid exp_Chi to become extremely large */ - exp_Chi = exp( Chi ) ; - fs01 = cfs1 * ( exp_Chi - 1.0e0 ) ; - fs01_dPs0 = cfs1 * beta * ( exp_Chi ) ; - } else { - exp_bPs0 = exp( beta*Ps0LD ) ; - fs01 = cnst1over * ( exp_bPs0 - exp_bVbs ) ; - fs01_dPs0 = cnst1over * beta * exp_bPs0 ; - } - fs02 = sqrt( Chi - 1.0 + fs01 ) ; - fs02_dPs0 = ( beta + fs01_dPs0 ) / fs02 * 0.5 ; - - } /* end of if ( Chi ... ) block */ - /*-----------------------------------------------------------* - * Fs0 - *-----------------*/ - Fs0 = VgpLD - Ps0LD - fac1 * fs02 ; - Fs0_dPs0 = - 1.0e0 - fac1 * fs02_dPs0 ; - - if ( flg_conv == 1 ) break ; - - dPs0 = - Fs0 / Fs0_dPs0 ; - - /*-------------------------------------------* - * Update Ps0LD . - *-----------------*/ - dPlim = 0.5*dP_max*(1.0 + Fn_Max(1.e0,fabs(Ps0LD))) ; - if ( fabs( dPs0 ) > dPlim ) dPs0 = dPlim * Fn_Sgn( dPs0 ) ; - - Ps0LD = Ps0LD + dPs0 ; - - TX = -Vxbgmtcl + ps_conv / 2 ; - if ( Ps0LD < TX ) Ps0LD = TX ; - - /*-------------------------------------------* - * Check convergence. - *-----------------*/ - if ( fabs( dPs0 ) <= ps_conv && fabs( Fs0 ) <= gs_conv ) { - flg_conv = 1 ; - } - - } /* end of Ps0LD Newton loop */ - - /*-------------------------------------------* - * Procedure for diverged case. - *-----------------*/ - if ( flg_conv == 0 ) { - fprintf( stderr , - "*** warning(HiSIM_HV): Went Over Iteration Maximum (Ps0LD)\n" ) ; - fprintf( stderr , " -Vxbgmtcl = %e Vgbgmt = %e\n" , -Vxbgmtcl , Vgbgmt ) ; - } - - /*---------------------------------------------------* - * Evaluate derivatives of Ps0LD. - *-----------------*/ - Chi_dT = beta_dT * ( Ps0LD + Vxbgmtcl ) + beta * Vxbgmtcl_dT; - exp_bVbs_dT = - ( beta_dT * Vxbgmtcl + beta * Vxbgmtcl_dT ) * exp_bVbs; - cfs1_dT = exp_bVbs * cnst1over_dT + exp_bVbs_dT * cnst1over; - - if ( Chi < znbd5 ) { - fs01_dVbs = cfs1 * beta * fi * ( - fi + 2 * fi_dChi ) ; /* fs01_dVxbgmtcl */ - fs01_dT = cfs1 * 2 * fi * fi_dChi * Chi_dT + fi * fi * cfs1_dT ; - T2 = 1.0e0 / ( fs02 + fs02 ) ; - fs02_dVbs = ( + beta * fb_dChi * 2 * fb + fs01_dVbs ) * T2 ; /* fs02_dVxbgmtcl */ - fs02_dT = ( 2 * fb * fb_dChi * Chi_dT + fs01_dT ) * T2 ; - } else { - if ( Chi < large_arg ) { - fs01_dVbs = + cfs1 * beta ; /* fs01_dVxbgmtcl */ - exp_Chi_dT = exp_Chi * Chi_dT ; - fs01_dT = ( exp_Chi - 1.0e0 ) * cfs1_dT + cfs1 * exp_Chi_dT ; - } else { - fs01_dVbs = + cfs1 * beta ; - exp_bPs0_dT = exp_bPs0 * Ps0LD * beta_dT ; - fs01_dT = cnst1over_dT*(exp_bPs0-exp_bVbs) + cnst1over*(exp_bPs0_dT-exp_bVbs_dT) ; - } - T2 = 0.5e0 / fs02 ; - fs02_dVbs = ( + beta + fs01_dVbs ) * T2 ; /* fs02_dVxbgmtcl */ - fs02_dT = T2 * ( Chi_dT + fs01_dT ) ; - } - - T1 = 1.0 / Fs0_dPs0 ; - Ps0LD_dVxb = - ( - fac1 * fs02_dVbs ) * T1 ; - Ps0LD_dVds = 0.0 ; - Ps0LD_dVgb = - ( VgpLD_dVgb - fac1_dVgs * fs02 ) * T1 ; - Ps0LD_dT = - ( - ( fac1 * fs02_dT + fac1_dT * fs02 ) ) * T1; - - Chi_dT = beta_dT * ( Ps0LD + Vxbgmtcl ) + beta * ( Ps0LD_dT + Vxbgmtcl_dT ); - - if ( Chi < znbd5 ) { - /*-------------------------------------------* - * zone-D1/D2. (Ps0LD) - *-----------------*/ - if ( Chi < znbd3 ) { flg_ovzone = 1; } - else { flg_ovzone = 2; } - - Xi0 = fb * fb + epsm10 ; - T1 = 2 * fb * fb_dChi * beta ; - Xi0_dVbs = T1 * ( Ps0LD_dVxb + 1.0 ) ; /* Xi0_dVxbgmtcl */ - Xi0_dVds = T1 * Ps0LD_dVds ; - Xi0_dVgs = T1 * Ps0LD_dVgb ; - Xi0_dT = 2 * fb * fb_dChi * Chi_dT ; - - Xi0p12 = fb + epsm10 ; - T1 = fb_dChi * beta ; - Xi0p12_dVbs = T1 * ( Ps0LD_dVxb + 1.0 ) ; /* Xi0p12_dVxbgmtcl */ - Xi0p12_dVds = T1 * Ps0LD_dVds ; - Xi0p12_dVgs = T1 * Ps0LD_dVgb ; - Xi0p12_dT = fb_dChi * Chi_dT ; - - Xi0p32 = fb * fb * fb + epsm10 ; - T1 = 3 * fb * fb * fb_dChi * beta ; - Xi0p32_dVbs = T1 * ( Ps0LD_dVxb + 1.0 ) ; /* Xi0p32_dVxbgmtcl */ - Xi0p32_dVds = T1 * Ps0LD_dVds ; - Xi0p32_dVgs = T1 * Ps0LD_dVgb ; - Xi0p32_dT = 3 * fb * fb * fb_dChi * Chi_dT ; - - } else { - /*-------------------------------------------* - * zone-D3. (Ps0LD) - *-----------------*/ - flg_ovzone = 3 ; - - Xi0 = Chi - 1.0e0 ; - Xi0_dVbs = beta * ( Ps0LD_dVxb + 1.0e0 ) ; /* Xi0_dVxbgmtcl */ - Xi0_dVds = beta * Ps0LD_dVds ; - Xi0_dVgs = beta * Ps0LD_dVgb ; - Xi0_dT = Chi_dT ; - - Xi0p12 = sqrt( Xi0 ) ; - T1 = 0.5e0 / Xi0p12 ; - Xi0p12_dVbs = T1 * Xi0_dVbs ; - Xi0p12_dVds = T1 * Xi0_dVds ; - Xi0p12_dVgs = T1 * Xi0_dVgs ; - Xi0p12_dT = T1 * Xi0_dT ; - - Xi0p32 = Xi0 * Xi0p12 ; - T1 = 1.5e0 * Xi0p12 ; - Xi0p32_dVbs = T1 * Xi0_dVbs ; - Xi0p32_dVds = T1 * Xi0_dVds ; - Xi0p32_dVgs = T1 * Xi0_dVgs ; - Xi0p32_dT = T1 * Xi0_dT ; - - } /* end of if ( Chi ... ) block */ - - /*-----------------------------------------------------------* - * - Recalculate the derivatives of fs01 and fs02. - *-----------------*/ - fs01_dVbs = Ps0LD_dVxb * fs01_dPs0 + fs01_dVbs ; - fs01_dVds = Ps0LD_dVds * fs01_dPs0 ; - fs01_dVgs = Ps0LD_dVgb * fs01_dPs0 ; - fs01_dT = Ps0LD_dT * fs01_dPs0 + fs01_dT; - fs02_dVbs = Ps0LD_dVxb * fs02_dPs0 + fs02_dVbs ; -/* fs02_dVxb = Ps0LD_dVds * fs02_dPs0 ;*/ - fs02_dVgb = Ps0LD_dVgb * fs02_dPs0 ; - fs02_dT = Ps0LD_dT * fs02_dPs0 + fs02_dT; - - /*-----------------------------------------------------------* - * QbuLD and QiuLD - *-----------------*/ - QbuLD = cnst0over_func * Xi0p12 ; - QbuLD_dVxb = cnst0over_func * Xi0p12_dVbs ; - QbuLD_dVgb = cnst0over_func * Xi0p12_dVgs ; - QbuLD_dT = cnst0over_func * Xi0p12_dT + cnst0over_func_dT * Xi0p12; - - T1 = 1.0 / ( fs02 + Xi0p12 ) ; - QiuLD = cnst0over_func * fs01 * T1 ; - T2 = 1.0 / ( fs01 + epsm10 ) ; - QiuLD_dVbs = QiuLD * ( fs01_dVbs * T2 - ( fs02_dVbs + Xi0p12_dVbs ) * T1 ) ; - QiuLD_dVgs = QiuLD * ( fs01_dVgs * T2 - ( fs02_dVgb + Xi0p12_dVgs ) * T1 ) ; - T1_dT = - T1 * T1 * ( fs02_dT + Xi0p12_dT ); - QiuLD_dT = cnst0over_func * ( fs01 * T1_dT + T1 * fs01_dT ) + fs01 * T1 * cnst0over_func_dT; - - /*-----------------------------------------------------------* - * Extrapolation: X_dVxbgmt = X_dVxbgmtcl * Vxbgmtcl_dVxbgmt - *-----------------*/ - QbuLD_dVxb *= Vxbgmtcl_dVxbgmt ; - QiuLD_dVbs *= Vxbgmtcl_dVxbgmt ; - - /*-----------------------------------------------------------* - * Total overlap charge - *-----------------*/ - QsuLD = QbuLD + QiuLD; - QsuLD_dVxb = QbuLD_dVxb + QiuLD_dVbs; - QsuLD_dVgb = QbuLD_dVgb + QiuLD_dVgs; - QsuLD_dT = QbuLD_dT + QiuLD_dT; - - } /* end of COQOVSM branches */ - - } /* end of Vgbgmt region blocks */ - - /* convert to source ref. */ -/* Ps0LD_dVbs = Ps0LD_dVxb * Vxbgmt_dVbs + Ps0LD_dVgb * Vgbgmt_dVbs ;*/ - Ps0LD_dVds = Ps0LD_dVxb * Vxbgmt_dVds + Ps0LD_dVgb * Vgbgmt_dVds ; -/* Ps0LD_dVgs = Ps0LD_dVxb * Vxbgmt_dVgs + Ps0LD_dVgb * Vgbgmt_dVgs ;*/ - - QsuLD_dVbs = QsuLD_dVxb * Vxbgmt_dVbs + QsuLD_dVgb * Vgbgmt_dVbs ; - QsuLD_dVds = QsuLD_dVxb * Vxbgmt_dVds + QsuLD_dVgb * Vgbgmt_dVds ; - QsuLD_dVgs = QsuLD_dVxb * Vxbgmt_dVgs + QsuLD_dVgb * Vgbgmt_dVgs ; - - QbuLD_dVbs = QbuLD_dVxb * Vxbgmt_dVbs + QbuLD_dVgb * Vgbgmt_dVbs ; - QbuLD_dVds = QbuLD_dVxb * Vxbgmt_dVds + QbuLD_dVgb * Vgbgmt_dVds ; - QbuLD_dVgs = QbuLD_dVxb * Vxbgmt_dVgs + QbuLD_dVgb * Vgbgmt_dVgs ; - - /* inversion charge = total - depletion */ - QiuLD = QsuLD - QbuLD ; - QiuLD_dVbs = QsuLD_dVbs - QbuLD_dVbs ; - QiuLD_dVds = QsuLD_dVds - QbuLD_dVds ; - QiuLD_dVgs = QsuLD_dVgs - QbuLD_dVgs ; - QiuLD_dT = QsuLD_dT - QbuLD_dT ; - -/* End HSMHVevalQover */ diff --git a/src/spicelib/devices/hisimhv1/hsmhvevalenv.h b/src/spicelib/devices/hisimhv1/hsmhvevalenv.h deleted file mode 100644 index 5dd2ef485..000000000 --- a/src/spicelib/devices/hisimhv1/hsmhvevalenv.h +++ /dev/null @@ -1,91 +0,0 @@ -/*********************************************************************** - - HiSIM (Hiroshima University STARC IGFET Model) - Copyright (C) 2012 Hiroshima University & STARC - - MODEL NAME : HiSIM_HV - ( VERSION : 1 SUBVERSION : 2 REVISION : 4 ) - Model Parameter VERSION : 1.23 - FILE : hsmhvevalenv.h - - DATE : 2013.04.30 - - released by - Hiroshima University & - Semiconductor Technology Academic Research Center (STARC) -***********************************************************************/ - -#ifndef HSMHV_EVAL_ENV_H -#define HSMHV_EVAL_ENV_H - -/* macros and constants used in hsmhveval2yz.c */ - -/*---------------------------------------------------* -* Numerical constants. (macro) -*-----------------*/ - -/* machine epsilon */ -#if defined(_FLOAT_H) && defined(DBL_EPSILON) -#define C_EPS_M (DBL_EPSILON) -#else -#define C_EPS_M (2.2204460492503131e-16) -#endif - -#define MAX_EXP 5.834617425e14 -#define MIN_EXP 1.713908431e-15 -#define EXP_THR 34.0 - -/* sqrt(2) */ -#define C_SQRT_2 (1.414213562373095e+00) - -/* 1/3 */ -#define C_1o3 (3.333333333333333e-01) -/* 2/3 */ -#define C_2o3 (6.666666666666667e-01) -/* 2^(1/3) */ -#define C_2p_1o3 (1.259921049894873e+00) - -/* Pi */ -#define C_Pi (3.141592653589793) -#define C_Pio2 (1.570796326794897) - -/* Unit change */ -#define C_m2cm_p2 (1.0e4) -#define C_m2um (1.0e6) - -/*---------------------------------------------------* -* Physical constants/properties. (macro) -*-----------------*/ -/* Elemental charge */ -#define C_QE (1.6021918e-19) - -/* Boltzmann constant */ -#define C_KB (1.3806226e-23) - -/* Permitivity of Si, SiO2 and vacuum */ -#define C_ESI (1.034943e-10) -#define C_EOX (3.453133e-11) -#define C_VAC (8.8541878e-12) - -/* Room temperature constants */ -#define C_T300 (300e+00) -#define C_b300 (3.868283e+01) -/* #define C_Eg0 (1.1785e0) */ /*changed to parameter sIN.eg0*/ - -/* Build-in potential */ -/*#define C_Vbi (1.0e0)*/ /* changed to parameter sIN.vbi */ - - -/* Intrinsic carrier density at 300K */ -#define C_Nin0 (1.04e+16) - - -/*---------------------------------------------------* -* Functions. (macro) Take care of the arguments. -*-----------------*/ -#define Fn_Sqr(x) ( (x)*(x) ) /* x^2 */ -#define Fn_Max(x,y) ( (x) >= (y) ? (x) : (y) ) /* max[x,y] */ -#define Fn_Min(x,y) ( (x) <= (y) ? (x) : (y) ) /* min[x,y] */ -#define Fn_Sgn(x) ( (x) >= 0 ? (1) : (-1) ) /* sign[x] */ - -#endif /* HSMHV_EVAL_ENV_H */ diff --git a/src/spicelib/devices/hisimhv1/hsmhvext.h b/src/spicelib/devices/hisimhv1/hsmhvext.h deleted file mode 100644 index 8d409d192..000000000 --- a/src/spicelib/devices/hisimhv1/hsmhvext.h +++ /dev/null @@ -1,37 +0,0 @@ -/*********************************************************************** - - HiSIM (Hiroshima University STARC IGFET Model) - Copyright (C) 2012 Hiroshima University & STARC - - MODEL NAME : HiSIM_HV - ( VERSION : 1 SUBVERSION : 2 REVISION : 4 ) - Model Parameter VERSION : 1.23 - FILE : hsmhvext.h - - DATE : 2013.04.30 - - released by - Hiroshima University & - Semiconductor Technology Academic Research Center (STARC) -***********************************************************************/ - -extern int HSMHVacLoad(GENmodel *,CKTcircuit*); -extern int HSMHVask(CKTcircuit *,GENinstance*,int,IFvalue*,IFvalue*); -extern int HSMHVconvTest(GENmodel *,CKTcircuit*); -extern int HSMHVgetic(GENmodel*,CKTcircuit*); -extern int HSMHVload(GENmodel*,CKTcircuit*); -extern int HSMHVmAsk(CKTcircuit*,GENmodel *,int, IFvalue*); -extern int HSMHVmParam(int,IFvalue*,GENmodel*); -extern void HSMHVmosCap(CKTcircuit*, double, double, double, double*, - double, double, double, double, double, double, - double*, double*, double*, double*, double*, double*, double*, double*, - double*, double*, double*, double*, double*, double*, double*, - double*); -extern int HSMHVparam(int,IFvalue*,GENinstance*,IFvalue*); -extern int HSMHVpzLoad(GENmodel*,CKTcircuit*,SPcomplex*); -extern int HSMHVsetup(SMPmatrix*,GENmodel*,CKTcircuit*,int*); -extern int HSMHVunsetup(GENmodel*,CKTcircuit*); -extern int HSMHVtemp(GENmodel*,CKTcircuit*); -extern int HSMHVtrunc(GENmodel*,CKTcircuit*,double*); -extern int HSMHVnoise(int,int,GENmodel*,CKTcircuit*,Ndata*,double*); -extern int HSMHVsoaCheck(CKTcircuit *, GENmodel *); diff --git a/src/spicelib/devices/hisimhv1/hsmhvgetic.c b/src/spicelib/devices/hisimhv1/hsmhvgetic.c deleted file mode 100644 index 9023f66ae..000000000 --- a/src/spicelib/devices/hisimhv1/hsmhvgetic.c +++ /dev/null @@ -1,56 +0,0 @@ -/*********************************************************************** - - HiSIM (Hiroshima University STARC IGFET Model) - Copyright (C) 2012 Hiroshima University & STARC - - MODEL NAME : HiSIM_HV - ( VERSION : 1 SUBVERSION : 2 REVISION : 4 ) - Model Parameter VERSION : 1.23 - FILE : hsmhvgetic.c - - DATE : 2013.04.30 - - released by - Hiroshima University & - Semiconductor Technology Academic Research Center (STARC) -***********************************************************************/ - -#include "ngspice/ngspice.h" -#include "ngspice/cktdefs.h" -#include "hsmhvdef.h" -#include "ngspice/sperror.h" -#include "ngspice/suffix.h" - -int HSMHVgetic( - GENmodel *inModel, - CKTcircuit *ckt) -{ - HSMHVmodel *model = (HSMHVmodel*)inModel; - HSMHVinstance *here; - /* - * grab initial conditions out of rhs array. User specified, so use - * external nodes to get values - */ - - for ( ;model ;model = HSMHVnextModel(model)) { - for ( here = HSMHVinstances(model); here ;here = HSMHVnextInstance(here)) { - if (!here->HSMHV_icVBS_Given) { - here->HSMHV_icVBS = - *(ckt->CKTrhs + here->HSMHVbNode) - - *(ckt->CKTrhs + here->HSMHVsNode); - } - if (!here->HSMHV_icVDS_Given) { - here->HSMHV_icVDS = - *(ckt->CKTrhs + here->HSMHVdNode) - - *(ckt->CKTrhs + here->HSMHVsNode); - } - if (!here->HSMHV_icVGS_Given) { - here->HSMHV_icVGS = - *(ckt->CKTrhs + here->HSMHVgNode) - - *(ckt->CKTrhs + here->HSMHVsNode); - } - } - } - return(OK); -} - diff --git a/src/spicelib/devices/hisimhv1/hsmhvinit.c b/src/spicelib/devices/hisimhv1/hsmhvinit.c deleted file mode 100644 index 52e170d0e..000000000 --- a/src/spicelib/devices/hisimhv1/hsmhvinit.c +++ /dev/null @@ -1,76 +0,0 @@ -#include "ngspice/config.h" - -#include "ngspice/devdefs.h" - -#include "hsmhvdef.h" -#include "hsmhvitf.h" -#include "hsmhvinit.h" - - -SPICEdev HSMHVinfo = { - .DEVpublic = { - .name = "HiSIMHV1", - .description = "Hiroshima University STARC IGFET Model - HiSIM_HV v.1", - .terms = &HSMHVnSize, - .numNames = &HSMHVnSize, - .termNames = HSMHVnames, - .numInstanceParms = &HSMHVpTSize, - .instanceParms = HSMHVpTable, - .numModelParms = &HSMHVmPTSize, - .modelParms = HSMHVmPTable, - .flags = DEV_DEFAULT, - -#ifdef XSPICE - .cm_func = NULL, - .num_conn = 0, - .conn = NULL, - .num_param = 0, - .param = NULL, - .num_inst_var = 0, - .inst_var = NULL, -#endif - }, - - .DEVparam = HSMHVparam, - .DEVmodParam = HSMHVmParam, - .DEVload = HSMHVload, - .DEVsetup = HSMHVsetup, - .DEVunsetup = HSMHVunsetup, - .DEVpzSetup = HSMHVsetup, - .DEVtemperature = HSMHVtemp, - .DEVtrunc = HSMHVtrunc, - .DEVfindBranch = NULL, - .DEVacLoad = HSMHVacLoad, - .DEVaccept = NULL, - .DEVdestroy = NULL, - .DEVmodDelete = NULL, - .DEVdelete = NULL, - .DEVsetic = HSMHVgetic, - .DEVask = HSMHVask, - .DEVmodAsk = HSMHVmAsk, - .DEVpzLoad = HSMHVpzLoad, - .DEVconvTest = HSMHVconvTest, - .DEVsenSetup = NULL, - .DEVsenLoad = NULL, - .DEVsenUpdate = NULL, - .DEVsenAcLoad = NULL, - .DEVsenPrint = NULL, - .DEVsenTrunc = NULL, - .DEVdisto = NULL, - .DEVnoise = HSMHVnoise, - .DEVsoaCheck = HSMHVsoaCheck, - .DEVinstSize = &HSMHViSize, - .DEVmodSize = &HSMHVmSize, - -#ifdef CIDER - .DEVdump = NULL, - .DEVacct = NULL, -#endif -}; - - -SPICEdev * -get_hsmhv_info(void) -{ - return &HSMHVinfo; -} diff --git a/src/spicelib/devices/hisimhv1/hsmhvinit.h b/src/spicelib/devices/hisimhv1/hsmhvinit.h deleted file mode 100644 index 24066b28b..000000000 --- a/src/spicelib/devices/hisimhv1/hsmhvinit.h +++ /dev/null @@ -1,13 +0,0 @@ -#ifndef _HISIMINIT_H -#define _HISIMINIT_H - -extern IFparm HSMHVpTable[ ]; -extern IFparm HSMHVmPTable[ ]; -extern char *HSMHVnames[ ]; -extern int HSMHVpTSize; -extern int HSMHVmPTSize; -extern int HSMHVnSize; -extern int HSMHViSize; -extern int HSMHVmSize; - -#endif diff --git a/src/spicelib/devices/hisimhv1/hsmhvitf.h b/src/spicelib/devices/hisimhv1/hsmhvitf.h deleted file mode 100644 index 27a3cad2a..000000000 --- a/src/spicelib/devices/hisimhv1/hsmhvitf.h +++ /dev/null @@ -1,23 +0,0 @@ -/*********************************************************************** - - HiSIM (Hiroshima University STARC IGFET Model) - Copyright (C) 2012 Hiroshima University & STARC - - MODEL NAME : HiSIM_HV - ( VERSION : 1 SUBVERSION : 2 REVISION : 4 ) - Model Parameter VERSION : 1.23 - FILE : hsmhvitf - - DATE : 2013.04.30 - - released by - Hiroshima University & - Semiconductor Technology Academic Research Center (STARC) -***********************************************************************/ - -#ifndef DEV_HISIMHV -#define DEV_HISIMHV - -SPICEdev *get_hsmhv_info(void); - -#endif diff --git a/src/spicelib/devices/hisimhv1/hsmhvld.c b/src/spicelib/devices/hisimhv1/hsmhvld.c deleted file mode 100644 index 38aa17a05..000000000 --- a/src/spicelib/devices/hisimhv1/hsmhvld.c +++ /dev/null @@ -1,2658 +0,0 @@ -/*********************************************************************** - - HiSIM (Hiroshima University STARC IGFET Model) - Copyright (C) 2012 Hiroshima University & STARC - - MODEL NAME : HiSIM_HV - ( VERSION : 1 SUBVERSION : 2 REVISION : 4 ) - Model Parameter VERSION : 1.23 - FILE : hsmhvld.c - - DATE : 2013.04.30 - - released by - Hiroshima University & - Semiconductor Technology Academic Research Center (STARC) -***********************************************************************/ - -#include "ngspice/ngspice.h" -#include "hisimhv.h" -#include "ngspice/trandefs.h" -#include "ngspice/const.h" -#include "ngspice/sperror.h" -#include "ngspice/devdefs.h" -#include "ngspice/suffix.h" - -#define SHOW_EPS_QUANT 1.0e-15 - -static void ShowPhysVals -( - HSMHVinstance *here, - HSMHVmodel *model, - int isFirst, - double vds, - double vgs, - double vbs, - double vgd, - double vbd, - double vgb - ) -{ - - NG_IGNORE(vgd); - NG_IGNORE(vbd); - - /* */ - /* */ - /* Note: This function is not yet adapted to the flat version */ - /* */ - /* */ - - /* regard the epsilon-quantity as 0.0 */ - vds = (fabs(vds) < SHOW_EPS_QUANT) ? 0.0 : vds; - vgs = (fabs(vgs) < SHOW_EPS_QUANT) ? 0.0 : vgs; - vbs = (fabs(vbs) < SHOW_EPS_QUANT) ? 0.0 : vbs; - vgb = (fabs(vgb) < SHOW_EPS_QUANT) ? 0.0 : vgb; - switch (model->HSMHV_show) { - case 1: - if (isFirst) printf("Vds Ids\n"); - printf("%e %e\n", model->HSMHV_type*vds, here->HSMHV_mode*here->HSMHV_ids); - break; - case 2: - if (isFirst) printf("Vgs Ids\n"); - printf("%e %e\n", model->HSMHV_type*vgs, here->HSMHV_mode*here->HSMHV_ids); - break; - case 3: - if (isFirst) printf("Vgs log10(|Ids|)\n"); - printf("%e %e\n", model->HSMHV_type*vgs, log10(here->HSMHV_ids)); - break; - case 4: - if (isFirst) printf("log10(|Ids|) gm/|Ids|\n"); - if (here->HSMHV_ids == 0.0) - printf("I can't show gm/Ids - log10(Ids), because Ids = 0.\n"); - else - printf("%e %e\n", log10(here->HSMHV_ids), here->HSMHV_gm/here->HSMHV_ids); - break; - case 5: - if (isFirst) printf("Vds gds\n"); - printf("%e %e\n", model->HSMHV_type*vds, here->HSMHV_gds); - break; - case 6: - if (isFirst) printf("Vgs gm\n"); - printf("%e %e\n", model->HSMHV_type*vgs, here->HSMHV_gm); - break; - case 7: - if (isFirst) printf("Vbs gbs\n"); - printf("%e %e\n", model->HSMHV_type*vbs, here->HSMHV_gmbs); - break; - case 8: - if (isFirst) printf("Vgs Cgg\n"); - printf("%e %e\n", model->HSMHV_type*vgs, here->HSMHV_cggb); - break; - case 9: - if (isFirst) printf("Vgs Cgs\n"); - printf("%e %e\n", model->HSMHV_type*vgs, here->HSMHV_cgsb); - break; - case 10: - if (isFirst) printf("Vgs Cgd\n"); - printf("%e %e\n", model->HSMHV_type*vgs, here->HSMHV_cgdb); - break; - case 11: - if (isFirst) printf("Vgs Cgb\n"); - printf("%e %e\n", model->HSMHV_type*vgs, -(here->HSMHV_cggb+here->HSMHV_cgsb+here->HSMHV_cgdb)); - break; - case 12: - if (isFirst) printf("Vds Csg\n"); - printf("%e %e\n", model->HSMHV_type*vds, -(here->HSMHV_cggb+here->HSMHV_cbgb+here->HSMHV_cdgb)); - break; - case 13: - if (isFirst) printf("Vds Cdg\n"); - printf("%e %e\n", model->HSMHV_type*vds, here->HSMHV_cdgb); - break; - case 14: - if (isFirst) printf("Vds Cbg\n"); - printf("%e %e\n", model->HSMHV_type*vds, here->HSMHV_cbgb); - break; - case 15: - if (isFirst) printf("Vds Cgg\n"); - printf("%e %e\n", model->HSMHV_type*vds, here->HSMHV_cggb); - break; - case 16: - if (isFirst) printf("Vds Cgs\n"); - printf("%e %e\n", model->HSMHV_type*vds, here->HSMHV_cgsb); - break; - case 17: - if (isFirst) printf("Vds Cgd\n"); - printf("%e %e\n", model->HSMHV_type*vds, here->HSMHV_cgdb); - break; - case 18: - if (isFirst) printf("Vds Cgb\n"); - printf("%e %e\n", model->HSMHV_type*vds, -(here->HSMHV_cggb+here->HSMHV_cgsb+here->HSMHV_cgdb)); - break; - case 19: - if (isFirst) printf("Vgs Csg\n"); - printf("%e %e\n", model->HSMHV_type*vgs, -(here->HSMHV_cggb+here->HSMHV_cbgb+here->HSMHV_cdgb)); - break; - case 20: - if (isFirst) printf("Vgs Cdg\n"); - printf("%e %e\n", model->HSMHV_type*vgs, here->HSMHV_cdgb); - break; - case 21: - if (isFirst) printf("Vgs Cbg\n"); - printf("%e %e\n", model->HSMHV_type*vgs, here->HSMHV_cbgb); - break; - case 22: - if (isFirst) printf("Vgb Cgb\n"); - printf("%e %e\n", model->HSMHV_type*vgb, -(here->HSMHV_cggb+here->HSMHV_cgsb+here->HSMHV_cgdb)); - break; - case 50: - if (isFirst) printf("Vgs Vds Vbs Vgb Ids log10(|Ids|) gm/|Ids| gm gds gbs Cgg Cgs Cgb Cgd Csg Cbg Cdg\n"); - printf("%e %e %e %e %e %e %e %e %e %e %e %e %e %e %e %e %e\n", - model->HSMHV_type*vgs, model->HSMHV_type*vds, model->HSMHV_type*vbs, model->HSMHV_type*vgb, here->HSMHV_mode*here->HSMHV_ids, - log10(here->HSMHV_ids), here->HSMHV_gm/here->HSMHV_ids, here->HSMHV_gm, here->HSMHV_gds, here->HSMHV_gmbs, here->HSMHV_cggb, - here->HSMHV_cgsb, -(here->HSMHV_cggb+here->HSMHV_cgsb+here->HSMHV_cgdb), here->HSMHV_cgdb, - -(here->HSMHV_cggb+here->HSMHV_cbgb+here->HSMHV_cdgb), here->HSMHV_cbgb, here->HSMHV_cdgb); - break; - default: - /* - printf("There is no physical value corrsponding to %d\n", flag); - */ - break; - } -} - -int HSMHVload( - GENmodel *inModel, - register CKTcircuit *ckt) - /* actually load the current value into the - * sparse matrix previously provided - */ -{ - register HSMHVmodel *model = (HSMHVmodel*)inModel; - register HSMHVinstance *here; - HSMHVbinningParam *pParam; -/* HSMHVmodelMKSParam *modelMKS ;*/ -/* HSMHVhereMKSParam *hereMKS ;*/ - - - - /* node voltages */ -#define XDIM 14 - double x[XDIM] ; - - /* branch voltages */ - double vbd=0.0, vbs=0.0, vds=0.0, vgb=0.0, vgd=0.0, vgdo=0.0, vgs=0.0 ; - double vdbs=0.0, vsbs=0.0, vdbd=0.0 ; - double vges=0.0, vged=0.0, vgedo=0.0 ; - double vbs_jct=0.0, vbd_jct=0.0; - double deltemp = 0.0 , deltemp_old = 0.0 ; - double vggp=0, vddp=0, vssp=0, vbpb=0, vbpsb=0, vbpdb=0 ; - double vdse=0.0, vgse=0.0, vbse=0.0 ; - double vsubs=0.0 ; /* substrate bias */ - - double ivds=0.0, ivgs=0.0, ivbs=0.0 ; - double ivgse=0.0, ivdse=0.0, ivbse=0.0 ; - - /* delta of branch voltages */ - double delvbs=0.0, delvds=0.0, delvgs=0.0, delvsbs=0.0, delvdbd=0.0, deldeltemp = 0.0 ; - double delvdse=0.0, delvgse=0.0, delvbse=0.0, delvddp=0.0, delvssp=0.0, delvggp=0.0, delvbpb=0.0, delvbpdb=0.0, delvbpsb =0.0 ; - double delvsubs=0.0; /* substrate bias change */ - - /* branch currents */ - double Ids=0.0, gds=0.0, gm=0.0, gmbs=0.0, gmT=0.0, - gds_ext=0.0, gm_ext=0.0, gmbs_ext=0.0 ; - double Igd=0.0, dIgd_dVd=0.0, dIgd_dVg=0.0, dIgd_dVb=0.0, dIgd_dVs=0.0, dIgd_dT=0.0 ; - double Igs=0.0, dIgs_dVd=0.0, dIgs_dVg=0.0, dIgs_dVb=0.0, dIgs_dVs=0.0, dIgs_dT=0.0 ; - double Igb=0.0, dIgb_dVd=0.0, dIgb_dVg=0.0, dIgb_dVb=0.0, dIgb_dVs=0.0, dIgb_dT=0.0 ; - double Isub=0.0, dIsub_dVds=0.0, dIsub_dVgs=0.0, dIsub_dVbs=0.0, dIsub_dT=0.0 ; - double Isubs=0.0, dIsubs_dVds=0.0, dIsubs_dVgs=0.0, dIsubs_dVbs=0.0, dIsubs_dT=0.0 ; - double dIsub_dVdse=0.0, dIsubs_dVdse=0.0 ; - double Igidl=0.0, dIgidl_dVds=0.0, dIgidl_dVgs=0.0, dIgidl_dVbs=0.0, dIgidl_dT=0.0 ; - double Igisl=0.0, dIgisl_dVds=0.0, dIgisl_dVgs=0.0, dIgisl_dVbs=0.0, dIgisl_dT=0.0 ; - double Ibd=0.0, Gbd=0.0, Gbdt=0.0 ; - double Ibs=0.0, Gbs=0.0, Gbst=0.0 ; - double Iddp=0.0, dIddp_dVddp=0.0, dIddp_dVdse=0.0, dIddp_dVgse=0.0, dIddp_dVbse=0.0, dIddp_dVsubs=0.0, dIddp_dT =0.0 ; - double Issp=0.0, dIssp_dVssp=0.0, dIssp_dVdse=0.0, dIssp_dVgse=0.0, dIssp_dVbse=0.0, dIssp_dVsubs=0.0, dIssp_dT =0.0 ; - double Iggp=0.0, dIggp_dVggp =0.0 ; - double Ibpb=0.0, dIbpb_dVbpb =0.0 ; - double Ibpdb=0.0, dIbpdb_dVbpdb =0.0 ; - double Ibpsb=0.0, dIbpsb_dVbpsb =0.0 ; - double Ith=0.0, dIth_dT =0.0 ; - - /* displacement currents */ - double cq_d=0.0, cq_dP=0.0, cq_g=0.0, cq_gP=0.0, cq_s=0.0, cq_sP=0.0, cq_bP=0.0, cq_b=0.0, cq_db=0.0, cq_sb=0.0, cq_t=0.0 ; - double cq_dE=0.0, cq_gE=0.0, cq_sE=0.0, cq_bE=0.0 ; - - /* node currents */ - double cur_d=0.0, cur_dP=0.0, cur_g=0.0, cur_gP=0.0, cur_s=0.0, cur_sP=0.0, cur_bP=0.0, cur_b=0.0, cur_db=0.0, cur_sb=0.0, cur_t=0.0 ; - double i_d=0.0, i_dP=0.0, i_g=0.0, i_gP=0.0, i_s=0.0, i_sP=0.0, i_bP=0.0, i_b=0.0, i_db=0.0, i_sb=0.0, i_t=0.0 ; - - /* resistances and conductances */ - double Rd=0.0, dRd_dVdse=0.0, dRd_dVgse=0.0, dRd_dVbse=0.0, dRd_dVsubs=0.0, dRd_dT=0.0 ; - double Rs=0.0, dRs_dVdse=0.0, dRs_dVgse=0.0, dRs_dVbse=0.0, dRs_dVsubs=0.0, dRs_dT=0.0 ; - - double GD=0.0, GD_dVds=0.0, GD_dVgs=0.0, GD_dVbs=0.0, GD_dVsubs=0.0, GD_dT=0.0 ; - double GS=0.0, GS_dVds=0.0, GS_dVgs=0.0, GS_dVbs=0.0, GS_dVsubs=0.0, GS_dT=0.0 ; - double Gth=0.0 ; - double GG=0.0, GRBPD=0.0, GRBPS=0.0, GRBPB=0.0; - - /* charges */ - double Qd=0.0, dQd_dVds=0.0, dQd_dVgs=0.0, dQd_dVbs=0.0, dQd_dT=0.0 ; - double Qg=0.0, dQg_dVds=0.0, dQg_dVgs=0.0, dQg_dVbs=0.0, dQg_dT=0.0 ; - double Qs=0.0, dQs_dVds=0.0, dQs_dVgs=0.0, dQs_dVbs=0.0, dQs_dT=0.0 ; - double Qb=0.0, dQb_dVds=0.0, dQb_dVgs=0.0, dQb_dVbs=0.0, dQb_dT=0.0 ; - double Qbd=0.0, Cbd=0.0, Cbdt=0.0, - Qbs=0.0, Cbs=0.0, Cbst=0.0 ; - double Qth=0.0, Cth =0.0 ; - double Qfd=0.0, dQfd_dVdse=0.0, dQfd_dVgse=0.0, dQfd_dVbse=0.0, dQfd_dT=0.0 ; - double Qfs=0.0, dQfs_dVdse=0.0, dQfs_dVgse=0.0, dQfs_dVbse=0.0, dQfs_dT=0.0 ; - - double Qdext=0.0, dQdext_dVdse=0.0, dQdext_dVgse=0.0, dQdext_dVbse=0.0, dQdext_dT=0.0 ; - double Qgext=0.0, dQgext_dVdse=0.0, dQgext_dVgse=0.0, dQgext_dVbse=0.0, dQgext_dT=0.0 ; - double /*Qsext=0.0,*/ dQsext_dVdse=0.0, dQsext_dVgse=0.0, dQsext_dVbse=0.0, dQsext_dT=0.0 ; - double Qbext=0.0, dQbext_dVdse=0.0, dQbext_dVgse=0.0, dQbext_dVbse=0.0, dQbext_dT=0.0 ; - /* 5th substrate node */ - int flg_subNode = 0 ; - - /* self heating */ - double Veffpower=0.0, dVeffpower_dVds=0.0, dVeffpower_dVdse =0.0 ; - double P=0.0, dP_dVds=0.0, dP_dVgs=0.0, dP_dVbs=0.0, dP_dT =0.0, - dP_dVdse=0.0, dP_dVgse=0.0, dP_dVbse =0.0 ; - int flg_tempNode = 0 ; - double T0 , T1 , T2 ; - -#define SHE_MAX_dlt 0.1 - -#define C_RTH_MIN 1.0e-4 - - double TMF1 , TMF2 ; -/*---------------------------------------------------* -* smoothUpper: ceiling. -* y = xmax - 0.5 ( arg + sqrt( arg^2 + 4 xmax delta ) ) -* arg = xmax - x - delta -*-----------------*/ - -#define Fn_SU( y , x , xmax , delta , dx ) { \ - TMF1 = ( xmax ) - ( x ) - ( delta ) ; \ - TMF2 = 4.0 * ( xmax ) * ( delta) ; \ - TMF2 = TMF2 > 0.0 ? TMF2 : -( TMF2 ) ; \ - TMF2 = sqrt ( TMF1 * TMF1 + TMF2 ) ; \ - dx = 0.5 * ( 1.0 + TMF1 / TMF2 ) ; \ - y = ( xmax ) - 0.5 * ( TMF1 + TMF2 ) ; \ - } - - /* NQS related variables */ - int flg_nqs =0 ; - double Qi_nqs=0.0, Qb_nqs=0.0, delQi_nqs=0.0, delQb_nqs=0.0, i_qi=0.0, i_qb=0.0, cq_qi=0.0, cq_qb=0.0, cur_qi=0.0, cur_qb =0.0 ; - double Iqi_nqs=0.0, dIqi_nqs_dVds=0.0, dIqi_nqs_dVgs=0.0, dIqi_nqs_dVbs=0.0, dIqi_nqs_dT=0.0, dIqi_nqs_dQi_nqs =0.0 ; - double Iqb_nqs=0.0, dIqb_nqs_dVds=0.0, dIqb_nqs_dVgs=0.0, dIqb_nqs_dVbs=0.0, dIqb_nqs_dT=0.0, dIqb_nqs_dQb_nqs =0.0 ; - double Qd_nqs=0.0, dQd_nqs_dVds=0.0, dQd_nqs_dVgs=0.0, dQd_nqs_dVbs=0.0, dQd_nqs_dT=0.0, dQd_nqs_dQi_nqs =0.0 ; - double Qs_nqs=0.0, dQs_nqs_dVds=0.0, dQs_nqs_dVgs=0.0, dQs_nqs_dVbs=0.0, dQs_nqs_dT=0.0, dQs_nqs_dQi_nqs =0.0 ; - double Qg_nqs=0.0, dQg_nqs_dQi_nqs=0.0, dQg_nqs_dQb_nqs =0.0 ; - double tau=0.0, dtau_dVds=0.0, dtau_dVgs=0.0, dtau_dVbs=0.0, dtau_dT =0.0 ; - double taub=0.0, dtaub_dVds=0.0, dtaub_dVgs=0.0, dtaub_dVbs=0.0, dtaub_dT =0.0 ; - double Qdrat=0.0, dQdrat_dVds=0.0, dQdrat_dVgs=0.0, dQdrat_dVbs=0.0, dQdrat_dT =0.0 ; - double Qi=0.0, dQi_dVds=0.0, dQi_dVgs=0.0, dQi_dVbs=0.0, dQi_dT =0.0 ; - double Qbulk=0.0, dQbulk_dVds=0.0, dQbulk_dVgs=0.0, dQbulk_dVbs=0.0, dQbulk_dT =0.0 ; - - /* output related variables */ - double dQi_nqs_dVds=0.0, dQi_nqs_dVgs=0.0, dQi_nqs_dVbs=0.0, - dQb_nqs_dVds=0.0, dQb_nqs_dVgs=0.0, dQb_nqs_dVbs=0.0 ; - double cgdb_nqs=0.0, cggb_nqs=0.0, cgsb_nqs=0.0, - cbdb_nqs=0.0, cbgb_nqs=0.0, cbsb_nqs=0.0, - cddb_nqs=0.0, cdgb_nqs=0.0, cdsb_nqs=0.0 ; - double cgdb=0.0, cggb=0.0, cgsb=0.0, - cbdb=0.0, cbgb=0.0, cbsb=0.0, - cddb=0.0, cdgb=0.0, cdsb=0.0 ; - - /* rows of conductance and capacitance matrix stamp */ - double ydc_d[XDIM], ydc_dP[XDIM], ydc_g[XDIM], ydc_gP[XDIM], ydc_s[XDIM], ydc_sP[XDIM] ; - double ydc_bP[XDIM], ydc_b[XDIM], ydc_db[XDIM], ydc_sb[XDIM], ydc_t[XDIM], ydc_qi[XDIM], ydc_qb[XDIM] ; - double ydyn_d[XDIM], ydyn_dP[XDIM], ydyn_g[XDIM], ydyn_gP[XDIM], ydyn_s[XDIM], ydyn_sP[XDIM] ; - double ydyn_bP[XDIM], ydyn_b[XDIM], ydyn_db[XDIM], ydyn_sb[XDIM], ydyn_t[XDIM], ydyn_qi[XDIM], ydyn_qb[XDIM] ; - - /* limiter, bypass, and convergence */ - int ByPass=0, Check=0, Check1=0, Check2=0, Check3=0 ; - double von=0.0, limval =0.0 ; - double i_dP_hat=0.0, i_gP_hat=0.0, i_sP_hat=0.0, i_db_hat=0.0, i_sb_hat =0.0 ; - -#define LIM_TOL 1.0e0 -#define LIM_TOL2 1.0e0 - - /* predictor and numerical integration stuff */ - double ag0=0.0, xfact=0.0 ; - double ceq=0.0, geq=0.0 ; - int ChargeComputationNeeded = - ((ckt->CKTmode & (MODEAC | MODETRAN | MODEINITSMSIG)) || - ((ckt->CKTmode & MODETRANOP) && (ckt->CKTmode & MODEUIC))) - ? 1 : 0; - int showPhysVal=0 ; - int isConv=0 ; - double vds_pre=0.0 ; - int i=0, noncon_old=0 ; - - - -#define dNode 0 -#define dNodePrime 1 -#define gNode 2 -#define gNodePrime 3 -#define sNode 4 -#define sNodePrime 5 -#define bNodePrime 6 -#define bNode 7 -#define dbNode 8 -#define sbNode 9 -#define subNode 10 -#define tempNode 11 -#define qiNode 12 -#define qbNode 13 -#define lastNode 13 /* must be the last node! */ - - -#define SPICE_rhs 1 /* set to 0 if rhs to be loaded for standard Newton */ - /* set to 1 if rhs_eq to be loaded, e.g. for SPICE */ - - if (SPICE_rhs) { - for (i=0; imodelMKS ;*/ - - for (here = HSMHVinstances(model); here != NULL ; - here = HSMHVnextInstance(here)) { - -/* hereMKS = &here->hereMKS ;*/ - pParam = &here->pParam ; - showPhysVal = 0; - Check=1; - ByPass = 0; - vsubs = 0.0 ; /* substrate bias */ - deltemp = 0.0 ; - noncon_old = ckt->CKTnoncon; - flg_nqs = model->HSMHV_conqs ; - flg_subNode = here->HSMHVsubNode ; /* if flg_subNode > 0, external(/internal) substrate node exists */ - flg_tempNode = here->HSMHVtempNode ; /* if flg_tempNode > 0, external/internal temperature node exists */ - -#ifdef DEBUG_HISIMHVLD_VX - printf("mode = %x\n", ckt->CKTmode); - printf("Vd Vg Vs Vb %e %e %e %e\n", *(ckt->CKTrhsOld+here->HSMHVdNodePrime), - *(ckt->CKTrhsOld+here->HSMHVgNodePrime), - *(ckt->CKTrhsOld+here->HSMHVsNodePrime), - *(ckt->CKTrhsOld+here->HSMHVbNodePrime)); -#endif - - if ( ckt->CKTmode & MODEINITSMSIG ) { - vbs = *(ckt->CKTstate0 + here->HSMHVvbs); - vgs = *(ckt->CKTstate0 + here->HSMHVvgs); - vds = *(ckt->CKTstate0 + here->HSMHVvds); - - vges = *(ckt->CKTstate0 + here->HSMHVvges); - vdbd = *(ckt->CKTstate0 + here->HSMHVvdbd); - vsbs = *(ckt->CKTstate0 + here->HSMHVvsbs); - if (flg_subNode > 0) vsubs = *(ckt->CKTstate0 + here->HSMHVvsubs); - if( flg_tempNode > 0 ){ - deltemp = *(ckt->CKTstate0 + here->HSMHVdeltemp); - } - vdse = *(ckt->CKTstate0 + here->HSMHVvdse) ; - vgse = *(ckt->CKTstate0 + here->HSMHVvgse) ; - vbse = *(ckt->CKTstate0 + here->HSMHVvbse) ; - if ( flg_nqs ) { - Qi_nqs = *(ckt->CKTstate0 + here->HSMHVqi_nqs) ; - Qb_nqs = *(ckt->CKTstate0 + here->HSMHVqb_nqs) ; - } else { - Qi_nqs = 0.0 ; - Qb_nqs = 0.0 ; - } - /* printf("HSMHV_load: (from state0) vds.. = %e %e %e %e %e %e\n", - vds,vgs,vbs,vdse,vgse,vbse); */ - } - else if ( ckt->CKTmode & MODEINITTRAN ) { -/* #include "printf_ld_converged.inc" */ - vbs = *(ckt->CKTstate1 + here->HSMHVvbs); - vgs = *(ckt->CKTstate1 + here->HSMHVvgs); - vds = *(ckt->CKTstate1 + here->HSMHVvds); - - vges = *(ckt->CKTstate1 + here->HSMHVvges); - vdbd = *(ckt->CKTstate1 + here->HSMHVvdbd); - vsbs = *(ckt->CKTstate1 + here->HSMHVvsbs); - if (flg_subNode > 0) vsubs = *(ckt->CKTstate1 + here->HSMHVvsubs); - if( flg_tempNode > 0 ){ - deltemp = *(ckt->CKTstate1 + here->HSMHVdeltemp); - } - vdse = *(ckt->CKTstate1 + here->HSMHVvdse) ; - vgse = *(ckt->CKTstate1 + here->HSMHVvgse) ; - vbse = *(ckt->CKTstate1 + here->HSMHVvbse) ; - if ( flg_nqs ) { - Qi_nqs = *(ckt->CKTstate1 + here->HSMHVqi_nqs) ; - Qb_nqs = *(ckt->CKTstate1 + here->HSMHVqb_nqs) ; - } else { - Qi_nqs = 0.0 ; - Qb_nqs = 0.0 ; - } - } - else if ( (ckt->CKTmode & MODEINITJCT) && !here->HSMHV_off ) { - vds = model->HSMHV_type * here->HSMHV_icVDS; - vgs = vges = model->HSMHV_type * here->HSMHV_icVGS; - vbs = vsbs = model->HSMHV_type * here->HSMHV_icVBS; - vdbd = 0.0 ; - if ( (vds == 0.0) && (vgs == 0.0) && (vbs == 0.0) && - ( (ckt->CKTmode & (MODETRAN|MODEAC|MODEDCOP|MODEDCTRANCURVE)) || - !(ckt->CKTmode & MODEUIC) ) ) { - /* set biases for starting analysis */ - vbs = vdbd = vsbs = 0.0; - vgs = vges = 0.1; - vds = 0.1; - } - if (flg_subNode > 0) vsubs = 0.0; - if( flg_tempNode > 0 ) deltemp=0.0; - vdse = vds ; - vgse = vgs ; - Qi_nqs = Qb_nqs = 0.0 ; - } - else if ( ( ckt->CKTmode & (MODEINITJCT | MODEINITFIX) ) && - here->HSMHV_off ) { - vbs = vgs = vds = 0.0; vges = 0.0; vdbd = vsbs = 0.0; - if (flg_subNode > 0) vsubs = 0.0; - if( flg_tempNode > 0 ) deltemp=0.0; - vdse = vds ; - vgse = vgs ; - Qi_nqs = Qb_nqs = 0.0 ; - } - else { -#ifndef PREDICTOR /* BSIM3 style */ - if (ckt->CKTmode & MODEINITPRED) { -/* #include "printf_ld_converged.inc" */ - /* if (here->HSMHV_mode > 0) { - gds_ext = here->HSMHV_dIds_dVdse ; - } else { - gds_ext = + (here->HSMHV_dIds_dVdse + here->HSMHV_dIds_dVgse + here->HSMHV_dIds_dVbse) ; - } - printf("zzz %e %e\n",ckt->CKTtime,gds_ext) ; */ - xfact = ckt->CKTdelta / ckt->CKTdeltaOld[1]; - *(ckt->CKTstate0 + here->HSMHVvbs) = - *(ckt->CKTstate1 + here->HSMHVvbs); - vbs = (1.0 + xfact)* (*(ckt->CKTstate1 + here->HSMHVvbs)) - -(xfact * (*(ckt->CKTstate2 + here->HSMHVvbs))); - *(ckt->CKTstate0 + here->HSMHVvgs) = - *(ckt->CKTstate1 + here->HSMHVvgs); - vgs = (1.0 + xfact)* (*(ckt->CKTstate1 + here->HSMHVvgs)) - -(xfact * (*(ckt->CKTstate2 + here->HSMHVvgs))); - *(ckt->CKTstate0 + here->HSMHVvds) = - *(ckt->CKTstate1 + here->HSMHVvds); - vds = (1.0 + xfact)* (*(ckt->CKTstate1 + here->HSMHVvds)) - -(xfact * (*(ckt->CKTstate2 + here->HSMHVvds))); - *(ckt->CKTstate0 + here->HSMHVvbd) = - *(ckt->CKTstate0 + here->HSMHVvbs)- - *(ckt->CKTstate0 + here->HSMHVvds); - - *(ckt->CKTstate0 + here->HSMHVvges) = - *(ckt->CKTstate1 + here->HSMHVvges); - vges = (1.0 + xfact)* (*(ckt->CKTstate1 + here->HSMHVvges)) - -(xfact * (*(ckt->CKTstate2 + here->HSMHVvges))); - *(ckt->CKTstate0 + here->HSMHVvdbd) = - *(ckt->CKTstate1 + here->HSMHVvdbd); - vdbd = (1.0 + xfact)* (*(ckt->CKTstate1 + here->HSMHVvdbd)) - - (xfact * (*(ckt->CKTstate2 + here->HSMHVvdbd))); - *(ckt->CKTstate0 + here->HSMHVvdbs) = - *(ckt->CKTstate0 + here->HSMHVvdbd) - + *(ckt->CKTstate0 + here->HSMHVvds); - *(ckt->CKTstate0 + here->HSMHVvsbs) = - *(ckt->CKTstate1 + here->HSMHVvsbs); - vsbs = (1.0 + xfact)* (*(ckt->CKTstate1 + here->HSMHVvsbs)) - - (xfact * (*(ckt->CKTstate2 + here->HSMHVvsbs))); - if (flg_subNode > 0){ - vsubs = (1.0 + xfact)* (*(ckt->CKTstate1 + here->HSMHVvsubs)) - - ( xfact * (*(ckt->CKTstate2 + here->HSMHVvsubs))); - } - if( flg_tempNode > 0 ){ - deltemp = (1.0 + xfact)* (*(ckt->CKTstate1 + here->HSMHVdeltemp)) - - ( xfact * (*(ckt->CKTstate2 + here->HSMHVdeltemp))); - - *(ckt->CKTstate0 + here->HSMHVdeltemp) = - *(ckt->CKTstate1 + here->HSMHVdeltemp); - } - *(ckt->CKTstate0 + here->HSMHVvdse) = - *(ckt->CKTstate1 + here->HSMHVvdse); - vdse = (1.0 + xfact)* (*(ckt->CKTstate1 + here->HSMHVvdse)) - -(xfact * (*(ckt->CKTstate2 + here->HSMHVvdse))); - *(ckt->CKTstate0 + here->HSMHVvgse) = - *(ckt->CKTstate1 + here->HSMHVvgse); - vgse = (1.0 + xfact)* (*(ckt->CKTstate1 + here->HSMHVvgse)) - -(xfact * (*(ckt->CKTstate2 + here->HSMHVvgse))); - *(ckt->CKTstate0 + here->HSMHVvbse) = - *(ckt->CKTstate1 + here->HSMHVvbse); - vbse = (1.0 + xfact)* (*(ckt->CKTstate1 + here->HSMHVvbse)) - -(xfact * (*(ckt->CKTstate2 + here->HSMHVvbse))); - if (flg_nqs) { - *(ckt->CKTstate0 + here->HSMHVqi_nqs) = - *(ckt->CKTstate1 + here->HSMHVqi_nqs); - Qi_nqs = (1.0 + xfact)* (*(ckt->CKTstate1 + here->HSMHVqi_nqs)) - -(xfact * (*(ckt->CKTstate2 + here->HSMHVqi_nqs))); - *(ckt->CKTstate0 + here->HSMHVqb_nqs) = - *(ckt->CKTstate1 + here->HSMHVqb_nqs); - Qb_nqs = (1.0 + xfact)* (*(ckt->CKTstate1 + here->HSMHVqb_nqs)) - -(xfact * (*(ckt->CKTstate2 + here->HSMHVqb_nqs))); - } else { - Qi_nqs = Qb_nqs = 0.0 ; - } - } - else { -#endif /* PREDICTOR */ -/* here->HSMHV_time = ckt->CKTtime; /\* for debug print *\/ */ - /* get biases from CKT */ - vbs = model->HSMHV_type * - (*(ckt->CKTrhsOld+here->HSMHVbNodePrime) - - *(ckt->CKTrhsOld+here->HSMHVsNodePrime)); - vgs = model->HSMHV_type * - (*(ckt->CKTrhsOld+here->HSMHVgNodePrime) - - *(ckt->CKTrhsOld+here->HSMHVsNodePrime)); - vds = model->HSMHV_type * - (*(ckt->CKTrhsOld+here->HSMHVdNodePrime) - - *(ckt->CKTrhsOld+here->HSMHVsNodePrime)); - - vges = model->HSMHV_type * - (*(ckt->CKTrhsOld+here->HSMHVgNode) - - *(ckt->CKTrhsOld+here->HSMHVsNodePrime)); - vdbd = model->HSMHV_type - * (*(ckt->CKTrhsOld + here->HSMHVdbNode) - - *(ckt->CKTrhsOld + here->HSMHVdNode)); - vsbs = model->HSMHV_type - * (*(ckt->CKTrhsOld + here->HSMHVsbNode) - - *(ckt->CKTrhsOld + here->HSMHVsNode)); - if (flg_subNode > 0){ - vsubs = model->HSMHV_type - * (*(ckt->CKTrhsOld + here->HSMHVsubNode) - - *(ckt->CKTrhsOld + here->HSMHVsNode)); - } - if( flg_tempNode > 0 ){ - deltemp = *(ckt->CKTrhsOld + here->HSMHVtempNode); - } - vbse = model->HSMHV_type * - (*(ckt->CKTrhsOld+here->HSMHVbNodePrime) - - *(ckt->CKTrhsOld+here->HSMHVsNode)); - vgse = model->HSMHV_type * - (*(ckt->CKTrhsOld+here->HSMHVgNodePrime) - - *(ckt->CKTrhsOld+here->HSMHVsNode)); - vdse = model->HSMHV_type * - (*(ckt->CKTrhsOld+here->HSMHVdNode) - - *(ckt->CKTrhsOld+here->HSMHVsNode)); - if ( flg_nqs ) { - Qi_nqs = *(ckt->CKTrhsOld + here->HSMHVqiNode); - Qb_nqs = *(ckt->CKTrhsOld + here->HSMHVqbNode); - } else { - Qi_nqs = Qb_nqs = 0.0 ; - } -#ifndef PREDICTOR - } -#endif /* PREDICTOR */ - - /* printf("HSMHV_load: (from rhs ) vds.. = %e %e %e %e %e %e\n", - vds,vgs,vbs,vdse,vgse,vbse); */ - - vbd = vbs - vds; - vgd = vgs - vds; - vged = vges - vds; - vdbs = vdbd + vdse; - vgdo = *(ckt->CKTstate0 + here->HSMHVvgs) - *(ckt->CKTstate0 + here->HSMHVvds); - vgedo = *(ckt->CKTstate0 + here->HSMHVvges) - *(ckt->CKTstate0 + here->HSMHVvds); - - vds_pre = vds; - -#ifndef NOBYPASS - /* start of bypass section - ... no bypass in case of selfheating */ - if ( !(ckt->CKTmode & MODEINITPRED) && ckt->CKTbypass && !model->HSMHV_coselfheat) { - delvds = vds - *(ckt->CKTstate0 + here->HSMHVvds) ; - delvgs = vgs - *(ckt->CKTstate0 + here->HSMHVvgs) ; - delvbs = vbs - *(ckt->CKTstate0 + here->HSMHVvbs) ; - delvdse = vdse - *(ckt->CKTstate0 + here->HSMHVvdse) ; - delvgse = vgse - *(ckt->CKTstate0 + here->HSMHVvgse) ; - delvbse = vbse - *(ckt->CKTstate0 + here->HSMHVvbse) ; - delvdbd = vdbd - *(ckt->CKTstate0 + here->HSMHVvdbd) ; - delvsbs = vsbs - *(ckt->CKTstate0 + here->HSMHVvsbs) ; - if (flg_subNode > 0) delvsubs = vsubs - *(ckt->CKTstate0 + here->HSMHVvsubs) ; /* substrate bias change */ - deldeltemp = deltemp - *(ckt->CKTstate0 + here->HSMHVdeltemp) ; - if (flg_nqs) { - delQi_nqs = Qi_nqs - *(ckt->CKTstate0 + here->HSMHVqi_nqs) ; - delQb_nqs = Qb_nqs - *(ckt->CKTstate0 + here->HSMHVqb_nqs) ; - } else { - delQi_nqs = delQb_nqs = 0.0 ; - } - - /* now let's see if we can bypass */ - /* ... first perform the easy cheap bypass checks ... */ - /* 1 2 3 3 3 4 4 4 5 543 2 1 */ - if ( ( fabs(delvds ) < ckt->CKTreltol * MAX(fabs(vds ),fabs(*(ckt->CKTstate0 + here->HSMHVvds ))) + ckt->CKTvoltTol ) && - ( fabs(delvgs ) < ckt->CKTreltol * MAX(fabs(vgs ),fabs(*(ckt->CKTstate0 + here->HSMHVvgs ))) + ckt->CKTvoltTol ) && - ( fabs(delvbs ) < ckt->CKTreltol * MAX(fabs(vbs ),fabs(*(ckt->CKTstate0 + here->HSMHVvbs ))) + ckt->CKTvoltTol ) && - ( fabs(delvdse) < ckt->CKTreltol * MAX(fabs(vdse),fabs(*(ckt->CKTstate0 + here->HSMHVvdse))) + ckt->CKTvoltTol ) && - ( fabs(delvgse) < ckt->CKTreltol * MAX(fabs(vgse),fabs(*(ckt->CKTstate0 + here->HSMHVvgse))) + ckt->CKTvoltTol ) && - ( fabs(delvbse) < ckt->CKTreltol * MAX(fabs(vbse),fabs(*(ckt->CKTstate0 + here->HSMHVvbse))) + ckt->CKTvoltTol ) && - ( fabs(delvdbd) < ckt->CKTreltol * MAX(fabs(vdbd),fabs(*(ckt->CKTstate0 + here->HSMHVvdbd))) + ckt->CKTvoltTol ) && - ( fabs(delvsbs) < ckt->CKTreltol * MAX(fabs(vsbs),fabs(*(ckt->CKTstate0 + here->HSMHVvsbs))) + ckt->CKTvoltTol ) && - ( fabs(delvsubs) < ckt->CKTreltol * MAX(fabs(vsubs),fabs(*(ckt->CKTstate0 + here->HSMHVvsubs))) + ckt->CKTvoltTol ) && - ( fabs(delQi_nqs) < ckt->CKTreltol * fabs(Qi_nqs) + ckt->CKTchgtol*ckt->CKTabstol + 1.0e-20 ) && - ( fabs(delQb_nqs) < ckt->CKTreltol * fabs(Qb_nqs) + ckt->CKTchgtol*ckt->CKTabstol + 1.0e-20 ) ) - /* 1.0e-20: heuristic value, must be small enough */ - /* to ensure that bypass does not destroy convergence */ - { /* ... the first bypass checks are passed -> now do the more expensive checks ...*/ - if ( here->HSMHV_mode > 0 ) { /* forward mode */ - Ids = here->HSMHV_ids ; - gds = here->HSMHV_dIds_dVdsi ; - gm = here->HSMHV_dIds_dVgsi ; - gmbs = here->HSMHV_dIds_dVbsi ; - gmT = (flg_tempNode > 0) ? here->HSMHV_dIds_dTi : 0.0 ; - gmbs_ext = here->HSMHV_dIds_dVbse; - gds_ext = here->HSMHV_dIds_dVdse ; - gm_ext = here->HSMHV_dIds_dVgse; - Isub = here->HSMHV_isub ; - dIsub_dVds = here->HSMHV_dIsub_dVdsi ; - dIsub_dVgs = here->HSMHV_dIsub_dVgsi ; - dIsub_dVbs = here->HSMHV_dIsub_dVbsi ; - dIsub_dT = (flg_tempNode > 0) ? here->HSMHV_dIsub_dTi : 0.0 ; - dIsub_dVdse = here->HSMHV_dIsub_dVdse ; - Isubs = 0.0 ; - dIsubs_dVds = 0.0 ; - dIsubs_dVgs = 0.0 ; - dIsubs_dVbs = 0.0 ; - dIsubs_dT = 0.0 ; - dIsubs_dVdse = 0.0 ; - Igidl = here->HSMHV_igidl ; - dIgidl_dVds = here->HSMHV_dIgidl_dVdsi ; - dIgidl_dVgs = here->HSMHV_dIgidl_dVgsi ; - dIgidl_dVbs = here->HSMHV_dIgidl_dVbsi ; - dIgidl_dT = (flg_tempNode > 0) ? here->HSMHV_dIgidl_dTi : 0.0 ; - Igisl = here->HSMHV_igisl ; - dIgisl_dVds = here->HSMHV_dIgisl_dVdsi ; - dIgisl_dVgs = here->HSMHV_dIgisl_dVgsi ; - dIgisl_dVbs = here->HSMHV_dIgisl_dVbsi ; - dIgisl_dT = (flg_tempNode > 0) ? here->HSMHV_dIgisl_dTi : 0.0 ; - Igd = here->HSMHV_igd ; - dIgd_dVd = here->HSMHV_dIgd_dVdsi ; - dIgd_dVg = here->HSMHV_dIgd_dVgsi ; - dIgd_dVb = here->HSMHV_dIgd_dVbsi ; - dIgd_dT = (flg_tempNode > 0) ? here->HSMHV_dIgd_dTi : 0.0 ; - Igs = here->HSMHV_igs ; - dIgs_dVd = here->HSMHV_dIgs_dVdsi ; - dIgs_dVg = here->HSMHV_dIgs_dVgsi ; - dIgs_dVb = here->HSMHV_dIgs_dVbsi ; - dIgs_dT = (flg_tempNode > 0) ? here->HSMHV_dIgs_dTi : 0.0 ; - Igb = here->HSMHV_igb ; - dIgb_dVd = here->HSMHV_dIgb_dVdsi ; - dIgb_dVg = here->HSMHV_dIgb_dVgsi ; - dIgb_dVb = here->HSMHV_dIgb_dVbsi ; - dIgb_dT = (flg_tempNode > 0) ? here->HSMHV_dIgb_dTi : 0.0 ; - Ibd = here->HSMHV_ibd ; - Gbd = here->HSMHV_gbd ; - Gbdt = (flg_tempNode > 0) ? here->HSMHV_gbdT : 0.0 ; - Ibs = here->HSMHV_ibs ; - Gbs = here->HSMHV_gbs ; - Gbst = (flg_tempNode > 0) ? here->HSMHV_gbsT : 0.0 ; - } else { /* reverse mode */ - Ids = - here->HSMHV_ids ; - gds = + (here->HSMHV_dIds_dVdsi + here->HSMHV_dIds_dVgsi + here->HSMHV_dIds_dVbsi) ; - gm = - here->HSMHV_dIds_dVgsi ; - gmbs = - here->HSMHV_dIds_dVbsi ; - gmT = (flg_tempNode > 0) ? - here->HSMHV_dIds_dTi : 0.0 ; - gds_ext = + (here->HSMHV_dIds_dVdse + here->HSMHV_dIds_dVgse + here->HSMHV_dIds_dVbse) ; - gm_ext = - here->HSMHV_dIds_dVgse; - gmbs_ext = - here->HSMHV_dIds_dVbse; - Isub = 0.0 ; - dIsub_dVds = 0.0 ; - dIsub_dVgs = 0.0 ; - dIsub_dVbs = 0.0 ; - dIsub_dT = 0.0 ; - dIsub_dVdse = 0.0 ; - Isubs = here->HSMHV_isub ; - dIsubs_dVds = - (here->HSMHV_dIsub_dVdsi + here->HSMHV_dIsub_dVgsi + here->HSMHV_dIsub_dVbsi) ; - dIsubs_dVgs = here->HSMHV_dIsub_dVgsi ; - dIsubs_dVbs = here->HSMHV_dIsub_dVbsi ; - dIsubs_dT = (flg_tempNode > 0) ? here->HSMHV_dIsub_dTi : 0.0 ; - dIsubs_dVdse = - here->HSMHV_dIsub_dVdse ; /* = - (dIsub_dVdse + dIsub_dVbse + dIsub_dVgse) */ - Igidl = here->HSMHV_igisl ; - dIgidl_dVds = - (here->HSMHV_dIgisl_dVdsi + here->HSMHV_dIgisl_dVgsi + here->HSMHV_dIgisl_dVbsi) ; - dIgidl_dVgs = here->HSMHV_dIgisl_dVgsi ; - dIgidl_dVbs = here->HSMHV_dIgisl_dVbsi ; - dIgidl_dT = (flg_tempNode > 0) ? here->HSMHV_dIgisl_dTi : 0.0 ; - Igisl = here->HSMHV_igidl ; - dIgisl_dVds = - (here->HSMHV_dIgidl_dVdsi + here->HSMHV_dIgidl_dVgsi + here->HSMHV_dIgidl_dVbsi) ; - dIgisl_dVgs = here->HSMHV_dIgidl_dVgsi ; - dIgisl_dVbs = here->HSMHV_dIgidl_dVbsi ; - dIgisl_dT = (flg_tempNode > 0) ? here->HSMHV_dIgidl_dTi : 0.0 ; - Igd = here->HSMHV_igd ; - dIgd_dVd = - (here->HSMHV_dIgs_dVdsi + here->HSMHV_dIgs_dVgsi + here->HSMHV_dIgs_dVbsi) ; - dIgd_dVg = here->HSMHV_dIgs_dVgsi ; - dIgd_dVb = here->HSMHV_dIgs_dVbsi ; - dIgd_dT = (flg_tempNode > 0) ? here->HSMHV_dIgs_dTi : 0.0 ; - Igs = here->HSMHV_igs ; - dIgs_dVd = - (here->HSMHV_dIgd_dVdsi + here->HSMHV_dIgd_dVgsi + here->HSMHV_dIgd_dVbsi) ; - dIgs_dVg = here->HSMHV_dIgd_dVgsi ; - dIgs_dVb = here->HSMHV_dIgd_dVbsi ; - dIgs_dT = (flg_tempNode > 0) ? here->HSMHV_dIgd_dTi : 0.0 ; - Igb = here->HSMHV_igb ; - dIgb_dVd = - (here->HSMHV_dIgb_dVdsi + here->HSMHV_dIgb_dVgsi + here->HSMHV_dIgb_dVbsi) ; - dIgb_dVg = here->HSMHV_dIgb_dVgsi ; - dIgb_dVb = here->HSMHV_dIgb_dVbsi ; - dIgb_dT = (flg_tempNode > 0) ? here->HSMHV_dIgb_dTi : 0.0 ; - Ibd = here->HSMHV_ibd ; - Gbd = here->HSMHV_gbd ; - Gbdt = (flg_tempNode > 0) ? here->HSMHV_gbdT : 0.0 ; - Ibs = here->HSMHV_ibs ; - Gbs = here->HSMHV_gbs ; - Gbst = (flg_tempNode > 0) ? here->HSMHV_gbsT : 0.0 ; - } /* end of reverse mode */ - - /* for bypass control, only nonlinear static currents are considered: */ - i_dP = Ids + Isub + Igidl - Igd ; - i_dP_hat = i_dP + gm *delvgs + gds *delvds + gmbs *delvbs + gmT *deldeltemp - + dIsub_dVgs *delvgs + dIsub_dVds *delvds + dIsub_dVbs *delvbs + dIsub_dT *deldeltemp - + dIsub_dVdse*delvdse - + dIgidl_dVgs*delvgs + dIgidl_dVds*delvds + dIgidl_dVbs*delvbs + dIgidl_dT*deldeltemp - -(dIgd_dVg *delvgs + dIgd_dVd *delvds + dIgd_dVb *delvbs + dIgd_dT *deldeltemp) - + gm_ext *delvgse + gds_ext *delvdse + gmbs_ext *delvbse ; - - i_gP = Igd + Igs + Igb ; - i_gP_hat = i_gP + dIgd_dVg *delvgs + dIgd_dVd *delvds + dIgd_dVb *delvbs + dIgd_dT *deldeltemp - + dIgs_dVg *delvgs + dIgs_dVd *delvds + dIgs_dVb *delvbs + dIgs_dT *deldeltemp - + dIgb_dVg *delvgs + dIgb_dVd *delvds + dIgb_dVb *delvbs + dIgb_dT *deldeltemp ; - - i_sP =-Ids + Isubs + Igisl - Igs ; - i_sP_hat = i_sP -(gm *delvgs + gds *delvds + gmbs *delvbs + gmT *deldeltemp) - + dIsubs_dVgs*delvgs + dIsubs_dVds*delvds + dIsubs_dVbs*delvbs + dIsubs_dT*deldeltemp - + dIsubs_dVdse*delvdse - + dIgisl_dVgs*delvgs + dIgisl_dVds*delvds + dIgisl_dVbs*delvbs + dIgisl_dT*deldeltemp - -(dIgs_dVg *delvgs + dIgs_dVd *delvds + dIgs_dVb *delvbs + dIgs_dT *deldeltemp) - -(gm_ext *delvgse + gds_ext *delvdse + gmbs_ext *delvbse) ; - - i_db = Ibd ; - i_db_hat = i_db + Gbd*delvdbd + Gbdt*deldeltemp ; - - i_sb = Ibs ; - i_sb_hat = i_sb + Gbs*delvsbs + Gbst*deldeltemp ; - - /* ... second part of bypass checks: */ - /* 1 2 3 3 3 4 4 4 43 2 1 */ - if ( ( fabs(i_dP_hat - i_dP) < ckt->CKTreltol * MAX(fabs(i_dP_hat),fabs(i_dP)) + ckt->CKTabstol ) && - ( fabs(i_gP_hat - i_gP) < ckt->CKTreltol * MAX(fabs(i_gP_hat),fabs(i_gP)) + ckt->CKTabstol ) && - ( fabs(i_sP_hat - i_sP) < ckt->CKTreltol * MAX(fabs(i_sP_hat),fabs(i_sP)) + ckt->CKTabstol ) && - ( fabs(i_db_hat - i_db) < ckt->CKTreltol * MAX(fabs(i_db_hat),fabs(i_db)) + ckt->CKTabstol ) && - ( fabs(i_sb_hat - i_sb) < ckt->CKTreltol * MAX(fabs(i_sb_hat),fabs(i_sb)) + ckt->CKTabstol ) ) - { - /* bypass code */ - vds = *(ckt->CKTstate0 + here->HSMHVvds ); - vgs = *(ckt->CKTstate0 + here->HSMHVvgs ); - vbs = *(ckt->CKTstate0 + here->HSMHVvbs ); - vdse = *(ckt->CKTstate0 + here->HSMHVvdse); - vgse = *(ckt->CKTstate0 + here->HSMHVvgse); - vbse = *(ckt->CKTstate0 + here->HSMHVvbse); - vdbd = *(ckt->CKTstate0 + here->HSMHVvdbd); - vsbs = *(ckt->CKTstate0 + here->HSMHVvsbs); - vsubs = *(ckt->CKTstate0 + here->HSMHVvsubs); - deltemp = *(ckt->CKTstate0 + here->HSMHVdeltemp); - if ( flg_nqs ) { - Qi_nqs = *(ckt->CKTstate0 + here->HSMHVqi_nqs); - Qb_nqs = *(ckt->CKTstate0 + here->HSMHVqb_nqs); - } - - vges = *(ckt->CKTstate0 + here->HSMHVvges); - - vbd = vbs - vds; - vgd = vgs - vds; - vgb = vgs - vbs; - vged = vges - vds; - - vbs_jct = vsbs; - vbd_jct = vdbd; - - /* linear branch currents */ - vddp = model->HSMHV_type * (*(ckt->CKTrhsOld+here->HSMHVdNode) - *(ckt->CKTrhsOld+here->HSMHVdNodePrime)); - vggp = model->HSMHV_type * (*(ckt->CKTrhsOld+here->HSMHVgNode) - *(ckt->CKTrhsOld+here->HSMHVgNodePrime)); - vssp = model->HSMHV_type * (*(ckt->CKTrhsOld+here->HSMHVsNode) - *(ckt->CKTrhsOld+here->HSMHVsNodePrime)); - vbpb = model->HSMHV_type * (*(ckt->CKTrhsOld+here->HSMHVbNodePrime) - *(ckt->CKTrhsOld+here->HSMHVbNode)); - vbpdb = model->HSMHV_type * (*(ckt->CKTrhsOld+here->HSMHVbNodePrime) - *(ckt->CKTrhsOld+here->HSMHVdbNode)); - vbpsb = model->HSMHV_type * (*(ckt->CKTrhsOld+here->HSMHVbNodePrime) - *(ckt->CKTrhsOld+here->HSMHVsbNode)); - - ByPass = 1; - goto line755; - } - } - } /* end of Bypass section */ -#endif /*NOBYPASS*/ - -#ifdef DEBUG_HISIMHVLD_VX - printf( "vbd_p = %12.5e\n" , vbd ); - printf( "vbs_p = %12.5e\n" , vbs ); - printf( "vgs_p = %12.5e\n" , vgs ); - printf( "vds_p = %12.5e\n" , vds ); -#endif - - /* start limiting of nonlinear branch voltages */ - - von = here->HSMHV_von; - Check3 = 0 ; - if(*(ckt->CKTstate0 + here->HSMHVvds) >= 0.0) { /* case vds>=0 for limiting */ - limval = DEVfetlim(vgs, *(ckt->CKTstate0 + here->HSMHVvgs), von); - if (vgs != limval) { - vgs = limval ; - Check3 = 1 ; - } - if (Check3) vds = vgs - vgd; - limval = DEVlimvds(vds, *(ckt->CKTstate0 + here->HSMHVvds)); - if (vds != limval) { - vds = limval ; - Check3 = 2 ; - } - vgd = vgs - vds; - - if (here->HSMHV_corg == 1) { - limval = DEVfetlim(vges, *(ckt->CKTstate0 + here->HSMHVvges), von); - if (vges != limval) { - vges = limval ; - Check3 = 3 ; - } - vged = vges - vds; - } - - } else { /* case vds < 0 for limiting */ - limval = DEVfetlim(vgd, vgdo, von); - if (vgd != limval) { - vgd = limval ; - Check3 = 4 ; - } - if (Check3) vds = vgs - vgd; - limval = -DEVlimvds(-vds, -(*(ckt->CKTstate0 + here->HSMHVvds))); - if (vds != limval) { - vds = limval ; - Check3 = 5 ; - } - vgs = vgd + vds; - - if (here->HSMHV_corg == 1) { - limval = DEVfetlim(vged, vgedo, von); - if (vged != limval) { - vged = limval ; - Check3 = 6 ; - } - vges = vged + vds; - } - } /* end of case vds< 0 for limiting */ - - if (vds >= 0.0) { /* case vds >=0 for limiting of junctions */ - vbs = DEVpnjlim(vbs, *(ckt->CKTstate0 + here->HSMHVvbs), - CONSTvt0, model->HSMHV_vcrit, &Check1); - if (Check1) Check3 = 7 ; - vbd = vbs - vds; - if (here->HSMHV_corbnet) { - vsbs = DEVpnjlim(vsbs, *(ckt->CKTstate0 + here->HSMHVvsbs), - CONSTvt0, model->HSMHV_vcrit, &Check2); - if (Check2) Check3 = 8 ; - } - } - else { /* case vds < 0 for limiting of junctions */ - vbd = DEVpnjlim(vbd, *(ckt->CKTstate0 + here->HSMHVvbd), - CONSTvt0, model->HSMHV_vcrit, &Check1); - if (Check1) Check3 = 9 ; - vbs = vbd + vds; - if (here->HSMHV_corbnet) { - vdbd = DEVpnjlim(vdbd, *(ckt->CKTstate0 + here->HSMHVvdbd), - CONSTvt0, model->HSMHV_vcrit, &Check2); - if (Check2) { - Check3 = 10 ; - vdbs = vdbd + vdse; - } - } - } - - if( flg_tempNode > 0 ){ - /* Logarithmic damping of deltemp beyond LIM_TOL */ - deltemp_old = *(ckt->CKTstate0 + here->HSMHVdeltemp); - if (deltemp > deltemp_old + LIM_TOL) - {deltemp = deltemp_old + LIM_TOL + log10((deltemp-deltemp_old)/LIM_TOL); - Check3 = 11;} - else if (deltemp < deltemp_old - LIM_TOL) - {deltemp = deltemp_old - LIM_TOL - log10((deltemp_old-deltemp)/LIM_TOL); - Check3 = 12;} - } - - /* if (Check3) printf("HSMHV_load: Check3=%d\n",Check3) ; */ - - /* limiting completed */ - if (Check3 == 0 ) Check = 0 ; - } /* loading and limiting of nonlinear branch voltages is completed */ - - - vbd = vbs - vds; - vgd = vgs - vds; - vgb = vgs - vbs; - vged = vges - vds; - - vbs_jct = vsbs; - vbd_jct = vdbd; - - /* linear branch voltages */ - vddp = model->HSMHV_type * - (*(ckt->CKTrhsOld+here->HSMHVdNode) - - *(ckt->CKTrhsOld+here->HSMHVdNodePrime)); - - vggp = model->HSMHV_type * - (*(ckt->CKTrhsOld+here->HSMHVgNode) - - *(ckt->CKTrhsOld+here->HSMHVgNodePrime)); - - vssp = model->HSMHV_type * - (*(ckt->CKTrhsOld+here->HSMHVsNode) - - *(ckt->CKTrhsOld+here->HSMHVsNodePrime)); - - vbpdb = model->HSMHV_type * - (*(ckt->CKTrhsOld+here->HSMHVbNodePrime) - - *(ckt->CKTrhsOld+here->HSMHVdbNode)); - - vbpb = model->HSMHV_type * - (*(ckt->CKTrhsOld+here->HSMHVbNodePrime) - - *(ckt->CKTrhsOld+here->HSMHVbNode)); - - - vbpsb = model->HSMHV_type * - (*(ckt->CKTrhsOld+here->HSMHVbNodePrime) - - *(ckt->CKTrhsOld+here->HSMHVsbNode)); - - -#ifdef DEBUG_HISIMHVLD_VX - printf( "vbd = %12.5e\n" , vbd ); - printf( "vbs = %12.5e\n" , vbs ); - printf( "vgs = %12.5e\n" , vgs ); - printf( "vds = %12.5e\n" , vds ); -#endif - - /* After loading (and limiting of branch voltages: Start model evaluation */ - - /* printf("HSMHV_load: vds=%e vgs=%e vbs=%e vsd=%e vgd=%e vbd=%e\n", - vds,vgs,vbs,-vds,vgs-vds,vbs-vds); */ - - if (vds >= 0) { /* normal mode */ - here->HSMHV_mode = 1; - ivds = vds; - ivgs = vgs; - ivbs = vbs; - ivdse = vdse; - ivgse = vgse; - ivbse = vbse; - } else { /* reverse mode */ - here->HSMHV_mode = -1; - ivds = -vds; - ivgs = vgd; - ivbs = vbd; - ivdse = -vdse; - ivgse = vgse - vdse; - ivbse = vbse - vdse; - } - - if ( model->HSMHV_info >= 5 ) { /* mode, bias conditions ... */ - printf( "--- variables given to HSMHVevaluate() ----\n" ); - printf( "type = %s\n" , (model->HSMHV_type>0) ? "NMOS" : "PMOS" ); - printf( "mode = %s\n" , (here->HSMHV_mode>0) ? "NORMAL" : "REVERSE" ); - - printf( "vbse vbs = %12.5e %12.5e\n" , vbse, ivbs ); - printf( "vdse vds = %12.5e %12.5e\n" , vdse, ivds ); - printf( "vgse vgs = %12.5e %12.5e\n" , vgse, ivgs ); - } - if ( model->HSMHV_info >= 6 ) { /* input flags */ - printf( "corsrd = %s\n" , (model->HSMHV_corsrd) ? "true" : "false" ) ; - printf( "coadov = %s\n" , (model->HSMHV_coadov) ? "true" : "false" ) ; - printf( "coisub = %s\n" , (model->HSMHV_coisub) ? "true" : "false" ) ; - printf( "coiigs = %s\n" , (model->HSMHV_coiigs) ? "true" : "false" ) ; - printf( "cogidl = %s\n" , (model->HSMHV_cogidl) ? "true" : "false" ) ; - printf( "coovlp = %s\n" , (model->HSMHV_coovlp) ? "true" : "false" ) ; - printf( "coovlps = %s\n" , (model->HSMHV_coovlps) ? "true" : "false" ) ; - printf( "coflick = %s\n", (model->HSMHV_coflick) ? "true" : "false" ) ; - printf( "coisti = %s\n" , (model->HSMHV_coisti) ? "true" : "false" ) ; - printf( "conqs = %s\n" , (model->HSMHV_conqs) ? "true" : "false" ) ; - printf( "cothrml = %s\n", (model->HSMHV_cothrml) ? "true" : "false" ) ; - printf( "coign = %s\n" , (model->HSMHV_coign) ? "true" : "false" ) ; - printf( "cosym = %s\n" , (model->HSMHV_cosym) ? "true" : "false" ) ; - printf( "coselfheat = %s\n" , (model->HSMHV_coselfheat) ? "true" : "false" ) ; - } - /* print inputs ------------AA */ - - #ifdef DEBUG_HISIMHVCGG - /* Print convergence flag */ - printf("isConv %d ", isConv ); - printf("CKTtime %e ", ckt->CKTtime ); - printf("Vb %1.3e ", (model->HSMHV_type>0) ? vbs:-vbs ); - printf("Vd %1.3e ", (model->HSMHV_type>0) ? vds:-vds ); - printf("Vg %1.3e ", (model->HSMHV_type>0) ? vgs:-vgs ); - #endif - - /* call model evaluation */ - if ( HSMHVevaluate(ivdse,ivgse,ivbse,ivds, ivgs, ivbs, vbs_jct, vbd_jct, vsubs, deltemp, here, model, ckt) == HiSIM_ERROR ) - return (HiSIM_ERROR); - - -#ifdef DEBUG_HISIMHVCGG - printf("HSMHV_ids %e ", here->HSMHV_ids ) ; - printf("HSMHV_cggb %e ", here->HSMHV_cggb ) ; - printf("\n") ; -#endif - - here->HSMHV_called += 1; - -#ifndef NOBYPASS -line755: /* standard entry if HSMHVevaluate is bypassed */ -#endif /* (could be shifted a bit forward ...) */ - if ( here->HSMHV_mode > 0 ) { /* forward mode */ - Rd = here->HSMHV_Rd ; - dRd_dVdse = here->HSMHV_dRd_dVdse ; - dRd_dVgse = here->HSMHV_dRd_dVgse ; - dRd_dVbse = here->HSMHV_dRd_dVbse ; - dRd_dVsubs = (flg_subNode > 0) ? here->HSMHV_dRd_dVsubs : 0.0 ; /* derivative w.r.t. Vsubs */ - dRd_dT = (flg_tempNode > 0) ? here->HSMHV_dRd_dTi : 0.0 ; - Rs = here->HSMHV_Rs ; - dRs_dVdse = here->HSMHV_dRs_dVdse ; - dRs_dVgse = here->HSMHV_dRs_dVgse ; - dRs_dVbse = here->HSMHV_dRs_dVbse ; - dRs_dVsubs = (flg_subNode > 0) ? here->HSMHV_dRs_dVsubs : 0.0 ; /* derivative w.r.t. Vsubs */ - dRs_dT = (flg_tempNode > 0) ? here->HSMHV_dRs_dTi : 0.0 ; - Ids = here->HSMHV_ids ; - gds = here->HSMHV_dIds_dVdsi ; - gm = here->HSMHV_dIds_dVgsi ; - gmbs = here->HSMHV_dIds_dVbsi ; - gmT = (flg_tempNode > 0) ? here->HSMHV_dIds_dTi : 0.0 ; - gmbs_ext = here->HSMHV_dIds_dVbse ; - gds_ext = here->HSMHV_dIds_dVdse ; - gm_ext = here->HSMHV_dIds_dVgse ; - - Qd = here->HSMHV_qd ; - dQd_dVds = here->HSMHV_dQdi_dVdsi ; - dQd_dVgs = here->HSMHV_dQdi_dVgsi ; - dQd_dVbs = here->HSMHV_dQdi_dVbsi ; - dQd_dT = (flg_tempNode > 0) ? here->HSMHV_dQdi_dTi : 0.0 ; - Qg = here->HSMHV_qg ; - dQg_dVds = here->HSMHV_dQg_dVdsi ; - dQg_dVgs = here->HSMHV_dQg_dVgsi ; - dQg_dVbs = here->HSMHV_dQg_dVbsi ; - dQg_dT = (flg_tempNode > 0) ? here->HSMHV_dQg_dTi : 0.0 ; - Qs = here->HSMHV_qs ; - dQs_dVds = here->HSMHV_dQsi_dVdsi ; - dQs_dVgs = here->HSMHV_dQsi_dVgsi ; - dQs_dVbs = here->HSMHV_dQsi_dVbsi ; - dQs_dT = (flg_tempNode > 0) ? here->HSMHV_dQsi_dTi : 0.0 ; - Qb = - (here->HSMHV_qg + here->HSMHV_qd + here->HSMHV_qs) ; - dQb_dVds = here->HSMHV_dQb_dVdsi ; - dQb_dVgs = here->HSMHV_dQb_dVgsi ; - dQb_dVbs = here->HSMHV_dQb_dVbsi ; - dQb_dT = (flg_tempNode > 0) ? here->HSMHV_dQb_dTi : 0.0 ; - Qfd = here->HSMHV_qdp ; - dQfd_dVdse = here->HSMHV_dqdp_dVdse ; - dQfd_dVgse = here->HSMHV_dqdp_dVgse ; - dQfd_dVbse = here->HSMHV_dqdp_dVbse ; - dQfd_dT = (flg_tempNode > 0) ? here->HSMHV_dqdp_dTi : 0.0 ; - Qfs = here->HSMHV_qsp ; - dQfs_dVdse = here->HSMHV_dqsp_dVdse ; - dQfs_dVgse = here->HSMHV_dqsp_dVgse ; - dQfs_dVbse = here->HSMHV_dqsp_dVbse ; - dQfs_dT = (flg_tempNode > 0) ? here->HSMHV_dqsp_dTi : 0.0 ; - - Qdext = here->HSMHV_qdext ; - dQdext_dVdse = here->HSMHV_dQdext_dVdse ; - dQdext_dVgse = here->HSMHV_dQdext_dVgse ; - dQdext_dVbse = here->HSMHV_dQdext_dVbse ; - dQdext_dT = (here->HSMHV_coselfheat > 0) ? here->HSMHV_dQdext_dTi : 0.0 ; - Qgext = here->HSMHV_qgext ; - dQgext_dVdse = here->HSMHV_dQgext_dVdse ; - dQgext_dVgse = here->HSMHV_dQgext_dVgse ; - dQgext_dVbse = here->HSMHV_dQgext_dVbse ; - dQgext_dT = (here->HSMHV_coselfheat > 0) ? here->HSMHV_dQgext_dTi : 0.0 ; -/* Qsext = here->HSMHV_qsext ;*/ - dQsext_dVdse = here->HSMHV_dQsext_dVdse ; - dQsext_dVgse = here->HSMHV_dQsext_dVgse ; - dQsext_dVbse = here->HSMHV_dQsext_dVbse ; - dQsext_dT = (here->HSMHV_coselfheat > 0) ? here->HSMHV_dQsext_dTi : 0.0 ; - Qbext = - (here->HSMHV_qgext + here->HSMHV_qdext + here->HSMHV_qsext) ; - dQbext_dVdse = here->HSMHV_dQbext_dVdse ; - dQbext_dVgse = here->HSMHV_dQbext_dVgse ; - dQbext_dVbse = here->HSMHV_dQbext_dVbse ; - dQbext_dT = (here->HSMHV_coselfheat > 0) ? here->HSMHV_dQbext_dTi : 0.0 ; - Isub = here->HSMHV_isub ; - dIsub_dVds = here->HSMHV_dIsub_dVdsi ; - dIsub_dVgs = here->HSMHV_dIsub_dVgsi ; - dIsub_dVbs = here->HSMHV_dIsub_dVbsi ; - dIsub_dT = (flg_tempNode > 0) ? here->HSMHV_dIsub_dTi : 0.0 ; - dIsub_dVdse = here->HSMHV_dIsub_dVdse ; - Isubs = 0.0 ; - dIsubs_dVds = 0.0 ; - dIsubs_dVgs = 0.0 ; - dIsubs_dVbs = 0.0 ; - dIsubs_dT = 0.0 ; - dIsubs_dVdse = 0.0 ; - Igidl = here->HSMHV_igidl ; - dIgidl_dVds = here->HSMHV_dIgidl_dVdsi ; - dIgidl_dVgs = here->HSMHV_dIgidl_dVgsi ; - dIgidl_dVbs = here->HSMHV_dIgidl_dVbsi ; - dIgidl_dT = (flg_tempNode > 0) ? here->HSMHV_dIgidl_dTi : 0.0 ; - Igisl = here->HSMHV_igisl ; - dIgisl_dVds = here->HSMHV_dIgisl_dVdsi ; - dIgisl_dVgs = here->HSMHV_dIgisl_dVgsi ; - dIgisl_dVbs = here->HSMHV_dIgisl_dVbsi ; - dIgisl_dT = (flg_tempNode > 0) ? here->HSMHV_dIgisl_dTi : 0.0 ; - Igd = here->HSMHV_igd ; - dIgd_dVd = here->HSMHV_dIgd_dVdsi ; - dIgd_dVg = here->HSMHV_dIgd_dVgsi ; - dIgd_dVb = here->HSMHV_dIgd_dVbsi ; - dIgd_dT = (flg_tempNode > 0) ? here->HSMHV_dIgd_dTi : 0.0 ; - Igs = here->HSMHV_igs ; - dIgs_dVd = here->HSMHV_dIgs_dVdsi ; - dIgs_dVg = here->HSMHV_dIgs_dVgsi ; - dIgs_dVb = here->HSMHV_dIgs_dVbsi ; - dIgs_dT = (flg_tempNode > 0) ? here->HSMHV_dIgs_dTi : 0.0 ; - Igb = here->HSMHV_igb ; - dIgb_dVd = here->HSMHV_dIgb_dVdsi ; - dIgb_dVg = here->HSMHV_dIgb_dVgsi ; - dIgb_dVb = here->HSMHV_dIgb_dVbsi ; - dIgb_dT = (flg_tempNode > 0) ? here->HSMHV_dIgb_dTi : 0.0 ; - - /*---------------------------------------------------* - * Junction diode. - *-----------------*/ - Ibd = here->HSMHV_ibd ; - Gbd = here->HSMHV_gbd ; - Gbdt = (flg_tempNode > 0) ? here->HSMHV_gbdT : 0.0 ; - - /* Qbd = here->HSMHV_qbd ; */ - Qbd = *(ckt->CKTstate0 + here->HSMHVqbd) ; - Cbd = here->HSMHV_capbd ; - Cbdt = (flg_tempNode > 0) ? here->HSMHV_gcbdT : 0.0 ; - - Ibs = here->HSMHV_ibs ; - Gbs = here->HSMHV_gbs ; - Gbst = (flg_tempNode > 0) ? here->HSMHV_gbsT : 0.0 ; - - /* Qbs = here->HSMHV_qbs ; */ - Qbs = *(ckt->CKTstate0 + here->HSMHVqbs) ; - Cbs = here->HSMHV_capbs ; - Cbst = (flg_tempNode > 0) ? here->HSMHV_gcbsT : 0.0 ; - - if (flg_nqs) { - tau = here->HSMHV_tau ; - dtau_dVds = here->HSMHV_tau_dVdsi ; - dtau_dVgs = here->HSMHV_tau_dVgsi ; - dtau_dVbs = here->HSMHV_tau_dVbsi ; - dtau_dT = here->HSMHV_tau_dTi ; - taub = here->HSMHV_taub ; - dtaub_dVds = here->HSMHV_taub_dVdsi ; - dtaub_dVgs = here->HSMHV_taub_dVgsi ; - dtaub_dVbs = here->HSMHV_taub_dVbsi ; - dtaub_dT = here->HSMHV_taub_dTi ; - Qdrat = here->HSMHV_Xd ; - dQdrat_dVds = here->HSMHV_Xd_dVdsi ; - dQdrat_dVgs = here->HSMHV_Xd_dVgsi ; - dQdrat_dVbs = here->HSMHV_Xd_dVbsi ; - dQdrat_dT = here->HSMHV_Xd_dTi ; - Qi = here->HSMHV_Qi ; - dQi_dVds = here->HSMHV_Qi_dVdsi ; - dQi_dVgs = here->HSMHV_Qi_dVgsi ; - dQi_dVbs = here->HSMHV_Qi_dVbsi ; - dQi_dT = here->HSMHV_Qi_dTi ; - Qbulk = here->HSMHV_Qbulk ; - dQbulk_dVds = here->HSMHV_Qbulk_dVdsi ; - dQbulk_dVgs = here->HSMHV_Qbulk_dVgsi ; - dQbulk_dVbs = here->HSMHV_Qbulk_dVbsi ; - dQbulk_dT = here->HSMHV_Qbulk_dTi ; - } - - } else { /* reverse mode */ - /* note: here->HSMHV_Rd and here->HSMHV_Rs are already subjected to mode handling, - while the following derivatives here->HSMHV_Rd_dVdse, ... are not! */ - Rd = here->HSMHV_Rd ; - dRd_dVdse = here->HSMHV_dRd_dVdse ; - dRd_dVgse = here->HSMHV_dRd_dVgse ; - dRd_dVbse = here->HSMHV_dRd_dVbse ; - dRd_dVsubs= (flg_subNode > 0) ? here->HSMHV_dRd_dVsubs : 0.0 ; /* derivative w.r.t. Vsubs */ - dRd_dT = (flg_tempNode > 0) ? here->HSMHV_dRd_dTi : 0.0 ; - Rs = here->HSMHV_Rs ; - dRs_dVdse = here->HSMHV_dRs_dVdse ; - dRs_dVgse = here->HSMHV_dRs_dVgse ; - dRs_dVbse = here->HSMHV_dRs_dVbse ; - dRs_dVsubs= (flg_subNode > 0) ? here->HSMHV_dRs_dVsubs : 0.0 ; /* derivative w.r.t. Vsubs */ - dRs_dT = (flg_tempNode > 0) ? here->HSMHV_dRs_dTi : 0.0 ; - Ids = - here->HSMHV_ids ; - gds = + (here->HSMHV_dIds_dVdsi + here->HSMHV_dIds_dVgsi + here->HSMHV_dIds_dVbsi) ; - gm = - here->HSMHV_dIds_dVgsi ; - gmbs = - here->HSMHV_dIds_dVbsi ; - gmT = (flg_tempNode > 0) ? - here->HSMHV_dIds_dTi : 0.0 ; - gds_ext = + (here->HSMHV_dIds_dVdse + here->HSMHV_dIds_dVgse + here->HSMHV_dIds_dVbse) ; - gm_ext = - here->HSMHV_dIds_dVgse; - gmbs_ext = - here->HSMHV_dIds_dVbse; - - Qd = here->HSMHV_qs ; - dQd_dVds = - (here->HSMHV_dQsi_dVdsi + here->HSMHV_dQsi_dVgsi + here->HSMHV_dQsi_dVbsi) ; - dQd_dVgs = here->HSMHV_dQsi_dVgsi ; - dQd_dVbs = here->HSMHV_dQsi_dVbsi ; - dQd_dT = (flg_tempNode > 0) ? here->HSMHV_dQsi_dTi : 0.0 ; - Qg = here->HSMHV_qg ; - dQg_dVds = - (here->HSMHV_dQg_dVdsi + here->HSMHV_dQg_dVgsi + here->HSMHV_dQg_dVbsi) ; - dQg_dVgs = here->HSMHV_dQg_dVgsi ; - dQg_dVbs = here->HSMHV_dQg_dVbsi ; - dQg_dT = (flg_tempNode > 0) ? here->HSMHV_dQg_dTi : 0.0 ; - Qs = here->HSMHV_qd ; - dQs_dVds = - (here->HSMHV_dQdi_dVdsi + here->HSMHV_dQdi_dVgsi + here->HSMHV_dQdi_dVbsi) ; - dQs_dVgs = here->HSMHV_dQdi_dVgsi ; - dQs_dVbs = here->HSMHV_dQdi_dVbsi ; - dQs_dT = (flg_tempNode > 0) ? here->HSMHV_dQdi_dTi : 0.0 ; - Qb = - (here->HSMHV_qg + here->HSMHV_qd + here->HSMHV_qs) ; - dQb_dVds = - (here->HSMHV_dQb_dVdsi + here->HSMHV_dQb_dVgsi + here->HSMHV_dQb_dVbsi) ; - dQb_dVgs = here->HSMHV_dQb_dVgsi ; - dQb_dVbs = here->HSMHV_dQb_dVbsi ; - dQb_dT = (flg_tempNode > 0) ? here->HSMHV_dQb_dTi : 0.0 ; - Qfd = here->HSMHV_qsp ; - dQfd_dVdse = - (here->HSMHV_dqsp_dVdse + here->HSMHV_dqsp_dVgse + here->HSMHV_dqsp_dVbse) ; - dQfd_dVgse = here->HSMHV_dqsp_dVgse ; - dQfd_dVbse = here->HSMHV_dqsp_dVbse ; - dQfd_dT = (flg_tempNode > 0) ? here->HSMHV_dqsp_dTi : 0.0 ; - Qfs = here->HSMHV_qdp ; - dQfs_dVdse = - (here->HSMHV_dqdp_dVdse + here->HSMHV_dqdp_dVgse + here->HSMHV_dqdp_dVbse) ; - dQfs_dVgse = here->HSMHV_dqdp_dVgse ; - dQfs_dVbse = here->HSMHV_dqdp_dVbse ; - dQfs_dT = (flg_tempNode > 0) ? here->HSMHV_dqdp_dTi : 0.0 ; - - Qdext = here->HSMHV_qsext ; - dQdext_dVdse = - (here->HSMHV_dQsext_dVdse + here->HSMHV_dQsext_dVgse + here->HSMHV_dQsext_dVbse); - dQdext_dVgse = here->HSMHV_dQsext_dVgse ; - dQdext_dVbse = here->HSMHV_dQsext_dVbse ; - dQdext_dT = (here->HSMHV_coselfheat > 0) ? here->HSMHV_dQsext_dTi : 0.0 ; - Qgext = here->HSMHV_qgext ; - dQgext_dVdse = - (here->HSMHV_dQgext_dVdse + here->HSMHV_dQgext_dVgse + here->HSMHV_dQgext_dVbse); - dQgext_dVgse = here->HSMHV_dQgext_dVgse ; - dQgext_dVbse = here->HSMHV_dQgext_dVbse ; - dQgext_dT = (here->HSMHV_coselfheat > 0) ? here->HSMHV_dQgext_dTi : 0.0 ; -/* Qsext = here->HSMHV_qdext ;*/ - dQsext_dVdse = - (here->HSMHV_dQdext_dVdse + here->HSMHV_dQdext_dVgse + here->HSMHV_dQdext_dVbse); - dQsext_dVgse = here->HSMHV_dQdext_dVgse ; - dQsext_dVbse = here->HSMHV_dQdext_dVbse ; - dQsext_dT = (here->HSMHV_coselfheat > 0) ? here->HSMHV_dQdext_dTi : 0.0 ; - Qbext = - (here->HSMHV_qgext + here->HSMHV_qdext + here->HSMHV_qsext) ; - dQbext_dVdse = - (here->HSMHV_dQbext_dVdse + here->HSMHV_dQbext_dVgse + here->HSMHV_dQbext_dVbse); - dQbext_dVgse = here->HSMHV_dQbext_dVgse ; - dQbext_dVbse = here->HSMHV_dQbext_dVbse ; - dQbext_dT = (here->HSMHV_coselfheat > 0) ? here->HSMHV_dQbext_dTi : 0.0 ; - Isub = 0.0 ; - dIsub_dVds = 0.0 ; - dIsub_dVgs = 0.0 ; - dIsub_dVbs = 0.0 ; - dIsub_dT = 0.0 ; - dIsub_dVdse = 0.0 ; - Isubs = here->HSMHV_isub ; - dIsubs_dVds = - (here->HSMHV_dIsub_dVdsi + here->HSMHV_dIsub_dVgsi + here->HSMHV_dIsub_dVbsi) ; - dIsubs_dVgs = here->HSMHV_dIsub_dVgsi ; - dIsubs_dVbs = here->HSMHV_dIsub_dVbsi ; - dIsubs_dT = (flg_tempNode > 0) ? here->HSMHV_dIsub_dTi : 0.0 ; - dIsubs_dVdse = - here->HSMHV_dIsub_dVdse ; /* = - (dIsub_dVdse + dIsub_dVbse + dIsub_dVgse) */ - Igidl = here->HSMHV_igisl ; - dIgidl_dVds = - (here->HSMHV_dIgisl_dVdsi + here->HSMHV_dIgisl_dVgsi + here->HSMHV_dIgisl_dVbsi) ; - dIgidl_dVgs = here->HSMHV_dIgisl_dVgsi ; - dIgidl_dVbs = here->HSMHV_dIgisl_dVbsi ; - dIgidl_dT = (flg_tempNode > 0) ? here->HSMHV_dIgisl_dTi : 0.0 ; - Igisl = here->HSMHV_igidl ; - dIgisl_dVds = - (here->HSMHV_dIgidl_dVdsi + here->HSMHV_dIgidl_dVgsi + here->HSMHV_dIgidl_dVbsi) ; - dIgisl_dVgs = here->HSMHV_dIgidl_dVgsi ; - dIgisl_dVbs = here->HSMHV_dIgidl_dVbsi ; - dIgisl_dT = (flg_tempNode > 0) ? here->HSMHV_dIgidl_dTi : 0.0 ; - /* note: here->HSMHV_igd and here->HSMHV_igs are already subjected to mode handling, - while the following derivatives here->HSMHV_dIgd_dVdsi, ... are not! */ - Igd = here->HSMHV_igd ; - dIgd_dVd = - (here->HSMHV_dIgs_dVdsi + here->HSMHV_dIgs_dVgsi + here->HSMHV_dIgs_dVbsi) ; - dIgd_dVg = here->HSMHV_dIgs_dVgsi ; - dIgd_dVb = here->HSMHV_dIgs_dVbsi ; - dIgd_dT = (flg_tempNode > 0) ? here->HSMHV_dIgs_dTi : 0.0 ; - Igs = here->HSMHV_igs ; - dIgs_dVd = - (here->HSMHV_dIgd_dVdsi + here->HSMHV_dIgd_dVgsi + here->HSMHV_dIgd_dVbsi) ; - dIgs_dVg = here->HSMHV_dIgd_dVgsi ; - dIgs_dVb = here->HSMHV_dIgd_dVbsi ; - dIgs_dT = (flg_tempNode > 0) ? here->HSMHV_dIgd_dTi : 0.0 ; - Igb = here->HSMHV_igb ; - dIgb_dVd = - (here->HSMHV_dIgb_dVdsi + here->HSMHV_dIgb_dVgsi + here->HSMHV_dIgb_dVbsi) ; - dIgb_dVg = here->HSMHV_dIgb_dVgsi ; - dIgb_dVb = here->HSMHV_dIgb_dVbsi ; - dIgb_dT = (flg_tempNode > 0) ? here->HSMHV_dIgb_dTi : 0.0 ; - - /*---------------------------------------------------* - * Junction diode. - *-----------------*/ - Ibd = here->HSMHV_ibd ; - Gbd = here->HSMHV_gbd ; - Gbdt = (flg_tempNode > 0) ? here->HSMHV_gbdT : 0.0 ; - - /* Qbd = here->HSMHV_qbd ; */ - Qbd = *(ckt->CKTstate0 + here->HSMHVqbd) ; - Cbd = here->HSMHV_capbd ; - Cbdt = (flg_tempNode > 0) ? here->HSMHV_gcbdT : 0.0 ; - - Ibs = here->HSMHV_ibs ; - Gbs = here->HSMHV_gbs ; - Gbst = (flg_tempNode > 0) ? here->HSMHV_gbsT : 0.0 ; - - /* Qbs = here->HSMHV_qbs ; */ - Qbs = *(ckt->CKTstate0 + here->HSMHVqbs) ; - Cbs = here->HSMHV_capbs ; - Cbst = (flg_tempNode > 0) ? here->HSMHV_gcbsT : 0.0 ; - - if (flg_nqs) { - tau = here->HSMHV_tau ; - dtau_dVds = -(here->HSMHV_tau_dVdsi + here->HSMHV_tau_dVgsi + here->HSMHV_tau_dVbsi) ; - dtau_dVgs = here->HSMHV_tau_dVgsi ; - dtau_dVbs = here->HSMHV_tau_dVbsi ; - dtau_dT = here->HSMHV_tau_dTi ; - taub = here->HSMHV_taub ; - dtaub_dVds = -(here->HSMHV_taub_dVdsi + here->HSMHV_taub_dVgsi + here->HSMHV_taub_dVbsi); - dtaub_dVgs = here->HSMHV_taub_dVgsi ; - dtaub_dVbs = here->HSMHV_taub_dVbsi ; - dtaub_dT = here->HSMHV_taub_dTi ; - Qdrat = 1.0 - here->HSMHV_Xd ; - dQdrat_dVds = +(here->HSMHV_Xd_dVdsi + here->HSMHV_Xd_dVgsi + here->HSMHV_Xd_dVbsi) ; - dQdrat_dVgs = - here->HSMHV_Xd_dVgsi ; - dQdrat_dVbs = - here->HSMHV_Xd_dVbsi ; - dQdrat_dT = - here->HSMHV_Xd_dTi ; - Qi = here->HSMHV_Qi ; - dQi_dVds = -(here->HSMHV_Qi_dVdsi + here->HSMHV_Qi_dVgsi + here->HSMHV_Qi_dVbsi) ; - dQi_dVgs = here->HSMHV_Qi_dVgsi ; - dQi_dVbs = here->HSMHV_Qi_dVbsi ; - dQi_dT = here->HSMHV_Qi_dTi ; - Qbulk = here->HSMHV_Qbulk ; - dQbulk_dVds = -(here->HSMHV_Qbulk_dVdsi + here->HSMHV_Qbulk_dVgsi + here->HSMHV_Qbulk_dVbsi) ; - dQbulk_dVgs = here->HSMHV_Qbulk_dVgsi ; - dQbulk_dVbs = here->HSMHV_Qbulk_dVbsi ; - dQbulk_dT = here->HSMHV_Qbulk_dTi ; - } - } /* end of reverse mode */ - - if (flg_tempNode > 0) { - if (pParam->HSMHV_rth > C_RTH_MIN) { - Gth = 1.0/pParam->HSMHV_rth ; - } else { - Gth = 1.0/C_RTH_MIN ; - } - Ith = Gth * deltemp ; - dIth_dT = Gth ; - Cth = pParam->HSMHV_cth ; - Qth = Cth * deltemp ; - /* P = Ids * (Vdsi + param * ( Vdse - Vdsi)) */ - /* = Ids * Veffpower */ - if ( vds * (vdse - vds) >= 0.0) { - if ( pParam->HSMHV_powrat == 1.0 ) { - Veffpower = vdse ; - dVeffpower_dVds = 0.0 ; - dVeffpower_dVdse = 1.0 ; - } else { - Veffpower = vds + here->HSMHV_powratio * (vdse - vds) ; - dVeffpower_dVds = (1.0 - here->HSMHV_powratio) ; - dVeffpower_dVdse = here->HSMHV_powratio ; - } - - - - - } else { - Veffpower = vds ; - dVeffpower_dVds = 1.0 ; - dVeffpower_dVdse = 0.0 ; - } - P = Ids * Veffpower ; - dP_dVds = gds * Veffpower + Ids * dVeffpower_dVds; - dP_dVgs = gm * Veffpower ; - dP_dVbs = gmbs * Veffpower ; - dP_dT = gmT * Veffpower ; - dP_dVdse = gds_ext * Veffpower + Ids * dVeffpower_dVdse ; - dP_dVgse = gm_ext * Veffpower ; - dP_dVbse = gmbs_ext * Veffpower ; - - /* Clamping the maximum rise tempaerarure (SHEMAX) */ - T1 = model->HSMHV_shemax * Gth ; - Fn_SU( T2 , P , T1 , SHE_MAX_dlt * Gth , T0 ) ; - P = T2 ; - dP_dVds = T0 * dP_dVds ; - dP_dVgs = T0 * dP_dVgs ; - dP_dVbs = T0 * dP_dVbs ; - dP_dT = T0 * dP_dT ; - dP_dVdse = T0 * dP_dVdse ; - dP_dVgse = T0 * dP_dVgse ; - dP_dVbse = T0 * dP_dVbse ; - - } else { - Gth = 0.0 ; - Ith = 0.0 ; - dIth_dT = 0.0 ; - Cth = 0.0 ; - Qth = 0.0 ; - P = 0.0 ; - dP_dVds = 0.0 ; - dP_dVgs = 0.0 ; - dP_dVbs = 0.0 ; - dP_dT = 0.0 ; - dP_dVdse = 0.0 ; - dP_dVgse = 0.0 ; - dP_dVbse = 0.0 ; - } - - /* in case of nqs: construct static contributions to the nqs equations (Iqi_nqs, Iqb_nqs) */ - /* and nqs charge contributions to inner drain, gate and source node (Qd_nqs, Qg_nqs, Qs_nqs) */ - - if (flg_nqs) { - /* .. tau, taub must be > 0 */ - if (tau < 1.0e-18) { - tau = 1.e-18 ; - dtau_dVds = dtau_dVgs = dtau_dVbs = dtau_dT = 0.0 ; - } - if (taub < 1.0e-18) { - taub = 1.0e-18 ; - dtaub_dVds = dtaub_dVgs = dtaub_dVbs = dtaub_dT = 0.0 ; - } - - Iqi_nqs = (Qi_nqs - Qi) / tau ; - dIqi_nqs_dVds = - (dQi_dVds + Iqi_nqs * dtau_dVds) / tau ; - dIqi_nqs_dVgs = - (dQi_dVgs + Iqi_nqs * dtau_dVgs) / tau ; - dIqi_nqs_dVbs = - (dQi_dVbs + Iqi_nqs * dtau_dVbs) / tau ; - dIqi_nqs_dT = - (dQi_dT + Iqi_nqs * dtau_dT ) / tau ; - dIqi_nqs_dQi_nqs = 1.0 / tau ; - - Iqb_nqs = (Qb_nqs - Qbulk) / taub ; - dIqb_nqs_dVds = - (dQbulk_dVds + Iqb_nqs * dtaub_dVds) / taub ; - dIqb_nqs_dVgs = - (dQbulk_dVgs + Iqb_nqs * dtaub_dVgs) / taub ; - dIqb_nqs_dVbs = - (dQbulk_dVbs + Iqb_nqs * dtaub_dVbs) / taub ; - dIqb_nqs_dT = - (dQbulk_dT + Iqb_nqs * dtaub_dT ) / taub ; - dIqb_nqs_dQb_nqs = 1.0 / taub ; - - Qd_nqs = Qi_nqs * Qdrat ; - dQd_nqs_dVds = Qi_nqs * dQdrat_dVds ; - dQd_nqs_dVgs = Qi_nqs * dQdrat_dVgs ; - dQd_nqs_dVbs = Qi_nqs * dQdrat_dVbs ; - dQd_nqs_dT = Qi_nqs * dQdrat_dT ; - dQd_nqs_dQi_nqs = Qdrat ; - - Qg_nqs = - Qi_nqs - Qb_nqs ; - dQg_nqs_dQi_nqs = - 1.0 ; - dQg_nqs_dQb_nqs = - 1.0 ; - - Qs_nqs = Qi_nqs * (1.0 - Qdrat) ; - dQs_nqs_dVds = - Qi_nqs * dQdrat_dVds ; - dQs_nqs_dVgs = - Qi_nqs * dQdrat_dVgs ; - dQs_nqs_dVbs = - Qi_nqs * dQdrat_dVbs ; - dQs_nqs_dT = - Qi_nqs * dQdrat_dT ; - dQs_nqs_dQi_nqs = 1.0 - Qdrat ; - } else { - Iqi_nqs = Iqb_nqs = Qd_nqs = Qg_nqs = Qs_nqs = 0.0 ; - } - - dIgd_dVs = - (dIgd_dVd + dIgd_dVg + dIgd_dVb) ; - dIgs_dVs = - (dIgs_dVd + dIgs_dVg + dIgs_dVb) ; - dIgb_dVs = - (dIgb_dVd + dIgb_dVg + dIgb_dVb) ; - - /*---------------------------------------------------* - * External Resistances - *-----------------*/ - if(model->HSMHV_corsrd == 1 || model->HSMHV_corsrd == 3 ) { - if(Rd > 0){ - GD = 1.0/Rd; - GD_dVgs = - dRd_dVgse /Rd/Rd; - GD_dVds = - dRd_dVdse /Rd/Rd; - GD_dVbs = - dRd_dVbse /Rd/Rd; - GD_dVsubs = - dRd_dVsubs /Rd/Rd; - GD_dT = - dRd_dT /Rd/Rd; - }else{ - GD=0.0; - GD_dVgs=0.0; - GD_dVds=0.0; - GD_dVbs=0.0; - GD_dVsubs=0.0; - GD_dT =0.0; - } - if(Rs > 0){ - GS = 1.0/Rs; - GS_dVgs = - dRs_dVgse /Rs/Rs; - GS_dVds = - dRs_dVdse /Rs/Rs; - GS_dVbs = - dRs_dVbse /Rs/Rs; - GS_dVsubs = - dRs_dVsubs /Rs/Rs; - GS_dT = - dRs_dT /Rs/Rs; - }else{ - GS=0.0; - GS_dVgs=0.0; - GS_dVds=0.0; - GS_dVbs=0.0; - GS_dVsubs=0.0; - GS_dT =0.0; - } - } - Iddp = GD * vddp; - dIddp_dVddp = GD; - dIddp_dVdse = GD_dVds * vddp; - dIddp_dVgse = GD_dVgs * vddp; - dIddp_dVbse = GD_dVbs * vddp; - dIddp_dVsubs= GD_dVsubs * vddp; - dIddp_dT = GD_dT * vddp; - - Issp = GS * vssp; - dIssp_dVssp = GS; - dIssp_dVdse = GS_dVds * vssp ; - dIssp_dVgse = GS_dVgs * vssp; - dIssp_dVbse = GS_dVbs * vssp; - dIssp_dVsubs= GS_dVsubs * vssp; - dIssp_dT = GS_dT * vssp; - - if( model->HSMHV_corg > 0.0 ){ - GG = here->HSMHV_grg ; - }else{ - GG = 0.0 ; - } - Iggp = GG * vggp; - dIggp_dVggp = GG; - - if(model->HSMHV_corbnet == 1 && here->HSMHV_rbpb > 0.0 ){ - GRBPB = here->HSMHV_grbpb ; - }else{ - GRBPB = 0.0 ; - } - Ibpb = GRBPB * vbpb; - dIbpb_dVbpb = GRBPB; - - if(model->HSMHV_corbnet == 1 && here->HSMHV_rbpd > 0.0 ){ - GRBPD = here->HSMHV_grbpd ; - }else{ - GRBPD = 0.0 ; - } - Ibpdb = GRBPD * vbpdb; - dIbpdb_dVbpdb = GRBPD; - - if(model->HSMHV_corbnet == 1 && here->HSMHV_rbps > 0.0 ){ - GRBPS = here->HSMHV_grbps ; - }else{ - GRBPS = 0.0 ; - } - Ibpsb = GRBPS * vbpsb; - dIbpsb_dVbpsb = GRBPS; - - /* printf("HSMHV_load: ByPass=%d\n",ByPass) ; */ - - if (!ByPass) { /* no convergence check in case of Bypass */ - /* - * check convergence - */ - isConv = 1; - if ( (here->HSMHV_off == 0) || !(ckt->CKTmode & MODEINITFIX) ) { - if (Check == 1) { - ckt->CKTnoncon++; - isConv = 0; -#ifndef NEWCONV - } else { - /* convergence check for branch currents is done in function HSMHVconvTest */ -#endif /* NEWCONV */ - } - } - - *(ckt->CKTstate0 + here->HSMHVvbs) = vbs; - *(ckt->CKTstate0 + here->HSMHVvbd) = vbd; - *(ckt->CKTstate0 + here->HSMHVvgs) = vgs; - *(ckt->CKTstate0 + here->HSMHVvds) = vds; - *(ckt->CKTstate0 + here->HSMHVvsbs) = vsbs; - *(ckt->CKTstate0 + here->HSMHVvdbs) = vdbs; - *(ckt->CKTstate0 + here->HSMHVvdbd) = vdbd; - *(ckt->CKTstate0 + here->HSMHVvges) = vges; - *(ckt->CKTstate0 + here->HSMHVvsubs) = vsubs; - *(ckt->CKTstate0 + here->HSMHVdeltemp) = deltemp; - *(ckt->CKTstate0 + here->HSMHVvdse) = vdse; - *(ckt->CKTstate0 + here->HSMHVvgse) = vgse; - *(ckt->CKTstate0 + here->HSMHVvbse) = vbse; - if ( flg_nqs ) { - *(ckt->CKTstate0 + here->HSMHVqi_nqs) = Qi_nqs; - *(ckt->CKTstate0 + here->HSMHVqb_nqs) = Qb_nqs; - } - /* printf("HSMHV_load: (into state0) vds.. = %e %e %e %e %e %e\n", - vds,vgs,vbs,vdse,vgse,vbse); */ - - if ((ckt->CKTmode & MODEDC) && - !(ckt->CKTmode & MODEINITFIX) && !(ckt->CKTmode & MODEINITJCT)) - showPhysVal = 1; - if (model->HSMHV_show_Given && showPhysVal && isConv) { - static int isFirst = 1; - if (vds != vds_pre) - ShowPhysVals(here, model, isFirst, vds_pre, vgs, vbs, vgd, vbd, vgb); - else - ShowPhysVals(here, model, isFirst, vds, vgs, vbs, vgd, vbd, vgb); - if (isFirst) isFirst = 0; - } - } - -#include "hsmhvld_info_eval.h" - - /* For standard Newton method (SPICE_rhs == 0): */ - /* if currents (and charges) are limited -> extrapolate onto x-values */ - /* in SPICE mode (SPICE_rhs == 1): */ - /* extrapolate onto x = 0 (-> rhs_eq) */ - /* */ - /* note that */ - /* the charge extrapolation is replaced by extrapolation of displacement */ - /* currents, see below */ - - /* ...... just for easier handling: collect node voltages in vector x: */ - if (!SPICE_rhs) { - x[dNode] = model->HSMHV_type *( *(ckt->CKTrhsOld+here->HSMHVdNode)); - x[dNodePrime] = model->HSMHV_type *( *(ckt->CKTrhsOld+here->HSMHVdNodePrime)); - x[gNode] = model->HSMHV_type *( *(ckt->CKTrhsOld+here->HSMHVgNode)); - x[gNodePrime] = model->HSMHV_type *( *(ckt->CKTrhsOld+here->HSMHVgNodePrime)); - x[sNode] = model->HSMHV_type *( *(ckt->CKTrhsOld+here->HSMHVsNode)); - x[sNodePrime] = model->HSMHV_type *( *(ckt->CKTrhsOld+here->HSMHVsNodePrime)); - x[bNodePrime] = model->HSMHV_type *( *(ckt->CKTrhsOld+here->HSMHVbNodePrime)); - x[bNode] = model->HSMHV_type *( *(ckt->CKTrhsOld+here->HSMHVbNode)); - x[dbNode] = model->HSMHV_type *( *(ckt->CKTrhsOld+here->HSMHVdbNode)); - x[sbNode] = model->HSMHV_type *( *(ckt->CKTrhsOld+here->HSMHVsbNode)); - if (flg_subNode > 0) - x[subNode] = model->HSMHV_type *( *(ckt->CKTrhsOld+here->HSMHVsubNode)); /* previous vsub */ - else - x[subNode] = 0.0; - if (flg_tempNode > 0) - x[tempNode] = *(ckt->CKTrhsOld+here->HSMHVtempNode); - else - x[tempNode] = 0.0; - if ( flg_nqs ) { - x[qiNode] = *(ckt->CKTrhsOld+here->HSMHVqiNode); - x[qbNode] = *(ckt->CKTrhsOld+here->HSMHVqbNode); - } else { - x[qiNode] = 0.0; - x[qbNode] = 0.0; - } - } - - delvgs = (x[gNodePrime] - x[sNodePrime]) - vgs; - delvds = (x[dNodePrime] - x[sNodePrime]) - vds; - delvbs = (x[bNodePrime] - x[sNodePrime]) - vbs; - deldeltemp = x[tempNode] - deltemp; - - if (delvgs || delvds || delvbs ||deldeltemp) { - Ids += gm *delvgs + gds *delvds + gmbs *delvbs + gmT *deldeltemp ; - Isub += dIsub_dVgs *delvgs + dIsub_dVds *delvds + dIsub_dVbs *delvbs + dIsub_dT *deldeltemp ; - Isubs+= dIsubs_dVgs*delvgs + dIsubs_dVds*delvds + dIsubs_dVbs*delvbs + dIsubs_dT*deldeltemp ; - Igd += dIgd_dVg *delvgs + dIgd_dVd *delvds + dIgd_dVb *delvbs + dIgd_dT *deldeltemp ; - Igs += dIgs_dVg *delvgs + dIgs_dVd *delvds + dIgs_dVb *delvbs + dIgs_dT *deldeltemp ; - Igb += dIgb_dVg *delvgs + dIgb_dVd *delvds + dIgb_dVb *delvbs + dIgb_dT *deldeltemp ; - Igidl+= dIgidl_dVgs*delvgs + dIgidl_dVds*delvds + dIgidl_dVbs*delvbs + dIgidl_dT*deldeltemp ; - Igisl+= dIgisl_dVgs*delvgs + dIgisl_dVds*delvds + dIgisl_dVbs*delvbs + dIgisl_dT*deldeltemp ; - P += dP_dVgs *delvgs + dP_dVds *delvds + dP_dVbs *delvbs + dP_dT *deldeltemp ; - if (flg_nqs) { - Iqi_nqs += dIqi_nqs_dVgs*delvgs + dIqi_nqs_dVds*delvds + dIqi_nqs_dVbs*delvbs + dIqi_nqs_dT*deldeltemp ; - Iqb_nqs += dIqb_nqs_dVgs*delvgs + dIqb_nqs_dVds*delvds + dIqb_nqs_dVbs*delvbs + dIqb_nqs_dT*deldeltemp ; - } - } - - delvgse = (x[gNodePrime] - x[sNode]) - vgse; - delvdse = (x[dNode] - x[sNode]) - vdse; - delvbse = (x[bNodePrime] - x[sNode]) - vbse; - if (flg_subNode > 0) delvsubs = (x[subNode] - x[sNode]) - vsubs; /* substrate bias change */ - - if (delvgse || delvdse || delvbse ) { - Ids += gm_ext *delvgse + gds_ext *delvdse + gmbs_ext *delvbse ; - Isub += dIsub_dVdse*delvdse ; - Isubs+= dIsubs_dVdse*delvdse ; - P += dP_dVgse *delvgse + dP_dVdse *delvdse + dP_dVbse *delvbse ; - Iddp += dIddp_dVgse*delvgse + dIddp_dVdse*delvdse + dIddp_dVbse*delvbse ; - Issp += dIssp_dVgse*delvgse + dIssp_dVdse*delvdse + dIssp_dVbse*delvbse ; - } - - if (delvsubs) { - Iddp += dIddp_dVsubs*delvsubs ; - Issp += dIssp_dVsubs*delvsubs ; - } - - if (deldeltemp) { - Iddp += dIddp_dT*deldeltemp ; - Issp += dIssp_dT*deldeltemp ; - Ith += dIth_dT *deldeltemp ; - } - - delvdbd = (x[dbNode] - x[dNode]) - vbd_jct ; - if (delvdbd || deldeltemp) { - Ibd += Gbd*delvdbd + Gbdt*deldeltemp ; - } - - delvsbs = (x[sbNode] - x[sNode]) - vbs_jct ; - if (delvsbs || deldeltemp) { - Ibs += Gbs*delvsbs + Gbst*deldeltemp ; - } - - delvddp = (x[dNode] - x[dNodePrime]) - vddp ; - if (delvddp) { - Iddp += dIddp_dVddp * delvddp ; - } - - delvssp = (x[sNode] - x[sNodePrime]) - vssp ; - if (delvssp) { - Issp += dIssp_dVssp * delvssp ; - } - - delvggp = (x[gNode] - x[gNodePrime]) - vggp ; - if (delvggp) { - Iggp += dIggp_dVggp * delvggp ; - } - - delvbpb = (x[bNodePrime] - x[bNode]) - vbpb ; - if (delvbpb) { - Ibpb += dIbpb_dVbpb * delvbpb ; - } - - delvbpdb = (x[bNodePrime] - x[dbNode]) - vbpdb ; - if (delvbpdb) { - Ibpdb += dIbpdb_dVbpdb * delvbpdb ; - } - - delvbpsb = (x[bNodePrime] - x[sbNode]) - vbpsb ; - if (delvbpsb) { - Ibpsb += dIbpsb_dVbpsb * delvbpsb ; - } - - if (flg_nqs) { - delQi_nqs = x[qiNode] - Qi_nqs ; - if (delQi_nqs) { - Iqi_nqs += dIqi_nqs_dQi_nqs * delQi_nqs ; - } - delQb_nqs = x[qbNode] - Qb_nqs ; - if (delQb_nqs) { - Iqb_nqs += dIqb_nqs_dQb_nqs * delQb_nqs ; - } - } - - - /* Assemble currents into nodes */ - /* ... static part */ - - - /* drain node */ - i_d = Iddp - Ibd ; - /* intrinsic drain node */ - i_dP = -Iddp + Ids + Isub + Igidl - Igd ; - /* gate node */ - i_g = Iggp ; - /* intrinsic gate node */ - i_gP = - Iggp + Igd + Igs + Igb ; - /* source node */ - i_s = Issp - Ibs ; - /* intrinsic source node */ - i_sP = - Issp - Ids + Isubs + Igisl - Igs ; - /* intrinsic bulk node */ - i_bP = - Isub - Isubs - Igidl -Igb - Igisl + Ibpdb + Ibpb + Ibpsb ; - /* base node */ - i_b = - Ibpb ; - /* drain bulk node */ - i_db = Ibd - Ibpdb ; - /* source bulk node */ - i_sb = Ibs - Ibpsb ; - /* temp node */ - if (flg_tempNode > 0){ - i_t = Ith - P ; - } else { - i_t = 0.0; - } - /* nqs equations */ - i_qi = Iqi_nqs ; - i_qb = Iqb_nqs ; - - for (i = 0; i < XDIM; i++) { - ydc_d[i] = ydc_dP[i] = ydc_g[i] = ydc_gP[i] = ydc_s[i] = ydc_sP[i] = ydc_bP[i] = ydc_b[i] - = ydc_db[i] = ydc_sb[i] = ydc_t[i] = 0.0; - } - if (flg_nqs) { - for (i = 0; i < XDIM; i++) { - ydc_qi[i] = ydc_qb[i] = 0.0; - } - } - - /* drain node */ - ydc_d[dNode] = dIddp_dVddp + dIddp_dVdse + Gbd ; - ydc_d[dNodePrime] = -dIddp_dVddp ; - /* ydc_d[gNode] = 0.0 ; */ - ydc_d[gNodePrime] = dIddp_dVgse ; - ydc_d[sNode] = - ( dIddp_dVdse + dIddp_dVgse + dIddp_dVbse ) - dIddp_dVsubs ; - /* ydc_d[sNodePrime] = 0.0 ; */ - ydc_d[bNodePrime] = dIddp_dVbse ; - /* ydc_d[bNode] = 0.0 ; */ - ydc_d[dbNode] = - Gbd ; - /* ydc_d[sbNode] = 0.0 ; */ - ydc_d[subNode] = dIddp_dVsubs ; - ydc_d[tempNode] = dIddp_dT - Gbdt ; - - /* intrinsic drain node */ - ydc_dP[dNode] = - (dIddp_dVddp + dIddp_dVdse) + gds_ext + dIsub_dVdse ; - ydc_dP[dNodePrime] = dIddp_dVddp + gds + dIsub_dVds + dIgidl_dVds - dIgd_dVd ; - /* ydc_dP[gNode] = 0.0; */ - ydc_dP[gNodePrime] = -dIddp_dVgse + gm_ext - + gm + dIsub_dVgs + dIgidl_dVgs - dIgd_dVg ; - ydc_dP[sNode] = dIddp_dVdse + dIddp_dVgse + dIddp_dVbse + dIddp_dVsubs + (-gds_ext -gm_ext -gmbs_ext) - dIsub_dVdse; - ydc_dP[sNodePrime] = -( gds + dIsub_dVds + dIgidl_dVds ) - - ( gm + dIsub_dVgs + dIgidl_dVgs ) - - ( gmbs + dIsub_dVbs + dIgidl_dVbs ) - dIgd_dVs ; - ydc_dP[bNodePrime] = - dIddp_dVbse + gmbs_ext - + gmbs + dIsub_dVbs + dIgidl_dVbs - dIgd_dVb; - /* ydc_dP[bNode] = 0.0; */ - /* ydc_dP[dbNode] = 0.0 ; */ - /* ydc_dP[sbNode] = 0.0 ; */ - ydc_dP[subNode] = - dIddp_dVsubs ; - ydc_dP[tempNode] = - dIddp_dT - + gmT + dIsub_dT + dIgidl_dT - dIgd_dT ; - - /* gate node */ - /* ydc_g[dNode] = 0.0 ; */ - /* ydc_g[dNodePrime] = 0.0 ; */ - ydc_g[gNode] = dIggp_dVggp ; - ydc_g[gNodePrime] = - dIggp_dVggp ; - /* ydc_g[sNode] = 0.0 ; */ - /* ydc_g[sNodePrime] = 0.0 ; */ - /* ydc_g[bNodePrime] = 0.0 ; */ - /* ydc_g[bNode] = 0.0 ; */ - /* ydc_g[dbNode] = 0.0 ; */ - /* ydc_g[sbNode] = 0.0 ; */ - /* ydc_g[tempNode] = 0.0 ; */ - - /* intrinsic gate node */ - /* ydc_gP[dNode] = 0.0 ; */ - ydc_gP[dNodePrime] = dIgd_dVd + dIgs_dVd + dIgb_dVd ; - ydc_gP[gNode] = - dIggp_dVggp ; - ydc_gP[gNodePrime] = dIggp_dVggp + dIgd_dVg + dIgs_dVg + dIgb_dVg ; - /* ydc_gP[sNode] = 0.0 ; */ - ydc_gP[sNodePrime] = dIgd_dVs + dIgs_dVs + dIgb_dVs ; - ydc_gP[bNodePrime] = dIgd_dVb + dIgs_dVb + dIgb_dVb ; - /* ydc_gP[bNode] = 0.0 ; */ - /* ydc_gP[dbNode] = 0.0 ; */ - /* ydc_gP[sbNode] = 0.0 ; */ - ydc_gP[tempNode] = dIgd_dT + dIgs_dT + dIgb_dT ; - - /* source node */ - ydc_s[dNode] = dIssp_dVdse; - /* ydc_s[dNodePrime] = 0.0 */ - /* ydc_s[gNode] = 0.0 */ - ydc_s[gNodePrime] = dIssp_dVgse; - ydc_s[sNode] = dIssp_dVssp - ( dIssp_dVgse + dIssp_dVdse + dIssp_dVbse ) - dIssp_dVsubs + Gbs; - ydc_s[sNodePrime] = - dIssp_dVssp; - ydc_s[bNodePrime] = dIssp_dVbse ; - /* ydc_s[bNode] = 0.0 */ - /* ydc_s[dbNode] = 0.0 */ - ydc_s[sbNode] = - Gbs ; - ydc_s[subNode] = dIssp_dVsubs; - ydc_s[tempNode] = dIssp_dT - Gbst; - - /* intrinsic source node */ - ydc_sP[dNode] = - dIssp_dVdse -gds_ext + dIsubs_dVdse ; - ydc_sP[dNodePrime] = - gds + dIsubs_dVds + dIgisl_dVds - dIgs_dVd ; - /* ydc_sP[gNode] = 0.0 ; */ - ydc_sP[gNodePrime] = -dIssp_dVgse -gm_ext - - gm + dIsubs_dVgs + dIgisl_dVgs - dIgs_dVg ; - ydc_sP[sNode] = - dIssp_dVssp - ( - dIssp_dVdse - dIssp_dVgse - dIssp_dVbse ) + dIssp_dVsubs +(gds_ext + gm_ext + gmbs_ext) - dIsubs_dVdse; - ydc_sP[sNodePrime] = dIssp_dVssp - ( - gds + dIsubs_dVds + dIgisl_dVds ) - - ( - gm + dIsubs_dVgs + dIgisl_dVgs ) - - ( - gmbs + dIsubs_dVbs + dIgisl_dVbs ) - dIgs_dVs ; - ydc_sP[bNodePrime] = -dIssp_dVbse -gmbs_ext - - gmbs + dIsubs_dVbs + dIgisl_dVbs - dIgs_dVb ; - /* ydc_sP[bNode] = 0.0 ; */ - /* ydc_sP[dbNode] = 0.0 ; */ - /* ydc_sP[sbNode] = 0.0 ; */ - ydc_sP[subNode] = - dIssp_dVsubs; - ydc_sP[tempNode] = -dIssp_dT - - gmT + dIsubs_dT + dIgisl_dT - dIgs_dT; - - /* intrinsic bulk node */ - ydc_bP[dNode] = - dIsub_dVdse - dIsubs_dVdse ; - ydc_bP[dNodePrime] = - dIsub_dVds - dIsubs_dVds - dIgidl_dVds - dIgb_dVd - dIgisl_dVds ; - /* ydc_bP[gNode] = 0.0 ; */ - ydc_bP[gNodePrime] = - dIsub_dVgs - dIsubs_dVgs - dIgidl_dVgs - dIgb_dVg - dIgisl_dVgs ; - ydc_bP[sNode] = dIsub_dVdse + dIsubs_dVdse; - ydc_bP[sNodePrime] = - ( - dIsub_dVds - dIsubs_dVds - dIgidl_dVds - dIgisl_dVds ) - - ( - dIsub_dVgs - dIsubs_dVgs - dIgidl_dVgs - dIgisl_dVgs ) - - ( - dIsub_dVbs - dIsubs_dVbs - dIgidl_dVbs - dIgisl_dVbs ) - dIgb_dVs ; - ydc_bP[bNodePrime] = - dIsub_dVbs - dIsubs_dVbs - dIgidl_dVbs - dIgb_dVb - dIgisl_dVbs + dIbpdb_dVbpdb + dIbpb_dVbpb + dIbpsb_dVbpsb ; - ydc_bP[bNode] = - dIbpb_dVbpb ; - ydc_bP[dbNode] = - dIbpdb_dVbpdb ; - ydc_bP[sbNode] = - dIbpsb_dVbpsb ; - ydc_bP[tempNode] = - dIsub_dT - dIsubs_dT - dIgidl_dT - dIgb_dT - dIgisl_dT ; - - /* bulk node */ - /* ydc_b[dNode] = 0.0 ; */ - /* ydc_b[dNodePrime] = 0.0 ; */ - /* ydc_b[gNode] = 0.0 ; */ - /* ydc_b[gNodePrime] = 0.0 ; */ - /* ydc_b[sNode] = 0.0 ; */ - /* ydc_b[sNodePrime] = 0.0 ; */ - ydc_b[bNodePrime] = - dIbpb_dVbpb ; - ydc_b[bNode] = dIbpb_dVbpb ; - /* ydc_b[dbNode] = 0.0 ; */ - /* ydc_b[sbNode] = 0.0 ; */ - /* ydc_b[tempNode] = 0.0 ; */ - - /* drain bulk node */ - ydc_db[dNode] = - Gbd ; - /* ydc_db[dNodePrime] = 0.0 ; */ - /* ydc_db[gNode] = 0.0 ; */ - /* ydc_db[gNodePrime] = 0.0 ; */ - /* ydc_db[sNode] = 0.0 ; */ - /* ydc_db[sNodePrime] = 0.0 ; */ - ydc_db[bNodePrime] = - dIbpdb_dVbpdb ; - /* ydc_db[bNode] = 0.0 ; */ - ydc_db[dbNode] = Gbd + dIbpdb_dVbpdb ; - /* ydc_db[sbNode] = 0.0 ; */ - ydc_db[tempNode] = Gbdt ; - - /* source bulk node */ - /* ydc_sb[dNode] = 0.0 ; */ - /* ydc_sb[dNodePrime] = 0.0 ; */ - /* ydc_sb[gNode] = 0.0 ; */ - /* ydc_sb[gNodePrime] = 0.0 ; */ - ydc_sb[sNode] = - Gbs ; - /* ydc_sb[sNodePrime] = 0.0 ; */ - ydc_sb[bNodePrime] = - dIbpsb_dVbpsb ; - /* ydc_sb[bNode] = 0.0 ; */ - /* ydc_sb[dbNode] = 0.0 ; */ - ydc_sb[sbNode] = Gbs + dIbpsb_dVbpsb ; - ydc_sb[tempNode] = Gbst ; - - /* temp node */ - ydc_t[dNode] = - dP_dVdse ; - ydc_t[dNodePrime] = - dP_dVds ; - /* ydc_t[gNode] = 0.0 ; */ - ydc_t[gNodePrime] = - dP_dVgs - dP_dVgse ; - ydc_t[sNode] = - ( - dP_dVdse - dP_dVgse - dP_dVbse ) ; - ydc_t[sNodePrime] = - ( - dP_dVds - dP_dVgs - dP_dVbs ) ; - ydc_t[bNodePrime] = - dP_dVbs - dP_dVbse ; - /* ydc_t[bNode] = 0.0 ; */ - /* ydc_t[dbNode] = 0.0 ; */ - /* ydc_t[sbNode] = 0.0 ; */ - ydc_t[tempNode] = dIth_dT - dP_dT ; - - /* additional entries for flat nqs handling */ - if ( flg_nqs ) { - ydc_qi[dNodePrime] = dIqi_nqs_dVds ; - ydc_qi[gNodePrime] = dIqi_nqs_dVgs ; - ydc_qi[sNodePrime] = -(dIqi_nqs_dVds + dIqi_nqs_dVgs + dIqi_nqs_dVbs) ; - ydc_qi[bNodePrime] = dIqi_nqs_dVbs ; - ydc_qi[tempNode] = dIqi_nqs_dT ; - ydc_qi[qiNode] = dIqi_nqs_dQi_nqs ; - /* ydc_qi[qbNode]= 0.0 ; */ - ydc_qb[dNodePrime] = dIqb_nqs_dVds ; - ydc_qb[gNodePrime] = dIqb_nqs_dVgs ; - ydc_qb[sNodePrime] = -(dIqb_nqs_dVds + dIqb_nqs_dVgs + dIqb_nqs_dVbs) ; - ydc_qb[bNodePrime] = dIqb_nqs_dVbs ; - ydc_qb[tempNode] = dIqb_nqs_dT ; - /* ydc_qb[qiNode]= 0.0 ; */ - ydc_qb[qbNode] = dIqb_nqs_dQb_nqs ; - } - - - /* Preset vectors and matrix for dynamic part */ - - cq_d = cq_dP = cq_g = cq_gP = cq_s = cq_sP = cq_bP = cq_b = cq_db = cq_sb = cq_t = cq_qi = cq_qb = 0.0 ; - for (i = 0; i < XDIM ; i++) { - ydyn_d[i] = ydyn_dP[i] = ydyn_g[i] = ydyn_gP[i] = ydyn_s[i] = ydyn_sP[i] = ydyn_bP[i] = ydyn_b[i] - = ydyn_db[i] = ydyn_sb[i] = ydyn_t[i] = 0.0; - } - if (flg_nqs) { - for (i = 0; i < XDIM ; i++) { - ydyn_qi[i] = ydyn_qb[i] = 0.0; - } - } - - ag0 = ckt->CKTag[0]; - - if (ChargeComputationNeeded) { /* start handling of dynamic part */ - - if (!ByPass) { /* loading of state vector not necessary in case of Bypass */ - - /* intrinsic gate node (without fringing charges) */ - *(ckt->CKTstate0 + here->HSMHVqg) = Qg + Qg_nqs + Qgext; - - /* intrinsic drain node */ - *(ckt->CKTstate0 + here->HSMHVqd) = Qd + Qd_nqs ; - - /* intrinsic bulk node */ - *(ckt->CKTstate0 + here->HSMHVqb) = Qb + Qb_nqs + Qbext; - - /* drain bulk node */ - *(ckt->CKTstate0 + here->HSMHVqbd) = Qbd ; - - /* source bulk node */ - *(ckt->CKTstate0 + here->HSMHVqbs) = Qbs ; - - /* temp node */ - *(ckt->CKTstate0 + here->HSMHVqth) = Qth ; - - /* fringing charges */ - *(ckt->CKTstate0 + here->HSMHVqfd) = Qfd ; - *(ckt->CKTstate0 + here->HSMHVqfs) = Qfs ; - - /* external drain node */ - *(ckt->CKTstate0 + here->HSMHVqdE) = Qdext; - - /* nqs charges Qi_nqs, Qb_nqs: already loaded above */ - /* if ( flg_nqs ) { */ - /* *(ckt->CKTstate0 + here->HSMHVqi_nqs) = Qi_nqs; */ - /* *(ckt->CKTstate0 + here->HSMHVqb_nqs) = Qb_nqs; */ - /* } */ - } - - /* ... assemble capacitance matrix */ - - /* ...... drain node */ - ydyn_d[dNode] = dQfd_dVdse + Cbd + dQdext_dVdse ; - /* ydyn_d[dNodePrime] = 0.0 ; */ - /* ydyn_d[gNode] = 0.0 ; */ - ydyn_d[gNodePrime] = dQfd_dVgse + dQdext_dVgse ; - ydyn_d[sNode] = - (dQfd_dVdse + dQfd_dVgse+ dQfd_dVbse) - ( dQdext_dVdse + dQdext_dVgse + dQdext_dVbse ) ; - /* ydyn_d[sNodePrime ] = 0.0 ; */ - ydyn_d[bNodePrime] = dQfd_dVbse + dQdext_dVbse; - /* ydyn_d[bNode ] = 0.0 ; */ - ydyn_d[dbNode] = - Cbd ; - /* ydyn_d[sbNode ] = 0.0 ; */ - ydyn_d[tempNode] = dQfd_dT - Cbdt + dQdext_dT ; - - /* ...... intrinsic drain node */ - /* ydyn_dP[dNode] = 0.0 ; */ - ydyn_dP[dNodePrime] = dQd_dVds ; - /* ydyn_dP[gNode] = 0.0 ; */ - ydyn_dP[gNodePrime] = dQd_dVgs ; - /* ydyn_dP[sNode] = 0.0 ; */ - ydyn_dP[sNodePrime] = - ( dQd_dVds + dQd_dVgs + dQd_dVbs ) ; - ydyn_dP[bNodePrime] = dQd_dVbs ; - /* ydyn_dP[bNode] = 0.0 ; */ - /* ydyn_dP[dbNode] = 0.0 ; */ - /* ydyn_dP[sbNode] = 0.0 ; */ - ydyn_dP[tempNode] = dQd_dT ; - - /* ...... gate node */ - /* (no entry) */ - - /* ...... intrinsic gate node */ - ydyn_gP[dNode] = -dQfd_dVdse - dQfs_dVdse + dQgext_dVdse ; - ydyn_gP[dNodePrime] = dQg_dVds ; - /* ydyn_gP[gNode] = 0.0 ; */ - ydyn_gP[gNodePrime] = dQg_dVgs -dQfd_dVgse - dQfs_dVgse + dQgext_dVgse ; - ydyn_gP[sNode] = dQfd_dVdse + dQfs_dVdse + dQfd_dVgse + dQfs_dVgse + dQfd_dVbse + dQfs_dVbse - - ( dQgext_dVdse + dQgext_dVgse + dQgext_dVbse ) ; - ydyn_gP[sNodePrime] = -( dQg_dVds + dQg_dVgs + dQg_dVbs ) ; - ydyn_gP[bNodePrime] = dQg_dVbs -dQfd_dVbse - dQfs_dVbse + dQgext_dVbse ; - /* ydyn_gP[bNode] = 0.0 ; */ - /* ydyn_gP[dbNode] = 0.0 ; */ - /* ydyn_gP[sbNode] = 0.0 ; */ - ydyn_gP[tempNode] = dQg_dT - dQfd_dT - dQfs_dT + dQgext_dT ; - - /* ...... source node */ - ydyn_s[dNode] = dQfs_dVdse + dQsext_dVdse ; - /* ydyn_d[dNodePrime ] = 0.0 ; */ - /* ydyn_d[gNode ] = 0.0 ; */ - ydyn_s[gNodePrime] = dQfs_dVgse + dQsext_dVgse ; - ydyn_s[sNode] = Cbs - (dQfs_dVdse + dQfs_dVgse+ dQfs_dVbse) - ( dQsext_dVdse + dQsext_dVgse + dQsext_dVbse ) ; - /* ydyn_d[sNodePrime ] = 0.0 ; */ - ydyn_s[bNodePrime] = dQfs_dVbse + dQsext_dVbse ; - /* ydyn_d[bNode ] = 0.0 ; */ - /* ydyn_d[dbNode ] = 0.0 ; */ - ydyn_s[sbNode] = - Cbs ; - ydyn_s[tempNode] = dQfs_dT - Cbst + dQsext_dT ; - - /* ...... intrinsic source node */ - /* ydyn_sP[dNode] = 0.0 ; */ - ydyn_sP[dNodePrime] = dQs_dVds ; - /* ydyn_sP[gNode] = 0.0 ; */ - ydyn_sP[gNodePrime] = dQs_dVgs ; - /* ydyn_sP[sNode] = 0.0 ; */ - ydyn_sP[sNodePrime] = - ( dQs_dVds + dQs_dVgs + dQs_dVbs ); - ydyn_sP[bNodePrime] = dQs_dVbs ; - /* ydyn_sP[bNode] = 0.0 ; */ - /* ydyn_sP[dbNode] = 0.0 ; */ - /* ydyn_sP[sbNode] = 0.0 ; */ - ydyn_sP[tempNode] = dQs_dT ; - - /* ...... intrinsic bulk node */ - ydyn_bP[dNode] = dQbext_dVdse ; - ydyn_bP[dNodePrime] = dQb_dVds ; - /* ydyn_bP[gNode] = 0.0 ; */ - ydyn_bP[gNodePrime] = dQb_dVgs + dQbext_dVgse ; - ydyn_bP[sNode] = - ( dQbext_dVdse + dQbext_dVgse + dQbext_dVbse ) ; - ydyn_bP[sNodePrime] = - ( dQb_dVds + dQb_dVgs + dQb_dVbs ); - ydyn_bP[bNodePrime] = dQb_dVbs + dQbext_dVbse ; - /* ydyn_bP[bNode] = 0.0 ; */ - /* ydyn_bP[dbNode] = 0.0 ; */ - /* ydyn_bP[sbNode] = 0.0 ; */ - ydyn_bP[tempNode] = dQb_dT + dQbext_dT ; - - /* ...... bulk node */ - /* (no entry) */ - - /* ...... drain bulk node */ - ydyn_db[dNode] = - Cbd ; - /* ydyn_db[dNodePrime] = 0.0 ; */ - /* ydyn_db[gNode] = 0.0 ; */ - /* ydyn_db[gNodePrime] = 0.0 ; */ - /* ydyn_db[sNode] = 0.0 ; */ - /* ydyn_db[sNodePrime] = 0.0 ; */ - /* ydyn_db[bNodePrime] = 0.0 ; */ - /* ydyn_db[bNode] = 0.0 ; */ - ydyn_db[dbNode] = Cbd ; - /* ydyn_db[sbNode] = 0.0 ; */ - ydyn_db[tempNode] = Cbdt ; - - /* ...... source bulk node */ - /* ydyn_sb[dNode] = 0.0 ; */ - /* ydyn_sb[dNodePrime] = 0.0 ; */ - /* ydyn_sb[gNode] = 0.0 ; */ - /* ydyn_sb[gNodePrime] = 0.0 ; */ - ydyn_sb[sNode] = - Cbs ; - /* ydyn_sb[sNodePrime] = 0.0 ; */ - /* ydyn_sb[bNodePrime] = 0.0 ; */ - /* ydyn_sb[bNode] = 0.0 ; */ - /* ydyn_sb[dbNode] = 0.0 ; */ - ydyn_sb[sbNode] = Cbs ; - ydyn_sb[tempNode] = Cbst ; - - /* ...... temp node */ - /* ydyn_t[dNode] = 0.0 ; */ - /* ydyn_t[dNodePrime] = 0.0 ; */ - /* ydyn_t[gNode] = 0.0 ; */ - /* ydyn_t[gNodePrime] = 0.0 ; */ - /* ydyn_t[sNode] = 0.0 ; */ - /* ydyn_t[sNodePrime] = 0.0 ; */ - /* ydyn_t[bNodePrime] = 0.0 ; */ - /* ydyn_t[bNode] = 0.0 ; */ - /* ydyn_t[dbNode] = 0.0 ; */ - /* ydyn_t[sbNode] = 0.0 ; */ - ydyn_t[tempNode] = Cth ; - - /* additional entries for flat nqs handling */ - if (flg_nqs) { - /* ...... intrinsic drain node */ - /* ydyn_dP[dNode] += 0.0 ; */ - ydyn_dP[dNodePrime] += dQd_nqs_dVds ; - /* ydyn_dP[gNode] += 0.0 ; */ - ydyn_dP[gNodePrime] += dQd_nqs_dVgs ; - /* ydyn_dP[sNode] += 0.0 ; */ - ydyn_dP[sNodePrime] += - ( dQd_nqs_dVds + dQd_nqs_dVgs + dQd_nqs_dVbs ) ; - ydyn_dP[bNodePrime] += dQd_nqs_dVbs ; - /* ydyn_dP[bNode] += 0.0 ; */ - /* ydyn_dP[dbNode] += 0.0 ; */ - /* ydyn_dP[sbNode] += 0.0 ; */ - ydyn_dP[tempNode] += dQd_nqs_dT ; - ydyn_dP[qiNode] = dQd_nqs_dQi_nqs ; - - /* ...... intrinsic gate node */ - /* ydyn_gP[dNode] += 0.0 ; */ - /* ydyn_gP[dNodePrime] += 0.0 ; */ - /* ydyn_gP[gNode] += 0.0 ; */ - /* ydyn_gP[gNodePrime] += 0.0 ; */ - /* ydyn_gP[sNode] += 0.0 ; */ - /* ydyn_gP[sNodePrime] += 0.0 ; */ - /* ydyn_gP[bNodePrime] += 0.0 ; */ - /* ydyn_gP[bNode] += 0.0 ; */ - /* ydyn_gP[dbNode] += 0.0 ; */ - /* ydyn_gP[sbNode] += 0.0 ; */ - /* ydyn_gP[tempNode] += 0.0 ; */ - ydyn_gP[qiNode] = dQg_nqs_dQi_nqs ; - ydyn_gP[qbNode] = dQg_nqs_dQb_nqs ; - - /* ...... intrinsic source node */ - /* ydyn_sP[dNode] += 0.0 ; */ - ydyn_sP[dNodePrime] += dQs_nqs_dVds ; - /* ydyn_sP[gNode] += 0.0 ; */ - ydyn_sP[gNodePrime] += dQs_nqs_dVgs ; - /* ydyn_sP[sNode] += 0.0 ; */ - ydyn_sP[sNodePrime] += - ( dQs_nqs_dVds + dQs_nqs_dVgs + dQs_nqs_dVbs ); - ydyn_sP[bNodePrime] += dQs_nqs_dVbs ; - /* ydyn_sP[bNode] += 0.0 ; */ - /* ydyn_sP[dbNode] += 0.0 ; */ - /* ydyn_sP[sbNode] += 0.0 ; */ - ydyn_sP[tempNode] += dQs_nqs_dT ; - ydyn_sP[qiNode] = dQs_nqs_dQi_nqs ; - - /* ...... intrinsic bulk node */ - /* ydyn_bP[dNode] += 0.0 ; */ - /* ydyn_bP[dNodePrime] += 0.0 ; */ - /* ydyn_bP[gNode] += 0.0 ; */ - /* ydyn_bP[gNodePrime] += 0.0 ; */ - /* ydyn_bP[sNode] += 0.0 ; */ - /* ydyn_bP[sNodePrime] += 0.0 ; */ - /* ydyn_bP[bNodePrime] += 0.0 ; */ - /* ydyn_bP[bNode] += 0.0 ; */ - /* ydyn_bP[dbNode] += 0.0 ; */ - /* ydyn_bP[sbNode] += 0.0 ; */ - /* ydyn_bP[tempNode] += 0.0 ; */ - ydyn_bP[qbNode] = 1.0 ; - - /* ...... qi node */ - /* ydyn_qi[dNodePrime] = 0.0 ; */ - /* ydyn_qi[gNodePrime] = 0.0 ; */ - /* ydyn_qi[sNodePrime] = 0.0 ; */ - /* ydyn_qi[bNodePrime] = 0.0 ; */ - /* ydyn_qi[tempNode] = 0.0 ; */ - ydyn_qi[qiNode] = 1.0 ; - /* ydyn_qi[qbNode] = 0.0 ; */ - - /* ...... qb node */ - /* ydyn_qb[dNodePrime] = 0.0 ; */ - /* ydyn_qb[gNodePrime] = 0.0 ; */ - /* ydyn_qb[sNodePrime] = 0.0 ; */ - /* ydyn_qb[bNodePrime] = 0.0 ; */ - /* ydyn_qb[tempNode] = 0.0 ; */ - /* ydyn_qb[qiNode] = 0.0 ; */ - ydyn_qb[qbNode] = 1.0 ; - } - - if (!ByPass) { /* integrate etc. only necessary if not in Bypass mode! */ - - /* store small signal parameters */ - if (ckt->CKTmode & MODEINITSMSIG) { - /* printf("HSMHV_load: (small signal) ByPass=%d\n",ByPass); */ -/* printf("HSMHV_load: ydc_dP=%e %e %e %e %e %e %e %e\n", - ydc_dP[0],ydc_dP[1],ydc_dP[2],ydc_dP[3],ydc_dP[4],ydc_dP[5],ydc_dP[6],ydc_dP[7]); - printf("HSMHV_load: ych_dP=%e %e %e %e %e %e %e %e\n", - ydyn_dP[0],ydyn_dP[1],ydyn_dP[2],ydyn_dP[3],ydyn_dP[4],ydyn_dP[5],ydyn_dP[6],ydyn_dP[7]); -*/ - /* dc matrix into structure 0724*/ - for (i = 0; i < XDIM; i++) { - here->HSMHV_ydc_d[i] = ydc_d[i]; - here->HSMHV_ydc_dP[i] = ydc_dP[i]; - here->HSMHV_ydc_g[i] = ydc_g[i]; - here->HSMHV_ydc_gP[i] = ydc_gP[i]; - here->HSMHV_ydc_s[i] = ydc_s[i]; - here->HSMHV_ydc_sP[i] = ydc_sP[i]; - here->HSMHV_ydc_bP[i] = ydc_bP[i]; - here->HSMHV_ydc_b[i] = ydc_b[i]; - here->HSMHV_ydc_db[i] = ydc_db[i]; - here->HSMHV_ydc_sb[i] = ydc_sb[i]; - here->HSMHV_ydc_t[i] = ydc_t[i]; - } - /* capacitance matrix into structure 0724*/ - for (i = 0; i < XDIM; i++) { - here->HSMHV_ydyn_d[i] = ydyn_d[i]; - here->HSMHV_ydyn_dP[i] = ydyn_dP[i]; - here->HSMHV_ydyn_g[i] = ydyn_g[i]; - here->HSMHV_ydyn_gP[i] = ydyn_gP[i]; - here->HSMHV_ydyn_s[i] = ydyn_s[i]; - here->HSMHV_ydyn_sP[i] = ydyn_sP[i]; - here->HSMHV_ydyn_bP[i] = ydyn_bP[i]; - here->HSMHV_ydyn_b[i] = ydyn_b[i]; - here->HSMHV_ydyn_db[i] = ydyn_db[i]; - here->HSMHV_ydyn_sb[i] = ydyn_sb[i]; - here->HSMHV_ydyn_t[i] = ydyn_t[i]; - } - if (flg_nqs) { - for (i = 0; i < XDIM; i++) { - here->HSMHV_ydc_qi[i] = ydc_qi[i]; - here->HSMHV_ydc_qb[i] = ydc_qb[i]; - here->HSMHV_ydyn_qi[i] = ydyn_qi[i]; - here->HSMHV_ydyn_qb[i] = ydyn_qb[i]; - } - } - goto line1000; /* that's all for small signal analyses */ - } - - /* Continue handling of dynamic part: */ - /* ... calculate time derivatives of node charges */ - - if (ckt->CKTmode & MODEINITTRAN) { - /* at the very first iteration of the first timepoint: - copy charges into previous state -> the integrator may use them ... */ - *(ckt->CKTstate1 + here->HSMHVqb) = *(ckt->CKTstate0 + here->HSMHVqb); - *(ckt->CKTstate1 + here->HSMHVqg) = *(ckt->CKTstate0 + here->HSMHVqg); - *(ckt->CKTstate1 + here->HSMHVqd) = *(ckt->CKTstate0 + here->HSMHVqd); - *(ckt->CKTstate1 + here->HSMHVqth) = *(ckt->CKTstate0 + here->HSMHVqth); - *(ckt->CKTstate1 + here->HSMHVqbs) = *(ckt->CKTstate0 + here->HSMHVqbs); - *(ckt->CKTstate1 + here->HSMHVqbd) = *(ckt->CKTstate0 + here->HSMHVqbd); - - *(ckt->CKTstate1 + here->HSMHVqfd) = *(ckt->CKTstate0 + here->HSMHVqfd); - *(ckt->CKTstate1 + here->HSMHVqfs) = *(ckt->CKTstate0 + here->HSMHVqfs); - - *(ckt->CKTstate1 + here->HSMHVqdE) = *(ckt->CKTstate0 + here->HSMHVqdE); - - if (flg_nqs) { - *(ckt->CKTstate1 + here->HSMHVqi_nqs) = *(ckt->CKTstate0 + here->HSMHVqi_nqs); - *(ckt->CKTstate1 + here->HSMHVqb_nqs) = *(ckt->CKTstate0 + here->HSMHVqb_nqs); - } - } - - return_if_error (NIintegrate(ckt, &geq, &ceq, 0.0, here->HSMHVqb)); - return_if_error (NIintegrate(ckt, &geq, &ceq, 0.0, here->HSMHVqg)); - return_if_error (NIintegrate(ckt, &geq, &ceq, 0.0, here->HSMHVqd)); - return_if_error (NIintegrate(ckt, &geq, &ceq, 0.0, here->HSMHVqbs)); - return_if_error (NIintegrate(ckt, &geq, &ceq, 0.0, here->HSMHVqbd)); - - return_if_error (NIintegrate(ckt, &geq, &ceq, 0.0, here->HSMHVqth)); - - return_if_error (NIintegrate(ckt, &geq, &ceq, 0.0, here->HSMHVqfd)); - return_if_error (NIintegrate(ckt, &geq, &ceq, 0.0, here->HSMHVqfs)); - - return_if_error (NIintegrate(ckt, &geq, &ceq, 0.0, here->HSMHVqdE)); - - if (flg_nqs) { - return_if_error (NIintegrate(ckt, &geq, &ceq, 0.0, here->HSMHVqi_nqs)); - return_if_error (NIintegrate(ckt, &geq, &ceq, 0.0, here->HSMHVqb_nqs)); - } - - if (ckt->CKTmode & MODEINITTRAN) { - /* at the very first iteration of the first timepoint: - copy currents into previous state -> the integrator may use them ... */ - *(ckt->CKTstate1 + here->HSMHVcqb) = *(ckt->CKTstate0 + here->HSMHVcqb); - *(ckt->CKTstate1 + here->HSMHVcqg) = *(ckt->CKTstate0 + here->HSMHVcqg); - *(ckt->CKTstate1 + here->HSMHVcqd) = *(ckt->CKTstate0 + here->HSMHVcqd); - - *(ckt->CKTstate1 + here->HSMHVcqth) = *(ckt->CKTstate0 + here->HSMHVcqth); - - *(ckt->CKTstate1 + here->HSMHVcqbs) = *(ckt->CKTstate0 + here->HSMHVcqbs); - *(ckt->CKTstate1 + here->HSMHVcqbd) = *(ckt->CKTstate0 + here->HSMHVcqbd); - *(ckt->CKTstate1 + here->HSMHVcqfd) = *(ckt->CKTstate0 + here->HSMHVcqfd); - *(ckt->CKTstate1 + here->HSMHVcqfs) = *(ckt->CKTstate0 + here->HSMHVcqfs); - - *(ckt->CKTstate1 + here->HSMHVcqdE) = *(ckt->CKTstate0 + here->HSMHVcqdE); - if (flg_nqs) { - *(ckt->CKTstate1 + here->HSMHVdotqi_nqs) = *(ckt->CKTstate0 + here->HSMHVdotqi_nqs); - *(ckt->CKTstate1 + here->HSMHVdotqb_nqs) = *(ckt->CKTstate0 + here->HSMHVdotqb_nqs); - } - } - } - - - /* ... finally gather displacement currents from data structures */ - - cq_dP = *(ckt->CKTstate0 + here->HSMHVcqd); - cq_gP = *(ckt->CKTstate0 + here->HSMHVcqg); - cq_bP = *(ckt->CKTstate0 + here->HSMHVcqb); - cq_sP = - *(ckt->CKTstate0 + here->HSMHVcqg) - - *(ckt->CKTstate0 + here->HSMHVcqb) - - *(ckt->CKTstate0 + here->HSMHVcqd); - cq_dE = *(ckt->CKTstate0 + here->HSMHVcqdE); - cq_db = *(ckt->CKTstate0 + here->HSMHVcqbd); - cq_sb = *(ckt->CKTstate0 + here->HSMHVcqbs); - cq_g = 0.0 ; - cq_b = 0.0 ; - - /* displacement currents at outer drain/source node (fringing part only!) */ - cq_d = *(ckt->CKTstate0 + here->HSMHVcqfd); - cq_s = *(ckt->CKTstate0 + here->HSMHVcqfs); - - cq_t = *(ckt->CKTstate0 + here->HSMHVcqth); - - /* displacement currents due to nqs */ - if (flg_nqs) { - cq_qi = *(ckt->CKTstate0 + here->HSMHVdotqi_nqs); - cq_qb = *(ckt->CKTstate0 + here->HSMHVdotqb_nqs); - } else { - cq_qi = cq_qb = 0.0 ; - } - - /* ... and, if necessary: Extrapolate displacement currents onto x-values */ - - if (delvdbd || deldeltemp) { - cq_db += ag0*(Cbd*delvdbd + Cbdt*deldeltemp) ; - } - if (delvsbs || deldeltemp) { - cq_sb += ag0*(Cbs*delvsbs + Cbst*deldeltemp) ; - } - if (delvgs || delvds || delvbs || deldeltemp) { - cq_gP += ag0*(dQg_dVgs*delvgs + dQg_dVds*delvds + dQg_dVbs*delvbs + dQg_dT*deldeltemp) ; - cq_dP += ag0*(dQd_dVgs*delvgs + dQd_dVds*delvds + dQd_dVbs*delvbs + dQd_dT*deldeltemp) ; - cq_sP += ag0*(dQs_dVgs*delvgs + dQs_dVds*delvds + dQs_dVbs*delvbs + dQs_dT*deldeltemp) ; - cq_bP = - ( cq_gP + cq_dP + cq_sP ); - } - if (deldeltemp) { - cq_t += ag0*Cth *deldeltemp ; - cq_d += ag0*dQfd_dT*deldeltemp ; - cq_s += ag0*dQfs_dT*deldeltemp ; - - cq_gE += ag0*dQgext_dT*deldeltemp ; - cq_dE += ag0*dQdext_dT*deldeltemp ; - cq_bE += ag0*dQbext_dT*deldeltemp ; - cq_sE = - ( cq_gE + cq_dE + cq_bE ); - } - if (delvgse || delvdse || delvbse) { - cq_d += ag0*(dQfd_dVgse*delvgse + dQfd_dVdse*delvdse + dQfd_dVbse*delvbse) ; - cq_s += ag0*(dQfs_dVgse*delvgse + dQfs_dVdse*delvdse + dQfs_dVbse*delvbse) ; - - cq_gE += ag0*(dQgext_dVgse*delvgse + dQgext_dVdse*delvdse + dQgext_dVbse*delvbse) ; - cq_dE += ag0*(dQdext_dVgse*delvgse + dQdext_dVdse*delvdse + dQdext_dVbse*delvbse) ; - cq_bE += ag0*(dQbext_dVgse*delvgse + dQbext_dVdse*delvdse + dQbext_dVbse*delvbse) ; - cq_sE = - ( cq_gE + cq_dE + cq_bE ); - } - - if (flg_nqs) { - if (delvgs || delvds || delvbs || deldeltemp) { - cq_dP += ag0*(dQd_nqs_dVgs*delvgs + dQd_nqs_dVds*delvds + dQd_nqs_dVbs*delvbs + dQd_nqs_dT*deldeltemp) ; - cq_sP += ag0*(dQs_nqs_dVgs*delvgs + dQs_nqs_dVds*delvds + dQs_nqs_dVbs*delvbs + dQs_nqs_dT*deldeltemp) ; - cq_bP = - ( cq_gP + cq_dP + cq_sP ); /* should be superfluous ? */ - } - if (delQi_nqs) { - cq_dP += ag0*dQd_nqs_dQi_nqs*delQi_nqs ; - cq_gP += ag0*dQg_nqs_dQi_nqs*delQi_nqs ; - cq_sP += ag0*dQs_nqs_dQi_nqs*delQi_nqs ; - cq_qi += ag0* 1.0 *delQi_nqs ; - } - if (delQb_nqs) { - cq_gP += ag0*dQg_nqs_dQb_nqs*delQb_nqs ; - cq_bP += ag0* 1.0 *delQb_nqs ; - cq_qb += ag0* 1.0 *delQb_nqs ; - } - } - } /* End of handling dynamic part */ - - - /* Assemble total node currents (type-handling shifted to stamping) */ - - cur_d = i_d + cq_d - cq_db + cq_dE ; - cur_dP = i_dP + cq_dP ; - cur_g = i_g + cq_g ; - cur_gP = i_gP + cq_gP - cq_d - cq_s + cq_gE ; - cur_s = i_s + cq_s - cq_sb + cq_sE ; - cur_sP = i_sP + cq_sP; - cur_bP = i_bP + cq_bP + cq_bE ; - cur_b = i_b + cq_b; - cur_db = i_db + cq_db; - cur_sb = i_sb + cq_sb; - cur_t = i_t + cq_t; - cur_qi = i_qi + cq_qi; - cur_qb = i_qb + cq_qb; - - - /* Now we can start stamping ... */ - /* ... right hand side: subtract total node currents */ - - *(ckt->CKTrhs + here->HSMHVdNode) -= model->HSMHV_type * cur_d; - *(ckt->CKTrhs + here->HSMHVdNodePrime) -= model->HSMHV_type * cur_dP; - *(ckt->CKTrhs + here->HSMHVgNode) -= model->HSMHV_type * cur_g; - *(ckt->CKTrhs + here->HSMHVgNodePrime) -= model->HSMHV_type * cur_gP; - *(ckt->CKTrhs + here->HSMHVsNode) -= model->HSMHV_type * cur_s; - *(ckt->CKTrhs + here->HSMHVsNodePrime) -= model->HSMHV_type * cur_sP; - *(ckt->CKTrhs + here->HSMHVbNodePrime) -= model->HSMHV_type * cur_bP; - *(ckt->CKTrhs + here->HSMHVbNode) -= model->HSMHV_type * cur_b; - *(ckt->CKTrhs + here->HSMHVdbNode) -= model->HSMHV_type * cur_db; - *(ckt->CKTrhs + here->HSMHVsbNode) -= model->HSMHV_type * cur_sb; - if( flg_tempNode > 0) { - *(ckt->CKTrhs + here->HSMHVtempNode) -= cur_t; /* temp node independent of model type! */ - } - if (flg_nqs) { - *(ckt->CKTrhs + here->HSMHVqiNode) -= cur_qi; - *(ckt->CKTrhs + here->HSMHVqbNode) -= cur_qb; - } - - - /* ... finally stamp matrix */ - - /*drain*/ - *(here->HSMHVDdPtr) += ydc_d[dNode] + ag0*ydyn_d[dNode]; - *(here->HSMHVDdpPtr) += ydc_d[dNodePrime] + ag0*ydyn_d[dNodePrime]; - *(here->HSMHVDgpPtr) += ydc_d[gNodePrime] + ag0*ydyn_d[gNodePrime]; - *(here->HSMHVDsPtr) += ydc_d[sNode] + ag0*ydyn_d[sNode]; - *(here->HSMHVDspPtr) += ydc_d[sNodePrime] + ag0*ydyn_d[sNodePrime]; - *(here->HSMHVDbpPtr) += ydc_d[bNodePrime] + ag0*ydyn_d[bNodePrime]; - *(here->HSMHVDdbPtr) += ydc_d[dbNode] + ag0*ydyn_d[dbNode]; - if (flg_subNode > 0) { - *(here->HSMHVDsubPtr) += ydc_d[subNode]; - } - if( flg_tempNode > 0) { - /* temp entries in matrix dependent on model type */ - *(here->HSMHVDtempPtr) += model->HSMHV_type * (ydc_d[tempNode] + ag0*ydyn_d[tempNode]); - } - - /*drain prime*/ - *(here->HSMHVDPdPtr) += ydc_dP[dNode] + ag0*ydyn_dP[dNode]; - *(here->HSMHVDPdpPtr) += ydc_dP[dNodePrime] + ag0*ydyn_dP[dNodePrime]; - *(here->HSMHVDPgpPtr) += ydc_dP[gNodePrime] + ag0*ydyn_dP[gNodePrime]; - *(here->HSMHVDPsPtr) += ydc_dP[sNode] + ag0*ydyn_dP[sNode]; - *(here->HSMHVDPspPtr) += ydc_dP[sNodePrime] + ag0*ydyn_dP[sNodePrime]; - *(here->HSMHVDPbpPtr) += ydc_dP[bNodePrime] + ag0*ydyn_dP[bNodePrime]; - if (flg_subNode > 0) { - *(here->HSMHVDPsubPtr) += ydc_dP[subNode]; - } - if( flg_tempNode > 0) { - /* temp entries in matrix dependent on model type */ - *(here->HSMHVDPtempPtr) += model->HSMHV_type * (ydc_dP[tempNode] + ag0*ydyn_dP[tempNode]); - } - if (flg_nqs) { - *(here->HSMHVDPqiPtr) += model->HSMHV_type * (ydc_dP[qiNode] + ag0*ydyn_dP[qiNode]); - } - - /*gate*/ - *(here->HSMHVGgPtr) += ydc_g[gNode] + ag0*ydyn_g[gNode]; - *(here->HSMHVGgpPtr) += ydc_g[gNodePrime] + ag0*ydyn_g[gNodePrime]; - - /*gate prime*/ - *(here->HSMHVGPdPtr) += ydc_gP[dNode] + ag0*ydyn_gP[dNode]; - *(here->HSMHVGPdpPtr) += ydc_gP[dNodePrime] + ag0*ydyn_gP[dNodePrime]; - *(here->HSMHVGPgPtr) += ydc_gP[gNode] + ag0*ydyn_gP[gNode]; - *(here->HSMHVGPgpPtr) += ydc_gP[gNodePrime] + ag0*ydyn_gP[gNodePrime]; - *(here->HSMHVGPsPtr) += ydc_gP[sNode] + ag0*ydyn_gP[sNode]; - *(here->HSMHVGPspPtr) += ydc_gP[sNodePrime] + ag0*ydyn_gP[sNodePrime]; - *(here->HSMHVGPbpPtr) += ydc_gP[bNodePrime] + ag0*ydyn_gP[bNodePrime]; - if( flg_tempNode > 0) { - /* temp entries in matrix dependent on model type */ - *(here->HSMHVGPtempPtr) += model->HSMHV_type * (ydc_gP[tempNode] + ag0*ydyn_gP[tempNode]); - } - if (flg_nqs) { - *(here->HSMHVGPqiPtr) += model->HSMHV_type * (ydc_gP[qiNode] + ag0*ydyn_gP[qiNode]); - *(here->HSMHVGPqbPtr) += model->HSMHV_type * (ydc_gP[qbNode] + ag0*ydyn_gP[qbNode]); - } - - /*source*/ - *(here->HSMHVSdPtr) += ydc_s[dNode] + ag0*ydyn_s[dNode]; - *(here->HSMHVSsPtr) += ydc_s[sNode] + ag0*ydyn_s[sNode]; - *(here->HSMHVSdpPtr) += ydc_s[dNodePrime] + ag0*ydyn_s[dNodePrime]; - *(here->HSMHVSgpPtr) += ydc_s[gNodePrime] + ag0*ydyn_s[gNodePrime]; - *(here->HSMHVSspPtr) += ydc_s[sNodePrime] + ag0*ydyn_s[sNodePrime]; - *(here->HSMHVSbpPtr) += ydc_s[bNodePrime] + ag0*ydyn_s[bNodePrime]; - *(here->HSMHVSsbPtr) += ydc_s[sbNode] + ag0*ydyn_s[sbNode]; - if (flg_subNode > 0) { - *(here->HSMHVSsubPtr) += ydc_s[subNode]; - } - if( flg_tempNode > 0) { - /* temp entries in matrix dependent on model type */ - *(here->HSMHVStempPtr) += model->HSMHV_type * (ydc_s[tempNode]+ ag0*ydyn_s[tempNode]); - } - - /*source prime*/ - *(here->HSMHVSPdPtr) += ydc_sP[dNode] + ag0*ydyn_sP[dNode]; - *(here->HSMHVSPdpPtr) += ydc_sP[dNodePrime] + ag0*ydyn_sP[dNodePrime]; - *(here->HSMHVSPgpPtr) += ydc_sP[gNodePrime] + ag0*ydyn_sP[gNodePrime]; - *(here->HSMHVSPsPtr) += ydc_sP[sNode] + ag0*ydyn_sP[sNode]; - *(here->HSMHVSPspPtr) += ydc_sP[sNodePrime] + ag0*ydyn_sP[sNodePrime]; - *(here->HSMHVSPbpPtr) += ydc_sP[bNodePrime] + ag0*ydyn_sP[bNodePrime]; - if (flg_subNode > 0) { - *(here->HSMHVSPsubPtr) += ydc_sP[subNode]; - } - if( flg_tempNode > 0) { - /* temp entries in matrix dependent on model type */ - *(here->HSMHVSPtempPtr) += model->HSMHV_type * (ydc_sP[tempNode] + ag0*ydyn_sP[tempNode]); - } - if (flg_nqs) { - *(here->HSMHVSPqiPtr) += model->HSMHV_type * (ydc_sP[qiNode] + ag0*ydyn_sP[qiNode]); - } - - /*bulk prime*/ - *(here->HSMHVBPdPtr) += ydc_bP[dNode] + ag0*ydyn_bP[dNode]; - *(here->HSMHVBPdpPtr) += ydc_bP[dNodePrime] + ag0*ydyn_bP[dNodePrime]; - *(here->HSMHVBPgpPtr) += ydc_bP[gNodePrime] + ag0*ydyn_bP[gNodePrime]; - *(here->HSMHVBPspPtr) += ydc_bP[sNodePrime] + ag0*ydyn_bP[sNodePrime]; - *(here->HSMHVBPsPtr) += ydc_bP[sNode] + ag0*ydyn_bP[sNode]; - *(here->HSMHVBPbpPtr) += ydc_bP[bNodePrime] + ag0*ydyn_bP[bNodePrime]; - *(here->HSMHVBPbPtr) += ydc_bP[bNode] + ag0*ydyn_bP[bNode]; - *(here->HSMHVBPdbPtr) += ydc_bP[dbNode] + ag0*ydyn_bP[dbNode]; - *(here->HSMHVBPsbPtr) += ydc_bP[sbNode] + ag0*ydyn_bP[sbNode]; - if( flg_tempNode > 0) { - /* temp entries in matrix dependent on model type */ - *(here->HSMHVBPtempPtr) += model->HSMHV_type * (ydc_bP[tempNode] + ag0*ydyn_bP[tempNode]); - } - if (flg_nqs) { - *(here->HSMHVBPqbPtr) += model->HSMHV_type * (ydc_bP[qbNode] + ag0*ydyn_bP[qbNode]); - } - - /*bulk*/ - *(here->HSMHVBbpPtr) += ydc_b[bNodePrime] + ag0*ydyn_b[bNodePrime]; - *(here->HSMHVBbPtr) += ydc_b[bNode] + ag0*ydyn_b[bNode]; - - /*drain bulk*/ - *(here->HSMHVDBdPtr) += ydc_db[dNode] + ag0*ydyn_db[dNode]; - *(here->HSMHVDBbpPtr) += ydc_db[bNodePrime] + ag0*ydyn_db[bNodePrime]; - *(here->HSMHVDBdbPtr) += ydc_db[dbNode] + ag0*ydyn_db[dbNode]; - if( flg_tempNode > 0) { - /* temp entries in matrix dependent on model type */ - *(here->HSMHVDBtempPtr) += model->HSMHV_type * (ydc_db[tempNode] + ag0*ydyn_db[tempNode]); - } - - /*source bulk*/ - *(here->HSMHVSBsPtr) += ydc_sb[sNode] + ag0*ydyn_sb[sNode]; - *(here->HSMHVSBbpPtr) += ydc_sb[bNodePrime] + ag0*ydyn_sb[bNodePrime]; - *(here->HSMHVSBsbPtr) += ydc_sb[sbNode] + ag0*ydyn_sb[sbNode]; - if( flg_tempNode > 0) { - /* temp entries in matrix dependent on model type */ - *(here->HSMHVSBtempPtr) += model->HSMHV_type * (ydc_sb[tempNode] + ag0*ydyn_sb[tempNode]); - } - - /*temp*/ - if( flg_tempNode > 0) { - /* temp entries in matrix dependent on model type */ - *(here->HSMHVTempdPtr) += model->HSMHV_type * (ydc_t[dNode] + ag0*ydyn_t[dNode] ); - *(here->HSMHVTempdpPtr) += model->HSMHV_type * (ydc_t[dNodePrime] + ag0*ydyn_t[dNodePrime]); - *(here->HSMHVTempgpPtr) += model->HSMHV_type * (ydc_t[gNodePrime] + ag0*ydyn_t[gNodePrime]); - *(here->HSMHVTempsPtr) += model->HSMHV_type * (ydc_t[sNode] + ag0*ydyn_t[sNode] ); - *(here->HSMHVTempspPtr) += model->HSMHV_type * (ydc_t[sNodePrime] + ag0*ydyn_t[sNodePrime]); - *(here->HSMHVTempbpPtr) += model->HSMHV_type * (ydc_t[bNodePrime] + ag0*ydyn_t[bNodePrime]); - /* no type factor at main diagonal temp entry! */ - *(here->HSMHVTemptempPtr) += ydc_t[tempNode] + ag0*ydyn_t[tempNode]; - } - - /* additional entries for flat nqs handling */ - if ( flg_nqs ) { - /*qi*/ - *(here->HSMHVQIdpPtr) += model->HSMHV_type * (ydc_qi[dNodePrime] + ag0*ydyn_qi[dNodePrime]); - *(here->HSMHVQIgpPtr) += model->HSMHV_type * (ydc_qi[gNodePrime] + ag0*ydyn_qi[gNodePrime]); - *(here->HSMHVQIspPtr) += model->HSMHV_type * (ydc_qi[sNodePrime] + ag0*ydyn_qi[sNodePrime]); - *(here->HSMHVQIbpPtr) += model->HSMHV_type * (ydc_qi[bNodePrime] + ag0*ydyn_qi[bNodePrime]); - *(here->HSMHVQIqiPtr) += (ydc_qi[qiNode] + ag0*ydyn_qi[qiNode]); - if ( flg_tempNode > 0 ) { /* self heating */ - *(here->HSMHVQItempPtr) += (ydc_qi[tempNode] + ag0*ydyn_qi[tempNode]); - } - - /*qb*/ - *(here->HSMHVQBdpPtr) += model->HSMHV_type * (ydc_qb[dNodePrime] + ag0*ydyn_qb[dNodePrime]); - *(here->HSMHVQBgpPtr) += model->HSMHV_type * (ydc_qb[gNodePrime] + ag0*ydyn_qb[gNodePrime]); - *(here->HSMHVQBspPtr) += model->HSMHV_type * (ydc_qb[sNodePrime] + ag0*ydyn_qb[sNodePrime]); - *(here->HSMHVQBbpPtr) += model->HSMHV_type * (ydc_qb[bNodePrime] + ag0*ydyn_qb[bNodePrime]); - *(here->HSMHVQBqbPtr) += (ydc_qb[qbNode] + ag0*ydyn_qb[qbNode]); - if ( flg_tempNode > 0 ) { /* self heating */ - *(here->HSMHVQBtempPtr) += (ydc_qb[tempNode] + ag0*ydyn_qb[tempNode]); - } - } - - -line1000: - - if (ckt->CKTnoncon != noncon_old) { - ckt->CKTtroubleElt = (GENinstance *) here; - } - - - } /* End of MOSFET Instance */ - } /* End of Model Instance */ - - return(OK); -} diff --git a/src/spicelib/devices/hisimhv1/hsmhvld_info_eval.h b/src/spicelib/devices/hisimhv1/hsmhvld_info_eval.h deleted file mode 100644 index ba9a5c3e8..000000000 --- a/src/spicelib/devices/hisimhv1/hsmhvld_info_eval.h +++ /dev/null @@ -1,123 +0,0 @@ -/*********************************************************************** - - HiSIM (Hiroshima University STARC IGFET Model) - Copyright (C) 2012 Hiroshima University & STARC - - MODEL NAME : HiSIM_HV - ( VERSION : 1 SUBVERSION : 2 REVISION : 4 ) - Model Parameter VERSION : 1.23 - FILE : hsmhvld_info_eval.h - - DATE : 2013.04.30 - - recent changes: - 2009.01.09 some bugfixes - - released by - Hiroshima University & - Semiconductor Technology Academic Research Center (STARC) -***********************************************************************/ - - /* print all outputs ------------VV */ - if ( model->HSMHV_info >= 4 ) { - here->HSMHV_csdo = - (here->HSMHV_cddo + here->HSMHV_cgdo + here->HSMHV_cbdo) ; - here->HSMHV_csgo = - (here->HSMHV_cdgo + here->HSMHV_cggo + here->HSMHV_cbgo) ; - here->HSMHV_csbo = - (here->HSMHV_cdbo + here->HSMHV_cgbo + here->HSMHV_cbbo) ; - - here->HSMHV_cdso = - (here->HSMHV_cddo + here->HSMHV_cdgo + here->HSMHV_cdbo) ; - here->HSMHV_cgso = - (here->HSMHV_cgdo + here->HSMHV_cggo + here->HSMHV_cgbo) ; - here->HSMHV_csso = - (here->HSMHV_csdo + here->HSMHV_csgo + here->HSMHV_csbo) ; - - cgdb = dQg_dVds - ((here->HSMHV_mode > 0) ? here->HSMHV_cgdo : here->HSMHV_cgso) ; - cggb = dQg_dVgs - here->HSMHV_cggo ; - cgsb = - (dQg_dVds + dQg_dVgs + dQg_dVbs) - ((here->HSMHV_mode > 0) ? here->HSMHV_cgso : here->HSMHV_cgdo) ; - cbdb = dQb_dVds - ((here->HSMHV_mode > 0) ? here->HSMHV_cbdo : - -(here->HSMHV_cbdo+here->HSMHV_cbgo+here->HSMHV_cbbo)) ; - cbgb = dQb_dVgs - here->HSMHV_cbgo ; - cbsb = - (dQb_dVds + dQb_dVgs + dQb_dVbs) - ((here->HSMHV_mode > 0) ? -(here->HSMHV_cbdo+here->HSMHV_cbgo+here->HSMHV_cbbo) - : here->HSMHV_cbdo) ; - cddb = dQd_dVds - ((here->HSMHV_mode > 0) ? here->HSMHV_cddo : here->HSMHV_csso) ; - cdgb = dQd_dVgs - ((here->HSMHV_mode > 0) ? here->HSMHV_cdgo : here->HSMHV_csgo) ; - cdsb = - (dQd_dVds + dQd_dVgs + dQd_dVbs) - ((here->HSMHV_mode > 0) ? here->HSMHV_cdso : here->HSMHV_csdo) ; - - if (flg_nqs) { - /* by implicit differentiation of the nqs equations: */ - dQi_nqs_dVds = (dQi_dVds + Iqi_nqs * dtau_dVds )/(1.0 + ag0 * tau ) ; - dQi_nqs_dVgs = (dQi_dVgs + Iqi_nqs * dtau_dVgs )/(1.0 + ag0 * tau ) ; - dQi_nqs_dVbs = (dQi_dVbs + Iqi_nqs * dtau_dVbs )/(1.0 + ag0 * tau ) ; - dQb_nqs_dVds = (dQbulk_dVds + Iqb_nqs * dtaub_dVds)/(1.0 + ag0 * taub) ; - dQb_nqs_dVgs = (dQbulk_dVgs + Iqb_nqs * dtaub_dVgs)/(1.0 + ag0 * taub) ; - dQb_nqs_dVbs = (dQbulk_dVbs + Iqb_nqs * dtaub_dVbs)/(1.0 + ag0 * taub) ; - cgdb_nqs = dQg_nqs_dQi_nqs * dQi_nqs_dVds + dQg_nqs_dQb_nqs * dQb_nqs_dVds ; - cggb_nqs = dQg_nqs_dQi_nqs * dQi_nqs_dVgs + dQg_nqs_dQb_nqs * dQb_nqs_dVgs ; - cgsb_nqs = - dQg_nqs_dQi_nqs * (dQi_nqs_dVds + dQi_nqs_dVgs + dQi_nqs_dVbs) - - dQg_nqs_dQb_nqs * (dQb_nqs_dVds + dQb_nqs_dVgs + dQb_nqs_dVbs) ; - cbdb_nqs = dQb_nqs_dVds ; - cbgb_nqs = dQb_nqs_dVgs ; - cbsb_nqs = -(dQb_nqs_dVds + dQb_nqs_dVgs + dQb_nqs_dVbs) ; - cddb_nqs = dQd_nqs_dVds + dQd_nqs_dQi_nqs * dQi_nqs_dVds ; - cdgb_nqs= dQd_nqs_dVgs + dQd_nqs_dQi_nqs * dQi_nqs_dVgs ; - cdsb_nqs= -(dQd_nqs_dVds + dQd_nqs_dVgs + dQd_nqs_dVbs) - dQd_nqs_dQi_nqs * (dQi_nqs_dVds + dQi_nqs_dVgs + dQi_nqs_dVbs) ; - } else { - cgdb_nqs = cggb_nqs = cgsb_nqs = cbdb_nqs = cbgb_nqs = cbsb_nqs = cddb_nqs = cdgb_nqs = cdsb_nqs = 0.0 ; - } - - - printf( "--- variables returned from HSMHVevaluate() ----\n" ) ; - - printf( "von = %12.5e\n" , here->HSMHV_von ) ; - printf( "vdsat = %12.5e\n" , here->HSMHV_vdsat ) ; - printf( "ids = %12.5e\n" , here->HSMHV_ids ) ; - - printf( "gds = %12.5e\n" , here->HSMHV_dIds_dVdsi ) ; - printf( "gm = %12.5e\n" , here->HSMHV_dIds_dVgsi ) ; - printf( "gmbs = %12.5e\n" , here->HSMHV_dIds_dVbsi ) ; - - printf( "cggo = %12.5e\n" , here->HSMHV_cggo ) ; - printf( "cgdo = %12.5e\n" , (here->HSMHV_mode > 0) ? here->HSMHV_cgdo : here->HSMHV_cgso ) ; - printf( "cgso = %12.5e\n" , (here->HSMHV_mode > 0) ? here->HSMHV_cgso : here->HSMHV_cgdo ) ; - printf( "cdgo = %12.5e\n" , (here->HSMHV_mode > 0) ? here->HSMHV_cdgo : here->HSMHV_csgo ) ; - printf( "cddo = %12.5e\n" , (here->HSMHV_mode > 0) ? here->HSMHV_cddo : here->HSMHV_csso ) ; - printf( "cdso = %12.5e\n" , (here->HSMHV_mode > 0) ? here->HSMHV_cdso : here->HSMHV_csdo ) ; - printf( "csgo = %12.5e\n" , (here->HSMHV_mode > 0) ? here->HSMHV_csgo : here->HSMHV_cdgo ) ; - printf( "csdo = %12.5e\n" , (here->HSMHV_mode > 0) ? here->HSMHV_csdo : here->HSMHV_cdso ) ; - printf( "csso = %12.5e\n" , (here->HSMHV_mode > 0) ? here->HSMHV_csso : here->HSMHV_cddo ) ; - - printf( "qg = %12.5e\n" , Qg + Qg_nqs) ; - printf( "qd = %12.5e\n" , Qd + Qd_nqs) ; - printf( "qs = %12.5e\n" , Qs + Qs_nqs) ; - - printf( "cggb = %12.5e\n" , cggb + cggb_nqs ) ; - printf( "cgsb = %12.5e\n" , cgsb + cgsb_nqs ) ; - printf( "cgdb = %12.5e\n" , cgdb + cgdb_nqs ) ; - printf( "cbgb = %12.5e\n" , cbgb + cbgb_nqs ) ; - printf( "cbsb = %12.5e\n" , cbsb + cbsb_nqs ) ; - printf( "cbdb = %12.5e\n" , cbdb + cbdb_nqs ) ; - printf( "cdgb = %12.5e\n" , cdgb + cdgb_nqs ) ; - printf( "cdsb = %12.5e\n" , cdsb + cdsb_nqs ) ; - printf( "cddb = %12.5e\n" , cddb + cddb_nqs ) ; - - printf( "ibd = %12.5e\n" , Ibd ) ; - printf( "ibs = %12.5e\n" , Ibs ) ; - printf( "gbd = %12.5e\n" , Gbd ) ; - printf( "gbs = %12.5e\n" , Gbs ) ; - printf( "capbd = %12.5e\n" , Cbd ) ; - printf( "capbs = %12.5e\n" , Cbs ) ; - printf( "qbd = %12.5e\n" , Qbd ) ; - printf( "qbs = %12.5e\n" , Qbs ) ; - - printf( "isub = %12.5e\n" , here->HSMHV_isub ) ; - printf( "gbgs = %12.5e\n" , dIsub_dVgs + dIsubs_dVgs ) ; - printf( "gbds = %12.5e\n" , dIsub_dVds + dIsubs_dVds ) ; - printf( "gbbs = %12.5e\n" , dIsub_dVbs + dIsubs_dVbs ) ; - - printf( "S_flicker_noise * ( freq / gain ) = %.16e\n" , here->HSMHV_noiflick ) ; - printf( "S_thermal_noise / ( gain * 4kT ) = %.16e\n" , here->HSMHV_noithrml ) ; - printf( "S_induced_gate_noise / ( gain * freq^2 ) = %.16e\n" , here->HSMHV_noiigate ) ; - printf( "cross-correlation coefficient (= Sigid/sqrt(Sig*Sid) ) = %.16e\n" , here->HSMHV_noicross ) ; - /* print Surface Potentials */ -/* printf( "ivds %e ivgs %e ivbs %e Ps0 %.16e Pds %.16e\n" , */ -/* ivds, ivgs, ivbs, here->HSMHV_ps0_prv, here->HSMHV_pds_prv ) ; */ - } - /* print all outputs ------------AA */ - -/* End of HSMHVld_info_eval.h */ diff --git a/src/spicelib/devices/hisimhv1/hsmhvmask.c b/src/spicelib/devices/hisimhv1/hsmhvmask.c deleted file mode 100644 index e601a5e7a..000000000 --- a/src/spicelib/devices/hisimhv1/hsmhvmask.c +++ /dev/null @@ -1,1891 +0,0 @@ -/*********************************************************************** - - HiSIM (Hiroshima University STARC IGFET Model) - Copyright (C) 2012 Hiroshima University & STARC - - MODEL NAME : HiSIM_HV - ( VERSION : 1 SUBVERSION : 2 REVISION : 4 ) - Model Parameter VERSION : 1.23 - FILE : hsmhvmask.c - - DATE : 2013.04.30 - - released by - Hiroshima University & - Semiconductor Technology Academic Research Center (STARC) -***********************************************************************/ - -#include "ngspice/ngspice.h" -#include "ngspice/ifsim.h" -#include "ngspice/cktdefs.h" -#include "ngspice/devdefs.h" -#include "hsmhvdef.h" -#include "ngspice/sperror.h" -#include "ngspice/suffix.h" - -int HSMHVmAsk( - CKTcircuit *ckt, - GENmodel *inst, - int which, - IFvalue *value) -{ - HSMHVmodel *model = (HSMHVmodel *)inst; - - NG_IGNORE(ckt); - - switch (which) { - case HSMHV_MOD_NMOS: - value->iValue = model->HSMHV_type; - return(OK); - case HSMHV_MOD_PMOS: - value->iValue = model->HSMHV_type; - return(OK); - case HSMHV_MOD_LEVEL: - value->iValue = model->HSMHV_level; - return(OK); - case HSMHV_MOD_INFO: - value->iValue = model->HSMHV_info; - return(OK); - case HSMHV_MOD_NOISE: - value->iValue = model->HSMHV_noise; - return(OK); - case HSMHV_MOD_VERSION: - value->sValue = model->HSMHV_version; - return(OK); - case HSMHV_MOD_SHOW: - value->iValue = model->HSMHV_show; - return(OK); - case HSMHV_MOD_CORSRD: - value->iValue = model->HSMHV_corsrd; - return(OK); - case HSMHV_MOD_CORG: - value->iValue = model->HSMHV_corg; - return(OK); - case HSMHV_MOD_COIPRV: - value->iValue = model->HSMHV_coiprv; - return(OK); - case HSMHV_MOD_COPPRV: - value->iValue = model->HSMHV_copprv; - return(OK); - case HSMHV_MOD_COADOV: - value->iValue = model->HSMHV_coadov; - return(OK); - case HSMHV_MOD_COISUB: - value->iValue = model->HSMHV_coisub; - return(OK); - case HSMHV_MOD_COIIGS: - value->iValue = model->HSMHV_coiigs; - return(OK); - case HSMHV_MOD_COGIDL: - value->iValue = model->HSMHV_cogidl; - return(OK); - case HSMHV_MOD_COOVLP: - value->iValue = model->HSMHV_coovlp; - return(OK); - case HSMHV_MOD_COOVLPS: - value->iValue = model->HSMHV_coovlps; - return(OK); - case HSMHV_MOD_COFLICK: - value->iValue = model->HSMHV_coflick; - return(OK); - case HSMHV_MOD_COISTI: - value->iValue = model->HSMHV_coisti; - return(OK); - case HSMHV_MOD_CONQS: - value->iValue = model->HSMHV_conqs; - return(OK); - case HSMHV_MOD_CORBNET: - value->iValue = model->HSMHV_corbnet; - return(OK); - case HSMHV_MOD_COTHRML: - value->iValue = model->HSMHV_cothrml; - return(OK); - case HSMHV_MOD_COIGN: - value->iValue = model->HSMHV_coign; - return(OK); - case HSMHV_MOD_CODFM: - value->iValue = model->HSMHV_codfm; - return(OK); - case HSMHV_MOD_COQOVSM: - value->iValue = model->HSMHV_coqovsm; - return(OK); - case HSMHV_MOD_COSELFHEAT: /* Self-heating model */ - value->iValue = model->HSMHV_coselfheat; - return(OK); - case HSMHV_MOD_COSUBNODE: - value->iValue = model->HSMHV_cosubnode; - return(OK); - case HSMHV_MOD_COSYM: /* Symmetry model for HV */ - value->iValue = model->HSMHV_cosym; - return(OK); - case HSMHV_MOD_COTEMP: - value->iValue = model->HSMHV_cotemp; - return(OK); - case HSMHV_MOD_COLDRIFT: - value->iValue = model->HSMHV_coldrift; - return(OK); - case HSMHV_MOD_VMAX: - value->rValue = model->HSMHV_vmax; - return(OK); - case HSMHV_MOD_VMAXT1: - value->rValue = model->HSMHV_vmaxt1; - return(OK); - case HSMHV_MOD_VMAXT2: - value->rValue = model->HSMHV_vmaxt2; - return(OK); - case HSMHV_MOD_BGTMP1: - value->rValue = model->HSMHV_bgtmp1; - return(OK); - case HSMHV_MOD_BGTMP2: - value->rValue = model->HSMHV_bgtmp2; - return(OK); - case HSMHV_MOD_EG0: - value->rValue = model->HSMHV_eg0; - return(OK); - case HSMHV_MOD_TOX: - value->rValue = model->HSMHV_tox; - return(OK); - case HSMHV_MOD_XLD: - value->rValue = model->HSMHV_xld; - return(OK); - case HSMHV_MOD_LOVER: - value->rValue = model->HSMHV_lover; - return(OK); - case HSMHV_MOD_LOVERS: - value->rValue = model->HSMHV_lovers; - return(OK); - case HSMHV_MOD_RDOV11: - value->rValue = model->HSMHV_rdov11; - return(OK); - case HSMHV_MOD_RDOV12: - value->rValue = model->HSMHV_rdov12; - return(OK); - case HSMHV_MOD_RDOV13: - value->rValue = model->HSMHV_rdov13; - return(OK); - case HSMHV_MOD_RDSLP1: - value->rValue = model->HSMHV_rdslp1; - return(OK); - case HSMHV_MOD_RDICT1: - value->rValue = model->HSMHV_rdict1; - return(OK); - case HSMHV_MOD_RDSLP2: - value->rValue = model->HSMHV_rdslp2; - return(OK); - case HSMHV_MOD_RDICT2: - value->rValue = model->HSMHV_rdict2; - return(OK); - case HSMHV_MOD_LOVERLD: - value->rValue = model->HSMHV_loverld; - return(OK); - case HSMHV_MOD_LDRIFT1: - value->rValue = model->HSMHV_ldrift1; - return(OK); - case HSMHV_MOD_LDRIFT2: - value->rValue = model->HSMHV_ldrift2; - return(OK); - case HSMHV_MOD_LDRIFT1S: - value->rValue = model->HSMHV_ldrift1s; - return(OK); - case HSMHV_MOD_LDRIFT2S: - value->rValue = model->HSMHV_ldrift2s; - return(OK); - case HSMHV_MOD_SUBLD1: - value->rValue = model->HSMHV_subld1; - return(OK); - case HSMHV_MOD_SUBLD2: - value->rValue = model->HSMHV_subld2; - return(OK); - case HSMHV_MOD_DDLTMAX: /* Vdseff */ - value->rValue = model->HSMHV_ddltmax; - return(OK); - case HSMHV_MOD_DDLTSLP: /* Vdseff */ - value->rValue = model->HSMHV_ddltslp; - return(OK); - case HSMHV_MOD_DDLTICT: /* Vdseff */ - value->rValue = model->HSMHV_ddltict; - return(OK); - case HSMHV_MOD_VFBOVER: - value->rValue = model->HSMHV_vfbover; - return(OK); - case HSMHV_MOD_NOVER: - value->rValue = model->HSMHV_nover; - return(OK); - case HSMHV_MOD_NOVERS: - value->rValue = model->HSMHV_novers; - return(OK); - case HSMHV_MOD_XWD: - value->rValue = model->HSMHV_xwd; - return(OK); - case HSMHV_MOD_XWDC: - value->rValue = model->HSMHV_xwdc; - return(OK); - case HSMHV_MOD_XL: - value->rValue = model->HSMHV_xl; - return(OK); - case HSMHV_MOD_XW: - value->rValue = model->HSMHV_xw; - return(OK); - case HSMHV_MOD_SAREF: - value->rValue = model->HSMHV_saref; - return(OK); - case HSMHV_MOD_SBREF: - value->rValue = model->HSMHV_sbref; - return(OK); - case HSMHV_MOD_LL: - value->rValue = model->HSMHV_ll; - return(OK); - case HSMHV_MOD_LLD: - value->rValue = model->HSMHV_lld; - return(OK); - case HSMHV_MOD_LLN: - value->rValue = model->HSMHV_lln; - return(OK); - case HSMHV_MOD_WL: - value->rValue = model->HSMHV_wl; - return(OK); - case HSMHV_MOD_WL1: - value->rValue = model->HSMHV_wl1; - return(OK); - case HSMHV_MOD_WL1P: - value->rValue = model->HSMHV_wl1p; - return(OK); - case HSMHV_MOD_WL2: - value->rValue = model->HSMHV_wl2; - return(OK); - case HSMHV_MOD_WL2P: - value->rValue = model->HSMHV_wl2p; - return(OK); - case HSMHV_MOD_WLD: - value->rValue = model->HSMHV_wld; - return(OK); - case HSMHV_MOD_WLN: - value->rValue = model->HSMHV_wln; - return(OK); - case HSMHV_MOD_XQY: - value->rValue = model->HSMHV_xqy; - return(OK); - case HSMHV_MOD_XQY1: - value->rValue = model->HSMHV_xqy1; - return(OK); - case HSMHV_MOD_XQY2: - value->rValue = model->HSMHV_xqy2; - return(OK); - case HSMHV_MOD_RS: - value->rValue = model->HSMHV_rs; - return(OK); - case HSMHV_MOD_RD: - value->rValue = model->HSMHV_rd; - return(OK); - case HSMHV_MOD_RSH: - value->rValue = model->HSMHV_rsh; - return(OK); - case HSMHV_MOD_RSHG: - value->rValue = model->HSMHV_rshg; - return(OK); - case HSMHV_MOD_VFBC: - value->rValue = model->HSMHV_vfbc; - return(OK); - case HSMHV_MOD_VBI: - value->rValue = model->HSMHV_vbi; - return(OK); - case HSMHV_MOD_NSUBC: - value->rValue = model->HSMHV_nsubc; - return(OK); - case HSMHV_MOD_PARL2: - value->rValue = model->HSMHV_parl2; - return(OK); - case HSMHV_MOD_LP: - value->rValue = model->HSMHV_lp; - return(OK); - case HSMHV_MOD_NSUBP: - value->rValue = model->HSMHV_nsubp; - return(OK); - case HSMHV_MOD_NSUBP0: - value->rValue = model->HSMHV_nsubp0; - return(OK); - case HSMHV_MOD_NSUBWP: - value->rValue = model->HSMHV_nsubwp; - return(OK); - case HSMHV_MOD_SCP1: - value->rValue = model->HSMHV_scp1; - return(OK); - case HSMHV_MOD_SCP2: - value->rValue = model->HSMHV_scp2; - return(OK); - case HSMHV_MOD_SCP3: - value->rValue = model->HSMHV_scp3; - return(OK); - case HSMHV_MOD_SC1: - value->rValue = model->HSMHV_sc1; - return(OK); - case HSMHV_MOD_SC2: - value->rValue = model->HSMHV_sc2; - return(OK); - case HSMHV_MOD_SC3: - value->rValue = model->HSMHV_sc3; - return(OK); - case HSMHV_MOD_SC4: - value->rValue = model->HSMHV_sc4; - return(OK); - case HSMHV_MOD_PGD1: - value->rValue = model->HSMHV_pgd1; - return(OK); - case HSMHV_MOD_PGD2: - value->rValue = model->HSMHV_pgd2; - return(OK); - case HSMHV_MOD_PGD3: - value->rValue = model->HSMHV_pgd3; - return(OK); - case HSMHV_MOD_PGD4: - value->rValue = model->HSMHV_pgd4; - return(OK); - case HSMHV_MOD_NDEP: - value->rValue = model->HSMHV_ndep; - return(OK); - case HSMHV_MOD_NDEPL: - value->rValue = model->HSMHV_ndepl; - return(OK); - case HSMHV_MOD_NDEPLP: - value->rValue = model->HSMHV_ndeplp; - return(OK); - case HSMHV_MOD_NINV: - value->rValue = model->HSMHV_ninv; - return(OK); - case HSMHV_MOD_MUECB0: - value->rValue = model->HSMHV_muecb0; - return(OK); - case HSMHV_MOD_MUECB1: - value->rValue = model->HSMHV_muecb1; - return(OK); - case HSMHV_MOD_MUEPH1: - value->rValue = model->HSMHV_mueph1; - return(OK); - case HSMHV_MOD_MUEPH0: - value->rValue = model->HSMHV_mueph0; - return(OK); - case HSMHV_MOD_MUEPHW: - value->rValue = model->HSMHV_muephw; - return(OK); - case HSMHV_MOD_MUEPWP: - value->rValue = model->HSMHV_muepwp; - return(OK); - case HSMHV_MOD_MUEPHL: - value->rValue = model->HSMHV_muephl; - return(OK); - case HSMHV_MOD_MUEPLP: - value->rValue = model->HSMHV_mueplp; - return(OK); - case HSMHV_MOD_MUEPHS: - value->rValue = model->HSMHV_muephs; - return(OK); - case HSMHV_MOD_MUEPSP: - value->rValue = model->HSMHV_muepsp; - return(OK); - case HSMHV_MOD_VTMP: - value->rValue = model->HSMHV_vtmp; - return(OK); - case HSMHV_MOD_WVTH0: - value->rValue = model->HSMHV_wvth0; - return(OK); - case HSMHV_MOD_MUESR1: - value->rValue = model->HSMHV_muesr1; - return(OK); - case HSMHV_MOD_MUESR0: - value->rValue = model->HSMHV_muesr0; - return(OK); - case HSMHV_MOD_MUESRL: - value->rValue = model->HSMHV_muesrl; - return(OK); - case HSMHV_MOD_MUESLP: - value->rValue = model->HSMHV_mueslp; - return(OK); - case HSMHV_MOD_MUESRW: - value->rValue = model->HSMHV_muesrw; - return(OK); - case HSMHV_MOD_MUESWP: - value->rValue = model->HSMHV_mueswp; - return(OK); - case HSMHV_MOD_BB: - value->rValue = model->HSMHV_bb; - return(OK); - case HSMHV_MOD_SUB1: - value->rValue = model->HSMHV_sub1; - return(OK); - case HSMHV_MOD_SUB2: - value->rValue = model->HSMHV_sub2; - return(OK); - case HSMHV_MOD_SVGS: - value->rValue = model->HSMHV_svgs; - return(OK); - case HSMHV_MOD_SVGSL: - value->rValue = model->HSMHV_svgsl; - return(OK); - case HSMHV_MOD_SVGSLP: - value->rValue = model->HSMHV_svgslp; - return(OK); - case HSMHV_MOD_SVGSW: - value->rValue = model->HSMHV_svgsw; - return(OK); - case HSMHV_MOD_SVGSWP: - value->rValue = model->HSMHV_svgswp; - return(OK); - case HSMHV_MOD_SVBS: - value->rValue = model->HSMHV_svbs; - return(OK); - case HSMHV_MOD_SVBSL: - value->rValue = model->HSMHV_svbsl; - return(OK); - case HSMHV_MOD_SVBSLP: - value->rValue = model->HSMHV_svbslp; - return(OK); - case HSMHV_MOD_SVDS: - value->rValue = model->HSMHV_svds; - return(OK); - case HSMHV_MOD_SLG: - value->rValue = model->HSMHV_slg; - return(OK); - case HSMHV_MOD_SLGL: - value->rValue = model->HSMHV_slgl; - return(OK); - case HSMHV_MOD_SLGLP: - value->rValue = model->HSMHV_slglp; - return(OK); - case HSMHV_MOD_SUB1L: - value->rValue = model->HSMHV_sub1l; - return(OK); - case HSMHV_MOD_SUB1LP: - value->rValue = model->HSMHV_sub1lp; - return(OK); - case HSMHV_MOD_SUB2L: - value->rValue = model->HSMHV_sub2l; - return(OK); - case HSMHV_MOD_FN1: - value->rValue = model->HSMHV_fn1; - return(OK); - case HSMHV_MOD_FN2: - value->rValue = model->HSMHV_fn2; - return(OK); - case HSMHV_MOD_FN3: - value->rValue = model->HSMHV_fn3; - return(OK); - case HSMHV_MOD_FVBS: - value->rValue = model->HSMHV_fvbs; - return(OK); - case HSMHV_MOD_NSTI: - value->rValue = model->HSMHV_nsti; - return(OK); - case HSMHV_MOD_WSTI: - value->rValue = model->HSMHV_wsti; - return(OK); - case HSMHV_MOD_WSTIL: - value->rValue = model->HSMHV_wstil; - return(OK); - case HSMHV_MOD_WSTILP: - value->rValue = model->HSMHV_wstilp; - return(OK); - case HSMHV_MOD_WSTIW: - value->rValue = model->HSMHV_wstiw; - return(OK); - case HSMHV_MOD_WSTIWP: - value->rValue = model->HSMHV_wstiwp; - return(OK); - case HSMHV_MOD_SCSTI1: - value->rValue = model->HSMHV_scsti1; - return(OK); - case HSMHV_MOD_SCSTI2: - value->rValue = model->HSMHV_scsti2; - return(OK); - case HSMHV_MOD_VTHSTI: - value->rValue = model->HSMHV_vthsti; - return(OK); - case HSMHV_MOD_VDSTI: - value->rValue = model->HSMHV_vdsti; - return(OK); - case HSMHV_MOD_MUESTI1: - value->rValue = model->HSMHV_muesti1; - return(OK); - case HSMHV_MOD_MUESTI2: - value->rValue = model->HSMHV_muesti2; - return(OK); - case HSMHV_MOD_MUESTI3: - value->rValue = model->HSMHV_muesti3; - return(OK); - case HSMHV_MOD_NSUBPSTI1: - value->rValue = model->HSMHV_nsubpsti1; - return(OK); - case HSMHV_MOD_NSUBPSTI2: - value->rValue = model->HSMHV_nsubpsti2; - return(OK); - case HSMHV_MOD_NSUBPSTI3: - value->rValue = model->HSMHV_nsubpsti3; - return(OK); - case HSMHV_MOD_LPEXT: - value->rValue = model->HSMHV_lpext; - return(OK); - case HSMHV_MOD_NPEXT: - value->rValue = model->HSMHV_npext; - return(OK); - case HSMHV_MOD_SCP22: - value->rValue = model->HSMHV_scp22; - return(OK); - case HSMHV_MOD_SCP21: - value->rValue = model->HSMHV_scp21; - return(OK); - case HSMHV_MOD_BS1: - value->rValue = model->HSMHV_bs1; - return(OK); - case HSMHV_MOD_BS2: - value->rValue = model->HSMHV_bs2; - return(OK); - case HSMHV_MOD_CGSO: - value->rValue = model->HSMHV_cgso; - return(OK); - case HSMHV_MOD_CGDO: - value->rValue = model->HSMHV_cgdo; - return(OK); - case HSMHV_MOD_CGBO: - value->rValue = model->HSMHV_cgbo; - return(OK); - case HSMHV_MOD_TPOLY: - value->rValue = model->HSMHV_tpoly; - return(OK); - case HSMHV_MOD_JS0: - value->rValue = model->HSMHV_js0; - return(OK); - case HSMHV_MOD_JS0SW: - value->rValue = model->HSMHV_js0sw; - return(OK); - case HSMHV_MOD_NJ: - value->rValue = model->HSMHV_nj; - return(OK); - case HSMHV_MOD_NJSW: - value->rValue = model->HSMHV_njsw; - return(OK); - case HSMHV_MOD_XTI: - value->rValue = model->HSMHV_xti; - return(OK); - case HSMHV_MOD_CJ: - value->rValue = model->HSMHV_cj; - return(OK); - case HSMHV_MOD_CJSW: - value->rValue = model->HSMHV_cjsw; - return(OK); - case HSMHV_MOD_CJSWG: - value->rValue = model->HSMHV_cjswg; - return(OK); - case HSMHV_MOD_MJ: - value->rValue = model->HSMHV_mj; - return(OK); - case HSMHV_MOD_MJSW: - value->rValue = model->HSMHV_mjsw; - return(OK); - case HSMHV_MOD_MJSWG: - value->rValue = model->HSMHV_mjswg; - return(OK); - case HSMHV_MOD_PB: - value->rValue = model->HSMHV_pb; - return(OK); - case HSMHV_MOD_PBSW: - value->rValue = model->HSMHV_pbsw; - return(OK); - case HSMHV_MOD_PBSWG: - value->rValue = model->HSMHV_pbswg; - return(OK); - case HSMHV_MOD_XTI2: - value->rValue = model->HSMHV_xti2; - return(OK); - case HSMHV_MOD_CISB: - value->rValue = model->HSMHV_cisb; - return(OK); - case HSMHV_MOD_CVB: - value->rValue = model->HSMHV_cvb; - return(OK); - case HSMHV_MOD_CTEMP: - value->rValue = model->HSMHV_ctemp; - return(OK); - case HSMHV_MOD_CISBK: - value->rValue = model->HSMHV_cisbk; - return(OK); - case HSMHV_MOD_CVBK: - value->rValue = model->HSMHV_cvbk; - return(OK); - case HSMHV_MOD_DIVX: - value->rValue = model->HSMHV_divx; - return(OK); - case HSMHV_MOD_CLM1: - value->rValue = model->HSMHV_clm1; - return(OK); - case HSMHV_MOD_CLM2: - value->rValue = model->HSMHV_clm2; - return(OK); - case HSMHV_MOD_CLM3: - value->rValue = model->HSMHV_clm3; - return(OK); - case HSMHV_MOD_CLM5: - value->rValue = model->HSMHV_clm5; - return(OK); - case HSMHV_MOD_CLM6: - value->rValue = model->HSMHV_clm6; - return(OK); - case HSMHV_MOD_MUETMP: - value->rValue = model->HSMHV_muetmp; - return(OK); - case HSMHV_MOD_VOVER: - value->rValue = model->HSMHV_vover; - return(OK); - case HSMHV_MOD_VOVERP: - value->rValue = model->HSMHV_voverp; - return(OK); - case HSMHV_MOD_VOVERS: - value->rValue = model->HSMHV_vovers; - return(OK); - case HSMHV_MOD_VOVERSP: - value->rValue = model->HSMHV_voversp; - return(OK); - case HSMHV_MOD_WFC: - value->rValue = model->HSMHV_wfc; - return(OK); - case HSMHV_MOD_NSUBCW: - value->rValue = model->HSMHV_nsubcw; - return(OK); - case HSMHV_MOD_NSUBCWP: - value->rValue = model->HSMHV_nsubcwp; - return(OK); - case HSMHV_MOD_QME1: - value->rValue = model->HSMHV_qme1; - return(OK); - case HSMHV_MOD_QME2: - value->rValue = model->HSMHV_qme2; - return(OK); - case HSMHV_MOD_QME3: - value->rValue = model->HSMHV_qme3; - return(OK); - case HSMHV_MOD_GIDL1: - value->rValue = model->HSMHV_gidl1; - return(OK); - case HSMHV_MOD_GIDL2: - value->rValue = model->HSMHV_gidl2; - return(OK); - case HSMHV_MOD_GIDL3: - value->rValue = model->HSMHV_gidl3; - return(OK); - case HSMHV_MOD_GIDL4: - value->rValue = model->HSMHV_gidl4; - return(OK); - case HSMHV_MOD_GIDL5: - value->rValue = model->HSMHV_gidl5; - return(OK); - case HSMHV_MOD_GLEAK1: - value->rValue = model->HSMHV_gleak1; - return(OK); - case HSMHV_MOD_GLEAK2: - value->rValue = model->HSMHV_gleak2; - return(OK); - case HSMHV_MOD_GLEAK3: - value->rValue = model->HSMHV_gleak3; - return(OK); - case HSMHV_MOD_GLEAK4: - value->rValue = model->HSMHV_gleak4; - return(OK); - case HSMHV_MOD_GLEAK5: - value->rValue = model->HSMHV_gleak5; - return(OK); - case HSMHV_MOD_GLEAK6: - value->rValue = model->HSMHV_gleak6; - return(OK); - case HSMHV_MOD_GLEAK7: - value->rValue = model->HSMHV_gleak7; - return(OK); - case HSMHV_MOD_GLPART1: - value->rValue = model->HSMHV_glpart1; - return(OK); - case HSMHV_MOD_GLKSD1: - value->rValue = model->HSMHV_glksd1; - return(OK); - case HSMHV_MOD_GLKSD2: - value->rValue = model->HSMHV_glksd2; - return(OK); - case HSMHV_MOD_GLKSD3: - value->rValue = model->HSMHV_glksd3; - return(OK); - case HSMHV_MOD_GLKB1: - value->rValue = model->HSMHV_glkb1; - return(OK); - case HSMHV_MOD_GLKB2: - value->rValue = model->HSMHV_glkb2; - return(OK); - case HSMHV_MOD_GLKB3: - value->rValue = model->HSMHV_glkb3; - return(OK); - case HSMHV_MOD_EGIG: - value->rValue = model->HSMHV_egig; - return(OK); - case HSMHV_MOD_IGTEMP2: - value->rValue = model->HSMHV_igtemp2; - return(OK); - case HSMHV_MOD_IGTEMP3: - value->rValue = model->HSMHV_igtemp3; - return(OK); - case HSMHV_MOD_VZADD0: - value->rValue = model->HSMHV_vzadd0; - return(OK); - case HSMHV_MOD_PZADD0: - value->rValue = model->HSMHV_pzadd0; - return(OK); - case HSMHV_MOD_NFTRP: - value->rValue = model->HSMHV_nftrp; - return(OK); - case HSMHV_MOD_NFALP: - value->rValue = model->HSMHV_nfalp; - return(OK); - case HSMHV_MOD_CIT: - value->rValue = model->HSMHV_cit; - return(OK); - case HSMHV_MOD_FALPH: - value->rValue = model->HSMHV_falph; - return(OK); - case HSMHV_MOD_KAPPA: - value->rValue = model->HSMHV_kappa; - return(OK); - case HSMHV_MOD_PTHROU: - value->rValue = model->HSMHV_pthrou; - return(OK); - case HSMHV_MOD_VDIFFJ: - value->rValue = model->HSMHV_vdiffj; - return(OK); - case HSMHV_MOD_DLY1: - value->rValue = model->HSMHV_dly1; - return(OK); - case HSMHV_MOD_DLY2: - value->rValue = model->HSMHV_dly2; - return(OK); - case HSMHV_MOD_DLY3: - value->rValue = model->HSMHV_dly3; - return(OK); - case HSMHV_MOD_DLYOV: - value->rValue = model->HSMHV_dlyov; - return(OK); - - - case HSMHV_MOD_TNOM: - value->rValue = model->HSMHV_tnom; - return(OK); - case HSMHV_MOD_OVSLP: - value->rValue = model->HSMHV_ovslp; - return(OK); - case HSMHV_MOD_OVMAG: - value->rValue = model->HSMHV_ovmag; - return(OK); - case HSMHV_MOD_GBMIN: - value->rValue = model->HSMHV_gbmin; - return(OK); - case HSMHV_MOD_RBPB: - value->rValue = model->HSMHV_rbpb; - return(OK); - case HSMHV_MOD_RBPD: - value->rValue = model->HSMHV_rbpd; - return(OK); - case HSMHV_MOD_RBPS: - value->rValue = model->HSMHV_rbps; - return(OK); - case HSMHV_MOD_RBDB: - value->rValue = model->HSMHV_rbdb; - return(OK); - case HSMHV_MOD_RBSB: - value->rValue = model->HSMHV_rbsb; - return(OK); - case HSMHV_MOD_IBPC1: - value->rValue = model->HSMHV_ibpc1; - return(OK); - case HSMHV_MOD_IBPC2: - value->rValue = model->HSMHV_ibpc2; - return(OK); - case HSMHV_MOD_MPHDFM: - value->rValue = model->HSMHV_mphdfm; - return(OK); - case HSMHV_MOD_RDVG11: - value->rValue = model->HSMHV_rdvg11; - return(OK); - case HSMHV_MOD_RDVG12: - value->rValue = model->HSMHV_rdvg12; - return(OK); - case HSMHV_MOD_RTH0: /* Self-heating model */ - value->rValue = model->HSMHV_rth0; - return(OK); - case HSMHV_MOD_CTH0: /* Self-heating model */ - value->rValue = model->HSMHV_cth0; - return(OK); - case HSMHV_MOD_POWRAT: /* Self-heating model */ - value->rValue = model->HSMHV_powrat; - return(OK); - case HSMHV_MOD_RTHTEMP1: /* Self-heating model */ - value->rValue = model->HSMHV_rthtemp1; - return(OK); - case HSMHV_MOD_RTHTEMP2: /* Self-heating model */ - value->rValue = model->HSMHV_rthtemp2; - return(OK); - case HSMHV_MOD_PRATTEMP1: /* Self-heating model */ - value->rValue = model->HSMHV_prattemp1; - return(OK); - case HSMHV_MOD_PRATTEMP2: /* Self-heating model */ - value->rValue = model->HSMHV_prattemp2; - return(OK); - - - - case HSMHV_MOD_TCJBD: /* Self-heating model */ - value->rValue = model->HSMHV_tcjbd; - return(OK); - case HSMHV_MOD_TCJBS: /* Self-heating model */ - value->rValue = model->HSMHV_tcjbs; - return(OK); - case HSMHV_MOD_TCJBDSW: /* Self-heating model */ - value->rValue = model->HSMHV_tcjbdsw; - return(OK); - case HSMHV_MOD_TCJBSSW: /* Self-heating model */ - value->rValue = model->HSMHV_tcjbssw; - return(OK); - case HSMHV_MOD_TCJBDSWG: /* Self-heating model */ - value->rValue = model->HSMHV_tcjbdswg; - return(OK); - case HSMHV_MOD_TCJBSSWG: /* Self-heating model */ - value->rValue = model->HSMHV_tcjbsswg; - return(OK); -/* case HSMHV_MOD_WTH0: */ -/* value->rValue = model->HSMHV_wth0; */ -/* return(OK); */ - case HSMHV_MOD_QDFTVD: - value->rValue = model->HSMHV_qdftvd; - return(OK); - case HSMHV_MOD_XLDLD: - value->rValue = model->HSMHV_xldld; - return(OK); - case HSMHV_MOD_XWDLD: - value->rValue = model->HSMHV_xwdld; - return(OK); - case HSMHV_MOD_RDVD: - value->rValue = model->HSMHV_rdvd; - return(OK); - case HSMHV_MOD_RD20: - value->rValue = model->HSMHV_rd20; - return(OK); - case HSMHV_MOD_QOVSM: - value->rValue = model->HSMHV_qovsm; - return(OK); - case HSMHV_MOD_LDRIFT: - value->rValue = model->HSMHV_ldrift; - return(OK); - case HSMHV_MOD_RD21: - value->rValue = model->HSMHV_rd21; - return(OK); - case HSMHV_MOD_RD22: - value->rValue = model->HSMHV_rd22; - return(OK); - case HSMHV_MOD_RD22D: - value->rValue = model->HSMHV_rd22d; - return(OK); - case HSMHV_MOD_RD23: - value->rValue = model->HSMHV_rd23; - return(OK); - case HSMHV_MOD_RD24: - value->rValue = model->HSMHV_rd24; - return(OK); - case HSMHV_MOD_RD25: - value->rValue = model->HSMHV_rd25; - return(OK); - case HSMHV_MOD_RD26: - value->rValue = model->HSMHV_rd26; - return(OK); - case HSMHV_MOD_RDVDL: - value->rValue = model->HSMHV_rdvdl; - return(OK); - case HSMHV_MOD_RDVDLP: - value->rValue = model->HSMHV_rdvdlp; - return(OK); - case HSMHV_MOD_RDVDS: - value->rValue = model->HSMHV_rdvds; - return(OK); - case HSMHV_MOD_RDVDSP: - value->rValue = model->HSMHV_rdvdsp; - return(OK); - case HSMHV_MOD_RD23L: - value->rValue = model->HSMHV_rd23l; - return(OK); - case HSMHV_MOD_RD23LP: - value->rValue = model->HSMHV_rd23lp; - return(OK); - case HSMHV_MOD_RD23S: - value->rValue = model->HSMHV_rd23s; - return(OK); - case HSMHV_MOD_RD23SP: - value->rValue = model->HSMHV_rd23sp; - return(OK); - case HSMHV_MOD_RDS: - value->rValue = model->HSMHV_rds; - return(OK); - case HSMHV_MOD_RDSP: - value->rValue = model->HSMHV_rdsp; - return(OK); - case HSMHV_MOD_RDTEMP1: - value->rValue = model->HSMHV_rdtemp1; - return(OK); - case HSMHV_MOD_RDTEMP2: - value->rValue = model->HSMHV_rdtemp2; - return(OK); - case HSMHV_MOD_RTH0R: - value->rValue = model->HSMHV_rth0r; - return(OK); - case HSMHV_MOD_RDVDTEMP1: - value->rValue = model->HSMHV_rdvdtemp1; - return(OK); - case HSMHV_MOD_RDVDTEMP2: - value->rValue = model->HSMHV_rdvdtemp2; - return(OK); - case HSMHV_MOD_RTH0W: - value->rValue = model->HSMHV_rth0w; - return(OK); - case HSMHV_MOD_RTH0WP: - value->rValue = model->HSMHV_rth0wp; - return(OK); - case HSMHV_MOD_CVDSOVER: - value->rValue = model->HSMHV_cvdsover; - return(OK); - - case HSMHV_MOD_NINVD: - value->rValue = model->HSMHV_ninvd; - return(OK); - case HSMHV_MOD_NINVDW: - value->rValue = model->HSMHV_ninvdw; - return(OK); - case HSMHV_MOD_NINVDWP: - value->rValue = model->HSMHV_ninvdwp; - return(OK); - case HSMHV_MOD_NINVDT1: - value->rValue = model->HSMHV_ninvdt1; - return(OK); - case HSMHV_MOD_NINVDT2: - value->rValue = model->HSMHV_ninvdt2; - return(OK); - case HSMHV_MOD_VBSMIN: - value->rValue = model->HSMHV_vbsmin; - return(OK); - case HSMHV_MOD_RDVB: - value->rValue = model->HSMHV_rdvb; - return(OK); - case HSMHV_MOD_RTH0NF: - value->rValue = model->HSMHV_rth0nf; - return(OK); - - case HSMHV_MOD_RDVSUB: - value->rValue = model->HSMHV_rdvsub; - return(OK); - case HSMHV_MOD_RDVDSUB: - value->rValue = model->HSMHV_rdvdsub; - return(OK); - case HSMHV_MOD_DDRIFT: - value->rValue = model->HSMHV_ddrift; - return(OK); - case HSMHV_MOD_VBISUB: - value->rValue = model->HSMHV_vbisub; - return(OK); - case HSMHV_MOD_NSUBSUB: - value->rValue = model->HSMHV_nsubsub; - return(OK); - case HSMHV_MOD_SHEMAX: - value->rValue = model->HSMHV_shemax; - return(OK); - - /* binning parameters */ - case HSMHV_MOD_LMIN: - value->rValue = model->HSMHV_lmin; - return(OK); - case HSMHV_MOD_LMAX: - value->rValue = model->HSMHV_lmax; - return(OK); - case HSMHV_MOD_WMIN: - value->rValue = model->HSMHV_wmin; - return(OK); - case HSMHV_MOD_WMAX: - value->rValue = model->HSMHV_wmax; - return(OK); - case HSMHV_MOD_LBINN: - value->rValue = model->HSMHV_lbinn; - return(OK); - case HSMHV_MOD_WBINN: - value->rValue = model->HSMHV_wbinn; - return(OK); - - /* Length dependence */ - case HSMHV_MOD_LVMAX: - value->rValue = model->HSMHV_lvmax; - return(OK); - case HSMHV_MOD_LBGTMP1: - value->rValue = model->HSMHV_lbgtmp1; - return(OK); - case HSMHV_MOD_LBGTMP2: - value->rValue = model->HSMHV_lbgtmp2; - return(OK); - case HSMHV_MOD_LEG0: - value->rValue = model->HSMHV_leg0; - return(OK); - case HSMHV_MOD_LVFBOVER: - value->rValue = model->HSMHV_lvfbover; - return(OK); - case HSMHV_MOD_LNOVER: - value->rValue = model->HSMHV_lnover; - return(OK); - case HSMHV_MOD_LNOVERS: - value->rValue = model->HSMHV_lnovers; - return(OK); - case HSMHV_MOD_LWL2: - value->rValue = model->HSMHV_lwl2; - return(OK); - case HSMHV_MOD_LVFBC: - value->rValue = model->HSMHV_lvfbc; - return(OK); - case HSMHV_MOD_LNSUBC: - value->rValue = model->HSMHV_lnsubc; - return(OK); - case HSMHV_MOD_LNSUBP: - value->rValue = model->HSMHV_lnsubp; - return(OK); - case HSMHV_MOD_LSCP1: - value->rValue = model->HSMHV_lscp1; - return(OK); - case HSMHV_MOD_LSCP2: - value->rValue = model->HSMHV_lscp2; - return(OK); - case HSMHV_MOD_LSCP3: - value->rValue = model->HSMHV_lscp3; - return(OK); - case HSMHV_MOD_LSC1: - value->rValue = model->HSMHV_lsc1; - return(OK); - case HSMHV_MOD_LSC2: - value->rValue = model->HSMHV_lsc2; - return(OK); - case HSMHV_MOD_LSC3: - value->rValue = model->HSMHV_lsc3; - return(OK); - case HSMHV_MOD_LPGD1: - value->rValue = model->HSMHV_lpgd1; - return(OK); - case HSMHV_MOD_LPGD3: - value->rValue = model->HSMHV_lpgd3; - return(OK); - case HSMHV_MOD_LNDEP: - value->rValue = model->HSMHV_lndep; - return(OK); - case HSMHV_MOD_LNINV: - value->rValue = model->HSMHV_lninv; - return(OK); - case HSMHV_MOD_LMUECB0: - value->rValue = model->HSMHV_lmuecb0; - return(OK); - case HSMHV_MOD_LMUECB1: - value->rValue = model->HSMHV_lmuecb1; - return(OK); - case HSMHV_MOD_LMUEPH1: - value->rValue = model->HSMHV_lmueph1; - return(OK); - case HSMHV_MOD_LVTMP: - value->rValue = model->HSMHV_lvtmp; - return(OK); - case HSMHV_MOD_LWVTH0: - value->rValue = model->HSMHV_lwvth0; - return(OK); - case HSMHV_MOD_LMUESR1: - value->rValue = model->HSMHV_lmuesr1; - return(OK); - case HSMHV_MOD_LMUETMP: - value->rValue = model->HSMHV_lmuetmp; - return(OK); - case HSMHV_MOD_LSUB1: - value->rValue = model->HSMHV_lsub1; - return(OK); - case HSMHV_MOD_LSUB2: - value->rValue = model->HSMHV_lsub2; - return(OK); - case HSMHV_MOD_LSVDS: - value->rValue = model->HSMHV_lsvds; - return(OK); - case HSMHV_MOD_LSVBS: - value->rValue = model->HSMHV_lsvbs; - return(OK); - case HSMHV_MOD_LSVGS: - value->rValue = model->HSMHV_lsvgs; - return(OK); - case HSMHV_MOD_LFN1: - value->rValue = model->HSMHV_lfn1; - return(OK); - case HSMHV_MOD_LFN2: - value->rValue = model->HSMHV_lfn2; - return(OK); - case HSMHV_MOD_LFN3: - value->rValue = model->HSMHV_lfn3; - return(OK); - case HSMHV_MOD_LFVBS: - value->rValue = model->HSMHV_lfvbs; - return(OK); - case HSMHV_MOD_LNSTI: - value->rValue = model->HSMHV_lnsti; - return(OK); - case HSMHV_MOD_LWSTI: - value->rValue = model->HSMHV_lwsti; - return(OK); - case HSMHV_MOD_LSCSTI1: - value->rValue = model->HSMHV_lscsti1; - return(OK); - case HSMHV_MOD_LSCSTI2: - value->rValue = model->HSMHV_lscsti2; - return(OK); - case HSMHV_MOD_LVTHSTI: - value->rValue = model->HSMHV_lvthsti; - return(OK); - case HSMHV_MOD_LMUESTI1: - value->rValue = model->HSMHV_lmuesti1; - return(OK); - case HSMHV_MOD_LMUESTI2: - value->rValue = model->HSMHV_lmuesti2; - return(OK); - case HSMHV_MOD_LMUESTI3: - value->rValue = model->HSMHV_lmuesti3; - return(OK); - case HSMHV_MOD_LNSUBPSTI1: - value->rValue = model->HSMHV_lnsubpsti1; - return(OK); - case HSMHV_MOD_LNSUBPSTI2: - value->rValue = model->HSMHV_lnsubpsti2; - return(OK); - case HSMHV_MOD_LNSUBPSTI3: - value->rValue = model->HSMHV_lnsubpsti3; - return(OK); - case HSMHV_MOD_LCGSO: - value->rValue = model->HSMHV_lcgso; - return(OK); - case HSMHV_MOD_LCGDO: - value->rValue = model->HSMHV_lcgdo; - return(OK); - case HSMHV_MOD_LJS0: - value->rValue = model->HSMHV_ljs0; - return(OK); - case HSMHV_MOD_LJS0SW: - value->rValue = model->HSMHV_ljs0sw; - return(OK); - case HSMHV_MOD_LNJ: - value->rValue = model->HSMHV_lnj; - return(OK); - case HSMHV_MOD_LCISBK: - value->rValue = model->HSMHV_lcisbk; - return(OK); - case HSMHV_MOD_LCLM1: - value->rValue = model->HSMHV_lclm1; - return(OK); - case HSMHV_MOD_LCLM2: - value->rValue = model->HSMHV_lclm2; - return(OK); - case HSMHV_MOD_LCLM3: - value->rValue = model->HSMHV_lclm3; - return(OK); - case HSMHV_MOD_LWFC: - value->rValue = model->HSMHV_lwfc; - return(OK); - case HSMHV_MOD_LGIDL1: - value->rValue = model->HSMHV_lgidl1; - return(OK); - case HSMHV_MOD_LGIDL2: - value->rValue = model->HSMHV_lgidl2; - return(OK); - case HSMHV_MOD_LGLEAK1: - value->rValue = model->HSMHV_lgleak1; - return(OK); - case HSMHV_MOD_LGLEAK2: - value->rValue = model->HSMHV_lgleak2; - return(OK); - case HSMHV_MOD_LGLEAK3: - value->rValue = model->HSMHV_lgleak3; - return(OK); - case HSMHV_MOD_LGLEAK6: - value->rValue = model->HSMHV_lgleak6; - return(OK); - case HSMHV_MOD_LGLKSD1: - value->rValue = model->HSMHV_lglksd1; - return(OK); - case HSMHV_MOD_LGLKSD2: - value->rValue = model->HSMHV_lglksd2; - return(OK); - case HSMHV_MOD_LGLKB1: - value->rValue = model->HSMHV_lglkb1; - return(OK); - case HSMHV_MOD_LGLKB2: - value->rValue = model->HSMHV_lglkb2; - return(OK); - case HSMHV_MOD_LNFTRP: - value->rValue = model->HSMHV_lnftrp; - return(OK); - case HSMHV_MOD_LNFALP: - value->rValue = model->HSMHV_lnfalp; - return(OK); - case HSMHV_MOD_LPTHROU: - value->rValue = model->HSMHV_lpthrou; - return(OK); - case HSMHV_MOD_LVDIFFJ: - value->rValue = model->HSMHV_lvdiffj; - return(OK); - case HSMHV_MOD_LIBPC1: - value->rValue = model->HSMHV_libpc1; - return(OK); - case HSMHV_MOD_LIBPC2: - value->rValue = model->HSMHV_libpc2; - return(OK); - case HSMHV_MOD_LCGBO: - value->rValue = model->HSMHV_lcgbo; - return(OK); - case HSMHV_MOD_LCVDSOVER: - value->rValue = model->HSMHV_lcvdsover; - return(OK); - case HSMHV_MOD_LFALPH: - value->rValue = model->HSMHV_lfalph; - return(OK); - case HSMHV_MOD_LNPEXT: - value->rValue = model->HSMHV_lnpext; - return(OK); - case HSMHV_MOD_LPOWRAT: - value->rValue = model->HSMHV_lpowrat; - return(OK); - case HSMHV_MOD_LRD: - value->rValue = model->HSMHV_lrd; - return(OK); - case HSMHV_MOD_LRD22: - value->rValue = model->HSMHV_lrd22; - return(OK); - case HSMHV_MOD_LRD23: - value->rValue = model->HSMHV_lrd23; - return(OK); - case HSMHV_MOD_LRD24: - value->rValue = model->HSMHV_lrd24; - return(OK); - case HSMHV_MOD_LRDICT1: - value->rValue = model->HSMHV_lrdict1; - return(OK); - case HSMHV_MOD_LRDOV13: - value->rValue = model->HSMHV_lrdov13; - return(OK); - case HSMHV_MOD_LRDSLP1: - value->rValue = model->HSMHV_lrdslp1; - return(OK); - case HSMHV_MOD_LRDVB: - value->rValue = model->HSMHV_lrdvb; - return(OK); - case HSMHV_MOD_LRDVD: - value->rValue = model->HSMHV_lrdvd; - return(OK); - case HSMHV_MOD_LRDVG11: - value->rValue = model->HSMHV_lrdvg11; - return(OK); - case HSMHV_MOD_LRS: - value->rValue = model->HSMHV_lrs; - return(OK); - case HSMHV_MOD_LRTH0: - value->rValue = model->HSMHV_lrth0; - return(OK); - case HSMHV_MOD_LVOVER: - value->rValue = model->HSMHV_lvover; - return(OK); - - /* Width dependence */ - case HSMHV_MOD_WVMAX: - value->rValue = model->HSMHV_wvmax; - return(OK); - case HSMHV_MOD_WBGTMP1: - value->rValue = model->HSMHV_wbgtmp1; - return(OK); - case HSMHV_MOD_WBGTMP2: - value->rValue = model->HSMHV_wbgtmp2; - return(OK); - case HSMHV_MOD_WEG0: - value->rValue = model->HSMHV_weg0; - return(OK); - case HSMHV_MOD_WVFBOVER: - value->rValue = model->HSMHV_wvfbover; - return(OK); - case HSMHV_MOD_WNOVER: - value->rValue = model->HSMHV_wnover; - return(OK); - case HSMHV_MOD_WNOVERS: - value->rValue = model->HSMHV_wnovers; - return(OK); - case HSMHV_MOD_WWL2: - value->rValue = model->HSMHV_wwl2; - return(OK); - case HSMHV_MOD_WVFBC: - value->rValue = model->HSMHV_wvfbc; - return(OK); - case HSMHV_MOD_WNSUBC: - value->rValue = model->HSMHV_wnsubc; - return(OK); - case HSMHV_MOD_WNSUBP: - value->rValue = model->HSMHV_wnsubp; - return(OK); - case HSMHV_MOD_WSCP1: - value->rValue = model->HSMHV_wscp1; - return(OK); - case HSMHV_MOD_WSCP2: - value->rValue = model->HSMHV_wscp2; - return(OK); - case HSMHV_MOD_WSCP3: - value->rValue = model->HSMHV_wscp3; - return(OK); - case HSMHV_MOD_WSC1: - value->rValue = model->HSMHV_wsc1; - return(OK); - case HSMHV_MOD_WSC2: - value->rValue = model->HSMHV_wsc2; - return(OK); - case HSMHV_MOD_WSC3: - value->rValue = model->HSMHV_wsc3; - return(OK); - case HSMHV_MOD_WPGD1: - value->rValue = model->HSMHV_wpgd1; - return(OK); - case HSMHV_MOD_WPGD3: - value->rValue = model->HSMHV_wpgd3; - return(OK); - case HSMHV_MOD_WNDEP: - value->rValue = model->HSMHV_wndep; - return(OK); - case HSMHV_MOD_WNINV: - value->rValue = model->HSMHV_wninv; - return(OK); - case HSMHV_MOD_WMUECB0: - value->rValue = model->HSMHV_wmuecb0; - return(OK); - case HSMHV_MOD_WMUECB1: - value->rValue = model->HSMHV_wmuecb1; - return(OK); - case HSMHV_MOD_WMUEPH1: - value->rValue = model->HSMHV_wmueph1; - return(OK); - case HSMHV_MOD_WVTMP: - value->rValue = model->HSMHV_wvtmp; - return(OK); - case HSMHV_MOD_WWVTH0: - value->rValue = model->HSMHV_wwvth0; - return(OK); - case HSMHV_MOD_WMUESR1: - value->rValue = model->HSMHV_wmuesr1; - return(OK); - case HSMHV_MOD_WMUETMP: - value->rValue = model->HSMHV_wmuetmp; - return(OK); - case HSMHV_MOD_WSUB1: - value->rValue = model->HSMHV_wsub1; - return(OK); - case HSMHV_MOD_WSUB2: - value->rValue = model->HSMHV_wsub2; - return(OK); - case HSMHV_MOD_WSVDS: - value->rValue = model->HSMHV_wsvds; - return(OK); - case HSMHV_MOD_WSVBS: - value->rValue = model->HSMHV_wsvbs; - return(OK); - case HSMHV_MOD_WSVGS: - value->rValue = model->HSMHV_wsvgs; - return(OK); - case HSMHV_MOD_WFN1: - value->rValue = model->HSMHV_wfn1; - return(OK); - case HSMHV_MOD_WFN2: - value->rValue = model->HSMHV_wfn2; - return(OK); - case HSMHV_MOD_WFN3: - value->rValue = model->HSMHV_wfn3; - return(OK); - case HSMHV_MOD_WFVBS: - value->rValue = model->HSMHV_wfvbs; - return(OK); - case HSMHV_MOD_WNSTI: - value->rValue = model->HSMHV_wnsti; - return(OK); - case HSMHV_MOD_WWSTI: - value->rValue = model->HSMHV_wwsti; - return(OK); - case HSMHV_MOD_WSCSTI1: - value->rValue = model->HSMHV_wscsti1; - return(OK); - case HSMHV_MOD_WSCSTI2: - value->rValue = model->HSMHV_wscsti2; - return(OK); - case HSMHV_MOD_WVTHSTI: - value->rValue = model->HSMHV_wvthsti; - return(OK); - case HSMHV_MOD_WMUESTI1: - value->rValue = model->HSMHV_wmuesti1; - return(OK); - case HSMHV_MOD_WMUESTI2: - value->rValue = model->HSMHV_wmuesti2; - return(OK); - case HSMHV_MOD_WMUESTI3: - value->rValue = model->HSMHV_wmuesti3; - return(OK); - case HSMHV_MOD_WNSUBPSTI1: - value->rValue = model->HSMHV_wnsubpsti1; - return(OK); - case HSMHV_MOD_WNSUBPSTI2: - value->rValue = model->HSMHV_wnsubpsti2; - return(OK); - case HSMHV_MOD_WNSUBPSTI3: - value->rValue = model->HSMHV_wnsubpsti3; - return(OK); - case HSMHV_MOD_WCGSO: - value->rValue = model->HSMHV_wcgso; - return(OK); - case HSMHV_MOD_WCGDO: - value->rValue = model->HSMHV_wcgdo; - return(OK); - case HSMHV_MOD_WJS0: - value->rValue = model->HSMHV_wjs0; - return(OK); - case HSMHV_MOD_WJS0SW: - value->rValue = model->HSMHV_wjs0sw; - return(OK); - case HSMHV_MOD_WNJ: - value->rValue = model->HSMHV_wnj; - return(OK); - case HSMHV_MOD_WCISBK: - value->rValue = model->HSMHV_wcisbk; - return(OK); - case HSMHV_MOD_WCLM1: - value->rValue = model->HSMHV_wclm1; - return(OK); - case HSMHV_MOD_WCLM2: - value->rValue = model->HSMHV_wclm2; - return(OK); - case HSMHV_MOD_WCLM3: - value->rValue = model->HSMHV_wclm3; - return(OK); - case HSMHV_MOD_WWFC: - value->rValue = model->HSMHV_wwfc; - return(OK); - case HSMHV_MOD_WGIDL1: - value->rValue = model->HSMHV_wgidl1; - return(OK); - case HSMHV_MOD_WGIDL2: - value->rValue = model->HSMHV_wgidl2; - return(OK); - case HSMHV_MOD_WGLEAK1: - value->rValue = model->HSMHV_wgleak1; - return(OK); - case HSMHV_MOD_WGLEAK2: - value->rValue = model->HSMHV_wgleak2; - return(OK); - case HSMHV_MOD_WGLEAK3: - value->rValue = model->HSMHV_wgleak3; - return(OK); - case HSMHV_MOD_WGLEAK6: - value->rValue = model->HSMHV_wgleak6; - return(OK); - case HSMHV_MOD_WGLKSD1: - value->rValue = model->HSMHV_wglksd1; - return(OK); - case HSMHV_MOD_WGLKSD2: - value->rValue = model->HSMHV_wglksd2; - return(OK); - case HSMHV_MOD_WGLKB1: - value->rValue = model->HSMHV_wglkb1; - return(OK); - case HSMHV_MOD_WGLKB2: - value->rValue = model->HSMHV_wglkb2; - return(OK); - case HSMHV_MOD_WNFTRP: - value->rValue = model->HSMHV_wnftrp; - return(OK); - case HSMHV_MOD_WNFALP: - value->rValue = model->HSMHV_wnfalp; - return(OK); - case HSMHV_MOD_WPTHROU: - value->rValue = model->HSMHV_wpthrou; - return(OK); - case HSMHV_MOD_WVDIFFJ: - value->rValue = model->HSMHV_wvdiffj; - return(OK); - case HSMHV_MOD_WIBPC1: - value->rValue = model->HSMHV_wibpc1; - return(OK); - case HSMHV_MOD_WIBPC2: - value->rValue = model->HSMHV_wibpc2; - return(OK); - case HSMHV_MOD_WCGBO: - value->rValue = model->HSMHV_wcgbo; - return(OK); - case HSMHV_MOD_WCVDSOVER: - value->rValue = model->HSMHV_wcvdsover; - return(OK); - case HSMHV_MOD_WFALPH: - value->rValue = model->HSMHV_wfalph; - return(OK); - case HSMHV_MOD_WNPEXT: - value->rValue = model->HSMHV_wnpext; - return(OK); - case HSMHV_MOD_WPOWRAT: - value->rValue = model->HSMHV_wpowrat; - return(OK); - case HSMHV_MOD_WRD: - value->rValue = model->HSMHV_wrd; - return(OK); - case HSMHV_MOD_WRD22: - value->rValue = model->HSMHV_wrd22; - return(OK); - case HSMHV_MOD_WRD23: - value->rValue = model->HSMHV_wrd23; - return(OK); - case HSMHV_MOD_WRD24: - value->rValue = model->HSMHV_wrd24; - return(OK); - case HSMHV_MOD_WRDICT1: - value->rValue = model->HSMHV_wrdict1; - return(OK); - case HSMHV_MOD_WRDOV13: - value->rValue = model->HSMHV_wrdov13; - return(OK); - case HSMHV_MOD_WRDSLP1: - value->rValue = model->HSMHV_wrdslp1; - return(OK); - case HSMHV_MOD_WRDVB: - value->rValue = model->HSMHV_wrdvb; - return(OK); - case HSMHV_MOD_WRDVD: - value->rValue = model->HSMHV_wrdvd; - return(OK); - case HSMHV_MOD_WRDVG11: - value->rValue = model->HSMHV_wrdvg11; - return(OK); - case HSMHV_MOD_WRS: - value->rValue = model->HSMHV_wrs; - return(OK); - case HSMHV_MOD_WRTH0: - value->rValue = model->HSMHV_wrth0; - return(OK); - case HSMHV_MOD_WVOVER: - value->rValue = model->HSMHV_wvover; - return(OK); - - /* Cross-term dependence */ - case HSMHV_MOD_PVMAX: - value->rValue = model->HSMHV_pvmax; - return(OK); - case HSMHV_MOD_PBGTMP1: - value->rValue = model->HSMHV_pbgtmp1; - return(OK); - case HSMHV_MOD_PBGTMP2: - value->rValue = model->HSMHV_pbgtmp2; - return(OK); - case HSMHV_MOD_PEG0: - value->rValue = model->HSMHV_peg0; - return(OK); - case HSMHV_MOD_PVFBOVER: - value->rValue = model->HSMHV_pvfbover; - return(OK); - case HSMHV_MOD_PNOVER: - value->rValue = model->HSMHV_pnover; - return(OK); - case HSMHV_MOD_PNOVERS: - value->rValue = model->HSMHV_pnovers; - return(OK); - case HSMHV_MOD_PWL2: - value->rValue = model->HSMHV_pwl2; - return(OK); - case HSMHV_MOD_PVFBC: - value->rValue = model->HSMHV_pvfbc; - return(OK); - case HSMHV_MOD_PNSUBC: - value->rValue = model->HSMHV_pnsubc; - return(OK); - case HSMHV_MOD_PNSUBP: - value->rValue = model->HSMHV_pnsubp; - return(OK); - case HSMHV_MOD_PSCP1: - value->rValue = model->HSMHV_pscp1; - return(OK); - case HSMHV_MOD_PSCP2: - value->rValue = model->HSMHV_pscp2; - return(OK); - case HSMHV_MOD_PSCP3: - value->rValue = model->HSMHV_pscp3; - return(OK); - case HSMHV_MOD_PSC1: - value->rValue = model->HSMHV_psc1; - return(OK); - case HSMHV_MOD_PSC2: - value->rValue = model->HSMHV_psc2; - return(OK); - case HSMHV_MOD_PSC3: - value->rValue = model->HSMHV_psc3; - return(OK); - case HSMHV_MOD_PPGD1: - value->rValue = model->HSMHV_ppgd1; - return(OK); - case HSMHV_MOD_PPGD3: - value->rValue = model->HSMHV_ppgd3; - return(OK); - case HSMHV_MOD_PNDEP: - value->rValue = model->HSMHV_pndep; - return(OK); - case HSMHV_MOD_PNINV: - value->rValue = model->HSMHV_pninv; - return(OK); - case HSMHV_MOD_PMUECB0: - value->rValue = model->HSMHV_pmuecb0; - return(OK); - case HSMHV_MOD_PMUECB1: - value->rValue = model->HSMHV_pmuecb1; - return(OK); - case HSMHV_MOD_PMUEPH1: - value->rValue = model->HSMHV_pmueph1; - return(OK); - case HSMHV_MOD_PVTMP: - value->rValue = model->HSMHV_pvtmp; - return(OK); - case HSMHV_MOD_PWVTH0: - value->rValue = model->HSMHV_pwvth0; - return(OK); - case HSMHV_MOD_PMUESR1: - value->rValue = model->HSMHV_pmuesr1; - return(OK); - case HSMHV_MOD_PMUETMP: - value->rValue = model->HSMHV_pmuetmp; - return(OK); - case HSMHV_MOD_PSUB1: - value->rValue = model->HSMHV_psub1; - return(OK); - case HSMHV_MOD_PSUB2: - value->rValue = model->HSMHV_psub2; - return(OK); - case HSMHV_MOD_PSVDS: - value->rValue = model->HSMHV_psvds; - return(OK); - case HSMHV_MOD_PSVBS: - value->rValue = model->HSMHV_psvbs; - return(OK); - case HSMHV_MOD_PSVGS: - value->rValue = model->HSMHV_psvgs; - return(OK); - case HSMHV_MOD_PFN1: - value->rValue = model->HSMHV_pfn1; - return(OK); - case HSMHV_MOD_PFN2: - value->rValue = model->HSMHV_pfn2; - return(OK); - case HSMHV_MOD_PFN3: - value->rValue = model->HSMHV_pfn3; - return(OK); - case HSMHV_MOD_PFVBS: - value->rValue = model->HSMHV_pfvbs; - return(OK); - case HSMHV_MOD_PNSTI: - value->rValue = model->HSMHV_pnsti; - return(OK); - case HSMHV_MOD_PWSTI: - value->rValue = model->HSMHV_pwsti; - return(OK); - case HSMHV_MOD_PSCSTI1: - value->rValue = model->HSMHV_pscsti1; - return(OK); - case HSMHV_MOD_PSCSTI2: - value->rValue = model->HSMHV_pscsti2; - return(OK); - case HSMHV_MOD_PVTHSTI: - value->rValue = model->HSMHV_pvthsti; - return(OK); - case HSMHV_MOD_PMUESTI1: - value->rValue = model->HSMHV_pmuesti1; - return(OK); - case HSMHV_MOD_PMUESTI2: - value->rValue = model->HSMHV_pmuesti2; - return(OK); - case HSMHV_MOD_PMUESTI3: - value->rValue = model->HSMHV_pmuesti3; - return(OK); - case HSMHV_MOD_PNSUBPSTI1: - value->rValue = model->HSMHV_pnsubpsti1; - return(OK); - case HSMHV_MOD_PNSUBPSTI2: - value->rValue = model->HSMHV_pnsubpsti2; - return(OK); - case HSMHV_MOD_PNSUBPSTI3: - value->rValue = model->HSMHV_pnsubpsti3; - return(OK); - case HSMHV_MOD_PCGSO: - value->rValue = model->HSMHV_pcgso; - return(OK); - case HSMHV_MOD_PCGDO: - value->rValue = model->HSMHV_pcgdo; - return(OK); - case HSMHV_MOD_PJS0: - value->rValue = model->HSMHV_pjs0; - return(OK); - case HSMHV_MOD_PJS0SW: - value->rValue = model->HSMHV_pjs0sw; - return(OK); - case HSMHV_MOD_PNJ: - value->rValue = model->HSMHV_pnj; - return(OK); - case HSMHV_MOD_PCISBK: - value->rValue = model->HSMHV_pcisbk; - return(OK); - case HSMHV_MOD_PCLM1: - value->rValue = model->HSMHV_pclm1; - return(OK); - case HSMHV_MOD_PCLM2: - value->rValue = model->HSMHV_pclm2; - return(OK); - case HSMHV_MOD_PCLM3: - value->rValue = model->HSMHV_pclm3; - return(OK); - case HSMHV_MOD_PWFC: - value->rValue = model->HSMHV_pwfc; - return(OK); - case HSMHV_MOD_PGIDL1: - value->rValue = model->HSMHV_pgidl1; - return(OK); - case HSMHV_MOD_PGIDL2: - value->rValue = model->HSMHV_pgidl2; - return(OK); - case HSMHV_MOD_PGLEAK1: - value->rValue = model->HSMHV_pgleak1; - return(OK); - case HSMHV_MOD_PGLEAK2: - value->rValue = model->HSMHV_pgleak2; - return(OK); - case HSMHV_MOD_PGLEAK3: - value->rValue = model->HSMHV_pgleak3; - return(OK); - case HSMHV_MOD_PGLEAK6: - value->rValue = model->HSMHV_pgleak6; - return(OK); - case HSMHV_MOD_PGLKSD1: - value->rValue = model->HSMHV_pglksd1; - return(OK); - case HSMHV_MOD_PGLKSD2: - value->rValue = model->HSMHV_pglksd2; - return(OK); - case HSMHV_MOD_PGLKB1: - value->rValue = model->HSMHV_pglkb1; - return(OK); - case HSMHV_MOD_PGLKB2: - value->rValue = model->HSMHV_pglkb2; - return(OK); - case HSMHV_MOD_PNFTRP: - value->rValue = model->HSMHV_pnftrp; - return(OK); - case HSMHV_MOD_PNFALP: - value->rValue = model->HSMHV_pnfalp; - return(OK); - case HSMHV_MOD_PPTHROU: - value->rValue = model->HSMHV_ppthrou; - return(OK); - case HSMHV_MOD_PVDIFFJ: - value->rValue = model->HSMHV_pvdiffj; - return(OK); - case HSMHV_MOD_PIBPC1: - value->rValue = model->HSMHV_pibpc1; - return(OK); - case HSMHV_MOD_PIBPC2: - value->rValue = model->HSMHV_pibpc2; - return(OK); - case HSMHV_MOD_PCGBO: - value->rValue = model->HSMHV_pcgbo; - return(OK); - case HSMHV_MOD_PCVDSOVER: - value->rValue = model->HSMHV_pcvdsover; - return(OK); - case HSMHV_MOD_PFALPH: - value->rValue = model->HSMHV_pfalph; - return(OK); - case HSMHV_MOD_PNPEXT: - value->rValue = model->HSMHV_pnpext; - return(OK); - case HSMHV_MOD_PPOWRAT: - value->rValue = model->HSMHV_ppowrat; - return(OK); - case HSMHV_MOD_PRD: - value->rValue = model->HSMHV_prd; - return(OK); - case HSMHV_MOD_PRD22: - value->rValue = model->HSMHV_prd22; - return(OK); - case HSMHV_MOD_PRD23: - value->rValue = model->HSMHV_prd23; - return(OK); - case HSMHV_MOD_PRD24: - value->rValue = model->HSMHV_prd24; - return(OK); - case HSMHV_MOD_PRDICT1: - value->rValue = model->HSMHV_prdict1; - return(OK); - case HSMHV_MOD_PRDOV13: - value->rValue = model->HSMHV_prdov13; - return(OK); - case HSMHV_MOD_PRDSLP1: - value->rValue = model->HSMHV_prdslp1; - return(OK); - case HSMHV_MOD_PRDVB: - value->rValue = model->HSMHV_prdvb; - return(OK); - case HSMHV_MOD_PRDVD: - value->rValue = model->HSMHV_prdvd; - return(OK); - case HSMHV_MOD_PRDVG11: - value->rValue = model->HSMHV_prdvg11; - return(OK); - case HSMHV_MOD_PRS: - value->rValue = model->HSMHV_prs; - return(OK); - case HSMHV_MOD_PRTH0: - value->rValue = model->HSMHV_prth0; - return(OK); - case HSMHV_MOD_PVOVER: - value->rValue = model->HSMHV_pvover; - return(OK); - - case HSMHV_MOD_VGS_MAX: - value->rValue = model->HSMHVvgsMax; - return(OK); - case HSMHV_MOD_VGD_MAX: - value->rValue = model->HSMHVvgdMax; - return(OK); - case HSMHV_MOD_VGB_MAX: - value->rValue = model->HSMHVvgbMax; - return(OK); - case HSMHV_MOD_VDS_MAX: - value->rValue = model->HSMHVvdsMax; - return(OK); - case HSMHV_MOD_VBS_MAX: - value->rValue = model->HSMHVvbsMax; - return(OK); - case HSMHV_MOD_VBD_MAX: - value->rValue = model->HSMHVvbdMax; - return(OK); - case HSMHV_MOD_VGSR_MAX: - value->rValue = model->HSMHVvgsrMax; - return(OK); - case HSMHV_MOD_VGDR_MAX: - value->rValue = model->HSMHVvgdrMax; - return(OK); - case HSMHV_MOD_VGBR_MAX: - value->rValue = model->HSMHVvgbrMax; - return(OK); - case HSMHV_MOD_VBSR_MAX: - value->rValue = model->HSMHVvbsrMax; - return(OK); - case HSMHV_MOD_VBDR_MAX: - value->rValue = model->HSMHVvbdrMax; - return(OK); - - default: - return(E_BADPARM); - } - /* NOTREACHED */ -} diff --git a/src/spicelib/devices/hisimhv1/hsmhvmpar.c b/src/spicelib/devices/hisimhv1/hsmhvmpar.c deleted file mode 100644 index 1bd06bc7e..000000000 --- a/src/spicelib/devices/hisimhv1/hsmhvmpar.c +++ /dev/null @@ -1,2498 +0,0 @@ -/*********************************************************************** - - HiSIM (Hiroshima University STARC IGFET Model) - Copyright (C) 2012 Hiroshima University & STARC - - MODEL NAME : HiSIM_HV - ( VERSION : 1 SUBVERSION : 2 REVISION : 4 ) - Model Parameter VERSION : 1.23 - FILE : hsmhvmpar.c - - DATE : 2013.04.30 - - released by - Hiroshima University & - Semiconductor Technology Academic Research Center (STARC) -***********************************************************************/ - -#include "ngspice/ngspice.h" -#include "hsmhvdef.h" -#include "ngspice/ifsim.h" -#include "ngspice/sperror.h" -#include "ngspice/suffix.h" - -int HSMHVmParam( - int param, - IFvalue *value, - GENmodel *inMod) -{ - HSMHVmodel *mod = (HSMHVmodel*)inMod; - switch (param) { - case HSMHV_MOD_NMOS : - if (value->iValue) { - mod->HSMHV_type = 1; - mod->HSMHV_type_Given = TRUE; - } - break; - case HSMHV_MOD_PMOS : - if (value->iValue) { - mod->HSMHV_type = - 1; - mod->HSMHV_type_Given = TRUE; - } - break; - case HSMHV_MOD_LEVEL: - mod->HSMHV_level = value->iValue; - mod->HSMHV_level_Given = TRUE; - break; - case HSMHV_MOD_INFO: - mod->HSMHV_info = value->iValue; - mod->HSMHV_info_Given = TRUE; - break; - case HSMHV_MOD_NOISE: - mod->HSMHV_noise = value->iValue; - mod->HSMHV_noise_Given = TRUE; - break; - case HSMHV_MOD_VERSION: - mod->HSMHV_version = value->sValue; - mod->HSMHV_version_Given = TRUE; - break; - case HSMHV_MOD_SHOW: - mod->HSMHV_show = value->iValue; - mod->HSMHV_show_Given = TRUE; - break; - case HSMHV_MOD_CORSRD: - mod->HSMHV_corsrd = value->iValue; - mod->HSMHV_corsrd_Given = TRUE; - break; - case HSMHV_MOD_CORG: - mod->HSMHV_corg = value->iValue; - mod->HSMHV_corg_Given = TRUE; - break; - case HSMHV_MOD_COIPRV: - mod->HSMHV_coiprv = value->iValue; - mod->HSMHV_coiprv_Given = TRUE; - break; - case HSMHV_MOD_COPPRV: - mod->HSMHV_copprv = value->iValue; - mod->HSMHV_copprv_Given = TRUE; - break; - case HSMHV_MOD_COADOV: - mod->HSMHV_coadov = value->iValue; - mod->HSMHV_coadov_Given = TRUE; - break; - case HSMHV_MOD_COISUB: - mod->HSMHV_coisub = value->iValue; - mod->HSMHV_coisub_Given = TRUE; - break; - case HSMHV_MOD_COIIGS: - mod->HSMHV_coiigs = value->iValue; - mod->HSMHV_coiigs_Given = TRUE; - break; - case HSMHV_MOD_COGIDL: - mod->HSMHV_cogidl = value->iValue; - mod->HSMHV_cogidl_Given = TRUE; - break; - case HSMHV_MOD_COOVLP: - mod->HSMHV_coovlp = value->iValue; - mod->HSMHV_coovlp_Given = TRUE; - break; - case HSMHV_MOD_COOVLPS: - mod->HSMHV_coovlps = value->iValue; - mod->HSMHV_coovlps_Given = TRUE; - break; - case HSMHV_MOD_COFLICK: - mod->HSMHV_coflick = value->iValue; - mod->HSMHV_coflick_Given = TRUE; - break; - case HSMHV_MOD_COISTI: - mod->HSMHV_coisti = value->iValue; - mod->HSMHV_coisti_Given = TRUE; - break; - case HSMHV_MOD_CONQS: /* HiSIMHV */ - mod->HSMHV_conqs = value->iValue; - mod->HSMHV_conqs_Given = TRUE; - break; - case HSMHV_MOD_CORBNET: - mod->HSMHV_corbnet = value->iValue; - mod->HSMHV_corbnet_Given = TRUE; - break; - case HSMHV_MOD_COTHRML: - mod->HSMHV_cothrml = value->iValue; - mod->HSMHV_cothrml_Given = TRUE; - break; - case HSMHV_MOD_COIGN: - mod->HSMHV_coign = value->iValue; - mod->HSMHV_coign_Given = TRUE; - break; - case HSMHV_MOD_CODFM: - mod->HSMHV_codfm = value->iValue; - mod->HSMHV_codfm_Given = TRUE; - break; - case HSMHV_MOD_COQOVSM: - mod->HSMHV_coqovsm = value->iValue; - mod->HSMHV_coqovsm_Given = TRUE; - break; - case HSMHV_MOD_COSELFHEAT: /* Self-heating model */ - mod->HSMHV_coselfheat = value->iValue; - mod->HSMHV_coselfheat_Given = TRUE; - break; - case HSMHV_MOD_COSUBNODE: - mod->HSMHV_cosubnode = value->iValue; - mod->HSMHV_cosubnode_Given = TRUE; - break; - case HSMHV_MOD_COSYM: /* Symmetry model for HV */ - mod->HSMHV_cosym = value->iValue; - mod->HSMHV_cosym_Given = TRUE; - break; - case HSMHV_MOD_COTEMP: - mod->HSMHV_cotemp = value->iValue; - mod->HSMHV_cotemp_Given = TRUE; - break; - case HSMHV_MOD_COLDRIFT: - mod->HSMHV_coldrift = value->iValue; - mod->HSMHV_coldrift_Given = TRUE; - break; - case HSMHV_MOD_VMAX: - mod->HSMHV_vmax = value->rValue; - mod->HSMHV_vmax_Given = TRUE; - break; - case HSMHV_MOD_VMAXT1: - mod->HSMHV_vmaxt1 = value->rValue; - mod->HSMHV_vmaxt1_Given = TRUE; - break; - case HSMHV_MOD_VMAXT2: - mod->HSMHV_vmaxt2 = value->rValue; - mod->HSMHV_vmaxt2_Given = TRUE; - break; - case HSMHV_MOD_BGTMP1: - mod->HSMHV_bgtmp1 = value->rValue; - mod->HSMHV_bgtmp1_Given = TRUE; - break; - case HSMHV_MOD_BGTMP2: - mod->HSMHV_bgtmp2 = value->rValue; - mod->HSMHV_bgtmp2_Given = TRUE; - break; - case HSMHV_MOD_EG0: - mod->HSMHV_eg0 = value->rValue; - mod->HSMHV_eg0_Given = TRUE; - break; - case HSMHV_MOD_TOX: - mod->HSMHV_tox = value->rValue; - mod->HSMHV_tox_Given = TRUE; - break; - case HSMHV_MOD_XLD: - mod->HSMHV_xld = value->rValue; - mod->HSMHV_xld_Given = TRUE; - break; - case HSMHV_MOD_LOVER: - mod->HSMHV_lover = value->rValue; - mod->HSMHV_lover_Given = TRUE; - break; - case HSMHV_MOD_LOVERS: - mod->HSMHV_lovers = value->rValue; - mod->HSMHV_lovers_Given = TRUE; - break; - case HSMHV_MOD_RDOV11: - mod->HSMHV_rdov11 = value->rValue; - mod->HSMHV_rdov11_Given = TRUE; - break; - case HSMHV_MOD_RDOV12: - mod->HSMHV_rdov12 = value->rValue; - mod->HSMHV_rdov12_Given = TRUE; - break; - case HSMHV_MOD_RDOV13: - mod->HSMHV_rdov13 = value->rValue; - mod->HSMHV_rdov13_Given = TRUE; - break; - case HSMHV_MOD_RDSLP1: - mod->HSMHV_rdslp1 = value->rValue; - mod->HSMHV_rdslp1_Given = TRUE; - break; - case HSMHV_MOD_RDICT1: - mod->HSMHV_rdict1= value->rValue; - mod->HSMHV_rdict1_Given = TRUE; - break; - case HSMHV_MOD_RDSLP2: - mod->HSMHV_rdslp2 = value->rValue; - mod->HSMHV_rdslp2_Given = TRUE; - break; - case HSMHV_MOD_RDICT2: - mod->HSMHV_rdict2 = value->rValue; - mod->HSMHV_rdict2_Given = TRUE; - break; - case HSMHV_MOD_LOVERLD: - mod->HSMHV_loverld = value->rValue; - mod->HSMHV_loverld_Given = TRUE; - break; - case HSMHV_MOD_LDRIFT1: - mod->HSMHV_ldrift1 = value->rValue; - mod->HSMHV_ldrift1_Given = TRUE; - break; - case HSMHV_MOD_LDRIFT2: - mod->HSMHV_ldrift2 = value->rValue; - mod->HSMHV_ldrift2_Given = TRUE; - break; - case HSMHV_MOD_LDRIFT1S: - mod->HSMHV_ldrift1s = value->rValue; - mod->HSMHV_ldrift1s_Given = TRUE; - break; - case HSMHV_MOD_LDRIFT2S: - mod->HSMHV_ldrift2s = value->rValue; - mod->HSMHV_ldrift2s_Given = TRUE; - break; - case HSMHV_MOD_SUBLD1: - mod->HSMHV_subld1 = value->rValue; - mod->HSMHV_subld1_Given = TRUE; - break; - case HSMHV_MOD_SUBLD2: - mod->HSMHV_subld2 = value->rValue; - mod->HSMHV_subld2_Given = TRUE; - break; - case HSMHV_MOD_DDLTMAX: /* Vdseff */ - mod->HSMHV_ddltmax = value->rValue; - mod->HSMHV_ddltmax_Given = TRUE; - break; - case HSMHV_MOD_DDLTSLP: /* Vdseff */ - mod->HSMHV_ddltslp = value->rValue; - mod->HSMHV_ddltslp_Given = TRUE; - break; - case HSMHV_MOD_DDLTICT: /* Vdseff */ - mod->HSMHV_ddltict = value->rValue; - mod->HSMHV_ddltict_Given = TRUE; - break; - case HSMHV_MOD_VFBOVER: - mod->HSMHV_vfbover = value->rValue; - mod->HSMHV_vfbover_Given = TRUE; - break; - case HSMHV_MOD_NOVER: - mod->HSMHV_nover = value->rValue; - mod->HSMHV_nover_Given = TRUE; - break; - case HSMHV_MOD_NOVERS: - mod->HSMHV_novers = value->rValue; - mod->HSMHV_novers_Given = TRUE; - break; - case HSMHV_MOD_XWD: - mod->HSMHV_xwd = value->rValue; - mod->HSMHV_xwd_Given = TRUE; - break; - case HSMHV_MOD_XWDC: - mod->HSMHV_xwdc = value->rValue; - mod->HSMHV_xwdc_Given = TRUE; - break; - case HSMHV_MOD_XL: - mod->HSMHV_xl = value->rValue; - mod->HSMHV_xl_Given = TRUE; - break; - case HSMHV_MOD_XW: - mod->HSMHV_xw = value->rValue; - mod->HSMHV_xw_Given = TRUE; - break; - case HSMHV_MOD_SAREF: - mod->HSMHV_saref = value->rValue; - mod->HSMHV_saref_Given = TRUE; - break; - case HSMHV_MOD_SBREF: - mod->HSMHV_sbref = value->rValue; - mod->HSMHV_sbref_Given = TRUE; - break; - case HSMHV_MOD_LL: - mod->HSMHV_ll = value->rValue; - mod->HSMHV_ll_Given = TRUE; - break; - case HSMHV_MOD_LLD: - mod->HSMHV_lld = value->rValue; - mod->HSMHV_lld_Given = TRUE; - break; - case HSMHV_MOD_LLN: - mod->HSMHV_lln = value->rValue; - mod->HSMHV_lln_Given = TRUE; - break; - case HSMHV_MOD_WL: - mod->HSMHV_wl = value->rValue; - mod->HSMHV_wl_Given = TRUE; - break; - case HSMHV_MOD_WL1: - mod->HSMHV_wl1 = value->rValue; - mod->HSMHV_wl1_Given = TRUE; - break; - case HSMHV_MOD_WL1P: - mod->HSMHV_wl1p = value->rValue; - mod->HSMHV_wl1p_Given = TRUE; - break; - case HSMHV_MOD_WL2: - mod->HSMHV_wl2 = value->rValue; - mod->HSMHV_wl2_Given = TRUE; - break; - case HSMHV_MOD_WL2P: - mod->HSMHV_wl2p = value->rValue; - mod->HSMHV_wl2p_Given = TRUE; - break; - case HSMHV_MOD_WLD: - mod->HSMHV_wld = value->rValue; - mod->HSMHV_wld_Given = TRUE; - break; - case HSMHV_MOD_WLN: - mod->HSMHV_wln = value->rValue; - mod->HSMHV_wln_Given = TRUE; - break; - case HSMHV_MOD_XQY: - mod->HSMHV_xqy = value->rValue; - mod->HSMHV_xqy_Given = TRUE; - break; - case HSMHV_MOD_XQY1: - mod->HSMHV_xqy1 = value->rValue; - mod->HSMHV_xqy1_Given = TRUE; - break; - case HSMHV_MOD_XQY2: - mod->HSMHV_xqy2 = value->rValue; - mod->HSMHV_xqy2_Given = TRUE; - break; - case HSMHV_MOD_RS: - mod->HSMHV_rs = value->rValue; - mod->HSMHV_rs_Given = TRUE; - break; - case HSMHV_MOD_RD: - mod->HSMHV_rd = value->rValue; - mod->HSMHV_rd_Given = TRUE; - break; - case HSMHV_MOD_RSH: - mod->HSMHV_rsh = value->rValue; - mod->HSMHV_rsh_Given = TRUE; - break; - case HSMHV_MOD_RSHG: - mod->HSMHV_rshg = value->rValue; - mod->HSMHV_rshg_Given = TRUE; - break; - case HSMHV_MOD_VFBC: - mod->HSMHV_vfbc = value->rValue; - mod->HSMHV_vfbc_Given = TRUE; - break; - case HSMHV_MOD_VBI: - mod->HSMHV_vbi = value->rValue; - mod->HSMHV_vbi_Given = TRUE; - break; - case HSMHV_MOD_NSUBC: - mod->HSMHV_nsubc = value->rValue; - mod->HSMHV_nsubc_Given = TRUE; - break; - case HSMHV_MOD_PARL2: - mod->HSMHV_parl2 = value->rValue; - mod->HSMHV_parl2_Given = TRUE; - break; - case HSMHV_MOD_LP: - mod->HSMHV_lp = value->rValue; - mod->HSMHV_lp_Given = TRUE; - break; - case HSMHV_MOD_NSUBP: - mod->HSMHV_nsubp = value->rValue; - mod->HSMHV_nsubp_Given = TRUE; - break; - case HSMHV_MOD_NSUBP0: - mod->HSMHV_nsubp0 = value->rValue; - mod->HSMHV_nsubp0_Given = TRUE; - break; - case HSMHV_MOD_NSUBWP: - mod->HSMHV_nsubwp = value->rValue; - mod->HSMHV_nsubwp_Given = TRUE; - break; - case HSMHV_MOD_SCP1: - mod->HSMHV_scp1 = value->rValue; - mod->HSMHV_scp1_Given = TRUE; - break; - case HSMHV_MOD_SCP2: - mod->HSMHV_scp2 = value->rValue; - mod->HSMHV_scp2_Given = TRUE; - break; - case HSMHV_MOD_SCP3: - mod->HSMHV_scp3 = value->rValue; - mod->HSMHV_scp3_Given = TRUE; - break; - case HSMHV_MOD_SC1: - mod->HSMHV_sc1 = value->rValue; - mod->HSMHV_sc1_Given = TRUE; - break; - case HSMHV_MOD_SC2: - mod->HSMHV_sc2 = value->rValue; - mod->HSMHV_sc2_Given = TRUE; - break; - case HSMHV_MOD_SC3: - mod->HSMHV_sc3 = value->rValue; - mod->HSMHV_sc3_Given = TRUE; - break; - case HSMHV_MOD_SC4: - mod->HSMHV_sc4 = value->rValue; - mod->HSMHV_sc4_Given = TRUE; - break; - case HSMHV_MOD_PGD1: - mod->HSMHV_pgd1 = value->rValue; - mod->HSMHV_pgd1_Given = TRUE; - break; - case HSMHV_MOD_PGD2: - mod->HSMHV_pgd2 = value->rValue; - mod->HSMHV_pgd2_Given = TRUE; - break; - case HSMHV_MOD_PGD3: - mod->HSMHV_pgd3 = value->rValue; - mod->HSMHV_pgd3_Given = TRUE; - break; - case HSMHV_MOD_PGD4: - mod->HSMHV_pgd4 = value->rValue; - mod->HSMHV_pgd4_Given = TRUE; - break; - case HSMHV_MOD_NDEP: - mod->HSMHV_ndep = value->rValue; - mod->HSMHV_ndep_Given = TRUE; - break; - case HSMHV_MOD_NDEPL: - mod->HSMHV_ndepl = value->rValue; - mod->HSMHV_ndepl_Given = TRUE; - break; - case HSMHV_MOD_NDEPLP: - mod->HSMHV_ndeplp = value->rValue; - mod->HSMHV_ndeplp_Given = TRUE; - break; - case HSMHV_MOD_NINV: - mod->HSMHV_ninv = value->rValue; - mod->HSMHV_ninv_Given = TRUE; - break; - case HSMHV_MOD_MUECB0: - mod->HSMHV_muecb0 = value->rValue; - mod->HSMHV_muecb0_Given = TRUE; - break; - case HSMHV_MOD_MUECB1: - mod->HSMHV_muecb1 = value->rValue; - mod->HSMHV_muecb1_Given = TRUE; - break; - case HSMHV_MOD_MUEPH1: - mod->HSMHV_mueph1 = value->rValue; - mod->HSMHV_mueph1_Given = TRUE; - break; - case HSMHV_MOD_MUEPH0: - mod->HSMHV_mueph0 = value->rValue; - mod->HSMHV_mueph0_Given = TRUE; - break; - case HSMHV_MOD_MUEPHW: - mod->HSMHV_muephw = value->rValue; - mod->HSMHV_muephw_Given = TRUE; - break; - case HSMHV_MOD_MUEPWP: - mod->HSMHV_muepwp = value->rValue; - mod->HSMHV_muepwp_Given = TRUE; - break; - case HSMHV_MOD_MUEPHL: - mod->HSMHV_muephl = value->rValue; - mod->HSMHV_muephl_Given = TRUE; - break; - case HSMHV_MOD_MUEPLP: - mod->HSMHV_mueplp = value->rValue; - mod->HSMHV_mueplp_Given = TRUE; - break; - case HSMHV_MOD_MUEPHS: - mod->HSMHV_muephs = value->rValue; - mod->HSMHV_muephs_Given = TRUE; - break; - case HSMHV_MOD_MUEPSP: - mod->HSMHV_muepsp = value->rValue; - mod->HSMHV_muepsp_Given = TRUE; - break; - case HSMHV_MOD_VTMP: - mod->HSMHV_vtmp = value->rValue; - mod->HSMHV_vtmp_Given = TRUE; - break; - case HSMHV_MOD_WVTH0: - mod->HSMHV_wvth0 = value->rValue; - mod->HSMHV_wvth0_Given = TRUE; - break; - case HSMHV_MOD_MUESR1: - mod->HSMHV_muesr1 = value->rValue; - mod->HSMHV_muesr1_Given = TRUE; - break; - case HSMHV_MOD_MUESR0: - mod->HSMHV_muesr0 = value->rValue; - mod->HSMHV_muesr0_Given = TRUE; - break; - case HSMHV_MOD_MUESRL: - mod->HSMHV_muesrl = value->rValue; - mod->HSMHV_muesrl_Given = TRUE; - break; - case HSMHV_MOD_MUESLP: - mod->HSMHV_mueslp = value->rValue; - mod->HSMHV_mueslp_Given = TRUE; - break; - case HSMHV_MOD_MUESRW: - mod->HSMHV_muesrw = value->rValue; - mod->HSMHV_muesrw_Given = TRUE; - break; - case HSMHV_MOD_MUESWP: - mod->HSMHV_mueswp = value->rValue; - mod->HSMHV_mueswp_Given = TRUE; - break; - case HSMHV_MOD_BB: - mod->HSMHV_bb = value->rValue; - mod->HSMHV_bb_Given = TRUE; - break; - case HSMHV_MOD_SUB1: - mod->HSMHV_sub1 = value->rValue; - mod->HSMHV_sub1_Given = TRUE; - break; - case HSMHV_MOD_SUB2: - mod->HSMHV_sub2 = value->rValue; - mod->HSMHV_sub2_Given = TRUE; - break; - case HSMHV_MOD_SVGS: - mod->HSMHV_svgs = value->rValue; - mod->HSMHV_svgs_Given = TRUE; - break; - case HSMHV_MOD_SVBS: - mod->HSMHV_svbs = value->rValue; - mod->HSMHV_svbs_Given = TRUE; - break; - case HSMHV_MOD_SVBSL: - mod->HSMHV_svbsl = value->rValue; - mod->HSMHV_svbsl_Given = TRUE; - break; - case HSMHV_MOD_SVDS: - mod->HSMHV_svds = value->rValue; - mod->HSMHV_svds_Given = TRUE; - break; - case HSMHV_MOD_SLG: - mod->HSMHV_slg = value->rValue; - mod->HSMHV_slg_Given = TRUE; - break; - case HSMHV_MOD_SUB1L: - mod->HSMHV_sub1l = value->rValue; - mod->HSMHV_sub1l_Given = TRUE; - break; - case HSMHV_MOD_SUB2L: - mod->HSMHV_sub2l = value->rValue; - mod->HSMHV_sub2l_Given = TRUE; - break; - case HSMHV_MOD_FN1: - mod->HSMHV_fn1 = value->rValue; - mod->HSMHV_fn1_Given = TRUE; - break; - case HSMHV_MOD_FN2: - mod->HSMHV_fn2 = value->rValue; - mod->HSMHV_fn2_Given = TRUE; - break; - case HSMHV_MOD_FN3: - mod->HSMHV_fn3 = value->rValue; - mod->HSMHV_fn3_Given = TRUE; - break; - case HSMHV_MOD_FVBS: - mod->HSMHV_fvbs = value->rValue; - mod->HSMHV_fvbs_Given = TRUE; - break; - case HSMHV_MOD_SVGSL: - mod->HSMHV_svgsl = value->rValue; - mod->HSMHV_svgsl_Given = TRUE; - break; - case HSMHV_MOD_SVGSLP: - mod->HSMHV_svgslp = value->rValue; - mod->HSMHV_svgslp_Given = TRUE; - break; - case HSMHV_MOD_SVGSWP: - mod->HSMHV_svgswp = value->rValue; - mod->HSMHV_svgswp_Given = TRUE; - break; - case HSMHV_MOD_SVGSW: - mod->HSMHV_svgsw = value->rValue; - mod->HSMHV_svgsw_Given = TRUE; - break; - case HSMHV_MOD_SVBSLP: - mod->HSMHV_svbslp = value->rValue; - mod->HSMHV_svbslp_Given = TRUE; - break; - case HSMHV_MOD_SLGL: - mod->HSMHV_slgl = value->rValue; - mod->HSMHV_slgl_Given = TRUE; - break; - case HSMHV_MOD_SLGLP: - mod->HSMHV_slglp = value->rValue; - mod->HSMHV_slglp_Given = TRUE; - break; - case HSMHV_MOD_SUB1LP: - mod->HSMHV_sub1lp = value->rValue; - mod->HSMHV_sub1lp_Given = TRUE; - break; - case HSMHV_MOD_NSTI: - mod->HSMHV_nsti = value->rValue; - mod->HSMHV_nsti_Given = TRUE; - break; - case HSMHV_MOD_WSTI: - mod->HSMHV_wsti = value->rValue; - mod->HSMHV_wsti_Given = TRUE; - break; - case HSMHV_MOD_WSTIL: - mod->HSMHV_wstil = value->rValue; - mod->HSMHV_wstil_Given = TRUE; - break; - case HSMHV_MOD_WSTILP: - mod->HSMHV_wstilp = value->rValue; - mod->HSMHV_wstilp_Given = TRUE; - break; - case HSMHV_MOD_WSTIW: - mod->HSMHV_wstiw = value->rValue; - mod->HSMHV_wstiw_Given = TRUE; - break; - case HSMHV_MOD_WSTIWP: - mod->HSMHV_wstiwp = value->rValue; - mod->HSMHV_wstiwp_Given = TRUE; - break; - case HSMHV_MOD_SCSTI1: - mod->HSMHV_scsti1 = value->rValue; - mod->HSMHV_scsti1_Given = TRUE; - break; - case HSMHV_MOD_SCSTI2: - mod->HSMHV_scsti2 = value->rValue; - mod->HSMHV_scsti2_Given = TRUE; - break; - case HSMHV_MOD_VTHSTI: - mod->HSMHV_vthsti = value->rValue; - mod->HSMHV_vthsti_Given = TRUE; - break; - case HSMHV_MOD_VDSTI: - mod->HSMHV_vdsti = value->rValue; - mod->HSMHV_vdsti_Given = TRUE; - break; - case HSMHV_MOD_MUESTI1: - mod->HSMHV_muesti1 = value->rValue; - mod->HSMHV_muesti1_Given = TRUE; - break; - case HSMHV_MOD_MUESTI2: - mod->HSMHV_muesti2 = value->rValue; - mod->HSMHV_muesti2_Given = TRUE; - break; - case HSMHV_MOD_MUESTI3: - mod->HSMHV_muesti3 = value->rValue; - mod->HSMHV_muesti3_Given = TRUE; - break; - case HSMHV_MOD_NSUBPSTI1: - mod->HSMHV_nsubpsti1 = value->rValue; - mod->HSMHV_nsubpsti1_Given = TRUE; - break; - case HSMHV_MOD_NSUBPSTI2: - mod->HSMHV_nsubpsti2 = value->rValue; - mod->HSMHV_nsubpsti2_Given = TRUE; - break; - case HSMHV_MOD_NSUBPSTI3: - mod->HSMHV_nsubpsti3 = value->rValue; - mod->HSMHV_nsubpsti3_Given = TRUE; - break; - case HSMHV_MOD_LPEXT: - mod->HSMHV_lpext = value->rValue; - mod->HSMHV_lpext_Given = TRUE; - break; - case HSMHV_MOD_NPEXT: - mod->HSMHV_npext = value->rValue; - mod->HSMHV_npext_Given = TRUE; - break; - case HSMHV_MOD_SCP22: - mod->HSMHV_scp22 = value->rValue; - mod->HSMHV_scp22_Given = TRUE; - break; - case HSMHV_MOD_SCP21: - mod->HSMHV_scp21 = value->rValue; - mod->HSMHV_scp21_Given = TRUE; - break; - case HSMHV_MOD_BS1: - mod->HSMHV_bs1 = value->rValue; - mod->HSMHV_bs1_Given = TRUE; - break; - case HSMHV_MOD_BS2: - mod->HSMHV_bs2 = value->rValue; - mod->HSMHV_bs2_Given = TRUE; - break; - case HSMHV_MOD_CGSO: - mod->HSMHV_cgso = value->rValue; - mod->HSMHV_cgso_Given = TRUE; - break; - case HSMHV_MOD_CGDO: - mod->HSMHV_cgdo = value->rValue; - mod->HSMHV_cgdo_Given = TRUE; - break; - case HSMHV_MOD_CGBO: - mod->HSMHV_cgbo = value->rValue; - mod->HSMHV_cgbo_Given = TRUE; - break; - case HSMHV_MOD_TPOLY: - mod->HSMHV_tpoly = value->rValue; - mod->HSMHV_tpoly_Given = TRUE; - break; - case HSMHV_MOD_JS0: - mod->HSMHV_js0 = value->rValue; - mod->HSMHV_js0_Given = TRUE; - break; - case HSMHV_MOD_JS0SW: - mod->HSMHV_js0sw = value->rValue; - mod->HSMHV_js0sw_Given = TRUE; - break; - case HSMHV_MOD_NJ: - mod->HSMHV_nj = value->rValue; - mod->HSMHV_nj_Given = TRUE; - break; - case HSMHV_MOD_NJSW: - mod->HSMHV_njsw = value->rValue; - mod->HSMHV_njsw_Given = TRUE; - break; - case HSMHV_MOD_XTI: - mod->HSMHV_xti = value->rValue; - mod->HSMHV_xti_Given = TRUE; - break; - case HSMHV_MOD_CJ: - mod->HSMHV_cj = value->rValue; - mod->HSMHV_cj_Given = TRUE; - break; - case HSMHV_MOD_CJSW: - mod->HSMHV_cjsw = value->rValue; - mod->HSMHV_cjsw_Given = TRUE; - break; - case HSMHV_MOD_CJSWG: - mod->HSMHV_cjswg = value->rValue; - mod->HSMHV_cjswg_Given = TRUE; - break; - case HSMHV_MOD_MJ: - mod->HSMHV_mj = value->rValue; - mod->HSMHV_mj_Given = TRUE; - break; - case HSMHV_MOD_MJSW: - mod->HSMHV_mjsw = value->rValue; - mod->HSMHV_mjsw_Given = TRUE; - break; - case HSMHV_MOD_MJSWG: - mod->HSMHV_mjswg = value->rValue; - mod->HSMHV_mjswg_Given = TRUE; - break; - case HSMHV_MOD_PB: - mod->HSMHV_pb = value->rValue; - mod->HSMHV_pb_Given = TRUE; - break; - case HSMHV_MOD_PBSW: - mod->HSMHV_pbsw = value->rValue; - mod->HSMHV_pbsw_Given = TRUE; - break; - case HSMHV_MOD_PBSWG: - mod->HSMHV_pbswg = value->rValue; - mod->HSMHV_pbswg_Given = TRUE; - break; - case HSMHV_MOD_XTI2: - mod->HSMHV_xti2 = value->rValue; - mod->HSMHV_xti2_Given = TRUE; - break; - case HSMHV_MOD_CISB: - mod->HSMHV_cisb = value->rValue; - mod->HSMHV_cisb_Given = TRUE; - break; - case HSMHV_MOD_CVB: - mod->HSMHV_cvb = value->rValue; - mod->HSMHV_cvb_Given = TRUE; - break; - case HSMHV_MOD_CTEMP: - mod->HSMHV_ctemp = value->rValue; - mod->HSMHV_ctemp_Given = TRUE; - break; - case HSMHV_MOD_CISBK: - mod->HSMHV_cisbk = value->rValue; - mod->HSMHV_cisbk_Given = TRUE; - break; - case HSMHV_MOD_CVBK: - mod->HSMHV_cvbk = value->rValue; - mod->HSMHV_cvbk_Given = TRUE; - break; - case HSMHV_MOD_DIVX: - mod->HSMHV_divx = value->rValue; - mod->HSMHV_divx_Given = TRUE; - break; - case HSMHV_MOD_CLM1: - mod->HSMHV_clm1 = value->rValue; - mod->HSMHV_clm1_Given = TRUE; - break; - case HSMHV_MOD_CLM2: - mod->HSMHV_clm2 = value->rValue; - mod->HSMHV_clm2_Given = TRUE; - break; - case HSMHV_MOD_CLM3: - mod->HSMHV_clm3 = value->rValue; - mod->HSMHV_clm3_Given = TRUE; - break; - case HSMHV_MOD_CLM5: - mod->HSMHV_clm5 = value->rValue; - mod->HSMHV_clm5_Given = TRUE; - break; - case HSMHV_MOD_CLM6: - mod->HSMHV_clm6 = value->rValue; - mod->HSMHV_clm6_Given = TRUE; - break; - case HSMHV_MOD_MUETMP: - mod->HSMHV_muetmp = value->rValue; - mod->HSMHV_muetmp_Given = TRUE; - break; - case HSMHV_MOD_VOVER: - mod->HSMHV_vover = value->rValue; - mod->HSMHV_vover_Given = TRUE; - break; - case HSMHV_MOD_VOVERP: - mod->HSMHV_voverp = value->rValue; - mod->HSMHV_voverp_Given = TRUE; - break; - case HSMHV_MOD_VOVERS: - mod->HSMHV_vovers = value->rValue; - mod->HSMHV_vovers_Given = TRUE; - break; - case HSMHV_MOD_VOVERSP: - mod->HSMHV_voversp = value->rValue; - mod->HSMHV_voversp_Given = TRUE; - break; - case HSMHV_MOD_WFC: - mod->HSMHV_wfc = value->rValue; - mod->HSMHV_wfc_Given = TRUE; - break; - case HSMHV_MOD_NSUBCW: - mod->HSMHV_nsubcw = value->rValue; - mod->HSMHV_nsubcw_Given = TRUE; - break; - case HSMHV_MOD_NSUBCWP: - mod->HSMHV_nsubcwp = value->rValue; - mod->HSMHV_nsubcwp_Given = TRUE; - break; - case HSMHV_MOD_QME1: - mod->HSMHV_qme1 = value->rValue; - mod->HSMHV_qme1_Given = TRUE; - break; - case HSMHV_MOD_QME2: - mod->HSMHV_qme2 = value->rValue; - mod->HSMHV_qme2_Given = TRUE; - break; - case HSMHV_MOD_QME3: - mod->HSMHV_qme3 = value->rValue; - mod->HSMHV_qme3_Given = TRUE; - break; - case HSMHV_MOD_GIDL1: - mod->HSMHV_gidl1 = value->rValue; - mod->HSMHV_gidl1_Given = TRUE; - break; - case HSMHV_MOD_GIDL2: - mod->HSMHV_gidl2 = value->rValue; - mod->HSMHV_gidl2_Given = TRUE; - break; - case HSMHV_MOD_GIDL3: - mod->HSMHV_gidl3 = value->rValue; - mod->HSMHV_gidl3_Given = TRUE; - break; - case HSMHV_MOD_GIDL4: - mod->HSMHV_gidl4 = value->rValue; - mod->HSMHV_gidl4_Given = TRUE; - break; - case HSMHV_MOD_GIDL5: - mod->HSMHV_gidl5 = value->rValue; - mod->HSMHV_gidl5_Given = TRUE; - break; - case HSMHV_MOD_GLEAK1: - mod->HSMHV_gleak1 = value->rValue; - mod->HSMHV_gleak1_Given = TRUE; - break; - case HSMHV_MOD_GLEAK2: - mod->HSMHV_gleak2 = value->rValue; - mod->HSMHV_gleak2_Given = TRUE; - break; - case HSMHV_MOD_GLEAK3: - mod->HSMHV_gleak3 = value->rValue; - mod->HSMHV_gleak3_Given = TRUE; - break; - case HSMHV_MOD_GLEAK4: - mod->HSMHV_gleak4 = value->rValue; - mod->HSMHV_gleak4_Given = TRUE; - break; - case HSMHV_MOD_GLEAK5: - mod->HSMHV_gleak5 = value->rValue; - mod->HSMHV_gleak5_Given = TRUE; - break; - case HSMHV_MOD_GLEAK6: - mod->HSMHV_gleak6 = value->rValue; - mod->HSMHV_gleak6_Given = TRUE; - break; - case HSMHV_MOD_GLEAK7: - mod->HSMHV_gleak7 = value->rValue; - mod->HSMHV_gleak7_Given = TRUE; - break; - case HSMHV_MOD_GLPART1: - mod->HSMHV_glpart1 = value->rValue; - mod->HSMHV_glpart1_Given = TRUE; - break; - case HSMHV_MOD_GLKSD1: - mod->HSMHV_glksd1 = value->rValue; - mod->HSMHV_glksd1_Given = TRUE; - break; - case HSMHV_MOD_GLKSD2: - mod->HSMHV_glksd2 = value->rValue; - mod->HSMHV_glksd2_Given = TRUE; - break; - case HSMHV_MOD_GLKSD3: - mod->HSMHV_glksd3 = value->rValue; - mod->HSMHV_glksd3_Given = TRUE; - break; - case HSMHV_MOD_GLKB1: - mod->HSMHV_glkb1 = value->rValue; - mod->HSMHV_glkb1_Given = TRUE; - break; - case HSMHV_MOD_GLKB2: - mod->HSMHV_glkb2 = value->rValue; - mod->HSMHV_glkb2_Given = TRUE; - break; - case HSMHV_MOD_GLKB3: - mod->HSMHV_glkb3 = value->rValue; - mod->HSMHV_glkb3_Given = TRUE; - break; - case HSMHV_MOD_EGIG: - mod->HSMHV_egig = value->rValue; - mod->HSMHV_egig_Given = TRUE; - break; - case HSMHV_MOD_IGTEMP2: - mod->HSMHV_igtemp2 = value->rValue; - mod->HSMHV_igtemp2_Given = TRUE; - break; - case HSMHV_MOD_IGTEMP3: - mod->HSMHV_igtemp3 = value->rValue; - mod->HSMHV_igtemp3_Given = TRUE; - break; - case HSMHV_MOD_VZADD0: - mod->HSMHV_vzadd0 = value->rValue; - mod->HSMHV_vzadd0_Given = TRUE; - break; - case HSMHV_MOD_PZADD0: - mod->HSMHV_pzadd0 = value->rValue; - mod->HSMHV_pzadd0_Given = TRUE; - break; - case HSMHV_MOD_NFTRP: - mod->HSMHV_nftrp = value->rValue; - mod->HSMHV_nftrp_Given = TRUE; - break; - case HSMHV_MOD_NFALP: - mod->HSMHV_nfalp = value->rValue; - mod->HSMHV_nfalp_Given = TRUE; - break; - case HSMHV_MOD_CIT: - mod->HSMHV_cit = value->rValue; - mod->HSMHV_cit_Given = TRUE; - break; - case HSMHV_MOD_FALPH: - mod->HSMHV_falph = value->rValue; - mod->HSMHV_falph_Given = TRUE; - break; - case HSMHV_MOD_KAPPA: - mod->HSMHV_kappa = value->rValue; - mod->HSMHV_kappa_Given = TRUE; - break; - case HSMHV_MOD_PTHROU: - mod->HSMHV_pthrou = value->rValue; - mod->HSMHV_pthrou_Given = TRUE; - break; - case HSMHV_MOD_VDIFFJ: - mod->HSMHV_vdiffj = value->rValue; - mod->HSMHV_vdiffj_Given = TRUE; - break; - case HSMHV_MOD_DLY1: - mod->HSMHV_dly1 = value->rValue; - mod->HSMHV_dly1_Given = TRUE; - break; - case HSMHV_MOD_DLY2: - mod->HSMHV_dly2 = value->rValue; - mod->HSMHV_dly2_Given = TRUE; - break; - case HSMHV_MOD_DLY3: - mod->HSMHV_dly3 = value->rValue; - mod->HSMHV_dly3_Given = TRUE; - break; - case HSMHV_MOD_TNOM: - mod->HSMHV_tnom = value->rValue; - mod->HSMHV_tnom_Given = TRUE; - break; - case HSMHV_MOD_OVSLP: - mod->HSMHV_ovslp = value->rValue; - mod->HSMHV_ovslp_Given = TRUE; - break; - case HSMHV_MOD_OVMAG: - mod->HSMHV_ovmag = value->rValue; - mod->HSMHV_ovmag_Given = TRUE; - break; - case HSMHV_MOD_GBMIN: - mod->HSMHV_gbmin = value->rValue; - mod->HSMHV_gbmin_Given = TRUE; - break; - case HSMHV_MOD_RBPB: - mod->HSMHV_rbpb = value->rValue; - mod->HSMHV_rbpb_Given = TRUE; - break; - case HSMHV_MOD_RBPD: - mod->HSMHV_rbpd = value->rValue; - mod->HSMHV_rbpd_Given = TRUE; - break; - case HSMHV_MOD_RBPS: - mod->HSMHV_rbps = value->rValue; - mod->HSMHV_rbps_Given = TRUE; - break; - case HSMHV_MOD_RBDB: - mod->HSMHV_rbdb = value->rValue; - mod->HSMHV_rbdb_Given = TRUE; - break; - case HSMHV_MOD_RBSB: - mod->HSMHV_rbsb = value->rValue; - mod->HSMHV_rbsb_Given = TRUE; - break; - case HSMHV_MOD_IBPC1: - mod->HSMHV_ibpc1 = value->rValue; - mod->HSMHV_ibpc1_Given = TRUE; - break; - case HSMHV_MOD_IBPC2: - mod->HSMHV_ibpc2 = value->rValue; - mod->HSMHV_ibpc2_Given = TRUE; - break; - case HSMHV_MOD_MPHDFM: - mod->HSMHV_mphdfm = value->rValue; - mod->HSMHV_mphdfm_Given = TRUE; - break; - case HSMHV_MOD_RDVG11: - mod->HSMHV_rdvg11 = value->rValue; - mod->HSMHV_rdvg11_Given = TRUE; - break; - case HSMHV_MOD_RDVG12: - mod->HSMHV_rdvg12 = value->rValue; - mod->HSMHV_rdvg12_Given = TRUE; - break; - case HSMHV_MOD_RD20: - mod->HSMHV_rd20 = value->rValue; - mod->HSMHV_rd20_Given = TRUE; - break; - case HSMHV_MOD_QOVSM: - mod->HSMHV_qovsm = value->rValue; - mod->HSMHV_qovsm_Given = TRUE; - break; - case HSMHV_MOD_LDRIFT: - mod->HSMHV_ldrift = value->rValue; - mod->HSMHV_ldrift_Given = TRUE; - break; - case HSMHV_MOD_RD21: - mod->HSMHV_rd21 = value->rValue; - mod->HSMHV_rd21_Given = TRUE; - break; - case HSMHV_MOD_RD22: - mod->HSMHV_rd22 = value->rValue; - mod->HSMHV_rd22_Given = TRUE; - break; - case HSMHV_MOD_RD22D: - mod->HSMHV_rd22d = value->rValue; - mod->HSMHV_rd22d_Given = TRUE; - break; - case HSMHV_MOD_RD23: - mod->HSMHV_rd23 = value->rValue; - mod->HSMHV_rd23_Given = TRUE; - break; - case HSMHV_MOD_RD24: - mod->HSMHV_rd24 = value->rValue; - mod->HSMHV_rd24_Given = TRUE; - break; - case HSMHV_MOD_RD25: - mod->HSMHV_rd25 = value->rValue; - mod->HSMHV_rd25_Given = TRUE; - break; - case HSMHV_MOD_RD26: - mod->HSMHV_rd26 = value->rValue; - mod->HSMHV_rd26_Given = TRUE; - break; - case HSMHV_MOD_RDVDL: - mod->HSMHV_rdvdl = value->rValue; - mod->HSMHV_rdvdl_Given = TRUE; - break; - case HSMHV_MOD_RDVDLP: - mod->HSMHV_rdvdlp = value->rValue; - mod->HSMHV_rdvdlp_Given = TRUE; - break; - case HSMHV_MOD_RDVDS: - mod->HSMHV_rdvds = value->rValue; - mod->HSMHV_rdvds_Given = TRUE; - break; - case HSMHV_MOD_RDVDSP: - mod->HSMHV_rdvdsp = value->rValue; - mod->HSMHV_rdvdsp_Given = TRUE; - break; - case HSMHV_MOD_RD23L: - mod->HSMHV_rd23l = value->rValue; - mod->HSMHV_rd23l_Given = TRUE; - break; - case HSMHV_MOD_RD23LP: - mod->HSMHV_rd23lp = value->rValue; - mod->HSMHV_rd23lp_Given = TRUE; - break; - case HSMHV_MOD_RD23S: - mod->HSMHV_rd23s = value->rValue; - mod->HSMHV_rd23s_Given = TRUE; - break; - case HSMHV_MOD_RD23SP: - mod->HSMHV_rd23sp = value->rValue; - mod->HSMHV_rd23sp_Given = TRUE; - break; - case HSMHV_MOD_RDS: - mod->HSMHV_rds = value->rValue; - mod->HSMHV_rds_Given = TRUE; - break; - case HSMHV_MOD_RDSP: - mod->HSMHV_rdsp = value->rValue; - mod->HSMHV_rdsp_Given = TRUE; - break; - case HSMHV_MOD_RTH0: /* Self-heating model */ - mod->HSMHV_rth0 = value->rValue; - mod->HSMHV_rth0_Given = TRUE; - break; - case HSMHV_MOD_CTH0: /* Self-heating model */ - mod->HSMHV_cth0 = value->rValue; - mod->HSMHV_cth0_Given = TRUE; - break; - case HSMHV_MOD_POWRAT: /* Self-heating model */ - mod->HSMHV_powrat = value->rValue; - mod->HSMHV_powrat_Given = TRUE; - break; - case HSMHV_MOD_TCJBD: /* Self-heating model */ - mod->HSMHV_tcjbd = value->rValue; - mod->HSMHV_tcjbd_Given = TRUE; - break; - case HSMHV_MOD_TCJBS: /* Self-heating model */ - mod->HSMHV_tcjbs = value->rValue; - mod->HSMHV_tcjbs_Given = TRUE; - break; - case HSMHV_MOD_TCJBDSW: /* Self-heating model */ - mod->HSMHV_tcjbdsw = value->rValue; - mod->HSMHV_tcjbdsw_Given = TRUE; - break; - case HSMHV_MOD_TCJBSSW: /* Self-heating model */ - mod->HSMHV_tcjbssw = value->rValue; - mod->HSMHV_tcjbssw_Given = TRUE; - break; - case HSMHV_MOD_TCJBDSWG: /* Self-heating model */ - mod->HSMHV_tcjbdswg = value->rValue; - mod->HSMHV_tcjbdswg_Given = TRUE; - break; - case HSMHV_MOD_TCJBSSWG: /* Self-heating model */ - mod->HSMHV_tcjbsswg = value->rValue; - mod->HSMHV_tcjbsswg_Given = TRUE; - break; - - case HSMHV_MOD_DLYOV: - mod->HSMHV_dlyov = value->rValue; - mod->HSMHV_dlyov_Given = TRUE; - break; - case HSMHV_MOD_QDFTVD: - mod->HSMHV_qdftvd = value->rValue; - mod->HSMHV_qdftvd_Given = TRUE; - break; - case HSMHV_MOD_XLDLD: - mod->HSMHV_xldld = value->rValue; - mod->HSMHV_xldld_Given = TRUE; - break; - case HSMHV_MOD_XWDLD: - mod->HSMHV_xwdld = value->rValue; - mod->HSMHV_xwdld_Given = TRUE; - break; - case HSMHV_MOD_RDVD: - mod->HSMHV_rdvd = value->rValue; - mod->HSMHV_rdvd_Given = TRUE; - break; - - case HSMHV_MOD_RDTEMP1: - mod->HSMHV_rdtemp1 = value->rValue; - mod->HSMHV_rdtemp1_Given = TRUE; - break; - case HSMHV_MOD_RDTEMP2: - mod->HSMHV_rdtemp2 = value->rValue; - mod->HSMHV_rdtemp2_Given = TRUE; - break; - case HSMHV_MOD_RTH0R: - mod->HSMHV_rth0r = value->rValue; - mod->HSMHV_rth0r_Given = TRUE; - break; - case HSMHV_MOD_RDVDTEMP1: - mod->HSMHV_rdvdtemp1 = value->rValue; - mod->HSMHV_rdvdtemp1_Given = TRUE; - break; - case HSMHV_MOD_RDVDTEMP2: - mod->HSMHV_rdvdtemp2 = value->rValue; - mod->HSMHV_rdvdtemp2_Given = TRUE; - break; - case HSMHV_MOD_RTH0W: - mod->HSMHV_rth0w = value->rValue; - mod->HSMHV_rth0w_Given = TRUE; - break; - case HSMHV_MOD_RTH0WP: - mod->HSMHV_rth0wp = value->rValue; - mod->HSMHV_rth0wp_Given = TRUE; - break; - case HSMHV_MOD_CVDSOVER: - mod->HSMHV_cvdsover = value->rValue; - mod->HSMHV_cvdsover_Given = TRUE; - break; - - case HSMHV_MOD_NINVD: - mod->HSMHV_ninvd = value->rValue; - mod->HSMHV_ninvd_Given = TRUE; - break; - case HSMHV_MOD_NINVDW: - mod->HSMHV_ninvdw = value->rValue; - mod->HSMHV_ninvdw_Given = TRUE; - break; - case HSMHV_MOD_NINVDWP: - mod->HSMHV_ninvdwp = value->rValue; - mod->HSMHV_ninvdwp_Given = TRUE; - break; - case HSMHV_MOD_NINVDT1: - mod->HSMHV_ninvdt1 = value->rValue; - mod->HSMHV_ninvdt1_Given = TRUE; - break; - case HSMHV_MOD_NINVDT2: - mod->HSMHV_ninvdt2 = value->rValue; - mod->HSMHV_ninvdt2_Given = TRUE; - break; - case HSMHV_MOD_VBSMIN: - mod->HSMHV_vbsmin = value->rValue; - mod->HSMHV_vbsmin_Given = TRUE; - break; - case HSMHV_MOD_RDVB: - mod->HSMHV_rdvb = value->rValue; - mod->HSMHV_rdvb_Given = TRUE; - break; - case HSMHV_MOD_RTH0NF: - mod->HSMHV_rth0nf = value->rValue; - mod->HSMHV_rth0nf_Given = TRUE; - break; - case HSMHV_MOD_RTHTEMP1: - mod->HSMHV_rthtemp1 = value->rValue; - mod->HSMHV_rthtemp1_Given = TRUE; - break; - case HSMHV_MOD_RTHTEMP2: - mod->HSMHV_rthtemp2 = value->rValue; - mod->HSMHV_rthtemp2_Given = TRUE; - break; - case HSMHV_MOD_PRATTEMP1: - mod->HSMHV_prattemp1 = value->rValue; - mod->HSMHV_prattemp1_Given = TRUE; - break; - case HSMHV_MOD_PRATTEMP2: - mod->HSMHV_prattemp2 = value->rValue; - mod->HSMHV_prattemp2_Given = TRUE; - break; - - case HSMHV_MOD_RDVSUB: /* substrate effect */ - mod->HSMHV_rdvsub = value->rValue; - mod->HSMHV_rdvsub_Given = TRUE; - break; - case HSMHV_MOD_RDVDSUB: - mod->HSMHV_rdvdsub = value->rValue; - mod->HSMHV_rdvdsub_Given = TRUE; - break; - case HSMHV_MOD_DDRIFT: - mod->HSMHV_ddrift = value->rValue; - mod->HSMHV_ddrift_Given = TRUE; - break; - case HSMHV_MOD_VBISUB: - mod->HSMHV_vbisub = value->rValue; - mod->HSMHV_vbisub_Given = TRUE; - break; - case HSMHV_MOD_NSUBSUB: - mod->HSMHV_nsubsub = value->rValue; - mod->HSMHV_nsubsub_Given = TRUE; - break; - case HSMHV_MOD_SHEMAX: - mod->HSMHV_shemax = value->rValue; - mod->HSMHV_shemax_Given = TRUE; - break; - - - - /* binning parameters */ - case HSMHV_MOD_LMIN: - mod->HSMHV_lmin = value->rValue; - mod->HSMHV_lmin_Given = TRUE; - break; - case HSMHV_MOD_LMAX: - mod->HSMHV_lmax = value->rValue; - mod->HSMHV_lmax_Given = TRUE; - break; - case HSMHV_MOD_WMIN: - mod->HSMHV_wmin = value->rValue; - mod->HSMHV_wmin_Given = TRUE; - break; - case HSMHV_MOD_WMAX: - mod->HSMHV_wmax = value->rValue; - mod->HSMHV_wmax_Given = TRUE; - break; - case HSMHV_MOD_LBINN: - mod->HSMHV_lbinn = value->rValue; - mod->HSMHV_lbinn_Given = TRUE; - break; - case HSMHV_MOD_WBINN: - mod->HSMHV_wbinn = value->rValue; - mod->HSMHV_wbinn_Given = TRUE; - break; - - /* Length dependence */ - case HSMHV_MOD_LVMAX: - mod->HSMHV_lvmax = value->rValue; - mod->HSMHV_lvmax_Given = TRUE; - break; - case HSMHV_MOD_LBGTMP1: - mod->HSMHV_lbgtmp1 = value->rValue; - mod->HSMHV_lbgtmp1_Given = TRUE; - break; - case HSMHV_MOD_LBGTMP2: - mod->HSMHV_lbgtmp2 = value->rValue; - mod->HSMHV_lbgtmp2_Given = TRUE; - break; - case HSMHV_MOD_LEG0: - mod->HSMHV_leg0 = value->rValue; - mod->HSMHV_leg0_Given = TRUE; - break; - case HSMHV_MOD_LVFBOVER: - mod->HSMHV_lvfbover = value->rValue; - mod->HSMHV_lvfbover_Given = TRUE; - break; - case HSMHV_MOD_LNOVER: - mod->HSMHV_lnover = value->rValue; - mod->HSMHV_lnover_Given = TRUE; - break; - case HSMHV_MOD_LNOVERS: - mod->HSMHV_lnovers = value->rValue; - mod->HSMHV_lnovers_Given = TRUE; - break; - case HSMHV_MOD_LWL2: - mod->HSMHV_lwl2 = value->rValue; - mod->HSMHV_lwl2_Given = TRUE; - break; - case HSMHV_MOD_LVFBC: - mod->HSMHV_lvfbc = value->rValue; - mod->HSMHV_lvfbc_Given = TRUE; - break; - case HSMHV_MOD_LNSUBC: - mod->HSMHV_lnsubc = value->rValue; - mod->HSMHV_lnsubc_Given = TRUE; - break; - case HSMHV_MOD_LNSUBP: - mod->HSMHV_lnsubp = value->rValue; - mod->HSMHV_lnsubp_Given = TRUE; - break; - case HSMHV_MOD_LSCP1: - mod->HSMHV_lscp1 = value->rValue; - mod->HSMHV_lscp1_Given = TRUE; - break; - case HSMHV_MOD_LSCP2: - mod->HSMHV_lscp2 = value->rValue; - mod->HSMHV_lscp2_Given = TRUE; - break; - case HSMHV_MOD_LSCP3: - mod->HSMHV_lscp3 = value->rValue; - mod->HSMHV_lscp3_Given = TRUE; - break; - case HSMHV_MOD_LSC1: - mod->HSMHV_lsc1 = value->rValue; - mod->HSMHV_lsc1_Given = TRUE; - break; - case HSMHV_MOD_LSC2: - mod->HSMHV_lsc2 = value->rValue; - mod->HSMHV_lsc2_Given = TRUE; - break; - case HSMHV_MOD_LSC3: - mod->HSMHV_lsc3 = value->rValue; - mod->HSMHV_lsc3_Given = TRUE; - break; - case HSMHV_MOD_LPGD1: - mod->HSMHV_lpgd1 = value->rValue; - mod->HSMHV_lpgd1_Given = TRUE; - break; - case HSMHV_MOD_LPGD3: - mod->HSMHV_lpgd3 = value->rValue; - mod->HSMHV_lpgd3_Given = TRUE; - break; - case HSMHV_MOD_LNDEP: - mod->HSMHV_lndep = value->rValue; - mod->HSMHV_lndep_Given = TRUE; - break; - case HSMHV_MOD_LNINV: - mod->HSMHV_lninv = value->rValue; - mod->HSMHV_lninv_Given = TRUE; - break; - case HSMHV_MOD_LMUECB0: - mod->HSMHV_lmuecb0 = value->rValue; - mod->HSMHV_lmuecb0_Given = TRUE; - break; - case HSMHV_MOD_LMUECB1: - mod->HSMHV_lmuecb1 = value->rValue; - mod->HSMHV_lmuecb1_Given = TRUE; - break; - case HSMHV_MOD_LMUEPH1: - mod->HSMHV_lmueph1 = value->rValue; - mod->HSMHV_lmueph1_Given = TRUE; - break; - case HSMHV_MOD_LVTMP: - mod->HSMHV_lvtmp = value->rValue; - mod->HSMHV_lvtmp_Given = TRUE; - break; - case HSMHV_MOD_LWVTH0: - mod->HSMHV_lwvth0 = value->rValue; - mod->HSMHV_lwvth0_Given = TRUE; - break; - case HSMHV_MOD_LMUESR1: - mod->HSMHV_lmuesr1 = value->rValue; - mod->HSMHV_lmuesr1_Given = TRUE; - break; - case HSMHV_MOD_LMUETMP: - mod->HSMHV_lmuetmp = value->rValue; - mod->HSMHV_lmuetmp_Given = TRUE; - break; - case HSMHV_MOD_LSUB1: - mod->HSMHV_lsub1 = value->rValue; - mod->HSMHV_lsub1_Given = TRUE; - break; - case HSMHV_MOD_LSUB2: - mod->HSMHV_lsub2 = value->rValue; - mod->HSMHV_lsub2_Given = TRUE; - break; - case HSMHV_MOD_LSVDS: - mod->HSMHV_lsvds = value->rValue; - mod->HSMHV_lsvds_Given = TRUE; - break; - case HSMHV_MOD_LSVBS: - mod->HSMHV_lsvbs = value->rValue; - mod->HSMHV_lsvbs_Given = TRUE; - break; - case HSMHV_MOD_LSVGS: - mod->HSMHV_lsvgs = value->rValue; - mod->HSMHV_lsvgs_Given = TRUE; - break; - case HSMHV_MOD_LFN1: - mod->HSMHV_lfn1 = value->rValue; - mod->HSMHV_lfn1_Given = TRUE; - break; - case HSMHV_MOD_LFN2: - mod->HSMHV_lfn2 = value->rValue; - mod->HSMHV_lfn2_Given = TRUE; - break; - case HSMHV_MOD_LFN3: - mod->HSMHV_lfn3 = value->rValue; - mod->HSMHV_lfn3_Given = TRUE; - break; - case HSMHV_MOD_LFVBS: - mod->HSMHV_lfvbs = value->rValue; - mod->HSMHV_lfvbs_Given = TRUE; - break; - case HSMHV_MOD_LNSTI: - mod->HSMHV_lnsti = value->rValue; - mod->HSMHV_lnsti_Given = TRUE; - break; - case HSMHV_MOD_LWSTI: - mod->HSMHV_lwsti = value->rValue; - mod->HSMHV_lwsti_Given = TRUE; - break; - case HSMHV_MOD_LSCSTI1: - mod->HSMHV_lscsti1 = value->rValue; - mod->HSMHV_lscsti1_Given = TRUE; - break; - case HSMHV_MOD_LSCSTI2: - mod->HSMHV_lscsti2 = value->rValue; - mod->HSMHV_lscsti2_Given = TRUE; - break; - case HSMHV_MOD_LVTHSTI: - mod->HSMHV_lvthsti = value->rValue; - mod->HSMHV_lvthsti_Given = TRUE; - break; - case HSMHV_MOD_LMUESTI1: - mod->HSMHV_lmuesti1 = value->rValue; - mod->HSMHV_lmuesti1_Given = TRUE; - break; - case HSMHV_MOD_LMUESTI2: - mod->HSMHV_lmuesti2 = value->rValue; - mod->HSMHV_lmuesti2_Given = TRUE; - break; - case HSMHV_MOD_LMUESTI3: - mod->HSMHV_lmuesti3 = value->rValue; - mod->HSMHV_lmuesti3_Given = TRUE; - break; - case HSMHV_MOD_LNSUBPSTI1: - mod->HSMHV_lnsubpsti1 = value->rValue; - mod->HSMHV_lnsubpsti1_Given = TRUE; - break; - case HSMHV_MOD_LNSUBPSTI2: - mod->HSMHV_lnsubpsti2 = value->rValue; - mod->HSMHV_lnsubpsti2_Given = TRUE; - break; - case HSMHV_MOD_LNSUBPSTI3: - mod->HSMHV_lnsubpsti3 = value->rValue; - mod->HSMHV_lnsubpsti3_Given = TRUE; - break; - case HSMHV_MOD_LCGSO: - mod->HSMHV_lcgso = value->rValue; - mod->HSMHV_lcgso_Given = TRUE; - break; - case HSMHV_MOD_LCGDO: - mod->HSMHV_lcgdo = value->rValue; - mod->HSMHV_lcgdo_Given = TRUE; - break; - case HSMHV_MOD_LJS0: - mod->HSMHV_ljs0 = value->rValue; - mod->HSMHV_ljs0_Given = TRUE; - break; - case HSMHV_MOD_LJS0SW: - mod->HSMHV_ljs0sw = value->rValue; - mod->HSMHV_ljs0sw_Given = TRUE; - break; - case HSMHV_MOD_LNJ: - mod->HSMHV_lnj = value->rValue; - mod->HSMHV_lnj_Given = TRUE; - break; - case HSMHV_MOD_LCISBK: - mod->HSMHV_lcisbk = value->rValue; - mod->HSMHV_lcisbk_Given = TRUE; - break; - case HSMHV_MOD_LCLM1: - mod->HSMHV_lclm1 = value->rValue; - mod->HSMHV_lclm1_Given = TRUE; - break; - case HSMHV_MOD_LCLM2: - mod->HSMHV_lclm2 = value->rValue; - mod->HSMHV_lclm2_Given = TRUE; - break; - case HSMHV_MOD_LCLM3: - mod->HSMHV_lclm3 = value->rValue; - mod->HSMHV_lclm3_Given = TRUE; - break; - case HSMHV_MOD_LWFC: - mod->HSMHV_lwfc = value->rValue; - mod->HSMHV_lwfc_Given = TRUE; - break; - case HSMHV_MOD_LGIDL1: - mod->HSMHV_lgidl1 = value->rValue; - mod->HSMHV_lgidl1_Given = TRUE; - break; - case HSMHV_MOD_LGIDL2: - mod->HSMHV_lgidl2 = value->rValue; - mod->HSMHV_lgidl2_Given = TRUE; - break; - case HSMHV_MOD_LGLEAK1: - mod->HSMHV_lgleak1 = value->rValue; - mod->HSMHV_lgleak1_Given = TRUE; - break; - case HSMHV_MOD_LGLEAK2: - mod->HSMHV_lgleak2 = value->rValue; - mod->HSMHV_lgleak2_Given = TRUE; - break; - case HSMHV_MOD_LGLEAK3: - mod->HSMHV_lgleak3 = value->rValue; - mod->HSMHV_lgleak3_Given = TRUE; - break; - case HSMHV_MOD_LGLEAK6: - mod->HSMHV_lgleak6 = value->rValue; - mod->HSMHV_lgleak6_Given = TRUE; - break; - case HSMHV_MOD_LGLKSD1: - mod->HSMHV_lglksd1 = value->rValue; - mod->HSMHV_lglksd1_Given = TRUE; - break; - case HSMHV_MOD_LGLKSD2: - mod->HSMHV_lglksd2 = value->rValue; - mod->HSMHV_lglksd2_Given = TRUE; - break; - case HSMHV_MOD_LGLKB1: - mod->HSMHV_lglkb1 = value->rValue; - mod->HSMHV_lglkb1_Given = TRUE; - break; - case HSMHV_MOD_LGLKB2: - mod->HSMHV_lglkb2 = value->rValue; - mod->HSMHV_lglkb2_Given = TRUE; - break; - case HSMHV_MOD_LNFTRP: - mod->HSMHV_lnftrp = value->rValue; - mod->HSMHV_lnftrp_Given = TRUE; - break; - case HSMHV_MOD_LNFALP: - mod->HSMHV_lnfalp = value->rValue; - mod->HSMHV_lnfalp_Given = TRUE; - break; - case HSMHV_MOD_LPTHROU: - mod->HSMHV_lpthrou = value->rValue; - mod->HSMHV_lpthrou_Given = TRUE; - break; - case HSMHV_MOD_LVDIFFJ: - mod->HSMHV_lvdiffj = value->rValue; - mod->HSMHV_lvdiffj_Given = TRUE; - break; - case HSMHV_MOD_LIBPC1: - mod->HSMHV_libpc1 = value->rValue; - mod->HSMHV_libpc1_Given = TRUE; - break; - case HSMHV_MOD_LIBPC2: - mod->HSMHV_libpc2 = value->rValue; - mod->HSMHV_libpc2_Given = TRUE; - break; - break; - case HSMHV_MOD_LCGBO: - mod->HSMHV_lcgbo = value->rValue; - mod->HSMHV_lcgbo_Given = TRUE; - break; - case HSMHV_MOD_LCVDSOVER: - mod->HSMHV_lcvdsover = value->rValue; - mod->HSMHV_lcvdsover_Given = TRUE; - break; - case HSMHV_MOD_LFALPH: - mod->HSMHV_lfalph = value->rValue; - mod->HSMHV_lfalph_Given = TRUE; - break; - case HSMHV_MOD_LNPEXT: - mod->HSMHV_lnpext = value->rValue; - mod->HSMHV_lnpext_Given = TRUE; - break; - case HSMHV_MOD_LPOWRAT: - mod->HSMHV_lpowrat = value->rValue; - mod->HSMHV_lpowrat_Given = TRUE; - break; - case HSMHV_MOD_LRD: - mod->HSMHV_lrd = value->rValue; - mod->HSMHV_lrd_Given = TRUE; - break; - case HSMHV_MOD_LRD22: - mod->HSMHV_lrd22 = value->rValue; - mod->HSMHV_lrd22_Given = TRUE; - break; - case HSMHV_MOD_LRD23: - mod->HSMHV_lrd23 = value->rValue; - mod->HSMHV_lrd23_Given = TRUE; - break; - case HSMHV_MOD_LRD24: - mod->HSMHV_lrd24 = value->rValue; - mod->HSMHV_lrd24_Given = TRUE; - break; - case HSMHV_MOD_LRDICT1: - mod->HSMHV_lrdict1 = value->rValue; - mod->HSMHV_lrdict1_Given = TRUE; - break; - case HSMHV_MOD_LRDOV13: - mod->HSMHV_lrdov13 = value->rValue; - mod->HSMHV_lrdov13_Given = TRUE; - break; - case HSMHV_MOD_LRDSLP1: - mod->HSMHV_lrdslp1 = value->rValue; - mod->HSMHV_lrdslp1_Given = TRUE; - break; - case HSMHV_MOD_LRDVB: - mod->HSMHV_lrdvb = value->rValue; - mod->HSMHV_lrdvb_Given = TRUE; - break; - case HSMHV_MOD_LRDVD: - mod->HSMHV_lrdvd = value->rValue; - mod->HSMHV_lrdvd_Given = TRUE; - break; - case HSMHV_MOD_LRDVG11: - mod->HSMHV_lrdvg11 = value->rValue; - mod->HSMHV_lrdvg11_Given = TRUE; - break; - case HSMHV_MOD_LRS: - mod->HSMHV_lrs = value->rValue; - mod->HSMHV_lrs_Given = TRUE; - break; - case HSMHV_MOD_LRTH0: - mod->HSMHV_lrth0 = value->rValue; - mod->HSMHV_lrth0_Given = TRUE; - break; - case HSMHV_MOD_LVOVER: - mod->HSMHV_lvover = value->rValue; - mod->HSMHV_lvover_Given = TRUE; - break; - - /* Width dependence */ - case HSMHV_MOD_WVMAX: - mod->HSMHV_wvmax = value->rValue; - mod->HSMHV_wvmax_Given = TRUE; - break; - case HSMHV_MOD_WBGTMP1: - mod->HSMHV_wbgtmp1 = value->rValue; - mod->HSMHV_wbgtmp1_Given = TRUE; - break; - case HSMHV_MOD_WBGTMP2: - mod->HSMHV_wbgtmp2 = value->rValue; - mod->HSMHV_wbgtmp2_Given = TRUE; - break; - case HSMHV_MOD_WEG0: - mod->HSMHV_weg0 = value->rValue; - mod->HSMHV_weg0_Given = TRUE; - break; - case HSMHV_MOD_WVFBOVER: - mod->HSMHV_wvfbover = value->rValue; - mod->HSMHV_wvfbover_Given = TRUE; - break; - case HSMHV_MOD_WNOVER: - mod->HSMHV_wnover = value->rValue; - mod->HSMHV_wnover_Given = TRUE; - break; - case HSMHV_MOD_WNOVERS: - mod->HSMHV_wnovers = value->rValue; - mod->HSMHV_wnovers_Given = TRUE; - break; - case HSMHV_MOD_WWL2: - mod->HSMHV_wwl2 = value->rValue; - mod->HSMHV_wwl2_Given = TRUE; - break; - case HSMHV_MOD_WVFBC: - mod->HSMHV_wvfbc = value->rValue; - mod->HSMHV_wvfbc_Given = TRUE; - break; - case HSMHV_MOD_WNSUBC: - mod->HSMHV_wnsubc = value->rValue; - mod->HSMHV_wnsubc_Given = TRUE; - break; - case HSMHV_MOD_WNSUBP: - mod->HSMHV_wnsubp = value->rValue; - mod->HSMHV_wnsubp_Given = TRUE; - break; - case HSMHV_MOD_WSCP1: - mod->HSMHV_wscp1 = value->rValue; - mod->HSMHV_wscp1_Given = TRUE; - break; - case HSMHV_MOD_WSCP2: - mod->HSMHV_wscp2 = value->rValue; - mod->HSMHV_wscp2_Given = TRUE; - break; - case HSMHV_MOD_WSCP3: - mod->HSMHV_wscp3 = value->rValue; - mod->HSMHV_wscp3_Given = TRUE; - break; - case HSMHV_MOD_WSC1: - mod->HSMHV_wsc1 = value->rValue; - mod->HSMHV_wsc1_Given = TRUE; - break; - case HSMHV_MOD_WSC2: - mod->HSMHV_wsc2 = value->rValue; - mod->HSMHV_wsc2_Given = TRUE; - break; - case HSMHV_MOD_WSC3: - mod->HSMHV_wsc3 = value->rValue; - mod->HSMHV_wsc3_Given = TRUE; - break; - case HSMHV_MOD_WPGD1: - mod->HSMHV_wpgd1 = value->rValue; - mod->HSMHV_wpgd1_Given = TRUE; - break; - case HSMHV_MOD_WPGD3: - mod->HSMHV_wpgd3 = value->rValue; - mod->HSMHV_wpgd3_Given = TRUE; - break; - case HSMHV_MOD_WNDEP: - mod->HSMHV_wndep = value->rValue; - mod->HSMHV_wndep_Given = TRUE; - break; - case HSMHV_MOD_WNINV: - mod->HSMHV_wninv = value->rValue; - mod->HSMHV_wninv_Given = TRUE; - break; - case HSMHV_MOD_WMUECB0: - mod->HSMHV_wmuecb0 = value->rValue; - mod->HSMHV_wmuecb0_Given = TRUE; - break; - case HSMHV_MOD_WMUECB1: - mod->HSMHV_wmuecb1 = value->rValue; - mod->HSMHV_wmuecb1_Given = TRUE; - break; - case HSMHV_MOD_WMUEPH1: - mod->HSMHV_wmueph1 = value->rValue; - mod->HSMHV_wmueph1_Given = TRUE; - break; - case HSMHV_MOD_WVTMP: - mod->HSMHV_wvtmp = value->rValue; - mod->HSMHV_wvtmp_Given = TRUE; - break; - case HSMHV_MOD_WWVTH0: - mod->HSMHV_wwvth0 = value->rValue; - mod->HSMHV_wwvth0_Given = TRUE; - break; - case HSMHV_MOD_WMUESR1: - mod->HSMHV_wmuesr1 = value->rValue; - mod->HSMHV_wmuesr1_Given = TRUE; - break; - case HSMHV_MOD_WMUETMP: - mod->HSMHV_wmuetmp = value->rValue; - mod->HSMHV_wmuetmp_Given = TRUE; - break; - case HSMHV_MOD_WSUB1: - mod->HSMHV_wsub1 = value->rValue; - mod->HSMHV_wsub1_Given = TRUE; - break; - case HSMHV_MOD_WSUB2: - mod->HSMHV_wsub2 = value->rValue; - mod->HSMHV_wsub2_Given = TRUE; - break; - case HSMHV_MOD_WSVDS: - mod->HSMHV_wsvds = value->rValue; - mod->HSMHV_wsvds_Given = TRUE; - break; - case HSMHV_MOD_WSVBS: - mod->HSMHV_wsvbs = value->rValue; - mod->HSMHV_wsvbs_Given = TRUE; - break; - case HSMHV_MOD_WSVGS: - mod->HSMHV_wsvgs = value->rValue; - mod->HSMHV_wsvgs_Given = TRUE; - break; - case HSMHV_MOD_WFN1: - mod->HSMHV_wfn1 = value->rValue; - mod->HSMHV_wfn1_Given = TRUE; - break; - case HSMHV_MOD_WFN2: - mod->HSMHV_wfn2 = value->rValue; - mod->HSMHV_wfn2_Given = TRUE; - break; - case HSMHV_MOD_WFN3: - mod->HSMHV_wfn3 = value->rValue; - mod->HSMHV_wfn3_Given = TRUE; - break; - case HSMHV_MOD_WFVBS: - mod->HSMHV_wfvbs = value->rValue; - mod->HSMHV_wfvbs_Given = TRUE; - break; - case HSMHV_MOD_WNSTI: - mod->HSMHV_wnsti = value->rValue; - mod->HSMHV_wnsti_Given = TRUE; - break; - case HSMHV_MOD_WWSTI: - mod->HSMHV_wwsti = value->rValue; - mod->HSMHV_wwsti_Given = TRUE; - break; - case HSMHV_MOD_WSCSTI1: - mod->HSMHV_wscsti1 = value->rValue; - mod->HSMHV_wscsti1_Given = TRUE; - break; - case HSMHV_MOD_WSCSTI2: - mod->HSMHV_wscsti2 = value->rValue; - mod->HSMHV_wscsti2_Given = TRUE; - break; - case HSMHV_MOD_WVTHSTI: - mod->HSMHV_wvthsti = value->rValue; - mod->HSMHV_wvthsti_Given = TRUE; - break; - case HSMHV_MOD_WMUESTI1: - mod->HSMHV_wmuesti1 = value->rValue; - mod->HSMHV_wmuesti1_Given = TRUE; - break; - case HSMHV_MOD_WMUESTI2: - mod->HSMHV_wmuesti2 = value->rValue; - mod->HSMHV_wmuesti2_Given = TRUE; - break; - case HSMHV_MOD_WMUESTI3: - mod->HSMHV_wmuesti3 = value->rValue; - mod->HSMHV_wmuesti3_Given = TRUE; - break; - case HSMHV_MOD_WNSUBPSTI1: - mod->HSMHV_wnsubpsti1 = value->rValue; - mod->HSMHV_wnsubpsti1_Given = TRUE; - break; - case HSMHV_MOD_WNSUBPSTI2: - mod->HSMHV_wnsubpsti2 = value->rValue; - mod->HSMHV_wnsubpsti2_Given = TRUE; - break; - case HSMHV_MOD_WNSUBPSTI3: - mod->HSMHV_wnsubpsti3 = value->rValue; - mod->HSMHV_wnsubpsti3_Given = TRUE; - break; - case HSMHV_MOD_WCGSO: - mod->HSMHV_wcgso = value->rValue; - mod->HSMHV_wcgso_Given = TRUE; - break; - case HSMHV_MOD_WCGDO: - mod->HSMHV_wcgdo = value->rValue; - mod->HSMHV_wcgdo_Given = TRUE; - break; - case HSMHV_MOD_WJS0: - mod->HSMHV_wjs0 = value->rValue; - mod->HSMHV_wjs0_Given = TRUE; - break; - case HSMHV_MOD_WJS0SW: - mod->HSMHV_wjs0sw = value->rValue; - mod->HSMHV_wjs0sw_Given = TRUE; - break; - case HSMHV_MOD_WNJ: - mod->HSMHV_wnj = value->rValue; - mod->HSMHV_wnj_Given = TRUE; - break; - case HSMHV_MOD_WCISBK: - mod->HSMHV_wcisbk = value->rValue; - mod->HSMHV_wcisbk_Given = TRUE; - break; - case HSMHV_MOD_WCLM1: - mod->HSMHV_wclm1 = value->rValue; - mod->HSMHV_wclm1_Given = TRUE; - break; - case HSMHV_MOD_WCLM2: - mod->HSMHV_wclm2 = value->rValue; - mod->HSMHV_wclm2_Given = TRUE; - break; - case HSMHV_MOD_WCLM3: - mod->HSMHV_wclm3 = value->rValue; - mod->HSMHV_wclm3_Given = TRUE; - break; - case HSMHV_MOD_WWFC: - mod->HSMHV_wwfc = value->rValue; - mod->HSMHV_wwfc_Given = TRUE; - break; - case HSMHV_MOD_WGIDL1: - mod->HSMHV_wgidl1 = value->rValue; - mod->HSMHV_wgidl1_Given = TRUE; - break; - case HSMHV_MOD_WGIDL2: - mod->HSMHV_wgidl2 = value->rValue; - mod->HSMHV_wgidl2_Given = TRUE; - break; - case HSMHV_MOD_WGLEAK1: - mod->HSMHV_wgleak1 = value->rValue; - mod->HSMHV_wgleak1_Given = TRUE; - break; - case HSMHV_MOD_WGLEAK2: - mod->HSMHV_wgleak2 = value->rValue; - mod->HSMHV_wgleak2_Given = TRUE; - break; - case HSMHV_MOD_WGLEAK3: - mod->HSMHV_wgleak3 = value->rValue; - mod->HSMHV_wgleak3_Given = TRUE; - break; - case HSMHV_MOD_WGLEAK6: - mod->HSMHV_wgleak6 = value->rValue; - mod->HSMHV_wgleak6_Given = TRUE; - break; - case HSMHV_MOD_WGLKSD1: - mod->HSMHV_wglksd1 = value->rValue; - mod->HSMHV_wglksd1_Given = TRUE; - break; - case HSMHV_MOD_WGLKSD2: - mod->HSMHV_wglksd2 = value->rValue; - mod->HSMHV_wglksd2_Given = TRUE; - break; - case HSMHV_MOD_WGLKB1: - mod->HSMHV_wglkb1 = value->rValue; - mod->HSMHV_wglkb1_Given = TRUE; - break; - case HSMHV_MOD_WGLKB2: - mod->HSMHV_wglkb2 = value->rValue; - mod->HSMHV_wglkb2_Given = TRUE; - break; - case HSMHV_MOD_WNFTRP: - mod->HSMHV_wnftrp = value->rValue; - mod->HSMHV_wnftrp_Given = TRUE; - break; - case HSMHV_MOD_WNFALP: - mod->HSMHV_wnfalp = value->rValue; - mod->HSMHV_wnfalp_Given = TRUE; - break; - case HSMHV_MOD_WPTHROU: - mod->HSMHV_wpthrou = value->rValue; - mod->HSMHV_wpthrou_Given = TRUE; - break; - case HSMHV_MOD_WVDIFFJ: - mod->HSMHV_wvdiffj = value->rValue; - mod->HSMHV_wvdiffj_Given = TRUE; - break; - case HSMHV_MOD_WIBPC1: - mod->HSMHV_wibpc1 = value->rValue; - mod->HSMHV_wibpc1_Given = TRUE; - break; - case HSMHV_MOD_WIBPC2: - mod->HSMHV_wibpc2 = value->rValue; - mod->HSMHV_wibpc2_Given = TRUE; - break; - break; - case HSMHV_MOD_WCGBO: - mod->HSMHV_wcgbo = value->rValue; - mod->HSMHV_wcgbo_Given = TRUE; - break; - case HSMHV_MOD_WCVDSOVER: - mod->HSMHV_wcvdsover = value->rValue; - mod->HSMHV_wcvdsover_Given = TRUE; - break; - case HSMHV_MOD_WFALPH: - mod->HSMHV_wfalph = value->rValue; - mod->HSMHV_wfalph_Given = TRUE; - break; - case HSMHV_MOD_WNPEXT: - mod->HSMHV_wnpext = value->rValue; - mod->HSMHV_wnpext_Given = TRUE; - break; - case HSMHV_MOD_WPOWRAT: - mod->HSMHV_wpowrat = value->rValue; - mod->HSMHV_wpowrat_Given = TRUE; - break; - case HSMHV_MOD_WRD: - mod->HSMHV_wrd = value->rValue; - mod->HSMHV_wrd_Given = TRUE; - break; - case HSMHV_MOD_WRD22: - mod->HSMHV_wrd22 = value->rValue; - mod->HSMHV_wrd22_Given = TRUE; - break; - case HSMHV_MOD_WRD23: - mod->HSMHV_wrd23 = value->rValue; - mod->HSMHV_wrd23_Given = TRUE; - break; - case HSMHV_MOD_WRD24: - mod->HSMHV_wrd24 = value->rValue; - mod->HSMHV_wrd24_Given = TRUE; - break; - case HSMHV_MOD_WRDICT1: - mod->HSMHV_wrdict1 = value->rValue; - mod->HSMHV_wrdict1_Given = TRUE; - break; - case HSMHV_MOD_WRDOV13: - mod->HSMHV_wrdov13 = value->rValue; - mod->HSMHV_wrdov13_Given = TRUE; - break; - case HSMHV_MOD_WRDSLP1: - mod->HSMHV_wrdslp1 = value->rValue; - mod->HSMHV_wrdslp1_Given = TRUE; - break; - case HSMHV_MOD_WRDVB: - mod->HSMHV_wrdvb = value->rValue; - mod->HSMHV_wrdvb_Given = TRUE; - break; - case HSMHV_MOD_WRDVD: - mod->HSMHV_wrdvd = value->rValue; - mod->HSMHV_wrdvd_Given = TRUE; - break; - case HSMHV_MOD_WRDVG11: - mod->HSMHV_wrdvg11 = value->rValue; - mod->HSMHV_wrdvg11_Given = TRUE; - break; - case HSMHV_MOD_WRS: - mod->HSMHV_wrs = value->rValue; - mod->HSMHV_wrs_Given = TRUE; - break; - case HSMHV_MOD_WRTH0: - mod->HSMHV_wrth0 = value->rValue; - mod->HSMHV_wrth0_Given = TRUE; - break; - case HSMHV_MOD_WVOVER: - mod->HSMHV_wvover = value->rValue; - mod->HSMHV_wvover_Given = TRUE; - break; - - /* Cross-term dependence */ - case HSMHV_MOD_PVMAX: - mod->HSMHV_pvmax = value->rValue; - mod->HSMHV_pvmax_Given = TRUE; - break; - case HSMHV_MOD_PBGTMP1: - mod->HSMHV_pbgtmp1 = value->rValue; - mod->HSMHV_pbgtmp1_Given = TRUE; - break; - case HSMHV_MOD_PBGTMP2: - mod->HSMHV_pbgtmp2 = value->rValue; - mod->HSMHV_pbgtmp2_Given = TRUE; - break; - case HSMHV_MOD_PEG0: - mod->HSMHV_peg0 = value->rValue; - mod->HSMHV_peg0_Given = TRUE; - break; - case HSMHV_MOD_PVFBOVER: - mod->HSMHV_pvfbover = value->rValue; - mod->HSMHV_pvfbover_Given = TRUE; - break; - case HSMHV_MOD_PNOVER: - mod->HSMHV_pnover = value->rValue; - mod->HSMHV_pnover_Given = TRUE; - break; - case HSMHV_MOD_PNOVERS: - mod->HSMHV_pnovers = value->rValue; - mod->HSMHV_pnovers_Given = TRUE; - break; - case HSMHV_MOD_PWL2: - mod->HSMHV_pwl2 = value->rValue; - mod->HSMHV_pwl2_Given = TRUE; - break; - case HSMHV_MOD_PVFBC: - mod->HSMHV_pvfbc = value->rValue; - mod->HSMHV_pvfbc_Given = TRUE; - break; - case HSMHV_MOD_PNSUBC: - mod->HSMHV_pnsubc = value->rValue; - mod->HSMHV_pnsubc_Given = TRUE; - break; - case HSMHV_MOD_PNSUBP: - mod->HSMHV_pnsubp = value->rValue; - mod->HSMHV_pnsubp_Given = TRUE; - break; - case HSMHV_MOD_PSCP1: - mod->HSMHV_pscp1 = value->rValue; - mod->HSMHV_pscp1_Given = TRUE; - break; - case HSMHV_MOD_PSCP2: - mod->HSMHV_pscp2 = value->rValue; - mod->HSMHV_pscp2_Given = TRUE; - break; - case HSMHV_MOD_PSCP3: - mod->HSMHV_pscp3 = value->rValue; - mod->HSMHV_pscp3_Given = TRUE; - break; - case HSMHV_MOD_PSC1: - mod->HSMHV_psc1 = value->rValue; - mod->HSMHV_psc1_Given = TRUE; - break; - case HSMHV_MOD_PSC2: - mod->HSMHV_psc2 = value->rValue; - mod->HSMHV_psc2_Given = TRUE; - break; - case HSMHV_MOD_PSC3: - mod->HSMHV_psc3 = value->rValue; - mod->HSMHV_psc3_Given = TRUE; - break; - case HSMHV_MOD_PPGD1: - mod->HSMHV_ppgd1 = value->rValue; - mod->HSMHV_ppgd1_Given = TRUE; - break; - case HSMHV_MOD_PPGD3: - mod->HSMHV_ppgd3 = value->rValue; - mod->HSMHV_ppgd3_Given = TRUE; - break; - case HSMHV_MOD_PNDEP: - mod->HSMHV_pndep = value->rValue; - mod->HSMHV_pndep_Given = TRUE; - break; - case HSMHV_MOD_PNINV: - mod->HSMHV_pninv = value->rValue; - mod->HSMHV_pninv_Given = TRUE; - break; - case HSMHV_MOD_PMUECB0: - mod->HSMHV_pmuecb0 = value->rValue; - mod->HSMHV_pmuecb0_Given = TRUE; - break; - case HSMHV_MOD_PMUECB1: - mod->HSMHV_pmuecb1 = value->rValue; - mod->HSMHV_pmuecb1_Given = TRUE; - break; - case HSMHV_MOD_PMUEPH1: - mod->HSMHV_pmueph1 = value->rValue; - mod->HSMHV_pmueph1_Given = TRUE; - break; - case HSMHV_MOD_PVTMP: - mod->HSMHV_pvtmp = value->rValue; - mod->HSMHV_pvtmp_Given = TRUE; - break; - case HSMHV_MOD_PWVTH0: - mod->HSMHV_pwvth0 = value->rValue; - mod->HSMHV_pwvth0_Given = TRUE; - break; - case HSMHV_MOD_PMUESR1: - mod->HSMHV_pmuesr1 = value->rValue; - mod->HSMHV_pmuesr1_Given = TRUE; - break; - case HSMHV_MOD_PMUETMP: - mod->HSMHV_pmuetmp = value->rValue; - mod->HSMHV_pmuetmp_Given = TRUE; - break; - case HSMHV_MOD_PSUB1: - mod->HSMHV_psub1 = value->rValue; - mod->HSMHV_psub1_Given = TRUE; - break; - case HSMHV_MOD_PSUB2: - mod->HSMHV_psub2 = value->rValue; - mod->HSMHV_psub2_Given = TRUE; - break; - case HSMHV_MOD_PSVDS: - mod->HSMHV_psvds = value->rValue; - mod->HSMHV_psvds_Given = TRUE; - break; - case HSMHV_MOD_PSVBS: - mod->HSMHV_psvbs = value->rValue; - mod->HSMHV_psvbs_Given = TRUE; - break; - case HSMHV_MOD_PSVGS: - mod->HSMHV_psvgs = value->rValue; - mod->HSMHV_psvgs_Given = TRUE; - break; - case HSMHV_MOD_PFN1: - mod->HSMHV_pfn1 = value->rValue; - mod->HSMHV_pfn1_Given = TRUE; - break; - case HSMHV_MOD_PFN2: - mod->HSMHV_pfn2 = value->rValue; - mod->HSMHV_pfn2_Given = TRUE; - break; - case HSMHV_MOD_PFN3: - mod->HSMHV_pfn3 = value->rValue; - mod->HSMHV_pfn3_Given = TRUE; - break; - case HSMHV_MOD_PFVBS: - mod->HSMHV_pfvbs = value->rValue; - mod->HSMHV_pfvbs_Given = TRUE; - break; - case HSMHV_MOD_PNSTI: - mod->HSMHV_pnsti = value->rValue; - mod->HSMHV_pnsti_Given = TRUE; - break; - case HSMHV_MOD_PWSTI: - mod->HSMHV_pwsti = value->rValue; - mod->HSMHV_pwsti_Given = TRUE; - break; - case HSMHV_MOD_PSCSTI1: - mod->HSMHV_pscsti1 = value->rValue; - mod->HSMHV_pscsti1_Given = TRUE; - break; - case HSMHV_MOD_PSCSTI2: - mod->HSMHV_pscsti2 = value->rValue; - mod->HSMHV_pscsti2_Given = TRUE; - break; - case HSMHV_MOD_PVTHSTI: - mod->HSMHV_pvthsti = value->rValue; - mod->HSMHV_pvthsti_Given = TRUE; - break; - case HSMHV_MOD_PMUESTI1: - mod->HSMHV_pmuesti1 = value->rValue; - mod->HSMHV_pmuesti1_Given = TRUE; - break; - case HSMHV_MOD_PMUESTI2: - mod->HSMHV_pmuesti2 = value->rValue; - mod->HSMHV_pmuesti2_Given = TRUE; - break; - case HSMHV_MOD_PMUESTI3: - mod->HSMHV_pmuesti3 = value->rValue; - mod->HSMHV_pmuesti3_Given = TRUE; - break; - case HSMHV_MOD_PNSUBPSTI1: - mod->HSMHV_pnsubpsti1 = value->rValue; - mod->HSMHV_pnsubpsti1_Given = TRUE; - break; - case HSMHV_MOD_PNSUBPSTI2: - mod->HSMHV_pnsubpsti2 = value->rValue; - mod->HSMHV_pnsubpsti2_Given = TRUE; - break; - case HSMHV_MOD_PNSUBPSTI3: - mod->HSMHV_pnsubpsti3 = value->rValue; - mod->HSMHV_pnsubpsti3_Given = TRUE; - break; - case HSMHV_MOD_PCGSO: - mod->HSMHV_pcgso = value->rValue; - mod->HSMHV_pcgso_Given = TRUE; - break; - case HSMHV_MOD_PCGDO: - mod->HSMHV_pcgdo = value->rValue; - mod->HSMHV_pcgdo_Given = TRUE; - break; - case HSMHV_MOD_PJS0: - mod->HSMHV_pjs0 = value->rValue; - mod->HSMHV_pjs0_Given = TRUE; - break; - case HSMHV_MOD_PJS0SW: - mod->HSMHV_pjs0sw = value->rValue; - mod->HSMHV_pjs0sw_Given = TRUE; - break; - case HSMHV_MOD_PNJ: - mod->HSMHV_pnj = value->rValue; - mod->HSMHV_pnj_Given = TRUE; - break; - case HSMHV_MOD_PCISBK: - mod->HSMHV_pcisbk = value->rValue; - mod->HSMHV_pcisbk_Given = TRUE; - break; - case HSMHV_MOD_PCLM1: - mod->HSMHV_pclm1 = value->rValue; - mod->HSMHV_pclm1_Given = TRUE; - break; - case HSMHV_MOD_PCLM2: - mod->HSMHV_pclm2 = value->rValue; - mod->HSMHV_pclm2_Given = TRUE; - break; - case HSMHV_MOD_PCLM3: - mod->HSMHV_pclm3 = value->rValue; - mod->HSMHV_pclm3_Given = TRUE; - break; - case HSMHV_MOD_PWFC: - mod->HSMHV_pwfc = value->rValue; - mod->HSMHV_pwfc_Given = TRUE; - break; - case HSMHV_MOD_PGIDL1: - mod->HSMHV_pgidl1 = value->rValue; - mod->HSMHV_pgidl1_Given = TRUE; - break; - case HSMHV_MOD_PGIDL2: - mod->HSMHV_pgidl2 = value->rValue; - mod->HSMHV_pgidl2_Given = TRUE; - break; - case HSMHV_MOD_PGLEAK1: - mod->HSMHV_pgleak1 = value->rValue; - mod->HSMHV_pgleak1_Given = TRUE; - break; - case HSMHV_MOD_PGLEAK2: - mod->HSMHV_pgleak2 = value->rValue; - mod->HSMHV_pgleak2_Given = TRUE; - break; - case HSMHV_MOD_PGLEAK3: - mod->HSMHV_pgleak3 = value->rValue; - mod->HSMHV_pgleak3_Given = TRUE; - break; - case HSMHV_MOD_PGLEAK6: - mod->HSMHV_pgleak6 = value->rValue; - mod->HSMHV_pgleak6_Given = TRUE; - break; - case HSMHV_MOD_PGLKSD1: - mod->HSMHV_pglksd1 = value->rValue; - mod->HSMHV_pglksd1_Given = TRUE; - break; - case HSMHV_MOD_PGLKSD2: - mod->HSMHV_pglksd2 = value->rValue; - mod->HSMHV_pglksd2_Given = TRUE; - break; - case HSMHV_MOD_PGLKB1: - mod->HSMHV_pglkb1 = value->rValue; - mod->HSMHV_pglkb1_Given = TRUE; - break; - case HSMHV_MOD_PGLKB2: - mod->HSMHV_pglkb2 = value->rValue; - mod->HSMHV_pglkb2_Given = TRUE; - break; - case HSMHV_MOD_PNFTRP: - mod->HSMHV_pnftrp = value->rValue; - mod->HSMHV_pnftrp_Given = TRUE; - break; - case HSMHV_MOD_PNFALP: - mod->HSMHV_pnfalp = value->rValue; - mod->HSMHV_pnfalp_Given = TRUE; - break; - case HSMHV_MOD_PPTHROU: - mod->HSMHV_ppthrou = value->rValue; - mod->HSMHV_ppthrou_Given = TRUE; - break; - case HSMHV_MOD_PVDIFFJ: - mod->HSMHV_pvdiffj = value->rValue; - mod->HSMHV_pvdiffj_Given = TRUE; - break; - case HSMHV_MOD_PIBPC1: - mod->HSMHV_pibpc1 = value->rValue; - mod->HSMHV_pibpc1_Given = TRUE; - break; - case HSMHV_MOD_PIBPC2: - mod->HSMHV_pibpc2 = value->rValue; - mod->HSMHV_pibpc2_Given = TRUE; - break; - break; - case HSMHV_MOD_PCGBO: - mod->HSMHV_pcgbo = value->rValue; - mod->HSMHV_pcgbo_Given = TRUE; - break; - case HSMHV_MOD_PCVDSOVER: - mod->HSMHV_pcvdsover = value->rValue; - mod->HSMHV_pcvdsover_Given = TRUE; - break; - case HSMHV_MOD_PFALPH: - mod->HSMHV_pfalph = value->rValue; - mod->HSMHV_pfalph_Given = TRUE; - break; - case HSMHV_MOD_PNPEXT: - mod->HSMHV_pnpext = value->rValue; - mod->HSMHV_pnpext_Given = TRUE; - break; - case HSMHV_MOD_PPOWRAT: - mod->HSMHV_ppowrat = value->rValue; - mod->HSMHV_ppowrat_Given = TRUE; - break; - case HSMHV_MOD_PRD: - mod->HSMHV_prd = value->rValue; - mod->HSMHV_prd_Given = TRUE; - break; - case HSMHV_MOD_PRD22: - mod->HSMHV_prd22 = value->rValue; - mod->HSMHV_prd22_Given = TRUE; - break; - case HSMHV_MOD_PRD23: - mod->HSMHV_prd23 = value->rValue; - mod->HSMHV_prd23_Given = TRUE; - break; - case HSMHV_MOD_PRD24: - mod->HSMHV_prd24 = value->rValue; - mod->HSMHV_prd24_Given = TRUE; - break; - case HSMHV_MOD_PRDICT1: - mod->HSMHV_prdict1 = value->rValue; - mod->HSMHV_prdict1_Given = TRUE; - break; - case HSMHV_MOD_PRDOV13: - mod->HSMHV_prdov13 = value->rValue; - mod->HSMHV_prdov13_Given = TRUE; - break; - case HSMHV_MOD_PRDSLP1: - mod->HSMHV_prdslp1 = value->rValue; - mod->HSMHV_prdslp1_Given = TRUE; - break; - case HSMHV_MOD_PRDVB: - mod->HSMHV_prdvb = value->rValue; - mod->HSMHV_prdvb_Given = TRUE; - break; - case HSMHV_MOD_PRDVD: - mod->HSMHV_prdvd = value->rValue; - mod->HSMHV_prdvd_Given = TRUE; - break; - case HSMHV_MOD_PRDVG11: - mod->HSMHV_prdvg11 = value->rValue; - mod->HSMHV_prdvg11_Given = TRUE; - break; - case HSMHV_MOD_PRS: - mod->HSMHV_prs = value->rValue; - mod->HSMHV_prs_Given = TRUE; - break; - case HSMHV_MOD_PRTH0: - mod->HSMHV_prth0 = value->rValue; - mod->HSMHV_prth0_Given = TRUE; - break; - case HSMHV_MOD_PVOVER: - mod->HSMHV_pvover = value->rValue; - mod->HSMHV_pvover_Given = TRUE; - break; - - case HSMHV_MOD_VGS_MAX: - mod->HSMHVvgsMax = value->rValue; - mod->HSMHVvgsMaxGiven = TRUE; - break; - case HSMHV_MOD_VGD_MAX: - mod->HSMHVvgdMax = value->rValue; - mod->HSMHVvgdMaxGiven = TRUE; - break; - case HSMHV_MOD_VGB_MAX: - mod->HSMHVvgbMax = value->rValue; - mod->HSMHVvgbMaxGiven = TRUE; - break; - case HSMHV_MOD_VDS_MAX: - mod->HSMHVvdsMax = value->rValue; - mod->HSMHVvdsMaxGiven = TRUE; - break; - case HSMHV_MOD_VBS_MAX: - mod->HSMHVvbsMax = value->rValue; - mod->HSMHVvbsMaxGiven = TRUE; - break; - case HSMHV_MOD_VBD_MAX: - mod->HSMHVvbdMax = value->rValue; - mod->HSMHVvbdMaxGiven = TRUE; - break; - case HSMHV_MOD_VGSR_MAX: - mod->HSMHVvgsrMax = value->rValue; - mod->HSMHVvgsrMaxGiven = TRUE; - break; - case HSMHV_MOD_VGDR_MAX: - mod->HSMHVvgdrMax = value->rValue; - mod->HSMHVvgdrMaxGiven = TRUE; - break; - case HSMHV_MOD_VGBR_MAX: - mod->HSMHVvgbrMax = value->rValue; - mod->HSMHVvgbrMaxGiven = TRUE; - break; - case HSMHV_MOD_VBSR_MAX: - mod->HSMHVvbsrMax = value->rValue; - mod->HSMHVvbsrMaxGiven = TRUE; - break; - case HSMHV_MOD_VBDR_MAX: - mod->HSMHVvbdrMax = value->rValue; - mod->HSMHVvbdrMaxGiven = TRUE; - break; - - default: - return(E_BADPARM); - } - return(OK); -} diff --git a/src/spicelib/devices/hisimhv1/hsmhvnoi.c b/src/spicelib/devices/hisimhv1/hsmhvnoi.c deleted file mode 100644 index 06833f22a..000000000 --- a/src/spicelib/devices/hisimhv1/hsmhvnoi.c +++ /dev/null @@ -1,244 +0,0 @@ -/*********************************************************************** - - HiSIM (Hiroshima University STARC IGFET Model) - Copyright (C) 2012 Hiroshima University & STARC - - MODEL NAME : HiSIM_HV - ( VERSION : 1 SUBVERSION : 2 REVISION : 4 ) - Model Parameter VERSION : 1.23 - FILE : hsmhvnoi.c - - DATE : 2013.04.30 - - released by - Hiroshima University & - Semiconductor Technology Academic Research Center (STARC) -***********************************************************************/ - -#include "ngspice/ngspice.h" -#include "hsmhvdef.h" -#include "ngspice/cktdefs.h" -#include "ngspice/iferrmsg.h" -#include "ngspice/noisedef.h" -#include "ngspice/suffix.h" -#include "ngspice/const.h" /* jwan */ -#include "hsmhvevalenv.h" -/* #include "hsmhvmacro.h" */ - -/* - * HSMHVnoise (mode, operation, firstModel, ckt, data, OnDens) - * This routine names and evaluates all of the noise sources - * associated with MOSFET's. It starts with the model *firstModel and - * traverses all of its insts. It then proceeds to any other models - * on the linked list. The total output noise density generated by - * all of the MOSFET's is summed with the variable "OnDens". - */ - -int HSMHVnoise ( - int mode, int operation, - GENmodel *inModel, - CKTcircuit *ckt, - register Ndata *data, - double *OnDens) -{ - register HSMHVmodel *model = (HSMHVmodel *)inModel; - register HSMHVinstance *here; - double tempOnoise=0.0 ; - double tempInoise=0.0 ; - double noizDens[HSMHVNSRCS] ; - double lnNdens[HSMHVNSRCS] ; - register int i; - double G =0.0 ; - double TTEMP = 0.0 ; - - /* define the names of the noise sources */ - static char * HSMHVnNames[HSMHVNSRCS] = { - /* Note that we have to keep the order - consistent with the index definitions - in hsmhvdefs.h */ - ".rd", /* noise due to rd */ - ".rs", /* noise due to rs */ - ".id", /* noise due to id */ - ".1ovf", /* flicker (1/f) noise */ - ".ign", /* induced gate noise component at the drain node */ - "" /* total transistor noise */ - }; - - for ( ;model != NULL; model = HSMHVnextModel(model)) { - for ( here = HSMHVinstances(model); here != NULL; - here = HSMHVnextInstance(here)) { - switch (operation) { - case N_OPEN: - /* see if we have to to produce a summary report */ - /* if so, name all the noise generators */ - - if (((NOISEAN*)ckt->CKTcurJob)->NStpsSm != 0) { - switch (mode) { - case N_DENS: - for ( i = 0; i < HSMHVNSRCS; i++ ) { - NOISE_ADD_OUTVAR(ckt, data, "onoise.%s%s", here->HSMHVname, HSMHVnNames[i]); - } - break; - case INT_NOIZ: - for ( i = 0; i < HSMHVNSRCS; i++ ) { - NOISE_ADD_OUTVAR(ckt, data, "onoise_total.%s%s", here->HSMHVname, HSMHVnNames[i]); - NOISE_ADD_OUTVAR(ckt, data, "inoise_total.%s%s", here->HSMHVname, HSMHVnNames[i]); - } - break; - } - } - break; - case N_CALC: - switch (mode) { - case N_DENS: - - /* temperature */ - TTEMP = ckt->CKTtemp; - if ( here->HSMHV_dtemp_Given ) { TTEMP = TTEMP + here->HSMHV_dtemp ; } - TTEMP = TTEMP + *(ckt->CKTstate0 + here->HSMHVdeltemp) ; - - /* rs/rd thermal noise */ - if ( model->HSMHV_corsrd == 1 || model->HSMHV_corsrd == 3 ) { - NevalSrc(&noizDens[HSMHVRDNOIZ], NULL, - ckt, N_GAIN, - here->HSMHVdNodePrime, here->HSMHVdNode, - 0.0); - noizDens[HSMHVRDNOIZ] *= 4 * C_KB * TTEMP * here->HSMHVdrainConductance ; - lnNdens[HSMHVRDNOIZ] = log( MAX(noizDens[HSMHVRDNOIZ],N_MINLOG) ); - - NevalSrc(&noizDens[HSMHVRSNOIZ], NULL, - ckt, N_GAIN, - here->HSMHVsNodePrime, here->HSMHVsNode, - 0.0); - noizDens[HSMHVRSNOIZ] *= 4 * C_KB * TTEMP * here->HSMHVsourceConductance ; - lnNdens[HSMHVRSNOIZ] = log( MAX(noizDens[HSMHVRSNOIZ],N_MINLOG) ); - } else { - noizDens[HSMHVRDNOIZ] = 0e0 ; - lnNdens[HSMHVRDNOIZ] = N_MINLOG ; - noizDens[HSMHVRSNOIZ] = 0e0 ; - lnNdens[HSMHVRSNOIZ] = N_MINLOG ; - } - - /* channel thermal noise */ - NevalSrc(&noizDens[HSMHVIDNOIZ], NULL, - ckt, N_GAIN, - here->HSMHVdNodePrime, here->HSMHVsNodePrime, - 0.0); - switch( model->HSMHV_noise ) { - case 1: - /* HiSIMHV model */ - G = here->HSMHV_noithrml ; - noizDens[HSMHVIDNOIZ] *= 4 * C_KB * TTEMP * G ; - lnNdens[HSMHVIDNOIZ] = log( MAX(noizDens[HSMHVIDNOIZ],N_MINLOG) ); - break; - } - - /* flicker noise */ - NevalSrc(&noizDens[HSMHVFLNOIZ], NULL, - ckt, N_GAIN, - here->HSMHVdNodePrime, here->HSMHVsNodePrime, - 0.0); - switch ( model->HSMHV_noise ) { - case 1: - /* HiSIM model */ - noizDens[HSMHVFLNOIZ] *= here->HSMHV_noiflick / pow(data->freq, model->HSMHV_falph) ; - lnNdens[HSMHVFLNOIZ] = log(MAX(noizDens[HSMHVFLNOIZ], N_MINLOG)); - break; - } - - /* induced gate noise */ - NevalSrc(&noizDens[HSMHVIGNOIZ], NULL, - ckt, N_GAIN, - here->HSMHVdNodePrime, here->HSMHVsNodePrime, - 0.0); - switch ( model->HSMHV_noise ) { - case 1: - /* HiSIM model */ - noizDens[HSMHVIGNOIZ] *= here->HSMHV_noiigate * here->HSMHV_noicross * here->HSMHV_noicross * data->freq * data->freq; - lnNdens[HSMHVIGNOIZ] = log(MAX(noizDens[HSMHVIGNOIZ], N_MINLOG)); - break; - } - - /* total */ - noizDens[HSMHVTOTNOIZ] = noizDens[HSMHVRDNOIZ] + noizDens[HSMHVRSNOIZ] - + noizDens[HSMHVIDNOIZ] + noizDens[HSMHVFLNOIZ] + noizDens[HSMHVIGNOIZ]; - lnNdens[HSMHVTOTNOIZ] = log(MAX(noizDens[HSMHVTOTNOIZ], N_MINLOG)); - - *OnDens += noizDens[HSMHVTOTNOIZ]; - - if ( data->delFreq == 0.0 ) { - /* if we haven't done any previous - integration, we need to initialize our - "history" variables. - */ - - for ( i = 0; i < HSMHVNSRCS; i++ ) - here->HSMHVnVar[LNLSTDENS][i] = lnNdens[i]; - - /* clear out our integration variables - if it's the first pass - */ - if (data->freq == ((NOISEAN*) ckt->CKTcurJob)->NstartFreq) { - for (i = 0; i < HSMHVNSRCS; i++) { - here->HSMHVnVar[OUTNOIZ][i] = 0.0; - here->HSMHVnVar[INNOIZ][i] = 0.0; - } - } - } - else { - /* data->delFreq != 0.0, - we have to integrate. - */ - for ( i = 0; i < HSMHVNSRCS; i++ ) { - if ( i != HSMHVTOTNOIZ ) { - tempOnoise = - Nintegrate(noizDens[i], lnNdens[i], - here->HSMHVnVar[LNLSTDENS][i], data); - tempInoise = - Nintegrate(noizDens[i] * data->GainSqInv, - lnNdens[i] + data->lnGainInv, - here->HSMHVnVar[LNLSTDENS][i] + data->lnGainInv, - data); - here->HSMHVnVar[LNLSTDENS][i] = lnNdens[i]; - data->outNoiz += tempOnoise; - data->inNoise += tempInoise; - if ( ((NOISEAN*)ckt->CKTcurJob)->NStpsSm != 0 ) { - here->HSMHVnVar[OUTNOIZ][i] += tempOnoise; - here->HSMHVnVar[OUTNOIZ][HSMHVTOTNOIZ] += tempOnoise; - here->HSMHVnVar[INNOIZ][i] += tempInoise; - here->HSMHVnVar[INNOIZ][HSMHVTOTNOIZ] += tempInoise; - } - } - } - } - if ( data->prtSummary ) { - for (i = 0; i < HSMHVNSRCS; i++) { - /* print a summary report */ - data->outpVector[data->outNumber++] = noizDens[i]; - } - } - break; - case INT_NOIZ: - /* already calculated, just output */ - if ( ((NOISEAN*)ckt->CKTcurJob)->NStpsSm != 0 ) { - for ( i = 0; i < HSMHVNSRCS; i++ ) { - data->outpVector[data->outNumber++] = here->HSMHVnVar[OUTNOIZ][i]; - data->outpVector[data->outNumber++] = here->HSMHVnVar[INNOIZ][i]; - } - } - break; - } - break; - case N_CLOSE: - /* do nothing, the main calling routine will close */ - return (OK); - break; /* the plots */ - } /* switch (operation) */ - } /* for here */ - } /* for model */ - - return(OK); -} - - - diff --git a/src/spicelib/devices/hisimhv1/hsmhvpar.c b/src/spicelib/devices/hisimhv1/hsmhvpar.c deleted file mode 100644 index 6571c02e4..000000000 --- a/src/spicelib/devices/hisimhv1/hsmhvpar.c +++ /dev/null @@ -1,222 +0,0 @@ -/*********************************************************************** - - HiSIM (Hiroshima University STARC IGFET Model) - Copyright (C) 2012 Hiroshima University & STARC - - MODEL NAME : HiSIM_HV - ( VERSION : 1 SUBVERSION : 2 REVISION : 4 ) - Model Parameter VERSION : 1.23 - FILE : hsmhvpar.c - - DATE : 2013.04.30 - - released by - Hiroshima University & - Semiconductor Technology Academic Research Center (STARC) -***********************************************************************/ - -#include "ngspice/ngspice.h" -#include "ngspice/ifsim.h" -#include "hsmhvdef.h" -#include "ngspice/sperror.h" -#include "ngspice/suffix.h" -#include "ngspice/fteext.h" - -int HSMHVparam( - int param, - IFvalue *value, - GENinstance *inst, - IFvalue *select) -{ - double scale; - - HSMHVinstance *here = (HSMHVinstance*)inst; - - NG_IGNORE(select); - - if (!cp_getvar("scale", CP_REAL, &scale, 0)) - scale = 1; - - switch (param) { - case HSMHV_COSELFHEAT: - here->HSMHV_coselfheat = value->iValue; - here->HSMHV_coselfheat_Given = TRUE; - break; - case HSMHV_COSUBNODE: - here->HSMHV_cosubnode = value->iValue; - here->HSMHV_cosubnode_Given = TRUE; - break; - case HSMHV_W: - here->HSMHV_w = value->rValue * scale; - here->HSMHV_w_Given = TRUE; - break; - case HSMHV_L: - here->HSMHV_l = value->rValue * scale; - here->HSMHV_l_Given = TRUE; - break; - case HSMHV_AS: - here->HSMHV_as = value->rValue * scale * scale; - here->HSMHV_as_Given = TRUE; - break; - case HSMHV_AD: - here->HSMHV_ad = value->rValue * scale * scale; - here->HSMHV_ad_Given = TRUE; - break; - case HSMHV_PS: - here->HSMHV_ps = value->rValue * scale; - here->HSMHV_ps_Given = TRUE; - break; - case HSMHV_PD: - here->HSMHV_pd = value->rValue * scale; - here->HSMHV_pd_Given = TRUE; - break; - case HSMHV_NRS: - here->HSMHV_nrs = value->rValue; - here->HSMHV_nrs_Given = TRUE; - break; - case HSMHV_NRD: - here->HSMHV_nrd = value->rValue; - here->HSMHV_nrd_Given = TRUE; - break; - case HSMHV_DTEMP: - here->HSMHV_dtemp = value->rValue; - here->HSMHV_dtemp_Given = TRUE; - break; - case HSMHV_OFF: - here->HSMHV_off = value->iValue; - break; - case HSMHV_IC_VBS: - here->HSMHV_icVBS = value->rValue; - here->HSMHV_icVBS_Given = TRUE; - break; - case HSMHV_IC_VDS: - here->HSMHV_icVDS = value->rValue; - here->HSMHV_icVDS_Given = TRUE; - break; - case HSMHV_IC_VGS: - here->HSMHV_icVGS = value->rValue; - here->HSMHV_icVGS_Given = TRUE; - break; - case HSMHV_IC: - switch (value->v.numValue) { - case 3: - here->HSMHV_icVBS = *(value->v.vec.rVec + 2); - here->HSMHV_icVBS_Given = TRUE; - /* FALLTHROUGH */ - case 2: - here->HSMHV_icVGS = *(value->v.vec.rVec + 1); - here->HSMHV_icVGS_Given = TRUE; - /* FALLTHROUGH */ - case 1: - here->HSMHV_icVDS = *(value->v.vec.rVec); - here->HSMHV_icVDS_Given = TRUE; - break; - default: - return(E_BADPARM); - } - break; - case HSMHV_CORBNET: - here->HSMHV_corbnet = value->iValue; - here->HSMHV_corbnet_Given = TRUE; - break; - case HSMHV_RBPB: - here->HSMHV_rbpb = value->rValue; - here->HSMHV_rbpb_Given = TRUE; - break; - case HSMHV_RBPD: - here->HSMHV_rbpd = value->rValue; - here->HSMHV_rbpd_Given = TRUE; - break; - case HSMHV_RBPS: - here->HSMHV_rbps = value->rValue; - here->HSMHV_rbps_Given = TRUE; - break; - case HSMHV_RBDB: - here->HSMHV_rbdb = value->rValue; - here->HSMHV_rbdb_Given = TRUE; - break; - case HSMHV_RBSB: - here->HSMHV_rbsb = value->rValue; - here->HSMHV_rbsb_Given = TRUE; - break; - case HSMHV_CORG: - here->HSMHV_corg = value->iValue; - here->HSMHV_corg_Given = TRUE; - break; - case HSMHV_NGCON: - here->HSMHV_ngcon = value->rValue; - here->HSMHV_ngcon_Given = TRUE; - break; - case HSMHV_XGW: - here->HSMHV_xgw = value->rValue; - here->HSMHV_xgw_Given = TRUE; - break; - case HSMHV_XGL: - here->HSMHV_xgl = value->rValue; - here->HSMHV_xgl_Given = TRUE; - break; - case HSMHV_NF: - here->HSMHV_nf = value->rValue; - here->HSMHV_nf_Given = TRUE; - break; - case HSMHV_SA: - here->HSMHV_sa = value->rValue; - here->HSMHV_sa_Given = TRUE; - break; - case HSMHV_SB: - here->HSMHV_sb = value->rValue; - here->HSMHV_sb_Given = TRUE; - break; - case HSMHV_SD: - here->HSMHV_sd = value->rValue; - here->HSMHV_sd_Given = TRUE; - break; - case HSMHV_NSUBCDFM: - here->HSMHV_nsubcdfm = value->rValue; - here->HSMHV_nsubcdfm_Given = TRUE; - break; - case HSMHV_M: - here->HSMHV_m = value->rValue; - here->HSMHV_m_Given = TRUE; - break; - case HSMHV_SUBLD1: - here->HSMHV_subld1 = value->rValue; - here->HSMHV_subld1_Given = TRUE; - break; - case HSMHV_SUBLD2: - here->HSMHV_subld2 = value->rValue; - here->HSMHV_subld2_Given = TRUE; - break; - case HSMHV_LOVER: - here->HSMHV_lover = value->rValue; - here->HSMHV_lover_Given = TRUE; - break; - case HSMHV_LOVERS: - here->HSMHV_lovers = value->rValue; - here->HSMHV_lovers_Given = TRUE; - break; - case HSMHV_LOVERLD: - here->HSMHV_loverld = value->rValue; - here->HSMHV_loverld_Given = TRUE; - break; - case HSMHV_LDRIFT1: - here->HSMHV_ldrift1 = value->rValue; - here->HSMHV_ldrift1_Given = TRUE; - break; - case HSMHV_LDRIFT2: - here->HSMHV_ldrift2 = value->rValue; - here->HSMHV_ldrift2_Given = TRUE; - break; - case HSMHV_LDRIFT1S: - here->HSMHV_ldrift1s = value->rValue; - here->HSMHV_ldrift1s_Given = TRUE; - break; - case HSMHV_LDRIFT2S: - here->HSMHV_ldrift2s = value->rValue; - here->HSMHV_ldrift2s_Given = TRUE; - break; - default: - return(E_BADPARM); - } - return(OK); -} diff --git a/src/spicelib/devices/hisimhv1/hsmhvpzld.c b/src/spicelib/devices/hisimhv1/hsmhvpzld.c deleted file mode 100644 index b2ab58412..000000000 --- a/src/spicelib/devices/hisimhv1/hsmhvpzld.c +++ /dev/null @@ -1,281 +0,0 @@ -/*********************************************************************** - - HiSIM (Hiroshima University STARC IGFET Model) - Copyright (C) 2012 Hiroshima University & STARC - - MODEL NAME : HiSIM_HV - ( VERSION : 1 SUBVERSION : 2 REVISION : 4 ) - Model Parameter VERSION : 1.23 - FILE : hsmhvpzld.c - - DATE : 2013.04.30 - - released by - Hiroshima University & - Semiconductor Technology Academic Research Center (STARC) -***********************************************************************/ - -#include "ngspice/ngspice.h" -#include "ngspice/cktdefs.h" -#include "ngspice/complex.h" -#include "ngspice/sperror.h" -#include "hsmhvdef.h" -#include "ngspice/suffix.h" - -int HSMHVpzLoad( - GENmodel *inModel, - register CKTcircuit *ckt, - register SPcomplex *s) -{ - register HSMHVmodel *model = (HSMHVmodel*)inModel; - register HSMHVinstance *here; - int flg_nqs =0 ; - - NG_IGNORE(ckt); - -#define dNode 0 -#define dNodePrime 1 -#define gNode 2 -#define gNodePrime 3 -#define sNode 4 -#define sNodePrime 5 -#define bNodePrime 6 -#define bNode 7 -#define dbNode 8 -#define sbNode 9 -#define tempNode 10 -#define qiNode 11 -#define qbNode 12 - - - for ( ;model != NULL ;model = HSMHVnextModel(model)) { - for ( here = HSMHVinstances(model);here!= NULL ; - here = HSMHVnextInstance(here)) { - - flg_nqs = model->HSMHV_conqs ; - - /* stamp matrix */ - - /*drain*/ - *(here->HSMHVDdPtr) += here->HSMHV_ydc_d[dNode] + here->HSMHV_ydyn_d[dNode] * s->real; - *(here->HSMHVDdPtr +1) += here->HSMHV_ydyn_d[dNode] * s->imag; - *(here->HSMHVDdpPtr) += here->HSMHV_ydc_d[dNodePrime] + here->HSMHV_ydyn_d[dNodePrime] * s->real; - *(here->HSMHVDdpPtr +1) += here->HSMHV_ydyn_d[dNodePrime] * s->imag; - *(here->HSMHVDgpPtr) += here->HSMHV_ydc_d[gNodePrime] + here->HSMHV_ydyn_d[gNodePrime] * s->real; - *(here->HSMHVDgpPtr +1) += here->HSMHV_ydyn_d[gNodePrime] * s->imag; - *(here->HSMHVDsPtr) += here->HSMHV_ydc_d[sNode] + here->HSMHV_ydyn_d[sNode] * s->real; - *(here->HSMHVDsPtr +1) += here->HSMHV_ydyn_d[sNode] * s->imag; - *(here->HSMHVDbpPtr) += here->HSMHV_ydc_d[bNodePrime] + here->HSMHV_ydyn_d[bNodePrime] * s->real; - *(here->HSMHVDbpPtr +1) += here->HSMHV_ydyn_d[bNodePrime] * s->imag; - *(here->HSMHVDdbPtr) += here->HSMHV_ydc_d[dbNode] + here->HSMHV_ydyn_d[dbNode] * s->real; - *(here->HSMHVDdbPtr +1) += here->HSMHV_ydyn_d[dbNode] * s->imag; - if( here->HSMHVtempNode > 0) { - *(here->HSMHVDtempPtr) += model->HSMHV_type * (here->HSMHV_ydc_d[tempNode] + here->HSMHV_ydyn_d[tempNode] * s->real); - *(here->HSMHVDtempPtr +1) += model->HSMHV_type * here->HSMHV_ydyn_d[tempNode] * s->imag; - } - - /*drain prime*/ - *(here->HSMHVDPdPtr) += here->HSMHV_ydc_dP[dNode] + here->HSMHV_ydyn_dP[dNode] * s->real; - *(here->HSMHVDPdPtr +1) += here->HSMHV_ydyn_dP[dNode] * s->imag; - *(here->HSMHVDPdpPtr) += here->HSMHV_ydc_dP[dNodePrime] + here->HSMHV_ydyn_dP[dNodePrime] * s->real; - *(here->HSMHVDPdpPtr +1) += here->HSMHV_ydyn_dP[dNodePrime] * s->imag; - *(here->HSMHVDPgpPtr) += here->HSMHV_ydc_dP[gNodePrime] + here->HSMHV_ydyn_dP[gNodePrime] * s->real; - *(here->HSMHVDPgpPtr +1) += here->HSMHV_ydyn_dP[gNodePrime] * s->imag; - *(here->HSMHVDPsPtr) += here->HSMHV_ydc_dP[sNode] + here->HSMHV_ydyn_dP[sNode] * s->real; - *(here->HSMHVDPsPtr +1) += here->HSMHV_ydyn_dP[sNode] * s->imag; - *(here->HSMHVDPspPtr) += here->HSMHV_ydc_dP[sNodePrime] + here->HSMHV_ydyn_dP[sNodePrime] * s->real; - *(here->HSMHVDPspPtr +1) += here->HSMHV_ydyn_dP[sNodePrime] * s->imag; - *(here->HSMHVDPbpPtr) += here->HSMHV_ydc_dP[bNodePrime] + here->HSMHV_ydyn_dP[bNodePrime] * s->real; - *(here->HSMHVDPbpPtr +1) += here->HSMHV_ydyn_dP[bNodePrime] * s->imag; - if( here->HSMHVtempNode > 0) { - *(here->HSMHVDPtempPtr) += model->HSMHV_type * (here->HSMHV_ydc_dP[tempNode] + here->HSMHV_ydyn_dP[tempNode] * s->real); - *(here->HSMHVDPtempPtr +1) += model->HSMHV_type * here->HSMHV_ydyn_dP[tempNode] * s->imag; - } - if (flg_nqs) { - *(here->HSMHVDPqiPtr) += model->HSMHV_type * (here->HSMHV_ydc_dP[qiNode] + here->HSMHV_ydyn_dP[qiNode] * s->real); - *(here->HSMHVDPqiPtr+1) += model->HSMHV_type * here->HSMHV_ydyn_dP[qiNode] * s->imag; - } - - - /*gate*/ - *(here->HSMHVGgPtr) += here->HSMHV_ydc_g[gNode] + here->HSMHV_ydyn_g[gNode] * s->real; - *(here->HSMHVGgPtr +1) += here->HSMHV_ydyn_g[gNode] * s->imag; - *(here->HSMHVGgpPtr) += here->HSMHV_ydc_g[gNodePrime] + here->HSMHV_ydyn_g[gNodePrime] * s->real; - *(here->HSMHVGgpPtr +1) += here->HSMHV_ydyn_g[gNodePrime] * s->imag; - - /*gate prime*/ - *(here->HSMHVGPdPtr) += here->HSMHV_ydc_gP[dNode] + here->HSMHV_ydyn_gP[dNode] * s->real; - *(here->HSMHVGPdPtr +1) += here->HSMHV_ydyn_gP[dNode] * s->imag; - *(here->HSMHVGPdpPtr) += here->HSMHV_ydc_gP[dNodePrime] + here->HSMHV_ydyn_gP[dNodePrime] * s->real; - *(here->HSMHVGPdpPtr +1) += here->HSMHV_ydyn_gP[dNodePrime] * s->imag; - *(here->HSMHVGPgPtr) += here->HSMHV_ydc_gP[gNode] + here->HSMHV_ydyn_gP[gNode] * s->real; - *(here->HSMHVGPgPtr +1) += here->HSMHV_ydyn_gP[gNode] * s->imag; - *(here->HSMHVGPgpPtr) += here->HSMHV_ydc_gP[gNodePrime] + here->HSMHV_ydyn_gP[gNodePrime] * s->real; - *(here->HSMHVGPgpPtr +1) += here->HSMHV_ydyn_gP[gNodePrime] * s->imag; - *(here->HSMHVGPsPtr) += here->HSMHV_ydc_gP[sNode] + here->HSMHV_ydyn_gP[sNode] * s->real; - *(here->HSMHVGPsPtr +1) += here->HSMHV_ydyn_gP[sNode] * s->imag; - *(here->HSMHVGPspPtr) += here->HSMHV_ydc_gP[sNodePrime] + here->HSMHV_ydyn_gP[sNodePrime] * s->real; - *(here->HSMHVGPspPtr +1) += here->HSMHV_ydyn_gP[sNodePrime] * s->imag; - *(here->HSMHVGPbpPtr) += here->HSMHV_ydc_gP[bNodePrime] + here->HSMHV_ydyn_gP[bNodePrime] * s->real; - *(here->HSMHVGPbpPtr +1) += here->HSMHV_ydyn_gP[bNodePrime] * s->imag; - if( here->HSMHVtempNode > 0) { - *(here->HSMHVGPtempPtr) += model->HSMHV_type * (here->HSMHV_ydc_gP[tempNode] + here->HSMHV_ydyn_gP[tempNode] * s->real); - *(here->HSMHVGPtempPtr +1) += model->HSMHV_type * here->HSMHV_ydyn_gP[tempNode] * s->imag; - } - if (flg_nqs) { - *(here->HSMHVGPqiPtr) += model->HSMHV_type * (here->HSMHV_ydc_gP[qiNode] + here->HSMHV_ydyn_gP[qiNode] * s->real); - *(here->HSMHVGPqiPtr+1) += model->HSMHV_type * here->HSMHV_ydyn_gP[qiNode] * s->imag; - *(here->HSMHVGPqbPtr) += model->HSMHV_type * (here->HSMHV_ydc_gP[qbNode] + here->HSMHV_ydyn_gP[qbNode] * s->real); - *(here->HSMHVGPqbPtr+1) += model->HSMHV_type * here->HSMHV_ydyn_gP[qbNode] * s->imag; - } - - /*source*/ - *(here->HSMHVSdPtr) += here->HSMHV_ydc_s[dNode] + here->HSMHV_ydyn_s[dNode] * s->real; - *(here->HSMHVSdPtr +1) += here->HSMHV_ydyn_s[dNode] * s->imag; - *(here->HSMHVSgpPtr) += here->HSMHV_ydc_s[gNodePrime] + here->HSMHV_ydyn_s[gNodePrime] * s->real; - *(here->HSMHVSgpPtr +1) += here->HSMHV_ydyn_s[gNodePrime] * s->imag; - *(here->HSMHVSsPtr) += here->HSMHV_ydc_s[sNode] + here->HSMHV_ydyn_s[sNode] * s->real; - *(here->HSMHVSsPtr +1) += here->HSMHV_ydyn_s[sNode] * s->imag; - *(here->HSMHVSspPtr) += here->HSMHV_ydc_s[sNodePrime] + here->HSMHV_ydyn_s[sNodePrime] * s->real; - *(here->HSMHVSspPtr +1) += here->HSMHV_ydyn_s[sNodePrime] * s->imag; - *(here->HSMHVSbpPtr) += here->HSMHV_ydc_s[bNodePrime] + here->HSMHV_ydyn_s[bNodePrime] * s->real; - *(here->HSMHVSbpPtr +1) += here->HSMHV_ydyn_s[bNodePrime] * s->imag; - *(here->HSMHVSsbPtr) += here->HSMHV_ydc_s[sbNode] + here->HSMHV_ydyn_s[sbNode] * s->real; - *(here->HSMHVSsbPtr +1) += here->HSMHV_ydyn_s[sbNode] * s->imag; - if( here->HSMHVtempNode > 0) { - *(here->HSMHVStempPtr) += model->HSMHV_type * (here->HSMHV_ydc_s[tempNode] + here->HSMHV_ydyn_s[tempNode] * s->real); - *(here->HSMHVStempPtr +1) += model->HSMHV_type * here->HSMHV_ydyn_s[tempNode] * s->imag; - } - - /*source prime*/ - *(here->HSMHVSPdPtr) += here->HSMHV_ydc_sP[dNode] + here->HSMHV_ydyn_sP[dNode] * s->real; - *(here->HSMHVSPdPtr +1) += here->HSMHV_ydyn_sP[dNode] * s->imag; - *(here->HSMHVSPdpPtr) += here->HSMHV_ydc_sP[dNodePrime] + here->HSMHV_ydyn_sP[dNodePrime] * s->real; - *(here->HSMHVSPdpPtr +1) += here->HSMHV_ydyn_sP[dNodePrime] * s->imag; - *(here->HSMHVSPgpPtr) += here->HSMHV_ydc_sP[gNodePrime] + here->HSMHV_ydyn_sP[gNodePrime] * s->real; - *(here->HSMHVSPgpPtr +1) += here->HSMHV_ydyn_sP[gNodePrime] * s->imag; - *(here->HSMHVSPsPtr) += here->HSMHV_ydc_sP[sNode] + here->HSMHV_ydyn_sP[sNode] * s->real; - *(here->HSMHVSPsPtr +1) += here->HSMHV_ydyn_sP[sNode] * s->imag; - *(here->HSMHVSPspPtr) += here->HSMHV_ydc_sP[sNodePrime] + here->HSMHV_ydyn_sP[sNodePrime] * s->real; - *(here->HSMHVSPspPtr +1) += here->HSMHV_ydyn_sP[sNodePrime] * s->imag; - *(here->HSMHVSPbpPtr) += here->HSMHV_ydc_sP[bNodePrime] + here->HSMHV_ydyn_sP[bNodePrime] * s->real; - *(here->HSMHVSPbpPtr +1) += here->HSMHV_ydyn_sP[bNodePrime] * s->imag; - if( here->HSMHVtempNode > 0) { - *(here->HSMHVSPtempPtr) += model->HSMHV_type * (here->HSMHV_ydc_sP[tempNode] + here->HSMHV_ydyn_sP[tempNode] * s->real); - *(here->HSMHVSPtempPtr +1) += model->HSMHV_type * here->HSMHV_ydyn_sP[tempNode] * s->imag; - } - if (flg_nqs) { - *(here->HSMHVSPqiPtr) += model->HSMHV_type * (here->HSMHV_ydc_sP[qiNode] + here->HSMHV_ydyn_sP[qiNode] * s->real); - *(here->HSMHVSPqiPtr+1) += model->HSMHV_type * here->HSMHV_ydyn_sP[qiNode] * s->imag; - } - - /*bulk prime*/ - *(here->HSMHVBPdpPtr) += here->HSMHV_ydc_bP[dNodePrime] + here->HSMHV_ydyn_bP[dNodePrime] * s->real; - *(here->HSMHVBPdpPtr +1) += here->HSMHV_ydyn_bP[dNodePrime] * s->imag; - *(here->HSMHVBPgpPtr) += here->HSMHV_ydc_bP[gNodePrime] + here->HSMHV_ydyn_bP[gNodePrime] * s->real; - *(here->HSMHVBPgpPtr +1) += here->HSMHV_ydyn_bP[gNodePrime] * s->imag; - *(here->HSMHVBPspPtr) += here->HSMHV_ydc_bP[sNodePrime] + here->HSMHV_ydyn_bP[sNodePrime] * s->real; - *(here->HSMHVBPspPtr +1) += here->HSMHV_ydyn_bP[sNodePrime] * s->imag; - *(here->HSMHVBPbpPtr) += here->HSMHV_ydc_bP[bNodePrime] + here->HSMHV_ydyn_bP[bNodePrime] * s->real; - *(here->HSMHVBPbpPtr +1) += here->HSMHV_ydyn_bP[bNodePrime] * s->imag; - *(here->HSMHVBPbPtr) += here->HSMHV_ydc_bP[bNode] + here->HSMHV_ydyn_bP[bNode] * s->real; - *(here->HSMHVBPbPtr +1) += here->HSMHV_ydyn_bP[bNode] * s->imag; - *(here->HSMHVBPdbPtr) += here->HSMHV_ydc_bP[dbNode] + here->HSMHV_ydyn_bP[dbNode] * s->real; - *(here->HSMHVBPdbPtr +1) += here->HSMHV_ydyn_bP[dbNode] * s->imag; - *(here->HSMHVBPsbPtr) += here->HSMHV_ydc_bP[sbNode] + here->HSMHV_ydyn_bP[sbNode] * s->real; - *(here->HSMHVBPsbPtr +1) += here->HSMHV_ydyn_bP[sbNode] * s->imag; - if( here->HSMHVtempNode > 0) { - *(here->HSMHVBPtempPtr) += model->HSMHV_type * (here->HSMHV_ydc_bP[tempNode] + here->HSMHV_ydyn_bP[tempNode] * s->real); - *(here->HSMHVBPtempPtr +1) += model->HSMHV_type * here->HSMHV_ydyn_bP[tempNode] * s->imag; - } - if (flg_nqs) { - *(here->HSMHVBPqbPtr) += model->HSMHV_type * (here->HSMHV_ydc_bP[qbNode] + here->HSMHV_ydyn_bP[qbNode] * s->real); - *(here->HSMHVBPqbPtr+1) += model->HSMHV_type * here->HSMHV_ydyn_bP[qbNode] * s->imag; - } - - /*bulk*/ - *(here->HSMHVBbpPtr) += here->HSMHV_ydc_b[bNodePrime] + here->HSMHV_ydyn_b[bNodePrime] * s->real; - *(here->HSMHVBbpPtr +1) += here->HSMHV_ydyn_b[bNodePrime] * s->imag; - *(here->HSMHVBbPtr) += here->HSMHV_ydc_b[bNode] + here->HSMHV_ydyn_b[bNode] * s->real; - *(here->HSMHVBbPtr +1) += here->HSMHV_ydyn_b[bNode] * s->imag; - - /*drain bulk*/ - *(here->HSMHVDBdPtr) += here->HSMHV_ydc_db[dNode] + here->HSMHV_ydyn_db[dNode] * s->real; - *(here->HSMHVDBdPtr +1) += here->HSMHV_ydyn_db[dNode] * s->imag; - *(here->HSMHVDBbpPtr) += here->HSMHV_ydc_db[bNodePrime] + here->HSMHV_ydyn_db[bNodePrime] * s->real; - *(here->HSMHVDBbpPtr +1) += here->HSMHV_ydyn_db[bNodePrime] * s->imag; - *(here->HSMHVDBdbPtr) += here->HSMHV_ydc_db[dbNode] + here->HSMHV_ydyn_db[dbNode] * s->real; - *(here->HSMHVDBdbPtr +1) += here->HSMHV_ydyn_db[dbNode] * s->imag; - if( here->HSMHVtempNode > 0) { - *(here->HSMHVDBtempPtr) += model->HSMHV_type * (here->HSMHV_ydc_db[tempNode] + here->HSMHV_ydyn_db[tempNode] * s->real); - *(here->HSMHVDBtempPtr +1) += model->HSMHV_type * here->HSMHV_ydyn_db[tempNode] * s->imag; - } - - /*source bulk*/ - *(here->HSMHVSBsPtr) += here->HSMHV_ydc_sb[sNode] + here->HSMHV_ydyn_sb[sNode] * s->real; - *(here->HSMHVSBsPtr +1) += here->HSMHV_ydyn_sb[sNode] * s->imag; - *(here->HSMHVSBbpPtr) += here->HSMHV_ydc_sb[bNodePrime] + here->HSMHV_ydyn_sb[bNodePrime] * s->real; - *(here->HSMHVSBbpPtr +1) += here->HSMHV_ydyn_sb[bNodePrime] * s->imag; - *(here->HSMHVSBsbPtr) += here->HSMHV_ydc_sb[sbNode] + here->HSMHV_ydyn_sb[sbNode] * s->real; - *(here->HSMHVSBsbPtr +1) += here->HSMHV_ydyn_sb[sbNode] * s->imag; - if( here->HSMHVtempNode > 0) { - *(here->HSMHVSBtempPtr) += model->HSMHV_type * (here->HSMHV_ydc_sb[tempNode] + here->HSMHV_ydyn_sb[tempNode] * s->real); - *(here->HSMHVSBtempPtr +1) += model->HSMHV_type * here->HSMHV_ydyn_sb[tempNode] * s->imag; - } - - /*temp*/ - if( here->HSMHVtempNode > 0) { - *(here->HSMHVTempdPtr) += model->HSMHV_type * (here->HSMHV_ydc_t[dNode] + here->HSMHV_ydyn_t[dNode] * s->real); - *(here->HSMHVTempdPtr +1) += model->HSMHV_type * here->HSMHV_ydyn_t[dNode] * s->imag; - *(here->HSMHVTempdpPtr) += model->HSMHV_type * (here->HSMHV_ydc_t[dNodePrime] + here->HSMHV_ydyn_t[dNodePrime] * s->real); - *(here->HSMHVTempdpPtr +1) += model->HSMHV_type * here->HSMHV_ydyn_t[dNodePrime] * s->imag; - *(here->HSMHVTempgpPtr) += model->HSMHV_type * (here->HSMHV_ydc_t[gNodePrime] + here->HSMHV_ydyn_t[gNodePrime] * s->real); - *(here->HSMHVTempgpPtr +1) += model->HSMHV_type * here->HSMHV_ydyn_t[gNodePrime] * s->imag; - *(here->HSMHVTempsPtr) += model->HSMHV_type * (here->HSMHV_ydc_t[sNode] + here->HSMHV_ydyn_t[sNode] * s->real); - *(here->HSMHVTempsPtr +1) += model->HSMHV_type * here->HSMHV_ydyn_t[sNode] * s->imag; - *(here->HSMHVTempspPtr) += model->HSMHV_type * (here->HSMHV_ydc_t[sNodePrime] + here->HSMHV_ydyn_t[sNodePrime] * s->real); - *(here->HSMHVTempspPtr +1) += model->HSMHV_type * here->HSMHV_ydyn_t[sNodePrime] * s->imag; - *(here->HSMHVTempbpPtr) += model->HSMHV_type * (here->HSMHV_ydc_t[bNodePrime] + here->HSMHV_ydyn_t[bNodePrime] * s->real); - *(here->HSMHVTempbpPtr +1) += model->HSMHV_type * here->HSMHV_ydyn_t[bNodePrime] * s->imag; - *(here->HSMHVTemptempPtr) += here->HSMHV_ydc_t[tempNode] + here->HSMHV_ydyn_t[tempNode] * s->real; - *(here->HSMHVTemptempPtr +1) += here->HSMHV_ydyn_t[tempNode] * s->imag; - } - /* additional entries for flat nqs handling */ - if ( flg_nqs ) { - /*qi*/ - *(here->HSMHVQIdpPtr) += model->HSMHV_type * (here->HSMHV_ydc_qi[dNodePrime] + here->HSMHV_ydyn_qi[dNodePrime] * s->real); - *(here->HSMHVQIdpPtr+1) += model->HSMHV_type * here->HSMHV_ydyn_qi[dNodePrime] * s->imag; - *(here->HSMHVQIgpPtr) += model->HSMHV_type * (here->HSMHV_ydc_qi[gNodePrime] + here->HSMHV_ydyn_qi[gNodePrime] * s->real); - *(here->HSMHVQIgpPtr+1) += model->HSMHV_type * here->HSMHV_ydyn_qi[gNodePrime] * s->imag; - *(here->HSMHVQIspPtr) += model->HSMHV_type * (here->HSMHV_ydc_qi[sNodePrime] + here->HSMHV_ydyn_qi[sNodePrime] * s->real); - *(here->HSMHVQIspPtr+1) += model->HSMHV_type * here->HSMHV_ydyn_qi[sNodePrime] * s->imag; - *(here->HSMHVQIbpPtr) += model->HSMHV_type * (here->HSMHV_ydc_qi[bNodePrime] + here->HSMHV_ydyn_qi[bNodePrime] * s->real); - *(here->HSMHVQIbpPtr+1) += model->HSMHV_type * here->HSMHV_ydyn_qi[bNodePrime] * s->imag; - *(here->HSMHVQIqiPtr) += here->HSMHV_ydc_qi[qiNode] + here->HSMHV_ydyn_qi[qiNode] * s->real; - *(here->HSMHVQIqiPtr+1) += here->HSMHV_ydyn_qi[qiNode] * s->imag; - if ( here->HSMHVtempNode > 0 ) { - *(here->HSMHVQItempPtr) += here->HSMHV_ydc_qi[tempNode] + here->HSMHV_ydyn_qi[tempNode] * s->real; - *(here->HSMHVQItempPtr+1) += here->HSMHV_ydyn_qi[tempNode] * s->imag; - } - - /*qb*/ - *(here->HSMHVQBdpPtr) += model->HSMHV_type * (here->HSMHV_ydc_qb[dNodePrime] + here->HSMHV_ydyn_qb[dNodePrime] * s->real); - *(here->HSMHVQBdpPtr+1) += model->HSMHV_type * here->HSMHV_ydyn_qb[dNodePrime] * s->imag; - *(here->HSMHVQBgpPtr) += model->HSMHV_type * (here->HSMHV_ydc_qb[gNodePrime] + here->HSMHV_ydyn_qb[gNodePrime] * s->real); - *(here->HSMHVQBgpPtr+1) += model->HSMHV_type * here->HSMHV_ydyn_qb[gNodePrime] * s->imag; - *(here->HSMHVQBspPtr) += model->HSMHV_type * (here->HSMHV_ydc_qb[sNodePrime] + here->HSMHV_ydyn_qb[sNodePrime] * s->real); - *(here->HSMHVQBspPtr+1) += model->HSMHV_type * here->HSMHV_ydyn_qb[sNodePrime] * s->imag; - *(here->HSMHVQBbpPtr) += model->HSMHV_type * (here->HSMHV_ydc_qb[bNodePrime] + here->HSMHV_ydyn_qb[bNodePrime] * s->real); - *(here->HSMHVQBbpPtr+1) += model->HSMHV_type * here->HSMHV_ydyn_qb[bNodePrime] * s->imag; - *(here->HSMHVQBqbPtr) += here->HSMHV_ydc_qb[qbNode] + here->HSMHV_ydyn_qb[qbNode] * s->real; - *(here->HSMHVQBqbPtr+1) += here->HSMHV_ydyn_qb[qbNode] * s->imag; - if ( here->HSMHVtempNode > 0 ) { - *(here->HSMHVQBtempPtr) += here->HSMHV_ydc_qb[tempNode] + here->HSMHV_ydyn_qb[tempNode] * s->real; - *(here->HSMHVQBtempPtr+1) += here->HSMHV_ydyn_qb[tempNode] * s->imag; - } - } - } - } - return(OK); -} - diff --git a/src/spicelib/devices/hisimhv1/hsmhvset.c b/src/spicelib/devices/hisimhv1/hsmhvset.c deleted file mode 100644 index 08ba1d1ac..000000000 --- a/src/spicelib/devices/hisimhv1/hsmhvset.c +++ /dev/null @@ -1,1528 +0,0 @@ -/*********************************************************************** - - HiSIM (Hiroshima University STARC IGFET Model) - Copyright (C) 2012 Hiroshima University & STARC - - MODEL NAME : HiSIM_HV - ( VERSION : 1 SUBVERSION : 2 REVISION : 4 ) - Model Parameter VERSION : 1.23 - FILE : hsmhvset.c - - DATE : 2013.04.30 - - released by - Hiroshima University & - Semiconductor Technology Academic Research Center (STARC) -***********************************************************************/ - -#include "ngspice/ngspice.h" -#include "ngspice/smpdefs.h" -#include "ngspice/cktdefs.h" -#include "hsmhvdef.h" -#include "hsmhvevalenv.h" -#include "ngspice/const.h" -#include "ngspice/sperror.h" -#include "ngspice/suffix.h" - -#define C_m2cm (1.0e2) -#define C_cm2m_p3 (1.0e-6) -#define C_m2cm_p1o2 (1.0e1) - -#define BINNING(param) pParam->HSMHV_##param = model->HSMHV_##param \ - + model->HSMHV_l##param / Lbin + model->HSMHV_w##param / Wbin \ - + model->HSMHV_p##param / LWbin ; - -#define RANGECHECK(param, min, max, pname) \ - if ( (param) < (min) || (param) > (max) ) { \ - printf("warning(HiSIMHV): The model/instance parameter %s (= %e) must be in the range [%e , %e].\n", \ - (pname), (param), (double) (min), (double) (max) ); \ - } -#define MINCHECK(param, min, pname) \ - if ( (param) < (min) ) { \ - printf("warning(HiSIMHV): The model/instance parameter %s (= %e) must be greater than %e.\n", \ - (pname), (param), (min) ); \ - } - -int HSMHVsetup( - register SMPmatrix *matrix, - register GENmodel *inModel, - register CKTcircuit *ckt, - int *states) - /* load the HSMHV device structure with those pointers needed later - * for fast matrix loading - */ -{ - register HSMHVmodel *model = (HSMHVmodel*)inModel; - register HSMHVinstance *here; - int error=0 ; - CKTnode *tmp; - double T2, Rd, Rs ; - HSMHVbinningParam *pParam ; - HSMHVmodelMKSParam *modelMKS ; - HSMHVhereMKSParam *hereMKS ; - double LG=0.0, WG =0.0, Lgate =0.0, Wgate =0.0 ; - double Lbin=0.0, Wbin=0.0, LWbin =0.0; /* binning */ - - /* loop through all the HSMHV device models */ - for ( ;model != NULL ;model = HSMHVnextModel(model)) { - /* Default value Processing for HVMOS Models */ - if ( !model->HSMHV_type_Given ) - model->HSMHV_type = NMOS ; - - if ( !model->HSMHV_info_Given ) model->HSMHV_info = 0 ; - - model->HSMHV_noise = 1; - - if ( !model->HSMHV_version_Given) { - model->HSMHV_version = "1.24" ; - printf(" 1.24 is selected for VERSION. (default) \n"); - } else { - if (strncmp(model->HSMHV_version,"1.24", 4) != 0 ) { - model->HSMHV_version = "1.24" ; - printf(" 1.24 is selected for VERSION. (default) \n"); - } else { - printf(" %s is selected for VERSION \n", model->HSMHV_version); - } - } - - if ( !model->HSMHV_corsrd_Given ) model->HSMHV_corsrd = 3 ; - if ( !model->HSMHV_corg_Given ) model->HSMHV_corg = 0 ; - if ( !model->HSMHV_coiprv_Given ) model->HSMHV_coiprv = 1 ; - if ( !model->HSMHV_copprv_Given ) model->HSMHV_copprv = 1 ; - if ( !model->HSMHV_coadov_Given ) model->HSMHV_coadov = 1 ; - if ( !model->HSMHV_coisub_Given ) model->HSMHV_coisub = 0 ; - if ( !model->HSMHV_coiigs_Given ) model->HSMHV_coiigs = 0 ; - if ( !model->HSMHV_cogidl_Given ) model->HSMHV_cogidl = 0 ; - if ( !model->HSMHV_coovlp_Given ) model->HSMHV_coovlp = 1 ; - if ( !model->HSMHV_coovlps_Given ) model->HSMHV_coovlps = 0 ; - if ( !model->HSMHV_coflick_Given ) model->HSMHV_coflick = 0 ; - if ( !model->HSMHV_coisti_Given ) model->HSMHV_coisti = 0 ; - if ( !model->HSMHV_conqs_Given ) model->HSMHV_conqs = 0 ; /* QS (default) */ - if ( !model->HSMHV_cothrml_Given ) model->HSMHV_cothrml = 0 ; - if ( !model->HSMHV_coign_Given ) model->HSMHV_coign = 0 ; /* induced gate noise */ - if ( !model->HSMHV_codfm_Given ) model->HSMHV_codfm = 0 ; /* DFM */ - if ( !model->HSMHV_coqovsm_Given ) model->HSMHV_coqovsm = 1 ; - if ( !model->HSMHV_corbnet_Given ) model->HSMHV_corbnet = 0 ; - else if ( model->HSMHV_corbnet != 0 && model->HSMHV_corbnet != 1 ) { - model->HSMHV_corbnet = 0; - printf("warning(HiSIMHV): CORBNET has been set to its default value: %d.\n", model->HSMHV_corbnet); - } - if ( !model->HSMHV_coselfheat_Given ) model->HSMHV_coselfheat = 0 ; /* Self-heating model */ - if ( !model->HSMHV_cosubnode_Given ) model->HSMHV_cosubnode = 0 ; - if ( !model->HSMHV_cosym_Given ) model->HSMHV_cosym = 0 ; /* Symmetry model for HV */ - if ( !model->HSMHV_cotemp_Given ) model->HSMHV_cotemp = 0 ; - if ( !model->HSMHV_coldrift_Given ) model->HSMHV_coldrift = 0 ; - - - if ( !model->HSMHV_vmax_Given ) model->HSMHV_vmax = 1.0e7 ; - if ( !model->HSMHV_vmaxt1_Given ) model->HSMHV_vmaxt1 = 0.0 ; - if ( !model->HSMHV_vmaxt2_Given ) model->HSMHV_vmaxt2 = 0.0 ; - if ( !model->HSMHV_bgtmp1_Given ) model->HSMHV_bgtmp1 = 90.25e-6 ; - if ( !model->HSMHV_bgtmp2_Given ) model->HSMHV_bgtmp2 = 1.0e-7 ; - if ( !model->HSMHV_eg0_Given ) model->HSMHV_eg0 = 1.1785e0 ; - if ( !model->HSMHV_tox_Given ) model->HSMHV_tox = 30e-9 ; - if ( !model->HSMHV_xld_Given ) model->HSMHV_xld = 0.0 ; - if ( !model->HSMHV_lovers_Given ) model->HSMHV_lovers = 30e-9 ; - if ( model->HSMHV_lover_Given ) model->HSMHV_lovers = model->HSMHV_lover ; - if ( !model->HSMHV_rdov11_Given ) model->HSMHV_rdov11 = 0.0 ; - if ( !model->HSMHV_rdov12_Given ) model->HSMHV_rdov12 = 1.0 ; - if ( !model->HSMHV_rdov13_Given ) model->HSMHV_rdov13 = 1.0 ; - if ( !model->HSMHV_rdslp1_Given ) model->HSMHV_rdslp1 = 1.0 ; - if ( !model->HSMHV_rdict1_Given ) model->HSMHV_rdict1 = 1.0 ; - if ( !model->HSMHV_rdslp2_Given ) model->HSMHV_rdslp2 = 1.0 ; - if ( !model->HSMHV_rdict2_Given ) model->HSMHV_rdict2 = 0.0 ; - if ( !model->HSMHV_loverld_Given ) model->HSMHV_loverld = 1.0e-6 ; - if ( !model->HSMHV_ldrift1_Given ) model->HSMHV_ldrift1 = 1.0e-6 ; - if ( !model->HSMHV_ldrift2_Given ) model->HSMHV_ldrift2 = 1.0e-6 ; - if ( !model->HSMHV_ldrift1s_Given ) model->HSMHV_ldrift1s = 0.0 ; - if ( !model->HSMHV_ldrift2s_Given ) model->HSMHV_ldrift2s = 1.0e-6 ; - if ( !model->HSMHV_subld1_Given ) model->HSMHV_subld1 = 0.0 ; - if ( !model->HSMHV_subld2_Given ) model->HSMHV_subld2 = 0.0 ; - if ( !model->HSMHV_ddltmax_Given ) model->HSMHV_ddltmax = 10.0 ; /* Vdseff */ - if ( !model->HSMHV_ddltslp_Given ) model->HSMHV_ddltslp = 0.0 ; /* Vdseff */ - if ( !model->HSMHV_ddltict_Given ) model->HSMHV_ddltict = 10.0 ; /* Vdseff */ - if ( !model->HSMHV_vfbover_Given ) model->HSMHV_vfbover = -0.5 ; - if ( !model->HSMHV_nover_Given ) model->HSMHV_nover = 3.0e16 ; - if ( !model->HSMHV_novers_Given ) model->HSMHV_novers = 0.0 ; - if ( !model->HSMHV_xwd_Given ) model->HSMHV_xwd = 0.0 ; - if ( !model->HSMHV_xwdc_Given ) model->HSMHV_xwdc = model->HSMHV_xwd ; - - if ( !model->HSMHV_xl_Given ) model->HSMHV_xl = 0.0 ; - if ( !model->HSMHV_xw_Given ) model->HSMHV_xw = 0.0 ; - if ( !model->HSMHV_saref_Given ) model->HSMHV_saref = 1e-6 ; - if ( !model->HSMHV_sbref_Given ) model->HSMHV_sbref = 1e-6 ; - if ( !model->HSMHV_ll_Given ) model->HSMHV_ll = 0.0 ; - if ( !model->HSMHV_lld_Given ) model->HSMHV_lld = 0.0 ; - if ( !model->HSMHV_lln_Given ) model->HSMHV_lln = 0.0 ; - if ( !model->HSMHV_wl_Given ) model->HSMHV_wl = 0.0 ; - if ( !model->HSMHV_wl1_Given ) model->HSMHV_wl1 = 0.0 ; - if ( !model->HSMHV_wl1p_Given ) model->HSMHV_wl1p = 1.0 ; - if ( !model->HSMHV_wl2_Given ) model->HSMHV_wl2 = 0.0 ; - if ( !model->HSMHV_wl2p_Given ) model->HSMHV_wl2p = 1.0 ; - if ( !model->HSMHV_wld_Given ) model->HSMHV_wld = 0.0 ; - if ( !model->HSMHV_wln_Given ) model->HSMHV_wln = 0.0 ; - - if ( !model->HSMHV_rsh_Given ) model->HSMHV_rsh = 0.0 ; - if ( !model->HSMHV_rshg_Given ) model->HSMHV_rshg = 0.0 ; - - if ( !model->HSMHV_xqy_Given ) model->HSMHV_xqy = 0.0 ; - if ( !model->HSMHV_xqy1_Given ) model->HSMHV_xqy1 = 0.0 ; - if ( !model->HSMHV_xqy2_Given ) model->HSMHV_xqy2 = 0.0 ; - if ( !model->HSMHV_rs_Given ) model->HSMHV_rs = 0.0 ; - if ( !model->HSMHV_rd_Given ) model->HSMHV_rd = 5.0e-3 ; - if ( !model->HSMHV_vfbc_Given ) model->HSMHV_vfbc = -1.0 ; - if ( !model->HSMHV_vbi_Given ) model->HSMHV_vbi = 1.1 ; - if ( !model->HSMHV_nsubc_Given ) model->HSMHV_nsubc = 5.0e17 ; - if ( !model->HSMHV_parl2_Given ) model->HSMHV_parl2 = 10.0e-9 ; - if ( !model->HSMHV_lp_Given ) model->HSMHV_lp = 0.0 ; - if ( !model->HSMHV_nsubp_Given ) model->HSMHV_nsubp = 1.0e18 ; - - if ( !model->HSMHV_nsubp0_Given ) model->HSMHV_nsubp0 = 0.0 ; - if ( !model->HSMHV_nsubwp_Given ) model->HSMHV_nsubwp = 1.0 ; - - if ( !model->HSMHV_scp1_Given ) model->HSMHV_scp1 = 1.0 ; - if ( !model->HSMHV_scp2_Given ) model->HSMHV_scp2 = 0.0 ; - if ( !model->HSMHV_scp3_Given ) model->HSMHV_scp3 = 0.0 ; - if ( !model->HSMHV_sc1_Given ) model->HSMHV_sc1 = 1.0 ; - if ( !model->HSMHV_sc2_Given ) model->HSMHV_sc2 = 0.0 ; - if ( !model->HSMHV_sc3_Given ) model->HSMHV_sc3 = 0.0 ; - if ( !model->HSMHV_sc4_Given ) model->HSMHV_sc4 = 0.0 ; - if ( !model->HSMHV_pgd1_Given ) model->HSMHV_pgd1 = 0.0 ; - if ( !model->HSMHV_pgd2_Given ) model->HSMHV_pgd2 = 1.0 ; - if ( !model->HSMHV_pgd3_Given ) model->HSMHV_pgd3 = 0.8 ; - if ( !model->HSMHV_pgd4_Given ) model->HSMHV_pgd4 = 0.0 ; - - if ( !model->HSMHV_ndep_Given ) model->HSMHV_ndep = 1.0 ; - if ( !model->HSMHV_ndepl_Given ) model->HSMHV_ndepl = 0.0 ; - if ( !model->HSMHV_ndeplp_Given ) model->HSMHV_ndeplp = 1.0 ; - if ( !model->HSMHV_ninv_Given ) model->HSMHV_ninv = 0.5 ; - if ( !model->HSMHV_muecb0_Given ) model->HSMHV_muecb0 = 1.0e3 ; - if ( !model->HSMHV_muecb1_Given ) model->HSMHV_muecb1 = 100.0 ; - if ( !model->HSMHV_mueph0_Given ) model->HSMHV_mueph0 = 300.0e-3 ; - if ( !model->HSMHV_mueph1_Given ) { - if (model->HSMHV_type == NMOS) model->HSMHV_mueph1 = 25.0e3 ; - else model->HSMHV_mueph1 = 9.0e3 ; - } - if ( !model->HSMHV_muephw_Given ) model->HSMHV_muephw = 0.0 ; - if ( !model->HSMHV_muepwp_Given ) model->HSMHV_muepwp = 1.0 ; - if ( !model->HSMHV_muephl_Given ) model->HSMHV_muephl = 0.0 ; - if ( !model->HSMHV_mueplp_Given ) model->HSMHV_mueplp = 1.0 ; - if ( !model->HSMHV_muephs_Given ) model->HSMHV_muephs = 0.0 ; - if ( !model->HSMHV_muepsp_Given ) model->HSMHV_muepsp = 1.0 ; - - if ( !model->HSMHV_vtmp_Given ) model->HSMHV_vtmp = 0.0 ; - - if ( !model->HSMHV_wvth0_Given ) model->HSMHV_wvth0 = 0.0 ; - - if ( !model->HSMHV_muesr0_Given ) model->HSMHV_muesr0 = 2.0 ; - if ( !model->HSMHV_muesr1_Given ) model->HSMHV_muesr1 = 1.0e16 ; - if ( !model->HSMHV_muesrl_Given ) model->HSMHV_muesrl = 0.0 ; - if ( !model->HSMHV_muesrw_Given ) model->HSMHV_muesrw = 0.0 ; - if ( !model->HSMHV_mueswp_Given ) model->HSMHV_mueswp = 1.0 ; - if ( !model->HSMHV_mueslp_Given ) model->HSMHV_mueslp = 1.0 ; - - if ( !model->HSMHV_muetmp_Given ) model->HSMHV_muetmp = 1.5 ; - - if ( !model->HSMHV_bb_Given ) { - if (model->HSMHV_type == NMOS) model->HSMHV_bb = 2.0 ; - else model->HSMHV_bb = 1.0 ; - } - - if ( !model->HSMHV_sub1_Given ) model->HSMHV_sub1 = 10.0 ; - if ( !model->HSMHV_sub2_Given ) model->HSMHV_sub2 = 25.0 ; - if ( !model->HSMHV_svgs_Given ) model->HSMHV_svgs = 0.8e0 ; - if ( !model->HSMHV_svbs_Given ) model->HSMHV_svbs = 0.5e0 ; - if ( !model->HSMHV_svbsl_Given ) model->HSMHV_svbsl = 0e0 ; - if ( !model->HSMHV_svds_Given ) model->HSMHV_svds = 0.8e0 ; - if ( !model->HSMHV_slg_Given ) model->HSMHV_slg = 30e-9 ; - if ( !model->HSMHV_sub1l_Given ) model->HSMHV_sub1l = 2.5e-3 ; - if ( !model->HSMHV_sub2l_Given ) model->HSMHV_sub2l = 2e-6 ; - if ( !model->HSMHV_fn1_Given ) model->HSMHV_fn1 = 50e0 ; - if ( !model->HSMHV_fn2_Given ) model->HSMHV_fn2 = 170e-6 ; - if ( !model->HSMHV_fn3_Given ) model->HSMHV_fn3 = 0e0 ; - if ( !model->HSMHV_fvbs_Given ) model->HSMHV_fvbs = 12e-3 ; - - if ( !model->HSMHV_svgsl_Given ) model->HSMHV_svgsl = 0.0 ; - if ( !model->HSMHV_svgslp_Given ) model->HSMHV_svgslp = 1.0 ; - if ( !model->HSMHV_svgswp_Given ) model->HSMHV_svgswp = 1.0 ; - if ( !model->HSMHV_svgsw_Given ) model->HSMHV_svgsw = 0.0 ; - if ( !model->HSMHV_svbslp_Given ) model->HSMHV_svbslp = 1.0 ; - if ( !model->HSMHV_slgl_Given ) model->HSMHV_slgl = 0.0 ; - if ( !model->HSMHV_slglp_Given ) model->HSMHV_slglp = 1.0 ; - if ( !model->HSMHV_sub1lp_Given ) model->HSMHV_sub1lp = 1.0 ; - - if ( !model->HSMHV_nsti_Given ) model->HSMHV_nsti = 1.0e17 ; - if ( !model->HSMHV_wsti_Given ) model->HSMHV_wsti = 0.0 ; - if ( !model->HSMHV_wstil_Given ) model->HSMHV_wstil = 0.0 ; - if ( !model->HSMHV_wstilp_Given ) model->HSMHV_wstilp = 1.0 ; - if ( !model->HSMHV_wstiw_Given ) model->HSMHV_wstiw = 0.0 ; - if ( !model->HSMHV_wstiwp_Given ) model->HSMHV_wstiwp = 1.0 ; - if ( !model->HSMHV_scsti1_Given ) model->HSMHV_scsti1 = 0.0 ; - if ( !model->HSMHV_scsti2_Given ) model->HSMHV_scsti2 = 0.0 ; - if ( !model->HSMHV_vthsti_Given ) model->HSMHV_vthsti = 0.0 ; - if ( !model->HSMHV_vdsti_Given ) model->HSMHV_vdsti = 0.0 ; - if ( !model->HSMHV_muesti1_Given ) model->HSMHV_muesti1 = 0.0 ; - if ( !model->HSMHV_muesti2_Given ) model->HSMHV_muesti2 = 0.0 ; - if ( !model->HSMHV_muesti3_Given ) model->HSMHV_muesti3 = 1.0 ; - if ( !model->HSMHV_nsubpsti1_Given ) model->HSMHV_nsubpsti1 = 0.0 ; - if ( !model->HSMHV_nsubpsti2_Given ) model->HSMHV_nsubpsti2 = 0.0 ; - if ( !model->HSMHV_nsubpsti3_Given ) model->HSMHV_nsubpsti3 = 1.0 ; - - if ( !model->HSMHV_lpext_Given ) model->HSMHV_lpext = 1.0e-50 ; - if ( !model->HSMHV_npext_Given ) model->HSMHV_npext = 1.0e17 ; - if ( !model->HSMHV_scp21_Given ) model->HSMHV_scp21 = 0.0 ; - if ( !model->HSMHV_scp22_Given ) model->HSMHV_scp22 = 0.0 ; - if ( !model->HSMHV_bs1_Given ) model->HSMHV_bs1 = 0.0 ; - if ( !model->HSMHV_bs2_Given ) model->HSMHV_bs2 = 0.9 ; - - if ( !model->HSMHV_tpoly_Given ) model->HSMHV_tpoly = 200e-9 ; - if ( !model->HSMHV_cgbo_Given ) model->HSMHV_cgbo = 0.0 ; - if ( !model->HSMHV_js0_Given ) model->HSMHV_js0 = 0.5e-6 ; - if ( !model->HSMHV_js0sw_Given ) model->HSMHV_js0sw = 0.0 ; - if ( !model->HSMHV_nj_Given ) model->HSMHV_nj = 1.0 ; - if ( !model->HSMHV_njsw_Given ) model->HSMHV_njsw = 1.0 ; - if ( !model->HSMHV_xti_Given ) model->HSMHV_xti = 2.0 ; - if ( !model->HSMHV_cj_Given ) model->HSMHV_cj = 5.0e-04 ; - if ( !model->HSMHV_cjsw_Given ) model->HSMHV_cjsw = 5.0e-10 ; - if ( !model->HSMHV_cjswg_Given ) model->HSMHV_cjswg = 5.0e-10 ; - if ( !model->HSMHV_mj_Given ) model->HSMHV_mj = 0.5e0 ; - if ( !model->HSMHV_mjsw_Given ) model->HSMHV_mjsw = 0.33e0 ; - if ( !model->HSMHV_mjswg_Given ) model->HSMHV_mjswg = 0.33e0 ; - if ( !model->HSMHV_pb_Given ) model->HSMHV_pb = 1.0e0 ; - if ( !model->HSMHV_pbsw_Given ) model->HSMHV_pbsw = 1.0e0 ; - if ( !model->HSMHV_pbswg_Given ) model->HSMHV_pbswg = 1.0e0 ; - if ( !model->HSMHV_xti2_Given ) model->HSMHV_xti2 = 0.0e0 ; - if ( !model->HSMHV_cisb_Given ) model->HSMHV_cisb = 0.0e0 ; - if ( !model->HSMHV_cvb_Given ) model->HSMHV_cvb = 0.0e0 ; - if ( !model->HSMHV_ctemp_Given ) model->HSMHV_ctemp = 0.0e0 ; - if ( !model->HSMHV_cisbk_Given ) model->HSMHV_cisbk = 0.0e0 ; - if ( !model->HSMHV_cvbk_Given ) model->HSMHV_cvbk = 0.0e0 ; - if ( !model->HSMHV_divx_Given ) model->HSMHV_divx = 0.0e0 ; - - if ( !model->HSMHV_clm1_Given ) model->HSMHV_clm1 = 0.7 ; - if ( !model->HSMHV_clm2_Given ) model->HSMHV_clm2 = 2.0 ; - if ( !model->HSMHV_clm3_Given ) model->HSMHV_clm3 = 1.0 ; - if ( !model->HSMHV_clm5_Given ) model->HSMHV_clm5 = 1.0 ; - if ( !model->HSMHV_clm6_Given ) model->HSMHV_clm6 = 0.0 ; - if ( !model->HSMHV_vover_Given ) model->HSMHV_vover = 0.3 ; - if ( !model->HSMHV_voverp_Given ) model->HSMHV_voverp = 0.3 ; - if ( !model->HSMHV_wfc_Given ) model->HSMHV_wfc = 0.0 ; - if ( !model->HSMHV_nsubcw_Given ) model->HSMHV_nsubcw = 0.0 ; - if ( !model->HSMHV_nsubcwp_Given ) model->HSMHV_nsubcwp = 1.0 ; - if ( !model->HSMHV_qme1_Given ) model->HSMHV_qme1 = 0.0 ; - if ( !model->HSMHV_qme2_Given ) model->HSMHV_qme2 = 0.0 ; - if ( !model->HSMHV_qme3_Given ) model->HSMHV_qme3 = 0.0 ; - - if ( !model->HSMHV_vovers_Given ) model->HSMHV_vovers = 0.0 ; - if ( !model->HSMHV_voversp_Given ) model->HSMHV_voversp = 0.0 ; - - if ( !model->HSMHV_gidl1_Given ) model->HSMHV_gidl1 = 2e0 ; - if ( !model->HSMHV_gidl2_Given ) model->HSMHV_gidl2 = 3e7 ; - if ( !model->HSMHV_gidl3_Given ) model->HSMHV_gidl3 = 0.9e0 ; - if ( !model->HSMHV_gidl4_Given ) model->HSMHV_gidl4 = 0.0 ; - if ( !model->HSMHV_gidl5_Given ) model->HSMHV_gidl5 = 0.2e0 ; - - if ( !model->HSMHV_gleak1_Given ) model->HSMHV_gleak1 = 50e0 ; - if ( !model->HSMHV_gleak2_Given ) model->HSMHV_gleak2 = 10e6 ; - if ( !model->HSMHV_gleak3_Given ) model->HSMHV_gleak3 = 60e-3 ; - if ( !model->HSMHV_gleak4_Given ) model->HSMHV_gleak4 = 4e0 ; - if ( !model->HSMHV_gleak5_Given ) model->HSMHV_gleak5 = 7.5e3 ; - if ( !model->HSMHV_gleak6_Given ) model->HSMHV_gleak6 = 250e-3 ; - if ( !model->HSMHV_gleak7_Given ) model->HSMHV_gleak7 = 1e-6 ; - - if ( !model->HSMHV_glpart1_Given ) model->HSMHV_glpart1 = 0.5 ; - if ( !model->HSMHV_glksd1_Given ) model->HSMHV_glksd1 = 1.0e-15 ; - if ( !model->HSMHV_glksd2_Given ) model->HSMHV_glksd2 = 5e6 ; - if ( !model->HSMHV_glksd3_Given ) model->HSMHV_glksd3 = -5e6 ; - if ( !model->HSMHV_glkb1_Given ) model->HSMHV_glkb1 = 5e-16 ; - if ( !model->HSMHV_glkb2_Given ) model->HSMHV_glkb2 = 1e0 ; - if ( !model->HSMHV_glkb3_Given ) model->HSMHV_glkb3 = 0e0 ; - if ( !model->HSMHV_egig_Given ) model->HSMHV_egig = 0e0 ; - if ( !model->HSMHV_igtemp2_Given ) model->HSMHV_igtemp2 = 0e0 ; - if ( !model->HSMHV_igtemp3_Given ) model->HSMHV_igtemp3 = 0e0 ; - if ( !model->HSMHV_vzadd0_Given ) model->HSMHV_vzadd0 = 10.0e-3 ; - if ( !model->HSMHV_pzadd0_Given ) model->HSMHV_pzadd0 = 5.0e-3 ; - if ( !model->HSMHV_nftrp_Given ) model->HSMHV_nftrp = 10e9 ; - if ( !model->HSMHV_nfalp_Given ) model->HSMHV_nfalp = 1.0e-19 ; - if ( !model->HSMHV_cit_Given ) model->HSMHV_cit = 0e0 ; - if ( !model->HSMHV_falph_Given ) model->HSMHV_falph = 1.0 ; - - if ( !model->HSMHV_kappa_Given ) model->HSMHV_kappa = 3.90e0 ; - if ( !model->HSMHV_cgso_Given ) model->HSMHV_cgso = 0.0 ; - if ( !model->HSMHV_cgdo_Given ) model->HSMHV_cgdo = 0.0 ; - - if ( !model->HSMHV_pthrou_Given ) model->HSMHV_pthrou = 0.0 ; - - if ( !model->HSMHV_vdiffj_Given ) model->HSMHV_vdiffj = 0.6e-3 ; - if ( !model->HSMHV_dly1_Given ) model->HSMHV_dly1 = 100.0e-12 ; - if ( !model->HSMHV_dly2_Given ) model->HSMHV_dly2 = 0.7e0 ; - if ( !model->HSMHV_dly3_Given ) model->HSMHV_dly3 = 0.8e-6 ; - if ( !model->HSMHV_tnom_Given ) model->HSMHV_tnom = 27.0 ; /* [C] */ - - if ( !model->HSMHV_ovslp_Given ) model->HSMHV_ovslp = 2.1e-7 ; - if ( !model->HSMHV_ovmag_Given ) model->HSMHV_ovmag = 0.6 ; - - if ( !model->HSMHV_gbmin_Given ) model->HSMHV_gbmin = 1.0e-12; /* in mho */ - if ( !model->HSMHV_rbpb_Given ) model->HSMHV_rbpb = 50.0e0 ; - if ( !model->HSMHV_rbpd_Given ) model->HSMHV_rbpd = 50.0e0 ; - if ( !model->HSMHV_rbps_Given ) model->HSMHV_rbps = 50.0e0 ; - if ( !model->HSMHV_rbdb_Given ) model->HSMHV_rbdb = 50.0e0 ; - if ( !model->HSMHV_rbsb_Given ) model->HSMHV_rbsb = 50.0e0 ; - - if ( !model->HSMHV_ibpc1_Given ) model->HSMHV_ibpc1 = 0.0 ; - if ( !model->HSMHV_ibpc2_Given ) model->HSMHV_ibpc2 = 0.0 ; - - if ( !model->HSMHV_mphdfm_Given ) model->HSMHV_mphdfm = -0.3 ; - - if ( !model->HSMHV_rdvg11_Given ) model->HSMHV_rdvg11 = 0.0 ; - if ( !model->HSMHV_rdvg12_Given ) model->HSMHV_rdvg12 = 100.0 ; - if ( !model->HSMHV_rth0_Given ) model->HSMHV_rth0 = 0.1 ; /* Self-heating model */ - if ( !model->HSMHV_cth0_Given ) model->HSMHV_cth0 = 1.0e-7 ; /* Self-heating model */ - if ( !model->HSMHV_powrat_Given ) model->HSMHV_powrat = 1.0 ; /* Self-heating model */ - - if ( !model->HSMHV_tcjbd_Given ) model->HSMHV_tcjbd = 0.0 ; /* Self-heating model */ - if ( !model->HSMHV_tcjbs_Given ) model->HSMHV_tcjbs = 0.0 ; /* Self-heating model */ - if ( !model->HSMHV_tcjbdsw_Given ) model->HSMHV_tcjbdsw = 0.0 ; /* Self-heating model */ - if ( !model->HSMHV_tcjbssw_Given ) model->HSMHV_tcjbssw = 0.0 ; /* Self-heating model */ - if ( !model->HSMHV_tcjbdswg_Given ) model->HSMHV_tcjbdswg = 0.0 ; /* Self-heating model */ - if ( !model->HSMHV_tcjbsswg_Given ) model->HSMHV_tcjbsswg = 0.0 ; /* Self-heating model */ - - /* value reset to switch off NQS for QbdLD: */ - model->HSMHV_dlyov = 0.0 ; /* 1.0e3 ; */ - if ( !model->HSMHV_qdftvd_Given ) model->HSMHV_qdftvd = 1.0 ; - if ( !model->HSMHV_xldld_Given ) model->HSMHV_xldld = 1.0e-6 ; - if ( !model->HSMHV_xwdld_Given ) model->HSMHV_xwdld = model->HSMHV_xwd ; - if ( !model->HSMHV_rdvd_Given ) model->HSMHV_rdvd = 7.0e-2 ; - if ( !model->HSMHV_qovsm_Given ) model->HSMHV_qovsm = 0.2 ; - - if ( !model->HSMHV_rd20_Given ) model->HSMHV_rd20 = 0.0 ; - if ( !model->HSMHV_rd21_Given ) model->HSMHV_rd21 = 1.0 ; - if ( !model->HSMHV_rd22_Given ) model->HSMHV_rd22 = 0.0 ; - if ( !model->HSMHV_rd22d_Given ) model->HSMHV_rd22d = 0.0 ; - if ( !model->HSMHV_rd23_Given ) model->HSMHV_rd23 = 5e-3 ; - if ( !model->HSMHV_rd24_Given ) model->HSMHV_rd24 = 0.0 ; - if ( !model->HSMHV_rd25_Given ) model->HSMHV_rd25 = 0.0 ; - - if ( !model->HSMHV_rdvdl_Given ) model->HSMHV_rdvdl = 0.0 ; - if ( !model->HSMHV_rdvdlp_Given ) model->HSMHV_rdvdlp = 1.0 ; - if ( !model->HSMHV_rdvds_Given ) model->HSMHV_rdvds = 0.0 ; - if ( !model->HSMHV_rdvdsp_Given ) model->HSMHV_rdvdsp = 1.0 ; - if ( !model->HSMHV_rd23l_Given ) model->HSMHV_rd23l = 0.0 ; - if ( !model->HSMHV_rd23lp_Given ) model->HSMHV_rd23lp = 1.0 ; - if ( !model->HSMHV_rd23s_Given ) model->HSMHV_rd23s = 0.0 ; - if ( !model->HSMHV_rd23sp_Given ) model->HSMHV_rd23sp = 1.0 ; - if ( !model->HSMHV_rds_Given ) model->HSMHV_rds = 0.0 ; - if ( !model->HSMHV_rdsp_Given ) model->HSMHV_rdsp = 1.0 ; - if ( !model->HSMHV_rdtemp1_Given ) model->HSMHV_rdtemp1 = 0.0 ; - if ( !model->HSMHV_rdtemp2_Given ) model->HSMHV_rdtemp2 = 0.0 ; - model->HSMHV_rth0r = 0.0 ; /* not used in this version */ - if ( !model->HSMHV_rdvdtemp1_Given) model->HSMHV_rdvdtemp1 = 0.0 ; - if ( !model->HSMHV_rdvdtemp2_Given) model->HSMHV_rdvdtemp2 = 0.0 ; - if ( !model->HSMHV_rth0w_Given ) model->HSMHV_rth0w = 0.0 ; - if ( !model->HSMHV_rth0wp_Given ) model->HSMHV_rth0wp = 1.0 ; - - if ( !model->HSMHV_cvdsover_Given ) model->HSMHV_cvdsover = 0.0 ; - - if ( !model->HSMHV_ninvd_Given ) model->HSMHV_ninvd = 0.0 ; - if ( !model->HSMHV_ninvdw_Given ) model->HSMHV_ninvdw = 0.0 ; - if ( !model->HSMHV_ninvdwp_Given ) model->HSMHV_ninvdwp = 1.0 ; - if ( !model->HSMHV_ninvdt1_Given ) model->HSMHV_ninvdt1 = 0.0 ; - if ( !model->HSMHV_ninvdt2_Given ) model->HSMHV_ninvdt2 = 0.0 ; - if ( !model->HSMHV_vbsmin_Given ) model->HSMHV_vbsmin = -10.5 ; - if ( !model->HSMHV_rdvb_Given ) model->HSMHV_rdvb = 0.0 ; - if ( !model->HSMHV_rth0nf_Given ) model->HSMHV_rth0nf = 0.0 ; - - if ( !model->HSMHV_rthtemp1_Given ) model->HSMHV_rthtemp1 = 0.0 ; - if ( !model->HSMHV_rthtemp2_Given ) model->HSMHV_rthtemp2 = 0.0 ; - if ( !model->HSMHV_prattemp1_Given ) model->HSMHV_prattemp1 = 0.0 ; - if ( !model->HSMHV_prattemp2_Given ) model->HSMHV_prattemp2 = 0.0 ; - - if ( !model->HSMHV_rdvsub_Given ) model->HSMHV_rdvsub = 1.0 ; /* [-] substrate effect */ - if ( !model->HSMHV_rdvdsub_Given ) model->HSMHV_rdvdsub = 0.3 ; /* [-] substrate effect */ - if ( !model->HSMHV_ddrift_Given ) model->HSMHV_ddrift = 1.0e-6 ; /* [m] substrate effect */ - if ( !model->HSMHV_vbisub_Given ) model->HSMHV_vbisub = 0.7 ; /* [V] substrate effect */ - if ( !model->HSMHV_nsubsub_Given ) model->HSMHV_nsubsub = 1.0e15 ; /* [cm^-3] substrate effect */ - if ( !model->HSMHV_shemax_Given ) model->HSMHV_shemax = 500 ; - - /* binning parameters */ - if ( !model->HSMHV_lmin_Given ) model->HSMHV_lmin = 0.0 ; - if ( !model->HSMHV_lmax_Given ) model->HSMHV_lmax = 1.0 ; - if ( !model->HSMHV_wmin_Given ) model->HSMHV_wmin = 0.0 ; - if ( !model->HSMHV_wmax_Given ) model->HSMHV_wmax = 1.0 ; - if ( !model->HSMHV_lbinn_Given ) model->HSMHV_lbinn = 1.0 ; - if ( !model->HSMHV_wbinn_Given ) model->HSMHV_wbinn = 1.0 ; - - /* Length dependence */ - if ( !model->HSMHV_lvmax_Given ) model->HSMHV_lvmax = 0.0 ; - if ( !model->HSMHV_lbgtmp1_Given ) model->HSMHV_lbgtmp1 = 0.0 ; - if ( !model->HSMHV_lbgtmp2_Given ) model->HSMHV_lbgtmp2 = 0.0 ; - if ( !model->HSMHV_leg0_Given ) model->HSMHV_leg0 = 0.0 ; - if ( !model->HSMHV_lvfbover_Given ) model->HSMHV_lvfbover = 0.0 ; - if ( !model->HSMHV_lnover_Given ) model->HSMHV_lnover = 0.0 ; - if ( !model->HSMHV_lnovers_Given ) model->HSMHV_lnovers = 0.0 ; - if ( !model->HSMHV_lwl2_Given ) model->HSMHV_lwl2 = 0.0 ; - if ( !model->HSMHV_lvfbc_Given ) model->HSMHV_lvfbc = 0.0 ; - if ( !model->HSMHV_lnsubc_Given ) model->HSMHV_lnsubc = 0.0 ; - if ( !model->HSMHV_lnsubp_Given ) model->HSMHV_lnsubp = 0.0 ; - if ( !model->HSMHV_lscp1_Given ) model->HSMHV_lscp1 = 0.0 ; - if ( !model->HSMHV_lscp2_Given ) model->HSMHV_lscp2 = 0.0 ; - if ( !model->HSMHV_lscp3_Given ) model->HSMHV_lscp3 = 0.0 ; - if ( !model->HSMHV_lsc1_Given ) model->HSMHV_lsc1 = 0.0 ; - if ( !model->HSMHV_lsc2_Given ) model->HSMHV_lsc2 = 0.0 ; - if ( !model->HSMHV_lsc3_Given ) model->HSMHV_lsc3 = 0.0 ; - if ( !model->HSMHV_lpgd1_Given ) model->HSMHV_lpgd1 = 0.0 ; - if ( !model->HSMHV_lpgd3_Given ) model->HSMHV_lpgd3 = 0.0 ; - if ( !model->HSMHV_lndep_Given ) model->HSMHV_lndep = 0.0 ; - if ( !model->HSMHV_lninv_Given ) model->HSMHV_lninv = 0.0 ; - if ( !model->HSMHV_lmuecb0_Given ) model->HSMHV_lmuecb0 = 0.0 ; - if ( !model->HSMHV_lmuecb1_Given ) model->HSMHV_lmuecb1 = 0.0 ; - if ( !model->HSMHV_lmueph1_Given ) model->HSMHV_lmueph1 = 0.0 ; - if ( !model->HSMHV_lvtmp_Given ) model->HSMHV_lvtmp = 0.0 ; - if ( !model->HSMHV_lwvth0_Given ) model->HSMHV_lwvth0 = 0.0 ; - if ( !model->HSMHV_lmuesr1_Given ) model->HSMHV_lmuesr1 = 0.0 ; - if ( !model->HSMHV_lmuetmp_Given ) model->HSMHV_lmuetmp = 0.0 ; - if ( !model->HSMHV_lsub1_Given ) model->HSMHV_lsub1 = 0.0 ; - if ( !model->HSMHV_lsub2_Given ) model->HSMHV_lsub2 = 0.0 ; - if ( !model->HSMHV_lsvds_Given ) model->HSMHV_lsvds = 0.0 ; - if ( !model->HSMHV_lsvbs_Given ) model->HSMHV_lsvbs = 0.0 ; - if ( !model->HSMHV_lsvgs_Given ) model->HSMHV_lsvgs = 0.0 ; - if ( !model->HSMHV_lfn1_Given ) model->HSMHV_lfn1 = 0.0 ; - if ( !model->HSMHV_lfn2_Given ) model->HSMHV_lfn2 = 0.0 ; - if ( !model->HSMHV_lfn3_Given ) model->HSMHV_lfn3 = 0.0 ; - if ( !model->HSMHV_lfvbs_Given ) model->HSMHV_lfvbs = 0.0 ; - if ( !model->HSMHV_lnsti_Given ) model->HSMHV_lnsti = 0.0 ; - if ( !model->HSMHV_lwsti_Given ) model->HSMHV_lwsti = 0.0 ; - if ( !model->HSMHV_lscsti1_Given ) model->HSMHV_lscsti1 = 0.0 ; - if ( !model->HSMHV_lscsti2_Given ) model->HSMHV_lscsti2 = 0.0 ; - if ( !model->HSMHV_lvthsti_Given ) model->HSMHV_lvthsti = 0.0 ; - if ( !model->HSMHV_lmuesti1_Given ) model->HSMHV_lmuesti1 = 0.0 ; - if ( !model->HSMHV_lmuesti2_Given ) model->HSMHV_lmuesti2 = 0.0 ; - if ( !model->HSMHV_lmuesti3_Given ) model->HSMHV_lmuesti3 = 0.0 ; - if ( !model->HSMHV_lnsubpsti1_Given ) model->HSMHV_lnsubpsti1 = 0.0 ; - if ( !model->HSMHV_lnsubpsti2_Given ) model->HSMHV_lnsubpsti2 = 0.0 ; - if ( !model->HSMHV_lnsubpsti3_Given ) model->HSMHV_lnsubpsti3 = 0.0 ; - if ( !model->HSMHV_lcgso_Given ) model->HSMHV_lcgso = 0.0 ; - if ( !model->HSMHV_lcgdo_Given ) model->HSMHV_lcgdo = 0.0 ; - if ( !model->HSMHV_ljs0_Given ) model->HSMHV_ljs0 = 0.0 ; - if ( !model->HSMHV_ljs0sw_Given ) model->HSMHV_ljs0sw = 0.0 ; - if ( !model->HSMHV_lnj_Given ) model->HSMHV_lnj = 0.0 ; - if ( !model->HSMHV_lcisbk_Given ) model->HSMHV_lcisbk = 0.0 ; - if ( !model->HSMHV_lclm1_Given ) model->HSMHV_lclm1 = 0.0 ; - if ( !model->HSMHV_lclm2_Given ) model->HSMHV_lclm2 = 0.0 ; - if ( !model->HSMHV_lclm3_Given ) model->HSMHV_lclm3 = 0.0 ; - if ( !model->HSMHV_lwfc_Given ) model->HSMHV_lwfc = 0.0 ; - if ( !model->HSMHV_lgidl1_Given ) model->HSMHV_lgidl1 = 0.0 ; - if ( !model->HSMHV_lgidl2_Given ) model->HSMHV_lgidl2 = 0.0 ; - if ( !model->HSMHV_lgleak1_Given ) model->HSMHV_lgleak1 = 0.0 ; - if ( !model->HSMHV_lgleak2_Given ) model->HSMHV_lgleak2 = 0.0 ; - if ( !model->HSMHV_lgleak3_Given ) model->HSMHV_lgleak3 = 0.0 ; - if ( !model->HSMHV_lgleak6_Given ) model->HSMHV_lgleak6 = 0.0 ; - if ( !model->HSMHV_lglksd1_Given ) model->HSMHV_lglksd1 = 0.0 ; - if ( !model->HSMHV_lglksd2_Given ) model->HSMHV_lglksd2 = 0.0 ; - if ( !model->HSMHV_lglkb1_Given ) model->HSMHV_lglkb1 = 0.0 ; - if ( !model->HSMHV_lglkb2_Given ) model->HSMHV_lglkb2 = 0.0 ; - if ( !model->HSMHV_lnftrp_Given ) model->HSMHV_lnftrp = 0.0 ; - if ( !model->HSMHV_lnfalp_Given ) model->HSMHV_lnfalp = 0.0 ; - if ( !model->HSMHV_lpthrou_Given ) model->HSMHV_lpthrou = 0.0 ; - if ( !model->HSMHV_lvdiffj_Given ) model->HSMHV_lvdiffj = 0.0 ; - if ( !model->HSMHV_libpc1_Given ) model->HSMHV_libpc1 = 0.0 ; - if ( !model->HSMHV_libpc2_Given ) model->HSMHV_libpc2 = 0.0 ; - if ( !model->HSMHV_lcgbo_Given ) model->HSMHV_lcgbo = 0.0 ; - if ( !model->HSMHV_lcvdsover_Given ) model->HSMHV_lcvdsover = 0.0 ; - if ( !model->HSMHV_lfalph_Given ) model->HSMHV_lfalph = 0.0 ; - if ( !model->HSMHV_lnpext_Given ) model->HSMHV_lnpext = 0.0 ; - if ( !model->HSMHV_lpowrat_Given ) model->HSMHV_lpowrat = 0.0 ; - if ( !model->HSMHV_lrd_Given ) model->HSMHV_lrd = 0.0 ; - if ( !model->HSMHV_lrd22_Given ) model->HSMHV_lrd22 = 0.0 ; - if ( !model->HSMHV_lrd23_Given ) model->HSMHV_lrd23 = 0.0 ; - if ( !model->HSMHV_lrd24_Given ) model->HSMHV_lrd24 = 0.0 ; - if ( !model->HSMHV_lrdict1_Given ) model->HSMHV_lrdict1 = 0.0 ; - if ( !model->HSMHV_lrdov13_Given ) model->HSMHV_lrdov13 = 0.0 ; - if ( !model->HSMHV_lrdslp1_Given ) model->HSMHV_lrdslp1 = 0.0 ; - if ( !model->HSMHV_lrdvb_Given ) model->HSMHV_lrdvb = 0.0 ; - if ( !model->HSMHV_lrdvd_Given ) model->HSMHV_lrdvd = 0.0 ; - if ( !model->HSMHV_lrdvg11_Given ) model->HSMHV_lrdvg11 = 0.0 ; - if ( !model->HSMHV_lrs_Given ) model->HSMHV_lrs = 0.0 ; - if ( !model->HSMHV_lrth0_Given ) model->HSMHV_lrth0 = 0.0 ; - if ( !model->HSMHV_lvover_Given ) model->HSMHV_lvover = 0.0 ; - - /* Width dependence */ - if ( !model->HSMHV_wvmax_Given ) model->HSMHV_wvmax = 0.0 ; - if ( !model->HSMHV_wbgtmp1_Given ) model->HSMHV_wbgtmp1 = 0.0 ; - if ( !model->HSMHV_wbgtmp2_Given ) model->HSMHV_wbgtmp2 = 0.0 ; - if ( !model->HSMHV_weg0_Given ) model->HSMHV_weg0 = 0.0 ; - if ( !model->HSMHV_wvfbover_Given ) model->HSMHV_wvfbover = 0.0 ; - if ( !model->HSMHV_wnover_Given ) model->HSMHV_wnover = 0.0 ; - if ( !model->HSMHV_wnovers_Given ) model->HSMHV_wnovers = 0.0 ; - if ( !model->HSMHV_wwl2_Given ) model->HSMHV_wwl2 = 0.0 ; - if ( !model->HSMHV_wvfbc_Given ) model->HSMHV_wvfbc = 0.0 ; - if ( !model->HSMHV_wnsubc_Given ) model->HSMHV_wnsubc = 0.0 ; - if ( !model->HSMHV_wnsubp_Given ) model->HSMHV_wnsubp = 0.0 ; - if ( !model->HSMHV_wscp1_Given ) model->HSMHV_wscp1 = 0.0 ; - if ( !model->HSMHV_wscp2_Given ) model->HSMHV_wscp2 = 0.0 ; - if ( !model->HSMHV_wscp3_Given ) model->HSMHV_wscp3 = 0.0 ; - if ( !model->HSMHV_wsc1_Given ) model->HSMHV_wsc1 = 0.0 ; - if ( !model->HSMHV_wsc2_Given ) model->HSMHV_wsc2 = 0.0 ; - if ( !model->HSMHV_wsc3_Given ) model->HSMHV_wsc3 = 0.0 ; - if ( !model->HSMHV_wpgd1_Given ) model->HSMHV_wpgd1 = 0.0 ; - if ( !model->HSMHV_wpgd3_Given ) model->HSMHV_wpgd3 = 0.0 ; - if ( !model->HSMHV_wndep_Given ) model->HSMHV_wndep = 0.0 ; - if ( !model->HSMHV_wninv_Given ) model->HSMHV_wninv = 0.0 ; - if ( !model->HSMHV_wmuecb0_Given ) model->HSMHV_wmuecb0 = 0.0 ; - if ( !model->HSMHV_wmuecb1_Given ) model->HSMHV_wmuecb1 = 0.0 ; - if ( !model->HSMHV_wmueph1_Given ) model->HSMHV_wmueph1 = 0.0 ; - if ( !model->HSMHV_wvtmp_Given ) model->HSMHV_wvtmp = 0.0 ; - if ( !model->HSMHV_wwvth0_Given ) model->HSMHV_wwvth0 = 0.0 ; - if ( !model->HSMHV_wmuesr1_Given ) model->HSMHV_wmuesr1 = 0.0 ; - if ( !model->HSMHV_wmuetmp_Given ) model->HSMHV_wmuetmp = 0.0 ; - if ( !model->HSMHV_wsub1_Given ) model->HSMHV_wsub1 = 0.0 ; - if ( !model->HSMHV_wsub2_Given ) model->HSMHV_wsub2 = 0.0 ; - if ( !model->HSMHV_wsvds_Given ) model->HSMHV_wsvds = 0.0 ; - if ( !model->HSMHV_wsvbs_Given ) model->HSMHV_wsvbs = 0.0 ; - if ( !model->HSMHV_wsvgs_Given ) model->HSMHV_wsvgs = 0.0 ; - if ( !model->HSMHV_wfn1_Given ) model->HSMHV_wfn1 = 0.0 ; - if ( !model->HSMHV_wfn2_Given ) model->HSMHV_wfn2 = 0.0 ; - if ( !model->HSMHV_wfn3_Given ) model->HSMHV_wfn3 = 0.0 ; - if ( !model->HSMHV_wfvbs_Given ) model->HSMHV_wfvbs = 0.0 ; - if ( !model->HSMHV_wnsti_Given ) model->HSMHV_wnsti = 0.0 ; - if ( !model->HSMHV_wwsti_Given ) model->HSMHV_wwsti = 0.0 ; - if ( !model->HSMHV_wscsti1_Given ) model->HSMHV_wscsti1 = 0.0 ; - if ( !model->HSMHV_wscsti2_Given ) model->HSMHV_wscsti2 = 0.0 ; - if ( !model->HSMHV_wvthsti_Given ) model->HSMHV_wvthsti = 0.0 ; - if ( !model->HSMHV_wmuesti1_Given ) model->HSMHV_wmuesti1 = 0.0 ; - if ( !model->HSMHV_wmuesti2_Given ) model->HSMHV_wmuesti2 = 0.0 ; - if ( !model->HSMHV_wmuesti3_Given ) model->HSMHV_wmuesti3 = 0.0 ; - if ( !model->HSMHV_wnsubpsti1_Given ) model->HSMHV_wnsubpsti1 = 0.0 ; - if ( !model->HSMHV_wnsubpsti2_Given ) model->HSMHV_wnsubpsti2 = 0.0 ; - if ( !model->HSMHV_wnsubpsti3_Given ) model->HSMHV_wnsubpsti3 = 0.0 ; - if ( !model->HSMHV_wcgso_Given ) model->HSMHV_wcgso = 0.0 ; - if ( !model->HSMHV_wcgdo_Given ) model->HSMHV_wcgdo = 0.0 ; - if ( !model->HSMHV_wjs0_Given ) model->HSMHV_wjs0 = 0.0 ; - if ( !model->HSMHV_wjs0sw_Given ) model->HSMHV_wjs0sw = 0.0 ; - if ( !model->HSMHV_wnj_Given ) model->HSMHV_wnj = 0.0 ; - if ( !model->HSMHV_wcisbk_Given ) model->HSMHV_wcisbk = 0.0 ; - if ( !model->HSMHV_wclm1_Given ) model->HSMHV_wclm1 = 0.0 ; - if ( !model->HSMHV_wclm2_Given ) model->HSMHV_wclm2 = 0.0 ; - if ( !model->HSMHV_wclm3_Given ) model->HSMHV_wclm3 = 0.0 ; - if ( !model->HSMHV_wwfc_Given ) model->HSMHV_wwfc = 0.0 ; - if ( !model->HSMHV_wgidl1_Given ) model->HSMHV_wgidl1 = 0.0 ; - if ( !model->HSMHV_wgidl2_Given ) model->HSMHV_wgidl2 = 0.0 ; - if ( !model->HSMHV_wgleak1_Given ) model->HSMHV_wgleak1 = 0.0 ; - if ( !model->HSMHV_wgleak2_Given ) model->HSMHV_wgleak2 = 0.0 ; - if ( !model->HSMHV_wgleak3_Given ) model->HSMHV_wgleak3 = 0.0 ; - if ( !model->HSMHV_wgleak6_Given ) model->HSMHV_wgleak6 = 0.0 ; - if ( !model->HSMHV_wglksd1_Given ) model->HSMHV_wglksd1 = 0.0 ; - if ( !model->HSMHV_wglksd2_Given ) model->HSMHV_wglksd2 = 0.0 ; - if ( !model->HSMHV_wglkb1_Given ) model->HSMHV_wglkb1 = 0.0 ; - if ( !model->HSMHV_wglkb2_Given ) model->HSMHV_wglkb2 = 0.0 ; - if ( !model->HSMHV_wnftrp_Given ) model->HSMHV_wnftrp = 0.0 ; - if ( !model->HSMHV_wnfalp_Given ) model->HSMHV_wnfalp = 0.0 ; - if ( !model->HSMHV_wpthrou_Given ) model->HSMHV_wpthrou = 0.0 ; - if ( !model->HSMHV_wvdiffj_Given ) model->HSMHV_wvdiffj = 0.0 ; - if ( !model->HSMHV_wibpc1_Given ) model->HSMHV_wibpc1 = 0.0 ; - if ( !model->HSMHV_wibpc2_Given ) model->HSMHV_wibpc2 = 0.0 ; - if ( !model->HSMHV_wcgbo_Given ) model->HSMHV_wcgbo = 0.0 ; - if ( !model->HSMHV_wcvdsover_Given ) model->HSMHV_wcvdsover = 0.0 ; - if ( !model->HSMHV_wfalph_Given ) model->HSMHV_wfalph = 0.0 ; - if ( !model->HSMHV_wnpext_Given ) model->HSMHV_wnpext = 0.0 ; - if ( !model->HSMHV_wpowrat_Given ) model->HSMHV_wpowrat = 0.0 ; - if ( !model->HSMHV_wrd_Given ) model->HSMHV_wrd = 0.0 ; - if ( !model->HSMHV_wrd22_Given ) model->HSMHV_wrd22 = 0.0 ; - if ( !model->HSMHV_wrd23_Given ) model->HSMHV_wrd23 = 0.0 ; - if ( !model->HSMHV_wrd24_Given ) model->HSMHV_wrd24 = 0.0 ; - if ( !model->HSMHV_wrdict1_Given ) model->HSMHV_wrdict1 = 0.0 ; - if ( !model->HSMHV_wrdov13_Given ) model->HSMHV_wrdov13 = 0.0 ; - if ( !model->HSMHV_wrdslp1_Given ) model->HSMHV_wrdslp1 = 0.0 ; - if ( !model->HSMHV_wrdvb_Given ) model->HSMHV_wrdvb = 0.0 ; - if ( !model->HSMHV_wrdvd_Given ) model->HSMHV_wrdvd = 0.0 ; - if ( !model->HSMHV_wrdvg11_Given ) model->HSMHV_wrdvg11 = 0.0 ; - if ( !model->HSMHV_wrs_Given ) model->HSMHV_wrs = 0.0 ; - if ( !model->HSMHV_wrth0_Given ) model->HSMHV_wrth0 = 0.0 ; - if ( !model->HSMHV_wvover_Given ) model->HSMHV_wvover = 0.0 ; - - /* Cross-term dependence */ - if ( !model->HSMHV_pvmax_Given ) model->HSMHV_pvmax = 0.0 ; - if ( !model->HSMHV_pbgtmp1_Given ) model->HSMHV_pbgtmp1 = 0.0 ; - if ( !model->HSMHV_pbgtmp2_Given ) model->HSMHV_pbgtmp2 = 0.0 ; - if ( !model->HSMHV_peg0_Given ) model->HSMHV_peg0 = 0.0 ; - if ( !model->HSMHV_pvfbover_Given ) model->HSMHV_pvfbover = 0.0 ; - if ( !model->HSMHV_pnover_Given ) model->HSMHV_pnover = 0.0 ; - if ( !model->HSMHV_pnovers_Given ) model->HSMHV_pnovers = 0.0 ; - if ( !model->HSMHV_pwl2_Given ) model->HSMHV_pwl2 = 0.0 ; - if ( !model->HSMHV_pvfbc_Given ) model->HSMHV_pvfbc = 0.0 ; - if ( !model->HSMHV_pnsubc_Given ) model->HSMHV_pnsubc = 0.0 ; - if ( !model->HSMHV_pnsubp_Given ) model->HSMHV_pnsubp = 0.0 ; - if ( !model->HSMHV_pscp1_Given ) model->HSMHV_pscp1 = 0.0 ; - if ( !model->HSMHV_pscp2_Given ) model->HSMHV_pscp2 = 0.0 ; - if ( !model->HSMHV_pscp3_Given ) model->HSMHV_pscp3 = 0.0 ; - if ( !model->HSMHV_psc1_Given ) model->HSMHV_psc1 = 0.0 ; - if ( !model->HSMHV_psc2_Given ) model->HSMHV_psc2 = 0.0 ; - if ( !model->HSMHV_psc3_Given ) model->HSMHV_psc3 = 0.0 ; - if ( !model->HSMHV_ppgd1_Given ) model->HSMHV_ppgd1 = 0.0 ; - if ( !model->HSMHV_ppgd3_Given ) model->HSMHV_ppgd3 = 0.0 ; - if ( !model->HSMHV_pndep_Given ) model->HSMHV_pndep = 0.0 ; - if ( !model->HSMHV_pninv_Given ) model->HSMHV_pninv = 0.0 ; - if ( !model->HSMHV_pmuecb0_Given ) model->HSMHV_pmuecb0 = 0.0 ; - if ( !model->HSMHV_pmuecb1_Given ) model->HSMHV_pmuecb1 = 0.0 ; - if ( !model->HSMHV_pmueph1_Given ) model->HSMHV_pmueph1 = 0.0 ; - if ( !model->HSMHV_pvtmp_Given ) model->HSMHV_pvtmp = 0.0 ; - if ( !model->HSMHV_pwvth0_Given ) model->HSMHV_pwvth0 = 0.0 ; - if ( !model->HSMHV_pmuesr1_Given ) model->HSMHV_pmuesr1 = 0.0 ; - if ( !model->HSMHV_pmuetmp_Given ) model->HSMHV_pmuetmp = 0.0 ; - if ( !model->HSMHV_psub1_Given ) model->HSMHV_psub1 = 0.0 ; - if ( !model->HSMHV_psub2_Given ) model->HSMHV_psub2 = 0.0 ; - if ( !model->HSMHV_psvds_Given ) model->HSMHV_psvds = 0.0 ; - if ( !model->HSMHV_psvbs_Given ) model->HSMHV_psvbs = 0.0 ; - if ( !model->HSMHV_psvgs_Given ) model->HSMHV_psvgs = 0.0 ; - if ( !model->HSMHV_pfn1_Given ) model->HSMHV_pfn1 = 0.0 ; - if ( !model->HSMHV_pfn2_Given ) model->HSMHV_pfn2 = 0.0 ; - if ( !model->HSMHV_pfn3_Given ) model->HSMHV_pfn3 = 0.0 ; - if ( !model->HSMHV_pfvbs_Given ) model->HSMHV_pfvbs = 0.0 ; - if ( !model->HSMHV_pnsti_Given ) model->HSMHV_pnsti = 0.0 ; - if ( !model->HSMHV_pwsti_Given ) model->HSMHV_pwsti = 0.0 ; - if ( !model->HSMHV_pscsti1_Given ) model->HSMHV_pscsti1 = 0.0 ; - if ( !model->HSMHV_pscsti2_Given ) model->HSMHV_pscsti2 = 0.0 ; - if ( !model->HSMHV_pvthsti_Given ) model->HSMHV_pvthsti = 0.0 ; - if ( !model->HSMHV_pmuesti1_Given ) model->HSMHV_pmuesti1 = 0.0 ; - if ( !model->HSMHV_pmuesti2_Given ) model->HSMHV_pmuesti2 = 0.0 ; - if ( !model->HSMHV_pmuesti3_Given ) model->HSMHV_pmuesti3 = 0.0 ; - if ( !model->HSMHV_pnsubpsti1_Given ) model->HSMHV_pnsubpsti1 = 0.0 ; - if ( !model->HSMHV_pnsubpsti2_Given ) model->HSMHV_pnsubpsti2 = 0.0 ; - if ( !model->HSMHV_pnsubpsti3_Given ) model->HSMHV_pnsubpsti3 = 0.0 ; - if ( !model->HSMHV_pcgso_Given ) model->HSMHV_pcgso = 0.0 ; - if ( !model->HSMHV_pcgdo_Given ) model->HSMHV_pcgdo = 0.0 ; - if ( !model->HSMHV_pjs0_Given ) model->HSMHV_pjs0 = 0.0 ; - if ( !model->HSMHV_pjs0sw_Given ) model->HSMHV_pjs0sw = 0.0 ; - if ( !model->HSMHV_pnj_Given ) model->HSMHV_pnj = 0.0 ; - if ( !model->HSMHV_pcisbk_Given ) model->HSMHV_pcisbk = 0.0 ; - if ( !model->HSMHV_pclm1_Given ) model->HSMHV_pclm1 = 0.0 ; - if ( !model->HSMHV_pclm2_Given ) model->HSMHV_pclm2 = 0.0 ; - if ( !model->HSMHV_pclm3_Given ) model->HSMHV_pclm3 = 0.0 ; - if ( !model->HSMHV_pwfc_Given ) model->HSMHV_pwfc = 0.0 ; - if ( !model->HSMHV_pgidl1_Given ) model->HSMHV_pgidl1 = 0.0 ; - if ( !model->HSMHV_pgidl2_Given ) model->HSMHV_pgidl2 = 0.0 ; - if ( !model->HSMHV_pgleak1_Given ) model->HSMHV_pgleak1 = 0.0 ; - if ( !model->HSMHV_pgleak2_Given ) model->HSMHV_pgleak2 = 0.0 ; - if ( !model->HSMHV_pgleak3_Given ) model->HSMHV_pgleak3 = 0.0 ; - if ( !model->HSMHV_pgleak6_Given ) model->HSMHV_pgleak6 = 0.0 ; - if ( !model->HSMHV_pglksd1_Given ) model->HSMHV_pglksd1 = 0.0 ; - if ( !model->HSMHV_pglksd2_Given ) model->HSMHV_pglksd2 = 0.0 ; - if ( !model->HSMHV_pglkb1_Given ) model->HSMHV_pglkb1 = 0.0 ; - if ( !model->HSMHV_pglkb2_Given ) model->HSMHV_pglkb2 = 0.0 ; - if ( !model->HSMHV_pnftrp_Given ) model->HSMHV_pnftrp = 0.0 ; - if ( !model->HSMHV_pnfalp_Given ) model->HSMHV_pnfalp = 0.0 ; - if ( !model->HSMHV_ppthrou_Given ) model->HSMHV_ppthrou = 0.0 ; - if ( !model->HSMHV_pvdiffj_Given ) model->HSMHV_pvdiffj = 0.0 ; - if ( !model->HSMHV_pibpc1_Given ) model->HSMHV_pibpc1 = 0.0 ; - if ( !model->HSMHV_pibpc2_Given ) model->HSMHV_pibpc2 = 0.0 ; - if ( !model->HSMHV_pcgbo_Given ) model->HSMHV_pcgbo = 0.0 ; - if ( !model->HSMHV_pcvdsover_Given ) model->HSMHV_pcvdsover = 0.0 ; - if ( !model->HSMHV_pfalph_Given ) model->HSMHV_pfalph = 0.0 ; - if ( !model->HSMHV_pnpext_Given ) model->HSMHV_pnpext = 0.0 ; - if ( !model->HSMHV_ppowrat_Given ) model->HSMHV_ppowrat = 0.0 ; - if ( !model->HSMHV_prd_Given ) model->HSMHV_prd = 0.0 ; - if ( !model->HSMHV_prd22_Given ) model->HSMHV_prd22 = 0.0 ; - if ( !model->HSMHV_prd23_Given ) model->HSMHV_prd23 = 0.0 ; - if ( !model->HSMHV_prd24_Given ) model->HSMHV_prd24 = 0.0 ; - if ( !model->HSMHV_prdict1_Given ) model->HSMHV_prdict1 = 0.0 ; - if ( !model->HSMHV_prdov13_Given ) model->HSMHV_prdov13 = 0.0 ; - if ( !model->HSMHV_prdslp1_Given ) model->HSMHV_prdslp1 = 0.0 ; - if ( !model->HSMHV_prdvb_Given ) model->HSMHV_prdvb = 0.0 ; - if ( !model->HSMHV_prdvd_Given ) model->HSMHV_prdvd = 0.0 ; - if ( !model->HSMHV_prdvg11_Given ) model->HSMHV_prdvg11 = 0.0 ; - if ( !model->HSMHV_prs_Given ) model->HSMHV_prs = 0.0 ; - if ( !model->HSMHV_prth0_Given ) model->HSMHV_prth0 = 0.0 ; - if ( !model->HSMHV_pvover_Given ) model->HSMHV_pvover = 0.0 ; - - if ( model->HSMHV_rd26_Given ) model->HSMHV_qovsm = model->HSMHV_rd26 ; - if ( model->HSMHV_ldrift_Given ) model->HSMHV_ldrift2 = model->HSMHV_ldrift ; - - if (!model->HSMHVvgsMaxGiven) model->HSMHVvgsMax = 1e99; - if (!model->HSMHVvgdMaxGiven) model->HSMHVvgdMax = 1e99; - if (!model->HSMHVvgbMaxGiven) model->HSMHVvgbMax = 1e99; - if (!model->HSMHVvdsMaxGiven) model->HSMHVvdsMax = 1e99; - if (!model->HSMHVvbsMaxGiven) model->HSMHVvbsMax = 1e99; - if (!model->HSMHVvbdMaxGiven) model->HSMHVvbdMax = 1e99; - if (!model->HSMHVvgsrMaxGiven) model->HSMHVvgsrMax = 1e99; - if (!model->HSMHVvgdrMaxGiven) model->HSMHVvgdrMax = 1e99; - if (!model->HSMHVvgbrMaxGiven) model->HSMHVvgbrMax = 1e99; - if (!model->HSMHVvbsrMaxGiven) model->HSMHVvbsrMax = 1e99; - if (!model->HSMHVvbdrMaxGiven) model->HSMHVvbdrMax = 1e99; - - /* For Symmetrical Device */ - if ( model->HSMHV_cosym ) { - if(!model->HSMHV_rs_Given ) - { model->HSMHV_rs = model->HSMHV_rd ; } - if(!model->HSMHV_coovlps_Given ) - { model->HSMHV_coovlps = model->HSMHV_coovlp ; } - if(!model->HSMHV_novers_Given ) - { model->HSMHV_novers = model->HSMHV_nover ; } -/* if(!model->HSMHV_xld_Given ) */ -/* { model->HSMHV_xld = model->HSMHV_xldld ; } */ - if(!model->HSMHV_lover_Given ) - { model->HSMHV_lover = model->HSMHV_loverld ; } - if(!model->HSMHV_lovers_Given ) - { model->HSMHV_lovers = model->HSMHV_loverld ; } - if(!model->HSMHV_ldrift1s_Given ) - { model->HSMHV_ldrift1s = model->HSMHV_ldrift1 ; } - if(!model->HSMHV_ldrift2s_Given ) - { model->HSMHV_ldrift2s = model->HSMHV_ldrift2 ; } - if(!model->HSMHV_cgso_Given ) { model->HSMHV_cgso = model->HSMHV_cgdo ; - model->HSMHV_cgso_Given = model->HSMHV_cgdo_Given ; } - } - - if ( model->HSMHV_xqy > 0.0 && model->HSMHV_xqy < 1.0e-9 ) { - fprintf ( stderr , "*** warning(HiSIMHV): XQY (%e[m]) is too small -> reset to 1nm.\n" , model->HSMHV_xqy ) ; - model->HSMHV_xqy = 1e-9 ; - } - - modelMKS = &model->modelMKS ; - - /* loop through all the instances of the model */ - for ( here = HSMHVinstances(model);here != NULL ; - here = HSMHVnextInstance(here)) { - /* allocate a chunk of the state vector */ - here->HSMHVstates = *states; - if (model->HSMHV_conqs) - *states += HSMHVnumStatesNqs; - else - *states += HSMHVnumStates; - - hereMKS = &here->hereMKS ; - /* perform the device parameter defaulting */ - if ( !here->HSMHV_coselfheat_Given ) here->HSMHV_coselfheat = model->HSMHV_coselfheat ; - if ( !here->HSMHV_cosubnode_Given ) here->HSMHV_cosubnode = model->HSMHV_cosubnode ; - if ( !here->HSMHV_l_Given ) here->HSMHV_l = 2.0e-6 ; - if ( !here->HSMHV_w_Given ) here->HSMHV_w = 5.0e-6 ; - if ( !here->HSMHV_ad_Given ) here->HSMHV_ad = 0.0 ; - if ( !here->HSMHV_as_Given ) here->HSMHV_as = 0.0 ; - if ( !here->HSMHV_pd_Given ) here->HSMHV_pd = 0.0 ; - if ( !here->HSMHV_ps_Given ) here->HSMHV_ps = 0.0 ; - if ( !here->HSMHV_nrd_Given ) here->HSMHV_nrd = 1.0 ; - if ( !here->HSMHV_nrs_Given ) here->HSMHV_nrs = 1.0 ; - if ( !here->HSMHV_ngcon_Given ) here->HSMHV_ngcon = 1.0 ; - if ( !here->HSMHV_xgw_Given ) here->HSMHV_xgw = 0e0 ; - if ( !here->HSMHV_xgl_Given ) here->HSMHV_xgl = 0e0 ; - if ( !here->HSMHV_nf_Given ) here->HSMHV_nf = 1.0 ; - if ( !here->HSMHV_sa_Given ) here->HSMHV_sa = 0 ; - if ( !here->HSMHV_sb_Given ) here->HSMHV_sb = 0 ; - if ( !here->HSMHV_sd_Given ) here->HSMHV_sd = 0 ; - if ( !here->HSMHV_dtemp_Given ) here->HSMHV_dtemp = 0.0 ; - - if ( !here->HSMHV_icVBS_Given ) here->HSMHV_icVBS = 0.0; - if ( !here->HSMHV_icVDS_Given ) here->HSMHV_icVDS = 0.0; - if ( !here->HSMHV_icVGS_Given ) here->HSMHV_icVGS = 0.0; - - if ( !here->HSMHV_corbnet_Given ) - here->HSMHV_corbnet = model->HSMHV_corbnet ; - else if ( here->HSMHV_corbnet != 0 && here->HSMHV_corbnet != 1 ) { - here->HSMHV_corbnet = model->HSMHV_corbnet ; - printf("warning(HiSIMHV): CORBNET has been set to its default value: %d.\n", here->HSMHV_corbnet); - } - if ( !here->HSMHV_rbdb_Given) here->HSMHV_rbdb = model->HSMHV_rbdb; /* not used in this version */ - if ( !here->HSMHV_rbsb_Given) here->HSMHV_rbsb = model->HSMHV_rbsb; /* not used in this version */ - if ( !here->HSMHV_rbpb_Given) here->HSMHV_rbpb = model->HSMHV_rbpb; - if ( !here->HSMHV_rbps_Given) here->HSMHV_rbps = model->HSMHV_rbps; - if ( !here->HSMHV_rbpd_Given) here->HSMHV_rbpd = model->HSMHV_rbpd; - - if ( !here->HSMHV_corg_Given ) - here->HSMHV_corg = model->HSMHV_corg ; - else if ( here->HSMHV_corg != 0 && here->HSMHV_corg != 1 ) { - here->HSMHV_corg = model->HSMHV_corg ; - printf("warning(HiSIMHV): CORG has been set to its default value: %d.\n", here->HSMHV_corg); - } - - if ( !here->HSMHV_m_Given ) here->HSMHV_m = 1.0 ; - if ( !here->HSMHV_subld1_Given ) here->HSMHV_subld1 = model->HSMHV_subld1 ; - if ( !here->HSMHV_subld2_Given ) here->HSMHV_subld2 = model->HSMHV_subld2 ; - if ( !here->HSMHV_lovers_Given ) here->HSMHV_lovers = model->HSMHV_lovers ; - if ( here->HSMHV_lover_Given ) here->HSMHV_lovers = here->HSMHV_lover ; - if ( !here->HSMHV_loverld_Given ) here->HSMHV_loverld = model->HSMHV_loverld ; - if ( !here->HSMHV_ldrift1_Given ) here->HSMHV_ldrift1 = model->HSMHV_ldrift1 ; - if ( !here->HSMHV_ldrift2_Given ) here->HSMHV_ldrift2 = model->HSMHV_ldrift2 ; - if ( !here->HSMHV_ldrift1s_Given ) here->HSMHV_ldrift1s = model->HSMHV_ldrift1s ; - if ( !here->HSMHV_ldrift2s_Given ) here->HSMHV_ldrift2s = model->HSMHV_ldrift2s ; - - if ( model->HSMHV_cosym ) { - if ( !here->HSMHV_lovers_Given && !model->HSMHV_lovers_Given ) here->HSMHV_lovers = here->HSMHV_loverld ; - here->HSMHV_lover = here->HSMHV_lovers ; - if ( !here->HSMHV_ldrift1s_Given && !model->HSMHV_ldrift1s_Given ) here->HSMHV_ldrift1s = here->HSMHV_ldrift1 ; - if ( !here->HSMHV_ldrift2s_Given && !model->HSMHV_ldrift2s_Given ) here->HSMHV_ldrift2s = here->HSMHV_ldrift2 ; - } - - - - - /* process drain series resistance */ - /* rough check if Rd != 0 * **** don't forget to change if Rd processing is changed *******/ - T2 = ( here->HSMHV_ldrift1 * model->HSMHV_rdslp1 * C_m2um + model->HSMHV_rdict1 ) - * ( here->HSMHV_ldrift2 * model->HSMHV_rdslp2 * C_m2um + model->HSMHV_rdict2 ) ; - Rd = model->HSMHV_rsh * here->HSMHV_nrd * here->HSMHV_nf + (model->HSMHV_rd + model->HSMHV_rdvd) * T2 ; - if ( (model->HSMHV_corsrd == 1 || model->HSMHV_corsrd == 3) - && Rd > 0.0 ) { - if(here->HSMHVdNodePrime <= 0) { - model->HSMHV_rd = ( model->HSMHV_rd == 0.0 ) ? 1e-50 : model->HSMHV_rd ; - error = CKTmkVolt(ckt, &tmp, here->HSMHVname, "drain"); - if (error) return(error); - here->HSMHVdNodePrime = tmp->number; - } - } else { - here->HSMHVdNodePrime = here->HSMHVdNode; - } - here->HSMHVdrainConductance = 0.0 ; /* initialized for hsmhvnoi.c */ - - /* process source series resistance */ - /* rough check if Rs != 0 * ***** don't forget to change if Rs processing is changed *******/ - T2 = ( here->HSMHV_ldrift1s * model->HSMHV_rdslp1 * C_m2um + model->HSMHV_rdict1 ) - * ( here->HSMHV_ldrift2s * model->HSMHV_rdslp2 * C_m2um + model->HSMHV_rdict2 ) ; - Rs = model->HSMHV_rsh * here->HSMHV_nrs * here->HSMHV_nf + model->HSMHV_rs * T2 ; - if ( (model->HSMHV_corsrd == 1 || model->HSMHV_corsrd == 3) - && Rs > 0.0 ) { - if(here->HSMHVsNodePrime == 0) { - error = CKTmkVolt(ckt, &tmp, here->HSMHVname, "source"); - if (error) return(error); - here->HSMHVsNodePrime = tmp->number; - } - } else { - here->HSMHVsNodePrime = here->HSMHVsNode; - } - here->HSMHVsourceConductance = 0.0 ; /* initialized for hsmhvnoi.c */ - - /* process gate resistance */ - if ( (here->HSMHV_corg == 1 && model->HSMHV_rshg > 0.0) ) { - if(here->HSMHVgNodePrime == 0) { - error = CKTmkVolt(ckt, &tmp, here->HSMHVname, "gate"); - if (error) return(error); - here->HSMHVgNodePrime = tmp->number; - } - } else { - here->HSMHVgNodePrime = here->HSMHVgNode; - } - - /* internal body nodes for body resistance model */ - if ( here->HSMHV_corbnet == 1 ) { - if (here->HSMHVdbNode == 0) { - error = CKTmkVolt(ckt, &tmp, here->HSMHVname, "dbody"); - if (error) return(error); - here->HSMHVdbNode = tmp->number; - } - if (here->HSMHVbNodePrime == 0) { - error = CKTmkVolt(ckt, &tmp,here->HSMHVname, "body"); - if (error) return(error); - here->HSMHVbNodePrime = tmp->number; - } - if (here->HSMHVsbNode == 0) { - error = CKTmkVolt(ckt, &tmp, here->HSMHVname,"sbody"); - if (error) return(error); - here->HSMHVsbNode = tmp->number; - } - } else { - here->HSMHVdbNode = here->HSMHVbNodePrime = here->HSMHVsbNode = here->HSMHVbNode; - } - - here->HSMHVtempNode = here->HSMHVtempNodeExt; - here->HSMHVsubNode = here->HSMHVsubNodeExt; - - if ( here->HSMHV_cosubnode == 0 && here->HSMHVsubNode >= 0 ) { - if ( here->HSMHVtempNode >= 0 ) { - /* FATAL Error when 6th node is defined and COSUBNODE=0 */ - SPfrontEnd->IFerrorf - ( - ERR_FATAL, - "HiSIM_HV: MOSFET(%s) MODEL(%s): 6th node is defined and COSUBNODE=0", - here->HSMHVname, model->HSMHVmodName - ); - return (E_BADPARM); - } else { - - /* 5th node is switched to tempNode, if COSUBNODE=0 and 5 external nodes are assigned. */ - if ( here->HSMHVsubNode > 0 ) { - here->HSMHVtempNode = here->HSMHVsubNode ; - here->HSMHVsubNode = -1 ; - } - } - } - - /* self heating*/ - if ( here->HSMHV_coselfheat > 0 && here->HSMHVtempNode <= 0 ){ - error = CKTmkVolt(ckt, &tmp, here->HSMHVname,"temp"); - if(error) return(error); - here->HSMHVtempNode = tmp->number; - } - if ( here->HSMHV_coselfheat <= 0 ) here->HSMHVtempNode = -1; - - /* flat handling of NQS */ - if ( model->HSMHV_conqs ){ - error = CKTmkVolt(ckt, &tmp, here->HSMHVname,"qi_nqs"); - if(error) return(error); - here->HSMHVqiNode = tmp->number; - error = CKTmkVolt(ckt, &tmp, here->HSMHVname,"qb_nqs"); - if(error) return(error); - here->HSMHVqbNode = tmp->number; - } - - - /* set Sparse Matrix Pointers */ - - /* macro to make elements with built in test for out of memory */ -#define TSTALLOC(ptr,first,second) \ -do { if((here->ptr = SMPmakeElt(matrix,here->first,here->second))==NULL){\ - return(E_NOMEM);\ -} } while(0) - - TSTALLOC(HSMHVDPbpPtr, HSMHVdNodePrime, HSMHVbNodePrime); - TSTALLOC(HSMHVSPbpPtr, HSMHVsNodePrime, HSMHVbNodePrime); - TSTALLOC(HSMHVGPbpPtr, HSMHVgNodePrime, HSMHVbNodePrime); - - TSTALLOC(HSMHVBPdPtr, HSMHVbNodePrime, HSMHVdNode); - TSTALLOC(HSMHVBPsPtr, HSMHVbNodePrime, HSMHVsNode); - TSTALLOC(HSMHVBPdpPtr, HSMHVbNodePrime, HSMHVdNodePrime); - TSTALLOC(HSMHVBPspPtr, HSMHVbNodePrime, HSMHVsNodePrime); - TSTALLOC(HSMHVBPgpPtr, HSMHVbNodePrime, HSMHVgNodePrime); - TSTALLOC(HSMHVBPbpPtr, HSMHVbNodePrime, HSMHVbNodePrime); - - TSTALLOC(HSMHVDdPtr, HSMHVdNode, HSMHVdNode); - TSTALLOC(HSMHVGPgpPtr, HSMHVgNodePrime, HSMHVgNodePrime); - TSTALLOC(HSMHVSsPtr, HSMHVsNode, HSMHVsNode); - TSTALLOC(HSMHVDPdpPtr, HSMHVdNodePrime, HSMHVdNodePrime); - TSTALLOC(HSMHVSPspPtr, HSMHVsNodePrime, HSMHVsNodePrime); - TSTALLOC(HSMHVDdpPtr, HSMHVdNode, HSMHVdNodePrime); - TSTALLOC(HSMHVGPdpPtr, HSMHVgNodePrime, HSMHVdNodePrime); - TSTALLOC(HSMHVGPspPtr, HSMHVgNodePrime, HSMHVsNodePrime); - TSTALLOC(HSMHVSspPtr, HSMHVsNode, HSMHVsNodePrime); - TSTALLOC(HSMHVDPspPtr, HSMHVdNodePrime, HSMHVsNodePrime); - TSTALLOC(HSMHVDPdPtr, HSMHVdNodePrime, HSMHVdNode); - TSTALLOC(HSMHVDPgpPtr, HSMHVdNodePrime, HSMHVgNodePrime); - TSTALLOC(HSMHVSPgpPtr, HSMHVsNodePrime, HSMHVgNodePrime); - TSTALLOC(HSMHVSPsPtr, HSMHVsNodePrime, HSMHVsNode); - TSTALLOC(HSMHVSPdpPtr, HSMHVsNodePrime, HSMHVdNodePrime); - - TSTALLOC(HSMHVGgPtr, HSMHVgNode, HSMHVgNode); - TSTALLOC(HSMHVGgpPtr, HSMHVgNode, HSMHVgNodePrime); - TSTALLOC(HSMHVGPgPtr, HSMHVgNodePrime, HSMHVgNode); - /* TSTALLOC(HSMHVGdpPtr, HSMHVgNode, HSMHVdNodePrime); not used */ - /* TSTALLOC(HSMHVGspPtr, HSMHVgNode, HSMHVsNodePrime); not used */ - /* TSTALLOC(HSMHVGbpPtr, HSMHVgNode, HSMHVbNodePrime); not used */ - TSTALLOC(HSMHVDdbPtr, HSMHVdNode, HSMHVdbNode); - TSTALLOC(HSMHVSsbPtr, HSMHVsNode, HSMHVsbNode); - - TSTALLOC(HSMHVDBdPtr, HSMHVdbNode, HSMHVdNode); - TSTALLOC(HSMHVDBdbPtr, HSMHVdbNode, HSMHVdbNode); - TSTALLOC(HSMHVDBbpPtr, HSMHVdbNode, HSMHVbNodePrime); - /* TSTALLOC(HSMHVDBbPtr, HSMHVdbNode, HSMHVbNode); not used */ - - TSTALLOC(HSMHVBPdbPtr, HSMHVbNodePrime, HSMHVdbNode); - TSTALLOC(HSMHVBPbPtr, HSMHVbNodePrime, HSMHVbNode); - TSTALLOC(HSMHVBPsbPtr, HSMHVbNodePrime, HSMHVsbNode); - - TSTALLOC(HSMHVSBsPtr, HSMHVsbNode, HSMHVsNode); - TSTALLOC(HSMHVSBbpPtr, HSMHVsbNode, HSMHVbNodePrime); - /* TSTALLOC(HSMHVSBbPtr, HSMHVsbNode, HSMHVbNode); not used */ - TSTALLOC(HSMHVSBsbPtr, HSMHVsbNode, HSMHVsbNode); - - /* TSTALLOC(HSMHVBdbPtr, HSMHVbNode, HSMHVdbNode); not used */ - TSTALLOC(HSMHVBbpPtr, HSMHVbNode, HSMHVbNodePrime); - /* TSTALLOC(HSMHVBsbPtr, HSMHVbNode, HSMHVsbNode); not used */ - TSTALLOC(HSMHVBbPtr, HSMHVbNode, HSMHVbNode); - - TSTALLOC(HSMHVDgpPtr, HSMHVdNode, HSMHVgNodePrime); - TSTALLOC(HSMHVDsPtr, HSMHVdNode, HSMHVsNode); - TSTALLOC(HSMHVDbpPtr, HSMHVdNode, HSMHVbNodePrime); - TSTALLOC(HSMHVDspPtr, HSMHVdNode, HSMHVsNodePrime); - TSTALLOC(HSMHVDPsPtr, HSMHVdNodePrime, HSMHVsNode); - - TSTALLOC(HSMHVSgpPtr, HSMHVsNode, HSMHVgNodePrime); - TSTALLOC(HSMHVSdPtr, HSMHVsNode, HSMHVdNode); - TSTALLOC(HSMHVSbpPtr, HSMHVsNode, HSMHVbNodePrime); - TSTALLOC(HSMHVSdpPtr, HSMHVsNode, HSMHVdNodePrime); - TSTALLOC(HSMHVSPdPtr, HSMHVsNodePrime, HSMHVdNode); - - TSTALLOC(HSMHVGPdPtr, HSMHVgNodePrime, HSMHVdNode); - TSTALLOC(HSMHVGPsPtr, HSMHVgNodePrime, HSMHVsNode); - - if ( here->HSMHVsubNode > 0 ) { /* 5th substrate node */ - TSTALLOC(HSMHVDsubPtr, HSMHVdNode, HSMHVsubNode); - TSTALLOC(HSMHVDPsubPtr, HSMHVdNodePrime, HSMHVsubNode); - TSTALLOC(HSMHVSsubPtr, HSMHVsNode, HSMHVsubNode); - TSTALLOC(HSMHVSPsubPtr, HSMHVsNodePrime, HSMHVsubNode); - } - if ( here->HSMHV_coselfheat > 0 ) { /* self heating */ - TSTALLOC(HSMHVTemptempPtr, HSMHVtempNode, HSMHVtempNode); - TSTALLOC(HSMHVTempdPtr, HSMHVtempNode, HSMHVdNode); - TSTALLOC(HSMHVTempdpPtr, HSMHVtempNode, HSMHVdNodePrime); - TSTALLOC(HSMHVTempsPtr, HSMHVtempNode, HSMHVsNode); - TSTALLOC(HSMHVTempspPtr, HSMHVtempNode, HSMHVsNodePrime); - TSTALLOC(HSMHVDPtempPtr, HSMHVdNodePrime, HSMHVtempNode); - TSTALLOC(HSMHVSPtempPtr, HSMHVsNodePrime, HSMHVtempNode); - - TSTALLOC(HSMHVTempgpPtr, HSMHVtempNode, HSMHVgNodePrime); - TSTALLOC(HSMHVTempbpPtr, HSMHVtempNode, HSMHVbNodePrime); - - TSTALLOC(HSMHVGPtempPtr, HSMHVgNodePrime, HSMHVtempNode); - TSTALLOC(HSMHVBPtempPtr, HSMHVbNodePrime, HSMHVtempNode); - - TSTALLOC(HSMHVDBtempPtr, HSMHVdbNode, HSMHVtempNode); - TSTALLOC(HSMHVSBtempPtr, HSMHVsbNode, HSMHVtempNode); - TSTALLOC(HSMHVDtempPtr, HSMHVdNode, HSMHVtempNode); - TSTALLOC(HSMHVStempPtr, HSMHVsNode, HSMHVtempNode); - } - if ( model->HSMHV_conqs ) { /* flat handling of NQS */ - TSTALLOC(HSMHVDPqiPtr, HSMHVdNodePrime, HSMHVqiNode); - TSTALLOC(HSMHVGPqiPtr, HSMHVgNodePrime, HSMHVqiNode); - TSTALLOC(HSMHVGPqbPtr, HSMHVgNodePrime, HSMHVqbNode); - TSTALLOC(HSMHVSPqiPtr, HSMHVsNodePrime, HSMHVqiNode); - TSTALLOC(HSMHVBPqbPtr, HSMHVbNodePrime, HSMHVqbNode); - TSTALLOC(HSMHVQIdpPtr, HSMHVqiNode, HSMHVdNodePrime); - TSTALLOC(HSMHVQIgpPtr, HSMHVqiNode, HSMHVgNodePrime); - TSTALLOC(HSMHVQIspPtr, HSMHVqiNode, HSMHVsNodePrime); - TSTALLOC(HSMHVQIbpPtr, HSMHVqiNode, HSMHVbNodePrime); - TSTALLOC(HSMHVQIqiPtr, HSMHVqiNode, HSMHVqiNode); - TSTALLOC(HSMHVQBdpPtr, HSMHVqbNode, HSMHVdNodePrime); - TSTALLOC(HSMHVQBgpPtr, HSMHVqbNode, HSMHVgNodePrime); - TSTALLOC(HSMHVQBspPtr, HSMHVqbNode, HSMHVsNodePrime); - TSTALLOC(HSMHVQBbpPtr, HSMHVqbNode, HSMHVbNodePrime); - TSTALLOC(HSMHVQBqbPtr, HSMHVqbNode, HSMHVqbNode); - if ( here->HSMHV_coselfheat > 0 ) { /* self heating */ - TSTALLOC(HSMHVQItempPtr, HSMHVqiNode, HSMHVtempNode); - TSTALLOC(HSMHVQBtempPtr, HSMHVqbNode, HSMHVtempNode); - } - } - - - - - /*-----------------------------------------------------------* - * Range check of instance parameters - *-----------------*/ - RANGECHECK(here->HSMHV_l, model->HSMHV_lmin, model->HSMHV_lmax, "L") ; - RANGECHECK(here->HSMHV_w/here->HSMHV_nf, model->HSMHV_wmin, model->HSMHV_wmax, "W/NF") ; - - /* binning calculation */ - pParam = &here->pParam ; - Lgate = here->HSMHV_l + model->HSMHV_xl ; - Wgate = here->HSMHV_w / here->HSMHV_nf + model->HSMHV_xw ; - LG = Lgate * C_m2um ; - WG = Wgate * C_m2um ; - Lbin = pow(LG, model->HSMHV_lbinn) ; - Wbin = pow(WG, model->HSMHV_wbinn) ; - LWbin = Lbin * Wbin ; - - BINNING(vmax); - BINNING(bgtmp1); - BINNING(bgtmp2); - BINNING(eg0); - BINNING(vfbover); - BINNING(nover); - BINNING(novers); - BINNING(wl2); - BINNING(vfbc); - BINNING(nsubc); - BINNING(nsubp); - BINNING(scp1); - BINNING(scp2); - BINNING(scp3); - BINNING(sc1); - BINNING(sc2); - BINNING(sc3); - BINNING(pgd1); - BINNING(pgd3); - BINNING(ndep); - BINNING(ninv); - BINNING(muecb0); - BINNING(muecb1); - BINNING(mueph1); - BINNING(vtmp); - BINNING(wvth0); - BINNING(muesr1); - BINNING(muetmp); - BINNING(sub1); - BINNING(sub2); - BINNING(svds); - BINNING(svbs); - BINNING(svgs); - BINNING(fn1); - BINNING(fn2); - BINNING(fn3); - BINNING(fvbs); - BINNING(nsti); - BINNING(wsti); - BINNING(scsti1); - BINNING(scsti2); - BINNING(vthsti); - BINNING(muesti1); - BINNING(muesti2); - BINNING(muesti3); - BINNING(nsubpsti1); - BINNING(nsubpsti2); - BINNING(nsubpsti3); - BINNING(cgso); - BINNING(cgdo); - BINNING(js0); - BINNING(js0sw); - BINNING(nj); - BINNING(cisbk); - BINNING(clm1); - BINNING(clm2); - BINNING(clm3); - BINNING(wfc); - BINNING(gidl1); - BINNING(gidl2); - BINNING(gleak1); - BINNING(gleak2); - BINNING(gleak3); - BINNING(gleak6); - BINNING(glksd1); - BINNING(glksd2); - BINNING(glkb1); - BINNING(glkb2); - BINNING(nftrp); - BINNING(nfalp); - BINNING(pthrou); - BINNING(vdiffj); - BINNING(ibpc1); - BINNING(ibpc2); - BINNING(cgbo); - BINNING(cvdsover); - BINNING(falph); - BINNING(npext); - BINNING(powrat); - BINNING(rd); - BINNING(rd22); - BINNING(rd23); - BINNING(rd24); - BINNING(rdict1); - BINNING(rdov13); - BINNING(rdslp1); - BINNING(rdvb); - BINNING(rdvd); - BINNING(rdvg11); - BINNING(rs); - BINNING(rth0); - BINNING(vover); - - /*-----------------------------------------------------------* - * Range check of model parameters - *-----------------*/ - RANGECHECK(pParam->HSMHV_vmax, 1.0e6, 20.0e6, "VMAX") ; - RANGECHECK(pParam->HSMHV_bgtmp1, 50.0e-6, 1.0e-3, "BGTMP1") ; - RANGECHECK(pParam->HSMHV_bgtmp2, -1.0e-6, 1.0e-6, "BGTMP2") ; - RANGECHECK(pParam->HSMHV_eg0, 1.0, 1.3, "EG0") ; - RANGECHECK(pParam->HSMHV_vfbover, -1.0, 1.0, "VFBOVER") ; - RANGECHECK(pParam->HSMHV_vfbc, -1.2, -0.8, "VFBC") ; - RANGECHECK(pParam->HSMHV_nsubc, 1.0e16, 1.0e19, "NSUBC") ; - RANGECHECK(pParam->HSMHV_nsubp, 1.0e16, 1.0e19, "NSUBP") ; - RANGECHECK(pParam->HSMHV_scp1, 0.0, 20.0, "SCP1") ; - RANGECHECK(pParam->HSMHV_scp2, 0.0, 2.0, "SCP2") ; - RANGECHECK(pParam->HSMHV_scp3, 0.0, 200e-9, "SCP3") ; - RANGECHECK(pParam->HSMHV_sc1, 0.0, 20.0, "SC1") ; - RANGECHECK(pParam->HSMHV_sc2, 0.0, 2.0, "SC2") ; - RANGECHECK(pParam->HSMHV_sc3, 0.0, 200e-9, "SC3") ; - RANGECHECK(pParam->HSMHV_pgd1, 0.0, 50.0e-3, "PGD1") ; - RANGECHECK(pParam->HSMHV_pgd3, 0.0, 1.2, "PGD3") ; - RANGECHECK(pParam->HSMHV_ndep, 0.0, 1.0, "NDEP") ; - RANGECHECK(pParam->HSMHV_ninv, 0.0, 1.0, "NINV") ; - RANGECHECK(pParam->HSMHV_muecb0, 100.0, 100.0e3, "MUECB0") ; - RANGECHECK(pParam->HSMHV_muecb1, 5.0, 10.0e3, "MUECB1") ; - RANGECHECK(pParam->HSMHV_mueph1, 2.0e3, 30.0e3, "MUEPH1") ; - RANGECHECK(pParam->HSMHV_vtmp, -2.0, 1.0, "VTMP") ; - RANGECHECK(pParam->HSMHV_muesr1, 1.0e14, 1.0e16, "MUESR1") ; - RANGECHECK(pParam->HSMHV_muetmp, 0.5, 2.0, "MUETMP") ; - RANGECHECK(pParam->HSMHV_clm1, 0.01, 1.0, "CLM1") ; - RANGECHECK(pParam->HSMHV_clm2, 1.0, 4.0, "CLM2") ; - RANGECHECK(pParam->HSMHV_clm3, 0.5, 5.0, "CLM3") ; - RANGECHECK(pParam->HSMHV_wfc, -5.0e-15, 1.0e-6, "WFC") ; - RANGECHECK(pParam->HSMHV_cgso, 0.0, 100e-9 * 100*C_VAC*model->HSMHV_kappa/model->HSMHV_tox*C_m2cm, "CGSO") ; - RANGECHECK(pParam->HSMHV_cgdo, 0.0, 100e-9 * 100*C_VAC*model->HSMHV_kappa/model->HSMHV_tox*C_m2cm, "CGDO") ; - RANGECHECK(pParam->HSMHV_pthrou, 0.0, 50.0e-3, "PTHROU") ; - RANGECHECK(pParam->HSMHV_ibpc1, 0.0, 1.0e12, "IBPC1") ; - RANGECHECK(pParam->HSMHV_ibpc2, 0.0, 1.0e12, "IBPC2") ; - RANGECHECK(pParam->HSMHV_cvdsover, 0.0, 1.0, "CVDSOVER") ; - RANGECHECK(pParam->HSMHV_nsti, 1.0e16, 1.0e19, "NSTI") ; - if ( pParam->HSMHV_cgbo < 0.0 ) { - printf("warning(HiSIMHV): %s = %e\n", "CGBO", pParam->HSMHV_cgbo ); - printf("warning(HiSIMHV): The model parameter %s must not be less than %s.\n", "CGBO", "0.0" ); - } - RANGECHECK(pParam->HSMHV_npext, 1.0e16, 1.0e18, "NPEXT") ; - RANGECHECK(pParam->HSMHV_rd, 0.0, 100.0e-3, "RD") ; - RANGECHECK(pParam->HSMHV_rd22, -5.0, 0.0, "RD22") ; - RANGECHECK(pParam->HSMHV_rd23, 0.0, 2.0, "RD23") ; - RANGECHECK(pParam->HSMHV_rd24, 0.0, 0.1, "RD24") ; - RANGECHECK(pParam->HSMHV_rdict1, -10.0, 10.0, "RDICT1") ; - RANGECHECK(pParam->HSMHV_rdov13, 0.0, 1.0, "RDOV13") ; - RANGECHECK(pParam->HSMHV_rdslp1, -10.0, 10.0, "RDSLP1") ; - RANGECHECK(pParam->HSMHV_rdvb, 0.0, 2.0, "RDVB") ; - RANGECHECK(pParam->HSMHV_rdvd, 0.0, 2.0, "RDVD") ; - MINCHECK( pParam->HSMHV_rdvg11, 0.0, "RDVG11") ; - RANGECHECK(pParam->HSMHV_rs, 0.0, 10.0e-3, "RS") ; - RANGECHECK(pParam->HSMHV_rth0, 0.0, 10.0, "RTH0") ; - RANGECHECK(pParam->HSMHV_vover, 0.0, 4.0, "VOVER") ; - - /*-----------------------------------------------------------* - * Change unit into MKS for instance parameters. - *-----------------*/ - - hereMKS->HSMHV_nsubcdfm = here->HSMHV_nsubcdfm / C_cm2m_p3 ; - hereMKS->HSMHV_subld2 = here->HSMHV_subld2 * C_m2cm ; - - pParam->HSMHV_nsubc = pParam->HSMHV_nsubc / C_cm2m_p3 ; - pParam->HSMHV_nsubp = pParam->HSMHV_nsubp / C_cm2m_p3 ; - pParam->HSMHV_nsti = pParam->HSMHV_nsti / C_cm2m_p3 ; - pParam->HSMHV_nover = pParam->HSMHV_nover / C_cm2m_p3 ; - pParam->HSMHV_novers = pParam->HSMHV_novers / C_cm2m_p3 ; - pParam->HSMHV_nsubpsti1 = pParam->HSMHV_nsubpsti1 / C_m2cm ; - pParam->HSMHV_muesti1 = pParam->HSMHV_muesti1 / C_m2cm ; - pParam->HSMHV_ndep = pParam->HSMHV_ndep / C_m2cm ; - pParam->HSMHV_ninv = pParam->HSMHV_ninv / C_m2cm ; - - pParam->HSMHV_vmax = pParam->HSMHV_vmax / C_m2cm ; - pParam->HSMHV_wfc = pParam->HSMHV_wfc * C_m2cm_p2 ; - pParam->HSMHV_glksd1 = pParam->HSMHV_glksd1 / C_m2cm ; - pParam->HSMHV_glksd2 = pParam->HSMHV_glksd2 * C_m2cm ; - pParam->HSMHV_gleak2 = pParam->HSMHV_gleak2 * C_m2cm ; - pParam->HSMHV_glkb2 = pParam->HSMHV_glkb2 * C_m2cm ; - pParam->HSMHV_fn2 = pParam->HSMHV_fn2 * C_m2cm ; - pParam->HSMHV_gidl1 = pParam->HSMHV_gidl1 / C_m2cm_p1o2 ; - pParam->HSMHV_gidl2 = pParam->HSMHV_gidl2 * C_m2cm ; - pParam->HSMHV_nfalp = pParam->HSMHV_nfalp / C_m2cm ; - pParam->HSMHV_nftrp = pParam->HSMHV_nftrp * C_m2cm_p2 ; - - pParam->HSMHV_npext = pParam->HSMHV_npext / C_cm2m_p3 ; - pParam->HSMHV_rd22 = pParam->HSMHV_rd22 / C_m2cm ; - pParam->HSMHV_rd23 = pParam->HSMHV_rd23 / C_m2cm ; - pParam->HSMHV_rd24 = pParam->HSMHV_rd24 / C_m2cm ; - pParam->HSMHV_rdvd = pParam->HSMHV_rdvd / C_m2cm ; - pParam->HSMHV_rth0 = pParam->HSMHV_rth0 / C_m2cm ; -// hereMKS->HSMHV_muecb0 = pParam->HSMHV_muecb0 * C_m2cm_p2 ; -// hereMKS->HSMHV_muecb1 = pParam->HSMHV_muecb1 * C_m2cm_p2 ; -// hereMKS->HSMHV_muesr1 = pParam->HSMHV_muesr1 * C_m2cm_p2 ; -// hereMKS->HSMHV_mueph1 = pParam->HSMHV_mueph1 * C_m2cm_p2 ; - - pParam->HSMHV_vfbover = - pParam->HSMHV_vfbover ; /* For Backward compatibility */ - - } /* instance */ - - - - /*-----------------------------------------------------------* - * Range check of model parameters - *-----------------*/ - RANGECHECK(model->HSMHV_shemax , 300, 600, "SHEMAX"); - if ( model->HSMHV_tox <= 0 ) { - printf("warning(HiSIMHV): TOX = %e\n ", model->HSMHV_tox); - printf("warning(HiSIMHV): The model parameter TOX must be positive.\n"); - } - RANGECHECK(model->HSMHV_xld, 0.0, 50.0e-9, "XLD") ; - RANGECHECK(model->HSMHV_xwd, -10.0e-9, 100.0e-9, "XWD") ; - RANGECHECK(model->HSMHV_xwdc, -10.0e-9, 100.0e-9, "XWDC") ; - RANGECHECK(model->HSMHV_rsh, 0.0, 500, "RSH") ; - RANGECHECK(model->HSMHV_rshg, 0.0, 100.0, "RSHG") ; - if(model->HSMHV_xqy != 0.0) { MINCHECK (model->HSMHV_xqy, 10.0e-9, "XQY") ; } - MINCHECK (model->HSMHV_xqy1, 0.0, "XQY1") ; - MINCHECK (model->HSMHV_xqy2, 0.0, "XQY2") ; - RANGECHECK(model->HSMHV_vbi, 1.0, 1.2, "VBI") ; - RANGECHECK(model->HSMHV_parl2, 0.0, 50.0e-9, "PARL2") ; - RANGECHECK(model->HSMHV_lp, 0.0, 300.0e-9, "LP") ; - RANGECHECK(model->HSMHV_pgd2, 0.0, 1.5, "PGD2") ; - RANGECHECK(model->HSMHV_pgd4, 0.0, 3.0, "PGD4") ; - RANGECHECK(model->HSMHV_mueph0, 0.25, 0.35, "MUEPH0") ; - RANGECHECK(model->HSMHV_muesr0, 1.8, 2.2, "MUESR0") ; - RANGECHECK(model->HSMHV_lpext, 1.0e-50, 10.0e-6, "LPEXT") ; - RANGECHECK(model->HSMHV_scp21, 0.0, 5.0, "SCP21") ; - RANGECHECK(model->HSMHV_scp22, 0.0, 0.0, "SCP22") ; - RANGECHECK(model->HSMHV_bs1, 0.0, 50.0e-3, "BS1") ; - RANGECHECK(model->HSMHV_bs2, 0.5, 1.0, "BS2") ; - RANGECHECK(model->HSMHV_clm5, 0.0, 2.0, "CLM5") ; - RANGECHECK(model->HSMHV_clm6, 0.0, 20.0, "CLM6") ; - MINCHECK (model->HSMHV_ninvd, 0.0, "NINVD") ; - MINCHECK (model->HSMHV_ninvdw, 0.0, "NINVDW") ; - MINCHECK (model->HSMHV_ninvdwp, 0.0, "NINVDWP") ; - MINCHECK (model->HSMHV_ninvdt1, 0.0, "NINVDT1") ; - MINCHECK (model->HSMHV_ninvdt2, 0.0, "NINVDT2") ; - RANGECHECK(model->HSMHV_sub2l, 0.0, 1.0, "SUB2L") ; - RANGECHECK(model->HSMHV_voverp, 0.0, 2.0, "VOVERP") ; - RANGECHECK(model->HSMHV_qme1, 0.0, 300.0e-9, "QME1") ; - RANGECHECK(model->HSMHV_qme2, 0.0, 3.0, "QME2") ; - RANGECHECK(model->HSMHV_qme3, 0.0,800.0e-12, "QME3") ; - RANGECHECK(model->HSMHV_glpart1, 0.0, 1.0, "GLPART1") ; - RANGECHECK(model->HSMHV_tnom, 22.0, 32.0, "TNOM") ; - RANGECHECK(model->HSMHV_ddltmax, 1.0, 10.0, "DDLTMAX") ; - RANGECHECK(model->HSMHV_ddltict, -3.0, 20.0, "DDLTICT") ; - RANGECHECK(model->HSMHV_ddltslp, 0.0, 20.0, "DDLTSLP") ; - RANGECHECK(model->HSMHV_mphdfm, -3.0, 3.0, "MPHDFM") ; - RANGECHECK(model->HSMHV_cvb, -0.1, 0.2, "CVB") ; - RANGECHECK(model->HSMHV_cvbk, -0.1, 0.2, "CVBK") ; - RANGECHECK(model->HSMHV_rd20, 0.0, 30.0, "RD20") ; - RANGECHECK(model->HSMHV_rd21, 0.0, 1.0, "RD21") ; - RANGECHECK(model->HSMHV_rd22d, 0.0, 2.0, "RD22D") ; - MINCHECK( model->HSMHV_rd25, 0.0, "RD25") ; - RANGECHECK(model->HSMHV_rdtemp1, -1e-3, 1e-2, "RDTEMP1") ; - RANGECHECK(model->HSMHV_rdtemp2, -1e-5, 1e-5, "RDTEMP2") ; - RANGECHECK(model->HSMHV_rdvdtemp1,-1e-3, 1e-2, "RDVDTEMP1") ; - RANGECHECK(model->HSMHV_rdvdtemp2,-1e-5, 1e-5, "RDVDTEMP2") ; - MINCHECK( model->HSMHV_rdvg12, 0.0, "RDVG12") ; - RANGECHECK(model->HSMHV_rthtemp1, -1.0, 1.0, "RTHTEMP1") ; - RANGECHECK(model->HSMHV_rthtemp2, -1.0, 1.0, "RTHTEMP2") ; - RANGECHECK(model->HSMHV_rth0w, -100, 100, "RTH0W") ; - RANGECHECK(model->HSMHV_rth0wp, -10, 10, "RTH0WP") ; - RANGECHECK(model->HSMHV_rth0nf, -5.0, 5.0, "RTH0NF") ; - RANGECHECK(model->HSMHV_powrat, 0.0, 1.0, "POWRAT") ; - RANGECHECK(model->HSMHV_prattemp1, -1.0, 1.0, "PRATTEMP1") ; - RANGECHECK(model->HSMHV_prattemp2, -1.0, 1.0, "PRATTEMP2") ; - MINCHECK( model->HSMHV_xldld, 0.0, "XLDLD") ; - MINCHECK( model->HSMHV_loverld, 0.0, "LOVERLD") ; - MINCHECK( model->HSMHV_lovers, 0.0, "LOVERS") ; - MINCHECK( model->HSMHV_lover, 0.0, "LOVER") ; - MINCHECK( model->HSMHV_ldrift1, 0.0, "LDRIFT1") ; - MINCHECK( model->HSMHV_ldrift1s, 0.0, "LDRIFT1S") ; - MINCHECK( model->HSMHV_ldrift2, 0.0, "LDRIFT2") ; - MINCHECK( model->HSMHV_ldrift2s, 0.0, "LDRIFT2S") ; - MINCHECK( model->HSMHV_ldrift, 0.0, "LDRIFT") ; - RANGECHECK(model->HSMHV_rds, -100, 100, "RDS") ; - RANGECHECK(model->HSMHV_rdsp, -10, 10, "RDSP") ; - RANGECHECK(model->HSMHV_rdvdl, -100, 100, "RDVDL") ; - RANGECHECK(model->HSMHV_rdvdlp, -10, 10, "RDVDLP") ; - RANGECHECK(model->HSMHV_rdvds, -100, 100, "RDVDS") ; - RANGECHECK(model->HSMHV_rdvdsp, -10, 10, "RDVDSP") ; - RANGECHECK(model->HSMHV_rd23l, -100, 100, "RD23L") ; - RANGECHECK(model->HSMHV_rd23lp, -10, 10, "RD23LP") ; - RANGECHECK(model->HSMHV_rd23s, -100, 100, "RD23S") ; - RANGECHECK(model->HSMHV_rd23sp, -10, 10, "RD23SP") ; - RANGECHECK(model->HSMHV_rdov11, 0.0, 10, "RDOV11") ; - RANGECHECK(model->HSMHV_rdov12, 0.0, 2.0, "RDOV12") ; - RANGECHECK(model->HSMHV_rdslp2, -10.0, 10.0, "RDSLP2") ; - RANGECHECK(model->HSMHV_rdict2, -10.0, 10.0, "RDICT2") ; - - - /*-----------------------------------------------------------* - * Change units into MKS. - *-----------------*/ - - modelMKS->HSMHV_vmax = model->HSMHV_vmax / C_m2cm ; - modelMKS->HSMHV_ll = model->HSMHV_ll / pow( C_m2cm , model->HSMHV_lln ) ; - modelMKS->HSMHV_wl = model->HSMHV_wl / pow( C_m2cm , model->HSMHV_wln ) ; - modelMKS->HSMHV_svgsl = model->HSMHV_svgsl / pow( C_m2cm , model->HSMHV_svgslp ) ; - modelMKS->HSMHV_svgsw = model->HSMHV_svgsw / pow( C_m2cm , model->HSMHV_svgswp ) ; - modelMKS->HSMHV_svbsl = model->HSMHV_svbsl / pow( C_m2cm , model->HSMHV_svbslp ) ; - modelMKS->HSMHV_slgl = model->HSMHV_slgl / pow( C_m2cm , model->HSMHV_slglp ) ; - modelMKS->HSMHV_sub1l = model->HSMHV_sub1l / pow( C_m2cm , model->HSMHV_sub1lp ) ; - modelMKS->HSMHV_slg = model->HSMHV_slg / C_m2cm ; - modelMKS->HSMHV_sub2l = model->HSMHV_sub2l / C_m2cm ; - modelMKS->HSMHV_subld2 = model->HSMHV_subld2 * C_m2cm ; - modelMKS->HSMHV_rdtemp1 = model->HSMHV_rdtemp1 / C_m2cm ; - modelMKS->HSMHV_rdtemp2 = model->HSMHV_rdtemp2 / C_m2cm ; - modelMKS->HSMHV_rdvdtemp1 = model->HSMHV_rdvdtemp1 / C_m2cm ; - modelMKS->HSMHV_rdvdtemp2 = model->HSMHV_rdvdtemp2 / C_m2cm ; - modelMKS->HSMHV_nsubsub = model->HSMHV_nsubsub / C_cm2m_p3 ; - modelMKS->HSMHV_nsubpsti1 = model->HSMHV_nsubpsti1 / C_m2cm ; - modelMKS->HSMHV_muesti1 = model->HSMHV_muesti1 / C_m2cm ; - modelMKS->HSMHV_wfc = model->HSMHV_wfc * C_m2cm_p2 ; - modelMKS->HSMHV_glksd1 = model->HSMHV_glksd1 / C_m2cm ; - modelMKS->HSMHV_glksd2 = model->HSMHV_glksd2 * C_m2cm ; - modelMKS->HSMHV_glksd3 = model->HSMHV_glksd3 * C_m2cm ; - modelMKS->HSMHV_gleak2 = model->HSMHV_gleak2 * C_m2cm ; - modelMKS->HSMHV_gleak4 = model->HSMHV_gleak4 * C_m2cm ; - modelMKS->HSMHV_gleak5 = model->HSMHV_gleak5 * C_m2cm ; - modelMKS->HSMHV_gleak7 = model->HSMHV_gleak7 / C_m2cm_p2 ; - modelMKS->HSMHV_glkb2 = model->HSMHV_glkb2 * C_m2cm ; - modelMKS->HSMHV_fn2 = model->HSMHV_fn2 * C_m2cm ; - modelMKS->HSMHV_gidl1 = model->HSMHV_gidl1 / C_m2cm_p1o2 ; - modelMKS->HSMHV_gidl2 = model->HSMHV_gidl2 * C_m2cm ; - modelMKS->HSMHV_nfalp = model->HSMHV_nfalp / C_m2cm ; - modelMKS->HSMHV_nftrp = model->HSMHV_nftrp * C_m2cm_p2 ; - modelMKS->HSMHV_cit = model->HSMHV_cit * C_m2cm_p2 ; - modelMKS->HSMHV_ovslp = model->HSMHV_ovslp / C_m2cm ; - modelMKS->HSMHV_dly3 = model->HSMHV_dly3 / C_m2cm_p2 ; - modelMKS->HSMHV_cth0 = model->HSMHV_cth0 * C_m2cm ; -// modelMKS->HSMHV_muecb0 = model->HSMHV_muecb0 * C_cm2m_p2 ; -// modelMKS->HSMHV_muecb1 = model->HSMHV_muecb1 * C_cm2m_p2 ; -// modelMKS->HSMHV_muesr1 = model->HSMHV_muesr1 * C_cm2m_p2 ; -// modelMKS->HSMHV_mueph1 = model->HSMHV_mueph1 * C_cm2m_p2 ; - - - /*-----------------------------------------------------------* - * Change unit into Kelvin. - *-----------------*/ - model->HSMHV_ktnom = model->HSMHV_tnom + 273.15 ; /* [C] -> [K] */ - - - } /* model */ - - /* Reset ckt->CKTbypass to 0 */ - if( ckt->CKTbypass == 1 ) { - fprintf( stderr, "\nwarning(HiSIMHV): The BYPASS option is reset to 0 for reliable simulation.\n"); - ckt->CKTbypass = 0 ; - } - /* check ckt->CKTintegrateMethod */ -// if( ckt->CKTintegrateMethod == TRAPEZOIDAL ) { /* TRAPEZODAL:1 GEAR:2 */ -// fprintf( stderr, "\nwarning(HiSIMHV): Recommend the Gear method for reliable simulation with '.options METHOD=GEAR'.\n"); -// } - - return(OK); -} - -int -HSMHVunsetup( - GENmodel *inModel, - CKTcircuit *ckt) -{ -#ifndef HAS_BATCHSIM - HSMHVmodel *model; - HSMHVinstance *here; - - for (model = (HSMHVmodel *)inModel; model != NULL; - model = HSMHVnextModel(model)) - { - for (here = HSMHVinstances(model); here != NULL; - here=HSMHVnextInstance(here)) - { - if (here->HSMHVqbNode > 0) - CKTdltNNum(ckt, here->HSMHVqbNode); - here->HSMHVqbNode = 0; - - if (here->HSMHVqiNode > 0) - CKTdltNNum(ckt, here->HSMHVqiNode); - here->HSMHVqiNode = 0; - - if (here->HSMHVtempNode > 0 && - here->HSMHVtempNode != here->HSMHVtempNodeExt && - here->HSMHVtempNode != here->HSMHVsubNodeExt) - CKTdltNNum(ckt, here->HSMHVtempNode); - here->HSMHVtempNode = 0; - - here->HSMHVsubNode = 0; - - if (here->HSMHVsbNode > 0 - && here->HSMHVsbNode != here->HSMHVbNode) - CKTdltNNum(ckt, here->HSMHVsbNode); - here->HSMHVsbNode = 0; - - if (here->HSMHVbNodePrime > 0 - && here->HSMHVbNodePrime != here->HSMHVbNode) - CKTdltNNum(ckt, here->HSMHVbNodePrime); - here->HSMHVbNodePrime = 0; - - if (here->HSMHVdbNode > 0 - && here->HSMHVdbNode != here->HSMHVbNode) - CKTdltNNum(ckt, here->HSMHVdbNode); - here->HSMHVdbNode = 0; - - if (here->HSMHVgNodePrime > 0 - && here->HSMHVgNodePrime != here->HSMHVgNode) - CKTdltNNum(ckt, here->HSMHVgNodePrime); - here->HSMHVgNodePrime = 0; - - if (here->HSMHVsNodePrime > 0 - && here->HSMHVsNodePrime != here->HSMHVsNode) - CKTdltNNum(ckt, here->HSMHVsNodePrime); - here->HSMHVsNodePrime = 0; - - if (here->HSMHVdNodePrime > 0 - && here->HSMHVdNodePrime != here->HSMHVdNode) - CKTdltNNum(ckt, here->HSMHVdNodePrime); - here->HSMHVdNodePrime = 0; - - } - } -#endif - return OK; -} diff --git a/src/spicelib/devices/hisimhv1/hsmhvsoachk.c b/src/spicelib/devices/hisimhv1/hsmhvsoachk.c deleted file mode 100644 index bda45be86..000000000 --- a/src/spicelib/devices/hisimhv1/hsmhvsoachk.c +++ /dev/null @@ -1,341 +0,0 @@ -/********** -Copyright 2013 Dietmar Warning. All rights reserved. -Author: 2013 Dietmar Warning -**********/ - -#include "ngspice/ngspice.h" -#include "ngspice/cktdefs.h" -#include "hsmhvdef.h" -#include "ngspice/trandefs.h" -#include "ngspice/sperror.h" -#include "ngspice/suffix.h" -#include "ngspice/cpdefs.h" - - -int -HSMHVsoaCheck(CKTcircuit *ckt, GENmodel *inModel) -{ - HSMHVmodel *model = (HSMHVmodel *) inModel; - HSMHVinstance *here; - double vgs, vgd, vgb, vds, vbs, vbd; /* actual mos voltages */ - int maxwarns; - static int warns_vgs = 0, warns_vgd = 0, warns_vgb = 0, warns_vds = 0, warns_vbs = 0, warns_vbd = 0; - - if (!ckt) { - warns_vgs = 0; - warns_vgd = 0; - warns_vgb = 0; - warns_vds = 0; - warns_vbs = 0; - warns_vbd = 0; - return OK; - } - - maxwarns = ckt->CKTsoaMaxWarns; - - for (; model; model = HSMHVnextModel(model)) { - - for (here = HSMHVinstances(model); here; here = HSMHVnextInstance(here)) { - - vgs = ckt->CKTrhsOld [here->HSMHVgNode] - - ckt->CKTrhsOld [here->HSMHVsNodePrime]; - - vgd = ckt->CKTrhsOld [here->HSMHVgNode] - - ckt->CKTrhsOld [here->HSMHVdNodePrime]; - - vgb = ckt->CKTrhsOld [here->HSMHVgNode] - - ckt->CKTrhsOld [here->HSMHVbNodePrime]; - - vds = ckt->CKTrhsOld [here->HSMHVdNode] - - ckt->CKTrhsOld [here->HSMHVsNodePrime]; - - vbs = ckt->CKTrhsOld [here->HSMHVbNode] - - ckt->CKTrhsOld [here->HSMHVsNodePrime]; - - vbd = ckt->CKTrhsOld [here->HSMHVbNode] - - ckt->CKTrhsOld [here->HSMHVdNodePrime]; - - if (!model->HSMHVvgsrMaxGiven) { - if (fabs(vgs) > model->HSMHVvgsMax) - if (warns_vgs < maxwarns) { - soa_printf(ckt, (GENinstance*) here, - "Vgs=%g has exceeded Vgs_max=%g\n", - vgs, model->HSMHVvgsMax); - warns_vgs++; - } - if (!model->HSMHVvgbMaxGiven) { - if (fabs(vgb) > model->HSMHVvgsMax) - if (warns_vgb < maxwarns) { - soa_printf(ckt, (GENinstance*) here, - "Vgb=%g has exceeded Vgs_max=%g\n", - vgb, model->HSMHVvgsMax); - warns_vgb++; - } - } else { - if (fabs(vgb) > model->HSMHVvgbMax) - if (warns_vgb < maxwarns) { - soa_printf(ckt, (GENinstance*) here, - "Vgb=%g has exceeded Vgb_max=%g\n", - vgb, model->HSMHVvgbMax); - warns_vgb++; - } - } - } else { - if (model->HSMHV_type > 0) { - if (vgs > model->HSMHVvgsMax) - if (warns_vgs < maxwarns) { - soa_printf(ckt, (GENinstance*) here, - "Vgs=%g has exceeded Vgs_max=%g\n", - vgs, model->HSMHVvgsMax); - warns_vgs++; - } - if (-1*vgs > model->HSMHVvgsrMax) - if (warns_vgs < maxwarns) { - soa_printf(ckt, (GENinstance*) here, - "Vgs=%g has exceeded Vgsr_max=%g\n", - vgs, model->HSMHVvgsrMax); - warns_vgs++; - } - } else { - if (vgs > model->HSMHVvgsrMax) - if (warns_vgs < maxwarns) { - soa_printf(ckt, (GENinstance*) here, - "Vgs=%g has exceeded Vgsr_max=%g\n", - vgs, model->HSMHVvgsrMax); - warns_vgs++; - } - if (-1*vgs > model->HSMHVvgsMax) - if (warns_vgs < maxwarns) { - soa_printf(ckt, (GENinstance*) here, - "Vgs=%g has exceeded Vgs_max=%g\n", - vgs, model->HSMHVvgsMax); - warns_vgs++; - } - } - } - - if (!model->HSMHVvgdrMaxGiven) { - if (fabs(vgd) > model->HSMHVvgdMax) - if (warns_vgd < maxwarns) { - soa_printf(ckt, (GENinstance*) here, - "Vgd=%g has exceeded Vgd_max=%g\n", - vgd, model->HSMHVvgdMax); - warns_vgd++; - } - } else { - if (model->HSMHV_type > 0) { - if (vgd > model->HSMHVvgdMax) - if (warns_vgd < maxwarns) { - soa_printf(ckt, (GENinstance*) here, - "Vgd=%g has exceeded Vgd_max=%g\n", - vgd, model->HSMHVvgdMax); - warns_vgd++; - } - if (-1*vgd > model->HSMHVvgdrMax) - if (warns_vgd < maxwarns) { - soa_printf(ckt, (GENinstance*) here, - "Vgd=%g has exceeded Vgdr_max=%g\n", - vgd, model->HSMHVvgdrMax); - warns_vgd++; - } - } else { - if (vgd > model->HSMHVvgdrMax) - if (warns_vgd < maxwarns) { - soa_printf(ckt, (GENinstance*) here, - "Vgd=%g has exceeded Vgdr_max=%g\n", - vgd, model->HSMHVvgdrMax); - warns_vgd++; - } - if (-1*vgd > model->HSMHVvgdMax) - if (warns_vgd < maxwarns) { - soa_printf(ckt, (GENinstance*) here, - "Vgd=%g has exceeded Vgd_max=%g\n", - vgd, model->HSMHVvgdMax); - warns_vgd++; - } - } - } - - if (fabs(vds) > model->HSMHVvdsMax) - if (warns_vds < maxwarns) { - soa_printf(ckt, (GENinstance*) here, - "Vds=%g has exceeded Vds_max=%g\n", - vds, model->HSMHVvdsMax); - warns_vds++; - } - - if (!model->HSMHVvgbrMaxGiven) { - if (fabs(vgb) > model->HSMHVvgbMax) - if (warns_vgb < maxwarns) { - soa_printf(ckt, (GENinstance*) here, - "Vgb=%g has exceeded Vgb_max=%g\n", - vgb, model->HSMHVvgbMax); - warns_vgb++; - } - } else { - if (model->HSMHV_type > 0) { - if (vgb > model->HSMHVvgbMax) - if (warns_vgb < maxwarns) { - soa_printf(ckt, (GENinstance*) here, - "Vgb=%g has exceeded Vgb_max=%g\n", - vgb, model->HSMHVvgbMax); - warns_vgb++; - } - if (-1*vgb > model->HSMHVvgbrMax) - if (warns_vgb < maxwarns) { - soa_printf(ckt, (GENinstance*) here, - "Vgb=%g has exceeded Vgbr_max=%g\n", - vgb, model->HSMHVvgbrMax); - warns_vgb++; - } - } else { - if (vgb > model->HSMHVvgbrMax) - if (warns_vgb < maxwarns) { - soa_printf(ckt, (GENinstance*) here, - "Vgb=%g has exceeded Vgbr_max=%g\n", - vgb, model->HSMHVvgbrMax); - warns_vgb++; - } - if (-1*vgb > model->HSMHVvgbMax) - if (warns_vgb < maxwarns) { - soa_printf(ckt, (GENinstance*) here, - "Vgb=%g has exceeded Vgb_max=%g\n", - vgb, model->HSMHVvgbMax); - warns_vgb++; - } - } - } - - if (!model->HSMHVvbsrMaxGiven) { - if (!model->HSMHVvbsMaxGiven) { - if (fabs(vbs) > model->HSMHVvbdMax) - if (warns_vbs < maxwarns) { - soa_printf(ckt, (GENinstance*) here, - "Vbs=%g has exceeded Vbd_max=%g\n", - vbs, model->HSMHVvbdMax); - warns_vbs++; - } - } else { - if (fabs(vbs) > model->HSMHVvbsMax) - if (warns_vbs < maxwarns) { - soa_printf(ckt, (GENinstance*) here, - "Vbs=%g has exceeded Vbs_max=%g\n", - vbs, model->HSMHVvbsMax); - warns_vbs++; - } - } - } else { - if (!model->HSMHVvbsMaxGiven) { - if (model->HSMHV_type > 0) { - if (vbs > model->HSMHVvbdMax) - if (warns_vbs < maxwarns) { - soa_printf(ckt, (GENinstance*) here, - "Vbs=%g has exceeded Vbd_max=%g\n", - vbs, model->HSMHVvbdMax); - warns_vbs++; - } - if (-1*vbs > model->HSMHVvbsrMax) - if (warns_vbs < maxwarns) { - soa_printf(ckt, (GENinstance*) here, - "Vbs=%g has exceeded Vbsr_max=%g\n", - vbs, model->HSMHVvbsrMax); - warns_vbs++; - } - } else { - if (vbs > model->HSMHVvbsrMax) - if (warns_vbs < maxwarns) { - soa_printf(ckt, (GENinstance*) here, - "Vbs=%g has exceeded Vbsr_max=%g\n", - vbs, model->HSMHVvbsrMax); - warns_vbs++; - } - if (-1*vbs > model->HSMHVvbdMax) - if (warns_vbs < maxwarns) { - soa_printf(ckt, (GENinstance*) here, - "Vbs=%g has exceeded Vbd_max=%g\n", - vbs, model->HSMHVvbdMax); - warns_vbs++; - } - } - } else { - if (model->HSMHV_type > 0) { - if (vbs > model->HSMHVvbsMax) - if (warns_vbs < maxwarns) { - soa_printf(ckt, (GENinstance*) here, - "Vbs=%g has exceeded Vbs_max=%g\n", - vbs, model->HSMHVvbsMax); - warns_vbs++; - } - if (-1*vbs > model->HSMHVvbsrMax) - if (warns_vbs < maxwarns) { - soa_printf(ckt, (GENinstance*) here, - "Vbs=%g has exceeded Vbsr_max=%g\n", - vbs, model->HSMHVvbsrMax); - warns_vbs++; - } - } else { - if (vbs > model->HSMHVvbsrMax) - if (warns_vbs < maxwarns) { - soa_printf(ckt, (GENinstance*) here, - "Vbs=%g has exceeded Vbsr_max=%g\n", - vbs, model->HSMHVvbsrMax); - warns_vbs++; - } - if (-1*vbs > model->HSMHVvbsMax) - if (warns_vbs < maxwarns) { - soa_printf(ckt, (GENinstance*) here, - "Vbs=%g has exceeded Vbs_max=%g\n", - vbs, model->HSMHVvbsMax); - warns_vbs++; - } - } - } - } - - if (!model->HSMHVvbdrMaxGiven) { - if (fabs(vbd) > model->HSMHVvbdMax) - if (warns_vbd < maxwarns) { - soa_printf(ckt, (GENinstance*) here, - "Vbd=%g has exceeded Vbd_max=%g\n", - vbd, model->HSMHVvbdMax); - warns_vbd++; - } - } else { - if (model->HSMHV_type > 0) { - if (vbd > model->HSMHVvbdMax) - if (warns_vbd < maxwarns) { - soa_printf(ckt, (GENinstance*) here, - "Vbd=%g has exceeded Vbd_max=%g\n", - vbd, model->HSMHVvbdMax); - warns_vbd++; - } - if (-1*vbd > model->HSMHVvbdrMax) - if (warns_vbd < maxwarns) { - soa_printf(ckt, (GENinstance*) here, - "Vbd=%g has exceeded Vbdr_max=%g\n", - vbd, model->HSMHVvbdrMax); - warns_vbd++; - } - } else { - if (vbd > model->HSMHVvbdrMax) - if (warns_vbd < maxwarns) { - soa_printf(ckt, (GENinstance*) here, - "Vbd=%g has exceeded Vbdr_max=%g\n", - vbd, model->HSMHVvbdrMax); - warns_vbd++; - } - if (-1*vbd > model->HSMHVvbdMax) - if (warns_vbd < maxwarns) { - soa_printf(ckt, (GENinstance*) here, - "Vbd=%g has exceeded Vbd_max=%g\n", - vbd, model->HSMHVvbdMax); - warns_vbd++; - } - } - } - - } - } - - return OK; -} diff --git a/src/spicelib/devices/hisimhv1/hsmhvtemp.c b/src/spicelib/devices/hisimhv1/hsmhvtemp.c deleted file mode 100644 index f247afbe1..000000000 --- a/src/spicelib/devices/hisimhv1/hsmhvtemp.c +++ /dev/null @@ -1,423 +0,0 @@ -/*********************************************************************** - - HiSIM (Hiroshima University STARC IGFET Model) - Copyright (C) 2012 Hiroshima University & STARC - - MODEL NAME : HiSIM_HV - ( VERSION : 1 SUBVERSION : 2 REVISION : 4 ) - Model Parameter VERSION : 1.23 - FILE : hsmhvtemp.c - - DATE : 2013.04.30 - - released by - Hiroshima University & - Semiconductor Technology Academic Research Center (STARC) -***********************************************************************/ - -#include "ngspice/ngspice.h" -#include "ngspice/smpdefs.h" -#include "ngspice/cktdefs.h" -#include "hsmhvdef.h" -#include "hsmhvevalenv.h" -#include "ngspice/const.h" -#include "ngspice/sperror.h" -#include "ngspice/suffix.h" - - -#define RANGECHECK(param, min, max, pname) \ - if ( (param) < (min) || (param) > (max) ) { \ - printf("warning(HiSIMHV): The model/instance parameter %s (= %e) must be in the range [%e , %e].\n", \ - (pname), (param), (min), (max) ); \ - } - -#define Fn_SU( y , x , xmax , delta , dx ) { \ - TMF1 = ( xmax ) - ( x ) - ( delta ) ; \ - TMF2 = 4.0 * ( xmax ) * ( delta ) ; \ - TMF2 = TMF2 > 0.0 ? TMF2 : -( TMF2) ; \ - TMF2 = sqrt ( TMF1 * TMF1 + TMF2 ) ; \ - dx = 0.5 * ( 1.0 + TMF1 / TMF2 ) ; \ - y = ( xmax ) - 0.5 * ( TMF1 + TMF2 ) ; \ - } - -#define Fn_SL( y , x , xmin , delta , dx ) { \ - TMF1 = ( x ) - ( xmin ) - ( delta ) ; \ - TMF2 = 4.0 * ( xmin ) * ( delta ) ; \ - TMF2 = TMF2 > 0.0 ? TMF2 : -( TMF2 ); \ - TMF2 = sqrt ( TMF1 * TMF1 + TMF2 ) ; \ - dx = 0.5 * ( 1.0 + TMF1 / TMF2 ) ; \ - y = ( xmin ) + 0.5 * ( TMF1 + TMF2 ) ; \ - } - -#ifdef POW_TO_EXP_AND_LOG -#define Fn_Pow( x , y ) exp( y * log( x ) ) -#else -#define Fn_Pow( x , y ) pow( x , y ) -#endif - -#define C_m2cm (1.0e2) - -int HSMHVtemp( - GENmodel *inModel, - CKTcircuit *ckt) -{ - register HSMHVmodel *model = (HSMHVmodel *)inModel ; - register HSMHVinstance *here ; - HSMHVbinningParam *pParam ; - HSMHVmodelMKSParam *modelMKS ; - HSMHVhereMKSParam *hereMKS ; - double mueph =0.0 ; - double Leff=0.0, dL =0.0, dLLD=0.0, LG=0.0, Weff=0.0, dW =0.0, dWLD=0.0, dWCV=0.0, WG =0.0, WL =0.0, Lgate =0.0, Wgate =0.0 ; - double Nsubpp=0.0, Nsubps=0.0, Nsub=0.0, q_Nsub=0.0, Nsubb=0.0, Npext =0.0 ; - double Lod_half=0.0, Lod_half_ref =0.0 ; - double T0, T1, T2, T3, T4, T5, T6, T7 ; - /* temperature-dependent variables */ - double Eg =0.0, TTEMP0=0.0, TTEMP=0.0, beta=0.0, Nin=0.0 ; - double /*Tdiff0 = 0.0, Tdiff0_2 = 0.0,*/ Tdiff = 0.0, Tdiff_2 = 0.0 ; - double js=0.0, jssw=0.0, js2=0.0, jssw2 =0.0 ; - int i=0 ; - double TMF1 , TMF2 ; - const double small = 1.0e-50 ; - const double dlt_rd23 = 1.0e-6 / C_m2cm ; - const double large_arg = 80 ; - - for ( ;model ;model = HSMHVnextModel(model)) { - - modelMKS = &model->modelMKS ; - - model->HSMHV_vcrit = CONSTvt0 * log( CONSTvt0 / (CONSTroot2 * 1.0e-14) ) ; - - /* Quantum Mechanical Effect */ - if ( ( model->HSMHV_qme1 == 0.0 && model->HSMHV_qme3 == 0.0 ) || model->HSMHV_qme2 == 0.0 ) { - model->HSMHV_flg_qme = 0 ; - } else { - model->HSMHV_flg_qme = 1 ; - model->HSMHV_qme12 = model->HSMHV_qme1 / ( model->HSMHV_qme2 * model->HSMHV_qme2 ) ; - } - - for ( here = HSMHVinstances(model); here; here = HSMHVnextInstance(here)) { - - pParam = &here->pParam ; - - hereMKS = &here->hereMKS ; - - here->HSMHV_lgate = Lgate = here->HSMHV_l + model->HSMHV_xl ; - Wgate = here->HSMHV_w / here->HSMHV_nf + model->HSMHV_xw ; - - LG = Lgate * C_m2um ; - here->HSMHV_wg = WG = Wgate * C_m2um ; - WL = WG * LG ; - - - /* Band gap */ - here->HSMHV_egtnom = pParam->HSMHV_eg0 - model->HSMHV_ktnom - * ( 90.25e-6 + model->HSMHV_ktnom * 1.0e-7 ) ; - - /* C_EOX */ - here->HSMHV_cecox = C_VAC * model->HSMHV_kappa ; - - /* Vth reduction for small Vds */ - here->HSMHV_msc = model->HSMHV_scp22 ; - - /* Poly-Si Gate Depletion */ - if ( pParam->HSMHV_pgd1 == 0.0 ) { - here->HSMHV_flg_pgd = 0 ; - } else { - here->HSMHV_flg_pgd = 1 ; - } - - - /* CLM5 & CLM6 */ - here->HSMHV_clmmod = 1e0 + pow( LG , model->HSMHV_clm5 ) * model->HSMHV_clm6 ; - - /* Half length of diffusion */ - T1 = 1.0 / (model->HSMHV_saref + 0.5 * here->HSMHV_l) - + 1.0 / (model->HSMHV_sbref + 0.5 * here->HSMHV_l); - Lod_half_ref = 2.0 / T1 ; - - if (here->HSMHV_sa > 0.0 && here->HSMHV_sb > 0.0 && - (here->HSMHV_nf == 1.0 || - (here->HSMHV_nf > 1.0 && here->HSMHV_sd > 0.0))) { - T1 = 0.0; - for (i = 0; i < here->HSMHV_nf; i++) { - T1 += 1.0 / (here->HSMHV_sa + 0.5 * here->HSMHV_l - + i * (here->HSMHV_sd + here->HSMHV_l)) - + 1.0 / (here->HSMHV_sb + 0.5 * here->HSMHV_l - + i * (here->HSMHV_sd + here->HSMHV_l)); - } - Lod_half = 2.0 * here->HSMHV_nf / T1; - } else { - Lod_half = 0.0; - } - - Npext = pParam->HSMHV_npext ; - here->HSMHV_mueph1 = pParam->HSMHV_mueph1 ; - here->HSMHV_nsubp = pParam->HSMHV_nsubp ; - here->HSMHV_nsubc = pParam->HSMHV_nsubc ; - - /* DFM */ - if ( model->HSMHV_codfm == 1 && here->HSMHV_nsubcdfm_Given ) { - RANGECHECK(hereMKS->HSMHV_nsubcdfm, 1.0e16, 1.0e19, "NSUBCDFM") ; - here->HSMHV_mueph1 *= model->HSMHV_mphdfm - * ( log(hereMKS->HSMHV_nsubcdfm) - log(here->HSMHV_nsubc) ) + 1.0 ; - here->HSMHV_nsubp += hereMKS->HSMHV_nsubcdfm - here->HSMHV_nsubc ; - Npext += hereMKS->HSMHV_nsubcdfm - here->HSMHV_nsubc ; - here->HSMHV_nsubc = hereMKS->HSMHV_nsubcdfm ; - } - - /* Phonon Scattering (temperature-independent part) */ - mueph = here->HSMHV_mueph1 - * (1.0e0 + (model->HSMHV_muephw / pow( WG, model->HSMHV_muepwp))) - * (1.0e0 + (model->HSMHV_muephl / pow( LG, model->HSMHV_mueplp))) - * (1.0e0 + (model->HSMHV_muephs / pow( WL, model->HSMHV_muepsp))); - if (Lod_half > 0.0) { - T1 = 1.0e0 / (1.0e0 + pParam->HSMHV_muesti2) ; - T2 = pow (pParam->HSMHV_muesti1 / Lod_half, pParam->HSMHV_muesti3) ; - T3 = pow (pParam->HSMHV_muesti1 / Lod_half_ref, pParam->HSMHV_muesti3) ; - here->HSMHV_mueph = mueph * (1.0e0 + T1 * T2) / (1.0e0 + T1 * T3); - } else { - here->HSMHV_mueph = mueph; - } - - /* Surface Roughness Scattering */ - here->HSMHV_muesr = model->HSMHV_muesr0 - * (1.0e0 + (model->HSMHV_muesrl / pow (LG, model->HSMHV_mueslp))) - * (1.0e0 + (model->HSMHV_muesrw / pow (WG, model->HSMHV_mueswp))) ; - - /* Coefficients of Qbm for Eeff */ - T1 = pow( LG, model->HSMHV_ndeplp ) ; - here->HSMHV_ndep_o_esi = ( pParam->HSMHV_ndep * T1 ) / ( T1 + model->HSMHV_ndepl ) - / C_ESI ; - here->HSMHV_ninv_o_esi = pParam->HSMHV_ninv / C_ESI ; - here->HSMHV_ninvd0 = model->HSMHV_ninvd * ( 1.0 + (model->HSMHV_ninvdw / pow( WG, model->HSMHV_ninvdwp))); - - /* Metallurgical channel geometry */ - dL = model->HSMHV_xld - + (modelMKS->HSMHV_ll / pow (Lgate + model->HSMHV_lld, model->HSMHV_lln)) ; - dLLD = model->HSMHV_xldld - + (modelMKS->HSMHV_ll / pow (Lgate + model->HSMHV_lld, model->HSMHV_lln)) ; - - dW = model->HSMHV_xwd - + (modelMKS->HSMHV_wl / pow (Wgate + model->HSMHV_wld, model->HSMHV_wln)) ; - dWLD = model->HSMHV_xwdld - + (modelMKS->HSMHV_wl / pow (Wgate + model->HSMHV_wld, model->HSMHV_wln)) ; - dWCV = model->HSMHV_xwdc - + (modelMKS->HSMHV_wl / pow (Wgate + model->HSMHV_wld, model->HSMHV_wln)) ; - - Leff = Lgate - ( dL + dLLD ) ; - if ( Leff <= 0.0 ) { - SPfrontEnd->IFerrorf - ( - ERR_FATAL, - "HiSIM_HV: MOSFET(%s) MODEL(%s): effective channel length is negative or 0", - model->HSMHVmodName, here->HSMHVname); - return (E_BADPARM); - } - here->HSMHV_leff = Leff ; - - /* Wg dependence for short channel devices */ - here->HSMHV_lgatesm = Lgate + model->HSMHV_wl1 / pow( WL , model->HSMHV_wl1p ) ; - here->HSMHV_dVthsm = pParam->HSMHV_wl2 / pow( WL , model->HSMHV_wl2p ) ; - - /* Lg dependence of wsti */ - T1 = 1.0e0 + model->HSMHV_wstil / pow( here->HSMHV_lgatesm * C_m2um , model->HSMHV_wstilp ) ; - T2 = 1.0e0 + model->HSMHV_wstiw / pow( WG , model->HSMHV_wstiwp ) ; - here->HSMHV_wsti = pParam->HSMHV_wsti * T1 * T2 ; - - here->HSMHV_weff = Weff = Wgate - 2.0e0 * dW ; - here->HSMHV_weff_ld = Wgate - 2.0e0 * dWLD ; - here->HSMHV_weff_cv = Wgate - 2.0e0 * dWCV ; - if ( Weff <= 0.0 ) { - SPfrontEnd->IFerrorf - ( - ERR_FATAL, - "HiSIM_HV: MOSFET(%s) MODEL(%s): effective channel width is negative or 0", - model->HSMHVmodName, here->HSMHVname); - return (E_BADPARM); - } - here->HSMHV_weff_nf = Weff * here->HSMHV_nf ; - here->HSMHV_weffcv_nf = here->HSMHV_weff_cv * here->HSMHV_nf ; - - /* Surface impurity profile */ - /* Note: Sign Changed --> */ - Nsubpp = here->HSMHV_nsubp - * (1.0e0 + (model->HSMHV_nsubp0 / pow (WG, model->HSMHV_nsubwp))) ; - /* <-- Note: Sign Changed */ - - if (Lod_half > 0.0) { - T1 = 1.0e0 / (1.0e0 + pParam->HSMHV_nsubpsti2) ; - T2 = pow (pParam->HSMHV_nsubpsti1 / Lod_half, pParam->HSMHV_nsubpsti3) ; - T3 = pow (pParam->HSMHV_nsubpsti1 / Lod_half_ref, pParam->HSMHV_nsubpsti3) ; - Nsubps = Nsubpp * (1.0e0 + T1 * T2) / (1.0e0 + T1 * T3) ; - } else { - Nsubps = Nsubpp ; - } - - here->HSMHV_nsubc *= 1.0e0 + ( model->HSMHV_nsubcw / pow ( WG, model->HSMHV_nsubcwp )) ; - - if( Lgate > model->HSMHV_lp ){ - Nsub = (here->HSMHV_nsubc * (Lgate - model->HSMHV_lp) - + Nsubps * model->HSMHV_lp) / Lgate ; - } else { - Nsub = Nsubps - + (Nsubps - here->HSMHV_nsubc) * (model->HSMHV_lp - Lgate) - / model->HSMHV_lp ; - } - T3 = 0.5e0 * Lgate - model->HSMHV_lp ; - T1 = 1.0e0 / ( 1.0e0 / T3 + 1.0e0 / model->HSMHV_lpext ) ; - T2 = Fn_Max (0.0e0, T1) ; - here->HSMHV_nsub = - Nsub = Nsub + T2 * (Npext - here->HSMHV_nsubc) / Lgate ; - here->HSMHV_qnsub = q_Nsub = C_QE * Nsub ; - here->HSMHV_qnsub_esi = q_Nsub * C_ESI ; - here->HSMHV_2qnsub_esi = 2.0 * here->HSMHV_qnsub_esi ; - - /* Pocket Overlap (temperature-independent part) */ - if ( Lgate <= 2.0e0 * model->HSMHV_lp ) { - Nsubb = 2.0e0 * Nsubps - - (Nsubps - here->HSMHV_nsubc) * Lgate - / model->HSMHV_lp - here->HSMHV_nsubc ; - here->HSMHV_ptovr0 = log (Nsubb / here->HSMHV_nsubc) ; - /* here->HSMHV_ptovr0 will be divided by beta later. */ - } else { - here->HSMHV_ptovr0 = 0.0e0 ; - } - - /* costi0 and costi1 for STI transistor model (temperature-independent part) */ - here->HSMHV_costi00 = sqrt (2.0 * C_QE * pParam->HSMHV_nsti * C_ESI ) ; - here->HSMHV_nsti_p2 = 1.0 / ( pParam->HSMHV_nsti * pParam->HSMHV_nsti ) ; - - /* Velocity Temperature Dependence (Temperature-dependent part will be multiplied later.) */ - here->HSMHV_vmax0 = (1.0e0 + (pParam->HSMHV_vover / pow (LG, model->HSMHV_voverp))) - * (1.0e0 + (model->HSMHV_vovers / pow (WL, model->HSMHV_voversp))) ; - - /* 2 phi_B (temperature-independent) */ - /* @300K, with pocket */ - here->HSMHV_pb20 = 2.0e0 / C_b300 * log (Nsub / C_Nin0) ; - /* @300K, w/o pocket */ - here->HSMHV_pb2c = 2.0e0 / C_b300 * log (here->HSMHV_nsubc / C_Nin0) ; - - - /* constant for Poly depletion */ - here->HSMHV_cnstpgd = pow ( 1e0 + 1e0 / LG , model->HSMHV_pgd4 ) - * pParam->HSMHV_pgd1 ; - - - - - /* Gate resistance */ - if ( here->HSMHV_corg == 1 ) { - T1 = here->HSMHV_xgw + Weff / (3.0e0 * here->HSMHV_ngcon); - T2 = Lgate - here->HSMHV_xgl; - here->HSMHV_grg = model->HSMHV_rshg * T1 / (here->HSMHV_ngcon * T2 * here->HSMHV_nf); - if (here->HSMHV_grg > 1.0e-3) here->HSMHV_grg = here->HSMHV_m / here->HSMHV_grg; - else { - here->HSMHV_grg = here->HSMHV_m * 1.0e3; - printf("warning(HiSIM_HV): The gate conductance reset to 1.0e3 mho.\n"); - } - } - - /* Process source/drain series resistamce */ - - if ( model->HSMHV_rsh > 0.0 ) { - here->HSMHV_rd0 = model->HSMHV_rsh * here->HSMHV_nrd ; - } else { - here->HSMHV_rd0 = 0.0 ; - } - if ( pParam->HSMHV_rd > 0.0 || pParam->HSMHV_rs > 0.0 ) { - here->HSMHV_rdtemp0 = 1.0 + model->HSMHV_rds / pow( WL , model->HSMHV_rdsp ) ; - if( pParam->HSMHV_rdvd != 0.0 ){ - T7 = ( 1.0 + model->HSMHV_rdvds / pow( WL , model->HSMHV_rdvdsp ) ); - T6 = ( - model->HSMHV_rdvdl * pow( LG , model->HSMHV_rdvdlp ) ) ; - if(T6 > large_arg) T6 = large_arg ; - T6 = exp( T6 ) ; - here->HSMHV_rdvdtemp0 = T6 * T7 ; - } - } - if( pParam->HSMHV_rd23 != 0.0 ){ - T2 = ( 1.0 + model->HSMHV_rd23s / pow( WL , model->HSMHV_rd23sp ) ); - T1 = ( - model->HSMHV_rd23l * pow( LG , model->HSMHV_rd23lp ) ) ; - if(T1 > large_arg) T1 = large_arg ; - T1 = exp( T1 ) ; - T3 = pParam->HSMHV_rd23 * T2 * T1 ; - here->HSMHV_rd23 = 0.5 * ( T3 + sqrt ( T3 * T3 + 4.0 * dlt_rd23 * dlt_rd23 ) ) ; - } else { - here->HSMHV_rd23 = 0.0 ; - } - if ( model->HSMHV_rsh > 0.0 ) { - here->HSMHV_rs0 = model->HSMHV_rsh * here->HSMHV_nrs ; - } else { - here->HSMHV_rs0 = 0.0 ; - } - - - /* Body resistance */ - if ( here->HSMHV_corbnet == 1 ) { - if (here->HSMHV_rbpb < 1.0e-3) here->HSMHV_grbpb = here->HSMHV_m * 1.0e3 ; - else here->HSMHV_grbpb = here->HSMHV_m * ( model->HSMHV_gbmin + 1.0 / here->HSMHV_rbpb ) ; - - if (here->HSMHV_rbps < 1.0e-3) here->HSMHV_grbps = here->HSMHV_m * 1.0e3 ; - else here->HSMHV_grbps = here->HSMHV_m * ( model->HSMHV_gbmin + 1.0 / here->HSMHV_rbps ) ; - - if (here->HSMHV_rbpd < 1.0e-3) here->HSMHV_grbpd = here->HSMHV_m * 1.0e3 ; - else here->HSMHV_grbpd = here->HSMHV_m * ( model->HSMHV_gbmin + 1.0 / here->HSMHV_rbpd ) ; - } - - /* Vdseff */ - T1 = model->HSMHV_ddltslp * LG + model->HSMHV_ddltict ; - if ( T1 < 0.0 ) { T1 = 0.0 ; } - here->HSMHV_ddlt = T1 * model->HSMHV_ddltmax / ( T1 + model->HSMHV_ddltmax ) + 1.0 ; - - /* Isub */ - T2 = pow( Weff , model->HSMHV_svgswp ) ; - here->HSMHV_vg2const = pParam->HSMHV_svgs - * ( 1.0e0 - + modelMKS->HSMHV_svgsl / pow( here->HSMHV_lgate , model->HSMHV_svgslp ) ) - * ( T2 / ( T2 + modelMKS->HSMHV_svgsw ) ) ; - - here->HSMHV_xvbs = pParam->HSMHV_svbs - * ( 1.0e0 - + modelMKS->HSMHV_svbsl / pow( here->HSMHV_lgate , model->HSMHV_svbslp ) ) ; - here->HSMHV_xgate = modelMKS->HSMHV_slg - * ( 1.0 - + modelMKS->HSMHV_slgl / pow( here->HSMHV_lgate , model->HSMHV_slglp ) ) ; - - here->HSMHV_xsub1 = pParam->HSMHV_sub1 - * ( 1.0 - + modelMKS->HSMHV_sub1l / pow( here->HSMHV_lgate , model->HSMHV_sub1lp ) ) ; - - here->HSMHV_xsub2 = pParam->HSMHV_sub2 - * ( 1.0 + modelMKS->HSMHV_sub2l / here->HSMHV_lgate ) ; - - /* Fringing capacitance */ - here->HSMHV_cfrng = C_EOX / ( C_Pi / 2.0e0 ) * here->HSMHV_weff_nf - * log( 1.0e0 + model->HSMHV_tpoly / model->HSMHV_tox ) ; - - /* Additional term of lateral-field-induced capacitance */ - here->HSMHV_cqyb0 = C_m2um * here->HSMHV_weff_nf - * model->HSMHV_xqy1 / pow( LG , model->HSMHV_xqy2 ) ; - - /* Self heating */ - pParam->HSMHV_rth = pParam->HSMHV_rth0 / ( here->HSMHV_m * here->HSMHV_weff_nf ) - * ( 1.0 + model->HSMHV_rth0w / pow( WG , model->HSMHV_rth0wp ) ); - pParam->HSMHV_cth = modelMKS->HSMHV_cth0 * ( here->HSMHV_m * here->HSMHV_weff_nf ) ; - - pParam->HSMHV_rth *= ( 1.0 / pow( here->HSMHV_nf , model->HSMHV_rth0nf ) ) ; - - here->HSMHV_rthtemp0 = 1.0 / pow( here->HSMHV_nf , model->HSMHV_rth0nf ) / ( here->HSMHV_m * here->HSMHV_weff_nf ) - * ( 1.0 + model->HSMHV_rth0w / pow( WG , model->HSMHV_rth0wp ) ); - - - /*-----------------------------------------------------------* - * Temperature dependent constants. - *-----------------*/ - if ( here->HSMHVtempNode < 0 || pParam->HSMHV_rth0 == 0.0 ) { - -#include "hsmhvtemp_eval.h" - - } /* end of if ( here->HSMHVtempNode < 0 || pParam->HSMHV_rth0 == 0.0 ) */ - - } - } - return(OK); -} diff --git a/src/spicelib/devices/hisimhv1/hsmhvtemp_eval.h b/src/spicelib/devices/hisimhv1/hsmhvtemp_eval.h deleted file mode 100644 index cccc90fc0..000000000 --- a/src/spicelib/devices/hisimhv1/hsmhvtemp_eval.h +++ /dev/null @@ -1,382 +0,0 @@ -/*********************************************************************** - - HiSIM (Hiroshima University STARC IGFET Model) - Copyright (C) 2012 Hiroshima University & STARC - - MODEL NAME : HiSIM_HV - ( VERSION : 1 SUBVERSION : 2 REVISION : 4 ) - Model Parameter VERSION : 1.23 - FILE : hsmhvtemp_eval.h - - DATE : 2013.04.30 - - released by - Hiroshima University & - Semiconductor Technology Academic Research Center (STARC) -***********************************************************************/ -#define C_rdtemp_min 5.0e-3 -#define C_rdtemp_dlt 1.0e-2 - - TTEMP = ckt->CKTtemp; - if ( here->HSMHV_dtemp_Given ) { TTEMP = TTEMP + here->HSMHV_dtemp ; } - TTEMP0 = TTEMP ; -#ifdef HSMHVEVAL - /* Self heating */ - TTEMP = TTEMP + deltemp ; -#endif -/*Tdiff0 = TTEMP0 - model->HSMHV_ktnom ;*/ -/*Tdiff0_2 = TTEMP0 * TTEMP0 - model->HSMHV_ktnom * model->HSMHV_ktnom ;*/ -Tdiff = TTEMP - model->HSMHV_ktnom ; -Tdiff_2 = TTEMP * TTEMP - model->HSMHV_ktnom * model->HSMHV_ktnom ; - - /* Band gap */ - T1 = TTEMP - model->HSMHV_ktnom ; - T2 = TTEMP * TTEMP - model->HSMHV_ktnom * model->HSMHV_ktnom ; - here->HSMHV_eg = Eg = here->HSMHV_egtnom - pParam->HSMHV_bgtmp1 * T1 - - pParam->HSMHV_bgtmp2 * T2 ; - here->HSMHV_sqrt_eg = sqrt( Eg ) ; -#ifdef HSMHVEVAL - Eg_dT = -pParam->HSMHV_bgtmp1 - 2.0e0 * TTEMP * pParam->HSMHV_bgtmp2 ; -#endif - - T1 = 1.0 / TTEMP ; - T2 = 1.0 / model->HSMHV_ktnom ; - T3 = here->HSMHV_egtnom + model->HSMHV_egig - + model->HSMHV_igtemp2 * ( T1 - T2 ) - + model->HSMHV_igtemp3 * ( T1 * T1 - T2 * T2 ) ; - here->HSMHV_egp12 = sqrt ( T3 ) ; - here->HSMHV_egp32 = T3 * here->HSMHV_egp12 ; - - - /* Inverse of the thermal voltage */ - here->HSMHV_beta = beta = C_QE / (C_KB * TTEMP) ; - here->HSMHV_beta_inv = 1.0 / beta ; - here->HSMHV_beta2 = beta * beta ; - here->HSMHV_betatnom = C_QE / (C_KB * model->HSMHV_ktnom) ; -#ifdef HSMHVEVAL - beta_dT=-C_QE/(C_KB*TTEMP*TTEMP); - beta_inv_dT = C_KB / C_QE ; -#endif - - /* Intrinsic carrier concentration */ - here->HSMHV_nin = Nin = C_Nin0 * Fn_Pow (TTEMP / model->HSMHV_ktnom, 1.5e0) - * exp (- Eg / 2.0e0 * beta + here->HSMHV_egtnom / 2.0e0 * here->HSMHV_betatnom) ; -#ifdef HSMHVEVAL - Nin_dT = C_Nin0 * exp (- Eg / 2.0e0 * beta + here->HSMHV_egtnom / 2.0e0 * here->HSMHV_betatnom) - * 1.5e0 * Fn_Pow ( TTEMP / model->HSMHV_ktnom , 0.5e0 ) / model->HSMHV_ktnom - + C_Nin0 * Fn_Pow (TTEMP / model->HSMHV_ktnom, 1.5e0) - * exp (- Eg / 2.0e0 * beta + here->HSMHV_egtnom / 2.0e0 * here->HSMHV_betatnom) - * ( - Eg / 2.0e0 * beta_dT - beta / 2.0e0 * Eg_dT ); -#endif - - /* Phonon Scattering (temperature-dependent part) */ - T1 = Fn_Pow (TTEMP / model->HSMHV_ktnom, pParam->HSMHV_muetmp) ; - here->HSMHV_mphn0 = T1 / here->HSMHV_mueph ; - here->HSMHV_mphn1 = here->HSMHV_mphn0 * model->HSMHV_mueph0 ; -#ifdef HSMHVEVAL - T1_dT = pParam->HSMHV_muetmp * Fn_Pow(TTEMP / model->HSMHV_ktnom, pParam->HSMHV_muetmp - 1.0 ) - / model->HSMHV_ktnom ; - mphn0_dT = T1_dT / here->HSMHV_mueph ; -#endif - - /* Pocket Overlap (temperature-dependent part) */ - here->HSMHV_ptovr = here->HSMHV_ptovr0 / beta ; -#ifdef HSMHVEVAL - ptovr_dT = here->HSMHV_ptovr0 * beta_inv_dT ; -#endif - - /* Velocity Temperature Dependence */ - T1 = TTEMP / model->HSMHV_ktnom ; - T3 = TTEMP0 - model->HSMHV_ktnom ; - T4 = TTEMP0 * TTEMP0 - model->HSMHV_ktnom * model->HSMHV_ktnom ; - T0 = 1.8 + 0.4 * T1 + 0.1 * T1 * T1 - pParam->HSMHV_vtmp * (1.0 - T1) ; - if ( model->HSMHV_cotemp != 2 ) { /* without deltemp (COTEMP=0,1,3) */ - here->HSMHV_vmax = here->HSMHV_vmax0 * pParam->HSMHV_vmax - / T0 - * ( 1.0 + model->HSMHV_vmaxt1 * T3 + model->HSMHV_vmaxt2 * T4 ) ; -#ifdef HSMHVEVAL - Vmax_dT=-here->HSMHV_vmax0 * pParam->HSMHV_vmax - / ( T0 * T0 ) * ( 1.0 + model->HSMHV_vmaxt1 * T3 + model->HSMHV_vmaxt2 * T4 ) - * 1/model->HSMHV_ktnom * (0.4 + 0.2 * T1 + pParam->HSMHV_vtmp) ; -#endif - } else { /* with deltemp (COTEMP=2) */ - here->HSMHV_vmax = here->HSMHV_vmax0 * pParam->HSMHV_vmax - / T0 - * ( 1.0 + model->HSMHV_vmaxt1 * Tdiff + model->HSMHV_vmaxt2 * Tdiff_2 ) ; -#ifdef HSMHVEVAL - /* under development */ - Vmax_dT = here->HSMHV_vmax0 * pParam->HSMHV_vmax - / ( T0 * T0 ) - * ( ( model->HSMHV_vmaxt1 + 2.0 * TTEMP * model->HSMHV_vmaxt2 ) * T0 - - ( 1.0 + model->HSMHV_vmaxt1 * Tdiff + model->HSMHV_vmaxt2 * Tdiff_2 ) - * 1/model->HSMHV_ktnom * (0.4 + 0.2 * T1 + pParam->HSMHV_vtmp) ) ; -#endif - } - if ( model->HSMHV_cotemp != 2 ) { /* without deltemp (COTEMP=0,1,3) */ - here->HSMHV_ninvd = here->HSMHV_ninvd0 * ( 1.0 + model->HSMHV_ninvdt1 * T3 + model->HSMHV_ninvdt2 * T4 ) ; -#ifdef HSMHVEVAL - ninvd_dT = 0.0 ; -#endif - } else { /* with deltemp (COTEMP=2) */ - /* under development */ - here->HSMHV_ninvd = here->HSMHV_ninvd0 * ( 1.0 + model->HSMHV_ninvdt1 * Tdiff + model->HSMHV_ninvdt2 * Tdiff_2 ) ; -#ifdef HSMHVEVAL - ninvd_dT = here->HSMHV_ninvd0 * ( model->HSMHV_ninvdt1 + 2.0 * TTEMP * model->HSMHV_ninvdt2 ) ; -#endif - } - - /* Temperature Dependence of RTH0 */ - pParam->HSMHV_rth = ( pParam->HSMHV_rth0 + model->HSMHV_rthtemp1 * T3 + model->HSMHV_rthtemp2 * T4 ) * here->HSMHV_rthtemp0 ; - - - /* Temperature Dependence of POWRAT */ - T2 = pParam->HSMHV_powrat + model->HSMHV_prattemp1 * T3 + model->HSMHV_prattemp2 * T4 ; - Fn_SL( T2 , T2 , 0 , 0.05 , T0 ); - Fn_SU( here->HSMHV_powratio , T2 , 1 , 0.05 , T0 ); - - - /* 2 phi_B (temperature-dependent) */ - /* @temp, with pocket */ - here->HSMHV_pb2 = 2.0e0 / beta * log (here->HSMHV_nsub / Nin) ; -#ifdef HSMHVEVAL - Pb2_dT = - (here->HSMHV_pb2 * beta_dT + 2.0e0 / Nin * Nin_dT ) / beta ; -#endif - - /* Depletion Width */ - T1 = 2.0e0 * C_ESI / C_QE ; - here->HSMHV_wdpl = sqrt ( T1 / here->HSMHV_nsub ) ; - here->HSMHV_wdplp = sqrt( T1 / ( here->HSMHV_nsubp ) ) ; - - /* Coefficient of the F function for bulk charge */ - here->HSMHV_cnst0 = sqrt ( 2.0 * C_ESI * C_QE * here->HSMHV_nsub / beta ) ; - - /* cnst1: n_{p0} / p_{p0} */ - T1 = Nin / here->HSMHV_nsub ; - here->HSMHV_cnst1 = T1 * T1 ; -#ifdef HSMHVEVAL - cnst0_dT = 0.5e0 / here->HSMHV_cnst0 * 2.0 * C_ESI * C_QE * here->HSMHV_nsub * beta_inv_dT ; - cnst1_dT = 2.0e0 * Nin * Nin_dT / here->HSMHV_nsub / here->HSMHV_nsub ; -#endif - - if ( pParam->HSMHV_nover != 0.0 ) { - here->HSMHV_cnst0over = here->HSMHV_cnst0 * sqrt( pParam->HSMHV_nover / here->HSMHV_nsub ) ; -#ifdef HSMHVEVAL - cnst0over_dT = cnst0_dT * sqrt( pParam->HSMHV_nover / here->HSMHV_nsub ) ; -#endif - /* ps0ldinib : Ps0_iniB for Ps0LD */ - T1 = here->HSMHV_cnst0over * model->HSMHV_tox / here->HSMHV_cecox ; - T2 = pParam->HSMHV_nover / Nin ; - here->HSMHV_ps0ldinib = T2 * T2 / ( T1 * T1 ); -#ifdef HSMHVEVAL - T1_dT = cnst0over_dT * model->HSMHV_tox / here->HSMHV_cecox ; - T2_dT = - Nin_dT * T2 / Nin; - ps0ldinib_dT = 2.0 * here->HSMHV_ps0ldinib * ( T2_dT * T1 - T2 * T1_dT ) / ( T1 * T2 ); -#endif - } - if ( pParam->HSMHV_novers != 0.0 ) { - here->HSMHV_cnst0overs = here->HSMHV_cnst0 * sqrt( pParam->HSMHV_novers / here->HSMHV_nsub ) ; -#ifdef HSMHVEVAL - cnst0overs_dT = cnst0_dT * sqrt( pParam->HSMHV_novers / here->HSMHV_nsub ) ; -#endif - /* ps0ldinib : Ps0_iniB for Ps0LD */ - T1 = here->HSMHV_cnst0overs * model->HSMHV_tox / here->HSMHV_cecox ; - T2 = pParam->HSMHV_novers / Nin ; - here->HSMHV_ps0ldinibs = T2 * T2 / ( T1 * T1 ); -#ifdef HSMHVEVAL - T1_dT = cnst0overs_dT * model->HSMHV_tox / here->HSMHV_cecox ; - T2_dT = - Nin_dT * T2 / Nin; - ps0ldinibs_dT = 2.0 * here->HSMHV_ps0ldinibs * ( T2_dT * T1 - T2 * T1_dT ) / ( T1 * T2 ); -#endif - } - - /* temperature-dependent resistance model */ - T3 = model->HSMHV_ktnom ; - T1 = TTEMP0 - T3 ; - T4 = TTEMP0 * TTEMP0 - T3 * T3 ; - /* drain side */ - if ( pParam->HSMHV_rd > 0.0 ) { - T2 = here->HSMHV_rdtemp0 - * ( here->HSMHV_ldrift1 * pParam->HSMHV_rdslp1 * C_m2um + pParam->HSMHV_rdict1 ) - * ( here->HSMHV_ldrift2 * model->HSMHV_rdslp2 * C_m2um + model->HSMHV_rdict2 ) ; - - if ( model->HSMHV_cotemp == 1 ) { /* without deltemp (COTEMP=1) */ - here->HSMHV_rd = ( pParam->HSMHV_rd + T1 * modelMKS->HSMHV_rdtemp1 + modelMKS->HSMHV_rdtemp2 * T4 ) * T2 ; - Fn_SL( here->HSMHV_rd, here->HSMHV_rd, C_rdtemp_min * pParam->HSMHV_rd, C_rdtemp_dlt * pParam->HSMHV_rd, T0 ); -#ifdef HSMHVEVAL - Rd0_dT = 0.0 ; -#endif - } else { /* with deltemp (COTEMP=0,2,3) */ - here->HSMHV_rd = ( pParam->HSMHV_rd + modelMKS->HSMHV_rdtemp1 * Tdiff + modelMKS->HSMHV_rdtemp2 * Tdiff_2 ) * T2 ; - Fn_SL( here->HSMHV_rd, here->HSMHV_rd, C_rdtemp_min * pParam->HSMHV_rd, C_rdtemp_dlt * pParam->HSMHV_rd, T0 ); -#ifdef HSMHVEVAL - Rd0_dT = ( modelMKS->HSMHV_rdtemp1 + 2.0 * TTEMP * modelMKS->HSMHV_rdtemp2 ) * T2 * T0 ; -#endif - } - - } else { - here->HSMHV_rd = 0.0 ; - } - /* source side (asymmetric case) */ - if ( pParam->HSMHV_rs > 0.0 ) { - T2 = here->HSMHV_rdtemp0 - * ( here->HSMHV_ldrift1s * pParam->HSMHV_rdslp1 * C_m2um + pParam->HSMHV_rdict1 ) - * ( here->HSMHV_ldrift2s * model->HSMHV_rdslp2 * C_m2um + model->HSMHV_rdict2 ) ; - - if ( model->HSMHV_cotemp == 1 ) { /* without deltemp (COTEMP=1) */ - here->HSMHV_rs = ( pParam->HSMHV_rs + T1 * modelMKS->HSMHV_rdtemp1 + modelMKS->HSMHV_rdtemp2 * T4 ) * T2 ; - Fn_SL( here->HSMHV_rs, here->HSMHV_rs, C_rdtemp_min * pParam->HSMHV_rs, C_rdtemp_dlt * pParam->HSMHV_rs, T0 ); -#ifdef HSMHVEVAL - Rs0_dT = 0.0 ; -#endif - } else { /* with deltemp (COTEMP=0,2,3) */ - here->HSMHV_rs = ( pParam->HSMHV_rs + modelMKS->HSMHV_rdtemp1 * Tdiff + modelMKS->HSMHV_rdtemp2 * Tdiff_2 ) * T2 ; - Fn_SL( here->HSMHV_rs, here->HSMHV_rs, C_rdtemp_min * pParam->HSMHV_rs, C_rdtemp_dlt * pParam->HSMHV_rs, T0 ); -#ifdef HSMHVEVAL - Rs0_dT = ( modelMKS->HSMHV_rdtemp1 + 2.0 * TTEMP * modelMKS->HSMHV_rdtemp2 ) * T2 * T0 ; -#endif - } - - } else { - here->HSMHV_rs = 0.0 ; - } - if ( pParam->HSMHV_rdvd > 0.0 ) { - T4 = here->HSMHV_rdvdtemp0 * ( here->HSMHV_ldrift1 * pParam->HSMHV_rdslp1 * C_m2um + pParam->HSMHV_rdict1 ) - * ( here->HSMHV_ldrift2 * model->HSMHV_rdslp2 * C_m2um + model->HSMHV_rdict2 ) ; - - T1 = ( 1 - pParam->HSMHV_rdov13 ) * here->HSMHV_loverld * C_m2um ; - T0 = - model->HSMHV_rdov11 / ( model->HSMHV_rdov12 + small ) ; - T3 = ( T0 * here->HSMHV_loverld * C_m2um + 1.0 + model->HSMHV_rdov11 ) ; - Fn_SL( T5 , T3 * T4 , T4 , 10.0e-3 , T6 ) ; - Fn_SU( T7 , T5 , T4 * ( model->HSMHV_rdov11 + 1.0) , 50.0e-6 , T6 ) ; - Fn_SL( T2 , T7 + T1 * T4 , 0, 50.0e-6 , T6 ) ; - - T3 = model->HSMHV_ktnom ; - T1 = TTEMP0 - T3 ; - if ( model->HSMHV_cotemp == 0 || model->HSMHV_cotemp == 1 ) { /* without deltemp (COTEMP=0,1) */ - here->HSMHV_rdvd = ( pParam->HSMHV_rdvd + T1 * modelMKS->HSMHV_rdvdtemp1 + modelMKS->HSMHV_rdvdtemp2 * ( TTEMP0 * TTEMP0 - T3 * T3 ) ) * T2 ; - Fn_SL( here->HSMHV_rdvd, here->HSMHV_rdvd, C_rdtemp_min * pParam->HSMHV_rdvd, C_rdtemp_dlt * pParam->HSMHV_rdvd, T0 ); -#ifdef HSMHVEVAL - Rdvd_dT = 0.0 ; -#endif - } else { /* with deltemp (COTEMP=2,3) */ - here->HSMHV_rdvd = ( pParam->HSMHV_rdvd + modelMKS->HSMHV_rdvdtemp1 * Tdiff + modelMKS->HSMHV_rdvdtemp2 * Tdiff_2 ) * T2 ; - Fn_SL( here->HSMHV_rdvd, here->HSMHV_rdvd, C_rdtemp_min * pParam->HSMHV_rdvd, C_rdtemp_dlt * pParam->HSMHV_rdvd, T0 ); -#ifdef HSMHVEVAL - Rdvd_dT = ( modelMKS->HSMHV_rdvdtemp1 + 2.0 * TTEMP * modelMKS->HSMHV_rdvdtemp2 ) * T2 * T0 ; -#endif - } - - T4 = here->HSMHV_rdvdtemp0 * ( here->HSMHV_ldrift1s * pParam->HSMHV_rdslp1 * C_m2um + pParam->HSMHV_rdict1 ) - * ( here->HSMHV_ldrift2s * model->HSMHV_rdslp2 * C_m2um + model->HSMHV_rdict2 ) ; - - T1 = ( 1 - pParam->HSMHV_rdov13 ) * here->HSMHV_lovers * C_m2um ; - T0 = - model->HSMHV_rdov11 / ( model->HSMHV_rdov12 + small ) ; - T3 = ( T0 * here->HSMHV_lovers * C_m2um + 1.0 + model->HSMHV_rdov11 ) ; - Fn_SL( T5 , T3 * T4 , T4 , 10.0e-3 , T6 ) ; - Fn_SU( T7 , T5 , T4 * ( model->HSMHV_rdov11 + 1.0) , 50.0e-6 , T6 ) ; - Fn_SL( T2 , T7 + T1 * T4 , 0, 50.0e-6 , T6 ) ; - - T3 = model->HSMHV_ktnom ; - T1 = TTEMP0 - T3 ; - if ( model->HSMHV_cotemp == 0 || model->HSMHV_cotemp == 1 ) { /* without deltemp (COTEMP=0,1) */ - here->HSMHV_rsvd = ( pParam->HSMHV_rdvd + T1 * modelMKS->HSMHV_rdvdtemp1 + modelMKS->HSMHV_rdvdtemp2 * ( TTEMP0 * TTEMP0 - T3 * T3 ) ) * T2 ; - Fn_SL( here->HSMHV_rsvd, here->HSMHV_rsvd, C_rdtemp_min * pParam->HSMHV_rdvd, C_rdtemp_dlt * pParam->HSMHV_rdvd, T0 ); -#ifdef HSMHVEVAL - Rsvd_dT = 0.0 ; -#endif - } else { /* with deltemp (COTEMP=2,3) */ - here->HSMHV_rsvd = ( pParam->HSMHV_rdvd + modelMKS->HSMHV_rdvdtemp1 * Tdiff + modelMKS->HSMHV_rdvdtemp2 * Tdiff_2 ) * T2 ; - Fn_SL( here->HSMHV_rsvd, here->HSMHV_rsvd, C_rdtemp_min * pParam->HSMHV_rdvd, C_rdtemp_dlt * pParam->HSMHV_rdvd, T0 ); -#ifdef HSMHVEVAL - Rsvd_dT = ( modelMKS->HSMHV_rdvdtemp1 + 2.0 * TTEMP * modelMKS->HSMHV_rdvdtemp2 ) * T2 * T0 ; -#endif - } - } else { - here->HSMHV_rdvd = 0.0 ; - here->HSMHV_rsvd = 0.0 ; - } - - /* for substrate-source/drain junction diode. */ - js = pParam->HSMHV_js0 - * exp ((here->HSMHV_egtnom * here->HSMHV_betatnom - Eg * beta - + model->HSMHV_xti * log (TTEMP / model->HSMHV_ktnom)) / pParam->HSMHV_nj) ; - jssw = pParam->HSMHV_js0sw - * exp ((here->HSMHV_egtnom * here->HSMHV_betatnom - Eg * beta - + model->HSMHV_xti * log (TTEMP / model->HSMHV_ktnom)) / model->HSMHV_njsw) ; - - js2 = pParam->HSMHV_js0 - * exp ((here->HSMHV_egtnom * here->HSMHV_betatnom - Eg * beta - + model->HSMHV_xti2 * log (TTEMP / model->HSMHV_ktnom)) / pParam->HSMHV_nj) ; - jssw2 = pParam->HSMHV_js0sw - * exp ((here->HSMHV_egtnom * here->HSMHV_betatnom - Eg * beta - + model->HSMHV_xti2 * log (TTEMP / model->HSMHV_ktnom)) / model->HSMHV_njsw) ; - -#ifdef HSMHVEVAL - T0 = - Eg * beta_dT - Eg_dT * beta ; /* Self heating */ - T1 = T0 + model->HSMHV_xti / TTEMP ; /* Self heating */ - T2 = T0 + model->HSMHV_xti2 / TTEMP ; /* Self heating */ - - js_dT = js * T1 / pParam->HSMHV_nj; /* Self heating */ - jssw_dT = jssw * T1/ model->HSMHV_njsw ; /* Self heating */ - js2_dT = js2 * T2 / pParam->HSMHV_nj; /* Self heating */ - jssw2_dT = jssw2 * T2 / model->HSMHV_njsw; /* Self heating */ -#endif - - here->HSMHV_isbd = here->HSMHV_ad * js + here->HSMHV_pd * jssw ; - here->HSMHV_isbd2 = here->HSMHV_ad * js2 + here->HSMHV_pd * jssw2 ; - here->HSMHV_isbs = here->HSMHV_as * js + here->HSMHV_ps * jssw ; - here->HSMHV_isbs2 = here->HSMHV_as * js2 + here->HSMHV_ps * jssw2 ; - -#ifdef HSMHVEVAL - isbd_dT = here->HSMHV_ad * js_dT + here->HSMHV_pd * jssw_dT ; /* Self heating */ - isbd2_dT = here->HSMHV_ad * js2_dT + here->HSMHV_pd * jssw2_dT ; /* Self heating */ - isbs_dT = here->HSMHV_as * js_dT + here->HSMHV_ps * jssw_dT ; /* Self heating */ - isbs2_dT = here->HSMHV_as * js2_dT + here->HSMHV_ps * jssw2_dT ; /* Self heating */ -#endif - - T1 = TTEMP / model->HSMHV_ktnom ; - T0 = T1 * T1 ; - T2 = here->HSMHV_isbd + small ; - T3 = here->HSMHV_isbs + small ; -#ifdef HSMHVEVAL - T1_dT = 1.0 / model->HSMHV_ktnom ; /* Self heating */ - T0_dT = 2.0 * T1 * T1_dT ; /* Self heating */ - T2_dT = isbd_dT ; /* Self heating */ - T3_dT = isbs_dT ; /* Self heating */ -#endif - - here->HSMHV_vbdt = pParam->HSMHV_nj / beta - * log ( pParam->HSMHV_vdiffj * T0 / T2 + 1.0 ) ; - here->HSMHV_vbst = pParam->HSMHV_nj / beta - * log ( pParam->HSMHV_vdiffj * T0 / T3 + 1.0 ) ; - - here->HSMHV_exptemp = exp (( T1 - 1.0 ) * model->HSMHV_ctemp ) ; - -#ifdef HSMHVEVAL - vbdt_dT = - beta_dT / beta * here->HSMHV_vbdt - + pParam->HSMHV_nj / beta * pParam->HSMHV_vdiffj / ( pParam->HSMHV_vdiffj * T0 / T2 + 1.0 ) - * ( T0_dT / T2 - T0 / T2 / T2 * T2_dT ) ; /* Self heating */ - vbst_dT = - beta_dT / beta * here->HSMHV_vbst - + pParam->HSMHV_nj / beta * pParam->HSMHV_vdiffj / ( pParam->HSMHV_vdiffj * T0 / T3 + 1.0 ) - * ( T0_dT / T3 - T0 / T3 / T3 * T3_dT ) ; /* Self heating */ -#endif - - here->HSMHV_jd_nvtm_inv = 1.0 / ( pParam->HSMHV_nj / beta ) ; - here->HSMHV_jd_expcd = exp (here->HSMHV_vbdt * here->HSMHV_jd_nvtm_inv ) ; - here->HSMHV_jd_expcs = exp (here->HSMHV_vbst * here->HSMHV_jd_nvtm_inv ) ; - -#ifdef HSMHVEVAL - exptemp_dT = model->HSMHV_ctemp / model->HSMHV_ktnom * here->HSMHV_exptemp ; /* Self heating */ - jd_nvtm_inv_dT = beta_dT / pParam->HSMHV_nj ; /* Self heating */ - jd_expcd_dT = here->HSMHV_jd_expcd - * ( vbdt_dT * here->HSMHV_jd_nvtm_inv + here->HSMHV_vbdt * jd_nvtm_inv_dT ) ; /* Self heating */ - jd_expcs_dT = here->HSMHV_jd_expcs - * ( vbst_dT * here->HSMHV_jd_nvtm_inv + here->HSMHV_vbst * jd_nvtm_inv_dT ) ; /* Self heating */ -#endif - - /* costi0 and costi1 for STI transistor model (temperature-dependent part) */ - here->HSMHV_costi0 = here->HSMHV_costi00 * sqrt(here->HSMHV_beta_inv) ; - here->HSMHV_costi0_p2 = here->HSMHV_costi0 * here->HSMHV_costi0 ; - here->HSMHV_costi1 = here->HSMHV_nin * here->HSMHV_nin * here->HSMHV_nsti_p2 ; - -/* end of HSMHVtemp_eval.h */ diff --git a/src/spicelib/devices/hisimhv1/hsmhvtrunc.c b/src/spicelib/devices/hisimhv1/hsmhvtrunc.c deleted file mode 100644 index 776cd4646..000000000 --- a/src/spicelib/devices/hisimhv1/hsmhvtrunc.c +++ /dev/null @@ -1,60 +0,0 @@ -/*********************************************************************** - - HiSIM (Hiroshima University STARC IGFET Model) - Copyright (C) 2012 Hiroshima University & STARC - - MODEL NAME : HiSIM_HV - ( VERSION : 1 SUBVERSION : 2 REVISION : 4 ) - Model Parameter VERSION : 1.23 - FILE : hsmhvtrunc.c - - DATE : 2013.04.30 - - released by - Hiroshima University & - Semiconductor Technology Academic Research Center (STARC) -***********************************************************************/ - -#include "ngspice/ngspice.h" -#include "ngspice/cktdefs.h" -#include "hsmhvdef.h" -#include "ngspice/sperror.h" -#include "ngspice/suffix.h" - -int HSMHVtrunc( - GENmodel *inModel, - register CKTcircuit *ckt, - double *timeStep) - -{ - register HSMHVmodel *model = (HSMHVmodel*)inModel; - register HSMHVinstance *here; -#ifdef STEPDEBUG - double debugtemp=0.0 ; -#endif /* STEPDEBUG */ - - for ( ;model != NULL ;model = HSMHVnextModel(model)) { - for ( here=HSMHVinstances(model);here!=NULL ; - here = HSMHVnextInstance(here)) { -#ifdef STEPDEBUG - debugtemp = *timeStep; -#endif /* STEPDEBUG */ - CKTterr(here->HSMHVqb,ckt,timeStep); - CKTterr(here->HSMHVqg,ckt,timeStep); - CKTterr(here->HSMHVqd,ckt,timeStep); - - CKTterr(here->HSMHVqbs,ckt,timeStep); - CKTterr(here->HSMHVqbd,ckt,timeStep); - CKTterr(here->HSMHVqfd,ckt,timeStep); - CKTterr(here->HSMHVqfs,ckt,timeStep); - - -#ifdef STEPDEBUG - if ( debugtemp != *timeStep ) - printf("device %s reduces step from %g to %g\n", - here->HSMHVname, debugtemp, *timeStep); -#endif /* STEPDEBUG */ - } - } - return(OK); -} diff --git a/src/spicelib/devices/hisimhv2/Makefile.am b/src/spicelib/devices/hisimhv2/Makefile.am deleted file mode 100644 index 9c48349ee..000000000 --- a/src/spicelib/devices/hisimhv2/Makefile.am +++ /dev/null @@ -1,40 +0,0 @@ -## Process this file with automake to produce Makefile.in - -noinst_LTLIBRARIES = libhisimhv2.la - -libhisimhv2_la_SOURCES = hisimhv2.h \ - hsmhv2.c \ - hsmhv2acld.c \ - hsmhv2ask.c \ - hsmhv2cvtest.c \ - hsmhv2def.h \ - hsmhv2eval.c \ - hsmhv2eval_dep.h \ - hsmhv2eval_dio.c \ - hsmhv2eval_qover.h \ - hsmhv2eval_rdrift.c \ - hsmhv2evalenv.h \ - hsmhv2ext.h \ - hsmhv2getic.c \ - hsmhv2init.c \ - hsmhv2init.h \ - hsmhv2itf.h \ - hsmhv2ld.c \ - hsmhv2ld_info_eval.h \ - hsmhv2mask.c \ - hsmhv2mpar.c \ - hsmhv2noi.c \ - hsmhv2par.c \ - hsmhv2pzld.c \ - hsmhv2set.c \ - hsmhv2soachk.c \ - hsmhv2temp.c \ - hsmhv2temp_eval.h \ - hsmhv2temp_eval_dio.h \ - hsmhv2temp_eval_rdri.h \ - hsmhv2trunc.c - -AM_CPPFLAGS = @AM_CPPFLAGS@ -I$(top_srcdir)/src/include -AM_CFLAGS = $(STATIC) - -MAINTAINERCLEANFILES = Makefile.in diff --git a/src/spicelib/devices/hisimhv2/hisimhv2.h b/src/spicelib/devices/hisimhv2/hisimhv2.h deleted file mode 100644 index 3f1448cd4..000000000 --- a/src/spicelib/devices/hisimhv2/hisimhv2.h +++ /dev/null @@ -1,140 +0,0 @@ -/*********************************************************************** - - HiSIM (Hiroshima University STARC IGFET Model) - Copyright (C) 2014 Hiroshima University & STARC - - MODEL NAME : HiSIM_HV - ( VERSION : 2 SUBVERSION : 2 REVISION : 0 ) - Model Parameter 'VERSION' : 2.20 - FILE : hisimhv.h - - DATE : 2014.6.11 - - released by - Hiroshima University & - Semiconductor Technology Academic Research Center (STARC) -***********************************************************************/ - -/********************************************************************** - -The following source code, and all copyrights, trade secrets or other -intellectual property rights in and to the source code in its entirety, -is owned by the Hiroshima University and the STARC organization. - -All users need to follow the "HISIM_HV Distribution Statement and -Copyright Notice" attached to HiSIM_HV model. - ------HISIM_HV Distribution Statement and Copyright Notice-------------- - -Software is distributed as is, completely without warranty or service -support. Hiroshima University or STARC and its employees are not liable -for the condition or performance of the software. - -Hiroshima University and STARC own the copyright and grant users a perpetual, -irrevocable, worldwide, non-exclusive, royalty-free license with respect -to the software as set forth below. - -Hiroshima University and STARC hereby disclaims all implied warranties. - -Hiroshima University and STARC grant the users the right to modify, copy, -and redistribute the software and documentation, both within the user's -organization and externally, subject to the following restrictions - -1. The users agree not to charge for Hiroshima University and STARC code -itself but may charge for additions, extensions, or support. - -2. In any product based on the software, the users agree to acknowledge -Hiroshima University and STARC that developed the software. This -acknowledgment shall appear in the product documentation. - -3. The users agree to reproduce any copyright notice which appears on -the software on any copy or modification of such made available -to others." - -Toshimasa Asahara, President, Hiroshima University -Mitiko Miura-Mattausch, Professor, Hiroshima University -Katsuhiro Shimohigashi, President&CEO, STARC -June 2008 (revised October 2011) -*************************************************************************/ - -#include "hsmhv2def.h" -#include "ngspice/cktdefs.h" - -#ifndef _HiSIMHV2_H -#define _HiSIMHV2_H - -/* return value */ -#ifndef OK -#define HiSIM_OK 0 -#define HiSIM_ERROR 1 -#else -#define HiSIM_OK OK -#define HiSIM_ERROR E_PANIC -#endif - -/* MOS type */ -#ifndef NMOS -#define NMOS 1 -#define PMOS -1 -#endif - -/* device working mode */ -#ifndef CMI_NORMAL_MODE -#define HiSIM_NORMAL_MODE 1 -#define HiSIM_REVERSE_MODE -1 -#else -#define HiSIM_NORMAL_MODE CMI_NORMAL_MODE -#define HiSIM_REVERSE_MODE CMI_REVERSE_MODE -#endif - -/* others */ -#ifndef NULL -#define NULL 0 -#endif - -#define HiSIM_FALSE 0 -#define HiSIM_TRUE 1 - -#ifndef return_if_error -#define return_if_error(s) { int error = s; if(error) return(error); } -#endif - -extern int HSMHV2evaluate -( - double ivds, - double ivgs, - double ivbs, - double ivdsi, - double ivgsi, - double ivbsi, - double vbs_jct, - double vbd_jct, - double vsubs, - double vddp, - double deltemp, - HSMHV2instance *here, - HSMHV2model *model, - CKTcircuit *ckt - ) ; -extern int HSMHV2rdrift -( - double vddp, - double ivds, - double ivbs, - double vsubs, - double deltemp, - HSMHV2instance *here, - HSMHV2model *model, - CKTcircuit *ckt - ) ; -extern int HSMHV2dio -( - double vbs_jct, - double vbd_jct, - double deltemp, - HSMHV2instance *here, - HSMHV2model *model, - CKTcircuit *ckt - ) ; - -#endif /* _HiSIMHV2_H */ diff --git a/src/spicelib/devices/hisimhv2/hsmhv2.c b/src/spicelib/devices/hisimhv2/hsmhv2.c deleted file mode 100644 index 68d0272d3..000000000 --- a/src/spicelib/devices/hisimhv2/hsmhv2.c +++ /dev/null @@ -1,934 +0,0 @@ -/*********************************************************************** - - HiSIM (Hiroshima University STARC IGFET Model) - Copyright (C) 2014 Hiroshima University & STARC - - MODEL NAME : HiSIM_HV - ( VERSION : 2 SUBVERSION : 2 REVISION : 0 ) - Model Parameter 'VERSION' : 2.20 - FILE : hsmhv.c - - DATE : 2014.6.11 - - - released by - Hiroshima University & - Semiconductor Technology Academic Research Center (STARC) -***********************************************************************/ - -/********************************************************************** - -The following source code, and all copyrights, trade secrets or other -intellectual property rights in and to the source code in its entirety, -is owned by the Hiroshima University and the STARC organization. - -All users need to follow the "HISIM_HV Distribution Statement and -Copyright Notice" attached to HiSIM_HV model. - ------HISIM_HV Distribution Statement and Copyright Notice-------------- - -Software is distributed as is, completely without warranty or service -support. Hiroshima University or STARC and its employees are not liable -for the condition or performance of the software. - -Hiroshima University and STARC own the copyright and grant users a perpetual, -irrevocable, worldwide, non-exclusive, royalty-free license with respect -to the software as set forth below. - -Hiroshima University and STARC hereby disclaims all implied warranties. - -Hiroshima University and STARC grant the users the right to modify, copy, -and redistribute the software and documentation, both within the user's -organization and externally, subject to the following restrictions - -1. The users agree not to charge for Hiroshima University and STARC code -itself but may charge for additions, extensions, or support. - -2. In any product based on the software, the users agree to acknowledge -Hiroshima University and STARC that developed the software. This -acknowledgment shall appear in the product documentation. - -3. The users agree to reproduce any copyright notice which appears on -the software on any copy or modification of such made available -to others." - -Toshimasa Asahara, President, Hiroshima University -Mitiko Miura-Mattausch, Professor, Hiroshima University -Katsuhiro Shimohigashi, President&CEO, STARC -June 2008 (revised October 2011) -*************************************************************************/ - -#include "ngspice/ngspice.h" -#include "ngspice/devdefs.h" -#include "hsmhv2def.h" -#include "ngspice/suffix.h" - -IFparm HSMHV2pTable[] = { /* parameters */ - IOP( "coselfheat", HSMHV2_COSELFHEAT, IF_INTEGER, "Calculation of self heating model"), - IOP( "cosubnode", HSMHV2_COSUBNODE, IF_INTEGER, "Switch tempNode to subNode"), - IOP( "l", HSMHV2_L, IF_REAL , "Length"), - IOP( "w", HSMHV2_W, IF_REAL , "Width"), - IOP( "ad", HSMHV2_AD, IF_REAL , "Drain area"), - IOP( "as", HSMHV2_AS, IF_REAL , "Source area"), - IOP( "pd", HSMHV2_PD, IF_REAL , "Drain perimeter"), - IOP( "ps", HSMHV2_PS, IF_REAL , "Source perimeter"), - IOP( "nrd", HSMHV2_NRD, IF_REAL , "Number of squares in drain"), - IOP( "nrs", HSMHV2_NRS, IF_REAL , "Number of squares in source"), - IOP( "dtemp", HSMHV2_DTEMP,IF_REAL , ""), - IOP( "off", HSMHV2_OFF, IF_FLAG , "Device is initially off"), - IP ( "ic", HSMHV2_IC, IF_REALVEC , "Vector of DS,GS,BS initial voltages"), - IOP("corbnet", HSMHV2_CORBNET, IF_INTEGER, "Activate body resistance (1) or not (0)"), - IOP("rbpb", HSMHV2_RBPB, IF_REAL, ""), - IOP("rbpd", HSMHV2_RBPD, IF_REAL, ""), - IOP("rbps", HSMHV2_RBPS, IF_REAL, ""), - IOP("rbdb", HSMHV2_RBDB, IF_REAL, ""), - IOP("rbsb", HSMHV2_RBSB, IF_REAL, ""), - IOP("corg", HSMHV2_CORG, IF_INTEGER, "Activate gate resistance (1) or not (0)"), - IOP("ngcon", HSMHV2_NGCON, IF_REAL, "Number of gate contacts"), - IOP("xgw", HSMHV2_XGW, IF_REAL, "Distance from gate contact to channel edge"), - IOP("xgl", HSMHV2_XGL, IF_REAL, "Offset of gate length due to variation in patterning"), - IOP("nf", HSMHV2_NF, IF_REAL, "Number of fingers"), - IOP("sa", HSMHV2_SA, IF_REAL, "Distance from STI edge to Gate edge [m]"), - IOP("sb", HSMHV2_SB, IF_REAL, "Distance from STI edge to Gate edge [m]"), - IOP("sd", HSMHV2_SD, IF_REAL, "Distance from Gate edge to Gate edge [m]"), - IOP("nsubcdfm", HSMHV2_NSUBCDFM, IF_REAL, "Constant part of Nsub for DFM [1/cm^3]"), - IOP("m", HSMHV2_M, IF_REAL, "Multiplication factor [-]"), - IOP("subld1", HSMHV2_SUBLD1, IF_REAL, "Parameter for impact-ionization current in the drift region [-]"), - IOP("subld2", HSMHV2_SUBLD2, IF_REAL, "Parameter for impact-ionization current in the drift region [m^{-1}*V^{3/2}]"), - IOP("lover", HSMHV2_LOVER, IF_REAL, "Overlap length on source side [m]"), - IOP("lovers", HSMHV2_LOVERS, IF_REAL, "Overlap length on source side [m]"), - IOP("loverld", HSMHV2_LOVERLD, IF_REAL, "Overlap length on drain side [m]"), - IOP("ldrift1", HSMHV2_LDRIFT1, IF_REAL, "Parameter for drift region length-1 [m]"), - IOP("ldrift2", HSMHV2_LDRIFT2, IF_REAL, "Parameter for drift region length-2 [m]"), - IOP("ldrift1s", HSMHV2_LDRIFT1S, IF_REAL, "Parameter for drift region length-1 on source side[m]"), - IOP("ldrift2s", HSMHV2_LDRIFT2S, IF_REAL, "Parameter for drift region length-2 on source side[m]"), - - /* Output Physical Values: */ - OP ( "ids", HSMHV2_CD, IF_REAL , "Ids"), /* Drain-Source current */ - OP ( "isub", HSMHV2_ISUB, IF_REAL , "Isub"), /* Substrate current */ - OP ( "isubld", HSMHV2_ISUBLD, IF_REAL , "IsubLD"), /* Substrate current */ - OP ( "idsibpc", HSMHV2_IDSIBPC, IF_REAL , "IdsIBPC"), /* Impact-Ionization Induced Bulk Potential Change (IBPC)*/ - OP ( "igidl", HSMHV2_IGIDL, IF_REAL , "Igidl"), /* Gate-Induced Drain Leakage current */ - OP ( "igisl", HSMHV2_IGISL, IF_REAL , "Igisl"), /* Gate-Induced Source Leakage current */ - OP ( "igd", HSMHV2_IGD, IF_REAL , "Igd"), /* Gate-Drain current */ - OP ( "igs", HSMHV2_IGS, IF_REAL , "Igs"), /* Gate-Source current */ - OP ( "igb", HSMHV2_IGB, IF_REAL , "Igb"), /* Gate-Substrate current */ - OP ( "gm", HSMHV2_GM, IF_REAL , "Gm"), /* Transconductance */ - OP ( "gds", HSMHV2_GDS, IF_REAL , "Gds"), /* Channel conductance */ - OP ( "gmbs", HSMHV2_GMBS, IF_REAL , "Gmbs"), /* Body effect (Back gate) transconductance */ - OP ( "gmt", HSMHV2_GMT, IF_REAL , "GmT"), /* Temp - transconductance ----SHE----*/ - OP ( "von", HSMHV2_VON, IF_REAL , "Von"), /* Threshold voltage */ - OP ( "vdsat", HSMHV2_VDSAT, IF_REAL , "Vdsat"), /* Saturation voltage */ - OP ( "qb", HSMHV2_QB, IF_REAL , "Qb"), /* Bulk charge */ - OP ( "qg", HSMHV2_QG, IF_REAL , "Qg"), /* Gate charge */ - OP ( "qd", HSMHV2_QD, IF_REAL , "Qd"), /* Drain charge */ - OP ( "cgg", HSMHV2_CGG, IF_REAL , "Cgg"), /* MOSFET capacitance */ - OP ( "cgd", HSMHV2_CGD, IF_REAL , "Cgd"), /* MOSFET capacitance */ - OP ( "cgs", HSMHV2_CGS, IF_REAL , "Cgs"), /* MOSFET capacitance */ - OP ( "cbg", HSMHV2_CBG, IF_REAL , "Cbg"), /* MOSFET capacitance */ - OP ( "cbs", HSMHV2_CBSB, IF_REAL , "Cbs"), /* MOSFET capacitance */ - OP ( "cbd", HSMHV2_CBDB, IF_REAL , "Cbd"), /* MOSFET capacitance */ - OP ( "cdg", HSMHV2_CDG, IF_REAL , "Cdg"), /* MOSFET capacitance */ - OP ( "cdd", HSMHV2_CDD, IF_REAL , "Cdd"), /* MOSFET capacitance */ - OP ( "cds", HSMHV2_CDS, IF_REAL , "Cds"), /* MOSFET capacitance */ - OP ( "cgdo", HSMHV2_CGDO, IF_REAL , "Cgdo"), /* MOSFET overlap capacitance */ - OP ( "cgso", HSMHV2_CGSO, IF_REAL , "Cgso"), /* MOSFET overlap capacitance */ - OP ( "cgbo", HSMHV2_CGBO, IF_REAL , "Cgbo"), /* MOSFET overlap capacitance */ - OP ( "ibd", HSMHV2_CBD, IF_REAL , "Ibd"), /* Diode current */ - OP ( "ibs", HSMHV2_CBS, IF_REAL , "Ibs"), /* Diode current */ - OP ( "gbd", HSMHV2_GBD, IF_REAL , "Gbd"), /* Diode conductance */ - OP ( "gbs", HSMHV2_GBS, IF_REAL , "Gbs"), /* Diode conductance */ - OP ( "capbd", HSMHV2_CAPBD, IF_REAL , "Capbd"), /* Diode capacitance */ - OP ( "capbs", HSMHV2_CAPBS, IF_REAL , "Capbs") /* Diode capacitance */ -}; - -IFparm HSMHV2mPTable[] = { /* model parameters */ - IP("nmos", HSMHV2_MOD_NMOS, IF_FLAG, ""), - IP("pmos", HSMHV2_MOD_PMOS, IF_FLAG, ""), - IOP("level", HSMHV2_MOD_LEVEL, IF_INTEGER, ""), - IOP("info", HSMHV2_MOD_INFO, IF_INTEGER, "Information level (for debug, etc.)"), - IOP("noise", HSMHV2_MOD_NOISE, IF_INTEGER, "Noise model selector"), - IOP("version", HSMHV2_MOD_VERSION, IF_STRING, "Model version"), - IOP("show", HSMHV2_MOD_SHOW, IF_INTEGER, "Show physical value"), - IOP("corsrd", HSMHV2_MOD_CORSRD, IF_INTEGER, "Handling of Rs and Rd"), - IOP("corg", HSMHV2_MOD_CORG, IF_INTEGER, "Activate gate resistance (1) or not (0)"), - IOP("coiprv", HSMHV2_MOD_COIPRV, IF_INTEGER, "Use ids_prv as initial guess of Ids (internal flag)"), - IOP("copprv", HSMHV2_MOD_COPPRV, IF_INTEGER, "Use ps{0/l}_prv as initial guess of Ps{0/l} (internal flag)"), - IOP("coadov", HSMHV2_MOD_COADOV, IF_INTEGER, "Add overlap to intrisic"), - IOP("coisub", HSMHV2_MOD_COISUB, IF_INTEGER, "Calculate isub"), - IOP("coiigs", HSMHV2_MOD_COIIGS, IF_INTEGER, "Calculate igate"), - IOP("cogidl", HSMHV2_MOD_COGIDL, IF_INTEGER, "Calculate igidl"), - IOP("coovlp", HSMHV2_MOD_COOVLP, IF_INTEGER, "Calculate overlap charge on the drain side"), - IOP("coovlps", HSMHV2_MOD_COOVLPS, IF_INTEGER, "Calculate overlap charge on the source side"), - IOP("coflick", HSMHV2_MOD_COFLICK, IF_INTEGER, "Calculate 1/f noise"), - IOP("coisti", HSMHV2_MOD_COISTI, IF_INTEGER, "Calculate STI"), - IOP("conqs", HSMHV2_MOD_CONQS, IF_INTEGER, "Calculate in nqs mode or qs mode"), - IOP("corbnet", HSMHV2_MOD_CORBNET, IF_INTEGER, ""), - IOP("cothrml", HSMHV2_MOD_COTHRML, IF_INTEGER, "Calculate thermal noise"), - IOP("coign", HSMHV2_MOD_COIGN, IF_INTEGER, "Calculate induced gate noise"), - IOP("codfm", HSMHV2_MOD_CODFM, IF_INTEGER, "Calculation of model for DFM"), - IOP("coqovsm", HSMHV2_MOD_COQOVSM, IF_INTEGER, "select smoothing method of Qover"), - IOP("coselfheat", HSMHV2_MOD_COSELFHEAT, IF_INTEGER, "Calculation of self heating model"), - IOP("cosubnode", HSMHV2_MOD_COSUBNODE, IF_INTEGER, "Switch tempNode to subNode"), - IOP("cosym", HSMHV2_MOD_COSYM, IF_INTEGER, "Model selector for symmetry device"), - IOP("cotemp", HSMHV2_MOD_COTEMP, IF_INTEGER, "Model flag for temperature dependence"), - IOP("coldrift", HSMHV2_MOD_COLDRIFT, IF_INTEGER, "selector for Ldrift parameter"), - IOP("cordrift", HSMHV2_MOD_CORDRIFT, IF_INTEGER, ""), - IOP("coerrrep", HSMHV2_MOD_COERRREP, IF_INTEGER, "selector for error report"), - IOP("codep", HSMHV2_MOD_CODEP, IF_INTEGER, "selector for depletion device"), - IOP("coddlt", HSMHV2_MOD_CODDLT, IF_INTEGER, "selector for DDLT model"), - - IOP("vbsmin", HSMHV2_MOD_VBSMIN, IF_REAL, "Minimum back bias voltage to be treated in hsmhveval [V]"), - - IOP("vmax", HSMHV2_MOD_VMAX, IF_REAL, "Saturation velocity [cm/s]"), - IOP("vmaxt1", HSMHV2_MOD_VMAXT1, IF_REAL, "Saturation velocity coeff. [-]"), - IOP("vmaxt2", HSMHV2_MOD_VMAXT2, IF_REAL, "Saturation velocity coeff. [-]"), - IOP("bgtmp1", HSMHV2_MOD_BGTMP1, IF_REAL, "First order temp. coeff. for band gap [V/K]"), - IOP("bgtmp2", HSMHV2_MOD_BGTMP2, IF_REAL, "Second order temp. coeff. for band gap [V/K^2]"), - IOP("eg0", HSMHV2_MOD_EG0, IF_REAL, ""), - IOP("tox", HSMHV2_MOD_TOX, IF_REAL, "Oxide thickness [m]"), - IOP("xld", HSMHV2_MOD_XLD, IF_REAL, "Lateral diffusion of S/D under the gate [m]"), - IOP("xldld", HSMHV2_MOD_XLDLD, IF_REAL, "Lateral diffusion of Drain under the gate [m]"), - IOP("xwdld", HSMHV2_MOD_XWDLD, IF_REAL, ""), - IOP("lover", HSMHV2_MOD_LOVER, IF_REAL, "Overlap length on source side [m], alias for lovers"), - IOP("lovers", HSMHV2_MOD_LOVERS, IF_REAL, "Overlap length on source side [m]"), - IOP("rdov11", HSMHV2_MOD_RDOV11, IF_REAL, "Dependence coeff. for overlap length"), - IOP("rdov12", HSMHV2_MOD_RDOV12, IF_REAL, "Dependence coeff. for overlap length"), - IOP("rdov13", HSMHV2_MOD_RDOV13, IF_REAL, "Dependence coeff. for overlap length"), - IOP("rdslp1", HSMHV2_MOD_RDSLP1, IF_REAL, "LDRIFT1 dependence of resistance for CORSRD=1,3"), - IOP("rdict1", HSMHV2_MOD_RDICT1, IF_REAL, "LDRIFT1 dependence of resistance for CORSRD=1,3"), - IOP("rdslp2", HSMHV2_MOD_RDSLP2, IF_REAL, "LDRIFT2 dependence of resistance for CORSRD=1,3"), - IOP("rdict2", HSMHV2_MOD_RDICT2, IF_REAL, "LDRIFT2 dependence of resistance for CORSRD=1,3"), - IOP("loverld", HSMHV2_MOD_LOVERLD, IF_REAL, "Overlap length on the drain side"), - IOP("ldrift1", HSMHV2_MOD_LDRIFT1, IF_REAL, "Drift region length-1 on the drain side[m]"), - IOP("ldrift2", HSMHV2_MOD_LDRIFT2, IF_REAL, "Drift region length-2 on the drain side[m]"), - IOP("ldrift1s", HSMHV2_MOD_LDRIFT1S, IF_REAL, "Drift region length-1 on the source side[m]"), - IOP("ldrift2s", HSMHV2_MOD_LDRIFT2S, IF_REAL, "Drift region length-2 on the source side[m]"), - IOP("subld1", HSMHV2_MOD_SUBLD1, IF_REAL, "Impact-ionization current in the drift region [-]"), - IOP("subld1l", HSMHV2_MOD_SUBLD1L, IF_REAL, "Impact-ionization current in the drift region [um^{subld1lp}]"), - IOP("subld1lp", HSMHV2_MOD_SUBLD1LP, IF_REAL, "Impact-ionization current in the drift region [-]"), - IOP("subld2", HSMHV2_MOD_SUBLD2, IF_REAL, "Impact-ionization current in the drift region [m^{-1}*V^{3/2}]"), - IOP("xpdv", HSMHV2_MOD_XPDV, IF_REAL, "Impact-ionization current in the drift region [m^{-1}]"), - IOP("xpvdth", HSMHV2_MOD_XPVDTH, IF_REAL, "Impact-ionization current in the drift region [V]"), - IOP("xpvdthg", HSMHV2_MOD_XPVDTHG, IF_REAL, "Impact-ionization current in the drift region [V^{-1}]"), - IOP("ddltmax", HSMHV2_MOD_DDLTMAX, IF_REAL, ""), /* Vdseff */ - IOP("ddltslp", HSMHV2_MOD_DDLTSLP, IF_REAL, ""), /* Vdseff */ - IOP("ddltict", HSMHV2_MOD_DDLTICT, IF_REAL, ""), /* Vdseff */ - IOP("vfbover", HSMHV2_MOD_VFBOVER, IF_REAL, ""), - IOP("nover", HSMHV2_MOD_NOVER, IF_REAL, ""), - IOP("novers", HSMHV2_MOD_NOVERS, IF_REAL, ""), - IOP("xwd", HSMHV2_MOD_XWD, IF_REAL, "Lateral diffusion along the width dir. [m]"), - IOP("xwdc", HSMHV2_MOD_XWDC, IF_REAL, "Lateral diffusion along the width dir. for capacitance [m]"), - IOP("xl", HSMHV2_MOD_XL, IF_REAL, "Gate length offset due to mask/etch effect [m]"), - IOP("xw", HSMHV2_MOD_XW, IF_REAL, "Gate width offset due to mask/etch effect [m]"), - IOP("saref", HSMHV2_MOD_SAREF, IF_REAL, "Reference distance from STI edge to Gate edge [m]"), - IOP("sbref", HSMHV2_MOD_SBREF, IF_REAL, "Reference distance from STI edge to Gate edge [m]"), - IOP("ll", HSMHV2_MOD_LL, IF_REAL, "Gate length parameter"), - IOP("lld", HSMHV2_MOD_LLD, IF_REAL, "Gate length parameter"), - IOP("lln", HSMHV2_MOD_LLN, IF_REAL, "Gate length parameter"), - IOP("wl", HSMHV2_MOD_WL, IF_REAL, "Gate width parameter"), - IOP("wl1", HSMHV2_MOD_WL1, IF_REAL, "Gate width parameter"), - IOP("wl1p", HSMHV2_MOD_WL1P, IF_REAL, "Gate width parameter"), - IOP("wl2", HSMHV2_MOD_WL2, IF_REAL, "Gate width parameter"), - IOP("wl2p", HSMHV2_MOD_WL2P, IF_REAL, "Gate width parameter"), - IOP("wld", HSMHV2_MOD_WLD, IF_REAL, "Gate width parameter"), - IOP("wln", HSMHV2_MOD_WLN, IF_REAL, "Gate width parameter"), - IOP("xqy", HSMHV2_MOD_XQY, IF_REAL, "[m]"), - IOP("xqy1", HSMHV2_MOD_XQY1, IF_REAL, "[F m^{XQY2}]"), - IOP("xqy2", HSMHV2_MOD_XQY2, IF_REAL, "[-]"), - IOP("rs", HSMHV2_MOD_RS, IF_REAL, "Source contact resistance [ohm m]"), - IOP("rd", HSMHV2_MOD_RD, IF_REAL, "Drain contact resistance [ohm m]"), - IOP("rsh", HSMHV2_MOD_RSH, IF_REAL, "Source/drain diffusion sheet resistance [ohm]"), - IOP("rshg", HSMHV2_MOD_RSHG, IF_REAL, "Gate-elecrode sheet resistance"), - IOP("vfbc", HSMHV2_MOD_VFBC, IF_REAL, "Constant part of Vfb [V]"), - IOP("vbi", HSMHV2_MOD_VBI, IF_REAL, "Built-in potential [V]"), - IOP("nsubc", HSMHV2_MOD_NSUBC, IF_REAL, "Constant part of Nsub [1/cm^3]"), - IOP("parl2", HSMHV2_MOD_PARL2, IF_REAL, "Under diffusion [m]"), - IOP("lp", HSMHV2_MOD_LP, IF_REAL, "Length of pocket potential [m]"), - IOP("nsubp", HSMHV2_MOD_NSUBP, IF_REAL, "[1/cm^3]"), - IOP("nsubp0", HSMHV2_MOD_NSUBP0, IF_REAL, "Pocket implant parameter"), - IOP("nsubwp", HSMHV2_MOD_NSUBWP, IF_REAL, "Pocket implant parameter"), - IOP("scp1", HSMHV2_MOD_SCP1, IF_REAL, "Parameter for pocket [-]"), - IOP("scp2", HSMHV2_MOD_SCP2, IF_REAL, "Parameter for pocket [1/V]"), - IOP("scp3", HSMHV2_MOD_SCP3, IF_REAL, "Parameter for pocket [m/V]"), - IOP("sc1", HSMHV2_MOD_SC1, IF_REAL, "Parameter for SCE [-]"), - IOP("sc2", HSMHV2_MOD_SC2, IF_REAL, "Parameter for SCE [1/V]"), - IOP("sc3", HSMHV2_MOD_SC3, IF_REAL, "Parameter for SCE [m/V]"), - IOP("sc4", HSMHV2_MOD_SC4, IF_REAL, "Parameter for SCE [1/V]"), - IOP("pgd1", HSMHV2_MOD_PGD1, IF_REAL, "Parameter for gate-poly depletion [V]"), - IOP("pgd2", HSMHV2_MOD_PGD2, IF_REAL, "Parameter for gate-poly depletion [V]"), -//IOP("pgd3", HSMHV2_MOD_PGD3, IF_REAL, "Parameter for gate-poly depletion [-]"), - IOP("pgd4", HSMHV2_MOD_PGD4, IF_REAL, "Parameter for gate-poly depletion [-]"), - IOP("ndep", HSMHV2_MOD_NDEP, IF_REAL, "Coeff. of Qbm for Eeff [-]"), - IOP("ndepl", HSMHV2_MOD_NDEPL, IF_REAL, "Coeff. of Qbm for Eeff [-]"), - IOP("ndeplp", HSMHV2_MOD_NDEPLP, IF_REAL, "Coeff. of Qbm for Eeff [-]"), - IOP("ninv", HSMHV2_MOD_NINV, IF_REAL, "Coeff. of Qnm for Eeff [-]"), - IOP("ninvd", HSMHV2_MOD_NINVD, IF_REAL, "Modification of Vdse dependence on Eeff [1/V]"), - IOP("ninvdw", HSMHV2_MOD_NINVDW, IF_REAL, "Coeff of modification of Vdse dependence on Eeff [-]"), - IOP("ninvdwp", HSMHV2_MOD_NINVDWP, IF_REAL, "Coeff of modification of Vdse dependence on Eeff [-]"), - IOP("ninvdt1", HSMHV2_MOD_NINVDT1, IF_REAL, "Coeff of modification of Vdse dependence on Eeff [-]"), - IOP("ninvdt2", HSMHV2_MOD_NINVDT2, IF_REAL, "Coeff of modification of Vdse dependence on Eeff [-]"), - IOP("muecb0", HSMHV2_MOD_MUECB0, IF_REAL, "Const. part of coulomb scattering [cm^2/Vs]"), - IOP("muecb1", HSMHV2_MOD_MUECB1, IF_REAL, "Coeff. for coulomb scattering [cm^2/Vs]"), - IOP("mueph0", HSMHV2_MOD_MUEPH0, IF_REAL, "Power of Eeff for phonon scattering [-]"), - IOP("mueph1", HSMHV2_MOD_MUEPH1, IF_REAL, ""), - IOP("muephw", HSMHV2_MOD_MUEPHW, IF_REAL, ""), - IOP("muepwp", HSMHV2_MOD_MUEPWP, IF_REAL, "Phonon scattering parameter"), - IOP("muephl", HSMHV2_MOD_MUEPHL, IF_REAL, "Phonon scattering parameter"), - IOP("mueplp", HSMHV2_MOD_MUEPLP, IF_REAL, "Phonon scattering parameter"), - IOP("muephs", HSMHV2_MOD_MUEPHS, IF_REAL, ""), - IOP("muepsp", HSMHV2_MOD_MUEPSP, IF_REAL, ""), - IOP("vtmp", HSMHV2_MOD_VTMP, IF_REAL, ""), - IOP("wvth0", HSMHV2_MOD_WVTH0, IF_REAL, ""), - IOP("muesr0", HSMHV2_MOD_MUESR0, IF_REAL, "Power of Eeff for S.R. scattering [-]"), - IOP("muesr1", HSMHV2_MOD_MUESR1, IF_REAL, "Coeff. for S.R. scattering [-]"), - IOP("muesrl", HSMHV2_MOD_MUESRL, IF_REAL, "Surface roughness parameter"), - IOP("muesrw", HSMHV2_MOD_MUESRW, IF_REAL, "Change of surface roughness related mobility"), - IOP("mueswp", HSMHV2_MOD_MUESWP, IF_REAL, "Change of surface roughness related mobility"), - IOP("mueslp", HSMHV2_MOD_MUESLP, IF_REAL, "Surface roughness parameter"), - IOP("muetmp", HSMHV2_MOD_MUETMP, IF_REAL, "Parameter for mobility [-]"), - IOP("bb", HSMHV2_MOD_BB, IF_REAL, "Empirical mobility model coefficient [-]"), - IOP("sub1", HSMHV2_MOD_SUB1, IF_REAL, "Parameter for Isub [1/V]"), - IOP("sub2", HSMHV2_MOD_SUB2, IF_REAL, "Parameter for Isub [V]"), - IOP("svgs", HSMHV2_MOD_SVGS, IF_REAL, "Coefficient for Vg of Psislsat"), - IOP("svbs", HSMHV2_MOD_SVBS, IF_REAL, "Coefficient for Vbs of Psislsat"), - IOP("svbsl", HSMHV2_MOD_SVBSL, IF_REAL, " "), - IOP("svds", HSMHV2_MOD_SVDS, IF_REAL, " "), - IOP("slg", HSMHV2_MOD_SLG, IF_REAL, " "), - IOP("sub1l", HSMHV2_MOD_SUB1L, IF_REAL, " "), - IOP("sub2l", HSMHV2_MOD_SUB2L, IF_REAL, " "), - IOP("fn1", HSMHV2_MOD_FN1, IF_REAL, " "), - IOP("fn2", HSMHV2_MOD_FN2, IF_REAL, " "), - IOP("fn3", HSMHV2_MOD_FN3, IF_REAL, " "), - IOP("fvbs", HSMHV2_MOD_FVBS, IF_REAL, " "), - IOP("svgsl", HSMHV2_MOD_SVGSL, IF_REAL, " "), - IOP("svgslp", HSMHV2_MOD_SVGSLP, IF_REAL, " "), - IOP("svgswp", HSMHV2_MOD_SVGSWP, IF_REAL, " "), - IOP("svgsw", HSMHV2_MOD_SVGSW, IF_REAL, " "), - IOP("svbslp", HSMHV2_MOD_SVBSLP, IF_REAL, " "), - IOP("slgl", HSMHV2_MOD_SLGL, IF_REAL, " "), - IOP("slglp", HSMHV2_MOD_SLGLP, IF_REAL, " "), - IOP("sub1lp", HSMHV2_MOD_SUB1LP, IF_REAL, " "), - IOP("nsti", HSMHV2_MOD_NSTI, IF_REAL, "Parameter for STI [1/cm^3]"), - IOP("wsti", HSMHV2_MOD_WSTI, IF_REAL, "Parameter for STI [m]"), - IOP("wstil", HSMHV2_MOD_WSTIL, IF_REAL, "Parameter for STI [?]"), - IOP("wstilp", HSMHV2_MOD_WSTILP, IF_REAL, "Parameter for STI [?]"), - IOP("wstiw", HSMHV2_MOD_WSTIW, IF_REAL, "Parameter for STI [?]"), - IOP("wstiwp", HSMHV2_MOD_WSTIWP, IF_REAL, "Parameter for STI [?]"), - IOP("scsti1", HSMHV2_MOD_SCSTI1, IF_REAL, "Parameter for STI [-]"), - IOP("scsti2", HSMHV2_MOD_SCSTI2, IF_REAL, "Parameter for STI [1/V]"), - IOP("vthsti", HSMHV2_MOD_VTHSTI, IF_REAL, "Parameter for STI"), - IOP("vdsti", HSMHV2_MOD_VDSTI, IF_REAL, "Parameter for STI [-]"), - IOP("muesti1", HSMHV2_MOD_MUESTI1, IF_REAL, "STI Stress mobility parameter"), - IOP("muesti2", HSMHV2_MOD_MUESTI2, IF_REAL, "STI Stress mobility parameter"), - IOP("muesti3", HSMHV2_MOD_MUESTI3, IF_REAL, "STI Stress mobility parameter"), - IOP("nsubpsti1", HSMHV2_MOD_NSUBPSTI1, IF_REAL, "STI Stress pocket implant parameter"), - IOP("nsubpsti2", HSMHV2_MOD_NSUBPSTI2, IF_REAL, "STI Stress pocket implant parameter"), - IOP("nsubpsti3", HSMHV2_MOD_NSUBPSTI3, IF_REAL, "STI Stress pocket implant parameter"), - IOP("lpext", HSMHV2_MOD_LPEXT, IF_REAL, "Pocket extension"), - IOP("npext", HSMHV2_MOD_NPEXT, IF_REAL, "Pocket extension"), - IOP("scp22", HSMHV2_MOD_SCP22, IF_REAL, ""), - IOP("scp21", HSMHV2_MOD_SCP21, IF_REAL, ""), - IOP("bs1", HSMHV2_MOD_BS1, IF_REAL, ""), - IOP("bs2", HSMHV2_MOD_BS2, IF_REAL, ""), - IOP("cgso", HSMHV2_MOD_CGSO, IF_REAL, "G-S overlap capacitance per unit W [F/m]"), - IOP("cgdo", HSMHV2_MOD_CGDO, IF_REAL, "G-D overlap capacitance per unit W [F/m]"), - IOP("cgbo", HSMHV2_MOD_CGBO, IF_REAL, "G-B overlap capacitance per unit L [F/m]"), - IOP("tpoly", HSMHV2_MOD_TPOLY, IF_REAL, "Height of poly gate on the source side[m]"), - IOP("js0", HSMHV2_MOD_JS0, IF_REAL, "Saturation current density [A/m^2]"), - IOP("js0sw", HSMHV2_MOD_JS0SW, IF_REAL, "Side wall saturation current density [A/m]"), - IOP("nj", HSMHV2_MOD_NJ, IF_REAL, "Emission coefficient [-]"), - IOP("njsw", HSMHV2_MOD_NJSW, IF_REAL, "Sidewall emission coefficient"), - IOP("xti", HSMHV2_MOD_XTI, IF_REAL, "Junction current temparature exponent coefficient [-]"), - IOP("cj", HSMHV2_MOD_CJ, IF_REAL, "Bottom junction capacitance per unit area at zero bias [F/m^2]"), - IOP("cjsw", HSMHV2_MOD_CJSW, IF_REAL, "Source/drain sidewall junction capacitance grading coefficient per unit length at zero bias [F/m]"), - IOP("cjswg", HSMHV2_MOD_CJSWG, IF_REAL, "Source/drain gate sidewall junction capacitance per unit length at zero bias [F/m]"), - IOP("mj", HSMHV2_MOD_MJ, IF_REAL, "Bottom junction capacitance grading coefficient"), - IOP("mjsw", HSMHV2_MOD_MJSW, IF_REAL, "Source/drain sidewall junction capacitance grading coefficient"), - IOP("mjswg", HSMHV2_MOD_MJSWG, IF_REAL, "Source/drain gate sidewall junction capacitance grading coefficient"), - IOP("pb", HSMHV2_MOD_PB, IF_REAL, "Bottom junction build-in potential [V]"), - IOP("pbsw", HSMHV2_MOD_PBSW, IF_REAL, "Source/drain sidewall junction build-in potential [V]"), - IOP("pbswg", HSMHV2_MOD_PBSWG, IF_REAL, "Source/drain gate sidewall junction build-in potential [V]"), - - IOP("xti2", HSMHV2_MOD_XTI2, IF_REAL, "Temperature coefficient [-]"), - IOP("cisb", HSMHV2_MOD_CISB, IF_REAL, "Reverse bias saturation current [-]"), - IOP("cvb", HSMHV2_MOD_CVB, IF_REAL, "Bias dependence coefficient of cisb [-]"), - IOP("ctemp", HSMHV2_MOD_CTEMP, IF_REAL, "Temperature coefficient [-]"), - IOP("cisbk", HSMHV2_MOD_CISBK, IF_REAL, "Reverse bias saturation current [A]"), - IOP("cvbk", HSMHV2_MOD_CVBK, IF_REAL, "Inactived by CVB "), - IOP("divx", HSMHV2_MOD_DIVX, IF_REAL, " [1/V]"), - - IOP("clm1", HSMHV2_MOD_CLM1, IF_REAL, "Parameter for CLM [-]"), - IOP("clm2", HSMHV2_MOD_CLM2, IF_REAL, "Parameter for CLM [1/m]"), - IOP("clm3", HSMHV2_MOD_CLM3, IF_REAL, "Parameter for CLM [-]"), - IOP("clm5", HSMHV2_MOD_CLM5, IF_REAL, "Parameter for CLM [-]"), - IOP("clm6", HSMHV2_MOD_CLM6, IF_REAL, "Parameter for CLM [um^{-clm5}]"), - IOP("vover", HSMHV2_MOD_VOVER, IF_REAL, "Parameter for overshoot [m^{voverp}]"), - IOP("voverp", HSMHV2_MOD_VOVERP, IF_REAL, "Parameter for overshoot [-]"), - IOP("vovers", HSMHV2_MOD_VOVERS, IF_REAL, "Parameter for overshoot [-]"), - IOP("voversp", HSMHV2_MOD_VOVERSP, IF_REAL, "Parameter for overshoot [-]"), - - IOP("wfc", HSMHV2_MOD_WFC, IF_REAL, "Parameter for narrow channel effect [m*F/(cm^2)]"), - IOP("nsubcw", HSMHV2_MOD_NSUBCW, IF_REAL, "Parameter for narrow channel effect "), - IOP("nsubcwp", HSMHV2_MOD_NSUBCWP, IF_REAL, "Parameter for narrow channel effect "), - IOP("qme1", HSMHV2_MOD_QME1, IF_REAL, "Parameter for quantum effect [mV]"), - IOP("qme2", HSMHV2_MOD_QME2, IF_REAL, "Parameter for quantum effect [V]"), - IOP("qme3", HSMHV2_MOD_QME3, IF_REAL, "Parameter for quantum effect [m]"), - IOP("gidl1", HSMHV2_MOD_GIDL1, IF_REAL, "Parameter for GIDL [?]"), - IOP("gidl2", HSMHV2_MOD_GIDL2, IF_REAL, "Parameter for GIDL [?]"), - IOP("gidl3", HSMHV2_MOD_GIDL3, IF_REAL, "Parameter for GIDL [?]"), - IOP("gidl4", HSMHV2_MOD_GIDL4, IF_REAL, "Parameter for GIDL [?]"), - IOP("gidl5", HSMHV2_MOD_GIDL5, IF_REAL, "Parameter for GIDL [?]"), - IOP("glpart1", HSMHV2_MOD_GLPART1, IF_REAL, "Parameter for gate current [-]"), - IOP("gleak1", HSMHV2_MOD_GLEAK1, IF_REAL, "Parameter for gate current [A*V^(-3/2)/C]"), - IOP("gleak2", HSMHV2_MOD_GLEAK2, IF_REAL, "Parameter for gate current [V^(-1/2)/m ]"), - IOP("gleak3", HSMHV2_MOD_GLEAK3, IF_REAL, "Parameter for gate current [-]"), - IOP("gleak4", HSMHV2_MOD_GLEAK4, IF_REAL, "Parameter for gate current [1/m]"), - IOP("gleak5", HSMHV2_MOD_GLEAK5, IF_REAL, "Parameter for gate current [V/m]"), - IOP("gleak6", HSMHV2_MOD_GLEAK6, IF_REAL, "Parameter for gate current [V]"), - IOP("gleak7", HSMHV2_MOD_GLEAK7, IF_REAL, "Parameter for gate current [m^2]"), - IOP("glksd1", HSMHV2_MOD_GLKSD1, IF_REAL, "Parameter for gate current [A*m/V^2]"), - IOP("glksd2", HSMHV2_MOD_GLKSD2, IF_REAL, "Parameter for gate current [1/(V*m)]"), - IOP("glksd3", HSMHV2_MOD_GLKSD3, IF_REAL, "Parameter for gate current [1/m]"), - IOP("glkb1", HSMHV2_MOD_GLKB1, IF_REAL, "Parameter for gate current [A/V^2]"), - IOP("glkb2", HSMHV2_MOD_GLKB2, IF_REAL, "Parameter for gate current [m/V]"), - IOP("glkb3", HSMHV2_MOD_GLKB3, IF_REAL, "Parameter for gate current [V]"), - IOP("egig", HSMHV2_MOD_EGIG, IF_REAL, "Parameter for gate current [V]"), - IOP("igtemp2", HSMHV2_MOD_IGTEMP2, IF_REAL, "Parameter for gate current [V*k]"), - IOP("igtemp3", HSMHV2_MOD_IGTEMP3, IF_REAL, "Parameter for gate current [V*k^2]"), - IOP("vzadd0", HSMHV2_MOD_VZADD0, IF_REAL, "Vzadd at Vds=0 [V]"), - IOP("pzadd0", HSMHV2_MOD_PZADD0, IF_REAL, "Pzadd at Vds=0 [V]"), - IOP("nftrp", HSMHV2_MOD_NFTRP, IF_REAL, ""), - IOP("nfalp", HSMHV2_MOD_NFALP, IF_REAL, ""), - IOP("cit", HSMHV2_MOD_CIT, IF_REAL, ""), - IOP("falph", HSMHV2_MOD_FALPH, IF_REAL, "Parameter for 1/f noise"), - IOP("kappa", HSMHV2_MOD_KAPPA, IF_REAL, "Dielectric constant for high-k stacked gate"), -//IOP("pthrou", HSMHV2_MOD_PTHROU, IF_REAL, "Modify subthreshold slope [-]"), - IOP("vdiffj", HSMHV2_MOD_VDIFFJ, IF_REAL, "Threshold voltage for S/D junction diode [V]"), - IOP("dly1", HSMHV2_MOD_DLY1, IF_REAL, "Parameter for transit time [-]"), - IOP("dly2", HSMHV2_MOD_DLY2, IF_REAL, "Parameter for transit time [-]"), - IOP("dly3", HSMHV2_MOD_DLY3, IF_REAL, "Parameter for transforming bulk charge [s/F]"), - IOP("dlyov", HSMHV2_MOD_DLYOV, IF_REAL, "Parameter for transforming overlap charge [s/F]"), /* not used */ - IOP("tnom", HSMHV2_MOD_TNOM, IF_REAL, "Nominal temperature [K]"), - IOP("ovslp", HSMHV2_MOD_OVSLP, IF_REAL, ""), - IOP("ovmag", HSMHV2_MOD_OVMAG, IF_REAL, ""), - - IOP("gbmin", HSMHV2_MOD_GBMIN, IF_REAL, ""), - IOP("rbpb", HSMHV2_MOD_RBPB, IF_REAL, ""), - IOP("rbpd", HSMHV2_MOD_RBPD, IF_REAL, ""), /* not used */ - IOP("rbps", HSMHV2_MOD_RBPS, IF_REAL, ""), /* not used */ - IOP("rbdb", HSMHV2_MOD_RBDB, IF_REAL, ""), - IOP("rbsb", HSMHV2_MOD_RBSB, IF_REAL, ""), - - IOP("ibpc1", HSMHV2_MOD_IBPC1, IF_REAL, "Parameter for impact-ionization induced bulk potential change"), - IOP("ibpc1l", HSMHV2_MOD_IBPC1L, IF_REAL, "Parameter for impact-ionization induced bulk potential change"), - IOP("ibpc1lp", HSMHV2_MOD_IBPC1LP, IF_REAL, "Parameter for impact-ionization induced bulk potential change"), - IOP("ibpc2", HSMHV2_MOD_IBPC2, IF_REAL, "Parameter for impact-ionization induced bulk potential change"), - - IOP("mphdfm", HSMHV2_MOD_MPHDFM, IF_REAL, "NSUBCDFM dependence of phonon scattering for DFM"), - - - IOP("ptl", HSMHV2_MOD_PTL, IF_REAL, ""), - IOP("ptp", HSMHV2_MOD_PTP, IF_REAL, ""), - IOP("pt2", HSMHV2_MOD_PT2, IF_REAL, ""), - IOP("ptlp", HSMHV2_MOD_PTLP, IF_REAL, ""), - IOP("gdl", HSMHV2_MOD_GDL, IF_REAL, ""), - IOP("gdlp", HSMHV2_MOD_GDLP, IF_REAL, ""), - - IOP("gdld", HSMHV2_MOD_GDLD, IF_REAL, ""), - IOP("pt4", HSMHV2_MOD_PT4, IF_REAL, ""), - IOP("pt4p", HSMHV2_MOD_PT4P, IF_REAL, ""), - IOP("rdvg11", HSMHV2_MOD_RDVG11, IF_REAL, ""), - IOP("rdvg12", HSMHV2_MOD_RDVG12, IF_REAL, ""), - IOP("rth0", HSMHV2_MOD_RTH0, IF_REAL, "Thermal resistance"), /* Self-heating model --SHE---*/ - IOP("cth0", HSMHV2_MOD_CTH0, IF_REAL, "Thermal capacitance"), /* Self-heating model --SHE--- */ - IOP("powrat", HSMHV2_MOD_POWRAT, IF_REAL, ""), /* Self-heating model --SHE--- */ - - IOP("rthtemp1", HSMHV2_MOD_RTHTEMP1, IF_REAL, "Thermal resistance"), /* Self-heating model --SHE---*/ - IOP("rthtemp2", HSMHV2_MOD_RTHTEMP2, IF_REAL, "Thermal resistance"), /* Self-heating model --SHE---*/ - IOP("prattemp1", HSMHV2_MOD_PRATTEMP1, IF_REAL, ""), /* Self-heating model --SHE--- */ - IOP("prattemp2", HSMHV2_MOD_PRATTEMP2, IF_REAL, ""), /* Self-heating model --SHE--- */ - - IOP("tcjbd", HSMHV2_MOD_TCJBD, IF_REAL, "Temperature dependence of cjbd"), /* Self-heating model --SHE--- */ - IOP("tcjbs", HSMHV2_MOD_TCJBS, IF_REAL, "Temperature dependence of cjbs"), /* Self-heating model --SHE--- */ - IOP("tcjbdsw", HSMHV2_MOD_TCJBDSW, IF_REAL, "Temperature dependence of cjbdsw"), /* Self-heating model --SHE--- */ - IOP("tcjbssw", HSMHV2_MOD_TCJBSSW, IF_REAL, "Temperature dependence of cjbssw"), /* Self-heating model --SHE--- */ - IOP("tcjbdswg", HSMHV2_MOD_TCJBDSWG, IF_REAL, "Temperature dependence of cjbdswg"), /* Self-heating model --SHE--- */ - IOP("tcjbsswg", HSMHV2_MOD_TCJBSSWG, IF_REAL, "Temperature dependence of cjbsswg"), /* Self-heating model --SHE--- */ - - IOP("qdftvd", HSMHV2_MOD_QDFTVD, IF_REAL, "Qdrift Vd dependence "), - IOP("rdvd", HSMHV2_MOD_RDVD, IF_REAL, ""), - IOP("rdvb", HSMHV2_MOD_RDVB, IF_REAL, ""), - IOP("rd20", HSMHV2_MOD_RD20, IF_REAL, ""), - IOP("rd21", HSMHV2_MOD_RD21, IF_REAL, ""), - IOP("rd22", HSMHV2_MOD_RD22, IF_REAL, ""), - IOP("rd22d", HSMHV2_MOD_RD22D, IF_REAL, ""), - IOP("rd23", HSMHV2_MOD_RD23, IF_REAL, ""), - IOP("rd24", HSMHV2_MOD_RD24, IF_REAL, ""), - IOP("rd25", HSMHV2_MOD_RD25, IF_REAL, ""), - IOP("rdvdl", HSMHV2_MOD_RDVDL, IF_REAL, ""), - IOP("rdvdlp", HSMHV2_MOD_RDVDLP, IF_REAL, ""), - IOP("rdvds", HSMHV2_MOD_RDVDS, IF_REAL, ""), - IOP("rdvdsp", HSMHV2_MOD_RDVDSP, IF_REAL, ""), - IOP("rd23l", HSMHV2_MOD_RD23L, IF_REAL, ""), - IOP("rd23lp", HSMHV2_MOD_RD23LP, IF_REAL, ""), - IOP("rd23s", HSMHV2_MOD_RD23S, IF_REAL, ""), - IOP("rd23sp", HSMHV2_MOD_RD23SP, IF_REAL, ""), - IOP("rds", HSMHV2_MOD_RDS, IF_REAL, ""), - IOP("rdsp", HSMHV2_MOD_RDSP, IF_REAL, ""), -//IOP("qovsm", HSMHV2_MOD_QOVSM, IF_REAL, "Smoothing Qover at depletion/inversion transition"), -// IOP("ldrift", HSMHV2_MOD_LDRIFT, IF_REAL, "alias for ldrift2"), - IOP("rdtemp1", HSMHV2_MOD_RDTEMP1, IF_REAL, "Temperature-dependence of Rd"), - IOP("rdtemp2", HSMHV2_MOD_RDTEMP2, IF_REAL, "Temperature-dependence of Rd"), - IOP("rth0r", HSMHV2_MOD_RTH0R, IF_REAL, "Heat radiation for SHE"), /* not used */ - IOP("rdvdtemp1", HSMHV2_MOD_RDVDTEMP1, IF_REAL, "Temperature-dependence of RDVD"), - IOP("rdvdtemp2", HSMHV2_MOD_RDVDTEMP2, IF_REAL, "Temperature-dependence of RDVD"), - IOP("rth0w", HSMHV2_MOD_RTH0W, IF_REAL, "Width-dependence of RTH0"), - IOP("rth0wp", HSMHV2_MOD_RTH0WP, IF_REAL, "Width-dependence of RTH0"), - IOP("rth0nf", HSMHV2_MOD_RTH0NF, IF_REAL, "nf-dependence of RTH0"), - IOP("cvdsover", HSMHV2_MOD_CVDSOVER, IF_REAL, "vds drop along the overlap"), - - IOP("rdvsub", HSMHV2_MOD_RDVSUB, IF_REAL, "model parameter for the substrate effect"), - IOP("rdvdsub", HSMHV2_MOD_RDVDSUB, IF_REAL, "model parameter for the substrate effect"), - IOP("ddrift", HSMHV2_MOD_DDRIFT, IF_REAL, "model parameter for the substrate effect"), - IOP("vbisub", HSMHV2_MOD_VBISUB, IF_REAL, "model parameter for the substrate effect"), - IOP("nsubsub", HSMHV2_MOD_NSUBSUB, IF_REAL, "model parameter for the substrate effect"), - - IOP("rdrmue", HSMHV2_MOD_RDRMUE, IF_REAL, ""), - IOP("rdrvmax", HSMHV2_MOD_RDRVMAX, IF_REAL, ""), - IOP("rdrmuetmp", HSMHV2_MOD_RDRMUETMP, IF_REAL, ""), - IOP("ndepm", HSMHV2_MOD_NDEPM, IF_REAL, "N- layer concentlation of the depletion MOS model"), - IOP("tndep", HSMHV2_MOD_TNDEP, IF_REAL, "N- layer depth of the depletion MOS model"), - IOP("depmue0", HSMHV2_MOD_DEPMUE0, IF_REAL, "coulomb scattering of resistor region "), - IOP("depmue1", HSMHV2_MOD_DEPMUE1, IF_REAL, "coulomb scattering of resistor region"), - IOP("depmueback0", HSMHV2_MOD_DEPMUEBACK0, IF_REAL, "coulomb scattering of back region"), - IOP("depmueback1", HSMHV2_MOD_DEPMUEBACK1, IF_REAL, "coulomb scattering of back region"), - IOP("depleak", HSMHV2_MOD_DEPLEAK, IF_REAL, "leakage current coefficient"), - IOP("depeta", HSMHV2_MOD_DEPETA, IF_REAL, "Vds dependence"), - IOP("depvmax", HSMHV2_MOD_DEPVMAX, IF_REAL, "velocity saturation"), - IOP("depvdsef1", HSMHV2_MOD_DEPVDSEF1, IF_REAL, "Vds dependece of leakage current"), - IOP("depvdsef2", HSMHV2_MOD_DEPVDSEF2, IF_REAL, "Vds dependece of leakage current"), - IOP("depmueph0", HSMHV2_MOD_DEPMUEPH0, IF_REAL, "phonon scattering"), - IOP("depmueph1", HSMHV2_MOD_DEPMUEPH1, IF_REAL, "phonon scattering"), - IOP("depbb", HSMHV2_MOD_DEPBB, IF_REAL, "high field effect coeeficient"), - IOP("depvtmp", HSMHV2_MOD_DEPVTMP, IF_REAL, "temperature dependence of velocity saturation"), - IOP("depmuetmp", HSMHV2_MOD_DEPMUETMP, IF_REAL, "temperature dependence of mobility"), - - - IOP("isbreak", HSMHV2_MOD_ISBREAK, IF_REAL, "reverse saturation current for breakdown"), - IOP("rwell", HSMHV2_MOD_RWELL, IF_REAL, "well resistance for breakdown"), - - IOP("rdrvtmp", HSMHV2_MOD_RDRVTMP, IF_REAL, ""), -/* IOP("rdrvmaxt1", HSMHV2_MOD_RDRVMAXT1, IF_REAL, ""), */ -/* IOP("rdrvmaxt2", HSMHV2_MOD_RDRVMAXT2, IF_REAL, ""), */ - IOP("rdrdjunc", HSMHV2_MOD_RDRDJUNC, IF_REAL, ""), - IOP("rdrcx", HSMHV2_MOD_RDRCX, IF_REAL, ""), - IOP("rdrcar", HSMHV2_MOD_RDRCAR, IF_REAL, ""), - IOP("rdrdl1", HSMHV2_MOD_RDRDL1, IF_REAL, ""), - IOP("rdrdl2", HSMHV2_MOD_RDRDL2, IF_REAL, ""), - IOP("rdrvmaxw", HSMHV2_MOD_RDRVMAXW, IF_REAL, ""), - IOP("rdrvmaxwp", HSMHV2_MOD_RDRVMAXWP, IF_REAL, ""), - IOP("rdrvmaxl", HSMHV2_MOD_RDRVMAXL, IF_REAL, ""), - IOP("rdrvmaxlp", HSMHV2_MOD_RDRVMAXLP, IF_REAL, ""), - IOP("rdrmuel", HSMHV2_MOD_RDRMUEL, IF_REAL, ""), - IOP("rdrmuelp", HSMHV2_MOD_RDRMUELP, IF_REAL, ""), - IOP("rdrqover", HSMHV2_MOD_RDRQOVER, IF_REAL, ""), - IOP("qovadd", HSMHV2_MOD_QOVADD, IF_REAL, "parameter for additional Qover Charge [-]"), - IOP("js0d", HSMHV2_MOD_JS0D, IF_REAL, "Saturation current density for drain junction [A/m^2]"), - IOP("js0swd", HSMHV2_MOD_JS0SWD, IF_REAL, "Side wall saturation current density for drain junction [A/m ]"), - IOP("njd", HSMHV2_MOD_NJD, IF_REAL, "Emission coefficient for drain junction [- ]"), - IOP("njswd", HSMHV2_MOD_NJSWD, IF_REAL, "Sidewall emission coefficient for drain junction [ ]"), - IOP("xtid", HSMHV2_MOD_XTID, IF_REAL, "Junction current temparature exponent coefficient for drain junction [- ]"), - IOP("cjd", HSMHV2_MOD_CJD, IF_REAL, "Bottom junction capacitance per unit area at zero bias for drain junction [F/m^2]"), - IOP("cjswd", HSMHV2_MOD_CJSWD, IF_REAL, "Sidewall junction capacitance grading coefficient per unit length at zero bias for drain junction [F/m ]"), - IOP("cjswgd", HSMHV2_MOD_CJSWGD, IF_REAL, "Gate sidewall junction capacitance per unit length at zero bias for drain junction [F/m ]"), - IOP("mjd", HSMHV2_MOD_MJD, IF_REAL, "Bottom junction capacitance grading coefficient for drain junction [ ]"), - IOP("mjswd", HSMHV2_MOD_MJSWD, IF_REAL, "Sidewall junction capacitance grading coefficient for drain junction [ ]"), - IOP("mjswgd", HSMHV2_MOD_MJSWGD, IF_REAL, "Gate sidewall junction capacitance grading coefficient for drain junction [ ]"), - IOP("pbd", HSMHV2_MOD_PBD, IF_REAL, "Bottom junction build-in potential for drain junction [V ]"), - IOP("pbswd", HSMHV2_MOD_PBSWD, IF_REAL, "Sidewall junction build-in potential for drain junction [V ]"), - IOP("pbswgd", HSMHV2_MOD_PBSWDG, IF_REAL, "Gate sidewall junction build-in potential for drain junction [V ]"), - IOP("xti2d", HSMHV2_MOD_XTI2D, IF_REAL, "Temperature coefficient for drain junction [- ]"), - IOP("cisbd", HSMHV2_MOD_CISBD, IF_REAL, "Reverse bias saturation current for drain junction [- ]"), - IOP("cvbd", HSMHV2_MOD_CVBD, IF_REAL, "Bias dependence coefficient of cisb for drain junction [- ]"), - IOP("ctempd", HSMHV2_MOD_CTEMPD, IF_REAL, "Temperature coefficient for drain junction [- ]"), - IOP("cisbkd", HSMHV2_MOD_CISBKD, IF_REAL, "Reverse bias saturation current for drain junction [A ]"), - IOP("divxd", HSMHV2_MOD_DIVXD, IF_REAL, "Reverse coefficient coefficient for drain junction [1/V ]"), - IOP("vdiffjd", HSMHV2_MOD_VDIFFJD, IF_REAL, "Threshold voltage for junction diode for drain junction [V ]"), - IOP("js0s", HSMHV2_MOD_JS0S, IF_REAL, "Saturation current density for source junction [A/m^2]"), - IOP("js0sws", HSMHV2_MOD_JS0SWS, IF_REAL, "Side wall saturation current density for source junction [A/m ]"), - IOP("njs", HSMHV2_MOD_NJS, IF_REAL, "Emission coefficient for source junction [- ]"), - IOP("njsws", HSMHV2_MOD_NJSWS, IF_REAL, "Sidewall emission coefficient for source junction [ ]"), - IOP("xtis", HSMHV2_MOD_XTIS, IF_REAL, "Junction current temparature exponent coefficient for source junction [- ]"), - IOP("cjs", HSMHV2_MOD_CJS, IF_REAL, "Bottom junction capacitance per unit area at zero bias for source junction [F/m^2]"), - IOP("cjsws", HSMHV2_MOD_CJSSW, IF_REAL, "Sidewall junction capacitance grading coefficient per unit length at zero bias for source junction [F/m ]"), - IOP("cjswgs", HSMHV2_MOD_CJSWGS, IF_REAL, "Gate sidewall junction capacitance per unit length at zero bias for source junction [F/m ]"), - IOP("mjs", HSMHV2_MOD_MJS, IF_REAL, "Bottom junction capacitance grading coefficient for source junction [ ]"), - IOP("mjsws", HSMHV2_MOD_MJSWS, IF_REAL, "Sidewall junction capacitance grading coefficient for source junction [ ]"), - IOP("mjswgs", HSMHV2_MOD_MJSWGS, IF_REAL, "Gate sidewall junction capacitance grading coefficient for source junction [ ]"), - IOP("pbs", HSMHV2_MOD_PBS, IF_REAL, "Bottom junction build-in potential for source junction [V ]"), - IOP("pbsws", HSMHV2_MOD_PBSWS, IF_REAL, "Sidewall junction build-in potential for source junction [V ]"), - IOP("pbswgs", HSMHV2_MOD_PBSWSG, IF_REAL, "Gate sidewall junction build-in potential for source junction [V ]"), - IOP("xti2s", HSMHV2_MOD_XTI2S, IF_REAL, "Temperature coefficient for source junction [- ]"), - IOP("cisbs", HSMHV2_MOD_CISBS, IF_REAL, "Reverse bias saturation current for source junction [- ]"), - IOP("cvbs", HSMHV2_MOD_CVBS, IF_REAL, "Bias dependence coefficient of cisb for source junction [- ]"), - IOP("ctemps", HSMHV2_MOD_CTEMPS, IF_REAL, "Temperature coefficient for source junction [- ]"), - IOP("cisbks", HSMHV2_MOD_CISBKS, IF_REAL, "Reverse bias saturation current for source junction [A ]"), - IOP("divxs", HSMHV2_MOD_DIVXS, IF_REAL, "Reverse coefficient coefficient for source junction [1/V ]"), - IOP("vdiffjs", HSMHV2_MOD_VDIFFJS, IF_REAL, "Threshold voltage for junction diode for source junction [V ]"), - IOP("shemax", HSMHV2_MOD_SHEMAX, IF_REAL, "Maximum rise temperatue for SHE [C]"), - IOP("vgsmin", HSMHV2_MOD_VGSMIN, IF_REAL, "minimal/maximal expected Vgs (NMOS/PMOS) [V]"), - IOP("gdsleak", HSMHV2_MOD_GDSLEAK, IF_REAL, "Channel leakage conductance [A/V]"), - IOP("rdrbb", HSMHV2_MOD_RDRBB, IF_REAL, "degradation of the mobility in drift region"), - IOP("rdrbbtmp", HSMHV2_MOD_RDRBBTMP, IF_REAL, "temperature coeeficient of RDRBB"), - - - /* binning parameters */ - IOP("lmin", HSMHV2_MOD_LMIN, IF_REAL, "Minimum length for the model"), - IOP("lmax", HSMHV2_MOD_LMAX, IF_REAL, "Maximum length for the model"), - IOP("wmin", HSMHV2_MOD_WMIN, IF_REAL, "Minimum width for the model"), - IOP("wmax", HSMHV2_MOD_WMAX, IF_REAL, "Maximum width for the model"), - IOP("lbinn", HSMHV2_MOD_LBINN, IF_REAL, "L modulation coefficient for binning"), - IOP("wbinn", HSMHV2_MOD_WBINN, IF_REAL, "W modulation coefficient for binning"), - - /* Length dependence */ - IOP("lvmax", HSMHV2_MOD_LVMAX, IF_REAL, "Length dependence of vmax"), - IOP("lbgtmp1", HSMHV2_MOD_LBGTMP1, IF_REAL, "Length dependence of bgtmp1"), - IOP("lbgtmp2", HSMHV2_MOD_LBGTMP2, IF_REAL, "Length dependence of bgtmp2"), - IOP("leg0", HSMHV2_MOD_LEG0, IF_REAL, "Length dependence of eg0"), - IOP("lvfbover", HSMHV2_MOD_LVFBOVER, IF_REAL, "Length dependence of vfbover"), - IOP("lnover", HSMHV2_MOD_LNOVER, IF_REAL, "Length dependence of nover"), - IOP("lnovers", HSMHV2_MOD_LNOVERS, IF_REAL, "Length dependence of nover on source side"), - IOP("lwl2", HSMHV2_MOD_LWL2, IF_REAL, "Length dependence of wl2"), - IOP("lvfbc", HSMHV2_MOD_LVFBC, IF_REAL, "Length dependence of vfbc"), - IOP("lnsubc", HSMHV2_MOD_LNSUBC, IF_REAL, "Length dependence of nsubc"), - IOP("lnsubp", HSMHV2_MOD_LNSUBP, IF_REAL, "Length dependence of nsubp"), - IOP("lscp1", HSMHV2_MOD_LSCP1, IF_REAL, "Length dependence of scp1"), - IOP("lscp2", HSMHV2_MOD_LSCP2, IF_REAL, "Length dependence of scp2"), - IOP("lscp3", HSMHV2_MOD_LSCP3, IF_REAL, "Length dependence of scp3"), - IOP("lsc1", HSMHV2_MOD_LSC1, IF_REAL, "Length dependence of sc1"), - IOP("lsc2", HSMHV2_MOD_LSC2, IF_REAL, "Length dependence of sc2"), - IOP("lsc3", HSMHV2_MOD_LSC3, IF_REAL, "Length dependence of sc3"), - IOP("lpgd1", HSMHV2_MOD_LPGD1, IF_REAL, "Length dependence of pgd1"), -//IOP("lpgd3", HSMHV2_MOD_LPGD3, IF_REAL, "Length dependence of pgd3"), - IOP("lndep", HSMHV2_MOD_LNDEP, IF_REAL, "Length dependence of ndep"), - IOP("lninv", HSMHV2_MOD_LNINV, IF_REAL, "Length dependence of ninv"), - IOP("lmuecb0", HSMHV2_MOD_LMUECB0, IF_REAL, "Length dependence of muecb0"), - IOP("lmuecb1", HSMHV2_MOD_LMUECB1, IF_REAL, "Length dependence of muecb1"), - IOP("lmueph1", HSMHV2_MOD_LMUEPH1, IF_REAL, "Length dependence of mueph1"), - IOP("lvtmp", HSMHV2_MOD_LVTMP, IF_REAL, "Length dependence of vtmp"), - IOP("lwvth0", HSMHV2_MOD_LWVTH0, IF_REAL, "Length dependence of wvth0"), - IOP("lmuesr1", HSMHV2_MOD_LMUESR1, IF_REAL, "Length dependence of muesr1"), - IOP("lmuetmp", HSMHV2_MOD_LMUETMP, IF_REAL, "Length dependence of muetmp"), - IOP("lsub1", HSMHV2_MOD_LSUB1, IF_REAL, "Length dependence of sub1"), - IOP("lsub2", HSMHV2_MOD_LSUB2, IF_REAL, "Length dependence of sub2"), - IOP("lsvds", HSMHV2_MOD_LSVDS, IF_REAL, "Length dependence of svds"), - IOP("lsvbs", HSMHV2_MOD_LSVBS, IF_REAL, "Length dependence of svbs"), - IOP("lsvgs", HSMHV2_MOD_LSVGS, IF_REAL, "Length dependence of svgs"), - IOP("lfn1", HSMHV2_MOD_LFN1, IF_REAL, "Length dependence of fn1"), - IOP("lfn2", HSMHV2_MOD_LFN2, IF_REAL, "Length dependence of fn2"), - IOP("lfn3", HSMHV2_MOD_LFN3, IF_REAL, "Length dependence of fn3"), - IOP("lfvbs", HSMHV2_MOD_LFVBS, IF_REAL, "Length dependence of fvbs"), - IOP("lnsti", HSMHV2_MOD_LNSTI, IF_REAL, "Length dependence of nsti"), - IOP("lwsti", HSMHV2_MOD_LWSTI, IF_REAL, "Length dependence of wsti"), - IOP("lscsti1", HSMHV2_MOD_LSCSTI1, IF_REAL, "Length dependence of scsti1"), - IOP("lscsti2", HSMHV2_MOD_LSCSTI2, IF_REAL, "Length dependence of scsti2"), - IOP("lvthsti", HSMHV2_MOD_LVTHSTI, IF_REAL, "Length dependence of vthsti"), - IOP("lmuesti1", HSMHV2_MOD_LMUESTI1, IF_REAL, "Length dependence of muesti1"), - IOP("lmuesti2", HSMHV2_MOD_LMUESTI2, IF_REAL, "Length dependence of muesti2"), - IOP("lmuesti3", HSMHV2_MOD_LMUESTI3, IF_REAL, "Length dependence of muesti3"), - IOP("lnsubpsti1", HSMHV2_MOD_LNSUBPSTI1, IF_REAL, "Length dependence of nsubpsti1"), - IOP("lnsubpsti2", HSMHV2_MOD_LNSUBPSTI2, IF_REAL, "Length dependence of nsubpsti2"), - IOP("lnsubpsti3", HSMHV2_MOD_LNSUBPSTI3, IF_REAL, "Length dependence of nsubpsti3"), - IOP("lcgso", HSMHV2_MOD_LCGSO, IF_REAL, "Length dependence of cgso"), - IOP("lcgdo", HSMHV2_MOD_LCGDO, IF_REAL, "Length dependence of cgdo"), - IOP("ljs0", HSMHV2_MOD_LJS0, IF_REAL, "Length dependence of js0"), - IOP("ljs0sw", HSMHV2_MOD_LJS0SW, IF_REAL, "Length dependence of js0sw"), - IOP("lnj", HSMHV2_MOD_LNJ, IF_REAL, "Length dependence of nj"), - IOP("lcisbk", HSMHV2_MOD_LCISBK, IF_REAL, "Length dependence of cisbk"), - IOP("lclm1", HSMHV2_MOD_LCLM1, IF_REAL, "Length dependence of clm1"), - IOP("lclm2", HSMHV2_MOD_LCLM2, IF_REAL, "Length dependence of clm2"), - IOP("lclm3", HSMHV2_MOD_LCLM3, IF_REAL, "Length dependence of clm3"), - IOP("lwfc", HSMHV2_MOD_LWFC, IF_REAL, "Length dependence of wfc"), - IOP("lgidl1", HSMHV2_MOD_LGIDL1, IF_REAL, "Length dependence of gidl1"), - IOP("lgidl2", HSMHV2_MOD_LGIDL2, IF_REAL, "Length dependence of gidl2"), - IOP("lgleak1", HSMHV2_MOD_LGLEAK1, IF_REAL, "Length dependence of gleak1"), - IOP("lgleak2", HSMHV2_MOD_LGLEAK2, IF_REAL, "Length dependence of gleak2"), - IOP("lgleak3", HSMHV2_MOD_LGLEAK3, IF_REAL, "Length dependence of gleak3"), - IOP("lgleak6", HSMHV2_MOD_LGLEAK6, IF_REAL, "Length dependence of gleak6"), - IOP("lglksd1", HSMHV2_MOD_LGLKSD1, IF_REAL, "Length dependence of glksd1"), - IOP("lglksd2", HSMHV2_MOD_LGLKSD2, IF_REAL, "Length dependence of glksd2"), - IOP("lglkb1", HSMHV2_MOD_LGLKB1, IF_REAL, "Length dependence of glkb1"), - IOP("lglkb2", HSMHV2_MOD_LGLKB2, IF_REAL, "Length dependence of glkb2"), - IOP("lnftrp", HSMHV2_MOD_LNFTRP, IF_REAL, "Length dependence of nftrp"), - IOP("lnfalp", HSMHV2_MOD_LNFALP, IF_REAL, "Length dependence of nfalp"), -//IOP("lpthrou", HSMHV2_MOD_LPTHROU, IF_REAL, "Length dependence of pthrou"), - IOP("lvdiffj", HSMHV2_MOD_LVDIFFJ, IF_REAL, "Length dependence of vdiffj"), - IOP("libpc1", HSMHV2_MOD_LIBPC1, IF_REAL, "Length dependence of ibpc1"), - IOP("libpc2", HSMHV2_MOD_LIBPC2, IF_REAL, "Length dependence of ibpc2"), - IOP("lcgbo", HSMHV2_MOD_LCGBO, IF_REAL, "Length dependence of cgbo"), - IOP("lcvdsover", HSMHV2_MOD_LCVDSOVER, IF_REAL, "Length dependence of cvdsover"), - IOP("lfalph", HSMHV2_MOD_LFALPH, IF_REAL, "Length dependence of falph"), - IOP("lnpext", HSMHV2_MOD_LNPEXT, IF_REAL, "Length dependence of npext"), - IOP("lpowrat", HSMHV2_MOD_LPOWRAT, IF_REAL, "Length dependence of powrat"), - IOP("lrd", HSMHV2_MOD_LRD, IF_REAL, "Length dependence of rd"), - IOP("lrd22", HSMHV2_MOD_LRD22, IF_REAL, "Length dependence of rd22"), - IOP("lrd23", HSMHV2_MOD_LRD23, IF_REAL, "Length dependence of rd23"), - IOP("lrd24", HSMHV2_MOD_LRD24, IF_REAL, "Length dependence of rd24"), - IOP("lrdict1", HSMHV2_MOD_LRDICT1, IF_REAL, "Length dependence of rdict1"), - IOP("lrdov13", HSMHV2_MOD_LRDOV13, IF_REAL, "Length dependence of rdov13"), - IOP("lrdslp1", HSMHV2_MOD_LRDSLP1, IF_REAL, "Length dependence of rdslp1"), - IOP("lrdvb", HSMHV2_MOD_LRDVB, IF_REAL, "Length dependence of rdvb"), - IOP("lrdvd", HSMHV2_MOD_LRDVD, IF_REAL, "Length dependence of rdvd"), - IOP("lrdvg11", HSMHV2_MOD_LRDVG11, IF_REAL, "Length dependence of rdvg11"), - IOP("lrs", HSMHV2_MOD_LRS, IF_REAL, "Length dependence of rs"), - IOP("lrth0", HSMHV2_MOD_LRTH0, IF_REAL, "Length dependence of rth0"), - IOP("lvover", HSMHV2_MOD_LVOVER, IF_REAL, "Length dependence of vover"), - IOP("ljs0d", HSMHV2_MOD_LJS0D, IF_REAL, "Length dependence of js0d"), - IOP("ljs0swd", HSMHV2_MOD_LJS0SWD, IF_REAL, "Length dependence of js0swd"), - IOP("lnjd", HSMHV2_MOD_LNJD, IF_REAL, "Length dependence of njd"), - IOP("lcisbkd", HSMHV2_MOD_LCISBKD, IF_REAL, "Length dependence of cisbkd"), - IOP("lvdiffjd", HSMHV2_MOD_LVDIFFJD, IF_REAL, "Length dependence of vdiffjd"), - IOP("ljs0s", HSMHV2_MOD_LJS0S, IF_REAL, "Length dependence of js0s"), - IOP("ljs0sws", HSMHV2_MOD_LJS0SWS, IF_REAL, "Length dependence of js0sws"), - IOP("lnjs", HSMHV2_MOD_LNJS, IF_REAL, "Length dependence of njs"), - IOP("lcisbks", HSMHV2_MOD_LCISBKS, IF_REAL, "Length dependence of cisbks"), - IOP("lvdiffjs", HSMHV2_MOD_LVDIFFJS, IF_REAL, "Length dependence of vdiffjs"), - - /* Width dependence */ - IOP("wvmax", HSMHV2_MOD_WVMAX, IF_REAL, "Width dependence of vmax"), - IOP("wbgtmp1", HSMHV2_MOD_WBGTMP1, IF_REAL, "Width dependence of bgtmp1"), - IOP("wbgtmp2", HSMHV2_MOD_WBGTMP2, IF_REAL, "Width dependence of bgtmp2"), - IOP("weg0", HSMHV2_MOD_WEG0, IF_REAL, "Width dependence of eg0"), - IOP("wvfbover", HSMHV2_MOD_WVFBOVER, IF_REAL, "Width dependence of vfbover"), - IOP("wnover", HSMHV2_MOD_WNOVER, IF_REAL, "Width dependence of nover"), - IOP("wnovers", HSMHV2_MOD_WNOVERS, IF_REAL, "Width dependence of novers on source side"), - IOP("wwl2", HSMHV2_MOD_WWL2, IF_REAL, "Width dependence of wl2"), - IOP("wvfbc", HSMHV2_MOD_WVFBC, IF_REAL, "Width dependence of vfbc"), - IOP("wnsubc", HSMHV2_MOD_WNSUBC, IF_REAL, "Width dependence of nsubc"), - IOP("wnsubp", HSMHV2_MOD_WNSUBP, IF_REAL, "Width dependence of nsubp"), - IOP("wscp1", HSMHV2_MOD_WSCP1, IF_REAL, "Width dependence of scp1"), - IOP("wscp2", HSMHV2_MOD_WSCP2, IF_REAL, "Width dependence of scp2"), - IOP("wscp3", HSMHV2_MOD_WSCP3, IF_REAL, "Width dependence of scp3"), - IOP("wsc1", HSMHV2_MOD_WSC1, IF_REAL, "Width dependence of sc1"), - IOP("wsc2", HSMHV2_MOD_WSC2, IF_REAL, "Width dependence of sc2"), - IOP("wsc3", HSMHV2_MOD_WSC3, IF_REAL, "Width dependence of sc3"), - IOP("wpgd1", HSMHV2_MOD_WPGD1, IF_REAL, "Width dependence of pgd1"), -//IOP("wpgd3", HSMHV2_MOD_WPGD3, IF_REAL, "Width dependence of pgd3"), - IOP("wndep", HSMHV2_MOD_WNDEP, IF_REAL, "Width dependence of ndep"), - IOP("wninv", HSMHV2_MOD_WNINV, IF_REAL, "Width dependence of ninv"), - IOP("wmuecb0", HSMHV2_MOD_WMUECB0, IF_REAL, "Width dependence of muecb0"), - IOP("wmuecb1", HSMHV2_MOD_WMUECB1, IF_REAL, "Width dependence of muecb1"), - IOP("wmueph1", HSMHV2_MOD_WMUEPH1, IF_REAL, "Width dependence of mueph1"), - IOP("wvtmp", HSMHV2_MOD_WVTMP, IF_REAL, "Width dependence of vtmp"), - IOP("wwvth0", HSMHV2_MOD_WWVTH0, IF_REAL, "Width dependence of wvth0"), - IOP("wmuesr1", HSMHV2_MOD_WMUESR1, IF_REAL, "Width dependence of muesr1"), - IOP("wmuetmp", HSMHV2_MOD_WMUETMP, IF_REAL, "Width dependence of muetmp"), - IOP("wsub1", HSMHV2_MOD_WSUB1, IF_REAL, "Width dependence of sub1"), - IOP("wsub2", HSMHV2_MOD_WSUB2, IF_REAL, "Width dependence of sub2"), - IOP("wsvds", HSMHV2_MOD_WSVDS, IF_REAL, "Width dependence of svds"), - IOP("wsvbs", HSMHV2_MOD_WSVBS, IF_REAL, "Width dependence of svbs"), - IOP("wsvgs", HSMHV2_MOD_WSVGS, IF_REAL, "Width dependence of svgs"), - IOP("wfn1", HSMHV2_MOD_WFN1, IF_REAL, "Width dependence of fn1"), - IOP("wfn2", HSMHV2_MOD_WFN2, IF_REAL, "Width dependence of fn2"), - IOP("wfn3", HSMHV2_MOD_WFN3, IF_REAL, "Width dependence of fn3"), - IOP("wfvbs", HSMHV2_MOD_WFVBS, IF_REAL, "Width dependence of fvbs"), - IOP("wnsti", HSMHV2_MOD_WNSTI, IF_REAL, "Width dependence of nsti"), - IOP("wwsti", HSMHV2_MOD_WWSTI, IF_REAL, "Width dependence of wsti"), - IOP("wscsti1", HSMHV2_MOD_WSCSTI1, IF_REAL, "Width dependence of scsti1"), - IOP("wscsti2", HSMHV2_MOD_WSCSTI2, IF_REAL, "Width dependence of scsti2"), - IOP("wvthsti", HSMHV2_MOD_WVTHSTI, IF_REAL, "Width dependence of vthsti"), - IOP("wmuesti1", HSMHV2_MOD_WMUESTI1, IF_REAL, "Width dependence of muesti1"), - IOP("wmuesti2", HSMHV2_MOD_WMUESTI2, IF_REAL, "Width dependence of muesti2"), - IOP("wmuesti3", HSMHV2_MOD_WMUESTI3, IF_REAL, "Width dependence of muesti3"), - IOP("wnsubpsti1", HSMHV2_MOD_WNSUBPSTI1, IF_REAL, "Width dependence of nsubpsti1"), - IOP("wnsubpsti2", HSMHV2_MOD_WNSUBPSTI2, IF_REAL, "Width dependence of nsubpsti2"), - IOP("wnsubpsti3", HSMHV2_MOD_WNSUBPSTI3, IF_REAL, "Width dependence of nsubpsti3"), - IOP("wcgso", HSMHV2_MOD_WCGSO, IF_REAL, "Width dependence of cgso"), - IOP("wcgdo", HSMHV2_MOD_WCGDO, IF_REAL, "Width dependence of cgdo"), - IOP("wjs0", HSMHV2_MOD_WJS0, IF_REAL, "Width dependence of js0"), - IOP("wjs0sw", HSMHV2_MOD_WJS0SW, IF_REAL, "Width dependence of js0sw"), - IOP("wnj", HSMHV2_MOD_WNJ, IF_REAL, "Width dependence of nj"), - IOP("wcisbk", HSMHV2_MOD_WCISBK, IF_REAL, "Width dependence of cisbk"), - IOP("wclm1", HSMHV2_MOD_WCLM1, IF_REAL, "Width dependence of clm1"), - IOP("wclm2", HSMHV2_MOD_WCLM2, IF_REAL, "Width dependence of clm2"), - IOP("wclm3", HSMHV2_MOD_WCLM3, IF_REAL, "Width dependence of clm3"), - IOP("wwfc", HSMHV2_MOD_WWFC, IF_REAL, "Width dependence of wfc"), - IOP("wgidl1", HSMHV2_MOD_WGIDL1, IF_REAL, "Width dependence of gidl1"), - IOP("wgidl2", HSMHV2_MOD_WGIDL2, IF_REAL, "Width dependence of gidl2"), - IOP("wgleak1", HSMHV2_MOD_WGLEAK1, IF_REAL, "Width dependence of gleak1"), - IOP("wgleak2", HSMHV2_MOD_WGLEAK2, IF_REAL, "Width dependence of gleak2"), - IOP("wgleak3", HSMHV2_MOD_WGLEAK3, IF_REAL, "Width dependence of gleak3"), - IOP("wgleak6", HSMHV2_MOD_WGLEAK6, IF_REAL, "Width dependence of gleak6"), - IOP("wglksd1", HSMHV2_MOD_WGLKSD1, IF_REAL, "Width dependence of glksd1"), - IOP("wglksd2", HSMHV2_MOD_WGLKSD2, IF_REAL, "Width dependence of glksd2"), - IOP("wglkb1", HSMHV2_MOD_WGLKB1, IF_REAL, "Width dependence of glkb1"), - IOP("wglkb2", HSMHV2_MOD_WGLKB2, IF_REAL, "Width dependence of glkb2"), - IOP("wnftrp", HSMHV2_MOD_WNFTRP, IF_REAL, "Width dependence of nftrp"), - IOP("wnfalp", HSMHV2_MOD_WNFALP, IF_REAL, "Width dependence of nfalp"), -//IOP("wpthrou", HSMHV2_MOD_WPTHROU, IF_REAL, "Width dependence of pthrou"), - IOP("wvdiffj", HSMHV2_MOD_WVDIFFJ, IF_REAL, "Width dependence of vdiffj"), - IOP("wibpc1", HSMHV2_MOD_WIBPC1, IF_REAL, "Width dependence of ibpc1"), - IOP("wibpc2", HSMHV2_MOD_WIBPC2, IF_REAL, "Width dependence of ibpc2"), - IOP("wcgbo", HSMHV2_MOD_WCGBO, IF_REAL, "Width dependence of cgbo"), - IOP("wcvdsover", HSMHV2_MOD_WCVDSOVER, IF_REAL, "Width dependence of cvdsover"), - IOP("wfalph", HSMHV2_MOD_WFALPH, IF_REAL, "Width dependence of falph"), - IOP("wnpext", HSMHV2_MOD_WNPEXT, IF_REAL, "Width dependence of npext"), - IOP("wpowrat", HSMHV2_MOD_WPOWRAT, IF_REAL, "Width dependence of powrat"), - IOP("wrd", HSMHV2_MOD_WRD, IF_REAL, "Width dependence of rd"), - IOP("wrd22", HSMHV2_MOD_WRD22, IF_REAL, "Width dependence of rd22"), - IOP("wrd23", HSMHV2_MOD_WRD23, IF_REAL, "Width dependence of rd23"), - IOP("wrd24", HSMHV2_MOD_WRD24, IF_REAL, "Width dependence of rd24"), - IOP("wrdict1", HSMHV2_MOD_WRDICT1, IF_REAL, "Width dependence of rdict1"), - IOP("wrdov13", HSMHV2_MOD_WRDOV13, IF_REAL, "Width dependence of rdov13"), - IOP("wrdslp1", HSMHV2_MOD_WRDSLP1, IF_REAL, "Width dependence of rdslp1"), - IOP("wrdvb", HSMHV2_MOD_WRDVB, IF_REAL, "Width dependence of rdvb"), - IOP("wrdvd", HSMHV2_MOD_WRDVD, IF_REAL, "Width dependence of rdvd"), - IOP("wrdvg11", HSMHV2_MOD_WRDVG11, IF_REAL, "Width dependence of rdvg11"), - IOP("wrs", HSMHV2_MOD_WRS, IF_REAL, "Width dependence of rs"), - IOP("wrth0", HSMHV2_MOD_WRTH0, IF_REAL, "Width dependence of rth0"), - IOP("wvover", HSMHV2_MOD_WVOVER, IF_REAL, "Width dependence of vover"), - IOP("wjs0d", HSMHV2_MOD_WJS0D, IF_REAL, "Wength dependence of js0d"), - IOP("wjs0swd", HSMHV2_MOD_WJS0SWD, IF_REAL, "Wength dependence of js0swd"), - IOP("wnjd", HSMHV2_MOD_WNJD, IF_REAL, "Wength dependence of njd"), - IOP("wcisbkd", HSMHV2_MOD_WCISBKD, IF_REAL, "Wength dependence of cisbkd"), - IOP("wvdiffjd", HSMHV2_MOD_WVDIFFJD, IF_REAL, "Wength dependence of vdiffjd"), - IOP("wjs0s", HSMHV2_MOD_WJS0S, IF_REAL, "Wength dependence of js0s"), - IOP("wjs0sws", HSMHV2_MOD_WJS0SWS, IF_REAL, "Wength dependence of js0sws"), - IOP("wnjs", HSMHV2_MOD_WNJS, IF_REAL, "Wength dependence of njs"), - IOP("wcisbks", HSMHV2_MOD_WCISBKS, IF_REAL, "Wength dependence of cisbks"), - IOP("wvdiffjs", HSMHV2_MOD_WVDIFFJS, IF_REAL, "Wength dependence of vdiffjs"), - - /* Cross-term dependence */ - IOP("pvmax", HSMHV2_MOD_PVMAX, IF_REAL, "Cross-term dependence of vmax"), - IOP("pbgtmp1", HSMHV2_MOD_PBGTMP1, IF_REAL, "Cross-term dependence of bgtmp1"), - IOP("pbgtmp2", HSMHV2_MOD_PBGTMP2, IF_REAL, "Cross-term dependence of bgtmp2"), - IOP("peg0", HSMHV2_MOD_PEG0, IF_REAL, "Cross-term dependence of eg0"), - IOP("pvfbover", HSMHV2_MOD_PVFBOVER, IF_REAL, "Cross-term dependence of vfbover"), - IOP("pnover", HSMHV2_MOD_PNOVER, IF_REAL, "Cross-term dependence of nover"), - IOP("pnovers", HSMHV2_MOD_PNOVERS, IF_REAL, "Cross-term dependence of nover on source side"), - IOP("pwl2", HSMHV2_MOD_PWL2, IF_REAL, "Cross-term dependence of wl2"), - IOP("pvfbc", HSMHV2_MOD_PVFBC, IF_REAL, "Cross-term dependence of vfbc"), - IOP("pnsubc", HSMHV2_MOD_PNSUBC, IF_REAL, "Cross-term dependence of nsubc"), - IOP("pnsubp", HSMHV2_MOD_PNSUBP, IF_REAL, "Cross-term dependence of nsubp"), - IOP("pscp1", HSMHV2_MOD_PSCP1, IF_REAL, "Cross-term dependence of scp1"), - IOP("pscp2", HSMHV2_MOD_PSCP2, IF_REAL, "Cross-term dependence of scp2"), - IOP("pscp3", HSMHV2_MOD_PSCP3, IF_REAL, "Cross-term dependence of scp3"), - IOP("psc1", HSMHV2_MOD_PSC1, IF_REAL, "Cross-term dependence of sc1"), - IOP("psc2", HSMHV2_MOD_PSC2, IF_REAL, "Cross-term dependence of sc2"), - IOP("psc3", HSMHV2_MOD_PSC3, IF_REAL, "Cross-term dependence of sc3"), - IOP("ppgd1", HSMHV2_MOD_PPGD1, IF_REAL, "Cross-term dependence of pgd1"), -//IOP("ppgd3", HSMHV2_MOD_PPGD3, IF_REAL, "Cross-term dependence of pgd3"), - IOP("pndep", HSMHV2_MOD_PNDEP, IF_REAL, "Cross-term dependence of ndep"), - IOP("pninv", HSMHV2_MOD_PNINV, IF_REAL, "Cross-term dependence of ninv"), - IOP("pmuecb0", HSMHV2_MOD_PMUECB0, IF_REAL, "Cross-term dependence of muecb0"), - IOP("pmuecb1", HSMHV2_MOD_PMUECB1, IF_REAL, "Cross-term dependence of muecb1"), - IOP("pmueph1", HSMHV2_MOD_PMUEPH1, IF_REAL, "Cross-term dependence of mueph1"), - IOP("pvtmp", HSMHV2_MOD_PVTMP, IF_REAL, "Cross-term dependence of vtmp"), - IOP("pwvth0", HSMHV2_MOD_PWVTH0, IF_REAL, "Cross-term dependence of wvth0"), - IOP("pmuesr1", HSMHV2_MOD_PMUESR1, IF_REAL, "Cross-term dependence of muesr1"), - IOP("pmuetmp", HSMHV2_MOD_PMUETMP, IF_REAL, "Cross-term dependence of muetmp"), - IOP("psub1", HSMHV2_MOD_PSUB1, IF_REAL, "Cross-term dependence of sub1"), - IOP("psub2", HSMHV2_MOD_PSUB2, IF_REAL, "Cross-term dependence of sub2"), - IOP("psvds", HSMHV2_MOD_PSVDS, IF_REAL, "Cross-term dependence of svds"), - IOP("psvbs", HSMHV2_MOD_PSVBS, IF_REAL, "Cross-term dependence of svbs"), - IOP("psvgs", HSMHV2_MOD_PSVGS, IF_REAL, "Cross-term dependence of svgs"), - IOP("pfn1", HSMHV2_MOD_PFN1, IF_REAL, "Cross-term dependence of fn1"), - IOP("pfn2", HSMHV2_MOD_PFN2, IF_REAL, "Cross-term dependence of fn2"), - IOP("pfn3", HSMHV2_MOD_PFN3, IF_REAL, "Cross-term dependence of fn3"), - IOP("pfvbs", HSMHV2_MOD_PFVBS, IF_REAL, "Cross-term dependence of fvbs"), - IOP("pnsti", HSMHV2_MOD_PNSTI, IF_REAL, "Cross-term dependence of nsti"), - IOP("pwsti", HSMHV2_MOD_PWSTI, IF_REAL, "Cross-term dependence of wsti"), - IOP("pscsti1", HSMHV2_MOD_PSCSTI1, IF_REAL, "Cross-term dependence of scsti1"), - IOP("pscsti2", HSMHV2_MOD_PSCSTI2, IF_REAL, "Cross-term dependence of scsti2"), - IOP("pvthsti", HSMHV2_MOD_PVTHSTI, IF_REAL, "Cross-term dependence of vthsti"), - IOP("pmuesti1", HSMHV2_MOD_PMUESTI1, IF_REAL, "Cross-term dependence of muesti1"), - IOP("pmuesti2", HSMHV2_MOD_PMUESTI2, IF_REAL, "Cross-term dependence of muesti2"), - IOP("pmuesti3", HSMHV2_MOD_PMUESTI3, IF_REAL, "Cross-term dependence of muesti3"), - IOP("pnsubpsti1", HSMHV2_MOD_PNSUBPSTI1, IF_REAL, "Cross-term dependence of nsubpsti1"), - IOP("pnsubpsti2", HSMHV2_MOD_PNSUBPSTI2, IF_REAL, "Cross-term dependence of nsubpsti2"), - IOP("pnsubpsti3", HSMHV2_MOD_PNSUBPSTI3, IF_REAL, "Cross-term dependence of nsubpsti3"), - IOP("pcgso", HSMHV2_MOD_PCGSO, IF_REAL, "Cross-term dependence of cgso"), - IOP("pcgdo", HSMHV2_MOD_PCGDO, IF_REAL, "Cross-term dependence of cgdo"), - IOP("pjs0", HSMHV2_MOD_PJS0, IF_REAL, "Cross-term dependence of js0"), - IOP("pjs0sw", HSMHV2_MOD_PJS0SW, IF_REAL, "Cross-term dependence of js0sw"), - IOP("pnj", HSMHV2_MOD_PNJ, IF_REAL, "Cross-term dependence of nj"), - IOP("pcisbk", HSMHV2_MOD_PCISBK, IF_REAL, "Cross-term dependence of cisbk"), - IOP("pclm1", HSMHV2_MOD_PCLM1, IF_REAL, "Cross-term dependence of clm1"), - IOP("pclm2", HSMHV2_MOD_PCLM2, IF_REAL, "Cross-term dependence of clm2"), - IOP("pclm3", HSMHV2_MOD_PCLM3, IF_REAL, "Cross-term dependence of clm3"), - IOP("pwfc", HSMHV2_MOD_PWFC, IF_REAL, "Cross-term dependence of wfc"), - IOP("pgidl1", HSMHV2_MOD_PGIDL1, IF_REAL, "Cross-term dependence of gidl1"), - IOP("pgidl2", HSMHV2_MOD_PGIDL2, IF_REAL, "Cross-term dependence of gidl2"), - IOP("pgleak1", HSMHV2_MOD_PGLEAK1, IF_REAL, "Cross-term dependence of gleak1"), - IOP("pgleak2", HSMHV2_MOD_PGLEAK2, IF_REAL, "Cross-term dependence of gleak2"), - IOP("pgleak3", HSMHV2_MOD_PGLEAK3, IF_REAL, "Cross-term dependence of gleak3"), - IOP("pgleak6", HSMHV2_MOD_PGLEAK6, IF_REAL, "Cross-term dependence of gleak6"), - IOP("pglksd1", HSMHV2_MOD_PGLKSD1, IF_REAL, "Cross-term dependence of glksd1"), - IOP("pglksd2", HSMHV2_MOD_PGLKSD2, IF_REAL, "Cross-term dependence of glksd2"), - IOP("pglkb1", HSMHV2_MOD_PGLKB1, IF_REAL, "Cross-term dependence of glkb1"), - IOP("pglkb2", HSMHV2_MOD_PGLKB2, IF_REAL, "Cross-term dependence of glkb2"), - IOP("pnftrp", HSMHV2_MOD_PNFTRP, IF_REAL, "Cross-term dependence of nftrp"), - IOP("pnfalp", HSMHV2_MOD_PNFALP, IF_REAL, "Cross-term dependence of nfalp"), -//IOP("ppthrou", HSMHV2_MOD_PPTHROU, IF_REAL, "Cross-term dependence of pthrou"), - IOP("pvdiffj", HSMHV2_MOD_PVDIFFJ, IF_REAL, "Cross-term dependence of vdiffj"), - IOP("pibpc1", HSMHV2_MOD_PIBPC1, IF_REAL, "Cross-term dependence of ibpc1"), - IOP("pibpc2", HSMHV2_MOD_PIBPC2, IF_REAL, "Cross-term dependence of ibpc2"), - IOP("pcgbo", HSMHV2_MOD_PCGBO, IF_REAL, "Cross-term dependence of cgbo"), - IOP("pcvdsover", HSMHV2_MOD_PCVDSOVER, IF_REAL, "Cross-term dependence of cvdsover"), - IOP("pfalph", HSMHV2_MOD_PFALPH, IF_REAL, "Cross-term dependence of falph"), - IOP("pnpext", HSMHV2_MOD_PNPEXT, IF_REAL, "Cross-term dependence of npext"), - IOP("ppowrat", HSMHV2_MOD_PPOWRAT, IF_REAL, "Cross-term dependence of powrat"), - IOP("prd", HSMHV2_MOD_PRD, IF_REAL, "Cross-term dependence of rd"), - IOP("prd22", HSMHV2_MOD_PRD22, IF_REAL, "Cross-term dependence of rd22"), - IOP("prd23", HSMHV2_MOD_PRD23, IF_REAL, "Cross-term dependence of rd23"), - IOP("prd24", HSMHV2_MOD_PRD24, IF_REAL, "Cross-term dependence of rd24"), - IOP("prdict1", HSMHV2_MOD_PRDICT1, IF_REAL, "Cross-term dependence of rdict1"), - IOP("prdov13", HSMHV2_MOD_PRDOV13, IF_REAL, "Cross-term dependence of rdov13"), - IOP("prdslp1", HSMHV2_MOD_PRDSLP1, IF_REAL, "Cross-term dependence of rdslp1"), - IOP("prdvb", HSMHV2_MOD_PRDVB, IF_REAL, "Cross-term dependence of rdvb"), - IOP("prdvd", HSMHV2_MOD_PRDVD, IF_REAL, "Cross-term dependence of rdvd"), - IOP("prdvg11", HSMHV2_MOD_PRDVG11, IF_REAL, "Cross-term dependence of rdvg11"), - IOP("prs", HSMHV2_MOD_PRS, IF_REAL, "Cross-term dependence of rs"), - IOP("prth0", HSMHV2_MOD_PRTH0, IF_REAL, "Cross-term dependence of rth0"), - IOP("pvover", HSMHV2_MOD_PVOVER, IF_REAL, "Cross-term dependence of vover"), - IOP("pjs0d", HSMHV2_MOD_PJS0D, IF_REAL, "Cross-term dependence of js0d"), - IOP("pjs0swd", HSMHV2_MOD_PJS0SWD, IF_REAL, "Cross-term dependence of js0swd"), - IOP("pnjd", HSMHV2_MOD_PNJD, IF_REAL, "Cross-term dependence of njd"), - IOP("pcisbkd", HSMHV2_MOD_PCISBKD, IF_REAL, "Cross-term dependence of cisbkd"), - IOP("pvdiffjd", HSMHV2_MOD_PVDIFFJD, IF_REAL, "Cross-term dependence of vdiffjd"), - IOP("pjs0s", HSMHV2_MOD_PJS0S, IF_REAL, "Cross-term dependence of js0s"), - IOP("pjs0sws", HSMHV2_MOD_PJS0SWS, IF_REAL, "Cross-term dependence of js0sws"), - IOP("pnjs", HSMHV2_MOD_PNJS, IF_REAL, "Cross-term dependence of njs"), - IOP("pcisbks", HSMHV2_MOD_PCISBKS, IF_REAL, "Cross-term dependence of cisbks"), - IOP("pvdiffjs", HSMHV2_MOD_PVDIFFJS, IF_REAL, "Cross-term dependence of vdiffjs"), - - IOP("vgs_max", HSMHV2_MOD_VGS_MAX, IF_REAL, "maximum voltage G-S branch"), - IOP("vgd_max", HSMHV2_MOD_VGD_MAX, IF_REAL, "maximum voltage G-D branch"), - IOP("vgb_max", HSMHV2_MOD_VGB_MAX, IF_REAL, "maximum voltage G-B branch"), - IOP("vds_max", HSMHV2_MOD_VDS_MAX, IF_REAL, "maximum voltage D-S branch"), - IOP("vbs_max", HSMHV2_MOD_VBS_MAX, IF_REAL, "maximum voltage B-S branch"), - IOP("vbd_max", HSMHV2_MOD_VBD_MAX, IF_REAL, "maximum voltage B-D branch"), - IOP("vgsr_max", HSMHV2_MOD_VGSR_MAX, IF_REAL, "maximum voltage G-S branch"), - IOP("vgdr_max", HSMHV2_MOD_VGDR_MAX, IF_REAL, "maximum voltage G-D branch"), - IOP("vgbr_max", HSMHV2_MOD_VGBR_MAX, IF_REAL, "maximum voltage G-B branch"), - IOP("vbsr_max", HSMHV2_MOD_VBSR_MAX, IF_REAL, "maximum voltage B-S branch"), - IOP("vbdr_max", HSMHV2_MOD_VBDR_MAX, IF_REAL, "maximum voltage B-D branch") - -}; - -char *HSMHV2names[] = { - "Drain", - "Gate", - "Source", - "Bulk", - "Substrate", - "Temp" -}; - -int HSMHV2nSize = NUMELEMS(HSMHV2names); -int HSMHV2pTSize = NUMELEMS(HSMHV2pTable); -int HSMHV2mPTSize = NUMELEMS(HSMHV2mPTable); -int HSMHV2iSize = sizeof(HSMHV2instance); -int HSMHV2mSize = sizeof(HSMHV2model); - diff --git a/src/spicelib/devices/hisimhv2/hsmhv2acld.c b/src/spicelib/devices/hisimhv2/hsmhv2acld.c deleted file mode 100644 index 7467d43f0..000000000 --- a/src/spicelib/devices/hisimhv2/hsmhv2acld.c +++ /dev/null @@ -1,340 +0,0 @@ -/*********************************************************************** - - HiSIM (Hiroshima University STARC IGFET Model) - Copyright (C) 2014 Hiroshima University & STARC - - MODEL NAME : HiSIM_HV - ( VERSION : 2 SUBVERSION : 2 REVISION : 0 ) - Model Parameter 'VERSION' : 2.20 - FILE : hsmhvacld.c - - DATE : 2014.6.11 - - released by - Hiroshima University & - Semiconductor Technology Academic Research Center (STARC) -***********************************************************************/ - -/********************************************************************** - -The following source code, and all copyrights, trade secrets or other -intellectual property rights in and to the source code in its entirety, -is owned by the Hiroshima University and the STARC organization. - -All users need to follow the "HISIM_HV Distribution Statement and -Copyright Notice" attached to HiSIM_HV model. - ------HISIM_HV Distribution Statement and Copyright Notice-------------- - -Software is distributed as is, completely without warranty or service -support. Hiroshima University or STARC and its employees are not liable -for the condition or performance of the software. - -Hiroshima University and STARC own the copyright and grant users a perpetual, -irrevocable, worldwide, non-exclusive, royalty-free license with respect -to the software as set forth below. - -Hiroshima University and STARC hereby disclaims all implied warranties. - -Hiroshima University and STARC grant the users the right to modify, copy, -and redistribute the software and documentation, both within the user's -organization and externally, subject to the following restrictions - -1. The users agree not to charge for Hiroshima University and STARC code -itself but may charge for additions, extensions, or support. - -2. In any product based on the software, the users agree to acknowledge -Hiroshima University and STARC that developed the software. This -acknowledgment shall appear in the product documentation. - -3. The users agree to reproduce any copyright notice which appears on -the software on any copy or modification of such made available -to others." - -Toshimasa Asahara, President, Hiroshima University -Mitiko Miura-Mattausch, Professor, Hiroshima University -Katsuhiro Shimohigashi, President&CEO, STARC -June 2008 (revised October 2011) -*************************************************************************/ - -#include "ngspice/ngspice.h" -#include "ngspice/cktdefs.h" -#include "ngspice/sperror.h" -#include "ngspice/suffix.h" -#include "hsmhv2def.h" - -int HSMHV2acLoad( - GENmodel *inModel, - CKTcircuit *ckt) -{ - HSMHV2model *model = (HSMHV2model*)inModel; - HSMHV2instance *here; - - double omega=0.0 ; - int flg_nqs =0 ; - int flg_subNode = 0 ; - -#define dNode 0 -#define dNodePrime 1 -#define gNode 2 -#define gNodePrime 3 -#define sNode 4 -#define sNodePrime 5 -#define bNodePrime 6 -#define bNode 7 -#define dbNode 8 -#define sbNode 9 -#define subNode 10 -#define tempNode 11 -#define qiNode 12 -#define qbNode 13 - - - omega = ckt->CKTomega; - for ( ; model != NULL; model = HSMHV2nextModel(model)) { - for ( here = HSMHV2instances(model); here!= NULL; here = HSMHV2nextInstance(here)) { - - flg_nqs = model->HSMHV2_conqs ; - flg_subNode = here->HSMHV2subNode ; /* if flg_subNode > 0, external(/internal) substrate node exists */ - - /* stamp matrix */ - - /*drain*/ - *(here->HSMHV2DdPtr) += here->HSMHV2_ydc_d[dNode] ; - *(here->HSMHV2DdPtr +1) += omega*here->HSMHV2_ydyn_d[dNode] ; - *(here->HSMHV2DdpPtr) += here->HSMHV2_ydc_d[dNodePrime] ; - *(here->HSMHV2DdpPtr +1) += omega*here->HSMHV2_ydyn_d[dNodePrime]; - *(here->HSMHV2DgpPtr) += here->HSMHV2_ydc_d[gNodePrime]; - *(here->HSMHV2DgpPtr +1) += omega*here->HSMHV2_ydyn_d[gNodePrime]; - *(here->HSMHV2DsPtr) += here->HSMHV2_ydc_d[sNode]; - *(here->HSMHV2DsPtr +1) += omega*here->HSMHV2_ydyn_d[sNode]; - *(here->HSMHV2DbpPtr) += here->HSMHV2_ydc_d[bNodePrime]; - *(here->HSMHV2DbpPtr +1) += omega*here->HSMHV2_ydyn_d[bNodePrime]; - *(here->HSMHV2DdbPtr) += here->HSMHV2_ydc_d[dbNode]; - *(here->HSMHV2DdbPtr +1) += omega*here->HSMHV2_ydyn_d[dbNode]; - if (flg_subNode > 0) { - *(here->HSMHV2DsubPtr) += here->HSMHV2_ydc_d[subNode]; - } - if( here->HSMHV2tempNode > 0) { - *(here->HSMHV2DtempPtr) += model->HSMHV2_type*here->HSMHV2_ydc_d[tempNode]; - *(here->HSMHV2DtempPtr +1) += model->HSMHV2_type*omega*here->HSMHV2_ydyn_d[tempNode]; - } - - /*drain prime*/ - *(here->HSMHV2DPdPtr) += here->HSMHV2_ydc_dP[dNode] ; - *(here->HSMHV2DPdPtr +1) += omega*here->HSMHV2_ydyn_dP[dNode]; - *(here->HSMHV2DPdpPtr) += here->HSMHV2_ydc_dP[dNodePrime]; - *(here->HSMHV2DPdpPtr +1) += omega*here->HSMHV2_ydyn_dP[dNodePrime]; - *(here->HSMHV2DPgpPtr) += here->HSMHV2_ydc_dP[gNodePrime]; - *(here->HSMHV2DPgpPtr +1) += omega*here->HSMHV2_ydyn_dP[gNodePrime]; - *(here->HSMHV2DPsPtr) += here->HSMHV2_ydc_dP[sNode] ; - *(here->HSMHV2DPsPtr +1) += omega*here->HSMHV2_ydyn_dP[sNode]; - *(here->HSMHV2DPspPtr) += here->HSMHV2_ydc_dP[sNodePrime] ; - *(here->HSMHV2DPspPtr +1) += omega*here->HSMHV2_ydyn_dP[sNodePrime]; - *(here->HSMHV2DPbpPtr) += here->HSMHV2_ydc_dP[bNodePrime] ; - *(here->HSMHV2DPbpPtr +1) += omega*here->HSMHV2_ydyn_dP[bNodePrime]; - if (flg_subNode > 0) { - *(here->HSMHV2DPsubPtr) += here->HSMHV2_ydc_dP[subNode]; - } - if( here->HSMHV2tempNode > 0) { - *(here->HSMHV2DPtempPtr) += model->HSMHV2_type*here->HSMHV2_ydc_dP[tempNode]; - *(here->HSMHV2DPtempPtr +1) += model->HSMHV2_type*omega*here->HSMHV2_ydyn_dP[tempNode]; - } - if (flg_nqs) { - *(here->HSMHV2DPqiPtr) += model->HSMHV2_type*here->HSMHV2_ydc_dP[qiNode]; - *(here->HSMHV2DPqiPtr+1) += model->HSMHV2_type*omega*here->HSMHV2_ydyn_dP[qiNode]; - } - - - /*gate*/ - *(here->HSMHV2GgPtr) += here->HSMHV2_ydc_g[gNode] ; - *(here->HSMHV2GgPtr +1) += omega*here->HSMHV2_ydyn_g[gNode]; - *(here->HSMHV2GgpPtr) += here->HSMHV2_ydc_g[gNodePrime] ; - *(here->HSMHV2GgpPtr +1) += omega*here->HSMHV2_ydyn_g[gNodePrime]; - - /*gate prime*/ - *(here->HSMHV2GPdPtr) += here->HSMHV2_ydc_gP[dNode] ; - *(here->HSMHV2GPdPtr +1) += omega*here->HSMHV2_ydyn_gP[dNode]; - *(here->HSMHV2GPdpPtr) += here->HSMHV2_ydc_gP[dNodePrime] ; - *(here->HSMHV2GPdpPtr +1) += omega*here->HSMHV2_ydyn_gP[dNodePrime]; - *(here->HSMHV2GPgPtr) += here->HSMHV2_ydc_gP[gNode]; - *(here->HSMHV2GPgPtr +1) += omega*here->HSMHV2_ydyn_gP[gNode]; - *(here->HSMHV2GPgpPtr) += here->HSMHV2_ydc_gP[gNodePrime] ; - *(here->HSMHV2GPgpPtr +1) += omega*here->HSMHV2_ydyn_gP[gNodePrime]; - *(here->HSMHV2GPsPtr) += here->HSMHV2_ydc_gP[sNode]; - *(here->HSMHV2GPsPtr +1) += omega*here->HSMHV2_ydyn_gP[sNode]; - *(here->HSMHV2GPspPtr) += here->HSMHV2_ydc_gP[sNodePrime] ; - *(here->HSMHV2GPspPtr +1) += omega*here->HSMHV2_ydyn_gP[sNodePrime]; - *(here->HSMHV2GPbpPtr) += here->HSMHV2_ydc_gP[bNodePrime] ; - *(here->HSMHV2GPbpPtr +1) += omega*here->HSMHV2_ydyn_gP[bNodePrime]; - if( here->HSMHV2tempNode > 0) { - *(here->HSMHV2GPtempPtr) += model->HSMHV2_type*here->HSMHV2_ydc_gP[tempNode] ; - *(here->HSMHV2GPtempPtr +1) += model->HSMHV2_type*omega*here->HSMHV2_ydyn_gP[tempNode]; - } - if (flg_nqs) { - *(here->HSMHV2GPqiPtr) += model->HSMHV2_type*here->HSMHV2_ydc_gP[qiNode]; - *(here->HSMHV2GPqiPtr+1) += model->HSMHV2_type*omega*here->HSMHV2_ydyn_gP[qiNode]; - *(here->HSMHV2GPqbPtr) += model->HSMHV2_type*here->HSMHV2_ydc_gP[qbNode]; - *(here->HSMHV2GPqbPtr+1) += model->HSMHV2_type*omega*here->HSMHV2_ydyn_gP[qbNode]; - } - - /*source*/ - *(here->HSMHV2SdPtr) += here->HSMHV2_ydc_s[dNode]; - *(here->HSMHV2SdPtr +1) += omega*here->HSMHV2_ydyn_s[dNode]; - *(here->HSMHV2SgpPtr) += here->HSMHV2_ydc_s[gNodePrime]; - *(here->HSMHV2SgpPtr +1) += omega*here->HSMHV2_ydyn_s[gNodePrime]; - *(here->HSMHV2SsPtr) += here->HSMHV2_ydc_s[sNode] ; - *(here->HSMHV2SsPtr +1) += omega*here->HSMHV2_ydyn_s[sNode]; - *(here->HSMHV2SspPtr) += here->HSMHV2_ydc_s[sNodePrime] ; - *(here->HSMHV2SspPtr +1) += omega*here->HSMHV2_ydyn_s[sNodePrime]; - *(here->HSMHV2SbpPtr) += here->HSMHV2_ydc_s[bNodePrime]; - *(here->HSMHV2SbpPtr +1) += omega*here->HSMHV2_ydyn_s[bNodePrime]; - *(here->HSMHV2SsbPtr) += here->HSMHV2_ydc_s[sbNode] ; - *(here->HSMHV2SsbPtr +1) += omega*here->HSMHV2_ydyn_s[sbNode]; - if (flg_subNode > 0) { - *(here->HSMHV2SsubPtr) += here->HSMHV2_ydc_s[subNode]; - } - if( here->HSMHV2tempNode > 0) { - *(here->HSMHV2StempPtr) += model->HSMHV2_type*here->HSMHV2_ydc_s[tempNode]; - *(here->HSMHV2StempPtr +1) += model->HSMHV2_type*omega*here->HSMHV2_ydyn_s[tempNode]; - } - - /*source prime*/ - *(here->HSMHV2SPdPtr) += here->HSMHV2_ydc_sP[dNode] ; - *(here->HSMHV2SPdPtr +1) += omega*here->HSMHV2_ydyn_sP[dNode]; - *(here->HSMHV2SPdpPtr) += here->HSMHV2_ydc_sP[dNodePrime] ; - *(here->HSMHV2SPdpPtr +1) += omega*here->HSMHV2_ydyn_sP[dNodePrime]; - *(here->HSMHV2SPgpPtr) += here->HSMHV2_ydc_sP[gNodePrime] ; - *(here->HSMHV2SPgpPtr +1) += omega*here->HSMHV2_ydyn_sP[gNodePrime]; - *(here->HSMHV2SPsPtr) += here->HSMHV2_ydc_sP[sNode] ; - *(here->HSMHV2SPsPtr +1) += omega*here->HSMHV2_ydyn_sP[sNode]; - *(here->HSMHV2SPspPtr) += here->HSMHV2_ydc_sP[sNodePrime] ; - *(here->HSMHV2SPspPtr +1) += omega*here->HSMHV2_ydyn_sP[sNodePrime]; - *(here->HSMHV2SPbpPtr) += here->HSMHV2_ydc_sP[bNodePrime]; - *(here->HSMHV2SPbpPtr +1) += omega*here->HSMHV2_ydyn_sP[bNodePrime]; - if (flg_subNode > 0) { - *(here->HSMHV2SPsubPtr) += here->HSMHV2_ydc_sP[subNode]; - } - if( here->HSMHV2tempNode > 0) { - *(here->HSMHV2SPtempPtr) += model->HSMHV2_type*here->HSMHV2_ydc_sP[tempNode] ; - *(here->HSMHV2SPtempPtr +1) += model->HSMHV2_type*omega*here->HSMHV2_ydyn_sP[tempNode]; - } - if (flg_nqs) { - *(here->HSMHV2SPqiPtr) += model->HSMHV2_type*here->HSMHV2_ydc_sP[qiNode]; - *(here->HSMHV2SPqiPtr+1) += model->HSMHV2_type*omega*here->HSMHV2_ydyn_sP[qiNode]; - } - - /*bulk prime*/ - *(here->HSMHV2BPdPtr) += here->HSMHV2_ydc_bP[dNode]; - *(here->HSMHV2BPdPtr +1) += omega*here->HSMHV2_ydyn_bP[dNode]; - *(here->HSMHV2BPsPtr) += here->HSMHV2_ydc_bP[sNode]; - *(here->HSMHV2BPsPtr +1) += omega*here->HSMHV2_ydyn_bP[sNode]; - *(here->HSMHV2BPdpPtr) += here->HSMHV2_ydc_bP[dNodePrime]; - *(here->HSMHV2BPdpPtr +1) += omega*here->HSMHV2_ydyn_bP[dNodePrime]; - *(here->HSMHV2BPgpPtr) += here->HSMHV2_ydc_bP[gNodePrime] ; - *(here->HSMHV2BPgpPtr +1) += omega*here->HSMHV2_ydyn_bP[gNodePrime]; - *(here->HSMHV2BPspPtr) += here->HSMHV2_ydc_bP[sNodePrime]; - *(here->HSMHV2BPspPtr +1) += omega*here->HSMHV2_ydyn_bP[sNodePrime]; - *(here->HSMHV2BPbpPtr) += here->HSMHV2_ydc_bP[bNodePrime]; - *(here->HSMHV2BPbpPtr +1) += omega*here->HSMHV2_ydyn_bP[bNodePrime]; - *(here->HSMHV2BPbPtr) += here->HSMHV2_ydc_bP[bNode]; - *(here->HSMHV2BPbPtr +1) += omega*here->HSMHV2_ydyn_bP[bNode]; - *(here->HSMHV2BPdbPtr) += here->HSMHV2_ydc_bP[dbNode] ; - *(here->HSMHV2BPdbPtr +1) += omega*here->HSMHV2_ydyn_bP[dbNode]; - *(here->HSMHV2BPsbPtr) += here->HSMHV2_ydc_bP[sbNode] ; - *(here->HSMHV2BPsbPtr +1) += omega*here->HSMHV2_ydyn_bP[sbNode]; - if( here->HSMHV2tempNode > 0) { - *(here->HSMHV2BPtempPtr) += model->HSMHV2_type*here->HSMHV2_ydc_bP[tempNode] ; - *(here->HSMHV2BPtempPtr +1) += model->HSMHV2_type*omega*here->HSMHV2_ydyn_bP[tempNode]; - } - if (flg_nqs) { - *(here->HSMHV2BPqbPtr) += model->HSMHV2_type*here->HSMHV2_ydc_bP[qbNode]; - *(here->HSMHV2BPqbPtr+1) += model->HSMHV2_type*omega*here->HSMHV2_ydyn_bP[qbNode]; - } - - /*bulk*/ - *(here->HSMHV2BbpPtr) += here->HSMHV2_ydc_b[bNodePrime] ; - *(here->HSMHV2BbpPtr +1) += omega*here->HSMHV2_ydyn_b[bNodePrime]; - *(here->HSMHV2BbPtr) += here->HSMHV2_ydc_b[bNode] ; - *(here->HSMHV2BbPtr +1) += omega*here->HSMHV2_ydyn_b[bNode]; - - /*drain bulk*/ - *(here->HSMHV2DBdPtr) += here->HSMHV2_ydc_db[dNode] ; - *(here->HSMHV2DBdPtr +1) += omega*here->HSMHV2_ydyn_db[dNode]; - *(here->HSMHV2DBbpPtr) += here->HSMHV2_ydc_db[bNodePrime] ; - *(here->HSMHV2DBbpPtr +1) += omega*here->HSMHV2_ydyn_db[bNodePrime]; - *(here->HSMHV2DBdbPtr) += here->HSMHV2_ydc_db[dbNode] ; - *(here->HSMHV2DBdbPtr +1) += omega*here->HSMHV2_ydyn_db[dbNode]; - if( here->HSMHV2tempNode > 0) { - *(here->HSMHV2DBtempPtr) += model->HSMHV2_type*here->HSMHV2_ydc_db[tempNode] ; - *(here->HSMHV2DBtempPtr +1) += model->HSMHV2_type*omega*here->HSMHV2_ydyn_db[tempNode]; - } - - /*source bulk*/ - *(here->HSMHV2SBsPtr) += here->HSMHV2_ydc_sb[sNode] ; - *(here->HSMHV2SBsPtr +1) += omega*here->HSMHV2_ydyn_sb[sNode]; - *(here->HSMHV2SBbpPtr) += here->HSMHV2_ydc_sb[bNodePrime]; - *(here->HSMHV2SBbpPtr +1) += omega*here->HSMHV2_ydyn_sb[bNodePrime]; - *(here->HSMHV2SBsbPtr) += here->HSMHV2_ydc_sb[sbNode] ; - *(here->HSMHV2SBsbPtr +1) += omega*here->HSMHV2_ydyn_sb[sbNode]; - if( here->HSMHV2tempNode > 0) { - *(here->HSMHV2SBtempPtr) += model->HSMHV2_type*here->HSMHV2_ydc_sb[tempNode]; - *(here->HSMHV2SBtempPtr +1) += model->HSMHV2_type*omega*here->HSMHV2_ydyn_sb[tempNode]; - } - - /*temp*/ - if( here->HSMHV2tempNode > 0) { - *(here->HSMHV2TempdPtr) += model->HSMHV2_type*here->HSMHV2_ydc_t[dNode] ; - *(here->HSMHV2TempdPtr +1) += model->HSMHV2_type*omega*here->HSMHV2_ydyn_t[dNode]; - *(here->HSMHV2TempdpPtr) += model->HSMHV2_type*here->HSMHV2_ydc_t[dNodePrime] ; - *(here->HSMHV2TempdpPtr +1) += model->HSMHV2_type*omega*here->HSMHV2_ydyn_t[dNodePrime]; - *(here->HSMHV2TempgpPtr) += model->HSMHV2_type*here->HSMHV2_ydc_t[gNodePrime]; - *(here->HSMHV2TempgpPtr +1) += model->HSMHV2_type*omega*here->HSMHV2_ydyn_t[gNodePrime]; - *(here->HSMHV2TempsPtr) += model->HSMHV2_type*here->HSMHV2_ydc_t[sNode] ; - *(here->HSMHV2TempsPtr +1) += model->HSMHV2_type*omega*here->HSMHV2_ydyn_t[sNode]; - *(here->HSMHV2TempspPtr) += model->HSMHV2_type*here->HSMHV2_ydc_t[sNodePrime] ; - *(here->HSMHV2TempspPtr +1) += model->HSMHV2_type*omega*here->HSMHV2_ydyn_t[sNodePrime]; - *(here->HSMHV2TempbpPtr) += model->HSMHV2_type*here->HSMHV2_ydc_t[bNodePrime] ; - *(here->HSMHV2TempbpPtr +1) += model->HSMHV2_type*omega*here->HSMHV2_ydyn_t[bNodePrime]; - *(here->HSMHV2TemptempPtr) += here->HSMHV2_ydc_t[tempNode] ; - *(here->HSMHV2TemptempPtr +1) += omega*here->HSMHV2_ydyn_t[tempNode]; - } - /* additional entries for flat nqs handling */ - if ( flg_nqs ) { - /*qi*/ - *(here->HSMHV2QIdpPtr) += model->HSMHV2_type*here->HSMHV2_ydc_qi[dNodePrime]; - *(here->HSMHV2QIdpPtr+1) += model->HSMHV2_type*omega*here->HSMHV2_ydyn_qi[dNodePrime]; - *(here->HSMHV2QIgpPtr) += model->HSMHV2_type*here->HSMHV2_ydc_qi[gNodePrime]; - *(here->HSMHV2QIgpPtr+1) += model->HSMHV2_type*omega*here->HSMHV2_ydyn_qi[gNodePrime]; - *(here->HSMHV2QIspPtr) += model->HSMHV2_type*here->HSMHV2_ydc_qi[sNodePrime]; - *(here->HSMHV2QIspPtr+1) += model->HSMHV2_type*omega*here->HSMHV2_ydyn_qi[sNodePrime]; - *(here->HSMHV2QIbpPtr) += model->HSMHV2_type*here->HSMHV2_ydc_qi[bNodePrime]; - *(here->HSMHV2QIbpPtr+1) += model->HSMHV2_type*omega*here->HSMHV2_ydyn_qi[bNodePrime]; - *(here->HSMHV2QIqiPtr) += here->HSMHV2_ydc_qi[qiNode]; - *(here->HSMHV2QIqiPtr+1) += omega*here->HSMHV2_ydyn_qi[qiNode]; - if ( here->HSMHV2tempNode > 0 ) { - *(here->HSMHV2QItempPtr) += here->HSMHV2_ydc_qi[tempNode]; - *(here->HSMHV2QItempPtr+1) += omega*here->HSMHV2_ydyn_qi[tempNode]; - } - - /*qb*/ - *(here->HSMHV2QBdpPtr) += model->HSMHV2_type*here->HSMHV2_ydc_qb[dNodePrime]; - *(here->HSMHV2QBdpPtr+1) += model->HSMHV2_type*omega*here->HSMHV2_ydyn_qb[dNodePrime]; - *(here->HSMHV2QBgpPtr) += model->HSMHV2_type*here->HSMHV2_ydc_qb[gNodePrime]; - *(here->HSMHV2QBgpPtr+1) += model->HSMHV2_type*omega*here->HSMHV2_ydyn_qb[gNodePrime]; - *(here->HSMHV2QBspPtr) += model->HSMHV2_type*here->HSMHV2_ydc_qb[sNodePrime]; - *(here->HSMHV2QBspPtr+1) += model->HSMHV2_type*omega*here->HSMHV2_ydyn_qb[sNodePrime]; - *(here->HSMHV2QBbpPtr) += model->HSMHV2_type*here->HSMHV2_ydc_qb[bNodePrime]; - *(here->HSMHV2QBbpPtr+1) += model->HSMHV2_type*omega*here->HSMHV2_ydyn_qb[bNodePrime]; - *(here->HSMHV2QBqbPtr) += here->HSMHV2_ydc_qb[qbNode]; - *(here->HSMHV2QBqbPtr+1) += omega*here->HSMHV2_ydyn_qb[qbNode]; - if ( here->HSMHV2tempNode > 0 ) { - *(here->HSMHV2QBtempPtr) += here->HSMHV2_ydc_qb[tempNode]; - *(here->HSMHV2QBtempPtr+1) += omega*here->HSMHV2_ydyn_qb[tempNode]; - } - } - } - } - - return(OK); -} diff --git a/src/spicelib/devices/hisimhv2/hsmhv2ask.c b/src/spicelib/devices/hisimhv2/hsmhv2ask.c deleted file mode 100644 index d0ca72423..000000000 --- a/src/spicelib/devices/hisimhv2/hsmhv2ask.c +++ /dev/null @@ -1,469 +0,0 @@ -/*********************************************************************** - - HiSIM (Hiroshima University STARC IGFET Model) - Copyright (C) 2014 Hiroshima University & STARC - - MODEL NAME : HiSIM_HV - ( VERSION : 2 SUBVERSION : 2 REVISION : 0 ) - Model Parameter 'VERSION' : 2.20 - FILE : hsmhvask.c - - DATE : 2014.6.11 - - released by - Hiroshima University & - Semiconductor Technology Academic Research Center (STARC) -***********************************************************************/ - -/********************************************************************** - -The following source code, and all copyrights, trade secrets or other -intellectual property rights in and to the source code in its entirety, -is owned by the Hiroshima University and the STARC organization. - -All users need to follow the "HISIM_HV Distribution Statement and -Copyright Notice" attached to HiSIM_HV model. - ------HISIM_HV Distribution Statement and Copyright Notice-------------- - -Software is distributed as is, completely without warranty or service -support. Hiroshima University or STARC and its employees are not liable -for the condition or performance of the software. - -Hiroshima University and STARC own the copyright and grant users a perpetual, -irrevocable, worldwide, non-exclusive, royalty-free license with respect -to the software as set forth below. - -Hiroshima University and STARC hereby disclaims all implied warranties. - -Hiroshima University and STARC grant the users the right to modify, copy, -and redistribute the software and documentation, both within the user's -organization and externally, subject to the following restrictions - -1. The users agree not to charge for Hiroshima University and STARC code -itself but may charge for additions, extensions, or support. - -2. In any product based on the software, the users agree to acknowledge -Hiroshima University and STARC that developed the software. This -acknowledgment shall appear in the product documentation. - -3. The users agree to reproduce any copyright notice which appears on -the software on any copy or modification of such made available -to others." - -Toshimasa Asahara, President, Hiroshima University -Mitiko Miura-Mattausch, Professor, Hiroshima University -Katsuhiro Shimohigashi, President&CEO, STARC -June 2008 (revised October 2011) -*************************************************************************/ - -#include "ngspice/ngspice.h" -#include "ngspice/ifsim.h" -#include "ngspice/cktdefs.h" -#include "ngspice/devdefs.h" -#include "hsmhv2def.h" -#include "ngspice/sperror.h" -#include "ngspice/suffix.h" - -int HSMHV2ask( - CKTcircuit *ckt, - GENinstance *inst, - int which, - IFvalue *value, - IFvalue *select) -{ - HSMHV2instance *here = (HSMHV2instance*)inst; - - int flg_nqs ; - double cggb_nqs, cgdb_nqs, cgsb_nqs, cdgb_nqs, cddb_nqs, cdsb_nqs, cbgb_nqs, cbdb_nqs, cbsb_nqs ; - double Qi_nqs, dQi_nqs_dVds, dQi_nqs_dVgs, dQi_nqs_dVbs, - dQb_nqs_dVds, dQb_nqs_dVgs, dQb_nqs_dVbs ; - double Qdrat, dQdrat_dVds, dQdrat_dVgs, dQdrat_dVbs, - dQi_dVds, dQi_dVgs, dQi_dVbs, - dQbulk_dVds, dQbulk_dVgs, dQbulk_dVbs ; - double dQd_nqs_dVds, dQd_nqs_dVgs, dQd_nqs_dVbs, dQd_nqs_dQi_nqs ; - double dQg_nqs_dQi_nqs, dQg_nqs_dQb_nqs ; - - NG_IGNORE(select); - - here->HSMHV2_csdo = - (here->HSMHV2_cddo + here->HSMHV2_cgdo + here->HSMHV2_cbdo) ; - here->HSMHV2_csgo = - (here->HSMHV2_cdgo + here->HSMHV2_cggo + here->HSMHV2_cbgo) ; - here->HSMHV2_csbo = - (here->HSMHV2_cdbo + here->HSMHV2_cgbo + here->HSMHV2_cbbo) ; - - here->HSMHV2_cdso = - (here->HSMHV2_cddo + here->HSMHV2_cdgo + here->HSMHV2_cdbo) ; - here->HSMHV2_cgso = - (here->HSMHV2_cgdo + here->HSMHV2_cggo + here->HSMHV2_cgbo) ; - here->HSMHV2_csso = - (here->HSMHV2_csdo + here->HSMHV2_csgo + here->HSMHV2_csbo) ; - - /* NQS? */ - if (here->HSMHV2QIqiPtr == NULL) { - flg_nqs = 0 ; - } else { - flg_nqs = 1 ; - } - /* printf("HSMHV2ask: flg_nqs = %d\n", flg_nqs) ; */ - - if (flg_nqs) { /* collect data for NQS case (DC operating point only!) */ - Qi_nqs = *(ckt->CKTstate0 + here->HSMHV2qi_nqs) ; - if ( here->HSMHV2_mode > 0 ) { /* forward mode */ - Qdrat = here->HSMHV2_Xd ; - dQdrat_dVds = here->HSMHV2_Xd_dVdsi ; - dQdrat_dVgs = here->HSMHV2_Xd_dVgsi ; - dQdrat_dVbs = here->HSMHV2_Xd_dVbsi ; - dQi_dVds = here->HSMHV2_Qi_dVdsi ; - dQi_dVgs = here->HSMHV2_Qi_dVgsi ; - dQi_dVbs = here->HSMHV2_Qi_dVbsi ; - dQbulk_dVds = here->HSMHV2_Qbulk_dVdsi ; - dQbulk_dVgs = here->HSMHV2_Qbulk_dVgsi ; - dQbulk_dVbs = here->HSMHV2_Qbulk_dVbsi ; - } else { /* reverse mode */ - Qdrat = 1.0 - here->HSMHV2_Xd ; - dQdrat_dVds = +(here->HSMHV2_Xd_dVdsi + here->HSMHV2_Xd_dVgsi + here->HSMHV2_Xd_dVbsi) ; - dQdrat_dVgs = - here->HSMHV2_Xd_dVgsi ; - dQdrat_dVbs = - here->HSMHV2_Xd_dVbsi ; - dQi_dVds = -(here->HSMHV2_Qi_dVdsi + here->HSMHV2_Qi_dVgsi + here->HSMHV2_Qi_dVbsi) ; - dQi_dVgs = here->HSMHV2_Qi_dVgsi ; - dQi_dVbs = here->HSMHV2_Qi_dVbsi ; - dQbulk_dVds = -(here->HSMHV2_Qbulk_dVdsi + here->HSMHV2_Qbulk_dVgsi + here->HSMHV2_Qbulk_dVbsi) ; - dQbulk_dVgs = here->HSMHV2_Qbulk_dVgsi ; - dQbulk_dVbs = here->HSMHV2_Qbulk_dVbsi ; - } - /* from Qg_nqs = - Qi_nqs - Qb_nqs: */ - dQg_nqs_dQi_nqs = - 1.0 ; - dQg_nqs_dQb_nqs = - 1.0 ; - /* from Qd_nqs = Qi_nqs * Qdrat: */ - dQd_nqs_dVds = Qi_nqs * dQdrat_dVds ; - dQd_nqs_dVgs = Qi_nqs * dQdrat_dVgs ; - dQd_nqs_dVbs = Qi_nqs * dQdrat_dVbs ; - dQd_nqs_dQi_nqs = Qdrat ; - - /* by implicit differentiation of the NQS equations (DC operating point only!): */ - dQi_nqs_dVds = dQi_dVds ; - dQi_nqs_dVgs = dQi_dVgs ; - dQi_nqs_dVbs = dQi_dVbs ; - dQb_nqs_dVds = dQbulk_dVds ; - dQb_nqs_dVgs = dQbulk_dVgs ; - dQb_nqs_dVbs = dQbulk_dVbs ; - - cggb_nqs = dQg_nqs_dQi_nqs * dQi_nqs_dVgs + dQg_nqs_dQb_nqs * dQb_nqs_dVgs ; - cgdb_nqs = dQg_nqs_dQi_nqs * dQi_nqs_dVds + dQg_nqs_dQb_nqs * dQb_nqs_dVds ; - cgsb_nqs = - dQg_nqs_dQi_nqs * (dQi_nqs_dVds + dQi_nqs_dVgs + dQi_nqs_dVbs) - - dQg_nqs_dQb_nqs * (dQb_nqs_dVds + dQb_nqs_dVgs + dQb_nqs_dVbs) ; - cdgb_nqs = dQd_nqs_dVgs + dQd_nqs_dQi_nqs * dQi_nqs_dVgs ; - cddb_nqs = dQd_nqs_dVds + dQd_nqs_dQi_nqs * dQi_nqs_dVds ; - cdsb_nqs = -(dQd_nqs_dVds + dQd_nqs_dVgs + dQd_nqs_dVbs) - dQd_nqs_dQi_nqs * (dQi_nqs_dVds + dQi_nqs_dVgs + dQi_nqs_dVbs) ; - cbgb_nqs = dQb_nqs_dVgs ; - cbdb_nqs = dQb_nqs_dVds ; - cbsb_nqs = -(dQb_nqs_dVds + dQb_nqs_dVgs + dQb_nqs_dVbs) ; - } else { /* QS case */ - cggb_nqs = cgdb_nqs = cgsb_nqs = cdgb_nqs = cddb_nqs = cdsb_nqs = cbgb_nqs = cbdb_nqs = cbsb_nqs = 0.0 ; - } - - - switch (which) { - case HSMHV2_COSELFHEAT: - value->iValue = here->HSMHV2_coselfheat; - return(OK); - case HSMHV2_COSUBNODE: - value->iValue = here->HSMHV2_cosubnode; - return(OK); - case HSMHV2_L: - value->rValue = here->HSMHV2_l; - return(OK); - case HSMHV2_W: - value->rValue = here->HSMHV2_w; - return(OK); - case HSMHV2_AS: - value->rValue = here->HSMHV2_as; - return(OK); - case HSMHV2_AD: - value->rValue = here->HSMHV2_ad; - return(OK); - case HSMHV2_PS: - value->rValue = here->HSMHV2_ps; - return(OK); - case HSMHV2_PD: - value->rValue = here->HSMHV2_pd; - return(OK); - case HSMHV2_NRS: - value->rValue = here->HSMHV2_nrs; - return(OK); - case HSMHV2_NRD: - value->rValue = here->HSMHV2_nrd; - return(OK); - case HSMHV2_DTEMP: - value->rValue = here->HSMHV2_dtemp; - return(OK); - case HSMHV2_OFF: - value->iValue = here->HSMHV2_off; - return(OK); - case HSMHV2_IC_VBS: - value->rValue = here->HSMHV2_icVBS; - return(OK); - case HSMHV2_IC_VDS: - value->rValue = here->HSMHV2_icVDS; - return(OK); - case HSMHV2_IC_VGS: - value->rValue = here->HSMHV2_icVGS; - return(OK); - case HSMHV2_DNODE: - value->iValue = here->HSMHV2dNode; - return(OK); - case HSMHV2_GNODE: - value->iValue = here->HSMHV2gNode; - return(OK); - case HSMHV2_SNODE: - value->iValue = here->HSMHV2sNode; - return(OK); - case HSMHV2_BNODE: - value->iValue = here->HSMHV2bNode; - return(OK); - case HSMHV2_DNODEPRIME: - value->iValue = here->HSMHV2dNodePrime; - return(OK); - case HSMHV2_SNODEPRIME: - value->iValue = here->HSMHV2sNodePrime; - return(OK); - case HSMHV2_SOURCECONDUCT: - value->rValue = here->HSMHV2sourceConductance; - return(OK); - case HSMHV2_DRAINCONDUCT: - value->rValue = here->HSMHV2drainConductance; - return(OK); - case HSMHV2_VBD: - value->rValue = *(ckt->CKTstate0 + here->HSMHV2vbd); - return(OK); - case HSMHV2_VBS: - value->rValue = *(ckt->CKTstate0 + here->HSMHV2vbs); - return(OK); - case HSMHV2_VGS: - value->rValue = *(ckt->CKTstate0 + here->HSMHV2vgs); - return(OK); - case HSMHV2_VDS: - value->rValue = *(ckt->CKTstate0 + here->HSMHV2vds); - return(OK); - case HSMHV2_CD: - value->rValue = here->HSMHV2_ids; - return(OK); - case HSMHV2_ISUB: - value->rValue = here->HSMHV2_isub; - return(OK); - case HSMHV2_ISUBLD: - value->rValue = here->HSMHV2_isubld; - return(OK); - case HSMHV2_IDSIBPC: - value->rValue = here->HSMHV2_idsibpc; - return(OK); - case HSMHV2_IGIDL: - value->rValue = here->HSMHV2_igidl; - return(OK); - case HSMHV2_IGISL: - value->rValue = here->HSMHV2_igisl; - return(OK); - case HSMHV2_IGD: - value->rValue = here->HSMHV2_igd; - return(OK); - case HSMHV2_IGS: - value->rValue = here->HSMHV2_igs; - return(OK); - case HSMHV2_IGB: - value->rValue = here->HSMHV2_igb; - return(OK); - case HSMHV2_CBS: - value->rValue = here->HSMHV2_ibs; - return(OK); - case HSMHV2_CBD: - value->rValue = here->HSMHV2_ibd; - return(OK); - case HSMHV2_GM: - value->rValue = here->HSMHV2_dIds_dVgsi; - return(OK); - case HSMHV2_GMT: - value->rValue = here->HSMHV2_dIds_dTi; - return(OK); - case HSMHV2_GDS: - value->rValue = here->HSMHV2_dIds_dVdsi; - return(OK); - case HSMHV2_GMBS: - value->rValue = here->HSMHV2_dIds_dVbsi; - return(OK); - case HSMHV2_GBD: - value->rValue = here->HSMHV2_gbd; - return(OK); - case HSMHV2_GBS: - value->rValue = here->HSMHV2_gbs; - return(OK); - case HSMHV2_QB: - value->rValue = *(ckt->CKTstate0 + here->HSMHV2qb); - return(OK); - case HSMHV2_CQB: - value->rValue = *(ckt->CKTstate0 + here->HSMHV2cqb); - return(OK); - case HSMHV2_QG: - value->rValue = *(ckt->CKTstate0 + here->HSMHV2qg); - return(OK); - case HSMHV2_CQG: - value->rValue = *(ckt->CKTstate0 + here->HSMHV2cqg); - return(OK); - case HSMHV2_QD: - value->rValue = *(ckt->CKTstate0 + here->HSMHV2qd); - return(OK); - case HSMHV2_CQD: - value->rValue = *(ckt->CKTstate0 + here->HSMHV2cqd); - return(OK); - case HSMHV2_CGG: - value->rValue = here->HSMHV2_dQg_dVgsi - here->HSMHV2_cggo; - if (flg_nqs) value->rValue += cggb_nqs; - return(OK); - case HSMHV2_CGD: - value->rValue = (here->HSMHV2_mode > 0) ? here->HSMHV2_dQg_dVdsi - here->HSMHV2_cgdo - : - (here->HSMHV2_dQg_dVdsi + here->HSMHV2_dQg_dVgsi + here->HSMHV2_dQg_dVbsi) - - here->HSMHV2_cgso; - if (flg_nqs) value->rValue += cgdb_nqs; - return(OK); - case HSMHV2_CGS: - value->rValue = (here->HSMHV2_mode > 0) ? - (here->HSMHV2_dQg_dVdsi + here->HSMHV2_dQg_dVgsi + here->HSMHV2_dQg_dVbsi) - - here->HSMHV2_cgso - : here->HSMHV2_dQg_dVdsi - here->HSMHV2_cgdo; - if (flg_nqs) value->rValue += cgsb_nqs; - return(OK); - case HSMHV2_CDG: - value->rValue = (here->HSMHV2_mode > 0) ? here->HSMHV2_dQdi_dVgsi - here->HSMHV2_cdgo - : here->HSMHV2_dQsi_dVgsi - here->HSMHV2_csgo; - if (flg_nqs) value->rValue += cdgb_nqs; - return(OK); - case HSMHV2_CDD: - value->rValue = (here->HSMHV2_mode > 0) ? here->HSMHV2_dQdi_dVdsi - here->HSMHV2_cddo - : - (here->HSMHV2_dQsi_dVdsi + here->HSMHV2_dQsi_dVgsi + here->HSMHV2_dQsi_dVbsi) - - here->HSMHV2_csso; - if (flg_nqs) value->rValue += cddb_nqs; - return(OK); - case HSMHV2_CDS: - value->rValue = (here->HSMHV2_mode > 0) ? - (here->HSMHV2_dQdi_dVdsi + here->HSMHV2_dQdi_dVgsi + here->HSMHV2_dQdi_dVbsi) - - here->HSMHV2_cdso - : here->HSMHV2_dQsi_dVdsi - here->HSMHV2_csdo; - if (flg_nqs) value->rValue += cdsb_nqs; - return(OK); - case HSMHV2_CBG: - value->rValue = here->HSMHV2_dQb_dVgsi - here->HSMHV2_cbgo; - if (flg_nqs) value->rValue += cbgb_nqs; - return(OK); - case HSMHV2_CBDB: - value->rValue = (here->HSMHV2_mode > 0) ? here->HSMHV2_dQb_dVdsi - here->HSMHV2_cbdo - : - (here->HSMHV2_dQb_dVdsi + here->HSMHV2_dQb_dVgsi + here->HSMHV2_dQb_dVbsi) - + (here->HSMHV2_cbdo+here->HSMHV2_cbgo+here->HSMHV2_cbbo); - if (flg_nqs) value->rValue += cbdb_nqs; - return(OK); - case HSMHV2_CBSB: - value->rValue = (here->HSMHV2_mode > 0) ? - (here->HSMHV2_dQb_dVdsi + here->HSMHV2_dQb_dVgsi + here->HSMHV2_dQb_dVbsi) - + (here->HSMHV2_cbdo + here->HSMHV2_cbgo + here->HSMHV2_cbbo) - : here->HSMHV2_dQb_dVdsi - here->HSMHV2_cbdo; - if (flg_nqs) value->rValue += cbsb_nqs; - return(OK); - case HSMHV2_CGDO: - value->rValue = (here->HSMHV2_mode > 0) ? here->HSMHV2_cgdo : here->HSMHV2_cgso; - - return(OK); - case HSMHV2_CGSO: - value->rValue = (here->HSMHV2_mode > 0) ? here->HSMHV2_cgso : here->HSMHV2_cgdo; - return(OK); - case HSMHV2_CGBO: - value->rValue = here->HSMHV2_cgbo; - return(OK); - case HSMHV2_CAPBD: - value->rValue = here->HSMHV2_capbd; - return(OK); - case HSMHV2_CAPBS: - value->rValue = here->HSMHV2_capbs; - return(OK); - case HSMHV2_VON: - value->rValue = here->HSMHV2_von; - return(OK); - case HSMHV2_VDSAT: - value->rValue = here->HSMHV2_vdsat; - return(OK); - case HSMHV2_QBS: - value->rValue = *(ckt->CKTstate0 + here->HSMHV2qbs); - return(OK); - case HSMHV2_QBD: - value->rValue = *(ckt->CKTstate0 + here->HSMHV2qbd); - return(OK); - case HSMHV2_CORBNET: - value->iValue = here->HSMHV2_corbnet; - return(OK); - case HSMHV2_RBPB: - value->rValue = here->HSMHV2_rbpb; - return (OK); - case HSMHV2_RBPD: - value->rValue = here->HSMHV2_rbpd; - return(OK); - case HSMHV2_RBPS: - value->rValue = here->HSMHV2_rbps; - return(OK); - case HSMHV2_RBDB: - value->rValue = here->HSMHV2_rbdb; - return(OK); - case HSMHV2_RBSB: - value->rValue = here->HSMHV2_rbsb; - return(OK); - case HSMHV2_CORG: - value->iValue = here->HSMHV2_corg; - return(OK); - case HSMHV2_NGCON: - value->rValue = here->HSMHV2_ngcon; - return(OK); - case HSMHV2_XGW: - value->rValue = here->HSMHV2_xgw; - return(OK); - case HSMHV2_XGL: - value->rValue = here->HSMHV2_xgl; - return(OK); - case HSMHV2_NF: - value->rValue = here->HSMHV2_nf; - return(OK); - case HSMHV2_SA: - value->rValue = here->HSMHV2_sa; - return(OK); - case HSMHV2_SB: - value->rValue = here->HSMHV2_sb; - return(OK); - case HSMHV2_SD: - value->rValue = here->HSMHV2_sd; - return(OK); - case HSMHV2_NSUBCDFM: - value->rValue = here->HSMHV2_nsubcdfm; - return(OK); - case HSMHV2_M: - value->rValue = here->HSMHV2_m; - return(OK); - case HSMHV2_SUBLD1: - value->rValue = here->HSMHV2_subld1; - return(OK); - case HSMHV2_SUBLD2: - value->rValue = here->HSMHV2_subld2; - return(OK); - case HSMHV2_LOVER: - value->rValue = here->HSMHV2_lover; - return(OK); - case HSMHV2_LOVERS: - value->rValue = here->HSMHV2_lovers; - return(OK); - case HSMHV2_LOVERLD: - value->rValue = here->HSMHV2_loverld; - return(OK); - case HSMHV2_LDRIFT1: - value->rValue = here->HSMHV2_ldrift1; - return(OK); - case HSMHV2_LDRIFT2: - value->rValue = here->HSMHV2_ldrift2; - return(OK); - case HSMHV2_LDRIFT1S: - value->rValue = here->HSMHV2_ldrift1s; - return(OK); - case HSMHV2_LDRIFT2S: - value->rValue = here->HSMHV2_ldrift2s; - return(OK); - default: - return(E_BADPARM); - } - /* NOTREACHED */ -} diff --git a/src/spicelib/devices/hisimhv2/hsmhv2cvtest.c b/src/spicelib/devices/hisimhv2/hsmhv2cvtest.c deleted file mode 100644 index 2d2b689a5..000000000 --- a/src/spicelib/devices/hisimhv2/hsmhv2cvtest.c +++ /dev/null @@ -1,295 +0,0 @@ -/*********************************************************************** - - HiSIM (Hiroshima University STARC IGFET Model) - Copyright (C) 2014 Hiroshima University & STARC - - MODEL NAME : HiSIM_HV - ( VERSION : 2 SUBVERSION : 2 REVISION : 0 ) - Model Parameter 'VERSION' : 2.20 - FILE : hsmhvcvtest.c - - DATE : 2014.6.11 - - released by - Hiroshima University & - Semiconductor Technology Academic Research Center (STARC) -***********************************************************************/ - -/********************************************************************** - -The following source code, and all copyrights, trade secrets or other -intellectual property rights in and to the source code in its entirety, -is owned by the Hiroshima University and the STARC organization. - -All users need to follow the "HISIM_HV Distribution Statement and -Copyright Notice" attached to HiSIM_HV model. - ------HISIM_HV Distribution Statement and Copyright Notice-------------- - -Software is distributed as is, completely without warranty or service -support. Hiroshima University or STARC and its employees are not liable -for the condition or performance of the software. - -Hiroshima University and STARC own the copyright and grant users a perpetual, -irrevocable, worldwide, non-exclusive, royalty-free license with respect -to the software as set forth below. - -Hiroshima University and STARC hereby disclaims all implied warranties. - -Hiroshima University and STARC grant the users the right to modify, copy, -and redistribute the software and documentation, both within the user's -organization and externally, subject to the following restrictions - -1. The users agree not to charge for Hiroshima University and STARC code -itself but may charge for additions, extensions, or support. - -2. In any product based on the software, the users agree to acknowledge -Hiroshima University and STARC that developed the software. This -acknowledgment shall appear in the product documentation. - -3. The users agree to reproduce any copyright notice which appears on -the software on any copy or modification of such made available -to others." - -Toshimasa Asahara, President, Hiroshima University -Mitiko Miura-Mattausch, Professor, Hiroshima University -Katsuhiro Shimohigashi, President&CEO, STARC -June 2008 (revised October 2011) -*************************************************************************/ - -#include "ngspice/ngspice.h" -#include "ngspice/cktdefs.h" -#include "hsmhv2def.h" -#include "ngspice/trandefs.h" -#include "ngspice/const.h" -#include "ngspice/devdefs.h" -#include "ngspice/sperror.h" -#include "ngspice/suffix.h" - -int HSMHV2convTest( - GENmodel *inModel, - CKTcircuit *ckt) -{ - HSMHV2model *model = (HSMHV2model*)inModel; - HSMHV2instance *here; - double vds=0.0, vgs=0.0, vbs=0.0, vdse=0.0, vgse=0.0, vbse=0.0, vdbd=0.0, vsbs=0.0, deltemp =0.0 ; - double delvds=0.0, delvgs=0.0, delvbs=0.0, delvdse=0.0, delvgse=0.0, delvbse=0.0, delvdbd=0.0, delvsbs=0.0, deldeltemp =0.0 ; - double Ids=0.0, gds=0.0, gm=0.0, gmbs=0.0, gmT=0.0, gmbs_ext=0.0, gds_ext=0.0, gm_ext=0.0, - Isub=0.0, dIsub_dVds=0.0, dIsub_dVgs=0.0, dIsub_dVbs=0.0, dIsub_dT=0.0, - Isubs=0.0, dIsubs_dVds=0.0, dIsubs_dVgs=0.0, dIsubs_dVbs=0.0, dIsubs_dT=0.0, - Igidl=0.0, dIgidl_dVds=0.0, dIgidl_dVgs=0.0, dIgidl_dVbs=0.0, dIgidl_dT=0.0, - Igisl=0.0, dIgisl_dVds=0.0, dIgisl_dVgs=0.0, dIgisl_dVbs=0.0, dIgisl_dT=0.0, - Igd=0.0, dIgd_dVd=0.0, dIgd_dVg=0.0, dIgd_dVb=0.0, dIgd_dT=0.0, - Igs=0.0, dIgs_dVd=0.0, dIgs_dVg=0.0, dIgs_dVb=0.0, dIgs_dT=0.0, - Igb=0.0, dIgb_dVd=0.0, dIgb_dVg=0.0, dIgb_dVb=0.0, dIgb_dT=0.0, - Ibd=0.0, Gbd=0.0, Gbdt=0.0, - Ibs=0.0, Gbs=0.0, Gbst =0.0 ; - double i_dP=0.0, i_gP=0.0, i_sP=0.0, i_db=0.0, i_sb=0.0, - i_dP_hat=0.0, i_gP_hat=0.0, i_sP_hat=0.0, i_db_hat=0.0, i_sb_hat =0.0 ; - double tol0=0.0, tol1=0.0, tol2=0.0, tol3=0.0, tol4 =0.0 ; - - - /* loop through all the HSMHV2 device models */ - for ( ; model != NULL; model = HSMHV2nextModel(model)) { - /* loop through all the instances of the model */ - for ( here = HSMHV2instances(model); here != NULL ; - here = HSMHV2nextInstance(here)) { - - vds = model->HSMHV2_type * - (*(ckt->CKTrhsOld+here->HSMHV2dNodePrime) - - *(ckt->CKTrhsOld+here->HSMHV2sNodePrime)); - vgs = model->HSMHV2_type * - (*(ckt->CKTrhsOld+here->HSMHV2gNodePrime) - - *(ckt->CKTrhsOld+here->HSMHV2sNodePrime)); - vbs = model->HSMHV2_type * - (*(ckt->CKTrhsOld+here->HSMHV2bNodePrime) - - *(ckt->CKTrhsOld+here->HSMHV2sNodePrime)); - vdse = model->HSMHV2_type * - (*(ckt->CKTrhsOld+here->HSMHV2dNode) - - *(ckt->CKTrhsOld+here->HSMHV2sNode)); - vgse = model->HSMHV2_type * - (*(ckt->CKTrhsOld+here->HSMHV2gNodePrime) - - *(ckt->CKTrhsOld+here->HSMHV2sNode)); - vbse = model->HSMHV2_type * - (*(ckt->CKTrhsOld+here->HSMHV2bNodePrime) - - *(ckt->CKTrhsOld+here->HSMHV2sNode)); - vdbd = model->HSMHV2_type - * (*(ckt->CKTrhsOld + here->HSMHV2dbNode) - - *(ckt->CKTrhsOld + here->HSMHV2dNode)); - vsbs = model->HSMHV2_type - * (*(ckt->CKTrhsOld + here->HSMHV2sbNode) - - *(ckt->CKTrhsOld + here->HSMHV2sNode)); - if( here->HSMHV2tempNode > 0 ){ - deltemp = *(ckt->CKTrhsOld + here->HSMHV2tempNode); - } else { - deltemp = 0.0 ; - } - - delvds = vds - *(ckt->CKTstate0 + here->HSMHV2vds) ; - delvgs = vgs - *(ckt->CKTstate0 + here->HSMHV2vgs) ; - delvbs = vbs - *(ckt->CKTstate0 + here->HSMHV2vbs) ; - delvdse = vdse - *(ckt->CKTstate0 + here->HSMHV2vdse) ; - delvgse = vgse - *(ckt->CKTstate0 + here->HSMHV2vgse) ; - delvbse = vbse - *(ckt->CKTstate0 + here->HSMHV2vbse) ; - delvdbd = vdbd - *(ckt->CKTstate0 + here->HSMHV2vdbd) ; - delvsbs = vsbs - *(ckt->CKTstate0 + here->HSMHV2vsbs) ; - if( here->HSMHV2tempNode > 0 ){ - deldeltemp = deltemp - *(ckt->CKTstate0 + here->HSMHV2deltemp) ; - } else { - deldeltemp = 0.0 ; - } - - if ( here->HSMHV2_mode > 0 ) { /* forward mode */ - Ids = here->HSMHV2_ids ; - gds = here->HSMHV2_dIds_dVdsi ; - gm = here->HSMHV2_dIds_dVgsi ; - gmbs = here->HSMHV2_dIds_dVbsi ; - gmT = (here->HSMHV2tempNode > 0) ? here->HSMHV2_dIds_dTi : 0.0 ; - gmbs_ext = here->HSMHV2_dIds_dVbse; - gds_ext = here->HSMHV2_dIds_dVdse ; - gm_ext = here->HSMHV2_dIds_dVgse; - Isub = here->HSMHV2_isub ; - dIsub_dVds = here->HSMHV2_dIsub_dVdsi ; - dIsub_dVgs = here->HSMHV2_dIsub_dVgsi ; - dIsub_dVbs = here->HSMHV2_dIsub_dVbsi ; - dIsub_dT = (here->HSMHV2tempNode > 0) ? here->HSMHV2_dIsub_dTi : 0.0 ; - Isubs = 0.0 ; - dIsubs_dVds = 0.0 ; - dIsubs_dVgs = 0.0 ; - dIsubs_dVbs = 0.0 ; - dIsubs_dT = 0.0 ; - Igidl = here->HSMHV2_igidl ; - dIgidl_dVds = here->HSMHV2_dIgidl_dVdsi ; - dIgidl_dVgs = here->HSMHV2_dIgidl_dVgsi ; - dIgidl_dVbs = here->HSMHV2_dIgidl_dVbsi ; - dIgidl_dT = (here->HSMHV2tempNode > 0) ? here->HSMHV2_dIgidl_dTi : 0.0 ; - Igisl = here->HSMHV2_igisl ; - dIgisl_dVds = here->HSMHV2_dIgisl_dVdsi ; - dIgisl_dVgs = here->HSMHV2_dIgisl_dVgsi ; - dIgisl_dVbs = here->HSMHV2_dIgisl_dVbsi ; - dIgisl_dT = (here->HSMHV2tempNode > 0) ? here->HSMHV2_dIgisl_dTi : 0.0 ; - Igd = here->HSMHV2_igd ; - dIgd_dVd = here->HSMHV2_dIgd_dVdsi ; - dIgd_dVg = here->HSMHV2_dIgd_dVgsi ; - dIgd_dVb = here->HSMHV2_dIgd_dVbsi ; - dIgd_dT = (here->HSMHV2tempNode > 0) ? here->HSMHV2_dIgd_dTi : 0.0 ; - Igs = here->HSMHV2_igs ; - dIgs_dVd = here->HSMHV2_dIgs_dVdsi ; - dIgs_dVg = here->HSMHV2_dIgs_dVgsi ; - dIgs_dVb = here->HSMHV2_dIgs_dVbsi ; - dIgs_dT = (here->HSMHV2tempNode > 0) ? here->HSMHV2_dIgs_dTi : 0.0 ; - Igb = here->HSMHV2_igb ; - dIgb_dVd = here->HSMHV2_dIgb_dVdsi ; - dIgb_dVg = here->HSMHV2_dIgb_dVgsi ; - dIgb_dVb = here->HSMHV2_dIgb_dVbsi ; - dIgb_dT = (here->HSMHV2tempNode > 0) ? here->HSMHV2_dIgb_dTi : 0.0 ; - Ibd = here->HSMHV2_ibd ; - Gbd = here->HSMHV2_gbd ; - Gbdt = (here->HSMHV2tempNode > 0) ? here->HSMHV2_gbdT : 0.0 ; - Ibs = here->HSMHV2_ibs ; - Gbs = here->HSMHV2_gbs ; - Gbst = (here->HSMHV2tempNode > 0) ? here->HSMHV2_gbsT : 0.0 ; - } else { /* reverse mode */ - Ids = - here->HSMHV2_ids ; - gds = + (here->HSMHV2_dIds_dVdsi + here->HSMHV2_dIds_dVgsi + here->HSMHV2_dIds_dVbsi) ; - gm = - here->HSMHV2_dIds_dVgsi ; - gmbs = - here->HSMHV2_dIds_dVbsi ; - gmT = (here->HSMHV2tempNode > 0) ? - here->HSMHV2_dIds_dTi : 0.0 ; - gds_ext = + (here->HSMHV2_dIds_dVdse + here->HSMHV2_dIds_dVgse + here->HSMHV2_dIds_dVbse) ; - gm_ext = - here->HSMHV2_dIds_dVgse; - gmbs_ext = - here->HSMHV2_dIds_dVbse; - Isub = 0.0 ; - dIsub_dVds = 0.0 ; - dIsub_dVgs = 0.0 ; - dIsub_dVbs = 0.0 ; - dIsub_dT = 0.0 ; - Isubs = here->HSMHV2_isub ; - dIsubs_dVds = - (here->HSMHV2_dIsub_dVdsi + here->HSMHV2_dIsub_dVgsi + here->HSMHV2_dIsub_dVbsi) ; - dIsubs_dVgs = here->HSMHV2_dIsub_dVgsi ; - dIsubs_dVbs = here->HSMHV2_dIsub_dVbsi ; - dIsubs_dT = (here->HSMHV2tempNode > 0) ? here->HSMHV2_dIsub_dTi : 0.0 ; - Igidl = here->HSMHV2_igisl ; - dIgidl_dVds = - (here->HSMHV2_dIgisl_dVdsi + here->HSMHV2_dIgisl_dVgsi + here->HSMHV2_dIgisl_dVbsi) ; - dIgidl_dVgs = here->HSMHV2_dIgisl_dVgsi ; - dIgidl_dVbs = here->HSMHV2_dIgisl_dVbsi ; - dIgidl_dT = (here->HSMHV2tempNode > 0) ? here->HSMHV2_dIgisl_dTi : 0.0 ; - Igisl = here->HSMHV2_igidl ; - dIgisl_dVds = - (here->HSMHV2_dIgidl_dVdsi + here->HSMHV2_dIgidl_dVgsi + here->HSMHV2_dIgidl_dVbsi) ; - dIgisl_dVgs = here->HSMHV2_dIgidl_dVgsi ; - dIgisl_dVbs = here->HSMHV2_dIgidl_dVbsi ; - dIgisl_dT = (here->HSMHV2tempNode > 0) ? here->HSMHV2_dIgidl_dTi : 0.0 ; - Igd = here->HSMHV2_igd ; - dIgd_dVd = - (here->HSMHV2_dIgs_dVdsi + here->HSMHV2_dIgs_dVgsi + here->HSMHV2_dIgs_dVbsi) ; - dIgd_dVg = here->HSMHV2_dIgs_dVgsi ; - dIgd_dVb = here->HSMHV2_dIgs_dVbsi ; - dIgd_dT = (here->HSMHV2tempNode > 0) ? here->HSMHV2_dIgs_dTi : 0.0 ; - Igs = here->HSMHV2_igs ; - dIgs_dVd = - (here->HSMHV2_dIgd_dVdsi + here->HSMHV2_dIgd_dVgsi + here->HSMHV2_dIgd_dVbsi) ; - dIgs_dVg = here->HSMHV2_dIgd_dVgsi ; - dIgs_dVb = here->HSMHV2_dIgd_dVbsi ; - dIgs_dT = (here->HSMHV2tempNode > 0) ? here->HSMHV2_dIgd_dTi : 0.0 ; - Igb = here->HSMHV2_igb ; - dIgb_dVd = - (here->HSMHV2_dIgb_dVdsi + here->HSMHV2_dIgb_dVgsi + here->HSMHV2_dIgb_dVbsi) ; - dIgb_dVg = here->HSMHV2_dIgb_dVgsi ; - dIgb_dVb = here->HSMHV2_dIgb_dVbsi ; - dIgb_dT = (here->HSMHV2tempNode > 0) ? here->HSMHV2_dIgb_dTi : 0.0 ; - Ibd = here->HSMHV2_ibd ; - Gbd = here->HSMHV2_gbd ; - Gbdt = (here->HSMHV2tempNode > 0) ? here->HSMHV2_gbdT : 0.0 ; - Ibs = here->HSMHV2_ibs ; - Gbs = here->HSMHV2_gbs ; - Gbst = (here->HSMHV2tempNode > 0) ? here->HSMHV2_gbsT : 0.0 ; - } /* end of reverse mode */ - - /* for convergence control, only nonlinear static currents are considered: */ - i_dP = Ids + Isub + Igidl - Igd ; - i_dP_hat = i_dP + gm *delvgs + gds *delvds + gmbs *delvbs + gmT *deldeltemp - + dIsub_dVgs *delvgs + dIsub_dVds *delvds + dIsub_dVbs *delvbs + dIsub_dT *deldeltemp - + dIgidl_dVgs*delvgs + dIgidl_dVds*delvds + dIgidl_dVbs*delvbs + dIgidl_dT*deldeltemp - -(dIgd_dVg *delvgs + dIgd_dVd *delvds + dIgd_dVb *delvbs + dIgd_dT *deldeltemp) - + gm_ext *delvgse + gds_ext *delvdse + gmbs_ext *delvbse ; - - i_gP = Igd + Igs + Igb ; - i_gP_hat = i_gP + dIgd_dVg *delvgs + dIgd_dVd *delvds + dIgd_dVb *delvbs + dIgd_dT *deldeltemp - + dIgs_dVg *delvgs + dIgs_dVd *delvds + dIgs_dVb *delvbs + dIgs_dT *deldeltemp - + dIgb_dVg *delvgs + dIgb_dVd *delvds + dIgb_dVb *delvbs + dIgb_dT *deldeltemp ; - - i_sP =-Ids + Isubs + Igisl - Igs ; - i_sP_hat = i_sP -(gm *delvgs + gds *delvds + gmbs *delvbs + gmT *deldeltemp) - + dIsubs_dVgs*delvgs + dIsubs_dVds*delvds + dIsubs_dVbs*delvbs + dIsubs_dT*deldeltemp - + dIgisl_dVgs*delvgs + dIgisl_dVds*delvds + dIgisl_dVbs*delvbs + dIgisl_dT*deldeltemp - -(dIgs_dVg *delvgs + dIgs_dVd *delvds + dIgs_dVb *delvbs + dIgs_dT *deldeltemp) - -(gm_ext *delvgse + gds_ext *delvdse + gmbs_ext *delvbse) ; - - i_db = Ibd ; - i_db_hat = i_db + Gbd*delvdbd + Gbdt*deldeltemp ; - - i_sb = Ibs ; - i_sb_hat = i_sb + Gbs*delvsbs + Gbst*deldeltemp ; - - /* to be added: power source for thermal network */ - - - /* - * check convergence - */ - if ( here->HSMHV2_off == 0 || !(ckt->CKTmode & MODEINITFIX) ) { - tol0 = ckt->CKTreltol * MAX(fabs(i_dP_hat), fabs(i_dP)) + ckt->CKTabstol; - tol1 = ckt->CKTreltol * MAX(fabs(i_gP_hat), fabs(i_gP)) + ckt->CKTabstol; - tol2 = ckt->CKTreltol * MAX(fabs(i_sP_hat), fabs(i_sP)) + ckt->CKTabstol; - tol3 = ckt->CKTreltol * MAX(fabs(i_db_hat), fabs(i_db)) + ckt->CKTabstol; - tol4 = ckt->CKTreltol * MAX(fabs(i_sb_hat), fabs(i_sb)) + ckt->CKTabstol; - - if ( (fabs(i_dP_hat - i_dP) >= tol0) - || (fabs(i_gP_hat - i_gP) >= tol1) - || (fabs(i_sP_hat - i_sP) >= tol2) - || (fabs(i_db_hat - i_db) >= tol3) - || (fabs(i_sb_hat - i_sb) >= tol4) ) { - ckt->CKTnoncon++; - return(OK); - } - } - } - } - return(OK); -} diff --git a/src/spicelib/devices/hisimhv2/hsmhv2def.h b/src/spicelib/devices/hisimhv2/hsmhv2def.h deleted file mode 100644 index aba3c33c0..000000000 --- a/src/spicelib/devices/hisimhv2/hsmhv2def.h +++ /dev/null @@ -1,3501 +0,0 @@ -/*********************************************************************** - - HiSIM (Hiroshima University STARC IGFET Model) - Copyright (C) 2014 Hiroshima University & STARC - - MODEL NAME : HiSIM_HV - ( VERSION : 2 SUBVERSION : 2 REVISION : 0 ) - Model Parameter 'VERSION' : 2.20 - FILE : hsmhvdef - - DATE : 2014.6.11 - - released by - Hiroshima University & - Semiconductor Technology Academic Research Center (STARC) -***********************************************************************/ - -/********************************************************************** - -The following source code, and all copyrights, trade secrets or other -intellectual property rights in and to the source code in its entirety, -is owned by the Hiroshima University and the STARC organization. - -All users need to follow the "HISIM_HV Distribution Statement and -Copyright Notice" attached to HiSIM_HV model. - ------HISIM_HV Distribution Statement and Copyright Notice-------------- - -Software is distributed as is, completely without warranty or service -support. Hiroshima University or STARC and its employees are not liable -for the condition or performance of the software. - -Hiroshima University and STARC own the copyright and grant users a perpetual, -irrevocable, worldwide, non-exclusive, royalty-free license with respect -to the software as set forth below. - -Hiroshima University and STARC hereby disclaims all implied warranties. - -Hiroshima University and STARC grant the users the right to modify, copy, -and redistribute the software and documentation, both within the user's -organization and externally, subject to the following restrictions - -1. The users agree not to charge for Hiroshima University and STARC code -itself but may charge for additions, extensions, or support. - -2. In any product based on the software, the users agree to acknowledge -Hiroshima University and STARC that developed the software. This -acknowledgment shall appear in the product documentation. - -3. The users agree to reproduce any copyright notice which appears on -the software on any copy or modification of such made available -to others." - -Toshimasa Asahara, President, Hiroshima University -Mitiko Miura-Mattausch, Professor, Hiroshima University -Katsuhiro Shimohigashi, President&CEO, STARC -June 2008 (revised October 2011) -*************************************************************************/ - -#ifndef HSMHV2 -#define HSMHV2 - -#include "ngspice/ifsim.h" -#include "ngspice/gendefs.h" -#include "ngspice/cktdefs.h" -#include "ngspice/complex.h" -#include "ngspice/noisedef.h" - -/* declarations for HiSIMHV MOSFETs */ - -/* unit-converted model parameters */ -typedef struct sHSMHV2modelMKSParam { - double HSMHV2_npext ; - double HSMHV2_vmax ; - double HSMHV2_ll ; - double HSMHV2_wl ; - double HSMHV2_svgsl ; - double HSMHV2_svgsw ; - double HSMHV2_svbsl ; - double HSMHV2_slgl ; - double HSMHV2_sub1l ; - double HSMHV2_slg ; - double HSMHV2_sub2l ; - double HSMHV2_subld2 ; - double HSMHV2_rd22 ; - double HSMHV2_rd23 ; - double HSMHV2_rd24 ; - double HSMHV2_rdtemp1 ; - double HSMHV2_rdtemp2 ; - double HSMHV2_rdvd ; - double HSMHV2_rdvdtemp1 ; - double HSMHV2_rdvdtemp2 ; - double HSMHV2_nsubsub ; - double HSMHV2_nsubpsti1 ; - double HSMHV2_muesti1 ; - double HSMHV2_wfc ; - double HSMHV2_glksd1 ; - double HSMHV2_glksd2 ; - double HSMHV2_glksd3 ; - double HSMHV2_gleak2 ; - double HSMHV2_gleak4 ; - double HSMHV2_gleak5 ; - double HSMHV2_gleak7 ; - double HSMHV2_glkb2 ; - double HSMHV2_fn2 ; - double HSMHV2_gidl1 ; - double HSMHV2_gidl2 ; - double HSMHV2_nfalp ; - double HSMHV2_nftrp ; - double HSMHV2_cit ; - double HSMHV2_ovslp ; - double HSMHV2_dly3 ; - double HSMHV2_rth0 ; - double HSMHV2_cth0 ; - double HSMHV2_rdrmue ; - double HSMHV2_rdrvmax ; - double HSMHV2_ndepm ; - double HSMHV2_depvmax ; - -} HSMHV2modelMKSParam ; - - -/* binning parameters */ -typedef struct sHSMHV2binningParam { - double HSMHV2_vmax ; - double HSMHV2_bgtmp1 ; - double HSMHV2_bgtmp2 ; - double HSMHV2_eg0 ; - double HSMHV2_vfbover ; - double HSMHV2_nover ; - double HSMHV2_novers ; - double HSMHV2_wl2 ; - double HSMHV2_vfbc ; - double HSMHV2_nsubc ; - double HSMHV2_nsubp ; - double HSMHV2_scp1 ; - double HSMHV2_scp2 ; - double HSMHV2_scp3 ; - double HSMHV2_sc1 ; - double HSMHV2_sc2 ; - double HSMHV2_sc3 ; - double HSMHV2_pgd1 ; -//double HSMHV2_pgd3 ; - double HSMHV2_ndep ; - double HSMHV2_ninv ; - double HSMHV2_muecb0 ; - double HSMHV2_muecb1 ; - double HSMHV2_mueph1 ; - double HSMHV2_vtmp ; - double HSMHV2_wvth0 ; - double HSMHV2_muesr1 ; - double HSMHV2_muetmp ; - double HSMHV2_sub1 ; - double HSMHV2_sub2 ; - double HSMHV2_svds ; - double HSMHV2_svbs ; - double HSMHV2_svgs ; - double HSMHV2_fn1 ; - double HSMHV2_fn2 ; - double HSMHV2_fn3 ; - double HSMHV2_fvbs ; - double HSMHV2_nsti ; - double HSMHV2_wsti ; - double HSMHV2_scsti1 ; - double HSMHV2_scsti2 ; - double HSMHV2_vthsti ; - double HSMHV2_muesti1 ; - double HSMHV2_muesti2 ; - double HSMHV2_muesti3 ; - double HSMHV2_nsubpsti1 ; - double HSMHV2_nsubpsti2 ; - double HSMHV2_nsubpsti3 ; - double HSMHV2_cgso ; - double HSMHV2_cgdo ; - double HSMHV2_js0 ; - double HSMHV2_js0sw ; - double HSMHV2_nj ; - double HSMHV2_cisbk ; - double HSMHV2_clm1 ; - double HSMHV2_clm2 ; - double HSMHV2_clm3 ; - double HSMHV2_wfc ; - double HSMHV2_gidl1 ; - double HSMHV2_gidl2 ; - double HSMHV2_gleak1 ; - double HSMHV2_gleak2 ; - double HSMHV2_gleak3 ; - double HSMHV2_gleak6 ; - double HSMHV2_glksd1 ; - double HSMHV2_glksd2 ; - double HSMHV2_glkb1 ; - double HSMHV2_glkb2 ; - double HSMHV2_nftrp ; - double HSMHV2_nfalp ; - double HSMHV2_vdiffj ; - double HSMHV2_ibpc1 ; - double HSMHV2_ibpc2 ; - double HSMHV2_cgbo ; - double HSMHV2_cvdsover ; - double HSMHV2_falph ; - double HSMHV2_npext ; - double HSMHV2_powrat ; - double HSMHV2_rd ; - double HSMHV2_rd22 ; - double HSMHV2_rd23 ; - double HSMHV2_rd24 ; - double HSMHV2_rdict1 ; - double HSMHV2_rdov13 ; - double HSMHV2_rdslp1 ; - double HSMHV2_rdvb ; - double HSMHV2_rdvd ; - double HSMHV2_rdvg11 ; - double HSMHV2_rs ; - double HSMHV2_rth0 ; - double HSMHV2_vover ; - /*-----------SHE--------------*/ - double HSMHV2_rth ; - double HSMHV2_cth ; - double HSMHV2_js0d; - double HSMHV2_js0swd; - double HSMHV2_njd; - double HSMHV2_cisbkd; - double HSMHV2_vdiffjd; - double HSMHV2_js0s; - double HSMHV2_js0sws; - double HSMHV2_njs; - double HSMHV2_cisbks; - double HSMHV2_vdiffjs; - /*-----------------------------*/ - -} HSMHV2binningParam ; - - -/* unit-converted parameters for each instance */ -typedef struct sHSMHV2hereMKSParam { - double HSMHV2_vmax ; - double HSMHV2_subld2 ; - double HSMHV2_ndep ; - double HSMHV2_ninv ; - double HSMHV2_nsubc ; - double HSMHV2_nsubcdfm ; - double HSMHV2_nsubp ; - double HSMHV2_nsubpsti1 ; - double HSMHV2_muesti1 ; - double HSMHV2_nsti ; - double HSMHV2_npext ; - double HSMHV2_nover ; - double HSMHV2_novers ; - double HSMHV2_wfc ; - double HSMHV2_glksd1 ; - double HSMHV2_glksd2 ; - double HSMHV2_gleak2 ; - double HSMHV2_glkb2 ; - double HSMHV2_fn2 ; - double HSMHV2_gidl1 ; - double HSMHV2_gidl2 ; - double HSMHV2_nfalp ; - double HSMHV2_nftrp ; -} HSMHV2hereMKSParam ; - - -/* information needed for each instance */ -typedef struct sHSMHV2instance { - - struct GENinstance gen; - -#define HSMHV2modPtr(inst) ((struct sHSMHV2model *)((inst)->gen.GENmodPtr)) -#define HSMHV2nextInstance(inst) ((struct sHSMHV2instance *)((inst)->gen.GENnextInstance)) -#define HSMHV2name gen.GENname -#define HSMHV2states gen.GENstate - - const int HSMHV2dNode; /* number of the drain node of the mosfet */ - const int HSMHV2gNode; /* number of the gate node of the mosfet */ - const int HSMHV2sNode; /* number of the source node of the mosfet */ - const int HSMHV2bNode; /* number of the bulk node of the mosfet */ - const int HSMHV2subNodeExt; /* number of the substrate node */ - const int HSMHV2tempNodeExt;/* number of the temp node----------SHE--------*/ - int HSMHV2subNode; /* number of the substrate node */ - int HSMHV2tempNode; /* number of the temp node */ - int HSMHV2dNodePrime; /* number od the inner drain node */ - int HSMHV2gNodePrime; /* number of the inner gate node */ - int HSMHV2sNodePrime; /* number od the inner source node */ - int HSMHV2bNodePrime; - int HSMHV2dbNode; - int HSMHV2sbNode; - int HSMHV2qiNode; /* number of the qi node in case of NQS */ - int HSMHV2qbNode; /* number of the qb node in case of NQS */ - - double HSMHV2_noiflick; /* for 1/f noise calc. */ - double HSMHV2_noithrml; /* for thrmal noise calc. */ - double HSMHV2_noiigate; /* for induced gate noise */ - double HSMHV2_noicross; /* for induced gate noise */ - - /* instance */ - int HSMHV2_coselfheat; /* Self-heating model */ - int HSMHV2_cosubnode; /* switch tempNode to subNode */ - double HSMHV2_l; /* the length of the channel region */ - double HSMHV2_w; /* the width of the channel region */ - double HSMHV2_ad; /* the area of the drain diffusion */ - double HSMHV2_as; /* the area of the source diffusion */ - double HSMHV2_pd; /* perimeter of drain junction [m] */ - double HSMHV2_ps; /* perimeter of source junction [m] */ - double HSMHV2_nrd; /* equivalent num of squares of drain [-] (unused) */ - double HSMHV2_nrs; /* equivalent num of squares of source [-] (unused) */ - double HSMHV2_dtemp; - - double HSMHV2_weff; /* the effective width of the channel region */ - double HSMHV2_weff_ld; /* the effective width of the drift region */ - double HSMHV2_weff_cv; /* the effective width of the drift region for capacitance */ - double HSMHV2_weff_nf; /* Weff * NF */ - double HSMHV2_weffcv_nf; /* Weffcv * NF */ - double HSMHV2_leff; /* the effective length of the channel region */ - - int HSMHV2_corbnet ; - double HSMHV2_rbpb ; - double HSMHV2_rbpd ; - double HSMHV2_rbps ; - double HSMHV2_rbdb ; - double HSMHV2_rbsb ; - - int HSMHV2_corg ; - double HSMHV2_ngcon; - double HSMHV2_xgw; - double HSMHV2_xgl; - double HSMHV2_nf; - - double HSMHV2_sa; - double HSMHV2_sb; - double HSMHV2_sd; - double HSMHV2_nsubcdfm; - double HSMHV2_m; - double HSMHV2_subld1; - double HSMHV2_subld2; - double HSMHV2_lover; - double HSMHV2_lovers; - double HSMHV2_loverld; - double HSMHV2_ldrift1; - double HSMHV2_ldrift2; - double HSMHV2_ldrift1s; - double HSMHV2_ldrift2s; - - int HSMHV2_called; /* flag to check the first call */ - /* previous values to evaluate initial guess */ - double HSMHV2_mode_prv; - double HSMHV2_vbsc_prv; - double HSMHV2_vdsc_prv; - double HSMHV2_vgsc_prv; - double HSMHV2_ps0_prv; - double HSMHV2_ps0_dvbs_prv; - double HSMHV2_ps0_dvds_prv; - double HSMHV2_ps0_dvgs_prv; - double HSMHV2_ps0_dtemp_prv; - double HSMHV2_pds_prv; - double HSMHV2_pds_dvbs_prv; - double HSMHV2_pds_dvds_prv; - double HSMHV2_pds_dvgs_prv; - double HSMHV2_pds_dtemp_prv; - /* double HSMHV2_ids_prv; not used */ - /* double HSMHV2_ids_dvbs_prv; not used */ - /* double HSMHV2_ids_dvds_prv; not used */ - /* double HSMHV2_ids_dvgs_prv; not used */ - /* double HSMHV2_ids_dtemp_prv; not used */ - double HSMHV2_mode_prv2; - double HSMHV2_vbsc_prv2; - double HSMHV2_vdsc_prv2; - double HSMHV2_vgsc_prv2; - double HSMHV2_ps0_prv2; /* assigned but not used */ - double HSMHV2_ps0_dvbs_prv2; - double HSMHV2_ps0_dvds_prv2; - double HSMHV2_ps0_dvgs_prv2; - double HSMHV2_pds_prv2; /* assigned but not used */ - double HSMHV2_pds_dvbs_prv2; - double HSMHV2_pds_dvds_prv2; - double HSMHV2_pds_dvgs_prv2; - double HSMHV2_temp_prv; -/* double HSMHV2_time; /\* for debug print *\/ */ - - /* output */ - /* int HSMHV2_capop; not used */ - /* double HSMHV2_gd; not used */ - /* double HSMHV2_gs; not used */ - double HSMHV2_cgso; /* can be made local */ - double HSMHV2_cgdo; - double HSMHV2_cgbo; - double HSMHV2_cggo; - double HSMHV2_cdso; /* can be made local */ - double HSMHV2_cddo; - double HSMHV2_cdgo; - double HSMHV2_cdbo; - double HSMHV2_csso; /* can be made local */ - double HSMHV2_csdo; /* can be made local */ - double HSMHV2_csgo; /* can be made local */ - double HSMHV2_csbo; /* can be made local */ - double HSMHV2_cbdo; - double HSMHV2_cbgo; - double HSMHV2_cbbo; - /* double HSMHV2_cqyd; not used */ - /* double HSMHV2_cqyg; not used */ - /* double HSMHV2_cqyb; not used */ - double HSMHV2_von; /* vth */ - double HSMHV2_vdsat; - /* double HSMHV2_capgs; not used */ - /* double HSMHV2_capgd; not used */ - /* double HSMHV2_capgb; not used */ - - /* double HSMHV2_rth0; not used */ - /* double HSMHV2_cth0; not used */ - /* double HSMHV2_cth; not used */ - - -#define XDIM 14 - double HSMHV2_ydc_d[XDIM], HSMHV2_ydc_dP[XDIM], HSMHV2_ydc_g[XDIM], HSMHV2_ydc_gP[XDIM], HSMHV2_ydc_s[XDIM], HSMHV2_ydc_sP[XDIM], - HSMHV2_ydc_bP[XDIM], HSMHV2_ydc_b[XDIM], HSMHV2_ydc_db[XDIM], HSMHV2_ydc_sb[XDIM], HSMHV2_ydc_t[XDIM], HSMHV2_ydc_qi[XDIM], - HSMHV2_ydc_qb[XDIM]; - double HSMHV2_ydyn_d[XDIM], HSMHV2_ydyn_dP[XDIM], HSMHV2_ydyn_g[XDIM], HSMHV2_ydyn_gP[XDIM], HSMHV2_ydyn_s[XDIM], HSMHV2_ydyn_sP[XDIM], - HSMHV2_ydyn_bP[XDIM], HSMHV2_ydyn_b[XDIM], HSMHV2_ydyn_db[XDIM], HSMHV2_ydyn_sb[XDIM], HSMHV2_ydyn_t[XDIM], HSMHV2_ydyn_qi[XDIM], - HSMHV2_ydyn_qb[XDIM]; - - /* resistances */ - double HSMHV2_Rd ; /* different from HSMHV2_rd */ - double HSMHV2_dRd_dVdse ; - double HSMHV2_dRd_dVgse ; - double HSMHV2_dRd_dVbse ; - double HSMHV2_dRd_dVddp ; - double HSMHV2_dRd_dVsubs ; - double HSMHV2_dRd_dTi ; - double HSMHV2_dRd_dVds ; - double HSMHV2_dRd_dVgs ; - double HSMHV2_dRd_dVbs ; - double HSMHV2_Rs ; /* different from HSMHV2_rs */ - double HSMHV2_dRs_dVdse ; - double HSMHV2_dRs_dVgse ; - double HSMHV2_dRs_dVbse ; - double HSMHV2_dRs_dVsubs ; - double HSMHV2_dRs_dTi ; - /* drain current */ - double HSMHV2_ids; - double HSMHV2_gds; /* used for printout, but not loaded */ - double HSMHV2_gm; /* used for printout, but not loaded */ - double HSMHV2_gmbs; /* used for printout, but not loaded */ - double HSMHV2_dIds_dVdse ; - double HSMHV2_dIds_dVgse ; - double HSMHV2_dIds_dVbse ; - double HSMHV2_dIds_dVdsi ; - double HSMHV2_dIds_dVgsi ; - double HSMHV2_dIds_dVbsi ; - double HSMHV2_dIds_dTi ; - /* substrate current */ - double HSMHV2_isub; - /* double HSMHV2_gbgs; not used */ - /* double HSMHV2_gbds; not used */ - /* double HSMHV2_gbbs; not used */ - double HSMHV2_dIsub_dVdsi ; - double HSMHV2_dIsub_dVgsi ; - double HSMHV2_dIsub_dVbsi ; - double HSMHV2_dIsub_dTi ; - double HSMHV2_isubld; - double HSMHV2_dIsubLD_dVdsi ; - double HSMHV2_dIsubLD_dVgsi ; - double HSMHV2_dIsubLD_dVbsi ; - double HSMHV2_dIsubLD_dTi ; - double HSMHV2_dIsubLD_dVddp ; - double HSMHV2_idsibpc; - double HSMHV2_dIdsIBPC_dVdsi ; - double HSMHV2_dIdsIBPC_dVgsi ; - double HSMHV2_dIdsIBPC_dVbsi ; - double HSMHV2_dIdsIBPC_dTi ; - double HSMHV2_dIdsIBPC_dVddp ; - /* gidl and gisl current */ - double HSMHV2_igidl; /* gate induced drain leakage */ - /* double HSMHV2_gigidlgs; not used */ - /* double HSMHV2_gigidlds; not used */ - /* double HSMHV2_gigidlbs; not used */ - double HSMHV2_dIgidl_dVdsi ; - double HSMHV2_dIgidl_dVgsi ; - double HSMHV2_dIgidl_dVbsi ; - double HSMHV2_dIgidl_dTi ; - double HSMHV2_igisl; /* gate induced source leakage */ - /* double HSMHV2_gigislgd; not used */ - /* double HSMHV2_gigislsd; not used */ - /* double HSMHV2_gigislbd; not used */ - double HSMHV2_dIgisl_dVdsi ; - double HSMHV2_dIgisl_dVgsi ; - double HSMHV2_dIgisl_dVbsi ; - double HSMHV2_dIgisl_dTi ; - /* gate leakage currents */ - double HSMHV2_igb; /* gate tunneling current (gate to bulk) */ - /* double HSMHV2_gigbg; not used */ - /* double HSMHV2_gigbd; not used */ - /* double HSMHV2_gigbb; not used */ - /* double HSMHV2_gigbs; not used */ - double HSMHV2_dIgb_dVdsi ; - double HSMHV2_dIgb_dVgsi ; - double HSMHV2_dIgb_dVbsi ; - double HSMHV2_dIgb_dTi ; - double HSMHV2_igd; /* gate tunneling current (gate to drain) */ - /* double HSMHV2_gigdg; not used */ - /* double HSMHV2_gigdd; not used */ - /* double HSMHV2_gigdb; not used */ - /* double HSMHV2_gigds; not used */ - double HSMHV2_dIgd_dVdsi ; - double HSMHV2_dIgd_dVgsi ; - double HSMHV2_dIgd_dVbsi ; - double HSMHV2_dIgd_dTi ; - double HSMHV2_igs; /* gate tunneling current (gate to source) */ - /* double HSMHV2_gigsg; not used */ - /* double HSMHV2_gigsd; not used */ - /* double HSMHV2_gigsb; not used */ - /* double HSMHV2_gigss; not used */ - double HSMHV2_dIgs_dVdsi ; - double HSMHV2_dIgs_dVgsi ; - double HSMHV2_dIgs_dVbsi ; - double HSMHV2_dIgs_dTi ; - /* charges */ - double HSMHV2_qd; - double HSMHV2_cdgb; /* used for printout, but not loaded */ - /* double HSMHV2_cddb; not used */ - /* double HSMHV2_cdsb; not used */ - /* double HSMHV2cdT; not used */ - double HSMHV2_dQdi_dVdsi ; - double HSMHV2_dQdi_dVgsi ; - double HSMHV2_dQdi_dVbsi ; - double HSMHV2_dQdi_dTi ; - double HSMHV2_qg; - double HSMHV2_cggb; /* used for printout, but not loaded */ - double HSMHV2_cgdb; /* used for printout, but not loaded */ - double HSMHV2_cgsb; /* used for printout, but not loaded */ - /* double HSMHV2cgT; not used */ - double HSMHV2_dQg_dVdsi ; - double HSMHV2_dQg_dVgsi ; - double HSMHV2_dQg_dVbsi ; - double HSMHV2_dQg_dTi ; - double HSMHV2_qs; - double HSMHV2_dQsi_dVdsi ; - double HSMHV2_dQsi_dVgsi ; - double HSMHV2_dQsi_dVbsi ; - double HSMHV2_dQsi_dTi ; - double HSMHV2_qb; /* bulk charge qb = -(qg + qd + qs) */ - double HSMHV2_cbgb; /* used for printout, but not loaded */ - /* double HSMHV2_cbdb; not used */ - /* double HSMHV2_cbsb; not used */ - /* double HSMHV2cbT; not used */ - double HSMHV2_dQb_dVdsi ; /* Qb: bulk charge inclusive overlaps, Qbulk: bulk charge without overlaps (see above) */ - double HSMHV2_dQb_dVgsi ; - double HSMHV2_dQb_dVbsi ; - double HSMHV2_dQb_dTi ; - /* outer charges (fringing etc.) */ - double HSMHV2_qdp ; - double HSMHV2_dqdp_dVdse ; - double HSMHV2_dqdp_dVgse ; - double HSMHV2_dqdp_dVbse ; - double HSMHV2_dqdp_dTi ; - double HSMHV2_qsp ; - double HSMHV2_dqsp_dVdse ; - double HSMHV2_dqsp_dVgse ; - double HSMHV2_dqsp_dVbse ; - double HSMHV2_dqsp_dTi ; - double HSMHV2_qgext ; - double HSMHV2_dQgext_dVdse ; - double HSMHV2_dQgext_dVgse ; - double HSMHV2_dQgext_dVbse ; - double HSMHV2_dQgext_dTi ; - double HSMHV2_qdext ; - double HSMHV2_dQdext_dVdse ; - double HSMHV2_dQdext_dVgse ; - double HSMHV2_dQdext_dVbse ; - double HSMHV2_dQdext_dTi ; - double HSMHV2_qbext ; - double HSMHV2_dQbext_dVdse ; - double HSMHV2_dQbext_dVgse ; - double HSMHV2_dQbext_dVbse ; - double HSMHV2_dQbext_dTi ; - double HSMHV2_qsext ; - double HSMHV2_dQsext_dVdse ; - double HSMHV2_dQsext_dVgse ; - double HSMHV2_dQsext_dVbse ; - double HSMHV2_dQsext_dTi ; - /* junctions */ - double HSMHV2_ibd; - double HSMHV2_gbd; - double HSMHV2_gbdT; - double HSMHV2_ibs; - double HSMHV2_gbs; - double HSMHV2_gbsT; - double HSMHV2_qbd; - double HSMHV2_capbd; - double HSMHV2_gcbdT; - double HSMHV2_qbs; - double HSMHV2_capbs; - double HSMHV2_gcbsT; - - /* double HSMHV2_gtempg; not used */ - /* double HSMHV2_gtempt; not used */ - /* double HSMHV2_gtempd; not used */ - /* double HSMHV2_gtempb; not used */ - - /* double HSMHV2_gmt; not used */ - /* double HSMHV2_isubt; not used */ - - - /* NQS */ - double HSMHV2_tau ; - double HSMHV2_tau_dVgsi ; - double HSMHV2_tau_dVdsi ; - double HSMHV2_tau_dVbsi ; - double HSMHV2_tau_dTi ; - double HSMHV2_Xd ; - double HSMHV2_Xd_dVgsi ; - double HSMHV2_Xd_dVdsi ; - double HSMHV2_Xd_dVbsi ; - double HSMHV2_Xd_dTi ; - double HSMHV2_Qi ; - double HSMHV2_Qi_dVgsi ; - double HSMHV2_Qi_dVdsi ; - double HSMHV2_Qi_dVbsi ; - double HSMHV2_Qi_dTi ; - double HSMHV2_taub ; - double HSMHV2_taub_dVgsi ; - double HSMHV2_taub_dVdsi ; - double HSMHV2_taub_dVbsi ; - double HSMHV2_taub_dTi ; - double HSMHV2_Qbulk ; /* Qbulk: without overlaps, Qb: inclusive overlaps (see below) */ - double HSMHV2_Qbulk_dVgsi ; - double HSMHV2_Qbulk_dVdsi ; - double HSMHV2_Qbulk_dVbsi ; - double HSMHV2_Qbulk_dTi ; - - - - - /* internal variables */ - double HSMHV2_exptempd ; - double HSMHV2_exptemps ; - double HSMHV2_jd_nvtm_invd ; - double HSMHV2_jd_nvtm_invs ; - double HSMHV2_eg ; - double HSMHV2_beta ; - double HSMHV2_beta_inv ; - double HSMHV2_beta2 ; - double HSMHV2_betatnom ; - double HSMHV2_nin ; - double HSMHV2_egp12 ; - double HSMHV2_egp32 ; - double HSMHV2_lgate ; - double HSMHV2_wg ; - double HSMHV2_mueph ; - double HSMHV2_mphn0 ; - double HSMHV2_depmphn0 ; - double HSMHV2_mphn1 ; - double HSMHV2_depmphn1 ; - double HSMHV2_muesr ; - double HSMHV2_rdvd ; - double HSMHV2_rsvd ; /* for the reverse mode */ - double HSMHV2_rd23 ; - - double HSMHV2_ninvd ; - double HSMHV2_ninvd0 ; - - double HSMHV2_nsub ; - double HSMHV2_qnsub ; - double HSMHV2_qnsub_esi ; - double HSMHV2_2qnsub_esi ; - double HSMHV2_ptovr0 ; - double HSMHV2_ptovr ; - double HSMHV2_vmax0 ; - double HSMHV2_vmax ; - double HSMHV2_pb2 ; - double HSMHV2_pb20 ; - double HSMHV2_pb2c ; - double HSMHV2_cnst0 ; - double HSMHV2_cnst1 ; - double HSMHV2_isbd ; - double HSMHV2_isbd2 ; - double HSMHV2_isbs ; - double HSMHV2_isbs2 ; - double HSMHV2_vbdt ; - double HSMHV2_vbst ; - double HSMHV2_wsti ; - double HSMHV2_cnstpgd ; - /* double HSMHV2_ninvp0 ; not used */ - /* double HSMHV2_ninv0 ; not used */ - double HSMHV2_grbpb ; - double HSMHV2_grbpd ; - double HSMHV2_grbps ; - double HSMHV2_grg ; - double HSMHV2_rs ; - double HSMHV2_rs0 ; - double HSMHV2_rd ; - double HSMHV2_rd0 ; - double HSMHV2_rdtemp0 ; - double HSMHV2_clmmod ; - double HSMHV2_lgatesm ; - double HSMHV2_dVthsm ; - double HSMHV2_ddlt ; - double HSMHV2_xsub1 ; - double HSMHV2_xsub2 ; - double HSMHV2_ibpc1 ; - double HSMHV2_xgate ; - double HSMHV2_xvbs ; - double HSMHV2_vg2const ; - double HSMHV2_wdpl ; - double HSMHV2_wdplp ; - double HSMHV2_cfrng ; - double HSMHV2_jd_expcd ; - double HSMHV2_jd_expcs ; - double HSMHV2_sqrt_eg ; - - double HSMHV2_egtnom ; - double HSMHV2_cecox ; - double HSMHV2_msc ; - int HSMHV2_flg_pgd ; - double HSMHV2_ndep_o_esi ; - double HSMHV2_ninv_o_esi ; - double HSMHV2_cqyb0 ; - double HSMHV2_cnst0over ; - double HSMHV2_cnst0overs ; - double HSMHV2_costi00 ; - double HSMHV2_nsti_p2 ; - double HSMHV2_costi0 ; - double HSMHV2_costi0_p2 ; - double HSMHV2_costi1 ; - double HSMHV2_ptl0; - double HSMHV2_pt40; - double HSMHV2_gdl0; - double HSMHV2_rdvdtemp0 ; - double HSMHV2_rthtemp0 ; - double HSMHV2_powratio ; - - double HSMHV2_rdrmue ; - double HSMHV2_rdrvmax ; - - double HSMHV2_depvmax ; - - double HSMHV2_rdrcx ; - double HSMHV2_rdrcar ; - - double HSMHV2_xpdv ; - double HSMHV2_Ps0LD ; - double HSMHV2_Ps0LD_dVds ; - double HSMHV2_Ps0LD_dVgs ; - double HSMHV2_Ps0LD_dVbs ; - double HSMHV2_Ps0LD_dTi ; - double HSMHV2_QbuLD ; - double HSMHV2_QbuLD_dVds ; - double HSMHV2_QbuLD_dVgs ; - double HSMHV2_QbuLD_dVbs ; - double HSMHV2_QbuLD_dTi ; - - double HSMHV2_kjunc ; - double HSMHV2_kdep ; - double HSMHV2_Xmax ; - double HSMHV2_rdrcxw ; - double HSMHV2_rdrvmaxw ; - double HSMHV2_rdrvmaxl ; - double HSMHV2_rdrmuel ; - - double HSMHV2_mueph1 ; - double HSMHV2_nsubp; - double HSMHV2_nsubc; - - double HSMHV2_Tratio; - - double HSMHV2_ndepm ; - double HSMHV2_Pb2n ; - double HSMHV2_Vbipn ; - - double HSMHV2_rdrbb ; - - int HSMHV2_cordrift ; - - double HSMHV2_Vdserevz ; - double HSMHV2_Vdserevz_dVd ; - double HSMHV2_Vsubsrev ; - - HSMHV2hereMKSParam hereMKS ; /* unit-converted parameters */ - - HSMHV2binningParam pParam ; /* binning parameters */ - - /* no use in SPICE3f5 - double HSMHV2drainSquares; the length of the drain in squares - double HSMHV2sourceSquares; the length of the source in squares */ - double HSMHV2sourceConductance; /* cond. of source (or 0): set in setup */ - double HSMHV2drainConductance; /* cond. of drain (or 0): set in setup */ - - double HSMHV2_icVBS; /* initial condition B-S voltage */ - double HSMHV2_icVDS; /* initial condition D-S voltage */ - double HSMHV2_icVGS; /* initial condition G-S voltage */ - int HSMHV2_off; /* non-zero to indicate device is off for dc analysis */ - int HSMHV2_mode; /* device mode : 1 = normal, -1 = inverse */ - - unsigned HSMHV2_coselfheat_Given :1; - unsigned HSMHV2_cosubnode_Given :1; - unsigned HSMHV2_l_Given :1; - unsigned HSMHV2_w_Given :1; - unsigned HSMHV2_ad_Given :1; - unsigned HSMHV2_as_Given :1; - unsigned HSMHV2_pd_Given :1; - unsigned HSMHV2_ps_Given :1; - unsigned HSMHV2_nrd_Given :1; - unsigned HSMHV2_nrs_Given :1; - unsigned HSMHV2_dtemp_Given :1; - unsigned HSMHV2_icVBS_Given :1; - unsigned HSMHV2_icVDS_Given :1; - unsigned HSMHV2_icVGS_Given :1; - unsigned HSMHV2_corbnet_Given :1; - unsigned HSMHV2_rbpb_Given :1; - unsigned HSMHV2_rbpd_Given :1; - unsigned HSMHV2_rbps_Given :1; - unsigned HSMHV2_rbdb_Given :1; - unsigned HSMHV2_rbsb_Given :1; - unsigned HSMHV2_corg_Given :1; - unsigned HSMHV2_ngcon_Given :1; - unsigned HSMHV2_xgw_Given :1; - unsigned HSMHV2_xgl_Given :1; - unsigned HSMHV2_nf_Given :1; - unsigned HSMHV2_sa_Given :1; - unsigned HSMHV2_sb_Given :1; - unsigned HSMHV2_sd_Given :1; - unsigned HSMHV2_nsubcdfm_Given :1; - unsigned HSMHV2_m_Given :1; - unsigned HSMHV2_subld1_Given :1; - unsigned HSMHV2_subld2_Given :1; - unsigned HSMHV2_lover_Given :1; - unsigned HSMHV2_lovers_Given :1; - unsigned HSMHV2_loverld_Given :1; - unsigned HSMHV2_ldrift1_Given :1; - unsigned HSMHV2_ldrift2_Given :1; - unsigned HSMHV2_ldrift1s_Given :1; - unsigned HSMHV2_ldrift2s_Given :1; - - /* unsigned HSMHV2_rth0_Given :1; not used */ - /* unsigned HSMHV2_cth0_Given :1; not used */ - - - - /* pointers to sparse matrix */ - - double *HSMHV2GgPtr; /* pointer to sparse matrix element at (gate node,gate node) */ - double *HSMHV2GgpPtr; /* pointer to sparse matrix element at (gate node,gate prime node) */ - /* double *HSMHV2GdpPtr; not used */ - /* double *HSMHV2GspPtr; not used */ - /* double *HSMHV2GbpPtr; not used */ - - double *HSMHV2GPgPtr; /* pointer to sparse matrix element at (gate prime node,gate node) */ - double *HSMHV2GPgpPtr; /* pointer to sparse matrix element at (gate prime node,gate prime node) */ - double *HSMHV2GPdpPtr; /* pointer to sparse matrix element at (gate prime node,drain prime node) */ - double *HSMHV2GPspPtr; /* pointer to sparse matrix element at (gate prime node,source prime node) */ - double *HSMHV2GPbpPtr; /* pointer to sparse matrix element at (gate prime node,bulk prime node) */ - - double *HSMHV2DPdPtr; /* pointer to sparse matrix element at (drain prime node,drain node) */ - double *HSMHV2DPdpPtr; /* pointer to sparse matrix element at (drain prime node,drain prime node) */ - double *HSMHV2DPgpPtr; /* pointer to sparse matrix element at (drain prime node,gate prime node) */ - double *HSMHV2DPspPtr; /* pointer to sparse matrix element at (drain prime node,source prime node) */ - double *HSMHV2DPbpPtr; /* pointer to sparse matrix element at (drain prime node,bulk prime node) */ - - double *HSMHV2DdPtr; /* pointer to sparse matrix element at (Drain node,drain node) */ - double *HSMHV2DdpPtr; /* pointer to sparse matrix element at (drain node,drain prime node) */ - double *HSMHV2DspPtr; /* pointer to sparse matrix element at (drain node,source prime node) */ - double *HSMHV2DdbPtr; /* pointer to sparse matrix element at (drain node,drain body node) */ - - double *HSMHV2SPsPtr; /* pointer to sparse matrix element at (source prime node,source node) */ - double *HSMHV2SPspPtr; /* pointer to sparse matrix element at (source prime node,source prime node) */ - double *HSMHV2SPgpPtr; /* pointer to sparse matrix element at (source prime node,gate prime node) */ - double *HSMHV2SPdpPtr; /* pointer to sparse matrix element at (source prime node,drain prime node) */ - double *HSMHV2SPbpPtr; /* pointer to sparse matrix element at (source prime node,bulk prime node) */ - - double *HSMHV2SsPtr; /* pointer to sparse matrix element at (source node,source node) */ - double *HSMHV2SspPtr; /* pointer to sparse matrix element at (source node,source prime node) */ - double *HSMHV2SdpPtr; /* pointer to sparse matrix element at (source node,drain prime node) */ - double *HSMHV2SsbPtr; /* pointer to sparse matrix element at (source node,source body node) */ - - double *HSMHV2BPgpPtr; /* pointer to sparse matrix element at (bulk prime node,gate prime node) */ - double *HSMHV2BPbpPtr; /* pointer to sparse matrix element at (bulk prime node,bulk prime node) */ - double *HSMHV2BPdPtr; /* pointer to sparse matrix element at (bulk prime node,drain node) */ - double *HSMHV2BPdpPtr; /* pointer to sparse matrix element at (bulk prime node,drain prime node) */ - double *HSMHV2BPspPtr; /* pointer to sparse matrix element at (bulk prime node,source prime node) */ - double *HSMHV2BPsPtr; /* pointer to sparse matrix element at (bulk prime node,source node) */ - double *HSMHV2BPbPtr; /* pointer to sparse matrix element at (bulk prime node,bulk node) */ - double *HSMHV2BPdbPtr; /* pointer to sparse matrix element at (bulk prime node,source body node) */ - double *HSMHV2BPsbPtr; /* pointer to sparse matrix element at (bulk prime node,source body node) */ - - double *HSMHV2DBdPtr; /* pointer to sparse matrix element at (drain body node,drain node) */ - double *HSMHV2DBdbPtr; /* pointer to sparse matrix element at (drain body node,drain body node) */ - double *HSMHV2DBbpPtr; /* pointer to sparse matrix element at (drain body node,bulk prime node) */ - /* double *HSMHV2DBbPtr; not used */ - - double *HSMHV2SBsPtr; /* pointer to sparse matrix element at (source body node,source node) */ - double *HSMHV2SBbpPtr; /* pointer to sparse matrix element at (source body node,bulk prime node) */ - /* double *HSMHV2SBbPtr; not used */ - double *HSMHV2SBsbPtr; /* pointer to sparse matrix element at (source body node,source body node) */ - - /* double *HSMHV2BsbPtr; not used */ - double *HSMHV2BbpPtr; /* pointer to sparse matrix element at (bulk node,bulk prime node) */ - /* double *HSMHV2BdbPtr; not used */ - double *HSMHV2BbPtr; /* pointer to sparse matrix element at (bulk node,bulk node) */ - - double *HSMHV2TemptempPtr; /* pointer to sparse matrix element at (temp node, temp node) */ - double *HSMHV2TempdPtr; /* pointer to sparse matrix element at (temp node, drain node) */ - double *HSMHV2TempdpPtr; /* pointer to sparse matrix element at (temp node, drain prime node) */ - double *HSMHV2TempsPtr; /* pointer to sparse matrix element at (temp node, source node) */ - double *HSMHV2TempspPtr; /* pointer to sparse matrix element at (temp node, source prime node) */ - /* double *HSMHV2TempgPtr; not used */ - double *HSMHV2TempgpPtr; /* pointer to sparse matrix element at (temp node, gate prime node) */ - /* double *HSMHV2TempbPtr; not used */ - double *HSMHV2TempbpPtr; /* pointer to sparse matrix element at (temp node, bulk prime node) */ - /* double *HSMHV2GtempPtr; not used */ - double *HSMHV2GPtempPtr; /* pointer to sparse matrix element at (gate prime node, temp node) */ - double *HSMHV2DPtempPtr; /* pointer to sparse matrix element at (drain prime node, temp node) */ - double *HSMHV2SPtempPtr; /* pointer to sparse matrix element at (source prime node, temp node) */ - /* double *HSMHV2BtempPtr; not used */ - double *HSMHV2BPtempPtr; /* pointer to sparse matrix element at (bulk prime node, temp node) */ - double *HSMHV2DBtempPtr; /* pointer to sparse matrix element at (drain bulk node, temp node) */ - double *HSMHV2SBtempPtr; /* pointer to sparse matrix element at (source bulk node, temp node) */ - - double *HSMHV2DgpPtr; /* pointer to sparse matrix element at (drain node, gate prime node) */ - double *HSMHV2DsPtr; /* pointer to sparse matrix element at (drain node, source node) */ - double *HSMHV2DbpPtr; /* pointer to sparse matrix element at (drain node, bulk prime node) */ - double *HSMHV2DtempPtr; /* pointer to sparse matrix element at (drain node, temp node) */ - double *HSMHV2DPsPtr; /* pointer to sparse matrix element at (drain prime node, source node) */ - double *HSMHV2GPdPtr; /* pointer to sparse matrix element at (gate prime node, drain node) */ - double *HSMHV2GPsPtr; /* pointer to sparse matrix element at (gate prime node, source node) */ - double *HSMHV2SdPtr; /* pointer to sparse matrix element at (source node, drain node) */ - double *HSMHV2SgpPtr; /* pointer to sparse matrix element at (source node, gate prime node) */ - double *HSMHV2SbpPtr; /* pointer to sparse matrix element at (source node, bulk prime node) */ - double *HSMHV2StempPtr; /* pointer to sparse matrix element at (source node, temp node) */ - double *HSMHV2SPdPtr; /* pointer to sparse matrix element at (source prime node, drain node) */ - - /* nqs related pointers */ - double *HSMHV2DPqiPtr; /* pointer to sparse matrix element at (drain prime node, qi_nqs node) */ - double *HSMHV2GPqiPtr; /* pointer to sparse matrix element at (gate prime node, qi_nqs node) */ - double *HSMHV2GPqbPtr; /* pointer to sparse matrix element at (gate prime node, qb_nqs node) */ - double *HSMHV2SPqiPtr; /* pointer to sparse matrix element at (source prime node, qi_nqs node) */ - double *HSMHV2BPqbPtr; /* pointer to sparse matrix element at (bulk prime node, qb_nqs node) */ - double *HSMHV2QIdpPtr; /* pointer to sparse matrix element at (qi_nqs node, drain prime node) */ - double *HSMHV2QIgpPtr; /* pointer to sparse matrix element at (qi_nqs node, gate prime node) */ - double *HSMHV2QIspPtr; /* pointer to sparse matrix element at (qi_nqs node, source prime node) */ - double *HSMHV2QIbpPtr; /* pointer to sparse matrix element at (qi_nqs node, bulk prime node) */ - double *HSMHV2QIqiPtr; /* pointer to sparse matrix element at (qi_nqs node, qi_nqs node) */ - double *HSMHV2QBdpPtr; /* pointer to sparse matrix element at (qb_nqs node, drain prime node) */ - double *HSMHV2QBgpPtr; /* pointer to sparse matrix element at (qb_nqs node, gate prime node) */ - double *HSMHV2QBspPtr; /* pointer to sparse matrix element at (qb_nqs node, source prime node) */ - double *HSMHV2QBbpPtr; /* pointer to sparse matrix element at (qb_nqs node, bulk prime node) */ - double *HSMHV2QBqbPtr; /* pointer to sparse matrix element at (qb_nqs node, qb_nqs node) */ - double *HSMHV2QItempPtr; /* pointer to sparse matrix element at (qi_nqs node, temp node) */ - double *HSMHV2QBtempPtr; /* pointer to sparse matrix element at (qb_nqs node, temp node) */ - - /* Substrate effect related pointers */ - double *HSMHV2DsubPtr; /* pointer to sparse matrix element at (drain node, substrate node) */ - double *HSMHV2DPsubPtr; /* pointer to sparse matrix element at (drain prime node, substrate node) */ - double *HSMHV2SsubPtr; /* pointer to sparse matrix element at (source node, substrate node) */ - double *HSMHV2SPsubPtr; /* pointer to sparse matrix element at (source prime node, substrate node) */ - - - /* common state values in hisim module */ -#define HSMHV2vbd HSMHV2states+ 0 -#define HSMHV2vbs HSMHV2states+ 1 -#define HSMHV2vgs HSMHV2states+ 2 -#define HSMHV2vds HSMHV2states+ 3 -#define HSMHV2vdbs HSMHV2states+ 4 -#define HSMHV2vdbd HSMHV2states+ 5 -#define HSMHV2vsbs HSMHV2states+ 6 -#define HSMHV2vges HSMHV2states+ 7 -#define HSMHV2vsubs HSMHV2states+ 8 /* substrate bias */ -#define HSMHV2deltemp HSMHV2states+ 9 -#define HSMHV2vdse HSMHV2states+ 10 -#define HSMHV2vgse HSMHV2states+ 11 -#define HSMHV2vbse HSMHV2states+ 12 - -#define HSMHV2qb HSMHV2states+ 13 -#define HSMHV2cqb HSMHV2states+ 14 -#define HSMHV2qg HSMHV2states+ 15 -#define HSMHV2cqg HSMHV2states+ 16 -#define HSMHV2qd HSMHV2states+ 17 -#define HSMHV2cqd HSMHV2states+ 18 - -#define HSMHV2qbs HSMHV2states+ 19 -#define HSMHV2cqbs HSMHV2states+ 20 -#define HSMHV2qbd HSMHV2states+ 21 -#define HSMHV2cqbd HSMHV2states+ 22 - -#define HSMHV2qth HSMHV2states+ 23 -#define HSMHV2cqth HSMHV2states+ 24 - -/*add fringing capacitance*/ -#define HSMHV2qfd HSMHV2states+ 25 -#define HSMHV2cqfd HSMHV2states+ 26 -#define HSMHV2qfs HSMHV2states+ 27 -#define HSMHV2cqfs HSMHV2states+ 28 - -/*add external drain capacitance*/ -#define HSMHV2qdE HSMHV2states+ 29 -#define HSMHV2cqdE HSMHV2states+ 30 - -#define HSMHV2numStates 31 - -/* nqs charges */ -#define HSMHV2qi_nqs HSMHV2states+ 32 -#define HSMHV2dotqi_nqs HSMHV2states + 33 -#define HSMHV2qb_nqs HSMHV2states+ 34 -#define HSMHV2dotqb_nqs HSMHV2states + 35 - -#define HSMHV2numStatesNqs 36 - -/* indices to the array of HiSIMHV NOISE SOURCES */ -#define HSMHV2RDNOIZ 0 -#define HSMHV2RSNOIZ 1 -#define HSMHV2IDNOIZ 2 -#define HSMHV2FLNOIZ 3 -#define HSMHV2IGNOIZ 4 -#define HSMHV2TOTNOIZ 5 - -#define HSMHV2NSRCS 6 /* the number of HiSIMHV MOSFET noise sources */ - -#ifndef NONOISE - double HSMHV2nVar[NSTATVARS][HSMHV2NSRCS]; -#else /* NONOISE */ - double **HSMHV2nVar; -#endif /* NONOISE */ - -} HSMHV2instance ; - - -/* per model data */ - -typedef struct sHSMHV2model { /* model structure for a resistor */ - - struct GENmodel gen; - -#define HSMHV2modType gen.GENmodType -#define HSMHV2nextModel(inst) ((struct sHSMHV2model *)((inst)->gen.GENnextModel)) -#define HSMHV2instances(inst) ((HSMHV2instance *)((inst)->gen.GENinstances)) -#define HSMHV2modName gen.GENmodName - - int HSMHV2_type; /* device type: 1 = nmos, -1 = pmos */ - int HSMHV2_level; /* level */ - int HSMHV2_info; /* information */ - int HSMHV2_noise; /* noise model selecter see hsmhvnoi.c */ - char *HSMHV2_version; /* model version */ - int HSMHV2_show; /* show physical value 1, 2, ... , 11 */ - - - int HSMHV2_corsrd ; - int HSMHV2_corg ; - int HSMHV2_coiprv ; - int HSMHV2_copprv ; - int HSMHV2_coadov ; - int HSMHV2_coisub ; - int HSMHV2_coiigs ; - int HSMHV2_cogidl ; - int HSMHV2_coovlp ; - int HSMHV2_coovlps ; - int HSMHV2_coflick ; - int HSMHV2_coisti ; - int HSMHV2_conqs ; - int HSMHV2_corbnet ; - int HSMHV2_cothrml; - int HSMHV2_coign; /* Induced gate noise */ - int HSMHV2_codfm; /* DFM */ - int HSMHV2_coqovsm ; - int HSMHV2_coselfheat; /* Self-heating model */ - int HSMHV2_cosubnode; /* switch tempNode to subNode */ - int HSMHV2_cosym; /* Symmetry model for HV */ - int HSMHV2_cotemp; - int HSMHV2_coldrift; - int HSMHV2_cordrift; - int HSMHV2_coerrrep; - int HSMHV2_codep; - int HSMHV2_coddlt; - - double HSMHV2_vmax ; - double HSMHV2_vmaxt1 ; - double HSMHV2_vmaxt2 ; - double HSMHV2_bgtmp1 ; - double HSMHV2_bgtmp2 ; - double HSMHV2_eg0 ; - double HSMHV2_tox ; - double HSMHV2_xld ; - double HSMHV2_xldld ; - double HSMHV2_xwdld ; - double HSMHV2_lover ; - double HSMHV2_lovers ; - double HSMHV2_rdov11 ; - double HSMHV2_rdov12 ; - double HSMHV2_rdov13 ; - double HSMHV2_rdslp1 ; - double HSMHV2_rdict1 ; - double HSMHV2_rdslp2 ; - double HSMHV2_rdict2 ; - double HSMHV2_loverld ; - double HSMHV2_ldrift1 ; - double HSMHV2_ldrift2 ; - double HSMHV2_ldrift1s ; - double HSMHV2_ldrift2s ; - double HSMHV2_subld1 ; - double HSMHV2_subld1l ; - double HSMHV2_subld1lp ; - double HSMHV2_subld2 ; - double HSMHV2_xpdv ; - double HSMHV2_xpvdth ; - double HSMHV2_xpvdthg ; - double HSMHV2_ddltmax ; - double HSMHV2_ddltslp ; - double HSMHV2_ddltict ; - double HSMHV2_vfbover ; - double HSMHV2_nover ; - double HSMHV2_novers ; - double HSMHV2_xwd ; - double HSMHV2_xwdc ; - double HSMHV2_xl ; - double HSMHV2_xw ; - double HSMHV2_saref ; - double HSMHV2_sbref ; - double HSMHV2_ll ; - double HSMHV2_lld ; - double HSMHV2_lln ; - double HSMHV2_wl ; - double HSMHV2_wl1 ; - double HSMHV2_wl1p ; - double HSMHV2_wl2 ; - double HSMHV2_wl2p ; - double HSMHV2_wld ; - double HSMHV2_wln ; - double HSMHV2_xqy ; - double HSMHV2_xqy1 ; - double HSMHV2_xqy2 ; - double HSMHV2_rs; /* source contact resistance */ - double HSMHV2_rd; /* drain contact resistance */ - double HSMHV2_rsh; /* source/drain diffusion sheet resistance */ - double HSMHV2_rshg; -/* double HSMHV2_ngcon; */ -/* double HSMHV2_xgw; */ -/* double HSMHV2_xgl; */ -/* double HSMHV2_nf; */ - double HSMHV2_vfbc ; - double HSMHV2_vbi ; - double HSMHV2_nsubc ; - double HSMHV2_qdftvd ; - double HSMHV2_parl2 ; - double HSMHV2_lp ; - double HSMHV2_nsubp ; - double HSMHV2_nsubp0 ; - double HSMHV2_nsubwp ; - double HSMHV2_scp1 ; - double HSMHV2_scp2 ; - double HSMHV2_scp3 ; - double HSMHV2_sc1 ; - double HSMHV2_sc2 ; - double HSMHV2_sc3 ; - double HSMHV2_sc4 ; - double HSMHV2_pgd1 ; - double HSMHV2_pgd2 ; -//double HSMHV2_pgd3 ; - double HSMHV2_pgd4 ; - double HSMHV2_ndep ; - double HSMHV2_ndepl ; - double HSMHV2_ndeplp ; - double HSMHV2_ninv ; - double HSMHV2_ninvd ; - double HSMHV2_ninvdw ; - double HSMHV2_ninvdwp ; - double HSMHV2_ninvdt1 ; - double HSMHV2_ninvdt2 ; - double HSMHV2_muecb0 ; - double HSMHV2_muecb1 ; - double HSMHV2_mueph1 ; - double HSMHV2_mueph0 ; - double HSMHV2_muephw ; - double HSMHV2_muepwp ; - double HSMHV2_muephl ; - double HSMHV2_mueplp ; - double HSMHV2_muephs ; - double HSMHV2_muepsp ; - double HSMHV2_vtmp ; - double HSMHV2_wvth0 ; - double HSMHV2_muesr1 ; - double HSMHV2_muesr0 ; - double HSMHV2_muesrw ; - double HSMHV2_mueswp ; - double HSMHV2_muesrl ; - double HSMHV2_mueslp ; - double HSMHV2_bb ; - double HSMHV2_sub1 ; - double HSMHV2_sub2 ; - double HSMHV2_svgs ; - double HSMHV2_svbs ; - double HSMHV2_svbsl ; - double HSMHV2_svds ; - double HSMHV2_slg ; - double HSMHV2_sub1l ; - double HSMHV2_sub2l ; - double HSMHV2_fn1 ; - double HSMHV2_fn2 ; - double HSMHV2_fn3 ; - double HSMHV2_fvbs ; - double HSMHV2_svgsl ; - double HSMHV2_svgslp ; - double HSMHV2_svgswp ; - double HSMHV2_svgsw ; - double HSMHV2_svbslp ; - double HSMHV2_slgl ; - double HSMHV2_slglp ; - double HSMHV2_sub1lp ; - double HSMHV2_nsti ; - double HSMHV2_wsti ; - double HSMHV2_wstil ; - double HSMHV2_wstilp ; - double HSMHV2_wstiw ; - double HSMHV2_wstiwp ; - double HSMHV2_scsti1 ; - double HSMHV2_scsti2 ; - double HSMHV2_vthsti ; - double HSMHV2_vdsti ; - double HSMHV2_muesti1 ; - double HSMHV2_muesti2 ; - double HSMHV2_muesti3 ; - double HSMHV2_nsubpsti1 ; - double HSMHV2_nsubpsti2 ; - double HSMHV2_nsubpsti3 ; - double HSMHV2_lpext ; - double HSMHV2_npext ; - double HSMHV2_scp22 ; - double HSMHV2_scp21 ; - double HSMHV2_bs1 ; - double HSMHV2_bs2 ; - double HSMHV2_cgso ; - double HSMHV2_cgdo ; - double HSMHV2_cgbo ; - double HSMHV2_tpoly ; - double HSMHV2_js0 ; - double HSMHV2_js0sw ; - double HSMHV2_nj ; - double HSMHV2_njsw ; - double HSMHV2_xti ; - double HSMHV2_cj ; - double HSMHV2_cjsw ; - double HSMHV2_cjswg ; - double HSMHV2_mj ; - double HSMHV2_mjsw ; - double HSMHV2_mjswg ; - double HSMHV2_xti2 ; - double HSMHV2_cisb ; - double HSMHV2_cvb ; - double HSMHV2_ctemp ; - double HSMHV2_cisbk ; - double HSMHV2_cvbk ; - double HSMHV2_divx ; - double HSMHV2_pb ; - double HSMHV2_pbsw ; - double HSMHV2_pbswg ; - double HSMHV2_clm1 ; - double HSMHV2_clm2 ; - double HSMHV2_clm3 ; - double HSMHV2_clm5 ; - double HSMHV2_clm6 ; - double HSMHV2_muetmp ; - double HSMHV2_vover ; - double HSMHV2_voverp ; - double HSMHV2_vovers ; - double HSMHV2_voversp ; - double HSMHV2_wfc ; - double HSMHV2_nsubcw ; - double HSMHV2_nsubcwp ; - double HSMHV2_qme1 ; - double HSMHV2_qme2 ; - double HSMHV2_qme3 ; - double HSMHV2_gidl1 ; - double HSMHV2_gidl2 ; - double HSMHV2_gidl3 ; - double HSMHV2_gidl4 ; - double HSMHV2_gidl5 ; - double HSMHV2_gleak1 ; - double HSMHV2_gleak2 ; - double HSMHV2_gleak3 ; - double HSMHV2_gleak4 ; - double HSMHV2_gleak5 ; - double HSMHV2_gleak6 ; - double HSMHV2_gleak7 ; - double HSMHV2_glpart1 ; - double HSMHV2_glksd1 ; - double HSMHV2_glksd2 ; - double HSMHV2_glksd3 ; - double HSMHV2_glkb1 ; - double HSMHV2_glkb2 ; - double HSMHV2_glkb3 ; - double HSMHV2_egig; - double HSMHV2_igtemp2; - double HSMHV2_igtemp3; - double HSMHV2_vzadd0 ; - double HSMHV2_pzadd0 ; - double HSMHV2_nftrp ; - double HSMHV2_nfalp ; - double HSMHV2_cit ; - double HSMHV2_falph ; - double HSMHV2_kappa ; - double HSMHV2_vdiffj ; - double HSMHV2_dly1 ; - double HSMHV2_dly2 ; - double HSMHV2_dly3 ; - double HSMHV2_dlyov; - double HSMHV2_tnom ; - double HSMHV2_ovslp ; - double HSMHV2_ovmag ; - /* substrate resistances */ - double HSMHV2_gbmin; - double HSMHV2_rbpb ; - double HSMHV2_rbpd ; - double HSMHV2_rbps ; - double HSMHV2_rbdb ; - double HSMHV2_rbsb ; - /* IBPC */ - double HSMHV2_ibpc1 ; - double HSMHV2_ibpc1l ; - double HSMHV2_ibpc1lp ; - double HSMHV2_ibpc2 ; - /* DFM */ - double HSMHV2_mphdfm ; - - double HSMHV2_ptl, HSMHV2_ptp, HSMHV2_pt2, HSMHV2_ptlp, HSMHV2_gdl, HSMHV2_gdlp ; - - double HSMHV2_gdld ; - double HSMHV2_pt4 ; - double HSMHV2_pt4p ; - - double HSMHV2_vbsmin ; - double HSMHV2_rdvg11 ; - double HSMHV2_rdvg12 ; - double HSMHV2_rd20 ; -//double HSMHV2_qovsm ; - double HSMHV2_ldrift ; - double HSMHV2_rd21 ; - double HSMHV2_rd22 ; - double HSMHV2_rd22d ; - double HSMHV2_rd23 ; - double HSMHV2_rd24 ; - double HSMHV2_rd25 ; - double HSMHV2_rdvdl ; - double HSMHV2_rdvdlp ; - double HSMHV2_rdvds ; - double HSMHV2_rdvdsp ; - double HSMHV2_rd23l ; - double HSMHV2_rd23lp ; - double HSMHV2_rd23s ; - double HSMHV2_rd23sp ; - double HSMHV2_rds ; - double HSMHV2_rdsp ; - - double HSMHV2_rdvd ; - double HSMHV2_rdvb ; - - double HSMHV2_rdvsub ; /* substrate effect */ - double HSMHV2_rdvdsub ; /* substrate effect */ - double HSMHV2_ddrift ; /* substrate effect */ - double HSMHV2_vbisub ; /* substrate effect */ - double HSMHV2_nsubsub ; /* substrate effect */ - - double HSMHV2_rth0 ; - double HSMHV2_cth0 ; - double HSMHV2_powrat ; - - double HSMHV2_tcjbd ; - double HSMHV2_tcjbs ; - double HSMHV2_tcjbdsw ; - double HSMHV2_tcjbssw ; - double HSMHV2_tcjbdswg ; - double HSMHV2_tcjbsswg ; - - - double HSMHV2_rdtemp1 ; - double HSMHV2_rdtemp2 ; - double HSMHV2_rth0r ; /* heat radiation for SHE */ - double HSMHV2_rdvdtemp1 ; - double HSMHV2_rdvdtemp2 ; - double HSMHV2_rth0w ; - double HSMHV2_rth0wp ; - double HSMHV2_rth0nf ; - - double HSMHV2_rthtemp1 ; - double HSMHV2_rthtemp2 ; - double HSMHV2_prattemp1 ; - double HSMHV2_prattemp2 ; - - - double HSMHV2_cvdsover ; - - double HSMHV2_rdrmue ; - double HSMHV2_rdrvmax ; - double HSMHV2_rdrmuetmp ; - double HSMHV2_ndepm ; - double HSMHV2_tndep ; - double HSMHV2_depmue0 ; - double HSMHV2_depmue1 ; - double HSMHV2_depmueback0 ; - double HSMHV2_depmueback1 ; - double HSMHV2_depvmax ; - double HSMHV2_depvdsef1 ; - double HSMHV2_depvdsef2 ; - double HSMHV2_depmueph0 ; - double HSMHV2_depmueph1 ; - double HSMHV2_depbb ; - double HSMHV2_depleak ; - double HSMHV2_depeta ; - double HSMHV2_depvtmp ; - double HSMHV2_depmuetmp ; - - double HSMHV2_isbreak ; - double HSMHV2_rwell ; - - double HSMHV2_rdrvtmp ; - // double HSMHV2_rdrvmaxt1 ; - // double HSMHV2_rdrvmaxt2 ; - double HSMHV2_rdrdjunc ; - double HSMHV2_rdrcx ; - double HSMHV2_rdrcar ; - double HSMHV2_rdrdl1 ; - double HSMHV2_rdrdl2 ; - double HSMHV2_rdrvmaxw ; - double HSMHV2_rdrvmaxwp ; - double HSMHV2_rdrvmaxl ; - double HSMHV2_rdrvmaxlp ; - double HSMHV2_rdrmuel ; - double HSMHV2_rdrmuelp ; - double HSMHV2_qovadd; - double HSMHV2_rdrqover ; - double HSMHV2_js0d; - double HSMHV2_js0swd; - double HSMHV2_njd; - double HSMHV2_njswd; - double HSMHV2_xtid; - double HSMHV2_cjd; - double HSMHV2_cjswd; - double HSMHV2_cjswgd; - double HSMHV2_mjd; - double HSMHV2_mjswd; - double HSMHV2_mjswgd; - double HSMHV2_pbd; - double HSMHV2_pbswd; - double HSMHV2_pbswgd; - double HSMHV2_xti2d; - double HSMHV2_cisbd; - double HSMHV2_cvbd; - double HSMHV2_ctempd; - double HSMHV2_cisbkd; - double HSMHV2_divxd; - double HSMHV2_vdiffjd; - double HSMHV2_js0s; - double HSMHV2_js0sws; - double HSMHV2_njs; - double HSMHV2_njsws; - double HSMHV2_xtis; - double HSMHV2_cjs; - double HSMHV2_cjsws; - double HSMHV2_cjswgs; - double HSMHV2_mjs; - double HSMHV2_mjsws; - double HSMHV2_mjswgs; - double HSMHV2_pbs; - double HSMHV2_pbsws; - double HSMHV2_pbswgs; - double HSMHV2_xti2s; - double HSMHV2_cisbs; - double HSMHV2_cvbs; - double HSMHV2_ctemps; - double HSMHV2_cisbks; - double HSMHV2_divxs; - double HSMHV2_vdiffjs; - double HSMHV2_shemax; - double HSMHV2_vgsmin; - double HSMHV2_gdsleak; - double HSMHV2_rdrbb; - double HSMHV2_rdrbbtmp; - - - /* binning parameters */ - double HSMHV2_lmin ; - double HSMHV2_lmax ; - double HSMHV2_wmin ; - double HSMHV2_wmax ; - double HSMHV2_lbinn ; - double HSMHV2_wbinn ; - - /* Length dependence */ - double HSMHV2_lvmax ; - double HSMHV2_lbgtmp1 ; - double HSMHV2_lbgtmp2 ; - double HSMHV2_leg0 ; - double HSMHV2_lvfbover ; - double HSMHV2_lnover ; - double HSMHV2_lnovers ; - double HSMHV2_lwl2 ; - double HSMHV2_lvfbc ; - double HSMHV2_lnsubc ; - double HSMHV2_lnsubp ; - double HSMHV2_lscp1 ; - double HSMHV2_lscp2 ; - double HSMHV2_lscp3 ; - double HSMHV2_lsc1 ; - double HSMHV2_lsc2 ; - double HSMHV2_lsc3 ; - double HSMHV2_lpgd1 ; -//double HSMHV2_lpgd3 ; - double HSMHV2_lndep ; - double HSMHV2_lninv ; - double HSMHV2_lmuecb0 ; - double HSMHV2_lmuecb1 ; - double HSMHV2_lmueph1 ; - double HSMHV2_lvtmp ; - double HSMHV2_lwvth0 ; - double HSMHV2_lmuesr1 ; - double HSMHV2_lmuetmp ; - double HSMHV2_lsub1 ; - double HSMHV2_lsub2 ; - double HSMHV2_lsvds ; - double HSMHV2_lsvbs ; - double HSMHV2_lsvgs ; - double HSMHV2_lfn1 ; - double HSMHV2_lfn2 ; - double HSMHV2_lfn3 ; - double HSMHV2_lfvbs ; - double HSMHV2_lnsti ; - double HSMHV2_lwsti ; - double HSMHV2_lscsti1 ; - double HSMHV2_lscsti2 ; - double HSMHV2_lvthsti ; - double HSMHV2_lmuesti1 ; - double HSMHV2_lmuesti2 ; - double HSMHV2_lmuesti3 ; - double HSMHV2_lnsubpsti1 ; - double HSMHV2_lnsubpsti2 ; - double HSMHV2_lnsubpsti3 ; - double HSMHV2_lcgso ; - double HSMHV2_lcgdo ; - double HSMHV2_ljs0 ; - double HSMHV2_ljs0sw ; - double HSMHV2_lnj ; - double HSMHV2_lcisbk ; - double HSMHV2_lclm1 ; - double HSMHV2_lclm2 ; - double HSMHV2_lclm3 ; - double HSMHV2_lwfc ; - double HSMHV2_lgidl1 ; - double HSMHV2_lgidl2 ; - double HSMHV2_lgleak1 ; - double HSMHV2_lgleak2 ; - double HSMHV2_lgleak3 ; - double HSMHV2_lgleak6 ; - double HSMHV2_lglksd1 ; - double HSMHV2_lglksd2 ; - double HSMHV2_lglkb1 ; - double HSMHV2_lglkb2 ; - double HSMHV2_lnftrp ; - double HSMHV2_lnfalp ; - double HSMHV2_lvdiffj ; - double HSMHV2_libpc1 ; - double HSMHV2_libpc2 ; - double HSMHV2_lcgbo ; - double HSMHV2_lcvdsover ; - double HSMHV2_lfalph ; - double HSMHV2_lnpext ; - double HSMHV2_lpowrat ; - double HSMHV2_lrd ; - double HSMHV2_lrd22 ; - double HSMHV2_lrd23 ; - double HSMHV2_lrd24 ; - double HSMHV2_lrdict1 ; - double HSMHV2_lrdov13 ; - double HSMHV2_lrdslp1 ; - double HSMHV2_lrdvb ; - double HSMHV2_lrdvd ; - double HSMHV2_lrdvg11 ; - double HSMHV2_lrs ; - double HSMHV2_lrth0 ; - double HSMHV2_lvover ; - double HSMHV2_ljs0d; - double HSMHV2_ljs0swd; - double HSMHV2_lnjd; - double HSMHV2_lcisbkd; - double HSMHV2_lvdiffjd; - double HSMHV2_ljs0s; - double HSMHV2_ljs0sws; - double HSMHV2_lnjs; - double HSMHV2_lcisbks; - double HSMHV2_lvdiffjs; - - /* Width dependence */ - double HSMHV2_wvmax ; - double HSMHV2_wbgtmp1 ; - double HSMHV2_wbgtmp2 ; - double HSMHV2_weg0 ; - double HSMHV2_wvfbover ; - double HSMHV2_wnover ; - double HSMHV2_wnovers ; - double HSMHV2_wwl2 ; - double HSMHV2_wvfbc ; - double HSMHV2_wnsubc ; - double HSMHV2_wnsubp ; - double HSMHV2_wscp1 ; - double HSMHV2_wscp2 ; - double HSMHV2_wscp3 ; - double HSMHV2_wsc1 ; - double HSMHV2_wsc2 ; - double HSMHV2_wsc3 ; - double HSMHV2_wpgd1 ; -//double HSMHV2_wpgd3 ; - double HSMHV2_wndep ; - double HSMHV2_wninv ; - double HSMHV2_wmuecb0 ; - double HSMHV2_wmuecb1 ; - double HSMHV2_wmueph1 ; - double HSMHV2_wvtmp ; - double HSMHV2_wwvth0 ; - double HSMHV2_wmuesr1 ; - double HSMHV2_wmuetmp ; - double HSMHV2_wsub1 ; - double HSMHV2_wsub2 ; - double HSMHV2_wsvds ; - double HSMHV2_wsvbs ; - double HSMHV2_wsvgs ; - double HSMHV2_wfn1 ; - double HSMHV2_wfn2 ; - double HSMHV2_wfn3 ; - double HSMHV2_wfvbs ; - double HSMHV2_wnsti ; - double HSMHV2_wwsti ; - double HSMHV2_wscsti1 ; - double HSMHV2_wscsti2 ; - double HSMHV2_wvthsti ; - double HSMHV2_wmuesti1 ; - double HSMHV2_wmuesti2 ; - double HSMHV2_wmuesti3 ; - double HSMHV2_wnsubpsti1 ; - double HSMHV2_wnsubpsti2 ; - double HSMHV2_wnsubpsti3 ; - double HSMHV2_wcgso ; - double HSMHV2_wcgdo ; - double HSMHV2_wjs0 ; - double HSMHV2_wjs0sw ; - double HSMHV2_wnj ; - double HSMHV2_wcisbk ; - double HSMHV2_wclm1 ; - double HSMHV2_wclm2 ; - double HSMHV2_wclm3 ; - double HSMHV2_wwfc ; - double HSMHV2_wgidl1 ; - double HSMHV2_wgidl2 ; - double HSMHV2_wgleak1 ; - double HSMHV2_wgleak2 ; - double HSMHV2_wgleak3 ; - double HSMHV2_wgleak6 ; - double HSMHV2_wglksd1 ; - double HSMHV2_wglksd2 ; - double HSMHV2_wglkb1 ; - double HSMHV2_wglkb2 ; - double HSMHV2_wnftrp ; - double HSMHV2_wnfalp ; - double HSMHV2_wvdiffj ; - double HSMHV2_wibpc1 ; - double HSMHV2_wibpc2 ; - double HSMHV2_wcgbo ; - double HSMHV2_wcvdsover ; - double HSMHV2_wfalph ; - double HSMHV2_wnpext ; - double HSMHV2_wpowrat ; - double HSMHV2_wrd ; - double HSMHV2_wrd22 ; - double HSMHV2_wrd23 ; - double HSMHV2_wrd24 ; - double HSMHV2_wrdict1 ; - double HSMHV2_wrdov13 ; - double HSMHV2_wrdslp1 ; - double HSMHV2_wrdvb ; - double HSMHV2_wrdvd ; - double HSMHV2_wrdvg11 ; - double HSMHV2_wrs ; - double HSMHV2_wrth0 ; - double HSMHV2_wvover ; - double HSMHV2_wjs0d; - double HSMHV2_wjs0swd; - double HSMHV2_wnjd; - double HSMHV2_wcisbkd; - double HSMHV2_wvdiffjd; - double HSMHV2_wjs0s; - double HSMHV2_wjs0sws; - double HSMHV2_wnjs; - double HSMHV2_wcisbks; - double HSMHV2_wvdiffjs; - - /* Cross-term dependence */ - double HSMHV2_pvmax ; - double HSMHV2_pbgtmp1 ; - double HSMHV2_pbgtmp2 ; - double HSMHV2_peg0 ; - double HSMHV2_pvfbover ; - double HSMHV2_pnover ; - double HSMHV2_pnovers ; - double HSMHV2_pwl2 ; - double HSMHV2_pvfbc ; - double HSMHV2_pnsubc ; - double HSMHV2_pnsubp ; - double HSMHV2_pscp1 ; - double HSMHV2_pscp2 ; - double HSMHV2_pscp3 ; - double HSMHV2_psc1 ; - double HSMHV2_psc2 ; - double HSMHV2_psc3 ; - double HSMHV2_ppgd1 ; -//double HSMHV2_ppgd3 ; - double HSMHV2_pndep ; - double HSMHV2_pninv ; - double HSMHV2_pmuecb0 ; - double HSMHV2_pmuecb1 ; - double HSMHV2_pmueph1 ; - double HSMHV2_pvtmp ; - double HSMHV2_pwvth0 ; - double HSMHV2_pmuesr1 ; - double HSMHV2_pmuetmp ; - double HSMHV2_psub1 ; - double HSMHV2_psub2 ; - double HSMHV2_psvds ; - double HSMHV2_psvbs ; - double HSMHV2_psvgs ; - double HSMHV2_pfn1 ; - double HSMHV2_pfn2 ; - double HSMHV2_pfn3 ; - double HSMHV2_pfvbs ; - double HSMHV2_pnsti ; - double HSMHV2_pwsti ; - double HSMHV2_pscsti1 ; - double HSMHV2_pscsti2 ; - double HSMHV2_pvthsti ; - double HSMHV2_pmuesti1 ; - double HSMHV2_pmuesti2 ; - double HSMHV2_pmuesti3 ; - double HSMHV2_pnsubpsti1 ; - double HSMHV2_pnsubpsti2 ; - double HSMHV2_pnsubpsti3 ; - double HSMHV2_pcgso ; - double HSMHV2_pcgdo ; - double HSMHV2_pjs0 ; - double HSMHV2_pjs0sw ; - double HSMHV2_pnj ; - double HSMHV2_pcisbk ; - double HSMHV2_pclm1 ; - double HSMHV2_pclm2 ; - double HSMHV2_pclm3 ; - double HSMHV2_pwfc ; - double HSMHV2_pgidl1 ; - double HSMHV2_pgidl2 ; - double HSMHV2_pgleak1 ; - double HSMHV2_pgleak2 ; - double HSMHV2_pgleak3 ; - double HSMHV2_pgleak6 ; - double HSMHV2_pglksd1 ; - double HSMHV2_pglksd2 ; - double HSMHV2_pglkb1 ; - double HSMHV2_pglkb2 ; - double HSMHV2_pnftrp ; - double HSMHV2_pnfalp ; - double HSMHV2_pvdiffj ; - double HSMHV2_pibpc1 ; - double HSMHV2_pibpc2 ; - double HSMHV2_pcgbo ; - double HSMHV2_pcvdsover ; - double HSMHV2_pfalph ; - double HSMHV2_pnpext ; - double HSMHV2_ppowrat ; - double HSMHV2_prd ; - double HSMHV2_prd22 ; - double HSMHV2_prd23 ; - double HSMHV2_prd24 ; - double HSMHV2_prdict1 ; - double HSMHV2_prdov13 ; - double HSMHV2_prdslp1 ; - double HSMHV2_prdvb ; - double HSMHV2_prdvd ; - double HSMHV2_prdvg11 ; - double HSMHV2_prs ; - double HSMHV2_prth0 ; - double HSMHV2_pvover ; - double HSMHV2_pjs0d; - double HSMHV2_pjs0swd; - double HSMHV2_pnjd; - double HSMHV2_pcisbkd; - double HSMHV2_pvdiffjd; - double HSMHV2_pjs0s; - double HSMHV2_pjs0sws; - double HSMHV2_pnjs; - double HSMHV2_pcisbks; - double HSMHV2_pvdiffjs; - - /* internal variables */ - double HSMHV2_exptempd ; - double HSMHV2_exptemps ; - double HSMHV2_jd_nvtm_invd ; - double HSMHV2_jd_nvtm_invs ; - double HSMHV2_vcrit ; - int HSMHV2_flg_qme ; - double HSMHV2_qme12 ; - double HSMHV2_ktnom ; - - int HSMHV2_subversion ; - int HSMHV2_revision ; - - double HSMHV2vgsMax; - double HSMHV2vgdMax; - double HSMHV2vgbMax; - double HSMHV2vdsMax; - double HSMHV2vbsMax; - double HSMHV2vbdMax; - double HSMHV2vgsrMax; - double HSMHV2vgdrMax; - double HSMHV2vgbrMax; - double HSMHV2vbsrMax; - double HSMHV2vbdrMax; - - HSMHV2modelMKSParam modelMKS ; /* unit-converted parameters */ - - - /* flag for model */ - unsigned HSMHV2_type_Given :1; - unsigned HSMHV2_level_Given :1; - unsigned HSMHV2_info_Given :1; - unsigned HSMHV2_noise_Given :1; - unsigned HSMHV2_version_Given :1; - unsigned HSMHV2_show_Given :1; - unsigned HSMHV2_corsrd_Given :1; - unsigned HSMHV2_corg_Given :1; - unsigned HSMHV2_coiprv_Given :1; - unsigned HSMHV2_copprv_Given :1; - unsigned HSMHV2_coadov_Given :1; - unsigned HSMHV2_coisub_Given :1; - unsigned HSMHV2_coiigs_Given :1; - unsigned HSMHV2_cogidl_Given :1; - unsigned HSMHV2_coovlp_Given :1; - unsigned HSMHV2_coovlps_Given :1; - unsigned HSMHV2_coflick_Given :1; - unsigned HSMHV2_coisti_Given :1; - unsigned HSMHV2_conqs_Given :1; - unsigned HSMHV2_corbnet_Given :1; - unsigned HSMHV2_cothrml_Given :1; - unsigned HSMHV2_coign_Given :1; /* Induced gate noise */ - unsigned HSMHV2_codfm_Given :1; /* DFM */ - unsigned HSMHV2_coqovsm_Given :1; - unsigned HSMHV2_coselfheat_Given :1; /* Self-heating model */ - unsigned HSMHV2_cosubnode_Given :1; /* switch tempNode to subNode */ - unsigned HSMHV2_cosym_Given :1; /* Symmetry model for HV */ - unsigned HSMHV2_cotemp_Given :1; - unsigned HSMHV2_coldrift_Given :1; - unsigned HSMHV2_cordrift_Given :1; - unsigned HSMHV2_coerrrep_Given :1; - unsigned HSMHV2_codep_Given :1; - unsigned HSMHV2_coddlt_Given :1; - unsigned HSMHV2_kappa_Given :1; - unsigned HSMHV2_vdiffj_Given :1; - unsigned HSMHV2_vmax_Given :1; - unsigned HSMHV2_vmaxt1_Given :1; - unsigned HSMHV2_vmaxt2_Given :1; - unsigned HSMHV2_bgtmp1_Given :1; - unsigned HSMHV2_bgtmp2_Given :1; - unsigned HSMHV2_eg0_Given :1; - unsigned HSMHV2_tox_Given :1; - unsigned HSMHV2_xld_Given :1; - unsigned HSMHV2_xldld_Given :1; - unsigned HSMHV2_xwdld_Given :1; - unsigned HSMHV2_lover_Given :1; - unsigned HSMHV2_lovers_Given :1; - unsigned HSMHV2_rdov11_Given :1; - unsigned HSMHV2_rdov12_Given :1; - unsigned HSMHV2_rdov13_Given :1; - unsigned HSMHV2_rdslp1_Given :1; - unsigned HSMHV2_rdict1_Given :1; - unsigned HSMHV2_rdslp2_Given :1; - unsigned HSMHV2_rdict2_Given :1; - unsigned HSMHV2_loverld_Given :1; - unsigned HSMHV2_ldrift1_Given :1; - unsigned HSMHV2_ldrift2_Given :1; - unsigned HSMHV2_ldrift1s_Given :1; - unsigned HSMHV2_ldrift2s_Given :1; - unsigned HSMHV2_subld1_Given :1; - unsigned HSMHV2_subld1l_Given :1; - unsigned HSMHV2_subld1lp_Given :1; - unsigned HSMHV2_subld2_Given :1; - unsigned HSMHV2_xpdv_Given :1; - unsigned HSMHV2_xpvdth_Given :1; - unsigned HSMHV2_xpvdthg_Given :1; - unsigned HSMHV2_ddltmax_Given :1; - unsigned HSMHV2_ddltslp_Given :1; - unsigned HSMHV2_ddltict_Given :1; - unsigned HSMHV2_vfbover_Given :1; - unsigned HSMHV2_nover_Given :1; - unsigned HSMHV2_novers_Given :1; - unsigned HSMHV2_xwd_Given :1; - unsigned HSMHV2_xwdc_Given :1; - unsigned HSMHV2_xl_Given :1; - unsigned HSMHV2_xw_Given :1; - unsigned HSMHV2_saref_Given :1; - unsigned HSMHV2_sbref_Given :1; - unsigned HSMHV2_ll_Given :1; - unsigned HSMHV2_lld_Given :1; - unsigned HSMHV2_lln_Given :1; - unsigned HSMHV2_wl_Given :1; - unsigned HSMHV2_wl1_Given :1; - unsigned HSMHV2_wl1p_Given :1; - unsigned HSMHV2_wl2_Given :1; - unsigned HSMHV2_wl2p_Given :1; - unsigned HSMHV2_wld_Given :1; - unsigned HSMHV2_wln_Given :1; - unsigned HSMHV2_xqy_Given :1; - unsigned HSMHV2_xqy1_Given :1; - unsigned HSMHV2_xqy2_Given :1; - unsigned HSMHV2_rs_Given :1; - unsigned HSMHV2_rd_Given :1; - unsigned HSMHV2_rsh_Given :1; - unsigned HSMHV2_rshg_Given :1; -/* unsigned HSMHV2_ngcon_Given :1; */ -/* unsigned HSMHV2_xgw_Given :1; */ -/* unsigned HSMHV2_xgl_Given :1; */ -/* unsigned HSMHV2_nf_Given :1; */ - unsigned HSMHV2_vfbc_Given :1; - unsigned HSMHV2_vbi_Given :1; - unsigned HSMHV2_nsubc_Given :1; - unsigned HSMHV2_parl2_Given :1; - unsigned HSMHV2_lp_Given :1; - unsigned HSMHV2_nsubp_Given :1; - unsigned HSMHV2_ndepm_Given :1; - unsigned HSMHV2_tndep_Given :1; - unsigned HSMHV2_depmue0_Given :1; - unsigned HSMHV2_depmue1_Given :1; - unsigned HSMHV2_depmueback0_Given :1; - unsigned HSMHV2_depmueback1_Given :1; - unsigned HSMHV2_depleak_Given :1; - unsigned HSMHV2_depeta_Given :1; - unsigned HSMHV2_depvmax_Given :1; - unsigned HSMHV2_depvdsef1_Given :1; - unsigned HSMHV2_depvdsef2_Given :1; - unsigned HSMHV2_depmueph0_Given :1; - unsigned HSMHV2_depmueph1_Given :1; - unsigned HSMHV2_depbb_Given :1; - unsigned HSMHV2_depvtmp_Given :1; - unsigned HSMHV2_depmuetmp_Given :1; - - unsigned HSMHV2_isbreak_Given :1; - unsigned HSMHV2_rwell_Given :1; - - - unsigned HSMHV2_nsubp0_Given :1; - unsigned HSMHV2_nsubwp_Given :1; - unsigned HSMHV2_scp1_Given :1; - unsigned HSMHV2_scp2_Given :1; - unsigned HSMHV2_scp3_Given :1; - unsigned HSMHV2_sc1_Given :1; - unsigned HSMHV2_sc2_Given :1; - unsigned HSMHV2_sc3_Given :1; - unsigned HSMHV2_sc4_Given :1; - unsigned HSMHV2_pgd1_Given :1; - unsigned HSMHV2_pgd2_Given :1; - unsigned HSMHV2_pgd4_Given :1; - unsigned HSMHV2_ndep_Given :1; - unsigned HSMHV2_ndepl_Given :1; - unsigned HSMHV2_ndeplp_Given :1; - unsigned HSMHV2_ninv_Given :1; - unsigned HSMHV2_muecb0_Given :1; - unsigned HSMHV2_muecb1_Given :1; - unsigned HSMHV2_mueph1_Given :1; - unsigned HSMHV2_mueph0_Given :1; - unsigned HSMHV2_muephw_Given :1; - unsigned HSMHV2_muepwp_Given :1; - unsigned HSMHV2_muephl_Given :1; - unsigned HSMHV2_mueplp_Given :1; - unsigned HSMHV2_muephs_Given :1; - unsigned HSMHV2_muepsp_Given :1; - unsigned HSMHV2_vtmp_Given :1; - unsigned HSMHV2_wvth0_Given :1; - unsigned HSMHV2_muesr1_Given :1; - unsigned HSMHV2_muesr0_Given :1; - unsigned HSMHV2_muesrl_Given :1; - unsigned HSMHV2_mueslp_Given :1; - unsigned HSMHV2_muesrw_Given :1; - unsigned HSMHV2_mueswp_Given :1; - unsigned HSMHV2_bb_Given :1; - unsigned HSMHV2_sub1_Given :1; - unsigned HSMHV2_sub2_Given :1; - unsigned HSMHV2_svgs_Given :1; - unsigned HSMHV2_svbs_Given :1; - unsigned HSMHV2_svbsl_Given :1; - unsigned HSMHV2_svds_Given :1; - unsigned HSMHV2_slg_Given :1; - unsigned HSMHV2_sub1l_Given :1; - unsigned HSMHV2_sub2l_Given :1; - unsigned HSMHV2_fn1_Given :1; - unsigned HSMHV2_fn2_Given :1; - unsigned HSMHV2_fn3_Given :1; - unsigned HSMHV2_fvbs_Given :1; - unsigned HSMHV2_svgsl_Given :1; - unsigned HSMHV2_svgslp_Given :1; - unsigned HSMHV2_svgswp_Given :1; - unsigned HSMHV2_svgsw_Given :1; - unsigned HSMHV2_svbslp_Given :1; - unsigned HSMHV2_slgl_Given :1; - unsigned HSMHV2_slglp_Given :1; - unsigned HSMHV2_sub1lp_Given :1; - unsigned HSMHV2_nsti_Given :1; - unsigned HSMHV2_wsti_Given :1; - unsigned HSMHV2_wstil_Given :1; - unsigned HSMHV2_wstilp_Given :1; - unsigned HSMHV2_wstiw_Given :1; - unsigned HSMHV2_wstiwp_Given :1; - unsigned HSMHV2_scsti1_Given :1; - unsigned HSMHV2_scsti2_Given :1; - unsigned HSMHV2_vthsti_Given :1; - unsigned HSMHV2_vdsti_Given :1; - unsigned HSMHV2_muesti1_Given :1; - unsigned HSMHV2_muesti2_Given :1; - unsigned HSMHV2_muesti3_Given :1; - unsigned HSMHV2_nsubpsti1_Given :1; - unsigned HSMHV2_nsubpsti2_Given :1; - unsigned HSMHV2_nsubpsti3_Given :1; - unsigned HSMHV2_lpext_Given :1; - unsigned HSMHV2_npext_Given :1; - unsigned HSMHV2_scp22_Given :1; - unsigned HSMHV2_scp21_Given :1; - unsigned HSMHV2_bs1_Given :1; - unsigned HSMHV2_bs2_Given :1; - unsigned HSMHV2_cgso_Given :1; - unsigned HSMHV2_cgdo_Given :1; - unsigned HSMHV2_cgbo_Given :1; - unsigned HSMHV2_tpoly_Given :1; - unsigned HSMHV2_js0_Given :1; - unsigned HSMHV2_js0sw_Given :1; - unsigned HSMHV2_nj_Given :1; - unsigned HSMHV2_njsw_Given :1; - unsigned HSMHV2_xti_Given :1; - unsigned HSMHV2_cj_Given :1; - unsigned HSMHV2_cjsw_Given :1; - unsigned HSMHV2_cjswg_Given :1; - unsigned HSMHV2_mj_Given :1; - unsigned HSMHV2_mjsw_Given :1; - unsigned HSMHV2_mjswg_Given :1; - unsigned HSMHV2_xti2_Given :1; - unsigned HSMHV2_cisb_Given :1; - unsigned HSMHV2_cvb_Given :1; - unsigned HSMHV2_ctemp_Given :1; - unsigned HSMHV2_cisbk_Given :1; - unsigned HSMHV2_cvbk_Given :1; - unsigned HSMHV2_divx_Given :1; - unsigned HSMHV2_pb_Given :1; - unsigned HSMHV2_pbsw_Given :1; - unsigned HSMHV2_pbswg_Given :1; - unsigned HSMHV2_clm1_Given :1; - unsigned HSMHV2_clm2_Given :1; - unsigned HSMHV2_clm3_Given :1; - unsigned HSMHV2_clm5_Given :1; - unsigned HSMHV2_clm6_Given :1; - unsigned HSMHV2_muetmp_Given :1; - unsigned HSMHV2_vover_Given :1; - unsigned HSMHV2_voverp_Given :1; - unsigned HSMHV2_vovers_Given :1; - unsigned HSMHV2_voversp_Given :1; - unsigned HSMHV2_wfc_Given :1; - unsigned HSMHV2_nsubcw_Given :1; - unsigned HSMHV2_nsubcwp_Given :1; - unsigned HSMHV2_qme1_Given :1; - unsigned HSMHV2_qme2_Given :1; - unsigned HSMHV2_qme3_Given :1; - unsigned HSMHV2_gidl1_Given :1; - unsigned HSMHV2_gidl2_Given :1; - unsigned HSMHV2_gidl3_Given :1; - unsigned HSMHV2_gidl4_Given :1; - unsigned HSMHV2_gidl5_Given :1; - unsigned HSMHV2_gleak1_Given :1; - unsigned HSMHV2_gleak2_Given :1; - unsigned HSMHV2_gleak3_Given :1; - unsigned HSMHV2_gleak4_Given :1; - unsigned HSMHV2_gleak5_Given :1; - unsigned HSMHV2_gleak6_Given :1; - unsigned HSMHV2_gleak7_Given :1; - unsigned HSMHV2_glpart1_Given :1; - unsigned HSMHV2_glksd1_Given :1; - unsigned HSMHV2_glksd2_Given :1; - unsigned HSMHV2_glksd3_Given :1; - unsigned HSMHV2_glkb1_Given :1; - unsigned HSMHV2_glkb2_Given :1; - unsigned HSMHV2_glkb3_Given :1; - unsigned HSMHV2_egig_Given :1; - unsigned HSMHV2_igtemp2_Given :1; - unsigned HSMHV2_igtemp3_Given :1; - unsigned HSMHV2_vzadd0_Given :1; - unsigned HSMHV2_pzadd0_Given :1; - unsigned HSMHV2_nftrp_Given :1; - unsigned HSMHV2_nfalp_Given :1; - unsigned HSMHV2_cit_Given :1; - unsigned HSMHV2_falph_Given :1; - unsigned HSMHV2_dly1_Given :1; - unsigned HSMHV2_dly2_Given :1; - unsigned HSMHV2_dly3_Given :1; - unsigned HSMHV2_dlyov_Given :1; - unsigned HSMHV2_tnom_Given :1; - unsigned HSMHV2_ovslp_Given :1; - unsigned HSMHV2_ovmag_Given :1; - unsigned HSMHV2_gbmin_Given :1; - unsigned HSMHV2_rbpb_Given :1; - unsigned HSMHV2_rbpd_Given :1; - unsigned HSMHV2_rbps_Given :1; - unsigned HSMHV2_rbdb_Given :1; - unsigned HSMHV2_rbsb_Given :1; - unsigned HSMHV2_ibpc1_Given :1; - unsigned HSMHV2_ibpc1l_Given :1; - unsigned HSMHV2_ibpc1lp_Given :1; - unsigned HSMHV2_ibpc2_Given :1; - unsigned HSMHV2_mphdfm_Given :1; - - unsigned HSMHV2_ptl_Given :1; - unsigned HSMHV2_ptp_Given :1; - unsigned HSMHV2_pt2_Given :1; - unsigned HSMHV2_ptlp_Given :1; - unsigned HSMHV2_gdl_Given :1; - unsigned HSMHV2_gdlp_Given :1; - - unsigned HSMHV2_gdld_Given :1; - unsigned HSMHV2_pt4_Given :1; - unsigned HSMHV2_pt4p_Given :1; - unsigned HSMHV2_rdvg11_Given :1; - unsigned HSMHV2_rdvg12_Given :1; - unsigned HSMHV2_ldrift_Given :1; - unsigned HSMHV2_rd20_Given :1; - unsigned HSMHV2_rd21_Given :1; - unsigned HSMHV2_rd22_Given :1; - unsigned HSMHV2_rd22d_Given :1; - unsigned HSMHV2_rd23_Given :1; - unsigned HSMHV2_rd24_Given :1; - unsigned HSMHV2_rd25_Given :1; - unsigned HSMHV2_rdvdl_Given :1; - unsigned HSMHV2_rdvdlp_Given :1; - unsigned HSMHV2_rdvds_Given :1; - unsigned HSMHV2_rdvdsp_Given :1; - unsigned HSMHV2_rd23l_Given :1; - unsigned HSMHV2_rd23lp_Given :1; - unsigned HSMHV2_rd23s_Given :1; - unsigned HSMHV2_rd23sp_Given :1; - unsigned HSMHV2_rds_Given :1; - unsigned HSMHV2_rdsp_Given :1; - unsigned HSMHV2_vbsmin_Given :1; - unsigned HSMHV2_ninvd_Given :1; - unsigned HSMHV2_ninvdw_Given :1; - unsigned HSMHV2_ninvdwp_Given :1; - unsigned HSMHV2_ninvdt1_Given :1; - unsigned HSMHV2_ninvdt2_Given :1; - unsigned HSMHV2_rdvb_Given :1; - unsigned HSMHV2_rth0nf_Given :1; - - unsigned HSMHV2_rthtemp1_Given :1; - unsigned HSMHV2_rthtemp2_Given :1; - unsigned HSMHV2_prattemp1_Given :1; - unsigned HSMHV2_prattemp2_Given :1; - - - unsigned HSMHV2_rth0_Given :1; - unsigned HSMHV2_cth0_Given :1; - unsigned HSMHV2_powrat_Given :1; - - - unsigned HSMHV2_tcjbd_Given :1; - unsigned HSMHV2_tcjbs_Given :1; - unsigned HSMHV2_tcjbdsw_Given :1; - unsigned HSMHV2_tcjbssw_Given :1; - unsigned HSMHV2_tcjbdswg_Given :1; - unsigned HSMHV2_tcjbsswg_Given :1; - - -/* unsigned HSMHV2_wth0_Given :1; */ - unsigned HSMHV2_qdftvd_Given :1; - unsigned HSMHV2_rdvd_Given :1; - unsigned HSMHV2_rdtemp1_Given :1; - unsigned HSMHV2_rdtemp2_Given :1; - unsigned HSMHV2_rth0r_Given :1; - unsigned HSMHV2_rdvdtemp1_Given :1; - unsigned HSMHV2_rdvdtemp2_Given :1; - unsigned HSMHV2_rth0w_Given :1; - unsigned HSMHV2_rth0wp_Given :1; - - unsigned HSMHV2_cvdsover_Given :1; - - /* substrate effect */ - unsigned HSMHV2_rdvsub_Given :1; /* substrate effect */ - unsigned HSMHV2_rdvdsub_Given :1; /* substrate effect */ - unsigned HSMHV2_ddrift_Given :1; /* substrate effect */ - unsigned HSMHV2_vbisub_Given :1; /* substrate effect */ - unsigned HSMHV2_nsubsub_Given :1; /* substrate effect */ - - unsigned HSMHV2_rdrmue_Given :1; - unsigned HSMHV2_rdrvmax_Given :1; - unsigned HSMHV2_rdrmuetmp_Given :1; - unsigned HSMHV2_myu0_leak_Given :1; - unsigned HSMHV2_myu0_leaktmp_Given :1; - unsigned HSMHV2_myu0_vmax_Given :1; - unsigned HSMHV2_myu0_cotemp1_Given :1; - unsigned HSMHV2_myu0_cotemp2_Given :1; - - unsigned HSMHV2_rdrvtmp_Given :1; - unsigned HSMHV2_rdrdjunc_Given :1; - unsigned HSMHV2_rdrcx_Given :1; - unsigned HSMHV2_rdrcar_Given :1; - unsigned HSMHV2_rdrdl1_Given :1; - unsigned HSMHV2_rdrdl2_Given :1; - unsigned HSMHV2_rdrvmaxw_Given :1; - unsigned HSMHV2_rdrvmaxwp_Given :1; - unsigned HSMHV2_rdrvmaxl_Given :1; - unsigned HSMHV2_rdrvmaxlp_Given :1; - unsigned HSMHV2_rdrmuel_Given :1; - unsigned HSMHV2_rdrmuelp_Given :1; - unsigned HSMHV2_qovadd_Given :1; - unsigned HSMHV2_rdrqover_Given :1; - unsigned HSMHV2_js0d_Given :1; - unsigned HSMHV2_js0swd_Given :1; - unsigned HSMHV2_njd_Given :1; - unsigned HSMHV2_njswd_Given :1; - unsigned HSMHV2_xtid_Given :1; - unsigned HSMHV2_cjd_Given :1; - unsigned HSMHV2_cjswd_Given :1; - unsigned HSMHV2_cjswgd_Given :1; - unsigned HSMHV2_mjd_Given :1; - unsigned HSMHV2_mjswd_Given :1; - unsigned HSMHV2_mjswgd_Given :1; - unsigned HSMHV2_pbd_Given :1; - unsigned HSMHV2_pbswd_Given :1; - unsigned HSMHV2_pbswgd_Given :1; - unsigned HSMHV2_xti2d_Given :1; - unsigned HSMHV2_cisbd_Given :1; - unsigned HSMHV2_cvbd_Given :1; - unsigned HSMHV2_ctempd_Given :1; - unsigned HSMHV2_cisbkd_Given :1; - unsigned HSMHV2_divxd_Given :1; - unsigned HSMHV2_vdiffjd_Given :1; - unsigned HSMHV2_js0s_Given :1; - unsigned HSMHV2_js0sws_Given :1; - unsigned HSMHV2_njs_Given :1; - unsigned HSMHV2_njsws_Given :1; - unsigned HSMHV2_xtis_Given :1; - unsigned HSMHV2_cjs_Given :1; - unsigned HSMHV2_cjsws_Given :1; - unsigned HSMHV2_cjswgs_Given :1; - unsigned HSMHV2_mjs_Given :1; - unsigned HSMHV2_mjsws_Given :1; - unsigned HSMHV2_mjswgs_Given :1; - unsigned HSMHV2_pbs_Given :1; - unsigned HSMHV2_pbsws_Given :1; - unsigned HSMHV2_pbswgs_Given :1; - unsigned HSMHV2_xti2s_Given :1; - unsigned HSMHV2_cisbs_Given :1; - unsigned HSMHV2_cvbs_Given :1; - unsigned HSMHV2_ctemps_Given :1; - unsigned HSMHV2_cisbks_Given :1; - unsigned HSMHV2_divxs_Given :1; - unsigned HSMHV2_vdiffjs_Given :1; - unsigned HSMHV2_shemax_Given :1; - unsigned HSMHV2_vgsmin_Given :1; - unsigned HSMHV2_gdsleak_Given :1; - unsigned HSMHV2_rdrbb_Given :1; - unsigned HSMHV2_rdrbbtmp_Given :1; - - - /* binning parameters */ - unsigned HSMHV2_lmin_Given :1; - unsigned HSMHV2_lmax_Given :1; - unsigned HSMHV2_wmin_Given :1; - unsigned HSMHV2_wmax_Given :1; - unsigned HSMHV2_lbinn_Given :1; - unsigned HSMHV2_wbinn_Given :1; - - /* Length dependence */ - unsigned HSMHV2_lvmax_Given :1; - unsigned HSMHV2_lbgtmp1_Given :1; - unsigned HSMHV2_lbgtmp2_Given :1; - unsigned HSMHV2_leg0_Given :1; - unsigned HSMHV2_lvfbover_Given :1; - unsigned HSMHV2_lnover_Given :1; - unsigned HSMHV2_lnovers_Given :1; - unsigned HSMHV2_lwl2_Given :1; - unsigned HSMHV2_lvfbc_Given :1; - unsigned HSMHV2_lnsubc_Given :1; - unsigned HSMHV2_lnsubp_Given :1; - unsigned HSMHV2_lscp1_Given :1; - unsigned HSMHV2_lscp2_Given :1; - unsigned HSMHV2_lscp3_Given :1; - unsigned HSMHV2_lsc1_Given :1; - unsigned HSMHV2_lsc2_Given :1; - unsigned HSMHV2_lsc3_Given :1; - unsigned HSMHV2_lpgd1_Given :1; - unsigned HSMHV2_lndep_Given :1; - unsigned HSMHV2_lninv_Given :1; - unsigned HSMHV2_lmuecb0_Given :1; - unsigned HSMHV2_lmuecb1_Given :1; - unsigned HSMHV2_lmueph1_Given :1; - unsigned HSMHV2_lvtmp_Given :1; - unsigned HSMHV2_lwvth0_Given :1; - unsigned HSMHV2_lmuesr1_Given :1; - unsigned HSMHV2_lmuetmp_Given :1; - unsigned HSMHV2_lsub1_Given :1; - unsigned HSMHV2_lsub2_Given :1; - unsigned HSMHV2_lsvds_Given :1; - unsigned HSMHV2_lsvbs_Given :1; - unsigned HSMHV2_lsvgs_Given :1; - unsigned HSMHV2_lfn1_Given :1; - unsigned HSMHV2_lfn2_Given :1; - unsigned HSMHV2_lfn3_Given :1; - unsigned HSMHV2_lfvbs_Given :1; - unsigned HSMHV2_lnsti_Given :1; - unsigned HSMHV2_lwsti_Given :1; - unsigned HSMHV2_lscsti1_Given :1; - unsigned HSMHV2_lscsti2_Given :1; - unsigned HSMHV2_lvthsti_Given :1; - unsigned HSMHV2_lmuesti1_Given :1; - unsigned HSMHV2_lmuesti2_Given :1; - unsigned HSMHV2_lmuesti3_Given :1; - unsigned HSMHV2_lnsubpsti1_Given :1; - unsigned HSMHV2_lnsubpsti2_Given :1; - unsigned HSMHV2_lnsubpsti3_Given :1; - unsigned HSMHV2_lcgso_Given :1; - unsigned HSMHV2_lcgdo_Given :1; - unsigned HSMHV2_ljs0_Given :1; - unsigned HSMHV2_ljs0sw_Given :1; - unsigned HSMHV2_lnj_Given :1; - unsigned HSMHV2_lcisbk_Given :1; - unsigned HSMHV2_lclm1_Given :1; - unsigned HSMHV2_lclm2_Given :1; - unsigned HSMHV2_lclm3_Given :1; - unsigned HSMHV2_lwfc_Given :1; - unsigned HSMHV2_lgidl1_Given :1; - unsigned HSMHV2_lgidl2_Given :1; - unsigned HSMHV2_lgleak1_Given :1; - unsigned HSMHV2_lgleak2_Given :1; - unsigned HSMHV2_lgleak3_Given :1; - unsigned HSMHV2_lgleak6_Given :1; - unsigned HSMHV2_lglksd1_Given :1; - unsigned HSMHV2_lglksd2_Given :1; - unsigned HSMHV2_lglkb1_Given :1; - unsigned HSMHV2_lglkb2_Given :1; - unsigned HSMHV2_lnftrp_Given :1; - unsigned HSMHV2_lnfalp_Given :1; - unsigned HSMHV2_lvdiffj_Given :1; - unsigned HSMHV2_libpc1_Given :1; - unsigned HSMHV2_libpc2_Given :1; - unsigned HSMHV2_lcgbo_Given :1; - unsigned HSMHV2_lcvdsover_Given :1; - unsigned HSMHV2_lfalph_Given :1; - unsigned HSMHV2_lnpext_Given :1; - unsigned HSMHV2_lpowrat_Given :1; - unsigned HSMHV2_lrd_Given :1; - unsigned HSMHV2_lrd22_Given :1; - unsigned HSMHV2_lrd23_Given :1; - unsigned HSMHV2_lrd24_Given :1; - unsigned HSMHV2_lrdict1_Given :1; - unsigned HSMHV2_lrdov13_Given :1; - unsigned HSMHV2_lrdslp1_Given :1; - unsigned HSMHV2_lrdvb_Given :1; - unsigned HSMHV2_lrdvd_Given :1; - unsigned HSMHV2_lrdvg11_Given :1; - unsigned HSMHV2_lrs_Given :1; - unsigned HSMHV2_lrth0_Given :1; - unsigned HSMHV2_lvover_Given :1; - unsigned HSMHV2_ljs0d_Given :1; - unsigned HSMHV2_ljs0swd_Given :1; - unsigned HSMHV2_lnjd_Given :1; - unsigned HSMHV2_lcisbkd_Given :1; - unsigned HSMHV2_lvdiffjd_Given :1; - unsigned HSMHV2_ljs0s_Given :1; - unsigned HSMHV2_ljs0sws_Given :1; - unsigned HSMHV2_lnjs_Given :1; - unsigned HSMHV2_lcisbks_Given :1; - unsigned HSMHV2_lvdiffjs_Given :1; - - /* Width dependence */ - unsigned HSMHV2_wvmax_Given :1; - unsigned HSMHV2_wbgtmp1_Given :1; - unsigned HSMHV2_wbgtmp2_Given :1; - unsigned HSMHV2_weg0_Given :1; - unsigned HSMHV2_wvfbover_Given :1; - unsigned HSMHV2_wnover_Given :1; - unsigned HSMHV2_wnovers_Given :1; - unsigned HSMHV2_wwl2_Given :1; - unsigned HSMHV2_wvfbc_Given :1; - unsigned HSMHV2_wnsubc_Given :1; - unsigned HSMHV2_wnsubp_Given :1; - unsigned HSMHV2_wscp1_Given :1; - unsigned HSMHV2_wscp2_Given :1; - unsigned HSMHV2_wscp3_Given :1; - unsigned HSMHV2_wsc1_Given :1; - unsigned HSMHV2_wsc2_Given :1; - unsigned HSMHV2_wsc3_Given :1; - unsigned HSMHV2_wpgd1_Given :1; - unsigned HSMHV2_wndep_Given :1; - unsigned HSMHV2_wninv_Given :1; - unsigned HSMHV2_wmuecb0_Given :1; - unsigned HSMHV2_wmuecb1_Given :1; - unsigned HSMHV2_wmueph1_Given :1; - unsigned HSMHV2_wvtmp_Given :1; - unsigned HSMHV2_wwvth0_Given :1; - unsigned HSMHV2_wmuesr1_Given :1; - unsigned HSMHV2_wmuetmp_Given :1; - unsigned HSMHV2_wsub1_Given :1; - unsigned HSMHV2_wsub2_Given :1; - unsigned HSMHV2_wsvds_Given :1; - unsigned HSMHV2_wsvbs_Given :1; - unsigned HSMHV2_wsvgs_Given :1; - unsigned HSMHV2_wfn1_Given :1; - unsigned HSMHV2_wfn2_Given :1; - unsigned HSMHV2_wfn3_Given :1; - unsigned HSMHV2_wfvbs_Given :1; - unsigned HSMHV2_wnsti_Given :1; - unsigned HSMHV2_wwsti_Given :1; - unsigned HSMHV2_wscsti1_Given :1; - unsigned HSMHV2_wscsti2_Given :1; - unsigned HSMHV2_wvthsti_Given :1; - unsigned HSMHV2_wmuesti1_Given :1; - unsigned HSMHV2_wmuesti2_Given :1; - unsigned HSMHV2_wmuesti3_Given :1; - unsigned HSMHV2_wnsubpsti1_Given :1; - unsigned HSMHV2_wnsubpsti2_Given :1; - unsigned HSMHV2_wnsubpsti3_Given :1; - unsigned HSMHV2_wcgso_Given :1; - unsigned HSMHV2_wcgdo_Given :1; - unsigned HSMHV2_wjs0_Given :1; - unsigned HSMHV2_wjs0sw_Given :1; - unsigned HSMHV2_wnj_Given :1; - unsigned HSMHV2_wcisbk_Given :1; - unsigned HSMHV2_wclm1_Given :1; - unsigned HSMHV2_wclm2_Given :1; - unsigned HSMHV2_wclm3_Given :1; - unsigned HSMHV2_wwfc_Given :1; - unsigned HSMHV2_wgidl1_Given :1; - unsigned HSMHV2_wgidl2_Given :1; - unsigned HSMHV2_wgleak1_Given :1; - unsigned HSMHV2_wgleak2_Given :1; - unsigned HSMHV2_wgleak3_Given :1; - unsigned HSMHV2_wgleak6_Given :1; - unsigned HSMHV2_wglksd1_Given :1; - unsigned HSMHV2_wglksd2_Given :1; - unsigned HSMHV2_wglkb1_Given :1; - unsigned HSMHV2_wglkb2_Given :1; - unsigned HSMHV2_wnftrp_Given :1; - unsigned HSMHV2_wnfalp_Given :1; - unsigned HSMHV2_wvdiffj_Given :1; - unsigned HSMHV2_wibpc1_Given :1; - unsigned HSMHV2_wibpc2_Given :1; - unsigned HSMHV2_wcgbo_Given :1; - unsigned HSMHV2_wcvdsover_Given :1; - unsigned HSMHV2_wfalph_Given :1; - unsigned HSMHV2_wnpext_Given :1; - unsigned HSMHV2_wpowrat_Given :1; - unsigned HSMHV2_wrd_Given :1; - unsigned HSMHV2_wrd22_Given :1; - unsigned HSMHV2_wrd23_Given :1; - unsigned HSMHV2_wrd24_Given :1; - unsigned HSMHV2_wrdict1_Given :1; - unsigned HSMHV2_wrdov13_Given :1; - unsigned HSMHV2_wrdslp1_Given :1; - unsigned HSMHV2_wrdvb_Given :1; - unsigned HSMHV2_wrdvd_Given :1; - unsigned HSMHV2_wrdvg11_Given :1; - unsigned HSMHV2_wrs_Given :1; - unsigned HSMHV2_wrth0_Given :1; - unsigned HSMHV2_wvover_Given :1; - unsigned HSMHV2_wjs0d_Given :1; - unsigned HSMHV2_wjs0swd_Given :1; - unsigned HSMHV2_wnjd_Given :1; - unsigned HSMHV2_wcisbkd_Given :1; - unsigned HSMHV2_wvdiffjd_Given :1; - unsigned HSMHV2_wjs0s_Given :1; - unsigned HSMHV2_wjs0sws_Given :1; - unsigned HSMHV2_wnjs_Given :1; - unsigned HSMHV2_wcisbks_Given :1; - unsigned HSMHV2_wvdiffjs_Given :1; - - /* Cross-term dependence */ - unsigned HSMHV2_pvmax_Given :1; - unsigned HSMHV2_pbgtmp1_Given :1; - unsigned HSMHV2_pbgtmp2_Given :1; - unsigned HSMHV2_peg0_Given :1; - unsigned HSMHV2_pvfbover_Given :1; - unsigned HSMHV2_pnover_Given :1; - unsigned HSMHV2_pnovers_Given :1; - unsigned HSMHV2_pwl2_Given :1; - unsigned HSMHV2_pvfbc_Given :1; - unsigned HSMHV2_pnsubc_Given :1; - unsigned HSMHV2_pnsubp_Given :1; - unsigned HSMHV2_pscp1_Given :1; - unsigned HSMHV2_pscp2_Given :1; - unsigned HSMHV2_pscp3_Given :1; - unsigned HSMHV2_psc1_Given :1; - unsigned HSMHV2_psc2_Given :1; - unsigned HSMHV2_psc3_Given :1; - unsigned HSMHV2_ppgd1_Given :1; - unsigned HSMHV2_pndep_Given :1; - unsigned HSMHV2_pninv_Given :1; - unsigned HSMHV2_pmuecb0_Given :1; - unsigned HSMHV2_pmuecb1_Given :1; - unsigned HSMHV2_pmueph1_Given :1; - unsigned HSMHV2_pvtmp_Given :1; - unsigned HSMHV2_pwvth0_Given :1; - unsigned HSMHV2_pmuesr1_Given :1; - unsigned HSMHV2_pmuetmp_Given :1; - unsigned HSMHV2_psub1_Given :1; - unsigned HSMHV2_psub2_Given :1; - unsigned HSMHV2_psvds_Given :1; - unsigned HSMHV2_psvbs_Given :1; - unsigned HSMHV2_psvgs_Given :1; - unsigned HSMHV2_pfn1_Given :1; - unsigned HSMHV2_pfn2_Given :1; - unsigned HSMHV2_pfn3_Given :1; - unsigned HSMHV2_pfvbs_Given :1; - unsigned HSMHV2_pnsti_Given :1; - unsigned HSMHV2_pwsti_Given :1; - unsigned HSMHV2_pscsti1_Given :1; - unsigned HSMHV2_pscsti2_Given :1; - unsigned HSMHV2_pvthsti_Given :1; - unsigned HSMHV2_pmuesti1_Given :1; - unsigned HSMHV2_pmuesti2_Given :1; - unsigned HSMHV2_pmuesti3_Given :1; - unsigned HSMHV2_pnsubpsti1_Given :1; - unsigned HSMHV2_pnsubpsti2_Given :1; - unsigned HSMHV2_pnsubpsti3_Given :1; - unsigned HSMHV2_pcgso_Given :1; - unsigned HSMHV2_pcgdo_Given :1; - unsigned HSMHV2_pjs0_Given :1; - unsigned HSMHV2_pjs0sw_Given :1; - unsigned HSMHV2_pnj_Given :1; - unsigned HSMHV2_pcisbk_Given :1; - unsigned HSMHV2_pclm1_Given :1; - unsigned HSMHV2_pclm2_Given :1; - unsigned HSMHV2_pclm3_Given :1; - unsigned HSMHV2_pwfc_Given :1; - unsigned HSMHV2_pgidl1_Given :1; - unsigned HSMHV2_pgidl2_Given :1; - unsigned HSMHV2_pgleak1_Given :1; - unsigned HSMHV2_pgleak2_Given :1; - unsigned HSMHV2_pgleak3_Given :1; - unsigned HSMHV2_pgleak6_Given :1; - unsigned HSMHV2_pglksd1_Given :1; - unsigned HSMHV2_pglksd2_Given :1; - unsigned HSMHV2_pglkb1_Given :1; - unsigned HSMHV2_pglkb2_Given :1; - unsigned HSMHV2_pnftrp_Given :1; - unsigned HSMHV2_pnfalp_Given :1; - unsigned HSMHV2_pvdiffj_Given :1; - unsigned HSMHV2_pibpc1_Given :1; - unsigned HSMHV2_pibpc2_Given :1; - unsigned HSMHV2_pcgbo_Given :1; - unsigned HSMHV2_pcvdsover_Given :1; - unsigned HSMHV2_pfalph_Given :1; - unsigned HSMHV2_pnpext_Given :1; - unsigned HSMHV2_ppowrat_Given :1; - unsigned HSMHV2_prd_Given :1; - unsigned HSMHV2_prd22_Given :1; - unsigned HSMHV2_prd23_Given :1; - unsigned HSMHV2_prd24_Given :1; - unsigned HSMHV2_prdict1_Given :1; - unsigned HSMHV2_prdov13_Given :1; - unsigned HSMHV2_prdslp1_Given :1; - unsigned HSMHV2_prdvb_Given :1; - unsigned HSMHV2_prdvd_Given :1; - unsigned HSMHV2_prdvg11_Given :1; - unsigned HSMHV2_prs_Given :1; - unsigned HSMHV2_prth0_Given :1; - unsigned HSMHV2_pvover_Given :1; - unsigned HSMHV2_pjs0d_Given :1; - unsigned HSMHV2_pjs0swd_Given :1; - unsigned HSMHV2_pnjd_Given :1; - unsigned HSMHV2_pcisbkd_Given :1; - unsigned HSMHV2_pvdiffjd_Given :1; - unsigned HSMHV2_pjs0s_Given :1; - unsigned HSMHV2_pjs0sws_Given :1; - unsigned HSMHV2_pnjs_Given :1; - unsigned HSMHV2_pcisbks_Given :1; - unsigned HSMHV2_pvdiffjs_Given :1; - - unsigned HSMHV2vgsMaxGiven :1; - unsigned HSMHV2vgdMaxGiven :1; - unsigned HSMHV2vgbMaxGiven :1; - unsigned HSMHV2vdsMaxGiven :1; - unsigned HSMHV2vbsMaxGiven :1; - unsigned HSMHV2vbdMaxGiven :1; - unsigned HSMHV2vgsrMaxGiven :1; - unsigned HSMHV2vgdrMaxGiven :1; - unsigned HSMHV2vgbrMaxGiven :1; - unsigned HSMHV2vbsrMaxGiven :1; - unsigned HSMHV2vbdrMaxGiven :1; - -} HSMHV2model; - -#ifndef NMOS -#define NMOS 1 -#define PMOS -1 -#endif /*NMOS*/ - -#define HSMHV2_BAD_PARAM -1 - -/* flags */ -#define HSMHV2_MOD_NMOS 1 -#define HSMHV2_MOD_PMOS 2 -#define HSMHV2_MOD_LEVEL 3 -#define HSMHV2_MOD_INFO 4 -#define HSMHV2_MOD_NOISE 5 -#define HSMHV2_MOD_VERSION 6 -#define HSMHV2_MOD_SHOW 7 -#define HSMHV2_MOD_CORSRD 11 -#define HSMHV2_MOD_COIPRV 12 -#define HSMHV2_MOD_COPPRV 13 -#define HSMHV2_MOD_COADOV 17 -#define HSMHV2_MOD_COISUB 21 -#define HSMHV2_MOD_COIIGS 22 -#define HSMHV2_MOD_COGIDL 23 -#define HSMHV2_MOD_COOVLP 24 -#define HSMHV2_MOD_COOVLPS 8 -#define HSMHV2_MOD_COFLICK 25 -#define HSMHV2_MOD_COISTI 26 -#define HSMHV2_MOD_CONQS 29 -#define HSMHV2_MOD_COTHRML 30 -#define HSMHV2_MOD_COIGN 31 /* Induced gate noise */ -#define HSMHV2_MOD_CORG 32 -#define HSMHV2_MOD_CORBNET 33 -#define HSMHV2_MOD_CODFM 36 /* DFM */ -#define HSMHV2_MOD_COQOVSM 34 -#define HSMHV2_MOD_COSELFHEAT 35 /* Self-heating model--SHE-- */ -#define HSMHV2_MOD_COSUBNODE 48 -#define HSMHV2_MOD_COSYM 37 /* Symmery model for HV */ -#define HSMHV2_MOD_COTEMP 38 -#define HSMHV2_MOD_COLDRIFT 39 -#define HSMHV2_MOD_CORDRIFT 40 -#define HSMHV2_MOD_COERRREP 44 -#define HSMHV2_MOD_CODEP 45 -#define HSMHV2_MOD_CODDLT 46 -/* device parameters */ -#define HSMHV2_COSELFHEAT 49 -#define HSMHV2_COSUBNODE 50 -#define HSMHV2_L 51 -#define HSMHV2_W 52 -#define HSMHV2_AD 53 -#define HSMHV2_AS 54 -#define HSMHV2_PD 55 -#define HSMHV2_PS 56 -#define HSMHV2_NRD 57 -#define HSMHV2_NRS 58 -/* #define HSMHV2_TEMP 59 not used */ -#define HSMHV2_DTEMP 60 -#define HSMHV2_OFF 61 -#define HSMHV2_IC_VBS 62 -#define HSMHV2_IC_VDS 63 -#define HSMHV2_IC_VGS 64 -#define HSMHV2_IC 65 -#define HSMHV2_CORBNET 66 -#define HSMHV2_RBPB 67 -#define HSMHV2_RBPD 68 -#define HSMHV2_RBPS 69 -#define HSMHV2_RBDB 70 -#define HSMHV2_RBSB 71 -#define HSMHV2_CORG 72 -/* #define HSMHV2_RSHG 73 */ -#define HSMHV2_NGCON 74 -#define HSMHV2_XGW 75 -#define HSMHV2_XGL 76 -#define HSMHV2_NF 77 -#define HSMHV2_SA 78 -#define HSMHV2_SB 79 -#define HSMHV2_SD 80 -#define HSMHV2_NSUBCDFM 82 -#define HSMHV2_M 83 -#define HSMHV2_SUBLD1 86 -#define HSMHV2_SUBLD2 87 -#define HSMHV2_LOVER 41 -#define HSMHV2_LOVERS 42 -#define HSMHV2_LOVERLD 43 -#define HSMHV2_LDRIFT1 88 -#define HSMHV2_LDRIFT2 89 -#define HSMHV2_LDRIFT1S 90 -#define HSMHV2_LDRIFT2S 91 -/* #define HSMHV2_RTH0 84 not used */ -/* #define HSMHV2_CTH0 85 not used */ - - - - -/* model parameters */ -#define HSMHV2_MOD_VBSMIN 198 -#define HSMHV2_MOD_VMAX 500 -#define HSMHV2_MOD_VMAXT1 503 -#define HSMHV2_MOD_VMAXT2 504 -#define HSMHV2_MOD_BGTMP1 101 -#define HSMHV2_MOD_BGTMP2 102 -#define HSMHV2_MOD_EG0 103 -#define HSMHV2_MOD_TOX 104 -#define HSMHV2_MOD_XLD 105 -#define HSMHV2_MOD_LOVER 106 -#define HSMHV2_MOD_LOVERS 385 -#define HSMHV2_MOD_RDOV11 313 -#define HSMHV2_MOD_RDOV12 314 -#define HSMHV2_MOD_RDOV13 476 -#define HSMHV2_MOD_RDSLP1 315 -#define HSMHV2_MOD_RDICT1 316 -#define HSMHV2_MOD_RDSLP2 317 -#define HSMHV2_MOD_RDICT2 318 -#define HSMHV2_MOD_LOVERLD 436 -#define HSMHV2_MOD_LDRIFT1 319 -#define HSMHV2_MOD_LDRIFT2 320 -#define HSMHV2_MOD_LDRIFT1S 324 -#define HSMHV2_MOD_LDRIFT2S 325 -#define HSMHV2_MOD_SUBLD1 321 -#define HSMHV2_MOD_SUBLD1L 329 -#define HSMHV2_MOD_SUBLD1LP 330 -#define HSMHV2_MOD_SUBLD2 322 -#define HSMHV2_MOD_XPDV 326 -#define HSMHV2_MOD_XPVDTH 327 -#define HSMHV2_MOD_XPVDTHG 328 -#define HSMHV2_MOD_DDLTMAX 421 /* Vdseff */ -#define HSMHV2_MOD_DDLTSLP 422 /* Vdseff */ -#define HSMHV2_MOD_DDLTICT 423 /* Vdseff */ -#define HSMHV2_MOD_VFBOVER 428 -#define HSMHV2_MOD_NOVER 430 -#define HSMHV2_MOD_NOVERS 431 -#define HSMHV2_MOD_XWD 107 -#define HSMHV2_MOD_XWDC 513 -#define HSMHV2_MOD_XL 112 -#define HSMHV2_MOD_XW 117 -#define HSMHV2_MOD_SAREF 433 -#define HSMHV2_MOD_SBREF 434 -#define HSMHV2_MOD_LL 108 -#define HSMHV2_MOD_LLD 109 -#define HSMHV2_MOD_LLN 110 -#define HSMHV2_MOD_WL 111 -#define HSMHV2_MOD_WL1 113 -#define HSMHV2_MOD_WL1P 114 -#define HSMHV2_MOD_WL2 407 -#define HSMHV2_MOD_WL2P 408 -#define HSMHV2_MOD_WLD 115 -#define HSMHV2_MOD_WLN 116 - -#define HSMHV2_MOD_XQY 178 -#define HSMHV2_MOD_XQY1 118 -#define HSMHV2_MOD_XQY2 120 -#define HSMHV2_MOD_RSH 119 - -#define HSMHV2_MOD_RSHG 384 -/* #define HSMHV2_MOD_NGCON 385 */ -/* #define HSMHV2_MOD_XGW 386 */ -/* #define HSMHV2_MOD_XGL 387 */ -/* #define HSMHV2_MOD_NF 388 */ -#define HSMHV2_MOD_RS 398 -#define HSMHV2_MOD_RD 399 - -#define HSMHV2_MOD_VFBC 121 -#define HSMHV2_MOD_VBI 122 -#define HSMHV2_MOD_NSUBC 123 -#define HSMHV2_MOD_TNOM 124 -#define HSMHV2_MOD_PARL2 125 -#define HSMHV2_MOD_SC1 126 -#define HSMHV2_MOD_SC2 127 -#define HSMHV2_MOD_SC3 128 -#define HSMHV2_MOD_SC4 248 -#define HSMHV2_MOD_NDEP 129 -#define HSMHV2_MOD_NDEPL 419 -#define HSMHV2_MOD_NDEPLP 420 -#define HSMHV2_MOD_NINV 130 -#define HSMHV2_MOD_NINVD 505 -#define HSMHV2_MOD_NINVDW 506 -#define HSMHV2_MOD_NINVDWP 507 -#define HSMHV2_MOD_NINVDT1 508 -#define HSMHV2_MOD_NINVDT2 509 -#define HSMHV2_MOD_MUECB0 131 -#define HSMHV2_MOD_MUECB1 132 -#define HSMHV2_MOD_MUEPH1 133 -#define HSMHV2_MOD_MUEPH0 134 -#define HSMHV2_MOD_MUEPHW 135 -#define HSMHV2_MOD_MUEPWP 136 -#define HSMHV2_MOD_MUEPHL 137 -#define HSMHV2_MOD_MUEPLP 138 -#define HSMHV2_MOD_MUEPHS 139 -#define HSMHV2_MOD_MUEPSP 140 -#define HSMHV2_MOD_VTMP 141 -#define HSMHV2_MOD_WVTH0 142 -#define HSMHV2_MOD_MUESR1 143 -#define HSMHV2_MOD_MUESR0 144 -#define HSMHV2_MOD_MUESRL 145 -#define HSMHV2_MOD_MUESLP 146 -#define HSMHV2_MOD_MUESRW 147 -#define HSMHV2_MOD_MUESWP 148 -#define HSMHV2_MOD_BB 149 - -#define HSMHV2_MOD_SUB1 151 -#define HSMHV2_MOD_SUB2 152 -#define HSMHV2_MOD_CGSO 154 -#define HSMHV2_MOD_CGDO 155 -#define HSMHV2_MOD_CGBO 156 -#define HSMHV2_MOD_JS0 157 -#define HSMHV2_MOD_JS0SW 158 -#define HSMHV2_MOD_NJ 159 -#define HSMHV2_MOD_NJSW 160 -#define HSMHV2_MOD_XTI 161 -#define HSMHV2_MOD_CJ 162 -#define HSMHV2_MOD_CJSW 163 -#define HSMHV2_MOD_CJSWG 164 -#define HSMHV2_MOD_MJ 165 -#define HSMHV2_MOD_MJSW 166 -#define HSMHV2_MOD_MJSWG 167 -#define HSMHV2_MOD_XTI2 168 -#define HSMHV2_MOD_CISB 169 -#define HSMHV2_MOD_CVB 170 -#define HSMHV2_MOD_CTEMP 171 -#define HSMHV2_MOD_CISBK 172 -#define HSMHV2_MOD_CVBK 173 -#define HSMHV2_MOD_DIVX 174 -#define HSMHV2_MOD_PB 175 -#define HSMHV2_MOD_PBSW 176 -#define HSMHV2_MOD_PBSWG 177 -#define HSMHV2_MOD_TPOLY 179 -/* #define HSMHV2_MOD_TPOLYLD not used */ -#define HSMHV2_MOD_LP 180 -#define HSMHV2_MOD_NSUBP 181 -#define HSMHV2_MOD_NSUBP0 182 -#define HSMHV2_MOD_NSUBWP 183 -#define HSMHV2_MOD_NDEPM 600 -#define HSMHV2_MOD_TNDEP 601 -#define HSMHV2_MOD_DEPMUE0 605 -#define HSMHV2_MOD_DEPMUE1 606 -#define HSMHV2_MOD_DEPMUEBACK0 607 -#define HSMHV2_MOD_DEPMUEBACK1 608 -#define HSMHV2_MOD_DEPVMAX 609 -#define HSMHV2_MOD_DEPBB 610 -#define HSMHV2_MOD_DEPVDSEF1 611 -#define HSMHV2_MOD_DEPVDSEF2 612 -#define HSMHV2_MOD_DEPMUEPH0 613 -#define HSMHV2_MOD_DEPMUEPH1 614 -#define HSMHV2_MOD_DEPLEAK 615 -#define HSMHV2_MOD_DEPETA 616 -#define HSMHV2_MOD_DEPVTMP 617 -#define HSMHV2_MOD_DEPMUETMP 618 -#define HSMHV2_MOD_ISBREAK 619 -#define HSMHV2_MOD_RWELL 620 -#define HSMHV2_MOD_SCP1 184 -#define HSMHV2_MOD_SCP2 185 -#define HSMHV2_MOD_SCP3 186 -#define HSMHV2_MOD_PGD1 187 -#define HSMHV2_MOD_PGD2 188 -//#define HSMHV2_MOD_PGD3 -#define HSMHV2_MOD_PGD4 190 -#define HSMHV2_MOD_CLM1 191 -#define HSMHV2_MOD_CLM2 192 -#define HSMHV2_MOD_CLM3 193 -#define HSMHV2_MOD_CLM5 402 -#define HSMHV2_MOD_CLM6 403 -#define HSMHV2_MOD_MUETMP 195 - -#define HSMHV2_MOD_VOVER 199 -#define HSMHV2_MOD_VOVERP 200 -#define HSMHV2_MOD_WFC 201 -#define HSMHV2_MOD_NSUBCW 249 -#define HSMHV2_MOD_NSUBCWP 250 -#define HSMHV2_MOD_QME1 202 -#define HSMHV2_MOD_QME2 203 -#define HSMHV2_MOD_QME3 204 -#define HSMHV2_MOD_GIDL1 205 -#define HSMHV2_MOD_GIDL2 206 -#define HSMHV2_MOD_GIDL3 207 -#define HSMHV2_MOD_GLEAK1 208 -#define HSMHV2_MOD_GLEAK2 209 -#define HSMHV2_MOD_GLEAK3 210 -#define HSMHV2_MOD_GLEAK4 211 -#define HSMHV2_MOD_GLEAK5 212 -#define HSMHV2_MOD_GLEAK6 213 -#define HSMHV2_MOD_GLEAK7 214 -#define HSMHV2_MOD_GLPART1 406 -#define HSMHV2_MOD_GLKSD1 215 -#define HSMHV2_MOD_GLKSD2 216 -#define HSMHV2_MOD_GLKSD3 217 -#define HSMHV2_MOD_GLKB1 218 -#define HSMHV2_MOD_GLKB2 219 -#define HSMHV2_MOD_GLKB3 429 -#define HSMHV2_MOD_EGIG 220 -#define HSMHV2_MOD_IGTEMP2 221 -#define HSMHV2_MOD_IGTEMP3 222 -#define HSMHV2_MOD_VZADD0 223 -#define HSMHV2_MOD_PZADD0 224 -#define HSMHV2_MOD_NSTI 225 -#define HSMHV2_MOD_WSTI 226 -#define HSMHV2_MOD_WSTIL 227 -#define HSMHV2_MOD_WSTILP 231 -#define HSMHV2_MOD_WSTIW 234 -#define HSMHV2_MOD_WSTIWP 228 -#define HSMHV2_MOD_SCSTI1 229 -#define HSMHV2_MOD_SCSTI2 230 -#define HSMHV2_MOD_VTHSTI 232 -#define HSMHV2_MOD_VDSTI 233 -#define HSMHV2_MOD_MUESTI1 235 -#define HSMHV2_MOD_MUESTI2 236 -#define HSMHV2_MOD_MUESTI3 237 -#define HSMHV2_MOD_NSUBPSTI1 238 -#define HSMHV2_MOD_NSUBPSTI2 239 -#define HSMHV2_MOD_NSUBPSTI3 240 -#define HSMHV2_MOD_LPEXT 241 -#define HSMHV2_MOD_NPEXT 242 -#define HSMHV2_MOD_SCP22 243 -#define HSMHV2_MOD_SCP21 244 -#define HSMHV2_MOD_BS1 245 -#define HSMHV2_MOD_BS2 246 -#define HSMHV2_MOD_KAPPA 251 -//#define HSMHV2_MOD_PTHROU 253 -#define HSMHV2_MOD_VDIFFJ 254 -#define HSMHV2_MOD_DLY1 255 -#define HSMHV2_MOD_DLY2 256 -#define HSMHV2_MOD_DLY3 257 -#define HSMHV2_MOD_NFTRP 258 -#define HSMHV2_MOD_NFALP 259 -#define HSMHV2_MOD_CIT 260 -#define HSMHV2_MOD_FALPH 263 -#define HSMHV2_MOD_OVSLP 261 -#define HSMHV2_MOD_OVMAG 262 -#define HSMHV2_MOD_GIDL4 281 -#define HSMHV2_MOD_GIDL5 282 -#define HSMHV2_MOD_SVGS 283 -#define HSMHV2_MOD_SVBS 284 -#define HSMHV2_MOD_SVBSL 285 -#define HSMHV2_MOD_SVDS 286 -#define HSMHV2_MOD_SLG 287 -#define HSMHV2_MOD_SUB1L 290 -#define HSMHV2_MOD_SUB2L 292 -#define HSMHV2_MOD_FN1 294 -#define HSMHV2_MOD_FN2 295 -#define HSMHV2_MOD_FN3 296 -#define HSMHV2_MOD_FVBS 297 -#define HSMHV2_MOD_VOVERS 303 -#define HSMHV2_MOD_VOVERSP 304 -#define HSMHV2_MOD_SVGSL 305 -#define HSMHV2_MOD_SVGSLP 306 -#define HSMHV2_MOD_SVGSWP 307 -#define HSMHV2_MOD_SVGSW 308 -#define HSMHV2_MOD_SVBSLP 309 -#define HSMHV2_MOD_SLGL 310 -#define HSMHV2_MOD_SLGLP 311 -#define HSMHV2_MOD_SUB1LP 312 -#define HSMHV2_MOD_IBPC1 404 -#define HSMHV2_MOD_IBPC1L 331 -#define HSMHV2_MOD_IBPC1LP 332 -#define HSMHV2_MOD_IBPC2 405 -#define HSMHV2_MOD_MPHDFM 409 - -#define HSMHV2_MOD_PTL 530 -#define HSMHV2_MOD_PTP 531 -#define HSMHV2_MOD_PT2 532 -#define HSMHV2_MOD_PTLP 533 -#define HSMHV2_MOD_GDL 534 -#define HSMHV2_MOD_GDLP 535 - -#define HSMHV2_MOD_GDLD 536 -#define HSMHV2_MOD_PT4 537 -#define HSMHV2_MOD_PT4P 538 -#define HSMHV2_MOD_RDVG11 424 -#define HSMHV2_MOD_RDVG12 425 -#define HSMHV2_MOD_RTH0 432 -#define HSMHV2_MOD_CTH0 462 -#define HSMHV2_MOD_POWRAT 463 -/* #define HSMHV2_MOD_WTH0 463 /\*---------SHE----------*\/ */ -#define HSMHV2_MOD_DLYOV 437 -#define HSMHV2_MOD_QDFTVD 438 -#define HSMHV2_MOD_XLDLD 439 -#define HSMHV2_MOD_XWDLD 494 -#define HSMHV2_MOD_RDVD 510 -#define HSMHV2_MOD_RDVB 301 - -#define HSMHV2_MOD_RDVSUB 481 /* substrate effect */ -#define HSMHV2_MOD_RDVDSUB 482 /* substrate effect */ -#define HSMHV2_MOD_DDRIFT 483 /* substrate effect */ -#define HSMHV2_MOD_VBISUB 484 /* substrate effect */ -#define HSMHV2_MOD_NSUBSUB 485 /* substrate effect */ - -//#define HSMHV2_MOD_QOVSM 323 -//#define HSMHV2_MOD_LDRIFT 458 -#define HSMHV2_MOD_RD20 447 -#define HSMHV2_MOD_RD21 441 -#define HSMHV2_MOD_RD22 442 -#define HSMHV2_MOD_RD22D 478 -#define HSMHV2_MOD_RD23 443 -#define HSMHV2_MOD_RD24 444 -#define HSMHV2_MOD_RD25 445 -#define HSMHV2_MOD_RDVDL 448 -#define HSMHV2_MOD_RDVDLP 449 -#define HSMHV2_MOD_RDVDS 450 -#define HSMHV2_MOD_RDVDSP 451 -#define HSMHV2_MOD_RD23L 452 -#define HSMHV2_MOD_RD23LP 453 -#define HSMHV2_MOD_RD23S 454 -#define HSMHV2_MOD_RD23SP 455 -#define HSMHV2_MOD_RDS 456 -#define HSMHV2_MOD_RDSP 457 -#define HSMHV2_MOD_RDTEMP1 461 -#define HSMHV2_MOD_RDTEMP2 464 -#define HSMHV2_MOD_RTH0R 470 -#define HSMHV2_MOD_RDVDTEMP1 471 -#define HSMHV2_MOD_RDVDTEMP2 472 -#define HSMHV2_MOD_RTH0W 473 -#define HSMHV2_MOD_RTH0WP 474 -#define HSMHV2_MOD_RTH0NF 475 - -#define HSMHV2_MOD_RTHTEMP1 490 -#define HSMHV2_MOD_RTHTEMP2 491 -#define HSMHV2_MOD_PRATTEMP1 492 -#define HSMHV2_MOD_PRATTEMP2 493 - - -#define HSMHV2_MOD_CVDSOVER 480 - -#define HSMHV2_MOD_RDRMUE 520 -#define HSMHV2_MOD_RDRVMAX 521 -#define HSMHV2_MOD_RDRMUETMP 522 -#define HSMHV2_MOD_M0LEAK 524 -#define HSMHV2_MOD_M0LEAKTMP 525 -#define HSMHV2_MOD_LEAKVMAX 543 -#define HSMHV2_MOD_M0TEMP1 551 -#define HSMHV2_MOD_M0TEMP2 553 - -#define HSMHV2_MOD_RDRVTMP 523 -#define HSMHV2_MOD_RDRDJUNC 527 -#define HSMHV2_MOD_RDRCX 528 -#define HSMHV2_MOD_RDRCAR 529 -#define HSMHV2_MOD_RDRDL1 540 -#define HSMHV2_MOD_RDRDL2 541 -#define HSMHV2_MOD_RDRVMAXW 544 -#define HSMHV2_MOD_RDRVMAXWP 545 -#define HSMHV2_MOD_RDRVMAXL 546 -#define HSMHV2_MOD_RDRVMAXLP 547 -#define HSMHV2_MOD_RDRMUEL 548 -#define HSMHV2_MOD_RDRMUELP 549 -#define HSMHV2_MOD_RDRQOVER 552 -#define HSMHV2_MOD_QOVADD 338 -#define HSMHV2_MOD_JS0D 100 -#define HSMHV2_MOD_JS0SWD 150 -#define HSMHV2_MOD_NJD 153 -#define HSMHV2_MOD_NJSWD 189 -#define HSMHV2_MOD_XTID 194 -#define HSMHV2_MOD_CJD 196 -#define HSMHV2_MOD_CJSWD 197 -#define HSMHV2_MOD_CJSWGD 247 -#define HSMHV2_MOD_MJD 252 -#define HSMHV2_MOD_MJSWD 253 -#define HSMHV2_MOD_MJSWGD 264 -#define HSMHV2_MOD_PBD 265 -#define HSMHV2_MOD_PBSWD 266 -#define HSMHV2_MOD_PBSWDG 267 -#define HSMHV2_MOD_XTI2D 268 -#define HSMHV2_MOD_CISBD 269 -#define HSMHV2_MOD_CVBD 270 -#define HSMHV2_MOD_CTEMPD 271 -#define HSMHV2_MOD_CISBKD 272 -#define HSMHV2_MOD_DIVXD 274 -#define HSMHV2_MOD_VDIFFJD 275 -#define HSMHV2_MOD_JS0S 276 -#define HSMHV2_MOD_JS0SWS 277 -#define HSMHV2_MOD_NJS 278 -#define HSMHV2_MOD_NJSWS 279 -#define HSMHV2_MOD_XTIS 280 -#define HSMHV2_MOD_CJS 288 -#define HSMHV2_MOD_CJSSW 289 -#define HSMHV2_MOD_CJSWGS 291 -#define HSMHV2_MOD_MJS 293 -#define HSMHV2_MOD_MJSWS 298 -#define HSMHV2_MOD_MJSWGS 299 -#define HSMHV2_MOD_PBS 300 -#define HSMHV2_MOD_PBSWS 302 -#define HSMHV2_MOD_PBSWSG 323 -#define HSMHV2_MOD_XTI2S 333 -#define HSMHV2_MOD_CISBS 334 -#define HSMHV2_MOD_CVBS 335 -#define HSMHV2_MOD_CTEMPS 336 -#define HSMHV2_MOD_CISBKS 337 -#define HSMHV2_MOD_DIVXS 339 -#define HSMHV2_MOD_VDIFFJS 340 -#define HSMHV2_MOD_SHEMAX 501 -#define HSMHV2_MOD_VGSMIN 502 -#define HSMHV2_MOD_GDSLEAK 511 -#define HSMHV2_MOD_RDRBB 273 -#define HSMHV2_MOD_RDRBBTMP 602 - -/* binning parameters */ -#define HSMHV2_MOD_LMIN 1000 -#define HSMHV2_MOD_LMAX 1001 -#define HSMHV2_MOD_WMIN 1002 -#define HSMHV2_MOD_WMAX 1003 -#define HSMHV2_MOD_LBINN 1004 -#define HSMHV2_MOD_WBINN 1005 - -/* Length dependence */ -#define HSMHV2_MOD_LVMAX 1100 -#define HSMHV2_MOD_LBGTMP1 1101 -#define HSMHV2_MOD_LBGTMP2 1102 -#define HSMHV2_MOD_LEG0 1103 -#define HSMHV2_MOD_LVFBOVER 1428 -#define HSMHV2_MOD_LNOVER 1430 -#define HSMHV2_MOD_LNOVERS 1431 -#define HSMHV2_MOD_LWL2 1407 -#define HSMHV2_MOD_LVFBC 1121 -#define HSMHV2_MOD_LNSUBC 1123 -#define HSMHV2_MOD_LNSUBP 1181 -#define HSMHV2_MOD_LSCP1 1184 -#define HSMHV2_MOD_LSCP2 1185 -#define HSMHV2_MOD_LSCP3 1186 -#define HSMHV2_MOD_LSC1 1126 -#define HSMHV2_MOD_LSC2 1127 -#define HSMHV2_MOD_LSC3 1128 -#define HSMHV2_MOD_LPGD1 1187 -//#define HSMHV2_MOD_LPGD3 1189 -#define HSMHV2_MOD_LNDEP 1129 -#define HSMHV2_MOD_LNINV 1130 -#define HSMHV2_MOD_LMUECB0 1131 -#define HSMHV2_MOD_LMUECB1 1132 -#define HSMHV2_MOD_LMUEPH1 1133 -#define HSMHV2_MOD_LVTMP 1141 -#define HSMHV2_MOD_LWVTH0 1142 -#define HSMHV2_MOD_LMUESR1 1143 -#define HSMHV2_MOD_LMUETMP 1195 -#define HSMHV2_MOD_LSUB1 1151 -#define HSMHV2_MOD_LSUB2 1152 -#define HSMHV2_MOD_LSVDS 1286 -#define HSMHV2_MOD_LSVBS 1284 -#define HSMHV2_MOD_LSVGS 1283 -#define HSMHV2_MOD_LFN1 1294 -#define HSMHV2_MOD_LFN2 1295 -#define HSMHV2_MOD_LFN3 1296 -#define HSMHV2_MOD_LFVBS 1297 -#define HSMHV2_MOD_LNSTI 1225 -#define HSMHV2_MOD_LWSTI 1226 -#define HSMHV2_MOD_LSCSTI1 1229 -#define HSMHV2_MOD_LSCSTI2 1230 -#define HSMHV2_MOD_LVTHSTI 1232 -#define HSMHV2_MOD_LMUESTI1 1235 -#define HSMHV2_MOD_LMUESTI2 1236 -#define HSMHV2_MOD_LMUESTI3 1237 -#define HSMHV2_MOD_LNSUBPSTI1 1238 -#define HSMHV2_MOD_LNSUBPSTI2 1239 -#define HSMHV2_MOD_LNSUBPSTI3 1240 -#define HSMHV2_MOD_LCGSO 1154 -#define HSMHV2_MOD_LCGDO 1155 -#define HSMHV2_MOD_LJS0 1157 -#define HSMHV2_MOD_LJS0SW 1158 -#define HSMHV2_MOD_LNJ 1159 -#define HSMHV2_MOD_LCISBK 1172 -#define HSMHV2_MOD_LCLM1 1191 -#define HSMHV2_MOD_LCLM2 1192 -#define HSMHV2_MOD_LCLM3 1193 -#define HSMHV2_MOD_LWFC 1201 -#define HSMHV2_MOD_LGIDL1 1205 -#define HSMHV2_MOD_LGIDL2 1206 -#define HSMHV2_MOD_LGLEAK1 1208 -#define HSMHV2_MOD_LGLEAK2 1209 -#define HSMHV2_MOD_LGLEAK3 1210 -#define HSMHV2_MOD_LGLEAK6 1213 -#define HSMHV2_MOD_LGLKSD1 1215 -#define HSMHV2_MOD_LGLKSD2 1216 -#define HSMHV2_MOD_LGLKB1 1218 -#define HSMHV2_MOD_LGLKB2 1219 -#define HSMHV2_MOD_LNFTRP 1258 -#define HSMHV2_MOD_LNFALP 1259 -//#define HSMHV2_MOD_LPTHROU 1253 -#define HSMHV2_MOD_LVDIFFJ 1254 -#define HSMHV2_MOD_LIBPC1 1404 -#define HSMHV2_MOD_LIBPC2 1405 -#define HSMHV2_MOD_LCGBO 1156 -#define HSMHV2_MOD_LCVDSOVER 1480 -#define HSMHV2_MOD_LFALPH 1263 -#define HSMHV2_MOD_LNPEXT 1242 -#define HSMHV2_MOD_LPOWRAT 1463 -#define HSMHV2_MOD_LRD 1399 -#define HSMHV2_MOD_LRD22 1442 -#define HSMHV2_MOD_LRD23 1443 -#define HSMHV2_MOD_LRD24 1444 -#define HSMHV2_MOD_LRDICT1 1316 -#define HSMHV2_MOD_LRDOV13 1476 -#define HSMHV2_MOD_LRDSLP1 1315 -#define HSMHV2_MOD_LRDVB 1301 -#define HSMHV2_MOD_LRDVD 1510 -#define HSMHV2_MOD_LRDVG11 1424 -#define HSMHV2_MOD_LRS 1398 -#define HSMHV2_MOD_LRTH0 1432 -#define HSMHV2_MOD_LVOVER 1199 -#define HSMHV2_MOD_LJS0D 345 -#define HSMHV2_MOD_LJS0SWD 370 -#define HSMHV2_MOD_LNJD 372 -#define HSMHV2_MOD_LCISBKD 386 -#define HSMHV2_MOD_LVDIFFJD 387 -#define HSMHV2_MOD_LJS0S 388 -#define HSMHV2_MOD_LJS0SWS 395 -#define HSMHV2_MOD_LNJS 396 -#define HSMHV2_MOD_LCISBKS 397 -#define HSMHV2_MOD_LVDIFFJS 400 - -/* Width dependence */ -#define HSMHV2_MOD_WVMAX 2100 -#define HSMHV2_MOD_WBGTMP1 2101 -#define HSMHV2_MOD_WBGTMP2 2102 -#define HSMHV2_MOD_WEG0 2103 -#define HSMHV2_MOD_WVFBOVER 2428 -#define HSMHV2_MOD_WNOVER 2430 -#define HSMHV2_MOD_WNOVERS 2431 -#define HSMHV2_MOD_WWL2 2407 -#define HSMHV2_MOD_WVFBC 2121 -#define HSMHV2_MOD_WNSUBC 2123 -#define HSMHV2_MOD_WNSUBP 2181 -#define HSMHV2_MOD_WSCP1 2184 -#define HSMHV2_MOD_WSCP2 2185 -#define HSMHV2_MOD_WSCP3 2186 -#define HSMHV2_MOD_WSC1 2126 -#define HSMHV2_MOD_WSC2 2127 -#define HSMHV2_MOD_WSC3 2128 -#define HSMHV2_MOD_WPGD1 2187 -//#define HSMHV2_MOD_WPGD3 2189 -#define HSMHV2_MOD_WNDEP 2129 -#define HSMHV2_MOD_WNINV 2130 -#define HSMHV2_MOD_WMUECB0 2131 -#define HSMHV2_MOD_WMUECB1 2132 -#define HSMHV2_MOD_WMUEPH1 2133 -#define HSMHV2_MOD_WVTMP 2141 -#define HSMHV2_MOD_WWVTH0 2142 -#define HSMHV2_MOD_WMUESR1 2143 -#define HSMHV2_MOD_WMUETMP 2195 -#define HSMHV2_MOD_WSUB1 2151 -#define HSMHV2_MOD_WSUB2 2152 -#define HSMHV2_MOD_WSVDS 2286 -#define HSMHV2_MOD_WSVBS 2284 -#define HSMHV2_MOD_WSVGS 2283 -#define HSMHV2_MOD_WFN1 2294 -#define HSMHV2_MOD_WFN2 2295 -#define HSMHV2_MOD_WFN3 2296 -#define HSMHV2_MOD_WFVBS 2297 -#define HSMHV2_MOD_WNSTI 2225 -#define HSMHV2_MOD_WWSTI 2226 -#define HSMHV2_MOD_WSCSTI1 2229 -#define HSMHV2_MOD_WSCSTI2 2230 -#define HSMHV2_MOD_WVTHSTI 2232 -#define HSMHV2_MOD_WMUESTI1 2235 -#define HSMHV2_MOD_WMUESTI2 2236 -#define HSMHV2_MOD_WMUESTI3 2237 -#define HSMHV2_MOD_WNSUBPSTI1 2238 -#define HSMHV2_MOD_WNSUBPSTI2 2239 -#define HSMHV2_MOD_WNSUBPSTI3 2240 -#define HSMHV2_MOD_WCGSO 2154 -#define HSMHV2_MOD_WCGDO 2155 -#define HSMHV2_MOD_WJS0 2157 -#define HSMHV2_MOD_WJS0SW 2158 -#define HSMHV2_MOD_WNJ 2159 -#define HSMHV2_MOD_WCISBK 2172 -#define HSMHV2_MOD_WCLM1 2191 -#define HSMHV2_MOD_WCLM2 2192 -#define HSMHV2_MOD_WCLM3 2193 -#define HSMHV2_MOD_WWFC 2201 -#define HSMHV2_MOD_WGIDL1 2205 -#define HSMHV2_MOD_WGIDL2 2206 -#define HSMHV2_MOD_WGLEAK1 2208 -#define HSMHV2_MOD_WGLEAK2 2209 -#define HSMHV2_MOD_WGLEAK3 2210 -#define HSMHV2_MOD_WGLEAK6 2213 -#define HSMHV2_MOD_WGLKSD1 2215 -#define HSMHV2_MOD_WGLKSD2 2216 -#define HSMHV2_MOD_WGLKB1 2218 -#define HSMHV2_MOD_WGLKB2 2219 -#define HSMHV2_MOD_WNFTRP 2258 -#define HSMHV2_MOD_WNFALP 2259 -//#define HSMHV2_MOD_WPTHROU 2253 -#define HSMHV2_MOD_WVDIFFJ 2254 -#define HSMHV2_MOD_WIBPC1 2404 -#define HSMHV2_MOD_WIBPC2 2405 -#define HSMHV2_MOD_WCGBO 2156 -#define HSMHV2_MOD_WCVDSOVER 2480 -#define HSMHV2_MOD_WFALPH 2263 -#define HSMHV2_MOD_WNPEXT 2242 -#define HSMHV2_MOD_WPOWRAT 2463 -#define HSMHV2_MOD_WRD 2399 -#define HSMHV2_MOD_WRD22 2442 -#define HSMHV2_MOD_WRD23 2443 -#define HSMHV2_MOD_WRD24 2444 -#define HSMHV2_MOD_WRDICT1 2316 -#define HSMHV2_MOD_WRDOV13 2476 -#define HSMHV2_MOD_WRDSLP1 2315 -#define HSMHV2_MOD_WRDVB 2301 -#define HSMHV2_MOD_WRDVD 2510 -#define HSMHV2_MOD_WRDVG11 2424 -#define HSMHV2_MOD_WRS 2398 -#define HSMHV2_MOD_WRTH0 2432 -#define HSMHV2_MOD_WVOVER 2199 -#define HSMHV2_MOD_WJS0D 401 -#define HSMHV2_MOD_WJS0SWD 435 -#define HSMHV2_MOD_WNJD 440 -#define HSMHV2_MOD_WCISBKD 446 -#define HSMHV2_MOD_WVDIFFJD 459 -#define HSMHV2_MOD_WJS0S 460 -#define HSMHV2_MOD_WJS0SWS 467 -#define HSMHV2_MOD_WNJS 468 -#define HSMHV2_MOD_WCISBKS 469 -#define HSMHV2_MOD_WVDIFFJS 477 - -/* Cross-term dependence */ -#define HSMHV2_MOD_PVMAX 3100 -#define HSMHV2_MOD_PBGTMP1 3101 -#define HSMHV2_MOD_PBGTMP2 3102 -#define HSMHV2_MOD_PEG0 3103 -#define HSMHV2_MOD_PVFBOVER 3428 -#define HSMHV2_MOD_PNOVER 3430 -#define HSMHV2_MOD_PNOVERS 3431 -#define HSMHV2_MOD_PWL2 3407 -#define HSMHV2_MOD_PVFBC 3121 -#define HSMHV2_MOD_PNSUBC 3123 -#define HSMHV2_MOD_PNSUBP 3181 -#define HSMHV2_MOD_PSCP1 3184 -#define HSMHV2_MOD_PSCP2 3185 -#define HSMHV2_MOD_PSCP3 3186 -#define HSMHV2_MOD_PSC1 3126 -#define HSMHV2_MOD_PSC2 3127 -#define HSMHV2_MOD_PSC3 3128 -#define HSMHV2_MOD_PPGD1 3187 -//#define HSMHV2_MOD_PPGD3 3189 -#define HSMHV2_MOD_PNDEP 3129 -#define HSMHV2_MOD_PNINV 3130 -#define HSMHV2_MOD_PMUECB0 3131 -#define HSMHV2_MOD_PMUECB1 3132 -#define HSMHV2_MOD_PMUEPH1 3133 -#define HSMHV2_MOD_PVTMP 3141 -#define HSMHV2_MOD_PWVTH0 3142 -#define HSMHV2_MOD_PMUESR1 3143 -#define HSMHV2_MOD_PMUETMP 3195 -#define HSMHV2_MOD_PSUB1 3151 -#define HSMHV2_MOD_PSUB2 3152 -#define HSMHV2_MOD_PSVDS 3286 -#define HSMHV2_MOD_PSVBS 3284 -#define HSMHV2_MOD_PSVGS 3283 -#define HSMHV2_MOD_PFN1 3294 -#define HSMHV2_MOD_PFN2 3295 -#define HSMHV2_MOD_PFN3 3296 -#define HSMHV2_MOD_PFVBS 3297 -#define HSMHV2_MOD_PNSTI 3225 -#define HSMHV2_MOD_PWSTI 3226 -#define HSMHV2_MOD_PSCSTI1 3229 -#define HSMHV2_MOD_PSCSTI2 3230 -#define HSMHV2_MOD_PVTHSTI 3232 -#define HSMHV2_MOD_PMUESTI1 3235 -#define HSMHV2_MOD_PMUESTI2 3236 -#define HSMHV2_MOD_PMUESTI3 3237 -#define HSMHV2_MOD_PNSUBPSTI1 3238 -#define HSMHV2_MOD_PNSUBPSTI2 3239 -#define HSMHV2_MOD_PNSUBPSTI3 3240 -#define HSMHV2_MOD_PCGSO 3154 -#define HSMHV2_MOD_PCGDO 3155 -#define HSMHV2_MOD_PJS0 3157 -#define HSMHV2_MOD_PJS0SW 3158 -#define HSMHV2_MOD_PNJ 3159 -#define HSMHV2_MOD_PCISBK 3172 -#define HSMHV2_MOD_PCLM1 3191 -#define HSMHV2_MOD_PCLM2 3192 -#define HSMHV2_MOD_PCLM3 3193 -#define HSMHV2_MOD_PWFC 3201 -#define HSMHV2_MOD_PGIDL1 3205 -#define HSMHV2_MOD_PGIDL2 3206 -#define HSMHV2_MOD_PGLEAK1 3208 -#define HSMHV2_MOD_PGLEAK2 3209 -#define HSMHV2_MOD_PGLEAK3 3210 -#define HSMHV2_MOD_PGLEAK6 3213 -#define HSMHV2_MOD_PGLKSD1 3215 -#define HSMHV2_MOD_PGLKSD2 3216 -#define HSMHV2_MOD_PGLKB1 3218 -#define HSMHV2_MOD_PGLKB2 3219 -#define HSMHV2_MOD_PNFTRP 3258 -#define HSMHV2_MOD_PNFALP 3259 -//#define HSMHV2_MOD_PPTHROU 3253 -#define HSMHV2_MOD_PVDIFFJ 3254 -#define HSMHV2_MOD_PIBPC1 3404 -#define HSMHV2_MOD_PIBPC2 3405 -#define HSMHV2_MOD_PCGBO 3156 -#define HSMHV2_MOD_PCVDSOVER 3480 -#define HSMHV2_MOD_PFALPH 3263 -#define HSMHV2_MOD_PNPEXT 3242 -#define HSMHV2_MOD_PPOWRAT 3463 -#define HSMHV2_MOD_PRD 3399 -#define HSMHV2_MOD_PRD22 3442 -#define HSMHV2_MOD_PRD23 3443 -#define HSMHV2_MOD_PRD24 3444 -#define HSMHV2_MOD_PRDICT1 3316 -#define HSMHV2_MOD_PRDOV13 3476 -#define HSMHV2_MOD_PRDSLP1 3315 -#define HSMHV2_MOD_PRDVB 3301 -#define HSMHV2_MOD_PRDVD 3510 -#define HSMHV2_MOD_PRDVG11 3424 -#define HSMHV2_MOD_PRS 3398 -#define HSMHV2_MOD_PRTH0 3432 -#define HSMHV2_MOD_PVOVER 3199 -#define HSMHV2_MOD_PJS0D 479 -#define HSMHV2_MOD_PJS0SWD 486 -#define HSMHV2_MOD_PNJD 487 -#define HSMHV2_MOD_PCISBKD 488 -#define HSMHV2_MOD_PVDIFFJD 489 -#define HSMHV2_MOD_PJS0S 495 -#define HSMHV2_MOD_PJS0SWS 496 -#define HSMHV2_MOD_PNJS 497 -#define HSMHV2_MOD_PCISBKS 498 -#define HSMHV2_MOD_PVDIFFJS 499 - -/* device requests */ -#define HSMHV2_DNODE 341 -#define HSMHV2_GNODE 342 -#define HSMHV2_SNODE 343 -#define HSMHV2_BNODE 344 -/* #define HSMHV2_TEMPNODE 345 not used */ -#define HSMHV2_DNODEPRIME 346 -#define HSMHV2_SNODEPRIME 347 -/* #define HSMHV2_BNODEPRIME 395 not used */ -/* #define HSMHV2_DBNODE 396 not used */ -/* #define HSMHV2_SBNODE 397 not used */ -/* #define HSMHV2_VBD 347 */ -#define HSMHV2_VBD 466 -#define HSMHV2_VBS 348 -#define HSMHV2_VGS 349 -#define HSMHV2_VDS 350 -#define HSMHV2_CD 351 -#define HSMHV2_CBS 352 -#define HSMHV2_CBD 353 -#define HSMHV2_GM 354 -#define HSMHV2_GDS 355 -#define HSMHV2_GMBS 356 -#define HSMHV2_GMT 465 -/* #define HSMHV2_ISUBT 466 */ -#define HSMHV2_GBD 357 -#define HSMHV2_GBS 358 -#define HSMHV2_QB 359 -#define HSMHV2_CQB 360 -/* #define HSMHV2_QTH 467 not used */ -/* #define HSMHV2_CQTH 468 not used */ -/* #define HSMHV2_CTH 469 not used */ -#define HSMHV2_QG 361 -#define HSMHV2_CQG 362 -#define HSMHV2_QD 363 -#define HSMHV2_CQD 364 -#define HSMHV2_CGG 365 -#define HSMHV2_CGD 366 -#define HSMHV2_CGS 367 -#define HSMHV2_CBG 368 -#define HSMHV2_CAPBD 369 -/* #define HSMHV2_CQBD 370 not used */ -#define HSMHV2_CAPBS 371 -/* #define HSMHV2_CQBS 372 not used */ -#define HSMHV2_CDG 373 -#define HSMHV2_CDD 374 -#define HSMHV2_CDS 375 -#define HSMHV2_VON 376 -#define HSMHV2_VDSAT 377 -#define HSMHV2_QBS 378 -#define HSMHV2_QBD 379 -#define HSMHV2_SOURCECONDUCT 380 -#define HSMHV2_DRAINCONDUCT 381 -#define HSMHV2_CBDB 382 -#define HSMHV2_CBSB 383 -#define HSMHV2_MOD_RBPB 389 -#define HSMHV2_MOD_RBPD 390 -#define HSMHV2_MOD_RBPS 391 -#define HSMHV2_MOD_RBDB 392 -#define HSMHV2_MOD_RBSB 393 -#define HSMHV2_MOD_GBMIN 394 - -#define HSMHV2_ISUB 410 -#define HSMHV2_ISUBLD 426 -#define HSMHV2_IDSIBPC 427 -#define HSMHV2_IGIDL 411 -#define HSMHV2_IGISL 412 -#define HSMHV2_IGD 413 -#define HSMHV2_IGS 414 -#define HSMHV2_IGB 415 -#define HSMHV2_CGSO 416 -#define HSMHV2_CGBO 417 -#define HSMHV2_CGDO 418 - -#define HSMHV2_MOD_TCJBD 92 -#define HSMHV2_MOD_TCJBS 93 -#define HSMHV2_MOD_TCJBDSW 94 -#define HSMHV2_MOD_TCJBSSW 95 -#define HSMHV2_MOD_TCJBDSWG 96 -#define HSMHV2_MOD_TCJBSSWG 97 - -#define HSMHV2_MOD_VGS_MAX 4001 -#define HSMHV2_MOD_VGD_MAX 4002 -#define HSMHV2_MOD_VGB_MAX 4003 -#define HSMHV2_MOD_VDS_MAX 4004 -#define HSMHV2_MOD_VBS_MAX 4005 -#define HSMHV2_MOD_VBD_MAX 4006 -#define HSMHV2_MOD_VGSR_MAX 4007 -#define HSMHV2_MOD_VGDR_MAX 4008 -#define HSMHV2_MOD_VGBR_MAX 4009 -#define HSMHV2_MOD_VBSR_MAX 4010 -#define HSMHV2_MOD_VBDR_MAX 4011 - -#include "hsmhv2ext.h" - -/* Prototype has to be adapted! -extern void HSMHV2evaluate(double,double,double,HSMHV2instance*,HSMHV2model*, - double*,double*,double*, double*, double*, double*, double*, - double*, double*, double*, double*, double*, double*, double*, - double*, double*, double*, double*, CKTcircuit*); -*/ - -#endif /*HSMHV2*/ - diff --git a/src/spicelib/devices/hisimhv2/hsmhv2eval.c b/src/spicelib/devices/hisimhv2/hsmhv2eval.c deleted file mode 100644 index cda4d0e88..000000000 --- a/src/spicelib/devices/hisimhv2/hsmhv2eval.c +++ /dev/null @@ -1,6236 +0,0 @@ -/*********************************************************************** - - HiSIM (Hiroshima University STARC IGFET Model) - Copyright (C) 2014 Hiroshima University & STARC - - MODEL NAME : HiSIM_HV - ( VERSION : 2 SUBVERSION : 2 REVISION : 0 ) - Model Parameter 'VERSION' : 2.20 - FILE : hsmhveval.c - - DATE : 2014.6.11 - - released by - Hiroshima University & - Semiconductor Technology Academic Research Center (STARC) -***********************************************************************/ - -/********************************************************************** - -The following source code, and all copyrights, trade secrets or other -intellectual property rights in and to the source code in its entirety, -is owned by the Hiroshima University and the STARC organization. - -All users need to follow the "HISIM_HV Distribution Statement and -Copyright Notice" attached to HiSIM_HV model. - ------HISIM_HV Distribution Statement and Copyright Notice-------------- - -Software is distributed as is, completely without warranty or service -support. Hiroshima University or STARC and its employees are not liable -for the condition or performance of the software. - -Hiroshima University and STARC own the copyright and grant users a perpetual, -irrevocable, worldwide, non-exclusive, royalty-free license with respect -to the software as set forth below. - -Hiroshima University and STARC hereby disclaims all implied warranties. - -Hiroshima University and STARC grant the users the right to modify, copy, -and redistribute the software and documentation, both within the user's -organization and externally, subject to the following restrictions - -1. The users agree not to charge for Hiroshima University and STARC code -itself but may charge for additions, extensions, or support. - -2. In any product based on the software, the users agree to acknowledge -Hiroshima University and STARC that developed the software. This -acknowledgment shall appear in the product documentation. - -3. The users agree to reproduce any copyright notice which appears on -the software on any copy or modification of such made available -to others." - -Toshimasa Asahara, President, Hiroshima University -Mitiko Miura-Mattausch, Professor, Hiroshima University -Katsuhiro Shimohigashi, President&CEO, STARC -June 2008 (revised October 2011) -*************************************************************************/ - -/********************************************************************* -* Memorandum on programming -* -* (1) Bias (x: b|d|g) -* . vxs : Input arguments: Outer branch voltages. -* . vxsi: Input arguments: Inner branch voltages. -* . deltemp: Input argument: delta temperature. -* . Vxse: Internal name for outer branch voltages. -* . Vxs: Internal name for inner branch voltages. -* . Vbscl:Inner bulk source voltage is clamped within a specified region. -* . Y_dVxs denotes the partial derivative of Y w.r.t. Vxs. -* . Y_dVxse denotes the partial derivative of Y w.r.t. Vxse. -* . Y_dT denotes derivatives with respect to deltemp. -* -* (2) Device Mode -* . Normal mode (Vds>=0 for nMOS) is assumed. -* . The sign of Vdse is assumed to be changed simultaneously, if the sign of Vds is changed; -* hence Vdse may become negative even thogh Vds >=0. -* . In case of reverse mode, parent routines have to properly -* transform or interchange inputs and outputs except ones -* related to junction diodes, which are regarded as being -* fixed to the nodal S/D. -* -* (3) Modification for symmetry at Vds=0 -* . Vxsz: Modified bias. (x: b|d|g) -* . Ps0z: Modified Ps0. -* . The following variables are calculated as a function of -* modified biases or potential. -* Tox, Cox, (-- with quantum effect) -* Vth*, dVth*, dPpg, Igate, Igidl, Igisl. -* . The following variables are calculated using a transform -* function. -* Lred -* -* (4) Zones and Cases (terminology) -* -* Chi:=beta*(Ps0-Vbs)= 0 3 5 -* -* Zone: A | D1 | D2 | D3 -* | -* (accumulation)|(depletion) -* | -* Vgs = Vgs_fb Vth -* / / -* Case: Nonconductive / Conductive -* / -* VgVt:=Qn0/Cox= VgVt_small -* -* . Ids is regarded as zero in zone-A. -* . Procedure to calculate Psl and dependent variables is -* omitted in the nonconductive case. Ids and Qi are regarded -* as zero in this case. -* -*********************************************************************/ - -/*===========================================================* -* Preamble. -*=================*/ -/*---------------------------------------------------* -* Header files. -*-----------------*/ -#include "ngspice/ngspice.h" -#ifdef __STDC__ -/* #include */ -#endif - - -/*-----------------------------------* -* HiSIM macros -*-----------------*/ -#include "hisimhv2.h" -#include "hsmhv2evalenv.h" -#define C_IDD_MIN 1.0e-15 -#define C_sub_delta 0.1 /* CHECK! */ -#define C_sub_delta2 1.0e-9 /* CHECK! */ -#define C_gidl_delta 0.5 - -/* local variables used in macro functions */ -static double TMF0 , TMF1 , TMF2 , TMF3 , TMF4 ; - -/*===========================================================* -* Exp() for PGD. -* - ExpLim(-3)=0 -*=================*/ - -#define Fn_ExpLim( y , x , dx ) { \ - if ( (x) < -3.0 ) { \ - dx = 0.0 ; \ - y = 0.0 ; \ - } else if ( (x) < 0.0 ) { \ - dx = 1.0 + (x) * ( 2 * (1.0/3.0) + (x) * 3 * (1.0/27.0) ) ; \ - y = 1.0 + (x) * ( 1.0 + (x) * ( (1.0/3.0) + (x) * (1.0/27.0) ) ) ; \ - } else { \ - dx = 1.0 + (x) * ( 2 * (1.0/3.0) + (x) * ( 3 * 0.0402052934513951 \ - + (x) * 4 * 0.148148111111111 ) ) ; \ - y = 1.0 + (x) * ( 1.0 + (x) * ( (1.0/3.0) + (x) * ( 0.0402052934513951 \ - + (x) * 0.148148111111111 ) ) ) ; \ - } \ -} - -/*===========================================================* -* Macro Functions for ceiling/flooring/symmetrization. -*=================*/ - -/*---------------------------------------------------* -* smoothUpper: ceiling. -* y = xmax - 0.5 ( arg + sqrt( arg^2 + 4 xmax delta ) ) -* arg = xmax - x - delta -*-----------------*/ - -#define Fn_SU( y , x , xmax , delta , dx ) { \ - TMF1 = ( xmax ) - ( x ) - ( delta ) ; \ - TMF2 = 4.0 * ( xmax ) * ( delta) ; \ - TMF2 = TMF2 > 0.0 ? TMF2 : - ( TMF2 ) ; \ - TMF2 = sqrt ( TMF1 * TMF1 + TMF2 ) ; \ - dx = 0.5 * ( 1.0 + TMF1 / TMF2 ) ; \ - y = ( xmax ) - 0.5 * ( TMF1 + TMF2 ) ; \ - } - -#define Fn_SU2( y , x , xmax , delta , dy_dx , dy_dxmax ) { \ - TMF1 = ( xmax ) - ( x ) - ( delta ) ; \ - TMF2 = 4.0 * ( xmax ) * ( delta) ; \ - TMF2 = TMF2 > 0.0 ? TMF2 : - ( TMF2 ) ; \ - TMF2 = sqrt ( TMF1 * TMF1 + TMF2 ) ; \ - dy_dx = 0.5 * ( 1.0 + TMF1 / TMF2 ) ; \ - dy_dxmax = 0.5 * ( 1.0 - ( TMF1 + 2.0 * delta ) / TMF2 ) ; \ - y = ( xmax ) - 0.5 * ( TMF1 + TMF2 ) ; \ - } - - -/*---------------------------------------------------* -* smoothLower: flooring. -* y = xmin + 0.5 ( arg + sqrt( arg^2 + 4 xmin delta ) ) -* arg = x - xmin - delta -*-----------------*/ - -#define Fn_SL( y , x , xmin , delta , dx ) { \ - TMF1 = ( x ) - ( xmin ) - ( delta ) ; \ - TMF2 = 4.0 * ( xmin ) * ( delta ) ; \ - TMF2 = TMF2 > 0.0 ? TMF2 : - ( TMF2 ) ; \ - TMF2 = sqrt ( TMF1 * TMF1 + TMF2 ) ; \ - dx = 0.5 * ( 1.0 + TMF1 / TMF2 ) ; \ - y = ( xmin ) + 0.5 * ( TMF1 + TMF2 ) ; \ - } - -#define Fn_SL2( y , x , xmin , delta , dy_dx, dy_dxmin ) { \ - TMF1 = ( x ) - ( xmin ) - ( delta ) ; \ - TMF2 = 4.0 * ( xmin ) * ( delta ) ; \ - TMF2 = TMF2 > 0.0 ? TMF2 : - ( TMF2 ) ; \ - TMF2 = sqrt ( TMF1 * TMF1 + TMF2 ) ; \ - dy_dx = 0.5 * ( 1.0 + TMF1 / TMF2 ) ; \ - dy_dxmin = 0.5 * ( 1.0 - ( TMF1 - 2.0 * delta ) / TMF2 ) ; \ - y = ( xmin ) + 0.5 * ( TMF1 + TMF2 ) ; \ - } - -/*---------------------------------------------------* -* smoothZero: flooring to zero. -* y = 0.5 ( x + sqrt( x^2 + 4 delta^2 ) ) -*-----------------*/ - -#define Fn_SZ( y , x , delta , dx ) { \ - TMF2 = sqrt ( ( x ) * ( x ) + 4.0 * ( delta ) * ( delta) ) ; \ - dx = 0.5 * ( 1.0 + ( x ) / TMF2 ) ; \ - y = 0.5 * ( ( x ) + TMF2 ) ; \ - if( y < 0.0 ) { y=0.0; dx=0.0; } \ - } - - -/*---------------------------------------------------* -* CeilingPow: ceiling for positive x, flooring for negative x. -* y = x * xmax / ( x^{2m} + xmax^{2m} )^{1/(2m)} -* note: -* - xmax has to be positive. -* - -xmax < y < xmax. -* - dy/dx|_{x=0} = 1. -*-----------------*/ - -#define Fn_CP( y , x , xmax , pw , dx ) { \ - double x2 = (x) * (x) ; \ - double xmax2 = (xmax) * (xmax) ; \ - double xp = 1.0 , xmp = 1.0 ; \ - int m =0, mm =0; \ - double arg =0.0, dnm =0.0; \ - for ( m = 0 ; m < pw ; m ++ ) { xp *= x2 ; xmp *= xmax2 ; } \ - arg = xp + xmp ; \ - dnm = arg ; \ - if ( pw == 1 || pw == 2 || pw == 4 || pw == 8 ) { \ - if ( pw == 1 ) { mm = 1 ; \ - } else if ( pw == 2 ) { mm = 2 ; \ - } else if ( pw == 4 ) { mm = 3 ; \ - } else if ( pw == 8 ) { mm = 4 ; } \ - for ( m = 0 ; m < mm ; m ++ ) { dnm = sqrt( dnm ) ; } \ - } else { dnm = Fn_Pow( dnm , 1.0 / ( 2.0 * pw ) ) ; } \ - dnm = 1.0 / dnm ; \ - y = (x) * (xmax) * dnm ; \ - dx = (xmax) * xmp * dnm / arg ; \ -} - -#define Fn_SU_CP2( y , x , xmax , delta , pw , dx , dxmax ) { \ - if(x > xmax - delta && delta >= 0.0) { \ - TMF1 = x - xmax + delta ; \ - Fn_CP( TMF0 , TMF1 , delta , pw , dx ) \ - y = xmax - delta + TMF0 ; \ - dx = dx ; \ - dxmax = 1.0-dx ; \ - } else { \ - y = x ; \ - dx = 1.0 ; \ - dxmax = 0.0 ; \ - } \ -} - -#define Fn_CP2( y , x , xmax , pw , dx , dxmax ) { \ - double x2 = (x) * (x) ; \ - double xmax2 = (xmax) * (xmax) ; \ - double xp = 1.0 , xmp = 1.0 ; \ - int m =0, mm =0; \ - double arg =0.0, dnm =0.0; \ - for ( m = 0 ; m < pw ; m ++ ) { xp *= x2 ; xmp *= xmax2 ; } \ - arg = xp + xmp ; \ - dnm = arg ; \ - if ( pw == 1 || pw == 2 || pw == 4 || pw == 8 ) { \ - if ( pw == 1 ) { mm = 1 ; \ - } else if ( pw == 2 ) { mm = 2 ; \ - } else if ( pw == 4 ) { mm = 3 ; \ - } else if ( pw == 8 ) { mm = 4 ; } \ - for ( m = 0 ; m < mm ; m ++ ) { dnm = sqrt( dnm ) ; } \ - } else { dnm = Fn_Pow( dnm , 1.0 / ( 2.0 * pw ) ) ; } \ - dnm = 1.0 / dnm ; \ - y = (x) * (xmax) * dnm ; \ - dx = (xmax) * xmp * dnm / arg ; \ - dxmax = (x) * xp * dnm / arg ; \ -} - -#define Fn_SU_CP3( y , x , xmax , delta , pw , dx , dxmax , ddelta ) { \ - if(x > xmax - delta && delta >= 0.0) { \ - TMF1 = x - xmax + delta ; \ - Fn_CP2( TMF0 , TMF1 , delta , pw , dx , ddelta ) \ - y = xmax - delta + TMF0 ; \ - dx = dx ; \ - dxmax = 1.0-dx ; \ - ddelta = -1.0+dx+ddelta; \ - } else { \ - y = x ; \ - dx = 1.0 ; \ - dxmax = 0.0 ; \ - ddelta = 0.0 ; \ - } \ -} - -#define Fn_SL_CP3( y , x , xmin , delta , pw , dx , dxmin, ddelta) { \ - if(x < xmin + delta && delta >= 0.0) { \ - TMF1 = xmin + delta - x ; \ - Fn_CP2( TMF0 , TMF1 , delta , pw , dx , ddelta ) \ - y = xmin + delta - TMF0 ; \ - dx = dx ; \ - dxmin = 1.0-dx ; \ - ddelta = 1.0-dx-ddelta; \ - } else { \ - y = x ; \ - dx = 1.0 ; \ - dxmin = 0.0 ; \ - ddelta = 0.0 ; \ - } \ -} - -#define Fn_SU_CP( y , x , xmax , delta , pw , dx ) { \ - if(x > xmax - delta && delta >= 0.0) { \ - TMF1 = x - xmax + delta ; \ - Fn_CP( TMF0 , TMF1 , delta , pw , dx ) \ - y = xmax - delta + TMF0 ; \ - dx = dx ; \ - } else { \ - y = x ; \ - dx = 1.0 ; \ - } \ -} - - -#define Fn_SL_CP2( y , x , xmin , delta , pw , dx , dxmin) { \ - if(x < xmin + delta && delta >= 0.0) { \ - TMF1 = xmin + delta - x ; \ - Fn_CP( TMF0 , TMF1 , delta , pw , dx ) \ - y = xmin + delta - TMF0 ; \ - dx = dx ; \ - dxmin = 1.0-dx ; \ - } else { \ - y = x ; \ - dx = 1.0 ; \ - dxmin = 0.0 ; \ - } \ -} - -#define Fn_SL_CP( y , x , xmin , delta , pw , dx ) { \ - if(x < xmin + delta && delta >= 0.0) { \ - TMF1 = xmin + delta - x ; \ - Fn_CP( TMF0 , TMF1 , delta , pw , dx ) \ - y = xmin + delta - TMF0 ; \ - dx = dx ; \ - } else { \ - y = x ; \ - dx = 1.0 ; \ - } \ -} - - - -/*---------------------------------------------------* -* Declining function using a polynomial. -*-----------------*/ - -#define Fn_DclPoly4( y , x , dx ) { \ - TMF2 = (x) * (x) ; \ - TMF3 = TMF2 * (x) ; \ - TMF4 = TMF2 * TMF2 ; \ - y = 1.0 / ( 1.0 + (x) + TMF2 + TMF3 + TMF4 ) ; \ - dx = - ( 1.0 + 2.0 * (x) + 3.0 * TMF2 + 4.0 * TMF3 ) * y * y ; \ -} - -#define Fn_DclPoly6( y , x , dx ) { \ - TMF2 = (x) * (x) ; \ - TMF3 = TMF2 * (x) ; \ - TMF4 = TMF2 * TMF2 ; \ - TMF5 = TMF2 * TMF3 ; \ - TMF6 = TMF3 * TMF3 ; \ - y = 1.0 / ( 1.0 + (x) + TMF2 + TMF3 + TMF4 + TMF5 + TMF6 ) ; \ - dx = - ( 1.0 + 2.0 * (x) + 3.0 * TMF2 + 4.0 * TMF3 \ - + 5.0 * TMF4 + 6.0 * TMF5 ) * y * y ; \ -} - -/*---------------------------------------------------* -* "smoothUpper" using a polynomial -*-----------------*/ - -#define Fn_SUPoly4( y , x , xmax , dx ) { \ - TMF1 = (x) / xmax ; \ - Fn_DclPoly4( y , TMF1 , dx ) ; \ - y = xmax * ( 1.0 - y ) ; \ - dx = - dx ; \ -} - - -#define Fn_SUPoly4m( y , x , xmax , dx , dxmax ) { \ - TMF1 = (x) / xmax ; \ - Fn_DclPoly4( TMF0 , TMF1 , dx ) ; \ - y = xmax * ( 1.0 - TMF0 ) ; \ - dxmax = 1.0 - TMF0 + TMF1 * dx ; \ - dx = - dx ; \ -} - - -#define Fn_SUPoly6m( y , x , xmax , dx , dxmax ) { \ - TMF1 = (x) / xmax ; \ - Fn_DclPoly6( TMF0 , TMF1 , dx ) ; \ - y = xmax * ( 1.0 - TMF0 ) ; \ - dxmax = 1.0 - TMF0 + TMF1 * dx ; \ - dx = - dx ; \ -} - -/*---------------------------------------------------* -* SymAdd: evaluate additional term for symmetry. -*-----------------*/ - -#define Fn_SymAdd( y , x , add0 , dx ) \ -{ \ - TMF1 = 2.0 * ( x ) / ( add0 ) ; \ - TMF2 = 1.0 + TMF1 * ( (1.0/2) + TMF1 * ( (1.0/6) \ - + TMF1 * ( (1.0/24) + TMF1 * ( (1.0/120) \ - + TMF1 * ( (1.0/720) + TMF1 * (1.0/5040) ) ) ) ) ) ; \ - TMF3 = (1.0/2) + TMF1 * ( (1.0/3) \ - + TMF1 * ( (1.0/8) + TMF1 * ( (1.0/30) \ - + TMF1 * ( (1.0/144) + TMF1 * (1.0/840) ) ) ) ) ; \ - y = add0 / TMF2 ; \ - dx = - 2.0 * TMF3 / ( TMF2 * TMF2 ) ; \ -} - - - -/*===========================================================* -* Function hsmhvevaluate. -*=================*/ -int HSMHV2evaluate -( - double Vdse, /* external branch voltage ( Vds >= 0 are assumed -> Vdse might be negative.) */ - double Vgse, /* external branch voltage */ - double Vbse, /* external branch voltage */ - double Vds, /* inner branch voltage */ - double Vgs, /* inner branch voltage */ - double Vbs, /* inner branch voltage */ - double vbs_jct, - double vbd_jct, - double Vsubs, /* substrate-source voltage */ - double Vddp, /* drain-drainPrime voltage */ - double deltemp, - HSMHV2instance *here, - HSMHV2model *model, - CKTcircuit *ckt - ) -{ - HSMHV2binningParam *pParam = &here->pParam ; - HSMHV2modelMKSParam *modelMKS = &model->modelMKS ; -/* HSMHV2hereMKSParam *hereMKS = &here->hereMKS ;*/ - /*-----------------------------------* - * Constants for Smoothing functions - *---------------*/ - const double vth_dlt = 1.0e-3 ; - /* const double cclmmdf = 1.0e-2 ;*/ - const double cclmmdf = 1.0e-1 ; - const double C_cm2m = 1.0e-2 ; - const double qme_dlt = 1.0e-9 * C_cm2m ; - const double rdsl2_dlt = 10.0e-3 * C_cm2m ; - const double rdsu2_dlt = 50.0e-6 * C_cm2m ; - const double rdsz_dlt = 0.1e-3 * C_cm2m ; -/* const double qme2_dlt = 5.0e-2 ;*/ - const double eef_dlt = 1.0e-2 / C_cm2m ; - const double sti2_dlt = 2.0e-3 ; - const double pol_dlt = 5.0e-2 ; -/* const double psia2_dlt = 5.0e-3 ;*/ - const double psisti_dlt = 5.0e-3 ; - - /*---------------------------------------------------* - * Local variables. - *-----------------*/ - /* Constants ----------------------- */ - const int lp_s0_max = 20 ; - const int lp_sl_max = 40 ; - const int lp_se_max = 150 ; - - const double dP_max = 0.1e0 ; - const double ps_conv = 1.0e-12 ; - const double ps_conv2 = 1.0e-10 ; - - /* double ps_conv = 1.0e-13 ;*/ - const double gs_conv = 1.0e-8 ; - /** depletion **/ - const double znbd3 = 3.0e0 ; - const double znbd5 = 5.0e0 ; - const double cn_nc3 = C_SQRT_2 / 108e0 ; - /* 5-degree, contact:Chi=5 */ - const double cn_nc51 = 0.707106781186548 ; /* sqrt(2)/2 */ - const double cn_nc52 = -0.117851130197758 ; /* -sqrt(2)/12 */ - const double cn_nc53 = 0.0178800506338833 ; /* (187 - 112*sqrt(2))/1600 */ - const double cn_nc54 = -0.00163730162779191 ; /* (-131 + 88*sqrt(2))/4000 */ - const double cn_nc55 = 6.36964918866352e-5 ; /* (1509-1040*sqrt(2))/600000 */ - /** inversion **/ - /* 3-degree polynomial approx for ( exp[Chi]-1 )^{1/2} */ - const double cn_im53 = 2.9693154855770998e-1 ; - const double cn_im54 = -7.0536542840097616e-2 ; - const double cn_im55 = 6.1152888951331797e-3 ; - /** initial guess **/ - const double c_ps0ini_2 = 8.0e-4 ; - const double c_pslini_1 = 0.3e0 ; - const double c_pslini_2 = 3.0e-2 ; - - const double VgVt_small = 1.0e-12 ; - /* const double Vbs_min = model->HSMHV2_vbsmin ; */ - /* const double Vds_max = 10.5e0 ; */ - /* const double Vgs_max = 10.5e0 ; */ - const double epsm10 = 10.0e0 * C_EPS_M ; - const double small = 1.0e-25 ; - const double small2= 1e-12 ; /* for Ra(Vdse) dependence */ - const double c_exp_2 = 7.38905609893065 ; - const double large_arg = 80 ; // log(1.0e100) ; - - double Vbs_max = 0.8e0, Vbs_max_dT =0.0 ; - double Vbs_bnd = 0.4e0, Vbs_bnd_dT =0.0 ; /* start point of positive Vbs bending */ - double Gdsmin = 0.0 ; - - /* Internal flags --------------------*/ - int flg_err = 0 ; /* error level */ - int flg_rsrd = 0 ; /* Flag for handling Rs and Rd */ - /* int flg_iprv = 0 ; */ /* Flag for initial guess of Ids -> not necessary any more */ - int flg_pprv = 0 ; /* Flag for initial guesses of Ps0 and Pds */ - int flg_noqi =0; /* Flag for the cases regarding Qi=Qd=0 */ - /* int flg_vbsc = 0 ; */ /* Flag for Vbs confining -> not necessary any more */ - int flg_info = 0 ; - int flg_conv = 0 ; /* Flag for Poisson loop convergence */ - int flg_qme = 0 ; /* Flag for QME */ - int flg_nqs=0 ; /* Flag for NQS calculation */ - - /* Important Variables in HiSIM -------*/ - /* confined bias */ - double Vbscl=0.0, Vbscl_dVbs=0.0, Vbscl_dT=0.0, Vbscl_dVbs_dVbs = 0.0, Vbscl_dVbs_dT = 0.0 ; - double Vgp =0.0, Vgp_dVbs =0.0, Vgp_dVds =0.0, Vgp_dVgs =0.0, Vgp_dT =0.0 ; - double Vgs_fb =0.0 ; - /* Ps0 : surface potential at the source side */ - double Ps0 =0.0, Ps0_dVbs =0.0, Ps0_dVds =0.0, Ps0_dVgs =0.0, Ps0_dT =0.0 ; - double Ps0_ini =0.0 ; - double Ps0_iniA =0.0, Ps0_iniA_dVxb =0.0, Ps0_iniA_dVgb =0.0, Ps0_iniA_dT =0.0 ; - double Ps0_iniB =0.0, Ps0_iniB_dVxb =0.0, Ps0_iniB_dVgb =0.0, Ps0_iniB_dT =0.0 ; - /* Psl : surface potential at the drain side */ - double Psl =0.0, Psl_dVbs =0.0, Psl_dVds =0.0, Psl_dVgs =0.0, Psl_dT =0.0 ; - double Psl_lim =0.0, dPlim =0.0 ; - /* Pds := Psl - Ps0 */ - double Pds = 0.0, Pds_dVbs = 0.0, Pds_dVds = 0.0, Pds_dVgs =0.0, Pds_dT =0.0 ; - double Pds_ini =0.0 ; - double Pds_max =0.0 ; - /* iteration numbers of Ps0 and Psl equations. */ - int lp_s0 = 0 , lp_sl = 0 ; - /* Xi0 := beta * ( Ps0 - Vbs ) - 1. */ - double Xi0 =0.0, Xi0_dVbs =0.0, Xi0_dVds =0.0, Xi0_dVgs =0.0, Xi0_dT =0.0 ; - double Xi0p12 =0.0, Xi0p12_dVbs =0.0, Xi0p12_dVds =0.0, Xi0p12_dVgs =0.0, Xi0p12_dT =0.0 ; - double Xi0p32 =0.0, Xi0p32_dVbs =0.0, Xi0p32_dVds =0.0, Xi0p32_dVgs =0.0, Xi0p32_dT =0.0 ; - /* Xil := beta * ( Psl - Vbs ) - 1. */ - double Xil =0.0, Xil_dVbs =0.0, Xil_dVds =0.0, Xil_dVgs =0.0, Xil_dT =0.0 ; - double Xilp12 =0.0, Xilp12_dVbs =0.0, Xilp12_dVds =0.0, Xilp12_dVgs =0.0, Xilp12_dT =0.0 ; - double Xilp32 =0.0, Xilp32_dVbs =0.0, Xilp32_dVds =0.0, Xilp32_dVgs =0.0, Xilp32_dT =0.0 ; - /* modified bias and potential for sym.*/ - double Vbsz =0.0, Vbsz_dVbs =0.0, Vbsz_dVds =0.0, Vbsz_dT =0.0 ; - double Vdsz =0.0, Vdsz_dVbs =0.0, Vdsz_dVds =0.0, Vdsz_dT =0.0 ; - double Vgsz =0.0, Vgsz_dVbs =0.0, Vgsz_dVds =0.0, Vgsz_dVgs =0.0, Vgsz_dT =0.0 ; - double Vzadd =0.0, Vzadd_dVbs =0.0, Vzadd_dVds = 0.0, Vzadd_dT = 0.0 ; - double Ps0z =0.0, Ps0z_dVbs =0.0, Ps0z_dVds =0.0, Ps0z_dVgs =0.0, Ps0z_dT =0.0 ; - double Pzadd =0.0, Pzadd_dVbs =0.0, Pzadd_dVds =0.0, Pzadd_dVgs =0.0, Pzadd_dT =0.0 ; - - /* IBPC */ - double dVbsIBPC =0.0, dVbsIBPC_dVbs =0.0, dVbsIBPC_dVds =0.0, dVbsIBPC_dVgs =0.0, dVbsIBPC_dT =0.0 , dVbsIBPC_dVddp =0.0 ; - double dG3 =0.0, dG3_dVbs =0.0, dG3_dVds =0.0, dG3_dVgs =0.0, dG3_dT =0.0 , dG3_dVddp =0.0 ; - double dG4 =0.0, dG4_dVbs =0.0, dG4_dVds =0.0, dG4_dVgs =0.0, dG4_dT =0.0 , dG4_dVddp =0.0 ; - double dIdd =0.0, dIdd_dVbs =0.0, dIdd_dVds =0.0, dIdd_dVgs =0.0, dIdd_dT =0.0 , dIdd_dVddp =0.0 ; - - double betaWL =0.0, betaWL_dVbs =0.0, betaWL_dVds =0.0, betaWL_dVgs =0.0, betaWL_dT =0.0 ; - - /* Chi := beta * ( Ps{0/l} - Vbs ) */ - double Chi =0.0, Chi_dVbs =0.0, Chi_dVds =0.0, Chi_dVgs =0.0, Chi_dT =0.0 ; - /* Rho := beta * ( Psl - Vds ) */ - double Rho =0.0, Rho_dT =0.0 ; - /* threshold voltage */ - double Vth =0.0 ; - double Vth0 =0.0, Vth0_dVb =0.0, Vth0_dVd =0.0, Vth0_dVg =0.0, Vth0_dT =0.0 ; - /* variation of threshold voltage */ - double dVth =0.0, dVth_dVb =0.0, dVth_dVd =0.0, dVth_dVg =0.0, dVth_dT = 0.0 ; - double dVth0 =0.0 ; - double dVth0_dVb =0.0, dVth0_dVd =0.0, dVth0_dVg =0.0, dVth0_dT =0.0 ; - double dVthSC =0.0 ; - double dVthSC_dVb =0.0, dVthSC_dVd =0.0, dVthSC_dVg =0.0, dVthSC_dT =0.0 ; - double Pb20b =0.0, Pb20b_dVg =0.0, Pb20b_dVb =0.0, Pb20b_dVd =0.0, Pb20b_dT =0.0 ; - double dVthW =0.0, dVthW_dVb =0.0, dVthW_dVd =0.0, dVthW_dVg =0.0, dVthW_dT =0.0 ; - /* Alpha and related parameters */ - double Alpha =0.0, Alpha_dVbs =0.0, Alpha_dVds =0.0, Alpha_dVgs =0.0, Alpha_dT =0.0 ; - double Achi =0.0, Achi_dVbs =0.0, Achi_dVds =0.0, Achi_dVgs =0.0, Achi_dT =0.0 ; - double VgVt =0.0, VgVt_dVbs =0.0, VgVt_dVds =0.0, VgVt_dVgs =0.0, VgVt_dT =0.0 ; - double Pslsat =0.0 ; - double Vdsat =0.0 ; - double VdsatS =0.0, VdsatS_dVbs =0.0, VdsatS_dVds =0.0, VdsatS_dVgs =0.0, VdsatS_dT =0.0 ; - double Delta =0.0 ; - /* Q_B and capacitances */ - double Qb =0.0, Qb_dVbs =0.0, Qb_dVds =0.0, Qb_dVgs =0.0, Qb_dT=0.0 ; - double Qbu =0.0, Qbu_dVbs =0.0, Qbu_dVds =0.0, Qbu_dVgs =0.0, Qbu_dT =0.0 ; - /* Q_I and capacitances */ - double Qi =0.0, Qi_dVbs =0.0, Qi_dVds =0.0, Qi_dVgs =0.0, Qi_dT=0.0 ; - double Qiu =0.0, Qiu_dVbs =0.0, Qiu_dVds =0.0, Qiu_dVgs =0.0, Qiu_dT =0.0 ; - /* Q_D and capacitances */ - double Qd =0.0, Qd_dVbs =0.0, Qd_dVds =0.0, Qd_dVgs =0.0, Qd_dT =0.0 ; - /* channel current */ - double Ids =0.0, Ids_dVbs =0.0, Ids_dVds =0.0, Ids_dVgs =0.0, Ids_dT =0.0, Ids_dRa =0.0 ; - double Ids0 =0.0, Ids0_dVbs =0.0, Ids0_dVds =0.0, Ids0_dVgs =0.0, Ids0_dT =0.0 ; - /* STI */ - double dVthSCSTI =0.0, dVthSCSTI_dVg =0.0, dVthSCSTI_dVd =0.0, dVthSCSTI_dVb =0.0, dVthSCSTI_dT =0.0 ; - double Vgssti =0.0, Vgssti_dVbs =0.0, Vgssti_dVds =0.0, Vgssti_dVgs =0.0, Vgssti_dT =0.0 ; - double costi0 =0.0 ; - double costi1 =0.0, costi1_dT =0.0 ; - double costi3 =0.0, costi3_dVb =0.0, costi3_dVd =0.0, costi3_dVg =0.0, costi3_dT =0.0 ; - double costi3_dVb_c3 =0.0, costi3_dVd_c3 =0.0, costi3_dVg_c3 =0.0, costi3_dT_c3 =0.0 ; - double costi4 =0.0, costi4_dT =0.0 ; - double costi5 =0.0, costi5_dT =0.0 ; - double costi6 =0.0, costi6_dT =0.0 ; - double costi7 =0.0, costi7_dT =0.0 ; - double Psasti =0.0, Psasti_dVbs =0.0, Psasti_dVds =0.0, Psasti_dVgs =0.0, Psasti_dT =0.0 ; - double Psbsti =0.0, Psbsti_dVbs =0.0, Psbsti_dVds =0.0, Psbsti_dVgs =0.0, Psbsti_dT =0.0 ; - double Psab =0.0, Psab_dVbs =0.0, Psab_dVds =0.0, Psab_dVgs =0.0, Psab_dT =0.0 ; - double Psti =0.0, Psti_dVbs =0.0, Psti_dVds =0.0, Psti_dVgs =0.0, Psti_dT =0.0 ; - double sq1sti =0.0, sq1sti_dVbs =0.0, sq1sti_dVds =0.0, sq1sti_dVgs =0.0, sq1sti_dT =0.0 ; - double sq2sti =0.0, sq2sti_dVbs =0.0, sq2sti_dVds =0.0, sq2sti_dVgs =0.0, sq2sti_dT =0.0 ; - double Qn0sti =0.0, Qn0sti_dVbs =0.0, Qn0sti_dVds =0.0, Qn0sti_dVgs =0.0, Qn0sti_dT =0.0 ; - double Idssti =0.0, Idssti_dVbs =0.0, Idssti_dVds =0.0, Idssti_dVgs =0.0, Idssti_dT=0.0 ; - /* constants */ - double beta =0.0, beta_dT =0.0 ; - double beta_inv =0.0, beta_inv_dT =0.0 ; - double beta2 =0.0 ; - double Pb2 =0.0, Pb2_dT =0.0 ; - double Pb20 =0.0 ; - double Pb2c =0.0 ; - double Vfb =0.0 ; - double c_eox =0.0 ; - double Leff =0.0, Weff =0.0, WeffLD_nf =0.0 ; - double Ldrift0 =0.0 ; - double q_Nsub =0.0 ; - /* PART-1 */ - /* Accumulation zone */ - double Psa =0.0 ; - double Psa_dVbs =0.0, Psa_dVds =0.0, Psa_dVgs =0.0, Psa_dT =0.0 ; - /* CLM*/ - double Psdl =0.0, Psdl_dVbs =0.0, Psdl_dVds =0.0, Psdl_dVgs =0.0, Psdl_dT =0.0 ; - double Lred =0.0, Lred_dVbs =0.0, Lred_dVds =0.0, Lred_dVgs =0.0, Lred_dT =0.0 ; - double Lch =0.0, Lch_dVbs =0.0, Lch_dVds =0.0, Lch_dVgs =0.0, Lch_dT =0.0 ; - double Wd =0.0, Wd_dVbs =0.0, Wd_dVds =0.0, Wd_dVgs =0.0, Wd_dT =0.0 ; - double Aclm =0.0 ; - /* Pocket Implant */ - double Vthp=0.0, Vthp_dVb=0.0, Vthp_dVd=0.0, Vthp_dVg =0.0, Vthp_dT =0.0 ; - double dVthLP=0.0, dVthLP_dVb=0.0, dVthLP_dVd=0.0, dVthLP_dVg =0.0, dVthLP_dT =0.0 ; - double bs12=0.0, bs12_dVb=0.0, bs12_dVd =0.0, bs12_dVg =0.0, bs12_dT =0.0 ; - double Qbmm=0.0, Qbmm_dVb=0.0, Qbmm_dVd =0.0, Qbmm_dVg =0.0, Qbmm_dT =0.0 ; - double dqb=0.0, dqb_dVb=0.0, dqb_dVg=0.0, dqb_dVd =0.0, dqb_dT =0.0 ; - double Vdx=0.0, Vdx_dVbs=0.0, Vdx_dT=0.0 ; - double Vdx2=0.0, Vdx2_dVbs=0.0, Vdx2_dT=0.0 ; - double Pbsum=0.0, Pbsum_dVb=0.0, Pbsum_dVd=0.0, Pbsum_dVg =0.0, Pbsum_dT =0.0 ; - double sqrt_Pbsum =0.0 ; - /* Poly-Depletion Effect */ - const double pol_b = 1.0 ; - double dPpg =0.0, dPpg_dVb =0.0, dPpg_dVd =0.0, dPpg_dVg =0.0, dPpg_dT = 0.0 ; - /* Quantum Effect */ - double Tox =0.0, Tox_dVb =0.0, Tox_dVd =0.0, Tox_dVg =0.0, Tox_dT =0.0 ; - double dTox =0.0, dTox_dVb =0.0, dTox_dVd =0.0, dTox_dVg =0.0, dTox_dT =0.0 ; - double Cox =0.0, Cox_dVb =0.0, Cox_dVd =0.0, Cox_dVg =0.0, Cox_dT =0.0 ; - double Cox_inv =0.0, Cox_inv_dVb =0.0, Cox_inv_dVd =0.0, Cox_inv_dVg =0.0, Cox_inv_dT =0.0 ; - double Tox0 =0.0, Cox0 =0.0, Cox0_inv =0.0 ; - double Vthq=0.0, Vthq_dVb =0.0, Vthq_dVd =0.0 ; - /* Igate , Igidl , Igisl */ - const double igate_dlt = 1.0e-2 / C_cm2m ; - const double gidlvds_dlt = 1.0e-5 ; - const double gidla = 100.0 ; - double Psdlz =0.0, Psdlz_dVbs =0.0, Psdlz_dVds =0.0, Psdlz_dVgs =0.0, Psdlz_dT =0.0 ; - double Egp12 =0.0, Egp12_dT =0.0 ; - double Egp32 =0.0, Egp32_dT =0.0 ; - double E1 =0.0, E1_dVb =0.0, E1_dVd =0.0, E1_dVg =0.0, E1_dT =0.0 ; - double Etun =0.0, Etun_dVbs =0.0, Etun_dVds =0.0, Etun_dVgs =0.0, Etun_dT =0.0 ; - double Vdsp=0.0, Vdsp_dVd =0.0 ; - double Egidl =0.0, Egidl_dVb =0.0, Egidl_dVd =0.0, Egidl_dVg =0.0, Egidl_dT =0.0 ; - double Egisl =0.0, Egisl_dVb =0.0, Egisl_dVd =0.0, Egisl_dVg =0.0, Egisl_dT =0.0 ; - double Igate =0.0, Igate_dVbs =0.0, Igate_dVds =0.0, Igate_dVgs =0.0, Igate_dT =0.0 ; - double Igs =0.0, Igs_dVbs =0.0, Igs_dVds =0.0, Igs_dVgs =0.0, Igs_dT =0.0 ; - double Igd =0.0, Igd_dVbs =0.0, Igd_dVds =0.0, Igd_dVgs =0.0, Igd_dT =0.0 ; - double Igb =0.0, Igb_dVbs =0.0, Igb_dVds =0.0, Igb_dVgs =0.0, Igb_dT =0.0 ; - double Igidl =0.0, Igidl_dVbs =0.0, Igidl_dVds =0.0, Igidl_dVgs =0.0, Igidl_dT =0.0 ; - double Igisl =0.0, Igisl_dVbs =0.0, Igisl_dVds =0.0, Igisl_dVgs =0.0, Igisl_dT =0.0 ; - double Vdb =0.0, Vsb =0.0 ; - /* connecting function */ - double FD2 =0.0, FD2_dVbs =0.0, FD2_dVds =0.0, FD2_dVgs =0.0, FD2_dT =0.0 ; - double FMDVDS =0.0, FMDVDS_dVbs =0.0, FMDVDS_dVds =0.0, FMDVDS_dVgs =0.0, FMDVDS_dT =0.0 ; - - double cnst0 =0.0, cnst0_dT =0.0; - double cnst1 =0.0, cnst1_dT =0.0; - double cnstCoxi =0.0, cnstCoxi_dVb =0.0, cnstCoxi_dVd =0.0, cnstCoxi_dVg =0.0, cnstCoxi_dT =0.0 ; - double fac1 =0.0, fac1_dVbs =0.0, fac1_dVds =0.0, fac1_dVgs =0.0, fac1_dT =0.0 ; - double fac1p2 =0.0, fac1p2_dT =0.0 ; - double fs01 =0.0, fs01_dVbs =0.0, fs01_dVds =0.0, fs01_dVgs =0.0, fs01_dT =0.0, fs01_dPs0 =0.0 ; - double fs02 =0.0, fs02_dVbs =0.0, fs02_dVds =0.0, fs02_dVgs =0.0, fs02_dT =0.0, fs02_dPs0 =0.0 ; - double fsl1 =0.0, fsl1_dVbs =0.0, fsl1_dVds =0.0, fsl1_dVgs =0.0, fsl1_dT =0.0, fsl1_dPsl =0.0 ; - double fsl2 =0.0, fsl2_dVbs =0.0, fsl2_dVds =0.0, fsl2_dVgs =0.0, fsl2_dT =0.0, fsl2_dPsl =0.0 ; - double cfs1 =0.0, cfs1_dT =0.0 ; - double fb =0.0, fb_dChi =0.0 ; - double fi =0.0, fi_dChi =0.0 ; - double exp_Chi =0.0, exp_Chi_dT =0.0 ; - double exp_Rho =0.0, exp_Rho_dT =0.0 ; - double exp_bVbs =0.0, exp_bVbs_dT =0.0 ; - double exp_bVbsVds =0.0, exp_bVbsVds_dT =0.0 ; - double exp_bPs0 =0.0, exp_bPs0_dT =0.0 ; - double Fs0 =0.0, Fs0_dPs0 =0.0 ; - double Fsl =0.0, Fsl_dPsl =0.0 ; - double dPs0 =0.0, dPsl =0.0 ; - double Qn0 =0.0, Qn0_dVbs =0.0, Qn0_dVds =0.0, Qn0_dVgs =0.0, Qn0_dT =0.0 ; - double Qb0 =0.0, Qb0_dVb =0.0, Qb0_dVd =0.0, Qb0_dVg =0.0, Qb0_dT =0.0 ; - double Qbnm =0.0, Qbnm_dVbs =0.0, Qbnm_dVds =0.0, Qbnm_dVgs =0.0, Qbnm_dT =0.0 ; - double DtPds =0.0, DtPds_dVbs =0.0, DtPds_dVds =0.0, DtPds_dVgs =0.0, DtPds_dT =0.0 ; - double Qinm =0.0, Qinm_dVbs =0.0, Qinm_dVds =0.0, Qinm_dVgs =0.0, Qinm_dT =0.0 ; - double Qidn =0.0, Qidn_dVbs =0.0, Qidn_dVds =0.0, Qidn_dVgs =0.0, Qidn_dT =0.0 ; - double Qdnm =0.0, Qdnm_dVbs =0.0, Qdnm_dVds =0.0, Qdnm_dVgs =0.0, Qdnm_dT =0.0 ; - double Qddn =0.0, Qddn_dVbs =0.0, Qddn_dVds =0.0, Qddn_dVgs =0.0, Qddn_dT =0.0 ; - double Quot =0.0 ; - double Qdrat =0.5, Qdrat_dVbs =0.0, Qdrat_dVds =0.0, Qdrat_dVgs =0.0, Qdrat_dT =0.0 ; - double Idd =0.0, Idd_dVbs =0.0, Idd_dVds =0.0, Idd_dVgs =0.0, Idd_dT =0.0 ; - double Idd1 =0.0, Idd1_dVbs =0.0, Idd1_dVds =0.0, Idd1_dVgs =0.0, Idd1_dT =0.0 ; - double Fdd =0.0, Fdd_dVbs =0.0, Fdd_dVds =0.0, Fdd_dVgs =0.0, Fdd_dT =0.0 ; - double Eeff =0.0, Eeff_dVbs =0.0, Eeff_dVds =0.0, Eeff_dVgs =0.0, Eeff_dT =0.0 ; - double Rns =0.0, Rns_dT =0.0 ; - double Mu = 0.0, Mu_dVbs =0.0, Mu_dVds =0.0, Mu_dVgs =0.0, Mu_dT =0.0 ; - double Muun =0.0, Muun_dVbs =0.0, Muun_dVds =0.0, Muun_dVgs =0.0, Muun_dT =0.0 ; - double Ey =0.0, Ey_dVbs =0.0, Ey_dVds =0.0, Ey_dVgs =0.0, Ey_dT =0.0 ; - double Em =0.0, Em_dVbs =0.0, Em_dVds =0.0, Em_dVgs =0.0, Em_dT =0.0 ; - double Vmax =0.0, Vmax_dT =0.0 ; - double Eta =0.0, Eta_dVbs =0.0, Eta_dVds =0.0, Eta_dVgs =0.0, Eta_dT =0.0 ; - double Eta1 =0.0, Eta1_dT =0.0 ; - double Eta1p12 =0.0, Eta1p12_dT =0.0 ; - double Eta1p32 =0.0, Eta1p32_dT =0.0 ; - double Eta1p52 =0.0, Eta1p52_dT =0.0 ; - double Zeta12 =0.0, Zeta12_dT =0.0 ; - double Zeta32 =0.0, Zeta32_dT =0.0 ; - double Zeta52 =0.0, Zeta52_dT =0.0 ; - double F00 =0.0, F00_dVbs =0.0, F00_dVds =0.0, F00_dVgs =0.0, F00_dT =0.0 ; - double F10 =0.0, F10_dVbs =0.0, F10_dVds =0.0, F10_dVgs =0.0, F10_dT =0.0 ; - double F30 =0.0, F30_dVbs =0.0, F30_dVds =0.0, F30_dVgs =0.0, F30_dT =0.0 ; - double F11 =0.0, F11_dVbs =0.0, F11_dVds =0.0, F11_dVgs =0.0, F11_dT =0.0 ; - double Vgs_min =0.0 ; - double Ps0_min =0.0, Ps0_min_dVbs =0.0, Ps0_min_dVds =0.0, Ps0_min_dVgs =0.0, Ps0_min_dT =0.0 ; - double Acn =0.0, Acn_dVbs =0.0, Acn_dVds =0.0, Acn_dVgs =0.0, Acn_dT =0.0 ; - double Acd =0.0, Acd_dVbs =0.0, Acd_dVds =0.0, Acd_dVgs =0.0, Acd_dT =0.0 ; - double Ac1 =0.0, Ac1_dVbs =0.0, Ac1_dVds =0.0, Ac1_dVgs =0.0, Ac1_dT =0.0 ; - double Ac2 =0.0, Ac2_dVbs =0.0, Ac2_dVds =0.0, Ac2_dVgs =0.0, Ac2_dT =0.0 ; - double Ac3 =0.0, Ac3_dVbs =0.0, Ac3_dVds =0.0, Ac3_dVgs =0.0, Ac3_dT =0.0 ; - double Ac4 =0.0, Ac4_dVbs =0.0, Ac4_dVds =0.0, Ac4_dVgs =0.0, Ac4_dT =0.0 ; - double Ac31 =0.0, Ac31_dVbs =0.0, Ac31_dVds =0.0, Ac31_dVgs =0.0, Ac31_dT =0.0 ; - double Ac41 =0.0, Ac41_dT =0.0 ; - double ninvd_dT =0.0 ; - /* PART-2 (Isub) */ - double Isub =0.0, Isub_dVbs =0.0, Isub_dVds =0.0, Isub_dVgs =0.0, Isub_dT=0.0 ; - double IsubLD =0.0, IsubLD_dVbs =0.0, IsubLD_dVds =0.0, IsubLD_dVgs =0.0, IsubLD_dT=0.0 ; - double IsubLD_dVddp = 0.0 ; - double Psislsat =0.0, Psislsat_dVb =0.0, Psislsat_dVd =0.0, Psislsat_dVg =0.0, Psislsat_dT =0.0 ; - double Psisubsat =0.0, Psisubsat_dVb =0.0, Psisubsat_dVd =0.0, Psisubsat_dVg =0.0, Psisubsat_dT =0.0 ; - double Ifn =0.0, Ifn_dVb =0.0, Ifn_dVd=0.0, Ifn_dVg=0.0, Ifn_dT = 0.0 ; - double Eg12=0.0, Eg32 =0.0 ; - /* PART-3 (overlap) */ - /* const double cov_dlt = 1.0e-1 ; */ - /* const double covvgmax = 5.0 ; */ - double cov_slp =0.0, cov_mag =0.0 ; - double Qgos =0.0, Qgos_dVbs =0.0, Qgos_dVds =0.0, Qgos_dVgs =0.0, Qgos_dT =0.0 ; - double Qgod =0.0, Qgod_dVbs =0.0, Qgod_dVds =0.0, Qgod_dVgs =0.0, Qgod_dT =0.0 ; - double Qgbo =0.0, Qgbo_dVbs =0.0, Qgbo_dVds =0.0, Qgbo_dVgs =0.0, Qgbo_dT = 0.0 ; - double Cgdo =0.0, Cgso =0.0, Cgbo_loc =0.0 ; - double Qgso =0.0, Qgso_dVbse =0.0, Qgso_dVdse =0.0, Qgso_dVgse =0.0 ; - double Qgdo =0.0, Qgdo_dVbse =0.0, Qgdo_dVdse =0.0, Qgdo_dVgse =0.0 ; - /* fringe capacitance */ - double Qfd =0.0, Cfd =0.0 ; - double Qfs =0.0, Cfs =0.0 ; - /* Cqy */ - double Ec =0.0, Ec_dVbs =0.0, Ec_dVds =0.0, Ec_dVgs =0.0, Ec_dT =0.0 ; - double Pslk =0.0, Pslk_dVbs =0.0, Pslk_dVds =0.0, Pslk_dVgs =0.0, Pslk_dT =0.0 ; - double Qy =0.0, Qy_dVbs =0.0, Qy_dVds =0.0, Qy_dVgs =0.0, Qy_dT =0.0 ; - - /* PART-5 (NQS) */ - double tau =0.0, tau_dVbs=0.0, tau_dVds=0.0, tau_dVgs =0.0, tau_dT=0.0 ; - double taub =0.0, taub_dVbs=0.0, taub_dVds=0.0, taub_dVgs =0.0, taub_dT =0.0 ; - /* PART-6 (noise) */ - /* 1/f */ - double NFalp =0.0, NFtrp =0.0, Cit =0.0, Nflic =0.0 ; - /* thermal */ - double Eyd =0.0, Mu_Ave= 0.0, Nthrml =0.0, Mud_hoso =0.0 ; - /* induced gate noise ( Part 0/3 ) */ - double kusai00 =0.0, kusaidd =0.0, kusaiL =0.0, kusai00L =0.0 ; - int flg_ign = 0 ; - double sqrtkusaiL =0.0, kusai_ig =0.0, gds0_ign =0.0, gds0_h2 =0.0, GAMMA =0.0, crl_f =0.0 ; - const double c_sqrt_15 =3.872983346207417e0 ; /* sqrt(15) */ - const double Cox_small =1.0e-6 ; - const double c_16o135 =1.185185185185185e-1 ; /* 16/135 */ - double Nign0 =0.0, MuModA =0.0, MuModB =0.0, correct_w1 =0.0 ; - - /* usage of previously calculated values */ - double vtol_pprv =1.01e-1 ; - double Vbsc_dif =0.0, Vdsc_dif =0.0, Vgsc_dif =0.0, sum_vdif =0.0 ; - double Vbsc_dif2 =0.0, Vdsc_dif2 =0.0, Vgsc_dif2 =0.0, sum_vdif2 =0.0 ; - double dVbs =0.0, dVds =0.0, dVgs =0.0 ; - - /* temporary vars. & derivatives*/ - double TX =0.0, TX_dVbs =0.0, TX_dVds =0.0, TX_dVgs =0.0, TX_dT =0.0 ; - double TY =0.0, TY_dVbs =0.0, TY_dVds =0.0, TY_dVgs =0.0, TY_dT =0.0 ; - double T0 =0.0, T0_dVb =0.0, T0_dVd =0.0, T0_dVg =0.0, T0_dT =0.0 ; - double T1 =0.0, T1_dVb =0.0, T1_dVd =0.0, T1_dVg =0.0, T1_dT =0.0, T1_dVdse_eff =0.0 ; - double T2 =0.0, T2_dVb =0.0, T2_dVd =0.0, T2_dVg =0.0, T2_dT =0.0 ; - double T3 =0.0, T3_dVb =0.0, T3_dVd =0.0, T3_dVg =0.0, T3_dT =0.0 ; - double T4 =0.0, T4_dVb =0.0, T4_dVd =0.0, T4_dVg =0.0, T4_dT =0.0 ; - double T5 =0.0, T5_dVb =0.0, T5_dVd =0.0, T5_dVg =0.0, T5_dT =0.0 ; - double T6 =0.0, T6_dVb =0.0, T6_dVd =0.0, T6_dVg =0.0, T6_dT =0.0 ; - double T7 =0.0, T7_dVb =0.0, T7_dVd =0.0, T7_dVg =0.0, T7_dT =0.0 ; - double T8 =0.0, T8_dVb =0.0, T8_dVd =0.0, T8_dVg =0.0, T8_dT =0.0 ; - double T9 =0.0, T9_dVb =0.0, T9_dVd =0.0, T9_dVg =0.0, T9_dT =0.0, T9_dVdse_eff =0.0 ; - double T10 =0.0, T10_dVb =0.0, T10_dVd =0.0, T10_dVg =0.0, T10_dT =0.0 ; - double T11 =0.0, T11_dT =0.0 ; - double T12 =0.0; - double T15 =0.0, T16 =0.0, T17 =0.0 ; - double T4_dVb_dT, T5_dVb_dT, T6_dVb_dT, T7_dVb_dT ; - double T1_dVddp = 0.0 , T2_dVddp = 0.0 ; - double T0_dVddp = 0.0 , T3_dVddp = 0.0, T4_dVddp = 0.0 ; - - - int flg_zone =0 ; - - /* Vdseff */ - double Vdseff =0.0, Vdseff_dVbs =0.0, Vdseff_dVds =0.0, Vdseff_dVgs =0.0, Vdseff_dT =0.0 ; - double Vdsorg =0.0 ; - - /* D/S Overlap Charges: Qovd/Qovs */ - double CVDSOVER =0.0 ; - double Qovdext =0.0, Qovdext_dVbse =0.0, Qovdext_dVdse =0.0, Qovdext_dVgse =0.0, Qovdext_dT =0.0 ; - double Qovsext =0.0, Qovsext_dVbse =0.0, Qovsext_dVdse =0.0, Qovsext_dVgse =0.0, Qovsext_dT =0.0 ; - double Qovd =0.0, Qovd_dVbs =0.0, Qovd_dVds =0.0, Qovd_dVgs =0.0, Qovd_dT =0.0 ; - double Qovs =0.0, Qovs_dVbs =0.0, Qovs_dVds =0.0, Qovs_dVgs =0.0, Qovs_dT =0.0 ; - double QbuLD =0.0, QbuLD_dVbs =0.0, QbuLD_dVds =0.0, QbuLD_dVgs =0.0, QbuLD_dT =0.0 ; - double QbdLD =0.0, QbdLD_dVbs =0.0, QbdLD_dVds =0.0, QbdLD_dVgs =0.0, QbdLD_dT =0.0 ; - double QbsLD =0.0, QbsLD_dVbs =0.0, QbsLD_dVds =0.0, QbsLD_dVgs =0.0, QbsLD_dT =0.0 ; - double QodAD =0.0, QodAD_dVbs =0.0, QodAD_dVds =0.0, QodAD_dVgs =0.0, QodAD_dT =0.0 ; - double QosAD =0.0, QosAD_dVbs =0.0, QosAD_dVds =0.0, QosAD_dVgs =0.0, QosAD_dT =0.0 ; - double QbdLDext =0.0, QbdLDext_dVbse =0.0, QbdLDext_dVdse =0.0, QbdLDext_dVgse =0.0, QbdLDext_dT =0.0 ; - double QbsLDext =0.0, QbsLDext_dVbse =0.0, QbsLDext_dVdse =0.0, QbsLDext_dVgse =0.0, QbsLDext_dT =0.0 ; - - /* Vgsz for SCE and PGD */ - double Vbsz2 =0.0, Vbsz2_dVbs =0.0, Vbsz2_dVds =0.0, Vbsz2_dVgs =0.0 , Vbsz2_dT =0.0; - - /* Multiplication factor * number of gate fingers */ - double Mfactor = here->HSMHV2_m ; - - - /*-----------------------------------------------------------* - * HiSIM-HV - *-----------------*/ - /* bias-dependent Rd, Rs */ - double Rdrift =0.0, Rdrift_dVbse =0.0, Rdrift_dVdse =0.0, Rdrift_dVgse =0.0, Rdrift_dT =0.0 ; - double Rsdrift =0.0, Rsdrift_dVbse =0.0, Rsdrift_dVdse =0.0, Rsdrift_dVgse =0.0, Rsdrift_dT =0.0 ; - double Rd =0.0, Rd_dVbse =0.0, Rd_dVdse =0.0, Rd_dVgse =0.0, Rd_dT =0.0 ; - double Rs =0.0, Rs_dVbse =0.0, Rs_dVdse =0.0, Rs_dVgse =0.0, Rs_dT =0.0 ; - double Ra =0.0, Ra_dVbse =0.0, Ra_dVdse =0.0, Ra_dVgse =0.0 ; - double Ra_dVbs =0.0, Ra_dVds =0.0, Ra_dVgs =0.0 ; - double Ra_dVdse_eff =0.0 ; - const double delta_rd = 10e-3 * C_cm2m ; - const double Ra_N = 20.0; /* smoothing parameter for Ra */ - const double Res_min = 1.0e-4 ; - double Rd0_dT =0.0, Rs0_dT =0.0, Rdvd_dT =0.0, Rsvd_dT =0.0 ; - double Vdse_eff =0.0, Vdse_eff_dVbse =0.0, Vdse_eff_dVdse =0.0, Vdse_eff_dVgse =0.0, - Vdse_eff_dVbs =0.0, Vdse_eff_dVds =0.0, Vdse_eff_dVgs =0.0 ; - double VdseModeNML =0.0, VdseModeRVS =0.0 ; - double Vbsegmt =0.0, Vdsegmt =0.0, Vgsegmt =0.0 ; - double Vbserev =0.0, Vdserev =0.0, Vgserev =0.0 ; - double Ra_alpha, Ra_beta ; - - /* modified external biases for symmetry */ - double Vzadd_ext_dVd = 0.0 ; - double Vdserevz = 0.0, Vdserevz_dVd = 0.0 ; - double Vgserevz = 0.0, Vgserevz_dVd = 0.0 ; - double Vbserevz = 0.0, Vbserevz_dVd = 0.0 ; - - /* Substrate Effect */ - const double RDVSUB = model->HSMHV2_rdvsub ; - const double RDVDSUB = model->HSMHV2_rdvdsub ; - const double DDRIFT = model->HSMHV2_ddrift ; - const double VBISUB = model->HSMHV2_vbisub ; - const double NSUBSUB = modelMKS->HSMHV2_nsubsub ; - double Vsubsrev = 0.0 ; - double Wdep = 0.0, Wdep_dVdserev = 0.0, Wdep_dVsubsrev = 0.0 ; - double T1_dVdserev = 0.0, T1_dVsubsrev = 0.0, T6_dVdserev = 0.0, T6_dVsubsrev = 0.0 ; - double Rs_dVsubs = 0.0, Rd_dVsubs = 0.0, Rdrift_dVsubs = 0.0, Rsdrift_dVsubs = 0.0 ; - - - /* temperature-dependent variables for SHE model */ - double TTEMP =0.0, TTEMP0 =0.0 ; - double Tdiff0 = 0.0, Tdiff0_2 = 0.0, Tdiff = 0.0, Tdiff_2 = 0.0 ; - double Eg =0.0, Eg_dT =0.0 ; - double Nin =0.0, Nin_dT =0.0 ; - - /* Qover 5/1 ckt-bias use */ - double Vgbgmt =0.0, Vgbgmt_dVbs =0.0, Vgbgmt_dVds =0.0, Vgbgmt_dVgs =0.0 ; - double Vxbgmt =0.0, Vxbgmt_dVbs =0.0, Vxbgmt_dVds =0.0, Vxbgmt_dVgs =0.0 ; - double Vxbgmtcl =0.0, Vxbgmtcl_dVxbgmt =0.0, Vxbgmtcl_dT =0.0 ; - - double ModeNML =0.0, ModeRVS =0.0 ; - - double QsuLD =0.0, QsuLD_dVbs =0.0, QsuLD_dVds =0.0, QsuLD_dVgs =0.0, QsuLD_dT =0.0 ; - double QiuLD =0.0, QiuLD_dVbs =0.0, QiuLD_dVds =0.0, QiuLD_dVgs =0.0, QiuLD_dT =0.0 ; - double QidLD =0.0, QidLD_dVbs =0.0, QidLD_dVds =0.0, QidLD_dVgs =0.0, QidLD_dT =0.0 ; - double QisLD =0.0, QisLD_dVbs =0.0, QisLD_dVds =0.0, QisLD_dVgs =0.0, QisLD_dT =0.0 ; - double QidLDext =0.0, QidLDext_dVbse =0.0, QidLDext_dVdse =0.0, QidLDext_dVgse =0.0, QidLDext_dT =0.0 ; - double QisLDext =0.0, QisLDext_dVbse =0.0, QisLDext_dVdse =0.0, QisLDext_dVgse =0.0, QisLDext_dT =0.0 ; - - /* Self heating */ - double mphn0_dT =0.0 ; - double cnst0over_dT =0.0 ; - double cnst0overs_dT =0.0 ; - double Temp_dif =0.0 ; - /* for SCE */ - double ptovr_dT =0.0 ; - - /* IBPC */ - double IdsIBPC =0.0, IdsIBPC_dVbs =0.0, IdsIBPC_dVds =0.0, IdsIBPC_dVgs =0.0, IdsIBPC_dT =0.0, IdsIBPC_dVddp =0.0 ; - - /* Qover */ - int flg_ovzone = 0 ; - double VgpLD =0.0, VgpLD_dVgb =0.0 ; - double Vgb_fb_LD =0.0 ; - double Ac31_dVgb =0.0, Ac31_dVxb =0.0 ; - double Ac1_dVgb =0.0, Ac1_dVxb =0.0 ; - double Ac2_dVgb =0.0, Ac2_dVxb =0.0 ; - double Ac3_dVgb =0.0, Ac3_dVxb =0.0 ; - double Acn_dVgb =0.0, Acn_dVxb =0.0 ; - double Acd_dVgb =0.0, Acd_dVxb =0.0 ; - double Chi_dVgb =0.0, Chi_dVxb =0.0 ; - double Psa_dVgb =0.0, Psa_dVxb =0.0 ; - double QsuLD_dVgb =0.0, QsuLD_dVxb =0.0 ; - double QbuLD_dVgb =0.0, QbuLD_dVxb =0.0 ; - double fs02_dVgb =0.0, fs02_dVxb =0.0 ; - double TX_dVgb =0.0, TX_dVxb =0.0 ; - double TY_dVgb =0.0, TY_dVxb =0.0 ; - double Ps0LD =0.0, Ps0LD_dVgb =0.0, Ps0LD_dVxb =0.0, Ps0LD_dT =0.0 ; - double Ps0LD_dVds =0.0, Ps0LD_dVgs =0.0, Ps0LD_dVbs =0.0 ; - double Pb2over =0.0, Pb2over_dT =0.0 ; - double cnst1over =0.0, cnst1over_dT =0.0 ; - - int flg_overgiven =0 ; - int Coovlps =0, Coovlpd =0 ; - double Lovers =0.0, Loverd =0.0 ; - double Novers =0.0, Noverd =0.0 ; - double Nover_func =0.0 ; - double cnst0over_func =0.0, cnst0over_func_dT =0.0 ; - /* Qover Analytical Model */ - int lp_ld; - double Ta = 9.3868e-3, Tb = -0.1047839 ; - double Tc, Tc_dT ; - double Td, Td_dVxb, Td_dVgb, Td_dT ; - double Tv, Tv_dVxb, Tv_dVgb, Tv_dT ; - double Tu, Tu_dVxb, Tu_dVgb, Tu_dT ; - double Tp, Tp_dT ; - double Tq, Tq_dVxb, Tq_dVgb, Tq_dT ; - double T1_dVxb, T1_dVgb ; - double T5_dVxb, T5_dVgb ; - double VgpLD_shift, VgpLD_shift_dT ; - double VgpLD_shift_dVgb, VgpLD_shift_dVxb, exp_bVbs_dVxb ; - double gamma, gamma_dVxb, gamma_dT ; - double psi , psi_dVgb , psi_dVxb , psi_dT ; - double Chi_A, Chi_A_dVgb, Chi_A_dVxb, Chi_A_dT ; - double Chi_B, Chi_B_dVgb, Chi_B_dVxb, Chi_B_dT ; - - double psi_B =0.0, arg_B =0.0 ; - double Chi_1 =0.0, Chi_1_dVgb =0.0, Chi_1_dVxb =0.0, Chi_1_dT =0.0 ; - - /* global variables for depletion mode MOSFET */ - double Pb2n_dT, Vbipn_dT = 0.0, depmphn0_dT = 0.0, depVmax_dT = 0.0 ; - double Qiu_noi, Qi_noi ; - - - /*================ Start of executable code.=================*/ - - - if (here->HSMHV2_mode == HiSIM_NORMAL_MODE) { - ModeNML = 1.0 ; - ModeRVS = 0.0 ; - } else { - ModeNML = 0.0 ; - ModeRVS = 1.0 ; - } - - T1 = Vdse + Vgse + Vbse + Vds + Vgs + Vbs + vbd_jct + vbs_jct ; - if ( ! finite (T1) ) { - fprintf (stderr , - "*** warning(HiSIM_HV(%s)): Unacceptable Bias(es).\n",model->HSMHV2modName ) ; - fprintf (stderr , "----- bias information (HiSIM_HV)\n" ) ; - fprintf (stderr , "name: %s\n" , here->HSMHV2name ) ; - fprintf (stderr , "states: %d\n" , here->HSMHV2states ) ; - fprintf (stderr , "Vdse= %.3e Vgse=%.3e Vbse=%.3e\n" - , Vdse , Vgse , Vbse ) ; - fprintf (stderr , "Vdsi= %.3e Vgsi=%.3e Vbsi=%.3e\n" - , Vds , Vgs , Vbs ) ; - fprintf (stderr , "vbs_jct= %12.5e vbd_jct= %12.5e\n" - , vbs_jct , vbd_jct ) ; - fprintf (stderr , "vd= %.3e vs= %.3e vdp= %.3e vgp= %.3e vbp= %.3e vsp= %.3e\n" - , *( ckt->CKTrhsOld + here->HSMHV2dNode ) - , *( ckt->CKTrhsOld + here->HSMHV2sNode ) - , *( ckt->CKTrhsOld + here->HSMHV2dNodePrime ) - , *( ckt->CKTrhsOld + here->HSMHV2gNodePrime ) - , *( ckt->CKTrhsOld + here->HSMHV2bNodePrime ) - , *( ckt->CKTrhsOld + here->HSMHV2sNodePrime ) ) ; - fprintf (stderr , "----- bias information (end)\n" ) ; - return ( HiSIM_ERROR ) ; - } - - flg_info = model->HSMHV2_info ; - flg_nqs = model->HSMHV2_conqs ; - - /*-----------------------------------------------------------* - * Start of the routine. (label) - *-----------------*/ -/* start_of_routine: */ - - /*-----------------------------------------------------------* - * Temperature dependent constants. - *-----------------*/ - if ( here->HSMHV2tempNode > 0 && pParam->HSMHV2_rth0 != 0.0 ) { - -#define HSMHV2EVAL -#include "hsmhv2temp_eval.h" - - } else { - beta = here->HSMHV2_beta ; - TTEMP = ckt->CKTtemp ; - if ( here->HSMHV2_dtemp_Given ) { TTEMP = TTEMP + here->HSMHV2_dtemp ; } - Eg_dT = 0.0 ; - beta_dT = 0.0 ; - beta_inv_dT = 0.0 ; - mphn0_dT = 0.0 ; - ptovr_dT = 0.0 ; - Vmax_dT = 0.0 ; - Pb2_dT = 0.0 ; - cnst0_dT = 0.0 ; - cnst1_dT = 0.0 ; - Nin_dT = 0.0 ; - - /* depletion MOS */ - Pb2n_dT = 0.0 ; - Vbipn_dT = 0.0 ; - depmphn0_dT = 0.0 ; - depVmax_dT = 0.0 ; - - } - - /* Inverse of the thermal voltage */ - beta_inv = here->HSMHV2_beta_inv ; - beta2 = here->HSMHV2_beta2 ; - - /* Bandgap */ - Egp12 = here->HSMHV2_egp12 ; - Egp32 = here->HSMHV2_egp32 ; - - /* Metallurgical channel geometry */ - Leff = here->HSMHV2_leff ; - Weff = here->HSMHV2_weff ; - WeffLD_nf = here->HSMHV2_weff_ld * here->HSMHV2_nf ; - - Ldrift0 = here->HSMHV2_ldrift1 + here->HSMHV2_ldrift2 ; - - /* Flat band voltage */ - Vfb = pParam->HSMHV2_vfbc ; - - /* Surface impurity profile */ - q_Nsub = here->HSMHV2_qnsub ; - - /* satulation Velocity */ - Vmax = here->HSMHV2_vmax ; - - - /* 2 phi_B */ - Pb2 = here->HSMHV2_pb2 ; - Pb20 = here->HSMHV2_pb20 ; - Pb2c = here->HSMHV2_pb2c ; - - /* Coefficient of the F function for bulk charge */ - cnst0 = here->HSMHV2_cnst0 ; - - /* cnst1: n_{p0} / p_{p0} */ - cnst1 = here->HSMHV2_cnst1 ; - - /* c_eox: Permitivity in ox */ - c_eox = here->HSMHV2_cecox ; - - /* Tox and Cox without QME */ - Tox0 = model->HSMHV2_tox ; - Cox0 = c_eox / Tox0 ; - Cox0_inv = 1.0 / Cox0 ; - - /* for calculation of Ps0_min */ - Vgs_min = model->HSMHV2_type * model->HSMHV2_vgsmin ; - - /*---------------------------------------------------* - * Determine clamping limits for too large Vbs (internal). - *-----------------*/ - - Fn_SU( T1 , Pb2 - model->HSMHV2_vzadd0 , Vbs_max , 0.1 , T0 ) ; - Vbs_max = T1 ; - Vbs_max_dT = Pb2_dT * T0 ; - - if ( Pb20 - model->HSMHV2_vzadd0 < Vbs_max ) { - Vbs_max = Pb20 - model->HSMHV2_vzadd0 ; - Vbs_max_dT = 0.0 ; - } - if ( Pb2c - model->HSMHV2_vzadd0 < Vbs_max ) { - Vbs_max = Pb2c - model->HSMHV2_vzadd0 ; - Vbs_max_dT = 0.0 ; - } - - if ( Vbs_bnd > Vbs_max * 0.5 ) { - Vbs_bnd = 0.5 * Vbs_max ; - Vbs_bnd_dT = 0.5 * Vbs_max_dT ; - } - - - if (here->HSMHV2_rs > 0.0 || here->HSMHV2_rd > 0.0) { - if ( model->HSMHV2_corsrd == 1 ) flg_rsrd = 1 ; - if ( model->HSMHV2_corsrd == 2 ) flg_rsrd = 2 ; - if ( model->HSMHV2_corsrd == 3 ) flg_rsrd = 3 ; - } - - /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ - * PART-1: Basic device characteristics. - *+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ - /*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++* - * Prepare for potential initial guesses using previous values - *++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ - - flg_pprv = 0 ; - - if ( here->HSMHV2_called >= 1 ) { - - Vbsc_dif = Vbs - here->HSMHV2_vbsc_prv ; - Vdsc_dif = Vds - here->HSMHV2_vdsc_prv ; - Vgsc_dif = Vgs- here->HSMHV2_vgsc_prv ; - - sum_vdif = fabs( Vbsc_dif ) + fabs( Vdsc_dif ) - + fabs( Vgsc_dif ) ; - - if ( model->HSMHV2_copprv >= 1 && sum_vdif <= vtol_pprv && - here->HSMHV2_mode * here->HSMHV2_mode_prv > 0 ) { flg_pprv = 1 ;} - - if ( here->HSMHV2_called >= 2 && flg_pprv == 1 ) { - Vbsc_dif2 = here->HSMHV2_vbsc_prv - here->HSMHV2_vbsc_prv2 ; - Vdsc_dif2 = here->HSMHV2_vdsc_prv - here->HSMHV2_vdsc_prv2 ; - Vgsc_dif2 = here->HSMHV2_vgsc_prv - here->HSMHV2_vgsc_prv2 ; - sum_vdif2 = fabs( Vbsc_dif2 ) + fabs( Vdsc_dif2 ) - + fabs( Vgsc_dif2 ) ; - if ( epsm10 < sum_vdif2 && sum_vdif2 <= vtol_pprv && - here->HSMHV2_mode_prv * here->HSMHV2_mode_prv2 > 0 ) { flg_pprv = 2 ; } - } - Temp_dif = TTEMP - here->HSMHV2_temp_prv ; - - } else { - - Vbsc_dif = 0.0 ; - Vdsc_dif = 0.0 ; - Vgsc_dif = 0.0 ; - sum_vdif = 0.0 ; - Vbsc_dif2 = 0.0 ; - Vdsc_dif2 = 0.0 ; - Vgsc_dif2 = 0.0 ; - sum_vdif2 = 0.0 ; - flg_pprv = 0 ; - Temp_dif = 0.0 ; - } - - dVbs = Vbsc_dif ; - dVds = Vdsc_dif ; - dVgs = Vgsc_dif ; - - if ( flg_pprv >= 1 ) { - Ps0 = here->HSMHV2_ps0_prv ; - Ps0_dVbs = here->HSMHV2_ps0_dvbs_prv ; - Ps0_dVds = here->HSMHV2_ps0_dvds_prv ; - Ps0_dVgs = here->HSMHV2_ps0_dvgs_prv ; - - Pds = here->HSMHV2_pds_prv ; - Pds_dVbs = here->HSMHV2_pds_dvbs_prv ; - Pds_dVds = here->HSMHV2_pds_dvds_prv ; - Pds_dVgs = here->HSMHV2_pds_dvgs_prv ; - } - - if( here->HSMHV2_cordrift == 1 && here->HSMHV2subNode >= 0 ) { - /*----------------------------------------------------------* - * Considering these special cases: - * ( here->HSMHV2_mode == HiSIM_NORMAL_MODE && Vdse < 0.0 ) - * ( here->HSMHV2_mode == HiSIM_REVERSE_MODE && Vdse < 0.0 ) - *----------------------------------------------------------*/ - - Vdsegmt = here->HSMHV2_mode * Vdse ; /* geometrical outer bias */ - if ( Vdsegmt >= 0.0 ) { /* vdse normal mode */ - Vdserev = Vdsegmt ; - Vsubsrev = Vsubs ; - } else { /* vdse reverse mode */ - Vdserev = - Vdsegmt ; - Vsubsrev = Vsubs - Vdsegmt ; - } - here->HSMHV2_Vsubsrev = Vsubsrev ; - - /*-----------------------------------------------------------* - * Vxserevz: Modified bias introduced to realize symmetry at Vds=0. - *-----------------*/ - Fn_SymAdd( Vzadd , Vdserev / 2 , model->HSMHV2_vzadd0 , T2 ) ; - Vzadd_ext_dVd = T2 / 2 ; - if ( Vzadd < ps_conv ) { - Vzadd = ps_conv ; - Vzadd_ext_dVd = 0.0 ; - } - Vdserevz = Vdserev + 2.0 * Vzadd ; - Vdserevz_dVd = 1.0 + 2.0 * Vzadd_ext_dVd ; - here->HSMHV2_Vdserevz = Vdserevz ; - here->HSMHV2_Vdserevz_dVd = Vdserevz_dVd ; - - } - - if ( flg_rsrd == 1 || flg_rsrd == 3 ) { - - /*----------------------------------------------------------* - * Considering these special cases: - * ( here->HSMHV2_mode == HiSIM_NORMAL_MODE && Vdse < 0.0 ) - * ( here->HSMHV2_mode == HiSIM_REVERSE_MODE && Vdse < 0.0 ) - *----------------------------------------------------------*/ - - Vdsegmt = here->HSMHV2_mode * Vdse ; /* geometrical outer bias */ - Vgsegmt = Vgse - ModeRVS * Vdse ; /* geometrical outer bias */ - Vbsegmt = Vbse - ModeRVS * Vdse ; /* geometrical outer bias */ - if ( Vdsegmt >= 0.0 ) { /* vdse normal mode */ - VdseModeNML = 1 ; - VdseModeRVS = 0 ; - Vdserev = Vdsegmt ; - Vgserev = Vgsegmt ; - Vbserev = Vbsegmt ; - Vsubsrev = Vsubs ; - } else { /* vdse reverse mode */ - VdseModeNML = 0 ; - VdseModeRVS = 1 ; - Vdserev = - Vdsegmt ; - Vgserev = Vgsegmt - Vdsegmt ; - Vbserev = Vbsegmt - Vdsegmt ; - Vsubsrev = Vsubs - Vdsegmt ; - } - - if ( here->HSMHV2_rdvd > 0.0 || here->HSMHV2_rsvd > 0.0 || pParam->HSMHV2_rdvg11 > 0.0 || pParam->HSMHV2_rdvb > 0.0 || here->HSMHV2subNode >= 0 ) { - /*-----------------------------------------------------------* - * Vxserevz: Modified bias introduced to realize symmetry at Vds=0. - *-----------------*/ - Fn_SymAdd( Vzadd , Vdserev / 2 , model->HSMHV2_vzadd0 , T2 ) ; - Vzadd_ext_dVd = T2 / 2 ; - if ( Vzadd < ps_conv ) { - Vzadd = ps_conv ; - Vzadd_ext_dVd = 0.0 ; - } - Vdserevz = Vdserev + 2.0 * Vzadd ; - Vdserevz_dVd = 1.0 + 2.0 * Vzadd_ext_dVd ; - Vgserevz = Vgserev + Vzadd ; - Vgserevz_dVd = Vzadd_ext_dVd ; - Vbserevz = Vbserev + Vzadd ; - Vbserevz_dVd = Vzadd_ext_dVd ; - - /* bias-dependent Rdrift for HVMOS/LDMOS */ - - if ( model->HSMHV2_cosym == 1 || VdseModeNML == 1 ) { /* HVMOS or normal mode LDMOS: */ - /* ... Vdse dependence */ - T1 = VdseModeNML * here->HSMHV2_rd + VdseModeRVS * here->HSMHV2_rs ; - T1_dT = VdseModeNML * Rd0_dT + VdseModeRVS * Rs0_dT ; - T0 = VdseModeNML * here->HSMHV2_rdvd + VdseModeRVS * here->HSMHV2_rsvd ; - T0_dT = VdseModeNML * Rdvd_dT + VdseModeRVS * Rsvd_dT ; - T4 = T1 + T0 * Vdserevz ; - T4_dVd = T0 * Vdserevz_dVd ; - T4_dT = T1_dT + T0_dT * Vdserevz ; - - /* ... Vgse dependence */ - T10 = model->HSMHV2_rdvg12 + small ; - T1 = T4 * ( 1.0 + pParam->HSMHV2_rdvg11 * ( 1.0 - Vgserevz / T10 ) ) ; - T1_dVd = T4_dVd * ( 1.0 + pParam->HSMHV2_rdvg11 * ( 1.0 - Vgserevz / T10 ) ) - + T4 * pParam->HSMHV2_rdvg11 * ( - Vgserevz_dVd / T10 ) ; - T1_dVg = T4 * pParam->HSMHV2_rdvg11 * ( - 1.0 ) / T10 ; - T1_dT = T4_dT * ( 1.0 + pParam->HSMHV2_rdvg11 * ( 1.0 - Vgserevz / T10 ) ) ; - Fn_SL2( T2 , T1 , T4 , rdsl2_dlt , T0 , T5 ) ; - T2_dVd = T0 * T1_dVd + T5 * T4_dVd ; - T2_dVg = T0 * T1_dVg ; - T2_dT = T0 * T1_dT + T5 * T4_dT ; - - T3 = T4 * ( 1.0 + pParam->HSMHV2_rdvg11 ) ; - T3_dVd = T4_dVd * ( 1.0 + pParam->HSMHV2_rdvg11 ) ; - T3_dT = T4_dT * ( 1.0 + pParam->HSMHV2_rdvg11 ) ; - Fn_SU2( Rdrift , T2 , T3 , rdsu2_dlt , T0, T5 ) ; - Rdrift_dVdse = T0 * T2_dVd + T5 * T3_dVd ; - Rdrift_dVgse = T0 * T2_dVg ; - Rdrift_dT = T0 * T2_dT + T5 * T3_dT ; - - /* ... Vbse dependence */ - T1 = 1.0 - pParam->HSMHV2_rdvb * Vbserevz ; - T1_dVb = - pParam->HSMHV2_rdvb ; - T1_dVd = - pParam->HSMHV2_rdvb * Vbserevz_dVd ; - Fn_SZ( T3 , T1 , rdsz_dlt , T4 ) ; - T3 += small ; - T3_dVb = T4 * T1_dVb ; - T3_dVd = T4 * T1_dVd ; - T0 = Rdrift ; - Rdrift = Rdrift * T3 ; - Rdrift_dVdse = Rdrift_dVdse * T3 + T0 * T3_dVd ; - Rdrift_dVgse = Rdrift_dVgse * T3 ; - Rdrift_dVbse = + T0 * T3_dVb ; - Rdrift_dT = Rdrift_dT * T3 ; - - } else { /* reverse mode LDMOS: */ - Rdrift = here->HSMHV2_rs ; - Rdrift_dVdse = 0.0 ; - Rdrift_dVgse = 0.0 ; - Rdrift_dVbse = 0.0 ; - Rdrift_dT = Rs0_dT ; - } - - - /* Rsdrift */ - T4 = ( VdseModeNML * here->HSMHV2_rs + VdseModeRVS * here->HSMHV2_rd ) ; - T4_dT = VdseModeNML * Rs0_dT + VdseModeRVS * Rd0_dT ; - T4_dVd = 0.0 ; - - if ( model->HSMHV2_cosym == 1 || VdseModeRVS == 1 ) { /* HVMOS or reverse mode LDMOS: */ - /* ... Vdse dependence */ - T0 = VdseModeNML * here->HSMHV2_rsvd + VdseModeRVS * here->HSMHV2_rdvd ; - T0_dT = VdseModeNML * Rsvd_dT + VdseModeRVS * Rdvd_dT ; - T4 = T4 + T0 * ( 2.0 * model->HSMHV2_vzadd0 ) ; - T4_dT = T4_dT + T0_dT * ( 2.0 * model->HSMHV2_vzadd0 ) ; - - /* ... Vgse dependence */ - T10 = model->HSMHV2_rdvg12 + small ; - T1 = T4 * ( 1.0 + pParam->HSMHV2_rdvg11 * ( 1.0 - Vgserevz / T10 ) ) ; - T1_dVd = T4_dVd * ( 1.0 + pParam->HSMHV2_rdvg11 * ( 1.0 - Vgserevz / T10 ) ) - + T4 * pParam->HSMHV2_rdvg11 * ( - Vgserevz_dVd / T10 ) ; - T1_dVg = T4 * pParam->HSMHV2_rdvg11 * ( - 1.0 ) / T10 ; - T1_dT = T4_dT * ( 1.0 + pParam->HSMHV2_rdvg11 * ( 1.0 - Vgserevz / T10 ) ) ; - Fn_SL2( T2 , T1 , T4 , rdsl2_dlt , T0 , T5 ) ; - T2_dVd = T0 * T1_dVd + T5 * T4_dVd ; - T2_dVg = T0 * T1_dVg ; - T2_dT = T0 * T1_dT + T5 * T4_dT ; - - T3 = T4 * ( 1.0 + pParam->HSMHV2_rdvg11 ) ; - T3_dVd = T4_dVd * ( 1.0 + pParam->HSMHV2_rdvg11 ) ; - T3_dT = T4_dT * ( 1.0 + pParam->HSMHV2_rdvg11 ) ; - Fn_SU2( Rsdrift , T2 , T3 , rdsu2_dlt , T0, T5 ) ; - Rsdrift_dVdse = T0 * T2_dVd + T5 * T3_dVd ; - Rsdrift_dVgse = T0 * T2_dVg ; - Rsdrift_dT = T0 * T2_dT + T5 * T3_dT ; - - /* ... Vbse dependence */ - T1 = 1.0 - pParam->HSMHV2_rdvb * Vbserevz ; - T1_dVb = - pParam->HSMHV2_rdvb ; - T1_dVd = - pParam->HSMHV2_rdvb * Vbserevz_dVd ; - Fn_SZ( T3 , T1 , rdsz_dlt , T4 ) ; - T3 += small ; - T3_dVb = T4 * T1_dVb ; - T3_dVd = T4 * T1_dVd ; - T0 = Rsdrift ; - Rsdrift = Rsdrift * T3 ; - Rsdrift_dVdse = Rsdrift_dVdse * T3 + T0 * T3_dVd ; - Rsdrift_dVgse = Rsdrift_dVgse * T3 ; - Rsdrift_dVbse = + T0 * T3_dVb ; - Rsdrift_dT = Rsdrift_dT * T3 ; - } else { /* LDMOS normal mode: */ - Rsdrift = here->HSMHV2_rs ; - Rsdrift_dVdse = 0.0 ; - Rsdrift_dVgse = 0.0 ; - Rsdrift_dVbse = 0.0 ; - Rsdrift_dT = Rs0_dT ; - } - - - if ( here->HSMHV2subNode >= 0 && model->HSMHV2_cosym == 0 && - ( pParam->HSMHV2_nover * ( NSUBSUB + pParam->HSMHV2_nover ) ) > 0 ) { - /* external substrate node exists && LDMOS case: */ - /* Substrate Effect */ - T0 = VBISUB - RDVDSUB * Vdserevz - RDVSUB * Vsubsrev ; - Fn_SZ( T1, T0, 10.0, T2 ) ; - T1 += epsm10 ; - - T1_dVdserev = - RDVDSUB * Vdserevz_dVd * T2 ; - T1_dVsubsrev = - RDVSUB * T2 ; - - T0 = NSUBSUB / ( pParam->HSMHV2_nover * ( NSUBSUB + pParam->HSMHV2_nover ) ) ; - T4 = 2 * C_ESI / C_QE * T0 ; - Wdep = sqrt ( T4 * T1 ) + small ; - Wdep_dVdserev = 0.5 * T4 * T1_dVdserev / Wdep ; - Wdep_dVsubsrev = 0.5 * T4 * T1_dVsubsrev / Wdep ; - - Fn_SU( Wdep, Wdep, DDRIFT, C_sub_delta * DDRIFT, T0 ) ; - Wdep_dVdserev *= T0 ; - Wdep_dVsubsrev *= T0 ; - - T0 = DDRIFT - Wdep ; - Fn_SZ( T0, T0, C_sub_delta2, T2 ) ; - T0 += epsm10; - T6 = Ldrift0 / T0 ; - T6_dVdserev = T2 * Wdep_dVdserev * T6 / T0 ; - T6_dVsubsrev = T2 * Wdep_dVsubsrev * T6 / T0 ; - - if ( VdseModeNML == 1 ) { /* Vdse normal mode: */ - T0 = Rdrift ; - Rdrift = T0 * T6 ; - Rdrift_dVdse = Rdrift_dVdse * T6 + T0 * T6_dVdserev ; - Rdrift_dVgse = Rdrift_dVgse * T6 ; - Rdrift_dVbse = Rdrift_dVbse * T6 ; - Rdrift_dVsubs= T0 * T6_dVsubsrev ; - Rdrift_dT = Rdrift_dT * T6 ; - } else { /* Vdse reverse mode: */ - T0 = Rsdrift ; - Rsdrift = T0 * T6 ; - Rsdrift_dVdse = Rsdrift_dVdse * T6 + T0 * T6_dVdserev ; - Rsdrift_dVgse = Rsdrift_dVgse * T6 ; - Rsdrift_dVbse = Rsdrift_dVbse * T6 ; - Rsdrift_dVsubs = T0 * T6_dVsubsrev ; - Rsdrift_dT = Rsdrift_dT * T6 ; - } - } - - Rd = Rdrift ; - Rd_dVgse = Rdrift_dVgse ; - Rd_dVdse = Rdrift_dVdse ; - Rd_dVbse = Rdrift_dVbse ; - Rd_dVsubs = Rdrift_dVsubs ; - Rd_dT = Rdrift_dT ; - Rs = Rsdrift ; - Rs_dVgse = Rsdrift_dVgse ; - Rs_dVdse = Rsdrift_dVdse ; - Rs_dVbse = Rsdrift_dVbse ; - Rs_dVsubs = Rsdrift_dVsubs ; - Rs_dT = Rsdrift_dT ; - - } else { /* bias-independent Rs/Rd */ - Rd = VdseModeNML * here->HSMHV2_rd + VdseModeRVS * here->HSMHV2_rs ; - Rd_dT = VdseModeNML * Rd0_dT + VdseModeRVS * Rs0_dT ; - Rs = VdseModeNML * here->HSMHV2_rs + VdseModeRVS * here->HSMHV2_rd ; - Rs_dT = VdseModeNML * Rs0_dT + VdseModeRVS * Rd0_dT ; - } - - /* Weff dependence of the resistances */ - Rd = Rd / WeffLD_nf ; - Rd_dVgse /= WeffLD_nf ; - Rd_dVdse /= WeffLD_nf ; - Rd_dVbse /= WeffLD_nf ; - Rd_dVsubs /= WeffLD_nf ; - Rd_dT /= WeffLD_nf ; - Rs = Rs / WeffLD_nf ; - Rs_dVgse /= WeffLD_nf ; - Rs_dVdse /= WeffLD_nf ; - Rs_dVbse /= WeffLD_nf ; - Rs_dVsubs /= WeffLD_nf ; - Rs_dT /= WeffLD_nf ; - - /* Sheet resistances are added. */ - Rd += VdseModeNML * here->HSMHV2_rd0 + VdseModeRVS * here->HSMHV2_rs0 ; - Rs += VdseModeNML * here->HSMHV2_rs0 + VdseModeRVS * here->HSMHV2_rd0 ; - - /* Re-stamps for hsmhvnoi.c */ - /* Please see hsmhvnoi.c */ - T0 = VdseModeNML * Rd + VdseModeRVS * Rs ; /* mode-dependent --> geometrical */ - if ( T0 > Res_min && model->HSMHV2_cothrml != 0 ) here->HSMHV2drainConductance = Mfactor / T0 ; - else here->HSMHV2drainConductance = 0.0 ; - T0 = VdseModeNML * Rs + VdseModeRVS * Rd ; /* mode-dependent --> geometrical */ - if ( T0 > Res_min && model->HSMHV2_cothrml != 0 ) here->HSMHV2sourceConductance = Mfactor / T0 ; - else here->HSMHV2sourceConductance = 0.0 ; - - } /* end of case flg_rsrd=1 or flg_rsrd=3 */ - - - /* Clamping for Vbs > Vbs_bnd */ - if ( Vbs > Vbs_bnd ) { - T1 = Vbs - Vbs_bnd ; - T2 = Vbs_max - Vbs_bnd ; - T1_dT = - Vbs_bnd_dT ; - T2_dT = Vbs_max_dT - Vbs_bnd_dT ; - - Fn_SUPoly4m( TY , T1 , T2 , Vbscl_dVbs , T0 ) ; - TY_dT = T1_dT * Vbscl_dVbs + T2_dT * T0 ; - - Vbscl = Vbs_bnd + TY ; - Vbscl_dT = Vbs_bnd_dT + TY_dT ; - - T3 = 1 / T2 ; - - /* x/xmax */ - T4 = T1 * T3 ; - T4_dVb = T3 ; - T4_dT = T1_dT * T3 - T1*T3*T3*T2_dT; - T4_dVb_dT = -T3*T3*T2_dT ; - - T5 = T4 * T4; - T5_dVb = 2 * T4_dVb * T4 ; - T5_dT = 2.0*T4*T4_dT; - T5_dVb_dT = 2 * T4_dVb_dT * T4 + 2 * T4_dVb * T4_dT ; - T15 = 2 * T4_dVb * T4_dVb ; /* T15 = T5_dVb_dVb */ - - T6 = T4 * T5 ; - T6_dVb = T4_dVb * T5 + T4 * T5_dVb ; - T6_dT = T4_dT * T5 + T4 * T5_dT ; - T6_dVb_dT = T4_dVb_dT * T5 + T4_dVb * T5_dT + T4_dT * T5_dVb + T4*T5_dVb_dT ; - T16 = T4_dVb * T5_dVb + T4_dVb * T5_dVb + T4 * T15 ; /* T16 = T6_dVb_dVb */ - - /* T7 = Z T7_dVb = dZ_dVb T17 = dZ_dVb_dVb */ - T7 = 1 + T4 + T5 + T6 + T5 * T5 ; - T7_dVb = T4_dVb + T5_dVb + T6_dVb + 2 * T5_dVb * T5 ; - T7_dT = T4_dT + T5_dT + T6_dT + 2 * T5_dT * T5 ; - T7_dVb_dT = T4_dVb_dT + T5_dVb_dT + T6_dVb_dT + 2 * T5_dVb_dT * T5 + 2 * T5_dVb * T5_dT ; - T17 = T15 + T16 + 2 * T15 * T5 + 2 * T5_dVb * T5_dVb ; - - T8 = T7 * T7 ; - T8_dVb = 2 * T7_dVb * T7 ; - T8_dT = 2 * T7_dT * T7 ; - - T9 = 1 / T8 ; - T9_dVb = - T8_dVb * T9 * T9 ; - T9_dT = - T8_dT * T9 * T9 ; - - Vbscl_dVbs = T2 * T7_dVb * T9 ; - Vbscl_dVbs_dT = T2_dT * T7_dVb * T9 + T2*(T7_dVb_dT * T9+ T7_dVb * T9_dT); - Vbscl_dVbs_dVbs = T2 * ( T17 * T9 + T7_dVb * T9_dVb ) ; - } else { - Vbscl = Vbs ; - Vbscl_dVbs = 1.0 ; - Vbscl_dT = 0.0 ; - Vbscl_dVbs_dVbs = 0.0 ; - } - - /*-----------------------------------------------------------* - * Vxsz: Modified bias introduced to realize symmetry at Vds=0. - *-----------------*/ - - - T1 = Vbscl_dVbs * Vds / 2 ; - Fn_SymAdd( Vzadd , T1 , model->HSMHV2_vzadd0 , T2 ) ; - Vzadd_dVbs = T2 * Vbscl_dVbs_dVbs * Vds / 2 ; - Vzadd_dT = T2 * Vbscl_dVbs_dT * Vds / 2 ; - T2 *= Vbscl_dVbs / 2 ; - Vzadd_dVds = T2 ; - - if ( Vzadd < ps_conv ) { - Vzadd = ps_conv ; - Vzadd_dVds = 0.0 ; - Vzadd_dVbs = 0.0 ; - Vzadd_dT = 0.0 ; - } - - Vbsz = Vbscl + Vzadd ; - Vbsz_dVbs = Vbscl_dVbs + Vzadd_dVbs ; - Vbsz_dVds = Vzadd_dVds ; - Vbsz_dT = Vbscl_dT + Vzadd_dT; - - Vdsz = Vds + 2.0 * Vzadd ; - Vdsz_dVbs = 2.0 * Vzadd_dVbs ; - Vdsz_dVds = 1.0 + 2.0 * Vzadd_dVds ; - Vdsz_dT = 2.0 * Vzadd_dT ; - - Vgsz = Vgs + Vzadd ; - Vgsz_dVbs = Vzadd_dVbs ; - Vgsz_dVgs = 1.0 ; - Vgsz_dVds = Vzadd_dVds ; - Vgsz_dT = Vzadd_dT ; - - /*---------------------------------------------------* - * Factor of modification for symmetry. - *-----------------*/ - - T1 = here->HSMHV2_qnsub_esi * Cox0_inv * Cox0_inv ; - T2 = Vgs - Vfb ; - T3 = 1 + 2.0 / T1 * ( T2 - 1.0 / here->HSMHV2_betatnom - Vbscl ) ; - - Fn_SZ( T4 , T3 , 1e-3 , T5 ) ; - T4 += small ; - TX = sqrt( T4 ) ; - Pslsat = T2 + T1 * ( 1.0 - TX ) ; - VdsatS = Pslsat - Pb2c ; - Fn_SL( VdsatS , VdsatS , 0.1 , 5e-2 , T6 ) ; - - VdsatS_dVbs = ( TX ? (T6 * T5 / TX * Vbscl_dVbs) : 0.0 ) ; - VdsatS_dVds = 0.0 ; - VdsatS_dVgs = ( TX ? (T6 * ( 1.0 - T5 / TX )) : 0.0 ) ; - VdsatS_dT = (TX ? (T6* T5/TX * Vbscl_dT) : 0) ; - - T1 = Vds / VdsatS ; - Fn_SUPoly4( TX , T1 , 1.0 , T0 ) ; - FMDVDS = TX * TX ; - T2 = 2 * TX * T0 ; - T3 = T2 / ( VdsatS * VdsatS ) ; - FMDVDS_dVbs = T3 * ( - Vds * VdsatS_dVbs ) ; - FMDVDS_dVds = T3 * ( 1.0 * VdsatS - Vds * VdsatS_dVds ) ; - FMDVDS_dVgs = T3 * ( - Vds * VdsatS_dVgs ) ; - FMDVDS_dT = T3 * ( - Vds * VdsatS_dT ) ; - - /*-----------------------------------------------------------* - * Quantum effect - *-----------------*/ - if ( model->HSMHV2_flg_qme == 0 ) { - flg_qme = 0 ; - } else { - flg_qme = 1 ; - } - - T1 = here->HSMHV2_2qnsub_esi ; - T2 = sqrt( T1 * Pb20 ) ; - Vthq = Pb20 + Vfb + T2 * Cox0_inv ; - Vthq_dVb = 0.0 ; - Vthq_dVd = 0.0 ; - - if ( flg_qme == 0 ) { - Tox = Tox0 ; - Tox_dVb = 0.0 ; - Tox_dVd = 0.0 ; - Tox_dVg = 0.0 ; - Tox_dT = 0.0 ; - - Cox = Cox0 ; - Cox_dVb = 0.0 ; - Cox_dVd = 0.0 ; - Cox_dVg = 0.0 ; - Cox_dT = 0.0 ; - - Cox_inv = Cox0_inv ; - Cox_inv_dVb = 0.0 ; - Cox_inv_dVd = 0.0 ; - Cox_inv_dVg = 0.0 ; - Cox_inv_dT = 0.0 ; - - T0 = cnst0 * cnst0 * Cox_inv ; - cnstCoxi = T0 * Cox_inv ; - cnstCoxi_dVb = 0.0 ; - cnstCoxi_dVd = 0.0 ; - cnstCoxi_dVg = 0.0 ; - cnstCoxi_dT = 2.0 * cnst0 * cnst0_dT * Cox_inv * Cox_inv ; - - } else { - - T5 = Vgs - Vbs - Vthq + model->HSMHV2_qme2 ; - T5_dVb = -1.0 - Vthq_dVb ; - T5_dVd = - Vthq_dVd ; - T5_dVg = 1.0 ; - T5_dT = 0.0 ; - - Fn_SZ( T2 , T5 , qme_dlt, T3) ; - T2 = T2 + small ; - T2_dVb = T3 * T5_dVb ; - T2_dVd = T3 * T5_dVd ; - T2_dVg = T3 * T5_dVg ; - T2_dT = T3 * T5_dT ; - - T3 = 1.0 / T2 ; - T7 = -1.0 / ( T2 * T2 ) ; - T3_dVb = T7 * T2_dVb ; - T3_dVd = T7 * T2_dVd ; - T3_dVg = T7 * T2_dVg ; - T3_dT = T7 * T2_dT ; - - T4 = 2.0 * fabs(Vthq) ; - T6 = T5 - Vgs + Vfb ; - if(T6 > T4) { T4 = T6; } - - Fn_SU( T2 , T3 , 1.0 / T4 , qme_dlt, T6 ) ; - T2_dVb = T6 * T3_dVb ; - T2_dVd = T6 * T3_dVd ; - T2_dVg = T6 * T3_dVg ; - T2_dT = T6 * T3_dT ; - - dTox = model->HSMHV2_qme1 * T2 + model->HSMHV2_qme3 ; - T7 = model->HSMHV2_qme1 ; - dTox_dVb = T7 * T2_dVb ; - dTox_dVd = T7 * T2_dVd ; - dTox_dVg = T7 * T2_dVg ; - dTox_dT = T7 * T2_dT ; - - if ( dTox * 1.0e12 < Tox0 ) { - dTox = 0.0 ; - dTox_dVb = 0.0 ; - dTox_dVd = 0.0 ; - dTox_dVg = 0.0 ; - dTox_dT = 0.0 ; - flg_qme = 0 ; - } - - Tox = Tox0 + dTox ; - Tox_dVb = dTox_dVb ; - Tox_dVd = dTox_dVd ; - Tox_dVg = dTox_dVg ; - Tox_dT = dTox_dT ; - - Cox = c_eox / Tox ; - T1 = - c_eox / ( Tox * Tox ) ; - Cox_dVb = T1 * Tox_dVb ; - Cox_dVd = T1 * Tox_dVd ; - Cox_dVg = T1 * Tox_dVg ; - Cox_dT = T1 * Tox_dT ; - - Cox_inv = Tox / c_eox ; - T1 = 1.0 / c_eox ; - Cox_inv_dVb = T1 * Tox_dVb ; - Cox_inv_dVd = T1 * Tox_dVd ; - Cox_inv_dVg = T1 * Tox_dVg ; - Cox_inv_dT = T1 * Tox_dT ; - - T0 = cnst0 * cnst0 * Cox_inv ; - cnstCoxi = T0 * Cox_inv ; - T1 = 2.0 * T0 ; - cnstCoxi_dVb = T1 * Cox_inv_dVb ; - cnstCoxi_dVd = T1 * Cox_inv_dVd ; - cnstCoxi_dVg = T1 * Cox_inv_dVg ; - cnstCoxi_dT = 2.0 * cnst0 * cnst0_dT * Cox_inv * Cox_inv + T1 * Cox_inv_dT; - } - - /*---------------------------------------------------* - * Vbsz2 : Vbs for dVth - *-----------------*/ - Vbsz2 = Vbsz ; - Vbsz2_dVbs = Vbsz_dVbs ; - Vbsz2_dVds = Vbsz_dVds ; - Vbsz2_dVgs = 0.0 ; - Vbsz2_dT = Vbsz_dT ; - - /*---------------------------------------------------* - * Vthp : Vth with pocket. - *-----------------*/ - T1 = here->HSMHV2_2qnsub_esi ; - Qb0 = sqrt (T1 * (Pb20 - Vbsz2)) ; - T2 = 0.5 * T1 / Qb0 ; - Qb0_dVb = T2 * (- Vbsz2_dVbs) ; - Qb0_dVd = T2 * (- Vbsz2_dVds) ; - Qb0_dVg = T2 * (- Vbsz2_dVgs) ; - Qb0_dT = T2 * (- Vbsz2_dT) ; - - Vthp = Pb20 + Vfb + Qb0 * Cox_inv + here->HSMHV2_ptovr; - Vthp_dVb = Qb0_dVb * Cox_inv + Qb0 * Cox_inv_dVb ; - Vthp_dVd = Qb0_dVd * Cox_inv + Qb0 * Cox_inv_dVd ; - Vthp_dVg = Qb0_dVg * Cox_inv + Qb0 * Cox_inv_dVg ; - Vthp_dT = Qb0_dT * Cox_inv + Qb0 * Cox_inv_dT + ptovr_dT ; - - Pb20b = Pb20 ; - Pb20b_dVb = 0.0 ; - Pb20b_dVd = 0.0 ; - Pb20b_dVg = 0.0 ; - Pb20b_dT = 0.0 ; - - T0 = 0.95 ; - T1 = T0 * Pb20b - Vbsz2 - 1.0e-3 ; - T1_dVb = T0 * Pb20b_dVb - Vbsz2_dVbs ; - T1_dVd = T0 * Pb20b_dVd - Vbsz2_dVds ; - T1_dVg = T0 * Pb20b_dVg - Vbsz2_dVgs ; - T1_dT = T0 * Pb20b_dT - Vbsz2_dT ; - T2 = sqrt (T1 * T1 + 4.0 * T0 * Pb20b * 1.0e-3) ; - T3 = T0 * Pb20b - 0.5 * (T1 + T2) ; - T4 = 2.0 * T0 * 1.0e-3 ; - T5 = T1 / T2 ; - T6 = T4 / T2 ; - T3_dVb = T0 * Pb20b_dVb - - 0.5 * (T1_dVb + (T1_dVb * T5 + T6 * Pb20b_dVb ) ) ; - T3_dVd = T0 * Pb20b_dVd - - 0.5 * (T1_dVd + (T1_dVd * T5 + T6 * Pb20b_dVd ) ) ; - T3_dVg = T0 * Pb20b_dVg - - 0.5 * (T1_dVg + (T1_dVg * T5 + T6 * Pb20b_dVg ) ) ; - T3_dT = T0 * Pb20b_dT - - 0.5 * (T1_dT + (T1_dT * T5 + T6 * Pb20b_dT ) ) ; - Pbsum = Pb20b - T3 ; - Pbsum_dVb = Pb20b_dVb - T3_dVb ; - Pbsum_dVd = Pb20b_dVd - T3_dVd ; - Pbsum_dVg = Pb20b_dVg - T3_dVg ; - Pbsum_dT = Pb20b_dT - T3_dT ; - - if( model->HSMHV2_codep ) { - Pbsum = Pbsum + model->HSMHV2_depeta * Vdsz ; - Pbsum_dVb = Pbsum_dVb + model->HSMHV2_depeta * Vdsz_dVbs ; - Pbsum_dVd = Pbsum_dVd + model->HSMHV2_depeta * Vdsz_dVds ; - } - - sqrt_Pbsum = sqrt( Pbsum ) ; - - /*-------------------------------------------* - * dVthLP : Short-channel effect induced by pocket. - * - Vth0 : Vth without pocket. - *-----------------*/ - if ( model->HSMHV2_lp != 0.0 ) { - T1 = here->HSMHV2_2qnsub_esi ; - T2 = model->HSMHV2_bs2 - Vbsz2 ; - T3 = T2 + small ; - T4 = sqrt (T3 * T3 + 4.0 * vth_dlt) ; - T5 = 0.5 * (T3 + T4) ; - T6 = 0.5 * (1.0 + T3 / T4) ; - T5_dVb = - Vbsz2_dVbs * T6 ; - T5_dVd = - Vbsz2_dVds * T6 ; - T5_dVg = - Vbsz2_dVgs * T6 ; - T5_dT = - Vbsz2_dT * T6 ; - T7 = 1.0 / T5 ; - bs12 = model->HSMHV2_bs1 * T7 ; - T8 = - bs12 * T7 ; - bs12_dVb = T8 * T5_dVb ; - bs12_dVd = T8 * T5_dVd ; - bs12_dVg = T8 * T5_dVg ; - bs12_dT = T8 * T5_dT ; - Fn_SU( T10 , Vbsz2 + bs12, 0.93 * Pb20, vth_dlt, T0) ; - Qbmm = sqrt (T1 * (Pb20 - T10 )) ; - T9 = T0 / Qbmm ; - Qbmm_dVb = 0.5 * T1 * - (Vbsz2_dVbs + bs12_dVb) * T9 ; - Qbmm_dVd = 0.5 * T1 * - (Vbsz2_dVds + bs12_dVd) * T9 ; - Qbmm_dVg = 0.5 * T1 * - (Vbsz2_dVgs + bs12_dVg) * T9 ; - Qbmm_dT = 0.5 * T1 * - (Vbsz2_dT + bs12_dT) * T9 ; - - dqb = (Qb0 - Qbmm) * Cox_inv ; - dqb_dVb = Vthp_dVb - Qbmm_dVb * Cox_inv - Qbmm * Cox_inv_dVb ; - dqb_dVd = Vthp_dVd - Qbmm_dVd * Cox_inv - Qbmm * Cox_inv_dVd ; - dqb_dVg = Vthp_dVg - Qbmm_dVg * Cox_inv - Qbmm * Cox_inv_dVg ; - dqb_dT = Qb0_dT * Cox_inv + Qb0 * Cox_inv_dT - Qbmm_dT * Cox_inv - Qbmm * Cox_inv_dT ; - - T1 = 2.0 * C_QE * here->HSMHV2_nsubc * C_ESI ; - T2 = sqrt( T1 * ( Pb2c - Vbsz2 ) ) ; - Vth0 = Pb2c + Vfb + T2 * Cox_inv ; - T3 = 0.5 * T1 / T2 * Cox_inv ; - Vth0_dVb = T3 * ( - Vbsz2_dVbs ) + T2 * Cox_inv_dVb ; - Vth0_dVd = T3 * ( - Vbsz2_dVds ) + T2 * Cox_inv_dVd ; - Vth0_dVg = T3 * ( - Vbsz2_dVgs ) + T2 * Cox_inv_dVg ; - Vth0_dT = T3 * ( - Vbsz2_dT ) + T2 * Cox_inv_dT ; - - T1 = C_ESI * Cox_inv ; - T2 = here->HSMHV2_wdplp ; - T4 = 1.0e0 / ( model->HSMHV2_lp * model->HSMHV2_lp ) ; - T5 = 2.0e0 * ( model->HSMHV2_vbi - Pb20b ) * T1 * T2 * T4 ; - dVth0 = T5 * sqrt_Pbsum ; - T6 = 0.5 * T5 / sqrt_Pbsum ; - T7 = 2.0e0 * ( model->HSMHV2_vbi - Pb20b ) * C_ESI * T2 * T4 * sqrt_Pbsum ; - T8 = - 2.0e0 * T1 * T2 * T4 * sqrt_Pbsum ; - dVth0_dVb = T6 * Pbsum_dVb + T7 * Cox_inv_dVb + T8 * Pb20b_dVb ; - dVth0_dVd = T6 * Pbsum_dVd + T7 * Cox_inv_dVd + T8 * Pb20b_dVd ; - dVth0_dVg = T6 * Pbsum_dVg + T7 * Cox_inv_dVg + T8 * Pb20b_dVg ; - dVth0_dT = T6 * Pbsum_dT + T7 * Cox_inv_dT + T8 * Pb20b_dT ; - - T1 = Vthp - Vth0 ; - T1_dVb = Vthp_dVb - Vth0_dVb ; - T2 = pParam->HSMHV2_scp1 + pParam->HSMHV2_scp3 * Pbsum / model->HSMHV2_lp ; - T2_dVb = pParam->HSMHV2_scp3 * Pbsum_dVb / model->HSMHV2_lp ; - T3 = T2 + pParam->HSMHV2_scp2 * Vdsz ; - T3_dVb = T2_dVb + pParam->HSMHV2_scp2 * Vdsz_dVbs ; - - - Vdx = model->HSMHV2_scp21 + Vdsz ; - Vdx_dVbs = Vdsz_dVbs ; - Vdx_dT = Vdsz_dT ; - Vdx2 = Vdx * Vdx ; - Vdx2_dVbs = 2 * Vdx_dVbs * Vdx ; - Vdx2_dT = 2 * Vdx_dT * Vdx ; - - dVthLP = T1 * dVth0 * T3 + dqb - here->HSMHV2_msc / Vdx2 ; - dVthLP_dVb = T1_dVb * dVth0 * T3 + T1 * dVth0_dVb * T3 + T1 * dVth0 * T3_dVb - + dqb_dVb + here->HSMHV2_msc / Vdx2 /Vdx2 *Vdx2_dVbs; - T4 = T1 * dVth0 * pParam->HSMHV2_scp3 / model->HSMHV2_lp ; - dVthLP_dVd = (Vthp_dVd - Vth0_dVd) * dVth0 * T3 + T1 * dVth0_dVd * T3 - + T4 * Pbsum_dVd - + T1 * dVth0 * pParam->HSMHV2_scp2 * Vdsz_dVds - + dqb_dVd - + 2.0e0 * here->HSMHV2_msc * Vdx * Vdsz_dVds / ( Vdx2 * Vdx2 ) ; - dVthLP_dVg = (Vthp_dVg - Vth0_dVg) * dVth0 * T3 + T1 * dVth0_dVg * T3 - + T4 * Pbsum_dVg + dqb_dVg ; - dVthLP_dT = (Vthp_dT - Vth0_dT) * dVth0 * T3 + T1 * dVth0_dT * T3 - + T4 * Pbsum_dT - + T1 * dVth0 * pParam->HSMHV2_scp2 * Vdsz_dT - + dqb_dT - + 2.0e0 * here->HSMHV2_msc * Vdx * Vdsz_dT / ( Vdx2 * Vdx2 ); - } else { - dVthLP = 0.0e0 ; - dVthLP_dVb = 0.0e0 ; - dVthLP_dVd = 0.0e0 ; - dVthLP_dVg = 0.0e0 ; - dVthLP_dT = 0.0e0 ; - } - - /*---------------------------------------------------* - * dVthSC : Short-channel effect induced by Vds. - *-----------------*/ - T1 = C_ESI * Cox_inv ; - T2 = here->HSMHV2_wdpl ; - T3 = here->HSMHV2_lgate - model->HSMHV2_parl2 ; - T4 = 1.0e0 / ( T3 * T3 ) ; - T5 = 2.0e0 * ( model->HSMHV2_vbi - Pb20b ) * T1 * T2 * T4 ; - - dVth0 = T5 * sqrt_Pbsum ; - - T6 = T5 / 2.0 / sqrt_Pbsum ; - T7 = 2.0e0 * ( model->HSMHV2_vbi - Pb20b ) * C_ESI * T2 * T4 * sqrt_Pbsum ; - T8 = - 2.0e0 * T1 * T2 * T4 * sqrt_Pbsum ; - dVth0_dVb = T6 * Pbsum_dVb + T7 * Cox_inv_dVb + T8 * Pb20b_dVb ; - dVth0_dVd = T6 * Pbsum_dVd + T7 * Cox_inv_dVd + T8 * Pb20b_dVd ; - dVth0_dVg = T6 * Pbsum_dVg + T7 * Cox_inv_dVg + T8 * Pb20b_dVg ; - dVth0_dT = T6 * Pbsum_dT + T7 * Cox_inv_dT + T8 * Pb20b_dT ; - - T1 = pParam->HSMHV2_sc3 / here->HSMHV2_lgate ; - T4 = pParam->HSMHV2_sc1 + T1 * Pbsum ; - T4_dVb = T1 * Pbsum_dVb ; - T4_dVd = T1 * Pbsum_dVd ; - T4_dVg = T1 * Pbsum_dVg ; - T4_dT = T1 * Pbsum_dT ; - - T5 = T4 + pParam->HSMHV2_sc2 * Vdsz * ( 1.0 + model->HSMHV2_sc4 * Pbsum ); - T5_dVb = T4_dVb + pParam->HSMHV2_sc2 * Vdsz * model->HSMHV2_sc4 * Pbsum_dVb - + pParam->HSMHV2_sc2 * Vdsz_dVbs * model->HSMHV2_sc4 * Pbsum; - T5_dVd = T4_dVd + pParam->HSMHV2_sc2 * Vdsz_dVds * ( 1.0 + model->HSMHV2_sc4 * Pbsum ) - + pParam->HSMHV2_sc2 * Vdsz * model->HSMHV2_sc4 * Pbsum_dVd; - T5_dVg = T4_dVg + pParam->HSMHV2_sc2 * Vdsz * model->HSMHV2_sc4 * Pbsum_dVg; - T5_dT = T4_dT + pParam->HSMHV2_sc2 * Vdsz * model->HSMHV2_sc4 * Pbsum_dT - + pParam->HSMHV2_sc2 * Vdsz_dT * model->HSMHV2_sc4 * Pbsum; - - - dVthSC = dVth0 * T5 ; - dVthSC_dVb = dVth0_dVb * T5 + dVth0 * T5_dVb ; - dVthSC_dVd = dVth0_dVd * T5 + dVth0 * T5_dVd ; - dVthSC_dVg = dVth0_dVg * T5 + dVth0 * T5_dVg ; - dVthSC_dT = dVth0_dT * T5 + dVth0 * T5_dT ; - - /*---------------------------------------------------* - * dVthW : narrow-channel effect. - *-----------------*/ - T1 = 1.0 / Cox ; - T2 = T1 * T1 ; - T3 = 1.0 / ( Cox + pParam->HSMHV2_wfc / Weff ) ; - T4 = T3 * T3 ; - T5 = T1 - T3 ; - T6 = Qb0 * ( T2 - T4 ) ; - - dVthW = Qb0 * T5 + pParam->HSMHV2_wvth0 / here->HSMHV2_wg ; - dVthW_dVb = Qb0_dVb * T5 - Cox_dVb * T6 ; - dVthW_dVd = Qb0_dVd * T5 - Cox_dVd * T6 ; - dVthW_dVg = - Cox_dVg * T6 ; - dVthW_dT = Qb0_dT * T5 - Cox_dT * T6 ; - - /*---------------------------------------------------* - * dVth : Total variation. - * - Positive dVth means the decrease in Vth. - *-----------------*/ - dVth = dVthSC + dVthLP + dVthW + here->HSMHV2_dVthsm ; - dVth_dVb = dVthSC_dVb + dVthLP_dVb + dVthW_dVb ; - dVth_dVd = dVthSC_dVd + dVthLP_dVd + dVthW_dVd ; - dVth_dVg = dVthSC_dVg + dVthLP_dVg + dVthW_dVg ; - dVth_dT = dVthSC_dT + dVthLP_dT + dVthW_dT ; - - /*---------------------------------------------------* - * Vth : Threshold voltagei for OP. - *-----------------*/ - T2 = sqrt( here->HSMHV2_2qnsub_esi * (Pb2-Vbsz) ) ; - Vth = Pb2 + Vfb + T2 * Cox0_inv - dVth ; - - /*-----------------------------------------------------------* - * Constants in the equation of Ps0 . - *-----------------*/ - - fac1 = cnst0 * Cox_inv ; - fac1_dVbs = cnst0 * Cox_inv_dVb ; - fac1_dVds = cnst0 * Cox_inv_dVd ; - fac1_dVgs = cnst0 * Cox_inv_dVg ; - fac1_dT = Cox_inv * cnst0_dT ; - - fac1p2 = fac1 * fac1 ; - fac1p2_dT = 2.0 * fac1 * fac1_dT ; - - /*---------------------------------------------------* - * Poly-Depletion Effect - *-----------------*/ - - dPpg = 0.0 ; - dPpg_dVb = 0.0 ; - dPpg_dVd = 0.0 ; - dPpg_dVg = 0.0 ; - dPpg_dT = 0.0 ; - - if ( here->HSMHV2_flg_pgd == 1 ) { - - T7 = Vgsz ; - T7_dVb = Vgsz_dVbs ; - T7_dVd = Vgsz_dVds ; - T7_dVg = Vgsz_dVgs ; - T7_dT = Vgsz_dT ; - - T0 = here->HSMHV2_cnstpgd ; - - T3 = T7 - model->HSMHV2_pgd2 ; - T3_dVb = T7_dVb ; - T3_dVd = T7_dVd ; - T3_dVg = T7_dVg ; - T3_dT = T7_dT ; - - Fn_ExpLim( dPpg , T3 , T6 ) ; - dPpg_dVb = T6 * T3_dVb ; - dPpg_dVd = T6 * T3_dVd ; - dPpg_dVg = T6 * T3_dVg ; - dPpg_dT = T6 * T3_dT ; - - Fn_SZ( dPpg , dPpg - 1.0 , pol_dlt , T6 ) ; - dPpg_dVb *= T6 ; - dPpg_dVd *= T6 ; - dPpg_dVg *= T6 ; - dPpg_dT *= T6 ; - - dPpg *= T0 ; - dPpg_dVb *= T0 ; - dPpg_dVd *= T0 ; - dPpg_dVg *= T0 ; - dPpg_dT *= T0 ; - - Fn_SU( dPpg , dPpg , pol_b , pol_dlt , T9 ) ; - dPpg_dVb *= T9 ; - dPpg_dVd *= T9 ; - dPpg_dVg *= T9 ; - dPpg_dT *= T9 ; - - } - - /*---------------------------------------------------* - * Vgp : Effective gate bias with SCE & RSCE & flatband. - *-----------------*/ - Vgp = Vgs - Vfb + dVth - dPpg ; - Vgp_dVbs = dVth_dVb - dPpg_dVb ; - Vgp_dVds = dVth_dVd - dPpg_dVd ; - Vgp_dVgs = 1.0e0 + dVth_dVg - dPpg_dVg ; - Vgp_dT = dVth_dT - dPpg_dT ; - - - /*---------------------------------------------------* - * Vgs_fb : Actual flatband voltage taking account Vbscl. - * - note: if Vgs == Vgs_fb then Vgp == Ps0 == Vbscl . - *------------------*/ - Vgs_fb = Vfb - dVth + dPpg + Vbscl ; - - if( model->HSMHV2_codep == 1 ) { - - /*---------------------------------------------------* - * depletion mode MOSFET - *------------------*/ - -#include "hsmhv2eval_dep.h" - - } else { - - /*---------------------------------------------------* - * normal mode MOSFET - *------------------*/ - - /*-----------------------------------------------------------* - * Accumulation zone. (zone-A) - * - evaluate basic characteristics and exit from this part. - *-----------------*/ - - if ( Vgs < Vgs_fb ) { - - flg_zone = -1 ; - - /*---------------------------------------------------* - * Evaluation of Ps0. - * - Psa : Analytical solution of - * Cox( Vgp - Psa ) = cnst0 * Qacc - * where Qacc is the 3-degree series of (fdep)^{1/2}. - * The unkown is transformed to Chi=beta(Ps0-Vbs). - * - Ps0_min : |Ps0_min| when Vbs=0. - *-----------------*/ - /* Ps0_min: approx. solution of Poisson equation at Vgs_min */ - /* ( easy to improve, if necessary ) */ -// Ps0_min = here->HSMHV2_eg - Pb2 ; -// Ps0_min_dT = Eg_dT - Pb2_dT ; - Ps0_min = 2.0 * beta_inv * log(-Vgs_min/fac1) ; - Ps0_min_dVds = -2.0 * beta_inv * fac1_dVds / fac1 ; - Ps0_min_dVgs = -2.0 * beta_inv * fac1_dVgs / fac1 ; - Ps0_min_dVbs = -2.0 * beta_inv * fac1_dVbs / fac1 ; - Ps0_min_dT = -2.0 * beta_inv * fac1_dT / fac1 + beta * Ps0_min * beta_inv_dT; - - - TX = beta * ( Vgp - Vbscl ) ; - TX_dVbs = beta * ( Vgp_dVbs - Vbscl_dVbs ) ; - TX_dVds = beta * Vgp_dVds ; - TX_dVgs = beta * Vgp_dVgs ; - TX_dT = beta_dT * ( Vgp - Vbscl ) + beta * ( Vgp_dT - Vbscl_dT ); - - T1 = 1.0 / ( beta * cnst0 ) ; - TY = T1 * Cox ; - TY_dVbs = T1 * Cox_dVb ; - TY_dVds = T1 * Cox_dVd ; - TY_dVgs = T1 * Cox_dVg ; - T1_dT = - T1 / ( beta * cnst0 ) * ( beta_dT * cnst0 + beta * cnst0_dT ) ; - TY_dT = T1_dT * Cox ; - - Ac41 = 2.0 + 3.0 * C_SQRT_2 * TY ; - - Ac4 = 8.0 * Ac41 * Ac41 * Ac41 ; - T1 = 72.0 * Ac41 * Ac41 * C_SQRT_2 ; - Ac4_dVbs = T1 * TY_dVbs ; - Ac4_dVds = T1 * TY_dVds ; - Ac4_dVgs = T1 * TY_dVgs ; - Ac4_dT = T1 * TY_dT ; - - T4 = ( TX - 2.0 ) ; - T5 = 9.0 * TY * T4 ; - T5_dVb = 9.0 * ( TY_dVbs * T4 + TY * TX_dVbs ) ; - T5_dVd = 9.0 * ( TY_dVds * T4 + TY * TX_dVds ) ; - T5_dVg = 9.0 * ( TY_dVgs * T4 + TY * TX_dVgs ) ; - T5_dT = 9.0 * ( TY_dT * T4 + TY * TX_dT ) ; - - - Ac31 = 7.0 * C_SQRT_2 - T5 ; - Ac31_dVbs = -T5_dVb ; - Ac31_dVds = -T5_dVd ; - Ac31_dVgs = -T5_dVg ; - Ac31_dT = -T5_dT ; - - Ac3 = Ac31 * Ac31 ; - T1 = 2.0 * Ac31 ; - Ac3_dVbs = T1 * Ac31_dVbs ; - Ac3_dVds = T1 * Ac31_dVds ; - Ac3_dVgs = T1 * Ac31_dVgs ; - Ac3_dT = T1 * Ac31_dT ; - - Ac2 = sqrt( Ac4 + Ac3 ) ; - T1 = 0.5 / Ac2 ; - Ac2_dVbs = T1 * ( Ac4_dVbs + Ac3_dVbs ) ; - Ac2_dVds = T1 * ( Ac4_dVds + Ac3_dVds ) ; - Ac2_dVgs = T1 * ( Ac4_dVgs + Ac3_dVgs ) ; - Ac2_dT = T1 * ( Ac4_dT + Ac3_dT ) ; - - - Ac1 = -7.0 * C_SQRT_2 + Ac2 + T5 ; - Ac1_dVbs = Ac2_dVbs + T5_dVb ; - Ac1_dVds = Ac2_dVds + T5_dVd ; - Ac1_dVgs = Ac2_dVgs + T5_dVg ; - Ac1_dT = Ac2_dT + T5_dT ; - - Acd = Fn_Pow( Ac1 , C_1o3 ) ; - T1 = C_1o3 / ( Acd * Acd ) ; - Acd_dVbs = Ac1_dVbs * T1 ; - Acd_dVds = Ac1_dVds * T1 ; - Acd_dVgs = Ac1_dVgs * T1 ; - Acd_dT = Ac1_dT * T1 ; - - Acn = -4.0 * C_SQRT_2 - 12.0 * TY + 2.0 * Acd + C_SQRT_2 * Acd * Acd ; - T1 = 2.0 + 2.0 * C_SQRT_2 * Acd ; - Acn_dVbs = - 12.0 * TY_dVbs + T1 * Acd_dVbs ; - Acn_dVds = - 12.0 * TY_dVds + T1 * Acd_dVds ; - Acn_dVgs = - 12.0 * TY_dVgs + T1 * Acd_dVgs ; - Acn_dT = - 12.0 * TY_dT + T1 * Acd_dT ; - - - T1 = 1.0 / Acd ; - Chi = Acn * T1 ; - Chi_dVbs = ( Acn_dVbs - Chi * Acd_dVbs ) * T1 ; - Chi_dVds = ( Acn_dVds - Chi * Acd_dVds ) * T1 ; - Chi_dVgs = ( Acn_dVgs - Chi * Acd_dVgs ) * T1 ; - Chi_dT = ( Acn_dT - Chi * Acd_dT ) * T1 ; - - - Psa = Chi * beta_inv + Vbscl ; - Psa_dVbs = Chi_dVbs * beta_inv + Vbscl_dVbs ; - Psa_dVds = Chi_dVds * beta_inv ; - Psa_dVgs = Chi_dVgs * beta_inv ; - Psa_dT = Chi_dT * beta_inv + Chi * beta_inv_dT + Vbscl_dT; - - T1 = Psa - Vbscl ; - T1_dVb = Psa_dVbs - Vbscl_dVbs ; - T1_dVd = Psa_dVds ; - T1_dVg = Psa_dVgs ; - T1_dT = Psa_dT - Vbscl_dT ; - - T2 = T1 / Ps0_min ; - T2_dVb = ( T1_dVb * Ps0_min - T1 * Ps0_min_dVbs ) / ( Ps0_min * Ps0_min ) ; - T2_dVd = ( T1_dVd * Ps0_min - T1 * Ps0_min_dVds ) / ( Ps0_min * Ps0_min ) ; - T2_dVg = ( T1_dVg * Ps0_min - T1 * Ps0_min_dVgs ) / ( Ps0_min * Ps0_min ) ; - T2_dT = ( T1_dT * Ps0_min - T1 * Ps0_min_dT ) / ( Ps0_min * Ps0_min ) ; - - T3 = sqrt( 1.0 + ( T2 * T2 ) ) ; - T3_dVb = 1.0 / T3 * T2 * T2_dVb ; - T3_dVd = 1.0 / T3 * T2 * T2_dVd ; - T3_dVg = 1.0 / T3 * T2 * T2_dVg ; - T3_dT = 1.0 / T3 * T2 * T2_dT ; - - Ps0 = T1 / T3 + Vbscl ; - T9 = 1.0 / ( T3 * T3 ) ; - Ps0_dVbs = T9 * ( ( Psa_dVbs - Vbscl_dVbs ) * T3 - T1 * T3_dVb ) + Vbscl_dVbs ; - Ps0_dVds = T9 * ( Psa_dVds * T3 - T1 * T3_dVd ) ; - Ps0_dVgs = T9 * ( Psa_dVgs * T3 - T1 * T3_dVg ) ; - Ps0_dT = T9 * ( ( Psa_dT - Vbscl_dT )* T3 - T1 * T3_dT ) + Vbscl_dT; - - /*---------------------------------------------------* - * Characteristics. - *-----------------*/ - Psl = Ps0 ; - Psl_dVbs = Ps0_dVbs ; - Psl_dVds = Ps0_dVds ; - Psl_dVgs = Ps0_dVgs ; - Psl_dT = Ps0_dT ; - /** (reminder) - Psdl = Psl ; - Psdl_dVbs = Psl_dVbs ; - Psdl_dVds = Psl_dVds ; - Psdl_dVgs = Psl_dVgs ; - **/ - Pds = 0.0 ; - Pds_dVbs = 0.0 ; - Pds_dVds = 0.0 ; - Pds_dVgs = 0.0 ; - Pds_dT = 0.0 ; - - T2 = ( Vgp - Ps0 ) ; - T2_dT = Vgp_dT - Ps0_dT ; - - Qbu = Cox * T2 ; - Qbu_dVbs = Cox * ( Vgp_dVbs - Ps0_dVbs ) + Cox_dVb * T2 ; - Qbu_dVds = Cox * ( Vgp_dVds - Ps0_dVds ) + Cox_dVd * T2 ; - Qbu_dVgs = Cox * ( Vgp_dVgs - Ps0_dVgs ) + Cox_dVg * T2 ; - Qbu_dT = Cox * T2_dT ; - - Qiu = 0.0e0 ; - Qiu_dVbs = 0.0e0 ; - Qiu_dVds = 0.0e0 ; - Qiu_dVgs = 0.0e0 ; - Qiu_dT = 0.0e0 ; - - Qdrat = 0.0e0 ; - Qdrat_dVbs = 0.0e0 ; - Qdrat_dVds = 0.0e0 ; - Qdrat_dVgs = 0.0e0 ; - Qdrat_dT = 0.0 ; - - Lred = 0.0e0 ; - Lred_dVbs = 0.0e0 ; - Lred_dVds = 0.0e0 ; - Lred_dVgs = 0.0e0 ; - Lred_dT = 0.0e0 ; - - Ids = 0.0e0 ; - Ids_dVbs = 0.0e0 ; - Ids_dVds = 0.0e0 ; - Ids_dVgs = 0.0e0 ; - Ids_dT = 0.0e0 ; - - VgVt = 0.0 ; - - flg_noqi = 1 ; - - goto end_of_part_1 ; - } - - /*-----------------------------------------------------------* - * Initial guess for Ps0. - *-----------------*/ - - /*---------------------------------------------------* - * Ps0_iniA: solution of subthreshold equation assuming zone-D1/D2. - *-----------------*/ - TX = 1.0e0 + 4.0e0 - * ( beta * ( Vgp - Vbscl ) - 1.0e0 ) / ( fac1p2 * beta2 ) ; - TX = Fn_Max( TX , epsm10 ) ; - Ps0_iniA = Vgp + fac1p2 * beta * 0.5 * ( 1.0e0 - sqrt( TX ) ) ; - - /* use analytical value in subthreshold region. */ - if ( Vgs < ( Vfb + Vth ) * 0.5 ) { - flg_pprv = 0 ; - } - - - if ( flg_pprv >= 1 ) { - /*---------------------------------------------------* - * Use previous value. - *-----------------*/ - - T1 = Ps0_dVbs * dVbs + Ps0_dVds * dVds + Ps0_dVgs * dVgs ; - Ps0_ini = Ps0 + T1 ; - - T2 = here->HSMHV2_ps0_dtemp_prv * Temp_dif ; - if ( fabs( T1 + T2 ) < dP_max ) { Ps0_ini += T2 ; } - - if ( flg_pprv == 2 ) { - /* TX_dVxs = d^2 Ps0 / d Vxs^2 here */ - if ( Vbsc_dif2 > epsm10 ) { - TX_dVbs = ( here->HSMHV2_ps0_dvbs_prv - here->HSMHV2_ps0_dvbs_prv2 ) - / Vbsc_dif2 ; - } else { - TX_dVbs = 0.0 ; - } - if ( Vdsc_dif2 > epsm10 ) { - TX_dVds = ( here->HSMHV2_ps0_dvds_prv - here->HSMHV2_ps0_dvds_prv2 ) - / Vdsc_dif2 ; - } else { - TX_dVds = 0.0 ; - } - if ( Vgsc_dif2 > epsm10 ) { - TX_dVgs = ( here->HSMHV2_ps0_dvgs_prv - here->HSMHV2_ps0_dvgs_prv2 ) - / Vgsc_dif2 ; - } else { - TX_dVgs = 0.0 ; - } - T2 = ( dVbs * dVbs ) / 2 * TX_dVbs - + ( dVds * dVds ) / 2 * TX_dVds - + ( dVgs * dVgs ) / 2 * TX_dVgs ; - - if ( fabs( T2 ) < fabs( 0.5 * T1 ) ) { - Ps0_ini += T2 ; - } else { - flg_pprv = 1 ; - } - } - - T1 = Ps0_ini - Ps0 ; - if ( T1 < - dP_max || T1 > dP_max ) { - flg_pprv = 0 ; /* flag changes to analytical */ - } else { - Ps0_iniA = Fn_Max( Ps0_ini , Ps0_iniA ) ; - } - } /* end of (flg_pprv >=1) if-block */ - - if ( flg_pprv == 0 ) { - - /*---------------------------------------------------* - * Analytical initial guess. - *-----------------*/ - /*-------------------------------------------* - * Common part. - *-----------------*/ - Chi = beta * ( Ps0_iniA - Vbscl ) ; - - if ( Chi < znbd3 ) { - /*-----------------------------------* - * zone-D1/D2 - * - Ps0_ini is the analytical solution of Qs=Qb0 with - * Qb0 being approximated to 3-degree polynomial. - *-----------------*/ - TY = beta * ( Vgp - Vbscl ) ; - T1 = 1.0e0 / ( cn_nc3 * beta * fac1 ) ; - T2 = 81.0 + 3.0 * T1 ; - T3 = -2916.0 - 81.0 * T1 + 27.0 * T1 * TY ; - T4 = 1458.0 - 81.0 * ( 54.0 + T1 ) + 27.0 * T1 * TY ; - T4 = T4 * T4 ; - T5 = Fn_Pow( T3 + sqrt( 4 * T2 * T2 * T2 + T4 ) , C_1o3 ) ; - TX = 3.0 - ( C_2p_1o3 * T2 ) / ( 3.0 * T5 ) - + 1 / ( 3.0 * C_2p_1o3 ) * T5 ; - - Ps0_iniA = TX * beta_inv + Vbscl ; - Ps0_ini = Ps0_iniA ; - - } else if ( Vgs <= Vth ) { - /*-----------------------------------* - * Weak inversion zone. - *-----------------*/ - Ps0_ini = Ps0_iniA ; - - } else { - /*-----------------------------------* - * Strong inversion zone. - * - Ps0_iniB : upper bound. - *-----------------*/ - T1 = 1.0 / cnst1 / cnstCoxi ; - T2 = T1 * Vgp * Vgp ; - T3 = beta + 2.0 / Vgp ; - - Ps0_iniB = log( T2 ) / T3 ; - - Fn_SU( Ps0_ini , Ps0_iniA, Ps0_iniB, c_ps0ini_2, T1) ; - } - } - - TX = Vbscl + ps_conv / 2 ; - if ( Ps0_ini < TX ) Ps0_ini = TX ; - - - /*---------------------------------------------------* - * Assign initial guess. - *-----------------*/ - Ps0 = Ps0_ini ; - Psl_lim = Ps0_iniA ; - - - /*---------------------------------------------------* - * Calculation of Ps0. (beginning of Newton loop) - * - Fs0 : Fs0 = 0 is the equation to be solved. - * - dPs0 : correction value. - *-----------------*/ - exp_bVbs = exp( beta * Vbscl ) ; - cfs1 = cnst1 * exp_bVbs ; - - flg_conv = 0 ; - for ( lp_s0 = 1 ; lp_s0 <= lp_s0_max + 1 ; lp_s0 ++ ) { - - Chi = beta * ( Ps0 - Vbscl ) ; - - if ( Chi < znbd5 ) { - /*-------------------------------------------* - * zone-D1/D2. (Ps0) - * - Qb0 is approximated to 5-degree polynomial. - *-----------------*/ - fi = Chi * Chi * Chi - * ( cn_im53 + Chi * ( cn_im54 + Chi * cn_im55 ) ) ; - fi_dChi = Chi * Chi - * ( 3 * cn_im53 + Chi * ( 4 * cn_im54 + Chi * 5 * cn_im55 ) ) ; - - fs01 = cfs1 * fi * fi ; - fs01_dPs0 = cfs1 * beta * 2 * fi * fi_dChi ; - - fb = Chi * ( cn_nc51 - + Chi * ( cn_nc52 - + Chi * ( cn_nc53 - + Chi * ( cn_nc54 + Chi * cn_nc55 ) ) ) ) ; - fb_dChi = cn_nc51 - + Chi * ( 2 * cn_nc52 - + Chi * ( 3 * cn_nc53 - + Chi * ( 4 * cn_nc54 + Chi * 5 * cn_nc55 ) ) ) ; - - fs02 = sqrt( fb * fb + fs01 ) ; - fs02_dPs0 = ( beta * fb_dChi * 2 * fb + fs01_dPs0 ) / ( fs02 + fs02 ) ; - - } else { - /*-------------------------------------------* - * zone-D3. (Ps0) - *-----------------*/ - if ( Chi < large_arg ) { /* avoid exp_Chi to become extremely large */ - exp_Chi = exp( Chi ) ; - fs01 = cfs1 * ( exp_Chi - 1.0e0 ) ; - fs01_dPs0 = cfs1 * beta * ( exp_Chi ) ; - } else { - exp_bPs0 = exp( beta*Ps0 ) ; - fs01 = cnst1 * ( exp_bPs0 - exp_bVbs ) ; - fs01_dPs0 = cnst1 * beta * exp_bPs0 ; - } - fs02 = sqrt( Chi - 1.0 + fs01 ) ; - fs02_dPs0 = ( beta + fs01_dPs0 ) / ( fs02 + fs02 ) ; - } /* end of if ( Chi ... ) else block */ - - Fs0 = Vgp - Ps0 - fac1 * fs02 ; - Fs0_dPs0 = - 1.0e0 - fac1 * fs02_dPs0 ; - - if ( flg_conv == 1 ) break ; - - dPs0 = - Fs0 / Fs0_dPs0 ; - - /*-------------------------------------------* - * Update Ps0 . - * - clamped to Vbscl if Ps0 < Vbscl . - *-----------------*/ - dPlim = 0.5*dP_max*(1.0 + Fn_Max(1.e0,fabs(Ps0))) ; - if ( fabs( dPs0 ) > dPlim ) dPs0 = dPlim * Fn_Sgn( dPs0 ) ; - - Ps0 = Ps0 + dPs0 ; - -// TX = Vbscl + ps_conv / 2 ; -// if ( Ps0 < TX ) Ps0 = TX ; - - /*-------------------------------------------* - * Check convergence. - * NOTE: This condition may be too rigid. - *-----------------*/ - if ( fabs( dPs0 ) <= ps_conv && fabs( Fs0 ) <= gs_conv ) { - flg_conv = 1 ; - } - - } /* end of Ps0 Newton loop */ - - /* Reduce loop count to exclude the sweep for derivative calculation */ - lp_s0 -- ; - - /*-------------------------------------------* - * Procedure for diverged case. - *-----------------*/ - if ( flg_conv == 0 ) { - fprintf( stderr , - "*** warning(HiSIM_HV(%s)): Went Over Iteration Maximum (Ps0)\n", model->HSMHV2modName ) ; - fprintf( stderr , - " Vbse = %7.3f Vdse = %7.3f Vgse = %7.3f\n" , - Vbse , Vdse , Vgse ) ; - if ( flg_info >= 2 ) { - printf( "*** warning(HiSIM_HV(%s)): Went Over Iteration Maximum (Ps0)\n", model->HSMHV2modName ) ; - } - } - - /*---------------------------------------------------* - * Evaluate derivatives of Ps0. - * - note: Here, fs01_dVbs and fs02_dVbs are derivatives - * w.r.t. explicit Vbs. So, Ps0 in the fs01 and fs02 - * expressions is regarded as a constant. - *-----------------*/ - /* self heating */ - Chi_dT = beta_dT *( Ps0 - Vbscl ) - beta * Vbscl_dT ; - exp_bVbs_dT = ( beta_dT * Vbscl + beta * Vbscl_dT ) * exp_bVbs ; - cfs1_dT = exp_bVbs * cnst1_dT + exp_bVbs_dT * cnst1 ; - - /* derivatives of fs0* w.r.t. explicit Vbs */ - if ( Chi < znbd5 ) { - fs01_dVbs = cfs1 * beta * fi * ( fi - 2 * fi_dChi ) * Vbscl_dVbs ; - fs01_dT = cfs1 * 2 * fi * fi_dChi * Chi_dT + fi * fi * cfs1_dT ; - T2 = 1.0e0 / ( fs02 + fs02 ) ; - fs02_dVbs = ( - beta * Vbscl_dVbs * fb_dChi * 2 * fb + fs01_dVbs ) * T2 ; - fs02_dT = ( 2 * fb * fb_dChi * Chi_dT + fs01_dT ) * T2 ; - } else { - if ( Chi < large_arg ) { - fs01_dVbs = - cfs1 * beta * Vbscl_dVbs ; - exp_Chi_dT = exp_Chi * Chi_dT ; - fs01_dT = ( exp_Chi - 1.0e0 ) * cfs1_dT + cfs1 * exp_Chi_dT ; - } else { - fs01_dVbs = - cfs1 * beta * Vbscl_dVbs ; - exp_bPs0_dT = exp_bPs0 * Ps0 * beta_dT ; - fs01_dT = cnst1_dT*(exp_bPs0-exp_bVbs) + cnst1*(exp_bPs0_dT-exp_bVbs_dT) ; - } - T2 = 0.5e0 / fs02 ; - fs02_dVbs = ( - beta * Vbscl_dVbs + fs01_dVbs ) * T2 ; - fs02_dT = T2 * ( Chi_dT + fs01_dT ) ; - } - - T1 = 1.0 / Fs0_dPs0 ; - Ps0_dVbs = - ( Vgp_dVbs - ( fac1 * fs02_dVbs + fac1_dVbs * fs02 ) ) * T1 ; - Ps0_dVds = - ( Vgp_dVds - fac1_dVds * fs02 ) * T1 ; - Ps0_dVgs = - ( Vgp_dVgs - fac1_dVgs * fs02 ) * T1 ; - Ps0_dT = - ( Vgp_dT - ( fac1 * fs02_dT + fac1_dT * fs02 ) ) * T1 ; - - Chi_dT = beta_dT *( Ps0 - Vbscl ) + beta * ( Ps0_dT - Vbscl_dT ) ; - - if ( Chi < znbd5 ) { - - /*-------------------------------------------* - * zone-D1/D2. (Ps0) - * Xi0 := fdep0^2 = fb * fb [D1,D2] - *-----------------*/ - Xi0 = fb * fb + epsm10 ; - T1 = 2 * fb * fb_dChi * beta ; - Xi0_dVbs = T1 * ( Ps0_dVbs - Vbscl_dVbs ) ; - Xi0_dVds = T1 * Ps0_dVds ; - Xi0_dVgs = T1 * Ps0_dVgs ; - Xi0_dT = 2 * fb * fb_dChi * Chi_dT ; - - Xi0p12 = fb + epsm10 ; - T1 = fb_dChi * beta ; - Xi0p12_dVbs = T1 * ( Ps0_dVbs - Vbscl_dVbs ) ; - Xi0p12_dVds = T1 * Ps0_dVds ; - Xi0p12_dVgs = T1 * Ps0_dVgs ; - Xi0p12_dT = fb_dChi * Chi_dT ; - - Xi0p32 = fb * fb * fb + epsm10 ; - T1 = 3 * fb * fb * fb_dChi * beta ; - Xi0p32_dVbs = T1 * ( Ps0_dVbs - Vbscl_dVbs ) ; - Xi0p32_dVds = T1 * Ps0_dVds ; - Xi0p32_dVgs = T1 * Ps0_dVgs ; - Xi0p32_dT = 3 * fb * fb * fb_dChi * Chi_dT ; - - fs01_dT = cfs1 * 2 * fi * fi_dChi * Chi_dT + fi * fi * cfs1_dT ; - fs02_dT = ( 2 * fb * fb_dChi * Chi_dT + fs01_dT ) * T2 ; - - } else { - - /*-------------------------------------------* - * zone-D3. (Ps0) - *-----------------*/ - flg_zone = 3 ; - flg_noqi = 0 ; - - /*-----------------------------------* - * Xi0 := fdep0^2 = Chi - 1 = beta * ( Ps0 - Vbscl ) - 1 [D3] - *-----------------*/ - Xi0 = Chi - 1.0e0 ; - Xi0_dVbs = beta * ( Ps0_dVbs - Vbscl_dVbs ) ; - Xi0_dVds = beta * Ps0_dVds ; - Xi0_dVgs = beta * Ps0_dVgs ; - Xi0_dT = Chi_dT ; - - Xi0p12 = sqrt( Xi0 ) ; - T1 = 0.5e0 / Xi0p12 ; - Xi0p12_dVbs = T1 * Xi0_dVbs ; - Xi0p12_dVds = T1 * Xi0_dVds ; - Xi0p12_dVgs = T1 * Xi0_dVgs ; - Xi0p12_dT = T1 * Xi0_dT ; - - Xi0p32 = Xi0 * Xi0p12 ; - T1 = 1.5e0 * Xi0p12 ; - Xi0p32_dVbs = T1 * Xi0_dVbs ; - Xi0p32_dVds = T1 * Xi0_dVds ; - Xi0p32_dVgs = T1 * Xi0_dVgs ; - Xi0p32_dT = T1 * Xi0_dT ; - - if ( Chi < large_arg ) { - exp_Chi_dT = exp_Chi * Chi_dT ; - fs01_dT = ( exp_Chi - 1.0e0 ) * cfs1_dT + cfs1 * exp_Chi_dT ; - } else { - exp_bPs0_dT = exp_bPs0 * (beta_dT * Ps0 + beta * Ps0_dT) ; - fs01_dT = cnst1_dT*(exp_bPs0-exp_bVbs) + cnst1*(exp_bPs0_dT-exp_bVbs_dT) ; - } - fs02_dT = T2 * ( Chi_dT + fs01_dT ) ; - - } /* end of if ( Chi ... ) block */ - - /*-----------------------------------------------------------* - * - Recalculate the derivatives of fs01 and fs02. - * note: fs01 = cnst1 * exp( Vbs ) * ( exp( Chi ) - Chi - 1.0e0 ) ; - * fs02 = sqrt( Xi0 + fs01 ) ; - *-----------------*/ - fs01_dVbs = Ps0_dVbs * fs01_dPs0 + fs01_dVbs ; - fs01_dVds = Ps0_dVds * fs01_dPs0 ; - fs01_dVgs = Ps0_dVgs * fs01_dPs0 ; - fs02_dVbs = Ps0_dVbs * fs02_dPs0 + fs02_dVbs ; - fs02_dVds = Ps0_dVds * fs02_dPs0 ; - fs02_dVgs = Ps0_dVgs * fs02_dPs0 ; - - /*-----------------------------------------------------------* - * Qb0 : Qb at source side. - * Qn0 : Qi at source side. - *-----------------*/ - - Qb0 = cnst0 * Xi0p12 ; - Qb0_dVb = cnst0 * Xi0p12_dVbs ; - Qb0_dVd = cnst0 * Xi0p12_dVds ; - Qb0_dVg = cnst0 * Xi0p12_dVgs ; - Qb0_dT = cnst0 * Xi0p12_dT + cnst0_dT * Xi0p12 ; - - T1 = 1.0 / ( fs02 + Xi0p12 ) ; - Qn0 = cnst0 * fs01 * T1 ; - T1_dT = - T1 * T1 * ( fs02_dT + Xi0p12_dT ) ; - Qn0_dT = cnst0 * ( fs01 * T1_dT + T1 * fs01_dT ) + fs01 * T1 * cnst0_dT ; - - T2 = 1.0 / ( fs01 + small ) ; - - Qn0_dVbs = Qn0 * ( fs01_dVbs * T2 - ( fs02_dVbs + Xi0p12_dVbs ) * T1 ) ; - Qn0_dVds = Qn0 * ( fs01_dVds * T2 - ( fs02_dVds + Xi0p12_dVds ) * T1 ) ; - Qn0_dVgs = Qn0 * ( fs01_dVgs * T2 - ( fs02_dVgs + Xi0p12_dVgs ) * T1 ) ; - - - /*-----------------------------------------------------------* - * zone-D1 and D2 - *-----------------*/ - if ( Chi < znbd5 ) { - if ( Chi < znbd3 ) { - /*-------------------------------------------* - * zone-D1. (Ps0) - *-----------------*/ - flg_zone = 1 ; - flg_noqi = 1 ; /** !! to be revisited !! **/ - - Qiu = Qn0 ; - Qiu_dVbs = Qn0_dVbs ; - Qiu_dVds = Qn0_dVds ; - Qiu_dVgs = Qn0_dVgs ; - Qiu_dT = Qn0_dT; - - Qbu = Qb0 ; - Qbu_dVbs = Qb0_dVb ; - Qbu_dVds = Qb0_dVd ; - Qbu_dVgs = Qb0_dVg ; - Qbu_dT = Qb0_dT ; - - Qdrat = 0.5 ; - Qdrat_dVbs = 0.0 ; - Qdrat_dVds = 0.0 ; - Qdrat_dVgs = 0.0 ; - Qdrat_dT = 0.0; - - Lred = 0.0e0 ; - Lred_dVbs = 0.0e0 ; - Lred_dVds = 0.0e0 ; - Lred_dVgs = 0.0e0 ; - Lred_dT = 0.0e0 ; - - /** (reminder) - *Psdl = Psl ; - *Psdl_dVbs = Psl_dVbs ; - *Psdl_dVds = Psl_dVds ; - *Psdl_dVgs = Psl_dVgs ; - **/ - - } else { - /*-------------------------------------------* - * zone-D2 (Ps0) - *-----------------*/ - - flg_zone = 2 ; - flg_noqi = 0 ; - /*-----------------------------------------------------------* - * FD2 : connecting function for zone-D2. - * - Qiu, Qbu, Qdrat and Lred should be interpolated later. - *-----------------*/ - T1 = 1.0 / ( znbd5 - znbd3 ) ; - TX = T1 * ( Chi - znbd3 ) ; - TX_dVbs = beta * T1 * ( Ps0_dVbs - Vbscl_dVbs ) ; - TX_dVds = beta * T1 * Ps0_dVds ; - TX_dVgs = beta * T1 * Ps0_dVgs ; - TX_dT = T1 * Chi_dT ; - - FD2 = TX * TX * TX * ( 10.0 + TX * ( -15.0 + TX * 6.0 ) ) ; - T4 = TX * TX * ( 30.0 + TX * ( -60.0 + TX * 30.0 ) ) ; - - FD2_dVbs = T4 * TX_dVbs ; - FD2_dVds = T4 * TX_dVds ; - FD2_dVgs = T4 * TX_dVgs ; - FD2_dT = T4 * TX_dT ; - - - } /* end of zone-D2 */ - } - - - /*---------------------------------------------------* - * VgVt : Vgp - Vth_qi. ( Vth_qi is Vth for Qi evaluation. ) - *-----------------*/ - VgVt = Qn0 * Cox_inv ; - VgVt_dVbs = Qn0_dVbs * Cox_inv + Qn0 * Cox_inv_dVb ; - VgVt_dVds = Qn0_dVds * Cox_inv + Qn0 * Cox_inv_dVd ; - VgVt_dVgs = Qn0_dVgs * Cox_inv + Qn0 * Cox_inv_dVg ; - VgVt_dT = Qn0_dT * Cox_inv ; - - /*-----------------------------------------------------------* - * make Qi=Qd=Ids=0 if VgVt <= VgVt_small - *-----------------*/ - if ( VgVt <= VgVt_small ) { - flg_zone = 4 ; - flg_noqi = 1 ; - - Psl = Ps0 ; - Psl_dVbs = Ps0_dVbs ; - Psl_dVds = Ps0_dVds ; - Psl_dVgs = Ps0_dVgs ; - Psl_dT = Ps0_dT ; - - /** (reminder) - *Psdl = Psl ; - *Psdl_dVbs = Psl_dVbs ; - *Psdl_dVds = Psl_dVds ; - *Psdl_dVgs = Psl_dVgs ; - **/ - - Pds = 0.0 ; - Pds_dVbs = 0.0 ; - Pds_dVds = 0.0 ; - Pds_dVgs = 0.0 ; - Pds_dT = 0.0 ; - - Qbu = Qb0 ; - Qbu_dVbs = Qb0_dVb ; - Qbu_dVds = Qb0_dVd ; - Qbu_dVgs = Qb0_dVg ; - Qbu_dT = Qb0_dT ; - - Qiu = 0.0 ; - Qiu_dVbs = 0.0 ; - Qiu_dVds = 0.0 ; - Qiu_dVgs = 0.0 ; - Qiu_dT = 0.0 ; - - Qdrat = 0.5 ; - Qdrat_dVbs = 0.0 ; - Qdrat_dVds = 0.0 ; - Qdrat_dVgs = 0.0 ; - Qdrat_dT = 0.0 ; - - Lred = 0.0 ; - Lred_dVbs = 0.0 ; - Lred_dVds = 0.0 ; - Lred_dVgs = 0.0 ; - Lred_dT = 0.0 ; - - Ids = 0.0e0 ; - Ids_dVbs = 0.0e0 ; - Ids_dVds = 0.0e0 ; - Ids_dVgs = 0.0e0 ; - Ids_dT = 0.0e0 ; - - goto end_of_part_1 ; - } - - /*-----------------------------------------------------------* - * Start point of Psl (= Ps0 + Pds) calculation. (label) - *-----------------*/ -/* start_of_Psl: */ - - - /* Vdseff (begin) */ - Vdsorg = Vds ; - - T2 = here->HSMHV2_qnsub_esi / ( Cox * Cox ) ; - T4 = - 2.0e0 * T2 / Cox ; - T2_dVb = T4 * Cox_dVb ; - T2_dVd = T4 * Cox_dVd ; - T2_dVg = T4 * Cox_dVg ; - T2_dT = T4 * Cox_dT ; - - T0 = Vgp - beta_inv - Vbsz ; - T0_dT = Vgp_dT - beta_inv_dT - Vbsz_dT ; - Fn_SZ( T9, 1.0e0 + 2.0e0 / T2 * T0, 1e-3, TX ) ; - T9 += small ; - T3 = sqrt( T9 ) ; - T4 = 0.5e0 / T3 ; - T5 = 1.0e0 / ( T2 * T2 ) ; - T6 = T4 * 2.0e0 * T5 * TX ; - T7 = T6 * T0 ; - T8 = T6 * T2 ; - T3_dVb = - T2_dVb * T7 + T8 * ( Vgp_dVbs - Vbsz_dVbs ) ; - T3_dVd = - T2_dVd * T7 + T8 * ( Vgp_dVds - Vbsz_dVds ) ; - T3_dVg = - T2_dVg * T7 + T8 * Vgp_dVgs ; - T3_dT = - T2_dT * T7 + T8 * T0_dT ; - - T10 = Vgp + T2 * ( 1.0e0 - T3 ) ; - T10_dVb = Vgp_dVbs + T2_dVb * ( 1.0e0 - T3 ) - T2 * T3_dVb ; - T10_dVd = Vgp_dVds + T2_dVd * ( 1.0e0 - T3 ) - T2 * T3_dVd ; - T10_dVg = Vgp_dVgs + T2_dVg * ( 1.0e0 - T3 ) - T2 * T3_dVg ; - T10_dT = Vgp_dT + T2_dT * ( 1.0e0 - T3 ) - T2 * T3_dT ; - Fn_SZ( T10 , T10 , 0.01 , T0 ) ; - T10 += epsm10 ; - T10_dVb *= T0 ; - T10_dVd *= T0 ; - T10_dVg *= T0 ; - T10_dT *= T0 ; - - T1 = Vds / T10 ; - T2 = Fn_Pow( T1 , here->HSMHV2_ddlt - 1.0e0 ) ; - T7 = T2 * T1 ; - T0 = here->HSMHV2_ddlt * T2 / ( T10 * T10 ) ; - T7_dVb = T0 * ( - Vds * T10_dVb ) ; - T7_dVd = T0 * ( T10 - Vds * T10_dVd ) ; - T7_dVg = T0 * ( - Vds * T10_dVg ) ; - T7_dT = T0 * ( - Vds * T10_dT ) ; - - T3 = 1.0 + T7 ; - T4 = Fn_Pow( T3 , 1.0 / here->HSMHV2_ddlt - 1.0 ) ; - T6 = T4 * T3 ; - T0 = T4 / here->HSMHV2_ddlt ; - T6_dVb = T0 * T7_dVb ; - T6_dVd = T0 * T7_dVd ; - T6_dVg = T0 * T7_dVg ; - T6_dT = T0 * T7_dT ; - - Vdseff = Vds / T6 ; - T0 = 1.0 / ( T6 * T6 ) ; - Vdseff_dVbs = - Vds * T6_dVb * T0 ; - Vdseff_dVds = ( T6 - Vds * T6_dVd ) * T0 ; - Vdseff_dVgs = - Vds * T6_dVg * T0 ; - Vdseff_dT = - Vds * T6_dT * T0 ; - - Vds = Vdseff ; - /* Vdseff (end) */ - - - exp_bVbsVds = exp( beta * ( Vbscl - Vds ) ) ; - exp_bVbsVds_dT = ( beta_dT * ( Vbscl - Vds ) + beta * (Vbscl_dT - Vdseff_dT) ) * exp_bVbsVds ; - - - /*---------------------------------------------------* - * Skip Psl calculation when Vds is very small. - *-----------------*/ - if ( Vds < 0.0 ) { - Pds = 0.0 ; - Psl = Ps0 ; -// flg_conv = 1 ; - goto start_of_loopl ; - } - - /*-----------------------------------------------------------* - * Initial guess for Pds ( = Psl - Ps0 ). - *-----------------*/ - if ( flg_pprv >= 1 ) { - /*---------------------------------------------------* - * Use previous value. - *-----------------*/ - - T1 = Pds_dVbs * dVbs + Pds_dVds * dVds + Pds_dVgs * dVgs ; - Pds_ini = Pds + T1 ; - - /* self heating */ - T2 = here->HSMHV2_pds_dtemp_prv * Temp_dif ; - if ( fabs( T1 + T2 ) < dP_max ) { Pds_ini += T2 ; } - - if ( flg_pprv == 2 ) { - /* TX_dVxs = d^2 Pds / d Vxs^2 here */ - if ( Vbsc_dif2 > epsm10 ) { - TX_dVbs = ( here->HSMHV2_pds_dvbs_prv - here->HSMHV2_pds_dvbs_prv2 ) - / Vbsc_dif2 ; - } else { - TX_dVbs = 0.0 ; - } - if ( Vdsc_dif2 > epsm10 ) { - TX_dVds = ( here->HSMHV2_pds_dvds_prv - here->HSMHV2_pds_dvds_prv2 ) - / Vdsc_dif2 ; - } else { - TX_dVds = 0.0 ; - } - if ( Vgsc_dif2 > epsm10 ) { - TX_dVgs = ( here->HSMHV2_pds_dvgs_prv - here->HSMHV2_pds_dvgs_prv2 ) - / Vgsc_dif2 ; - } else { - TX_dVgs = 0.0 ; - } - T2 = ( dVbs * dVbs ) / 2 * TX_dVbs - + ( dVds * dVds ) / 2 * TX_dVds - + ( dVgs * dVgs ) / 2 * TX_dVgs ; - - if ( fabs( T2 ) < fabs( 0.5 * T1 ) ) { - Pds_ini += T2 ; - } else { - flg_pprv = 1 ; - } - } - - T1 = Pds_ini - Pds ; - if ( T1 < - dP_max || T1 > dP_max ) flg_pprv = 0 ; /* flag changes */ - - } /* end of (flg_pprv>=1) if-block */ - - if ( flg_pprv == 0 ) { - /*---------------------------------------------------* - * Analytical initial guess. - *-----------------*/ - Pds_max = Fn_Max( Psl_lim - Ps0 , 0.0e0 ) ; - - Fn_SU( Pds_ini , Vds, (1.0e0 + c_pslini_1) * Pds_max, c_pslini_2, T1 ) ; - Pds_ini = Fn_Min( Pds_ini , Pds_max ) ; - } - - if ( Pds_ini < 0.0 ) Pds_ini = 0.0 ; - else if ( Pds_ini > Vds ) Pds_ini = Vds ; - - - /*---------------------------------------------------* - * Assign initial guess. - *-----------------*/ - Pds = Pds_ini ; - Psl = Ps0 + Pds ; - - /*---------------------------------------------------* - * Calculation of Psl by solving Poisson eqn. - * (beginning of Newton loop) - * - Fsl : Fsl = 0 is the equation to be solved. - * - dPsl : correction value. - *-----------------*/ - flg_conv = 0 ; - - /*---------------------------------------------------* - * start of Psl calculation. (label) - *-----------------*/ -start_of_loopl: - - for ( lp_sl = 1 ; lp_sl <= lp_sl_max + 1 ; lp_sl ++ ) { - - Chi = beta * ( Psl - Vbscl ) ; - - if ( Chi < znbd5 ) { - /*-------------------------------------------* - * zone-D2. (Psl) - * - Qb0 is approximated to 5-degree polynomial. - *-----------------*/ - - fi = Chi * Chi * Chi - * ( cn_im53 + Chi * ( cn_im54 + Chi * cn_im55 ) ) ; - fi_dChi = Chi * Chi - * ( 3 * cn_im53 + Chi * ( 4 * cn_im54 + Chi * 5 * cn_im55 ) ) ; - - cfs1 = cnst1 * exp_bVbsVds ; - - fsl1 = cfs1 * fi * fi ; - fsl1_dPsl = cfs1 * beta * 2 * fi * fi_dChi ; - - fb = Chi * ( cn_nc51 - + Chi * ( cn_nc52 - + Chi * ( cn_nc53 - + Chi * ( cn_nc54 + Chi * cn_nc55 ) ) ) ) ; - fb_dChi = cn_nc51 - + Chi * ( 2 * cn_nc52 - + Chi * ( 3 * cn_nc53 - + Chi * ( 4 * cn_nc54 + Chi * 5 * cn_nc55 ) ) ) ; - - fsl2 = sqrt( fb * fb + fsl1 ) ; - fsl2_dPsl = ( beta * fb_dChi * 2 * fb + fsl1_dPsl ) / ( fsl2 + fsl2 ) ; - - } else { - /*-------------------------------------------* - * zone-D3. (Psl) - *-----------------*/ - Rho = beta * ( Psl - Vds ) ; - exp_Rho = exp( Rho ) ; - - fsl1 = cnst1 * ( exp_Rho - exp_bVbsVds ) ; - fsl1_dPsl = cnst1 * beta * ( exp_Rho ) ; - Xil = Chi - 1.0e0 ; - fsl2 = sqrt( Xil + fsl1 ) ; - fsl2_dPsl = ( beta + fsl1_dPsl ) / ( fsl2 + fsl2 ) ; - } - - Fsl = Vgp - Psl - fac1 * fsl2 ; - Fsl_dPsl = - 1.0e0 - fac1 * fsl2_dPsl ; - - if ( flg_conv == 1 ) break ; - - dPsl = - Fsl / Fsl_dPsl ; - - /*-------------------------------------------* - * Update Psl . - * - clamped to Vbscl if Psl < Vbscl . - *-----------------*/ - dPlim = 0.5*dP_max*(1.0 + Fn_Max(1.e0,fabs(Psl))) ; - if ( fabs( dPsl ) > dPlim ) dPsl = dPlim * Fn_Sgn( dPsl ) ; - Psl = Psl + dPsl ; - - - /*-------------------------------------------* - * Check convergence. - * NOTE: This condition may be too rigid. - *-----------------*/ - if ( fabs( dPsl ) <= ps_conv && fabs( Fsl ) <= gs_conv ) { - flg_conv = 1 ; - } - } /* end of Psl Newton loop */ - - /* Reduce loop count to exclude derivative calculation sweep */ - lp_sl -- ; - - /*-------------------------------------------* - * Procedure for diverged case. - *-----------------*/ - if ( flg_conv == 0 ) { - fprintf( stderr , - "*** warning(HiSIM_HV(%s)): Went Over Iteration Maximum (Psl)\n", model->HSMHV2modName ) ; - fprintf( stderr , - " Vbse = %7.3f Vdse = %7.3f Vgse = %7.3f\n" , - Vbse , Vdse , Vgse ) ; - if ( flg_info >= 2 ) { - printf("*** warning(HiSIM_HV(%s)): Went Over Iteration Maximum (Psl)\n", model->HSMHV2modName ) ; - } - } - - - /*---------------------------------------------------* - * Evaluate derivatives of Psl. - * - note: Here, fsl1_dVbs and fsl2_dVbs are derivatives - * w.r.t. explicit Vbscl. So, Psl in the fsl1 and fsl2 - * expressions is regarded as a constant. - *-----------------*/ - Chi_dT = ( Psl - Vbscl ) * beta_dT - Vbscl_dT * beta ; - - if ( Chi < znbd5 ) { - T1 = cfs1 * beta * fi ; - fsl1_dVbs = T1 * ( ( Vbscl_dVbs - Vdseff_dVbs ) * fi - 2.0 * fi_dChi * Vbscl_dVbs ) ; - fsl1_dVds = - T1 * fi * Vdseff_dVds ; - fsl1_dVgs = - T1 * fi * Vdseff_dVgs ; - cfs1_dT = exp_bVbsVds * cnst1_dT + cnst1 * exp_bVbsVds_dT ; - fsl1_dT = fi * fi * cfs1_dT + 2 * cfs1 * fi * fi_dChi * Chi_dT ; - T2 = 0.5 / fsl2 ; - fsl2_dVbs = ( - beta * fb_dChi * 2 * fb * Vbscl_dVbs + fsl1_dVbs ) * T2 ; - fsl2_dVds = fsl1_dVds * T2 ; - fsl2_dVgs = fsl1_dVgs * T2 ; - fsl2_dT = ( 2 * fb * fb_dChi * Chi_dT + fsl1_dT ) * T2 ; - } else { - Rho_dT = beta_dT * ( Psl - Vds ) - beta * Vdseff_dT ; - exp_Rho_dT = Rho_dT * exp_Rho ; - - T1 = cnst1 * beta ; - fsl1_dVbs = - T1 * ( exp_Rho * Vdseff_dVbs - + ( Vbscl_dVbs - Vdseff_dVbs ) * exp_bVbsVds ); - fsl1_dVds = - T1 * Vdseff_dVds * ( exp_Rho - exp_bVbsVds ); - fsl1_dVgs = T1 * Vdseff_dVgs * ( - exp_Rho + exp_bVbsVds ); - fsl1_dT = cnst1 * ( exp_Rho_dT - exp_bVbsVds_dT ) + cnst1_dT * ( exp_Rho - exp_bVbsVds ) ; - T2 = 0.5e0 / fsl2 ; - fsl2_dVbs = ( - beta * Vbscl_dVbs + fsl1_dVbs ) * T2 ; - fsl2_dVds = ( fsl1_dVds ) * T2 ; - fsl2_dVgs = ( fsl1_dVgs ) * T2 ; - fsl2_dT = ( Chi_dT + fsl1_dT ) * T2 ; - } - - T1 = 1.0 / Fsl_dPsl ; - Psl_dVbs = - ( Vgp_dVbs - ( fac1 * fsl2_dVbs + fac1_dVbs * fsl2 ) ) * T1 ; - Psl_dVds = - ( Vgp_dVds - ( fac1 * fsl2_dVds + fac1_dVds * fsl2 ) ) * T1 ; - Psl_dVgs = - ( Vgp_dVgs - ( fac1 * fsl2_dVgs + fac1_dVgs * fsl2 ) ) * T1 ; - Psl_dT = - ( Vgp_dT - ( fac1 * fsl2_dT + fac1_dT * fsl2 ) ) * T1 ; - - Chi_dT = ( Psl - Vbscl ) * beta_dT + beta * ( Psl_dT - Vbscl_dT ); - exp_Chi_dT = exp_Chi * Chi_dT ; - - - if ( Chi < znbd5 ) { - /*-------------------------------------------* - * zone-D1/D2. (Psl) - *-----------------*/ - Xil = fb * fb + epsm10 ; - T1 = 2 * fb * fb_dChi * beta ; - Xil_dVbs = T1 * ( Psl_dVbs - Vbscl_dVbs ) ; - Xil_dVds = T1 * Psl_dVds ; - Xil_dVgs = T1 * Psl_dVgs ; - Xil_dT = 2 * fb * fb_dChi * Chi_dT ; - - Xilp12 = fb + epsm10 ; - T1 = fb_dChi * beta ; - Xilp12_dVbs = T1 * ( Psl_dVbs - Vbscl_dVbs ) ; - Xilp12_dVds = T1 * Psl_dVds ; - Xilp12_dVgs = T1 * Psl_dVgs ; - Xilp12_dT = fb_dChi * Chi_dT ; - - Xilp32 = fb * fb * fb + epsm10 ; - T1 = 3 * fb * fb * fb_dChi * beta ; - Xilp32_dVbs = T1 * ( Psl_dVbs - Vbscl_dVbs ) ; - Xilp32_dVds = T1 * Psl_dVds ; - Xilp32_dVgs = T1 * Psl_dVgs ; - Xilp32_dT = 3 * fb * fb * fb_dChi * Chi_dT ; - - } else { - /*-------------------------------------------* - * zone-D3. (Psl) - *-----------------*/ - - Xil = Chi - 1.0e0 ; - Xil_dVbs = beta * ( Psl_dVbs - Vbscl_dVbs ) ; - Xil_dVds = beta * Psl_dVds ; - Xil_dVgs = beta * Psl_dVgs ; - Xil_dT = Chi_dT ; - - Xilp12 = sqrt( Xil ) ; - T1 = 0.5e0 / Xilp12 ; - Xilp12_dVbs = T1 * Xil_dVbs ; - Xilp12_dVds = T1 * Xil_dVds ; - Xilp12_dVgs = T1 * Xil_dVgs ; - Xilp12_dT = T1 * Xil_dT ; - - Xilp32 = Xil * Xilp12 ; - T1 = 1.5e0 * Xilp12 ; - Xilp32_dVbs = T1 * Xil_dVbs ; - Xilp32_dVds = T1 * Xil_dVds ; - Xilp32_dVgs = T1 * Xil_dVgs ; - Xilp32_dT = T1 * Xil_dT ; - - } - - - /*---------------------------------------------------* - * Assign Pds. - *-----------------*/ - Pds = Psl - Ps0 ; - - /* if ( Pds < ps_conv ) { */ - if ( Pds < 0.0 ) { /* take care of numerical noise */ - Pds = 0.0 ; - Psl = Ps0 ; - } - - Pds_dVbs = Psl_dVbs - Ps0_dVbs ; - Pds_dVds = Psl_dVds - Ps0_dVds ; - Pds_dVgs = Psl_dVgs - Ps0_dVgs ; - Pds_dT = Psl_dT - Ps0_dT ; - - /* if ( Pds < ps_conv ) { */ - if ( Pds < 0.0 ) { - Pds_dVbs = 0.0 ; - Pds_dVgs = 0.0 ; - Psl_dVbs = Ps0_dVbs ; - Psl_dVgs = Ps0_dVgs ; - Pds_dT = 0.0 ; - Psl_dT = Ps0_dT ; - } - - /* Vdseff */ - Vds = Vdsorg; - - /*-----------------------------------------------------------* - * Evaluate Idd. - * - Eta : substantial variable of QB'/Pds and Idd/Pds. - * - note: Eta = 4 * GAMMA_{hisim_0} - *-----------------*/ - T1 = beta / Xi0 ; - Eta = T1 * Pds ; - T2 = Eta * beta_inv ; - Eta_dVbs = T1 * ( Pds_dVbs - Xi0_dVbs * T2 ) ; - Eta_dVds = T1 * ( Pds_dVds - Xi0_dVds * T2 ) ; - Eta_dVgs = T1 * ( Pds_dVgs - Xi0_dVgs * T2 ) ; - T1_dT = ( beta_dT * Xi0 - beta * Xi0_dT ) / Xi0 / Xi0 ; - Eta_dT = T1_dT * Pds + T1 * Pds_dT ; - - /* ( Eta + 1 )^n */ - Eta1 = Eta + 1.0e0 ; - Eta1p12 = sqrt( Eta1 ) ; - Eta1p32 = Eta1p12 * Eta1 ; - Eta1p52 = Eta1p32 * Eta1 ; - Eta1_dT = Eta_dT ; - Eta1p12_dT = 0.5e0 / Eta1p12 * Eta1_dT ; - Eta1p32_dT = Eta1p12_dT * Eta1 + Eta1p12 * Eta1_dT ; - Eta1p52_dT = Eta1p32_dT * Eta1 + Eta1p32 * Eta1_dT ; - - /* 1 / ( ( Eta + 1 )^n + 1 ) */ - Zeta12 = 1.0e0 / ( Eta1p12 + 1.0e0 ) ; - Zeta32 = 1.0e0 / ( Eta1p32 + 1.0e0 ) ; - Zeta52 = 1.0e0 / ( Eta1p52 + 1.0e0 ) ; - Zeta12_dT = - 1.0e0 / ( Eta1p12 + 1.0e0 ) / ( Eta1p12 + 1.0e0 ) * Eta1p12_dT ; - Zeta32_dT = - 1.0e0 / ( Eta1p32 + 1.0e0 ) / ( Eta1p32 + 1.0e0 ) * Eta1p32_dT ; - Zeta52_dT = - 1.0e0 / ( Eta1p52 + 1.0e0 ) / ( Eta1p52 + 1.0e0 ) * Eta1p52_dT ; - - /*---------------------------------------------------* - * F00 := PS00/Pds (n=1/2) - *-----------------*/ - F00 = Zeta12 / Xi0p12 ; - T3 = - 1 / Xi0 ; - T4 = - 0.5e0 / Eta1p12 * F00 ; - T5 = Zeta12 * T3 ; - T6 = Zeta12 * T4 ; - F00_dVbs = ( Xi0p12_dVbs * T5 + Eta_dVbs * T6 ) ; - F00_dVds = ( Xi0p12_dVds * T5 + Eta_dVds * T6 ) ; - F00_dVgs = ( Xi0p12_dVgs * T5 + Eta_dVgs * T6 ) ; - F00_dT = ( Zeta12_dT * Xi0p12 - Zeta12 * Xi0p12_dT ) / Xi0p12 / Xi0p12 ; - - /*---------------------------------------------------* - * F10 := PS10/Pds (n=3/2) - *-----------------*/ - T1 = 3.0e0 + Eta * ( 3.0e0 + Eta ) ; - F10 = C_2o3 * Xi0p12 * Zeta32 * T1 ; - T2 = 3.0e0 + Eta * 2.0e0 ; - T3 = C_2o3 * T1 ; - T4 = - 1.5e0 * Eta1p12 * F10 + C_2o3 * Xi0p12 * T2 ; - T5 = Zeta32 * T3 ; - T6 = Zeta32 * T4 ; - F10_dVbs = ( Xi0p12_dVbs * T5 + Eta_dVbs * T6 ) ; - F10_dVds = ( Xi0p12_dVds * T5 + Eta_dVds * T6 ) ; - F10_dVgs = ( Xi0p12_dVgs * T5 + Eta_dVgs * T6 ) ; - T1_dT = Eta_dT * ( 3.0e0 + Eta ) + Eta * Eta_dT ; - F10_dT = C_2o3 * Xi0p12 * Zeta32 * T1_dT - + C_2o3 * T1 * ( Xi0p12 * Zeta32_dT + Zeta32 * Xi0p12_dT ) ; - - /*---------------------------------------------------* - * F30 := PS30/Pds (n=5/2) - *-----------------*/ - T1 = 5e0 + Eta * ( 10e0 + Eta * ( 10e0 + Eta * ( 5e0 + Eta ) ) ) ; - F30 = 4e0 / ( 15e0 * beta ) * Xi0p32 * Zeta52 * T1 ; - T2 = 10e0 + Eta * ( 20e0 + Eta * ( 15e0 + Eta * 4e0 ) ) ; - T3 = 4e0 / ( 15e0 * beta ) * T1 ; - T4 = - ( 5e0 / 2e0 ) * Eta1p32 * F30 + 4e0 / ( 15e0 * beta ) * Xi0p32 * T2 ; - T5 = Zeta52 * T3 ; - T6 = Zeta52 * T4 ; - F30_dVbs = ( Xi0p32_dVbs * T5 + Eta_dVbs * T6 ) ; - F30_dVds = ( Xi0p32_dVds * T5 + Eta_dVds * T6 ) ; - F30_dVgs = ( Xi0p32_dVgs * T5 + Eta_dVgs * T6 ) ; - T1_dT = ( 10e0 + 20e0 * Eta + 15e0 * Eta * Eta + 4e0 * Eta * Eta * Eta ) * Eta_dT ; - F30_dT = 4e0 / 15e0 * beta_inv_dT * ( Xi0p32 * Zeta52 * T1 ) - + 4e0 / 15e0 * beta_inv * ( Xi0p32_dT * Zeta52 * T1 + Xi0p32 * Zeta52_dT * T1 + Xi0p32 * Zeta52 * T1_dT ) ; - - /*---------------------------------------------------* - * F11 := PS11/Pds. - *-----------------*/ - F11 = Ps0 * F10 + C_2o3 * beta_inv * Xilp32 - F30 ; - T1 = C_2o3 * beta_inv ; - F11_dVbs = Ps0_dVbs * F10 + Ps0 * F10_dVbs - + T1 * Xilp32_dVbs - F30_dVbs ; - F11_dVds = Ps0_dVds * F10 + Ps0 * F10_dVds - + T1 * Xilp32_dVds - F30_dVds ; - F11_dVgs = Ps0_dVgs * F10 + Ps0 * F10_dVgs - + T1 * Xilp32_dVgs - F30_dVgs ; - F11_dT = Ps0_dT * F10 + Ps0 * F10_dT - + C_2o3 *( beta_inv_dT * Xilp32 + beta_inv * Xilp32_dT ) - F30_dT ; - - /*---------------------------------------------------* - * Fdd := Idd/Pds. - *-----------------*/ - T1 = Vgp + beta_inv - 0.5e0 * ( 2.0e0 * Ps0 + Pds ) ; - T2 = - F10 + F00 ; - T3 = beta * Cox ; - T4 = beta * cnst0 ; - Fdd = T3 * T1 + T4 * T2 ; - Fdd_dVbs = T3 * ( Vgp_dVbs - Ps0_dVbs - 0.5e0 * Pds_dVbs ) - + beta * Cox_dVb * T1 + T4 * ( - F10_dVbs + F00_dVbs ) ; - Fdd_dVds = T3 * ( Vgp_dVds - Ps0_dVds - 0.5e0 * Pds_dVds ) - + beta * Cox_dVd * T1 + T4 * ( - F10_dVds + F00_dVds ) ; - Fdd_dVgs = T3 * ( Vgp_dVgs - Ps0_dVgs - 0.5e0 * Pds_dVgs ) - + beta * Cox_dVg * T1 + T4 * ( - F10_dVgs + F00_dVgs ) ; - T1_dT = Vgp_dT + beta_inv_dT - 0.5e0 * ( 2.0e0 * Ps0_dT + Pds_dT ) ; - T2_dT = -F10_dT + F00_dT ; - T3_dT = Cox * beta_dT ; - T4_dT = beta * cnst0_dT + cnst0 * beta_dT ; - Fdd_dT = T1 * T3_dT + T3 * T1_dT + T2 * T4_dT + T4 * T2_dT ; - - - /*---------------------------------------------------* - * Idd: - *-----------------*/ - Idd = Pds * Fdd ; - Idd_dVbs = Pds_dVbs * Fdd + Pds * Fdd_dVbs ; - Idd_dVds = Pds_dVds * Fdd + Pds * Fdd_dVds ; - Idd_dVgs = Pds_dVgs * Fdd + Pds * Fdd_dVgs ; - Idd_dT = Fdd * Pds_dT + Pds * Fdd_dT ; - - /*-----------------------------------------------------------* - * Skip CLM and integrated charges if zone==D1 - *-----------------*/ - if( flg_zone == 1 ) { - goto start_of_mobility ; - } - - /*-----------------------------------------------------------* - * Channel Length Modulation. Lred: \Delta L - *-----------------*/ - if( pParam->HSMHV2_clm2 < epsm10 && pParam->HSMHV2_clm3 < epsm10 ) { - Lred = 0.0e0 ; - Lred_dVbs = 0.0e0 ; - Lred_dVds = 0.0e0 ; - Lred_dVgs = 0.0e0 ; - Lred_dT = 0.0e0 ; - - Psdl = Psl ; - Psdl_dVbs = Psl_dVbs ; - Psdl_dVds = Psl_dVds ; - Psdl_dVgs = Psl_dVgs ; - Psdl_dT = Psl_dT ; - - if ( Psdl > Ps0 + Vds - epsm10 ) { - Psdl = Ps0 + Vds - epsm10 ; - Psdl_dVbs = Ps0_dVbs ; - Psdl_dVds = Ps0_dVds + 1.0 ; - Psdl_dVgs = Ps0_dVgs ; - Psdl_dT = Ps0_dT ; - } - - } else { - T1 = here->HSMHV2_wdpl ; - T8 = sqrt (Psl - Vbscl) ; - Wd = T1 * T8 ; - T9 = 0.5 * T1 / T8 ; - Wd_dVbs = T9 * (Psl_dVbs - Vbscl_dVbs) ; - Wd_dVds = T9 * Psl_dVds ; - Wd_dVgs = T9 * Psl_dVgs ; - Wd_dT = T9 * (Psl_dT - Vbscl_dT) ; - - T0 = 1.0 / Wd ; - T1 = Qn0 * T0 ; - T2 = pParam->HSMHV2_clm3 * T1 ; - T3 = pParam->HSMHV2_clm3 * T0 ; - T2_dVb = T3 * (Qn0_dVbs - T1 * Wd_dVbs) ; - T2_dVd = T3 * (Qn0_dVds - T1 * Wd_dVds) ; - T2_dVg = T3 * (Qn0_dVgs - T1 * Wd_dVgs) ; - T2_dT = T3 * (Qn0_dT - T1 * Wd_dT) ; - - T5 = pParam->HSMHV2_clm2 * q_Nsub + T2 ; - T1 = 1.0 / T5 ; - T4 = C_ESI * T1 ; - T4_dVb = - T4 * T2_dVb * T1 ; - T4_dVd = - T4 * T2_dVd * T1 ; - T4_dVg = - T4 * T2_dVg * T1 ; - T4_dT = -T4 * T2_dT * T1 ; - - T1 = (1.0e0 - pParam->HSMHV2_clm1) ; - Psdl = pParam->HSMHV2_clm1 * (Vds + Ps0) + T1 * Psl ; - Psdl_dVbs = pParam->HSMHV2_clm1 * Ps0_dVbs + T1 * Psl_dVbs ; - Psdl_dVds = pParam->HSMHV2_clm1 * (1.0 + Ps0_dVds) + T1 * Psl_dVds ; - Psdl_dVgs = pParam->HSMHV2_clm1 * Ps0_dVgs + T1 * Psl_dVgs ; - Psdl_dT = pParam->HSMHV2_clm1 * Ps0_dT + T1 * Psl_dT ; - - if ( Psdl > Ps0 + Vds - epsm10 ) { - Psdl = Ps0 + Vds - epsm10 ; - Psdl_dVbs = Ps0_dVbs ; - Psdl_dVds = Ps0_dVds + 1.0 ; - Psdl_dVgs = Ps0_dVgs ; - Psdl_dT = Ps0_dT ; - } - T6 = Psdl - Psl ; - T6_dVb = Psdl_dVbs - Psl_dVbs ; - T6_dVd = Psdl_dVds - Psl_dVds ; - T6_dVg = Psdl_dVgs - Psl_dVgs ; - T6_dT = Psdl_dT - Psl_dT ; - - T3 = beta * Qn0 ; - T1 = 1.0 / T3 ; - T5 = Idd * T1 ; - T3_dT = beta * Qn0_dT + beta_dT * Qn0 ; - T1_dT = - T1 * T1 * T3_dT ; - T5_dT = Idd_dT * T1 + Idd * T1_dT ; - T2 = T5 * beta ; - T5_dVb = (Idd_dVbs - T2 * Qn0_dVbs) * T1 ; - T5_dVd = (Idd_dVds - T2 * Qn0_dVds) * T1 ; - T5_dVg = (Idd_dVgs - T2 * Qn0_dVgs) * T1 ; - - T10 = q_Nsub / C_ESI ; - T1 = 1.0e5 ; - T2 = 1.0 / Leff ; - T11 = (2.0 * T5 + 2.0 * T10 * T6 * T4 + T1 * T4) * T2 ; - T3 = T2 * T4 ; - T7 = T11 * T4 ; - T7_dVb = (2.0 * T5_dVb + 2.0 * T10 * (T6_dVb * T4 + T6 * T4_dVb) + T1 * T4_dVb) * T3 + T11 * T4_dVb ; - T7_dVd = (2.0 * T5_dVd + 2.0 * T10 * (T6_dVd * T4 + T6 * T4_dVd) + T1 * T4_dVd) * T3 + T11 * T4_dVd ; - T7_dVg = (2.0 * T5_dVg + 2.0 * T10 * (T6_dVg * T4 + T6 * T4_dVg) + T1 * T4_dVg) * T3 + T11 * T4_dVg ; - T7_dT = (2.0 * T5_dT + 2.0 * T10 * ( T6_dT * T4 + T6 * T4_dT ) + T1 * T4_dT ) * T3 + T11 * T4_dT ; - - T11 = 4.0 * (2.0 * T10 * T6 + T1) ; - T1 = 8.0 * T10 * T4 * T4 ; - T2 = 2.0 * T11 * T4 ; - T8 = T11 * T4 * T4 ; - T8_dVb = ( T1 * T6_dVb + T2 * T4_dVb) ; - T8_dVd = ( T1 * T6_dVd + T2 * T4_dVd) ; - T8_dVg = ( T1 * T6_dVg + T2 * T4_dVg) ; - T8_dT = ( T1 * T6_dT + T2 * T4_dT) ; - - T9 = sqrt (T7 * T7 + T8); - T1 = 1.0 / T9 ; - T2 = T7 * T1 ; - T3 = 0.5 * T1 ; - T9_dVb = (T2 * T7_dVb + T3 * T8_dVb) ; - T9_dVd = (T2 * T7_dVd + T3 * T8_dVd) ; - T9_dVg = (T2 * T7_dVg + T3 * T8_dVg) ; - T9_dT = (T2 * T7_dT + T3 * T8_dT) ; - - Lred = 0.5 * (- T7 + T9) ; - Lred_dVbs = 0.5 * (- T7_dVb + T9_dVb) ; - Lred_dVds = 0.5 * (- T7_dVd + T9_dVd) ; - Lred_dVgs = 0.5 * (- T7_dVg + T9_dVg) ; - Lred_dT = 0.5 * (- T7_dT + T9_dT ) ; - /*---------------------------------------------------* - * Modify Lred for symmetry. - *-----------------*/ - T1 = Lred ; - Lred = FMDVDS * T1 ; - Lred_dVbs = FMDVDS_dVbs * T1 + FMDVDS * Lred_dVbs ; - Lred_dVds = FMDVDS_dVds * T1 + FMDVDS * Lred_dVds ; - Lred_dVgs = FMDVDS_dVgs * T1 + FMDVDS * Lred_dVgs ; - Lred_dT = FMDVDS_dT * T1 + FMDVDS * Lred_dT ; - } - - /* CLM5 & CLM6 */ - Lred *= here->HSMHV2_clmmod ; - Lred_dVbs *= here->HSMHV2_clmmod ; - Lred_dVds *= here->HSMHV2_clmmod ; - Lred_dVgs *= here->HSMHV2_clmmod ; - Lred_dT *= here->HSMHV2_clmmod ; - - /*---------------------------------------------------* - * Qbu : -Qb in unit area. - *-----------------*/ - T1 = Vgp + beta_inv ; - T2 = T1 * F10 - F11 ; - T1_dT = Vgp_dT + beta_inv_dT ; - T2_dT = T1_dT * F10 + T1 * F10_dT - F11_dT ; - - Qbnm = cnst0 * ( cnst0 * ( 1.5e0 - ( Xi0 + 1.0e0 ) - 0.5e0 * beta * Pds ) - + Cox * T2 ) ; - Qbnm_dVbs = cnst0 * ( cnst0 * ( - Xi0_dVbs - 0.5e0 * beta * Pds_dVbs ) - + Cox * ( Vgp_dVbs * F10 + T1 * F10_dVbs - F11_dVbs ) - + Cox_dVb * T2 ) ; - Qbnm_dVds = cnst0 * ( cnst0 * ( - Xi0_dVds - 0.5e0 * beta * Pds_dVds ) - + Cox * ( Vgp_dVds * F10 + T1 * F10_dVds - F11_dVds ) - + Cox_dVd * T2 ) ; - Qbnm_dVgs = cnst0 * ( cnst0 * ( - Xi0_dVgs - 0.5e0 * beta * Pds_dVgs ) - + Cox * ( Vgp_dVgs * F10 + T1 * F10_dVgs - F11_dVgs ) - + Cox_dVg * T2 ) ; - Qbnm_dT = cnst0_dT * ( cnst0 * ( 1.5e0 - ( Xi0 + 1.0e0 ) - 0.5e0 * beta * Pds ) - + Cox * T2 ) - + cnst0 * ( cnst0_dT * ( 1.5e0 - ( Xi0 + 1.0e0 ) - 0.5e0 * beta * Pds ) - + cnst0 * ( - Xi0_dT - 0.5 * beta_dT * Pds - 0.5 * beta * Pds_dT ) - + Cox * T2_dT ); - - T1 = beta ; - Qbu = T1 * Qbnm / Fdd ; - T2 = T1 / ( Fdd * Fdd ) ; - Qbu_dVbs = T2 * ( Fdd * Qbnm_dVbs - Qbnm * Fdd_dVbs ) ; - Qbu_dVds = T2 * ( Fdd * Qbnm_dVds - Qbnm * Fdd_dVds ) ; - Qbu_dVgs = T2 * ( Fdd * Qbnm_dVgs - Qbnm * Fdd_dVgs ) ; - T1_dT = beta_dT ; - Qbu_dT = ( Fdd * ( T1_dT * Qbnm + T1 * Qbnm_dT ) - T1 * Qbnm * Fdd_dT ) / ( Fdd * Fdd ) ; - - - /*---------------------------------------------------* - * preparation for Qi and Qd. - * - DtPds: Delta * Pds ; - * - Achi: (1+Delta) * Pds ; - *-----------------*/ - T1 = 2.0e0 * fac1 ; - DtPds = T1 * ( F10 - Xi0p12 ) ; - T2 = 2.0 * ( F10 - Xi0p12 ) ; - DtPds_dVbs = T1 * ( F10_dVbs - Xi0p12_dVbs ) - + T2 * fac1_dVbs ; - DtPds_dVds = T1 * ( F10_dVds - Xi0p12_dVds ) - + T2 * fac1_dVds ; - DtPds_dVgs = T1 * ( F10_dVgs - Xi0p12_dVgs ) - + T2 * fac1_dVgs ; - T1_dT = 2.0e0 * fac1_dT ; - DtPds_dT = T1_dT * ( F10 - Xi0p12 ) + T1 * ( F10_dT -Xi0p12_dT ) ; - - Achi = Pds + DtPds ; - Achi_dVbs = Pds_dVbs + DtPds_dVbs ; - Achi_dVds = Pds_dVds + DtPds_dVds ; - Achi_dVgs = Pds_dVgs + DtPds_dVgs ; - Achi_dT = Pds_dT + DtPds_dT ; - - /*-----------------------------------------------------------* - * Alpha : parameter to evaluate charges. - * - Achi: (1+Delta) * Pds ; - * - clamped to 0 if Alpha < 0. - *-----------------*/ - T1 = 1.0 / VgVt ; - T2 = Achi * T1 ; - T3 = 1.0e0 - T2 ; - TX = 1.0 - T3 ; - Fn_CP( TY , TX , 1.0 , 4 , T4 ) ; - Alpha = 1.0 - TY ; - T5 = T1 * T4 ; - Alpha_dVbs = - ( Achi_dVbs - T2 * VgVt_dVbs ) * T5 ; - Alpha_dVds = - ( Achi_dVds - T2 * VgVt_dVds ) * T5 ; - Alpha_dVgs = - ( Achi_dVgs - T2 * VgVt_dVgs ) * T5 ; - Alpha_dT = - ( Achi_dT - T2 * VgVt_dT ) * T5 ; - - - /*-----------------------------------------------------------* - * Qiu : -Qi in unit area. - *-----------------*/ - - Qinm = 1.0e0 + Alpha * ( 1.0e0 + Alpha ) ; - T1 = 1.0e0 + Alpha + Alpha ; - Qinm_dVbs = Alpha_dVbs * T1 ; - Qinm_dVds = Alpha_dVds * T1 ; - Qinm_dVgs = Alpha_dVgs * T1 ; - Qinm_dT = Alpha_dT * T1 ; - - Qidn = Fn_Max( 1.0e0 + Alpha , epsm10 ) ; - Qidn_dVbs = Alpha_dVbs ; - Qidn_dVds = Alpha_dVds ; - Qidn_dVgs = Alpha_dVgs ; - Qidn_dT = Alpha_dT ; - - T1 = C_2o3 * VgVt * Qinm / Qidn ; - Qiu = T1 * Cox ; - T2 = 1.0 / VgVt ; - T3 = 1.0 / Qinm ; - T4 = 1.0 / Qidn ; - Qiu_dVbs = Qiu * ( VgVt_dVbs * T2 + Qinm_dVbs * T3 - Qidn_dVbs * T4 ) - + T1 * Cox_dVb ; - Qiu_dVds = Qiu * ( VgVt_dVds * T2 + Qinm_dVds * T3 - Qidn_dVds * T4) - + T1 * Cox_dVd ; - Qiu_dVgs = Qiu * ( VgVt_dVgs * T2 + Qinm_dVgs * T3 - Qidn_dVgs * T4) - + T1 * Cox_dVg ; - T1_dT = C_2o3 * ( Qidn * ( VgVt_dT * Qinm + VgVt * Qinm_dT ) - Qidn_dT * VgVt * Qinm ) - / ( Qidn * Qidn ) ; - Qiu_dT = Cox * T1_dT ; - - - /*-----------------------------------------------------------* - * Qdrat : Qd/Qi - *-----------------*/ - Qdnm = 0.5e0 + Alpha ; - Qdnm_dVbs = Alpha_dVbs ; - Qdnm_dVds = Alpha_dVds ; - Qdnm_dVgs = Alpha_dVgs ; - Qdnm_dT = Alpha_dT ; - - Qddn = Qidn * Qinm ; - Qddn_dVbs = Qidn_dVbs * Qinm + Qidn * Qinm_dVbs ; - Qddn_dVds = Qidn_dVds * Qinm + Qidn * Qinm_dVds ; - Qddn_dVgs = Qidn_dVgs * Qinm + Qidn * Qinm_dVgs ; - Qddn_dT = Qidn_dT * Qinm + Qidn * Qinm_dT ; - - Quot = 0.4e0 * Qdnm / Qddn ; - Qdrat = 0.6e0 - Quot ; - - if ( Qdrat <= 0.5e0 ) { - T1 = 1.0 / Qddn ; - T2 = 1.0 / Qdnm ; - Qdrat_dVbs = Quot * ( Qddn_dVbs * T1 - Qdnm_dVbs * T2 ) ; - Qdrat_dVds = Quot * ( Qddn_dVds * T1 - Qdnm_dVds * T2 ) ; - Qdrat_dVgs = Quot * ( Qddn_dVgs * T1 - Qdnm_dVgs * T2 ) ; - Qdrat_dT = Quot * ( Qddn_dT * T1 - Qdnm_dT * T2 ) ; - } else { - Qdrat = 0.5e0 ; - Qdrat_dVbs = 0.0e0 ; - Qdrat_dVds = 0.0e0 ; - Qdrat_dVgs = 0.0e0 ; - Qdrat_dT = 0.0e0 ; - - } - - - /*-----------------------------------------------------------* - * Interpolate charges and CLM for zone-D2. - *-----------------*/ - - if ( flg_zone == 2 ) { - T1 = Qbu ; - Qbu = FD2 * Qbu + ( 1.0 - FD2 ) * Qb0 ; - Qbu_dVbs = FD2 * Qbu_dVbs + FD2_dVbs * T1 - + ( 1.0 - FD2 ) * Qb0_dVb - FD2_dVbs * Qb0 ; - Qbu_dVds = FD2 * Qbu_dVds + FD2_dVds * T1 - + ( 1.0 - FD2 ) * Qb0_dVd - FD2_dVds * Qb0 ; - Qbu_dVgs = FD2 * Qbu_dVgs + FD2_dVgs * T1 - + ( 1.0 - FD2 ) * Qb0_dVg - FD2_dVgs * Qb0 ; - Qbu_dT = FD2 * Qbu_dT + FD2_dT * T1 - + ( 1.0 - FD2 ) * Qb0_dT - FD2_dT * Qb0 ; - - if ( Qbu < 0.0 ) { - Qbu = 0.0 ; - Qbu_dVbs = 0.0 ; - Qbu_dVds = 0.0 ; - Qbu_dVgs = 0.0 ; - Qbu_dT = 0.0 ; - } - T1 = Qiu ; - Qiu = FD2 * Qiu + ( 1.0 - FD2 ) * Qn0 ; - Qiu_dVbs = FD2 * Qiu_dVbs + FD2_dVbs * T1 - + ( 1.0 - FD2 ) * Qn0_dVbs - FD2_dVbs * Qn0 ; - Qiu_dVds = FD2 * Qiu_dVds + FD2_dVds * T1 - + ( 1.0 - FD2 ) * Qn0_dVds - FD2_dVds * Qn0 ; - Qiu_dVgs = FD2 * Qiu_dVgs + FD2_dVgs * T1 - + ( 1.0 - FD2 ) * Qn0_dVgs - FD2_dVgs * Qn0 ; - Qiu_dT = FD2 * Qiu_dT + FD2_dT * T1 - + ( 1.0 - FD2 ) * Qn0_dT - FD2_dT * Qn0 ; - - if ( Qiu < 0.0 ) { - Qiu = 0.0 ; - Qiu_dVbs = 0.0 ; - Qiu_dVds = 0.0 ; - Qiu_dVgs = 0.0 ; - Qiu_dT = 0.0 ; - } - - T1 = Qdrat ; - Qdrat = FD2 * Qdrat + ( 1.0 - FD2 ) * 0.5e0 ; - Qdrat_dVbs = FD2 * Qdrat_dVbs + FD2_dVbs * T1 - FD2_dVbs * 0.5e0 ; - Qdrat_dVds = FD2 * Qdrat_dVds + FD2_dVds * T1 - FD2_dVds * 0.5e0 ; - Qdrat_dVgs = FD2 * Qdrat_dVgs + FD2_dVgs * T1 - FD2_dVgs * 0.5e0 ; - Qdrat_dT = FD2 * Qdrat_dT + FD2_dT * T1 - FD2_dT * 0.5e0 ; - - /* note: Lred=0 in zone-D1 */ - T1 = Lred ; - Lred = FD2 * Lred ; - Lred_dVbs = FD2 * Lred_dVbs + FD2_dVbs * T1 ; - Lred_dVds = FD2 * Lred_dVds + FD2_dVds * T1 ; - Lred_dVgs = FD2 * Lred_dVgs + FD2_dVgs * T1 ; - Lred_dT = FD2 * Lred_dT + FD2_dT * T1 ; - - } /* end of flg_zone==2 if-block */ - - -start_of_mobility: - - Lch = Leff - Lred ; - if ( Lch < 1.0e-9 ) { - fprintf ( stderr , "*** warning(HiSIM_HV(%s)): actual channel length is too small. (Lch=%e[m])\n" , model->HSMHV2modName, Lch ) ; - fprintf ( stderr , " CLM5 and/or CLM6 might be too large.\n" ) ; - Lch = 1.0e-9 ; Lch_dVbs = Lch_dVds = Lch_dVgs = 0.0 ; - Lch_dT = 0.0 ; - } else { Lch_dVbs = - Lred_dVbs ; Lch_dVds = - Lred_dVds ; Lch_dVgs = - Lred_dVgs ; - Lch_dT = - Lred_dT ; - } - - /*-----------------------------------------------------------* - * Muun : universal mobility. (CGS unit) - *-----------------*/ - - T1 = here->HSMHV2_ndep_o_esi ; - T2 = here->HSMHV2_ninv_o_esi ; - - T0 = here->HSMHV2_ninvd ; - T4 = 1.0 + ( Psl - Ps0 ) * T0 ; - T4_dVb = ( Psl_dVbs - Ps0_dVbs ) * T0 ; - T4_dVd = ( Psl_dVds - Ps0_dVds ) * T0 ; - T4_dVg = ( Psl_dVgs - Ps0_dVgs ) * T0 ; - T4_dT = ( Psl_dT - Ps0_dT ) * T0 + ( Psl - Ps0 ) * ninvd_dT ; - - T5 = T1 * Qbu + T2 * Qiu ; - T5_dVb = T1 * Qbu_dVbs + T2 * Qiu_dVbs ; - T5_dVd = T1 * Qbu_dVds + T2 * Qiu_dVds ; - T5_dVg = T1 * Qbu_dVgs + T2 * Qiu_dVgs ; - T5_dT = T1 * Qbu_dT + T2 * Qiu_dT ; - - T3 = T5 / T4 ; - T3_dVb = ( - T4_dVb * T5 + T4 * T5_dVb ) / T4 / T4 ; - T3_dVd = ( - T4_dVd * T5 + T4 * T5_dVd ) / T4 / T4 ; - T3_dVg = ( - T4_dVg * T5 + T4 * T5_dVg ) / T4 / T4 ; - T3_dT = ( - T4_dT * T5 + T4 * T5_dT ) / T4 / T4 ; - - Eeff = T3 ; - Eeff_dVbs = T3_dVb ; - Eeff_dVds = T3_dVd ; - Eeff_dVgs = T3_dVg ; - Eeff_dT = T3_dT ; - - T5 = Fn_Pow( Eeff , model->HSMHV2_mueph0 - 1.0e0 ) ; - T8 = T5 * Eeff ; - T7 = Fn_Pow( Eeff , here->HSMHV2_muesr - 1.0e0 ) ; - T6 = T7 * Eeff ; - T8_dT = model->HSMHV2_mueph0 * T5 * Eeff_dT ; - T6_dT = here->HSMHV2_muesr * T7 * Eeff_dT ; - - T9 = C_QE * C_m2cm_p2 ; - Rns = Qiu / T9 ; - Rns_dT = Qiu_dT / T9 ; - - T1 = 1.0e0 / ( pParam->HSMHV2_muecb0 + pParam->HSMHV2_muecb1 * Rns / 1.0e11 ) - + here->HSMHV2_mphn0 * T8 + T6 / pParam->HSMHV2_muesr1 ; - - - T1_dT = - 1.0e0 / ( pParam->HSMHV2_muecb0 + pParam->HSMHV2_muecb1 * Rns / 1.0e11 ) - / ( pParam->HSMHV2_muecb0 + pParam->HSMHV2_muecb1 * Rns / 1.0e11 ) - * pParam->HSMHV2_muecb1 * Rns_dT / 1.0e11 - + here->HSMHV2_mphn0 * T8_dT + mphn0_dT * T8 + T6_dT / pParam->HSMHV2_muesr1 ; - - Muun = 1.0e0 / T1 ; - Muun_dT = - Muun / T1 * T1_dT ; - - T1 = 1.0e0 / ( T1 * T1 ) ; - T2 = pParam->HSMHV2_muecb0 + pParam->HSMHV2_muecb1 * Rns / 1.0e11 ; - T2 = 1.0e0 / ( T2 * T2 ) ; - T3 = here->HSMHV2_mphn1 * T5 ; - T4 = here->HSMHV2_muesr * T7 / pParam->HSMHV2_muesr1 ; - T5 = - 1.0e-11 * pParam->HSMHV2_muecb1 / C_QE * T2 / C_m2cm_p2 ; - Muun_dVbs = - ( T5 * Qiu_dVbs - + Eeff_dVbs * T3 + Eeff_dVbs * T4 ) * T1 ; - Muun_dVds = - ( T5 * Qiu_dVds - + Eeff_dVds * T3 + Eeff_dVds * T4 ) * T1 ; - Muun_dVgs = - ( T5 * Qiu_dVgs - + Eeff_dVgs * T3 + Eeff_dVgs * T4 ) * T1 ; - - /* Change to MKS unit */ - Muun /= C_m2cm_p2 ; - Muun_dT /= C_m2cm_p2 ; - Muun_dVbs /= C_m2cm_p2 ; - Muun_dVds /= C_m2cm_p2 ; - Muun_dVgs /= C_m2cm_p2 ; - - /*-----------------------------------------------------------* - * Mu : mobility - *-----------------*/ - T2 = beta * (Qn0 + small) * Lch ; - - - T1 = 1.0e0 / T2 ; - T3 = T1 * T1 ; - T4 = - beta * T3 ; - T5 = T4 * Lch ; - T6 = T4 * (Qn0 + small) ; - T1_dVb = ( T5 * Qn0_dVbs + T6 * Lch_dVbs) ; - T1_dVd = ( T5 * Qn0_dVds + T6 * Lch_dVds) ; - T1_dVg = ( T5 * Qn0_dVgs + T6 * Lch_dVgs) ; - T2_dT = beta_dT * (Qn0 + small) * Lch + beta * Qn0_dT * Lch + beta * (Qn0 + small) * Lch_dT ; - T1_dT = - T1 / T2 * T2_dT ; - - TY = Idd * T1 ; - TY_dVbs = Idd_dVbs * T1 + Idd * T1_dVb ; - TY_dVds = Idd_dVds * T1 + Idd * T1_dVd ; - TY_dVgs = Idd_dVgs * T1 + Idd * T1_dVg ; - TY_dT = Idd_dT * T1 + Idd * T1_dT ; - - T2 = 0.2 * Vmax / Muun ; - T3 = - T2 / Muun ; - T2_dVb = T3 * Muun_dVbs ; - T2_dVd = T3 * Muun_dVds ; - T2_dVg = T3 * Muun_dVgs ; - T2_dT = 0.2 * ( Vmax_dT * Muun - Muun_dT * Vmax )/ ( Muun * Muun ) ; - - Ey = sqrt( TY * TY + T2 * T2 ) ; - T4 = 1.0 / Ey ; - Ey_dVbs = T4 * ( TY * TY_dVbs + T2 * T2_dVb ) ; - Ey_dVds = T4 * ( TY * TY_dVds + T2 * T2_dVd ) ; - Ey_dVgs = T4 * ( TY * TY_dVgs + T2 * T2_dVg ) ; - Ey_dT = T4 * ( TY * TY_dT + T2 * T2_dT ) ; - - Em = Muun * Ey ; - Em_dVbs = Muun_dVbs * Ey + Muun * Ey_dVbs ; - Em_dVds = Muun_dVds * Ey + Muun * Ey_dVds ; - Em_dVgs = Muun_dVgs * Ey + Muun * Ey_dVgs ; - Em_dT = Ey * Muun_dT + Ey_dT * Muun ; - - T1 = Em / Vmax ; - T1_dT = ( Em_dT * Vmax - Vmax_dT * Em ) / ( Vmax * Vmax ); - - /* note: model->HSMHV2_bb = 2 (electron) ;1 (hole) */ - if ( 1.0e0 - epsm10 <= model->HSMHV2_bb && model->HSMHV2_bb <= 1.0e0 + epsm10 ) { - T3 = 1.0e0 ; - T3_dT = 0.0e0 ; - } else if ( 2.0e0 - epsm10 <= model->HSMHV2_bb && model->HSMHV2_bb <= 2.0e0 + epsm10 ) { - T3 = T1 ; - T3_dT = T1_dT ; - } else { - T3 = Fn_Pow( T1 , model->HSMHV2_bb - 1.0e0 ) ; - T3_dT = ( model->HSMHV2_bb - 1.0e0 )* Fn_Pow( T1 , model->HSMHV2_bb - 2.0e0 ) * T1_dT ; - } - T2 = T1 * T3 ; - T4 = 1.0e0 + T2 ; - T2_dT = T1 * T3_dT + T3 * T1_dT ; - T4_dT = T2_dT ; - - if ( 1.0e0 - epsm10 <= model->HSMHV2_bb && model->HSMHV2_bb <= 1.0e0 + epsm10 ) { - T5 = 1.0 / T4 ; - T6 = T5 / T4 ; - T5_dT = - T5 * T5 * T4_dT ; - T6_dT = T5 * T5 * ( T5_dT * T4 - T5 * T4_dT ) ; - } else if ( 2.0e0 - epsm10 <= model->HSMHV2_bb && model->HSMHV2_bb <= 2.0e0 + epsm10 ) { - T5 = 1.0 / sqrt( T4 ) ; - T6 = T5 / T4 ; - T5_dT = - 0.5e0 / ( T4 * sqrt(T4)) * T4_dT ; - T6_dT = ( T5_dT * T4 - T5 * T4_dT ) / T4 / T4 ; - } else { - T6 = Fn_Pow( T4 , ( - 1.0e0 / model->HSMHV2_bb - 1.0e0 ) ) ; - T5 = T4 * T6 ; - T6_dT =( - 1.0e0 / model->HSMHV2_bb - 1.0e0 ) * Fn_Pow( T4 , ( - 1.0e0 / model->HSMHV2_bb - 2.0e0 ) ) * T4_dT ; - T5_dT = T4_dT * T6 + T4 * T6_dT ; - } - - T7 = Muun / Vmax * T6 * T3 ; - - Mu = Muun * T5 ; - Mu_dVbs = Muun_dVbs * T5 - T7 * Em_dVbs ; - Mu_dVds = Muun_dVds * T5 - T7 * Em_dVds ; - Mu_dVgs = Muun_dVgs * T5 - T7 * Em_dVgs ; - Mu_dT = Muun_dT * T5 + Muun * T5_dT ; - -/* end_of_mobility : */ - - /*-----------------------------------------------------------* - * Ids: channel current. - *-----------------*/ - betaWL = here->HSMHV2_weff_nf * beta_inv / Lch ; - T1 = - betaWL / Lch ; - betaWL_dVbs = T1 * Lch_dVbs ; - betaWL_dVds = T1 * Lch_dVds ; - betaWL_dVgs = T1 * Lch_dVgs ; - betaWL_dT = here->HSMHV2_weff_nf * ( beta_inv_dT * Lch - beta_inv * Lch_dT ) / ( Lch * Lch ) ; - - Ids0 = betaWL * Idd * Mu ; - T1 = betaWL * Idd ; - T2 = Idd * Mu ; - T3 = Mu * betaWL ; - Ids0_dVbs = T3 * Idd_dVbs + T1 * Mu_dVbs + T2 * betaWL_dVbs ; - Ids0_dVds = T3 * Idd_dVds + T1 * Mu_dVds + T2 * betaWL_dVds ; - Ids0_dVgs = T3 * Idd_dVgs + T1 * Mu_dVgs + T2 * betaWL_dVgs ; - Ids0_dT = T3 * Idd_dT + T1 * Mu_dT + T2 * betaWL_dT ; - - /*-----------------------------------------------------------* - * Adding parasitic components to the channel current. - *-----------------*/ - if( model->HSMHV2_ptl != 0 ){ - T1 = 0.5 * ( Vds - Pds ) ; - Fn_SymAdd( T6 , T1 , 0.01 , T2 ) ; - T2 *= 0.5 ; - T6_dVb = T2 * ( - Pds_dVbs ) ; - T6_dVd = T2 * ( 1.0 - Pds_dVds ) ; - T6_dVg = T2 * ( - Pds_dVgs ) ; - T6_dT = T2 * ( - Pds_dT ) ; - - T1 = 1.1 - ( Ps0 + T6 ); - T1_dVb = - ( Ps0_dVbs + T6_dVb ); - T1_dVd = - ( Ps0_dVds + T6_dVd ); - T1_dVg = - ( Ps0_dVgs + T6_dVg ); - T1_dT = - ( Ps0_dT + T6_dT ); - - Fn_SZ( T2 , T1 , 0.05 , T0 ) ; - T2 += small ; - T2_dVb = T1_dVb * T0 ; - T2_dVd = T1_dVd * T0 ; - T2_dVg = T1_dVg * T0 ; - T2_dT = T1_dT * T0 ; - - T0 = beta * here->HSMHV2_ptl0 ; - T0_dT = beta_dT * here->HSMHV2_ptl0 ; - T3 = Cox * T0 ; - T3_dVb = Cox_dVb * T0 ; - T3_dVd = Cox_dVd * T0 ; - T3_dVg = Cox_dVg * T0 ; - T3_dT = Cox_dT * T0 + Cox * T0_dT ; - T0 = pow( T2 , model->HSMHV2_ptp ) ; - T9 = T3 * T0 ; - T9_dVb = T3 * model->HSMHV2_ptp * T0 / T2 * T2_dVb + T3_dVb * T0 ; - T9_dVd = T3 * model->HSMHV2_ptp * T0 / T2 * T2_dVd + T3_dVd * T0 ; - T9_dVg = T3 * model->HSMHV2_ptp * T0 / T2 * T2_dVg + T3_dVg * T0 ; - T9_dT = T3 * model->HSMHV2_ptp * T0 / T2 * T2_dT + T3_dT * T0 ; - - - T4 = 1.0 + Vdsz * model->HSMHV2_pt2 ; - T4_dVb = Vdsz_dVbs * model->HSMHV2_pt2 ; - T4_dVd = Vdsz_dVds * model->HSMHV2_pt2 ; - T4_dVg = 0.0 ; - T4_dT = Vdsz_dT * model->HSMHV2_pt2 ; - - T0 = here->HSMHV2_pt40 ; - T5 = Ps0 + T6 - Vbsz ; - T5_dVb = Ps0_dVbs + T6_dVb - Vbsz_dVbs ; - T5_dVd = Ps0_dVds + T6_dVd - Vbsz_dVds ; - T5_dVg = Ps0_dVgs + T6_dVg ; - T5_dT = Ps0_dT + T6_dT - Vbsz_dT ; - T4 += Vdsz * T0 * T5 ; - T4_dVb += Vdsz * T0 * T5_dVb + Vdsz_dVbs * T0 * T5 ; - T4_dVd += Vdsz * T0 * T5_dVd + Vdsz_dVds * T0 * T5 ; - T4_dVg += Vdsz * T0 * T5_dVg ; - T4_dT += Vdsz * T0 * T5_dT + Vdsz_dT * T0 * T5 ; - - T6 = T9 * T4 ; - T9_dVb = T9_dVb * T4 + T9 * T4_dVb ; - T9_dVd = T9_dVd * T4 + T9 * T4_dVd ; - T9_dVg = T9_dVg * T4 + T9 * T4_dVg ; - T9_dT = T9_dT * T4 + T9 * T4_dT ; - T9 = T6 ; - - }else{ - T9 = 0.0 ; - T9_dVb = 0.0 ; - T9_dVd = 0.0 ; - T9_dVg = 0.0 ; - T9_dT = 0.0 ; - } - - - if( model->HSMHV2_gdl != 0 ){ - T1 = beta * here->HSMHV2_gdl0 ; - T1_dT = beta_dT * here->HSMHV2_gdl0 ; - T2 = Cox * T1 ; - T2_dVb = Cox_dVb * T1 ; - T2_dVd = Cox_dVd * T1 ; - T2_dVg = Cox_dVg * T1 ; - T2_dT = Cox_dT * T1 + Cox * T1_dT ; - T8 = T2 * Vdsz ; - T8_dVb = T2_dVb * Vdsz + T2 * Vdsz_dVbs ; - T8_dVd = T2_dVd * Vdsz + T2 * Vdsz_dVds ; - T8_dVg = T2_dVg * Vdsz ; - T8_dT = T2_dT * Vdsz + T2 * Vdsz_dT ; - }else{ - T8 = 0.0 ; - T8_dVb = 0.0 ; - T8_dVd = 0.0 ; - T8_dVg = 0.0 ; - T8_dT = 0.0 ; - } - - if ( ( T9 + T8 ) > 0.0 ) { - Idd1 = Pds * ( T9 + T8 ) ; - Idd1_dVbs = Pds_dVbs * ( T9 + T8 ) + Pds * ( T9_dVb + T8_dVb ) ; - Idd1_dVds = Pds_dVds * ( T9 + T8 ) + Pds * ( T9_dVd + T8_dVd ) ; - Idd1_dVgs = Pds_dVgs * ( T9 + T8 ) + Pds * ( T9_dVg + T8_dVg ) ; - Idd1_dT = Pds_dT * ( T9 + T8 ) + Pds * ( T9_dT + T8_dT ) ; - - Ids0 += betaWL * Idd1 * Mu ; - T1 = betaWL * Idd1 ; - T2 = Idd1 * Mu ; - T3 = Mu * betaWL ; - Ids0_dVbs += T3 * Idd1_dVbs + T1 * Mu_dVbs + T2 * betaWL_dVbs ; - Ids0_dVds += T3 * Idd1_dVds + T1 * Mu_dVds + T2 * betaWL_dVds ; - Ids0_dVgs += T3 * Idd1_dVgs + T1 * Mu_dVgs + T2 * betaWL_dVgs ; - Ids0_dT += T3 * Idd1_dT + T1 * Mu_dT + T2 * betaWL_dT ; - } - /* note: rpock procedure was removed. */ - if( flg_rsrd == 2 || flg_rsrd == 3 ){ - if( model->HSMHV2_rd20 > 0.0 ){ - T4 = here->HSMHV2_rd23 ; - T1 = pParam->HSMHV2_rd24 * ( Vgse - model->HSMHV2_rd25 ) ; - T1_dVg = pParam->HSMHV2_rd24 ; - - Fn_SL( T2 , T1 , T4 , delta_rd , T0 ) ; - T2_dVg = T1_dVg * T0 ; - T3 = T4 * ( model->HSMHV2_rd20 + 1.0 ) ; - Fn_SU( T7 , T2 , T3 , delta_rd , T0 ) ; - T7_dVg = T2_dVg * T0 ; - - }else{ - T7 = here->HSMHV2_rd23; - T7_dVg = 0.0e0 ; - } - - /* after testing we can remove Vdse_eff_dVbs, Vdse_eff_dVds, Vdse_eff_dVgs - and Vdse_eff_dVbse, Vdse_eff_dVgse */ - if (Vdse >= 0.0) { - Vdse_eff = Vdse ; - /* Vdse_eff_dVbs = 0.0 ; */ - /* Vdse_eff_dVds = 0.0 ; */ - /* Vdse_eff_dVgs = 0.0 ; */ - /* Vdse_eff_dVbse = 0.0 ; */ - Vdse_eff_dVdse = 1.0 ; - /* Vdse_eff_dVgse = 0.0 ; */ - } else { - Vdse_eff = 0.0 ; - /* Vdse_eff_dVbs = 0.0 ; */ - /* Vdse_eff_dVds = 0.0 ; */ - /* Vdse_eff_dVgs = 0.0 ; */ - /* Vdse_eff_dVbse = 0.0 ; */ - Vdse_eff_dVdse = 0.0 ; - /* Vdse_eff_dVgse = 0.0 ; */ - } - - /* smoothing of Ra for Vdse_eff close to zero */ - /* ... smoothing parameter is Ra_N */ - if (Vdse_eff < Ra_N * small2) { - Ra_alpha = pow( Ra_N+1.0 , model->HSMHV2_rd21-1.0 ) - * (Ra_N+1.0-0.5*model->HSMHV2_rd21*Ra_N) - * pow( small2,model->HSMHV2_rd21 ); - Ra_beta = 0.5*model->HSMHV2_rd21 - * pow( Ra_N+1.0 , model->HSMHV2_rd21-1.0 ) / Ra_N - * pow( small2, model->HSMHV2_rd21-2.0 ); - T1 = Ra_alpha + Ra_beta*Vdse_eff*Vdse_eff; - T1_dVdse_eff = 2.0 * Ra_beta * Vdse_eff; - } else { - T1 = pow( Vdse_eff + small2 , model->HSMHV2_rd21 ) ; - T1_dVdse_eff = model->HSMHV2_rd21 * pow( Vdse_eff + small2 , model->HSMHV2_rd21 - 1.0 ) ; - } - - T9 = pow( Vdse_eff + small2 , model->HSMHV2_rd22d ) ; - T9_dVdse_eff = model->HSMHV2_rd22d * pow( Vdse_eff + small2 , model->HSMHV2_rd22d - 1.0 ) ; - - Ra = ( T7 * T1 + Vbse * pParam->HSMHV2_rd22 * T9 ) / here->HSMHV2_weff_nf ; - Ra_dVdse_eff = ( T7 * T1_dVdse_eff + Vbse * pParam->HSMHV2_rd22 * T9_dVdse_eff ) / here->HSMHV2_weff_nf ; - Ra_dVbs = Ra_dVdse_eff * Vdse_eff_dVbs ; - Ra_dVds = Ra_dVdse_eff * Vdse_eff_dVds ; - Ra_dVgs = Ra_dVdse_eff * Vdse_eff_dVgs + T7_dVg * T1 / here->HSMHV2_weff_nf ; - Ra_dVbse = Ra_dVdse_eff * Vdse_eff_dVbse + pParam->HSMHV2_rd22 * T9 / here->HSMHV2_weff_nf ; - Ra_dVdse = Ra_dVdse_eff * Vdse_eff_dVdse ; - Ra_dVgse = Ra_dVdse_eff * Vdse_eff_dVgse ; - - T0 = Ra * Ids0 ; - T0_dVb = Ra_dVbs * Ids0 + Ra * Ids0_dVbs ; - T0_dVd = Ra_dVds * Ids0 + Ra * Ids0_dVds ; - T0_dVg = Ra_dVgs * Ids0 + Ra * Ids0_dVgs ; - T0_dT = Ra * Ids0_dT ; - - T1 = Vds + small2 ; - T2 = 1.0 / T1 ; - T3 = 1.0 + T0 * T2 ; - T3_dVb = T0_dVb * T2 ; - T3_dVd = ( T0_dVd * T1 - T0 ) * T2 * T2 ; - T3_dVg = T0_dVg * T2 ; - T3_dT = T0_dT * T2 ; - - T4 = 1.0 / T3 ; - Ids = Ids0 * T4 ; - T5 = T4 * T4 ; - Ids_dVbs = ( Ids0_dVbs * T3 - Ids0 * T3_dVb ) * T5 ; - Ids_dVds = ( Ids0_dVds * T3 - Ids0 * T3_dVd ) * T5 ; - Ids_dVgs = ( Ids0_dVgs * T3 - Ids0 * T3_dVg ) * T5 ; - Ids_dT = ( Ids0_dT * T3 - Ids0 * T3_dT ) * T5 ; - Ids_dRa = - Ids * Ids / ( Vds + small ) ; - - } else { - Ids = Ids0 ; - Ids_dVbs = Ids0_dVbs ; - Ids_dVds = Ids0_dVds ; - Ids_dVgs = Ids0_dVgs ; - Ids_dT = Ids0_dT ; - Ra = 0.0 ; - Ra_dVbs = Ra_dVds = Ra_dVgs = 0.0 ; - Ra_dVbse = Ra_dVdse = Ra_dVgse = 0.0 ; - Ids_dRa = 0.0 ; - } - /* just for testing -- can be removed */ - /* if (!(ckt->CKTmode & MODEINITPRED)) - printf("rrb %e %e %e %e %e %e\n",ckt->CKTtime,here->HSMHV2_mode*Vdse,Ra,Ra_dVdse, - Vdse_eff,Vdse_eff_dVdse) ; */ - - /* if ( Pds < ps_conv ) { */ - if ( Pds < 0.0 ) { - Ids_dVbs = 0.0 ; - Ids_dVgs = 0.0 ; - Ids_dT = 0.0 ; - } - - Ids += Gdsmin * Vds ; - Ids_dVds += Gdsmin ; - - - /*-----------------------------------------------------------* - * STI - *-----------------*/ - if ( model->HSMHV2_coisti != 0 ) { - /*---------------------------------------------------* - * dVthSCSTI : Short-channel effect induced by Vds (STI). - *-----------------*/ - T1 = C_ESI * Cox_inv ; - T2 = here->HSMHV2_wdpl ; - T3 = here->HSMHV2_lgatesm - model->HSMHV2_parl2 ; - T4 = 1.0 / (T3 * T3) ; - T5 = 2.0 * (model->HSMHV2_vbi - Pb20b) * T1 * T2 * T4 ; - - dVth0 = T5 * sqrt_Pbsum ; - T6 = T5 * 0.5 / sqrt_Pbsum ; - T7 = 2.0 * (model->HSMHV2_vbi - Pb20b) * C_ESI * T2 * T4 * sqrt_Pbsum ; - T8 = - 2.0 * T1 * T2 * T4 * sqrt_Pbsum ; - dVth0_dVb = T6 * Pbsum_dVb + T7 * Cox_inv_dVb + T8 * Pb20b_dVb ; - dVth0_dVd = T6 * Pbsum_dVd + T7 * Cox_inv_dVd + T8 * Pb20b_dVd ; - dVth0_dVg = T6 * Pbsum_dVg + T7 * Cox_inv_dVg + T8 * Pb20b_dVg ; - dVth0_dT = T6 * Pbsum_dT + T8 * Pb20b_dT ; - - T4 = pParam->HSMHV2_scsti1 ; - T6 = pParam->HSMHV2_scsti2 ; - T1 = T4 + T6 * Vdsz ; - dVthSCSTI = dVth0 * T1 ; - dVthSCSTI_dVb = dVth0_dVb * T1 + dVth0 * T6 * Vdsz_dVbs ; - dVthSCSTI_dVd = dVth0_dVd * T1 + dVth0 * T6 * Vdsz_dVds ; - dVthSCSTI_dVg = dVth0_dVg * T1 ; - dVthSCSTI_dT = dVth0_dT * T1 + dVth0 * T6 * Vdsz_dT ; - - T1 = pParam->HSMHV2_vthsti - model->HSMHV2_vdsti * Vds ; - T1_dVd = - model->HSMHV2_vdsti ; - - Vgssti = Vgsz - Vfb + T1 + dVthSCSTI ; - Vgssti_dVbs = Vgsz_dVbs + dVthSCSTI_dVb ; - Vgssti_dVds = Vgsz_dVds + T1_dVd + dVthSCSTI_dVd ; - Vgssti_dVgs = Vgsz_dVgs + dVthSCSTI_dVg ; - Vgssti_dT = Vgsz_dT + dVthSCSTI_dT ; - - costi0 = here->HSMHV2_costi0 ; - costi1 = here->HSMHV2_costi1 ; - - costi3 = here->HSMHV2_costi0_p2 * Cox_inv * Cox_inv ; - T1 = 2.0 * here->HSMHV2_costi0_p2 * Cox_inv ; - costi3_dVb = T1 * Cox_inv_dVb ; - costi3_dVd = T1 * Cox_inv_dVd ; - costi3_dVg = T1 * Cox_inv_dVg ; - costi3_dT = 2 * here->HSMHV2_costi0 * here->HSMHV2_costi00 * 0.5 / sqrt(here->HSMHV2_beta_inv) * beta_inv_dT * Cox_inv * Cox_inv ; - T2 = 1.0 / costi3 ; - costi3_dVb_c3 = costi3_dVb * T2 ; - costi3_dVd_c3 = costi3_dVd * T2 ; - costi3_dVg_c3 = costi3_dVg * T2 ; - costi3_dT_c3 = costi3_dT * T2 ; - - costi4 = costi3 * beta * 0.5 ; - costi4_dT = ( costi3_dT * beta + costi3 * beta_dT ) * 0.5 ; - costi5 = costi4 * beta * 2.0 ; - costi5_dT = ( costi4_dT * beta + costi4 * beta_dT ) * 2.0 ; - - T11 = beta * 0.25 ; - T11_dT = beta_dT * 0.25 ; - T10 = beta_inv - costi3 * T11 + Vfb - pParam->HSMHV2_vthsti - dVthSCSTI + small ; - T10_dVb = - T11 * costi3_dVb - dVthSCSTI_dVb ; - T10_dVd = - T11 * costi3_dVd - dVthSCSTI_dVd ; - T10_dVg = - T11 * costi3_dVg - dVthSCSTI_dVg ; - T10_dT = beta_inv_dT - ( costi3_dT * T11 + costi3 * T11_dT ) - dVthSCSTI_dT ; - - T1 = Vgsz - T10 - psisti_dlt ; - T1_dVb = Vgsz_dVbs - T10_dVb ; - T1_dVd = Vgsz_dVds - T10_dVd ; - T1_dVg = Vgsz_dVgs - T10_dVg ; - T1_dT = Vgsz_dT - T10_dT ; - T0 = Fn_Sgn(T10) ; - T2 = sqrt (T1 * T1 + T0 * 4.0 * T10 * psisti_dlt) ; - T3 = T10 + 0.5 * (T1 + T2) - Vfb + pParam->HSMHV2_vthsti + dVthSCSTI - Vbsz ; - T3_dVb = T10_dVb + 0.5 * (T1_dVb + (T1 * T1_dVb + T0 * 2.0 * T10_dVb * psisti_dlt) / T2) - + dVthSCSTI_dVb - Vbsz_dVbs ; - T3_dVd = T10_dVd + 0.5 * (T1_dVd + (T1 * T1_dVd + T0 * 2.0 * T10_dVd * psisti_dlt) / T2) - + dVthSCSTI_dVd - Vbsz_dVds ; - T3_dVg = T10_dVg + 0.5 * (T1_dVg + (T1 * T1_dVg + T0 * 2.0 * T10_dVg * psisti_dlt) / T2) - + dVthSCSTI_dVg ; - T3_dT = T10_dT + 0.5 * (T1_dT + (T1 * T1_dT + T0 * 2.0 * T10_dT * psisti_dlt) / T2) - + dVthSCSTI_dT - Vbsz_dT ; - - T4 = beta * T3 - 1.0 ; - T4_dT = beta_dT * T3 + beta * T3_dT ; - T5 = 4.0 / costi5 ; - T5_dT = - 4.0 / ( costi5 * costi5 ) * costi5_dT ; - T1 = 1.0 + T4 * T5 ; - T6 = beta * T5 ; - T7 = T4 * T5 ; - T1_dVb = (T6 * T3_dVb - T7 * costi3_dVb_c3) ; - T1_dVd = (T6 * T3_dVd - T7 * costi3_dVd_c3) ; - T1_dVg = (T6 * T3_dVg - T7 * costi3_dVg_c3) ; - T1_dT = T4_dT * T5 + T4 * T5_dT ; - Fn_SZ( T1 , T1, 1.0e-2, T2) ; - T1 += small ; - T1_dVb *= T2 ; - T1_dVd *= T2 ; - T1_dVg *= T2 ; - T1_dT *= T2 ; - costi6 = sqrt(T1) ; - costi6_dT = 0.5 / sqrt(T1) * T1_dT ; - T0 = costi4 * (1.0 - costi6) ; - T0_dT = costi4_dT * (1.0 - costi6) + costi4 * ( - costi6_dT ) ; - Psasti = Vgssti + T0 ; - T2 = 0.5 * costi4 / costi6 ; - Psasti_dVbs = Vgssti_dVbs + costi3_dVb_c3 * T0 - T2 * T1_dVb ; - Psasti_dVds = Vgssti_dVds + costi3_dVd_c3 * T0 - T2 * T1_dVd ; - Psasti_dVgs = Vgssti_dVgs + costi3_dVg_c3 * T0 - T2 * T1_dVg ; - Psasti_dT = Vgssti_dT + T0_dT ; - - T0 = 1.0 / (beta + 2.0 / (Vgssti + small)) ; - T0_dT = - 1.0 / ((beta + 2.0 / (Vgssti + small)) * (beta + 2.0 / (Vgssti + small))) * ( beta_dT - 2 / ((Vgssti + small) * (Vgssti + small)) * Vgssti_dT ); - Psbsti = log (1.0 / costi1 / costi3 * (Vgssti * Vgssti)) * T0 ; - T1 = 1 / costi1 / costi3 * (Vgssti * Vgssti) ; - - costi1_dT = 2 * here->HSMHV2_nin * Nin_dT * here->HSMHV2_nsti_p2 ; - - T1_dT = ( - 1 / costi1 / costi1 * costi1_dT / costi3 - 1 / costi3 / costi3 * costi3_dT / costi1 ) * Vgssti * Vgssti + 1 / costi1 / costi3 * 2 * Vgssti * Vgssti_dT ; - T2 = 2.0 * T0 / (Vgssti + small) ; - T3 = Psbsti / (Vgssti + small) ; - Psbsti_dVbs = T2 * (Vgssti_dVbs - 0.5 * costi3_dVb_c3 * Vgssti - + T3 * Vgssti_dVbs ) ; - Psbsti_dVds = T2 * (Vgssti_dVds - 0.5 * costi3_dVd_c3 * Vgssti - + T3 * Vgssti_dVds ) ; - Psbsti_dVgs = T2 * (Vgssti_dVgs - 0.5 * costi3_dVg_c3 * Vgssti - + T3 * Vgssti_dVgs ) ; - Psbsti_dT = 1 / T1 * T1_dT * T0 + log( T1 ) * T0_dT ; - - Psab = Psbsti - Psasti - sti2_dlt ; - Psab_dVbs = Psbsti_dVbs - Psasti_dVbs ; - Psab_dVds = Psbsti_dVds - Psasti_dVds ; - Psab_dVgs = Psbsti_dVgs - Psasti_dVgs ; - Psab_dT = Psbsti_dT - Psasti_dT ; - T0 = sqrt (Psab * Psab + 4.0 * sti2_dlt * Psbsti) ; - Psti = Psbsti - 0.5 * (Psab + T0) ; - T1 = 1.0 / T0 ; - Psti_dVbs = Psbsti_dVbs - - 0.5 * ( Psab_dVbs - + ( Psab * Psab_dVbs + 2.0 * sti2_dlt * Psbsti_dVbs ) * T1 ) ; - Psti_dVds = Psbsti_dVds - - 0.5 * ( Psab_dVds - + ( Psab * Psab_dVds + 2.0 * sti2_dlt * Psbsti_dVds ) * T1 ) ; - Psti_dVgs = Psbsti_dVgs - - 0.5 * ( Psab_dVgs - + ( Psab * Psab_dVgs + 2.0 * sti2_dlt * Psbsti_dVgs ) * T1 ) ; - Psti_dT = Psbsti_dT - - 0.5 * ( Psab_dT - + ( Psab * Psab_dT + 2.0 * sti2_dlt * Psbsti_dT ) * T1 ) ; - - T0 = costi1 * exp (beta * Psti) ; - T0_dT = costi1_dT * exp(beta * Psti) + costi1 * exp(beta * Psti) * ( beta_dT * Psti + beta * Psti_dT ) ; - T1 = beta * (Psti - Vbsz) - 1.0 + T0 ; - T1_dVb = beta * ((Psti_dVbs - Vbsz_dVbs) + T0 * Psti_dVbs) ; - T1_dVd = beta * ((Psti_dVds - Vbsz_dVds) + T0 * Psti_dVds) ; - T1_dVg = beta * (Psti_dVgs + T0 * Psti_dVgs) ; - T1_dT = beta_dT * (Psti - Vbsz) + beta * (Psti_dT - Vbsz_dT) + T0_dT ; - Fn_SZ ( T1 , T1, 1.0e-2, T0) ; - T1 += small ; - T1_dVb *= T0 ; - T1_dVd *= T0 ; - T1_dVg *= T0 ; - T1_dT *= T0 ; - sq1sti = sqrt (T1); - T2 = 0.5 / sq1sti ; - sq1sti_dVbs = T2 * T1_dVb ; - sq1sti_dVds = T2 * T1_dVd ; - sq1sti_dVgs = T2 * T1_dVg ; - sq1sti_dT = T2 * T1_dT ; - - T1 = beta * (Psti - Vbsz) - 1.0; - T1_dVb = beta * (Psti_dVbs - Vbsz_dVbs) ; - T1_dVd = beta * (Psti_dVds - Vbsz_dVds) ; - T1_dVg = beta * Psti_dVgs ; - T1_dT = beta_dT * ( Psti - Vbsz ) + beta * (Psti_dT - Vbsz_dT) ; - Fn_SZ( T1 , T1, 1.0e-2, T0) ; - T1 += small ; - T1_dVb *= T0 ; - T1_dVd *= T0 ; - T1_dVg *= T0 ; - T1_dT *= T0 ; - sq2sti = sqrt (T1); - T2 = 0.5 / sq2sti ; - sq2sti_dVbs = T2 * T1_dVb ; - sq2sti_dVds = T2 * T1_dVd ; - sq2sti_dVgs = T2 * T1_dVg ; - sq2sti_dT = T2 * T1_dT ; - - Qn0sti = costi0 * (sq1sti - sq2sti) ; - Qn0sti_dVbs = costi0 * (sq1sti_dVbs - sq2sti_dVbs) ; - Qn0sti_dVds = costi0 * (sq1sti_dVds - sq2sti_dVds) ; - Qn0sti_dVgs = costi0 * (sq1sti_dVgs - sq2sti_dVgs) ; - Qn0sti_dT = costi0 * (sq1sti_dT - sq2sti_dT) + here->HSMHV2_costi00 * 0.5 / sqrt( here->HSMHV2_beta_inv ) * beta_inv_dT * (sq1sti - sq2sti) ; - - /* T1: Vdsatsti */ - T1 = Psasti - Psti ; - T1_dVb = Psasti_dVbs - Psti_dVbs ; - T1_dVd = Psasti_dVds - Psti_dVds ; - T1_dVg = Psasti_dVgs - Psti_dVgs ; - T1_dT = Psasti_dT - Psti_dT ; - - Fn_SZ( T1 , T1 , 1.0e-1 , T2 ) ; - T1 += small ; - T1_dVb *= T2 ; - T1_dVd *= T2 ; - T1_dVg *= T2 ; - T1_dT *= T2 ; - - TX = Vds / T1 ; - T2 = 1.0 / ( T1 * T1 ) ; - TX_dVbs = T2 * ( - Vds * T1_dVb ) ; - TX_dVds = T2 * ( T1 - Vds * T1_dVd ) ; - TX_dVgs = T2 * ( - Vds * T1_dVg ) ; - TX_dT = T2 * ( - Vds * T1_dT ) ; - - Fn_CP( TY , TX , 1.0 , 4 , T2 ) ; - TY_dVbs = T2 * TX_dVbs ; - TY_dVds = T2 * TX_dVds ; - TY_dVgs = T2 * TX_dVgs ; - TY_dT = T2 * TX_dT ; - - costi7 = 2.0 * here->HSMHV2_wsti * here->HSMHV2_nf * beta_inv ; - costi7_dT = 2.0 * here->HSMHV2_wsti * here->HSMHV2_nf * beta_inv_dT ; - T1 = Lch ; - Idssti = costi7 * Mu * Qn0sti * TY / T1 ; - T3 = 1.0 / T1 ; - T4 = Mu * Qn0sti * TY / T1 / T1 ; - T5 = Mu * Qn0sti ; - Idssti_dVbs = costi7 * (((Mu_dVbs * Qn0sti + Mu * Qn0sti_dVbs) * TY - + T5 * TY_dVbs ) * T3 - - Lch_dVbs * T4 ) ; - Idssti_dVds = costi7 * (((Mu_dVds * Qn0sti + Mu * Qn0sti_dVds) * TY - + T5 * TY_dVds ) * T3 - - Lch_dVds * T4 ) ; - Idssti_dVgs = costi7 * (((Mu_dVgs * Qn0sti + Mu * Qn0sti_dVgs) * TY - + T5 * TY_dVgs ) * T3 - - Lch_dVgs * T4 ) ; - Idssti_dT = costi7 * (((Mu_dT * Qn0sti + Mu * Qn0sti_dT) * TY - + T5 * TY_dT ) * T3 - - Lch_dT * T4 ) + costi7_dT * Mu * Qn0sti * TY / T1 ; - - Ids = Ids + Idssti ; - Ids_dVbs = Ids_dVbs + Idssti_dVbs ; - Ids_dVds = Ids_dVds + Idssti_dVds ; - Ids_dVgs = Ids_dVgs + Idssti_dVgs ; - Ids_dT = Ids_dT + Idssti_dT ; - - } - - /*----------------------------------------------------------* - * induced gate noise. ( Part 1/3 ) - *----------------------*/ - if ( model->HSMHV2_coign != 0 && model->HSMHV2_cothrml != 0 && model->HSMHV2_codep==0 ) { - kusai00 = VgVt * VgVt ; - kusaidd = 2.0e0 * beta_inv * Cox_inv * Idd ; - kusaiL = kusai00 - kusaidd ; - Fn_SZ( kusai00 , kusai00 , 1.0e-3 , T0 ) ; - kusai00 += small ; - Fn_SZ( kusaiL , kusaiL , 1.0e-3 , T0 ) ; - kusaiL += small ; - kusai00L = kusai00 - kusaiL ; - if ( Qn0 < epsm10 || kusai00L < epsm10 ) flg_ign = 0 ; - else flg_ign = 1 ; - } - - /*-----------------------------------------------------------* - * End of PART-1. (label) - *-----------------*/ - end_of_part_1: - - - /*-----------------------------------------------------------* - * Implicit quantities related to Alpha. - *-----------------*/ - if ( flg_noqi == 0 && VgVt > VgVt_small ) { - Delta = fac1 * beta / ( 2 * Xi0p12 ) ; - Pslsat = VgVt / ( 1.0 + Delta ) + Ps0 ; - } else { - Pslsat = 0.0 ; - } - Vdsat = Pslsat - Pb2 ; - if ( Vdsat < 0.0 ) { - Vdsat = 0.0 ; - } - - // Qiu for noise calc. - Qiu_noi = Qiu ; - - } // end of normal mode MOSFET - - /*----------------------------------------------------------* - * Evaluate integrated charges in unit [C]. - *----------------------*/ - - T1 = - here->HSMHV2_weffcv_nf * Leff ; - - Qb = T1 * Qbu ; - Qb_dVbs = T1 * Qbu_dVbs ; - Qb_dVds = T1 * Qbu_dVds ; - Qb_dVgs = T1 * Qbu_dVgs ; - Qb_dT = T1 * Qbu_dT ; - - Qi = T1 * Qiu ; - Qi_dVbs = T1 * Qiu_dVbs ; - Qi_dVds = T1 * Qiu_dVds ; - Qi_dVgs = T1 * Qiu_dVgs ; - Qi_dT = T1 * Qiu_dT ; - - Qd = Qi * Qdrat ; - Qd_dVbs = Qi_dVbs * Qdrat + Qi * Qdrat_dVbs ; - Qd_dVds = Qi_dVds * Qdrat + Qi * Qdrat_dVds ; - Qd_dVgs = Qi_dVgs * Qdrat + Qi * Qdrat_dVgs ; - Qd_dT = Qi_dT * Qdrat + Qi * Qdrat_dT ; - - // Qiu for noise calc. - Qi_noi = T1*Qiu_noi ; - - - /*-----------------------------------------------------------* - * Modified potential for symmetry. - *-----------------*/ - T1 = ( Vds - Pds ) / 2 ; - Fn_SymAdd( Pzadd , T1 , model->HSMHV2_pzadd0 , T2 ) ; - T2 /= 2 ; - Pzadd_dVbs = T2 * ( - Pds_dVbs ) ; - Pzadd_dVds = T2 * ( 1.0 - Pds_dVds ) ; - Pzadd_dVgs = T2 * ( - Pds_dVgs ) ; - Pzadd_dT = T2 * ( -Pds_dT ); - - - if ( Pzadd < epsm10 ) { - Pzadd = epsm10 ; - Pzadd_dVbs = 0.0 ; - Pzadd_dVds = 0.0 ; - Pzadd_dVgs = 0.0 ; - Pzadd_dT = 0.0 ; - } - - Ps0z = Ps0 + Pzadd ; - Ps0z_dVbs = Ps0_dVbs + Pzadd_dVbs ; - Ps0z_dVds = Ps0_dVds + Pzadd_dVds ; - Ps0z_dVgs = Ps0_dVgs + Pzadd_dVgs ; - Ps0z_dT = Ps0_dT + Pzadd_dT ; - - - /*-----------------------------------------------------------* - * Channel leakage current. - *-----------------*/ - - Ids += Weff/Leff * model->HSMHV2_gdsleak * Vds ; - Ids_dVds += Weff/Leff * model->HSMHV2_gdsleak ; - - - /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ - * PART-2: Substrate / gate / leak currents - *++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ - - /*-----------------------------------------------------------* - * Isub : substrate current induced by impact ionization. - *-----------------*/ - - if ( model->HSMHV2_coisub == 0 ) { - /* Accumulation zone or nonconductive case, in which Ids==0. */ - Isub = 0.0e0 ; - Isub_dVbs = Isub_dVds = Isub_dVgs = 0.0e0 ; - Isub_dT = 0.0; - } else { - /*-------------------------------------------* - * Conductive case. - *-----------------*/ - if ( pParam->HSMHV2_sub1 > 0.0e0 && pParam->HSMHV2_vmax > 0.0e0 ) { - T0 = here->HSMHV2_vg2const ; - T1 = T0 * Vgp ; - T1_dVd = T0 * Vgp_dVds ; - T1_dVg = T0 * Vgp_dVgs ; - T1_dVb = T0 * Vgp_dVbs ; - T1_dT = T0 * Vgp_dT ; - - T7 = Cox0 * Cox0 ; - T8 = here->HSMHV2_qnsub_esi ; - T3 = T8 / T7 ; - - T9 = 2.0 / T8 ; - T4 = T9 * T7 ; - - T2 = here->HSMHV2_xvbs ; - T5 = T1 - beta_inv - T2 * Vbsz ; - T5_dVd = T1_dVd - T2 * Vbsz_dVds; - T5_dVg = T1_dVg ; - T5_dVb = T1_dVb - T2 * Vbsz_dVbs; - T5_dT = - beta_inv_dT + T1_dT - T2 * Vbsz_dT ; - - T6 = 1.0 + T4 * T5 ; - T6_dVd = T4 * T5_dVd ; - T6_dVg = T4 * T5_dVg ; - T6_dVb = T4 * T5_dVb ; - T6_dT = T4 * T5_dT ; - Fn_SZ( T6 , T6, 1.0e-3, T9) ; - T6 += small ; - T6_dVd *= T9 ; - T6_dVg *= T9 ; - T6_dVb *= T9 ; - T6_dT *= T9 ; - T6 = sqrt( T6 ) ; - T9 = 0.5 / T6 ; - T6_dVd = T9 * T6_dVd ; - T6_dVg = T9 * T6_dVg ; - T6_dVb = T9 * T6_dVb ; - T6_dT = T9 * T6_dT ; - - Psislsat = T1 + T3 * ( 1.0 - T6 ) ; - Psislsat_dVd = T1_dVd - T3 * T6_dVd ; - Psislsat_dVg = T1_dVg - T3 * T6_dVg ; - Psislsat_dVb = T1_dVb - T3 * T6_dVb ; - Psislsat_dT = T1_dT - T3 * T6_dT ; - - T2 = here->HSMHV2_lgate / (here->HSMHV2_xgate + here->HSMHV2_lgate) ; - - Psisubsat = pParam->HSMHV2_svds * Vdsz + Ps0z - T2 * Psislsat ; - Psisubsat_dVd = pParam->HSMHV2_svds * Vdsz_dVds + Ps0z_dVds - T2 * Psislsat_dVd ; - Psisubsat_dVg = Ps0z_dVgs - T2 * Psislsat_dVg ; - Psisubsat_dVb = pParam->HSMHV2_svds * Vdsz_dVbs + Ps0z_dVbs - T2 * Psislsat_dVb ; - Psisubsat_dT = pParam->HSMHV2_svds * Vdsz_dT + Ps0z_dT - T2 * Psislsat_dT ; - Fn_SZ( Psisubsat , Psisubsat, 1.0e-3, T9 ) ; - Psisubsat += small ; - Psisubsat_dVd *= T9 ; - Psisubsat_dVg *= T9 ; - Psisubsat_dVb *= T9 ; - Psisubsat_dT *= T9 ; - - T5 = here->HSMHV2_xsub1 ; - T6 = here->HSMHV2_xsub2 ; - T2 = exp( - T6 / Psisubsat ) ; - T3 = T2 * T6 / ( Psisubsat * Psisubsat ) ; - T2_dVd = T3 * Psisubsat_dVd ; - T2_dVg = T3 * Psisubsat_dVg ; - T2_dVb = T3 * Psisubsat_dVb ; - T2_dT = T3 * Psisubsat_dT ; - - Isub = T5 * Psisubsat * Ids * T2 ; - Isub_dVds = T5 * ( Psisubsat_dVd * Ids * T2 - + Psisubsat * Ids_dVds * T2 - + Psisubsat * Ids * T2_dVd ) ; - Isub_dVgs = T5 * ( Psisubsat_dVg * Ids * T2 - + Psisubsat * Ids_dVgs * T2 - + Psisubsat * Ids * T2_dVg ) ; - Isub_dVbs = T5 * ( Psisubsat_dVb * Ids * T2 - + Psisubsat * Ids_dVbs * T2 - + Psisubsat * Ids * T2_dVb ) ; - Isub_dT = T5 * ( Psisubsat_dT * Ids * T2 - + Psisubsat * Ids_dT * T2 - + Psisubsat * Ids * T2_dT ) ; - - } else { - Isub = 0.0e0 ; - Isub_dVbs = Isub_dVds = Isub_dVgs = 0.0e0 ; - Isub_dT = 0.0e0 ; - } /* end of if ( pParam->HSMHV2_sub1 ... ) else block. */ - - /*---------------------------------------------------* - * Impact-Ionization Current in the Drift Region - *-----------------*/ - T8 = here->HSMHV2_subld1 ; - if ( T8 != 0.0 ) { - T0 = Vddp ; - T0_dVb = 0.0e0 ; - T0_dVd = 0.0e0 ; - T0_dVg = 0.0e0 ; - T0_dT = 0.0e0 ; - T0_dVddp = 1.0e0 ; - - Fn_SZ( T0, T0, 1e-6, T1 ) ; - T0_dVb *= T1 ; - T0_dVd *= T1 ; - T0_dVg *= T1 ; - T0_dT *= T1 ; - T0_dVddp *= T1 ; - - T1 = sqrt( VgVt + small ) ; - T3 = 1.0 / ( 2.0 * T1 ) ; - T1_dVb = VgVt_dVbs * T3 ; - T1_dVd = VgVt_dVds * T3 ; - T1_dVg = VgVt_dVgs * T3 ; - T1_dT = VgVt_dT * T3 ; - - T4 = T0 - model->HSMHV2_xpvdth * ( 1.0 + model->HSMHV2_xpvdthg * Vgs ) ; - T4_dVb = T0_dVb ; - T4_dVd = T0_dVd ; - T4_dVg = T0_dVg - model->HSMHV2_xpvdth * model->HSMHV2_xpvdthg ; - T4_dT = T0_dT ; - T4_dVddp = T0_dVddp ; - - Fn_SZ( T4, T4, 1.0e-2, T9 ) ; - T4 += small ; - T4_dVb *= T9 ; - T4_dVd *= T9 ; - T4_dVg *= T9 ; - T4_dT *= T9 ; - T4_dVddp *= T9 ; - - T10 = here->HSMHV2_xpdv * model->HSMHV2_xldld * exp( - 1.0e0 / T4 ) ; - T11 = T10 * ( 1.0 + 1.0 / T4 ) ; - T3 = T4 * T10 ; - T3_dVb = T4_dVb * T11 ; - T3_dVd = T4_dVd * T11 ; - T3_dVg = T4_dVg * T11 ; - T3_dT = T4_dT * T11 ; - T3_dVddp = T4_dVddp * T11 ; - - T0 = T0 - T3 ; - T0_dVb = T0_dVb - T3_dVb ; - T0_dVd = T0_dVd - T3_dVd ; - T0_dVg = T0_dVg - T3_dVg ; - T0_dT = T0_dT - T3_dT ; - T0_dVddp = T0_dVddp - T3_dVddp ; - - Fn_SZ( T0, T0, 1.0e-2 , T9 ) ; - T0 += small; - T0_dVb *= T9 ; - T0_dVd *= T9 ; - T0_dVg *= T9 ; - T0_dT *= T9 ; - T0_dVddp *= T9 ; - - T4 = 1.0 / ( T0 * T1 ) ; - T7 = Ldrift0 * modelMKS->HSMHV2_subld2 ; - T2= exp( - T7 * T4 ); - T6 = T7 * T2 * T4 * T4 ; - T2_dVb = ( T0_dVb * T1 + T0 * T1_dVb ) * T6 ; - T2_dVd = ( T0_dVd * T1 + T0 * T1_dVd ) * T6 ; - T2_dVg = ( T0_dVg * T1 + T0 * T1_dVg ) * T6 ; - T2_dT = ( T0_dT * T1 + T0 * T1_dT ) * T6 ; - T2_dVddp = T0_dVddp * T1 * T6 ; - - IsubLD = T8 * Ids * T0 * T2 ; - IsubLD_dVbs = T8 * ( Ids_dVbs * T0 * T2 + Ids * T0_dVb * T2 + Ids * T0 * T2_dVb ) ; - IsubLD_dVds = T8 * ( Ids_dVds * T0 * T2 + Ids * T0_dVd * T2 + Ids * T0 * T2_dVd ) ; - IsubLD_dVgs = T8 * ( Ids_dVgs * T0 * T2 + Ids * T0_dVg * T2 + Ids * T0 * T2_dVg ) ; - IsubLD_dT = T8 * ( Ids_dT * T0 * T2 + Ids * T0_dT * T2 + Ids * T0 * T2_dT ) ; - IsubLD_dVddp = T8 * Ids * (T0_dVddp * T2 + T0 * T2_dVddp ) ; - } - - } - - - /*---------------------------------------------------* - * Impact-Ionization Induced Bulk Potential Change (IBPC) - *-----------------*/ - if ( (Isub + IsubLD) > 0e0 && here->HSMHV2_ibpc1 != 0e0 && model->HSMHV2_codep==0 ) { - - /* delta Vbs */ - T0 = 1e0 + pParam->HSMHV2_ibpc2 * dVth ; - T1 = Isub + IsubLD ; - dVbsIBPC = here->HSMHV2_ibpc1 * T0 * T1 ; - dVbsIBPC_dVbs = here->HSMHV2_ibpc1 * ( pParam->HSMHV2_ibpc2 * dVth_dVb * T1 + T0 * ( Isub_dVbs + IsubLD_dVbs ) ) ; - dVbsIBPC_dVds = here->HSMHV2_ibpc1 * ( pParam->HSMHV2_ibpc2 * dVth_dVd * T1 + T0 * ( Isub_dVds + IsubLD_dVds ) ) ; - dVbsIBPC_dVgs = here->HSMHV2_ibpc1 * ( pParam->HSMHV2_ibpc2 * dVth_dVg * T1 + T0 * ( Isub_dVgs + IsubLD_dVgs ) ) ; - dVbsIBPC_dT = here->HSMHV2_ibpc1 * ( pParam->HSMHV2_ibpc2 * dVth_dT * T1 + T0 * ( Isub_dT + IsubLD_dT ) ) ; - dVbsIBPC_dVddp = here->HSMHV2_ibpc1 * T0 * IsubLD_dVddp ; - - /* dG3 & dG4 */ - T10 = 1e0 / Xi0 ; - T10_dT = - T10 / Xi0 * Xi0_dT ; - T1 = beta * dVbsIBPC * T10 ; - T11 = T10 * T10; - T1_dVb = beta * ( dVbsIBPC_dVbs * Xi0 - dVbsIBPC * Xi0_dVbs ) * T11 ; - T1_dVd = beta * ( dVbsIBPC_dVds * Xi0 - dVbsIBPC * Xi0_dVds ) * T11 ; - T1_dVg = beta * ( dVbsIBPC_dVgs * Xi0 - dVbsIBPC * Xi0_dVgs ) * T11 ; - T1_dT = beta_dT * dVbsIBPC * T10 + beta * dVbsIBPC_dT * T10 + beta * dVbsIBPC * T10_dT ; - T1_dVddp = beta * dVbsIBPC_dVddp * T10 ; - - - T10 = 1e0 / Xil ; - T10_dT = - T10 / Xil * Xil_dT ; - T2 = beta * dVbsIBPC * T10 ; - T11 = T10 * T10; - T2_dVb = beta * ( dVbsIBPC_dVbs * Xil - dVbsIBPC * Xil_dVbs ) * T11 ; - T2_dVd = beta * ( dVbsIBPC_dVds * Xil - dVbsIBPC * Xil_dVds ) * T11 ; - T2_dVg = beta * ( dVbsIBPC_dVgs * Xil - dVbsIBPC * Xil_dVgs ) * T11 ; - T2_dT = beta_dT * dVbsIBPC * T10 + beta * dVbsIBPC_dT * T10 + beta * dVbsIBPC * T10_dT ; - T2_dVddp = beta * dVbsIBPC_dVddp * T10 ; - - - dG3 = cnst0 * ( Xilp32 * T2 - Xi0p32 * T1 ) ; - dG3_dVbs = cnst0 * ( Xilp32_dVbs * T2 + Xilp32 * T2_dVb - Xi0p32_dVbs * T1 - Xi0p32 * T1_dVb ) ; - dG3_dVds = cnst0 * ( Xilp32_dVds * T2 + Xilp32 * T2_dVd - Xi0p32_dVds * T1 - Xi0p32 * T1_dVd ) ; - dG3_dVgs = cnst0 * ( Xilp32_dVgs * T2 + Xilp32 * T2_dVg - Xi0p32_dVgs * T1 - Xi0p32 * T1_dVg ) ; - dG3_dT = cnst0 * ( Xilp32_dT * T2 + Xilp32 * T2_dT - Xi0p32_dT * T1 - Xi0p32 * T1_dT ) - + cnst0_dT * ( Xilp32 * T2 - Xi0p32 * T1 ) ; - dG3_dVddp = cnst0 * ( Xilp32 * T2_dVddp - Xi0p32 * T1_dVddp ) ; - - dG4 = cnst0 * 0.5 * ( - Xilp12 * T2 + Xi0p12 * T1 ) ; - dG4_dVbs = cnst0 * 0.5 * ( - Xilp12_dVbs * T2 - Xilp12 * T2_dVb + Xi0p12_dVbs * T1 + Xi0p12 * T1_dVb ) ; - dG4_dVds = cnst0 * 0.5 * ( - Xilp12_dVds * T2 - Xilp12 * T2_dVd + Xi0p12_dVds * T1 + Xi0p12 * T1_dVd ) ; - dG4_dVgs = cnst0 * 0.5 * ( - Xilp12_dVgs * T2 - Xilp12 * T2_dVg + Xi0p12_dVgs * T1 + Xi0p12 * T1_dVg ) ; - dG4_dT = cnst0 * 0.5 * ( - Xilp12_dT * T2 - Xilp12 * T2_dT + Xi0p12_dT * T1 + Xi0p12 * T1_dT ) - + cnst0_dT *0.5 * ( - Xilp12 * T2 + Xi0p12 * T1 ) ; - dG4_dVddp = cnst0 * 0.5 * ( - Xilp12 * T2_dVddp + Xi0p12 * T1_dVddp ) ; - - /* Add IBPC current into Ids */ - dIdd = dG3 + dG4 ; - dIdd_dVbs = dG3_dVbs + dG4_dVbs ; - dIdd_dVds = dG3_dVds + dG4_dVds ; - dIdd_dVgs = dG3_dVgs + dG4_dVgs ; - dIdd_dT = dG3_dT + dG4_dT ; - dIdd_dVddp = dG3_dVddp + dG4_dVddp ; - - IdsIBPC = betaWL * dIdd * Mu ; - IdsIBPC_dVbs = betaWL * ( Mu * dIdd_dVbs + dIdd * Mu_dVbs ) + betaWL_dVbs * Mu * dIdd ; - IdsIBPC_dVds = betaWL * ( Mu * dIdd_dVds + dIdd * Mu_dVds ) + betaWL_dVds * Mu * dIdd ; - IdsIBPC_dVgs = betaWL * ( Mu * dIdd_dVgs + dIdd * Mu_dVgs ) + betaWL_dVgs * Mu * dIdd ; - IdsIBPC_dT = betaWL * ( Mu * dIdd_dT + dIdd * Mu_dT ) + betaWL_dT * Mu * dIdd ; - IdsIBPC_dVddp = betaWL * dIdd_dVddp * Mu ; - - } /* End if (IBPC) */ - - T3 = 1 / TTEMP ; - T0 =- model->HSMHV2_igtemp2 * T3 * T3 - - 2 * model->HSMHV2_igtemp3 * T3 * T3 * T3 ; - Egp12_dT = 0.5 * T0 / Egp12; - Egp32_dT = 1.5 * T0 * Egp12; - - /*-----------------------------------------------------------* - * Igate : Gate current induced by tunneling. - *-----------------*/ - if ( model->HSMHV2_coiigs != 0 ) { - /* Igate */ - if ( flg_noqi == 0 ) { - Psdlz = Ps0z + Vdsz - epsm10 ; - Psdlz_dVbs = Ps0z_dVbs + Vdsz_dVbs ; - Psdlz_dVds = Ps0z_dVds + Vdsz_dVds ; - Psdlz_dVgs = Ps0z_dVgs ; - Psdlz_dT = Ps0z_dT ; - - T1 = Vgsz - Vfb + modelMKS->HSMHV2_gleak4 * (dVth - dPpg) * Leff - Psdlz * pParam->HSMHV2_gleak3 ; - T3 = modelMKS->HSMHV2_gleak4 * Leff ; - T1_dVg = Vgsz_dVgs + T3 * (dVth_dVg - dPpg_dVg) - Psdlz_dVgs * pParam->HSMHV2_gleak3 ; - T1_dVd = Vgsz_dVds + T3 * (dVth_dVd - dPpg_dVd) - Psdlz_dVds * pParam->HSMHV2_gleak3 ; - T1_dVb = Vgsz_dVbs + T3 * ( dVth_dVb - dPpg_dVb ) - Psdlz_dVbs * pParam->HSMHV2_gleak3 ; - T1_dT = Vgsz_dT + T3 * ( dVth_dT - dPpg_dT ) - Psdlz_dT * pParam->HSMHV2_gleak3 ; - - T3 = 2.0 * T1 ; - T1_dVg = T3 * T1_dVg ; - T1_dVd = T3 * T1_dVd ; - T1_dVb = T3 * T1_dVb ; - T1_dT = T3 * T1_dT ; - T1 *= T1 ; - - T3 = 1.0 / Tox0 ; - T2 = T1 * T3 ; - T2_dVg = (T1_dVg ) * T3 ; - T2_dVd = (T1_dVd ) * T3 ; - T2_dVb = (T1_dVb ) * T3 ; - T2_dT = T1_dT * T3 ; - - T3 = 1.0 / modelMKS->HSMHV2_gleak5 ; - T7 = 1.0 + Ey * T3 ; - T7_dVg = Ey_dVgs * T3 ; - T7_dVd = Ey_dVds * T3 ; - T7_dVb = Ey_dVbs * T3 ; - T7_dT = Ey_dT * T3 ; - - Etun = T2 * T7 ; - Etun_dVgs = T2_dVg * T7 + T7_dVg * T2 ; - Etun_dVds = T2_dVd * T7 + T7_dVd * T2 ; - Etun_dVbs = T2_dVb * T7 + T7_dVb * T2 ; - Etun_dT = T2_dT * T7 + T7_dT * T2 ; - - Fn_SZ( Etun , Etun , igate_dlt , T5 ) ; - Etun_dVgs *= T5 ; - Etun_dVds *= T5 ; - Etun_dVbs *= T5 ; - Etun_dT *= T5 ; - - Fn_SZ( T3 , Vgsz , 1.0e-3 , T4 ) ; - T3 -= model->HSMHV2_vzadd0 ; - T3_dVb = 0.5 * (Vgsz_dVbs + Vgsz * Vgsz_dVbs/TMF2); - TX = T3 / cclmmdf ; - TX_dVbs = T3_dVb / cclmmdf ; - T2 = 1.0 + TX * TX ; - T2_dVb = 2 * TX_dVbs * TX ; - T1 = 1.0 - 1.0 / T2 ; - T1_dVb = T2_dVb / T2 / T2 ; - T1_dVg = 2.0 * TX * T4 / ( T2 * T2 * cclmmdf ) ; - T1_dVd = T1_dVg * Vgsz_dVds ; - Etun_dVgs = T1 * Etun_dVgs + Etun * T1_dVg ; - Etun_dVds = T1 * Etun_dVds + Etun * T1_dVd ; - Etun_dVbs = Etun_dVbs * T1 + Etun * T1_dVb ; - Etun_dT *= T1 ; - Etun *= T1 ; - - T0 = Leff * here->HSMHV2_weff_nf ; - T7 = modelMKS->HSMHV2_gleak7 / (modelMKS->HSMHV2_gleak7 + T0) ; - - T6 = pParam->HSMHV2_gleak6 ; - T9 = T6 / (T6 + Vdsz) ; - T9_dVb = - T9 / (T6 + Vdsz) * Vdsz_dVbs ; - T9_dVd = - T9 / (T6 + Vdsz) * Vdsz_dVds ; - - T4 = 1 / (Etun + small ) ; - T1 = - pParam->HSMHV2_gleak2 * Egp32 * T4 ; - T3 = pParam->HSMHV2_gleak2 * T4 * T4; - T1_dT = T3 * (Egp32 * Etun_dT - Egp32_dT * (Etun + small )) ; - - if ( T1 < - EXP_THR ) { - Igate = 0.0 ; - Igate_dVbs = Igate_dVds = Igate_dVgs = Igate_dT = 0.0 ; - } else { - T2 = exp ( T1 ) ; - T2_dT = T1_dT * T2 ; - - T3 = pParam->HSMHV2_gleak1 / Egp12 * C_QE * T0 ; - T3_dT = - Egp12_dT * pParam->HSMHV2_gleak1 / Egp12 / Egp12 * C_QE * T0 ; - - T5 = 1 / cnst0 ; - T6 = sqrt ((Qiu + Cox0 * VgVt_small )* T5 ) ; - T6_dT = ( ( ( cnst0 * Qiu_dT - cnst0_dT * ( Qiu + Cox0 * VgVt_small ) ) * T5 * T5 ) ) / T6 * 0.5 ; - T4 = T2 * T3 * T6 ; - T4_dT = T2_dT * T3 * T6 + T2 * T3_dT * T6 + T2 * T3 * T6_dT; - T5 = T4 * Etun ; - T6 = 0.5 * Etun / (Qiu + Cox0 * VgVt_small ) ; - T10 = T5 * Etun ; - T10_dVb = T5 * (2.0 * Etun_dVbs - T1 * Etun_dVbs + T6 * Qiu_dVbs) ; - T10_dVd = T5 * (2.0 * Etun_dVds - T1 * Etun_dVds + T6 * Qiu_dVds) ; - T10_dVg = T5 * (2.0 * Etun_dVgs - T1 * Etun_dVgs + T6 * Qiu_dVgs) ; - T10_dT = 2 * T5 * Etun_dT + T4_dT * Etun * Etun ; - - Igate = T7 * T9 * T10 ; - Igate_dVbs = T7 * (T9 * T10_dVb + T9_dVb * T10) ; - Igate_dVds = T7 * (T9_dVd * T10 + T9 * T10_dVd) ; - Igate_dVgs = T7 * T9 * T10_dVg ; - Igate_dT = T7 * T9 * T10_dT ; - } - } - - /* Igs */ - T0 = - pParam->HSMHV2_glksd2 * Vgs + modelMKS->HSMHV2_glksd3 ; - T2 = exp (Tox0 * T0); - T2_dVg = (- Tox0 * pParam->HSMHV2_glksd2) * T2; - - T0 = Vgs / Tox0 / Tox0 ; - T3 = Vgs * T0 ; - T3_dVg = 2.0 * T0 * (1.0 ) ; - T4 = pParam->HSMHV2_glksd1 / 1.0e6 * here->HSMHV2_weff_nf ; - Igs = T4 * T2 * T3 ; - Igs_dVgs = T4 * (T2_dVg * T3 + T2 * T3_dVg) ; - Igs_dVds = 0.0 ; - Igs_dVbs = 0.0 ; - Igs_dT = 0.0 ; - - if ( Vgs >= 0.0e0 ){ - Igs *= -1.0 ; - Igs_dVgs *= -1.0 ; - Igs_dVds *= -1.0 ; - Igs_dVbs *= -1.0 ; - } - - - /* Igd */ - T1 = Vgs - Vds ; - T0 = - pParam->HSMHV2_glksd2 * T1 + modelMKS->HSMHV2_glksd3 ; - T2 = exp (Tox0 * T0); - T2_dVg = (- Tox0 * pParam->HSMHV2_glksd2) * T2; - T2_dVd = (+ Tox0 * pParam->HSMHV2_glksd2) * T2; - T2_dVb = 0.0 ; - - T0 = T1 / Tox0 / Tox0 ; - T3 = T1 * T0 ; - T3_dVg = 2.0 * T0 ; - T3_dVd = - 2.0 * T0 ; - T3_dVb = 0.0 ; - T4 = pParam->HSMHV2_glksd1 / 1.0e6 * here->HSMHV2_weff_nf ; - Igd = T4 * T2 * T3 ; - Igd_dVgs = T4 * (T2_dVg * T3 + T2 * T3_dVg) ; - Igd_dVds = T4 * (T2_dVd * T3 + T2 * T3_dVd) ; - Igd_dVbs = 0.0 ; - Igd_dT = 0.0 ; - - if( T1 >= 0.0e0 ){ - Igd *= -1.0 ; - Igd_dVgs *= -1.0 ; - Igd_dVds *= -1.0 ; - Igd_dVbs *= -1.0 ; - } - - - /* Igb */ - Etun = ( - ( Vgs - Vbs ) + Vfb + model->HSMHV2_glkb3 ) / Tox0 ; - Etun_dVgs = - 1.0 / Tox0 ; - Etun_dVds = 0.0 ; - Etun_dVbs = 1.0 / Tox0 ; - - Fn_SZ( Etun , Etun, igate_dlt, T5) ; - Etun += small ; - Etun_dVgs *= T5 ; - Etun_dVbs *= T5 ; - - T1 = - pParam->HSMHV2_glkb2 / Etun ; - if ( T1 < - EXP_THR ) { - Igb = 0.0 ; - Igb_dVgs = Igb_dVds = Igb_dVbs = Igb_dT = 0.0 ; - } else { - T2 = exp ( T1 ); - T3 = pParam->HSMHV2_glkb2 / ( Etun * Etun ) * T2 ; - T2_dVg = T3 * Etun_dVgs ; - T2_dVb = T3 * Etun_dVbs ; - - T3 = pParam->HSMHV2_glkb1 * here->HSMHV2_weff_nf * Leff ; - Igb = T3 * Etun * Etun * T2 ; - Igb_dVgs = T3 * (2.0 * Etun * Etun_dVgs * T2 + Etun * Etun * T2_dVg); - Igb_dVds = 0.0 ; - Igb_dVbs = T3 * (2.0 * Etun * Etun_dVbs * T2 + Etun * Etun * T2_dVb); - Igb_dT = 0.0; - } - - /* Ifn: Fowler-Nordheim tunneling current */ - Eg12 = here->HSMHV2_sqrt_eg ; - Eg32 = here->HSMHV2_eg * Eg12 ; - T2 = - ( pParam->HSMHV2_fvbs * Vbsz - Vgsz + dVthSC + dVthLP - pParam->HSMHV2_fn3 ) / Tox0 ; - T2_dVd = - ( pParam->HSMHV2_fvbs * Vbsz_dVds - Vgsz_dVds + dVthSC_dVd + dVthLP_dVd - ) / Tox0 ; - T2_dVg = - ( - Vgsz_dVgs + dVthSC_dVg + dVthLP_dVg - ) / Tox0 ; - T2_dVb = - ( pParam->HSMHV2_fvbs * Vbsz_dVbs -Vgsz_dVbs + dVthSC_dVb + dVthLP_dVb - ) / Tox0 ; - T2_dT = - ( pParam->HSMHV2_fvbs * Vbsz_dT -Vgsz_dT + dVthSC_dT + dVthLP_dT - ) / Tox0 ; - - T0 = T2 * T2 ; - T1 = pParam->HSMHV2_fn2 * Eg32 ; - T1_dT = 1.5 * Eg_dT * pParam->HSMHV2_fn2 * Eg12 ; - T3 = - T1 / T2 ; - if ( T3 < - EXP_THR ) { - T5 = 0.0 ; - T5_dVd = T5_dVg = T5_dVb = T5_dT = 0.0 ; - - } else { - T5 = exp( T3 ) ; - T5_dVd = T5 * T1 * T2_dVd / T0 ; - T5_dVg = T5 * T1 * T2_dVg / T0 ; - T5_dVb = T5 * T1 * T2_dVb / T0 ; - T5_dT = T5 * T1 * T2_dT / T0 ; - } - - T4 = C_QE * pParam->HSMHV2_fn1 * here->HSMHV2_weff_nf * here->HSMHV2_lgate / Eg12 ; - T4_dT = (- 0.5) * Eg_dT * T4 / here->HSMHV2_eg ; - if ( 2e0 * T2 + T1 < 0e0 ){ - Ifn = 0.25e0 * T4 * T1 * T1 * c_exp_2 ; /* minimum value */ - Ifn_dVd = 0e0 ; - Ifn_dVg = 0e0 ; - Ifn_dVb = 0e0 ; - Ifn_dT = 0.25e0 * T4_dT * T1 * T1 * c_exp_2 ; - } else { - Ifn = T4 * T0 * T5 ; - Ifn_dVd = T4 * ( 2.0 * T2 * T2_dVd * T5 + T0 * T5_dVd ) ; - Ifn_dVg = T4 * ( 2.0 * T2 * T2_dVg * T5 + T0 * T5_dVg ) ; - Ifn_dVb = T4 * ( 2.0 * T2 * T2_dVb * T5 + T0 * T5_dVb ) ; - Ifn_dT = T4 * ( 2.0 * T2 * T2_dT * T5 + T0 * T5_dT ) +T4_dT * T0 * T5; - } - Igb -= Ifn ; - Igb_dVbs -= Ifn_dVb ; - Igb_dVds -= Ifn_dVd ; - Igb_dVgs -= Ifn_dVg ; - Igb_dT -= Ifn_dT ; - } /* if ( model->HSMHV2_coiigs == 0 ) */ - - - /*-----------------------------------------------------------* - * Vdsp : Vds modification for GIDL/GISL - *-----------------*/ - if ( model->HSMHV2_cogidl != 0 ) { - T1 = Vds * (1.0 - gidla * Vds) - gidlvds_dlt ; - T2 = sqrt (T1 * T1 + 4.0 * gidlvds_dlt * Vds) ; - Vdsp = Vds - 0.5 * (T1 + T2) ; - T3 = 1.0 - 2.0 * gidla * Vds ; - Vdsp_dVd = 1.0 - 0.5 * (T3 + (T1 * T3 + 2.0 * gidlvds_dlt) / T2) ; - } - - /*-----------------------------------------------------------* - * Igidl : GIDL - *-----------------*/ - if( model->HSMHV2_cogidl == 0 ){ - Igidl = 0.0e0 ; - Igidl_dVbs = 0.0e0 ; - Igidl_dVds = 0.0e0 ; - Igidl_dVgs = 0.0e0 ; - Igidl_dT = 0.0e0 ; - } else { - T1 = model->HSMHV2_gidl3 * (Vdsp + model->HSMHV2_gidl4) - Vgs + (dVthSC + dVthLP) * model->HSMHV2_gidl5 ; - T1_dT = (dVthSC_dT + dVthLP_dT) * model->HSMHV2_gidl5 ; - T2 = 1.0 / Tox0 ; - E1 = T1 * T2 ; - E1_dVb = ((model->HSMHV2_gidl5 * (dVthSC_dVb + dVthLP_dVb)) ) * T2 ; - E1_dVd = ((model->HSMHV2_gidl3 * Vdsp_dVd) + model->HSMHV2_gidl5 * (dVthSC_dVd + dVthLP_dVd)) * T2 ; - E1_dVg = (-1.0 + model->HSMHV2_gidl5 * (dVthSC_dVg + dVthLP_dVg) ) * T2 ; - E1_dT = T1_dT * T2 ; - - Fn_SZ( Egidl , E1, eef_dlt, T5) ; - Egidl_dVb = T5 * E1_dVb ; - Egidl_dVd = T5 * E1_dVd ; - Egidl_dVg = T5 * E1_dVg ; - Egidl_dT = T5 * E1_dT ; - - T3 = 1 / (Egidl + small) ; - T0 = - pParam->HSMHV2_gidl2 * Egp32 * T3 ; - T0_dT = - pParam->HSMHV2_gidl2 * T3 *( Egp32_dT - Egidl_dT * T3 * Egp32 ) ; - if ( T0 < - EXP_THR ) { - Igidl = 0.0 ; - Igidl_dVbs = Igidl_dVds = Igidl_dVgs = Igidl_dT = 0.0 ; - } else { - T1 = exp ( T0 ) ; - T1_dT = T0_dT * T1 ; - T2 = pParam->HSMHV2_gidl1 / Egp12 * C_QE * here->HSMHV2_weff_nf ; - T2_dT = - Egp12_dT * pParam->HSMHV2_gidl1 / Egp12 / Egp12 * C_QE * here->HSMHV2_weff_nf ; - Igidl = T2 * Egidl * Egidl * T1 ; - T3 = T2 * T1 * Egidl * (2.0 + pParam->HSMHV2_gidl2 * Egp32 * Egidl / (Egidl + small) / (Egidl + small)) ; - Igidl_dVbs = T3 * Egidl_dVb ; - Igidl_dVds = T3 * Egidl_dVd ; - Igidl_dVgs = T3 * Egidl_dVg ; - Igidl_dT = T2 * T1 * Egidl * 2.0 * Egidl_dT + T2 * Egidl * Egidl * T1_dT + T2_dT * Egidl * Egidl * T1; - } - - /* bug-fix */ - Vdb = Vds - Vbs ; - if ( Vdb > 0.0 ) { - T2 = Vdb * Vdb ; - T4 = T2 * Vdb ; - T0 = T4 + C_gidl_delta ; - T5 = T4 / T0 ; - T7 = ( 3.0 * T2 * T0 - T4 * 3.0 * T2 ) / ( T0 * T0 ) ; /* == T5_dVdb */ - Igidl_dVbs = Igidl_dVbs * T5 + Igidl * T7 * ( - 1.0 ) ; /* Vdb_dVbs = -1 */ - Igidl_dVds = Igidl_dVds * T5 + Igidl * T7 * ( + 1.0 ) ; /* Vdb_dVds = +1 */ - Igidl_dVgs = Igidl_dVgs * T5 ; /* Vdb_dVgs = 0 */ - Igidl_dT = Igidl_dT * T5 ; /* Vdb_dT = 0 */ - Igidl *= T5 ; - } else { - Igidl = 0.0 ; - Igidl_dVbs = Igidl_dVds = Igidl_dVgs = Igidl_dT = 0.0 ; - } - } - - - /*-----------------------------------------------------------* - * Igisl : GISL - *-----------------*/ - if( model->HSMHV2_cogidl == 0){ - Igisl = 0.0e0 ; - Igisl_dVbs = 0.0e0 ; - Igisl_dVds = 0.0e0 ; - Igisl_dVgs = 0.0e0 ; - Igisl_dT = 0.0e0 ; - } else { - T1 = model->HSMHV2_gidl3 * ( - Vdsp + model->HSMHV2_gidl4 ) - - ( Vgs - Vdsp ) + ( dVthSC + dVthLP ) * model->HSMHV2_gidl5 ; - - T1_dT = ( dVthSC_dT + dVthLP_dT ) * model->HSMHV2_gidl5 ; - T2 = 1.0 / Tox0 ; - E1 = T1 * T2 ; - E1_dVb = ((model->HSMHV2_gidl5 * (dVthSC_dVb + dVthLP_dVb)) ) * T2 ; - E1_dVd = (((1.0-model->HSMHV2_gidl3 ) * Vdsp_dVd) + model->HSMHV2_gidl5 * (dVthSC_dVd + dVthLP_dVd)) * T2 ; - E1_dVg = (-1.0 + model->HSMHV2_gidl5 * (dVthSC_dVg + dVthLP_dVg) ) * T2 ; - E1_dT = T1_dT * T2 ; - - Fn_SZ( Egisl , E1, eef_dlt, T5) ; - Egisl_dVb = T5 * E1_dVb ; - Egisl_dVd = T5 * E1_dVd ; - Egisl_dVg = T5 * E1_dVg ; - Egisl_dT = T5 * E1_dT ; - - T3 = 1 / (Egisl + small) ; - T0 = - pParam->HSMHV2_gidl2 * Egp32 * T3 ; - T0_dT = - pParam->HSMHV2_gidl2 * T3 * ( Egp32_dT - Egisl_dT * T3 * Egp32 ) ; - if ( T0 < - EXP_THR ) { - Igisl = 0.0 ; - Igisl_dVbs = Igisl_dVds = Igisl_dVgs = Igisl_dT = 0.0 ; - } else { - T1 = exp ( T0 ) ; - T1_dT = T0_dT * T1 ; - T3 = 1 / Egp12 ; - T2 = pParam->HSMHV2_gidl1 * T3 * C_QE * here->HSMHV2_weff_nf ; - T2_dT = - pParam->HSMHV2_gidl1 * Egp12_dT * T3 * T3 * C_QE * here->HSMHV2_weff_nf ; - Igisl = T2 * Egisl * Egisl * T1 ; - T3 = T2 * T1 * Egisl * (2.0 + pParam->HSMHV2_gidl2 * Egp32 * Egisl / (Egisl + small) / (Egisl + small)) ; - Igisl_dVbs = T3 * Egisl_dVb ; - Igisl_dVds = T3 * Egisl_dVd ; - Igisl_dVgs = T3 * Egisl_dVg ; - Igisl_dT = T2 * T1 * Egisl * 2.0 * Egisl_dT + T2_dT * Egisl * Egisl * T1 + T2 * Egisl * Egisl * T1_dT ; - } - - /* bug-fix */ - Vsb = - Vbs ; - if ( Vsb > 0.0 ) { - T2 = Vsb * Vsb ; - T4 = T2 * Vsb ; - T0 = T4 + C_gidl_delta ; - T5 = T4 / T0 ; - T7 = ( 3.0 * T2 * T0 - T4 * 3.0 * T2 ) / ( T0 * T0 ) ; /* == T5_dVsb */ - Igisl_dVbs = Igisl_dVbs * T5 + Igisl * T7 * ( - 1.0 ) ; /* Vsb_dVbs = -1 */ - Igisl_dVds = Igisl_dVds * T5 ; /* Vsb_dVds = 0 */ - Igisl_dVgs = Igisl_dVgs * T5 ; /* Vsb_dVgs = 0 */ - Igisl_dT = Igisl_dT * T5 ; /* Vsb_dT = 0 */ - Igisl *= T5 ; - } else { - Igisl = 0.0 ; - Igisl_dVbs = Igisl_dVds = Igisl_dVgs = Igisl_dT = 0.0 ; - } - } - - - /*-----------------------------------------------------------* - * End of PART-2. (label) - *-----------------*/ -/* end_of_part_2: */ - - - /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ - * PART-3: Overlap charge - *++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ - Aclm = pParam->HSMHV2_clm1 ; - if ( flg_noqi != 0 ) { - /*-------------------------------------------* - * Calculation of Psdl for cases of flg_noqi==1. - *-----------------*/ - Psdl = Aclm * (Vds + Ps0) + (1.0e0 - Aclm) * Psl ; - Psdl_dVbs = Aclm * Ps0_dVbs + (1.0e0 - Aclm) * Psl_dVbs ; - Psdl_dVds = Aclm * (1.0e0 + Ps0_dVds) + (1.0e0 - Aclm) * Psl_dVds ; - Psdl_dVgs = Aclm * Ps0_dVgs + (1.0e0 - Aclm) * Psl_dVgs ; - if ( Psdl > Ps0 + Vds - epsm10 ) { - Psdl = Ps0 + Vds - epsm10 ; - Psdl_dVbs = Ps0_dVbs ; - Psdl_dVds = Ps0_dVds + 1.0 ; - Psdl_dVgs = Ps0_dVgs ; - } - - if (model->HSMHV2_xqy !=0) { - Ec = 0.0e0 ; - Ec_dVbs =0.0e0 ; - Ec_dVds =0.0e0 ; - Ec_dVgs =0.0e0 ; - Ec_dT =0.0e0 ; - } - } else { - /* Ec is removed from Lred calc. part */ - if (model->HSMHV2_xqy !=0) { - if ( Idd < C_IDD_MIN ) { - Ec = 0.0e0 ; - Ec_dVbs =0.0e0 ; - Ec_dVds =0.0e0 ; - Ec_dVgs =0.0e0 ; - } else { - T1 = beta_inv / Leff ; - T1_dT = beta_inv_dT / Leff ; - T2 = 1.0 / Qn0 ; - T3 = T2 * T2 ; - Ec = Idd * T1 * T2 ; - Ec_dVbs = T1 * (Idd_dVbs * T2 - Idd * Qn0_dVbs * T3 ) ; - Ec_dVds = T1 * (Idd_dVds * T2 - Idd * Qn0_dVds * T3 ) ; - Ec_dVgs = T1 * (Idd_dVgs * T2 - Idd * Qn0_dVgs * T3 ) ; - Ec_dT = T1 * (Idd_dT * T2 - Idd * Qn0_dT * T3 ) - + T1_dT * Idd * T2 ; - } - } - } - - /*-----------------------------------------------------------* - * Overlap charges - *-----------------*/ - Coovlps = (int)ModeNML * model->HSMHV2_coovlps + (int)ModeRVS * model->HSMHV2_coovlp ; - Coovlpd = (int)ModeRVS * model->HSMHV2_coovlps + (int)ModeNML * model->HSMHV2_coovlp ; - Lovers = ModeNML * here->HSMHV2_lovers + ModeRVS * here->HSMHV2_loverld ; - Loverd = ModeRVS * here->HSMHV2_lovers + ModeNML * here->HSMHV2_loverld ; - Novers = ModeNML * pParam->HSMHV2_novers + ModeRVS * pParam->HSMHV2_nover ; - Noverd = ModeRVS * pParam->HSMHV2_novers + ModeNML * pParam->HSMHV2_nover ; - CVDSOVER = pParam->HSMHV2_cvdsover ; - - /*---------------------------------------------------* - * Source side (mode-dependent) - *-----------------*/ - /*-----------------------------------* - * Constant capacitance model - *-----------------*/ - if ( Coovlps == 0 ) { - flg_overgiven = ( (int)ModeNML * model->HSMHV2_cgso_Given - + (int)ModeRVS * model->HSMHV2_cgdo_Given ) ; - if ( flg_overgiven ) { - Cgso = ModeNML * pParam->HSMHV2_cgso + ModeRVS * pParam->HSMHV2_cgdo ; - Cgso *= - here->HSMHV2_weffcv_nf ; - } else { - Cgso = - Cox0 * Lovers * here->HSMHV2_weffcv_nf ; - } - - Qgso = - Cgso * Vgse ; - Qgso_dVbse = 0.0 ; - Qgso_dVdse = 0.0 ; - Qgso_dVgse = - Cgso ; - - /*-----------------------------------* - * Simplified model - *-----------------*/ - } else { /* Coovlps != 0 begin */ - if ( Lovers > 0.0 && Novers == 0.0 ){ - cov_slp = modelMKS->HSMHV2_ovslp ; - cov_mag = model->HSMHV2_ovmag ; - T1 = Cox0 * here->HSMHV2_weffcv_nf ; - T4 = cov_slp * T1 * ( cov_mag + Vgs ) ; - T4_dVg = cov_slp * T1 ; - T4_dVd = 0.0 ; - T5 = Lovers * T1 ; - T9 = 1.2e0 - Ps0 ; - Qgos = Vgs * T5 - T4 * T9 ; - Qgos_dVbs = T4 * Ps0_dVbs ; - Qgos_dVds = T4 * Ps0_dVds - T9 * T4_dVd ; - Qgos_dVgs = T5 + T4 * Ps0_dVgs - T9 * T4_dVg ; - Qgos_dT = T4 * Ps0_dT; - - /*-----------------------------------* - * Surface potential model - *------------------------*/ - } else if ( Lovers > 0.0 && Novers >= 0.0 ) { - - Vgbgmt = Vgs - Vbs ; - Vgbgmt_dVbs = -1.0 ; - Vgbgmt_dVds = 0.0 ; - Vgbgmt_dVgs = 1.0 ; - Vxbgmt = - Vbs + epsm10 ; - Vxbgmt_dVbs = -1.0 ; - Vxbgmt_dVds = 0.0 ; - Vxbgmt_dVgs = 0.0 ; - - Nover_func = Novers ; - cnst0over_func = ModeNML * here->HSMHV2_cnst0overs + ModeRVS * here->HSMHV2_cnst0over ; - cnst0over_func_dT = ModeNML * cnst0overs_dT + ModeRVS * cnst0over_dT ; - -#include "hsmhv2eval_qover.h" - - - if (here->HSMHV2_mode != HiSIM_NORMAL_MODE) { - here->HSMHV2_Ps0LD = Ps0LD ; - here->HSMHV2_Ps0LD_dVds = - Ps0LD_dVds - Ps0LD_dVgs - Ps0LD_dVbs; - here->HSMHV2_Ps0LD_dVgs = Ps0LD_dVgs ; - here->HSMHV2_Ps0LD_dVbs = Ps0LD_dVbs ; - here->HSMHV2_Ps0LD_dTi = Ps0LD_dT ; - here->HSMHV2_QbuLD = QbuLD ; - here->HSMHV2_QbuLD_dVds = - QbuLD_dVds - QbuLD_dVgs - QbuLD_dVbs; - here->HSMHV2_QbuLD_dVgs = QbuLD_dVgs ; - here->HSMHV2_QbuLD_dVbs = QbuLD_dVbs ; - here->HSMHV2_QbuLD_dTi = QbuLD_dT ; - QosAD = - model->HSMHV2_qovadd * ( Vds - Pds ) ; - T3 = model->HSMHV2_qovadd ; - QosAD_dVgs = T3 * Pds_dVgs ; - QosAD_dVds = T3 * (Pds_dVds - 1.0) ; - QosAD_dVbs = T3 * Pds_dVbs ; - QosAD_dT = T3 * Pds_dT ; - }else{ - QosAD = QosAD_dVgs = QosAD_dVds = QosAD_dVbs = QosAD_dT = 0.0 ; - } - - T4 = here->HSMHV2_weffcv_nf * Lovers * ( 1 - CVDSOVER ) ; - - Qovs = T4 * ( QsuLD + QosAD ) ; - Qovs_dVbs = T4 * ( QsuLD_dVbs + QosAD_dVbs ) ; - Qovs_dVds = T4 * ( QsuLD_dVds + QosAD_dVds ) ; - Qovs_dVgs = T4 * ( QsuLD_dVgs + QosAD_dVgs ) ; - Qovs_dT = T4 * ( QsuLD_dT + QosAD_dT ) ; - - QisLD = T4 * QiuLD ; - QisLD_dVbs = T4 * QiuLD_dVbs ; - QisLD_dVds = T4 * QiuLD_dVds ; - QisLD_dVgs = T4 * QiuLD_dVgs ; - QisLD_dT = T4 * QiuLD_dT ; - - QbsLD = T4 * ( QbuLD + QosAD ) ; - QbsLD_dVbs = T4 * ( QbuLD_dVbs + QosAD_dVbs ) ; - QbsLD_dVds = T4 * ( QbuLD_dVds + QosAD_dVds ) ; - QbsLD_dVgs = T4 * ( QbuLD_dVgs + QosAD_dVgs ) ; - QbsLD_dT = T4 * ( QbuLD_dT + QosAD_dT ) ; - - - - if ( CVDSOVER != 0.0 ) { /* Qovsext begin */ - Vgbgmt = Vgse - Vbse ; - Vgbgmt_dVbs = -1.0 ; - Vgbgmt_dVds = 0.0 ; - Vgbgmt_dVgs = 1.0 ; - Vxbgmt = - Vbse + epsm10 ; - Vxbgmt_dVbs = -1.0 ; - Vxbgmt_dVds = 0.0 ; - Vxbgmt_dVgs = 0.0 ; - -#include "hsmhv2eval_qover.h" - - T4 = here->HSMHV2_weffcv_nf * Lovers * CVDSOVER ; - Qovsext = T4 * QsuLD ; - Qovsext_dVdse = T4 * QsuLD_dVds ; - Qovsext_dVgse = T4 * QsuLD_dVgs ; - Qovsext_dVbse = T4 * QsuLD_dVbs ; - Qovsext_dT = T4 * QsuLD_dT ; - - QisLDext = T4 * QiuLD ; - QisLDext_dVbse = T4 * QiuLD_dVbs ; - QisLDext_dVdse = T4 * QiuLD_dVds ; - QisLDext_dVgse = T4 * QiuLD_dVgs ; - QisLDext_dT = T4 * QiuLD_dT ; - - QbsLDext = T4 * QbuLD ; - QbsLDext_dVbse = T4 * QbuLD_dVbs ; - QbsLDext_dVdse = T4 * QbuLD_dVds ; - QbsLDext_dVgse = T4 * QbuLD_dVgs ; - QbsLDext_dT = T4 * QbuLD_dT ; - - } /* Qovsext end */ - - } - - /*-----------------------------------* - * Additional constant capacitance model - *-----------------*/ - flg_overgiven = ( (int)ModeNML * model->HSMHV2_cgso_Given - + (int)ModeRVS * model->HSMHV2_cgdo_Given ) ; - if ( flg_overgiven ) { - Cgso = ModeNML * pParam->HSMHV2_cgso + ModeRVS * pParam->HSMHV2_cgdo ; - Cgso *= - here->HSMHV2_weffcv_nf ; - } - Qgso = - Cgso * Vgse ; - Qgso_dVbse = 0.0 ; - Qgso_dVdse = 0.0 ; - Qgso_dVgse = - Cgso ; - } /* Coovlps != 0 end */ - - /*---------------------------------------------------* - * Drain side (mode-dependent) - *-----------------*/ - /*-----------------------------------* - * Constant capacitance model - *-----------------*/ - if ( Coovlpd == 0 ) { - flg_overgiven = ( (int)ModeRVS * model->HSMHV2_cgso_Given - + (int)ModeNML * model->HSMHV2_cgdo_Given ) ; - if ( flg_overgiven ) { - Cgdo = ModeRVS * pParam->HSMHV2_cgso + ModeNML * pParam->HSMHV2_cgdo ; - Cgdo *= - here->HSMHV2_weffcv_nf ; - } else { - Cgdo = - Cox0 * Loverd * here->HSMHV2_weffcv_nf ; - } - - Qgdo = - Cgdo * (Vgse - Vdse) ; - Qgdo_dVbse = 0.0 ; - Qgdo_dVdse = Cgdo ; - Qgdo_dVgse = - Cgdo ; - - /*-----------------------------------* - * Simplified model - *-----------------*/ - } else { /* Coovlpd != 0 begin */ - if ( Loverd > 0.0 && Noverd == 0.0 ){ - cov_slp = modelMKS->HSMHV2_ovslp ; - cov_mag = model->HSMHV2_ovmag ; - T1 = Cox0 * here->HSMHV2_weffcv_nf ; - T4 = cov_slp * T1 * ( cov_mag + Vgs - Vds ) ; - T4_dVg = cov_slp * T1 ; - T4_dVd = - cov_slp * T1 ; - T5 = Loverd * T1 ; - T9 = 1.2e0 + Vds - Psl ; - Qgod = ( Vgs - Vds ) * T5 - T4 * T9 ; - Qgod_dVbs = + T4 * Psl_dVbs ; - Qgod_dVds = - T5 + T4 * ( -1.0 + Psl_dVds ) - T9 * T4_dVd ; - Qgod_dVgs = + T5 + T4 * Psl_dVgs - T9 * T4_dVg ; - Qgod_dT = T4 * Psl_dT; - - - /*-----------------------------------* - * Surface potential model - *------------------------*/ - } else if ( Loverd > 0.0 && Noverd >= 0.0 ) { - - Vgbgmt = Vgs - Vbs ; - Vgbgmt_dVbs = -1.0 ; - Vgbgmt_dVds = 0.0 ; - Vgbgmt_dVgs = 1.0 ; - Vxbgmt = Vds - Vbs + epsm10 ; - Vxbgmt_dVbs = -1.0 ; - Vxbgmt_dVds = 1.0 ; - Vxbgmt_dVgs = 0.0 ; - - Nover_func = Noverd ; - cnst0over_func = ModeNML * here->HSMHV2_cnst0over + ModeRVS * here->HSMHV2_cnst0overs ; - cnst0over_func_dT = ModeNML * cnst0over_dT + ModeRVS * cnst0overs_dT ; - -#include "hsmhv2eval_qover.h" - - - if (here->HSMHV2_mode == HiSIM_NORMAL_MODE) { - here->HSMHV2_Ps0LD = Ps0LD ; - here->HSMHV2_Ps0LD_dVds = Ps0LD_dVds ; - here->HSMHV2_Ps0LD_dVgs = Ps0LD_dVgs ; - here->HSMHV2_Ps0LD_dVbs = Ps0LD_dVbs ; - here->HSMHV2_Ps0LD_dTi = Ps0LD_dT ; - here->HSMHV2_QbuLD = QbuLD ; - here->HSMHV2_QbuLD_dVds = QbuLD_dVds ; - here->HSMHV2_QbuLD_dVgs = QbuLD_dVgs ; - here->HSMHV2_QbuLD_dVbs = QbuLD_dVbs ; - here->HSMHV2_QbuLD_dTi = QbuLD_dT ; - QodAD = model->HSMHV2_qovadd * ( Vds - Pds ) ; - T3 = - model->HSMHV2_qovadd ; - QodAD_dVgs = T3 * Pds_dVgs ; - QodAD_dVds = T3 * (Pds_dVds - 1.0) ; - QodAD_dVbs = T3 * Pds_dVbs ; - QodAD_dT = T3 * Pds_dT ; - }else{ - QodAD = QodAD_dVgs = QodAD_dVds = QodAD_dVbs = QodAD_dT = 0.0 ; - } - - T4 = here->HSMHV2_weffcv_nf * Loverd * ( 1 - CVDSOVER ) ; - - Qovd = T4 * ( QsuLD + QodAD ) ; - Qovd_dVbs = T4 * ( QsuLD_dVbs + QodAD_dVbs ) ; - Qovd_dVds = T4 * ( QsuLD_dVds + QodAD_dVds ) ; - Qovd_dVgs = T4 * ( QsuLD_dVgs + QodAD_dVgs ) ; - Qovd_dT = T4 * ( QsuLD_dT + QodAD_dT ) ; - - QidLD = T4 * QiuLD ; - QidLD_dVbs = T4 * QiuLD_dVbs ; - QidLD_dVds = T4 * QiuLD_dVds ; - QidLD_dVgs = T4 * QiuLD_dVgs ; - QidLD_dT = T4 * QiuLD_dT ; - - QbdLD = T4 * ( QbuLD + QodAD ) ; - QbdLD_dVbs = T4 * ( QbuLD_dVbs + QodAD_dVbs ) ; - QbdLD_dVds = T4 * ( QbuLD_dVds + QodAD_dVds ) ; - QbdLD_dVgs = T4 * ( QbuLD_dVgs + QodAD_dVgs ) ; - QbdLD_dT = T4 * ( QbuLD_dT + QodAD_dT ) ; - - - if ( CVDSOVER != 0.0 ) { /* Qovdext begin */ - Vgbgmt = Vgse - Vbse ; - Vgbgmt_dVbs = -1.0 ; - Vgbgmt_dVds = 0.0 ; - Vgbgmt_dVgs = 1.0 ; - Vxbgmt = Vdse - Vbse + epsm10 ; - Vxbgmt_dVbs = -1.0 ; - Vxbgmt_dVds = 1.0 ; - Vxbgmt_dVgs = 0.0 ; - -#include "hsmhv2eval_qover.h" - - T4 = here->HSMHV2_weffcv_nf * Loverd * CVDSOVER ; - Qovdext = T4 * QsuLD ; - Qovdext_dVdse = T4 * QsuLD_dVds ; - Qovdext_dVgse = T4 * QsuLD_dVgs ; - Qovdext_dVbse = T4 * QsuLD_dVbs ; - Qovdext_dT = T4 * QsuLD_dT ; - - QidLDext = T4 * QiuLD ; - QidLDext_dVbse = T4 * QiuLD_dVbs ; - QidLDext_dVdse = T4 * QiuLD_dVds ; - QidLDext_dVgse = T4 * QiuLD_dVgs ; - QidLDext_dT = T4 * QiuLD_dT ; - - QbdLDext = T4 * QbuLD ; - QbdLDext_dVbse = T4 * QbuLD_dVbs ; - QbdLDext_dVdse= T4 * QbuLD_dVds ; - QbdLDext_dVgse= T4 * QbuLD_dVgs ; - QbdLDext_dT = T4 * QbuLD_dT ; - - } /* Qovdext end */ - - } - /*-----------------------------------* - * Additional constant capacitance model - *-----------------*/ - flg_overgiven = ( (int)ModeRVS * model->HSMHV2_cgso_Given - + (int)ModeNML * model->HSMHV2_cgdo_Given ) ; - if ( flg_overgiven ) { - Cgdo = ModeRVS * pParam->HSMHV2_cgso + ModeNML * pParam->HSMHV2_cgdo ; - Cgdo *= - here->HSMHV2_weffcv_nf ; - } - Qgdo = - Cgdo * (Vgse - Vdse) ; - Qgdo_dVbse = 0.0 ; - Qgdo_dVdse = Cgdo ; - Qgdo_dVgse = - Cgdo ; - } /* Coovlpd != 0 end */ - - /*-------------------------------------------* - * Gate/Bulk overlap charge: Qgbo - *-----------------*/ - Cgbo_loc = - pParam->HSMHV2_cgbo * here->HSMHV2_lgate ; - Qgbo = - Cgbo_loc * (Vgs -Vbs) ; - Qgbo_dVgs = - Cgbo_loc ; - Qgbo_dVbs = Cgbo_loc ; - Qgbo_dVds = 0.0 ; - - /*---------------------------------------------------* - * Lateral-field-induced capacitance. - *-----------------*/ - if ( model->HSMHV2_xqy == 0 ){ - Qy = 0.0e0 ; - Qy_dVds = 0.0e0 ; - Qy_dVgs = 0.0e0 ; - Qy_dVbs = 0.0e0 ; - Qy_dT = 0.0e0 ; - } else { - Pslk = Ec * Leff + Ps0 ; - Pslk_dVbs = Ec_dVbs * Leff + Ps0_dVbs; - Pslk_dVds = Ec_dVds * Leff + Ps0_dVds; - Pslk_dVgs = Ec_dVgs * Leff + Ps0_dVgs; - Pslk_dT = Ec_dT * Leff + Ps0_dT; - - T1 = Aclm * ( Vds + Ps0 ) + ( 1.0e0 - Aclm ) * Pslk ; - T1_dVb = Aclm * ( Ps0_dVbs ) + ( 1.0e0 - Aclm ) * Pslk_dVbs ; - T1_dVd = Aclm * ( 1.0 + Ps0_dVds ) + ( 1.0e0 - Aclm ) * Pslk_dVds ; - T1_dVg = Aclm * ( Ps0_dVgs ) + ( 1.0e0 - Aclm ) * Pslk_dVgs ; - T1_dT = Aclm * ( Ps0_dT ) + ( 1.0e0 - Aclm ) * Pslk_dT ; - T10 = here->HSMHV2_wdpl ; - T3 = T10 * 1.3 ; - T2 = C_ESI * here->HSMHV2_weffcv_nf * T3 ; - Qy = - ( ( Ps0 + Vds - T1 ) / model->HSMHV2_xqy ) * T2 ; - Qy_dVds = - ( ( Ps0_dVds + 1.0e0 - T1_dVd ) / model->HSMHV2_xqy ) * T2 ; - Qy_dVgs = - ( ( Ps0_dVgs - T1_dVg ) / model->HSMHV2_xqy ) * T2 ; - Qy_dVbs = - ( ( Ps0_dVbs - T1_dVb ) / model->HSMHV2_xqy ) * T2 ; - Qy_dT = - ( ( Ps0_dT - T1_dT ) / model->HSMHV2_xqy ) * T2 ; - } - - if ( model->HSMHV2_xqy1 != 0.0 ){ - Qy += here->HSMHV2_cqyb0 * Vbs ; - Qy_dVbs += here->HSMHV2_cqyb0 ; - } - - /*---------------------------------------------------* - * Fringing capacitance. - *-----------------*/ - Cfd = here->HSMHV2_cfrng ; - Cfs = here->HSMHV2_cfrng ; - Qfd = Cfd * ( Vgse - Vdse ) ; - Qfs = Cfs * Vgse ; - - /*-----------------------------------------------------------* - * End of PART-3. (label) - *-----------------*/ - -/* end_of_part_3: */ - - /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ - * PART-4: Substrate-source/drain junction diode. - *++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ - - /* move to hsmhveval_dio.c */ - - - /*-----------------------------------------------------------* - * End of PART-4. (label) - *-----------------*/ - -/* end_of_part_4: */ - - - - /*-----------------------------------------------------------* - * PART-5: NQS. (label) - *-----------------*/ - if (flg_nqs) { - if(ckt->CKTmode & MODETRAN){ - if( ckt->CKTmode & MODEINITTRAN ){ - - tau = tau_dVds = tau_dVgs = tau_dVbs = tau_dT = 0.0 ; - taub = taub_dVds = taub_dVgs = taub_dVbs = taub_dT = 0.0 ; - - } else { - /* tau for inversion charge */ - if (flg_noqi == 0) { - T12 = model->HSMHV2_dly1; - T10 = model->HSMHV2_dly2; - - T3 = Lch ; - T1 = T10 * T12 * T3 * T3 ; - T2 = Mu * VgVt * T12 + T10 * T3 * T3 + small ; - tau = T1 / T2 ; - - T1_dVg = T10 * T12 * 2.0 * T3 * Lch_dVgs ; - T1_dVd = T10 * T12 * 2.0 * T3 * Lch_dVds ; - T1_dVb = T10 * T12 * 2.0 * T3 * Lch_dVbs ; - T1_dT = T10 * T12 * 2.0 * T3 * Lch_dT ; - - T2_dVg = T12 * Mu_dVgs * VgVt - + T12 * Mu * VgVt_dVgs + T10 * 2.0 * T3 * Lch_dVgs ; - T2_dVd = T12 * Mu_dVds * VgVt - + T12 * Mu * VgVt_dVds + T10 * 2.0 * T3 * Lch_dVds ; - T2_dVb = T12 * Mu_dVbs * VgVt - + T12 * Mu * VgVt_dVbs + T10 * 2.0 * T3 * Lch_dVbs ; - T2_dT = T12 * Mu_dT * VgVt - + T12 * Mu * VgVt_dT + T10 * 2.0 * T3 * Lch_dT ; - - T4 = 1.0 / T2 ; - tau_dVgs = ( T1_dVg - tau * T2_dVg ) * T4 ; - tau_dVds = ( T1_dVd - tau * T2_dVd ) * T4 ; - tau_dVbs = ( T1_dVb - tau * T2_dVb ) * T4 ; - tau_dT = ( T1_dT - tau * T2_dT ) * T4 ; - } else { - tau = model->HSMHV2_dly1 ; - tau_dVgs = tau_dVds = tau_dVbs = tau_dT = 0.0 ; - } - - T1 = ckt->CKTdelta ; - - /* tau for bulk charge */ - T2 = modelMKS->HSMHV2_dly3 ; - taub = T2 * Cox ; - taub_dVgs = T2 * Cox_dVg ; - taub_dVds = T2 * Cox_dVd ; - taub_dVbs = T2 * Cox_dVb ; - taub_dT = 0.0 ; - - } - } else { /* !(CKT_mode & MODETRAN) */ - - tau = tau_dVds = tau_dVgs = tau_dVbs = tau_dT = 0.0 ; - taub = taub_dVds = taub_dVgs = taub_dVbs = taub_dT = 0.0 ; - } - } - - if ( flg_nqs && (ckt->CKTmode & (MODEDCOP | MODEINITSMSIG)) ) { /* ACNQS */ - - if (flg_noqi == 0) { - T12 = model->HSMHV2_dly1 ; - T10 = model->HSMHV2_dly2 ; - - T3 = Lch ; - T1 = T12 * T10 * T3 * T3 ; - T2 = Mu * VgVt * T12 + T10 * T3 * T3 + small ; - tau = T1 / T2 ; - - T1_dVg = T10 * T12 * 2.0 * T3 * Lch_dVgs ; - T1_dVd = T10 * T12 * 2.0 * T3 * Lch_dVds ; - T1_dVb = T10 * T12 * 2.0 * T3 * Lch_dVbs ; - T1_dT = T10 * T12 * 2.0 * T3 * Lch_dT ; - - T2_dVg = T12 * Mu_dVgs * VgVt + T12 * Mu * VgVt_dVgs - + T10 * 2.0 * T3 * Lch_dVgs ; - T2_dVd = T12 * Mu_dVds * VgVt + T12 * Mu * VgVt_dVds - + T10 * 2.0 * T3 * Lch_dVds ; - T2_dVb = T12 * Mu_dVbs * VgVt + T12 * Mu * VgVt_dVbs - + T10 * 2.0 * T3 * Lch_dVbs ; - T2_dT = T12 * Mu_dT * VgVt + T12 * Mu * VgVt_dT - + T10 * 2.0 * T3 * Lch_dT ; - - T4 = 1.0 / T2 ; - tau_dVgs = (T1_dVg - tau * T2_dVg) * T4 ; - tau_dVds = (T1_dVd - tau * T2_dVd) * T4 ; - tau_dVbs = (T1_dVb - tau * T2_dVb) * T4 ; - tau_dT = (T1_dT - tau * T2_dT) * T4 ; - } else { - tau = model->HSMHV2_dly1 ; - tau_dVgs = tau_dVds = tau_dVbs = tau_dT = 0.0 ; - } - - T2 = modelMKS->HSMHV2_dly3 ; - taub = T2 * Cox; - taub_dVgs = T2 * Cox_dVg ; - taub_dVds = T2 * Cox_dVd ; - taub_dVbs = T2 * Cox_dVb ; - taub_dT = 0.0 ; - } - - /*-----------------------------------------------------------* - * End of PART-5. (label) - *-----------------*/ -/* end_of_part_5: */ - - /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ - * PART-6: Noise Calculation. - *++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ - - /*-----------------------------------------------------------* - * 1/f noise. - *-----------------*/ - if ( model->HSMHV2_coflick != 0 && !flg_noqi ) { - - NFalp = pParam->HSMHV2_nfalp ; - NFtrp = pParam->HSMHV2_nftrp ; - Cit = modelMKS->HSMHV2_cit ; - - T1 = Qn0 / C_QE ; - T2 = ( Cox + Qn0 / ( Ps0 - Vbscl ) + Cit ) * beta_inv / C_QE ; - T3 = -2.0E0 * Qi_noi / C_QE / Lch / here->HSMHV2_weff_nf - T1 ; - if ( T3 != T1 ) { - T4 = 1.0E0 / ( T1 + T2 ) / ( T3 + T2 ) + 2.0E0 * NFalp * Ey * Mu / ( T3 - T1 ) - * log( ( T3 + T2 ) / ( T1 + T2 ) ) + NFalp * Ey * Mu * NFalp * Ey * Mu ; - } else { - T4 = 1.0 / ( T1 + T2 ) / ( T3 + T2 ) + 2.0 * NFalp * Ey * Mu / ( T1 + T2 ) - + NFalp * Ey * Mu * NFalp * Ey * Mu; - } - Nflic = Ids * Ids * NFtrp / ( Lch * beta * here->HSMHV2_weff_nf ) * T4 ; - } else { - Nflic = 0.0 ; - } - - /*-----------------------------------------------------------* - * thermal noise. - *-----------------*/ - if ( model->HSMHV2_cothrml != 0 && !flg_noqi && model->HSMHV2_codep==0 ) { - - Eyd = ( Psdl - Ps0 ) / Lch + small ; - T12 = Muun * Eyd / 1.0e7 ; - /* note: model->HSMHV2_bb = 2 (electron) ;1 (hole) */ - if ( 1.0e0 - epsm10 <= model->HSMHV2_bb && model->HSMHV2_bb <= 1.0e0 + epsm10 ) { - T7 = 1.0e0 ; - } else if ( 2.0e0 - epsm10 <= model->HSMHV2_bb && model->HSMHV2_bb <= 2.0e0 + epsm10 ) { - T7 = T12 ; - } else { - T7 = Fn_Pow( Eyd, model->HSMHV2_bb - 1.0e0 ) ; - } - T8 = T12 * T7 ; - T9 = 1.0e0 + T8 ; - T10 = Fn_Pow( T9, ( - 1.0e0 / model->HSMHV2_bb - 1.0e0 ) ) ; - T11 = T9 * T10 ; - Mud_hoso = Muun * T11 ; - Mu_Ave = ( Mu + Mud_hoso ) / 2.0 ; - - /* Sid_h = GAMMA * 4.0 * C_KB * model->HSMHV2_temp * gds0_h2; */ - T0 = Alpha * Alpha ; - Nthrml = here->HSMHV2_weff_nf * Cox * VgVt * Mu - * ( ( 1e0 + 3e0 * Alpha + 6e0 * T0 ) * Mud_hoso * Mud_hoso - + ( 3e0 + 4e0 * Alpha + 3e0 * T0 ) * Mud_hoso * Mu - + ( 6e0 + 3e0 * Alpha + T0 ) * Mu * Mu ) - / ( 15e0 * Lch * ( 1e0 + Alpha ) * Mu_Ave * Mu_Ave ) ; - } else { - Nthrml = 0e0 ; - } - - - /*----------------------------------------------------------* - * induced gate noise. ( Part 2/3 ) - *----------------------*/ - if ( model->HSMHV2_coign != 0 && model->HSMHV2_cothrml != 0 && flg_ign == 1 && !flg_noqi && model->HSMHV2_codep==0) { - sqrtkusaiL = sqrt( kusaiL ) ; - T2 = VgVt + sqrtkusaiL ; - T3 = kusai00 * kusai00 ; - T4 = kusaiL * kusaiL ; - T5 = 42.0e0 * kusai00 * kusaiL ; - T5 += 4.0e0 * ( T3 + T4 ) ; - T5 += 20.0e0 * sqrtkusaiL * VgVt * ( kusai00 + kusaiL ) ; - T10 = T2 * T2 ; - T10 *= T10 ; - kusai_ig = T5 / ( T10 * T2 ) ; /* Induced Gate Noise parameter */ - gds0_ign = here->HSMHV2_weff_nf / Lch * Mu * Cox ; - gds0_h2 = gds0_ign * VgVt ; - GAMMA = Nthrml / gds0_h2 ; - T7 = kusai00 + 4.0e0 * VgVt * sqrtkusaiL + kusaiL ; - /* cross-correlation coefficient (= Sigid/sqrt(Sig*Sid) ) */ - crl_f = c_sqrt_15 * kusai00L * T7 - / ( 6.0e0 * T2 * sqrt( GAMMA * T2 * VgVt * T5 ) ) ; - } - - - /*-----------------------------------------------------------* - * End of PART-6. (label) - *-----------------*/ -/* end_of_part_6: */ - - - /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ - * PART-7: Evaluation of outputs. - *++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ - - /*---------------------------------------------------* - * Extrapolate quantities if external biases are out of bounds. - * -> not necessary here - *-----------------*/ - - /*-----------------------------------------------------------* - * Warn negative conductance. - * - T1 ( = d Ids / d Vds ) is the derivative w.r.t. circuit bias. - *-----------------*/ - T1 = ModeNML * Ids_dVds + ModeRVS * ( Ids_dVbs + Ids_dVds + Ids_dVgs ) ; - - if ( flg_info >= 1 && - (Ids_dVbs < 0.0 || T1 < 0.0 || Ids_dVgs < 0.0) ) { - printf( "*** warning(HiSIM_HV(%s)): Negative Conductance\n", model->HSMHV2modName ) ; - printf( " type = %d mode = %d\n" , model->HSMHV2_type , here->HSMHV2_mode ) ; - printf( " Vbs = %12.5e Vds = %12.5e Vgse= %12.5e\n" , - Vbs , Vds , Vgs ) ; - printf( " Ids_dVbs = %12.5e\n" , Ids_dVbs ) ; - printf( " Ids_dVds = %12.5e\n" , T1 ) ; - printf( " Ids_dVgs = %12.5e\n" , Ids_dVgs ) ; - } - - - /*-----------------------------------------------------------* - * Assign outputs. - *-----------------*/ - - - /*---------------------------------------------------* - * Channel current and conductances. - *-----------------*/ - here->HSMHV2_ids = Mfactor * Ids ; - here->HSMHV2_dIds_dVdsi = Mfactor * Ids_dVds ; - here->HSMHV2_dIds_dVgsi = Mfactor * Ids_dVgs ; - here->HSMHV2_dIds_dVbsi = Mfactor * Ids_dVbs ; - here->HSMHV2_dIds_dTi = Mfactor * Ids_dT ; - - here->HSMHV2_idsibpc = Mfactor * IdsIBPC ; - here->HSMHV2_dIdsIBPC_dVdsi = Mfactor * IdsIBPC_dVds ; - here->HSMHV2_dIdsIBPC_dVgsi = Mfactor * IdsIBPC_dVgs ; - here->HSMHV2_dIdsIBPC_dVbsi = Mfactor * IdsIBPC_dVbs ; - here->HSMHV2_dIdsIBPC_dTi = Mfactor * IdsIBPC_dT ; - here->HSMHV2_dIdsIBPC_dVddp = Mfactor * IdsIBPC_dVddp ; - - - /* -------------------------------------* - * Intrinsic charges / capacitances. - *-----------------*/ - if (flg_nqs) { /* for flat handling of NQS: the NQS charges are added in hsmhvld */ - - here->HSMHV2_qg = 0.0 ; - here->HSMHV2_qd = 0.0 ; - here->HSMHV2_qs = 0.0 ; - - here->HSMHV2_qdp = 0.0 ; - here->HSMHV2_qsp = 0.0 ; - - here->HSMHV2_dqdp_dVdse = 0.0 ; - here->HSMHV2_dqdp_dVgse = 0.0 ; - here->HSMHV2_dqdp_dVbse = 0.0 ; - here->HSMHV2_dqdp_dTi = 0.0 ; - here->HSMHV2_dqsp_dVdse = 0.0 ; - here->HSMHV2_dqsp_dVgse = 0.0 ; - here->HSMHV2_dqsp_dVbse = 0.0 ; - here->HSMHV2_dqsp_dTi = 0.0 ; - - here->HSMHV2_dQdi_dVdsi = 0.0 ; - here->HSMHV2_dQdi_dVgsi = 0.0 ; - here->HSMHV2_dQdi_dVbsi = 0.0 ; - here->HSMHV2_dQdi_dTi = 0.0 ; - here->HSMHV2_dQg_dVdsi = 0.0 ; - here->HSMHV2_dQg_dVgsi = 0.0 ; - here->HSMHV2_dQg_dVbsi = 0.0 ; - here->HSMHV2_dQg_dTi = 0.0 ; - here->HSMHV2_dQb_dVdsi = 0.0 ; - here->HSMHV2_dQb_dVgsi = 0.0 ; - here->HSMHV2_dQb_dVbsi = 0.0 ; - here->HSMHV2_dQb_dTi = 0.0 ; - - here->HSMHV2_qgext = 0.0 ; - here->HSMHV2_qdext = 0.0 ; - here->HSMHV2_qsext = 0.0 ; - - here->HSMHV2_dQdext_dVdse = 0.0 ; - here->HSMHV2_dQdext_dVgse = 0.0 ; - here->HSMHV2_dQdext_dVbse = 0.0 ; - here->HSMHV2_dQdext_dTi = 0.0 ; - here->HSMHV2_dQgext_dVdse = 0.0 ; - here->HSMHV2_dQgext_dVgse = 0.0 ; - here->HSMHV2_dQgext_dVbse = 0.0 ; - here->HSMHV2_dQgext_dTi = 0.0 ; - here->HSMHV2_dQbext_dVdse = 0.0 ; - here->HSMHV2_dQbext_dVgse = 0.0 ; - here->HSMHV2_dQbext_dVbse = 0.0 ; - here->HSMHV2_dQbext_dTi = 0.0 ; - here->HSMHV2_tau = tau ; - here->HSMHV2_tau_dVgsi = tau_dVgs ; - here->HSMHV2_tau_dVdsi = tau_dVds ; - here->HSMHV2_tau_dVbsi = tau_dVbs ; - here->HSMHV2_tau_dTi = tau_dT ; - - here->HSMHV2_taub = taub ; - here->HSMHV2_taub_dVgsi = taub_dVgs ; - here->HSMHV2_taub_dVdsi = taub_dVds ; - here->HSMHV2_taub_dVbsi = taub_dVbs ; - here->HSMHV2_taub_dTi = taub_dT ; - - here->HSMHV2_Xd = Qdrat; - here->HSMHV2_Xd_dVgsi = Qdrat_dVgs ; - here->HSMHV2_Xd_dVdsi = Qdrat_dVds ; - here->HSMHV2_Xd_dVbsi = Qdrat_dVbs ; - here->HSMHV2_Xd_dTi = Qdrat_dT ; - - here->HSMHV2_Qbulk = Mfactor * Qb ; - here->HSMHV2_Qbulk_dVgsi = Mfactor * Qb_dVgs ; - here->HSMHV2_Qbulk_dVdsi = Mfactor * Qb_dVds ; - here->HSMHV2_Qbulk_dVbsi = Mfactor * Qb_dVbs ; - here->HSMHV2_Qbulk_dTi = Mfactor * Qb_dT ; - - here->HSMHV2_Qi = Mfactor * Qi ; - here->HSMHV2_Qi_dVgsi = Mfactor * Qi_dVgs ; - here->HSMHV2_Qi_dVdsi = Mfactor * Qi_dVds ; - here->HSMHV2_Qi_dVbsi = Mfactor * Qi_dVbs ; - here->HSMHV2_Qi_dTi = Mfactor * Qi_dT ; - - } else { /* QS */ - - here->HSMHV2_qg = Mfactor * - (Qb + Qi) ; - here->HSMHV2_qd = Mfactor * Qd ; - here->HSMHV2_qs = Mfactor * ( Qi - Qd ) ; - here->HSMHV2_qdp = 0.0 ; - here->HSMHV2_qsp = 0.0 ; - - here->HSMHV2_dqdp_dVdse = 0.0 ; - here->HSMHV2_dqdp_dVgse = 0.0 ; - here->HSMHV2_dqdp_dVbse = 0.0 ; - here->HSMHV2_dqdp_dTi = 0.0 ; - here->HSMHV2_dqsp_dVdse = 0.0 ; - here->HSMHV2_dqsp_dVgse = 0.0 ; - here->HSMHV2_dqsp_dVbse = 0.0 ; - here->HSMHV2_dqsp_dTi = 0.0 ; - - here->HSMHV2_qgext = 0.0 ; - here->HSMHV2_qdext = 0.0 ; - here->HSMHV2_qsext = 0.0 ; - - here->HSMHV2_dQdext_dVdse = 0.0 ; - here->HSMHV2_dQdext_dVgse = 0.0 ; - here->HSMHV2_dQdext_dVbse = 0.0 ; - here->HSMHV2_dQdext_dTi = 0.0 ; - here->HSMHV2_dQgext_dVdse = 0.0 ; - here->HSMHV2_dQgext_dVgse = 0.0 ; - here->HSMHV2_dQgext_dVbse = 0.0 ; - here->HSMHV2_dQgext_dTi = 0.0 ; - here->HSMHV2_dQbext_dVdse = 0.0 ; - here->HSMHV2_dQbext_dVgse = 0.0 ; - here->HSMHV2_dQbext_dVbse = 0.0 ; - here->HSMHV2_dQbext_dTi = 0.0 ; - here->HSMHV2_dQdi_dVdsi = Mfactor * Qd_dVds ; - here->HSMHV2_dQdi_dVgsi = Mfactor * Qd_dVgs ; - here->HSMHV2_dQdi_dVbsi = Mfactor * Qd_dVbs ; - here->HSMHV2_dQdi_dTi = Mfactor * Qd_dT ; - here->HSMHV2_dQg_dVdsi = Mfactor * ( - Qb_dVds - Qi_dVds ) ; - here->HSMHV2_dQg_dVgsi = Mfactor * ( - Qb_dVgs - Qi_dVgs ) ; - here->HSMHV2_dQg_dVbsi = Mfactor * ( - Qb_dVbs - Qi_dVbs ) ; - here->HSMHV2_dQg_dTi = Mfactor * ( - Qb_dT - Qi_dT ) ; - here->HSMHV2_dQb_dVdsi = Mfactor * Qb_dVds ; - here->HSMHV2_dQb_dVgsi = Mfactor * Qb_dVgs ; - here->HSMHV2_dQb_dVbsi = Mfactor * Qb_dVbs ; - here->HSMHV2_dQb_dTi = Mfactor * Qb_dT ; - } - - /*---------------------------------------------------* - * Add S/D overlap charges/capacitances to intrinsic ones. - * - NOTE: This function depends on coadov, a control option. - *-----------------*/ - if ( model->HSMHV2_coadov == 1 ) { - here->HSMHV2_qg += Mfactor * ( Qgod + Qgos + Qgbo + Qy - Qovd - Qovs ) ; - here->HSMHV2_qd += Mfactor * ( - Qgod - Qy + QbdLD ) ; - here->HSMHV2_qs += Mfactor * ( - Qgos + QbsLD ) ; - - here->HSMHV2_qdp += Mfactor * ( - Qfd - Qgdo ) ; - here->HSMHV2_qsp += Mfactor * ( - Qfs - Qgso ) ; - - here->HSMHV2_cddo = Mfactor * ( - Qgod_dVds - Qy_dVds + QbdLD_dVds ) ; - here->HSMHV2_dQdi_dVdsi += here->HSMHV2_cddo ; - here->HSMHV2_cdgo = Mfactor * ( - Qgod_dVgs - Qy_dVgs + QbdLD_dVgs ) ; - here->HSMHV2_dQdi_dVgsi += here->HSMHV2_cdgo ; - here->HSMHV2_cdbo = Mfactor * ( - Qgod_dVbs - Qy_dVbs + QbdLD_dVbs ) ; - here->HSMHV2_dQdi_dVbsi += here->HSMHV2_cdbo ; - here->HSMHV2_dQdi_dTi += Mfactor * ( - Qgod_dT - Qy_dT + QbdLD_dT ) ; - here->HSMHV2_cgdo = Mfactor * ( Qgod_dVds + Qgos_dVds + Qgbo_dVds + Qy_dVds - Qovd_dVds - Qovs_dVds ) ; - here->HSMHV2_dQg_dVdsi += here->HSMHV2_cgdo ; - here->HSMHV2_cggo = Mfactor * ( Qgod_dVgs + Qgos_dVgs + Qgbo_dVgs + Qy_dVgs - Qovd_dVgs - Qovs_dVgs ) ; - here->HSMHV2_dQg_dVgsi += here->HSMHV2_cggo ; - here->HSMHV2_cgbo = Mfactor * ( Qgod_dVbs + Qgos_dVbs + Qgbo_dVbs + Qy_dVbs - Qovd_dVbs - Qovs_dVbs ) ; - here->HSMHV2_dQg_dVbsi += here->HSMHV2_cgbo ; - here->HSMHV2_dQg_dTi += Mfactor * ( Qgod_dT + Qgos_dT + Qgbo_dT + Qy_dT - Qovd_dT - Qovs_dT ) ; - here->HSMHV2_cbdo = Mfactor * ( - Qgbo_dVds + QidLD_dVds + QisLD_dVds ) ; - here->HSMHV2_dQb_dVdsi += here->HSMHV2_cbdo ; - here->HSMHV2_cbgo = Mfactor * ( - Qgbo_dVgs + QidLD_dVgs + QisLD_dVgs ) ; - here->HSMHV2_dQb_dVgsi += here->HSMHV2_cbgo ; - here->HSMHV2_cbbo = Mfactor * ( - Qgbo_dVbs + QidLD_dVbs + QisLD_dVbs ) ; - here->HSMHV2_dQb_dVbsi += here->HSMHV2_cbbo ; - here->HSMHV2_dQb_dTi += Mfactor * ( - Qgbo_dT + QidLD_dT + QisLD_dT ) ; - - /* for fringing capacitances */ - here->HSMHV2_dqdp_dVdse += Mfactor * ( Cfd - Qgdo_dVdse ) ; - here->HSMHV2_dqdp_dVgse += Mfactor * ( - Cfd - Qgdo_dVgse ) ; - here->HSMHV2_dqdp_dVbse += Mfactor * ( - Qgdo_dVbse ) ; - here->HSMHV2_dqdp_dTi += 0.0 ; - here->HSMHV2_dqsp_dVdse += Mfactor * ( - Qgso_dVdse ) ; - here->HSMHV2_dqsp_dVgse += Mfactor * ( - Cfs - Qgso_dVgse ) ; - here->HSMHV2_dqsp_dVbse += Mfactor * ( - Qgso_dVbse ) ; - here->HSMHV2_dqsp_dTi += 0.0 ; - - here->HSMHV2_qgext += Mfactor * ( - Qovdext - Qovsext ) ; - here->HSMHV2_qdext += Mfactor * QbdLDext ; - here->HSMHV2_qsext += Mfactor * QbsLDext ; - - here->HSMHV2_dQdext_dVdse += Mfactor * ( QbdLDext_dVdse ) ; - here->HSMHV2_dQdext_dVgse += Mfactor * ( QbdLDext_dVgse ) ; - here->HSMHV2_dQdext_dVbse += Mfactor * ( QbdLDext_dVbse ) ; - here->HSMHV2_dQdext_dTi += Mfactor * ( QbdLDext_dT ) ; - here->HSMHV2_dQgext_dVdse += Mfactor * ( - Qovdext_dVdse - Qovsext_dVdse ) ; - here->HSMHV2_dQgext_dVgse += Mfactor * ( - Qovdext_dVgse - Qovsext_dVgse ) ; - here->HSMHV2_dQgext_dVbse += Mfactor * ( - Qovdext_dVbse - Qovsext_dVbse ) ; - here->HSMHV2_dQgext_dTi += Mfactor * ( - Qovdext_dT - Qovsext_dT ) ; - here->HSMHV2_dQbext_dVdse += Mfactor * ( QidLDext_dVdse + QisLDext_dVdse ) ; - here->HSMHV2_dQbext_dVgse += Mfactor * ( QidLDext_dVgse + QisLDext_dVgse ) ; - here->HSMHV2_dQbext_dVbse += Mfactor * ( QidLDext_dVbse + QisLDext_dVbse ) ; - here->HSMHV2_dQbext_dTi += Mfactor * ( QidLDext_dT + QisLDext_dT ) ; - - } - here->HSMHV2_dQsi_dVdsi = - (here->HSMHV2_dQdi_dVdsi + here->HSMHV2_dQg_dVdsi + here->HSMHV2_dQb_dVdsi) ; - here->HSMHV2_dQsi_dVgsi = - (here->HSMHV2_dQdi_dVgsi + here->HSMHV2_dQg_dVgsi + here->HSMHV2_dQb_dVgsi) ; - here->HSMHV2_dQsi_dVbsi = - (here->HSMHV2_dQdi_dVbsi + here->HSMHV2_dQg_dVbsi + here->HSMHV2_dQb_dVbsi) ; - here->HSMHV2_dQsi_dTi = - (here->HSMHV2_dQdi_dTi + here->HSMHV2_dQg_dTi + here->HSMHV2_dQb_dTi ) ; - - here->HSMHV2_dQsext_dVdse = - (here->HSMHV2_dQdext_dVdse + here->HSMHV2_dQgext_dVdse + here->HSMHV2_dQbext_dVdse) ; - here->HSMHV2_dQsext_dVgse = - (here->HSMHV2_dQdext_dVgse + here->HSMHV2_dQgext_dVgse + here->HSMHV2_dQbext_dVgse) ; - here->HSMHV2_dQsext_dVbse = - (here->HSMHV2_dQdext_dVbse + here->HSMHV2_dQgext_dVbse + here->HSMHV2_dQbext_dVbse) ; - here->HSMHV2_dQsext_dTi = - (here->HSMHV2_dQdext_dTi + here->HSMHV2_dQgext_dTi + here->HSMHV2_dQbext_dTi ) ; - - /*---------------------------------------------------* - * Substrate/gate/leak currents. - *-----------------*/ - - here->HSMHV2_isub = Mfactor * Isub ; - here->HSMHV2_dIsub_dVdsi = Mfactor * Isub_dVds ; - here->HSMHV2_dIsub_dVgsi = Mfactor * Isub_dVgs ; - here->HSMHV2_dIsub_dVbsi = Mfactor * Isub_dVbs ; - here->HSMHV2_dIsub_dTi = Mfactor * Isub_dT ; - - here->HSMHV2_isubld = Mfactor * IsubLD ; - here->HSMHV2_dIsubLD_dVdsi = Mfactor * IsubLD_dVds ; - here->HSMHV2_dIsubLD_dVgsi = Mfactor * IsubLD_dVgs ; - here->HSMHV2_dIsubLD_dVbsi = Mfactor * IsubLD_dVbs ; - here->HSMHV2_dIsubLD_dTi = Mfactor * IsubLD_dT ; - here->HSMHV2_dIsubLD_dVddp = Mfactor * IsubLD_dVddp ; - - here->HSMHV2_igb = Mfactor * -Igb ; - here->HSMHV2_dIgb_dVdsi = - Mfactor * Igb_dVds ; - here->HSMHV2_dIgb_dVgsi = - Mfactor * Igb_dVgs ; - here->HSMHV2_dIgb_dVbsi = - Mfactor * Igb_dVbs ; - here->HSMHV2_dIgb_dTi = - Mfactor * Igb_dT ; - - if (here->HSMHV2_mode == HiSIM_NORMAL_MODE) { - here->HSMHV2_igd = Mfactor * ( model->HSMHV2_glpart1 * Igate - Igd ) ; - } else { - here->HSMHV2_igd = Mfactor * ( (1.0e0 - model->HSMHV2_glpart1 ) * Igate - Igs ) ; - } - - if (here->HSMHV2_mode == HiSIM_NORMAL_MODE) { - here->HSMHV2_igs = Mfactor * ( (1.0e0 - model->HSMHV2_glpart1) * Igate - Igs ) ; - } else { - here->HSMHV2_igs = Mfactor * ( model->HSMHV2_glpart1 * Igate - Igd ) ; - } - - /* note: here->HSMHV2_igd and here->HSMHV2_igs are already subjected to mode handling, - while the following derivatives here->HSMHV2_dIgd_dVdsi, ... are not! */ - here->HSMHV2_dIgd_dVdsi = Mfactor * ( model->HSMHV2_glpart1 * Igate_dVds - Igd_dVds ) ; - here->HSMHV2_dIgd_dVgsi = Mfactor * ( model->HSMHV2_glpart1 * Igate_dVgs - Igd_dVgs ) ; - here->HSMHV2_dIgd_dVbsi = Mfactor * ( model->HSMHV2_glpart1 * Igate_dVbs - Igd_dVbs ) ; - here->HSMHV2_dIgd_dTi = Mfactor * ( model->HSMHV2_glpart1 * Igate_dT - Igd_dT ) ; - here->HSMHV2_dIgs_dVdsi = Mfactor * ( (1.0 - model->HSMHV2_glpart1) * Igate_dVds - Igs_dVds ) ; - here->HSMHV2_dIgs_dVgsi = Mfactor * ( (1.0 - model->HSMHV2_glpart1) * Igate_dVgs - Igs_dVgs ) ; - here->HSMHV2_dIgs_dVbsi = Mfactor * ( (1.0 - model->HSMHV2_glpart1) * Igate_dVbs - Igs_dVbs ) ; - here->HSMHV2_dIgs_dTi = Mfactor * ( (1.0 - model->HSMHV2_glpart1) * Igate_dT - Igs_dT ) ; - - here->HSMHV2_igidl = Mfactor * Igidl ; - here->HSMHV2_dIgidl_dVdsi = Mfactor * Igidl_dVds ; - here->HSMHV2_dIgidl_dVgsi = Mfactor * Igidl_dVgs ; - here->HSMHV2_dIgidl_dVbsi = Mfactor * Igidl_dVbs ; - here->HSMHV2_dIgidl_dTi = Mfactor * Igidl_dT ; - - here->HSMHV2_igisl = Mfactor * Igisl ; - here->HSMHV2_dIgisl_dVdsi = Mfactor * Igisl_dVds ; - here->HSMHV2_dIgisl_dVgsi = Mfactor * Igisl_dVgs ; - here->HSMHV2_dIgisl_dVbsi = Mfactor * Igisl_dVbs ; - here->HSMHV2_dIgisl_dTi = Mfactor * Igisl_dT ; - - /*---------------------------------------------------* - * Von, Vdsat. - *-----------------*/ - here->HSMHV2_von = Vth ; - here->HSMHV2_vdsat = Vdsat ; - - - - - /*-----------------------------------------------------------* - * Warn floating-point exceptions. - * - Function finite() in libm is called. - * - Go to start with info==5. - *-----------------*/ - T1 = here->HSMHV2_ids + here->HSMHV2_dIds_dVdsi + here->HSMHV2_dIds_dVgsi + here->HSMHV2_dIds_dVbsi ; - T1 = T1 + here->HSMHV2_qd - (here->HSMHV2_dQdi_dVdsi + here->HSMHV2_dQdi_dVgsi + here->HSMHV2_dQdi_dVbsi) ; - if ( ! finite (T1) ) { - flg_err = 1 ; - fprintf (stderr , - "*** warning(HiSIM_HV(%s)): FP-exception (PART-1)\n", model->HSMHV2modName ) ; - if ( flg_info >= 1 ) { - printf ( "*** warning(HiSIM_HV(%s)): FP-exception\n", model->HSMHV2modName) ; - printf ( "Ids = %e\n" , here->HSMHV2_ids ) ; - printf ( "Gmbs = %e\n" , here->HSMHV2_dIds_dVbsi ) ; - printf ( "Gds = %e\n" , here->HSMHV2_dIds_dVdsi ) ; - printf ( "Gm = %e\n" , here->HSMHV2_dIds_dVgsi ) ; - printf ( "Qd = %e\n" , here->HSMHV2_qd ) ; - printf ( "Cds = %e\n" , -(here->HSMHV2_dQdi_dVdsi - + here->HSMHV2_dQdi_dVgsi - + here->HSMHV2_dQdi_dVbsi) ) ; - } - } - - T1 = here->HSMHV2_isub + here->HSMHV2_dIsub_dVbsi + here->HSMHV2_dIsub_dVdsi + here->HSMHV2_dIsub_dVgsi ; - if ( ! finite (T1) ) { - flg_err = 1 ; - fprintf (stderr , - "*** warning(HiSIM_HV(%s)): FP-exception (PART-2)\n", model->HSMHV2modName) ; - if ( flg_info >= 1 ) { - printf ("*** warning(HiSIM_HV(%s)): FP-exception\n", model->HSMHV2modName) ; - } - } - - T1 = here->HSMHV2_dQg_dVdsi + here->HSMHV2_dQg_dVgsi + here->HSMHV2_dQg_dVbsi ; - if ( ! finite (T1) ) { - flg_err = 1 ; - fprintf(stderr , - "*** warning(HiSIM_HV(%s)): FP-exception (PART-3)\n", model->HSMHV2modName) ; - if ( flg_info >= 1 ) { - printf ("*** warning(HiSIM_HV(%s)): FP-exception\n", model->HSMHV2modName) ; - } - } - - - /*-----------------------------------------------------------* - * Exit for error case. - *-----------------*/ - if ( flg_err != 0 ) { - fprintf (stderr , "----- bias information (HiSIM_HV)\n") ; - fprintf (stderr , "name: %s\n" , here->HSMHV2name ) ; - fprintf (stderr , "states: %d\n" , here->HSMHV2states ) ; - fprintf (stderr , "Vdse= %.3e Vgse=%.3e Vbse=%.3e\n" - , Vdse , Vgse , Vbse ) ; - fprintf (stderr , "Vdsi= %.3e Vgsi=%.3e Vbsi=%.3e\n" - , Vds , Vgs , Vbs ) ; - fprintf (stderr , "vbs_jct= %12.5e vbd_jct= %12.5e\n" - , vbs_jct , vbd_jct ) ; - fprintf (stderr , "vd= %.3e vs= %.3e vdp= %.3e vgp= %.3e vbp= %.3e vsp= %.3e\n" - , *( ckt->CKTrhsOld + here->HSMHV2dNode ) - , *( ckt->CKTrhsOld + here->HSMHV2sNode ) - , *( ckt->CKTrhsOld + here->HSMHV2dNodePrime ) - , *( ckt->CKTrhsOld + here->HSMHV2gNodePrime ) - , *( ckt->CKTrhsOld + here->HSMHV2bNodePrime ) - , *( ckt->CKTrhsOld + here->HSMHV2sNodePrime ) ) ; - fprintf (stderr , "----- bias information (end)\n" ) ; - return ( HiSIM_ERROR ) ; - } - - - /*-----------------------------------------------------------* - * Noise. - *-----------------*/ - here->HSMHV2_noiflick = Mfactor * Nflic ; - here->HSMHV2_noithrml = Mfactor * Nthrml ; - - /*----------------------------------------------------------* - * induced gate noise. ( Part 3/3 ) - *----------------------*/ - if ( model->HSMHV2_coign != 0 && model->HSMHV2_cothrml != 0 && flg_ign == 1 && !flg_noqi && model->HSMHV2_codep==0 ) { - T0 = Cox_small * Cox * here->HSMHV2_weff_nf * Leff ; - T1 = -( here->HSMHV2_dQg_dVdsi + here->HSMHV2_dQg_dVgsi + here->HSMHV2_dQg_dVbsi ) / Mfactor ; /* NQS case is not supported. */ - if( - T1 > T0 ){ - Nign0 = c_16o135 * C_QE * beta_inv * T1 * T1 / gds0_ign ; - if ( kusai00L > epsm10 && Vds > epsm10 ) { - MuModA = Muun / Mu ; - MuModB = ( Muun / Mud_hoso - MuModA ) / Vds ; - correct_w1 = MuModA + C_2o3 * MuModB - * ( kusai00 + VgVt * sqrtkusaiL + kusaiL ) - / ( VgVt + sqrtkusaiL ) ; - } else { - correct_w1 = Muun / Mud_hoso ; - } - here->HSMHV2_noiigate = Mfactor * Nign0 * kusai_ig * correct_w1 ; - here->HSMHV2_noicross = crl_f ; - if ( here->HSMHV2_noiigate < 0.0 ) here->HSMHV2_noiigate = 0.0e0 ; - }else{ - here->HSMHV2_noiigate = 0.0e0 ; - here->HSMHV2_noicross = 0.0e0 ; - } - }else{ - here->HSMHV2_noiigate = 0.0e0 ; - here->HSMHV2_noicross = 0.0e0 ; - } - - /*-----------------------------------------------------------* - * Store values for next calculation. - *-----------------*/ - - /* Internal biases */ - if ( here->HSMHV2_called >= 1 ) { - here->HSMHV2_vbsc_prv2 = here->HSMHV2_vbsc_prv ; - here->HSMHV2_vdsc_prv2 = here->HSMHV2_vdsc_prv ; - here->HSMHV2_vgsc_prv2 = here->HSMHV2_vgsc_prv ; - here->HSMHV2_mode_prv2 = here->HSMHV2_mode_prv ; - } - here->HSMHV2_vbsc_prv = Vbs ; - here->HSMHV2_vdsc_prv = Vds ; - here->HSMHV2_vgsc_prv = Vgs ; - here->HSMHV2_mode_prv = here->HSMHV2_mode ; - here->HSMHV2_temp_prv = TTEMP ; - - /* Surface potentials and derivatives w.r.t. internal biases */ - if ( here->HSMHV2_called >= 1 ) { - here->HSMHV2_ps0_prv2 = here->HSMHV2_ps0_prv ; - here->HSMHV2_ps0_dvbs_prv2 = here->HSMHV2_ps0_dvbs_prv ; - here->HSMHV2_ps0_dvds_prv2 = here->HSMHV2_ps0_dvds_prv ; - here->HSMHV2_ps0_dvgs_prv2 = here->HSMHV2_ps0_dvgs_prv ; - here->HSMHV2_pds_prv2 = here->HSMHV2_pds_prv ; - here->HSMHV2_pds_dvbs_prv2 = here->HSMHV2_pds_dvbs_prv ; - here->HSMHV2_pds_dvds_prv2 = here->HSMHV2_pds_dvds_prv ; - here->HSMHV2_pds_dvgs_prv2 = here->HSMHV2_pds_dvgs_prv ; - } - - here->HSMHV2_ps0_prv = Ps0 ; - here->HSMHV2_ps0_dvbs_prv = Ps0_dVbs ; - here->HSMHV2_ps0_dvds_prv = Ps0_dVds ; - here->HSMHV2_ps0_dvgs_prv = Ps0_dVgs ; - here->HSMHV2_ps0_dtemp_prv = Ps0_dT ; - here->HSMHV2_pds_prv = Pds ; - here->HSMHV2_pds_dvbs_prv = Pds_dVbs ; - here->HSMHV2_pds_dvds_prv = Pds_dVds ; - here->HSMHV2_pds_dvgs_prv = Pds_dVgs ; - here->HSMHV2_pds_dtemp_prv = Pds_dT ; - - - /* derivatives of channel current w.r.t. external bias (only due to Ra-dependencies!) */ - here->HSMHV2_dIds_dVdse = Ids_dRa * Ra_dVdse * Mfactor ; - here->HSMHV2_dIds_dVgse = Ids_dRa * Ra_dVgse * Mfactor ; - here->HSMHV2_dIds_dVbse = Ids_dRa * Ra_dVbse * Mfactor ; - - if ( VdseModeNML > 0.0 ) { - here->HSMHV2_Rd = Rd / Mfactor ; - here->HSMHV2_dRd_dVdse = Rd_dVdse / Mfactor ; - here->HSMHV2_dRd_dVgse = Rd_dVgse / Mfactor ; - here->HSMHV2_dRd_dVbse = Rd_dVbse / Mfactor ; - here->HSMHV2_dRd_dVsubs = Rd_dVsubs / Mfactor ; - here->HSMHV2_dRd_dTi = Rd_dT / Mfactor ; - here->HSMHV2_Rs = Rs / Mfactor ; - here->HSMHV2_dRs_dVdse = Rs_dVdse / Mfactor ; - here->HSMHV2_dRs_dVgse = Rs_dVgse / Mfactor ; - here->HSMHV2_dRs_dVbse = Rs_dVbse / Mfactor ; - here->HSMHV2_dRs_dVsubs = Rs_dVsubs / Mfactor ; - here->HSMHV2_dRs_dTi = Rs_dT / Mfactor ; - } else { - here->HSMHV2_Rd = Rs / Mfactor ; - here->HSMHV2_dRd_dVdse = - ( Rs_dVdse + Rs_dVgse + Rs_dVbse + Rs_dVsubs ) / Mfactor ; - here->HSMHV2_dRd_dVgse = Rs_dVgse / Mfactor ; - here->HSMHV2_dRd_dVbse = Rs_dVbse / Mfactor ; - here->HSMHV2_dRd_dVsubs = Rs_dVsubs / Mfactor ; - here->HSMHV2_dRd_dTi = Rs_dT / Mfactor ; - here->HSMHV2_Rs = Rd / Mfactor ; - here->HSMHV2_dRs_dVdse = - ( Rd_dVdse + Rd_dVgse + Rd_dVbse + Rd_dVsubs ) / Mfactor ; - here->HSMHV2_dRs_dVgse = Rd_dVgse / Mfactor ; - here->HSMHV2_dRs_dVbse = Rd_dVbse / Mfactor ; - here->HSMHV2_dRs_dVsubs = Rd_dVsubs / Mfactor ; - here->HSMHV2_dRs_dTi = Rd_dT / Mfactor ; - } - /* Clamping to Res_min */ - if(here->HSMHV2_Rd < Res_min) { - here->HSMHV2_Rd = Res_min ; - here->HSMHV2_dRd_dVdse = 0.0 ; - here->HSMHV2_dRd_dVgse = 0.0 ; - here->HSMHV2_dRd_dVbse = 0.0 ; - here->HSMHV2_dRd_dVsubs = 0.0 ; - here->HSMHV2_dRd_dTi = 0.0 ; - } - if(here->HSMHV2_Rs < Res_min) { - here->HSMHV2_Rs = Res_min ; - here->HSMHV2_dRs_dVdse = 0.0 ; - here->HSMHV2_dRs_dVgse = 0.0 ; - here->HSMHV2_dRs_dVbse = 0.0 ; - here->HSMHV2_dRs_dVsubs = 0.0 ; - here->HSMHV2_dRs_dTi = 0.0 ; - } - - /*-----------------------------------------------------------* - * End of PART-7. (label) - *-----------------*/ -/* end_of_part_7: */ - - /*-----------------------------------------------------------* - * Bottom of hsmhveval. - *-----------------*/ - - return ( HiSIM_OK ) ; - -} /* end of hsmhveval */ diff --git a/src/spicelib/devices/hisimhv2/hsmhv2eval_dep.h b/src/spicelib/devices/hisimhv2/hsmhv2eval_dep.h deleted file mode 100644 index c795c93fb..000000000 --- a/src/spicelib/devices/hisimhv2/hsmhv2eval_dep.h +++ /dev/null @@ -1,2432 +0,0 @@ -/*********************************************************************** - - HiSIM (Hiroshima University STARC IGFET Model) - Copyright (C) 2014 Hiroshima University & STARC - - MODEL NAME : HiSIM_HV - ( VERSION : 2 SUBVERSION : 2 REVISION : 0 ) - Model Parameter 'VERSION' : 2.20 - FILE : hsmhveval_dep.h - - DATE : 2014.6.11 - - released by - Hiroshima University & - Semiconductor Technology Academic Research Center (STARC) -***********************************************************************/ - -/********************************************************************** - -The following source code, and all copyrights, trade secrets or other -intellectual property rights in and to the source code in its entirety, -is owned by the Hiroshima University and the STARC organization. - -All users need to follow the "HISIM_HV Distribution Statement and -Copyright Notice" attached to HiSIM_HV model. - ------HISIM_HV Distribution Statement and Copyright Notice-------------- - -Software is distributed as is, completely without warranty or service -support. Hiroshima University or STARC and its employees are not liable -for the condition or performance of the software. - -Hiroshima University and STARC own the copyright and grant users a perpetual, -irrevocable, worldwide, non-exclusive, royalty-free license with respect -to the software as set forth below. - -Hiroshima University and STARC hereby disclaims all implied warranties. - -Hiroshima University and STARC grant the users the right to modify, copy, -and redistribute the software and documentation, both within the user's -organization and externally, subject to the following restrictions - -1. The users agree not to charge for Hiroshima University and STARC code -itself but may charge for additions, extensions, or support. - -2. In any product based on the software, the users agree to acknowledge -Hiroshima University and STARC that developed the software. This -acknowledgment shall appear in the product documentation. - -3. The users agree to reproduce any copyright notice which appears on -the software on any copy or modification of such made available -to others." - -Toshimasa Asahara, President, Hiroshima University -Mitiko Miura-Mattausch, Professor, Hiroshima University -Katsuhiro Shimohigashi, President&CEO, STARC -June 2008 (revised October 2011) -*************************************************************************/ - -{ // Begin : hsmhveval_dep - -/* define local variavles */ - int depmode ; - double afact, afact2, afact3, bfact, cfact ; - double W_bsub0, W_bsubL, W_s0, W_sL, W_sub0, W_subL, W_b0, W_bL, vthn ; - double phi_s0_DEP = 0.0, phi_sL_DEP = 0.0 , Vbi_DEP ; - double phi_s0_DEP_dVgs, phi_s0_DEP_dVbs, phi_s0_DEP_dVds, phi_s0_DEP_dT ; - double phi_sL_DEP_dVgs, phi_sL_DEP_dVbs, phi_sL_DEP_dVds, phi_sL_DEP_dT ; - double phi_j0_DEP, phi_jL_DEP, Psbmax, phi_b0_DEP_lim, phi_bL_DEP_lim ; - - - double phi_jL_DEP_dVgs, phi_jL_DEP_dVds, phi_jL_DEP_dVbs, phi_jL_DEP_dT ; - - double Vgp0, Vgp1, Vgp0old, phi_j0_DEP_old, phi_jL_DEP_old, phi_b0_DEP_old, phi_bL_DEP_old, phi_s0_DEP_old, phi_sL_DEP_old ; - double phi_j0_DEP_acc, phi_jL_DEP_acc ; - - - double Q_s0, Q_sL = 0.0 ; - double Q_s0_dVgs, Q_sL_dVgs = 0.0, Q_s0_dVds, Q_sL_dVds = 0.0, Q_s0_dVbs, Q_sL_dVbs = 0.0, Q_s0_dT, Q_sL_dT = 0.0 ; - double Q_sub0, Q_subL, Q_sub0_dVgs, Q_subL_dVgs, Q_sub0_dVds, Q_subL_dVds, Q_sub0_dVbs, Q_subL_dVbs, Q_sub0_dT, Q_subL_dT ; - double Qn_res0, Qn_res0_dVgs, Qn_res0_dVds, Qn_res0_dVbs, Qn_res0_dT ; - - - double y1, y2, dety ; - double y11, y12 ; - double y21, y22 ; - - double y1_dVgs, y1_dVds, y1_dVbs, y1_dT ; - double y2_dVgs, y2_dVds, y2_dVbs, y2_dT ; - - double rev11 = 0.0, rev12 = 0.0 ; - double rev21 = 0.0, rev22 = 0.0 ; - - double phi_b0_DEP_ini ; - double y0, dydPsm ; - - double W_b0_dVgs, W_b0_dVds, W_b0_dVbs, W_b0_dT ; - - double W_res0 ; - double W_s0_dVgs, W_s0_dVds, W_s0_dVbs, W_s0_dT ; - - double phi_b0_DEP, Q_b0_dep, Q_sub0_dep ; - double phi_b0_DEP_dVgs, phi_b0_DEP_dVds, phi_b0_DEP_dVbs, phi_b0_DEP_dT ; - double phi_j0_DEP_dVgs, phi_j0_DEP_dVds, phi_j0_DEP_dVbs, phi_j0_DEP_dT ; - double Q_b0_dep_dVgs, Q_b0_dep_dVds, Q_b0_dep_dVbs, Q_b0_dep_dT ; - double Q_sub0_dep_dVgs, Q_sub0_dep_dVds, Q_sub0_dep_dVbs, Q_sub0_dep_dT ; - - double phi_bL_DEP, Q_bL_dep, Q_subL_dep ; - double phi_bL_DEP_dVgs, phi_bL_DEP_dVds, phi_bL_DEP_dVbs, phi_bL_DEP_dT ; - double Q_bL_dep_dVgs, Q_bL_dep_dVds, Q_bL_dep_dVbs, Q_bL_dep_dT ; - double Q_subL_dep_dVgs, Q_subL_dep_dVds, Q_subL_dep_dVbs, Q_subL_dep_dT ; - - double q_Ndepm_esi, Idd_drift,Idd_diffu ; - double Qn_bac0 ; - double Qn_bac0_dVgs, Qn_bac0_dVds, Qn_bac0_dVbs, Qn_bac0_dT ; - - double Mu_res, Mu_bac ; - double Mu_res_dVgs, Mu_res_dVds, Mu_res_dVbs, Mu_res_dT ; - double Mu_bac_dVgs, Mu_bac_dVds, Mu_bac_dVbs, Mu_bac_dT ; - - double Q_n0_cur, Q_nL_cur ; - double Q_n0_cur_dVgs, Q_n0_cur_dVds, Q_n0_cur_dVbs, Q_n0_cur_dT ; - double Q_nL_cur_dVgs, Q_nL_cur_dVds, Q_nL_cur_dVbs, Q_nL_cur_dT ; - - double Q_s0_dep, Q_sL_dep ; - double Q_s0_dep_dVgs, Q_s0_dep_dVds, Q_s0_dep_dVbs, Q_s0_dep_dT ; - double Q_sL_dep_dVgs, Q_sL_dep_dVds, Q_sL_dep_dVbs, Q_sL_dep_dT ; - - double sm_delta ; - double phib_ref, phib_ref_dPs, phib_ref_dPd ; - double Q_s0_dPs, Q_sL_dPs, Q_s0_dPb, Q_sL_dPb ; - double Q_b0_dep_dPb, Q_bL_dep_dPb, Q_b0_dep_dPd, Q_bL_dep_dPd, Q_sub0_dep_dPd, Q_subL_dep_dPd ; - double phi_j0_DEP_dPb, phi_jL_DEP_dPb ; - double NdepmpNsub_inv1, NdepmpNsub ; - - - - double Q_n0, Q_n0_dVgs, Q_n0_dVds, Q_n0_dVbs, Q_n0_dT ; - double Q_nL, Q_nL_dVgs, Q_nL_dVds, Q_nL_dVbs, Q_nL_dT ; - - double phi_s0_DEP_ini, phi_sL_DEP_ini ; - - - double C_QE2, C_ESI2, Tn2 ; - double Ndepm2, q_Ndepm ; - double C_2ESIpq_Ndepm, C_2ESIpq_Ndepm_inv , C_2ESI_q_Ndepm ; - double C_2ESIpq_Nsub , C_2ESIpq_Nsub_inv ; - double ps_conv3 , ps_conv23 ; - double Ids_res, Ids_bac, Edri ; - double Ids_res_dVgs, Ids_res_dVds, Ids_res_dVbs ; - double Ids_res_dT ; - double Ids_bac_dVgs, Ids_bac_dVds, Ids_bac_dVbs, Ids_bac_dT ; - double Edri_dVgs, Edri_dVds, Edri_dVbs, Edri_dT ; - - double T1_dVgs, T1_dVds, T1_dVbs ; - double T2_dVgs, T2_dVds, T2_dVbs ; - double T3_dVgs, T3_dVds, T3_dVbs ; - double T4_dVgs, T4_dVds, T4_dVbs ; - double T5_dVgs, T5_dVds, T5_dVbs ; - - - double Vgpp ; - double Vgpp_dVgs, Vgpp_dVds, Vgpp_dVbs,Vgpp_dT ; - double Vdseff0, Vdseff0_dVgs, Vdseff0_dVds, Vdseff0_dVbs,Vdseff0_dT ; - double phib_ref_dVgs, phib_ref_dVds, phib_ref_dVbs,phib_ref_dT ; - - double Qn_delta, Qn_delta_dT ; - double Qn_drift, Qn_drift_dVgs, Qn_drift_dVds, Qn_drift_dVbs, Qn_drift_dT ; - - double Ey_suf, Ey_suf_dVgs, Ey_suf_dVds, Ey_suf_dVbs, Ey_suf_dT ; - - double DEPQFN3 = 0.3 ; - double DEPQFN_dlt = 2.0 ; - double Ps_delta = 0.06 ; - double Ps_delta0 = 0.10 ; - - // Constants - Vbi_DEP = here->HSMHV2_Vbipn ; - q_Ndepm = C_QE * here->HSMHV2_ndepm ; - Ndepm2 = here->HSMHV2_ndepm * here->HSMHV2_ndepm ; - q_Ndepm_esi = C_QE * here->HSMHV2_ndepm * C_ESI ; - q_Nsub = C_QE * here->HSMHV2_nsub ; - C_QE2 = C_QE * C_QE ; - C_ESI2 = C_ESI * C_ESI ; - Tn2 = model->HSMHV2_tndep * model->HSMHV2_tndep ; - C_2ESIpq_Ndepm = 2.0 * C_ESI/q_Ndepm ; - C_2ESIpq_Ndepm_inv = q_Ndepm / (2.0 * C_ESI) ; - C_2ESI_q_Ndepm = 2.0 * C_ESI * q_Ndepm ; - C_2ESIpq_Nsub = 2.0 * C_ESI / q_Nsub ; - C_2ESIpq_Nsub_inv = q_Nsub / (2.0 * C_ESI) ; - NdepmpNsub = here->HSMHV2_ndepm / here->HSMHV2_nsub ; - NdepmpNsub_inv1 = 1.0 / (1.0 + NdepmpNsub ) ; - ps_conv3 = ps_conv * 1000.0 ; - ps_conv23 = ps_conv2 * 1000.0 ; - - //---------------------------------------------------* - // depletion MOS mode - //------------------// - - /*---------------------------------------------------* - * initial potential phi_s0_DEP,phi_b0_DEP,phi_j0_DEP calculated. - *------------------*/ - - Vgp = Vgp + epsm10 * 1.0e7 ; - - - afact = Cox * Cox / here->HSMHV2_cnst0 / here->HSMHV2_cnst0 ; - afact2 = afact / here->HSMHV2_nin / here->HSMHV2_nin * Ndepm2 ; - W_bsub0 = sqrt(2.0e0 * C_ESI / C_QE * here->HSMHV2_nsub / (here->HSMHV2_nsub - + here->HSMHV2_ndepm) / here->HSMHV2_ndepm * ( - Vbscl + Vbi_DEP)) ; - - if( W_bsub0 > model->HSMHV2_tndep ) { - - Vgp0 = 0.0; - - W_b0 = model->HSMHV2_tndep ; - phi_b0_DEP = 0.0 ; - phi_j0_DEP = phi_b0_DEP - C_2ESIpq_Ndepm_inv * W_b0 * W_b0 ; - phi_b0_DEP_lim = 0.0 ; - - Vgp0old = Vgp0 ; - phi_j0_DEP_old = phi_j0_DEP ; - - for ( lp_s0 = 1 ; lp_s0 <= lp_se_max + 1 ; lp_s0 ++ ) { - - W_b0 = sqrt(C_2ESIpq_Ndepm * (phi_b0_DEP - phi_j0_DEP) ) ; - Fn_SU_CP( W_b0 , W_b0 , model->HSMHV2_tndep , 1e-8, 2 , T0 ) - W_sub0 = sqrt(C_2ESIpq_Nsub * (phi_j0_DEP - Vbscl + Vbi_DEP) ) ; - - Q_b0_dep = W_b0 * q_Ndepm ; - Q_b0_dep_dPd = - C_ESI / W_b0 * T0 ; - Q_sub0_dep = - W_sub0 * q_Nsub ; - Q_sub0_dep_dPd = - C_ESI / W_sub0 ; - - y1 = Cox * (Vgp0 - phi_b0_DEP) + Q_b0_dep + Q_sub0_dep ; - y11 = Cox ; - y12 = Q_b0_dep_dPd + Q_sub0_dep_dPd ; - - y2 = phi_j0_DEP - NdepmpNsub_inv1 * (NdepmpNsub * phi_b0_DEP + Vbscl - Vbi_DEP) ; - y21 = 0.0 ; - y22 = 1.0 ; - - dety = y11 * y22 - y21 * y12; - rev11 = (y22) / dety ; - rev12 = ( - y12) / dety ; - rev21 = ( - y21) / dety ; - rev22 = (y11) / dety ; - - if( fabs( rev11 * y1 + rev12 * y2 ) > 0.5 ) { - Vgp0 = Vgp0 - 0.5 * Fn_Sgn( rev11 * y1 + rev12 * y2 ) ; - phi_j0_DEP = phi_j0_DEP - 0.5 * Fn_Sgn( rev21 * y1 + rev22 * y2 ) ; - } else { - Vgp0 = Vgp0 - ( rev11 * y1 + rev12 * y2 ) ; - phi_j0_DEP = phi_j0_DEP - ( rev21 * y1 + rev22 * y2 ) ; - } - - if( fabs(Vgp0 - Vgp0old) <= ps_conv && - fabs(phi_j0_DEP - phi_j0_DEP_old) <= ps_conv ) lp_s0=lp_se_max + 1 ; - - Vgp0old = Vgp0 ; - phi_j0_DEP_old = phi_j0_DEP ; - } - phi_j0_DEP_acc = phi_j0_DEP ; - - W_sub0 = model->HSMHV2_tndep * NdepmpNsub ; - phi_j0_DEP = C_2ESIpq_Nsub_inv * W_sub0 * W_sub0 + Vbscl - Vbi_DEP ; - phi_b0_DEP = phi_j0_DEP + C_2ESIpq_Ndepm_inv * Tn2 ; - phi_s0_DEP = phi_b0_DEP ; - Psbmax = phi_b0_DEP ; - Vgp1 = phi_b0_DEP ; - if( Vgp > Vgp0 ) { - depmode = 1 ; - } else if(Vgp > Vgp1 ) { - depmode = 3 ; - } else { - depmode = 2 ; - } - - } else { - Vgp0 = 0.0 ; - Vgp1 = Vgp0 ; - Psbmax = 0.0 ; - phi_b0_DEP_lim = Vgp0 ; - W_b0 = W_bsub0 ; - W_sub0 = W_b0 * NdepmpNsub ; - phi_j0_DEP = C_2ESIpq_Nsub_inv * W_sub0 * W_sub0 + Vbscl - Vbi_DEP ; - phi_b0_DEP = C_2ESIpq_Ndepm_inv * W_b0 * W_b0 + phi_j0_DEP ; - phi_j0_DEP_acc = phi_j0_DEP ; - if( Vgp > Vgp0 ) { - depmode = 1 ; - } else { - depmode = 2 ; - } - - } - - - T1 = C_2ESI_q_Ndepm * ( Psbmax - ( - here->HSMHV2_Pb2n + Vbscl)) ; - if ( T1 > 0.0 ) { - vthn = - here->HSMHV2_Pb2n + Vbscl - sqrt(T1) / Cox ; - } else { - vthn = - here->HSMHV2_Pb2n + Vbscl ; - } - - /* primary value */ - - if( Vgp > Vgp0 ) { - /* accumulation region */ - phi_j0_DEP = phi_j0_DEP_acc ; - phi_b0_DEP = 0.0 ; - phi_s0_DEP_ini = log(afact * Vgp * Vgp) / (beta + 2.0 / Vgp) + phi_b0_DEP ; - - if( phi_s0_DEP_ini < phi_b0_DEP_lim + ps_conv23 ) phi_s0_DEP_ini = phi_b0_DEP_lim + ps_conv23 ; - - } else if( Vgp > Vgp1 ) { - /* depletion region */ - - phi_s0_DEP_ini = phi_s0_DEP ; - - } else { - /* depletion and inversion region */ - - if( Vgp > vthn ) { - /* depletion */ - bfact = - 2.0 * afact * Vgp + beta ; - cfact = afact * Vgp * Vgp - beta * phi_b0_DEP ; - phi_b0_DEP_old = phi_b0_DEP ; - - phi_s0_DEP_ini = ( - bfact + sqrt(bfact * bfact - 4.0 * afact * cfact)) / 2.0 / afact ; - if( phi_s0_DEP_ini > Psbmax - ps_conv3 ) phi_s0_DEP_ini = Psbmax - ps_conv3 ; - - W_s0 = sqrt(C_2ESIpq_Ndepm * (phi_b0_DEP - phi_s0_DEP_ini) ) ; - W_b0 = sqrt(C_2ESIpq_Ndepm * (phi_b0_DEP - phi_j0_DEP) ) ; - - if( W_s0 + W_b0 > model->HSMHV2_tndep ) { - for ( lp_s0 = 1 ; lp_s0 <= lp_se_max + 1 ; lp_s0 ++ ) { - - y0 = W_s0 + W_b0 - model->HSMHV2_tndep ; - - dydPsm = C_ESI / q_Ndepm / W_s0 - + C_ESI / q_Ndepm * ( 1.0 - (here->HSMHV2_ndepm - / here->HSMHV2_nsub) / ( 1.0 + (NdepmpNsub))) / W_b0 ; - - if( fabs(y0 / dydPsm) > 0.5 ) { - phi_b0_DEP = phi_b0_DEP - 0.5 * Fn_Sgn(y0 / dydPsm) ; - } else { - phi_b0_DEP = phi_b0_DEP - y0 / dydPsm ; - } - - if( (phi_b0_DEP - Vbscl + Vbi_DEP) < epsm10 ) - phi_b0_DEP=Vbscl - Vbi_DEP + epsm10 ; - - cfact = afact * Vgp * Vgp - beta * phi_b0_DEP ; - T1 = bfact * bfact - 4.0 * afact * cfact ; - if( T1 > 0.0 ) { - phi_s0_DEP_ini = ( - bfact + sqrt(T1)) / 2.0 / afact ; - } else { - phi_s0_DEP_ini = ( - bfact) / 2.0 / afact ; - } - - if( phi_s0_DEP_ini > Psbmax ) phi_s0_DEP_ini = Psbmax ; - if( phi_s0_DEP_ini > phi_b0_DEP ) { - phi_s0_DEP_ini = phi_b0_DEP - ps_conv23 ; - lp_s0=lp_se_max + 1 ; - } - - W_s0 = sqrt(C_2ESIpq_Ndepm * (phi_b0_DEP - phi_s0_DEP_ini) ) ; - phi_j0_DEP = ( NdepmpNsub * phi_b0_DEP - + Vbscl - Vbi_DEP) / (1.0 + NdepmpNsub) ; - W_b0 = sqrt(C_2ESIpq_Ndepm * (phi_b0_DEP - phi_j0_DEP) ) ; - - if( fabs(phi_b0_DEP - phi_b0_DEP_old) <= 1.0e-8 ) lp_s0=lp_se_max + 1 ; - phi_b0_DEP_old = phi_b0_DEP ; - } - } - - } else { - afact3 = afact2 / exp(beta * Vbscl) ; - phi_b0_DEP_old = phi_b0_DEP ; - phi_s0_DEP_ini = log(afact3 * Vgp * Vgp) / ( - beta + 2.0 / Vgp) ; - W_s0 = sqrt(C_2ESIpq_Ndepm * (phi_b0_DEP - phi_s0_DEP_ini) ) ; - W_b0 = sqrt(C_2ESIpq_Ndepm * (phi_b0_DEP - phi_j0_DEP) ) ; - if( W_s0 + W_b0 > model->HSMHV2_tndep ) { - for ( lp_s0 = 1 ; lp_s0 <= lp_s0_max + 1 ; lp_s0 ++ ) { - - y0 = W_s0 + W_b0 - model->HSMHV2_tndep ; - dydPsm = C_ESI / q_Ndepm / W_s0 - + C_ESI / q_Ndepm * ( 1.0 - (here->HSMHV2_ndepm / - here->HSMHV2_nsub) / ( 1.0 + (NdepmpNsub))) / W_b0 ; - - if( fabs(y0 / dydPsm) > 0.5 ) { - phi_b0_DEP = phi_b0_DEP - 0.5 * Fn_Sgn(y0 / dydPsm) ; - } else { - phi_b0_DEP = phi_b0_DEP - y0 / dydPsm ; - } - if( (phi_b0_DEP - Vbscl + Vbi_DEP) < epsm10 ) - phi_b0_DEP=Vbscl - Vbi_DEP + epsm10 ; - - W_s0 = sqrt(C_2ESIpq_Ndepm * (phi_b0_DEP - phi_s0_DEP_ini) ) ; - phi_j0_DEP = ( NdepmpNsub * phi_b0_DEP - + Vbscl - Vbi_DEP) / (1.0 + NdepmpNsub) ; - W_b0 = sqrt(C_2ESIpq_Ndepm * (phi_b0_DEP - phi_j0_DEP) ) ; - - if( fabs(phi_b0_DEP - phi_b0_DEP_old) <= 1.0e-5 ) lp_s0=lp_s0_max + 1 ; - phi_b0_DEP_old = phi_b0_DEP ; - } - - } - } // end of phi_b0_DEP loop // - - } - phi_b0_DEP_ini = phi_b0_DEP ; - - /* */ - /* solve poisson at source side */ - /* */ - - sm_delta = 0.12 ; - - flg_conv = 0 ; - - phi_s0_DEP = phi_s0_DEP_ini ; - phi_b0_DEP = phi_b0_DEP_ini ; - - phi_s0_DEP_old = phi_s0_DEP ; - phi_b0_DEP_old = phi_b0_DEP ; - - for ( lp_s0 = 1 ; lp_s0 <= lp_se_max + 1 ; lp_s0 ++ ) { - - phi_j0_DEP = NdepmpNsub_inv1 * (NdepmpNsub * phi_b0_DEP + Vbscl - Vbi_DEP) ; - phi_j0_DEP_dPb = NdepmpNsub_inv1 * NdepmpNsub ; - - T1 = phi_b0_DEP - phi_j0_DEP ; - Fn_SL_CP( T2 , T1 , 0.0 , 0.1, 2 , T7 ) - W_b0 = sqrt(C_2ESIpq_Ndepm * (T2) ) ; - Fn_SU_CP( W_b0 , W_b0 , model->HSMHV2_tndep, 1e-8, 2 , T8 ) - W_sub0 = sqrt(C_2ESIpq_Nsub * (phi_j0_DEP - Vbscl + Vbi_DEP) ) ; - Q_b0_dep = W_b0 * q_Ndepm ; - Q_b0_dep_dPb = C_ESI / W_b0 * T7 * T8 ; - Q_b0_dep_dPd = - C_ESI / W_b0 * T7 * T8 ; - Q_sub0_dep = - W_sub0 * q_Nsub ; - Q_sub0_dep_dPd = - C_ESI / W_sub0 ; - - T10 = 8.0 * q_Ndepm_esi * Tn2 ; - phib_ref = (4.0 * phi_j0_DEP * phi_j0_DEP * C_ESI2 - 8.0 * phi_j0_DEP * C_ESI2 * phi_s0_DEP - + 4.0 * C_ESI2 * phi_s0_DEP * phi_s0_DEP - + 4.0 * phi_j0_DEP * q_Ndepm_esi * Tn2 - + 4.0 * phi_s0_DEP * q_Ndepm_esi * Tn2 - + Ndepm2 * C_QE2 * model->HSMHV2_tndep - * Tn2 * model->HSMHV2_tndep) / T10 ; - phib_ref_dPs = ( - 8.0 * phi_j0_DEP * C_ESI2 + 4.0 * C_ESI2 * phi_s0_DEP * 2.0 - + 4.0 * q_Ndepm_esi * Tn2) / T10 ; - phib_ref_dPd = (4.0 * phi_j0_DEP * C_ESI2 * 2.0 - 8.0 * C_ESI2 * phi_s0_DEP - + 4.0 * q_Ndepm_esi * Tn2) / T10 ; - - T1 = beta * (phi_s0_DEP - phi_b0_DEP) ; - T2 = exp(T1) ; - if( phi_s0_DEP >= phi_b0_DEP ) { - Q_s0 = - here->HSMHV2_cnst0 * sqrt(T2 - 1.0 - T1 + 1e-15) ; - Q_s0_dPs = 0.5 * here->HSMHV2_cnst0 * here->HSMHV2_cnst0 / Q_s0 * (beta * T2 - beta ) ; - Q_s0_dPb = - Q_s0_dPs ; - } else { - T3 = exp( - beta * (phi_s0_DEP - Vbscl)) ; - T4 = exp( - beta * (phi_b0_DEP - Vbscl)) ; - Q_s0 = here->HSMHV2_cnst0 * sqrt(T2 - 1.0 - T1 + 1e-15 + here->HSMHV2_cnst1 * (T3 - T4) ) ; - T5 = 0.5 * here->HSMHV2_cnst0 * here->HSMHV2_cnst0 / Q_s0 ; - Q_s0_dPs = T5 * (beta * T2 - beta + here->HSMHV2_cnst1 * ( - beta * T3) ) ; - Q_s0_dPb = T5 * ( - beta * T2 + beta + here->HSMHV2_cnst1 * beta * T4 ) ; - } - - Fn_SU_CP( T1 , phib_ref , phi_b0_DEP_lim , sm_delta, 4 , T9 ) - - y1 = phi_b0_DEP - T1 ; - y11 = - phib_ref_dPs * T9 ; - y12 = 1.0 - phib_ref_dPd * phi_j0_DEP_dPb * T9 ; - - y2 = Cox * (Vgp - phi_s0_DEP) + Q_s0 + Q_b0_dep + Q_sub0_dep ; - y21 = - Cox + Q_s0_dPs ; - y22 = Q_s0_dPb + Q_b0_dep_dPb + Q_b0_dep_dPd * phi_j0_DEP_dPb + Q_sub0_dep_dPd * phi_j0_DEP_dPb ; - - dety = y11 * y22 - y21 * y12; - rev11 = (y22) / dety ; - rev12 = ( - y12) / dety ; - rev21 = ( - y21) / dety ; - rev22 = (y11) / dety ; - if( fabs( rev21 * y1 + rev22 * y2 ) > 0.5 ) { - phi_s0_DEP = phi_s0_DEP - 0.5 * Fn_Sgn( rev11 * y1 + rev12 * y2 ) ; - phi_b0_DEP = phi_b0_DEP - 0.5 * Fn_Sgn( rev21 * y1 + rev22 * y2 ) ; - } else { - phi_s0_DEP = phi_s0_DEP - ( rev11 * y1 + rev12 * y2 ) ; - phi_b0_DEP = phi_b0_DEP - ( rev21 * y1 + rev22 * y2 ) ; - } - - if( fabs(phi_s0_DEP - phi_s0_DEP_old) <= ps_conv && fabs(phi_b0_DEP - phi_b0_DEP_old) <= ps_conv ) { - lp_s0=lp_se_max + 1 ; - flg_conv = 1 ; - } - - phi_s0_DEP_old = phi_s0_DEP ; - phi_b0_DEP_old = phi_b0_DEP ; - - } - - if( flg_conv == 0 ) { - printf( "*** warning(HiSIM_HV(%s)): Went Over Iteration Maximum(Ps0)\n",model->HSMHV2modName ) ; - printf( " Vbse = %7.3f Vdse = %7.3f Vgse = %7.3f\n" ,Vbse , Vdse , Vgse ) ; - } - - /* caluculate derivative */ - - y1_dVgs = 0.0 ; - y1_dVds = 0.0 ; - y1_dVbs = - (8.0 * phi_j0_DEP * C_ESI2 - 8.0 * C_ESI2 * phi_s0_DEP - + 4.0 * q_Ndepm_esi * Tn2) / T10 - * T9 * NdepmpNsub_inv1 * Vbscl_dVbs ; - y1_dT = - (8.0 * phi_j0_DEP * C_ESI2 - 8.0 * C_ESI2 * phi_s0_DEP - + 4.0 * q_Ndepm_esi * Tn2) / T10 - * T9 * NdepmpNsub_inv1 * (Vbscl_dT - Vbipn_dT) ; - - Q_b0_dep_dVbs = - C_ESI / W_b0 * T7 * T8 * NdepmpNsub_inv1 * Vbscl_dVbs ; - Q_b0_dep_dT = - C_ESI / W_b0 * T7 * T8 * NdepmpNsub_inv1 * (Vbscl_dT - Vbipn_dT) ; - - Q_sub0_dep_dVbs = - C_ESI / W_sub0 * (NdepmpNsub_inv1 * Vbscl_dVbs - Vbscl_dVbs) ; - Q_sub0_dep_dT = - C_ESI / W_sub0 * (NdepmpNsub_inv1 * (Vbscl_dT - Vbipn_dT) - Vbscl_dT + Vbipn_dT) ; - - T1 = beta * (phi_s0_DEP - phi_b0_DEP) ; - T2 = exp(T1) ; - if( phi_s0_DEP >= phi_b0_DEP ) { - Q_s0_dVbs = 0.0 ; - Q_s0_dT = - cnst0_dT * sqrt(T2 - 1.0 - T1 + 1e-15) - - here->HSMHV2_cnst0 / 2.0 / sqrt(T2 - 1.0 - T1 + 1e-15) * ((phi_s0_DEP - phi_b0_DEP) * T2 * beta_dT - - (phi_s0_DEP - phi_b0_DEP) * beta_dT) ; - } else { - T3 = exp( - beta * (phi_s0_DEP - Vbscl)) ; - T4 = exp( - beta * (phi_b0_DEP - Vbscl)) ; - T5 = sqrt(T2 - 1.0 - T1 + 1e-15 + here->HSMHV2_cnst1 * (T3 - T4)) ; - Q_s0_dVbs = here->HSMHV2_cnst0 / 2.0 / T5 * - (here->HSMHV2_cnst1 * (beta * T3 * Vbscl_dVbs - beta * T4 * Vbscl_dVbs) ) ; - Q_s0_dT = cnst0_dT * T5 - + here->HSMHV2_cnst0 / 2.0 / T5 * - ((phi_s0_DEP - phi_b0_DEP) * T2 * beta_dT - (phi_s0_DEP - phi_b0_DEP) * beta_dT - + cnst1_dT * (T3 - T4) - + here->HSMHV2_cnst1 * ( - (phi_s0_DEP - Vbscl) * T3 * beta_dT + beta * T3 * Vbscl_dT - + (phi_b0_DEP - Vbscl) * T4 * beta_dT - beta * T4 * Vbscl_dT) ) ; - } - - y2_dVgs = Cox_dVg * (Vgp - phi_s0_DEP) + Cox * Vgp_dVgs ; - y2_dVds = Cox_dVd * (Vgp - phi_s0_DEP) + Cox * Vgp_dVds ; - y2_dVbs = Cox_dVb * (Vgp - phi_s0_DEP) + Cox * Vgp_dVbs + Q_s0_dVbs + Q_b0_dep_dVbs + Q_sub0_dep_dVbs ; - y2_dT = Cox_dT * (Vgp - phi_s0_DEP) + Cox * Vgp_dT + Q_s0_dT + Q_b0_dep_dT + Q_sub0_dep_dT ; - - phi_s0_DEP_dVgs = - ( rev11 * y1_dVgs + rev12 * y2_dVgs ) ; - phi_s0_DEP_dVds = - ( rev11 * y1_dVds + rev12 * y2_dVds ) ; - phi_s0_DEP_dVbs = - ( rev11 * y1_dVbs + rev12 * y2_dVbs ) ; - phi_s0_DEP_dT = - ( rev11 * y1_dT + rev12 * y2_dT ) ; - - phi_b0_DEP_dVgs = - ( rev21 * y1_dVgs + rev22 * y2_dVgs ) ; - phi_b0_DEP_dVds = - ( rev21 * y1_dVds + rev22 * y2_dVds ) ; - phi_b0_DEP_dVbs = - ( rev21 * y1_dVbs + rev22 * y2_dVbs ) ; - phi_b0_DEP_dT = - ( rev21 * y1_dT + rev22 * y2_dT ) ; - - if( W_bsub0 > model->HSMHV2_tndep && depmode !=2 ) { - Fn_SU_CP2(phi_b0_DEP , phi_b0_DEP , phi_s0_DEP , 0.02, 2 , T1, T2 ) - phi_b0_DEP_dVgs = phi_b0_DEP_dVgs * T1 + phi_s0_DEP_dVgs * T2 ; - phi_b0_DEP_dVds = phi_b0_DEP_dVds * T1 + phi_s0_DEP_dVds * T2 ; - phi_b0_DEP_dVbs = phi_b0_DEP_dVbs * T1 + phi_s0_DEP_dVbs * T2 ; - phi_b0_DEP_dT = phi_b0_DEP_dT * T1 + phi_s0_DEP_dT * T2 ; - } - - phi_j0_DEP = NdepmpNsub_inv1 * (NdepmpNsub * phi_b0_DEP + Vbscl - Vbi_DEP) ; - phi_j0_DEP_dVgs = NdepmpNsub_inv1 * NdepmpNsub * phi_b0_DEP_dVgs ; - phi_j0_DEP_dVds = NdepmpNsub_inv1 * NdepmpNsub * phi_b0_DEP_dVds ; - phi_j0_DEP_dVbs = NdepmpNsub_inv1 * NdepmpNsub * phi_b0_DEP_dVbs + NdepmpNsub_inv1 * Vbscl_dVbs ; - phi_j0_DEP_dT = NdepmpNsub_inv1 * NdepmpNsub * phi_b0_DEP_dT - + NdepmpNsub_inv1 * (Vbscl_dT - Vbipn_dT) ; - - phib_ref = (4.0 * phi_j0_DEP * phi_j0_DEP * C_ESI2 - 8.0 * phi_j0_DEP * C_ESI2 * phi_s0_DEP - + 4.0 * C_ESI2 * phi_s0_DEP * phi_s0_DEP - + 4.0 * phi_j0_DEP * q_Ndepm_esi * Tn2 - + 4.0 * phi_s0_DEP * q_Ndepm_esi * Tn2 - + Ndepm2 * C_QE2 * model->HSMHV2_tndep - * Tn2 * model->HSMHV2_tndep) / T10 ; - - phib_ref_dVgs = ( 8.0 * phi_j0_DEP * phi_j0_DEP_dVgs * C_ESI2 - 8.0 * phi_j0_DEP_dVgs * C_ESI2 * phi_s0_DEP - - 8.0 * phi_j0_DEP * C_ESI2 * phi_s0_DEP_dVgs + 8.0 * C_ESI2 * phi_s0_DEP * phi_s0_DEP_dVgs - + 4.0 * phi_j0_DEP_dVgs * q_Ndepm_esi * Tn2 - + 4.0 * phi_s0_DEP_dVgs * q_Ndepm_esi * Tn2 ) / T10 ; - phib_ref_dVds = ( 8.0 * phi_j0_DEP * phi_j0_DEP_dVds * C_ESI2 - 8.0 * phi_j0_DEP_dVds * C_ESI2 * phi_s0_DEP - - 8.0 * phi_j0_DEP * C_ESI2 * phi_s0_DEP_dVds + 8.0 * C_ESI2 * phi_s0_DEP * phi_s0_DEP_dVds - + 4.0 * phi_j0_DEP_dVds * q_Ndepm_esi * Tn2 - + 4.0 * phi_s0_DEP_dVds * q_Ndepm_esi * Tn2 ) / T10 ; - phib_ref_dVbs = ( 8.0 * phi_j0_DEP * phi_j0_DEP_dVbs * C_ESI2 - 8.0 * phi_j0_DEP_dVbs * C_ESI2 * phi_s0_DEP - - 8.0 * phi_j0_DEP * C_ESI2 * phi_s0_DEP_dVbs + 8.0 * C_ESI2 * phi_s0_DEP * phi_s0_DEP_dVbs - + 4.0 * phi_j0_DEP_dVbs * q_Ndepm_esi * Tn2 - + 4.0 * phi_s0_DEP_dVbs * q_Ndepm_esi * Tn2 ) / T10 ; - phib_ref_dT = ( 8.0 * phi_j0_DEP * phi_j0_DEP_dT * C_ESI2 - 8.0 * phi_j0_DEP_dT * C_ESI2 * phi_s0_DEP - - 8.0 * phi_j0_DEP * C_ESI2 * phi_s0_DEP_dT + 8.0 * C_ESI2 * phi_s0_DEP * phi_s0_DEP_dT - + 4.0 * phi_j0_DEP_dT * q_Ndepm_esi * Tn2 - + 4.0 * phi_s0_DEP_dT * q_Ndepm_esi * Tn2 ) / T10 ; - - T1 = beta * (phi_s0_DEP - phi_b0_DEP) ; - T1_dVgs = beta * (phi_s0_DEP_dVgs - phi_b0_DEP_dVgs) ; - T1_dVds = beta * (phi_s0_DEP_dVds - phi_b0_DEP_dVds) ; - T1_dVbs = beta * (phi_s0_DEP_dVbs - phi_b0_DEP_dVbs) ; - T1_dT = beta * (phi_s0_DEP_dT - phi_b0_DEP_dT) + beta_dT * (phi_s0_DEP - phi_b0_DEP) ; - - T2 = exp(T1) ; - T2_dVgs = T1_dVgs * T2 ; - T2_dVds = T1_dVds * T2 ; - T2_dVbs = T1_dVbs * T2 ; - T2_dT = T1_dT * T2 ; - - if( phi_s0_DEP >= phi_b0_DEP ) { - - T3 = sqrt(T2 - 1.0e0 - T1 + 1e-15 ) ; - T3_dVgs = (T2_dVgs - T1_dVgs) / 2.0 / T3 ; - T3_dVds = (T2_dVds - T1_dVds) / 2.0 / T3 ; - T3_dVbs = (T2_dVbs - T1_dVbs) / 2.0 / T3 ; - T3_dT = (T2_dT - T1_dT) / 2.0 / T3 ; - - Q_s0 = - here->HSMHV2_cnst0 * T3 ; - - Q_s0_dep = 0.0 ; - Q_sub0 = 0.0 ; -/// Qg = Cox * (Vgp - phi_s0_DEP) ; - - W_b0 = sqrt(C_2ESIpq_Ndepm * (phi_b0_DEP - phi_j0_DEP) ) ; - Fn_SU_CP( T9 , W_b0 , model->HSMHV2_tndep, 1e-8, 2 , T4 ) - - W_sub0 = sqrt(C_2ESIpq_Nsub * (phi_j0_DEP - Vbscl + Vbi_DEP) ) ; - Q_b0_dep = T9 * q_Ndepm ; - Q_sub0_dep = - W_sub0 * q_Nsub ; - - /* derivative */ - Q_s0_dVgs = - here->HSMHV2_cnst0 * T3_dVgs ; - Q_s0_dVds = - here->HSMHV2_cnst0 * T3_dVds ; - Q_s0_dVbs = - here->HSMHV2_cnst0 * T3_dVbs ; - Q_s0_dT = - cnst0_dT * T3 - - here->HSMHV2_cnst0 * T3_dT ; - - Q_n0 = Q_s0 ; - Q_n0_dVgs = Q_s0_dVgs ; - Q_n0_dVds = Q_s0_dVds ; - Q_n0_dVbs = Q_s0_dVbs ; - Q_n0_dT = Q_s0_dT ; - - Q_b0_dep_dVgs = C_ESI / W_b0 * (phi_b0_DEP_dVgs - phi_j0_DEP_dVgs) * T4 ; - Q_b0_dep_dVds = C_ESI / W_b0 * (phi_b0_DEP_dVds - phi_j0_DEP_dVds) * T4 ; - Q_b0_dep_dVbs = C_ESI / W_b0 * (phi_b0_DEP_dVbs - phi_j0_DEP_dVbs) * T4 ; - Q_b0_dep_dT = C_ESI / W_b0 * (phi_b0_DEP_dT - phi_j0_DEP_dT) * T4 ; - - Q_sub0_dep_dVgs = - C_ESI / W_sub0 * phi_j0_DEP_dVgs ; - Q_sub0_dep_dVds = - C_ESI / W_sub0 * phi_j0_DEP_dVds ; - Q_sub0_dep_dVbs = - C_ESI / W_sub0 * (phi_j0_DEP_dVbs - Vbscl_dVbs) ; - Q_sub0_dep_dT = - C_ESI / W_sub0 * (phi_j0_DEP_dT - Vbscl_dT + Vbipn_dT) ; - - Q_sub0_dVgs = 0.0 ; - Q_sub0_dVds = 0.0 ; - Q_sub0_dVbs = 0.0 ; - Q_sub0_dT = 0.0 ; - - Q_s0_dep_dVgs = 0.0 ; - Q_s0_dep_dVds = 0.0 ; - Q_s0_dep_dVbs = 0.0 ; - Q_s0_dep_dT = 0.0 ; - - } else { - - T3 = exp( - beta * (phi_s0_DEP - Vbscl)) ; - T4 = exp( - beta * (phi_b0_DEP - Vbscl)) ; - T5 = sqrt(T2 - 1.0 - T1 + here->HSMHV2_cnst1 * (T3 - T4) + 1e-15) ; - Q_s0 = here->HSMHV2_cnst0 * T5 ; - - T3_dVgs = - beta * T3 * phi_s0_DEP_dVgs ; - T3_dVds = - beta * T3 * phi_s0_DEP_dVds ; - T3_dVbs = - beta * T3 * (phi_s0_DEP_dVbs - Vbscl_dVbs) ; - T3_dT = - beta * T3 * (phi_s0_DEP_dT - Vbscl_dT) - (phi_s0_DEP - Vbscl) * T3 * beta_dT ; - - T4_dVgs = - beta * T4 * phi_b0_DEP_dVgs ; - T4_dVds = - beta * T4 * phi_b0_DEP_dVds ; - T4_dVbs = - beta * T4 * (phi_b0_DEP_dVbs - Vbscl_dVbs) ; - T4_dT = - beta * T4 * (phi_b0_DEP_dT - Vbscl_dT) - (phi_b0_DEP - Vbscl) * T4 * beta_dT ; - - T5_dVgs = (T2_dVgs - T1_dVgs + here->HSMHV2_cnst1 * (T3_dVgs - T4_dVgs)) / 2.0 / T5 ; - T5_dVds = (T2_dVds - T1_dVds + here->HSMHV2_cnst1 * (T3_dVds - T4_dVds)) / 2.0 / T5 ; - T5_dVbs = (T2_dVbs - T1_dVbs + here->HSMHV2_cnst1 * (T3_dVbs - T4_dVbs)) / 2.0 / T5 ; - T5_dT = (T2_dT - T1_dT + here->HSMHV2_cnst1 * (T3_dT - T4_dT) + cnst1_dT * (T3 - T4)) / 2.0 / T5 ; - - Q_s0_dVgs = here->HSMHV2_cnst0 * T5_dVgs ; - Q_s0_dVds = here->HSMHV2_cnst0 * T5_dVds ; - Q_s0_dVbs = here->HSMHV2_cnst0 * T5_dVbs ; - Q_s0_dT = here->HSMHV2_cnst0 * T5_dT + cnst0_dT * T5 ; - - if( W_bsub0 > model->HSMHV2_tndep && depmode !=2 ) { - Q_sub0 = 0.0 ; - Q_s0_dep = 0.0 ; - - Q_sub0_dVgs = 0.0 ; - Q_sub0_dVds = 0.0 ; - Q_sub0_dVbs = 0.0 ; - Q_sub0_dT = 0.0 ; - - Q_s0_dep_dVgs = 0.0 ; - Q_s0_dep_dVds = 0.0 ; - Q_s0_dep_dVbs = 0.0 ; - Q_s0_dep_dT = 0.0 ; - } else { - T3 = exp( - beta * (phi_s0_DEP - Vbscl)) ; - T4 = exp( - beta * (phi_b0_DEP - Vbscl)) ; - T5 = sqrt( - T1 + here->HSMHV2_cnst1 * (T3 - T4)) ; - Q_sub0 = here->HSMHV2_cnst0 * T5 - here->HSMHV2_cnst0 * sqrt( - T1) ; - T6 = sqrt(T2 - 1.0e0 - T1 + 1e-15) ; - Q_s0_dep = here->HSMHV2_cnst0 * T6 ; - - Q_sub0_dVgs = here->HSMHV2_cnst0 / 2.0 / T5 * ( - beta * (phi_s0_DEP_dVgs - phi_b0_DEP_dVgs) - + here->HSMHV2_cnst1 * ( - beta * T3 * phi_s0_DEP_dVgs + beta * T4 * phi_b0_DEP_dVgs)) - - here->HSMHV2_cnst0 / 2.0 / sqrt( - T1) * ( - beta * (phi_s0_DEP_dVgs - phi_b0_DEP_dVgs)) ; - Q_sub0_dVds = here->HSMHV2_cnst0 / 2.0 / T5 * ( - beta * (phi_s0_DEP_dVds - phi_b0_DEP_dVds) - + here->HSMHV2_cnst1 * ( - beta * T3 * phi_s0_DEP_dVds + beta * T4 * phi_b0_DEP_dVds)) - - here->HSMHV2_cnst0 / 2.0 / sqrt( - T1) * ( - beta * (phi_s0_DEP_dVds - phi_b0_DEP_dVds)) ; - Q_sub0_dVbs = here->HSMHV2_cnst0 / 2.0 / T5 * ( - beta * (phi_s0_DEP_dVbs - phi_b0_DEP_dVbs) - + here->HSMHV2_cnst1 * ( - beta * T3 * (phi_s0_DEP_dVbs - Vbscl_dVbs) + beta * T4 * (phi_b0_DEP_dVbs - Vbscl_dVbs))) - - here->HSMHV2_cnst0 / 2.0 / sqrt( - T1) * ( - beta * (phi_s0_DEP_dVbs - phi_b0_DEP_dVbs)) ; - Q_sub0_dT = cnst0_dT * T5 - cnst0_dT * sqrt( - T1) - + here->HSMHV2_cnst0 / 2.0 / T5 * ( - beta * (phi_s0_DEP_dT - phi_b0_DEP_dT) - beta_dT * (phi_s0_DEP - phi_b0_DEP) - + cnst1_dT * (T3 - T4) - + here->HSMHV2_cnst1 * ( - beta * T3 * (phi_s0_DEP_dT - Vbscl_dT) - beta_dT * (phi_s0_DEP - Vbscl) * T3 - + beta * T4 * (phi_b0_DEP_dT - Vbscl_dT) + beta_dT * (phi_b0_DEP - Vbscl) * T4)) - - here->HSMHV2_cnst0 / 2.0 / sqrt( - T1) * ( - beta * (phi_s0_DEP_dT - phi_b0_DEP_dT) - beta_dT * (phi_s0_DEP - phi_b0_DEP)) ; - - Q_s0_dep_dVgs = here->HSMHV2_cnst0 / 2.0 / T6 * beta * (phi_s0_DEP_dVgs - phi_b0_DEP_dVgs) * (T2 - 1) ; - Q_s0_dep_dVds = here->HSMHV2_cnst0 / 2.0 / T6 * beta * (phi_s0_DEP_dVds - phi_b0_DEP_dVds) * (T2 - 1) ; - Q_s0_dep_dVbs = here->HSMHV2_cnst0 / 2.0 / T6 * beta * (phi_s0_DEP_dVbs - phi_b0_DEP_dVbs) * (T2 - 1) ; - Q_s0_dep_dT = cnst0_dT * T6 - + here->HSMHV2_cnst0 / 2.0 / T6 * - (beta * (phi_s0_DEP_dT - phi_b0_DEP_dT) * (T2 - 1) + beta_dT * (phi_s0_DEP - phi_b0_DEP) * (T2 - 1)) ; - - } - - Q_n0 = 0.0 ; - Q_n0_dVgs = 0.0 ; - Q_n0_dVds = 0.0 ; - Q_n0_dVbs = 0.0 ; - Q_n0_dT = 0.0 ; - -/// Qg = Cox * (Vgp - phi_s0_DEP) ; - - T1 = phi_b0_DEP - phi_j0_DEP ; - Fn_SL_CP( T2 , T1 , 0.0 , 0.1, 2 , T0 ) - W_b0 = sqrt(C_2ESIpq_Ndepm * (T2) ) ; - Fn_SU_CP( T9 , W_b0 , model->HSMHV2_tndep, 1e-8, 2 , T3 ) - W_sub0 = sqrt(C_2ESIpq_Nsub * (phi_j0_DEP - Vbscl + Vbi_DEP) ) ; - Q_b0_dep = T9 * q_Ndepm ; - Q_sub0_dep = - W_sub0 * q_Nsub ; - - Q_b0_dep_dVgs = C_ESI / W_b0 * (phi_b0_DEP_dVgs - phi_j0_DEP_dVgs) * T0 * T3 ; - Q_b0_dep_dVds = C_ESI / W_b0 * (phi_b0_DEP_dVds - phi_j0_DEP_dVds) * T0 * T3 ; - Q_b0_dep_dVbs = C_ESI / W_b0 * (phi_b0_DEP_dVbs - phi_j0_DEP_dVbs) * T0 * T3 ; - Q_b0_dep_dT = C_ESI / W_b0 * (phi_b0_DEP_dT - phi_j0_DEP_dT) * T0 * T3 ; - - Q_sub0_dep_dVgs = - C_ESI / W_sub0 * phi_j0_DEP_dVgs ; - Q_sub0_dep_dVds = - C_ESI / W_sub0 * phi_j0_DEP_dVds ; - Q_sub0_dep_dVbs = - C_ESI / W_sub0 * (phi_j0_DEP_dVbs - Vbscl_dVbs) ; - Q_sub0_dep_dT = - C_ESI / W_sub0 * (phi_j0_DEP_dT - Vbscl_dT + Vbipn_dT) ; - - } - - T1 = phi_b0_DEP - phi_j0_DEP ; - Fn_SL_CP( T2 , T1 , 0.0 , 0.1, 2 , T0 ) - W_b0 = sqrt(C_2ESIpq_Ndepm * (T2) ) ; - Fn_SU_CP( T9, W_b0, model->HSMHV2_tndep, 1e-8, 2 , T3 ) - W_b0_dVgs = C_ESI / q_Ndepm / W_b0 * (phi_b0_DEP_dVgs - phi_j0_DEP_dVgs) * T0 * T3 ; - W_b0_dVds = C_ESI / q_Ndepm / W_b0 * (phi_b0_DEP_dVds - phi_j0_DEP_dVds) * T0 * T3 ; - W_b0_dVbs = C_ESI / q_Ndepm / W_b0 * (phi_b0_DEP_dVbs - phi_j0_DEP_dVbs) * T0 * T3 ; - W_b0_dT = C_ESI / q_Ndepm / W_b0 * (phi_b0_DEP_dT - phi_j0_DEP_dT) * T0 * T3 ; - - T1 = phi_b0_DEP - phi_s0_DEP ; - Fn_SL_CP( T2 , T1 , 0.0 , 0.05, 2 , T0 ) - W_s0 = sqrt(C_2ESIpq_Ndepm * (T2) ) ; - - W_s0_dVgs = C_ESI / q_Ndepm / W_s0 * (phi_b0_DEP_dVgs - phi_s0_DEP_dVgs) * T0 ; - W_s0_dVds = C_ESI / q_Ndepm / W_s0 * (phi_b0_DEP_dVds - phi_s0_DEP_dVds) * T0 ; - W_s0_dVbs = C_ESI / q_Ndepm / W_s0 * (phi_b0_DEP_dVbs - phi_s0_DEP_dVbs) * T0 ; - W_s0_dT = C_ESI / q_Ndepm / W_s0 * (phi_b0_DEP_dT - phi_s0_DEP_dT) * T0 ; - - T1 = model->HSMHV2_tndep - T9 - W_s0 ; - Fn_SL_CP( W_res0 , T1 , 1.0e-25 , 1.0e-18, 2 , T0 ) - - Qn_res0 = - W_res0 * q_Ndepm ; - Qn_res0_dVgs = (W_s0_dVgs + W_b0_dVgs) * q_Ndepm * T0 ; - Qn_res0_dVds = (W_s0_dVds + W_b0_dVds) * q_Ndepm * T0 ; - Qn_res0_dVbs = (W_s0_dVbs + W_b0_dVbs) * q_Ndepm * T0 ; - Qn_res0_dT = (W_s0_dT + W_b0_dT) * q_Ndepm * T0 ; - - if( W_bsub0 > model->HSMHV2_tndep && depmode !=2 ) { - Fn_SU_CP(T3 , phi_s0_DEP , phi_b0_DEP_lim , 0.8, 2 , T1 ) - T3_dVgs = phi_s0_DEP_dVgs * T1 ; - T3_dVds = phi_s0_DEP_dVds * T1 ; - T3_dVbs = phi_s0_DEP_dVbs * T1 ; - T3_dT = phi_s0_DEP_dT * T1 ; - } else { - Fn_SU_CP(T3 , phib_ref , phi_b0_DEP_lim , 0.8, 2 , T0 ) - T3_dVgs = phib_ref_dVgs * T0 ; - T3_dVds = phib_ref_dVds * T0 ; - T3_dVbs = phib_ref_dVbs * T0 ; - T3_dT = phib_ref_dT * T0 ; - } - - T4 = exp(beta * (T3 - phi_b0_DEP_lim)) ; - T5 = - C_QE * here->HSMHV2_ndepm ; - Qn_bac0 = T5 * T4 * T9 ; - Qn_bac0_dVgs = T5 * (beta * T4 * T3_dVgs * T9 + T4 * W_b0_dVgs) ; - Qn_bac0_dVds = T5 * (beta * T4 * T3_dVds * T9 + T4 * W_b0_dVds) ; - Qn_bac0_dVbs = T5 * (beta * T4 * T3_dVbs * T9 + T4 * W_b0_dVbs) ; - Qn_bac0_dT = T5 * ((beta * T4 * T3_dT + beta_dT * (T3 - phi_b0_DEP_lim) * T4) * T9 - + T4 * W_b0_dT) ; - - - T1 = phi_s0_DEP - phi_b0_DEP_lim ; - Fn_SL_CP( T2 , T1 , 0.0, Ps_delta, 2 , T0 ) - T2_dVgs = phi_s0_DEP_dVgs * T0 ; - T2_dVds = phi_s0_DEP_dVds * T0 ; - T2_dVbs = phi_s0_DEP_dVbs * T0 ; - T2_dT = phi_s0_DEP_dT * T0 ; - - T3 = exp(beta * (T2)) ; - T3_dVgs = beta * T3 * T2_dVgs ; - T3_dVds = beta * T3 * T2_dVds ; - T3_dVbs = beta * T3 * T2_dVbs ; - T3_dT = beta * T3 * T2_dT + T2 * T3 * beta_dT ; - - T4 = T3 - 1.0 - beta * T2 ; - - T4_dVgs = T3_dVgs - beta * T2_dVgs ; - T4_dVds = T3_dVds - beta * T2_dVds ; - T4_dVbs = T3_dVbs - beta * T2_dVbs ; - T4_dT = T3_dT - beta * T2_dT - beta_dT * T2 ; - - T5 = sqrt(T4) ; - Q_n0_cur = - here->HSMHV2_cnst0 * T5 ; - Q_n0_cur_dVgs = - here->HSMHV2_cnst0 / 2.0 / T5 * T4_dVgs ; - Q_n0_cur_dVds = - here->HSMHV2_cnst0 / 2.0 / T5 * T4_dVds ; - Q_n0_cur_dVbs = - here->HSMHV2_cnst0 / 2.0 / T5 * T4_dVbs ; - Q_n0_cur_dT = - here->HSMHV2_cnst0 / 2.0 / T5 * T4_dT - - cnst0_dT * T5 ; - - T4 = exp(beta * Ps_delta0) - 1.0 - beta * Ps_delta0 ; - T4_dT = Ps_delta0 * exp(beta * Ps_delta0) * beta_dT - beta_dT * Ps_delta0 ; - T5 = sqrt(T4) ; - T5_dT = 0.5 / T5 * T4_dT ; - Qn_delta = here->HSMHV2_cnst0 * T5 ; - - Qn_delta_dT = cnst0_dT * T5 + here->HSMHV2_cnst0 * T5_dT ; - - - /*-----------------------------------------------------------* - * Start point of phi_sL_DEP(= phi_s0_DEP + Pds) calculation.(label) - *-----------------*/ - - /* Vdseff (begin) */ - Vdsorg = Vds ; - - if( Vds > 1e-3 ) { - - here->HSMHV2_qnsub_esi = q_Ndepm_esi ; - T2 = here->HSMHV2_qnsub_esi / ( Cox * Cox ) ; - T4 = - 2.0e0 * T2 / Cox ; - T2_dVb = T4 * Cox_dVb ; - T2_dVd = T4 * Cox_dVd ; - T2_dVg = T4 * Cox_dVg ; - T2_dT = T4 * Cox_dT ; - - T0 = Vgp + 2.0 - beta_inv - Vbsz ; - T0_dVg = Vgp_dVgs ; - T0_dVd = Vgp_dVds - Vbsz_dVds ; - T0_dVb = Vgp_dVbs - Vbsz_dVbs ; - T0_dT = Vgp_dT - beta_inv_dT - Vbsz_dT ; - - T4 = 1.0e0 + 2.0e0 / T2 * T0 ; - T4_dVg = 2.0 / T2 * T0_dVg - 2.0 / T2 / T2 * T0 * T2_dVg ; - T4_dVd = 2.0 / T2 * T0_dVd - 2.0 / T2 / T2 * T0 * T2_dVd ; - T4_dVb = 2.0 / T2 * T0_dVb - 2.0 / T2 / T2 * T0 * T2_dVb ; - T4_dT = 2.0 / T2 * T0_dT - 2.0 / T2 / T2 * T0 * T2_dT ; - - Fn_SL_CP( T9 , T4 , 0 , DEPQFN_dlt, 2 , T0 ) - T9_dVg = T4_dVg * T0 ; - T9_dVd = T4_dVd * T0 ; - T9_dVb = T4_dVb * T0 ; - T9_dT = T4_dT * T0 ; - - T9 +=small ; - T3 = sqrt( T9 ) ; - T3_dVg = 0.5 / T3 * T9_dVg ; - T3_dVd = 0.5 / T3 * T9_dVd ; - T3_dVb = 0.5 / T3 * T9_dVb ; - T3_dT = 0.5 / T3 * T9_dT ; - - T10 = Vgp + 2.0 + T2 * ( 1.0e0 - T3 ) ; - T10_dVb = Vgp_dVbs + T2_dVb * ( 1.0e0 - T3 ) - T2 * T3_dVb ; - T10_dVd = Vgp_dVds + T2_dVd * ( 1.0e0 - T3 ) - T2 * T3_dVd ; - T10_dVg = Vgp_dVgs + T2_dVg * ( 1.0e0 - T3 ) - T2 * T3_dVg ; - T10_dT = Vgp_dT + T2_dT * ( 1.0e0 - T3 ) - T2 * T3_dT ; - - Fn_SL_CP( T10 , T10 , DEPQFN3, 0.2, 4 , T0 ) - T10 = T10 + epsm10 ; - T10_dVb *=T0 ; - T10_dVd *=T0 ; - T10_dVg *=T0 ; - T10_dT *= T0 ; - - T1 = Vds / T10 ; - T2 = Fn_Pow( T1 , here->HSMHV2_ddlt - 1.0e0 ) ; - T7 = T2 * T1 ; - T0 = here->HSMHV2_ddlt * T2 / ( T10 * T10 ) ; - T7_dVb = T0 * ( - Vds * T10_dVb ) ; - T7_dVd = T0 * ( T10 - Vds * T10_dVd ) ; - T7_dVg = T0 * ( - Vds * T10_dVg ) ; - T7_dT = T0 * ( - Vds * T10_dT ) ; - - T3 = 1.0 + T7 ; - T4 = Fn_Pow( T3 , 1.0 / here->HSMHV2_ddlt - 1.0 ) ; - T6 = T4 * T3 ; - T0 = T4 / here->HSMHV2_ddlt ; - T6_dVb = T0 * T7_dVb ; - T6_dVd = T0 * T7_dVd ; - T6_dVg = T0 * T7_dVg ; - T6_dT = T0 * T7_dT ; - - Vdseff = Vds / T6 ; - T0 = 1.0 / ( T6 * T6 ) ; - Vdseff0_dVbs = - Vds * T6_dVb * T0 ; - Vdseff0_dVds = ( T6 - Vds * T6_dVd ) * T0 ; - Vdseff0_dVgs = - Vds * T6_dVg * T0 ; - Vdseff0_dT = - Vds * T6_dT * T0 ; - - Fn_SL_CP( Vgpp , Vgp , 0.0 , 0.5, 2 , T0 ) - Vgpp_dVgs = T0 * Vgp_dVgs ; - Vgpp_dVds = T0 * Vgp_dVds ; - Vgpp_dVbs = T0 * Vgp_dVbs ; - Vgpp_dT = T0 * Vgp_dT ; - - T1 = Vgpp * 0.8 ; - T1_dVg = Vgpp_dVgs * 0.8 ; - T1_dVd = Vgpp_dVds * 0.8 ; - T1_dVb = Vgpp_dVbs * 0.8 ; - T1_dT = Vgpp_dT * 0.8 ; - - Fn_SU_CP3( Vds , Vdseff , Vgpp , T1, 2 , T3, T4, T5 ) - Vdseff_dVgs = Vdseff0_dVgs * T3 + Vgpp_dVgs * T4 + T1_dVg * T5 ; - Vdseff_dVds = Vdseff0_dVds * T3 + Vgpp_dVds * T4 + T1_dVd * T5 ; - Vdseff_dVbs = Vdseff0_dVbs * T3 + Vgpp_dVbs * T4 + T1_dVb * T5 ; - Vdseff_dT = Vdseff0_dT * T3 + Vgpp_dT * T4 + T1_dT * T5 ; - - } else { - - Vdseff = Vds ; - Vdseff0_dVgs = 0.0 ; - Vdseff0_dVds = 1.0 ; - Vdseff0_dVbs = 0.0 ; - Vdseff0_dT = 0.0 ; - - Vdseff_dVgs = 0.0 ; - Vdseff_dVds = 1.0 ; - Vdseff_dVbs = 0.0 ; - Vdseff_dT = 0.0 ; - - } - /* Vdseff (end) */ - - /*---------------------------------------------------* - * start of phi_sL_DEP calculation. (label) - *--------------------------------*/ - - if( Vds <= 0.0e0 ) { - - phi_sL_DEP = phi_s0_DEP ; - phi_sL_DEP_dVgs = phi_s0_DEP_dVgs ; - phi_sL_DEP_dVds = phi_s0_DEP_dVds ; - phi_sL_DEP_dVbs = phi_s0_DEP_dVbs ; - phi_sL_DEP_dT = phi_s0_DEP_dT ; - - phi_bL_DEP = phi_b0_DEP ; - phi_bL_DEP_dVgs = phi_b0_DEP_dVgs ; - phi_bL_DEP_dVds = phi_b0_DEP_dVds ; - phi_bL_DEP_dVbs = phi_b0_DEP_dVbs ; - phi_bL_DEP_dT = phi_b0_DEP_dT ; - - phi_jL_DEP = phi_j0_DEP ; - phi_jL_DEP_dVgs = phi_j0_DEP_dVgs ; - phi_jL_DEP_dVds = phi_j0_DEP_dVds ; - phi_jL_DEP_dVbs = phi_j0_DEP_dVbs ; - phi_jL_DEP_dT = phi_j0_DEP_dT ; - - Q_subL = Q_sub0 ; - Q_subL_dVgs = Q_sub0_dVgs ; - Q_subL_dVds = Q_sub0_dVds ; - Q_subL_dVbs = Q_sub0_dVbs ; - Q_subL_dT = Q_sub0_dT ; - - Q_nL = Q_n0 ; - Q_nL_dVgs = Q_n0_dVgs ; - Q_nL_dVds = Q_n0_dVds ; - Q_nL_dVbs = Q_n0_dVbs ; - Q_nL_dT = Q_n0_dT ; - - Q_bL_dep = Q_b0_dep ; - Q_bL_dep_dVgs = Q_b0_dep_dVgs ; - Q_bL_dep_dVds = Q_b0_dep_dVds ; - Q_bL_dep_dVbs = Q_b0_dep_dVbs ; - Q_bL_dep_dT = Q_b0_dep_dT ; - - Q_subL_dep = Q_sub0_dep ; - Q_subL_dep_dVgs = Q_sub0_dep_dVgs ; - Q_subL_dep_dVds = Q_sub0_dep_dVds ; - Q_subL_dep_dVbs = Q_sub0_dep_dVbs ; - Q_subL_dep_dT = Q_sub0_dep_dT ; - - Q_sL_dep = Q_s0_dep ; - Q_sL_dep_dVgs = Q_s0_dep_dVgs ; - Q_sL_dep_dVds = Q_s0_dep_dVds ; - Q_sL_dep_dVbs = Q_s0_dep_dVbs ; - Q_sL_dep_dT = Q_s0_dep_dT ; - - Q_nL_cur = Q_n0_cur ; - Q_nL_cur_dVgs = Q_n0_cur_dVgs ; - Q_nL_cur_dVds = Q_n0_cur_dVds ; - Q_nL_cur_dVbs = Q_n0_cur_dVbs ; - Q_nL_cur_dT = Q_n0_cur_dT ; - - } else { - - W_bsubL = sqrt(C_2ESIpq_Ndepm * here->HSMHV2_nsub / (here->HSMHV2_nsub + here->HSMHV2_ndepm) * (Vds - Vbscl + Vbi_DEP)) ; - - /*---------------------------------------------------* - * region judgement - *------------------*/ - - /* fully depleted case */ - if( W_bsubL > model->HSMHV2_tndep ) { - - Vgp0 = Vds ; - W_bL = model->HSMHV2_tndep ; - phi_bL_DEP = Vds ; - phi_bL_DEP_lim = Vds ; - phi_jL_DEP = phi_bL_DEP - C_2ESIpq_Ndepm_inv * W_bL * W_bL ; - - Vgp0old = Vgp0 ; - phi_jL_DEP_old = phi_jL_DEP ; - - Q_bL_dep = W_bL * q_Ndepm ; - - for ( lp_s0 = 1 ; lp_s0 <= lp_se_max + 1 ; lp_s0 ++ ) { - - W_bL = sqrt(C_2ESIpq_Ndepm * (phi_bL_DEP - phi_jL_DEP) ) ; - Fn_SU_CP( W_bL , W_bL , model->HSMHV2_tndep , 1e-8, 2 , T0 ) - W_subL = sqrt(C_2ESIpq_Nsub * (phi_jL_DEP - Vbscl + Vbi_DEP) ) ; - - Q_bL_dep = W_bL * q_Ndepm ; - Q_bL_dep_dPd = - C_ESI / W_bL * T0 ; - Q_subL_dep = - W_subL * q_Nsub ; - Q_subL_dep_dPd = - C_ESI / W_subL ; - - y1 = Cox * (Vgp0 - phi_bL_DEP) + Q_bL_dep + Q_subL_dep ; - y11 = Cox ; - y12 = Q_bL_dep_dPd + Q_subL_dep_dPd ; - - y2 = phi_jL_DEP - NdepmpNsub_inv1 * (NdepmpNsub * phi_bL_DEP + Vbscl - Vbi_DEP) ; - y21 = 0.0 ; - y22 = 1.0 ; - - dety = y11 * y22 - y21 * y12; - rev11 = (y22) / dety ; - rev12 = ( - y12) / dety ; - rev21 = ( - y21) / dety ; - rev22 = (y11) / dety ; - - if( fabs( rev11 * y1 + rev12 * y2 ) > 0.5 ) { - Vgp0 = Vgp0 - 0.5 * Fn_Sgn( rev11 * y1 + rev12 * y2 ) ; - phi_jL_DEP = phi_jL_DEP - 0.5 * Fn_Sgn( rev21 * y1 + rev22 * y2 ) ; - } else { - Vgp0 = Vgp0 - ( rev11 * y1 + rev12 * y2 ) ; - phi_jL_DEP = phi_jL_DEP - ( rev21 * y1 + rev22 * y2 ) ; - } - - if( fabs(Vgp0 - Vgp0old) <= ps_conv && - fabs(phi_jL_DEP - phi_jL_DEP_old) <= ps_conv ) lp_s0=lp_se_max + 1 ; - - Vgp0old = Vgp0 ; - phi_jL_DEP_old = phi_jL_DEP ; - } - phi_jL_DEP_acc = phi_jL_DEP ; - - W_subL = model->HSMHV2_tndep * NdepmpNsub ; - phi_jL_DEP = C_2ESIpq_Nsub_inv * W_subL * W_subL + Vbscl - Vbi_DEP ; - phi_bL_DEP = phi_jL_DEP + C_2ESIpq_Ndepm_inv * Tn2 ; - phi_sL_DEP = phi_bL_DEP ; - Psbmax = phi_bL_DEP ; - Vgp1 = phi_bL_DEP ; - if( Vgp > Vgp0 ) { - depmode = 1 ; - } else if(Vgp > Vgp1 ) { - depmode = 3 ; - } else { - depmode = 2 ; - } - - /* else */ - } else { - Vgp0 = Vds ; - Vgp1 = Vgp0 ; - Psbmax = Vgp0 ; - phi_bL_DEP_lim = Vgp0 ; - W_bL = W_bsubL ; - W_subL = W_bL * NdepmpNsub ; - phi_jL_DEP = C_2ESIpq_Nsub_inv * W_subL * W_subL + Vbscl - Vbi_DEP ; - phi_bL_DEP = C_2ESIpq_Ndepm_inv * W_bL * W_bL + phi_jL_DEP ; - phi_jL_DEP_acc = phi_jL_DEP ; - if( Vgp > Vgp0 ) { - depmode = 1 ; - } else { - depmode = 2 ; - } - - } - - T1 = C_2ESI_q_Ndepm * ( Psbmax - ( - here->HSMHV2_Pb2n + Vbscl)) ; - if ( T1 > 0.0 ) { - vthn = - here->HSMHV2_Pb2n + Vbscl - sqrt(T1) / Cox ; - } else { - vthn = - here->HSMHV2_Pb2n + Vbscl ; - } - - /*---------------------------------------------------* - * initial potential phi_s0_DEP,phi_bL_DEP,phi_jL_DEP calculated. - *------------------*/ - - - /* accumulation region */ - if( Vgp > Vgp0 ) { - phi_jL_DEP = phi_jL_DEP_acc ; - phi_bL_DEP = Vds ; - phi_sL_DEP_ini = log(afact * Vgp * Vgp) / (beta + 2.0 / Vgp) + Vds ; - - if( phi_sL_DEP_ini < phi_bL_DEP_lim + ps_conv23 ) phi_sL_DEP_ini = phi_bL_DEP_lim + ps_conv23 ; - - /* fully depleted region */ - } else if( Vgp > Vgp1 ) { - - phi_sL_DEP_ini = phi_sL_DEP ; - - /* depletion & inversion */ - - } else { - - /* depletion */ - if( Vgp > vthn ) { - bfact = - 2.0 * afact * Vgp + beta ; - cfact = afact * Vgp * Vgp - beta * phi_bL_DEP ; - phi_bL_DEP_old = phi_bL_DEP ; - phi_sL_DEP_ini = ( - bfact + sqrt(bfact * bfact - 4.0 * afact * cfact)) / 2.0 / afact ; - if( phi_sL_DEP_ini > Psbmax - ps_conv23 ) phi_sL_DEP_ini = Psbmax - ps_conv23 ; - W_sL = sqrt(C_2ESIpq_Ndepm * (phi_bL_DEP - phi_sL_DEP_ini) ) ; - W_bL = sqrt(C_2ESIpq_Ndepm * (phi_bL_DEP - phi_jL_DEP) ) ; - - if( W_sL + W_bL > model->HSMHV2_tndep ) { - for ( lp_s0 = 1 ; lp_s0 <= lp_se_max + 1 ; lp_s0 ++ ) { - - y0 = W_sL + W_bL - model->HSMHV2_tndep ; - - dydPsm = C_ESI / q_Ndepm / W_sL - + C_ESI / q_Ndepm * ( 1.0 - (here->HSMHV2_ndepm - / here->HSMHV2_nsub) / ( 1.0 + (NdepmpNsub))) / W_bL ; - - if( fabs(y0 / dydPsm) > 0.5 ) { - phi_bL_DEP = phi_bL_DEP - 0.5 * Fn_Sgn(y0 / dydPsm) ; - } else { - phi_bL_DEP = phi_bL_DEP - y0 / dydPsm ; - } - if( (phi_bL_DEP - Vbscl + Vbi_DEP) < epsm10 ) - phi_bL_DEP=Vbscl - Vbi_DEP + epsm10 ; - - cfact = afact * Vgp * Vgp - beta * phi_bL_DEP ; - T1 = bfact * bfact - 4.0 * afact * cfact ; - if( T1 > 0.0 ) { - phi_sL_DEP_ini = ( - bfact + sqrt(T1)) / 2.0 / afact ; - } else { - phi_sL_DEP_ini = ( - bfact) / 2.0 / afact ; - } - - if( phi_sL_DEP_ini > Psbmax ) phi_sL_DEP_ini = Psbmax ; - if( phi_sL_DEP_ini > phi_bL_DEP ) { - phi_sL_DEP_ini = phi_bL_DEP - ps_conv23 ; - lp_s0=lp_se_max + 1 ; - } - W_sL = sqrt(C_2ESIpq_Ndepm * (phi_bL_DEP - phi_sL_DEP_ini) ) ; - phi_jL_DEP = ( NdepmpNsub * phi_bL_DEP - + Vbscl - Vbi_DEP) / (1.0 + NdepmpNsub) ; - W_bL = sqrt(C_2ESIpq_Ndepm * (phi_bL_DEP - phi_jL_DEP) ) ; - - if( fabs(phi_bL_DEP - phi_bL_DEP_old) <= 1.0e-8 ) lp_s0=lp_se_max + 1 ; - phi_bL_DEP_old = phi_bL_DEP ; - } - } - - /* inversion */ - } else { - - phi_bL_DEP = phi_b0_DEP ; - phi_jL_DEP = phi_j0_DEP ; - phi_sL_DEP_ini = phi_s0_DEP ; - - } - - } - - phi_b0_DEP_ini = phi_bL_DEP ; - /* */ - /* solve poisson at drain side */ - /* */ - - flg_conv = 0 ; - - /* accumulation */ - - phi_sL_DEP = phi_sL_DEP_ini ; - phi_bL_DEP = phi_b0_DEP_ini ; - - phi_sL_DEP_old = phi_sL_DEP ; - phi_bL_DEP_old = phi_bL_DEP ; - - for ( lp_s0 = 1 ; lp_s0 <= lp_se_max + 1 ; lp_s0 ++ ) { - - phi_jL_DEP = NdepmpNsub_inv1 * (NdepmpNsub * phi_bL_DEP + Vbscl - Vbi_DEP) ; - phi_jL_DEP_dPb = NdepmpNsub_inv1 * NdepmpNsub ; - - T1 = phi_bL_DEP - phi_jL_DEP ; - Fn_SL_CP( T2 , T1 , 0.0 , 0.1, 2 , T7 ) - W_bL = sqrt(C_2ESIpq_Ndepm * (T2) ) ; - Fn_SU_CP( W_bL , W_bL , model->HSMHV2_tndep , 1e-8, 2 , T8 ) - W_subL = sqrt(C_2ESIpq_Nsub * (phi_jL_DEP - Vbscl + Vbi_DEP) ) ; - Q_bL_dep = W_bL * q_Ndepm ; - Q_bL_dep_dPb = C_ESI / W_bL * T7 * T8 ; - Q_bL_dep_dPd = - C_ESI / W_bL * T7 * T8 ; - Q_subL_dep = - W_subL * q_Nsub ; - Q_subL_dep_dPd = - C_ESI / W_subL ; - - T10 = 8.0 * q_Ndepm_esi * Tn2 ; - phib_ref = (4.0 * phi_jL_DEP * phi_jL_DEP * C_ESI2 - 8.0 * phi_jL_DEP * C_ESI2 * phi_sL_DEP - + 4.0 * C_ESI2 * phi_sL_DEP * phi_sL_DEP - + 4.0 * phi_jL_DEP * q_Ndepm_esi * Tn2 - + 4.0 * phi_sL_DEP * q_Ndepm_esi * Tn2 - + Ndepm2 * C_QE2 * model->HSMHV2_tndep - * Tn2 * model->HSMHV2_tndep) / T10 ; - phib_ref_dPs = ( - 8.0 * phi_jL_DEP * C_ESI2 + 4.0 * C_ESI2 * phi_sL_DEP * 2.0 - + 4.0 * q_Ndepm_esi * Tn2) / T10 ; - phib_ref_dPd = (4.0 * phi_jL_DEP * C_ESI2 * 2.0 - 8.0 * C_ESI2 * phi_sL_DEP - + 4.0 * q_Ndepm_esi * Tn2) / T10 ; - - T1 = beta * (phi_sL_DEP - phi_bL_DEP) ; - T2 = exp(T1) ; - if( phi_sL_DEP >= phi_bL_DEP ) { - Q_sL = - here->HSMHV2_cnst0 * sqrt(T2 - 1.0 - T1 + 1e-15) ; - Q_sL_dPs = 0.5 * here->HSMHV2_cnst0 * here->HSMHV2_cnst0 / Q_sL * (beta * T2 - beta) ; - Q_sL_dPb = - Q_sL_dPs ; - } else { - T3 = exp( - beta * (phi_sL_DEP - Vbscl)) ; - T4 = exp( - beta * (phi_bL_DEP - Vbscl)) ; - Q_sL = here->HSMHV2_cnst0 * sqrt(T2 - 1.0 - T1 + here->HSMHV2_cnst1 * (T3 - T4) + 1e-15) ; - T5 = 0.5 * here->HSMHV2_cnst0 * here->HSMHV2_cnst0 / Q_sL ; - Q_sL_dPs = T5 * (beta * T2 - beta + here->HSMHV2_cnst1 * ( - beta * T3) ) ; - Q_sL_dPb = T5 * ( - beta * T2 + beta + here->HSMHV2_cnst1 * beta * T4 ) ; - } - - Fn_SU_CP2( T1 , phib_ref , phi_bL_DEP_lim , sm_delta, 4 , T9, T11 ) - - y1 = phi_bL_DEP - T1 ; - y11 = - phib_ref_dPs * T9 ; - y12 = 1.0 - phib_ref_dPd * phi_jL_DEP_dPb * T9 ; - - y2 = Cox * (Vgp - phi_sL_DEP) + Q_sL + Q_bL_dep + Q_subL_dep ; - y21 = - Cox + Q_sL_dPs ; - y22 = Q_sL_dPb + Q_bL_dep_dPb + Q_bL_dep_dPd * phi_jL_DEP_dPb + Q_subL_dep_dPd * phi_jL_DEP_dPb ; - - dety = y11 * y22 - y21 * y12; - rev11 = (y22) / dety ; - rev12 = ( - y12) / dety ; - rev21 = ( - y21) / dety ; - rev22 = (y11) / dety ; - if( fabs( rev21 * y1 + rev22 * y2 ) > 0.5 ) { - phi_sL_DEP = phi_sL_DEP - 0.5 * Fn_Sgn( rev11 * y1 + rev12 * y2 ) ; - phi_bL_DEP = phi_bL_DEP - 0.5 * Fn_Sgn( rev21 * y1 + rev22 * y2 ) ; - } else { - phi_sL_DEP = phi_sL_DEP - ( rev11 * y1 + rev12 * y2 ) ; - phi_bL_DEP = phi_bL_DEP - ( rev21 * y1 + rev22 * y2 ) ; - } - - if( fabs(phi_sL_DEP - phi_sL_DEP_old) <= ps_conv && fabs(phi_bL_DEP - phi_bL_DEP_old) <= ps_conv ) { - lp_s0=lp_se_max + 1 ; - flg_conv = 1 ; - } - - phi_sL_DEP_old = phi_sL_DEP ; - phi_bL_DEP_old = phi_bL_DEP ; - - } - if( flg_conv == 0 ) { - printf( "*** warning(HiSIM_HV(%s)): Went Over Iteration Maximum(Psl)\n",model->HSMHV2modName ) ; - printf( " Vbse = %7.3f Vdse = %7.3f Vgse = %7.3f\n" ,Vbse , Vdse , Vgse ) ; - } - - /* caluculate derivative */ - - y1_dVgs = - Vdseff_dVgs * T11 ; - y1_dVds = - Vdseff_dVds * T11 ; - y1_dVbs = - (8.0 * phi_jL_DEP * C_ESI2 - 8.0 * C_ESI2 * phi_sL_DEP - + 4.0 * q_Ndepm_esi * Tn2) / T10 - * T9 * NdepmpNsub_inv1 * Vbscl_dVbs - Vdseff_dVbs * T11 ; - y1_dT = - (8.0 * phi_jL_DEP * C_ESI2 - 8.0 * C_ESI2 * phi_sL_DEP - + 4.0 * q_Ndepm_esi * Tn2) / T10 - * T9 * NdepmpNsub_inv1 * (Vbscl_dT - Vbipn_dT) - Vdseff_dT * T11 ; - - Q_bL_dep_dVbs = - C_ESI / W_bL * T7 * T8 * NdepmpNsub_inv1 * Vbscl_dVbs ; - Q_bL_dep_dT = - C_ESI / W_bL * T7 * T8 * NdepmpNsub_inv1 * (Vbscl_dT - Vbipn_dT) ; - - Q_subL_dep_dVbs = - C_ESI / W_subL * (NdepmpNsub_inv1 * Vbscl_dVbs - Vbscl_dVbs) ; - Q_subL_dep_dT = - C_ESI / W_subL * (NdepmpNsub_inv1 * (Vbscl_dT - Vbipn_dT) - Vbscl_dT + Vbipn_dT) ; - - T1 = beta * (phi_sL_DEP - phi_bL_DEP) ; - T2 = exp(T1) ; - if( phi_sL_DEP >= phi_bL_DEP ) { - Q_sL_dVbs = 0.0 ; - Q_sL_dT = - cnst0_dT * sqrt(T2 - 1.0 - T1 + 1e-15) - - here->HSMHV2_cnst0 / 2.0 / sqrt(T2 - 1.0 - T1 + 1e-15) * ((phi_sL_DEP - phi_bL_DEP) * T2 * beta_dT - - (phi_sL_DEP - phi_bL_DEP) * beta_dT) ; - } else { - T3 = exp( - beta * (phi_sL_DEP - Vbscl)) ; - T4 = exp( - beta * (phi_bL_DEP - Vbscl)) ; - T5 = sqrt(T2 - 1.0 - T1 + 1e-15 + here->HSMHV2_cnst1 * (T3 - T4)) ; - Q_sL_dVbs = here->HSMHV2_cnst0 / 2.0 / T5 * - (here->HSMHV2_cnst1 * (beta * T3 * Vbscl_dVbs - beta * T4 * Vbscl_dVbs) ) ; - Q_sL_dT = cnst0_dT * T5 - + here->HSMHV2_cnst0 / 2.0 / T5 * - ((phi_sL_DEP - phi_bL_DEP) * T2 * beta_dT - (phi_sL_DEP - phi_bL_DEP) * beta_dT - + cnst1_dT * (T3 - T4) - + here->HSMHV2_cnst1 * ( - (phi_sL_DEP - Vbscl) * T3 * beta_dT + beta * T3 * Vbscl_dT - + (phi_bL_DEP - Vbscl) * T4 * beta_dT - beta * T4 * Vbscl_dT) ) ; - } - - y2_dVgs = Cox_dVg * (Vgp - phi_sL_DEP) + Cox * Vgp_dVgs ; - y2_dVds = Cox_dVd * (Vgp - phi_sL_DEP) + Cox * Vgp_dVds ; - y2_dVbs = Cox_dVb * (Vgp - phi_sL_DEP) + Cox * Vgp_dVbs + Q_sL_dVbs + Q_bL_dep_dVbs + Q_subL_dep_dVbs ; - y2_dT = Cox_dT * (Vgp - phi_sL_DEP) + Cox * Vgp_dT + Q_sL_dT + Q_bL_dep_dT + Q_subL_dep_dT ; - - phi_sL_DEP_dVgs = - ( rev11 * y1_dVgs + rev12 * y2_dVgs ) ; - phi_sL_DEP_dVds = - ( rev11 * y1_dVds + rev12 * y2_dVds ) ; - phi_sL_DEP_dVbs = - ( rev11 * y1_dVbs + rev12 * y2_dVbs ) ; - phi_sL_DEP_dT = - ( rev11 * y1_dT + rev12 * y2_dT ) ; - - phi_bL_DEP_dVgs = - ( rev21 * y1_dVgs + rev22 * y2_dVgs ) ; - phi_bL_DEP_dVds = - ( rev21 * y1_dVds + rev22 * y2_dVds ) ; - phi_bL_DEP_dVbs = - ( rev21 * y1_dVbs + rev22 * y2_dVbs ) ; - phi_bL_DEP_dT = - ( rev21 * y1_dT + rev22 * y2_dT ) ; - - if( W_bsubL > model->HSMHV2_tndep && depmode !=2 ) { - Fn_SU_CP2(phi_bL_DEP , phi_bL_DEP , phi_sL_DEP , 0.02, 2 , T1, T2 ) - phi_bL_DEP_dVgs = phi_bL_DEP_dVgs * T1 + phi_sL_DEP_dVgs * T2 ; - phi_bL_DEP_dVds = phi_bL_DEP_dVds * T1 + phi_sL_DEP_dVds * T2 ; - phi_bL_DEP_dVbs = phi_bL_DEP_dVbs * T1 + phi_sL_DEP_dVbs * T2 ; - phi_bL_DEP_dT = phi_bL_DEP_dT * T1 + phi_sL_DEP_dT * T2 ; - } - - phi_jL_DEP = NdepmpNsub_inv1 * (NdepmpNsub * phi_bL_DEP + Vbscl - Vbi_DEP) ; - phi_jL_DEP_dVgs = NdepmpNsub_inv1 * NdepmpNsub * phi_bL_DEP_dVgs ; - phi_jL_DEP_dVds = NdepmpNsub_inv1 * NdepmpNsub * phi_bL_DEP_dVds ; - phi_jL_DEP_dVbs = NdepmpNsub_inv1 * NdepmpNsub * phi_bL_DEP_dVbs + NdepmpNsub_inv1 * Vbscl_dVbs ; - phi_jL_DEP_dT = NdepmpNsub_inv1 * NdepmpNsub * phi_bL_DEP_dT - + NdepmpNsub_inv1 * (Vbscl_dT - Vbipn_dT) ; - - phib_ref = (4.0 * phi_jL_DEP * phi_jL_DEP * C_ESI2 - 8.0 * phi_jL_DEP * C_ESI2 * phi_sL_DEP - + 4.0 * C_ESI2 * phi_sL_DEP * phi_sL_DEP - + 4.0 * phi_jL_DEP * q_Ndepm_esi * Tn2 - + 4.0 * phi_sL_DEP * q_Ndepm_esi * Tn2 - + Ndepm2 * C_QE2 * model->HSMHV2_tndep - * Tn2 * model->HSMHV2_tndep) / T10 ; - - phib_ref_dVgs = ( 8.0 * phi_jL_DEP * phi_jL_DEP_dVgs * C_ESI2 - 8.0 * phi_jL_DEP_dVgs * C_ESI2 * phi_sL_DEP - - 8.0 * phi_jL_DEP * C_ESI2 * phi_sL_DEP_dVgs + 8.0 * C_ESI2 * phi_sL_DEP * phi_sL_DEP_dVgs - + 4.0 * phi_jL_DEP_dVgs * q_Ndepm_esi * Tn2 - + 4.0 * phi_sL_DEP_dVgs * q_Ndepm_esi * Tn2 ) / T10 ; - phib_ref_dVds = ( 8.0 * phi_jL_DEP * phi_jL_DEP_dVds * C_ESI2 - 8.0 * phi_jL_DEP_dVds * C_ESI2 * phi_sL_DEP - - 8.0 * phi_jL_DEP * C_ESI2 * phi_sL_DEP_dVds + 8.0 * C_ESI2 * phi_sL_DEP * phi_sL_DEP_dVds - + 4.0 * phi_jL_DEP_dVds * q_Ndepm_esi * Tn2 - + 4.0 * phi_sL_DEP_dVds * q_Ndepm_esi * Tn2 ) / T10 ; - phib_ref_dVbs = ( 8.0 * phi_jL_DEP * phi_jL_DEP_dVbs * C_ESI2 - 8.0 * phi_jL_DEP_dVbs * C_ESI2 * phi_sL_DEP - - 8.0 * phi_jL_DEP * C_ESI2 * phi_sL_DEP_dVbs + 8.0 * C_ESI2 * phi_sL_DEP * phi_sL_DEP_dVbs - + 4.0 * phi_jL_DEP_dVbs * q_Ndepm_esi * Tn2 - + 4.0 * phi_sL_DEP_dVbs * q_Ndepm_esi * Tn2 ) / T10 ; - phib_ref_dT = ( 8.0 * phi_jL_DEP * phi_jL_DEP_dT * C_ESI2 - 8.0 * phi_jL_DEP_dT * C_ESI2 * phi_sL_DEP - - 8.0 * phi_jL_DEP * C_ESI2 * phi_sL_DEP_dT + 8.0 * C_ESI2 * phi_sL_DEP * phi_sL_DEP_dT - + 4.0 * phi_jL_DEP_dT * q_Ndepm_esi * Tn2 - + 4.0 * phi_sL_DEP_dT * q_Ndepm_esi * Tn2 ) / T10 ; - - T1 = beta * (phi_sL_DEP - phi_bL_DEP) ; - T1_dVgs = beta * (phi_sL_DEP_dVgs - phi_bL_DEP_dVgs) ; - T1_dVds = beta * (phi_sL_DEP_dVds - phi_bL_DEP_dVds) ; - T1_dVbs = beta * (phi_sL_DEP_dVbs - phi_bL_DEP_dVbs) ; - T1_dT = beta * (phi_sL_DEP_dT - phi_bL_DEP_dT) + beta_dT * (phi_sL_DEP - phi_bL_DEP) ; - - T2 = exp(T1) ; - T2_dVgs = T1_dVgs * T2 ; - T2_dVds = T1_dVds * T2 ; - T2_dVbs = T1_dVbs * T2 ; - T2_dT = T1_dT * T2 ; - - if( phi_sL_DEP >= phi_bL_DEP ) { - T3 = sqrt(T2 - 1.0e0 - T1 + 1e-15 ) ; - T3_dVgs = (T2_dVgs - T1_dVgs) / 2.0 / T3 ; - T3_dVds = (T2_dVds - T1_dVds) / 2.0 / T3 ; - T3_dVbs = (T2_dVbs - T1_dVbs) / 2.0 / T3 ; - T3_dT = (T2_dT - T1_dT) / 2.0 / T3 ; - - Q_sL = - here->HSMHV2_cnst0 * T3 ; - - Q_sL_dep = 0.0 ; - Q_subL = 0.0 ; -/// Qg = Cox * (Vgp - phi_sL_DEP) ; - - W_bL = sqrt(C_2ESIpq_Ndepm * (phi_bL_DEP - phi_jL_DEP) ) ; - Fn_SU_CP( T9 , W_bL , model->HSMHV2_tndep, 1e-8, 2 , T4 ) - - W_subL = sqrt(C_2ESIpq_Nsub * (phi_jL_DEP - Vbscl + Vbi_DEP) ) ; - Q_bL_dep = T9 * q_Ndepm ; - Q_subL_dep = - W_subL * q_Nsub ; - - /* derivative */ - Q_sL_dVgs = - here->HSMHV2_cnst0 * T3_dVgs ; - Q_sL_dVds = - here->HSMHV2_cnst0 * T3_dVds ; - Q_sL_dVbs = - here->HSMHV2_cnst0 * T3_dVbs ; - Q_sL_dT = - cnst0_dT * T3 - - here->HSMHV2_cnst0 * T3_dT ; - - Q_nL = Q_sL ; - Q_nL_dVgs = Q_sL_dVgs ; - Q_nL_dVds = Q_sL_dVds ; - Q_nL_dVbs = Q_sL_dVbs ; - Q_nL_dT = Q_sL_dT ; - - Q_bL_dep_dVgs = C_ESI / W_bL * (phi_bL_DEP_dVgs - phi_jL_DEP_dVgs) * T4 ; - Q_bL_dep_dVds = C_ESI / W_bL * (phi_bL_DEP_dVds - phi_jL_DEP_dVds) * T4 ; - Q_bL_dep_dVbs = C_ESI / W_bL * (phi_bL_DEP_dVbs - phi_jL_DEP_dVbs) * T4 ; - Q_bL_dep_dT = C_ESI / W_bL * (phi_bL_DEP_dT - phi_jL_DEP_dT) * T4 ; - - Q_subL_dep_dVgs = - C_ESI / W_subL * phi_jL_DEP_dVgs ; - Q_subL_dep_dVds = - C_ESI / W_subL * phi_jL_DEP_dVds ; - Q_subL_dep_dVbs = - C_ESI / W_subL * (phi_jL_DEP_dVbs - Vbscl_dVbs) ; - Q_subL_dep_dT = - C_ESI / W_subL * (phi_jL_DEP_dT - Vbscl_dT + Vbipn_dT) ; - - Q_subL_dVgs = 0.0 ; - Q_subL_dVds = 0.0 ; - Q_subL_dVbs = 0.0 ; - Q_subL_dT = 0.0 ; - - Q_sL_dep_dVgs = 0.0 ; - Q_sL_dep_dVds = 0.0 ; - Q_sL_dep_dVbs = 0.0 ; - Q_sL_dep_dT = 0.0 ; - - } else { - - T3 = exp( - beta * (phi_sL_DEP - Vbscl)) ; - T4 = exp( - beta * (phi_bL_DEP - Vbscl)) ; - T5 = sqrt(T2 - 1.0 - T1 + here->HSMHV2_cnst1 * (T3 - T4) + 1e-15) ; - Q_sL = here->HSMHV2_cnst0 * T5 ; - - T3_dVgs = - beta * T3 * phi_sL_DEP_dVgs ; - T3_dVds = - beta * T3 * phi_sL_DEP_dVds ; - T3_dVbs = - beta * T3 * (phi_sL_DEP_dVbs - Vbscl_dVbs) ; - T3_dT = - beta * T3 * (phi_sL_DEP_dT - Vbscl_dT) - (phi_sL_DEP - Vbscl) * T3 * beta_dT ; - - T4_dVgs = - beta * T4 * phi_bL_DEP_dVgs ; - T4_dVds = - beta * T4 * phi_bL_DEP_dVds ; - T4_dVbs = - beta * T4 * (phi_bL_DEP_dVbs - Vbscl_dVbs) ; - T4_dT = - beta * T4 * (phi_bL_DEP_dT - Vbscl_dT) - (phi_bL_DEP - Vbscl) * T4 * beta_dT ; - - T5_dVgs = (T2_dVgs - T1_dVgs + here->HSMHV2_cnst1 * (T3_dVgs - T4_dVgs)) / 2.0 / T5 ; - T5_dVds = (T2_dVds - T1_dVds + here->HSMHV2_cnst1 * (T3_dVds - T4_dVds)) / 2.0 / T5 ; - T5_dVbs = (T2_dVbs - T1_dVbs + here->HSMHV2_cnst1 * (T3_dVbs - T4_dVbs)) / 2.0 / T5 ; - T5_dT = (T2_dT - T1_dT + here->HSMHV2_cnst1 * (T3_dT - T4_dT) + cnst1_dT * (T3 - T4)) / 2.0 / T5 ; - - Q_sL_dVgs = here->HSMHV2_cnst0 * T5_dVgs ; - Q_sL_dVds = here->HSMHV2_cnst0 * T5_dVds ; - Q_sL_dVbs = here->HSMHV2_cnst0 * T5_dVbs ; - Q_sL_dT = here->HSMHV2_cnst0 * T5_dT + cnst0_dT * T5 ; - - if( W_bsubL > model->HSMHV2_tndep && depmode !=2 ) { - Q_subL = 0.0 ; - Q_sL_dep = 0.0 ; - - Q_subL_dVgs = 0.0 ; - Q_subL_dVds = 0.0 ; - Q_subL_dVbs = 0.0 ; - Q_subL_dT = 0.0 ; - - Q_sL_dep_dVgs = 0.0 ; - Q_sL_dep_dVds = 0.0 ; - Q_sL_dep_dVbs = 0.0 ; - Q_sL_dep_dT = 0.0 ; - - } else { - T3 = exp( - beta * (phi_sL_DEP - Vbscl)) ; - T4 = exp( - beta * (phi_bL_DEP - Vbscl)) ; - T5 = sqrt( - T1 + here->HSMHV2_cnst1 * (T3 - T4)) ; - Q_subL = here->HSMHV2_cnst0 * T5 - here->HSMHV2_cnst0 * sqrt( - T1) ; - T6 = sqrt(T2 - 1.0e0 - T1 + 1e-15) ; - Q_sL_dep = here->HSMHV2_cnst0 * T6 ; - - Q_subL_dVgs = here->HSMHV2_cnst0 / 2.0 / T5 * ( - beta * (phi_sL_DEP_dVgs - phi_bL_DEP_dVgs) - + here->HSMHV2_cnst1 * ( - beta * T3 * phi_sL_DEP_dVgs + beta * T4 * phi_bL_DEP_dVgs)) - - here->HSMHV2_cnst0 / 2.0 / sqrt( - T1) * ( - beta * (phi_sL_DEP_dVgs - phi_bL_DEP_dVgs)) ; - Q_subL_dVds = here->HSMHV2_cnst0 / 2.0 / T5 * ( - beta * (phi_sL_DEP_dVds - phi_bL_DEP_dVds) - + here->HSMHV2_cnst1 * ( - beta * T3 * phi_sL_DEP_dVds + beta * T4 * phi_bL_DEP_dVds)) - - here->HSMHV2_cnst0 / 2.0 / sqrt( - T1) * ( - beta * (phi_sL_DEP_dVds - phi_bL_DEP_dVds)) ; - Q_subL_dVbs = here->HSMHV2_cnst0 / 2.0 / T5 * ( - beta * (phi_sL_DEP_dVbs - phi_bL_DEP_dVbs) - + here->HSMHV2_cnst1 * ( - beta * T3 * (phi_sL_DEP_dVbs - Vbscl_dVbs) + beta * T4 * (phi_bL_DEP_dVbs - Vbscl_dVbs))) - - here->HSMHV2_cnst0 / 2.0 / sqrt( - T1) * ( - beta * (phi_sL_DEP_dVbs - phi_bL_DEP_dVbs)) ; - Q_subL_dT = cnst0_dT * T5 - cnst0_dT * sqrt( - T1) - + here->HSMHV2_cnst0 / 2.0 / T5 * ( - beta * (phi_sL_DEP_dT - phi_bL_DEP_dT) - beta_dT * (phi_sL_DEP - phi_bL_DEP) - + cnst1_dT * (T3 - T4) - + here->HSMHV2_cnst1 * ( - beta * T3 * (phi_sL_DEP_dT - Vbscl_dT) - beta_dT * (phi_sL_DEP - Vbscl) * T3 - + beta * T4 * (phi_bL_DEP_dT - Vbscl_dT) + beta_dT * (phi_bL_DEP - Vbscl) * T4)) - - here->HSMHV2_cnst0 / 2.0 / sqrt( - T1) * ( - beta * (phi_sL_DEP_dT - phi_bL_DEP_dT) - beta_dT * (phi_sL_DEP - phi_bL_DEP)) ; - - Q_sL_dep_dVgs = here->HSMHV2_cnst0 / 2.0 / T6 * beta * (phi_sL_DEP_dVgs - phi_bL_DEP_dVgs) * (T2 - 1) ; - Q_sL_dep_dVds = here->HSMHV2_cnst0 / 2.0 / T6 * beta * (phi_sL_DEP_dVds - phi_bL_DEP_dVds) * (T2 - 1) ; - Q_sL_dep_dVbs = here->HSMHV2_cnst0 / 2.0 / T6 * beta * (phi_sL_DEP_dVbs - phi_bL_DEP_dVbs) * (T2 - 1) ; - Q_sL_dep_dT = cnst0_dT * T6 - + here->HSMHV2_cnst0 / 2.0 / T6 * - (beta * (phi_sL_DEP_dT - phi_bL_DEP_dT) * (T2 - 1) + beta_dT * (phi_sL_DEP - phi_bL_DEP) * (T2 - 1)) ; - - } - - Q_nL = 0.0 ; - Q_nL_dVgs = 0.0 ; - Q_nL_dVds = 0.0 ; - Q_nL_dVbs = 0.0 ; - Q_nL_dT = 0.0 ; - -/// Qg = Cox * (Vgp - phi_sL_DEP) ; - - T1 = phi_bL_DEP - phi_jL_DEP ; - Fn_SL_CP( T2 , T1 , 0.0 , 0.1, 2 , T0 ) - W_bL = sqrt(C_2ESIpq_Ndepm * (T2) ) ; - Fn_SU_CP( T9 , W_bL , model->HSMHV2_tndep, 1e-8, 2 , T3 ) - W_subL = sqrt(C_2ESIpq_Nsub * (phi_jL_DEP - Vbscl + Vbi_DEP) ) ; - Q_bL_dep = T9 * q_Ndepm ; - Q_subL_dep = - W_subL * q_Nsub ; - - Q_bL_dep_dVgs = C_ESI / W_bL * (phi_bL_DEP_dVgs - phi_jL_DEP_dVgs) * T0 * T3 ; - Q_bL_dep_dVds = C_ESI / W_bL * (phi_bL_DEP_dVds - phi_jL_DEP_dVds) * T0 * T3 ; - Q_bL_dep_dVbs = C_ESI / W_bL * (phi_bL_DEP_dVbs - phi_jL_DEP_dVbs) * T0 * T3 ; - Q_bL_dep_dT = C_ESI / W_bL * (phi_bL_DEP_dT - phi_jL_DEP_dT) * T0 * T3 ; - - Q_subL_dep_dVgs = - C_ESI / W_subL * phi_jL_DEP_dVgs ; - Q_subL_dep_dVds = - C_ESI / W_subL * phi_jL_DEP_dVds ; - Q_subL_dep_dVbs = - C_ESI / W_subL * (phi_jL_DEP_dVbs - Vbscl_dVbs) ; - Q_subL_dep_dT = - C_ESI / W_subL * (phi_jL_DEP_dT - Vbscl_dT + Vbipn_dT) ; - - } - - - T1 = phi_sL_DEP - phi_bL_DEP_lim ; - Fn_SL_CP( T2 , T1 , 0.0, Ps_delta, 2 , T0 ) - T2_dVgs = (phi_sL_DEP_dVgs - Vdseff_dVgs) * T0 ; - T2_dVds = (phi_sL_DEP_dVds - Vdseff_dVds) * T0 ; - T2_dVbs = (phi_sL_DEP_dVbs - Vdseff_dVbs) * T0 ; - T2_dT = (phi_sL_DEP_dT - Vdseff_dT) * T0 ; - - T3 = exp(beta * (T2)) ; - T3_dVgs = beta * T3 * T2_dVgs ; - T3_dVds = beta * T3 * T2_dVds ; - T3_dVbs = beta * T3 * T2_dVbs ; - T3_dT = beta * T3 * T2_dT + T2 * T3 * beta_dT ; - - T4 = T3 - 1.0 - beta * T2 ; - - T4_dVgs = T3_dVgs - beta * T2_dVgs ; - T4_dVds = T3_dVds - beta * T2_dVds ; - T4_dVbs = T3_dVbs - beta * T2_dVbs ; - T4_dT = T3_dT - beta * T2_dT - beta_dT * T2 ; - - T5 = sqrt(T4) ; - Q_nL_cur = - here->HSMHV2_cnst0 * T5 ; - Q_nL_cur_dVgs = - here->HSMHV2_cnst0 / 2.0 / T5 * T4_dVgs ; - Q_nL_cur_dVds = - here->HSMHV2_cnst0 / 2.0 / T5 * T4_dVds ; - Q_nL_cur_dVbs = - here->HSMHV2_cnst0 / 2.0 / T5 * T4_dVbs ; - Q_nL_cur_dT = - here->HSMHV2_cnst0 / 2.0 / T5 * T4_dT - - cnst0_dT * T5 ; - - } - - /*---------------------------------------------------* - * Assign Pds. - *-----------------*/ - Ps0 = phi_s0_DEP ; - Psl = phi_sL_DEP ; - Pds = phi_sL_DEP - phi_s0_DEP + epsm10 ; - - Pds_dVgs = phi_sL_DEP_dVgs - phi_s0_DEP_dVgs ; - Pds_dVds = phi_sL_DEP_dVds - phi_s0_DEP_dVds ; - Pds_dVbs = phi_sL_DEP_dVbs - phi_s0_DEP_dVbs ; - Pds_dT = phi_sL_DEP_dT - phi_s0_DEP_dT ; - - if( Pds < 0.0 ) { // take care of numerical noise // - Pds = 0.0 ; - Pds_dVgs = 0.0 ; - Pds_dVds = 0.0 ; - Pds_dVbs = 0.0 ; - Pds_dT = 0.0 ; - - phi_sL_DEP = phi_s0_DEP ; - phi_sL_DEP_dVgs = phi_s0_DEP_dVgs ; - phi_sL_DEP_dVds = phi_s0_DEP_dVds ; - phi_sL_DEP_dVbs = phi_s0_DEP_dVbs ; - phi_sL_DEP_dT = phi_s0_DEP_dT ; - - Idd = 0.0 ; - Idd_dVgs = 0.0 ; - Idd_dVds = 0.0 ; - Idd_dVbs = 0.0 ; - Idd_dT = 0.0 ; - - } else { - - T1 = - (Q_s0 + Q_sL) ; - T1_dVgs = - (Q_s0_dVgs + Q_sL_dVgs) ; - T1_dVds = - (Q_s0_dVds + Q_sL_dVds) ; - T1_dVbs = - (Q_s0_dVbs + Q_sL_dVbs) ; - T1_dT = - (Q_s0_dT + Q_sL_dT) ; - - Fn_SL_CP3( Qn_drift , T1 , 0.0, Qn_delta , 2 , T3, T4, T5 ) - Qn_drift_dVgs = T1_dVgs * T3 ; - Qn_drift_dVds = T1_dVds * T3 ; - Qn_drift_dVbs = T1_dVbs * T3 ; - Qn_drift_dT = T1_dT * T3 + Qn_delta_dT * T5 ; - - Idd_drift = beta * Qn_drift / 2.0 * Pds ; - Idd_diffu = - ( - Q_nL_cur + Q_n0_cur); - - Idd = Idd_drift + Idd_diffu ; - Idd_dVgs = beta * Qn_drift_dVgs / 2.0 * Pds + beta * Qn_drift / 2.0 * Pds_dVgs - - ( - Q_nL_cur_dVgs + Q_n0_cur_dVgs ) ; - Idd_dVds = beta * Qn_drift_dVds / 2.0 * Pds + beta * Qn_drift / 2.0 * Pds_dVds - - ( - Q_nL_cur_dVds + Q_n0_cur_dVds ) ; - Idd_dVbs = beta * Qn_drift_dVbs / 2.0 * Pds + beta * Qn_drift / 2.0 * Pds_dVbs - - ( - Q_nL_cur_dVbs + Q_n0_cur_dVbs ) ; - Idd_dT = (beta_dT * Qn_drift + beta * Qn_drift_dT) / 2.0 * Pds - + beta * Qn_drift / 2.0 * Pds_dT - ( - Q_nL_cur_dT + Q_n0_cur_dT ) ; - - } - - - Qiu = - Q_n0_cur ; - Qiu_dVgs = - Q_n0_cur_dVgs ; - Qiu_dVds = - Q_n0_cur_dVds ; - Qiu_dVbs = - Q_n0_cur_dVbs ; - Qiu_dT = - Q_n0_cur_dT ; - - Lch = Leff ; - - /*-----------------------------------------------------------* - * Muun : universal mobility. (CGS unit) - *-----------------*/ - - T2 = here->HSMHV2_ninv_o_esi ; - - T0 = here->HSMHV2_ninvd ; - T4 = 1.0 + ( phi_sL_DEP - phi_s0_DEP ) * T0 ; - T4_dVb = ( phi_sL_DEP_dVbs - phi_s0_DEP_dVbs ) * T0 ; - T4_dVd = ( phi_sL_DEP_dVds - phi_s0_DEP_dVds ) * T0 ; - T4_dVg = ( phi_sL_DEP_dVgs - phi_s0_DEP_dVgs ) * T0 ; - T4_dT = ( phi_sL_DEP_dT - phi_s0_DEP_dT ) * T0 + ( phi_sL_DEP - phi_s0_DEP ) * ninvd_dT ; - - T5 = T2 * Qiu ; - T5_dVb = T2 * Qiu_dVbs ; - T5_dVd = T2 * Qiu_dVds ; - T5_dVg = T2 * Qiu_dVgs ; - T5_dT = T2 * Qiu_dT ; - - T3 = T5 / T4 ; - T3_dVb = ( - T4_dVb * T5 + T4 * T5_dVb ) / T4 / T4 ; - T3_dVd = ( - T4_dVd * T5 + T4 * T5_dVd ) / T4 / T4 ; - T3_dVg = ( - T4_dVg * T5 + T4 * T5_dVg ) / T4 / T4 ; - T3_dT = ( - T4_dT * T5 + T4 * T5_dT ) / T4 / T4 ; - - Eeff = T3 ; - Eeff_dVbs = T3_dVb ; - Eeff_dVds = T3_dVd ; - Eeff_dVgs = T3_dVg ; - Eeff_dT = T3_dT ; - - T5 = Fn_Pow( Eeff , model->HSMHV2_mueph0 - 1.0e0 ) ; - T8 = T5 * Eeff ; - T7 = Fn_Pow( Eeff , here->HSMHV2_muesr - 1.0e0 ) ; - T6 = T7 * Eeff ; - T8_dT = model->HSMHV2_mueph0 * T5 * Eeff_dT ; - T6_dT = here->HSMHV2_muesr * T7 * Eeff_dT ; - - T9 = C_QE * C_m2cm_p2 ; - Rns = Qiu / T9 ; - Rns_dT = Qiu_dT / T9 ; - - T1 = 1.0e0 / ( pParam->HSMHV2_muecb0 + pParam->HSMHV2_muecb1 * Rns / 1.0e11 ) - + here->HSMHV2_mphn0 * T8 + T6 / pParam->HSMHV2_muesr1 ; - - - T1_dT = - 1.0e0 / ( pParam->HSMHV2_muecb0 + pParam->HSMHV2_muecb1 * Rns / 1.0e11 ) - / ( pParam->HSMHV2_muecb0 + pParam->HSMHV2_muecb1 * Rns / 1.0e11 ) - * pParam->HSMHV2_muecb1 * Rns_dT / 1.0e11 - + here->HSMHV2_mphn0 * T8_dT + mphn0_dT * T8 + T6_dT / pParam->HSMHV2_muesr1 ; - - Muun = 1.0e0 / T1 ; - Muun_dT = - Muun / T1 * T1_dT ; - - T1 = 1.0e0 / ( T1 * T1 ) ; - T2 = pParam->HSMHV2_muecb0 + pParam->HSMHV2_muecb1 * Rns / 1.0e11 ; - T2 = 1.0e0 / ( T2 * T2 ) ; - T3 = here->HSMHV2_mphn1 * T5 ; - T4 = here->HSMHV2_muesr * T7 / pParam->HSMHV2_muesr1 ; - T5 = - 1.0e-11 * pParam->HSMHV2_muecb1 / C_QE * T2 / C_m2cm_p2 ; - Muun_dVbs = - ( T5 * Qiu_dVbs - + Eeff_dVbs * T3 + Eeff_dVbs * T4 ) * T1 ; - Muun_dVds = - ( T5 * Qiu_dVds - + Eeff_dVds * T3 + Eeff_dVds * T4 ) * T1 ; - Muun_dVgs = - ( T5 * Qiu_dVgs - + Eeff_dVgs * T3 + Eeff_dVgs * T4 ) * T1 ; - - /* Change to MKS unit */ - Muun /=C_m2cm_p2 ; - Muun_dT /=C_m2cm_p2 ; - Muun_dVbs /=C_m2cm_p2 ; - Muun_dVds /=C_m2cm_p2 ; - Muun_dVgs /=C_m2cm_p2 ; - - /*-----------------------------------------------------------* - * Mu : mobility - *-----------------*/ - T2 = beta * (Qiu + small) * Lch ; - - T1 = 1.0e0 / T2 ; - T3 = T1 * T1 ; - T4 = - beta * T3 ; - T5 = T4 * Lch ; - T6 = T4 * (Qiu + small) ; - T1_dVb = ( T5 * Qiu_dVbs ) ; - T1_dVd = ( T5 * Qiu_dVds ) ; - T1_dVg = ( T5 * Qiu_dVgs ) ; - T2_dT = beta_dT * (Qiu + small) * Lch + beta * Qiu_dT * Lch ; - T1_dT = - T1 / T2 * T2_dT ; - - TY = Idd * T1 ; - TY_dVbs = Idd_dVbs * T1 + Idd * T1_dVb ; - TY_dVds = Idd_dVds * T1 + Idd * T1_dVd ; - TY_dVgs = Idd_dVgs * T1 + Idd * T1_dVg ; - TY_dT = Idd_dT * T1 + Idd * T1_dT ; - - T2 = 0.2 * Vmax / Muun ; - T3 = - T2 / Muun ; - T2_dVb = T3 * Muun_dVbs ; - T2_dVd = T3 * Muun_dVds ; - T2_dVg = T3 * Muun_dVgs ; - T2_dT = 0.2 * ( Vmax_dT * Muun - Muun_dT * Vmax ) / ( Muun * Muun ) ; - - Ey = sqrt( TY * TY + T2 * T2 ) ; - T4 = 1.0 / Ey ; - Ey_dVbs = T4 * ( TY * TY_dVbs + T2 * T2_dVb ) ; - Ey_dVds = T4 * ( TY * TY_dVds + T2 * T2_dVd ) ; - Ey_dVgs = T4 * ( TY * TY_dVgs + T2 * T2_dVg ) ; - Ey_dT = T4 * ( TY * TY_dT + T2 * T2_dT ) ; - - Em = Muun * Ey ; - Em_dVbs = Muun_dVbs * Ey + Muun * Ey_dVbs ; - Em_dVds = Muun_dVds * Ey + Muun * Ey_dVds ; - Em_dVgs = Muun_dVgs * Ey + Muun * Ey_dVgs ; - Em_dT = Ey * Muun_dT + Ey_dT * Muun ; - - T1 = Em / Vmax ; - T1_dT = ( Em_dT * Vmax - Vmax_dT * Em ) / ( Vmax * Vmax ); - - Ey_suf = Ey ; - Ey_suf_dVgs = Ey_dVgs ; - Ey_suf_dVds = Ey_dVds ; - Ey_suf_dVbs = Ey_dVbs ; - Ey_suf_dT = Ey_dT ; - - /* note: model->HSMHV2_bb = 2 (electron) ;1 (hole) */ - if ( 1.0e0 - epsm10 <= model->HSMHV2_bb && model->HSMHV2_bb <= 1.0e0 + epsm10 ) { - T3 = 1.0e0 ; - T3_dT = 0.0e0 ; - } else if ( 2.0e0 - epsm10 <= model->HSMHV2_bb && model->HSMHV2_bb <= 2.0e0 + epsm10 ) { - T3 = T1 ; - T3_dT = T1_dT ; - } else { - T3 = Fn_Pow( T1 , model->HSMHV2_bb - 1.0e0 ) ; - T3_dT = ( model->HSMHV2_bb - 1.0e0 ) * Fn_Pow( T1 , model->HSMHV2_bb - 2.0e0 ) * T1_dT ; - } - T2 = T1 * T3 ; - T4 = 1.0e0 + T2 ; - T2_dT = T1 * T3_dT + T3 * T1_dT ; - T4_dT = T2_dT ; - - if ( 1.0e0 - epsm10 <= model->HSMHV2_bb && model->HSMHV2_bb <= 1.0e0 + epsm10 ) { - T5 = 1.0 / T4 ; - T6 = T5 / T4 ; - T5_dT = - T5 * T5 * T4_dT ; - T6_dT = T5 * T5 * ( T5_dT * T4 - T5 * T4_dT ) ; - } else if ( 2.0e0 - epsm10 <= model->HSMHV2_bb && model->HSMHV2_bb <= 2.0e0 + epsm10 ) { - T5 = 1.0 / sqrt( T4 ) ; - T6 = T5 / T4 ; - T5_dT = - 0.5e0 / ( T4 * sqrt(T4)) * T4_dT ; - T6_dT = ( T5_dT * T4 - T5 * T4_dT ) / T4 / T4 ; - } else { - T6 = Fn_Pow( T4 , ( - 1.0e0 / model->HSMHV2_bb - 1.0e0 ) ) ; - T5 = T4 * T6 ; - T6_dT =( - 1.0e0 / model->HSMHV2_bb - 1.0e0 ) * Fn_Pow( T4 , ( - 1.0e0 / model->HSMHV2_bb - 2.0e0 ) ) * T4_dT ; - T5_dT = T4_dT * T6 + T4 * T6_dT ; - } - - T7 = Muun / Vmax * T6 * T3 ; - - Mu = Muun * T5 ; - - Mu_dVbs = Muun_dVbs * T5 - T7 * Em_dVbs ; - Mu_dVds = Muun_dVds * T5 - T7 * Em_dVds ; - Mu_dVgs = Muun_dVgs * T5 - T7 * Em_dVgs ; - Mu_dT = Muun_dT * T5 + Muun * T5_dT ; - - //-----------------------------------------------------------* - //* resistor region current. (CGS unit) - //*-----------------// - - if( Vdsorg > 1e-3 ) { - - T2 = here->HSMHV2_qnsub_esi / ( Cox * Cox ) ; - T4 = - 2.0e0 * T2 / Cox ; - T2_dVb = T4 * Cox_dVb ; - T2_dVd = T4 * Cox_dVd ; - T2_dVg = T4 * Cox_dVg ; - T2_dT = T4 * Cox_dT ; - - T0 = Vgp + model->HSMHV2_depvdsef1 - beta_inv - Vbsz ; - T0_dVg = Vgp_dVgs ; - T0_dVd = Vgp_dVds - Vbsz_dVds ; - T0_dVb = Vgp_dVbs - Vbsz_dVbs ; - T0_dT = Vgp_dT - beta_inv_dT - Vbsz_dT ; - - T4 = 1.0e0 + 2.0e0 / T2 * T0 ; - T4_dVg = 2.0 / T2 * T0_dVg - 2.0 / T2 / T2 * T0 * T2_dVg ; - T4_dVd = 2.0 / T2 * T0_dVd - 2.0 / T2 / T2 * T0 * T2_dVd ; - T4_dVb = 2.0 / T2 * T0_dVb - 2.0 / T2 / T2 * T0 * T2_dVb ; - T4_dT = 2.0 / T2 * T0_dT - 2.0 / T2 / T2 * T0 * T2_dT ; - - Fn_SL_CP( T9 , T4 , 0 , DEPQFN_dlt, 2 , T0 ) - T9_dVg = T4_dVg * T0 ; - T9_dVd = T4_dVd * T0 ; - T9_dVb = T4_dVb * T0 ; - T9_dT = T4_dT * T0 ; - - T9 +=small ; - T3 = sqrt( T9 ) ; - T3_dVg = 0.5 / T3 * T9_dVg ; - T3_dVd = 0.5 / T3 * T9_dVd ; - T3_dVb = 0.5 / T3 * T9_dVb ; - T3_dT = 0.5 / T3 * T9_dT ; - - T10 = Vgp + model->HSMHV2_depvdsef1 + T2 * ( 1.0e0 - T3 ) ; - T10 = T10 * model->HSMHV2_depvdsef2 ; - T10_dVb = (Vgp_dVbs + T2_dVb * ( 1.0e0 - T3 ) - T2 * T3_dVb) - * model->HSMHV2_depvdsef2 ; - T10_dVd = (Vgp_dVds + T2_dVd * ( 1.0e0 - T3 ) - T2 * T3_dVd) - * model->HSMHV2_depvdsef2 ; - T10_dVg = (Vgp_dVgs + T2_dVg * ( 1.0e0 - T3 ) - T2 * T3_dVg) - * model->HSMHV2_depvdsef2 ; - T10_dT = (Vgp_dT + T2_dT * ( 1.0e0 - T3 ) - T2 * T3_dT) - * model->HSMHV2_depvdsef2 ; - - Fn_SL_CP( T10 , T10 , model->HSMHV2_depleak, 4.0, 4 , T0 ) - T10 = T10 + epsm10 ; - T10_dVb *=T0 ; - T10_dVd *=T0 ; - T10_dVg *=T0 ; - T10_dT *= T0 ; - - T1 = Vdsorg / T10 ; - T2 = Fn_Pow( T1 , here->HSMHV2_ddlt - 1.0e0 ) ; - T7 = T2 * T1 ; - T0 = here->HSMHV2_ddlt * T2 / ( T10 * T10 ) ; - T7_dVb = T0 * ( - Vdsorg * T10_dVb ) ; - T7_dVd = T0 * ( T10 - Vdsorg * T10_dVd ) ; - T7_dVg = T0 * ( - Vdsorg * T10_dVg ) ; - T7_dT = T0 * ( - Vdsorg * T10_dT ) ; - - T3 = 1.0 + T7 ; - T4 = Fn_Pow( T3 , 1.0 / here->HSMHV2_ddlt - 1.0 ) ; - T6 = T4 * T3 ; - T0 = T4 / here->HSMHV2_ddlt ; - T6_dVb = T0 * T7_dVb ; - T6_dVd = T0 * T7_dVd ; - T6_dVg = T0 * T7_dVg ; - T6_dT = T0 * T7_dT ; - - Vdseff0 = Vdsorg / T6 ; - T0 = 1.0 / ( T6 * T6 ) ; - Vdseff0_dVbs = - Vdsorg * T6_dVb * T0 ; - Vdseff0_dVds = ( T6 - Vdsorg * T6_dVd ) * T0 ; - Vdseff0_dVgs = - Vdsorg * T6_dVg * T0 ; - Vdseff0_dT = - Vdsorg * T6_dT * T0 ; - - } else { - - Vdseff0 = Vdsorg ; - Vdseff0_dVgs = 0.0 ; - Vdseff0_dVds = 1.0 ; - Vdseff0_dVbs = 0.0 ; - Vdseff0_dT = 0.0 ; - - } - - T0 = here->HSMHV2_ninvd ; - T4 = 1.0 + ( phi_sL_DEP - phi_s0_DEP ) * T0 ; - T4_dVb = ( phi_sL_DEP_dVbs - phi_s0_DEP_dVbs ) * T0 ; - T4_dVd = ( phi_sL_DEP_dVds - phi_s0_DEP_dVds ) * T0 ; - T4_dVg = ( phi_sL_DEP_dVgs - phi_s0_DEP_dVgs ) * T0 ; - T4_dT = ( phi_sL_DEP_dT - phi_s0_DEP_dT ) * T0 + ( phi_sL_DEP - phi_s0_DEP ) * ninvd_dT ; - - Qiu = - Qn_res0 ; - Qiu_dVgs = - Qn_res0_dVgs ; - Qiu_dVds = - Qn_res0_dVds ; - Qiu_dVbs = - Qn_res0_dVbs ; - Qiu_dT = - Qn_res0_dT ; - - T5 = Qiu ; - T5_dVb = Qiu_dVbs ; - T5_dVd = Qiu_dVds ; - T5_dVg = Qiu_dVgs ; - T5_dT = Qiu_dT ; - - T3 = T5 / T4 ; - T3_dVb = ( - T4_dVb * T5 + T4 * T5_dVb ) / T4 / T4 ; - T3_dVd = ( - T4_dVd * T5 + T4 * T5_dVd ) / T4 / T4 ; - T3_dVg = ( - T4_dVg * T5 + T4 * T5_dVg ) / T4 / T4 ; - T3_dT = ( - T4_dT * T5 + T4 * T5_dT ) / T4 / T4 ; - - Eeff = T3 ; - Eeff_dVbs = T3_dVb ; - Eeff_dVds = T3_dVd ; - Eeff_dVgs = T3_dVg ; - Eeff_dT = T3_dT ; - - T5 = Fn_Pow( Eeff , model->HSMHV2_depmueph0 - 1.0e0 ) ; - T8 = T5 * Eeff ; - T8_dT = model->HSMHV2_mueph0 * T5 * Eeff_dT ; - - T9 = C_QE * C_m2cm_p2 ; - Rns = Qiu / T9 ; - Rns_dT = Qiu_dT / T9 ; - - T1 = 1.0e0 / ( model->HSMHV2_depmue0 + model->HSMHV2_depmue1 * Rns / 1.0e11 ) - + here->HSMHV2_depmphn0 * T8 ; - - T1_dT = - 1.0e0 / ( model->HSMHV2_depmue0 + model->HSMHV2_depmue1 * Rns / 1.0e11 ) - / ( model->HSMHV2_depmue0 + model->HSMHV2_depmue1 * Rns / 1.0e11 ) - * model->HSMHV2_depmue1 * Rns_dT / 1.0e11 - + here->HSMHV2_depmphn0 * T8_dT + depmphn0_dT * T8 ; - - Muun = 1.0e0 / T1 ; - Muun_dT = - Muun / T1 * T1_dT ; - - T1 = 1.0e0 / ( T1 * T1 ) ; - T2 = model->HSMHV2_depmue0 + model->HSMHV2_depmue1 * Rns / 1.0e11 ; - T2 = 1.0e0 / ( T2 * T2 ) ; - T3 = here->HSMHV2_depmphn1 * T5 ; - T5 = - 1.0e-11 * model->HSMHV2_depmue1 / C_QE * T2 / C_m2cm_p2 ; - Muun_dVbs = - ( T5 * Qiu_dVbs - + Eeff_dVbs * T3 ) * T1 ; - Muun_dVds = - ( T5 * Qiu_dVds - + Eeff_dVds * T3 ) * T1 ; - Muun_dVgs = - ( T5 * Qiu_dVgs - + Eeff_dVgs * T3 ) * T1 ; - - /* Change to MKS unit */ - Muun /=C_m2cm_p2 ; - Muun_dT /=C_m2cm_p2 ; - Muun_dVbs /=C_m2cm_p2 ; - Muun_dVds /=C_m2cm_p2 ; - Muun_dVgs /=C_m2cm_p2 ; - - Edri = Vdseff0 / Lch ; - Edri_dVgs = Vdseff0_dVgs / Lch ; - Edri_dVds = Vdseff0_dVds / Lch ; - Edri_dVbs = Vdseff0_dVbs / Lch ; - Edri_dT = Vdseff0_dT / Lch ; - - T1 = Muun * Edri / here->HSMHV2_depvmax ; - T1_dVgs = (Muun_dVgs * Edri + Muun * Edri_dVgs) / here->HSMHV2_depvmax ; - T1_dVds = (Muun_dVds * Edri + Muun * Edri_dVds) / here->HSMHV2_depvmax ; - T1_dVbs = (Muun_dVbs * Edri + Muun * Edri_dVbs) / here->HSMHV2_depvmax ; - T1_dT = (Muun_dT * Edri + Muun * Edri_dT) / here->HSMHV2_depvmax - - Muun * Edri / here->HSMHV2_depvmax / here->HSMHV2_depvmax * depVmax_dT ; - - T1 = T1 + small ; - T2 = Fn_Pow(T1,model->HSMHV2_depbb) ; - T2_dVgs = model->HSMHV2_depbb * T1_dVgs / T1 * T2 ; - T2_dVds = model->HSMHV2_depbb * T1_dVds / T1 * T2 ; - T2_dVbs = model->HSMHV2_depbb * T1_dVbs / T1 * T2 ; - T2_dT = model->HSMHV2_depbb * T1_dT / T1 * T2 ; - - T3 = 1.0 + T2 ; - T4 = Fn_Pow(T3,1.0 / model->HSMHV2_depbb) ; - T4_dVgs = 1.0 / model->HSMHV2_depbb * T2_dVgs / T3 * T4 ; - T4_dVds = 1.0 / model->HSMHV2_depbb * T2_dVds / T3 * T4 ; - T4_dVbs = 1.0 / model->HSMHV2_depbb * T2_dVbs / T3 * T4 ; - T4_dT = 1.0 / model->HSMHV2_depbb * T2_dT / T3 * T4 ; - - Mu_res = Muun / T4 ; - Mu_res_dVgs = Muun_dVgs / T4 - Muun / T4 / T4 * T4_dVgs ; - Mu_res_dVds = Muun_dVds / T4 - Muun / T4 / T4 * T4_dVds ; - Mu_res_dVbs = Muun_dVbs / T4 - Muun / T4 / T4 * T4_dVbs ; - Mu_res_dT = Muun_dT / T4 - Muun / T4 / T4 * T4_dT ; - - Ids_res = here->HSMHV2_weff_nf * ( - Qn_res0) * Mu_res * Edri ; - Ids_res_dVgs = here->HSMHV2_weff_nf * ( - Qn_res0_dVgs * Mu_res * Edri - - Qn_res0 * Mu_res_dVgs * Edri - Qn_res0 * Mu_res * Edri_dVgs) ; - Ids_res_dVds = here->HSMHV2_weff_nf * ( - Qn_res0_dVds * Mu_res * Edri - - Qn_res0 * Mu_res_dVds * Edri - Qn_res0 * Mu_res * Edri_dVds) ; - Ids_res_dVbs = here->HSMHV2_weff_nf * ( - Qn_res0_dVbs * Mu_res * Edri - - Qn_res0 * Mu_res_dVbs * Edri - Qn_res0 * Mu_res * Edri_dVbs) ; - Ids_res_dT = here->HSMHV2_weff_nf * ( - Qn_res0_dT * Mu_res * Edri - - Qn_res0 * Mu_res_dT * Edri - Qn_res0 * Mu_res * Edri_dT ) ; - - //-----------------------------------------------------------* - //* back region universal mobility. (CGS unit) - //*-----------------// - - T0 = here->HSMHV2_ninvd ; - T4 = 1.0 + ( phi_sL_DEP - phi_s0_DEP ) * T0 ; - T4_dVb = ( phi_sL_DEP_dVbs - phi_s0_DEP_dVbs ) * T0 ; - T4_dVd = ( phi_sL_DEP_dVds - phi_s0_DEP_dVds ) * T0 ; - T4_dVg = ( phi_sL_DEP_dVgs - phi_s0_DEP_dVgs ) * T0 ; - T4_dT = ( phi_sL_DEP_dT - phi_s0_DEP_dT ) * T0 + ( phi_sL_DEP - phi_s0_DEP ) * ninvd_dT ; - - Qiu = - Qn_bac0 ; - Qiu_dVgs = - Qn_bac0_dVgs ; - Qiu_dVds = - Qn_bac0_dVds ; - Qiu_dVbs = - Qn_bac0_dVbs ; - Qiu_dT = - Qn_bac0_dT ; - - T5 = Qiu ; - T5_dVb = Qiu_dVbs ; - T5_dVd = Qiu_dVds ; - T5_dVg = Qiu_dVgs ; - T5_dT = Qiu_dT ; - - T3 = T5 / T4 ; - T3_dVb = ( - T4_dVb * T5 + T4 * T5_dVb ) / T4 / T4 ; - T3_dVd = ( - T4_dVd * T5 + T4 * T5_dVd ) / T4 / T4 ; - T3_dVg = ( - T4_dVg * T5 + T4 * T5_dVg ) / T4 / T4 ; - T3_dT = ( - T4_dT * T5 + T4 * T5_dT ) / T4 / T4 ; - Eeff = T3 ; - Eeff_dVbs = T3_dVb ; - Eeff_dVds = T3_dVd ; - Eeff_dVgs = T3_dVg ; - Eeff_dT = T3_dT ; - - T5 = Fn_Pow( Eeff , model->HSMHV2_depmueph0 - 1.0e0 ) ; - T8 = T5 * Eeff ; - T8_dT = model->HSMHV2_mueph0 * T5 * Eeff_dT ; - - T9 = C_QE * C_m2cm_p2 ; - Rns = Qiu / T9 ; - Rns_dT = Qiu_dT / T9 ; - - T1 = 1.0e0 / ( model->HSMHV2_depmueback0 + model->HSMHV2_depmueback1 * Rns / 1.0e11 ) - + here->HSMHV2_depmphn0 * T8 ; - - T1_dT = - 1.0e0 / ( model->HSMHV2_depmueback0 + model->HSMHV2_depmueback1 * Rns / 1.0e11 ) - / ( model->HSMHV2_depmueback0 + model->HSMHV2_depmueback1 * Rns / 1.0e11 ) - * model->HSMHV2_depmueback1 * Rns_dT / 1.0e11 - + here->HSMHV2_depmphn0 * T8_dT + depmphn0_dT * T8 ; - - Muun = 1.0e0 / T1 ; - Muun_dT = - Muun / T1 * T1_dT ; - - T1 = 1.0e0 / ( T1 * T1 ) ; - T2 = model->HSMHV2_depmueback0 + model->HSMHV2_depmueback1 * Rns / 1.0e11 ; - T2 = 1.0e0 / ( T2 * T2 ) ; - T3 = here->HSMHV2_depmphn1 * T5 ; - T5 = - 1.0e-11 * model->HSMHV2_depmueback1 / C_QE * T2 / C_m2cm_p2 ; - Muun_dVbs = - ( T5 * Qiu_dVbs - + Eeff_dVbs * T3 ) * T1 ; - Muun_dVds = - ( T5 * Qiu_dVds - + Eeff_dVds * T3 ) * T1 ; - Muun_dVgs = - ( T5 * Qiu_dVgs - + Eeff_dVgs * T3 ) * T1 ; - - /* Change to MKS unit */ - Muun /=C_m2cm_p2 ; - Muun_dT /=C_m2cm_p2 ; - Muun_dVbs /=C_m2cm_p2 ; - Muun_dVds /=C_m2cm_p2 ; - Muun_dVgs /=C_m2cm_p2 ; - - Edri = Vdseff0 / Lch ; - Edri_dVgs = Vdseff0_dVgs / Lch ; - Edri_dVds = Vdseff0_dVds / Lch ; - Edri_dVbs = Vdseff0_dVbs / Lch ; - Edri_dT = Vdseff0_dT / Lch ; - - T1 = Muun * Edri / here->HSMHV2_depvmax ; - T1_dVgs = (Muun_dVgs * Edri + Muun * Edri_dVgs) / here->HSMHV2_depvmax ; - T1_dVds = (Muun_dVds * Edri + Muun * Edri_dVds) / here->HSMHV2_depvmax ; - T1_dVbs = (Muun_dVbs * Edri + Muun * Edri_dVbs) / here->HSMHV2_depvmax ; - T1_dT = (Muun_dT * Edri + Muun * Edri_dT) / here->HSMHV2_depvmax - - Muun * Edri / here->HSMHV2_depvmax / here->HSMHV2_depvmax * depVmax_dT ; - - T1 = T1 + small ; - T2 = Fn_Pow(T1,model->HSMHV2_depbb) ; - T2_dVgs = model->HSMHV2_depbb * T1_dVgs / T1 * T2 ; - T2_dVds = model->HSMHV2_depbb * T1_dVds / T1 * T2 ; - T2_dVbs = model->HSMHV2_depbb * T1_dVbs / T1 * T2 ; - T2_dT = model->HSMHV2_depbb * T1_dT / T1 * T2 ; - - T3 = 1.0 + T2 ; - T4 = Fn_Pow(T3,1.0 / model->HSMHV2_depbb) ; - T4_dVgs = 1.0 / model->HSMHV2_depbb * T2_dVgs / T3 * T4 ; - T4_dVds = 1.0 / model->HSMHV2_depbb * T2_dVds / T3 * T4 ; - T4_dVbs = 1.0 / model->HSMHV2_depbb * T2_dVbs / T3 * T4 ; - T4_dT = 1.0 / model->HSMHV2_depbb * T2_dT / T3 * T4 ; - - - Mu_bac = Muun / T4 ; - Mu_bac_dVgs = Muun_dVgs / T4 - Muun / T4 / T4 * T4_dVgs ; - Mu_bac_dVds = Muun_dVds / T4 - Muun / T4 / T4 * T4_dVds ; - Mu_bac_dVbs = Muun_dVbs / T4 - Muun / T4 / T4 * T4_dVbs ; - Mu_bac_dT = Muun_dT / T4 - Muun / T4 / T4 * T4_dT ; - - Ids_bac = here->HSMHV2_weff_nf * ( - Qn_bac0) * Mu_bac * Edri ; - Ids_bac_dVgs = here->HSMHV2_weff_nf * ( - Qn_bac0_dVgs * Mu_bac * Edri - - Qn_bac0 * Mu_bac_dVgs * Edri - Qn_bac0 * Mu_bac * Edri_dVgs) ; - Ids_bac_dVds = here->HSMHV2_weff_nf * ( - Qn_bac0_dVds * Mu_bac * Edri - - Qn_bac0 * Mu_bac_dVds * Edri - Qn_bac0 * Mu_bac * Edri_dVds) ; - Ids_bac_dVbs = here->HSMHV2_weff_nf * ( - Qn_bac0_dVbs * Mu_bac * Edri - - Qn_bac0 * Mu_bac_dVbs * Edri - Qn_bac0 * Mu_bac * Edri_dVbs) ; - Ids_bac_dT = here->HSMHV2_weff_nf * ( - Qn_bac0_dT * Mu_bac * Edri - - Qn_bac0 * Mu_bac_dT * Edri - Qn_bac0 * Mu_bac * Edri_dT ) ; - - /*-----------------------------------------------------------* - * Ids: channel current. - *-----------------*/ - betaWL = here->HSMHV2_weff_nf * beta_inv / Lch ; - T1 = - betaWL / Lch ; - betaWL_dT = here->HSMHV2_weff_nf * beta_inv_dT / Lch ; - - Ids0 = betaWL * Idd * Mu + Ids_res + Ids_bac ; - - Ids0_dVgs = betaWL * ( Idd_dVgs * Mu + Idd * Mu_dVgs ) - + Ids_res_dVgs + Ids_bac_dVgs ; - Ids0_dVds = betaWL * ( Idd_dVds * Mu + Idd * Mu_dVds ) - + Ids_res_dVds + Ids_bac_dVds ; - Ids0_dVbs = betaWL * ( Idd_dVbs * Mu + Idd * Mu_dVbs ) - + Ids_res_dVbs + Ids_bac_dVbs ; - Ids0_dT = betaWL_dT * Idd * Mu + betaWL * ( Idd_dT * Mu + Idd * Mu_dT ) - + Ids_res_dT + Ids_bac_dT ; - - // Vdseff // - - Vds = Vdsorg; - - /*-----------------------------------------------------------* - * Adding parasitic components to the channel current. - *-----------------*/ - if( model->HSMHV2_ptl != 0 ){ - T1 = 0.5 * ( Vds - Pds ) ; - Fn_SymAdd( T6 , T1 , 0.01 , T2 ) ; - T2 *=0.5 ; - T6_dVb = T2 * ( - Pds_dVbs ) ; - T6_dVd = T2 * ( 1.0 - Pds_dVds ) ; - T6_dVg = T2 * ( - Pds_dVgs ) ; - T6_dT = T2 * ( - Pds_dT ) ; - - T1 = 1.1 - ( phi_s0_DEP + T6 ); - T1_dVb = - ( phi_s0_DEP_dVbs + T6_dVb ); - T1_dVd = - ( phi_s0_DEP_dVds + T6_dVd ); - T1_dVg = - ( phi_s0_DEP_dVgs + T6_dVg ); - T1_dT = - ( phi_s0_DEP_dT + T6_dT ); - - Fn_SZ( T2 , T1 , 0.05 , T0 ) ; - T2 +=small ; - T2_dVb = T1_dVb * T0 ; - T2_dVd = T1_dVd * T0 ; - T2_dVg = T1_dVg * T0 ; - T2_dT = T1_dT * T0 ; - - T0 = beta * here->HSMHV2_ptl0 ; - T0_dT = beta_dT * here->HSMHV2_ptl0 ; - T3 = Cox * T0 ; - T3_dVb = Cox_dVb * T0 ; - T3_dVd = Cox_dVd * T0 ; - T3_dVg = Cox_dVg * T0 ; - T3_dT = Cox_dT * T0 + Cox * T0_dT ; - T0 = pow( T2 , model->HSMHV2_ptp ) ; - T9 = T3 * T0 ; - T9_dVb = T3 * model->HSMHV2_ptp * T0 / T2 * T2_dVb + T3_dVb * T0 ; - T9_dVd = T3 * model->HSMHV2_ptp * T0 / T2 * T2_dVd + T3_dVd * T0 ; - T9_dVg = T3 * model->HSMHV2_ptp * T0 / T2 * T2_dVg + T3_dVg * T0 ; - T9_dT = T3 * model->HSMHV2_ptp * T0 / T2 * T2_dT + T3_dT * T0 ; - - - T4 = 1.0 + Vdsz * model->HSMHV2_pt2 ; - T4_dVb = Vdsz_dVbs * model->HSMHV2_pt2 ; - T4_dVd = Vdsz_dVds * model->HSMHV2_pt2 ; - T4_dVg = 0.0 ; - T4_dT = Vdsz_dT * model->HSMHV2_pt2 ; - - T0 = here->HSMHV2_pt40 ; - T5 = phi_s0_DEP + T6 - Vbsz ; - T5_dVb = phi_s0_DEP_dVbs + T6_dVb - Vbsz_dVbs ; - T5_dVd = phi_s0_DEP_dVds + T6_dVd - Vbsz_dVds ; - T5_dVg = phi_s0_DEP_dVgs + T6_dVg ; - T5_dT = phi_s0_DEP_dT + T6_dT - Vbsz_dT ; - T4 +=Vdsz * T0 * T5 ; - T4_dVb +=Vdsz * T0 * T5_dVb + Vdsz_dVbs * T0 * T5 ; - T4_dVd +=Vdsz * T0 * T5_dVd + Vdsz_dVds * T0 * T5 ; - T4_dVg +=Vdsz * T0 * T5_dVg ; - T4_dT +=Vdsz * T0 * T5_dT + Vdsz_dT * T0 * T5 ; - T6 = T9 * T4 ; - T9_dVb = T9_dVb * T4 + T9 * T4_dVb ; - T9_dVd = T9_dVd * T4 + T9 * T4_dVd ; - T9_dVg = T9_dVg * T4 + T9 * T4_dVg ; - T9_dT = T9_dT * T4 + T9 * T4_dT ; - T9 = T6 ; - - } else { - T9 = 0.0 ; - T9_dVb = 0.0 ; - T9_dVd = 0.0 ; - T9_dVg = 0.0 ; - T9_dT = 0.0 ; - } - - if( model->HSMHV2_gdl != 0 ){ - T1 = beta * here->HSMHV2_gdl0 ; - T1_dT = beta_dT * here->HSMHV2_gdl0 ; - T2 = Cox * T1 ; - T2_dVb = Cox_dVb * T1 ; - T2_dVd = Cox_dVd * T1 ; - T2_dVg = Cox_dVg * T1 ; - T2_dT = Cox_dT * T1 + Cox * T1_dT ; - T8 = T2 * Vdsz ; - T8_dVb = T2_dVb * Vdsz + T2 * Vdsz_dVbs ; - T8_dVd = T2_dVd * Vdsz + T2 * Vdsz_dVds ; - T8_dVg = T2_dVg * Vdsz ; - T8_dT = T2_dT * Vdsz + T2 * Vdsz_dT ; - } else { - T8 = 0.0 ; - T8_dVb = 0.0 ; - T8_dVd = 0.0 ; - T8_dVg = 0.0 ; - T8_dT = 0.0 ; - } - - if ( ( T9 + T8 ) > 0.0 ) { - Idd1 = Pds * ( T9 + T8 ) ; - Idd1_dVbs = Pds_dVbs * ( T9 + T8 ) + Pds * ( T9_dVb + T8_dVb ) ; - Idd1_dVds = Pds_dVds * ( T9 + T8 ) + Pds * ( T9_dVd + T8_dVd ) ; - Idd1_dVgs = Pds_dVgs * ( T9 + T8 ) + Pds * ( T9_dVg + T8_dVg ) ; - Idd1_dT = Pds_dT * ( T9 + T8 ) + Pds * ( T9_dT + T8_dT ) ; - - Ids0 +=betaWL * Idd1 * Mu ; - T1 = betaWL * Idd1 ; - T2 = Idd1 * Mu ; - T3 = Mu * betaWL ; - Ids0_dVbs +=T3 * Idd1_dVbs + T1 * Mu_dVbs + T2 * betaWL_dVbs ; - Ids0_dVds +=T3 * Idd1_dVds + T1 * Mu_dVds + T2 * betaWL_dVds ; - Ids0_dVgs +=T3 * Idd1_dVgs + T1 * Mu_dVgs + T2 * betaWL_dVgs ; - Ids0_dT +=T3 * Idd1_dT + T1 * Mu_dT + T2 * betaWL_dT ; - } - - - /* note: rpock procedure was removed. */ - if( flg_rsrd == 2 || flg_rsrd == 3 ){ - if( model->HSMHV2_rd20 > 0.0 ){ - T4 = here->HSMHV2_rd23 ; - T1 = pParam->HSMHV2_rd24 * ( Vgse-model->HSMHV2_rd25 ) ; - T1_dVg = pParam->HSMHV2_rd24 ; - - Fn_SL( T2 , T1 , T4 , delta_rd , T0 ) ; - T2_dVg = T1_dVg * T0 ; - T3 = T4 * ( model->HSMHV2_rd20 + 1.0 ) ; - Fn_SU( T7 , T2 , T3 , delta_rd , T0 ) ; - T7_dVg = T2_dVg * T0 ; - - } else { - T7 = here->HSMHV2_rd23; - T7_dVg = 0.0e0 ; - } - - /* after testing we can remove Vdse_eff_dVbs, Vdse_eff_dVds, Vdse_eff_dVgs - and Vdse_eff_dVbse, Vdse_eff_dVgse */ - if (Vdse >= 0.0) { - Vdse_eff = Vdse ; - /* Vdse_eff_dVbs = 0.0 ; */ - /* Vdse_eff_dVds = 0.0 ; */ - /* Vdse_eff_dVgs = 0.0 ; */ - /* Vdse_eff_dVbse = 0.0 ; */ - Vdse_eff_dVdse = 1.0 ; - /* Vdse_eff_dVgse = 0.0 ; */ - } else { - Vdse_eff = 0.0 ; - /* Vdse_eff_dVbs = 0.0 ; */ - /* Vdse_eff_dVds = 0.0 ; */ - /* Vdse_eff_dVgs = 0.0 ; */ - /* Vdse_eff_dVbse = 0.0 ; */ - Vdse_eff_dVdse = 0.0 ; - /* Vdse_eff_dVgse = 0.0 ; */ - } - /* smoothing of Ra for Vdse_eff close to zero */ - /* ... smoothing parameter is Ra_N */ - if (Vdse_eff < Ra_N * small2) { - Ra_alpha = pow( Ra_N + 1.0 , model->HSMHV2_rd21 - 1.0 ) - * (Ra_N + 1.0 - 0.5 * model->HSMHV2_rd21 * Ra_N) - * pow( small2,model->HSMHV2_rd21 ); - Ra_beta = 0.5 * model->HSMHV2_rd21 - * pow( Ra_N + 1.0 , model->HSMHV2_rd21 - 1.0 ) / Ra_N - * pow( small2, model->HSMHV2_rd21 - 2.0 ); - T1 = Ra_alpha + Ra_beta * Vdse_eff * Vdse_eff; - T1_dVdse_eff = 2.0 * Ra_beta * Vdse_eff; - } else { - T1 = pow( Vdse_eff + small2 , model->HSMHV2_rd21 ) ; - T1_dVdse_eff = model->HSMHV2_rd21 * pow( Vdse_eff + small2 , model->HSMHV2_rd21 - 1.0 ) ; - } - - T9 = pow( Vdse_eff + small2 , model->HSMHV2_rd22d ) ; - T9_dVdse_eff = model->HSMHV2_rd22d * pow( Vdse_eff + small2 , model->HSMHV2_rd22d - 1.0 ) ; - - Ra = ( T7 * T1 + Vbse * pParam->HSMHV2_rd22 * T9 ) / here->HSMHV2_weff_nf ; - Ra_dVdse_eff = ( T7 * T1_dVdse_eff + Vbse * pParam->HSMHV2_rd22 * T9_dVdse_eff ) / here->HSMHV2_weff_nf ; - Ra_dVbs = Ra_dVdse_eff * Vdse_eff_dVbs ; - Ra_dVds = Ra_dVdse_eff * Vdse_eff_dVds ; - Ra_dVgs = Ra_dVdse_eff * Vdse_eff_dVgs + T7_dVg * T1 / here->HSMHV2_weff_nf ; - Ra_dVbse = Ra_dVdse_eff * Vdse_eff_dVbse+pParam->HSMHV2_rd22 * T9 / here->HSMHV2_weff_nf ; - Ra_dVdse = Ra_dVdse_eff * Vdse_eff_dVdse ; - Ra_dVgse = Ra_dVdse_eff * Vdse_eff_dVgse ; - T0 = Ra * Ids0 ; - T0_dVb = Ra_dVbs * Ids0 + Ra * Ids0_dVbs ; - T0_dVd = Ra_dVds * Ids0 + Ra * Ids0_dVds ; - T0_dVg = Ra_dVgs * Ids0 + Ra * Ids0_dVgs ; - T0_dT = Ra * Ids0_dT ; - - T1 = Vds + small2 ; - T2 = 1.0 / T1 ; - T3 = 1.0 + T0 * T2 ; - T3_dVb = T0_dVb * T2 ; - T3_dVd = ( T0_dVd * T1 - T0 ) * T2 * T2 ; - T3_dVg = T0_dVg * T2 ; - T3_dT = T0_dT * T2 ; - - T4 = 1.0 / T3 ; - Ids = Ids0 * T4 ; - T5 = T4 * T4 ; - Ids_dVbs = ( Ids0_dVbs * T3 - Ids0 * T3_dVb ) * T5 ; - Ids_dVds = ( Ids0_dVds * T3 - Ids0 * T3_dVd ) * T5 ; - Ids_dVgs = ( Ids0_dVgs * T3 - Ids0 * T3_dVg ) * T5 ; - Ids_dT = ( Ids0_dT * T3 - Ids0 * T3_dT ) * T5 ; - Ids_dRa = - Ids * Ids / ( Vds + small ) ; - - } else { - Ids = Ids0 ; - Ids_dVbs = Ids0_dVbs ; - Ids_dVds = Ids0_dVds ; - Ids_dVgs = Ids0_dVgs ; - Ids_dT = Ids0_dT ; - Ra = 0.0 ; - Ra_dVbs = Ra_dVds = Ra_dVgs = 0.0 ; - Ra_dVbse = Ra_dVdse = Ra_dVgse = 0.0 ; - Ids_dRa = 0.0 ; - } - - /*---------------------------------------------------* - * Qbu : - Qb in unit area. - *-----------------*/ - Qbu = - 0.5 * (Q_sub0 + Q_subL + Q_sub0_dep + Q_subL_dep ) ; - Qbu_dVgs = - 0.5 * ( Q_sub0_dVgs + Q_subL_dVgs + Q_sub0_dep_dVgs + Q_subL_dep_dVgs ) ; - Qbu_dVds = - 0.5 * ( Q_sub0_dVds + Q_subL_dVds + Q_sub0_dep_dVds + Q_subL_dep_dVds ) ; - Qbu_dVbs = - 0.5 * ( Q_sub0_dVbs + Q_subL_dVbs + Q_sub0_dep_dVbs + Q_subL_dep_dVbs ) ; - Qbu_dT = - 0.5 * ( Q_sub0_dT + Q_subL_dT + Q_sub0_dep_dT + Q_subL_dep_dT ) ; - - Qiu = - 0.5 * (Q_n0 + Q_nL + Q_s0_dep + Q_sL_dep + Q_b0_dep + Q_bL_dep) ; - Qiu_dVgs = - 0.5 * ( Q_n0_dVgs + Q_nL_dVgs + Q_s0_dep_dVgs + Q_sL_dep_dVgs + Q_b0_dep_dVgs + Q_bL_dep_dVgs ) ; - Qiu_dVds = - 0.5 * ( Q_n0_dVds + Q_nL_dVds + Q_s0_dep_dVds + Q_sL_dep_dVds + Q_b0_dep_dVds + Q_bL_dep_dVds ) ; - Qiu_dVbs = - 0.5 * ( Q_n0_dVbs + Q_nL_dVbs + Q_s0_dep_dVbs + Q_sL_dep_dVbs + Q_b0_dep_dVbs + Q_bL_dep_dVbs ) ; - Qiu_dT = - 0.5 * ( Q_n0_dT + Q_nL_dT + Q_s0_dep_dT + Q_sL_dep_dT + Q_b0_dep_dT + Q_bL_dep_dT ) ; - - Qdrat = 0.5; - Qdrat_dVgs = 0.0 ; - Qdrat_dVds = 0.0 ; - Qdrat_dVbs = 0.0 ; - Qdrat_dT = 0.0 ; - - /*-------------------------------------------------* - * set flg_noqi - *-----------------*/ - Qiu_noi = - 0.5 * (Q_n0 + Q_nL ) ; - Qn0 = - Q_n0 ; - Qn0_dVgs = - Q_n0_dVgs ; - Qn0_dVds = - Q_n0_dVds ; - Qn0_dVbs = - Q_n0_dVbs ; - Qn0_dT = - Q_n0_dT ; - - Ey = Ey_suf ; - Ey_dVgs = Ey_suf_dVgs ; - Ey_dVds = Ey_suf_dVds ; - Ey_dVbs = Ey_suf_dVbs ; - Ey_dT = Ey_suf_dT ; - - if( Qn0 < small ){ - flg_noqi = 1 ; - } - - -} /* End of hsmhveval_dep */ - - diff --git a/src/spicelib/devices/hisimhv2/hsmhv2eval_dio.c b/src/spicelib/devices/hisimhv2/hsmhv2eval_dio.c deleted file mode 100644 index a8e3807d7..000000000 --- a/src/spicelib/devices/hisimhv2/hsmhv2eval_dio.c +++ /dev/null @@ -1,600 +0,0 @@ -/*********************************************************************** - - HiSIM (Hiroshima University STARC IGFET Model) - Copyright (C) 2014 Hiroshima University & STARC - - MODEL NAME : HiSIM_HV - ( VERSION : 2 SUBVERSION : 2 REVISION : 0 ) - Model Parameter 'VERSION' : 2.20 - FILE : hsmhveval_dio.c - - DATE : 2014.6.11 - - released by - Hiroshima University & - Semiconductor Technology Academic Research Center (STARC) -***********************************************************************/ - -/********************************************************************** - -The following source code, and all copyrights, trade secrets or other -intellectual property rights in and to the source code in its entirety, -is owned by the Hiroshima University and the STARC organization. - -All users need to follow the "HISIM_HV Distribution Statement and -Copyright Notice" attached to HiSIM_HV model. - ------HISIM_HV Distribution Statement and Copyright Notice-------------- - -Software is distributed as is, completely without warranty or service -support. Hiroshima University or STARC and its employees are not liable -for the condition or performance of the software. - -Hiroshima University and STARC own the copyright and grant users a perpetual, -irrevocable, worldwide, non-exclusive, royalty-free license with respect -to the software as set forth below. - -Hiroshima University and STARC hereby disclaims all implied warranties. - -Hiroshima University and STARC grant the users the right to modify, copy, -and redistribute the software and documentation, both within the user's -organization and externally, subject to the following restrictions - -1. The users agree not to charge for Hiroshima University and STARC code -itself but may charge for additions, extensions, or support. - -2. In any product based on the software, the users agree to acknowledge -Hiroshima University and STARC that developed the software. This -acknowledgment shall appear in the product documentation. - -3. The users agree to reproduce any copyright notice which appears on -the software on any copy or modification of such made available -to others." - -Toshimasa Asahara, President, Hiroshima University -Mitiko Miura-Mattausch, Professor, Hiroshima University -Katsuhiro Shimohigashi, President&CEO, STARC -June 2008 (revised October 2011) -*************************************************************************/ - -/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ - * Substrate-source/drain junction diode - *++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ - -/*===========================================================* -* Preamble -*=================*/ -/*---------------------------------------------------* -* Header files -*-----------------*/ -#include "ngspice/ngspice.h" - -/*-----------------------------------* -* HiSIM macros -*-----------------*/ -#include "hisimhv2.h" -#include "hsmhv2evalenv.h" - -/*===========================================================* -* Function HSMHV2dio -*=================*/ -int HSMHV2dio -( - double vbs_jct, - double vbd_jct, - double deltemp, - HSMHV2instance *here, - HSMHV2model *model, - CKTcircuit *ckt - ) -{ - HSMHV2binningParam *pParam = &here->pParam ; - - /* junction currents */ - double Ibs =0.0, Gbs =0.0, Ibs_dT =0.0 ; - double Ibd =0.0, Gbd =0.0, Ibd_dT =0.0 ; - - /* junction capacitances */ - double Qbs =0.0, Capbs =0.0, Qbs_dT =0.0 ; - double Qbd =0.0, Capbd =0.0, Qbd_dT =0.0 ; - double czbd =0.0, czbd_dT=0.0 ; - double czbdsw =0.0, czbdsw_dT=0.0 ; - double czbdswg =0.0, czbdswg_dT=0.0 ; - double czbs =0.0, czbs_dT=0.0 ; - double czbssw =0.0, czbssw_dT=0.0 ; - double czbsswg =0.0, czbsswg_dT=0.0 ; - double arg =0.0, sarg =0.0 ; - - /* temperature-dependent variables for SHE model */ - double log_Tratio =0.0 ; - double TTEMP =0.0, TTEMP0 =0.0 ; - double beta =0.0, beta_dT =0.0 ; - double beta_inv =0.0, beta_inv_dT =0.0 ; - double Eg =0.0, Eg_dT =0.0 ; - double js =0.0, js_dT =0.0 ; - double jssw =0.0, jssw_dT =0.0 ; - double js2 =0.0, js2_dT =0.0 ; - double jssw2 =0.0, jssw2_dT =0.0 ; - - double isbd_dT =0.0, isbs_dT =0.0 ; - double isbd2_dT =0.0, isbs2_dT =0.0 ; - double vbdt_dT =0.0, vbst_dT = 0.0 ; - double jd_expcd_dT =0.0 , jd_expcs_dT =0.0 ; - double jd_nvtm_invd_dT =0.0 , jd_nvtm_invs_dT =0.0 ; - double exptempd_dT = 0.0 , exptemps_dT = 0.0 ; - double tcjbd =0.0, tcjbs =0.0, - tcjbdsw =0.0, tcjbssw =0.0, - tcjbdswg =0.0, tcjbsswg =0.0 ; - - /* options */ - double Mfactor = here->HSMHV2_m; - - /* Internal flags --------------------*/ - int flg_err = 0; /* error level */ - int flg_info = model->HSMHV2_info; - - /* temporary vars. & derivatives */ - double TX =0.0 ; - double T0 =0.0, T0_dT =0.0 ; - double T1 =0.0, T1_dVb =0.0, T1_dT =0.0 ; - double T2 =0.0, T2_dVb =0.0, T2_dT =0.0 ; - double T3 =0.0, T3_dVb =0.0, T3_dT =0.0 ; - double T4 =0.0, T4_dT =0.0 ; - double T9 =0.0, T9_dT =0.0 ; - double T10 =0.0, T10_dT =0.0 ; - double T12 =0.0, T12_dT =0.0 ; - - - /*================ Start of executable code.=================*/ - - /*-----------------------------------------------------------* - * Temperature dependent constants. - *-----------------*/ - if ( here->HSMHV2tempNode > 0 && pParam->HSMHV2_rth0 != 0.0 ) { - -#define HSMHV2EVAL -#include "hsmhv2temp_eval_dio.h" - - } else { - TTEMP = ckt->CKTtemp; - if ( here->HSMHV2_dtemp_Given ) { TTEMP = TTEMP + here->HSMHV2_dtemp ; } - } - - - /*-----------------------------------------------------------* - * Cbsj, Cbdj: node-base S/D biases. - *-----------------*/ - - /* ibd */ - T10 = model->HSMHV2_cvbd * here->HSMHV2_jd_nvtm_invd ; - T10_dT = model->HSMHV2_cvbd * beta_dT / pParam->HSMHV2_njd ; - - T9 = model->HSMHV2_cisbd * here->HSMHV2_exptempd ; - T9_dT = model->HSMHV2_cisbd * exptempd_dT ; - T0 = here->HSMHV2_isbd2 * T9 ; - T0_dT = here->HSMHV2_isbd2 * T9_dT + isbd2_dT * T9 ; - - TX = - vbd_jct * T10 ; - T2 = exp ( TX ); - T2_dVb = - T2 * T10 ; - T2_dT = T2 * TX * beta_dT * beta_inv ; - - T3 = T2 ; - T3_dVb = T2_dVb ; - T3_dT = T2_dT ; - - if ( vbd_jct < here->HSMHV2_vbdt ) { - TX = vbd_jct * here->HSMHV2_jd_nvtm_invd ; - - if ( TX < - 3*EXP_THR ) { - T1 = 0.0 ; - T1_dVb = 0.0 ; - T1_dT = 0.0 ; - } else { - T1 = exp ( TX ) ; - T1_dVb = T1 * here->HSMHV2_jd_nvtm_invd ; - T1_dT = T1 * TX * beta_dT * beta_inv ; - } - - Ibd = here->HSMHV2_isbd * (T1 - 1.0) - + T0 * (T2 - 1.0) - + pParam->HSMHV2_cisbkd * (T3 - 1.0); - Gbd = here->HSMHV2_isbd * T1_dVb - + T0 * T2_dVb - + pParam->HSMHV2_cisbkd * T3_dVb ; - Ibd_dT = here->HSMHV2_isbd * T1_dT + isbd_dT * ( T1 - 1.0 ) - + T0 * T2_dT + T0_dT * ( T2 - 1.0 ) - + pParam->HSMHV2_cisbkd * T3_dT ; - - } else { - T1 = here->HSMHV2_jd_expcd ; - - T4 = here->HSMHV2_isbd * here->HSMHV2_jd_nvtm_invd * T1 ; - - Ibd = here->HSMHV2_isbd * (T1 - 1.0) - + T4 * (vbd_jct - here->HSMHV2_vbdt) - + T0 * (T2 - 1.0) - + pParam->HSMHV2_cisbkd * (T3 - 1.0) ; - Gbd = T4 - + T0 * T2_dVb - + pParam->HSMHV2_cisbkd * T3_dVb ; - - T1_dT = jd_expcd_dT ; - T4_dT = isbd_dT * here->HSMHV2_jd_nvtm_invd * T1 - + here->HSMHV2_isbd * jd_nvtm_invd_dT * T1 - + here->HSMHV2_isbd * here->HSMHV2_jd_nvtm_invd * T1_dT ; - Ibd_dT = isbd_dT * ( T1 - 1.0 ) + here->HSMHV2_isbd * T1_dT - + T4_dT * ( vbd_jct - here->HSMHV2_vbdt ) - T4 * vbdt_dT - + T0_dT * ( T2 - 1.0 ) + T0 * T2_dT - + pParam->HSMHV2_cisbkd * T3_dT ; - } - T12 = model->HSMHV2_divxd * here->HSMHV2_isbd2 ; - Ibd += T12 * vbd_jct ; - Gbd += T12 ; - - T12_dT = model->HSMHV2_divxd * isbd2_dT ; - Ibd_dT += T12_dT * vbd_jct ; - - /* ibs */ - T10 = model->HSMHV2_cvbs * here->HSMHV2_jd_nvtm_invs ; - T10_dT = model->HSMHV2_cvbs * beta_dT / pParam->HSMHV2_njs ; - - T9 = model->HSMHV2_cisbs * here->HSMHV2_exptemps ; - T9_dT = model->HSMHV2_cisbs * exptemps_dT ; - T0 = here->HSMHV2_isbs2 * T9 ; - T0_dT = here->HSMHV2_isbs2 * T9_dT + isbs2_dT * T9 ; - - TX = - vbs_jct * T10 ; - T2 = exp ( TX ); - T2_dVb = - T2 * T10 ; - T2_dT = T2 * TX * beta_dT * beta_inv ; - - T3 = T2 ; - T3_dVb = T2_dVb ; - T3_dT = T2_dT ; - - if ( vbs_jct < here->HSMHV2_vbst ) { - TX = vbs_jct * here->HSMHV2_jd_nvtm_invs ; - if ( TX < - 3*EXP_THR ) { - T1 = 0.0 ; - T1_dVb = 0.0 ; - T1_dT = 0.0 ; - } else { - T1 = exp ( TX ) ; - T1_dVb = T1 * here->HSMHV2_jd_nvtm_invs ; - T1_dT = T1 * TX * beta_dT * beta_inv ; - } - Ibs = here->HSMHV2_isbs * (T1 - 1.0) - + T0 * (T2 - 1.0) - + pParam->HSMHV2_cisbks * (T3 - 1.0); - Gbs = here->HSMHV2_isbs * T1_dVb - + T0 * T2_dVb - + pParam->HSMHV2_cisbks * T3_dVb ; - Ibs_dT = here->HSMHV2_isbs * T1_dT + isbs_dT * ( T1 - 1.0 ) - + T0 * T2_dT + T0_dT * ( T2 - 1.0 ) - + pParam->HSMHV2_cisbks * T3_dT ; - } else { - T1 = here->HSMHV2_jd_expcs ; - - T4 = here->HSMHV2_isbs * here->HSMHV2_jd_nvtm_invs * T1 ; - - Ibs = here->HSMHV2_isbs * (T1 - 1.0) - + T4 * (vbs_jct - here->HSMHV2_vbst) - + T0 * (T2 - 1.0) - + pParam->HSMHV2_cisbks * (T3 - 1.0) ; - Gbs = T4 - + T0 * T2_dVb - + pParam->HSMHV2_cisbks * T3_dVb ; - - T1_dT = jd_expcs_dT ; - T4_dT = isbs_dT * here->HSMHV2_jd_nvtm_invs * T1 - + here->HSMHV2_isbs * jd_nvtm_invs_dT * T1 - + here->HSMHV2_isbs * here->HSMHV2_jd_nvtm_invs * T1_dT ; - Ibs_dT = isbs_dT * ( T1 - 1.0 ) + here->HSMHV2_isbs * T1_dT - + T4_dT * ( vbs_jct - here->HSMHV2_vbst) - T4 * vbst_dT - + T0_dT * ( T2 - 1.0 ) + T0 * T2_dT - + pParam->HSMHV2_cisbks * T3_dT ; - } - T12 = model->HSMHV2_divxs * here->HSMHV2_isbs2 ; - Ibs += T12 * vbs_jct ; - Gbs += T12 ; - - T12_dT = model->HSMHV2_divxs * isbs2_dT ; - Ibs_dT += T12_dT * vbs_jct ; - - - /*-----------------------------------------------------------* - * Charges and Capacitances. - *-----------------*/ - /* charge storage elements - * bulk-drain and bulk-source depletion capacitances - * czbd : zero bias drain junction capacitance - * czbs : zero bias source junction capacitance - * czbdsw:zero bias drain junction sidewall capacitance - * czbssw:zero bias source junction sidewall capacitance - */ - - /* Source Bulk Junction */ - tcjbs = model->HSMHV2_tcjbs ; - tcjbssw = model->HSMHV2_tcjbssw ; - tcjbsswg = model->HSMHV2_tcjbsswg ; - - czbs = model->HSMHV2_cjs * here->HSMHV2_as ; - czbs = czbs * ( 1.0 + tcjbs * ( TTEMP - model->HSMHV2_ktnom )) ; - czbs_dT = ( model->HSMHV2_cjs * here->HSMHV2_as ) * tcjbs ; - - if (here->HSMHV2_ps > here->HSMHV2_weff_nf) { - czbssw = model->HSMHV2_cjsws * ( here->HSMHV2_ps - here->HSMHV2_weff_nf ) ; - czbssw = czbssw * ( 1.0 + tcjbssw * ( TTEMP - model->HSMHV2_ktnom )) ; - czbssw_dT = ( model->HSMHV2_cjsws * ( here->HSMHV2_ps - here->HSMHV2_weff_nf )) * tcjbssw ; - - czbsswg = model->HSMHV2_cjswgs * here->HSMHV2_weff_nf ; - czbsswg = czbsswg * ( 1.0 + tcjbsswg * ( TTEMP - model->HSMHV2_ktnom )) ; - czbsswg_dT = ( model->HSMHV2_cjswgs * here->HSMHV2_weff_nf ) * tcjbsswg ; - -// if (vbs_jct == 0.0) { - if (0) { - Qbs = 0.0 ; - Qbs_dT = 0.0 ; - Capbs = czbs + czbssw + czbsswg ; - } else if (vbs_jct < 0.0) { - if (czbs > 0.0) { - arg = 1.0 - vbs_jct / model->HSMHV2_pbs ; - if (model->HSMHV2_mjs == 0.5) - sarg = 1.0 / sqrt(arg) ; - else - sarg = Fn_Pow( arg , -model->HSMHV2_mjs ) ; - Qbs = model->HSMHV2_pbs * czbs * (1.0 - arg * sarg) / (1.0 - model->HSMHV2_mjs) ; - Qbs_dT = model->HSMHV2_pbs * czbs_dT * (1.0 - arg * sarg) / (1.0 - model->HSMHV2_mjs) ; - Capbs = czbs * sarg ; - } else { - Qbs = 0.0 ; - Qbs_dT = 0.0 ; - Capbs = 0.0 ; - } - if (czbssw > 0.0) { - arg = 1.0 - vbs_jct / model->HSMHV2_pbsws ; - if (model->HSMHV2_mjsws == 0.5) - sarg = 1.0 / sqrt(arg) ; - else - sarg = Fn_Pow( arg , -model->HSMHV2_mjsws ) ; - Qbs += model->HSMHV2_pbsws * czbssw * (1.0 - arg * sarg) / (1.0 - model->HSMHV2_mjsws) ; - Qbs_dT += model->HSMHV2_pbsws * czbssw_dT * (1.0 - arg * sarg) / (1.0 - model->HSMHV2_mjsws) ; - Capbs += czbssw * sarg ; - } - if (czbsswg > 0.0) { - arg = 1.0 - vbs_jct / model->HSMHV2_pbswgs ; - if (model->HSMHV2_mjswgs == 0.5) - sarg = 1.0 / sqrt(arg) ; - else - sarg = Fn_Pow( arg , -model->HSMHV2_mjswgs ) ; - Qbs += model->HSMHV2_pbswgs * czbsswg * (1.0 - arg * sarg) / (1.0 - model->HSMHV2_mjswgs) ; - Qbs_dT += model->HSMHV2_pbswgs * czbsswg_dT * (1.0 - arg * sarg) / (1.0 - model->HSMHV2_mjswgs) ; - Capbs += czbsswg * sarg ; - } - } else { - T1 = czbs + czbssw + czbsswg ; - T1_dT = czbs_dT + czbssw_dT + czbsswg_dT ; - T2 = czbs * model->HSMHV2_mjs / model->HSMHV2_pbs - + czbssw * model->HSMHV2_mjsws / model->HSMHV2_pbsws - + czbsswg * model->HSMHV2_mjswgs / model->HSMHV2_pbswgs ; - T2_dT = czbs_dT * model->HSMHV2_mjs / model->HSMHV2_pbs - + czbssw_dT * model->HSMHV2_mjsws / model->HSMHV2_pbsws - + czbsswg_dT * model->HSMHV2_mjswgs / model->HSMHV2_pbswgs ; - Qbs = vbs_jct * (T1 + vbs_jct * 0.5 * T2) ; - Qbs_dT = vbs_jct * (T1_dT + vbs_jct * 0.5 * T2_dT) ; - Capbs = T1 + vbs_jct * T2 ; - } - } else { - czbsswg = model->HSMHV2_cjswgs * here->HSMHV2_ps ; - czbsswg = czbsswg * ( 1.0 + tcjbsswg * ( TTEMP - model->HSMHV2_ktnom )) ; - czbsswg_dT = ( model->HSMHV2_cjswgs * here->HSMHV2_ps ) * tcjbsswg ; - -// if (vbs_jct == 0.0) { - if (0) { - Qbs = 0.0 ; - Qbs_dT = 0.0 ; - Capbs = czbs + czbsswg ; - } else if (vbs_jct < 0.0) { - if (czbs > 0.0) { - arg = 1.0 - vbs_jct / model->HSMHV2_pbs ; - if (model->HSMHV2_mjs == 0.5) - sarg = 1.0 / sqrt(arg) ; - else - sarg = Fn_Pow( arg , -model->HSMHV2_mjs ) ; - Qbs = model->HSMHV2_pbs * czbs * (1.0 - arg * sarg) / (1.0 - model->HSMHV2_mjs) ; - Qbs_dT = model->HSMHV2_pbs * czbs_dT * (1.0 - arg * sarg) / (1.0 - model->HSMHV2_mjs) ; - Capbs = czbs * sarg ; - } else { - Qbs = 0.0 ; - Qbs_dT = 0.0 ; - Capbs = 0.0 ; - } - if (czbsswg > 0.0) { - arg = 1.0 - vbs_jct / model->HSMHV2_pbswgs ; - if (model->HSMHV2_mjswgs == 0.5) - sarg = 1.0 / sqrt(arg) ; - else - sarg = Fn_Pow( arg , -model->HSMHV2_mjswgs ) ; - Qbs += model->HSMHV2_pbswgs * czbsswg * (1.0 - arg * sarg) / (1.0 - model->HSMHV2_mjswgs) ; - Qbs_dT += model->HSMHV2_pbswgs * czbsswg_dT * (1.0 - arg * sarg) / (1.0 - model->HSMHV2_mjswgs) ; - Capbs += czbsswg * sarg ; - } - } else { - T1 = czbs + czbsswg ; - T1_dT = czbs_dT + czbsswg_dT ; - T2 = czbs * model->HSMHV2_mjs / model->HSMHV2_pbs - + czbsswg * model->HSMHV2_mjswgs / model->HSMHV2_pbswgs ; - T2_dT = czbs_dT * model->HSMHV2_mjs / model->HSMHV2_pbs - + czbsswg_dT * model->HSMHV2_mjswgs / model->HSMHV2_pbswgs ; - Qbs = vbs_jct * (T1 + vbs_jct * 0.5 * T2) ; - Qbs_dT = vbs_jct * (T1_dT + vbs_jct * 0.5 * T2_dT) ; - Capbs = T1 + vbs_jct * T2 ; - } - } - - /* Drain Bulk Junction */ - tcjbd = model->HSMHV2_tcjbd ; - tcjbdsw = model->HSMHV2_tcjbdsw ; - tcjbdswg = model->HSMHV2_tcjbdswg ; - - czbd = model->HSMHV2_cjd * here->HSMHV2_ad ; - czbd = czbd * ( 1.0 + tcjbd * ( TTEMP - model->HSMHV2_ktnom )) ; - czbd_dT = ( model->HSMHV2_cjd * here->HSMHV2_ad ) * tcjbd ; - - if (here->HSMHV2_pd > here->HSMHV2_weff_nf) { - - czbdsw = model->HSMHV2_cjswd * ( here->HSMHV2_pd - here->HSMHV2_weff_nf ) ; - czbdsw = czbdsw * ( 1.0 + tcjbdsw * ( TTEMP - model->HSMHV2_ktnom )) ; - czbdsw_dT = ( model->HSMHV2_cjswd * ( here->HSMHV2_pd - here->HSMHV2_weff_nf )) * tcjbdsw ; - - czbdswg = model->HSMHV2_cjswgd * here->HSMHV2_weff_nf ; - czbdswg = czbdswg * ( 1.0 + tcjbdswg * ( TTEMP - model->HSMHV2_ktnom )) ; - czbdswg_dT = ( model->HSMHV2_cjswgd * here->HSMHV2_weff_nf ) * tcjbdswg ; - -// if (vbd_jct == 0.0) { - if (0) { - Qbd = 0.0 ; - Qbd_dT = 0.0 ; - Capbd = czbd + czbdsw + czbdswg ; - } else if (vbd_jct < 0.0) { - if (czbd > 0.0) { - arg = 1.0 - vbd_jct / model->HSMHV2_pbd ; - if (model->HSMHV2_mjd == 0.5) - sarg = 1.0 / sqrt(arg) ; - else - sarg = Fn_Pow( arg , -model->HSMHV2_mjd ) ; - Qbd = model->HSMHV2_pbd * czbd * (1.0 - arg * sarg) / (1.0 - model->HSMHV2_mjd) ; - Qbd_dT = model->HSMHV2_pbd * czbd_dT * (1.0 - arg * sarg) / (1.0 - model->HSMHV2_mjd) ; - Capbd = czbd * sarg ; - } else { - Qbd = 0.0 ; - Qbd_dT = 0.0 ; - Capbd = 0.0 ; - } - if (czbdsw > 0.0) { - arg = 1.0 - vbd_jct / model->HSMHV2_pbswd ; - if (model->HSMHV2_mjswd == 0.5) - sarg = 1.0 / sqrt(arg) ; - else - sarg = Fn_Pow( arg , -model->HSMHV2_mjswd ) ; - Qbd += model->HSMHV2_pbswd * czbdsw * (1.0 - arg * sarg) / (1.0 - model->HSMHV2_mjswd) ; - Qbd_dT += model->HSMHV2_pbswd * czbdsw_dT * (1.0 - arg * sarg) / (1.0 - model->HSMHV2_mjswd) ; - Capbd += czbdsw * sarg ; - } - if (czbdswg > 0.0) { - arg = 1.0 - vbd_jct / model->HSMHV2_pbswgd ; - if (model->HSMHV2_mjswgd == 0.5) - sarg = 1.0 / sqrt(arg) ; - else - sarg = Fn_Pow( arg , -model->HSMHV2_mjswgd ) ; - Qbd += model->HSMHV2_pbswgd * czbdswg * (1.0 - arg * sarg) / (1.0 - model->HSMHV2_mjswgd) ; - Qbd_dT += model->HSMHV2_pbswgd * czbdswg_dT * (1.0 - arg * sarg) / (1.0 - model->HSMHV2_mjswgd) ; - Capbd += czbdswg * sarg ; - - } - } else { - T1 = czbd + czbdsw + czbdswg ; - T1_dT = czbd_dT + czbdsw_dT + czbdswg_dT ; - T2 = czbd * model->HSMHV2_mjd / model->HSMHV2_pbd - + czbdsw * model->HSMHV2_mjswd / model->HSMHV2_pbswd - + czbdswg * model->HSMHV2_mjswgd / model->HSMHV2_pbswgd ; - T2_dT = czbd_dT * model->HSMHV2_mjd / model->HSMHV2_pbd - + czbdsw_dT * model->HSMHV2_mjswd / model->HSMHV2_pbswd - + czbdswg_dT * model->HSMHV2_mjswgd / model->HSMHV2_pbswgd ; - Qbd = vbd_jct * (T1 + vbd_jct * 0.5 * T2) ; - Qbd_dT = vbd_jct * (T1_dT + vbd_jct * 0.5 * T2_dT) ; - Capbd = T1 + vbd_jct * T2 ; - } - - } else { - czbdswg = model->HSMHV2_cjswgd * here->HSMHV2_pd ; - czbdswg = czbdswg * ( 1.0 + tcjbdswg * ( TTEMP - model->HSMHV2_ktnom )) ; - czbdswg_dT = ( model->HSMHV2_cjswgd * here->HSMHV2_pd ) * tcjbdswg ; - -// if (vbd_jct == 0.0) { - if (0) { - Qbd = 0.0 ; - Qbd_dT = 0.0 ; - Capbd = czbd + czbdswg ; - } else if (vbd_jct < 0.0) { - if (czbd > 0.0) { - arg = 1.0 - vbd_jct / model->HSMHV2_pbd ; - if (model->HSMHV2_mjd == 0.5) - sarg = 1.0 / sqrt(arg) ; - else - sarg = Fn_Pow( arg , -model->HSMHV2_mjd ) ; - Qbd = model->HSMHV2_pbd * czbd * (1.0 - arg * sarg) / (1.0 - model->HSMHV2_mjd) ; - Qbd_dT = model->HSMHV2_pbd * czbd_dT * (1.0 - arg * sarg) / (1.0 - model->HSMHV2_mjd) ; - Capbd = czbd * sarg ; - } else { - Qbd = 0.0 ; - Qbd_dT = 0.0 ; - Capbd = 0.0 ; - } - if (czbdswg > 0.0) { - arg = 1.0 - vbd_jct / model->HSMHV2_pbswgd ; - if (model->HSMHV2_mjswgd == 0.5) - sarg = 1.0 / sqrt(arg) ; - else - sarg = Fn_Pow( arg , -model->HSMHV2_mjswgd ) ; - Qbd += model->HSMHV2_pbswgd * czbdswg * (1.0 - arg * sarg) / (1.0 - model->HSMHV2_mjswgd) ; - Qbd_dT += model->HSMHV2_pbswgd * czbdswg_dT * (1.0 - arg * sarg) / (1.0 - model->HSMHV2_mjswgd) ; - Capbd += czbdswg * sarg ; - } - } else { - T1 = czbd + czbdswg ; - T1_dT = czbd_dT + czbdswg_dT ; - T2 = czbd * model->HSMHV2_mjd / model->HSMHV2_pbd - + czbdswg * model->HSMHV2_mjswgd / model->HSMHV2_pbswgd ; - T2_dT = czbd_dT * model->HSMHV2_mjd / model->HSMHV2_pbd - + czbdswg_dT * model->HSMHV2_mjswgd / model->HSMHV2_pbswgd ; - Qbd = vbd_jct * (T1 + vbd_jct * 0.5 * T2) ; - Qbd_dT = vbd_jct * (T1_dT + vbd_jct * 0.5 * T2_dT) ; - Capbd = T1 + vbd_jct * T2 ; - } - } - - - /*---------------------------------------------------* - * Junction diode. - *-----------------*/ - here->HSMHV2_ibs = Mfactor * Ibs ; - here->HSMHV2_ibd = Mfactor * Ibd ; - here->HSMHV2_gbs = Mfactor * Gbs ; - here->HSMHV2_gbd = Mfactor * Gbd ; - *(ckt->CKTstate0 + here->HSMHV2qbs) = Mfactor * Qbs ; - *(ckt->CKTstate0 + here->HSMHV2qbd) = Mfactor * Qbd ; - here->HSMHV2_capbs = Mfactor * Capbs ; - here->HSMHV2_capbd = Mfactor * Capbd ; - - here->HSMHV2_gbdT = Mfactor * Ibd_dT ; - here->HSMHV2_gbsT = Mfactor * Ibs_dT ; - here->HSMHV2_gcbdT = Mfactor * Qbd_dT ; - here->HSMHV2_gcbsT = Mfactor * Qbs_dT ; - - /*-----------------------------------------------------------* - * Warn floating-point exceptions. - * - Function finite() in libm is called. - *-----------------*/ - T1 = here->HSMHV2_ibs + here->HSMHV2_ibd + here->HSMHV2_gbs + here->HSMHV2_gbd; - T1 = T1 + *(ckt->CKTstate0 + here->HSMHV2qbs) - + *(ckt->CKTstate0 + here->HSMHV2qbd) - + here->HSMHV2_capbs - + here->HSMHV2_capbd; - if ( ! finite (T1) ) { - flg_err = 1 ; - fprintf(stderr , - "*** warning(HiSIM_HV(%s)): FP-exception (junction diode)\n",model->HSMHV2modName) ; - if ( flg_info >= 1 ) { - printf ("*** warning(HiSIM_HV(%s)): FP-exception\n",model->HSMHV2modName) ; - } - } - - /*-----------------------------------------------------------* - * End of HSMHV2eval_dio - *-----------------*/ - - return ( HiSIM_OK ) ; - -} diff --git a/src/spicelib/devices/hisimhv2/hsmhv2eval_qover.h b/src/spicelib/devices/hisimhv2/hsmhv2eval_qover.h deleted file mode 100644 index a7928dc80..000000000 --- a/src/spicelib/devices/hisimhv2/hsmhv2eval_qover.h +++ /dev/null @@ -1,687 +0,0 @@ -/*********************************************************************** - - HiSIM (Hiroshima University STARC IGFET Model) - Copyright (C) 2014 Hiroshima University & STARC - - MODEL NAME : HiSIM_HV - ( VERSION : 2 SUBVERSION : 2 REVISION : 0 ) - Model Parameter 'VERSION' : 2.20 - FILE : hsmhveval_qover.h - - DATE : 2014.6.11 - - released by - Hiroshima University & - Semiconductor Technology Academic Research Center (STARC) -***********************************************************************/ - -/********************************************************************** - -The following source code, and all copyrights, trade secrets or other -intellectual property rights in and to the source code in its entirety, -is owned by the Hiroshima University and the STARC organization. - -All users need to follow the "HISIM_HV Distribution Statement and -Copyright Notice" attached to HiSIM_HV model. - ------HISIM_HV Distribution Statement and Copyright Notice-------------- - -Software is distributed as is, completely without warranty or service -support. Hiroshima University or STARC and its employees are not liable -for the condition or performance of the software. - -Hiroshima University and STARC own the copyright and grant users a perpetual, -irrevocable, worldwide, non-exclusive, royalty-free license with respect -to the software as set forth below. - -Hiroshima University and STARC hereby disclaims all implied warranties. - -Hiroshima University and STARC grant the users the right to modify, copy, -and redistribute the software and documentation, both within the user's -organization and externally, subject to the following restrictions - -1. The users agree not to charge for Hiroshima University and STARC code -itself but may charge for additions, extensions, or support. - -2. In any product based on the software, the users agree to acknowledge -Hiroshima University and STARC that developed the software. This -acknowledgment shall appear in the product documentation. - -3. The users agree to reproduce any copyright notice which appears on -the software on any copy or modification of such made available -to others." - -Toshimasa Asahara, President, Hiroshima University -Mitiko Miura-Mattausch, Professor, Hiroshima University -Katsuhiro Shimohigashi, President&CEO, STARC -June 2008 (revised October 2011) -*************************************************************************/ - -/* Begin HSMHV2evalQover */ - - /*---------------------------------------------------* - * Clamp -Vxbgmt. - *-----------------*/ - T0 = - Vxbgmt; - if ( T0 > Vbs_bnd ) { - T1 = T0 - Vbs_bnd; - T1_dT = - Vbs_bnd_dT; - T2 = Vbs_max - Vbs_bnd; - T2_dT = Vbs_max_dT - Vbs_bnd_dT; - - Fn_SUPoly4m( TY, T1, T2, T11, T0 ); - TY_dT = T1_dT * T11 + T2_dT * T0; - - T10 = Vbs_bnd + TY ; - T10_dT = Vbs_bnd_dT + TY_dT ; - } else { - T10 = T0 ; - T11 = 1.0 ; - T10_dT = 0.0; - } - Vxbgmtcl = - T10 - small2 ; - Vxbgmtcl_dVxbgmt = T11; - Vxbgmtcl_dT = - T10_dT; - - fac1 = cnst0over_func * Cox0_inv ; - fac1_dVbs = 0.0; fac1_dVds = 0.0; fac1_dVgs = 0.0; - fac1_dT = cnst0over_func_dT * Cox0_inv ; - - fac1p2 = fac1 * fac1 ; - fac1p2_dT = 2.0 * fac1 * fac1_dT ; - - VgpLD = - Vgbgmt + pParam->HSMHV2_vfbover; - VgpLD_dVgb = - 1.0e0 ; - - T0 = Nover_func / here->HSMHV2_nin ; - Pb2over = 2.0 / beta * log( T0 ) ; - T0_dT = - T0 / here->HSMHV2_nin * Nin_dT ; - Pb2over_dT = - Pb2over / beta * beta_dT + 2.0 / beta / T0 * T0_dT ; - - Vgb_fb_LD = - Vxbgmtcl ; - - /*-----------------------------------* - * QsuLD: total charge = Accumulation | Depletion+inversion - *-----------------*/ - if ( VgpLD < Vgb_fb_LD ){ - /*---------------------------* - * Accumulation - *-----------------*/ - flg_ovzone = -1 ; - T1 = 1.0 / ( beta * cnst0over_func ) ; - T1_dT = - T1 * T1 * ( beta_dT * cnst0over_func + beta * cnst0over_func_dT ) ; - TY = T1 * Cox0 ; - Ac41 = 2.0 + 3.0 * C_SQRT_2 * TY ; - Ac4 = 8.0 * Ac41 * Ac41 * Ac41 ; - TY_dT = T1_dT * Cox0 ; - Ac41_dT = 3.0 * C_SQRT_2 * TY_dT ; - Ac4_dT = 8.0 * 3.0 * Ac41 * Ac41 * Ac41_dT ; - - Ps0_min = here->HSMHV2_eg - Pb2over ; - Ps0_min_dT = Eg_dT - Pb2over_dT ; - - TX = beta * ( VgpLD + Vxbgmtcl ) ; - TX_dVxb = beta * Vxbgmtcl_dVxbgmt ; - TX_dVgb = beta * VgpLD_dVgb ; - TX_dT = beta_dT * ( VgpLD + Vxbgmtcl ) + beta * Vxbgmtcl_dT; - - Ac31 = 7.0 * C_SQRT_2 - 9.0 * TY * ( TX - 2.0 ) ; - Ac31_dVxb = - 9.0 * TY * TX_dVxb ; - Ac31_dVgb = - 9.0 * TY * TX_dVgb ; - Ac31_dT = - 9.0 * ( TY_dT * ( TX - 2.0 ) + TY * TX_dT ); - - Ac3 = Ac31 * Ac31 ; - T1 = 2.0 * Ac31 ; - Ac3_dVxb = T1 * Ac31_dVxb ; - Ac3_dVgb = T1 * Ac31_dVgb ; - Ac3_dT = T1 * Ac31_dT ; - - if ( Ac4 < Ac3*1.0e-8 ) { - Ac1 = 0.5*Ac4/Ac31 ; - Ac1_dVxb = - 0.5*Ac4/Ac3*Ac31_dVxb ; - Ac1_dVgb = - 0.5*Ac4/Ac3*Ac31_dVxb ; - Ac1_dT = 0.5*Ac4_dT/Ac31 - 0.5*Ac4/Ac3*Ac31_dT ; - } else { - Ac2 = sqrt( Ac4 + Ac3 ) ; - T1 = 0.5 / Ac2 ; - Ac2_dVxb = T1 * Ac3_dVxb ; - Ac2_dVgb = T1 * Ac3_dVgb ; - Ac2_dT = T1 * ( Ac4_dT + Ac3_dT ); - - Ac1 = -Ac31 + Ac2 ; - Ac1_dVxb = Ac2_dVxb -Ac31_dVxb ; - Ac1_dVgb = Ac2_dVgb -Ac31_dVgb ; - Ac1_dT = Ac2_dT -Ac31_dT ; - } - - Acd = pow( Ac1 , C_1o3 ) ; - T1 = C_1o3 / ( Acd * Acd ) ; - Acd_dVxb = Ac1_dVxb * T1 ; - Acd_dVgb = Ac1_dVgb * T1 ; - Acd_dT = Ac1_dT * T1 ; - - Acn = -4.0 * C_SQRT_2 - 12.0 * TY + 2.0 * Acd + C_SQRT_2 * Acd * Acd ; - T1 = 2.0 + 2.0 * C_SQRT_2 * Acd ; - Acn_dVxb = T1 * Acd_dVxb ; - Acn_dVgb = T1 * Acd_dVgb ; - Acn_dT = - 12.0 * TY_dT + T1 * Acd_dT ; - - Chi = Acn / Acd ; - T1 = 1.0 / ( Acd * Acd ) ; - Chi_dVxb = ( Acn_dVxb * Acd - Acn * Acd_dVxb ) * T1 ; - Chi_dVgb = ( Acn_dVgb * Acd - Acn * Acd_dVgb ) * T1 ; - Chi_dT = ( Acn_dT * Acd - Acn * Acd_dT ) * T1 ; - - Psa = Chi * beta_inv - Vxbgmtcl ; - Psa_dVxb = Chi_dVxb * beta_inv - Vxbgmtcl_dVxbgmt ; - Psa_dVgb = Chi_dVgb * beta_inv ; - Psa_dT = Chi_dT * beta_inv + Chi * beta_inv_dT - Vxbgmtcl_dT ; - - T1 = Psa + Vxbgmtcl ; - T1_dT = Psa_dT + Vxbgmtcl_dT ; - T2 = T1 / Ps0_min ; - T2_dT = ( T1_dT * Ps0_min - T1 * Ps0_min_dT ) / ( Ps0_min * Ps0_min ) ; - T3 = sqrt( 1.0 + ( T2 * T2 ) ) ; - - T9 = T2 / T3 / Ps0_min ; - T3_dVd = T9 * ( Psa_dVxb + Vxbgmtcl_dVxbgmt ) ; - T3_dVg = T9 * Psa_dVgb ; - T3_dT = T2_dT * T2 / T3; - - Ps0LD = T1 / T3 - Vxbgmtcl ; - T9 = 1.0 / ( T3 * T3 ) ; - Ps0LD_dVxb = T9 * ( ( Psa_dVxb + Vxbgmtcl_dVxbgmt ) * T3 - T1 * T3_dVd ) - Vxbgmtcl_dVxbgmt ; - Ps0LD_dVgb = T9 * ( Psa_dVgb * T3 - T1 * T3_dVg ); - Ps0LD_dT = T9 * ( T1_dT * T3 - T1 * T3_dT ) - Vxbgmtcl_dT; - - T2 = ( VgpLD - Ps0LD ) ; - QsuLD = Cox0 * T2 ; - QsuLD_dVxb = - Cox0 * Ps0LD_dVxb ; - QsuLD_dVgb = Cox0 * ( VgpLD_dVgb - Ps0LD_dVgb ) ; - QsuLD_dT = Cox0 * ( - Ps0LD_dT ) ; - - QbuLD = QsuLD ; - QbuLD_dVxb = QsuLD_dVxb ; - QbuLD_dVgb = QsuLD_dVgb ; - QbuLD_dT = QsuLD_dT ; - - } else { - - /*---------------------------* - * Depletion and inversion - *-----------------*/ - - /* initial value for a few fixpoint iterations - to get Ps0_iniA from simplified Poisson equation: */ - flg_ovzone = 2 ; - Chi = znbd3 ; - Chi_dVxb = 0.0 ; Chi_dVgb = 0.0 ; Chi_dT = 0.0 ; - - Ps0_iniA= Chi/beta - Vxbgmtcl ; - Ps0_iniA_dVxb = Chi_dVxb/beta - Vxbgmtcl_dVxbgmt ; - Ps0_iniA_dVgb = Chi_dVgb/beta ; - Ps0_iniA_dT = Chi_dT/beta - Chi*beta_dT/(beta*beta) - Vxbgmtcl_dT; - - /* 1 .. 2 relaxation steps should be sufficient */ - for ( lp_ld = 1; lp_ld <= 2; lp_ld ++ ) { - TY = exp(-Chi); - TY_dVxb = -Chi_dVxb * TY; - TY_dVgb = -Chi_dVgb * TY; - TY_dT = - Chi_dT * TY; - TX = 1.0e0 + 4.0e0 - * ( beta * ( VgpLD + Vxbgmtcl ) - 1.0e0 + TY ) / ( fac1p2 * beta2 ) ; - TX_dVxb = 4.0e0 * ( beta * ( Vxbgmtcl_dVxbgmt ) + TY_dVxb ) / ( fac1p2 * beta2 ); - TX_dVgb = 4.0e0 * ( beta * ( VgpLD_dVgb ) + TY_dVgb ) / ( fac1p2 * beta2 ); - T1 = ( beta * ( VgpLD + Vxbgmtcl ) - 1.0e0 + TY ); - T1_dT = beta_dT * ( VgpLD + Vxbgmtcl ) + beta * Vxbgmtcl_dT + TY_dT; - T3 = fac1p2 * beta2 ; - T3_dT = fac1p2_dT * beta2 + fac1p2 * ( 2 * beta * beta_dT ) ; - TX_dT = 4 * ( T1_dT * T3 - T1 * T3_dT ) / ( T3 * T3 ); - if ( TX < epsm10) { - TX = epsm10; - TX_dVxb = TX_dVgb = TX_dT = 0.0; - } - - Ps0_iniA = VgpLD + fac1p2 * beta / 2.0e0 * ( 1.0e0 - sqrt( TX ) ) ; - Ps0_iniA_dVxb = - fac1p2 * beta / 2.0e0 * TX_dVxb * 0.5 / sqrt( TX ); - Ps0_iniA_dVgb = VgpLD_dVgb - fac1p2 * beta / 2.0e0 * TX_dVgb * 0.5 / sqrt( TX ); - T1 = fac1p2 * beta ; - T1_dT = fac1p2_dT * beta + fac1p2 * beta_dT ; - T2 = 1.0 - sqrt( TX ); - T2_dT = - 1.0e0 / ( 2.0e0 * sqrt( TX ) ) * TX_dT ; - Ps0_iniA_dT = ( T1_dT * T2 + T1 * T2_dT ) / 2.0e0 ; - - Chi = beta * ( Ps0_iniA + Vxbgmtcl ) ; - Chi_dVxb = beta * ( Ps0_iniA_dVxb + Vxbgmtcl_dVxbgmt ) ; - Chi_dVgb = beta * ( Ps0_iniA_dVgb ) ; - Chi_dT = beta_dT * ( Ps0_iniA + Vxbgmtcl ) + beta * ( Ps0_iniA_dT + Vxbgmtcl_dT ); - } /* End of iteration */ - - if ( Chi < znbd3 ) { - - flg_ovzone = 1 ; - - /*-----------------------------------* - * zone-D1 - * - Ps0_iniA is the analytical solution of QovLD=Qb0 with - * Qb0 being approximated by 3-degree polynomial. - * - * new: Inclusion of exp(-Chi) term at right border - *-----------------*/ - Ta = 1.0/(9.0*sqrt(2.0)) - (5.0+7.0*exp(-3.0)) / (54.0*sqrt(2.0+exp(-3.0))); - Tb = (1.0+exp(-3.0)) / (2.0*sqrt(2.0+exp(-3.0))) - sqrt(2.0) / 3.0; - Tc = 1.0/sqrt(2.0) + 1.0/(beta*fac1); - Tc_dT = - (beta_dT*fac1 + beta*fac1_dT)/(beta2*fac1p2); - Td = - (VgpLD + Vxbgmtcl) / fac1; - Td_dVxb = - Vxbgmtcl_dVxbgmt / fac1; - Td_dVgb = - VgpLD_dVgb / fac1; - Td_dT = - (Vxbgmtcl_dT*fac1 - (VgpLD+Vxbgmtcl)*fac1_dT)/fac1p2; - Tq = Tb*Tb*Tb / (27.0*Ta*Ta*Ta) - Tb*Tc/(6.0*Ta*Ta) + Td/(2.0*Ta); - Tq_dVxb = Td_dVxb/(2.0*Ta); - Tq_dVgb = Td_dVgb / (2.0*Ta); - Tq_dT = - Tb/(6.0*Ta*Ta)*Tc_dT + Td_dT/(2.0*Ta); - Tp = (3.0*Ta*Tc-Tb*Tb)/(9.0*Ta*Ta); - Tp_dT = Tc_dT/(3.0*Ta); - T5 = sqrt(Tq*Tq + Tp*Tp*Tp); - T5_dVxb = 2.0*Tq*Tq_dVxb / (2.0*T5); - T5_dVgb = 2.0*Tq*Tq_dVgb / (2.0*T5); - T5_dT = (2.0*Tq*Tq_dT + 3.0*Tp*Tp*Tp_dT) / (2.0*T5); - Tu = pow(-Tq + T5,C_1o3); - Tu_dVxb = Tu / (3.0 * (-Tq + T5)) * (-Tq_dVxb + T5_dVxb); - Tu_dVgb = Tu / (3.0 * (-Tq + T5)) * (-Tq_dVgb + T5_dVgb); - Tu_dT = Tu / (3.0 * (-Tq + T5)) * (-Tq_dT + T5_dT); - Tv = -pow(Tq + T5,C_1o3); - Tv_dVxb = Tv / (3.0 * (-Tq - T5)) * (-Tq_dVxb - T5_dVxb); - Tv_dVgb = Tv / (3.0 * (-Tq - T5)) * (-Tq_dVgb - T5_dVgb); - Tv_dT = Tv / (3.0 * (-Tq - T5)) * (-Tq_dT - T5_dT ); - TX = Tu + Tv - Tb/(3.0*Ta); - TX_dVxb = Tu_dVxb + Tv_dVxb; - TX_dVgb = Tu_dVgb + Tv_dVgb; - TX_dT = Tu_dT + Tv_dT ; - - Ps0_iniA = TX * beta_inv - Vxbgmtcl ; - Ps0_iniA_dVxb = TX_dVxb * beta_inv - Vxbgmtcl_dVxbgmt; - Ps0_iniA_dVgb = TX_dVgb * beta_inv; - Ps0_iniA_dT = TX_dT * beta_inv + TX * beta_inv_dT - Vxbgmtcl_dT; - - Chi = beta * ( Ps0_iniA + Vxbgmtcl ) ; - Chi_dVxb = beta * ( Ps0_iniA_dVxb + Vxbgmtcl_dVxbgmt ) ; - Chi_dVgb = beta * ( Ps0_iniA_dVgb ) ; - Chi_dT = beta_dT * ( Ps0_iniA + Vxbgmtcl ) + beta * ( Ps0_iniA_dT + Vxbgmtcl_dT ); - } - - if ( model->HSMHV2_coqovsm > 0 ) { - /*-----------------------------------* - * - Ps0_iniB : upper bound. - *-----------------*/ - flg_ovzone += 2; - - VgpLD_shift = VgpLD + Vxbgmtcl + 0.1; - VgpLD_shift_dVgb = VgpLD_dVgb; - VgpLD_shift_dVxb = Vxbgmtcl_dVxbgmt; - VgpLD_shift_dT = Vxbgmtcl_dT; - exp_bVbs = exp( beta * - Vxbgmtcl ) + small; - exp_bVbs_dVxb = - exp_bVbs * beta * Vxbgmtcl_dVxbgmt; - exp_bVbs_dT = - exp_bVbs * (beta_dT*Vxbgmtcl + beta*Vxbgmtcl_dT); - T0 = here->HSMHV2_nin / Nover_func; - T0_dT = Nin_dT / Nover_func; - cnst1over = T0 * T0; - cnst1over_dT = 2.0 * T0 * T0_dT; - gamma = cnst1over * exp_bVbs; - gamma_dVxb = cnst1over * exp_bVbs_dVxb; - gamma_dT = cnst1over_dT * exp_bVbs + cnst1over * exp_bVbs_dT; - - T0 = beta2 * fac1p2; - T0_dT = 2.0 * beta * fac1 * (beta_dT*fac1+beta*fac1_dT); - - psi = beta*VgpLD_shift; - psi_dVgb = beta*VgpLD_shift_dVgb; - psi_dVxb = beta*VgpLD_shift_dVxb; - psi_dT = beta_dT*VgpLD_shift + beta*VgpLD_shift_dT; - Chi_1 = log(gamma*T0 + psi*psi) - log(cnst1over*T0) + beta*Vxbgmtcl; - Chi_1_dVgb = 2.0*psi*psi_dVgb/ (gamma*T0 + psi*psi); - Chi_1_dVxb = (gamma_dVxb*T0+2.0*psi*psi_dVxb)/(gamma*T0+psi*psi) - + beta*Vxbgmtcl_dVxbgmt; - Chi_1_dT = (gamma_dT*T0+gamma*T0_dT+2.0*psi*psi_dT)/(gamma*T0+psi*psi) - - (cnst1over_dT*T0 + cnst1over*T0_dT)/(cnst1over*T0) - + beta_dT*Vxbgmtcl + beta*Vxbgmtcl_dT; - - Fn_SU2( Chi_1, Chi_1, psi, 1.0, T1, T2 ); - Chi_1_dVgb = Chi_1_dVgb*T1 + psi_dVgb*T2; - Chi_1_dVxb = Chi_1_dVxb*T1 + psi_dVxb*T2; - Chi_1_dT = Chi_1_dT *T1 + psi_dT *T2; - - /* 1 fixpoint step for getting more accurate Chi_B */ - psi -= Chi_1 ; - psi_dVgb -= Chi_1_dVgb ; - psi_dVxb -= Chi_1_dVxb ; - psi_dT -= Chi_1_dT ; - - psi += beta*0.1 ; - psi_dT += beta_dT*0.1 ; - - psi_B = psi; - arg_B = psi*psi/(gamma*T0); - Chi_B = log(gamma*T0 + psi*psi) - log(cnst1over*T0) + beta*Vxbgmtcl; - Chi_B_dVgb = 2.0*psi*psi_dVgb/ (gamma*T0 + psi*psi); - Chi_B_dVxb = (gamma_dVxb*T0+2.0*psi*psi_dVxb)/(gamma*T0+psi*psi) - + beta*Vxbgmtcl_dVxbgmt; - Chi_B_dT = (gamma_dT*T0+gamma*T0_dT+2.0*psi*psi_dT)/(gamma*T0+psi*psi) - - (cnst1over_dT*T0 + cnst1over*T0_dT)/(cnst1over*T0) - + beta_dT*Vxbgmtcl + beta*Vxbgmtcl_dT; - Ps0_iniB = Chi_B/beta - Vxbgmtcl ; - Ps0_iniB_dVgb = Chi_B_dVgb/beta; - Ps0_iniB_dVxb = Chi_B_dVxb/beta- Vxbgmtcl_dVxbgmt; - Ps0_iniB_dT = Chi_B_dT/beta - Chi_B/(beta*beta)*beta_dT - Vxbgmtcl_dT; - - - /* construction of Ps0LD by taking Ps0_iniB as an upper limit of Ps0_iniA - * - * Limiting is done for Chi rather than for Ps0LD, to avoid shifting - * for Fn_SU2 */ - - Chi_A = Chi; - Chi_A_dVxb = Chi_dVxb; - Chi_A_dVgb = Chi_dVgb; - Chi_A_dT = Chi_dT; - - Fn_SU2( Chi, Chi_A, Chi_B, c_ps0ini_2*75.00, T1, T2 ); /* org: 50 */ - Chi_dVgb = Chi_A_dVgb * T1 + Chi_B_dVgb * T2; - Chi_dVxb = Chi_A_dVxb * T1 + Chi_B_dVxb * T2; - Chi_dT = Chi_A_dT * T1 + Chi_B_dT * T2; - - } - - /* updating Ps0LD */ - Ps0LD= Chi/beta - Vxbgmtcl ; - Ps0LD_dVgb = Chi_dVgb/beta; - Ps0LD_dVxb = Chi_dVxb/beta- Vxbgmtcl_dVxbgmt; - Ps0LD_dT = Chi_dT/beta - Chi/(beta*beta)*beta_dT - Vxbgmtcl_dT; - - T1 = Chi - 1.0 + exp(-Chi); - T1_dVxb = (1.0 - exp(-Chi)) * Chi_dVxb ; - T1_dVgb = (1.0 - exp(-Chi)) * Chi_dVgb ; - T1_dT = (1.0 - exp(-Chi)) * Chi_dT ; - if (T1 < epsm10) { - T1 = epsm10 ; - T1_dVxb = 0.0 ; - T1_dVgb = 0.0 ; - T1_dT = 0.0 ; - } - T2 = sqrt(T1); - QbuLD = cnst0over_func * T2 ; - T3 = cnst0over_func * 0.5 / T2 ; - QbuLD_dVxb = T3 * T1_dVxb ; - QbuLD_dVgb = T3 * T1_dVgb ; - QbuLD_dT = T3 * T1_dT + cnst0over_func_dT * T2 ; - - /*-----------------------------------------------------------* - * QsuLD : Qovs or Qovd in unit area. - * note: QsuLD = Qdep+Qinv. - *-----------------*/ - QsuLD = Cox0 * ( VgpLD - Ps0LD ) ; - QsuLD_dVxb = Cox0 * ( - Ps0LD_dVxb ) ; - QsuLD_dVgb = Cox0 * ( VgpLD_dVgb - Ps0LD_dVgb ) ; - QsuLD_dT = Cox0 * ( - Ps0LD_dT ) ; - - if ( model->HSMHV2_coqovsm == 1 ) { /* take initial values from analytical model */ - - - /*---------------------------------------------------* - * Calculation of Ps0LD. (beginning of Newton loop) - * - Fs0 : Fs0 = 0 is the equation to be solved. - * - dPs0 : correction value. - *-----------------*/ - - /* initial value too close to flat band should not be used */ -// if (Ps0LD+Vxbgmtcl < 1.0e-2) Ps0LD = 1.0e-2 - Vxbgmtcl; - exp_bVbs = exp( beta * - Vxbgmtcl ) ; - T0 = here->HSMHV2_nin / Nover_func; - cnst1over = T0 * T0; - cnst1over_dT = 2.0 * T0 * ( Nin_dT / Nover_func ); - cfs1 = cnst1over * exp_bVbs ; - - flg_conv = 0 ; - for ( lp_s0 = 1 ; lp_s0 <= 2*lp_s0_max + 1 ; lp_s0 ++ ) { - - Chi = beta * ( Ps0LD + Vxbgmtcl ) ; - - if ( Chi < znbd5 ) { - /*-------------------------------------------* - * zone-D1/D2. (Ps0LD) - *-----------------*/ - fi = Chi * Chi * Chi - * ( cn_im53 + Chi * ( cn_im54 + Chi * cn_im55 ) ) ; - fi_dChi = Chi * Chi - * ( 3 * cn_im53 + Chi * ( 4 * cn_im54 + Chi * 5 * cn_im55 ) ) ; - - fs01 = cfs1 * fi * fi ; - fs01_dPs0 = cfs1 * beta * 2 * fi * fi_dChi ; - - fb = Chi * ( cn_nc51 - + Chi * ( cn_nc52 - + Chi * ( cn_nc53 - + Chi * ( cn_nc54 + Chi * cn_nc55 ) ) ) ) ; - fb_dChi = cn_nc51 - + Chi * ( 2 * cn_nc52 - + Chi * ( 3 * cn_nc53 - + Chi * ( 4 * cn_nc54 + Chi * 5 * cn_nc55 ) ) ) ; - - fs02 = sqrt( fb * fb + fs01 + small ) ; - fs02_dPs0 = ( beta * fb_dChi * 2 * fb + fs01_dPs0 ) / ( fs02 + fs02 ) ; - - } else { - /*-------------------------------------------* - * zone-D3. (Ps0LD) - *-----------------*/ - if ( Chi < large_arg ) { /* avoid exp_Chi to become extremely large */ - exp_Chi = exp( Chi ) ; - fs01 = cfs1 * ( exp_Chi - 1.0e0 ) ; - fs01_dPs0 = cfs1 * beta * ( exp_Chi ) ; - } else { - exp_bPs0 = exp( beta*Ps0LD ) ; - fs01 = cnst1over * ( exp_bPs0 - exp_bVbs ) ; - fs01_dPs0 = cnst1over * beta * exp_bPs0 ; - } - fs02 = sqrt( Chi - 1.0 + fs01 ) ; - fs02_dPs0 = ( beta + fs01_dPs0 ) / fs02 * 0.5 ; - - } /* end of if ( Chi ... ) block */ - /*-----------------------------------------------------------* - * Fs0 - *-----------------*/ - Fs0 = VgpLD - Ps0LD - fac1 * fs02 ; - Fs0_dPs0 = - 1.0e0 - fac1 * fs02_dPs0 ; - - if ( flg_conv == 1 ) break ; - - dPs0 = - Fs0 / Fs0_dPs0 ; - - /*-------------------------------------------* - * Update Ps0LD . - *-----------------*/ - dPlim = 0.5*dP_max*(1.0 + Fn_Max(1.e0,fabs(Ps0LD))) ; - if ( fabs( dPs0 ) > dPlim ) dPs0 = dPlim * Fn_Sgn( dPs0 ) ; - - Ps0LD = Ps0LD + dPs0 ; - - TX = -Vxbgmtcl + ps_conv / 2 ; - if ( Ps0LD < TX ) Ps0LD = TX ; - - /*-------------------------------------------* - * Check convergence. - *-----------------*/ - if ( fabs( dPs0 ) <= ps_conv && fabs( Fs0 ) <= gs_conv ) { - flg_conv = 1 ; - } - - } /* end of Ps0LD Newton loop */ - - /*-------------------------------------------* - * Procedure for diverged case. - *-----------------*/ - if ( flg_conv == 0 ) { - fprintf( stderr , - "*** warning(HiSIM_HV(%s)): Went Over Iteration Maximum (Ps0LD)\n",model->HSMHV2modName ) ; - fprintf( stderr , " -Vxbgmtcl = %e Vgbgmt = %e\n" , -Vxbgmtcl , Vgbgmt ) ; - } - - /*---------------------------------------------------* - * Evaluate derivatives of Ps0LD. - *-----------------*/ - Chi_dT = beta_dT * ( Ps0LD + Vxbgmtcl ) + beta * Vxbgmtcl_dT; - exp_bVbs_dT = - ( beta_dT * Vxbgmtcl + beta * Vxbgmtcl_dT ) * exp_bVbs; - cfs1_dT = exp_bVbs * cnst1over_dT + exp_bVbs_dT * cnst1over; - - if ( Chi < znbd5 ) { - fs01_dVbs = cfs1 * beta * fi * ( - fi + 2 * fi_dChi ) ; /* fs01_dVxbgmtcl */ - fs01_dT = cfs1 * 2 * fi * fi_dChi * Chi_dT + fi * fi * cfs1_dT ; - T2 = 1.0e0 / ( fs02 + fs02 ) ; - fs02_dVbs = ( + beta * fb_dChi * 2 * fb + fs01_dVbs ) * T2 ; /* fs02_dVxbgmtcl */ - fs02_dT = ( 2 * fb * fb_dChi * Chi_dT + fs01_dT ) * T2 ; - } else { - if ( Chi < large_arg ) { - fs01_dVbs = + cfs1 * beta ; /* fs01_dVxbgmtcl */ - exp_Chi_dT = exp_Chi * Chi_dT ; - fs01_dT = ( exp_Chi - 1.0e0 ) * cfs1_dT + cfs1 * exp_Chi_dT ; - } else { - fs01_dVbs = + cfs1 * beta ; - exp_bPs0_dT = exp_bPs0 * Ps0LD * beta_dT ; - fs01_dT = cnst1over_dT*(exp_bPs0-exp_bVbs) + cnst1over*(exp_bPs0_dT-exp_bVbs_dT) ; - } - T2 = 0.5e0 / fs02 ; - fs02_dVbs = ( + beta + fs01_dVbs ) * T2 ; /* fs02_dVxbgmtcl */ - fs02_dT = T2 * ( Chi_dT + fs01_dT ) ; - } - - T1 = 1.0 / Fs0_dPs0 ; - Ps0LD_dVxb = - ( - fac1 * fs02_dVbs ) * T1 ; - Ps0LD_dVds = 0.0 ; - Ps0LD_dVgb = - ( VgpLD_dVgb - fac1_dVgs * fs02 ) * T1 ; - Ps0LD_dT = - ( - ( fac1 * fs02_dT + fac1_dT * fs02 ) ) * T1; - - Chi_dT = beta_dT * ( Ps0LD + Vxbgmtcl ) + beta * ( Ps0LD_dT + Vxbgmtcl_dT ); - - if ( Chi < znbd5 ) { - /*-------------------------------------------* - * zone-D1/D2. (Ps0LD) - *-----------------*/ - if ( Chi < znbd3 ) { flg_ovzone = 1; } - else { flg_ovzone = 2; } - - Xi0 = fb * fb + epsm10 ; - T1 = 2 * fb * fb_dChi * beta ; - Xi0_dVbs = T1 * ( Ps0LD_dVxb + 1.0 ) ; /* Xi0_dVxbgmtcl */ - Xi0_dVds = T1 * Ps0LD_dVds ; - Xi0_dVgs = T1 * Ps0LD_dVgb ; - Xi0_dT = 2 * fb * fb_dChi * Chi_dT ; - - Xi0p12 = fb + epsm10 ; - T1 = fb_dChi * beta ; - Xi0p12_dVbs = T1 * ( Ps0LD_dVxb + 1.0 ) ; /* Xi0p12_dVxbgmtcl */ - Xi0p12_dVds = T1 * Ps0LD_dVds ; - Xi0p12_dVgs = T1 * Ps0LD_dVgb ; - Xi0p12_dT = fb_dChi * Chi_dT ; - - Xi0p32 = fb * fb * fb + epsm10 ; - T1 = 3 * fb * fb * fb_dChi * beta ; - Xi0p32_dVbs = T1 * ( Ps0LD_dVxb + 1.0 ) ; /* Xi0p32_dVxbgmtcl */ - Xi0p32_dVds = T1 * Ps0LD_dVds ; - Xi0p32_dVgs = T1 * Ps0LD_dVgb ; - Xi0p32_dT = 3 * fb * fb * fb_dChi * Chi_dT ; - - } else { - /*-------------------------------------------* - * zone-D3. (Ps0LD) - *-----------------*/ - flg_ovzone = 3 ; - - Xi0 = Chi - 1.0e0 ; - Xi0_dVbs = beta * ( Ps0LD_dVxb + 1.0e0 ) ; /* Xi0_dVxbgmtcl */ - Xi0_dVds = beta * Ps0LD_dVds ; - Xi0_dVgs = beta * Ps0LD_dVgb ; - Xi0_dT = Chi_dT ; - - Xi0p12 = sqrt( Xi0 ) ; - T1 = 0.5e0 / Xi0p12 ; - Xi0p12_dVbs = T1 * Xi0_dVbs ; - Xi0p12_dVds = T1 * Xi0_dVds ; - Xi0p12_dVgs = T1 * Xi0_dVgs ; - Xi0p12_dT = T1 * Xi0_dT ; - - Xi0p32 = Xi0 * Xi0p12 ; - T1 = 1.5e0 * Xi0p12 ; - Xi0p32_dVbs = T1 * Xi0_dVbs ; - Xi0p32_dVds = T1 * Xi0_dVds ; - Xi0p32_dVgs = T1 * Xi0_dVgs ; - Xi0p32_dT = T1 * Xi0_dT ; - - } /* end of if ( Chi ... ) block */ - - /*-----------------------------------------------------------* - * - Recalculate the derivatives of fs01 and fs02. - *-----------------*/ - fs01_dVbs = Ps0LD_dVxb * fs01_dPs0 + fs01_dVbs ; - fs01_dVds = Ps0LD_dVds * fs01_dPs0 ; - fs01_dVgs = Ps0LD_dVgb * fs01_dPs0 ; - fs01_dT = Ps0LD_dT * fs01_dPs0 + fs01_dT; - fs02_dVbs = Ps0LD_dVxb * fs02_dPs0 + fs02_dVbs ; - fs02_dVxb = Ps0LD_dVds * fs02_dPs0 ; - fs02_dVgb = Ps0LD_dVgb * fs02_dPs0 ; - fs02_dT = Ps0LD_dT * fs02_dPs0 + fs02_dT; - - /*-----------------------------------------------------------* - * QbuLD and QiuLD - *-----------------*/ - QbuLD = cnst0over_func * Xi0p12 ; - QbuLD_dVxb = cnst0over_func * Xi0p12_dVbs ; - QbuLD_dVgb = cnst0over_func * Xi0p12_dVgs ; - QbuLD_dT = cnst0over_func * Xi0p12_dT + cnst0over_func_dT * Xi0p12; - - T1 = 1.0 / ( fs02 + Xi0p12 ) ; - QiuLD = cnst0over_func * fs01 * T1 ; - T2 = 1.0 / ( fs01 + epsm10 ) ; - QiuLD_dVbs = QiuLD * ( fs01_dVbs * T2 - ( fs02_dVbs + Xi0p12_dVbs ) * T1 ) ; - QiuLD_dVgs = QiuLD * ( fs01_dVgs * T2 - ( fs02_dVgb + Xi0p12_dVgs ) * T1 ) ; - T1_dT = - T1 * T1 * ( fs02_dT + Xi0p12_dT ); - QiuLD_dT = cnst0over_func * ( fs01 * T1_dT + T1 * fs01_dT ) + fs01 * T1 * cnst0over_func_dT; - - /*-----------------------------------------------------------* - * Extrapolation: X_dVxbgmt = X_dVxbgmtcl * Vxbgmtcl_dVxbgmt - *-----------------*/ - QbuLD_dVxb *= Vxbgmtcl_dVxbgmt ; - QiuLD_dVbs *= Vxbgmtcl_dVxbgmt ; - - /*-----------------------------------------------------------* - * Total overlap charge - *-----------------*/ - QsuLD = QbuLD + QiuLD; - QsuLD_dVxb = QbuLD_dVxb + QiuLD_dVbs; - QsuLD_dVgb = QbuLD_dVgb + QiuLD_dVgs; - QsuLD_dT = QbuLD_dT + QiuLD_dT; - - } /* end of COQOVSM branches */ - - } /* end of Vgbgmt region blocks */ - - /* convert to source ref. */ - Ps0LD_dVbs = Ps0LD_dVxb * Vxbgmt_dVbs + Ps0LD_dVgb * Vgbgmt_dVbs ; - Ps0LD_dVds = Ps0LD_dVxb * Vxbgmt_dVds + Ps0LD_dVgb * Vgbgmt_dVds ; - Ps0LD_dVgs = Ps0LD_dVxb * Vxbgmt_dVgs + Ps0LD_dVgb * Vgbgmt_dVgs ; - - QsuLD_dVbs = QsuLD_dVxb * Vxbgmt_dVbs + QsuLD_dVgb * Vgbgmt_dVbs ; - QsuLD_dVds = QsuLD_dVxb * Vxbgmt_dVds + QsuLD_dVgb * Vgbgmt_dVds ; - QsuLD_dVgs = QsuLD_dVxb * Vxbgmt_dVgs + QsuLD_dVgb * Vgbgmt_dVgs ; - - QbuLD_dVbs = QbuLD_dVxb * Vxbgmt_dVbs + QbuLD_dVgb * Vgbgmt_dVbs ; - QbuLD_dVds = QbuLD_dVxb * Vxbgmt_dVds + QbuLD_dVgb * Vgbgmt_dVds ; - QbuLD_dVgs = QbuLD_dVxb * Vxbgmt_dVgs + QbuLD_dVgb * Vgbgmt_dVgs ; - - /* inversion charge = total - depletion */ - QiuLD = QsuLD - QbuLD ; - QiuLD_dVbs = QsuLD_dVbs - QbuLD_dVbs ; - QiuLD_dVds = QsuLD_dVds - QbuLD_dVds ; - QiuLD_dVgs = QsuLD_dVgs - QbuLD_dVgs ; - QiuLD_dT = QsuLD_dT - QbuLD_dT ; - -/* End HSMHV2evalQover */ diff --git a/src/spicelib/devices/hisimhv2/hsmhv2eval_rdrift.c b/src/spicelib/devices/hisimhv2/hsmhv2eval_rdrift.c deleted file mode 100644 index b07b0f3ca..000000000 --- a/src/spicelib/devices/hisimhv2/hsmhv2eval_rdrift.c +++ /dev/null @@ -1,656 +0,0 @@ -/*********************************************************************** - - HiSIM (Hiroshima University STARC IGFET Model) - Copyright (C) 2014 Hiroshima University & STARC - - MODEL NAME : HiSIM_HV - ( VERSION : 2 SUBVERSION : 2 REVISION : 0 ) - Model Parameter 'VERSION' : 2.20 - FILE : hsmhveval_rdrift.c - - DATE : 2014.6.11 - - released by - Hiroshima University & - Semiconductor Technology Academic Research Center (STARC) -***********************************************************************/ - -/********************************************************************** - -The following source code, and all copyrights, trade secrets or other -intellectual property rights in and to the source code in its entirety, -is owned by the Hiroshima University and the STARC organization. - -All users need to follow the "HISIM_HV Distribution Statement and -Copyright Notice" attached to HiSIM_HV model. - ------HISIM_HV Distribution Statement and Copyright Notice-------------- - -Software is distributed as is, completely without warranty or service -support. Hiroshima University or STARC and its employees are not liable -for the condition or performance of the software. - -Hiroshima University and STARC own the copyright and grant users a perpetual, -irrevocable, worldwide, non-exclusive, royalty-free license with respect -to the software as set forth below. - -Hiroshima University and STARC hereby disclaims all implied warranties. - -Hiroshima University and STARC grant the users the right to modify, copy, -and redistribute the software and documentation, both within the user's -organization and externally, subject to the following restrictions - -1. The users agree not to charge for Hiroshima University and STARC code -itself but may charge for additions, extensions, or support. - -2. In any product based on the software, the users agree to acknowledge -Hiroshima University and STARC that developed the software. This -acknowledgment shall appear in the product documentation. - -3. The users agree to reproduce any copyright notice which appears on -the software on any copy or modification of such made available -to others." - -Toshimasa Asahara, President, Hiroshima University -Mitiko Miura-Mattausch, Professor, Hiroshima University -Katsuhiro Shimohigashi, President&CEO, STARC -June 2008 (revised October 2011) -*************************************************************************/ - -/*===========================================================* -* Preamble. -*=================*/ -/*---------------------------------------------------* -* Header files. -*-----------------*/ -#include "ngspice/ngspice.h" -#ifdef __STDC__ -/* #include */ -#endif - -/*-----------------------------------* -* HiSIM macros -*-----------------*/ -#include "hisimhv2.h" -#include "hsmhv2evalenv.h" - -/* local variables used in macro functions */ -static double TMF0 , TMF1 , TMF2 , TMF3 ; - -/*===========================================================* -* pow -*=================*/ -#ifdef POW_TO_EXP_AND_LOG -#define Fn_Pow( x , y ) exp( y * log( x ) ) -#else -#define Fn_Pow( x , y ) pow( x , y ) -#endif - -/*===========================================================* -* Macro Functions for ceiling/flooring/symmetrization. -*=================*/ -/*---------------------------------------------------* -* smoothUpper: ceiling. -* y = xmax - 0.5 ( arg + sqrt( arg^2 + 4 xmax delta ) ) -* arg = xmax - x - delta -*-----------------*/ - -#define Fn_SU( y , x , xmax , delta , dx ) { \ - TMF1 = ( xmax ) - ( x ) - ( delta ) ; \ - TMF2 = 4.0 * ( xmax ) * ( delta) ; \ - TMF2 = TMF2 > 0.0 ? TMF2 : - ( TMF2 ) ; \ - TMF2 = sqrt ( TMF1 * TMF1 + TMF2 ) ; \ - dx = 0.5 * ( 1.0 + TMF1 / TMF2 ) ; \ - y = ( xmax ) - 0.5 * ( TMF1 + TMF2 ) ; \ - } - -#define Fn_SU2( y , x , xmax , delta , dy_dx , dy_dxmax ) { \ - TMF1 = ( xmax ) - ( x ) - ( delta ) ; \ - TMF2 = 4.0 * ( xmax ) * ( delta) ; \ - TMF2 = TMF2 > 0.0 ? TMF2 : - ( TMF2 ) ; \ - TMF2 = sqrt ( TMF1 * TMF1 + TMF2 ) ; \ - dy_dx = 0.5 * ( 1.0 + TMF1 / TMF2 ) ; \ - dy_dxmax = 0.5 * ( 1.0 - ( TMF1 + 2.0 * delta ) / TMF2 ) ; \ - y = ( xmax ) - 0.5 * ( TMF1 + TMF2 ) ; \ - } - -/*---------------------------------------------------* -* smoothLower: flooring. -* y = xmin + 0.5 ( arg + sqrt( arg^2 + 4 xmin delta ) ) -* arg = x - xmin - delta -*-----------------*/ - -#define Fn_SL( y , x , xmin , delta , dx ) { \ - TMF1 = ( x ) - ( xmin ) - ( delta ) ; \ - TMF2 = 4.0 * ( xmin ) * ( delta ) ; \ - TMF2 = TMF2 > 0.0 ? TMF2 : - ( TMF2 ) ; \ - TMF2 = sqrt ( TMF1 * TMF1 + TMF2 ) ; \ - dx = 0.5 * ( 1.0 + TMF1 / TMF2 ) ; \ - y = ( xmin ) + 0.5 * ( TMF1 + TMF2 ) ; \ - } - -#define Fn_SL2( y , x , xmin , delta , dy_dx, dy_dxmin ) { \ - TMF1 = ( x ) - ( xmin ) - ( delta ) ; \ - TMF2 = 4.0 * ( xmin ) * ( delta ) ; \ - TMF2 = TMF2 > 0.0 ? TMF2 : - ( TMF2 ) ; \ - TMF2 = sqrt ( TMF1 * TMF1 + TMF2 ) ; \ - dy_dx = 0.5 * ( 1.0 + TMF1 / TMF2 ) ; \ - dy_dxmin = 0.5 * ( 1.0 - ( TMF1 - 2.0 * delta ) / TMF2 ) ; \ - y = ( xmin ) + 0.5 * ( TMF1 + TMF2 ) ; \ - } - -/*---------------------------------------------------* -* smoothZero: flooring to zero. -* y = 0.5 ( x + sqrt( x^2 + 4 delta^2 ) ) -*-----------------*/ - -#define Fn_SZ( y , x , delta , dx ) { \ - TMF2 = sqrt ( ( x ) * ( x ) + 4.0 * ( delta ) * ( delta ) ) ; \ - dx = 0.5 * ( 1.0 + ( x ) / TMF2 ) ; \ - y = 0.5 * ( ( x ) + TMF2 ) ; \ - if( y < 0.0 ) { y=0.0; dx=0.0; } \ - } - -/*---------------------------------------------------* -* SymAdd: evaluate additional term for symmetry. -*-----------------*/ - -#define Fn_SymAdd( y , x , add0 , dx ) \ -{ \ - if( ( x ) < 1e6 ) { \ - TMF1 = 2.0 * ( x ) / ( add0 ) ; \ - TMF2 = 1.0 + TMF1 * ( (1.0/2) + TMF1 * ( (1.0/6) \ - + TMF1 * ( (1.0/24) + TMF1 * ( (1.0/120) \ - + TMF1 * ( (1.0/720) + TMF1 * (1.0/5040) ) ) ) ) ) ; \ - TMF3 = (1.0/2) + TMF1 * ( (1.0/3) \ - + TMF1 * ( (1.0/8) + TMF1 * ( (1.0/30) \ - + TMF1 * ( (1.0/144) + TMF1 * (1.0/840) ) ) ) ) ; \ - y = add0 / TMF2 ; \ - dx = - 2.0 * TMF3 / ( TMF2 * TMF2 ) ; \ - } else { y=0.0; dx=0.9; } \ -} - -#define Fn_CP( y , x , xmax , pw , dx ) { \ - double x2 = (x) * (x) ; \ - double xmax2 = (xmax) * (xmax) ; \ - double xp = 1.0 , xmp = 1.0 ; \ - int m =0, mm =0; \ - double arg =0.0, dnm =0.0; \ - for ( m = 0 ; m < pw ; m ++ ) { xp *= x2 ; xmp *= xmax2 ; } \ - arg = xp + xmp ; \ - dnm = arg ; \ - if ( pw == 1 || pw == 2 || pw == 4 || pw == 8 ) { \ - if ( pw == 1 ) { mm = 1 ; \ - } else if ( pw == 2 ) { mm = 2 ; \ - } else if ( pw == 4 ) { mm = 3 ; \ - } else if ( pw == 8 ) { mm = 4 ; } \ - for ( m = 0 ; m < mm ; m ++ ) { dnm = sqrt( dnm ) ; } \ - } else { dnm = Fn_Pow( dnm , 1.0 / ( 2.0 * pw ) ) ; } \ - dnm = 1.0 / dnm ; \ - y = (x) * (xmax) * dnm ; \ - dx = (xmax) * xmp * dnm / arg ; \ -} - -#define Fn_SU_CP( y , x , xmax , delta , pw , dx ) { \ - if(x > xmax - delta && delta >= 0.0) { \ - TMF1 = x - xmax + delta ; \ - Fn_CP( TMF0 , TMF1 , delta , pw , dx ) \ - y = xmax - delta + TMF0 ; \ - dx = dx ; \ - } else { \ - y = x ; \ - dx = 1.0 ; \ - } \ -} - -/*===========================================================* -* Function hsmhvrdrift. -*=================*/ - -int HSMHV2rdrift -( - double Vddp, - double Vds, - double Vbs, - double Vsubs, /* substrate-source voltage */ - double deltemp, - HSMHV2instance *here, - HSMHV2model *model, - CKTcircuit *ckt -) -{ - HSMHV2binningParam *pParam = &here->pParam ; - HSMHV2modelMKSParam *modelMKS = &model->modelMKS ; - - const double small = 1.0e-50 ; - - double Mfactor =0.0, WeffLD_nf =0.0 ; - double Ldrift =0.0, Xldld =0.0 ; - double Nover =0.0 ; - - /* temporary vars. & derivatives*/ - double T0 =0.0, T0_dVb =0.0, T0_dVd =0.0, T0_dVg =0.0, T0_dT =0.0 ; - double T1 =0.0, T1_dVd =0.0, T1_dT =0.0, T1_dVddp =0.0 ; - double T2 =0.0, T2_dVb =0.0, T2_dVd =0.0, T2_dT =0.0, T2_dVddp =0.0 ; - double T3 =0.0, T3_dT =0.0, T3_dVddp =0.0 ; - double T4 =0.0, T4_dT =0.0, T4_dVddp =0.0 ; - double T5 =0.0, T5_dT =0.0, T5_dVddp =0.0 ; - double T6 =0.0, T6_dT =0.0, T6_dVddp =0.0 ; - double T9 =0.0 ; - - /* bias-dependent Rd, Rs */ - - double Edri =0.0, Edri_dVddp =0.0 ; - double Vdri =0.0, Vdri_dVddp =0.0, Vdri_dT =0.0 ; - double Vmax =0.0, Vmax_dT =0.0 ; - double Mu0 =0.0, Mu0_dT =0.0 ; - double Cx =0.0, Cx_dT =0.0 ; - double Car =0.0, Car_dT =0.0 ; - double Mu =0.0, Mu_dVddp = 0.0, Mu_dT =0.0 ; - double Xov =0.0, Xov_dVds =0.0, Xov_dVgs =0.0, Xov_dVbs =0.0, Xov_dT =0.0 ; - double Carr =0.0, Carr_dVds=0.0, Carr_dVgs=0.0, Carr_dVbs=0.0, Carr_dVddp =0.0, Carr_dT =0.0 ; - - double GD =0.0, GD_dVddp =0.0, GD_dVgse =0.0, GD_dT =0.0, GD_dVds =0.0, GD_dVgs =0.0, GD_dVbs =0.0 ; - double Rd =0.0, Rd_dVddp =0.0, Rd_dVdse =0.0, Rd_dVgse =0.0, Rd_dVbse =0.0, Rd_dT =0.0, Rd_dVds =0.0, Rd_dVgs =0.0, Rd_dVbs =0.0 ; - double Vddpz=0.0, Vddpz_dVddp=0.0, Vzadd =0.0, Vzadd_dVddp=0.0 ; - - /* temperature-dependent variables for SHE model */ - double TTEMP =0.0, TTEMP0 =0.0 ; - - /* Wdepl and Wjunc */ - double Wdepl, Wdepl_dVd, Wdepl_dVg, Wdepl_dVb, Wdepl_dT; - double Wjunc0, Wjunc0_dVd, Wjunc0_dVb; - double Wrdrdjunc, Wjunc, Wjunc_dVd, Wjunc_dVb; - - const double Res_min = 1.0e-4 ; - const double epsm10 = 10.0e0 * C_EPS_M ; - const double ps_conv = 1.0e-12 ; - - double Rdrbb_dT =0.0 ; - - double Wdep = 0.0, Wdep_dVdserev = 0.0, Wdep_dVsubsrev = 0.0 ; - double T1_dVdserev = 0.0, T1_dVsubsrev = 0.0, T6_dVdserev = 0.0, T6_dVsubsrev = 0.0 ; - double Rd_dVsubs=0.0 ; - -#define C_sub_delta 0.1 /* CHECK! */ -#define C_sub_delta2 1.0e-9 /* CHECK! */ - - NG_IGNORE(Vsubs); - - /*================ Start of executable code.=================*/ - - /*-----------------------------------------------------------* - * Temperature dependent constants. - *-----------------*/ - if ( here->HSMHV2tempNode > 0 && pParam->HSMHV2_rth0 != 0.0 ) { - -#define HSMHV2EVAL -#include "hsmhv2temp_eval_rdri.h" - - } else { - if ( here->HSMHV2_dtemp_Given ) { TTEMP = TTEMP + here->HSMHV2_dtemp ; } - Mu0_dT = 0.0 ; - Vmax_dT = 0.0 ; - Cx_dT = 0.0 ; - Car_dT = 0.0 ; - Rdrbb_dT = 0.0 ; - } - - Mfactor = here->HSMHV2_m ; - WeffLD_nf = here->HSMHV2_weff_ld * here->HSMHV2_nf ; - Ldrift = here->HSMHV2_ldrift1 + here->HSMHV2_ldrift2 ; - Xldld = model->HSMHV2_xldld + small ; - Nover = pParam->HSMHV2_nover ; - - - Mu0 = here->HSMHV2_rdrmue * here->HSMHV2_rdrmuel ; - Mu0_dT = Mu0_dT * here->HSMHV2_rdrmuel ; - Vmax = here->HSMHV2_rdrvmax * here->HSMHV2_rdrvmaxw * here->HSMHV2_rdrvmaxl + small ; - Vmax_dT = Vmax_dT * here->HSMHV2_rdrvmaxw * here->HSMHV2_rdrvmaxl ; - Cx = here->HSMHV2_rdrcx * here->HSMHV2_rdrcxw ; - Cx_dT = Cx_dT * here->HSMHV2_rdrcxw ; - Car = here->HSMHV2_rdrcar ; - - //-----------------------------------------------------------* - // Modified bias introduced to realize symmetry at Vddp=0. - //-----------------// - if(Vddp < 0) { - Fn_SymAdd( Vzadd , -Vddp / 2 , model->HSMHV2_vzadd0 , T2 ) ; - Vzadd_dVddp = - T2 / 2.0 ; - if( Vzadd < ps_conv ) { - Vzadd = ps_conv ; - Vzadd_dVddp = 0.0 ; - } - Vddpz = Vddp - 2 * Vzadd ; - Vddpz_dVddp = 1.0 - 2 * Vzadd_dVddp ; - } else { - Fn_SymAdd( Vzadd , Vddp / 2 , model->HSMHV2_vzadd0 , T2 ) ; - Vzadd_dVddp = T2 / 2.0 ; - if( Vzadd < ps_conv ) { - Vzadd = ps_conv ; - Vzadd_dVddp = 0.0 ; - } - Vddpz = Vddp + 2 * Vzadd ; - Vddpz_dVddp = 1.0 + 2 * Vzadd_dVddp ; - } - - Edri = Vddpz / Ldrift ; - Edri_dVddp = Vddpz_dVddp / Ldrift ; - - Vdri = Mu0 * Edri ; - Vdri_dVddp = Mu0 * Edri_dVddp ; - Vdri_dT = Mu0_dT * Edri ; - - /*-----------------------------------------------------------* - * Mu : mobility - *-----------------*/ - if ( Vddp >= 0 ) { - T1 = Vdri / Vmax ; - T1_dVddp = Vdri_dVddp / Vmax ; - T1_dT = ( Vdri_dT * Vmax - Vdri * Vmax_dT ) / ( Vmax * Vmax ); - } else { - T1 = - Vdri / Vmax ; - T1_dVddp = - Vdri_dVddp / Vmax ; - T1_dT = - ( Vdri_dT * Vmax - Vdri * Vmax_dT ) / ( Vmax * Vmax ); - } - - if( model->HSMHV2_rdrbbtmp == 0.0 ) { - if( T1 == 0.0 ) { - T2 = 0.0 ; T2_dT = 0.0 ; T2_dVddp = 0.0 ; - T4 = 1.0 ; T4_dT = 0.0 ; T4_dVddp = 0.0 ; - }else { - if ( 1.0e0 - epsm10 <= here->HSMHV2_rdrbb && here->HSMHV2_rdrbb <= 1.0e0 + epsm10 ) { - T3 = 1.0e0 ; - T3_dT = 0.0e0 ; - T3_dVddp = 0.0e0 ; - } else if ( 2.0e0 - epsm10 <= here->HSMHV2_rdrbb && here->HSMHV2_rdrbb <= 2.0e0 + epsm10 ) { - T3 = T1 ; - T3_dT = T1_dT ; - T3_dVddp = T1_dVddp ; - } else { - T3 = Fn_Pow( T1 , here->HSMHV2_rdrbb - 1.0e0 ) ; - T3_dT = ( here->HSMHV2_rdrbb - 1.0e0 )* Fn_Pow( T1 , here->HSMHV2_rdrbb - 2.0e0 ) * T1_dT ; - T3_dVddp = ( here->HSMHV2_rdrbb - 1.0e0 )* Fn_Pow( T1 , here->HSMHV2_rdrbb - 2.0e0 ) * T1_dVddp ; - } - T2 = T1 * T3 ; - T2_dT = T1 * T3_dT + T3 * T1_dT ; - T2_dVddp = T1 * T3_dVddp + T3 * T1_dVddp ; - T4 = 1.0e0 + T2 ; - T4_dT = T2_dT ; - T4_dVddp = T2_dVddp ; - } - - if ( 1.0e0 - epsm10 <= here->HSMHV2_rdrbb && here->HSMHV2_rdrbb <= 1.0e0 + epsm10 ) { - T5 = 1.0 / T4 ; - T5_dT = - T5 * T5 * T4_dT ; - T5_dVddp = - T5 * T5 * T4_dVddp ; - } else if ( 2.0e0 - epsm10 <= here->HSMHV2_rdrbb && here->HSMHV2_rdrbb <= 2.0e0 + epsm10 ) { - T5 = 1.0 / sqrt( T4 ) ; - T5_dT = - 0.5e0 / ( T4 * sqrt(T4) ) * T4_dT ; - T5_dVddp = - 0.5e0 / ( T4 * sqrt(T4) ) * T4_dVddp; - } else { - T6 = Fn_Pow( T4 , ( - 1.0e0 / here->HSMHV2_rdrbb - 1.0e0 ) ) ; - T5 = T4 * T6 ; - T6_dT = ( - 1.0e0 / here->HSMHV2_rdrbb - 1.0e0 ) * Fn_Pow( T4 , ( - 1.0e0 / here->HSMHV2_rdrbb - 2.0e0 ) ) * T4_dT ; - T6_dVddp = ( - 1.0e0 / here->HSMHV2_rdrbb - 1.0e0 ) * Fn_Pow( T4 , ( - 1.0e0 / here->HSMHV2_rdrbb - 2.0e0 ) ) * T4_dVddp ; - T5_dT = T4_dT * T6 + T4 * T6_dT ; - T5_dVddp = T4_dVddp * T6 + T4 * T6_dVddp ; - } - - } else { - if( T1 == 0.0 ) { - T2 = 0.0 ; T2_dT = 0.0 ; T2_dVddp = 0.0 ; - T4 = 1.0 ; T4_dT = 0.0 ; T4_dVddp = 0.0 ; - }else { - T3 = Fn_Pow( T1 , here->HSMHV2_rdrbb - 1.0e0 ) ; - T3_dT = ( here->HSMHV2_rdrbb - 1.0e0 )* Fn_Pow( T1 , here->HSMHV2_rdrbb - 2.0e0 ) * T1_dT + T3*log(T1)*Rdrbb_dT ; - T3_dVddp = ( here->HSMHV2_rdrbb - 1.0e0 )* Fn_Pow( T1 , here->HSMHV2_rdrbb - 2.0e0 ) * T1_dVddp ; - T2 = T1 * T3 ; - T2_dT = T1 * T3_dT + T3 * T1_dT ; - T2_dVddp = T1 * T3_dVddp + T3 * T1_dVddp ; - T4 = 1.0e0 + T2 ; - T4_dT = T2_dT ; - T4_dVddp = T2_dVddp ; - } - T6 = Fn_Pow( T4 , ( - 1.0e0 / here->HSMHV2_rdrbb - 1.0e0 ) ) ; - T5 = T4 * T6 ; - T6_dT = ( - 1.0e0 / here->HSMHV2_rdrbb - 1.0e0 ) * Fn_Pow( T4 , ( - 1.0e0 / here->HSMHV2_rdrbb - 2.0e0 ) ) * T4_dT +T6*log(T4)/here->HSMHV2_rdrbb/here->HSMHV2_rdrbb*Rdrbb_dT ; - T6_dVddp = ( - 1.0e0 / here->HSMHV2_rdrbb - 1.0e0 ) * Fn_Pow( T4 , ( - 1.0e0 / here->HSMHV2_rdrbb - 2.0e0 ) ) * T4_dVddp ; - T5_dT = T4_dT * T6 + T4 * T6_dT ; - T5_dVddp = T4_dVddp * T6 + T4 * T6_dVddp ; - } - - Mu = Mu0 * T5 ; - Mu_dVddp = Mu0 * T5_dVddp ; - Mu_dT = Mu0_dT * T5 + Mu0 * T5_dT ; - - /*-----------------------------------------------------------* - * Carr : carrier density - *-----------------*/ - - T4 = 1.0e0 + T1 ; - T4_dVddp = T1_dVddp ; - T4_dT = T1_dT ; - - T5 = 1.0 / T4 ; - T5_dVddp = - T5 * T5 * T4_dVddp ; - T5_dT = - T5 * T5 * T4_dT ; - - Carr = Nover * ( 1.0 + Car * ( 1.0 - T5 ) * Vddpz / ( Ldrift - model->HSMHV2_rdrdl2 ) ) ; - Carr_dVddp = Nover * Car * ( - T5_dVddp * Vddpz + ( 1.0 - T5 ) * Vddpz_dVddp ) / ( Ldrift - model->HSMHV2_rdrdl2 ) ; - Carr_dT = Nover * ( Car_dT * ( 1.0 - T5 ) + Car * ( - T5_dT ) ) * Vddpz / ( Ldrift - model->HSMHV2_rdrdl2 ) ; - - Carr += - here->HSMHV2_QbuLD / C_QE * model->HSMHV2_rdrqover; - Carr_dVds = - here->HSMHV2_QbuLD_dVds / C_QE * model->HSMHV2_rdrqover; - Carr_dVgs = - here->HSMHV2_QbuLD_dVgs / C_QE * model->HSMHV2_rdrqover; - Carr_dVbs = - here->HSMHV2_QbuLD_dVbs / C_QE * model->HSMHV2_rdrqover; - Carr_dT += - here->HSMHV2_QbuLD_dTi / C_QE * model->HSMHV2_rdrqover; - - /*-----------------------------------------------------------* - * Xov : depth of the current flow - *-----------------*/ - T0 = -here->HSMHV2_Ps0LD ; - T0_dVd = -here->HSMHV2_Ps0LD_dVds ; - T0_dVg = -here->HSMHV2_Ps0LD_dVgs ; - T0_dVb = -here->HSMHV2_Ps0LD_dVbs ; - T0_dT = -here->HSMHV2_Ps0LD_dTi ; - - Fn_SZ( T0 , T0 , 1.0e-2 , T9 ) ; - T0 += epsm10 ; - T0_dVd *= T9 ; - T0_dVg *= T9 ; - T0_dVb *= T9 ; - T0_dT *= T9 ; - - Wdepl = sqrt ( here->HSMHV2_kdep * T0 ) ; - Wdepl_dVd = here->HSMHV2_kdep / ( 2.0 * Wdepl ) * T0_dVd ; - Wdepl_dVg = here->HSMHV2_kdep / ( 2.0 * Wdepl ) * T0_dVg ; - Wdepl_dVb = here->HSMHV2_kdep / ( 2.0 * Wdepl ) * T0_dVb ; - Wdepl_dT = here->HSMHV2_kdep / ( 2.0 * Wdepl ) * T0_dT ; - - T2 = Vds - Vbs + model->HSMHV2_vbi ; - T2_dVd = 1.0 ; - T2_dVb = -1.0 ; - - Fn_SZ( T2 , T2 , 1.0e-2 , T9 ) ; - T2 += epsm10 ; - T2_dVd *= T9 ; - T2_dVb *= T9 ; - - Wjunc0 = sqrt ( here->HSMHV2_kjunc * T2 ) ; - Wjunc0_dVd = here->HSMHV2_kjunc / ( 2.0 * Wjunc0 ) * T2_dVd ; - Wjunc0_dVb = here->HSMHV2_kjunc / ( 2.0 * Wjunc0 ) * T2_dVb ; - Fn_SU( Wjunc, Wjunc0, Xldld, 10e-3*Xldld, T0 ); - Wjunc_dVd = Wjunc0_dVd * T0; - Wjunc_dVb = Wjunc0_dVb * T0; -// Wrdrdjunc = model->HSMHV2_rdrdjunc + small ; - Wrdrdjunc = model->HSMHV2_rdrdjunc + epsm10 ; - - - Xov = here->HSMHV2_Xmax - Cx * ( here->HSMHV2_Xmax - / Wrdrdjunc * Wdepl + here->HSMHV2_Xmax / Xldld * Wjunc ) ; - Xov_dVds = - Cx * here->HSMHV2_Xmax / Wrdrdjunc * Wdepl_dVd - - Cx * here->HSMHV2_Xmax / Xldld * Wjunc_dVd ; - Xov_dVgs = - Cx * here->HSMHV2_Xmax / Wrdrdjunc * Wdepl_dVg ; - Xov_dVbs = - Cx * here->HSMHV2_Xmax / Wrdrdjunc * Wdepl_dVb - - Cx * here->HSMHV2_Xmax / Xldld * Wjunc_dVb ; - Xov_dT = - Cx_dT * ( here->HSMHV2_Xmax - / Wrdrdjunc * Wdepl + here->HSMHV2_Xmax / Xldld * Wjunc ) - - Cx * here->HSMHV2_Xmax / Wrdrdjunc * Wdepl_dT ; - - Fn_SZ( Xov , Xov , (1.0 - here->HSMHV2_rdrcx) * here->HSMHV2_Xmax / 100 , T9 ) ; - - Xov_dVds *= T9 ; - Xov_dVgs *= T9 ; - Xov_dVbs *= T9 ; - Xov_dT *= T9 ; - - /*-----------------------------------------------------------* - * Rd : drift resistance - *-----------------*/ - T0 = C_QE / ( Ldrift + model->HSMHV2_rdrdl1 ); - T1 = T0; - T1_dVd = 0.0 ; - - GD = T1 * Xov * Mu * Carr ; - GD_dVddp = T1 * Xov * Mu_dVddp * Carr - + T1 * Xov * Mu * Carr_dVddp ; - GD_dVgse = 0.0 ; - GD_dT = T1 * Xov * Mu_dT * Carr - + T1 * Xov_dT * Mu * Carr - + T1 * Xov * Mu * Carr_dT ; - GD_dVds = T1 * Mu * (Xov_dVds * Carr + Xov * Carr_dVds) - + T1_dVd * Mu * Xov * Carr; - GD_dVgs = T1 * Mu * (Xov_dVgs * Carr + Xov * Carr_dVgs); - GD_dVbs = T1 * Mu * (Xov_dVbs * Carr + Xov * Carr_dVbs); - - if ( GD <= 0 ) { -// GD = small ; - GD = epsm10 ; - GD_dVddp = 0.0 ; - GD_dVgse = 0.0 ; - GD_dT = 0.0 ; - GD_dVds = 0.0 ; - GD_dVgs = 0.0 ; - GD_dVbs = 0.0 ; - } - - Rd = 1 / GD ; - Rd_dVddp = - GD_dVddp * Rd * Rd ; - Rd_dVgse = - GD_dVgse * Rd * Rd ; - Rd_dT = - GD_dT * Rd * Rd ; - Rd_dVds = - GD_dVds * Rd * Rd ; - Rd_dVgs = - GD_dVgs * Rd * Rd ; - Rd_dVbs = - GD_dVbs * Rd * Rd ; - - /* Weff dependence of the resistances */ - Rd = Rd / WeffLD_nf ; - - Fn_SU_CP( Rd, Rd, 1e6, 1e3, 2, T0 ) ; - - Rd_dVddp = Rd_dVddp*T0/WeffLD_nf ; - Rd_dVgse = Rd_dVgse*T0/WeffLD_nf ; - Rd_dT = Rd_dT*T0/WeffLD_nf ; - Rd_dVds = Rd_dVds*T0/WeffLD_nf ; - Rd_dVgs = Rd_dVgs*T0/WeffLD_nf ; - Rd_dVbs = Rd_dVbs*T0/WeffLD_nf ; - - if ( here->HSMHV2subNode >= 0 && - ( pParam->HSMHV2_nover * ( modelMKS->HSMHV2_nsubsub + pParam->HSMHV2_nover ) ) > 0 ) { - /* external substrate node exists && LDMOS case: */ - /* Substrate Effect */ - T0 = model->HSMHV2_vbisub - model->HSMHV2_rdvdsub * here->HSMHV2_Vdserevz - model->HSMHV2_rdvsub * here->HSMHV2_Vsubsrev ; - - Fn_SZ( T1, T0, 10.0, T2 ) ; - T1 += epsm10 ; - - T1_dVdserev = - model->HSMHV2_rdvdsub * here->HSMHV2_Vdserevz_dVd * T2 ; - T1_dVsubsrev = - model->HSMHV2_rdvsub * T2 ; - - T0 = modelMKS->HSMHV2_nsubsub / ( pParam->HSMHV2_nover * ( modelMKS->HSMHV2_nsubsub + pParam->HSMHV2_nover ) ) ; - - T4 = 2 * C_ESI / C_QE * T0 ; - Wdep = sqrt ( T4 * T1 ) + small ; - - Wdep_dVdserev = 0.5 * T4 * T1_dVdserev / Wdep ; - Wdep_dVsubsrev = 0.5 * T4 * T1_dVsubsrev / Wdep ; - - Fn_SU( Wdep, Wdep, model->HSMHV2_ddrift, C_sub_delta * model->HSMHV2_ddrift, T0 ) ; - Wdep_dVdserev *= T0 ; - Wdep_dVsubsrev *= T0 ; - - T0 = model->HSMHV2_ddrift - Wdep ; - Fn_SZ( T0, T0, C_sub_delta2, T2 ) ; - T0 += epsm10; - - T6 = (here->HSMHV2_ldrift1 + here->HSMHV2_ldrift2 ) / T0 ; - T6_dVdserev = T2 * Wdep_dVdserev * T6 / T0 ; - T6_dVsubsrev = T2 * Wdep_dVsubsrev * T6 / T0 ; - - T0 = Rd ; - Rd = T0 * T6 ; - Rd_dVddp = Rd_dVddp * T6 ; - Rd_dVgse = Rd_dVgse * T6 ; - Rd_dVdse = T0 * T6_dVdserev ; - Rd_dVbse = Rd_dVgse * T6 ; - - Rd_dVds = Rd_dVds * T6 ; - Rd_dVgs = Rd_dVgs * T6 ; - Rd_dVbs = Rd_dVbs * T6 ; - Rd_dVsubs = T0 * T6_dVsubsrev ; - Rd_dT = Rd_dT * T6 ; - - } - - - /* Sheet resistances are added. */ - Rd += here->HSMHV2_rd0 ; - - /* Re-stamps for hsmhvnoi.c */ - /* Please see hsmhvnoi.c */ - if ( Rd > Res_min && model->HSMHV2_cothrml ) - here->HSMHV2drainConductance = Mfactor / Rd ; - else here->HSMHV2drainConductance = 0.0 ; - if ( here->HSMHV2_Rs > Res_min && model->HSMHV2_cothrml ) - here->HSMHV2sourceConductance = Mfactor / here->HSMHV2_rs0 ; - else here->HSMHV2sourceConductance = 0.0 ; - - /* Clamping to Res_min */ - here->HSMHV2_Rs = here->HSMHV2_rs0 / Mfactor ; - if(here->HSMHV2_Rs < Res_min) { here->HSMHV2_Rs = Res_min ; } - here->HSMHV2_dRs_dVdse = 0.0 ; - here->HSMHV2_dRs_dVgse = 0.0 ; - here->HSMHV2_dRs_dVbse = 0.0 ; - here->HSMHV2_dRs_dVsubs = 0.0 ; - here->HSMHV2_dRs_dTi = 0.0 ; - - - /* Clamping to Res_min */ - here->HSMHV2_Rd = Rd / Mfactor ; - if(here->HSMHV2_Rd < Res_min) { - here->HSMHV2_Rd = Res_min ; - here->HSMHV2_dRd_dVddp = 0.0 ; - here->HSMHV2_dRd_dVdse = 0.0 ; - here->HSMHV2_dRd_dVgse = 0.0 ; - here->HSMHV2_dRd_dVbse = 0.0 ; - here->HSMHV2_dRd_dVsubs = 0.0 ; - here->HSMHV2_dRd_dTi = 0.0 ; - here->HSMHV2_dRd_dVds = 0.0 ; - here->HSMHV2_dRd_dVgs = 0.0 ; - here->HSMHV2_dRd_dVbs = 0.0 ; - } else { - here->HSMHV2_dRd_dVddp = Rd_dVddp / Mfactor ; - here->HSMHV2_dRd_dVdse = Rd_dVdse / Mfactor ; - here->HSMHV2_dRd_dVgse = Rd_dVgse / Mfactor ; - here->HSMHV2_dRd_dVbse = Rd_dVbse / Mfactor ; - here->HSMHV2_dRd_dVsubs= Rd_dVsubs / Mfactor ; - here->HSMHV2_dRd_dTi = Rd_dT / Mfactor ; - here->HSMHV2_dRd_dVds = Rd_dVds / Mfactor ; - here->HSMHV2_dRd_dVgs = Rd_dVgs / Mfactor ; - here->HSMHV2_dRd_dVbs = Rd_dVbs / Mfactor ; - } - - - return ( HiSIM_OK ) ; - -} diff --git a/src/spicelib/devices/hisimhv2/hsmhv2evalenv.h b/src/spicelib/devices/hisimhv2/hsmhv2evalenv.h deleted file mode 100644 index cb2150a2f..000000000 --- a/src/spicelib/devices/hisimhv2/hsmhv2evalenv.h +++ /dev/null @@ -1,142 +0,0 @@ -/*********************************************************************** - - HiSIM (Hiroshima University STARC IGFET Model) - Copyright (C) 2014 Hiroshima University & STARC - - MODEL NAME : HiSIM_HV - ( VERSION : 2 SUBVERSION : 2 REVISION : 0 ) - Model Parameter 'VERSION' : 2.20 - FILE : hsmhvevalenv.h - - DATE : 2014.6.11 - - released by - Hiroshima University & - Semiconductor Technology Academic Research Center (STARC) -***********************************************************************/ - -/********************************************************************** - -The following source code, and all copyrights, trade secrets or other -intellectual property rights in and to the source code in its entirety, -is owned by the Hiroshima University and the STARC organization. - -All users need to follow the "HISIM_HV Distribution Statement and -Copyright Notice" attached to HiSIM_HV model. - ------HISIM_HV Distribution Statement and Copyright Notice-------------- - -Software is distributed as is, completely without warranty or service -support. Hiroshima University or STARC and its employees are not liable -for the condition or performance of the software. - -Hiroshima University and STARC own the copyright and grant users a perpetual, -irrevocable, worldwide, non-exclusive, royalty-free license with respect -to the software as set forth below. - -Hiroshima University and STARC hereby disclaims all implied warranties. - -Hiroshima University and STARC grant the users the right to modify, copy, -and redistribute the software and documentation, both within the user's -organization and externally, subject to the following restrictions - -1. The users agree not to charge for Hiroshima University and STARC code -itself but may charge for additions, extensions, or support. - -2. In any product based on the software, the users agree to acknowledge -Hiroshima University and STARC that developed the software. This -acknowledgment shall appear in the product documentation. - -3. The users agree to reproduce any copyright notice which appears on -the software on any copy or modification of such made available -to others." - -Toshimasa Asahara, President, Hiroshima University -Mitiko Miura-Mattausch, Professor, Hiroshima University -Katsuhiro Shimohigashi, President&CEO, STARC -June 2008 (revised October 2011) -*************************************************************************/ - -#ifndef HSMHV2_EVAL_ENV_H -#define HSMHV2_EVAL_ENV_H - -/* macros and constants used in hsmhveval2yz.c */ - -/*---------------------------------------------------* -* Numerical constants. (macro) -*-----------------*/ - -/* machine epsilon */ -#if defined(_FLOAT_H) && defined(DBL_EPSILON) -#define C_EPS_M (DBL_EPSILON) -#else -#define C_EPS_M (2.2204460492503131e-16) -#endif - -#define MAX_EXP 5.834617425e14 -#define MIN_EXP 1.713908431e-15 -#define EXP_THR 34.0 - -/* sqrt(2) */ -#define C_SQRT_2 (1.414213562373095e+00) - -/* 1/3 */ -#define C_1o3 (3.333333333333333e-01) -/* 2/3 */ -#define C_2o3 (6.666666666666667e-01) -/* 2^(1/3) */ -#define C_2p_1o3 (1.259921049894873e+00) - -/* Pi */ -#define C_Pi (3.141592653589793) -#define C_Pio2 (1.570796326794897) - -/* Unit change */ -#define C_m2cm_p2 (1.0e4) -#define C_m2um (1.0e6) - -/*---------------------------------------------------* -* Physical constants/properties. (macro) -*-----------------*/ -/* Elemental charge */ -#define C_QE (1.6021918e-19) - -/* Boltzmann constant */ -#define C_KB (1.3806226e-23) - -/* Permitivity of Si, SiO2 and vacuum */ -#define C_ESI (1.034943e-10) -#define C_EOX (3.453133e-11) -#define C_VAC (8.8541878e-12) - -/* Room temperature constants */ -#define C_T300 (300e+00) -#define C_b300 (3.868283e+01) -/* #define C_Eg0 (1.1785e0) */ /*changed to parameter sIN.eg0*/ - -/* Build-in potential */ -/*#define C_Vbi (1.0e0)*/ /* changed to parameter sIN.vbi */ - - -/* Intrinsic carrier density at 300K */ -#define C_Nin0 (1.04e+16) - - -/*---------------------------------------------------* -* Functions. (macro) Take care of the arguments. -*-----------------*/ -#define Fn_Sqr(x) ( (x)*(x) ) /* x^2 */ -#define Fn_Max(x,y) ( (x) >= (y) ? (x) : (y) ) /* max[x,y] */ -#define Fn_Min(x,y) ( (x) <= (y) ? (x) : (y) ) /* min[x,y] */ -#define Fn_Sgn(x) ( (x) >= 0 ? (1) : (-1) ) /* sign[x] */ - -/*===========================================================* -* pow -*=================*/ -#ifdef POW_TO_EXP_AND_LOG -#define Fn_Pow( x , y ) exp( (y) * log( x ) ) -#else -#define Fn_Pow( x , y ) pow( x , y ) -#endif - -#endif /* HSMHV2_EVAL_ENV_H */ diff --git a/src/spicelib/devices/hisimhv2/hsmhv2ext.h b/src/spicelib/devices/hisimhv2/hsmhv2ext.h deleted file mode 100644 index 77d600772..000000000 --- a/src/spicelib/devices/hisimhv2/hsmhv2ext.h +++ /dev/null @@ -1,37 +0,0 @@ -/*********************************************************************** - - HiSIM (Hiroshima University STARC IGFET Model) - Copyright (C) 2014 Hiroshima University & STARC - - MODEL NAME : HiSIM_HV - ( VERSION : 2 SUBVERSION : 2 REVISION : 0 ) - Model Parameter 'VERSION' : 2.20 - FILE : hsmhvext.h - - DATE : 2014.6.11 - - released by - Hiroshima University & - Semiconductor Technology Academic Research Center (STARC) -***********************************************************************/ - -extern int HSMHV2acLoad(GENmodel *,CKTcircuit*); -extern int HSMHV2ask(CKTcircuit *,GENinstance*,int,IFvalue*,IFvalue*); -extern int HSMHV2convTest(GENmodel *,CKTcircuit*); -extern int HSMHV2getic(GENmodel*,CKTcircuit*); -extern int HSMHV2load(GENmodel*,CKTcircuit*); -extern int HSMHV2mAsk(CKTcircuit*,GENmodel *,int, IFvalue*); -extern int HSMHV2mParam(int,IFvalue*,GENmodel*); -extern void HSMHV2mosCap(CKTcircuit*, double, double, double, double*, - double, double, double, double, double, double, - double*, double*, double*, double*, double*, double*, double*, double*, - double*, double*, double*, double*, double*, double*, double*, - double*); -extern int HSMHV2param(int,IFvalue*,GENinstance*,IFvalue*); -extern int HSMHV2pzLoad(GENmodel*,CKTcircuit*,SPcomplex*); -extern int HSMHV2setup(SMPmatrix*,GENmodel*,CKTcircuit*,int*); -extern int HSMHV2unsetup(GENmodel*,CKTcircuit*); -extern int HSMHV2temp(GENmodel*,CKTcircuit*); -extern int HSMHV2trunc(GENmodel*,CKTcircuit*,double*); -extern int HSMHV2noise(int,int,GENmodel*,CKTcircuit*,Ndata*,double*); -extern int HSMHV2soaCheck(CKTcircuit *, GENmodel *); diff --git a/src/spicelib/devices/hisimhv2/hsmhv2getic.c b/src/spicelib/devices/hisimhv2/hsmhv2getic.c deleted file mode 100644 index b55455f09..000000000 --- a/src/spicelib/devices/hisimhv2/hsmhv2getic.c +++ /dev/null @@ -1,98 +0,0 @@ -/*********************************************************************** - - HiSIM (Hiroshima University STARC IGFET Model) - Copyright (C) 2014 Hiroshima University & STARC - - MODEL NAME : HiSIM_HV - ( VERSION : 2 SUBVERSION : 2 REVISION : 0 ) - Model Parameter 'VERSION' : 2.20 - FILE : hsmhvgetic.c - - DATE : 2014.6.11 - - released by - Hiroshima University & - Semiconductor Technology Academic Research Center (STARC) -***********************************************************************/ - -/********************************************************************** - -The following source code, and all copyrights, trade secrets or other -intellectual property rights in and to the source code in its entirety, -is owned by the Hiroshima University and the STARC organization. - -All users need to follow the "HISIM_HV Distribution Statement and -Copyright Notice" attached to HiSIM_HV model. - ------HISIM_HV Distribution Statement and Copyright Notice-------------- - -Software is distributed as is, completely without warranty or service -support. Hiroshima University or STARC and its employees are not liable -for the condition or performance of the software. - -Hiroshima University and STARC own the copyright and grant users a perpetual, -irrevocable, worldwide, non-exclusive, royalty-free license with respect -to the software as set forth below. - -Hiroshima University and STARC hereby disclaims all implied warranties. - -Hiroshima University and STARC grant the users the right to modify, copy, -and redistribute the software and documentation, both within the user's -organization and externally, subject to the following restrictions - -1. The users agree not to charge for Hiroshima University and STARC code -itself but may charge for additions, extensions, or support. - -2. In any product based on the software, the users agree to acknowledge -Hiroshima University and STARC that developed the software. This -acknowledgment shall appear in the product documentation. - -3. The users agree to reproduce any copyright notice which appears on -the software on any copy or modification of such made available -to others." - -Toshimasa Asahara, President, Hiroshima University -Mitiko Miura-Mattausch, Professor, Hiroshima University -Katsuhiro Shimohigashi, President&CEO, STARC -June 2008 (revised October 2011) -*************************************************************************/ - -#include "ngspice/ngspice.h" -#include "ngspice/cktdefs.h" -#include "hsmhv2def.h" -#include "ngspice/sperror.h" -#include "ngspice/suffix.h" - -int HSMHV2getic( - GENmodel *inModel, - CKTcircuit *ckt) -{ - HSMHV2model *model = (HSMHV2model*)inModel; - HSMHV2instance *here; - /* - * grab initial conditions out of rhs array. User specified, so use - * external nodes to get values - */ - - for ( ;model ;model = HSMHV2nextModel(model)) { - for ( here = HSMHV2instances(model); here ;here = HSMHV2nextInstance(here)) { - if (!here->HSMHV2_icVBS_Given) { - here->HSMHV2_icVBS = - *(ckt->CKTrhs + here->HSMHV2bNode) - - *(ckt->CKTrhs + here->HSMHV2sNode); - } - if (!here->HSMHV2_icVDS_Given) { - here->HSMHV2_icVDS = - *(ckt->CKTrhs + here->HSMHV2dNode) - - *(ckt->CKTrhs + here->HSMHV2sNode); - } - if (!here->HSMHV2_icVGS_Given) { - here->HSMHV2_icVGS = - *(ckt->CKTrhs + here->HSMHV2gNode) - - *(ckt->CKTrhs + here->HSMHV2sNode); - } - } - } - return(OK); -} - diff --git a/src/spicelib/devices/hisimhv2/hsmhv2init.c b/src/spicelib/devices/hisimhv2/hsmhv2init.c deleted file mode 100644 index 6f5f536cc..000000000 --- a/src/spicelib/devices/hisimhv2/hsmhv2init.c +++ /dev/null @@ -1,76 +0,0 @@ -#include "ngspice/config.h" - -#include "ngspice/devdefs.h" - -#include "hsmhv2def.h" -#include "hsmhv2itf.h" -#include "hsmhv2init.h" - - -SPICEdev HSMHV2info = { - .DEVpublic = { - .name = "HiSIMHV2", - .description = "Hiroshima University STARC IGFET Model - HiSIM_HV v.2", - .terms = &HSMHV2nSize, - .numNames = &HSMHV2nSize, - .termNames = HSMHV2names, - .numInstanceParms = &HSMHV2pTSize, - .instanceParms = HSMHV2pTable, - .numModelParms = &HSMHV2mPTSize, - .modelParms = HSMHV2mPTable, - .flags = DEV_DEFAULT, - -#ifdef XSPICE - .cm_func = NULL, - .num_conn = 0, - .conn = NULL, - .num_param = 0, - .param = NULL, - .num_inst_var = 0, - .inst_var = NULL, -#endif - }, - - .DEVparam = HSMHV2param, - .DEVmodParam = HSMHV2mParam, - .DEVload = HSMHV2load, - .DEVsetup = HSMHV2setup, - .DEVunsetup = HSMHV2unsetup, - .DEVpzSetup = HSMHV2setup, - .DEVtemperature = HSMHV2temp, - .DEVtrunc = HSMHV2trunc, - .DEVfindBranch = NULL, - .DEVacLoad = HSMHV2acLoad, - .DEVaccept = NULL, - .DEVdestroy = NULL, - .DEVmodDelete = NULL, - .DEVdelete = NULL, - .DEVsetic = HSMHV2getic, - .DEVask = HSMHV2ask, - .DEVmodAsk = HSMHV2mAsk, - .DEVpzLoad = HSMHV2pzLoad, - .DEVconvTest = HSMHV2convTest, - .DEVsenSetup = NULL, - .DEVsenLoad = NULL, - .DEVsenUpdate = NULL, - .DEVsenAcLoad = NULL, - .DEVsenPrint = NULL, - .DEVsenTrunc = NULL, - .DEVdisto = NULL, - .DEVnoise = HSMHV2noise, - .DEVsoaCheck = HSMHV2soaCheck, - .DEVinstSize = &HSMHV2iSize, - .DEVmodSize = &HSMHV2mSize, - -#ifdef CIDER - .DEVdump = NULL, - .DEVacct = NULL, -#endif -}; - - -SPICEdev * -get_hsmhv2_info(void) -{ - return &HSMHV2info; -} diff --git a/src/spicelib/devices/hisimhv2/hsmhv2init.h b/src/spicelib/devices/hisimhv2/hsmhv2init.h deleted file mode 100644 index 39cbb9ee4..000000000 --- a/src/spicelib/devices/hisimhv2/hsmhv2init.h +++ /dev/null @@ -1,13 +0,0 @@ -#ifndef _HSMHV2INIT_H -#define _HSMHV2INIT_H - -extern IFparm HSMHV2pTable[ ]; -extern IFparm HSMHV2mPTable[ ]; -extern char *HSMHV2names[ ]; -extern int HSMHV2pTSize; -extern int HSMHV2mPTSize; -extern int HSMHV2nSize; -extern int HSMHV2iSize; -extern int HSMHV2mSize; - -#endif diff --git a/src/spicelib/devices/hisimhv2/hsmhv2itf.h b/src/spicelib/devices/hisimhv2/hsmhv2itf.h deleted file mode 100644 index 7cc2490c1..000000000 --- a/src/spicelib/devices/hisimhv2/hsmhv2itf.h +++ /dev/null @@ -1,65 +0,0 @@ -/*********************************************************************** - - HiSIM (Hiroshima University STARC IGFET Model) - Copyright (C) 2014 Hiroshima University & STARC - - MODEL NAME : HiSIM_HV - ( VERSION : 2 SUBVERSION : 2 REVISION : 0 ) - Model Parameter 'VERSION' : 2.20 - FILE : hsmhvitf - - DATE : 2014.6.11 - - released by - Hiroshima University & - Semiconductor Technology Academic Research Center (STARC) -***********************************************************************/ - -/********************************************************************** - -The following source code, and all copyrights, trade secrets or other -intellectual property rights in and to the source code in its entirety, -is owned by the Hiroshima University and the STARC organization. - -All users need to follow the "HISIM_HV Distribution Statement and -Copyright Notice" attached to HiSIM_HV model. - ------HISIM_HV Distribution Statement and Copyright Notice-------------- - -Software is distributed as is, completely without warranty or service -support. Hiroshima University or STARC and its employees are not liable -for the condition or performance of the software. - -Hiroshima University and STARC own the copyright and grant users a perpetual, -irrevocable, worldwide, non-exclusive, royalty-free license with respect -to the software as set forth below. - -Hiroshima University and STARC hereby disclaims all implied warranties. - -Hiroshima University and STARC grant the users the right to modify, copy, -and redistribute the software and documentation, both within the user's -organization and externally, subject to the following restrictions - -1. The users agree not to charge for Hiroshima University and STARC code -itself but may charge for additions, extensions, or support. - -2. In any product based on the software, the users agree to acknowledge -Hiroshima University and STARC that developed the software. This -acknowledgment shall appear in the product documentation. - -3. The users agree to reproduce any copyright notice which appears on -the software on any copy or modification of such made available -to others." - -Toshimasa Asahara, President, Hiroshima University -Mitiko Miura-Mattausch, Professor, Hiroshima University -Katsuhiro Shimohigashi, President&CEO, STARC -June 2008 (revised October 2011) -*************************************************************************/ - -#ifndef DEV_HISIMHV2 -#define DEV_HISIMHV2 - -SPICEdev *get_hsmhv2_info(void); - -#endif diff --git a/src/spicelib/devices/hisimhv2/hsmhv2ld.c b/src/spicelib/devices/hisimhv2/hsmhv2ld.c deleted file mode 100644 index 351a9f238..000000000 --- a/src/spicelib/devices/hisimhv2/hsmhv2ld.c +++ /dev/null @@ -1,2833 +0,0 @@ -/*********************************************************************** - - HiSIM (Hiroshima University STARC IGFET Model) - Copyright (C) 2014 Hiroshima University & STARC - - MODEL NAME : HiSIM_HV - ( VERSION : 2 SUBVERSION : 2 REVISION : 0 ) - Model Parameter 'VERSION' : 2.20 - FILE : hsmhvld.c - - DATE : 2014.6.11 - - released by - Hiroshima University & - Semiconductor Technology Academic Research Center (STARC) -***********************************************************************/ - -/********************************************************************** - -The following source code, and all copyrights, trade secrets or other -intellectual property rights in and to the source code in its entirety, -is owned by the Hiroshima University and the STARC organization. - -All users need to follow the "HISIM_HV Distribution Statement and -Copyright Notice" attached to HiSIM_HV model. - ------HISIM_HV Distribution Statement and Copyright Notice-------------- - -Software is distributed as is, completely without warranty or service -support. Hiroshima University or STARC and its employees are not liable -for the condition or performance of the software. - -Hiroshima University and STARC own the copyright and grant users a perpetual, -irrevocable, worldwide, non-exclusive, royalty-free license with respect -to the software as set forth below. - -Hiroshima University and STARC hereby disclaims all implied warranties. - -Hiroshima University and STARC grant the users the right to modify, copy, -and redistribute the software and documentation, both within the user's -organization and externally, subject to the following restrictions - -1. The users agree not to charge for Hiroshima University and STARC code -itself but may charge for additions, extensions, or support. - -2. In any product based on the software, the users agree to acknowledge -Hiroshima University and STARC that developed the software. This -acknowledgment shall appear in the product documentation. - -3. The users agree to reproduce any copyright notice which appears on -the software on any copy or modification of such made available -to others." - -Toshimasa Asahara, President, Hiroshima University -Mitiko Miura-Mattausch, Professor, Hiroshima University -Katsuhiro Shimohigashi, President&CEO, STARC -June 2008 (revised October 2011) -*************************************************************************/ - -#include "ngspice/ngspice.h" -#include "hisimhv2.h" -#include "ngspice/trandefs.h" -#include "ngspice/const.h" -#include "ngspice/sperror.h" -#include "ngspice/devdefs.h" -#include "ngspice/suffix.h" - -#define SHOW_EPS_QUANT 1.0e-15 - -static void ShowPhysVals -( - HSMHV2instance *here, - HSMHV2model *model, - int isFirst, - double vds, - double vgs, - double vbs, - double vgd, - double vbd, - double vgb - ) -{ - - NG_IGNORE(vgd); - NG_IGNORE(vbd); - - /* */ - /* */ - /* Note: This function is not yet adapted to the flat version */ - /* */ - /* */ - - /* regard the epsilon-quantity as 0.0 */ - vds = (fabs(vds) < SHOW_EPS_QUANT) ? 0.0 : vds; - vgs = (fabs(vgs) < SHOW_EPS_QUANT) ? 0.0 : vgs; - vbs = (fabs(vbs) < SHOW_EPS_QUANT) ? 0.0 : vbs; - vgb = (fabs(vgb) < SHOW_EPS_QUANT) ? 0.0 : vgb; - switch (model->HSMHV2_show) { - case 1: - if (isFirst) printf("Vds Ids\n"); - printf("%e %e\n", model->HSMHV2_type*vds, here->HSMHV2_mode*here->HSMHV2_ids); - break; - case 2: - if (isFirst) printf("Vgs Ids\n"); - printf("%e %e\n", model->HSMHV2_type*vgs, here->HSMHV2_mode*here->HSMHV2_ids); - break; - case 3: - if (isFirst) printf("Vgs log10(|Ids|)\n"); - printf("%e %e\n", model->HSMHV2_type*vgs, log10(here->HSMHV2_ids)); - break; - case 4: - if (isFirst) printf("log10(|Ids|) gm/|Ids|\n"); - if (here->HSMHV2_ids == 0.0) - printf("I can't show gm/Ids - log10(Ids), because Ids = 0.\n"); - else - printf("%e %e\n", log10(here->HSMHV2_ids), here->HSMHV2_gm/here->HSMHV2_ids); - break; - case 5: - if (isFirst) printf("Vds gds\n"); - printf("%e %e\n", model->HSMHV2_type*vds, here->HSMHV2_gds); - break; - case 6: - if (isFirst) printf("Vgs gm\n"); - printf("%e %e\n", model->HSMHV2_type*vgs, here->HSMHV2_gm); - break; - case 7: - if (isFirst) printf("Vbs gbs\n"); - printf("%e %e\n", model->HSMHV2_type*vbs, here->HSMHV2_gmbs); - break; - case 8: - if (isFirst) printf("Vgs Cgg\n"); - printf("%e %e\n", model->HSMHV2_type*vgs, here->HSMHV2_cggb); - break; - case 9: - if (isFirst) printf("Vgs Cgs\n"); - printf("%e %e\n", model->HSMHV2_type*vgs, here->HSMHV2_cgsb); - break; - case 10: - if (isFirst) printf("Vgs Cgd\n"); - printf("%e %e\n", model->HSMHV2_type*vgs, here->HSMHV2_cgdb); - break; - case 11: - if (isFirst) printf("Vgs Cgb\n"); - printf("%e %e\n", model->HSMHV2_type*vgs, -(here->HSMHV2_cggb+here->HSMHV2_cgsb+here->HSMHV2_cgdb)); - break; - case 12: - if (isFirst) printf("Vds Csg\n"); - printf("%e %e\n", model->HSMHV2_type*vds, -(here->HSMHV2_cggb+here->HSMHV2_cbgb+here->HSMHV2_cdgb)); - break; - case 13: - if (isFirst) printf("Vds Cdg\n"); - printf("%e %e\n", model->HSMHV2_type*vds, here->HSMHV2_cdgb); - break; - case 14: - if (isFirst) printf("Vds Cbg\n"); - printf("%e %e\n", model->HSMHV2_type*vds, here->HSMHV2_cbgb); - break; - case 15: - if (isFirst) printf("Vds Cgg\n"); - printf("%e %e\n", model->HSMHV2_type*vds, here->HSMHV2_cggb); - break; - case 16: - if (isFirst) printf("Vds Cgs\n"); - printf("%e %e\n", model->HSMHV2_type*vds, here->HSMHV2_cgsb); - break; - case 17: - if (isFirst) printf("Vds Cgd\n"); - printf("%e %e\n", model->HSMHV2_type*vds, here->HSMHV2_cgdb); - break; - case 18: - if (isFirst) printf("Vds Cgb\n"); - printf("%e %e\n", model->HSMHV2_type*vds, -(here->HSMHV2_cggb+here->HSMHV2_cgsb+here->HSMHV2_cgdb)); - break; - case 19: - if (isFirst) printf("Vgs Csg\n"); - printf("%e %e\n", model->HSMHV2_type*vgs, -(here->HSMHV2_cggb+here->HSMHV2_cbgb+here->HSMHV2_cdgb)); - break; - case 20: - if (isFirst) printf("Vgs Cdg\n"); - printf("%e %e\n", model->HSMHV2_type*vgs, here->HSMHV2_cdgb); - break; - case 21: - if (isFirst) printf("Vgs Cbg\n"); - printf("%e %e\n", model->HSMHV2_type*vgs, here->HSMHV2_cbgb); - break; - case 22: - if (isFirst) printf("Vgb Cgb\n"); - printf("%e %e\n", model->HSMHV2_type*vgb, -(here->HSMHV2_cggb+here->HSMHV2_cgsb+here->HSMHV2_cgdb)); - break; - case 50: - if (isFirst) printf("Vgs Vds Vbs Vgb Ids log10(|Ids|) gm/|Ids| gm gds gbs Cgg Cgs Cgb Cgd Csg Cbg Cdg\n"); - printf("%e %e %e %e %e %e %e %e %e %e %e %e %e %e %e %e %e\n", - model->HSMHV2_type*vgs, model->HSMHV2_type*vds, model->HSMHV2_type*vbs, model->HSMHV2_type*vgb, here->HSMHV2_mode*here->HSMHV2_ids, - log10(here->HSMHV2_ids), here->HSMHV2_gm/here->HSMHV2_ids, here->HSMHV2_gm, here->HSMHV2_gds, here->HSMHV2_gmbs, here->HSMHV2_cggb, - here->HSMHV2_cgsb, -(here->HSMHV2_cggb+here->HSMHV2_cgsb+here->HSMHV2_cgdb), here->HSMHV2_cgdb, - -(here->HSMHV2_cggb+here->HSMHV2_cbgb+here->HSMHV2_cdgb), here->HSMHV2_cbgb, here->HSMHV2_cdgb); - break; - default: - /* - printf("There is no physical value corrsponding to %d\n", flag); - */ - break; - } -} - -int HSMHV2load( - GENmodel *inModel, - CKTcircuit *ckt) - /* actually load the current value into the - * sparse matrix previously provided - */ -{ - HSMHV2model *model = (HSMHV2model*)inModel; - HSMHV2instance *here; - HSMHV2binningParam *pParam; - HSMHV2modelMKSParam *modelMKS ; - HSMHV2hereMKSParam *hereMKS ; - - - - /* node voltages */ -#define XDIM 14 - double x[XDIM] ; - - /* branch voltages */ - double vbd=0.0, vbs=0.0, vds=0.0, vgb=0.0, vgd=0.0, vgdo=0.0, vgs=0.0 ; - double vdbs=0.0, vsbs=0.0, vdbd=0.0 ; - double vges=0.0, vged=0.0, vgedo=0.0 ; - double vbs_jct=0.0, vbd_jct=0.0; - double deltemp = 0.0 , deltemp_old = 0.0 ; - double vggp=0, vddp=0, vssp=0, vbpb=0, vbpsb=0, vbpdb=0 ; - double vdse=0.0, vgse=0.0, vbse=0.0 ; - double vsubs=0.0 ; /* substrate bias */ - - double ivds=0.0, ivgs=0.0, ivbs=0.0 ; - double ivgse=0.0, ivdse=0.0, ivbse=0.0 ; - - /* delta of branch voltages */ - double delvbs=0.0, delvds=0.0, delvgs=0.0, delvsbs=0.0, delvdbd=0.0, deldeltemp = 0.0 ; - double delvdse=0.0, delvgse=0.0, delvbse=0.0, delvddp=0.0, delvssp=0.0, delvggp=0.0, delvbpb=0.0, delvbpdb=0.0, delvbpsb =0.0 ; - double delvsubs=0.0; /* substrate bias change */ - - /* branch currents */ - double Ids=0.0, gds=0.0, gm=0.0, gmbs=0.0, gmT=0.0, - gds_ext=0.0, gm_ext=0.0, gmbs_ext=0.0 ; - double Igd=0.0, dIgd_dVd=0.0, dIgd_dVg=0.0, dIgd_dVb=0.0, dIgd_dVs=0.0, dIgd_dT=0.0 ; - double Igs=0.0, dIgs_dVd=0.0, dIgs_dVg=0.0, dIgs_dVb=0.0, dIgs_dVs=0.0, dIgs_dT=0.0 ; - double Igb=0.0, dIgb_dVd=0.0, dIgb_dVg=0.0, dIgb_dVb=0.0, dIgb_dVs=0.0, dIgb_dT=0.0 ; - double Isub=0.0, dIsub_dVds=0.0, dIsub_dVgs=0.0, dIsub_dVbs=0.0, dIsub_dT=0.0 ; - double Isubs=0.0, dIsubs_dVds=0.0, dIsubs_dVgs=0.0, dIsubs_dVbs=0.0, dIsubs_dT=0.0 ; - double IsubLD=0.0, dIsubLD_dVds=0.0, dIsubLD_dVgs=0.0, dIsubLD_dVbs=0.0, dIsubLD_dT=0.0 ; - double IsubLDs=0.0, dIsubLDs_dVds=0.0, dIsubLDs_dVgs=0.0, dIsubLDs_dVbs=0.0, dIsubLDs_dT=0.0 ; - double dIsubLD_dVddp=0.0, dIsubLDs_dVddp=0.0 ; - double IdsIBPC=0.0, dIdsIBPC_dVds=0.0, dIdsIBPC_dVgs=0.0, dIdsIBPC_dVbs=0.0, dIdsIBPC_dT=0.0 ; - double IdsIBPCs=0.0, dIdsIBPCs_dVds=0.0, dIdsIBPCs_dVgs=0.0, dIdsIBPCs_dVbs=0.0, dIdsIBPCs_dT=0.0 ; - double dIdsIBPC_dVddp=0.0, dIdsIBPCs_dVddp=0.0 ; - double Igidl=0.0, dIgidl_dVds=0.0, dIgidl_dVgs=0.0, dIgidl_dVbs=0.0, dIgidl_dT=0.0 ; - double Igisl=0.0, dIgisl_dVds=0.0, dIgisl_dVgs=0.0, dIgisl_dVbs=0.0, dIgisl_dT=0.0 ; - double Ibd=0.0, Gbd=0.0, Gbdt=0.0 ; - double Ibs=0.0, Gbs=0.0, Gbst=0.0 ; - double Iddp=0.0, dIddp_dVddp=0.0, dIddp_dVdse=0.0, dIddp_dVgse=0.0, dIddp_dVbse=0.0, dIddp_dVsubs=0.0, dIddp_dT =0.0 , dIddp_dVds =0.0, dIddp_dVgs =0.0, dIddp_dVbs =0.0 ; - double Issp=0.0, dIssp_dVssp=0.0, dIssp_dVdse=0.0, dIssp_dVgse=0.0, dIssp_dVbse=0.0, dIssp_dVsubs=0.0, dIssp_dT =0.0 ; - double Iggp=0.0, dIggp_dVggp =0.0 ; - double Ibpb=0.0, dIbpb_dVbpb =0.0 ; - double Ibpdb=0.0, dIbpdb_dVbpdb =0.0 ; - double Ibpsb=0.0, dIbpsb_dVbpsb =0.0 ; - double Ith=0.0, dIth_dT =0.0 ; - - /* displacement currents */ - double cq_d=0.0, cq_dP=0.0, cq_g=0.0, cq_gP=0.0, cq_s=0.0, cq_sP=0.0, cq_bP=0.0, cq_b=0.0, cq_db=0.0, cq_sb=0.0, cq_t=0.0 ; - double cq_dE=0.0, cq_gE=0.0, cq_sE=0.0, cq_bE=0.0 ; - - /* node currents */ - double cur_d=0.0, cur_dP=0.0, cur_g=0.0, cur_gP=0.0, cur_s=0.0, cur_sP=0.0, cur_bP=0.0, cur_b=0.0, cur_db=0.0, cur_sb=0.0, cur_t=0.0 ; - double i_d=0.0, i_dP=0.0, i_g=0.0, i_gP=0.0, i_s=0.0, i_sP=0.0, i_bP=0.0, i_b=0.0, i_db=0.0, i_sb=0.0, i_t=0.0 ; - - /* resistances and conductances */ - double Rd=0.0, dRd_dVdse=0.0, dRd_dVgse=0.0, dRd_dVbse=0.0, dRd_dVsubs=0.0, dRd_dT=0.0, dRd_dVddp=0.0, dRd_dVds=0.0, dRd_dVgs=0.0, dRd_dVbs=0.0 ; - double Rs=0.0, dRs_dVdse=0.0, dRs_dVgse=0.0, dRs_dVbse=0.0, dRs_dVsubs=0.0, dRs_dT=0.0 ; - - double GD=0.0, GD_dVds=0.0, GD_dVgs=0.0, GD_dVbs=0.0, GD_dVsubs=0.0, GD_dT=0.0, GD_dVddp=0.0, GD_dVdse=0.0, GD_dVgse=0.0, GD_dVbse=0.0 ; - double GS=0.0, GS_dVds=0.0, GS_dVgs=0.0, GS_dVbs=0.0, GS_dVsubs=0.0, GS_dT=0.0 ; - double Gth=0.0 ; - double GG=0.0, GRBPD=0.0, GRBPS=0.0, GRBPB=0.0; - - /* charges */ - double Qd=0.0, dQd_dVds=0.0, dQd_dVgs=0.0, dQd_dVbs=0.0, dQd_dT=0.0 ; - double Qg=0.0, dQg_dVds=0.0, dQg_dVgs=0.0, dQg_dVbs=0.0, dQg_dT=0.0 ; - double Qs=0.0, dQs_dVds=0.0, dQs_dVgs=0.0, dQs_dVbs=0.0, dQs_dT=0.0 ; - double Qb=0.0, dQb_dVds=0.0, dQb_dVgs=0.0, dQb_dVbs=0.0, dQb_dT=0.0 ; - double Qbd=0.0, Cbd=0.0, Cbdt=0.0, - Qbs=0.0, Cbs=0.0, Cbst=0.0 ; - double Qth=0.0, Cth =0.0 ; - double Qfd=0.0, dQfd_dVdse=0.0, dQfd_dVgse=0.0, dQfd_dVbse=0.0, dQfd_dT=0.0 ; - double Qfs=0.0, dQfs_dVdse=0.0, dQfs_dVgse=0.0, dQfs_dVbse=0.0, dQfs_dT=0.0 ; - - double Qdext=0.0, dQdext_dVdse=0.0, dQdext_dVgse=0.0, dQdext_dVbse=0.0, dQdext_dT=0.0 ; - double Qgext=0.0, dQgext_dVdse=0.0, dQgext_dVgse=0.0, dQgext_dVbse=0.0, dQgext_dT=0.0 ; - double Qsext=0.0, dQsext_dVdse=0.0, dQsext_dVgse=0.0, dQsext_dVbse=0.0, dQsext_dT=0.0 ; - double Qbext=0.0, dQbext_dVdse=0.0, dQbext_dVgse=0.0, dQbext_dVbse=0.0, dQbext_dT=0.0 ; - - /* 5th substrate node */ - int flg_subNode = 0 ; - - /* self heating */ - double Veffpower=0.0, dVeffpower_dVds=0.0, dVeffpower_dVdse =0.0 ; - double P=0.0, dP_dVds=0.0, dP_dVgs=0.0, dP_dVbs=0.0, dP_dT =0.0, - dP_dVdse=0.0, dP_dVgse=0.0, dP_dVbse =0.0 ; - double T0 , T1 , T2 ; - -#define SHE_MAX_dlt 0.1 - -#define C_RTH_MIN 1.0e-4 - - double TMF1 , TMF2 ; -/*---------------------------------------------------* -* smoothUpper: ceiling. -* y = xmax - 0.5 ( arg + sqrt( arg^2 + 4 xmax delta ) ) -* arg = xmax - x - delta -*-----------------*/ - -#define Fn_SU( y , x , xmax , delta , dx ) { \ - TMF1 = ( xmax ) - ( x ) - ( delta ) ; \ - TMF2 = 4.0 * ( xmax ) * ( delta) ; \ - TMF2 = TMF2 > 0.0 ? TMF2 : -( TMF2 ) ; \ - TMF2 = sqrt ( TMF1 * TMF1 + TMF2 ) ; \ - dx = 0.5 * ( 1.0 + TMF1 / TMF2 ) ; \ - y = ( xmax ) - 0.5 * ( TMF1 + TMF2 ) ; \ - } - - /* NQS related variables */ - int flg_nqs =0 ; - double Qi_nqs=0.0, Qb_nqs=0.0, delQi_nqs=0.0, delQb_nqs=0.0, i_qi=0.0, i_qb=0.0, cq_qi=0.0, cq_qb=0.0, cur_qi=0.0, cur_qb =0.0 ; - double Iqi_nqs=0.0, dIqi_nqs_dVds=0.0, dIqi_nqs_dVgs=0.0, dIqi_nqs_dVbs=0.0, dIqi_nqs_dT=0.0, dIqi_nqs_dQi_nqs =0.0 ; - double Iqb_nqs=0.0, dIqb_nqs_dVds=0.0, dIqb_nqs_dVgs=0.0, dIqb_nqs_dVbs=0.0, dIqb_nqs_dT=0.0, dIqb_nqs_dQb_nqs =0.0 ; - double Qd_nqs=0.0, dQd_nqs_dVds=0.0, dQd_nqs_dVgs=0.0, dQd_nqs_dVbs=0.0, dQd_nqs_dT=0.0, dQd_nqs_dQi_nqs =0.0 ; - double Qs_nqs=0.0, dQs_nqs_dVds=0.0, dQs_nqs_dVgs=0.0, dQs_nqs_dVbs=0.0, dQs_nqs_dT=0.0, dQs_nqs_dQi_nqs =0.0 ; - double Qg_nqs=0.0, dQg_nqs_dQi_nqs=0.0, dQg_nqs_dQb_nqs =0.0 ; - double tau=0.0, dtau_dVds=0.0, dtau_dVgs=0.0, dtau_dVbs=0.0, dtau_dT =0.0 ; - double taub=0.0, dtaub_dVds=0.0, dtaub_dVgs=0.0, dtaub_dVbs=0.0, dtaub_dT =0.0 ; - double Qdrat=0.0, dQdrat_dVds=0.0, dQdrat_dVgs=0.0, dQdrat_dVbs=0.0, dQdrat_dT =0.0 ; - double Qi=0.0, dQi_dVds=0.0, dQi_dVgs=0.0, dQi_dVbs=0.0, dQi_dT =0.0 ; - double Qbulk=0.0, dQbulk_dVds=0.0, dQbulk_dVgs=0.0, dQbulk_dVbs=0.0, dQbulk_dT =0.0 ; - - /* output related variables */ - double dQi_nqs_dVds=0.0, dQi_nqs_dVgs=0.0, dQi_nqs_dVbs=0.0, - dQb_nqs_dVds=0.0, dQb_nqs_dVgs=0.0, dQb_nqs_dVbs=0.0 ; - double cgdb_nqs=0.0, cggb_nqs=0.0, cgsb_nqs=0.0, - cbdb_nqs=0.0, cbgb_nqs=0.0, cbsb_nqs=0.0, - cddb_nqs=0.0, cdgb_nqs=0.0, cdsb_nqs=0.0 ; - double cgdb=0.0, cggb=0.0, cgsb=0.0, - cbdb=0.0, cbgb=0.0, cbsb=0.0, - cddb=0.0, cdgb=0.0, cdsb=0.0 ; - - /* rows of conductance and capacitance matrix stamp */ - double ydc_d[XDIM], ydc_dP[XDIM], ydc_g[XDIM], ydc_gP[XDIM], ydc_s[XDIM], ydc_sP[XDIM] ; - double ydc_bP[XDIM], ydc_b[XDIM], ydc_db[XDIM], ydc_sb[XDIM], ydc_t[XDIM], ydc_qi[XDIM], ydc_qb[XDIM] ; - double ydyn_d[XDIM], ydyn_dP[XDIM], ydyn_g[XDIM], ydyn_gP[XDIM], ydyn_s[XDIM], ydyn_sP[XDIM] ; - double ydyn_bP[XDIM], ydyn_b[XDIM], ydyn_db[XDIM], ydyn_sb[XDIM], ydyn_t[XDIM], ydyn_qi[XDIM], ydyn_qb[XDIM] ; - - /* limiter, bypass, and convergence */ - int ByPass=0, Check=0, Check1=0, Check2=0, Check3=0 ; - double von=0.0, limval =0.0 ; - double i_dP_hat=0.0, i_gP_hat=0.0, i_sP_hat=0.0, i_db_hat=0.0, i_sb_hat =0.0 ; - -#define LIM_TOL 1.0e0 -#define LIM_TOL2 1.0e0 - - /* predictor and numerical integration stuff */ - double ag0=0.0, xfact=0.0 ; - double ceq=0.0, geq=0.0 ; - int ChargeComputationNeeded = - ((ckt->CKTmode & (MODEAC | MODETRAN | MODEINITSMSIG)) || - ((ckt->CKTmode & MODETRANOP) && (ckt->CKTmode & MODEUIC))) - ? 1 : 0; - int showPhysVal=0 ; - int isConv=0 ; - double vds_pre=0.0 ; - int i=0, noncon_old=0 ; - - - -#define dNode 0 -#define dNodePrime 1 -#define gNode 2 -#define gNodePrime 3 -#define sNode 4 -#define sNodePrime 5 -#define bNodePrime 6 -#define bNode 7 -#define dbNode 8 -#define sbNode 9 -#define subNode 10 -#define tempNode 11 -#define qiNode 12 -#define qbNode 13 -#define lastNode 13 /* must be the last node! */ - - -#define SPICE_rhs 1 /* set to 0 if rhs to be loaded for standard Newton */ - /* set to 1 if rhs_eq to be loaded, e.g. for SPICE */ - - if (SPICE_rhs) { - for (i=0; imodelMKS ; - - for (here = HSMHV2instances(model); here != NULL ; - here = HSMHV2nextInstance(here)) { - - hereMKS = &here->hereMKS ; - pParam = &here->pParam ; - showPhysVal = 0; - Check=1; - ByPass = 0; - vsubs = 0.0 ; /* substrate bias */ - deltemp = 0.0 ; - noncon_old = ckt->CKTnoncon; - flg_nqs = model->HSMHV2_conqs ; - flg_subNode = here->HSMHV2subNode ; /* if flg_subNode > 0, external(/internal) substrate node exists */ - -#ifdef DEBUG_HISIMHVLD_VX - printf("mode = %x\n", ckt->CKTmode); - printf("Vd Vg Vs Vb %e %e %e %e\n", *(ckt->CKTrhsOld+here->HSMHV2dNodePrime), - *(ckt->CKTrhsOld+here->HSMHV2gNodePrime), - *(ckt->CKTrhsOld+here->HSMHV2sNodePrime), - *(ckt->CKTrhsOld+here->HSMHV2bNodePrime)); -#endif - - if ( ckt->CKTmode & MODEINITSMSIG ) { - vbs = *(ckt->CKTstate0 + here->HSMHV2vbs); - vgs = *(ckt->CKTstate0 + here->HSMHV2vgs); - vds = *(ckt->CKTstate0 + here->HSMHV2vds); - - vges = *(ckt->CKTstate0 + here->HSMHV2vges); - vdbd = *(ckt->CKTstate0 + here->HSMHV2vdbd); - vsbs = *(ckt->CKTstate0 + here->HSMHV2vsbs); - if (flg_subNode > 0) vsubs = *(ckt->CKTstate0 + here->HSMHV2vsubs); - if( here->HSMHV2_coselfheat > 0 ){ - deltemp = *(ckt->CKTstate0 + here->HSMHV2deltemp); - } - vdse = *(ckt->CKTstate0 + here->HSMHV2vdse) ; - vgse = *(ckt->CKTstate0 + here->HSMHV2vgse) ; - vbse = *(ckt->CKTstate0 + here->HSMHV2vbse) ; - if ( flg_nqs ) { - Qi_nqs = *(ckt->CKTstate0 + here->HSMHV2qi_nqs) ; - Qb_nqs = *(ckt->CKTstate0 + here->HSMHV2qb_nqs) ; - } else { - Qi_nqs = 0.0 ; - Qb_nqs = 0.0 ; - } - /* printf("HSMHV2_load: (from state0) vds.. = %e %e %e %e %e %e\n", - vds,vgs,vbs,vdse,vgse,vbse); */ - } - else if ( ckt->CKTmode & MODEINITTRAN ) { -/* #include "printf_ld_converged.inc" */ - vbs = *(ckt->CKTstate1 + here->HSMHV2vbs); - vgs = *(ckt->CKTstate1 + here->HSMHV2vgs); - vds = *(ckt->CKTstate1 + here->HSMHV2vds); - - vges = *(ckt->CKTstate1 + here->HSMHV2vges); - vdbd = *(ckt->CKTstate1 + here->HSMHV2vdbd); - vsbs = *(ckt->CKTstate1 + here->HSMHV2vsbs); - if (flg_subNode > 0) vsubs = *(ckt->CKTstate1 + here->HSMHV2vsubs); - if( here->HSMHV2_coselfheat > 0 ){ - deltemp = *(ckt->CKTstate1 + here->HSMHV2deltemp); - } - vdse = *(ckt->CKTstate1 + here->HSMHV2vdse) ; - vgse = *(ckt->CKTstate1 + here->HSMHV2vgse) ; - vbse = *(ckt->CKTstate1 + here->HSMHV2vbse) ; - if ( flg_nqs ) { - Qi_nqs = *(ckt->CKTstate1 + here->HSMHV2qi_nqs) ; - Qb_nqs = *(ckt->CKTstate1 + here->HSMHV2qb_nqs) ; - } else { - Qi_nqs = 0.0 ; - Qb_nqs = 0.0 ; - } - } - else if ( (ckt->CKTmode & MODEINITJCT) && !here->HSMHV2_off ) { - vds = model->HSMHV2_type * here->HSMHV2_icVDS; - vgs = vges = model->HSMHV2_type * here->HSMHV2_icVGS; - vbs = vsbs = model->HSMHV2_type * here->HSMHV2_icVBS; - vdbd = 0.0 ; - if ( (vds == 0.0) && (vgs == 0.0) && (vbs == 0.0) && - ( (ckt->CKTmode & (MODETRAN|MODEAC|MODEDCOP|MODEDCTRANCURVE)) || - !(ckt->CKTmode & MODEUIC) ) ) { - /* set biases for starting analysis */ - vbs = vdbd = vsbs = 0.0; - vgs = vges = 0.1; - vds = 0.1; - } - if (flg_subNode > 0) vsubs = 0.0; - if( here->HSMHV2_coselfheat > 0 ) deltemp=0.0; - vdse = vds ; - vgse = vgs ; - Qi_nqs = Qb_nqs = 0.0 ; - } - else if ( ( ckt->CKTmode & (MODEINITJCT | MODEINITFIX) ) && - here->HSMHV2_off ) { - vbs = vgs = vds = 0.0; vges = 0.0; vdbd = vsbs = 0.0; - if (flg_subNode > 0) vsubs = 0.0; - if( here->HSMHV2_coselfheat > 0 ) deltemp=0.0; - vdse = vds ; - vgse = vgs ; - Qi_nqs = Qb_nqs = 0.0 ; - } - else { -#ifndef PREDICTOR /* BSIM3 style */ - if (ckt->CKTmode & MODEINITPRED) { -/* #include "printf_ld_converged.inc" */ - /* if (here->HSMHV2_mode > 0) { - gds_ext = here->HSMHV2_dIds_dVdse ; - } else { - gds_ext = + (here->HSMHV2_dIds_dVdse + here->HSMHV2_dIds_dVgse + here->HSMHV2_dIds_dVbse) ; - } - printf("zzz %e %e\n",ckt->CKTtime,gds_ext) ; */ - xfact = ckt->CKTdelta / ckt->CKTdeltaOld[1]; - *(ckt->CKTstate0 + here->HSMHV2vbs) = - *(ckt->CKTstate1 + here->HSMHV2vbs); - vbs = (1.0 + xfact)* (*(ckt->CKTstate1 + here->HSMHV2vbs)) - -(xfact * (*(ckt->CKTstate2 + here->HSMHV2vbs))); - *(ckt->CKTstate0 + here->HSMHV2vgs) = - *(ckt->CKTstate1 + here->HSMHV2vgs); - vgs = (1.0 + xfact)* (*(ckt->CKTstate1 + here->HSMHV2vgs)) - -(xfact * (*(ckt->CKTstate2 + here->HSMHV2vgs))); - *(ckt->CKTstate0 + here->HSMHV2vds) = - *(ckt->CKTstate1 + here->HSMHV2vds); - vds = (1.0 + xfact)* (*(ckt->CKTstate1 + here->HSMHV2vds)) - -(xfact * (*(ckt->CKTstate2 + here->HSMHV2vds))); - *(ckt->CKTstate0 + here->HSMHV2vbd) = - *(ckt->CKTstate0 + here->HSMHV2vbs)- - *(ckt->CKTstate0 + here->HSMHV2vds); - - *(ckt->CKTstate0 + here->HSMHV2vges) = - *(ckt->CKTstate1 + here->HSMHV2vges); - vges = (1.0 + xfact)* (*(ckt->CKTstate1 + here->HSMHV2vges)) - -(xfact * (*(ckt->CKTstate2 + here->HSMHV2vges))); - *(ckt->CKTstate0 + here->HSMHV2vdbd) = - *(ckt->CKTstate1 + here->HSMHV2vdbd); - vdbd = (1.0 + xfact)* (*(ckt->CKTstate1 + here->HSMHV2vdbd)) - - (xfact * (*(ckt->CKTstate2 + here->HSMHV2vdbd))); - *(ckt->CKTstate0 + here->HSMHV2vdbs) = - *(ckt->CKTstate0 + here->HSMHV2vdbd) - + *(ckt->CKTstate0 + here->HSMHV2vds); - *(ckt->CKTstate0 + here->HSMHV2vsbs) = - *(ckt->CKTstate1 + here->HSMHV2vsbs); - vsbs = (1.0 + xfact)* (*(ckt->CKTstate1 + here->HSMHV2vsbs)) - - (xfact * (*(ckt->CKTstate2 + here->HSMHV2vsbs))); - if (flg_subNode > 0){ - vsubs = (1.0 + xfact)* (*(ckt->CKTstate1 + here->HSMHV2vsubs)) - - ( xfact * (*(ckt->CKTstate2 + here->HSMHV2vsubs))); - } - if( here->HSMHV2_coselfheat > 0 ){ - deltemp = (1.0 + xfact)* (*(ckt->CKTstate1 + here->HSMHV2deltemp)) - - ( xfact * (*(ckt->CKTstate2 + here->HSMHV2deltemp))); - - *(ckt->CKTstate0 + here->HSMHV2deltemp) = - *(ckt->CKTstate1 + here->HSMHV2deltemp); - } - *(ckt->CKTstate0 + here->HSMHV2vdse) = - *(ckt->CKTstate1 + here->HSMHV2vdse); - vdse = (1.0 + xfact)* (*(ckt->CKTstate1 + here->HSMHV2vdse)) - -(xfact * (*(ckt->CKTstate2 + here->HSMHV2vdse))); - *(ckt->CKTstate0 + here->HSMHV2vgse) = - *(ckt->CKTstate1 + here->HSMHV2vgse); - vgse = (1.0 + xfact)* (*(ckt->CKTstate1 + here->HSMHV2vgse)) - -(xfact * (*(ckt->CKTstate2 + here->HSMHV2vgse))); - *(ckt->CKTstate0 + here->HSMHV2vbse) = - *(ckt->CKTstate1 + here->HSMHV2vbse); - vbse = (1.0 + xfact)* (*(ckt->CKTstate1 + here->HSMHV2vbse)) - -(xfact * (*(ckt->CKTstate2 + here->HSMHV2vbse))); - if (flg_nqs) { - *(ckt->CKTstate0 + here->HSMHV2qi_nqs) = - *(ckt->CKTstate1 + here->HSMHV2qi_nqs); - Qi_nqs = (1.0 + xfact)* (*(ckt->CKTstate1 + here->HSMHV2qi_nqs)) - -(xfact * (*(ckt->CKTstate2 + here->HSMHV2qi_nqs))); - *(ckt->CKTstate0 + here->HSMHV2qb_nqs) = - *(ckt->CKTstate1 + here->HSMHV2qb_nqs); - Qb_nqs = (1.0 + xfact)* (*(ckt->CKTstate1 + here->HSMHV2qb_nqs)) - -(xfact * (*(ckt->CKTstate2 + here->HSMHV2qb_nqs))); - } else { - Qi_nqs = Qb_nqs = 0.0 ; - } - } - else { -#endif /* PREDICTOR */ -/* here->HSMHV2_time = ckt->CKTtime; /\* for debug print *\/ */ - /* get biases from CKT */ - vbs = model->HSMHV2_type * - (*(ckt->CKTrhsOld+here->HSMHV2bNodePrime) - - *(ckt->CKTrhsOld+here->HSMHV2sNodePrime)); - vgs = model->HSMHV2_type * - (*(ckt->CKTrhsOld+here->HSMHV2gNodePrime) - - *(ckt->CKTrhsOld+here->HSMHV2sNodePrime)); - vds = model->HSMHV2_type * - (*(ckt->CKTrhsOld+here->HSMHV2dNodePrime) - - *(ckt->CKTrhsOld+here->HSMHV2sNodePrime)); - - vges = model->HSMHV2_type * - (*(ckt->CKTrhsOld+here->HSMHV2gNode) - - *(ckt->CKTrhsOld+here->HSMHV2sNodePrime)); - vdbd = model->HSMHV2_type - * (*(ckt->CKTrhsOld + here->HSMHV2dbNode) - - *(ckt->CKTrhsOld + here->HSMHV2dNode)); - vsbs = model->HSMHV2_type - * (*(ckt->CKTrhsOld + here->HSMHV2sbNode) - - *(ckt->CKTrhsOld + here->HSMHV2sNode)); - if (flg_subNode > 0){ - vsubs = model->HSMHV2_type - * (*(ckt->CKTrhsOld + here->HSMHV2subNode) - - *(ckt->CKTrhsOld + here->HSMHV2sNode)); - } - if( here->HSMHV2_coselfheat > 0 ){ - deltemp = *(ckt->CKTrhsOld + here->HSMHV2tempNode); - } - vbse = model->HSMHV2_type * - (*(ckt->CKTrhsOld+here->HSMHV2bNodePrime) - - *(ckt->CKTrhsOld+here->HSMHV2sNode)); - vgse = model->HSMHV2_type * - (*(ckt->CKTrhsOld+here->HSMHV2gNodePrime) - - *(ckt->CKTrhsOld+here->HSMHV2sNode)); - vdse = model->HSMHV2_type * - (*(ckt->CKTrhsOld+here->HSMHV2dNode) - - *(ckt->CKTrhsOld+here->HSMHV2sNode)); - if ( flg_nqs ) { - Qi_nqs = *(ckt->CKTrhsOld + here->HSMHV2qiNode); - Qb_nqs = *(ckt->CKTrhsOld + here->HSMHV2qbNode); - } else { - Qi_nqs = Qb_nqs = 0.0 ; - } -#ifndef PREDICTOR - } -#endif /* PREDICTOR */ - - /* printf("HSMHV2_load: (from rhs ) vds.. = %e %e %e %e %e %e\n", - vds,vgs,vbs,vdse,vgse,vbse); */ - - vbd = vbs - vds; - vgd = vgs - vds; - vged = vges - vds; - vdbs = vdbd + vdse; - vgdo = *(ckt->CKTstate0 + here->HSMHV2vgs) - *(ckt->CKTstate0 + here->HSMHV2vds); - vgedo = *(ckt->CKTstate0 + here->HSMHV2vges) - *(ckt->CKTstate0 + here->HSMHV2vds); - - vds_pre = vds; - -#ifndef NOBYPASS - /* start of bypass section - ... no bypass in case of selfheating */ - if ( !(ckt->CKTmode & MODEINITPRED) && ckt->CKTbypass && !here->HSMHV2_coselfheat) { - delvds = vds - *(ckt->CKTstate0 + here->HSMHV2vds) ; - delvgs = vgs - *(ckt->CKTstate0 + here->HSMHV2vgs) ; - delvbs = vbs - *(ckt->CKTstate0 + here->HSMHV2vbs) ; - delvdse = vdse - *(ckt->CKTstate0 + here->HSMHV2vdse) ; - delvgse = vgse - *(ckt->CKTstate0 + here->HSMHV2vgse) ; - delvbse = vbse - *(ckt->CKTstate0 + here->HSMHV2vbse) ; - delvdbd = vdbd - *(ckt->CKTstate0 + here->HSMHV2vdbd) ; - delvsbs = vsbs - *(ckt->CKTstate0 + here->HSMHV2vsbs) ; - if (flg_subNode > 0) delvsubs = vsubs - *(ckt->CKTstate0 + here->HSMHV2vsubs) ; /* substrate bias change */ - deldeltemp = deltemp - *(ckt->CKTstate0 + here->HSMHV2deltemp) ; - if (flg_nqs) { - delQi_nqs = Qi_nqs - *(ckt->CKTstate0 + here->HSMHV2qi_nqs) ; - delQb_nqs = Qb_nqs - *(ckt->CKTstate0 + here->HSMHV2qb_nqs) ; - } else { - delQi_nqs = delQb_nqs = 0.0 ; - } - - /* now let's see if we can bypass */ - /* ... first perform the easy cheap bypass checks ... */ - /* 1 2 3 3 3 4 4 4 5 543 2 1 */ - if ( ( fabs(delvds ) < ckt->CKTreltol * MAX(fabs(vds ),fabs(*(ckt->CKTstate0 + here->HSMHV2vds ))) + ckt->CKTvoltTol ) && - ( fabs(delvgs ) < ckt->CKTreltol * MAX(fabs(vgs ),fabs(*(ckt->CKTstate0 + here->HSMHV2vgs ))) + ckt->CKTvoltTol ) && - ( fabs(delvbs ) < ckt->CKTreltol * MAX(fabs(vbs ),fabs(*(ckt->CKTstate0 + here->HSMHV2vbs ))) + ckt->CKTvoltTol ) && - ( fabs(delvdse) < ckt->CKTreltol * MAX(fabs(vdse),fabs(*(ckt->CKTstate0 + here->HSMHV2vdse))) + ckt->CKTvoltTol ) && - ( fabs(delvgse) < ckt->CKTreltol * MAX(fabs(vgse),fabs(*(ckt->CKTstate0 + here->HSMHV2vgse))) + ckt->CKTvoltTol ) && - ( fabs(delvbse) < ckt->CKTreltol * MAX(fabs(vbse),fabs(*(ckt->CKTstate0 + here->HSMHV2vbse))) + ckt->CKTvoltTol ) && - ( fabs(delvdbd) < ckt->CKTreltol * MAX(fabs(vdbd),fabs(*(ckt->CKTstate0 + here->HSMHV2vdbd))) + ckt->CKTvoltTol ) && - ( fabs(delvsbs) < ckt->CKTreltol * MAX(fabs(vsbs),fabs(*(ckt->CKTstate0 + here->HSMHV2vsbs))) + ckt->CKTvoltTol ) && - ( fabs(delvsubs) < ckt->CKTreltol * MAX(fabs(vsubs),fabs(*(ckt->CKTstate0 + here->HSMHV2vsubs))) + ckt->CKTvoltTol ) && - ( fabs(delQi_nqs) < ckt->CKTreltol * fabs(Qi_nqs) + ckt->CKTchgtol*ckt->CKTabstol + 1.0e-20 ) && - ( fabs(delQb_nqs) < ckt->CKTreltol * fabs(Qb_nqs) + ckt->CKTchgtol*ckt->CKTabstol + 1.0e-20 ) ) - /* 1.0e-20: heuristic value, must be small enough */ - /* to ensure that bypass does not destroy convergence */ - { /* ... the first bypass checks are passed -> now do the more expensive checks ...*/ - if ( here->HSMHV2_mode > 0 ) { /* forward mode */ - Ids = here->HSMHV2_ids ; - gds = here->HSMHV2_dIds_dVdsi ; - gm = here->HSMHV2_dIds_dVgsi ; - gmbs = here->HSMHV2_dIds_dVbsi ; - gmT = 0.0 ; - gmbs_ext = here->HSMHV2_dIds_dVbse; - gds_ext = here->HSMHV2_dIds_dVdse ; - gm_ext = here->HSMHV2_dIds_dVgse; - Isub = here->HSMHV2_isub ; - dIsub_dVds = here->HSMHV2_dIsub_dVdsi ; - dIsub_dVgs = here->HSMHV2_dIsub_dVgsi ; - dIsub_dVbs = here->HSMHV2_dIsub_dVbsi ; - dIsub_dT = 0.0 ; - Isubs = 0.0 ; - dIsubs_dVds = 0.0 ; - dIsubs_dVgs = 0.0 ; - dIsubs_dVbs = 0.0 ; - dIsubs_dT = 0.0 ; - IsubLD = here->HSMHV2_isubld ; - dIsubLD_dVds = here->HSMHV2_dIsubLD_dVdsi ; - dIsubLD_dVgs = here->HSMHV2_dIsubLD_dVgsi ; - dIsubLD_dVbs = here->HSMHV2_dIsubLD_dVbsi ; - dIsubLD_dT = 0.0 ; - dIsubLD_dVddp = here->HSMHV2_dIsubLD_dVddp ; - IsubLDs = 0.0 ; - dIsubLDs_dVds = 0.0 ; - dIsubLDs_dVgs = 0.0 ; - dIsubLDs_dVbs = 0.0 ; - dIsubLDs_dT = 0.0 ; - dIsubLDs_dVddp = 0.0 ; - IdsIBPC = here->HSMHV2_idsibpc ; - dIdsIBPC_dVds = here->HSMHV2_dIdsIBPC_dVdsi ; - dIdsIBPC_dVgs = here->HSMHV2_dIdsIBPC_dVgsi ; - dIdsIBPC_dVbs = here->HSMHV2_dIdsIBPC_dVbsi ; - dIdsIBPC_dT = 0.0 ; - dIdsIBPC_dVddp = here->HSMHV2_dIdsIBPC_dVddp ; - IdsIBPCs = 0.0 ; - dIdsIBPCs_dVds = 0.0 ; - dIdsIBPCs_dVgs = 0.0 ; - dIdsIBPCs_dVbs = 0.0 ; - dIdsIBPCs_dT = 0.0 ; - dIdsIBPCs_dVddp = 0.0 ; - Igidl = here->HSMHV2_igidl ; - dIgidl_dVds = here->HSMHV2_dIgidl_dVdsi ; - dIgidl_dVgs = here->HSMHV2_dIgidl_dVgsi ; - dIgidl_dVbs = here->HSMHV2_dIgidl_dVbsi ; - dIgidl_dT = 0.0 ; - Igisl = here->HSMHV2_igisl ; - dIgisl_dVds = here->HSMHV2_dIgisl_dVdsi ; - dIgisl_dVgs = here->HSMHV2_dIgisl_dVgsi ; - dIgisl_dVbs = here->HSMHV2_dIgisl_dVbsi ; - dIgisl_dT = 0.0 ; - Igd = here->HSMHV2_igd ; - dIgd_dVd = here->HSMHV2_dIgd_dVdsi ; - dIgd_dVg = here->HSMHV2_dIgd_dVgsi ; - dIgd_dVb = here->HSMHV2_dIgd_dVbsi ; - dIgd_dT = 0.0 ; - Igs = here->HSMHV2_igs ; - dIgs_dVd = here->HSMHV2_dIgs_dVdsi ; - dIgs_dVg = here->HSMHV2_dIgs_dVgsi ; - dIgs_dVb = here->HSMHV2_dIgs_dVbsi ; - dIgs_dT = 0.0 ; - Igb = here->HSMHV2_igb ; - dIgb_dVd = here->HSMHV2_dIgb_dVdsi ; - dIgb_dVg = here->HSMHV2_dIgb_dVgsi ; - dIgb_dVb = here->HSMHV2_dIgb_dVbsi ; - dIgb_dT = 0.0 ; - Ibd = here->HSMHV2_ibd ; - Gbd = here->HSMHV2_gbd ; - Gbdt = 0.0 ; - Ibs = here->HSMHV2_ibs ; - Gbs = here->HSMHV2_gbs ; - Gbst = 0.0 ; - } else { /* reverse mode */ - Ids = - here->HSMHV2_ids ; - gds = + (here->HSMHV2_dIds_dVdsi + here->HSMHV2_dIds_dVgsi + here->HSMHV2_dIds_dVbsi) ; - gm = - here->HSMHV2_dIds_dVgsi ; - gmbs = - here->HSMHV2_dIds_dVbsi ; - gmT = 0.0 ; - gds_ext = + (here->HSMHV2_dIds_dVdse + here->HSMHV2_dIds_dVgse + here->HSMHV2_dIds_dVbse) ; - gm_ext = - here->HSMHV2_dIds_dVgse; - gmbs_ext = - here->HSMHV2_dIds_dVbse; - Isub = 0.0 ; - dIsub_dVds = 0.0 ; - dIsub_dVgs = 0.0 ; - dIsub_dVbs = 0.0 ; - dIsub_dT = 0.0 ; - Isubs = here->HSMHV2_isub ; - dIsubs_dVds = - (here->HSMHV2_dIsub_dVdsi + here->HSMHV2_dIsub_dVgsi + here->HSMHV2_dIsub_dVbsi) ; - dIsubs_dVgs = here->HSMHV2_dIsub_dVgsi ; - dIsubs_dVbs = here->HSMHV2_dIsub_dVbsi ; - dIsubs_dT = 0.0 ; - IsubLD = 0.0 ; - dIsubLD_dVds = 0.0 ; - dIsubLD_dVgs = 0.0 ; - dIsubLD_dVbs = 0.0 ; - dIsubLD_dT = 0.0 ; - dIsubLD_dVddp = 0.0 ; - IsubLDs = here->HSMHV2_isubld ; - dIsubLDs_dVds = - (here->HSMHV2_dIsubLD_dVdsi + here->HSMHV2_dIsubLD_dVgsi + here->HSMHV2_dIsubLD_dVbsi) ; - dIsubLDs_dVgs = here->HSMHV2_dIsubLD_dVgsi ; - dIsubLDs_dVbs = here->HSMHV2_dIsubLD_dVbsi ; - dIsubLDs_dT = 0.0 ; - dIsubLDs_dVddp = - here->HSMHV2_dIsubLD_dVddp ; - IdsIBPC = 0.0 ; - dIdsIBPC_dVds = 0.0 ; - dIdsIBPC_dVgs = 0.0 ; - dIdsIBPC_dVbs = 0.0 ; - dIdsIBPC_dT = 0.0 ; - dIdsIBPC_dVddp = 0.0 ; - IdsIBPCs = here->HSMHV2_idsibpc ; - dIdsIBPCs_dVds = - (here->HSMHV2_dIdsIBPC_dVdsi + here->HSMHV2_dIdsIBPC_dVgsi + here->HSMHV2_dIdsIBPC_dVbsi) ; - dIdsIBPCs_dVgs = here->HSMHV2_dIdsIBPC_dVgsi ; - dIdsIBPCs_dVbs = here->HSMHV2_dIdsIBPC_dVbsi ; - dIdsIBPCs_dT = 0.0 ; - dIdsIBPCs_dVddp = - here->HSMHV2_dIdsIBPC_dVddp ; - Igidl = here->HSMHV2_igisl ; - dIgidl_dVds = - (here->HSMHV2_dIgisl_dVdsi + here->HSMHV2_dIgisl_dVgsi + here->HSMHV2_dIgisl_dVbsi) ; - dIgidl_dVgs = here->HSMHV2_dIgisl_dVgsi ; - dIgidl_dVbs = here->HSMHV2_dIgisl_dVbsi ; - dIgidl_dT = 0.0 ; - Igisl = here->HSMHV2_igidl ; - dIgisl_dVds = - (here->HSMHV2_dIgidl_dVdsi + here->HSMHV2_dIgidl_dVgsi + here->HSMHV2_dIgidl_dVbsi) ; - dIgisl_dVgs = here->HSMHV2_dIgidl_dVgsi ; - dIgisl_dVbs = here->HSMHV2_dIgidl_dVbsi ; - dIgisl_dT = 0.0 ; - Igd = here->HSMHV2_igd ; - dIgd_dVd = - (here->HSMHV2_dIgs_dVdsi + here->HSMHV2_dIgs_dVgsi + here->HSMHV2_dIgs_dVbsi) ; - dIgd_dVg = here->HSMHV2_dIgs_dVgsi ; - dIgd_dVb = here->HSMHV2_dIgs_dVbsi ; - dIgd_dT = 0.0 ; - Igs = here->HSMHV2_igs ; - dIgs_dVd = - (here->HSMHV2_dIgd_dVdsi + here->HSMHV2_dIgd_dVgsi + here->HSMHV2_dIgd_dVbsi) ; - dIgs_dVg = here->HSMHV2_dIgd_dVgsi ; - dIgs_dVb = here->HSMHV2_dIgd_dVbsi ; - dIgs_dT = 0.0 ; - Igb = here->HSMHV2_igb ; - dIgb_dVd = - (here->HSMHV2_dIgb_dVdsi + here->HSMHV2_dIgb_dVgsi + here->HSMHV2_dIgb_dVbsi) ; - dIgb_dVg = here->HSMHV2_dIgb_dVgsi ; - dIgb_dVb = here->HSMHV2_dIgb_dVbsi ; - dIgb_dT = 0.0 ; - Ibd = here->HSMHV2_ibd ; - Gbd = here->HSMHV2_gbd ; - Gbdt = 0.0 ; - Ibs = here->HSMHV2_ibs ; - Gbs = here->HSMHV2_gbs ; - Gbst = 0.0 ; - } /* end of reverse mode */ - - /* for bypass control, only nonlinear static currents are considered: */ - i_dP = Ids + Isub + Igidl - Igd ; - i_dP_hat = i_dP + gm *delvgs + gds *delvds + gmbs *delvbs + gmT *deldeltemp - + dIsub_dVgs *delvgs + dIsub_dVds *delvds + dIsub_dVbs *delvbs + dIsub_dT *deldeltemp - + dIgidl_dVgs*delvgs + dIgidl_dVds*delvds + dIgidl_dVbs*delvbs + dIgidl_dT*deldeltemp - -(dIgd_dVg *delvgs + dIgd_dVd *delvds + dIgd_dVb *delvbs + dIgd_dT *deldeltemp) - + gm_ext *delvgse + gds_ext *delvdse + gmbs_ext *delvbse ; - - i_gP = Igd + Igs + Igb ; - i_gP_hat = i_gP + dIgd_dVg *delvgs + dIgd_dVd *delvds + dIgd_dVb *delvbs + dIgd_dT *deldeltemp - + dIgs_dVg *delvgs + dIgs_dVd *delvds + dIgs_dVb *delvbs + dIgs_dT *deldeltemp - + dIgb_dVg *delvgs + dIgb_dVd *delvds + dIgb_dVb *delvbs + dIgb_dT *deldeltemp ; - - i_sP =-Ids + Isubs + Igisl - Igs ; - i_sP_hat = i_sP -(gm *delvgs + gds *delvds + gmbs *delvbs + gmT *deldeltemp) - + dIsubs_dVgs*delvgs + dIsubs_dVds*delvds + dIsubs_dVbs*delvbs + dIsubs_dT*deldeltemp - + dIgisl_dVgs*delvgs + dIgisl_dVds*delvds + dIgisl_dVbs*delvbs + dIgisl_dT*deldeltemp - -(dIgs_dVg *delvgs + dIgs_dVd *delvds + dIgs_dVb *delvbs + dIgs_dT *deldeltemp) - -(gm_ext *delvgse + gds_ext *delvdse + gmbs_ext *delvbse) ; - - i_db = Ibd ; - i_db_hat = i_db + Gbd*delvdbd + Gbdt*deldeltemp ; - - i_sb = Ibs ; - i_sb_hat = i_sb + Gbs*delvsbs + Gbst*deldeltemp ; - - /* ... second part of bypass checks: */ - /* 1 2 3 3 3 4 4 4 43 2 1 */ - if ( ( fabs(i_dP_hat - i_dP) < ckt->CKTreltol * MAX(fabs(i_dP_hat),fabs(i_dP)) + ckt->CKTabstol ) && - ( fabs(i_gP_hat - i_gP) < ckt->CKTreltol * MAX(fabs(i_gP_hat),fabs(i_gP)) + ckt->CKTabstol ) && - ( fabs(i_sP_hat - i_sP) < ckt->CKTreltol * MAX(fabs(i_sP_hat),fabs(i_sP)) + ckt->CKTabstol ) && - ( fabs(i_db_hat - i_db) < ckt->CKTreltol * MAX(fabs(i_db_hat),fabs(i_db)) + ckt->CKTabstol ) && - ( fabs(i_sb_hat - i_sb) < ckt->CKTreltol * MAX(fabs(i_sb_hat),fabs(i_sb)) + ckt->CKTabstol ) ) - { - /* bypass code */ - vds = *(ckt->CKTstate0 + here->HSMHV2vds ); - vgs = *(ckt->CKTstate0 + here->HSMHV2vgs ); - vbs = *(ckt->CKTstate0 + here->HSMHV2vbs ); - vdse = *(ckt->CKTstate0 + here->HSMHV2vdse); - vgse = *(ckt->CKTstate0 + here->HSMHV2vgse); - vbse = *(ckt->CKTstate0 + here->HSMHV2vbse); - vdbd = *(ckt->CKTstate0 + here->HSMHV2vdbd); - vsbs = *(ckt->CKTstate0 + here->HSMHV2vsbs); - vsubs = *(ckt->CKTstate0 + here->HSMHV2vsubs); - deltemp = *(ckt->CKTstate0 + here->HSMHV2deltemp); - if ( flg_nqs ) { - Qi_nqs = *(ckt->CKTstate0 + here->HSMHV2qi_nqs); - Qb_nqs = *(ckt->CKTstate0 + here->HSMHV2qb_nqs); - } - - vges = *(ckt->CKTstate0 + here->HSMHV2vges); - - vbd = vbs - vds; - vgd = vgs - vds; - vgb = vgs - vbs; - vged = vges - vds; - - vbs_jct = vsbs; - vbd_jct = vdbd; - - /* linear branch currents */ - vddp = model->HSMHV2_type * (*(ckt->CKTrhsOld+here->HSMHV2dNode) - *(ckt->CKTrhsOld+here->HSMHV2dNodePrime)); - vggp = model->HSMHV2_type * (*(ckt->CKTrhsOld+here->HSMHV2gNode) - *(ckt->CKTrhsOld+here->HSMHV2gNodePrime)); - vssp = model->HSMHV2_type * (*(ckt->CKTrhsOld+here->HSMHV2sNode) - *(ckt->CKTrhsOld+here->HSMHV2sNodePrime)); - vbpb = model->HSMHV2_type * (*(ckt->CKTrhsOld+here->HSMHV2bNodePrime) - *(ckt->CKTrhsOld+here->HSMHV2bNode)); - vbpdb = model->HSMHV2_type * (*(ckt->CKTrhsOld+here->HSMHV2bNodePrime) - *(ckt->CKTrhsOld+here->HSMHV2dbNode)); - vbpsb = model->HSMHV2_type * (*(ckt->CKTrhsOld+here->HSMHV2bNodePrime) - *(ckt->CKTrhsOld+here->HSMHV2sbNode)); - - ByPass = 1; - goto line755; - } - } - } /* end of Bypass section */ -#endif /*NOBYPASS*/ - -#ifdef DEBUG_HISIMHVLD_VX - printf( "vbd_p = %12.5e\n" , vbd ); - printf( "vbs_p = %12.5e\n" , vbs ); - printf( "vgs_p = %12.5e\n" , vgs ); - printf( "vds_p = %12.5e\n" , vds ); -#endif - - /* start limiting of nonlinear branch voltages */ - - von = here->HSMHV2_von; - Check3 = 0 ; - if(*(ckt->CKTstate0 + here->HSMHV2vds) >= 0.0) { /* case vds>=0 for limiting */ - limval = DEVfetlim(vgs, *(ckt->CKTstate0 + here->HSMHV2vgs), von); - if (vgs != limval) { - vgs = limval ; - Check3 = 1 ; - } - if (Check3) vds = vgs - vgd; - limval = DEVlimvds(vds, *(ckt->CKTstate0 + here->HSMHV2vds)); - if (vds != limval) { - vds = limval ; - Check3 = 2 ; - } - vgd = vgs - vds; - - if (here->HSMHV2_corg == 1) { - limval = DEVfetlim(vges, *(ckt->CKTstate0 + here->HSMHV2vges), von); - if (vges != limval) { - vges = limval ; - Check3 = 3 ; - } - vged = vges - vds; - } - - } else { /* case vds < 0 for limiting */ - limval = DEVfetlim(vgd, vgdo, von); - if (vgd != limval) { - vgd = limval ; - Check3 = 4 ; - } - if (Check3) vds = vgs - vgd; - limval = -DEVlimvds(-vds, -(*(ckt->CKTstate0 + here->HSMHV2vds))); - if (vds != limval) { - vds = limval ; - Check3 = 5 ; - } - vgs = vgd + vds; - - if (here->HSMHV2_corg == 1) { - limval = DEVfetlim(vged, vgedo, von); - if (vged != limval) { - vged = limval ; - Check3 = 6 ; - } - vges = vged + vds; - } - } /* end of case vds< 0 for limiting */ - - if (vds >= 0.0) { /* case vds >=0 for limiting of junctions */ - vbs = DEVpnjlim(vbs, *(ckt->CKTstate0 + here->HSMHV2vbs), - CONSTvt0, model->HSMHV2_vcrit, &Check1); - if (Check1) Check3 = 7 ; - vbd = vbs - vds; - if (here->HSMHV2_corbnet) { - vsbs = DEVpnjlim(vsbs, *(ckt->CKTstate0 + here->HSMHV2vsbs), - CONSTvt0, model->HSMHV2_vcrit, &Check2); - if (Check2) Check3 = 8 ; - } - } - else { /* case vds < 0 for limiting of junctions */ - vbd = DEVpnjlim(vbd, *(ckt->CKTstate0 + here->HSMHV2vbd), - CONSTvt0, model->HSMHV2_vcrit, &Check1); - if (Check1) Check3 = 9 ; - vbs = vbd + vds; - if (here->HSMHV2_corbnet) { - vdbd = DEVpnjlim(vdbd, *(ckt->CKTstate0 + here->HSMHV2vdbd), - CONSTvt0, model->HSMHV2_vcrit, &Check2); - if (Check2) { - Check3 = 10 ; - vdbs = vdbd + vdse; - } - } - } - - if( here->HSMHV2_coselfheat > 0 ){ - /* Logarithmic damping of deltemp beyond LIM_TOL */ - deltemp_old = *(ckt->CKTstate0 + here->HSMHV2deltemp); - if (deltemp > deltemp_old + LIM_TOL) - {deltemp = deltemp_old + LIM_TOL + log10((deltemp-deltemp_old)/LIM_TOL); - Check3 = 11;} - else if (deltemp < deltemp_old - LIM_TOL) - {deltemp = deltemp_old - LIM_TOL - log10((deltemp_old-deltemp)/LIM_TOL); - Check3 = 12;} - } - - /* if (Check3) printf("HSMHV2_load: Check3=%d\n",Check3) ; */ - - /* limiting completed */ - if (Check3 == 0 ) Check = 0 ; - } /* loading and limiting of nonlinear branch voltages is completed */ - - - vbd = vbs - vds; - vgd = vgs - vds; - vgb = vgs - vbs; - vged = vges - vds; - - vbs_jct = vsbs; - vbd_jct = vdbd; - - /* linear branch voltages */ - if ( (ckt->CKTmode & MODEINITJCT) && !here->HSMHV2_off ) { - vddp = vggp = vssp = vbpdb = vbpb = vbpsb = 0.0; - } else { - vddp = model->HSMHV2_type * - (*(ckt->CKTrhsOld+here->HSMHV2dNode) - - *(ckt->CKTrhsOld+here->HSMHV2dNodePrime)); - - vggp = model->HSMHV2_type * - (*(ckt->CKTrhsOld+here->HSMHV2gNode) - - *(ckt->CKTrhsOld+here->HSMHV2gNodePrime)); - - vssp = model->HSMHV2_type * - (*(ckt->CKTrhsOld+here->HSMHV2sNode) - - *(ckt->CKTrhsOld+here->HSMHV2sNodePrime)); - - vbpdb = model->HSMHV2_type * - (*(ckt->CKTrhsOld+here->HSMHV2bNodePrime) - - *(ckt->CKTrhsOld+here->HSMHV2dbNode)); - - vbpb = model->HSMHV2_type * - (*(ckt->CKTrhsOld+here->HSMHV2bNodePrime) - - *(ckt->CKTrhsOld+here->HSMHV2bNode)); - - vbpsb = model->HSMHV2_type * - (*(ckt->CKTrhsOld+here->HSMHV2bNodePrime) - - *(ckt->CKTrhsOld+here->HSMHV2sbNode)); - } - -#ifdef DEBUG_HISIMHVLD_VX - printf( "vbd = %12.5e\n" , vbd ); - printf( "vbs = %12.5e\n" , vbs ); - printf( "vgs = %12.5e\n" , vgs ); - printf( "vds = %12.5e\n" , vds ); -#endif - - /* After loading (and limiting of branch voltages: Start model evaluation */ - - /* printf("HSMHV2_load: vds=%e vgs=%e vbs=%e vsd=%e vgd=%e vbd=%e\n", - vds,vgs,vbs,-vds,vgs-vds,vbs-vds); */ - - if (vds >= 0) { /* normal mode */ - here->HSMHV2_mode = 1; - ivds = vds; - ivgs = vgs; - ivbs = vbs; - ivdse = vdse; - ivgse = vgse; - ivbse = vbse; - } else { /* reverse mode */ - here->HSMHV2_mode = -1; - ivds = -vds; - ivgs = vgd; - ivbs = vbd; - ivdse = -vdse; - ivgse = vgse - vdse; - ivbse = vbse - vdse; - } - - if ( model->HSMHV2_info >= 5 ) { /* mode, bias conditions ... */ - printf( "--- variables given to HSMHV2evaluate() ----\n" ); - printf( "type = %s\n" , (model->HSMHV2_type>0) ? "NMOS" : "PMOS" ); - printf( "mode = %s\n" , (here->HSMHV2_mode>0) ? "NORMAL" : "REVERSE" ); - - printf( "vbse vbs = %12.5e %12.5e\n" , vbse, ivbs ); - printf( "vdse vds = %12.5e %12.5e\n" , vdse, ivds ); - printf( "vgse vgs = %12.5e %12.5e\n" , vgse, ivgs ); - } - if ( model->HSMHV2_info >= 6 ) { /* input flags */ - printf( "corsrd = %s\n" , (model->HSMHV2_corsrd) ? "true" : "false" ) ; - printf( "coadov = %s\n" , (model->HSMHV2_coadov) ? "true" : "false" ) ; - printf( "coisub = %s\n" , (model->HSMHV2_coisub) ? "true" : "false" ) ; - printf( "coiigs = %s\n" , (model->HSMHV2_coiigs) ? "true" : "false" ) ; - printf( "cogidl = %s\n" , (model->HSMHV2_cogidl) ? "true" : "false" ) ; - printf( "coovlp = %s\n" , (model->HSMHV2_coovlp) ? "true" : "false" ) ; - printf( "coovlps = %s\n" , (model->HSMHV2_coovlps) ? "true" : "false" ) ; - printf( "coflick = %s\n", (model->HSMHV2_coflick) ? "true" : "false" ) ; - printf( "coisti = %s\n" , (model->HSMHV2_coisti) ? "true" : "false" ) ; - printf( "conqs = %s\n" , (model->HSMHV2_conqs) ? "true" : "false" ) ; - printf( "cothrml = %s\n", (model->HSMHV2_cothrml) ? "true" : "false" ) ; - printf( "coign = %s\n" , (model->HSMHV2_coign) ? "true" : "false" ) ; - printf( "cosym = %s\n" , (model->HSMHV2_cosym) ? "true" : "false" ) ; - printf( "coselfheat = %s\n" , (here->HSMHV2_coselfheat) ? "true" : "false" ) ; - } - /* print inputs ------------AA */ - - #ifdef DEBUG_HISIMHVCGG - /* Print convergence flag */ - printf("isConv %d ", isConv ); - printf("CKTtime %e ", ckt->CKTtime ); - printf("Vb %1.3e ", (model->HSMHV2_type>0) ? vbs:-vbs ); - printf("Vd %1.3e ", (model->HSMHV2_type>0) ? vds:-vds ); - printf("Vg %1.3e ", (model->HSMHV2_type>0) ? vgs:-vgs ); - #endif - - /* call model evaluation */ - if ( HSMHV2evaluate(ivdse,ivgse,ivbse,ivds, ivgs, ivbs, vbs_jct, vbd_jct, vsubs, vddp, deltemp, here, model, ckt) == HiSIM_ERROR ) - return (HiSIM_ERROR); - if ( here->HSMHV2_cordrift == 1 ) { - if ( HSMHV2rdrift(vddp, vds, vbs, vsubs, deltemp, here, model, ckt) == HiSIM_ERROR ) - return (HiSIM_ERROR); - } - if ( HSMHV2dio(vbs_jct, vbd_jct, deltemp, here, model, ckt) == HiSIM_ERROR ) - return (HiSIM_ERROR); - -#ifdef DEBUG_HISIMHVCGG - printf("HSMHV2_ids %e ", here->HSMHV2_ids ) ; - printf("HSMHV2_cggb %e ", here->HSMHV2_cggb ) ; - printf("\n") ; -#endif - - here->HSMHV2_called += 1; - -line755: /* standard entry if HSMHV2evaluate is bypassed */ - /* (could be shifted a bit forward ...) */ - if ( here->HSMHV2_mode > 0 ) { /* forward mode */ - Rd = here->HSMHV2_Rd ; - dRd_dVddp = here->HSMHV2_dRd_dVddp ; - dRd_dVdse = here->HSMHV2_dRd_dVdse ; - dRd_dVgse = here->HSMHV2_dRd_dVgse ; - dRd_dVbse = here->HSMHV2_dRd_dVbse ; - dRd_dVsubs = (flg_subNode > 0) ? here->HSMHV2_dRd_dVsubs : 0.0 ; /* derivative w.r.t. Vsubs */ - dRd_dT = (here->HSMHV2_coselfheat > 0) ? here->HSMHV2_dRd_dTi : 0.0 ; - dRd_dVds = here->HSMHV2_dRd_dVds ; - dRd_dVgs = here->HSMHV2_dRd_dVgs ; - dRd_dVbs = here->HSMHV2_dRd_dVbs ; - Rs = here->HSMHV2_Rs ; - dRs_dVdse = here->HSMHV2_dRs_dVdse ; - dRs_dVgse = here->HSMHV2_dRs_dVgse ; - dRs_dVbse = here->HSMHV2_dRs_dVbse ; - dRs_dVsubs = (flg_subNode > 0) ? here->HSMHV2_dRs_dVsubs : 0.0 ; /* derivative w.r.t. Vsubs */ - dRs_dT = (here->HSMHV2_coselfheat > 0) ? here->HSMHV2_dRs_dTi : 0.0 ; - Ids = here->HSMHV2_ids ; - gds = here->HSMHV2_dIds_dVdsi ; - gm = here->HSMHV2_dIds_dVgsi ; - gmbs = here->HSMHV2_dIds_dVbsi ; - gmT = (here->HSMHV2_coselfheat > 0) ? here->HSMHV2_dIds_dTi : 0.0 ; - gmbs_ext = here->HSMHV2_dIds_dVbse ; - gds_ext = here->HSMHV2_dIds_dVdse ; - gm_ext = here->HSMHV2_dIds_dVgse ; - - Qd = here->HSMHV2_qd ; - dQd_dVds = here->HSMHV2_dQdi_dVdsi ; - dQd_dVgs = here->HSMHV2_dQdi_dVgsi ; - dQd_dVbs = here->HSMHV2_dQdi_dVbsi ; - dQd_dT = (here->HSMHV2_coselfheat > 0) ? here->HSMHV2_dQdi_dTi : 0.0 ; - Qg = here->HSMHV2_qg ; - dQg_dVds = here->HSMHV2_dQg_dVdsi ; - dQg_dVgs = here->HSMHV2_dQg_dVgsi ; - dQg_dVbs = here->HSMHV2_dQg_dVbsi ; - dQg_dT = (here->HSMHV2_coselfheat > 0) ? here->HSMHV2_dQg_dTi : 0.0 ; - Qs = here->HSMHV2_qs ; - dQs_dVds = here->HSMHV2_dQsi_dVdsi ; - dQs_dVgs = here->HSMHV2_dQsi_dVgsi ; - dQs_dVbs = here->HSMHV2_dQsi_dVbsi ; - dQs_dT = (here->HSMHV2_coselfheat > 0) ? here->HSMHV2_dQsi_dTi : 0.0 ; - Qb = - (here->HSMHV2_qg + here->HSMHV2_qd + here->HSMHV2_qs) ; - dQb_dVds = here->HSMHV2_dQb_dVdsi ; - dQb_dVgs = here->HSMHV2_dQb_dVgsi ; - dQb_dVbs = here->HSMHV2_dQb_dVbsi ; - dQb_dT = (here->HSMHV2_coselfheat > 0) ? here->HSMHV2_dQb_dTi : 0.0 ; - Qfd = here->HSMHV2_qdp ; - dQfd_dVdse = here->HSMHV2_dqdp_dVdse ; - dQfd_dVgse = here->HSMHV2_dqdp_dVgse ; - dQfd_dVbse = here->HSMHV2_dqdp_dVbse ; - dQfd_dT = (here->HSMHV2_coselfheat > 0) ? here->HSMHV2_dqdp_dTi : 0.0 ; - Qfs = here->HSMHV2_qsp ; - dQfs_dVdse = here->HSMHV2_dqsp_dVdse ; - dQfs_dVgse = here->HSMHV2_dqsp_dVgse ; - dQfs_dVbse = here->HSMHV2_dqsp_dVbse ; - dQfs_dT = (here->HSMHV2_coselfheat > 0) ? here->HSMHV2_dqsp_dTi : 0.0 ; - - Qdext = here->HSMHV2_qdext ; - dQdext_dVdse = here->HSMHV2_dQdext_dVdse ; - dQdext_dVgse = here->HSMHV2_dQdext_dVgse ; - dQdext_dVbse = here->HSMHV2_dQdext_dVbse ; - dQdext_dT = (here->HSMHV2_coselfheat > 0) ? here->HSMHV2_dQdext_dTi : 0.0 ; - Qgext = here->HSMHV2_qgext ; - dQgext_dVdse = here->HSMHV2_dQgext_dVdse ; - dQgext_dVgse = here->HSMHV2_dQgext_dVgse ; - dQgext_dVbse = here->HSMHV2_dQgext_dVbse ; - dQgext_dT = (here->HSMHV2_coselfheat > 0) ? here->HSMHV2_dQgext_dTi : 0.0 ; - Qsext = here->HSMHV2_qsext ; - dQsext_dVdse = here->HSMHV2_dQsext_dVdse ; - dQsext_dVgse = here->HSMHV2_dQsext_dVgse ; - dQsext_dVbse = here->HSMHV2_dQsext_dVbse ; - dQsext_dT = (here->HSMHV2_coselfheat > 0) ? here->HSMHV2_dQsext_dTi : 0.0 ; - Qbext = - (here->HSMHV2_qgext + here->HSMHV2_qdext + here->HSMHV2_qsext) ; - dQbext_dVdse = here->HSMHV2_dQbext_dVdse ; - dQbext_dVgse = here->HSMHV2_dQbext_dVgse ; - dQbext_dVbse = here->HSMHV2_dQbext_dVbse ; - dQbext_dT = (here->HSMHV2_coselfheat > 0) ? here->HSMHV2_dQbext_dTi : 0.0 ; - Isub = here->HSMHV2_isub ; - dIsub_dVds = here->HSMHV2_dIsub_dVdsi ; - dIsub_dVgs = here->HSMHV2_dIsub_dVgsi ; - dIsub_dVbs = here->HSMHV2_dIsub_dVbsi ; - dIsub_dT = (here->HSMHV2_coselfheat > 0) ? here->HSMHV2_dIsub_dTi : 0.0 ; - Isubs = 0.0 ; - dIsubs_dVds = 0.0 ; - dIsubs_dVgs = 0.0 ; - dIsubs_dVbs = 0.0 ; - dIsubs_dT = 0.0 ; - IsubLD = here->HSMHV2_isubld ; - dIsubLD_dVds = here->HSMHV2_dIsubLD_dVdsi ; - dIsubLD_dVgs = here->HSMHV2_dIsubLD_dVgsi ; - dIsubLD_dVbs = here->HSMHV2_dIsubLD_dVbsi ; - dIsubLD_dT = (here->HSMHV2_coselfheat > 0) ? here->HSMHV2_dIsubLD_dTi : 0.0 ; - dIsubLD_dVddp = here->HSMHV2_dIsubLD_dVddp ; - IsubLDs = 0.0 ; - dIsubLDs_dVds = 0.0 ; - dIsubLDs_dVgs = 0.0 ; - dIsubLDs_dVbs = 0.0 ; - dIsubLDs_dT = 0.0 ; - dIsubLDs_dVddp = 0.0 ; - IdsIBPC = here->HSMHV2_idsibpc ; - dIdsIBPC_dVds = here->HSMHV2_dIdsIBPC_dVdsi ; - dIdsIBPC_dVgs = here->HSMHV2_dIdsIBPC_dVgsi ; - dIdsIBPC_dVbs = here->HSMHV2_dIdsIBPC_dVbsi ; - dIdsIBPC_dT = (here->HSMHV2_coselfheat > 0) ? here->HSMHV2_dIdsIBPC_dTi : 0.0 ; - dIdsIBPC_dVddp = here->HSMHV2_dIdsIBPC_dVddp ; - IdsIBPCs = 0.0 ; - dIdsIBPCs_dVds = 0.0 ; - dIdsIBPCs_dVgs = 0.0 ; - dIdsIBPCs_dVbs = 0.0 ; - dIdsIBPCs_dT = 0.0 ; - dIdsIBPCs_dVddp = 0.0 ; - Igidl = here->HSMHV2_igidl ; - dIgidl_dVds = here->HSMHV2_dIgidl_dVdsi ; - dIgidl_dVgs = here->HSMHV2_dIgidl_dVgsi ; - dIgidl_dVbs = here->HSMHV2_dIgidl_dVbsi ; - dIgidl_dT = (here->HSMHV2_coselfheat > 0) ? here->HSMHV2_dIgidl_dTi : 0.0 ; - Igisl = here->HSMHV2_igisl ; - dIgisl_dVds = here->HSMHV2_dIgisl_dVdsi ; - dIgisl_dVgs = here->HSMHV2_dIgisl_dVgsi ; - dIgisl_dVbs = here->HSMHV2_dIgisl_dVbsi ; - dIgisl_dT = (here->HSMHV2_coselfheat > 0) ? here->HSMHV2_dIgisl_dTi : 0.0 ; - Igd = here->HSMHV2_igd ; - dIgd_dVd = here->HSMHV2_dIgd_dVdsi ; - dIgd_dVg = here->HSMHV2_dIgd_dVgsi ; - dIgd_dVb = here->HSMHV2_dIgd_dVbsi ; - dIgd_dT = (here->HSMHV2_coselfheat > 0) ? here->HSMHV2_dIgd_dTi : 0.0 ; - Igs = here->HSMHV2_igs ; - dIgs_dVd = here->HSMHV2_dIgs_dVdsi ; - dIgs_dVg = here->HSMHV2_dIgs_dVgsi ; - dIgs_dVb = here->HSMHV2_dIgs_dVbsi ; - dIgs_dT = (here->HSMHV2_coselfheat > 0) ? here->HSMHV2_dIgs_dTi : 0.0 ; - Igb = here->HSMHV2_igb ; - dIgb_dVd = here->HSMHV2_dIgb_dVdsi ; - dIgb_dVg = here->HSMHV2_dIgb_dVgsi ; - dIgb_dVb = here->HSMHV2_dIgb_dVbsi ; - dIgb_dT = (here->HSMHV2_coselfheat > 0) ? here->HSMHV2_dIgb_dTi : 0.0 ; - - /*---------------------------------------------------* - * Junction diode. - *-----------------*/ - Ibd = here->HSMHV2_ibd ; - Gbd = here->HSMHV2_gbd ; - Gbdt = (here->HSMHV2_coselfheat > 0) ? here->HSMHV2_gbdT : 0.0 ; - - /* Qbd = here->HSMHV2_qbd ; */ - Qbd = *(ckt->CKTstate0 + here->HSMHV2qbd) ; - Cbd = here->HSMHV2_capbd ; - Cbdt = (here->HSMHV2_coselfheat > 0) ? here->HSMHV2_gcbdT : 0.0 ; - - Ibs = here->HSMHV2_ibs ; - Gbs = here->HSMHV2_gbs ; - Gbst = (here->HSMHV2_coselfheat > 0) ? here->HSMHV2_gbsT : 0.0 ; - - /* Qbs = here->HSMHV2_qbs ; */ - Qbs = *(ckt->CKTstate0 + here->HSMHV2qbs) ; - Cbs = here->HSMHV2_capbs ; - Cbst = (here->HSMHV2_coselfheat > 0) ? here->HSMHV2_gcbsT : 0.0 ; - - if (flg_nqs) { - tau = here->HSMHV2_tau ; - dtau_dVds = here->HSMHV2_tau_dVdsi ; - dtau_dVgs = here->HSMHV2_tau_dVgsi ; - dtau_dVbs = here->HSMHV2_tau_dVbsi ; - dtau_dT = here->HSMHV2_tau_dTi ; - taub = here->HSMHV2_taub ; - dtaub_dVds = here->HSMHV2_taub_dVdsi ; - dtaub_dVgs = here->HSMHV2_taub_dVgsi ; - dtaub_dVbs = here->HSMHV2_taub_dVbsi ; - dtaub_dT = here->HSMHV2_taub_dTi ; - Qdrat = here->HSMHV2_Xd ; - dQdrat_dVds = here->HSMHV2_Xd_dVdsi ; - dQdrat_dVgs = here->HSMHV2_Xd_dVgsi ; - dQdrat_dVbs = here->HSMHV2_Xd_dVbsi ; - dQdrat_dT = here->HSMHV2_Xd_dTi ; - Qi = here->HSMHV2_Qi ; - dQi_dVds = here->HSMHV2_Qi_dVdsi ; - dQi_dVgs = here->HSMHV2_Qi_dVgsi ; - dQi_dVbs = here->HSMHV2_Qi_dVbsi ; - dQi_dT = here->HSMHV2_Qi_dTi ; - Qbulk = here->HSMHV2_Qbulk ; - dQbulk_dVds = here->HSMHV2_Qbulk_dVdsi ; - dQbulk_dVgs = here->HSMHV2_Qbulk_dVgsi ; - dQbulk_dVbs = here->HSMHV2_Qbulk_dVbsi ; - dQbulk_dT = here->HSMHV2_Qbulk_dTi ; - } - - } else { /* reverse mode */ - /* note: here->HSMHV2_Rd and here->HSMHV2_Rs are already subjected to mode handling, - while the following derivatives here->HSMHV2_Rd_dVdse, ... are not! */ - Rd = here->HSMHV2_Rd ; - dRd_dVddp = here->HSMHV2_dRd_dVddp ; - dRd_dVdse = here->HSMHV2_dRd_dVdse ; - dRd_dVgse = here->HSMHV2_dRd_dVgse ; - dRd_dVbse = here->HSMHV2_dRd_dVbse ; - dRd_dVsubs= (flg_subNode > 0) ? here->HSMHV2_dRd_dVsubs : 0.0 ; /* derivative w.r.t. Vsubs */ - dRd_dT = (here->HSMHV2_coselfheat > 0) ? here->HSMHV2_dRd_dTi : 0.0 ; - dRd_dVds = here->HSMHV2_dRd_dVds ; - dRd_dVgs = here->HSMHV2_dRd_dVgs ; - dRd_dVbs = here->HSMHV2_dRd_dVbs ; - Rs = here->HSMHV2_Rs ; - dRs_dVdse = here->HSMHV2_dRs_dVdse ; - dRs_dVgse = here->HSMHV2_dRs_dVgse ; - dRs_dVbse = here->HSMHV2_dRs_dVbse ; - dRs_dVsubs= (flg_subNode > 0) ? here->HSMHV2_dRs_dVsubs : 0.0 ; /* derivative w.r.t. Vsubs */ - dRs_dT = (here->HSMHV2_coselfheat > 0) ? here->HSMHV2_dRs_dTi : 0.0 ; - Ids = - here->HSMHV2_ids ; - gds = + (here->HSMHV2_dIds_dVdsi + here->HSMHV2_dIds_dVgsi + here->HSMHV2_dIds_dVbsi) ; - gm = - here->HSMHV2_dIds_dVgsi ; - gmbs = - here->HSMHV2_dIds_dVbsi ; - gmT = (here->HSMHV2_coselfheat > 0) ? - here->HSMHV2_dIds_dTi : 0.0 ; - gds_ext = + (here->HSMHV2_dIds_dVdse + here->HSMHV2_dIds_dVgse + here->HSMHV2_dIds_dVbse) ; - gm_ext = - here->HSMHV2_dIds_dVgse; - gmbs_ext = - here->HSMHV2_dIds_dVbse; - - Qd = here->HSMHV2_qs ; - dQd_dVds = - (here->HSMHV2_dQsi_dVdsi + here->HSMHV2_dQsi_dVgsi + here->HSMHV2_dQsi_dVbsi) ; - dQd_dVgs = here->HSMHV2_dQsi_dVgsi ; - dQd_dVbs = here->HSMHV2_dQsi_dVbsi ; - dQd_dT = (here->HSMHV2_coselfheat > 0) ? here->HSMHV2_dQsi_dTi : 0.0 ; - Qg = here->HSMHV2_qg ; - dQg_dVds = - (here->HSMHV2_dQg_dVdsi + here->HSMHV2_dQg_dVgsi + here->HSMHV2_dQg_dVbsi) ; - dQg_dVgs = here->HSMHV2_dQg_dVgsi ; - dQg_dVbs = here->HSMHV2_dQg_dVbsi ; - dQg_dT = (here->HSMHV2_coselfheat > 0) ? here->HSMHV2_dQg_dTi : 0.0 ; - Qs = here->HSMHV2_qd ; - dQs_dVds = - (here->HSMHV2_dQdi_dVdsi + here->HSMHV2_dQdi_dVgsi + here->HSMHV2_dQdi_dVbsi) ; - dQs_dVgs = here->HSMHV2_dQdi_dVgsi ; - dQs_dVbs = here->HSMHV2_dQdi_dVbsi ; - dQs_dT = (here->HSMHV2_coselfheat > 0) ? here->HSMHV2_dQdi_dTi : 0.0 ; - Qb = - (here->HSMHV2_qg + here->HSMHV2_qd + here->HSMHV2_qs) ; - dQb_dVds = - (here->HSMHV2_dQb_dVdsi + here->HSMHV2_dQb_dVgsi + here->HSMHV2_dQb_dVbsi) ; - dQb_dVgs = here->HSMHV2_dQb_dVgsi ; - dQb_dVbs = here->HSMHV2_dQb_dVbsi ; - dQb_dT = (here->HSMHV2_coselfheat > 0) ? here->HSMHV2_dQb_dTi : 0.0 ; - Qfd = here->HSMHV2_qsp ; - dQfd_dVdse = - (here->HSMHV2_dqsp_dVdse + here->HSMHV2_dqsp_dVgse + here->HSMHV2_dqsp_dVbse) ; - dQfd_dVgse = here->HSMHV2_dqsp_dVgse ; - dQfd_dVbse = here->HSMHV2_dqsp_dVbse ; - dQfd_dT = (here->HSMHV2_coselfheat > 0) ? here->HSMHV2_dqsp_dTi : 0.0 ; - Qfs = here->HSMHV2_qdp ; - dQfs_dVdse = - (here->HSMHV2_dqdp_dVdse + here->HSMHV2_dqdp_dVgse + here->HSMHV2_dqdp_dVbse) ; - dQfs_dVgse = here->HSMHV2_dqdp_dVgse ; - dQfs_dVbse = here->HSMHV2_dqdp_dVbse ; - dQfs_dT = (here->HSMHV2_coselfheat > 0) ? here->HSMHV2_dqdp_dTi : 0.0 ; - - Qdext = here->HSMHV2_qsext ; - dQdext_dVdse = - (here->HSMHV2_dQsext_dVdse + here->HSMHV2_dQsext_dVgse + here->HSMHV2_dQsext_dVbse); - dQdext_dVgse = here->HSMHV2_dQsext_dVgse ; - dQdext_dVbse = here->HSMHV2_dQsext_dVbse ; - dQdext_dT = (here->HSMHV2_coselfheat > 0) ? here->HSMHV2_dQsext_dTi : 0.0 ; - Qgext = here->HSMHV2_qgext ; - dQgext_dVdse = - (here->HSMHV2_dQgext_dVdse + here->HSMHV2_dQgext_dVgse + here->HSMHV2_dQgext_dVbse); - dQgext_dVgse = here->HSMHV2_dQgext_dVgse ; - dQgext_dVbse = here->HSMHV2_dQgext_dVbse ; - dQgext_dT = (here->HSMHV2_coselfheat > 0) ? here->HSMHV2_dQgext_dTi : 0.0 ; - Qsext = here->HSMHV2_qdext ; - dQsext_dVdse = - (here->HSMHV2_dQdext_dVdse + here->HSMHV2_dQdext_dVgse + here->HSMHV2_dQdext_dVbse); - dQsext_dVgse = here->HSMHV2_dQdext_dVgse ; - dQsext_dVbse = here->HSMHV2_dQdext_dVbse ; - dQsext_dT = (here->HSMHV2_coselfheat > 0) ? here->HSMHV2_dQdext_dTi : 0.0 ; - Qbext = - (here->HSMHV2_qgext + here->HSMHV2_qdext + here->HSMHV2_qsext) ; - dQbext_dVdse = - (here->HSMHV2_dQbext_dVdse + here->HSMHV2_dQbext_dVgse + here->HSMHV2_dQbext_dVbse); - dQbext_dVgse = here->HSMHV2_dQbext_dVgse ; - dQbext_dVbse = here->HSMHV2_dQbext_dVbse ; - dQbext_dT = (here->HSMHV2_coselfheat > 0) ? here->HSMHV2_dQbext_dTi : 0.0 ; - Isub = 0.0 ; - dIsub_dVds = 0.0 ; - dIsub_dVgs = 0.0 ; - dIsub_dVbs = 0.0 ; - dIsub_dT = 0.0 ; - Isubs = here->HSMHV2_isub ; - dIsubs_dVds = - (here->HSMHV2_dIsub_dVdsi + here->HSMHV2_dIsub_dVgsi + here->HSMHV2_dIsub_dVbsi) ; - dIsubs_dVgs = here->HSMHV2_dIsub_dVgsi ; - dIsubs_dVbs = here->HSMHV2_dIsub_dVbsi ; - dIsubs_dT = (here->HSMHV2_coselfheat > 0) ? here->HSMHV2_dIsub_dTi : 0.0 ; - IsubLD = 0.0 ; - dIsubLD_dVds = 0.0 ; - dIsubLD_dVgs = 0.0 ; - dIsubLD_dVbs = 0.0 ; - dIsubLD_dT = 0.0 ; - dIsubLD_dVddp = 0.0 ; - IsubLDs = here->HSMHV2_isubld ; - dIsubLDs_dVds = - (here->HSMHV2_dIsubLD_dVdsi + here->HSMHV2_dIsubLD_dVgsi + here->HSMHV2_dIsubLD_dVbsi) ; - dIsubLDs_dVgs = here->HSMHV2_dIsubLD_dVgsi ; - dIsubLDs_dVbs = here->HSMHV2_dIsubLD_dVbsi ; - dIsubLDs_dT = (here->HSMHV2_coselfheat > 0) ? here->HSMHV2_dIsubLD_dTi : 0.0 ; - dIsubLDs_dVddp = - here->HSMHV2_dIsubLD_dVddp ; - IdsIBPC = 0.0 ; - dIdsIBPC_dVds = 0.0 ; - dIdsIBPC_dVgs = 0.0 ; - dIdsIBPC_dVbs = 0.0 ; - dIdsIBPC_dT = 0.0 ; - dIdsIBPC_dVddp = 0.0 ; - IdsIBPCs = here->HSMHV2_idsibpc ; - dIdsIBPCs_dVds = - (here->HSMHV2_dIdsIBPC_dVdsi + here->HSMHV2_dIdsIBPC_dVgsi + here->HSMHV2_dIdsIBPC_dVbsi) ; - dIdsIBPCs_dVgs = here->HSMHV2_dIdsIBPC_dVgsi ; - dIdsIBPCs_dVbs = here->HSMHV2_dIdsIBPC_dVbsi ; - dIdsIBPCs_dT = (here->HSMHV2_coselfheat > 0) ? here->HSMHV2_dIdsIBPC_dTi : 0.0 ; - dIdsIBPCs_dVddp = - here->HSMHV2_dIdsIBPC_dVddp ; - Igidl = here->HSMHV2_igisl ; - dIgidl_dVds = - (here->HSMHV2_dIgisl_dVdsi + here->HSMHV2_dIgisl_dVgsi + here->HSMHV2_dIgisl_dVbsi) ; - dIgidl_dVgs = here->HSMHV2_dIgisl_dVgsi ; - dIgidl_dVbs = here->HSMHV2_dIgisl_dVbsi ; - dIgidl_dT = (here->HSMHV2_coselfheat > 0) ? here->HSMHV2_dIgisl_dTi : 0.0 ; - Igisl = here->HSMHV2_igidl ; - dIgisl_dVds = - (here->HSMHV2_dIgidl_dVdsi + here->HSMHV2_dIgidl_dVgsi + here->HSMHV2_dIgidl_dVbsi) ; - dIgisl_dVgs = here->HSMHV2_dIgidl_dVgsi ; - dIgisl_dVbs = here->HSMHV2_dIgidl_dVbsi ; - dIgisl_dT = (here->HSMHV2_coselfheat > 0) ? here->HSMHV2_dIgidl_dTi : 0.0 ; - /* note: here->HSMHV2_igd and here->HSMHV2_igs are already subjected to mode handling, - while the following derivatives here->HSMHV2_dIgd_dVdsi, ... are not! */ - Igd = here->HSMHV2_igd ; - dIgd_dVd = - (here->HSMHV2_dIgs_dVdsi + here->HSMHV2_dIgs_dVgsi + here->HSMHV2_dIgs_dVbsi) ; - dIgd_dVg = here->HSMHV2_dIgs_dVgsi ; - dIgd_dVb = here->HSMHV2_dIgs_dVbsi ; - dIgd_dT = (here->HSMHV2_coselfheat > 0) ? here->HSMHV2_dIgs_dTi : 0.0 ; - Igs = here->HSMHV2_igs ; - dIgs_dVd = - (here->HSMHV2_dIgd_dVdsi + here->HSMHV2_dIgd_dVgsi + here->HSMHV2_dIgd_dVbsi) ; - dIgs_dVg = here->HSMHV2_dIgd_dVgsi ; - dIgs_dVb = here->HSMHV2_dIgd_dVbsi ; - dIgs_dT = (here->HSMHV2_coselfheat > 0) ? here->HSMHV2_dIgd_dTi : 0.0 ; - Igb = here->HSMHV2_igb ; - dIgb_dVd = - (here->HSMHV2_dIgb_dVdsi + here->HSMHV2_dIgb_dVgsi + here->HSMHV2_dIgb_dVbsi) ; - dIgb_dVg = here->HSMHV2_dIgb_dVgsi ; - dIgb_dVb = here->HSMHV2_dIgb_dVbsi ; - dIgb_dT = (here->HSMHV2_coselfheat > 0) ? here->HSMHV2_dIgb_dTi : 0.0 ; - - /*---------------------------------------------------* - * Junction diode. - *-----------------*/ - Ibd = here->HSMHV2_ibd ; - Gbd = here->HSMHV2_gbd ; - Gbdt = (here->HSMHV2_coselfheat > 0) ? here->HSMHV2_gbdT : 0.0 ; - - /* Qbd = here->HSMHV2_qbd ; */ - Qbd = *(ckt->CKTstate0 + here->HSMHV2qbd) ; - Cbd = here->HSMHV2_capbd ; - Cbdt = (here->HSMHV2_coselfheat > 0) ? here->HSMHV2_gcbdT : 0.0 ; - - Ibs = here->HSMHV2_ibs ; - Gbs = here->HSMHV2_gbs ; - Gbst = (here->HSMHV2_coselfheat > 0) ? here->HSMHV2_gbsT : 0.0 ; - - /* Qbs = here->HSMHV2_qbs ; */ - Qbs = *(ckt->CKTstate0 + here->HSMHV2qbs) ; - Cbs = here->HSMHV2_capbs ; - Cbst = (here->HSMHV2_coselfheat > 0) ? here->HSMHV2_gcbsT : 0.0 ; - - if (flg_nqs) { - tau = here->HSMHV2_tau ; - dtau_dVds = -(here->HSMHV2_tau_dVdsi + here->HSMHV2_tau_dVgsi + here->HSMHV2_tau_dVbsi) ; - dtau_dVgs = here->HSMHV2_tau_dVgsi ; - dtau_dVbs = here->HSMHV2_tau_dVbsi ; - dtau_dT = here->HSMHV2_tau_dTi ; - taub = here->HSMHV2_taub ; - dtaub_dVds = -(here->HSMHV2_taub_dVdsi + here->HSMHV2_taub_dVgsi + here->HSMHV2_taub_dVbsi); - dtaub_dVgs = here->HSMHV2_taub_dVgsi ; - dtaub_dVbs = here->HSMHV2_taub_dVbsi ; - dtaub_dT = here->HSMHV2_taub_dTi ; - Qdrat = 1.0 - here->HSMHV2_Xd ; - dQdrat_dVds = +(here->HSMHV2_Xd_dVdsi + here->HSMHV2_Xd_dVgsi + here->HSMHV2_Xd_dVbsi) ; - dQdrat_dVgs = - here->HSMHV2_Xd_dVgsi ; - dQdrat_dVbs = - here->HSMHV2_Xd_dVbsi ; - dQdrat_dT = - here->HSMHV2_Xd_dTi ; - Qi = here->HSMHV2_Qi ; - dQi_dVds = -(here->HSMHV2_Qi_dVdsi + here->HSMHV2_Qi_dVgsi + here->HSMHV2_Qi_dVbsi) ; - dQi_dVgs = here->HSMHV2_Qi_dVgsi ; - dQi_dVbs = here->HSMHV2_Qi_dVbsi ; - dQi_dT = here->HSMHV2_Qi_dTi ; - Qbulk = here->HSMHV2_Qbulk ; - dQbulk_dVds = -(here->HSMHV2_Qbulk_dVdsi + here->HSMHV2_Qbulk_dVgsi + here->HSMHV2_Qbulk_dVbsi) ; - dQbulk_dVgs = here->HSMHV2_Qbulk_dVgsi ; - dQbulk_dVbs = here->HSMHV2_Qbulk_dVbsi ; - dQbulk_dT = here->HSMHV2_Qbulk_dTi ; - } - } /* end of reverse mode */ - - if (here->HSMHV2_coselfheat > 0) { - if (pParam->HSMHV2_rth > C_RTH_MIN) { - Gth = 1.0/pParam->HSMHV2_rth ; - } else { - Gth = 1.0/C_RTH_MIN ; - } - Ith = Gth * deltemp ; - dIth_dT = Gth ; - Cth = pParam->HSMHV2_cth ; - Qth = Cth * deltemp ; - /* P = Ids * (Vdsi + param * ( Vdse - Vdsi)) */ - /* = Ids * Veffpower */ - if ( vds * (vdse - vds) >= 0.0) { - if ( pParam->HSMHV2_powrat == 1.0 ) { - Veffpower = vdse ; - dVeffpower_dVds = 0.0 ; - dVeffpower_dVdse = 1.0 ; - } else { - Veffpower = vds + here->HSMHV2_powratio * (vdse - vds) ; - dVeffpower_dVds = (1.0 - here->HSMHV2_powratio) ; - dVeffpower_dVdse = here->HSMHV2_powratio ; - } - } else { - Veffpower = vds ; - dVeffpower_dVds = 1.0 ; - dVeffpower_dVdse = 0.0 ; - } - P = Ids * Veffpower ; - dP_dVds = gds * Veffpower + Ids * dVeffpower_dVds; - dP_dVgs = gm * Veffpower ; - dP_dVbs = gmbs * Veffpower ; - dP_dT = gmT * Veffpower ; - dP_dVdse = gds_ext * Veffpower + Ids * dVeffpower_dVdse ; - dP_dVgse = gm_ext * Veffpower ; - dP_dVbse = gmbs_ext * Veffpower ; - - /* Clamping the maximum rise tempaerarure (SHEMAX) */ - T1 = model->HSMHV2_shemax * Gth ; - Fn_SU( T2 , P , T1 , SHE_MAX_dlt * Gth , T0 ) ; - P = T2 ; - dP_dVds = T0 * dP_dVds ; - dP_dVgs = T0 * dP_dVgs ; - dP_dVbs = T0 * dP_dVbs ; - dP_dT = T0 * dP_dT ; - dP_dVdse = T0 * dP_dVdse ; - dP_dVgse = T0 * dP_dVgse ; - dP_dVbse = T0 * dP_dVbse ; - - } else { - Gth = 0.0 ; - Ith = 0.0 ; - dIth_dT = 0.0 ; - Cth = 0.0 ; - Qth = 0.0 ; - P = 0.0 ; - dP_dVds = 0.0 ; - dP_dVgs = 0.0 ; - dP_dVbs = 0.0 ; - dP_dT = 0.0 ; - dP_dVdse = 0.0 ; - dP_dVgse = 0.0 ; - dP_dVbse = 0.0 ; - } - - /* in case of nqs: construct static contributions to the nqs equations (Iqi_nqs, Iqb_nqs) */ - /* and nqs charge contributions to inner drain, gate and source node (Qd_nqs, Qg_nqs, Qs_nqs) */ - - if (flg_nqs) { - /* .. tau, taub must be > 0 */ - if (tau < 1.0e-18) { - tau = 1.e-18 ; - dtau_dVds = dtau_dVgs = dtau_dVbs = dtau_dT = 0.0 ; - } - if (taub < 1.0e-18) { - taub = 1.0e-18 ; - dtaub_dVds = dtaub_dVgs = dtaub_dVbs = dtaub_dT = 0.0 ; - } - - Iqi_nqs = (Qi_nqs - Qi) / tau ; - dIqi_nqs_dVds = - (dQi_dVds + Iqi_nqs * dtau_dVds) / tau ; - dIqi_nqs_dVgs = - (dQi_dVgs + Iqi_nqs * dtau_dVgs) / tau ; - dIqi_nqs_dVbs = - (dQi_dVbs + Iqi_nqs * dtau_dVbs) / tau ; - dIqi_nqs_dT = - (dQi_dT + Iqi_nqs * dtau_dT ) / tau ; - dIqi_nqs_dQi_nqs = 1.0 / tau ; - - Iqb_nqs = (Qb_nqs - Qbulk) / taub ; - dIqb_nqs_dVds = - (dQbulk_dVds + Iqb_nqs * dtaub_dVds) / taub ; - dIqb_nqs_dVgs = - (dQbulk_dVgs + Iqb_nqs * dtaub_dVgs) / taub ; - dIqb_nqs_dVbs = - (dQbulk_dVbs + Iqb_nqs * dtaub_dVbs) / taub ; - dIqb_nqs_dT = - (dQbulk_dT + Iqb_nqs * dtaub_dT ) / taub ; - dIqb_nqs_dQb_nqs = 1.0 / taub ; - - Qd_nqs = Qi_nqs * Qdrat ; - dQd_nqs_dVds = Qi_nqs * dQdrat_dVds ; - dQd_nqs_dVgs = Qi_nqs * dQdrat_dVgs ; - dQd_nqs_dVbs = Qi_nqs * dQdrat_dVbs ; - dQd_nqs_dT = Qi_nqs * dQdrat_dT ; - dQd_nqs_dQi_nqs = Qdrat ; - - Qg_nqs = - Qi_nqs - Qb_nqs ; - dQg_nqs_dQi_nqs = - 1.0 ; - dQg_nqs_dQb_nqs = - 1.0 ; - - Qs_nqs = Qi_nqs * (1.0 - Qdrat) ; - dQs_nqs_dVds = - Qi_nqs * dQdrat_dVds ; - dQs_nqs_dVgs = - Qi_nqs * dQdrat_dVgs ; - dQs_nqs_dVbs = - Qi_nqs * dQdrat_dVbs ; - dQs_nqs_dT = - Qi_nqs * dQdrat_dT ; - dQs_nqs_dQi_nqs = 1.0 - Qdrat ; - } else { - Iqi_nqs = Iqb_nqs = Qd_nqs = Qg_nqs = Qs_nqs = 0.0 ; - } - - dIgd_dVs = - (dIgd_dVd + dIgd_dVg + dIgd_dVb) ; - dIgs_dVs = - (dIgs_dVd + dIgs_dVg + dIgs_dVb) ; - dIgb_dVs = - (dIgb_dVd + dIgb_dVg + dIgb_dVb) ; - - /*---------------------------------------------------* - * External Resistances - *-----------------*/ - if(model->HSMHV2_corsrd == 1 || model->HSMHV2_corsrd == 3 || model->HSMHV2_cordrift == 1 ) { - if(Rd > 0){ - GD = 1.0/Rd; - GD_dVgs = - dRd_dVgs /Rd/Rd; - GD_dVds = - dRd_dVds /Rd/Rd; - GD_dVddp = - dRd_dVddp /Rd/Rd; - GD_dVbs = - dRd_dVbs /Rd/Rd; - GD_dVsubs = - dRd_dVsubs /Rd/Rd; - GD_dT = - dRd_dT /Rd/Rd; - GD_dVgse = - dRd_dVgse /Rd/Rd; - GD_dVdse = - dRd_dVdse /Rd/Rd; - GD_dVbse = - dRd_dVbse /Rd/Rd; - }else{ - GD=0.0; - GD_dVgs=0.0; - GD_dVds=0.0; - GD_dVddp = 0.0; - GD_dVbs=0.0; - GD_dVsubs=0.0; - GD_dT =0.0; - GD_dVgse =0.0; - GD_dVdse =0.0; - GD_dVbse =0.0; - } - if(Rs > 0){ - GS = 1.0/Rs; - GS_dVgs = - dRs_dVgse /Rs/Rs; - GS_dVds = - dRs_dVdse /Rs/Rs; - GS_dVbs = - dRs_dVbse /Rs/Rs; - GS_dVsubs = - dRs_dVsubs /Rs/Rs; - GS_dT = - dRs_dT /Rs/Rs; - }else{ - GS=0.0; - GS_dVgs=0.0; - GS_dVds=0.0; - GS_dVbs=0.0; - GS_dVsubs=0.0; - GS_dT =0.0; - } - } - Iddp = GD * vddp; - dIddp_dVddp = GD_dVddp * vddp + GD ; - dIddp_dVdse = GD_dVdse * vddp; - dIddp_dVgse = GD_dVgse * vddp; - dIddp_dVbse = GD_dVbse * vddp; - dIddp_dVsubs= GD_dVsubs * vddp; - dIddp_dT = GD_dT * vddp; - dIddp_dVds = GD_dVds * vddp; - dIddp_dVgs = GD_dVgs * vddp; - dIddp_dVbs = GD_dVbs * vddp; - - Issp = GS * vssp; - dIssp_dVssp = GS; - dIssp_dVdse = GS_dVds * vssp ; - dIssp_dVgse = GS_dVgs * vssp; - dIssp_dVbse = GS_dVbs * vssp; - dIssp_dVsubs= GS_dVsubs * vssp; - dIssp_dT = GS_dT * vssp; - - if( model->HSMHV2_corg > 0.0 ){ - GG = here->HSMHV2_grg ; - }else{ - GG = 0.0 ; - } - Iggp = GG * vggp; - dIggp_dVggp = GG; - - if(model->HSMHV2_corbnet == 1 && here->HSMHV2_rbpb > 0.0 ){ - GRBPB = here->HSMHV2_grbpb ; - }else{ - GRBPB = 0.0 ; - } - Ibpb = GRBPB * vbpb; - dIbpb_dVbpb = GRBPB; - - if(model->HSMHV2_corbnet == 1 && here->HSMHV2_rbpd > 0.0 ){ - GRBPD = here->HSMHV2_grbpd ; - }else{ - GRBPD = 0.0 ; - } - Ibpdb = GRBPD * vbpdb; - dIbpdb_dVbpdb = GRBPD; - - if(model->HSMHV2_corbnet == 1 && here->HSMHV2_rbps > 0.0 ){ - GRBPS = here->HSMHV2_grbps ; - }else{ - GRBPS = 0.0 ; - } - Ibpsb = GRBPS * vbpsb; - dIbpsb_dVbpsb = GRBPS; - - /* printf("HSMHV2_load: ByPass=%d\n",ByPass) ; */ - - if (!ByPass) { /* no convergence check in case of Bypass */ - /* - * check convergence - */ - isConv = 1; - if ( (here->HSMHV2_off == 0) || !(ckt->CKTmode & MODEINITFIX) ) { - if (Check == 1) { - ckt->CKTnoncon++; - isConv = 0; -#ifndef NEWCONV - } else { - /* convergence check for branch currents is done in function HSMHV2convTest */ -#endif /* NEWCONV */ - } - } - - *(ckt->CKTstate0 + here->HSMHV2vbs) = vbs; - *(ckt->CKTstate0 + here->HSMHV2vbd) = vbd; - *(ckt->CKTstate0 + here->HSMHV2vgs) = vgs; - *(ckt->CKTstate0 + here->HSMHV2vds) = vds; - *(ckt->CKTstate0 + here->HSMHV2vsbs) = vsbs; - *(ckt->CKTstate0 + here->HSMHV2vdbs) = vdbs; - *(ckt->CKTstate0 + here->HSMHV2vdbd) = vdbd; - *(ckt->CKTstate0 + here->HSMHV2vges) = vges; - *(ckt->CKTstate0 + here->HSMHV2vsubs) = vsubs; - *(ckt->CKTstate0 + here->HSMHV2deltemp) = deltemp; - *(ckt->CKTstate0 + here->HSMHV2vdse) = vdse; - *(ckt->CKTstate0 + here->HSMHV2vgse) = vgse; - *(ckt->CKTstate0 + here->HSMHV2vbse) = vbse; - if ( flg_nqs ) { - *(ckt->CKTstate0 + here->HSMHV2qi_nqs) = Qi_nqs; - *(ckt->CKTstate0 + here->HSMHV2qb_nqs) = Qb_nqs; - } - /* printf("HSMHV2_load: (into state0) vds.. = %e %e %e %e %e %e\n", - vds,vgs,vbs,vdse,vgse,vbse); */ - - if ((ckt->CKTmode & MODEDC) && - !(ckt->CKTmode & MODEINITFIX) && !(ckt->CKTmode & MODEINITJCT)) - showPhysVal = 1; - if (model->HSMHV2_show_Given && showPhysVal && isConv) { - static int isFirst = 1; - if (vds != vds_pre) - ShowPhysVals(here, model, isFirst, vds_pre, vgs, vbs, vgd, vbd, vgb); - else - ShowPhysVals(here, model, isFirst, vds, vgs, vbs, vgd, vbd, vgb); - if (isFirst) isFirst = 0; - } - } - -#include "hsmhv2ld_info_eval.h" - - /* For standard Newton method (SPICE_rhs == 0): */ - /* if currents (and charges) are limited -> extrapolate onto x-values */ - /* in SPICE mode (SPICE_rhs == 1): */ - /* extrapolate onto x = 0 (-> rhs_eq) */ - /* */ - /* note that */ - /* the charge extrapolation is replaced by extrapolation of displacement */ - /* currents, see below */ - - /* ...... just for easier handling: collect node voltages in vector x: */ - if (!SPICE_rhs) { - x[dNode] = model->HSMHV2_type *( *(ckt->CKTrhsOld+here->HSMHV2dNode)); - x[dNodePrime] = model->HSMHV2_type *( *(ckt->CKTrhsOld+here->HSMHV2dNodePrime)); - x[gNode] = model->HSMHV2_type *( *(ckt->CKTrhsOld+here->HSMHV2gNode)); - x[gNodePrime] = model->HSMHV2_type *( *(ckt->CKTrhsOld+here->HSMHV2gNodePrime)); - x[sNode] = model->HSMHV2_type *( *(ckt->CKTrhsOld+here->HSMHV2sNode)); - x[sNodePrime] = model->HSMHV2_type *( *(ckt->CKTrhsOld+here->HSMHV2sNodePrime)); - x[bNodePrime] = model->HSMHV2_type *( *(ckt->CKTrhsOld+here->HSMHV2bNodePrime)); - x[bNode] = model->HSMHV2_type *( *(ckt->CKTrhsOld+here->HSMHV2bNode)); - x[dbNode] = model->HSMHV2_type *( *(ckt->CKTrhsOld+here->HSMHV2dbNode)); - x[sbNode] = model->HSMHV2_type *( *(ckt->CKTrhsOld+here->HSMHV2sbNode)); - if (flg_subNode > 0) - x[subNode] = model->HSMHV2_type *( *(ckt->CKTrhsOld+here->HSMHV2subNode)); /* previous vsub */ - else - x[subNode] = 0.0; - if (here->HSMHV2_coselfheat > 0) - x[tempNode] = *(ckt->CKTrhsOld+here->HSMHV2tempNode); - else - x[tempNode] = 0.0; - if ( flg_nqs ) { - x[qiNode] = *(ckt->CKTrhsOld+here->HSMHV2qiNode); - x[qbNode] = *(ckt->CKTrhsOld+here->HSMHV2qbNode); - } else { - x[qiNode] = 0.0; - x[qbNode] = 0.0; - } - } - - delvgs = (x[gNodePrime] - x[sNodePrime]) - vgs; - delvds = (x[dNodePrime] - x[sNodePrime]) - vds; - delvbs = (x[bNodePrime] - x[sNodePrime]) - vbs; - deldeltemp = x[tempNode] - deltemp; - - if (delvgs || delvds || delvbs ||deldeltemp) { - Ids += gm *delvgs + gds *delvds + gmbs *delvbs + gmT *deldeltemp ; - Isub += dIsub_dVgs *delvgs + dIsub_dVds *delvds + dIsub_dVbs *delvbs + dIsub_dT *deldeltemp ; - Isubs+= dIsubs_dVgs*delvgs + dIsubs_dVds*delvds + dIsubs_dVbs*delvbs + dIsubs_dT*deldeltemp ; - IsubLD += dIsubLD_dVgs *delvgs + dIsubLD_dVds *delvds + dIsubLD_dVbs *delvbs + dIsubLD_dT *deldeltemp ; - IsubLDs+= dIsubLDs_dVgs*delvgs + dIsubLDs_dVds*delvds + dIsubLDs_dVbs*delvbs + dIsubLDs_dT*deldeltemp ; - IdsIBPC += dIdsIBPC_dVgs *delvgs + dIdsIBPC_dVds *delvds + dIdsIBPC_dVbs *delvbs + dIdsIBPC_dT *deldeltemp ; - IdsIBPCs+= dIdsIBPCs_dVgs*delvgs + dIdsIBPCs_dVds*delvds + dIdsIBPCs_dVbs*delvbs + dIdsIBPCs_dT*deldeltemp ; - Igd += dIgd_dVg *delvgs + dIgd_dVd *delvds + dIgd_dVb *delvbs + dIgd_dT *deldeltemp ; - Igs += dIgs_dVg *delvgs + dIgs_dVd *delvds + dIgs_dVb *delvbs + dIgs_dT *deldeltemp ; - Igb += dIgb_dVg *delvgs + dIgb_dVd *delvds + dIgb_dVb *delvbs + dIgb_dT *deldeltemp ; - Igidl+= dIgidl_dVgs*delvgs + dIgidl_dVds*delvds + dIgidl_dVbs*delvbs + dIgidl_dT*deldeltemp ; - Igisl+= dIgisl_dVgs*delvgs + dIgisl_dVds*delvds + dIgisl_dVbs*delvbs + dIgisl_dT*deldeltemp ; - P += dP_dVgs *delvgs + dP_dVds *delvds + dP_dVbs *delvbs + dP_dT *deldeltemp ; - if (flg_nqs) { - Iqi_nqs += dIqi_nqs_dVgs*delvgs + dIqi_nqs_dVds*delvds + dIqi_nqs_dVbs*delvbs + dIqi_nqs_dT*deldeltemp ; - Iqb_nqs += dIqb_nqs_dVgs*delvgs + dIqb_nqs_dVds*delvds + dIqb_nqs_dVbs*delvbs + dIqb_nqs_dT*deldeltemp ; - } - } - - delvgse = (x[gNodePrime] - x[sNode]) - vgse; - delvdse = (x[dNode] - x[sNode]) - vdse; - delvbse = (x[bNodePrime] - x[sNode]) - vbse; - if (flg_subNode > 0) delvsubs = (x[subNode] - x[sNode]) - vsubs; /* substrate bias change */ - - if (delvgse || delvdse || delvbse ) { - Ids += gm_ext *delvgse + gds_ext *delvdse + gmbs_ext *delvbse ; - P += dP_dVgse *delvgse + dP_dVdse *delvdse + dP_dVbse *delvbse ; - Iddp += dIddp_dVgse*delvgse + dIddp_dVdse*delvdse + dIddp_dVbse*delvbse ; - Issp += dIssp_dVgse*delvgse + dIssp_dVdse*delvdse + dIssp_dVbse*delvbse ; - } - - if (delvsubs) { - Iddp += dIddp_dVsubs*delvsubs ; - Issp += dIssp_dVsubs*delvsubs ; - } - - if (deldeltemp) { - Iddp += dIddp_dT*deldeltemp ; - Issp += dIssp_dT*deldeltemp ; - Ith += dIth_dT *deldeltemp ; - } - - delvdbd = (x[dbNode] - x[dNode]) - vbd_jct ; - if (delvdbd || deldeltemp) { - Ibd += Gbd*delvdbd + Gbdt*deldeltemp ; - } - - delvsbs = (x[sbNode] - x[sNode]) - vbs_jct ; - if (delvsbs || deldeltemp) { - Ibs += Gbs*delvsbs + Gbst*deldeltemp ; - } - - delvddp = (x[dNode] - x[dNodePrime]) - vddp ; - if (delvddp) { - Iddp += dIddp_dVddp * delvddp ; - IsubLD += dIsubLD_dVddp * delvddp ; - IsubLDs += dIsubLDs_dVddp * delvddp ; - IdsIBPC += dIdsIBPC_dVddp * delvddp ; - IdsIBPCs+= dIdsIBPCs_dVddp * delvddp ; - } - - delvds = (x[dNodePrime] - x[sNodePrime]) - vds ; - if (delvds) { - Iddp += dIddp_dVds * delvds ; - } - - delvgs = (x[gNodePrime] - x[sNodePrime]) - vgs ; - if (delvgs) { - Iddp += dIddp_dVgs * delvgs ; - } - - delvbs = (x[bNodePrime] - x[sNodePrime]) - vbs ; - if (delvbs) { - Iddp += dIddp_dVbs * delvbs ; - } - - delvssp = (x[sNode] - x[sNodePrime]) - vssp ; - if (delvssp) { - Issp += dIssp_dVssp * delvssp ; - } - - delvggp = (x[gNode] - x[gNodePrime]) - vggp ; - if (delvggp) { - Iggp += dIggp_dVggp * delvggp ; - } - - delvbpb = (x[bNodePrime] - x[bNode]) - vbpb ; - if (delvbpb) { - Ibpb += dIbpb_dVbpb * delvbpb ; - } - - delvbpdb = (x[bNodePrime] - x[dbNode]) - vbpdb ; - if (delvbpdb) { - Ibpdb += dIbpdb_dVbpdb * delvbpdb ; - } - - delvbpsb = (x[bNodePrime] - x[sbNode]) - vbpsb ; - if (delvbpsb) { - Ibpsb += dIbpsb_dVbpsb * delvbpsb ; - } - - if (flg_nqs) { - delQi_nqs = x[qiNode] - Qi_nqs ; - if (delQi_nqs) { - Iqi_nqs += dIqi_nqs_dQi_nqs * delQi_nqs ; - } - delQb_nqs = x[qbNode] - Qb_nqs ; - if (delQb_nqs) { - Iqb_nqs += dIqb_nqs_dQb_nqs * delQb_nqs ; - } - } - - - /* Assemble currents into nodes */ - /* ... static part */ - - - /* drain node */ - i_d = Iddp - Ibd + IsubLD + IdsIBPC - IdsIBPCs ; - /* intrinsic drain node */ - i_dP = -Iddp + Ids + Isub + Igidl - Igd ; - /* gate node */ - i_g = Iggp ; - /* intrinsic gate node */ - i_gP = - Iggp + Igd + Igs + Igb ; - /* source node */ - i_s = Issp - Ibs + IsubLDs - IdsIBPC + IdsIBPCs ; - /* intrinsic source node */ - i_sP = - Issp - Ids + Isubs + Igisl - Igs ; - /* intrinsic bulk node */ - i_bP = - Isub - Isubs - IsubLD - IsubLDs- Igidl -Igb - Igisl + Ibpdb + Ibpb + Ibpsb ; - /* base node */ - i_b = - Ibpb ; - /* drain bulk node */ - i_db = Ibd - Ibpdb ; - /* source bulk node */ - i_sb = Ibs - Ibpsb ; - /* temp node */ - if (here->HSMHV2_coselfheat > 0){ - i_t = Ith - P ; - } else { - i_t = 0.0; - } - /* nqs equations */ - i_qi = Iqi_nqs ; - i_qb = Iqb_nqs ; - - for (i = 0; i < XDIM; i++) { - ydc_d[i] = ydc_dP[i] = ydc_g[i] = ydc_gP[i] = ydc_s[i] = ydc_sP[i] = ydc_bP[i] = ydc_b[i] - = ydc_db[i] = ydc_sb[i] = ydc_t[i] = 0.0; - } - if (flg_nqs) { - for (i = 0; i < XDIM; i++) { - ydc_qi[i] = ydc_qb[i] = 0.0; - } - } - - /* drain node */ - ydc_d[dNode] = dIddp_dVddp + dIddp_dVdse + Gbd + dIsubLD_dVddp + dIdsIBPC_dVddp - dIdsIBPCs_dVddp ; - ydc_d[dNodePrime] = -dIddp_dVddp + dIddp_dVds + dIsubLD_dVds + dIdsIBPC_dVds - dIdsIBPCs_dVds - dIsubLD_dVddp - dIdsIBPC_dVddp + dIdsIBPCs_dVddp ; - /* ydc_d[gNode] = 0.0 ; */ - ydc_d[gNodePrime] = dIddp_dVgse + dIddp_dVgs + dIsubLD_dVgs + dIdsIBPC_dVgs - dIdsIBPCs_dVgs ; - ydc_d[sNode] = - ( dIddp_dVdse + dIddp_dVgse + dIddp_dVbse ) - dIddp_dVsubs ; - ydc_d[sNodePrime] = - dIsubLD_dVds - dIsubLD_dVgs - dIsubLD_dVbs - dIdsIBPC_dVds - dIdsIBPC_dVgs - dIdsIBPC_dVbs - (- dIdsIBPCs_dVds - dIdsIBPCs_dVgs - dIdsIBPCs_dVbs ) - ( dIddp_dVds + dIddp_dVgs + dIddp_dVbs ) ; - ydc_d[bNodePrime] = dIddp_dVbse + dIddp_dVbs + dIsubLD_dVbs + dIdsIBPC_dVbs - dIdsIBPCs_dVbs ; - /* ydc_d[bNode] = 0.0 ; */ - ydc_d[dbNode] = - Gbd ; - /* ydc_d[sbNode] = 0.0 ; */ - ydc_d[subNode] = dIddp_dVsubs ; - ydc_d[tempNode] = dIddp_dT - Gbdt + dIsubLD_dT + dIdsIBPC_dT - dIdsIBPCs_dT ; - - /* intrinsic drain node */ - ydc_dP[dNode] = - (dIddp_dVddp + dIddp_dVdse) + gds_ext ; - ydc_dP[dNodePrime] = dIddp_dVddp - dIddp_dVds + gds + dIsub_dVds + dIgidl_dVds - dIgd_dVd ; - /* ydc_dP[gNode] = 0.0; */ - ydc_dP[gNodePrime] = -dIddp_dVgse - dIddp_dVgs + gm_ext - + gm + dIsub_dVgs + dIgidl_dVgs - dIgd_dVg ; - ydc_dP[sNode] = dIddp_dVdse + dIddp_dVgse + dIddp_dVbse + dIddp_dVsubs + (-gds_ext -gm_ext -gmbs_ext); - ydc_dP[sNodePrime] = -( gds + dIsub_dVds + dIgidl_dVds ) - - ( gm + dIsub_dVgs + dIgidl_dVgs ) - - ( gmbs + dIsub_dVbs + dIgidl_dVbs ) - dIgd_dVs - + ( dIddp_dVds + dIddp_dVgs + dIddp_dVbs ) ; - ydc_dP[bNodePrime] = - dIddp_dVbse - dIddp_dVbs + gmbs_ext - + gmbs + dIsub_dVbs + dIgidl_dVbs - dIgd_dVb; - /* ydc_dP[bNode] = 0.0; */ - /* ydc_dP[dbNode] = 0.0 ; */ - /* ydc_dP[sbNode] = 0.0 ; */ - ydc_dP[subNode] = - dIddp_dVsubs ; - ydc_dP[tempNode] = - dIddp_dT - + gmT + dIsub_dT + dIgidl_dT - dIgd_dT ; - - /* gate node */ - /* ydc_g[dNode] = 0.0 ; */ - /* ydc_g[dNodePrime] = 0.0 ; */ - ydc_g[gNode] = dIggp_dVggp ; - ydc_g[gNodePrime] = - dIggp_dVggp ; - /* ydc_g[sNode] = 0.0 ; */ - /* ydc_g[sNodePrime] = 0.0 ; */ - /* ydc_g[bNodePrime] = 0.0 ; */ - /* ydc_g[bNode] = 0.0 ; */ - /* ydc_g[dbNode] = 0.0 ; */ - /* ydc_g[sbNode] = 0.0 ; */ - /* ydc_g[tempNode] = 0.0 ; */ - - /* intrinsic gate node */ - /* ydc_gP[dNode] = 0.0 ; */ - ydc_gP[dNodePrime] = dIgd_dVd + dIgs_dVd + dIgb_dVd ; - ydc_gP[gNode] = - dIggp_dVggp ; - ydc_gP[gNodePrime] = dIggp_dVggp + dIgd_dVg + dIgs_dVg + dIgb_dVg ; - /* ydc_gP[sNode] = 0.0 ; */ - ydc_gP[sNodePrime] = dIgd_dVs + dIgs_dVs + dIgb_dVs ; - ydc_gP[bNodePrime] = dIgd_dVb + dIgs_dVb + dIgb_dVb ; - /* ydc_gP[bNode] = 0.0 ; */ - /* ydc_gP[dbNode] = 0.0 ; */ - /* ydc_gP[sbNode] = 0.0 ; */ - ydc_gP[tempNode] = dIgd_dT + dIgs_dT + dIgb_dT ; - - /* source node */ - ydc_s[dNode] = dIssp_dVdse + dIsubLDs_dVddp - dIdsIBPC_dVddp + dIdsIBPCs_dVddp ; - ydc_s[dNodePrime] = dIsubLDs_dVds - dIdsIBPC_dVds + dIdsIBPCs_dVds - dIsubLDs_dVddp + dIdsIBPC_dVddp - dIdsIBPCs_dVddp ; - /* ydc_s[gNode] = 0.0 */ - ydc_s[gNodePrime] = dIssp_dVgse + dIsubLDs_dVgs - dIdsIBPC_dVgs + dIdsIBPCs_dVgs ; - ydc_s[sNode] = dIssp_dVssp - ( dIssp_dVgse + dIssp_dVdse + dIssp_dVbse ) - dIssp_dVsubs + Gbs ; - ydc_s[sNodePrime] = - dIssp_dVssp - dIsubLDs_dVds - dIsubLDs_dVgs - dIsubLDs_dVbs - (- dIdsIBPC_dVds - dIdsIBPC_dVgs - dIdsIBPC_dVbs ) - dIdsIBPCs_dVds - dIdsIBPCs_dVgs - dIdsIBPCs_dVbs ; - ydc_s[bNodePrime] = dIssp_dVbse + dIsubLDs_dVbs - dIdsIBPC_dVbs + dIdsIBPCs_dVbs ; - /* ydc_s[bNode] = 0.0 */ - /* ydc_s[dbNode] = 0.0 */ - ydc_s[sbNode] = - Gbs ; - ydc_s[subNode] = dIssp_dVsubs; - ydc_s[tempNode] = dIssp_dT - Gbst + dIsubLDs_dT - dIdsIBPC_dT + dIdsIBPCs_dT ; - - /* intrinsic source node */ - ydc_sP[dNode] = - dIssp_dVdse -gds_ext ; - ydc_sP[dNodePrime] = - gds + dIsubs_dVds + dIgisl_dVds - dIgs_dVd ; - /* ydc_sP[gNode] = 0.0 ; */ - ydc_sP[gNodePrime] = -dIssp_dVgse -gm_ext - - gm + dIsubs_dVgs + dIgisl_dVgs - dIgs_dVg ; - ydc_sP[sNode] = - dIssp_dVssp - ( - dIssp_dVdse - dIssp_dVgse - dIssp_dVbse ) + dIssp_dVsubs +(gds_ext + gm_ext + gmbs_ext); - ydc_sP[sNodePrime] = dIssp_dVssp - ( - gds + dIsubs_dVds + dIgisl_dVds ) - - ( - gm + dIsubs_dVgs + dIgisl_dVgs ) - - ( - gmbs + dIsubs_dVbs + dIgisl_dVbs ) - dIgs_dVs ; - ydc_sP[bNodePrime] = -dIssp_dVbse -gmbs_ext - - gmbs + dIsubs_dVbs + dIgisl_dVbs - dIgs_dVb ; - /* ydc_sP[bNode] = 0.0 ; */ - /* ydc_sP[dbNode] = 0.0 ; */ - /* ydc_sP[sbNode] = 0.0 ; */ - ydc_sP[subNode] = - dIssp_dVsubs; - ydc_sP[tempNode] = -dIssp_dT - - gmT + dIsubs_dT + dIgisl_dT - dIgs_dT; - - /* intrinsic bulk node */ - ydc_bP[dNode] = - dIsubLD_dVddp - dIsubLDs_dVddp ; - ydc_bP[dNodePrime] = - dIsub_dVds - dIsubs_dVds - dIsubLD_dVds - dIsubLDs_dVds - dIgidl_dVds - dIgb_dVd - dIgisl_dVds - ( - dIsubLD_dVddp - dIsubLDs_dVddp ) ; - /* ydc_bP[gNode] = 0.0 ; */ - ydc_bP[gNodePrime] = - dIsub_dVgs - dIsubs_dVgs - dIsubLD_dVgs - dIsubLDs_dVgs - dIgidl_dVgs - dIgb_dVg - dIgisl_dVgs ; - /* ydc_bP[sNode] = 0.0 ;*/ - ydc_bP[sNodePrime] = - ( - dIsub_dVds - dIsubs_dVds - dIsubLD_dVds - dIsubLDs_dVds - dIgidl_dVds - dIgisl_dVds ) - - ( - dIsub_dVgs - dIsubs_dVgs - dIsubLD_dVgs - dIsubLDs_dVgs - dIgidl_dVgs - dIgisl_dVgs ) - - ( - dIsub_dVbs - dIsubs_dVbs - dIsubLD_dVbs - dIsubLDs_dVbs - dIgidl_dVbs - dIgisl_dVbs ) - dIgb_dVs ; - ydc_bP[bNodePrime] = - dIsub_dVbs - dIsubs_dVbs - dIsubLD_dVbs - dIsubLDs_dVbs - dIgidl_dVbs - dIgb_dVb - dIgisl_dVbs + dIbpdb_dVbpdb + dIbpb_dVbpb + dIbpsb_dVbpsb ; - ydc_bP[bNode] = - dIbpb_dVbpb ; - ydc_bP[dbNode] = - dIbpdb_dVbpdb ; - ydc_bP[sbNode] = - dIbpsb_dVbpsb ; - ydc_bP[tempNode] = - dIsub_dT - dIsubs_dT - dIsubLD_dT - dIsubLDs_dT - dIgidl_dT - dIgb_dT - dIgisl_dT ; - - /* bulk node */ - /* ydc_b[dNode] = 0.0 ; */ - /* ydc_b[dNodePrime] = 0.0 ; */ - /* ydc_b[gNode] = 0.0 ; */ - /* ydc_b[gNodePrime] = 0.0 ; */ - /* ydc_b[sNode] = 0.0 ; */ - /* ydc_b[sNodePrime] = 0.0 ; */ - ydc_b[bNodePrime] = - dIbpb_dVbpb ; - ydc_b[bNode] = dIbpb_dVbpb ; - /* ydc_b[dbNode] = 0.0 ; */ - /* ydc_b[sbNode] = 0.0 ; */ - /* ydc_b[tempNode] = 0.0 ; */ - - /* drain bulk node */ - ydc_db[dNode] = - Gbd ; - /* ydc_db[dNodePrime] = 0.0 ; */ - /* ydc_db[gNode] = 0.0 ; */ - /* ydc_db[gNodePrime] = 0.0 ; */ - /* ydc_db[sNode] = 0.0 ; */ - /* ydc_db[sNodePrime] = 0.0 ; */ - ydc_db[bNodePrime] = - dIbpdb_dVbpdb ; - /* ydc_db[bNode] = 0.0 ; */ - ydc_db[dbNode] = Gbd + dIbpdb_dVbpdb ; - /* ydc_db[sbNode] = 0.0 ; */ - ydc_db[tempNode] = Gbdt ; - - /* source bulk node */ - /* ydc_sb[dNode] = 0.0 ; */ - /* ydc_sb[dNodePrime] = 0.0 ; */ - /* ydc_sb[gNode] = 0.0 ; */ - /* ydc_sb[gNodePrime] = 0.0 ; */ - ydc_sb[sNode] = - Gbs ; - /* ydc_sb[sNodePrime] = 0.0 ; */ - ydc_sb[bNodePrime] = - dIbpsb_dVbpsb ; - /* ydc_sb[bNode] = 0.0 ; */ - /* ydc_sb[dbNode] = 0.0 ; */ - ydc_sb[sbNode] = Gbs + dIbpsb_dVbpsb ; - ydc_sb[tempNode] = Gbst ; - - /* temp node */ - ydc_t[dNode] = - dP_dVdse ; - ydc_t[dNodePrime] = - dP_dVds ; - /* ydc_t[gNode] = 0.0 ; */ - ydc_t[gNodePrime] = - dP_dVgs - dP_dVgse ; - ydc_t[sNode] = - ( - dP_dVdse - dP_dVgse - dP_dVbse ) ; - ydc_t[sNodePrime] = - ( - dP_dVds - dP_dVgs - dP_dVbs ) ; - ydc_t[bNodePrime] = - dP_dVbs - dP_dVbse ; - /* ydc_t[bNode] = 0.0 ; */ - /* ydc_t[dbNode] = 0.0 ; */ - /* ydc_t[sbNode] = 0.0 ; */ - ydc_t[tempNode] = dIth_dT - dP_dT ; - - /* additional entries for flat nqs handling */ - if ( flg_nqs ) { - ydc_qi[dNodePrime] = dIqi_nqs_dVds ; - ydc_qi[gNodePrime] = dIqi_nqs_dVgs ; - ydc_qi[sNodePrime] = -(dIqi_nqs_dVds + dIqi_nqs_dVgs + dIqi_nqs_dVbs) ; - ydc_qi[bNodePrime] = dIqi_nqs_dVbs ; - ydc_qi[tempNode] = dIqi_nqs_dT ; - ydc_qi[qiNode] = dIqi_nqs_dQi_nqs ; - /* ydc_qi[qbNode]= 0.0 ; */ - ydc_qb[dNodePrime] = dIqb_nqs_dVds ; - ydc_qb[gNodePrime] = dIqb_nqs_dVgs ; - ydc_qb[sNodePrime] = -(dIqb_nqs_dVds + dIqb_nqs_dVgs + dIqb_nqs_dVbs) ; - ydc_qb[bNodePrime] = dIqb_nqs_dVbs ; - ydc_qb[tempNode] = dIqb_nqs_dT ; - /* ydc_qb[qiNode]= 0.0 ; */ - ydc_qb[qbNode] = dIqb_nqs_dQb_nqs ; - } - - - /* Preset vectors and matrix for dynamic part */ - - cq_d = cq_dP = cq_g = cq_gP = cq_s = cq_sP = cq_bP = cq_b = cq_db = cq_sb = cq_t = cq_qi = cq_qb = 0.0 ; - for (i = 0; i < XDIM ; i++) { - ydyn_d[i] = ydyn_dP[i] = ydyn_g[i] = ydyn_gP[i] = ydyn_s[i] = ydyn_sP[i] = ydyn_bP[i] = ydyn_b[i] - = ydyn_db[i] = ydyn_sb[i] = ydyn_t[i] = 0.0; - } - if (flg_nqs) { - for (i = 0; i < XDIM ; i++) { - ydyn_qi[i] = ydyn_qb[i] = 0.0; - } - } - - ag0 = ckt->CKTag[0]; - - if (ChargeComputationNeeded) { /* start handling of dynamic part */ - - if (!ByPass) { /* loading of state vector not necessary in case of Bypass */ - - /* intrinsic gate node (without fringing charges) */ - *(ckt->CKTstate0 + here->HSMHV2qg) = Qg + Qg_nqs + Qgext; - - /* intrinsic drain node */ - *(ckt->CKTstate0 + here->HSMHV2qd) = Qd + Qd_nqs ; - - /* intrinsic bulk node */ - *(ckt->CKTstate0 + here->HSMHV2qb) = Qb + Qb_nqs + Qbext; - - /* drain bulk node */ - *(ckt->CKTstate0 + here->HSMHV2qbd) = Qbd ; - - /* source bulk node */ - *(ckt->CKTstate0 + here->HSMHV2qbs) = Qbs ; - - /* temp node */ - *(ckt->CKTstate0 + here->HSMHV2qth) = Qth ; - - /* fringing charges */ - *(ckt->CKTstate0 + here->HSMHV2qfd) = Qfd ; - *(ckt->CKTstate0 + here->HSMHV2qfs) = Qfs ; - - /* external drain node */ - *(ckt->CKTstate0 + here->HSMHV2qdE) = Qdext; - - /* nqs charges Qi_nqs, Qb_nqs: already loaded above */ - /* if ( flg_nqs ) { */ - /* *(ckt->CKTstate0 + here->HSMHV2qi_nqs) = Qi_nqs; */ - /* *(ckt->CKTstate0 + here->HSMHV2qb_nqs) = Qb_nqs; */ - /* } */ - } - - /* ... assemble capacitance matrix */ - - /* ...... drain node */ - ydyn_d[dNode] = dQfd_dVdse + Cbd + dQdext_dVdse ; - /* ydyn_d[dNodePrime] = 0.0 ; */ - /* ydyn_d[gNode] = 0.0 ; */ - ydyn_d[gNodePrime] = dQfd_dVgse + dQdext_dVgse ; - ydyn_d[sNode] = - (dQfd_dVdse + dQfd_dVgse+ dQfd_dVbse) - ( dQdext_dVdse + dQdext_dVgse + dQdext_dVbse ) ; - /* ydyn_d[sNodePrime ] = 0.0 ; */ - ydyn_d[bNodePrime] = dQfd_dVbse + dQdext_dVbse; - /* ydyn_d[bNode ] = 0.0 ; */ - ydyn_d[dbNode] = - Cbd ; - /* ydyn_d[sbNode ] = 0.0 ; */ - ydyn_d[tempNode] = dQfd_dT - Cbdt + dQdext_dT ; - - /* ...... intrinsic drain node */ - /* ydyn_dP[dNode] = 0.0 ; */ - ydyn_dP[dNodePrime] = dQd_dVds ; - /* ydyn_dP[gNode] = 0.0 ; */ - ydyn_dP[gNodePrime] = dQd_dVgs ; - /* ydyn_dP[sNode] = 0.0 ; */ - ydyn_dP[sNodePrime] = - ( dQd_dVds + dQd_dVgs + dQd_dVbs ) ; - ydyn_dP[bNodePrime] = dQd_dVbs ; - /* ydyn_dP[bNode] = 0.0 ; */ - /* ydyn_dP[dbNode] = 0.0 ; */ - /* ydyn_dP[sbNode] = 0.0 ; */ - ydyn_dP[tempNode] = dQd_dT ; - - /* ...... gate node */ - /* (no entry) */ - - /* ...... intrinsic gate node */ - ydyn_gP[dNode] = -dQfd_dVdse - dQfs_dVdse + dQgext_dVdse ; - ydyn_gP[dNodePrime] = dQg_dVds ; - /* ydyn_gP[gNode] = 0.0 ; */ - ydyn_gP[gNodePrime] = dQg_dVgs -dQfd_dVgse - dQfs_dVgse + dQgext_dVgse ; - ydyn_gP[sNode] = dQfd_dVdse + dQfs_dVdse + dQfd_dVgse + dQfs_dVgse + dQfd_dVbse + dQfs_dVbse - - ( dQgext_dVdse + dQgext_dVgse + dQgext_dVbse ) ; - ydyn_gP[sNodePrime] = -( dQg_dVds + dQg_dVgs + dQg_dVbs ) ; - ydyn_gP[bNodePrime] = dQg_dVbs -dQfd_dVbse - dQfs_dVbse + dQgext_dVbse ; - /* ydyn_gP[bNode] = 0.0 ; */ - /* ydyn_gP[dbNode] = 0.0 ; */ - /* ydyn_gP[sbNode] = 0.0 ; */ - ydyn_gP[tempNode] = dQg_dT - dQfd_dT - dQfs_dT + dQgext_dT ; - - /* ...... source node */ - ydyn_s[dNode] = dQfs_dVdse + dQsext_dVdse ; - /* ydyn_d[dNodePrime ] = 0.0 ; */ - /* ydyn_d[gNode ] = 0.0 ; */ - ydyn_s[gNodePrime] = dQfs_dVgse + dQsext_dVgse ; - ydyn_s[sNode] = Cbs - (dQfs_dVdse + dQfs_dVgse+ dQfs_dVbse) - ( dQsext_dVdse + dQsext_dVgse + dQsext_dVbse ) ; - /* ydyn_d[sNodePrime ] = 0.0 ; */ - ydyn_s[bNodePrime] = dQfs_dVbse + dQsext_dVbse ; - /* ydyn_d[bNode ] = 0.0 ; */ - /* ydyn_d[dbNode ] = 0.0 ; */ - ydyn_s[sbNode] = - Cbs ; - ydyn_s[tempNode] = dQfs_dT - Cbst + dQsext_dT ; - - /* ...... intrinsic source node */ - /* ydyn_sP[dNode] = 0.0 ; */ - ydyn_sP[dNodePrime] = dQs_dVds ; - /* ydyn_sP[gNode] = 0.0 ; */ - ydyn_sP[gNodePrime] = dQs_dVgs ; - /* ydyn_sP[sNode] = 0.0 ; */ - ydyn_sP[sNodePrime] = - ( dQs_dVds + dQs_dVgs + dQs_dVbs ); - ydyn_sP[bNodePrime] = dQs_dVbs ; - /* ydyn_sP[bNode] = 0.0 ; */ - /* ydyn_sP[dbNode] = 0.0 ; */ - /* ydyn_sP[sbNode] = 0.0 ; */ - ydyn_sP[tempNode] = dQs_dT ; - - /* ...... intrinsic bulk node */ - ydyn_bP[dNode] = dQbext_dVdse ; - ydyn_bP[dNodePrime] = dQb_dVds ; - /* ydyn_bP[gNode] = 0.0 ; */ - ydyn_bP[gNodePrime] = dQb_dVgs + dQbext_dVgse ; - ydyn_bP[sNode] = - ( dQbext_dVdse + dQbext_dVgse + dQbext_dVbse ) ; - ydyn_bP[sNodePrime] = - ( dQb_dVds + dQb_dVgs + dQb_dVbs ); - ydyn_bP[bNodePrime] = dQb_dVbs + dQbext_dVbse ; - /* ydyn_bP[bNode] = 0.0 ; */ - /* ydyn_bP[dbNode] = 0.0 ; */ - /* ydyn_bP[sbNode] = 0.0 ; */ - ydyn_bP[tempNode] = dQb_dT + dQbext_dT ; - - /* ...... bulk node */ - /* (no entry) */ - - /* ...... drain bulk node */ - ydyn_db[dNode] = - Cbd ; - /* ydyn_db[dNodePrime] = 0.0 ; */ - /* ydyn_db[gNode] = 0.0 ; */ - /* ydyn_db[gNodePrime] = 0.0 ; */ - /* ydyn_db[sNode] = 0.0 ; */ - /* ydyn_db[sNodePrime] = 0.0 ; */ - /* ydyn_db[bNodePrime] = 0.0 ; */ - /* ydyn_db[bNode] = 0.0 ; */ - ydyn_db[dbNode] = Cbd ; - /* ydyn_db[sbNode] = 0.0 ; */ - ydyn_db[tempNode] = Cbdt ; - - /* ...... source bulk node */ - /* ydyn_sb[dNode] = 0.0 ; */ - /* ydyn_sb[dNodePrime] = 0.0 ; */ - /* ydyn_sb[gNode] = 0.0 ; */ - /* ydyn_sb[gNodePrime] = 0.0 ; */ - ydyn_sb[sNode] = - Cbs ; - /* ydyn_sb[sNodePrime] = 0.0 ; */ - /* ydyn_sb[bNodePrime] = 0.0 ; */ - /* ydyn_sb[bNode] = 0.0 ; */ - /* ydyn_sb[dbNode] = 0.0 ; */ - ydyn_sb[sbNode] = Cbs ; - ydyn_sb[tempNode] = Cbst ; - - /* ...... temp node */ - /* ydyn_t[dNode] = 0.0 ; */ - /* ydyn_t[dNodePrime] = 0.0 ; */ - /* ydyn_t[gNode] = 0.0 ; */ - /* ydyn_t[gNodePrime] = 0.0 ; */ - /* ydyn_t[sNode] = 0.0 ; */ - /* ydyn_t[sNodePrime] = 0.0 ; */ - /* ydyn_t[bNodePrime] = 0.0 ; */ - /* ydyn_t[bNode] = 0.0 ; */ - /* ydyn_t[dbNode] = 0.0 ; */ - /* ydyn_t[sbNode] = 0.0 ; */ - ydyn_t[tempNode] = Cth ; - - /* additional entries for flat nqs handling */ - if (flg_nqs) { - /* ...... intrinsic drain node */ - /* ydyn_dP[dNode] += 0.0 ; */ - ydyn_dP[dNodePrime] += dQd_nqs_dVds ; - /* ydyn_dP[gNode] += 0.0 ; */ - ydyn_dP[gNodePrime] += dQd_nqs_dVgs ; - /* ydyn_dP[sNode] += 0.0 ; */ - ydyn_dP[sNodePrime] += - ( dQd_nqs_dVds + dQd_nqs_dVgs + dQd_nqs_dVbs ) ; - ydyn_dP[bNodePrime] += dQd_nqs_dVbs ; - /* ydyn_dP[bNode] += 0.0 ; */ - /* ydyn_dP[dbNode] += 0.0 ; */ - /* ydyn_dP[sbNode] += 0.0 ; */ - ydyn_dP[tempNode] += dQd_nqs_dT ; - ydyn_dP[qiNode] = dQd_nqs_dQi_nqs ; - - /* ...... intrinsic gate node */ - /* ydyn_gP[dNode] += 0.0 ; */ - /* ydyn_gP[dNodePrime] += 0.0 ; */ - /* ydyn_gP[gNode] += 0.0 ; */ - /* ydyn_gP[gNodePrime] += 0.0 ; */ - /* ydyn_gP[sNode] += 0.0 ; */ - /* ydyn_gP[sNodePrime] += 0.0 ; */ - /* ydyn_gP[bNodePrime] += 0.0 ; */ - /* ydyn_gP[bNode] += 0.0 ; */ - /* ydyn_gP[dbNode] += 0.0 ; */ - /* ydyn_gP[sbNode] += 0.0 ; */ - /* ydyn_gP[tempNode] += 0.0 ; */ - ydyn_gP[qiNode] = dQg_nqs_dQi_nqs ; - ydyn_gP[qbNode] = dQg_nqs_dQb_nqs ; - - /* ...... intrinsic source node */ - /* ydyn_sP[dNode] += 0.0 ; */ - ydyn_sP[dNodePrime] += dQs_nqs_dVds ; - /* ydyn_sP[gNode] += 0.0 ; */ - ydyn_sP[gNodePrime] += dQs_nqs_dVgs ; - /* ydyn_sP[sNode] += 0.0 ; */ - ydyn_sP[sNodePrime] += - ( dQs_nqs_dVds + dQs_nqs_dVgs + dQs_nqs_dVbs ); - ydyn_sP[bNodePrime] += dQs_nqs_dVbs ; - /* ydyn_sP[bNode] += 0.0 ; */ - /* ydyn_sP[dbNode] += 0.0 ; */ - /* ydyn_sP[sbNode] += 0.0 ; */ - ydyn_sP[tempNode] += dQs_nqs_dT ; - ydyn_sP[qiNode] = dQs_nqs_dQi_nqs ; - - /* ...... intrinsic bulk node */ - /* ydyn_bP[dNode] += 0.0 ; */ - /* ydyn_bP[dNodePrime] += 0.0 ; */ - /* ydyn_bP[gNode] += 0.0 ; */ - /* ydyn_bP[gNodePrime] += 0.0 ; */ - /* ydyn_bP[sNode] += 0.0 ; */ - /* ydyn_bP[sNodePrime] += 0.0 ; */ - /* ydyn_bP[bNodePrime] += 0.0 ; */ - /* ydyn_bP[bNode] += 0.0 ; */ - /* ydyn_bP[dbNode] += 0.0 ; */ - /* ydyn_bP[sbNode] += 0.0 ; */ - /* ydyn_bP[tempNode] += 0.0 ; */ - ydyn_bP[qbNode] = 1.0 ; - - /* ...... qi node */ - /* ydyn_qi[dNodePrime] = 0.0 ; */ - /* ydyn_qi[gNodePrime] = 0.0 ; */ - /* ydyn_qi[sNodePrime] = 0.0 ; */ - /* ydyn_qi[bNodePrime] = 0.0 ; */ - /* ydyn_qi[tempNode] = 0.0 ; */ - ydyn_qi[qiNode] = 1.0 ; - /* ydyn_qi[qbNode] = 0.0 ; */ - - /* ...... qb node */ - /* ydyn_qb[dNodePrime] = 0.0 ; */ - /* ydyn_qb[gNodePrime] = 0.0 ; */ - /* ydyn_qb[sNodePrime] = 0.0 ; */ - /* ydyn_qb[bNodePrime] = 0.0 ; */ - /* ydyn_qb[tempNode] = 0.0 ; */ - /* ydyn_qb[qiNode] = 0.0 ; */ - ydyn_qb[qbNode] = 1.0 ; - } - - if (!ByPass) { /* integrate etc. only necessary if not in Bypass mode! */ - - /* store small signal parameters */ - if (ckt->CKTmode & MODEINITSMSIG) { - /* printf("HSMHV2_load: (small signal) ByPass=%d\n",ByPass); */ -/* printf("HSMHV2_load: ydc_dP=%e %e %e %e %e %e %e %e\n", - ydc_dP[0],ydc_dP[1],ydc_dP[2],ydc_dP[3],ydc_dP[4],ydc_dP[5],ydc_dP[6],ydc_dP[7]); - printf("HSMHV2_load: ych_dP=%e %e %e %e %e %e %e %e\n", - ydyn_dP[0],ydyn_dP[1],ydyn_dP[2],ydyn_dP[3],ydyn_dP[4],ydyn_dP[5],ydyn_dP[6],ydyn_dP[7]); -*/ - /* dc matrix into structure 0724*/ - for (i = 0; i < XDIM; i++) { - here->HSMHV2_ydc_d[i] = ydc_d[i]; - here->HSMHV2_ydc_dP[i] = ydc_dP[i]; - here->HSMHV2_ydc_g[i] = ydc_g[i]; - here->HSMHV2_ydc_gP[i] = ydc_gP[i]; - here->HSMHV2_ydc_s[i] = ydc_s[i]; - here->HSMHV2_ydc_sP[i] = ydc_sP[i]; - here->HSMHV2_ydc_bP[i] = ydc_bP[i]; - here->HSMHV2_ydc_b[i] = ydc_b[i]; - here->HSMHV2_ydc_db[i] = ydc_db[i]; - here->HSMHV2_ydc_sb[i] = ydc_sb[i]; - here->HSMHV2_ydc_t[i] = ydc_t[i]; - } - /* capacitance matrix into structure 0724*/ - for (i = 0; i < XDIM; i++) { - here->HSMHV2_ydyn_d[i] = ydyn_d[i]; - here->HSMHV2_ydyn_dP[i] = ydyn_dP[i]; - here->HSMHV2_ydyn_g[i] = ydyn_g[i]; - here->HSMHV2_ydyn_gP[i] = ydyn_gP[i]; - here->HSMHV2_ydyn_s[i] = ydyn_s[i]; - here->HSMHV2_ydyn_sP[i] = ydyn_sP[i]; - here->HSMHV2_ydyn_bP[i] = ydyn_bP[i]; - here->HSMHV2_ydyn_b[i] = ydyn_b[i]; - here->HSMHV2_ydyn_db[i] = ydyn_db[i]; - here->HSMHV2_ydyn_sb[i] = ydyn_sb[i]; - here->HSMHV2_ydyn_t[i] = ydyn_t[i]; - } - if (flg_nqs) { - for (i = 0; i < XDIM; i++) { - here->HSMHV2_ydc_qi[i] = ydc_qi[i]; - here->HSMHV2_ydc_qb[i] = ydc_qb[i]; - here->HSMHV2_ydyn_qi[i] = ydyn_qi[i]; - here->HSMHV2_ydyn_qb[i] = ydyn_qb[i]; - } - } - goto line1000; /* that's all for small signal analyses */ - } - - /* Continue handling of dynamic part: */ - /* ... calculate time derivatives of node charges */ - - if (ckt->CKTmode & MODEINITTRAN) { - /* at the very first iteration of the first timepoint: - copy charges into previous state -> the integrator may use them ... */ - *(ckt->CKTstate1 + here->HSMHV2qb) = *(ckt->CKTstate0 + here->HSMHV2qb); - *(ckt->CKTstate1 + here->HSMHV2qg) = *(ckt->CKTstate0 + here->HSMHV2qg); - *(ckt->CKTstate1 + here->HSMHV2qd) = *(ckt->CKTstate0 + here->HSMHV2qd); - *(ckt->CKTstate1 + here->HSMHV2qth) = *(ckt->CKTstate0 + here->HSMHV2qth); - *(ckt->CKTstate1 + here->HSMHV2qbs) = *(ckt->CKTstate0 + here->HSMHV2qbs); - *(ckt->CKTstate1 + here->HSMHV2qbd) = *(ckt->CKTstate0 + here->HSMHV2qbd); - - *(ckt->CKTstate1 + here->HSMHV2qfd) = *(ckt->CKTstate0 + here->HSMHV2qfd); - *(ckt->CKTstate1 + here->HSMHV2qfs) = *(ckt->CKTstate0 + here->HSMHV2qfs); - - *(ckt->CKTstate1 + here->HSMHV2qdE) = *(ckt->CKTstate0 + here->HSMHV2qdE); - - if (flg_nqs) { - *(ckt->CKTstate1 + here->HSMHV2qi_nqs) = *(ckt->CKTstate0 + here->HSMHV2qi_nqs); - *(ckt->CKTstate1 + here->HSMHV2qb_nqs) = *(ckt->CKTstate0 + here->HSMHV2qb_nqs); - } - } - - return_if_error (NIintegrate(ckt, &geq, &ceq, 0.0, here->HSMHV2qb)); - return_if_error (NIintegrate(ckt, &geq, &ceq, 0.0, here->HSMHV2qg)); - return_if_error (NIintegrate(ckt, &geq, &ceq, 0.0, here->HSMHV2qd)); - return_if_error (NIintegrate(ckt, &geq, &ceq, 0.0, here->HSMHV2qbs)); - return_if_error (NIintegrate(ckt, &geq, &ceq, 0.0, here->HSMHV2qbd)); - - return_if_error (NIintegrate(ckt, &geq, &ceq, 0.0, here->HSMHV2qth)); - - return_if_error (NIintegrate(ckt, &geq, &ceq, 0.0, here->HSMHV2qfd)); - return_if_error (NIintegrate(ckt, &geq, &ceq, 0.0, here->HSMHV2qfs)); - - return_if_error (NIintegrate(ckt, &geq, &ceq, 0.0, here->HSMHV2qdE)); - - if (flg_nqs) { - return_if_error (NIintegrate(ckt, &geq, &ceq, 0.0, here->HSMHV2qi_nqs)); - return_if_error (NIintegrate(ckt, &geq, &ceq, 0.0, here->HSMHV2qb_nqs)); - } - - if (ckt->CKTmode & MODEINITTRAN) { - /* at the very first iteration of the first timepoint: - copy currents into previous state -> the integrator may use them ... */ - *(ckt->CKTstate1 + here->HSMHV2cqb) = *(ckt->CKTstate0 + here->HSMHV2cqb); - *(ckt->CKTstate1 + here->HSMHV2cqg) = *(ckt->CKTstate0 + here->HSMHV2cqg); - *(ckt->CKTstate1 + here->HSMHV2cqd) = *(ckt->CKTstate0 + here->HSMHV2cqd); - - *(ckt->CKTstate1 + here->HSMHV2cqth) = *(ckt->CKTstate0 + here->HSMHV2cqth); - - *(ckt->CKTstate1 + here->HSMHV2cqbs) = *(ckt->CKTstate0 + here->HSMHV2cqbs); - *(ckt->CKTstate1 + here->HSMHV2cqbd) = *(ckt->CKTstate0 + here->HSMHV2cqbd); - *(ckt->CKTstate1 + here->HSMHV2cqfd) = *(ckt->CKTstate0 + here->HSMHV2cqfd); - *(ckt->CKTstate1 + here->HSMHV2cqfs) = *(ckt->CKTstate0 + here->HSMHV2cqfs); - - *(ckt->CKTstate1 + here->HSMHV2cqdE) = *(ckt->CKTstate0 + here->HSMHV2cqdE); - if (flg_nqs) { - *(ckt->CKTstate1 + here->HSMHV2dotqi_nqs) = *(ckt->CKTstate0 + here->HSMHV2dotqi_nqs); - *(ckt->CKTstate1 + here->HSMHV2dotqb_nqs) = *(ckt->CKTstate0 + here->HSMHV2dotqb_nqs); - } - } - } - - - /* ... finally gather displacement currents from data structures */ - - cq_dP = *(ckt->CKTstate0 + here->HSMHV2cqd); - cq_gP = *(ckt->CKTstate0 + here->HSMHV2cqg); - cq_bP = *(ckt->CKTstate0 + here->HSMHV2cqb); - cq_sP = - *(ckt->CKTstate0 + here->HSMHV2cqg) - - *(ckt->CKTstate0 + here->HSMHV2cqb) - - *(ckt->CKTstate0 + here->HSMHV2cqd); - cq_dE = *(ckt->CKTstate0 + here->HSMHV2cqdE); - cq_db = *(ckt->CKTstate0 + here->HSMHV2cqbd); - cq_sb = *(ckt->CKTstate0 + here->HSMHV2cqbs); - cq_g = 0.0 ; - cq_b = 0.0 ; - - /* displacement currents at outer drain/source node (fringing part only!) */ - cq_d = *(ckt->CKTstate0 + here->HSMHV2cqfd); - cq_s = *(ckt->CKTstate0 + here->HSMHV2cqfs); - - cq_t = *(ckt->CKTstate0 + here->HSMHV2cqth); - - /* displacement currents due to nqs */ - if (flg_nqs) { - cq_qi = *(ckt->CKTstate0 + here->HSMHV2dotqi_nqs); - cq_qb = *(ckt->CKTstate0 + here->HSMHV2dotqb_nqs); - } else { - cq_qi = cq_qb = 0.0 ; - } - - /* ... and, if necessary: Extrapolate displacement currents onto x-values */ - - if (delvdbd || deldeltemp) { - cq_db += ag0*(Cbd*delvdbd + Cbdt*deldeltemp) ; - } - if (delvsbs || deldeltemp) { - cq_sb += ag0*(Cbs*delvsbs + Cbst*deldeltemp) ; - } - if (delvgs || delvds || delvbs || deldeltemp) { - cq_gP += ag0*(dQg_dVgs*delvgs + dQg_dVds*delvds + dQg_dVbs*delvbs + dQg_dT*deldeltemp) ; - cq_dP += ag0*(dQd_dVgs*delvgs + dQd_dVds*delvds + dQd_dVbs*delvbs + dQd_dT*deldeltemp) ; - cq_sP += ag0*(dQs_dVgs*delvgs + dQs_dVds*delvds + dQs_dVbs*delvbs + dQs_dT*deldeltemp) ; - cq_bP = - ( cq_gP + cq_dP + cq_sP ); - } - if (deldeltemp) { - cq_t += ag0*Cth *deldeltemp ; - cq_d += ag0*dQfd_dT*deldeltemp ; - cq_s += ag0*dQfs_dT*deldeltemp ; - - cq_gE += ag0*dQgext_dT*deldeltemp ; - cq_dE += ag0*dQdext_dT*deldeltemp ; - cq_bE += ag0*dQbext_dT*deldeltemp ; - cq_sE = - ( cq_gE + cq_dE + cq_bE ); - } - if (delvgse || delvdse || delvbse) { - cq_d += ag0*(dQfd_dVgse*delvgse + dQfd_dVdse*delvdse + dQfd_dVbse*delvbse) ; - cq_s += ag0*(dQfs_dVgse*delvgse + dQfs_dVdse*delvdse + dQfs_dVbse*delvbse) ; - - cq_gE += ag0*(dQgext_dVgse*delvgse + dQgext_dVdse*delvdse + dQgext_dVbse*delvbse) ; - cq_dE += ag0*(dQdext_dVgse*delvgse + dQdext_dVdse*delvdse + dQdext_dVbse*delvbse) ; - cq_bE += ag0*(dQbext_dVgse*delvgse + dQbext_dVdse*delvdse + dQbext_dVbse*delvbse) ; - cq_sE = - ( cq_gE + cq_dE + cq_bE ); - } - - if (flg_nqs) { - if (delvgs || delvds || delvbs || deldeltemp) { - cq_dP += ag0*(dQd_nqs_dVgs*delvgs + dQd_nqs_dVds*delvds + dQd_nqs_dVbs*delvbs + dQd_nqs_dT*deldeltemp) ; - cq_sP += ag0*(dQs_nqs_dVgs*delvgs + dQs_nqs_dVds*delvds + dQs_nqs_dVbs*delvbs + dQs_nqs_dT*deldeltemp) ; - cq_bP = - ( cq_gP + cq_dP + cq_sP ); /* should be superfluous ? */ - } - if (delQi_nqs) { - cq_dP += ag0*dQd_nqs_dQi_nqs*delQi_nqs ; - cq_gP += ag0*dQg_nqs_dQi_nqs*delQi_nqs ; - cq_sP += ag0*dQs_nqs_dQi_nqs*delQi_nqs ; - cq_qi += ag0* 1.0 *delQi_nqs ; - } - if (delQb_nqs) { - cq_gP += ag0*dQg_nqs_dQb_nqs*delQb_nqs ; - cq_bP += ag0* 1.0 *delQb_nqs ; - cq_qb += ag0* 1.0 *delQb_nqs ; - } - } - } /* End of handling dynamic part */ - - - /* Assemble total node currents (type-handling shifted to stamping) */ - - cur_d = i_d + cq_d - cq_db + cq_dE ; - cur_dP = i_dP + cq_dP ; - cur_g = i_g + cq_g ; - cur_gP = i_gP + cq_gP - cq_d - cq_s + cq_gE ; - cur_s = i_s + cq_s - cq_sb + cq_sE ; - cur_sP = i_sP + cq_sP; - cur_bP = i_bP + cq_bP + cq_bE ; - cur_b = i_b + cq_b; - cur_db = i_db + cq_db; - cur_sb = i_sb + cq_sb; - cur_t = i_t + cq_t; - cur_qi = i_qi + cq_qi; - cur_qb = i_qb + cq_qb; - - - /* Now we can start stamping ... */ - /* ... right hand side: subtract total node currents */ - - *(ckt->CKTrhs + here->HSMHV2dNode) -= model->HSMHV2_type * cur_d; - *(ckt->CKTrhs + here->HSMHV2dNodePrime) -= model->HSMHV2_type * cur_dP; - *(ckt->CKTrhs + here->HSMHV2gNode) -= model->HSMHV2_type * cur_g; - *(ckt->CKTrhs + here->HSMHV2gNodePrime) -= model->HSMHV2_type * cur_gP; - *(ckt->CKTrhs + here->HSMHV2sNode) -= model->HSMHV2_type * cur_s; - *(ckt->CKTrhs + here->HSMHV2sNodePrime) -= model->HSMHV2_type * cur_sP; - *(ckt->CKTrhs + here->HSMHV2bNodePrime) -= model->HSMHV2_type * cur_bP; - *(ckt->CKTrhs + here->HSMHV2bNode) -= model->HSMHV2_type * cur_b; - *(ckt->CKTrhs + here->HSMHV2dbNode) -= model->HSMHV2_type * cur_db; - *(ckt->CKTrhs + here->HSMHV2sbNode) -= model->HSMHV2_type * cur_sb; - if( here->HSMHV2_coselfheat > 0) { - *(ckt->CKTrhs + here->HSMHV2tempNode) -= cur_t; /* temp node independent of model type! */ - } - if (flg_nqs) { - *(ckt->CKTrhs + here->HSMHV2qiNode) -= cur_qi; - *(ckt->CKTrhs + here->HSMHV2qbNode) -= cur_qb; - } - - - /* ... finally stamp matrix */ - - /*drain*/ - *(here->HSMHV2DdPtr) += ydc_d[dNode] + ag0*ydyn_d[dNode]; - *(here->HSMHV2DdpPtr) += ydc_d[dNodePrime] + ag0*ydyn_d[dNodePrime]; - *(here->HSMHV2DgpPtr) += ydc_d[gNodePrime] + ag0*ydyn_d[gNodePrime]; - *(here->HSMHV2DsPtr) += ydc_d[sNode] + ag0*ydyn_d[sNode]; - *(here->HSMHV2DspPtr) += ydc_d[sNodePrime] + ag0*ydyn_d[sNodePrime]; - *(here->HSMHV2DbpPtr) += ydc_d[bNodePrime] + ag0*ydyn_d[bNodePrime]; - *(here->HSMHV2DdbPtr) += ydc_d[dbNode] + ag0*ydyn_d[dbNode]; - if (flg_subNode > 0) { - *(here->HSMHV2DsubPtr) += ydc_d[subNode]; - } - if( here->HSMHV2_coselfheat > 0) { - /* temp entries in matrix dependent on model type */ - *(here->HSMHV2DtempPtr) += model->HSMHV2_type * (ydc_d[tempNode] + ag0*ydyn_d[tempNode]); - } - - /*drain prime*/ - *(here->HSMHV2DPdPtr) += ydc_dP[dNode] + ag0*ydyn_dP[dNode]; - *(here->HSMHV2DPdpPtr) += ydc_dP[dNodePrime] + ag0*ydyn_dP[dNodePrime]; - *(here->HSMHV2DPgpPtr) += ydc_dP[gNodePrime] + ag0*ydyn_dP[gNodePrime]; - *(here->HSMHV2DPsPtr) += ydc_dP[sNode] + ag0*ydyn_dP[sNode]; - *(here->HSMHV2DPspPtr) += ydc_dP[sNodePrime] + ag0*ydyn_dP[sNodePrime]; - *(here->HSMHV2DPbpPtr) += ydc_dP[bNodePrime] + ag0*ydyn_dP[bNodePrime]; - if (flg_subNode > 0) { - *(here->HSMHV2DPsubPtr) += ydc_dP[subNode]; - } - if( here->HSMHV2_coselfheat > 0) { - /* temp entries in matrix dependent on model type */ - *(here->HSMHV2DPtempPtr) += model->HSMHV2_type * (ydc_dP[tempNode] + ag0*ydyn_dP[tempNode]); - } - if (flg_nqs) { - *(here->HSMHV2DPqiPtr) += model->HSMHV2_type * (ydc_dP[qiNode] + ag0*ydyn_dP[qiNode]); - } - - /*gate*/ - *(here->HSMHV2GgPtr) += ydc_g[gNode] + ag0*ydyn_g[gNode]; - *(here->HSMHV2GgpPtr) += ydc_g[gNodePrime] + ag0*ydyn_g[gNodePrime]; - - /*gate prime*/ - *(here->HSMHV2GPdPtr) += ydc_gP[dNode] + ag0*ydyn_gP[dNode]; - *(here->HSMHV2GPdpPtr) += ydc_gP[dNodePrime] + ag0*ydyn_gP[dNodePrime]; - *(here->HSMHV2GPgPtr) += ydc_gP[gNode] + ag0*ydyn_gP[gNode]; - *(here->HSMHV2GPgpPtr) += ydc_gP[gNodePrime] + ag0*ydyn_gP[gNodePrime]; - *(here->HSMHV2GPsPtr) += ydc_gP[sNode] + ag0*ydyn_gP[sNode]; - *(here->HSMHV2GPspPtr) += ydc_gP[sNodePrime] + ag0*ydyn_gP[sNodePrime]; - *(here->HSMHV2GPbpPtr) += ydc_gP[bNodePrime] + ag0*ydyn_gP[bNodePrime]; - if( here->HSMHV2_coselfheat > 0) { - /* temp entries in matrix dependent on model type */ - *(here->HSMHV2GPtempPtr) += model->HSMHV2_type * (ydc_gP[tempNode] + ag0*ydyn_gP[tempNode]); - } - if (flg_nqs) { - *(here->HSMHV2GPqiPtr) += model->HSMHV2_type * (ydc_gP[qiNode] + ag0*ydyn_gP[qiNode]); - *(here->HSMHV2GPqbPtr) += model->HSMHV2_type * (ydc_gP[qbNode] + ag0*ydyn_gP[qbNode]); - } - - /*source*/ - *(here->HSMHV2SdPtr) += ydc_s[dNode] + ag0*ydyn_s[dNode]; - *(here->HSMHV2SsPtr) += ydc_s[sNode] + ag0*ydyn_s[sNode]; - *(here->HSMHV2SdpPtr) += ydc_s[dNodePrime] + ag0*ydyn_s[dNodePrime]; - *(here->HSMHV2SgpPtr) += ydc_s[gNodePrime] + ag0*ydyn_s[gNodePrime]; - *(here->HSMHV2SspPtr) += ydc_s[sNodePrime] + ag0*ydyn_s[sNodePrime]; - *(here->HSMHV2SbpPtr) += ydc_s[bNodePrime] + ag0*ydyn_s[bNodePrime]; - *(here->HSMHV2SsbPtr) += ydc_s[sbNode] + ag0*ydyn_s[sbNode]; - if (flg_subNode > 0) { - *(here->HSMHV2SsubPtr) += ydc_s[subNode]; - } - if( here->HSMHV2_coselfheat > 0) { - /* temp entries in matrix dependent on model type */ - *(here->HSMHV2StempPtr) += model->HSMHV2_type * (ydc_s[tempNode]+ ag0*ydyn_s[tempNode]); - } - - /*source prime*/ - *(here->HSMHV2SPdPtr) += ydc_sP[dNode] + ag0*ydyn_sP[dNode]; - *(here->HSMHV2SPdpPtr) += ydc_sP[dNodePrime] + ag0*ydyn_sP[dNodePrime]; - *(here->HSMHV2SPgpPtr) += ydc_sP[gNodePrime] + ag0*ydyn_sP[gNodePrime]; - *(here->HSMHV2SPsPtr) += ydc_sP[sNode] + ag0*ydyn_sP[sNode]; - *(here->HSMHV2SPspPtr) += ydc_sP[sNodePrime] + ag0*ydyn_sP[sNodePrime]; - *(here->HSMHV2SPbpPtr) += ydc_sP[bNodePrime] + ag0*ydyn_sP[bNodePrime]; - if (flg_subNode > 0) { - *(here->HSMHV2SPsubPtr) += ydc_sP[subNode]; - } - if( here->HSMHV2_coselfheat > 0) { - /* temp entries in matrix dependent on model type */ - *(here->HSMHV2SPtempPtr) += model->HSMHV2_type * (ydc_sP[tempNode] + ag0*ydyn_sP[tempNode]); - } - if (flg_nqs) { - *(here->HSMHV2SPqiPtr) += model->HSMHV2_type * (ydc_sP[qiNode] + ag0*ydyn_sP[qiNode]); - } - - /*bulk prime*/ - *(here->HSMHV2BPdPtr) += ydc_bP[dNode] + ag0*ydyn_bP[dNode]; - *(here->HSMHV2BPdpPtr) += ydc_bP[dNodePrime] + ag0*ydyn_bP[dNodePrime]; - *(here->HSMHV2BPgpPtr) += ydc_bP[gNodePrime] + ag0*ydyn_bP[gNodePrime]; - *(here->HSMHV2BPspPtr) += ydc_bP[sNodePrime] + ag0*ydyn_bP[sNodePrime]; - *(here->HSMHV2BPsPtr) += ydc_bP[sNode] + ag0*ydyn_bP[sNode]; - *(here->HSMHV2BPbpPtr) += ydc_bP[bNodePrime] + ag0*ydyn_bP[bNodePrime]; - *(here->HSMHV2BPbPtr) += ydc_bP[bNode] + ag0*ydyn_bP[bNode]; - *(here->HSMHV2BPdbPtr) += ydc_bP[dbNode] + ag0*ydyn_bP[dbNode]; - *(here->HSMHV2BPsbPtr) += ydc_bP[sbNode] + ag0*ydyn_bP[sbNode]; - if( here->HSMHV2_coselfheat > 0) { - /* temp entries in matrix dependent on model type */ - *(here->HSMHV2BPtempPtr) += model->HSMHV2_type * (ydc_bP[tempNode] + ag0*ydyn_bP[tempNode]); - } - if (flg_nqs) { - *(here->HSMHV2BPqbPtr) += model->HSMHV2_type * (ydc_bP[qbNode] + ag0*ydyn_bP[qbNode]); - } - - /*bulk*/ - *(here->HSMHV2BbpPtr) += ydc_b[bNodePrime] + ag0*ydyn_b[bNodePrime]; - *(here->HSMHV2BbPtr) += ydc_b[bNode] + ag0*ydyn_b[bNode]; - - /*drain bulk*/ - *(here->HSMHV2DBdPtr) += ydc_db[dNode] + ag0*ydyn_db[dNode]; - *(here->HSMHV2DBbpPtr) += ydc_db[bNodePrime] + ag0*ydyn_db[bNodePrime]; - *(here->HSMHV2DBdbPtr) += ydc_db[dbNode] + ag0*ydyn_db[dbNode]; - if( here->HSMHV2_coselfheat > 0) { - /* temp entries in matrix dependent on model type */ - *(here->HSMHV2DBtempPtr) += model->HSMHV2_type * (ydc_db[tempNode] + ag0*ydyn_db[tempNode]); - } - - /*source bulk*/ - *(here->HSMHV2SBsPtr) += ydc_sb[sNode] + ag0*ydyn_sb[sNode]; - *(here->HSMHV2SBbpPtr) += ydc_sb[bNodePrime] + ag0*ydyn_sb[bNodePrime]; - *(here->HSMHV2SBsbPtr) += ydc_sb[sbNode] + ag0*ydyn_sb[sbNode]; - if( here->HSMHV2_coselfheat > 0) { - /* temp entries in matrix dependent on model type */ - *(here->HSMHV2SBtempPtr) += model->HSMHV2_type * (ydc_sb[tempNode] + ag0*ydyn_sb[tempNode]); - } - - /*temp*/ - if( here->HSMHV2_coselfheat > 0) { - /* temp entries in matrix dependent on model type */ - *(here->HSMHV2TempdPtr) += model->HSMHV2_type * (ydc_t[dNode] + ag0*ydyn_t[dNode] ); - *(here->HSMHV2TempdpPtr) += model->HSMHV2_type * (ydc_t[dNodePrime] + ag0*ydyn_t[dNodePrime]); - *(here->HSMHV2TempgpPtr) += model->HSMHV2_type * (ydc_t[gNodePrime] + ag0*ydyn_t[gNodePrime]); - *(here->HSMHV2TempsPtr) += model->HSMHV2_type * (ydc_t[sNode] + ag0*ydyn_t[sNode] ); - *(here->HSMHV2TempspPtr) += model->HSMHV2_type * (ydc_t[sNodePrime] + ag0*ydyn_t[sNodePrime]); - *(here->HSMHV2TempbpPtr) += model->HSMHV2_type * (ydc_t[bNodePrime] + ag0*ydyn_t[bNodePrime]); - /* no type factor at main diagonal temp entry! */ - *(here->HSMHV2TemptempPtr) += ydc_t[tempNode] + ag0*ydyn_t[tempNode]; - } - - /* additional entries for flat nqs handling */ - if ( flg_nqs ) { - /*qi*/ - *(here->HSMHV2QIdpPtr) += model->HSMHV2_type * (ydc_qi[dNodePrime] + ag0*ydyn_qi[dNodePrime]); - *(here->HSMHV2QIgpPtr) += model->HSMHV2_type * (ydc_qi[gNodePrime] + ag0*ydyn_qi[gNodePrime]); - *(here->HSMHV2QIspPtr) += model->HSMHV2_type * (ydc_qi[sNodePrime] + ag0*ydyn_qi[sNodePrime]); - *(here->HSMHV2QIbpPtr) += model->HSMHV2_type * (ydc_qi[bNodePrime] + ag0*ydyn_qi[bNodePrime]); - *(here->HSMHV2QIqiPtr) += (ydc_qi[qiNode] + ag0*ydyn_qi[qiNode]); - if ( here->HSMHV2_coselfheat > 0 ) { /* self heating */ - *(here->HSMHV2QItempPtr) += (ydc_qi[tempNode] + ag0*ydyn_qi[tempNode]); - } - - /*qb*/ - *(here->HSMHV2QBdpPtr) += model->HSMHV2_type * (ydc_qb[dNodePrime] + ag0*ydyn_qb[dNodePrime]); - *(here->HSMHV2QBgpPtr) += model->HSMHV2_type * (ydc_qb[gNodePrime] + ag0*ydyn_qb[gNodePrime]); - *(here->HSMHV2QBspPtr) += model->HSMHV2_type * (ydc_qb[sNodePrime] + ag0*ydyn_qb[sNodePrime]); - *(here->HSMHV2QBbpPtr) += model->HSMHV2_type * (ydc_qb[bNodePrime] + ag0*ydyn_qb[bNodePrime]); - *(here->HSMHV2QBqbPtr) += (ydc_qb[qbNode] + ag0*ydyn_qb[qbNode]); - if ( here->HSMHV2_coselfheat > 0 ) { /* self heating */ - *(here->HSMHV2QBtempPtr) += (ydc_qb[tempNode] + ag0*ydyn_qb[tempNode]); - } - } - - -line1000: - - if (ckt->CKTnoncon != noncon_old) { - ckt->CKTtroubleElt = (GENinstance *) here; - } - - - } /* End of MOSFET Instance */ - } /* End of Model Instance */ - - return(OK); -} diff --git a/src/spicelib/devices/hisimhv2/hsmhv2ld_info_eval.h b/src/spicelib/devices/hisimhv2/hsmhv2ld_info_eval.h deleted file mode 100644 index 2a4e77cdd..000000000 --- a/src/spicelib/devices/hisimhv2/hsmhv2ld_info_eval.h +++ /dev/null @@ -1,165 +0,0 @@ -/*********************************************************************** - - HiSIM (Hiroshima University STARC IGFET Model) - Copyright (C) 2014 Hiroshima University & STARC - - MODEL NAME : HiSIM_HV - ( VERSION : 2 SUBVERSION : 2 REVISION : 0 ) - Model Parameter 'VERSION' : 2.10 - FILE : hsmhvld_info_eval.h - - DATE : 2014.6.11 - - recent changes: - 2009.01.09 some bugfixes - - released by - Hiroshima University & - Semiconductor Technology Academic Research Center (STARC) -***********************************************************************/ - -/********************************************************************** - -The following source code, and all copyrights, trade secrets or other -intellectual property rights in and to the source code in its entirety, -is owned by the Hiroshima University and the STARC organization. - -All users need to follow the "HISIM_HV Distribution Statement and -Copyright Notice" attached to HiSIM_HV model. - ------HISIM_HV Distribution Statement and Copyright Notice-------------- - -Software is distributed as is, completely without warranty or service -support. Hiroshima University or STARC and its employees are not liable -for the condition or performance of the software. - -Hiroshima University and STARC own the copyright and grant users a perpetual, -irrevocable, worldwide, non-exclusive, royalty-free license with respect -to the software as set forth below. - -Hiroshima University and STARC hereby disclaims all implied warranties. - -Hiroshima University and STARC grant the users the right to modify, copy, -and redistribute the software and documentation, both within the user's -organization and externally, subject to the following restrictions - -1. The users agree not to charge for Hiroshima University and STARC code -itself but may charge for additions, extensions, or support. - -2. In any product based on the software, the users agree to acknowledge -Hiroshima University and STARC that developed the software. This -acknowledgment shall appear in the product documentation. - -3. The users agree to reproduce any copyright notice which appears on -the software on any copy or modification of such made available -to others." - -Toshimasa Asahara, President, Hiroshima University -Mitiko Miura-Mattausch, Professor, Hiroshima University -Katsuhiro Shimohigashi, President&CEO, STARC -June 2008 (revised October 2011) -*************************************************************************/ - - /* print all outputs ------------VV */ - if ( model->HSMHV2_info >= 4 ) { - here->HSMHV2_csdo = - (here->HSMHV2_cddo + here->HSMHV2_cgdo + here->HSMHV2_cbdo) ; - here->HSMHV2_csgo = - (here->HSMHV2_cdgo + here->HSMHV2_cggo + here->HSMHV2_cbgo) ; - here->HSMHV2_csbo = - (here->HSMHV2_cdbo + here->HSMHV2_cgbo + here->HSMHV2_cbbo) ; - - here->HSMHV2_cdso = - (here->HSMHV2_cddo + here->HSMHV2_cdgo + here->HSMHV2_cdbo) ; - here->HSMHV2_cgso = - (here->HSMHV2_cgdo + here->HSMHV2_cggo + here->HSMHV2_cgbo) ; - here->HSMHV2_csso = - (here->HSMHV2_csdo + here->HSMHV2_csgo + here->HSMHV2_csbo) ; - - cgdb = dQg_dVds - ((here->HSMHV2_mode > 0) ? here->HSMHV2_cgdo : here->HSMHV2_cgso) ; - cggb = dQg_dVgs - here->HSMHV2_cggo ; - cgsb = - (dQg_dVds + dQg_dVgs + dQg_dVbs) - ((here->HSMHV2_mode > 0) ? here->HSMHV2_cgso : here->HSMHV2_cgdo) ; - cbdb = dQb_dVds - ((here->HSMHV2_mode > 0) ? here->HSMHV2_cbdo : - -(here->HSMHV2_cbdo+here->HSMHV2_cbgo+here->HSMHV2_cbbo)) ; - cbgb = dQb_dVgs - here->HSMHV2_cbgo ; - cbsb = - (dQb_dVds + dQb_dVgs + dQb_dVbs) - ((here->HSMHV2_mode > 0) ? -(here->HSMHV2_cbdo+here->HSMHV2_cbgo+here->HSMHV2_cbbo) - : here->HSMHV2_cbdo) ; - cddb = dQd_dVds - ((here->HSMHV2_mode > 0) ? here->HSMHV2_cddo : here->HSMHV2_csso) ; - cdgb = dQd_dVgs - ((here->HSMHV2_mode > 0) ? here->HSMHV2_cdgo : here->HSMHV2_csgo) ; - cdsb = - (dQd_dVds + dQd_dVgs + dQd_dVbs) - ((here->HSMHV2_mode > 0) ? here->HSMHV2_cdso : here->HSMHV2_csdo) ; - - if (flg_nqs) { - /* by implicit differentiation of the nqs equations: */ - dQi_nqs_dVds = (dQi_dVds + Iqi_nqs * dtau_dVds )/(1.0 + ag0 * tau ) ; - dQi_nqs_dVgs = (dQi_dVgs + Iqi_nqs * dtau_dVgs )/(1.0 + ag0 * tau ) ; - dQi_nqs_dVbs = (dQi_dVbs + Iqi_nqs * dtau_dVbs )/(1.0 + ag0 * tau ) ; - dQb_nqs_dVds = (dQbulk_dVds + Iqb_nqs * dtaub_dVds)/(1.0 + ag0 * taub) ; - dQb_nqs_dVgs = (dQbulk_dVgs + Iqb_nqs * dtaub_dVgs)/(1.0 + ag0 * taub) ; - dQb_nqs_dVbs = (dQbulk_dVbs + Iqb_nqs * dtaub_dVbs)/(1.0 + ag0 * taub) ; - cgdb_nqs = dQg_nqs_dQi_nqs * dQi_nqs_dVds + dQg_nqs_dQb_nqs * dQb_nqs_dVds ; - cggb_nqs = dQg_nqs_dQi_nqs * dQi_nqs_dVgs + dQg_nqs_dQb_nqs * dQb_nqs_dVgs ; - cgsb_nqs = - dQg_nqs_dQi_nqs * (dQi_nqs_dVds + dQi_nqs_dVgs + dQi_nqs_dVbs) - - dQg_nqs_dQb_nqs * (dQb_nqs_dVds + dQb_nqs_dVgs + dQb_nqs_dVbs) ; - cbdb_nqs = dQb_nqs_dVds ; - cbgb_nqs = dQb_nqs_dVgs ; - cbsb_nqs = -(dQb_nqs_dVds + dQb_nqs_dVgs + dQb_nqs_dVbs) ; - cddb_nqs = dQd_nqs_dVds + dQd_nqs_dQi_nqs * dQi_nqs_dVds ; - cdgb_nqs= dQd_nqs_dVgs + dQd_nqs_dQi_nqs * dQi_nqs_dVgs ; - cdsb_nqs= -(dQd_nqs_dVds + dQd_nqs_dVgs + dQd_nqs_dVbs) - dQd_nqs_dQi_nqs * (dQi_nqs_dVds + dQi_nqs_dVgs + dQi_nqs_dVbs) ; - } else { - cgdb_nqs = cggb_nqs = cgsb_nqs = cbdb_nqs = cbgb_nqs = cbsb_nqs = cddb_nqs = cdgb_nqs = cdsb_nqs = 0.0 ; - } - - - printf( "--- variables returned from HSMHV2evaluate() ----\n" ) ; - - printf( "von = %12.5e\n" , here->HSMHV2_von ) ; - printf( "vdsat = %12.5e\n" , here->HSMHV2_vdsat ) ; - printf( "ids = %12.5e\n" , here->HSMHV2_ids ) ; - - printf( "gds = %12.5e\n" , here->HSMHV2_dIds_dVdsi ) ; - printf( "gm = %12.5e\n" , here->HSMHV2_dIds_dVgsi ) ; - printf( "gmbs = %12.5e\n" , here->HSMHV2_dIds_dVbsi ) ; - - printf( "cggo = %12.5e\n" , here->HSMHV2_cggo ) ; - printf( "cgdo = %12.5e\n" , (here->HSMHV2_mode > 0) ? here->HSMHV2_cgdo : here->HSMHV2_cgso ) ; - printf( "cgso = %12.5e\n" , (here->HSMHV2_mode > 0) ? here->HSMHV2_cgso : here->HSMHV2_cgdo ) ; - printf( "cdgo = %12.5e\n" , (here->HSMHV2_mode > 0) ? here->HSMHV2_cdgo : here->HSMHV2_csgo ) ; - printf( "cddo = %12.5e\n" , (here->HSMHV2_mode > 0) ? here->HSMHV2_cddo : here->HSMHV2_csso ) ; - printf( "cdso = %12.5e\n" , (here->HSMHV2_mode > 0) ? here->HSMHV2_cdso : here->HSMHV2_csdo ) ; - printf( "csgo = %12.5e\n" , (here->HSMHV2_mode > 0) ? here->HSMHV2_csgo : here->HSMHV2_cdgo ) ; - printf( "csdo = %12.5e\n" , (here->HSMHV2_mode > 0) ? here->HSMHV2_csdo : here->HSMHV2_cdso ) ; - printf( "csso = %12.5e\n" , (here->HSMHV2_mode > 0) ? here->HSMHV2_csso : here->HSMHV2_cddo ) ; - - printf( "qg = %12.5e\n" , Qg + Qg_nqs) ; - printf( "qd = %12.5e\n" , Qd + Qd_nqs) ; - printf( "qs = %12.5e\n" , Qs + Qs_nqs) ; - - printf( "cggb = %12.5e\n" , cggb + cggb_nqs ) ; - printf( "cgsb = %12.5e\n" , cgsb + cgsb_nqs ) ; - printf( "cgdb = %12.5e\n" , cgdb + cgdb_nqs ) ; - printf( "cbgb = %12.5e\n" , cbgb + cbgb_nqs ) ; - printf( "cbsb = %12.5e\n" , cbsb + cbsb_nqs ) ; - printf( "cbdb = %12.5e\n" , cbdb + cbdb_nqs ) ; - printf( "cdgb = %12.5e\n" , cdgb + cdgb_nqs ) ; - printf( "cdsb = %12.5e\n" , cdsb + cdsb_nqs ) ; - printf( "cddb = %12.5e\n" , cddb + cddb_nqs ) ; - - printf( "ibd = %12.5e\n" , Ibd ) ; - printf( "ibs = %12.5e\n" , Ibs ) ; - printf( "gbd = %12.5e\n" , Gbd ) ; - printf( "gbs = %12.5e\n" , Gbs ) ; - printf( "capbd = %12.5e\n" , Cbd ) ; - printf( "capbs = %12.5e\n" , Cbs ) ; - printf( "qbd = %12.5e\n" , Qbd ) ; - printf( "qbs = %12.5e\n" , Qbs ) ; - - printf( "isub = %12.5e\n" , here->HSMHV2_isub ) ; - printf( "gbgs = %12.5e\n" , dIsub_dVgs + dIsubs_dVgs ) ; - printf( "gbds = %12.5e\n" , dIsub_dVds + dIsubs_dVds ) ; - printf( "gbbs = %12.5e\n" , dIsub_dVbs + dIsubs_dVbs ) ; - - printf( "S_flicker_noise * ( freq / gain ) = %.16e\n" , here->HSMHV2_noiflick ) ; - printf( "S_thermal_noise / ( gain * 4kT ) = %.16e\n" , here->HSMHV2_noithrml ) ; - printf( "S_induced_gate_noise / ( gain * freq^2 ) = %.16e\n" , here->HSMHV2_noiigate ) ; - printf( "cross-correlation coefficient (= Sigid/sqrt(Sig*Sid) ) = %.16e\n" , here->HSMHV2_noicross ) ; - /* print Surface Potentials */ -/* printf( "ivds %e ivgs %e ivbs %e Ps0 %.16e Pds %.16e\n" , */ -/* ivds, ivgs, ivbs, here->HSMHV2_ps0_prv, here->HSMHV2_pds_prv ) ; */ - } - /* print all outputs ------------AA */ - -/* End of HSMHV2ld_info_eval.h */ diff --git a/src/spicelib/devices/hisimhv2/hsmhv2mask.c b/src/spicelib/devices/hisimhv2/hsmhv2mask.c deleted file mode 100644 index 3a7f233e6..000000000 --- a/src/spicelib/devices/hisimhv2/hsmhv2mask.c +++ /dev/null @@ -1,2305 +0,0 @@ -/*********************************************************************** - - HiSIM (Hiroshima University STARC IGFET Model) - Copyright (C) 2014 Hiroshima University & STARC - - MODEL NAME : HiSIM_HV - ( VERSION : 2 SUBVERSION : 2 REVISION : 0 ) - Model Parameter 'VERSION' : 2.20 - FILE : hsmhvmask.c - - DATE : 2014.6.11 - - released by - Hiroshima University & - Semiconductor Technology Academic Research Center (STARC) -***********************************************************************/ - -/********************************************************************** - -The following source code, and all copyrights, trade secrets or other -intellectual property rights in and to the source code in its entirety, -is owned by the Hiroshima University and the STARC organization. - -All users need to follow the "HISIM_HV Distribution Statement and -Copyright Notice" attached to HiSIM_HV model. - ------HISIM_HV Distribution Statement and Copyright Notice-------------- - -Software is distributed as is, completely without warranty or service -support. Hiroshima University or STARC and its employees are not liable -for the condition or performance of the software. - -Hiroshima University and STARC own the copyright and grant users a perpetual, -irrevocable, worldwide, non-exclusive, royalty-free license with respect -to the software as set forth below. - -Hiroshima University and STARC hereby disclaims all implied warranties. - -Hiroshima University and STARC grant the users the right to modify, copy, -and redistribute the software and documentation, both within the user's -organization and externally, subject to the following restrictions - -1. The users agree not to charge for Hiroshima University and STARC code -itself but may charge for additions, extensions, or support. - -2. In any product based on the software, the users agree to acknowledge -Hiroshima University and STARC that developed the software. This -acknowledgment shall appear in the product documentation. - -3. The users agree to reproduce any copyright notice which appears on -the software on any copy or modification of such made available -to others." - -Toshimasa Asahara, President, Hiroshima University -Mitiko Miura-Mattausch, Professor, Hiroshima University -Katsuhiro Shimohigashi, President&CEO, STARC -June 2008 (revised October 2011) -*************************************************************************/ - -#include "ngspice/ngspice.h" -#include "ngspice/ifsim.h" -#include "ngspice/cktdefs.h" -#include "ngspice/devdefs.h" -#include "hsmhv2def.h" -#include "ngspice/sperror.h" -#include "ngspice/suffix.h" - -int HSMHV2mAsk( - CKTcircuit *ckt, - GENmodel *inst, - int which, - IFvalue *value) -{ - HSMHV2model *model = (HSMHV2model *)inst; - - NG_IGNORE(ckt); - - switch (which) { - case HSMHV2_MOD_NMOS: - value->iValue = model->HSMHV2_type; - return(OK); - case HSMHV2_MOD_PMOS: - value->iValue = model->HSMHV2_type; - return(OK); - case HSMHV2_MOD_LEVEL: - value->iValue = model->HSMHV2_level; - return(OK); - case HSMHV2_MOD_INFO: - value->iValue = model->HSMHV2_info; - return(OK); - case HSMHV2_MOD_NOISE: - value->iValue = model->HSMHV2_noise; - return(OK); - case HSMHV2_MOD_VERSION: - value->sValue = model->HSMHV2_version; - return(OK); - case HSMHV2_MOD_SHOW: - value->iValue = model->HSMHV2_show; - return(OK); - case HSMHV2_MOD_CORSRD: - value->iValue = model->HSMHV2_corsrd; - return(OK); - case HSMHV2_MOD_CORG: - value->iValue = model->HSMHV2_corg; - return(OK); - case HSMHV2_MOD_COIPRV: - value->iValue = model->HSMHV2_coiprv; - return(OK); - case HSMHV2_MOD_COPPRV: - value->iValue = model->HSMHV2_copprv; - return(OK); - case HSMHV2_MOD_COADOV: - value->iValue = model->HSMHV2_coadov; - return(OK); - case HSMHV2_MOD_COISUB: - value->iValue = model->HSMHV2_coisub; - return(OK); - case HSMHV2_MOD_COIIGS: - value->iValue = model->HSMHV2_coiigs; - return(OK); - case HSMHV2_MOD_COGIDL: - value->iValue = model->HSMHV2_cogidl; - return(OK); - case HSMHV2_MOD_COOVLP: - value->iValue = model->HSMHV2_coovlp; - return(OK); - case HSMHV2_MOD_COOVLPS: - value->iValue = model->HSMHV2_coovlps; - return(OK); - case HSMHV2_MOD_COFLICK: - value->iValue = model->HSMHV2_coflick; - return(OK); - case HSMHV2_MOD_COISTI: - value->iValue = model->HSMHV2_coisti; - return(OK); - case HSMHV2_MOD_CONQS: - value->iValue = model->HSMHV2_conqs; - return(OK); - case HSMHV2_MOD_CORBNET: - value->iValue = model->HSMHV2_corbnet; - return(OK); - case HSMHV2_MOD_COTHRML: - value->iValue = model->HSMHV2_cothrml; - return(OK); - case HSMHV2_MOD_COIGN: - value->iValue = model->HSMHV2_coign; - return(OK); - case HSMHV2_MOD_CODFM: - value->iValue = model->HSMHV2_codfm; - return(OK); - case HSMHV2_MOD_COQOVSM: - value->iValue = model->HSMHV2_coqovsm; - return(OK); - case HSMHV2_MOD_COSELFHEAT: /* Self-heating model */ - value->iValue = model->HSMHV2_coselfheat; - return(OK); - case HSMHV2_MOD_COSUBNODE: - value->iValue = model->HSMHV2_cosubnode; - return(OK); - case HSMHV2_MOD_COSYM: /* Symmetry model for HV */ - value->iValue = model->HSMHV2_cosym; - return(OK); - case HSMHV2_MOD_COTEMP: - value->iValue = model->HSMHV2_cotemp; - return(OK); - case HSMHV2_MOD_COLDRIFT: - value->iValue = model->HSMHV2_coldrift; - return(OK); - case HSMHV2_MOD_CORDRIFT: - value->iValue = model->HSMHV2_cordrift; - return(OK); - case HSMHV2_MOD_COERRREP: - value->iValue = model->HSMHV2_coerrrep; - return(OK); - case HSMHV2_MOD_CODEP: - value->iValue = model->HSMHV2_codep; - return(OK); - case HSMHV2_MOD_CODDLT: - value->iValue = model->HSMHV2_coddlt; - return(OK); - case HSMHV2_MOD_VMAX: - value->rValue = model->HSMHV2_vmax; - return(OK); - case HSMHV2_MOD_VMAXT1: - value->rValue = model->HSMHV2_vmaxt1; - return(OK); - case HSMHV2_MOD_VMAXT2: - value->rValue = model->HSMHV2_vmaxt2; - return(OK); - case HSMHV2_MOD_BGTMP1: - value->rValue = model->HSMHV2_bgtmp1; - return(OK); - case HSMHV2_MOD_BGTMP2: - value->rValue = model->HSMHV2_bgtmp2; - return(OK); - case HSMHV2_MOD_EG0: - value->rValue = model->HSMHV2_eg0; - return(OK); - case HSMHV2_MOD_TOX: - value->rValue = model->HSMHV2_tox; - return(OK); - case HSMHV2_MOD_XLD: - value->rValue = model->HSMHV2_xld; - return(OK); - case HSMHV2_MOD_LOVER: - value->rValue = model->HSMHV2_lover; - return(OK); - case HSMHV2_MOD_LOVERS: - value->rValue = model->HSMHV2_lovers; - return(OK); - case HSMHV2_MOD_RDOV11: - value->rValue = model->HSMHV2_rdov11; - return(OK); - case HSMHV2_MOD_RDOV12: - value->rValue = model->HSMHV2_rdov12; - return(OK); - case HSMHV2_MOD_RDOV13: - value->rValue = model->HSMHV2_rdov13; - return(OK); - case HSMHV2_MOD_RDSLP1: - value->rValue = model->HSMHV2_rdslp1; - return(OK); - case HSMHV2_MOD_RDICT1: - value->rValue = model->HSMHV2_rdict1; - return(OK); - case HSMHV2_MOD_RDSLP2: - value->rValue = model->HSMHV2_rdslp2; - return(OK); - case HSMHV2_MOD_RDICT2: - value->rValue = model->HSMHV2_rdict2; - return(OK); - case HSMHV2_MOD_LOVERLD: - value->rValue = model->HSMHV2_loverld; - return(OK); - case HSMHV2_MOD_LDRIFT1: - value->rValue = model->HSMHV2_ldrift1; - return(OK); - case HSMHV2_MOD_LDRIFT2: - value->rValue = model->HSMHV2_ldrift2; - return(OK); - case HSMHV2_MOD_LDRIFT1S: - value->rValue = model->HSMHV2_ldrift1s; - return(OK); - case HSMHV2_MOD_LDRIFT2S: - value->rValue = model->HSMHV2_ldrift2s; - return(OK); - case HSMHV2_MOD_SUBLD1: - value->rValue = model->HSMHV2_subld1; - return(OK); - case HSMHV2_MOD_SUBLD1L: - value->rValue = model->HSMHV2_subld1l; - return(OK); - case HSMHV2_MOD_SUBLD1LP: - value->rValue = model->HSMHV2_subld1lp; - return(OK); - case HSMHV2_MOD_SUBLD2: - value->rValue = model->HSMHV2_subld2; - return(OK); - case HSMHV2_MOD_XPDV: - value->rValue = model->HSMHV2_xpdv; - return(OK); - case HSMHV2_MOD_XPVDTH: - value->rValue = model->HSMHV2_xpvdth; - return(OK); - case HSMHV2_MOD_XPVDTHG: - value->rValue = model->HSMHV2_xpvdthg; - return(OK); - case HSMHV2_MOD_DDLTMAX: /* Vdseff */ - value->rValue = model->HSMHV2_ddltmax; - return(OK); - case HSMHV2_MOD_DDLTSLP: /* Vdseff */ - value->rValue = model->HSMHV2_ddltslp; - return(OK); - case HSMHV2_MOD_DDLTICT: /* Vdseff */ - value->rValue = model->HSMHV2_ddltict; - return(OK); - case HSMHV2_MOD_VFBOVER: - value->rValue = model->HSMHV2_vfbover; - return(OK); - case HSMHV2_MOD_NOVER: - value->rValue = model->HSMHV2_nover; - return(OK); - case HSMHV2_MOD_NOVERS: - value->rValue = model->HSMHV2_novers; - return(OK); - case HSMHV2_MOD_XWD: - value->rValue = model->HSMHV2_xwd; - return(OK); - case HSMHV2_MOD_XWDC: - value->rValue = model->HSMHV2_xwdc; - return(OK); - case HSMHV2_MOD_XL: - value->rValue = model->HSMHV2_xl; - return(OK); - case HSMHV2_MOD_XW: - value->rValue = model->HSMHV2_xw; - return(OK); - case HSMHV2_MOD_SAREF: - value->rValue = model->HSMHV2_saref; - return(OK); - case HSMHV2_MOD_SBREF: - value->rValue = model->HSMHV2_sbref; - return(OK); - case HSMHV2_MOD_LL: - value->rValue = model->HSMHV2_ll; - return(OK); - case HSMHV2_MOD_LLD: - value->rValue = model->HSMHV2_lld; - return(OK); - case HSMHV2_MOD_LLN: - value->rValue = model->HSMHV2_lln; - return(OK); - case HSMHV2_MOD_WL: - value->rValue = model->HSMHV2_wl; - return(OK); - case HSMHV2_MOD_WL1: - value->rValue = model->HSMHV2_wl1; - return(OK); - case HSMHV2_MOD_WL1P: - value->rValue = model->HSMHV2_wl1p; - return(OK); - case HSMHV2_MOD_WL2: - value->rValue = model->HSMHV2_wl2; - return(OK); - case HSMHV2_MOD_WL2P: - value->rValue = model->HSMHV2_wl2p; - return(OK); - case HSMHV2_MOD_WLD: - value->rValue = model->HSMHV2_wld; - return(OK); - case HSMHV2_MOD_WLN: - value->rValue = model->HSMHV2_wln; - return(OK); - case HSMHV2_MOD_XQY: - value->rValue = model->HSMHV2_xqy; - return(OK); - case HSMHV2_MOD_XQY1: - value->rValue = model->HSMHV2_xqy1; - return(OK); - case HSMHV2_MOD_XQY2: - value->rValue = model->HSMHV2_xqy2; - return(OK); - case HSMHV2_MOD_RS: - value->rValue = model->HSMHV2_rs; - return(OK); - case HSMHV2_MOD_RD: - value->rValue = model->HSMHV2_rd; - return(OK); - case HSMHV2_MOD_RSH: - value->rValue = model->HSMHV2_rsh; - return(OK); - case HSMHV2_MOD_RSHG: - value->rValue = model->HSMHV2_rshg; - return(OK); - case HSMHV2_MOD_VFBC: - value->rValue = model->HSMHV2_vfbc; - return(OK); - case HSMHV2_MOD_VBI: - value->rValue = model->HSMHV2_vbi; - return(OK); - case HSMHV2_MOD_NSUBC: - value->rValue = model->HSMHV2_nsubc; - return(OK); - case HSMHV2_MOD_PARL2: - value->rValue = model->HSMHV2_parl2; - return(OK); - case HSMHV2_MOD_LP: - value->rValue = model->HSMHV2_lp; - return(OK); - case HSMHV2_MOD_NSUBP: - value->rValue = model->HSMHV2_nsubp; - return(OK); - case HSMHV2_MOD_NSUBP0: - value->rValue = model->HSMHV2_nsubp0; - return(OK); - case HSMHV2_MOD_NSUBWP: - value->rValue = model->HSMHV2_nsubwp; - return(OK); - case HSMHV2_MOD_SCP1: - value->rValue = model->HSMHV2_scp1; - return(OK); - case HSMHV2_MOD_SCP2: - value->rValue = model->HSMHV2_scp2; - return(OK); - case HSMHV2_MOD_SCP3: - value->rValue = model->HSMHV2_scp3; - return(OK); - case HSMHV2_MOD_SC1: - value->rValue = model->HSMHV2_sc1; - return(OK); - case HSMHV2_MOD_SC2: - value->rValue = model->HSMHV2_sc2; - return(OK); - case HSMHV2_MOD_SC3: - value->rValue = model->HSMHV2_sc3; - return(OK); - case HSMHV2_MOD_SC4: - value->rValue = model->HSMHV2_sc4; - return(OK); - case HSMHV2_MOD_PGD1: - value->rValue = model->HSMHV2_pgd1; - return(OK); - case HSMHV2_MOD_PGD2: - value->rValue = model->HSMHV2_pgd2; - return(OK); - case HSMHV2_MOD_PGD4: - value->rValue = model->HSMHV2_pgd4; - return(OK); - case HSMHV2_MOD_NDEP: - value->rValue = model->HSMHV2_ndep; - return(OK); - case HSMHV2_MOD_NDEPL: - value->rValue = model->HSMHV2_ndepl; - return(OK); - case HSMHV2_MOD_NDEPLP: - value->rValue = model->HSMHV2_ndeplp; - return(OK); - case HSMHV2_MOD_NINV: - value->rValue = model->HSMHV2_ninv; - return(OK); - case HSMHV2_MOD_MUECB0: - value->rValue = model->HSMHV2_muecb0; - return(OK); - case HSMHV2_MOD_MUECB1: - value->rValue = model->HSMHV2_muecb1; - return(OK); - case HSMHV2_MOD_MUEPH1: - value->rValue = model->HSMHV2_mueph1; - return(OK); - case HSMHV2_MOD_MUEPH0: - value->rValue = model->HSMHV2_mueph0; - return(OK); - case HSMHV2_MOD_MUEPHW: - value->rValue = model->HSMHV2_muephw; - return(OK); - case HSMHV2_MOD_MUEPWP: - value->rValue = model->HSMHV2_muepwp; - return(OK); - case HSMHV2_MOD_MUEPHL: - value->rValue = model->HSMHV2_muephl; - return(OK); - case HSMHV2_MOD_MUEPLP: - value->rValue = model->HSMHV2_mueplp; - return(OK); - case HSMHV2_MOD_MUEPHS: - value->rValue = model->HSMHV2_muephs; - return(OK); - case HSMHV2_MOD_MUEPSP: - value->rValue = model->HSMHV2_muepsp; - return(OK); - case HSMHV2_MOD_VTMP: - value->rValue = model->HSMHV2_vtmp; - return(OK); - case HSMHV2_MOD_WVTH0: - value->rValue = model->HSMHV2_wvth0; - return(OK); - case HSMHV2_MOD_MUESR1: - value->rValue = model->HSMHV2_muesr1; - return(OK); - case HSMHV2_MOD_MUESR0: - value->rValue = model->HSMHV2_muesr0; - return(OK); - case HSMHV2_MOD_MUESRL: - value->rValue = model->HSMHV2_muesrl; - return(OK); - case HSMHV2_MOD_MUESLP: - value->rValue = model->HSMHV2_mueslp; - return(OK); - case HSMHV2_MOD_MUESRW: - value->rValue = model->HSMHV2_muesrw; - return(OK); - case HSMHV2_MOD_MUESWP: - value->rValue = model->HSMHV2_mueswp; - return(OK); - case HSMHV2_MOD_BB: - value->rValue = model->HSMHV2_bb; - return(OK); - case HSMHV2_MOD_SUB1: - value->rValue = model->HSMHV2_sub1; - return(OK); - case HSMHV2_MOD_SUB2: - value->rValue = model->HSMHV2_sub2; - return(OK); - case HSMHV2_MOD_SVGS: - value->rValue = model->HSMHV2_svgs; - return(OK); - case HSMHV2_MOD_SVGSL: - value->rValue = model->HSMHV2_svgsl; - return(OK); - case HSMHV2_MOD_SVGSLP: - value->rValue = model->HSMHV2_svgslp; - return(OK); - case HSMHV2_MOD_SVGSW: - value->rValue = model->HSMHV2_svgsw; - return(OK); - case HSMHV2_MOD_SVGSWP: - value->rValue = model->HSMHV2_svgswp; - return(OK); - case HSMHV2_MOD_SVBS: - value->rValue = model->HSMHV2_svbs; - return(OK); - case HSMHV2_MOD_SVBSL: - value->rValue = model->HSMHV2_svbsl; - return(OK); - case HSMHV2_MOD_SVBSLP: - value->rValue = model->HSMHV2_svbslp; - return(OK); - case HSMHV2_MOD_SVDS: - value->rValue = model->HSMHV2_svds; - return(OK); - case HSMHV2_MOD_SLG: - value->rValue = model->HSMHV2_slg; - return(OK); - case HSMHV2_MOD_SLGL: - value->rValue = model->HSMHV2_slgl; - return(OK); - case HSMHV2_MOD_SLGLP: - value->rValue = model->HSMHV2_slglp; - return(OK); - case HSMHV2_MOD_SUB1L: - value->rValue = model->HSMHV2_sub1l; - return(OK); - case HSMHV2_MOD_SUB1LP: - value->rValue = model->HSMHV2_sub1lp; - return(OK); - case HSMHV2_MOD_SUB2L: - value->rValue = model->HSMHV2_sub2l; - return(OK); - case HSMHV2_MOD_FN1: - value->rValue = model->HSMHV2_fn1; - return(OK); - case HSMHV2_MOD_FN2: - value->rValue = model->HSMHV2_fn2; - return(OK); - case HSMHV2_MOD_FN3: - value->rValue = model->HSMHV2_fn3; - return(OK); - case HSMHV2_MOD_FVBS: - value->rValue = model->HSMHV2_fvbs; - return(OK); - case HSMHV2_MOD_NSTI: - value->rValue = model->HSMHV2_nsti; - return(OK); - case HSMHV2_MOD_WSTI: - value->rValue = model->HSMHV2_wsti; - return(OK); - case HSMHV2_MOD_WSTIL: - value->rValue = model->HSMHV2_wstil; - return(OK); - case HSMHV2_MOD_WSTILP: - value->rValue = model->HSMHV2_wstilp; - return(OK); - case HSMHV2_MOD_WSTIW: - value->rValue = model->HSMHV2_wstiw; - return(OK); - case HSMHV2_MOD_WSTIWP: - value->rValue = model->HSMHV2_wstiwp; - return(OK); - case HSMHV2_MOD_SCSTI1: - value->rValue = model->HSMHV2_scsti1; - return(OK); - case HSMHV2_MOD_SCSTI2: - value->rValue = model->HSMHV2_scsti2; - return(OK); - case HSMHV2_MOD_VTHSTI: - value->rValue = model->HSMHV2_vthsti; - return(OK); - case HSMHV2_MOD_VDSTI: - value->rValue = model->HSMHV2_vdsti; - return(OK); - case HSMHV2_MOD_MUESTI1: - value->rValue = model->HSMHV2_muesti1; - return(OK); - case HSMHV2_MOD_MUESTI2: - value->rValue = model->HSMHV2_muesti2; - return(OK); - case HSMHV2_MOD_MUESTI3: - value->rValue = model->HSMHV2_muesti3; - return(OK); - case HSMHV2_MOD_NSUBPSTI1: - value->rValue = model->HSMHV2_nsubpsti1; - return(OK); - case HSMHV2_MOD_NSUBPSTI2: - value->rValue = model->HSMHV2_nsubpsti2; - return(OK); - case HSMHV2_MOD_NSUBPSTI3: - value->rValue = model->HSMHV2_nsubpsti3; - return(OK); - case HSMHV2_MOD_LPEXT: - value->rValue = model->HSMHV2_lpext; - return(OK); - case HSMHV2_MOD_NPEXT: - value->rValue = model->HSMHV2_npext; - return(OK); - case HSMHV2_MOD_SCP22: - value->rValue = model->HSMHV2_scp22; - return(OK); - case HSMHV2_MOD_SCP21: - value->rValue = model->HSMHV2_scp21; - return(OK); - case HSMHV2_MOD_BS1: - value->rValue = model->HSMHV2_bs1; - return(OK); - case HSMHV2_MOD_BS2: - value->rValue = model->HSMHV2_bs2; - return(OK); - case HSMHV2_MOD_CGSO: - value->rValue = model->HSMHV2_cgso; - return(OK); - case HSMHV2_MOD_CGDO: - value->rValue = model->HSMHV2_cgdo; - return(OK); - case HSMHV2_MOD_CGBO: - value->rValue = model->HSMHV2_cgbo; - return(OK); - case HSMHV2_MOD_TPOLY: - value->rValue = model->HSMHV2_tpoly; - return(OK); - case HSMHV2_MOD_JS0: - value->rValue = model->HSMHV2_js0; - return(OK); - case HSMHV2_MOD_JS0SW: - value->rValue = model->HSMHV2_js0sw; - return(OK); - case HSMHV2_MOD_NJ: - value->rValue = model->HSMHV2_nj; - return(OK); - case HSMHV2_MOD_NJSW: - value->rValue = model->HSMHV2_njsw; - return(OK); - case HSMHV2_MOD_XTI: - value->rValue = model->HSMHV2_xti; - return(OK); - case HSMHV2_MOD_CJ: - value->rValue = model->HSMHV2_cj; - return(OK); - case HSMHV2_MOD_CJSW: - value->rValue = model->HSMHV2_cjsw; - return(OK); - case HSMHV2_MOD_CJSWG: - value->rValue = model->HSMHV2_cjswg; - return(OK); - case HSMHV2_MOD_MJ: - value->rValue = model->HSMHV2_mj; - return(OK); - case HSMHV2_MOD_MJSW: - value->rValue = model->HSMHV2_mjsw; - return(OK); - case HSMHV2_MOD_MJSWG: - value->rValue = model->HSMHV2_mjswg; - return(OK); - case HSMHV2_MOD_PB: - value->rValue = model->HSMHV2_pb; - return(OK); - case HSMHV2_MOD_PBSW: - value->rValue = model->HSMHV2_pbsw; - return(OK); - case HSMHV2_MOD_PBSWG: - value->rValue = model->HSMHV2_pbswg; - return(OK); - case HSMHV2_MOD_XTI2: - value->rValue = model->HSMHV2_xti2; - return(OK); - case HSMHV2_MOD_CISB: - value->rValue = model->HSMHV2_cisb; - return(OK); - case HSMHV2_MOD_CVB: - value->rValue = model->HSMHV2_cvb; - return(OK); - case HSMHV2_MOD_CTEMP: - value->rValue = model->HSMHV2_ctemp; - return(OK); - case HSMHV2_MOD_CISBK: - value->rValue = model->HSMHV2_cisbk; - return(OK); - case HSMHV2_MOD_CVBK: - value->rValue = model->HSMHV2_cvbk; - return(OK); - case HSMHV2_MOD_DIVX: - value->rValue = model->HSMHV2_divx; - return(OK); - case HSMHV2_MOD_CLM1: - value->rValue = model->HSMHV2_clm1; - return(OK); - case HSMHV2_MOD_CLM2: - value->rValue = model->HSMHV2_clm2; - return(OK); - case HSMHV2_MOD_CLM3: - value->rValue = model->HSMHV2_clm3; - return(OK); - case HSMHV2_MOD_CLM5: - value->rValue = model->HSMHV2_clm5; - return(OK); - case HSMHV2_MOD_CLM6: - value->rValue = model->HSMHV2_clm6; - return(OK); - case HSMHV2_MOD_MUETMP: - value->rValue = model->HSMHV2_muetmp; - return(OK); - case HSMHV2_MOD_VOVER: - value->rValue = model->HSMHV2_vover; - return(OK); - case HSMHV2_MOD_VOVERP: - value->rValue = model->HSMHV2_voverp; - return(OK); - case HSMHV2_MOD_VOVERS: - value->rValue = model->HSMHV2_vovers; - return(OK); - case HSMHV2_MOD_VOVERSP: - value->rValue = model->HSMHV2_voversp; - return(OK); - case HSMHV2_MOD_WFC: - value->rValue = model->HSMHV2_wfc; - return(OK); - case HSMHV2_MOD_NSUBCW: - value->rValue = model->HSMHV2_nsubcw; - return(OK); - case HSMHV2_MOD_NSUBCWP: - value->rValue = model->HSMHV2_nsubcwp; - return(OK); - case HSMHV2_MOD_QME1: - value->rValue = model->HSMHV2_qme1; - return(OK); - case HSMHV2_MOD_QME2: - value->rValue = model->HSMHV2_qme2; - return(OK); - case HSMHV2_MOD_QME3: - value->rValue = model->HSMHV2_qme3; - return(OK); - case HSMHV2_MOD_GIDL1: - value->rValue = model->HSMHV2_gidl1; - return(OK); - case HSMHV2_MOD_GIDL2: - value->rValue = model->HSMHV2_gidl2; - return(OK); - case HSMHV2_MOD_GIDL3: - value->rValue = model->HSMHV2_gidl3; - return(OK); - case HSMHV2_MOD_GIDL4: - value->rValue = model->HSMHV2_gidl4; - return(OK); - case HSMHV2_MOD_GIDL5: - value->rValue = model->HSMHV2_gidl5; - return(OK); - case HSMHV2_MOD_GLEAK1: - value->rValue = model->HSMHV2_gleak1; - return(OK); - case HSMHV2_MOD_GLEAK2: - value->rValue = model->HSMHV2_gleak2; - return(OK); - case HSMHV2_MOD_GLEAK3: - value->rValue = model->HSMHV2_gleak3; - return(OK); - case HSMHV2_MOD_GLEAK4: - value->rValue = model->HSMHV2_gleak4; - return(OK); - case HSMHV2_MOD_GLEAK5: - value->rValue = model->HSMHV2_gleak5; - return(OK); - case HSMHV2_MOD_GLEAK6: - value->rValue = model->HSMHV2_gleak6; - return(OK); - case HSMHV2_MOD_GLEAK7: - value->rValue = model->HSMHV2_gleak7; - return(OK); - case HSMHV2_MOD_GLPART1: - value->rValue = model->HSMHV2_glpart1; - return(OK); - case HSMHV2_MOD_GLKSD1: - value->rValue = model->HSMHV2_glksd1; - return(OK); - case HSMHV2_MOD_GLKSD2: - value->rValue = model->HSMHV2_glksd2; - return(OK); - case HSMHV2_MOD_GLKSD3: - value->rValue = model->HSMHV2_glksd3; - return(OK); - case HSMHV2_MOD_GLKB1: - value->rValue = model->HSMHV2_glkb1; - return(OK); - case HSMHV2_MOD_GLKB2: - value->rValue = model->HSMHV2_glkb2; - return(OK); - case HSMHV2_MOD_GLKB3: - value->rValue = model->HSMHV2_glkb3; - return(OK); - case HSMHV2_MOD_EGIG: - value->rValue = model->HSMHV2_egig; - return(OK); - case HSMHV2_MOD_IGTEMP2: - value->rValue = model->HSMHV2_igtemp2; - return(OK); - case HSMHV2_MOD_IGTEMP3: - value->rValue = model->HSMHV2_igtemp3; - return(OK); - case HSMHV2_MOD_VZADD0: - value->rValue = model->HSMHV2_vzadd0; - return(OK); - case HSMHV2_MOD_PZADD0: - value->rValue = model->HSMHV2_pzadd0; - return(OK); - case HSMHV2_MOD_NFTRP: - value->rValue = model->HSMHV2_nftrp; - return(OK); - case HSMHV2_MOD_NFALP: - value->rValue = model->HSMHV2_nfalp; - return(OK); - case HSMHV2_MOD_CIT: - value->rValue = model->HSMHV2_cit; - return(OK); - case HSMHV2_MOD_FALPH: - value->rValue = model->HSMHV2_falph; - return(OK); - case HSMHV2_MOD_KAPPA: - value->rValue = model->HSMHV2_kappa; - return(OK); - case HSMHV2_MOD_VDIFFJ: - value->rValue = model->HSMHV2_vdiffj; - return(OK); - case HSMHV2_MOD_DLY1: - value->rValue = model->HSMHV2_dly1; - return(OK); - case HSMHV2_MOD_DLY2: - value->rValue = model->HSMHV2_dly2; - return(OK); - case HSMHV2_MOD_DLY3: - value->rValue = model->HSMHV2_dly3; - return(OK); - case HSMHV2_MOD_DLYOV: - value->rValue = model->HSMHV2_dlyov; - return(OK); - - - case HSMHV2_MOD_TNOM: - value->rValue = model->HSMHV2_tnom; - return(OK); - case HSMHV2_MOD_OVSLP: - value->rValue = model->HSMHV2_ovslp; - return(OK); - case HSMHV2_MOD_OVMAG: - value->rValue = model->HSMHV2_ovmag; - return(OK); - case HSMHV2_MOD_GBMIN: - value->rValue = model->HSMHV2_gbmin; - return(OK); - case HSMHV2_MOD_RBPB: - value->rValue = model->HSMHV2_rbpb; - return(OK); - case HSMHV2_MOD_RBPD: - value->rValue = model->HSMHV2_rbpd; - return(OK); - case HSMHV2_MOD_RBPS: - value->rValue = model->HSMHV2_rbps; - return(OK); - case HSMHV2_MOD_RBDB: - value->rValue = model->HSMHV2_rbdb; - return(OK); - case HSMHV2_MOD_RBSB: - value->rValue = model->HSMHV2_rbsb; - return(OK); - case HSMHV2_MOD_IBPC1: - value->rValue = model->HSMHV2_ibpc1; - return(OK); - case HSMHV2_MOD_IBPC1L: - value->rValue = model->HSMHV2_ibpc1l; - return(OK); - case HSMHV2_MOD_IBPC1LP: - value->rValue = model->HSMHV2_ibpc1lp; - return(OK); - case HSMHV2_MOD_IBPC2: - value->rValue = model->HSMHV2_ibpc2; - return(OK); - case HSMHV2_MOD_MPHDFM: - value->rValue = model->HSMHV2_mphdfm; - return(OK); - - case HSMHV2_MOD_PTL: - value->rValue = model->HSMHV2_ptl; - return(OK); - case HSMHV2_MOD_PTP: - value->rValue = model->HSMHV2_ptp; - return(OK); - case HSMHV2_MOD_PT2: - value->rValue = model->HSMHV2_pt2; - return(OK); - case HSMHV2_MOD_PTLP: - value->rValue = model->HSMHV2_ptlp; - return(OK); - case HSMHV2_MOD_GDL: - value->rValue = model->HSMHV2_gdl; - return(OK); - case HSMHV2_MOD_GDLP: - value->rValue = model->HSMHV2_gdlp; - return(OK); - - case HSMHV2_MOD_GDLD: - value->rValue = model->HSMHV2_gdld; - return(OK); - case HSMHV2_MOD_PT4: - value->rValue = model->HSMHV2_pt4; - return(OK); - case HSMHV2_MOD_PT4P: - value->rValue = model->HSMHV2_pt4p; - return(OK); - case HSMHV2_MOD_RDVG11: - value->rValue = model->HSMHV2_rdvg11; - return(OK); - case HSMHV2_MOD_RDVG12: - value->rValue = model->HSMHV2_rdvg12; - return(OK); - case HSMHV2_MOD_RTH0: /* Self-heating model */ - value->rValue = model->HSMHV2_rth0; - return(OK); - case HSMHV2_MOD_CTH0: /* Self-heating model */ - value->rValue = model->HSMHV2_cth0; - return(OK); - case HSMHV2_MOD_POWRAT: /* Self-heating model */ - value->rValue = model->HSMHV2_powrat; - return(OK); - case HSMHV2_MOD_RTHTEMP1: /* Self-heating model */ - value->rValue = model->HSMHV2_rthtemp1; - return(OK); - case HSMHV2_MOD_RTHTEMP2: /* Self-heating model */ - value->rValue = model->HSMHV2_rthtemp2; - return(OK); - case HSMHV2_MOD_PRATTEMP1: /* Self-heating model */ - value->rValue = model->HSMHV2_prattemp1; - return(OK); - case HSMHV2_MOD_PRATTEMP2: /* Self-heating model */ - value->rValue = model->HSMHV2_prattemp2; - return(OK); - - - - case HSMHV2_MOD_TCJBD: /* Self-heating model */ - value->rValue = model->HSMHV2_tcjbd; - return(OK); - case HSMHV2_MOD_TCJBS: /* Self-heating model */ - value->rValue = model->HSMHV2_tcjbs; - return(OK); - case HSMHV2_MOD_TCJBDSW: /* Self-heating model */ - value->rValue = model->HSMHV2_tcjbdsw; - return(OK); - case HSMHV2_MOD_TCJBSSW: /* Self-heating model */ - value->rValue = model->HSMHV2_tcjbssw; - return(OK); - case HSMHV2_MOD_TCJBDSWG: /* Self-heating model */ - value->rValue = model->HSMHV2_tcjbdswg; - return(OK); - case HSMHV2_MOD_TCJBSSWG: /* Self-heating model */ - value->rValue = model->HSMHV2_tcjbsswg; - return(OK); -/* case HSMHV2_MOD_WTH0: */ -/* value->rValue = model->HSMHV2_wth0; */ -/* return(OK); */ - case HSMHV2_MOD_QDFTVD: - value->rValue = model->HSMHV2_qdftvd; - return(OK); - case HSMHV2_MOD_XLDLD: - value->rValue = model->HSMHV2_xldld; - return(OK); - case HSMHV2_MOD_XWDLD: - value->rValue = model->HSMHV2_xwdld; - return(OK); - case HSMHV2_MOD_RDVD: - value->rValue = model->HSMHV2_rdvd; - return(OK); - case HSMHV2_MOD_RD20: - value->rValue = model->HSMHV2_rd20; - return(OK); - case HSMHV2_MOD_RD21: - value->rValue = model->HSMHV2_rd21; - return(OK); - case HSMHV2_MOD_RD22: - value->rValue = model->HSMHV2_rd22; - return(OK); - case HSMHV2_MOD_RD22D: - value->rValue = model->HSMHV2_rd22d; - return(OK); - case HSMHV2_MOD_RD23: - value->rValue = model->HSMHV2_rd23; - return(OK); - case HSMHV2_MOD_RD24: - value->rValue = model->HSMHV2_rd24; - return(OK); - case HSMHV2_MOD_RD25: - value->rValue = model->HSMHV2_rd25; - return(OK); - case HSMHV2_MOD_RDVDL: - value->rValue = model->HSMHV2_rdvdl; - return(OK); - case HSMHV2_MOD_RDVDLP: - value->rValue = model->HSMHV2_rdvdlp; - return(OK); - case HSMHV2_MOD_RDVDS: - value->rValue = model->HSMHV2_rdvds; - return(OK); - case HSMHV2_MOD_RDVDSP: - value->rValue = model->HSMHV2_rdvdsp; - return(OK); - case HSMHV2_MOD_RD23L: - value->rValue = model->HSMHV2_rd23l; - return(OK); - case HSMHV2_MOD_RD23LP: - value->rValue = model->HSMHV2_rd23lp; - return(OK); - case HSMHV2_MOD_RD23S: - value->rValue = model->HSMHV2_rd23s; - return(OK); - case HSMHV2_MOD_RD23SP: - value->rValue = model->HSMHV2_rd23sp; - return(OK); - case HSMHV2_MOD_RDS: - value->rValue = model->HSMHV2_rds; - return(OK); - case HSMHV2_MOD_RDSP: - value->rValue = model->HSMHV2_rdsp; - return(OK); - case HSMHV2_MOD_RDTEMP1: - value->rValue = model->HSMHV2_rdtemp1; - return(OK); - case HSMHV2_MOD_RDTEMP2: - value->rValue = model->HSMHV2_rdtemp2; - return(OK); - case HSMHV2_MOD_RTH0R: - value->rValue = model->HSMHV2_rth0r; - return(OK); - case HSMHV2_MOD_RDVDTEMP1: - value->rValue = model->HSMHV2_rdvdtemp1; - return(OK); - case HSMHV2_MOD_RDVDTEMP2: - value->rValue = model->HSMHV2_rdvdtemp2; - return(OK); - case HSMHV2_MOD_RTH0W: - value->rValue = model->HSMHV2_rth0w; - return(OK); - case HSMHV2_MOD_RTH0WP: - value->rValue = model->HSMHV2_rth0wp; - return(OK); - case HSMHV2_MOD_CVDSOVER: - value->rValue = model->HSMHV2_cvdsover; - return(OK); - - case HSMHV2_MOD_NINVD: - value->rValue = model->HSMHV2_ninvd; - return(OK); - case HSMHV2_MOD_NINVDW: - value->rValue = model->HSMHV2_ninvdw; - return(OK); - case HSMHV2_MOD_NINVDWP: - value->rValue = model->HSMHV2_ninvdwp; - return(OK); - case HSMHV2_MOD_NINVDT1: - value->rValue = model->HSMHV2_ninvdt1; - return(OK); - case HSMHV2_MOD_NINVDT2: - value->rValue = model->HSMHV2_ninvdt2; - return(OK); - case HSMHV2_MOD_VBSMIN: - value->rValue = model->HSMHV2_vbsmin; - return(OK); - case HSMHV2_MOD_RDVB: - value->rValue = model->HSMHV2_rdvb; - return(OK); - case HSMHV2_MOD_RTH0NF: - value->rValue = model->HSMHV2_rth0nf; - return(OK); - - case HSMHV2_MOD_RDVSUB: - value->rValue = model->HSMHV2_rdvsub; - return(OK); - case HSMHV2_MOD_RDVDSUB: - value->rValue = model->HSMHV2_rdvdsub; - return(OK); - case HSMHV2_MOD_DDRIFT: - value->rValue = model->HSMHV2_ddrift; - return(OK); - case HSMHV2_MOD_VBISUB: - value->rValue = model->HSMHV2_vbisub; - return(OK); - case HSMHV2_MOD_NSUBSUB: - value->rValue = model->HSMHV2_nsubsub; - return(OK); - - case HSMHV2_MOD_RDRMUE: - value->rValue = model->HSMHV2_rdrmue; - return(OK); - case HSMHV2_MOD_RDRVMAX: - value->rValue = model->HSMHV2_rdrvmax; - return(OK); - case HSMHV2_MOD_RDRMUETMP: - value->rValue = model->HSMHV2_rdrmuetmp; - return(OK); - case HSMHV2_MOD_RDRVTMP: - value->rValue = model->HSMHV2_rdrvtmp; - return(OK); - case HSMHV2_MOD_NDEPM: - value->rValue = model->HSMHV2_ndepm; - return(OK); - case HSMHV2_MOD_TNDEP: - value->rValue = model->HSMHV2_tndep; - return(OK); - case HSMHV2_MOD_DEPMUE0: - value->rValue = model->HSMHV2_depmue0; - return(OK); - case HSMHV2_MOD_DEPMUE1: - value->rValue = model->HSMHV2_depmue1; - return(OK); - case HSMHV2_MOD_DEPMUEBACK0: - value->rValue = model->HSMHV2_depmueback0; - return(OK); - case HSMHV2_MOD_DEPMUEBACK1: - value->rValue = model->HSMHV2_depmueback1; - return(OK); - case HSMHV2_MOD_DEPLEAK: - value->rValue = model->HSMHV2_depleak; - return(OK); - case HSMHV2_MOD_DEPETA: - value->rValue = model->HSMHV2_depeta; - return(OK); - case HSMHV2_MOD_DEPVMAX: - value->rValue = model->HSMHV2_depvmax; - return(OK); - case HSMHV2_MOD_DEPVDSEF1: - value->rValue = model->HSMHV2_depvdsef1; - return(OK); - case HSMHV2_MOD_DEPVDSEF2: - value->rValue = model->HSMHV2_depvdsef2; - return(OK); - case HSMHV2_MOD_DEPMUEPH0: - value->rValue = model->HSMHV2_depmueph0; - return(OK); - case HSMHV2_MOD_DEPMUEPH1: - value->rValue = model->HSMHV2_depmueph1; - return(OK); - case HSMHV2_MOD_DEPBB: - value->rValue = model->HSMHV2_depbb; - return(OK); - case HSMHV2_MOD_DEPVTMP: - value->rValue = model->HSMHV2_depvtmp; - return(OK); - case HSMHV2_MOD_DEPMUETMP: - value->rValue = model->HSMHV2_depmuetmp; - return(OK); - - case HSMHV2_MOD_ISBREAK: - value->rValue = model->HSMHV2_isbreak; - return(OK); - case HSMHV2_MOD_RWELL: - value->rValue = model->HSMHV2_rwell; - return(OK); - - -/* case HSMHV2_MOD_RDRVMAXT1: */ -/* value->rValue = model->HSMHV2_rdrvmaxt1; */ -/* return(OK); */ -/* case HSMHV2_MOD_RDRVMAXT2: */ -/* value->rValue = model->HSMHV2_rdrvmaxt2; */ -/* return(OK); */ - case HSMHV2_MOD_RDRDJUNC: - value->rValue = model->HSMHV2_rdrdjunc; - return(OK); - case HSMHV2_MOD_RDRCX: - value->rValue = model->HSMHV2_rdrcx; - return(OK); - case HSMHV2_MOD_RDRCAR: - value->rValue = model->HSMHV2_rdrcar; - return(OK); - case HSMHV2_MOD_RDRDL1: - value->rValue = model->HSMHV2_rdrdl1; - return(OK); - case HSMHV2_MOD_RDRDL2: - value->rValue = model->HSMHV2_rdrdl2; - return(OK); - case HSMHV2_MOD_RDRVMAXW: - value->rValue = model->HSMHV2_rdrvmaxw; - return(OK); - case HSMHV2_MOD_RDRVMAXWP: - value->rValue = model->HSMHV2_rdrvmaxwp; - return(OK); - case HSMHV2_MOD_RDRVMAXL: - value->rValue = model->HSMHV2_rdrvmaxl; - return(OK); - case HSMHV2_MOD_RDRVMAXLP: - value->rValue = model->HSMHV2_rdrvmaxlp; - return(OK); - case HSMHV2_MOD_RDRMUEL: - value->rValue = model->HSMHV2_rdrmuel; - return(OK); - case HSMHV2_MOD_RDRMUELP: - value->rValue = model->HSMHV2_rdrmuelp; - return(OK); - case HSMHV2_MOD_RDRQOVER: - value->rValue = model->HSMHV2_rdrqover; - return(OK); - case HSMHV2_MOD_QOVADD: - value->rValue = model->HSMHV2_qovadd; - return(OK); - case HSMHV2_MOD_JS0D: - value->rValue = model->HSMHV2_js0d; - return(OK); - case HSMHV2_MOD_JS0SWD: - value->rValue = model->HSMHV2_js0swd; - return(OK); - case HSMHV2_MOD_NJD: - value->rValue = model->HSMHV2_njd; - return(OK); - case HSMHV2_MOD_NJSWD: - value->rValue = model->HSMHV2_njswd; - return(OK); - case HSMHV2_MOD_XTID: - value->rValue = model->HSMHV2_xtid; - return(OK); - case HSMHV2_MOD_CJD: - value->rValue = model->HSMHV2_cjd; - return(OK); - case HSMHV2_MOD_CJSWD: - value->rValue = model->HSMHV2_cjswd; - return(OK); - case HSMHV2_MOD_CJSWGD: - value->rValue = model->HSMHV2_cjswgd; - return(OK); - case HSMHV2_MOD_MJD: - value->rValue = model->HSMHV2_mjd; - return(OK); - case HSMHV2_MOD_MJSWD: - value->rValue = model->HSMHV2_mjswd; - return(OK); - case HSMHV2_MOD_MJSWGD: - value->rValue = model->HSMHV2_mjswgd; - return(OK); - case HSMHV2_MOD_PBD: - value->rValue = model->HSMHV2_pbd; - return(OK); - case HSMHV2_MOD_PBSWD: - value->rValue = model->HSMHV2_pbswd; - return(OK); - case HSMHV2_MOD_PBSWDG: - value->rValue = model->HSMHV2_pbswgd; - return(OK); - case HSMHV2_MOD_XTI2D: - value->rValue = model->HSMHV2_xti2d; - return(OK); - case HSMHV2_MOD_CISBD: - value->rValue = model->HSMHV2_cisbd; - return(OK); - case HSMHV2_MOD_CVBD: - value->rValue = model->HSMHV2_cvbd; - return(OK); - case HSMHV2_MOD_CTEMPD: - value->rValue = model->HSMHV2_ctempd; - return(OK); - case HSMHV2_MOD_CISBKD: - value->rValue = model->HSMHV2_cisbkd; - return(OK); - case HSMHV2_MOD_DIVXD: - value->rValue = model->HSMHV2_divxd; - return(OK); - case HSMHV2_MOD_VDIFFJD: - value->rValue = model->HSMHV2_vdiffjd; - return(OK); - case HSMHV2_MOD_JS0S: - value->rValue = model->HSMHV2_js0s; - return(OK); - case HSMHV2_MOD_JS0SWS: - value->rValue = model->HSMHV2_js0sws; - return(OK); - case HSMHV2_MOD_NJS: - value->rValue = model->HSMHV2_njs; - return(OK); - case HSMHV2_MOD_NJSWS: - value->rValue = model->HSMHV2_njsws; - return(OK); - case HSMHV2_MOD_XTIS: - value->rValue = model->HSMHV2_xtis; - return(OK); - case HSMHV2_MOD_CJS: - value->rValue = model->HSMHV2_cjs; - return(OK); - case HSMHV2_MOD_CJSSW: - value->rValue = model->HSMHV2_cjsws; - return(OK); - case HSMHV2_MOD_CJSWGS: - value->rValue = model->HSMHV2_cjswgs; - return(OK); - case HSMHV2_MOD_MJS: - value->rValue = model->HSMHV2_mjs; - return(OK); - case HSMHV2_MOD_MJSWS: - value->rValue = model->HSMHV2_mjsws; - return(OK); - case HSMHV2_MOD_MJSWGS: - value->rValue = model->HSMHV2_mjswgs; - return(OK); - case HSMHV2_MOD_PBS: - value->rValue = model->HSMHV2_pbs; - return(OK); - case HSMHV2_MOD_PBSWS: - value->rValue = model->HSMHV2_pbsws; - return(OK); - case HSMHV2_MOD_PBSWSG: - value->rValue = model->HSMHV2_pbswgs; - return(OK); - case HSMHV2_MOD_XTI2S: - value->rValue = model->HSMHV2_xti2s; - return(OK); - case HSMHV2_MOD_CISBS: - value->rValue = model->HSMHV2_cisbs; - return(OK); - case HSMHV2_MOD_CVBS: - value->rValue = model->HSMHV2_cvbs; - return(OK); - case HSMHV2_MOD_CTEMPS: - value->rValue = model->HSMHV2_ctemps; - return(OK); - case HSMHV2_MOD_CISBKS: - value->rValue = model->HSMHV2_cisbks; - return(OK); - case HSMHV2_MOD_DIVXS: - value->rValue = model->HSMHV2_divxs; - return(OK); - case HSMHV2_MOD_VDIFFJS: - value->rValue = model->HSMHV2_vdiffjs; - return(OK); - case HSMHV2_MOD_SHEMAX: - value->rValue = model->HSMHV2_shemax; - return(OK); - case HSMHV2_MOD_VGSMIN: - value->rValue = model->HSMHV2_vgsmin; - return(OK); - case HSMHV2_MOD_GDSLEAK: - value->rValue = model->HSMHV2_gdsleak; - return(OK); - case HSMHV2_MOD_RDRBB: - value->rValue = model->HSMHV2_rdrbb; - return(OK); - case HSMHV2_MOD_RDRBBTMP: - value->rValue = model->HSMHV2_rdrbbtmp; - return(OK); - - /* binning parameters */ - case HSMHV2_MOD_LMIN: - value->rValue = model->HSMHV2_lmin; - return(OK); - case HSMHV2_MOD_LMAX: - value->rValue = model->HSMHV2_lmax; - return(OK); - case HSMHV2_MOD_WMIN: - value->rValue = model->HSMHV2_wmin; - return(OK); - case HSMHV2_MOD_WMAX: - value->rValue = model->HSMHV2_wmax; - return(OK); - case HSMHV2_MOD_LBINN: - value->rValue = model->HSMHV2_lbinn; - return(OK); - case HSMHV2_MOD_WBINN: - value->rValue = model->HSMHV2_wbinn; - return(OK); - - /* Length dependence */ - case HSMHV2_MOD_LVMAX: - value->rValue = model->HSMHV2_lvmax; - return(OK); - case HSMHV2_MOD_LBGTMP1: - value->rValue = model->HSMHV2_lbgtmp1; - return(OK); - case HSMHV2_MOD_LBGTMP2: - value->rValue = model->HSMHV2_lbgtmp2; - return(OK); - case HSMHV2_MOD_LEG0: - value->rValue = model->HSMHV2_leg0; - return(OK); - case HSMHV2_MOD_LVFBOVER: - value->rValue = model->HSMHV2_lvfbover; - return(OK); - case HSMHV2_MOD_LNOVER: - value->rValue = model->HSMHV2_lnover; - return(OK); - case HSMHV2_MOD_LNOVERS: - value->rValue = model->HSMHV2_lnovers; - return(OK); - case HSMHV2_MOD_LWL2: - value->rValue = model->HSMHV2_lwl2; - return(OK); - case HSMHV2_MOD_LVFBC: - value->rValue = model->HSMHV2_lvfbc; - return(OK); - case HSMHV2_MOD_LNSUBC: - value->rValue = model->HSMHV2_lnsubc; - return(OK); - case HSMHV2_MOD_LNSUBP: - value->rValue = model->HSMHV2_lnsubp; - return(OK); - case HSMHV2_MOD_LSCP1: - value->rValue = model->HSMHV2_lscp1; - return(OK); - case HSMHV2_MOD_LSCP2: - value->rValue = model->HSMHV2_lscp2; - return(OK); - case HSMHV2_MOD_LSCP3: - value->rValue = model->HSMHV2_lscp3; - return(OK); - case HSMHV2_MOD_LSC1: - value->rValue = model->HSMHV2_lsc1; - return(OK); - case HSMHV2_MOD_LSC2: - value->rValue = model->HSMHV2_lsc2; - return(OK); - case HSMHV2_MOD_LSC3: - value->rValue = model->HSMHV2_lsc3; - return(OK); - case HSMHV2_MOD_LPGD1: - value->rValue = model->HSMHV2_lpgd1; - return(OK); - case HSMHV2_MOD_LNDEP: - value->rValue = model->HSMHV2_lndep; - return(OK); - case HSMHV2_MOD_LNINV: - value->rValue = model->HSMHV2_lninv; - return(OK); - case HSMHV2_MOD_LMUECB0: - value->rValue = model->HSMHV2_lmuecb0; - return(OK); - case HSMHV2_MOD_LMUECB1: - value->rValue = model->HSMHV2_lmuecb1; - return(OK); - case HSMHV2_MOD_LMUEPH1: - value->rValue = model->HSMHV2_lmueph1; - return(OK); - case HSMHV2_MOD_LVTMP: - value->rValue = model->HSMHV2_lvtmp; - return(OK); - case HSMHV2_MOD_LWVTH0: - value->rValue = model->HSMHV2_lwvth0; - return(OK); - case HSMHV2_MOD_LMUESR1: - value->rValue = model->HSMHV2_lmuesr1; - return(OK); - case HSMHV2_MOD_LMUETMP: - value->rValue = model->HSMHV2_lmuetmp; - return(OK); - case HSMHV2_MOD_LSUB1: - value->rValue = model->HSMHV2_lsub1; - return(OK); - case HSMHV2_MOD_LSUB2: - value->rValue = model->HSMHV2_lsub2; - return(OK); - case HSMHV2_MOD_LSVDS: - value->rValue = model->HSMHV2_lsvds; - return(OK); - case HSMHV2_MOD_LSVBS: - value->rValue = model->HSMHV2_lsvbs; - return(OK); - case HSMHV2_MOD_LSVGS: - value->rValue = model->HSMHV2_lsvgs; - return(OK); - case HSMHV2_MOD_LFN1: - value->rValue = model->HSMHV2_lfn1; - return(OK); - case HSMHV2_MOD_LFN2: - value->rValue = model->HSMHV2_lfn2; - return(OK); - case HSMHV2_MOD_LFN3: - value->rValue = model->HSMHV2_lfn3; - return(OK); - case HSMHV2_MOD_LFVBS: - value->rValue = model->HSMHV2_lfvbs; - return(OK); - case HSMHV2_MOD_LNSTI: - value->rValue = model->HSMHV2_lnsti; - return(OK); - case HSMHV2_MOD_LWSTI: - value->rValue = model->HSMHV2_lwsti; - return(OK); - case HSMHV2_MOD_LSCSTI1: - value->rValue = model->HSMHV2_lscsti1; - return(OK); - case HSMHV2_MOD_LSCSTI2: - value->rValue = model->HSMHV2_lscsti2; - return(OK); - case HSMHV2_MOD_LVTHSTI: - value->rValue = model->HSMHV2_lvthsti; - return(OK); - case HSMHV2_MOD_LMUESTI1: - value->rValue = model->HSMHV2_lmuesti1; - return(OK); - case HSMHV2_MOD_LMUESTI2: - value->rValue = model->HSMHV2_lmuesti2; - return(OK); - case HSMHV2_MOD_LMUESTI3: - value->rValue = model->HSMHV2_lmuesti3; - return(OK); - case HSMHV2_MOD_LNSUBPSTI1: - value->rValue = model->HSMHV2_lnsubpsti1; - return(OK); - case HSMHV2_MOD_LNSUBPSTI2: - value->rValue = model->HSMHV2_lnsubpsti2; - return(OK); - case HSMHV2_MOD_LNSUBPSTI3: - value->rValue = model->HSMHV2_lnsubpsti3; - return(OK); - case HSMHV2_MOD_LCGSO: - value->rValue = model->HSMHV2_lcgso; - return(OK); - case HSMHV2_MOD_LCGDO: - value->rValue = model->HSMHV2_lcgdo; - return(OK); - case HSMHV2_MOD_LJS0: - value->rValue = model->HSMHV2_ljs0; - return(OK); - case HSMHV2_MOD_LJS0SW: - value->rValue = model->HSMHV2_ljs0sw; - return(OK); - case HSMHV2_MOD_LNJ: - value->rValue = model->HSMHV2_lnj; - return(OK); - case HSMHV2_MOD_LCISBK: - value->rValue = model->HSMHV2_lcisbk; - return(OK); - case HSMHV2_MOD_LCLM1: - value->rValue = model->HSMHV2_lclm1; - return(OK); - case HSMHV2_MOD_LCLM2: - value->rValue = model->HSMHV2_lclm2; - return(OK); - case HSMHV2_MOD_LCLM3: - value->rValue = model->HSMHV2_lclm3; - return(OK); - case HSMHV2_MOD_LWFC: - value->rValue = model->HSMHV2_lwfc; - return(OK); - case HSMHV2_MOD_LGIDL1: - value->rValue = model->HSMHV2_lgidl1; - return(OK); - case HSMHV2_MOD_LGIDL2: - value->rValue = model->HSMHV2_lgidl2; - return(OK); - case HSMHV2_MOD_LGLEAK1: - value->rValue = model->HSMHV2_lgleak1; - return(OK); - case HSMHV2_MOD_LGLEAK2: - value->rValue = model->HSMHV2_lgleak2; - return(OK); - case HSMHV2_MOD_LGLEAK3: - value->rValue = model->HSMHV2_lgleak3; - return(OK); - case HSMHV2_MOD_LGLEAK6: - value->rValue = model->HSMHV2_lgleak6; - return(OK); - case HSMHV2_MOD_LGLKSD1: - value->rValue = model->HSMHV2_lglksd1; - return(OK); - case HSMHV2_MOD_LGLKSD2: - value->rValue = model->HSMHV2_lglksd2; - return(OK); - case HSMHV2_MOD_LGLKB1: - value->rValue = model->HSMHV2_lglkb1; - return(OK); - case HSMHV2_MOD_LGLKB2: - value->rValue = model->HSMHV2_lglkb2; - return(OK); - case HSMHV2_MOD_LNFTRP: - value->rValue = model->HSMHV2_lnftrp; - return(OK); - case HSMHV2_MOD_LNFALP: - value->rValue = model->HSMHV2_lnfalp; - return(OK); - case HSMHV2_MOD_LVDIFFJ: - value->rValue = model->HSMHV2_lvdiffj; - return(OK); - case HSMHV2_MOD_LIBPC1: - value->rValue = model->HSMHV2_libpc1; - return(OK); - case HSMHV2_MOD_LIBPC2: - value->rValue = model->HSMHV2_libpc2; - return(OK); - case HSMHV2_MOD_LCGBO: - value->rValue = model->HSMHV2_lcgbo; - return(OK); - case HSMHV2_MOD_LCVDSOVER: - value->rValue = model->HSMHV2_lcvdsover; - return(OK); - case HSMHV2_MOD_LFALPH: - value->rValue = model->HSMHV2_lfalph; - return(OK); - case HSMHV2_MOD_LNPEXT: - value->rValue = model->HSMHV2_lnpext; - return(OK); - case HSMHV2_MOD_LPOWRAT: - value->rValue = model->HSMHV2_lpowrat; - return(OK); - case HSMHV2_MOD_LRD: - value->rValue = model->HSMHV2_lrd; - return(OK); - case HSMHV2_MOD_LRD22: - value->rValue = model->HSMHV2_lrd22; - return(OK); - case HSMHV2_MOD_LRD23: - value->rValue = model->HSMHV2_lrd23; - return(OK); - case HSMHV2_MOD_LRD24: - value->rValue = model->HSMHV2_lrd24; - return(OK); - case HSMHV2_MOD_LRDICT1: - value->rValue = model->HSMHV2_lrdict1; - return(OK); - case HSMHV2_MOD_LRDOV13: - value->rValue = model->HSMHV2_lrdov13; - return(OK); - case HSMHV2_MOD_LRDSLP1: - value->rValue = model->HSMHV2_lrdslp1; - return(OK); - case HSMHV2_MOD_LRDVB: - value->rValue = model->HSMHV2_lrdvb; - return(OK); - case HSMHV2_MOD_LRDVD: - value->rValue = model->HSMHV2_lrdvd; - return(OK); - case HSMHV2_MOD_LRDVG11: - value->rValue = model->HSMHV2_lrdvg11; - return(OK); - case HSMHV2_MOD_LRS: - value->rValue = model->HSMHV2_lrs; - return(OK); - case HSMHV2_MOD_LRTH0: - value->rValue = model->HSMHV2_lrth0; - return(OK); - case HSMHV2_MOD_LVOVER: - value->rValue = model->HSMHV2_lvover; - return(OK); - case HSMHV2_MOD_LJS0D: - value->rValue = model->HSMHV2_ljs0d; - return(OK); - case HSMHV2_MOD_LJS0SWD: - value->rValue = model->HSMHV2_ljs0swd; - return(OK); - case HSMHV2_MOD_LNJD: - value->rValue = model->HSMHV2_lnjd; - return(OK); - case HSMHV2_MOD_LCISBKD: - value->rValue = model->HSMHV2_lcisbkd; - return(OK); - case HSMHV2_MOD_LVDIFFJD: - value->rValue = model->HSMHV2_lvdiffjd; - return(OK); - case HSMHV2_MOD_LJS0S: - value->rValue = model->HSMHV2_ljs0s; - return(OK); - case HSMHV2_MOD_LJS0SWS: - value->rValue = model->HSMHV2_ljs0sws; - return(OK); - case HSMHV2_MOD_LNJS: - value->rValue = model->HSMHV2_lnjs; - return(OK); - case HSMHV2_MOD_LCISBKS: - value->rValue = model->HSMHV2_lcisbks; - return(OK); - case HSMHV2_MOD_LVDIFFJS: - value->rValue = model->HSMHV2_lvdiffjs; - return(OK); - - /* Width dependence */ - case HSMHV2_MOD_WVMAX: - value->rValue = model->HSMHV2_wvmax; - return(OK); - case HSMHV2_MOD_WBGTMP1: - value->rValue = model->HSMHV2_wbgtmp1; - return(OK); - case HSMHV2_MOD_WBGTMP2: - value->rValue = model->HSMHV2_wbgtmp2; - return(OK); - case HSMHV2_MOD_WEG0: - value->rValue = model->HSMHV2_weg0; - return(OK); - case HSMHV2_MOD_WVFBOVER: - value->rValue = model->HSMHV2_wvfbover; - return(OK); - case HSMHV2_MOD_WNOVER: - value->rValue = model->HSMHV2_wnover; - return(OK); - case HSMHV2_MOD_WNOVERS: - value->rValue = model->HSMHV2_wnovers; - return(OK); - case HSMHV2_MOD_WWL2: - value->rValue = model->HSMHV2_wwl2; - return(OK); - case HSMHV2_MOD_WVFBC: - value->rValue = model->HSMHV2_wvfbc; - return(OK); - case HSMHV2_MOD_WNSUBC: - value->rValue = model->HSMHV2_wnsubc; - return(OK); - case HSMHV2_MOD_WNSUBP: - value->rValue = model->HSMHV2_wnsubp; - return(OK); - case HSMHV2_MOD_WSCP1: - value->rValue = model->HSMHV2_wscp1; - return(OK); - case HSMHV2_MOD_WSCP2: - value->rValue = model->HSMHV2_wscp2; - return(OK); - case HSMHV2_MOD_WSCP3: - value->rValue = model->HSMHV2_wscp3; - return(OK); - case HSMHV2_MOD_WSC1: - value->rValue = model->HSMHV2_wsc1; - return(OK); - case HSMHV2_MOD_WSC2: - value->rValue = model->HSMHV2_wsc2; - return(OK); - case HSMHV2_MOD_WSC3: - value->rValue = model->HSMHV2_wsc3; - return(OK); - case HSMHV2_MOD_WPGD1: - value->rValue = model->HSMHV2_wpgd1; - return(OK); - case HSMHV2_MOD_WNDEP: - value->rValue = model->HSMHV2_wndep; - return(OK); - case HSMHV2_MOD_WNINV: - value->rValue = model->HSMHV2_wninv; - return(OK); - case HSMHV2_MOD_WMUECB0: - value->rValue = model->HSMHV2_wmuecb0; - return(OK); - case HSMHV2_MOD_WMUECB1: - value->rValue = model->HSMHV2_wmuecb1; - return(OK); - case HSMHV2_MOD_WMUEPH1: - value->rValue = model->HSMHV2_wmueph1; - return(OK); - case HSMHV2_MOD_WVTMP: - value->rValue = model->HSMHV2_wvtmp; - return(OK); - case HSMHV2_MOD_WWVTH0: - value->rValue = model->HSMHV2_wwvth0; - return(OK); - case HSMHV2_MOD_WMUESR1: - value->rValue = model->HSMHV2_wmuesr1; - return(OK); - case HSMHV2_MOD_WMUETMP: - value->rValue = model->HSMHV2_wmuetmp; - return(OK); - case HSMHV2_MOD_WSUB1: - value->rValue = model->HSMHV2_wsub1; - return(OK); - case HSMHV2_MOD_WSUB2: - value->rValue = model->HSMHV2_wsub2; - return(OK); - case HSMHV2_MOD_WSVDS: - value->rValue = model->HSMHV2_wsvds; - return(OK); - case HSMHV2_MOD_WSVBS: - value->rValue = model->HSMHV2_wsvbs; - return(OK); - case HSMHV2_MOD_WSVGS: - value->rValue = model->HSMHV2_wsvgs; - return(OK); - case HSMHV2_MOD_WFN1: - value->rValue = model->HSMHV2_wfn1; - return(OK); - case HSMHV2_MOD_WFN2: - value->rValue = model->HSMHV2_wfn2; - return(OK); - case HSMHV2_MOD_WFN3: - value->rValue = model->HSMHV2_wfn3; - return(OK); - case HSMHV2_MOD_WFVBS: - value->rValue = model->HSMHV2_wfvbs; - return(OK); - case HSMHV2_MOD_WNSTI: - value->rValue = model->HSMHV2_wnsti; - return(OK); - case HSMHV2_MOD_WWSTI: - value->rValue = model->HSMHV2_wwsti; - return(OK); - case HSMHV2_MOD_WSCSTI1: - value->rValue = model->HSMHV2_wscsti1; - return(OK); - case HSMHV2_MOD_WSCSTI2: - value->rValue = model->HSMHV2_wscsti2; - return(OK); - case HSMHV2_MOD_WVTHSTI: - value->rValue = model->HSMHV2_wvthsti; - return(OK); - case HSMHV2_MOD_WMUESTI1: - value->rValue = model->HSMHV2_wmuesti1; - return(OK); - case HSMHV2_MOD_WMUESTI2: - value->rValue = model->HSMHV2_wmuesti2; - return(OK); - case HSMHV2_MOD_WMUESTI3: - value->rValue = model->HSMHV2_wmuesti3; - return(OK); - case HSMHV2_MOD_WNSUBPSTI1: - value->rValue = model->HSMHV2_wnsubpsti1; - return(OK); - case HSMHV2_MOD_WNSUBPSTI2: - value->rValue = model->HSMHV2_wnsubpsti2; - return(OK); - case HSMHV2_MOD_WNSUBPSTI3: - value->rValue = model->HSMHV2_wnsubpsti3; - return(OK); - case HSMHV2_MOD_WCGSO: - value->rValue = model->HSMHV2_wcgso; - return(OK); - case HSMHV2_MOD_WCGDO: - value->rValue = model->HSMHV2_wcgdo; - return(OK); - case HSMHV2_MOD_WJS0: - value->rValue = model->HSMHV2_wjs0; - return(OK); - case HSMHV2_MOD_WJS0SW: - value->rValue = model->HSMHV2_wjs0sw; - return(OK); - case HSMHV2_MOD_WNJ: - value->rValue = model->HSMHV2_wnj; - return(OK); - case HSMHV2_MOD_WCISBK: - value->rValue = model->HSMHV2_wcisbk; - return(OK); - case HSMHV2_MOD_WCLM1: - value->rValue = model->HSMHV2_wclm1; - return(OK); - case HSMHV2_MOD_WCLM2: - value->rValue = model->HSMHV2_wclm2; - return(OK); - case HSMHV2_MOD_WCLM3: - value->rValue = model->HSMHV2_wclm3; - return(OK); - case HSMHV2_MOD_WWFC: - value->rValue = model->HSMHV2_wwfc; - return(OK); - case HSMHV2_MOD_WGIDL1: - value->rValue = model->HSMHV2_wgidl1; - return(OK); - case HSMHV2_MOD_WGIDL2: - value->rValue = model->HSMHV2_wgidl2; - return(OK); - case HSMHV2_MOD_WGLEAK1: - value->rValue = model->HSMHV2_wgleak1; - return(OK); - case HSMHV2_MOD_WGLEAK2: - value->rValue = model->HSMHV2_wgleak2; - return(OK); - case HSMHV2_MOD_WGLEAK3: - value->rValue = model->HSMHV2_wgleak3; - return(OK); - case HSMHV2_MOD_WGLEAK6: - value->rValue = model->HSMHV2_wgleak6; - return(OK); - case HSMHV2_MOD_WGLKSD1: - value->rValue = model->HSMHV2_wglksd1; - return(OK); - case HSMHV2_MOD_WGLKSD2: - value->rValue = model->HSMHV2_wglksd2; - return(OK); - case HSMHV2_MOD_WGLKB1: - value->rValue = model->HSMHV2_wglkb1; - return(OK); - case HSMHV2_MOD_WGLKB2: - value->rValue = model->HSMHV2_wglkb2; - return(OK); - case HSMHV2_MOD_WNFTRP: - value->rValue = model->HSMHV2_wnftrp; - return(OK); - case HSMHV2_MOD_WNFALP: - value->rValue = model->HSMHV2_wnfalp; - return(OK); - case HSMHV2_MOD_WVDIFFJ: - value->rValue = model->HSMHV2_wvdiffj; - return(OK); - case HSMHV2_MOD_WIBPC1: - value->rValue = model->HSMHV2_wibpc1; - return(OK); - case HSMHV2_MOD_WIBPC2: - value->rValue = model->HSMHV2_wibpc2; - return(OK); - case HSMHV2_MOD_WCGBO: - value->rValue = model->HSMHV2_wcgbo; - return(OK); - case HSMHV2_MOD_WCVDSOVER: - value->rValue = model->HSMHV2_wcvdsover; - return(OK); - case HSMHV2_MOD_WFALPH: - value->rValue = model->HSMHV2_wfalph; - return(OK); - case HSMHV2_MOD_WNPEXT: - value->rValue = model->HSMHV2_wnpext; - return(OK); - case HSMHV2_MOD_WPOWRAT: - value->rValue = model->HSMHV2_wpowrat; - return(OK); - case HSMHV2_MOD_WRD: - value->rValue = model->HSMHV2_wrd; - return(OK); - case HSMHV2_MOD_WRD22: - value->rValue = model->HSMHV2_wrd22; - return(OK); - case HSMHV2_MOD_WRD23: - value->rValue = model->HSMHV2_wrd23; - return(OK); - case HSMHV2_MOD_WRD24: - value->rValue = model->HSMHV2_wrd24; - return(OK); - case HSMHV2_MOD_WRDICT1: - value->rValue = model->HSMHV2_wrdict1; - return(OK); - case HSMHV2_MOD_WRDOV13: - value->rValue = model->HSMHV2_wrdov13; - return(OK); - case HSMHV2_MOD_WRDSLP1: - value->rValue = model->HSMHV2_wrdslp1; - return(OK); - case HSMHV2_MOD_WRDVB: - value->rValue = model->HSMHV2_wrdvb; - return(OK); - case HSMHV2_MOD_WRDVD: - value->rValue = model->HSMHV2_wrdvd; - return(OK); - case HSMHV2_MOD_WRDVG11: - value->rValue = model->HSMHV2_wrdvg11; - return(OK); - case HSMHV2_MOD_WRS: - value->rValue = model->HSMHV2_wrs; - return(OK); - case HSMHV2_MOD_WRTH0: - value->rValue = model->HSMHV2_wrth0; - return(OK); - case HSMHV2_MOD_WVOVER: - value->rValue = model->HSMHV2_wvover; - return(OK); - case HSMHV2_MOD_WJS0D: - value->rValue = model->HSMHV2_wjs0d; - return(OK); - case HSMHV2_MOD_WJS0SWD: - value->rValue = model->HSMHV2_wjs0swd; - return(OK); - case HSMHV2_MOD_WNJD: - value->rValue = model->HSMHV2_wnjd; - return(OK); - case HSMHV2_MOD_WCISBKD: - value->rValue = model->HSMHV2_wcisbkd; - return(OK); - case HSMHV2_MOD_WVDIFFJD: - value->rValue = model->HSMHV2_wvdiffjd; - return(OK); - case HSMHV2_MOD_WJS0S: - value->rValue = model->HSMHV2_wjs0s; - return(OK); - case HSMHV2_MOD_WJS0SWS: - value->rValue = model->HSMHV2_wjs0sws; - return(OK); - case HSMHV2_MOD_WNJS: - value->rValue = model->HSMHV2_wnjs; - return(OK); - case HSMHV2_MOD_WCISBKS: - value->rValue = model->HSMHV2_wcisbks; - return(OK); - case HSMHV2_MOD_WVDIFFJS: - value->rValue = model->HSMHV2_wvdiffjs; - return(OK); - - /* Cross-term dependence */ - case HSMHV2_MOD_PVMAX: - value->rValue = model->HSMHV2_pvmax; - return(OK); - case HSMHV2_MOD_PBGTMP1: - value->rValue = model->HSMHV2_pbgtmp1; - return(OK); - case HSMHV2_MOD_PBGTMP2: - value->rValue = model->HSMHV2_pbgtmp2; - return(OK); - case HSMHV2_MOD_PEG0: - value->rValue = model->HSMHV2_peg0; - return(OK); - case HSMHV2_MOD_PVFBOVER: - value->rValue = model->HSMHV2_pvfbover; - return(OK); - case HSMHV2_MOD_PNOVER: - value->rValue = model->HSMHV2_pnover; - return(OK); - case HSMHV2_MOD_PNOVERS: - value->rValue = model->HSMHV2_pnovers; - return(OK); - case HSMHV2_MOD_PWL2: - value->rValue = model->HSMHV2_pwl2; - return(OK); - case HSMHV2_MOD_PVFBC: - value->rValue = model->HSMHV2_pvfbc; - return(OK); - case HSMHV2_MOD_PNSUBC: - value->rValue = model->HSMHV2_pnsubc; - return(OK); - case HSMHV2_MOD_PNSUBP: - value->rValue = model->HSMHV2_pnsubp; - return(OK); - case HSMHV2_MOD_PSCP1: - value->rValue = model->HSMHV2_pscp1; - return(OK); - case HSMHV2_MOD_PSCP2: - value->rValue = model->HSMHV2_pscp2; - return(OK); - case HSMHV2_MOD_PSCP3: - value->rValue = model->HSMHV2_pscp3; - return(OK); - case HSMHV2_MOD_PSC1: - value->rValue = model->HSMHV2_psc1; - return(OK); - case HSMHV2_MOD_PSC2: - value->rValue = model->HSMHV2_psc2; - return(OK); - case HSMHV2_MOD_PSC3: - value->rValue = model->HSMHV2_psc3; - return(OK); - case HSMHV2_MOD_PPGD1: - value->rValue = model->HSMHV2_ppgd1; - return(OK); - case HSMHV2_MOD_PNDEP: - value->rValue = model->HSMHV2_pndep; - return(OK); - case HSMHV2_MOD_PNINV: - value->rValue = model->HSMHV2_pninv; - return(OK); - case HSMHV2_MOD_PMUECB0: - value->rValue = model->HSMHV2_pmuecb0; - return(OK); - case HSMHV2_MOD_PMUECB1: - value->rValue = model->HSMHV2_pmuecb1; - return(OK); - case HSMHV2_MOD_PMUEPH1: - value->rValue = model->HSMHV2_pmueph1; - return(OK); - case HSMHV2_MOD_PVTMP: - value->rValue = model->HSMHV2_pvtmp; - return(OK); - case HSMHV2_MOD_PWVTH0: - value->rValue = model->HSMHV2_pwvth0; - return(OK); - case HSMHV2_MOD_PMUESR1: - value->rValue = model->HSMHV2_pmuesr1; - return(OK); - case HSMHV2_MOD_PMUETMP: - value->rValue = model->HSMHV2_pmuetmp; - return(OK); - case HSMHV2_MOD_PSUB1: - value->rValue = model->HSMHV2_psub1; - return(OK); - case HSMHV2_MOD_PSUB2: - value->rValue = model->HSMHV2_psub2; - return(OK); - case HSMHV2_MOD_PSVDS: - value->rValue = model->HSMHV2_psvds; - return(OK); - case HSMHV2_MOD_PSVBS: - value->rValue = model->HSMHV2_psvbs; - return(OK); - case HSMHV2_MOD_PSVGS: - value->rValue = model->HSMHV2_psvgs; - return(OK); - case HSMHV2_MOD_PFN1: - value->rValue = model->HSMHV2_pfn1; - return(OK); - case HSMHV2_MOD_PFN2: - value->rValue = model->HSMHV2_pfn2; - return(OK); - case HSMHV2_MOD_PFN3: - value->rValue = model->HSMHV2_pfn3; - return(OK); - case HSMHV2_MOD_PFVBS: - value->rValue = model->HSMHV2_pfvbs; - return(OK); - case HSMHV2_MOD_PNSTI: - value->rValue = model->HSMHV2_pnsti; - return(OK); - case HSMHV2_MOD_PWSTI: - value->rValue = model->HSMHV2_pwsti; - return(OK); - case HSMHV2_MOD_PSCSTI1: - value->rValue = model->HSMHV2_pscsti1; - return(OK); - case HSMHV2_MOD_PSCSTI2: - value->rValue = model->HSMHV2_pscsti2; - return(OK); - case HSMHV2_MOD_PVTHSTI: - value->rValue = model->HSMHV2_pvthsti; - return(OK); - case HSMHV2_MOD_PMUESTI1: - value->rValue = model->HSMHV2_pmuesti1; - return(OK); - case HSMHV2_MOD_PMUESTI2: - value->rValue = model->HSMHV2_pmuesti2; - return(OK); - case HSMHV2_MOD_PMUESTI3: - value->rValue = model->HSMHV2_pmuesti3; - return(OK); - case HSMHV2_MOD_PNSUBPSTI1: - value->rValue = model->HSMHV2_pnsubpsti1; - return(OK); - case HSMHV2_MOD_PNSUBPSTI2: - value->rValue = model->HSMHV2_pnsubpsti2; - return(OK); - case HSMHV2_MOD_PNSUBPSTI3: - value->rValue = model->HSMHV2_pnsubpsti3; - return(OK); - case HSMHV2_MOD_PCGSO: - value->rValue = model->HSMHV2_pcgso; - return(OK); - case HSMHV2_MOD_PCGDO: - value->rValue = model->HSMHV2_pcgdo; - return(OK); - case HSMHV2_MOD_PJS0: - value->rValue = model->HSMHV2_pjs0; - return(OK); - case HSMHV2_MOD_PJS0SW: - value->rValue = model->HSMHV2_pjs0sw; - return(OK); - case HSMHV2_MOD_PNJ: - value->rValue = model->HSMHV2_pnj; - return(OK); - case HSMHV2_MOD_PCISBK: - value->rValue = model->HSMHV2_pcisbk; - return(OK); - case HSMHV2_MOD_PCLM1: - value->rValue = model->HSMHV2_pclm1; - return(OK); - case HSMHV2_MOD_PCLM2: - value->rValue = model->HSMHV2_pclm2; - return(OK); - case HSMHV2_MOD_PCLM3: - value->rValue = model->HSMHV2_pclm3; - return(OK); - case HSMHV2_MOD_PWFC: - value->rValue = model->HSMHV2_pwfc; - return(OK); - case HSMHV2_MOD_PGIDL1: - value->rValue = model->HSMHV2_pgidl1; - return(OK); - case HSMHV2_MOD_PGIDL2: - value->rValue = model->HSMHV2_pgidl2; - return(OK); - case HSMHV2_MOD_PGLEAK1: - value->rValue = model->HSMHV2_pgleak1; - return(OK); - case HSMHV2_MOD_PGLEAK2: - value->rValue = model->HSMHV2_pgleak2; - return(OK); - case HSMHV2_MOD_PGLEAK3: - value->rValue = model->HSMHV2_pgleak3; - return(OK); - case HSMHV2_MOD_PGLEAK6: - value->rValue = model->HSMHV2_pgleak6; - return(OK); - case HSMHV2_MOD_PGLKSD1: - value->rValue = model->HSMHV2_pglksd1; - return(OK); - case HSMHV2_MOD_PGLKSD2: - value->rValue = model->HSMHV2_pglksd2; - return(OK); - case HSMHV2_MOD_PGLKB1: - value->rValue = model->HSMHV2_pglkb1; - return(OK); - case HSMHV2_MOD_PGLKB2: - value->rValue = model->HSMHV2_pglkb2; - return(OK); - case HSMHV2_MOD_PNFTRP: - value->rValue = model->HSMHV2_pnftrp; - return(OK); - case HSMHV2_MOD_PNFALP: - value->rValue = model->HSMHV2_pnfalp; - return(OK); - case HSMHV2_MOD_PVDIFFJ: - value->rValue = model->HSMHV2_pvdiffj; - return(OK); - case HSMHV2_MOD_PIBPC1: - value->rValue = model->HSMHV2_pibpc1; - return(OK); - case HSMHV2_MOD_PIBPC2: - value->rValue = model->HSMHV2_pibpc2; - return(OK); - case HSMHV2_MOD_PCGBO: - value->rValue = model->HSMHV2_pcgbo; - return(OK); - case HSMHV2_MOD_PCVDSOVER: - value->rValue = model->HSMHV2_pcvdsover; - return(OK); - case HSMHV2_MOD_PFALPH: - value->rValue = model->HSMHV2_pfalph; - return(OK); - case HSMHV2_MOD_PNPEXT: - value->rValue = model->HSMHV2_pnpext; - return(OK); - case HSMHV2_MOD_PPOWRAT: - value->rValue = model->HSMHV2_ppowrat; - return(OK); - case HSMHV2_MOD_PRD: - value->rValue = model->HSMHV2_prd; - return(OK); - case HSMHV2_MOD_PRD22: - value->rValue = model->HSMHV2_prd22; - return(OK); - case HSMHV2_MOD_PRD23: - value->rValue = model->HSMHV2_prd23; - return(OK); - case HSMHV2_MOD_PRD24: - value->rValue = model->HSMHV2_prd24; - return(OK); - case HSMHV2_MOD_PRDICT1: - value->rValue = model->HSMHV2_prdict1; - return(OK); - case HSMHV2_MOD_PRDOV13: - value->rValue = model->HSMHV2_prdov13; - return(OK); - case HSMHV2_MOD_PRDSLP1: - value->rValue = model->HSMHV2_prdslp1; - return(OK); - case HSMHV2_MOD_PRDVB: - value->rValue = model->HSMHV2_prdvb; - return(OK); - case HSMHV2_MOD_PRDVD: - value->rValue = model->HSMHV2_prdvd; - return(OK); - case HSMHV2_MOD_PRDVG11: - value->rValue = model->HSMHV2_prdvg11; - return(OK); - case HSMHV2_MOD_PRS: - value->rValue = model->HSMHV2_prs; - return(OK); - case HSMHV2_MOD_PRTH0: - value->rValue = model->HSMHV2_prth0; - return(OK); - case HSMHV2_MOD_PVOVER: - value->rValue = model->HSMHV2_pvover; - return(OK); - case HSMHV2_MOD_PJS0D: - value->rValue = model->HSMHV2_pjs0d; - return(OK); - case HSMHV2_MOD_PJS0SWD: - value->rValue = model->HSMHV2_pjs0swd; - return(OK); - case HSMHV2_MOD_PNJD: - value->rValue = model->HSMHV2_pnjd; - return(OK); - case HSMHV2_MOD_PCISBKD: - value->rValue = model->HSMHV2_pcisbkd; - return(OK); - case HSMHV2_MOD_PVDIFFJD: - value->rValue = model->HSMHV2_pvdiffjd; - return(OK); - case HSMHV2_MOD_PJS0S: - value->rValue = model->HSMHV2_pjs0s; - return(OK); - case HSMHV2_MOD_PJS0SWS: - value->rValue = model->HSMHV2_pjs0sws; - return(OK); - case HSMHV2_MOD_PNJS: - value->rValue = model->HSMHV2_pnjs; - return(OK); - case HSMHV2_MOD_PCISBKS: - value->rValue = model->HSMHV2_pcisbks; - return(OK); - case HSMHV2_MOD_PVDIFFJS: - value->rValue = model->HSMHV2_pvdiffjs; - return(OK); - - case HSMHV2_MOD_VGS_MAX: - value->rValue = model->HSMHV2vgsMax; - return(OK); - case HSMHV2_MOD_VGD_MAX: - value->rValue = model->HSMHV2vgdMax; - return(OK); - case HSMHV2_MOD_VGB_MAX: - value->rValue = model->HSMHV2vgbMax; - return(OK); - case HSMHV2_MOD_VDS_MAX: - value->rValue = model->HSMHV2vdsMax; - return(OK); - case HSMHV2_MOD_VBS_MAX: - value->rValue = model->HSMHV2vbsMax; - return(OK); - case HSMHV2_MOD_VBD_MAX: - value->rValue = model->HSMHV2vbdMax; - return(OK); - case HSMHV2_MOD_VGSR_MAX: - value->rValue = model->HSMHV2vgsrMax; - return(OK); - case HSMHV2_MOD_VGDR_MAX: - value->rValue = model->HSMHV2vgdrMax; - return(OK); - case HSMHV2_MOD_VGBR_MAX: - value->rValue = model->HSMHV2vgbrMax; - return(OK); - case HSMHV2_MOD_VBSR_MAX: - value->rValue = model->HSMHV2vbsrMax; - return(OK); - case HSMHV2_MOD_VBDR_MAX: - value->rValue = model->HSMHV2vbdrMax; - return(OK); - - default: - return(E_BADPARM); - } - /* NOTREACHED */ -} diff --git a/src/spicelib/devices/hisimhv2/hsmhv2mpar.c b/src/spicelib/devices/hisimhv2/hsmhv2mpar.c deleted file mode 100644 index bf9afdcd3..000000000 --- a/src/spicelib/devices/hisimhv2/hsmhv2mpar.c +++ /dev/null @@ -1,3023 +0,0 @@ -/*********************************************************************** - - HiSIM (Hiroshima University STARC IGFET Model) - Copyright (C) 2014 Hiroshima University & STARC - - MODEL NAME : HiSIM_HV - ( VERSION : 2 SUBVERSION : 2 REVISION : 0 ) - Model Parameter 'VERSION' : 2.20 - FILE : hsmhvmpar.c - - DATE : 2014.6.11 - - released by - Hiroshima University & - Semiconductor Technology Academic Research Center (STARC) -***********************************************************************/ - -/********************************************************************** - -The following source code, and all copyrights, trade secrets or other -intellectual property rights in and to the source code in its entirety, -is owned by the Hiroshima University and the STARC organization. - -All users need to follow the "HISIM_HV Distribution Statement and -Copyright Notice" attached to HiSIM_HV model. - ------HISIM_HV Distribution Statement and Copyright Notice-------------- - -Software is distributed as is, completely without warranty or service -support. Hiroshima University or STARC and its employees are not liable -for the condition or performance of the software. - -Hiroshima University and STARC own the copyright and grant users a perpetual, -irrevocable, worldwide, non-exclusive, royalty-free license with respect -to the software as set forth below. - -Hiroshima University and STARC hereby disclaims all implied warranties. - -Hiroshima University and STARC grant the users the right to modify, copy, -and redistribute the software and documentation, both within the user's -organization and externally, subject to the following restrictions - -1. The users agree not to charge for Hiroshima University and STARC code -itself but may charge for additions, extensions, or support. - -2. In any product based on the software, the users agree to acknowledge -Hiroshima University and STARC that developed the software. This -acknowledgment shall appear in the product documentation. - -3. The users agree to reproduce any copyright notice which appears on -the software on any copy or modification of such made available -to others." - -Toshimasa Asahara, President, Hiroshima University -Mitiko Miura-Mattausch, Professor, Hiroshima University -Katsuhiro Shimohigashi, President&CEO, STARC -June 2008 (revised October 2011) -*************************************************************************/ - -#include "ngspice/ngspice.h" -#include "hsmhv2def.h" -#include "ngspice/ifsim.h" -#include "ngspice/sperror.h" -#include "ngspice/suffix.h" - -int HSMHV2mParam( - int param, - IFvalue *value, - GENmodel *inMod) -{ - HSMHV2model *mod = (HSMHV2model*)inMod; - switch (param) { - case HSMHV2_MOD_NMOS : - if (value->iValue) { - mod->HSMHV2_type = 1; - mod->HSMHV2_type_Given = TRUE; - } - break; - case HSMHV2_MOD_PMOS : - if (value->iValue) { - mod->HSMHV2_type = - 1; - mod->HSMHV2_type_Given = TRUE; - } - break; - case HSMHV2_MOD_LEVEL: - mod->HSMHV2_level = value->iValue; - mod->HSMHV2_level_Given = TRUE; - break; - case HSMHV2_MOD_INFO: - mod->HSMHV2_info = value->iValue; - mod->HSMHV2_info_Given = TRUE; - break; - case HSMHV2_MOD_NOISE: - mod->HSMHV2_noise = value->iValue; - mod->HSMHV2_noise_Given = TRUE; - break; - case HSMHV2_MOD_VERSION: - mod->HSMHV2_version = value->sValue; - mod->HSMHV2_version_Given = TRUE; - break; - case HSMHV2_MOD_SHOW: - mod->HSMHV2_show = value->iValue; - mod->HSMHV2_show_Given = TRUE; - break; - case HSMHV2_MOD_CORSRD: - mod->HSMHV2_corsrd = value->iValue; - mod->HSMHV2_corsrd_Given = TRUE; - break; - case HSMHV2_MOD_CORG: - mod->HSMHV2_corg = value->iValue; - mod->HSMHV2_corg_Given = TRUE; - break; - case HSMHV2_MOD_COIPRV: - mod->HSMHV2_coiprv = value->iValue; - mod->HSMHV2_coiprv_Given = TRUE; - break; - case HSMHV2_MOD_COPPRV: - mod->HSMHV2_copprv = value->iValue; - mod->HSMHV2_copprv_Given = TRUE; - break; - case HSMHV2_MOD_COADOV: - mod->HSMHV2_coadov = value->iValue; - mod->HSMHV2_coadov_Given = TRUE; - break; - case HSMHV2_MOD_COISUB: - mod->HSMHV2_coisub = value->iValue; - mod->HSMHV2_coisub_Given = TRUE; - break; - case HSMHV2_MOD_COIIGS: - mod->HSMHV2_coiigs = value->iValue; - mod->HSMHV2_coiigs_Given = TRUE; - break; - case HSMHV2_MOD_COGIDL: - mod->HSMHV2_cogidl = value->iValue; - mod->HSMHV2_cogidl_Given = TRUE; - break; - case HSMHV2_MOD_COOVLP: - mod->HSMHV2_coovlp = value->iValue; - mod->HSMHV2_coovlp_Given = TRUE; - break; - case HSMHV2_MOD_COOVLPS: - mod->HSMHV2_coovlps = value->iValue; - mod->HSMHV2_coovlps_Given = TRUE; - break; - case HSMHV2_MOD_COFLICK: - mod->HSMHV2_coflick = value->iValue; - mod->HSMHV2_coflick_Given = TRUE; - break; - case HSMHV2_MOD_COISTI: - mod->HSMHV2_coisti = value->iValue; - mod->HSMHV2_coisti_Given = TRUE; - break; - case HSMHV2_MOD_CONQS: /* HiSIMHV */ - mod->HSMHV2_conqs = value->iValue; - mod->HSMHV2_conqs_Given = TRUE; - break; - case HSMHV2_MOD_CORBNET: - mod->HSMHV2_corbnet = value->iValue; - mod->HSMHV2_corbnet_Given = TRUE; - break; - case HSMHV2_MOD_COTHRML: - mod->HSMHV2_cothrml = value->iValue; - mod->HSMHV2_cothrml_Given = TRUE; - break; - case HSMHV2_MOD_COIGN: - mod->HSMHV2_coign = value->iValue; - mod->HSMHV2_coign_Given = TRUE; - break; - case HSMHV2_MOD_CODFM: - mod->HSMHV2_codfm = value->iValue; - mod->HSMHV2_codfm_Given = TRUE; - break; - case HSMHV2_MOD_COQOVSM: - mod->HSMHV2_coqovsm = value->iValue; - mod->HSMHV2_coqovsm_Given = TRUE; - break; - case HSMHV2_MOD_COSELFHEAT: /* Self-heating model */ - mod->HSMHV2_coselfheat = value->iValue; - mod->HSMHV2_coselfheat_Given = TRUE; - break; - case HSMHV2_MOD_COSUBNODE: - mod->HSMHV2_cosubnode = value->iValue; - mod->HSMHV2_cosubnode_Given = TRUE; - break; - case HSMHV2_MOD_COSYM: /* Symmetry model for HV */ - mod->HSMHV2_cosym = value->iValue; - mod->HSMHV2_cosym_Given = TRUE; - break; - case HSMHV2_MOD_COTEMP: - mod->HSMHV2_cotemp = value->iValue; - mod->HSMHV2_cotemp_Given = TRUE; - break; - case HSMHV2_MOD_COLDRIFT: - mod->HSMHV2_coldrift = value->iValue; - mod->HSMHV2_coldrift_Given = TRUE; - break; - case HSMHV2_MOD_CORDRIFT: - mod->HSMHV2_cordrift = value->iValue; - mod->HSMHV2_cordrift_Given = TRUE; - break; - case HSMHV2_MOD_COERRREP: - mod->HSMHV2_coerrrep = value->iValue; - mod->HSMHV2_coerrrep_Given = TRUE; - break; - case HSMHV2_MOD_CODEP: - mod->HSMHV2_codep = value->iValue; - mod->HSMHV2_codep_Given = TRUE; - break; - case HSMHV2_MOD_CODDLT: - mod->HSMHV2_coddlt = value->iValue; - mod->HSMHV2_coddlt_Given = TRUE; - break; - case HSMHV2_MOD_VMAX: - mod->HSMHV2_vmax = value->rValue; - mod->HSMHV2_vmax_Given = TRUE; - break; - case HSMHV2_MOD_VMAXT1: - mod->HSMHV2_vmaxt1 = value->rValue; - mod->HSMHV2_vmaxt1_Given = TRUE; - break; - case HSMHV2_MOD_VMAXT2: - mod->HSMHV2_vmaxt2 = value->rValue; - mod->HSMHV2_vmaxt2_Given = TRUE; - break; - case HSMHV2_MOD_BGTMP1: - mod->HSMHV2_bgtmp1 = value->rValue; - mod->HSMHV2_bgtmp1_Given = TRUE; - break; - case HSMHV2_MOD_BGTMP2: - mod->HSMHV2_bgtmp2 = value->rValue; - mod->HSMHV2_bgtmp2_Given = TRUE; - break; - case HSMHV2_MOD_EG0: - mod->HSMHV2_eg0 = value->rValue; - mod->HSMHV2_eg0_Given = TRUE; - break; - case HSMHV2_MOD_TOX: - mod->HSMHV2_tox = value->rValue; - mod->HSMHV2_tox_Given = TRUE; - break; - case HSMHV2_MOD_XLD: - mod->HSMHV2_xld = value->rValue; - mod->HSMHV2_xld_Given = TRUE; - break; - case HSMHV2_MOD_LOVER: - mod->HSMHV2_lover = value->rValue; - mod->HSMHV2_lover_Given = TRUE; - break; - case HSMHV2_MOD_LOVERS: - mod->HSMHV2_lovers = value->rValue; - mod->HSMHV2_lovers_Given = TRUE; - break; - case HSMHV2_MOD_RDOV11: - mod->HSMHV2_rdov11 = value->rValue; - mod->HSMHV2_rdov11_Given = TRUE; - break; - case HSMHV2_MOD_RDOV12: - mod->HSMHV2_rdov12 = value->rValue; - mod->HSMHV2_rdov12_Given = TRUE; - break; - case HSMHV2_MOD_RDOV13: - mod->HSMHV2_rdov13 = value->rValue; - mod->HSMHV2_rdov13_Given = TRUE; - break; - case HSMHV2_MOD_RDSLP1: - mod->HSMHV2_rdslp1 = value->rValue; - mod->HSMHV2_rdslp1_Given = TRUE; - break; - case HSMHV2_MOD_RDICT1: - mod->HSMHV2_rdict1= value->rValue; - mod->HSMHV2_rdict1_Given = TRUE; - break; - case HSMHV2_MOD_RDSLP2: - mod->HSMHV2_rdslp2 = value->rValue; - mod->HSMHV2_rdslp2_Given = TRUE; - break; - case HSMHV2_MOD_RDICT2: - mod->HSMHV2_rdict2 = value->rValue; - mod->HSMHV2_rdict2_Given = TRUE; - break; - case HSMHV2_MOD_LOVERLD: - mod->HSMHV2_loverld = value->rValue; - mod->HSMHV2_loverld_Given = TRUE; - break; - case HSMHV2_MOD_LDRIFT1: - mod->HSMHV2_ldrift1 = value->rValue; - mod->HSMHV2_ldrift1_Given = TRUE; - break; - case HSMHV2_MOD_LDRIFT2: - mod->HSMHV2_ldrift2 = value->rValue; - mod->HSMHV2_ldrift2_Given = TRUE; - break; - case HSMHV2_MOD_LDRIFT1S: - mod->HSMHV2_ldrift1s = value->rValue; - mod->HSMHV2_ldrift1s_Given = TRUE; - break; - case HSMHV2_MOD_LDRIFT2S: - mod->HSMHV2_ldrift2s = value->rValue; - mod->HSMHV2_ldrift2s_Given = TRUE; - break; - case HSMHV2_MOD_SUBLD1: - mod->HSMHV2_subld1 = value->rValue; - mod->HSMHV2_subld1_Given = TRUE; - break; - case HSMHV2_MOD_SUBLD1L: - mod->HSMHV2_subld1l = value->rValue; - mod->HSMHV2_subld1l_Given = TRUE; - break; - case HSMHV2_MOD_SUBLD1LP: - mod->HSMHV2_subld1lp = value->rValue; - mod->HSMHV2_subld1lp_Given = TRUE; - break; - case HSMHV2_MOD_SUBLD2: - mod->HSMHV2_subld2 = value->rValue; - mod->HSMHV2_subld2_Given = TRUE; - break; - case HSMHV2_MOD_XPDV: - mod->HSMHV2_xpdv = value->rValue; - mod->HSMHV2_xpdv_Given = TRUE; - break; - case HSMHV2_MOD_XPVDTH: - mod->HSMHV2_xpvdth = value->rValue; - mod->HSMHV2_xpvdth_Given = TRUE; - break; - case HSMHV2_MOD_XPVDTHG: - mod->HSMHV2_xpvdthg = value->rValue; - mod->HSMHV2_xpvdthg_Given = TRUE; - break; - case HSMHV2_MOD_DDLTMAX: /* Vdseff */ - mod->HSMHV2_ddltmax = value->rValue; - mod->HSMHV2_ddltmax_Given = TRUE; - break; - case HSMHV2_MOD_DDLTSLP: /* Vdseff */ - mod->HSMHV2_ddltslp = value->rValue; - mod->HSMHV2_ddltslp_Given = TRUE; - break; - case HSMHV2_MOD_DDLTICT: /* Vdseff */ - mod->HSMHV2_ddltict = value->rValue; - mod->HSMHV2_ddltict_Given = TRUE; - break; - case HSMHV2_MOD_VFBOVER: - mod->HSMHV2_vfbover = value->rValue; - mod->HSMHV2_vfbover_Given = TRUE; - break; - case HSMHV2_MOD_NOVER: - mod->HSMHV2_nover = value->rValue; - mod->HSMHV2_nover_Given = TRUE; - break; - case HSMHV2_MOD_NOVERS: - mod->HSMHV2_novers = value->rValue; - mod->HSMHV2_novers_Given = TRUE; - break; - case HSMHV2_MOD_XWD: - mod->HSMHV2_xwd = value->rValue; - mod->HSMHV2_xwd_Given = TRUE; - break; - case HSMHV2_MOD_XWDC: - mod->HSMHV2_xwdc = value->rValue; - mod->HSMHV2_xwdc_Given = TRUE; - break; - case HSMHV2_MOD_XL: - mod->HSMHV2_xl = value->rValue; - mod->HSMHV2_xl_Given = TRUE; - break; - case HSMHV2_MOD_XW: - mod->HSMHV2_xw = value->rValue; - mod->HSMHV2_xw_Given = TRUE; - break; - case HSMHV2_MOD_SAREF: - mod->HSMHV2_saref = value->rValue; - mod->HSMHV2_saref_Given = TRUE; - break; - case HSMHV2_MOD_SBREF: - mod->HSMHV2_sbref = value->rValue; - mod->HSMHV2_sbref_Given = TRUE; - break; - case HSMHV2_MOD_LL: - mod->HSMHV2_ll = value->rValue; - mod->HSMHV2_ll_Given = TRUE; - break; - case HSMHV2_MOD_LLD: - mod->HSMHV2_lld = value->rValue; - mod->HSMHV2_lld_Given = TRUE; - break; - case HSMHV2_MOD_LLN: - mod->HSMHV2_lln = value->rValue; - mod->HSMHV2_lln_Given = TRUE; - break; - case HSMHV2_MOD_WL: - mod->HSMHV2_wl = value->rValue; - mod->HSMHV2_wl_Given = TRUE; - break; - case HSMHV2_MOD_WL1: - mod->HSMHV2_wl1 = value->rValue; - mod->HSMHV2_wl1_Given = TRUE; - break; - case HSMHV2_MOD_WL1P: - mod->HSMHV2_wl1p = value->rValue; - mod->HSMHV2_wl1p_Given = TRUE; - break; - case HSMHV2_MOD_WL2: - mod->HSMHV2_wl2 = value->rValue; - mod->HSMHV2_wl2_Given = TRUE; - break; - case HSMHV2_MOD_WL2P: - mod->HSMHV2_wl2p = value->rValue; - mod->HSMHV2_wl2p_Given = TRUE; - break; - case HSMHV2_MOD_WLD: - mod->HSMHV2_wld = value->rValue; - mod->HSMHV2_wld_Given = TRUE; - break; - case HSMHV2_MOD_WLN: - mod->HSMHV2_wln = value->rValue; - mod->HSMHV2_wln_Given = TRUE; - break; - case HSMHV2_MOD_XQY: - mod->HSMHV2_xqy = value->rValue; - mod->HSMHV2_xqy_Given = TRUE; - break; - case HSMHV2_MOD_XQY1: - mod->HSMHV2_xqy1 = value->rValue; - mod->HSMHV2_xqy1_Given = TRUE; - break; - case HSMHV2_MOD_XQY2: - mod->HSMHV2_xqy2 = value->rValue; - mod->HSMHV2_xqy2_Given = TRUE; - break; - case HSMHV2_MOD_RS: - mod->HSMHV2_rs = value->rValue; - mod->HSMHV2_rs_Given = TRUE; - break; - case HSMHV2_MOD_RD: - mod->HSMHV2_rd = value->rValue; - mod->HSMHV2_rd_Given = TRUE; - break; - case HSMHV2_MOD_RSH: - mod->HSMHV2_rsh = value->rValue; - mod->HSMHV2_rsh_Given = TRUE; - break; - case HSMHV2_MOD_RSHG: - mod->HSMHV2_rshg = value->rValue; - mod->HSMHV2_rshg_Given = TRUE; - break; - case HSMHV2_MOD_VFBC: - mod->HSMHV2_vfbc = value->rValue; - mod->HSMHV2_vfbc_Given = TRUE; - break; - case HSMHV2_MOD_VBI: - mod->HSMHV2_vbi = value->rValue; - mod->HSMHV2_vbi_Given = TRUE; - break; - case HSMHV2_MOD_NSUBC: - mod->HSMHV2_nsubc = value->rValue; - mod->HSMHV2_nsubc_Given = TRUE; - break; - case HSMHV2_MOD_PARL2: - mod->HSMHV2_parl2 = value->rValue; - mod->HSMHV2_parl2_Given = TRUE; - break; - case HSMHV2_MOD_LP: - mod->HSMHV2_lp = value->rValue; - mod->HSMHV2_lp_Given = TRUE; - break; - case HSMHV2_MOD_NSUBP: - mod->HSMHV2_nsubp = value->rValue; - mod->HSMHV2_nsubp_Given = TRUE; - break; - case HSMHV2_MOD_NSUBP0: - mod->HSMHV2_nsubp0 = value->rValue; - mod->HSMHV2_nsubp0_Given = TRUE; - break; - case HSMHV2_MOD_NSUBWP: - mod->HSMHV2_nsubwp = value->rValue; - mod->HSMHV2_nsubwp_Given = TRUE; - break; - case HSMHV2_MOD_SCP1: - mod->HSMHV2_scp1 = value->rValue; - mod->HSMHV2_scp1_Given = TRUE; - break; - case HSMHV2_MOD_SCP2: - mod->HSMHV2_scp2 = value->rValue; - mod->HSMHV2_scp2_Given = TRUE; - break; - case HSMHV2_MOD_SCP3: - mod->HSMHV2_scp3 = value->rValue; - mod->HSMHV2_scp3_Given = TRUE; - break; - case HSMHV2_MOD_SC1: - mod->HSMHV2_sc1 = value->rValue; - mod->HSMHV2_sc1_Given = TRUE; - break; - case HSMHV2_MOD_SC2: - mod->HSMHV2_sc2 = value->rValue; - mod->HSMHV2_sc2_Given = TRUE; - break; - case HSMHV2_MOD_SC3: - mod->HSMHV2_sc3 = value->rValue; - mod->HSMHV2_sc3_Given = TRUE; - break; - case HSMHV2_MOD_SC4: - mod->HSMHV2_sc4 = value->rValue; - mod->HSMHV2_sc4_Given = TRUE; - break; - case HSMHV2_MOD_PGD1: - mod->HSMHV2_pgd1 = value->rValue; - mod->HSMHV2_pgd1_Given = TRUE; - break; - case HSMHV2_MOD_PGD2: - mod->HSMHV2_pgd2 = value->rValue; - mod->HSMHV2_pgd2_Given = TRUE; - break; - case HSMHV2_MOD_PGD4: - mod->HSMHV2_pgd4 = value->rValue; - mod->HSMHV2_pgd4_Given = TRUE; - break; - case HSMHV2_MOD_NDEP: - mod->HSMHV2_ndep = value->rValue; - mod->HSMHV2_ndep_Given = TRUE; - break; - case HSMHV2_MOD_NDEPL: - mod->HSMHV2_ndepl = value->rValue; - mod->HSMHV2_ndepl_Given = TRUE; - break; - case HSMHV2_MOD_NDEPLP: - mod->HSMHV2_ndeplp = value->rValue; - mod->HSMHV2_ndeplp_Given = TRUE; - break; - case HSMHV2_MOD_NINV: - mod->HSMHV2_ninv = value->rValue; - mod->HSMHV2_ninv_Given = TRUE; - break; - case HSMHV2_MOD_MUECB0: - mod->HSMHV2_muecb0 = value->rValue; - mod->HSMHV2_muecb0_Given = TRUE; - break; - case HSMHV2_MOD_MUECB1: - mod->HSMHV2_muecb1 = value->rValue; - mod->HSMHV2_muecb1_Given = TRUE; - break; - case HSMHV2_MOD_MUEPH1: - mod->HSMHV2_mueph1 = value->rValue; - mod->HSMHV2_mueph1_Given = TRUE; - break; - case HSMHV2_MOD_MUEPH0: - mod->HSMHV2_mueph0 = value->rValue; - mod->HSMHV2_mueph0_Given = TRUE; - break; - case HSMHV2_MOD_MUEPHW: - mod->HSMHV2_muephw = value->rValue; - mod->HSMHV2_muephw_Given = TRUE; - break; - case HSMHV2_MOD_MUEPWP: - mod->HSMHV2_muepwp = value->rValue; - mod->HSMHV2_muepwp_Given = TRUE; - break; - case HSMHV2_MOD_MUEPHL: - mod->HSMHV2_muephl = value->rValue; - mod->HSMHV2_muephl_Given = TRUE; - break; - case HSMHV2_MOD_MUEPLP: - mod->HSMHV2_mueplp = value->rValue; - mod->HSMHV2_mueplp_Given = TRUE; - break; - case HSMHV2_MOD_MUEPHS: - mod->HSMHV2_muephs = value->rValue; - mod->HSMHV2_muephs_Given = TRUE; - break; - case HSMHV2_MOD_MUEPSP: - mod->HSMHV2_muepsp = value->rValue; - mod->HSMHV2_muepsp_Given = TRUE; - break; - case HSMHV2_MOD_VTMP: - mod->HSMHV2_vtmp = value->rValue; - mod->HSMHV2_vtmp_Given = TRUE; - break; - case HSMHV2_MOD_WVTH0: - mod->HSMHV2_wvth0 = value->rValue; - mod->HSMHV2_wvth0_Given = TRUE; - break; - case HSMHV2_MOD_MUESR1: - mod->HSMHV2_muesr1 = value->rValue; - mod->HSMHV2_muesr1_Given = TRUE; - break; - case HSMHV2_MOD_MUESR0: - mod->HSMHV2_muesr0 = value->rValue; - mod->HSMHV2_muesr0_Given = TRUE; - break; - case HSMHV2_MOD_MUESRL: - mod->HSMHV2_muesrl = value->rValue; - mod->HSMHV2_muesrl_Given = TRUE; - break; - case HSMHV2_MOD_MUESLP: - mod->HSMHV2_mueslp = value->rValue; - mod->HSMHV2_mueslp_Given = TRUE; - break; - case HSMHV2_MOD_MUESRW: - mod->HSMHV2_muesrw = value->rValue; - mod->HSMHV2_muesrw_Given = TRUE; - break; - case HSMHV2_MOD_MUESWP: - mod->HSMHV2_mueswp = value->rValue; - mod->HSMHV2_mueswp_Given = TRUE; - break; - case HSMHV2_MOD_BB: - mod->HSMHV2_bb = value->rValue; - mod->HSMHV2_bb_Given = TRUE; - break; - case HSMHV2_MOD_SUB1: - mod->HSMHV2_sub1 = value->rValue; - mod->HSMHV2_sub1_Given = TRUE; - break; - case HSMHV2_MOD_SUB2: - mod->HSMHV2_sub2 = value->rValue; - mod->HSMHV2_sub2_Given = TRUE; - break; - case HSMHV2_MOD_SVGS: - mod->HSMHV2_svgs = value->rValue; - mod->HSMHV2_svgs_Given = TRUE; - break; - case HSMHV2_MOD_SVBS: - mod->HSMHV2_svbs = value->rValue; - mod->HSMHV2_svbs_Given = TRUE; - break; - case HSMHV2_MOD_SVBSL: - mod->HSMHV2_svbsl = value->rValue; - mod->HSMHV2_svbsl_Given = TRUE; - break; - case HSMHV2_MOD_SVDS: - mod->HSMHV2_svds = value->rValue; - mod->HSMHV2_svds_Given = TRUE; - break; - case HSMHV2_MOD_SLG: - mod->HSMHV2_slg = value->rValue; - mod->HSMHV2_slg_Given = TRUE; - break; - case HSMHV2_MOD_SUB1L: - mod->HSMHV2_sub1l = value->rValue; - mod->HSMHV2_sub1l_Given = TRUE; - break; - case HSMHV2_MOD_SUB2L: - mod->HSMHV2_sub2l = value->rValue; - mod->HSMHV2_sub2l_Given = TRUE; - break; - case HSMHV2_MOD_FN1: - mod->HSMHV2_fn1 = value->rValue; - mod->HSMHV2_fn1_Given = TRUE; - break; - case HSMHV2_MOD_FN2: - mod->HSMHV2_fn2 = value->rValue; - mod->HSMHV2_fn2_Given = TRUE; - break; - case HSMHV2_MOD_FN3: - mod->HSMHV2_fn3 = value->rValue; - mod->HSMHV2_fn3_Given = TRUE; - break; - case HSMHV2_MOD_FVBS: - mod->HSMHV2_fvbs = value->rValue; - mod->HSMHV2_fvbs_Given = TRUE; - break; - case HSMHV2_MOD_SVGSL: - mod->HSMHV2_svgsl = value->rValue; - mod->HSMHV2_svgsl_Given = TRUE; - break; - case HSMHV2_MOD_SVGSLP: - mod->HSMHV2_svgslp = value->rValue; - mod->HSMHV2_svgslp_Given = TRUE; - break; - case HSMHV2_MOD_SVGSWP: - mod->HSMHV2_svgswp = value->rValue; - mod->HSMHV2_svgswp_Given = TRUE; - break; - case HSMHV2_MOD_SVGSW: - mod->HSMHV2_svgsw = value->rValue; - mod->HSMHV2_svgsw_Given = TRUE; - break; - case HSMHV2_MOD_SVBSLP: - mod->HSMHV2_svbslp = value->rValue; - mod->HSMHV2_svbslp_Given = TRUE; - break; - case HSMHV2_MOD_SLGL: - mod->HSMHV2_slgl = value->rValue; - mod->HSMHV2_slgl_Given = TRUE; - break; - case HSMHV2_MOD_SLGLP: - mod->HSMHV2_slglp = value->rValue; - mod->HSMHV2_slglp_Given = TRUE; - break; - case HSMHV2_MOD_SUB1LP: - mod->HSMHV2_sub1lp = value->rValue; - mod->HSMHV2_sub1lp_Given = TRUE; - break; - case HSMHV2_MOD_NSTI: - mod->HSMHV2_nsti = value->rValue; - mod->HSMHV2_nsti_Given = TRUE; - break; - case HSMHV2_MOD_WSTI: - mod->HSMHV2_wsti = value->rValue; - mod->HSMHV2_wsti_Given = TRUE; - break; - case HSMHV2_MOD_WSTIL: - mod->HSMHV2_wstil = value->rValue; - mod->HSMHV2_wstil_Given = TRUE; - break; - case HSMHV2_MOD_WSTILP: - mod->HSMHV2_wstilp = value->rValue; - mod->HSMHV2_wstilp_Given = TRUE; - break; - case HSMHV2_MOD_WSTIW: - mod->HSMHV2_wstiw = value->rValue; - mod->HSMHV2_wstiw_Given = TRUE; - break; - case HSMHV2_MOD_WSTIWP: - mod->HSMHV2_wstiwp = value->rValue; - mod->HSMHV2_wstiwp_Given = TRUE; - break; - case HSMHV2_MOD_SCSTI1: - mod->HSMHV2_scsti1 = value->rValue; - mod->HSMHV2_scsti1_Given = TRUE; - break; - case HSMHV2_MOD_SCSTI2: - mod->HSMHV2_scsti2 = value->rValue; - mod->HSMHV2_scsti2_Given = TRUE; - break; - case HSMHV2_MOD_VTHSTI: - mod->HSMHV2_vthsti = value->rValue; - mod->HSMHV2_vthsti_Given = TRUE; - break; - case HSMHV2_MOD_VDSTI: - mod->HSMHV2_vdsti = value->rValue; - mod->HSMHV2_vdsti_Given = TRUE; - break; - case HSMHV2_MOD_MUESTI1: - mod->HSMHV2_muesti1 = value->rValue; - mod->HSMHV2_muesti1_Given = TRUE; - break; - case HSMHV2_MOD_MUESTI2: - mod->HSMHV2_muesti2 = value->rValue; - mod->HSMHV2_muesti2_Given = TRUE; - break; - case HSMHV2_MOD_MUESTI3: - mod->HSMHV2_muesti3 = value->rValue; - mod->HSMHV2_muesti3_Given = TRUE; - break; - case HSMHV2_MOD_NSUBPSTI1: - mod->HSMHV2_nsubpsti1 = value->rValue; - mod->HSMHV2_nsubpsti1_Given = TRUE; - break; - case HSMHV2_MOD_NSUBPSTI2: - mod->HSMHV2_nsubpsti2 = value->rValue; - mod->HSMHV2_nsubpsti2_Given = TRUE; - break; - case HSMHV2_MOD_NSUBPSTI3: - mod->HSMHV2_nsubpsti3 = value->rValue; - mod->HSMHV2_nsubpsti3_Given = TRUE; - break; - case HSMHV2_MOD_LPEXT: - mod->HSMHV2_lpext = value->rValue; - mod->HSMHV2_lpext_Given = TRUE; - break; - case HSMHV2_MOD_NPEXT: - mod->HSMHV2_npext = value->rValue; - mod->HSMHV2_npext_Given = TRUE; - break; - case HSMHV2_MOD_SCP22: - mod->HSMHV2_scp22 = value->rValue; - mod->HSMHV2_scp22_Given = TRUE; - break; - case HSMHV2_MOD_SCP21: - mod->HSMHV2_scp21 = value->rValue; - mod->HSMHV2_scp21_Given = TRUE; - break; - case HSMHV2_MOD_BS1: - mod->HSMHV2_bs1 = value->rValue; - mod->HSMHV2_bs1_Given = TRUE; - break; - case HSMHV2_MOD_BS2: - mod->HSMHV2_bs2 = value->rValue; - mod->HSMHV2_bs2_Given = TRUE; - break; - case HSMHV2_MOD_CGSO: - mod->HSMHV2_cgso = value->rValue; - mod->HSMHV2_cgso_Given = TRUE; - break; - case HSMHV2_MOD_CGDO: - mod->HSMHV2_cgdo = value->rValue; - mod->HSMHV2_cgdo_Given = TRUE; - break; - case HSMHV2_MOD_CGBO: - mod->HSMHV2_cgbo = value->rValue; - mod->HSMHV2_cgbo_Given = TRUE; - break; - case HSMHV2_MOD_TPOLY: - mod->HSMHV2_tpoly = value->rValue; - mod->HSMHV2_tpoly_Given = TRUE; - break; - case HSMHV2_MOD_JS0: - mod->HSMHV2_js0 = value->rValue; - mod->HSMHV2_js0_Given = TRUE; - break; - case HSMHV2_MOD_JS0SW: - mod->HSMHV2_js0sw = value->rValue; - mod->HSMHV2_js0sw_Given = TRUE; - break; - case HSMHV2_MOD_NJ: - mod->HSMHV2_nj = value->rValue; - mod->HSMHV2_nj_Given = TRUE; - break; - case HSMHV2_MOD_NJSW: - mod->HSMHV2_njsw = value->rValue; - mod->HSMHV2_njsw_Given = TRUE; - break; - case HSMHV2_MOD_XTI: - mod->HSMHV2_xti = value->rValue; - mod->HSMHV2_xti_Given = TRUE; - break; - case HSMHV2_MOD_CJ: - mod->HSMHV2_cj = value->rValue; - mod->HSMHV2_cj_Given = TRUE; - break; - case HSMHV2_MOD_CJSW: - mod->HSMHV2_cjsw = value->rValue; - mod->HSMHV2_cjsw_Given = TRUE; - break; - case HSMHV2_MOD_CJSWG: - mod->HSMHV2_cjswg = value->rValue; - mod->HSMHV2_cjswg_Given = TRUE; - break; - case HSMHV2_MOD_MJ: - mod->HSMHV2_mj = value->rValue; - mod->HSMHV2_mj_Given = TRUE; - break; - case HSMHV2_MOD_MJSW: - mod->HSMHV2_mjsw = value->rValue; - mod->HSMHV2_mjsw_Given = TRUE; - break; - case HSMHV2_MOD_MJSWG: - mod->HSMHV2_mjswg = value->rValue; - mod->HSMHV2_mjswg_Given = TRUE; - break; - case HSMHV2_MOD_PB: - mod->HSMHV2_pb = value->rValue; - mod->HSMHV2_pb_Given = TRUE; - break; - case HSMHV2_MOD_PBSW: - mod->HSMHV2_pbsw = value->rValue; - mod->HSMHV2_pbsw_Given = TRUE; - break; - case HSMHV2_MOD_PBSWG: - mod->HSMHV2_pbswg = value->rValue; - mod->HSMHV2_pbswg_Given = TRUE; - break; - case HSMHV2_MOD_XTI2: - mod->HSMHV2_xti2 = value->rValue; - mod->HSMHV2_xti2_Given = TRUE; - break; - case HSMHV2_MOD_CISB: - mod->HSMHV2_cisb = value->rValue; - mod->HSMHV2_cisb_Given = TRUE; - break; - case HSMHV2_MOD_CVB: - mod->HSMHV2_cvb = value->rValue; - mod->HSMHV2_cvb_Given = TRUE; - break; - case HSMHV2_MOD_CTEMP: - mod->HSMHV2_ctemp = value->rValue; - mod->HSMHV2_ctemp_Given = TRUE; - break; - case HSMHV2_MOD_CISBK: - mod->HSMHV2_cisbk = value->rValue; - mod->HSMHV2_cisbk_Given = TRUE; - break; - case HSMHV2_MOD_CVBK: - mod->HSMHV2_cvbk = value->rValue; - mod->HSMHV2_cvbk_Given = TRUE; - break; - case HSMHV2_MOD_DIVX: - mod->HSMHV2_divx = value->rValue; - mod->HSMHV2_divx_Given = TRUE; - break; - case HSMHV2_MOD_CLM1: - mod->HSMHV2_clm1 = value->rValue; - mod->HSMHV2_clm1_Given = TRUE; - break; - case HSMHV2_MOD_CLM2: - mod->HSMHV2_clm2 = value->rValue; - mod->HSMHV2_clm2_Given = TRUE; - break; - case HSMHV2_MOD_CLM3: - mod->HSMHV2_clm3 = value->rValue; - mod->HSMHV2_clm3_Given = TRUE; - break; - case HSMHV2_MOD_CLM5: - mod->HSMHV2_clm5 = value->rValue; - mod->HSMHV2_clm5_Given = TRUE; - break; - case HSMHV2_MOD_CLM6: - mod->HSMHV2_clm6 = value->rValue; - mod->HSMHV2_clm6_Given = TRUE; - break; - case HSMHV2_MOD_MUETMP: - mod->HSMHV2_muetmp = value->rValue; - mod->HSMHV2_muetmp_Given = TRUE; - break; - case HSMHV2_MOD_VOVER: - mod->HSMHV2_vover = value->rValue; - mod->HSMHV2_vover_Given = TRUE; - break; - case HSMHV2_MOD_VOVERP: - mod->HSMHV2_voverp = value->rValue; - mod->HSMHV2_voverp_Given = TRUE; - break; - case HSMHV2_MOD_VOVERS: - mod->HSMHV2_vovers = value->rValue; - mod->HSMHV2_vovers_Given = TRUE; - break; - case HSMHV2_MOD_VOVERSP: - mod->HSMHV2_voversp = value->rValue; - mod->HSMHV2_voversp_Given = TRUE; - break; - case HSMHV2_MOD_WFC: - mod->HSMHV2_wfc = value->rValue; - mod->HSMHV2_wfc_Given = TRUE; - break; - case HSMHV2_MOD_NSUBCW: - mod->HSMHV2_nsubcw = value->rValue; - mod->HSMHV2_nsubcw_Given = TRUE; - break; - case HSMHV2_MOD_NSUBCWP: - mod->HSMHV2_nsubcwp = value->rValue; - mod->HSMHV2_nsubcwp_Given = TRUE; - break; - case HSMHV2_MOD_QME1: - mod->HSMHV2_qme1 = value->rValue; - mod->HSMHV2_qme1_Given = TRUE; - break; - case HSMHV2_MOD_QME2: - mod->HSMHV2_qme2 = value->rValue; - mod->HSMHV2_qme2_Given = TRUE; - break; - case HSMHV2_MOD_QME3: - mod->HSMHV2_qme3 = value->rValue; - mod->HSMHV2_qme3_Given = TRUE; - break; - case HSMHV2_MOD_GIDL1: - mod->HSMHV2_gidl1 = value->rValue; - mod->HSMHV2_gidl1_Given = TRUE; - break; - case HSMHV2_MOD_GIDL2: - mod->HSMHV2_gidl2 = value->rValue; - mod->HSMHV2_gidl2_Given = TRUE; - break; - case HSMHV2_MOD_GIDL3: - mod->HSMHV2_gidl3 = value->rValue; - mod->HSMHV2_gidl3_Given = TRUE; - break; - case HSMHV2_MOD_GIDL4: - mod->HSMHV2_gidl4 = value->rValue; - mod->HSMHV2_gidl4_Given = TRUE; - break; - case HSMHV2_MOD_GIDL5: - mod->HSMHV2_gidl5 = value->rValue; - mod->HSMHV2_gidl5_Given = TRUE; - break; - case HSMHV2_MOD_GLEAK1: - mod->HSMHV2_gleak1 = value->rValue; - mod->HSMHV2_gleak1_Given = TRUE; - break; - case HSMHV2_MOD_GLEAK2: - mod->HSMHV2_gleak2 = value->rValue; - mod->HSMHV2_gleak2_Given = TRUE; - break; - case HSMHV2_MOD_GLEAK3: - mod->HSMHV2_gleak3 = value->rValue; - mod->HSMHV2_gleak3_Given = TRUE; - break; - case HSMHV2_MOD_GLEAK4: - mod->HSMHV2_gleak4 = value->rValue; - mod->HSMHV2_gleak4_Given = TRUE; - break; - case HSMHV2_MOD_GLEAK5: - mod->HSMHV2_gleak5 = value->rValue; - mod->HSMHV2_gleak5_Given = TRUE; - break; - case HSMHV2_MOD_GLEAK6: - mod->HSMHV2_gleak6 = value->rValue; - mod->HSMHV2_gleak6_Given = TRUE; - break; - case HSMHV2_MOD_GLEAK7: - mod->HSMHV2_gleak7 = value->rValue; - mod->HSMHV2_gleak7_Given = TRUE; - break; - case HSMHV2_MOD_GLPART1: - mod->HSMHV2_glpart1 = value->rValue; - mod->HSMHV2_glpart1_Given = TRUE; - break; - case HSMHV2_MOD_GLKSD1: - mod->HSMHV2_glksd1 = value->rValue; - mod->HSMHV2_glksd1_Given = TRUE; - break; - case HSMHV2_MOD_GLKSD2: - mod->HSMHV2_glksd2 = value->rValue; - mod->HSMHV2_glksd2_Given = TRUE; - break; - case HSMHV2_MOD_GLKSD3: - mod->HSMHV2_glksd3 = value->rValue; - mod->HSMHV2_glksd3_Given = TRUE; - break; - case HSMHV2_MOD_GLKB1: - mod->HSMHV2_glkb1 = value->rValue; - mod->HSMHV2_glkb1_Given = TRUE; - break; - case HSMHV2_MOD_GLKB2: - mod->HSMHV2_glkb2 = value->rValue; - mod->HSMHV2_glkb2_Given = TRUE; - break; - case HSMHV2_MOD_GLKB3: - mod->HSMHV2_glkb3 = value->rValue; - mod->HSMHV2_glkb3_Given = TRUE; - break; - case HSMHV2_MOD_EGIG: - mod->HSMHV2_egig = value->rValue; - mod->HSMHV2_egig_Given = TRUE; - break; - case HSMHV2_MOD_IGTEMP2: - mod->HSMHV2_igtemp2 = value->rValue; - mod->HSMHV2_igtemp2_Given = TRUE; - break; - case HSMHV2_MOD_IGTEMP3: - mod->HSMHV2_igtemp3 = value->rValue; - mod->HSMHV2_igtemp3_Given = TRUE; - break; - case HSMHV2_MOD_VZADD0: - mod->HSMHV2_vzadd0 = value->rValue; - mod->HSMHV2_vzadd0_Given = TRUE; - break; - case HSMHV2_MOD_PZADD0: - mod->HSMHV2_pzadd0 = value->rValue; - mod->HSMHV2_pzadd0_Given = TRUE; - break; - case HSMHV2_MOD_NFTRP: - mod->HSMHV2_nftrp = value->rValue; - mod->HSMHV2_nftrp_Given = TRUE; - break; - case HSMHV2_MOD_NFALP: - mod->HSMHV2_nfalp = value->rValue; - mod->HSMHV2_nfalp_Given = TRUE; - break; - case HSMHV2_MOD_CIT: - mod->HSMHV2_cit = value->rValue; - mod->HSMHV2_cit_Given = TRUE; - break; - case HSMHV2_MOD_FALPH: - mod->HSMHV2_falph = value->rValue; - mod->HSMHV2_falph_Given = TRUE; - break; - case HSMHV2_MOD_KAPPA: - mod->HSMHV2_kappa = value->rValue; - mod->HSMHV2_kappa_Given = TRUE; - break; - case HSMHV2_MOD_VDIFFJ: - mod->HSMHV2_vdiffj = value->rValue; - mod->HSMHV2_vdiffj_Given = TRUE; - break; - case HSMHV2_MOD_DLY1: - mod->HSMHV2_dly1 = value->rValue; - mod->HSMHV2_dly1_Given = TRUE; - break; - case HSMHV2_MOD_DLY2: - mod->HSMHV2_dly2 = value->rValue; - mod->HSMHV2_dly2_Given = TRUE; - break; - case HSMHV2_MOD_DLY3: - mod->HSMHV2_dly3 = value->rValue; - mod->HSMHV2_dly3_Given = TRUE; - break; - case HSMHV2_MOD_TNOM: - mod->HSMHV2_tnom = value->rValue; - mod->HSMHV2_tnom_Given = TRUE; - break; - case HSMHV2_MOD_OVSLP: - mod->HSMHV2_ovslp = value->rValue; - mod->HSMHV2_ovslp_Given = TRUE; - break; - case HSMHV2_MOD_OVMAG: - mod->HSMHV2_ovmag = value->rValue; - mod->HSMHV2_ovmag_Given = TRUE; - break; - case HSMHV2_MOD_GBMIN: - mod->HSMHV2_gbmin = value->rValue; - mod->HSMHV2_gbmin_Given = TRUE; - break; - case HSMHV2_MOD_RBPB: - mod->HSMHV2_rbpb = value->rValue; - mod->HSMHV2_rbpb_Given = TRUE; - break; - case HSMHV2_MOD_RBPD: - mod->HSMHV2_rbpd = value->rValue; - mod->HSMHV2_rbpd_Given = TRUE; - break; - case HSMHV2_MOD_RBPS: - mod->HSMHV2_rbps = value->rValue; - mod->HSMHV2_rbps_Given = TRUE; - break; - case HSMHV2_MOD_RBDB: - mod->HSMHV2_rbdb = value->rValue; - mod->HSMHV2_rbdb_Given = TRUE; - break; - case HSMHV2_MOD_RBSB: - mod->HSMHV2_rbsb = value->rValue; - mod->HSMHV2_rbsb_Given = TRUE; - break; - case HSMHV2_MOD_IBPC1: - mod->HSMHV2_ibpc1 = value->rValue; - mod->HSMHV2_ibpc1_Given = TRUE; - break; - case HSMHV2_MOD_IBPC1L: - mod->HSMHV2_ibpc1l = value->rValue; - mod->HSMHV2_ibpc1l_Given = TRUE; - break; - case HSMHV2_MOD_IBPC1LP: - mod->HSMHV2_ibpc1lp = value->rValue; - mod->HSMHV2_ibpc1lp_Given = TRUE; - break; - case HSMHV2_MOD_IBPC2: - mod->HSMHV2_ibpc2 = value->rValue; - mod->HSMHV2_ibpc2_Given = TRUE; - break; - case HSMHV2_MOD_MPHDFM: - mod->HSMHV2_mphdfm = value->rValue; - mod->HSMHV2_mphdfm_Given = TRUE; - break; - - case HSMHV2_MOD_PTL: - mod->HSMHV2_ptl = value->rValue; - mod->HSMHV2_ptl_Given = TRUE; - break; - case HSMHV2_MOD_PTP: - mod->HSMHV2_ptp = value->rValue; - mod->HSMHV2_ptp_Given = TRUE; - break; - case HSMHV2_MOD_PT2: - mod->HSMHV2_pt2 = value->rValue; - mod->HSMHV2_pt2_Given = TRUE; - break; - case HSMHV2_MOD_PTLP: - mod->HSMHV2_ptlp = value->rValue; - mod->HSMHV2_ptlp_Given = TRUE; - break; - case HSMHV2_MOD_GDL: - mod->HSMHV2_gdl = value->rValue; - mod->HSMHV2_gdl_Given = TRUE; - break; - case HSMHV2_MOD_GDLP: - mod->HSMHV2_gdlp = value->rValue; - mod->HSMHV2_gdlp_Given = TRUE; - break; - - case HSMHV2_MOD_GDLD: - mod->HSMHV2_gdld = value->rValue; - mod->HSMHV2_gdld_Given = TRUE; - break; - case HSMHV2_MOD_PT4: - mod->HSMHV2_pt4 = value->rValue; - mod->HSMHV2_pt4_Given = TRUE; - break; - case HSMHV2_MOD_PT4P: - mod->HSMHV2_pt4p = value->rValue; - mod->HSMHV2_pt4p_Given = TRUE; - break; - case HSMHV2_MOD_RDVG11: - mod->HSMHV2_rdvg11 = value->rValue; - mod->HSMHV2_rdvg11_Given = TRUE; - break; - case HSMHV2_MOD_RDVG12: - mod->HSMHV2_rdvg12 = value->rValue; - mod->HSMHV2_rdvg12_Given = TRUE; - break; - case HSMHV2_MOD_RD20: - mod->HSMHV2_rd20 = value->rValue; - mod->HSMHV2_rd20_Given = TRUE; - break; - case HSMHV2_MOD_RD21: - mod->HSMHV2_rd21 = value->rValue; - mod->HSMHV2_rd21_Given = TRUE; - break; - case HSMHV2_MOD_RD22: - mod->HSMHV2_rd22 = value->rValue; - mod->HSMHV2_rd22_Given = TRUE; - break; - case HSMHV2_MOD_RD22D: - mod->HSMHV2_rd22d = value->rValue; - mod->HSMHV2_rd22d_Given = TRUE; - break; - case HSMHV2_MOD_RD23: - mod->HSMHV2_rd23 = value->rValue; - mod->HSMHV2_rd23_Given = TRUE; - break; - case HSMHV2_MOD_RD24: - mod->HSMHV2_rd24 = value->rValue; - mod->HSMHV2_rd24_Given = TRUE; - break; - case HSMHV2_MOD_RD25: - mod->HSMHV2_rd25 = value->rValue; - mod->HSMHV2_rd25_Given = TRUE; - break; - case HSMHV2_MOD_RDVDL: - mod->HSMHV2_rdvdl = value->rValue; - mod->HSMHV2_rdvdl_Given = TRUE; - break; - case HSMHV2_MOD_RDVDLP: - mod->HSMHV2_rdvdlp = value->rValue; - mod->HSMHV2_rdvdlp_Given = TRUE; - break; - case HSMHV2_MOD_RDVDS: - mod->HSMHV2_rdvds = value->rValue; - mod->HSMHV2_rdvds_Given = TRUE; - break; - case HSMHV2_MOD_RDVDSP: - mod->HSMHV2_rdvdsp = value->rValue; - mod->HSMHV2_rdvdsp_Given = TRUE; - break; - case HSMHV2_MOD_RD23L: - mod->HSMHV2_rd23l = value->rValue; - mod->HSMHV2_rd23l_Given = TRUE; - break; - case HSMHV2_MOD_RD23LP: - mod->HSMHV2_rd23lp = value->rValue; - mod->HSMHV2_rd23lp_Given = TRUE; - break; - case HSMHV2_MOD_RD23S: - mod->HSMHV2_rd23s = value->rValue; - mod->HSMHV2_rd23s_Given = TRUE; - break; - case HSMHV2_MOD_RD23SP: - mod->HSMHV2_rd23sp = value->rValue; - mod->HSMHV2_rd23sp_Given = TRUE; - break; - case HSMHV2_MOD_RDS: - mod->HSMHV2_rds = value->rValue; - mod->HSMHV2_rds_Given = TRUE; - break; - case HSMHV2_MOD_RDSP: - mod->HSMHV2_rdsp = value->rValue; - mod->HSMHV2_rdsp_Given = TRUE; - break; - case HSMHV2_MOD_RTH0: /* Self-heating model */ - mod->HSMHV2_rth0 = value->rValue; - mod->HSMHV2_rth0_Given = TRUE; - break; - case HSMHV2_MOD_CTH0: /* Self-heating model */ - mod->HSMHV2_cth0 = value->rValue; - mod->HSMHV2_cth0_Given = TRUE; - break; - case HSMHV2_MOD_POWRAT: /* Self-heating model */ - mod->HSMHV2_powrat = value->rValue; - mod->HSMHV2_powrat_Given = TRUE; - break; - case HSMHV2_MOD_TCJBD: /* Self-heating model */ - mod->HSMHV2_tcjbd = value->rValue; - mod->HSMHV2_tcjbd_Given = TRUE; - break; - case HSMHV2_MOD_TCJBS: /* Self-heating model */ - mod->HSMHV2_tcjbs = value->rValue; - mod->HSMHV2_tcjbs_Given = TRUE; - break; - case HSMHV2_MOD_TCJBDSW: /* Self-heating model */ - mod->HSMHV2_tcjbdsw = value->rValue; - mod->HSMHV2_tcjbdsw_Given = TRUE; - break; - case HSMHV2_MOD_TCJBSSW: /* Self-heating model */ - mod->HSMHV2_tcjbssw = value->rValue; - mod->HSMHV2_tcjbssw_Given = TRUE; - break; - case HSMHV2_MOD_TCJBDSWG: /* Self-heating model */ - mod->HSMHV2_tcjbdswg = value->rValue; - mod->HSMHV2_tcjbdswg_Given = TRUE; - break; - case HSMHV2_MOD_TCJBSSWG: /* Self-heating model */ - mod->HSMHV2_tcjbsswg = value->rValue; - mod->HSMHV2_tcjbsswg_Given = TRUE; - break; - - case HSMHV2_MOD_DLYOV: - mod->HSMHV2_dlyov = value->rValue; - mod->HSMHV2_dlyov_Given = TRUE; - break; - case HSMHV2_MOD_QDFTVD: - mod->HSMHV2_qdftvd = value->rValue; - mod->HSMHV2_qdftvd_Given = TRUE; - break; - case HSMHV2_MOD_XLDLD: - mod->HSMHV2_xldld = value->rValue; - mod->HSMHV2_xldld_Given = TRUE; - break; - case HSMHV2_MOD_XWDLD: - mod->HSMHV2_xwdld = value->rValue; - mod->HSMHV2_xwdld_Given = TRUE; - break; - case HSMHV2_MOD_RDVD: - mod->HSMHV2_rdvd = value->rValue; - mod->HSMHV2_rdvd_Given = TRUE; - break; - - case HSMHV2_MOD_RDTEMP1: - mod->HSMHV2_rdtemp1 = value->rValue; - mod->HSMHV2_rdtemp1_Given = TRUE; - break; - case HSMHV2_MOD_RDTEMP2: - mod->HSMHV2_rdtemp2 = value->rValue; - mod->HSMHV2_rdtemp2_Given = TRUE; - break; - case HSMHV2_MOD_RTH0R: - mod->HSMHV2_rth0r = value->rValue; - mod->HSMHV2_rth0r_Given = TRUE; - break; - case HSMHV2_MOD_RDVDTEMP1: - mod->HSMHV2_rdvdtemp1 = value->rValue; - mod->HSMHV2_rdvdtemp1_Given = TRUE; - break; - case HSMHV2_MOD_RDVDTEMP2: - mod->HSMHV2_rdvdtemp2 = value->rValue; - mod->HSMHV2_rdvdtemp2_Given = TRUE; - break; - case HSMHV2_MOD_RTH0W: - mod->HSMHV2_rth0w = value->rValue; - mod->HSMHV2_rth0w_Given = TRUE; - break; - case HSMHV2_MOD_RTH0WP: - mod->HSMHV2_rth0wp = value->rValue; - mod->HSMHV2_rth0wp_Given = TRUE; - break; - case HSMHV2_MOD_CVDSOVER: - mod->HSMHV2_cvdsover = value->rValue; - mod->HSMHV2_cvdsover_Given = TRUE; - break; - - case HSMHV2_MOD_NINVD: - mod->HSMHV2_ninvd = value->rValue; - mod->HSMHV2_ninvd_Given = TRUE; - break; - case HSMHV2_MOD_NINVDW: - mod->HSMHV2_ninvdw = value->rValue; - mod->HSMHV2_ninvdw_Given = TRUE; - break; - case HSMHV2_MOD_NINVDWP: - mod->HSMHV2_ninvdwp = value->rValue; - mod->HSMHV2_ninvdwp_Given = TRUE; - break; - case HSMHV2_MOD_NINVDT1: - mod->HSMHV2_ninvdt1 = value->rValue; - mod->HSMHV2_ninvdt1_Given = TRUE; - break; - case HSMHV2_MOD_NINVDT2: - mod->HSMHV2_ninvdt2 = value->rValue; - mod->HSMHV2_ninvdt2_Given = TRUE; - break; - case HSMHV2_MOD_VBSMIN: - mod->HSMHV2_vbsmin = value->rValue; - mod->HSMHV2_vbsmin_Given = TRUE; - break; - case HSMHV2_MOD_RDVB: - mod->HSMHV2_rdvb = value->rValue; - mod->HSMHV2_rdvb_Given = TRUE; - break; - case HSMHV2_MOD_RTH0NF: - mod->HSMHV2_rth0nf = value->rValue; - mod->HSMHV2_rth0nf_Given = TRUE; - break; - case HSMHV2_MOD_RTHTEMP1: - mod->HSMHV2_rthtemp1 = value->rValue; - mod->HSMHV2_rthtemp1_Given = TRUE; - break; - case HSMHV2_MOD_RTHTEMP2: - mod->HSMHV2_rthtemp2 = value->rValue; - mod->HSMHV2_rthtemp2_Given = TRUE; - break; - case HSMHV2_MOD_PRATTEMP1: - mod->HSMHV2_prattemp1 = value->rValue; - mod->HSMHV2_prattemp1_Given = TRUE; - break; - case HSMHV2_MOD_PRATTEMP2: - mod->HSMHV2_prattemp2 = value->rValue; - mod->HSMHV2_prattemp2_Given = TRUE; - break; - - case HSMHV2_MOD_RDVSUB: /* substrate effect */ - mod->HSMHV2_rdvsub = value->rValue; - mod->HSMHV2_rdvsub_Given = TRUE; - break; - case HSMHV2_MOD_RDVDSUB: - mod->HSMHV2_rdvdsub = value->rValue; - mod->HSMHV2_rdvdsub_Given = TRUE; - break; - case HSMHV2_MOD_DDRIFT: - mod->HSMHV2_ddrift = value->rValue; - mod->HSMHV2_ddrift_Given = TRUE; - break; - case HSMHV2_MOD_VBISUB: - mod->HSMHV2_vbisub = value->rValue; - mod->HSMHV2_vbisub_Given = TRUE; - break; - case HSMHV2_MOD_NSUBSUB: - mod->HSMHV2_nsubsub = value->rValue; - mod->HSMHV2_nsubsub_Given = TRUE; - break; - - case HSMHV2_MOD_RDRMUE: - mod->HSMHV2_rdrmue = value->rValue; - mod->HSMHV2_rdrmue_Given = TRUE; - break; - case HSMHV2_MOD_RDRVMAX: - mod->HSMHV2_rdrvmax = value->rValue; - mod->HSMHV2_rdrvmax_Given = TRUE; - break; - case HSMHV2_MOD_RDRMUETMP: - mod->HSMHV2_rdrmuetmp = value->rValue; - mod->HSMHV2_rdrmuetmp_Given = TRUE; - break; - case HSMHV2_MOD_RDRVTMP: - mod->HSMHV2_rdrvtmp = value->rValue; - mod->HSMHV2_rdrvtmp_Given = TRUE; - break; - case HSMHV2_MOD_RDRDJUNC: - mod->HSMHV2_rdrdjunc = value->rValue; - mod->HSMHV2_rdrdjunc_Given = TRUE; - break; - case HSMHV2_MOD_RDRCX: - mod->HSMHV2_rdrcx = value->rValue; - mod->HSMHV2_rdrcx_Given = TRUE; - break; - case HSMHV2_MOD_RDRCAR: - mod->HSMHV2_rdrcar = value->rValue; - mod->HSMHV2_rdrcar_Given = TRUE; - break; - case HSMHV2_MOD_RDRDL1: - mod->HSMHV2_rdrdl1 = value->rValue; - mod->HSMHV2_rdrdl1_Given = TRUE; - break; - case HSMHV2_MOD_RDRDL2: - mod->HSMHV2_rdrdl2 = value->rValue; - mod->HSMHV2_rdrdl2_Given = TRUE; - break; - case HSMHV2_MOD_RDRVMAXW: - mod->HSMHV2_rdrvmaxw = value->rValue; - mod->HSMHV2_rdrvmaxw_Given = TRUE; - break; - case HSMHV2_MOD_RDRVMAXWP: - mod->HSMHV2_rdrvmaxwp = value->rValue; - mod->HSMHV2_rdrvmaxwp_Given = TRUE; - break; - case HSMHV2_MOD_RDRVMAXL: - mod->HSMHV2_rdrvmaxl = value->rValue; - mod->HSMHV2_rdrvmaxl_Given = TRUE; - break; - case HSMHV2_MOD_RDRVMAXLP: - mod->HSMHV2_rdrvmaxlp = value->rValue; - mod->HSMHV2_rdrvmaxlp_Given = TRUE; - break; - case HSMHV2_MOD_RDRMUEL: - mod->HSMHV2_rdrmuel = value->rValue; - mod->HSMHV2_rdrmuel_Given = TRUE; - break; - case HSMHV2_MOD_RDRMUELP: - mod->HSMHV2_rdrmuelp = value->rValue; - mod->HSMHV2_rdrmuelp_Given = TRUE; - break; - case HSMHV2_MOD_RDRQOVER: - mod->HSMHV2_rdrqover = value->rValue; - mod->HSMHV2_rdrqover_Given = TRUE; - break; - case HSMHV2_MOD_QOVADD: - mod->HSMHV2_qovadd = value->rValue; - mod->HSMHV2_qovadd_Given = TRUE; - break; - case HSMHV2_MOD_JS0D: - mod->HSMHV2_js0d = value->rValue; - mod->HSMHV2_js0d_Given = TRUE; - break; - case HSMHV2_MOD_JS0SWD: - mod->HSMHV2_js0swd = value->rValue; - mod->HSMHV2_js0swd_Given = TRUE; - break; - case HSMHV2_MOD_NJD: - mod->HSMHV2_njd = value->rValue; - mod->HSMHV2_njd_Given = TRUE; - break; - case HSMHV2_MOD_NJSWD: - mod->HSMHV2_njswd = value->rValue; - mod->HSMHV2_njswd_Given = TRUE; - break; - case HSMHV2_MOD_XTID: - mod->HSMHV2_xtid = value->rValue; - mod->HSMHV2_xtid_Given = TRUE; - break; - case HSMHV2_MOD_CJD: - mod->HSMHV2_cjd = value->rValue; - mod->HSMHV2_cjd_Given = TRUE; - break; - case HSMHV2_MOD_CJSWD: - mod->HSMHV2_cjswd = value->rValue; - mod->HSMHV2_cjswd_Given = TRUE; - break; - case HSMHV2_MOD_CJSWGD: - mod->HSMHV2_cjswgd = value->rValue; - mod->HSMHV2_cjswgd_Given = TRUE; - break; - case HSMHV2_MOD_MJD: - mod->HSMHV2_mjd = value->rValue; - mod->HSMHV2_mjd_Given = TRUE; - break; - case HSMHV2_MOD_MJSWD: - mod->HSMHV2_mjswd = value->rValue; - mod->HSMHV2_mjswd_Given = TRUE; - break; - case HSMHV2_MOD_MJSWGD: - mod->HSMHV2_mjswgd = value->rValue; - mod->HSMHV2_mjswgd_Given = TRUE; - break; - case HSMHV2_MOD_PBD: - mod->HSMHV2_pbd = value->rValue; - mod->HSMHV2_pbd_Given = TRUE; - break; - case HSMHV2_MOD_PBSWD: - mod->HSMHV2_pbswd = value->rValue; - mod->HSMHV2_pbswd_Given = TRUE; - break; - case HSMHV2_MOD_PBSWDG: - mod->HSMHV2_pbswgd = value->rValue; - mod->HSMHV2_pbswgd_Given = TRUE; - break; - case HSMHV2_MOD_XTI2D: - mod->HSMHV2_xti2d = value->rValue; - mod->HSMHV2_xti2d_Given = TRUE; - break; - case HSMHV2_MOD_CISBD: - mod->HSMHV2_cisbd = value->rValue; - mod->HSMHV2_cisbd_Given = TRUE; - break; - case HSMHV2_MOD_CVBD: - mod->HSMHV2_cvbd = value->rValue; - mod->HSMHV2_cvbd_Given = TRUE; - break; - case HSMHV2_MOD_CTEMPD: - mod->HSMHV2_ctempd = value->rValue; - mod->HSMHV2_ctempd_Given = TRUE; - break; - case HSMHV2_MOD_CISBKD: - mod->HSMHV2_cisbkd = value->rValue; - mod->HSMHV2_cisbkd_Given = TRUE; - break; - case HSMHV2_MOD_DIVXD: - mod->HSMHV2_divxd = value->rValue; - mod->HSMHV2_divxd_Given = TRUE; - break; - case HSMHV2_MOD_VDIFFJD: - mod->HSMHV2_vdiffjd = value->rValue; - mod->HSMHV2_vdiffjd_Given = TRUE; - break; - case HSMHV2_MOD_JS0S: - mod->HSMHV2_js0s = value->rValue; - mod->HSMHV2_js0s_Given = TRUE; - break; - case HSMHV2_MOD_JS0SWS: - mod->HSMHV2_js0sws = value->rValue; - mod->HSMHV2_js0sws_Given = TRUE; - break; - case HSMHV2_MOD_NJS: - mod->HSMHV2_njs = value->rValue; - mod->HSMHV2_njs_Given = TRUE; - break; - case HSMHV2_MOD_NJSWS: - mod->HSMHV2_njsws = value->rValue; - mod->HSMHV2_njsws_Given = TRUE; - break; - case HSMHV2_MOD_XTIS: - mod->HSMHV2_xtis = value->rValue; - mod->HSMHV2_xtis_Given = TRUE; - break; - case HSMHV2_MOD_CJS: - mod->HSMHV2_cjs = value->rValue; - mod->HSMHV2_cjs_Given = TRUE; - break; - case HSMHV2_MOD_CJSSW: - mod->HSMHV2_cjsws = value->rValue; - mod->HSMHV2_cjsws_Given = TRUE; - break; - case HSMHV2_MOD_CJSWGS: - mod->HSMHV2_cjswgs = value->rValue; - mod->HSMHV2_cjswgs_Given = TRUE; - break; - case HSMHV2_MOD_MJS: - mod->HSMHV2_mjs = value->rValue; - mod->HSMHV2_mjs_Given = TRUE; - break; - case HSMHV2_MOD_MJSWS: - mod->HSMHV2_mjsws = value->rValue; - mod->HSMHV2_mjsws_Given = TRUE; - break; - case HSMHV2_MOD_MJSWGS: - mod->HSMHV2_mjswgs = value->rValue; - mod->HSMHV2_mjswgs_Given = TRUE; - break; - case HSMHV2_MOD_PBS: - mod->HSMHV2_pbs = value->rValue; - mod->HSMHV2_pbs_Given = TRUE; - break; - case HSMHV2_MOD_PBSWS: - mod->HSMHV2_pbsws = value->rValue; - mod->HSMHV2_pbsws_Given = TRUE; - break; - case HSMHV2_MOD_PBSWSG: - mod->HSMHV2_pbswgs = value->rValue; - mod->HSMHV2_pbswgs_Given = TRUE; - break; - case HSMHV2_MOD_XTI2S: - mod->HSMHV2_xti2s = value->rValue; - mod->HSMHV2_xti2s_Given = TRUE; - break; - case HSMHV2_MOD_CISBS: - mod->HSMHV2_cisbs = value->rValue; - mod->HSMHV2_cisbs_Given = TRUE; - break; - case HSMHV2_MOD_CVBS: - mod->HSMHV2_cvbs = value->rValue; - mod->HSMHV2_cvbs_Given = TRUE; - break; - case HSMHV2_MOD_CTEMPS: - mod->HSMHV2_ctemps = value->rValue; - mod->HSMHV2_ctemps_Given = TRUE; - break; - case HSMHV2_MOD_CISBKS: - mod->HSMHV2_cisbks = value->rValue; - mod->HSMHV2_cisbks_Given = TRUE; - break; - case HSMHV2_MOD_DIVXS: - mod->HSMHV2_divxs = value->rValue; - mod->HSMHV2_divxs_Given = TRUE; - break; - case HSMHV2_MOD_VDIFFJS: - mod->HSMHV2_vdiffjs = value->rValue; - mod->HSMHV2_vdiffjs_Given = TRUE; - break; - case HSMHV2_MOD_SHEMAX: - mod->HSMHV2_shemax = value->rValue; - mod->HSMHV2_shemax_Given = TRUE; - break; - case HSMHV2_MOD_VGSMIN: - mod->HSMHV2_vgsmin = value->rValue; - mod->HSMHV2_vgsmin_Given = TRUE; - break; - case HSMHV2_MOD_GDSLEAK: - mod->HSMHV2_gdsleak = value->rValue; - mod->HSMHV2_gdsleak_Given = TRUE; - break; - case HSMHV2_MOD_RDRBB: - mod->HSMHV2_rdrbb = value->rValue; - mod->HSMHV2_rdrbb_Given = TRUE; - break; - case HSMHV2_MOD_RDRBBTMP: - mod->HSMHV2_rdrbbtmp = value->rValue; - mod->HSMHV2_rdrbbtmp_Given = TRUE; - break; - - - /* binning parameters */ - case HSMHV2_MOD_LMIN: - mod->HSMHV2_lmin = value->rValue; - mod->HSMHV2_lmin_Given = TRUE; - break; - case HSMHV2_MOD_LMAX: - mod->HSMHV2_lmax = value->rValue; - mod->HSMHV2_lmax_Given = TRUE; - break; - case HSMHV2_MOD_WMIN: - mod->HSMHV2_wmin = value->rValue; - mod->HSMHV2_wmin_Given = TRUE; - break; - case HSMHV2_MOD_WMAX: - mod->HSMHV2_wmax = value->rValue; - mod->HSMHV2_wmax_Given = TRUE; - break; - case HSMHV2_MOD_LBINN: - mod->HSMHV2_lbinn = value->rValue; - mod->HSMHV2_lbinn_Given = TRUE; - break; - case HSMHV2_MOD_WBINN: - mod->HSMHV2_wbinn = value->rValue; - mod->HSMHV2_wbinn_Given = TRUE; - break; - - /* Length dependence */ - case HSMHV2_MOD_LVMAX: - mod->HSMHV2_lvmax = value->rValue; - mod->HSMHV2_lvmax_Given = TRUE; - break; - case HSMHV2_MOD_LBGTMP1: - mod->HSMHV2_lbgtmp1 = value->rValue; - mod->HSMHV2_lbgtmp1_Given = TRUE; - break; - case HSMHV2_MOD_LBGTMP2: - mod->HSMHV2_lbgtmp2 = value->rValue; - mod->HSMHV2_lbgtmp2_Given = TRUE; - break; - case HSMHV2_MOD_LEG0: - mod->HSMHV2_leg0 = value->rValue; - mod->HSMHV2_leg0_Given = TRUE; - break; - case HSMHV2_MOD_LVFBOVER: - mod->HSMHV2_lvfbover = value->rValue; - mod->HSMHV2_lvfbover_Given = TRUE; - break; - case HSMHV2_MOD_LNOVER: - mod->HSMHV2_lnover = value->rValue; - mod->HSMHV2_lnover_Given = TRUE; - break; - case HSMHV2_MOD_LNOVERS: - mod->HSMHV2_lnovers = value->rValue; - mod->HSMHV2_lnovers_Given = TRUE; - break; - case HSMHV2_MOD_LWL2: - mod->HSMHV2_lwl2 = value->rValue; - mod->HSMHV2_lwl2_Given = TRUE; - break; - case HSMHV2_MOD_LVFBC: - mod->HSMHV2_lvfbc = value->rValue; - mod->HSMHV2_lvfbc_Given = TRUE; - break; - case HSMHV2_MOD_LNSUBC: - mod->HSMHV2_lnsubc = value->rValue; - mod->HSMHV2_lnsubc_Given = TRUE; - break; - case HSMHV2_MOD_LNSUBP: - mod->HSMHV2_lnsubp = value->rValue; - mod->HSMHV2_lnsubp_Given = TRUE; - break; - case HSMHV2_MOD_LSCP1: - mod->HSMHV2_lscp1 = value->rValue; - mod->HSMHV2_lscp1_Given = TRUE; - break; - case HSMHV2_MOD_LSCP2: - mod->HSMHV2_lscp2 = value->rValue; - mod->HSMHV2_lscp2_Given = TRUE; - break; - case HSMHV2_MOD_LSCP3: - mod->HSMHV2_lscp3 = value->rValue; - mod->HSMHV2_lscp3_Given = TRUE; - break; - case HSMHV2_MOD_LSC1: - mod->HSMHV2_lsc1 = value->rValue; - mod->HSMHV2_lsc1_Given = TRUE; - break; - case HSMHV2_MOD_LSC2: - mod->HSMHV2_lsc2 = value->rValue; - mod->HSMHV2_lsc2_Given = TRUE; - break; - case HSMHV2_MOD_LSC3: - mod->HSMHV2_lsc3 = value->rValue; - mod->HSMHV2_lsc3_Given = TRUE; - break; - case HSMHV2_MOD_LPGD1: - mod->HSMHV2_lpgd1 = value->rValue; - mod->HSMHV2_lpgd1_Given = TRUE; - break; - case HSMHV2_MOD_LNDEP: - mod->HSMHV2_lndep = value->rValue; - mod->HSMHV2_lndep_Given = TRUE; - break; - case HSMHV2_MOD_LNINV: - mod->HSMHV2_lninv = value->rValue; - mod->HSMHV2_lninv_Given = TRUE; - break; - case HSMHV2_MOD_LMUECB0: - mod->HSMHV2_lmuecb0 = value->rValue; - mod->HSMHV2_lmuecb0_Given = TRUE; - break; - case HSMHV2_MOD_LMUECB1: - mod->HSMHV2_lmuecb1 = value->rValue; - mod->HSMHV2_lmuecb1_Given = TRUE; - break; - case HSMHV2_MOD_LMUEPH1: - mod->HSMHV2_lmueph1 = value->rValue; - mod->HSMHV2_lmueph1_Given = TRUE; - break; - case HSMHV2_MOD_LVTMP: - mod->HSMHV2_lvtmp = value->rValue; - mod->HSMHV2_lvtmp_Given = TRUE; - break; - case HSMHV2_MOD_LWVTH0: - mod->HSMHV2_lwvth0 = value->rValue; - mod->HSMHV2_lwvth0_Given = TRUE; - break; - case HSMHV2_MOD_LMUESR1: - mod->HSMHV2_lmuesr1 = value->rValue; - mod->HSMHV2_lmuesr1_Given = TRUE; - break; - case HSMHV2_MOD_LMUETMP: - mod->HSMHV2_lmuetmp = value->rValue; - mod->HSMHV2_lmuetmp_Given = TRUE; - break; - case HSMHV2_MOD_LSUB1: - mod->HSMHV2_lsub1 = value->rValue; - mod->HSMHV2_lsub1_Given = TRUE; - break; - case HSMHV2_MOD_LSUB2: - mod->HSMHV2_lsub2 = value->rValue; - mod->HSMHV2_lsub2_Given = TRUE; - break; - case HSMHV2_MOD_LSVDS: - mod->HSMHV2_lsvds = value->rValue; - mod->HSMHV2_lsvds_Given = TRUE; - break; - case HSMHV2_MOD_LSVBS: - mod->HSMHV2_lsvbs = value->rValue; - mod->HSMHV2_lsvbs_Given = TRUE; - break; - case HSMHV2_MOD_LSVGS: - mod->HSMHV2_lsvgs = value->rValue; - mod->HSMHV2_lsvgs_Given = TRUE; - break; - case HSMHV2_MOD_LFN1: - mod->HSMHV2_lfn1 = value->rValue; - mod->HSMHV2_lfn1_Given = TRUE; - break; - case HSMHV2_MOD_LFN2: - mod->HSMHV2_lfn2 = value->rValue; - mod->HSMHV2_lfn2_Given = TRUE; - break; - case HSMHV2_MOD_LFN3: - mod->HSMHV2_lfn3 = value->rValue; - mod->HSMHV2_lfn3_Given = TRUE; - break; - case HSMHV2_MOD_LFVBS: - mod->HSMHV2_lfvbs = value->rValue; - mod->HSMHV2_lfvbs_Given = TRUE; - break; - case HSMHV2_MOD_LNSTI: - mod->HSMHV2_lnsti = value->rValue; - mod->HSMHV2_lnsti_Given = TRUE; - break; - case HSMHV2_MOD_LWSTI: - mod->HSMHV2_lwsti = value->rValue; - mod->HSMHV2_lwsti_Given = TRUE; - break; - case HSMHV2_MOD_LSCSTI1: - mod->HSMHV2_lscsti1 = value->rValue; - mod->HSMHV2_lscsti1_Given = TRUE; - break; - case HSMHV2_MOD_LSCSTI2: - mod->HSMHV2_lscsti2 = value->rValue; - mod->HSMHV2_lscsti2_Given = TRUE; - break; - case HSMHV2_MOD_LVTHSTI: - mod->HSMHV2_lvthsti = value->rValue; - mod->HSMHV2_lvthsti_Given = TRUE; - break; - case HSMHV2_MOD_LMUESTI1: - mod->HSMHV2_lmuesti1 = value->rValue; - mod->HSMHV2_lmuesti1_Given = TRUE; - break; - case HSMHV2_MOD_LMUESTI2: - mod->HSMHV2_lmuesti2 = value->rValue; - mod->HSMHV2_lmuesti2_Given = TRUE; - break; - case HSMHV2_MOD_LMUESTI3: - mod->HSMHV2_lmuesti3 = value->rValue; - mod->HSMHV2_lmuesti3_Given = TRUE; - break; - case HSMHV2_MOD_LNSUBPSTI1: - mod->HSMHV2_lnsubpsti1 = value->rValue; - mod->HSMHV2_lnsubpsti1_Given = TRUE; - break; - case HSMHV2_MOD_LNSUBPSTI2: - mod->HSMHV2_lnsubpsti2 = value->rValue; - mod->HSMHV2_lnsubpsti2_Given = TRUE; - break; - case HSMHV2_MOD_LNSUBPSTI3: - mod->HSMHV2_lnsubpsti3 = value->rValue; - mod->HSMHV2_lnsubpsti3_Given = TRUE; - break; - case HSMHV2_MOD_LCGSO: - mod->HSMHV2_lcgso = value->rValue; - mod->HSMHV2_lcgso_Given = TRUE; - break; - case HSMHV2_MOD_LCGDO: - mod->HSMHV2_lcgdo = value->rValue; - mod->HSMHV2_lcgdo_Given = TRUE; - break; - case HSMHV2_MOD_LJS0: - mod->HSMHV2_ljs0 = value->rValue; - mod->HSMHV2_ljs0_Given = TRUE; - break; - case HSMHV2_MOD_LJS0SW: - mod->HSMHV2_ljs0sw = value->rValue; - mod->HSMHV2_ljs0sw_Given = TRUE; - break; - case HSMHV2_MOD_LNJ: - mod->HSMHV2_lnj = value->rValue; - mod->HSMHV2_lnj_Given = TRUE; - break; - case HSMHV2_MOD_LCISBK: - mod->HSMHV2_lcisbk = value->rValue; - mod->HSMHV2_lcisbk_Given = TRUE; - break; - case HSMHV2_MOD_LCLM1: - mod->HSMHV2_lclm1 = value->rValue; - mod->HSMHV2_lclm1_Given = TRUE; - break; - case HSMHV2_MOD_LCLM2: - mod->HSMHV2_lclm2 = value->rValue; - mod->HSMHV2_lclm2_Given = TRUE; - break; - case HSMHV2_MOD_LCLM3: - mod->HSMHV2_lclm3 = value->rValue; - mod->HSMHV2_lclm3_Given = TRUE; - break; - case HSMHV2_MOD_LWFC: - mod->HSMHV2_lwfc = value->rValue; - mod->HSMHV2_lwfc_Given = TRUE; - break; - case HSMHV2_MOD_LGIDL1: - mod->HSMHV2_lgidl1 = value->rValue; - mod->HSMHV2_lgidl1_Given = TRUE; - break; - case HSMHV2_MOD_LGIDL2: - mod->HSMHV2_lgidl2 = value->rValue; - mod->HSMHV2_lgidl2_Given = TRUE; - break; - case HSMHV2_MOD_LGLEAK1: - mod->HSMHV2_lgleak1 = value->rValue; - mod->HSMHV2_lgleak1_Given = TRUE; - break; - case HSMHV2_MOD_LGLEAK2: - mod->HSMHV2_lgleak2 = value->rValue; - mod->HSMHV2_lgleak2_Given = TRUE; - break; - case HSMHV2_MOD_LGLEAK3: - mod->HSMHV2_lgleak3 = value->rValue; - mod->HSMHV2_lgleak3_Given = TRUE; - break; - case HSMHV2_MOD_LGLEAK6: - mod->HSMHV2_lgleak6 = value->rValue; - mod->HSMHV2_lgleak6_Given = TRUE; - break; - case HSMHV2_MOD_LGLKSD1: - mod->HSMHV2_lglksd1 = value->rValue; - mod->HSMHV2_lglksd1_Given = TRUE; - break; - case HSMHV2_MOD_LGLKSD2: - mod->HSMHV2_lglksd2 = value->rValue; - mod->HSMHV2_lglksd2_Given = TRUE; - break; - case HSMHV2_MOD_LGLKB1: - mod->HSMHV2_lglkb1 = value->rValue; - mod->HSMHV2_lglkb1_Given = TRUE; - break; - case HSMHV2_MOD_LGLKB2: - mod->HSMHV2_lglkb2 = value->rValue; - mod->HSMHV2_lglkb2_Given = TRUE; - break; - case HSMHV2_MOD_LNFTRP: - mod->HSMHV2_lnftrp = value->rValue; - mod->HSMHV2_lnftrp_Given = TRUE; - break; - case HSMHV2_MOD_LNFALP: - mod->HSMHV2_lnfalp = value->rValue; - mod->HSMHV2_lnfalp_Given = TRUE; - break; - case HSMHV2_MOD_LVDIFFJ: - mod->HSMHV2_lvdiffj = value->rValue; - mod->HSMHV2_lvdiffj_Given = TRUE; - break; - case HSMHV2_MOD_LIBPC1: - mod->HSMHV2_libpc1 = value->rValue; - mod->HSMHV2_libpc1_Given = TRUE; - break; - case HSMHV2_MOD_LIBPC2: - mod->HSMHV2_libpc2 = value->rValue; - mod->HSMHV2_libpc2_Given = TRUE; - break; - break; - case HSMHV2_MOD_LCGBO: - mod->HSMHV2_lcgbo = value->rValue; - mod->HSMHV2_lcgbo_Given = TRUE; - break; - case HSMHV2_MOD_LCVDSOVER: - mod->HSMHV2_lcvdsover = value->rValue; - mod->HSMHV2_lcvdsover_Given = TRUE; - break; - case HSMHV2_MOD_LFALPH: - mod->HSMHV2_lfalph = value->rValue; - mod->HSMHV2_lfalph_Given = TRUE; - break; - case HSMHV2_MOD_LNPEXT: - mod->HSMHV2_lnpext = value->rValue; - mod->HSMHV2_lnpext_Given = TRUE; - break; - case HSMHV2_MOD_LPOWRAT: - mod->HSMHV2_lpowrat = value->rValue; - mod->HSMHV2_lpowrat_Given = TRUE; - break; - case HSMHV2_MOD_LRD: - mod->HSMHV2_lrd = value->rValue; - mod->HSMHV2_lrd_Given = TRUE; - break; - case HSMHV2_MOD_LRD22: - mod->HSMHV2_lrd22 = value->rValue; - mod->HSMHV2_lrd22_Given = TRUE; - break; - case HSMHV2_MOD_LRD23: - mod->HSMHV2_lrd23 = value->rValue; - mod->HSMHV2_lrd23_Given = TRUE; - break; - case HSMHV2_MOD_LRD24: - mod->HSMHV2_lrd24 = value->rValue; - mod->HSMHV2_lrd24_Given = TRUE; - break; - case HSMHV2_MOD_LRDICT1: - mod->HSMHV2_lrdict1 = value->rValue; - mod->HSMHV2_lrdict1_Given = TRUE; - break; - case HSMHV2_MOD_LRDOV13: - mod->HSMHV2_lrdov13 = value->rValue; - mod->HSMHV2_lrdov13_Given = TRUE; - break; - case HSMHV2_MOD_LRDSLP1: - mod->HSMHV2_lrdslp1 = value->rValue; - mod->HSMHV2_lrdslp1_Given = TRUE; - break; - case HSMHV2_MOD_LRDVB: - mod->HSMHV2_lrdvb = value->rValue; - mod->HSMHV2_lrdvb_Given = TRUE; - break; - case HSMHV2_MOD_LRDVD: - mod->HSMHV2_lrdvd = value->rValue; - mod->HSMHV2_lrdvd_Given = TRUE; - break; - case HSMHV2_MOD_LRDVG11: - mod->HSMHV2_lrdvg11 = value->rValue; - mod->HSMHV2_lrdvg11_Given = TRUE; - break; - case HSMHV2_MOD_LRS: - mod->HSMHV2_lrs = value->rValue; - mod->HSMHV2_lrs_Given = TRUE; - break; - case HSMHV2_MOD_LRTH0: - mod->HSMHV2_lrth0 = value->rValue; - mod->HSMHV2_lrth0_Given = TRUE; - break; - case HSMHV2_MOD_LVOVER: - mod->HSMHV2_lvover = value->rValue; - mod->HSMHV2_lvover_Given = TRUE; - break; - case HSMHV2_MOD_LJS0D: - mod->HSMHV2_ljs0d = value->rValue; - mod->HSMHV2_ljs0d_Given = TRUE; - break; - case HSMHV2_MOD_LJS0SWD: - mod->HSMHV2_ljs0swd = value->rValue; - mod->HSMHV2_ljs0swd_Given = TRUE; - break; - case HSMHV2_MOD_LNJD: - mod->HSMHV2_lnjd = value->rValue; - mod->HSMHV2_lnjd_Given = TRUE; - break; - case HSMHV2_MOD_LCISBKD: - mod->HSMHV2_lcisbkd = value->rValue; - mod->HSMHV2_lcisbkd_Given = TRUE; - break; - case HSMHV2_MOD_LVDIFFJD: - mod->HSMHV2_lvdiffjd = value->rValue; - mod->HSMHV2_lvdiffjd_Given = TRUE; - break; - case HSMHV2_MOD_LJS0S: - mod->HSMHV2_ljs0s = value->rValue; - mod->HSMHV2_ljs0s_Given = TRUE; - break; - case HSMHV2_MOD_LJS0SWS: - mod->HSMHV2_ljs0sws = value->rValue; - mod->HSMHV2_ljs0sws_Given = TRUE; - break; - case HSMHV2_MOD_LNJS: - mod->HSMHV2_lnjs = value->rValue; - mod->HSMHV2_lnjs_Given = TRUE; - break; - case HSMHV2_MOD_LCISBKS: - mod->HSMHV2_lcisbks = value->rValue; - mod->HSMHV2_lcisbks_Given = TRUE; - break; - case HSMHV2_MOD_LVDIFFJS: - mod->HSMHV2_lvdiffjs = value->rValue; - mod->HSMHV2_lvdiffjs_Given = TRUE; - break; - - /* Width dependence */ - case HSMHV2_MOD_WVMAX: - mod->HSMHV2_wvmax = value->rValue; - mod->HSMHV2_wvmax_Given = TRUE; - break; - case HSMHV2_MOD_WBGTMP1: - mod->HSMHV2_wbgtmp1 = value->rValue; - mod->HSMHV2_wbgtmp1_Given = TRUE; - break; - case HSMHV2_MOD_WBGTMP2: - mod->HSMHV2_wbgtmp2 = value->rValue; - mod->HSMHV2_wbgtmp2_Given = TRUE; - break; - case HSMHV2_MOD_WEG0: - mod->HSMHV2_weg0 = value->rValue; - mod->HSMHV2_weg0_Given = TRUE; - break; - case HSMHV2_MOD_WVFBOVER: - mod->HSMHV2_wvfbover = value->rValue; - mod->HSMHV2_wvfbover_Given = TRUE; - break; - case HSMHV2_MOD_WNOVER: - mod->HSMHV2_wnover = value->rValue; - mod->HSMHV2_wnover_Given = TRUE; - break; - case HSMHV2_MOD_WNOVERS: - mod->HSMHV2_wnovers = value->rValue; - mod->HSMHV2_wnovers_Given = TRUE; - break; - case HSMHV2_MOD_WWL2: - mod->HSMHV2_wwl2 = value->rValue; - mod->HSMHV2_wwl2_Given = TRUE; - break; - case HSMHV2_MOD_WVFBC: - mod->HSMHV2_wvfbc = value->rValue; - mod->HSMHV2_wvfbc_Given = TRUE; - break; - case HSMHV2_MOD_WNSUBC: - mod->HSMHV2_wnsubc = value->rValue; - mod->HSMHV2_wnsubc_Given = TRUE; - break; - case HSMHV2_MOD_WNSUBP: - mod->HSMHV2_wnsubp = value->rValue; - mod->HSMHV2_wnsubp_Given = TRUE; - break; - case HSMHV2_MOD_WSCP1: - mod->HSMHV2_wscp1 = value->rValue; - mod->HSMHV2_wscp1_Given = TRUE; - break; - case HSMHV2_MOD_WSCP2: - mod->HSMHV2_wscp2 = value->rValue; - mod->HSMHV2_wscp2_Given = TRUE; - break; - case HSMHV2_MOD_WSCP3: - mod->HSMHV2_wscp3 = value->rValue; - mod->HSMHV2_wscp3_Given = TRUE; - break; - case HSMHV2_MOD_WSC1: - mod->HSMHV2_wsc1 = value->rValue; - mod->HSMHV2_wsc1_Given = TRUE; - break; - case HSMHV2_MOD_WSC2: - mod->HSMHV2_wsc2 = value->rValue; - mod->HSMHV2_wsc2_Given = TRUE; - break; - case HSMHV2_MOD_WSC3: - mod->HSMHV2_wsc3 = value->rValue; - mod->HSMHV2_wsc3_Given = TRUE; - break; - case HSMHV2_MOD_WPGD1: - mod->HSMHV2_wpgd1 = value->rValue; - mod->HSMHV2_wpgd1_Given = TRUE; - break; - case HSMHV2_MOD_WNDEP: - mod->HSMHV2_wndep = value->rValue; - mod->HSMHV2_wndep_Given = TRUE; - break; - case HSMHV2_MOD_WNINV: - mod->HSMHV2_wninv = value->rValue; - mod->HSMHV2_wninv_Given = TRUE; - break; - case HSMHV2_MOD_WMUECB0: - mod->HSMHV2_wmuecb0 = value->rValue; - mod->HSMHV2_wmuecb0_Given = TRUE; - break; - case HSMHV2_MOD_WMUECB1: - mod->HSMHV2_wmuecb1 = value->rValue; - mod->HSMHV2_wmuecb1_Given = TRUE; - break; - case HSMHV2_MOD_WMUEPH1: - mod->HSMHV2_wmueph1 = value->rValue; - mod->HSMHV2_wmueph1_Given = TRUE; - break; - case HSMHV2_MOD_WVTMP: - mod->HSMHV2_wvtmp = value->rValue; - mod->HSMHV2_wvtmp_Given = TRUE; - break; - case HSMHV2_MOD_WWVTH0: - mod->HSMHV2_wwvth0 = value->rValue; - mod->HSMHV2_wwvth0_Given = TRUE; - break; - case HSMHV2_MOD_WMUESR1: - mod->HSMHV2_wmuesr1 = value->rValue; - mod->HSMHV2_wmuesr1_Given = TRUE; - break; - case HSMHV2_MOD_WMUETMP: - mod->HSMHV2_wmuetmp = value->rValue; - mod->HSMHV2_wmuetmp_Given = TRUE; - break; - case HSMHV2_MOD_WSUB1: - mod->HSMHV2_wsub1 = value->rValue; - mod->HSMHV2_wsub1_Given = TRUE; - break; - case HSMHV2_MOD_WSUB2: - mod->HSMHV2_wsub2 = value->rValue; - mod->HSMHV2_wsub2_Given = TRUE; - break; - case HSMHV2_MOD_WSVDS: - mod->HSMHV2_wsvds = value->rValue; - mod->HSMHV2_wsvds_Given = TRUE; - break; - case HSMHV2_MOD_WSVBS: - mod->HSMHV2_wsvbs = value->rValue; - mod->HSMHV2_wsvbs_Given = TRUE; - break; - case HSMHV2_MOD_WSVGS: - mod->HSMHV2_wsvgs = value->rValue; - mod->HSMHV2_wsvgs_Given = TRUE; - break; - case HSMHV2_MOD_WFN1: - mod->HSMHV2_wfn1 = value->rValue; - mod->HSMHV2_wfn1_Given = TRUE; - break; - case HSMHV2_MOD_WFN2: - mod->HSMHV2_wfn2 = value->rValue; - mod->HSMHV2_wfn2_Given = TRUE; - break; - case HSMHV2_MOD_WFN3: - mod->HSMHV2_wfn3 = value->rValue; - mod->HSMHV2_wfn3_Given = TRUE; - break; - case HSMHV2_MOD_WFVBS: - mod->HSMHV2_wfvbs = value->rValue; - mod->HSMHV2_wfvbs_Given = TRUE; - break; - case HSMHV2_MOD_WNSTI: - mod->HSMHV2_wnsti = value->rValue; - mod->HSMHV2_wnsti_Given = TRUE; - break; - case HSMHV2_MOD_WWSTI: - mod->HSMHV2_wwsti = value->rValue; - mod->HSMHV2_wwsti_Given = TRUE; - break; - case HSMHV2_MOD_WSCSTI1: - mod->HSMHV2_wscsti1 = value->rValue; - mod->HSMHV2_wscsti1_Given = TRUE; - break; - case HSMHV2_MOD_WSCSTI2: - mod->HSMHV2_wscsti2 = value->rValue; - mod->HSMHV2_wscsti2_Given = TRUE; - break; - case HSMHV2_MOD_WVTHSTI: - mod->HSMHV2_wvthsti = value->rValue; - mod->HSMHV2_wvthsti_Given = TRUE; - break; - case HSMHV2_MOD_WMUESTI1: - mod->HSMHV2_wmuesti1 = value->rValue; - mod->HSMHV2_wmuesti1_Given = TRUE; - break; - case HSMHV2_MOD_WMUESTI2: - mod->HSMHV2_wmuesti2 = value->rValue; - mod->HSMHV2_wmuesti2_Given = TRUE; - break; - case HSMHV2_MOD_WMUESTI3: - mod->HSMHV2_wmuesti3 = value->rValue; - mod->HSMHV2_wmuesti3_Given = TRUE; - break; - case HSMHV2_MOD_WNSUBPSTI1: - mod->HSMHV2_wnsubpsti1 = value->rValue; - mod->HSMHV2_wnsubpsti1_Given = TRUE; - break; - case HSMHV2_MOD_WNSUBPSTI2: - mod->HSMHV2_wnsubpsti2 = value->rValue; - mod->HSMHV2_wnsubpsti2_Given = TRUE; - break; - case HSMHV2_MOD_WNSUBPSTI3: - mod->HSMHV2_wnsubpsti3 = value->rValue; - mod->HSMHV2_wnsubpsti3_Given = TRUE; - break; - case HSMHV2_MOD_WCGSO: - mod->HSMHV2_wcgso = value->rValue; - mod->HSMHV2_wcgso_Given = TRUE; - break; - case HSMHV2_MOD_WCGDO: - mod->HSMHV2_wcgdo = value->rValue; - mod->HSMHV2_wcgdo_Given = TRUE; - break; - case HSMHV2_MOD_WJS0: - mod->HSMHV2_wjs0 = value->rValue; - mod->HSMHV2_wjs0_Given = TRUE; - break; - case HSMHV2_MOD_WJS0SW: - mod->HSMHV2_wjs0sw = value->rValue; - mod->HSMHV2_wjs0sw_Given = TRUE; - break; - case HSMHV2_MOD_WNJ: - mod->HSMHV2_wnj = value->rValue; - mod->HSMHV2_wnj_Given = TRUE; - break; - case HSMHV2_MOD_WCISBK: - mod->HSMHV2_wcisbk = value->rValue; - mod->HSMHV2_wcisbk_Given = TRUE; - break; - case HSMHV2_MOD_WCLM1: - mod->HSMHV2_wclm1 = value->rValue; - mod->HSMHV2_wclm1_Given = TRUE; - break; - case HSMHV2_MOD_WCLM2: - mod->HSMHV2_wclm2 = value->rValue; - mod->HSMHV2_wclm2_Given = TRUE; - break; - case HSMHV2_MOD_WCLM3: - mod->HSMHV2_wclm3 = value->rValue; - mod->HSMHV2_wclm3_Given = TRUE; - break; - case HSMHV2_MOD_WWFC: - mod->HSMHV2_wwfc = value->rValue; - mod->HSMHV2_wwfc_Given = TRUE; - break; - case HSMHV2_MOD_WGIDL1: - mod->HSMHV2_wgidl1 = value->rValue; - mod->HSMHV2_wgidl1_Given = TRUE; - break; - case HSMHV2_MOD_WGIDL2: - mod->HSMHV2_wgidl2 = value->rValue; - mod->HSMHV2_wgidl2_Given = TRUE; - break; - case HSMHV2_MOD_WGLEAK1: - mod->HSMHV2_wgleak1 = value->rValue; - mod->HSMHV2_wgleak1_Given = TRUE; - break; - case HSMHV2_MOD_WGLEAK2: - mod->HSMHV2_wgleak2 = value->rValue; - mod->HSMHV2_wgleak2_Given = TRUE; - break; - case HSMHV2_MOD_WGLEAK3: - mod->HSMHV2_wgleak3 = value->rValue; - mod->HSMHV2_wgleak3_Given = TRUE; - break; - case HSMHV2_MOD_WGLEAK6: - mod->HSMHV2_wgleak6 = value->rValue; - mod->HSMHV2_wgleak6_Given = TRUE; - break; - case HSMHV2_MOD_WGLKSD1: - mod->HSMHV2_wglksd1 = value->rValue; - mod->HSMHV2_wglksd1_Given = TRUE; - break; - case HSMHV2_MOD_WGLKSD2: - mod->HSMHV2_wglksd2 = value->rValue; - mod->HSMHV2_wglksd2_Given = TRUE; - break; - case HSMHV2_MOD_WGLKB1: - mod->HSMHV2_wglkb1 = value->rValue; - mod->HSMHV2_wglkb1_Given = TRUE; - break; - case HSMHV2_MOD_WGLKB2: - mod->HSMHV2_wglkb2 = value->rValue; - mod->HSMHV2_wglkb2_Given = TRUE; - break; - case HSMHV2_MOD_WNFTRP: - mod->HSMHV2_wnftrp = value->rValue; - mod->HSMHV2_wnftrp_Given = TRUE; - break; - case HSMHV2_MOD_WNFALP: - mod->HSMHV2_wnfalp = value->rValue; - mod->HSMHV2_wnfalp_Given = TRUE; - break; - case HSMHV2_MOD_WVDIFFJ: - mod->HSMHV2_wvdiffj = value->rValue; - mod->HSMHV2_wvdiffj_Given = TRUE; - break; - case HSMHV2_MOD_WIBPC1: - mod->HSMHV2_wibpc1 = value->rValue; - mod->HSMHV2_wibpc1_Given = TRUE; - break; - case HSMHV2_MOD_WIBPC2: - mod->HSMHV2_wibpc2 = value->rValue; - mod->HSMHV2_wibpc2_Given = TRUE; - break; - break; - case HSMHV2_MOD_WCGBO: - mod->HSMHV2_wcgbo = value->rValue; - mod->HSMHV2_wcgbo_Given = TRUE; - break; - case HSMHV2_MOD_WCVDSOVER: - mod->HSMHV2_wcvdsover = value->rValue; - mod->HSMHV2_wcvdsover_Given = TRUE; - break; - case HSMHV2_MOD_WFALPH: - mod->HSMHV2_wfalph = value->rValue; - mod->HSMHV2_wfalph_Given = TRUE; - break; - case HSMHV2_MOD_WNPEXT: - mod->HSMHV2_wnpext = value->rValue; - mod->HSMHV2_wnpext_Given = TRUE; - break; - case HSMHV2_MOD_WPOWRAT: - mod->HSMHV2_wpowrat = value->rValue; - mod->HSMHV2_wpowrat_Given = TRUE; - break; - case HSMHV2_MOD_WRD: - mod->HSMHV2_wrd = value->rValue; - mod->HSMHV2_wrd_Given = TRUE; - break; - case HSMHV2_MOD_WRD22: - mod->HSMHV2_wrd22 = value->rValue; - mod->HSMHV2_wrd22_Given = TRUE; - break; - case HSMHV2_MOD_WRD23: - mod->HSMHV2_wrd23 = value->rValue; - mod->HSMHV2_wrd23_Given = TRUE; - break; - case HSMHV2_MOD_WRD24: - mod->HSMHV2_wrd24 = value->rValue; - mod->HSMHV2_wrd24_Given = TRUE; - break; - case HSMHV2_MOD_WRDICT1: - mod->HSMHV2_wrdict1 = value->rValue; - mod->HSMHV2_wrdict1_Given = TRUE; - break; - case HSMHV2_MOD_WRDOV13: - mod->HSMHV2_wrdov13 = value->rValue; - mod->HSMHV2_wrdov13_Given = TRUE; - break; - case HSMHV2_MOD_WRDSLP1: - mod->HSMHV2_wrdslp1 = value->rValue; - mod->HSMHV2_wrdslp1_Given = TRUE; - break; - case HSMHV2_MOD_WRDVB: - mod->HSMHV2_wrdvb = value->rValue; - mod->HSMHV2_wrdvb_Given = TRUE; - break; - case HSMHV2_MOD_WRDVD: - mod->HSMHV2_wrdvd = value->rValue; - mod->HSMHV2_wrdvd_Given = TRUE; - break; - case HSMHV2_MOD_WRDVG11: - mod->HSMHV2_wrdvg11 = value->rValue; - mod->HSMHV2_wrdvg11_Given = TRUE; - break; - case HSMHV2_MOD_WRS: - mod->HSMHV2_wrs = value->rValue; - mod->HSMHV2_wrs_Given = TRUE; - break; - case HSMHV2_MOD_WRTH0: - mod->HSMHV2_wrth0 = value->rValue; - mod->HSMHV2_wrth0_Given = TRUE; - break; - case HSMHV2_MOD_WVOVER: - mod->HSMHV2_wvover = value->rValue; - mod->HSMHV2_wvover_Given = TRUE; - break; - case HSMHV2_MOD_WJS0D: - mod->HSMHV2_wjs0d = value->rValue; - mod->HSMHV2_wjs0d_Given = TRUE; - break; - case HSMHV2_MOD_WJS0SWD: - mod->HSMHV2_wjs0swd = value->rValue; - mod->HSMHV2_wjs0swd_Given = TRUE; - break; - case HSMHV2_MOD_WNJD: - mod->HSMHV2_wnjd = value->rValue; - mod->HSMHV2_wnjd_Given = TRUE; - break; - case HSMHV2_MOD_WCISBKD: - mod->HSMHV2_wcisbkd = value->rValue; - mod->HSMHV2_wcisbkd_Given = TRUE; - break; - case HSMHV2_MOD_WVDIFFJD: - mod->HSMHV2_wvdiffjd = value->rValue; - mod->HSMHV2_wvdiffjd_Given = TRUE; - break; - case HSMHV2_MOD_WJS0S: - mod->HSMHV2_wjs0s = value->rValue; - mod->HSMHV2_wjs0s_Given = TRUE; - break; - case HSMHV2_MOD_WJS0SWS: - mod->HSMHV2_wjs0sws = value->rValue; - mod->HSMHV2_wjs0sws_Given = TRUE; - break; - case HSMHV2_MOD_WNJS: - mod->HSMHV2_wnjs = value->rValue; - mod->HSMHV2_wnjs_Given = TRUE; - break; - case HSMHV2_MOD_WCISBKS: - mod->HSMHV2_wcisbks = value->rValue; - mod->HSMHV2_wcisbks_Given = TRUE; - break; - case HSMHV2_MOD_WVDIFFJS: - mod->HSMHV2_wvdiffjs = value->rValue; - mod->HSMHV2_wvdiffjs_Given = TRUE; - break; - - /* Cross-term dependence */ - case HSMHV2_MOD_PVMAX: - mod->HSMHV2_pvmax = value->rValue; - mod->HSMHV2_pvmax_Given = TRUE; - break; - case HSMHV2_MOD_PBGTMP1: - mod->HSMHV2_pbgtmp1 = value->rValue; - mod->HSMHV2_pbgtmp1_Given = TRUE; - break; - case HSMHV2_MOD_PBGTMP2: - mod->HSMHV2_pbgtmp2 = value->rValue; - mod->HSMHV2_pbgtmp2_Given = TRUE; - break; - case HSMHV2_MOD_PEG0: - mod->HSMHV2_peg0 = value->rValue; - mod->HSMHV2_peg0_Given = TRUE; - break; - case HSMHV2_MOD_PVFBOVER: - mod->HSMHV2_pvfbover = value->rValue; - mod->HSMHV2_pvfbover_Given = TRUE; - break; - case HSMHV2_MOD_PNOVER: - mod->HSMHV2_pnover = value->rValue; - mod->HSMHV2_pnover_Given = TRUE; - break; - case HSMHV2_MOD_PNOVERS: - mod->HSMHV2_pnovers = value->rValue; - mod->HSMHV2_pnovers_Given = TRUE; - break; - case HSMHV2_MOD_PWL2: - mod->HSMHV2_pwl2 = value->rValue; - mod->HSMHV2_pwl2_Given = TRUE; - break; - case HSMHV2_MOD_PVFBC: - mod->HSMHV2_pvfbc = value->rValue; - mod->HSMHV2_pvfbc_Given = TRUE; - break; - case HSMHV2_MOD_PNSUBC: - mod->HSMHV2_pnsubc = value->rValue; - mod->HSMHV2_pnsubc_Given = TRUE; - break; - case HSMHV2_MOD_PNSUBP: - mod->HSMHV2_pnsubp = value->rValue; - mod->HSMHV2_pnsubp_Given = TRUE; - break; - case HSMHV2_MOD_PSCP1: - mod->HSMHV2_pscp1 = value->rValue; - mod->HSMHV2_pscp1_Given = TRUE; - break; - case HSMHV2_MOD_PSCP2: - mod->HSMHV2_pscp2 = value->rValue; - mod->HSMHV2_pscp2_Given = TRUE; - break; - case HSMHV2_MOD_PSCP3: - mod->HSMHV2_pscp3 = value->rValue; - mod->HSMHV2_pscp3_Given = TRUE; - break; - case HSMHV2_MOD_PSC1: - mod->HSMHV2_psc1 = value->rValue; - mod->HSMHV2_psc1_Given = TRUE; - break; - case HSMHV2_MOD_PSC2: - mod->HSMHV2_psc2 = value->rValue; - mod->HSMHV2_psc2_Given = TRUE; - break; - case HSMHV2_MOD_PSC3: - mod->HSMHV2_psc3 = value->rValue; - mod->HSMHV2_psc3_Given = TRUE; - break; - case HSMHV2_MOD_PPGD1: - mod->HSMHV2_ppgd1 = value->rValue; - mod->HSMHV2_ppgd1_Given = TRUE; - break; - case HSMHV2_MOD_PNDEP: - mod->HSMHV2_pndep = value->rValue; - mod->HSMHV2_pndep_Given = TRUE; - break; - case HSMHV2_MOD_PNINV: - mod->HSMHV2_pninv = value->rValue; - mod->HSMHV2_pninv_Given = TRUE; - break; - case HSMHV2_MOD_PMUECB0: - mod->HSMHV2_pmuecb0 = value->rValue; - mod->HSMHV2_pmuecb0_Given = TRUE; - break; - case HSMHV2_MOD_PMUECB1: - mod->HSMHV2_pmuecb1 = value->rValue; - mod->HSMHV2_pmuecb1_Given = TRUE; - break; - case HSMHV2_MOD_PMUEPH1: - mod->HSMHV2_pmueph1 = value->rValue; - mod->HSMHV2_pmueph1_Given = TRUE; - break; - case HSMHV2_MOD_PVTMP: - mod->HSMHV2_pvtmp = value->rValue; - mod->HSMHV2_pvtmp_Given = TRUE; - break; - case HSMHV2_MOD_PWVTH0: - mod->HSMHV2_pwvth0 = value->rValue; - mod->HSMHV2_pwvth0_Given = TRUE; - break; - case HSMHV2_MOD_PMUESR1: - mod->HSMHV2_pmuesr1 = value->rValue; - mod->HSMHV2_pmuesr1_Given = TRUE; - break; - case HSMHV2_MOD_PMUETMP: - mod->HSMHV2_pmuetmp = value->rValue; - mod->HSMHV2_pmuetmp_Given = TRUE; - break; - case HSMHV2_MOD_PSUB1: - mod->HSMHV2_psub1 = value->rValue; - mod->HSMHV2_psub1_Given = TRUE; - break; - case HSMHV2_MOD_PSUB2: - mod->HSMHV2_psub2 = value->rValue; - mod->HSMHV2_psub2_Given = TRUE; - break; - case HSMHV2_MOD_PSVDS: - mod->HSMHV2_psvds = value->rValue; - mod->HSMHV2_psvds_Given = TRUE; - break; - case HSMHV2_MOD_PSVBS: - mod->HSMHV2_psvbs = value->rValue; - mod->HSMHV2_psvbs_Given = TRUE; - break; - case HSMHV2_MOD_PSVGS: - mod->HSMHV2_psvgs = value->rValue; - mod->HSMHV2_psvgs_Given = TRUE; - break; - case HSMHV2_MOD_PFN1: - mod->HSMHV2_pfn1 = value->rValue; - mod->HSMHV2_pfn1_Given = TRUE; - break; - case HSMHV2_MOD_PFN2: - mod->HSMHV2_pfn2 = value->rValue; - mod->HSMHV2_pfn2_Given = TRUE; - break; - case HSMHV2_MOD_PFN3: - mod->HSMHV2_pfn3 = value->rValue; - mod->HSMHV2_pfn3_Given = TRUE; - break; - case HSMHV2_MOD_PFVBS: - mod->HSMHV2_pfvbs = value->rValue; - mod->HSMHV2_pfvbs_Given = TRUE; - break; - case HSMHV2_MOD_PNSTI: - mod->HSMHV2_pnsti = value->rValue; - mod->HSMHV2_pnsti_Given = TRUE; - break; - case HSMHV2_MOD_PWSTI: - mod->HSMHV2_pwsti = value->rValue; - mod->HSMHV2_pwsti_Given = TRUE; - break; - case HSMHV2_MOD_PSCSTI1: - mod->HSMHV2_pscsti1 = value->rValue; - mod->HSMHV2_pscsti1_Given = TRUE; - break; - case HSMHV2_MOD_PSCSTI2: - mod->HSMHV2_pscsti2 = value->rValue; - mod->HSMHV2_pscsti2_Given = TRUE; - break; - case HSMHV2_MOD_PVTHSTI: - mod->HSMHV2_pvthsti = value->rValue; - mod->HSMHV2_pvthsti_Given = TRUE; - break; - case HSMHV2_MOD_PMUESTI1: - mod->HSMHV2_pmuesti1 = value->rValue; - mod->HSMHV2_pmuesti1_Given = TRUE; - break; - case HSMHV2_MOD_PMUESTI2: - mod->HSMHV2_pmuesti2 = value->rValue; - mod->HSMHV2_pmuesti2_Given = TRUE; - break; - case HSMHV2_MOD_PMUESTI3: - mod->HSMHV2_pmuesti3 = value->rValue; - mod->HSMHV2_pmuesti3_Given = TRUE; - break; - case HSMHV2_MOD_PNSUBPSTI1: - mod->HSMHV2_pnsubpsti1 = value->rValue; - mod->HSMHV2_pnsubpsti1_Given = TRUE; - break; - case HSMHV2_MOD_PNSUBPSTI2: - mod->HSMHV2_pnsubpsti2 = value->rValue; - mod->HSMHV2_pnsubpsti2_Given = TRUE; - break; - case HSMHV2_MOD_PNSUBPSTI3: - mod->HSMHV2_pnsubpsti3 = value->rValue; - mod->HSMHV2_pnsubpsti3_Given = TRUE; - break; - case HSMHV2_MOD_PCGSO: - mod->HSMHV2_pcgso = value->rValue; - mod->HSMHV2_pcgso_Given = TRUE; - break; - case HSMHV2_MOD_PCGDO: - mod->HSMHV2_pcgdo = value->rValue; - mod->HSMHV2_pcgdo_Given = TRUE; - break; - case HSMHV2_MOD_PJS0: - mod->HSMHV2_pjs0 = value->rValue; - mod->HSMHV2_pjs0_Given = TRUE; - break; - case HSMHV2_MOD_PJS0SW: - mod->HSMHV2_pjs0sw = value->rValue; - mod->HSMHV2_pjs0sw_Given = TRUE; - break; - case HSMHV2_MOD_PNJ: - mod->HSMHV2_pnj = value->rValue; - mod->HSMHV2_pnj_Given = TRUE; - break; - case HSMHV2_MOD_PCISBK: - mod->HSMHV2_pcisbk = value->rValue; - mod->HSMHV2_pcisbk_Given = TRUE; - break; - case HSMHV2_MOD_PCLM1: - mod->HSMHV2_pclm1 = value->rValue; - mod->HSMHV2_pclm1_Given = TRUE; - break; - case HSMHV2_MOD_PCLM2: - mod->HSMHV2_pclm2 = value->rValue; - mod->HSMHV2_pclm2_Given = TRUE; - break; - case HSMHV2_MOD_PCLM3: - mod->HSMHV2_pclm3 = value->rValue; - mod->HSMHV2_pclm3_Given = TRUE; - break; - case HSMHV2_MOD_PWFC: - mod->HSMHV2_pwfc = value->rValue; - mod->HSMHV2_pwfc_Given = TRUE; - break; - case HSMHV2_MOD_PGIDL1: - mod->HSMHV2_pgidl1 = value->rValue; - mod->HSMHV2_pgidl1_Given = TRUE; - break; - case HSMHV2_MOD_PGIDL2: - mod->HSMHV2_pgidl2 = value->rValue; - mod->HSMHV2_pgidl2_Given = TRUE; - break; - case HSMHV2_MOD_PGLEAK1: - mod->HSMHV2_pgleak1 = value->rValue; - mod->HSMHV2_pgleak1_Given = TRUE; - break; - case HSMHV2_MOD_PGLEAK2: - mod->HSMHV2_pgleak2 = value->rValue; - mod->HSMHV2_pgleak2_Given = TRUE; - break; - case HSMHV2_MOD_PGLEAK3: - mod->HSMHV2_pgleak3 = value->rValue; - mod->HSMHV2_pgleak3_Given = TRUE; - break; - case HSMHV2_MOD_PGLEAK6: - mod->HSMHV2_pgleak6 = value->rValue; - mod->HSMHV2_pgleak6_Given = TRUE; - break; - case HSMHV2_MOD_PGLKSD1: - mod->HSMHV2_pglksd1 = value->rValue; - mod->HSMHV2_pglksd1_Given = TRUE; - break; - case HSMHV2_MOD_PGLKSD2: - mod->HSMHV2_pglksd2 = value->rValue; - mod->HSMHV2_pglksd2_Given = TRUE; - break; - case HSMHV2_MOD_PGLKB1: - mod->HSMHV2_pglkb1 = value->rValue; - mod->HSMHV2_pglkb1_Given = TRUE; - break; - case HSMHV2_MOD_PGLKB2: - mod->HSMHV2_pglkb2 = value->rValue; - mod->HSMHV2_pglkb2_Given = TRUE; - break; - case HSMHV2_MOD_PNFTRP: - mod->HSMHV2_pnftrp = value->rValue; - mod->HSMHV2_pnftrp_Given = TRUE; - break; - case HSMHV2_MOD_PNFALP: - mod->HSMHV2_pnfalp = value->rValue; - mod->HSMHV2_pnfalp_Given = TRUE; - break; - case HSMHV2_MOD_PVDIFFJ: - mod->HSMHV2_pvdiffj = value->rValue; - mod->HSMHV2_pvdiffj_Given = TRUE; - break; - case HSMHV2_MOD_PIBPC1: - mod->HSMHV2_pibpc1 = value->rValue; - mod->HSMHV2_pibpc1_Given = TRUE; - break; - case HSMHV2_MOD_PIBPC2: - mod->HSMHV2_pibpc2 = value->rValue; - mod->HSMHV2_pibpc2_Given = TRUE; - break; - break; - case HSMHV2_MOD_PCGBO: - mod->HSMHV2_pcgbo = value->rValue; - mod->HSMHV2_pcgbo_Given = TRUE; - break; - case HSMHV2_MOD_PCVDSOVER: - mod->HSMHV2_pcvdsover = value->rValue; - mod->HSMHV2_pcvdsover_Given = TRUE; - break; - case HSMHV2_MOD_PFALPH: - mod->HSMHV2_pfalph = value->rValue; - mod->HSMHV2_pfalph_Given = TRUE; - break; - case HSMHV2_MOD_PNPEXT: - mod->HSMHV2_pnpext = value->rValue; - mod->HSMHV2_pnpext_Given = TRUE; - break; - case HSMHV2_MOD_PPOWRAT: - mod->HSMHV2_ppowrat = value->rValue; - mod->HSMHV2_ppowrat_Given = TRUE; - break; - case HSMHV2_MOD_PRD: - mod->HSMHV2_prd = value->rValue; - mod->HSMHV2_prd_Given = TRUE; - break; - case HSMHV2_MOD_PRD22: - mod->HSMHV2_prd22 = value->rValue; - mod->HSMHV2_prd22_Given = TRUE; - break; - case HSMHV2_MOD_PRD23: - mod->HSMHV2_prd23 = value->rValue; - mod->HSMHV2_prd23_Given = TRUE; - break; - case HSMHV2_MOD_PRD24: - mod->HSMHV2_prd24 = value->rValue; - mod->HSMHV2_prd24_Given = TRUE; - break; - case HSMHV2_MOD_PRDICT1: - mod->HSMHV2_prdict1 = value->rValue; - mod->HSMHV2_prdict1_Given = TRUE; - break; - case HSMHV2_MOD_PRDOV13: - mod->HSMHV2_prdov13 = value->rValue; - mod->HSMHV2_prdov13_Given = TRUE; - break; - case HSMHV2_MOD_PRDSLP1: - mod->HSMHV2_prdslp1 = value->rValue; - mod->HSMHV2_prdslp1_Given = TRUE; - break; - case HSMHV2_MOD_PRDVB: - mod->HSMHV2_prdvb = value->rValue; - mod->HSMHV2_prdvb_Given = TRUE; - break; - case HSMHV2_MOD_PRDVD: - mod->HSMHV2_prdvd = value->rValue; - mod->HSMHV2_prdvd_Given = TRUE; - break; - case HSMHV2_MOD_PRDVG11: - mod->HSMHV2_prdvg11 = value->rValue; - mod->HSMHV2_prdvg11_Given = TRUE; - break; - case HSMHV2_MOD_PRS: - mod->HSMHV2_prs = value->rValue; - mod->HSMHV2_prs_Given = TRUE; - break; - case HSMHV2_MOD_PRTH0: - mod->HSMHV2_prth0 = value->rValue; - mod->HSMHV2_prth0_Given = TRUE; - break; - case HSMHV2_MOD_PVOVER: - mod->HSMHV2_pvover = value->rValue; - mod->HSMHV2_pvover_Given = TRUE; - break; - - case HSMHV2_MOD_PJS0D: - mod->HSMHV2_pjs0d = value->rValue; - mod->HSMHV2_pjs0d_Given = TRUE; - break; - case HSMHV2_MOD_PJS0SWD: - mod->HSMHV2_pjs0swd = value->rValue; - mod->HSMHV2_pjs0swd_Given = TRUE; - break; - case HSMHV2_MOD_PNJD: - mod->HSMHV2_pnjd = value->rValue; - mod->HSMHV2_pnjd_Given = TRUE; - break; - case HSMHV2_MOD_PCISBKD: - mod->HSMHV2_pcisbkd = value->rValue; - mod->HSMHV2_pcisbkd_Given = TRUE; - break; - case HSMHV2_MOD_PVDIFFJD: - mod->HSMHV2_pvdiffjd = value->rValue; - mod->HSMHV2_pvdiffjd_Given = TRUE; - break; - case HSMHV2_MOD_PJS0S: - mod->HSMHV2_pjs0s = value->rValue; - mod->HSMHV2_pjs0s_Given = TRUE; - break; - case HSMHV2_MOD_PJS0SWS: - mod->HSMHV2_pjs0sws = value->rValue; - mod->HSMHV2_pjs0sws_Given = TRUE; - break; - case HSMHV2_MOD_PNJS: - mod->HSMHV2_pnjs = value->rValue; - mod->HSMHV2_pnjs_Given = TRUE; - break; - case HSMHV2_MOD_PCISBKS: - mod->HSMHV2_pcisbks = value->rValue; - mod->HSMHV2_pcisbks_Given = TRUE; - break; - case HSMHV2_MOD_PVDIFFJS: - mod->HSMHV2_pvdiffjs = value->rValue; - mod->HSMHV2_pvdiffjs_Given = TRUE; - break; - case HSMHV2_MOD_NDEPM: - mod->HSMHV2_ndepm = value->rValue; - mod->HSMHV2_ndepm_Given = TRUE; - break; - case HSMHV2_MOD_TNDEP: - mod->HSMHV2_tndep = value->rValue; - mod->HSMHV2_tndep_Given = TRUE; - break; - case HSMHV2_MOD_DEPMUE0: - mod->HSMHV2_depmue0 = value->rValue; - mod->HSMHV2_depmue0_Given = TRUE; - break; - case HSMHV2_MOD_DEPMUE1: - mod->HSMHV2_depmue1 = value->rValue; - mod->HSMHV2_depmue1_Given = TRUE; - break; - case HSMHV2_MOD_DEPMUEBACK0: - mod->HSMHV2_depmueback0 = value->rValue; - mod->HSMHV2_depmueback0_Given = TRUE; - break; - case HSMHV2_MOD_DEPMUEBACK1: - mod->HSMHV2_depmueback1 = value->rValue; - mod->HSMHV2_depmueback1_Given = TRUE; - break; - case HSMHV2_MOD_DEPLEAK: - mod->HSMHV2_depleak = value->rValue; - mod->HSMHV2_depleak_Given = TRUE; - break; - case HSMHV2_MOD_DEPETA: - mod->HSMHV2_depeta = value->rValue; - mod->HSMHV2_depeta_Given = TRUE; - break; - case HSMHV2_MOD_DEPVMAX: - mod->HSMHV2_depvmax = value->rValue; - mod->HSMHV2_depvmax_Given = TRUE; - break; - case HSMHV2_MOD_DEPVDSEF1: - mod->HSMHV2_depvdsef1 = value->rValue; - mod->HSMHV2_depvdsef1_Given = TRUE; - break; - case HSMHV2_MOD_DEPVDSEF2: - mod->HSMHV2_depvdsef2 = value->rValue; - mod->HSMHV2_depvdsef2_Given = TRUE; - break; - case HSMHV2_MOD_DEPMUEPH0: - mod->HSMHV2_depmueph0 = value->rValue; - mod->HSMHV2_depmueph0_Given = TRUE; - break; - case HSMHV2_MOD_DEPMUEPH1: - mod->HSMHV2_depmueph1 = value->rValue; - mod->HSMHV2_depmueph1_Given = TRUE; - break; - case HSMHV2_MOD_DEPBB: - mod->HSMHV2_depbb = value->rValue; - mod->HSMHV2_depbb_Given = TRUE; - break; - case HSMHV2_MOD_DEPVTMP: - mod->HSMHV2_depvtmp = value->rValue; - mod->HSMHV2_depvtmp_Given = TRUE; - break; - case HSMHV2_MOD_DEPMUETMP: - mod->HSMHV2_depmuetmp = value->rValue; - mod->HSMHV2_depmuetmp_Given = TRUE; - break; - case HSMHV2_MOD_ISBREAK: - mod->HSMHV2_isbreak = value->rValue; - mod->HSMHV2_isbreak_Given = TRUE; - break; - case HSMHV2_MOD_RWELL: - mod->HSMHV2_rwell = value->rValue; - mod->HSMHV2_rwell_Given = TRUE; - break; - - case HSMHV2_MOD_VGS_MAX: - mod->HSMHV2vgsMax = value->rValue; - mod->HSMHV2vgsMaxGiven = TRUE; - break; - case HSMHV2_MOD_VGD_MAX: - mod->HSMHV2vgdMax = value->rValue; - mod->HSMHV2vgdMaxGiven = TRUE; - break; - case HSMHV2_MOD_VGB_MAX: - mod->HSMHV2vgbMax = value->rValue; - mod->HSMHV2vgbMaxGiven = TRUE; - break; - case HSMHV2_MOD_VDS_MAX: - mod->HSMHV2vdsMax = value->rValue; - mod->HSMHV2vdsMaxGiven = TRUE; - break; - case HSMHV2_MOD_VBS_MAX: - mod->HSMHV2vbsMax = value->rValue; - mod->HSMHV2vbsMaxGiven = TRUE; - break; - case HSMHV2_MOD_VBD_MAX: - mod->HSMHV2vbdMax = value->rValue; - mod->HSMHV2vbdMaxGiven = TRUE; - break; - case HSMHV2_MOD_VGSR_MAX: - mod->HSMHV2vgsrMax = value->rValue; - mod->HSMHV2vgsrMaxGiven = TRUE; - break; - case HSMHV2_MOD_VGDR_MAX: - mod->HSMHV2vgdrMax = value->rValue; - mod->HSMHV2vgdrMaxGiven = TRUE; - break; - case HSMHV2_MOD_VGBR_MAX: - mod->HSMHV2vgbrMax = value->rValue; - mod->HSMHV2vgbrMaxGiven = TRUE; - break; - case HSMHV2_MOD_VBSR_MAX: - mod->HSMHV2vbsrMax = value->rValue; - mod->HSMHV2vbsrMaxGiven = TRUE; - break; - case HSMHV2_MOD_VBDR_MAX: - mod->HSMHV2vbdrMax = value->rValue; - mod->HSMHV2vbdrMaxGiven = TRUE; - break; - - default: - return(E_BADPARM); - } - return(OK); -} diff --git a/src/spicelib/devices/hisimhv2/hsmhv2noi.c b/src/spicelib/devices/hisimhv2/hsmhv2noi.c deleted file mode 100644 index 66bd7bb25..000000000 --- a/src/spicelib/devices/hisimhv2/hsmhv2noi.c +++ /dev/null @@ -1,286 +0,0 @@ -/*********************************************************************** - - HiSIM (Hiroshima University STARC IGFET Model) - Copyright (C) 2014 Hiroshima University & STARC - - MODEL NAME : HiSIM_HV - ( VERSION : 2 SUBVERSION : 2 REVISION : 0 ) - Model Parameter 'VERSION' : 2.20 - FILE : hsmhvnoi.c - - DATE : 2014.6.11 - - released by - Hiroshima University & - Semiconductor Technology Academic Research Center (STARC) -***********************************************************************/ - -/********************************************************************** - -The following source code, and all copyrights, trade secrets or other -intellectual property rights in and to the source code in its entirety, -is owned by the Hiroshima University and the STARC organization. - -All users need to follow the "HISIM_HV Distribution Statement and -Copyright Notice" attached to HiSIM_HV model. - ------HISIM_HV Distribution Statement and Copyright Notice-------------- - -Software is distributed as is, completely without warranty or service -support. Hiroshima University or STARC and its employees are not liable -for the condition or performance of the software. - -Hiroshima University and STARC own the copyright and grant users a perpetual, -irrevocable, worldwide, non-exclusive, royalty-free license with respect -to the software as set forth below. - -Hiroshima University and STARC hereby disclaims all implied warranties. - -Hiroshima University and STARC grant the users the right to modify, copy, -and redistribute the software and documentation, both within the user's -organization and externally, subject to the following restrictions - -1. The users agree not to charge for Hiroshima University and STARC code -itself but may charge for additions, extensions, or support. - -2. In any product based on the software, the users agree to acknowledge -Hiroshima University and STARC that developed the software. This -acknowledgment shall appear in the product documentation. - -3. The users agree to reproduce any copyright notice which appears on -the software on any copy or modification of such made available -to others." - -Toshimasa Asahara, President, Hiroshima University -Mitiko Miura-Mattausch, Professor, Hiroshima University -Katsuhiro Shimohigashi, President&CEO, STARC -June 2008 (revised October 2011) -*************************************************************************/ - -#include "ngspice/ngspice.h" -#include "hsmhv2def.h" -#include "ngspice/cktdefs.h" -#include "ngspice/iferrmsg.h" -#include "ngspice/noisedef.h" -#include "ngspice/suffix.h" -#include "ngspice/const.h" /* jwan */ -#include "hsmhv2evalenv.h" -/* #include "hsmhv2macro.h" */ - -/* - * HSMHV2noise (mode, operation, firstModel, ckt, data, OnDens) - * This routine names and evaluates all of the noise sources - * associated with MOSFET's. It starts with the model *firstModel and - * traverses all of its insts. It then proceeds to any other models - * on the linked list. The total output noise density generated by - * all of the MOSFET's is summed with the variable "OnDens". - */ - -int HSMHV2noise ( - int mode, int operation, - GENmodel *inModel, - CKTcircuit *ckt, - Ndata *data, - double *OnDens) -{ - HSMHV2model *model = (HSMHV2model *)inModel; - HSMHV2instance *here; - double tempOnoise=0.0 ; - double tempInoise=0.0 ; - double noizDens[HSMHV2NSRCS] ; - double lnNdens[HSMHV2NSRCS] ; - int i; - double G =0.0 ; - double TTEMP = 0.0 ; - - /* define the names of the noise sources */ - static char * HSMHV2nNames[HSMHV2NSRCS] = { - /* Note that we have to keep the order - consistent with the index definitions - in hsmhvdefs.h */ - ".rd", /* noise due to rd */ - ".rs", /* noise due to rs */ - ".id", /* noise due to id */ - ".1ovf", /* flicker (1/f) noise */ - ".ign", /* induced gate noise component at the drain node */ - "" /* total transistor noise */ - }; - - for ( ;model != NULL; model = HSMHV2nextModel(model)) { - for ( here = HSMHV2instances(model); here != NULL; - here = HSMHV2nextInstance(here)) { - switch (operation) { - case N_OPEN: - /* see if we have to to produce a summary report */ - /* if so, name all the noise generators */ - - if (((NOISEAN*)ckt->CKTcurJob)->NStpsSm != 0) { - switch (mode) { - case N_DENS: - for ( i = 0; i < HSMHV2NSRCS; i++ ) { - NOISE_ADD_OUTVAR(ckt, data, "onoise.%s%s", here->HSMHV2name, HSMHV2nNames[i]); - } - break; - case INT_NOIZ: - for ( i = 0; i < HSMHV2NSRCS; i++ ) { - NOISE_ADD_OUTVAR(ckt, data, "onoise_total.%s%s", here->HSMHV2name, HSMHV2nNames[i]); - NOISE_ADD_OUTVAR(ckt, data, "inoise_total.%s%s", here->HSMHV2name, HSMHV2nNames[i]); - } - break; - } - } - break; - case N_CALC: - switch (mode) { - case N_DENS: - - /* temperature */ - TTEMP = ckt->CKTtemp; - if ( here->HSMHV2_dtemp_Given ) { TTEMP = TTEMP + here->HSMHV2_dtemp ; } - TTEMP = TTEMP + *(ckt->CKTstate0 + here->HSMHV2deltemp) ; - - /* rs/rd thermal noise */ - if ( model->HSMHV2_corsrd == 1 || model->HSMHV2_corsrd == 3 || model->HSMHV2_cordrift == 1 ) { - NevalSrc(&noizDens[HSMHV2RDNOIZ], NULL, - ckt, N_GAIN, - here->HSMHV2dNodePrime, here->HSMHV2dNode, - 0.0); - noizDens[HSMHV2RDNOIZ] *= 4 * C_KB * TTEMP * here->HSMHV2drainConductance ; - lnNdens[HSMHV2RDNOIZ] = log( MAX(noizDens[HSMHV2RDNOIZ],N_MINLOG) ); - - NevalSrc(&noizDens[HSMHV2RSNOIZ], NULL, - ckt, N_GAIN, - here->HSMHV2sNodePrime, here->HSMHV2sNode, - 0.0); - noizDens[HSMHV2RSNOIZ] *= 4 * C_KB * TTEMP * here->HSMHV2sourceConductance ; - lnNdens[HSMHV2RSNOIZ] = log( MAX(noizDens[HSMHV2RSNOIZ],N_MINLOG) ); - } else { - noizDens[HSMHV2RDNOIZ] = 0e0 ; - lnNdens[HSMHV2RDNOIZ] = N_MINLOG ; - noizDens[HSMHV2RSNOIZ] = 0e0 ; - lnNdens[HSMHV2RSNOIZ] = N_MINLOG ; - } - - /* channel thermal noise */ - NevalSrc(&noizDens[HSMHV2IDNOIZ], NULL, - ckt, N_GAIN, - here->HSMHV2dNodePrime, here->HSMHV2sNodePrime, - 0.0); - switch( model->HSMHV2_noise ) { - case 1: - /* HiSIMHV model */ - G = here->HSMHV2_noithrml ; - noizDens[HSMHV2IDNOIZ] *= 4 * C_KB * TTEMP * G ; - lnNdens[HSMHV2IDNOIZ] = log( MAX(noizDens[HSMHV2IDNOIZ],N_MINLOG) ); - break; - } - - /* flicker noise */ - NevalSrc(&noizDens[HSMHV2FLNOIZ], NULL, - ckt, N_GAIN, - here->HSMHV2dNodePrime, here->HSMHV2sNodePrime, - 0.0); - switch ( model->HSMHV2_noise ) { - case 1: - /* HiSIM model */ - noizDens[HSMHV2FLNOIZ] *= here->HSMHV2_noiflick / pow(data->freq, model->HSMHV2_falph) ; - lnNdens[HSMHV2FLNOIZ] = log(MAX(noizDens[HSMHV2FLNOIZ], N_MINLOG)); - break; - } - - /* induced gate noise */ - NevalSrc(&noizDens[HSMHV2IGNOIZ], NULL, - ckt, N_GAIN, - here->HSMHV2dNodePrime, here->HSMHV2sNodePrime, - 0.0); - switch ( model->HSMHV2_noise ) { - case 1: - /* HiSIM model */ - noizDens[HSMHV2IGNOIZ] *= here->HSMHV2_noiigate * here->HSMHV2_noicross * here->HSMHV2_noicross * data->freq * data->freq; - lnNdens[HSMHV2IGNOIZ] = log(MAX(noizDens[HSMHV2IGNOIZ], N_MINLOG)); - break; - } - - /* total */ - noizDens[HSMHV2TOTNOIZ] = noizDens[HSMHV2RDNOIZ] + noizDens[HSMHV2RSNOIZ] - + noizDens[HSMHV2IDNOIZ] + noizDens[HSMHV2FLNOIZ] + noizDens[HSMHV2IGNOIZ]; - lnNdens[HSMHV2TOTNOIZ] = log(MAX(noizDens[HSMHV2TOTNOIZ], N_MINLOG)); - - *OnDens += noizDens[HSMHV2TOTNOIZ]; - - if ( data->delFreq == 0.0 ) { - /* if we haven't done any previous - integration, we need to initialize our - "history" variables. - */ - - for ( i = 0; i < HSMHV2NSRCS; i++ ) - here->HSMHV2nVar[LNLSTDENS][i] = lnNdens[i]; - - /* clear out our integration variables - if it's the first pass - */ - if (data->freq == ((NOISEAN*) ckt->CKTcurJob)->NstartFreq) { - for (i = 0; i < HSMHV2NSRCS; i++) { - here->HSMHV2nVar[OUTNOIZ][i] = 0.0; - here->HSMHV2nVar[INNOIZ][i] = 0.0; - } - } - } - else { - /* data->delFreq != 0.0, - we have to integrate. - */ - for ( i = 0; i < HSMHV2NSRCS; i++ ) { - if ( i != HSMHV2TOTNOIZ ) { - tempOnoise = - Nintegrate(noizDens[i], lnNdens[i], - here->HSMHV2nVar[LNLSTDENS][i], data); - tempInoise = - Nintegrate(noizDens[i] * data->GainSqInv, - lnNdens[i] + data->lnGainInv, - here->HSMHV2nVar[LNLSTDENS][i] + data->lnGainInv, - data); - here->HSMHV2nVar[LNLSTDENS][i] = lnNdens[i]; - data->outNoiz += tempOnoise; - data->inNoise += tempInoise; - if ( ((NOISEAN*)ckt->CKTcurJob)->NStpsSm != 0 ) { - here->HSMHV2nVar[OUTNOIZ][i] += tempOnoise; - here->HSMHV2nVar[OUTNOIZ][HSMHV2TOTNOIZ] += tempOnoise; - here->HSMHV2nVar[INNOIZ][i] += tempInoise; - here->HSMHV2nVar[INNOIZ][HSMHV2TOTNOIZ] += tempInoise; - } - } - } - } - if ( data->prtSummary ) { - for (i = 0; i < HSMHV2NSRCS; i++) { - /* print a summary report */ - data->outpVector[data->outNumber++] = noizDens[i]; - } - } - break; - case INT_NOIZ: - /* already calculated, just output */ - if ( ((NOISEAN*)ckt->CKTcurJob)->NStpsSm != 0 ) { - for ( i = 0; i < HSMHV2NSRCS; i++ ) { - data->outpVector[data->outNumber++] = here->HSMHV2nVar[OUTNOIZ][i]; - data->outpVector[data->outNumber++] = here->HSMHV2nVar[INNOIZ][i]; - } - } - break; - } - break; - case N_CLOSE: - /* do nothing, the main calling routine will close */ - return (OK); - break; /* the plots */ - } /* switch (operation) */ - } /* for here */ - } /* for model */ - - return(OK); -} - - - diff --git a/src/spicelib/devices/hisimhv2/hsmhv2par.c b/src/spicelib/devices/hisimhv2/hsmhv2par.c deleted file mode 100644 index 999426f29..000000000 --- a/src/spicelib/devices/hisimhv2/hsmhv2par.c +++ /dev/null @@ -1,266 +0,0 @@ -/*********************************************************************** - - HiSIM (Hiroshima University STARC IGFET Model) - Copyright (C) 2014 Hiroshima University & STARC - - MODEL NAME : HiSIM_HV - ( VERSION : 2 SUBVERSION : 2 REVISION : 0 ) - Model Parameter 'VERSION' : 2.20 - FILE : hsmhvpar.c - - DATE : 2014.6.11 - - released by - Hiroshima University & - Semiconductor Technology Academic Research Center (STARC) -***********************************************************************/ - -/********************************************************************** - -The following source code, and all copyrights, trade secrets or other -intellectual property rights in and to the source code in its entirety, -is owned by the Hiroshima University and the STARC organization. - -All users need to follow the "HISIM_HV Distribution Statement and -Copyright Notice" attached to HiSIM_HV model. - ------HISIM_HV Distribution Statement and Copyright Notice-------------- - -Software is distributed as is, completely without warranty or service -support. Hiroshima University or STARC and its employees are not liable -for the condition or performance of the software. - -Hiroshima University and STARC own the copyright and grant users a perpetual, -irrevocable, worldwide, non-exclusive, royalty-free license with respect -to the software as set forth below. - -Hiroshima University and STARC hereby disclaims all implied warranties. - -Hiroshima University and STARC grant the users the right to modify, copy, -and redistribute the software and documentation, both within the user's -organization and externally, subject to the following restrictions - -1. The users agree not to charge for Hiroshima University and STARC code -itself but may charge for additions, extensions, or support. - -2. In any product based on the software, the users agree to acknowledge -Hiroshima University and STARC that developed the software. This -acknowledgment shall appear in the product documentation. - -3. The users agree to reproduce any copyright notice which appears on -the software on any copy or modification of such made available -to others." - -Toshimasa Asahara, President, Hiroshima University -Mitiko Miura-Mattausch, Professor, Hiroshima University -Katsuhiro Shimohigashi, President&CEO, STARC -June 2008 (revised October 2011) -*************************************************************************/ - -#include "ngspice/ngspice.h" -#include "ngspice/ifsim.h" -#include "hsmhv2def.h" -#include "ngspice/sperror.h" -#include "ngspice/suffix.h" -#include "ngspice/fteext.h" - -int HSMHV2param( - int param, - IFvalue *value, - GENinstance *inst, - IFvalue *select) -{ - double scale; - - HSMHV2instance *here = (HSMHV2instance*)inst; - - NG_IGNORE(select); - - if (!cp_getvar("scale", CP_REAL, &scale, 0)) - scale = 1; - - switch (param) { - case HSMHV2_COSELFHEAT: - here->HSMHV2_coselfheat = value->iValue; - here->HSMHV2_coselfheat_Given = TRUE; - break; - case HSMHV2_COSUBNODE: - here->HSMHV2_cosubnode = value->iValue; - here->HSMHV2_cosubnode_Given = TRUE; - break; - case HSMHV2_W: - here->HSMHV2_w = value->rValue * scale; - here->HSMHV2_w_Given = TRUE; - break; - case HSMHV2_L: - here->HSMHV2_l = value->rValue * scale; - here->HSMHV2_l_Given = TRUE; - break; - case HSMHV2_AS: - here->HSMHV2_as = value->rValue * scale * scale; - here->HSMHV2_as_Given = TRUE; - break; - case HSMHV2_AD: - here->HSMHV2_ad = value->rValue * scale * scale; - here->HSMHV2_ad_Given = TRUE; - break; - case HSMHV2_PS: - here->HSMHV2_ps = value->rValue * scale; - here->HSMHV2_ps_Given = TRUE; - break; - case HSMHV2_PD: - here->HSMHV2_pd = value->rValue * scale; - here->HSMHV2_pd_Given = TRUE; - break; - case HSMHV2_NRS: - here->HSMHV2_nrs = value->rValue; - here->HSMHV2_nrs_Given = TRUE; - break; - case HSMHV2_NRD: - here->HSMHV2_nrd = value->rValue; - here->HSMHV2_nrd_Given = TRUE; - break; - case HSMHV2_DTEMP: - here->HSMHV2_dtemp = value->rValue; - here->HSMHV2_dtemp_Given = TRUE; - break; - case HSMHV2_OFF: - here->HSMHV2_off = value->iValue; - break; - case HSMHV2_IC_VBS: - here->HSMHV2_icVBS = value->rValue; - here->HSMHV2_icVBS_Given = TRUE; - break; - case HSMHV2_IC_VDS: - here->HSMHV2_icVDS = value->rValue; - here->HSMHV2_icVDS_Given = TRUE; - break; - case HSMHV2_IC_VGS: - here->HSMHV2_icVGS = value->rValue; - here->HSMHV2_icVGS_Given = TRUE; - break; - case HSMHV2_IC: - /* FALLTHROUGH added to suppress GCC warning due to - * -Wimplicit-fallthrough flag */ - switch (value->v.numValue) { - case 3: - here->HSMHV2_icVBS = *(value->v.vec.rVec + 2); - here->HSMHV2_icVBS_Given = TRUE; - /* FALLTHROUGH */ - case 2: - here->HSMHV2_icVGS = *(value->v.vec.rVec + 1); - here->HSMHV2_icVGS_Given = TRUE; - /* FALLTHROUGH */ - case 1: - here->HSMHV2_icVDS = *(value->v.vec.rVec); - here->HSMHV2_icVDS_Given = TRUE; - break; - default: - return(E_BADPARM); - } - break; - case HSMHV2_CORBNET: - here->HSMHV2_corbnet = value->iValue; - here->HSMHV2_corbnet_Given = TRUE; - break; - case HSMHV2_RBPB: - here->HSMHV2_rbpb = value->rValue; - here->HSMHV2_rbpb_Given = TRUE; - break; - case HSMHV2_RBPD: - here->HSMHV2_rbpd = value->rValue; - here->HSMHV2_rbpd_Given = TRUE; - break; - case HSMHV2_RBPS: - here->HSMHV2_rbps = value->rValue; - here->HSMHV2_rbps_Given = TRUE; - break; - case HSMHV2_RBDB: - here->HSMHV2_rbdb = value->rValue; - here->HSMHV2_rbdb_Given = TRUE; - break; - case HSMHV2_RBSB: - here->HSMHV2_rbsb = value->rValue; - here->HSMHV2_rbsb_Given = TRUE; - break; - case HSMHV2_CORG: - here->HSMHV2_corg = value->iValue; - here->HSMHV2_corg_Given = TRUE; - break; - case HSMHV2_NGCON: - here->HSMHV2_ngcon = value->rValue; - here->HSMHV2_ngcon_Given = TRUE; - break; - case HSMHV2_XGW: - here->HSMHV2_xgw = value->rValue; - here->HSMHV2_xgw_Given = TRUE; - break; - case HSMHV2_XGL: - here->HSMHV2_xgl = value->rValue; - here->HSMHV2_xgl_Given = TRUE; - break; - case HSMHV2_NF: - here->HSMHV2_nf = value->rValue; - here->HSMHV2_nf_Given = TRUE; - break; - case HSMHV2_SA: - here->HSMHV2_sa = value->rValue; - here->HSMHV2_sa_Given = TRUE; - break; - case HSMHV2_SB: - here->HSMHV2_sb = value->rValue; - here->HSMHV2_sb_Given = TRUE; - break; - case HSMHV2_SD: - here->HSMHV2_sd = value->rValue; - here->HSMHV2_sd_Given = TRUE; - break; - case HSMHV2_NSUBCDFM: - here->HSMHV2_nsubcdfm = value->rValue; - here->HSMHV2_nsubcdfm_Given = TRUE; - break; - case HSMHV2_M: - here->HSMHV2_m = value->rValue; - here->HSMHV2_m_Given = TRUE; - break; - case HSMHV2_SUBLD1: - here->HSMHV2_subld1 = value->rValue; - here->HSMHV2_subld1_Given = TRUE; - break; - case HSMHV2_SUBLD2: - here->HSMHV2_subld2 = value->rValue; - here->HSMHV2_subld2_Given = TRUE; - break; - case HSMHV2_LOVER: - here->HSMHV2_lover = value->rValue; - here->HSMHV2_lover_Given = TRUE; - break; - case HSMHV2_LOVERS: - here->HSMHV2_lovers = value->rValue; - here->HSMHV2_lovers_Given = TRUE; - break; - case HSMHV2_LOVERLD: - here->HSMHV2_loverld = value->rValue; - here->HSMHV2_loverld_Given = TRUE; - break; - case HSMHV2_LDRIFT1: - here->HSMHV2_ldrift1 = value->rValue; - here->HSMHV2_ldrift1_Given = TRUE; - break; - case HSMHV2_LDRIFT2: - here->HSMHV2_ldrift2 = value->rValue; - here->HSMHV2_ldrift2_Given = TRUE; - break; - case HSMHV2_LDRIFT1S: - here->HSMHV2_ldrift1s = value->rValue; - here->HSMHV2_ldrift1s_Given = TRUE; - break; - case HSMHV2_LDRIFT2S: - here->HSMHV2_ldrift2s = value->rValue; - here->HSMHV2_ldrift2s_Given = TRUE; - break; - default: - return(E_BADPARM); - } - return(OK); -} diff --git a/src/spicelib/devices/hisimhv2/hsmhv2pzld.c b/src/spicelib/devices/hisimhv2/hsmhv2pzld.c deleted file mode 100644 index fffa038cd..000000000 --- a/src/spicelib/devices/hisimhv2/hsmhv2pzld.c +++ /dev/null @@ -1,323 +0,0 @@ -/*********************************************************************** - - HiSIM (Hiroshima University STARC IGFET Model) - Copyright (C) 2014 Hiroshima University & STARC - - MODEL NAME : HiSIM_HV - ( VERSION : 2 SUBVERSION : 2 REVISION : 0 ) - Model Parameter 'VERSION' : 2.20 - FILE : hsmhvpzld.c - - DATE : 2014.6.11 - - released by - Hiroshima University & - Semiconductor Technology Academic Research Center (STARC) -***********************************************************************/ - -/********************************************************************** - -The following source code, and all copyrights, trade secrets or other -intellectual property rights in and to the source code in its entirety, -is owned by the Hiroshima University and the STARC organization. - -All users need to follow the "HISIM_HV Distribution Statement and -Copyright Notice" attached to HiSIM_HV model. - ------HISIM_HV Distribution Statement and Copyright Notice-------------- - -Software is distributed as is, completely without warranty or service -support. Hiroshima University or STARC and its employees are not liable -for the condition or performance of the software. - -Hiroshima University and STARC own the copyright and grant users a perpetual, -irrevocable, worldwide, non-exclusive, royalty-free license with respect -to the software as set forth below. - -Hiroshima University and STARC hereby disclaims all implied warranties. - -Hiroshima University and STARC grant the users the right to modify, copy, -and redistribute the software and documentation, both within the user's -organization and externally, subject to the following restrictions - -1. The users agree not to charge for Hiroshima University and STARC code -itself but may charge for additions, extensions, or support. - -2. In any product based on the software, the users agree to acknowledge -Hiroshima University and STARC that developed the software. This -acknowledgment shall appear in the product documentation. - -3. The users agree to reproduce any copyright notice which appears on -the software on any copy or modification of such made available -to others." - -Toshimasa Asahara, President, Hiroshima University -Mitiko Miura-Mattausch, Professor, Hiroshima University -Katsuhiro Shimohigashi, President&CEO, STARC -June 2008 (revised October 2011) -*************************************************************************/ - -#include "ngspice/ngspice.h" -#include "ngspice/cktdefs.h" -#include "ngspice/complex.h" -#include "ngspice/sperror.h" -#include "hsmhv2def.h" -#include "ngspice/suffix.h" - -int HSMHV2pzLoad( - GENmodel *inModel, - CKTcircuit *ckt, - SPcomplex *s) -{ - HSMHV2model *model = (HSMHV2model*)inModel; - HSMHV2instance *here; - int flg_nqs =0 ; - - NG_IGNORE(ckt); - -#define dNode 0 -#define dNodePrime 1 -#define gNode 2 -#define gNodePrime 3 -#define sNode 4 -#define sNodePrime 5 -#define bNodePrime 6 -#define bNode 7 -#define dbNode 8 -#define sbNode 9 -#define tempNode 10 -#define qiNode 11 -#define qbNode 12 - - - for ( ;model != NULL ;model = HSMHV2nextModel(model)) { - for ( here = HSMHV2instances(model);here!= NULL ; - here = HSMHV2nextInstance(here)) { - - flg_nqs = model->HSMHV2_conqs ; - - /* stamp matrix */ - - /*drain*/ - *(here->HSMHV2DdPtr) += here->HSMHV2_ydc_d[dNode] + here->HSMHV2_ydyn_d[dNode] * s->real; - *(here->HSMHV2DdPtr +1) += here->HSMHV2_ydyn_d[dNode] * s->imag; - *(here->HSMHV2DdpPtr) += here->HSMHV2_ydc_d[dNodePrime] + here->HSMHV2_ydyn_d[dNodePrime] * s->real; - *(here->HSMHV2DdpPtr +1) += here->HSMHV2_ydyn_d[dNodePrime] * s->imag; - *(here->HSMHV2DgpPtr) += here->HSMHV2_ydc_d[gNodePrime] + here->HSMHV2_ydyn_d[gNodePrime] * s->real; - *(here->HSMHV2DgpPtr +1) += here->HSMHV2_ydyn_d[gNodePrime] * s->imag; - *(here->HSMHV2DsPtr) += here->HSMHV2_ydc_d[sNode] + here->HSMHV2_ydyn_d[sNode] * s->real; - *(here->HSMHV2DsPtr +1) += here->HSMHV2_ydyn_d[sNode] * s->imag; - *(here->HSMHV2DbpPtr) += here->HSMHV2_ydc_d[bNodePrime] + here->HSMHV2_ydyn_d[bNodePrime] * s->real; - *(here->HSMHV2DbpPtr +1) += here->HSMHV2_ydyn_d[bNodePrime] * s->imag; - *(here->HSMHV2DdbPtr) += here->HSMHV2_ydc_d[dbNode] + here->HSMHV2_ydyn_d[dbNode] * s->real; - *(here->HSMHV2DdbPtr +1) += here->HSMHV2_ydyn_d[dbNode] * s->imag; - if( here->HSMHV2tempNode > 0) { - *(here->HSMHV2DtempPtr) += model->HSMHV2_type * (here->HSMHV2_ydc_d[tempNode] + here->HSMHV2_ydyn_d[tempNode] * s->real); - *(here->HSMHV2DtempPtr +1) += model->HSMHV2_type * here->HSMHV2_ydyn_d[tempNode] * s->imag; - } - - /*drain prime*/ - *(here->HSMHV2DPdPtr) += here->HSMHV2_ydc_dP[dNode] + here->HSMHV2_ydyn_dP[dNode] * s->real; - *(here->HSMHV2DPdPtr +1) += here->HSMHV2_ydyn_dP[dNode] * s->imag; - *(here->HSMHV2DPdpPtr) += here->HSMHV2_ydc_dP[dNodePrime] + here->HSMHV2_ydyn_dP[dNodePrime] * s->real; - *(here->HSMHV2DPdpPtr +1) += here->HSMHV2_ydyn_dP[dNodePrime] * s->imag; - *(here->HSMHV2DPgpPtr) += here->HSMHV2_ydc_dP[gNodePrime] + here->HSMHV2_ydyn_dP[gNodePrime] * s->real; - *(here->HSMHV2DPgpPtr +1) += here->HSMHV2_ydyn_dP[gNodePrime] * s->imag; - *(here->HSMHV2DPsPtr) += here->HSMHV2_ydc_dP[sNode] + here->HSMHV2_ydyn_dP[sNode] * s->real; - *(here->HSMHV2DPsPtr +1) += here->HSMHV2_ydyn_dP[sNode] * s->imag; - *(here->HSMHV2DPspPtr) += here->HSMHV2_ydc_dP[sNodePrime] + here->HSMHV2_ydyn_dP[sNodePrime] * s->real; - *(here->HSMHV2DPspPtr +1) += here->HSMHV2_ydyn_dP[sNodePrime] * s->imag; - *(here->HSMHV2DPbpPtr) += here->HSMHV2_ydc_dP[bNodePrime] + here->HSMHV2_ydyn_dP[bNodePrime] * s->real; - *(here->HSMHV2DPbpPtr +1) += here->HSMHV2_ydyn_dP[bNodePrime] * s->imag; - if( here->HSMHV2tempNode > 0) { - *(here->HSMHV2DPtempPtr) += model->HSMHV2_type * (here->HSMHV2_ydc_dP[tempNode] + here->HSMHV2_ydyn_dP[tempNode] * s->real); - *(here->HSMHV2DPtempPtr +1) += model->HSMHV2_type * here->HSMHV2_ydyn_dP[tempNode] * s->imag; - } - if (flg_nqs) { - *(here->HSMHV2DPqiPtr) += model->HSMHV2_type * (here->HSMHV2_ydc_dP[qiNode] + here->HSMHV2_ydyn_dP[qiNode] * s->real); - *(here->HSMHV2DPqiPtr+1) += model->HSMHV2_type * here->HSMHV2_ydyn_dP[qiNode] * s->imag; - } - - - /*gate*/ - *(here->HSMHV2GgPtr) += here->HSMHV2_ydc_g[gNode] + here->HSMHV2_ydyn_g[gNode] * s->real; - *(here->HSMHV2GgPtr +1) += here->HSMHV2_ydyn_g[gNode] * s->imag; - *(here->HSMHV2GgpPtr) += here->HSMHV2_ydc_g[gNodePrime] + here->HSMHV2_ydyn_g[gNodePrime] * s->real; - *(here->HSMHV2GgpPtr +1) += here->HSMHV2_ydyn_g[gNodePrime] * s->imag; - - /*gate prime*/ - *(here->HSMHV2GPdPtr) += here->HSMHV2_ydc_gP[dNode] + here->HSMHV2_ydyn_gP[dNode] * s->real; - *(here->HSMHV2GPdPtr +1) += here->HSMHV2_ydyn_gP[dNode] * s->imag; - *(here->HSMHV2GPdpPtr) += here->HSMHV2_ydc_gP[dNodePrime] + here->HSMHV2_ydyn_gP[dNodePrime] * s->real; - *(here->HSMHV2GPdpPtr +1) += here->HSMHV2_ydyn_gP[dNodePrime] * s->imag; - *(here->HSMHV2GPgPtr) += here->HSMHV2_ydc_gP[gNode] + here->HSMHV2_ydyn_gP[gNode] * s->real; - *(here->HSMHV2GPgPtr +1) += here->HSMHV2_ydyn_gP[gNode] * s->imag; - *(here->HSMHV2GPgpPtr) += here->HSMHV2_ydc_gP[gNodePrime] + here->HSMHV2_ydyn_gP[gNodePrime] * s->real; - *(here->HSMHV2GPgpPtr +1) += here->HSMHV2_ydyn_gP[gNodePrime] * s->imag; - *(here->HSMHV2GPsPtr) += here->HSMHV2_ydc_gP[sNode] + here->HSMHV2_ydyn_gP[sNode] * s->real; - *(here->HSMHV2GPsPtr +1) += here->HSMHV2_ydyn_gP[sNode] * s->imag; - *(here->HSMHV2GPspPtr) += here->HSMHV2_ydc_gP[sNodePrime] + here->HSMHV2_ydyn_gP[sNodePrime] * s->real; - *(here->HSMHV2GPspPtr +1) += here->HSMHV2_ydyn_gP[sNodePrime] * s->imag; - *(here->HSMHV2GPbpPtr) += here->HSMHV2_ydc_gP[bNodePrime] + here->HSMHV2_ydyn_gP[bNodePrime] * s->real; - *(here->HSMHV2GPbpPtr +1) += here->HSMHV2_ydyn_gP[bNodePrime] * s->imag; - if( here->HSMHV2tempNode > 0) { - *(here->HSMHV2GPtempPtr) += model->HSMHV2_type * (here->HSMHV2_ydc_gP[tempNode] + here->HSMHV2_ydyn_gP[tempNode] * s->real); - *(here->HSMHV2GPtempPtr +1) += model->HSMHV2_type * here->HSMHV2_ydyn_gP[tempNode] * s->imag; - } - if (flg_nqs) { - *(here->HSMHV2GPqiPtr) += model->HSMHV2_type * (here->HSMHV2_ydc_gP[qiNode] + here->HSMHV2_ydyn_gP[qiNode] * s->real); - *(here->HSMHV2GPqiPtr+1) += model->HSMHV2_type * here->HSMHV2_ydyn_gP[qiNode] * s->imag; - *(here->HSMHV2GPqbPtr) += model->HSMHV2_type * (here->HSMHV2_ydc_gP[qbNode] + here->HSMHV2_ydyn_gP[qbNode] * s->real); - *(here->HSMHV2GPqbPtr+1) += model->HSMHV2_type * here->HSMHV2_ydyn_gP[qbNode] * s->imag; - } - - /*source*/ - *(here->HSMHV2SdPtr) += here->HSMHV2_ydc_s[dNode] + here->HSMHV2_ydyn_s[dNode] * s->real; - *(here->HSMHV2SdPtr +1) += here->HSMHV2_ydyn_s[dNode] * s->imag; - *(here->HSMHV2SgpPtr) += here->HSMHV2_ydc_s[gNodePrime] + here->HSMHV2_ydyn_s[gNodePrime] * s->real; - *(here->HSMHV2SgpPtr +1) += here->HSMHV2_ydyn_s[gNodePrime] * s->imag; - *(here->HSMHV2SsPtr) += here->HSMHV2_ydc_s[sNode] + here->HSMHV2_ydyn_s[sNode] * s->real; - *(here->HSMHV2SsPtr +1) += here->HSMHV2_ydyn_s[sNode] * s->imag; - *(here->HSMHV2SspPtr) += here->HSMHV2_ydc_s[sNodePrime] + here->HSMHV2_ydyn_s[sNodePrime] * s->real; - *(here->HSMHV2SspPtr +1) += here->HSMHV2_ydyn_s[sNodePrime] * s->imag; - *(here->HSMHV2SbpPtr) += here->HSMHV2_ydc_s[bNodePrime] + here->HSMHV2_ydyn_s[bNodePrime] * s->real; - *(here->HSMHV2SbpPtr +1) += here->HSMHV2_ydyn_s[bNodePrime] * s->imag; - *(here->HSMHV2SsbPtr) += here->HSMHV2_ydc_s[sbNode] + here->HSMHV2_ydyn_s[sbNode] * s->real; - *(here->HSMHV2SsbPtr +1) += here->HSMHV2_ydyn_s[sbNode] * s->imag; - if( here->HSMHV2tempNode > 0) { - *(here->HSMHV2StempPtr) += model->HSMHV2_type * (here->HSMHV2_ydc_s[tempNode] + here->HSMHV2_ydyn_s[tempNode] * s->real); - *(here->HSMHV2StempPtr +1) += model->HSMHV2_type * here->HSMHV2_ydyn_s[tempNode] * s->imag; - } - - /*source prime*/ - *(here->HSMHV2SPdPtr) += here->HSMHV2_ydc_sP[dNode] + here->HSMHV2_ydyn_sP[dNode] * s->real; - *(here->HSMHV2SPdPtr +1) += here->HSMHV2_ydyn_sP[dNode] * s->imag; - *(here->HSMHV2SPdpPtr) += here->HSMHV2_ydc_sP[dNodePrime] + here->HSMHV2_ydyn_sP[dNodePrime] * s->real; - *(here->HSMHV2SPdpPtr +1) += here->HSMHV2_ydyn_sP[dNodePrime] * s->imag; - *(here->HSMHV2SPgpPtr) += here->HSMHV2_ydc_sP[gNodePrime] + here->HSMHV2_ydyn_sP[gNodePrime] * s->real; - *(here->HSMHV2SPgpPtr +1) += here->HSMHV2_ydyn_sP[gNodePrime] * s->imag; - *(here->HSMHV2SPsPtr) += here->HSMHV2_ydc_sP[sNode] + here->HSMHV2_ydyn_sP[sNode] * s->real; - *(here->HSMHV2SPsPtr +1) += here->HSMHV2_ydyn_sP[sNode] * s->imag; - *(here->HSMHV2SPspPtr) += here->HSMHV2_ydc_sP[sNodePrime] + here->HSMHV2_ydyn_sP[sNodePrime] * s->real; - *(here->HSMHV2SPspPtr +1) += here->HSMHV2_ydyn_sP[sNodePrime] * s->imag; - *(here->HSMHV2SPbpPtr) += here->HSMHV2_ydc_sP[bNodePrime] + here->HSMHV2_ydyn_sP[bNodePrime] * s->real; - *(here->HSMHV2SPbpPtr +1) += here->HSMHV2_ydyn_sP[bNodePrime] * s->imag; - if( here->HSMHV2tempNode > 0) { - *(here->HSMHV2SPtempPtr) += model->HSMHV2_type * (here->HSMHV2_ydc_sP[tempNode] + here->HSMHV2_ydyn_sP[tempNode] * s->real); - *(here->HSMHV2SPtempPtr +1) += model->HSMHV2_type * here->HSMHV2_ydyn_sP[tempNode] * s->imag; - } - if (flg_nqs) { - *(here->HSMHV2SPqiPtr) += model->HSMHV2_type * (here->HSMHV2_ydc_sP[qiNode] + here->HSMHV2_ydyn_sP[qiNode] * s->real); - *(here->HSMHV2SPqiPtr+1) += model->HSMHV2_type * here->HSMHV2_ydyn_sP[qiNode] * s->imag; - } - - /*bulk prime*/ - *(here->HSMHV2BPdpPtr) += here->HSMHV2_ydc_bP[dNodePrime] + here->HSMHV2_ydyn_bP[dNodePrime] * s->real; - *(here->HSMHV2BPdpPtr +1) += here->HSMHV2_ydyn_bP[dNodePrime] * s->imag; - *(here->HSMHV2BPgpPtr) += here->HSMHV2_ydc_bP[gNodePrime] + here->HSMHV2_ydyn_bP[gNodePrime] * s->real; - *(here->HSMHV2BPgpPtr +1) += here->HSMHV2_ydyn_bP[gNodePrime] * s->imag; - *(here->HSMHV2BPspPtr) += here->HSMHV2_ydc_bP[sNodePrime] + here->HSMHV2_ydyn_bP[sNodePrime] * s->real; - *(here->HSMHV2BPspPtr +1) += here->HSMHV2_ydyn_bP[sNodePrime] * s->imag; - *(here->HSMHV2BPbpPtr) += here->HSMHV2_ydc_bP[bNodePrime] + here->HSMHV2_ydyn_bP[bNodePrime] * s->real; - *(here->HSMHV2BPbpPtr +1) += here->HSMHV2_ydyn_bP[bNodePrime] * s->imag; - *(here->HSMHV2BPbPtr) += here->HSMHV2_ydc_bP[bNode] + here->HSMHV2_ydyn_bP[bNode] * s->real; - *(here->HSMHV2BPbPtr +1) += here->HSMHV2_ydyn_bP[bNode] * s->imag; - *(here->HSMHV2BPdbPtr) += here->HSMHV2_ydc_bP[dbNode] + here->HSMHV2_ydyn_bP[dbNode] * s->real; - *(here->HSMHV2BPdbPtr +1) += here->HSMHV2_ydyn_bP[dbNode] * s->imag; - *(here->HSMHV2BPsbPtr) += here->HSMHV2_ydc_bP[sbNode] + here->HSMHV2_ydyn_bP[sbNode] * s->real; - *(here->HSMHV2BPsbPtr +1) += here->HSMHV2_ydyn_bP[sbNode] * s->imag; - if( here->HSMHV2tempNode > 0) { - *(here->HSMHV2BPtempPtr) += model->HSMHV2_type * (here->HSMHV2_ydc_bP[tempNode] + here->HSMHV2_ydyn_bP[tempNode] * s->real); - *(here->HSMHV2BPtempPtr +1) += model->HSMHV2_type * here->HSMHV2_ydyn_bP[tempNode] * s->imag; - } - if (flg_nqs) { - *(here->HSMHV2BPqbPtr) += model->HSMHV2_type * (here->HSMHV2_ydc_bP[qbNode] + here->HSMHV2_ydyn_bP[qbNode] * s->real); - *(here->HSMHV2BPqbPtr+1) += model->HSMHV2_type * here->HSMHV2_ydyn_bP[qbNode] * s->imag; - } - - /*bulk*/ - *(here->HSMHV2BbpPtr) += here->HSMHV2_ydc_b[bNodePrime] + here->HSMHV2_ydyn_b[bNodePrime] * s->real; - *(here->HSMHV2BbpPtr +1) += here->HSMHV2_ydyn_b[bNodePrime] * s->imag; - *(here->HSMHV2BbPtr) += here->HSMHV2_ydc_b[bNode] + here->HSMHV2_ydyn_b[bNode] * s->real; - *(here->HSMHV2BbPtr +1) += here->HSMHV2_ydyn_b[bNode] * s->imag; - - /*drain bulk*/ - *(here->HSMHV2DBdPtr) += here->HSMHV2_ydc_db[dNode] + here->HSMHV2_ydyn_db[dNode] * s->real; - *(here->HSMHV2DBdPtr +1) += here->HSMHV2_ydyn_db[dNode] * s->imag; - *(here->HSMHV2DBbpPtr) += here->HSMHV2_ydc_db[bNodePrime] + here->HSMHV2_ydyn_db[bNodePrime] * s->real; - *(here->HSMHV2DBbpPtr +1) += here->HSMHV2_ydyn_db[bNodePrime] * s->imag; - *(here->HSMHV2DBdbPtr) += here->HSMHV2_ydc_db[dbNode] + here->HSMHV2_ydyn_db[dbNode] * s->real; - *(here->HSMHV2DBdbPtr +1) += here->HSMHV2_ydyn_db[dbNode] * s->imag; - if( here->HSMHV2tempNode > 0) { - *(here->HSMHV2DBtempPtr) += model->HSMHV2_type * (here->HSMHV2_ydc_db[tempNode] + here->HSMHV2_ydyn_db[tempNode] * s->real); - *(here->HSMHV2DBtempPtr +1) += model->HSMHV2_type * here->HSMHV2_ydyn_db[tempNode] * s->imag; - } - - /*source bulk*/ - *(here->HSMHV2SBsPtr) += here->HSMHV2_ydc_sb[sNode] + here->HSMHV2_ydyn_sb[sNode] * s->real; - *(here->HSMHV2SBsPtr +1) += here->HSMHV2_ydyn_sb[sNode] * s->imag; - *(here->HSMHV2SBbpPtr) += here->HSMHV2_ydc_sb[bNodePrime] + here->HSMHV2_ydyn_sb[bNodePrime] * s->real; - *(here->HSMHV2SBbpPtr +1) += here->HSMHV2_ydyn_sb[bNodePrime] * s->imag; - *(here->HSMHV2SBsbPtr) += here->HSMHV2_ydc_sb[sbNode] + here->HSMHV2_ydyn_sb[sbNode] * s->real; - *(here->HSMHV2SBsbPtr +1) += here->HSMHV2_ydyn_sb[sbNode] * s->imag; - if( here->HSMHV2tempNode > 0) { - *(here->HSMHV2SBtempPtr) += model->HSMHV2_type * (here->HSMHV2_ydc_sb[tempNode] + here->HSMHV2_ydyn_sb[tempNode] * s->real); - *(here->HSMHV2SBtempPtr +1) += model->HSMHV2_type * here->HSMHV2_ydyn_sb[tempNode] * s->imag; - } - - /*temp*/ - if( here->HSMHV2tempNode > 0) { - *(here->HSMHV2TempdPtr) += model->HSMHV2_type * (here->HSMHV2_ydc_t[dNode] + here->HSMHV2_ydyn_t[dNode] * s->real); - *(here->HSMHV2TempdPtr +1) += model->HSMHV2_type * here->HSMHV2_ydyn_t[dNode] * s->imag; - *(here->HSMHV2TempdpPtr) += model->HSMHV2_type * (here->HSMHV2_ydc_t[dNodePrime] + here->HSMHV2_ydyn_t[dNodePrime] * s->real); - *(here->HSMHV2TempdpPtr +1) += model->HSMHV2_type * here->HSMHV2_ydyn_t[dNodePrime] * s->imag; - *(here->HSMHV2TempgpPtr) += model->HSMHV2_type * (here->HSMHV2_ydc_t[gNodePrime] + here->HSMHV2_ydyn_t[gNodePrime] * s->real); - *(here->HSMHV2TempgpPtr +1) += model->HSMHV2_type * here->HSMHV2_ydyn_t[gNodePrime] * s->imag; - *(here->HSMHV2TempsPtr) += model->HSMHV2_type * (here->HSMHV2_ydc_t[sNode] + here->HSMHV2_ydyn_t[sNode] * s->real); - *(here->HSMHV2TempsPtr +1) += model->HSMHV2_type * here->HSMHV2_ydyn_t[sNode] * s->imag; - *(here->HSMHV2TempspPtr) += model->HSMHV2_type * (here->HSMHV2_ydc_t[sNodePrime] + here->HSMHV2_ydyn_t[sNodePrime] * s->real); - *(here->HSMHV2TempspPtr +1) += model->HSMHV2_type * here->HSMHV2_ydyn_t[sNodePrime] * s->imag; - *(here->HSMHV2TempbpPtr) += model->HSMHV2_type * (here->HSMHV2_ydc_t[bNodePrime] + here->HSMHV2_ydyn_t[bNodePrime] * s->real); - *(here->HSMHV2TempbpPtr +1) += model->HSMHV2_type * here->HSMHV2_ydyn_t[bNodePrime] * s->imag; - *(here->HSMHV2TemptempPtr) += here->HSMHV2_ydc_t[tempNode] + here->HSMHV2_ydyn_t[tempNode] * s->real; - *(here->HSMHV2TemptempPtr +1) += here->HSMHV2_ydyn_t[tempNode] * s->imag; - } - /* additional entries for flat nqs handling */ - if ( flg_nqs ) { - /*qi*/ - *(here->HSMHV2QIdpPtr) += model->HSMHV2_type * (here->HSMHV2_ydc_qi[dNodePrime] + here->HSMHV2_ydyn_qi[dNodePrime] * s->real); - *(here->HSMHV2QIdpPtr+1) += model->HSMHV2_type * here->HSMHV2_ydyn_qi[dNodePrime] * s->imag; - *(here->HSMHV2QIgpPtr) += model->HSMHV2_type * (here->HSMHV2_ydc_qi[gNodePrime] + here->HSMHV2_ydyn_qi[gNodePrime] * s->real); - *(here->HSMHV2QIgpPtr+1) += model->HSMHV2_type * here->HSMHV2_ydyn_qi[gNodePrime] * s->imag; - *(here->HSMHV2QIspPtr) += model->HSMHV2_type * (here->HSMHV2_ydc_qi[sNodePrime] + here->HSMHV2_ydyn_qi[sNodePrime] * s->real); - *(here->HSMHV2QIspPtr+1) += model->HSMHV2_type * here->HSMHV2_ydyn_qi[sNodePrime] * s->imag; - *(here->HSMHV2QIbpPtr) += model->HSMHV2_type * (here->HSMHV2_ydc_qi[bNodePrime] + here->HSMHV2_ydyn_qi[bNodePrime] * s->real); - *(here->HSMHV2QIbpPtr+1) += model->HSMHV2_type * here->HSMHV2_ydyn_qi[bNodePrime] * s->imag; - *(here->HSMHV2QIqiPtr) += here->HSMHV2_ydc_qi[qiNode] + here->HSMHV2_ydyn_qi[qiNode] * s->real; - *(here->HSMHV2QIqiPtr+1) += here->HSMHV2_ydyn_qi[qiNode] * s->imag; - if ( here->HSMHV2tempNode > 0 ) { - *(here->HSMHV2QItempPtr) += here->HSMHV2_ydc_qi[tempNode] + here->HSMHV2_ydyn_qi[tempNode] * s->real; - *(here->HSMHV2QItempPtr+1) += here->HSMHV2_ydyn_qi[tempNode] * s->imag; - } - - /*qb*/ - *(here->HSMHV2QBdpPtr) += model->HSMHV2_type * (here->HSMHV2_ydc_qb[dNodePrime] + here->HSMHV2_ydyn_qb[dNodePrime] * s->real); - *(here->HSMHV2QBdpPtr+1) += model->HSMHV2_type * here->HSMHV2_ydyn_qb[dNodePrime] * s->imag; - *(here->HSMHV2QBgpPtr) += model->HSMHV2_type * (here->HSMHV2_ydc_qb[gNodePrime] + here->HSMHV2_ydyn_qb[gNodePrime] * s->real); - *(here->HSMHV2QBgpPtr+1) += model->HSMHV2_type * here->HSMHV2_ydyn_qb[gNodePrime] * s->imag; - *(here->HSMHV2QBspPtr) += model->HSMHV2_type * (here->HSMHV2_ydc_qb[sNodePrime] + here->HSMHV2_ydyn_qb[sNodePrime] * s->real); - *(here->HSMHV2QBspPtr+1) += model->HSMHV2_type * here->HSMHV2_ydyn_qb[sNodePrime] * s->imag; - *(here->HSMHV2QBbpPtr) += model->HSMHV2_type * (here->HSMHV2_ydc_qb[bNodePrime] + here->HSMHV2_ydyn_qb[bNodePrime] * s->real); - *(here->HSMHV2QBbpPtr+1) += model->HSMHV2_type * here->HSMHV2_ydyn_qb[bNodePrime] * s->imag; - *(here->HSMHV2QBqbPtr) += here->HSMHV2_ydc_qb[qbNode] + here->HSMHV2_ydyn_qb[qbNode] * s->real; - *(here->HSMHV2QBqbPtr+1) += here->HSMHV2_ydyn_qb[qbNode] * s->imag; - if ( here->HSMHV2tempNode > 0 ) { - *(here->HSMHV2QBtempPtr) += here->HSMHV2_ydc_qb[tempNode] + here->HSMHV2_ydyn_qb[tempNode] * s->real; - *(here->HSMHV2QBtempPtr+1) += here->HSMHV2_ydyn_qb[tempNode] * s->imag; - } - } - } - } - return(OK); -} - diff --git a/src/spicelib/devices/hisimhv2/hsmhv2set.c b/src/spicelib/devices/hisimhv2/hsmhv2set.c deleted file mode 100644 index 90d3d93db..000000000 --- a/src/spicelib/devices/hisimhv2/hsmhv2set.c +++ /dev/null @@ -1,1796 +0,0 @@ -/*********************************************************************** - - HiSIM (Hiroshima University STARC IGFET Model) - Copyright (C) 2014 Hiroshima University & STARC - - MODEL NAME : HiSIM_HV - ( VERSION : 2 SUBVERSION : 2 REVISION : 0 ) - Model Parameter 'VERSION' : 2.20 - FILE : hsmhvset.c - - DATE : 2014.6.11 - - released by - Hiroshima University & - Semiconductor Technology Academic Research Center (STARC) -***********************************************************************/ - -/********************************************************************** - -The following source code, and all copyrights, trade secrets or other -intellectual property rights in and to the source code in its entirety, -is owned by the Hiroshima University and the STARC organization. - -All users need to follow the "HISIM_HV Distribution Statement and -Copyright Notice" attached to HiSIM_HV model. - ------HISIM_HV Distribution Statement and Copyright Notice-------------- - -Software is distributed as is, completely without warranty or service -support. Hiroshima University or STARC and its employees are not liable -for the condition or performance of the software. - -Hiroshima University and STARC own the copyright and grant users a perpetual, -irrevocable, worldwide, non-exclusive, royalty-free license with respect -to the software as set forth below. - -Hiroshima University and STARC hereby disclaims all implied warranties. - -Hiroshima University and STARC grant the users the right to modify, copy, -and redistribute the software and documentation, both within the user's -organization and externally, subject to the following restrictions - -1. The users agree not to charge for Hiroshima University and STARC code -itself but may charge for additions, extensions, or support. - -2. In any product based on the software, the users agree to acknowledge -Hiroshima University and STARC that developed the software. This -acknowledgment shall appear in the product documentation. - -3. The users agree to reproduce any copyright notice which appears on -the software on any copy or modification of such made available -to others." - -Toshimasa Asahara, President, Hiroshima University -Mitiko Miura-Mattausch, Professor, Hiroshima University -Katsuhiro Shimohigashi, President&CEO, STARC -June 2008 (revised October 2011) -*************************************************************************/ - -#include "ngspice/ngspice.h" -#include "ngspice/smpdefs.h" -#include "ngspice/cktdefs.h" -#include "hsmhv2def.h" -#include "hsmhv2evalenv.h" -#include "ngspice/const.h" -#include "ngspice/sperror.h" -#include "ngspice/suffix.h" - -#define C_m2cm (1.0e2) -#define C_cm2m_p3 (1.0e-6) -#define C_m2cm_p1o2 (1.0e1) - -#define BINNING(param) pParam->HSMHV2_##param = model->HSMHV2_##param \ - + model->HSMHV2_l##param / Lbin + model->HSMHV2_w##param / Wbin \ - + model->HSMHV2_p##param / LWbin ; - -#define RANGECHECK(param, min, max, pname) \ - if ( model->HSMHV2_coerrrep && ((param) < (min) || (param) > (max)) ) { \ - printf("warning(HiSIM_HV(%s)): (%s = %g) range [%g , %g].\n", model->HSMHV2modName,\ - (pname), (param), (min*1.0), (max*1.0) ); \ - } -#define RANGERESET(param, min, max, pname) \ - if ( model->HSMHV2_coerrrep && ((param) > (max)) ) { \ - printf("reset(HiSIM_HV(%s)): (%s = %g to %g) range [%g , %g].\n", model->HSMHV2modName,\ - (pname), (param), (max*1.0), (min*1.0), (max*1.0) ); \ - } \ - if ( model->HSMHV2_coerrrep && ((param) < (min)) ) { \ - printf("reset(HiSIM_HV(%s)): (%s = %g to %g) range [%g , %g].\n",model->HSMHV2modName, \ - (pname), (param), (min*1.0), (min*1.0), (max*1.0) ); \ - } \ - if ( (param) < (min) ) { param = (min); } \ - if ( (param) > (max) ) { param = (max); } -#define MINCHECK(param, min, pname) \ - if ( model->HSMHV2_coerrrep && ((param) < (min)) ) { \ - printf("warning(HiSIM_HV(%s)): (%s = %g) range [%g , %g].\n",model->HSMHV2modName, \ - (pname), (param), (min*1.0), (min*1.0) ); \ - } -#define MINRESET(param, min, pname) \ - if ( model->HSMHV2_coerrrep && ((param) < (min)) ) { \ - printf("reset(HiSIM_HV(%s)): (%s = %g to %g) range [%g , %g].\n",model->HSMHV2modName, \ - (pname), (param), (min*1.0), (min*1.0), (min*1.0) ); \ - } \ - if ( (param) < (min) ) { param = (min); } - -int HSMHV2setup( - SMPmatrix *matrix, - GENmodel *inModel, - CKTcircuit *ckt, - int *states) - /* load the HSMHV2 device structure with those pointers needed later - * for fast matrix loading - */ -{ - HSMHV2model *model = (HSMHV2model*)inModel; - HSMHV2instance *here; - int error=0 ; - CKTnode *tmp; - double T2, Rd, Rs ; - HSMHV2binningParam *pParam ; - HSMHV2modelMKSParam *modelMKS ; - HSMHV2hereMKSParam *hereMKS ; - double LG=0.0, WG =0.0, Lgate =0.0, Wgate =0.0 ; - double Lbin=0.0, Wbin=0.0, LWbin =0.0; /* binning */ - - - /* loop through all the HSMHV2 device models */ - for ( ;model != NULL ;model = HSMHV2nextModel(model)) { - /* Default value Processing for HVMOS Models */ - if ( !model->HSMHV2_type_Given ) - model->HSMHV2_type = NMOS ; - - if ( !model->HSMHV2_info_Given ) model->HSMHV2_info = 0 ; - - model->HSMHV2_noise = 1; - - if ( !model->HSMHV2_version_Given) { - model->HSMHV2_version = "2.20" ; - printf("HiSIM_HV(%s): 2.20 is selected for VERSION. (default) \n",model->HSMHV2modName); - model->HSMHV2_subversion = 2 ; - } else { - if (strncmp(model->HSMHV2_version,"2.20", 4) == 0 ) { - printf("HiSIM_HV(%s): 2.20 is selected for VERSION. (default) \n",model->HSMHV2modName); - model->HSMHV2_subversion = 2 ; - } else if (strncmp(model->HSMHV2_version,"2.2", 3) == 0 ) { - printf("HiSIM_HV(%s): 2.20 is selected for VERSION. (default) \n",model->HSMHV2modName); - model->HSMHV2_subversion = 2 ; - } else { - printf("warning(HiSIM_HV(%s)): invalid version %s is specified, reset to 2.20 \n", - model->HSMHV2modName,model->HSMHV2_version); - model->HSMHV2_subversion = 2 ; - } - } - - - if ( !model->HSMHV2_corsrd_Given ) model->HSMHV2_corsrd = 3 ; - if ( !model->HSMHV2_corg_Given ) model->HSMHV2_corg = 0 ; - if ( !model->HSMHV2_coiprv_Given ) model->HSMHV2_coiprv = 1 ; - if ( !model->HSMHV2_copprv_Given ) model->HSMHV2_copprv = 1 ; - if ( !model->HSMHV2_coadov_Given ) model->HSMHV2_coadov = 1 ; - if ( !model->HSMHV2_coisub_Given ) model->HSMHV2_coisub = 0 ; - if ( !model->HSMHV2_coiigs_Given ) model->HSMHV2_coiigs = 0 ; - if ( !model->HSMHV2_cogidl_Given ) model->HSMHV2_cogidl = 0 ; - if ( !model->HSMHV2_coovlp_Given ) model->HSMHV2_coovlp = 1 ; - if ( !model->HSMHV2_coovlps_Given ) model->HSMHV2_coovlps = 0 ; - if ( !model->HSMHV2_coflick_Given ) model->HSMHV2_coflick = 0 ; - if ( !model->HSMHV2_coisti_Given ) model->HSMHV2_coisti = 0 ; - if ( !model->HSMHV2_conqs_Given ) model->HSMHV2_conqs = 0 ; /* QS (default) */ - if ( !model->HSMHV2_cothrml_Given ) model->HSMHV2_cothrml = 0 ; - if ( !model->HSMHV2_coign_Given ) model->HSMHV2_coign = 0 ; /* induced gate noise */ - if ( !model->HSMHV2_codfm_Given ) model->HSMHV2_codfm = 0 ; /* DFM */ - if ( !model->HSMHV2_coqovsm_Given ) model->HSMHV2_coqovsm = 1 ; - if ( !model->HSMHV2_corbnet_Given ) model->HSMHV2_corbnet = 0 ; - else if ( model->HSMHV2_corbnet != 0 && model->HSMHV2_corbnet != 1 ) { - model->HSMHV2_corbnet = 0; - printf("warning(HiSIM_HV(%s)): CORBNET has been set to its default value: %d.\n", - model->HSMHV2modName,model->HSMHV2_corbnet); - } - if ( !model->HSMHV2_coselfheat_Given ) model->HSMHV2_coselfheat = 0 ; /* Self-heating model */ - if ( !model->HSMHV2_cosubnode_Given ) model->HSMHV2_cosubnode = 0 ; - if ( !model->HSMHV2_cosym_Given ) model->HSMHV2_cosym = 0 ; /* Symmetry model for HV */ - if ( !model->HSMHV2_cotemp_Given ) model->HSMHV2_cotemp = 0 ; - if ( !model->HSMHV2_cordrift_Given ) model->HSMHV2_cordrift = 1 ; - model->HSMHV2_coldrift = 1 ; - if ( model->HSMHV2_coldrift_Given ) { - fprintf(stderr,"warning(HiSIM_HV(%s)): COLDRIFT has been inactivated ( Ldrift = LDRIFT1 + LDRIFT2 ).\n",model->HSMHV2modName); - } - if ( !model->HSMHV2_coerrrep_Given ) model->HSMHV2_coerrrep = 1 ; - if ( !model->HSMHV2_codep_Given ) model->HSMHV2_codep = 0 ; - if ( model->HSMHV2_codep_Given ) { - if( model->HSMHV2_codep != 0 && model->HSMHV2_codep != 1 ) { - printf("warning(HiSIM_HV(%s)): Invalid model parameter CODEP (= %d) was specified, reset to 0.\n",model->HSMHV2modName,model->HSMHV2_codep); - model->HSMHV2_codep = 0 ; - } - } - - if ( !model->HSMHV2_coddlt_Given ) model->HSMHV2_coddlt = 1 ; - if ( model->HSMHV2_coddlt_Given ) { - if( model->HSMHV2_coddlt != 0 && model->HSMHV2_coddlt != 1 ) { - printf("warning(HiSIM_HV(%s)): Invalid model parameter CODDLT (= %d) was specified, reset to 1.\n",model->HSMHV2modName,model->HSMHV2_coddlt); - model->HSMHV2_coddlt = 1 ; - } - } - - if ( !model->HSMHV2_vmax_Given ) model->HSMHV2_vmax = 1.0e7 ; - if ( !model->HSMHV2_vmaxt1_Given ) model->HSMHV2_vmaxt1 = 0.0 ; - if ( !model->HSMHV2_vmaxt2_Given ) model->HSMHV2_vmaxt2 = 0.0 ; - if ( !model->HSMHV2_bgtmp1_Given ) model->HSMHV2_bgtmp1 = 90.25e-6 ; - if ( !model->HSMHV2_bgtmp2_Given ) model->HSMHV2_bgtmp2 = 1.0e-7 ; - if ( !model->HSMHV2_eg0_Given ) model->HSMHV2_eg0 = 1.1785e0 ; - if ( !model->HSMHV2_tox_Given ) model->HSMHV2_tox = 7e-9 ; - if ( !model->HSMHV2_xld_Given ) model->HSMHV2_xld = 0 ; - if ( !model->HSMHV2_lover_Given ) model->HSMHV2_lover = 30e-9 ; -// if ( !model->HSMHV2_lovers_Given ) model->HSMHV2_lovers = 30e-9 ; -// if ( model->HSMHV2_lover_Given ) model->HSMHV2_lovers = model->HSMHV2_lover ; - if ( !model->HSMHV2_rdov11_Given ) model->HSMHV2_rdov11 = 0.0 ; - if ( !model->HSMHV2_rdov12_Given ) model->HSMHV2_rdov12 = 1.0 ; - if ( !model->HSMHV2_rdov13_Given ) model->HSMHV2_rdov13 = 1.0 ; - if ( !model->HSMHV2_rdslp1_Given ) model->HSMHV2_rdslp1 = 0.0 ; - if ( !model->HSMHV2_rdict1_Given ) model->HSMHV2_rdict1 = 1.0 ; - if ( !model->HSMHV2_rdslp2_Given ) model->HSMHV2_rdslp2 = 1.0 ; - if ( !model->HSMHV2_rdict2_Given ) model->HSMHV2_rdict2 = 0.0 ; - if ( !model->HSMHV2_loverld_Given ) model->HSMHV2_loverld = 1.0e-6 ; - if ( !model->HSMHV2_ldrift1_Given ) model->HSMHV2_ldrift1 = 1.0e-6 ; - if ( !model->HSMHV2_ldrift2_Given ) model->HSMHV2_ldrift2 = 1.0e-6 ; - if ( !model->HSMHV2_ldrift1s_Given ) model->HSMHV2_ldrift1s = 0.0 ; - if ( !model->HSMHV2_ldrift2s_Given ) model->HSMHV2_ldrift2s = 1.0e-6 ; - if ( !model->HSMHV2_subld1_Given ) model->HSMHV2_subld1 = 0.0 ; - if ( !model->HSMHV2_subld1l_Given ) model->HSMHV2_subld1l = 0.0 ; - if ( !model->HSMHV2_subld1lp_Given ) model->HSMHV2_subld1lp = 1.0 ; - if ( !model->HSMHV2_subld2_Given ) model->HSMHV2_subld2 = 0.0 ; - if ( !model->HSMHV2_xpdv_Given ) model->HSMHV2_xpdv = 0.0 ; - if ( !model->HSMHV2_xpvdth_Given ) model->HSMHV2_xpvdth = 0.0 ; - if ( !model->HSMHV2_xpvdthg_Given ) model->HSMHV2_xpvdthg = 0.0 ; - if ( !model->HSMHV2_ddltmax_Given ) model->HSMHV2_ddltmax = 10 ; /* Vdseff */ - if ( !model->HSMHV2_ddltslp_Given ) model->HSMHV2_ddltslp = 0.0 ; /* Vdseff */ - if ( !model->HSMHV2_ddltict_Given ) model->HSMHV2_ddltict = 10.0 ; /* Vdseff */ - if ( !model->HSMHV2_vfbover_Given ) model->HSMHV2_vfbover = -0.5 ; - if ( !model->HSMHV2_nover_Given ) model->HSMHV2_nover = 3e16 ; - if ( !model->HSMHV2_novers_Given ) model->HSMHV2_novers = 1e17 ; - if ( !model->HSMHV2_xwd_Given ) model->HSMHV2_xwd = 0.0 ; - if ( !model->HSMHV2_xwdc_Given ) model->HSMHV2_xwdc = model->HSMHV2_xwd ; - - if ( !model->HSMHV2_xl_Given ) model->HSMHV2_xl = 0.0 ; - if ( !model->HSMHV2_xw_Given ) model->HSMHV2_xw = 0.0 ; - if ( !model->HSMHV2_saref_Given ) model->HSMHV2_saref = 1e-6 ; - if ( !model->HSMHV2_sbref_Given ) model->HSMHV2_sbref = 1e-6 ; - if ( !model->HSMHV2_ll_Given ) model->HSMHV2_ll = 0.0 ; - if ( !model->HSMHV2_lld_Given ) model->HSMHV2_lld = 0.0 ; - if ( !model->HSMHV2_lln_Given ) model->HSMHV2_lln = 0.0 ; - if ( !model->HSMHV2_wl_Given ) model->HSMHV2_wl = 0.0 ; - if ( !model->HSMHV2_wl1_Given ) model->HSMHV2_wl1 = 0.0 ; - if ( !model->HSMHV2_wl1p_Given ) model->HSMHV2_wl1p = 1.0 ; - if ( !model->HSMHV2_wl2_Given ) model->HSMHV2_wl2 = 0.0 ; - if ( !model->HSMHV2_wl2p_Given ) model->HSMHV2_wl2p = 1.0 ; - if ( !model->HSMHV2_wld_Given ) model->HSMHV2_wld = 0.0 ; - if ( !model->HSMHV2_wln_Given ) model->HSMHV2_wln = 0.0 ; - - if ( !model->HSMHV2_rsh_Given ) model->HSMHV2_rsh = 0.0 ; - if ( !model->HSMHV2_rshg_Given ) model->HSMHV2_rshg = 0.0 ; - - if ( !model->HSMHV2_xqy_Given ) model->HSMHV2_xqy = 0.0 ; - if ( !model->HSMHV2_xqy1_Given ) model->HSMHV2_xqy1 = 0.0 ; - if ( !model->HSMHV2_xqy2_Given ) model->HSMHV2_xqy2 = 2.0 ; - if ( !model->HSMHV2_rs_Given ) model->HSMHV2_rs = 0.0 ; - if ( !model->HSMHV2_rd_Given ) model->HSMHV2_rd = 0.0 ; - if ( !model->HSMHV2_vfbc_Given ) model->HSMHV2_vfbc = -1.0 ; - if ( !model->HSMHV2_vbi_Given ) model->HSMHV2_vbi = 1.1 ; - if ( !model->HSMHV2_nsubc_Given ) model->HSMHV2_nsubc = 3.0e17 ; - if ( !model->HSMHV2_parl2_Given ) model->HSMHV2_parl2 = 10.0e-9 ; - if ( !model->HSMHV2_lp_Given ) model->HSMHV2_lp = 15e-9 ; - if ( !model->HSMHV2_nsubp_Given ) model->HSMHV2_nsubp = 1.0e18 ; - - if ( !model->HSMHV2_nsubp0_Given ) model->HSMHV2_nsubp0 = 0.0 ; - if ( !model->HSMHV2_nsubwp_Given ) model->HSMHV2_nsubwp = 1.0 ; - - if ( !model->HSMHV2_scp1_Given ) model->HSMHV2_scp1 = 0.0 ; - if ( !model->HSMHV2_scp2_Given ) model->HSMHV2_scp2 = 0.0 ; - if ( !model->HSMHV2_scp3_Given ) model->HSMHV2_scp3 = 0.0 ; - if ( !model->HSMHV2_sc1_Given ) model->HSMHV2_sc1 = 0.0 ; - if ( !model->HSMHV2_sc2_Given ) model->HSMHV2_sc2 = 0.0 ; - if ( !model->HSMHV2_sc3_Given ) model->HSMHV2_sc3 = 0.0 ; - if ( !model->HSMHV2_sc4_Given ) model->HSMHV2_sc4 = 0.0 ; - if ( !model->HSMHV2_pgd1_Given ) model->HSMHV2_pgd1 = 0.0 ; - if ( !model->HSMHV2_pgd2_Given ) model->HSMHV2_pgd2 = 1.0 ; - if ( !model->HSMHV2_pgd4_Given ) model->HSMHV2_pgd4 = 0.0 ; - - if ( !model->HSMHV2_ndep_Given ) model->HSMHV2_ndep = 1.0 ; - if ( !model->HSMHV2_ndepl_Given ) model->HSMHV2_ndepl = 0.0 ; - if ( !model->HSMHV2_ndeplp_Given ) model->HSMHV2_ndeplp = 1.0 ; - if ( !model->HSMHV2_ninv_Given ) model->HSMHV2_ninv = 0.5 ; - if ( !model->HSMHV2_muecb0_Given ) model->HSMHV2_muecb0 = 1.0e3 ; - if ( !model->HSMHV2_muecb1_Given ) model->HSMHV2_muecb1 = 100.0 ; - if ( !model->HSMHV2_mueph0_Given ) model->HSMHV2_mueph0 = 300.0e-3 ; - if ( !model->HSMHV2_mueph1_Given ) { - if (model->HSMHV2_type == NMOS) model->HSMHV2_mueph1 = 20.0e3 ; - else model->HSMHV2_mueph1 = 9.0e3 ; - } - if ( !model->HSMHV2_muephw_Given ) model->HSMHV2_muephw = 0.0 ; - if ( !model->HSMHV2_muepwp_Given ) model->HSMHV2_muepwp = 1.0 ; - if ( !model->HSMHV2_muephl_Given ) model->HSMHV2_muephl = 0.0 ; - if ( !model->HSMHV2_mueplp_Given ) model->HSMHV2_mueplp = 1.0 ; - if ( !model->HSMHV2_muephs_Given ) model->HSMHV2_muephs = 0.0 ; - if ( !model->HSMHV2_muepsp_Given ) model->HSMHV2_muepsp = 1.0 ; - - if ( !model->HSMHV2_vtmp_Given ) model->HSMHV2_vtmp = 0.0 ; - - if ( !model->HSMHV2_wvth0_Given ) model->HSMHV2_wvth0 = 0.0 ; - - if ( !model->HSMHV2_muesr0_Given ) model->HSMHV2_muesr0 = 2.0 ; - if ( !model->HSMHV2_muesr1_Given ) model->HSMHV2_muesr1 = 6.0e14 ; - if ( !model->HSMHV2_muesrl_Given ) model->HSMHV2_muesrl = 0.0 ; - if ( !model->HSMHV2_muesrw_Given ) model->HSMHV2_muesrw = 0.0 ; - if ( !model->HSMHV2_mueswp_Given ) model->HSMHV2_mueswp = 1.0 ; - if ( !model->HSMHV2_mueslp_Given ) model->HSMHV2_mueslp = 1.0 ; - - if ( !model->HSMHV2_muetmp_Given ) model->HSMHV2_muetmp = 1.5 ; - - if ( !model->HSMHV2_bb_Given ) { - if (model->HSMHV2_type == NMOS) model->HSMHV2_bb = 2.0 ; - else model->HSMHV2_bb = 1.0 ; - } - - if ( !model->HSMHV2_sub1_Given ) model->HSMHV2_sub1 = 10 ; - if ( !model->HSMHV2_sub2_Given ) model->HSMHV2_sub2 = 25 ; - if ( !model->HSMHV2_svgs_Given ) model->HSMHV2_svgs = 0.8e0 ; - if ( !model->HSMHV2_svbs_Given ) model->HSMHV2_svbs = 0.5e0 ; - if ( !model->HSMHV2_svbsl_Given ) model->HSMHV2_svbsl = 0e0 ; - if ( !model->HSMHV2_svds_Given ) model->HSMHV2_svds = 0.8e0 ; - if ( !model->HSMHV2_slg_Given ) model->HSMHV2_slg = 30e-9 ; - if ( !model->HSMHV2_sub1l_Given ) model->HSMHV2_sub1l = 2.5e-3 ; - if ( !model->HSMHV2_sub2l_Given ) model->HSMHV2_sub2l = 2e-6 ; - if ( !model->HSMHV2_fn1_Given ) model->HSMHV2_fn1 = 50e0 ; - if ( !model->HSMHV2_fn2_Given ) model->HSMHV2_fn2 = 170e-6 ; - if ( !model->HSMHV2_fn3_Given ) model->HSMHV2_fn3 = 0e0 ; - if ( !model->HSMHV2_fvbs_Given ) model->HSMHV2_fvbs = 12e-3 ; - - if ( !model->HSMHV2_svgsl_Given ) model->HSMHV2_svgsl = 0.0 ; - if ( !model->HSMHV2_svgslp_Given ) model->HSMHV2_svgslp = 1.0 ; - if ( !model->HSMHV2_svgswp_Given ) model->HSMHV2_svgswp = 1.0 ; - if ( !model->HSMHV2_svgsw_Given ) model->HSMHV2_svgsw = 0.0 ; - if ( !model->HSMHV2_svbslp_Given ) model->HSMHV2_svbslp = 1.0 ; - if ( !model->HSMHV2_slgl_Given ) model->HSMHV2_slgl = 0.0 ; - if ( !model->HSMHV2_slglp_Given ) model->HSMHV2_slglp = 1.0 ; - if ( !model->HSMHV2_sub1lp_Given ) model->HSMHV2_sub1lp = 1.0 ; - - if ( !model->HSMHV2_nsti_Given ) model->HSMHV2_nsti = 5.0e17 ; - if ( !model->HSMHV2_wsti_Given ) model->HSMHV2_wsti = 0.0 ; - if ( !model->HSMHV2_wstil_Given ) model->HSMHV2_wstil = 0.0 ; - if ( !model->HSMHV2_wstilp_Given ) model->HSMHV2_wstilp = 1.0 ; - if ( !model->HSMHV2_wstiw_Given ) model->HSMHV2_wstiw = 0.0 ; - if ( !model->HSMHV2_wstiwp_Given ) model->HSMHV2_wstiwp = 1.0 ; - if ( !model->HSMHV2_scsti1_Given ) model->HSMHV2_scsti1 = 0.0 ; - if ( !model->HSMHV2_scsti2_Given ) model->HSMHV2_scsti2 = 0.0 ; - if ( !model->HSMHV2_vthsti_Given ) model->HSMHV2_vthsti = 0.0 ; - if ( !model->HSMHV2_vdsti_Given ) model->HSMHV2_vdsti = 0.0 ; - if ( !model->HSMHV2_muesti1_Given ) model->HSMHV2_muesti1 = 0.0 ; - if ( !model->HSMHV2_muesti2_Given ) model->HSMHV2_muesti2 = 0.0 ; - if ( !model->HSMHV2_muesti3_Given ) model->HSMHV2_muesti3 = 1.0 ; - if ( !model->HSMHV2_nsubpsti1_Given ) model->HSMHV2_nsubpsti1 = 0.0 ; - if ( !model->HSMHV2_nsubpsti2_Given ) model->HSMHV2_nsubpsti2 = 0.0 ; - if ( !model->HSMHV2_nsubpsti3_Given ) model->HSMHV2_nsubpsti3 = 1.0 ; - - if ( !model->HSMHV2_lpext_Given ) model->HSMHV2_lpext = 1.0e-50 ; - if ( !model->HSMHV2_npext_Given ) model->HSMHV2_npext = 5.0e17 ; - if ( !model->HSMHV2_scp21_Given ) model->HSMHV2_scp21 = 0.0 ; - if ( !model->HSMHV2_scp22_Given ) model->HSMHV2_scp22 = 0.0 ; - if ( !model->HSMHV2_bs1_Given ) model->HSMHV2_bs1 = 0.0 ; - if ( !model->HSMHV2_bs2_Given ) model->HSMHV2_bs2 = 0.9 ; - - if ( !model->HSMHV2_tpoly_Given ) model->HSMHV2_tpoly = 200e-9 ; - if ( !model->HSMHV2_cgbo_Given ) model->HSMHV2_cgbo = 0.0 ; - if ( !model->HSMHV2_js0_Given ) model->HSMHV2_js0 = 0.5e-6 ; - if ( !model->HSMHV2_js0sw_Given ) model->HSMHV2_js0sw = 0.0 ; - if ( !model->HSMHV2_nj_Given ) model->HSMHV2_nj = 1.0 ; - if ( !model->HSMHV2_njsw_Given ) model->HSMHV2_njsw = 1.0 ; - if ( !model->HSMHV2_xti_Given ) model->HSMHV2_xti = 2.0 ; - if ( !model->HSMHV2_cj_Given ) model->HSMHV2_cj = 5.0e-04 ; - if ( !model->HSMHV2_cjsw_Given ) model->HSMHV2_cjsw = 5.0e-10 ; - if ( !model->HSMHV2_cjswg_Given ) model->HSMHV2_cjswg = 5.0e-10 ; - if ( !model->HSMHV2_mj_Given ) model->HSMHV2_mj = 0.5e0 ; - if ( !model->HSMHV2_mjsw_Given ) model->HSMHV2_mjsw = 0.33e0 ; - if ( !model->HSMHV2_mjswg_Given ) model->HSMHV2_mjswg = 0.33e0 ; - if ( !model->HSMHV2_pb_Given ) model->HSMHV2_pb = 1.0e0 ; - if ( !model->HSMHV2_pbsw_Given ) model->HSMHV2_pbsw = 1.0e0 ; - if ( !model->HSMHV2_pbswg_Given ) model->HSMHV2_pbswg = 1.0e0 ; - if ( !model->HSMHV2_xti2_Given ) model->HSMHV2_xti2 = 0.0e0 ; - if ( !model->HSMHV2_cisb_Given ) model->HSMHV2_cisb = 0.0e0 ; - if ( !model->HSMHV2_cvb_Given ) model->HSMHV2_cvb = 0.0e0 ; - if ( !model->HSMHV2_ctemp_Given ) model->HSMHV2_ctemp = 0.0e0 ; - if ( !model->HSMHV2_cisbk_Given ) model->HSMHV2_cisbk = 0.0e0 ; - if ( !model->HSMHV2_divx_Given ) model->HSMHV2_divx = 0.0e0 ; - - if ( !model->HSMHV2_clm1_Given ) model->HSMHV2_clm1 = 50e-3 ; - if ( !model->HSMHV2_clm2_Given ) model->HSMHV2_clm2 = 2.0 ; - if ( !model->HSMHV2_clm3_Given ) model->HSMHV2_clm3 = 1.0 ; - if ( !model->HSMHV2_clm5_Given ) model->HSMHV2_clm5 = 1.0 ; - if ( !model->HSMHV2_clm6_Given ) model->HSMHV2_clm6 = 0.0 ; - if ( !model->HSMHV2_vover_Given ) model->HSMHV2_vover = 0.3 ; - if ( !model->HSMHV2_voverp_Given ) model->HSMHV2_voverp = 0.3 ; - if ( !model->HSMHV2_wfc_Given ) model->HSMHV2_wfc = 0.0 ; - if ( !model->HSMHV2_nsubcw_Given ) model->HSMHV2_nsubcw = 0.0 ; - if ( !model->HSMHV2_nsubcwp_Given ) model->HSMHV2_nsubcwp = 1.0 ; - if ( !model->HSMHV2_qme1_Given ) model->HSMHV2_qme1 = 0.0 ; - if ( !model->HSMHV2_qme2_Given ) model->HSMHV2_qme2 = 2.0 ; - if ( !model->HSMHV2_qme3_Given ) model->HSMHV2_qme3 = 0.0 ; - - if ( !model->HSMHV2_vovers_Given ) model->HSMHV2_vovers = 0.0 ; - if ( !model->HSMHV2_voversp_Given ) model->HSMHV2_voversp = 0.0 ; - - if ( !model->HSMHV2_gidl1_Given ) model->HSMHV2_gidl1 = 2e0 ; - if ( !model->HSMHV2_gidl2_Given ) model->HSMHV2_gidl2 = 3e7 ; - if ( !model->HSMHV2_gidl3_Given ) model->HSMHV2_gidl3 = 0.9e0 ; - if ( !model->HSMHV2_gidl4_Given ) model->HSMHV2_gidl4 = 0.0 ; - if ( !model->HSMHV2_gidl5_Given ) model->HSMHV2_gidl5 = 0.2e0 ; - - if ( !model->HSMHV2_gleak1_Given ) model->HSMHV2_gleak1 = 50e0 ; - if ( !model->HSMHV2_gleak2_Given ) model->HSMHV2_gleak2 = 10e6 ; - if ( !model->HSMHV2_gleak3_Given ) model->HSMHV2_gleak3 = 60e-3 ; - if ( !model->HSMHV2_gleak4_Given ) model->HSMHV2_gleak4 = 4e0 ; - if ( !model->HSMHV2_gleak5_Given ) model->HSMHV2_gleak5 = 7.5e3 ; - if ( !model->HSMHV2_gleak6_Given ) model->HSMHV2_gleak6 = 250e-3 ; - if ( !model->HSMHV2_gleak7_Given ) model->HSMHV2_gleak7 = 1e-6 ; - - if ( !model->HSMHV2_glpart1_Given ) model->HSMHV2_glpart1 = 0.5 ; - if ( !model->HSMHV2_glksd1_Given ) model->HSMHV2_glksd1 = 1.0e-15 ; - if ( !model->HSMHV2_glksd2_Given ) model->HSMHV2_glksd2 = 1e3 ; - if ( !model->HSMHV2_glksd3_Given ) model->HSMHV2_glksd3 = -1e3 ; - if ( !model->HSMHV2_glkb1_Given ) model->HSMHV2_glkb1 = 5e-16 ; - if ( !model->HSMHV2_glkb2_Given ) model->HSMHV2_glkb2 = 1e0 ; - if ( !model->HSMHV2_glkb3_Given ) model->HSMHV2_glkb3 = 0e0 ; - if ( !model->HSMHV2_egig_Given ) model->HSMHV2_egig = 0e0 ; - if ( !model->HSMHV2_igtemp2_Given ) model->HSMHV2_igtemp2 = 0e0 ; - if ( !model->HSMHV2_igtemp3_Given ) model->HSMHV2_igtemp3 = 0e0 ; - if ( !model->HSMHV2_vzadd0_Given ) model->HSMHV2_vzadd0 = 10.0e-3 ; - if ( !model->HSMHV2_pzadd0_Given ) model->HSMHV2_pzadd0 = 5.0e-3 ; - if ( !model->HSMHV2_nftrp_Given ) model->HSMHV2_nftrp = 10e9 ; - if ( !model->HSMHV2_nfalp_Given ) model->HSMHV2_nfalp = 1.0e-19 ; - if ( !model->HSMHV2_cit_Given ) model->HSMHV2_cit = 0e0 ; - if ( !model->HSMHV2_falph_Given ) model->HSMHV2_falph = 1.0 ; - - if ( !model->HSMHV2_kappa_Given ) model->HSMHV2_kappa = 3.90e0 ; - if ( !model->HSMHV2_cgso_Given ) model->HSMHV2_cgso = 0.0 ; - if ( !model->HSMHV2_cgdo_Given ) model->HSMHV2_cgdo = 0.0 ; - - - if ( !model->HSMHV2_vdiffj_Given ) model->HSMHV2_vdiffj = 0.6e-3 ; - if ( !model->HSMHV2_dly1_Given ) model->HSMHV2_dly1 = 100.0e-12 ; - if ( !model->HSMHV2_dly2_Given ) model->HSMHV2_dly2 = 0.7e0 ; - if ( !model->HSMHV2_dly3_Given ) model->HSMHV2_dly3 = 0.8e-6 ; - if ( !model->HSMHV2_tnom_Given ) model->HSMHV2_tnom = 27.0 ; /* [C] */ - - if ( !model->HSMHV2_ovslp_Given ) model->HSMHV2_ovslp = 2.1e-7 ; - if ( !model->HSMHV2_ovmag_Given ) model->HSMHV2_ovmag = 0.6 ; - - if ( !model->HSMHV2_gbmin_Given ) model->HSMHV2_gbmin = 1.0e-12; /* in mho */ - if ( !model->HSMHV2_rbpb_Given ) model->HSMHV2_rbpb = 50.0e0 ; - if ( !model->HSMHV2_rbpd_Given ) model->HSMHV2_rbpd = 50.0e0 ; - if ( !model->HSMHV2_rbps_Given ) model->HSMHV2_rbps = 50.0e0 ; - if ( !model->HSMHV2_rbdb_Given ) model->HSMHV2_rbdb = 50.0e0 ; /* not used in this version */ - if ( !model->HSMHV2_rbsb_Given ) model->HSMHV2_rbsb = 50.0e0 ; /* not used in this version */ - - if ( !model->HSMHV2_ibpc1_Given ) model->HSMHV2_ibpc1 = 0.0 ; - if ( !model->HSMHV2_ibpc1l_Given ) model->HSMHV2_ibpc1l = 0.0 ; - if ( !model->HSMHV2_ibpc1lp_Given ) model->HSMHV2_ibpc1lp = -1.0 ; - if ( !model->HSMHV2_ibpc2_Given ) model->HSMHV2_ibpc2 = 0.0 ; - - if ( !model->HSMHV2_mphdfm_Given ) model->HSMHV2_mphdfm = -0.3 ; - - if ( !model->HSMHV2_ptl_Given ) model->HSMHV2_ptl = 0.0 ; - if ( !model->HSMHV2_ptp_Given ) model->HSMHV2_ptp = 3.5 ; - if ( !model->HSMHV2_pt2_Given ) model->HSMHV2_pt2 = 0.0 ; - if ( !model->HSMHV2_ptlp_Given ) model->HSMHV2_ptlp = 1.0 ; - if ( !model->HSMHV2_gdl_Given ) model->HSMHV2_gdl = 0.0 ; - if ( !model->HSMHV2_gdlp_Given ) model->HSMHV2_gdlp = 0.0 ; - - if ( !model->HSMHV2_gdld_Given ) model->HSMHV2_gdld = 0.0 ; - if ( !model->HSMHV2_pt4_Given ) model->HSMHV2_pt4 = 0.0 ; - if ( !model->HSMHV2_pt4p_Given ) model->HSMHV2_pt4p = 1.0 ; - if ( !model->HSMHV2_rdvg11_Given ) model->HSMHV2_rdvg11 = 0.0 ; - if ( !model->HSMHV2_rdvg12_Given ) model->HSMHV2_rdvg12 = 100.0 ; - if ( !model->HSMHV2_rth0_Given ) model->HSMHV2_rth0 = 0.1 ; /* Self-heating model */ - if ( !model->HSMHV2_cth0_Given ) model->HSMHV2_cth0 = 1.0e-7 ; /* Self-heating model */ - if ( !model->HSMHV2_powrat_Given ) model->HSMHV2_powrat = 1.0 ; /* Self-heating model */ - - if ( !model->HSMHV2_tcjbd_Given ) model->HSMHV2_tcjbd = 0.0 ; /* Self-heating model */ - if ( !model->HSMHV2_tcjbs_Given ) model->HSMHV2_tcjbs = 0.0 ; /* Self-heating model */ - if ( !model->HSMHV2_tcjbdsw_Given ) model->HSMHV2_tcjbdsw = 0.0 ; /* Self-heating model */ - if ( !model->HSMHV2_tcjbssw_Given ) model->HSMHV2_tcjbssw = 0.0 ; /* Self-heating model */ - if ( !model->HSMHV2_tcjbdswg_Given ) model->HSMHV2_tcjbdswg = 0.0 ; /* Self-heating model */ - if ( !model->HSMHV2_tcjbsswg_Given ) model->HSMHV2_tcjbsswg = 0.0 ; /* Self-heating model */ - - /* value reset to switch off NQS for QbdLD: */ - model->HSMHV2_dlyov = 0.0 ; /* 1.0e3 ; */ - if ( !model->HSMHV2_qdftvd_Given ) model->HSMHV2_qdftvd = 1.0 ; - if ( !model->HSMHV2_xldld_Given ) model->HSMHV2_xldld = 1.0e-6 ; - if ( !model->HSMHV2_xwdld_Given ) model->HSMHV2_xwdld = model->HSMHV2_xwd ; - if ( !model->HSMHV2_rdvd_Given ) model->HSMHV2_rdvd = 7.0e-2 ; - - if ( !model->HSMHV2_rd20_Given ) model->HSMHV2_rd20 = 0.0 ; - if ( !model->HSMHV2_rd21_Given ) model->HSMHV2_rd21 = 1.0 ; - if ( !model->HSMHV2_rd22_Given ) model->HSMHV2_rd22 = 0.0 ; - if ( !model->HSMHV2_rd22d_Given ) model->HSMHV2_rd22d = 0.0 ; - if ( !model->HSMHV2_rd23_Given ) model->HSMHV2_rd23 = 5e-3 ; - if ( !model->HSMHV2_rd24_Given ) model->HSMHV2_rd24 = 0.0 ; - if ( !model->HSMHV2_rd25_Given ) model->HSMHV2_rd25 = 0.0 ; - - if ( !model->HSMHV2_rdvdl_Given ) model->HSMHV2_rdvdl = 0.0 ; - if ( !model->HSMHV2_rdvdlp_Given ) model->HSMHV2_rdvdlp = 1.0 ; - if ( !model->HSMHV2_rdvds_Given ) model->HSMHV2_rdvds = 0.0 ; - if ( !model->HSMHV2_rdvdsp_Given ) model->HSMHV2_rdvdsp = 1.0 ; - if ( !model->HSMHV2_rd23l_Given ) model->HSMHV2_rd23l = 0.0 ; - if ( !model->HSMHV2_rd23lp_Given ) model->HSMHV2_rd23lp = 1.0 ; - if ( !model->HSMHV2_rd23s_Given ) model->HSMHV2_rd23s = 0.0 ; - if ( !model->HSMHV2_rd23sp_Given ) model->HSMHV2_rd23sp = 1.0 ; - if ( !model->HSMHV2_rds_Given ) model->HSMHV2_rds = 0.0 ; - if ( !model->HSMHV2_rdsp_Given ) model->HSMHV2_rdsp = 1.0 ; - if ( !model->HSMHV2_rdtemp1_Given ) model->HSMHV2_rdtemp1 = 0.0 ; - if ( !model->HSMHV2_rdtemp2_Given ) model->HSMHV2_rdtemp2 = 0.0 ; - model->HSMHV2_rth0r = 0.0 ; /* not used in this version */ - if ( !model->HSMHV2_rdvdtemp1_Given) model->HSMHV2_rdvdtemp1 = 0.0 ; - if ( !model->HSMHV2_rdvdtemp2_Given) model->HSMHV2_rdvdtemp2 = 0.0 ; - if ( !model->HSMHV2_rth0w_Given ) model->HSMHV2_rth0w = 0.0 ; - if ( !model->HSMHV2_rth0wp_Given ) model->HSMHV2_rth0wp = 1.0 ; - - if ( !model->HSMHV2_cvdsover_Given ) model->HSMHV2_cvdsover = 0.0 ; - - if ( !model->HSMHV2_ninvd_Given ) model->HSMHV2_ninvd = 0.0 ; - if ( !model->HSMHV2_ninvdw_Given ) model->HSMHV2_ninvdw = 0.0 ; - if ( !model->HSMHV2_ninvdwp_Given ) model->HSMHV2_ninvdwp = 1.0 ; - if ( !model->HSMHV2_ninvdt1_Given ) model->HSMHV2_ninvdt1 = 0.0 ; - if ( !model->HSMHV2_ninvdt2_Given ) model->HSMHV2_ninvdt2 = 0.0 ; - if ( !model->HSMHV2_vbsmin_Given ) model->HSMHV2_vbsmin = -10.5 ; - if ( !model->HSMHV2_rdvb_Given ) model->HSMHV2_rdvb = 0.0 ; - if ( !model->HSMHV2_rth0nf_Given ) model->HSMHV2_rth0nf = 0.0 ; - - if ( !model->HSMHV2_rthtemp1_Given ) model->HSMHV2_rthtemp1 = 0.0 ; - if ( !model->HSMHV2_rthtemp2_Given ) model->HSMHV2_rthtemp2 = 0.0 ; - if ( !model->HSMHV2_prattemp1_Given ) model->HSMHV2_prattemp1 = 0.0 ; - if ( !model->HSMHV2_prattemp2_Given ) model->HSMHV2_prattemp2 = 0.0 ; - - if ( !model->HSMHV2_rdvsub_Given ) model->HSMHV2_rdvsub = 1.0 ; /* [-] substrate effect */ - if ( !model->HSMHV2_rdvdsub_Given ) model->HSMHV2_rdvdsub = 0.3 ; /* [-] substrate effect */ - if ( !model->HSMHV2_ddrift_Given ) model->HSMHV2_ddrift = 1.0e-6 ; /* [m] substrate effect */ - if ( !model->HSMHV2_vbisub_Given ) model->HSMHV2_vbisub = 0.7 ; /* [V] substrate effect */ - if ( !model->HSMHV2_nsubsub_Given ) model->HSMHV2_nsubsub = 1.0e15 ; /* [cm^-3] substrate effect */ - - if ( !model->HSMHV2_rdrmue_Given ) model->HSMHV2_rdrmue = 1.0e3 ; - if ( !model->HSMHV2_rdrvmax_Given ) model->HSMHV2_rdrvmax = 3.0e7 ; - if ( !model->HSMHV2_rdrmuetmp_Given ) model->HSMHV2_rdrmuetmp = 0.0 ; - - if ( !model->HSMHV2_ndepm_Given ) model->HSMHV2_ndepm = 1e17 ; - if ( !model->HSMHV2_tndep_Given ) model->HSMHV2_tndep = 0.2e-6 ; - if ( !model->HSMHV2_depmue0_Given ) model->HSMHV2_depmue0 = 1.0e3 ; - if ( !model->HSMHV2_depmue1_Given ) model->HSMHV2_depmue1 = 0.0 ; - if ( !model->HSMHV2_depmueback0_Given ) model->HSMHV2_depmueback0 = 1.0e2 ; - if ( !model->HSMHV2_depmueback1_Given ) model->HSMHV2_depmueback1 = 0.0 ; - if ( !model->HSMHV2_depleak_Given ) model->HSMHV2_depleak = 0.5 ; - if ( !model->HSMHV2_depeta_Given ) model->HSMHV2_depeta = 0.0 ; - if ( !model->HSMHV2_depvmax_Given ) model->HSMHV2_depvmax = 3.0e7 ; - if ( !model->HSMHV2_depvdsef1_Given ) model->HSMHV2_depvdsef1 = 2.0 ; - if ( !model->HSMHV2_depvdsef2_Given ) model->HSMHV2_depvdsef2 = 0.5 ; - if ( !model->HSMHV2_depmueph0_Given ) model->HSMHV2_depmueph0 = 0.3 ; - if ( !model->HSMHV2_depmueph1_Given ) model->HSMHV2_depmueph1 = 5.0e3 ; - if ( !model->HSMHV2_depbb_Given ) model->HSMHV2_depbb = 1.0 ; - if ( !model->HSMHV2_depvtmp_Given ) model->HSMHV2_depvtmp = 0.0 ; - if ( !model->HSMHV2_depmuetmp_Given ) model->HSMHV2_depmuetmp = 1.5 ; - - if ( model->HSMHV2_codep ) { - if ( !model->HSMHV2_copprv_Given ) model->HSMHV2_copprv = 0 ; - if ( !model->HSMHV2_vfbc_Given ) model->HSMHV2_vfbc = -0.2 ; - if ( !model->HSMHV2_nsubc_Given ) model->HSMHV2_nsubc = 5.0e16 ; - if ( !model->HSMHV2_lp_Given ) model->HSMHV2_lp = 0.0 ; - if ( !model->HSMHV2_nsubp_Given ) model->HSMHV2_nsubp = 1.0e17 ; - if ( !model->HSMHV2_muesr1_Given ) model->HSMHV2_muesr1 = 5.0e15 ; - } - - if ( !model->HSMHV2_isbreak_Given ) model->HSMHV2_isbreak = 1.0e-12 ; - if ( !model->HSMHV2_rwell_Given ) model->HSMHV2_rwell = 1.0e3 ; - - if ( !model->HSMHV2_rdrvtmp_Given ) model->HSMHV2_rdrvtmp = 0.0 ; - if ( !model->HSMHV2_rdrdjunc_Given ) model->HSMHV2_rdrdjunc = 1.0e-6 ; - if ( !model->HSMHV2_rdrcx_Given ) model->HSMHV2_rdrcx = 0.0 ; - if ( !model->HSMHV2_rdrcar_Given ) model->HSMHV2_rdrcar = 1.0e-8 ; - if ( !model->HSMHV2_rdrdl1_Given ) model->HSMHV2_rdrdl1 = 0.0 ; - if ( !model->HSMHV2_rdrdl2_Given ) model->HSMHV2_rdrdl2 = 0.0 ; - if ( !model->HSMHV2_rdrvmaxw_Given ) model->HSMHV2_rdrvmaxw = 0.0 ; - if ( !model->HSMHV2_rdrvmaxwp_Given ) model->HSMHV2_rdrvmaxwp = 1.0 ; - if ( !model->HSMHV2_rdrvmaxl_Given ) model->HSMHV2_rdrvmaxl = 0.0 ; - if ( !model->HSMHV2_rdrvmaxlp_Given ) model->HSMHV2_rdrvmaxlp = 1.0 ; - if ( !model->HSMHV2_rdrmuel_Given ) model->HSMHV2_rdrmuel = 0.0 ; - if ( !model->HSMHV2_rdrmuelp_Given ) model->HSMHV2_rdrmuelp = 1.0 ; - if ( !model->HSMHV2_rdrqover_Given ) model->HSMHV2_rdrqover = 1E5 ; - if ( !model->HSMHV2_qovadd_Given ) model->HSMHV2_qovadd = 0.0 ; - if ( !model->HSMHV2_js0d_Given ) model->HSMHV2_js0d = model->HSMHV2_js0 ; - if ( !model->HSMHV2_js0swd_Given ) model->HSMHV2_js0swd = model->HSMHV2_js0sw ; - if ( !model->HSMHV2_njd_Given ) model->HSMHV2_njd = model->HSMHV2_nj ; - if ( !model->HSMHV2_njswd_Given ) model->HSMHV2_njswd = model->HSMHV2_njsw ; - if ( !model->HSMHV2_xtid_Given ) model->HSMHV2_xtid = model->HSMHV2_xti ; - if ( !model->HSMHV2_cjd_Given ) model->HSMHV2_cjd = model->HSMHV2_cj ; - if ( !model->HSMHV2_cjswd_Given ) model->HSMHV2_cjswd = model->HSMHV2_cjsw ; - if ( !model->HSMHV2_cjswgd_Given ) model->HSMHV2_cjswgd = model->HSMHV2_cjswg ; - if ( !model->HSMHV2_mjd_Given ) model->HSMHV2_mjd = model->HSMHV2_mj ; - if ( !model->HSMHV2_mjswd_Given ) model->HSMHV2_mjswd = model->HSMHV2_mjsw ; - if ( !model->HSMHV2_mjswgd_Given ) model->HSMHV2_mjswgd = model->HSMHV2_mjswg ; - if ( !model->HSMHV2_pbd_Given ) model->HSMHV2_pbd = model->HSMHV2_pb ; - if ( !model->HSMHV2_pbswd_Given ) model->HSMHV2_pbswd = model->HSMHV2_pbsw ; - if ( !model->HSMHV2_pbswgd_Given ) model->HSMHV2_pbswgd = model->HSMHV2_pbswg ; - if ( !model->HSMHV2_xti2d_Given ) model->HSMHV2_xti2d = model->HSMHV2_xti2 ; - if ( !model->HSMHV2_cisbd_Given ) model->HSMHV2_cisbd = model->HSMHV2_cisb ; - if ( !model->HSMHV2_cvbd_Given ) model->HSMHV2_cvbd = model->HSMHV2_cvb ; - if ( !model->HSMHV2_ctempd_Given ) model->HSMHV2_ctempd = model->HSMHV2_ctemp ; - if ( !model->HSMHV2_cisbkd_Given ) model->HSMHV2_cisbkd = model->HSMHV2_cisbk ; - if ( !model->HSMHV2_divxd_Given ) model->HSMHV2_divxd = model->HSMHV2_divx ; - if ( !model->HSMHV2_vdiffjd_Given ) model->HSMHV2_vdiffjd = model->HSMHV2_vdiffj ; - if ( !model->HSMHV2_js0s_Given ) model->HSMHV2_js0s = model->HSMHV2_js0d ; - if ( !model->HSMHV2_js0sws_Given ) model->HSMHV2_js0sws = model->HSMHV2_js0swd ; - if ( !model->HSMHV2_njs_Given ) model->HSMHV2_njs = model->HSMHV2_njd ; - if ( !model->HSMHV2_njsws_Given ) model->HSMHV2_njsws = model->HSMHV2_njswd ; - if ( !model->HSMHV2_xtis_Given ) model->HSMHV2_xtis = model->HSMHV2_xtid ; - if ( !model->HSMHV2_cjs_Given ) model->HSMHV2_cjs = model->HSMHV2_cjd ; - if ( !model->HSMHV2_cjsws_Given ) model->HSMHV2_cjsws = model->HSMHV2_cjswd ; - if ( !model->HSMHV2_cjswgs_Given ) model->HSMHV2_cjswgs = model->HSMHV2_cjswgd ; - if ( !model->HSMHV2_mjs_Given ) model->HSMHV2_mjs = model->HSMHV2_mjd ; - if ( !model->HSMHV2_mjsws_Given ) model->HSMHV2_mjsws = model->HSMHV2_mjswd ; - if ( !model->HSMHV2_mjswgs_Given ) model->HSMHV2_mjswgs = model->HSMHV2_mjswgd ; - if ( !model->HSMHV2_pbs_Given ) model->HSMHV2_pbs = model->HSMHV2_pbd ; - if ( !model->HSMHV2_pbsws_Given ) model->HSMHV2_pbsws = model->HSMHV2_pbswd ; - if ( !model->HSMHV2_pbswgs_Given ) model->HSMHV2_pbswgs = model->HSMHV2_pbswgd ; - if ( !model->HSMHV2_xti2s_Given ) model->HSMHV2_xti2s = model->HSMHV2_xti2d ; - if ( !model->HSMHV2_cisbs_Given ) model->HSMHV2_cisbs = model->HSMHV2_cisbd ; - if ( !model->HSMHV2_cvbs_Given ) model->HSMHV2_cvbs = model->HSMHV2_cvbd ; - if ( !model->HSMHV2_ctemps_Given ) model->HSMHV2_ctemps = model->HSMHV2_ctempd ; - if ( !model->HSMHV2_cisbks_Given ) model->HSMHV2_cisbks = model->HSMHV2_cisbkd ; - if ( !model->HSMHV2_divxs_Given ) model->HSMHV2_divxs = model->HSMHV2_divxd ; - if ( !model->HSMHV2_vdiffjs_Given ) model->HSMHV2_vdiffjs = model->HSMHV2_vdiffjd ; - if ( !model->HSMHV2_shemax_Given ) model->HSMHV2_shemax = 500 ; - if ( !model->HSMHV2_vgsmin_Given ) model->HSMHV2_vgsmin = -100 * model->HSMHV2_type ; - if ( !model->HSMHV2_gdsleak_Given ) model->HSMHV2_gdsleak = 0.0 ; - if ( !model->HSMHV2_rdrbb_Given ) model->HSMHV2_rdrbb = 1 ; - if ( !model->HSMHV2_rdrbbtmp_Given ) model->HSMHV2_rdrbbtmp = 0 ; - - /* binning parameters */ - if ( !model->HSMHV2_lmin_Given ) model->HSMHV2_lmin = 0.0 ; - if ( !model->HSMHV2_lmax_Given ) model->HSMHV2_lmax = 1.0 ; - if ( !model->HSMHV2_wmin_Given ) model->HSMHV2_wmin = 0.0 ; - if ( !model->HSMHV2_wmax_Given ) model->HSMHV2_wmax = 1.0 ; - if ( !model->HSMHV2_lbinn_Given ) model->HSMHV2_lbinn = 1.0 ; - if ( !model->HSMHV2_wbinn_Given ) model->HSMHV2_wbinn = 1.0 ; - - /* Length dependence */ - if ( !model->HSMHV2_lvmax_Given ) model->HSMHV2_lvmax = 0.0 ; - if ( !model->HSMHV2_lbgtmp1_Given ) model->HSMHV2_lbgtmp1 = 0.0 ; - if ( !model->HSMHV2_lbgtmp2_Given ) model->HSMHV2_lbgtmp2 = 0.0 ; - if ( !model->HSMHV2_leg0_Given ) model->HSMHV2_leg0 = 0.0 ; - if ( !model->HSMHV2_lvfbover_Given ) model->HSMHV2_lvfbover = 0.0 ; - if ( !model->HSMHV2_lnover_Given ) model->HSMHV2_lnover = 0.0 ; - if ( !model->HSMHV2_lnovers_Given ) model->HSMHV2_lnovers = 0.0 ; - if ( !model->HSMHV2_lwl2_Given ) model->HSMHV2_lwl2 = 0.0 ; - if ( !model->HSMHV2_lvfbc_Given ) model->HSMHV2_lvfbc = 0.0 ; - if ( !model->HSMHV2_lnsubc_Given ) model->HSMHV2_lnsubc = 0.0 ; - if ( !model->HSMHV2_lnsubp_Given ) model->HSMHV2_lnsubp = 0.0 ; - if ( !model->HSMHV2_lscp1_Given ) model->HSMHV2_lscp1 = 0.0 ; - if ( !model->HSMHV2_lscp2_Given ) model->HSMHV2_lscp2 = 0.0 ; - if ( !model->HSMHV2_lscp3_Given ) model->HSMHV2_lscp3 = 0.0 ; - if ( !model->HSMHV2_lsc1_Given ) model->HSMHV2_lsc1 = 0.0 ; - if ( !model->HSMHV2_lsc2_Given ) model->HSMHV2_lsc2 = 0.0 ; - if ( !model->HSMHV2_lsc3_Given ) model->HSMHV2_lsc3 = 0.0 ; - if ( !model->HSMHV2_lpgd1_Given ) model->HSMHV2_lpgd1 = 0.0 ; - if ( !model->HSMHV2_lndep_Given ) model->HSMHV2_lndep = 0.0 ; - if ( !model->HSMHV2_lninv_Given ) model->HSMHV2_lninv = 0.0 ; - if ( !model->HSMHV2_lmuecb0_Given ) model->HSMHV2_lmuecb0 = 0.0 ; - if ( !model->HSMHV2_lmuecb1_Given ) model->HSMHV2_lmuecb1 = 0.0 ; - if ( !model->HSMHV2_lmueph1_Given ) model->HSMHV2_lmueph1 = 0.0 ; - if ( !model->HSMHV2_lvtmp_Given ) model->HSMHV2_lvtmp = 0.0 ; - if ( !model->HSMHV2_lwvth0_Given ) model->HSMHV2_lwvth0 = 0.0 ; - if ( !model->HSMHV2_lmuesr1_Given ) model->HSMHV2_lmuesr1 = 0.0 ; - if ( !model->HSMHV2_lmuetmp_Given ) model->HSMHV2_lmuetmp = 0.0 ; - if ( !model->HSMHV2_lsub1_Given ) model->HSMHV2_lsub1 = 0.0 ; - if ( !model->HSMHV2_lsub2_Given ) model->HSMHV2_lsub2 = 0.0 ; - if ( !model->HSMHV2_lsvds_Given ) model->HSMHV2_lsvds = 0.0 ; - if ( !model->HSMHV2_lsvbs_Given ) model->HSMHV2_lsvbs = 0.0 ; - if ( !model->HSMHV2_lsvgs_Given ) model->HSMHV2_lsvgs = 0.0 ; - if ( !model->HSMHV2_lfn1_Given ) model->HSMHV2_lfn1 = 0.0 ; - if ( !model->HSMHV2_lfn2_Given ) model->HSMHV2_lfn2 = 0.0 ; - if ( !model->HSMHV2_lfn3_Given ) model->HSMHV2_lfn3 = 0.0 ; - if ( !model->HSMHV2_lfvbs_Given ) model->HSMHV2_lfvbs = 0.0 ; - if ( !model->HSMHV2_lnsti_Given ) model->HSMHV2_lnsti = 0.0 ; - if ( !model->HSMHV2_lwsti_Given ) model->HSMHV2_lwsti = 0.0 ; - if ( !model->HSMHV2_lscsti1_Given ) model->HSMHV2_lscsti1 = 0.0 ; - if ( !model->HSMHV2_lscsti2_Given ) model->HSMHV2_lscsti2 = 0.0 ; - if ( !model->HSMHV2_lvthsti_Given ) model->HSMHV2_lvthsti = 0.0 ; - if ( !model->HSMHV2_lmuesti1_Given ) model->HSMHV2_lmuesti1 = 0.0 ; - if ( !model->HSMHV2_lmuesti2_Given ) model->HSMHV2_lmuesti2 = 0.0 ; - if ( !model->HSMHV2_lmuesti3_Given ) model->HSMHV2_lmuesti3 = 0.0 ; - if ( !model->HSMHV2_lnsubpsti1_Given ) model->HSMHV2_lnsubpsti1 = 0.0 ; - if ( !model->HSMHV2_lnsubpsti2_Given ) model->HSMHV2_lnsubpsti2 = 0.0 ; - if ( !model->HSMHV2_lnsubpsti3_Given ) model->HSMHV2_lnsubpsti3 = 0.0 ; - if ( !model->HSMHV2_lcgso_Given ) model->HSMHV2_lcgso = 0.0 ; - if ( !model->HSMHV2_lcgdo_Given ) model->HSMHV2_lcgdo = 0.0 ; - if ( !model->HSMHV2_ljs0_Given ) model->HSMHV2_ljs0 = 0.0 ; - if ( !model->HSMHV2_ljs0sw_Given ) model->HSMHV2_ljs0sw = 0.0 ; - if ( !model->HSMHV2_lnj_Given ) model->HSMHV2_lnj = 0.0 ; - if ( !model->HSMHV2_lcisbk_Given ) model->HSMHV2_lcisbk = 0.0 ; - if ( !model->HSMHV2_lclm1_Given ) model->HSMHV2_lclm1 = 0.0 ; - if ( !model->HSMHV2_lclm2_Given ) model->HSMHV2_lclm2 = 0.0 ; - if ( !model->HSMHV2_lclm3_Given ) model->HSMHV2_lclm3 = 0.0 ; - if ( !model->HSMHV2_lwfc_Given ) model->HSMHV2_lwfc = 0.0 ; - if ( !model->HSMHV2_lgidl1_Given ) model->HSMHV2_lgidl1 = 0.0 ; - if ( !model->HSMHV2_lgidl2_Given ) model->HSMHV2_lgidl2 = 0.0 ; - if ( !model->HSMHV2_lgleak1_Given ) model->HSMHV2_lgleak1 = 0.0 ; - if ( !model->HSMHV2_lgleak2_Given ) model->HSMHV2_lgleak2 = 0.0 ; - if ( !model->HSMHV2_lgleak3_Given ) model->HSMHV2_lgleak3 = 0.0 ; - if ( !model->HSMHV2_lgleak6_Given ) model->HSMHV2_lgleak6 = 0.0 ; - if ( !model->HSMHV2_lglksd1_Given ) model->HSMHV2_lglksd1 = 0.0 ; - if ( !model->HSMHV2_lglksd2_Given ) model->HSMHV2_lglksd2 = 0.0 ; - if ( !model->HSMHV2_lglkb1_Given ) model->HSMHV2_lglkb1 = 0.0 ; - if ( !model->HSMHV2_lglkb2_Given ) model->HSMHV2_lglkb2 = 0.0 ; - if ( !model->HSMHV2_lnftrp_Given ) model->HSMHV2_lnftrp = 0.0 ; - if ( !model->HSMHV2_lnfalp_Given ) model->HSMHV2_lnfalp = 0.0 ; - if ( !model->HSMHV2_lvdiffj_Given ) model->HSMHV2_lvdiffj = 0.0 ; - if ( !model->HSMHV2_libpc1_Given ) model->HSMHV2_libpc1 = 0.0 ; - if ( !model->HSMHV2_libpc2_Given ) model->HSMHV2_libpc2 = 0.0 ; - if ( !model->HSMHV2_lcgbo_Given ) model->HSMHV2_lcgbo = 0.0 ; - if ( !model->HSMHV2_lcvdsover_Given ) model->HSMHV2_lcvdsover = 0.0 ; - if ( !model->HSMHV2_lfalph_Given ) model->HSMHV2_lfalph = 0.0 ; - if ( !model->HSMHV2_lnpext_Given ) model->HSMHV2_lnpext = 0.0 ; - if ( !model->HSMHV2_lpowrat_Given ) model->HSMHV2_lpowrat = 0.0 ; - if ( !model->HSMHV2_lrd_Given ) model->HSMHV2_lrd = 0.0 ; - if ( !model->HSMHV2_lrd22_Given ) model->HSMHV2_lrd22 = 0.0 ; - if ( !model->HSMHV2_lrd23_Given ) model->HSMHV2_lrd23 = 0.0 ; - if ( !model->HSMHV2_lrd24_Given ) model->HSMHV2_lrd24 = 0.0 ; - if ( !model->HSMHV2_lrdict1_Given ) model->HSMHV2_lrdict1 = 0.0 ; - if ( !model->HSMHV2_lrdov13_Given ) model->HSMHV2_lrdov13 = 0.0 ; - if ( !model->HSMHV2_lrdslp1_Given ) model->HSMHV2_lrdslp1 = 0.0 ; - if ( !model->HSMHV2_lrdvb_Given ) model->HSMHV2_lrdvb = 0.0 ; - if ( !model->HSMHV2_lrdvd_Given ) model->HSMHV2_lrdvd = 0.0 ; - if ( !model->HSMHV2_lrdvg11_Given ) model->HSMHV2_lrdvg11 = 0.0 ; - if ( !model->HSMHV2_lrs_Given ) model->HSMHV2_lrs = 0.0 ; - if ( !model->HSMHV2_lrth0_Given ) model->HSMHV2_lrth0 = 0.0 ; - if ( !model->HSMHV2_lvover_Given ) model->HSMHV2_lvover = 0.0 ; - if ( !model->HSMHV2_ljs0d_Given ) model->HSMHV2_ljs0d = model->HSMHV2_ljs0 ; - if ( !model->HSMHV2_ljs0swd_Given ) model->HSMHV2_ljs0swd = model->HSMHV2_ljs0sw ; - if ( !model->HSMHV2_lnjd_Given ) model->HSMHV2_lnjd = model->HSMHV2_lnj ; - if ( !model->HSMHV2_lcisbkd_Given ) model->HSMHV2_lcisbkd = model->HSMHV2_lcisbk ; - if ( !model->HSMHV2_lvdiffjd_Given ) model->HSMHV2_lvdiffjd = model->HSMHV2_lvdiffj ; - if ( !model->HSMHV2_ljs0s_Given ) model->HSMHV2_ljs0s = model->HSMHV2_ljs0d ; - if ( !model->HSMHV2_ljs0sws_Given ) model->HSMHV2_ljs0sws = model->HSMHV2_ljs0swd ; - if ( !model->HSMHV2_lnjs_Given ) model->HSMHV2_lnjs = model->HSMHV2_lnjd ; - if ( !model->HSMHV2_lcisbks_Given ) model->HSMHV2_lcisbks = model->HSMHV2_lcisbkd ; - if ( !model->HSMHV2_lvdiffjs_Given ) model->HSMHV2_lvdiffjs = model->HSMHV2_lvdiffjd ; - - /* Width dependence */ - if ( !model->HSMHV2_wvmax_Given ) model->HSMHV2_wvmax = 0.0 ; - if ( !model->HSMHV2_wbgtmp1_Given ) model->HSMHV2_wbgtmp1 = 0.0 ; - if ( !model->HSMHV2_wbgtmp2_Given ) model->HSMHV2_wbgtmp2 = 0.0 ; - if ( !model->HSMHV2_weg0_Given ) model->HSMHV2_weg0 = 0.0 ; - if ( !model->HSMHV2_wvfbover_Given ) model->HSMHV2_wvfbover = 0.0 ; - if ( !model->HSMHV2_wnover_Given ) model->HSMHV2_wnover = 0.0 ; - if ( !model->HSMHV2_wnovers_Given ) model->HSMHV2_wnovers = 0.0 ; - if ( !model->HSMHV2_wwl2_Given ) model->HSMHV2_wwl2 = 0.0 ; - if ( !model->HSMHV2_wvfbc_Given ) model->HSMHV2_wvfbc = 0.0 ; - if ( !model->HSMHV2_wnsubc_Given ) model->HSMHV2_wnsubc = 0.0 ; - if ( !model->HSMHV2_wnsubp_Given ) model->HSMHV2_wnsubp = 0.0 ; - if ( !model->HSMHV2_wscp1_Given ) model->HSMHV2_wscp1 = 0.0 ; - if ( !model->HSMHV2_wscp2_Given ) model->HSMHV2_wscp2 = 0.0 ; - if ( !model->HSMHV2_wscp3_Given ) model->HSMHV2_wscp3 = 0.0 ; - if ( !model->HSMHV2_wsc1_Given ) model->HSMHV2_wsc1 = 0.0 ; - if ( !model->HSMHV2_wsc2_Given ) model->HSMHV2_wsc2 = 0.0 ; - if ( !model->HSMHV2_wsc3_Given ) model->HSMHV2_wsc3 = 0.0 ; - if ( !model->HSMHV2_wpgd1_Given ) model->HSMHV2_wpgd1 = 0.0 ; - if ( !model->HSMHV2_wndep_Given ) model->HSMHV2_wndep = 0.0 ; - if ( !model->HSMHV2_wninv_Given ) model->HSMHV2_wninv = 0.0 ; - if ( !model->HSMHV2_wmuecb0_Given ) model->HSMHV2_wmuecb0 = 0.0 ; - if ( !model->HSMHV2_wmuecb1_Given ) model->HSMHV2_wmuecb1 = 0.0 ; - if ( !model->HSMHV2_wmueph1_Given ) model->HSMHV2_wmueph1 = 0.0 ; - if ( !model->HSMHV2_wvtmp_Given ) model->HSMHV2_wvtmp = 0.0 ; - if ( !model->HSMHV2_wwvth0_Given ) model->HSMHV2_wwvth0 = 0.0 ; - if ( !model->HSMHV2_wmuesr1_Given ) model->HSMHV2_wmuesr1 = 0.0 ; - if ( !model->HSMHV2_wmuetmp_Given ) model->HSMHV2_wmuetmp = 0.0 ; - if ( !model->HSMHV2_wsub1_Given ) model->HSMHV2_wsub1 = 0.0 ; - if ( !model->HSMHV2_wsub2_Given ) model->HSMHV2_wsub2 = 0.0 ; - if ( !model->HSMHV2_wsvds_Given ) model->HSMHV2_wsvds = 0.0 ; - if ( !model->HSMHV2_wsvbs_Given ) model->HSMHV2_wsvbs = 0.0 ; - if ( !model->HSMHV2_wsvgs_Given ) model->HSMHV2_wsvgs = 0.0 ; - if ( !model->HSMHV2_wfn1_Given ) model->HSMHV2_wfn1 = 0.0 ; - if ( !model->HSMHV2_wfn2_Given ) model->HSMHV2_wfn2 = 0.0 ; - if ( !model->HSMHV2_wfn3_Given ) model->HSMHV2_wfn3 = 0.0 ; - if ( !model->HSMHV2_wfvbs_Given ) model->HSMHV2_wfvbs = 0.0 ; - if ( !model->HSMHV2_wnsti_Given ) model->HSMHV2_wnsti = 0.0 ; - if ( !model->HSMHV2_wwsti_Given ) model->HSMHV2_wwsti = 0.0 ; - if ( !model->HSMHV2_wscsti1_Given ) model->HSMHV2_wscsti1 = 0.0 ; - if ( !model->HSMHV2_wscsti2_Given ) model->HSMHV2_wscsti2 = 0.0 ; - if ( !model->HSMHV2_wvthsti_Given ) model->HSMHV2_wvthsti = 0.0 ; - if ( !model->HSMHV2_wmuesti1_Given ) model->HSMHV2_wmuesti1 = 0.0 ; - if ( !model->HSMHV2_wmuesti2_Given ) model->HSMHV2_wmuesti2 = 0.0 ; - if ( !model->HSMHV2_wmuesti3_Given ) model->HSMHV2_wmuesti3 = 0.0 ; - if ( !model->HSMHV2_wnsubpsti1_Given ) model->HSMHV2_wnsubpsti1 = 0.0 ; - if ( !model->HSMHV2_wnsubpsti2_Given ) model->HSMHV2_wnsubpsti2 = 0.0 ; - if ( !model->HSMHV2_wnsubpsti3_Given ) model->HSMHV2_wnsubpsti3 = 0.0 ; - if ( !model->HSMHV2_wcgso_Given ) model->HSMHV2_wcgso = 0.0 ; - if ( !model->HSMHV2_wcgdo_Given ) model->HSMHV2_wcgdo = 0.0 ; - if ( !model->HSMHV2_wjs0_Given ) model->HSMHV2_wjs0 = 0.0 ; - if ( !model->HSMHV2_wjs0sw_Given ) model->HSMHV2_wjs0sw = 0.0 ; - if ( !model->HSMHV2_wnj_Given ) model->HSMHV2_wnj = 0.0 ; - if ( !model->HSMHV2_wcisbk_Given ) model->HSMHV2_wcisbk = 0.0 ; - if ( !model->HSMHV2_wclm1_Given ) model->HSMHV2_wclm1 = 0.0 ; - if ( !model->HSMHV2_wclm2_Given ) model->HSMHV2_wclm2 = 0.0 ; - if ( !model->HSMHV2_wclm3_Given ) model->HSMHV2_wclm3 = 0.0 ; - if ( !model->HSMHV2_wwfc_Given ) model->HSMHV2_wwfc = 0.0 ; - if ( !model->HSMHV2_wgidl1_Given ) model->HSMHV2_wgidl1 = 0.0 ; - if ( !model->HSMHV2_wgidl2_Given ) model->HSMHV2_wgidl2 = 0.0 ; - if ( !model->HSMHV2_wgleak1_Given ) model->HSMHV2_wgleak1 = 0.0 ; - if ( !model->HSMHV2_wgleak2_Given ) model->HSMHV2_wgleak2 = 0.0 ; - if ( !model->HSMHV2_wgleak3_Given ) model->HSMHV2_wgleak3 = 0.0 ; - if ( !model->HSMHV2_wgleak6_Given ) model->HSMHV2_wgleak6 = 0.0 ; - if ( !model->HSMHV2_wglksd1_Given ) model->HSMHV2_wglksd1 = 0.0 ; - if ( !model->HSMHV2_wglksd2_Given ) model->HSMHV2_wglksd2 = 0.0 ; - if ( !model->HSMHV2_wglkb1_Given ) model->HSMHV2_wglkb1 = 0.0 ; - if ( !model->HSMHV2_wglkb2_Given ) model->HSMHV2_wglkb2 = 0.0 ; - if ( !model->HSMHV2_wnftrp_Given ) model->HSMHV2_wnftrp = 0.0 ; - if ( !model->HSMHV2_wnfalp_Given ) model->HSMHV2_wnfalp = 0.0 ; - if ( !model->HSMHV2_wvdiffj_Given ) model->HSMHV2_wvdiffj = 0.0 ; - if ( !model->HSMHV2_wibpc1_Given ) model->HSMHV2_wibpc1 = 0.0 ; - if ( !model->HSMHV2_wibpc2_Given ) model->HSMHV2_wibpc2 = 0.0 ; - if ( !model->HSMHV2_wcgbo_Given ) model->HSMHV2_wcgbo = 0.0 ; - if ( !model->HSMHV2_wcvdsover_Given ) model->HSMHV2_wcvdsover = 0.0 ; - if ( !model->HSMHV2_wfalph_Given ) model->HSMHV2_wfalph = 0.0 ; - if ( !model->HSMHV2_wnpext_Given ) model->HSMHV2_wnpext = 0.0 ; - if ( !model->HSMHV2_wpowrat_Given ) model->HSMHV2_wpowrat = 0.0 ; - if ( !model->HSMHV2_wrd_Given ) model->HSMHV2_wrd = 0.0 ; - if ( !model->HSMHV2_wrd22_Given ) model->HSMHV2_wrd22 = 0.0 ; - if ( !model->HSMHV2_wrd23_Given ) model->HSMHV2_wrd23 = 0.0 ; - if ( !model->HSMHV2_wrd24_Given ) model->HSMHV2_wrd24 = 0.0 ; - if ( !model->HSMHV2_wrdict1_Given ) model->HSMHV2_wrdict1 = 0.0 ; - if ( !model->HSMHV2_wrdov13_Given ) model->HSMHV2_wrdov13 = 0.0 ; - if ( !model->HSMHV2_wrdslp1_Given ) model->HSMHV2_wrdslp1 = 0.0 ; - if ( !model->HSMHV2_wrdvb_Given ) model->HSMHV2_wrdvb = 0.0 ; - if ( !model->HSMHV2_wrdvd_Given ) model->HSMHV2_wrdvd = 0.0 ; - if ( !model->HSMHV2_wrdvg11_Given ) model->HSMHV2_wrdvg11 = 0.0 ; - if ( !model->HSMHV2_wrs_Given ) model->HSMHV2_wrs = 0.0 ; - if ( !model->HSMHV2_wrth0_Given ) model->HSMHV2_wrth0 = 0.0 ; - if ( !model->HSMHV2_wvover_Given ) model->HSMHV2_wvover = 0.0 ; - if ( !model->HSMHV2_wjs0d_Given ) model->HSMHV2_wjs0d = model->HSMHV2_wjs0 ; - if ( !model->HSMHV2_wjs0swd_Given ) model->HSMHV2_wjs0swd = model->HSMHV2_wjs0sw ; - if ( !model->HSMHV2_wnjd_Given ) model->HSMHV2_wnjd = model->HSMHV2_wnj ; - if ( !model->HSMHV2_wcisbkd_Given ) model->HSMHV2_wcisbkd = model->HSMHV2_wcisbk ; - if ( !model->HSMHV2_wvdiffjd_Given ) model->HSMHV2_wvdiffjd = model->HSMHV2_wvdiffj ; - if ( !model->HSMHV2_wjs0s_Given ) model->HSMHV2_wjs0s = model->HSMHV2_wjs0d ; - if ( !model->HSMHV2_wjs0sws_Given ) model->HSMHV2_wjs0sws = model->HSMHV2_wjs0swd ; - if ( !model->HSMHV2_wnjs_Given ) model->HSMHV2_wnjs = model->HSMHV2_wnjd ; - if ( !model->HSMHV2_wcisbks_Given ) model->HSMHV2_wcisbks = model->HSMHV2_wcisbkd ; - if ( !model->HSMHV2_wvdiffjs_Given ) model->HSMHV2_wvdiffjs = model->HSMHV2_wvdiffjd ; - - /* Cross-term dependence */ - if ( !model->HSMHV2_pvmax_Given ) model->HSMHV2_pvmax = 0.0 ; - if ( !model->HSMHV2_pbgtmp1_Given ) model->HSMHV2_pbgtmp1 = 0.0 ; - if ( !model->HSMHV2_pbgtmp2_Given ) model->HSMHV2_pbgtmp2 = 0.0 ; - if ( !model->HSMHV2_peg0_Given ) model->HSMHV2_peg0 = 0.0 ; - if ( !model->HSMHV2_pvfbover_Given ) model->HSMHV2_pvfbover = 0.0 ; - if ( !model->HSMHV2_pnover_Given ) model->HSMHV2_pnover = 0.0 ; - if ( !model->HSMHV2_pnovers_Given ) model->HSMHV2_pnovers = 0.0 ; - if ( !model->HSMHV2_pwl2_Given ) model->HSMHV2_pwl2 = 0.0 ; - if ( !model->HSMHV2_pvfbc_Given ) model->HSMHV2_pvfbc = 0.0 ; - if ( !model->HSMHV2_pnsubc_Given ) model->HSMHV2_pnsubc = 0.0 ; - if ( !model->HSMHV2_pnsubp_Given ) model->HSMHV2_pnsubp = 0.0 ; - if ( !model->HSMHV2_pscp1_Given ) model->HSMHV2_pscp1 = 0.0 ; - if ( !model->HSMHV2_pscp2_Given ) model->HSMHV2_pscp2 = 0.0 ; - if ( !model->HSMHV2_pscp3_Given ) model->HSMHV2_pscp3 = 0.0 ; - if ( !model->HSMHV2_psc1_Given ) model->HSMHV2_psc1 = 0.0 ; - if ( !model->HSMHV2_psc2_Given ) model->HSMHV2_psc2 = 0.0 ; - if ( !model->HSMHV2_psc3_Given ) model->HSMHV2_psc3 = 0.0 ; - if ( !model->HSMHV2_ppgd1_Given ) model->HSMHV2_ppgd1 = 0.0 ; - if ( !model->HSMHV2_pndep_Given ) model->HSMHV2_pndep = 0.0 ; - if ( !model->HSMHV2_pninv_Given ) model->HSMHV2_pninv = 0.0 ; - if ( !model->HSMHV2_pmuecb0_Given ) model->HSMHV2_pmuecb0 = 0.0 ; - if ( !model->HSMHV2_pmuecb1_Given ) model->HSMHV2_pmuecb1 = 0.0 ; - if ( !model->HSMHV2_pmueph1_Given ) model->HSMHV2_pmueph1 = 0.0 ; - if ( !model->HSMHV2_pvtmp_Given ) model->HSMHV2_pvtmp = 0.0 ; - if ( !model->HSMHV2_pwvth0_Given ) model->HSMHV2_pwvth0 = 0.0 ; - if ( !model->HSMHV2_pmuesr1_Given ) model->HSMHV2_pmuesr1 = 0.0 ; - if ( !model->HSMHV2_pmuetmp_Given ) model->HSMHV2_pmuetmp = 0.0 ; - if ( !model->HSMHV2_psub1_Given ) model->HSMHV2_psub1 = 0.0 ; - if ( !model->HSMHV2_psub2_Given ) model->HSMHV2_psub2 = 0.0 ; - if ( !model->HSMHV2_psvds_Given ) model->HSMHV2_psvds = 0.0 ; - if ( !model->HSMHV2_psvbs_Given ) model->HSMHV2_psvbs = 0.0 ; - if ( !model->HSMHV2_psvgs_Given ) model->HSMHV2_psvgs = 0.0 ; - if ( !model->HSMHV2_pfn1_Given ) model->HSMHV2_pfn1 = 0.0 ; - if ( !model->HSMHV2_pfn2_Given ) model->HSMHV2_pfn2 = 0.0 ; - if ( !model->HSMHV2_pfn3_Given ) model->HSMHV2_pfn3 = 0.0 ; - if ( !model->HSMHV2_pfvbs_Given ) model->HSMHV2_pfvbs = 0.0 ; - if ( !model->HSMHV2_pnsti_Given ) model->HSMHV2_pnsti = 0.0 ; - if ( !model->HSMHV2_pwsti_Given ) model->HSMHV2_pwsti = 0.0 ; - if ( !model->HSMHV2_pscsti1_Given ) model->HSMHV2_pscsti1 = 0.0 ; - if ( !model->HSMHV2_pscsti2_Given ) model->HSMHV2_pscsti2 = 0.0 ; - if ( !model->HSMHV2_pvthsti_Given ) model->HSMHV2_pvthsti = 0.0 ; - if ( !model->HSMHV2_pmuesti1_Given ) model->HSMHV2_pmuesti1 = 0.0 ; - if ( !model->HSMHV2_pmuesti2_Given ) model->HSMHV2_pmuesti2 = 0.0 ; - if ( !model->HSMHV2_pmuesti3_Given ) model->HSMHV2_pmuesti3 = 0.0 ; - if ( !model->HSMHV2_pnsubpsti1_Given ) model->HSMHV2_pnsubpsti1 = 0.0 ; - if ( !model->HSMHV2_pnsubpsti2_Given ) model->HSMHV2_pnsubpsti2 = 0.0 ; - if ( !model->HSMHV2_pnsubpsti3_Given ) model->HSMHV2_pnsubpsti3 = 0.0 ; - if ( !model->HSMHV2_pcgso_Given ) model->HSMHV2_pcgso = 0.0 ; - if ( !model->HSMHV2_pcgdo_Given ) model->HSMHV2_pcgdo = 0.0 ; - if ( !model->HSMHV2_pjs0_Given ) model->HSMHV2_pjs0 = 0.0 ; - if ( !model->HSMHV2_pjs0sw_Given ) model->HSMHV2_pjs0sw = 0.0 ; - if ( !model->HSMHV2_pnj_Given ) model->HSMHV2_pnj = 0.0 ; - if ( !model->HSMHV2_pcisbk_Given ) model->HSMHV2_pcisbk = 0.0 ; - if ( !model->HSMHV2_pclm1_Given ) model->HSMHV2_pclm1 = 0.0 ; - if ( !model->HSMHV2_pclm2_Given ) model->HSMHV2_pclm2 = 0.0 ; - if ( !model->HSMHV2_pclm3_Given ) model->HSMHV2_pclm3 = 0.0 ; - if ( !model->HSMHV2_pwfc_Given ) model->HSMHV2_pwfc = 0.0 ; - if ( !model->HSMHV2_pgidl1_Given ) model->HSMHV2_pgidl1 = 0.0 ; - if ( !model->HSMHV2_pgidl2_Given ) model->HSMHV2_pgidl2 = 0.0 ; - if ( !model->HSMHV2_pgleak1_Given ) model->HSMHV2_pgleak1 = 0.0 ; - if ( !model->HSMHV2_pgleak2_Given ) model->HSMHV2_pgleak2 = 0.0 ; - if ( !model->HSMHV2_pgleak3_Given ) model->HSMHV2_pgleak3 = 0.0 ; - if ( !model->HSMHV2_pgleak6_Given ) model->HSMHV2_pgleak6 = 0.0 ; - if ( !model->HSMHV2_pglksd1_Given ) model->HSMHV2_pglksd1 = 0.0 ; - if ( !model->HSMHV2_pglksd2_Given ) model->HSMHV2_pglksd2 = 0.0 ; - if ( !model->HSMHV2_pglkb1_Given ) model->HSMHV2_pglkb1 = 0.0 ; - if ( !model->HSMHV2_pglkb2_Given ) model->HSMHV2_pglkb2 = 0.0 ; - if ( !model->HSMHV2_pnftrp_Given ) model->HSMHV2_pnftrp = 0.0 ; - if ( !model->HSMHV2_pnfalp_Given ) model->HSMHV2_pnfalp = 0.0 ; - if ( !model->HSMHV2_pvdiffj_Given ) model->HSMHV2_pvdiffj = 0.0 ; - if ( !model->HSMHV2_pibpc1_Given ) model->HSMHV2_pibpc1 = 0.0 ; - if ( !model->HSMHV2_pibpc2_Given ) model->HSMHV2_pibpc2 = 0.0 ; - if ( !model->HSMHV2_pcgbo_Given ) model->HSMHV2_pcgbo = 0.0 ; - if ( !model->HSMHV2_pcvdsover_Given ) model->HSMHV2_pcvdsover = 0.0 ; - if ( !model->HSMHV2_pfalph_Given ) model->HSMHV2_pfalph = 0.0 ; - if ( !model->HSMHV2_pnpext_Given ) model->HSMHV2_pnpext = 0.0 ; - if ( !model->HSMHV2_ppowrat_Given ) model->HSMHV2_ppowrat = 0.0 ; - if ( !model->HSMHV2_prd_Given ) model->HSMHV2_prd = 0.0 ; - if ( !model->HSMHV2_prd22_Given ) model->HSMHV2_prd22 = 0.0 ; - if ( !model->HSMHV2_prd23_Given ) model->HSMHV2_prd23 = 0.0 ; - if ( !model->HSMHV2_prd24_Given ) model->HSMHV2_prd24 = 0.0 ; - if ( !model->HSMHV2_prdict1_Given ) model->HSMHV2_prdict1 = 0.0 ; - if ( !model->HSMHV2_prdov13_Given ) model->HSMHV2_prdov13 = 0.0 ; - if ( !model->HSMHV2_prdslp1_Given ) model->HSMHV2_prdslp1 = 0.0 ; - if ( !model->HSMHV2_prdvb_Given ) model->HSMHV2_prdvb = 0.0 ; - if ( !model->HSMHV2_prdvd_Given ) model->HSMHV2_prdvd = 0.0 ; - if ( !model->HSMHV2_prdvg11_Given ) model->HSMHV2_prdvg11 = 0.0 ; - if ( !model->HSMHV2_prs_Given ) model->HSMHV2_prs = 0.0 ; - if ( !model->HSMHV2_prth0_Given ) model->HSMHV2_prth0 = 0.0 ; - if ( !model->HSMHV2_pvover_Given ) model->HSMHV2_pvover = 0.0 ; - if ( !model->HSMHV2_pjs0d_Given ) model->HSMHV2_pjs0d = model->HSMHV2_pjs0 ; - if ( !model->HSMHV2_pjs0swd_Given ) model->HSMHV2_pjs0swd = model->HSMHV2_pjs0sw ; - if ( !model->HSMHV2_pnjd_Given ) model->HSMHV2_pnjd = model->HSMHV2_pnj ; - if ( !model->HSMHV2_pcisbkd_Given ) model->HSMHV2_pcisbkd = model->HSMHV2_pcisbk ; - if ( !model->HSMHV2_pvdiffjd_Given ) model->HSMHV2_pvdiffjd = model->HSMHV2_pvdiffj ; - if ( !model->HSMHV2_pjs0s_Given ) model->HSMHV2_pjs0s = model->HSMHV2_pjs0d ; - if ( !model->HSMHV2_pjs0sws_Given ) model->HSMHV2_pjs0sws = model->HSMHV2_pjs0swd ; - if ( !model->HSMHV2_pnjs_Given ) model->HSMHV2_pnjs = model->HSMHV2_pnjd ; - if ( !model->HSMHV2_pcisbks_Given ) model->HSMHV2_pcisbks = model->HSMHV2_pcisbkd ; - if ( !model->HSMHV2_pvdiffjs_Given ) model->HSMHV2_pvdiffjs = model->HSMHV2_pvdiffjd ; - - if ( model->HSMHV2_ldrift_Given ) model->HSMHV2_ldrift2 = model->HSMHV2_ldrift ; - - if (!model->HSMHV2vgsMaxGiven) model->HSMHV2vgsMax = 1e99; - if (!model->HSMHV2vgdMaxGiven) model->HSMHV2vgdMax = 1e99; - if (!model->HSMHV2vgbMaxGiven) model->HSMHV2vgbMax = 1e99; - if (!model->HSMHV2vdsMaxGiven) model->HSMHV2vdsMax = 1e99; - if (!model->HSMHV2vbsMaxGiven) model->HSMHV2vbsMax = 1e99; - if (!model->HSMHV2vbdMaxGiven) model->HSMHV2vbdMax = 1e99; - if (!model->HSMHV2vgsrMaxGiven) model->HSMHV2vgsrMax = 1e99; - if (!model->HSMHV2vgdrMaxGiven) model->HSMHV2vgdrMax = 1e99; - if (!model->HSMHV2vgbrMaxGiven) model->HSMHV2vgbrMax = 1e99; - if (!model->HSMHV2vbsrMaxGiven) model->HSMHV2vbsrMax = 1e99; - if (!model->HSMHV2vbdrMaxGiven) model->HSMHV2vbdrMax = 1e99; - - /* For Symmetrical Device */ - if ( model->HSMHV2_cosym ) { - if(!model->HSMHV2_rs_Given ) - { model->HSMHV2_rs = model->HSMHV2_rd ; } - if(!model->HSMHV2_coovlps_Given ) - { model->HSMHV2_coovlps = model->HSMHV2_coovlp ; } - if(!model->HSMHV2_novers_Given ) - { model->HSMHV2_novers = model->HSMHV2_nover ; } -/* if(!model->HSMHV2_xld_Given ) */ -/* { model->HSMHV2_xld = model->HSMHV2_xldld ; } */ - if(!model->HSMHV2_lover_Given ) - { model->HSMHV2_lover = model->HSMHV2_loverld ; } -// if(!model->HSMHV2_lovers_Given ) -// { model->HSMHV2_lovers = model->HSMHV2_loverld ; } - if(!model->HSMHV2_ldrift1s_Given ) - { model->HSMHV2_ldrift1s = model->HSMHV2_ldrift1 ; } - if(!model->HSMHV2_ldrift2s_Given ) - { model->HSMHV2_ldrift2s = model->HSMHV2_ldrift2 ; } - if(!model->HSMHV2_cgso_Given ) { model->HSMHV2_cgso = model->HSMHV2_cgdo ; - model->HSMHV2_cgso_Given = model->HSMHV2_cgdo_Given ; } - } - if ( !model->HSMHV2_lovers_Given ) model->HSMHV2_lovers = model->HSMHV2_lover ; - - if ( model->HSMHV2_cvbk_Given ) { - fprintf(stderr,"warning(HiSIM_HV(%s)): CVBK has been inactivated by CVB.\n",model->HSMHV2modName); - } - if ( model->HSMHV2_cordrift ) { model->HSMHV2_corsrd = 0 ; } - - - modelMKS = &model->modelMKS ; - - /* loop through all the instances of the model */ - for ( here = HSMHV2instances(model);here != NULL ; - here = HSMHV2nextInstance(here)) { - /* allocate a chunk of the state vector */ - here->HSMHV2states = *states; - if (model->HSMHV2_conqs) - *states += HSMHV2numStatesNqs; - else - *states += HSMHV2numStates; - - hereMKS = &here->hereMKS ; - /* perform the device parameter defaulting */ - if ( !here->HSMHV2_coselfheat_Given ) here->HSMHV2_coselfheat = model->HSMHV2_coselfheat ; - if ( !here->HSMHV2_cosubnode_Given ) here->HSMHV2_cosubnode = model->HSMHV2_cosubnode ; - if ( !here->HSMHV2_l_Given ) here->HSMHV2_l = 2.0e-6 ; - if ( !here->HSMHV2_w_Given ) here->HSMHV2_w = 5.0e-6 ; - if ( !here->HSMHV2_ad_Given ) here->HSMHV2_ad = 0.0 ; - if ( !here->HSMHV2_as_Given ) here->HSMHV2_as = 0.0 ; - if ( !here->HSMHV2_pd_Given ) here->HSMHV2_pd = 0.0 ; - if ( !here->HSMHV2_ps_Given ) here->HSMHV2_ps = 0.0 ; - if ( !here->HSMHV2_nrd_Given ) here->HSMHV2_nrd = 1.0 ; - if ( !here->HSMHV2_nrs_Given ) here->HSMHV2_nrs = 1.0 ; - if ( !here->HSMHV2_ngcon_Given ) here->HSMHV2_ngcon = 1.0 ; - if ( !here->HSMHV2_xgw_Given ) here->HSMHV2_xgw = 0e0 ; - if ( !here->HSMHV2_xgl_Given ) here->HSMHV2_xgl = 0e0 ; - if ( !here->HSMHV2_nf_Given ) here->HSMHV2_nf = 1.0 ; - if ( !here->HSMHV2_sa_Given ) here->HSMHV2_sa = 0 ; - if ( !here->HSMHV2_sb_Given ) here->HSMHV2_sb = 0 ; - if ( !here->HSMHV2_sd_Given ) here->HSMHV2_sd = 0 ; - if ( !here->HSMHV2_dtemp_Given ) here->HSMHV2_dtemp = 0.0 ; - - if ( !here->HSMHV2_icVBS_Given ) here->HSMHV2_icVBS = 0.0; - if ( !here->HSMHV2_icVDS_Given ) here->HSMHV2_icVDS = 0.0; - if ( !here->HSMHV2_icVGS_Given ) here->HSMHV2_icVGS = 0.0; - - if ( !here->HSMHV2_corbnet_Given ) - here->HSMHV2_corbnet = model->HSMHV2_corbnet ; - else if ( here->HSMHV2_corbnet != 0 && here->HSMHV2_corbnet != 1 ) { - here->HSMHV2_corbnet = model->HSMHV2_corbnet ; - printf("warning(HiSIM_HV(%s)): CORBNET has been set to its default value: %d.\n", model->HSMHV2modName,here->HSMHV2_corbnet); - } - if ( !here->HSMHV2_rbdb_Given) here->HSMHV2_rbdb = model->HSMHV2_rbdb; /* not used in this version */ - if ( !here->HSMHV2_rbsb_Given) here->HSMHV2_rbsb = model->HSMHV2_rbsb; /* not used in this version */ - if ( !here->HSMHV2_rbpb_Given) here->HSMHV2_rbpb = model->HSMHV2_rbpb; - if ( !here->HSMHV2_rbps_Given) here->HSMHV2_rbps = model->HSMHV2_rbps; - if ( !here->HSMHV2_rbpd_Given) here->HSMHV2_rbpd = model->HSMHV2_rbpd; - - if ( !here->HSMHV2_corg_Given ) - here->HSMHV2_corg = model->HSMHV2_corg ; - else if ( here->HSMHV2_corg != 0 && here->HSMHV2_corg != 1 ) { - here->HSMHV2_corg = model->HSMHV2_corg ; - printf("warning(HiSIM_HV(%s)): CORG has been set to its default value: %d.\n", model->HSMHV2modName,here->HSMHV2_corg); - } - - if ( !here->HSMHV2_m_Given ) here->HSMHV2_m = 1.0 ; - if ( here->HSMHV2_subld1_Given ) { - printf("warning(HiSIM_HV(%s)): SUBLD1 has been inactived in instance param.\n",model->HSMHV2modName); - } - if ( here->HSMHV2_subld2_Given ) { - printf("warning(HiSIM_HV(%s)): SUBLD2 has been inactived in instance param.\n",model->HSMHV2modName); - } - if ( !here->HSMHV2_lovers_Given ) here->HSMHV2_lovers = model->HSMHV2_lovers ; - if ( !here->HSMHV2_lover_Given ) here->HSMHV2_lover = model->HSMHV2_lover ; - if ( !here->HSMHV2_loverld_Given ) here->HSMHV2_loverld = model->HSMHV2_loverld ; - if ( !here->HSMHV2_ldrift1_Given ) here->HSMHV2_ldrift1 = model->HSMHV2_ldrift1 ; - if ( !here->HSMHV2_ldrift2_Given ) here->HSMHV2_ldrift2 = model->HSMHV2_ldrift2 ; - if ( !here->HSMHV2_ldrift1s_Given ) here->HSMHV2_ldrift1s = model->HSMHV2_ldrift1s ; - if ( !here->HSMHV2_ldrift2s_Given ) here->HSMHV2_ldrift2s = model->HSMHV2_ldrift2s ; - - if ( model->HSMHV2_cosym ) { -// here->HSMHV2_lover = here->HSMHV2_lovers ; - if ( !here->HSMHV2_lover_Given && !model->HSMHV2_lover_Given ) here->HSMHV2_lover = here->HSMHV2_loverld ; - if ( !here->HSMHV2_lovers_Given && !model->HSMHV2_lovers_Given ) here->HSMHV2_lovers = here->HSMHV2_lover ; - if ( !here->HSMHV2_ldrift1s_Given && !model->HSMHV2_ldrift1s_Given ) here->HSMHV2_ldrift1s = here->HSMHV2_ldrift1 ; - if ( !here->HSMHV2_ldrift2s_Given && !model->HSMHV2_ldrift2s_Given ) here->HSMHV2_ldrift2s = here->HSMHV2_ldrift2 ; - } - - - /* process drain series resistance */ - /* rough check if Rd != 0 * **** don't forget to change if Rd processing is changed *******/ - T2 = ( here->HSMHV2_ldrift1 * model->HSMHV2_rdslp1 * C_m2um + model->HSMHV2_rdict1 ) - * ( here->HSMHV2_ldrift2 * model->HSMHV2_rdslp2 * C_m2um + model->HSMHV2_rdict2 ) ; - Rd = model->HSMHV2_rsh * here->HSMHV2_nrd * here->HSMHV2_nf + (model->HSMHV2_rd + model->HSMHV2_rdvd) * T2 ; - if ( ( ( ( model->HSMHV2_corsrd == 1 || model->HSMHV2_corsrd == 3 ) && Rd > 0.0 ) - || model->HSMHV2_cordrift == 1 ) ) { - if( here->HSMHV2dNodePrime <= 0) { - error = CKTmkVolt(ckt, &tmp, here->HSMHV2name, "drain"); - if (error) return(error); - here->HSMHV2dNodePrime = tmp->number; - } - } else { - here->HSMHV2dNodePrime = here->HSMHV2dNode; - } - here->HSMHV2drainConductance = 0.0 ; /* initialized for hsmhvnoi.c */ - - /* process source series resistance */ - /* rough check if Rs != 0 * ***** don't forget to change if Rs processing is changed *******/ - if(model->HSMHV2_corsrd == 1 || model->HSMHV2_corsrd == 3) { - T2 = ( here->HSMHV2_ldrift1s * model->HSMHV2_rdslp1 * C_m2um + model->HSMHV2_rdict1 ) - * ( here->HSMHV2_ldrift2s * model->HSMHV2_rdslp2 * C_m2um + model->HSMHV2_rdict2 ) ; - }else{ T2 = 0.0; } - Rs = model->HSMHV2_rsh * here->HSMHV2_nrs * here->HSMHV2_nf + model->HSMHV2_rs * T2 ; - if ( (model->HSMHV2_corsrd == 1 || model->HSMHV2_corsrd == 3 || model->HSMHV2_cordrift == 1) - && Rs > 0.0 ) { - if( here->HSMHV2sNodePrime == 0) { - error = CKTmkVolt(ckt, &tmp, here->HSMHV2name, "source"); - if (error) return(error); - here->HSMHV2sNodePrime = tmp->number; - } - } else { - here->HSMHV2sNodePrime = here->HSMHV2sNode; - } - here->HSMHV2sourceConductance = 0.0 ; /* initialized for hsmhvnoi.c */ - - /* process gate resistance */ - if ( (here->HSMHV2_corg == 1 && model->HSMHV2_rshg > 0.0) ) { - if (here->HSMHV2gNodePrime == 0) { - error = CKTmkVolt(ckt, &tmp, here->HSMHV2name, "gate"); - if (error) return(error); - here->HSMHV2gNodePrime = tmp->number; - } - } else { - here->HSMHV2gNodePrime = here->HSMHV2gNode; - } - - /* internal body nodes for body resistance model */ - if ( here->HSMHV2_corbnet == 1 ) { - if (here->HSMHV2dbNode == 0) { - error = CKTmkVolt(ckt, &tmp, here->HSMHV2name, "dbody"); - if (error) return(error); - here->HSMHV2dbNode = tmp->number; - } - if (here->HSMHV2bNodePrime == 0) { - error = CKTmkVolt(ckt, &tmp,here->HSMHV2name, "body"); - if (error) return(error); - here->HSMHV2bNodePrime = tmp->number; - } - if (here->HSMHV2sbNode == 0) { - error = CKTmkVolt(ckt, &tmp, here->HSMHV2name,"sbody"); - if (error) return(error); - here->HSMHV2sbNode = tmp->number; - } - } else { - here->HSMHV2dbNode = here->HSMHV2bNodePrime = here->HSMHV2sbNode = here->HSMHV2bNode; - } - - here->HSMHV2tempNode = here->HSMHV2tempNodeExt; - here->HSMHV2subNode = here->HSMHV2subNodeExt; - - if ( here->HSMHV2_cosubnode == 0 && here->HSMHV2subNode >= 0 ) { - if ( here->HSMHV2tempNode >= 0 ) { - /* FATAL Error when 6th node is defined and COSUBNODE=0 */ - IFuid namarr[2]; - namarr[0] = here->HSMHV2name; - namarr[1] = model->HSMHV2modName; - (*(SPfrontEnd->IFerror)) - ( - ERR_FATAL, - "HiSIM_HV: MOSFET(%s) MODEL(%s): 6th node is defined and COSUBNODE=0", - namarr - ); - return (E_BADPARM); - } else { - /* 5th node is switched to tempNode, if COSUBNODE=0 and 5 external nodes are assigned. */ - here->HSMHV2tempNode = here->HSMHV2subNode ; - here->HSMHV2subNode = -1 ; - } - } - - /* self heating*/ - if ( here->HSMHV2_coselfheat > 0 && here->HSMHV2tempNode <= 0 ){ - error = CKTmkVolt(ckt, &tmp, here->HSMHV2name,"temp"); - if(error) return(error); - here->HSMHV2tempNode = tmp->number; - } - if ( here->HSMHV2_coselfheat <= 0 ) here->HSMHV2tempNode = -1; - - /* flat handling of NQS */ - if ( model->HSMHV2_conqs ){ - error = CKTmkVolt(ckt, &tmp, here->HSMHV2name,"qi_nqs"); - if(error) return(error); - here->HSMHV2qiNode = tmp->number; - error = CKTmkVolt(ckt, &tmp, here->HSMHV2name,"qb_nqs"); - if(error) return(error); - here->HSMHV2qbNode = tmp->number; - } - - - /* set Sparse Matrix Pointers */ - - /* macro to make elements with built in test for out of memory */ -#define TSTALLOC(ptr,first,second) \ -do { if((here->ptr = SMPmakeElt(matrix,here->first,here->second))==NULL){\ - return(E_NOMEM);\ -} } while(0) - - TSTALLOC(HSMHV2DPbpPtr, HSMHV2dNodePrime, HSMHV2bNodePrime); - TSTALLOC(HSMHV2SPbpPtr, HSMHV2sNodePrime, HSMHV2bNodePrime); - TSTALLOC(HSMHV2GPbpPtr, HSMHV2gNodePrime, HSMHV2bNodePrime); - - TSTALLOC(HSMHV2BPdPtr, HSMHV2bNodePrime, HSMHV2dNode); - TSTALLOC(HSMHV2BPsPtr, HSMHV2bNodePrime, HSMHV2sNode); - TSTALLOC(HSMHV2BPdpPtr, HSMHV2bNodePrime, HSMHV2dNodePrime); - TSTALLOC(HSMHV2BPspPtr, HSMHV2bNodePrime, HSMHV2sNodePrime); - TSTALLOC(HSMHV2BPgpPtr, HSMHV2bNodePrime, HSMHV2gNodePrime); - TSTALLOC(HSMHV2BPbpPtr, HSMHV2bNodePrime, HSMHV2bNodePrime); - - TSTALLOC(HSMHV2DdPtr, HSMHV2dNode, HSMHV2dNode); - TSTALLOC(HSMHV2GPgpPtr, HSMHV2gNodePrime, HSMHV2gNodePrime); - TSTALLOC(HSMHV2SsPtr, HSMHV2sNode, HSMHV2sNode); - TSTALLOC(HSMHV2DPdpPtr, HSMHV2dNodePrime, HSMHV2dNodePrime); - TSTALLOC(HSMHV2SPspPtr, HSMHV2sNodePrime, HSMHV2sNodePrime); - TSTALLOC(HSMHV2DdpPtr, HSMHV2dNode, HSMHV2dNodePrime); - TSTALLOC(HSMHV2GPdpPtr, HSMHV2gNodePrime, HSMHV2dNodePrime); - TSTALLOC(HSMHV2GPspPtr, HSMHV2gNodePrime, HSMHV2sNodePrime); - TSTALLOC(HSMHV2SspPtr, HSMHV2sNode, HSMHV2sNodePrime); - TSTALLOC(HSMHV2DPspPtr, HSMHV2dNodePrime, HSMHV2sNodePrime); - TSTALLOC(HSMHV2DPdPtr, HSMHV2dNodePrime, HSMHV2dNode); - TSTALLOC(HSMHV2DPgpPtr, HSMHV2dNodePrime, HSMHV2gNodePrime); - TSTALLOC(HSMHV2SPgpPtr, HSMHV2sNodePrime, HSMHV2gNodePrime); - TSTALLOC(HSMHV2SPsPtr, HSMHV2sNodePrime, HSMHV2sNode); - TSTALLOC(HSMHV2SPdpPtr, HSMHV2sNodePrime, HSMHV2dNodePrime); - - TSTALLOC(HSMHV2GgPtr, HSMHV2gNode, HSMHV2gNode); - TSTALLOC(HSMHV2GgpPtr, HSMHV2gNode, HSMHV2gNodePrime); - TSTALLOC(HSMHV2GPgPtr, HSMHV2gNodePrime, HSMHV2gNode); - /* TSTALLOC(HSMHV2GdpPtr, HSMHV2gNode, HSMHV2dNodePrime); not used */ - /* TSTALLOC(HSMHV2GspPtr, HSMHV2gNode, HSMHV2sNodePrime); not used */ - /* TSTALLOC(HSMHV2GbpPtr, HSMHV2gNode, HSMHV2bNodePrime); not used */ - TSTALLOC(HSMHV2DdbPtr, HSMHV2dNode, HSMHV2dbNode); - TSTALLOC(HSMHV2SsbPtr, HSMHV2sNode, HSMHV2sbNode); - - TSTALLOC(HSMHV2DBdPtr, HSMHV2dbNode, HSMHV2dNode); - TSTALLOC(HSMHV2DBdbPtr, HSMHV2dbNode, HSMHV2dbNode); - TSTALLOC(HSMHV2DBbpPtr, HSMHV2dbNode, HSMHV2bNodePrime); - /* TSTALLOC(HSMHV2DBbPtr, HSMHV2dbNode, HSMHV2bNode); not used */ - - TSTALLOC(HSMHV2BPdbPtr, HSMHV2bNodePrime, HSMHV2dbNode); - TSTALLOC(HSMHV2BPbPtr, HSMHV2bNodePrime, HSMHV2bNode); - TSTALLOC(HSMHV2BPsbPtr, HSMHV2bNodePrime, HSMHV2sbNode); - - TSTALLOC(HSMHV2SBsPtr, HSMHV2sbNode, HSMHV2sNode); - TSTALLOC(HSMHV2SBbpPtr, HSMHV2sbNode, HSMHV2bNodePrime); - /* TSTALLOC(HSMHV2SBbPtr, HSMHV2sbNode, HSMHV2bNode); not used */ - TSTALLOC(HSMHV2SBsbPtr, HSMHV2sbNode, HSMHV2sbNode); - - /* TSTALLOC(HSMHV2BdbPtr, HSMHV2bNode, HSMHV2dbNode); not used */ - TSTALLOC(HSMHV2BbpPtr, HSMHV2bNode, HSMHV2bNodePrime); - /* TSTALLOC(HSMHV2BsbPtr, HSMHV2bNode, HSMHV2sbNode); not used */ - TSTALLOC(HSMHV2BbPtr, HSMHV2bNode, HSMHV2bNode); - - TSTALLOC(HSMHV2DgpPtr, HSMHV2dNode, HSMHV2gNodePrime); - TSTALLOC(HSMHV2DsPtr, HSMHV2dNode, HSMHV2sNode); - TSTALLOC(HSMHV2DbpPtr, HSMHV2dNode, HSMHV2bNodePrime); - TSTALLOC(HSMHV2DspPtr, HSMHV2dNode, HSMHV2sNodePrime); - TSTALLOC(HSMHV2DPsPtr, HSMHV2dNodePrime, HSMHV2sNode); - - TSTALLOC(HSMHV2SgpPtr, HSMHV2sNode, HSMHV2gNodePrime); - TSTALLOC(HSMHV2SdPtr, HSMHV2sNode, HSMHV2dNode); - TSTALLOC(HSMHV2SbpPtr, HSMHV2sNode, HSMHV2bNodePrime); - TSTALLOC(HSMHV2SdpPtr, HSMHV2sNode, HSMHV2dNodePrime); - TSTALLOC(HSMHV2SPdPtr, HSMHV2sNodePrime, HSMHV2dNode); - - TSTALLOC(HSMHV2GPdPtr, HSMHV2gNodePrime, HSMHV2dNode); - TSTALLOC(HSMHV2GPsPtr, HSMHV2gNodePrime, HSMHV2sNode); - - if ( here->HSMHV2subNode > 0 ) { /* 5th substrate node */ - TSTALLOC(HSMHV2DsubPtr, HSMHV2dNode, HSMHV2subNode); - TSTALLOC(HSMHV2DPsubPtr, HSMHV2dNodePrime, HSMHV2subNode); - TSTALLOC(HSMHV2SsubPtr, HSMHV2sNode, HSMHV2subNode); - TSTALLOC(HSMHV2SPsubPtr, HSMHV2sNodePrime, HSMHV2subNode); - } - if ( here->HSMHV2tempNode > 0 ) { /* self heating */ - TSTALLOC(HSMHV2TemptempPtr, HSMHV2tempNode, HSMHV2tempNode); - TSTALLOC(HSMHV2TempdPtr, HSMHV2tempNode, HSMHV2dNode); - TSTALLOC(HSMHV2TempdpPtr, HSMHV2tempNode, HSMHV2dNodePrime); - TSTALLOC(HSMHV2TempsPtr, HSMHV2tempNode, HSMHV2sNode); - TSTALLOC(HSMHV2TempspPtr, HSMHV2tempNode, HSMHV2sNodePrime); - TSTALLOC(HSMHV2DPtempPtr, HSMHV2dNodePrime, HSMHV2tempNode); - TSTALLOC(HSMHV2SPtempPtr, HSMHV2sNodePrime, HSMHV2tempNode); - - TSTALLOC(HSMHV2TempgpPtr, HSMHV2tempNode, HSMHV2gNodePrime); - TSTALLOC(HSMHV2TempbpPtr, HSMHV2tempNode, HSMHV2bNodePrime); - - TSTALLOC(HSMHV2GPtempPtr, HSMHV2gNodePrime, HSMHV2tempNode); - TSTALLOC(HSMHV2BPtempPtr, HSMHV2bNodePrime, HSMHV2tempNode); - - TSTALLOC(HSMHV2DBtempPtr, HSMHV2dbNode, HSMHV2tempNode); - TSTALLOC(HSMHV2SBtempPtr, HSMHV2sbNode, HSMHV2tempNode); - TSTALLOC(HSMHV2DtempPtr, HSMHV2dNode, HSMHV2tempNode); - TSTALLOC(HSMHV2StempPtr, HSMHV2sNode, HSMHV2tempNode); - } - if ( model->HSMHV2_conqs ) { /* flat handling of NQS */ - TSTALLOC(HSMHV2DPqiPtr, HSMHV2dNodePrime, HSMHV2qiNode); - TSTALLOC(HSMHV2GPqiPtr, HSMHV2gNodePrime, HSMHV2qiNode); - TSTALLOC(HSMHV2GPqbPtr, HSMHV2gNodePrime, HSMHV2qbNode); - TSTALLOC(HSMHV2SPqiPtr, HSMHV2sNodePrime, HSMHV2qiNode); - TSTALLOC(HSMHV2BPqbPtr, HSMHV2bNodePrime, HSMHV2qbNode); - TSTALLOC(HSMHV2QIdpPtr, HSMHV2qiNode, HSMHV2dNodePrime); - TSTALLOC(HSMHV2QIgpPtr, HSMHV2qiNode, HSMHV2gNodePrime); - TSTALLOC(HSMHV2QIspPtr, HSMHV2qiNode, HSMHV2sNodePrime); - TSTALLOC(HSMHV2QIbpPtr, HSMHV2qiNode, HSMHV2bNodePrime); - TSTALLOC(HSMHV2QIqiPtr, HSMHV2qiNode, HSMHV2qiNode); - TSTALLOC(HSMHV2QBdpPtr, HSMHV2qbNode, HSMHV2dNodePrime); - TSTALLOC(HSMHV2QBgpPtr, HSMHV2qbNode, HSMHV2gNodePrime); - TSTALLOC(HSMHV2QBspPtr, HSMHV2qbNode, HSMHV2sNodePrime); - TSTALLOC(HSMHV2QBbpPtr, HSMHV2qbNode, HSMHV2bNodePrime); - TSTALLOC(HSMHV2QBqbPtr, HSMHV2qbNode, HSMHV2qbNode); - if ( here->HSMHV2tempNode > 0 ) { /* self heating */ - TSTALLOC(HSMHV2QItempPtr, HSMHV2qiNode, HSMHV2tempNode); - TSTALLOC(HSMHV2QBtempPtr, HSMHV2qbNode, HSMHV2tempNode); - } - } - - /*-----------------------------------------------------------* - * Range check of instance parameters - *-----------------*/ - RANGECHECK(here->HSMHV2_l, model->HSMHV2_lmin, model->HSMHV2_lmax, "L") ; - RANGECHECK(here->HSMHV2_w/here->HSMHV2_nf, model->HSMHV2_wmin, model->HSMHV2_wmax, "W/NF") ; - - /* binning calculation */ - pParam = &here->pParam ; - Lgate = here->HSMHV2_l + model->HSMHV2_xl ; - Wgate = here->HSMHV2_w / here->HSMHV2_nf + model->HSMHV2_xw ; - LG = Lgate * C_m2um ; - WG = Wgate * C_m2um ; - Lbin = pow(LG, model->HSMHV2_lbinn) ; - Wbin = pow(WG, model->HSMHV2_wbinn) ; - LWbin = Lbin * Wbin ; - - BINNING(vmax); - BINNING(js0d); - BINNING(js0swd); - BINNING(njd); - BINNING(cisbkd); - BINNING(vdiffjd); - BINNING(js0s); - BINNING(js0sws); - BINNING(njs); - BINNING(cisbks); - BINNING(vdiffjs); - BINNING(bgtmp1); - BINNING(bgtmp2); - BINNING(eg0); - BINNING(vfbover); - BINNING(nover); - BINNING(novers); - BINNING(wl2); - BINNING(vfbc); - BINNING(nsubc); - BINNING(nsubp); - BINNING(scp1); - BINNING(scp2); - BINNING(scp3); - BINNING(sc1); - BINNING(sc2); - BINNING(sc3); - BINNING(pgd1); - BINNING(ndep); - BINNING(ninv); - BINNING(muecb0); - BINNING(muecb1); - BINNING(mueph1); - BINNING(vtmp); - BINNING(wvth0); - BINNING(muesr1); - BINNING(muetmp); - BINNING(sub1); - BINNING(sub2); - BINNING(svds); - BINNING(svbs); - BINNING(svgs); - BINNING(fn1); - BINNING(fn2); - BINNING(fn3); - BINNING(fvbs); - BINNING(nsti); - BINNING(wsti); - BINNING(scsti1); - BINNING(scsti2); - BINNING(vthsti); - BINNING(muesti1); - BINNING(muesti2); - BINNING(muesti3); - BINNING(nsubpsti1); - BINNING(nsubpsti2); - BINNING(nsubpsti3); - BINNING(cgso); - BINNING(cgdo); - BINNING(clm1); - BINNING(clm2); - BINNING(clm3); - BINNING(wfc); - BINNING(gidl1); - BINNING(gidl2); - BINNING(gleak1); - BINNING(gleak2); - BINNING(gleak3); - BINNING(gleak6); - BINNING(glksd1); - BINNING(glksd2); - BINNING(glkb1); - BINNING(glkb2); - BINNING(nftrp); - BINNING(nfalp); - BINNING(ibpc1); - BINNING(ibpc2); - BINNING(cgbo); - BINNING(cvdsover); - BINNING(falph); - BINNING(npext); - BINNING(powrat); - BINNING(rd); - BINNING(rd22); - BINNING(rd23); - BINNING(rd24); - BINNING(rdict1); - BINNING(rdov13); - BINNING(rdslp1); - BINNING(rdvb); - BINNING(rdvd); - BINNING(rdvg11); - BINNING(rs); - BINNING(rth0); - BINNING(vover); - - /*-----------------------------------------------------------* - * Range check of model parameters - *-----------------*/ - RANGECHECK(pParam->HSMHV2_vmax, 1.0e6, 20.0e6, "VMAX") ; - RANGECHECK(pParam->HSMHV2_bgtmp1, 50.0e-6, 1.0e-3, "BGTMP1") ; - RANGECHECK(pParam->HSMHV2_bgtmp2, -1.0e-6, 1.0e-6, "BGTMP2") ; - RANGECHECK(pParam->HSMHV2_eg0, 1.0, 1.3, "EG0") ; - RANGECHECK(pParam->HSMHV2_vfbover, -1.2, 1.0, "VFBOVER") ; - if( model->HSMHV2_codep == 0 ) { - RANGECHECK(pParam->HSMHV2_vfbc, -1.2, 0.0, "VFBC") ; - } else { - RANGECHECK(pParam->HSMHV2_vfbc, -1.2, 0.8, "VFBC") ; - } - RANGECHECK(pParam->HSMHV2_nsubc, 1.0e16, 1.0e19, "NSUBC") ; - RANGECHECK(pParam->HSMHV2_nsubp, 1.0e16, 1.0e19, "NSUBP") ; - RANGECHECK(pParam->HSMHV2_scp1, 0.0, 10.0, "SCP1") ; - RANGECHECK(pParam->HSMHV2_scp2, 0.0, 1.0, "SCP2") ; - RANGECHECK(pParam->HSMHV2_scp3, 0.0, 200e-9, "SCP3") ; - RANGECHECK(pParam->HSMHV2_sc1, 0.0, 10.0, "SC1") ; - RANGECHECK(pParam->HSMHV2_sc2, 0.0, 1.0, "SC2") ; - RANGECHECK(pParam->HSMHV2_sc3, 0.0, 20e-6, "SC3") ; - RANGECHECK(pParam->HSMHV2_pgd1, 0.0, 30.0e-3, "PGD1") ; - RANGECHECK(pParam->HSMHV2_ndep, 0.0, 1.0, "NDEP") ; - RANGECHECK(pParam->HSMHV2_ninv, 0.0, 1.0, "NINV") ; - RANGECHECK(pParam->HSMHV2_muecb0, 100.0, 100.0e3, "MUECB0") ; - RANGECHECK(pParam->HSMHV2_muecb1, 5.0, 10.0e3, "MUECB1") ; - RANGECHECK(pParam->HSMHV2_mueph1, 2.0e3, 30.0e3, "MUEPH1") ; - RANGECHECK(pParam->HSMHV2_vtmp, -2.0, 1.0, "VTMP") ; - RANGECHECK(pParam->HSMHV2_muesr1, 1.0e14, 1.0e16, "MUESR1") ; - RANGECHECK(pParam->HSMHV2_muetmp, 0.5, 2.5, "MUETMP") ; - RANGECHECK(pParam->HSMHV2_clm1, 0.01, 1.0, "CLM1") ; - RANGECHECK(pParam->HSMHV2_clm2, 1.0, 4.0, "CLM2") ; - RANGECHECK(pParam->HSMHV2_clm3, 0.5, 5.0, "CLM3") ; - RANGECHECK(pParam->HSMHV2_wfc, -5.0e-15, 1.0e-6, "WFC") ; - RANGECHECK(pParam->HSMHV2_cgso, 0.0, 100e-9 * C_VAC*model->HSMHV2_kappa/model->HSMHV2_tox, "CGSO") ; - RANGECHECK(pParam->HSMHV2_cgdo, 0.0, 100e-9 * C_VAC*model->HSMHV2_kappa/model->HSMHV2_tox, "CGDO") ; - RANGECHECK(pParam->HSMHV2_ibpc1, 0.0, 1.0e12, "IBPC1") ; - RANGECHECK(pParam->HSMHV2_ibpc2, 0.0, 1.0e12, "IBPC2") ; - RANGECHECK(pParam->HSMHV2_cvdsover, 0.0, 1.0, "CVDSOVER") ; - RANGECHECK(pParam->HSMHV2_nsti, 1.0e16, 1.0e19, "NSTI") ; - MINCHECK( pParam->HSMHV2_cgbo, 0.0, "CGBO") ; - RANGECHECK(pParam->HSMHV2_npext, 1.0e16, 1.0e18, "NPEXT") ; - RANGECHECK(pParam->HSMHV2_rd, 0.0, 100.0e-3, "RD") ; - RANGECHECK(pParam->HSMHV2_rd22, -5.0, 0.0, "RD22") ; - RANGECHECK(pParam->HSMHV2_rd23, 0.0, 2.0, "RD23") ; - RANGECHECK(pParam->HSMHV2_rd24, 0.0, 0.1, "RD24") ; - RANGECHECK(pParam->HSMHV2_rdict1, -10.0, 10.0, "RDICT1") ; - RANGECHECK(pParam->HSMHV2_rdov13, 0.0, 1.0, "RDOV13") ; - RANGECHECK(pParam->HSMHV2_rdslp1, -10.0, 10.0, "RDSLP1") ; - RANGECHECK(pParam->HSMHV2_rdvb, 0.0, 2.0, "RDVB") ; - RANGECHECK(pParam->HSMHV2_rdvd, 0.0, 2.0, "RDVD") ; - MINCHECK( pParam->HSMHV2_rdvg11, 0.0, "RDVG11") ; - RANGECHECK(pParam->HSMHV2_rs, 0.0, 10.0e-3, "RS") ; - RANGECHECK(pParam->HSMHV2_rth0, 0.0, 10.0, "RTH0") ; - RANGECHECK(pParam->HSMHV2_vover, 0.0, 4.0, "VOVER") ; - - if ( model->HSMHV2_xpdv * model->HSMHV2_xldld > 1 ) { - here->HSMHV2_xpdv = 1/model->HSMHV2_xldld ; - }else { here->HSMHV2_xpdv = model->HSMHV2_xpdv; } - - here->HSMHV2_cordrift = model->HSMHV2_cordrift ; - if ( model->HSMHV2_cordrift && pParam->HSMHV2_nover == 0.0 ) { - fprintf(stderr,"warning(HiSIM_HV(%s)): CORDRIFT has been inactivated when NOVER = 0.0.\n",model->HSMHV2modName); - here->HSMHV2_cordrift = 0 ; - } - - /*-----------------------------------------------------------* - * Change unit into MKS for instance parameters. - *-----------------*/ - - hereMKS->HSMHV2_nsubcdfm = here->HSMHV2_nsubcdfm / C_cm2m_p3 ; - hereMKS->HSMHV2_subld2 = here->HSMHV2_subld2 * C_m2cm ; - - pParam->HSMHV2_nsubc = pParam->HSMHV2_nsubc / C_cm2m_p3 ; - pParam->HSMHV2_nsubp = pParam->HSMHV2_nsubp / C_cm2m_p3 ; - pParam->HSMHV2_nsti = pParam->HSMHV2_nsti / C_cm2m_p3 ; - pParam->HSMHV2_nover = pParam->HSMHV2_nover / C_cm2m_p3 ; - pParam->HSMHV2_novers = pParam->HSMHV2_novers / C_cm2m_p3 ; - pParam->HSMHV2_nsubpsti1 = pParam->HSMHV2_nsubpsti1 / C_m2cm ; - pParam->HSMHV2_muesti1 = pParam->HSMHV2_muesti1 / C_m2cm ; - pParam->HSMHV2_ndep = pParam->HSMHV2_ndep / C_m2cm ; - pParam->HSMHV2_ninv = pParam->HSMHV2_ninv / C_m2cm ; - - pParam->HSMHV2_vmax = pParam->HSMHV2_vmax / C_m2cm ; - pParam->HSMHV2_wfc = pParam->HSMHV2_wfc * C_m2cm_p2 ; - pParam->HSMHV2_glksd1 = pParam->HSMHV2_glksd1 / C_m2cm ; - pParam->HSMHV2_glksd2 = pParam->HSMHV2_glksd2 * C_m2cm ; - pParam->HSMHV2_gleak2 = pParam->HSMHV2_gleak2 * C_m2cm ; - pParam->HSMHV2_glkb2 = pParam->HSMHV2_glkb2 * C_m2cm ; - pParam->HSMHV2_fn2 = pParam->HSMHV2_fn2 * C_m2cm ; - pParam->HSMHV2_gidl1 = pParam->HSMHV2_gidl1 / C_m2cm_p1o2 ; - pParam->HSMHV2_gidl2 = pParam->HSMHV2_gidl2 * C_m2cm ; - pParam->HSMHV2_nfalp = pParam->HSMHV2_nfalp / C_m2cm ; - pParam->HSMHV2_nftrp = pParam->HSMHV2_nftrp * C_m2cm_p2 ; - - pParam->HSMHV2_npext = pParam->HSMHV2_npext / C_cm2m_p3 ; - pParam->HSMHV2_rd22 = pParam->HSMHV2_rd22 / C_m2cm ; - pParam->HSMHV2_rd23 = pParam->HSMHV2_rd23 / C_m2cm ; - pParam->HSMHV2_rd24 = pParam->HSMHV2_rd24 / C_m2cm ; - pParam->HSMHV2_rdvd = pParam->HSMHV2_rdvd / C_m2cm ; - pParam->HSMHV2_rth0 = pParam->HSMHV2_rth0 / C_m2cm ; - - pParam->HSMHV2_vfbover = -pParam->HSMHV2_vfbover ; /* for Backword Compitibility */ - - } /* instance */ - - - - /*-----------------------------------------------------------* - * Range check of model parameters - *-----------------*/ - RANGECHECK(model->HSMHV2_shemax , 300, 600, "SHEMAX"); - RANGECHECK(model->HSMHV2_cvbd , -0.1, 0.2, "CVBD"); - RANGECHECK(model->HSMHV2_cvbs , -0.1, 0.2, "CVBS"); - if ( model->HSMHV2_tox <= 0 && model->HSMHV2_coerrrep ) { - printf("warning(HiSIM_HV(%s)): TOX = %e\n ", model->HSMHV2modName,model->HSMHV2_tox); - printf("warning(HiSIM_HV(%s)): The model parameter TOX must be positive.\n",model->HSMHV2modName); - } - RANGECHECK(model->HSMHV2_xld, 0.0, 50.0e-9, "XLD") ; - RANGECHECK(model->HSMHV2_xwd, -100.0e-9, 300.0e-9, "XWD") ; - RANGECHECK(model->HSMHV2_xwdc, -10.0e-9, 100.0e-9, "XWDC") ; - RANGECHECK(model->HSMHV2_rsh, 0.0, 500.0, "RSH") ; - RANGECHECK(model->HSMHV2_rshg, 0.0, 100.0, "RSHG") ; - if(model->HSMHV2_xqy != 0.0) RANGECHECK(model->HSMHV2_xqy, 10.0e-9, 50.0e-9, "XQY") ; - MINCHECK (model->HSMHV2_xqy1, 0.0, "XQY1") ; - MINCHECK (model->HSMHV2_xqy2, 0.0, "XQY2") ; - RANGECHECK(model->HSMHV2_vbi, 1.0, 1.2, "VBI") ; - RANGECHECK(model->HSMHV2_parl2, 0.0, 50.0e-9, "PARL2") ; - RANGECHECK(model->HSMHV2_lp, 0.0, 300.0e-9, "LP") ; - RANGECHECK(model->HSMHV2_pgd2, 0.0, 1.5, "PGD2") ; - RANGECHECK(model->HSMHV2_pgd4, 0.0, 3.0, "PGD4") ; - RANGECHECK(model->HSMHV2_mueph0, 0.25, 0.35, "MUEPH0") ; - RANGECHECK(model->HSMHV2_muesr0, 1.8, 2.2, "MUESR0") ; - RANGECHECK(model->HSMHV2_lpext, 1.0e-50, 10.0e-6, "LPEXT") ; - MINCHECK (model->HSMHV2_sc4, 0.0, "SC4") ; - RANGECHECK(model->HSMHV2_scp21, 0.0, 5.0, "SCP21") ; - RANGERESET(model->HSMHV2_scp22, 0.0, 0.0, "SCP22") ; - RANGECHECK(model->HSMHV2_bs1, 0.0, 50.0e-3, "BS1") ; - RANGECHECK(model->HSMHV2_bs2, 0.5, 1.0, "BS2") ; - MINCHECK (model->HSMHV2_ptl, 0.0, "PTL") ; - RANGECHECK(model->HSMHV2_ptp, 3.0, 4.0, "PTP") ; - MINCHECK (model->HSMHV2_pt2, 0.0, "PT2") ; - MINCHECK (model->HSMHV2_pt4, 0.0, "PT4") ; - MINCHECK (model->HSMHV2_pt4p, 0.0, "PT4P") ; - RANGECHECK(model->HSMHV2_gdl, 0.0, 220e-9, "GDL") ; - MINCHECK (model->HSMHV2_ninvd, 0.0, "NINVD") ; - MINCHECK (model->HSMHV2_ninvdw, 0.0, "NINVDW") ; - MINCHECK (model->HSMHV2_ninvdwp, 0.0, "NINVDWP") ; - MINCHECK (model->HSMHV2_ninvdt1, 0.0, "NINVDT1") ; - MINCHECK (model->HSMHV2_ninvdt2, 0.0, "NINVDT2") ; - RANGECHECK(model->HSMHV2_clm5, 0.0, 2.0, "CLM5") ; - RANGECHECK(model->HSMHV2_clm6, 0.0, 20.0, "CLM6") ; - RANGECHECK(model->HSMHV2_sub2l, 0.0, 1.0, "SUB2L") ; - RANGECHECK(model->HSMHV2_voverp, 0.0, 2.0, "VOVERP") ; - RANGECHECK(model->HSMHV2_qme1, 0.0, 1e-9, "QME1") ; - RANGECHECK(model->HSMHV2_qme2, 1.0, 3.0, "QME2") ; - RANGECHECK(model->HSMHV2_qme3, 0.0, 500e-12, "QME3") ; - RANGECHECK(model->HSMHV2_glpart1, 0.0, 1.0, "GLPART1") ; - RANGECHECK(model->HSMHV2_tnom, 22.0, 32.0, "TNOM") ; - RANGECHECK(model->HSMHV2_ddltmax, 1.0, 10.0, "DDLTMAX") ; - RANGECHECK(model->HSMHV2_ddltict, -3.0, 20.0, "DDLTICT") ; - RANGECHECK(model->HSMHV2_ddltslp, 0.0, 20.0, "DDLTSLP") ; - RANGECHECK(model->HSMHV2_mphdfm, -3.0, 3.0, "MPHDFM") ; - RANGECHECK(model->HSMHV2_cvb, -0.1, 0.2, "CVB") ; - RANGECHECK(model->HSMHV2_rd20, 0.0, 30.0, "RD20") ; - RANGECHECK(model->HSMHV2_rd21, 0.0, 1.0, "RD21") ; - RANGECHECK(model->HSMHV2_rd22d, 0.0, 2.0, "RD22D") ; - MINCHECK( model->HSMHV2_rd25, 0.0, "RD25") ; - RANGECHECK(model->HSMHV2_rdtemp1, -1e-3, 2e-2, "RDTEMP1") ; - RANGECHECK(model->HSMHV2_rdtemp2, -1e-5, 1e-5, "RDTEMP2") ; - RANGECHECK(model->HSMHV2_rdvdtemp1,-1e-3, 1e-2, "RDVDTEMP1") ; - RANGECHECK(model->HSMHV2_rdvdtemp2,-1e-5, 1e-5, "RDVDTEMP2") ; - MINCHECK( model->HSMHV2_rdvg12, 0.0, "RDVG12") ; - RANGECHECK(model->HSMHV2_rthtemp1, -1.0, 1.0, "RTHTEMP1") ; - RANGECHECK(model->HSMHV2_rthtemp2, -1.0, 1.0, "RTHTEMP2") ; - RANGECHECK(model->HSMHV2_rth0w, -100, 100, "RTH0W") ; - RANGECHECK(model->HSMHV2_rth0wp, -10, 10, "RTH0WP") ; - RANGECHECK(model->HSMHV2_rth0nf, -5.0, 5.0, "RTH0NF") ; - RANGECHECK(model->HSMHV2_powrat, 0.0, 1.0, "POWRAT") ; - RANGECHECK(model->HSMHV2_prattemp1, -1.0, 1.0, "PRATTEMP1") ; - RANGECHECK(model->HSMHV2_prattemp2, -1.0, 1.0, "PRATTEMP2") ; - MINRESET ( model->HSMHV2_xldld, 0.0, "XLDLD") ; - MINCHECK( model->HSMHV2_loverld, 0.0, "LOVERLD") ; - MINCHECK( model->HSMHV2_lovers, 0.0, "LOVERS") ; - MINCHECK( model->HSMHV2_lover, 0.0, "LOVER") ; - MINCHECK( model->HSMHV2_ldrift1, 0.0, "LDRIFT1") ; - MINCHECK( model->HSMHV2_ldrift1s, 0.0, "LDRIFT1S") ; - MINCHECK( model->HSMHV2_ldrift2, 0.0, "LDRIFT2") ; - MINCHECK( model->HSMHV2_ldrift2s, 0.0, "LDRIFT2S") ; -// MINCHECK( model->HSMHV2_ldrift, 0.0, "LDRIFT") ; - RANGECHECK(model->HSMHV2_rds, -100, 100, "RDS") ; - RANGECHECK(model->HSMHV2_rdsp, -10, 10, "RDSP") ; - RANGECHECK(model->HSMHV2_rdvdl, -100, 100, "RDVDL") ; - RANGECHECK(model->HSMHV2_rdvdlp, -10, 10, "RDVDLP") ; - RANGECHECK(model->HSMHV2_rdvds, -100, 100, "RDVDS") ; - RANGECHECK(model->HSMHV2_rdvdsp, -10, 10, "RDVDSP") ; - RANGECHECK(model->HSMHV2_rd23l, -100, 100, "RD23L") ; - RANGECHECK(model->HSMHV2_rd23lp, -10, 10, "RD23LP") ; - RANGECHECK(model->HSMHV2_rd23s, -100, 100, "RD23S") ; - RANGECHECK(model->HSMHV2_rd23sp, -10, 10, "RD23SP") ; - RANGECHECK(model->HSMHV2_rdov11, 0.0, 10, "RDOV11") ; - RANGECHECK(model->HSMHV2_rdov12, 0.0, 2.0, "RDOV12") ; - RANGECHECK(model->HSMHV2_rdslp2, -10.0, 10.0, "RDSLP2") ; - RANGECHECK(model->HSMHV2_rdict2, -10.0, 10.0, "RDICT2") ; - RANGECHECK(model->HSMHV2_rdrvmax, 1e6, 100e6, "RDRVMAX" ) ; - RANGECHECK(model->HSMHV2_rdrmue, 1e2, 3e3, "RDRMUE" ) ; - RANGECHECK(model->HSMHV2_rdrqover, 0.0, 1e7, "RDRDQOVER" ) ; - RANGERESET(model->HSMHV2_rdrcx, 0.0, 1.0, "RDRCX" ) ; - RANGECHECK(model->HSMHV2_rdrcar, 0.0, 50e-9, "RDRCAR" ) ; - RANGECHECK(model->HSMHV2_rdrmuetmp, 0.0, 2.0, "RDRMUETMP" ) ; - RANGECHECK(model->HSMHV2_rdrvtmp, -2.0, 1.0, "RDRVTMP" ) ; - MINCHECK( model->HSMHV2_xpdv, 0.0, "XPDV" ) ; - MINCHECK( model->HSMHV2_xpvdth, 0.0, "XPVDTH" ) ; - RANGECHECK(model->HSMHV2_xpvdthg, -1.0, 1.0, "XPVDTHG" ) ; - MINCHECK( model->HSMHV2_ibpc1l, 0.0, "IBPC1L" ) ; - RANGERESET(model->HSMHV2_ndepm, 5e15, 2e17, "NDEPM" ) ; - RANGERESET(model->HSMHV2_tndep, 1e-7, 1e-6, "TNDEP" ) ; - RANGERESET(model->HSMHV2_depmue0, 1, 1e5, "DEPMUE0" ) ; - RANGECHECK(model->HSMHV2_depmueback0, 1, 1e5, "DEPMUEBACK0" ) ; - RANGECHECK(model->HSMHV2_depvdsef2, 0.1, 4.0, "DEPVDSEF2" ) ; - RANGECHECK(model->HSMHV2_depmueph1, 1, 1e5, "DEPMUEPH1" ) ; - RANGECHECK(model->HSMHV2_depleak, 0.0, 5.0, "DEPLEAK" ) ; - - if( model->HSMHV2_codep == 1 && model->HSMHV2_coerrrep ) { - if( model->HSMHV2_copprv == 1 ) { - printf("warning(HiSIM_HV(%s)): COPPRV is not supported yet in Depletion mode mode, reset to 0.\n",model->HSMHV2modName); - } - if( model->HSMHV2_coisti == 1 ) { - printf("warning(HiSIM_HV(%s)): STI leak model is not supported yet in Depletion mode model, skipped\n",model->HSMHV2modName); - } - if( model->HSMHV2_cothrml == 1 ) { - printf("warning(HiSIM_HV(%s)): Thermal noise model is not supported yet in Depletion mode model, skipped\n",model->HSMHV2modName); - } - if( model->HSMHV2_coign == 1 ) { - printf("warning(HiSIM_HV(%s)): Induced gate noise model is not supported yet in Depletion mode model, skipped\n",model->HSMHV2modName); - } - } - if( model->HSMHV2_codep && model->HSMHV2_copprv == 1 ) { model->HSMHV2_copprv = 0 ; } - - if ( model->HSMHV2_xpdv * model->HSMHV2_xldld > 1 && model->HSMHV2_coerrrep ) { - printf("warning(HiSIM_HV(%s)): The model parameter XPDV (= %e) must be smaller than 1/XLDLD (= %e).\n", - model->HSMHV2modName,model->HSMHV2_xpdv, 1/model->HSMHV2_xldld ); - printf("warning(HiSIM_HV(%s)): The model parameter XPDV (= %e) has been changed to %e.\n", - model->HSMHV2modName,model->HSMHV2_xpdv, 1/model->HSMHV2_xldld ); - } - - - /*-----------------------------------------------------------* - * Change units into MKS. - *-----------------*/ - - modelMKS->HSMHV2_vmax = model->HSMHV2_vmax / C_m2cm ; - modelMKS->HSMHV2_ll = model->HSMHV2_ll / pow( C_m2cm , model->HSMHV2_lln ) ; - modelMKS->HSMHV2_wl = model->HSMHV2_wl / pow( C_m2cm , model->HSMHV2_wln ) ; - modelMKS->HSMHV2_svgsl = model->HSMHV2_svgsl / pow( C_m2cm , model->HSMHV2_svgslp ) ; - modelMKS->HSMHV2_svgsw = model->HSMHV2_svgsw / pow( C_m2cm , model->HSMHV2_svgswp ) ; - modelMKS->HSMHV2_svbsl = model->HSMHV2_svbsl / pow( C_m2cm , model->HSMHV2_svbslp ) ; - modelMKS->HSMHV2_slgl = model->HSMHV2_slgl / pow( C_m2cm , model->HSMHV2_slglp ) ; - modelMKS->HSMHV2_sub1l = model->HSMHV2_sub1l / pow( C_m2cm , model->HSMHV2_sub1lp ) ; - modelMKS->HSMHV2_slg = model->HSMHV2_slg / C_m2cm ; - modelMKS->HSMHV2_sub2l = model->HSMHV2_sub2l / C_m2cm ; - modelMKS->HSMHV2_subld2 = model->HSMHV2_subld2 * C_m2cm ; - modelMKS->HSMHV2_rdtemp1 = model->HSMHV2_rdtemp1 / C_m2cm ; - modelMKS->HSMHV2_rdtemp2 = model->HSMHV2_rdtemp2 / C_m2cm ; - modelMKS->HSMHV2_rdvdtemp1 = model->HSMHV2_rdvdtemp1 / C_m2cm ; - modelMKS->HSMHV2_rdvdtemp2 = model->HSMHV2_rdvdtemp2 / C_m2cm ; - modelMKS->HSMHV2_nsubsub = model->HSMHV2_nsubsub / C_cm2m_p3 ; - modelMKS->HSMHV2_nsubpsti1 = model->HSMHV2_nsubpsti1 / C_m2cm ; - modelMKS->HSMHV2_muesti1 = model->HSMHV2_muesti1 / C_m2cm ; - modelMKS->HSMHV2_wfc = model->HSMHV2_wfc * C_m2cm_p2 ; - modelMKS->HSMHV2_glksd1 = model->HSMHV2_glksd1 / C_m2cm ; - modelMKS->HSMHV2_glksd2 = model->HSMHV2_glksd2 * C_m2cm ; - modelMKS->HSMHV2_glksd3 = model->HSMHV2_glksd3 * C_m2cm ; - modelMKS->HSMHV2_gleak2 = model->HSMHV2_gleak2 * C_m2cm ; - modelMKS->HSMHV2_gleak4 = model->HSMHV2_gleak4 * C_m2cm ; - modelMKS->HSMHV2_gleak5 = model->HSMHV2_gleak5 * C_m2cm ; - modelMKS->HSMHV2_gleak7 = model->HSMHV2_gleak7 / C_m2cm_p2 ; - modelMKS->HSMHV2_glkb2 = model->HSMHV2_glkb2 * C_m2cm ; - modelMKS->HSMHV2_fn2 = model->HSMHV2_fn2 * C_m2cm ; - modelMKS->HSMHV2_gidl1 = model->HSMHV2_gidl1 / C_m2cm_p1o2 ; - modelMKS->HSMHV2_gidl2 = model->HSMHV2_gidl2 * C_m2cm ; - modelMKS->HSMHV2_nfalp = model->HSMHV2_nfalp / C_m2cm ; - modelMKS->HSMHV2_nftrp = model->HSMHV2_nftrp * C_m2cm_p2 ; - modelMKS->HSMHV2_cit = model->HSMHV2_cit * C_m2cm_p2 ; - modelMKS->HSMHV2_ovslp = model->HSMHV2_ovslp / C_m2cm ; - modelMKS->HSMHV2_dly3 = model->HSMHV2_dly3 / C_m2cm_p2 ; - modelMKS->HSMHV2_cth0 = model->HSMHV2_cth0 * C_m2cm ; - modelMKS->HSMHV2_rdrmue = model->HSMHV2_rdrmue / C_m2cm_p2 ; - modelMKS->HSMHV2_rdrvmax = model->HSMHV2_rdrvmax / C_m2cm ; - modelMKS->HSMHV2_ndepm = model->HSMHV2_ndepm / C_cm2m_p3 ; - modelMKS->HSMHV2_depvmax = model->HSMHV2_depvmax / C_m2cm ; - - - /*-----------------------------------------------------------* - * Change unit into Kelvin. - *-----------------*/ - model->HSMHV2_ktnom = model->HSMHV2_tnom + 273.15 ; /* [C] -> [K] */ - - - } /* model */ - - - return(OK); -} - -int -HSMHV2unsetup( - GENmodel *inModel, - CKTcircuit *ckt) -{ -#ifndef HAS_BATCHSIM - HSMHV2model *model; - HSMHV2instance *here; - - for (model = (HSMHV2model *)inModel; model != NULL; - model = HSMHV2nextModel(model)) - { - for (here = HSMHV2instances(model); here != NULL; - here=HSMHV2nextInstance(here)) - { - if (here->HSMHV2tempNode > 0 && - here->HSMHV2tempNode != here->HSMHV2tempNodeExt && - here->HSMHV2tempNode != here->HSMHV2subNodeExt) - CKTdltNNum(ckt, here->HSMHV2tempNode); - here->HSMHV2tempNode = 0; - - here->HSMHV2subNode = 0; - - if (here->HSMHV2qbNode > 0) - CKTdltNNum(ckt, here->HSMHV2qbNode); - here->HSMHV2qbNode = 0; - - if (here->HSMHV2qiNode > 0) - CKTdltNNum(ckt, here->HSMHV2qiNode); - here->HSMHV2qiNode = 0; - - if (here->HSMHV2sbNode > 0 - && here->HSMHV2sbNode != here->HSMHV2bNode) - CKTdltNNum(ckt, here->HSMHV2sbNode); - here->HSMHV2sbNode = 0; - - if (here->HSMHV2bNodePrime > 0 - && here->HSMHV2bNodePrime != here->HSMHV2bNode) - CKTdltNNum(ckt, here->HSMHV2bNodePrime); - here->HSMHV2bNodePrime = 0; - - if (here->HSMHV2dbNode > 0 - && here->HSMHV2dbNode != here->HSMHV2bNode) - CKTdltNNum(ckt, here->HSMHV2dbNode); - here->HSMHV2dbNode = 0; - - if (here->HSMHV2gNodePrime > 0 - && here->HSMHV2gNodePrime != here->HSMHV2gNode) - CKTdltNNum(ckt, here->HSMHV2gNodePrime); - here->HSMHV2gNodePrime = 0; - - if (here->HSMHV2sNodePrime > 0 - && here->HSMHV2sNodePrime != here->HSMHV2sNode) - CKTdltNNum(ckt, here->HSMHV2sNodePrime); - here->HSMHV2sNodePrime = 0; - - if (here->HSMHV2dNodePrime > 0 - && here->HSMHV2dNodePrime != here->HSMHV2dNode) - CKTdltNNum(ckt, here->HSMHV2dNodePrime); - here->HSMHV2dNodePrime = 0; - } - } -#endif - return OK; -} diff --git a/src/spicelib/devices/hisimhv2/hsmhv2soachk.c b/src/spicelib/devices/hisimhv2/hsmhv2soachk.c deleted file mode 100644 index 29d70b8fe..000000000 --- a/src/spicelib/devices/hisimhv2/hsmhv2soachk.c +++ /dev/null @@ -1,341 +0,0 @@ -/********** -Copyright 2013 Dietmar Warning. All rights reserved. -Author: 2013 Dietmar Warning -**********/ - -#include "ngspice/ngspice.h" -#include "ngspice/cktdefs.h" -#include "hsmhv2def.h" -#include "ngspice/trandefs.h" -#include "ngspice/sperror.h" -#include "ngspice/suffix.h" -#include "ngspice/cpdefs.h" - - -int -HSMHV2soaCheck(CKTcircuit *ckt, GENmodel *inModel) -{ - HSMHV2model *model = (HSMHV2model *) inModel; - HSMHV2instance *here; - double vgs, vgd, vgb, vds, vbs, vbd; /* actual mos voltages */ - int maxwarns; - static int warns_vgs = 0, warns_vgd = 0, warns_vgb = 0, warns_vds = 0, warns_vbs = 0, warns_vbd = 0; - - if (!ckt) { - warns_vgs = 0; - warns_vgd = 0; - warns_vgb = 0; - warns_vds = 0; - warns_vbs = 0; - warns_vbd = 0; - return OK; - } - - maxwarns = ckt->CKTsoaMaxWarns; - - for (; model; model = HSMHV2nextModel(model)) { - - for (here = HSMHV2instances(model); here; here = HSMHV2nextInstance(here)) { - - vgs = ckt->CKTrhsOld [here->HSMHV2gNode] - - ckt->CKTrhsOld [here->HSMHV2sNodePrime]; - - vgd = ckt->CKTrhsOld [here->HSMHV2gNode] - - ckt->CKTrhsOld [here->HSMHV2dNodePrime]; - - vgb = ckt->CKTrhsOld [here->HSMHV2gNode] - - ckt->CKTrhsOld [here->HSMHV2bNodePrime]; - - vds = ckt->CKTrhsOld [here->HSMHV2dNode] - - ckt->CKTrhsOld [here->HSMHV2sNodePrime]; - - vbs = ckt->CKTrhsOld [here->HSMHV2bNode] - - ckt->CKTrhsOld [here->HSMHV2sNodePrime]; - - vbd = ckt->CKTrhsOld [here->HSMHV2bNode] - - ckt->CKTrhsOld [here->HSMHV2dNodePrime]; - - if (!model->HSMHV2vgsrMaxGiven) { - if (fabs(vgs) > model->HSMHV2vgsMax) - if (warns_vgs < maxwarns) { - soa_printf(ckt, (GENinstance*) here, - "Vgs=%g has exceeded Vgs_max=%g\n", - vgs, model->HSMHV2vgsMax); - warns_vgs++; - } - if (!model->HSMHV2vgbMaxGiven) { - if (fabs(vgb) > model->HSMHV2vgsMax) - if (warns_vgb < maxwarns) { - soa_printf(ckt, (GENinstance*) here, - "Vgb=%g has exceeded Vgs_max=%g\n", - vgb, model->HSMHV2vgsMax); - warns_vgb++; - } - } else { - if (fabs(vgb) > model->HSMHV2vgbMax) - if (warns_vgb < maxwarns) { - soa_printf(ckt, (GENinstance*) here, - "Vgb=%g has exceeded Vgb_max=%g\n", - vgb, model->HSMHV2vgbMax); - warns_vgb++; - } - } - } else { - if (model->HSMHV2_type > 0) { - if (vgs > model->HSMHV2vgsMax) - if (warns_vgs < maxwarns) { - soa_printf(ckt, (GENinstance*) here, - "Vgs=%g has exceeded Vgs_max=%g\n", - vgs, model->HSMHV2vgsMax); - warns_vgs++; - } - if (-1*vgs > model->HSMHV2vgsrMax) - if (warns_vgs < maxwarns) { - soa_printf(ckt, (GENinstance*) here, - "Vgs=%g has exceeded Vgsr_max=%g\n", - vgs, model->HSMHV2vgsrMax); - warns_vgs++; - } - } else { - if (vgs > model->HSMHV2vgsrMax) - if (warns_vgs < maxwarns) { - soa_printf(ckt, (GENinstance*) here, - "Vgs=%g has exceeded Vgsr_max=%g\n", - vgs, model->HSMHV2vgsrMax); - warns_vgs++; - } - if (-1*vgs > model->HSMHV2vgsMax) - if (warns_vgs < maxwarns) { - soa_printf(ckt, (GENinstance*) here, - "Vgs=%g has exceeded Vgs_max=%g\n", - vgs, model->HSMHV2vgsMax); - warns_vgs++; - } - } - } - - if (!model->HSMHV2vgdrMaxGiven) { - if (fabs(vgd) > model->HSMHV2vgdMax) - if (warns_vgd < maxwarns) { - soa_printf(ckt, (GENinstance*) here, - "Vgd=%g has exceeded Vgd_max=%g\n", - vgd, model->HSMHV2vgdMax); - warns_vgd++; - } - } else { - if (model->HSMHV2_type > 0) { - if (vgd > model->HSMHV2vgdMax) - if (warns_vgd < maxwarns) { - soa_printf(ckt, (GENinstance*) here, - "Vgd=%g has exceeded Vgd_max=%g\n", - vgd, model->HSMHV2vgdMax); - warns_vgd++; - } - if (-1*vgd > model->HSMHV2vgdrMax) - if (warns_vgd < maxwarns) { - soa_printf(ckt, (GENinstance*) here, - "Vgd=%g has exceeded Vgdr_max=%g\n", - vgd, model->HSMHV2vgdrMax); - warns_vgd++; - } - } else { - if (vgd > model->HSMHV2vgdrMax) - if (warns_vgd < maxwarns) { - soa_printf(ckt, (GENinstance*) here, - "Vgd=%g has exceeded Vgdr_max=%g\n", - vgd, model->HSMHV2vgdrMax); - warns_vgd++; - } - if (-1*vgd > model->HSMHV2vgdMax) - if (warns_vgd < maxwarns) { - soa_printf(ckt, (GENinstance*) here, - "Vgd=%g has exceeded Vgd_max=%g\n", - vgd, model->HSMHV2vgdMax); - warns_vgd++; - } - } - } - - if (fabs(vds) > model->HSMHV2vdsMax) - if (warns_vds < maxwarns) { - soa_printf(ckt, (GENinstance*) here, - "Vds=%g has exceeded Vds_max=%g\n", - vds, model->HSMHV2vdsMax); - warns_vds++; - } - - if (!model->HSMHV2vgbrMaxGiven) { - if (fabs(vgb) > model->HSMHV2vgbMax) - if (warns_vgb < maxwarns) { - soa_printf(ckt, (GENinstance*) here, - "Vgb=%g has exceeded Vgb_max=%g\n", - vgb, model->HSMHV2vgbMax); - warns_vgb++; - } - } else { - if (model->HSMHV2_type > 0) { - if (vgb > model->HSMHV2vgbMax) - if (warns_vgb < maxwarns) { - soa_printf(ckt, (GENinstance*) here, - "Vgb=%g has exceeded Vgb_max=%g\n", - vgb, model->HSMHV2vgbMax); - warns_vgb++; - } - if (-1*vgb > model->HSMHV2vgbrMax) - if (warns_vgb < maxwarns) { - soa_printf(ckt, (GENinstance*) here, - "Vgb=%g has exceeded Vgbr_max=%g\n", - vgb, model->HSMHV2vgbrMax); - warns_vgb++; - } - } else { - if (vgb > model->HSMHV2vgbrMax) - if (warns_vgb < maxwarns) { - soa_printf(ckt, (GENinstance*) here, - "Vgb=%g has exceeded Vgbr_max=%g\n", - vgb, model->HSMHV2vgbrMax); - warns_vgb++; - } - if (-1*vgb > model->HSMHV2vgbMax) - if (warns_vgb < maxwarns) { - soa_printf(ckt, (GENinstance*) here, - "Vgb=%g has exceeded Vgb_max=%g\n", - vgb, model->HSMHV2vgbMax); - warns_vgb++; - } - } - } - - if (!model->HSMHV2vbsrMaxGiven) { - if (!model->HSMHV2vbsMaxGiven) { - if (fabs(vbs) > model->HSMHV2vbdMax) - if (warns_vbs < maxwarns) { - soa_printf(ckt, (GENinstance*) here, - "Vbs=%g has exceeded Vbd_max=%g\n", - vbs, model->HSMHV2vbdMax); - warns_vbs++; - } - } else { - if (fabs(vbs) > model->HSMHV2vbsMax) - if (warns_vbs < maxwarns) { - soa_printf(ckt, (GENinstance*) here, - "Vbs=%g has exceeded Vbs_max=%g\n", - vbs, model->HSMHV2vbsMax); - warns_vbs++; - } - } - } else { - if (!model->HSMHV2vbsMaxGiven) { - if (model->HSMHV2_type > 0) { - if (vbs > model->HSMHV2vbdMax) - if (warns_vbs < maxwarns) { - soa_printf(ckt, (GENinstance*) here, - "Vbs=%g has exceeded Vbd_max=%g\n", - vbs, model->HSMHV2vbdMax); - warns_vbs++; - } - if (-1*vbs > model->HSMHV2vbsrMax) - if (warns_vbs < maxwarns) { - soa_printf(ckt, (GENinstance*) here, - "Vbs=%g has exceeded Vbsr_max=%g\n", - vbs, model->HSMHV2vbsrMax); - warns_vbs++; - } - } else { - if (vbs > model->HSMHV2vbsrMax) - if (warns_vbs < maxwarns) { - soa_printf(ckt, (GENinstance*) here, - "Vbs=%g has exceeded Vbsr_max=%g\n", - vbs, model->HSMHV2vbsrMax); - warns_vbs++; - } - if (-1*vbs > model->HSMHV2vbdMax) - if (warns_vbs < maxwarns) { - soa_printf(ckt, (GENinstance*) here, - "Vbs=%g has exceeded Vbd_max=%g\n", - vbs, model->HSMHV2vbdMax); - warns_vbs++; - } - } - } else { - if (model->HSMHV2_type > 0) { - if (vbs > model->HSMHV2vbsMax) - if (warns_vbs < maxwarns) { - soa_printf(ckt, (GENinstance*) here, - "Vbs=%g has exceeded Vbs_max=%g\n", - vbs, model->HSMHV2vbsMax); - warns_vbs++; - } - if (-1*vbs > model->HSMHV2vbsrMax) - if (warns_vbs < maxwarns) { - soa_printf(ckt, (GENinstance*) here, - "Vbs=%g has exceeded Vbsr_max=%g\n", - vbs, model->HSMHV2vbsrMax); - warns_vbs++; - } - } else { - if (vbs > model->HSMHV2vbsrMax) - if (warns_vbs < maxwarns) { - soa_printf(ckt, (GENinstance*) here, - "Vbs=%g has exceeded Vbsr_max=%g\n", - vbs, model->HSMHV2vbsrMax); - warns_vbs++; - } - if (-1*vbs > model->HSMHV2vbsMax) - if (warns_vbs < maxwarns) { - soa_printf(ckt, (GENinstance*) here, - "Vbs=%g has exceeded Vbs_max=%g\n", - vbs, model->HSMHV2vbsMax); - warns_vbs++; - } - } - } - } - - if (!model->HSMHV2vbdrMaxGiven) { - if (fabs(vbd) > model->HSMHV2vbdMax) - if (warns_vbd < maxwarns) { - soa_printf(ckt, (GENinstance*) here, - "Vbd=%g has exceeded Vbd_max=%g\n", - vbd, model->HSMHV2vbdMax); - warns_vbd++; - } - } else { - if (model->HSMHV2_type > 0) { - if (vbd > model->HSMHV2vbdMax) - if (warns_vbd < maxwarns) { - soa_printf(ckt, (GENinstance*) here, - "Vbd=%g has exceeded Vbd_max=%g\n", - vbd, model->HSMHV2vbdMax); - warns_vbd++; - } - if (-1*vbd > model->HSMHV2vbdrMax) - if (warns_vbd < maxwarns) { - soa_printf(ckt, (GENinstance*) here, - "Vbd=%g has exceeded Vbdr_max=%g\n", - vbd, model->HSMHV2vbdrMax); - warns_vbd++; - } - } else { - if (vbd > model->HSMHV2vbdrMax) - if (warns_vbd < maxwarns) { - soa_printf(ckt, (GENinstance*) here, - "Vbd=%g has exceeded Vbdr_max=%g\n", - vbd, model->HSMHV2vbdrMax); - warns_vbd++; - } - if (-1*vbd > model->HSMHV2vbdMax) - if (warns_vbd < maxwarns) { - soa_printf(ckt, (GENinstance*) here, - "Vbd=%g has exceeded Vbd_max=%g\n", - vbd, model->HSMHV2vbdMax); - warns_vbd++; - } - } - } - - } - } - - return OK; -} diff --git a/src/spicelib/devices/hisimhv2/hsmhv2temp.c b/src/spicelib/devices/hisimhv2/hsmhv2temp.c deleted file mode 100644 index 97b81b9af..000000000 --- a/src/spicelib/devices/hisimhv2/hsmhv2temp.c +++ /dev/null @@ -1,500 +0,0 @@ -/*********************************************************************** - - HiSIM (Hiroshima University STARC IGFET Model) - Copyright (C) 2014 Hiroshima University & STARC - - MODEL NAME : HiSIM_HV - ( VERSION : 2 SUBVERSION : 2 REVISION : 0 ) - Model Parameter 'VERSION' : 2.20 - FILE : hsmhvtemp.c - - DATE : 2014.6.11 - - released by - Hiroshima University & - Semiconductor Technology Academic Research Center (STARC) -***********************************************************************/ - -/********************************************************************** - -The following source code, and all copyrights, trade secrets or other -intellectual property rights in and to the source code in its entirety, -is owned by the Hiroshima University and the STARC organization. - -All users need to follow the "HISIM_HV Distribution Statement and -Copyright Notice" attached to HiSIM_HV model. - ------HISIM_HV Distribution Statement and Copyright Notice-------------- - -Software is distributed as is, completely without warranty or service -support. Hiroshima University or STARC and its employees are not liable -for the condition or performance of the software. - -Hiroshima University and STARC own the copyright and grant users a perpetual, -irrevocable, worldwide, non-exclusive, royalty-free license with respect -to the software as set forth below. - -Hiroshima University and STARC hereby disclaims all implied warranties. - -Hiroshima University and STARC grant the users the right to modify, copy, -and redistribute the software and documentation, both within the user's -organization and externally, subject to the following restrictions - -1. The users agree not to charge for Hiroshima University and STARC code -itself but may charge for additions, extensions, or support. - -2. In any product based on the software, the users agree to acknowledge -Hiroshima University and STARC that developed the software. This -acknowledgment shall appear in the product documentation. - -3. The users agree to reproduce any copyright notice which appears on -the software on any copy or modification of such made available -to others." - -Toshimasa Asahara, President, Hiroshima University -Mitiko Miura-Mattausch, Professor, Hiroshima University -Katsuhiro Shimohigashi, President&CEO, STARC -June 2008 (revised October 2011) -*************************************************************************/ - -#include "ngspice/ngspice.h" -#include "ngspice/smpdefs.h" -#include "ngspice/cktdefs.h" -#include "hsmhv2def.h" -#include "hsmhv2evalenv.h" -#include "ngspice/const.h" -#include "ngspice/sperror.h" -#include "ngspice/suffix.h" - - -#define RANGECHECK(param, min, max, pname) \ - if ( (param) < (min) || (param) > (max) ) { \ - printf("warning(HiSIM_HV(%s)): The model/instance parameter %s (= %e) must be in the range [%e , %e].\n", model->HSMHV2modName,\ - (pname), (param), (min), (max) ); \ - } - -#define Fn_SU( y , x , xmax , delta , dx ) { \ - TMF1 = ( xmax ) - ( x ) - ( delta ) ; \ - TMF2 = 4.0 * ( xmax ) * ( delta ) ; \ - TMF2 = TMF2 > 0.0 ? TMF2 : -( TMF2) ; \ - TMF2 = sqrt ( TMF1 * TMF1 + TMF2 ) ; \ - dx = 0.5 * ( 1.0 + TMF1 / TMF2 ) ; \ - y = ( xmax ) - 0.5 * ( TMF1 + TMF2 ) ; \ - } - -#define Fn_SL( y , x , xmin , delta , dx ) { \ - TMF1 = ( x ) - ( xmin ) - ( delta ) ; \ - TMF2 = 4.0 * ( xmin ) * ( delta ) ; \ - TMF2 = TMF2 > 0.0 ? TMF2 : -( TMF2 ); \ - TMF2 = sqrt ( TMF1 * TMF1 + TMF2 ) ; \ - dx = 0.5 * ( 1.0 + TMF1 / TMF2 ) ; \ - y = ( xmin ) + 0.5 * ( TMF1 + TMF2 ) ; \ - } - - -#define C_m2cm (1.0e2) - -int HSMHV2temp( - GENmodel *inModel, - CKTcircuit *ckt) -{ - HSMHV2model *model = (HSMHV2model *)inModel ; - HSMHV2instance *here ; - HSMHV2binningParam *pParam ; - HSMHV2modelMKSParam *modelMKS ; - HSMHV2hereMKSParam *hereMKS ; - double mueph =0.0 ; - double Leff=0.0, dL =0.0, dLLD=0.0, LG=0.0, Weff=0.0, dW =0.0, dWLD=0.0, dWCV=0.0, WG =0.0, WL =0.0, Lgate =0.0, Wgate =0.0 ; - double Nsubpp=0.0, Nsubps=0.0, Nsub=0.0, q_Nsub=0.0, Nsubb=0.0, Npext =0.0 ; - double Lod_half=0.0, Lod_half_ref =0.0 ; - double T0, T1, T2, T3, T4, T5, T6, T7 ; - /* temperature-dependent variables */ - double Eg =0.0, TTEMP0=0.0, TTEMP=0.0, beta=0.0, Nin=0.0 ; - double Tdiff0 = 0.0, Tdiff0_2 = 0.0, Tdiff = 0.0, Tdiff_2 = 0.0; - double js=0.0, jssw=0.0, js2=0.0, jssw2 =0.0 ; - int i=0 ; - double TMF1 , TMF2 ; - double GDLD =0.0 ; - double log_Tratio =0.0 ; - const double small = 1.0e-50 ; - const double dlt_rd23 = 1.0e-6 / C_m2cm ; - const double large_arg = 80 ; - - for ( ;model ;model = HSMHV2nextModel(model)) { - - modelMKS = &model->modelMKS ; - - model->HSMHV2_vcrit = CONSTvt0 * log( CONSTvt0 / (CONSTroot2 * 1.0e-14) ) ; - - /* Quantum Mechanical Effect */ - if ( ( model->HSMHV2_qme1 == 0.0 && model->HSMHV2_qme3 == 0.0 ) || model->HSMHV2_qme2 == 0.0 ) { - model->HSMHV2_flg_qme = 0 ; - } else { - model->HSMHV2_flg_qme = 1 ; - model->HSMHV2_qme12 = model->HSMHV2_qme1 / ( model->HSMHV2_qme2 * model->HSMHV2_qme2 ) ; - } - - for ( here = HSMHV2instances(model); here; here = HSMHV2nextInstance(here)) { - - pParam = &here->pParam ; - - hereMKS = &here->hereMKS ; - - here->HSMHV2_lgate = Lgate = here->HSMHV2_l + model->HSMHV2_xl ; - Wgate = here->HSMHV2_w / here->HSMHV2_nf + model->HSMHV2_xw ; - - LG = Lgate * C_m2um ; - here->HSMHV2_wg = WG = Wgate * C_m2um ; - WL = WG * LG ; - GDLD = model->HSMHV2_gdld * C_m2um ; - - - /* Band gap */ - here->HSMHV2_egtnom = pParam->HSMHV2_eg0 - model->HSMHV2_ktnom - * ( 90.25e-6 + model->HSMHV2_ktnom * 1.0e-7 ) ; - - /* C_EOX */ - here->HSMHV2_cecox = C_VAC * model->HSMHV2_kappa ; - - /* Vth reduction for small Vds */ - here->HSMHV2_msc = model->HSMHV2_scp22 ; - - /* Poly-Si Gate Depletion */ - if ( pParam->HSMHV2_pgd1 == 0.0 ) { - here->HSMHV2_flg_pgd = 0 ; - } else { - here->HSMHV2_flg_pgd = 1 ; - } - - - /* CLM5 & CLM6 */ - here->HSMHV2_clmmod = 1e0 + pow( LG , model->HSMHV2_clm5 ) * model->HSMHV2_clm6 ; - - /* Half length of diffusion */ - T1 = 1.0 / (model->HSMHV2_saref + 0.5 * here->HSMHV2_l) - + 1.0 / (model->HSMHV2_sbref + 0.5 * here->HSMHV2_l); - Lod_half_ref = 2.0 / T1 ; - - if (here->HSMHV2_sa > 0.0 && here->HSMHV2_sb > 0.0 && - (here->HSMHV2_nf == 1.0 || - (here->HSMHV2_nf > 1.0 && here->HSMHV2_sd > 0.0))) { - T1 = 0.0; - for (i = 0; i < here->HSMHV2_nf; i++) { - T1 += 1.0 / (here->HSMHV2_sa + 0.5 * here->HSMHV2_l - + i * (here->HSMHV2_sd + here->HSMHV2_l)) - + 1.0 / (here->HSMHV2_sb + 0.5 * here->HSMHV2_l - + i * (here->HSMHV2_sd + here->HSMHV2_l)); - } - Lod_half = 2.0 * here->HSMHV2_nf / T1; - } else { - Lod_half = 0.0; - } - - Npext = pParam->HSMHV2_npext ; - here->HSMHV2_mueph1 = pParam->HSMHV2_mueph1 ; - here->HSMHV2_nsubp = pParam->HSMHV2_nsubp ; - here->HSMHV2_nsubc = pParam->HSMHV2_nsubc ; - - /* DFM */ - if ( model->HSMHV2_codfm == 1 && here->HSMHV2_nsubcdfm_Given ) { - RANGECHECK(here->HSMHV2_nsubcdfm, 1.0e16, 1.0e19, "NSUBCDFM") ; - here->HSMHV2_mueph1 *= model->HSMHV2_mphdfm - * ( log(hereMKS->HSMHV2_nsubcdfm) - log(here->HSMHV2_nsubc) ) + 1.0 ; - here->HSMHV2_nsubp += hereMKS->HSMHV2_nsubcdfm - here->HSMHV2_nsubc ; - Npext += hereMKS->HSMHV2_nsubcdfm - here->HSMHV2_nsubc ; - here->HSMHV2_nsubc = hereMKS->HSMHV2_nsubcdfm ; - } - - /* Phonon Scattering (temperature-independent part) */ - mueph = here->HSMHV2_mueph1 - * (1.0e0 + (model->HSMHV2_muephw / pow( WG, model->HSMHV2_muepwp))) - * (1.0e0 + (model->HSMHV2_muephl / pow( LG, model->HSMHV2_mueplp))) - * (1.0e0 + (model->HSMHV2_muephs / pow( WL, model->HSMHV2_muepsp))); - if (Lod_half > 0.0) { - T1 = 1.0e0 / (1.0e0 + pParam->HSMHV2_muesti2) ; - T2 = pow (pParam->HSMHV2_muesti1 / Lod_half, pParam->HSMHV2_muesti3) ; - T3 = pow (pParam->HSMHV2_muesti1 / Lod_half_ref, pParam->HSMHV2_muesti3) ; - here->HSMHV2_mueph = mueph * (1.0e0 + T1 * T2) / (1.0e0 + T1 * T3); - } else { - here->HSMHV2_mueph = mueph; - } - - /* Surface Roughness Scattering */ - here->HSMHV2_muesr = model->HSMHV2_muesr0 - * (1.0e0 + (model->HSMHV2_muesrl / pow (LG, model->HSMHV2_mueslp))) - * (1.0e0 + (model->HSMHV2_muesrw / pow (WG, model->HSMHV2_mueswp))) ; - - /* Coefficients of Qbm for Eeff */ - T1 = pow( LG, model->HSMHV2_ndeplp ) ; - here->HSMHV2_ndep_o_esi = ( pParam->HSMHV2_ndep * T1 ) / ( T1 + model->HSMHV2_ndepl ) - / C_ESI ; - here->HSMHV2_ninv_o_esi = pParam->HSMHV2_ninv / C_ESI ; - here->HSMHV2_ninvd0 = model->HSMHV2_ninvd * ( 1.0 + (model->HSMHV2_ninvdw / pow( WG, model->HSMHV2_ninvdwp))); - - /* Metallurgical channel geometry */ - dL = model->HSMHV2_xld - + (modelMKS->HSMHV2_ll / pow (Lgate + model->HSMHV2_lld, model->HSMHV2_lln)) ; - dLLD = model->HSMHV2_xldld - + (modelMKS->HSMHV2_ll / pow (Lgate + model->HSMHV2_lld, model->HSMHV2_lln)) ; - - dW = model->HSMHV2_xwd - + (modelMKS->HSMHV2_wl / pow (Wgate + model->HSMHV2_wld, model->HSMHV2_wln)) ; - dWLD = model->HSMHV2_xwdld - + (modelMKS->HSMHV2_wl / pow (Wgate + model->HSMHV2_wld, model->HSMHV2_wln)) ; - dWCV = model->HSMHV2_xwdc - + (modelMKS->HSMHV2_wl / pow (Wgate + model->HSMHV2_wld, model->HSMHV2_wln)) ; - - Leff = Lgate - ( dL + dLLD ) ; - if ( Leff <= 0.0 ) { - IFuid namarr[2]; - namarr[0] = here->HSMHV2name; - namarr[1] = model->HSMHV2modName; - (*(SPfrontEnd->IFerror)) - ( - ERR_FATAL, - "HiSIM_HV: MOSFET(%s) MODEL(%s): effective channel length is negative or 0", - namarr - ); - return (E_BADPARM); - } - here->HSMHV2_leff = Leff ; - - /* Wg dependence for short channel devices */ - here->HSMHV2_lgatesm = Lgate + model->HSMHV2_wl1 / pow( WL , model->HSMHV2_wl1p ) ; - here->HSMHV2_dVthsm = pParam->HSMHV2_wl2 / pow( WL , model->HSMHV2_wl2p ) ; - - /* Lg dependence of wsti */ - T1 = 1.0e0 + model->HSMHV2_wstil / pow( here->HSMHV2_lgatesm * C_m2um , model->HSMHV2_wstilp ) ; - T2 = 1.0e0 + model->HSMHV2_wstiw / pow( WG , model->HSMHV2_wstiwp ) ; - here->HSMHV2_wsti = pParam->HSMHV2_wsti * T1 * T2 ; - - here->HSMHV2_weff = Weff = Wgate - 2.0e0 * dW ; - here->HSMHV2_weff_ld = Wgate - 2.0e0 * dWLD ; - here->HSMHV2_weff_cv = Wgate - 2.0e0 * dWCV ; - if ( Weff <= 0.0 ) { - IFuid namarr[2]; - namarr[0] = here->HSMHV2name; - namarr[1] = model->HSMHV2modName; - (*(SPfrontEnd->IFerror)) - ( - ERR_FATAL, - "HiSIM_HV: MOSFET(%s) MODEL(%s): effective channel width is negative or 0", - namarr - ); - return (E_BADPARM); - } - here->HSMHV2_weff_nf = Weff * here->HSMHV2_nf ; - here->HSMHV2_weffcv_nf = here->HSMHV2_weff_cv * here->HSMHV2_nf ; - - /* Surface impurity profile */ - /* Note: Sign Changed --> */ - Nsubpp = here->HSMHV2_nsubp - * (1.0e0 + (model->HSMHV2_nsubp0 / pow (WG, model->HSMHV2_nsubwp))) ; - /* <-- Note: Sign Changed */ - - if (Lod_half > 0.0) { - T1 = 1.0e0 / (1.0e0 + pParam->HSMHV2_nsubpsti2) ; - T2 = pow (pParam->HSMHV2_nsubpsti1 / Lod_half, pParam->HSMHV2_nsubpsti3) ; - T3 = pow (pParam->HSMHV2_nsubpsti1 / Lod_half_ref, pParam->HSMHV2_nsubpsti3) ; - Nsubps = Nsubpp * (1.0e0 + T1 * T2) / (1.0e0 + T1 * T3) ; - } else { - Nsubps = Nsubpp ; - } - - here->HSMHV2_nsubc *= 1.0e0 + ( model->HSMHV2_nsubcw / pow ( WG, model->HSMHV2_nsubcwp )) ; - - if( Lgate > model->HSMHV2_lp ){ - Nsub = (here->HSMHV2_nsubc * (Lgate - model->HSMHV2_lp) - + Nsubps * model->HSMHV2_lp) / Lgate ; - } else { - Nsub = Nsubps - + (Nsubps - here->HSMHV2_nsubc) * (model->HSMHV2_lp - Lgate) - / model->HSMHV2_lp ; - } - T3 = 0.5e0 * Lgate - model->HSMHV2_lp ; - T1 = 1.0e0 / ( 1.0e0 / T3 + 1.0e0 / model->HSMHV2_lpext ) ; - T2 = Fn_Max (0.0e0, T1) ; - here->HSMHV2_nsub = - Nsub = Nsub + T2 * (Npext - here->HSMHV2_nsubc) / Lgate ; - here->HSMHV2_qnsub = q_Nsub = C_QE * Nsub ; - here->HSMHV2_qnsub_esi = q_Nsub * C_ESI ; - here->HSMHV2_2qnsub_esi = 2.0 * here->HSMHV2_qnsub_esi ; - - /* Pocket Overlap (temperature-independent part) */ - if ( Lgate <= 2.0e0 * model->HSMHV2_lp ) { - Nsubb = 2.0e0 * Nsubps - - (Nsubps - here->HSMHV2_nsubc) * Lgate - / model->HSMHV2_lp - here->HSMHV2_nsubc ; - here->HSMHV2_ptovr0 = log (Nsubb / here->HSMHV2_nsubc) ; - /* here->HSMHV2_ptovr0 will be divided by beta later. */ - } else { - here->HSMHV2_ptovr0 = 0.0e0 ; - } - - /* depletion MOS (temperature-independent part) */ - here->HSMHV2_ndepm = modelMKS->HSMHV2_ndepm ; - - /* costi0 and costi1 for STI transistor model (temperature-independent part) */ - here->HSMHV2_costi00 = sqrt (2.0 * C_QE * pParam->HSMHV2_nsti * C_ESI ) ; - here->HSMHV2_nsti_p2 = 1.0 / ( pParam->HSMHV2_nsti * pParam->HSMHV2_nsti ) ; - - /* Velocity Temperature Dependence (Temperature-dependent part will be multiplied later.) */ - here->HSMHV2_vmax0 = (1.0e0 + (pParam->HSMHV2_vover / pow (LG, model->HSMHV2_voverp))) - * (1.0e0 + (model->HSMHV2_vovers / pow (WL, model->HSMHV2_voversp))) ; - - /* 2 phi_B (temperature-independent) */ - /* @300K, with pocket */ - here->HSMHV2_pb20 = 2.0e0 / C_b300 * log (Nsub / C_Nin0) ; - /* @300K, w/o pocket */ - here->HSMHV2_pb2c = 2.0e0 / C_b300 * log (here->HSMHV2_nsubc / C_Nin0) ; - - /* constant for Poly depletion */ - here->HSMHV2_cnstpgd = pow ( 1e0 + 1e0 / LG , model->HSMHV2_pgd4 ) - * pParam->HSMHV2_pgd1 ; - - /* Gate resistance */ - if ( here->HSMHV2_corg == 1 ) { - T1 = here->HSMHV2_xgw + Weff / (3.0e0 * here->HSMHV2_ngcon); - T2 = Lgate - here->HSMHV2_xgl; - here->HSMHV2_grg = model->HSMHV2_rshg * T1 / (here->HSMHV2_ngcon * T2 * here->HSMHV2_nf); - if (here->HSMHV2_grg > 1.0e-3) here->HSMHV2_grg = here->HSMHV2_m / here->HSMHV2_grg; - else { - here->HSMHV2_grg = here->HSMHV2_m * 1.0e3; - printf("warning(HiSIM_HV(%s)): The gate conductance reset to 1.0e3 mho.\n",model->HSMHV2modName); - } - } - - /* Process source/drain series resistamce */ - - if ( model->HSMHV2_rsh > 0.0 ) { - here->HSMHV2_rd0 = model->HSMHV2_rsh * here->HSMHV2_nrd ; - } else { - here->HSMHV2_rd0 = 0.0 ; - } - if ( pParam->HSMHV2_rd > 0.0 || pParam->HSMHV2_rs > 0.0 ) { - here->HSMHV2_rdtemp0 = 1.0 + model->HSMHV2_rds / pow( WL , model->HSMHV2_rdsp ) ; - if( pParam->HSMHV2_rdvd != 0.0 ){ - T7 = ( 1.0 + model->HSMHV2_rdvds / pow( WL , model->HSMHV2_rdvdsp ) ); - T6 = ( - model->HSMHV2_rdvdl * pow( LG , model->HSMHV2_rdvdlp ) ) ; - if(T6 > large_arg) T6 = large_arg ; - T6 = exp( T6 ) ; - here->HSMHV2_rdvdtemp0 = T6 * T7 ; - } - } - if( pParam->HSMHV2_rd23 != 0.0 ){ - T2 = ( 1.0 + model->HSMHV2_rd23s / pow( WL , model->HSMHV2_rd23sp ) ); - T1 = ( - model->HSMHV2_rd23l * pow( LG , model->HSMHV2_rd23lp ) ) ; - if(T1 > large_arg) T1 = large_arg ; - T1 = exp( T1 ) ; - T3 = pParam->HSMHV2_rd23 * T2 * T1 ; - here->HSMHV2_rd23 = 0.5 * ( T3 + sqrt ( T3 * T3 + 4.0 * dlt_rd23 * dlt_rd23 ) ) ; - } else { - here->HSMHV2_rd23 = 0.0 ; - } - if ( model->HSMHV2_rsh > 0.0 ) { - here->HSMHV2_rs0 = model->HSMHV2_rsh * here->HSMHV2_nrs ; - } else { - here->HSMHV2_rs0 = 0.0 ; - } - - here->HSMHV2_Xmax = sqrt ( model->HSMHV2_rdrdjunc * model->HSMHV2_rdrdjunc + model->HSMHV2_xldld * model->HSMHV2_xldld ) ; - if(pParam->HSMHV2_nover != 0.0) { - here->HSMHV2_kdep = 2.0 * C_ESI / ( C_QE * pParam->HSMHV2_nover ) ; - here->HSMHV2_kjunc = 2.0 * C_ESI / C_QE * here->HSMHV2_nsubc / ( pParam->HSMHV2_nover + here->HSMHV2_nsubc ) / pParam->HSMHV2_nover ; - } - here->HSMHV2_rdrcxw = 1.0e0 ; - here->HSMHV2_rdrvmaxw = 1.0e0 + (model->HSMHV2_rdrvmaxw / pow( WG, model->HSMHV2_rdrvmaxwp)) ; - here->HSMHV2_rdrvmaxl = 1.0e0 + (model->HSMHV2_rdrvmaxl / pow( LG, model->HSMHV2_rdrvmaxlp)) ; - here->HSMHV2_rdrmuel = 1.0e0 + (model->HSMHV2_rdrmuel / pow( LG, model->HSMHV2_rdrmuelp )) ; - - /* Body resistance */ - if ( here->HSMHV2_corbnet == 1 ) { - if (here->HSMHV2_rbpb < 1.0e-3) here->HSMHV2_grbpb = here->HSMHV2_m * 1.0e3 ; - else here->HSMHV2_grbpb = here->HSMHV2_m * ( model->HSMHV2_gbmin + 1.0 / here->HSMHV2_rbpb ) ; - - if (here->HSMHV2_rbps < 1.0e-3) here->HSMHV2_grbps = here->HSMHV2_m * 1.0e3 ; - else here->HSMHV2_grbps = here->HSMHV2_m * ( model->HSMHV2_gbmin + 1.0 / here->HSMHV2_rbps ) ; - - if (here->HSMHV2_rbpd < 1.0e-3) here->HSMHV2_grbpd = here->HSMHV2_m * 1.0e3 ; - else here->HSMHV2_grbpd = here->HSMHV2_m * ( model->HSMHV2_gbmin + 1.0 / here->HSMHV2_rbpd ) ; - } - - /* Vdseff */ - if( model->HSMHV2_coddlt == 0) { - T1 = model->HSMHV2_ddltslp * LG + model->HSMHV2_ddltict ; - if ( T1 < 0.0 ) { T1 = 0.0 ; } - here->HSMHV2_ddlt = T1 * model->HSMHV2_ddltmax / ( T1 + model->HSMHV2_ddltmax ) + 1.0 ; - } else { - T1 = model->HSMHV2_ddltslp * LG ; - if ( T1 < 0.0 ) { T1 = 0.0 ; } - here->HSMHV2_ddlt = T1 * model->HSMHV2_ddltmax / ( T1 + model->HSMHV2_ddltmax ) + model->HSMHV2_ddltict + small ; - } - - - /* Isub */ - T2 = pow( Weff , model->HSMHV2_svgswp ) ; - here->HSMHV2_vg2const = pParam->HSMHV2_svgs - * ( 1.0e0 - + modelMKS->HSMHV2_svgsl / pow( here->HSMHV2_lgate , model->HSMHV2_svgslp ) ) - * ( T2 / ( T2 + modelMKS->HSMHV2_svgsw ) ) ; - - here->HSMHV2_xvbs = pParam->HSMHV2_svbs - * ( 1.0e0 - + modelMKS->HSMHV2_svbsl / pow( here->HSMHV2_lgate , model->HSMHV2_svbslp ) ) ; - here->HSMHV2_xgate = modelMKS->HSMHV2_slg - * ( 1.0 - + modelMKS->HSMHV2_slgl / pow( here->HSMHV2_lgate , model->HSMHV2_slglp ) ) ; - - here->HSMHV2_xsub1 = pParam->HSMHV2_sub1 - * ( 1.0 - + modelMKS->HSMHV2_sub1l / pow( here->HSMHV2_lgate , model->HSMHV2_sub1lp ) ) ; - - here->HSMHV2_xsub2 = pParam->HSMHV2_sub2 - * ( 1.0 + modelMKS->HSMHV2_sub2l / here->HSMHV2_lgate ) ; - - here->HSMHV2_subld1 = model->HSMHV2_subld1 - * ( 1.0 + model->HSMHV2_subld1l / pow( LG , model->HSMHV2_subld1lp ) ) ; - - /* IBPC */ - here->HSMHV2_ibpc1 = pParam->HSMHV2_ibpc1 - * ( 1.0 + model->HSMHV2_ibpc1l / pow( LG , model->HSMHV2_ibpc1lp ) ) ; - - /* Fringing capacitance */ - here->HSMHV2_cfrng = C_EOX / ( C_Pi / 2.0e0 ) * here->HSMHV2_weff_nf - * log( 1.0e0 + model->HSMHV2_tpoly / model->HSMHV2_tox ) ; - - /* Additional term of lateral-field-induced capacitance */ - here->HSMHV2_cqyb0 = C_m2um * here->HSMHV2_weff_nf - * model->HSMHV2_xqy1 / pow( LG , model->HSMHV2_xqy2 ) ; - - /* Parasitic component of the channel current */ - here->HSMHV2_ptl0 = model->HSMHV2_ptl * pow( LG , - model->HSMHV2_ptlp ) ; - here->HSMHV2_pt40 = model->HSMHV2_pt4 * pow( LG , - model->HSMHV2_pt4p ) ; - here->HSMHV2_gdl0 = model->HSMHV2_gdl * pow( LG + GDLD , - model->HSMHV2_gdlp ) ; - - /* Self heating */ - pParam->HSMHV2_rth = pParam->HSMHV2_rth0 / ( here->HSMHV2_m * here->HSMHV2_weff_nf ) - * ( 1.0 + model->HSMHV2_rth0w / pow( WG , model->HSMHV2_rth0wp ) ); - pParam->HSMHV2_cth = modelMKS->HSMHV2_cth0 * ( here->HSMHV2_m * here->HSMHV2_weff_nf ) ; - - pParam->HSMHV2_rth *= ( 1.0 / pow( here->HSMHV2_nf , model->HSMHV2_rth0nf ) ) ; - - here->HSMHV2_rthtemp0 = 1.0 / pow( here->HSMHV2_nf , model->HSMHV2_rth0nf ) / ( here->HSMHV2_m * here->HSMHV2_weff_nf ) - * ( 1.0 + model->HSMHV2_rth0w / pow( WG , model->HSMHV2_rth0wp ) ); - - - /*-----------------------------------------------------------* - * Temperature dependent constants. - *-----------------*/ - if ( here->HSMHV2tempNode < 0 || pParam->HSMHV2_rth0 == 0.0 ) { - -#include "hsmhv2temp_eval.h" -#include "hsmhv2temp_eval_rdri.h" -#include "hsmhv2temp_eval_dio.h" - - } /* end of if ( here->HSMHV2tempNode < 0 || pParam->HSMHV2_rth0 == 0.0 ) */ - - } - } - return(OK); -} diff --git a/src/spicelib/devices/hisimhv2/hsmhv2temp_eval.h b/src/spicelib/devices/hisimhv2/hsmhv2temp_eval.h deleted file mode 100644 index 4d0ecd8f1..000000000 --- a/src/spicelib/devices/hisimhv2/hsmhv2temp_eval.h +++ /dev/null @@ -1,370 +0,0 @@ -/*********************************************************************** - - HiSIM (Hiroshima University STARC IGFET Model) - Copyright (C) 2014 Hiroshima University & STARC - - MODEL NAME : HiSIM_HV - ( VERSION : 2 SUBVERSION : 2 REVISION : 0 ) - Model Parameter 'VERSION' : 2.20 - FILE : hsmhvtemp_eval.h - - DATE : 2014.6.11 - - released by - Hiroshima University & - Semiconductor Technology Academic Research Center (STARC) -***********************************************************************/ -/********************************************************************** - -The following source code, and all copyrights, trade secrets or other -intellectual property rights in and to the source code in its entirety, -is owned by the Hiroshima University and the STARC organization. - -All users need to follow the "HISIM_HV Distribution Statement and -Copyright Notice" attached to HiSIM_HV model. - ------HISIM_HV Distribution Statement and Copyright Notice-------------- - -Software is distributed as is, completely without warranty or service -support. Hiroshima University or STARC and its employees are not liable -for the condition or performance of the software. - -Hiroshima University and STARC own the copyright and grant users a perpetual, -irrevocable, worldwide, non-exclusive, royalty-free license with respect -to the software as set forth below. - -Hiroshima University and STARC hereby disclaims all implied warranties. - -Hiroshima University and STARC grant the users the right to modify, copy, -and redistribute the software and documentation, both within the user's -organization and externally, subject to the following restrictions - -1. The users agree not to charge for Hiroshima University and STARC code -itself but may charge for additions, extensions, or support. - -2. In any product based on the software, the users agree to acknowledge -Hiroshima University and STARC that developed the software. This -acknowledgment shall appear in the product documentation. - -3. The users agree to reproduce any copyright notice which appears on -the software on any copy or modification of such made available -to others." - -Toshimasa Asahara, President, Hiroshima University -Mitiko Miura-Mattausch, Professor, Hiroshima University -Katsuhiro Shimohigashi, President&CEO, STARC -June 2008 (revised October 2011) -*************************************************************************/ - -#define C_rdtemp_min 5.0e-3 -#define C_rdtemp_dlt 1.0e-2 - - TTEMP = ckt->CKTtemp; - if ( here->HSMHV2_dtemp_Given ) { TTEMP = TTEMP + here->HSMHV2_dtemp ; } - TTEMP0 = TTEMP ; -#ifdef HSMHV2EVAL - /* Self heating */ - TTEMP = TTEMP + deltemp ; -#endif -Tdiff0 = TTEMP0 - model->HSMHV2_ktnom ; -Tdiff0_2 = TTEMP0 * TTEMP0 - model->HSMHV2_ktnom * model->HSMHV2_ktnom ; -Tdiff = TTEMP - model->HSMHV2_ktnom ; -Tdiff_2 = TTEMP * TTEMP - model->HSMHV2_ktnom * model->HSMHV2_ktnom ; - here->HSMHV2_Tratio = TTEMP / model->HSMHV2_ktnom ; - - /* Band gap */ - here->HSMHV2_eg = Eg = here->HSMHV2_egtnom - pParam->HSMHV2_bgtmp1 * Tdiff - - pParam->HSMHV2_bgtmp2 * Tdiff_2 ; - here->HSMHV2_sqrt_eg = sqrt( Eg ) ; -#ifdef HSMHV2EVAL - Eg_dT = -pParam->HSMHV2_bgtmp1 - 2.0e0 * TTEMP * pParam->HSMHV2_bgtmp2 ; -#endif - - T1 = 1.0 / TTEMP ; - T2 = 1.0 / model->HSMHV2_ktnom ; - T3 = here->HSMHV2_egtnom + model->HSMHV2_egig - + model->HSMHV2_igtemp2 * ( T1 - T2 ) - + model->HSMHV2_igtemp3 * ( T1 * T1 - T2 * T2 ) ; - here->HSMHV2_egp12 = sqrt ( T3 ) ; - here->HSMHV2_egp32 = T3 * here->HSMHV2_egp12 ; - - - /* Inverse of the thermal voltage */ - here->HSMHV2_beta = beta = C_QE / (C_KB * TTEMP) ; - here->HSMHV2_beta_inv = 1.0 / beta ; - here->HSMHV2_beta2 = beta * beta ; - here->HSMHV2_betatnom = C_QE / (C_KB * model->HSMHV2_ktnom) ; -#ifdef HSMHV2EVAL - beta_dT=-C_QE/(C_KB*TTEMP*TTEMP); - beta_inv_dT = C_KB / C_QE ; -#endif - - /* Intrinsic carrier concentration */ - here->HSMHV2_nin = Nin = C_Nin0 * Fn_Pow (here->HSMHV2_Tratio, 1.5e0) - * exp (- Eg / 2.0e0 * beta + here->HSMHV2_egtnom / 2.0e0 * here->HSMHV2_betatnom) ; -#ifdef HSMHV2EVAL - Nin_dT = C_Nin0 * exp (- Eg / 2.0e0 * beta + here->HSMHV2_egtnom / 2.0e0 * here->HSMHV2_betatnom) - * 1.5e0 * Fn_Pow ( here->HSMHV2_Tratio , 0.5e0 ) / model->HSMHV2_ktnom - + C_Nin0 * Fn_Pow (here->HSMHV2_Tratio, 1.5e0) - * exp (- Eg / 2.0e0 * beta + here->HSMHV2_egtnom / 2.0e0 * here->HSMHV2_betatnom) - * ( - Eg / 2.0e0 * beta_dT - beta / 2.0e0 * Eg_dT ); -#endif - - /* Phonon Scattering (temperature-dependent part) */ - T1 = Fn_Pow (here->HSMHV2_Tratio, pParam->HSMHV2_muetmp) ; - here->HSMHV2_mphn0 = T1 / here->HSMHV2_mueph ; - here->HSMHV2_mphn1 = here->HSMHV2_mphn0 * model->HSMHV2_mueph0 ; -#ifdef HSMHV2EVAL - T1_dT = pParam->HSMHV2_muetmp * Fn_Pow(here->HSMHV2_Tratio, pParam->HSMHV2_muetmp - 1.0 ) - / model->HSMHV2_ktnom ; - mphn0_dT = T1_dT / here->HSMHV2_mueph ; -#endif - - if( model->HSMHV2_codep == 1 ) { - /* depletion MOS parameter (temperature-dependent part) */ - here->HSMHV2_Pb2n = 2.0/beta*log(here->HSMHV2_ndepm/Nin) ; - here->HSMHV2_Vbipn = 1.0/beta*log(here->HSMHV2_ndepm*here->HSMHV2_nsub/Nin/Nin) ; - here->HSMHV2_cnst0 = sqrt ( 2.0 * C_ESI * C_QE * here->HSMHV2_ndepm / beta ) ; - here->HSMHV2_cnst1 = Nin*Nin/here->HSMHV2_ndepm/here->HSMHV2_ndepm ; - T1 = Fn_Pow (here->HSMHV2_Tratio, model->HSMHV2_depmuetmp) ; - here->HSMHV2_depmphn0 = T1 / model->HSMHV2_depmueph1 ; - here->HSMHV2_depmphn1 = here->HSMHV2_depmphn0 * model->HSMHV2_depmueph0 ; - - T0 = 1.8 + 0.4 * here->HSMHV2_Tratio + 0.1 * here->HSMHV2_Tratio * here->HSMHV2_Tratio - model->HSMHV2_depvtmp * ( 1.0 - here->HSMHV2_Tratio ) ; - here->HSMHV2_depvmax = modelMKS->HSMHV2_depvmax / T0 ; - -#ifdef HSMHV2EVAL - Pb2n_dT = -here->HSMHV2_Pb2n/beta*beta_dT-2.0/beta/Nin*Nin_dT ; - Vbipn_dT = -here->HSMHV2_Vbipn/beta*beta_dT-2/beta/Nin*Nin_dT ; - cnst0_dT = 0.5e0 / here->HSMHV2_cnst0 * 2.0 * C_ESI * C_QE * here->HSMHV2_ndepm * beta_inv_dT ; - cnst1_dT = 2.0e0 * Nin * Nin_dT / here->HSMHV2_ndepm / here->HSMHV2_ndepm ; - T1_dT = model->HSMHV2_depmuetmp * Fn_Pow(here->HSMHV2_Tratio, model->HSMHV2_depmuetmp - 1.0 ) - / model->HSMHV2_ktnom ; - depmphn0_dT = T1_dT / model->HSMHV2_depmueph1 ; - T0_dT = 1 / model->HSMHV2_ktnom * ( 0.4 + 0.2 * here->HSMHV2_Tratio + model->HSMHV2_depvtmp ) ; - depVmax_dT = - modelMKS->HSMHV2_depvmax / ( T0 * T0 ) * T0_dT ; - -#endif - } - - /* Pocket Overlap (temperature-dependent part) */ - here->HSMHV2_ptovr = here->HSMHV2_ptovr0 / beta ; -#ifdef HSMHV2EVAL - ptovr_dT = here->HSMHV2_ptovr0 * beta_inv_dT ; -#endif - - /* Velocity Temperature Dependence */ - T1 = TTEMP / model->HSMHV2_ktnom ; - T0 = 1.8 + 0.4 * T1 + 0.1 * T1 * T1 - pParam->HSMHV2_vtmp * (1.0 - T1) ; - if ( model->HSMHV2_cotemp != 2 ) { /* without deltemp (COTEMP=0,1,3) */ - here->HSMHV2_vmax = here->HSMHV2_vmax0 * pParam->HSMHV2_vmax - / T0 - * ( 1.0 + model->HSMHV2_vmaxt1 * Tdiff0 + model->HSMHV2_vmaxt2 * Tdiff0_2 ) ; -#ifdef HSMHV2EVAL - Vmax_dT=-here->HSMHV2_vmax0 * pParam->HSMHV2_vmax - / ( T0 * T0 ) * ( 1.0 + model->HSMHV2_vmaxt1 * Tdiff0 + model->HSMHV2_vmaxt2 * Tdiff0_2 ) - * 1/model->HSMHV2_ktnom * (0.4 + 0.2 * T1 + pParam->HSMHV2_vtmp) ; -#endif - } else { /* with deltemp (COTEMP=2) */ - here->HSMHV2_vmax = here->HSMHV2_vmax0 * pParam->HSMHV2_vmax - / T0 - * ( 1.0 + model->HSMHV2_vmaxt1 * Tdiff + model->HSMHV2_vmaxt2 * Tdiff_2 ) ; -#ifdef HSMHV2EVAL - /* under development */ - Vmax_dT = here->HSMHV2_vmax0 * pParam->HSMHV2_vmax - / ( T0 * T0 ) - * ( ( model->HSMHV2_vmaxt1 + 2.0 * TTEMP * model->HSMHV2_vmaxt2 ) * T0 - - ( 1.0 + model->HSMHV2_vmaxt1 * Tdiff + model->HSMHV2_vmaxt2 * Tdiff_2 ) - * 1/model->HSMHV2_ktnom * (0.4 + 0.2 * T1 + pParam->HSMHV2_vtmp) ) ; -#endif - } - if ( model->HSMHV2_cotemp != 2 ) { /* without deltemp (COTEMP=0,1,3) */ - here->HSMHV2_ninvd = here->HSMHV2_ninvd0 * ( 1.0 + model->HSMHV2_ninvdt1 * Tdiff0 + model->HSMHV2_ninvdt2 * Tdiff0_2 ) ; -#ifdef HSMHV2EVAL - ninvd_dT = 0.0 ; -#endif - } else { /* with deltemp (COTEMP=2) */ - /* under development */ - here->HSMHV2_ninvd = here->HSMHV2_ninvd0 * ( 1.0 + model->HSMHV2_ninvdt1 * Tdiff + model->HSMHV2_ninvdt2 * Tdiff_2 ) ; -#ifdef HSMHV2EVAL - ninvd_dT = here->HSMHV2_ninvd0 * ( model->HSMHV2_ninvdt1 + 2.0 * TTEMP * model->HSMHV2_ninvdt2 ) ; -#endif - } - - /* Temperature Dependence of RTH0 */ - pParam->HSMHV2_rth = ( pParam->HSMHV2_rth0 + model->HSMHV2_rthtemp1 * Tdiff0 + model->HSMHV2_rthtemp2 * Tdiff0_2 ) * here->HSMHV2_rthtemp0 ; - - - /* Temperature Dependence of POWRAT */ - T2 = pParam->HSMHV2_powrat + model->HSMHV2_prattemp1 * Tdiff0 + model->HSMHV2_prattemp2 * Tdiff0_2 ; - Fn_SL( T2 , T2 , 0 , 0.05 , T0 ); - Fn_SU( here->HSMHV2_powratio , T2 , 1 , 0.05 , T0 ); - - - /* 2 phi_B (temperature-dependent) */ - /* @temp, with pocket */ - here->HSMHV2_pb2 = 2.0e0 / beta * log (here->HSMHV2_nsub / Nin) ; -#ifdef HSMHV2EVAL - Pb2_dT = - (here->HSMHV2_pb2 * beta_dT + 2.0e0 / Nin * Nin_dT ) / beta ; -#endif - - /* Depletion Width */ - T1 = 2.0e0 * C_ESI / C_QE ; - here->HSMHV2_wdpl = sqrt ( T1 / here->HSMHV2_nsub ) ; - here->HSMHV2_wdplp = sqrt( T1 / ( here->HSMHV2_nsubp ) ) ; - - - if( model->HSMHV2_codep == 0 ) { - /* Coefficient of the F function for bulk charge */ - here->HSMHV2_cnst0 = sqrt ( 2.0 * C_ESI * C_QE * here->HSMHV2_nsub / beta ) ; - - /* cnst1: n_{p0} / p_{p0} */ - T1 = Nin / here->HSMHV2_nsub ; - here->HSMHV2_cnst1 = T1 * T1 ; -#ifdef HSMHV2EVAL - cnst0_dT = 0.5e0 / here->HSMHV2_cnst0 * 2.0 * C_ESI * C_QE * here->HSMHV2_nsub * beta_inv_dT ; - cnst1_dT = 2.0e0 * Nin * Nin_dT / here->HSMHV2_nsub / here->HSMHV2_nsub ; -#endif - } - - - if( model->HSMHV2_codep == 0 ) { - - if ( pParam->HSMHV2_nover != 0.0 ) { - here->HSMHV2_cnst0over = here->HSMHV2_cnst0 * sqrt( pParam->HSMHV2_nover / here->HSMHV2_nsub ) ; -#ifdef HSMHV2EVAL - cnst0over_dT = cnst0_dT * sqrt( pParam->HSMHV2_nover / here->HSMHV2_nsub ) ; -#endif - } - if ( pParam->HSMHV2_novers != 0.0 ) { - here->HSMHV2_cnst0overs = here->HSMHV2_cnst0 * sqrt( pParam->HSMHV2_novers / here->HSMHV2_nsub ) ; -#ifdef HSMHV2EVAL - cnst0overs_dT = cnst0_dT * sqrt( pParam->HSMHV2_novers / here->HSMHV2_nsub ) ; -#endif - } - } else { - if ( pParam->HSMHV2_nover != 0.0 ) { - here->HSMHV2_cnst0over = here->HSMHV2_cnst0 * sqrt( pParam->HSMHV2_nover / here->HSMHV2_ndepm ) ; -#ifdef HSMHV2EVAL - cnst0over_dT = cnst0_dT * sqrt( pParam->HSMHV2_nover / here->HSMHV2_ndepm ) ; -#endif - } - if ( pParam->HSMHV2_novers != 0.0 ) { - here->HSMHV2_cnst0overs = here->HSMHV2_cnst0 * sqrt( pParam->HSMHV2_novers / here->HSMHV2_ndepm ) ; -#ifdef HSMHV2EVAL - cnst0overs_dT = cnst0_dT * sqrt( pParam->HSMHV2_novers / here->HSMHV2_ndepm ) ; -#endif - } - - } - - - /* temperature-dependent resistance model */ - /* drain side */ - if ( pParam->HSMHV2_rd > 0.0 ) { - T2 = here->HSMHV2_rdtemp0 - * ( here->HSMHV2_ldrift1 * pParam->HSMHV2_rdslp1 * C_m2um + pParam->HSMHV2_rdict1 ) - * ( here->HSMHV2_ldrift2 * model->HSMHV2_rdslp2 * C_m2um + model->HSMHV2_rdict2 ) ; - - if ( model->HSMHV2_cotemp == 1 ) { /* without deltemp (COTEMP=1) */ - here->HSMHV2_rd = ( pParam->HSMHV2_rd + modelMKS->HSMHV2_rdtemp1 * Tdiff0 + modelMKS->HSMHV2_rdtemp2 * Tdiff0_2 ) * T2 ; - Fn_SL( here->HSMHV2_rd, here->HSMHV2_rd, C_rdtemp_min * pParam->HSMHV2_rd, C_rdtemp_dlt * pParam->HSMHV2_rd, T0 ); -#ifdef HSMHV2EVAL - Rd0_dT = 0.0 ; -#endif - } else { /* with deltemp (COTEMP=0,2,3) */ - here->HSMHV2_rd = ( pParam->HSMHV2_rd + modelMKS->HSMHV2_rdtemp1 * Tdiff + modelMKS->HSMHV2_rdtemp2 * Tdiff_2 ) * T2 ; - Fn_SL( here->HSMHV2_rd, here->HSMHV2_rd, C_rdtemp_min * pParam->HSMHV2_rd, C_rdtemp_dlt * pParam->HSMHV2_rd, T0 ); -#ifdef HSMHV2EVAL - Rd0_dT = ( modelMKS->HSMHV2_rdtemp1 + 2.0 * TTEMP * modelMKS->HSMHV2_rdtemp2 ) * T2 * T0 ; -#endif - } - - } else { - here->HSMHV2_rd = 0.0 ; - } - /* source side (asymmetric case) */ - if ( pParam->HSMHV2_rs > 0.0 ) { - T2 = here->HSMHV2_rdtemp0 - * ( here->HSMHV2_ldrift1s * pParam->HSMHV2_rdslp1 * C_m2um + pParam->HSMHV2_rdict1 ) - * ( here->HSMHV2_ldrift2s * model->HSMHV2_rdslp2 * C_m2um + model->HSMHV2_rdict2 ) ; - - if ( model->HSMHV2_cotemp == 1 ) { /* without deltemp (COTEMP=1) */ - here->HSMHV2_rs = ( pParam->HSMHV2_rs + modelMKS->HSMHV2_rdtemp1 * Tdiff0 + modelMKS->HSMHV2_rdtemp2 * Tdiff0_2 ) * T2 ; - Fn_SL( here->HSMHV2_rs, here->HSMHV2_rs, C_rdtemp_min * pParam->HSMHV2_rs, C_rdtemp_dlt * pParam->HSMHV2_rs, T0 ); -#ifdef HSMHV2EVAL - Rs0_dT = 0.0 ; -#endif - } else { /* with deltemp (COTEMP=0,2,3) */ - here->HSMHV2_rs = ( pParam->HSMHV2_rs + modelMKS->HSMHV2_rdtemp1 * Tdiff + modelMKS->HSMHV2_rdtemp2 * Tdiff_2 ) * T2 ; - Fn_SL( here->HSMHV2_rs, here->HSMHV2_rs, C_rdtemp_min * pParam->HSMHV2_rs, C_rdtemp_dlt * pParam->HSMHV2_rs, T0 ); -#ifdef HSMHV2EVAL - Rs0_dT = ( modelMKS->HSMHV2_rdtemp1 + 2.0 * TTEMP * modelMKS->HSMHV2_rdtemp2 ) * T2 * T0 ; -#endif - } - - } else { - here->HSMHV2_rs = 0.0 ; - } - if ( pParam->HSMHV2_rdvd > 0.0 ) { - T4 = here->HSMHV2_rdvdtemp0 * ( here->HSMHV2_ldrift1 * pParam->HSMHV2_rdslp1 * C_m2um + pParam->HSMHV2_rdict1 ) - * ( here->HSMHV2_ldrift2 * model->HSMHV2_rdslp2 * C_m2um + model->HSMHV2_rdict2 ) ; - - T1 = ( 1 - pParam->HSMHV2_rdov13 ) * here->HSMHV2_loverld * C_m2um ; - T0 = - model->HSMHV2_rdov11 / ( model->HSMHV2_rdov12 + small ) ; - T3 = ( T0 * here->HSMHV2_loverld * C_m2um + 1.0 + model->HSMHV2_rdov11 ) ; - Fn_SL( T5 , T3 * T4 , T4 , 10.0e-3 , T6 ) ; - Fn_SU( T7 , T5 , T4 * ( model->HSMHV2_rdov11 + 1.0) , 50.0e-6 , T6 ) ; - Fn_SL( T2 , T7 + T1 * T4 , 0, 50.0e-6 , T6 ) ; - - if ( model->HSMHV2_cotemp == 0 || model->HSMHV2_cotemp == 1 ) { /* without deltemp (COTEMP=0,1) */ - here->HSMHV2_rdvd = ( pParam->HSMHV2_rdvd + modelMKS->HSMHV2_rdvdtemp1 * Tdiff0 + modelMKS->HSMHV2_rdvdtemp2 * Tdiff0_2 ) * T2 ; - Fn_SL( here->HSMHV2_rdvd, here->HSMHV2_rdvd, C_rdtemp_min * pParam->HSMHV2_rdvd, C_rdtemp_dlt * pParam->HSMHV2_rdvd, T0 ); -#ifdef HSMHV2EVAL - Rdvd_dT = 0.0 ; -#endif - } else { /* with deltemp (COTEMP=2,3) */ - here->HSMHV2_rdvd = ( pParam->HSMHV2_rdvd + modelMKS->HSMHV2_rdvdtemp1 * Tdiff + modelMKS->HSMHV2_rdvdtemp2 * Tdiff_2 ) * T2 ; - Fn_SL( here->HSMHV2_rdvd, here->HSMHV2_rdvd, C_rdtemp_min * pParam->HSMHV2_rdvd, C_rdtemp_dlt * pParam->HSMHV2_rdvd, T0 ); -#ifdef HSMHV2EVAL - Rdvd_dT = ( modelMKS->HSMHV2_rdvdtemp1 + 2.0 * TTEMP * modelMKS->HSMHV2_rdvdtemp2 ) * T2 * T0 ; -#endif - } - - T4 = here->HSMHV2_rdvdtemp0 * ( here->HSMHV2_ldrift1s * pParam->HSMHV2_rdslp1 * C_m2um + pParam->HSMHV2_rdict1 ) - * ( here->HSMHV2_ldrift2s * model->HSMHV2_rdslp2 * C_m2um + model->HSMHV2_rdict2 ) ; - - T1 = ( 1 - pParam->HSMHV2_rdov13 ) * here->HSMHV2_lovers * C_m2um ; - T0 = - model->HSMHV2_rdov11 / ( model->HSMHV2_rdov12 + small ) ; - T3 = ( T0 * here->HSMHV2_lovers * C_m2um + 1.0 + model->HSMHV2_rdov11 ) ; - Fn_SL( T5 , T3 * T4 , T4 , 10.0e-3 , T6 ) ; - Fn_SU( T7 , T5 , T4 * ( model->HSMHV2_rdov11 + 1.0) , 50.0e-6 , T6 ) ; - Fn_SL( T2 , T7 + T1 * T4 , 0, 50.0e-6 , T6 ) ; - - if ( model->HSMHV2_cotemp == 0 || model->HSMHV2_cotemp == 1 ) { /* without deltemp (COTEMP=0,1) */ - here->HSMHV2_rsvd = ( pParam->HSMHV2_rdvd + modelMKS->HSMHV2_rdvdtemp1 * Tdiff0 + modelMKS->HSMHV2_rdvdtemp2 * Tdiff0_2 ) * T2 ; - Fn_SL( here->HSMHV2_rsvd, here->HSMHV2_rsvd, C_rdtemp_min * pParam->HSMHV2_rdvd, C_rdtemp_dlt * pParam->HSMHV2_rdvd, T0 ); -#ifdef HSMHV2EVAL - Rsvd_dT = 0.0 ; -#endif - } else { /* with deltemp (COTEMP=2,3) */ - here->HSMHV2_rsvd = ( pParam->HSMHV2_rdvd + modelMKS->HSMHV2_rdvdtemp1 * Tdiff + modelMKS->HSMHV2_rdvdtemp2 * Tdiff_2 ) * T2 ; - Fn_SL( here->HSMHV2_rsvd, here->HSMHV2_rsvd, C_rdtemp_min * pParam->HSMHV2_rdvd, C_rdtemp_dlt * pParam->HSMHV2_rdvd, T0 ); -#ifdef HSMHV2EVAL - Rsvd_dT = ( modelMKS->HSMHV2_rdvdtemp1 + 2.0 * TTEMP * modelMKS->HSMHV2_rdvdtemp2 ) * T2 * T0 ; -#endif - } - } else { - here->HSMHV2_rdvd = 0.0 ; - here->HSMHV2_rsvd = 0.0 ; - } - - - - - /* costi0 and costi1 for STI transistor model (temperature-dependent part) */ - here->HSMHV2_costi0 = here->HSMHV2_costi00 * sqrt(here->HSMHV2_beta_inv) ; - here->HSMHV2_costi0_p2 = here->HSMHV2_costi0 * here->HSMHV2_costi0 ; - here->HSMHV2_costi1 = here->HSMHV2_nin * here->HSMHV2_nin * here->HSMHV2_nsti_p2 ; - -/* end of HSMHV2temp_eval.h */ diff --git a/src/spicelib/devices/hisimhv2/hsmhv2temp_eval_dio.h b/src/spicelib/devices/hisimhv2/hsmhv2temp_eval_dio.h deleted file mode 100644 index 8620c74fb..000000000 --- a/src/spicelib/devices/hisimhv2/hsmhv2temp_eval_dio.h +++ /dev/null @@ -1,223 +0,0 @@ -/*********************************************************************** - - HiSIM (Hiroshima University STARC IGFET Model) - Copyright (C) 2014 Hiroshima University & STARC - - MODEL NAME : HiSIM_HV - ( VERSION : 2 SUBVERSION : 2 REVISION : 0 ) - Model Parameter 'VERSION' : 2.20 - FILE : hsmhvtemp_eval_dio.h - - DATE : 2014.6.11 - - released by - Hiroshima University & - Semiconductor Technology Academic Research Center (STARC) -***********************************************************************/ - -/********************************************************************** - -The following source code, and all copyrights, trade secrets or other -intellectual property rights in and to the source code in its entirety, -is owned by the Hiroshima University and the STARC organization. - -All users need to follow the "HISIM_HV Distribution Statement and -Copyright Notice" attached to HiSIM_HV model. - ------HISIM_HV Distribution Statement and Copyright Notice-------------- - -Software is distributed as is, completely without warranty or service -support. Hiroshima University or STARC and its employees are not liable -for the condition or performance of the software. - -Hiroshima University and STARC own the copyright and grant users a perpetual, -irrevocable, worldwide, non-exclusive, royalty-free license with respect -to the software as set forth below. - -Hiroshima University and STARC hereby disclaims all implied warranties. - -Hiroshima University and STARC grant the users the right to modify, copy, -and redistribute the software and documentation, both within the user's -organization and externally, subject to the following restrictions - -1. The users agree not to charge for Hiroshima University and STARC code -itself but may charge for additions, extensions, or support. - -2. In any product based on the software, the users agree to acknowledge -Hiroshima University and STARC that developed the software. This -acknowledgment shall appear in the product documentation. - -3. The users agree to reproduce any copyright notice which appears on -the software on any copy or modification of such made available -to others." - -Toshimasa Asahara, President, Hiroshima University -Mitiko Miura-Mattausch, Professor, Hiroshima University -Katsuhiro Shimohigashi, President&CEO, STARC -June 2008 (revised October 2011) -*************************************************************************/ - -#define small 1.0e-50 - - TTEMP = ckt->CKTtemp; - if ( here->HSMHV2_dtemp_Given ) { TTEMP = TTEMP + here->HSMHV2_dtemp ; } - TTEMP0 = TTEMP ; -#ifdef HSMHV2EVAL - /* Self heating */ - TTEMP = TTEMP + deltemp ; -#endif - - - /* Band gap */ - T1 = TTEMP - model->HSMHV2_ktnom ; - T2 = TTEMP * TTEMP - model->HSMHV2_ktnom * model->HSMHV2_ktnom ; - Eg = here->HSMHV2_egtnom - pParam->HSMHV2_bgtmp1 * T1 - - pParam->HSMHV2_bgtmp2 * T2 ; -#ifdef HSMHV2EVAL - Eg_dT = -pParam->HSMHV2_bgtmp1 - 2.0e0 * TTEMP * pParam->HSMHV2_bgtmp2 ; -#endif - - - /* Inverse of the thermal voltage */ - here->HSMHV2_beta = beta = C_QE / (C_KB * TTEMP) ; - here->HSMHV2_beta_inv = 1.0 / beta ; - here->HSMHV2_beta2 = beta * beta ; - here->HSMHV2_betatnom = C_QE / (C_KB * model->HSMHV2_ktnom) ; -#ifdef HSMHV2EVAL - beta_dT=-C_QE/(C_KB*TTEMP*TTEMP); - beta_inv_dT = C_KB / C_QE ; -#endif - - - log_Tratio = log (here->HSMHV2_Tratio) ; - /* for substrate-drain junction diode. */ - js = pParam->HSMHV2_js0d - * exp ((here->HSMHV2_egtnom * here->HSMHV2_betatnom - Eg * beta - + model->HSMHV2_xtid * log_Tratio) / pParam->HSMHV2_njd) ; - jssw = pParam->HSMHV2_js0swd - * exp ((here->HSMHV2_egtnom * here->HSMHV2_betatnom - Eg * beta - + model->HSMHV2_xtid * log_Tratio) / model->HSMHV2_njswd) ; - - js2 = pParam->HSMHV2_js0d - * exp ((here->HSMHV2_egtnom * here->HSMHV2_betatnom - Eg * beta - + model->HSMHV2_xti2d * log_Tratio) / pParam->HSMHV2_njd) ; - jssw2 = pParam->HSMHV2_js0swd - * exp ((here->HSMHV2_egtnom * here->HSMHV2_betatnom - Eg * beta - + model->HSMHV2_xti2d * log_Tratio) / model->HSMHV2_njswd) ; - -#ifdef HSMHV2EVAL - T0 = - Eg * beta_dT - Eg_dT * beta ; /* Self heating */ - T1 = T0 + model->HSMHV2_xtid / TTEMP ; /* Self heating */ - T2 = T0 + model->HSMHV2_xti2d / TTEMP ; /* Self heating */ - - js_dT = js * T1 / pParam->HSMHV2_njd; /* Self heating */ - jssw_dT = jssw * T1/ model->HSMHV2_njswd ; /* Self heating */ - js2_dT = js2 * T2 / pParam->HSMHV2_njd; /* Self heating */ - jssw2_dT = jssw2 * T2 / model->HSMHV2_njswd; /* Self heating */ -#endif - - here->HSMHV2_isbd = here->HSMHV2_ad * js + here->HSMHV2_pd * jssw ; - here->HSMHV2_isbd2 = here->HSMHV2_ad * js2 + here->HSMHV2_pd * jssw2 ; - -#ifdef HSMHV2EVAL - isbd_dT = here->HSMHV2_ad * js_dT + here->HSMHV2_pd * jssw_dT ; /* Self heating */ - isbd2_dT = here->HSMHV2_ad * js2_dT + here->HSMHV2_pd * jssw2_dT ; /* Self heating */ -#endif - - - T0 = here->HSMHV2_Tratio * here->HSMHV2_Tratio ; - T2 = here->HSMHV2_isbd + small ; -#ifdef HSMHV2EVAL - T1_dT = 1.0 / model->HSMHV2_ktnom ; /* Self heating */ - T0_dT = 2.0 * here->HSMHV2_Tratio * T1_dT ; /* Self heating */ - T2_dT = isbd_dT ; /* Self heating */ -#endif - - here->HSMHV2_vbdt = pParam->HSMHV2_njd / beta - * log ( pParam->HSMHV2_vdiffjd * T0 / T2 + 1.0 ) ; - - here->HSMHV2_exptempd = exp (( here->HSMHV2_Tratio - 1.0 ) * model->HSMHV2_ctempd ) ; - -#ifdef HSMHV2EVAL - vbdt_dT = - beta_dT / beta * here->HSMHV2_vbdt - + pParam->HSMHV2_njd / beta * pParam->HSMHV2_vdiffjd / ( pParam->HSMHV2_vdiffjd * T0 / T2 + 1.0 ) - * ( T0_dT / T2 - T0 / T2 / T2 * T2_dT ) ; /* Self heating */ -#endif - - here->HSMHV2_jd_nvtm_invd = 1.0 / ( pParam->HSMHV2_njd / beta ) ; - here->HSMHV2_jd_expcd = exp (here->HSMHV2_vbdt * here->HSMHV2_jd_nvtm_invd ) ; - -#ifdef HSMHV2EVAL - exptempd_dT = model->HSMHV2_ctempd / model->HSMHV2_ktnom * here->HSMHV2_exptempd ; /* Self heating */ - jd_nvtm_invd_dT = beta_dT / pParam->HSMHV2_njd ; /* Self heating */ - jd_expcd_dT = here->HSMHV2_jd_expcd - * ( vbdt_dT * here->HSMHV2_jd_nvtm_invd + here->HSMHV2_vbdt * jd_nvtm_invd_dT ) ; /* Self heating */ -#endif - - - /* for substrate-source junction diode. */ - js = pParam->HSMHV2_js0s - * exp ((here->HSMHV2_egtnom * here->HSMHV2_betatnom - Eg * beta - + model->HSMHV2_xtis * log_Tratio) / pParam->HSMHV2_njs) ; - jssw = pParam->HSMHV2_js0sws - * exp ((here->HSMHV2_egtnom * here->HSMHV2_betatnom - Eg * beta - + model->HSMHV2_xtis * log_Tratio) / model->HSMHV2_njsws) ; - - js2 = pParam->HSMHV2_js0s - * exp ((here->HSMHV2_egtnom * here->HSMHV2_betatnom - Eg * beta - + model->HSMHV2_xti2s * log_Tratio) / pParam->HSMHV2_njs) ; - jssw2 = pParam->HSMHV2_js0sws - * exp ((here->HSMHV2_egtnom * here->HSMHV2_betatnom - Eg * beta - + model->HSMHV2_xti2s * log_Tratio) / model->HSMHV2_njsws) ; - -#ifdef HSMHV2EVAL - T0 = - Eg * beta_dT - Eg_dT * beta ; /* Self heating */ - T1 = T0 + model->HSMHV2_xtis / TTEMP ; /* Self heating */ - T2 = T0 + model->HSMHV2_xti2s / TTEMP ; /* Self heating */ - - js_dT = js * T1 / pParam->HSMHV2_njs; /* Self heating */ - jssw_dT = jssw * T1/ model->HSMHV2_njsws ; /* Self heating */ - js2_dT = js2 * T2 / pParam->HSMHV2_njs; /* Self heating */ - jssw2_dT = jssw2 * T2 / model->HSMHV2_njsws; /* Self heating */ -#endif - - here->HSMHV2_isbs = here->HSMHV2_as * js + here->HSMHV2_ps * jssw ; - here->HSMHV2_isbs2 = here->HSMHV2_as * js2 + here->HSMHV2_ps * jssw2 ; - -#ifdef HSMHV2EVAL - isbs_dT = here->HSMHV2_as * js_dT + here->HSMHV2_ps * jssw_dT ; /* Self heating */ - isbs2_dT = here->HSMHV2_as * js2_dT + here->HSMHV2_ps * jssw2_dT ; /* Self heating */ -#endif - - - T0 = here->HSMHV2_Tratio * here->HSMHV2_Tratio ; - T3 = here->HSMHV2_isbs + small ; -#ifdef HSMHV2EVAL - T1_dT = 1.0 / model->HSMHV2_ktnom ; /* Self heating */ - T0_dT = 2.0 * here->HSMHV2_Tratio * T1_dT ; /* Self heating */ - T3_dT = isbs_dT ; /* Self heating */ -#endif - - here->HSMHV2_vbst = pParam->HSMHV2_njs / beta - * log ( pParam->HSMHV2_vdiffjs * T0 / T3 + 1.0 ) ; - - here->HSMHV2_exptemps = exp (( here->HSMHV2_Tratio - 1.0 ) * model->HSMHV2_ctemps ) ; - -#ifdef HSMHV2EVAL - vbst_dT = - beta_dT / beta * here->HSMHV2_vbst - + pParam->HSMHV2_njs / beta * pParam->HSMHV2_vdiffjs / ( pParam->HSMHV2_vdiffjs * T0 / T3 + 1.0 ) - * ( T0_dT / T3 - T0 / T3 / T3 * T3_dT ) ; /* Self heating */ -#endif - - here->HSMHV2_jd_nvtm_invs = 1.0 / ( pParam->HSMHV2_njs / beta ) ; - here->HSMHV2_jd_expcs = exp (here->HSMHV2_vbst * here->HSMHV2_jd_nvtm_invs ) ; - -#ifdef HSMHV2EVAL - exptemps_dT = model->HSMHV2_ctemps / model->HSMHV2_ktnom * here->HSMHV2_exptemps ; /* Self heating */ - jd_nvtm_invs_dT = beta_dT / pParam->HSMHV2_njs ; /* Self heating */ - jd_expcs_dT = here->HSMHV2_jd_expcs - * ( vbst_dT * here->HSMHV2_jd_nvtm_invs + here->HSMHV2_vbst * jd_nvtm_invs_dT ) ; /* Self heating */ -#endif - - -/* end of HSMHV2temp_eval_dio.h */ diff --git a/src/spicelib/devices/hisimhv2/hsmhv2temp_eval_rdri.h b/src/spicelib/devices/hisimhv2/hsmhv2temp_eval_rdri.h deleted file mode 100644 index 7fe7a9ab6..000000000 --- a/src/spicelib/devices/hisimhv2/hsmhv2temp_eval_rdri.h +++ /dev/null @@ -1,103 +0,0 @@ -/*********************************************************************** - - HiSIM (Hiroshima University STARC IGFET Model) - Copyright (C) 2014 Hiroshima University & STARC - - MODEL NAME : HiSIM_HV - ( VERSION : 2 SUBVERSION : 2 REVISION : 0 ) - Model Parameter 'VERSION' : 2.20 - FILE : hsmhvtemp_eval_rdri.h - - DATE : 2014.6.11 - - released by - Hiroshima University & - Semiconductor Technology Academic Research Center (STARC) -***********************************************************************/ - -/********************************************************************** - -The following source code, and all copyrights, trade secrets or other -intellectual property rights in and to the source code in its entirety, -is owned by the Hiroshima University and the STARC organization. - -All users need to follow the "HISIM_HV Distribution Statement and -Copyright Notice" attached to HiSIM_HV model. - ------HISIM_HV Distribution Statement and Copyright Notice-------------- - -Software is distributed as is, completely without warranty or service -support. Hiroshima University or STARC and its employees are not liable -for the condition or performance of the software. - -Hiroshima University and STARC own the copyright and grant users a perpetual, -irrevocable, worldwide, non-exclusive, royalty-free license with respect -to the software as set forth below. - -Hiroshima University and STARC hereby disclaims all implied warranties. - -Hiroshima University and STARC grant the users the right to modify, copy, -and redistribute the software and documentation, both within the user's -organization and externally, subject to the following restrictions - -1. The users agree not to charge for Hiroshima University and STARC code -itself but may charge for additions, extensions, or support. - -2. In any product based on the software, the users agree to acknowledge -Hiroshima University and STARC that developed the software. This -acknowledgment shall appear in the product documentation. - -3. The users agree to reproduce any copyright notice which appears on -the software on any copy or modification of such made available -to others." - -Toshimasa Asahara, President, Hiroshima University -Mitiko Miura-Mattausch, Professor, Hiroshima University -Katsuhiro Shimohigashi, President&CEO, STARC -June 2008 (revised October 2011) -*************************************************************************/ - - TTEMP = ckt->CKTtemp; - if ( here->HSMHV2_dtemp_Given ) { TTEMP = TTEMP + here->HSMHV2_dtemp ; } - TTEMP0 = TTEMP ; -#ifdef HSMHV2EVAL - /* Self heating */ - TTEMP = TTEMP + deltemp ; -#endif - - - /* Phonon Scattering (temperature-dependent part) */ - T1 = Fn_Pow ( here->HSMHV2_Tratio, model->HSMHV2_rdrmuetmp ) ; - here->HSMHV2_rdrmue = modelMKS->HSMHV2_rdrmue / T1 ; -#ifdef HSMHV2EVAL - T1_dT = model->HSMHV2_rdrmuetmp * Fn_Pow( here->HSMHV2_Tratio, model->HSMHV2_rdrmuetmp - 1.0 ) - / model->HSMHV2_ktnom ; - Mu0_dT = - modelMKS->HSMHV2_rdrmue / ( T1 * T1 ) * T1_dT ; -#endif - - - /* Velocity Temperature Dependence */ - T0 = 1.8 + 0.4 * here->HSMHV2_Tratio + 0.1 * here->HSMHV2_Tratio * here->HSMHV2_Tratio - model->HSMHV2_rdrvtmp * ( 1.0 - here->HSMHV2_Tratio ) ; -#ifdef HSMHV2EVAL - T0_dT = 1 / model->HSMHV2_ktnom * ( 0.4 + 0.2 * here->HSMHV2_Tratio + model->HSMHV2_rdrvtmp ) ; -#endif - here->HSMHV2_rdrvmax = modelMKS->HSMHV2_rdrvmax / T0 ; -#ifdef HSMHV2EVAL - Vmax_dT = - modelMKS->HSMHV2_rdrvmax / ( T0 * T0 ) * T0_dT ; -#endif - - - here->HSMHV2_rdrcx = model->HSMHV2_rdrcx ; - here->HSMHV2_rdrcar = model->HSMHV2_rdrcar ; -#ifdef HSMHV2EVAL - Cx_dT = 0.0 ; - Car_dT = 0.0 ; -#endif - - //Toshiba model // - here->HSMHV2_rdrbb = model->HSMHV2_rdrbb+model->HSMHV2_rdrbbtmp*(TTEMP-model->HSMHV2_ktnom) ; -#ifdef HSMHV2EVAL - Rdrbb_dT = model->HSMHV2_rdrbbtmp ; -#endif - -/* end of HSMHV2temp_eval_rdri.h */ diff --git a/src/spicelib/devices/hisimhv2/hsmhv2trunc.c b/src/spicelib/devices/hisimhv2/hsmhv2trunc.c deleted file mode 100644 index 2b68b87fb..000000000 --- a/src/spicelib/devices/hisimhv2/hsmhv2trunc.c +++ /dev/null @@ -1,101 +0,0 @@ -/*********************************************************************** - - HiSIM (Hiroshima University STARC IGFET Model) - Copyright (C) 2014 Hiroshima University & STARC - - MODEL NAME : HiSIM_HV - ( VERSION : 2 SUBVERSION : 2 REVISION : 0 ) - Model Parameter 'VERSION' : 2.20 - FILE : hsmhvtrunc.c - - DATE : 2014.6.11 - - released by - Hiroshima University & - Semiconductor Technology Academic Research Center (STARC) -***********************************************************************/ - -/********************************************************************** - -The following source code, and all copyrights, trade secrets or other -intellectual property rights in and to the source code in its entirety, -is owned by the Hiroshima University and the STARC organization. - -All users need to follow the "HISIM_HV Distribution Statement and -Copyright Notice" attached to HiSIM_HV model. - ------HISIM_HV Distribution Statement and Copyright Notice-------------- - -Software is distributed as is, completely without warranty or service -support. Hiroshima University or STARC and its employees are not liable -for the condition or performance of the software. - -Hiroshima University and STARC own the copyright and grant users a perpetual, -irrevocable, worldwide, non-exclusive, royalty-free license with respect -to the software as set forth below. - -Hiroshima University and STARC hereby disclaims all implied warranties. - -Hiroshima University and STARC grant the users the right to modify, copy, -and redistribute the software and documentation, both within the user's -organization and externally, subject to the following restrictions - -1. The users agree not to charge for Hiroshima University and STARC code -itself but may charge for additions, extensions, or support. - -2. In any product based on the software, the users agree to acknowledge -Hiroshima University and STARC that developed the software. This -acknowledgment shall appear in the product documentation. - -3. The users agree to reproduce any copyright notice which appears on -the software on any copy or modification of such made available -to others." - -Toshimasa Asahara, President, Hiroshima University -Mitiko Miura-Mattausch, Professor, Hiroshima University -Katsuhiro Shimohigashi, President&CEO, STARC -June 2008 (revised October 2011) -*************************************************************************/ - -#include "ngspice/ngspice.h" -#include "ngspice/cktdefs.h" -#include "hsmhv2def.h" -#include "ngspice/sperror.h" -#include "ngspice/suffix.h" - -int HSMHV2trunc( - GENmodel *inModel, - CKTcircuit *ckt, - double *timeStep) -{ - HSMHV2model *model = (HSMHV2model*)inModel; - HSMHV2instance *here; -#ifdef STEPDEBUG - double debugtemp=0.0 ; -#endif /* STEPDEBUG */ - - for ( ;model != NULL ;model = HSMHV2nextModel(model)) { - for ( here=HSMHV2instances(model);here!=NULL ; - here = HSMHV2nextInstance(here)) { -#ifdef STEPDEBUG - debugtemp = *timeStep; -#endif /* STEPDEBUG */ - CKTterr(here->HSMHV2qb,ckt,timeStep); - CKTterr(here->HSMHV2qg,ckt,timeStep); - CKTterr(here->HSMHV2qd,ckt,timeStep); - - CKTterr(here->HSMHV2qbs,ckt,timeStep); - CKTterr(here->HSMHV2qbd,ckt,timeStep); - CKTterr(here->HSMHV2qfd,ckt,timeStep); - CKTterr(here->HSMHV2qfs,ckt,timeStep); - - -#ifdef STEPDEBUG - if ( debugtemp != *timeStep ) - printf("device %s reduces step from %g to %g\n", - here->HSMHV2name, debugtemp, *timeStep); -#endif /* STEPDEBUG */ - } - } - return(OK); -} diff --git a/src/spicelib/devices/jfet/Makefile.am b/src/spicelib/devices/jfet/Makefile.am deleted file mode 100644 index 8c4bed573..000000000 --- a/src/spicelib/devices/jfet/Makefile.am +++ /dev/null @@ -1,31 +0,0 @@ -## Process this file with automake to produce Makefile.in - -noinst_LTLIBRARIES = libjfet.la - -libjfet_la_SOURCES = \ - jfet.c \ - jfetacld.c \ - jfetask.c \ - jfetdefs.h \ - jfetdist.c \ - jfetdset.c \ - jfetext.h \ - jfetic.c \ - jfetinit.c \ - jfetinit.h \ - jfetitf.h \ - jfetload.c \ - jfetmask.c \ - jfetmpar.c \ - jfetnoi.c \ - jfetpar.c \ - jfetpzld.c \ - jfetset.c \ - jfettemp.c \ - jfettrun.c - - - -AM_CPPFLAGS = @AM_CPPFLAGS@ -I$(top_srcdir)/src/include -AM_CFLAGS = $(STATIC) -MAINTAINERCLEANFILES = Makefile.in diff --git a/src/spicelib/devices/jfet/jfet.c b/src/spicelib/devices/jfet/jfet.c deleted file mode 100644 index 29fc05982..000000000 --- a/src/spicelib/devices/jfet/jfet.c +++ /dev/null @@ -1,93 +0,0 @@ -/********** -Copyright 1990 Regents of the University of California. All rights reserved. -Author: 1985 Thomas L. Quarles -Sydney University mods Copyright(c) 1989 Anthony E. Parker, David J. Skellern - Laboratory for Communication Science Engineering - Sydney University Department of Electrical Engineering, Australia -**********/ - -#include "ngspice/ngspice.h" -#include "ngspice/ifsim.h" -#include "ngspice/devdefs.h" -#include "jfetdefs.h" -#include "ngspice/suffix.h" - -IFparm JFETpTable[] = { /* device parameters */ - IOPU("off", JFET_OFF, IF_FLAG, "Device initially off"), - IOPAU("ic", JFET_IC, IF_REALVEC,"Initial VDS,VGS vector"), - IOPU("area", JFET_AREA, IF_REAL, "Area factor"), - IOPU("m", JFET_M, IF_REAL, "Parallel multiplier"), - IOPAU("ic-vds", JFET_IC_VDS, IF_REAL, "Initial D-S voltage"), - IOPAU("ic-vgs", JFET_IC_VGS, IF_REAL, "Initial G-S volrage"), - IOPU("temp", JFET_TEMP, IF_REAL, "Instance temperature"), - IOPU("dtemp", JFET_DTEMP, IF_REAL, "Instance temperature difference"), - OPU("drain-node", JFET_DRAINNODE, IF_INTEGER,"Number of drain node"), - OPU("gate-node", JFET_GATENODE, IF_INTEGER,"Number of gate node"), - OPU("source-node", JFET_SOURCENODE, IF_INTEGER,"Number of source node"), - OPU("drain-prime-node", JFET_DRAINPRIMENODE, IF_INTEGER,"Internal drain node"), - OPU("source-prime-node",JFET_SOURCEPRIMENODE,IF_INTEGER, - "Internal source node"), - OP("vgs", JFET_VGS, IF_REAL, "Voltage G-S"), - OP("vgd", JFET_VGD, IF_REAL, "Voltage G-D"), - OP("ig", JFET_CG, IF_REAL, "Current at gate node"), - OP("id", JFET_CD, IF_REAL, "Current at drain node"), - OP("is", JFET_CS, IF_REAL, "Source current"), - OP("igd", JFET_CGD, IF_REAL, "Current G-D"), - OP("gm", JFET_GM, IF_REAL, "Transconductance"), - OP("gds", JFET_GDS, IF_REAL, "Conductance D-S"), - OP("ggs", JFET_GGS, IF_REAL, "Conductance G-S"), - OP("ggd", JFET_GGD, IF_REAL, "Conductance G-D"), - OPU("qgs", JFET_QGS, IF_REAL,"Charge storage G-S junction"), - OPU("qgd", JFET_QGD, IF_REAL,"Charge storage G-D junction"), - OPU("cqgs",JFET_CQGS, IF_REAL, - "Capacitance due to charge storage G-S junction"), - OPU("cqgd",JFET_CQGD, IF_REAL, - "Capacitance due to charge storage G-D junction"), - OPU("p", JFET_POWER,IF_REAL,"Power dissipated by the JFET"), -}; - -IFparm JFETmPTable[] = { /* model parameters */ - OP("type", JFET_MOD_TYPE, IF_STRING, "N-type or P-type JFET model"), - IP("njf", JFET_MOD_NJF, IF_FLAG,"N type JFET model"), - IP("pjf", JFET_MOD_PJF, IF_FLAG,"P type JFET model"), - IOP("vt0", JFET_MOD_VTO, IF_REAL,"Threshold voltage"), - IOPR("vto", JFET_MOD_VTO, IF_REAL,"Threshold voltage"), - IOP("beta", JFET_MOD_BETA, IF_REAL,"Transconductance parameter"), - IOP("lambda", JFET_MOD_LAMBDA, IF_REAL,"Channel length modulation param."), - IOP("rd", JFET_MOD_RD, IF_REAL,"Drain ohmic resistance"), - OPU("gd", JFET_MOD_DRAINCONDUCT, IF_REAL,"Drain conductance"), - IOP("rs", JFET_MOD_RS, IF_REAL,"Source ohmic resistance"), - OPU("gs",JFET_MOD_SOURCECONDUCT,IF_REAL,"Source conductance"), - IOPA("cgs", JFET_MOD_CGS, IF_REAL,"G-S junction capactance"), - IOPA("cgd", JFET_MOD_CGD, IF_REAL,"G-D junction cap"), - IOP("pb", JFET_MOD_PB, IF_REAL,"Gate junction potential"), - IOP("is", JFET_MOD_IS, IF_REAL,"Gate junction saturation current"), - IOP("fc", JFET_MOD_FC, IF_REAL,"Forward bias junction fit parm."), - /* Modification for Sydney University JFET model */ - IOP("b", JFET_MOD_B, IF_REAL,"Doping tail parameter"), - /* end Sydney University mod. */ - IOPU("tnom", JFET_MOD_TNOM, IF_REAL,"parameter measurement temperature"), - IOP("tcv", JFET_MOD_TCV, IF_REAL, "Threshold voltage temperature coefficient"), - IOP("vtotc", JFET_MOD_VTOTC, IF_REAL, "Threshold voltage temperature coefficient alternative"), - IOP("bex", JFET_MOD_BEX, IF_REAL, "Mobility temperature exponent"), - IOP("betatce", JFET_MOD_BETATCE, IF_REAL, "Mobility temperature exponent alternative"), - IOP("xti", JFET_MOD_XTI, IF_REAL, "Gate junction saturation current temperature exponent"), - IOP("eg", JFET_MOD_EG, IF_REAL, "Bandgap voltage"), - IOP("kf", JFET_MOD_KF, IF_REAL, "Flicker Noise Coefficient"), - IOP("af", JFET_MOD_AF, IF_REAL, "Flicker Noise Exponent"), - IOP("nlev",JFET_MOD_NLEV, IF_INTEGER, "Noise equation selector"), - IOP("gdsnoi", JFET_MOD_GDSNOI, IF_REAL, "Channel noise coefficient") -}; - - -char *JFETnames[] = { - "Drain", - "Gate", - "Source" -}; - -int JFETnSize = NUMELEMS(JFETnames); -int JFETpTSize = NUMELEMS(JFETpTable); -int JFETmPTSize = NUMELEMS(JFETmPTable); -int JFETiSize = sizeof(JFETinstance); -int JFETmSize = sizeof(JFETmodel); diff --git a/src/spicelib/devices/jfet/jfetacld.c b/src/spicelib/devices/jfet/jfetacld.c deleted file mode 100644 index c75530b7d..000000000 --- a/src/spicelib/devices/jfet/jfetacld.c +++ /dev/null @@ -1,73 +0,0 @@ -/********** -Copyright 1990 Regents of the University of California. All rights reserved. -Author: 1985 Thomas L. Quarles -**********/ -/* - */ - -#include "ngspice/ngspice.h" -#include "ngspice/cktdefs.h" -#include "jfetdefs.h" -#include "ngspice/sperror.h" -#include "ngspice/suffix.h" - - -int -JFETacLoad(GENmodel *inModel, CKTcircuit *ckt) -{ - JFETmodel *model = (JFETmodel*)inModel; - JFETinstance *here; - double gdpr; - double gspr; - double gm; - double gds; - double ggs; - double xgs; - double ggd; - double xgd; - - double m; - - for( ; model != NULL; model = JFETnextModel(model)) { - - for( here = JFETinstances(model); here != NULL; - here = JFETnextInstance(here)) { - - gdpr=model->JFETdrainConduct * here->JFETarea; - gspr=model->JFETsourceConduct * here->JFETarea; - gm= *(ckt->CKTstate0 + here->JFETgm) ; - gds= *(ckt->CKTstate0 + here->JFETgds) ; - ggs= *(ckt->CKTstate0 + here->JFETggs) ; - xgs= *(ckt->CKTstate0 + here->JFETqgs) * ckt->CKTomega ; - ggd= *(ckt->CKTstate0 + here->JFETggd) ; - xgd= *(ckt->CKTstate0 + here->JFETqgd) * ckt->CKTomega ; - - m = here->JFETm; - - *(here->JFETdrainDrainPtr ) += m * (gdpr); - *(here->JFETgateGatePtr ) += m * (ggd+ggs); - *(here->JFETgateGatePtr +1) += m * (xgd+xgs); - *(here->JFETsourceSourcePtr ) += m * (gspr); - *(here->JFETdrainPrimeDrainPrimePtr ) += m * (gdpr+gds+ggd); - *(here->JFETdrainPrimeDrainPrimePtr +1) += m * (xgd); - *(here->JFETsourcePrimeSourcePrimePtr ) += m * (gspr+gds+gm+ggs); - *(here->JFETsourcePrimeSourcePrimePtr +1) += m * (xgs); - *(here->JFETdrainDrainPrimePtr ) -= m * (gdpr); - *(here->JFETgateDrainPrimePtr ) -= m * (ggd); - *(here->JFETgateDrainPrimePtr +1) -= m * (xgd); - *(here->JFETgateSourcePrimePtr ) -= m * (ggs); - *(here->JFETgateSourcePrimePtr +1) -= m * (xgs); - *(here->JFETsourceSourcePrimePtr ) -= m * (gspr); - *(here->JFETdrainPrimeDrainPtr ) -= m * (gdpr); - *(here->JFETdrainPrimeGatePtr ) += m * (-ggd+gm); - *(here->JFETdrainPrimeGatePtr +1) -= m * (xgd); - *(here->JFETdrainPrimeSourcePrimePtr ) += m * (-gds-gm); - *(here->JFETsourcePrimeGatePtr ) += m * (-ggs-gm); - *(here->JFETsourcePrimeGatePtr +1) -= m * (xgs); - *(here->JFETsourcePrimeSourcePtr ) -= m * (gspr); - *(here->JFETsourcePrimeDrainPrimePtr ) -= m * (gds); - - } - } - return(OK); -} diff --git a/src/spicelib/devices/jfet/jfetask.c b/src/spicelib/devices/jfet/jfetask.c deleted file mode 100644 index 43396185f..000000000 --- a/src/spicelib/devices/jfet/jfetask.c +++ /dev/null @@ -1,150 +0,0 @@ -/********** -Copyright 1990 Regents of the University of California. All rights reserved. -Author: 1987 Mathew Lew and Thomas L. Quarles -**********/ -/* - */ - -#include "ngspice/ngspice.h" -#include "ngspice/const.h" -#include "ngspice/ifsim.h" -#include "ngspice/cktdefs.h" -#include "ngspice/devdefs.h" -#include "jfetdefs.h" -#include "ngspice/sperror.h" -#include "ngspice/suffix.h" - - -/*ARGSUSED*/ -int -JFETask(CKTcircuit *ckt, GENinstance *inst, int which, IFvalue *value, - IFvalue *select) -{ - JFETinstance *here = (JFETinstance*)inst; - static char *msg = "Current and power not available for ac analysis"; - - NG_IGNORE(select); - - switch(which) { - case JFET_TEMP: - value->rValue = here->JFETtemp-CONSTCtoK; - return(OK); - case JFET_DTEMP: - value->rValue = here->JFETdtemp; - return(OK); - case JFET_AREA: - value->rValue = here->JFETarea; - value->rValue *= here->JFETm; - return(OK); - case JFET_M: - value->rValue = here->JFETm; - return(OK); - case JFET_IC_VDS: - value->rValue = here->JFETicVDS; - return(OK); - case JFET_IC_VGS: - value->rValue = here->JFETicVGS; - return(OK); - case JFET_OFF: - value->iValue = here->JFEToff; - return(OK); - case JFET_DRAINNODE: - value->iValue = here->JFETdrainNode; - return(OK); - case JFET_GATENODE: - value->iValue = here->JFETgateNode; - return(OK); - case JFET_SOURCENODE: - value->iValue = here->JFETsourceNode; - return(OK); - case JFET_DRAINPRIMENODE: - value->iValue = here->JFETdrainPrimeNode; - return(OK); - case JFET_SOURCEPRIMENODE: - value->iValue = here->JFETsourcePrimeNode; - return(OK); - case JFET_VGS: - value->rValue = *(ckt->CKTstate0 + here->JFETvgs); - return(OK); - case JFET_VGD: - value->rValue = *(ckt->CKTstate0 + here->JFETvgd); - return(OK); - case JFET_CG: - value->rValue = *(ckt->CKTstate0 + here->JFETcg); - value->rValue *= here->JFETm; - return(OK); - case JFET_CD: - value->rValue = *(ckt->CKTstate0 + here->JFETcd); - value->rValue *= here->JFETm; - return(OK); - case JFET_CGD: - value->rValue = *(ckt->CKTstate0 + here->JFETcgd); - value->rValue *= here->JFETm; - return(OK); - case JFET_GM: - value->rValue = *(ckt->CKTstate0 + here->JFETgm); - value->rValue *= here->JFETm; - return(OK); - case JFET_GDS: - value->rValue = *(ckt->CKTstate0 + here->JFETgds); - value->rValue *= here->JFETm; - return(OK); - case JFET_GGS: - value->rValue = *(ckt->CKTstate0 + here->JFETggs); - value->rValue *= here->JFETm; - return(OK); - case JFET_GGD: - value->rValue = *(ckt->CKTstate0 + here->JFETggd); - value->rValue *= here->JFETm; - return(OK); - case JFET_QGS: - value->rValue = *(ckt->CKTstate0 + here->JFETqgs); - value->rValue *= here->JFETm; - return(OK); - case JFET_CQGS: - value->rValue = *(ckt->CKTstate0 + here->JFETcqgs); - value->rValue *= here->JFETm; - return(OK); - case JFET_QGD: - value->rValue = *(ckt->CKTstate0 + here->JFETqgd); - value->rValue *= here->JFETm; - return(OK); - case JFET_CQGD: - value->rValue = *(ckt->CKTstate0 + here->JFETcqgd); - value->rValue *= here->JFETm; - return(OK); - case JFET_CS : - if (ckt->CKTcurrentAnalysis & DOING_AC) { - errMsg = TMALLOC(char, strlen(msg) + 1); - errRtn = "JFETask"; - strcpy(errMsg,msg); - return(E_ASKCURRENT); - } else { - value->rValue = -*(ckt->CKTstate0 + here->JFETcd); - value->rValue -= *(ckt->CKTstate0 + here->JFETcg); - value->rValue *= here->JFETm; - } - return(OK); - case JFET_POWER : - if (ckt->CKTcurrentAnalysis & DOING_AC) { - errMsg = TMALLOC(char, strlen(msg) + 1); - errRtn = "JFETask"; - strcpy(errMsg,msg); - return(E_ASKPOWER); - } else { - value->rValue = *(ckt->CKTstate0 + here->JFETcd) * - *(ckt->CKTrhsOld + here->JFETdrainNode); - value->rValue += *(ckt->CKTstate0 + here->JFETcg) * - *(ckt->CKTrhsOld + here->JFETgateNode); - value->rValue -= (*(ckt->CKTstate0 + here->JFETcd) + - *(ckt->CKTstate0 + here->JFETcg)) * - *(ckt->CKTrhsOld + here->JFETsourceNode); - value->rValue *= here->JFETm; - } - return(OK); - default: - return(E_BADPARM); - } - /* NOTREACHED */ -} - diff --git a/src/spicelib/devices/jfet/jfetdefs.h b/src/spicelib/devices/jfet/jfetdefs.h deleted file mode 100644 index 15ebe1882..000000000 --- a/src/spicelib/devices/jfet/jfetdefs.h +++ /dev/null @@ -1,329 +0,0 @@ -/********** -Copyright 1990 Regents of the University of California. All rights reserved. -Author: 1985 Thomas L. Quarles -Sydney University mods Copyright(c) 1989 Anthony E. Parker, David J. Skellern - Laboratory for Communication Science Engineering - Sydney University Department of Electrical Engineering, Australia -**********/ - -#ifndef JFET -#define JFET - -#include "ngspice/ifsim.h" -#include "ngspice/gendefs.h" -#include "ngspice/cktdefs.h" -#include "ngspice/complex.h" -#include "ngspice/noisedef.h" - - /* structures used to describe Junction Field Effect Transistors */ - -/* indices to an array of JFET noise sources */ - -enum { - JFETRDNOIZ = 0, - JFETRSNOIZ, - JFETIDNOIZ, - JFETFLNOIZ, - JFETTOTNOIZ, - /* finally, the number of noise sources */ - JFETNSRCS -}; - -/* information used to describe a single instance */ - -typedef struct sJFETinstance { - - struct GENinstance gen; - -#define JFETmodPtr(inst) ((struct sJFETmodel *)((inst)->gen.GENmodPtr)) -#define JFETnextInstance(inst) ((struct sJFETinstance *)((inst)->gen.GENnextInstance)) -#define JFETname gen.GENname -#define JFETstate gen.GENstate - - const int JFETdrainNode; /* number of drain node of jfet */ - const int JFETgateNode; /* number of gate node of jfet */ - const int JFETsourceNode; /* number of source node of jfet */ - int JFETdrainPrimeNode; /* number of internal drain node of jfet */ - int JFETsourcePrimeNode; /* number of internal source node of jfet */ - - double *JFETdrainDrainPrimePtr; /* pointer to sparse matrix at - * (drain,drain prime) */ - double *JFETgateDrainPrimePtr; /* pointer to sparse matrix at - * (gate,drain prime) */ - double *JFETgateSourcePrimePtr; /* pointer to sparse matrix at - * (gate,source prime) */ - double *JFETsourceSourcePrimePtr; /* pointer to sparse matrix at - * (source,source prime) */ - double *JFETdrainPrimeDrainPtr; /* pointer to sparse matrix at - * (drain prime,drain) */ - double *JFETdrainPrimeGatePtr; /* pointer to sparse matrix at - * (drain prime,gate) */ - double *JFETdrainPrimeSourcePrimePtr; /* pointer to sparse matrix - * (drain prime,source prime) */ - double *JFETsourcePrimeGatePtr; /* pointer to sparse matrix at - * (source prime,gate) */ - double *JFETsourcePrimeSourcePtr; /* pointer to sparse matrix at - * (source prime,source) */ - double *JFETsourcePrimeDrainPrimePtr; /* pointer to sparse matrix - * (source prime,drain prime) */ - double *JFETdrainDrainPtr; /* pointer to sparse matrix at - * (drain,drain) */ - double *JFETgateGatePtr; /* pointer to sparse matrix at - * (gate,gate) */ - double *JFETsourceSourcePtr; /* pointer to sparse matrix at - * (source,source) */ - double *JFETdrainPrimeDrainPrimePtr; /* pointer to sparse matrix - * (drain prime,drain prime) */ - double *JFETsourcePrimeSourcePrimePtr; /* pointer to sparse matrix - * (source prime,source prime) */ - - int JFETmode; - /* distortion analysis Taylor coeffs. */ - -/* - * naming convention: - * x = vgs - * y = vds - * cdr = cdrain - */ - -#define JFETNDCOEFFS 21 - -#ifndef NODISTO - double JFETdCoeffs[JFETNDCOEFFS]; -#else /* NODISTO */ - double *JFETdCoeffs; -#endif /* NODISTO */ - -#ifndef CONFIG - -#define cdr_x JFETdCoeffs[0] -#define cdr_y JFETdCoeffs[1] -#define cdr_x2 JFETdCoeffs[2] -#define cdr_y2 JFETdCoeffs[3] -#define cdr_xy JFETdCoeffs[4] -#define cdr_x3 JFETdCoeffs[5] -#define cdr_y3 JFETdCoeffs[6] -#define cdr_x2y JFETdCoeffs[7] -#define cdr_xy2 JFETdCoeffs[8] - -#define ggs1 JFETdCoeffs[9] -#define ggd1 JFETdCoeffs[10] -#define ggs2 JFETdCoeffs[11] -#define ggd2 JFETdCoeffs[12] -#define ggs3 JFETdCoeffs[13] -#define ggd3 JFETdCoeffs[14] -#define capgs1 JFETdCoeffs[15] -#define capgd1 JFETdCoeffs[16] -#define capgs2 JFETdCoeffs[17] -#define capgd2 JFETdCoeffs[18] -#define capgs3 JFETdCoeffs[19] -#define capgd3 JFETdCoeffs[20] - -#endif - -#ifndef NONOISE - double JFETnVar[NSTATVARS][JFETNSRCS]; -#else /* NONOISE */ - double **JFETnVar; -#endif /* NONOISE */ - - unsigned JFEToff :1; /* 'off' flag for jfet */ - unsigned JFETareaGiven : 1; /* flag to indicate area was specified */ - unsigned JFETmGiven : 1; /* flag to indicate parallel multiplier given */ - unsigned JFETicVDSGiven : 1; /* initial condition given flag for V D-S*/ - unsigned JFETicVGSGiven : 1; /* initial condition given flag for V G-S*/ - unsigned JFETtempGiven : 1; /* flag to indicate instance temp given */ - unsigned JFETdtempGiven : 1; /* flag to indicate instance dtemp given */ - - - double JFETarea; /* area factor for the jfet */ - double JFETm; /* Parallel multiplier */ - double JFETicVDS; /* initial condition voltage D-S*/ - double JFETicVGS; /* initial condition voltage G-S*/ - double JFETtemp; /* operating temperature */ - double JFETdtemp; /* instance temperature difference */ - double JFETtSatCur; /* temperature adjusted saturation current */ - double JFETtGatePot; /* temperature adjusted gate potential */ - double JFETtCGS; /* temperature corrected G-S capacitance */ - double JFETtCGD; /* temperature corrected G-D capacitance */ - double JFETcorDepCap; /* joining point of the fwd bias dep. cap eq.s */ - double JFETvcrit; /* critical voltage for the instance */ - double JFETf1; /* coefficient of capacitance polynomial exp */ - double JFETtThreshold; /* temperature adjusted threshold voltage */ - double JFETtBeta; /* temperature adjusted beta */ - -} JFETinstance ; - -#define JFETvgs JFETstate -#define JFETvgd JFETstate+1 -#define JFETcg JFETstate+2 -#define JFETcd JFETstate+3 -#define JFETcgd JFETstate+4 -#define JFETgm JFETstate+5 -#define JFETgds JFETstate+6 -#define JFETggs JFETstate+7 -#define JFETggd JFETstate+8 -#define JFETqgs JFETstate+9 -#define JFETcqgs JFETstate+10 -#define JFETqgd JFETstate+11 -#define JFETcqgd JFETstate+12 - -#define JFETnumStates 13 - -/* per model data */ - -typedef struct sJFETmodel { /* model structure for a jfet */ - - struct GENmodel gen; - -#define JFETmodType gen.GENmodType -#define JFETnextModel(inst) ((struct sJFETmodel *)((inst)->gen.GENnextModel)) -#define JFETinstances(inst) ((JFETinstance *)((inst)->gen.GENinstances)) -#define JFETmodName gen.GENmodName - - int JFETtype; - - double JFETthreshold; - double JFETbeta; - double JFETlModulation; - double JFETdrainResist; - double JFETsourceResist; - double JFETcapGS; - double JFETcapGD; - double JFETgatePotential; - double JFETgateSatCurrent; - double JFETdepletionCapCoeff; - double JFETfNcoef; - double JFETfNexp; - int JFETnlev; - double JFETgdsnoi; - - double JFETdrainConduct; - double JFETsourceConduct; - double JFETf2; - double JFETf3; - /* Modification for Sydney University JFET model */ - double JFETb; /* doping profile parameter */ - double JFETbFac; /* internal derived doping profile parameter */ - /* end Sydney University mod */ - double JFETtnom; /* temperature at which parameters were measured */ - double JFETtcv; - double JFETvtotc; - double JFETbex; - double JFETbetatce; - double JFETxti; - double JFETeg; - - unsigned JFETthresholdGiven : 1; - unsigned JFETbetaGiven : 1; - unsigned JFETlModulationGiven : 1; - unsigned JFETdrainResistGiven : 1; - unsigned JFETsourceResistGiven : 1; - unsigned JFETcapGSGiven : 1; - unsigned JFETcapGDGiven : 1; - unsigned JFETgatePotentialGiven : 1; - unsigned JFETgateSatCurrentGiven : 1; - unsigned JFETdepletionCapCoeffGiven : 1; - /* Modification for Sydney University JFET model */ - unsigned JFETbGiven : 1; - /* end Sydney University mod */ - unsigned JFETtnomGiven : 1; /* user specified Tnom for model */ - unsigned JFETtcvGiven : 1; - unsigned JFETvtotcGiven : 1; - unsigned JFETbexGiven : 1; - unsigned JFETbetatceGiven : 1; - unsigned JFETxtiGiven : 1; - unsigned JFETegGiven : 1; - unsigned JFETfNcoefGiven : 1; - unsigned JFETfNexpGiven : 1; - unsigned JFETnlevGiven : 1; - unsigned JFETgdsnoiGiven : 1; - -} JFETmodel; - -#ifndef NJF - -#define NJF 1 -#define PJF -1 - -#endif /*NJF*/ - -/* device parameters */ -enum { - JFET_AREA = 1, - JFET_IC_VDS, - JFET_IC_VGS, - JFET_IC, - JFET_OFF, - JFET_TEMP, - JFET_DTEMP, - JFET_M, -}; - -/* model parameters */ -enum { - JFET_MOD_VTO = 101, - JFET_MOD_BETA, - JFET_MOD_LAMBDA, - JFET_MOD_RD, - JFET_MOD_RS, - JFET_MOD_CGS, - JFET_MOD_CGD, - JFET_MOD_PB, - JFET_MOD_IS, - JFET_MOD_FC, - JFET_MOD_NJF, - JFET_MOD_PJF, - JFET_MOD_TNOM, - JFET_MOD_B, /* Modification for Sydney University JFET model */ - JFET_MOD_TCV, - JFET_MOD_VTOTC, - JFET_MOD_BEX, - JFET_MOD_BETATCE, - JFET_MOD_XTI, - JFET_MOD_EG, - JFET_MOD_KF, - JFET_MOD_AF, - JFET_MOD_NLEV, - JFET_MOD_GDSNOI, -}; - -/* device questions */ -enum { - JFET_DRAINNODE = 301, - JFET_GATENODE, - JFET_SOURCENODE, - JFET_DRAINPRIMENODE, - JFET_SOURCEPRIMENODE, - JFET_VGS, - JFET_VGD, - JFET_CG, - JFET_CD, - JFET_CGD, - JFET_GM, - JFET_GDS, - JFET_GGS, - JFET_GGD, - JFET_QGS, - JFET_CQGS, - JFET_QGD, - JFET_CQGD, - JFET_CS, - JFET_POWER, -}; - -/* model questions */ -enum { - JFET_MOD_DRAINCONDUCT = 301, - JFET_MOD_SOURCECONDUCT, - JFET_MOD_DEPLETIONCAP, - JFET_MOD_VCRIT, - JFET_MOD_TYPE, -}; - -/* function definitions */ - -#include "jfetext.h" - -#endif /*JFET*/ diff --git a/src/spicelib/devices/jfet/jfetdist.c b/src/spicelib/devices/jfet/jfetdist.c deleted file mode 100644 index 716af2b0e..000000000 --- a/src/spicelib/devices/jfet/jfetdist.c +++ /dev/null @@ -1,956 +0,0 @@ -/********** -Copyright 1990 Regents of the University of California. All rights reserved. -Author: 1988 Jaijeet S Roychowdhury -**********/ - -#include "ngspice/ngspice.h" -#include "ngspice/cktdefs.h" -#include "jfetdefs.h" -#include "ngspice/sperror.h" -#include "ngspice/distodef.h" -#include "ngspice/suffix.h" - -int -JFETdisto(int mode, GENmodel *genmodel, CKTcircuit *ckt) -/* assuming here that ckt->CKTomega has been initialised to - * the correct value - */ -{ - JFETmodel *model = (JFETmodel *) genmodel; - DISTOAN* job = (DISTOAN*) ckt->CKTcurJob; - DpassStr pass; - double r1h1x,i1h1x; - double r1h1y,i1h1y; - double r1h2x, i1h2x; - double r1h2y, i1h2y; - double r1hm2x,i1hm2x; - double r1hm2y,i1hm2y; - double r2h11x,i2h11x; - double r2h11y,i2h11y; - double r2h1m2x,i2h1m2x; - double r2h1m2y,i2h1m2y; - double temp, itemp; - JFETinstance *here; - -if (mode == D_SETUP) - return(JFETdSetup(genmodel,ckt)); /* another hack from similar structures */ - -if ((mode == D_TWOF1) || (mode == D_THRF1) || - (mode == D_F1PF2) || (mode == D_F1MF2) || - (mode == D_2F1MF2)) { - - /* loop through all the JFET models */ -for( ; model != NULL; model = JFETnextModel(model)) { - - /* loop through all the instances of the model */ - for (here = JFETinstances(model); here != NULL ; - here=JFETnextInstance(here)) { - - /* loading starts here */ - - switch (mode) { - case D_TWOF1: - /* x = vgs, y = vds */ - - /* getting first order (linear) Volterra kernel */ - r1h1x = *(job->r1H1ptr + (here->JFETgateNode)) - - *(job->r1H1ptr + (here->JFETsourcePrimeNode)); - i1h1x = *(job->i1H1ptr + (here->JFETgateNode)) - - *(job->i1H1ptr + (here->JFETsourcePrimeNode)); - - r1h1y = *(job->r1H1ptr + (here->JFETdrainPrimeNode)) - - *(job->r1H1ptr + (here->JFETsourcePrimeNode)); - i1h1y = *(job->i1H1ptr + (here->JFETdrainPrimeNode)) - - *(job->i1H1ptr + (here->JFETsourcePrimeNode)); - - - /* loading starts here */ - /* loading cdrain term */ - - temp = DFn2F1(here->cdr_x2, - here->cdr_y2, - 0.0, - here->cdr_xy, - 0.0, - 0.0, - r1h1x, - i1h1x, - r1h1y, - i1h1y, - 0.0, - 0.0); - - itemp = DFi2F1(here->cdr_x2, - here->cdr_y2, - 0.0, - here->cdr_xy, - 0.0, - 0.0, - r1h1x, - i1h1x, - r1h1y, - i1h1y, - 0.0, - 0.0); - - *(ckt->CKTrhs + (here->JFETdrainPrimeNode)) -= temp; - *(ckt->CKTirhs + (here->JFETdrainPrimeNode)) -= itemp; - *(ckt->CKTrhs + (here->JFETsourcePrimeNode)) += temp; - *(ckt->CKTirhs + (here->JFETsourcePrimeNode)) += itemp; - - /* cdrain term over */ - - /* loading ggs term */ - - temp = D1n2F1(here->ggs2, - r1h1x, - i1h1x); - - itemp = D1i2F1(here->ggs2, - r1h1x, - i1h1x); - - - *(ckt->CKTrhs + (here->JFETgateNode)) -= temp; - *(ckt->CKTirhs + (here->JFETgateNode)) -= itemp; - *(ckt->CKTrhs + (here->JFETsourcePrimeNode)) += temp; - *(ckt->CKTirhs + (here->JFETsourcePrimeNode)) += itemp; - - /* ggs over */ - - /* loading ggd term */ - - temp = D1n2F1(here->ggd2, - r1h1x - r1h1y, - i1h1x - i1h1y); - - itemp = D1i2F1(here->ggd2, - r1h1x - r1h1y, - i1h1x - i1h1y); - - - *(ckt->CKTrhs + (here->JFETgateNode)) -= temp; - *(ckt->CKTirhs + (here->JFETgateNode)) -= itemp; - *(ckt->CKTrhs + (here->JFETdrainPrimeNode)) += temp; - *(ckt->CKTirhs + (here->JFETdrainPrimeNode)) += itemp; - - /* ggd over */ - - /* loading capgs term */ - - temp = -ckt->CKTomega * - D1i2F1(here->capgs2, - r1h1x, - i1h1x); - - itemp = ckt->CKTomega * - D1n2F1(here->capgs2, - r1h1x, - i1h1x); - - - *(ckt->CKTrhs + (here->JFETgateNode)) -= temp; - *(ckt->CKTirhs + (here->JFETgateNode)) -= itemp; - *(ckt->CKTrhs + (here->JFETsourcePrimeNode)) += temp; - *(ckt->CKTirhs + (here->JFETsourcePrimeNode)) += itemp; - - /* capgs over */ - - /* loading capgd term */ - - temp = -ckt->CKTomega * - D1i2F1(here->capgd2, - r1h1x - r1h1y, - i1h1x - i1h1y); - - itemp = ckt->CKTomega * - D1n2F1(here->capgd2, - r1h1x - r1h1y, - i1h1x - i1h1y); - - - *(ckt->CKTrhs + (here->JFETgateNode)) -= temp; - *(ckt->CKTirhs + (here->JFETgateNode)) -= itemp; - *(ckt->CKTrhs + (here->JFETdrainPrimeNode)) += temp; - *(ckt->CKTirhs + (here->JFETdrainPrimeNode)) += itemp; - - /* capgd over */ - - /* all done */ - - break; - - case D_THRF1: - /* x = vgs, y = vds */ - - /* getting first order (linear) Volterra kernel */ - r1h1x = *(job->r1H1ptr + (here->JFETgateNode)) - - *(job->r1H1ptr + (here->JFETsourcePrimeNode)); - i1h1x = *(job->i1H1ptr + (here->JFETgateNode)) - - *(job->i1H1ptr + (here->JFETsourcePrimeNode)); - - r1h1y = *(job->r1H1ptr + (here->JFETdrainPrimeNode)) - - *(job->r1H1ptr + (here->JFETsourcePrimeNode)); - i1h1y = *(job->i1H1ptr + (here->JFETdrainPrimeNode)) - - *(job->i1H1ptr + (here->JFETsourcePrimeNode)); - - r2h11x = *(job->r2H11ptr + (here->JFETgateNode)) - - *(job->r2H11ptr + (here->JFETsourcePrimeNode)); - i2h11x = *(job->i2H11ptr + (here->JFETgateNode)) - - *(job->i2H11ptr + (here->JFETsourcePrimeNode)); - - r2h11y = *(job->r2H11ptr + (here->JFETdrainPrimeNode)) - - *(job->r2H11ptr + (here->JFETsourcePrimeNode)); - i2h11y = *(job->i2H11ptr + (here->JFETdrainPrimeNode)) - - *(job->i2H11ptr + (here->JFETsourcePrimeNode)); - - /* loading starts here */ - /* loading cdrain term */ - - temp = DFn3F1(here->cdr_x2, - here->cdr_y2, - 0.0, - here->cdr_xy, - 0.0, - 0.0, - here->cdr_x3, - here->cdr_y3, - 0.0, - here->cdr_x2y, - 0.0, - here->cdr_xy2, - 0.0, - 0.0, - 0.0, - 0.0, - r1h1x, - i1h1x, - r1h1y, - i1h1y, - 0.0, - 0.0, - r2h11x, - i2h11x, - r2h11y, - i2h11y, - 0.0, - 0.0); - - itemp = DFi3F1(here->cdr_x2, - here->cdr_y2, - 0.0, - here->cdr_xy, - 0.0, - 0.0, - here->cdr_x3, - here->cdr_y3, - 0.0, - here->cdr_x2y, - 0.0, - here->cdr_xy2, - 0.0, - 0.0, - 0.0, - 0.0, - r1h1x, - i1h1x, - r1h1y, - i1h1y, - 0.0, - 0.0, - r2h11x, - i2h11x, - r2h11y, - i2h11y, - 0.0, - 0.0); - - *(ckt->CKTrhs + (here->JFETdrainPrimeNode)) -= temp; - *(ckt->CKTirhs + (here->JFETdrainPrimeNode)) -= itemp; - *(ckt->CKTrhs + (here->JFETsourcePrimeNode)) += temp; - *(ckt->CKTirhs + (here->JFETsourcePrimeNode)) += itemp; - - /* cdrain term over */ - - /* loading ggs term */ - - temp = D1n3F1(here->ggs2, - here->ggs3, - r1h1x, - i1h1x, - r2h11x, - i2h11x); - - itemp = D1i3F1(here->ggs2, - here->ggs3, - r1h1x, - i1h1x, - r2h11x, - i2h11x); - - - *(ckt->CKTrhs + (here->JFETgateNode)) -= temp; - *(ckt->CKTirhs + (here->JFETgateNode)) -= itemp; - *(ckt->CKTrhs + (here->JFETsourcePrimeNode)) += temp; - *(ckt->CKTirhs + (here->JFETsourcePrimeNode)) += itemp; - - /* ggs over */ - - /* loading ggd term */ - - temp = D1n3F1(here->ggd2, - here->ggd3, - r1h1x - r1h1y, - i1h1x - i1h1y, - r2h11x - r2h11y, - i2h11x - i2h11y); - - itemp = D1i3F1(here->ggd2, - here->ggd3, - r1h1x - r1h1y, - i1h1x - i1h1y, - r2h11x - r2h11y, - i2h11x - i2h11y); - - - - *(ckt->CKTrhs + (here->JFETgateNode)) -= temp; - *(ckt->CKTirhs + (here->JFETgateNode)) -= itemp; - *(ckt->CKTrhs + (here->JFETdrainPrimeNode)) += temp; - *(ckt->CKTirhs + (here->JFETdrainPrimeNode)) += itemp; - - /* ggd over */ - - /* loading capgs term */ - - temp = -ckt->CKTomega * - D1i3F1(here->capgs2, - here->capgs3, - r1h1x, - i1h1x, - r2h11x, - i2h11x); - - itemp = ckt->CKTomega * - D1n3F1(here->capgs2, - here->capgs3, - r1h1x, - i1h1x, - r2h11x, - i2h11x); - - - *(ckt->CKTrhs + (here->JFETgateNode)) -= temp; - *(ckt->CKTirhs + (here->JFETgateNode)) -= itemp; - *(ckt->CKTrhs + (here->JFETsourcePrimeNode)) += temp; - *(ckt->CKTirhs + (here->JFETsourcePrimeNode)) += itemp; - - /* capgs over */ - - /* loading capgd term */ - - temp = -ckt->CKTomega * - D1i3F1(here->capgd2, - here->capgd3, - r1h1x - r1h1y, - i1h1x - i1h1y, - r2h11x - r2h11y, - i2h11x - i2h11y); - - itemp = ckt->CKTomega * - D1n3F1(here->capgd2, - here->capgd3, - r1h1x - r1h1y, - i1h1x - i1h1y, - r2h11x - r2h11y, - i2h11x - i2h11y); - - - *(ckt->CKTrhs + (here->JFETgateNode)) -= temp; - *(ckt->CKTirhs + (here->JFETgateNode)) -= itemp; - *(ckt->CKTrhs + (here->JFETdrainPrimeNode)) += temp; - *(ckt->CKTirhs + (here->JFETdrainPrimeNode)) += itemp; - - /* capgd over */ - - /* all done */ - - break; - case D_F1PF2: - /* x = vgs, y = vds */ - - /* getting first order (linear) Volterra kernel */ - r1h1x = *(job->r1H1ptr + (here->JFETgateNode)) - - *(job->r1H1ptr + (here->JFETsourcePrimeNode)); - i1h1x = *(job->i1H1ptr + (here->JFETgateNode)) - - *(job->i1H1ptr + (here->JFETsourcePrimeNode)); - - r1h1y = *(job->r1H1ptr + (here->JFETdrainPrimeNode)) - - *(job->r1H1ptr + (here->JFETsourcePrimeNode)); - i1h1y = *(job->i1H1ptr + (here->JFETdrainPrimeNode)) - - *(job->i1H1ptr + (here->JFETsourcePrimeNode)); - - r1h2x = *(job->r1H2ptr + (here->JFETgateNode)) - - *(job->r1H2ptr + (here->JFETsourcePrimeNode)); - i1h2x = *(job->i1H2ptr + (here->JFETgateNode)) - - *(job->i1H2ptr + (here->JFETsourcePrimeNode)); - - r1h2y = *(job->r1H2ptr + (here->JFETdrainPrimeNode)) - - *(job->r1H2ptr + (here->JFETsourcePrimeNode)); - i1h2y = *(job->i1H2ptr + (here->JFETdrainPrimeNode)) - - *(job->i1H2ptr + (here->JFETsourcePrimeNode)); - - /* loading starts here */ - /* loading cdrain term */ - - temp = DFnF12(here->cdr_x2, - here->cdr_y2, - 0.0, - here->cdr_xy, - 0.0, - 0.0, - r1h1x, - i1h1x, - r1h1y, - i1h1y, - 0.0, - 0.0, - r1h2x, - i1h2x, - r1h2y, - i1h2y, - 0.0, - 0.0); - - itemp = DFiF12(here->cdr_x2, - here->cdr_y2, - 0.0, - here->cdr_xy, - 0.0, - 0.0, - r1h1x, - i1h1x, - r1h1y, - i1h1y, - 0.0, - 0.0, - r1h2x, - i1h2x, - r1h2y, - i1h2y, - 0.0, - 0.0); - - *(ckt->CKTrhs + (here->JFETdrainPrimeNode)) -= temp; - *(ckt->CKTirhs + (here->JFETdrainPrimeNode)) -= itemp; - *(ckt->CKTrhs + (here->JFETsourcePrimeNode)) += temp; - *(ckt->CKTirhs + (here->JFETsourcePrimeNode)) += itemp; - - /* cdrain term over */ - - /* loading ggs term */ - - temp = D1nF12(here->ggs2, - r1h1x, - i1h1x, - r1h2x, - i1h2x); - - itemp = D1iF12(here->ggs2, - r1h1x, - i1h1x, - r1h2x, - i1h2x); - - - *(ckt->CKTrhs + (here->JFETgateNode)) -= temp; - *(ckt->CKTirhs + (here->JFETgateNode)) -= itemp; - *(ckt->CKTrhs + (here->JFETsourcePrimeNode)) += temp; - *(ckt->CKTirhs + (here->JFETsourcePrimeNode)) += itemp; - - /* ggs over */ - - /* loading ggd term */ - - temp = D1nF12(here->ggd2, - r1h1x - r1h1y, - i1h1x - i1h1y, - r1h2x - r1h2y, - i1h2x - i1h2y); - - itemp = D1iF12(here->ggd2, - r1h1x - r1h1y, - i1h1x - i1h1y, - r1h2x - r1h2y, - i1h2x - i1h2y); - - - *(ckt->CKTrhs + (here->JFETgateNode)) -= temp; - *(ckt->CKTirhs + (here->JFETgateNode)) -= itemp; - *(ckt->CKTrhs + (here->JFETdrainPrimeNode)) += temp; - *(ckt->CKTirhs + (here->JFETdrainPrimeNode)) += itemp; - - /* ggd over */ - - /* loading capgs term */ - - temp = -ckt->CKTomega * - D1iF12(here->capgs2, - r1h1x, - i1h1x, - r1h2x, - i1h2x); - - itemp = ckt->CKTomega * - D1nF12(here->capgs2, - r1h1x, - i1h1x, - r1h2x, - i1h2x); - - - *(ckt->CKTrhs + (here->JFETgateNode)) -= temp; - *(ckt->CKTirhs + (here->JFETgateNode)) -= itemp; - *(ckt->CKTrhs + (here->JFETsourcePrimeNode)) += temp; - *(ckt->CKTirhs + (here->JFETsourcePrimeNode)) += itemp; - - /* capgs over */ - - /* loading capgd term */ - - temp = -ckt->CKTomega * - D1iF12(here->capgd2, - r1h1x - r1h1y, - i1h1x - i1h1y, - r1h2x - r1h2y, - i1h2x - i1h2y); - - itemp = ckt->CKTomega * - D1nF12(here->capgd2, - r1h1x - r1h1y, - i1h1x - i1h1y, - r1h2x - r1h2y, - i1h2x - i1h2y); - - - *(ckt->CKTrhs + (here->JFETgateNode)) -= temp; - *(ckt->CKTirhs + (here->JFETgateNode)) -= itemp; - *(ckt->CKTrhs + (here->JFETdrainPrimeNode)) += temp; - *(ckt->CKTirhs + (here->JFETdrainPrimeNode)) += itemp; - - /* capgd over */ - - /* all done */ - - break; - case D_F1MF2: - /* x = vgs, y = vds */ - - /* getting first order (linear) Volterra kernel */ - r1h1x = *(job->r1H1ptr + (here->JFETgateNode)) - - *(job->r1H1ptr + (here->JFETsourcePrimeNode)); - i1h1x = *(job->i1H1ptr + (here->JFETgateNode)) - - *(job->i1H1ptr + (here->JFETsourcePrimeNode)); - - r1h1y = *(job->r1H1ptr + (here->JFETdrainPrimeNode)) - - *(job->r1H1ptr + (here->JFETsourcePrimeNode)); - i1h1y = *(job->i1H1ptr + (here->JFETdrainPrimeNode)) - - *(job->i1H1ptr + (here->JFETsourcePrimeNode)); - - r1hm2x = *(job->r1H2ptr + (here->JFETgateNode)) - - *(job->r1H2ptr + (here->JFETsourcePrimeNode)); - i1hm2x = -(*(job->i1H2ptr + (here->JFETgateNode)) - - *(job->i1H2ptr + (here->JFETsourcePrimeNode))); - - r1hm2y = *(job->r1H2ptr + (here->JFETdrainPrimeNode)) - - *(job->r1H2ptr + (here->JFETsourcePrimeNode)); - i1hm2y = -(*(job->i1H2ptr + (here->JFETdrainPrimeNode)) - - *(job->i1H2ptr + (here->JFETsourcePrimeNode))); - - /* loading starts here */ - /* loading cdrain term */ - - temp = DFnF12(here->cdr_x2, - here->cdr_y2, - 0.0, - here->cdr_xy, - 0.0, - 0.0, - r1h1x, - i1h1x, - r1h1y, - i1h1y, - 0.0, - 0.0, - r1hm2x, - i1hm2x, - r1hm2y, - i1hm2y, - 0.0, - 0.0); - - itemp = DFiF12(here->cdr_x2, - here->cdr_y2, - 0.0, - here->cdr_xy, - 0.0, - 0.0, - r1h1x, - i1h1x, - r1h1y, - i1h1y, - 0.0, - 0.0, - r1hm2x, - i1hm2x, - r1hm2y, - i1hm2y, - 0.0, - 0.0); - - *(ckt->CKTrhs + (here->JFETdrainPrimeNode)) -= temp; - *(ckt->CKTirhs + (here->JFETdrainPrimeNode)) -= itemp; - *(ckt->CKTrhs + (here->JFETsourcePrimeNode)) += temp; - *(ckt->CKTirhs + (here->JFETsourcePrimeNode)) += itemp; - - /* cdrain term over */ - - /* loading ggs term */ - - temp = D1nF12(here->ggs2, - r1h1x, - i1h1x, - r1hm2x, - i1hm2x); - - itemp = D1iF12(here->ggs2, - r1h1x, - i1h1x, - r1hm2x, - i1hm2x); - - - *(ckt->CKTrhs + (here->JFETgateNode)) -= temp; - *(ckt->CKTirhs + (here->JFETgateNode)) -= itemp; - *(ckt->CKTrhs + (here->JFETsourcePrimeNode)) += temp; - *(ckt->CKTirhs + (here->JFETsourcePrimeNode)) += itemp; - - /* ggs over */ - - /* loading ggd term */ - - temp = D1nF12(here->ggd2, - r1h1x - r1h1y, - i1h1x - i1h1y, - r1hm2x - r1hm2y, - i1hm2x - i1hm2y); - - itemp = D1iF12(here->ggd2, - r1h1x - r1h1y, - i1h1x - i1h1y, - r1hm2x - r1hm2y, - i1hm2x - i1hm2y); - - - *(ckt->CKTrhs + (here->JFETgateNode)) -= temp; - *(ckt->CKTirhs + (here->JFETgateNode)) -= itemp; - *(ckt->CKTrhs + (here->JFETdrainPrimeNode)) += temp; - *(ckt->CKTirhs + (here->JFETdrainPrimeNode)) += itemp; - - /* ggd over */ - - /* loading capgs term */ - - temp = -ckt->CKTomega * - D1iF12(here->capgs2, - r1h1x, - i1h1x, - r1hm2x, - i1hm2x); - - itemp = ckt->CKTomega * - D1nF12(here->capgs2, - r1h1x, - i1h1x, - r1hm2x, - i1hm2x); - - - *(ckt->CKTrhs + (here->JFETgateNode)) -= temp; - *(ckt->CKTirhs + (here->JFETgateNode)) -= itemp; - *(ckt->CKTrhs + (here->JFETsourcePrimeNode)) += temp; - *(ckt->CKTirhs + (here->JFETsourcePrimeNode)) += itemp; - - /* capgs over */ - - /* loading capgd term */ - - temp = -ckt->CKTomega * - D1iF12(here->capgd2, - r1h1x - r1h1y, - i1h1x - i1h1y, - r1hm2x - r1hm2y, - i1hm2x - i1hm2y); - - itemp = ckt->CKTomega * - D1nF12(here->capgd2, - r1h1x - r1h1y, - i1h1x - i1h1y, - r1hm2x - r1hm2y, - i1hm2x - i1hm2y); - - - *(ckt->CKTrhs + (here->JFETgateNode)) -= temp; - *(ckt->CKTirhs + (here->JFETgateNode)) -= itemp; - *(ckt->CKTrhs + (here->JFETdrainPrimeNode)) += temp; - *(ckt->CKTirhs + (here->JFETdrainPrimeNode)) += itemp; - - /* capgd over */ - - /* all done */ - - break; - case D_2F1MF2: - /* x = vgs, y = vds */ - - /* getting first order (linear) Volterra kernel */ - r1h1x = *(job->r1H1ptr + (here->JFETgateNode)) - - *(job->r1H1ptr + (here->JFETsourcePrimeNode)); - i1h1x = *(job->i1H1ptr + (here->JFETgateNode)) - - *(job->i1H1ptr + (here->JFETsourcePrimeNode)); - - r1h1y = *(job->r1H1ptr + (here->JFETdrainPrimeNode)) - - *(job->r1H1ptr + (here->JFETsourcePrimeNode)); - i1h1y = *(job->i1H1ptr + (here->JFETdrainPrimeNode)) - - *(job->i1H1ptr + (here->JFETsourcePrimeNode)); - - r2h11x = *(job->r2H11ptr + (here->JFETgateNode)) - - *(job->r2H11ptr + (here->JFETsourcePrimeNode)); - i2h11x = *(job->i2H11ptr + (here->JFETgateNode)) - - *(job->i2H11ptr + (here->JFETsourcePrimeNode)); - - r2h11y = *(job->r2H11ptr + (here->JFETdrainPrimeNode)) - - *(job->r2H11ptr + (here->JFETsourcePrimeNode)); - i2h11y = *(job->i2H11ptr + (here->JFETdrainPrimeNode)) - - *(job->i2H11ptr + (here->JFETsourcePrimeNode)); - - r1hm2x = *(job->r1H2ptr + (here->JFETgateNode)) - - *(job->r1H2ptr + (here->JFETsourcePrimeNode)); - i1hm2x = -(*(job->i1H2ptr + (here->JFETgateNode)) - - *(job->i1H2ptr + (here->JFETsourcePrimeNode))); - - r1hm2y = *(job->r1H2ptr + (here->JFETdrainPrimeNode)) - - *(job->r1H2ptr + (here->JFETsourcePrimeNode)); -i1hm2y = -(*(job->i1H2ptr + (here->JFETdrainPrimeNode)) - - *(job->i1H2ptr + (here->JFETsourcePrimeNode))); - - r2h1m2x = *(job->r2H1m2ptr + (here->JFETgateNode)) - - *(job->r2H1m2ptr + (here->JFETsourcePrimeNode)); - i2h1m2x = *(job->i2H1m2ptr + (here->JFETgateNode)) - - *(job->i2H1m2ptr + (here->JFETsourcePrimeNode)); - - r2h1m2y = *(job->r2H1m2ptr + (here->JFETdrainPrimeNode)) - - *(job->r2H1m2ptr + (here->JFETsourcePrimeNode)); -i2h1m2y = *(job->i2H1m2ptr + (here->JFETdrainPrimeNode)) - - *(job->i2H1m2ptr + (here->JFETsourcePrimeNode)); - - /* loading starts here */ - /* loading cdrain term */ - -pass.cxx = here->cdr_x2; -pass.cyy = here->cdr_y2; -pass.czz = 0.0; -pass.cxy = here->cdr_xy; -pass.cyz = 0.0; -pass.cxz = 0.0; -pass.cxxx = here->cdr_x3; -pass.cyyy = here->cdr_y3; -pass.czzz = 0.0; -pass.cxxy = here->cdr_x2y; -pass.cxxz = 0.0; -pass.cxyy = here->cdr_xy2; -pass.cyyz = 0.0; -pass.cxzz = 0.0; -pass.cyzz = 0.0; -pass.cxyz = 0.0; -pass.r1h1x = r1h1x; -pass.i1h1x = i1h1x; -pass.r1h1y = r1h1y; -pass.i1h1y = i1h1y; -pass.r1h1z = 0.0; -pass.i1h1z = 0.0; -pass.r1h2x = r1hm2x; -pass.i1h2x = i1hm2x; -pass.r1h2y = r1hm2y; -pass.i1h2y = i1hm2y; -pass.r1h2z = 0.0; -pass.i1h2z = 0.0; -pass.r2h11x = r2h11x; -pass.i2h11x = i2h11x; -pass.r2h11y = r2h11y; -pass.i2h11y = i2h11y; -pass.r2h11z = 0.0; -pass.i2h11z = 0.0; -pass.h2f1f2x = r2h1m2x; -pass.ih2f1f2x = i2h1m2x; -pass.h2f1f2y = r2h1m2y; -pass.ih2f1f2y = i2h1m2y; -pass.h2f1f2z = 0.0; -pass.ih2f1f2z = 0.0; - temp = DFn2F12(&pass); - - itemp = DFi2F12(&pass); - - *(ckt->CKTrhs + (here->JFETdrainPrimeNode)) -= temp; - *(ckt->CKTirhs + (here->JFETdrainPrimeNode)) -= itemp; - *(ckt->CKTrhs + (here->JFETsourcePrimeNode)) += temp; - *(ckt->CKTirhs + (here->JFETsourcePrimeNode)) += itemp; - - /* cdrain term over */ - - /* loading ggs term */ - - temp = D1n2F12(here->ggs2, - here->ggs3, - r1h1x, - i1h1x, - r1hm2x, - i1hm2x, - r2h11x, - i2h11x, - r2h1m2x, - i2h1m2x); - - itemp = D1i2F12(here->ggs2, - here->ggs3, - r1h1x, - i1h1x, - r1hm2x, - i1hm2x, - r2h11x, - i2h11x, - r2h1m2x, - i2h1m2x); - - - *(ckt->CKTrhs + (here->JFETgateNode)) -= temp; - *(ckt->CKTirhs + (here->JFETgateNode)) -= itemp; - *(ckt->CKTrhs + (here->JFETsourcePrimeNode)) += temp; - *(ckt->CKTirhs + (here->JFETsourcePrimeNode)) += itemp; - - /* ggs over */ - - /* loading ggd term */ - - temp = D1n2F12(here->ggd2, - here->ggd3, - r1h1x - r1h1y, - i1h1x - i1h1y, - r1hm2x - r1hm2y, - i1hm2x - i1hm2y, - r2h11x - r2h11y, - i2h11x - i2h11y, - r2h1m2x - r2h1m2y, - i2h1m2x - i2h1m2y); - - itemp = D1i2F12(here->ggd2, - here->ggd3, - r1h1x - r1h1y, - i1h1x - i1h1y, - r1hm2x - r1hm2y, - i1hm2x - i1hm2y, - r2h11x - r2h11y, - i2h11x - i2h11y, - r2h1m2x - r2h1m2y, - i2h1m2x - i2h1m2y); - - - - *(ckt->CKTrhs + (here->JFETgateNode)) -= temp; - *(ckt->CKTirhs + (here->JFETgateNode)) -= itemp; - *(ckt->CKTrhs + (here->JFETdrainPrimeNode)) += temp; - *(ckt->CKTirhs + (here->JFETdrainPrimeNode)) += itemp; - - /* ggd over */ - - /* loading capgs term */ - - temp = -ckt->CKTomega * - D1i2F12(here->capgs2, - here->capgs3, - r1h1x, - i1h1x, - r1hm2x, - i1hm2x, - r2h11x, - i2h11x, - r2h1m2x, - i2h1m2x); - - itemp = ckt->CKTomega * - D1n2F12(here->capgs2, - here->capgs3, - r1h1x, - i1h1x, - r1hm2x, - i1hm2x, - r2h11x, - i2h11x, - r2h1m2x, - i2h1m2x); - - - *(ckt->CKTrhs + (here->JFETgateNode)) -= temp; - *(ckt->CKTirhs + (here->JFETgateNode)) -= itemp; - *(ckt->CKTrhs + (here->JFETsourcePrimeNode)) += temp; - *(ckt->CKTirhs + (here->JFETsourcePrimeNode)) += itemp; - - /* capgs over */ - - /* loading capgd term */ - - temp = -ckt->CKTomega * - D1i2F12(here->capgd2, - here->capgd3, - r1h1x - r1h1y, - i1h1x - i1h1y, - r1hm2x - r1hm2y, - i1hm2x - i1hm2y, - r2h11x - r2h11y, - i2h11x - i2h11y, - r2h1m2x - r2h1m2y, - i2h1m2x - i2h1m2y); - - itemp = ckt->CKTomega * - D1n2F12(here->capgd2, - here->capgd3, - r1h1x - r1h1y, - i1h1x - i1h1y, - r1hm2x - r1hm2y, - i1hm2x - i1hm2y, - r2h11x - r2h11y, - i2h11x - i2h11y, - r2h1m2x - r2h1m2y, - i2h1m2x - i2h1m2y); - - - *(ckt->CKTrhs + (here->JFETgateNode)) -= temp; - *(ckt->CKTirhs + (here->JFETgateNode)) -= itemp; - *(ckt->CKTrhs + (here->JFETdrainPrimeNode)) += temp; - *(ckt->CKTirhs + (here->JFETdrainPrimeNode)) += itemp; - - /* capgd over */ - - /* all done */ - - break; - default: -; - } - } -} -return(OK); -} - else - return(E_BADPARM); -} diff --git a/src/spicelib/devices/jfet/jfetdset.c b/src/spicelib/devices/jfet/jfetdset.c deleted file mode 100644 index ea20efcfc..000000000 --- a/src/spicelib/devices/jfet/jfetdset.c +++ /dev/null @@ -1,296 +0,0 @@ -/********** -Copyright 1990 Regents of the University of California. All rights reserved. -Author: 1988 Jaijeet S Roychowdhury -**********/ - -#include "ngspice/ngspice.h" -#include "ngspice/distodef.h" -#include "ngspice/cktdefs.h" -#include "jfetdefs.h" -#include "ngspice/const.h" -#include "ngspice/trandefs.h" -#include "ngspice/sperror.h" -#include "ngspice/devdefs.h" -#include "ngspice/suffix.h" - -int -JFETdSetup(GENmodel *inModel, CKTcircuit *ckt) - /* actually load the current resistance value into the - * sparse matrix previously provided - */ -{ - JFETmodel *model = (JFETmodel*)inModel; - JFETinstance *here; - double beta; - double betap; - double lcapgd1; - double lcapgd2; - double lcapgd3; - double lcapgs2; - double lcapgs3; - double lcapgs1; - double cd; - double cdrain; - double cg; - double cgd; - double csat; - double czgd; - double czgdf2; - double czgs; - double czgsf2; - double evgd; - double evgs; - double fcpb2; - double gdpr; - double gds1; - double gds2; - double gds3; - double lggd1; - double lggd2; - double lggd3; - double lggs1; - double lggs2; - double lggs3; - double gm1; - double gm2; - double gm3; - double gmds; - double gm2ds; - double gmds2; - double gspr; - double sarg; - double twob; - double twop; - double vds; - double vgd; - double vgs; - double vgst; - - /* loop through all the models */ - for( ; model != NULL; model = JFETnextModel(model)) { - - /* loop through all the instances of the model */ - for (here = JFETinstances(model); here != NULL ; - here=JFETnextInstance(here)) { - - /* - * dc model parameters - */ - beta = here->JFETtBeta * here->JFETarea * here->JFETm; - gdpr=model->JFETdrainConduct*here->JFETarea * here->JFETm; - gspr=model->JFETsourceConduct*here->JFETarea * here-> JFETm; - csat=here->JFETtSatCur*here->JFETarea * here-> JFETm; - /* - * initialization - */ - vgs= model->JFETtype*(*(ckt->CKTrhsOld + here->JFETgateNode) - - *(ckt->CKTrhsOld + here->JFETsourcePrimeNode)); - vgd= model->JFETtype*(*(ckt->CKTrhsOld + here->JFETgateNode) - - *(ckt->CKTrhsOld + here->JFETdrainPrimeNode)); - /* - * determine dc current and derivatives - */ - vds=vgs-vgd; - - if (vds < 0.0) { - vds = -vds; - SWAP(double, vgs, vgd); - /* so now these have become the local variables */ - here->JFETmode = -1; - } else { - here->JFETmode = 1; - } - - if (vgs <= -5*here->JFETtemp*CONSTKoverQ) { - lggs1 = -csat/vgs+ckt->CKTgmin; - lggs2=lggs3=0; - cg = lggs1*vgs; - } else { - evgs = exp(vgs/(here->JFETtemp*CONSTKoverQ)); - lggs1 = csat*evgs/(here->JFETtemp*CONSTKoverQ)+ckt->CKTgmin; - lggs2 = (lggs1-ckt->CKTgmin)/((here->JFETtemp*CONSTKoverQ)*2); - lggs3 = lggs2/(3*(here->JFETtemp*CONSTKoverQ)); - cg = csat*(evgs-1)+ckt->CKTgmin*vgs; - } - if (vgd <= -5*(here->JFETtemp*CONSTKoverQ)) { - lggd1 = -csat/vgd+ckt->CKTgmin; - lggd2=lggd3=0; - cgd = lggd1*vgd; - } else { - evgd = exp(vgd/(here->JFETtemp*CONSTKoverQ)); - lggd1 = csat*evgd/(here->JFETtemp*CONSTKoverQ)+ckt->CKTgmin; - lggd2 = (lggd1-ckt->CKTgmin)/((here->JFETtemp*CONSTKoverQ)*2); - lggd3 = lggd2/(3*(here->JFETtemp*CONSTKoverQ)); - cgd = csat*(evgd-1)+ckt->CKTgmin*vgd; - } - cg = cg+cgd; - /* - * compute drain current and derivatives - */ - vgst=vgs-here->JFETtThreshold; - /* - * cutoff region - */ - if (vgst <= 0) { - cdrain=0; - gm1=gm2=gm3=0; - gds1=gds2=gds3=0; - gmds=gm2ds=gmds2=0; - } else { - betap=beta*(1+model->JFETlModulation*vds); - twob=betap+betap; - if (vgst <= vds) { - /* - * normal mode, saturation region - */ - - /* note - for cdrain, all the g's refer to the - * derivatives which have not been divided to - * become Taylor coeffs. A notational - * inconsistency but simplifies processing later. - */ - cdrain=betap*vgst*vgst; - gm1=twob*vgst; - gm2=twob; - gm3=0; - gds1=model->JFETlModulation*beta*vgst*vgst; - gds2=gds3=gmds2=0; - gm2ds=2*model->JFETlModulation*beta; - gmds=gm2ds*vgst; - } else { - /* - * normal mode, linear region - */ - cdrain=betap*vds*(vgst+vgst-vds); - gm1=twob*vds; - gm2=0; - gm3=0; - gmds=(beta+beta)*(1+2*model->JFETlModulation*vds); - gm2ds=0; - gds2=2*beta*(2*model->JFETlModulation*vgst - 1 - - 3*model->JFETlModulation*vds); - gds1=beta*(2*(vgst-vds) + 4*vgst*vds* - model->JFETlModulation - 3*model->JFETlModulation*vds*vds); - gmds2=4*beta*model->JFETlModulation; - gds3= -6*beta*model->JFETlModulation; - } - } - /* - * compute equivalent drain current source - */ - cd=cdrain-cgd; - /* - * charge storage elements - */ - czgs=here->JFETtCGS*here->JFETarea * here->JFETm; - czgd=here->JFETtCGD*here->JFETarea * here->JFETm; - twop=here->JFETtGatePot+here->JFETtGatePot; - fcpb2=here->JFETcorDepCap*here->JFETcorDepCap; - czgsf2=czgs/model->JFETf2; - czgdf2=czgd/model->JFETf2; - if (vgs < here->JFETcorDepCap) { - sarg=sqrt(1-vgs/here->JFETtGatePot); - lcapgs1=czgs/sarg; - lcapgs2=lcapgs1/(here->JFETtGatePot*4*sarg*sarg); - lcapgs3=lcapgs2/(here->JFETtGatePot*2*sarg*sarg); - } else { - lcapgs1=czgsf2*(model->JFETf3+vgs/twop); - lcapgs2=czgsf2/twop*0.5; - lcapgs3=0; - } - if (vgd < here->JFETcorDepCap) { - sarg=sqrt(1-vgd/here->JFETtGatePot); - lcapgd1=czgd/sarg; - lcapgd2=lcapgd1/(here->JFETtGatePot*4*sarg*sarg); - lcapgd3=lcapgd2/(here->JFETtGatePot*2*sarg*sarg); - } else { - lcapgd1=czgdf2*(model->JFETf3+vgd/twop); - lcapgd2=czgdf2/twop*0.5; - lcapgd3=0; - } - /* - * process to get Taylor coefficients, taking into - * account type and mode. - */ - - if (here->JFETmode == 1) - { - /* normal mode - no source-drain interchange */ -here->cdr_x = gm1; -here->cdr_y = gds1; -here->cdr_x2 = gm2; -here->cdr_y2 = gds2; -here->cdr_xy = gmds; -here->cdr_x3 = gm3; -here->cdr_y3 = gds3; -here->cdr_x2y = gm2ds; -here->cdr_xy2 = gmds2; - -here->ggs1 = lggs1; -here->ggd1 = lggd1; -here->ggs2 = lggs2; -here->ggd2 = lggd2; -here->ggs3 = lggs3; -here->ggd3 = lggd3; -here->capgs1 = lcapgs1; -here->capgd1 = lcapgd1; -here->capgs2 = lcapgs2; -here->capgd2 = lcapgd2; -here->capgs3 = lcapgs3; -here->capgd3 = lcapgd3; -} else { - /* - * inverse mode - source and drain interchanged - */ - - -here->cdr_x = -gm1; -here->cdr_y = gm1 + gds1; -here->cdr_x2 = -gm2; -here->cdr_y2 = -(gm2 + gds2 + 2*gmds); -here->cdr_xy = gm2 + gmds; -here->cdr_x3 = -gm3; -here->cdr_y3 = gm3 + gds3 + 3*(gm2ds + gmds2 ) ; -here->cdr_x2y = gm3 + gm2ds; -here->cdr_xy2 = -(gm3 + 2*gm2ds + gmds2); - -here->ggs1 = lggd1; -here->ggd1 = lggs1; - -here->ggs2 = lggd2; -here->ggd2 = lggs2; - -here->ggs3 = lggd3; -here->ggd3 = lggs3; - -here->capgs1 = lcapgd1; -here->capgd1 = lcapgs1; - -here->capgs2 = lcapgd2; -here->capgd2 = lcapgs2; - -here->capgs3 = lcapgd3; -here->capgd3 = lcapgs3; -} - -/* now to adjust for type and multiply by factors to convert to Taylor coeffs. */ - -here->cdr_x2 = 0.5*model->JFETtype*here->cdr_x2; -here->cdr_y2 = 0.5*model->JFETtype*here->cdr_y2; -here->cdr_xy = model->JFETtype*here->cdr_xy; -here->cdr_x3 = here->cdr_x3/6.; -here->cdr_y3 = here->cdr_y3/6.; -here->cdr_x2y = 0.5*here->cdr_x2y; -here->cdr_xy2 = 0.5*here->cdr_xy2; - - -here->ggs2 = model->JFETtype*lggs2; -here->ggd2 = model->JFETtype*lggd2; - -here->capgs2 = model->JFETtype*lcapgs2; -here->capgd2 = model->JFETtype*lcapgd2; - - } - } - return(OK); - } diff --git a/src/spicelib/devices/jfet/jfetext.h b/src/spicelib/devices/jfet/jfetext.h deleted file mode 100644 index 761306fc3..000000000 --- a/src/spicelib/devices/jfet/jfetext.h +++ /dev/null @@ -1,21 +0,0 @@ -/********** -Copyright 1990 Regents of the University of California. All rights reserved. -Author: 1985 Thomas L. Quarles -Modified: 2000 AlansFixes -**********/ - -extern int JFETacLoad(GENmodel*,CKTcircuit*); -extern int JFETask(CKTcircuit*,GENinstance*,int,IFvalue*,IFvalue*); -extern int JFETgetic(GENmodel*,CKTcircuit*); -extern int JFETload(GENmodel*,CKTcircuit*); -extern int JFETmAsk(CKTcircuit*,GENmodel*,int,IFvalue*); -extern int JFETmParam(int,IFvalue*,GENmodel*); -extern int JFETparam(int,IFvalue*,GENinstance*,IFvalue*); -extern int JFETpzLoad(GENmodel*,CKTcircuit*,SPcomplex*); -extern int JFETsetup(SMPmatrix*,GENmodel*,CKTcircuit*,int*); -extern int JFETunsetup(GENmodel*,CKTcircuit*); -extern int JFETtemp(GENmodel*,CKTcircuit*); -extern int JFETtrunc(GENmodel*,CKTcircuit*,double*); -extern int JFETdisto(int,GENmodel*,CKTcircuit*); -extern int JFETnoise(int,int,GENmodel*,CKTcircuit*,Ndata*,double*); -extern int JFETdSetup(GENmodel*,CKTcircuit*); diff --git a/src/spicelib/devices/jfet/jfetic.c b/src/spicelib/devices/jfet/jfetic.c deleted file mode 100644 index 222c0e576..000000000 --- a/src/spicelib/devices/jfet/jfetic.c +++ /dev/null @@ -1,41 +0,0 @@ -/********** -Copyright 1990 Regents of the University of California. All rights reserved. -Author: 1985 Thomas L. Quarles -**********/ -/* - */ - -#include "ngspice/ngspice.h" -#include "ngspice/cktdefs.h" -#include "jfetdefs.h" -#include "ngspice/sperror.h" -#include "ngspice/suffix.h" - - -int -JFETgetic(GENmodel *inModel, CKTcircuit *ckt) -{ - JFETmodel *model = (JFETmodel*)inModel; - JFETinstance *here; - /* - * grab initial conditions out of rhs array. User specified, so use - * external nodes to get values - */ - - for( ; model ; model = JFETnextModel(model)) { - for(here = JFETinstances(model); here ; here = JFETnextInstance(here)) { - - if(!here->JFETicVDSGiven) { - here->JFETicVDS = - *(ckt->CKTrhs + here->JFETdrainNode) - - *(ckt->CKTrhs + here->JFETsourceNode); - } - if(!here->JFETicVGSGiven) { - here->JFETicVGS = - *(ckt->CKTrhs + here->JFETgateNode) - - *(ckt->CKTrhs + here->JFETsourceNode); - } - } - } - return(OK); -} diff --git a/src/spicelib/devices/jfet/jfetinit.c b/src/spicelib/devices/jfet/jfetinit.c deleted file mode 100644 index 2e3868fd3..000000000 --- a/src/spicelib/devices/jfet/jfetinit.c +++ /dev/null @@ -1,76 +0,0 @@ -#include "ngspice/config.h" - -#include "ngspice/devdefs.h" - -#include "jfetitf.h" -#include "jfetext.h" -#include "jfetinit.h" - - -SPICEdev JFETinfo = { - .DEVpublic = { - .name = "JFET", - .description = "Junction Field effect transistor", - .terms = &JFETnSize, - .numNames = &JFETnSize, - .termNames = JFETnames, - .numInstanceParms = &JFETpTSize, - .instanceParms = JFETpTable, - .numModelParms = &JFETmPTSize, - .modelParms = JFETmPTable, - .flags = DEV_DEFAULT, - -#ifdef XSPICE - .cm_func = NULL, - .num_conn = 0, - .conn = NULL, - .num_param = 0, - .param = NULL, - .num_inst_var = 0, - .inst_var = NULL, -#endif - }, - - .DEVparam = JFETparam, - .DEVmodParam = JFETmParam, - .DEVload = JFETload, - .DEVsetup = JFETsetup, - .DEVunsetup = JFETunsetup, - .DEVpzSetup = JFETsetup, - .DEVtemperature = JFETtemp, - .DEVtrunc = JFETtrunc, - .DEVfindBranch = NULL, - .DEVacLoad = JFETacLoad, - .DEVaccept = NULL, - .DEVdestroy = NULL, - .DEVmodDelete = NULL, - .DEVdelete = NULL, - .DEVsetic = JFETgetic, - .DEVask = JFETask, - .DEVmodAsk = JFETmAsk, - .DEVpzLoad = JFETpzLoad, - .DEVconvTest = NULL, - .DEVsenSetup = NULL, - .DEVsenLoad = NULL, - .DEVsenUpdate = NULL, - .DEVsenAcLoad = NULL, - .DEVsenPrint = NULL, - .DEVsenTrunc = NULL, - .DEVdisto = JFETdisto, - .DEVnoise = JFETnoise, - .DEVsoaCheck = NULL, - .DEVinstSize = &JFETiSize, - .DEVmodSize = &JFETmSize, - -#ifdef CIDER - .DEVdump = NULL, - .DEVacct = NULL, -#endif -}; - - -SPICEdev * -get_jfet_info(void) -{ - return &JFETinfo; -} diff --git a/src/spicelib/devices/jfet/jfetinit.h b/src/spicelib/devices/jfet/jfetinit.h deleted file mode 100644 index e7e6ab3d8..000000000 --- a/src/spicelib/devices/jfet/jfetinit.h +++ /dev/null @@ -1,13 +0,0 @@ -#ifndef _JFETINIT_H -#define _JFETINIT_H - -extern IFparm JFETpTable[ ]; -extern IFparm JFETmPTable[ ]; -extern char *JFETnames[ ]; -extern int JFETpTSize; -extern int JFETmPTSize; -extern int JFETnSize; -extern int JFETiSize; -extern int JFETmSize; - -#endif diff --git a/src/spicelib/devices/jfet/jfetitf.h b/src/spicelib/devices/jfet/jfetitf.h deleted file mode 100644 index 19da888b2..000000000 --- a/src/spicelib/devices/jfet/jfetitf.h +++ /dev/null @@ -1,9 +0,0 @@ -/********** -Copyright 1990 Regents of the University of California. All rights reserved. -**********/ -#ifndef DEV_JFET -#define DEV_JFET - -SPICEdev *get_jfet_info(void); - -#endif diff --git a/src/spicelib/devices/jfet/jfetload.c b/src/spicelib/devices/jfet/jfetload.c deleted file mode 100644 index cc0fc2d28..000000000 --- a/src/spicelib/devices/jfet/jfetload.c +++ /dev/null @@ -1,532 +0,0 @@ -/********** -Copyright 1990 Regents of the University of California. All rights reserved. -Author: 1985 Thomas L. Quarles -Modified: 2000 AlansFixes -Sydney University mods Copyright(c) 1989 Anthony E. Parker, David J. Skellern - Laboratory for Communication Science Engineering - Sydney University Department of Electrical Engineering, Australia -**********/ - -#include "ngspice/ngspice.h" -#include "ngspice/cktdefs.h" -#include "jfetdefs.h" -#include "ngspice/const.h" -#include "ngspice/trandefs.h" -#include "ngspice/sperror.h" -#include "ngspice/devdefs.h" -#include "ngspice/suffix.h" - -int -JFETload(GENmodel *inModel, CKTcircuit *ckt) - /* actually load the current resistance value into the - * sparse matrix previously provided - */ -{ - JFETmodel *model = (JFETmodel*)inModel; - JFETinstance *here; - double beta; - double betap; - double capgd; - double capgs; - double cd; - double cdhat = 0.0; - double cdrain; - double cdreq; - double ceq; - double ceqgd; - double ceqgs; - double cg; - double cgd; - double cghat = 0.0; - double csat; - double czgd; - double czgdf2; - double czgs; - double czgsf2; - double delvds; - double delvgd; - double delvgs; - double evgd; - double evgs; - double fcpb2; - double gdpr; - double gds; - double geq; - double ggd; - double ggs; - double gm; - double gspr; - double sarg; - double twop; - double vds; - double vgd; - double vgdt; - double vgs; - double vgst; -#ifndef PREDICTOR - double xfact; -#endif - /* Modification for Sydney University JFET model */ - double vto; - double apart,cpart; - double Bfac; - /* end Sydney University mod. */ - int icheck; - int ichk1; - int error; - - double arg, vt_temp; - - double m; - - /* loop through all the models */ - for( ; model != NULL; model = JFETnextModel(model)) { - - /* loop through all the instances of the model */ - for (here = JFETinstances(model); here != NULL ; - here=JFETnextInstance(here)) { - - /* - * dc model parameters - */ - beta = here->JFETtBeta * here->JFETarea; - gdpr=model->JFETdrainConduct*here->JFETarea; - gspr=model->JFETsourceConduct*here->JFETarea; - csat=here->JFETtSatCur*here->JFETarea; - /* - * initialization - */ - icheck=1; - if( ckt->CKTmode & MODEINITSMSIG) { - vgs= *(ckt->CKTstate0 + here->JFETvgs); - vgd= *(ckt->CKTstate0 + here->JFETvgd); - } else if (ckt->CKTmode & MODEINITTRAN) { - vgs= *(ckt->CKTstate1 + here->JFETvgs); - vgd= *(ckt->CKTstate1 + here->JFETvgd); - } else if ( (ckt->CKTmode & MODEINITJCT) && - (ckt->CKTmode & MODETRANOP) && - (ckt->CKTmode & MODEUIC) ) { - vds=model->JFETtype*here->JFETicVDS; - vgs=model->JFETtype*here->JFETicVGS; - vgd=vgs-vds; - } else if ( (ckt->CKTmode & MODEINITJCT) && - (here->JFEToff == 0) ) { - vgs = -1; - vgd = -1; - } else if( (ckt->CKTmode & MODEINITJCT) || - ((ckt->CKTmode & MODEINITFIX) && (here->JFEToff))) { - vgs = 0; - vgd = 0; - } else { -#ifndef PREDICTOR - if(ckt->CKTmode & MODEINITPRED) { - xfact=ckt->CKTdelta/ckt->CKTdeltaOld[1]; - *(ckt->CKTstate0 + here->JFETvgs)= - *(ckt->CKTstate1 + here->JFETvgs); - vgs=(1+xfact)* *(ckt->CKTstate1 + here->JFETvgs)-xfact* - *(ckt->CKTstate2 + here->JFETvgs); - *(ckt->CKTstate0 + here->JFETvgd)= - *(ckt->CKTstate1 + here->JFETvgd); - vgd=(1+xfact)* *(ckt->CKTstate1 + here->JFETvgd)-xfact* - *(ckt->CKTstate2 + here->JFETvgd); - *(ckt->CKTstate0 + here->JFETcg)= - *(ckt->CKTstate1 + here->JFETcg); - *(ckt->CKTstate0 + here->JFETcd)= - *(ckt->CKTstate1 + here->JFETcd); - *(ckt->CKTstate0 + here->JFETcgd)= - *(ckt->CKTstate1 + here->JFETcgd); - *(ckt->CKTstate0 + here->JFETgm)= - *(ckt->CKTstate1 + here->JFETgm); - *(ckt->CKTstate0 + here->JFETgds)= - *(ckt->CKTstate1 + here->JFETgds); - *(ckt->CKTstate0 + here->JFETggs)= - *(ckt->CKTstate1 + here->JFETggs); - *(ckt->CKTstate0 + here->JFETggd)= - *(ckt->CKTstate1 + here->JFETggd); - } else { -#endif /*PREDICTOR*/ - /* - * compute new nonlinear branch voltages - */ - vgs=model->JFETtype* - (*(ckt->CKTrhsOld+ here->JFETgateNode)- - *(ckt->CKTrhsOld+ - here->JFETsourcePrimeNode)); - vgd=model->JFETtype* - (*(ckt->CKTrhsOld+here->JFETgateNode)- - *(ckt->CKTrhsOld+ - here->JFETdrainPrimeNode)); -#ifndef PREDICTOR - } -#endif /*PREDICTOR*/ - delvgs=vgs- *(ckt->CKTstate0 + here->JFETvgs); - delvgd=vgd- *(ckt->CKTstate0 + here->JFETvgd); - delvds=delvgs-delvgd; - cghat= *(ckt->CKTstate0 + here->JFETcg)+ - *(ckt->CKTstate0 + here->JFETggd)*delvgd+ - *(ckt->CKTstate0 + here->JFETggs)*delvgs; - cdhat= *(ckt->CKTstate0 + here->JFETcd)+ - *(ckt->CKTstate0 + here->JFETgm)*delvgs+ - *(ckt->CKTstate0 + here->JFETgds)*delvds- - *(ckt->CKTstate0 + here->JFETggd)*delvgd; - /* - * bypass if solution has not changed - */ - if((ckt->CKTbypass) && - (!(ckt->CKTmode & MODEINITPRED)) && - (fabs(delvgs) < ckt->CKTreltol*MAX(fabs(vgs), - fabs(*(ckt->CKTstate0 + here->JFETvgs)))+ - ckt->CKTvoltTol) ) - if ( (fabs(delvgd) < ckt->CKTreltol*MAX(fabs(vgd), - fabs(*(ckt->CKTstate0 + here->JFETvgd)))+ - ckt->CKTvoltTol)) - if ( (fabs(cghat-*(ckt->CKTstate0 + here->JFETcg)) - < ckt->CKTreltol*MAX(fabs(cghat), - fabs(*(ckt->CKTstate0 + here->JFETcg)))+ - ckt->CKTabstol) ) - if ( /* hack - expression too big */ - (fabs(cdhat-*(ckt->CKTstate0 + here->JFETcd)) - < ckt->CKTreltol*MAX(fabs(cdhat), - fabs(*(ckt->CKTstate0 + here->JFETcd)))+ - ckt->CKTabstol) ) { - - /* we can do a bypass */ - vgs= *(ckt->CKTstate0 + here->JFETvgs); - vgd= *(ckt->CKTstate0 + here->JFETvgd); - vds= vgs-vgd; - cg= *(ckt->CKTstate0 + here->JFETcg); - cd= *(ckt->CKTstate0 + here->JFETcd); - cgd= *(ckt->CKTstate0 + here->JFETcgd); - gm= *(ckt->CKTstate0 + here->JFETgm); - gds= *(ckt->CKTstate0 + here->JFETgds); - ggs= *(ckt->CKTstate0 + here->JFETggs); - ggd= *(ckt->CKTstate0 + here->JFETggd); - goto load; - } - /* - * limit nonlinear branch voltages - */ - ichk1=1; - vgs = DEVpnjlim(vgs,*(ckt->CKTstate0 + here->JFETvgs), - (here->JFETtemp*CONSTKoverQ), here->JFETvcrit, &icheck); - vgd = DEVpnjlim(vgd,*(ckt->CKTstate0 + here->JFETvgd), - (here->JFETtemp*CONSTKoverQ), here->JFETvcrit,&ichk1); - if (ichk1 == 1) { - icheck=1; - } - vgs = DEVfetlim(vgs,*(ckt->CKTstate0 + here->JFETvgs), - here->JFETtThreshold); - vgd = DEVfetlim(vgd,*(ckt->CKTstate0 + here->JFETvgd), - here->JFETtThreshold); - } - /* - * determine dc current and derivatives - */ - vds=vgs-vgd; - - vt_temp=here->JFETtemp*CONSTKoverQ; - if (vgs < -3*vt_temp) { - arg=3*vt_temp/(vgs*CONSTe); - arg = arg * arg * arg; - cg = -csat*(1+arg)+ckt->CKTgmin*vgs; - ggs = csat*3*arg/vgs+ckt->CKTgmin; - } else { - evgs = exp(vgs/vt_temp); - ggs = csat*evgs/vt_temp+ckt->CKTgmin; - cg = csat*(evgs-1)+ckt->CKTgmin*vgs; - } - - if (vgd < -3*vt_temp) { - arg=3*vt_temp/(vgd*CONSTe); - arg = arg * arg * arg; - cgd = -csat*(1+arg)+ckt->CKTgmin*vgd; - ggd = csat*3*arg/vgd+ckt->CKTgmin; - } else { - evgd = exp(vgd/vt_temp); - ggd = csat*evgd/vt_temp+ckt->CKTgmin; - cgd = csat*(evgd-1)+ckt->CKTgmin*vgd; - } - - cg = cg+cgd; - - /* Modification for Sydney University JFET model */ - vto = here->JFETtThreshold; - if (vds >= 0) { - vgst = vgs - vto; - /* - * compute drain current and derivatives for normal mode - */ - if (vgst <= 0) { - /* - * normal mode, cutoff region - */ - cdrain = 0; - gm = 0; - gds = 0; - } else { - betap = beta*(1 + model->JFETlModulation*vds); - Bfac = model->JFETbFac; - if (vgst >= vds) { - /* - * normal mode, linear region - */ - apart = 2*model->JFETb + 3*Bfac*(vgst - vds); - cpart = vds*(vds*(Bfac*vds - model->JFETb)+vgst*apart); - cdrain = betap*cpart; - gm = betap*vds*(apart + 3*Bfac*vgst); - gds = betap*(vgst - vds)*apart - + beta*model->JFETlModulation*cpart; - } else { - Bfac = vgst*Bfac; - gm = betap*vgst*(2*model->JFETb+3*Bfac); - /* - * normal mode, saturation region - */ - cpart=vgst*vgst*(model->JFETb+Bfac); - cdrain = betap*cpart; - gds = model->JFETlModulation*beta*cpart; - } - } - } else { - vgdt = vgd - vto; - /* - * compute drain current and derivatives for inverse mode - */ - if (vgdt <= 0) { - /* - * inverse mode, cutoff region - */ - cdrain = 0; - gm = 0; - gds = 0; - } else { - betap = beta*(1 - model->JFETlModulation*vds); - Bfac = model->JFETbFac; - if (vgdt + vds >= 0) { - /* - * inverse mode, linear region - */ - apart = 2*model->JFETb + 3*Bfac*(vgdt + vds); - cpart = vds*(-vds*(-Bfac*vds-model->JFETb)+vgdt*apart); - cdrain = betap*cpart; - gm = betap*vds*(apart + 3*Bfac*vgdt); - gds = betap*(vgdt + vds)*apart - - beta*model->JFETlModulation*cpart - gm; - } else { - Bfac = vgdt*Bfac; - gm = -betap*vgdt*(2*model->JFETb+3*Bfac); - /* - * inverse mode, saturation region - */ - cpart=vgdt*vgdt*(model->JFETb+Bfac); - cdrain = - betap*cpart; - gds = model->JFETlModulation*beta*cpart-gm; - } - } - } - -#ifdef notdef - /* The original section is now commented out */ - /* end Sydney University mod */ - /* - * compute drain current and derivitives for normal mode - */ - if (vds >= 0) { - vgst=vgs-here->JFETtThreshold; - /* - * normal mode, cutoff region - */ - if (vgst <= 0) { - cdrain=0; - gm=0; - gds=0; - } else { - betap=beta*(1+model->JFETlModulation*vds); - twob=betap+betap; - if (vgst <= vds) { - /* - * normal mode, saturation region - */ - cdrain=betap*vgst*vgst; - gm=twob*vgst; - gds=model->JFETlModulation*beta*vgst*vgst; - } else { - /* - * normal mode, linear region - */ - cdrain=betap*vds*(vgst+vgst-vds); - gm=twob*vds; - gds=twob*(vgst-vds)+model->JFETlModulation*beta* - vds*(vgst+vgst-vds); - } - } - } else { - /* - * compute drain current and derivitives for inverse mode - */ - vgdt=vgd-here->JFETtThreshold; - if (vgdt <= 0) { - /* - * inverse mode, cutoff region - */ - cdrain=0; - gm=0; - gds=0; - } else { - /* - * inverse mode, saturation region - */ - betap=beta*(1-model->JFETlModulation*vds); - twob=betap+betap; - if (vgdt <= -vds) { - cdrain = -betap*vgdt*vgdt; - gm = -twob*vgdt; - gds = model->JFETlModulation*beta*vgdt*vgdt-gm; - } else { - /* - * inverse mode, linear region - */ - cdrain=betap*vds*(vgdt+vgdt+vds); - gm=twob*vds; - gds=twob*vgdt-model->JFETlModulation*beta*vds* - (vgdt+vgdt+vds); - } - } - } - /* end of original section, now deleted (replaced w/SU mod */ -#endif - - /* - * compute equivalent drain current source - */ - cd=cdrain-cgd; - if ( (ckt->CKTmode & (MODEDCTRANCURVE | MODETRAN | MODEAC | MODEINITSMSIG) ) || - ((ckt->CKTmode & MODETRANOP) && (ckt->CKTmode & MODEUIC)) ){ - /* - * charge storage elements - */ - czgs=here->JFETtCGS*here->JFETarea; - czgd=here->JFETtCGD*here->JFETarea; - twop=here->JFETtGatePot+here->JFETtGatePot; - fcpb2=here->JFETcorDepCap*here->JFETcorDepCap; - czgsf2=czgs/model->JFETf2; - czgdf2=czgd/model->JFETf2; - if (vgs < here->JFETcorDepCap) { - sarg=sqrt(1-vgs/here->JFETtGatePot); - *(ckt->CKTstate0 + here->JFETqgs) = twop*czgs*(1-sarg); - capgs=czgs/sarg; - } else { - *(ckt->CKTstate0 + here->JFETqgs) = czgs*here->JFETf1 + - czgsf2*(model->JFETf3 *(vgs- - here->JFETcorDepCap)+(vgs*vgs-fcpb2)/ - (twop+twop)); - capgs=czgsf2*(model->JFETf3+vgs/twop); - } - if (vgd < here->JFETcorDepCap) { - sarg=sqrt(1-vgd/here->JFETtGatePot); - *(ckt->CKTstate0 + here->JFETqgd) = twop*czgd*(1-sarg); - capgd=czgd/sarg; - } else { - *(ckt->CKTstate0 + here->JFETqgd) = czgd*here->JFETf1+ - czgdf2*(model->JFETf3* (vgd- - here->JFETcorDepCap)+(vgd*vgd-fcpb2)/ - (twop+twop)); - capgd=czgdf2*(model->JFETf3+vgd/twop); - } - /* - * store small-signal parameters - */ - if( (!(ckt->CKTmode & MODETRANOP)) || - (!(ckt->CKTmode & MODEUIC)) ) { - if(ckt->CKTmode & MODEINITSMSIG) { - *(ckt->CKTstate0 + here->JFETqgs) = capgs; - *(ckt->CKTstate0 + here->JFETqgd) = capgd; - continue; /*go to 1000*/ - } - /* - * transient analysis - */ - if(ckt->CKTmode & MODEINITTRAN) { - *(ckt->CKTstate1 + here->JFETqgs) = - *(ckt->CKTstate0 + here->JFETqgs); - *(ckt->CKTstate1 + here->JFETqgd) = - *(ckt->CKTstate0 + here->JFETqgd); - } - error = NIintegrate(ckt,&geq,&ceq,capgs,here->JFETqgs); - if(error) return(error); - ggs = ggs + geq; - cg = cg + *(ckt->CKTstate0 + here->JFETcqgs); - error = NIintegrate(ckt,&geq,&ceq,capgd,here->JFETqgd); - if(error) return(error); - ggd = ggd + geq; - cg = cg + *(ckt->CKTstate0 + here->JFETcqgd); - cd = cd - *(ckt->CKTstate0 + here->JFETcqgd); - cgd = cgd + *(ckt->CKTstate0 + here->JFETcqgd); - if (ckt->CKTmode & MODEINITTRAN) { - *(ckt->CKTstate1 + here->JFETcqgs) = - *(ckt->CKTstate0 + here->JFETcqgs); - *(ckt->CKTstate1 + here->JFETcqgd) = - *(ckt->CKTstate0 + here->JFETcqgd); - } - } - } - /* - * check convergence - */ - if( (!(ckt->CKTmode & MODEINITFIX)) | - (!(ckt->CKTmode & MODEUIC))) { - if((icheck == 1) || - (fabs(cghat-cg) >= ckt->CKTreltol * - MAX(fabs(cghat), fabs(cg)) + ckt->CKTabstol) || - (fabs(cdhat-cd) > ckt->CKTreltol * - MAX(fabs(cdhat), fabs(cd)) + ckt->CKTabstol)) { - ckt->CKTnoncon++; - ckt->CKTtroubleElt = (GENinstance *) here; - } - } - *(ckt->CKTstate0 + here->JFETvgs) = vgs; - *(ckt->CKTstate0 + here->JFETvgd) = vgd; - *(ckt->CKTstate0 + here->JFETcg) = cg; - *(ckt->CKTstate0 + here->JFETcd) = cd; - *(ckt->CKTstate0 + here->JFETcgd) = cgd; - *(ckt->CKTstate0 + here->JFETgm) = gm; - *(ckt->CKTstate0 + here->JFETgds) = gds; - *(ckt->CKTstate0 + here->JFETggs) = ggs; - *(ckt->CKTstate0 + here->JFETggd) = ggd; - /* - * load current vector - */ -load: - - m = here->JFETm; - - ceqgd=model->JFETtype*(cgd-ggd*vgd); - ceqgs=model->JFETtype*((cg-cgd)-ggs*vgs); - cdreq=model->JFETtype*((cd+cgd)-gds*vds-gm*vgs); - *(ckt->CKTrhs + here->JFETgateNode) += m * (-ceqgs-ceqgd); - *(ckt->CKTrhs + here->JFETdrainPrimeNode) += - m * (-cdreq+ceqgd); - *(ckt->CKTrhs + here->JFETsourcePrimeNode) += - m * (cdreq+ceqgs); - /* - * load y matrix - */ - *(here->JFETdrainDrainPrimePtr) += m * (-gdpr); - *(here->JFETgateDrainPrimePtr) += m * (-ggd); - *(here->JFETgateSourcePrimePtr) += m * (-ggs); - *(here->JFETsourceSourcePrimePtr) += m * (-gspr); - *(here->JFETdrainPrimeDrainPtr) += m * (-gdpr); - *(here->JFETdrainPrimeGatePtr) += m * (gm-ggd); - *(here->JFETdrainPrimeSourcePrimePtr) += m * (-gds-gm); - *(here->JFETsourcePrimeGatePtr) += m * (-ggs-gm); - *(here->JFETsourcePrimeSourcePtr) += m * (-gspr); - *(here->JFETsourcePrimeDrainPrimePtr) += m * (-gds); - *(here->JFETdrainDrainPtr) += m * (gdpr); - *(here->JFETgateGatePtr) += m * (ggd+ggs); - *(here->JFETsourceSourcePtr) += m * (gspr); - *(here->JFETdrainPrimeDrainPrimePtr) += m * (gdpr+gds+ggd); - *(here->JFETsourcePrimeSourcePrimePtr) += m * (gspr+gds+gm+ggs); - } - } - return(OK); -} diff --git a/src/spicelib/devices/jfet/jfetmask.c b/src/spicelib/devices/jfet/jfetmask.c deleted file mode 100644 index cc18dbaf8..000000000 --- a/src/spicelib/devices/jfet/jfetmask.c +++ /dev/null @@ -1,114 +0,0 @@ -/********** -Copyright 1990 Regents of the University of California. All rights reserved. -Author: 1987 Mathew Lew and Thomas L. Quarles -Sydney University mods Copyright(c) 1989 Anthony E. Parker, David J. Skellern - Laboratory for Communication Science Engineering - Sydney University Department of Electrical Engineering, Australia -**********/ -/* - */ - -#include "ngspice/ngspice.h" -#include "ngspice/const.h" -#include "ngspice/ifsim.h" -#include "ngspice/cktdefs.h" -#include "ngspice/devdefs.h" -#include "jfetdefs.h" -#include "ngspice/sperror.h" -#include "ngspice/suffix.h" - - -/*ARGSUSED*/ -int -JFETmAsk(CKTcircuit *ckt, GENmodel *inModel, int which, IFvalue *value) -{ - JFETmodel *model = (JFETmodel*)inModel; - - NG_IGNORE(ckt); - - switch(which) { - case JFET_MOD_TNOM: - value->rValue = model->JFETtnom-CONSTCtoK; - return(OK); - case JFET_MOD_VTO: - value->rValue = model->JFETthreshold; - return(OK); - case JFET_MOD_BETA: - value->rValue = model->JFETbeta; - return(OK); - case JFET_MOD_LAMBDA: - value->rValue = model->JFETlModulation; - return(OK); - /* Modification for Sydney University JFET model */ - case JFET_MOD_B: - value->rValue = model->JFETb; - return(OK); - /* end Sydney University mod */ - case JFET_MOD_RD: - value->rValue = model->JFETdrainResist; - return(OK); - case JFET_MOD_RS: - value->rValue = model->JFETsourceResist; - return(OK); - case JFET_MOD_CGS: - value->rValue = model->JFETcapGS; - return(OK); - case JFET_MOD_CGD: - value->rValue = model->JFETcapGD; - return(OK); - case JFET_MOD_PB: - value->rValue = model->JFETgatePotential; - return(OK); - case JFET_MOD_IS: - value->rValue = model->JFETgateSatCurrent; - return(OK); - case JFET_MOD_FC: - value->rValue = model->JFETdepletionCapCoeff; - return(OK); - case JFET_MOD_DRAINCONDUCT: - value->rValue = model->JFETdrainConduct; - return(OK); - case JFET_MOD_SOURCECONDUCT: - value->rValue = model->JFETsourceConduct; - return(OK); - case JFET_MOD_TCV: - value->rValue = model->JFETtcv; - return(OK); - case JFET_MOD_VTOTC: - value->rValue = model->JFETvtotc; - return(OK); - case JFET_MOD_BEX: - value->rValue = model->JFETbex; - return(OK); - case JFET_MOD_BETATCE: - value->rValue = model->JFETbetatce; - return(OK); - case JFET_MOD_XTI: - value->rValue = model->JFETxti; - return(OK); - case JFET_MOD_EG: - value->rValue = model->JFETeg; - return(OK); - case JFET_MOD_TYPE: - if (model->JFETtype == NJF) - value->sValue = "njf"; - else - value->sValue = "pjf"; - return(OK); - case JFET_MOD_KF: - value->rValue = model->JFETfNcoef; - return(OK); - case JFET_MOD_AF: - value->rValue = model->JFETfNexp; - return(OK); - case JFET_MOD_NLEV: - value->iValue = model->JFETnlev; - return(OK); - case JFET_MOD_GDSNOI: - value->rValue = model->JFETgdsnoi; - return(OK); - default: - return(E_BADPARM); - } - /* NOTREACHED */ -} diff --git a/src/spicelib/devices/jfet/jfetmpar.c b/src/spicelib/devices/jfet/jfetmpar.c deleted file mode 100644 index 4eac5efe0..000000000 --- a/src/spicelib/devices/jfet/jfetmpar.c +++ /dev/null @@ -1,125 +0,0 @@ -/********** -Copyright 1990 Regents of the University of California. All rights reserved. -Author: 1985 Thomas L. Quarles -**********/ -/* - */ - -#include "ngspice/ngspice.h" -#include "ngspice/const.h" -#include "ngspice/ifsim.h" -#include "jfetdefs.h" -#include "ngspice/sperror.h" -#include "ngspice/suffix.h" - - -int -JFETmParam(int param, IFvalue *value, GENmodel *inModels) -{ - JFETmodel *model = (JFETmodel*)inModels; - switch(param) { - case JFET_MOD_TNOM: - model->JFETtnomGiven = TRUE; - model->JFETtnom = value->rValue+CONSTCtoK; - break; - case JFET_MOD_VTO: - model->JFETthresholdGiven = TRUE; - model->JFETthreshold = value->rValue; - break; - case JFET_MOD_BETA: - model->JFETbetaGiven = TRUE; - model->JFETbeta = value->rValue; - break; - case JFET_MOD_LAMBDA: - model->JFETlModulationGiven = TRUE; - model->JFETlModulation = value->rValue; - break; - case JFET_MOD_RD: - model->JFETdrainResistGiven = TRUE; - model->JFETdrainResist = value->rValue; - break; - case JFET_MOD_RS: - model->JFETsourceResistGiven = TRUE; - model->JFETsourceResist = value->rValue; - break; - case JFET_MOD_CGS: - model->JFETcapGSGiven = TRUE; - model->JFETcapGS = value->rValue; - break; - case JFET_MOD_CGD: - model->JFETcapGDGiven = TRUE; - model->JFETcapGD = value->rValue; - break; - case JFET_MOD_PB: - model->JFETgatePotentialGiven = TRUE; - model->JFETgatePotential = value->rValue; - break; - case JFET_MOD_IS: - model->JFETgateSatCurrentGiven = TRUE; - model->JFETgateSatCurrent = value->rValue; - break; - case JFET_MOD_FC: - model->JFETdepletionCapCoeffGiven = TRUE; - model->JFETdepletionCapCoeff = value->rValue; - break; - case JFET_MOD_NJF: - if(value->iValue) { - model->JFETtype = NJF; - } - break; - case JFET_MOD_PJF: - if(value->iValue) { - model->JFETtype = PJF; - } - break; - /* Modification for Sydney University JFET model */ - case JFET_MOD_B: - model->JFETbGiven = TRUE; - model->JFETb = value->rValue; - return(OK); - /* end Sydney University mod */ - case JFET_MOD_TCV: - model->JFETtcvGiven = TRUE; - model->JFETtcv = value->rValue; - break; - case JFET_MOD_VTOTC: - model->JFETvtotcGiven = TRUE; - model->JFETvtotc = value->rValue; - break; - case JFET_MOD_BETATCE: - model->JFETbetatceGiven = TRUE; - model->JFETbetatce = value->rValue; - break; - case JFET_MOD_BEX: - model->JFETbexGiven = TRUE; - model->JFETbex = value->rValue; - break; - case JFET_MOD_XTI: - model->JFETxtiGiven = TRUE; - model->JFETxti = value->rValue; - break; - case JFET_MOD_EG: - model->JFETegGiven = TRUE; - model->JFETeg = value->rValue; - break; - case JFET_MOD_KF: - model->JFETfNcoefGiven = TRUE; - model->JFETfNcoef = value->rValue; - break; - case JFET_MOD_AF: - model->JFETfNexpGiven = TRUE; - model->JFETfNexp = value->rValue; - break; - case JFET_MOD_NLEV: - model->JFETnlevGiven = TRUE; - model->JFETnlev = value->iValue; - break; - case JFET_MOD_GDSNOI: - model->JFETgdsnoiGiven = TRUE; - model->JFETgdsnoi = value->rValue; - break; - default: - return(E_BADPARM); - } - return(OK); -} diff --git a/src/spicelib/devices/jfet/jfetnoi.c b/src/spicelib/devices/jfet/jfetnoi.c deleted file mode 100644 index 5b70f97e5..000000000 --- a/src/spicelib/devices/jfet/jfetnoi.c +++ /dev/null @@ -1,195 +0,0 @@ -/********** -Copyright 1990 Regents of the University of California. All rights reserved. -Author: 1987 Gary W. Ng -**********/ - -#include "ngspice/ngspice.h" -#include "jfetdefs.h" -#include "ngspice/cktdefs.h" -#include "ngspice/iferrmsg.h" -#include "ngspice/noisedef.h" -#include "ngspice/suffix.h" - -/* - * JFETnoise (mode, operation, firstModel, ckt, data, OnDens) - * This routine names and evaluates all of the noise sources - * associated with JFET's. It starts with the model *firstModel and - * traverses all of its insts. It then proceeds to any other models - * on the linked list. The total output noise density generated by - * all of the JFET's is summed with the variable "OnDens". - */ - - -int -JFETnoise (int mode, int operation, GENmodel *genmodel, CKTcircuit *ckt, Ndata *data, - double *OnDens) -{ - NOISEAN *job = (NOISEAN *) ckt->CKTcurJob; - - JFETmodel *firstModel = (JFETmodel *) genmodel; - JFETmodel *model; - JFETinstance *inst; - double tempOnoise; - double tempInoise; - double noizDens[JFETNSRCS]; - double lnNdens[JFETNSRCS]; - int i; - double vgs, vds, vgst, alpha, beta; - - /* define the names of the noise sources */ - - static char *JFETnNames[JFETNSRCS] = { /* Note that we have to keep the order */ - "_rd", /* noise due to rd */ /* consistent with thestrchr definitions */ - "_rs", /* noise due to rs */ /* in JFETdefs.h */ - "_id", /* noise due to id */ - "_1overf", /* flicker (1/f) noise */ - "" /* total transistor noise */ - }; - - for (model=firstModel; model != NULL; model=JFETnextModel(model)) { - for (inst=JFETinstances(model); inst != NULL; inst=JFETnextInstance(inst)) { - - switch (operation) { - - case N_OPEN: - - /* see if we have to to produce a summary report */ - /* if so, name all the noise generators */ - - if (job->NStpsSm != 0) { - switch (mode) { - - case N_DENS: - for (i=0; i < JFETNSRCS; i++) { - NOISE_ADD_OUTVAR(ckt, data, "onoise_%s%s", inst->JFETname, JFETnNames[i]); - } - break; - - case INT_NOIZ: - for (i=0; i < JFETNSRCS; i++) { - NOISE_ADD_OUTVAR(ckt, data, "onoise_total_%s%s", inst->JFETname, JFETnNames[i]); - NOISE_ADD_OUTVAR(ckt, data, "inoise_total_%s%s", inst->JFETname, JFETnNames[i]); - } - break; - } - } - break; - - case N_CALC: - switch (mode) { - - case N_DENS: - NevalSrc(&noizDens[JFETRDNOIZ],&lnNdens[JFETRDNOIZ], - ckt,THERMNOISE,inst->JFETdrainPrimeNode,inst->JFETdrainNode, - model->JFETdrainConduct * inst->JFETarea * inst->JFETm); - - NevalSrc(&noizDens[JFETRSNOIZ],&lnNdens[JFETRSNOIZ], - ckt,THERMNOISE,inst->JFETsourcePrimeNode, - inst->JFETsourceNode,model->JFETsourceConduct - * inst->JFETarea * inst->JFETm); - - if (model->JFETnlev < 3) { - NevalSrc(&noizDens[JFETIDNOIZ],&lnNdens[JFETIDNOIZ], - ckt,THERMNOISE,inst->JFETdrainPrimeNode, - inst->JFETsourcePrimeNode, - (2.0/3.0 * inst->JFETm * fabs(*(ckt->CKTstate0 + inst->JFETgm)))); - } else { - vgs = *(ckt->CKTstate0 + inst->JFETvgs); - vds = vgs - *(ckt->CKTstate0 + inst->JFETvgd); - vgst = vgs - inst->JFETtThreshold; - if (vgst >= vds) - alpha = 1 - vds/vgst; /* linear region */ - else - alpha = 0; /* saturation region */ - beta = inst->JFETtBeta * inst->JFETarea * inst->JFETm; - - NevalSrc(&noizDens[JFETIDNOIZ],&lnNdens[JFETIDNOIZ], - ckt,THERMNOISE,inst->JFETdrainPrimeNode, - inst->JFETsourcePrimeNode, - (2.0/3.0 * beta*vgst*(1+alpha+alpha*alpha)/(1+alpha)*model->JFETgdsnoi)); - } - - NevalSrc(&noizDens[JFETFLNOIZ], NULL, ckt, - N_GAIN,inst->JFETdrainPrimeNode, - inst->JFETsourcePrimeNode, (double)0.0); - noizDens[JFETFLNOIZ] *= inst->JFETm * model->JFETfNcoef * - exp(model->JFETfNexp * - log(MAX(fabs(*(ckt->CKTstate0 + inst->JFETcd)),N_MINLOG))) / - data->freq; - lnNdens[JFETFLNOIZ] = - log(MAX(noizDens[JFETFLNOIZ],N_MINLOG)); - - noizDens[JFETTOTNOIZ] = noizDens[JFETRDNOIZ] + - noizDens[JFETRSNOIZ] + - noizDens[JFETIDNOIZ] + - noizDens[JFETFLNOIZ]; - lnNdens[JFETTOTNOIZ] = - log(MAX(noizDens[JFETTOTNOIZ], N_MINLOG)); - - *OnDens += noizDens[JFETTOTNOIZ]; - - if (data->delFreq == 0.0) { - - /* if we haven't done any previous integration, we need to */ - /* initialize our "history" variables */ - - for (i=0; i < JFETNSRCS; i++) { - inst->JFETnVar[LNLSTDENS][i] = lnNdens[i]; - } - - /* clear out our integration variables if it's the first pass */ - - if (data->freq == job->NstartFreq) { - for (i=0; i < JFETNSRCS; i++) { - inst->JFETnVar[OUTNOIZ][i] = 0.0; - inst->JFETnVar[INNOIZ][i] = 0.0; - } - } - } else { /* data->delFreq != 0.0 (we have to integrate) */ - for (i=0; i < JFETNSRCS; i++) { - if (i != JFETTOTNOIZ) { - tempOnoise = Nintegrate(noizDens[i], lnNdens[i], - inst->JFETnVar[LNLSTDENS][i], data); - tempInoise = Nintegrate(noizDens[i] * data->GainSqInv , - lnNdens[i] + data->lnGainInv, - inst->JFETnVar[LNLSTDENS][i] + data->lnGainInv, - data); - inst->JFETnVar[LNLSTDENS][i] = lnNdens[i]; - data->outNoiz += tempOnoise; - data->inNoise += tempInoise; - if (job->NStpsSm != 0) { - inst->JFETnVar[OUTNOIZ][i] += tempOnoise; - inst->JFETnVar[OUTNOIZ][JFETTOTNOIZ] += tempOnoise; - inst->JFETnVar[INNOIZ][i] += tempInoise; - inst->JFETnVar[INNOIZ][JFETTOTNOIZ] += tempInoise; - } - } - } - } - if (data->prtSummary) { - for (i=0; i < JFETNSRCS; i++) { /* print a summary report */ - data->outpVector[data->outNumber++] = noizDens[i]; - } - } - break; - - case INT_NOIZ: /* already calculated, just output */ - if (job->NStpsSm != 0) { - for (i=0; i < JFETNSRCS; i++) { - data->outpVector[data->outNumber++] = inst->JFETnVar[OUTNOIZ][i]; - data->outpVector[data->outNumber++] = inst->JFETnVar[INNOIZ][i]; - } - } /* if */ - break; - } /* switch (mode) */ - break; - - case N_CLOSE: - return (OK); /* do nothing, the main calling routine will close */ - break; /* the plots */ - } /* switch (operation) */ - } /* for inst */ - } /* for model */ - - return(OK); -} diff --git a/src/spicelib/devices/jfet/jfetpar.c b/src/spicelib/devices/jfet/jfetpar.c deleted file mode 100644 index 64dae9f3d..000000000 --- a/src/spicelib/devices/jfet/jfetpar.c +++ /dev/null @@ -1,72 +0,0 @@ -/********** -Copyright 1990 Regents of the University of California. All rights reserved. -Author: 1985 Thomas L. Quarles -**********/ -/* - */ - -#include "ngspice/ngspice.h" -#include "ngspice/const.h" -#include "ngspice/ifsim.h" -#include "jfetdefs.h" -#include "ngspice/sperror.h" -#include "ngspice/suffix.h" - - -/* ARGSUSED */ -int -JFETparam(int param, IFvalue *value, GENinstance *inst, IFvalue *select) -{ - JFETinstance *here = (JFETinstance *)inst; - - NG_IGNORE(select); - - switch (param) { - case JFET_TEMP: - here->JFETtemp = value->rValue+CONSTCtoK; - here->JFETtempGiven = TRUE; - break; - case JFET_DTEMP: - here->JFETdtemp = value->rValue; - here->JFETdtempGiven = TRUE; - break; - case JFET_AREA: - here->JFETarea = value->rValue; - here->JFETareaGiven = TRUE; - break; - case JFET_M: - here->JFETm = value->rValue; - here->JFETmGiven = TRUE; - break; - case JFET_IC_VDS: - here->JFETicVDS = value->rValue; - here->JFETicVDSGiven = TRUE; - break; - case JFET_IC_VGS: - here->JFETicVGS = value->rValue; - here->JFETicVGSGiven = TRUE; - break; - case JFET_OFF: - here->JFEToff = (value->iValue != 0); - break; - case JFET_IC: - /* FALLTHROUGH added to suppress GCC warning due to - * -Wimplicit-fallthrough flag */ - switch (value->v.numValue) { - case 2: - here->JFETicVGS = *(value->v.vec.rVec+1); - here->JFETicVGSGiven = TRUE; - /* FALLTHROUGH */ - case 1: - here->JFETicVDS = *(value->v.vec.rVec); - here->JFETicVDSGiven = TRUE; - break; - default: - return(E_BADPARM); - } - break; - default: - return(E_BADPARM); - } - return(OK); -} diff --git a/src/spicelib/devices/jfet/jfetpzld.c b/src/spicelib/devices/jfet/jfetpzld.c deleted file mode 100644 index f133aac4a..000000000 --- a/src/spicelib/devices/jfet/jfetpzld.c +++ /dev/null @@ -1,81 +0,0 @@ -/********** -Copyright 1990 Regents of the University of California. All rights reserved. -Author: 1985 Thomas L. Quarles -**********/ -/* - */ - -#include "ngspice/ngspice.h" -#include "ngspice/cktdefs.h" -#include "ngspice/complex.h" -#include "ngspice/sperror.h" -#include "jfetdefs.h" -#include "ngspice/suffix.h" - - -int -JFETpzLoad(GENmodel *inModel, CKTcircuit *ckt, SPcomplex *s) -{ - JFETmodel *model = (JFETmodel*)inModel; - JFETinstance *here; - double gdpr; - double gspr; - double gm; - double gds; - double ggs; - double xgs; - double ggd; - double xgd; - - double m; - - for( ; model != NULL; model = JFETnextModel(model)) { - - for( here = JFETinstances(model); here != NULL; - here = JFETnextInstance(here)) { - - m = here->JFETm; - - gdpr=model->JFETdrainConduct * here->JFETarea; - gspr=model->JFETsourceConduct * here->JFETarea; - gm= *(ckt->CKTstate0 + here->JFETgm) ; - gds= *(ckt->CKTstate0 + here->JFETgds) ; - ggs= *(ckt->CKTstate0 + here->JFETggs) ; - xgs= *(ckt->CKTstate0 + here->JFETqgs) ; - ggd= *(ckt->CKTstate0 + here->JFETggd) ; - xgd= *(ckt->CKTstate0 + here->JFETqgd) ; - - *(here->JFETdrainDrainPtr ) += m * gdpr; - *(here->JFETgateGatePtr ) += m * (ggd+ggs); - *(here->JFETgateGatePtr ) += m * ((xgd+xgs) * s->real); - *(here->JFETgateGatePtr +1) += m * ((xgd+xgs) * s->imag); - *(here->JFETsourceSourcePtr ) += m * (gspr); - *(here->JFETdrainPrimeDrainPrimePtr ) += m * (gdpr+gds+ggd); - *(here->JFETdrainPrimeDrainPrimePtr ) += m * (xgd * s->real); - *(here->JFETdrainPrimeDrainPrimePtr +1) += m * (xgd * s->imag); - *(here->JFETsourcePrimeSourcePrimePtr ) += m * (gspr+gds+gm+ggs); - *(here->JFETsourcePrimeSourcePrimePtr ) += m * (xgs * s->real); - *(here->JFETsourcePrimeSourcePrimePtr +1) += m * (xgs * s->imag); - *(here->JFETdrainDrainPrimePtr ) -= m * (gdpr); - *(here->JFETgateDrainPrimePtr ) -= m * (ggd); - *(here->JFETgateDrainPrimePtr ) -= m * (xgd * s->real); - *(here->JFETgateDrainPrimePtr +1) -= m * (xgd * s->imag); - *(here->JFETgateSourcePrimePtr ) -= m * (ggs); - *(here->JFETgateSourcePrimePtr ) -= m * (xgs * s->real); - *(here->JFETgateSourcePrimePtr +1) -= m * (xgs * s->imag); - *(here->JFETsourceSourcePrimePtr ) -= m * (gspr); - *(here->JFETdrainPrimeDrainPtr ) -= m * (gdpr); - *(here->JFETdrainPrimeGatePtr ) += m * (-ggd+gm); - *(here->JFETdrainPrimeGatePtr ) -= m * (xgd * s->real); - *(here->JFETdrainPrimeGatePtr +1) -= m * (xgd * s->imag); - *(here->JFETdrainPrimeSourcePrimePtr ) += m * (-gds-gm); - *(here->JFETsourcePrimeGatePtr ) += m * (-ggs-gm); - *(here->JFETsourcePrimeGatePtr ) -= m * (xgs * s->real); - *(here->JFETsourcePrimeGatePtr +1) -= m * (xgs * s->imag); - *(here->JFETsourcePrimeSourcePtr ) -= m * (gspr); - *(here->JFETsourcePrimeDrainPrimePtr ) -= m * (gds); - - } - } - return(OK); -} diff --git a/src/spicelib/devices/jfet/jfetset.c b/src/spicelib/devices/jfet/jfetset.c deleted file mode 100644 index 662549662..000000000 --- a/src/spicelib/devices/jfet/jfetset.c +++ /dev/null @@ -1,222 +0,0 @@ -/********** -Copyright 1990 Regents of the University of California. All rights reserved. -Author: 1985 Thomas L. Quarles -Modified: 2000 AlansFixes -Sydney University mods Copyright(c) 1989 Anthony E. Parker, David J. Skellern - Laboratory for Communication Science Engineering - Sydney University Department of Electrical Engineering, Australia -**********/ - -#include "ngspice/ngspice.h" -#include "ngspice/smpdefs.h" -#include "ngspice/cktdefs.h" -#include "jfetdefs.h" -#include "ngspice/const.h" -#include "ngspice/sperror.h" -#include "ngspice/suffix.h" - -int -JFETsetup(SMPmatrix *matrix, GENmodel *inModel, CKTcircuit *ckt, int *states) - /* load the diode structure with those pointers needed later - * for fast matrix loading - */ -{ - JFETmodel *model = (JFETmodel*)inModel; - JFETinstance *here; - int error; - CKTnode *tmp; - - /* loop through all the diode models */ - for( ; model != NULL; model = JFETnextModel(model)) { - - if( (model->JFETtype != NJF) && (model->JFETtype != PJF) ) { - model->JFETtype = NJF; - } - if(!model->JFETthresholdGiven) { - model->JFETthreshold = -2; - } - if(!model->JFETbetaGiven) { - model->JFETbeta = 1e-4; - } - if(!model->JFETlModulationGiven) { - model->JFETlModulation = 0; - } - if(!model->JFETdrainResistGiven) { - model->JFETdrainResist = 0; - } - if(!model->JFETsourceResistGiven) { - model->JFETsourceResist = 0; - } - if(!model->JFETcapGSGiven) { - model->JFETcapGS = 0; - } - if(!model->JFETcapGDGiven) { - model->JFETcapGD = 0; - } - if(!model->JFETgatePotentialGiven) { - model->JFETgatePotential = 1; - } - if(!model->JFETgateSatCurrentGiven) { - model->JFETgateSatCurrent = 1e-14; - } - if(!model->JFETdepletionCapCoeffGiven) { - model->JFETdepletionCapCoeff = .5; - } - - /* Modification for Sydney University JFET model */ - if(!model->JFETbGiven) { - model->JFETb = 1.0; - } - /* end Sydney University mod */ - - if(!model->JFETtcvGiven) { - model->JFETtcv = 0.0; - } - if(!model->JFETvtotcGiven) { - model->JFETvtotc = 0.0; - } - if(!model->JFETbexGiven) { - model->JFETbex = 0.0; - } - if(!model->JFETbetatceGiven) { - model->JFETbetatce = 0.0; - } - if(!model->JFETxtiGiven) { - model->JFETxti = 3.0; - } - if(!model->JFETegGiven) { - model->JFETeg = 1.11; - } - if(!model->JFETfNcoefGiven) { - model->JFETfNcoef = 0; - } - if(!model->JFETfNexpGiven) { - model->JFETfNexp = 1; - } - if(!model->JFETnlevGiven) { - model->JFETnlev = 2; - } - if(!model->JFETgdsnoiGiven) { - model->JFETgdsnoi = 1.0; - } - - if(model->JFETdrainResist != 0) { - model->JFETdrainConduct = 1/model->JFETdrainResist; - } else { - model->JFETdrainConduct = 0; - } - if(model->JFETsourceResist != 0) { - model->JFETsourceConduct = 1/model->JFETsourceResist; - } else { - model->JFETsourceConduct = 0; - } - - /* loop through all the instances of the model */ - for (here = JFETinstances(model); here != NULL ; - here=JFETnextInstance(here)) { - - if(!here->JFETareaGiven) { - here->JFETarea = 1; - } - if(!here->JFETmGiven) { - here->JFETm = 1; - } - here->JFETstate = *states; - *states += JFETnumStates; - - if(model->JFETsourceResist != 0) { - if(here->JFETsourcePrimeNode == 0) { - error = CKTmkVolt(ckt,&tmp,here->JFETname,"source"); - if(error) return(error); - here->JFETsourcePrimeNode = tmp->number; - - if (ckt->CKTcopyNodesets) { - CKTnode *tmpNode; - IFuid tmpName; - - if (CKTinst2Node(ckt,here,3,&tmpNode,&tmpName)==OK) { - if (tmpNode->nsGiven) { - tmp->nodeset=tmpNode->nodeset; - tmp->nsGiven=tmpNode->nsGiven; - } - } - } - } - - } else { - here->JFETsourcePrimeNode = here->JFETsourceNode; - } - if(model->JFETdrainResist != 0) { - if(here->JFETdrainPrimeNode == 0) { - error = CKTmkVolt(ckt,&tmp,here->JFETname,"drain"); - if(error) return(error); - here->JFETdrainPrimeNode = tmp->number; - - if (ckt->CKTcopyNodesets) { - CKTnode *tmpNode; - IFuid tmpName; - - if (CKTinst2Node(ckt,here,1,&tmpNode,&tmpName)==OK) { - if (tmpNode->nsGiven) { - tmp->nodeset=tmpNode->nodeset; - tmp->nsGiven=tmpNode->nsGiven; - } - } - } - } - - } else { - here->JFETdrainPrimeNode = here->JFETdrainNode; - } - -/* macro to make elements with built in test for out of memory */ -#define TSTALLOC(ptr,first,second) \ -do { if((here->ptr = SMPmakeElt(matrix, here->first, here->second)) == NULL){\ - return(E_NOMEM);\ -} } while(0) - - TSTALLOC(JFETdrainDrainPrimePtr,JFETdrainNode,JFETdrainPrimeNode); - TSTALLOC(JFETgateDrainPrimePtr,JFETgateNode,JFETdrainPrimeNode); - TSTALLOC(JFETgateSourcePrimePtr,JFETgateNode,JFETsourcePrimeNode); - TSTALLOC(JFETsourceSourcePrimePtr,JFETsourceNode,JFETsourcePrimeNode); - TSTALLOC(JFETdrainPrimeDrainPtr,JFETdrainPrimeNode,JFETdrainNode); - TSTALLOC(JFETdrainPrimeGatePtr,JFETdrainPrimeNode,JFETgateNode); - TSTALLOC(JFETdrainPrimeSourcePrimePtr,JFETdrainPrimeNode,JFETsourcePrimeNode); - TSTALLOC(JFETsourcePrimeGatePtr,JFETsourcePrimeNode,JFETgateNode); - TSTALLOC(JFETsourcePrimeSourcePtr,JFETsourcePrimeNode,JFETsourceNode); - TSTALLOC(JFETsourcePrimeDrainPrimePtr,JFETsourcePrimeNode,JFETdrainPrimeNode); - TSTALLOC(JFETdrainDrainPtr,JFETdrainNode,JFETdrainNode); - TSTALLOC(JFETgateGatePtr,JFETgateNode,JFETgateNode); - TSTALLOC(JFETsourceSourcePtr,JFETsourceNode,JFETsourceNode); - TSTALLOC(JFETdrainPrimeDrainPrimePtr,JFETdrainPrimeNode,JFETdrainPrimeNode); - TSTALLOC(JFETsourcePrimeSourcePrimePtr,JFETsourcePrimeNode,JFETsourcePrimeNode); - } - } - return(OK); -} - -int -JFETunsetup(GENmodel *inModel, CKTcircuit *ckt) -{ - JFETmodel *model; - JFETinstance *here; - - for (model = (JFETmodel *)inModel; model != NULL; - model = JFETnextModel(model)) - { - for (here = JFETinstances(model); here != NULL; - here=JFETnextInstance(here)) - { - if (here->JFETdrainPrimeNode > 0 - && here->JFETdrainPrimeNode != here->JFETdrainNode) - CKTdltNNum(ckt, here->JFETdrainPrimeNode); - here->JFETdrainPrimeNode = 0; - - if (here->JFETsourcePrimeNode > 0 - && here->JFETsourcePrimeNode != here->JFETsourceNode) - CKTdltNNum(ckt, here->JFETsourcePrimeNode); - here->JFETsourcePrimeNode = 0; - } - } - return OK; -} diff --git a/src/spicelib/devices/jfet/jfettemp.c b/src/spicelib/devices/jfet/jfettemp.c deleted file mode 100644 index ab43aaf33..000000000 --- a/src/spicelib/devices/jfet/jfettemp.c +++ /dev/null @@ -1,128 +0,0 @@ -/********** -Copyright 1990 Regents of the University of California. All rights reserved. -Author: 1985 Thomas L. Quarles -Sydney University mods Copyright(c) 1989 Anthony E. Parker, David J. Skellern - Laboratory for Communication Science Engineering - Sydney University Department of Electrical Engineering, Australia -**********/ - -#include "ngspice/ngspice.h" -#include "ngspice/smpdefs.h" -#include "ngspice/cktdefs.h" -#include "jfetdefs.h" -#include "ngspice/const.h" -#include "ngspice/sperror.h" -#include "ngspice/suffix.h" - -int -JFETtemp(GENmodel *inModel, CKTcircuit *ckt) - /* Pre-process the model parameters after a possible change - */ -{ - JFETmodel *model = (JFETmodel*)inModel; - JFETinstance *here; - double xfc; - double vt; - double vtnom; - double kt,kt1; - double arg,arg1; - double fact1,fact2; - double egfet,egfet1; - double pbfact,pbfact1; - double gmanew,gmaold; - double ratio1; - double pbo; - double cjfact,cjfact1; - - /* loop through all the diode models */ - for( ; model != NULL; model = JFETnextModel(model)) { - - if(!(model->JFETtnomGiven)) { - model->JFETtnom = ckt->CKTnomTemp; - } - vtnom = CONSTKoverQ * model->JFETtnom; - fact1 = model->JFETtnom/REFTEMP; - kt1 = CONSTboltz * model->JFETtnom; - egfet1 = 1.16-(7.02e-4*model->JFETtnom*model->JFETtnom)/ - (model->JFETtnom+1108); - arg1 = -egfet1/(kt1+kt1)+1.1150877/(CONSTboltz*(REFTEMP+REFTEMP)); - pbfact1 = -2*vtnom * (1.5*log(fact1)+CHARGE*arg1); - pbo = (model->JFETgatePotential-pbfact1)/fact1; - gmaold = (model->JFETgatePotential-pbo)/pbo; - cjfact = 1/(1+.5*(4e-4*(model->JFETtnom-REFTEMP)-gmaold)); - - if(model->JFETdrainResist != 0) { - model->JFETdrainConduct = 1/model->JFETdrainResist; - } else { - model->JFETdrainConduct = 0; - } - if(model->JFETsourceResist != 0) { - model->JFETsourceConduct = 1/model->JFETsourceResist; - } else { - model->JFETsourceConduct = 0; - } - if(model->JFETdepletionCapCoeff >.95) { - SPfrontEnd->IFerrorf (ERR_WARNING, - "%s: Depletion cap. coefficient too large, limited to .95", - model->JFETmodName); - model->JFETdepletionCapCoeff = .95; - } - - xfc = log(1 - model->JFETdepletionCapCoeff); - model->JFETf2 = exp((1+.5)*xfc); - model->JFETf3 = 1 - model->JFETdepletionCapCoeff * (1 + .5); - /* Modification for Sydney University JFET model */ - model->JFETbFac = (1 - model->JFETb) - / (model->JFETgatePotential - model->JFETthreshold); - /* end Sydney University mod */ - - /* loop through all the instances of the model */ - for (here = JFETinstances(model); here != NULL ; - here=JFETnextInstance(here)) { - - if(!(here->JFETdtempGiven)) { - here->JFETdtemp = 0.0; - } - if(!(here->JFETtempGiven)) { - here->JFETtemp = ckt->CKTtemp + here->JFETdtemp; - } - vt = here->JFETtemp * CONSTKoverQ; - fact2 = here->JFETtemp/REFTEMP; - ratio1 = here->JFETtemp/model->JFETtnom -1; - if (model->JFETxtiGiven) { - here->JFETtSatCur = model->JFETgateSatCurrent * exp(ratio1*model->JFETeg/vt) * pow(ratio1+1,model->JFETxti); - } else { - here->JFETtSatCur = model->JFETgateSatCurrent * exp(ratio1*model->JFETeg/vt); - } - here->JFETtCGS = model->JFETcapGS * cjfact; - here->JFETtCGD = model->JFETcapGD * cjfact; - kt = CONSTboltz*here->JFETtemp; - egfet = 1.16-(7.02e-4*here->JFETtemp*here->JFETtemp)/ - (here->JFETtemp+1108); - arg = -egfet/(kt+kt) + 1.1150877/(CONSTboltz*(REFTEMP+REFTEMP)); - pbfact = -2 * vt * (1.5*log(fact2)+CHARGE*arg); - here->JFETtGatePot = fact2 * pbo + pbfact; - gmanew = (here->JFETtGatePot-pbo)/pbo; - cjfact1 = 1+.5*(4e-4*(here->JFETtemp-REFTEMP)-gmanew); - here->JFETtCGS *= cjfact1; - here->JFETtCGD *= cjfact1; - - here->JFETcorDepCap = model->JFETdepletionCapCoeff * - here->JFETtGatePot; - here->JFETf1 = here->JFETtGatePot * (1 - exp((1-.5)*xfc))/(1-.5); - here->JFETvcrit = vt * log(vt/(CONSTroot2 * here->JFETtSatCur)); - - if (model->JFETvtotcGiven) { - here->JFETtThreshold = model->JFETthreshold + model->JFETvtotc*(here->JFETtemp-model->JFETtnom); - } else { - here->JFETtThreshold = model->JFETthreshold - model->JFETtcv*(here->JFETtemp-model->JFETtnom); - } - if (model->JFETbetatceGiven) { - here->JFETtBeta = model->JFETbeta * pow(1.01,model->JFETbetatce*(here->JFETtemp-model->JFETtnom)); - } else { - here->JFETtBeta = model->JFETbeta * pow(here->JFETtemp/model->JFETtnom,model->JFETbex); - } - } - } - return(OK); -} diff --git a/src/spicelib/devices/jfet/jfettrun.c b/src/spicelib/devices/jfet/jfettrun.c deleted file mode 100644 index 14d4c9f3f..000000000 --- a/src/spicelib/devices/jfet/jfettrun.c +++ /dev/null @@ -1,29 +0,0 @@ -/********** -Copyright 1990 Regents of the University of California. All rights reserved. -Author: 1985 Thomas L. Quarles -**********/ -/* - */ - -#include "ngspice/ngspice.h" -#include "ngspice/cktdefs.h" -#include "jfetdefs.h" -#include "ngspice/sperror.h" -#include "ngspice/suffix.h" - - -int -JFETtrunc(GENmodel *inModel, CKTcircuit *ckt, double *timeStep) -{ - JFETmodel *model = (JFETmodel*)inModel; - JFETinstance *here; - - for( ; model != NULL; model = JFETnextModel(model)) { - for(here=JFETinstances(model);here!=NULL;here = JFETnextInstance(here)){ - - CKTterr(here->JFETqgs,ckt,timeStep); - CKTterr(here->JFETqgd,ckt,timeStep); - } - } - return(OK); -} diff --git a/src/spicelib/devices/jfet2/ChangeLog b/src/spicelib/devices/jfet2/ChangeLog deleted file mode 100644 index 9460de740..000000000 --- a/src/spicelib/devices/jfet2/ChangeLog +++ /dev/null @@ -1,19 +0,0 @@ -2000-03-11 Paolo Nenzi - - * jfet2acld.c: prepared the code for multiprocessing and CIDER integration. - - * jfet2ic.c: prepared the code for multiprocessing and CIDER integration. - - * jfet2set.c: prepared the code for multiprocessing and CIDER integration. - - * jfet2load.c: prepared the code for multiprocessing and CIDER integration. - - * jfet2noi.c: prepared the code for multiprocessing and CIDER integration. - - * jfet2trun.c: prepared the code for multiprocessing and CIDER integration. - -1999-09-07 Arno - - * jfet2load.c: removed unused variables. - - * jfet2noi.c: removed unused variable. Reformatted some comments. diff --git a/src/spicelib/devices/jfet2/Makefile.am b/src/spicelib/devices/jfet2/Makefile.am deleted file mode 100644 index 73af547bc..000000000 --- a/src/spicelib/devices/jfet2/Makefile.am +++ /dev/null @@ -1,32 +0,0 @@ -## Process this file with automake to produce Makefile.in - -noinst_LTLIBRARIES = libjfet2.la - -libjfet2_la_SOURCES = \ - jfet2.c \ - jfet2acld.c \ - jfet2ask.c \ - jfet2defs.h \ - jfet2ext.h \ - jfet2ic.c \ - jfet2init.c \ - jfet2init.h \ - jfet2itf.h \ - jfet2load.c \ - jfet2mask.c \ - jfet2mpar.c \ - jfet2noi.c \ - jfet2par.c \ - jfet2parm.h \ - jfet2set.c \ - jfet2temp.c \ - jfet2trun.c \ - psmodel.c \ - psmodel.h - - - - -AM_CPPFLAGS = @AM_CPPFLAGS@ -I$(top_srcdir)/src/include -AM_CFLAGS = $(STATIC) -MAINTAINERCLEANFILES = Makefile.in diff --git a/src/spicelib/devices/jfet2/jfet2.c b/src/spicelib/devices/jfet2/jfet2.c deleted file mode 100644 index e2f90dcd1..000000000 --- a/src/spicelib/devices/jfet2/jfet2.c +++ /dev/null @@ -1,76 +0,0 @@ -/********** -Based on jfet.c -Copyright 1990 Regents of the University of California. All rights reserved. -Author: 1985 Thomas L. Quarles - -Modified to add PS model and new parameter definitions ( Anthony E. Parker ) - Copyright 1994 Macquarie University, Sydney Australia. - 10 Feb 1994: Parameter definitions called from jfetparm.h - Extra state vectors added to JFET2pTable -**********/ - -#include "ngspice/ngspice.h" -#include "ngspice/ifsim.h" -#include "ngspice/devdefs.h" -#include "jfet2defs.h" -#include "ngspice/suffix.h" - -IFparm JFET2pTable[] = { /* device parameters */ - IOPU("off", JFET2_OFF, IF_FLAG, "Device initially off"), - IOPAU("ic", JFET2_IC, IF_REALVEC,"Initial VDS,VGS vector"), - IOPU("area", JFET2_AREA, IF_REAL, "Area factor"), - IOPU("m", JFET2_M, IF_REAL, "Parallel Multiplier"), - IOPAU("ic-vds", JFET2_IC_VDS, IF_REAL, "Initial D-S voltage"), - IOPAU("ic-vgs", JFET2_IC_VGS, IF_REAL, "Initial G-S volrage"), - IOPU("temp", JFET2_TEMP, IF_REAL, "Instance temperature"), - IOPU("dtemp", JFET2_DTEMP, IF_REAL, "Instance temperature difference"), - OPU("drain-node", JFET2_DRAINNODE, IF_INTEGER,"Number of drain node"), - OPU("gate-node", JFET2_GATENODE, IF_INTEGER,"Number of gate node"), - OPU("source-node", JFET2_SOURCENODE, IF_INTEGER,"Number of source node"), - OPU("drain-prime-node", JFET2_DRAINPRIMENODE, IF_INTEGER,"Internal drain node"), - OPU("source-prime-node",JFET2_SOURCEPRIMENODE,IF_INTEGER,"Internal source node"), - OP("vgs", JFET2_VGS, IF_REAL, "Voltage G-S"), - OP("vgd", JFET2_VGD, IF_REAL, "Voltage G-D"), - OP("ig", JFET2_CG, IF_REAL, "Current at gate node"), - OP("id", JFET2_CD, IF_REAL, "Current at drain node"), - OP("is", JFET2_CS, IF_REAL, "Source current"), - OP("igd", JFET2_CGD, IF_REAL, "Current G-D"), - OP("gm", JFET2_GM, IF_REAL, "Transconductance"), - OP("gds", JFET2_GDS, IF_REAL, "Conductance D-S"), - OP("ggs", JFET2_GGS, IF_REAL, "Conductance G-S"), - OP("ggd", JFET2_GGD, IF_REAL, "Conductance G-D"), - OPU("qgs", JFET2_QGS, IF_REAL, "Charge storage G-S junction"), - OPU("qgd", JFET2_QGD, IF_REAL, "Charge storage G-D junction"), - OPU("cqgs", JFET2_CQGS, IF_REAL, "Capacitance due to charge storage G-S junction"), - OPU("cqgd", JFET2_CQGD, IF_REAL, "Capacitance due to charge storage G-D junction"), - OPU("p", JFET2_POWER,IF_REAL, "Power dissipated by the JFET2"), - OPU("vtrap",JFET2_VTRAP,IF_REAL, "Quiescent drain feedback potential"), - OPU("vpave",JFET2_PAVE, IF_REAL, "Quiescent power dissipation"), -}; - -IFparm JFET2mPTable[] = { /* model parameters */ - OP("type", JFET2_MOD_TYPE, IF_STRING, "N-type or P-type JFET2 model"), - IOP("njf", JFET2_MOD_NJF, IF_FLAG,"N type JFET2 model"), - IOP("pjf", JFET2_MOD_PJF, IF_FLAG,"P type JFET2 model"), -#define PARAM(code,id,flag,ref,default,descrip) IOP(code,id,IF_REAL,descrip), -#define PARAMR(code,id,flag,ref,default,descrip) IOPR(code,id,IF_REAL,descrip), -#define PARAMA(code,id,flag,ref,default,descrip) IOPA(code,id,IF_REAL,descrip), -#include "jfet2parm.h" - - OPU("gd", JFET2_MOD_DRAINCONDUCT, IF_REAL,"Drain conductance"), - OPU("gs", JFET2_MOD_SOURCECONDUCT,IF_REAL,"Source conductance"), - IOPU("tnom", JFET2_MOD_TNOM, IF_REAL,"parameter measurement temperature"), -}; - - -char *JFET2names[] = { - "Drain", - "Gate", - "Source" -}; - -int JFET2nSize = NUMELEMS(JFET2names); -int JFET2pTSize = NUMELEMS(JFET2pTable); -int JFET2mPTSize = NUMELEMS(JFET2mPTable); -int JFET2iSize = sizeof(JFET2instance); -int JFET2mSize = sizeof(JFET2model); diff --git a/src/spicelib/devices/jfet2/jfet2acld.c b/src/spicelib/devices/jfet2/jfet2acld.c deleted file mode 100644 index e56c3a9c2..000000000 --- a/src/spicelib/devices/jfet2/jfet2acld.c +++ /dev/null @@ -1,91 +0,0 @@ -/********** -Based on jfetacld.c -Copyright 1990 Regents of the University of California. All rights reserved. -Author: 1985 Thomas L. Quarles - -Modified to add PS model and new parameter definitions ( Anthony E. Parker ) - Copyright 1994 Macquarie University, Sydney Australia. - 10 Feb 1994: New call to PSacload() with matrix loading -**********/ - -#include "ngspice/ngspice.h" -#include "ngspice/cktdefs.h" -#include "jfet2defs.h" -#include "ngspice/sperror.h" -#include "psmodel.h" -#include "ngspice/suffix.h" - -int -JFET2acLoad(GENmodel *inModel, CKTcircuit *ckt) -{ - JFET2model *model = (JFET2model*)inModel; - JFET2instance *here; - double gdpr; - double gspr; - double gm; - double gds; - double ggs; - double xgs; - double ggd; - double xgd; - double xgm, xgds, vgd, vgs, cd; - - double m; - - for( ; model != NULL; model = JFET2nextModel(model)) { - - for( here = JFET2instances(model); here != NULL; - here = JFET2nextInstance(here)) { - - gdpr=model->JFET2drainConduct * here->JFET2area; - gspr=model->JFET2sourceConduct * here->JFET2area; - gm= *(ckt->CKTstate0 + here->JFET2gm) ; - gds= *(ckt->CKTstate0 + here->JFET2gds) ; - ggs= *(ckt->CKTstate0 + here->JFET2ggs) ; - xgs= *(ckt->CKTstate0 + here->JFET2qgs) * ckt->CKTomega ; - ggd= *(ckt->CKTstate0 + here->JFET2ggd) ; - xgd= *(ckt->CKTstate0 + here->JFET2qgd) * ckt->CKTomega ; - - vgs = *(ckt->CKTstate0 + here->JFET2vgs); - vgd = *(ckt->CKTstate0 + here->JFET2vgd); - cd = *(ckt->CKTstate0 + here->JFET2cd); - PSacload(ckt,model, here, vgs, vgd, cd, ckt->CKTomega, - &gm, &xgm, &gds, &xgds); - xgds += *(ckt->CKTstate0 + here->JFET2qds) * ckt->CKTomega ; - - m = here->JFET2m; - - *(here->JFET2drainPrimeDrainPrimePtr +1) += m * (xgds); - *(here->JFET2sourcePrimeSourcePrimePtr +1) += m * (xgds+xgm); - *(here->JFET2drainPrimeGatePtr +1) += m * (xgm); - *(here->JFET2drainPrimeSourcePrimePtr +1) -= m * (xgds+xgm); - *(here->JFET2sourcePrimeGatePtr +1) -= m * (xgm); - *(here->JFET2sourcePrimeDrainPrimePtr +1) -= m * (xgds); - - *(here->JFET2drainDrainPtr ) += m * (gdpr); - *(here->JFET2gateGatePtr ) += m * (ggd+ggs); - *(here->JFET2gateGatePtr +1) += m * (xgd+xgs); - *(here->JFET2sourceSourcePtr ) += m * (gspr); - *(here->JFET2drainPrimeDrainPrimePtr ) += m * (gdpr+gds+ggd); - *(here->JFET2drainPrimeDrainPrimePtr +1) += m * (xgd); - *(here->JFET2sourcePrimeSourcePrimePtr ) += m * (gspr+gds+gm+ggs); - *(here->JFET2sourcePrimeSourcePrimePtr +1) += m * (xgs); - *(here->JFET2drainDrainPrimePtr ) -= m * (gdpr); - *(here->JFET2gateDrainPrimePtr ) -= m * (ggd); - *(here->JFET2gateDrainPrimePtr +1) -= m * (xgd); - *(here->JFET2gateSourcePrimePtr ) -= m * (ggs); - *(here->JFET2gateSourcePrimePtr +1) -= m * (xgs); - *(here->JFET2sourceSourcePrimePtr ) -= m * (gspr); - *(here->JFET2drainPrimeDrainPtr ) -= m * (gdpr); - *(here->JFET2drainPrimeGatePtr ) += m * (-ggd+gm); - *(here->JFET2drainPrimeGatePtr +1) -= m * (xgd); - *(here->JFET2drainPrimeSourcePrimePtr ) += m * (-gds-gm); - *(here->JFET2sourcePrimeGatePtr ) += m * (-ggs-gm); - *(here->JFET2sourcePrimeGatePtr +1) -= m * (xgs); - *(here->JFET2sourcePrimeSourcePtr ) -= m * (gspr); - *(here->JFET2sourcePrimeDrainPrimePtr ) -= m * (gds); - - } - } - return(OK); -} diff --git a/src/spicelib/devices/jfet2/jfet2ask.c b/src/spicelib/devices/jfet2/jfet2ask.c deleted file mode 100644 index d00d030e6..000000000 --- a/src/spicelib/devices/jfet2/jfet2ask.c +++ /dev/null @@ -1,160 +0,0 @@ -/********** -Based on jfetask.c -Copyright 1990 Regents of the University of California. All rights reserved. -Author: 1987 Mathew Lew and Thomas L. Quarles - -Modified to add PS model and new parameter definitions ( Anthony E. Parker ) - Copyright 1994 Macquarie University, Sydney Australia. - 10 Feb 1994: JFET2vtrap and JFET2pave added -**********/ - -#include "ngspice/ngspice.h" -#include "ngspice/const.h" -#include "ngspice/ifsim.h" -#include "ngspice/cktdefs.h" -#include "ngspice/devdefs.h" -#include "jfet2defs.h" -#include "ngspice/sperror.h" -#include "ngspice/suffix.h" - - -/*ARGSUSED*/ -int -JFET2ask(CKTcircuit *ckt, GENinstance *inst, int which, IFvalue *value, - IFvalue *select) -{ - JFET2instance *here = (JFET2instance*)inst; - static char *msg = "Current and power not available for ac analysis"; - - NG_IGNORE(select); - - switch(which) { - case JFET2_TEMP: - value->rValue = here->JFET2temp-CONSTCtoK; - return(OK); - case JFET2_DTEMP: - value->rValue = here->JFET2dtemp; - return(OK); - case JFET2_AREA: - value->rValue = here->JFET2area; - value->rValue *=here->JFET2m; - return(OK); - case JFET2_M: - value->rValue = here->JFET2m; - return(OK); - case JFET2_IC_VDS: - value->rValue = here->JFET2icVDS; - return(OK); - case JFET2_IC_VGS: - value->rValue = here->JFET2icVGS; - return(OK); - case JFET2_OFF: - value->iValue = here->JFET2off; - return(OK); - case JFET2_DRAINNODE: - value->iValue = here->JFET2drainNode; - return(OK); - case JFET2_GATENODE: - value->iValue = here->JFET2gateNode; - return(OK); - case JFET2_SOURCENODE: - value->iValue = here->JFET2sourceNode; - return(OK); - case JFET2_DRAINPRIMENODE: - value->iValue = here->JFET2drainPrimeNode; - return(OK); - case JFET2_SOURCEPRIMENODE: - value->iValue = here->JFET2sourcePrimeNode; - return(OK); - case JFET2_VGS: - value->rValue = *(ckt->CKTstate0 + here->JFET2vgs); - return(OK); - case JFET2_VGD: - value->rValue = *(ckt->CKTstate0 + here->JFET2vgd); - return(OK); - case JFET2_CG: - value->rValue = *(ckt->CKTstate0 + here->JFET2cg); - value->rValue *=here->JFET2m; - return(OK); - case JFET2_CD: - value->rValue = *(ckt->CKTstate0 + here->JFET2cd); - value->rValue *=here->JFET2m; - return(OK); - case JFET2_CGD: - value->rValue = *(ckt->CKTstate0 + here->JFET2cgd); - value->rValue *=here->JFET2m; - return(OK); - case JFET2_GM: - value->rValue = *(ckt->CKTstate0 + here->JFET2gm); - value->rValue *=here->JFET2m; - return(OK); - case JFET2_GDS: - value->rValue = *(ckt->CKTstate0 + here->JFET2gds); - value->rValue *=here->JFET2m; - return(OK); - case JFET2_GGS: - value->rValue = *(ckt->CKTstate0 + here->JFET2ggs); - value->rValue *=here->JFET2m; - return(OK); - case JFET2_GGD: - value->rValue = *(ckt->CKTstate0 + here->JFET2ggd); - value->rValue *=here->JFET2m; - return(OK); - case JFET2_QGS: - value->rValue = *(ckt->CKTstate0 + here->JFET2qgs); - value->rValue *=here->JFET2m; - return(OK); - case JFET2_CQGS: - value->rValue = *(ckt->CKTstate0 + here->JFET2cqgs); - value->rValue *=here->JFET2m; - return(OK); - case JFET2_QGD: - value->rValue = *(ckt->CKTstate0 + here->JFET2qgd); - value->rValue *=here->JFET2m; - return(OK); - case JFET2_CQGD: - value->rValue = *(ckt->CKTstate0 + here->JFET2cqgd); - value->rValue *=here->JFET2m; - return(OK); - case JFET2_VTRAP: - value->rValue = *(ckt->CKTstate0 + here->JFET2vtrap); - return(OK); - case JFET2_PAVE: - value->rValue = *(ckt->CKTstate0 + here->JFET2pave); - return(OK); - case JFET2_CS : - if (ckt->CKTcurrentAnalysis & DOING_AC) { - errMsg = TMALLOC(char, strlen(msg) + 1); - errRtn = "JFET2ask"; - strcpy(errMsg,msg); - return(E_ASKCURRENT); - } else { - value->rValue = -*(ckt->CKTstate0 + here->JFET2cd); - value->rValue -= *(ckt->CKTstate0 + here->JFET2cg); - value->rValue *=here->JFET2m; - } - return(OK); - case JFET2_POWER : - if (ckt->CKTcurrentAnalysis & DOING_AC) { - errMsg = TMALLOC(char, strlen(msg) + 1); - errRtn = "JFET2ask"; - strcpy(errMsg,msg); - return(E_ASKPOWER); - } else { - value->rValue = *(ckt->CKTstate0 + here->JFET2cd) * - *(ckt->CKTrhsOld + here->JFET2drainNode); - value->rValue += *(ckt->CKTstate0 + here->JFET2cg) * - *(ckt->CKTrhsOld + here->JFET2gateNode); - value->rValue -= (*(ckt->CKTstate0 + here->JFET2cd) + - *(ckt->CKTstate0 + here->JFET2cg)) * - *(ckt->CKTrhsOld + here->JFET2sourceNode); - - value->rValue *=here->JFET2m; - } - return(OK); - default: - return(E_BADPARM); - } - /* NOTREACHED */ -} - diff --git a/src/spicelib/devices/jfet2/jfet2defs.h b/src/spicelib/devices/jfet2/jfet2defs.h deleted file mode 100644 index 1a9be74c9..000000000 --- a/src/spicelib/devices/jfet2/jfet2defs.h +++ /dev/null @@ -1,273 +0,0 @@ -/********** -Based on jfetdefs.h -Copyright 1990 Regents of the University of California. All rights reserved. -Author: 1985 Thomas L. Quarles - -Modified to add PS model and new parameter definitions ( Anthony E. Parker ) - Copyright 1994 Macquarie University, Sydney Australia. - 10 Feb 1994: Added xiwoo, d3 and alpha to JFET2instance - JFET2pave, JFET2vtrap ad JFET2_STATE_COUNT - Changed model to call jfetparm.h, added JFET2za to model struct - Defined JFET2_VTRAP and JFET2_PAVE -**********/ - -#ifndef JFET2 -#define JFET2 - -#include "ngspice/ifsim.h" -#include "ngspice/gendefs.h" -#include "ngspice/cktdefs.h" -#include "ngspice/complex.h" -#include "ngspice/noisedef.h" - - /* structures used to describe Junction Field Effect Transistors */ - -/* indices to an array of JFET2 noise sources */ - -enum { - JFET2RDNOIZ = 0, - JFET2RSNOIZ, - JFET2IDNOIZ, - JFET2FLNOIZ, - JFET2TOTNOIZ, - /* finally, the number of noise sources */ - JFET2NSRCS -}; - -/* information used to describe a single instance */ - -typedef struct sJFET2instance { - - struct GENinstance gen; - -#define JFET2modPtr(inst) ((struct sJFET2model *)((inst)->gen.GENmodPtr)) -#define JFET2nextInstance(inst) ((struct sJFET2instance *)((inst)->gen.GENnextInstance)) -#define JFET2name gen.GENname -#define JFET2state gen.GENstate - - const int JFET2drainNode; /* number of drain node of jfet */ - const int JFET2gateNode; /* number of gate node of jfet */ - const int JFET2sourceNode; /* number of source node of jfet */ - int JFET2drainPrimeNode; /* number of internal drain node of jfet */ - int JFET2sourcePrimeNode; /* number of internal source node of jfet */ - - double *JFET2drainDrainPrimePtr; /* pointer to sparse matrix at - * (drain,drain prime) */ - double *JFET2gateDrainPrimePtr; /* pointer to sparse matrix at - * (gate,drain prime) */ - double *JFET2gateSourcePrimePtr; /* pointer to sparse matrix at - * (gate,source prime) */ - double *JFET2sourceSourcePrimePtr; /* pointer to sparse matrix at - * (source,source prime) */ - double *JFET2drainPrimeDrainPtr; /* pointer to sparse matrix at - * (drain prime,drain) */ - double *JFET2drainPrimeGatePtr; /* pointer to sparse matrix at - * (drain prime,gate) */ - double *JFET2drainPrimeSourcePrimePtr; /* pointer to sparse matrix - * (drain prime,source prime) */ - double *JFET2sourcePrimeGatePtr; /* pointer to sparse matrix at - * (source prime,gate) */ - double *JFET2sourcePrimeSourcePtr; /* pointer to sparse matrix at - * (source prime,source) */ - double *JFET2sourcePrimeDrainPrimePtr; /* pointer to sparse matrix - * (source prime,drain prime) */ - double *JFET2drainDrainPtr; /* pointer to sparse matrix at - * (drain,drain) */ - double *JFET2gateGatePtr; /* pointer to sparse matrix at - * (gate,gate) */ - double *JFET2sourceSourcePtr; /* pointer to sparse matrix at - * (source,source) */ - double *JFET2drainPrimeDrainPrimePtr; /* pointer to sparse matrix - * (drain prime,drain prime) */ - double *JFET2sourcePrimeSourcePrimePtr; /* pointer to sparse matrix - * (source prime,source prime) */ - - int JFET2mode; - /* distortion analysis Taylor coeffs. */ - -/* - * naming convention: - * x = vgs - * y = vds - * cdr = cdrain - */ - -#define JFET2NDCOEFFS 21 - -#ifndef NODISTO - double JFET2dCoeffs[JFET2NDCOEFFS]; -#else /* NODISTO */ - double *JFET2dCoeffs; -#endif /* NODISTO */ - -#ifndef CONFIG - -#define cdr_x JFET2dCoeffs[0] -#define cdr_y JFET2dCoeffs[1] -#define cdr_x2 JFET2dCoeffs[2] -#define cdr_y2 JFET2dCoeffs[3] -#define cdr_xy JFET2dCoeffs[4] -#define cdr_x3 JFET2dCoeffs[5] -#define cdr_y3 JFET2dCoeffs[6] -#define cdr_x2y JFET2dCoeffs[7] -#define cdr_xy2 JFET2dCoeffs[8] - -#define ggs1 JFET2dCoeffs[9] -#define ggd1 JFET2dCoeffs[10] -#define ggs2 JFET2dCoeffs[11] -#define ggd2 JFET2dCoeffs[12] -#define ggs3 JFET2dCoeffs[13] -#define ggd3 JFET2dCoeffs[14] -#define capgs1 JFET2dCoeffs[15] -#define capgd1 JFET2dCoeffs[16] -#define capgs2 JFET2dCoeffs[17] -#define capgd2 JFET2dCoeffs[18] -#define capgs3 JFET2dCoeffs[19] -#define capgd3 JFET2dCoeffs[20] - -#endif - -#ifndef NONOISE - double JFET2nVar[NSTATVARS][JFET2NSRCS]; -#else /* NONOISE */ - double **JFET2nVar; -#endif /* NONOISE */ - - unsigned JFET2off :1; /* 'off' flag for jfet */ - unsigned JFET2areaGiven : 1; /* flag to indicate area was specified */ - unsigned JFET2mGiven : 1; /* flag to indicate multiplier given */ - unsigned JFET2icVDSGiven : 1; /* initial condition given flag for V D-S*/ - unsigned JFET2icVGSGiven : 1; /* initial condition given flag for V G-S*/ - unsigned JFET2tempGiven : 1; /* flag to indicate instance temp given */ - unsigned JFET2dtempGiven : 1; /* flag to indicate temperature difference given */ - - - double JFET2area; /* area factor for the jfet */ - double JFET2m; /* parallel multiplier for the diode */ - double JFET2icVDS; /* initial condition voltage D-S*/ - double JFET2icVGS; /* initial condition voltage G-S*/ - double JFET2temp; /* operating temperature */ - double JFET2dtemp; /* Instance temperature difference */ - double JFET2tSatCur; /* temperature adjusted saturation current */ - double JFET2tGatePot; /* temperature adjusted gate potential */ - double JFET2tCGS; /* temperature corrected G-S capacitance */ - double JFET2tCGD; /* temperature corrected G-D capacitance */ - double JFET2corDepCap; /* joining point of the fwd bias dep. cap eq.s */ - double JFET2vcrit; /* critical voltage for the instance */ - double JFET2f1; /* coefficient of capacitance polynomial exp */ - double JFET2xiwoo; /* velocity saturation potential */ - double JFET2d3; /* Dual Power-law parameter */ - double JFET2alpha; /* capacitance model transition parameter */ - -} JFET2instance ; - -#define JFET2vgs JFET2state -#define JFET2vgd JFET2state+1 -#define JFET2cg JFET2state+2 -#define JFET2cd JFET2state+3 -#define JFET2cgd JFET2state+4 -#define JFET2gm JFET2state+5 -#define JFET2gds JFET2state+6 -#define JFET2ggs JFET2state+7 -#define JFET2ggd JFET2state+8 -#define JFET2qgs JFET2state+9 -#define JFET2cqgs JFET2state+10 -#define JFET2qgd JFET2state+11 -#define JFET2cqgd JFET2state+12 -#define JFET2qds JFET2state+13 -#define JFET2cqds JFET2state+14 -#define JFET2pave JFET2state+15 -#define JFET2vtrap JFET2state+16 -#define JFET2vgstrap JFET2state+17 -#define JFET2unknown JFET2state+18 - -#define JFET2numStates 19 - -/* per model data */ - -typedef struct sJFET2model { /* model structure for a jfet */ - - struct GENmodel gen; - -#define JFET2modType gen.GENmodType -#define JFET2nextModel(inst) ((struct sJFET2model *)((inst)->gen.GENnextModel)) -#define JFET2instances(inst) ((JFET2instance *)((inst)->gen.GENinstances)) -#define JFET2modName gen.GENmodName - - int JFET2type; - -#define PARAM(code,id,flag,ref,default,descrip) double ref; -#include "jfet2parm.h" - - double JFET2drainConduct; - double JFET2sourceConduct; - double JFET2f2; - double JFET2f3; - double JFET2za; /* saturation index parameter */ - double JFET2tnom; /* temperature at which parameters were measured */ - -#define PARAM(code,id,flag,ref,default,descrip) unsigned flag : 1; -#include "jfet2parm.h" - unsigned JFET2tnomGiven : 1; /* user specified Tnom for model */ - -} JFET2model; - -#ifndef NJF - -#define NJF 1 -#define PJF -1 - -#endif /*NJF*/ - -/* device parameters */ -enum { - JFET2_AREA = 1, - JFET2_IC_VDS, - JFET2_IC_VGS, - JFET2_IC, - JFET2_OFF, - JFET2_TEMP, - JFET2_DTEMP, - JFET2_M, -}; - -/* device questions */ -enum { - JFET2_DRAINNODE = 301, - JFET2_GATENODE, - JFET2_SOURCENODE, - JFET2_DRAINPRIMENODE, - JFET2_SOURCEPRIMENODE, - JFET2_VGS, - JFET2_VGD, - JFET2_CG, - JFET2_CD, - JFET2_CGD, - JFET2_GM, - JFET2_GDS, - JFET2_GGS, - JFET2_GGD, - JFET2_QGS, - JFET2_CQGS, - JFET2_QGD, - JFET2_CQGD, - JFET2_CS, - JFET2_POWER, - JFET2_VTRAP, - JFET2_PAVE, -}; - -/* model questions */ -enum { - JFET2_MOD_DRAINCONDUCT = 301, - JFET2_MOD_SOURCECONDUCT, - JFET2_MOD_DEPLETIONCAP, - JFET2_MOD_VCRIT, - JFET2_MOD_TYPE, -}; - -/* function definitions */ - -#include "jfet2ext.h" - -#endif /*JFET2*/ diff --git a/src/spicelib/devices/jfet2/jfet2ext.h b/src/spicelib/devices/jfet2/jfet2ext.h deleted file mode 100644 index b37f8f3af..000000000 --- a/src/spicelib/devices/jfet2/jfet2ext.h +++ /dev/null @@ -1,21 +0,0 @@ -/********** -Based on jfetext.h -Copyright 1990 Regents of the University of California. All rights reserved. -Author: 1985 Thomas L. Quarles - -Modified to add PS model and new parameter definitions ( Anthony E. Parker ) - Copyright 1994 Macquarie University, Sydney Australia. -**********/ - -extern int JFET2acLoad(GENmodel*,CKTcircuit*); -extern int JFET2ask(CKTcircuit*,GENinstance*,int,IFvalue*,IFvalue*); -extern int JFET2getic(GENmodel*,CKTcircuit*); -extern int JFET2load(GENmodel*,CKTcircuit*); -extern int JFET2mAsk(CKTcircuit*,GENmodel*,int,IFvalue*); -extern int JFET2mParam(int,IFvalue*,GENmodel*); -extern int JFET2param(int,IFvalue*,GENinstance*,IFvalue*); -extern int JFET2setup(SMPmatrix*,GENmodel*,CKTcircuit*,int*); -extern int JFET2unsetup(GENmodel*,CKTcircuit*); -extern int JFET2temp(GENmodel*,CKTcircuit*); -extern int JFET2trunc(GENmodel*,CKTcircuit*,double*); -extern int JFET2noise(int,int,GENmodel*,CKTcircuit*,Ndata*,double*); diff --git a/src/spicelib/devices/jfet2/jfet2ic.c b/src/spicelib/devices/jfet2/jfet2ic.c deleted file mode 100644 index c4bfc5404..000000000 --- a/src/spicelib/devices/jfet2/jfet2ic.c +++ /dev/null @@ -1,44 +0,0 @@ -/********** -Based on jfetic.c -Copyright 1990 Regents of the University of California. All rights reserved. -Author: 1985 Thomas L. Quarles - -Modified to jfet2 for PS model definition ( Anthony E. Parker ) - Copyright 1994 Macquarie University, Sydney Australia. -**********/ -/* - */ - -#include "ngspice/ngspice.h" -#include "ngspice/cktdefs.h" -#include "jfet2defs.h" -#include "ngspice/sperror.h" -#include "ngspice/suffix.h" - - -int -JFET2getic(GENmodel *inModel, CKTcircuit *ckt) -{ - JFET2model *model = (JFET2model*)inModel; - JFET2instance *here; - /* - * grab initial conditions out of rhs array. User specified, so use - * external nodes to get values - */ - - for( ; model ; model = JFET2nextModel(model)) { - for(here = JFET2instances(model); here ; here = JFET2nextInstance(here)) { - if(!here->JFET2icVDSGiven) { - here->JFET2icVDS = - *(ckt->CKTrhs + here->JFET2drainNode) - - *(ckt->CKTrhs + here->JFET2sourceNode); - } - if(!here->JFET2icVGSGiven) { - here->JFET2icVGS = - *(ckt->CKTrhs + here->JFET2gateNode) - - *(ckt->CKTrhs + here->JFET2sourceNode); - } - } - } - return(OK); -} diff --git a/src/spicelib/devices/jfet2/jfet2init.c b/src/spicelib/devices/jfet2/jfet2init.c deleted file mode 100644 index ecfc92730..000000000 --- a/src/spicelib/devices/jfet2/jfet2init.c +++ /dev/null @@ -1,76 +0,0 @@ -#include "ngspice/config.h" - -#include "ngspice/devdefs.h" - -#include "jfet2itf.h" -#include "jfet2ext.h" -#include "jfet2init.h" - - -SPICEdev JFET2info = { - .DEVpublic = { - .name = "JFET2", - .description = "Short channel field effect transistor", - .terms = &JFET2nSize, - .numNames = &JFET2nSize, - .termNames = JFET2names, - .numInstanceParms = &JFET2pTSize, - .instanceParms = JFET2pTable, - .numModelParms = &JFET2mPTSize, - .modelParms = JFET2mPTable, - .flags = DEV_DEFAULT, - -#ifdef XSPICE - .cm_func = NULL, - .num_conn = 0, - .conn = NULL, - .num_param = 0, - .param = NULL, - .num_inst_var = 0, - .inst_var = NULL, -#endif - }, - - .DEVparam = JFET2param, - .DEVmodParam = JFET2mParam, - .DEVload = JFET2load, - .DEVsetup = JFET2setup, - .DEVunsetup = JFET2unsetup, - .DEVpzSetup = JFET2setup, - .DEVtemperature = JFET2temp, - .DEVtrunc = JFET2trunc, - .DEVfindBranch = NULL, - .DEVacLoad = JFET2acLoad, - .DEVaccept = NULL, - .DEVdestroy = NULL, - .DEVmodDelete = NULL, - .DEVdelete = NULL, - .DEVsetic = JFET2getic, - .DEVask = JFET2ask, - .DEVmodAsk = JFET2mAsk, - .DEVpzLoad = NULL, - .DEVconvTest = NULL, - .DEVsenSetup = NULL, - .DEVsenLoad = NULL, - .DEVsenUpdate = NULL, - .DEVsenAcLoad = NULL, - .DEVsenPrint = NULL, - .DEVsenTrunc = NULL, - .DEVdisto = NULL, - .DEVnoise = JFET2noise, - .DEVsoaCheck = NULL, - .DEVinstSize = &JFET2iSize, - .DEVmodSize = &JFET2mSize, - -#ifdef CIDER - .DEVdump = NULL, - .DEVacct = NULL, -#endif -}; - - -SPICEdev * -get_jfet2_info(void) -{ - return &JFET2info; -} diff --git a/src/spicelib/devices/jfet2/jfet2init.h b/src/spicelib/devices/jfet2/jfet2init.h deleted file mode 100644 index 48dd27dd2..000000000 --- a/src/spicelib/devices/jfet2/jfet2init.h +++ /dev/null @@ -1,13 +0,0 @@ -#ifndef _JFET2INIT_H -#define _JFET2INIT_H - -extern IFparm JFET2pTable[ ]; -extern IFparm JFET2mPTable[ ]; -extern char *JFET2names[ ]; -extern int JFET2pTSize; -extern int JFET2mPTSize; -extern int JFET2nSize; -extern int JFET2iSize; -extern int JFET2mSize; - -#endif diff --git a/src/spicelib/devices/jfet2/jfet2itf.h b/src/spicelib/devices/jfet2/jfet2itf.h deleted file mode 100644 index 600c37967..000000000 --- a/src/spicelib/devices/jfet2/jfet2itf.h +++ /dev/null @@ -1,14 +0,0 @@ -/********** -Based on jfetitf.h -Copyright 1990 Regents of the University of California. All rights reserved. - -Modified to add PS model and new parameter definitions ( Anthony E. Parker ) - Copyright 1994 Macquarie University, Sydney Australia. - pz and disto not supported -**********/ -#ifndef DEV_JFET2 -#define DEV_JFET2 - -SPICEdev *get_jfet2_info(void); - -#endif diff --git a/src/spicelib/devices/jfet2/jfet2load.c b/src/spicelib/devices/jfet2/jfet2load.c deleted file mode 100644 index ff68f3745..000000000 --- a/src/spicelib/devices/jfet2/jfet2load.c +++ /dev/null @@ -1,328 +0,0 @@ -/********** -Based on jfetload.c -Copyright 1990 Regents of the University of California. All rights reserved. -Author: 1985 Thomas L. Quarles - -Modified to add PS model and new parameter definitions ( Anthony E. Parker ) - Copyright 1994 Macquarie University, Sydney Australia. - 10 Feb 1994: New code added to call psmodel.c routines -**********/ - -#include "ngspice/ngspice.h" -#include "ngspice/cktdefs.h" -#include "jfet2defs.h" -#include "ngspice/const.h" -#include "ngspice/trandefs.h" -#include "ngspice/sperror.h" -#include "ngspice/devdefs.h" -#include "psmodel.h" -#include "ngspice/suffix.h" - -int -JFET2load(GENmodel *inModel, CKTcircuit *ckt) - /* actually load the current resistance value into the - * sparse matrix previously provided - */ -{ - JFET2model *model = (JFET2model*)inModel; - JFET2instance *here; - double capgd; - double capgs; - double cd; - double cdhat = 0.0; - double cdreq; - double ceq; - double ceqgd; - double ceqgs; - double cg; - double cgd; - double cghat = 0.0; - double delvds; - double delvgd; - double delvgs; - double gdpr; - double gds; - double geq; - double ggd; - double ggs; - double gm; - double gspr; - double vds; - double vgd; - double vgs; -#ifndef PREDICTOR - double xfact; -#endif - int icheck; - int ichk1; - int error; - - double m; - - /* loop through all the models */ - for( ; model != NULL; model = JFET2nextModel(model)) { - - /* loop through all the instances of the model */ - for (here = JFET2instances(model); here != NULL ; - here=JFET2nextInstance(here)) { - /* - * dc model parameters - */ - gdpr=model->JFET2drainConduct*here->JFET2area; - gspr=model->JFET2sourceConduct*here->JFET2area; - /* - * initialization - */ - icheck=1; - if( ckt->CKTmode & MODEINITSMSIG) { - vgs= *(ckt->CKTstate0 + here->JFET2vgs); - vgd= *(ckt->CKTstate0 + here->JFET2vgd); - } else if (ckt->CKTmode & MODEINITTRAN) { - vgs= *(ckt->CKTstate1 + here->JFET2vgs); - vgd= *(ckt->CKTstate1 + here->JFET2vgd); - } else if ( (ckt->CKTmode & MODEINITJCT) && - (ckt->CKTmode & MODETRANOP) && - (ckt->CKTmode & MODEUIC) ) { - vds=model->JFET2type*here->JFET2icVDS; - vgs=model->JFET2type*here->JFET2icVGS; - vgd=vgs-vds; - } else if ( (ckt->CKTmode & MODEINITJCT) && - (here->JFET2off == 0) ) { - vgs = -1; - vgd = -1; - } else if( (ckt->CKTmode & MODEINITJCT) || - ((ckt->CKTmode & MODEINITFIX) && (here->JFET2off))) { - vgs = 0; - vgd = 0; - } else { -#ifndef PREDICTOR - if(ckt->CKTmode & MODEINITPRED) { - xfact=ckt->CKTdelta/ckt->CKTdeltaOld[1]; - *(ckt->CKTstate0 + here->JFET2vgs)= - *(ckt->CKTstate1 + here->JFET2vgs); - vgs=(1+xfact)* *(ckt->CKTstate1 + here->JFET2vgs)-xfact* - *(ckt->CKTstate2 + here->JFET2vgs); - *(ckt->CKTstate0 + here->JFET2vgd)= - *(ckt->CKTstate1 + here->JFET2vgd); - vgd=(1+xfact)* *(ckt->CKTstate1 + here->JFET2vgd)-xfact* - *(ckt->CKTstate2 + here->JFET2vgd); - *(ckt->CKTstate0 + here->JFET2cg)= - *(ckt->CKTstate1 + here->JFET2cg); - *(ckt->CKTstate0 + here->JFET2cd)= - *(ckt->CKTstate1 + here->JFET2cd); - *(ckt->CKTstate0 + here->JFET2cgd)= - *(ckt->CKTstate1 + here->JFET2cgd); - *(ckt->CKTstate0 + here->JFET2gm)= - *(ckt->CKTstate1 + here->JFET2gm); - *(ckt->CKTstate0 + here->JFET2gds)= - *(ckt->CKTstate1 + here->JFET2gds); - *(ckt->CKTstate0 + here->JFET2ggs)= - *(ckt->CKTstate1 + here->JFET2ggs); - *(ckt->CKTstate0 + here->JFET2ggd)= - *(ckt->CKTstate1 + here->JFET2ggd); - } else { -#endif /*PREDICTOR*/ - /* - * compute new nonlinear branch voltages - */ - vgs=model->JFET2type* - (*(ckt->CKTrhsOld+ here->JFET2gateNode)- - *(ckt->CKTrhsOld+ - here->JFET2sourcePrimeNode)); - vgd=model->JFET2type* - (*(ckt->CKTrhsOld+here->JFET2gateNode)- - *(ckt->CKTrhsOld+ - here->JFET2drainPrimeNode)); -#ifndef PREDICTOR - } -#endif /*PREDICTOR*/ - delvgs=vgs- *(ckt->CKTstate0 + here->JFET2vgs); - delvgd=vgd- *(ckt->CKTstate0 + here->JFET2vgd); - delvds=delvgs-delvgd; - cghat= *(ckt->CKTstate0 + here->JFET2cg)+ - *(ckt->CKTstate0 + here->JFET2ggd)*delvgd+ - *(ckt->CKTstate0 + here->JFET2ggs)*delvgs; - cdhat= *(ckt->CKTstate0 + here->JFET2cd)+ - *(ckt->CKTstate0 + here->JFET2gm)*delvgs+ - *(ckt->CKTstate0 + here->JFET2gds)*delvds- - *(ckt->CKTstate0 + here->JFET2ggd)*delvgd; - /* - * bypass if solution has not changed - */ - if((ckt->CKTbypass) && - (!(ckt->CKTmode & MODEINITPRED)) && - (fabs(delvgs) < ckt->CKTreltol*MAX(fabs(vgs), - fabs(*(ckt->CKTstate0 + here->JFET2vgs)))+ - ckt->CKTvoltTol) ) - if ( (fabs(delvgd) < ckt->CKTreltol*MAX(fabs(vgd), - fabs(*(ckt->CKTstate0 + here->JFET2vgd)))+ - ckt->CKTvoltTol)) - if ( (fabs(cghat-*(ckt->CKTstate0 + here->JFET2cg)) - < ckt->CKTreltol*MAX(fabs(cghat), - fabs(*(ckt->CKTstate0 + here->JFET2cg)))+ - ckt->CKTabstol) ) if ( /* hack - expression too big */ - (fabs(cdhat-*(ckt->CKTstate0 + here->JFET2cd)) - < ckt->CKTreltol*MAX(fabs(cdhat), - fabs(*(ckt->CKTstate0 + here->JFET2cd)))+ - ckt->CKTabstol) ) { - - /* we can do a bypass */ - vgs= *(ckt->CKTstate0 + here->JFET2vgs); - vgd= *(ckt->CKTstate0 + here->JFET2vgd); - vds= vgs-vgd; - cg= *(ckt->CKTstate0 + here->JFET2cg); - cd= *(ckt->CKTstate0 + here->JFET2cd); - cgd= *(ckt->CKTstate0 + here->JFET2cgd); - gm= *(ckt->CKTstate0 + here->JFET2gm); - gds= *(ckt->CKTstate0 + here->JFET2gds); - ggs= *(ckt->CKTstate0 + here->JFET2ggs); - ggd= *(ckt->CKTstate0 + here->JFET2ggd); - goto load; - } - /* - * limit nonlinear branch voltages - */ - ichk1=1; - vgs = DEVpnjlim(vgs,*(ckt->CKTstate0 + here->JFET2vgs), - (here->JFET2temp*CONSTKoverQ), here->JFET2vcrit, &icheck); - vgd = DEVpnjlim(vgd,*(ckt->CKTstate0 + here->JFET2vgd), - (here->JFET2temp*CONSTKoverQ), here->JFET2vcrit,&ichk1); - if (ichk1 == 1) { - icheck=1; - } - vgs = DEVfetlim(vgs,*(ckt->CKTstate0 + here->JFET2vgs), - model->JFET2vto); - vgd = DEVfetlim(vgd,*(ckt->CKTstate0 + here->JFET2vgd), - model->JFET2vto); - } - /* - * determine dc current and derivatives - */ - vds=vgs-vgd; - if (vds < 0.0) { - cd = -PSids(ckt, model, here, vgd, vgs, - &cgd, &cg, &ggd, &ggs, &gm, &gds); - gds += gm; - gm = -gm; - } else { - cd = PSids(ckt, model, here, vgs, vgd, - &cg, &cgd, &ggs, &ggd, &gm, &gds); - } - cg = cg + cgd; - cd = cd - cgd; - - if ( (ckt->CKTmode & (MODETRAN | MODEAC | MODEINITSMSIG) ) || - ((ckt->CKTmode & MODETRANOP) && (ckt->CKTmode & MODEUIC)) ){ - /* - * charge storage elements - */ - double capds = model->JFET2capds*here->JFET2area; - - PScharge(ckt, model, here, vgs, vgd, &capgs, &capgd); - - *(ckt->CKTstate0 + here->JFET2qds) = capds * vds; - - /* - * store small-signal parameters - */ - if( (!(ckt->CKTmode & MODETRANOP)) || - (!(ckt->CKTmode & MODEUIC)) ) { - if(ckt->CKTmode & MODEINITSMSIG) { - *(ckt->CKTstate0 + here->JFET2qgs) = capgs; - *(ckt->CKTstate0 + here->JFET2qgd) = capgd; - *(ckt->CKTstate0 + here->JFET2qds) = capds; - continue; /*go to 1000*/ - } - /* - * transient analysis - */ - if(ckt->CKTmode & MODEINITTRAN) { - *(ckt->CKTstate1 + here->JFET2qgs) = - *(ckt->CKTstate0 + here->JFET2qgs); - *(ckt->CKTstate1 + here->JFET2qgd) = - *(ckt->CKTstate0 + here->JFET2qgd); - *(ckt->CKTstate1 + here->JFET2qds) = - *(ckt->CKTstate0 + here->JFET2qds); - } - error = NIintegrate(ckt,&geq,&ceq,capgs,here->JFET2qgs); - if(error) return(error); - ggs = ggs + geq; - cg = cg + *(ckt->CKTstate0 + here->JFET2cqgs); - error = NIintegrate(ckt,&geq,&ceq,capgd,here->JFET2qgd); - if(error) return(error); - ggd = ggd + geq; - cg = cg + *(ckt->CKTstate0 + here->JFET2cqgd); - cd = cd - *(ckt->CKTstate0 + here->JFET2cqgd); - cgd = cgd + *(ckt->CKTstate0 + here->JFET2cqgd); - error = NIintegrate(ckt,&geq,&ceq,capds,here->JFET2qds); - cd = cd + *(ckt->CKTstate0 + here->JFET2cqds); - if(error) return(error); - if (ckt->CKTmode & MODEINITTRAN) { - *(ckt->CKTstate1 + here->JFET2cqgs) = - *(ckt->CKTstate0 + here->JFET2cqgs); - *(ckt->CKTstate1 + here->JFET2cqgd) = - *(ckt->CKTstate0 + here->JFET2cqgd); - *(ckt->CKTstate1 + here->JFET2cqds) = - *(ckt->CKTstate0 + here->JFET2cqds); - } - } - } - /* - * check convergence - */ - if( (!(ckt->CKTmode & MODEINITFIX)) | (!(ckt->CKTmode & MODEUIC))) { - if((icheck == 1) || - (fabs(cghat-cg) >= ckt->CKTreltol* - MAX(fabs(cghat),fabs(cg))+ckt->CKTabstol) || - (fabs(cdhat-cd) > ckt->CKTreltol* - MAX(fabs(cdhat),fabs(cd))+ckt->CKTabstol)) { - ckt->CKTnoncon++; - ckt->CKTtroubleElt = (GENinstance *) here; - } - } - *(ckt->CKTstate0 + here->JFET2vgs) = vgs; - *(ckt->CKTstate0 + here->JFET2vgd) = vgd; - *(ckt->CKTstate0 + here->JFET2cg) = cg; - *(ckt->CKTstate0 + here->JFET2cd) = cd; - *(ckt->CKTstate0 + here->JFET2cgd) = cgd; - *(ckt->CKTstate0 + here->JFET2gm) = gm; - *(ckt->CKTstate0 + here->JFET2gds) = gds; - *(ckt->CKTstate0 + here->JFET2ggs) = ggs; - *(ckt->CKTstate0 + here->JFET2ggd) = ggd; - /* - * load current vector - */ -load: - - m = here->JFET2m; - - ceqgd=model->JFET2type*(cgd-ggd*vgd); - ceqgs=model->JFET2type*((cg-cgd)-ggs*vgs); - cdreq=model->JFET2type*((cd+cgd)-gds*vds-gm*vgs); - *(ckt->CKTrhs + here->JFET2gateNode) += m * (-ceqgs-ceqgd); - *(ckt->CKTrhs + here->JFET2drainPrimeNode) += - m * (-cdreq+ceqgd); - *(ckt->CKTrhs + here->JFET2sourcePrimeNode) += - m * (cdreq+ceqgs); - /* - * load y matrix - */ - *(here->JFET2drainDrainPrimePtr) += m * (-gdpr); - *(here->JFET2gateDrainPrimePtr) += m * (-ggd); - *(here->JFET2gateSourcePrimePtr) += m * (-ggs); - *(here->JFET2sourceSourcePrimePtr) += m * (-gspr); - *(here->JFET2drainPrimeDrainPtr) += m * (-gdpr); - *(here->JFET2drainPrimeGatePtr) += m * (gm-ggd); - *(here->JFET2drainPrimeSourcePrimePtr) += m * (-gds-gm); - *(here->JFET2sourcePrimeGatePtr) += m * (-ggs-gm); - *(here->JFET2sourcePrimeSourcePtr) += m * (-gspr); - *(here->JFET2sourcePrimeDrainPrimePtr) += m * (-gds); - *(here->JFET2drainDrainPtr) += m * (gdpr); - *(here->JFET2gateGatePtr) += m * (ggd+ggs); - *(here->JFET2sourceSourcePtr) += m * (gspr); - *(here->JFET2drainPrimeDrainPrimePtr) += m * (gdpr+gds+ggd); - *(here->JFET2sourcePrimeSourcePrimePtr) += m * (gspr+gds+gm+ggs); - } - } - return(OK); -} diff --git a/src/spicelib/devices/jfet2/jfet2mask.c b/src/spicelib/devices/jfet2/jfet2mask.c deleted file mode 100644 index f66acf2e0..000000000 --- a/src/spicelib/devices/jfet2/jfet2mask.c +++ /dev/null @@ -1,57 +0,0 @@ -/********** -Based on jfetmask.c -Copyright 1990 Regents of the University of California. All rights reserved. -Author: 1987 Mathew Lew and Thomas L. Quarles - -Modified to add PS model and new parameter definitions ( Anthony E. Parker ) - Copyright 1994 Macquarie University, Sydney Australia. - 10 Feb 1994: Added call to jfetparm.h -**********/ -/* - */ - -#include "ngspice/ngspice.h" -#include "ngspice/const.h" -#include "ngspice/ifsim.h" -#include "ngspice/cktdefs.h" -#include "ngspice/devdefs.h" -#include "jfet2defs.h" -#include "ngspice/sperror.h" -#include "ngspice/suffix.h" - - -/*ARGSUSED*/ -int -JFET2mAsk(CKTcircuit *ckt, GENmodel *inModel, int which, IFvalue *value) -{ - JFET2model *model = (JFET2model*)inModel; - - NG_IGNORE(ckt); - - switch(which) { - case JFET2_MOD_TNOM: - value->rValue = model->JFET2tnom-CONSTCtoK; - return(OK); - -#define PARAM(code,id,flag,ref,default,descrip) case id: \ - value->rValue = model->ref; return(OK); -#include "jfet2parm.h" - - case JFET2_MOD_DRAINCONDUCT: - value->rValue = model->JFET2drainConduct; - return(OK); - case JFET2_MOD_SOURCECONDUCT: - value->rValue = model->JFET2sourceConduct; - return(OK); - case JFET2_MOD_TYPE: - if (model->JFET2type == NJF) - value->sValue = "njf"; - else - value->sValue = "pjf"; - return(OK); - default: - return(E_BADPARM); - } - /* NOTREACHED */ -} - diff --git a/src/spicelib/devices/jfet2/jfet2mpar.c b/src/spicelib/devices/jfet2/jfet2mpar.c deleted file mode 100644 index efdaab944..000000000 --- a/src/spicelib/devices/jfet2/jfet2mpar.c +++ /dev/null @@ -1,45 +0,0 @@ -/********** -Based on jfetmpar.c -Copyright 1990 Regents of the University of California. All rights reserved. -Author: 1985 Thomas L. Quarles - -Modified to add PS model and new parameter definitions ( Anthony E. Parker ) - Copyright 1994 Macquarie University, Sydney Australia. - 10 Feb 1994: Added call to jfetparm.h -**********/ - -#include "ngspice/ngspice.h" -#include "ngspice/const.h" -#include "ngspice/ifsim.h" -#include "jfet2defs.h" -#include "ngspice/sperror.h" -#include "ngspice/suffix.h" - - -int -JFET2mParam(int param, IFvalue *value, GENmodel *inModels) -{ - JFET2model *model = (JFET2model*)inModels; - switch(param) { - case JFET2_MOD_TNOM: - model->JFET2tnomGiven = TRUE; - model->JFET2tnom = value->rValue+CONSTCtoK; - break; -#define PARAM(code,id,flag,ref,default,descrip) case id: \ - model->flag = TRUE; model->ref = value->rValue; break; -#include "jfet2parm.h" - case JFET2_MOD_NJF: - if(value->iValue) { - model->JFET2type = NJF; - } - break; - case JFET2_MOD_PJF: - if(value->iValue) { - model->JFET2type = PJF; - } - break; - default: - return(E_BADPARM); - } - return(OK); -} diff --git a/src/spicelib/devices/jfet2/jfet2noi.c b/src/spicelib/devices/jfet2/jfet2noi.c deleted file mode 100644 index 18742e097..000000000 --- a/src/spicelib/devices/jfet2/jfet2noi.c +++ /dev/null @@ -1,185 +0,0 @@ -/********** -based on jfetnoi.c -Copyright 1990 Regents of the University of California. All rights reserved. -Author: 1987 Gary W. Ng - -Modified to jfet2 for PS model definition ( Anthony E. Parker ) - Copyright 1994 Macquarie University, Sydney Australia. -**********/ - -#include "ngspice/ngspice.h" -#include "jfet2defs.h" -#include "ngspice/cktdefs.h" -#include "ngspice/iferrmsg.h" -#include "ngspice/noisedef.h" -#include "ngspice/suffix.h" - -/* - * JFET2noise (mode, operation, firstModel, ckt, data, OnDens) - * This routine names and evaluates all of the noise sources - * associated with JFET2's. It starts with the model *firstModel and - * traverses all of its insts. It then proceeds to any other models - * on the linked list. The total output noise density generated by - * all of the JFET2's is summed with the variable "OnDens". - */ - - -int -JFET2noise (int mode, int operation, GENmodel *genmodel, CKTcircuit *ckt, Ndata *data, double *OnDens) -{ - NOISEAN *job = (NOISEAN *) ckt->CKTcurJob; - - JFET2model *firstModel = (JFET2model *) genmodel; - JFET2model *model; - JFET2instance *inst; - double tempOnoise; - double tempInoise; - double noizDens[JFET2NSRCS]; - double lnNdens[JFET2NSRCS]; - int i; - - /* define the names of the noise sources */ - - static char *JFET2nNames[JFET2NSRCS] = { - /* Note that we have to keep the order consistent with the - strchr definitions in JFET2defs.h */ - "_rd", /* noise due to rd */ - "_rs", /* noise due to rs */ - "_id", /* noise due to id */ - "_1overf", /* flicker (1/f) noise */ - "" /* total transistor noise */ - }; - - for (model=firstModel; model != NULL; model=JFET2nextModel(model)) { - for (inst=JFET2instances(model); inst != NULL; inst=JFET2nextInstance(inst)) { - - switch (operation) { - - case N_OPEN: - - /* see if we have to to produce a summary report */ - /* if so, name all the noise generators */ - - if (job->NStpsSm != 0) { - switch (mode) { - - case N_DENS: - for (i=0; i < JFET2NSRCS; i++) { - NOISE_ADD_OUTVAR(ckt, data, "onoise_%s%s", inst->JFET2name, JFET2nNames[i]); - } - break; - - case INT_NOIZ: - for (i=0; i < JFET2NSRCS; i++) { - NOISE_ADD_OUTVAR(ckt, data, "onoise_total_%s%s", inst->JFET2name, JFET2nNames[i]); - NOISE_ADD_OUTVAR(ckt, data, "inoise_total_%s%s", inst->JFET2name, JFET2nNames[i]); - } - break; - } - } - break; - - case N_CALC: - switch (mode) { - - case N_DENS: - NevalSrc(&noizDens[JFET2RDNOIZ],&lnNdens[JFET2RDNOIZ], - ckt,THERMNOISE,inst->JFET2drainPrimeNode,inst->JFET2drainNode, - model->JFET2drainConduct * inst->JFET2area * inst->JFET2m); - - NevalSrc(&noizDens[JFET2RSNOIZ],&lnNdens[JFET2RSNOIZ], - ckt,THERMNOISE,inst->JFET2sourcePrimeNode, - inst->JFET2sourceNode,model->JFET2sourceConduct - * inst->JFET2area * inst->JFET2m); - - NevalSrc(&noizDens[JFET2IDNOIZ],&lnNdens[JFET2IDNOIZ], - ckt,THERMNOISE,inst->JFET2drainPrimeNode, - inst->JFET2sourcePrimeNode, - (2.0/3.0 * inst->JFET2m * fabs(*(ckt->CKTstate0 + inst->JFET2gm)))); - - NevalSrc(&noizDens[JFET2FLNOIZ], NULL, ckt, - N_GAIN,inst->JFET2drainPrimeNode, - inst->JFET2sourcePrimeNode, (double)0.0); - noizDens[JFET2FLNOIZ] *= inst->JFET2m * model->JFET2fNcoef * - exp(model->JFET2fNexp * - log(MAX(fabs(*(ckt->CKTstate0 + inst->JFET2cd)),N_MINLOG))) / - data->freq; - lnNdens[JFET2FLNOIZ] = - log(MAX(noizDens[JFET2FLNOIZ],N_MINLOG)); - - noizDens[JFET2TOTNOIZ] = noizDens[JFET2RDNOIZ] + - noizDens[JFET2RSNOIZ] + - noizDens[JFET2IDNOIZ] + - noizDens[JFET2FLNOIZ]; - lnNdens[JFET2TOTNOIZ] = - log(MAX(noizDens[JFET2TOTNOIZ], N_MINLOG)); - - *OnDens += noizDens[JFET2TOTNOIZ]; - - if (data->delFreq == 0.0) { - - /* if we haven't done any previous integration, we need to */ - /* initialize our "history" variables */ - - for (i=0; i < JFET2NSRCS; i++) { - inst->JFET2nVar[LNLSTDENS][i] = lnNdens[i]; - } - - /* clear out our integration variables if it's the first pass */ - - if (data->freq == job->NstartFreq) { - for (i=0; i < JFET2NSRCS; i++) { - inst->JFET2nVar[OUTNOIZ][i] = 0.0; - inst->JFET2nVar[INNOIZ][i] = 0.0; - } - } - } else { /* data->delFreq != 0.0 (we have to integrate) */ - for (i=0; i < JFET2NSRCS; i++) { - if (i != JFET2TOTNOIZ) { - tempOnoise = Nintegrate(noizDens[i], lnNdens[i], - inst->JFET2nVar[LNLSTDENS][i], data); - tempInoise = Nintegrate(noizDens[i] * data->GainSqInv , - lnNdens[i] + data->lnGainInv, - inst->JFET2nVar[LNLSTDENS][i] + data->lnGainInv, - data); - inst->JFET2nVar[LNLSTDENS][i] = lnNdens[i]; - data->outNoiz += tempOnoise; - data->inNoise += tempInoise; - if (job->NStpsSm != 0) { - inst->JFET2nVar[OUTNOIZ][i] += tempOnoise; - inst->JFET2nVar[OUTNOIZ][JFET2TOTNOIZ] += tempOnoise; - inst->JFET2nVar[INNOIZ][i] += tempInoise; - inst->JFET2nVar[INNOIZ][JFET2TOTNOIZ] += tempInoise; - } - } - } - } - if (data->prtSummary) { - for (i=0; i < JFET2NSRCS; i++) { /* print a summary report */ - data->outpVector[data->outNumber++] = noizDens[i]; - } - } - break; - - case INT_NOIZ: /* already calculated, just output */ - if (job->NStpsSm != 0) { - for (i=0; i < JFET2NSRCS; i++) { - data->outpVector[data->outNumber++] = inst->JFET2nVar[OUTNOIZ][i]; - data->outpVector[data->outNumber++] = inst->JFET2nVar[INNOIZ][i]; - } - } /* if */ - break; - } /* switch (mode) */ - break; - - case N_CLOSE: - return (OK); /* do nothing, the main calling routine will close */ - break; /* the plots */ - } /* switch (operation) */ - } /* for inst */ - } /* for model */ - -return(OK); -} - - diff --git a/src/spicelib/devices/jfet2/jfet2par.c b/src/spicelib/devices/jfet2/jfet2par.c deleted file mode 100644 index 44c6b9fc3..000000000 --- a/src/spicelib/devices/jfet2/jfet2par.c +++ /dev/null @@ -1,76 +0,0 @@ -/********** -based on jfetpar.c -Copyright 1990 Regents of the University of California. All rights reserved. -Author: 1985 Thomas L. Quarles - -Modified to jfet2 for PS model definition ( Anthony E. Parker ) - Copyright 1994 Macquarie University, Sydney Australia. -**********/ -/* - */ - -#include "ngspice/ngspice.h" -#include "ngspice/const.h" -#include "ngspice/ifsim.h" -#include "jfet2defs.h" -#include "ngspice/sperror.h" -#include "ngspice/suffix.h" - - -/* ARGSUSED */ -int -JFET2param(int param, IFvalue *value, GENinstance *inst, IFvalue *select) -{ - JFET2instance *here = (JFET2instance *)inst; - - NG_IGNORE(select); - - switch (param) { - case JFET2_TEMP: - here->JFET2temp = value->rValue+CONSTCtoK; - here->JFET2tempGiven = TRUE; - break; - case JFET2_DTEMP: - here->JFET2temp = value->rValue; - here->JFET2tempGiven = TRUE; - break; - case JFET2_AREA: - here->JFET2area = value->rValue; - here->JFET2areaGiven = TRUE; - break; - case JFET2_M: - here->JFET2m = value->rValue; - here->JFET2mGiven = TRUE; - break; - case JFET2_IC_VDS: - here->JFET2icVDS = value->rValue; - here->JFET2icVDSGiven = TRUE; - break; - case JFET2_IC_VGS: - here->JFET2icVGS = value->rValue; - here->JFET2icVGSGiven = TRUE; - break; - case JFET2_OFF: - here->JFET2off = (value->iValue != 0); - break; - case JFET2_IC: - /* FALLTHROUGH added to suppress GCC warning due to - * -Wimplicit-fallthrough flag */ - switch (value->v.numValue) { - case 2: - here->JFET2icVGS = *(value->v.vec.rVec+1); - here->JFET2icVGSGiven = TRUE; - /* FALLTHROUGH */ - case 1: - here->JFET2icVDS = *(value->v.vec.rVec); - here->JFET2icVDSGiven = TRUE; - break; - default: - return(E_BADPARM); - } - break; - default: - return(E_BADPARM); - } - return(OK); -} diff --git a/src/spicelib/devices/jfet2/jfet2parm.h b/src/spicelib/devices/jfet2/jfet2parm.h deleted file mode 100644 index 6e5175f16..000000000 --- a/src/spicelib/devices/jfet2/jfet2parm.h +++ /dev/null @@ -1,58 +0,0 @@ - -#ifndef PARAMR -#define PARAMR(code,id,flag,ref,default,descrip) -#endif -#ifndef PARAMA -#define PARAMA(code,id,flag,ref,default,descrip) PARAM(code,id,flag,ref,default,descrip) -#endif -#ifndef JFET2_MOD_VTO -#define JFET2_MOD_VTO 141 -#define JFET2_MOD_NJF 102 -#define JFET2_MOD_PJF 103 -#define JFET2_MOD_TNOM 104 -#define JFET2_MOD_PB 131 -#endif - PARAM("acgam", 107, JFET2acgamGiven, JFET2acgam, 0, "") - PARAM("af", 108, JFET2fNexpGiven, JFET2fNexp, 1, "Flicker Noise Exponent") - PARAM("beta", 109, JFET2betaGiven, JFET2beta, 1e-4, "Transconductance parameter") - PARAMA("cds", 146, JFET2capDSGiven, JFET2capds, 0, "D-S junction capacitance") - PARAMA("cgd", 110, JFET2capGDGiven, JFET2capgd, 0, "G-D junction capacitance") - PARAMA("cgs", 111, JFET2capGSGiven, JFET2capgs, 0, "G-S junction capacitance") - PARAM("delta", 113, JFET2deltaGiven, JFET2delta, 0, "coef of thermal current reduction") - PARAM("hfeta", 114, JFET2hfetaGiven, JFET2hfeta, 0, "drain feedback modulation") - PARAM("hfe1", 115, JFET2hfe1Given, JFET2hfe1, 0, "") - PARAM("hfe2", 116, JFET2hfe2Given, JFET2hfe2, 0, "") - PARAM("hfg1", 117, JFET2hfg1Given, JFET2hfg1, 0, "") - PARAM("hfg2", 118, JFET2hfg2Given, JFET2hfg2, 0, "") - PARAM("mvst", 119, JFET2mvstGiven, JFET2mvst, 0, "modulation index for subtreshold current") - PARAM("mxi", 120, JFET2mxiGiven, JFET2mxi, 0, "saturation potential modulation parameter") - PARAM("fc", 121, JFET2fcGiven, JFET2fc, 0.5, "Forward bias junction fit parm.") - PARAM("ibd", 122, JFET2ibdGiven, JFET2ibd, 0, "Breakdown current of diode jnc") - PARAM("is", 123, JFET2isGiven, JFET2is, 1e-14, "Gate junction saturation current") - PARAM("kf", 124, JFET2kfGiven, JFET2fNcoef, 0, "Flicker Noise Coefficient") - PARAM("lambda",125, JFET2lamGiven, JFET2lambda, 0, "Channel length modulation param.") - PARAM("lfgam", 126, JFET2lfgamGiven, JFET2lfgam, 0, "drain feedback parameter") - PARAM("lfg1", 127, JFET2lfg1Given, JFET2lfg1, 0, "") - PARAM("lfg2", 128, JFET2lfg2Given, JFET2lfg2, 0, "") - PARAM("n", 129, JFET2nGiven, JFET2n, 1, "gate junction ideality factor") - PARAM("p", 130, JFET2pGiven, JFET2p, 2, "Power law (triode region)") - PARAM("vbi", JFET2_MOD_PB, JFET2phiGiven, JFET2phi, 1, "Gate junction potential") - PARAMR("pb", JFET2_MOD_PB, JFET2phiGiven, JFET2phi, 1, "Gate junction potential") - PARAM("q", 132, JFET2qGiven, JFET2q, 2, "Power Law (Saturated region)") - PARAM("rd", 133, JFET2rdGiven, JFET2rd, 0, "Drain ohmic resistance") - PARAM("rs", 134, JFET2rsGiven, JFET2rs, 0, "Source ohmic resistance") - PARAM("taud", 135, JFET2taudGiven, JFET2taud, 0, "Thermal relaxation time") - PARAM("taug", 136, JFET2taugGiven, JFET2taug, 0, "Drain feedback relaxation time") - PARAM("vbd", 137, JFET2vbdGiven, JFET2vbd, 1, "Breakdown potential of diode jnc") - PARAM("ver", 139, JFET2verGiven, JFET2ver, 0, "version number of PS model") - PARAM("vst", 140, JFET2vstGiven, JFET2vst, 0, "Crit Poten subthreshold conductn") - PARAM("vt0", JFET2_MOD_VTO, JFET2vtoGiven, JFET2vto, -2, "Threshold voltage") - PARAMR("vto", JFET2_MOD_VTO, JFET2vtoGiven, JFET2vto, -2, "Threshold voltage") - PARAM("xc", 142, JFET2xcGiven, JFET2xc, 0, "amount of cap. red at pinch-off") - PARAM("xi", 143, JFET2xiGiven, JFET2xi, 1000, "velocity saturation index") - PARAM("z", 144, JFET2zGiven, JFET2z, 1, "rate of velocity saturation") - PARAM("hfgam", 145, JFET2hfgGiven, JFET2hfgam, model->JFET2lfgam, "high freq drain feedback parm") -#undef PARAM -#undef PARAMR -#undef PARAMA - diff --git a/src/spicelib/devices/jfet2/jfet2set.c b/src/spicelib/devices/jfet2/jfet2set.c deleted file mode 100644 index 028ee4505..000000000 --- a/src/spicelib/devices/jfet2/jfet2set.c +++ /dev/null @@ -1,150 +0,0 @@ -/********** -Based on jfetset.c -Copyright 1990 Regents of the University of California. All rights reserved. -Author: 1985 Thomas L. Quarles - -Modified to add PS model and new parameter definitions ( Anthony E. Parker ) - Copyright 1994 Macquarie University, Sydney Australia. - 10 Feb 1994: Added call to jfetparm.h, used JFET_STATE_COUNT -**********/ - -#include "ngspice/ngspice.h" -#include "ngspice/smpdefs.h" -#include "ngspice/cktdefs.h" -#include "jfet2defs.h" -#include "ngspice/const.h" -#include "ngspice/sperror.h" -#include "ngspice/suffix.h" - -int -JFET2setup(SMPmatrix *matrix, GENmodel *inModel, CKTcircuit *ckt, int *states) - /* load the diode structure with those pointers needed later - * for fast matrix loading - */ -{ - JFET2model *model = (JFET2model*)inModel; - JFET2instance *here; - int error; - CKTnode *tmp; - - /* loop through all the diode models */ - for( ; model != NULL; model = JFET2nextModel(model)) { - - if( (model->JFET2type != NJF) && (model->JFET2type != PJF) ) { - model->JFET2type = NJF; - } -#define PARAM(code,id,flag,ref,default,descrip) \ - if(!model->flag) {model->ref = default;} -#include "jfet2parm.h" - - /* loop through all the instances of the model */ - for (here = JFET2instances(model); here != NULL ; - here=JFET2nextInstance(here)) { - - if(!here->JFET2areaGiven) { - here->JFET2area = 1; - } - - if(!here->JFET2mGiven) { - here->JFET2m = 1; - } - - here->JFET2state = *states; - *states += JFET2numStates; - - if(model->JFET2rs != 0) { - if(here->JFET2sourcePrimeNode == 0) { - error = CKTmkVolt(ckt,&tmp,here->JFET2name,"source"); - if(error) return(error); - here->JFET2sourcePrimeNode = tmp->number; - - if (ckt->CKTcopyNodesets) { - CKTnode *tmpNode; - IFuid tmpName; - - if (CKTinst2Node(ckt,here,3,&tmpNode,&tmpName)==OK) { - if (tmpNode->nsGiven) { - tmp->nodeset=tmpNode->nodeset; - tmp->nsGiven=tmpNode->nsGiven; - } - } - } - } - - } else { - here->JFET2sourcePrimeNode = here->JFET2sourceNode; - } - if(model->JFET2rd != 0) { - if(here->JFET2drainPrimeNode == 0) { - error = CKTmkVolt(ckt,&tmp,here->JFET2name,"drain"); - if(error) return(error); - here->JFET2drainPrimeNode = tmp->number; - - if (ckt->CKTcopyNodesets) { - CKTnode *tmpNode; - IFuid tmpName; - - if (CKTinst2Node(ckt,here,1,&tmpNode,&tmpName)==OK) { - if (tmpNode->nsGiven) { - tmp->nodeset=tmpNode->nodeset; - tmp->nsGiven=tmpNode->nsGiven; - } - } - } - } - - } else { - here->JFET2drainPrimeNode = here->JFET2drainNode; - } - -/* macro to make elements with built in test for out of memory */ -#define TSTALLOC(ptr,first,second) \ -do { if((here->ptr = SMPmakeElt(matrix, here->first, here->second)) == NULL){\ - return(E_NOMEM);\ -} } while(0) - - TSTALLOC(JFET2drainDrainPrimePtr,JFET2drainNode,JFET2drainPrimeNode); - TSTALLOC(JFET2gateDrainPrimePtr,JFET2gateNode,JFET2drainPrimeNode); - TSTALLOC(JFET2gateSourcePrimePtr,JFET2gateNode,JFET2sourcePrimeNode); - TSTALLOC(JFET2sourceSourcePrimePtr,JFET2sourceNode,JFET2sourcePrimeNode); - TSTALLOC(JFET2drainPrimeDrainPtr,JFET2drainPrimeNode,JFET2drainNode); - TSTALLOC(JFET2drainPrimeGatePtr,JFET2drainPrimeNode,JFET2gateNode); - TSTALLOC(JFET2drainPrimeSourcePrimePtr,JFET2drainPrimeNode,JFET2sourcePrimeNode); - TSTALLOC(JFET2sourcePrimeGatePtr,JFET2sourcePrimeNode,JFET2gateNode); - TSTALLOC(JFET2sourcePrimeSourcePtr,JFET2sourcePrimeNode,JFET2sourceNode); - TSTALLOC(JFET2sourcePrimeDrainPrimePtr,JFET2sourcePrimeNode,JFET2drainPrimeNode); - TSTALLOC(JFET2drainDrainPtr,JFET2drainNode,JFET2drainNode); - TSTALLOC(JFET2gateGatePtr,JFET2gateNode,JFET2gateNode); - TSTALLOC(JFET2sourceSourcePtr,JFET2sourceNode,JFET2sourceNode); - TSTALLOC(JFET2drainPrimeDrainPrimePtr,JFET2drainPrimeNode,JFET2drainPrimeNode); - TSTALLOC(JFET2sourcePrimeSourcePrimePtr,JFET2sourcePrimeNode,JFET2sourcePrimeNode); - } - } - return(OK); -} - -int -JFET2unsetup(GENmodel *inModel, CKTcircuit *ckt) -{ - JFET2model *model; - JFET2instance *here; - - for (model = (JFET2model *)inModel; model != NULL; - model = JFET2nextModel(model)) - { - for (here = JFET2instances(model); here != NULL; - here=JFET2nextInstance(here)) - { - if (here->JFET2drainPrimeNode > 0 - && here->JFET2drainPrimeNode != here->JFET2drainNode) - CKTdltNNum(ckt, here->JFET2drainPrimeNode); - here->JFET2drainPrimeNode = 0; - - if (here->JFET2sourcePrimeNode > 0 - && here->JFET2sourcePrimeNode != here->JFET2sourceNode) - CKTdltNNum(ckt, here->JFET2sourcePrimeNode); - here->JFET2sourcePrimeNode = 0; - } - } - return OK; -} diff --git a/src/spicelib/devices/jfet2/jfet2temp.c b/src/spicelib/devices/jfet2/jfet2temp.c deleted file mode 100644 index eee92cabd..000000000 --- a/src/spicelib/devices/jfet2/jfet2temp.c +++ /dev/null @@ -1,119 +0,0 @@ -/********** -Base on jfettemp.c -Copyright 1990 Regents of the University of California. All rights reserved. -Author: 1985 Thomas L. Quarles - -Modified to add PS model and new parameter definitions ( Anthony E. Parker ). -See http://ngspice.sourceforge.net/external-documents/models/psfet.pdf - Copyright 1994 Macquarie University, Sydney Australia. - 10 Feb 1994: Call to PSinstanceinit() added - Change gatePotential to phi and used rs and rd for - sourceResist and drainResist, and fc for depletionCapCoef -**********/ - -#include "ngspice/ngspice.h" -#include "ngspice/smpdefs.h" -#include "ngspice/cktdefs.h" -#include "jfet2defs.h" -#include "ngspice/const.h" -#include "ngspice/sperror.h" -#include "psmodel.h" -#include "ngspice/suffix.h" - -int -JFET2temp(GENmodel *inModel, CKTcircuit *ckt) - /* Pre-process the model parameters after a possible change - */ -{ - JFET2model *model = (JFET2model*)inModel; - JFET2instance *here; - double xfc; - double vt; - double vtnom; - double kt,kt1; - double arg,arg1; - double fact1,fact2; - double egfet,egfet1; - double pbfact,pbfact1; - double gmanew,gmaold; - double ratio1; - double pbo; - double cjfact,cjfact1; - - /* loop through all the diode models */ - for( ; model != NULL; model = JFET2nextModel(model)) { - - if(!(model->JFET2tnomGiven)) { - model->JFET2tnom = ckt->CKTnomTemp; - } - vtnom = CONSTKoverQ * model->JFET2tnom; - fact1 = model->JFET2tnom/REFTEMP; - kt1 = CONSTboltz * model->JFET2tnom; - egfet1 = 1.16-(7.02e-4*model->JFET2tnom*model->JFET2tnom)/ - (model->JFET2tnom+1108); - arg1 = -egfet1/(kt1+kt1)+1.1150877/(CONSTboltz*(REFTEMP+REFTEMP)); - pbfact1 = -2*vtnom * (1.5*log(fact1)+CHARGE*arg1); - pbo = (model->JFET2phi-pbfact1)/fact1; - gmaold = (model->JFET2phi-pbo)/pbo; - cjfact = 1/(1+.5*(4e-4*(model->JFET2tnom-REFTEMP)-gmaold)); - - if(model->JFET2rd != 0) { - model->JFET2drainConduct = 1/model->JFET2rd; - } else { - model->JFET2drainConduct = 0; - } - if(model->JFET2rs != 0) { - model->JFET2sourceConduct = 1/model->JFET2rs; - } else { - model->JFET2sourceConduct = 0; - } - if(model->JFET2fc >.95) { - SPfrontEnd->IFerrorf (ERR_WARNING, - "%s: Depletion cap. coefficient too large, limited to .95", - model->JFET2modName); - model->JFET2fc = .95; - } - - xfc = log(1 - model->JFET2fc); - model->JFET2f2 = exp((1+.5)*xfc); - model->JFET2f3 = 1 - model->JFET2fc * (1 + .5); - - /* loop through all the instances of the model */ - for (here = JFET2instances(model); here != NULL ; - here=JFET2nextInstance(here)) { - - if(!(here->JFET2dtempGiven)) { - here->JFET2dtemp = 0.0; - } - - if(!(here->JFET2tempGiven)) { - here->JFET2temp = ckt->CKTtemp + here->JFET2dtemp; - } - - vt = here->JFET2temp * CONSTKoverQ; - fact2 = here->JFET2temp/REFTEMP; - ratio1 = here->JFET2temp/model->JFET2tnom -1; - here->JFET2tSatCur = model->JFET2is * exp(ratio1*1.11/vt); - here->JFET2tCGS = model->JFET2capgs * cjfact; - here->JFET2tCGD = model->JFET2capgd * cjfact; - kt = CONSTboltz*here->JFET2temp; - egfet = 1.16-(7.02e-4*here->JFET2temp*here->JFET2temp)/ - (here->JFET2temp+1108); - arg = -egfet/(kt+kt) + 1.1150877/(CONSTboltz*(REFTEMP+REFTEMP)); - pbfact = -2 * vt * (1.5*log(fact2)+CHARGE*arg); - here->JFET2tGatePot = fact2 * pbo + pbfact; - gmanew = (here->JFET2tGatePot-pbo)/pbo; - cjfact1 = 1+.5*(4e-4*(here->JFET2temp-REFTEMP)-gmanew); - here->JFET2tCGS *= cjfact1; - here->JFET2tCGD *= cjfact1; - - here->JFET2corDepCap = model->JFET2fc * here->JFET2tGatePot; - here->JFET2f1 = here->JFET2tGatePot * (1 - exp((1-.5)*xfc))/(1-.5); - here->JFET2vcrit = vt * log(vt/(CONSTroot2 * here->JFET2tSatCur)); - - PSinstanceinit(model, here); - - } - } - return(OK); -} diff --git a/src/spicelib/devices/jfet2/jfet2trun.c b/src/spicelib/devices/jfet2/jfet2trun.c deleted file mode 100644 index a05e09cb5..000000000 --- a/src/spicelib/devices/jfet2/jfet2trun.c +++ /dev/null @@ -1,33 +0,0 @@ -/********** -Based on jfettrunc.c -Copyright 1990 Regents of the University of California. All rights reserved. -Author: 1985 Thomas L. Quarles - -Modified to jfet2 for PS model definition ( Anthony E. Parker ) - Copyright 1994 Macquarie University, Sydney Australia. -**********/ -/* - */ - -#include "ngspice/ngspice.h" -#include "ngspice/cktdefs.h" -#include "jfet2defs.h" -#include "ngspice/sperror.h" -#include "ngspice/suffix.h" - - -int -JFET2trunc(GENmodel *inModel, CKTcircuit *ckt, double *timeStep) -{ - JFET2model *model = (JFET2model*)inModel; - JFET2instance *here; - - for( ; model != NULL; model = JFET2nextModel(model)) { - for(here=JFET2instances(model);here!=NULL;here = JFET2nextInstance(here)){ - - CKTterr(here->JFET2qgs,ckt,timeStep); - CKTterr(here->JFET2qgd,ckt,timeStep); - } - } - return(OK); -} diff --git a/src/spicelib/devices/jfet2/psmodel.c b/src/spicelib/devices/jfet2/psmodel.c deleted file mode 100644 index 3f655e749..000000000 --- a/src/spicelib/devices/jfet2/psmodel.c +++ /dev/null @@ -1,377 +0,0 @@ -/* - Parker-Skellern MESFET model - - Copyright (C) 1994, 1995, 1996 Macquarie University - All Rights Reserved - Author: Anthony Parker - Date: 2 Feb 1994 created - 9 Feb 1994 correct NaN problem in strong cut-off region - 20 MAR 1994 corrected capacitance initialization - 24 MAR 1994 added parameter MVST - 28 MAR 1994 reorganized declaration scopes - 19 APR 1994 added new parameters: PS_HFETA, PS_HFE1, PS_HFE2, - PS_HFG1, and PS_HFG2 - 18 May 1994 corrected 1/0 error when PS_VSUB=0 - 15 Jul 1994 corrected errors in acload routine - 10 Aug 1995 added PS_VSUB to gds += gm*PS_VSUB*mvst*(vgt-vgst*(a.. - 12 Sep 1995 changed _XXX to PS_XXX to aid portability - 13 Sep 1995 change to give arg=1-1/subfac; - if(vst!=0) gds+=gm*PS_VSUB..; - gm *= arg; - 10 Feb 1996 change to names to match MicroSim code. - 5 Jul 1996 corrected diode eq (change Gmin*vgs to Gmin*vgd). - -*****************************************************************************/ - -/*----------- -| functions defined in this file are: - PSids() returns dc drain source current and assigns other - current and branch conductances - qgg() static function that returns gate charge - PScharge() returns gate-source and gate-drain charge and capacitance - PSacload() returns small-signal conductance elements - PSinstanceinit() initializes model parameters - */ - -#define PSMODEL_C /* activate local definitions in psmesfet.h */ -#include "psmodel.h" - -/*----------- -| dc current and conductance calculation */ -double -PSids( -cref *ckt, -modl *model, -inst *here, -double vgs, -double vgd, -double *igs, -double *igd, -double *ggs, -double *ggd, -double *Gm, -double *Gds) -{ -#define FX -10.0 /* not too small else fatal rounding error in (rpt-a_rpt) */ -#define MX 40.0 /* maximum exponential argument */ -#define EMX 2.353852668370199842e17 /* exp(MX) */ - - double idrain, arg; - double area = AREA; - - { /* gate junction diodes */ - double zz; - { /* gate-junction forward conduction */ - double Gmin = GMIN; - double Vt = NVT; - double isat = IS * area; - if ((arg=vgs/Vt) > FX) { - if(arg < MX) { - *ggs=(zz=isat*exp(arg))/Vt+Gmin; *igs= zz -isat +Gmin*vgs; - } else { - *ggs=(zz=isat*EMX)/Vt+Gmin; *igs=zz*(arg-MX+1)-isat+Gmin*vgs; - } - } else { - *ggs = Gmin; *igs = -isat + Gmin * vgs; - } - if ((arg=vgd/Vt) > FX) { - if(arg < MX) { - *ggd=(zz=isat*exp(arg))/Vt+Gmin; *igd= zz -isat +Gmin*vgd; - } else { - *ggd=(zz=isat*EMX)/Vt+Gmin; *igd=zz*(arg-MX+1)-isat+Gmin*vgd; - } - } else { - *ggd = Gmin; *igd = -isat + Gmin * vgd; - } - } - { /* gate-junction reverse 'breakdown' conduction */ - double Vbd = VBD; - double ibd = IBD * area; - if ((arg=-vgs/Vbd) > FX) { - if(arg < MX) { - *ggs += (zz=ibd*exp(arg))/Vbd; *igs -= zz-ibd; - } else { - *ggs += (zz=ibd*EMX)/Vbd; *igs -= zz*((arg-MX)+1) - ibd; - } - } else *igs += ibd; - if ((arg=-vgd/Vbd) > FX) { - if(arg < MX) { - *ggd += (zz=ibd*exp(arg))/Vbd; *igd -= zz-ibd; - } else { - *ggd += (zz=ibd*EMX)/Vbd; *igd -= zz*((arg-MX)+1) - ibd; - } - } else *igd += ibd; - } - } - - { /* compute drain current and derivitives */ - double gm, gds; - double vdst = vgs - vgd; - double stepofour = STEP * FOURTH; - { /* Include rate dependent threshold modulation */ - double vgst, dvgd, dvgs, h, vgdtrap, vgstrap, eta, gam; - double vto = VTO; - double LFg = LFGAM, LFg1 = LFG1, LFg2 = LFG2; - double HFg = HFGAM, HFg1 = HFG1, HFg2 = HFG2; - double HFe = HFETA, HFe1 = HFE1, HFe2 = HFE2; - if(TRAN_ANAL) { - double taug = TAUG; - h = taug/(taug + stepofour); h*=h; h*=h; /*4th power*/ - VGDTRAP_NOW = vgdtrap = h*VGDTRAP_BEFORE + (1-h) * vgd; - VGSTRAP_NOW = vgstrap = h*VGSTRAP_BEFORE + (1-h) * vgs; - } else { - h = 0; - VGDTRAP_NOW = vgdtrap = vgd; - VGSTRAP_NOW = vgstrap = vgs; - } - vgst = vgs - vto; - vgst -= ( LFg - LFg1*vgstrap + LFg2*vgdtrap)*vgdtrap; - vgst += (eta = HFe - HFe1*vgdtrap + HFe2*vgstrap)*(dvgs = vgstrap-vgs); - vgst += (gam = HFg - HFg1*vgstrap + HFg2*vgdtrap)*(dvgd = vgdtrap-vgd); - { /* Exponential Subthreshold effect ids(vgst,vdst) */ - double vgt, subfac; - double mvst = MVST; - double vst = VSUB * (1 + mvst*vdst); - if (vgst > FX*vst) { - if (vgst > (arg=MX*vst)) { /* numerically large */ - vgt = (EMX/(subfac = EMX+1))*(vgst-arg) + arg; - } else /* limit gate bias exponentially */ - vgt = vst * log( subfac=(1 + exp(vgst/vst)) ); - { /* Dual Power-law ids(vgt,vdst) */ - double mQ = Q; - double PmQ = P - mQ; - double dvpd_dvdst=(double)D3*pow(vgt,PmQ); - double vdp = vdst*dvpd_dvdst; /*D3=P/Q/((VBI-vto)^PmQ)*/ - { /* Early saturation effect ids(vgt,vdp) */ - double za = (double)ZA; /* sqrt(1 + Z)/2 */ - double mxi = MXI; - double vsatFac = vgt/(mxi*vgt + (double)XI_WOO); - double vsat=vgt/(1 + vsatFac); - double aa = za*vdp+vsat/2.0; - double a_aa = aa-vsat; - double rpt = sqrt( aa * aa + (arg=vsat*vsat*Z/4.0)); - double a_rpt = sqrt(a_aa * a_aa + arg); - double vdt = (rpt - a_rpt); - double dvdt_dvdp = za * (aa/rpt - a_aa/a_rpt); - double dvdt_dvgt = (vdt - vdp*dvdt_dvdp) - *(1 + mxi*vsatFac*vsatFac)/(1 + vsatFac)/vgt; - { /* Intrinsic Q-law FET equation ids(vgt,vdt) */ - gds=pow(vgt-vdt,mQ-1); - idrain = vdt*gds + vgt*(gm=pow(vgt,mQ-1)-gds); - gds *= mQ; - gm *= mQ; - } - gm += gds*dvdt_dvgt; - gds *= dvdt_dvdp; - } - gm += gds*PmQ*vdp/vgt; - gds *= dvpd_dvdst; - } - arg = 1 - 1/subfac; - if(vst != 0) gds += gm*VSUB*mvst*(vgt-vgst*arg)/vst; - gm *= arg; - } else { /* in extreme cut-off (numerically) */ - idrain = gm = gds = 0.0e0; - } - } - gds += gm*(arg = h*gam + - (1-h)*(HFe1*dvgs-HFg2*dvgd+2*LFg2*vgdtrap-LFg1*vgstrap+LFg)); - gm *= 1 - h*eta + (1-h)*(HFe2*dvgs -HFg1*dvgd + LFg1*vgdtrap) - arg; - } - { /* apply channel length modulation and beta scaling */ - double lambda = LAM; - double beta = BETA * area; - gm *= (arg = beta*(1 + lambda*vdst)); - gds = beta*lambda*idrain + gds*arg; - idrain *= arg; - } - - { /* apply thermal reduction of drain current */ - double h, pfac, pAverage; - double delta = DELT / area; - if(TRAN_ANAL) { - double taud = TAUD; - h = taud/(taud + stepofour); h*=h; h*=h; - POWR_NOW = pAverage = h*POWR_BEFORE + (1-h)*vdst*idrain; - } else { - POWR_NOW = POWR_BEFORE = pAverage = vdst*idrain; h = 0; - } - idrain /= (pfac = 1+pAverage*delta); - *Gm = gm * (arg = (h*delta*POWR_BEFORE + 1)/pfac/pfac); - *Gds = gds * arg - (1-h) * delta*idrain*idrain; - } - } - return(idrain); -} - -/*----------- -| code based on Statz et. al. capacitance model, IEEE Tran ED Feb 87 */ -static double -qgg( - double vgs, - double vgd, - double gamma, - double pb, - double alpha, - double vto, - double vmax, - double xc, - double cgso, - double cgdo, - double *cgs, - double *cgd -) -/*vgs, vgd, gamma, pb, alpha, vto, vmax, xc, cgso, cgdo, *cgs, *cgd;*/ -{ - double qrt, ext, Cgso, cpm, cplus, cminus; - double vds = vgs-vgd; - double d1_xc = 1-xc; - double vert = sqrt( vds * vds + alpha ); - double veff = 0.5*(vgs + vgd + vert) + gamma*vds; - double vnr = d1_xc*(veff-vto); - double vnrt = sqrt( vnr*vnr + 0.04 ); - double vnew = veff + 0.5*(vnrt - vnr); - if ( vnew < vmax ) { - ext = 0; - qrt = sqrt(1 - vnew/pb); - Cgso = 0.5*cgso/qrt*(1+xc + d1_xc*vnr/vnrt); - } else { - double vx = 0.5*(vnew-vmax); - double par = 1+vx/(pb-vmax); - qrt = sqrt(1 - vmax/pb); - ext = vx*(1 + par)/qrt; - Cgso = 0.5*cgso/qrt*(1+xc + d1_xc*vnr/vnrt) * par; - } - cplus = 0.5*(1 + (cpm = vds/vert)); cminus = cplus - cpm; - *cgs = Cgso*(cplus +gamma) + cgdo*(cminus+gamma); - *cgd = Cgso*(cminus-gamma) + cgdo*(cplus -gamma); - return(cgso*((pb+pb)*(1-qrt) + ext) + cgdo*(veff - vert)); -} - -/*----------- -| call during ac analysis initialisation or during transient analysis */ -void -PScharge( -cref *ckt, -modl *model, -inst *here, -double vgs, -double vgd, -double *capgs, -double *capgd -) -{ -#define QGG(a,b,c,d) qgg(a,b,gac,phib,alpha,vto,vmax,xc,czgs,czgd,c,d) -/* double qgg(); */ - - double czgs = CGS * AREA; - double czgd = CGD * AREA; - double vto = VTO; - double alpha = (double)ALPHA; /* (XI*woo/(XI+1)/2)^2 */ - double xc = XC; - double vmax = VMAX; - double phib = VBI; - double gac = ACGAM; - - if(/*TRAN_INIT ||*/ !TRAN_ANAL) - QGS_NOW = QGD_NOW = QGS_BEFORE = QGD_BEFORE - = QGG(vgs,vgd,capgs,capgd); - else { - double cgsna,cgsnc; - double cgdna,cgdnb, a_cap; - double vgs1 = VGS1; - double vgd1 = VGD1; - double qgga=QGG(vgs ,vgd ,&cgsna,&cgdna); - double qggb=QGG(vgs1,vgd ,&a_cap,&cgdnb); - double qggc=QGG(vgs ,vgd1,&cgsnc,&a_cap); - double qggd=QGG(vgs1,vgd1,&a_cap,&a_cap); - QGS_NOW = QGS_BEFORE + 0.5 * (qgga-qggb + qggc-qggd); - QGD_NOW = QGD_BEFORE + 0.5 * (qgga-qggc + qggb-qggd); - *capgs = 0.5 * (cgsna + cgsnc); - *capgd = 0.5 * (cgdna + cgdnb); - } -} - - -/*----------- -| call for each frequency in ac analysis */ -void -PSacload( -cref *ckt, -modl *model, -inst *here, -double vgs, -double vgd, -double ids, -double omega, -double *Gm, -double *xGm, -double *Gds, -double *xGds -) -{ - double arg; - double vds = vgs - vgd; - double LFgam = LFGAM; - double LFg1 = LFG1; - double LFg2 = LFG2*vgd; - double HFg1 = HFG1; - double HFg2 = HFG2*vgd; - double HFeta = HFETA; - double HFe1 = HFE1; - double HFe2 = HFE2*vgs; - double hfgam= HFGAM - HFg1*vgs + HFg2; - double eta = HFeta - HFe1*vgd + HFe2; - double lfga = LFgam - LFg1*vgs + LFg2 + LFg2; - double gmo = *Gm/(1 - lfga + LFg1*vgd); - - double wtg = TAUG * omega; - double wtgdet = 1 + wtg*wtg; - double gwtgdet = gmo/wtgdet; - - double gdsi = (arg=hfgam - lfga)*gwtgdet; - double gdsr = arg*gmo - gdsi; - double gmi = (eta + LFg1*vgd)*gwtgdet + gdsi; - - double xgds = wtg*gdsi; - double gds = *Gds + gdsr; - double xgm = -wtg*gmi; - double gm = gmi + gmo*(1 -eta - hfgam); - - double delta = DELT / AREA; - double wtd = TAUD * omega ; - double wtddet = 1 + wtd * wtd; - double fac = delta * ids; - double del = 1/(1 - fac * vds); - double dd = (del-1) / wtddet; - double dr = del - dd; - double di = wtd * dd; - - double cdsqr = fac * ids * del * wtd/wtddet; - - NG_IGNORE(ckt); - - *Gm = dr*gm - di*xgm; - *xGm = di*gm + dr*xgm; - - *Gds = dr*gds - di*xgds + cdsqr*wtd; - *xGds = di*gds + dr*xgds + cdsqr; -} - - -void /* call when temperature changes */ -PSinstanceinit( - modl *model, - inst *here -) -{ -#ifndef PARAM_CAST /* allow casting to parameter type */ -#define PARAM_CAST /* if not specified then don't cast */ -#endif - - double woo = (VBI - VTO); - XI_WOO = PARAM_CAST (XI * woo); - ZA = PARAM_CAST (sqrt(1 + Z)/2); - ALPHA = PARAM_CAST (XI_WOO*XI_WOO/(XI+1)/(XI+1)/ 4); - D3 = PARAM_CAST (P/Q/pow(woo,(P - Q))); -} diff --git a/src/spicelib/devices/jfet2/psmodel.h b/src/spicelib/devices/jfet2/psmodel.h deleted file mode 100644 index bee8d6801..000000000 --- a/src/spicelib/devices/jfet2/psmodel.h +++ /dev/null @@ -1,114 +0,0 @@ -/* - Parker-Skellern MESFET model, UCB Spice Glue Header - - Copyright (C) 1994, 1995, 1996 Macquarie University - All Rights Reserved - Author: Anthony Parker - Creation Date: 2 Feb 1994 - Modified: 24 Mar 1994: Parameters MVST and ETA added. - 18 Apr 1994: Added new parameters and comments - 12 Sep 1995: Changed _XXX to PS_XXX to aid portability - */ - - -#ifdef PSMODEL_C /* PSMODEL_C defined when included from "psmodel.c" */ -#include "ngspice/ngspice.h" -#include "jfet2defs.h" -#include "ngspice/const.h" -#endif - -/* Glue definitions for cref modl and inst */ -typedef CKTcircuit cref; /* circuit specific variables */ -typedef JFET2model modl; /* model parameters for this type of device */ -typedef JFET2instance inst; /* parameters specific to this device instance */ - -extern void PSinstanceinit(modl *,inst *); -extern double PSids(cref *,modl *,inst *,double,double, - double *,double *,double *,double *,double *,double *); -extern void PScharge(cref *,modl *,inst *,double,double,double *,double *); -extern void PSacload(cref *,modl *,inst *,double,double,double,double, - double *,double *,double *,double *); - -#ifdef PSMODEL_C /* PSMODEL_C defined when included from "psmodel.c" */ -/* The following glue definitions need to be changed to suit the specific - simulator. */ -/* simulator mode flags - TRAN_ANAL should be true during transient analysis iteration. - (ie. false for other analysis functions and tran operating point.) - TRAN_INIT should be true only during the first calculation of the initial - transient analysis time point. It should be false for remaining - iterations at that time point and the rest of the transient analysis. - */ -#define TRAN_ANAL (ckt->CKTmode & MODETRAN) -#define TRAN_INIT (ckt->CKTmode & MODEINITTRAN) - -/* state variables */ -/* initialized when TRAN_ANAL is false */ -#define VGSTRAP_BEFORE (*(ckt->CKTstate1 + here->JFET2vgstrap)) -#define VGSTRAP_NOW (*(ckt->CKTstate0 + here->JFET2vgstrap)) -#define VGDTRAP_BEFORE (*(ckt->CKTstate1 + here->JFET2vtrap)) -#define VGDTRAP_NOW (*(ckt->CKTstate0 + here->JFET2vtrap)) -#define POWR_BEFORE (*(ckt->CKTstate1 + here->JFET2pave)) -#define POWR_NOW (*(ckt->CKTstate0 + here->JFET2pave)) - -/* initialized when TRAN_INIT is true or TRAN_ANAL is false */ -#define QGS_BEFORE (*(ckt->CKTstate1 + here->JFET2qgs)) -#define QGS_NOW (*(ckt->CKTstate0 + here->JFET2qgs)) -#define QGD_BEFORE (*(ckt->CKTstate1 + here->JFET2qgd)) -#define QGD_NOW (*(ckt->CKTstate0 + here->JFET2qgd)) - -/* past terminal potentials used if TRAN_INIT is false and TRAN_ANAL is true */ -#define VGS1 (*(ckt->CKTstate1 + here->JFET2vgs)) -#define VGD1 (*(ckt->CKTstate1 + here->JFET2vgd)) - -/* simulator specific parameters */ -#define GMIN ckt->CKTgmin /* SPICE gmin (1E12 ohms) */ -#define NVT here->JFET2temp*CONSTKoverQ*model->JFET2n /* nkT/q */ -#define STEP ckt->CKTdelta /* time step of this transient solution */ -#define FOURTH 0.25 /* eldo requires 2.5e-10 for units conversion */ - -/* model parameters */ -/* dc model */ -#define BETA model->JFET2beta /* transconductance scaling */ -#define DELT model->JFET2delta /* thermal current reduction */ -#define IBD model->JFET2ibd /* breakdown current */ -#define IS here->JFET2tSatCur /* gate reverse saturation current */ -#define LAM model->JFET2lambda /* channel length modulation */ -#define LFGAM model->JFET2lfgam /* dc drain feedback */ -#define LFG1 model->JFET2lfg1 /* dc drain feedback vgs modulation */ -#define LFG2 model->JFET2lfg2 /* dc drain feedback vgd modulation */ -#define MVST model->JFET2mvst /* subthreshold vds modulation */ -#define MXI model->JFET2mxi /* saturation index vgs modulation */ -#define P model->JFET2p /* power law in controlled resistance */ -#define Q model->JFET2q /* power law in controlled current */ -#define VBD model->JFET2vbd /* breakdown exponential coef */ -#define VBI here->JFET2tGatePot /* junction built-in potential */ -#define VSUB model->JFET2vst /* subthreshold exponential coef */ -#define VTO model->JFET2vto /* pinch-off potential */ -#define XI model->JFET2xi /* saturation index */ -#define Z model->JFET2z /* saturation knee curvature */ - -/* ac model */ -#define ACGAM model->JFET2acgam /* capacitance vds modulation */ -#define CGS here->JFET2tCGS /* zero bias cgs */ -#define CGD here->JFET2tCGD /* zero bias cgd */ -#define HFETA model->JFET2hfeta /* ac source feedback */ -#define HFE1 model->JFET2hfe1 /* ac source feedback vgd modulation */ -#define HFE2 model->JFET2hfe2 /* ac source feedback vgs modulation */ -#define HFGAM model->JFET2hfgam /* ac drain feedback */ -#define HFG1 model->JFET2hfg1 /* ac drain feedback vgs modulation */ -#define HFG2 model->JFET2hfg2 /* ac drain feedback vgd modulation */ -#define TAUD model->JFET2taud /* thermal time constant */ -#define TAUG model->JFET2taug /* dc ac feedback time constant */ -#define XC model->JFET2xc /* cgs reduction at pinch-off */ - -/* device instance */ -#define AREA here->JFET2area /* area factor of fet */ - -/* internally derived model parameters */ -#define ALPHA here->JFET2alpha /* cgs cgd reversal interval */ -#define D3 here->JFET2d3 /* dual power-law parameter */ -#define VMAX here->JFET2corDepCap /* forward capacitance potential */ -#define XI_WOO here->JFET2xiwoo /* saturation potential */ -#define ZA model->JFET2za /* saturation knee parameter */ -#endif diff --git a/src/spicelib/devices/ltra/Makefile.am b/src/spicelib/devices/ltra/Makefile.am deleted file mode 100644 index 6915f8b6d..000000000 --- a/src/spicelib/devices/ltra/Makefile.am +++ /dev/null @@ -1,28 +0,0 @@ -## Process this file with automake to produce Makefile.in - -noinst_LTLIBRARIES = libltra.la - -libltra_la_SOURCES = \ - ltra.c \ - ltraacct.c \ - ltraacld.c \ - ltraask.c \ - ltradefs.h \ - ltraext.h \ - ltrainit.c \ - ltrainit.h \ - ltraitf.h \ - ltraload.c \ - ltramask.c \ - ltramisc.c \ - ltrampar.c \ - ltrapar.c \ - ltraset.c \ - ltratemp.c \ - ltratrun.c - - - -AM_CPPFLAGS = @AM_CPPFLAGS@ -I$(top_srcdir)/src/include -AM_CFLAGS = $(STATIC) -MAINTAINERCLEANFILES = Makefile.in diff --git a/src/spicelib/devices/ltra/ltra.c b/src/spicelib/devices/ltra/ltra.c deleted file mode 100644 index 8d11f4a75..000000000 --- a/src/spicelib/devices/ltra/ltra.c +++ /dev/null @@ -1,70 +0,0 @@ -/********** -Copyright 1990 Regents of the University of California. All rights -reserved. -Author: 1990 Jaijeet S. Roychowdhury -**********/ - -/* - * This file defines the LTRA data structures that are available to the next - * level(s) up the calling hierarchy - */ - -#include "ngspice/ngspice.h" -#include "ngspice/devdefs.h" -#include "ngspice/ifsim.h" -#include "ltradefs.h" -#include "ngspice/suffix.h" - -IFparm LTRApTable[] = { /* parameters */ - IOPAU("v1", LTRA_V1, IF_REAL, "Initial voltage at end 1"), - IOPAU("v2", LTRA_V2, IF_REAL, "Initial voltage at end 2"), - IOPAU("i1", LTRA_I1, IF_REAL, "Initial current at end 1"), - IOPAU("i2", LTRA_I2, IF_REAL, "Initial current at end 2"), - IP("ic", LTRA_IC, IF_REALVEC, "Initial condition vector:v1,i1,v2,i2"), - OPU("pos_node1", LTRA_POS_NODE1, IF_INTEGER, "Positive node of end 1 of t-line"), - OPU("neg_node1", LTRA_NEG_NODE1, IF_INTEGER, "Negative node of end 1 of t.line"), - OPU("pos_node2", LTRA_POS_NODE2, IF_INTEGER, "Positive node of end 2 of t-line"), - OPU("neg_node2", LTRA_NEG_NODE2, IF_INTEGER, "Negative node of end 2 of t-line") -}; - -IFparm LTRAmPTable[] = { /* model parameters */ - IOP("ltra", LTRA_MOD_LTRA, IF_FLAG, "LTRA model"), - IOPU("r", LTRA_MOD_R, IF_REAL, "Resistance per metre"), - IOPAU("l", LTRA_MOD_L, IF_REAL, "Inductance per metre"), - IOP("g", LTRA_MOD_G, IF_REAL, "Conductance per metre"), - IOPAU("c", LTRA_MOD_C, IF_REAL, "Capacitance per metre"), - IOPU("len", LTRA_MOD_LEN, IF_REAL, "length of line"), - OP("rel", LTRA_MOD_RELTOL, IF_REAL, "Rel. rate of change of deriv. for bkpt"), - OP("abs", LTRA_MOD_ABSTOL, IF_REAL, "Abs. rate of change of deriv. for bkpt"), - - IOPU("nocontrol", LTRA_MOD_NOCONTROL, IF_FLAG, "No timestep control"), - IOPU("steplimit", LTRA_MOD_STEPLIMIT, IF_FLAG, - "always limit timestep to 0.8*(delay of line)"), - IOPU("nosteplimit", LTRA_MOD_NOSTEPLIMIT, IF_FLAG, - "don't always limit timestep to 0.8*(delay of line)"), - IOPU("lininterp", LTRA_MOD_LININTERP, IF_FLAG, "use linear interpolation"), - IOPU("quadinterp", LTRA_MOD_QUADINTERP, IF_FLAG, "use quadratic interpolation"), - IOPU("mixedinterp", LTRA_MOD_MIXEDINTERP, IF_FLAG, - "use linear interpolation if quadratic results look unacceptable"), - IOPU("truncnr", LTRA_MOD_TRUNCNR, IF_FLAG, - "use N-R iterations for step calculation in LTRAtrunc"), - IOPU("truncdontcut", LTRA_MOD_TRUNCDONTCUT, IF_FLAG, - "don't limit timestep to keep impulse response calculation errors low"), - IOPAU("compactrel", LTRA_MOD_STLINEREL, IF_REAL, - "special reltol for straight line checking"), - IOPAU("compactabs", LTRA_MOD_STLINEABS, IF_REAL, - "special abstol for straight line checking") -}; - -char *LTRAnames[] = { - "P1+", - "P1-", - "P2+", - "P2-" -}; - -int LTRAnSize = NUMELEMS(LTRAnames); -int LTRApTSize = NUMELEMS(LTRApTable); -int LTRAmPTSize = NUMELEMS(LTRAmPTable); -int LTRAiSize = sizeof(LTRAinstance); -int LTRAmSize = sizeof(LTRAmodel); diff --git a/src/spicelib/devices/ltra/ltraacct.c b/src/spicelib/devices/ltra/ltraacct.c deleted file mode 100644 index 2615100e7..000000000 --- a/src/spicelib/devices/ltra/ltraacct.c +++ /dev/null @@ -1,294 +0,0 @@ -/********** -Copyright 1990 Regents of the University of California. All rights reserved. -Author: 1990 Jaijeet S. Roychowdhury -**********/ - -#include "ngspice/ngspice.h" -#include "ngspice/cktdefs.h" -#include "ltradefs.h" -#include "ngspice/sperror.h" -#include "ngspice/suffix.h" - -int -LTRAaccept(CKTcircuit *ckt, GENmodel *inModel) -{ - LTRAmodel *model = (LTRAmodel *) inModel; - LTRAinstance *here; - double v1, v2, v3, v4; - double v5, v6, d1, d2, d3, d4; - int tmp_test; - int error; - int compact = 1; - - - /* loop through all the transmission line models */ - for (; model != NULL; model = LTRAnextModel(model)) { - - if (ckt->CKTmode & MODEINITTRAN) { - -#define LTRAmemMANAGE(a,b) \ - if ( a != NULL) FREE(a);\ - a = TMALLOC(double, b); - - model->LTRAmodelListSize = 10; - - - LTRAmemMANAGE(model->LTRAh1dashCoeffs, model->LTRAmodelListSize) - LTRAmemMANAGE(model->LTRAh2Coeffs, model->LTRAmodelListSize) - LTRAmemMANAGE(model->LTRAh3dashCoeffs, model->LTRAmodelListSize) - } - if (ckt->CKTtimeIndex >= model->LTRAmodelListSize) { /* need more space */ - model->LTRAmodelListSize += ckt->CKTsizeIncr; - - - model->LTRAh1dashCoeffs = TREALLOC(double, model->LTRAh1dashCoeffs, model->LTRAmodelListSize); - model->LTRAh2Coeffs = TREALLOC(double, model->LTRAh2Coeffs, model->LTRAmodelListSize); - model->LTRAh3dashCoeffs = TREALLOC(double, model->LTRAh3dashCoeffs, model->LTRAmodelListSize); - } - /* loop through all the instances of the model */ - for (here = LTRAinstances(model); here != NULL; - here = LTRAnextInstance(here)) { - - if (ckt->CKTmode & MODEINITTRAN) { - here->LTRAinstListSize = 10; - - LTRAmemMANAGE(here->LTRAv1, here->LTRAinstListSize) - LTRAmemMANAGE(here->LTRAi1, here->LTRAinstListSize) - LTRAmemMANAGE(here->LTRAv2, here->LTRAinstListSize) - LTRAmemMANAGE(here->LTRAi2, here->LTRAinstListSize) - } - /* - * why is this here? ask TQ - * - * if (ckt->CKTtimeIndex == 0? 1: (ckt->CKTtime- - * (ckt->CKTtimePoints+ckt->CKTtimeIndex-1) > ckt->CKTminBreak)) { - * - */ - if (ckt->CKTtimeIndex >= here->LTRAinstListSize) { /* need more space */ - here->LTRAinstListSize += ckt->CKTsizeIncr; - - here->LTRAv1 = TREALLOC(double, here->LTRAv1, here->LTRAinstListSize); - here->LTRAi1 = TREALLOC(double, here->LTRAi1, here->LTRAinstListSize); - here->LTRAi2 = TREALLOC(double, here->LTRAi2, here->LTRAinstListSize); - here->LTRAv2 = TREALLOC(double, here->LTRAv2, here->LTRAinstListSize); - } - *(here->LTRAv1 + ckt->CKTtimeIndex) = *(ckt->CKTrhsOld + - here->LTRAposNode1) - *(ckt->CKTrhsOld + - here->LTRAnegNode1); - *(here->LTRAv2 + ckt->CKTtimeIndex) = *(ckt->CKTrhsOld + - here->LTRAposNode2) - *(ckt->CKTrhsOld + - here->LTRAnegNode2); - *(here->LTRAi1 + ckt->CKTtimeIndex) = *(ckt->CKTrhsOld + - here->LTRAbrEq1); - *(here->LTRAi2 + ckt->CKTtimeIndex) = *(ckt->CKTrhsOld + - here->LTRAbrEq2); - - if (ckt->CKTtryToCompact && (ckt->CKTtimeIndex >= 2)) { - - /* - * figure out if the last 3 points lie on a st. line for all the - * terminal variables - */ - { - double t1, t2, t3; - - t1 = *(ckt->CKTtimePoints + ckt->CKTtimeIndex - 2); - t2 = *(ckt->CKTtimePoints + ckt->CKTtimeIndex - 1); - t3 = *(ckt->CKTtimePoints + ckt->CKTtimeIndex); - - if (compact) { - compact = LTRAstraightLineCheck(t1, - *(here->LTRAv1 + ckt->CKTtimeIndex - 2), - t2, *(here->LTRAv1 + ckt->CKTtimeIndex - 1), - t3, *(here->LTRAv1 + ckt->CKTtimeIndex), - model->LTRAstLineReltol, model->LTRAstLineAbstol); - } - if (compact) { - compact = LTRAstraightLineCheck(t1, - *(here->LTRAv2 + ckt->CKTtimeIndex - 2), - t2, *(here->LTRAv2 + ckt->CKTtimeIndex - 1), - t3, *(here->LTRAv2 + ckt->CKTtimeIndex), - model->LTRAstLineReltol, model->LTRAstLineAbstol); - } - if (compact) { - compact = LTRAstraightLineCheck(t1, - *(here->LTRAi1 + ckt->CKTtimeIndex - 2), - t2, *(here->LTRAi1 + ckt->CKTtimeIndex - 1), - t3, *(here->LTRAi1 + ckt->CKTtimeIndex), - model->LTRAstLineReltol, model->LTRAstLineAbstol); - } - if (compact) { - compact = LTRAstraightLineCheck(t1, - *(here->LTRAi2 + ckt->CKTtimeIndex - 2), - t2, *(here->LTRAi2 + ckt->CKTtimeIndex - 1), - t3, *(here->LTRAi2 + ckt->CKTtimeIndex), - model->LTRAstLineReltol, model->LTRAstLineAbstol); - } - } - } - if (ckt->CKTtimeIndex > 0) { -#ifdef NOTDEF - v1 = (*(here->LTRAv1 + ckt->CKTtimeIndex) + - *(here->LTRAi1 + ckt->CKTtimeIndex) * - model->LTRAimped) * model->LTRAattenuation; - v2 = (*(here->LTRAv1 + ckt->CKTtimeIndex - 1) + - *(here->LTRAi1 + ckt->CKTtimeIndex - 1) - * model->LTRAimped) * model->LTRAattenuation; - v3 = (*(here->LTRAv2 + ckt->CKTtimeIndex) + - *(here->LTRAi2 + ckt->CKTtimeIndex) * - model->LTRAimped) * model->LTRAattenuation; - v4 = (*(here->LTRAv2 + ckt->CKTtimeIndex - 1) + - *(here->LTRAi2 + ckt->CKTtimeIndex - 1) * - model->LTRAimped) * model->LTRAattenuation; - if ((fabs(v1 - v2) >= 50 * ckt->CKTreltol * - MAX(fabs(v1), fabs(v2)) + 50 * ckt->CKTvoltTol) || - (fabs(v3 - v4) >= 50 * ckt->CKTreltol * - MAX(fabs(v3), fabs(v4)) + 50 * ckt->CKTvoltTol)) { - /* changing - need to schedule after delay */ - /* - * don't really need this error = - * CKTsetBreak(ckt,ckt->CKTtime+model->LTRAtd); if(error) - * return(error); - */ - /* the PREVIOUS point is the real breakpoint */ - error = CKTsetBreak(ckt, - *(ckt->CKTtimePoints + ckt->CKTtimeIndex - 1) + - model->LTRAtd); - CKTbreakDump(ckt); - if (error) - return (error); - } -#else - /* - * remove the hack here - store the total inputs for the last 2 or 3 - * timesteps - */ - - v1 = (*(here->LTRAv1 + ckt->CKTtimeIndex) + - *(here->LTRAi1 + ckt->CKTtimeIndex) * - model->LTRAimped) * model->LTRAattenuation; - v2 = (*(here->LTRAv1 + ckt->CKTtimeIndex - 1) + - *(here->LTRAi1 + ckt->CKTtimeIndex - 1) * - model->LTRAimped) * model->LTRAattenuation; - v3 = ckt->CKTtimeIndex < 2 ? v2 : (*(here->LTRAv1 + ckt->CKTtimeIndex - 2) + - *(here->LTRAi1 + ckt->CKTtimeIndex - 2) * - model->LTRAimped) * model->LTRAattenuation; - v4 = (*(here->LTRAv2 + ckt->CKTtimeIndex) + - *(here->LTRAi2 + ckt->CKTtimeIndex) * - model->LTRAimped) * model->LTRAattenuation; - v5 = (*(here->LTRAv2 + ckt->CKTtimeIndex - 1) + - *(here->LTRAi2 + ckt->CKTtimeIndex - 1) * - model->LTRAimped) * model->LTRAattenuation; - v6 = ckt->CKTtimeIndex < 2 ? v5 : (*(here->LTRAv2 + ckt->CKTtimeIndex - 2) + - *(here->LTRAi2 + ckt->CKTtimeIndex - 2) * - model->LTRAimped) * model->LTRAattenuation; - - d1 = (v1 - v2) / (*(ckt->CKTtimePoints + ckt->CKTtimeIndex) - - *(ckt->CKTtimePoints + ckt->CKTtimeIndex - 1)); - d2 = (ckt->CKTtimeIndex < 2) - ? 0 - : (v2 - v3) / (*(ckt->CKTtimePoints + ckt->CKTtimeIndex - 1) - - *(ckt->CKTtimePoints + ckt->CKTtimeIndex - 2)); - d3 = (v4 - v5) / (*(ckt->CKTtimePoints + ckt->CKTtimeIndex) - - *(ckt->CKTtimePoints + ckt->CKTtimeIndex - 1)); - d4 = (ckt->CKTtimeIndex < 2) - ? 0 - : (v5 - v6) / (*(ckt->CKTtimePoints + ckt->CKTtimeIndex - 1) - - *(ckt->CKTtimePoints + ckt->CKTtimeIndex - 2)); - - /* - * here we have a big problem with the scheme boxed by the *s below. - * Note the following: if LTRAreltol == 1, (assuming LTRAabstol==0) - * then breakpoints are set if and only if d1 and d2 have opposite - * signs or one is zero. If LTRAreltol > 2, breakpoints are never - * set. The problem is that when the waveform is steady at a value, - * small random numerical inaccuracies may produce derivatives of - * opposite sign, and breakpoints get set. This can, in practice, get - * quite killing... To alleviate this, we try to determine if the - * waveform is actually steady using the following tests: 1. Check if - * the maximum difference between v1,v2 and v3 is less than - * 50*CKTreltol*(the average of v1,v2,and v3) + 50*ckt->CKTabstol - * (the 50 has been taken from the NOTDEF section above, reason - * unknown - hopefully there is a good reason for it - ask TQ) - * - * 2. Criterion 1 may be satisfied by a legitimate breakpoint. To - * further check, find one more derivative one timepoint ago and see - * if that is close to d2. If not, then the likelihood of numerical - * inaccuracies is greater... - */ - - /********************************************************************* - if( (fabs(d1-d2) >= model->LTRAreltol*MAX(fabs(d1),fabs(d2))+ - model->LTRAabstol) || - (fabs(d3-d4) >= model->LTRAreltol*MAX(fabs(d3),fabs(d4))+ - model->LTRAabstol) ) { - *********************************************************************/ -#define CHECK(a,b,c) (MAX(MAX(a,b),c)-MIN(MIN(a,b),c) >= \ - fabs(50.0*(ckt->CKTreltol/3.0*(a+b+c) +\ - ckt->CKTabstol))) - - tmp_test = (fabs(d1 - d2) - >= model->LTRAreltol * MAX(fabs(d1), fabs(d2)) + - model->LTRAabstol) - && CHECK(v1, v2, v3); - if (tmp_test || ((fabs(d3 - d4) - >= model->LTRAreltol * MAX(fabs(d3), fabs(d4)) + - model->LTRAabstol) - && CHECK(v4, v5, v6))) { - /* criterion 2 not implemented yet... */ - error = CKTsetBreak(ckt, - *(ckt->CKTtimePoints + ckt->CKTtimeIndex - 1) + - model->LTRAtd); - /* - * this is not necessary - the previous timepoint was the - * breakpoint error = CKTsetBreak(ckt, ckt->CKTtime + - * model->LTRAtd); - */ -#ifdef LTRADEBUG - fprintf(stdout, "\nbreakpoints set at %14.14g at %14.14g at time %14.14g\n", ckt->CKTtime + model->LTRAtd, *(ckt->CKTtimePoints + ckt->CKTtimeIndex - - 1) + model->LTRAtd, ckt->CKTtime); - fprintf(stdout, "d1 through d4 are %14.14g %14.14g %14.14g %14.14g\n\n", d1, d2, d3, d4); -#endif - if (error) - return (error); - } - /* } */ -#endif /* NOTDEF */ - } - /* ask TQ } */ - - } /* instance */ - } /* model */ - - - if (ckt->CKTtryToCompact && compact && (ckt->CKTtimeIndex >= 2)) { - - /* - * last three timepoints have variables lying on a straight line, do a - * compaction - */ - - model = (LTRAmodel *) inModel; - for (; model != NULL; model = LTRAnextModel(model)) { - for (here = LTRAinstances(model); here != NULL; - here = LTRAnextInstance(here)) { - *(here->LTRAv1 + ckt->CKTtimeIndex - 1) = *(here->LTRAv1 + - ckt->CKTtimeIndex); - *(here->LTRAv2 + ckt->CKTtimeIndex - 1) = *(here->LTRAv2 + - ckt->CKTtimeIndex); - *(here->LTRAi1 + ckt->CKTtimeIndex - 1) = *(here->LTRAi1 + - ckt->CKTtimeIndex); - *(here->LTRAi2 + ckt->CKTtimeIndex - 1) = *(here->LTRAi2 + - ckt->CKTtimeIndex); - } - } - *(ckt->CKTtimePoints + ckt->CKTtimeIndex - 1) = - *(ckt->CKTtimePoints + ckt->CKTtimeIndex); - ckt->CKTtimeIndex--; -#ifdef LTRADEBUG - fprintf(stdout, "compacted at time=%g\n", *(ckt->CKTtimePoints + ckt->CKTtimeIndex)); - fflush(stdout); -#endif - } - return (OK); -} diff --git a/src/spicelib/devices/ltra/ltraacld.c b/src/spicelib/devices/ltra/ltraacld.c deleted file mode 100644 index 88c277059..000000000 --- a/src/spicelib/devices/ltra/ltraacld.c +++ /dev/null @@ -1,146 +0,0 @@ -/********** -Copyright 1990 Regents of the University of California. All rights -reserved. -Author: 1990 Jaijeet S. Roychowdhury -**********/ - -#include "ngspice/ngspice.h" -#include "ngspice/cktdefs.h" -#include "ltradefs.h" -#include "ngspice/trandefs.h" -#include "ngspice/sperror.h" -#include "ngspice/suffix.h" - -int -LTRAacLoad(GENmodel *inModel, CKTcircuit *ckt) -/* - * load the appropriate values for the current timepoint into the sparse - * matrix and the right-hand-side vector - */ -{ - LTRAmodel *model = (LTRAmodel *) inModel; - LTRAinstance *here; - double y0_r, y0_i, lambda_r, lambda_i, mag, theta; - double exparg_r, exparg_i, explambda_r, explambda_i; - double y0exp_r, y0exp_i; - long savemode; - int error; - - /* - * LTRAacLoad - loads for LTRA lines for the s.s. ac case the equations are - * the following: - * - * Y_0(s) * V_1(s) - I_1(s) = exp(-lambda(s)*length) * (Y_0(s) * V_2(s) + - * I_2(s)) Y_0(s) * V_2(s) - I_2(s) = exp(-lambda(s)*length) * (Y_0(s) * - * V_1(s) + I_1(s)) - * - * where Y_0(s) and lambda(s) are as follows: - * - * Y_0(s) = sqrt( (sC+G)/(sL+R) ) lambda(s) = sqrt( (sC+G)*(sL+R) ) - * - * for the RC, RLC, and LC cases, G=0. The RG case is handled exactly as the - * DC case, (and the above equations require reformulation because they - * become identical for the DC case.) - */ - - /* loop through all the transmission line models */ - for (; model != NULL; model = LTRAnextModel(model)) { - - switch (model->LTRAspecialCase) { - - case LTRA_MOD_LC: - - y0_r = model->LTRAadmit; - y0_i = 0.0; - /*lambda_i = model->LTRAtd*ckt->CKTomega;*/ - lambda_i = sqrt(model->LTRAinduct*model->LTRAcapac) * ckt->CKTomega; /*CDHW*/ - lambda_r = 0.0; - break; - - case LTRA_MOD_RLC: - - theta = 0.5 * atan(model->LTRAresist / (ckt->CKTomega*model->LTRAinduct)); - mag = sqrt(ckt->CKTomega * model->LTRAcapac / - sqrt(model->LTRAresist * model->LTRAresist + - ckt->CKTomega * ckt->CKTomega * model->LTRAinduct * - model->LTRAinduct)); - y0_r = mag * cos(theta); - y0_i = mag * sin(theta); - - theta = M_PI / 2 - theta; - mag *= sqrt(model->LTRAresist * model->LTRAresist + - ckt->CKTomega * ckt->CKTomega * model->LTRAinduct * - model->LTRAinduct); - lambda_r = mag * cos(theta); - lambda_i = mag * sin(theta); - break; - - case LTRA_MOD_RC: - - y0_r = y0_i = sqrt(0.5 * ckt->CKTomega * model->LTRAcByR); - lambda_r = lambda_i = - sqrt(0.5 * ckt->CKTomega * model->LTRAresist * model->LTRAcapac); - break; - - case LTRA_MOD_RG: - - savemode = ckt->CKTmode; - ckt->CKTmode |= MODEDC; - error = LTRAload(inModel, ckt); - ckt->CKTmode = savemode; - return (error); - break; - - default: - return (E_BADPARM); - } - - exparg_r = -lambda_r * model->LTRAlength; - exparg_i = -lambda_i * model->LTRAlength; - explambda_r = exp(exparg_r) * cos(exparg_i); - explambda_i = exp(exparg_r) * sin(exparg_i); - y0exp_r = y0_r * explambda_r - y0_i * explambda_i; - y0exp_i = y0_r * explambda_i + y0_i * explambda_r; - - /* loop through all the instances of the model */ - for (here = LTRAinstances(model); here != NULL; - here = LTRAnextInstance(here)) { - - *(here->LTRAibr1Pos1Ptr + 0) += y0_r; - *(here->LTRAibr1Pos1Ptr + 1) += y0_i; - *(here->LTRAibr1Neg1Ptr + 0) -= y0_r; - *(here->LTRAibr1Neg1Ptr + 1) -= y0_i; - - *(here->LTRAibr1Ibr1Ptr + 0) -= 1.0; - - *(here->LTRAibr1Pos2Ptr + 0) -= y0exp_r; - *(here->LTRAibr1Pos2Ptr + 1) -= y0exp_i; - *(here->LTRAibr1Neg2Ptr + 0) += y0exp_r; - *(here->LTRAibr1Neg2Ptr + 1) += y0exp_i; - - *(here->LTRAibr1Ibr2Ptr + 0) -= explambda_r; - *(here->LTRAibr1Ibr2Ptr + 1) -= explambda_i; - - *(here->LTRAibr2Pos2Ptr + 0) += y0_r; - *(here->LTRAibr2Pos2Ptr + 1) += y0_i; - *(here->LTRAibr2Neg2Ptr + 0) -= y0_r; - *(here->LTRAibr2Neg2Ptr + 1) -= y0_i; - - *(here->LTRAibr2Ibr2Ptr + 0) -= 1.0; - - *(here->LTRAibr2Pos1Ptr + 0) -= y0exp_r; - *(here->LTRAibr2Pos1Ptr + 1) -= y0exp_i; - *(here->LTRAibr2Neg1Ptr + 0) += y0exp_r; - *(here->LTRAibr2Neg1Ptr + 1) += y0exp_i; - - *(here->LTRAibr2Ibr1Ptr + 0) -= explambda_r; - *(here->LTRAibr2Ibr1Ptr + 1) -= explambda_i; - - *(here->LTRApos1Ibr1Ptr + 0) += 1.0; - *(here->LTRAneg1Ibr1Ptr + 0) -= 1.0; - *(here->LTRApos2Ibr2Ptr + 0) += 1.0; - *(here->LTRAneg2Ibr2Ptr + 0) -= 1.0; - } - } - return (OK); -} diff --git a/src/spicelib/devices/ltra/ltraask.c b/src/spicelib/devices/ltra/ltraask.c deleted file mode 100644 index 022e73374..000000000 --- a/src/spicelib/devices/ltra/ltraask.c +++ /dev/null @@ -1,90 +0,0 @@ -/********** -Copyright 1990 Regents of the University of California. All rights reserved. -Author: 1990 Jaijeet S. Roychowdhury -**********/ - -/* - * This routine gives access to the internal device parameter of LTRA lines - */ - -#include "ngspice/ngspice.h" -#include "ngspice/cktdefs.h" -#include "ngspice/devdefs.h" -#include "ngspice/ifsim.h" -#include "ltradefs.h" -#include "ngspice/sperror.h" -#include "ngspice/suffix.h" - -/* ARGSUSED */ -int -LTRAask(CKTcircuit *ckt, GENinstance *inst, int which, IFvalue *value, IFvalue *select) -{ - LTRAinstance *here = (LTRAinstance *) inst; - int temp; - - NG_IGNORE(select); - NG_IGNORE(ckt); - - switch (which) { - case LTRA_POS_NODE1: - value->iValue = here->LTRAposNode1; - return (OK); - case LTRA_NEG_NODE1: - value->iValue = here->LTRAnegNode1; - return (OK); - case LTRA_POS_NODE2: - value->iValue = here->LTRAposNode2; - return (OK); - case LTRA_NEG_NODE2: - value->iValue = here->LTRAnegNode2; - return (OK); - case LTRA_MOD_Z0: - value->rValue = LTRAmodPtr(here)->LTRAimped; - return (OK); - case LTRA_MOD_TD: - value->rValue = LTRAmodPtr(here)->LTRAtd; - return (OK); - case LTRA_MOD_NL: - value->rValue = LTRAmodPtr(here)->LTRAnl; - return (OK); - case LTRA_MOD_FREQ: - value->rValue = LTRAmodPtr(here)->LTRAf; - return (OK); - case LTRA_V1: - value->rValue = here->LTRAinitVolt1; - return (OK); - case LTRA_I1: - value->rValue = here->LTRAinitCur1; - return (OK); - case LTRA_V2: - value->rValue = here->LTRAinitVolt2; - return (OK); - case LTRA_I2: - value->rValue = here->LTRAinitCur2; - return (OK); - case LTRA_MOD_RELTOL: - value->rValue = LTRAmodPtr(here)->LTRAreltol; - return (OK); - case LTRA_MOD_ABSTOL: - value->rValue = LTRAmodPtr(here)->LTRAabstol; - return (OK); - case LTRA_BR_EQ1: - value->rValue = here->LTRAbrEq1; - return (OK); - case LTRA_BR_EQ2: - value->rValue = here->LTRAbrEq2; - return (OK); - case LTRA_DELAY: - /* - * value->v.vec.rVec = TMALLOC(double, here->LTRAsizeDelay); - * value->v.numValue = temp = here->LTRAsizeDelay; while (temp--) { - * value->v.vec.rVec++ = *here->LTRAdelays++; - */ - value->v.vec.rVec = NULL; - value->v.numValue = temp = 0; - return (OK); - default: - return (E_BADPARM); - } - /* NOTREACHED */ -} diff --git a/src/spicelib/devices/ltra/ltradefs.h b/src/spicelib/devices/ltra/ltradefs.h deleted file mode 100644 index 66ef0c0ef..000000000 --- a/src/spicelib/devices/ltra/ltradefs.h +++ /dev/null @@ -1,249 +0,0 @@ -/********** -Copyright 1990 Regents of the University of California. All rights reserved. -Author: 1990 Jaijeet S. Roychowdhury -**********/ - -#ifndef LTRA -#define LTRA -#undef LTRALTEINFO -#undef LTRADEBUG - -#include "ngspice/ifsim.h" -#include "ngspice/cktdefs.h" -#include "ngspice/gendefs.h" -#include "ngspice/complex.h" - -/* structures used to describe lossy transmission liness */ - -/* information used to describe a single instance */ - -typedef struct sLTRAinstance { - - struct GENinstance gen; - -#define LTRAmodPtr(inst) ((struct sLTRAmodel *)((inst)->gen.GENmodPtr)) -#define LTRAnextInstance(inst) ((struct sLTRAinstance *)((inst)->gen.GENnextInstance)) -#define LTRAname gen.GENname -#define LTRAstate gen.GENstate - - const int LTRAposNode1; /* number of positive node of end 1 of t. line */ - const int LTRAnegNode1; /* number of negative node of end 1 of t. line */ - const int LTRAposNode2; /* number of positive node of end 2 of t. line */ - const int LTRAnegNode2; /* number of negative node of end 2 of t. line */ - - int LTRAbrEq1; /* number of branch equation for end 1 of t. line */ - int LTRAbrEq2; /* number of branch equation for end 2 of t. line */ - double LTRAinput1; /* accumulated excitation for port 1 */ - double LTRAinput2; /* accumulated excitation for port 2 */ - double LTRAinitVolt1; /* initial condition: voltage on port 1 */ - double LTRAinitCur1; /* initial condition: current at port 1 */ - double LTRAinitVolt2; /* initial condition: voltage on port 2 */ - double LTRAinitCur2; /* initial condition: current at port 2 */ - double *LTRAv1; /* past values of v1 */ - double *LTRAi1; /* past values of i1 */ - double *LTRAv2; /* past values of v2 */ - double *LTRAi2; /* past values of i2 */ - int LTRAinstListSize; /* size of above lists */ - - double *LTRAibr1Ibr1Ptr; /* pointer to sparse matrix */ - double *LTRAibr1Ibr2Ptr; /* pointer to sparse matrix */ - double *LTRAibr1Pos1Ptr; /* pointer to sparse matrix */ - double *LTRAibr1Neg1Ptr; /* pointer to sparse matrix */ - double *LTRAibr1Pos2Ptr; /* pointer to sparse matrix */ - double *LTRAibr1Neg2Ptr; /* pointer to sparse matrix */ - double *LTRAibr2Ibr1Ptr; /* pointer to sparse matrix */ - double *LTRAibr2Ibr2Ptr; /* pointer to sparse matrix */ - double *LTRAibr2Pos1Ptr; /* pointer to sparse matrix */ - double *LTRAibr2Neg1Ptr; /* pointer to sparse matrix */ - double *LTRAibr2Pos2Ptr; /* pointer to sparse matrix */ - double *LTRAibr2Neg2Ptr; /* pointer to sparse matrix */ - double *LTRAneg1Ibr1Ptr; /* pointer to sparse matrix */ - double *LTRAneg2Ibr2Ptr; /* pointer to sparse matrix */ - double *LTRApos1Ibr1Ptr; /* pointer to sparse matrix */ - double *LTRApos2Ibr2Ptr; /* pointer to sparse matrix */ - double *LTRApos1Pos1Ptr; /* pointer to sparse matrix */ - double *LTRAneg1Neg1Ptr; /* pointer to sparse matrix */ - double *LTRApos2Pos2Ptr; /* pointer to sparse matrix */ - double *LTRAneg2Neg2Ptr; /* pointer to sparse matrix */ - - unsigned LTRAicV1Given : 1; /* flag to ind. init. voltage at port 1 given */ - unsigned LTRAicC1Given : 1; /* flag to ind. init. current at port 1 given */ - unsigned LTRAicV2Given : 1; /* flag to ind. init. voltage at port 2 given */ - unsigned LTRAicC2Given : 1; /* flag to ind. init. current at port 2 given */ -} LTRAinstance ; - - -/* per model data */ - -typedef struct sLTRAmodel { /* model structure for a transmission lines */ - - struct GENmodel gen; - -#define LTRAmodType gen.GENmodType -#define LTRAnextModel(inst) ((struct sLTRAmodel *)((inst)->gen.GENnextModel)) -#define LTRAinstances(inst) ((LTRAinstance *)((inst)->gen.GENinstances)) -#define LTRAmodName gen.GENmodName - - double LTRAh1dashFirstVal; /* first needed value of h1dasg at - current timepoint */ - double LTRAh2FirstVal; /* first needed value of h2 at current - timepoint */ - double LTRAh3dashFirstVal; /* first needed value of h3dash at - current timepoint */ - -#if 0 - double *LTRAh1dashValues; /* values of h1dash for all previous - times */ - double *LTRAh2Values; /* values of h2 for all previous times */ - double *LTRAh3dashValues; /* values of h3dash for all previous - times */ - - double LTRAh2FirstOthVal; /* needed for LTE calc; but their values */ - double LTRAh3dashFirstOthVal; /*may depend on the current timepoint*/ - - double *LTRAh1dashOthVals; /* these lists of other values are */ - double *LTRAh2OthVals; /* needed for truncation error */ - double *LTRAh3dashOthVals; /* calculation */ -#endif - /* the OthVals do not depend on the current - * timepoint; hence they are set up in LTRAaccept.c. - * They are used in LTRAtrunc.c - */ - - double LTRAh1dashFirstCoeff; /* first needed coeff of h1dash for - the current timepoint */ - double LTRAh2FirstCoeff; /* first needed coeff of h2 for the - current timepoint */ - double LTRAh3dashFirstCoeff; /* first needed coeff of h3dash for - the current timepoint */ - - double *LTRAh1dashCoeffs; /* list of other coefficients for h1dash */ - double *LTRAh2Coeffs; /* list of other coefficients for h2 */ - double *LTRAh3dashCoeffs; /* list of other coefficients for h3dash */ - int LTRAmodelListSize; /* size of above lists */ - - double LTRAconduct; /* conductance G - input */ - double LTRAresist; /* resistance R - input */ - double LTRAinduct; /* inductance L - input */ - double LTRAcapac; /* capacitance C - input */ - double LTRAlength; /* length l - input */ - double LTRAtd; /* propagation delay T - calculated*/ - double LTRAimped; /* impedance Z - calculated*/ - double LTRAadmit; /* admittance Y - calculated*/ - double LTRAalpha; /* alpha - calculated */ - double LTRAbeta; /* beta - calculated */ - double LTRAattenuation; /* e^(-beta T) - calculated */ - double LTRAcByR; /* C/R - for the RC line - calculated */ - double LTRArclsqr; /* RCl^2 - for the RC line - calculated */ - double LTRAintH1dash;/* \int_0^\inf h'_1(\tau) d \tau - calculated*/ - double LTRAintH2;/* \int_0^\inf h_2(\tau) d \tau - calculated*/ - double LTRAintH3dash;/* \int_0^\inf h'_3(\tau) d \tau - calculated*/ - - double LTRAnl; /* normalized length - historical significance only*/ - double LTRAf; /* frequency at which nl is measured - historical significance only*/ - double LTRAcoshlrootGR; /* cosh(l*sqrt(G*R)), used for DC anal */ - double LTRArRsLrGRorG; /* sqrt(R)*sinh(l*sqrt(G*R))/sqrt(G) */ - double LTRArGsLrGRorR; /* sqrt(G)*sinh(l*sqrt(G*R))/sqrt(R) */ - - /*int LTRAh1dashIndex;*/ /* index for h1dash that points to the - latest nonzero coefficient in the list */ - /*int LTRAh2Index;*/ /* ditto for h2 */ - /*int LTRAh3dashIndex;*/ /* ditto for h3dash */ - int LTRAauxIndex; /* auxiliary index for h2 and h3dash */ - double LTRAstLineReltol; /* separate reltol for checking st. lines */ - double LTRAchopReltol; /* separate reltol for truncation of impulse responses*/ - double LTRAstLineAbstol; /* separate abstol for checking st. lines */ - double LTRAchopAbstol; /* separate abstol for truncation of impulse responses */ - - unsigned LTRAreltolGiven:1; /* flag to ind. relative deriv. tol. given */ - unsigned LTRAabstolGiven:1; /* flag to ind. absolute deriv. tol. given */ - unsigned LTRAtruncNR:1; /* flag to ind. use N-R iterations for calculating step in LTRAtrunc */ - unsigned LTRAtruncDontCut:1; /* flag to ind. don't bother about errors in impulse response calculations due to large steps*/ - double LTRAmaxSafeStep; /* maximum safe step for impulse response calculations */ - unsigned LTRAresistGiven : 1; /* flag to indicate R was specified */ - unsigned LTRAconductGiven : 1; /* flag to indicate G was specified */ - unsigned LTRAinductGiven : 1; /* flag to indicate L was specified */ - unsigned LTRAcapacGiven : 1; /* flag to indicate C was specified */ - unsigned LTRAlengthGiven : 1; /* flag to indicate length was specified */ - unsigned LTRAnlGiven : 1; /* flag to indicate norm length was specified */ - int LTRAlteConType; /* indicates whether full control, half control or no control */ - int LTRAhowToInterp; /* indicates how to interpolate for delayed timepoint */ - unsigned LTRAprintFlag: 1; /* flag to indicate whether debugging output should be printed */ - /*unsigned LTRArOnly: 1;*/ /* flag to indicate G=0, use known Bessel - integrals for accuracy and speed */ - int LTRAstepLimit; /* flag to indicate that the timestep - should always be limited to - 0.8*LTRAtd */ - unsigned LTRAfGiven : 1; /* flag to indicate freq was specified */ - double LTRAabstol; /* absolute deriv. tol. for breakpoint setting */ - double LTRAreltol; /* relative deriv. tol. for breakpoint setting */ - int LTRAspecialCase; /* what kind of model (RC, RLC, RL, ...) */ -} LTRAmodel; - -/* device parameters */ -enum { - LTRA_MOD_LTRA = 0, - LTRA_MOD_R, - LTRA_MOD_L, - LTRA_MOD_G, - LTRA_MOD_C, - LTRA_MOD_LEN, - LTRA_V1, - LTRA_I1, - LTRA_V2, - LTRA_I2, - LTRA_IC, - LTRA_MOD_RELTOL, - LTRA_MOD_ABSTOL, - LTRA_POS_NODE1, - LTRA_NEG_NODE1, - LTRA_POS_NODE2, - LTRA_NEG_NODE2, - LTRA_INPUT1, - LTRA_INPUT2, - LTRA_DELAY, - LTRA_BR_EQ1, - LTRA_BR_EQ2, - LTRA_MOD_NL, - LTRA_MOD_FREQ, - LTRA_MOD_Z0, - LTRA_MOD_TD, - LTRA_MOD_FULLCONTROL, - LTRA_MOD_HALFCONTROL, - LTRA_MOD_NOCONTROL, - LTRA_MOD_PRINT, - LTRA_MOD_NOPRINT, -}; - -/* -#define LTRA_MOD_RONLY 31 -*/ -enum { - LTRA_MOD_STEPLIMIT = 32, - LTRA_MOD_NOSTEPLIMIT, - LTRA_MOD_LININTERP, - LTRA_MOD_QUADINTERP, - LTRA_MOD_MIXEDINTERP, - LTRA_MOD_RLC, - LTRA_MOD_RC, - LTRA_MOD_RG, - LTRA_MOD_LC, - LTRA_MOD_RL, - LTRA_MOD_STLINEREL, - LTRA_MOD_STLINEABS, - LTRA_MOD_CHOPREL, - LTRA_MOD_CHOPABS, - LTRA_MOD_TRUNCNR, - LTRA_MOD_TRUNCDONTCUT, -}; - -/* model parameters */ - -/* device questions */ - -/* model questions */ - -#include "ltraext.h" - -#endif /*LTRA*/ - diff --git a/src/spicelib/devices/ltra/ltraext.h b/src/spicelib/devices/ltra/ltraext.h deleted file mode 100644 index cb8a6c35b..000000000 --- a/src/spicelib/devices/ltra/ltraext.h +++ /dev/null @@ -1,46 +0,0 @@ -/********** -Copyright 1990 Regents of the University of California. All rights reserved. -Author: 1990 Jaijeet S. Roychowdhury -Modified: 2000 AlansFixes -**********/ - - -extern int LTRAaccept(CKTcircuit*,GENmodel*); -extern int LTRAask(CKTcircuit*,GENinstance*,int,IFvalue*,IFvalue*); -extern int LTRAacLoad(GENmodel*,CKTcircuit*); -extern int LTRAload(GENmodel*,CKTcircuit*); -extern int LTRAmAsk(CKTcircuit*,GENmodel*,int,IFvalue*); -extern int LTRAparam(int,IFvalue*,GENinstance*,IFvalue*); -extern int LTRAmParam(int,IFvalue*,GENmodel*); -extern int LTRAsetup(SMPmatrix*,GENmodel*,CKTcircuit*,int*); -extern int LTRAunsetup(GENmodel*,CKTcircuit*); -extern int LTRAtemp(GENmodel*,CKTcircuit*); -extern int LTRAtrunc(GENmodel*,CKTcircuit*,double*); - -extern int LTRAlinInterp(double,double,double,double*,double*); - -extern int LTRAquadInterp(double,double,double,double,double*,double*,double*); -/* -extern double LTRAcoeffSetup(double*,int,double,double,double*,double,double*,int,int*); -extern double LTRAtCoeffSetup(double*,int,double,double*,double,double*,double,double*,int,int*); -extern double LTRAdivDiffs(double*,double*,double,double,double*,int); -*/ -extern double LTRArlcH1dashFunc(double,double,double,double); -extern double LTRArlcH2Func(double,double,double,double); -extern double LTRArlcH3dashFunc(double,double,double,double); -extern double LTRArlcH1dashTwiceIntFunc(double,double); -extern double LTRArlcH3dashIntFunc(double,double,double); -extern double LTRArcH1dashTwiceIntFunc(double,double); -extern double LTRArcH2TwiceIntFunc(double,double); -extern double LTRArcH3dashTwiceIntFunc(double,double,double); -extern double LTRAlteCalculate(CKTcircuit*,GENmodel*,GENinstance*,double); -/* -extern double LTRAh1dashCoeffSetup(double*,int,double,double,double*,int,int*); -extern double LTRAh3dashCoeffSetup(double*,int,double,double,double,double*,int,int*); -*/ -extern void LTRArcCoeffsSetup(double*,double*,double*,double*,double*,double*,int,double,double,double,double*,int,double); -extern void LTRArlcCoeffsSetup(double*,double*,double*,double*,double*,double*,int,double,double,double,double,double*,int,double,int*); -extern int LTRAstraightLineCheck(double,double,double,double,double,double,double,double); - -extern int LTRAdevDelete(GENinstance*); -extern int LTRAmDelete(GENmodel*); diff --git a/src/spicelib/devices/ltra/ltrainit.c b/src/spicelib/devices/ltra/ltrainit.c deleted file mode 100644 index 3c20ff383..000000000 --- a/src/spicelib/devices/ltra/ltrainit.c +++ /dev/null @@ -1,76 +0,0 @@ -#include "ngspice/config.h" - -#include "ngspice/devdefs.h" - -#include "ltraitf.h" -#include "ltraext.h" -#include "ltrainit.h" - - -SPICEdev LTRAinfo = { - .DEVpublic = { - .name = "LTRA", - .description = "Lossy transmission line", - .terms = <RAnSize, - .numNames = <RAnSize, - .termNames = LTRAnames, - .numInstanceParms = <RApTSize, - .instanceParms = LTRApTable, - .numModelParms = <RAmPTSize, - .modelParms = LTRAmPTable, - .flags = 0, - -#ifdef XSPICE - .cm_func = NULL, - .num_conn = 0, - .conn = NULL, - .num_param = 0, - .param = NULL, - .num_inst_var = 0, - .inst_var = NULL, -#endif - }, - - .DEVparam = LTRAparam, - .DEVmodParam = LTRAmParam, - .DEVload = LTRAload, - .DEVsetup = LTRAsetup, - .DEVunsetup = LTRAunsetup, - .DEVpzSetup = LTRAsetup, - .DEVtemperature = LTRAtemp, - .DEVtrunc = LTRAtrunc, - .DEVfindBranch = NULL, - .DEVacLoad = LTRAacLoad, - .DEVaccept = LTRAaccept, - .DEVdestroy = NULL, - .DEVmodDelete = LTRAmDelete, - .DEVdelete = LTRAdevDelete, - .DEVsetic = NULL, - .DEVask = LTRAask, - .DEVmodAsk = LTRAmAsk, - .DEVpzLoad = NULL, - .DEVconvTest = NULL, - .DEVsenSetup = NULL, - .DEVsenLoad = NULL, - .DEVsenUpdate = NULL, - .DEVsenAcLoad = NULL, - .DEVsenPrint = NULL, - .DEVsenTrunc = NULL, - .DEVdisto = NULL, - .DEVnoise = NULL, - .DEVsoaCheck = NULL, - .DEVinstSize = <RAiSize, - .DEVmodSize = <RAmSize, - -#ifdef CIDER - .DEVdump = NULL, - .DEVacct = NULL, -#endif -}; - - -SPICEdev * -get_ltra_info(void) -{ - return <RAinfo; -} diff --git a/src/spicelib/devices/ltra/ltrainit.h b/src/spicelib/devices/ltra/ltrainit.h deleted file mode 100644 index 90f466f86..000000000 --- a/src/spicelib/devices/ltra/ltrainit.h +++ /dev/null @@ -1,13 +0,0 @@ -#ifndef _LTRAINIT_H -#define _LTRAINIT_H - -extern IFparm LTRApTable[ ]; -extern IFparm LTRAmPTable[ ]; -extern char *LTRAnames[ ]; -extern int LTRApTSize; -extern int LTRAmPTSize; -extern int LTRAnSize; -extern int LTRAiSize; -extern int LTRAmSize; - -#endif diff --git a/src/spicelib/devices/ltra/ltraitf.h b/src/spicelib/devices/ltra/ltraitf.h deleted file mode 100644 index b96c16a7d..000000000 --- a/src/spicelib/devices/ltra/ltraitf.h +++ /dev/null @@ -1,11 +0,0 @@ -/********** -Copyright 1990 Regents of the University of California. All rights -reserved. -Author: 1990 Jaijeet S. Roychowdhury -**********/ -#ifndef DEV_LTRA -#define DEV_LTRA - -SPICEdev *get_ltra_info(void); - -#endif diff --git a/src/spicelib/devices/ltra/ltraload.c b/src/spicelib/devices/ltra/ltraload.c deleted file mode 100644 index 01e631b23..000000000 --- a/src/spicelib/devices/ltra/ltraload.c +++ /dev/null @@ -1,860 +0,0 @@ -/********** -Copyright 1990 Regents of the University of California. All rights reserved. -Author: 1990 Jaijeet S. Roychowdhury -**********/ - -#include "ngspice/ngspice.h" -#include "ngspice/cktdefs.h" -#include "ltradefs.h" -#include "ngspice/trandefs.h" -#include "ngspice/sperror.h" -#include "ngspice/suffix.h" - -int -LTRAload(GENmodel *inModel, CKTcircuit *ckt) -/* - * load the appropriate values for the current timepoint into the sparse - * matrix and the right-hand-side vector - */ -{ - LTRAmodel *model = (LTRAmodel *) inModel; - LTRAinstance *here; - double t1=0.0, t2=0.0, t3=0.0; - double qf1=0.0, qf2=0.0, qf3=0.0; - double lf2=0.0, lf3=0.0; - double v1d = 0.0, v2d = 0.0, i1d = 0.0, i2d = 0.0; - double dummy1=0.0, dummy2=0.0; - int isaved = 0; - unsigned tdover = 0; - int i; - double max = 0.0, min = 0.0; - - /* loop through all the transmission line models */ - for (; model != NULL; model = LTRAnextModel(model)) { - - if (ckt->CKTmode & MODEDC) { - switch (model->LTRAspecialCase) { - - case LTRA_MOD_RG: - dummy1 = model->LTRAlength * sqrt(model->LTRAresist * - model->LTRAconduct); - dummy2 = exp(-dummy1); - dummy1 = exp(dummy1); /* LTRA warning: may overflow! */ - model->LTRAcoshlrootGR = 0.5 * (dummy1 + dummy2); - - if (model->LTRAconduct <= 1.0e-10) { /* hack! */ - model->LTRArRsLrGRorG = model->LTRAlength * - model->LTRAresist; - } else { - model->LTRArRsLrGRorG = 0.5 * (dummy1 - - dummy2) * sqrt(model->LTRAresist / - model->LTRAconduct); - } - - if (model->LTRAresist <= 1.0e-10) { /* hack! */ - model->LTRArGsLrGRorR = model->LTRAlength * - model->LTRAconduct; - } else { - model->LTRArGsLrGRorR = 0.5 * (dummy1 - - dummy2) * sqrt(model->LTRAconduct / - model->LTRAresist); - } - break; - - case LTRA_MOD_RC: - case LTRA_MOD_LC: - case LTRA_MOD_RLC: - - /* simple resistor-like behaviour */ - /* nothing to set up */ - break; - - default: - return (E_BADPARM); - } /* switch */ - } else { - - if ((ckt->CKTmode & MODEINITTRAN) || - (ckt->CKTmode & MODEINITPRED)) { - switch (model->LTRAspecialCase) { - - case LTRA_MOD_RLC: - case LTRA_MOD_LC: - - if (ckt->CKTtime > model->LTRAtd) { - tdover = 1; - } else { - tdover = 0; - } - default: - break; - } - - /* FALLTHROUGH added to suppress GCC warning due to - * -Wimplicit-fallthrough flag */ - switch (model->LTRAspecialCase) { - case LTRA_MOD_RLC: - /* - * set up lists of values of the functions at the necessary - * timepoints. - */ - - - /* - * set up coefficient lists LTRAh1dashCoeffs, LTRAh2Coeffs, - * LTRAh3dashCoeffs for current timepoint - */ - - /* - * NOTE: h1, h2 and h3 here actually refer to h1tilde, h2tilde, - * h3tilde in the paper - */ - - /* - * Note: many function evaluations are saved by doing the following - * all together in one procedure - */ - - (void) - LTRArlcCoeffsSetup(&(model->LTRAh1dashFirstCoeff), - &(model->LTRAh2FirstCoeff), - &(model->LTRAh3dashFirstCoeff), - model->LTRAh1dashCoeffs, model->LTRAh2Coeffs, - model->LTRAh3dashCoeffs, model->LTRAmodelListSize, - model->LTRAtd, model->LTRAalpha, model->LTRAbeta, - ckt->CKTtime, ckt->CKTtimePoints, ckt->CKTtimeIndex, - model->LTRAchopReltol, &(model->LTRAauxIndex)); - /* FALLTHROUGH */ - - - case LTRA_MOD_LC: - - /* setting up the coefficients for interpolation */ - if (tdover) { /* serious hack -fix! */ - for (i = ckt->CKTtimeIndex; i >= 0; i--) { - if (*(ckt->CKTtimePoints + i) < - ckt->CKTtime - model->LTRAtd) { - break; - } - } -#ifdef LTRADEBUG - if (i == ckt->CKTtimeIndex) { - fprintf(stdout, "LTRAload: Warning: timestep larger than delay of line\n"); - fprintf(stdout, " Time now: %g\n\n", ckt->CKTtime); - } -#endif - - if (i == ckt->CKTtimeIndex) - i--; - -/*#ifdef LTRADEBUG*/ - if (i == -1) { -#ifdef LTRADEBUG - printf("LTRAload: mistake: cannot find delayed timepoint\n"); - return E_INTERN; -#else - return E_INTERN; -#endif - } - - isaved = i; - - t2 = *(ckt->CKTtimePoints + i); - t3 = *(ckt->CKTtimePoints + i + 1); - - if ((i != 0) && ((model->LTRAhowToInterp == - LTRA_MOD_QUADINTERP) || (model->LTRAhowToInterp == - LTRA_MOD_MIXEDINTERP))) { - /* quadratic interpolation */ - t1 = *(ckt->CKTtimePoints + i - 1); - - LTRAquadInterp(ckt->CKTtime - model->LTRAtd, - t1, t2, t3, &qf1, &qf2, &qf3); - - } - if ((i == 0) || (model->LTRAhowToInterp == - LTRA_MOD_MIXEDINTERP) || (model->LTRAhowToInterp - == LTRA_MOD_LININTERP)) { /* linear interpolation */ - - LTRAlinInterp(ckt->CKTtime - model->LTRAtd, - t2, t3, &lf2, &lf3); - } - } - /* interpolation coefficients set-up */ - - break; - - case LTRA_MOD_RC: - - /* - * set up lists of values of the coefficients at the necessary - * timepoints. - */ - - - /* - * set up coefficient lists LTRAh1dashCoeffs, LTRAh2Coeffs, - * LTRAh3dashCoeffs for current timepoint - */ - - /* - * Note: many function evaluations are saved by doing the following - * all together in one procedure - */ - - - (void) - LTRArcCoeffsSetup(&(model->LTRAh1dashFirstCoeff), - &(model->LTRAh2FirstCoeff), - &(model->LTRAh3dashFirstCoeff), - model->LTRAh1dashCoeffs, model->LTRAh2Coeffs, - model->LTRAh3dashCoeffs, model->LTRAmodelListSize, - model->LTRAcByR, model->LTRArclsqr, ckt->CKTtime, - ckt->CKTtimePoints, ckt->CKTtimeIndex, model->LTRAchopReltol); - - break; - - case LTRA_MOD_RG: - break; - default: - return (E_BADPARM); - } - } - } - /* loop through all the instances of the model */ - for (here = LTRAinstances(model); here != NULL; - here = LTRAnextInstance(here)) { - - if ((ckt->CKTmode & MODEDC) || - (model->LTRAspecialCase == LTRA_MOD_RG)) { - - switch (model->LTRAspecialCase) { - - case LTRA_MOD_RG: - *(here->LTRAibr1Pos1Ptr) += 1.0; - *(here->LTRAibr1Neg1Ptr) -= 1.0; - *(here->LTRAibr1Pos2Ptr) -= model->LTRAcoshlrootGR; - *(here->LTRAibr1Neg2Ptr) += model->LTRAcoshlrootGR; - *(here->LTRAibr1Ibr2Ptr) += (1 + ckt->CKTgmin) * - model->LTRArRsLrGRorG; - - *(here->LTRAibr2Ibr2Ptr) += model->LTRAcoshlrootGR; - *(here->LTRAibr2Pos2Ptr) -= (1 + ckt->CKTgmin) * - model->LTRArGsLrGRorR; - *(here->LTRAibr2Neg2Ptr) += (1 + ckt->CKTgmin) * - model->LTRArGsLrGRorR; - *(here->LTRAibr2Ibr1Ptr) += 1.0; - - *(here->LTRApos1Ibr1Ptr) += 1.0; - *(here->LTRAneg1Ibr1Ptr) -= 1.0; - *(here->LTRApos2Ibr2Ptr) += 1.0; - *(here->LTRAneg2Ibr2Ptr) -= 1.0; - - here->LTRAinput1 = here->LTRAinput2 = 0.0; - - /* - * Somewhere else, we have fixed the matrix with zero entries so - * that SMPpreOrder doesn't have fits - */ - - break; - - case LTRA_MOD_LC: - case LTRA_MOD_RLC: - case LTRA_MOD_RC: /* load a simple resistor */ - - *(here->LTRApos1Ibr1Ptr) += 1.0; - *(here->LTRAneg1Ibr1Ptr) -= 1.0; - *(here->LTRApos2Ibr2Ptr) += 1.0; - *(here->LTRAneg2Ibr2Ptr) -= 1.0; - - *(here->LTRAibr1Ibr1Ptr) += 1.0; - *(here->LTRAibr1Ibr2Ptr) += 1.0; - *(here->LTRAibr2Pos1Ptr) += 1.0; - *(here->LTRAibr2Pos2Ptr) -= 1.0; - *(here->LTRAibr2Ibr1Ptr) -= model->LTRAresist * model->LTRAlength; - - here->LTRAinput1 = here->LTRAinput2 = 0.0; - break; - - - default: - return (E_BADPARM); - } - - } else { - /* all cases other than DC or the RG case */ - - /* first timepoint after zero */ - if (ckt->CKTmode & MODEINITTRAN) { - if (!(ckt->CKTmode & MODEUIC)) { - - here->LTRAinitVolt1 = - (*(ckt->CKTrhsOld + here->LTRAposNode1) - - *(ckt->CKTrhsOld + here->LTRAnegNode1)); - here->LTRAinitVolt2 = - (*(ckt->CKTrhsOld + here->LTRAposNode2) - - *(ckt->CKTrhsOld + here->LTRAnegNode2)); - here->LTRAinitCur1 = *(ckt->CKTrhsOld + here->LTRAbrEq1); - here->LTRAinitCur2 = *(ckt->CKTrhsOld + here->LTRAbrEq2); - } - } - /* matrix loading - done every time LTRAload is called */ - switch (model->LTRAspecialCase) { - - case LTRA_MOD_RLC: - /* loading for convolution parts' first terms */ - - dummy1 = model->LTRAadmit * model->LTRAh1dashFirstCoeff; - *(here->LTRAibr1Pos1Ptr) += dummy1; - *(here->LTRAibr1Neg1Ptr) -= dummy1; - *(here->LTRAibr2Pos2Ptr) += dummy1; - *(here->LTRAibr2Neg2Ptr) -= dummy1; - /* end loading for convolution parts' first terms */ - /* FALLTHROUGH */ - - case LTRA_MOD_LC: - /* - * this section loads for the parts of the equations that resemble - * the lossless equations - */ - - *(here->LTRAibr1Pos1Ptr) += model->LTRAadmit; - *(here->LTRAibr1Neg1Ptr) -= model->LTRAadmit; - *(here->LTRAibr1Ibr1Ptr) -= 1.0; - *(here->LTRApos1Ibr1Ptr) += 1.0; - *(here->LTRAneg1Ibr1Ptr) -= 1.0; - - *(here->LTRAibr2Pos2Ptr) += model->LTRAadmit; - *(here->LTRAibr2Neg2Ptr) -= model->LTRAadmit; - *(here->LTRAibr2Ibr2Ptr) -= 1.0; - *(here->LTRApos2Ibr2Ptr) += 1.0; - *(here->LTRAneg2Ibr2Ptr) -= 1.0; - - /* loading for lossless-like parts over */ - break; - - case LTRA_MOD_RC: - - /* - * this section loads for the parts of the equations that have no - * convolution - */ - - *(here->LTRAibr1Ibr1Ptr) -= 1.0; - *(here->LTRApos1Ibr1Ptr) += 1.0; - *(here->LTRAneg1Ibr1Ptr) -= 1.0; - - *(here->LTRAibr2Ibr2Ptr) -= 1.0; - *(here->LTRApos2Ibr2Ptr) += 1.0; - *(here->LTRAneg2Ibr2Ptr) -= 1.0; - - /* loading for non-convolution parts over */ - /* loading for convolution parts' first terms */ - - dummy1 = model->LTRAh1dashFirstCoeff; - *(here->LTRAibr1Pos1Ptr) += dummy1; - *(here->LTRAibr1Neg1Ptr) -= dummy1; - *(here->LTRAibr2Pos2Ptr) += dummy1; - *(here->LTRAibr2Neg2Ptr) -= dummy1; - - dummy1 = model->LTRAh2FirstCoeff; - *(here->LTRAibr1Ibr2Ptr) -= dummy1; - *(here->LTRAibr2Ibr1Ptr) -= dummy1; - - dummy1 = model->LTRAh3dashFirstCoeff; - *(here->LTRAibr1Pos2Ptr) -= dummy1; - *(here->LTRAibr1Neg2Ptr) += dummy1; - *(here->LTRAibr2Pos1Ptr) -= dummy1; - *(here->LTRAibr2Neg1Ptr) += dummy1; - - /* end loading for convolution parts' first terms */ - - - break; - default: - return (E_BADPARM); - } - - - /* INITPRED - first NR iteration of each timepoint */ - /* set up LTRAinputs - to go into the RHS of the circuit equations */ - - if (ckt->CKTmode & (MODEINITPRED | MODEINITTRAN)) { - - here->LTRAinput1 = here->LTRAinput2 = 0.0; - - switch (model->LTRAspecialCase) { - - case LTRA_MOD_LC: - case LTRA_MOD_RLC: - - if (tdover) { - /* have to interpolate values */ - - if ((isaved != 0) && - ((model->LTRAhowToInterp == - LTRA_MOD_QUADINTERP) || - (model->LTRAhowToInterp == - LTRA_MOD_MIXEDINTERP))) { - - v1d = *(here->LTRAv1 + isaved - 1) * qf1 - + *(here->LTRAv1 + isaved) * qf2 - + *(here->LTRAv1 + isaved + 1) * qf3; - - max = MAX(*(here->LTRAv1 + isaved - 1), - *(here->LTRAv1 + isaved)); - max = MAX(max, *(here->LTRAv1 + isaved + 1)); - min = MIN(*(here->LTRAv1 + isaved - 1), - *(here->LTRAv1 + isaved)); - min = MIN(min, *(here->LTRAv1 + isaved + 1)); - - } - if ((model->LTRAhowToInterp == - LTRA_MOD_LININTERP) || (isaved == 0) || - ((isaved != 0) && - ((model->LTRAhowToInterp == - LTRA_MOD_QUADINTERP) || - (model->LTRAhowToInterp == - LTRA_MOD_MIXEDINTERP)) && - ((v1d > max) || (v1d < min)))) { - - - if ((isaved != 0) && - (model->LTRAhowToInterp == - LTRA_MOD_QUADINTERP)) { -#ifdef LTRADEBUG - fprintf(stdout, "LTRAload: warning: interpolated v1 is out of range after timepoint %d\n", ckt->CKTtimeIndex); - fprintf(stdout, " values: %1.8g %1.8g %1.8g; interpolated: %1.8g\n", - *(here->LTRAv1 + isaved - 1), - *(here->LTRAv1 + isaved), - *(here->LTRAv1 + isaved + 1), - v1d); - fprintf(stdout, " timepoints are: %1.8g %1.8g %1.8g %1.8g\n", t1, t2, t3, ckt->CKTtime - model->LTRAtd); -#endif - } else { - - v1d = *(here->LTRAv1 + isaved) * lf2 - + *(here->LTRAv1 + isaved + 1) * - lf3; - } - - } - if ((isaved != 0) && - ((model->LTRAhowToInterp == - LTRA_MOD_QUADINTERP) || - (model->LTRAhowToInterp == - LTRA_MOD_MIXEDINTERP))) { - - i1d = *(here->LTRAi1 + isaved - 1) * qf1 - + *(here->LTRAi1 + isaved) * qf2 - + *(here->LTRAi1 + isaved + 1) * qf3; - - max = MAX(*(here->LTRAi1 + isaved - 1), - *(here->LTRAi1 + isaved)); - max = MAX(max, *(here->LTRAi1 + isaved + 1)); - min = MIN(*(here->LTRAi1 + isaved - 1), - *(here->LTRAi1 + isaved)); - min = MIN(min, *(here->LTRAi1 + isaved + 1)); - - } - if ((model->LTRAhowToInterp == - LTRA_MOD_LININTERP) || (isaved == 0) || - ((isaved != 0) && - ((model->LTRAhowToInterp == - LTRA_MOD_QUADINTERP) || - (model->LTRAhowToInterp == - LTRA_MOD_MIXEDINTERP)) && - ((i1d > max) || (i1d < min)))) { - - - if ((isaved != 0) && - (model->LTRAhowToInterp == - LTRA_MOD_QUADINTERP)) { -#ifdef LTRADEBUG - fprintf(stdout, "LTRAload: warning: interpolated i1 is out of range after timepoint %d\n", ckt->CKTtimeIndex); - fprintf(stdout, " values: %1.8g %1.8g %1.8g; interpolated: %1.8g\n", - *(here->LTRAi1 + isaved - 1), - *(here->LTRAi1 + isaved), - *(here->LTRAi1 + isaved + 1), - i1d); - fprintf(stdout, " timepoints are: %1.8g %1.8g %1.8g %1.8g\n", t1, t2, t3, ckt->CKTtime - model->LTRAtd); -#endif - } else { - - i1d = *(here->LTRAi1 + isaved) * lf2 - + *(here->LTRAi1 + isaved + 1) * - lf3; - } - - } - if ((isaved != 0) && - ((model->LTRAhowToInterp == - LTRA_MOD_QUADINTERP) || - (model->LTRAhowToInterp == - LTRA_MOD_MIXEDINTERP))) { - - v2d = *(here->LTRAv2 + isaved - 1) * qf1 - + *(here->LTRAv2 + isaved) * qf2 - + *(here->LTRAv2 + isaved + 1) * qf3; - - max = MAX(*(here->LTRAv2 + isaved - 1), - *(here->LTRAv2 + isaved)); - max = MAX(max, *(here->LTRAv2 + isaved + 1)); - min = MIN(*(here->LTRAv2 + isaved - 1), - *(here->LTRAv2 + isaved)); - min = MIN(min, *(here->LTRAv2 + isaved + 1)); - - } - if ((model->LTRAhowToInterp == - LTRA_MOD_LININTERP) || (isaved == 0) || - ((isaved != 0) && - ((model->LTRAhowToInterp == - LTRA_MOD_QUADINTERP) || - (model->LTRAhowToInterp == - LTRA_MOD_MIXEDINTERP)) && - ((v2d > max) || (v2d < min)))) { - - - if ((isaved != 0) && - (model->LTRAhowToInterp == - LTRA_MOD_QUADINTERP)) { -#ifdef LTRADEBUG - fprintf(stdout, "LTRAload: warning: interpolated v2 is out of range after timepoint %d\n", ckt->CKTtimeIndex); - fprintf(stdout, " values: %1.8g %1.8g %1.8g; interpolated: %1.8g\n", - *(here->LTRAv2 + isaved - 1), - *(here->LTRAv2 + isaved), - *(here->LTRAv2 + isaved + 1), - v2d); - fprintf(stdout, " timepoints are: %1.8g %1.8g %1.8g %1.8g\n", t1, t2, t3, ckt->CKTtime - model->LTRAtd); -#endif - } else { - - v2d = *(here->LTRAv2 + isaved) * lf2 - + *(here->LTRAv2 + isaved + 1) * - lf3; - } - - } - if ((isaved != 0) && - ((model->LTRAhowToInterp == - LTRA_MOD_QUADINTERP) || - (model->LTRAhowToInterp == - LTRA_MOD_MIXEDINTERP))) { - - i2d = *(here->LTRAi2 + isaved - 1) * qf1 - + *(here->LTRAi2 + isaved) * qf2 - + *(here->LTRAi2 + isaved + 1) * qf3; - - max = MAX(*(here->LTRAi2 + isaved - 1), - *(here->LTRAi2 + isaved)); - max = MAX(max, *(here->LTRAi2 + isaved + 1)); - min = MIN(*(here->LTRAi2 + isaved - 1), - *(here->LTRAi2 + isaved)); - min = MIN(min, *(here->LTRAi2 + isaved + 1)); - - } - if ((model->LTRAhowToInterp == - LTRA_MOD_LININTERP) || (isaved == 0) || - ((isaved != 0) && - ((model->LTRAhowToInterp == - LTRA_MOD_QUADINTERP) || - (model->LTRAhowToInterp == - LTRA_MOD_MIXEDINTERP)) && - ((i2d > max) || (i2d < min)))) { - - - if ((isaved != 0) && - (model->LTRAhowToInterp == - LTRA_MOD_QUADINTERP)) { -#ifdef LTRADEBUG - fprintf(stdout, "LTRAload: warning: interpolated i2 is out of range after timepoint %d\n", ckt->CKTtimeIndex); - fprintf(stdout, " values: %1.8g %1.8g %1.8g; interpolated: %1.8g\n", - *(here->LTRAi2 + isaved - 1), - *(here->LTRAi2 + isaved), - *(here->LTRAi2 + isaved + 1), - i2d); - fprintf(stdout, " timepoints are: %1.8g %1.8g %1.8g %1.8g\n", t1, t2, t3, ckt->CKTtime - model->LTRAtd); -#endif - } else { - - i2d = *(here->LTRAi2 + isaved) * lf2 - + *(here->LTRAi2 + isaved + 1) * - lf3; - } - - } - } - /* interpolation done */ - break; - - case LTRA_MOD_RC: - break; - - default: - return (E_BADPARM); - } - - /* FALLTHROUGH added to suppress GCC warning due to - * -Wimplicit-fallthrough flag */ - switch (model->LTRAspecialCase) { - case LTRA_MOD_RLC: - - /* begin convolution parts */ - - /* convolution of h1dash with v1 and v2 */ - /* the matrix has already been loaded above */ - - dummy1 = dummy2 = 0.0; - for (i = /* model->LTRAh1dashIndex */ ckt->CKTtimeIndex; i > 0; i--) { - if (*(model->LTRAh1dashCoeffs + i) != 0.0) { - dummy1 += *(model->LTRAh1dashCoeffs - + i) * (*(here->LTRAv1 + i) - - here->LTRAinitVolt1); - dummy2 += *(model->LTRAh1dashCoeffs - + i) * (*(here->LTRAv2 + i) - - here->LTRAinitVolt2); - } - } - - dummy1 += here->LTRAinitVolt1 * - model->LTRAintH1dash; - dummy2 += here->LTRAinitVolt2 * - model->LTRAintH1dash; - - dummy1 -= here->LTRAinitVolt1 * - model->LTRAh1dashFirstCoeff; - dummy2 -= here->LTRAinitVolt2 * - model->LTRAh1dashFirstCoeff; - - here->LTRAinput1 -= dummy1 * model->LTRAadmit; - here->LTRAinput2 -= dummy2 * model->LTRAadmit; - - /* end convolution of h1dash with v1 and v2 */ - - /* convolution of h2 with i2 and i1 */ - - dummy1 = dummy2 = 0.0; - if (tdover) { - - /* the term for ckt->CKTtime - model->LTRAtd */ - - dummy1 = (i2d - here->LTRAinitCur2) * - model->LTRAh2FirstCoeff; - dummy2 = (i1d - here->LTRAinitCur1) * - model->LTRAh2FirstCoeff; - - /* the rest of the convolution */ - - for (i = /* model->LTRAh2Index */ model->LTRAauxIndex; i > 0; i--) { - - if (*(model->LTRAh2Coeffs + i) != 0.0) { - dummy1 += *(model->LTRAh2Coeffs - + i) * (*(here->LTRAi2 + i) - - here->LTRAinitCur2); - dummy2 += *(model->LTRAh2Coeffs - + i) * (*(here->LTRAi1 + i) - - here->LTRAinitCur1); - } - } - } - /* the initial-condition terms */ - - dummy1 += here->LTRAinitCur2 * - model->LTRAintH2; - dummy2 += here->LTRAinitCur1 * - model->LTRAintH2; - - here->LTRAinput1 += dummy1; - here->LTRAinput2 += dummy2; - - /* end convolution of h2 with i2 and i1 */ - - /* convolution of h3dash with v2 and v1 */ - - /* the term for ckt->CKTtime - model->LTRAtd */ - - dummy1 = dummy2 = 0.0; - if (tdover) { - - dummy1 = (v2d - here->LTRAinitVolt2) * - model->LTRAh3dashFirstCoeff; - dummy2 = (v1d - here->LTRAinitVolt1) * - model->LTRAh3dashFirstCoeff; - - /* the rest of the convolution */ - - for (i = /* model->LTRAh3dashIndex */ model->LTRAauxIndex; i > 0; i--) { - if (*(model->LTRAh3dashCoeffs + i) != 0.0) { - dummy1 += *(model->LTRAh3dashCoeffs - + i) * (*(here->LTRAv2 + i) - - here->LTRAinitVolt2); - dummy2 += *(model->LTRAh3dashCoeffs - + i) * (*(here->LTRAv1 + i) - - here->LTRAinitVolt1); - } - } - } - /* the initial-condition terms */ - - dummy1 += here->LTRAinitVolt2 * - model->LTRAintH3dash; - dummy2 += here->LTRAinitVolt1 * - model->LTRAintH3dash; - - here->LTRAinput1 += model->LTRAadmit * dummy1; - here->LTRAinput2 += model->LTRAadmit * dummy2; - - /* end convolution of h3dash with v2 and v1 */ - - /* FALLTHROUGH */ - case LTRA_MOD_LC: - /* begin lossless-like parts */ - - if (!tdover) { - - here->LTRAinput1 += model->LTRAattenuation * - (here->LTRAinitVolt2 * model->LTRAadmit + - here->LTRAinitCur2); - here->LTRAinput2 += model->LTRAattenuation * - (here->LTRAinitVolt1 * model->LTRAadmit + - here->LTRAinitCur1); - - } else { - - here->LTRAinput1 += model->LTRAattenuation * - (v2d * model->LTRAadmit + i2d); - here->LTRAinput2 += model->LTRAattenuation * - (v1d * model->LTRAadmit + i1d); - - } - - /* end lossless-like parts */ - break; - - case LTRA_MOD_RC: - - - /* begin convolution parts */ - - /* convolution of h1dash with v1 and v2 */ - /* the matrix has already been loaded above */ - - dummy1 = 0.0; - dummy2 = 0.0; - for (i = ckt->CKTtimeIndex; i > 0; i--) { - if (*(model->LTRAh1dashCoeffs + i) != 0.0) { - dummy1 += *(model->LTRAh1dashCoeffs - + i) * (*(here->LTRAv1 + i) - - here->LTRAinitVolt1); - dummy2 += *(model->LTRAh1dashCoeffs - + i) * (*(here->LTRAv2 + i) - - here->LTRAinitVolt2); - } - } - - /* the initial condition terms */ - - dummy1 += here->LTRAinitVolt1 * - model->LTRAintH1dash; - dummy2 += here->LTRAinitVolt2 * - model->LTRAintH1dash; - - /* - * the constant contributed by the init condition and the latest - * timepoint - */ - - dummy1 -= here->LTRAinitVolt1 * - model->LTRAh1dashFirstCoeff; - dummy2 -= here->LTRAinitVolt2 * - model->LTRAh1dashFirstCoeff; - - here->LTRAinput1 -= dummy1; - here->LTRAinput2 -= dummy2; - - /* end convolution of h1dash with v1 and v2 */ - - - /* convolution of h2 with i2 and i1 */ - - dummy1 = dummy2 = 0.0; - - for (i = ckt->CKTtimeIndex; i > 0; i--) { - if (*(model->LTRAh2Coeffs + i) != 0.0) { - dummy1 += *(model->LTRAh2Coeffs - + i) * (*(here->LTRAi2 + i) - - here->LTRAinitCur2); - dummy2 += *(model->LTRAh2Coeffs - + i) * (*(here->LTRAi1 + i) - - here->LTRAinitCur1); - } - } - - /* the initial-condition terms */ - - dummy1 += here->LTRAinitCur2 * - model->LTRAintH2; - dummy2 += here->LTRAinitCur1 * - model->LTRAintH2; - - dummy1 -= here->LTRAinitCur2 * - model->LTRAh2FirstCoeff; - dummy2 -= here->LTRAinitCur1 * - model->LTRAh2FirstCoeff; - - here->LTRAinput1 += dummy1; - here->LTRAinput2 += dummy2; - - /* end convolution of h2 with i2 and i1 */ - - /* convolution of h3dash with v2 and v1 */ - - - dummy1 = dummy2 = 0.0; - - - for (i = ckt->CKTtimeIndex; i > 0; i--) { - if (*(model->LTRAh3dashCoeffs + i) != 0.0) { - dummy1 += *(model->LTRAh3dashCoeffs - + i) * (*(here->LTRAv2 + i) - - here->LTRAinitVolt2); - dummy2 += *(model->LTRAh3dashCoeffs - + i) * (*(here->LTRAv1 + i) - - here->LTRAinitVolt1); - } - } - - /* the initial-condition terms */ - - dummy1 += here->LTRAinitVolt2 * - model->LTRAintH3dash; - dummy2 += here->LTRAinitVolt1 * - model->LTRAintH3dash; - - dummy1 -= here->LTRAinitVolt2 * - model->LTRAh3dashFirstCoeff; - dummy2 -= here->LTRAinitVolt1 * - model->LTRAh3dashFirstCoeff; - - here->LTRAinput1 += dummy1; - here->LTRAinput2 += dummy2; - - /* end convolution of h3dash with v2 and v1 */ - - break; - - default: - return (E_BADPARM); - } - } - /* load the RHS - done every time this routine is called */ - - *(ckt->CKTrhs + here->LTRAbrEq1) += here->LTRAinput1; - *(ckt->CKTrhs + here->LTRAbrEq2) += here->LTRAinput2; - - } - } - } - return (OK); -} diff --git a/src/spicelib/devices/ltra/ltramask.c b/src/spicelib/devices/ltra/ltramask.c deleted file mode 100644 index bdba008c7..000000000 --- a/src/spicelib/devices/ltra/ltramask.c +++ /dev/null @@ -1,110 +0,0 @@ -/********** -Copyright 1990 Regents of the University of California. All rights reserved. -Author: 1990 Jaijeet S. Roychowdhury -**********/ - -/* - * This routine sets model parameters for LTRA lines in the circuit. - */ - -#include "ngspice/ngspice.h" -#include "ngspice/const.h" -#include "ngspice/ifsim.h" -#include "ltradefs.h" -#include "ngspice/sperror.h" -#include "ngspice/suffix.h" - -int -LTRAmAsk(CKTcircuit *ckt, GENmodel *inModel, int param, IFvalue *value) -{ - LTRAmodel *mods = (LTRAmodel *) inModel; - - NG_IGNORE(ckt); - - switch (param) { - case LTRA_MOD_LTRA: - value->iValue = 1; - break; - case LTRA_MOD_RELTOL: - value->rValue = mods->LTRAreltol; - break; - case LTRA_MOD_ABSTOL: - value->rValue = mods->LTRAabstol; - break; - case LTRA_MOD_STLINEREL: - value->rValue = mods->LTRAstLineReltol; - break; - case LTRA_MOD_STLINEABS: - value->rValue = mods->LTRAstLineAbstol; - break; - case LTRA_MOD_CHOPREL: - value->rValue = mods->LTRAchopReltol; - break; - case LTRA_MOD_CHOPABS: - value->rValue = mods->LTRAchopAbstol; - break; - case LTRA_MOD_TRUNCNR: - value->iValue = mods->LTRAtruncNR; - break; - case LTRA_MOD_TRUNCDONTCUT: - value->iValue = mods->LTRAtruncDontCut; - break; - case LTRA_MOD_R: - value->rValue = mods->LTRAresist; - break; - case LTRA_MOD_L: - value->rValue = mods->LTRAinduct; - break; - case LTRA_MOD_G: - value->rValue = mods->LTRAconduct; - break; - case LTRA_MOD_C: - value->rValue = mods->LTRAcapac; - break; - case LTRA_MOD_LEN: - value->rValue = mods->LTRAlength; - break; - case LTRA_MOD_NL: - value->rValue = mods->LTRAnl; - break; - case LTRA_MOD_FREQ: - value->rValue = mods->LTRAf; - break; - case LTRA_MOD_FULLCONTROL: - value->iValue = mods->LTRAlteConType; - break; - case LTRA_MOD_HALFCONTROL: - value->iValue = mods->LTRAlteConType; - break; - case LTRA_MOD_NOCONTROL: - value->iValue = mods->LTRAlteConType; - break; - case LTRA_MOD_PRINT: - value->iValue = mods->LTRAprintFlag; - break; - case LTRA_MOD_NOPRINT: - mods->LTRAprintFlag = FALSE; - break; - /* - * case LTRA_MOD_RONLY: mods->LTRArOnly= TRUE; break; - */ - case LTRA_MOD_STEPLIMIT: - value->iValue = mods->LTRAstepLimit; - break; - case LTRA_MOD_NOSTEPLIMIT: - value->iValue = mods->LTRAstepLimit; - break; - case LTRA_MOD_LININTERP: - value->iValue = mods->LTRAhowToInterp; - break; - case LTRA_MOD_QUADINTERP: - value->iValue = mods->LTRAhowToInterp; - break; - case LTRA_MOD_MIXEDINTERP: - value->iValue = mods->LTRAhowToInterp; - break; - default: - return (E_BADPARM); - } - return (OK); -} diff --git a/src/spicelib/devices/ltra/ltramisc.c b/src/spicelib/devices/ltra/ltramisc.c deleted file mode 100644 index 808305e42..000000000 --- a/src/spicelib/devices/ltra/ltramisc.c +++ /dev/null @@ -1,1727 +0,0 @@ -/********** -Copyright 1990 Regents of the University of California. All rights reserved. -Author: 1990 Jaijeet S. Roychowdhury -**********/ - -#include "ngspice/ngspice.h" -#include "ltradefs.h" -#include "ngspice/suffix.h" - -/* - * Miscellaneous functions to do with lossy lines - */ - -/* - * LTRAquadInterp - quadratic interpolation function t = timepoint where - * value wanted t1, t2, t3 are three timepoints where the value is known c1, - * c2, c3 are set to the proper coefficients by the function the interpolated - * value is c1*v1 + c2*v2 + c3*v3; this should be done in the calling - * program; (v1,v2,v3 are the known values at t1,t2,t3) - */ - - -int -LTRAquadInterp(double t, double t1, double t2, double t3, double *c1, double *c2, double *c3) -{ - double f1, f2, f3; - - if (t == t1) { - *c1 = 1.0; - *c2 = 0.0; - *c3 = 0.0; - return (0); - } - if (t == t2) { - *c1 = 0.0; - *c2 = 1.0; - *c3 = 0.0; - return (0); - } - if (t == t3) { - *c1 = 0.0; - *c2 = 0.0; - *c3 = 1.0; - return (0); - } - if ((t2 - t1) == 0 || (t3 - t2) == 0 || (t1 - t3) == 0) - return (1); - - f1 = (t - t2) * (t - t3); - f2 = (t - t1) * (t - t3); - f3 = (t - t1) * (t - t2); - if ((t2 - t1) == 0) { /* should never happen, but don't want to - * divide by zero, EVER... */ - f1 = 0; - f2 = 0; - } else { - f1 /= (t1 - t2); - f2 /= (t2 - t1); - } - if ((t3 - t2) == 0) { /* should never happen, but don't want to - * divide by zero, EVER... */ - f2 = 0; - f3 = 0; - } else { - f2 /= (t2 - t3); - f3 /= (t2 - t3); - } - if ((t3 - t1) == 0) { /* should never happen, but don't want to - * divide by zero, EVER... */ - f1 = 0; - f2 = 0; - } else { - f1 /= (t1 - t3); - f3 /= (t1 - t3); - } - *c1 = f1; - *c2 = f2; - *c3 = f3; - return (0); -} - -/* linear interpolation */ - -int -LTRAlinInterp(double t, double t1, double t2, double *c1, double *c2) -{ - double temp; - - if (t1 == t2) - return (1); - - if (t == t1) { - *c1 = 1.0; - *c2 = 0.0; - return (0); - } - if (t == t2) { - *c1 = 0.0; - *c2 = 1.0; - return (0); - } - temp = (t - t1) / (t2 - t1); - *c2 = temp; - *c1 = 1 - temp; - return (0); -} - -/* - * intlinfunc returns \int_lolimit^hilimit h(\tau) d \tau, where h(\tau) is - * assumed to be linear, with values lovalue and hivalue \tau = t1 and t2 - * respectively this is used only locally - */ - -static double -intlinfunc(double lolimit, double hilimit, double lovalue, double hivalue, double t1, double t2) -{ - double width, m; - - - width = t2 - t1; - if (width == 0.0) - return (0.0); - m = (hivalue - lovalue) / width; - - return ((hilimit - lolimit) * lovalue + 0.5 * m * ((hilimit - t1) * (hilimit - t1) - - (lolimit - t1) * (lolimit - t1))); -} - - -/* - * twiceintlinfunc returns \int_lolimit^hilimit \int_otherlolimit^\tau - * h(\tau') d \tau' d \tau , where h(\tau') is assumed to be linear, with - * values lovalue and hivalue \tau = t1 and t2 respectively this is used only - * locally - */ - -static double -twiceintlinfunc(double lolimit, double hilimit, double otherlolimit, double lovalue, double hivalue, double t1, double t2) -{ - double width, m, dummy; - double temp1, temp2, temp3; - - - width = t2 - t1; - if (width == 0.0) - return (0.0); - m = (hivalue - lovalue) / width; - - temp1 = hilimit - t1; - temp2 = lolimit - t1; - temp3 = otherlolimit - t1; - dummy = lovalue * ((hilimit - otherlolimit) * (hilimit - otherlolimit) - - (lolimit - otherlolimit) * (lolimit - otherlolimit)); - dummy += m * ((temp1 * temp1 * temp1 - temp2 * temp2 * temp2) / 3.0 - - temp3 * temp3 * (hilimit - lolimit)); - return (dummy * 0.5); -} - -/* - * thriceintlinfunc returns \int_lolimit^hilimit \int_secondlolimit^\tau - * \int_thirdlolimit^\tau' h(\tau'') d \tau'' d \tau' d \tau , where - * h(\tau'') is assumed to be linear, with values lovalue and hivalue \tau = - * t1 and t2 respectively this is used only locally - */ - -static double -thriceintlinfunc(double lolimit, double hilimit, double secondlolimit, double thirdlolimit, double lovalue, double hivalue, double t1, double t2) -{ - double width, m, dummy; - double temp1, temp2, temp3, temp4; - double temp5, temp6, temp7, temp8, temp9, temp10; - - - width = t2 - t1; - if (width == 0.0) - return (0.0); - m = (hivalue - lovalue) / width; - - temp1 = hilimit - t1; - temp2 = lolimit - t1; - temp3 = secondlolimit - t1; - temp4 = thirdlolimit - t1; - temp5 = hilimit - thirdlolimit; - temp6 = lolimit - thirdlolimit; - temp7 = secondlolimit - thirdlolimit; - temp8 = hilimit - lolimit; - temp9 = hilimit - secondlolimit; - temp10 = lolimit - secondlolimit; - dummy = lovalue * ((temp5 * temp5 * temp5 - temp6 * temp6 * temp6) / 3 - - temp7 * temp5 * temp8); - dummy += m * (((temp1 * temp1 * temp1 * temp1 - temp2 * temp2 * temp2 * temp2) * 0.25 - - temp3 * temp3 * temp3 * temp8) / 3 - temp4 * temp4 * 0.5 * (temp9 * temp9 - - temp10 * temp10)); - return (dummy * 0.5); -} - - -/* - * These are from the book Numerical Recipes in C - * - */ - -static double -bessI0(double x) -{ - double ax, ans; - double y; - - if ((ax = fabs(x)) < 3.75) { - y = x / 3.75; - y *= y; - ans = 1.0 + y * (3.5156229 + y * (3.0899424 + y * (1.2067492 - + y * (0.2659732 + y * (0.360768e-1 + y * 0.45813e-2))))); - } else { - y = 3.75 / ax; - ans = (exp(ax) / sqrt(ax)) * (0.39894228 + y * (0.1328592e-1 - + y * (0.225319e-2 + y * (-0.157565e-2 + y * (0.916281e-2 - + y * (-0.2057706e-1 + y * (0.2635537e-1 + y * (-0.1647633e-1 - + y * 0.392377e-2)))))))); - } - return (ans); -} - -static double -bessI1(double x) -{ - double ax, ans; - double y; - - if ((ax = fabs(x)) < 3.75) { - y = x / 3.75; - y *= y; - ans = ax * (0.5 + y * (0.87890594 + y * (0.51498869 + y * (0.15084934 - + y * (0.2658733e-1 + y * (0.301532e-2 + y * 0.32411e-3)))))); - } else { - y = 3.75 / ax; - ans = 0.2282967e-1 + y * (-0.2895312e-1 + y * (0.1787654e-1 - - y * 0.420059e-2)); - ans = 0.39894228 + y * (-0.3988024e-1 + y * (-0.362018e-2 - + y * (0.163801e-2 + y * (-0.1031555e-1 + y * ans)))); - ans *= (exp(ax) / sqrt(ax)); - } - return (x < 0.0 ? -ans : ans); -} - -static double -bessI1xOverX(double x) -{ - double ax, ans; - double y; - - if ((ax = fabs(x)) < 3.75) { - y = x / 3.75; - y *= y; - ans = 0.5 + y * (0.87890594 + y * (0.51498869 + y * (0.15084934 - + y * (0.2658733e-1 + y * (0.301532e-2 + y * 0.32411e-3))))); - } else { - y = 3.75 / ax; - ans = 0.2282967e-1 + y * (-0.2895312e-1 + y * (0.1787654e-1 - - y * 0.420059e-2)); - ans = 0.39894228 + y * (-0.3988024e-1 + y * (-0.362018e-2 - + y * (0.163801e-2 + y * (-0.1031555e-1 + y * ans)))); - ans *= (exp(ax) / (ax * sqrt(ax))); - } - return (ans); -} - -/* LTRArlcH1dashFunc - the first impulse response function */ - -double -LTRArlcH1dashFunc(double time, double T, double alpha, double beta) -{ - double besselarg, exparg, returnval; - /* T is not used in this function */ - NG_IGNORE(T); - - /* - * result = alpha * e^{- beta*time} * {I_1(alpha*time) - I_0(alpha*time)} - */ - - if (alpha == 0.0) - return (0.0); - - exparg = -beta * time; - besselarg = alpha * time; - - returnval = (bessI1(besselarg) - bessI0(besselarg)) * alpha * exp(exparg); - return (returnval); -} - -double -LTRArlcH2Func(double time, double T, double alpha, double beta) -{ - double besselarg, exparg, returnval; - - /* - * result = 0, time < T = (alpha*T*e^{-beta*time})/sqrt(t^2 - T^2) * - * I_1(alpha*sqrt(t^2 - T^2)), time >= T - */ - - if (alpha == 0.0) - return (0.0); - if (time < T) - return (0.0); - - if (time != T) { - besselarg = alpha * sqrt(time * time - T * T); - } else { - besselarg = 0.0; - } - exparg = -beta * time; - - returnval = alpha * alpha * T * exp(exparg) * bessI1xOverX(besselarg); - return (returnval); -} - -double -LTRArlcH3dashFunc(double time, double T, double alpha, double beta) -{ - double exparg, besselarg, returnval; - - /* - * result = 0, time < T = alpha*e^{-beta*time}*(t/sqrt(t^2-T^2)* - * I_1(alpha*sqrt(t^2-T^2)) - I_0(alpha*sqrt(t^2-T^2))) - */ - - if (alpha == 0.0) - return (0.0); - if (time < T) - return (0.0); - - exparg = -beta * time; - if (time != T) { - besselarg = alpha * sqrt(time * time - T * T); - } else { - besselarg = 0.0; - } - - returnval = alpha * time * bessI1xOverX(besselarg) - bessI0(besselarg); - returnval *= alpha * exp(exparg); - return (returnval); -} - -/* - * LTRArlcH1dashTwiceIntFunc - twice repeated integral of h1dash for the - * special case of G = 0 - */ - -double -LTRArlcH1dashTwiceIntFunc(double time, double beta) -{ - double arg, returnval; - - /* - * result = time * e^{- beta*time} * {I_0(beta*time) + I_1(beta*time)} - - * time - */ - - if (beta == 0.0) - return (time); - arg = beta * time; - if (arg == 0.0) - return (0.0); - - returnval = (bessI1(arg) + bessI0(arg)) * time * exp(-arg) - time; - return (returnval); -} - -/* - * LTRArlcH3dashIntFunc - twice repeated integral of h1dash for the special - * case of G = 0 - */ - -double -LTRArlcH3dashIntFunc(double time, double T, double beta) -{ - double exparg, besselarg; - double returnval; - - if (time <= T) - return (0.0); - if (beta == 0.0) - return (0.0); - exparg = -beta * time; - besselarg = beta * sqrt(time * time - T * T); - returnval = exp(exparg) * bessI0(besselarg) - exp(-beta * T); - return (returnval); -} - - -double -LTRArcH1dashTwiceIntFunc(double time, double cbyr) -{ - - return (sqrt(4 * cbyr * time / M_PI)); -} - - - - -double -LTRArcH2TwiceIntFunc(double time, double rclsqr) -{ - double temp; - - if (time != 0.0) { - temp = rclsqr / (4 * time); - return ((time + rclsqr * 0.5) * erfc(sqrt(temp)) - sqrt(time * rclsqr / M_PI) * exp(-temp)); - } else { - return (0.0); - } -} - - - -double -LTRArcH3dashTwiceIntFunc(double time, double cbyr, double rclsqr) -{ - double temp; - - if (time != 0.0) { - temp = rclsqr / (4 * time); - temp = 2 * sqrt(time / M_PI) * exp(-temp) - sqrt(rclsqr) * erfc(sqrt(temp)); - return (sqrt(cbyr) * temp); - } else { - return (0.0); - } -} - - -/* - * LTRArcCoeffsSetup sets up the all coefficient lists for the special case - * where L=G=0 - */ - -void -LTRArcCoeffsSetup(double *h1dashfirstcoeff, double *h2firstcoeff, double *h3dashfirstcoeff, double *h1dashcoeffs, - double *h2coeffs, double *h3dashcoeffs, int listsize, double cbyr, - double rclsqr, double curtime, double *timelist, int timeindex, double reltol) -{ - double delta1, delta2; - double h1dummy1, h1dummy2; - double h2dummy1, h2dummy2; - double h3dummy1, h3dummy2; - double lolimit1, lolimit2, hilimit1, hilimit2; - double h1lovalue1, h1lovalue2, h1hivalue1, h1hivalue2; - double h2lovalue1, h2lovalue2, h2hivalue1, h2hivalue2; - double h3lovalue1, h3lovalue2, h3hivalue1, h3hivalue2; - double temp, temp2, temp3, temp4, temp5; - double h1relval, h2relval, h3relval; - int doh1 = 1, doh2 = 1, doh3 = 1; - int i, auxindex; - - NG_IGNORE(listsize); - - /* coefflists should already have been allocated to the necessary size */ - -#ifdef LTRAdebug - if (listsize <= timeindex) { - printf("LTRAcoeffSetup: not enough space in coefflist\n"); - } -#endif - - - - auxindex = timeindex; - - /* the first coefficients */ - - delta1 = curtime - *(timelist + auxindex); - lolimit1 = 0.0; - hilimit1 = delta1; - - h1lovalue1 = 0.0; - h1hivalue1 = /* LTRArcH1dashTwiceIntFunc(hilimit1,cbyr); */ - sqrt(4 * cbyr * hilimit1 / M_PI); - h1dummy1 = h1hivalue1 / delta1; - *h1dashfirstcoeff = h1dummy1; - h1relval = fabs(h1dummy1 * reltol); - - temp = rclsqr / (4 * hilimit1); - temp2 = (temp >= 100.0 ? 0.0 : erfc(sqrt(temp))); - temp3 = exp(-temp); - temp4 = sqrt(rclsqr); - temp5 = sqrt(cbyr); - - h2lovalue1 = 0.0; - h2hivalue1 = /* LTRArcH2TwiceIntFunc(hilimit1,rclsqr); */ - (hilimit1 != 0.0 ? (hilimit1 + rclsqr * 0.5) * temp2 - sqrt(hilimit1 * rclsqr / M_PI) * temp3 : 0.0); - - - h2dummy1 = h2hivalue1 / delta1; - *h2firstcoeff = h2dummy1; - h2relval = fabs(h2dummy1 * reltol); - - h3lovalue1 = 0.0; - h3hivalue1 = /* LTRArcH3dashTwiceIntFunc(hilimit1,cbyr,rcls - * qr); */ - (hilimit1 != 0.0 ? temp = 2 * sqrt(hilimit1 / M_PI) * temp3 - temp4 * temp2, (temp5 * temp) : 0.0); - - - h3dummy1 = h3hivalue1 / delta1; - *h3dashfirstcoeff = h3dummy1; - h3relval = fabs(h3dummy1 * reltol); - - /* the coefficients for the rest of the timepoints */ - - for (i = auxindex; i > 0; i--) { - - delta2 = delta1; /* previous delta1 */ - lolimit2 = lolimit1; /* previous lolimit1 */ - hilimit2 = hilimit1; /* previous hilimit1 */ - - delta1 = *(timelist + i) - *(timelist + i - 1); - lolimit1 = hilimit2; - hilimit1 = curtime - *(timelist + i - 1); - - if (doh1) { - h1lovalue2 = h1lovalue1; /* previous lovalue1 */ - h1hivalue2 = h1hivalue1; /* previous hivalue1 */ - h1dummy2 = h1dummy1; /* previous dummy1 */ - - h1lovalue1 = h1hivalue2; - h1hivalue1 = /* LTRArcH1dashTwiceIntFunc(hilimit1,cbyr); */ - sqrt(4 * cbyr * hilimit1 / M_PI); - h1dummy1 = (h1hivalue1 - h1lovalue1) / delta1; - *(h1dashcoeffs + i) = h1dummy1 - h1dummy2; - if (fabs(*(h1dashcoeffs + i)) < h1relval) - doh1 = 0; - } else - *(h1dashcoeffs + i) = 0.0; - - if (doh2 || doh3) { - temp = rclsqr / (4 * hilimit1); - temp2 = (temp >= 100.0 ? 0.0 : erfc(sqrt(temp))); - temp3 = exp(-temp); - } - if (doh2) { - h2lovalue2 = h2lovalue1; /* previous lovalue1 */ - h2hivalue2 = h2hivalue1; /* previous hivalue1 */ - h2dummy2 = h2dummy1; /* previous dummy1 */ - - h2lovalue1 = h2hivalue2; - h2hivalue1 = /* LTRArcH2TwiceIntFunc(hilimit1,rclsqr); */ - (hilimit1 != 0.0 ? (hilimit1 + rclsqr * 0.5) * temp2 - sqrt(hilimit1 * rclsqr / M_PI) * temp3 : 0.0); - h2dummy1 = (h2hivalue1 - h2lovalue1) / delta1; - *(h2coeffs + i) = h2dummy1 - h2dummy2; - if (fabs(*(h2coeffs + i)) < h2relval) - doh2 = 0; - } else - *(h2coeffs + i) = 0.0; - - if (doh3) { - h3lovalue2 = h3lovalue1; /* previous lovalue1 */ - h3hivalue2 = h3hivalue1; /* previous hivalue1 */ - h3dummy2 = h3dummy1; /* previous dummy1 */ - - h3lovalue1 = h3hivalue2; - h3hivalue1 = /* LTRArcH3dashTwiceIntFunc(hilimit1,cbyr,rcls - * qr); */ - (hilimit1 != 0.0 ? temp = 2 * sqrt(hilimit1 / M_PI) * temp3 - temp4 * temp2, (temp5 * temp) : 0.0); - h3dummy1 = (h3hivalue1 - h3lovalue1) / delta1; - *(h3dashcoeffs + i) = h3dummy1 - h3dummy2; - if (fabs(*(h3dashcoeffs + i)) < h3relval) - doh3 = 0; - } else - *(h3dashcoeffs + i) = 0.0; - } -} - -void -LTRArlcCoeffsSetup(double *h1dashfirstcoeff, double *h2firstcoeff, double *h3dashfirstcoeff, double *h1dashcoeffs, double *h2coeffs, - double *h3dashcoeffs, int listsize, double T, double alpha, double beta, double curtime, double *timelist, int timeindex, double reltol, int *auxindexptr) - -{ - unsigned exact; - double lolimit1, lolimit2 = 0.0, hilimit1, hilimit2 = 0.0; - double delta1, delta2; - - double h1dummy1, h1dummy2; - double h1lovalue1, h1lovalue2, h1hivalue1, h1hivalue2; - - double h2dummy1 = 0.0, h2dummy2; - double h2lovalue1 = 0.0, h2lovalue2, h2hivalue1 = 0.0, h2hivalue2; - - double h3dummy1 = 0.0, h3dummy2; - double h3lovalue1 = 0.0, h3lovalue2, h3hivalue1 = 0.0, h3hivalue2; - - double exparg, besselarg = 0.0, expterm, bessi1overxterm, bessi0term; - double expbetaTterm = 0.0, alphasqTterm = 0.0; - double h1relval, h2relval = 0.0, h3relval = 0.0; - int doh1 = 1, doh2 = 1, doh3 = 1; - - int i, auxindex; - - NG_IGNORE(listsize); - - /* coefflists should already have been allocated to the necessary size */ - -#ifdef LTRAdebug - if (listsize <= timeindex) { - printf("LTRArlcCoeffsSetup: not enough space in coefflist\n"); - } -#endif - - - /* - * we assume a piecewise linear function, and we calculate the coefficients - * using this assumption in the integration of the function - */ - - if (T == 0.0) { - auxindex = timeindex; - } else { - - if (curtime - T <= 0.0) { - auxindex = 0; - } else { - exact = 0; - for (i = timeindex; i >= 0; i--) { - if (curtime - *(timelist + i) == T) { - exact = 1; - break; - } - if (curtime - *(timelist + i) > T) - break; - } - -#ifdef LTRADEBUG - if ((i < 0) || ((i == 0) && (exact == 1))) - printf("LTRAcoeffSetup: i <= 0: some mistake!\n"); -#endif - - if (exact == 1) { - auxindex = i - 1; - } else { - auxindex = i; - } - } - } - /* the first coefficient */ - - if (auxindex != 0) { - lolimit1 = T; - hilimit1 = curtime - *(timelist + auxindex); - delta1 = hilimit1 - lolimit1; - - h2lovalue1 = LTRArlcH2Func(T, T, alpha, beta); - besselarg = (hilimit1 > T) ? alpha * sqrt(hilimit1 * hilimit1 - T * T) : 0.0; - exparg = -beta * hilimit1; - expterm = exp(exparg); - bessi1overxterm = bessI1xOverX(besselarg); - alphasqTterm = alpha * alpha * T; - h2hivalue1 = /* LTRArlcH2Func(hilimit1,T,alpha,beta); */ - ((alpha == 0.0) || (hilimit1 < T)) ? 0.0 : alphasqTterm * expterm * bessi1overxterm; - - h2dummy1 = twiceintlinfunc(lolimit1, hilimit1, lolimit1, h2lovalue1, - h2hivalue1, lolimit1, hilimit1) / delta1; - *h2firstcoeff = h2dummy1; - h2relval = fabs(reltol * h2dummy1); - - h3lovalue1 = 0.0; /* E3dash should be consistent with this */ - bessi0term = bessI0(besselarg); - expbetaTterm = exp(-beta * T); - h3hivalue1 = /* LTRArlcH3dashIntFunc(hilimit1,T,beta); */ - ((hilimit1 <= T) || (beta == 0.0)) ? 0.0 : expterm * bessi0term - expbetaTterm; - h3dummy1 = intlinfunc(lolimit1, hilimit1, h3lovalue1, - h3hivalue1, lolimit1, hilimit1) / delta1; - *h3dashfirstcoeff = h3dummy1; - h3relval = fabs(h3dummy1 * reltol); - } else { - *h2firstcoeff = *h3dashfirstcoeff = 0.0; - } - - lolimit1 = 0.0; - hilimit1 = curtime - *(timelist + timeindex); - delta1 = hilimit1 - lolimit1; - exparg = -beta * hilimit1; - expterm = exp(exparg); - - h1lovalue1 = 0.0; - h1hivalue1 = /* LTRArlcH1dashTwiceIntFunc(hilimit1,beta); */ - (beta == 0.0) ? hilimit1 : ((hilimit1 == 0.0) ? 0.0 : (bessI1(-exparg) + bessI0(-exparg)) * hilimit1 * expterm - hilimit1); - h1dummy1 = h1hivalue1 / delta1; - *h1dashfirstcoeff = h1dummy1; - h1relval = fabs(h1dummy1 * reltol); - - - /* the coefficients for the rest of the timepoints */ - - for (i = timeindex; i > 0; i--) { - - if (doh1 || doh2 || doh3) { - lolimit2 = lolimit1; /* previous lolimit1 */ - hilimit2 = hilimit1; /* previous hilimit1 */ - delta2 = delta1; /* previous delta1 */ - - lolimit1 = hilimit2; - hilimit1 = curtime - *(timelist + i - 1); - delta1 = *(timelist + i) - *(timelist + i - 1); - - exparg = -beta * hilimit1; - expterm = exp(exparg); - } - if (doh1) { - h1lovalue2 = h1lovalue1; /* previous lovalue1 */ - h1hivalue2 = h1hivalue1; /* previous hivalue1 */ - h1dummy2 = h1dummy1; /* previous dummy1 */ - - h1lovalue1 = h1hivalue2; - h1hivalue1 = /* LTRArlcH1dashTwiceIntFunc(hilimit1,beta); */ - (beta == 0.0) ? hilimit1 : ((hilimit1 == 0.0) ? 0.0 : (bessI1(-exparg) + bessI0(-exparg)) * hilimit1 * expterm - hilimit1); - h1dummy1 = (h1hivalue1 - h1lovalue1) / delta1; - - *(h1dashcoeffs + i) = h1dummy1 - h1dummy2; - if (fabs(*(h1dashcoeffs + i)) <= h1relval) - doh1 = 0; - } else - *(h1dashcoeffs + i) = 0.0; - - if (i <= auxindex) { - - /* - * if (i == auxindex) { lolimit2 = T; delta2 = hilimit2 - lolimit2; } - */ - - if (doh2 || doh3) - besselarg = (hilimit1 > T) ? alpha * sqrt(hilimit1 * hilimit1 - T * T) : 0.0; - - if (doh2) { - h2lovalue2 = h2lovalue1;/* previous lovalue1 */ - h2hivalue2 = h2hivalue1;/* previous hivalue1 */ - h2dummy2 = h2dummy1; /* previous dummy1 */ - - h2lovalue1 = h2hivalue2; - bessi1overxterm = bessI1xOverX(besselarg); - h2hivalue1 = /* LTRArlcH2Func(hilimit1,T,alpha,beta); */ - ((alpha == 0.0) || (hilimit1 < T)) ? 0.0 : alphasqTterm * expterm * bessi1overxterm; - h2dummy1 = twiceintlinfunc(lolimit1, hilimit1, lolimit1, - h2lovalue1, h2hivalue1, lolimit1, hilimit1) / delta1; - - *(h2coeffs + i) = h2dummy1 - h2dummy2 + intlinfunc(lolimit2, hilimit2, - h2lovalue2, h2hivalue2, lolimit2, hilimit2); - if (fabs(*(h2coeffs + i)) <= h2relval) - doh2 = 0; - } else - *(h2coeffs + i) = 0.0; - - if (doh3) { - h3lovalue2 = h3lovalue1;/* previous lovalue1 */ - h3hivalue2 = h3hivalue1;/* previous hivalue1 */ - h3dummy2 = h3dummy1; /* previous dummy1 */ - - h3lovalue1 = h3hivalue2; - bessi0term = bessI0(besselarg); - h3hivalue1 = /* LTRArlcH3dashIntFunc(hilimit1,T,beta); */ - ((hilimit1 <= T) || (beta == 0.0)) ? 0.0 : expterm * bessi0term - expbetaTterm; - h3dummy1 = intlinfunc(lolimit1, hilimit1, h3lovalue1, h3hivalue1, lolimit1, hilimit1) / delta1; - - *(h3dashcoeffs + i) = h3dummy1 - h3dummy2; - if (fabs(*(h3dashcoeffs + i)) <= h3relval) - doh3 = 0; - } else - *(h3dashcoeffs + i) = 0.0; - } - } - *auxindexptr = auxindex; -} - -/* - * LTRAstraightLineCheck - takes the co-ordinates of three points, finds the - * area of the triangle enclosed by these points and compares this area with - * the area of the quadrilateral formed by the line between the first point - * and the third point, the perpendiculars from the first and third points to - * the x-axis, and the x-axis. If within reltol, then it returns 1, else 0. - * The purpose of this function is to determine if three points lie - * acceptably close to a straight line. This area criterion is used because - * it is related to integrals and convolution - */ - -int -LTRAstraightLineCheck(double x1, double y1, double x2, double y2, double x3, double y3, double reltol, double abstol) -{ - /* - * double asqr, bsqr, csqr, c, c1sqr; double htsqr; - */ - double TRarea, QUADarea1, QUADarea2, QUADarea3, area; - - /* - * asqr = (x2-x1)*(x2-x1) + (y2-y1)*(y2-y1); bsqr = (x3-x2)*(x3-x2) + - * (y3-y2)*(y3-y2); csqr = (x3-x1)*(x3-x1) + (y3-y1)*(y3-y1); c = - * sqrt(csqr); c1sqr = (asqr - bsqr + csqr)/(2*c); c1sqr *= c1sqr; htsqr = - * asqr - c1sqr; TRarea = c*sqrt(htsqr)*0.5; - */ - /* - * this should work if y1,y2,y3 all have the same sign and x1,x2,x3 are in - * increasing order - */ - - QUADarea1 = (fabs(y2) + fabs(y1)) * 0.5 * fabs(x2 - x1); - QUADarea2 = (fabs(y3) + fabs(y2)) * 0.5 * fabs(x3 - x2); - QUADarea3 = (fabs(y3) + fabs(y1)) * 0.5 * fabs(x3 - x1); - TRarea = fabs(QUADarea3 - QUADarea1 - QUADarea2); - area = QUADarea1 + QUADarea2; - if (area * reltol + abstol > TRarea) - return (1); - else - return (0); -} - - -/* - * i is thestrchr of the latest value, a,b,c values correspond to values at - * t_{i-2}, t{i-1} and t_i - */ - -#define SECONDDERIV(i,a,b,c) (oof = (i==ckt->CKTtimeIndex+1?curtime:\ -*(ckt->CKTtimePoints+i)),\ -(( c - b )/(oof-*(ckt->CKTtimePoints+i-1)) -\ -( b - a )/(*(ckt->CKTtimePoints+i-1)-\ -*(ckt->CKTtimePoints+i-2)))/(oof - \ -*(ckt->CKTtimePoints+i-2))) - -/* - * LTRAlteCalculate - returns sum of the absolute values of the total local - * truncation error of the 2 equations for the LTRAline - */ - - -double -LTRAlteCalculate(CKTcircuit *ckt, GENmodel *genmodel, GENinstance *geninstance, double curtime) -{ - LTRAmodel *model = (LTRAmodel *) genmodel; - LTRAinstance *instance = (LTRAinstance *) geninstance; - double h1dashTfirstCoeff; - double h2TfirstCoeff = 0.0; - double h3dashTfirstCoeff = 0.0; - double dashdash; - double oof; - double hilimit1, lolimit1, hivalue1, lovalue1, f1i, g1i; - double eq1LTE = 0.0, eq2LTE = 0.0; - int auxindex = 0, tdover, i, exact; - - switch (model->LTRAspecialCase) { - - case LTRA_MOD_LC: - case LTRA_MOD_RG: - return (0.0); - break; - - case LTRA_MOD_RLC: - - if (curtime > model->LTRAtd) { - tdover = 1; - - exact = 0; - for (i = ckt->CKTtimeIndex; i >= 0; i--) { - if (curtime - *(ckt->CKTtimePoints + i) - == model->LTRAtd) { - exact = 1; - break; - } - if (curtime - *(ckt->CKTtimePoints + i) - > model->LTRAtd) - break; - } - -#ifdef LTRADEBUG - if ((i < 0) || ((i == 0) && (exact == 1))) - printf("LTRAlteCalculate: i <= 0: some mistake!\n"); -#endif - - if (exact == 1) { - auxindex = i - 1; - } else { - auxindex = i; - } - - } else { - tdover = 0; - } - - hilimit1 = curtime - *(ckt->CKTtimePoints + ckt->CKTtimeIndex); - lolimit1 = 0.0; - hivalue1 = LTRArlcH1dashTwiceIntFunc(hilimit1, model->LTRAbeta); - lovalue1 = 0.0; - - f1i = hivalue1; - g1i = intlinfunc(lolimit1, hilimit1, lovalue1, hivalue1, - lolimit1, hilimit1); - h1dashTfirstCoeff = 0.5 * f1i * - (curtime - *(ckt->CKTtimePoints + ckt->CKTtimeIndex)) - g1i; - - if (tdover) { - hilimit1 = curtime - *(ckt->CKTtimePoints + auxindex); - lolimit1 = *(ckt->CKTtimePoints + ckt->CKTtimeIndex) - *(ckt->CKTtimePoints + auxindex); - lolimit1 = MAX(model->LTRAtd, lolimit1); - - /* - * are the following really doing the operations in the write-up? - */ - hivalue1 = LTRArlcH2Func(hilimit1, model->LTRAtd, model->LTRAalpha, model->LTRAbeta); - lovalue1 = LTRArlcH2Func(lolimit1, model->LTRAtd, model->LTRAalpha, model->LTRAbeta); - f1i = twiceintlinfunc(lolimit1, hilimit1, lolimit1, lovalue1, hivalue1, lolimit1, - hilimit1); - g1i = thriceintlinfunc(lolimit1, hilimit1, lolimit1, lolimit1, lovalue1, - hivalue1, lolimit1, hilimit1); - h2TfirstCoeff = 0.5 * f1i * (curtime - model->LTRAtd - *(ckt->CKTtimePoints + auxindex)) - g1i; - - hivalue1 = LTRArlcH3dashIntFunc(hilimit1, model->LTRAtd, model->LTRAbeta); - lovalue1 = LTRArlcH3dashIntFunc(lolimit1, model->LTRAtd, model->LTRAbeta); - f1i = intlinfunc(lolimit1, hilimit1, lovalue1, hivalue1, lolimit1, - hilimit1); - g1i = twiceintlinfunc(lolimit1, hilimit1, lolimit1, lovalue1, - hivalue1, lolimit1, hilimit1); - h3dashTfirstCoeff = 0.5 * f1i * (curtime - model->LTRAtd - *(ckt->CKTtimePoints + auxindex)) - g1i; - } - /* LTEs for convolution with v1 */ - /* get divided differences for v1 (2nd derivative estimates) */ - - /* - * no need to subtract operating point values because taking differences - * anyway - */ - - dashdash = SECONDDERIV(ckt->CKTtimeIndex + 1, - *(instance->LTRAv1 + ckt->CKTtimeIndex - 1), - *(instance->LTRAv1 + ckt->CKTtimeIndex), - *(ckt->CKTrhsOld + instance->LTRAposNode1) - - *(ckt->CKTrhsOld + instance->LTRAnegNode1)); - eq1LTE += model->LTRAadmit * fabs(dashdash * - h1dashTfirstCoeff); - - - /* - * not bothering to interpolate since everything is approximate anyway - */ - - if (tdover) { - - dashdash = SECONDDERIV(auxindex + 1, - *(instance->LTRAv1 + auxindex - 1), - *(instance->LTRAv1 + auxindex), - *(instance->LTRAv1 + auxindex + 1)); - - eq2LTE += model->LTRAadmit * fabs(dashdash * - h3dashTfirstCoeff); - - } - /* end LTEs for convolution with v1 */ - - /* LTEs for convolution with v2 */ - /* get divided differences for v2 (2nd derivative estimates) */ - - dashdash = SECONDDERIV(ckt->CKTtimeIndex + 1, - *(instance->LTRAv2 + ckt->CKTtimeIndex - 1), - *(instance->LTRAv2 + ckt->CKTtimeIndex), - *(ckt->CKTrhsOld + instance->LTRAposNode2) - - *(ckt->CKTrhsOld + instance->LTRAnegNode2)); - - eq2LTE += model->LTRAadmit * fabs(dashdash * - h1dashTfirstCoeff); - - - if (tdover) { - - - dashdash = SECONDDERIV(auxindex + 1, - *(instance->LTRAv2 + auxindex - 1), - *(instance->LTRAv2 + auxindex), - *(instance->LTRAv2 + auxindex + 1)); - - eq1LTE += model->LTRAadmit * fabs(dashdash * - h3dashTfirstCoeff); - - } - /* end LTEs for convolution with v2 */ - - /* LTE for convolution with i1 */ - /* get divided differences for i1 (2nd derivative estimates) */ - - if (tdover) { - - - dashdash = SECONDDERIV(auxindex + 1, - *(instance->LTRAi1 + auxindex - 1), - *(instance->LTRAi1 + auxindex), - *(instance->LTRAi1 + auxindex + 1)); - - eq2LTE += fabs(dashdash * h2TfirstCoeff); - - - } - /* end LTE for convolution with i1 */ - - /* LTE for convolution with i2 */ - /* get divided differences for i2 (2nd derivative estimates) */ - - if (tdover) { - - dashdash = SECONDDERIV(auxindex + 1, - *(instance->LTRAi2 + auxindex - 1), - *(instance->LTRAi2 + auxindex), - *(instance->LTRAi2 + auxindex + 1)); - - eq1LTE += fabs(dashdash * h2TfirstCoeff); - - } - /* end LTE for convolution with i1 */ - - break; - - case LTRA_MOD_RC: - - hilimit1 = curtime - *(ckt->CKTtimePoints + ckt->CKTtimeIndex); - lolimit1 = 0.0; - - hivalue1 = LTRArcH1dashTwiceIntFunc(hilimit1, model->LTRAcByR); - lovalue1 = 0.0; - - f1i = hivalue1; - g1i = intlinfunc(lolimit1, hilimit1, lovalue1, hivalue1, lolimit1, hilimit1); - h1dashTfirstCoeff = 0.5 * f1i * (curtime - *(ckt->CKTtimePoints + ckt->CKTtimeIndex)) - g1i; - - - - - hivalue1 = LTRArcH2TwiceIntFunc(hilimit1, model->LTRArclsqr); - lovalue1 = 0.0; - - f1i = hivalue1; - g1i = intlinfunc(lolimit1, hilimit1, lovalue1, hivalue1, lolimit1, hilimit1); - h1dashTfirstCoeff = 0.5 * f1i * (curtime - *(ckt->CKTtimePoints + ckt->CKTtimeIndex)) - g1i; - - - - - - hivalue1 = LTRArcH2TwiceIntFunc(hilimit1, model->LTRArclsqr); - lovalue1 = 0.0; - - f1i = hivalue1; - g1i = intlinfunc(lolimit1, hilimit1, lovalue1, - hivalue1, lolimit1, hilimit1); - h1dashTfirstCoeff = 0.5 * f1i * (curtime - - *(ckt->CKTtimePoints + ckt->CKTtimeIndex)) - g1i; - - - - /* LTEs for convolution with v1 */ - /* get divided differences for v1 (2nd derivative estimates) */ - - /* - * no need to subtract operating point values because taking differences - * anyway - */ - - dashdash = SECONDDERIV(ckt->CKTtimeIndex + 1, - *(instance->LTRAv1 + ckt->CKTtimeIndex - 1), - *(instance->LTRAv1 + ckt->CKTtimeIndex), - *(ckt->CKTrhsOld + instance->LTRAposNode1) - - *(ckt->CKTrhsOld + instance->LTRAnegNode1)); - eq1LTE += fabs(dashdash * h1dashTfirstCoeff); - eq2LTE += fabs(dashdash * h3dashTfirstCoeff); - - /* end LTEs for convolution with v1 */ - - /* LTEs for convolution with v2 */ - /* get divided differences for v2 (2nd derivative estimates) */ - - dashdash = SECONDDERIV(ckt->CKTtimeIndex + 1, - *(instance->LTRAv2 + ckt->CKTtimeIndex - 1), - *(instance->LTRAv2 + ckt->CKTtimeIndex), - *(ckt->CKTrhsOld + instance->LTRAposNode2) - - *(ckt->CKTrhsOld + instance->LTRAnegNode2)); - - eq2LTE += fabs(dashdash * h1dashTfirstCoeff); - eq1LTE += fabs(dashdash * h3dashTfirstCoeff); - - /* end LTEs for convolution with v2 */ - - /* LTE for convolution with i1 */ - /* get divided differences for i1 (2nd derivative estimates) */ - - dashdash = SECONDDERIV(ckt->CKTtimeIndex + 1, - *(instance->LTRAi1 + ckt->CKTtimeIndex - 1), - *(instance->LTRAi1 + ckt->CKTtimeIndex), - *(ckt->CKTrhsOld + instance->LTRAbrEq1)); - - eq2LTE += fabs(dashdash * h2TfirstCoeff); - - - /* end LTE for convolution with i1 */ - - /* LTE for convolution with i2 */ - /* get divided differences for i2 (2nd derivative estimates) */ - - dashdash = SECONDDERIV(ckt->CKTtimeIndex + 1, - *(instance->LTRAi2 + ckt->CKTtimeIndex - 1), - *(instance->LTRAi2 + ckt->CKTtimeIndex), - *(ckt->CKTrhsOld + instance->LTRAbrEq2)); - - - eq1LTE += fabs(dashdash * h2TfirstCoeff); - - - /* end LTE for convolution with i1 */ - - break; - - default: - return (1 /* error */ ); - } - - -#ifdef LTRADEBUG - fprintf(stdout, "%s: LTE/input for Eq1 at time %g is: %g\n", - instance->LTRAname, curtime, eq1LTE / instance->LTRAinput1); - fprintf(stdout, "%s: LTE/input for Eq2 at time %g is: %g\n", - instance->LTRAname, curtime, eq2LTE / instance->LTRAinput1); - fprintf(stdout, "\n"); -#endif - - return (fabs(eq1LTE) + fabs(eq2LTE)); -} - -/*********************************************************************/ -/****************** old stuff, retained for historical interest ******/ -/*********************************************************************/ - - - -/* - * LTRAcoeffSetup sets up the coefficient list for the convolution, returns - * the coefficient at (current_timepoint-T) - */ - -/* - * double - * LTRAcoeffSetup(coefflist,listsize,T,firstvalue,valuelist,curtime,timelist,t - * imeindex,auxindexptr) double *coefflist, *timelist, *valuelist; int - * listsize, timeindex; double T, firstvalue, curtime; int *auxindexptr; - * - * { unsigned exact; double returnval, delta1, delta2; double dummy1, dummy2; - * double lolimit1,lolimit2,hilimit1,hilimit2; double - * lovalue1,lovalue2,hivalue1,hivalue2; int i,auxindex; - */ - -/* coefflist should already have been allocated to the necessary size */ - -/* - * #ifdef LTRAdebug if (listsize <= timeindex) { printf("LTRAcoeffSetup: not - * enough space in coefflist\n"); } #endif - * - */ - -/* - * we assume a piecewise linear function, and we calculate the coefficients - * using this assumption in the integration of the function - */ - -/* - * if (T == 0.0) { auxindex = timeindex; } else { - * - * if (curtime - T <= 0.0) { for (i =0; i<= timeindex; i++) { (coefflist + i) = - * 0.0; } auxindexptr = 0; return(0.0); } else { exact = 0; for (i = - * timeindex; i>= 0; i--) { if (curtime - *(timelist + i) == T) { exact =1; - * break; } if (curtime - *(timelist + i) > T) break; } - * - * #ifdef LTRADEBUG if ((i < 0) || ((i==0) && (exact==1))) - * printf("LTRAcoeffSetup: i <= 0: some mistake!\n"); #endif - * - * if (exact == 1) { auxindex = i-1; } else { auxindex = i; } } } - */ -/* the first coefficient */ - -/* - * delta1 = curtime -T - *(timelist + auxindex); lolimit1 = T; hilimit1 = T + - * delta1; lovalue1 = firstvalue; hivalue1 = *(valuelist + auxindex); dummy1 - * = twiceintlinfunc(lolimit1,hilimit1,lolimit1,lovalue1, - * hivalue1,lolimit1,hilimit1)/delta1; returnval = dummy1; - * - */ - - -/* the coefficients for the rest of the timepoints */ - -/* - * for (i=auxindex; i>0; i--) { - * - * delta2 = delta1; - *//* previous delta1 */ -/* lolimit2 = lolimit1; *//* previous lolimit1 */ -/* hilimit2 = hilimit1; *//* previous hilimit1 */ -/* lovalue2 = lovalue1; *//* previous lovalue1 */ -/* hivalue2 = hivalue1; *//* previous hivalue1 */ -/* dummy2 = dummy1; *//* previous dummy1 */ -/* - * delta1 = *(timelist + i) - *(timelist + i - 1); lolimit1 = hilimit2; - * hilimit1 = curtime - *(timelist + i - 1); lovalue1 = hivalue2; hivalue1 = - * *(valuelist + i - 1); dummy1 = twiceintlinfunc(lolimit1,hilimit1,lolimit1, - * lovalue1,hivalue1,lolimit1,hilimit1)/delta1; - * - * (coefflist + i) = dummy1 - dummy2 + intlinfunc(lolimit2,hilimit2, - * lovalue2,hivalue2,lolimit2,hilimit2); } auxindexptr = auxindex; - * return(returnval); } - */ - -/* - * LTRAtCoeffSetup sets up the coefficient list for the LTE calculation, - * returns the coefficient at (current_timepoint-T) - */ - -/* - * double LTRAtCoeffSetup(coefflist,listsize,T,valuelist, - * firstothervalue,othervaluelist,curtime,timelist,timeindex, auxindexptr, - * ltecontype) double *coefflist, *timelist, *valuelist, *othervaluelist; int - * listsize, timeindex; double T, firstothervalue, curtime; int *auxindexptr, - * ltecontype; - * - * { unsigned exact; double returnval, delta; double dummy; double f1i, f2i, - * g1i, g2i; double lolimit1, hilimit1; double lovalue1, hivalue1; double - * lolimit2, hilimit2; double lovalue2, hivalue2; double firstint1 = 0.0, - * firstint2 = 0.0; double secondint1 = 0.0, secondint2 = 0.0; int - * i,auxindex; - * - */ -/* coefflist should already have been allocated to the necessary size */ - -/* - * #ifdef LTRAdebug if (listsize <= timeindex) { printf("LTRAtCoeffSetup: not - * enough space in coefflist\n"); } #endif - * - */ - -/* - * we assume a piecewise linear function, and we calculate the coefficients - * using this assumption in the integration of the function - */ - -/* - * if (T == 0.0) { auxindex = timeindex; } else { - * - * if (curtime - T <= 0.0) { for (i =0; i<= timeindex; i++) { (coefflist + i) = - * 0.0; } auxindexptr = 0; return(0.0); } else { exact = 0; for (i = - * timeindex; i>= 0; i--) { if (curtime - *(timelist + i) == T) { exact =1; - * break; } if (curtime - *(timelist + i) > T) break; } - * - * #ifdef LTRADEBUG if ((i < 0) || ((i==0) && (exact==1))) - * printf("LTRAcoeffSetup: i <= 0: some mistake!\n"); #endif - * - * if (exact == 1) { auxindex = i-1; } else { auxindex = i; } } } - */ -/* the first coefficient */ - -/* i = n in the write-up */ - -/* - * hilimit1 = curtime - *(timelist + auxindex); hivalue1 = *(valuelist + - * auxindex); lolimit1 = *(timelist + timeindex) - *(timelist + auxindex); - * lolimit1 = MAX(T,lolimit1); lovalue1 = firstothervalue; f1i = - * twiceintlinfunc(lolimit1,hilimit1,lolimit1,lovalue1,hivalue1,lolimit1, - * hilimit1); g1i = - * thriceintlinfunc(lolimit1,hilimit1,lolimit1,lolimit1,lovalue1, - * hivalue1,lolimit1,hilimit1); returnval = 0.5*f1i*(curtime-T- - * *(timelist+auxindex)) - g1i; - * - */ -/* the coefficients for the rest of the timepoints */ - -/* - * if (ltecontype != LTRA_MOD_HALFCONTROL) { for (i=auxindex; i>0; i--) { - * - * lolimit2 = lolimit1; - *//* previous lolimit1 */ -/* hilimit2 = hilimit1; *//* previous hilimit1 */ -/* lovalue2 = lovalue1; *//* previous lovalue1 */ -/* hivalue2 = hivalue1; *//* previous hivalue1 */ -/* f2i = f1i; *//* previous f1i */ -/* g2i = g1i; *//* previous g1i */ -/* firstint2 = firstint1; *//* previous firstint1 */ -/* secondint2 = secondint1; *//* previous secondint1 */ -/* - * lolimit1 = *(timelist + timeindex) - *(timelist + i - 1); hilimit1 = - * curtime - *(timelist + i - 1); lovalue1 = *(othervaluelist + i - 1); - * hivalue1 = *(valuelist + i - 1); firstint1 += intlinfunc(lolimit2, - * lolimit1, lovalue2, lovalue1, lolimit2, lolimit1); secondint1 += - * (lolimit1-lolimit2)*firstint2 + twiceintlinfunc( - * lolimit2,lolimit1,lolimit2,lovalue2,lovalue1,lolimit2,lolimit1); f1i = - * twiceintlinfunc(lolimit1,hilimit1,lolimit1,lovalue1,hivalue1, - * lolimit1,hilimit1) + firstint1*(hilimit1-lolimit1); g1i = - * thriceintlinfunc(lolimit1,hilimit1,lolimit1,lolimit1, - * lovalue1,hivalue1,lolimit1,hilimit1) + - * (hilimit1-lolimit1)*(hilimit1-lolimit1)*0.5*firstint1 + - * (hilimit1-lolimit1)*secondint1; - * - * (coefflist + i) = g2i - g1i + 0.5*(f1i + f2i)*(*(timelist+i) - - * (timelist+i-1)); } } auxindexptr = auxindex; return(returnval); } - */ - - -/* - * formulae taken from the Handbook of Mathematical Functions by Milton - * Abramowitz and Irene A. Stegan, page 378, formulae 9.8.1 - 9.8.4 - */ - -/* - * double bessi0(x) double x; { double t, tsq, oneovert, result, dummy; int i; - * static double coeffs1[7], coeffs2[9]; - * - * coeffs1[0] = 1.0; coeffs1[1] = 3.5156229; coeffs1[2] = 3.0899424; coeffs1[3] - * = 1.2067492; coeffs1[4] = 0.2659732; coeffs1[5] = 0.0360768; coeffs1[6] = - * 0.0045813; - * - * coeffs2[0] = 0.39894228; coeffs2[1] = 0.01328592; coeffs2[2] = 0.00225319; - * coeffs2[3] = -0.00157565; coeffs2[4] = 0.00916281; coeffs2[5] = - * -0.02057706; coeffs2[6] = 0.02635537; coeffs2[7] = -0.01647633; coeffs2[8] - * = 0.00392377; - * - * t = x/3.75; dummy = 1.0; - * - * if (fabs(t) <= 1) { tsq = t*t; - * - * result = 1.0; for (i=1;i<=6;i++) { dummy *= tsq; ; result += dummy * - * coeffs1[i]; } } else { oneovert = 1/fabs(t); - * - * result = coeffs2[0]; for (i=1;i<=8;i++) { dummy *= oneovert; result += - * coeffs2[2] * dummy; } result *= exp(x) * sqrt(1/fabs(x)); } - * return(result); } - * - * double bessi1(x) double x; { double t, tsq, oneovert, result, dummy; int i; - * static double coeffs1[7], coeffs2[9]; - * - * coeffs1[0] = 0.5; coeffs1[1] = 0.87890594; coeffs1[2] = 0.51498869; - * coeffs1[3] = 0.15084934; coeffs1[4] = 0.02658733; coeffs1[5] = 0.00301532; - * coeffs1[6] = 0.00032411; - * - * coeffs2[0] = 0.39894228; coeffs2[1] = -0.03988024; coeffs2[2] = -0.00362018; - * coeffs2[3] = 0.00163801; coeffs2[4] = -0.01031555; coeffs2[5] = - * 0.02282967; coeffs2[6] = -0.02895312; coeffs2[7] = 0.01787654; coeffs2[8] - * = -0.00420059; - * - * t = x/3.75; dummy = 1.0; - * - * if (fabs(t) <= 1) { tsq = t*t; - * - * result = 0.5; for (i=1;i<=6;i++) { dummy *= tsq; ; result += dummy * - * coeffs1[i]; } result *= x; } else { oneovert = 1/fabs(t); - * - * result = coeffs2[0]; for (i=1;i<=8;i++) { dummy *= oneovert; result += - * coeffs2[2] * dummy; } result *= exp(x) * sqrt(1/fabs(x)); if (x < 0) - * result = -result; } return(result); } */ - -/* - * LTRAdivDiffs returns divided differences after 2 iterations, an - * approximation to the second derivatives. The algorithm is picked up - * directly from Tom Quarles' CKTterr.c; no attempt has been made to figure - * out why it does what it does. - */ - -/* - * double LTRAdivDiffs(difflist, valuelist, firstvalue, curtime, timelist, - * timeindex) double *difflist, *valuelist, firstvalue, *timelist, curtime; - * int timeindex; - * - * { double *dtime, *diffs, returnval; int i,j; - * - * diffs = TMALLOC(double, timeindex + 2); - * dtime = TMALLOC(double, timeindex + 2); - */ - -/* now divided differences */ -/* - * for(i=timeindex+1;i>=0;i--) { (diffs+i) = (i == timeindex+1 ? firstvalue : - * *(valuelist + i)); } for(i=timeindex+1 ; i > 0 ; i--) { (dtime+i) = (i == - * timeindex+1? curtime: *(timelist + i)) - (timelist + i - 1); } j = 2; - *//* for the second derivative */ -/* - * while(1) { for(i=timeindex + 1;i > 0; i--) { (diffs+i) = (*(diffs+i) - - * *(diffs+i-1))/ *(dtime+i); } j--; if (j <= 0) break; for(i=timeindex+1;i > - * 0;i--) { (dtime+i) = *(dtime+i-1) + (i == timeindex+1? curtime: *(timelist - * + i)) - *(timelist + i - 1); } } - * - * for (i = timeindex; i>=0 ; i--) { (difflist+i) = *(diffs+i); } - * - * returnval = *(diffs+timeindex+1); FREE(dtime); FREE(diffs); - */ - -/* difflist[0] is going to be bad */ -/* - * return(returnval); } */ - - -/* - * LTRAlteCalculate - returns sum of the absolute values of the total local - * truncation error of the 2 equations for the LTRAline - */ - -/* - * double LTRAlteCalculate(ckt,model,instance,curtime) CKTcircuit *ckt; - * LTRAmodel *model; register LTRAinstance *instance; double - * curtime; - * - * { double *h1dashTcoeffs, h1dashTfirstCoeff; double *h2Tcoeffs, h2TfirstCoeff; - * double *h3dashTcoeffs, h3dashTfirstCoeff; double *SecondDerivs, - * FirstSecondDeriv; double t1, t2, t3, f1, f2, f3; double eq1LTE=0.0, - * eq2LTE=0.0; int isaved, tdover, i; - * - * if (curtime > model->LTRAtd) { tdover = 1; } else { tdover = 0; } - * - * h1dashTcoeffs = TMALLOC(double, model->LTRAmodelListSize); - * h2Tcoeffs = TMALLOC(double, model->LTRAmodelListSize); - * h3dashTcoeffs = TMALLOC(double, model->LTRAmodelListSize); - * SecondDerivs = TMALLOC(double, model->LTRAmodelListSize); - * - */ - -/* - * note that other OthVals have been set up in LTRAaccept, and Values in - * LTRAload - */ - - -/* - * h1dashTfirstCoeff = LTRAtCoeffSetup(h1dashTcoeffs, - * model->LTRAmodelListSize, 0.0, model->LTRAh1dashValues, - * model->LTRAh1dashFirstVal, model->LTRAh1dashOthVals, curtime, - * ckt->CKTtimePoints,ckt->CKTtimeIndex, &(model->LTRAh1dashIndex), - * model->LTRAlteConType); - * - * if (tdover) { - * - * h2TfirstCoeff = LTRAtCoeffSetup(h2Tcoeffs, model->LTRAmodelListSize, - * model->LTRAtd, model->LTRAh2Values, model->LTRAh2FirstOthVal, - * model->LTRAh2OthVals, curtime, ckt->CKTtimePoints, ckt->CKTtimeIndex, - * &(model->LTRAh2Index), model->LTRAlteConType); - * - * h3dashTfirstCoeff = LTRAtCoeffSetup(h3dashTcoeffs, model->LTRAmodelListSize, - * model->LTRAtd, model->LTRAh3dashValues, model->LTRAh3dashFirstOthVal, - * model->LTRAh3dashOthVals, curtime, ckt->CKTtimePoints,ckt->CKTtimeIndex, - * &(model->LTRAh3dashIndex), model->LTRAlteConType); - */ - -/* setting up the coefficients for interpolation */ -/* - * for (i = ckt->CKTtimeIndex; i>= 0; i--) { if (*(ckt->CKTtimePoints + i) < - * curtime - model->LTRAtd) { break; } } #ifdef LTRAdebug if (i == - * ckt->CKTtimeIndex) || (i == -1) { printf("LTRAtrunc: mistake: cannot find - * delayed timepoint\n"); } #endif t1 = *(ckt->CKTtimePoints + i - 1); t2 = - * *(ckt->CKTtimePoints + i); t3 = *(ckt->CKTtimePoints + i + 1); - * - * LTRAquadInterp(curtime - model->LTRAtd, t1,t2,t3,&f1,&f2,&f3); - * - * isaved = i; } */ - -/* interpolation coefficients set-up */ - -/* LTEs for convolution with v1 */ -/* get divided differences for v1 (2nd derivative estimates) */ - -/* - * no need to subtract operating point values because taking differences - * anyway - */ - -/* - * FirstSecondDeriv = LTRAdivDiffs(SecondDerivs,instance->LTRAv1, - * (ckt->CKTrhsOld + instance->LTRAposNode1) - *(ckt->CKTrhsOld + - * instance->LTRAnegNode1),curtime, ckt->CKTtimePoints,ckt->CKTtimeIndex); - * - * eq1LTE += model->LTRAadmit*fabs(FirstSecondDeriv * h1dashTfirstCoeff); - * - * if (model->LTRAlteConType != LTRA_MOD_HALFCONTROL) { for (i = - * model->LTRAh1dashIndex; i > 0; i--) { if ((*(SecondDerivs+i) != 0.0) && - * (*(h1dashTcoeffs+i)!=0.0)) { eq1LTE += - * model->LTRAadmit*fabs(*(SecondDerivs+i) * (h1dashTcoeffs+i)); } } } - * - */ -/* interpolate */ -/* - * if (tdover) { - * - * FirstSecondDeriv = *(SecondDerivs + isaved - 1) * f1 + *(SecondDerivs + - * isaved) * f2 + *(SecondDerivs + isaved + 1) * f3; - * - * eq2LTE += model->LTRAadmit*fabs(FirstSecondDeriv * h3dashTfirstCoeff); - * - * if (model->LTRAlteConType != LTRA_MOD_HALFCONTROL) { for (i = - * model->LTRAh3dashIndex; i > 0; i--) { if ((*(SecondDerivs+i) != 0.0) && - * (*(h3dashTcoeffs+i)!=0.0)) { eq2LTE += - * model->LTRAadmit*fabs(*(SecondDerivs+i) * (h3dashTcoeffs+i)); } } } } - */ -/* end LTEs for convolution with v1 */ - -/* LTEs for convolution with v2 */ -/* get divided differences for v2 (2nd derivative estimates) */ - -/* - * FirstSecondDeriv = LTRAdivDiffs(SecondDerivs,instance->LTRAv2, - * (ckt->CKTrhsOld + instance->LTRAposNode2) - *(ckt->CKTrhsOld + - * instance->LTRAnegNode2),curtime, ckt->CKTtimePoints,ckt->CKTtimeIndex); - * - * eq2LTE += model->LTRAadmit*fabs(FirstSecondDeriv * h1dashTfirstCoeff); - * - * if (model->LTRAlteConType != LTRA_MOD_HALFCONTROL) { for (i = - * model->LTRAh1dashIndex; i > 0; i--) { if ((*(SecondDerivs+i) != 0.0) && - * (*(h1dashTcoeffs+i)!=0.0)) { eq2LTE += - * model->LTRAadmit*fabs(*(SecondDerivs+i) * (h1dashTcoeffs+i)); } } } - * - * if (tdover) { - */ -/* interpolate */ - -/* - * FirstSecondDeriv = *(SecondDerivs + isaved - 1) * f1 + *(SecondDerivs + - * isaved) * f2 + *(SecondDerivs + isaved + 1) * f3; - * - * eq1LTE += model->LTRAadmit*fabs(FirstSecondDeriv * h3dashTfirstCoeff); - * - * if (model->LTRAlteConType != LTRA_MOD_HALFCONTROL) { for (i = - * model->LTRAh3dashIndex; i > 0; i--) { if ((*(SecondDerivs+i) != 0.0) && - * (*(h3dashTcoeffs+i)!=0.0)) { eq1LTE += - * model->LTRAadmit*fabs(*(SecondDerivs+i) * (h3dashTcoeffs+i)); } } } } - * - */ -/* end LTEs for convolution with v2 */ - -/* LTE for convolution with i1 */ -/* get divided differences for i1 (2nd derivative estimates) */ - -/* - * if (tdover) { FirstSecondDeriv = - * LTRAdivDiffs(SecondDerivs,instance->LTRAi1, (ckt->CKTrhsOld + - * instance->LTRAbrEq1),curtime, ckt->CKTtimePoints,ckt->CKTtimeIndex); - * - */ -/* interpolate */ - -/* - * FirstSecondDeriv = *(SecondDerivs + isaved - 1) * f1 + *(SecondDerivs + - * isaved) * f2 + *(SecondDerivs + isaved + 1) * f3; - * - * eq2LTE += fabs(FirstSecondDeriv * h2TfirstCoeff); - * - * if (model->LTRAlteConType != LTRA_MOD_HALFCONTROL) { for (i = - * model->LTRAh2Index; i > 0; i--) { if ((*(SecondDerivs+i) != 0.0) && - * (*(h2Tcoeffs+i)!=0.0)) { eq2LTE += model->LTRAadmit*fabs(*(SecondDerivs+i) * - * (h2Tcoeffs+i)); } } } - * - * } */ -/* end LTE for convolution with i1 */ - -/* LTE for convolution with i2 */ -/* get divided differences for i2 (2nd derivative estimates) */ - -/* - * if (tdover) { FirstSecondDeriv = - * LTRAdivDiffs(SecondDerivs,instance->LTRAi2, (ckt->CKTrhsOld + - * instance->LTRAbrEq2),curtime, ckt->CKTtimePoints,ckt->CKTtimeIndex); - * - */ -/* interpolate */ - -/* - * FirstSecondDeriv = *(SecondDerivs + isaved - 1) * f1 + *(SecondDerivs + - * isaved) * f2 + *(SecondDerivs + isaved + 1) * f3; - * - * eq1LTE += fabs(FirstSecondDeriv * h2TfirstCoeff); - * - * if (model->LTRAlteConType != LTRA_MOD_HALFCONTROL) { for (i = - * model->LTRAh2Index; i > 0; i--) { if ((*(SecondDerivs+i) != 0.0) && - * (*(h2Tcoeffs+i)!=0.0)) { eq1LTE += model->LTRAadmit*fabs(*(SecondDerivs+i) * - * (h2Tcoeffs+i)); } } } } - * - */ -/* end LTE for convolution with i1 */ - -#ifdef LTRADEBUG -/* - * fprintf(stdout,"%s: LTE/input for Eq1 at time %g is: %g\n", - * instance->LTRAname, curtime, eq1LTE/instance->LTRAinput1); - * fprintf(stdout,"%s: LTE/input for Eq2 at time %g is: %g\n", - * instance->LTRAname, curtime, eq2LTE/instance->LTRAinput1); - * fprintf(stdout,"\n"); - */ -#endif - -/* - * FREE(SecondDerivs); FREE(h1dashTcoeffs); FREE(h2Tcoeffs); - * FREE(h3dashTcoeffs); - * - * return(fabs(eq1LTE) + fabs(eq2LTE)); } - */ - -/* - * LTRAh3dashCoeffSetup sets up the coefficient list for h3dash for the - * special case where G=0, * returns the coefficient at (current_timepoint-T) - */ - -/* - * double - * LTRAh3dashCoeffSetup(coefflist,listsize,T,beta,curtime,timelist,timeindex,a - * uxindexptr) double *coefflist, *timelist; int listsize, timeindex; double - * T, curtime, beta; int *auxindexptr; - * - * { unsigned exact; double returnval, delta1, delta2; double dummy1, dummy2; - * double lolimit1,lolimit2,hilimit1,hilimit2; double - * lovalue1,lovalue2,hivalue1,hivalue2; int i,auxindex; - * - */ -/* coefflist should already have been allocated to the necessary size */ - -/* - * #ifdef LTRAdebug if (listsize <= timeindex) { printf("LTRAcoeffSetup: not - * enough space in coefflist\n"); } #endif - * - * - */ -/* - * we assume a piecewise linear function, and we calculate the coefficients - * using this assumption in the integration of the function - */ - -/* - * if (T == 0.0) { auxindex = timeindex; } else { - * - * if (curtime - T <= 0.0) { for (i =0; i<= timeindex; i++) { (coefflist + i) = - * 0.0; } auxindexptr = 0; return(0.0); } else { exact = 0; for (i = - * timeindex; i>= 0; i--) { if (curtime - *(timelist + i) == T) { exact =1; - * break; } if (curtime - *(timelist + i) > T) break; } - * - * #ifdef LTRADEBUG if ((i < 0) || ((i==0) && (exact==1))) - * printf("LTRAcoeffSetup: i <= 0: some mistake!\n"); #endif - * - * if (exact == 1) { auxindex = i-1; } else { auxindex = i; } } } - */ -/* the first coefficient */ - -/* - * delta1 = curtime -T - *(timelist + auxindex); lolimit1 = T; hilimit1 = T + - * delta1; lovalue1 = 0.0; - *//* E3dash should be consistent with this */ -/* - * hivalue1 = LTRArlcH3dashIntFunc(hilimit1,T,beta); dummy1 = - * intlinfunc(lolimit1,hilimit1,lovalue1, hivalue1,lolimit1,hilimit1)/delta1; - * returnval = dummy1; - * - * - */ -/* the coefficients for the rest of the timepoints */ -/* - * for (i=auxindex; i>0; i--) { - * - * delta2 = delta1; - *//* previous delta1 */ -/* lolimit2 = lolimit1; *//* previous lolimit1 */ -/* hilimit2 = hilimit1; *//* previous hilimit1 */ -/* lovalue2 = lovalue1; *//* previous lovalue1 */ -/* hivalue2 = hivalue1; *//* previous hivalue1 */ -/* dummy2 = dummy1; *//* previous dummy1 */ -/* - * delta1 = *(timelist + i) - *(timelist + i - 1); lolimit1 = hilimit2; - * hilimit1 = curtime - *(timelist + i - 1); lovalue1 = hivalue2; hivalue1 = - * LTRArlcH3dashIntFunc(hilimit1,T,beta); dummy1 = - * intlinfunc(lolimit1,hilimit1,lovalue1,hivalue1,lolimit1,hilimit1)/delta1; - * - * (coefflist + i) = dummy1 - dummy2; } auxindexptr = auxindex; - * return(returnval); } - */ - -/* - * LTRAh1dashCoeffSetup sets up the coefficient list for h1dash in the - * special case where G=0 returns the coefficient at current_timepoint - */ -/* - * double - * LTRAh1dashCoeffSetup(coefflist,listsize,beta,curtime,timelist,timeindex,aux - *strchrptr) double *coefflist, *timelist; int listsize, timeindex; double - * beta, curtime; int *auxindexptr; - * - * { double returnval, delta1, delta2; double dummy1, dummy2; double - * lolimit1,lolimit2,hilimit1,hilimit2; double - * lovalue1,lovalue2,hivalue1,hivalue2; int i,auxindex; - * - */ -/* coefflist should already have been allocated to the necessary size */ - -/* - * #ifdef LTRAdebug if (listsize <= timeindex) { - * printf("LTRAh1dashCoeffSetup: not enough space in coefflist\n"); } #endif - * - * - * - * auxindex = timeindex; - * - */ -/* the first coefficient */ -/* - * delta1 = curtime - *(timelist + auxindex); lolimit1 = 0.0; hilimit1 = - * delta1; lovalue1 = 0.0; hivalue1 = - * LTRArlcH1dashTwiceIntFunc(hilimit1,beta); dummy1 = hivalue1/delta1; - * returnval = dummy1; - * - * - * - */ -/* the coefficients for the rest of the timepoints */ - -/* - * for (i=auxindex; i>0; i--) { - * - * delta2 = delta1; - *//* previous delta1 */ -/* lolimit2 = lolimit1; *//* previous lolimit1 */ -/* hilimit2 = hilimit1; *//* previous hilimit1 */ -/* lovalue2 = lovalue1; *//* previous lovalue1 */ -/* hivalue2 = hivalue1; *//* previous hivalue1 */ -/* dummy2 = dummy1; *//* previous dummy1 */ -/* - * delta1 = *(timelist + i) - *(timelist + i - 1); lolimit1 = hilimit2; - * hilimit1 = curtime - *(timelist + i - 1); lovalue1 = hivalue2; hivalue1 = - * LTRArlcH1dashTwiceIntFunc(hilimit1,beta); dummy1 = (hivalue1 - - * lovalue1)/delta1; - * - * (coefflist + i) = dummy1 - dummy2; } auxindexptr = auxindex; - * return(returnval); } - */ diff --git a/src/spicelib/devices/ltra/ltrampar.c b/src/spicelib/devices/ltra/ltrampar.c deleted file mode 100644 index 08c5dd175..000000000 --- a/src/spicelib/devices/ltra/ltrampar.c +++ /dev/null @@ -1,116 +0,0 @@ -/********** -Copyright 1990 Regents of the University of California. All rights reserved. -Author: 1990 Jaijeet S. Roychowdhury -**********/ - -/* - * This routine sets model parameters for LTRA lines in the circuit. - */ - -#include "ngspice/ngspice.h" -#include "ngspice/const.h" -#include "ngspice/ifsim.h" -#include "ltradefs.h" -#include "ngspice/sperror.h" -#include "ngspice/suffix.h" - -int -LTRAmParam(int param, IFvalue *value, GENmodel *inModel) -{ - LTRAmodel *mods = (LTRAmodel *) inModel; - - switch (param) { - case LTRA_MOD_LTRA: - break; - case LTRA_MOD_RELTOL: - mods->LTRAreltol = value->rValue; - mods->LTRAreltolGiven = TRUE; - break; - case LTRA_MOD_ABSTOL: - mods->LTRAabstol = value->rValue; - mods->LTRAabstolGiven = TRUE; - break; - case LTRA_MOD_STLINEREL: - mods->LTRAstLineReltol = value->rValue; - break; - case LTRA_MOD_STLINEABS: - mods->LTRAstLineAbstol = value->rValue; - break; - case LTRA_MOD_CHOPREL: - mods->LTRAchopReltol = value->rValue; - break; - case LTRA_MOD_CHOPABS: - mods->LTRAchopAbstol = value->rValue; - break; - case LTRA_MOD_TRUNCNR: - mods->LTRAtruncNR = TRUE; - break; - case LTRA_MOD_TRUNCDONTCUT: - mods->LTRAtruncDontCut = TRUE; - break; - case LTRA_MOD_R: - mods->LTRAresist = value->rValue; - mods->LTRAresistGiven = TRUE; - break; - case LTRA_MOD_L: - mods->LTRAinduct = value->rValue; - mods->LTRAinductGiven = TRUE; - break; - case LTRA_MOD_G: - mods->LTRAconduct = value->rValue; - mods->LTRAconductGiven = TRUE; - break; - case LTRA_MOD_C: - mods->LTRAcapac = value->rValue; - mods->LTRAcapacGiven = TRUE; - break; - case LTRA_MOD_LEN: - mods->LTRAlength = value->rValue; - mods->LTRAlengthGiven = TRUE; - break; - case LTRA_MOD_NL: - mods->LTRAnl = value->rValue; - mods->LTRAnlGiven = TRUE; - break; - case LTRA_MOD_FREQ: - mods->LTRAf = value->rValue; - mods->LTRAfGiven = TRUE; - break; - case LTRA_MOD_FULLCONTROL: - mods->LTRAlteConType = LTRA_MOD_FULLCONTROL; - break; - case LTRA_MOD_HALFCONTROL: - mods->LTRAlteConType = LTRA_MOD_HALFCONTROL; - break; - case LTRA_MOD_NOCONTROL: - mods->LTRAlteConType = LTRA_MOD_NOCONTROL; - break; - case LTRA_MOD_PRINT: - mods->LTRAprintFlag = TRUE; - break; - case LTRA_MOD_NOPRINT: - mods->LTRAprintFlag = FALSE; - break; - /* - * case LTRA_MOD_RONLY: mods->LTRArOnly= TRUE; break; - */ - case LTRA_MOD_STEPLIMIT: - mods->LTRAstepLimit = LTRA_MOD_STEPLIMIT; - break; - case LTRA_MOD_NOSTEPLIMIT: - mods->LTRAstepLimit = LTRA_MOD_NOSTEPLIMIT; - break; - case LTRA_MOD_LININTERP: - mods->LTRAhowToInterp = LTRA_MOD_LININTERP; - break; - case LTRA_MOD_QUADINTERP: - mods->LTRAhowToInterp = LTRA_MOD_QUADINTERP; - break; - case LTRA_MOD_MIXEDINTERP: - mods->LTRAhowToInterp = LTRA_MOD_MIXEDINTERP; - break; - default: - return (E_BADPARM); - } - return (OK); -} diff --git a/src/spicelib/devices/ltra/ltrapar.c b/src/spicelib/devices/ltra/ltrapar.c deleted file mode 100644 index 78b2b0155..000000000 --- a/src/spicelib/devices/ltra/ltrapar.c +++ /dev/null @@ -1,60 +0,0 @@ -/********** -Copyright 1990 Regents of the University of California. All rights reserved. -Author: 1990 Jaijeet S. Roychowdhury -**********/ - -#include "ngspice/ngspice.h" -#include "ltradefs.h" -#include "ngspice/ifsim.h" -#include "ngspice/sperror.h" -#include "ngspice/suffix.h" - - -/* ARGSUSED */ -int -LTRAparam(int param, IFvalue *value, GENinstance *inst, IFvalue *select) -{ - LTRAinstance *here = (LTRAinstance *) inst; - - NG_IGNORE(select); - - switch (param) { - case LTRA_V1: - here->LTRAinitVolt1 = value->rValue; - here->LTRAicV1Given = TRUE; - break; - case LTRA_I1: - here->LTRAinitCur1 = value->rValue; - here->LTRAicC1Given = TRUE; - break; - case LTRA_V2: - here->LTRAinitVolt2 = value->rValue; - here->LTRAicV2Given = TRUE; - break; - case LTRA_I2: - here->LTRAinitCur2 = value->rValue; - here->LTRAicC2Given = TRUE; - break; - case LTRA_IC: - switch (value->v.numValue) { - case 4: - here->LTRAinitCur2 = *(value->v.vec.rVec + 3); - /* FALLTHROUGH */ - case 3: - here->LTRAinitVolt2 = *(value->v.vec.rVec + 2); - /* FALLTHROUGH */ - case 2: - here->LTRAinitCur1 = *(value->v.vec.rVec + 1); - /* FALLTHROUGH */ - case 1: - here->LTRAinitVolt1 = *(value->v.vec.rVec); - break; - default: - return (E_BADPARM); - } - break; - default: - return (E_BADPARM); - } - return (OK); -} diff --git a/src/spicelib/devices/ltra/ltraset.c b/src/spicelib/devices/ltra/ltraset.c deleted file mode 100644 index 5eefdcaf1..000000000 --- a/src/spicelib/devices/ltra/ltraset.c +++ /dev/null @@ -1,270 +0,0 @@ -/********** -Copyright 1990 Regents of the University of California. All rights reserved. -Author: 1990 Jaijeet S. Roychowdhury -**********/ - -#include "ngspice/ngspice.h" -#include "ngspice/smpdefs.h" -#include "ngspice/cktdefs.h" -#include "ltradefs.h" -#include "ngspice/sperror.h" -#include "ngspice/suffix.h" - -int -LTRAsetup(SMPmatrix *matrix, GENmodel *inModel, CKTcircuit *ckt, int *state) -/* - * load the transmission line structure with those pointers needed later for - * fast matrix loading - */ -{ - LTRAmodel *model = (LTRAmodel *) inModel; - LTRAinstance *here; - int error; - CKTnode *tmp; - - NG_IGNORE(state); - - /* loop through all the transmission line models */ - for (; model != NULL; model = LTRAnextModel(model)) { - - if (!model->LTRAnlGiven) { - model->LTRAnl = .25; - } - if (!model->LTRAfGiven) { - model->LTRAf = 1e9; - } - if (!model->LTRAreltolGiven) { - model->LTRAreltol = 1; - } - if (!model->LTRAabstolGiven) { - model->LTRAabstol = 1; - } - if (!model->LTRAresistGiven) { - SPfrontEnd->IFerrorf (ERR_WARNING, - "%s: lossy line series resistance not given, assumed zero", - model->LTRAmodName); - model->LTRAresist = 0.0; - /* return(E_BADPARM); */ - } - if (model->LTRAstLineReltol == 0.0) - model->LTRAstLineReltol = ckt->CKTreltol; - if (model->LTRAstLineAbstol == 0.0) - model->LTRAstLineAbstol = ckt->CKTabstol; - /* LTRAchopReltol and LTRAchopAbstol default zero */ - - if ((model->LTRAhowToInterp != LTRA_MOD_LININTERP) && - (model->LTRAhowToInterp != LTRA_MOD_QUADINTERP) && - (model->LTRAhowToInterp != LTRA_MOD_MIXEDINTERP)) { - - /* - * SPfrontEnd->IFerrorf (ERR_FATAL, "%s: have to specify one of - * lininterp, quadinterp or mixedinterp", model->LTRAmodName); - * return(E_BADPARM); - */ - if (ckt->CKTtryToCompact) { - model->LTRAhowToInterp = LTRA_MOD_LININTERP; - SPfrontEnd->IFerrorf (ERR_WARNING, - "%s: using linear interpolation because trytocompact option specified", - model->LTRAmodName); - } else { - model->LTRAhowToInterp = LTRA_MOD_QUADINTERP; - } - } - if ((model->LTRAstepLimit != LTRA_MOD_NOSTEPLIMIT)) - model->LTRAstepLimit = LTRA_MOD_STEPLIMIT; - if ((model->LTRAlteConType != LTRA_MOD_FULLCONTROL) && - (model->LTRAlteConType != LTRA_MOD_HALFCONTROL)) - model->LTRAlteConType = LTRA_MOD_NOCONTROL; - - if (!model->LTRAconductGiven) { - /* - * SPfrontEnd->IFerrorf (ERR_WARNING, "%s: lossy line parallel - * conductance not given, assumed zero", model->LTRAmodName); - */ - model->LTRAconduct = 0.0; - /* return(E_BADPARM); */ - } - if (!model->LTRAinductGiven) { - SPfrontEnd->IFerrorf (ERR_WARNING, - "%s: lossy line series inductance not given, assumed zero", - model->LTRAmodName); - model->LTRAinduct = 0.0; - /* return(E_BADPARM); */ - } - if (!model->LTRAcapacGiven) { - SPfrontEnd->IFerrorf (ERR_FATAL, - "%s: lossy line parallel capacitance not given, assumed zero", - model->LTRAmodName); - model->LTRAcapac = 0.0; - /* return(E_BADPARM); */ - } - if (!model->LTRAlengthGiven) { - SPfrontEnd->IFerrorf (ERR_FATAL, - "%s: lossy line length must be given", - model->LTRAmodName); - return (E_BADPARM); - } - if ((model->LTRAresist == 0) && (model->LTRAconduct == 0) && - (model->LTRAcapac != 0) && (model->LTRAinduct != 0)) { - model->LTRAspecialCase = LTRA_MOD_LC; -#ifdef LTRADEBUG - SPfrontEnd->IFerrorf (ERR_INFO, - "%s: lossless line", - model->LTRAmodName); -#endif - } - if ((model->LTRAresist != 0) && (model->LTRAconduct == 0) && - (model->LTRAcapac != 0) && (model->LTRAinduct != 0)) { - model->LTRAspecialCase = LTRA_MOD_RLC; -#ifdef LTRADEBUG - SPfrontEnd->IFerrorf (ERR_INFO, - "%s: RLC line", - model->LTRAmodName); -#endif - } - if ((model->LTRAresist != 0) && (model->LTRAconduct == 0) && - (model->LTRAcapac != 0) && (model->LTRAinduct == 0)) { - model->LTRAspecialCase = LTRA_MOD_RC; -#ifdef LTRADEBUG - SPfrontEnd->IFerrorf (ERR_INFO, - "%s: RC line", - model->LTRAmodName); -#endif - } - if ((model->LTRAresist != 0) && (model->LTRAconduct == 0) && - (model->LTRAcapac == 0) && (model->LTRAinduct != 0)) { - model->LTRAspecialCase = LTRA_MOD_RL; - SPfrontEnd->IFerrorf (ERR_FATAL, - "%s: RL line not supported yet", - model->LTRAmodName); - return (E_BADPARM); -#ifdef LTRADEBUG -#endif - } - if ((model->LTRAresist != 0) && (model->LTRAconduct != 0) && - (model->LTRAcapac == 0) && (model->LTRAinduct == 0)) { - model->LTRAspecialCase = LTRA_MOD_RG; -#ifdef LTRADEBUG - SPfrontEnd->IFerrorf (ERR_INFO, - "%s: RG line", - model->LTRAmodName); -#endif - } - if ((model->LTRAconduct != 0) && ((model->LTRAcapac != 0) || - (model->LTRAinduct != 0))) { - model->LTRAspecialCase = LTRA_MOD_LTRA; - SPfrontEnd->IFerrorf (ERR_FATAL, - "%s: Nonzero G (except RG) line not supported yet", - model->LTRAmodName); - return (E_BADPARM); -#ifdef LTRADEBUG -#endif - } - if ((model->LTRAresist == 0.0 ? 0 : 1) + (model->LTRAconduct - == 0.0 ? 0 : 1) + (model->LTRAinduct == 0.0 ? 0 : 1) + - (model->LTRAcapac == 0.0 ? 0 : 1) <= 1) { - SPfrontEnd->IFerrorf (ERR_FATAL, - "%s: At least two of R,L,G,C must be specified and nonzero", - model->LTRAmodName); - return (E_BADPARM); - } - /* loop through all the instances of the model */ - for (here = LTRAinstances(model); here != NULL; - here = LTRAnextInstance(here)) { - - if (here->LTRAbrEq1 == 0) { - error = CKTmkVolt(ckt, &tmp, here->LTRAname, "i1"); - if (error) - return (error); - here->LTRAbrEq1 = tmp->number; - } - if (here->LTRAbrEq2 == 0) { - error = CKTmkVolt(ckt, &tmp, here->LTRAname, "i2"); - if (error) - return (error); - here->LTRAbrEq2 = tmp->number; - } - /* macro to make elements with built in test for out of memory */ -#define TSTALLOC(ptr,first,second) \ -do { if((here->ptr = SMPmakeElt(matrix, here->first, here->second)) == NULL){\ - return(E_NOMEM);\ -} } while(0) - - TSTALLOC(LTRAibr1Pos1Ptr, LTRAbrEq1, LTRAposNode1); - TSTALLOC(LTRAibr1Neg1Ptr, LTRAbrEq1, LTRAnegNode1); - TSTALLOC(LTRAibr1Pos2Ptr, LTRAbrEq1, LTRAposNode2); - TSTALLOC(LTRAibr1Neg2Ptr, LTRAbrEq1, LTRAnegNode2); - TSTALLOC(LTRAibr1Ibr1Ptr, LTRAbrEq1, LTRAbrEq1); - TSTALLOC(LTRAibr1Ibr2Ptr, LTRAbrEq1, LTRAbrEq2); - TSTALLOC(LTRAibr2Pos1Ptr, LTRAbrEq2, LTRAposNode1); - TSTALLOC(LTRAibr2Neg1Ptr, LTRAbrEq2, LTRAnegNode1); - TSTALLOC(LTRAibr2Pos2Ptr, LTRAbrEq2, LTRAposNode2); - TSTALLOC(LTRAibr2Neg2Ptr, LTRAbrEq2, LTRAnegNode2); - TSTALLOC(LTRAibr2Ibr1Ptr, LTRAbrEq2, LTRAbrEq1); - TSTALLOC(LTRAibr2Ibr2Ptr, LTRAbrEq2, LTRAbrEq2); - TSTALLOC(LTRApos1Ibr1Ptr, LTRAposNode1, LTRAbrEq1); - TSTALLOC(LTRAneg1Ibr1Ptr, LTRAnegNode1, LTRAbrEq1); - TSTALLOC(LTRApos2Ibr2Ptr, LTRAposNode2, LTRAbrEq2); - TSTALLOC(LTRAneg2Ibr2Ptr, LTRAnegNode2, LTRAbrEq2); - /* - * the following are done so that SMPpreOrder does not screw up on - * occasion - for example, when one end of the lossy line is hanging - */ - TSTALLOC(LTRApos1Pos1Ptr, LTRAposNode1, LTRAposNode1); - TSTALLOC(LTRAneg1Neg1Ptr, LTRAnegNode1, LTRAnegNode1); - TSTALLOC(LTRApos2Pos2Ptr, LTRAposNode2, LTRAposNode2); - TSTALLOC(LTRAneg2Neg2Ptr, LTRAnegNode2, LTRAnegNode2); - } - } - return (OK); -} - -int -LTRAunsetup(GENmodel *inModel, CKTcircuit *ckt) -{ - LTRAmodel *model; - LTRAinstance *here; - - for (model = (LTRAmodel *) inModel; model != NULL; - model = LTRAnextModel(model)) { - for (here = LTRAinstances(model); here != NULL; - here = LTRAnextInstance(here)) { - if (here->LTRAbrEq2 > 0) - CKTdltNNum(ckt, here->LTRAbrEq2); - here->LTRAbrEq2 = 0; - - if (here->LTRAbrEq1 > 0) - CKTdltNNum(ckt, here->LTRAbrEq1); - here->LTRAbrEq1 = 0; - } - } - return OK; -} - -int -LTRAdevDelete(GENinstance* inst) -{ - LTRAinstance* here = (LTRAinstance*)inst; - if (here->LTRAv1) - tfree(here->LTRAv1); - if (here->LTRAi1) - tfree(here->LTRAi1); - if (here->LTRAv2) - tfree(here->LTRAv2); - if (here->LTRAi2) - tfree(here->LTRAi2); - return OK; -} - -int -LTRAmDelete(GENmodel* gen_model) -{ - LTRAmodel* model = (LTRAmodel*)gen_model; - if (model->LTRAh1dashCoeffs) - tfree(model->LTRAh1dashCoeffs); - if (model->LTRAh2Coeffs) - tfree(model->LTRAh2Coeffs); - if (model->LTRAh3dashCoeffs) - tfree(model->LTRAh3dashCoeffs); - return OK; -} diff --git a/src/spicelib/devices/ltra/ltratemp.c b/src/spicelib/devices/ltra/ltratemp.c deleted file mode 100644 index 4b009904e..000000000 --- a/src/spicelib/devices/ltra/ltratemp.c +++ /dev/null @@ -1,160 +0,0 @@ -/********** -Copyright 1990 Regents of the University of California. All rights reserved. -Author: 1990 Jaijeet S. Roychowdhury -**********/ - -#include "ngspice/ngspice.h" -#include "ngspice/smpdefs.h" -#include "ngspice/cktdefs.h" -#include "ltradefs.h" -#include "ngspice/sperror.h" -#include "ngspice/suffix.h" - -/* ARGSUSED */ -int -LTRAtemp(GENmodel *inModel, CKTcircuit *ckt) -/* - * pre-process parameters for later use - */ -{ - LTRAmodel *model = (LTRAmodel *) inModel; - LTRAinstance *here; - - NG_IGNORE(ckt); - - /* loop through all the transmission line models */ - for (; model != NULL; model = LTRAnextModel(model)) { - /* - * if(!model->LTRAtdGiven) { model->LTRAtd = model->LTRAnl/model->LTRAf; - * } - */ - switch (model->LTRAspecialCase) { - - case LTRA_MOD_LC: - model->LTRAimped = - sqrt(model->LTRAinduct / model->LTRAcapac); - model->LTRAadmit = 1 / model->LTRAimped; - model->LTRAtd = - sqrt(model->LTRAinduct * model->LTRAcapac) * model->LTRAlength; - model->LTRAattenuation = 1.0; - break; - - case LTRA_MOD_RLC: - model->LTRAimped = - sqrt(model->LTRAinduct / model->LTRAcapac); - model->LTRAadmit = 1 / model->LTRAimped; - model->LTRAtd = - sqrt(model->LTRAinduct * model->LTRAcapac) * model->LTRAlength; - model->LTRAalpha = - 0.5 * (model->LTRAresist / model->LTRAinduct - /* - model->LTRAconduct/model->LTRAcapac */ ); - model->LTRAbeta = model->LTRAalpha; - /* - * 0.5*(model->LTRAresist/model->LTRAinduct + - * model->LTRAconduct/model->LTRAcapac); - */ - model->LTRAattenuation = exp(-model->LTRAbeta * - model->LTRAtd); - if (model->LTRAalpha > 0.0) { - model->LTRAintH1dash = - /* - * sqrt(model->LTRAconduct/model->LTRAresist)/ model->LTRAadmit - */ -1.0; - model->LTRAintH2 = - /* - * exp(-model->LTRAlength*sqrt(model->LTRAconduct* - * model->LTRAresist)) - */ 1.0 - model->LTRAattenuation; - model->LTRAintH3dash = /* (model->LTRAintH1dash+1.0)* - (model->LTRAintH2+model->LTRAattenuation) */ - - model->LTRAattenuation; - } else if (model->LTRAalpha == 0.0) { - model->LTRAintH1dash = model->LTRAintH2 = - model->LTRAintH3dash = 0.0; - } else { -#ifdef LTRADEBUG - fprintf(stdout, "LTRAtemp: error: alpha < 0.0\n"); -#endif - } - - /* - * model->LTRAh1dashValues = NULL; model->LTRAh2Values = - * NULL; model->LTRAh3dashValues = NULL; - * - * model->LTRAh1dashOthVals = NULL; model->LTRAh2OthVals = - * NULL; model->LTRAh3dashOthVals = NULL; - */ - - model->LTRAh1dashCoeffs = NULL; - model->LTRAh2Coeffs = NULL; - model->LTRAh3dashCoeffs = NULL; - - if (!model->LTRAtruncDontCut) { - - double xbig, xsmall, xmid, y1big, y1small, y1mid; - double y2big, y2small, y2mid; - int done = 0, maxiter = 50, iters = 0; - - xbig = model->LTRAtd + /* ckt->CKTmaxStep */ 9 * model->LTRAtd; - /* hack! ckt is not yet initialised... */ - xsmall = model->LTRAtd; - xmid = 0.5 * (xbig + xsmall); - y1small = LTRArlcH2Func(xsmall, model->LTRAtd, model->LTRAalpha, model->LTRAbeta); - y2small = LTRArlcH3dashFunc(xsmall, model->LTRAtd, model->LTRAbeta, model->LTRAbeta); - iters = 0; - for (;;) { - - iters++; - y1big = LTRArlcH2Func(xbig, model->LTRAtd, model->LTRAalpha, model->LTRAbeta); - y1mid = LTRArlcH2Func(xmid, model->LTRAtd, model->LTRAalpha, model->LTRAbeta); - y2big = LTRArlcH3dashFunc(xbig, model->LTRAtd, model->LTRAbeta, model->LTRAbeta); - y2mid = LTRArlcH3dashFunc(xmid, model->LTRAtd, model->LTRAbeta, model->LTRAbeta); - done = - LTRAstraightLineCheck(xbig, y1big, xmid, y1mid, xsmall, - y1small, model->LTRAstLineReltol, - model->LTRAstLineAbstol) + - LTRAstraightLineCheck(xbig, y1big, xmid, y1mid, xsmall, - y1small, model->LTRAstLineReltol, - model->LTRAstLineAbstol); - if ((done == 2) || (iters > maxiter)) - break; - xbig = xmid; - xmid = 0.5 * (xbig + xsmall); - } - model->LTRAmaxSafeStep = xbig - model->LTRAtd; - } - break; - - case LTRA_MOD_RC: - model->LTRAcByR = model->LTRAcapac / model->LTRAresist; - model->LTRArclsqr = model->LTRAresist * model->LTRAcapac - * model->LTRAlength * model->LTRAlength; - model->LTRAintH1dash = 0.0; - model->LTRAintH2 = 1.0; - model->LTRAintH3dash = 0.0; - - model->LTRAh1dashCoeffs = NULL; - model->LTRAh2Coeffs = NULL; - model->LTRAh3dashCoeffs = NULL; - - break; - - case LTRA_MOD_RG: - break; - - default: - return (E_BADPARM); - } - - /* loop through all the instances of the model */ - for (here = LTRAinstances(model); here != NULL; - here = LTRAnextInstance(here)) { - - here->LTRAv1 = NULL; - here->LTRAi1 = NULL; - here->LTRAv2 = NULL; - here->LTRAi2 = NULL; - } - } - return (OK); -} diff --git a/src/spicelib/devices/ltra/ltratrun.c b/src/spicelib/devices/ltra/ltratrun.c deleted file mode 100644 index 0332d65f3..000000000 --- a/src/spicelib/devices/ltra/ltratrun.c +++ /dev/null @@ -1,196 +0,0 @@ -/********** -Copyright 1990 Regents of the University of California. All rights reserved. -Author: 1990 Jaijeet S. Roychowdhury -**********/ - -#include "ngspice/ngspice.h" -#include "ngspice/cktdefs.h" -#include "ltradefs.h" -#include "ngspice/sperror.h" -#include "ngspice/suffix.h" - -int -LTRAtrunc(GENmodel *inModel, CKTcircuit *ckt, double *timeStep) - -{ - LTRAmodel *model = (LTRAmodel *) inModel; - LTRAinstance *here; - double i1, i2, i3, i4; - double i5, i6, d1, d2, d3, d4; - double tmp; - double tolerance; - double current_lte=0.0; - int maxiter = 2, iterations = 0; - double x, y, change, deriv, deriv_delta; - - /* loop through all the transmission line models */ - for (; model != NULL; model = LTRAnextModel(model)) { - /* loop through all the instances of the model */ - for (here = LTRAinstances(model); here != NULL; - here = LTRAnextInstance(here)) { - - switch (model->LTRAspecialCase) { - - case LTRA_MOD_LC: - case LTRA_MOD_RLC: - - if (model->LTRAstepLimit == LTRA_MOD_STEPLIMIT) { - tmp = model->LTRAtd; - *timeStep = MIN(*timeStep, tmp); - } else { - i1 = ((*(ckt->CKTrhsOld + here->LTRAposNode2) - - *(ckt->CKTrhsOld + here->LTRAnegNode2)) - * model->LTRAadmit + *(ckt->CKTrhsOld + here->LTRAbrEq2)) - * model->LTRAattenuation; - i2 = (*(here->LTRAv2 + ckt->CKTtimeIndex) * - model->LTRAadmit + *(here->LTRAi2 + ckt->CKTtimeIndex)) - * model->LTRAattenuation; - i3 = (*(here->LTRAv2 + ckt->CKTtimeIndex - 1) * model->LTRAadmit + - *(here->LTRAi2 + ckt->CKTtimeIndex - 1)) - * model->LTRAattenuation; - i4 = ((*(ckt->CKTrhsOld + here->LTRAposNode1) - - *(ckt->CKTrhsOld + here->LTRAnegNode1)) - * model->LTRAadmit + *(ckt->CKTrhsOld + here->LTRAbrEq1)) - * model->LTRAattenuation; - i5 = (*(here->LTRAv1 + ckt->CKTtimeIndex) * model->LTRAadmit + - *(here->LTRAi1 + ckt->CKTtimeIndex)) - * model->LTRAattenuation; - i6 = (*(here->LTRAv1 + ckt->CKTtimeIndex - 1) * model->LTRAadmit + - *(here->LTRAi1 + ckt->CKTtimeIndex - 1)) - * model->LTRAattenuation; - /* - * d1 = (i1-i2)/ckt->CKTdeltaOld[1]; d2 = - * (i2-i3)/ckt->CKTdeltaOld[2]; d3 = (i4-i5)/ckt->CKTdeltaOld[1]; - * d4 = (i5-i6)/ckt->CKTdeltaOld[2]; - */ - d1 = (i1 - i2) / (ckt->CKTtime - *(ckt->CKTtimePoints + - ckt->CKTtimeIndex)); - d2 = (i2 - i3) / (*(ckt->CKTtimePoints + ckt->CKTtimeIndex) - - *(ckt->CKTtimePoints + ckt->CKTtimeIndex - 1)); - d3 = (i4 - i5) / (ckt->CKTtime - *(ckt->CKTtimePoints + - ckt->CKTtimeIndex)); - d4 = (i5 - i6) / (*(ckt->CKTtimePoints + ckt->CKTtimeIndex) - - *(ckt->CKTtimePoints + ckt->CKTtimeIndex - 1)); - - if ((fabs(d1 - d2) >= model->LTRAreltol * MAX(fabs(d1), fabs(d2)) + - model->LTRAabstol) || - (fabs(d3 - d4) >= model->LTRAreltol * MAX(fabs(d3), fabs(d4)) + - model->LTRAabstol)) { - /* derivitive changing - need to schedule after delay */ - /* the PREVIOUS point was the breakpoint */ - /* the previous timepoint plus the delay */ - - - /* - * tmp = *(ckt->CKTtimePoints + ckt->CKTtimeIndex) + - * model->LTRAtd; the work of a confused mind minus current time - * tmp -= ckt->CKTtime; - */ - - tmp = model->LTRAtd; - - *timeStep = MIN(*timeStep, tmp); - } - } - break; - - case LTRA_MOD_RC: - case LTRA_MOD_RG: - break; - - default: - return (E_BADPARM); - } - - - - - /* - * the above was for the parts of the equations that resemble the - * lossless equations. Now we need to estimate the local truncation - * error in each of the three convolution equations, and if possible - * adjust the timestep so that all of them remain within some bound. - * Unfortunately, the expression for the LTE in a convolution operation - * is complicated and costly to evaluate; in addition, no explicit - * inverse exists. - * - * So what we do here (for the moment) is check to see the current error - * is acceptable. If so, the timestep is not changed. If not, then an - * estimate is made for the new timestep using a few iterations of the - * newton-raphson method. - * - * modification: we change the timestep to half its previous value - */ - - if ((model->LTRAspecialCase == LTRA_MOD_RLC) && - (!model->LTRAtruncDontCut)) { - *timeStep = MIN(*timeStep, model->LTRAmaxSafeStep); - } - if (model->LTRAlteConType != LTRA_MOD_NOCONTROL) { - switch (model->LTRAspecialCase) { - - case LTRA_MOD_RLC: - case LTRA_MOD_RC: - tolerance = ckt->CKTtrtol * (ckt->CKTreltol * ( - fabs(here->LTRAinput1) + fabs(here->LTRAinput2)) - + ckt->CKTabstol); - - current_lte = LTRAlteCalculate(ckt, (GENmodel *) model, - (GENinstance *) here, ckt->CKTtime); - - if (current_lte >= tolerance) { - if (model->LTRAtruncNR) { - - x = ckt->CKTtime; - y = current_lte; - for (;;) { - deriv_delta = 0.01 * (x - *(ckt->CKTtimePoints + - ckt->CKTtimeIndex)); - -#ifdef LTRADEBUG - if (deriv_delta <= 0.0) - fprintf(stdout, "LTRAtrunc: error: timestep is now less than zero\n"); -#endif - deriv = LTRAlteCalculate(ckt, (GENmodel *) model, - (GENinstance *) here, - x + deriv_delta) - y; - deriv /= deriv_delta; - change = (tolerance - y) / deriv; - x += change; - if (maxiter == 0) { - if (fabs(change) <= fabs(deriv_delta)) - break; - } else { - iterations++; - if (iterations >= maxiter) - break; - } - y = LTRAlteCalculate(ckt, (GENmodel *) model, - (GENinstance *) here, x); - } - - tmp = x - *(ckt->CKTtimePoints + ckt->CKTtimeIndex); - *timeStep = MIN(*timeStep, tmp); - } else - *timeStep *= 0.5; - } - break; - - case LTRA_MOD_RG: - case LTRA_MOD_LC: - break; - - default: - return (E_BADPARM); - } - } - } -#ifdef LTRADEBUG - if (*timeStep >= model->LTRAtd) { - fprintf(stdout, "LTRAtrunc: Warning: Timestep bigger than delay of line %s\n", model->LTRAmodName); - fflush(stdout); - } -#endif - } - return (OK); -} diff --git a/src/spicelib/devices/mes/Makefile.am b/src/spicelib/devices/mes/Makefile.am deleted file mode 100644 index a802bd9d0..000000000 --- a/src/spicelib/devices/mes/Makefile.am +++ /dev/null @@ -1,31 +0,0 @@ -## Process this file with automake to produce Makefile.in - -noinst_LTLIBRARIES = libmes.la - -libmes_la_SOURCES = \ - mes.c \ - mesacl.c \ - mesask.c \ - mesdefs.h \ - mesdisto.c \ - mesdset.c \ - mesext.h \ - mesgetic.c \ - mesinit.c \ - mesinit.h \ - mesitf.h \ - mesload.c \ - mesmask.c \ - mesmpar.c \ - mesnoise.c \ - mesparam.c \ - mespzld.c \ - messetup.c \ - mestemp.c \ - mestrunc.c - - - -AM_CPPFLAGS = @AM_CPPFLAGS@ -I$(top_srcdir)/src/include -AM_CFLAGS = $(STATIC) -MAINTAINERCLEANFILES = Makefile.in diff --git a/src/spicelib/devices/mes/mes.c b/src/spicelib/devices/mes/mes.c deleted file mode 100644 index 493069642..000000000 --- a/src/spicelib/devices/mes/mes.c +++ /dev/null @@ -1,76 +0,0 @@ -/********** -Copyright 1990 Regents of the University of California. All rights reserved. -Author: 1987 Thomas L. Quarles -**********/ - -#include "ngspice/ngspice.h" -#include "ngspice/ifsim.h" -#include "ngspice/devdefs.h" -#include "mesdefs.h" -#include "ngspice/suffix.h" - -IFparm MESpTable[] = { /* parameters */ - OPU("off", MES_OFF, IF_FLAG ,"Device initially off"), - IOPU("area", MES_AREA, IF_REAL ,"Area factor"), - IOPUR("m", MES_AREA, IF_REAL ,"Parallel Multiplier"), - IOPAU("icvds", MES_IC_VDS, IF_REAL ,"Initial D-S voltage"), - IOPAU("icvgs", MES_IC_VGS, IF_REAL ,"Initial G-S voltage"), - OPU("dnode", MES_DRAINNODE, IF_INTEGER,"Number of drain node"), - OPU("gnode", MES_GATENODE, IF_INTEGER,"Number of gate node"), - OPU("snode", MES_SOURCENODE, IF_INTEGER,"Number of source node"), - OPU("dprimenode",MES_DRAINPRIMENODE,IF_INTEGER,"Number of internal drain node"), - OPU("sprimenode",MES_SOURCEPRIMENODE,IF_INTEGER, - "Number of internal source node"), - OP("vgs", MES_VGS, IF_REAL,"Gate-Source voltage"), - OP("vgd", MES_VGD, IF_REAL,"Gate-Drain voltage"), - OP("cg", MES_CG, IF_REAL,"Gate capacitance"), - OP("cd", MES_CD, IF_REAL,"Drain capacitance"), - OP("cgd", MES_CGD, IF_REAL,"Gate-Drain capacitance"), - OP("gm", MES_GM, IF_REAL,"Transconductance"), - OP("gds", MES_GDS, IF_REAL,"Drain-Source conductance"), - OP("ggs", MES_GGS, IF_REAL,"Gate-Source conductance"), - OP("ggd", MES_GGD, IF_REAL,"Gate-Drain conductance"), - OP("cqgs", MES_CQGS, IF_REAL,"Capacitance due to gate-source charge storage"), - OP("cqgd", MES_CQGD, IF_REAL,"Capacitance due to gate-drain charge storage"), - OPU("qgs", MES_QGS, IF_REAL,"Gate-Source charge storage"), - OPU("qgd", MES_QGD, IF_REAL,"Gate-Drain charge storage"), - OP("is", MES_CS, IF_REAL ,"Source current"), - OP("p", MES_POWER, IF_REAL ,"Power dissipated by the mesfet") -}; - -IFparm MESmPTable[] = { /* model parameters */ - OP( "type", MES_MOD_TYPE, IF_FLAG,"N-type or P-type MESfet model"), - IP( "nmf", MES_MOD_NMF, IF_FLAG,"N type MESfet model"), - IP( "pmf", MES_MOD_PMF, IF_FLAG,"P type MESfet model"), - IOP( "vt0", MES_MOD_VTO, IF_REAL,"Pinch-off voltage"), - IOPR( "vto", MES_MOD_VTO, IF_REAL,"Pinch-off voltage"), - IOP( "alpha", MES_MOD_ALPHA, IF_REAL,"Saturation voltage parameter"), - IOP( "beta", MES_MOD_BETA, IF_REAL,"Transconductance parameter"), - IOP( "lambda", MES_MOD_LAMBDA, IF_REAL,"Channel length modulation parm."), - IOP( "b", MES_MOD_B, IF_REAL,"Doping tail extending parameter"), - IOP( "rd", MES_MOD_RD, IF_REAL,"Drain ohmic resistance"), - OPU( "gd", MES_MOD_DRAINCONDUCT, IF_REAL,"Drain conductance"), - IOP( "rs", MES_MOD_RS, IF_REAL,"Source ohmic resistance"), - OPU( "gs", MES_MOD_SOURCECONDUCT, IF_REAL,"Source conductance"), - IOPA( "cgs", MES_MOD_CGS, IF_REAL,"G-S junction capacitance"), - IOPA( "cgd", MES_MOD_CGD, IF_REAL,"G-D junction capacitance"), - IOP( "pb", MES_MOD_PB, IF_REAL,"Gate junction potential"), - IOP( "is", MES_MOD_IS, IF_REAL,"Junction saturation current"), - IOP( "fc", MES_MOD_FC, IF_REAL,"Forward bias junction fit parm."), - OP( "depl_cap", MES_MOD_DEPLETIONCAP, IF_REAL,"Depletion capacitance"), - OP( "vcrit", MES_MOD_VCRIT, IF_REAL,"Critical voltage"), - IOP("kf", MES_MOD_KF, IF_REAL,"Flicker noise coefficient"), - IOP("af", MES_MOD_AF, IF_REAL,"Flicker noise exponent") -}; - -char *MESnames[] = { - "Drain", - "Gate", - "Source" -}; - -int MESnSize = NUMELEMS(MESnames); -int MESpTSize = NUMELEMS(MESpTable); -int MESmPTSize = NUMELEMS(MESmPTable); -int MESiSize = sizeof(MESinstance); -int MESmSize = sizeof(MESmodel); diff --git a/src/spicelib/devices/mes/mesacl.c b/src/spicelib/devices/mes/mesacl.c deleted file mode 100644 index dda311fc2..000000000 --- a/src/spicelib/devices/mes/mesacl.c +++ /dev/null @@ -1,72 +0,0 @@ -/********** -Copyright 1990 Regents of the University of California. All rights reserved. -Author: 1985 S. Hwang -**********/ -/* - */ - -#include "ngspice/ngspice.h" -#include "ngspice/cktdefs.h" -#include "mesdefs.h" -#include "ngspice/sperror.h" -#include "ngspice/suffix.h" - - -int -MESacLoad(GENmodel *inModel, CKTcircuit *ckt) -{ - MESmodel *model = (MESmodel*)inModel; - MESinstance *here; - double gdpr; - double gspr; - double gm; - double gds; - double ggs; - double xgs; - double ggd; - double xgd; - - double m; - - for( ; model != NULL; model = MESnextModel(model)) { - - for( here = MESinstances(model); here != NULL; - here = MESnextInstance(here)) { - - m = here->MESm; - - gdpr=model->MESdrainConduct * here->MESarea; - gspr=model->MESsourceConduct * here->MESarea; - gm= *(ckt->CKTstate0 + here->MESgm) ; - gds= *(ckt->CKTstate0 + here->MESgds) ; - ggs= *(ckt->CKTstate0 + here->MESggs) ; - xgs= *(ckt->CKTstate0 + here->MESqgs) * ckt->CKTomega ; - ggd= *(ckt->CKTstate0 + here->MESggd) ; - xgd= *(ckt->CKTstate0 + here->MESqgd) * ckt->CKTomega ; - *(here->MESdrainDrainPtr ) += m * (gdpr); - *(here->MESgateGatePtr ) += m * (ggd+ggs); - *(here->MESgateGatePtr +1) += m * (xgd+xgs); - *(here->MESsourceSourcePtr ) += m * (gspr); - *(here->MESdrainPrimeDrainPrimePtr ) += m * (gdpr+gds+ggd); - *(here->MESdrainPrimeDrainPrimePtr +1) += m * (xgd); - *(here->MESsourcePrimeSourcePrimePtr ) += m * (gspr+gds+gm+ggs); - *(here->MESsourcePrimeSourcePrimePtr +1) += m * (xgs); - *(here->MESdrainDrainPrimePtr ) -= m * (gdpr); - *(here->MESgateDrainPrimePtr ) -= m * (ggd); - *(here->MESgateDrainPrimePtr +1) -= m * (xgd); - *(here->MESgateSourcePrimePtr ) -= m * (ggs); - *(here->MESgateSourcePrimePtr +1) -= m * (xgs); - *(here->MESsourceSourcePrimePtr ) -= m * (gspr); - *(here->MESdrainPrimeDrainPtr ) -= m * (gdpr); - *(here->MESdrainPrimeGatePtr ) += m * (-ggd+gm); - *(here->MESdrainPrimeGatePtr +1) -= m * (xgd); - *(here->MESdrainPrimeSourcePrimePtr ) += m * (-gds-gm); - *(here->MESsourcePrimeGatePtr ) += m * (-ggs-gm); - *(here->MESsourcePrimeGatePtr +1) -= m * (xgs); - *(here->MESsourcePrimeSourcePtr ) -= m * (gspr); - *(here->MESsourcePrimeDrainPrimePtr ) -= m * (gds); - - } - } - return(OK); -} diff --git a/src/spicelib/devices/mes/mesask.c b/src/spicelib/devices/mes/mesask.c deleted file mode 100644 index 08707db02..000000000 --- a/src/spicelib/devices/mes/mesask.c +++ /dev/null @@ -1,135 +0,0 @@ -/********** -Copyright 1990 Regents of the University of California. All rights reserved. -Author: 1987 Thomas L. Quarles -**********/ -/* - */ - -#include "ngspice/ngspice.h" -#include "ngspice/cktdefs.h" -#include "ngspice/devdefs.h" -#include "ngspice/ifsim.h" -#include "mesdefs.h" -#include "ngspice/sperror.h" -#include "ngspice/suffix.h" - - -/* ARGSUSED */ -int -MESask(CKTcircuit *ckt, GENinstance *inst, int which, IFvalue *value, IFvalue *select) -{ - MESinstance *here = (MESinstance*)inst; - static char *msg = "Current and power not available in ac analysis"; - - NG_IGNORE(select); - - switch(which) { - case MES_AREA: - value->rValue = here->MESarea; - value->rValue *= here->MESm; - return (OK); - case MES_IC_VDS: - value->rValue = here->MESicVDS; - return (OK); - case MES_IC_VGS: - value->rValue = here->MESicVGS; - return (OK); - case MES_OFF: - value->iValue = here->MESoff; - return (OK); - case MES_DRAINNODE: - value->iValue = here->MESdrainNode; - return (OK); - case MES_GATENODE: - value->iValue = here->MESgateNode; - return (OK); - case MES_SOURCENODE: - value->iValue = here->MESsourceNode; - return (OK); - case MES_DRAINPRIMENODE: - value->iValue = here->MESdrainPrimeNode; - return (OK); - case MES_VGS: - value->rValue = *(ckt->CKTstate0 + here->MESvgs); - return (OK); - case MES_VGD: - value->rValue = *(ckt->CKTstate0 + here->MESvgd); - return (OK); - case MES_CG: - value->rValue = *(ckt->CKTstate0 + here->MEScg); - value->rValue *= here->MESm; - return (OK); - case MES_CD: - value->rValue = *(ckt->CKTstate0 + here->MEScd); - value->rValue *= here->MESm; - return (OK); - case MES_CGD: - value->rValue = *(ckt->CKTstate0 + here->MEScgd); - value->rValue *= here->MESm; - return (OK); - case MES_GM: - value->rValue = *(ckt->CKTstate0 + here->MESgm); - value->rValue *= here->MESm; - return (OK); - case MES_GDS: - value->rValue = *(ckt->CKTstate0 + here->MESgds); - value->rValue *= here->MESm; - return (OK); - case MES_GGS: - value->rValue = *(ckt->CKTstate0 + here->MESggs); - value->rValue *= here->MESm; - return (OK); - case MES_GGD: - value->rValue = *(ckt->CKTstate0 + here->MESggd); - value->rValue *= here->MESm; - return (OK); - case MES_QGS: - value->rValue = *(ckt->CKTstate0 + here->MESqgs); - value->rValue *= here->MESm; - return (OK); - case MES_CQGS: - value->rValue = *(ckt->CKTstate0 + here->MEScqgs); - value->rValue *= here->MESm; - return (OK); - case MES_QGD: - value->rValue = *(ckt->CKTstate0 + here->MESqgd); - value->rValue *= here->MESm; - return (OK); - case MES_CQGD: - value->rValue = *(ckt->CKTstate0 + here->MEScqgd); - value->rValue *= here->MESm; - return (OK); - case MES_CS : - if (ckt->CKTcurrentAnalysis & DOING_AC) { - errMsg = TMALLOC(char, strlen(msg) + 1); - errRtn = "MESask"; - strcpy(errMsg,msg); - return(E_ASKCURRENT); - } else { - value->rValue = -*(ckt->CKTstate0 + here->MEScd); - value->rValue -= *(ckt->CKTstate0 + here->MEScg); - value->rValue *= here->MESm; - } - return(OK); - case MES_POWER : - if (ckt->CKTcurrentAnalysis & DOING_AC) { - errMsg = TMALLOC(char, strlen(msg) + 1); - errRtn = "MESask"; - strcpy(errMsg,msg); - return(E_ASKPOWER); - } else { - value->rValue = *(ckt->CKTstate0 + here->MEScd) * - *(ckt->CKTrhsOld + here->MESdrainNode); - value->rValue += *(ckt->CKTstate0 + here->MEScg) * - *(ckt->CKTrhsOld + here->MESgateNode); - value->rValue -= (*(ckt->CKTstate0+here->MEScd) + - *(ckt->CKTstate0 + here->MEScg)) * - *(ckt->CKTrhsOld + here->MESsourceNode); - value->rValue *= here->MESm; - } - return(OK); - default: - return (E_BADPARM); - } - /* NOTREACHED */ -} diff --git a/src/spicelib/devices/mes/mesdefs.h b/src/spicelib/devices/mes/mesdefs.h deleted file mode 100644 index 89ad77c24..000000000 --- a/src/spicelib/devices/mes/mesdefs.h +++ /dev/null @@ -1,293 +0,0 @@ -/********** -Copyright 1990 Regents of the University of California. All rights reserved. -Author: 1985 S. Hwang -**********/ - -#ifndef MES -#define MES - -#include "ngspice/ifsim.h" -#include "ngspice/cktdefs.h" -#include "ngspice/gendefs.h" -#include "ngspice/complex.h" -#include "ngspice/noisedef.h" - -#define MESnumStates 13 - - /* structures used to describe MESFET Transistors */ - -/* indices to the array of MESFET noise sources */ - -enum { - MESRDNOIZ = 0, - MESRSNOIZ, - MESIDNOIZ, - MESFLNOIZ, - MESTOTNOIZ, - /* finally, the number of noise sources */ - MESNSRCS -}; - -/* information used to describe a single instance */ - -typedef struct sMESinstance { - - struct GENinstance gen; - -#define MESmodPtr(inst) ((struct sMESmodel *)((inst)->gen.GENmodPtr)) -#define MESnextInstance(inst) ((struct sMESinstance *)((inst)->gen.GENnextInstance)) -#define MESname gen.GENname -#define MESstate gen.GENstate - - const int MESdrainNode; /* number of drain node of mesfet */ - const int MESgateNode; /* number of gate node of mesfet */ - const int MESsourceNode; /* number of source node of mesfet */ - int MESdrainPrimeNode; /* number of internal drain node of mesfet */ - int MESsourcePrimeNode; /* number of internal source node of mesfet */ - - double MESarea; /* area factor for the mesfet */ - double MESm; /* Parallel multiplier */ - double MESicVDS; /* initial condition voltage D-S*/ - double MESicVGS; /* initial condition voltage G-S*/ - double *MESdrainDrainPrimePtr; /* pointer to sparse matrix at - * (drain,drain prime) */ - double *MESgateDrainPrimePtr; /* pointer to sparse matrix at - * (gate,drain prime) */ - double *MESgateSourcePrimePtr; /* pointer to sparse matrix at - * (gate,source prime) */ - double *MESsourceSourcePrimePtr; /* pointer to sparse matrix at - * (source,source prime) */ - double *MESdrainPrimeDrainPtr; /* pointer to sparse matrix at - * (drain prime,drain) */ - double *MESdrainPrimeGatePtr; /* pointer to sparse matrix at - * (drain prime,gate) */ - double *MESdrainPrimeSourcePrimePtr; /* pointer to sparse matrix - * (drain prime,source prime) */ - double *MESsourcePrimeGatePtr; /* pointer to sparse matrix at - * (source prime,gate) */ - double *MESsourcePrimeSourcePtr; /* pointer to sparse matrix at - * (source prime,source) */ - double *MESsourcePrimeDrainPrimePtr; /* pointer to sparse matrix - * (source prime,drain prime) */ - double *MESdrainDrainPtr; /* pointer to sparse matrix at - * (drain,drain) */ - double *MESgateGatePtr; /* pointer to sparse matrix at - * (gate,gate) */ - double *MESsourceSourcePtr; /* pointer to sparse matrix at - * (source,source) */ - double *MESdrainPrimeDrainPrimePtr; /* pointer to sparse matrix - * (drain prime,drain prime) */ - double *MESsourcePrimeSourcePrimePtr; /* pointer to sparse matrix - * (source prime,source prime) */ - - int MESoff; /* 'off' flag for mesfet */ - unsigned MESareaGiven : 1; /* flag to indicate area was specified */ - unsigned MESmGiven : 1; /* flag to indicate multiplier specified*/ - unsigned MESicVDSGiven : 1; /* initial condition given flag for V D-S*/ - unsigned MESicVGSGiven : 1; /* initial condition given flag for V G-S*/ - -int MESmode; - -/* - * naming convention: - * x = vgs - * y = vgd - * z = vds - * cdr = cdrain - */ - -#define MESNDCOEFFS 27 - -#ifndef NODISTO - double MESdCoeffs[MESNDCOEFFS]; -#else /* NODISTO */ - double *MESdCoeffs; -#endif /* NODISTO */ - -#ifndef CONFIG - -#define cdr_x MESdCoeffs[0] -#define cdr_z MESdCoeffs[1] -#define cdr_x2 MESdCoeffs[2] -#define cdr_z2 MESdCoeffs[3] -#define cdr_xz MESdCoeffs[4] -#define cdr_x3 MESdCoeffs[5] -#define cdr_z3 MESdCoeffs[6] -#define cdr_x2z MESdCoeffs[7] -#define cdr_xz2 MESdCoeffs[8] - -#define ggs3 MESdCoeffs[9] -#define ggd3 MESdCoeffs[10] -#define ggs2 MESdCoeffs[11] -#define ggd2 MESdCoeffs[12] - -#define qgs_x2 MESdCoeffs[13] -#define qgs_y2 MESdCoeffs[14] -#define qgs_xy MESdCoeffs[15] -#define qgs_x3 MESdCoeffs[16] -#define qgs_y3 MESdCoeffs[17] -#define qgs_x2y MESdCoeffs[18] -#define qgs_xy2 MESdCoeffs[19] - -#define qgd_x2 MESdCoeffs[20] -#define qgd_y2 MESdCoeffs[21] -#define qgd_xy MESdCoeffs[22] -#define qgd_x3 MESdCoeffs[23] -#define qgd_y3 MESdCoeffs[24] -#define qgd_x2y MESdCoeffs[25] -#define qgd_xy2 MESdCoeffs[26] - -#endif - -#ifndef NONOISE - double MESnVar[NSTATVARS][MESNSRCS]; -#else /* NONOISE */ - double **MESnVar; -#endif /* NONOISE */ - -} MESinstance ; - -#define MESvgs MESstate -#define MESvgd MESstate+1 -#define MEScg MESstate+2 -#define MEScd MESstate+3 -#define MEScgd MESstate+4 -#define MESgm MESstate+5 -#define MESgds MESstate+6 -#define MESggs MESstate+7 -#define MESggd MESstate+8 -#define MESqgs MESstate+9 -#define MEScqgs MESstate+10 -#define MESqgd MESstate+11 -#define MEScqgd MESstate+12 - - -/* per model data */ - -typedef struct sMESmodel { /* model structure for a mesfet */ - - struct GENmodel gen; - -#define MESmodType gen.GENmodType -#define MESnextModel(inst) ((struct sMESmodel *)((inst)->gen.GENnextModel)) -#define MESinstances(inst) ((MESinstance *)((inst)->gen.GENinstances)) -#define MESmodName gen.GENmodName - - int MEStype; - - double MESthreshold; - double MESalpha; - double MESbeta; - double MESlModulation; - double MESb; - double MESdrainResist; - double MESsourceResist; - double MEScapGS; - double MEScapGD; - double MESgatePotential; - double MESgateSatCurrent; - double MESdepletionCapCoeff; - double MESfNcoef; - double MESfNexp; - - double MESdrainConduct; - double MESsourceConduct; - double MESdepletionCap; - double MESf1; - double MESf2; - double MESf3; - double MESvcrit; - - unsigned MESthresholdGiven : 1; - unsigned MESalphaGiven : 1; - unsigned MESbetaGiven : 1; - unsigned MESlModulationGiven : 1; - unsigned MESbGiven : 1; - unsigned MESdrainResistGiven : 1; - unsigned MESsourceResistGiven : 1; - unsigned MEScapGSGiven : 1; - unsigned MEScapGDGiven : 1; - unsigned MESgatePotentialGiven : 1; - unsigned MESgateSatCurrentGiven : 1; - unsigned MESdepletionCapCoeffGiven : 1; - unsigned MESfNcoefGiven : 1; - unsigned MESfNexpGiven : 1; - - -} MESmodel; - -#ifndef NMF - -#define NMF 1 -#define PMF -1 - -#endif /*NMF*/ - -/* device parameters */ -enum { - MES_AREA = 1, - MES_IC_VDS, - MES_IC_VGS, - MES_IC, - MES_OFF, - MES_CS, - MES_POWER, - MES_M, -}; - -/* model parameters */ -enum { - MES_MOD_VTO = 101, - MES_MOD_ALPHA, - MES_MOD_BETA, - MES_MOD_LAMBDA, - MES_MOD_B, - MES_MOD_RD, - MES_MOD_RS, - MES_MOD_CGS, - MES_MOD_CGD, - MES_MOD_PB, - MES_MOD_IS, - MES_MOD_FC, - MES_MOD_NMF, - MES_MOD_PMF, - MES_MOD_KF, - MES_MOD_AF, -}; - -/* device questions */ - -enum { - MES_DRAINNODE = 201, - MES_GATENODE, - MES_SOURCENODE, - MES_DRAINPRIMENODE, - MES_SOURCEPRIMENODE, - MES_VGS, - MES_VGD, - MES_CG, - MES_CD, - MES_CGD, - MES_GM, - MES_GDS, - MES_GGS, - MES_GGD, - MES_QGS, - MES_CQGS, - MES_QGD, - MES_CQGD, -}; - -/* model questions */ - -enum { - MES_MOD_DRAINCONDUCT = 301, - MES_MOD_SOURCECONDUCT, - MES_MOD_DEPLETIONCAP, - MES_MOD_VCRIT, - MES_MOD_TYPE, -}; - -#include "mesext.h" - -#endif /*MES*/ diff --git a/src/spicelib/devices/mes/mesdisto.c b/src/spicelib/devices/mes/mesdisto.c deleted file mode 100644 index 62567542d..000000000 --- a/src/spicelib/devices/mes/mesdisto.c +++ /dev/null @@ -1,1209 +0,0 @@ -/********** -Copyright 1990 Regents of the University of California. All rights reserved. -Author: 1988 Jaijeet S Roychowdhury -**********/ - -#include "ngspice/ngspice.h" -#include "ngspice/cktdefs.h" -#include "mesdefs.h" -#include "ngspice/sperror.h" -#include "ngspice/distodef.h" -#include "ngspice/suffix.h" - -int -MESdisto(int mode,GENmodel *genmodel, CKTcircuit *ckt) -/* assuming here that ckt->CKTomega has been initialised to - * the correct value - */ -{ - MESmodel *model = (MESmodel *) genmodel; - DISTOAN* job = (DISTOAN*) ckt->CKTcurJob; - DpassStr pass; - double r1h1x,i1h1x; - double r1h1y,i1h1y; - double r1h2x, i1h2x; - double r1h2y, i1h2y; - double r1hm2x,i1hm2x; - double r1hm2y,i1hm2y; - double r2h11x,i2h11x; - double r2h11y,i2h11y; - double r2h1m2x,i2h1m2x; - double r2h1m2y,i2h1m2y; - double temp, itemp; - MESinstance *here; - -if (mode == D_SETUP) - return(MESdSetup(genmodel,ckt)); /* AFN: Oh what a wonderful thing!!! */ - -if ((mode == D_TWOF1) || (mode == D_THRF1) || - (mode == D_F1PF2) || (mode == D_F1MF2) || - (mode == D_2F1MF2)) { - - /* loop through all the MES models */ -for( ; model != NULL; model = MESnextModel(model)) { - - /* loop through all the instances of the model */ - for (here = MESinstances(model); here != NULL ; - here=MESnextInstance(here)) { - - /* loading starts here */ - - switch (mode) { - case D_TWOF1: - /* x = vgs, y = vds */ - - /* getting first order (linear) Volterra kernel */ - r1h1x = *(job->r1H1ptr + (here->MESgateNode)) - - *(job->r1H1ptr + (here->MESsourcePrimeNode)); - i1h1x = *(job->i1H1ptr + (here->MESgateNode)) - - *(job->i1H1ptr + (here->MESsourcePrimeNode)); - - r1h1y = *(job->r1H1ptr + (here->MESdrainPrimeNode)) - - *(job->r1H1ptr + (here->MESsourcePrimeNode)); - i1h1y = *(job->i1H1ptr + (here->MESdrainPrimeNode)) - - *(job->i1H1ptr + (here->MESsourcePrimeNode)); - - - /* loading starts here */ - /* loading cdrain term */ - - temp = DFn2F1(here->cdr_x2, - here->cdr_z2, - 0.0, - here->cdr_xz, - 0.0, - 0.0, - r1h1x, - i1h1x, - r1h1y, - i1h1y, - 0.0, - 0.0); - - itemp = DFi2F1(here->cdr_x2, - here->cdr_z2, - 0.0, - here->cdr_xz, - 0.0, - 0.0, - r1h1x, - i1h1x, - r1h1y, - i1h1y, - 0.0, - 0.0); - - *(ckt->CKTrhs + (here->MESdrainPrimeNode)) -= temp; - *(ckt->CKTirhs + (here->MESdrainPrimeNode)) -= itemp; - *(ckt->CKTrhs + (here->MESsourcePrimeNode)) += temp; - *(ckt->CKTirhs + (here->MESsourcePrimeNode)) += itemp; - - /* cdrain term over */ - - /* loading ggs term */ - - temp = D1n2F1(here->ggs2, - r1h1x, - i1h1x); - - itemp = D1i2F1(here->ggs2, - r1h1x, - i1h1x); - - - *(ckt->CKTrhs + (here->MESgateNode)) -= temp; - *(ckt->CKTirhs + (here->MESgateNode)) -= itemp; - *(ckt->CKTrhs + (here->MESsourcePrimeNode)) += temp; - *(ckt->CKTirhs + (here->MESsourcePrimeNode)) += itemp; - - /* ggs over */ - - /* loading ggd term */ - - temp = D1n2F1(here->ggd2, - r1h1x - r1h1y, - i1h1x - i1h1y); - - itemp = D1i2F1(here->ggd2, - r1h1x - r1h1y, - i1h1x - i1h1y); - - - *(ckt->CKTrhs + (here->MESgateNode)) -= temp; - *(ckt->CKTirhs + (here->MESgateNode)) -= itemp; - *(ckt->CKTrhs + (here->MESdrainPrimeNode)) += temp; - *(ckt->CKTirhs + (here->MESdrainPrimeNode)) += itemp; - - /* ggd over */ - - /* loading qgs term */ - - temp = -ckt->CKTomega * - DFi2F1(here->qgs_x2, - here->qgs_y2, - 0.0, - here->qgs_xy, - 0.0, - 0.0, - r1h1x, - i1h1x, - r1h1x - r1h1y, - i1h1x - i1h1y, - 0.0, - 0.0); - - itemp = ckt->CKTomega* - DFn2F1(here->qgs_x2, - here->qgs_y2, - 0.0, - here->qgs_xy, - 0.0, - 0.0, - r1h1x, - i1h1x, - r1h1x - r1h1y, - i1h1x - i1h1y, - 0.0, - 0.0); - - *(ckt->CKTrhs + (here->MESgateNode)) -= temp; - *(ckt->CKTirhs + (here->MESgateNode)) -= itemp; - *(ckt->CKTrhs + (here->MESsourcePrimeNode)) += temp; - *(ckt->CKTirhs + (here->MESsourcePrimeNode)) += itemp; - - /* qgs term over */ - - /* loading qgd term */ - - temp = -ckt->CKTomega * - DFi2F1(here->qgd_x2, - here->qgd_y2, - 0.0, - here->qgd_xy, - 0.0, - 0.0, - r1h1x, - i1h1x, - r1h1x - r1h1y, - i1h1x - i1h1y, - 0.0, - 0.0); - - itemp = ckt->CKTomega* - DFn2F1(here->qgd_x2, - here->qgd_y2, - 0.0, - here->qgd_xy, - 0.0, - 0.0, - r1h1x, - i1h1x, - r1h1x - r1h1y, - i1h1x - i1h1y, - 0.0, - 0.0); - - *(ckt->CKTrhs + (here->MESgateNode)) -= temp; - *(ckt->CKTirhs + (here->MESgateNode)) -= itemp; - *(ckt->CKTrhs + (here->MESdrainPrimeNode)) += temp; - *(ckt->CKTirhs + (here->MESdrainPrimeNode)) += itemp; - - /* qgd term over */ - /* all done */ - - break; - - case D_THRF1: - /* x = vgs, y = vds */ - - /* getting first order (linear) Volterra kernel */ - r1h1x = *(job->r1H1ptr + (here->MESgateNode)) - - *(job->r1H1ptr + (here->MESsourcePrimeNode)); - i1h1x = *(job->i1H1ptr + (here->MESgateNode)) - - *(job->i1H1ptr + (here->MESsourcePrimeNode)); - - r1h1y = *(job->r1H1ptr + (here->MESdrainPrimeNode)) - - *(job->r1H1ptr + (here->MESsourcePrimeNode)); - i1h1y = *(job->i1H1ptr + (here->MESdrainPrimeNode)) - - *(job->i1H1ptr + (here->MESsourcePrimeNode)); - - r2h11x = *(job->r2H11ptr + (here->MESgateNode)) - - *(job->r2H11ptr + (here->MESsourcePrimeNode)); - i2h11x = *(job->i2H11ptr + (here->MESgateNode)) - - *(job->i2H11ptr + (here->MESsourcePrimeNode)); - - r2h11y = *(job->r2H11ptr + (here->MESdrainPrimeNode)) - - *(job->r2H11ptr + (here->MESsourcePrimeNode)); - i2h11y = *(job->i2H11ptr + (here->MESdrainPrimeNode)) - - *(job->i2H11ptr + (here->MESsourcePrimeNode)); - - /* loading starts here */ - /* loading cdrain term */ - - temp = DFn3F1(here->cdr_x2, - here->cdr_z2, - 0.0, - here->cdr_xz, - 0.0, - 0.0, - here->cdr_x3, - here->cdr_z3, - 0.0, - here->cdr_x2z, - 0.0, - here->cdr_xz2, - 0.0, - 0.0, - 0.0, - 0.0, - r1h1x, - i1h1x, - r1h1y, - i1h1y, - 0.0, - 0.0, - r2h11x, - i2h11x, - r2h11y, - i2h11y, - 0.0, - 0.0); - - itemp = DFi3F1(here->cdr_x2, - here->cdr_z2, - 0.0, - here->cdr_xz, - 0.0, - 0.0, - here->cdr_x3, - here->cdr_z3, - 0.0, - here->cdr_x2z, - 0.0, - here->cdr_xz2, - 0.0, - 0.0, - 0.0, - 0.0, - r1h1x, - i1h1x, - r1h1y, - i1h1y, - 0.0, - 0.0, - r2h11x, - i2h11x, - r2h11y, - i2h11y, - 0.0, - 0.0); - - *(ckt->CKTrhs + (here->MESdrainPrimeNode)) -= temp; - *(ckt->CKTirhs + (here->MESdrainPrimeNode)) -= itemp; - *(ckt->CKTrhs + (here->MESsourcePrimeNode)) += temp; - *(ckt->CKTirhs + (here->MESsourcePrimeNode)) += itemp; - - /* cdrain term over */ - - /* loading ggs term */ - - temp = D1n3F1(here->ggs2, - here->ggs3, - r1h1x, - i1h1x, - r2h11x, - i2h11x); - - itemp = D1i3F1(here->ggs2, - here->ggs3, - r1h1x, - i1h1x, - r2h11x, - i2h11x); - - - *(ckt->CKTrhs + (here->MESgateNode)) -= temp; - *(ckt->CKTirhs + (here->MESgateNode)) -= itemp; - *(ckt->CKTrhs + (here->MESsourcePrimeNode)) += temp; - *(ckt->CKTirhs + (here->MESsourcePrimeNode)) += itemp; - - /* ggs over */ - - /* loading ggd term */ - - temp = D1n3F1(here->ggd2, - here->ggd3, - r1h1x - r1h1y, - i1h1x - i1h1y, - r2h11x - r2h11y, - i2h11x - i2h11y); - - itemp = D1i3F1(here->ggd2, - here->ggd3, - r1h1x - r1h1y, - i1h1x - i1h1y, - r2h11x - r2h11y, - i2h11x - i2h11y); - - - - *(ckt->CKTrhs + (here->MESgateNode)) -= temp; - *(ckt->CKTirhs + (here->MESgateNode)) -= itemp; - *(ckt->CKTrhs + (here->MESdrainPrimeNode)) += temp; - *(ckt->CKTirhs + (here->MESdrainPrimeNode)) += itemp; - - /* ggd over */ - - /* loading qgs term */ - - temp = -ckt->CKTomega* - DFi3F1(here->qgs_x2, - here->qgs_y2, - 0.0, - here->qgs_xy, - 0.0, - 0.0, - here->qgs_x3, - here->qgs_y3, - 0.0, - here->qgs_x2y, - 0.0, - here->qgs_xy2, - 0.0, - 0.0, - 0.0, - 0.0, - r1h1x, - i1h1x, - r1h1x - r1h1y, - i1h1x - i1h1y, - 0.0, - 0.0, - r2h11x, - i2h11x, - r2h11x - r2h11y, - i2h11x - i2h11y, - 0.0, - 0.0); - - itemp =ckt->CKTomega* - DFn3F1(here->qgs_x2, - here->qgs_y2, - 0.0, - here->qgs_xy, - 0.0, - 0.0, - here->qgs_x3, - here->qgs_y3, - 0.0, - here->qgs_x2y, - 0.0, - here->qgs_xy2, - 0.0, - 0.0, - 0.0, - 0.0, - r1h1x, - i1h1x, - r1h1x - r1h1y, - i1h1x - i1h1y, - 0.0, - 0.0, - r2h11x, - i2h11x, - r2h11x - r2h11y, - i2h11x - i2h11y, - 0.0, - 0.0); - - *(ckt->CKTrhs + (here->MESgateNode)) -= temp; - *(ckt->CKTirhs + (here->MESgateNode)) -= itemp; - *(ckt->CKTrhs + (here->MESsourcePrimeNode)) += temp; - *(ckt->CKTirhs + (here->MESsourcePrimeNode)) += itemp; - - /* qgs term over */ - - /* loading qgd term */ - - temp = -ckt->CKTomega* - DFi3F1(here->qgd_x2, - here->qgd_y2, - 0.0, - here->qgd_xy, - 0.0, - 0.0, - here->qgd_x3, - here->qgd_y3, - 0.0, - here->qgd_x2y, - 0.0, - here->qgd_xy2, - 0.0, - 0.0, - 0.0, - 0.0, - r1h1x, - i1h1x, - r1h1x - r1h1y, - i1h1x - i1h1y, - 0.0, - 0.0, - r2h11x, - i2h11x, - r2h11x - r2h11y, - i2h11x - i2h11y, - 0.0, - 0.0); - - itemp =ckt->CKTomega* - DFn3F1(here->qgd_x2, - here->qgd_y2, - 0.0, - here->qgd_xy, - 0.0, - 0.0, - here->qgd_x3, - here->qgd_y3, - 0.0, - here->qgd_x2y, - 0.0, - here->qgd_xy2, - 0.0, - 0.0, - 0.0, - 0.0, - r1h1x, - i1h1x, - r1h1x - r1h1y, - i1h1x - i1h1y, - 0.0, - 0.0, - r2h11x, - i2h11x, - r2h11x - r2h11y, - i2h11x - i2h11y, - 0.0, - 0.0); - - *(ckt->CKTrhs + (here->MESgateNode)) -= temp; - *(ckt->CKTirhs + (here->MESgateNode)) -= itemp; - *(ckt->CKTrhs + (here->MESdrainPrimeNode)) += temp; - *(ckt->CKTirhs + (here->MESdrainPrimeNode)) += itemp; - - /* qgd term over */ - /* all done */ - - break; - case D_F1PF2: - /* x = vgs, y = vds */ - - /* getting first order (linear) Volterra transform */ - r1h1x = *(job->r1H1ptr + (here->MESgateNode)) - - *(job->r1H1ptr + (here->MESsourcePrimeNode)); - i1h1x = *(job->i1H1ptr + (here->MESgateNode)) - - *(job->i1H1ptr + (here->MESsourcePrimeNode)); - - r1h1y = *(job->r1H1ptr + (here->MESdrainPrimeNode)) - - *(job->r1H1ptr + (here->MESsourcePrimeNode)); - i1h1y = *(job->i1H1ptr + (here->MESdrainPrimeNode)) - - *(job->i1H1ptr + (here->MESsourcePrimeNode)); - - r1h2x = *(job->r1H2ptr + (here->MESgateNode)) - - *(job->r1H2ptr + (here->MESsourcePrimeNode)); - i1h2x = *(job->i1H2ptr + (here->MESgateNode)) - - *(job->i1H2ptr + (here->MESsourcePrimeNode)); - - r1h2y = *(job->r1H2ptr + (here->MESdrainPrimeNode)) - - *(job->r1H2ptr + (here->MESsourcePrimeNode)); - i1h2y = *(job->i1H2ptr + (here->MESdrainPrimeNode)) - - *(job->i1H2ptr + (here->MESsourcePrimeNode)); - - /* loading starts here */ - /* loading cdrain term */ - - temp = DFnF12(here->cdr_x2, - here->cdr_z2, - 0.0, - here->cdr_xz, - 0.0, - 0.0, - r1h1x, - i1h1x, - r1h1y, - i1h1y, - 0.0, - 0.0, - r1h2x, - i1h2x, - r1h2y, - i1h2y, - 0.0, - 0.0); - - itemp = DFiF12(here->cdr_x2, - here->cdr_z2, - 0.0, - here->cdr_xz, - 0.0, - 0.0, - r1h1x, - i1h1x, - r1h1y, - i1h1y, - 0.0, - 0.0, - r1h2x, - i1h2x, - r1h2y, - i1h2y, - 0.0, - 0.0); - - *(ckt->CKTrhs + (here->MESdrainPrimeNode)) -= temp; - *(ckt->CKTirhs + (here->MESdrainPrimeNode)) -= itemp; - *(ckt->CKTrhs + (here->MESsourcePrimeNode)) += temp; - *(ckt->CKTirhs + (here->MESsourcePrimeNode)) += itemp; - - /* cdrain term over */ - - /* loading ggs term */ - - temp = D1nF12(here->ggs2, - r1h1x, - i1h1x, - r1h2x, - i1h2x); - - itemp = D1iF12(here->ggs2, - r1h1x, - i1h1x, - r1h2x, - i1h2x); - - - *(ckt->CKTrhs + (here->MESgateNode)) -= temp; - *(ckt->CKTirhs + (here->MESgateNode)) -= itemp; - *(ckt->CKTrhs + (here->MESsourcePrimeNode)) += temp; - *(ckt->CKTirhs + (here->MESsourcePrimeNode)) += itemp; - - /* ggs over */ - - /* loading ggd term */ - - temp = D1nF12(here->ggd2, - r1h1x - r1h1y, - i1h1x - i1h1y, - r1h2x - r1h2y, - i1h2x - i1h2y); - - itemp = D1iF12(here->ggd2, - r1h1x - r1h1y, - i1h1x - i1h1y, - r1h2x - r1h2y, - i1h2x - i1h2y); - - - *(ckt->CKTrhs + (here->MESgateNode)) -= temp; - *(ckt->CKTirhs + (here->MESgateNode)) -= itemp; - *(ckt->CKTrhs + (here->MESdrainPrimeNode)) += temp; - *(ckt->CKTirhs + (here->MESdrainPrimeNode)) += itemp; - - /* ggd over */ - - /* loading qgs term */ - - temp = -ckt->CKTomega* - DFiF12(here->qgs_x2, - here->qgs_y2, - 0.0, - here->qgs_xy, - 0.0, - 0.0, - r1h1x, - i1h1x, - r1h1x - r1h1y, - i1h1x - i1h1y, - 0.0, - 0.0, - r1h2x, - i1h2x, - r1h2x - r1h2y, - i1h2x - i1h2y, - 0.0, - 0.0); - - itemp =ckt->CKTomega* - DFnF12(here->qgs_x2, - here->qgs_y2, - 0.0, - here->qgs_xy, - 0.0, - 0.0, - r1h1x, - i1h1x, - r1h1x - r1h1y, - i1h1x - i1h1y, - 0.0, - 0.0, - r1h2x, - i1h2x, - r1h2x - r1h2y, - i1h2x - i1h2y, - 0.0, - 0.0); - - *(ckt->CKTrhs + (here->MESgateNode)) -= temp; - *(ckt->CKTirhs + (here->MESgateNode)) -= itemp; - *(ckt->CKTrhs + (here->MESsourcePrimeNode)) += temp; - *(ckt->CKTirhs + (here->MESsourcePrimeNode)) += itemp; - - /* qgs term over */ - - /* loading qgd term */ - - temp = -ckt->CKTomega* - DFiF12(here->qgd_x2, - here->qgd_y2, - 0.0, - here->qgd_xy, - 0.0, - 0.0, - r1h1x, - i1h1x, - r1h1x - r1h1y, - i1h1x - i1h1y, - 0.0, - 0.0, - r1h2x, - i1h2x, - r1h2x - r1h2y, - i1h2x - i1h2y, - 0.0, - 0.0); - - itemp =ckt->CKTomega* - DFnF12(here->qgd_x2, - here->qgd_y2, - 0.0, - here->qgd_xy, - 0.0, - 0.0, - r1h1x, - i1h1x, - r1h1x - r1h1y, - i1h1x - i1h1y, - 0.0, - 0.0, - r1h2x, - i1h2x, - r1h2x - r1h2y, - i1h2x - i1h2y, - 0.0, - 0.0); - - *(ckt->CKTrhs + (here->MESgateNode)) -= temp; - *(ckt->CKTirhs + (here->MESgateNode)) -= itemp; - *(ckt->CKTrhs + (here->MESdrainPrimeNode)) += temp; - *(ckt->CKTirhs + (here->MESdrainPrimeNode)) += itemp; - - /* qgd term over */ - /* all done */ - - break; - case D_F1MF2: - /* x = vgs, y = vds */ - - /* getting first order (linear) Volterra kernel */ - r1h1x = *(job->r1H1ptr + (here->MESgateNode)) - - *(job->r1H1ptr + (here->MESsourcePrimeNode)); - i1h1x = *(job->i1H1ptr + (here->MESgateNode)) - - *(job->i1H1ptr + (here->MESsourcePrimeNode)); - - r1h1y = *(job->r1H1ptr + (here->MESdrainPrimeNode)) - - *(job->r1H1ptr + (here->MESsourcePrimeNode)); - i1h1y = *(job->i1H1ptr + (here->MESdrainPrimeNode)) - - *(job->i1H1ptr + (here->MESsourcePrimeNode)); - - r1hm2x = *(job->r1H2ptr + (here->MESgateNode)) - - *(job->r1H2ptr + (here->MESsourcePrimeNode)); - i1hm2x = -(*(job->i1H2ptr + (here->MESgateNode)) - - *(job->i1H2ptr + (here->MESsourcePrimeNode))); - - r1hm2y = *(job->r1H2ptr + (here->MESdrainPrimeNode)) - - *(job->r1H2ptr + (here->MESsourcePrimeNode)); - i1hm2y = -(*(job->i1H2ptr + (here->MESdrainPrimeNode)) - - *(job->i1H2ptr + (here->MESsourcePrimeNode))); - - /* loading starts here */ - /* loading cdrain term */ - - temp = DFnF12(here->cdr_x2, - here->cdr_z2, - 0.0, - here->cdr_xz, - 0.0, - 0.0, - r1h1x, - i1h1x, - r1h1y, - i1h1y, - 0.0, - 0.0, - r1hm2x, - i1hm2x, - r1hm2y, - i1hm2y, - 0.0, - 0.0); - - itemp = DFiF12(here->cdr_x2, - here->cdr_z2, - 0.0, - here->cdr_xz, - 0.0, - 0.0, - r1h1x, - i1h1x, - r1h1y, - i1h1y, - 0.0, - 0.0, - r1hm2x, - i1hm2x, - r1hm2y, - i1hm2y, - 0.0, - 0.0); - - *(ckt->CKTrhs + (here->MESdrainPrimeNode)) -= temp; - *(ckt->CKTirhs + (here->MESdrainPrimeNode)) -= itemp; - *(ckt->CKTrhs + (here->MESsourcePrimeNode)) += temp; - *(ckt->CKTirhs + (here->MESsourcePrimeNode)) += itemp; - - /* cdrain term over */ - - /* loading ggs term */ - - temp = D1nF12(here->ggs2, - r1h1x, - i1h1x, - r1hm2x, - i1hm2x); - - itemp = D1iF12(here->ggs2, - r1h1x, - i1h1x, - r1hm2x, - i1hm2x); - - - *(ckt->CKTrhs + (here->MESgateNode)) -= temp; - *(ckt->CKTirhs + (here->MESgateNode)) -= itemp; - *(ckt->CKTrhs + (here->MESsourcePrimeNode)) += temp; - *(ckt->CKTirhs + (here->MESsourcePrimeNode)) += itemp; - - /* ggs over */ - - /* loading ggd term */ - - temp = D1nF12(here->ggd2, - r1h1x - r1h1y, - i1h1x - i1h1y, - r1hm2x - r1hm2y, - i1hm2x - i1hm2y); - - itemp = D1iF12(here->ggd2, - r1h1x - r1h1y, - i1h1x - i1h1y, - r1hm2x - r1hm2y, - i1hm2x - i1hm2y); - - - *(ckt->CKTrhs + (here->MESgateNode)) -= temp; - *(ckt->CKTirhs + (here->MESgateNode)) -= itemp; - *(ckt->CKTrhs + (here->MESdrainPrimeNode)) += temp; - *(ckt->CKTirhs + (here->MESdrainPrimeNode)) += itemp; - - /* ggd over */ - - /* loading qgs term */ - - temp = -ckt->CKTomega* - DFiF12(here->qgs_x2, - here->qgs_y2, - 0.0, - here->qgs_xy, - 0.0, - 0.0, - r1h1x, - i1h1x, - r1h1x - r1h1y, - i1h1x - i1h1y, - 0.0, - 0.0, - r1hm2x, - i1hm2x, - r1hm2x - r1hm2y, - i1hm2x - i1hm2y, - 0.0, - 0.0); - - itemp = ckt->CKTomega* - DFnF12(here->qgs_x2, - here->qgs_y2, - 0.0, - here->qgs_xy, - 0.0, - 0.0, - r1h1x, - i1h1x, - r1h1x - r1h1y, - i1h1x - i1h1y, - 0.0, - 0.0, - r1hm2x, - i1hm2x, - r1hm2x - r1hm2y, - i1hm2x - i1hm2y, - 0.0, - 0.0); - - *(ckt->CKTrhs + (here->MESgateNode)) -= temp; - *(ckt->CKTirhs + (here->MESgateNode)) -= itemp; - *(ckt->CKTrhs + (here->MESsourcePrimeNode)) += temp; - *(ckt->CKTirhs + (here->MESsourcePrimeNode)) += itemp; - - /* qgs term over */ - - /* loading qgd term */ - - temp = -ckt->CKTomega* - DFiF12(here->qgd_x2, - here->qgd_y2, - 0.0, - here->qgd_xy, - 0.0, - 0.0, - r1h1x, - i1h1x, - r1h1x - r1h1y, - i1h1x - i1h1y, - 0.0, - 0.0, - r1hm2x, - i1hm2x, - r1hm2x - r1hm2y, - i1hm2x - i1hm2y, - 0.0, - 0.0); - - itemp = ckt->CKTomega* - DFnF12(here->qgd_x2, - here->qgd_y2, - 0.0, - here->qgd_xy, - 0.0, - 0.0, - r1h1x, - i1h1x, - r1h1x - r1h1y, - i1h1x - i1h1y, - 0.0, - 0.0, - r1hm2x, - i1hm2x, - r1hm2x - r1hm2y, - i1hm2x - i1hm2y, - 0.0, - 0.0); - - *(ckt->CKTrhs + (here->MESgateNode)) -= temp; - *(ckt->CKTirhs + (here->MESgateNode)) -= itemp; - *(ckt->CKTrhs + (here->MESdrainPrimeNode)) += temp; - *(ckt->CKTirhs + (here->MESdrainPrimeNode)) += itemp; - - /* qgd term over */ - /* all done */ - - break; - case D_2F1MF2: - /* x = vgs, y = vds */ - - /* getting first order (linear) Volterra kernel */ - r1h1x = *(job->r1H1ptr + (here->MESgateNode)) - - *(job->r1H1ptr + (here->MESsourcePrimeNode)); - i1h1x = *(job->i1H1ptr + (here->MESgateNode)) - - *(job->i1H1ptr + (here->MESsourcePrimeNode)); - - r1h1y = *(job->r1H1ptr + (here->MESdrainPrimeNode)) - - *(job->r1H1ptr + (here->MESsourcePrimeNode)); - i1h1y = *(job->i1H1ptr + (here->MESdrainPrimeNode)) - - *(job->i1H1ptr + (here->MESsourcePrimeNode)); - - r2h11x = *(job->r2H11ptr + (here->MESgateNode)) - - *(job->r2H11ptr + (here->MESsourcePrimeNode)); - i2h11x = *(job->i2H11ptr + (here->MESgateNode)) - - *(job->i2H11ptr + (here->MESsourcePrimeNode)); - - r2h11y = *(job->r2H11ptr + (here->MESdrainPrimeNode)) - - *(job->r2H11ptr + (here->MESsourcePrimeNode)); - i2h11y = *(job->i2H11ptr + (here->MESdrainPrimeNode)) - - *(job->i2H11ptr + (here->MESsourcePrimeNode)); - - r1hm2x = *(job->r1H2ptr + (here->MESgateNode)) - - *(job->r1H2ptr + (here->MESsourcePrimeNode)); - i1hm2x = -(*(job->i1H2ptr + (here->MESgateNode)) - - *(job->i1H2ptr + (here->MESsourcePrimeNode))); - - r1hm2y = *(job->r1H2ptr + (here->MESdrainPrimeNode)) - - *(job->r1H2ptr + (here->MESsourcePrimeNode)); - i1hm2y = -(*(job->i1H2ptr + (here->MESdrainPrimeNode)) - - *(job->i1H2ptr + (here->MESsourcePrimeNode))); - - r2h1m2x = *(job->r2H1m2ptr + (here->MESgateNode)) - - *(job->r2H1m2ptr + (here->MESsourcePrimeNode)); - i2h1m2x = *(job->i2H1m2ptr + (here->MESgateNode)) - - *(job->i2H1m2ptr + (here->MESsourcePrimeNode)); - - r2h1m2y = *(job->r2H1m2ptr + (here->MESdrainPrimeNode)) - - *(job->r2H1m2ptr + (here->MESsourcePrimeNode)); - i2h1m2y = *(job->i2H1m2ptr + (here->MESdrainPrimeNode)) - - *(job->i2H1m2ptr + (here->MESsourcePrimeNode)); - - /* loading starts here */ - /* loading cdrain term */ - - pass.cxx = here->cdr_x2; - pass.cyy = here->cdr_z2; - pass.czz = 0.0; - pass.cxy = here->cdr_xz; - pass.cyz = 0.0; - pass.cxz = 0.0; - pass.cxxx = here->cdr_x3; - pass.cyyy = here->cdr_z3; - pass.czzz = 0.0; - pass.cxxy = here->cdr_x2z; - pass.cxxz = 0.0; - pass.cxyy = here->cdr_xz2; - pass.cyyz = 0.0; - pass.cxzz = 0.0; - pass.cyzz = 0.0; - pass.cxyz = 0.0; - pass.r1h1x = r1h1x; - pass.i1h1x = i1h1x; - pass.r1h1y = r1h1y; - pass.i1h1y = i1h1y; - pass.r1h1z = 0.0; - pass.i1h1z = 0.0; - pass.r1h2x = r1hm2x; - pass.i1h2x = i1hm2x; - pass.r1h2y = r1hm2y; - pass.i1h2y = i1hm2y; - pass.r1h2z = 0.0; - pass.i1h2z = 0.0; - pass.r2h11x = r2h11x; - pass.i2h11x = i2h11x; - pass.r2h11y = r2h11y; - pass.i2h11y = i2h11y; - pass.r2h11z = 0.0; - pass.i2h11z = 0.0; - pass.h2f1f2x = r2h1m2x; - pass.ih2f1f2x = i2h1m2x; - pass.h2f1f2y = r2h1m2y; - pass.ih2f1f2y = i2h1m2y; - pass.h2f1f2z = 0.0; - pass.ih2f1f2z = 0.0; - temp = DFn2F12(&pass); - - itemp = DFi2F12(&pass); - - *(ckt->CKTrhs + (here->MESdrainPrimeNode)) -= temp; - *(ckt->CKTirhs + (here->MESdrainPrimeNode)) -= itemp; - *(ckt->CKTrhs + (here->MESsourcePrimeNode)) += temp; - *(ckt->CKTirhs + (here->MESsourcePrimeNode)) += itemp; - - /* cdrain term over */ - - /* loading ggs term */ - - temp = D1n2F12(here->ggs2, - here->ggs3, - r1h1x, - i1h1x, - r1hm2x, - i1hm2x, - r2h11x, - i2h11x, - r2h1m2x, - i2h1m2x); - - itemp = D1i2F12(here->ggs2, - here->ggs3, - r1h1x, - i1h1x, - r1hm2x, - i1hm2x, - r2h11x, - i2h11x, - r2h1m2x, - i2h1m2x); - - - *(ckt->CKTrhs + (here->MESgateNode)) -= temp; - *(ckt->CKTirhs + (here->MESgateNode)) -= itemp; - *(ckt->CKTrhs + (here->MESsourcePrimeNode)) += temp; - *(ckt->CKTirhs + (here->MESsourcePrimeNode)) += itemp; - - /* ggs over */ - - /* loading ggd term */ - - temp = D1n2F12(here->ggd2, - here->ggd3, - r1h1x - r1h1y, - i1h1x - i1h1y, - r1hm2x - r1hm2y, - i1hm2x - i1hm2y, - r2h11x - r2h11y, - i2h11x - i2h11y, - r2h1m2x - r2h1m2y, - i2h1m2x - i2h1m2y); - - itemp = D1i2F12(here->ggd2, - here->ggd3, - r1h1x - r1h1y, - i1h1x - i1h1y, - r1hm2x - r1hm2y, - i1hm2x - i1hm2y, - r2h11x - r2h11y, - i2h11x - i2h11y, - r2h1m2x - r2h1m2y, - i2h1m2x - i2h1m2y); - - - - *(ckt->CKTrhs + (here->MESgateNode)) -= temp; - *(ckt->CKTirhs + (here->MESgateNode)) -= itemp; - *(ckt->CKTrhs + (here->MESdrainPrimeNode)) += temp; - *(ckt->CKTirhs + (here->MESdrainPrimeNode)) += itemp; - - /* ggd over */ - - /* loading qgs term */ - - pass.cxx = here->qgs_x2; - pass.cyy = here->qgs_y2; - pass.czz = 0.0; - pass.cxy = here->qgs_xy; - pass.cyz = 0.0; - pass.cxz = 0.0; - pass.cxxx = here->qgs_x3; - pass.cyyy = here->qgs_y3; - pass.czzz = 0.0; - pass.cxxy = here->qgs_x2y; - pass.cxxz = 0.0; - pass.cxyy = here->qgs_xy2; - pass.cyyz = 0.0; - pass.cxzz = 0.0; - pass.cyzz = 0.0; - pass.cxyz = 0.0; - pass.r1h1x = r1h1x; - pass.i1h1x = i1h1x; - pass.r1h1y = r1h1x - r1h1y; - pass.i1h1y = i1h1x - i1h1y; - pass.r1h1z = 0.0; - pass.i1h1z = 0.0; - pass.r1h2x = r1hm2x; - pass.i1h2x = i1hm2x; - pass.r1h2y = r1hm2x - r1hm2y; - pass.i1h2y = i1hm2x - i1hm2y; - pass.r1h2z = 0.0; - pass.i1h2z = 0.0; - pass.r2h11x = r2h11x; - pass.i2h11x = i2h11x; - pass.r2h11y = r2h11x - r2h11y; - pass.i2h11y = i2h11x - i2h11y; - pass.r2h11z = 0.0; - pass.i2h11z = 0.0; - pass.h2f1f2x = r2h1m2x; - pass.ih2f1f2x = i2h1m2x; - pass.h2f1f2y = r2h1m2x - r2h1m2y; - pass.ih2f1f2y = i2h1m2x - i2h1m2y; - pass.h2f1f2z = 0.0; - pass.ih2f1f2z = 0.0; - temp = -ckt->CKTomega*DFi2F12(&pass); - - itemp = ckt->CKTomega*DFn2F12(&pass); - - *(ckt->CKTrhs + (here->MESgateNode)) -= temp; - *(ckt->CKTirhs + (here->MESgateNode)) -= itemp; - *(ckt->CKTrhs + (here->MESsourcePrimeNode)) += temp; - *(ckt->CKTirhs + (here->MESsourcePrimeNode)) += itemp; - - /* qgs term over */ - - /* loading qgd term */ - - pass.cxx = here->qgd_x2; - pass.cyy = here->qgd_y2; - pass.czz = 0.0; - pass.cxy = here->qgd_xy; - pass.cyz = 0.0; - pass.cxz = 0.0; - pass.cxxx = here->qgd_x3; - pass.cyyy = here->qgd_y3; - pass.czzz = 0.0; - pass.cxxy = here->qgd_x2y; - pass.cxxz = 0.0; - pass.cxyy = here->qgd_xy2; - pass.cyyz = 0.0; - pass.cxzz = 0.0; - pass.cyzz = 0.0; - pass.cxyz = 0.0; - pass.r1h1x = r1h1x; - pass.i1h1x = i1h1x; - pass.r1h1y = r1h1x - r1h1y; - pass.i1h1y = i1h1x - i1h1y; - pass.r1h1z = 0.0; - pass.i1h1z = 0.0; - pass.r1h2x = r1hm2x; - pass.i1h2x = i1hm2x; - pass.r1h2y = r1hm2x - r1hm2y; - pass.i1h2y = i1hm2x - i1hm2y; - pass.r1h2z = 0.0; - pass.i1h2z = 0.0; - pass.r2h11x = r2h11x; - pass.i2h11x = i2h11x; - pass.r2h11y = r2h11x - r2h11y; - pass.i2h11y = i2h11x - i2h11y; - pass.r2h11z = 0.0; - pass.i2h11z = 0.0; - pass.h2f1f2x = r2h1m2x; - pass.ih2f1f2x = i2h1m2x; - pass.h2f1f2y = r2h1m2x - r2h1m2y; - pass.ih2f1f2y = i2h1m2x - i2h1m2y; - pass.h2f1f2z = 0.0; - pass.ih2f1f2z = 0.0; - temp = -ckt->CKTomega*DFi2F12(&pass); - - itemp = ckt->CKTomega*DFn2F12(&pass); - - *(ckt->CKTrhs + (here->MESgateNode)) -= temp; - *(ckt->CKTirhs + (here->MESgateNode)) -= itemp; - *(ckt->CKTrhs + (here->MESdrainPrimeNode)) += temp; - *(ckt->CKTirhs + (here->MESdrainPrimeNode)) += itemp; - - /* qgd term over */ - /* all done */ - - break; - default: -; - } - } -} -return(OK); -} -else - return(E_BADPARM); -} diff --git a/src/spicelib/devices/mes/mesdset.c b/src/spicelib/devices/mes/mesdset.c deleted file mode 100644 index bc27ba32f..000000000 --- a/src/spicelib/devices/mes/mesdset.c +++ /dev/null @@ -1,407 +0,0 @@ -/********** -Copyright 1990 Regents of the University of California. All rights reserved. -Author: 1988 Jaijeet Roychowdhury -**********/ - -#include "ngspice/ngspice.h" -#include "ngspice/devdefs.h" -#include "ngspice/cktdefs.h" -#include "mesdefs.h" -#include "ngspice/distodef.h" -#include "ngspice/const.h" -#include "ngspice/sperror.h" -#include "ngspice/suffix.h" - -int -MESdSetup(GENmodel *inModel, CKTcircuit *ckt) - /* actually load the current resistance value into the - * sparse matrix previously provided - */ -{ - MESmodel *model = (MESmodel*)inModel; - MESinstance *here; - double afact; - double beta; - double betap; - double cdrain; - double cg; - double cgd; - double csat; - double czgd; - double czgs; - double denom; - double evgd; - double evgs; - double gdpr; - double gspr; - double invdenom; - double lfact; - double phib; - double prod; - double vcap; - double vcrit; - double vds; - double vgd; - double vgs; - double vgst; - double vto; - double lggd1; - double lggd2; - double lggd3; - double lggs1; - double lggs2; - double lggs3; - Dderivs d_cdrain, d_qgs, d_qgd; - Dderivs d_p, d_q, d_r, d_zero; - - /* loop through all the models */ - for( ; model != NULL; model = MESnextModel(model)) { - - /* loop through all the instances of the model */ - for (here = MESinstances(model); here != NULL ; - here=MESnextInstance(here)) { - - /* - * dc model parameters - */ - beta = model->MESbeta * here->MESm * here->MESarea; - gdpr = model->MESdrainConduct * here->MESm * here->MESarea; - gspr = model->MESsourceConduct * here->MESm * here->MESarea; - csat = model->MESgateSatCurrent * here->MESm * here->MESarea; - vcrit = model->MESvcrit; - vto = model->MESthreshold; - /* - * initialization - */ - /* - * compute new nonlinear branch voltages - */ - vgs = model->MEStype* - (*(ckt->CKTrhsOld+ here->MESgateNode)- - *(ckt->CKTrhsOld+ - here->MESsourcePrimeNode)); - vgd = model->MEStype* - (*(ckt->CKTrhsOld+here->MESgateNode)- - *(ckt->CKTrhsOld+ - here->MESdrainPrimeNode)); - - /* - * determine dc current and derivatives - */ - vds = vgs-vgd; - if (vgs <= -5*CONSTvt0) { - lggs1 = -csat/vgs+ckt->CKTgmin; - lggs2=lggs3=0; - cg = lggs1*vgs; - } else { - evgs = exp(vgs/CONSTvt0); - lggs1 = csat*evgs/CONSTvt0+ckt->CKTgmin; - lggs2 = (lggs1-ckt->CKTgmin)/(CONSTvt0*2); - lggs3 = lggs2/(3*CONSTvt0); - cg = csat*(evgs-1)+ckt->CKTgmin*vgs; - } - if (vgd <= -5*CONSTvt0) { - lggd1 = -csat/vgd+ckt->CKTgmin; - lggd2=lggd3=0; - cgd = lggd1*vgd; - } else { - evgd = exp(vgd/CONSTvt0); - lggd1 = csat*evgd/CONSTvt0+ckt->CKTgmin; - lggd2 = (lggd1-ckt->CKTgmin)/(CONSTvt0*2); - lggd3 = lggd2/(3*CONSTvt0); - cgd = csat*(evgd-1)+ckt->CKTgmin*vgd; - } - cg = cg+cgd; - /* - * compute drain current and derivitives for normal mode - */ - /* until now, we were using the real vgs, vgd, and vds */ - { - /* converting (temporarily) to local vgs, vgd, and vds */ - double vgsreal=vgs; - double vgdreal=vgd; - double vdsreal=vds; - Dderivs d_afact, d_lfact; - Dderivs d_betap, d_denom, d_invdenom; - Dderivs d_prod; - Dderivs d_vgst; - - if (vdsreal < 0.0) { - vgs = vgdreal; - vgd = vgsreal; - vds = -vdsreal; - here->MESmode = -1; - - /* source-drain interchange */ - - } - else - here->MESmode = 1; -d_p.value = 0.0; -d_p.d1_p = 1.0; -d_p.d1_q = 0.0; -d_p.d1_r = 0.0; -d_p.d2_p2 = 0.0; -d_p.d2_q2 = 0.0; -d_p.d2_r2 = 0.0; -d_p.d2_pq = 0.0; -d_p.d2_qr = 0.0; -d_p.d2_pr = 0.0; -d_p.d3_p3 = 0.0; -d_p.d3_q3 = 0.0; -d_p.d3_r3 = 0.0; -d_p.d3_p2r = 0.0; -d_p.d3_p2q = 0.0; -d_p.d3_q2r = 0.0; -d_p.d3_pq2 = 0.0; -d_p.d3_pr2 = 0.0; -d_p.d3_qr2 = 0.0; -d_p.d3_pqr = 0.0; - EqualDeriv(&d_q,&d_p); - EqualDeriv(&d_r,&d_p); - EqualDeriv(&d_zero,&d_p); - d_q.d1_p = d_r.d1_p = d_zero.d1_p = 0.0; - d_q.d1_q = d_r.d1_r = 1.0; - d_p.value = vgs; d_r.value = vds; - - /* p =vgs; q= nothing in particular ; r = vds */ - - vgst = vgs-model->MESthreshold; - EqualDeriv(&d_vgst,&d_p); - d_vgst.value = vgst; - /* - * normal mode, cutoff region - */ - if (vgst <= 0) { - cdrain = 0; - EqualDeriv(&d_cdrain,&d_zero); - } else { - prod = 1 + model->MESlModulation * vds; - TimesDeriv(&d_prod,&d_r,model->MESlModulation); - d_prod.value = prod; - betap = beta * prod; - TimesDeriv(&d_betap,&d_prod,beta); - denom = 1 + model->MESb * vgst; - TimesDeriv(&d_denom,&d_vgst,model->MESb); - d_denom.value = denom; - invdenom = 1 / denom; - InvDeriv(&d_invdenom,&d_denom); - /* - * normal mode, saturation region - */ - cdrain = betap * vgst * vgst * invdenom; - MultDeriv(&d_cdrain,&d_betap,&d_vgst); - MultDeriv(&d_cdrain,&d_cdrain,&d_vgst); - MultDeriv(&d_cdrain,&d_cdrain,&d_invdenom); - - if (vds < ( 3 / model->MESalpha ) ) { - /* - * normal mode, linear region - */ - afact = 1 - model->MESalpha * vds / 3; - TimesDeriv(&d_afact,&d_r,-model->MESalpha/3.0); - d_afact.value = afact; - lfact = 1 - afact * afact * afact; - CubeDeriv(&d_lfact,&d_afact); - TimesDeriv(&d_lfact,&d_lfact,-1.0); - d_lfact.value += 1.0; - cdrain = betap*vgst*vgst*invdenom*lfact; - MultDeriv(&d_cdrain,&d_betap,&d_vgst); - MultDeriv(&d_cdrain,&d_cdrain,&d_vgst); - MultDeriv(&d_cdrain,&d_cdrain,&d_invdenom); - MultDeriv(&d_cdrain,&d_cdrain,&d_lfact); - } - } - - /* converting back to real vgs, vgd, vds */ - - if (here->MESmode == -1) { - vgs = vgsreal; - vgd = vgdreal; - vds = vdsreal; - } - } - /* - * charge storage elements - */ -{ /* code block */ -czgs = model->MEScapGS * here->MESm * here->MESarea; -czgd = model->MEScapGD * here->MESm * here->MESarea; -phib = model->MESgatePotential; -vcap = 1 / model->MESalpha; - -/* - * qgga = qggnew(vgs,vgd,phib,vcap,vto,czgs,czgd,&cgsna,&cgdna); - */ -/* function qggnew - private, used by MESload*/ -{ - double veroot,veff1,veff2,del,vnroot,vnew1,vnew3,vmax,ext; - double qroot,par1,cfact,cplus,cminus; - Dderivs d_vnroot; - Dderivs d_cgsnew, d_cgdnew, d_dummy, d_dummy2; - Dderivs d_ext, d_qroot, d_par1, d_cfact, d_cplus, d_cminus; - Dderivs d_veroot, d_veff1, d_veff2, d_vnew1, d_vnew3; - -/* now p=vgs, q=vgd, r= nothing */ - - d_q.value = vgd; d_p.value = vgs; - veroot = sqrt( (vgs - vgd) * (vgs - vgd) + vcap*vcap ); - TimesDeriv(&d_veroot,&d_q,-1.0); - PlusDeriv(&d_veroot,&d_veroot,&d_p); - MultDeriv(&d_veroot,&d_veroot,&d_veroot); - d_veroot.value += vcap*vcap; - SqrtDeriv(&d_veroot,&d_veroot); - veff1 = 0.5 * (vgs + vgd + veroot); - PlusDeriv(&d_veff1,&d_veroot,&d_p); - PlusDeriv(&d_veff1,&d_veff1,&d_q); - TimesDeriv(&d_veff1,&d_veff1,0.5); - veff2 = veff1 - veroot; - TimesDeriv(&d_veff2,&d_veroot,-1.0); - PlusDeriv(&d_veff2,&d_veff2,&d_veff1); - - del = 0.2;/*const*/ - vnroot = sqrt( (veff1 - vto)*(veff1 - vto) + del * del ); - EqualDeriv(&d_vnroot,&d_veff1); - d_vnroot.value -= vto; - MultDeriv(&d_vnroot,&d_vnroot,&d_vnroot); - d_vnroot.value += del*del; - SqrtDeriv(&d_vnroot,&d_vnroot); - vnew1 = 0.5 * (veff1 + vto + vnroot); - PlusDeriv(&d_vnew1,&d_veff1,&d_vnroot); - d_vnew1.value += vto; - TimesDeriv(&d_vnew1,&d_vnew1,0.5); - vnew3 = vnew1; - EqualDeriv(&d_vnew3,&d_vnew1); - vmax = 0.5;/*const*/ - if ( vnew1 < vmax ) { - ext=0; - EqualDeriv(&d_ext,&d_zero); - } else { - vnew1 = vmax; - EqualDeriv(&d_vnew1,&d_zero); - d_vnew1.value = vmax; - ext = (vnew3 - vmax)/sqrt(1 - vmax/phib); - EqualDeriv(&d_ext,&d_vnew3); - d_ext.value -= vmax; - TimesDeriv(&d_ext,&d_ext,1/sqrt(1 - vmax/phib)); - } - - qroot = sqrt(1 - vnew1/phib); - TimesDeriv(&d_qroot,&d_vnew1,-1/phib); - d_qroot.value += 1.0; - SqrtDeriv(&d_qroot,&d_qroot); - /* - * qggval = czgs * (2*phib*(1-qroot) + ext) + czgd*veff2; - */ - par1 = 0.5 * ( 1 + (veff1-vto)/vnroot); - EqualDeriv(&d_par1,&d_veff1); - d_par1.value -= vto; - DivDeriv(&d_par1,&d_par1,&d_vnroot); - d_par1.value += 1.0; - TimesDeriv(&d_par1,&d_par1,0.5); - cfact = (vgs- vgd)/veroot; - TimesDeriv(&d_cfact,&d_q,-1.0); - PlusDeriv(&d_cfact,&d_cfact,&d_p); - DivDeriv(&d_cfact,&d_cfact,&d_veroot); - cplus = 0.5 * (1 + cfact); - TimesDeriv(&d_cplus,&d_cfact,0.5); - d_cplus.value += 0.5; - cminus = cplus - cfact; - TimesDeriv(&d_cminus,&d_cfact,-0.5); - d_cminus.value += 0.5; - /* - *cgsnew = czgs/qroot*par1*cplus + czgd*cminus; - *cgdnew = czgs/qroot*par1*cminus + czgd*cplus; - * - * assuming qgs = vgs*cgsnew - * and qgd = vgd*cgsnew - * - * This is probably wrong but then so is the a.c. analysis - * routine and everything else - * - */ - - MultDeriv(&d_dummy,&d_qroot,&d_par1); - InvDeriv(&d_dummy,&d_dummy); - TimesDeriv(&d_dummy,&d_dummy,czgs); - - TimesDeriv(&d_cgsnew,&d_cminus,czgd); - MultDeriv(&d_dummy2,&d_dummy,&d_cplus); - PlusDeriv(&d_cgsnew,&d_cgsnew,&d_dummy2); - - TimesDeriv(&d_cgdnew,&d_cplus,czgd); - MultDeriv(&d_dummy2,&d_dummy,&d_cminus); - PlusDeriv(&d_cgdnew,&d_cgdnew,&d_dummy2); - - MultDeriv(&d_qgs,&d_cgsnew,&d_p); - MultDeriv(&d_qgd,&d_cgdnew,&d_q); -} -} - - - if (here->MESmode == 1) - { - /* normal mode - no source-drain interchange */ -here->cdr_x = d_cdrain.d1_p; -here->cdr_z = d_cdrain.d1_r; -here->cdr_x2 = d_cdrain.d2_p2; -here->cdr_z2 = d_cdrain.d2_r2; -here->cdr_xz = d_cdrain.d2_pr; -here->cdr_x3 = d_cdrain.d3_p3; -here->cdr_z3 = d_cdrain.d3_r3;; -here->cdr_x2z = d_cdrain.d3_p2r; -here->cdr_xz2 = d_cdrain.d3_pr2; - -} else { - /* - * inverse mode - source and drain interchanged - */ - - -here->cdr_x = -d_cdrain.d1_p; -here->cdr_z = d_cdrain.d1_p + d_cdrain.d1_r; -here->cdr_x2 = -d_cdrain.d2_p2; -here->cdr_z2 = -(d_cdrain.d2_p2 + d_cdrain.d2_r2 + 2*d_cdrain.d2_pr); -here->cdr_xz = d_cdrain.d2_p2 + d_cdrain.d2_pr; -here->cdr_x3 = -d_cdrain.d3_p3; -here->cdr_z3 = d_cdrain.d3_p3 + d_cdrain.d3_r3 + 3*(d_cdrain.d3_p2r + d_cdrain.d3_pr2 ) ; -here->cdr_x2z = d_cdrain.d3_p3 + d_cdrain.d3_p2r; -here->cdr_xz2 = -(d_cdrain.d3_p3 + 2*d_cdrain.d3_p2r + d_cdrain.d3_pr2); - -} - -/* now to adjust for type and multiply by factors to convert to Taylor coeffs. */ - -here->cdr_x2 = 0.5*model->MEStype*here->cdr_x2; -here->cdr_z2 = 0.5*model->MEStype*here->cdr_z2; -here->cdr_xz = model->MEStype*here->cdr_xz; -here->cdr_x3 = here->cdr_x3/6.; -here->cdr_z3 = here->cdr_z3/6.; -here->cdr_x2z = 0.5*here->cdr_x2z; -here->cdr_xz2 = 0.5*here->cdr_xz2; - - -here->ggs3 = lggs3; -here->ggd3 = lggd3; -here->ggs2 = model->MEStype*lggs2; -here->ggd2 = model->MEStype*lggd2; - -here->qgs_x2 = 0.5*model->MEStype*d_qgs.d2_p2; -here->qgs_y2 = 0.5*model->MEStype*d_qgs.d2_q2; -here->qgs_xy = model->MEStype*d_qgs.d2_pq; -here->qgs_x3 = d_qgs.d3_p3/6.; -here->qgs_y3 = d_qgs.d3_q3/6.; -here->qgs_x2y = 0.5*d_qgs.d3_p2q; -here->qgs_xy2 = 0.5*d_qgs.d3_pq2; - -here->qgd_x2 = 0.5*model->MEStype*d_qgd.d2_p2; -here->qgd_y2 = 0.5*model->MEStype*d_qgd.d2_q2; -here->qgd_xy = model->MEStype*d_qgd.d2_pq; -here->qgd_x3 = d_qgd.d3_p3/6.; -here->qgd_y3 = d_qgd.d3_q3/6.; -here->qgd_x2y = 0.5*d_qgd.d3_p2q; -here->qgd_xy2 = 0.5*d_qgd.d3_pq2; - } - } - return(OK); -} diff --git a/src/spicelib/devices/mes/mesext.h b/src/spicelib/devices/mes/mesext.h deleted file mode 100644 index 9892825a1..000000000 --- a/src/spicelib/devices/mes/mesext.h +++ /dev/null @@ -1,22 +0,0 @@ -/********** -Copyright 1990 Regents of the University of California. All rights reserved. -Author: 1985 S. Hwang -Modified: 2000 AlansFixes -**********/ - -extern int MESacLoad(GENmodel*,CKTcircuit*); -extern int MESask(CKTcircuit*,GENinstance*,int,IFvalue*,IFvalue*); -extern int MESgetic(GENmodel*,CKTcircuit*); -extern int MESload(GENmodel*,CKTcircuit*); -extern int MESmAsk(CKTcircuit*,GENmodel*,int,IFvalue*); -extern int MESmParam(int,IFvalue*,GENmodel*); -extern int MESparam(int,IFvalue*,GENinstance*,IFvalue*); -extern int MESpzLoad(GENmodel*,CKTcircuit*,SPcomplex*); -extern int MESsetup(SMPmatrix*,GENmodel*,CKTcircuit*,int*); -extern int MESunsetup(GENmodel*,CKTcircuit*); -extern int MEStemp(GENmodel*,CKTcircuit*); -extern int MEStrunc(GENmodel*,CKTcircuit*,double*); -extern int MESdisto(int,GENmodel*,CKTcircuit*); -extern int MESnoise(int,int,GENmodel*,CKTcircuit*,Ndata*,double*); -extern int MESdSetup(GENmodel*,CKTcircuit*); - diff --git a/src/spicelib/devices/mes/mesgetic.c b/src/spicelib/devices/mes/mesgetic.c deleted file mode 100644 index 8622a9585..000000000 --- a/src/spicelib/devices/mes/mesgetic.c +++ /dev/null @@ -1,41 +0,0 @@ -/********** -Copyright 1990 Regents of the University of California. All rights reserved. -Author: 1985 S. Hwang -**********/ -/* - */ - -#include "ngspice/ngspice.h" -#include "ngspice/cktdefs.h" -#include "mesdefs.h" -#include "ngspice/sperror.h" -#include "ngspice/suffix.h" - - -int -MESgetic(GENmodel *inModel, CKTcircuit *ckt) -{ - MESmodel *model = (MESmodel*)inModel; - MESinstance *here; - /* - * grab initial conditions out of rhs array. User specified, so use - * external nodes to get values - */ - - for( ; model ; model = MESnextModel(model)) { - for(here = MESinstances(model); here ; here = MESnextInstance(here)) { - - if(!here->MESicVDSGiven) { - here->MESicVDS = - *(ckt->CKTrhs + here->MESdrainNode) - - *(ckt->CKTrhs + here->MESsourceNode); - } - if(!here->MESicVGSGiven) { - here->MESicVGS = - *(ckt->CKTrhs + here->MESgateNode) - - *(ckt->CKTrhs + here->MESsourceNode); - } - } - } - return(OK); -} diff --git a/src/spicelib/devices/mes/mesinit.c b/src/spicelib/devices/mes/mesinit.c deleted file mode 100644 index 044fb8a26..000000000 --- a/src/spicelib/devices/mes/mesinit.c +++ /dev/null @@ -1,76 +0,0 @@ -#include "ngspice/config.h" - -#include "ngspice/devdefs.h" - -#include "mesitf.h" -#include "mesext.h" -#include "mesinit.h" - - -SPICEdev MESinfo = { - .DEVpublic = { - .name = "MES", - .description = "GaAs MESFET model", - .terms = &MESnSize, - .numNames = &MESnSize, - .termNames = MESnames, - .numInstanceParms = &MESpTSize, - .instanceParms = MESpTable, - .numModelParms = &MESmPTSize, - .modelParms = MESmPTable, - .flags = DEV_DEFAULT, - -#ifdef XSPICE - .cm_func = NULL, - .num_conn = 0, - .conn = NULL, - .num_param = 0, - .param = NULL, - .num_inst_var = 0, - .inst_var = NULL, -#endif - }, - - .DEVparam = MESparam, - .DEVmodParam = MESmParam, - .DEVload = MESload, - .DEVsetup = MESsetup, - .DEVunsetup = MESunsetup, - .DEVpzSetup = MESsetup, - .DEVtemperature = MEStemp, - .DEVtrunc = MEStrunc, - .DEVfindBranch = NULL, - .DEVacLoad = MESacLoad, - .DEVaccept = NULL, - .DEVdestroy = NULL, - .DEVmodDelete = NULL, - .DEVdelete = NULL, - .DEVsetic = MESgetic, - .DEVask = MESask, - .DEVmodAsk = MESmAsk, - .DEVpzLoad = MESpzLoad, - .DEVconvTest = NULL, - .DEVsenSetup = NULL, - .DEVsenLoad = NULL, - .DEVsenUpdate = NULL, - .DEVsenAcLoad = NULL, - .DEVsenPrint = NULL, - .DEVsenTrunc = NULL, - .DEVdisto = MESdisto, - .DEVnoise = MESnoise, - .DEVsoaCheck = NULL, - .DEVinstSize = &MESiSize, - .DEVmodSize = &MESmSize, - -#ifdef CIDER - .DEVdump = NULL, - .DEVacct = NULL, -#endif -}; - - -SPICEdev * -get_mes_info(void) -{ - return &MESinfo; -} diff --git a/src/spicelib/devices/mes/mesinit.h b/src/spicelib/devices/mes/mesinit.h deleted file mode 100644 index 541cb8ad5..000000000 --- a/src/spicelib/devices/mes/mesinit.h +++ /dev/null @@ -1,13 +0,0 @@ -#ifndef _MESINIT_H -#define _MESINIT_H - -extern IFparm MESpTable[ ]; -extern IFparm MESmPTable[ ]; -extern char *MESnames[ ]; -extern int MESpTSize; -extern int MESmPTSize; -extern int MESnSize; -extern int MESiSize; -extern int MESmSize; - -#endif diff --git a/src/spicelib/devices/mes/mesitf.h b/src/spicelib/devices/mes/mesitf.h deleted file mode 100644 index 6f9593f08..000000000 --- a/src/spicelib/devices/mes/mesitf.h +++ /dev/null @@ -1,9 +0,0 @@ -/********** -Copyright 1990 Regents of the University of California. All rights reserved. -**********/ -#ifndef DEV_MES -#define DEV_MES - -SPICEdev *get_mes_info(void); - -#endif diff --git a/src/spicelib/devices/mes/mesload.c b/src/spicelib/devices/mes/mesload.c deleted file mode 100644 index 2226991ba..000000000 --- a/src/spicelib/devices/mes/mesload.c +++ /dev/null @@ -1,496 +0,0 @@ -/********** -Copyright 1990 Regents of the University of California. All rights reserved. -Author: 1985 S. Hwang -Modified: 2000 AlansFixes -**********/ - -#include "ngspice/ngspice.h" -#include "ngspice/devdefs.h" -#include "ngspice/cktdefs.h" -#include "mesdefs.h" -#include "ngspice/const.h" -#include "ngspice/trandefs.h" -#include "ngspice/sperror.h" -#include "ngspice/suffix.h" - -/* forward declaraction of our helper function */ - -static double qggnew(double,double,double,double,double,double,double, - double*,double*); - -int -MESload(GENmodel *inModel, CKTcircuit *ckt) - /* actually load the current resistance value into the - * sparse matrix previously provided - */ -{ - MESmodel *model = (MESmodel*)inModel; - MESinstance *here; - double afact; - double beta; - double betap; - double capgd; - double capgs; - double cd; - double cdhat = 0.0; - double cdrain; - double cdreq; - double ceq; - double ceqgd; - double ceqgs; - double cg; - double cgd; - double cgdna,cgdnb,cgdnc,cgdnd; - double cghat = 0.0; - double cgsna,cgsnb,cgsnc,cgsnd; - double csat; - double czgd; - double czgs; - double delvds; - double delvgd; - double delvgs; - double denom; - double evgd; - double evgs; - double gdpr; - double gds; - double geq; - double ggd; - double ggs; - double gm; - double gspr; - double invdenom; - double lfact; - double phib; - double prod; - double qgga,qggb,qggc,qggd; - double vcap; - double vcrit; - double vds; - double vgd; - double vgd1; - double vgdt; - double vgs; - double vgs1; - double vgst; - double vto; -#ifndef PREDICTOR - double xfact; -#endif - double arg; - int icheck; - int ichk1; - int error; - - double m; - - /* loop through all the models */ - for( ; model != NULL; model = MESnextModel(model)) { - - /* loop through all the instances of the model */ - for (here = MESinstances(model); here != NULL ; - here=MESnextInstance(here)) { - - /* - * dc model parameters - */ - beta = model->MESbeta * here->MESarea; - gdpr = model->MESdrainConduct * here->MESarea; - gspr = model->MESsourceConduct * here->MESarea; - csat = model->MESgateSatCurrent * here->MESarea; - vcrit = model->MESvcrit; - vto = model->MESthreshold; - /* - * initialization - */ - icheck = 1; - if( ckt->CKTmode & MODEINITSMSIG) { - vgs = *(ckt->CKTstate0 + here->MESvgs); - vgd = *(ckt->CKTstate0 + here->MESvgd); - } else if (ckt->CKTmode & MODEINITTRAN) { - vgs = *(ckt->CKTstate1 + here->MESvgs); - vgd = *(ckt->CKTstate1 + here->MESvgd); - } else if ( (ckt->CKTmode & MODEINITJCT) && - (ckt->CKTmode & MODETRANOP) && - (ckt->CKTmode & MODEUIC) ) { - vds = model->MEStype*here->MESicVDS; - vgs = model->MEStype*here->MESicVGS; - vgd = vgs-vds; - } else if ( (ckt->CKTmode & MODEINITJCT) && - (here->MESoff == 0) ) { - vgs = -1; - vgd = -1; - } else if( (ckt->CKTmode & MODEINITJCT) || - ((ckt->CKTmode & MODEINITFIX) && (here->MESoff))) { - vgs = 0; - vgd = 0; - } else { -#ifndef PREDICTOR - if(ckt->CKTmode & MODEINITPRED) { - xfact = ckt->CKTdelta/ckt->CKTdeltaOld[1]; - *(ckt->CKTstate0 + here->MESvgs) = - *(ckt->CKTstate1 + here->MESvgs); - vgs = (1+xfact) * *(ckt->CKTstate1 + here->MESvgs) - - xfact * *(ckt->CKTstate2 + here->MESvgs); - *(ckt->CKTstate0 + here->MESvgd) = - *(ckt->CKTstate1 + here->MESvgd); - vgd = (1+xfact)* *(ckt->CKTstate1 + here->MESvgd) - - xfact * *(ckt->CKTstate2 + here->MESvgd); - *(ckt->CKTstate0 + here->MEScg) = - *(ckt->CKTstate1 + here->MEScg); - *(ckt->CKTstate0 + here->MEScd) = - *(ckt->CKTstate1 + here->MEScd); - *(ckt->CKTstate0 + here->MEScgd) = - *(ckt->CKTstate1 + here->MEScgd); - *(ckt->CKTstate0 + here->MESgm) = - *(ckt->CKTstate1 + here->MESgm); - *(ckt->CKTstate0 + here->MESgds) = - *(ckt->CKTstate1 + here->MESgds); - *(ckt->CKTstate0 + here->MESggs) = - *(ckt->CKTstate1 + here->MESggs); - *(ckt->CKTstate0 + here->MESggd) = - *(ckt->CKTstate1 + here->MESggd); - } else { -#endif /* PREDICTOR */ - /* - * compute new nonlinear branch voltages - */ - vgs = model->MEStype* - (*(ckt->CKTrhsOld+ here->MESgateNode)- - *(ckt->CKTrhsOld+ - here->MESsourcePrimeNode)); - vgd = model->MEStype* - (*(ckt->CKTrhsOld+here->MESgateNode)- - *(ckt->CKTrhsOld+ - here->MESdrainPrimeNode)); -#ifndef PREDICTOR - } -#endif /* PREDICTOR */ - delvgs=vgs - *(ckt->CKTstate0 + here->MESvgs); - delvgd=vgd - *(ckt->CKTstate0 + here->MESvgd); - delvds=delvgs - delvgd; - cghat= *(ckt->CKTstate0 + here->MEScg) + - *(ckt->CKTstate0 + here->MESggd)*delvgd + - *(ckt->CKTstate0 + here->MESggs)*delvgs; - cdhat= *(ckt->CKTstate0 + here->MEScd) + - *(ckt->CKTstate0 + here->MESgm)*delvgs + - *(ckt->CKTstate0 + here->MESgds)*delvds - - *(ckt->CKTstate0 + here->MESggd)*delvgd; - /* - * bypass if solution has not changed - */ - if((ckt->CKTbypass) && - (!(ckt->CKTmode & MODEINITPRED)) && - (fabs(delvgs) < ckt->CKTreltol*MAX(fabs(vgs), - fabs(*(ckt->CKTstate0 + here->MESvgs)))+ - ckt->CKTvoltTol) ) - if ( (fabs(delvgd) < ckt->CKTreltol*MAX(fabs(vgd), - fabs(*(ckt->CKTstate0 + here->MESvgd)))+ - ckt->CKTvoltTol)) - if ( (fabs(cghat-*(ckt->CKTstate0 + here->MEScg)) - < ckt->CKTreltol*MAX(fabs(cghat), - fabs(*(ckt->CKTstate0 + here->MEScg)))+ - ckt->CKTabstol) ) if ( /* hack - expression too big */ - (fabs(cdhat-*(ckt->CKTstate0 + here->MEScd)) - < ckt->CKTreltol*MAX(fabs(cdhat), - fabs(*(ckt->CKTstate0 + here->MEScd)))+ - ckt->CKTabstol) ) { - - /* we can do a bypass */ - vgs= *(ckt->CKTstate0 + here->MESvgs); - vgd= *(ckt->CKTstate0 + here->MESvgd); - vds= vgs-vgd; - cg= *(ckt->CKTstate0 + here->MEScg); - cd= *(ckt->CKTstate0 + here->MEScd); - cgd= *(ckt->CKTstate0 + here->MEScgd); - gm= *(ckt->CKTstate0 + here->MESgm); - gds= *(ckt->CKTstate0 + here->MESgds); - ggs= *(ckt->CKTstate0 + here->MESggs); - ggd= *(ckt->CKTstate0 + here->MESggd); - goto load; - } - /* - * limit nonlinear branch voltages - */ - ichk1=1; - vgs = DEVpnjlim(vgs,*(ckt->CKTstate0 + here->MESvgs),CONSTvt0, - vcrit, &icheck); - vgd = DEVpnjlim(vgd,*(ckt->CKTstate0 + here->MESvgd),CONSTvt0, - vcrit,&ichk1); - if (ichk1 == 1) { - icheck=1; - } - vgs = DEVfetlim(vgs,*(ckt->CKTstate0 + here->MESvgs), - model->MESthreshold); - vgd = DEVfetlim(vgd,*(ckt->CKTstate0 + here->MESvgd), - model->MESthreshold); - } - /* - * determine dc current and derivatives - */ - vds = vgs-vgd; - - if (vgs <= -3*CONSTvt0) { - arg=3*CONSTvt0/(vgs*CONSTe); - arg = arg * arg * arg; - cg = -csat*(1+arg)+ckt->CKTgmin*vgs; - ggs = csat*3*arg/vgs+ckt->CKTgmin; - } else { - evgs = exp(vgs/CONSTvt0); - ggs = csat*evgs/CONSTvt0+ckt->CKTgmin; - cg = csat*(evgs-1)+ckt->CKTgmin*vgs; - } - if (vgd <= -3*CONSTvt0) { - arg=3*CONSTvt0/(vgd*CONSTe); - arg = arg * arg * arg; - cgd = -csat*(1+arg)+ckt->CKTgmin*vgd; - ggd = csat*3*arg/vgd+ckt->CKTgmin; - } else { - evgd = exp(vgd/CONSTvt0); - ggd = csat*evgd/CONSTvt0+ckt->CKTgmin; - cgd = csat*(evgd-1)+ckt->CKTgmin*vgd; - } - - cg = cg+cgd; - /* - * compute drain current and derivitives for normal mode - */ - if (vds >= 0) { - vgst = vgs-model->MESthreshold; - /* - * normal mode, cutoff region - */ - if (vgst <= 0) { - cdrain = 0; - gm = 0; - gds = 0; - } else { - prod = 1 + model->MESlModulation * vds; - betap = beta * prod; - denom = 1 + model->MESb * vgst; - invdenom = 1 / denom; - if (vds >= ( 3 / model->MESalpha ) ) { - /* - * normal mode, saturation region - */ - cdrain = betap * vgst * vgst * invdenom; - gm = betap * vgst * (1 + denom) * invdenom * invdenom; - gds = model->MESlModulation * beta * vgst * vgst * - invdenom; - } else { - /* - * normal mode, linear region - */ - afact = 1 - model->MESalpha * vds / 3; - lfact = 1 - afact * afact * afact; - cdrain = betap * vgst * vgst * invdenom * lfact; - gm = betap * vgst * (1 + denom) * invdenom * invdenom * - lfact; - gds = beta * vgst * vgst * invdenom * (model->MESalpha * - afact * afact * prod + lfact * - model->MESlModulation); - } - } - } else { - /* - * compute drain current and derivitives for inverse mode - */ - vgdt = vgd - model->MESthreshold; - if (vgdt <= 0) { - /* - * inverse mode, cutoff region - */ - cdrain = 0; - gm = 0; - gds = 0; - } else { - /* - * inverse mode, saturation region - */ - prod = 1 - model->MESlModulation * vds; - betap = beta * prod; - denom = 1 + model->MESb * vgdt; - invdenom = 1 / denom; - if ( -vds >= ( 3 / model->MESalpha ) ) { - cdrain = -betap * vgdt * vgdt * invdenom; - gm = -betap * vgdt * (1 + denom) * invdenom * invdenom; - gds = model->MESlModulation * beta * vgdt * vgdt * - invdenom-gm; - } else { - /* - * inverse mode, linear region - */ - afact = 1 + model->MESalpha * vds / 3; - lfact = 1 - afact * afact * afact; - cdrain = -betap * vgdt * vgdt * invdenom * lfact; - gm = -betap * vgdt * (1 + denom) * invdenom * - invdenom * lfact; - gds = beta * vgdt * vgdt * invdenom * (model->MESalpha * - afact * afact * prod + lfact * - model->MESlModulation)-gm; - } - } - } - /* - * compute equivalent drain current source - */ - cd = cdrain - cgd; - if ( (ckt->CKTmode & (MODETRAN|MODEINITSMSIG)) || - ((ckt->CKTmode & MODETRANOP) && (ckt->CKTmode & MODEUIC)) ){ - /* - * charge storage elements - */ - czgs = model->MEScapGS * here->MESarea; - czgd = model->MEScapGD * here->MESarea; - phib = model->MESgatePotential; - vgs1 = *(ckt->CKTstate1 + here->MESvgs); - vgd1 = *(ckt->CKTstate1 + here->MESvgd); - vcap = 1 / model->MESalpha; - - qgga = qggnew(vgs,vgd,phib,vcap,vto,czgs,czgd,&cgsna,&cgdna); - qggb = qggnew(vgs1,vgd,phib,vcap,vto,czgs,czgd,&cgsnb,&cgdnb); - qggc = qggnew(vgs,vgd1,phib,vcap,vto,czgs,czgd,&cgsnc,&cgdnc); - qggd = qggnew(vgs1,vgd1,phib,vcap,vto,czgs,czgd,&cgsnd,&cgdnd); - - if(ckt->CKTmode & MODEINITTRAN) { - *(ckt->CKTstate1 + here->MESqgs) = qgga; - *(ckt->CKTstate1 + here->MESqgd) = qgga; - } - *(ckt->CKTstate0+here->MESqgs) = *(ckt->CKTstate1+here->MESqgs) - + 0.5 * (qgga-qggb + qggc-qggd); - *(ckt->CKTstate0+here->MESqgd) = *(ckt->CKTstate1+here->MESqgd) - + 0.5 * (qgga-qggc + qggb-qggd); - capgs = cgsna; - capgd = cgdna; - - /* - * store small-signal parameters - */ - if( (!(ckt->CKTmode & MODETRANOP)) || - (!(ckt->CKTmode & MODEUIC)) ) { - if(ckt->CKTmode & MODEINITSMSIG) { - *(ckt->CKTstate0 + here->MESqgs) = capgs; - *(ckt->CKTstate0 + here->MESqgd) = capgd; - continue; /*go to 1000*/ - } - /* - * transient analysis - */ - if(ckt->CKTmode & MODEINITTRAN) { - *(ckt->CKTstate1 + here->MESqgs) = - *(ckt->CKTstate0 + here->MESqgs); - *(ckt->CKTstate1 + here->MESqgd) = - *(ckt->CKTstate0 + here->MESqgd); - } - error = NIintegrate(ckt,&geq,&ceq,capgs,here->MESqgs); - if(error) return(error); - ggs = ggs + geq; - cg = cg + *(ckt->CKTstate0 + here->MEScqgs); - error = NIintegrate(ckt,&geq,&ceq,capgd,here->MESqgd); - if(error) return(error); - ggd = ggd + geq; - cg = cg + *(ckt->CKTstate0 + here->MEScqgd); - cd = cd - *(ckt->CKTstate0 + here->MEScqgd); - cgd = cgd + *(ckt->CKTstate0 + here->MEScqgd); - if (ckt->CKTmode & MODEINITTRAN) { - *(ckt->CKTstate1 + here->MEScqgs) = - *(ckt->CKTstate0 + here->MEScqgs); - *(ckt->CKTstate1 + here->MEScqgd) = - *(ckt->CKTstate0 + here->MEScqgd); - } - } - } - /* - * check convergence - */ - if( (!(ckt->CKTmode & MODEINITFIX)) | (!(ckt->CKTmode & MODEUIC))) { - if((icheck == 1) || - (fabs(cghat-cg) >= ckt->CKTreltol * - MAX(fabs(cghat),fabs(cg))+ckt->CKTabstol) || - (fabs(cdhat-cd) > ckt->CKTreltol* - MAX(fabs(cdhat),fabs(cd))+ckt->CKTabstol)) { - ckt->CKTnoncon++; - ckt->CKTtroubleElt = (GENinstance *) here; - } - } - *(ckt->CKTstate0 + here->MESvgs) = vgs; - *(ckt->CKTstate0 + here->MESvgd) = vgd; - *(ckt->CKTstate0 + here->MEScg) = cg; - *(ckt->CKTstate0 + here->MEScd) = cd; - *(ckt->CKTstate0 + here->MEScgd) = cgd; - *(ckt->CKTstate0 + here->MESgm) = gm; - *(ckt->CKTstate0 + here->MESgds) = gds; - *(ckt->CKTstate0 + here->MESggs) = ggs; - *(ckt->CKTstate0 + here->MESggd) = ggd; - /* - * load current vector - */ -load: - - m = here->MESm; - - ceqgd=model->MEStype*(cgd-ggd*vgd); - ceqgs=model->MEStype*((cg-cgd)-ggs*vgs); - cdreq=model->MEStype*((cd+cgd)-gds*vds-gm*vgs); - *(ckt->CKTrhs + here->MESgateNode) += m * (-ceqgs-ceqgd); - *(ckt->CKTrhs + here->MESdrainPrimeNode) += - m * (-cdreq+ceqgd); - *(ckt->CKTrhs + here->MESsourcePrimeNode) += - m * (cdreq+ceqgs); - /* - * load y matrix - */ - *(here->MESdrainDrainPrimePtr) += m * (-gdpr); - *(here->MESgateDrainPrimePtr) += m * (-ggd); - *(here->MESgateSourcePrimePtr) += m * (-ggs); - *(here->MESsourceSourcePrimePtr) += m * (-gspr); - *(here->MESdrainPrimeDrainPtr) += m * (-gdpr); - *(here->MESdrainPrimeGatePtr) += m * (gm-ggd); - *(here->MESdrainPrimeSourcePrimePtr) += m * (-gds-gm); - *(here->MESsourcePrimeGatePtr) += m * (-ggs-gm); - *(here->MESsourcePrimeSourcePtr) += m * (-gspr); - *(here->MESsourcePrimeDrainPrimePtr) += m * (-gds); - *(here->MESdrainDrainPtr) += m * (gdpr); - *(here->MESgateGatePtr) += m * (ggd+ggs); - *(here->MESsourceSourcePtr) += m * (gspr); - *(here->MESdrainPrimeDrainPrimePtr) += m * (gdpr+gds+ggd); - *(here->MESsourcePrimeSourcePrimePtr) += m * (gspr+gds+gm+ggs); - } - } - return(OK); -} - - -/* function qggnew - private, used by MESload*/ -static double -qggnew( - double vgs, double vgd, double phib, double vcap, double vto, double cgs, double cgd, double *cgsnew, double *cgdnew) -{ - double veroot,veff1,veff2,del,vnroot,vnew1,vnew3,vmax,ext; - double qroot,qggval,par1,cfact,cplus,cminus; - - veroot = sqrt( (vgs - vgd) * (vgs - vgd) + vcap*vcap ); - veff1 = 0.5 * (vgs + vgd + veroot); - veff2 = veff1 - veroot; - del = 0.2; - vnroot = sqrt( (veff1 - vto)*(veff1 - vto) + del * del ); - vnew1 = 0.5 * (veff1 + vto + vnroot); - vnew3 = vnew1; - vmax = 0.5; - if ( vnew1 < vmax ) { - ext=0; - } else { - vnew1 = vmax; - ext = (vnew3 - vmax)/sqrt(1 - vmax/phib); - } - - qroot = sqrt(1 - vnew1/phib); - qggval = cgs * (2*phib*(1-qroot) + ext) + cgd*veff2; - par1 = 0.5 * ( 1 + (veff1-vto)/vnroot); - cfact = (vgs- vgd)/veroot; - cplus = 0.5 * (1 + cfact); - cminus = cplus - cfact; - *cgsnew = cgs/qroot*par1*cplus + cgd*cminus; - *cgdnew = cgs/qroot*par1*cminus + cgd*cplus; - return(qggval); -} diff --git a/src/spicelib/devices/mes/mesmask.c b/src/spicelib/devices/mes/mesmask.c deleted file mode 100644 index 2f26612d1..000000000 --- a/src/spicelib/devices/mes/mesmask.c +++ /dev/null @@ -1,84 +0,0 @@ -/********** -Copyright 1990 Regents of the University of California. All rights reserved. -Author: 1987 Thomas L. Quarles -**********/ -/* - */ - -#include "ngspice/ngspice.h" -#include "ngspice/cktdefs.h" -#include "ngspice/devdefs.h" -#include "ngspice/ifsim.h" -#include "mesdefs.h" -#include "ngspice/sperror.h" -#include "ngspice/suffix.h" - - -/* ARGSUSED */ -int -MESmAsk(CKTcircuit *ckt, GENmodel *inst, int which, IFvalue *value) -{ - MESmodel *here = (MESmodel*)inst; - - NG_IGNORE(ckt); - - switch(which) { - case MES_MOD_VTO: - value->rValue = here->MESthreshold; - return (OK); - case MES_MOD_ALPHA: - value->rValue = here->MESalpha; - return (OK); - case MES_MOD_BETA: - value->rValue = here->MESbeta; - return (OK); - case MES_MOD_LAMBDA: - value->rValue = here->MESlModulation; - return (OK); - case MES_MOD_B: - value->rValue = here->MESb; - return (OK); - case MES_MOD_RD: - value->rValue = here->MESdrainResist; - return (OK); - case MES_MOD_RS: - value->rValue = here->MESsourceResist; - return (OK); - case MES_MOD_CGS: - value->rValue = here->MEScapGS; - return (OK); - case MES_MOD_CGD: - value->rValue = here->MEScapGD; - return (OK); - case MES_MOD_PB: - value->rValue = here->MESgatePotential; - return (OK); - case MES_MOD_IS: - value->rValue = here->MESgateSatCurrent; - return (OK); - case MES_MOD_FC: - value->rValue = here->MESdepletionCapCoeff; - return (OK); - case MES_MOD_DRAINCONDUCT: - value->rValue = here->MESdrainConduct; - return (OK); - case MES_MOD_SOURCECONDUCT: - value->rValue = here->MESsourceConduct; - return (OK); - case MES_MOD_DEPLETIONCAP: - value->rValue = here->MESdepletionCap; - return (OK); - case MES_MOD_VCRIT: - value->rValue = here->MESvcrit; - return (OK); - case MES_MOD_TYPE: - if (here->MEStype == NMF) - value->sValue = "nmf"; - else - value->sValue = "pmf"; - return (OK); - default: - return (E_BADPARM); - } - /* NOTREACHED */ -} diff --git a/src/spicelib/devices/mes/mesmpar.c b/src/spicelib/devices/mes/mesmpar.c deleted file mode 100644 index 3289b503e..000000000 --- a/src/spicelib/devices/mes/mesmpar.c +++ /dev/null @@ -1,90 +0,0 @@ -/********** -Copyright 1990 Regents of the University of California. All rights reserved. -Author: 1985 S. Hwang -**********/ -/* - */ - -#include "ngspice/ngspice.h" -#include "ngspice/ifsim.h" -#include "mesdefs.h" -#include "ngspice/sperror.h" -#include "ngspice/suffix.h" - - -int -MESmParam(int param, IFvalue *value, GENmodel *inModel) -{ - MESmodel *model = (MESmodel*)inModel; - switch(param) { - case MES_MOD_VTO: - model->MESthresholdGiven = TRUE; - model->MESthreshold = value->rValue; - break; - case MES_MOD_ALPHA: - model->MESalphaGiven = TRUE; - model->MESalpha = value->rValue; - break; - case MES_MOD_BETA: - model->MESbetaGiven = TRUE; - model->MESbeta = value->rValue; - break; - case MES_MOD_LAMBDA: - model->MESlModulationGiven = TRUE; - model->MESlModulation = value->rValue; - break; - case MES_MOD_B: - model->MESbGiven = TRUE; - model->MESb = value->rValue; - break; - case MES_MOD_RD: - model->MESdrainResistGiven = TRUE; - model->MESdrainResist = value->rValue; - break; - case MES_MOD_RS: - model->MESsourceResistGiven = TRUE; - model->MESsourceResist = value->rValue; - break; - case MES_MOD_CGS: - model->MEScapGSGiven = TRUE; - model->MEScapGS = value->rValue; - break; - case MES_MOD_CGD: - model->MEScapGDGiven = TRUE; - model->MEScapGD = value->rValue; - break; - case MES_MOD_PB: - model->MESgatePotentialGiven = TRUE; - model->MESgatePotential = value->rValue; - break; - case MES_MOD_IS: - model->MESgateSatCurrentGiven = TRUE; - model->MESgateSatCurrent = value->rValue; - break; - case MES_MOD_FC: - model->MESdepletionCapCoeffGiven = TRUE; - model->MESdepletionCapCoeff = value->rValue; - break; - case MES_MOD_NMF: - if(value->iValue) { - model->MEStype = NMF; - } - break; - case MES_MOD_PMF: - if(value->iValue) { - model->MEStype = PMF; - } - break; - case MES_MOD_KF: - model->MESfNcoefGiven = TRUE; - model->MESfNcoef = value->rValue; - break; - case MES_MOD_AF: - model->MESfNexpGiven = TRUE; - model->MESfNexp = value->rValue; - break; - default: - return(E_BADPARM); - } - return(OK); -} diff --git a/src/spicelib/devices/mes/mesnoise.c b/src/spicelib/devices/mes/mesnoise.c deleted file mode 100644 index 8cb3c9d9f..000000000 --- a/src/spicelib/devices/mes/mesnoise.c +++ /dev/null @@ -1,179 +0,0 @@ -/********** -Copyright 1990 Regents of the University of California. All rights reserved. -Author: 1987 Gary W. Ng -**********/ - -#include "ngspice/ngspice.h" -#include "mesdefs.h" -#include "ngspice/cktdefs.h" -#include "ngspice/iferrmsg.h" -#include "ngspice/noisedef.h" -#include "ngspice/suffix.h" - -/* - * MESnoise (mode, operation, firstModel, ckt, data, OnDens) - * This routine names and evaluates all of the noise sources - * associated with MESFET's. It starts with the model *firstModel and - * traverses all of its insts. It then proceeds to any other models - * on the linked list. The total output noise density generated by - * all of the MESFET's is summed with the variable "OnDens". - */ - - -int -MESnoise (int mode, int operation, GENmodel *genmodel, CKTcircuit *ckt, Ndata *data, - double *OnDens) -{ - NOISEAN *job = (NOISEAN *) ckt->CKTcurJob; - - MESmodel *firstModel = (MESmodel *) genmodel; - MESmodel *model; - MESinstance *inst; - double tempOnoise; - double tempInoise; - double noizDens[MESNSRCS]; - double lnNdens[MESNSRCS]; - int i; - - /* define the names of the noise sources */ - - static char *MESnNames[MESNSRCS] = { /* Note that we have to keep the order */ - "_rd", /* noise due to rd */ /* consistent with thestrchr definitions */ - "_rs", /* noise due to rs */ /* in MESdefs.h */ - "_id", /* noise due to id */ - "_1overf", /* flicker (1/f) noise */ - "" /* total transistor noise */ - }; - - for (model=firstModel; model != NULL; model=MESnextModel(model)) { - for (inst=MESinstances(model); inst != NULL; inst=MESnextInstance(inst)) { - - switch (operation) { - - case N_OPEN: - - /* see if we have to to produce a summary report */ - /* if so, name all the noise generators */ - - if (job->NStpsSm != 0) { - switch (mode) { - - case N_DENS: - for (i=0; i < MESNSRCS; i++) { - NOISE_ADD_OUTVAR(ckt, data, "onoise_%s%s", inst->MESname, MESnNames[i]); - } - break; - - case INT_NOIZ: - for (i=0; i < MESNSRCS; i++) { - NOISE_ADD_OUTVAR(ckt, data, "onoise_total_%s%s", inst->MESname, MESnNames[i]); - NOISE_ADD_OUTVAR(ckt, data, "inoise_total_%s%s", inst->MESname, MESnNames[i]); - } - break; - } - } - break; - - case N_CALC: - switch (mode) { - - case N_DENS: - NevalSrc(&noizDens[MESRDNOIZ],&lnNdens[MESRDNOIZ], - ckt,THERMNOISE,inst->MESdrainPrimeNode,inst->MESdrainNode, - model->MESdrainConduct * inst->MESarea * inst->MESm); - - NevalSrc(&noizDens[MESRSNOIZ],&lnNdens[MESRSNOIZ], - ckt,THERMNOISE,inst->MESsourcePrimeNode,inst->MESsourceNode, - model->MESsourceConduct * inst->MESarea * inst->MESm); - - NevalSrc(&noizDens[MESIDNOIZ],&lnNdens[MESIDNOIZ], - ckt,THERMNOISE,inst->MESdrainPrimeNode, - inst->MESsourcePrimeNode, - (2.0/3.0 * inst->MESm * fabs(*(ckt->CKTstate0 + inst->MESgm)))); - - NevalSrc(&noizDens[MESFLNOIZ], NULL, ckt, - N_GAIN,inst->MESdrainPrimeNode, inst->MESsourcePrimeNode, - (double)0.0); - noizDens[MESFLNOIZ] *= inst->MESm * model->MESfNcoef * - exp(model->MESfNexp * - log(MAX(fabs(*(ckt->CKTstate0 + inst->MEScd)),N_MINLOG))) / - data->freq; - lnNdens[MESFLNOIZ] = - log(MAX(noizDens[MESFLNOIZ],N_MINLOG)); - - noizDens[MESTOTNOIZ] = noizDens[MESRDNOIZ] + - noizDens[MESRSNOIZ] + - noizDens[MESIDNOIZ] + - noizDens[MESFLNOIZ]; - lnNdens[MESTOTNOIZ] = - log(MAX(noizDens[MESTOTNOIZ], N_MINLOG)); - - *OnDens += noizDens[MESTOTNOIZ]; - - if (data->delFreq == 0.0) { - - /* if we haven't done any previous integration, we need to */ - /* initialize our "history" variables */ - - for (i=0; i < MESNSRCS; i++) { - inst->MESnVar[LNLSTDENS][i] = lnNdens[i]; - } - - /* clear out our integration variables if it's the first pass */ - - if (data->freq == job->NstartFreq) { - for (i=0; i < MESNSRCS; i++) { - inst->MESnVar[OUTNOIZ][i] = 0.0; - inst->MESnVar[INNOIZ][i] = 0.0; - } - } - } else { /* data->delFreq != 0.0 (we have to integrate) */ - for (i=0; i < MESNSRCS; i++) { - if (i != MESTOTNOIZ) { - tempOnoise = Nintegrate(noizDens[i], lnNdens[i], - inst->MESnVar[LNLSTDENS][i], data); - tempInoise = Nintegrate(noizDens[i] * data->GainSqInv , - lnNdens[i] + data->lnGainInv, - inst->MESnVar[LNLSTDENS][i] + data->lnGainInv, - data); - inst->MESnVar[LNLSTDENS][i] = lnNdens[i]; - data->outNoiz += tempOnoise; - data->inNoise += tempInoise; - if (job->NStpsSm != 0) { - inst->MESnVar[OUTNOIZ][i] += tempOnoise; - inst->MESnVar[OUTNOIZ][MESTOTNOIZ] += tempOnoise; - inst->MESnVar[INNOIZ][i] += tempInoise; - inst->MESnVar[INNOIZ][MESTOTNOIZ] += tempInoise; - } - } - } - } - if (data->prtSummary) { - for (i=0; i < MESNSRCS; i++) { /* print a summary report */ - data->outpVector[data->outNumber++] = noizDens[i]; - } - } - break; - - case INT_NOIZ: /* already calculated, just output */ - if (job->NStpsSm != 0) { - for (i=0; i < MESNSRCS; i++) { - data->outpVector[data->outNumber++] = inst->MESnVar[OUTNOIZ][i]; - data->outpVector[data->outNumber++] = inst->MESnVar[INNOIZ][i]; - } - } /* if */ - break; - } /* switch (mode) */ - break; - - case N_CLOSE: - return (OK); /* do nothing, the main calling routine will close */ - break; /* the plots */ - } /* switch (operation) */ - } /* for inst */ - } /* for model */ - -return(OK); -} - - diff --git a/src/spicelib/devices/mes/mesparam.c b/src/spicelib/devices/mes/mesparam.c deleted file mode 100644 index d6bd06a6c..000000000 --- a/src/spicelib/devices/mes/mesparam.c +++ /dev/null @@ -1,63 +0,0 @@ -/********** -Copyright 1990 Regents of the University of California. All rights reserved. -Author: 1985 S. Hwang -**********/ -/* - */ - -#include "ngspice/ngspice.h" -#include "ngspice/ifsim.h" -#include "mesdefs.h" -#include "ngspice/sperror.h" -#include "ngspice/suffix.h" - - -/* ARGSUSED */ -int -MESparam(int param, IFvalue *value, GENinstance *inst, IFvalue *select) -{ - MESinstance *here = (MESinstance*)inst; - - NG_IGNORE(select); - - switch (param) { - case MES_AREA: - here->MESarea = value->rValue; - here->MESareaGiven = TRUE; - break; - case MES_M: - here->MESm = value->rValue; - here->MESmGiven = TRUE; - break; - case MES_IC_VDS: - here->MESicVDS = value->rValue; - here->MESicVDSGiven = TRUE; - break; - case MES_IC_VGS: - here->MESicVGS = value->rValue; - here->MESicVGSGiven = TRUE; - break; - case MES_OFF: - here->MESoff = value->iValue; - break; - case MES_IC: - /* FALLTHROUGH added to suppress GCC warning due to - * -Wimplicit-fallthrough flag */ - switch (value->v.numValue) { - case 2: - here->MESicVGS = *(value->v.vec.rVec+1); - here->MESicVGSGiven = TRUE; - /* FALLTHROUGH */ - case 1: - here->MESicVDS = *(value->v.vec.rVec); - here->MESicVDSGiven = TRUE; - break; - default: - return(E_BADPARM); - } - break; - default: - return(E_BADPARM); - } - return(OK); -} diff --git a/src/spicelib/devices/mes/mespzld.c b/src/spicelib/devices/mes/mespzld.c deleted file mode 100644 index 97af33fab..000000000 --- a/src/spicelib/devices/mes/mespzld.c +++ /dev/null @@ -1,81 +0,0 @@ -/********** -Copyright 1990 Regents of the University of California. All rights reserved. -Author: 1985 S. Hwang -**********/ -/* - */ - -#include "ngspice/ngspice.h" -#include "ngspice/cktdefs.h" -#include "mesdefs.h" -#include "ngspice/sperror.h" -#include "ngspice/complex.h" -#include "ngspice/suffix.h" - - -int -MESpzLoad(GENmodel *inModel, CKTcircuit *ckt, SPcomplex *s) -{ - MESmodel *model = (MESmodel*)inModel; - MESinstance *here; - double gdpr; - double gspr; - double gm; - double gds; - double ggs; - double xgs; - double ggd; - double xgd; - - double m; - - for( ; model != NULL; model = MESnextModel(model)) { - - for( here = MESinstances(model); here != NULL; - here = MESnextInstance(here)) { - - m = here->MESm; - - gdpr=model->MESdrainConduct * here->MESarea; - gspr=model->MESsourceConduct * here->MESarea; - gm= *(ckt->CKTstate0 + here->MESgm) ; - gds= *(ckt->CKTstate0 + here->MESgds) ; - ggs= *(ckt->CKTstate0 + here->MESggs) ; - xgs= *(ckt->CKTstate0 + here->MESqgs) ; - ggd= *(ckt->CKTstate0 + here->MESggd) ; - xgd= *(ckt->CKTstate0 + here->MESqgd) ; - - *(here->MESdrainDrainPtr ) += m * gdpr; - *(here->MESgateGatePtr ) += m * ggd+ggs; - *(here->MESgateGatePtr ) += m * (xgd+xgs)*s->real; - *(here->MESgateGatePtr +1) += m * (xgd+xgs)*s->imag; - *(here->MESsourceSourcePtr ) += m * gspr; - *(here->MESdrainPrimeDrainPrimePtr ) += m * gdpr+gds+ggd; - *(here->MESdrainPrimeDrainPrimePtr ) += m * xgd*s->real; - *(here->MESdrainPrimeDrainPrimePtr +1) += m * xgd*s->imag; - *(here->MESsourcePrimeSourcePrimePtr ) += m * gspr+gds+gm+ggs; - *(here->MESsourcePrimeSourcePrimePtr ) += m * xgs*s->real; - *(here->MESsourcePrimeSourcePrimePtr +1) += m * xgs*s->imag; - *(here->MESdrainDrainPrimePtr ) -= m * gdpr; - *(here->MESgateDrainPrimePtr ) -= m * ggd; - *(here->MESgateDrainPrimePtr ) -= m * xgd*s->real; - *(here->MESgateDrainPrimePtr +1) -= m * xgd*s->imag; - *(here->MESgateSourcePrimePtr ) -= m * ggs; - *(here->MESgateSourcePrimePtr ) -= m * xgs*s->real; - *(here->MESgateSourcePrimePtr +1) -= m * xgs*s->imag; - *(here->MESsourceSourcePrimePtr ) -= m * gspr; - *(here->MESdrainPrimeDrainPtr ) -= m * gdpr; - *(here->MESdrainPrimeGatePtr ) += m * (-ggd+gm); - *(here->MESdrainPrimeGatePtr ) -= m * xgd*s->real; - *(here->MESdrainPrimeGatePtr +1) -= m * xgd*s->imag; - *(here->MESdrainPrimeSourcePrimePtr ) += m * (-gds-gm); - *(here->MESsourcePrimeGatePtr ) += m * (-ggs-gm); - *(here->MESsourcePrimeGatePtr ) -= m * xgs*s->real; - *(here->MESsourcePrimeGatePtr +1) -= m * xgs*s->imag; - *(here->MESsourcePrimeSourcePtr ) -= m * gspr; - *(here->MESsourcePrimeDrainPrimePtr ) -= m * gds; - - } - } - return(OK); -} diff --git a/src/spicelib/devices/mes/messetup.c b/src/spicelib/devices/mes/messetup.c deleted file mode 100644 index 61f0dac9e..000000000 --- a/src/spicelib/devices/mes/messetup.c +++ /dev/null @@ -1,183 +0,0 @@ -/********** -Copyright 1990 Regents of the University of California. All rights reserved. -Author: 1985 S. Hwang -Modified: 2000 AlansFixes -**********/ - -#include "ngspice/ngspice.h" -#include "ngspice/smpdefs.h" -#include "ngspice/cktdefs.h" -#include "mesdefs.h" -#include "ngspice/const.h" -#include "ngspice/sperror.h" -#include "ngspice/suffix.h" - -int -MESsetup(SMPmatrix *matrix, GENmodel *inModel, CKTcircuit *ckt, int *states) - /* load the diode structure with those pointers needed later - * for fast matrix loading - */ -{ - MESmodel *model = (MESmodel*)inModel; - MESinstance *here; - int error; - CKTnode *tmp; - - /* loop through all the diode models */ - for( ; model != NULL; model = MESnextModel(model)) { - - if( (model->MEStype != NMF) && (model->MEStype != PMF) ) { - model->MEStype = NMF; - } - if(!model->MESthresholdGiven) { - model->MESthreshold = -2; - } - if(!model->MESbetaGiven) { - model->MESbeta = 2.5e-3; - } - if(!model->MESbGiven) { - model->MESb = 0.3; - } - if(!model->MESalphaGiven) { - model->MESalpha = 2; - } - if(!model->MESlModulationGiven) { - model->MESlModulation = 0; - } - if(!model->MESdrainResistGiven) { - model->MESdrainResist = 0; - } - if(!model->MESsourceResistGiven) { - model->MESsourceResist = 0; - } - if(!model->MEScapGSGiven) { - model->MEScapGS = 0; - } - if(!model->MEScapGDGiven) { - model->MEScapGD = 0; - } - if(!model->MESgatePotentialGiven) { - model->MESgatePotential = 1; - } - if(!model->MESgateSatCurrentGiven) { - model->MESgateSatCurrent = 1e-14; - } - if(!model->MESdepletionCapCoeffGiven) { - model->MESdepletionCapCoeff = .5; - } - if(!model->MESfNcoefGiven) { - model->MESfNcoef = 0; - } - if(!model->MESfNexpGiven) { - model->MESfNexp = 1; - } - - /* loop through all the instances of the model */ - for (here = MESinstances(model); here != NULL ; - here=MESnextInstance(here)) { - - if(!here->MESareaGiven) { - here->MESarea = 1.0; - } - if(!here->MESmGiven) { - here->MESm = 1.0; - } - here->MESstate = *states; - *states += MESnumStates; - - if(model->MESsourceResist != 0) { - if(here->MESsourcePrimeNode == 0) { - error = CKTmkVolt(ckt,&tmp,here->MESname,"source"); - if(error) return(error); - here->MESsourcePrimeNode = tmp->number; - - if (ckt->CKTcopyNodesets) { - CKTnode *tmpNode; - IFuid tmpName; - - if (CKTinst2Node(ckt,here,3,&tmpNode,&tmpName)==OK) { - if (tmpNode->nsGiven) { - tmp->nodeset=tmpNode->nodeset; - tmp->nsGiven=tmpNode->nsGiven; - } - } - } - } - - } else { - here->MESsourcePrimeNode = here->MESsourceNode; - } - if(model->MESdrainResist != 0) { - if(here->MESdrainPrimeNode == 0) { - error = CKTmkVolt(ckt,&tmp,here->MESname,"drain"); - if(error) return(error); - here->MESdrainPrimeNode = tmp->number; - - if (ckt->CKTcopyNodesets) { - CKTnode *tmpNode; - IFuid tmpName; - - if (CKTinst2Node(ckt,here,1,&tmpNode,&tmpName)==OK) { - if (tmpNode->nsGiven) { - tmp->nodeset=tmpNode->nodeset; - tmp->nsGiven=tmpNode->nsGiven; - } - } - } - } - - } else { - here->MESdrainPrimeNode = here->MESdrainNode; - } - -/* macro to make elements with built in test for out of memory */ -#define TSTALLOC(ptr,first,second) \ -do { if((here->ptr = SMPmakeElt(matrix, here->first, here->second)) == NULL){\ - return(E_NOMEM);\ -} } while(0) - - TSTALLOC(MESdrainDrainPrimePtr,MESdrainNode,MESdrainPrimeNode); - TSTALLOC(MESgateDrainPrimePtr,MESgateNode,MESdrainPrimeNode); - TSTALLOC(MESgateSourcePrimePtr,MESgateNode,MESsourcePrimeNode); - TSTALLOC(MESsourceSourcePrimePtr,MESsourceNode,MESsourcePrimeNode); - TSTALLOC(MESdrainPrimeDrainPtr,MESdrainPrimeNode,MESdrainNode); - TSTALLOC(MESdrainPrimeGatePtr,MESdrainPrimeNode,MESgateNode); - TSTALLOC(MESdrainPrimeSourcePrimePtr,MESdrainPrimeNode,MESsourcePrimeNode); - TSTALLOC(MESsourcePrimeGatePtr,MESsourcePrimeNode,MESgateNode); - TSTALLOC(MESsourcePrimeSourcePtr,MESsourcePrimeNode,MESsourceNode); - TSTALLOC(MESsourcePrimeDrainPrimePtr,MESsourcePrimeNode,MESdrainPrimeNode); - TSTALLOC(MESdrainDrainPtr,MESdrainNode,MESdrainNode); - TSTALLOC(MESgateGatePtr,MESgateNode,MESgateNode); - TSTALLOC(MESsourceSourcePtr,MESsourceNode,MESsourceNode); - TSTALLOC(MESdrainPrimeDrainPrimePtr,MESdrainPrimeNode,MESdrainPrimeNode); - TSTALLOC(MESsourcePrimeSourcePrimePtr,MESsourcePrimeNode,MESsourcePrimeNode); - } - } - return(OK); -} - -int -MESunsetup(GENmodel *inModel, CKTcircuit *ckt) -{ - MESmodel *model; - MESinstance *here; - - for (model = (MESmodel *)inModel; model != NULL; - model = MESnextModel(model)) - { - for (here = MESinstances(model); here != NULL; - here=MESnextInstance(here)) - { - if (here->MESdrainPrimeNode > 0 - && here->MESdrainPrimeNode != here->MESdrainNode) - CKTdltNNum(ckt, here->MESdrainPrimeNode); - here->MESdrainPrimeNode = 0; - - if (here->MESsourcePrimeNode > 0 - && here->MESsourcePrimeNode != here->MESsourceNode) - CKTdltNNum(ckt, here->MESsourcePrimeNode); - here->MESsourcePrimeNode = 0; - } - } - return OK; -} diff --git a/src/spicelib/devices/mes/mestemp.c b/src/spicelib/devices/mes/mestemp.c deleted file mode 100644 index 1329bc9ab..000000000 --- a/src/spicelib/devices/mes/mestemp.c +++ /dev/null @@ -1,52 +0,0 @@ -/********** -Copyright 1990 Regents of the University of California. All rights reserved. -Author: 1985 S. Hwang -**********/ - -#include "ngspice/ngspice.h" -#include "ngspice/smpdefs.h" -#include "ngspice/cktdefs.h" -#include "mesdefs.h" -#include "ngspice/const.h" -#include "ngspice/sperror.h" -#include "ngspice/suffix.h" - -/* ARGSUSED */ -int -MEStemp(GENmodel *inModel, CKTcircuit *ckt) - /* load the mes structure with those pointers needed later - * for fast matrix loading - */ -{ - MESmodel *model = (MESmodel*)inModel; - double xfc, temp; - - NG_IGNORE(ckt); - - /* loop through all the diode models */ - for( ; model != NULL; model = MESnextModel(model)) { - - if(model->MESdrainResist != 0) { - model->MESdrainConduct = 1/model->MESdrainResist; - } else { - model->MESdrainConduct = 0; - } - if(model->MESsourceResist != 0) { - model->MESsourceConduct = 1/model->MESsourceResist; - } else { - model->MESsourceConduct = 0; - } - - model->MESdepletionCap = model->MESdepletionCapCoeff * - model->MESgatePotential; - xfc = (1 - model->MESdepletionCapCoeff); - temp = sqrt(xfc); - model->MESf1 = model->MESgatePotential * (1 - temp)/(1-.5); - model->MESf2 = temp * temp * temp; - model->MESf3 = 1 - model->MESdepletionCapCoeff * (1 + .5); - model->MESvcrit = CONSTvt0 * log(CONSTvt0/ - (CONSTroot2 * model->MESgateSatCurrent)); - - } - return(OK); -} diff --git a/src/spicelib/devices/mes/mestrunc.c b/src/spicelib/devices/mes/mestrunc.c deleted file mode 100644 index b6d8f5354..000000000 --- a/src/spicelib/devices/mes/mestrunc.c +++ /dev/null @@ -1,29 +0,0 @@ -/********** -Copyright 1990 Regents of the University of California. All rights reserved. -Author: 1985 S. Hwang -**********/ -/* - */ - -#include "ngspice/ngspice.h" -#include "ngspice/cktdefs.h" -#include "mesdefs.h" -#include "ngspice/sperror.h" -#include "ngspice/suffix.h" - - -int -MEStrunc(GENmodel *inModel, CKTcircuit *ckt, double *timeStep) -{ - MESmodel *model = (MESmodel*)inModel; - MESinstance *here; - - for( ; model != NULL; model = MESnextModel(model)) { - for(here=MESinstances(model);here!=NULL;here = MESnextInstance(here)){ - - CKTterr(here->MESqgs,ckt,timeStep); - CKTterr(here->MESqgd,ckt,timeStep); - } - } - return(OK); -} diff --git a/src/spicelib/devices/mesa/Makefile.am b/src/spicelib/devices/mesa/Makefile.am deleted file mode 100644 index 9be5afe28..000000000 --- a/src/spicelib/devices/mesa/Makefile.am +++ /dev/null @@ -1,28 +0,0 @@ -## Process this file with automake to produce Makefile.in - -noinst_LTLIBRARIES = libmesa.la - -libmesa_la_SOURCES = \ - mesa.c \ - mesaacl.c \ - mesaask.c \ - mesadefs.h \ - mesaext.h \ - mesagetic.c \ - mesainit.c \ - mesainit.h \ - mesaitf.h \ - mesaload.c \ - mesamask.c \ - mesamparam.c \ - mesaparam.c \ - mesapzl.c \ - mesasetup.c \ - mesatemp.c \ - mesatrunc.c - - - -AM_CPPFLAGS = @AM_CPPFLAGS@ -I$(top_srcdir)/src/include -AM_CFLAGS = $(STATIC) -MAINTAINERCLEANFILES = Makefile.in diff --git a/src/spicelib/devices/mesa/mesa.c b/src/spicelib/devices/mesa/mesa.c deleted file mode 100644 index a4ed51a53..000000000 --- a/src/spicelib/devices/mesa/mesa.c +++ /dev/null @@ -1,131 +0,0 @@ -/********** -Copyright 1993: T. Ytterdal, K. Lee, M. Shur and T. A. Fjeldly. All rights reserved. -Author: Trond Ytterdal -**********/ - -#include "ngspice/ngspice.h" -#include "ngspice/ifsim.h" -#include "ngspice/devdefs.h" -#include "mesadefs.h" -#include "ngspice/suffix.h" - - -IFparm MESApTable[] = { /* parameters */ - OP("off", MESA_OFF, IF_FLAG ,"Device initially off"), - IOP("l", MESA_LENGTH, IF_REAL ,"Length of device"), - IOP("w", MESA_WIDTH, IF_REAL ,"Width of device"), - IOP("m", MESA_M, IF_REAL ,"Parallel Multiplier"), - IOP("icvds", MESA_IC_VDS, IF_REAL ,"Initial D-S voltage"), - IOP("icvgs", MESA_IC_VGS, IF_REAL ,"Initial G-S voltage"), - IOP("td", MESA_TD, IF_REAL ,"Instance drain temperature"), - IOP("ts", MESA_TS, IF_REAL ,"Instance source temperature"), - IOP("dtemp", MESA_DTEMP, IF_REAL ,"Instance temperature difference"), - OP("dnode", MESA_DRAINNODE, IF_INTEGER,"Number of drain node"), - OP("gnode", MESA_GATENODE, IF_INTEGER,"Number of gate node"), - OP("snode", MESA_SOURCENODE, IF_INTEGER,"Number of source node"), - OP("dprimenode",MESA_DRAINPRIMENODE, IF_INTEGER,"Number of internal drain node"), - OP("sprimenode",MESA_SOURCEPRIMENODE,IF_INTEGER,"Number of internal source node"), - OP("gprimenode",MESA_GATEPRIMENODE, IF_INTEGER,"Number of internal gate node"), - OP("vgs", MESA_VGS, IF_REAL,"Gate-Source voltage"), - OP("vgd", MESA_VGD, IF_REAL,"Gate-Drain voltage"), - OP("cg", MESA_CG, IF_REAL,"Gate capacitance"), - OP("cd", MESA_CD, IF_REAL,"Drain capacitance"), - OP("cgd", MESA_CGD, IF_REAL,"Gate_Drain capacitance"), - OP("gm", MESA_GM, IF_REAL,"Transconductance"), - OP("gds", MESA_GDS, IF_REAL,"Drain-Source conductance"), - OP("ggs", MESA_GGS, IF_REAL,"Gate-Source conductance"), - OP("ggd", MESA_GGD, IF_REAL,"Gate-Drain conductance"), - OP("qgs", MESA_QGS, IF_REAL,"Gate-Source charge storage"), - OP("cqgs", MESA_CQGS, IF_REAL,"Capacitance due to gate-source charge storage"), - OP("qgd", MESA_QGD, IF_REAL,"Gate-Drain charge storage"), - OP("cqgd", MESA_CQGD, IF_REAL,"Capacitance due to gate-drain charge storage"), - OP("cs", MESA_CS, IF_REAL,"Source current"), - OP("p", MESA_POWER, IF_REAL,"Power dissipated by the mesfet") - -}; - -IFparm MESAmPTable[] = { /* model parameters */ - OP( "type", MESA_MOD_TYPE, IF_STRING,"N-type or P-type MESfet model"), - IOP( "vto", MESA_MOD_VTO, IF_REAL,"Pinch-off voltage"), - IOPR("vt0", MESA_MOD_VTO, IF_REAL,"Pinch-off voltage"), - IOP( "lambda", MESA_MOD_LAMBDA, IF_REAL,"Output conductance parameter"), - IOP( "lambdahf",MESA_MOD_LAMBDAHF, IF_REAL,"Output conductance parameter at high frequencies"), - IOP( "beta", MESA_MOD_BETA, IF_REAL,"Transconductance parameter"), - IOP( "vs", MESA_MOD_VS, IF_REAL,"Saturation velocity"), - IOP( "rd", MESA_MOD_RD, IF_REAL,"Drain ohmic resistance"), - IOP( "rs", MESA_MOD_RS, IF_REAL,"Source ohmic resistance"), - IOP( "rg", MESA_MOD_RG, IF_REAL,"Gate ohmic resistance"), - IOP( "ri", MESA_MOD_RI, IF_REAL,"Gate-source ohmic resistance"), - IOP( "rf", MESA_MOD_RF, IF_REAL,"Gate-drain ohmic resistance"), - IOP( "rdi", MESA_MOD_RDI, IF_REAL,"Intrinsic source ohmic resistance"), - IOP( "rsi", MESA_MOD_RSI, IF_REAL,"Intrinsic drain ohmic resistance"), - IOP( "phib", MESA_MOD_PHIB, IF_REAL,"Effective Schottky barrier height at room temperature"), - IOP( "phib1", MESA_MOD_PHIB1, IF_REAL,""), - IOPR("tphib", MESA_MOD_PHIB1, IF_REAL,""), - IOP( "astar", MESA_MOD_ASTAR, IF_REAL,"Effective Richardson constant"), - IOP( "ggr", MESA_MOD_GGR, IF_REAL,"Reverse diode conductance"), - IOP( "del", MESA_MOD_DEL, IF_REAL,""), - IOP( "xchi", MESA_MOD_XCHI, IF_REAL,""), - IOPR("tggr", MESA_MOD_XCHI, IF_REAL,""), - IOP( "n", MESA_MOD_N, IF_REAL,"Emission coefficient"), - IOP( "eta", MESA_MOD_ETA, IF_REAL,"Subthreshold ideality factor"), - IOP( "m", MESA_MOD_M, IF_REAL,"Knee shape parameter"), - IOP( "mc", MESA_MOD_MC, IF_REAL,"Knee shape parameter"), - IOP( "alpha", MESA_MOD_ALPHA, IF_REAL,""), - IOP( "sigma0", MESA_MOD_SIGMA0, IF_REAL,"Threshold voltage coefficient"), - IOP( "vsigmat",MESA_MOD_VSIGMAT,IF_REAL,""), - IOP( "vsigma", MESA_MOD_VSIGMA, IF_REAL,""), - IOP( "mu", MESA_MOD_MU, IF_REAL,"Mobility"), - IOP( "theta", MESA_MOD_THETA, IF_REAL,""), - IOP( "mu1", MESA_MOD_MU1, IF_REAL,"Second moblity parameter"), - IOP( "mu2", MESA_MOD_MU2, IF_REAL,"Third moblity parameter"), - IOP( "d", MESA_MOD_D, IF_REAL,"Depth of device"), - IOP( "nd", MESA_MOD_ND, IF_REAL,"Doping density"), - IOP( "du", MESA_MOD_DU, IF_REAL,"Depth of device"), - IOP( "ndu", MESA_MOD_NDU, IF_REAL,"Doping density"), - IOP( "th", MESA_MOD_TH, IF_REAL,"Thickness of delta doped layer"), - IOP( "ndelta", MESA_MOD_NDELTA, IF_REAL,"Delta doped layer doping density"), - IOP( "delta", MESA_MOD_DELTA, IF_REAL,""), - IOP( "tc", MESA_MOD_TC, IF_REAL,"Transconductance compression factor"), - IOP( "tvto", MESA_MOD_TVTO, IF_REAL,"Temperature coefficient for vto"), - IOPR("alphat", MESA_MOD_TVTO, IF_REAL,""), - IOP( "tlambda",MESA_MOD_TLAMBDA,IF_REAL,"Temperature coefficient for lambda"), - IOP( "teta0", MESA_MOD_TETA0, IF_REAL,"First temperature coefficient for eta"), - IOP( "teta1", MESA_MOD_TETA1, IF_REAL,"Second temperature coefficient for eta"), - IOP( "tmu", MESA_MOD_TMU, IF_REAL,"Temperature coefficient for mobility"), - IOP( "xtm0", MESA_MOD_XTM0, IF_REAL,"First exponent for temp dependence of mobility"), - IOP( "xtm1", MESA_MOD_XTM1, IF_REAL,"Second exponent for temp dependence of mobility"), - IOP( "xtm2", MESA_MOD_XTM2, IF_REAL,"Third exponent for temp dependence of mobility"), - IOP( "ks", MESA_MOD_KS, IF_REAL,"Sidegating coefficient"), - IOP( "vsg", MESA_MOD_VSG, IF_REAL,"Sidegating voltage"), - IOP( "tf", MESA_MOD_TF, IF_REAL,"Characteristic temperature determined by traps"), - IOP( "flo", MESA_MOD_FLO, IF_REAL,""), - IOP( "delfo", MESA_MOD_DELFO, IF_REAL,""), - IOP( "ag", MESA_MOD_AG, IF_REAL,""), - IOP( "rtc1", MESA_MOD_TC1, IF_REAL,""), - IOP( "rtc2", MESA_MOD_TC2, IF_REAL,""), - IOP( "zeta", MESA_MOD_ZETA, IF_REAL,""), - IOP( "level", MESA_MOD_LEVEL, IF_REAL,""), - IOP( "nmax", MESA_MOD_NMAX, IF_REAL,""), - IOP( "gamma", MESA_MOD_GAMMA, IF_REAL,""), - IOP( "epsi", MESA_MOD_EPSI, IF_REAL,""), - IOP( "cas", MESA_MOD_CAS, IF_REAL,""), - IOP( "cbs", MESA_MOD_CBS, IF_REAL,""), - IP( "pmf", MESA_MOD_PMF, IF_FLAG,"P type MESfet model"), - IP( "nmf", MESA_MOD_NMF, IF_FLAG,"N type MESfet model"), - OP( "gd", MESA_MOD_DRAINCONDUCT, IF_REAL,"Drain conductance"), - OP( "gs", MESA_MOD_SOURCECONDUCT, IF_REAL,"Source conductance"), - OP( "vcrit", MESA_MOD_VCRIT, IF_REAL,"Critical voltage"), -}; - -char *MESAnames[] = { - "Drain", - "Gate", - "Source" -}; - -int MESAnSize = NUMELEMS(MESAnames); -int MESApTSize = NUMELEMS(MESApTable); -int MESAmPTSize = NUMELEMS(MESAmPTable); -int MESAiSize = sizeof(MESAinstance); -int MESAmSize = sizeof(MESAmodel); diff --git a/src/spicelib/devices/mesa/mesaacl.c b/src/spicelib/devices/mesa/mesaacl.c deleted file mode 100644 index 67341f728..000000000 --- a/src/spicelib/devices/mesa/mesaacl.c +++ /dev/null @@ -1,99 +0,0 @@ -/********** -Copyright 1993: T. Ytterdal, K. Lee, M. Shur and T. A. Fjeldly. All rights reserved. -Author: Trond Ytterdal -**********/ - -#include "ngspice/ngspice.h" -#include "ngspice/cktdefs.h" -#include "mesadefs.h" -#include "ngspice/sperror.h" -#include "ngspice/suffix.h" - - -int -MESAacLoad(GENmodel *inModel, CKTcircuit *ckt) -{ - MESAmodel *model = (MESAmodel*)inModel; - MESAinstance *here; - double gm; - double gds; - double ggspp; - double ggdpp; - double ggs; - double xgs; - double ggd; - double xgd; - double f; - double lambda; - double vds; - double delidgch; - double delidvds; - - double m; - - for( ; model != NULL; model = MESAnextModel(model)) { - for( here = MESAinstances(model); here != NULL; - here = MESAnextInstance(here)) { - - f = ckt->CKTomega/2/M_PI; - if(here->MESAdelf == 0) - lambda = here->MESAtLambda; - else - lambda = here->MESAtLambda+0.5*(here->MESAtLambdahf-here->MESAtLambda)* - (1+tanh((f-here->MESAfl)/here->MESAdelf)); - vds= *(ckt->CKTstate0 + here->MESAvgs) - - *(ckt->CKTstate0 + here->MESAvgd); - delidgch = here->MESAdelidgch0*(1+lambda*vds); - delidvds = here->MESAdelidvds0*(1+2*lambda*vds) - - here->MESAdelidvds1; - gm = (delidgch*here->MESAgm0+here->MESAgm1)*here->MESAgm2; - gds = delidvds+here->MESAgds0; - - ggspp=*(ckt->CKTstate0 + here->MESAggspp); - ggdpp=*(ckt->CKTstate0 + here->MESAggdpp); - ggs= *(ckt->CKTstate0 + here->MESAggs) ; - xgs= *(ckt->CKTstate0 + here->MESAqgs) * ckt->CKTomega ; - ggd= *(ckt->CKTstate0 + here->MESAggd) ; - xgd= *(ckt->CKTstate0 + here->MESAqgd) * ckt->CKTomega ; - - m = here->MESAm; - - *(here->MESAdrainDrainPtr) += m * (here->MESAdrainConduct); - *(here->MESAsourceSourcePtr) += m * (here->MESAsourceConduct); - *(here->MESAgateGatePtr) += m * (here->MESAgateConduct); - *(here->MESAsourcePrmPrmSourcePrmPrmPtr) += m * (here->MESAtGi+ggspp); - *(here->MESAdrainPrmPrmDrainPrmPrmPtr) += m * (here->MESAtGf+ggdpp); - *(here->MESAdrainDrainPrimePtr) -= m * (here->MESAdrainConduct); - *(here->MESAdrainPrimeDrainPtr) -= m * (here->MESAdrainConduct); - *(here->MESAsourceSourcePrimePtr) -= m * (here->MESAsourceConduct); - *(here->MESAsourcePrimeSourcePtr) -= m * (here->MESAsourceConduct); - *(here->MESAgateGatePrimePtr) -= m * (here->MESAgateConduct); - *(here->MESAgatePrimeGatePtr) -= m * (here->MESAgateConduct); - *(here->MESAgatePrimeDrainPrimePtr) += m * (-ggd); - *(here->MESAgatePrimeSourcePrimePtr) += m * (-ggs); - *(here->MESAdrainPrimeGatePrimePtr) += m * (gm-ggd); - *(here->MESAdrainPrimeSourcePrimePtr) += m * (-gds-gm); - *(here->MESAsourcePrimeGatePrimePtr) += m * (-ggs-gm); - *(here->MESAsourcePrimeDrainPrimePtr) += m * (-gds); - *(here->MESAgatePrimeGatePrimePtr) += m * (ggd+ggs+here->MESAgateConduct+ggspp+ggdpp); - *(here->MESAdrainPrimeDrainPrimePtr) += m * (gds+ggd+here->MESAdrainConduct+here->MESAtGf); - *(here->MESAsourcePrimeSourcePrimePtr) += m * (gds+gm+ggs+here->MESAsourceConduct+here->MESAtGi); - *(here->MESAsourcePrimeSourcePrmPrmPtr) -= m * (here->MESAtGi); - *(here->MESAsourcePrmPrmSourcePrimePtr) -= m * (here->MESAtGi); - *(here->MESAgatePrimeSourcePrmPrmPtr) -= m * (ggspp); - *(here->MESAsourcePrmPrmGatePrimePtr) -= m * (ggspp); - *(here->MESAdrainPrimeDrainPrmPrmPtr) -= m * (here->MESAtGf); - *(here->MESAdrainPrmPrmDrainPrimePtr) -= m * (here->MESAtGf); - *(here->MESAgatePrimeDrainPrmPrmPtr) -= m * (ggdpp); - *(here->MESAdrainPrmPrmGatePrimePtr) -= m * (ggdpp); - *(here->MESAsourcePrmPrmSourcePrmPrmPtr+1) += m * (xgs); - *(here->MESAdrainPrmPrmDrainPrmPrmPtr+1) += m * (xgd); - *(here->MESAgatePrimeGatePrimePtr+1) += m * (xgd+xgs); - *(here->MESAgatePrimeDrainPrmPrmPtr+1) -= m * (xgd); - *(here->MESAdrainPrmPrmGatePrimePtr+1) -= m * (xgd); - *(here->MESAgatePrimeSourcePrmPrmPtr+1) -= m * (xgs); - *(here->MESAsourcePrmPrmGatePrimePtr+1) -= m * (xgs); - } - } - return(OK); -} diff --git a/src/spicelib/devices/mesa/mesaask.c b/src/spicelib/devices/mesa/mesaask.c deleted file mode 100644 index e92d6517d..000000000 --- a/src/spicelib/devices/mesa/mesaask.c +++ /dev/null @@ -1,157 +0,0 @@ -/********** -Copyright 1990 Regents of the University of California. All rights reserved. -Author: 1987 Thomas L. Quarles -**********/ -/* -Imported into MESA model: 2001 Paolo Nenzi - */ - -#include "ngspice/ngspice.h" -#include "ngspice/cktdefs.h" -#include "ngspice/devdefs.h" -#include "ngspice/ifsim.h" -#include "mesadefs.h" -#include "ngspice/sperror.h" -#include "ngspice/suffix.h" - - -/* ARGSUSED */ -int -MESAask(CKTcircuit *ckt, GENinstance *inst, int which, IFvalue *value, IFvalue *select) -{ - MESAinstance *here = (MESAinstance*)inst; - static char *msg = "Current and power not available in ac analysis"; - - NG_IGNORE(select); - - switch(which) { - case MESA_LENGTH: - value->rValue = here->MESAlength; - return (OK); - case MESA_WIDTH: - value->rValue = here->MESAwidth; - value->rValue *= here->MESAm; - return (OK); - case MESA_M: - value->rValue = here->MESAm; - return (OK); - case MESA_IC_VDS: - value->rValue = here->MESAicVDS; - return (OK); - case MESA_IC_VGS: - value->rValue = here->MESAicVGS; - return (OK); - case MESA_OFF: - value->iValue = here->MESAoff; - return (OK); - case MESA_TD: - value->rValue = here->MESAtd - CONSTCtoK; - return (OK); - case MESA_TS: - value->rValue = here->MESAts - CONSTCtoK; - return (OK); - case MESA_DTEMP: - value->rValue = here->MESAdtemp; - return (OK); - case MESA_DRAINNODE: - value->iValue = here->MESAdrainNode; - return (OK); - case MESA_GATENODE: - value->iValue = here->MESAgateNode; - return (OK); - case MESA_SOURCENODE: - value->iValue = here->MESAsourceNode; - return (OK); - case MESA_DRAINPRIMENODE: - value->iValue = here->MESAdrainPrimeNode; - return (OK); - case MESA_SOURCEPRIMENODE: - value->iValue = here->MESAsourcePrimeNode; - return (OK); - case MESA_GATEPRIMENODE: - value->iValue = here->MESAgatePrimeNode; - return (OK); - case MESA_VGS: - value->rValue = *(ckt->CKTstate0 + here->MESAvgs); - return (OK); - case MESA_VGD: - value->rValue = *(ckt->CKTstate0 + here->MESAvgd); - return (OK); - case MESA_CG: - value->rValue = *(ckt->CKTstate0 + here->MESAcg); - value->rValue *= here->MESAm; - return (OK); - case MESA_CD: - value->rValue = *(ckt->CKTstate0 + here->MESAcd); - value->rValue *= here->MESAm; - return (OK); - case MESA_CGD: - value->rValue = *(ckt->CKTstate0 + here->MESAcgd); - value->rValue *= here->MESAm; - return (OK); - case MESA_GM: - value->rValue = *(ckt->CKTstate0 + here->MESAgm); - value->rValue *= here->MESAm; - return (OK); - case MESA_GDS: - value->rValue = *(ckt->CKTstate0 + here->MESAgds); - value->rValue *= here->MESAm; - return (OK); - case MESA_GGS: - value->rValue = *(ckt->CKTstate0 + here->MESAggs); - value->rValue *= here->MESAm; - return (OK); - case MESA_GGD: - value->rValue = *(ckt->CKTstate0 + here->MESAggd); - value->rValue *= here->MESAm; - return (OK); - case MESA_QGS: - value->rValue = *(ckt->CKTstate0 + here->MESAqgs); - value->rValue *= here->MESAm; - return (OK); - case MESA_CQGS: - value->rValue = *(ckt->CKTstate0 + here->MESAcqgs); - value->rValue *= here->MESAm; - return (OK); - case MESA_QGD: - value->rValue = *(ckt->CKTstate0 + here->MESAqgd); - value->rValue *= here->MESAm; - return (OK); - case MESA_CQGD: - value->rValue = *(ckt->CKTstate0 + here->MESAcqgd); - value->rValue *= here->MESAm; - return (OK); - case MESA_CS : - if (ckt->CKTcurrentAnalysis & DOING_AC) { - errMsg = TMALLOC(char, strlen(msg) + 1); - errRtn = "MESAask"; - strcpy(errMsg,msg); - return(E_ASKCURRENT); - } else { - value->rValue = -*(ckt->CKTstate0 + here->MESAcd); - value->rValue -= *(ckt->CKTstate0 + here->MESAcg); - value->rValue *= here->MESAm; - } - return(OK); - case MESA_POWER : - if (ckt->CKTcurrentAnalysis & DOING_AC) { - errMsg = TMALLOC(char, strlen(msg) + 1); - errRtn = "MESAask"; - strcpy(errMsg,msg); - return(E_ASKPOWER); - } else { - value->rValue = *(ckt->CKTstate0 + here->MESAcd) * - *(ckt->CKTrhsOld + here->MESAdrainNode); - value->rValue += *(ckt->CKTstate0 + here->MESAcg) * - *(ckt->CKTrhsOld + here->MESAgateNode); - value->rValue -= (*(ckt->CKTstate0+here->MESAcd) + - *(ckt->CKTstate0 + here->MESAcg)) * - *(ckt->CKTrhsOld + here->MESAsourceNode); - value->rValue *= here->MESAm; - } - return(OK); - default: - return (E_BADPARM); - } - /* NOTREACHED */ -} diff --git a/src/spicelib/devices/mesa/mesadefs.h b/src/spicelib/devices/mesa/mesadefs.h deleted file mode 100644 index 230263b02..000000000 --- a/src/spicelib/devices/mesa/mesadefs.h +++ /dev/null @@ -1,494 +0,0 @@ -/********** -Copyright 1993: T. Ytterdal, K. Lee, M. Shur and T. A. Fjeldly. All rights reserved. -Author: Trond Ytterdal -**********/ - -#ifndef MESA -#define MESA - -#include "ngspice/ifsim.h" -#include "ngspice/cktdefs.h" -#include "ngspice/gendefs.h" -#include "ngspice/complex.h" -#include "ngspice/noisedef.h" - - /* structures used to describe MESFET Transistors */ - -/* indices to the array of MESAFET noise sources */ - -enum { - MESARDNOIZ = 0, - MESARSNOIZ, - MESAIDNOIZ, - MESAFLNOIZ, - MESATOTNOIZ, - /* finally, the number of noise sources */ - MESANSRCS -}; - -/* information used to describe a single instance */ - -typedef struct sMESAinstance { - - struct GENinstance gen; - -#define MESAmodPtr(inst) ((struct sMESAmodel *)((inst)->gen.GENmodPtr)) -#define MESAnextInstance(inst) ((struct sMESAinstance *)((inst)->gen.GENnextInstance)) -#define MESAname gen.GENname -#define MESAstate gen.GENstate - - const int MESAdrainNode; /* number of drain node of MESAfet */ - const int MESAgateNode; /* number of gate node of MESAfet */ - const int MESAsourceNode; /* number of source node of MESAfet */ - int MESAdrainPrimeNode; /* number of internal drain node of MESAfet */ - int MESAgatePrimeNode; /* number of internal gate node of MESAfet */ - int MESAsourcePrimeNode; /* number of internal source node of MESAfet */ - int MESAsourcePrmPrmNode; - int MESAdrainPrmPrmNode; - double MESAlength; /* length of MESAfet */ - double MESAwidth; /* width of MESAfet */ - double MESAm; /* Parallel Multiplier */ - double MESAicVDS; /* initial condition voltage D-S*/ - double MESAicVGS; /* initial condition voltage G-S*/ - double MESAtd; /* drain temperature */ - double MESAts; /* source temperature */ - double MESAdtemp; /* Instance temperature difference */ - double MESAtVto; - double MESAtLambda; - double MESAtLambdahf; - double MESAtEta; - double MESAtMu; - double MESAtPhib; - double MESAtTheta; - double MESAtRsi; - double MESAtRdi; - double MESAtRs; - double MESAtRd; - double MESAtRg; - double MESAtRi; - double MESAtRf; - double MESAtGi; - double MESAtGf; - double MESAdrainConduct; - double MESAsourceConduct; - double MESAgateConduct; - double *MESAdrainDrainPrimePtr; - double *MESAgatePrimeDrainPrimePtr; - double *MESAgatePrimeSourcePrimePtr; - double *MESAsourceSourcePrimePtr; - double *MESAdrainPrimeDrainPtr; - double *MESAdrainPrimeGatePrimePtr; - double *MESAdrainPrimeSourcePrimePtr; - double *MESAsourcePrimeGatePrimePtr; - double *MESAsourcePrimeSourcePtr; - double *MESAsourcePrimeDrainPrimePtr; - double *MESAdrainDrainPtr; - double *MESAgatePrimeGatePrimePtr; - double *MESAsourceSourcePtr; - double *MESAdrainPrimeDrainPrimePtr; - double *MESAsourcePrimeSourcePrimePtr; - double *MESAgateGatePrimePtr; - double *MESAgatePrimeGatePtr; - double *MESAgateGatePtr; - double *MESAsourcePrmPrmSourcePrmPrmPtr; - double *MESAsourcePrmPrmSourcePrimePtr; - double *MESAsourcePrimeSourcePrmPrmPtr; - double *MESAsourcePrmPrmGatePrimePtr; - double *MESAgatePrimeSourcePrmPrmPtr; - double *MESAdrainPrmPrmDrainPrmPrmPtr; - double *MESAdrainPrmPrmDrainPrimePtr; - double *MESAdrainPrimeDrainPrmPrmPtr; - double *MESAdrainPrmPrmGatePrimePtr; - double *MESAgatePrimeDrainPrmPrmPtr; - -#define MESAvgs MESAstate -#define MESAvgd MESAstate+1 -#define MESAcg MESAstate+2 -#define MESAcd MESAstate+3 -#define MESAcgd MESAstate+4 -#define MESAcgs MESAstate+5 -#define MESAgm MESAstate+6 -#define MESAgds MESAstate+7 -#define MESAggs MESAstate+8 -#define MESAggd MESAstate+9 -#define MESAqgs MESAstate+10 -#define MESAcqgs MESAstate+11 -#define MESAqgd MESAstate+12 -#define MESAcqgd MESAstate+13 -#define MESAvgspp MESAstate+14 -#define MESAggspp MESAstate+15 -#define MESAcgspp MESAstate+16 -#define MESAvgdpp MESAstate+17 -#define MESAggdpp MESAstate+18 -#define MESAcgdpp MESAstate+19 - -#define MESAnumStates 20 - - int MESAoff; - unsigned MESAlengthGiven : 1; - unsigned MESAwidthGiven : 1; - unsigned MESAmGiven : 1; - unsigned MESAicVDSGiven : 1; - unsigned MESAicVGSGiven : 1; - unsigned MESAtdGiven : 1; - unsigned MESAtsGiven : 1; - unsigned MESAdtempGiven : 1; - -int MESAmode; - -/* - * naming convention: - * x = vgs - * y = vgd - * z = vds - * cdr = cdrain - */ - -#define MESANDCOEFFS 27 - -#ifndef NODISTO - double MESAdCoeffs[MESANDCOEFFS]; -#else /* NODISTO */ - double *MESAdCoeffs; -#endif /* NODISTO */ - -#ifndef CONFIG - -#define cdr_x MESAdCoeffs[0] -#define cdr_z MESAdCoeffs[1] -#define cdr_x2 MESAdCoeffs[2] -#define cdr_z2 MESAdCoeffs[3] -#define cdr_xz MESAdCoeffs[4] -#define cdr_x3 MESAdCoeffs[5] -#define cdr_z3 MESAdCoeffs[6] -#define cdr_x2z MESAdCoeffs[7] -#define cdr_xz2 MESAdCoeffs[8] - -#define ggs3 MESAdCoeffs[9] -#define ggd3 MESAdCoeffs[10] -#define ggs2 MESAdCoeffs[11] -#define ggd2 MESAdCoeffs[12] - -#define qgs_x2 MESAdCoeffs[13] -#define qgs_y2 MESAdCoeffs[14] -#define qgs_xy MESAdCoeffs[15] -#define qgs_x3 MESAdCoeffs[16] -#define qgs_y3 MESAdCoeffs[17] -#define qgs_x2y MESAdCoeffs[18] -#define qgs_xy2 MESAdCoeffs[19] - -#define qgd_x2 MESAdCoeffs[20] -#define qgd_y2 MESAdCoeffs[21] -#define qgd_xy MESAdCoeffs[22] -#define qgd_x3 MESAdCoeffs[23] -#define qgd_y3 MESAdCoeffs[24] -#define qgd_x2y MESAdCoeffs[25] -#define qgd_xy2 MESAdCoeffs[26] - -#endif - -#ifndef NONOISE - double MESAnVar[NSTATVARS][MESANSRCS]; -#else /* NONOISE */ - double **MESAnVar; -#endif /* NONOISE */ - double MESAcsatfs; - double MESAcsatfd; - double MESAggrwl; - double MESAgchi0; - double MESAbeta; - double MESAisatb0; - double MESAimax; - double MESAcf; - double MESAfl; - double MESAdelf; - double MESAgds0; - double MESAgm0; - double MESAgm1; - double MESAgm2; - double MESAdelidvds0; - double MESAdelidvds1; - double MESAdelidgch0; - double MESAn0; - double MESAnsb0; - double MESAvcrits; - double MESAvcritd; -} MESAinstance ; - - -/* per model data */ - -typedef struct sMESAmodel { /* model structure for a MESAfet */ - - struct GENmodel gen; - -#define MESAmodType gen.GENmodType -#define MESAnextModel(inst) ((struct sMESAmodel *)((inst)->gen.GENnextModel)) -#define MESAinstances(inst) ((MESAinstance *)((inst)->gen.GENinstances)) -#define MESAmodName gen.GENmodName - - int MESAtype; - - double MESAthreshold; - double MESAlambda; - double MESAbeta; - double MESAvs; - double MESAeta; - double MESAm; - double MESAmc; - double MESAalpha; - double MESAsigma0; - double MESAvsigmat; - double MESAvsigma; - double MESAmu; - double MESAtheta; - double MESAmu1; - double MESAmu2; - double MESAd; - double MESAnd; - double MESAdu; - double MESAndu; - double MESAth; - double MESAndelta; - double MESAdelta; - double MESAtc; - double MESArdi; - double MESArsi; - double MESAdrainResist; - double MESAsourceResist; - double MESAdrainConduct; - double MESAsourceConduct; - double MESAgateResist; - double MESAri; - double MESArf; - double MESAphib; - double MESAphib1; - double MESAastar; - double MESAggr; - double MESAdel; - double MESAxchi; - double MESAn; - double MESAtvto; - double MESAtlambda; - double MESAteta0; - double MESAteta1; - double MESAtmu; - double MESAxtm0; - double MESAxtm1; - double MESAxtm2; - double MESAks; - double MESAvsg; - double MESAlambdahf; - double MESAtf; - double MESAflo; - double MESAdelfo; - double MESAag; - double MESAtc1; - double MESAtc2; - double MESAzeta; - double MESAlevel; - double MESAnmax; - double MESAgamma; - double MESAepsi; - double MESAcbs; - double MESAcas; - double MESAvcrit; - - double MESAsigma; - double MESAvpo; - double MESAvpou; - double MESAvpod; - double MESAdeltaSqr; - - unsigned MESAthresholdGiven:1; - unsigned MESAlambdaGiven:1; - unsigned MESAbetaGiven:1; - unsigned MESAvsGiven:1; - unsigned MESAetaGiven:1; - unsigned MESAmGiven:1; - unsigned MESAmcGiven:1; - unsigned MESAalphaGiven:1; - unsigned MESAsigma0Given:1; - unsigned MESAvsigmatGiven:1; - unsigned MESAvsigmaGiven:1; - unsigned MESAmuGiven:1; - unsigned MESAthetaGiven:1; - unsigned MESAmu1Given:1; - unsigned MESAmu2Given:1; - unsigned MESAdGiven:1; - unsigned MESAndGiven:1; - unsigned MESAduGiven:1; - unsigned MESAnduGiven:1; - unsigned MESAthGiven:1; - unsigned MESAndeltaGiven:1; - unsigned MESAdeltaGiven:1; - unsigned MESAtcGiven:1; - unsigned MESArdiGiven:1; - unsigned MESArsiGiven:1; - unsigned MESAdrainResistGiven:1; - unsigned MESAsourceResistGiven:1; - unsigned MESAgateResistGiven:1; - unsigned MESAriGiven:1; - unsigned MESArfGiven:1; - unsigned MESAphibGiven:1; - unsigned MESAphib1Given:1; - unsigned MESAastarGiven:1; - unsigned MESAggrGiven:1; - unsigned MESAdelGiven:1; - unsigned MESAxchiGiven:1; - unsigned MESAnGiven:1; - unsigned MESAtvtoGiven:1; - unsigned MESAtlambdaGiven:1; - unsigned MESAteta0Given:1; - unsigned MESAteta1Given:1; - unsigned MESAtmuGiven:1; - unsigned MESAxtm0Given:1; - unsigned MESAxtm1Given:1; - unsigned MESAxtm2Given:1; - unsigned MESAksGiven:1; - unsigned MESAvsgGiven:1; - unsigned MESAlambdahfGiven:1; - unsigned MESAtfGiven:1; - unsigned MESAfloGiven:1; - unsigned MESAdelfoGiven:1; - unsigned MESAagGiven:1; - unsigned MESAtc1Given:1; - unsigned MESAtc2Given:1; - unsigned MESAzetaGiven:1; - unsigned MESAlevelGiven:1; - unsigned MESAnmaxGiven:1; - unsigned MESAgammaGiven:1; - unsigned MESAepsiGiven:1; - unsigned MESAcbsGiven:1; - unsigned MESAcasGiven:1; - -} MESAmodel; - -#ifndef NMF - -#define NMF 1 -#define PMF -1 -#endif - -/* device parameters */ -enum { - MESA_LENGTH = 1, - MESA_WIDTH, - MESA_IC_VDS, - MESA_IC_VGS, - MESA_TD, - MESA_TS, - MESA_IC, - MESA_OFF, - MESA_CS, - MESA_POWER, - MESA_DTEMP, - MESA_M, -}; - -/* model parameters */ -enum { - MESA_MOD_VTO = 101, - MESA_MOD_VS, - MESA_MOD_LAMBDA, - MESA_MOD_RD, - MESA_MOD_RS, - MESA_MOD_RG, - MESA_MOD_RI, - MESA_MOD_RF, - MESA_MOD_RDI, - MESA_MOD_RSI, - MESA_MOD_PHIB, - MESA_MOD_PHIB1, - MESA_MOD_ASTAR, - MESA_MOD_GGR, - MESA_MOD_DEL, - MESA_MOD_XCHI, - MESA_MOD_N, - MESA_MOD_ETA, - MESA_MOD_M, - MESA_MOD_MC, - MESA_MOD_SIGMA0, - MESA_MOD_VSIGMAT, - MESA_MOD_VSIGMA, - MESA_MOD_MU, - MESA_MOD_MU1, - MESA_MOD_MU2, - MESA_MOD_D, - MESA_MOD_ND, - MESA_MOD_DELTA, - MESA_MOD_TC, - MESA_MOD_NMF, - MESA_MOD_TVTO, -}; - -enum { - MESA_MOD_TLAMBDA = 134, - MESA_MOD_TETA0, - MESA_MOD_TETA1, - MESA_MOD_TMU, - MESA_MOD_XTM0, - MESA_MOD_XTM1, - MESA_MOD_XTM2, - MESA_MOD_KS, - MESA_MOD_VSG, - MESA_MOD_LAMBDAHF, - MESA_MOD_TF, - MESA_MOD_FLO, - MESA_MOD_DELFO, - MESA_MOD_AG, - MESA_MOD_THETA, - MESA_MOD_ALPHA, - MESA_MOD_TC1, - MESA_MOD_TC2, - MESA_MOD_ZETA, - MESA_MOD_BETA, - MESA_MOD_DU, - MESA_MOD_NDU, - MESA_MOD_TH, - MESA_MOD_NDELTA, - MESA_MOD_LEVEL, - MESA_MOD_NMAX, - MESA_MOD_GAMMA, - MESA_MOD_EPSI, - MESA_MOD_CBS, - MESA_MOD_CAS, - MESA_MOD_PMF, - MESA_MOD_TYPE, -}; - -/* device questions */ -enum { - MESA_DRAINNODE = 201, - MESA_GATENODE, - MESA_SOURCENODE, - MESA_DRAINPRIMENODE, - MESA_SOURCEPRIMENODE, - MESA_GATEPRIMENODE, - MESA_VGS, - MESA_VGD, - MESA_CG, - MESA_CD, - MESA_CGD, - MESA_GM, - MESA_GDS, - MESA_GGS, - MESA_GGD, - MESA_QGS, - MESA_CQGS, - MESA_QGD, - MESA_CQGD, -}; - -/* model questions */ -enum { - MESA_MOD_DRAINCONDUCT = 301, - MESA_MOD_SOURCECONDUCT, - MESA_MOD_GATECONDUCT, - MESA_MOD_DEPLETIONCAP, - MESA_MOD_VCRIT, -}; - -#include "mesaext.h" - -#endif /*MESA*/ diff --git a/src/spicelib/devices/mesa/mesaext.h b/src/spicelib/devices/mesa/mesaext.h deleted file mode 100644 index ccdc22437..000000000 --- a/src/spicelib/devices/mesa/mesaext.h +++ /dev/null @@ -1,17 +0,0 @@ -/********** -Copyright 1993: T. Ytterdal, K. Lee, M. Shur and T. A. Fjeldly. All rights reserved. -Author: Trond Ytterdal -**********/ - -extern int MESAacLoad(GENmodel*,CKTcircuit*); -extern int MESAask(CKTcircuit*,GENinstance*,int,IFvalue*,IFvalue*); -extern int MESAgetic(GENmodel*,CKTcircuit*); -extern int MESAload(GENmodel*,CKTcircuit*); -extern int MESAmAsk(CKTcircuit*,GENmodel*,int,IFvalue*); -extern int MESAmParam(int,IFvalue*,GENmodel*); -extern int MESAparam(int,IFvalue*,GENinstance*,IFvalue*); -extern int MESApzLoad(GENmodel*,CKTcircuit*, SPcomplex*); -extern int MESAsetup(SMPmatrix*,GENmodel*,CKTcircuit*,int*); -extern int MESAtemp(GENmodel*,CKTcircuit*); -extern int MESAtrunc(GENmodel*,CKTcircuit*,double*); -extern int MESAunsetup(GENmodel*,CKTcircuit*); diff --git a/src/spicelib/devices/mesa/mesagetic.c b/src/spicelib/devices/mesa/mesagetic.c deleted file mode 100644 index 13f6d44cd..000000000 --- a/src/spicelib/devices/mesa/mesagetic.c +++ /dev/null @@ -1,39 +0,0 @@ -/********** -Copyright 1993: T. Ytterdal, K. Lee, M. Shur and T. A. Fjeldly. All rights reserved. -Author: Trond Ytterdal -**********/ - -#include "ngspice/ngspice.h" -#include "ngspice/cktdefs.h" -#include "mesadefs.h" -#include "ngspice/sperror.h" -#include "ngspice/suffix.h" - - -int -MESAgetic(GENmodel *inModel, CKTcircuit *ckt) -{ - MESAmodel *model = (MESAmodel*)inModel; - MESAinstance *here; - /* - * grab initial conditions out of rhs array. User specified, so use - * external nodes to get values - */ - - for( ; model ; model = MESAnextModel(model)) { - for(here = MESAinstances(model); here ; here = MESAnextInstance(here)) { - - if(!here->MESAicVDSGiven) { - here->MESAicVDS = - *(ckt->CKTrhs + here->MESAdrainNode) - - *(ckt->CKTrhs + here->MESAsourceNode); - } - if(!here->MESAicVGSGiven) { - here->MESAicVGS = - *(ckt->CKTrhs + here->MESAgateNode) - - *(ckt->CKTrhs + here->MESAsourceNode); - } - } - } - return(OK); -} diff --git a/src/spicelib/devices/mesa/mesainit.c b/src/spicelib/devices/mesa/mesainit.c deleted file mode 100644 index 4fd2a8096..000000000 --- a/src/spicelib/devices/mesa/mesainit.c +++ /dev/null @@ -1,76 +0,0 @@ -#include "ngspice/config.h" - -#include "ngspice/devdefs.h" - -#include "mesaitf.h" -#include "mesaext.h" -#include "mesainit.h" - - -SPICEdev MESAinfo = { - .DEVpublic = { - .name = "MESA", - .description = "GaAs MESFET model", - .terms = &MESAnSize, - .numNames = &MESAnSize, - .termNames = MESAnames, - .numInstanceParms = &MESApTSize, - .instanceParms = MESApTable, - .numModelParms = &MESAmPTSize, - .modelParms = MESAmPTable, - .flags = DEV_DEFAULT, - -#ifdef XSPICE - .cm_func = NULL, - .num_conn = 0, - .conn = NULL, - .num_param = 0, - .param = NULL, - .num_inst_var = 0, - .inst_var = NULL, -#endif - }, - - .DEVparam = MESAparam, - .DEVmodParam = MESAmParam, - .DEVload = MESAload, - .DEVsetup = MESAsetup, - .DEVunsetup = MESAunsetup, - .DEVpzSetup = MESAsetup, - .DEVtemperature = MESAtemp, - .DEVtrunc = MESAtrunc, - .DEVfindBranch = NULL, - .DEVacLoad = MESAacLoad, - .DEVaccept = NULL, - .DEVdestroy = NULL, - .DEVmodDelete = NULL, - .DEVdelete = NULL, - .DEVsetic = MESAgetic, - .DEVask = MESAask, - .DEVmodAsk = MESAmAsk, - .DEVpzLoad = MESApzLoad, - .DEVconvTest = NULL, - .DEVsenSetup = NULL, - .DEVsenLoad = NULL, - .DEVsenUpdate = NULL, - .DEVsenAcLoad = NULL, - .DEVsenPrint = NULL, - .DEVsenTrunc = NULL, - .DEVdisto = NULL, - .DEVnoise = NULL, - .DEVsoaCheck = NULL, - .DEVinstSize = &MESAiSize, - .DEVmodSize = &MESAmSize, - -#ifdef CIDER - .DEVdump = NULL, - .DEVacct = NULL, -#endif -}; - - -SPICEdev * -get_mesa_info(void) -{ - return &MESAinfo; -} diff --git a/src/spicelib/devices/mesa/mesainit.h b/src/spicelib/devices/mesa/mesainit.h deleted file mode 100644 index aa4420569..000000000 --- a/src/spicelib/devices/mesa/mesainit.h +++ /dev/null @@ -1,13 +0,0 @@ -#ifndef _MESAINIT_H -#define _MESAINIT_H - -extern IFparm MESApTable[ ]; -extern IFparm MESAmPTable[ ]; -extern char *MESAnames[ ]; -extern int MESApTSize; -extern int MESAmPTSize; -extern int MESAnSize; -extern int MESAiSize; -extern int MESAmSize; - -#endif diff --git a/src/spicelib/devices/mesa/mesaitf.h b/src/spicelib/devices/mesa/mesaitf.h deleted file mode 100644 index 36493b837..000000000 --- a/src/spicelib/devices/mesa/mesaitf.h +++ /dev/null @@ -1,9 +0,0 @@ -/********** -Copyright 1990 Regents of the University of California. All rights reserved. -**********/ -#ifndef DEV_MESA -#define DEV_MESA - -SPICEdev *get_mesa_info(void); - -#endif diff --git a/src/spicelib/devices/mesa/mesaload.c b/src/spicelib/devices/mesa/mesaload.c deleted file mode 100644 index e1ffecd4a..000000000 --- a/src/spicelib/devices/mesa/mesaload.c +++ /dev/null @@ -1,987 +0,0 @@ -/********** -Copyright 1993: T. Ytterdal, K. Lee, M. Shur and T. A. Fjeldly. All rights reserved. -Author: Trond Ytterdal -**********/ - -#include "ngspice/ngspice.h" -#include "ngspice/devdefs.h" -#include "ngspice/cktdefs.h" -#include "mesadefs.h" -#include "ngspice/const.h" -#include "ngspice/trandefs.h" -#include "ngspice/sperror.h" -#include "ngspice/suffix.h" - -/* -#define true 1 -#define false 0 -*/ - -#define EPSILONGAAS (12.244*8.85418e-12) - -#define W (here->MESAwidth) -#define L (here->MESAlength) - -static void mesa1(MESAmodel*, MESAinstance*, double, double, double, - double*, double*, double*, double*,double*); - -static void mesa2(MESAmodel*, MESAinstance*, double, double, double, - double*, double*, double*, double*,double*); - -static void mesa3(MESAmodel*, MESAinstance*, double, double, double, - double*, double*, double*, double*,double*); - -void Pause(void); - -int -MESAload(GENmodel *inModel, CKTcircuit *ckt) -{ - MESAmodel *model = (MESAmodel*)inModel; - MESAinstance *here; - double capgd = 0.0; - double capgs = 0.0; - double cd; - double cdhat = 0.0; - double cdrain = 0.0; - double cdreq; - double ceq; - double ceqgd; - double ceqgs; - double cg; - double cgd; - double cgs; - double cghat = 0.0; - double arg; - double earg; - double delvds; - double delvgd; - double delvgs; - double delvgspp = 0.0; - double delvgdpp = 0.0; - double evgd; - double evgs; - double gds = 0.0; - double geq; - double ggd; - double ggs; - double gm = 0.0; - double ggspp = 0.0; - double cgspp = 0.0; - double ggdpp = 0.0; - double cgdpp = 0.0; - double vcrits; - double vcritd; - double vds = 0.0; - double vgd = 0.0; - double vgs = 0.0; - double vgspp = 0.0; - double vgdpp = 0.0; - double vgs1 = 0.0; - double vgd1 = 0.0; -#ifndef PREDICTOR - double xfact; -#endif - double vted; - double vtes; - double vtd; - double vts; - double von; - double ccorr; - int inverse = FALSE; - int icheck; - int ichk1; - int error; - - double m; - - /* loop through all the models */ - for( ; model != NULL; model = MESAnextModel(model)) { - - /* loop through all the instances of the model */ - for (here = MESAinstances(model); here != NULL ; - here=MESAnextInstance(here)) { - - /* - * dc model parameters - */ - vcrits = here->MESAvcrits; - vcritd = here->MESAvcritd; - vtd = CONSTKoverQ * here->MESAtd; - vts = CONSTKoverQ * here->MESAts; - vted = model->MESAn*vtd; - vtes = model->MESAn*vts; - /* - * initialization - */ - icheck = 1; - if( ckt->CKTmode & MODEINITSMSIG) { - vgs = *(ckt->CKTstate0 + here->MESAvgs); - vgd = *(ckt->CKTstate0 + here->MESAvgd); - vgspp = *(ckt->CKTstate0 + here->MESAvgspp); - vgdpp = *(ckt->CKTstate0 + here->MESAvgdpp); - } else if (ckt->CKTmode & MODEINITTRAN) { - vgs = *(ckt->CKTstate1 + here->MESAvgs); - vgd = *(ckt->CKTstate1 + here->MESAvgd); - vgspp = *(ckt->CKTstate1 + here->MESAvgspp); - vgdpp = *(ckt->CKTstate1 + here->MESAvgdpp); - } else if ( (ckt->CKTmode & MODEINITJCT) && - (ckt->CKTmode & MODETRANOP) && - (ckt->CKTmode & MODEUIC) ) { - vds = here->MESAicVDS; - vgs = here->MESAicVGS; - vgd = vgs-vds; - vgspp = vgs; - vgdpp = vgd; - } else if ( (ckt->CKTmode & MODEINITJCT) && - (here->MESAoff == 0) ) { - vgs = -1; - vgd = -1; - vgspp = 0; - vgdpp = 0; - } else if( (ckt->CKTmode & MODEINITJCT) || - ((ckt->CKTmode & MODEINITFIX) && (here->MESAoff))) { - vgs = 0; - vgd = 0; - vgspp = 0; - vgdpp = 0; - } else { -#ifndef PREDICTOR - if(ckt->CKTmode & MODEINITPRED) { - xfact = ckt->CKTdelta/ckt->CKTdeltaOld[2]; - *(ckt->CKTstate0 + here->MESAvgs) = - *(ckt->CKTstate1 + here->MESAvgs); - vgs = (1+xfact) * *(ckt->CKTstate1 + here->MESAvgs) - - xfact * *(ckt->CKTstate2 + here->MESAvgs); - *(ckt->CKTstate0 + here->MESAvgspp) = - *(ckt->CKTstate1 + here->MESAvgspp); - vgspp = (1+xfact) * *(ckt->CKTstate1 + here->MESAvgspp) - - xfact * *(ckt->CKTstate2 + here->MESAvgspp); - *(ckt->CKTstate0 + here->MESAvgd) = - *(ckt->CKTstate1 + here->MESAvgd); - vgd = (1+xfact)* *(ckt->CKTstate1 + here->MESAvgd) - - xfact * *(ckt->CKTstate2 + here->MESAvgd); - *(ckt->CKTstate0 + here->MESAvgdpp) = - *(ckt->CKTstate1 + here->MESAvgdpp); - vgdpp = (1+xfact) * *(ckt->CKTstate1 + here->MESAvgdpp) - - xfact * *(ckt->CKTstate2 + here->MESAvgdpp); - *(ckt->CKTstate0 + here->MESAcg) = - *(ckt->CKTstate1 + here->MESAcg); - *(ckt->CKTstate0 + here->MESAcd) = - *(ckt->CKTstate1 + here->MESAcd); - *(ckt->CKTstate0 + here->MESAcgd) = - *(ckt->CKTstate1 + here->MESAcgd); - *(ckt->CKTstate0 + here->MESAcgs) = - *(ckt->CKTstate1 + here->MESAcgs); - *(ckt->CKTstate0 + here->MESAgm) = - *(ckt->CKTstate1 + here->MESAgm); - *(ckt->CKTstate0 + here->MESAgds) = - *(ckt->CKTstate1 + here->MESAgds); - *(ckt->CKTstate0 + here->MESAggs) = - *(ckt->CKTstate1 + here->MESAggs); - *(ckt->CKTstate0 + here->MESAggd) = - *(ckt->CKTstate1 + here->MESAggd); - *(ckt->CKTstate0 + here->MESAggspp) = - *(ckt->CKTstate1 + here->MESAggspp); - *(ckt->CKTstate0 + here->MESAcgspp) = - *(ckt->CKTstate1 + here->MESAcgspp); - *(ckt->CKTstate0 + here->MESAggdpp) = - *(ckt->CKTstate1 + here->MESAggdpp); - *(ckt->CKTstate0 + here->MESAcgdpp) = - *(ckt->CKTstate1 + here->MESAcgdpp); - } else { -#endif /* PREDICTOR */ - /* - * compute new nonlinear branch voltages - */ - vgs = (*(ckt->CKTrhsOld+ here->MESAgatePrimeNode)- - *(ckt->CKTrhsOld+here->MESAsourcePrimeNode)); - vgd = (*(ckt->CKTrhsOld+here->MESAgatePrimeNode)- - *(ckt->CKTrhsOld+here->MESAdrainPrimeNode)); - vgspp = (*(ckt->CKTrhsOld+here->MESAgatePrimeNode)- - *(ckt->CKTrhsOld+here->MESAsourcePrmPrmNode)); - vgdpp = (*(ckt->CKTrhsOld+here->MESAgatePrimeNode)- - *(ckt->CKTrhsOld+here->MESAdrainPrmPrmNode)); - -#ifndef PREDICTOR - } -#endif /* PREDICTOR */ - delvgs=vgs - *(ckt->CKTstate0 + here->MESAvgs); - delvgd=vgd - *(ckt->CKTstate0 + here->MESAvgd); - delvds=delvgs - delvgd; - delvgspp = vgspp - *(ckt->CKTstate0 + here->MESAvgspp); - delvgdpp = vgdpp - *(ckt->CKTstate0 + here->MESAvgdpp); - cghat= *(ckt->CKTstate0 + here->MESAcg) + - *(ckt->CKTstate0 + here->MESAggd)*delvgd + - *(ckt->CKTstate0 + here->MESAggs)*delvgs + - *(ckt->CKTstate0 + here->MESAggspp)*delvgspp+ - *(ckt->CKTstate0 + here->MESAggdpp)*delvgdpp; - cdhat= *(ckt->CKTstate0 + here->MESAcd) + - *(ckt->CKTstate0 + here->MESAgm)*delvgs + - *(ckt->CKTstate0 + here->MESAgds)*delvds - - *(ckt->CKTstate0 + here->MESAggd)*delvgd; - /* - * bypass if solution has not changed - */ - if((ckt->CKTbypass) && - (!(ckt->CKTmode & MODEINITPRED)) && - (fabs(delvgs) < ckt->CKTreltol*MAX(fabs(vgs), - fabs(*(ckt->CKTstate0 + here->MESAvgs)))+ - ckt->CKTvoltTol) ) - if((fabs(delvgd) < ckt->CKTreltol*MAX(fabs(vgd), - fabs(*(ckt->CKTstate0 + here->MESAvgd)))+ - ckt->CKTvoltTol)) - if((fabs(delvgspp) < ckt->CKTreltol*MAX(fabs(vgspp), - fabs(*(ckt->CKTstate0 + here->MESAvgspp)))+ - ckt->CKTvoltTol)) - if((fabs(delvgdpp) < ckt->CKTreltol*MAX(fabs(vgdpp), - fabs(*(ckt->CKTstate0 + here->MESAvgdpp)))+ - ckt->CKTvoltTol)) - if((fabs(cghat-*(ckt->CKTstate0 + here->MESAcg)) - < ckt->CKTreltol*MAX(fabs(cghat), - fabs(*(ckt->CKTstate0 + here->MESAcg)))+ - ckt->CKTabstol)) - if((fabs(cdhat-*(ckt->CKTstate0 + here->MESAcd)) - < ckt->CKTreltol*MAX(fabs(cdhat), - fabs(*(ckt->CKTstate0 + here->MESAcd)))+ - ckt->CKTabstol)) { - - /* we can do a bypass */ - vgs= *(ckt->CKTstate0 + here->MESAvgs); - vgd= *(ckt->CKTstate0 + here->MESAvgd); - vds= vgs-vgd; - vgspp = *(ckt->CKTstate0 + here->MESAvgspp); - vgdpp = *(ckt->CKTstate0 + here->MESAvgdpp); - cg= *(ckt->CKTstate0 + here->MESAcg); - cd= *(ckt->CKTstate0 + here->MESAcd); - cgs= *(ckt->CKTstate0 + here->MESAcgs); - cgd= *(ckt->CKTstate0 + here->MESAcgd); - gm= *(ckt->CKTstate0 + here->MESAgm); - gds= *(ckt->CKTstate0 + here->MESAgds); - ggs= *(ckt->CKTstate0 + here->MESAggs); - ggd= *(ckt->CKTstate0 + here->MESAggd); - ggspp = *(ckt->CKTstate0 + here->MESAggspp); - cgspp = *(ckt->CKTstate0 + here->MESAcgspp); - ggdpp = *(ckt->CKTstate0 + here->MESAggdpp); - cgdpp = *(ckt->CKTstate0 + here->MESAcgdpp); - goto load; - } - /* - * limit nonlinear branch voltages - */ - ichk1=1; - vgs = DEVpnjlim(vgs,*(ckt->CKTstate0 + here->MESAvgs),vtes, - vcrits, &icheck); - vgd = DEVpnjlim(vgd,*(ckt->CKTstate0 + here->MESAvgd),vted, - vcritd,&ichk1); - if (ichk1 == 1) { - icheck=1; - } - vgs = DEVfetlim(vgs,*(ckt->CKTstate0 + here->MESAvgs), - here->MESAtVto); - vgd = DEVfetlim(vgd,*(ckt->CKTstate0 + here->MESAvgd), - here->MESAtVto); - if(here->MESAsourcePrmPrmNode == here->MESAsourcePrimeNode) - vgspp = vgs; - if(here->MESAdrainPrmPrmNode == here->MESAdrainPrimeNode) - vgdpp = vgd; - } - /* - * determine dc current and derivatives - */ - vds = vgs-vgd; - - arg = -vgs*model->MESAdel/vts; - earg = exp(arg); - evgs = exp(vgs/vtes); - ggs = here->MESAcsatfs*evgs/vtes+here->MESAggrwl*earg*(1-arg)+ckt->CKTgmin; - cgs = here->MESAcsatfs*(evgs-1)+here->MESAggrwl*vgs*earg+ - ckt->CKTgmin*vgs; - cg = cgs; - - arg = -vgd*model->MESAdel/vtd; - earg = exp(arg); - evgd = exp(vgd/vted); - ggd = here->MESAcsatfd*evgd/vted+here->MESAggrwl*earg*(1-arg)+ckt->CKTgmin; - cgd = here->MESAcsatfd*(evgd-1)+here->MESAggrwl*vgd*earg+ - ckt->CKTgmin*vgd; - cg = cg+cgd; - - if(vds < 0) { - vds = -vds; - inverse = TRUE; - } - von = here->MESAtVto+model->MESAks*(*(ckt->CKTrhsOld+here->MESAsourcePrimeNode)-model->MESAvsg); - if(model->MESAlevel == 2) - mesa1(model,here,inverse?vgd:vgs,vds,von,&cdrain,&gm,&gds,&capgs,&capgd); - else if(model->MESAlevel == 3) - mesa2(model,here,inverse?vgd:vgs,vds,von,&cdrain,&gm,&gds,&capgs,&capgd); - else if(model->MESAlevel == 4) - mesa3(model,here,inverse?vgd:vgs,vds,von,&cdrain,&gm,&gds,&capgs,&capgd); - if(inverse) { - cdrain = -cdrain; - vds = -vds; - SWAP(double, capgs, capgd); - } - /* - * compute equivalent drain current source - */ - cd = cdrain - cgd; - if ( (ckt->CKTmode & (MODETRAN|MODEINITSMSIG)) || - ((ckt->CKTmode & MODETRANOP) && (ckt->CKTmode & MODEUIC)) ){ - /* - * charge storage elements - */ - vgs1 = *(ckt->CKTstate1 + here->MESAvgspp); - vgd1 = *(ckt->CKTstate1 + here->MESAvgdpp); - - if(ckt->CKTmode & MODEINITTRAN) { - *(ckt->CKTstate1 + here->MESAqgs) = capgs*vgspp; - *(ckt->CKTstate1 + here->MESAqgd) = capgd*vgdpp; - } - *(ckt->CKTstate0+here->MESAqgs) = *(ckt->CKTstate1 + here->MESAqgs) + - capgs*(vgspp-vgs1); - *(ckt->CKTstate0+here->MESAqgd) = *(ckt->CKTstate1 + here->MESAqgd) + - capgd*(vgdpp-vgd1); - - /* - * store small-signal parameters - */ - if( (!(ckt->CKTmode & MODETRANOP)) || - (!(ckt->CKTmode & MODEUIC)) ) { - if(ckt->CKTmode & MODEINITSMSIG) { - *(ckt->CKTstate0 + here->MESAqgs) = capgs; - *(ckt->CKTstate0 + here->MESAqgd) = capgd; - continue; /*go to 1000*/ - } - /* - * transient analysis - */ - if(ckt->CKTmode & MODEINITTRAN) { - *(ckt->CKTstate1 + here->MESAqgs) = - *(ckt->CKTstate0 + here->MESAqgs); - *(ckt->CKTstate1 + here->MESAqgd) = - *(ckt->CKTstate0 + here->MESAqgd); - } - error = NIintegrate(ckt,&geq,&ceq,capgs,here->MESAqgs); - if(error) return(error); - ggspp = geq; - cgspp = *(ckt->CKTstate0 + here->MESAcqgs); - cg = cg + cgspp; - error = NIintegrate(ckt,&geq,&ceq,capgd,here->MESAqgd); - if(error) return(error); - ggdpp = geq; - cgdpp = *(ckt->CKTstate0 + here->MESAcqgd); - cg = cg + cgdpp; - cd = cd - cgdpp; - if (ckt->CKTmode & MODEINITTRAN) { - *(ckt->CKTstate1 + here->MESAcqgs) = - *(ckt->CKTstate0 + here->MESAcqgs); - *(ckt->CKTstate1 + here->MESAcqgd) = - *(ckt->CKTstate0 + here->MESAcqgd); - } - } - } - /* - * check convergence - */ - if( (!(ckt->CKTmode & MODEINITFIX)) | (!(ckt->CKTmode & MODEUIC))) { - if( (icheck == 1) - || (fabs(cghat-cg) >= ckt->CKTreltol* - MAX(fabs(cghat),fabs(cg))+ckt->CKTabstol) || - (fabs(cdhat-cd) > ckt->CKTreltol* - MAX(fabs(cdhat),fabs(cd))+ckt->CKTabstol) - ) { - ckt->CKTnoncon++; - } - } - *(ckt->CKTstate0 + here->MESAvgs) = vgs; - *(ckt->CKTstate0 + here->MESAvgspp) = vgspp; - *(ckt->CKTstate0 + here->MESAvgd) = vgd; - *(ckt->CKTstate0 + here->MESAvgdpp) = vgdpp; - *(ckt->CKTstate0 + here->MESAcg) = cg; - *(ckt->CKTstate0 + here->MESAcd) = cd; - *(ckt->CKTstate0 + here->MESAcgd) = cgd; - *(ckt->CKTstate0 + here->MESAcgs) = cgs; - *(ckt->CKTstate0 + here->MESAgm) = gm; - *(ckt->CKTstate0 + here->MESAgds) = gds; - *(ckt->CKTstate0 + here->MESAggs) = ggs; - *(ckt->CKTstate0 + here->MESAggd) = ggd; - *(ckt->CKTstate0 + here->MESAggspp) = ggspp; - *(ckt->CKTstate0 + here->MESAcgspp) = cgspp; - *(ckt->CKTstate0 + here->MESAggdpp) = ggdpp; - *(ckt->CKTstate0 + here->MESAcgdpp) = cgdpp; - - /* - * load current vector - */ -load: - - m = here->MESAm; - - ccorr = model->MESAag*(cgs-cgd); - ceqgd = cgd + cgdpp - ggd*vgd - ggdpp*vgdpp; - ceqgs = cgs + cgspp - ggs*vgs - ggspp*vgspp; - cdreq=((cd+cgd+cgdpp)-gds*vds-gm*vgs); - *(ckt->CKTrhs + here->MESAgatePrimeNode) += m * (-ceqgs-ceqgd); - ceqgd = (cgd-ggd*vgd); - *(ckt->CKTrhs + here->MESAdrainPrimeNode) += m * (-cdreq+ceqgd+ccorr); - ceqgd = (cgdpp-ggdpp*vgdpp); - *(ckt->CKTrhs + here->MESAdrainPrmPrmNode) += ceqgd; - ceqgs = (cgs-ggs*vgs); - *(ckt->CKTrhs + here->MESAsourcePrimeNode) += m * (cdreq+ceqgs-ccorr); - ceqgs = (cgspp-ggspp*vgspp); - *(ckt->CKTrhs + here->MESAsourcePrmPrmNode) += ceqgs; - - /* - * load y matrix - */ - *(here->MESAdrainDrainPtr) += m * (here->MESAdrainConduct); - *(here->MESAsourceSourcePtr) += m * (here->MESAsourceConduct); - *(here->MESAgateGatePtr) += m * (here->MESAgateConduct); - *(here->MESAsourcePrmPrmSourcePrmPrmPtr) += m * (here->MESAtGi+ggspp); - *(here->MESAdrainPrmPrmDrainPrmPrmPtr) += m * (here->MESAtGf+ggdpp); - *(here->MESAgatePrimeGatePrimePtr) += m * (ggd+ggs+here->MESAgateConduct+ggspp+ggdpp); - *(here->MESAdrainPrimeDrainPrimePtr) += m * (gds+ggd+here->MESAdrainConduct+here->MESAtGf); - *(here->MESAsourcePrimeSourcePrimePtr) += m * (gds+gm+ggs+here->MESAsourceConduct+here->MESAtGi); - *(here->MESAdrainDrainPrimePtr) -= m * (here->MESAdrainConduct); - *(here->MESAdrainPrimeDrainPtr) -= m * (here->MESAdrainConduct); - *(here->MESAsourceSourcePrimePtr) -= m * (here->MESAsourceConduct); - *(here->MESAsourcePrimeSourcePtr) -= m * (here->MESAsourceConduct); - *(here->MESAgateGatePrimePtr) -= m * (here->MESAgateConduct); - *(here->MESAgatePrimeGatePtr) -= m * (here->MESAgateConduct); - *(here->MESAgatePrimeDrainPrimePtr) -= m * (ggd); - *(here->MESAgatePrimeSourcePrimePtr) -= m * (ggs); - *(here->MESAdrainPrimeGatePrimePtr) += m * (gm-ggd); - *(here->MESAdrainPrimeSourcePrimePtr) += m * (-gds-gm); - *(here->MESAsourcePrimeGatePrimePtr) += m * (-ggs-gm); - *(here->MESAsourcePrimeDrainPrimePtr) -= m * (gds); - *(here->MESAsourcePrimeSourcePrmPrmPtr) -= m * (here->MESAtGi); - *(here->MESAsourcePrmPrmSourcePrimePtr) -= m * (here->MESAtGi); - *(here->MESAgatePrimeSourcePrmPrmPtr) -= m * (ggspp); - *(here->MESAsourcePrmPrmGatePrimePtr) -= m * (ggspp); - *(here->MESAdrainPrimeDrainPrmPrmPtr) -= m * (here->MESAtGf); - *(here->MESAdrainPrmPrmDrainPrimePtr) -= m * (here->MESAtGf); - *(here->MESAgatePrimeDrainPrmPrmPtr) -= m * (ggdpp); - *(here->MESAdrainPrmPrmGatePrimePtr) -= m * (ggdpp); - } - } - return(OK); -} - - -#define ETA (here->MESAtEta) -#define MU0 (here->MESAtMu) -#define RS (here->MESAtRsi) -#define RD (here->MESAtRdi) -#define SIGMA0 (model->MESAsigma0) -#define VSIGMAT (model->MESAvsigmat) -#define VSIGMA (model->MESAvsigma) -#define THETA (model->MESAtheta) -#define VS (model->MESAvs) -#define ND (model->MESAnd) -#define D (model->MESAd) -#define TC (model->MESAtc) -#define MC (model->MESAmc) -#define M0 (model->MESAm) -#define ALPHA (model->MESAalpha) -#define LAMBDA (here->MESAtLambda) -#define NDELTA (model->MESAndelta) -#define TH (model->MESAth) -#define NDU (model->MESAndu) -#define DU (model->MESAdu) -#define NMAX (model->MESAnmax) -#define GAMMA (model->MESAgamma) - - -static void mesa1(MESAmodel *model, MESAinstance *here, double vgs, - double vds, double von, double *cdrain, - double *gm, double *gds, double *capgs, double *capgd) - -{ - - double vt; - double etavth; - double vl; - double rt; - double mu; - double beta; - double vgt; - double vgt0; - double sigma; - double vgte; - double isat; - double isata; - double isatb; - double ns; - double a; - double b; - double c; - double d; - double e; - double f; - double g; - double h; - double m; - double p; - double q; - double r; - double s; - double t; - double u; - double v; - double w; - double temp; - double gch; - double gchi; - double vsate; - double vdse; - double cgc; - double sqrt1; - double delidgch; - double delgchgchi; - double delgchins; - double delnsvgt; - double delnsvgte; - double delvgtevgt; - double delidvsate; - double delvsateisat; - double delisatisata; - double delisatavgte; - double delisatabeta; - double delisatisatb; - double delvsategch; - double delidvds; - double ddevgte; - double dvgtvgs; - double dgchivgt; - double dvgtevds; - double dgchivds; - double disatavgt; - double disatavds; - double disatbvgt; - double dvsatevgt; - double dvsatevds; - double gmmadd; - double gdsmadd; - - - vt = CONSTKoverQ * here->MESAts; - etavth = ETA*vt; - rt = RS+RD; - vgt0 = vgs - von; - s = exp((vgt0-VSIGMAT)/VSIGMA); - sigma = SIGMA0/(1+s); - vgt = vgt0+sigma*vds; - mu = MU0+THETA*vgt; - vl = VS/mu*here->MESAlength; - beta = here->MESAbeta/(model->MESAvpo+3*vl); - u = vgt/vt-1; - t = sqrt(model->MESAdeltaSqr+u*u); - vgte = 0.5*vt*(2+u+t); - a = 2*beta*vgte; - b = exp(-vgt/etavth); - if(vgte > model->MESAvpo) - sqrt1 = 0; - else - sqrt1 = sqrt(1-vgte/model->MESAvpo); - ns = 1.0/(1.0/ND/D/(1-sqrt1) + 1.0/here->MESAn0*b); - if(ns < 1.0e-38) { - *cdrain = 0; - *gm = 0.0; - *gds = 0.0; - *capgs = here->MESAcf; - *capgd = here->MESAcf; - return; - } - gchi = here->MESAgchi0*mu*ns; - gch = gchi/(1+gchi*rt); - f = sqrt(1+2*a*RS); - d = 1+a*RS + f; - e = 1+TC*vgte; - isata = a*vgte/(d*e); - isatb = here->MESAisatb0*mu*exp(vgt/etavth); - isat = isata*isatb/(isata+isatb); - vsate = isat/gch; - vdse = vds*pow(1+pow(vds/vsate,MC),-1.0/MC); - m = M0+ALPHA*vgte; - g = pow(vds/vsate,m); - h = pow(1+g,1.0/m); - here->MESAdelidgch0 = vds/h; - delidgch = here->MESAdelidgch0*(1+LAMBDA*vds); - *cdrain = gch*delidgch; - if(vgt > model->MESAvpo) - temp = 0; - else - temp = sqrt(1-vgt/model->MESAvpo); - cgc = W*L*EPSILONGAAS/(temp+b)/D; - c = (vsate-vdse)/(2*vsate-vdse); - c = c*c; - *capgs = here->MESAcf+2.0/3.0*cgc*(1-c); - c = vsate/(2*vsate-vdse); - c = c*c; - *capgd = here->MESAcf+2.0/3.0*cgc*(1-c); - temp = 1+gchi*rt; - delgchgchi = 1.0/(temp*temp); - delgchins = here->MESAgchi0*mu; - delnsvgt = ns*ns*1.0/here->MESAn0/etavth*b; - q = 1 - sqrt1; - if(sqrt1 == 0) - delnsvgte = 0; - else - delnsvgte = 0.5*ns*ns/(model->MESAvpo*ND*D*sqrt1*q*q); - delvgtevgt = 0.5*(1+u/t); - here->MESAdelidvds0 = gch/h; - if(vds != 0.0) - here->MESAdelidvds1 = (*cdrain)*pow(vds/vsate,m-1)/(vsate*(1+g)); - else - here->MESAdelidvds1 = 0.0; - delidvds = here->MESAdelidvds0*(1+2*LAMBDA*vds) - here->MESAdelidvds1; - delidvsate = (*cdrain)*g/(vsate*(1+g)); - delvsateisat = 1.0/gch; - r = isata+isatb; - r = r*r; - delisatisata = isatb*isatb/r; - v = 1.0+1.0/f; - ddevgte = 2*beta*RS*v*e+d*TC; - temp = d*d*e*e; - delisatavgte = (2*a*d*e - a*vgte*ddevgte)/temp; - delisatabeta = 2*vgte*vgte*(d*e-a*e*RS*v)/temp; - delisatisatb = isata*isata/r; - delvsategch = -vsate/gch; - dvgtvgs = 1 - SIGMA0*vds*s/VSIGMA/((1+s)*(1+s)); - temp = here->MESAgchi0*ns*THETA; - dgchivgt = delgchins*(delnsvgte*delvgtevgt+delnsvgt)+temp; - dvgtevds = delvgtevgt*sigma; - dgchivds = delgchins*(delnsvgte*dvgtevds+delnsvgt*sigma)+temp*sigma; - temp = delisatabeta*3*beta*vl*THETA/(mu*(model->MESAvpo+3*vl)); - disatavgt = delisatavgte*delvgtevgt+temp; - disatavds = delisatavgte*dvgtevds+temp*sigma; - disatbvgt = isatb/etavth+isatb/mu*THETA; - p = delgchgchi*dgchivgt; - w = delgchgchi*dgchivds; - dvsatevgt = delvsateisat*(delisatisata*disatavgt+delisatisatb*disatbvgt)+delvsategch*p; - dvsatevds = delvsateisat*(delisatisata*disatavds+delisatisatb*disatbvgt*sigma)+delvsategch*w; - if(ALPHA != 0) { - if(vds == 0) - gmmadd = 0; - else - gmmadd = (*cdrain)*(log(1+g)/(m*m)-g*log(vds/vsate)/(m*(1+g)))* - ALPHA*delvgtevgt; - gdsmadd = gmmadd*sigma; - } else { - gmmadd = 0; - gdsmadd = 0; - } - here->MESAgm0 = p; - here->MESAgm1 = delidvsate*dvsatevgt; - here->MESAgm2 = dvgtvgs; - g = delidgch*p+here->MESAgm1; - *gm = (g+gmmadd)*dvgtvgs; - here->MESAgds0 = delidvsate*dvsatevds+delidgch*w+gdsmadd; - *gds = delidvds+here->MESAgds0; - -} - - - -static void mesa2(MESAmodel *model, MESAinstance *here, double vgs, - double vds, double von, double *cdrain, double *gm, - double *gds, double *capgs, double *capgd) - -{ - - double vt; - double rt; - double vgt; - double etavth; - double vgt0; - double sigma; - double vgte; - double isat; - double isata; - double isatb; - double nsa; - double nsb; - double ns; - double a; - double b; - double c; - double d; - double e; - double f; - double g; - double h; - double p; - double q; - double r; - double s; - double t; - double gch; - double gchi; - double vsate; - double vdse; - double ca; - double cb; - double cgc; - double delidgch; - double delgchgchi; - double delgchins; - double delnsvgt; - double delnsbvgt; - double delnsavgte; - double delvgtevgt; - double delidvsate; - double delvsateisat; - double delisatisata; - double delisatavgte; - double delisatisatb; - double delvsategch; - double delisatbvgt; - double delvsatevgt; - double delidvds; - double ddevgte; - double delvgtvgs; - - - vt = CONSTKoverQ * here->MESAts; - etavth = ETA*vt; - rt = RS+RD; - vgt0 = vgs - von; - s = exp((vgt0-VSIGMAT)/VSIGMA); - sigma = SIGMA0/(1+s); - vgt = vgt0+sigma*vds; - t = vgt/vt-1; - q = sqrt(model->MESAdeltaSqr+t*t); - vgte = 0.5*vt*(2+t+q); - a = 2*model->MESAbeta*vgte; - if(vgt > model->MESAvpod) { - if(vgte > model->MESAvpo) { - nsa = NDELTA*TH + NDU*DU; - ca = EPSILONGAAS/DU; - delnsavgte = 0; - } else { - r = sqrt((model->MESAvpo-vgte)/model->MESAvpou); - nsa = NDELTA*TH + NDU*DU*(1-r); - ca = EPSILONGAAS/DU/r; - delnsavgte = NDU*DU/model->MESAvpou/2.0/r; - } - } else { - if(model->MESAvpod - vgte < 0) { - nsa = NDELTA*TH*(1-DU/TH); - ca = EPSILONGAAS/DU; - delnsavgte = 0; - } else { - r = sqrt(1+NDU/NDELTA*(model->MESAvpod - vgte)/model->MESAvpou); - nsa = NDELTA*TH*(1-DU/TH*(r-1)); - ca = EPSILONGAAS/DU/r; - delnsavgte = DU*NDU/2.0/model->MESAvpou/r; - } - } - b = exp(vgt/etavth); - cb = EPSILONGAAS/(DU+TH)*b; - nsb = here->MESAnsb0*b; - delnsbvgt = nsb/etavth; - ns = nsa*nsb/(nsa+nsb); - if(ns < 1.0e-38) { - *cdrain = 0; - *gm = 0.0; - *gds = 0.0; - *capgs = here->MESAcf; - *capgd = here->MESAcf; - return; - } - gchi = here->MESAgchi0*ns; - gch = gchi/(1+gchi*rt); - f = sqrt(1+2*a*RS); - d = 1+a*RS + f; - e = 1+TC*vgte; - isata = a*vgte/d/e; - isatb = here->MESAisatb0*b; - isat = isata*isatb/(isata+isatb); - vsate = isat/gch; - vdse = vds*pow(1+pow(vds/vsate,MC),-1.0/MC); - g = pow(vds/vsate,M0); - h = pow(1+g,1.0/M0); - here->MESAdelidgch0 = vds/h; - delidgch = here->MESAdelidgch0*(1+LAMBDA*vds); - *cdrain = gch*delidgch; - cgc = W*L*ca*cb/(ca+cb); - c = (vsate-vdse)/(2*vsate-vdse); - c = c*c; - *capgs = here->MESAcf+2.0/3.0*cgc*(1-c); - c = vsate/(2*vsate-vdse); - c = c*c; - *capgd = here->MESAcf+2.0/3.0*cgc*(1-c); - c = vgt/vt-1; - delvgtevgt = 0.5*(1+t/q); - here->MESAdelidvds0 = gch/h; - if(vds != 0.0) - here->MESAdelidvds1 = (*cdrain)*pow(vds/vsate,M0-1)/vsate/(1+g); - else - here->MESAdelidvds1 = 0.0; - delidvds = here->MESAdelidvds0*(1+2*LAMBDA*vds) - - here->MESAdelidvds1; - delgchgchi = 1.0/(1+gchi*rt)/(1+gchi*rt); - delgchins = here->MESAgchi0; - r = nsa+nsb; - r = r*r; - delnsvgt = (nsb*nsb*delvgtevgt*delnsavgte + nsa*nsa*delnsbvgt)/r; - delidvsate = (*cdrain)*g/vsate/(1+g); - delvsateisat = 1.0/gch; - r = isata+isatb; - r = r*r; - delisatisata = isatb*isatb/r; - ddevgte = 2*model->MESAbeta*RS*(1+1.0/f)*e+d*TC; - delisatavgte = (2*a*d*e - a*vgte*ddevgte)/d/d/e/e; - delisatisatb = isata*isata/r; - delisatbvgt = isatb/etavth; - delvsategch = -vsate/gch; - delvgtvgs = 1-SIGMA0*vds*s/VSIGMA/(1+s)/(1+s); - p = delgchgchi*delgchins*delnsvgt; - delvsatevgt = delvsateisat*(delisatisata*delisatavgte*delvgtevgt + - delisatisatb*delisatbvgt) + delvsategch*p; - here->MESAgm0 = p; - here->MESAgm1 = delidvsate*delvsatevgt; - here->MESAgm2 = delvgtvgs; - g = delidgch*p + here->MESAgm1; - *gm = g*delvgtvgs; - here->MESAgds0 = g*sigma; - *gds = delidvds+here->MESAgds0; - -} - - - -static void mesa3(MESAmodel *model, MESAinstance *here, double vgs, - double vds, double von, double *cdrain, double *gm, - double *gds, double *capgs, double *capgd) - -{ - - double vt; - double vgt; - double vgt0; - double sigma; - double vgte; - double isat; - double isatm; - double ns; - double nsm; - double a; - double b; - double c; - double d; - double e; - double g; - double h; - double p; - double q; - double s; - double t; - double u; - double temp; - double etavth; - double gch; - double gchi; - double gchim; - double vsate; - double vdse; - double cgc; - double cgcm; - double rt; - double vl; - double delidgch; - double delgchgchi; - double delgchins; - double delnsnsm; - double delnsmvgt; - double delvgtevgt; - double delidvsate; - double delvsateisat; - double delisatisatm; - double delisatmvgte; - double delisatmgchim; - double delvsategch; - double delidvds; - double delvgtvgs; - double delvsatevgt; - - vt = CONSTKoverQ * here->MESAts; - etavth = ETA*vt; - vl = VS/MU0*L; - rt = RS+RD; - vgt0 = vgs - von; - s = exp((vgt0-VSIGMAT)/VSIGMA); - sigma = SIGMA0/(1+s); - vgt = vgt0+sigma*vds; - u = 0.5*vgt/vt-1; - t = sqrt(model->MESAdeltaSqr+u*u); - vgte = vt*(2+u+t); - b = exp(vgt/etavth); - nsm = 2*here->MESAn0*log(1+0.5*b); - if(nsm < 1.0e-38) { - *cdrain = 0; - *gm = 0.0; - *gds = 0.0; - *capgs = here->MESAcf; - *capgd = here->MESAcf; - return; - } - c = pow(nsm/NMAX,GAMMA); - q = pow(1+c,1.0/GAMMA); - ns = nsm/q; - gchi = here->MESAgchi0*ns; - gch = gchi/(1+gchi*rt); - gchim = here->MESAgchi0*nsm; - h = sqrt(1+2*gchim*model->MESArsi + vgte*vgte/(vl*vl)); - p = 1+gchim*RS+h; - isatm = gchim*vgte/p; - g = pow(isatm/here->MESAimax,GAMMA); - isat = isatm/pow(1+g,1/GAMMA); - vsate = isat/gch; - vdse = vds*pow(1+pow(vds/vsate,MC),-1.0/MC); - d = pow(vds/vsate,M0); - e = pow(1+d,1.0/M0); - delidgch = vds*(1+LAMBDA*vds)/e; - *cdrain = gch*delidgch; - cgcm = 1.0/(1/model->MESAcas*D/model->MESAepsi + - 1/model->MESAcbs*etavth/CHARGE/here->MESAn0*exp(-vgt/etavth)); - cgc = W*L*cgcm/pow(1+c,1+1.0/GAMMA); -/* - { - char buf[256]; - void far pascal OutputDebugString(char*); - sprintf(buf,"\n%f\t%e",vgs,cgc); - OutputDebugString(buf); - } -*/ - a = (vsate-vdse)/(2*vsate-vdse); - a = a*a; - temp = 2.0/3.0; - *capgs = here->MESAcf+temp*cgc*(1-a); - a = vsate/(2*vsate-vdse); - a = a*a; - *capgd = here->MESAcf+temp*cgc*(1-a); - delidvsate = (*cdrain)*d/vsate/(1+d); - delidvds = gch*(1+2*LAMBDA*vds)/e-(*cdrain)* - pow(vds/vsate,M0-1)/(vsate*(1+d)); - a = 1+gchi*rt; - delgchgchi = 1.0/(a*a); - delgchins = here->MESAgchi0; - delnsnsm = ns/nsm*(1-c/(1+c)); - delnsmvgt = here->MESAn0/etavth/(1.0/b + 0.5); - delvgtevgt = 0.5*(1+u/t); - delvsateisat = 1.0/gch; - delisatisatm = isat/isatm*(1-g/(1+g)); - delisatmvgte = gchim*(p - vgte*vgte/(vl*vl*h))/(p*p); - delvsategch = -vsate/gch; - delisatmgchim = vgte*(p - gchim*RS*(1+1.0/h))/(p*p); - delvgtvgs = 1-vds*SIGMA0/VSIGMA*s/((1+s)*(1+s)); - p = delgchgchi*delgchins*delnsnsm*delnsmvgt; - delvsatevgt = (delvsateisat*delisatisatm*(delisatmvgte*delvgtevgt + - delisatmgchim*here->MESAgchi0*delnsmvgt)+delvsategch*p); - g = delidgch*p + delidvsate*delvsatevgt; - *gm = g*delvgtvgs; - *gds = delidvds + g*sigma; - -} diff --git a/src/spicelib/devices/mesa/mesamask.c b/src/spicelib/devices/mesa/mesamask.c deleted file mode 100644 index 7f232436e..000000000 --- a/src/spicelib/devices/mesa/mesamask.c +++ /dev/null @@ -1,231 +0,0 @@ -/********** -Copyright 1990 Regents of the University of California. All rights reserved. -Author: 1987 Thomas L. Quarles -**********/ -/* - */ - -#include "ngspice/ngspice.h" -#include "ngspice/cktdefs.h" -#include "ngspice/devdefs.h" -#include "ngspice/ifsim.h" -#include "mesadefs.h" -#include "ngspice/sperror.h" -#include "ngspice/suffix.h" - - -/* ARGSUSED */ -int -MESAmAsk(CKTcircuit *ckt, GENmodel *inst, int which, IFvalue *value) -{ - MESAmodel *here = (MESAmodel*)inst; - - NG_IGNORE(ckt); - - switch(which) { - case MESA_MOD_VTO: - value->rValue = here->MESAthreshold; - return (OK); - case MESA_MOD_VS: - value->rValue = here->MESAvs; - return (OK); - case MESA_MOD_ALPHA: - value->rValue = here->MESAalpha; - return (OK); - case MESA_MOD_BETA: - value->rValue = here->MESAbeta; - return (OK); - case MESA_MOD_LAMBDA: - value->rValue = here->MESAlambda; - return (OK); - case MESA_MOD_RG: - value->rValue = here->MESAgateResist; - return (OK); - case MESA_MOD_RD: - value->rValue = here->MESAdrainResist; - return (OK); - case MESA_MOD_RS: - value->rValue = here->MESAsourceResist; - return (OK); - case MESA_MOD_RI: - value->rValue = here->MESAri; - return (OK); - case MESA_MOD_RF: - value->rValue = here->MESArf; - return (OK); - case MESA_MOD_RDI: - value->rValue = here->MESArdi; - return (OK); - case MESA_MOD_RSI: - value->rValue = here->MESArsi; - return (OK); - case MESA_MOD_PHIB: - value->rValue = here->MESAphib; - return (OK); - case MESA_MOD_PHIB1: - value->rValue = here->MESAphib1; - return (OK); - case MESA_MOD_ASTAR: - value->rValue = here->MESAastar; - return (OK); - case MESA_MOD_GGR: - value->rValue = here->MESAggr; - return (OK); - case MESA_MOD_DEL: - value->rValue = here->MESAdel; - return (OK); - case MESA_MOD_XCHI: - value->rValue = here->MESAxchi; - return (OK); - case MESA_MOD_N: - value->rValue = here->MESAn; - return (OK); - case MESA_MOD_ETA: - value->rValue = here->MESAeta; - return (OK); - case MESA_MOD_M: - value->rValue = here->MESAm; - return (OK); - case MESA_MOD_MC: - value->rValue = here->MESAmc; - return (OK); - case MESA_MOD_SIGMA0: - value->rValue = here->MESAsigma0; - return (OK); - case MESA_MOD_VSIGMAT: - value->rValue = here->MESAvsigmat; - return (OK); - case MESA_MOD_VSIGMA: - value->rValue = here->MESAvsigma; - return (OK); - case MESA_MOD_MU: - value->rValue = here->MESAmu; - return (OK); - case MESA_MOD_MU1: - value->rValue = here->MESAmu1; - return (OK); - case MESA_MOD_MU2: - value->rValue = here->MESAmu2; - return (OK); - case MESA_MOD_D: - value->rValue = here->MESAd; - return (OK); - case MESA_MOD_ND: - value->rValue = here->MESAnd; - return (OK); - case MESA_MOD_DELTA: - value->rValue = here->MESAdelta; - return (OK); - case MESA_MOD_TC: - value->rValue = here->MESAtc; - return (OK); - case MESA_MOD_TVTO: - value->rValue = here->MESAtvto; - return (OK); - case MESA_MOD_TLAMBDA: - value->rValue = here->MESAtlambda; - return (OK); - case MESA_MOD_TETA0: - value->rValue = here->MESAteta0; - return (OK); - case MESA_MOD_TETA1: - value->rValue = here->MESAteta1; - return (OK); - case MESA_MOD_TMU: - value->rValue = here->MESAtmu; - return (OK); - case MESA_MOD_XTM0: - value->rValue = here->MESAxtm0; - return (OK); - case MESA_MOD_XTM1: - value->rValue = here->MESAxtm1; - return (OK); - case MESA_MOD_XTM2: - value->rValue = here->MESAxtm2; - return (OK); - case MESA_MOD_KS: - value->rValue = here->MESAks; - return (OK); - case MESA_MOD_VSG: - value->rValue = here->MESAvsg; - return (OK); - case MESA_MOD_LAMBDAHF: - value->rValue = here->MESAlambdahf; - return (OK); - case MESA_MOD_TF: - value->rValue = here->MESAtf; - return (OK); - case MESA_MOD_FLO: - value->rValue = here->MESAflo; - return (OK); - case MESA_MOD_DELFO: - value->rValue = here->MESAdelfo; - return (OK); - case MESA_MOD_AG: - value->rValue = here->MESAag; - return (OK); - case MESA_MOD_THETA: - value->rValue = here->MESAtheta; - return (OK); - case MESA_MOD_TC1: - value->rValue = here->MESAtc1; - return (OK); - case MESA_MOD_TC2: - value->rValue = here->MESAtc2; - return (OK); - case MESA_MOD_ZETA: - value->rValue = here->MESAzeta; - return (OK); - case MESA_MOD_DU: - value->rValue = here->MESAdu; - return (OK); - - - - case MESA_MOD_NDU: - value->rValue = here->MESAndu; - return (OK); - case MESA_MOD_TH: - value->rValue = here->MESAth; - return (OK); - case MESA_MOD_NDELTA: - value->rValue = here->MESAndelta; - return (OK); - case MESA_MOD_LEVEL: - value->rValue = here->MESAlevel; - return (OK); - case MESA_MOD_NMAX: - value->rValue = here->MESAnmax; - return (OK); - case MESA_MOD_GAMMA: - value->rValue = here->MESAgamma; - return (OK); - case MESA_MOD_EPSI: - value->rValue = here->MESAepsi; - return (OK); - case MESA_MOD_CBS: - value->rValue = here->MESAcbs; - return (OK); - case MESA_MOD_CAS: - value->rValue = here->MESAcas; - return (OK); - case MESA_MOD_TYPE: - if (here->MESAtype == NMF) - value->sValue = "nmf"; - else - value->sValue = "pmf"; - return (OK); - case MESA_MOD_DRAINCONDUCT: - value->rValue = here->MESAdrainConduct; - return (OK); - case MESA_MOD_SOURCECONDUCT: - value->rValue = here->MESAsourceConduct; - return (OK); - case MESA_MOD_VCRIT: - value->rValue = here->MESAvcrit; - return (OK); - default: - return (E_BADPARM); - } - /* NOTREACHED */ -} diff --git a/src/spicelib/devices/mesa/mesamparam.c b/src/spicelib/devices/mesa/mesamparam.c deleted file mode 100644 index 62eeeb3c0..000000000 --- a/src/spicelib/devices/mesa/mesamparam.c +++ /dev/null @@ -1,278 +0,0 @@ -/********** -Copyright 1993: T. Ytterdal, K. Lee, M. Shur and T. A. Fjeldly. All rights reserved. -Author: Trond Ytterdal -**********/ - -#include "ngspice/ngspice.h" -#include "ngspice/const.h" -#include "ngspice/ifsim.h" -#include "mesadefs.h" -#include "ngspice/sperror.h" -#include "ngspice/suffix.h" - - -int -MESAmParam(int param, IFvalue *value, GENmodel *inModel) -{ - MESAmodel *model = (MESAmodel*)inModel; - switch(param) { - case MESA_MOD_VTO: - model->MESAthresholdGiven = TRUE; - model->MESAthreshold = value->rValue; - break; - case MESA_MOD_BETA: - model->MESAbetaGiven = TRUE; - model->MESAbeta = value->rValue; - break; - case MESA_MOD_VS: - model->MESAvsGiven = TRUE; - model->MESAvs = value->rValue; - break; - case MESA_MOD_LAMBDA: - model->MESAlambdaGiven = TRUE; - model->MESAlambda = value->rValue; - break; - case MESA_MOD_RD: - model->MESAdrainResistGiven = TRUE; - model->MESAdrainResist = value->rValue; - break; - case MESA_MOD_RS: - model->MESAsourceResistGiven = TRUE; - model->MESAsourceResist = value->rValue; - break; - case MESA_MOD_RG: - model->MESAgateResistGiven = TRUE; - model->MESAgateResist = value->rValue; - break; - case MESA_MOD_RI: - model->MESAriGiven = TRUE; - model->MESAri = value->rValue; - break; - case MESA_MOD_RF: - model->MESArfGiven = TRUE; - model->MESArf = value->rValue; - break; - case MESA_MOD_RDI: - model->MESArdiGiven = TRUE; - model->MESArdi = value->rValue; - break; - case MESA_MOD_RSI: - model->MESArsiGiven = TRUE; - model->MESArsi = value->rValue; - break; - case MESA_MOD_PHIB: - model->MESAphibGiven = TRUE; - model->MESAphib = value->rValue*CHARGE; - break; - case MESA_MOD_PHIB1: - model->MESAphib1Given = TRUE; - model->MESAphib1 = value->rValue*CHARGE; - break; - case MESA_MOD_ASTAR: - model->MESAastarGiven = TRUE; - model->MESAastar = value->rValue; - break; - case MESA_MOD_GGR: - model->MESAggrGiven = TRUE; - model->MESAggr = value->rValue; - break; - case MESA_MOD_DEL: - model->MESAdelGiven = TRUE; - model->MESAdel = value->rValue; - break; - case MESA_MOD_XCHI: - model->MESAxchiGiven = TRUE; - model->MESAxchi = value->rValue; - break; - case MESA_MOD_N: - model->MESAnGiven = TRUE; - model->MESAn = value->rValue; - break; - case MESA_MOD_ETA: - model->MESAetaGiven = TRUE; - model->MESAeta = value->rValue; - break; - case MESA_MOD_M: - model->MESAmGiven = TRUE; - model->MESAm = value->rValue; - break; - case MESA_MOD_MC: - model->MESAmcGiven = TRUE; - model->MESAmc = value->rValue; - break; - case MESA_MOD_ALPHA: - model->MESAalphaGiven = TRUE; - model->MESAalpha = value->rValue; - break; - case MESA_MOD_SIGMA0: - model->MESAsigma0Given = TRUE; - model->MESAsigma0 = value->rValue; - break; - case MESA_MOD_VSIGMAT: - model->MESAvsigmatGiven = TRUE; - model->MESAvsigmat = value->rValue; - break; - case MESA_MOD_VSIGMA: - model->MESAvsigmaGiven = TRUE; - model->MESAvsigma = value->rValue; - break; - case MESA_MOD_MU: - model->MESAmuGiven = TRUE; - model->MESAmu = value->rValue; - break; - case MESA_MOD_THETA: - model->MESAthetaGiven = TRUE; - model->MESAtheta = value->rValue; - break; - case MESA_MOD_MU1: - model->MESAmu1Given = TRUE; - model->MESAmu1 = value->rValue; - break; - case MESA_MOD_MU2: - model->MESAmu2Given = TRUE; - model->MESAmu2 = value->rValue; - break; - case MESA_MOD_D: - model->MESAdGiven = TRUE; - model->MESAd = value->rValue; - break; - case MESA_MOD_ND: - model->MESAndGiven = TRUE; - model->MESAnd = value->rValue; - break; - case MESA_MOD_DU: - model->MESAduGiven = TRUE; - model->MESAdu = value->rValue; - break; - case MESA_MOD_NDU: - model->MESAnduGiven = TRUE; - model->MESAndu = value->rValue; - break; - case MESA_MOD_TH: - model->MESAthGiven = TRUE; - model->MESAth = value->rValue; - break; - case MESA_MOD_NDELTA: - model->MESAndeltaGiven = TRUE; - model->MESAndelta = value->rValue; - break; - case MESA_MOD_DELTA: - model->MESAdeltaGiven = TRUE; - model->MESAdelta = value->rValue; - break; - case MESA_MOD_TC: - model->MESAtcGiven = TRUE; - model->MESAtc = value->rValue; - break; - case MESA_MOD_NMF: - if(value->iValue) { - model->MESAtype = NMF; - } - break; - case MESA_MOD_PMF: - if(value->iValue) { - fprintf(stderr, "Only nmf model type supported, set to nmf\n"); - model->MESAtype = NMF; - } - break; - case MESA_MOD_TVTO: - model->MESAtvtoGiven = TRUE; - model->MESAtvto = value->rValue; - break; - case MESA_MOD_TLAMBDA: - model->MESAtlambdaGiven = TRUE; - model->MESAtlambda = value->rValue+CONSTCtoK; - break; - case MESA_MOD_TETA0: - model->MESAteta0Given = TRUE; - model->MESAteta0 = value->rValue+CONSTCtoK; - break; - case MESA_MOD_TETA1: - model->MESAteta1Given = TRUE; - model->MESAteta1 = value->rValue+CONSTCtoK; - break; - case MESA_MOD_TMU: - model->MESAtmuGiven = TRUE; - model->MESAtmu = value->rValue+CONSTCtoK; - break; - case MESA_MOD_XTM0: - model->MESAxtm0Given = TRUE; - model->MESAxtm0 = value->rValue; - break; - case MESA_MOD_XTM1: - model->MESAxtm1Given = TRUE; - model->MESAxtm1 = value->rValue; - break; - case MESA_MOD_XTM2: - model->MESAxtm2Given = TRUE; - model->MESAxtm2 = value->rValue; - break; - case MESA_MOD_KS: - model->MESAksGiven = TRUE; - model->MESAks = value->rValue; - break; - case MESA_MOD_VSG: - model->MESAvsgGiven = TRUE; - model->MESAvsg = value->rValue; - break; - case MESA_MOD_LAMBDAHF: - model->MESAlambdahfGiven = TRUE; - model->MESAlambdahf = value->rValue; - break; - case MESA_MOD_TF: - model->MESAtfGiven = TRUE; - model->MESAtf = value->rValue+CONSTCtoK; - break; - case MESA_MOD_FLO: - model->MESAfloGiven = TRUE; - model->MESAflo = value->rValue; - break; - case MESA_MOD_DELFO: - model->MESAdelfoGiven = TRUE; - model->MESAdelfo = value->rValue; - break; - case MESA_MOD_AG: - model->MESAagGiven = TRUE; - model->MESAag = value->rValue; - break; - case MESA_MOD_TC1: - model->MESAtc1Given = TRUE; - model->MESAtc1 = value->rValue; - break; - case MESA_MOD_TC2: - model->MESAtc2Given = TRUE; - model->MESAtc2 = value->rValue; - break; - case MESA_MOD_ZETA: - model->MESAzetaGiven = TRUE; - model->MESAzeta = value->rValue; - break; - case MESA_MOD_LEVEL: - model->MESAlevelGiven = TRUE; - model->MESAlevel = value->rValue; - break; - case MESA_MOD_NMAX: - model->MESAnmaxGiven = TRUE; - model->MESAnmax = value->rValue; - break; - case MESA_MOD_GAMMA: - model->MESAgammaGiven = TRUE; - model->MESAgamma = value->rValue; - break; - case MESA_MOD_EPSI: - model->MESAepsiGiven = TRUE; - model->MESAepsi = value->rValue; - break; - case MESA_MOD_CBS: - model->MESAcbsGiven = TRUE; - model->MESAcbs = value->rValue; - break; - case MESA_MOD_CAS: - model->MESAcasGiven = TRUE; - model->MESAcas = value->rValue; - break; - default: - return(E_BADPARM); - } - return(OK); -} diff --git a/src/spicelib/devices/mesa/mesaparam.c b/src/spicelib/devices/mesa/mesaparam.c deleted file mode 100644 index 98ab7f138..000000000 --- a/src/spicelib/devices/mesa/mesaparam.c +++ /dev/null @@ -1,79 +0,0 @@ -/********** -Copyright 1993: T. Ytterdal, K. Lee, M. Shur and T. A. Fjeldly. All rights reserved. -Author: Trond Ytterdal -**********/ - -#include "ngspice/ngspice.h" -#include "ngspice/const.h" -#include "ngspice/ifsim.h" -#include "mesadefs.h" -#include "ngspice/sperror.h" -#include "ngspice/suffix.h" - - -/* ARGSUSED */ -int -MESAparam(int param, IFvalue *value, GENinstance *inst, IFvalue *select) -{ - MESAinstance *here = (MESAinstance*)inst; - - NG_IGNORE(select); - - switch (param) { - case MESA_LENGTH: - here->MESAlength = value->rValue; - here->MESAlengthGiven = TRUE; - break; - case MESA_WIDTH: - here->MESAwidth = value->rValue; - here->MESAwidthGiven = TRUE; - break; - case MESA_M: - here->MESAm = value->rValue; - here->MESAmGiven = TRUE; - break; - - case MESA_IC_VDS: - here->MESAicVDS = value->rValue; - here->MESAicVDSGiven = TRUE; - break; - case MESA_IC_VGS: - here->MESAicVGS = value->rValue; - here->MESAicVGSGiven = TRUE; - break; - case MESA_OFF: - here->MESAoff = value->iValue; - break; - case MESA_IC: - /* FALLTHROUGH added to suppress GCC warning due to - * -Wimplicit-fallthrough flag */ - switch (value->v.numValue) { - case 2: - here->MESAicVGS = *(value->v.vec.rVec+1); - here->MESAicVGSGiven = TRUE; - /* FALLTHROUGH */ - case 1: - here->MESAicVDS = *(value->v.vec.rVec); - here->MESAicVDSGiven = TRUE; - break; - default: - return(E_BADPARM); - } - break; - case MESA_TD: - here->MESAtd = value->rValue+CONSTCtoK; - here->MESAtdGiven = TRUE; - break; - case MESA_TS: - here->MESAts = value->rValue+CONSTCtoK; - here->MESAtsGiven = TRUE; - break; - case MESA_DTEMP: - here->MESAdtemp = value->rValue; - here->MESAdtempGiven = TRUE; - break; - default: - return(E_BADPARM); - } - return(OK); -} diff --git a/src/spicelib/devices/mesa/mesapzl.c b/src/spicelib/devices/mesa/mesapzl.c deleted file mode 100644 index 86b464f81..000000000 --- a/src/spicelib/devices/mesa/mesapzl.c +++ /dev/null @@ -1,106 +0,0 @@ -/********** -Copyright 1993: T. Ytterdal, K. Lee, M. Shur and T. A. Fjeldly. All rights reserved. -Author: Trond Ytterdal -**********/ - -#include "ngspice/ngspice.h" -#include "ngspice/cktdefs.h" -#include "mesadefs.h" -#include "ngspice/sperror.h" -#include "ngspice/suffix.h" - - -int -MESApzLoad(GENmodel *inModel, CKTcircuit *ckt, SPcomplex *s) -{ - MESAmodel *model = (MESAmodel*)inModel; - MESAinstance *here; - double gm; - double gds; - double ggspp; - double ggdpp; - double ggs; - double xgs; - double ggd; - double xgd; - double f; - double lambda; - double vds; - double delidgch; - double delidvds; - - double m; - - for( ; model != NULL; model = MESAnextModel(model)) { - for( here = MESAinstances(model); here != NULL; - here = MESAnextInstance(here)) { - - f = ckt->CKTomega/2/M_PI; - if(here->MESAdelf == 0) - lambda = here->MESAtLambda; - else - lambda = here->MESAtLambda+0.5*(here->MESAtLambdahf-here->MESAtLambda)* - (1+tanh((f-here->MESAfl)/here->MESAdelf)); - vds= *(ckt->CKTstate0 + here->MESAvgs) - - *(ckt->CKTstate0 + here->MESAvgd); - delidgch = here->MESAdelidgch0*(1+lambda*vds); - delidvds = here->MESAdelidvds0*(1+2*lambda*vds) - - here->MESAdelidvds1; - gm = (delidgch*here->MESAgm0+here->MESAgm1)*here->MESAgm2; - gds = delidvds+here->MESAgds0; - - ggspp=*(ckt->CKTstate0 + here->MESAggspp); - ggdpp=*(ckt->CKTstate0 + here->MESAggdpp); - ggs= *(ckt->CKTstate0 + here->MESAggs) ; - xgs= *(ckt->CKTstate0 + here->MESAqgs) ; - ggd= *(ckt->CKTstate0 + here->MESAggd) ; - xgd= *(ckt->CKTstate0 + here->MESAqgd) ; - - m = here->MESAm; - - *(here->MESAdrainDrainPtr) += m * (here->MESAdrainConduct); - *(here->MESAsourceSourcePtr) += m * (here->MESAsourceConduct); - *(here->MESAgateGatePtr) += m * (here->MESAgateConduct); - *(here->MESAsourcePrmPrmSourcePrmPrmPtr) += m * (here->MESAtGi+ggspp); - *(here->MESAdrainPrmPrmDrainPrmPrmPtr) += m * (here->MESAtGf+ggdpp); - *(here->MESAdrainDrainPrimePtr) -= m * (here->MESAdrainConduct); - *(here->MESAdrainPrimeDrainPtr) -= m * (here->MESAdrainConduct); - *(here->MESAsourceSourcePrimePtr) -= m * (here->MESAsourceConduct); - *(here->MESAsourcePrimeSourcePtr) -= m * (here->MESAsourceConduct); - *(here->MESAgateGatePrimePtr) -= m * (here->MESAgateConduct); - *(here->MESAgatePrimeGatePtr) -= m * (here->MESAgateConduct); - *(here->MESAgatePrimeDrainPrimePtr) += m * (-ggd); - *(here->MESAgatePrimeSourcePrimePtr) += m * (-ggs); - *(here->MESAdrainPrimeGatePrimePtr) += m * (gm-ggd); - *(here->MESAdrainPrimeSourcePrimePtr) += m * (-gds-gm); - *(here->MESAsourcePrimeGatePrimePtr) += m * (-ggs-gm); - *(here->MESAsourcePrimeDrainPrimePtr) += m * (-gds); - *(here->MESAgatePrimeGatePrimePtr) += m * (ggd+ggs+here->MESAgateConduct+ggspp+ggdpp); - *(here->MESAdrainPrimeDrainPrimePtr) += m * (gds+ggd+here->MESAdrainConduct+here->MESAtGf); - *(here->MESAsourcePrimeSourcePrimePtr) += m * (gds+gm+ggs+here->MESAsourceConduct+here->MESAtGi); - *(here->MESAsourcePrimeSourcePrmPrmPtr) -= m * (here->MESAtGi); - *(here->MESAsourcePrmPrmSourcePrimePtr) -= m * (here->MESAtGi); - *(here->MESAgatePrimeSourcePrmPrmPtr) -= m * (ggspp); - *(here->MESAsourcePrmPrmGatePrimePtr) -= m * (ggspp); - *(here->MESAdrainPrimeDrainPrmPrmPtr) -= m * (here->MESAtGf); - *(here->MESAdrainPrmPrmDrainPrimePtr) -= m * (here->MESAtGf); - *(here->MESAgatePrimeDrainPrmPrmPtr) -= m * (ggdpp); - *(here->MESAdrainPrmPrmGatePrimePtr) -= m * (ggdpp); - *(here->MESAsourcePrmPrmSourcePrmPrmPtr) += m * (xgs * s->real); - *(here->MESAsourcePrmPrmSourcePrmPrmPtr+1) += m * (xgs * s->imag); - *(here->MESAdrainPrmPrmDrainPrmPrmPtr) += m * (xgd * s->real); - *(here->MESAdrainPrmPrmDrainPrmPrmPtr+1) += m * (xgd * s->imag); - *(here->MESAgatePrimeGatePrimePtr) += m * ((xgd+xgs) * s->real); - *(here->MESAgatePrimeGatePrimePtr+1) += m * ((xgd+xgs) * s->imag); - *(here->MESAgatePrimeDrainPrmPrmPtr) -= m * (xgd * s->real); - *(here->MESAgatePrimeDrainPrmPrmPtr+1) -= m * (xgd * s->imag); - *(here->MESAdrainPrmPrmGatePrimePtr) -= m * (xgd * s->real); - *(here->MESAdrainPrmPrmGatePrimePtr+1) -= m * (xgd * s->imag); - *(here->MESAgatePrimeSourcePrmPrmPtr) -= m * (xgs * s->real); - *(here->MESAgatePrimeSourcePrmPrmPtr+1) -= m * (xgs * s->imag); - *(here->MESAsourcePrmPrmGatePrimePtr) -= m * (xgs * s->real); - *(here->MESAsourcePrmPrmGatePrimePtr+1) -= m * (xgs * s->imag); - } - } - return(OK); -} diff --git a/src/spicelib/devices/mesa/mesasetup.c b/src/spicelib/devices/mesa/mesasetup.c deleted file mode 100644 index 9807c0a5d..000000000 --- a/src/spicelib/devices/mesa/mesasetup.c +++ /dev/null @@ -1,451 +0,0 @@ -/********** -Copyright 1993: T. Ytterdal, K. Lee, M. Shur and T. A. Fjeldly. All rights reserved. -Author: Trond Ytterdal -Modified: 2001 AlansFixes -**********/ - -#include "ngspice/ngspice.h" -#include "ngspice/smpdefs.h" -#include "ngspice/cktdefs.h" -#include "mesadefs.h" -#include "ngspice/const.h" -#include "ngspice/sperror.h" -#include "ngspice/suffix.h" - - -int -MESAsetup(SMPmatrix *matrix, GENmodel *inModel, CKTcircuit *ckt, int *states) - - /* load the diode structure with those pointers needed later - * for fast matrix loading - */ -{ - MESAmodel *model = (MESAmodel*)inModel; - MESAinstance *here; - int error; - CKTnode *tmp; - - - /* loop through all the diode models */ - for( ; model != NULL; model = MESAnextModel(model)) { - if( (model->MESAtype != NMF) ) { - fprintf(stderr, "Only nmf model type supported, set to nmf\n"); - model->MESAtype = NMF; - } - if(!model->MESAthresholdGiven) { - model->MESAthreshold = -1.26; - } - if(!model->MESAdGiven) { - model->MESAd = 0.12e-6; - } - if(!model->MESAduGiven) { - model->MESAdu = 0.035e-6; - } - if(!model->MESAlambdaGiven) { - model->MESAlambda = 0.045; - } - if(!model->MESAvsGiven) { - model->MESAvs = 1.5e5; - } - if(!model->MESAbetaGiven) { - model->MESAbeta = 0.0085; - } - if(!model->MESAetaGiven) { - model->MESAeta = 1.73; - } - if(!model->MESAmGiven) { - model->MESAm = 2.5; - } - if(!model->MESAmcGiven) { - model->MESAmc = 3.0; - } - if(!model->MESAalphaGiven) { - model->MESAalpha = 0.0; - } - if(!model->MESAsigma0Given) { - model->MESAsigma0 = 0.081; - } - if(!model->MESAvsigmatGiven) { - model->MESAvsigmat = 1.01; - } - if(!model->MESAvsigmaGiven) { - model->MESAvsigma = 0.1; - } - if(!model->MESAmuGiven) { - model->MESAmu = 0.23; - } - if(!model->MESAthetaGiven) { - model->MESAtheta = 0; - } - if(!model->MESAmu1Given) { - model->MESAmu1 = 0; - } - if(!model->MESAmu2Given) { - model->MESAmu2 = 0; - } - if(!model->MESAndGiven) { - model->MESAnd = 2.0e23; - } - if(!model->MESAnduGiven) { - model->MESAndu = 1e22; - } - if(!model->MESAndeltaGiven) { - model->MESAndelta = 6e24; - } - if(!model->MESAthGiven) { - model->MESAth = 0.01e-6; - } - if(!model->MESAdeltaGiven) { - model->MESAdelta = 5.0; - } - if(!model->MESAtcGiven) { - model->MESAtc = 0.0; - } - if(!model->MESAdrainResistGiven) { - model->MESAdrainResist = 0; - } - if(!model->MESAsourceResistGiven) { - model->MESAsourceResist = 0; - } - if(!model->MESAgateResistGiven) { - model->MESAgateResist = 0; - } - if(!model->MESAriGiven) { - model->MESAri = 0; - } - if(!model->MESArfGiven) { - model->MESArf = 0; - } - if(!model->MESArdiGiven) { - model->MESArdi = 0; - } - if(!model->MESArsiGiven) { - model->MESArsi = 0; - } - if(!model->MESAphibGiven) { - model->MESAphib = 0.5*CHARGE; - } - if(!model->MESAphib1Given) { - model->MESAphib1 = 0; - } - if(!model->MESAastarGiven) { - model->MESAastar = 4.0e4; - } - if(!model->MESAggrGiven) { - model->MESAggr = 40; - } - if(!model->MESAdelGiven) { - model->MESAdel = 0.04; - } - if(!model->MESAxchiGiven) { - model->MESAxchi = 0.033; - } - if(!model->MESAnGiven) { - model->MESAn = 1; - } - if(!model->MESAtvtoGiven) { - model->MESAtvto = 0; - } - if(!model->MESAtlambdaGiven) { - model->MESAtlambda = DBL_MAX; - } - if(!model->MESAteta0Given) { - model->MESAteta0 = DBL_MAX; - } - if(!model->MESAteta1Given) { - model->MESAteta1 = 0; - } - if(!model->MESAtmuGiven) { - model->MESAtmu = 300.15; - } - if(!model->MESAxtm0Given) { - model->MESAxtm0 = 0; - } - if(!model->MESAxtm1Given) { - model->MESAxtm1 = 0; - } - if(!model->MESAxtm2Given) { - model->MESAxtm2 = 0; - } - if(!model->MESAksGiven) { - model->MESAks = 0; - } - if(!model->MESAvsgGiven) { - model->MESAvsg = 0; - } - if(!model->MESAtfGiven) { - model->MESAtf = ckt->CKTtemp; - } - if(!model->MESAfloGiven) { - model->MESAflo = 0; - } - if(!model->MESAdelfoGiven) { - model->MESAdelfo = 0; - } - if(!model->MESAagGiven) { - model->MESAag = 0; - } - if(!model->MESAtc1Given) { - model->MESAtc1 = 0; - } - if(!model->MESAtc2Given) { - model->MESAtc2 = 0; - } - if(!model->MESAzetaGiven) { - model->MESAzeta = 1; - } - if(!model->MESAlevelGiven) { - model->MESAlevel = 2; - } - if(!model->MESAnmaxGiven) { - model->MESAnmax = 2e16; - } - if(!model->MESAgammaGiven) { - model->MESAgamma = 3.0; - } - if(!model->MESAepsiGiven) { - model->MESAepsi = 12.244*8.85418e-12; - } - if(!model->MESAcasGiven) { - model->MESAcas = 1; - } - if(!model->MESAcbsGiven) { - model->MESAcbs = 1; - } - - if(model->MESAdrainResist != 0) { - model->MESAdrainConduct = 1./model->MESAdrainResist; - } else { - model->MESAdrainConduct = DBL_MAX; - } - if(model->MESAsourceResist != 0) { - model->MESAsourceConduct = 1./model->MESAsourceResist; - } else { - model->MESAsourceConduct = DBL_MAX; - } - - model->MESAvcrit = 0.; /* until model has changed */ - - /* loop through all the instances of the model */ - for (here = MESAinstances(model); here != NULL ; - here=MESAnextInstance(here)) { - - if(!here->MESAlengthGiven) { - here->MESAlength = 1e-6; - } - if(!here->MESAwidthGiven) { - here->MESAwidth = 20e-6; - } - if(!here->MESAmGiven) { - here->MESAm = 1.0; - } - if(!here->MESAdtempGiven) { - here->MESAdtemp = 0.0; - } - if(!here->MESAtdGiven) { - here->MESAtd = ckt->CKTtemp + here->MESAdtemp; - } - if(!here->MESAtsGiven) { - here->MESAts = ckt->CKTtemp + here->MESAdtemp; - } - - - here->MESAstate = *states; - *states += MESAnumStates; - - if(model->MESAsourceResist != 0) { - if(here->MESAsourcePrimeNode == 0) { - error = CKTmkVolt(ckt,&tmp,here->MESAname,"source"); - if(error) return(error); - here->MESAsourcePrimeNode = tmp->number; - - if (ckt->CKTcopyNodesets) { - CKTnode *tmpNode; - IFuid tmpName; - - if (CKTinst2Node(ckt,here,3,&tmpNode,&tmpName)==OK) { - if (tmpNode->nsGiven) { - tmp->nodeset=tmpNode->nodeset; - tmp->nsGiven=tmpNode->nsGiven; - } - } - } - } - - } else { - here->MESAsourcePrimeNode = here->MESAsourceNode; - } - - if(model->MESAdrainResist != 0) { - if(here->MESAdrainPrimeNode == 0) { - error = CKTmkVolt(ckt,&tmp,here->MESAname,"drain"); - if(error) return(error); - here->MESAdrainPrimeNode = tmp->number; - - if (ckt->CKTcopyNodesets) { - CKTnode *tmpNode; - IFuid tmpName; - - if (CKTinst2Node(ckt,here,1,&tmpNode,&tmpName)==OK) { - if (tmpNode->nsGiven) { - tmp->nodeset=tmpNode->nodeset; - tmp->nsGiven=tmpNode->nsGiven; - } - } - } - } - - } else { - here->MESAdrainPrimeNode = here->MESAdrainNode; - } - if(model->MESAgateResist != 0) { - if(here->MESAgatePrimeNode == 0) { - error = CKTmkVolt(ckt,&tmp,here->MESAname,"gate"); - if(error) return(error); - here->MESAgatePrimeNode = tmp->number; - - if (ckt->CKTcopyNodesets) { - CKTnode *tmpNode; - IFuid tmpName; - - if (CKTinst2Node(ckt,here,2,&tmpNode,&tmpName)==OK) { - if (tmpNode->nsGiven) { - tmp->nodeset=tmpNode->nodeset; - tmp->nsGiven=tmpNode->nsGiven; - } - } - } - } - - - } else { - here->MESAgatePrimeNode = here->MESAgateNode; - } - - - if(model->MESAri != 0) { - if(here->MESAsourcePrmPrmNode == 0) { - error = CKTmkVolt(ckt,&tmp,here->MESAname,"gs"); - if(error) return(error); - here->MESAsourcePrmPrmNode = tmp->number; - - if (ckt->CKTcopyNodesets) { - CKTnode *tmpNode; - IFuid tmpName; - - if (CKTinst2Node(ckt,here,3,&tmpNode,&tmpName)==OK) { - if (tmpNode->nsGiven) { - tmp->nodeset=tmpNode->nodeset; - tmp->nsGiven=tmpNode->nsGiven; - } - } - } - } - - } else { - here->MESAsourcePrmPrmNode = here->MESAsourcePrimeNode; - } - if(model->MESArf != 0) { - if(here->MESAdrainPrmPrmNode == 0) { - error = CKTmkVolt(ckt,&tmp,here->MESAname,"gd"); - if(error) return(error); - here->MESAdrainPrmPrmNode = tmp->number; - - if (ckt->CKTcopyNodesets) { - CKTnode *tmpNode; - IFuid tmpName; - - if (CKTinst2Node(ckt,here,1,&tmpNode,&tmpName)==OK) { - if (tmpNode->nsGiven) { - tmp->nodeset=tmpNode->nodeset; - tmp->nsGiven=tmpNode->nsGiven; - } - } - } - } - - } else { - here->MESAdrainPrmPrmNode = here->MESAdrainPrimeNode; - } - -#define TSTALLOC(ptr,first,second) \ -do { if((here->ptr = SMPmakeElt(matrix, here->first, here->second)) == NULL){\ - return(E_NOMEM);\ -} } while(0) - - TSTALLOC(MESAdrainDrainPtr,MESAdrainNode,MESAdrainNode); - TSTALLOC(MESAdrainPrimeDrainPrimePtr,MESAdrainPrimeNode,MESAdrainPrimeNode); - TSTALLOC(MESAdrainPrmPrmDrainPrmPrmPtr,MESAdrainPrmPrmNode,MESAdrainPrmPrmNode); - TSTALLOC(MESAgateGatePtr,MESAgateNode,MESAgateNode); - TSTALLOC(MESAgatePrimeGatePrimePtr,MESAgatePrimeNode,MESAgatePrimeNode); - TSTALLOC(MESAsourceSourcePtr,MESAsourceNode,MESAsourceNode); - TSTALLOC(MESAsourcePrimeSourcePrimePtr,MESAsourcePrimeNode,MESAsourcePrimeNode); - TSTALLOC(MESAsourcePrmPrmSourcePrmPrmPtr,MESAsourcePrmPrmNode,MESAsourcePrmPrmNode); - TSTALLOC(MESAdrainDrainPrimePtr,MESAdrainNode,MESAdrainPrimeNode); - TSTALLOC(MESAdrainPrimeDrainPtr,MESAdrainPrimeNode,MESAdrainNode); - TSTALLOC(MESAgatePrimeDrainPrimePtr,MESAgatePrimeNode,MESAdrainPrimeNode); - TSTALLOC(MESAdrainPrimeGatePrimePtr,MESAdrainPrimeNode,MESAgatePrimeNode); - TSTALLOC(MESAgatePrimeSourcePrimePtr,MESAgatePrimeNode,MESAsourcePrimeNode); - TSTALLOC(MESAsourcePrimeGatePrimePtr,MESAsourcePrimeNode,MESAgatePrimeNode) ; - TSTALLOC(MESAsourceSourcePrimePtr,MESAsourceNode,MESAsourcePrimeNode); - TSTALLOC(MESAsourcePrimeSourcePtr,MESAsourcePrimeNode,MESAsourceNode); - TSTALLOC(MESAdrainPrimeSourcePrimePtr,MESAdrainPrimeNode,MESAsourcePrimeNode); - TSTALLOC(MESAsourcePrimeDrainPrimePtr,MESAsourcePrimeNode,MESAdrainPrimeNode); - TSTALLOC(MESAgatePrimeGatePtr,MESAgatePrimeNode,MESAgateNode); - TSTALLOC(MESAgateGatePrimePtr,MESAgateNode,MESAgatePrimeNode); - TSTALLOC(MESAsourcePrmPrmSourcePrimePtr,MESAsourcePrmPrmNode,MESAsourcePrimeNode); - TSTALLOC(MESAsourcePrimeSourcePrmPrmPtr,MESAsourcePrimeNode,MESAsourcePrmPrmNode); - TSTALLOC(MESAsourcePrmPrmGatePrimePtr,MESAsourcePrmPrmNode,MESAgatePrimeNode); - TSTALLOC(MESAgatePrimeSourcePrmPrmPtr,MESAgatePrimeNode,MESAsourcePrmPrmNode); - TSTALLOC(MESAdrainPrmPrmDrainPrimePtr,MESAdrainPrmPrmNode,MESAdrainPrimeNode); - TSTALLOC(MESAdrainPrimeDrainPrmPrmPtr,MESAdrainPrimeNode,MESAdrainPrmPrmNode); - TSTALLOC(MESAdrainPrmPrmGatePrimePtr,MESAdrainPrmPrmNode,MESAgatePrimeNode); - TSTALLOC(MESAgatePrimeDrainPrmPrmPtr,MESAgatePrimeNode,MESAdrainPrmPrmNode); - } - } - return(OK); -} - - -int -MESAunsetup(GENmodel *inModel, CKTcircuit *ckt) -{ - MESAmodel *model; - MESAinstance *here; - - for (model = (MESAmodel *)inModel; model != NULL; - model = MESAnextModel(model)) - { - for (here = MESAinstances(model); here != NULL; - here=MESAnextInstance(here)) - { - if (here->MESAdrainPrmPrmNode > 0 - && here->MESAdrainPrmPrmNode != here->MESAdrainPrimeNode) - CKTdltNNum(ckt, here->MESAdrainPrmPrmNode); - here->MESAdrainPrmPrmNode = 0; - - if (here->MESAsourcePrmPrmNode > 0 - && here->MESAsourcePrmPrmNode != here->MESAsourcePrimeNode) - CKTdltNNum(ckt, here->MESAsourcePrmPrmNode); - here->MESAsourcePrmPrmNode = 0; - - if (here->MESAgatePrimeNode > 0 - && here->MESAgatePrimeNode != here->MESAgateNode) - CKTdltNNum(ckt, here->MESAgatePrimeNode); - here->MESAgatePrimeNode = 0; - - if (here->MESAdrainPrimeNode > 0 - && here->MESAdrainPrimeNode != here->MESAdrainNode) - CKTdltNNum(ckt, here->MESAdrainPrimeNode); - here->MESAdrainPrimeNode = 0; - - if (here->MESAsourcePrimeNode > 0 - && here->MESAsourcePrimeNode != here->MESAsourceNode) - CKTdltNNum(ckt, here->MESAsourcePrimeNode); - here->MESAsourcePrimeNode = 0; - - - } - } - return OK; -} diff --git a/src/spicelib/devices/mesa/mesatemp.c b/src/spicelib/devices/mesa/mesatemp.c deleted file mode 100644 index 4d8b4136a..000000000 --- a/src/spicelib/devices/mesa/mesatemp.c +++ /dev/null @@ -1,175 +0,0 @@ -/********** -Copyright 1993: T. Ytterdal, K. Lee, M. Shur and T. A. Fjeldly. All rights reserved. -Author: Trond Ytterdal -**********/ - -#include "ngspice/ngspice.h" -#include "ngspice/smpdefs.h" -#include "ngspice/cktdefs.h" -#include "mesadefs.h" -#include "ngspice/const.h" -#include "ngspice/sperror.h" -#include "ngspice/suffix.h" - - -#define EPSILONGAAS (12.244*8.85418e-12) - -int -MESAtemp(GENmodel *inModel, CKTcircuit *ckt) -{ - - MESAmodel *model = (MESAmodel*)inModel; - MESAinstance *here; - double temp; - double vt; - double d; - - - for( ; model != NULL; model = MESAnextModel(model)) { - if(!model->MESAlambdahfGiven) - model->MESAlambdahf = model->MESAlambda; - if(model->MESAlevel == 2) - model->MESAvpo = CHARGE*model->MESAnd*model->MESAd*model->MESAd/ - 2/EPSILONGAAS; - else { - model->MESAvpou = CHARGE*model->MESAndu*model->MESAdu*model->MESAdu/ - 2/EPSILONGAAS; - model->MESAvpod = CHARGE*model->MESAndelta*model->MESAth* - (2*model->MESAdu + model->MESAth)/2/EPSILONGAAS; - model->MESAvpo = model->MESAvpou+model->MESAvpod; - } - model->MESAdeltaSqr = model->MESAdelta*model->MESAdelta; - - for (here = MESAinstances(model); here != NULL ; - here=MESAnextInstance(here)) { - - vt = CONSTKoverQ * here->MESAts; - if(model->MESAmu1 == 0 && model->MESAmu2 == 0) - here->MESAtMu = model->MESAmu*pow(here->MESAts/ - model->MESAtmu,model->MESAxtm0); - else { - double muimp = model->MESAmu*pow(here->MESAts/ - model->MESAtmu,model->MESAxtm0); - double mupo = model->MESAmu1*pow(model->MESAtmu/ - here->MESAts,model->MESAxtm1) + - model->MESAmu2*pow(model->MESAtmu/ - here->MESAts,model->MESAxtm2); - here->MESAtMu = 1/(1/muimp+1/mupo); - } - here->MESAtTheta = model->MESAtheta; - here->MESAtPhib = model->MESAphib-model->MESAphib1*(here->MESAts-ckt->CKTnomTemp); - here->MESAtVto = model->MESAthreshold-model->MESAtvto*(here->MESAts-ckt->CKTnomTemp); - here->MESAimax = CHARGE*model->MESAnmax*model->MESAvs*here->MESAwidth; - - if(model->MESAlevel == 2) - here->MESAgchi0 = CHARGE*here->MESAwidth/here->MESAlength; - else - here->MESAgchi0 = CHARGE*here->MESAwidth/here->MESAlength*here->MESAtMu; - here->MESAbeta = 2*EPSILONGAAS*model->MESAvs*model->MESAzeta*here->MESAwidth/ - model->MESAd; - here->MESAtEta = model->MESAeta*(1+here->MESAts/model->MESAteta0)+ - model->MESAteta1/here->MESAts; - here->MESAtLambda= model->MESAlambda*(1-here->MESAts/model->MESAtlambda); - here->MESAtLambdahf = model->MESAlambdahf*(1-here->MESAts/model->MESAtlambda); - if(model->MESAlevel == 3) - d = model->MESAdu; - else - d = model->MESAd; - if(model->MESAlevel == 4) - here->MESAn0 = model->MESAepsi*here->MESAtEta*vt/2/CHARGE/d; - else - here->MESAn0 = EPSILONGAAS*here->MESAtEta*vt/CHARGE/d; - here->MESAnsb0 = EPSILONGAAS*here->MESAtEta*vt/CHARGE/ - (model->MESAdu + model->MESAth); - here->MESAisatb0 = CHARGE*here->MESAn0*vt* - here->MESAwidth/here->MESAlength; - if(model->MESAlevel == 4) - here->MESAcf = 0.5*model->MESAepsi*here->MESAwidth; - else - here->MESAcf = 0.5*EPSILONGAAS*here->MESAwidth; - here->MESAcsatfs = 0.5*model->MESAastar*here->MESAts* - here->MESAts*exp(-here->MESAtPhib/(CONSTboltz*here->MESAts))* - here->MESAlength*here->MESAwidth; - here->MESAcsatfd = 0.5*model->MESAastar*here->MESAtd* - here->MESAtd*exp(-here->MESAtPhib/(CONSTboltz*here->MESAtd))* - here->MESAlength*here->MESAwidth; - here->MESAggrwl = model->MESAggr*here->MESAlength*here->MESAwidth* - exp(model->MESAxchi*(here->MESAts-ckt->CKTnomTemp)); - if(here->MESAcsatfs != 0) - here->MESAvcrits = vt*log(vt/(CONSTroot2 * here->MESAcsatfs)); - else - here->MESAvcrits = DBL_MAX; - if(here->MESAcsatfd != 0) { - double vtd = CONSTKoverQ * here->MESAtd; - here->MESAvcritd = vtd*log(vtd/(CONSTroot2 * here->MESAcsatfd)); - } else - here->MESAvcritd = DBL_MAX; - temp = exp(here->MESAts/model->MESAtf); - here->MESAfl = model->MESAflo*temp; - here->MESAdelf = model->MESAdelfo*temp; - if(model->MESArdi != 0.0) - here->MESAtRdi = model->MESArdi*(1+ - model->MESAtc1*(here->MESAtd-ckt->CKTnomTemp)+ - model->MESAtc2*(here->MESAtd-ckt->CKTnomTemp)*(here->MESAtd-ckt->CKTnomTemp)); - else - here->MESAtRdi = 0; - if(model->MESArsi != 0.0) - here->MESAtRsi = model->MESArsi*(1+ - model->MESAtc1*(here->MESAts-ckt->CKTnomTemp)+ - model->MESAtc2*(here->MESAts-ckt->CKTnomTemp)*(here->MESAts-ckt->CKTnomTemp)); - else - here->MESAtRsi = 0; - if(model->MESAgateResist != 0.0) - here->MESAtRg = model->MESAgateResist*(1+ - model->MESAtc1*(here->MESAts-ckt->CKTnomTemp)+ - model->MESAtc2*(here->MESAts-ckt->CKTnomTemp)*(here->MESAts-ckt->CKTnomTemp)); - else - here->MESAtRg = 0; - if(model->MESAsourceResist != 0.0) - here->MESAtRs = model->MESAsourceResist*(1+ - model->MESAtc1*(here->MESAts-ckt->CKTnomTemp)+ - model->MESAtc2*(here->MESAts-ckt->CKTnomTemp)*(here->MESAts-ckt->CKTnomTemp)); - else - here->MESAtRs = 0; - if(model->MESAdrainResist != 0.0) - here->MESAtRd = model->MESAdrainResist*(1+ - model->MESAtc1*(here->MESAtd-ckt->CKTnomTemp)+ - model->MESAtc2*(here->MESAtd-ckt->CKTnomTemp)*(here->MESAtd-ckt->CKTnomTemp)); - else - here->MESAtRd = 0; - if(model->MESAri != 0.0) - here->MESAtRi = model->MESAri*(1+ - model->MESAtc1*(here->MESAts-ckt->CKTnomTemp)+ - model->MESAtc2*(here->MESAts-ckt->CKTnomTemp)*(here->MESAts-ckt->CKTnomTemp)); - else - here->MESAtRi = 0; - if(model->MESArf != 0.0) - here->MESAtRf = model->MESArf*(1+ - model->MESAtc1*(here->MESAtd-ckt->CKTnomTemp)+ - model->MESAtc2*(here->MESAtd-ckt->CKTnomTemp)*(here->MESAtd-ckt->CKTnomTemp)); - else - here->MESAtRf = 0; - if(here->MESAtRd != 0) - here->MESAdrainConduct = 1/here->MESAtRd; - else - here->MESAdrainConduct = 0; - if(here->MESAtRs != 0) - here->MESAsourceConduct = 1/here->MESAtRs; - else - here->MESAsourceConduct = 0; - if(here->MESAtRg != 0) - here->MESAgateConduct = 1/here->MESAtRg; - else - here->MESAgateConduct = 0; - if(here->MESAtRi != 0) - here->MESAtGi = 1/here->MESAtRi; - else - here->MESAtGi = 0; - if(here->MESAtRf != 0) - here->MESAtGf = 1/here->MESAtRf; - else - here->MESAtGf = 0; - } - } - return(OK); -} diff --git a/src/spicelib/devices/mesa/mesatrunc.c b/src/spicelib/devices/mesa/mesatrunc.c deleted file mode 100644 index 300aa3f6c..000000000 --- a/src/spicelib/devices/mesa/mesatrunc.c +++ /dev/null @@ -1,28 +0,0 @@ -/********** -Copyright 1993: T. Ytterdal, K. Lee, M. Shur and T. A. Fjeldly. All rights reserved. -Author: Trond Ytterdal -**********/ - -#include "ngspice/ngspice.h" -#include "ngspice/cktdefs.h" -#include "mesadefs.h" -#include "ngspice/sperror.h" -#include "ngspice/suffix.h" - - -int -MESAtrunc(GENmodel *inModel, CKTcircuit *ckt, double *timeStep) -{ - MESAmodel *model = (MESAmodel*)inModel; - MESAinstance *here; - - for( ; model != NULL; model = MESAnextModel(model)) { - for(here=MESAinstances(model);here!=NULL; - here = MESAnextInstance(here)){ - - CKTterr(here->MESAqgs,ckt,timeStep); - CKTterr(here->MESAqgd,ckt,timeStep); - } - } - return(OK); -} diff --git a/src/spicelib/devices/mos2/Makefile.am b/src/spicelib/devices/mos2/Makefile.am deleted file mode 100644 index 398c06be8..000000000 --- a/src/spicelib/devices/mos2/Makefile.am +++ /dev/null @@ -1,37 +0,0 @@ -## Process this file with automake to produce Makefile.in - -noinst_LTLIBRARIES = libmos2.la - -libmos2_la_SOURCES = \ - mos2.c \ - mos2acld.c \ - mos2ask.c \ - mos2conv.c \ - mos2defs.h \ - mos2del.c \ - mos2dist.c \ - mos2dset.c \ - mos2ext.h \ - mos2ic.c \ - mos2init.c \ - mos2init.h \ - mos2itf.h \ - mos2load.c \ - mos2mask.c \ - mos2mpar.c \ - mos2noi.c \ - mos2par.c \ - mos2pzld.c \ - mos2sacl.c \ - mos2set.c \ - mos2sld.c \ - mos2sprt.c \ - mos2sset.c \ - mos2supd.c \ - mos2temp.c \ - mos2trun.c - - -AM_CPPFLAGS = @AM_CPPFLAGS@ -I$(top_srcdir)/src/include -AM_CFLAGS = $(STATIC) -MAINTAINERCLEANFILES = Makefile.in diff --git a/src/spicelib/devices/mos2/mos2.c b/src/spicelib/devices/mos2/mos2.c deleted file mode 100644 index d36a08147..000000000 --- a/src/spicelib/devices/mos2/mos2.c +++ /dev/null @@ -1,173 +0,0 @@ -/********** -Copyright 1990 Regents of the University of California. All rights reserved. -Author: 1985 Thomas L. Quarles -Modified: 2000 AlansFIxes -**********/ - -#include "ngspice/ngspice.h" -#include "ngspice/devdefs.h" -#include "ngspice/ifsim.h" -#include "mos2defs.h" -#include "ngspice/suffix.h" - -IFparm MOS2pTable[] = { /* parameters */ - IOPU("m", MOS2_M, IF_REAL , "Multiplier"), - IOPU("l", MOS2_L, IF_REAL , "Length"), - IOPU("w", MOS2_W, IF_REAL , "Width"), - IOPU("ad", MOS2_AD, IF_REAL , "Drain area"), - IOPU("as", MOS2_AS, IF_REAL , "Source area"), - IOPU("pd", MOS2_PD, IF_REAL , "Drain perimeter"), - IOPU("ps", MOS2_PS, IF_REAL , "Source perimeter"), - OP( "id", MOS2_CD, IF_REAL,"Drain current"), - OPR( "cd", MOS2_CD, IF_REAL,""), - OP( "ibd", MOS2_CBD, IF_REAL, "B-D junction current"), - OP( "ibs", MOS2_CBS, IF_REAL, "B-S junction current"), - OP( "is", MOS2_CS, IF_REAL, "Source current "), - OP( "ig", MOS2_CG, IF_REAL, "Gate current "), - OP( "ib", MOS2_CB, IF_REAL, "Bulk current "), - OP( "vgs", MOS2_VGS, IF_REAL, "Gate-Source voltage"), - OP( "vds", MOS2_VDS, IF_REAL, "Drain-Source voltage"), - OP( "vbs", MOS2_VBS, IF_REAL, "Bulk-Source voltage"), - OPU( "vbd", MOS2_VBD, IF_REAL, "Bulk-Drain voltage"), - IOPU("nrd", MOS2_NRD, IF_REAL , "Drain squares"), - IOPU("nrs", MOS2_NRS, IF_REAL , "Source squares"), - IP("off", MOS2_OFF, IF_FLAG , "Device initially off"), - IOPAU("icvds", MOS2_IC_VDS,IF_REAL , "Initial D-S voltage"), - IOPAU("icvgs", MOS2_IC_VGS,IF_REAL , "Initial G-S voltage"), - IOPAU("icvbs", MOS2_IC_VBS,IF_REAL , "Initial B-S voltage"), - IOPU("temp", MOS2_TEMP, IF_REAL ,"Instance operating temperature"), - IOPU("dtemp", MOS2_DTEMP, IF_REAL , "Instance temperature difference"), - IP( "ic", MOS2_IC, IF_REALVEC, "Vector of D-S, G-S, B-S voltages"), - IP( "sens_l", MOS2_L_SENS,IF_FLAG, "flag to request sensitivity WRT length"), - IP( "sens_w", MOS2_W_SENS,IF_FLAG, "flag to request sensitivity WRT width"), - /* - OP( "cgs", MOS2_CGS, IF_REAL , "Gate-Source capacitance"), - OP( "cgd", MOS2_CGD, IF_REAL , "Gate-Drain capacitance"), - */ - OPU( "dnode", MOS2_DNODE, IF_INTEGER, "Number of drain node"), - OPU( "gnode", MOS2_GNODE, IF_INTEGER, "Number of gate node"), - OPU( "snode", MOS2_SNODE, IF_INTEGER, "Number of source node"), - OPU( "bnode", MOS2_BNODE, IF_INTEGER, "Number of bulk node"), - OPU( "dnodeprime", MOS2_DNODEPRIME, IF_INTEGER, - "Number of internal drain node"), - OPU( "snodeprime", MOS2_SNODEPRIME, IF_INTEGER, - "Number of internal source node"), - OP( "von", MOS2_VON, IF_REAL, " "), - OP( "vdsat", MOS2_VDSAT, IF_REAL,"Saturation drain voltage"), - OPU( "sourcevcrit", MOS2_SOURCEVCRIT, IF_REAL,"Critical source voltage"), - OPU( "drainvcrit", MOS2_DRAINVCRIT, IF_REAL,"Critical drain voltage"), - OP( "rs", MOS2_SOURCERESIST, IF_REAL, "Source resistance"), - OPU( "sourceconductance", MOS2_SOURCECONDUCT, IF_REAL, "Source conductance"), - OP( "rd", MOS2_DRAINRESIST, IF_REAL, "Drain resistance"), - OPU( "drainconductance", MOS2_DRAINCONDUCT, IF_REAL, "Drain conductance"), - OP( "gm", MOS2_GM, IF_REAL, "Transconductance"), - OP( "gds", MOS2_GDS, IF_REAL, "Drain-Source conductance"), - OP( "gmb", MOS2_GMBS, IF_REAL, "Bulk-Source transconductance"), - OPR( "gmbs", MOS2_GMBS, IF_REAL, ""), - OPU( "gbd", MOS2_GBD, IF_REAL, "Bulk-Drain conductance"), - OPU( "gbs", MOS2_GBS, IF_REAL, "Bulk-Source conductance"), - OP( "cbd", MOS2_CAPBD, IF_REAL, "Bulk-Drain capacitance"), - OP( "cbs", MOS2_CAPBS, IF_REAL, "Bulk-Source capacitance"), - OP( "cgs", MOS2_CAPGS, IF_REAL, "Gate-Source capacitance"), - OP( "cgd", MOS2_CAPGD, IF_REAL, "Gate-Drain capacitance"), - OP( "cgb", MOS2_CAPGB, IF_REAL, "Gate-Bulk capacitance"), - - OPU( "cbd0", MOS2_CAPZEROBIASBD, IF_REAL,"Zero-Bias B-D junction capacitance"), - OPU( "cbdsw0",MOS2_CAPZEROBIASBDSW,IF_REAL, " "), - OPU( "cbs0", MOS2_CAPZEROBIASBS, IF_REAL,"Zero-Bias B-S junction capacitance"), - OPU( "cbssw0", MOS2_CAPZEROBIASBSSW,IF_REAL," "), - OPU("cqgs",MOS2_CQGS,IF_REAL,"Capacitance due to gate-source charge storage"), - OPU("cqgd",MOS2_CQGD,IF_REAL,"Capacitance due to gate-drain charge storage"), - OPU("cqgb",MOS2_CQGB,IF_REAL,"Capacitance due to gate-bulk charge storage"), - OPU("cqbd",MOS2_CQBD,IF_REAL,"Capacitance due to bulk-drain charge storage"), - OPU("cqbs",MOS2_CQBS,IF_REAL,"Capacitance due to bulk-source charge storage"), - OPU( "qgs", MOS2_QGS, IF_REAL, "Gate-Source charge storage"), - OPU( "qgd", MOS2_QGD, IF_REAL, "Gate-Drain charge storage"), - OPU( "qgb", MOS2_QGB, IF_REAL, "Gate-Bulk charge storage"), - OPU( "qbd", MOS2_QBD, IF_REAL, "Bulk-Drain charge storage"), - OPU( "qbs", MOS2_QBS, IF_REAL, "Bulk-Source charge storage"), - - OPU( "p", MOS2_POWER, IF_REAL, "Instantaneous power "), - OPU( "sens_l_dc", MOS2_L_SENS_DC, IF_REAL, - "dc sensitivity wrt length"), - OPU( "sens_l_real", MOS2_L_SENS_REAL, IF_REAL, - "real part of ac sensitivity wrt length"), - OPU( "sens_l_imag", MOS2_L_SENS_IMAG, IF_REAL, - "imag part of ac sensitivity wrt length"), - OPU( "sens_l_cplx", MOS2_L_SENS_CPLX, IF_COMPLEX, - "ac sensitivity wrt length"), - OPU( "sens_l_mag", MOS2_L_SENS_MAG, IF_REAL, - "sensitivity wrt l of ac magnitude"), - OPU( "sens_l_ph", MOS2_L_SENS_PH, IF_REAL, - "sensitivity wrt l of ac phase"), - OPU( "sens_w_dc", MOS2_W_SENS_DC, IF_REAL, - "dc sensitivity wrt width"), - OPU( "sens_w_real", MOS2_W_SENS_REAL, IF_REAL, - "dc sensitivity and real part of ac sensitivity wrt width"), - OPU( "sens_w_imag", MOS2_W_SENS_IMAG, IF_REAL, - "imag part of ac sensitivity wrt width"), - OPU( "sens_w_mag", MOS2_W_SENS_MAG, IF_REAL, - "sensitivity wrt w of ac magnitude"), - OPU( "sens_w_ph", MOS2_W_SENS_PH, IF_REAL, - "sensitivity wrt w of ac phase"), - OPU( "sens_w_cplx", MOS2_W_SENS_CPLX, IF_COMPLEX, - "ac sensitivity wrt width") -}; - -IFparm MOS2mPTable[] = { /* model parameters */ - OP("type", MOS2_MOD_TYPE, IF_STRING ,"N-channel or P-channel MOS"), - IOP("vto", MOS2_MOD_VTO, IF_REAL ,"Threshold voltage"), - IOPR("vt0", MOS2_MOD_VTO, IF_REAL ,"Threshold voltage"), - IOP("kp", MOS2_MOD_KP, IF_REAL ,"Transconductance parameter"), - IOP("gamma", MOS2_MOD_GAMMA, IF_REAL ,"Bulk threshold parameter"), - IOP("phi", MOS2_MOD_PHI, IF_REAL ,"Surface potential"), - IOP("lambda",MOS2_MOD_LAMBDA,IF_REAL ,"Channel length modulation"), - IOP("rd", MOS2_MOD_RD, IF_REAL ,"Drain ohmic resistance"), - IOP("rs", MOS2_MOD_RS, IF_REAL ,"Source ohmic resistance"), - IOP("cbd", MOS2_MOD_CBD, IF_REAL ,"B-D junction capacitance"), - IOP("cbs", MOS2_MOD_CBS, IF_REAL ,"B-S junction capacitance"), - IOP("is", MOS2_MOD_IS, IF_REAL ,"Bulk junction sat. current"), - IOP("pb", MOS2_MOD_PB, IF_REAL ,"Bulk junction potential"), - IOPA("cgso", MOS2_MOD_CGSO, IF_REAL ,"Gate-source overlap cap."), - IOPA("cgdo", MOS2_MOD_CGDO, IF_REAL ,"Gate-drain overlap cap."), - IOPA("cgbo", MOS2_MOD_CGBO, IF_REAL ,"Gate-bulk overlap cap."), - IOP("rsh", MOS2_MOD_RSH, IF_REAL ,"Sheet resistance"), - IOPA("cj", MOS2_MOD_CJ, IF_REAL ,"Bottom junction cap per area"), - IOP("mj", MOS2_MOD_MJ, IF_REAL ,"Bottom grading coefficient"), - IOPA("cjsw", MOS2_MOD_CJSW, IF_REAL ,"Side junction cap per area"), - IOP("mjsw", MOS2_MOD_MJSW, IF_REAL ,"Side grading coefficient"), - IOP("js", MOS2_MOD_JS, IF_REAL ,"Bulk jct. sat. current density"), - IOP("tox", MOS2_MOD_TOX, IF_REAL ,"Oxide thickness"), - IOP("ld", MOS2_MOD_LD, IF_REAL ,"Lateral diffusion"), - IOP("u0", MOS2_MOD_U0, IF_REAL ,"Surface mobility"), - IOPR("uo", MOS2_MOD_U0, IF_REAL ,"Surface mobility"), - IOP("fc", MOS2_MOD_FC, IF_REAL ,"Forward bias jct. fit parm."), - IP("nmos", MOS2_MOD_NMOS, IF_FLAG ,"N type MOSfet model"), - IP("pmos", MOS2_MOD_PMOS, IF_FLAG ,"P type MOSfet model"), - IOP("nsub", MOS2_MOD_NSUB, IF_REAL ,"Substrate doping"), - IOP("tpg", MOS2_MOD_TPG, IF_INTEGER,"Gate type"), - IOP("nss", MOS2_MOD_NSS, IF_REAL ,"Surface state density"), - IOP("delta", MOS2_MOD_DELTA, IF_REAL ,"Width effect on threshold"), - IOP("uexp", MOS2_MOD_UEXP, IF_REAL ,"Crit. field exp for mob. deg."), - IOP("ucrit", MOS2_MOD_UCRIT, IF_REAL ,"Crit. field for mob. degradation"), - IOP("vmax", MOS2_MOD_VMAX, IF_REAL ,"Maximum carrier drift velocity"), - IOP("xj", MOS2_MOD_XJ, IF_REAL ,"Junction depth"), - IOP("neff", MOS2_MOD_NEFF, IF_REAL ,"Total channel charge coeff."), - IOP("nfs", MOS2_MOD_NFS, IF_REAL ,"Fast surface state density"), - IOPU("tnom", MOS2_MOD_TNOM, IF_REAL ,"Parameter measurement temperature"), - IOP("kf", MOS2_MOD_KF, IF_REAL ,"Flicker noise coefficient"), - IOP("af", MOS2_MOD_AF, IF_REAL ,"Flicker noise exponent") -}; - -char *MOS2names[] = { - "Drain", - "Gate", - "Source", - "Bulk" -}; - -int MOS2nSize = NUMELEMS(MOS2names); -int MOS2pTSize = NUMELEMS(MOS2pTable); -int MOS2mPTSize = NUMELEMS(MOS2mPTable); -int MOS2iSize = sizeof(MOS2instance); -int MOS2mSize = sizeof(MOS2model); diff --git a/src/spicelib/devices/mos2/mos2acld.c b/src/spicelib/devices/mos2/mos2acld.c deleted file mode 100644 index 7e4fea7b5..000000000 --- a/src/spicelib/devices/mos2/mos2acld.c +++ /dev/null @@ -1,116 +0,0 @@ -/********** -Copyright 1990 Regents of the University of California. All rights reserved. -Author: 1985 Thomas L. Quarles -Modified: 2000 AlansFixes -**********/ -/* - */ - -#include "ngspice/ngspice.h" -#include "ngspice/cktdefs.h" -#include "mos2defs.h" -#include "ngspice/sperror.h" -#include "ngspice/suffix.h" - - -int -MOS2acLoad(GENmodel *inModel, CKTcircuit *ckt) -{ - MOS2model *model = (MOS2model *)inModel; - MOS2instance *here; - int xnrm; - int xrev; - double xgs; - double xgd; - double xgb; - double xbd; - double xbs; - double capgs; - double capgd; - double capgb; - double GateBulkOverlapCap; - double GateDrainOverlapCap; - double GateSourceOverlapCap; - double EffectiveLength; - - for( ; model != NULL; model = MOS2nextModel(model)) { - for(here = MOS2instances(model); here!= NULL; - here = MOS2nextInstance(here)) { - - if (here->MOS2mode < 0) { - xnrm=0; - xrev=1; - } else { - xnrm=1; - xrev=0; - } - /* - * meyer's model parameters - */ - EffectiveLength=here->MOS2l - 2*model->MOS2latDiff; - GateSourceOverlapCap = model->MOS2gateSourceOverlapCapFactor * - here->MOS2m * here->MOS2w; - GateDrainOverlapCap = model->MOS2gateDrainOverlapCapFactor * - here->MOS2m * here->MOS2w; - GateBulkOverlapCap = model->MOS2gateBulkOverlapCapFactor * - here->MOS2m * EffectiveLength; - capgs = ( *(ckt->CKTstate0+here->MOS2capgs)+ - *(ckt->CKTstate0+here->MOS2capgs) + - GateSourceOverlapCap ); - capgd = ( *(ckt->CKTstate0+here->MOS2capgd)+ - *(ckt->CKTstate0+here->MOS2capgd) + - GateDrainOverlapCap ); - capgb = ( *(ckt->CKTstate0+here->MOS2capgb)+ - *(ckt->CKTstate0+here->MOS2capgb) + - GateBulkOverlapCap ); - xgs = capgs * ckt->CKTomega; - xgd = capgd * ckt->CKTomega; - xgb = capgb * ckt->CKTomega; - xbd = here->MOS2capbd * ckt->CKTomega; - xbs = here->MOS2capbs * ckt->CKTomega; - /* - * load matrix - */ - - *(here->MOS2GgPtr +1) += xgd+xgs+xgb; - *(here->MOS2BbPtr +1) += xgb+xbd+xbs; - *(here->MOS2DPdpPtr +1) += xgd+xbd; - *(here->MOS2SPspPtr +1) += xgs+xbs; - *(here->MOS2GbPtr +1) -= xgb; - *(here->MOS2GdpPtr +1) -= xgd; - *(here->MOS2GspPtr +1) -= xgs; - *(here->MOS2BgPtr +1) -= xgb; - *(here->MOS2BdpPtr +1) -= xbd; - *(here->MOS2BspPtr +1) -= xbs; - *(here->MOS2DPgPtr +1) -= xgd; - *(here->MOS2DPbPtr +1) -= xbd; - *(here->MOS2SPgPtr +1) -= xgs; - *(here->MOS2SPbPtr +1) -= xbs; - *(here->MOS2DdPtr) += here->MOS2drainConductance; - *(here->MOS2SsPtr) += here->MOS2sourceConductance; - *(here->MOS2BbPtr) += here->MOS2gbd+here->MOS2gbs; - *(here->MOS2DPdpPtr) += here->MOS2drainConductance+ - here->MOS2gds+here->MOS2gbd+ - xrev*(here->MOS2gm+here->MOS2gmbs); - *(here->MOS2SPspPtr) += here->MOS2sourceConductance+ - here->MOS2gds+here->MOS2gbs+ - xnrm*(here->MOS2gm+here->MOS2gmbs); - *(here->MOS2DdpPtr) -= here->MOS2drainConductance; - *(here->MOS2SspPtr) -= here->MOS2sourceConductance; - *(here->MOS2BdpPtr) -= here->MOS2gbd; - *(here->MOS2BspPtr) -= here->MOS2gbs; - *(here->MOS2DPdPtr) -= here->MOS2drainConductance; - *(here->MOS2DPgPtr) += (xnrm-xrev)*here->MOS2gm; - *(here->MOS2DPbPtr) += -here->MOS2gbd+(xnrm-xrev)*here->MOS2gmbs; - *(here->MOS2DPspPtr) -= here->MOS2gds+ - xnrm*(here->MOS2gm+here->MOS2gmbs); - *(here->MOS2SPgPtr) -= (xnrm-xrev)*here->MOS2gm; - *(here->MOS2SPsPtr) -= here->MOS2sourceConductance; - *(here->MOS2SPbPtr) -= here->MOS2gbs+(xnrm-xrev)*here->MOS2gmbs; - *(here->MOS2SPdpPtr) -= here->MOS2gds+ - xrev*(here->MOS2gm+here->MOS2gmbs); - - } - } - return(OK); -} diff --git a/src/spicelib/devices/mos2/mos2ask.c b/src/spicelib/devices/mos2/mos2ask.c deleted file mode 100644 index 19243a040..000000000 --- a/src/spicelib/devices/mos2/mos2ask.c +++ /dev/null @@ -1,437 +0,0 @@ -/********** -Copyright 1990 Regents of the University of California. All rights reserved. -Author: 1987 Mathew Lew and Thomas L. Quarles -Modified: 2000 AlansFixes -**********/ - -#include "ngspice/ngspice.h" -#include "ngspice/const.h" -#include "ngspice/ifsim.h" -#include "ngspice/cktdefs.h" -#include "ngspice/devdefs.h" -#include "mos2defs.h" -#include "ngspice/sperror.h" -#include "ngspice/suffix.h" - -/*ARGSUSED*/ -int -MOS2ask(CKTcircuit *ckt, GENinstance *inst, int which, IFvalue *value, - IFvalue *select) -{ - MOS2instance *here = (MOS2instance *)inst; - double vr; - double vi; - double sr; - double si; - double vm; - static char *msg = "Current and power not available for ac analysis"; - switch(which) { - case MOS2_TEMP: - value->rValue = here->MOS2temp-CONSTCtoK; - return(OK); - case MOS2_DTEMP: - value->rValue = here->MOS2dtemp; - return(OK); - case MOS2_CGS: - value->rValue = 2* *(ckt->CKTstate0 + here->MOS2capgs); - return(OK); - case MOS2_CGD: - value->rValue = 2* *(ckt->CKTstate0 + here->MOS2capgd); - return(OK); - case MOS2_M: - value->rValue = here->MOS2m; - return(OK); - case MOS2_L: - value->rValue = here->MOS2l; - return(OK); - case MOS2_W: - value->rValue = here->MOS2w; - return(OK); - case MOS2_AS: - value->rValue = here->MOS2sourceArea; - return(OK); - case MOS2_AD: - value->rValue = here->MOS2drainArea; - return(OK); - case MOS2_PS: - value->rValue = here->MOS2sourcePerimiter; - return(OK); - case MOS2_PD: - value->rValue = here->MOS2drainPerimiter; - return(OK); - case MOS2_NRS: - value->rValue = here->MOS2sourceSquares; - return(OK); - case MOS2_NRD: - value->rValue = here->MOS2drainSquares; - return(OK); - case MOS2_OFF: - value->rValue = here->MOS2off; - return(OK); - case MOS2_IC_VBS: - value->rValue = here->MOS2icVBS; - return(OK); - case MOS2_IC_VDS: - value->rValue = here->MOS2icVDS; - return(OK); - case MOS2_IC_VGS: - value->rValue = here->MOS2icVGS; - return(OK); - case MOS2_DNODE: - value->iValue = here->MOS2dNode; - return(OK); - case MOS2_GNODE: - value->iValue = here->MOS2gNode; - return(OK); - case MOS2_SNODE: - value->iValue = here->MOS2sNode; - return(OK); - case MOS2_BNODE: - value->iValue = here->MOS2bNode; - return(OK); - case MOS2_DNODEPRIME: - value->iValue = here->MOS2dNodePrime; - return(OK); - case MOS2_SNODEPRIME: - value->iValue = here->MOS2sNodePrime; - return(OK); - case MOS2_SOURCECONDUCT: - value->rValue = here->MOS2sourceConductance; - return(OK); - case MOS2_DRAINCONDUCT: - value->rValue = here->MOS2drainConductance; - return(OK); - case MOS2_SOURCERESIST: - if (here->MOS2sNodePrime != here->MOS2sNode) - value->rValue = 1.0 / here->MOS2sourceConductance; - else - value->rValue = 0.0; - return(OK); - case MOS2_DRAINRESIST: - if (here->MOS2dNodePrime != here->MOS2dNode) - value->rValue = 1.0 / here->MOS2drainConductance; - else - value->rValue = 0.0; - return(OK); - case MOS2_VON: - value->rValue = here->MOS2von; - return(OK); - case MOS2_VDSAT: - value->rValue = here->MOS2vdsat; - return(OK); - case MOS2_SOURCEVCRIT: - value->rValue = here->MOS2sourceVcrit; - return(OK); - case MOS2_DRAINVCRIT: - value->rValue = here->MOS2drainVcrit; - return(OK); - case MOS2_CD: - value->rValue = here->MOS2cd; - return(OK); - case MOS2_CBS: - value->rValue = here->MOS2cbs; - return(OK); - case MOS2_CBD: - value->rValue = here->MOS2cbd; - return(OK); - case MOS2_GMBS: - value->rValue = here->MOS2gmbs; - return(OK); - case MOS2_GM: - value->rValue = here->MOS2gm; - return(OK); - case MOS2_GDS: - value->rValue = here->MOS2gds; - return(OK); - case MOS2_GBD: - value->rValue = here->MOS2gbd; - return(OK); - case MOS2_GBS: - value->rValue = here->MOS2gbs; - return(OK); - case MOS2_CAPBD: - value->rValue = here->MOS2capbd; - return(OK); - case MOS2_CAPBS: - value->rValue = here->MOS2capbs; - return(OK); - case MOS2_CAPZEROBIASBD: - value->rValue = here->MOS2Cbd; - return(OK); - case MOS2_CAPZEROBIASBDSW: - value->rValue = here->MOS2Cbdsw; - return(OK); - case MOS2_CAPZEROBIASBS: - value->rValue = here->MOS2Cbs; - return(OK); - case MOS2_CAPZEROBIASBSSW: - value->rValue = here->MOS2Cbssw; - return(OK); - case MOS2_VBD: - value->rValue = *(ckt->CKTstate0 + here->MOS2vbd); - return(OK); - case MOS2_VBS: - value->rValue = *(ckt->CKTstate0 + here->MOS2vbs); - return(OK); - case MOS2_VGS: - value->rValue = *(ckt->CKTstate0 + here->MOS2vgs); - return(OK); - case MOS2_VDS: - value->rValue = *(ckt->CKTstate0 + here->MOS2vds); - return(OK); - case MOS2_CAPGS: - value->rValue = 2* *(ckt->CKTstate0 + here->MOS2capgs); -/* add overlap capacitance */ - value->rValue += (MOS2modPtr(here)->MOS2gateSourceOverlapCapFactor) - * here->MOS2m - * (here->MOS2w); - return(OK); - case MOS2_QGS: - value->rValue = *(ckt->CKTstate0 + here->MOS2qgs); - return(OK); - case MOS2_CQGS: - value->rValue = *(ckt->CKTstate0 + here->MOS2cqgs); - return(OK); - case MOS2_CAPGD: - value->rValue = 2* *(ckt->CKTstate0 + here->MOS2capgd); -/* add overlap capacitance */ - value->rValue += (MOS2modPtr(here)->MOS2gateDrainOverlapCapFactor) - * here->MOS2m - * (here->MOS2w); - return(OK); - case MOS2_QGD: - value->rValue = *(ckt->CKTstate0 + here->MOS2qgd); - return(OK); - case MOS2_CQGD: - value->rValue = *(ckt->CKTstate0 + here->MOS2cqgd); - return(OK); - case MOS2_CAPGB: - value->rValue = 2* *(ckt->CKTstate0 + here->MOS2capgb); -/* add overlap capacitance */ - value->rValue += (MOS2modPtr(here)->MOS2gateBulkOverlapCapFactor) - * here->MOS2m - * (here->MOS2l - -2*(MOS2modPtr(here)->MOS2latDiff)); - return(OK); - case MOS2_QGB: - value->rValue = *(ckt->CKTstate0 + here->MOS2qgb); - return(OK); - case MOS2_CQGB: - value->rValue = *(ckt->CKTstate0 + here->MOS2cqgb); - return(OK); - case MOS2_QBD: - value->rValue = *(ckt->CKTstate0 + here->MOS2qbd); - return(OK); - case MOS2_CQBD: - value->rValue = *(ckt->CKTstate0 + here->MOS2cqbd); - return(OK); - case MOS2_QBS: - value->rValue = *(ckt->CKTstate0 + here->MOS2qbs); - return(OK); - case MOS2_CQBS: - value->rValue = *(ckt->CKTstate0 + here->MOS2cqbs); - return(OK); - case MOS2_L_SENS_DC: - if(ckt->CKTsenInfo){ - value->rValue = *(ckt->CKTsenInfo->SEN_Sap[select->iValue + 1]+ - here->MOS2senParmNo); - } - return(OK); - case MOS2_L_SENS_REAL: - if(ckt->CKTsenInfo){ - value->rValue = *(ckt->CKTsenInfo->SEN_RHS[select->iValue + 1]+ - here->MOS2senParmNo); - } - return(OK); - case MOS2_L_SENS_IMAG: - if(ckt->CKTsenInfo){ - value->rValue = *(ckt->CKTsenInfo->SEN_iRHS[select->iValue + 1]+ - here->MOS2senParmNo); - } - return(OK); - case MOS2_L_SENS_MAG: - if(ckt->CKTsenInfo){ - vr = *(ckt->CKTrhsOld + select->iValue + 1); - vi = *(ckt->CKTirhsOld + select->iValue + 1); - vm = sqrt(vr*vr + vi*vi); - if(vm == 0){ - value->rValue = 0; - return(OK); - } - sr = *(ckt->CKTsenInfo->SEN_RHS[select->iValue + 1]+ - here->MOS2senParmNo); - si = *(ckt->CKTsenInfo->SEN_iRHS[select->iValue + 1]+ - here->MOS2senParmNo); - value->rValue = (vr * sr + vi * si)/vm; - } - return(OK); - case MOS2_L_SENS_PH: - if(ckt->CKTsenInfo){ - vr = *(ckt->CKTrhsOld + select->iValue + 1); - vi = *(ckt->CKTirhsOld + select->iValue + 1); - vm = vr*vr + vi*vi; - if(vm == 0){ - value->rValue = 0; - return(OK); - } - sr = *(ckt->CKTsenInfo->SEN_RHS[select->iValue + 1]+ - here->MOS2senParmNo); - si = *(ckt->CKTsenInfo->SEN_iRHS[select->iValue + 1]+ - here->MOS2senParmNo); - value->rValue = (vr * si - vi * sr)/vm; - } - return(OK); - case MOS2_L_SENS_CPLX: - if(ckt->CKTsenInfo){ - value->cValue.real= - *(ckt->CKTsenInfo->SEN_RHS[select->iValue + 1]+ - here->MOS2senParmNo); - value->cValue.imag= - *(ckt->CKTsenInfo->SEN_iRHS[select->iValue + 1]+ - here->MOS2senParmNo); - } - return(OK); - case MOS2_W_SENS_DC: - if(ckt->CKTsenInfo){ - value->rValue = *(ckt->CKTsenInfo->SEN_Sap[select->iValue + 1]+ - here->MOS2senParmNo + here->MOS2sens_l); - } - return(OK); - case MOS2_W_SENS_REAL: - if(ckt->CKTsenInfo){ - value->rValue = *(ckt->CKTsenInfo->SEN_RHS[select->iValue + 1]+ - here->MOS2senParmNo + here->MOS2sens_l); - } - return(OK); - case MOS2_W_SENS_IMAG: - if(ckt->CKTsenInfo){ - value->rValue = *(ckt->CKTsenInfo->SEN_iRHS[select->iValue + 1]+ - here->MOS2senParmNo + here->MOS2sens_l); - } - return(OK); - case MOS2_W_SENS_MAG: - if(ckt->CKTsenInfo){ - vr = *(ckt->CKTrhsOld + select->iValue + 1); - vi = *(ckt->CKTirhsOld + select->iValue + 1); - vm = sqrt(vr*vr + vi*vi); - if(vm == 0){ - value->rValue = 0; - return(OK); - } - sr = *(ckt->CKTsenInfo->SEN_RHS[select->iValue + 1]+ - here->MOS2senParmNo + here->MOS2sens_l); - si = *(ckt->CKTsenInfo->SEN_iRHS[select->iValue + 1]+ - here->MOS2senParmNo + here->MOS2sens_l); - value->rValue = (vr * sr + vi * si)/vm; - } - return(OK); - case MOS2_W_SENS_PH: - if(ckt->CKTsenInfo){ - vr = *(ckt->CKTrhsOld + select->iValue + 1); - vi = *(ckt->CKTirhsOld + select->iValue + 1); - vm = vr*vr + vi*vi; - if(vm == 0){ - value->rValue = 0; - return(OK); - } - sr = *(ckt->CKTsenInfo->SEN_RHS[select->iValue + 1]+ - here->MOS2senParmNo + here->MOS2sens_l); - si = *(ckt->CKTsenInfo->SEN_iRHS[select->iValue + 1]+ - here->MOS2senParmNo + here->MOS2sens_l); - value->rValue = (vr * si - vi * sr)/vm; - } - return(OK); - case MOS2_W_SENS_CPLX: - if(ckt->CKTsenInfo){ - value->cValue.real= - *(ckt->CKTsenInfo->SEN_RHS[select->iValue + 1]+ - here->MOS2senParmNo + here->MOS2sens_l); - value->cValue.imag= - *(ckt->CKTsenInfo->SEN_iRHS[select->iValue + 1]+ - here->MOS2senParmNo + here->MOS2sens_l); - } - return(OK); - case MOS2_CB : - if (ckt->CKTcurrentAnalysis & DOING_AC) { - errMsg = TMALLOC(char, strlen(msg) + 1); - errRtn = "MOS2ask.c"; - strcpy(errMsg,msg); - return(E_ASKCURRENT); - } else { - value->rValue = here->MOS2cbd + here->MOS2cbs - *(ckt->CKTstate0 - + here->MOS2cqgb); - } - return(OK); - case MOS2_CG : - if (ckt->CKTcurrentAnalysis & DOING_AC) { - errMsg = TMALLOC(char, strlen(msg) + 1); - errRtn = "MOS2ask.c"; - strcpy(errMsg,msg); - return(E_ASKCURRENT); - } else if (ckt->CKTcurrentAnalysis & (DOING_DCOP | DOING_TRCV)) { - value->rValue = 0; - } else if ((ckt->CKTcurrentAnalysis & DOING_TRAN) && - (ckt->CKTmode & MODETRANOP)) { - value->rValue = 0; - } else { - value->rValue = *(ckt->CKTstate0 + here->MOS2cqgb) + - *(ckt->CKTstate0 + here->MOS2cqgd) + *(ckt->CKTstate0 + - here->MOS2cqgs); - } - return(OK); - case MOS2_CS : - if (ckt->CKTcurrentAnalysis & DOING_AC) { - errMsg = TMALLOC(char, strlen(msg) + 1); - errRtn = "MOS2ask.c"; - strcpy(errMsg,msg); - return(E_ASKCURRENT); - } else { - value->rValue = -here->MOS2cd; - value->rValue -= here->MOS2cbd + here->MOS2cbs - - *(ckt->CKTstate0 + here->MOS2cqgb); - if ((ckt->CKTcurrentAnalysis & DOING_TRAN) && - !(ckt->CKTmode & MODETRANOP)) { - value->rValue -= *(ckt->CKTstate0 + here->MOS2cqgb) + - *(ckt->CKTstate0 + here->MOS2cqgd) + - *(ckt->CKTstate0 + here->MOS2cqgs); - } - } - return(OK); - case MOS2_POWER : - if (ckt->CKTcurrentAnalysis & DOING_AC) { - errMsg = TMALLOC(char, strlen(msg) + 1); - errRtn = "MOS2ask.c"; - strcpy(errMsg,msg); - return(E_ASKPOWER); - } else { - double temp; - - value->rValue = here->MOS2cd * - *(ckt->CKTrhsOld + here->MOS2dNode); - value->rValue += (here->MOS2cbd + here->MOS2cbs - - *(ckt->CKTstate0 + here->MOS2cqgb)) * - *(ckt->CKTrhsOld + here->MOS2bNode); - if ((ckt->CKTcurrentAnalysis & DOING_TRAN) && - !(ckt->CKTmode & MODETRANOP)) { - value->rValue += (*(ckt->CKTstate0 + here->MOS2cqgb) + - *(ckt->CKTstate0 + here->MOS2cqgd) + - *(ckt->CKTstate0 + here->MOS2cqgs)) * - *(ckt->CKTrhsOld + here->MOS2gNode); - } - temp = -here->MOS2cd; - temp -= here->MOS2cbd + here->MOS2cbs ; - if ((ckt->CKTcurrentAnalysis & DOING_TRAN) && - !(ckt->CKTmode & MODETRANOP)) { - temp -= *(ckt->CKTstate0 + here->MOS2cqgb) + - *(ckt->CKTstate0 + here->MOS2cqgd) + - *(ckt->CKTstate0 + here->MOS2cqgs); - } - value->rValue += temp * *(ckt->CKTrhsOld + here->MOS2sNode); - } - return(OK); - default: - return(E_BADPARM); - } - /* NOTREACHED */ -} - diff --git a/src/spicelib/devices/mos2/mos2conv.c b/src/spicelib/devices/mos2/mos2conv.c deleted file mode 100644 index 3d035447c..000000000 --- a/src/spicelib/devices/mos2/mos2conv.c +++ /dev/null @@ -1,99 +0,0 @@ -/********** -Copyright 1990 Regents of the University of California. All rights reserved. -Author: 1985 Thomas L. Quarles -**********/ - -#include "ngspice/ngspice.h" -#include "ngspice/cktdefs.h" -#include "mos2defs.h" -#include "ngspice/sperror.h" -#include "ngspice/suffix.h" - -int -MOS2convTest(GENmodel *inModel, CKTcircuit *ckt) -{ - MOS2model *model = (MOS2model *)inModel; - MOS2instance *here; - double delvbs; - double delvbd; - double delvgs; - double delvds; - double delvgd; - double cbhat; - double cdhat; - double vbs; - double vbd; - double vgs; - double vds; - double vgd; - double vgdo; - double tol; - - for( ; model != NULL; model = MOS2nextModel(model)) { - for(here = MOS2instances(model); here!= NULL; - here = MOS2nextInstance(here)) { - - vbs = model->MOS2type * ( - *(ckt->CKTrhs+here->MOS2bNode) - - *(ckt->CKTrhs+here->MOS2sNodePrime)); - vgs = model->MOS2type * ( - *(ckt->CKTrhs+here->MOS2gNode) - - *(ckt->CKTrhs+here->MOS2sNodePrime)); - vds = model->MOS2type * ( - *(ckt->CKTrhs+here->MOS2dNodePrime) - - *(ckt->CKTrhs+here->MOS2sNodePrime)); - vbd=vbs-vds; - vgd=vgs-vds; - vgdo = *(ckt->CKTstate0 + here->MOS2vgs) - - *(ckt->CKTstate0 + here->MOS2vds); - delvbs = vbs - *(ckt->CKTstate0 + here->MOS2vbs); - delvbd = vbd - *(ckt->CKTstate0 + here->MOS2vbd); - delvgs = vgs - *(ckt->CKTstate0 + here->MOS2vgs); - delvds = vds - *(ckt->CKTstate0 + here->MOS2vds); - delvgd = vgd-vgdo; - - /* these are needed for convergence testing */ - - if (here->MOS2mode >= 0) { - cdhat= - here->MOS2cd- - here->MOS2gbd * delvbd + - here->MOS2gmbs * delvbs + - here->MOS2gm * delvgs + - here->MOS2gds * delvds ; - } else { - cdhat= - here->MOS2cd - - ( here->MOS2gbd - - here->MOS2gmbs) * delvbd - - here->MOS2gm * delvgd + - here->MOS2gds * delvds ; - } - cbhat= - here->MOS2cbs + - here->MOS2cbd + - here->MOS2gbd * delvbd + - here->MOS2gbs * delvbs ; - /* - * check convergence - */ - tol=ckt->CKTreltol*MAX(fabs(cdhat),fabs(here->MOS2cd))+ - ckt->CKTabstol; - if (fabs(cdhat-here->MOS2cd) >= tol) { - ckt->CKTnoncon++; - ckt->CKTtroubleElt = (GENinstance *) here; - return(OK); /* no reason to continue, we haven't converged */ - } else { - tol=ckt->CKTreltol* - MAX(fabs(cbhat),fabs(here->MOS2cbs+here->MOS2cbd))+ - ckt->CKTabstol; - if (fabs(cbhat-(here->MOS2cbs+here->MOS2cbd)) > tol) { - ckt->CKTnoncon++; - ckt->CKTtroubleElt = (GENinstance *) here; - return(OK); /* no reason to continue, we haven't converged*/ - } - } - } - } - return(OK); -} diff --git a/src/spicelib/devices/mos2/mos2defs.h b/src/spicelib/devices/mos2/mos2defs.h deleted file mode 100644 index b937485fb..000000000 --- a/src/spicelib/devices/mos2/mos2defs.h +++ /dev/null @@ -1,562 +0,0 @@ -/********** -Copyright 1990 Regents of the University of California. All rights reserved. -Author: 1985 Thomas L. Quarles -Modified: 2000 AlansFIxes -**********/ - -#ifndef MOS2 -#define MOS2 - -#include "ngspice/ifsim.h" -#include "ngspice/cktdefs.h" -#include "ngspice/gendefs.h" -#include "ngspice/complex.h" -#include "ngspice/noisedef.h" - -/* declarations for level 2 MOSFETs */ - -/* indices to the array of MOSFET(2) noise sources */ - -enum { - MOS2RDNOIZ = 0, - MOS2RSNOIZ, - MOS2IDNOIZ, - MOS2FLNOIZ, - MOS2TOTNOIZ, - /* finally, the number of noise sources */ - MOS2NSRCS -}; - -/* information needed for each instance */ - -typedef struct sMOS2instance { - - struct GENinstance gen; - -#define MOS2modPtr(inst) ((struct sMOS2model *)((inst)->gen.GENmodPtr)) -#define MOS2nextInstance(inst) ((struct sMOS2instance *)((inst)->gen.GENnextInstance)) -#define MOS2name gen.GENname -#define MOS2states gen.GENstate - - const int MOS2dNode; /* number of the gate node of the mosfet */ - const int MOS2gNode; /* number of the gate node of the mosfet */ - const int MOS2sNode; /* number of the source node of the mosfet */ - const int MOS2bNode; /* number of the bulk node of the mosfet */ - int MOS2dNodePrime; /* number of the internal drain node of the mosfet */ - int MOS2sNodePrime; /* number of the internal source node of the mosfet */ - - - int MOS2mode; /* device mode : 1 = normal, -1 = inverse */ - - unsigned MOS2mGiven :1; - - unsigned MOS2off :1;/* non-zero to indicate device is off for dc analysis*/ - unsigned MOS2lGiven :1; - unsigned MOS2wGiven :1; - unsigned MOS2drainAreaGiven :1; - unsigned MOS2sourceAreaGiven :1; - unsigned MOS2drainSquaresGiven :1; - unsigned MOS2sourceSquaresGiven :1; - unsigned MOS2drainPerimiterGiven :1; - unsigned MOS2sourcePerimiterGiven :1; - unsigned MOS2dNodePrimeSet :1; - unsigned MOS2sNodePrimeSet :1; - unsigned MOS2icVBSGiven :1; - unsigned MOS2icVDSGiven :1; - unsigned MOS2icVGSGiven :1; - unsigned MOS2vonGiven :1; - unsigned MOS2vdsatGiven :1; - unsigned MOS2tempGiven :1; /* per-instance temperature specified? */ - unsigned MOS2dtempGiven :1; /* per-instance temperature difference specified? */ - unsigned MOS2sens_l :1; /* field which indicates whether - length of the mosfet is a design - parameter or not */ - unsigned MOS2sens_w :1; /* field which indicates whether - width of the mosfet is a design - parameter or not */ - unsigned MOS2senPertFlag :1; /* indictes whether the the parameter of - the particular instance is to be perturbed */ - - - double *MOS2DdPtr; /* pointer to sparse matrix element at - * (Drain node,drain node) */ - double *MOS2GgPtr; /* pointer to sparse matrix element at - * (gate node,gate node) */ - double *MOS2SsPtr; /* pointer to sparse matrix element at - * (source node,source node) */ - double *MOS2BbPtr; /* pointer to sparse matrix element at - * (bulk node,bulk node) */ - double *MOS2DPdpPtr; /* pointer to sparse matrix element at - * (drain prime node,drain prime node) */ - double *MOS2SPspPtr; /* pointer to sparse matrix element at - * (source prime node,source prime node) */ - double *MOS2DdpPtr; /* pointer to sparse matrix element at - * (drain node,drain prime node) */ - double *MOS2GbPtr; /* pointer to sparse matrix element at - * (gate node,bulk node) */ - double *MOS2GdpPtr; /* pointer to sparse matrix element at - * (gate node,drain prime node) */ - double *MOS2GspPtr; /* pointer to sparse matrix element at - * (gate node,source prime node) */ - double *MOS2SspPtr; /* pointer to sparse matrix element at - * (source node,source prime node) */ - double *MOS2BdpPtr; /* pointer to sparse matrix element at - * (bulk node,drain prime node) */ - double *MOS2BspPtr; /* pointer to sparse matrix element at - * (bulk node,source prime node) */ - double *MOS2DPspPtr; /* pointer to sparse matrix element at - * (drain prime node,source prime node) */ - double *MOS2DPdPtr; /* pointer to sparse matrix element at - * (drain prime node,drain node) */ - double *MOS2BgPtr; /* pointer to sparse matrix element at - * (bulk node,gate node) */ - double *MOS2DPgPtr; /* pointer to sparse matrix element at - * (drain prime node,gate node) */ - - double *MOS2SPgPtr; /* pointer to sparse matrix element at - * (source prime node,gate node) */ - double *MOS2SPsPtr; /* pointer to sparse matrix element at - * (source prime node,source node) */ - double *MOS2DPbPtr; /* pointer to sparse matrix element at - * (drain prime node,bulk node) */ - double *MOS2SPbPtr; /* pointer to sparse matrix element at - * (source prime node,bulk node) */ - double *MOS2SPdpPtr; /* pointer to sparse matrix element at - * (source prime node,drain prime node) */ - int MOS2senParmNo; /* parameter # for sensitivity use; - set equal to 0 if neither length - nor width of the mosfet is a design - parameter */ - double MOS2cgs; - double MOS2cgd; - double MOS2cgb; - double *MOS2sens; - -#define MOS2senCgs MOS2sens /* contains pertured values of cgs */ -#define MOS2senCgd MOS2sens + 6 /* contains perturbed values of cgd*/ -#define MOS2senCgb MOS2sens + 12 /* contains perturbed values of cgb*/ -#define MOS2senCbd MOS2sens + 18 /* contains perturbed values of cbd*/ -#define MOS2senCbs MOS2sens + 24 /* contains perturbed values of cbs*/ -#define MOS2senGds MOS2sens + 30 /* contains perturbed values of gds*/ -#define MOS2senGbs MOS2sens + 36 /* contains perturbed values of gbs*/ -#define MOS2senGbd MOS2sens + 42 /* contains perturbed values of gbd*/ -#define MOS2senGm MOS2sens + 48 /* contains perturbed values of gm*/ -#define MOS2senGmbs MOS2sens + 54 /* contains perturbed values of gmbs*/ -#define MOS2dphigs_dl MOS2sens + 60 -#define MOS2dphigd_dl MOS2sens + 61 -#define MOS2dphigb_dl MOS2sens + 62 -#define MOS2dphibs_dl MOS2sens + 63 -#define MOS2dphibd_dl MOS2sens + 64 -#define MOS2dphigs_dw MOS2sens + 65 -#define MOS2dphigd_dw MOS2sens + 66 -#define MOS2dphigb_dw MOS2sens + 67 -#define MOS2dphibs_dw MOS2sens + 68 -#define MOS2dphibd_dw MOS2sens + 69 - - double MOS2temp; /* temperature at which this instance operates */ - double MOS2dtemp; /* difference of instance temperature from circuit temperature */ - double MOS2tTransconductance; /* temperature corrected transconductance*/ - double MOS2tSurfMob; /* temperature corrected surface mobility */ - double MOS2tPhi; /* temperature corrected Phi */ - double MOS2tVto; /* temperature corrected Vto */ - double MOS2tSatCur; /* temperature corrected saturation Cur. */ - double MOS2tSatCurDens; /* temperature corrected saturation Cur. density*/ - double MOS2tCbd; /* temperature corrected B-D Capacitance */ - double MOS2tCbs; /* temperature corrected B-S Capacitance */ - double MOS2tCj; /* temperature corrected Bulk bottom Capacitance */ - double MOS2tCjsw; /* temperature corrected Bulk side Capacitance */ - double MOS2tBulkPot; /* temperature corrected Bulk potential */ - double MOS2tDepCap; /* temperature adjusted transition point in */ - /* the cureve matching Fc * Vj */ - double MOS2tVbi; /* temperature adjusted Vbi */ - - double MOS2m; /* parallel device multiplier */ - - double MOS2l; /* the length of the channel region */ - double MOS2w; /* the width of the channel region */ - double MOS2drainArea; /* the area of the drain diffusion */ - double MOS2sourceArea; /* the area of the source diffusion */ - double MOS2drainSquares; /* the length of the drain in squares */ - double MOS2sourceSquares; /* the length of the source in squares */ - double MOS2drainPerimiter; - double MOS2sourcePerimiter; - double MOS2sourceConductance; /*conductance of source(or 0):set in setup*/ - double MOS2drainConductance; /*conductance of drain(or 0):set in setup*/ - - double MOS2icVBS; /* initial condition B-S voltage */ - double MOS2icVDS; /* initial condition D-S voltage */ - double MOS2icVGS; /* initial condition G-S voltage */ - double MOS2von; - double MOS2vdsat; - double MOS2sourceVcrit; /* Vcrit for pos. vds */ - double MOS2drainVcrit; /* Vcrit for pos. vds */ - double MOS2cd; - double MOS2cbs; - double MOS2cbd; - double MOS2gmbs; - double MOS2gm; - double MOS2gds; - double MOS2gbd; - double MOS2gbs; - double MOS2capbd; - double MOS2capbs; - double MOS2Cbd; - double MOS2Cbdsw; - double MOS2Cbs; - double MOS2Cbssw; - double MOS2f2d; - double MOS2f3d; - double MOS2f4d; - double MOS2f2s; - double MOS2f3s; - double MOS2f4s; - - /* distortion stuff */ -/* - * naming convention: - * x = vgs - * y = vbs - * z = vds - * cdr = cdrain - */ - - - -#define MOS2NDCOEFFS 30 - -#ifndef NODISTO - double MOS2dCoeffs[MOS2NDCOEFFS]; -#else /* NODISTO */ - double *MOS2dCoeffs; -#endif /* NODISTO */ - -#ifndef CONFIG - -#define capbs2 MOS2dCoeffs[0] -#define capbs3 MOS2dCoeffs[1] -#define capbd2 MOS2dCoeffs[2] -#define capbd3 MOS2dCoeffs[3] -#define gbs2 MOS2dCoeffs[4] -#define gbs3 MOS2dCoeffs[5] -#define gbd2 MOS2dCoeffs[6] -#define gbd3 MOS2dCoeffs[7] -#define capgb2 MOS2dCoeffs[8] -#define capgb3 MOS2dCoeffs[9] -#define cdr_x2 MOS2dCoeffs[10] -#define cdr_y2 MOS2dCoeffs[11] -#define cdr_z2 MOS2dCoeffs[12] -#define cdr_xy MOS2dCoeffs[13] -#define cdr_yz MOS2dCoeffs[14] -#define cdr_xz MOS2dCoeffs[15] -#define cdr_x3 MOS2dCoeffs[16] -#define cdr_y3 MOS2dCoeffs[17] -#define cdr_z3 MOS2dCoeffs[18] -#define cdr_x2z MOS2dCoeffs[19] -#define cdr_x2y MOS2dCoeffs[20] -#define cdr_y2z MOS2dCoeffs[21] -#define cdr_xy2 MOS2dCoeffs[22] -#define cdr_xz2 MOS2dCoeffs[23] -#define cdr_yz2 MOS2dCoeffs[24] -#define cdr_xyz MOS2dCoeffs[25] -#define capgs2 MOS2dCoeffs[26] -#define capgs3 MOS2dCoeffs[27] -#define capgd2 MOS2dCoeffs[28] -#define capgd3 MOS2dCoeffs[29] - /* end distortion coeffs. */ - -#endif - -#ifndef NONOISE - double MOS2nVar[NSTATVARS][MOS2NSRCS]; -#else /* NONOISE */ - double **MOS2nVar; -#endif /* NONOISE */ - - - -} MOS2instance ; - - -#define MOS2vbd MOS2states+ 0 /* bulk-drain voltage */ -#define MOS2vbs MOS2states+ 1 /* bulk-source voltage */ -#define MOS2vgs MOS2states+ 2 /* gate-source voltage */ -#define MOS2vds MOS2states+ 3 /* drain-source voltage */ - -#define MOS2capgs MOS2states+4 /* gate-source capacitor value */ -#define MOS2qgs MOS2states+ 5 /* gate-source capacitor charge */ -#define MOS2cqgs MOS2states+ 6 /* gate-source capacitor current */ - -#define MOS2capgd MOS2states+ 7 /* gate-drain capacitor value */ -#define MOS2qgd MOS2states+ 8 /* gate-drain capacitor charge */ -#define MOS2cqgd MOS2states+ 9 /* gate-drain capacitor current */ - -#define MOS2capgb MOS2states+10 /* gate-bulk capacitor value */ -#define MOS2qgb MOS2states+ 11 /* gate-bulk capacitor charge */ -#define MOS2cqgb MOS2states+ 12 /* gate-bulk capacitor current */ - -#define MOS2qbd MOS2states+ 13 /* bulk-drain capacitor charge */ -#define MOS2cqbd MOS2states+ 14 /* bulk-drain capacitor current */ - -#define MOS2qbs MOS2states+ 15 /* bulk-source capacitor charge */ -#define MOS2cqbs MOS2states+ 16 /* bulk-source capacitor current */ - -#define MOS2numStates 17 - - -#define MOS2sensxpgs MOS2states+17 /* charge sensitivities and their derivatives - * +18 for the derivatives - * pointer to the beginning of the array */ - -#define MOS2sensxpgd MOS2states+19 -#define MOS2sensxpgb MOS2states+21 -#define MOS2sensxpbs MOS2states+23 -#define MOS2sensxpbd MOS2states+25 - -#define MOS2numSenStates 10 - - -/* per model data */ - - - /* NOTE: parameters makred 'input - use xxxx' are parameters for - * which a temperature correction is applied in MOS2temp, thus - * the MOS3xxxx value in the per-instance structure should be used - * instead in all calculations - */ - -typedef struct sMOS2model { /* model structure for a resistor */ - - struct GENmodel gen; - -#define MOS2modType gen.GENmodType -#define MOS2nextModel(inst) ((struct sMOS2model *)((inst)->gen.GENnextModel)) -#define MOS2instances(inst) ((MOS2instance *)((inst)->gen.GENinstances)) -#define MOS2modName gen.GENmodName - - int MOS2type; /* device type : 1 = nmos, -1 = pmos */ - int MOS2gateType; - - double MOS2tnom; /* temperature at which parms were measured */ - double MOS2latDiff; - double MOS2jctSatCurDensity; /* input - use tSatCurDens */ - double MOS2jctSatCur; /* input - use tSatCur */ - double MOS2drainResistance; - double MOS2sourceResistance; - double MOS2sheetResistance; - double MOS2transconductance; /* input - use tTransconductance */ - double MOS2gateSourceOverlapCapFactor; - double MOS2gateDrainOverlapCapFactor; - double MOS2gateBulkOverlapCapFactor; - double MOS2oxideCapFactor; - double MOS2vt0; /* input - use tVto */ - double MOS2capBD; /* input - use tCbd */ - double MOS2capBS; /* input - use tCbs */ - double MOS2bulkCapFactor; /* input - use tCj */ - double MOS2sideWallCapFactor; /* input - use tCjsw */ - double MOS2bulkJctPotential; /* input - use tBulkPot */ - double MOS2bulkJctBotGradingCoeff; - double MOS2bulkJctSideGradingCoeff; - double MOS2fwdCapDepCoeff; - double MOS2phi; /* input - use tPhi */ - double MOS2gamma; - double MOS2lambda; - double MOS2substrateDoping; - double MOS2surfaceStateDensity; - double MOS2fastSurfaceStateDensity; /* nfs */ - double MOS2oxideThickness; - double MOS2surfaceMobility; - double MOS2fNcoef; - double MOS2fNexp; - - double MOS2narrowFactor; /* delta */ - double MOS2critFieldExp; /* uexp */ - double MOS2critField; /* ucrit */ - double MOS2maxDriftVel; /* vmax */ - double MOS2xd; - double MOS2junctionDepth; /* xj */ - double MOS2channelCharge; /* neff */ - - unsigned MOS2tnomGiven :1; /* user specified parm. meas. temp */ - unsigned MOS2typeGiven :1; - unsigned MOS2latDiffGiven :1; - unsigned MOS2jctSatCurDensityGiven :1; - unsigned MOS2jctSatCurGiven :1; - unsigned MOS2drainResistanceGiven :1; - unsigned MOS2sourceResistanceGiven :1; - unsigned MOS2sheetResistanceGiven :1; - unsigned MOS2transconductanceGiven :1; - unsigned MOS2gateSourceOverlapCapFactorGiven :1; - unsigned MOS2gateDrainOverlapCapFactorGiven :1; - unsigned MOS2gateBulkOverlapCapFactorGiven :1; - unsigned MOS2vt0Given :1; - unsigned MOS2capBDGiven :1; - unsigned MOS2capBSGiven :1; - unsigned MOS2bulkCapFactorGiven :1; - unsigned MOS2sideWallCapFactorGiven :1; - unsigned MOS2bulkJctPotentialGiven :1; - unsigned MOS2bulkJctBotGradingCoeffGiven :1; - unsigned MOS2bulkJctSideGradingCoeffGiven :1; - unsigned MOS2fwdCapDepCoeffGiven :1; - unsigned MOS2phiGiven :1; - unsigned MOS2gammaGiven :1; - unsigned MOS2lambdaGiven :1; - unsigned MOS2substrateDopingGiven :1; - unsigned MOS2gateTypeGiven :1; - unsigned MOS2surfaceStateDensityGiven :1; - unsigned MOS2fastSurfaceStateDensityGiven :1; /* nfs */ - unsigned MOS2oxideThicknessGiven :1; - unsigned MOS2surfaceMobilityGiven :1; - unsigned MOS2narrowFactorGiven :1; /* delta */ - unsigned MOS2critFieldExpGiven :1; /* uexp */ - unsigned MOS2critFieldGiven :1; /* ucrit */ - unsigned MOS2maxDriftVelGiven :1; /* vmax */ - unsigned MOS2junctionDepthGiven :1; /* xj */ - unsigned MOS2channelChargeGiven :1; /* neff */ - unsigned MOS2fNcoefGiven :1; - unsigned MOS2fNexpGiven :1; - -} MOS2model; - -#ifndef NMOS -#define NMOS 1 -#define PMOS -1 -#endif /*NMOS*/ - -/* device parameters */ -enum { - MOS2_W = 1, - MOS2_L, - MOS2_AS, - MOS2_AD, - MOS2_PS, - MOS2_PD, - MOS2_NRS, - MOS2_NRD, - MOS2_OFF, - MOS2_IC, - MOS2_IC_VBS, - MOS2_IC_VDS, - MOS2_IC_VGS, - MOS2_W_SENS, - MOS2_L_SENS, - MOS2_CB, - MOS2_CG, - MOS2_CS, - MOS2_POWER, - MOS2_CGS, - MOS2_CGD, - MOS2_DNODE, - MOS2_GNODE, - MOS2_SNODE, - MOS2_BNODE, - MOS2_DNODEPRIME, - MOS2_SNODEPRIME, - MOS2_SOURCECONDUCT, - MOS2_DRAINCONDUCT, - MOS2_VON, - MOS2_VDSAT, - MOS2_SOURCEVCRIT, - MOS2_DRAINVCRIT, - MOS2_CD, - MOS2_CBS, - MOS2_CBD, - MOS2_GMBS, - MOS2_GM, - MOS2_GDS, - MOS2_GBD, - MOS2_GBS, - MOS2_CAPBD, - MOS2_CAPBS, - MOS2_CAPZEROBIASBD, - MOS2_CAPZEROBIASBDSW, - MOS2_CAPZEROBIASBS, - MOS2_CAPZEROBIASBSSW, - MOS2_VBD, - MOS2_VBS, - MOS2_VGS, - MOS2_VDS, - MOS2_CAPGS, - MOS2_QGS, - MOS2_CQGS, - MOS2_CAPGD, - MOS2_QGD, - MOS2_CQGD, - MOS2_CAPGB, - MOS2_QGB, - MOS2_CQGB, - MOS2_QBD, - MOS2_CQBD, - MOS2_QBS, - MOS2_CQBS, - MOS2_W_SENS_REAL, - MOS2_W_SENS_IMAG, - MOS2_W_SENS_MAG, - MOS2_W_SENS_PH, - MOS2_W_SENS_CPLX, - MOS2_L_SENS_REAL, - MOS2_L_SENS_IMAG, - MOS2_L_SENS_MAG, - MOS2_L_SENS_PH, - MOS2_L_SENS_CPLX, - MOS2_L_SENS_DC, - MOS2_W_SENS_DC, - MOS2_TEMP, - MOS2_SOURCERESIST, - MOS2_DRAINRESIST, - MOS2_M, - MOS2_DTEMP, -}; - -/* model paramerers */ -enum { - MOS2_MOD_VTO = 101, - MOS2_MOD_KP, - MOS2_MOD_GAMMA, - MOS2_MOD_PHI, - MOS2_MOD_LAMBDA, - MOS2_MOD_RD, - MOS2_MOD_RS, - MOS2_MOD_CBD, - MOS2_MOD_CBS, - MOS2_MOD_IS, - MOS2_MOD_PB, - MOS2_MOD_CGSO, - MOS2_MOD_CGDO, - MOS2_MOD_CGBO, - MOS2_MOD_CJ, - MOS2_MOD_MJ, - MOS2_MOD_CJSW, - MOS2_MOD_MJSW, - MOS2_MOD_JS, - MOS2_MOD_TOX, - MOS2_MOD_LD, - MOS2_MOD_RSH, - MOS2_MOD_U0, - MOS2_MOD_FC, - MOS2_MOD_NSUB, - MOS2_MOD_TPG, - MOS2_MOD_NSS, - MOS2_MOD_NFS, - MOS2_MOD_DELTA, - MOS2_MOD_UEXP, - MOS2_MOD_VMAX, - MOS2_MOD_XJ, - MOS2_MOD_NEFF, - MOS2_MOD_UCRIT, - MOS2_MOD_NMOS, - MOS2_MOD_PMOS, - MOS2_MOD_TNOM, -}; - -enum { - MOS2_MOD_KF = 139, - MOS2_MOD_AF, - MOS2_MOD_TYPE, -}; - -/* model questions */ - -#include "mos2ext.h" - -#endif /*MOS2*/ - diff --git a/src/spicelib/devices/mos2/mos2del.c b/src/spicelib/devices/mos2/mos2del.c deleted file mode 100644 index 48ace59e3..000000000 --- a/src/spicelib/devices/mos2/mos2del.c +++ /dev/null @@ -1,18 +0,0 @@ -/********** -Copyright 1990 Regents of the University of California. All rights reserved. -Author: 1985 Thomas L. Quarles -**********/ - -#include "ngspice/ngspice.h" -#include "mos2defs.h" -#include "ngspice/sperror.h" -#include "ngspice/suffix.h" - - -int -MOS2delete(GENinstance *gen_inst) -{ - MOS2instance *inst = (MOS2instance *) gen_inst; - FREE(inst->MOS2sens); - return OK; -} diff --git a/src/spicelib/devices/mos2/mos2dist.c b/src/spicelib/devices/mos2/mos2dist.c deleted file mode 100644 index b3ff644cd..000000000 --- a/src/spicelib/devices/mos2/mos2dist.c +++ /dev/null @@ -1,1378 +0,0 @@ -/********** -Copyright 1990 Regents of the University of California. All rights reserved. -Author: 1988 Jaijeet S Roychowdhury -**********/ - -#include "ngspice/ngspice.h" -#include "ngspice/cktdefs.h" -#include "mos2defs.h" -#include "ngspice/sperror.h" -#include "ngspice/distodef.h" -#include "ngspice/suffix.h" - -int -MOS2disto(int mode,GENmodel *genmodel, CKTcircuit *ckt) -/* assuming here that ckt->CKTomega has been initialised to - * the correct value - */ -{ - MOS2model *model = (MOS2model *) genmodel; - DISTOAN* job = (DISTOAN*) ckt->CKTcurJob; - DpassStr pass; - double r1h1x,i1h1x; - double r1h1y,i1h1y; - double r1h1z, i1h1z; - double r1h2x, i1h2x; - double r1h2y, i1h2y; - double r1h2z, i1h2z; - double r1hm2x,i1hm2x; - double r1hm2y,i1hm2y; - double r1hm2z, i1hm2z; - double r2h11x,i2h11x; - double r2h11y,i2h11y; - double r2h11z, i2h11z; - double r2h1m2x,i2h1m2x; - double r2h1m2y,i2h1m2y; - double r2h1m2z, i2h1m2z; - double temp, itemp; - MOS2instance *here; - -if (mode == D_SETUP) - return(MOS2dSetup(genmodel,ckt)); - -if ((mode == D_TWOF1) || (mode == D_THRF1) || - (mode == D_F1PF2) || (mode == D_F1MF2) || - (mode == D_2F1MF2)) { - - /* loop through all the MOS2 models */ -for( ; model != NULL; model = MOS2nextModel(model)) { - - /* loop through all the instances of the model */ - for (here = MOS2instances(model); here != NULL ; - here=MOS2nextInstance(here)) { - - /* loading starts here */ - - switch (mode) { - case D_TWOF1: - /* x = vgs, y = vbs z = vds */ - - /* getting first order (linear) Volterra kernel */ - r1h1x = *(job->r1H1ptr + (here->MOS2gNode)) - - *(job->r1H1ptr + (here->MOS2sNodePrime)); - i1h1x = *(job->i1H1ptr + (here->MOS2gNode)) - - *(job->i1H1ptr + (here->MOS2sNodePrime)); - - r1h1y = *(job->r1H1ptr + (here->MOS2bNode)) - - *(job->r1H1ptr + (here->MOS2sNodePrime)); - i1h1y = *(job->i1H1ptr + (here->MOS2bNode)) - - *(job->i1H1ptr + (here->MOS2sNodePrime)); - - r1h1z = *(job->r1H1ptr + (here->MOS2dNodePrime)) - - *(job->r1H1ptr + (here->MOS2sNodePrime)); - i1h1z = *(job->i1H1ptr + (here->MOS2dNodePrime)) - - *(job->i1H1ptr + (here->MOS2sNodePrime)); - - /* loading starts here */ - /* loading cdrain term */ - - temp = DFn2F1(here->cdr_x2, - here->cdr_y2, - here->cdr_z2, - here->cdr_xy, - here->cdr_yz, - here->cdr_xz, - r1h1x, - i1h1x, - r1h1y, - i1h1y, - r1h1z, - i1h1z); - - itemp = DFi2F1(here->cdr_x2, - here->cdr_y2, - here->cdr_z2, - here->cdr_xy, - here->cdr_yz, - here->cdr_xz, - r1h1x, - i1h1x, - r1h1y, - i1h1y, - r1h1z, - i1h1z); - - *(ckt->CKTrhs + (here->MOS2dNodePrime)) -= temp; - *(ckt->CKTirhs + (here->MOS2dNodePrime)) -= itemp; - *(ckt->CKTrhs + (here->MOS2sNodePrime)) += temp; - *(ckt->CKTirhs + (here->MOS2sNodePrime)) += itemp; - - /* cdrain term over */ - - /* loading gbs term */ - - temp = D1n2F1(here->gbs2, - r1h1y, - i1h1y); - - itemp = D1i2F1(here->gbs2, - r1h1y, - i1h1y); - - - *(ckt->CKTrhs + (here->MOS2bNode)) -= temp; - *(ckt->CKTirhs + (here->MOS2bNode)) -= itemp; - *(ckt->CKTrhs + (here->MOS2sNodePrime)) += temp; - *(ckt->CKTirhs + (here->MOS2sNodePrime)) += itemp; - - /* gbs over */ - - /* loading gbd term */ - - temp = D1n2F1(here->gbd2, - r1h1y - r1h1z, - i1h1y - i1h1z); - - itemp = D1i2F1(here->gbd2, - r1h1y - r1h1z, - i1h1y - i1h1z); - - - *(ckt->CKTrhs + (here->MOS2bNode)) -= temp; - *(ckt->CKTirhs + (here->MOS2bNode)) -= itemp; - *(ckt->CKTrhs + (here->MOS2dNodePrime)) += temp; - *(ckt->CKTirhs + (here->MOS2dNodePrime)) += itemp; - - /* gbd over */ - - /* loading capgs term */ - - temp = -ckt->CKTomega * - D1i2F1(here->capgs2, - r1h1x, - i1h1x); - - itemp = ckt->CKTomega * - D1n2F1(here->capgs2, - r1h1x, - i1h1x); - - *(ckt->CKTrhs + (here->MOS2gNode)) -= temp; - *(ckt->CKTirhs + (here->MOS2gNode)) -= itemp; - *(ckt->CKTrhs + (here->MOS2sNodePrime)) += temp; - *(ckt->CKTirhs + (here->MOS2sNodePrime)) += itemp; - - /* capgs over */ - - /* loading capgd term */ - - temp = -ckt->CKTomega * - D1i2F1(here->capgd2, - r1h1x - r1h1z, - i1h1x - i1h1z); - - itemp = ckt->CKTomega * - D1n2F1(here->capgd2, - r1h1x - r1h1z, - i1h1x - i1h1z); - - - *(ckt->CKTrhs + (here->MOS2gNode)) -= temp; - *(ckt->CKTirhs + (here->MOS2gNode)) -= itemp; - *(ckt->CKTrhs + (here->MOS2dNodePrime)) += temp; - *(ckt->CKTirhs + (here->MOS2dNodePrime)) += itemp; - - /* capgd over */ - /* loading capgb term */ - - temp = -ckt->CKTomega * - D1i2F1(here->capgb2, - r1h1x - r1h1y, - i1h1x - i1h1y); - - itemp = ckt->CKTomega * - D1n2F1(here->capgb2, - r1h1x - r1h1y, - i1h1x - i1h1y); - - *(ckt->CKTrhs + (here->MOS2gNode)) -= temp; - *(ckt->CKTirhs + (here->MOS2gNode)) -= itemp; - *(ckt->CKTrhs + (here->MOS2bNode)) += temp; - *(ckt->CKTirhs + (here->MOS2bNode)) += itemp; - - /* capgb over */ - - /* loading capbs term */ - - temp = -ckt->CKTomega * - D1i2F1(here->capbs2, - r1h1y, - i1h1y); - - itemp = ckt->CKTomega * - D1n2F1(here->capbs2, - r1h1y, - i1h1y); - - - *(ckt->CKTrhs + (here->MOS2bNode)) -= temp; - *(ckt->CKTirhs + (here->MOS2bNode)) -= itemp; - *(ckt->CKTrhs + (here->MOS2sNodePrime)) += temp; - *(ckt->CKTirhs + (here->MOS2sNodePrime)) += itemp; - - /* capbs over */ - - /* loading capbd term */ - - temp = -ckt->CKTomega * - D1i2F1(here->capbd2, - r1h1y - r1h1z, - i1h1y - i1h1z); - - itemp = ckt->CKTomega * - D1n2F1(here->capbd2, - r1h1y - r1h1z, - i1h1y - i1h1z); - - - *(ckt->CKTrhs + (here->MOS2bNode)) -= temp; - *(ckt->CKTirhs + (here->MOS2bNode)) -= itemp; - *(ckt->CKTrhs + (here->MOS2dNodePrime)) += temp; - *(ckt->CKTirhs + (here->MOS2dNodePrime)) += itemp; - - /* capbd over */ - /* all done */ - - break; - - case D_THRF1: - /* x = vgs, y = vbs z = vds */ - - /* getting first order (linear) Volterra kernel */ - r1h1x = *(job->r1H1ptr + (here->MOS2gNode)) - - *(job->r1H1ptr + (here->MOS2sNodePrime)); - i1h1x = *(job->i1H1ptr + (here->MOS2gNode)) - - *(job->i1H1ptr + (here->MOS2sNodePrime)); - - r1h1y = *(job->r1H1ptr + (here->MOS2bNode)) - - *(job->r1H1ptr + (here->MOS2sNodePrime)); - i1h1y = *(job->i1H1ptr + (here->MOS2bNode)) - - *(job->i1H1ptr + (here->MOS2sNodePrime)); - - r1h1z = *(job->r1H1ptr + (here->MOS2dNodePrime)) - - *(job->r1H1ptr + (here->MOS2sNodePrime)); - i1h1z = *(job->i1H1ptr + (here->MOS2dNodePrime)) - - *(job->i1H1ptr + (here->MOS2sNodePrime)); - - r2h11x = *(job->r2H11ptr + (here->MOS2gNode)) - - *(job->r2H11ptr + (here->MOS2sNodePrime)); - i2h11x = *(job->i2H11ptr + (here->MOS2gNode)) - - *(job->i2H11ptr + (here->MOS2sNodePrime)); - - r2h11y = *(job->r2H11ptr + (here->MOS2bNode)) - - *(job->r2H11ptr + (here->MOS2sNodePrime)); - i2h11y = *(job->i2H11ptr + (here->MOS2bNode)) - - *(job->i2H11ptr + (here->MOS2sNodePrime)); - - r2h11z = *(job->r2H11ptr + (here->MOS2dNodePrime)) - - *(job->r2H11ptr + (here->MOS2sNodePrime)); - i2h11z = *(job->i2H11ptr + (here->MOS2dNodePrime)) - - *(job->i2H11ptr + (here->MOS2sNodePrime)); - /* loading starts here */ - /* loading cdrain term */ - - temp = DFn3F1(here->cdr_x2, - here->cdr_y2, - here->cdr_z2, - here->cdr_xy, - here->cdr_yz, - here->cdr_xz, - here->cdr_x3, - here->cdr_y3, - here->cdr_z3, - here->cdr_x2y, - here->cdr_x2z, - here->cdr_xy2, - here->cdr_y2z, - here->cdr_xz2, - here->cdr_yz2, - here->cdr_xyz, - r1h1x, - i1h1x, - r1h1y, - i1h1y, - r1h1z, - i1h1z, - r2h11x, - i2h11x, - r2h11y, - i2h11y, - r2h11z, - i2h11z); - itemp = DFi3F1(here->cdr_x2, - here->cdr_y2, - here->cdr_z2, - here->cdr_xy, - here->cdr_yz, - here->cdr_xz, - here->cdr_x3, - here->cdr_y3, - here->cdr_z3, - here->cdr_x2y, - here->cdr_x2z, - here->cdr_xy2, - here->cdr_y2z, - here->cdr_xz2, - here->cdr_yz2, - here->cdr_xyz, - r1h1x, - i1h1x, - r1h1y, - i1h1y, - r1h1z, - i1h1z, - r2h11x, - i2h11x, - r2h11y, - i2h11y, - r2h11z, - i2h11z); - - - *(ckt->CKTrhs + (here->MOS2dNodePrime)) -= temp; - *(ckt->CKTirhs + (here->MOS2dNodePrime)) -= itemp; - *(ckt->CKTrhs + (here->MOS2sNodePrime)) += temp; - *(ckt->CKTirhs + (here->MOS2sNodePrime)) += itemp; - - /* cdrain term over */ - - /* loading gbs term */ - - temp = D1n3F1(here->gbs2, - here->gbs3, - r1h1y, - i1h1y, - r2h11y, - i2h11y); - - - itemp = D1i3F1(here->gbs2, - here->gbs3, - r1h1y, - i1h1y, - r2h11y, - i2h11y); - - - *(ckt->CKTrhs + (here->MOS2bNode)) -= temp; - *(ckt->CKTirhs + (here->MOS2bNode)) -= itemp; - *(ckt->CKTrhs + (here->MOS2sNodePrime)) += temp; - *(ckt->CKTirhs + (here->MOS2sNodePrime)) += itemp; - - /* gbs over */ - - /* loading gbd term */ - - temp = D1n3F1(here->gbd2, - here->gbd3, - r1h1y - r1h1z, - i1h1y - i1h1z, - r2h11y - r2h11z, - i2h11y - i2h11z); - - itemp = D1i3F1(here->gbd2, - here->gbd3, - r1h1y - r1h1z, - i1h1y - i1h1z, - r2h11y - r2h11z, - i2h11y - i2h11z); - - *(ckt->CKTrhs + (here->MOS2bNode)) -= temp; - *(ckt->CKTirhs + (here->MOS2bNode)) -= itemp; - *(ckt->CKTrhs + (here->MOS2dNodePrime)) += temp; - *(ckt->CKTirhs + (here->MOS2dNodePrime)) += itemp; - - /* gbd over */ - - /* loading capgs term */ - - temp = -ckt->CKTomega * - D1i3F1(here->capgs2, - here->capgs3, - r1h1x, - i1h1x, - r2h11x, - i2h11x); - - itemp = ckt->CKTomega * - D1n3F1(here->capgs2, - here->capgs3, - r1h1x, - i1h1x, - r2h11x, - i2h11x); - - *(ckt->CKTrhs + (here->MOS2gNode)) -= temp; - *(ckt->CKTirhs + (here->MOS2gNode)) -= itemp; - *(ckt->CKTrhs + (here->MOS2sNodePrime)) += temp; - *(ckt->CKTirhs + (here->MOS2sNodePrime)) += itemp; - - /* capgs over */ - - /* loading capgd term */ - - temp = -ckt->CKTomega * - D1i3F1(here->capgd2, - here->capgd3, - r1h1x - r1h1z, - i1h1x - i1h1z, - r2h11x - r2h11z, - i2h11x - i2h11z); - - itemp = ckt->CKTomega * - D1n3F1(here->capgd2, - here->capgd3, - r1h1x - r1h1z, - i1h1x - i1h1z, - r2h11x - r2h11z, - i2h11x - i2h11z); - - - *(ckt->CKTrhs + (here->MOS2gNode)) -= temp; - *(ckt->CKTirhs + (here->MOS2gNode)) -= itemp; - *(ckt->CKTrhs + (here->MOS2dNodePrime)) += temp; - *(ckt->CKTirhs + (here->MOS2dNodePrime)) += itemp; - - /* capgd over */ - /* loading capgb term */ - - temp = -ckt->CKTomega * - D1i3F1(here->capgb2, - here->capgb3, - r1h1x - r1h1y, - i1h1x - i1h1y, - r2h11x - r2h11y, - i2h11x - i2h11y); - - itemp = ckt->CKTomega * - D1n3F1(here->capgb2, - here->capgb3, - r1h1x - r1h1y, - i1h1x - i1h1y, - r2h11x - r2h11y, - i2h11x - i2h11y); - - *(ckt->CKTrhs + (here->MOS2gNode)) -= temp; - *(ckt->CKTirhs + (here->MOS2gNode)) -= itemp; - *(ckt->CKTrhs + (here->MOS2bNode)) += temp; - *(ckt->CKTirhs + (here->MOS2bNode)) += itemp; - - /* capgb over */ - - /* loading capbs term */ - - temp = -ckt->CKTomega * - D1i3F1(here->capbs2, - here->capbs3, - r1h1y, - i1h1y, - r2h11y, - i2h11y); - - itemp = ckt->CKTomega * - D1n3F1(here->capbs2, - here->capbs3, - r1h1y, - i1h1y, - r2h11y, - i2h11y); - - - *(ckt->CKTrhs + (here->MOS2bNode)) -= temp; - *(ckt->CKTirhs + (here->MOS2bNode)) -= itemp; - *(ckt->CKTrhs + (here->MOS2sNodePrime)) += temp; - *(ckt->CKTirhs + (here->MOS2sNodePrime)) += itemp; - - /* capbs over */ - - /* loading capbd term */ - - temp = -ckt->CKTomega * - D1i3F1(here->capbd2, - here->capbd3, - r1h1y - r1h1z, - i1h1y - i1h1z, - r2h11y - r2h11z, - i2h11y - i2h11z); - - itemp = ckt->CKTomega * - D1n3F1(here->capbd2, - here->capbd3, - r1h1y - r1h1z, - i1h1y - i1h1z, - r2h11y - r2h11z, - i2h11y - i2h11z); - - - *(ckt->CKTrhs + (here->MOS2bNode)) -= temp; - *(ckt->CKTirhs + (here->MOS2bNode)) -= itemp; - *(ckt->CKTrhs + (here->MOS2dNodePrime)) += temp; - *(ckt->CKTirhs + (here->MOS2dNodePrime)) += itemp; - - /* capbd over */ - /* all done */ - - break; - case D_F1PF2: - /* x = vgs, y = vbs z = vds */ - - /* getting first order (linear) Volterra kernel */ - r1h1x = *(job->r1H1ptr + (here->MOS2gNode)) - - *(job->r1H1ptr + (here->MOS2sNodePrime)); - i1h1x = *(job->i1H1ptr + (here->MOS2gNode)) - - *(job->i1H1ptr + (here->MOS2sNodePrime)); - - r1h1y = *(job->r1H1ptr + (here->MOS2bNode)) - - *(job->r1H1ptr + (here->MOS2sNodePrime)); - i1h1y = *(job->i1H1ptr + (here->MOS2bNode)) - - *(job->i1H1ptr + (here->MOS2sNodePrime)); - - r1h1z = *(job->r1H1ptr + (here->MOS2dNodePrime)) - - *(job->r1H1ptr + (here->MOS2sNodePrime)); - i1h1z = *(job->i1H1ptr + (here->MOS2dNodePrime)) - - *(job->i1H1ptr + (here->MOS2sNodePrime)); - - r1h2x = *(job->r1H2ptr + (here->MOS2gNode)) - - *(job->r1H2ptr + (here->MOS2sNodePrime)); - i1h2x = *(job->i1H2ptr + (here->MOS2gNode)) - - *(job->i1H2ptr + (here->MOS2sNodePrime)); - - r1h2y = *(job->r1H2ptr + (here->MOS2bNode)) - - *(job->r1H2ptr + (here->MOS2sNodePrime)); - i1h2y = *(job->i1H2ptr + (here->MOS2bNode)) - - *(job->i1H2ptr + (here->MOS2sNodePrime)); - - r1h2z = *(job->r1H2ptr + (here->MOS2dNodePrime)) - - *(job->r1H2ptr + (here->MOS2sNodePrime)); - i1h2z = *(job->i1H2ptr + (here->MOS2dNodePrime)) - - *(job->i1H2ptr + (here->MOS2sNodePrime)); - - /* loading starts here */ - /* loading cdrain term */ - - temp = DFnF12(here->cdr_x2, - here->cdr_y2, - here->cdr_z2, - here->cdr_xy, - here->cdr_yz, - here->cdr_xz, - r1h1x, - i1h1x, - r1h1y, - i1h1y, - r1h1z, - i1h1z, - r1h2x, - i1h2x, - r1h2y, - i1h2y, - r1h2z, - i1h2z); - - itemp = DFiF12(here->cdr_x2, - here->cdr_y2, - here->cdr_z2, - here->cdr_xy, - here->cdr_yz, - here->cdr_xz, - r1h1x, - i1h1x, - r1h1y, - i1h1y, - r1h1z, - i1h1z, - r1h2x, - i1h2x, - r1h2y, - i1h2y, - r1h2z, - i1h2z); - - *(ckt->CKTrhs + (here->MOS2dNodePrime)) -= temp; - *(ckt->CKTirhs + (here->MOS2dNodePrime)) -= itemp; - *(ckt->CKTrhs + (here->MOS2sNodePrime)) += temp; - *(ckt->CKTirhs + (here->MOS2sNodePrime)) += itemp; - - /* cdrain term over */ - - /* loading gbs term */ - - temp = D1nF12(here->gbs2, - r1h1y, - i1h1y, - r1h2y, - i1h2y); - - itemp = D1iF12(here->gbs2, - r1h1y, - i1h1y, - r1h2y, - i1h2y); - - - *(ckt->CKTrhs + (here->MOS2bNode)) -= temp; - *(ckt->CKTirhs + (here->MOS2bNode)) -= itemp; - *(ckt->CKTrhs + (here->MOS2sNodePrime)) += temp; - *(ckt->CKTirhs + (here->MOS2sNodePrime)) += itemp; - - /* gbs over */ - - /* loading gbd term */ - - temp = D1nF12(here->gbd2, - r1h1y - r1h1z, - i1h1y - i1h1z, - r1h2y - r1h2z, - i1h2y - i1h2z); - - itemp = D1iF12(here->gbd2, - r1h1y - r1h1z, - i1h1y - i1h1z, - r1h2y - r1h2z, - i1h2y - i1h2z); - - - *(ckt->CKTrhs + (here->MOS2bNode)) -= temp; - *(ckt->CKTirhs + (here->MOS2bNode)) -= itemp; - *(ckt->CKTrhs + (here->MOS2dNodePrime)) += temp; - *(ckt->CKTirhs + (here->MOS2dNodePrime)) += itemp; - - /* gbd over */ - - /* loading capgs term */ - - temp = -ckt->CKTomega * - D1iF12(here->capgs2, - r1h1x, - i1h1x, - r1h2x, - i1h2x); - - itemp = ckt->CKTomega * - D1nF12(here->capgs2, - r1h1x, - i1h1x, - r1h2x, - i1h2x); - - *(ckt->CKTrhs + (here->MOS2gNode)) -= temp; - *(ckt->CKTirhs + (here->MOS2gNode)) -= itemp; - *(ckt->CKTrhs + (here->MOS2sNodePrime)) += temp; - *(ckt->CKTirhs + (here->MOS2sNodePrime)) += itemp; - - /* capgs over */ - - /* loading capgd term */ - - temp = -ckt->CKTomega * - D1iF12(here->capgd2, - r1h1x - r1h1z, - i1h1x - i1h1z, - r1h2x - r1h2z, - i1h2x - i1h2z); - - itemp = ckt->CKTomega * - D1nF12(here->capgd2, - r1h1x - r1h1z, - i1h1x - i1h1z, - r1h2x - r1h2z, - i1h2x - i1h2z); - - - *(ckt->CKTrhs + (here->MOS2gNode)) -= temp; - *(ckt->CKTirhs + (here->MOS2gNode)) -= itemp; - *(ckt->CKTrhs + (here->MOS2dNodePrime)) += temp; - *(ckt->CKTirhs + (here->MOS2dNodePrime)) += itemp; - - /* capgd over */ - /* loading capgb term */ - - temp = -ckt->CKTomega * - D1iF12(here->capgb2, - r1h1x - r1h1y, - i1h1x - i1h1y, - r1h2x - r1h2y, - i1h2x - i1h2y); - - itemp = ckt->CKTomega * - D1nF12(here->capgb2, - r1h1x - r1h1y, - i1h1x - i1h1y, - r1h2x - r1h2y, - i1h2x - i1h2y); - - *(ckt->CKTrhs + (here->MOS2gNode)) -= temp; - *(ckt->CKTirhs + (here->MOS2gNode)) -= itemp; - *(ckt->CKTrhs + (here->MOS2bNode)) += temp; - *(ckt->CKTirhs + (here->MOS2bNode)) += itemp; - - /* capgb over */ - - /* loading capbs term */ - - temp = -ckt->CKTomega * - D1iF12(here->capbs2, - r1h1y, - i1h1y, - r1h2y, - i1h2y); - - itemp = ckt->CKTomega * - D1nF12(here->capbs2, - r1h1y, - i1h1y, - r1h2y, - i1h2y); - - - *(ckt->CKTrhs + (here->MOS2bNode)) -= temp; - *(ckt->CKTirhs + (here->MOS2bNode)) -= itemp; - *(ckt->CKTrhs + (here->MOS2sNodePrime)) += temp; - *(ckt->CKTirhs + (here->MOS2sNodePrime)) += itemp; - - /* capbs over */ - - /* loading capbd term */ - - temp = -ckt->CKTomega * - D1iF12(here->capbd2, - r1h1y - r1h1z, - i1h1y - i1h1z, - r1h2y - r1h2z, - i1h2y - i1h2z); - - itemp = ckt->CKTomega * - D1nF12(here->capbd2, - r1h1y - r1h1z, - i1h1y - i1h1z, - r1h2y - r1h2z, - i1h2y - i1h2z); - - - *(ckt->CKTrhs + (here->MOS2bNode)) -= temp; - *(ckt->CKTirhs + (here->MOS2bNode)) -= itemp; - *(ckt->CKTrhs + (here->MOS2dNodePrime)) += temp; - *(ckt->CKTirhs + (here->MOS2dNodePrime)) += itemp; - - /* capbd over */ - /* all done */ - - break; - case D_F1MF2: - /* x = vgs, y = vbs z = vds */ - - /* getting first order (linear) Volterra kernel */ - r1h1x = *(job->r1H1ptr + (here->MOS2gNode)) - - *(job->r1H1ptr + (here->MOS2sNodePrime)); - i1h1x = *(job->i1H1ptr + (here->MOS2gNode)) - - *(job->i1H1ptr + (here->MOS2sNodePrime)); - - r1h1y = *(job->r1H1ptr + (here->MOS2bNode)) - - *(job->r1H1ptr + (here->MOS2sNodePrime)); - i1h1y = *(job->i1H1ptr + (here->MOS2bNode)) - - *(job->i1H1ptr + (here->MOS2sNodePrime)); - - r1h1z = *(job->r1H1ptr + (here->MOS2dNodePrime)) - - *(job->r1H1ptr + (here->MOS2sNodePrime)); - i1h1z = *(job->i1H1ptr + (here->MOS2dNodePrime)) - - *(job->i1H1ptr + (here->MOS2sNodePrime)); - - r1hm2x = *(job->r1H2ptr + (here->MOS2gNode)) - - *(job->r1H2ptr + (here->MOS2sNodePrime)); - i1hm2x = -(*(job->i1H2ptr + (here->MOS2gNode)) - - *(job->i1H2ptr + (here->MOS2sNodePrime))); - - r1hm2y = *(job->r1H2ptr + (here->MOS2bNode)) - - *(job->r1H2ptr + (here->MOS2sNodePrime)); - i1hm2y = -(*(job->i1H2ptr + (here->MOS2bNode)) - - *(job->i1H2ptr + (here->MOS2sNodePrime))); - - r1hm2z = *(job->r1H2ptr + (here->MOS2dNodePrime)) - - *(job->r1H2ptr + (here->MOS2sNodePrime)); - i1hm2z = -(*(job->i1H2ptr + (here->MOS2dNodePrime)) - - *(job->i1H2ptr + (here->MOS2sNodePrime))); - - /* loading starts here */ - /* loading cdrain term */ - - temp = DFnF12(here->cdr_x2, - here->cdr_y2, - here->cdr_z2, - here->cdr_xy, - here->cdr_yz, - here->cdr_xz, - r1h1x, - i1h1x, - r1h1y, - i1h1y, - r1h1z, - i1h1z, - r1hm2x, - i1hm2x, - r1hm2y, - i1hm2y, - r1hm2z, - i1hm2z); - - itemp = DFiF12(here->cdr_x2, - here->cdr_y2, - here->cdr_z2, - here->cdr_xy, - here->cdr_yz, - here->cdr_xz, - r1h1x, - i1h1x, - r1h1y, - i1h1y, - r1h1z, - i1h1z, - r1hm2x, - i1hm2x, - r1hm2y, - i1hm2y, - r1hm2z, - i1hm2z); - - *(ckt->CKTrhs + (here->MOS2dNodePrime)) -= temp; - *(ckt->CKTirhs + (here->MOS2dNodePrime)) -= itemp; - *(ckt->CKTrhs + (here->MOS2sNodePrime)) += temp; - *(ckt->CKTirhs + (here->MOS2sNodePrime)) += itemp; - - /* cdrain term over */ - - /* loading gbs term */ - - temp = D1nF12(here->gbs2, - r1h1y, - i1h1y, - r1hm2y, - i1hm2y); - - itemp = D1iF12(here->gbs2, - r1h1y, - i1h1y, - r1hm2y, - i1hm2y); - - - *(ckt->CKTrhs + (here->MOS2bNode)) -= temp; - *(ckt->CKTirhs + (here->MOS2bNode)) -= itemp; - *(ckt->CKTrhs + (here->MOS2sNodePrime)) += temp; - *(ckt->CKTirhs + (here->MOS2sNodePrime)) += itemp; - - /* gbs over */ - - /* loading gbd term */ - - temp = D1nF12(here->gbd2, - r1h1y - r1h1z, - i1h1y - i1h1z, - r1hm2y - r1hm2z, - i1hm2y - i1hm2z); - - itemp = D1iF12(here->gbd2, - r1h1y - r1h1z, - i1h1y - i1h1z, - r1hm2y - r1hm2z, - i1hm2y - i1hm2z); - - - *(ckt->CKTrhs + (here->MOS2bNode)) -= temp; - *(ckt->CKTirhs + (here->MOS2bNode)) -= itemp; - *(ckt->CKTrhs + (here->MOS2dNodePrime)) += temp; - *(ckt->CKTirhs + (here->MOS2dNodePrime)) += itemp; - - /* gbd over */ - - /* loading capgs term */ - - temp = -ckt->CKTomega * - D1iF12(here->capgs2, - r1h1x, - i1h1x, - r1hm2x, - i1hm2x); - - itemp = ckt->CKTomega * - D1nF12(here->capgs2, - r1h1x, - i1h1x, - r1hm2x, - i1hm2x); - - *(ckt->CKTrhs + (here->MOS2gNode)) -= temp; - *(ckt->CKTirhs + (here->MOS2gNode)) -= itemp; - *(ckt->CKTrhs + (here->MOS2sNodePrime)) += temp; - *(ckt->CKTirhs + (here->MOS2sNodePrime)) += itemp; - - /* capgs over */ - - /* loading capgd term */ - - temp = -ckt->CKTomega * - D1iF12(here->capgd2, - r1h1x - r1h1z, - i1h1x - i1h1z, - r1hm2x - r1hm2z, - i1hm2x - i1hm2z); - - itemp = ckt->CKTomega * - D1nF12(here->capgd2, - r1h1x - r1h1z, - i1h1x - i1h1z, - r1hm2x - r1hm2z, - i1hm2x - i1hm2z); - - - *(ckt->CKTrhs + (here->MOS2gNode)) -= temp; - *(ckt->CKTirhs + (here->MOS2gNode)) -= itemp; - *(ckt->CKTrhs + (here->MOS2dNodePrime)) += temp; - *(ckt->CKTirhs + (here->MOS2dNodePrime)) += itemp; - - /* capgd over */ - /* loading capgb term */ - - temp = -ckt->CKTomega * - D1iF12(here->capgb2, - r1h1x - r1h1y, - i1h1x - i1h1y, - r1hm2x - r1hm2y, - i1hm2x - i1hm2y); - - itemp = ckt->CKTomega * - D1nF12(here->capgb2, - r1h1x - r1h1y, - i1h1x - i1h1y, - r1hm2x - r1hm2y, - i1hm2x - i1hm2y); - - *(ckt->CKTrhs + (here->MOS2gNode)) -= temp; - *(ckt->CKTirhs + (here->MOS2gNode)) -= itemp; - *(ckt->CKTrhs + (here->MOS2bNode)) += temp; - *(ckt->CKTirhs + (here->MOS2bNode)) += itemp; - - /* capgb over */ - - /* loading capbs term */ - - temp = -ckt->CKTomega * - D1iF12(here->capbs2, - r1h1y, - i1h1y, - r1hm2y, - i1hm2y); - - itemp = ckt->CKTomega * - D1nF12(here->capbs2, - r1h1y, - i1h1y, - r1hm2y, - i1hm2y); - - - *(ckt->CKTrhs + (here->MOS2bNode)) -= temp; - *(ckt->CKTirhs + (here->MOS2bNode)) -= itemp; - *(ckt->CKTrhs + (here->MOS2sNodePrime)) += temp; - *(ckt->CKTirhs + (here->MOS2sNodePrime)) += itemp; - - /* capbs over */ - - /* loading capbd term */ - - temp = -ckt->CKTomega * - D1iF12(here->capbd2, - r1h1y - r1h1z, - i1h1y - i1h1z, - r1hm2y - r1hm2z, - i1hm2y - i1hm2z); - - itemp = ckt->CKTomega * - D1nF12(here->capbd2, - r1h1y - r1h1z, - i1h1y - i1h1z, - r1hm2y - r1hm2z, - i1hm2y - i1hm2z); - - - *(ckt->CKTrhs + (here->MOS2bNode)) -= temp; - *(ckt->CKTirhs + (here->MOS2bNode)) -= itemp; - *(ckt->CKTrhs + (here->MOS2dNodePrime)) += temp; - *(ckt->CKTirhs + (here->MOS2dNodePrime)) += itemp; - - /* capbd over */ - /* all done */ - - break; - case D_2F1MF2: - /* x = vgs, y = vbs z = vds */ - - /* getting first order (linear) Volterra kernel */ - r1h1x = *(job->r1H1ptr + (here->MOS2gNode)) - - *(job->r1H1ptr + (here->MOS2sNodePrime)); - i1h1x = *(job->i1H1ptr + (here->MOS2gNode)) - - *(job->i1H1ptr + (here->MOS2sNodePrime)); - - r1h1y = *(job->r1H1ptr + (here->MOS2bNode)) - - *(job->r1H1ptr + (here->MOS2sNodePrime)); - i1h1y = *(job->i1H1ptr + (here->MOS2bNode)) - - *(job->i1H1ptr + (here->MOS2sNodePrime)); - - r1h1z = *(job->r1H1ptr + (here->MOS2dNodePrime)) - - *(job->r1H1ptr + (here->MOS2sNodePrime)); - i1h1z = *(job->i1H1ptr + (here->MOS2dNodePrime)) - - *(job->i1H1ptr + (here->MOS2sNodePrime)); - - r1hm2x = *(job->r1H2ptr + (here->MOS2gNode)) - - *(job->r1H2ptr + (here->MOS2sNodePrime)); - i1hm2x = -(*(job->i1H2ptr + (here->MOS2gNode)) - - *(job->i1H2ptr + (here->MOS2sNodePrime))); - - r1hm2y = *(job->r1H2ptr + (here->MOS2bNode)) - - *(job->r1H2ptr + (here->MOS2sNodePrime)); - i1hm2y = -(*(job->i1H2ptr + (here->MOS2bNode)) - - *(job->i1H2ptr + (here->MOS2sNodePrime))); - - r1hm2z = *(job->r1H2ptr + (here->MOS2dNodePrime)) - - *(job->r1H2ptr + (here->MOS2sNodePrime)); - i1hm2z = -(*(job->i1H2ptr + (here->MOS2dNodePrime)) - - *(job->i1H2ptr + (here->MOS2sNodePrime))); - - r2h11x = *(job->r1H1ptr + (here->MOS2gNode)) - - *(job->r1H1ptr + (here->MOS2sNodePrime)); - i2h11x = *(job->i1H1ptr + (here->MOS2gNode)) - - *(job->i1H1ptr + (here->MOS2sNodePrime)); - - r2h11y = *(job->r1H1ptr + (here->MOS2bNode)) - - *(job->r1H1ptr + (here->MOS2sNodePrime)); - i2h11y = *(job->i1H1ptr + (here->MOS2bNode)) - - *(job->i1H1ptr + (here->MOS2sNodePrime)); - - r2h11z = *(job->r1H1ptr + (here->MOS2dNodePrime)) - - *(job->r1H1ptr + (here->MOS2sNodePrime)); - i2h11z = *(job->i1H1ptr + (here->MOS2dNodePrime)) - - *(job->i1H1ptr + (here->MOS2sNodePrime)); - - r2h1m2x = *(job->r2H1m2ptr + (here->MOS2gNode)) - - *(job->r2H1m2ptr + (here->MOS2sNodePrime)); - i2h1m2x = *(job->i2H1m2ptr + (here->MOS2gNode)) - - *(job->i2H1m2ptr + (here->MOS2sNodePrime)); - - r2h1m2y = *(job->r2H1m2ptr + (here->MOS2bNode)) - - *(job->r2H1m2ptr + (here->MOS2sNodePrime)); - i2h1m2y = *(job->i2H1m2ptr + (here->MOS2bNode)) - - *(job->i2H1m2ptr + (here->MOS2sNodePrime)); - -r2h1m2z = *(job->r2H1m2ptr + (here->MOS2dNodePrime)) - - *(job->r2H1m2ptr + (here->MOS2sNodePrime)); -i2h1m2z = *(job->i2H1m2ptr + (here->MOS2dNodePrime)) - - *(job->i2H1m2ptr + (here->MOS2sNodePrime)); - - /* loading starts here */ - /* loading cdrain term */ - -pass.cxx = here->cdr_x2; -pass.cyy = here->cdr_y2; -pass.czz = here->cdr_z2; -pass.cxy = here->cdr_xy; -pass.cyz = here->cdr_yz; -pass.cxz = here->cdr_xz; -pass.cxxx = here->cdr_x3; -pass.cyyy = here->cdr_y3; -pass.czzz = here->cdr_z3; -pass.cxxy = here->cdr_x2y; -pass.cxxz = here->cdr_x2z; -pass.cxyy = here->cdr_xy2; -pass.cyyz = here->cdr_y2z; -pass.cxzz = here->cdr_xz2; -pass.cyzz = here->cdr_yz2; -pass.cxyz = here->cdr_xyz; -pass.r1h1x = r1h1x; -pass.i1h1x = i1h1x; -pass.r1h1y = r1h1y; -pass.i1h1y = i1h1y; -pass.r1h1z = r1h1z; -pass.i1h1z = i1h1z; -pass.r1h2x = r1hm2x; -pass.i1h2x = i1hm2x; -pass.r1h2y = r1hm2y; -pass.i1h2y = i1hm2y; -pass.r1h2z = r1hm2z; -pass.i1h2z = i1hm2z; -pass.r2h11x = r2h11x; -pass.i2h11x = i2h11x; -pass.r2h11y = r2h11y; -pass.i2h11y = i2h11y; -pass.r2h11z = r2h11z; -pass.i2h11z = i2h11z; -pass.h2f1f2x = r2h1m2x; -pass.ih2f1f2x = i2h1m2x; -pass.h2f1f2y = r2h1m2y; -pass.ih2f1f2y = i2h1m2y; -pass.h2f1f2z = r2h1m2z; -pass.ih2f1f2z = i2h1m2z; - temp = DFn2F12(&pass); - - itemp = DFi2F12(&pass); - - - *(ckt->CKTrhs + (here->MOS2dNodePrime)) -= temp; - *(ckt->CKTirhs + (here->MOS2dNodePrime)) -= itemp; - *(ckt->CKTrhs + (here->MOS2sNodePrime)) += temp; - *(ckt->CKTirhs + (here->MOS2sNodePrime)) += itemp; - - /* cdrain term over */ - - /* loading gbs term */ - - temp = D1n2F12(here->gbs2, - here->gbs3, - r1h1y, - i1h1y, - r1hm2y, - i1hm2y, - r2h11y, - i2h11y, - r2h1m2y, - i2h1m2y); - - - - itemp = D1i2F12(here->gbs2, - here->gbs3, - r1h1y, - i1h1y, - r1hm2y, - i1hm2y, - r2h11y, - i2h11y, - r2h1m2y, - i2h1m2y); - - - *(ckt->CKTrhs + (here->MOS2bNode)) -= temp; - *(ckt->CKTirhs + (here->MOS2bNode)) -= itemp; - *(ckt->CKTrhs + (here->MOS2sNodePrime)) += temp; - *(ckt->CKTirhs + (here->MOS2sNodePrime)) += itemp; - - /* gbs over */ - - /* loading gbd term */ - - temp = D1n2F12(here->gbd2, - here->gbd3, - r1h1y - r1h1z, - i1h1y - i1h1z, - r1hm2y - r1hm2z, - i1hm2y - i1hm2z, - r2h11y - r2h11z, - i2h11y - i2h11z, - r2h1m2y - r2h1m2z, - i2h1m2y - i2h1m2z); - - itemp = D1i2F12(here->gbd2, - here->gbd3, - r1h1y - r1h1z, - i1h1y - i1h1z, - r1hm2y - r1hm2z, - i1hm2y - i1hm2z, - r2h11y - r2h11z, - i2h11y - i2h11z, - r2h1m2y - r2h1m2z, - i2h1m2y - i2h1m2z); - - *(ckt->CKTrhs + (here->MOS2bNode)) -= temp; - *(ckt->CKTirhs + (here->MOS2bNode)) -= itemp; - *(ckt->CKTrhs + (here->MOS2dNodePrime)) += temp; - *(ckt->CKTirhs + (here->MOS2dNodePrime)) += itemp; - - /* gbd over */ - - /* loading capgs term */ - - temp = -ckt->CKTomega * - D1i2F12(here->capgs2, - here->capgs3, - r1h1x, - i1h1x, - r1hm2x, - i1hm2x, - r2h11x, - i2h11x, - r2h1m2x, - i2h1m2x); - - itemp = ckt->CKTomega * - D1n2F12(here->capgs2, - here->capgs3, - r1h1x, - i1h1x, - r1hm2x, - i1hm2x, - r2h11x, - i2h11x, - r2h1m2x, - i2h1m2x); - - *(ckt->CKTrhs + (here->MOS2gNode)) -= temp; - *(ckt->CKTirhs + (here->MOS2gNode)) -= itemp; - *(ckt->CKTrhs + (here->MOS2sNodePrime)) += temp; - *(ckt->CKTirhs + (here->MOS2sNodePrime)) += itemp; - - /* capgs over */ - - /* loading capgd term */ - - temp = -ckt->CKTomega * - D1i2F12(here->capgd2, - here->capgd3, - r1h1x - r1h1z, - i1h1x - i1h1z, - r1hm2x - r1hm2z, - i1hm2x - i1hm2z, - r2h11x - r2h11z, - i2h11x - i2h11z, - r2h1m2x - r2h1m2z, - i2h1m2x - i2h1m2z); - - itemp = ckt->CKTomega * - D1n2F12(here->capgd2, - here->capgd3, - r1h1x - r1h1z, - i1h1x - i1h1z, - r1hm2x - r1hm2z, - i1hm2x - i1hm2z, - r2h11x - r2h11z, - i2h11x - i2h11z, - r2h1m2x - r2h1m2z, - i2h1m2x - i2h1m2z); - - - *(ckt->CKTrhs + (here->MOS2gNode)) -= temp; - *(ckt->CKTirhs + (here->MOS2gNode)) -= itemp; - *(ckt->CKTrhs + (here->MOS2dNodePrime)) += temp; - *(ckt->CKTirhs + (here->MOS2dNodePrime)) += itemp; - - /* capgd over */ - /* loading capgb term */ - - temp = -ckt->CKTomega * - D1i2F12(here->capgb2, - here->capgb3, - r1h1x - r1h1y, - i1h1x - i1h1y, - r1hm2x - r1hm2y, - i1hm2x - i1hm2y, - r2h11x - r2h11y, - i2h11x - i2h11y, - r2h1m2x - r2h1m2y, - i2h1m2x - i2h1m2y); - - itemp = ckt->CKTomega * - D1n2F12(here->capgb2, - here->capgb3, - r1h1x - r1h1y, - i1h1x - i1h1y, - r1hm2x - r1hm2y, - i1hm2x - i1hm2y, - r2h11x - r2h11y, - i2h11x - i2h11y, - r2h1m2x - r2h1m2y, - i2h1m2x - i2h1m2y); - - *(ckt->CKTrhs + (here->MOS2gNode)) -= temp; - *(ckt->CKTirhs + (here->MOS2gNode)) -= itemp; - *(ckt->CKTrhs + (here->MOS2bNode)) += temp; - *(ckt->CKTirhs + (here->MOS2bNode)) += itemp; - - /* capgb over */ - - /* loading capbs term */ - - temp = -ckt->CKTomega * - D1i2F12(here->capbs2, - here->capbs3, - r1h1y, - i1h1y, - r1hm2y, - i1hm2y, - r2h11y, - i2h11y, - r2h1m2y, - i2h1m2y); - - itemp = ckt->CKTomega * - D1n2F12(here->capbs2, - here->capbs3, - r1h1y, - i1h1y, - r1hm2y, - i1hm2y, - r2h11y, - i2h11y, - r2h1m2y, - i2h1m2y); - - - *(ckt->CKTrhs + (here->MOS2bNode)) -= temp; - *(ckt->CKTirhs + (here->MOS2bNode)) -= itemp; - *(ckt->CKTrhs + (here->MOS2sNodePrime)) += temp; - *(ckt->CKTirhs + (here->MOS2sNodePrime)) += itemp; - - /* capbs over */ - - /* loading capbd term */ - - temp = -ckt->CKTomega * - D1i2F12(here->capbd2, - here->capbd3, - r1h1y - r1h1z, - i1h1y - i1h1z, - r1hm2y - r1hm2z, - i1hm2y - i1hm2z, - r2h11y - r2h11z, - i2h11y - i2h11z, - r2h1m2y - r2h1m2z, - i2h1m2y - i2h1m2z); - - itemp = ckt->CKTomega * - D1n2F12(here->capbd2, - here->capbd3, - r1h1y - r1h1z, - i1h1y - i1h1z, - r1hm2y - r1hm2z, - i1hm2y - i1hm2z, - r2h11y - r2h11z, - i2h11y - i2h11z, - r2h1m2y - r2h1m2z, - i2h1m2y - i2h1m2z); - - - *(ckt->CKTrhs + (here->MOS2bNode)) -= temp; - *(ckt->CKTirhs + (here->MOS2bNode)) -= itemp; - *(ckt->CKTrhs + (here->MOS2dNodePrime)) += temp; - *(ckt->CKTirhs + (here->MOS2dNodePrime)) += itemp; - - /* capbd over */ - /* all done */ - - break; - default: -; - } - } -} -return(OK); -} - else - return(E_BADPARM); -} diff --git a/src/spicelib/devices/mos2/mos2dset.c b/src/spicelib/devices/mos2/mos2dset.c deleted file mode 100644 index a6459b63a..000000000 --- a/src/spicelib/devices/mos2/mos2dset.c +++ /dev/null @@ -1,1427 +0,0 @@ -/********** -Copyright 1990 Regents of the University of California. All rights reserved. -Author: 1988 Jaijeet S Roychowdhury -Modified: 2000 AlansFixes -**********/ - -#include "ngspice/ngspice.h" -#include "ngspice/distodef.h" -#include "ngspice/devdefs.h" -#include "ngspice/cktdefs.h" -#include "mos2defs.h" -#include "ngspice/trandefs.h" -#include "ngspice/const.h" -#include "ngspice/sperror.h" -#include "ngspice/suffix.h" - -/* assuming silicon - make definition for epsilon of silicon */ -#define EPSSIL (11.7 * 8.854214871e-12) - -static double sig1[4] = {1.0, -1.0, 1.0, -1.0}; -static double sig2[4] = {1.0, 1.0,-1.0, -1.0}; - -int -MOS2dSetup(GENmodel *inModel, CKTcircuit *ckt) - /* actually load the current value into the - * sparse matrix previously provided - */ -{ - MOS2model *model = (MOS2model *)inModel; - MOS2instance *here; - double Beta; - double DrainSatCur; - double EffectiveLength; - double GateBulkOverlapCap; - double GateDrainOverlapCap; - double GateSourceOverlapCap; - double OxideCap; - double SourceSatCur; - double arg; - double cdrain; - double ebd; - double evbs; - double sarg; - double sargsw; - double vbd; - double vbs; - double vds; - double vdsat; - double vgb; - double vgd; - double vgs; - double von; - double vt; /* K * T / Q */ - double lcapgs2; - double lcapgd2; - double lcapgb2; - double lcapgs3; - double lcapgd3; - double lcapgb3; - double lgbs, lgbs2, lgbs3; - double lgbd, lgbd2, lgbd3; - double vgst; - double lcapbs, lcapbs2, lcapbs3; - double lcapbd, lcapbd2, lcapbd3; - double gm2, gb2, gds2; - double gmb, gmds, gbds; - double gm3, gb3, gds3; - double gm2b, gm2ds, gmb2, gmds2, gbds2, gb2ds; - double gmbds; - Dderivs d_cdrain; - /*remove compiler warnings */ - d_cdrain.value = 0.0; - d_cdrain.d1_p = 0.0; - d_cdrain.d1_q = 0.0; - d_cdrain.d1_r = 0.0; - d_cdrain.d2_p2 = 0.0; - d_cdrain.d2_q2 = 0.0; - d_cdrain.d2_r2 = 0.0; - d_cdrain.d2_pq = 0.0; - d_cdrain.d2_qr = 0.0; - d_cdrain.d2_pr = 0.0; - d_cdrain.d3_p3 = 0.0; - d_cdrain.d3_q3 = 0.0; - d_cdrain.d3_r3 = 0.0; - d_cdrain.d3_p2q = 0.0; - d_cdrain.d3_p2r = 0.0; - d_cdrain.d3_pq2 = 0.0; - d_cdrain.d3_q2r = 0.0; - d_cdrain.d3_pr2 = 0.0; - d_cdrain.d3_qr2 = 0.0; - d_cdrain.d3_pqr = 0.0; - - /* loop through all the MOS2 device models */ - for( ; model != NULL; model = MOS2nextModel(model)) { - - /* loop through all the instances of the model */ - for (here = MOS2instances(model); here != NULL ; - here=MOS2nextInstance(here)) { - - vt = CONSTKoverQ * here->MOS2temp; - - EffectiveLength=here->MOS2l - 2*model->MOS2latDiff; - - if( (here->MOS2tSatCurDens == 0) || - (here->MOS2drainArea == 0) || - (here->MOS2sourceArea == 0)) { - DrainSatCur = here->MOS2m * here->MOS2tSatCur; - SourceSatCur = here->MOS2m * here->MOS2tSatCur; - } else { - DrainSatCur = here->MOS2tSatCurDens * - here->MOS2m * here->MOS2drainArea; - SourceSatCur = here->MOS2tSatCurDens * - here->MOS2m * here->MOS2sourceArea; - } - GateSourceOverlapCap = model->MOS2gateSourceOverlapCapFactor * - here->MOS2m * here->MOS2w; - GateDrainOverlapCap = model->MOS2gateDrainOverlapCapFactor * - here->MOS2m * here->MOS2w; - GateBulkOverlapCap = model->MOS2gateBulkOverlapCapFactor * - here->MOS2m * EffectiveLength; - Beta = here->MOS2tTransconductance * here->MOS2m * - here->MOS2w/EffectiveLength; - OxideCap = model->MOS2oxideCapFactor * EffectiveLength * - here->MOS2m * here->MOS2w; - - - - - - /* general iteration */ - - - vbs = model->MOS2type * ( - *(ckt->CKTrhsOld+here->MOS2bNode) - - *(ckt->CKTrhsOld+here->MOS2sNodePrime)); - vgs = model->MOS2type * ( - *(ckt->CKTrhsOld+here->MOS2gNode) - - *(ckt->CKTrhsOld+here->MOS2sNodePrime)); - vds = model->MOS2type * ( - *(ckt->CKTrhsOld+here->MOS2dNodePrime) - - *(ckt->CKTrhsOld+here->MOS2sNodePrime)); - - /* now some common crunching for some more useful quantities */ - - - vbd=vbs-vds; - vgd=vgs-vds; - - /* now all the preliminaries are over - we can start doing the * real work - */ - - vgb = vgs - vbs; - - /* bulk-source and bulk-drain doides here we just evaluate - * the ideal diode current and the correspoinding - * derivative (conductance). */ - if(vbs <= 0) { - lgbs = SourceSatCur/vt; - lgbs += ckt->CKTgmin; - lgbs2 = lgbs3 = 0; - } else { - evbs = exp(MIN(MAX_EXP_ARG,vbs/vt)); - lgbs = SourceSatCur*evbs/vt + ckt->CKTgmin; - lgbs2 = model->MOS2type *0.5 * (lgbs - ckt->CKTgmin)/vt; - lgbs3 = model->MOS2type *lgbs2/(vt*3); - - } - if(vbd <= 0) { - lgbd = DrainSatCur/vt; - lgbd += ckt->CKTgmin; - lgbd2 = lgbd3 = 0; - } else { - ebd = exp(MIN(MAX_EXP_ARG,vbd/vt)); - lgbd = DrainSatCur*ebd/vt +ckt->CKTgmin; - lgbd2 = model->MOS2type *0.5 * (lgbd - ckt->CKTgmin)/vt; - lgbd3 = model->MOS2type *lgbd2/(vt*3); - } - - if(vds >= 0) { - /* normal mode */ - here->MOS2mode = 1; - } else { - /* inverse mode */ - here->MOS2mode = -1; - } - { - /* moseq2(vds,vbs,vgs,gm,gds,gmbs,qg,qc,qb, - * cggb,cgdb,cgsb,cbgb,cbdb,cbsb) - */ - /* note: cgdb, cgsb, cbdb, cbsb never used */ - - /* - * this routine evaluates the drain current, its derivatives and * the charges associated with the gate, channel and bulk * for mosfets * - */ - - double arg1; - double sarg1; - double a4[4],b4[4],x4[8],poly4[8]; - double beta1; - double sphi = 0.0; /* square root of phi */ - double sphi3 = 0.0; /* square root of phi cubed */ - double barg; - double factor; - double eta; - double vbin; - double argd = 0.0; - double args = 0.0; - double argss; - double argsd; - double argxs; - double argxd; - double gamasd; - double xwd; - double xws; - double gammad; - double cfs; - double cdonco; - double xn; - double argg = 0.0; - double sarg3; - double sbiarg; - double body; - double udenom; - double gammd2; - double argv; - double vgsx; - double ufact; - double ueff; - double a1; - double a3; - double a; - double b1; - double b3; - double b; - double c1; - double c; - double d1; - double fi; - double p0; - double p2; - double p3; - double p4; - double p; - double r3; - double r; - double ro; - double s2; - double s; - double v1; - double v2; - double xv; - double y3; - double delta4; - double xvalid = 0.0; - double bsarg = 0.0; - double bodys = 0.0; - double sargv; - double xlfact; - double xdv; - double xlv; - double xls; - double clfact; - double xleff; - double deltal; - double xwb; - double vdson; - double cdson; - double expg; - double xld; - double xlamda = model->MOS2lambda; - Dderivs d_xleff, d_delta1; - Dderivs d_xlfact; - Dderivs d_xlv, d_xls; - Dderivs d_bsarg, d_bodys, d_vdsat, d_sargv; - Dderivs d_delta4, d_a4[3], d_b4[3], d_x4[3], d_poly4[3]; - Dderivs d_xvalid; - Dderivs d_ro, d_fi, d_y3, d_p3, d_p4, d_a3, d_b3; - Dderivs d_r3, d_s2, d_pee, d_p0, d_p2; - Dderivs d_b1, d_c1, d_d1, d_a, d_b, d_c, d_arr, d_s; - Dderivs d_xv, d_a1; - Dderivs d_v1, d_v2; - Dderivs d_argv,d_gammd2; - Dderivs d_ufact; - Dderivs d_udenom; - Dderivs d_sarg3, d_body; - Dderivs d_vgst; - Dderivs d_argg; - Dderivs d_cdonco,d_tmp,d_xn; - Dderivs d_dbargs,d_dbargd,d_dgddvb; - Dderivs d_dbxwd,d_dbxws; - Dderivs d_dsrgdb, d_dbrgdb; - Dderivs d_gamasd, d_gammad, d_args, d_argd; - Dderivs d_argxs, d_argxd; - Dderivs d_argss, d_argsd; - Dderivs d_xwd, d_xws; - Dderivs d_zero; - Dderivs d_vbin; - Dderivs d_barg; - Dderivs d_sarg; - Dderivs d_phiMinVbs; - Dderivs d_p, d_q, d_r; - Dderivs d_von, d_dummy, d_vgsx, d_arg, d_dumarg; - Dderivs d_ueff, d_beta1, d_clfact, d_xlamda,d_mos2gds; - Dderivs d_vdson, d_cdson, d_expg; - double dsrgdb, dbrgdb, dbxwd, dbxws, dbargs = 0.0, dbargd = 0.0; - double dgddvb; - - -/* from now on, p=vgs, q=vbs, r=vds */ - -/* - * 'local' variables - these switch d & s around appropriately - * so that we don't have to worry about vds < 0 - */ - - double lvbs = here->MOS2mode==1?vbs:vbd; - double lvds = here->MOS2mode*vds; - double lvgs = here->MOS2mode==1?vgs:vgd; - double phiMinVbs = here->MOS2tPhi - lvbs; - double tmp; /* a temporary variable, not used for more than */ - /* about 10 lines at a time */ - int iknt; - int jknt; - int i; - int j; - - /* - * compute some useful quantities - */ -d_p.value = 0.0; -d_p.d1_p = 1.0; -d_p.d1_q = 0.0; -d_p.d1_r = 0.0; -d_p.d2_p2 = 0.0; -d_p.d2_q2 = 0.0; -d_p.d2_r2 = 0.0; -d_p.d2_pq = 0.0; -d_p.d2_qr = 0.0; -d_p.d2_pr = 0.0; -d_p.d3_p3 = 0.0; -d_p.d3_q3 = 0.0; -d_p.d3_r3 = 0.0; -d_p.d3_p2r = 0.0; -d_p.d3_p2q = 0.0; -d_p.d3_q2r = 0.0; -d_p.d3_pq2 = 0.0; -d_p.d3_pr2 = 0.0; -d_p.d3_qr2 = 0.0; -d_p.d3_pqr = 0.0; - EqualDeriv(&d_q,&d_p); - EqualDeriv(&d_r,&d_p); - EqualDeriv(&d_zero,&d_p); - d_q.d1_p = d_r.d1_p = d_zero.d1_p = 0.0; - d_q.d1_q = d_r.d1_r = 1.0; - - EqualDeriv(&d_phiMinVbs,&d_q); - d_phiMinVbs.value = phiMinVbs; - d_phiMinVbs.d1_q = - d_phiMinVbs.d1_q; - - if (lvbs <= 0.0) { - sarg1 = sqrt(phiMinVbs); - SqrtDeriv(&d_sarg, &d_phiMinVbs); - dsrgdb = -0.5/sarg1; - InvDeriv(&d_dsrgdb,&d_sarg); - TimesDeriv(&d_dsrgdb,&d_dsrgdb,-0.5); - - } else { - sphi = sqrt(here->MOS2tPhi); /*const*/ - sphi3 = here->MOS2tPhi*sphi; /*const*/ - sarg1 = sphi/(1.0+0.5*lvbs/here->MOS2tPhi); - EqualDeriv(&d_sarg,&d_q); d_sarg.value = lvbs; - TimesDeriv(&d_sarg,&d_sarg,0.5/here->MOS2tPhi); - d_sarg.value += 1.0; - InvDeriv(&d_sarg,&d_sarg); - TimesDeriv(&d_sarg,&d_sarg,sphi); - dsrgdb = -0.5*sarg1*sarg1/sphi3; - MultDeriv(&d_dsrgdb,&d_sarg,&d_sarg); - TimesDeriv(&d_dsrgdb,&d_dsrgdb,-0.5/sphi3); - /* tmp = sarg/sphi3; */ - } - if ((lvds-lvbs) >= 0) { - barg = sqrt(phiMinVbs+lvds); - EqualDeriv(&d_barg,&d_phiMinVbs); - d_barg.value += lvds; d_barg.d1_r += 1.0; - SqrtDeriv(&d_barg,&d_barg); - dbrgdb = -0.5/barg; - InvDeriv(&d_dbrgdb,&d_barg); - TimesDeriv(&d_dbrgdb,&d_dbrgdb,-0.5); - } else { - sphi = sqrt(here->MOS2tPhi); /* added by HT 050523 */ - sphi3 = here->MOS2tPhi*sphi; /* added by HT 050523 */ - barg = sphi/(1.0+0.5*(lvbs-lvds)/here->MOS2tPhi); - EqualDeriv(&d_barg,&d_q); d_barg.value = lvbs - lvds; - d_barg.d1_r -= 1.0; - TimesDeriv(&d_barg,&d_barg,0.5/here->MOS2tPhi); - d_barg.value += 1.0; - InvDeriv(&d_barg,&d_barg); - TimesDeriv(&d_barg,&d_barg,sphi); - dbrgdb = -0.5*barg*barg/sphi3; - MultDeriv(&d_dbrgdb,&d_barg,&d_barg); - TimesDeriv(&d_dbrgdb,&d_dbrgdb,-0.5/sphi3); - /* tmp = barg/sphi3; */ - } - /* - * calculate threshold voltage (von) - * narrow-channel effect - */ - - /*XXX constant per device */ - factor = 0.125*model->MOS2narrowFactor*2.0*M_PI*EPSSIL/ - OxideCap*EffectiveLength; - /*XXX constant per device */ - eta = 1.0+factor; - vbin = here->MOS2tVbi*model->MOS2type+factor*phiMinVbs; - /* mistake! fixed Dec 7 '89 - TimesDeriv(&d_vbin,&d_phiMinVbs,here->MOS2tVbi* - model->MOS2type+factor); - */ - TimesDeriv(&d_vbin,&d_phiMinVbs,factor); - d_vbin.value += here->MOS2tVbi*model->MOS2type; - - if ((model->MOS2gamma > 0.0) || - (model->MOS2substrateDoping > 0.0)) { - xwd = model->MOS2xd*barg; - xws = model->MOS2xd*sarg1; - TimesDeriv(&d_xwd,&d_barg,model->MOS2xd); - TimesDeriv(&d_xws,&d_sarg,model->MOS2xd); - - /* - * short-channel effect with vds .ne. 0.0 */ - - argss = 0.0; - argsd = 0.0; - EqualDeriv(&d_argss,&d_zero); - EqualDeriv(&d_argsd,&d_zero); - if (model->MOS2junctionDepth > 0) { - tmp = 2.0/model->MOS2junctionDepth; /*const*/ - argxs = 1.0+xws*tmp; - TimesDeriv(&d_argxs,&d_xws,tmp); - d_argxs.value += 1.0; - argxd = 1.0+xwd*tmp; - TimesDeriv(&d_argxd,&d_xwd,tmp); - d_argxd.value += 1.0; - args = sqrt(argxs); - SqrtDeriv(&d_args,&d_argxs); - argd = sqrt(argxd); - SqrtDeriv(&d_argd,&d_argxd); - tmp = .5*model->MOS2junctionDepth/EffectiveLength; - argss = tmp * (args-1.0); - TimesDeriv(&d_argss,&d_args,tmp); - d_argss.value -= tmp; - argsd = tmp * (argd-1.0); - TimesDeriv(&d_argsd,&d_argd,tmp); - d_argsd.value -= tmp; - } - gamasd = model->MOS2gamma*(1.0-argss-argsd); - PlusDeriv(&d_gamasd,&d_argss,&d_argsd); - d_gamasd.value -= 1.0; - TimesDeriv(&d_gamasd,&d_gamasd,-model->MOS2gamma); - dbxwd = model->MOS2xd*dbrgdb; - dbxws = model->MOS2xd*dsrgdb; - TimesDeriv(&d_dbxwd,&d_dbrgdb,model->MOS2xd); - TimesDeriv(&d_dbxws,&d_dsrgdb,model->MOS2xd); - if (model->MOS2junctionDepth > 0) { - tmp = 0.5/EffectiveLength; - dbargs = tmp*dbxws/args; - dbargd = tmp*dbxwd/argd; - DivDeriv(&d_dbargs,&d_dbxws,&d_args); - DivDeriv(&d_dbargd,&d_dbxwd,&d_argd); - TimesDeriv(&d_dbargs,&d_dbargs,tmp); - TimesDeriv(&d_dbargd,&d_dbargd,tmp); - } - dgddvb = -model->MOS2gamma*(dbargs+dbargd); - PlusDeriv(&d_dgddvb,&d_dbargs,&d_dbargd); - TimesDeriv(&d_dgddvb,&d_dgddvb,-model->MOS2gamma); - if (model->MOS2junctionDepth > 0) { - } - } else { - gamasd = model->MOS2gamma; - gammad = model->MOS2gamma; - EqualDeriv(&d_gamasd,&d_zero); - EqualDeriv(&d_gammad,&d_zero); - d_gamasd.value = d_gammad.value = model->MOS2gamma; - dgddvb = 0.0; - EqualDeriv(&d_dgddvb,&d_zero); - } - von = vbin+gamasd*sarg1; - MultDeriv(&d_von,&d_gamasd,&d_sarg); - PlusDeriv(&d_von,&d_von,&d_vbin); - /* - vth = von; - EqualDeriv(&d_vth,&d_von); - */ - vdsat = 0.0; - EqualDeriv(&d_vdsat,&d_zero); - if (model->MOS2fastSurfaceStateDensity != 0.0 && OxideCap != 0.0) { - /* XXX constant per model */ - cfs = CHARGE*model->MOS2fastSurfaceStateDensity* - 1e4 /*(cm**2/m**2)*/; - cdonco = -(gamasd*dsrgdb + dgddvb*sarg1) + factor; - MultDeriv(&d_dummy,&d_dgddvb,&d_sarg); - MultDeriv(&d_cdonco,&d_gamasd,&d_dsrgdb); - PlusDeriv(&d_cdonco,&d_cdonco,&d_dummy); - TimesDeriv(&d_cdonco,&d_cdonco,-1.0); - d_cdonco.value += factor; - xn = 1.0+cfs/OxideCap*here->MOS2m*here->MOS2w*EffectiveLength+cdonco; - EqualDeriv(&d_xn,&d_cdonco); - d_xn.value = xn; - tmp = vt*xn; - TimesDeriv(&d_tmp,&d_xn,vt); - von = von+tmp; - PlusDeriv(&d_von,&d_von,&d_tmp); - argg = 1.0/tmp; - InvDeriv(&d_argg,&d_tmp); - vgst = lvgs-von; - TimesDeriv(&d_vgst,&d_von,-1.0); - PlusDeriv(&d_vgst,&d_vgst,&d_p); - d_vgst.value += lvgs; - } else { - vgst = lvgs-von; - TimesDeriv(&d_vgst,&d_von,-1.0); - PlusDeriv(&d_vgst,&d_vgst,&d_p); - d_vgst.value += lvgs; - - if (lvgs <= von) { - /* - * cutoff region */ - here->MOS2gds = 0.0; /* look at this later */ - goto line1050; - } - } - - /* - * compute some more useful quantities */ - - sarg3 = sarg1*sarg1*sarg1; - CubeDeriv(&d_sarg3,&d_sarg); - /* XXX constant per model */ - sbiarg = sqrt(here->MOS2tBulkPot); /*const*/ - gammad = gamasd; - EqualDeriv(&d_gammad,&d_gamasd); - body = barg*barg*barg-sarg3; - TimesDeriv(&d_body,&d_sarg3,-1.0); - CubeDeriv(&d_dummy,&d_barg); - PlusDeriv(&d_body,&d_body,&d_dummy); - if (model->MOS2fastSurfaceStateDensity == 0.0) goto line400; - if (OxideCap == 0.0) goto line410; - /* - * evaluate effective mobility and its derivatives */ -line400: - if (OxideCap <= 0.0) goto line410; - udenom = vgst; - EqualDeriv(&d_udenom,&d_vgst); - tmp = model->MOS2critField * 100 /* cm/m */ * EPSSIL/ - model->MOS2oxideCapFactor; - if (udenom <= tmp) goto line410; - ufact = exp(model->MOS2critFieldExp*log(tmp/udenom)); - /* dummy = tmp/udenom */ - InvDeriv(&d_dummy,&d_udenom); - TimesDeriv(&d_dummy,&d_dummy,tmp); - PowDeriv(&d_ufact,&d_dummy,model->MOS2critFieldExp); - ueff = model->MOS2surfaceMobility * 1e-4 /*(m**2/cm**2) */ *ufact; - TimesDeriv(&d_ueff,&d_ufact,model->MOS2surfaceMobility * 1e-4); - goto line500; -line410: - ufact = 0.0; - EqualDeriv(&d_ufact,&d_zero); - ueff = model->MOS2surfaceMobility * 1e-4 /*(m**2/cm**2) */ ; - EqualDeriv(&d_ueff,&d_zero); - d_ueff.value = ueff; - - /* - * evaluate saturation voltage and its derivatives according to - * grove-frohman equation */ -line500: - vgsx = lvgs; - EqualDeriv(&d_vgsx,&d_p); d_vgsx.value = lvgs; - gammad = gamasd/eta; /* eta is a constant */ - TimesDeriv(&d_gammad,&d_gamasd,1/eta); - if (model->MOS2fastSurfaceStateDensity != 0 && OxideCap != 0) { - vgsx = MAX(lvgs,von); - /* mistake! fixed Dec 8 '89 if (vgsx < von) { } */ - if (lvgs > von) { - EqualDeriv(&d_vgsx,&d_p);d_vgsx.value = lvgs; - } else { - EqualDeriv(&d_vgsx,&d_von); - } - } - - if (gammad > 0) { - gammd2 = gammad*gammad; - MultDeriv(&d_gammd2,&d_gammad,&d_gammad); - argv = (vgsx-vbin)/eta+phiMinVbs; - TimesDeriv(&d_argv,&d_vbin,-1.0); - PlusDeriv(&d_argv,&d_vgsx,&d_vgsx); - TimesDeriv(&d_argv,&d_argv,1/eta); - PlusDeriv(&d_argv,&d_argv,&d_phiMinVbs); - if (argv <= 0.0) { - vdsat = 0.0; - EqualDeriv(&d_vdsat,&d_zero); - } else { - arg1 = sqrt(1.0+4.0*argv/gammd2); - DivDeriv(&d_arg,&d_argv,&d_gammd2); - TimesDeriv(&d_arg,&d_arg,4.0);d_arg.value += 1.0; - SqrtDeriv(&d_arg,&d_arg); -#if 0 - dumarg= sqrt(gammd2*gammd2 +4*argv*gammd2); - TimesDeriv(&d_dumarg,&d_argv,4.0); - PlusDeriv(&d_dumarg,&d_dumarg,&d_gammd2); - MultDeriv(&d_dumarg,&d_dumarg,&d_gammd2); - SqrtDeriv(&d_dumarg,&d_dumarg); - - vdsat = (vgsx-vbin)/eta+gammd2*(1.0-arg)/2.0; - /* distortion vdsat=(vgsx-vbin)/eta + (gammd2 - dumarg)/2.0 - = argv - phiMinVbs + (gammd2 - dumarg)/2 */ -#endif - TimesDeriv(&d_dummy,&d_dumarg,-1.0); - PlusDeriv(&d_dummy,&d_dummy,&d_gammd2); - TimesDeriv(&d_dummy,&d_dummy,0.5); - TimesDeriv(&d_vdsat,&d_phiMinVbs,-1.0); - PlusDeriv(&d_vdsat,&d_vdsat,&d_argv); - PlusDeriv(&d_vdsat,&d_dummy,&d_vdsat); - vdsat = MAX(vdsat,0.0); - if (vdsat < 0.0) { - EqualDeriv(&d_vdsat,&d_zero); - } - } - } else { - vdsat = (vgsx-vbin)/eta; - TimesDeriv(&d_vdsat,&d_vbin,-1.0); - PlusDeriv(&d_vdsat,&d_vgsx,&d_vdsat); - TimesDeriv(&d_vdsat,&d_vdsat,1/eta); - vdsat = MAX(vdsat,0.0); - if (vdsat < 0.0) { - EqualDeriv(&d_vdsat,&d_zero); - } - } - if (model->MOS2maxDriftVel > 0) { - /* - * evaluate saturation voltage and its derivatives - * according to baum's theory of scattering velocity - * saturation - */ - gammd2 = gammad*gammad; - MultDeriv(&d_gammd2,&d_gammad,&d_gammad); - v1 = (vgsx-vbin)/eta+phiMinVbs; - TimesDeriv(&d_v1,&d_vbin,-1.0); -#if 0 - /* mistake ! (fixed Dec 7 '89) thanks to Jean Hsu */ - PlusDeriv(&d_v1,&d_vgsx,&d_vgsx); -#endif - PlusDeriv(&d_v1,&d_v1,&d_vgsx); - TimesDeriv(&d_v1,&d_v1,1/eta); - PlusDeriv(&d_v1,&d_v1,&d_phiMinVbs); - v2 = phiMinVbs; - EqualDeriv(&d_v2,&d_phiMinVbs); - xv = model->MOS2maxDriftVel*EffectiveLength/ueff; - InvDeriv(&d_xv,&d_ueff); - TimesDeriv(&d_xv,&d_xv,model->MOS2maxDriftVel*EffectiveLength); - a1 = gammad/0.75; - TimesDeriv(&d_a1,&d_gammad,4.0/3.0); - /* dummy1 = a1 */ - b1 = -2.0*(v1+xv); - PlusDeriv(&d_b1,&d_v1,&d_xv); - TimesDeriv(&d_b1,&d_b1,-2.0); - /* dummy2 = b1 */ - c1 = -2.0*gammad*xv; - MultDeriv(&d_c1,&d_gammad,&d_xv); - TimesDeriv(&d_c1,&d_c1,-2.0); - /* dummy3 = c1 */ - d1 = 2.0*v1*(v2+xv)-v2*v2-4.0/3.0*gammad*sarg3; - MultDeriv(&d_d1,&d_gammad,&d_sarg3); - TimesDeriv(&d_d1,&d_d1,4.0/3.0); - MultDeriv(&d_dummy,&d_v2,&d_v2); - PlusDeriv(&d_d1,&d_d1,&d_dummy); - TimesDeriv(&d_d1,&d_d1,-1.0); - PlusDeriv(&d_dummy,&d_v2,&d_xv); - MultDeriv(&d_dummy,&d_dummy,&d_v1); - TimesDeriv(&d_dummy,&d_dummy,2.0); - PlusDeriv(&d_d1,&d_d1,&d_dummy); - a = -b1; - TimesDeriv(&d_a,&d_b1,-1.0); - b = a1*c1-4.0*d1; - TimesDeriv(&d_b,&d_d1,-4.0); - MultDeriv(&d_dummy,&d_a1,&d_c1); - /* mistake! - fixed Dec 8 '89 - PlusDeriv(&d_d1,&d_d1,&d_dummy); - */ - PlusDeriv(&d_b,&d_b,&d_dummy); - c = -d1*(a1*a1-4.0*b1)-c1*c1; - TimesDeriv(&d_dummy,&d_b1,-4.0); - MultDeriv(&d_c,&d_a1,&d_a1); - PlusDeriv(&d_dummy,&d_dummy,&d_c); - MultDeriv(&d_c,&d_dummy,&d_d1); - MultDeriv(&d_dummy,&d_c1,&d_c1); - PlusDeriv(&d_c,&d_c,&d_dummy); - TimesDeriv(&d_c,&d_c,-1.0); - - r = -a*a/3.0+b; - MultDeriv(&d_arr,&d_a,&d_a); - TimesDeriv(&d_arr,&d_arr,-1.0/3.0); - PlusDeriv(&d_arr,&d_arr,&d_b); - - s = 2.0*a*a*a/27.0-a*b/3.0+c; - CubeDeriv(&d_s,&d_a); - TimesDeriv(&d_s,&d_s,2.0/27.0); - PlusDeriv(&d_s,&d_s,&d_c); - MultDeriv(&d_dummy,&d_a,&d_b); - TimesDeriv(&d_dummy,&d_dummy,-1.0/3.0); - PlusDeriv(&d_s,&d_s,&d_dummy); - - r3 = r*r*r; - CubeDeriv(&d_r3,&d_arr); - - s2 = s*s; - MultDeriv(&d_s2,&d_s,&d_s); - - p = s2/4.0+r3/27.0; - TimesDeriv(&d_dummy,&d_r3,1.0/27.0); - TimesDeriv(&d_pee,&d_s2,0.25); - PlusDeriv(&d_pee,&d_pee,&d_dummy); - p0 = fabs(p); - if (p < 0.0) - /* mistake! fixed Dec 8 '89 - TimesDeriv(&d_pee,&d_pee, -1.0); - */ - TimesDeriv(&d_p0,&d_pee, -1.0); - p2 = sqrt(p0); - SqrtDeriv(&d_p2,&d_p0); - if (p < 0) { - ro = sqrt(s2/4.0+p0); - ro = log(ro)/3.0; - ro = exp(ro); - /* the above is eqvt. to - ro = (s2/4.0 + p0)^1/6; */ - TimesDeriv(&d_ro,&d_s2,0.25); - PlusDeriv(&d_ro,&d_ro,&d_p0); - PowDeriv(&d_ro,&d_ro,1.0/6.0); - fi = atan(-2.0*p2/s); - DivDeriv(&d_fi,&d_p2,&d_s); - TimesDeriv(&d_fi,&d_fi,-2.0); - AtanDeriv(&d_fi,&d_fi); - y3 = 2.0*ro*cos(fi/3.0)-a/3.0; - TimesDeriv(&d_dummy,&d_fi,1.0/3.0); - CosDeriv(&d_dummy,&d_dummy); - MultDeriv(&d_y3,&d_ro,&d_dummy); - TimesDeriv(&d_y3,&d_y3,2.0); - /* mistake! fixed Dec 8 '89 - TimesDeriv(&d_dummy,&d_a,-3.0); - */ - TimesDeriv(&d_dummy,&d_a,-1/3.0); - PlusDeriv(&d_y3,&d_y3,&d_dummy); - } else { - p3 = (-s/2.0+p2); - TimesDeriv(&d_p3,&d_s,-0.5); - PlusDeriv(&d_p3,&d_p3,&d_p2); - p3 = exp(log(fabs(p3))/3.0); - /* eqvt. to (fabs(p3)) ^ 1/3 */ - if (p3 < 0.0) - TimesDeriv(&d_p3,&d_p3,-1.0); - PowDeriv(&d_p3,&d_p3,1.0/3.0); - p4 = (-s/2.0-p2); - TimesDeriv(&d_p4,&d_s,0.5); - PlusDeriv(&d_p4,&d_p4,&d_p2); - if (p4 < 0.0) - TimesDeriv(&d_p4,&d_p4,-1.0); /* this is fabs(p4) */ - p4 = exp(log(fabs(p4))/3.0); - PowDeriv(&d_p4,&d_p4,1.0/3.0); - - y3 = p3+p4-a/3.0; - TimesDeriv(&d_y3,&d_a,-1.0/3.0); - PlusDeriv(&d_y3,&d_y3,&d_p4); - PlusDeriv(&d_y3,&d_y3,&d_p3); - } - iknt = 0; - a3 = sqrt(a1*a1/4.0-b1+y3); - MultDeriv(&d_a3,&d_a1,&d_a1); - TimesDeriv(&d_a3,&d_a3,0.25); - PlusDeriv(&d_a3,&d_a3,&d_y3); - TimesDeriv(&d_dummy,&d_b1,-1.0); - PlusDeriv(&d_a3,&d_a3,&d_dummy); - SqrtDeriv(&d_a3,&d_a3); - - b3 = sqrt(y3*y3/4.0-d1); - MultDeriv(&d_b3,&d_y3,&d_y3); - TimesDeriv(&d_b3,&d_b3,0.25); - TimesDeriv(&d_dummy,&d_d1,-1.0); - PlusDeriv(&d_b3,&d_b3,&d_dummy); - SqrtDeriv(&d_b3,&d_b3); - - for(i = 1;i<=4;i++) { - a4[i-1] = a1/2.0+sig1[i-1]*a3; - TimesDeriv(&d_a4[i-1],&d_a1,0.5); - TimesDeriv(&d_dummy,&d_a3,sig1[i-1]); - PlusDeriv(&d_a4[i-1],&d_a4[i-1],&d_dummy); - b4[i-1] = y3/2.0+sig2[i-1]*b3; - TimesDeriv(&d_b4[i-1],&d_y3,0.5); - TimesDeriv(&d_dummy,&d_b3,sig2[i-1]); - PlusDeriv(&d_b4[i-1],&d_b4[i-1],&d_dummy); - delta4 = a4[i-1]*a4[i-1]/4.0-b4[i-1]; - MultDeriv(&d_delta4,&d_a4[i-1],&d_a4[i-1]); - TimesDeriv(&d_delta4,&d_delta4,0.25); - TimesDeriv(&d_dummy,&d_b4[i-1],-1.0); - PlusDeriv(&d_delta4,&d_delta4,&d_dummy); - - if (delta4 < 0) continue; - iknt = iknt+1; - tmp = sqrt(delta4); - SqrtDeriv(&d_tmp,&d_delta4); - x4[iknt-1] = -a4[i-1]/2.0+tmp; - TimesDeriv(&d_x4[iknt-1],&d_a4[i-1],-0.5); - PlusDeriv(&d_x4[iknt-1],&d_x4[iknt-1],&d_tmp); - iknt = iknt+1; - x4[iknt-1] = -a4[i-1]/2.0-tmp; - TimesDeriv(&d_x4[iknt-1],&d_a4[i-1],-0.5); - PlusDeriv(&d_x4[iknt-1],&d_x4[iknt-1],&d_tmp); - } - jknt = 0; - for(j = 1;j<=iknt;j++) { - if (x4[j-1] <= 0) continue; - /* XXX implement this sanely */ - poly4[j-1] = x4[j-1]*x4[j-1]*x4[j-1]*x4[j-1]+a1*x4[j-1]* - x4[j-1]*x4[j-1]; - CubeDeriv(&d_dummy,&d_x4[j-1]); - PlusDeriv(&d_poly4[j-1],&d_x4[j-1],&d_a1); - MultDeriv(&d_poly4[j-1],&d_poly4[j-1],&d_dummy); - poly4[j-1] = poly4[j-1]+b1*x4[j-1]*x4[j-1]+c1*x4[j-1]+d1; - PlusDeriv(&d_poly4[j-1],&d_poly4[j-1],&d_d1); - MultDeriv(&d_dummy,&d_b1,&d_x4[j-1]); - PlusDeriv(&d_dummy,&d_dummy,&d_c1); - MultDeriv(&d_dummy,&d_dummy,&d_x4[j-1]); - PlusDeriv(&d_poly4[j-1],&d_poly4[j-1],&d_dummy); - if (fabs(poly4[j-1]) > 1.0e-6) continue; - jknt = jknt+1; - if (jknt <= 1) { - xvalid = x4[j-1]; - EqualDeriv(&d_xvalid,&d_x4[j-1]); - } - if (x4[j-1] > xvalid) continue; - xvalid = x4[j-1]; - EqualDeriv(&d_xvalid,&d_x4[j-1]); - } - if (jknt > 0) { - vdsat = xvalid*xvalid-phiMinVbs; - MultDeriv(&d_vdsat,&d_xvalid,&d_xvalid); - TimesDeriv(&d_dummy,&d_phiMinVbs,-1.0); - PlusDeriv(&d_vdsat,&d_vdsat,&d_dummy); - } - } - /* - * evaluate effective channel length and its derivatives */ - if (lvds != 0.0) { - gammad = gamasd; - EqualDeriv(&d_gammad,&d_gamasd); - if ((lvbs-vdsat) <= 0) { - bsarg = sqrt(vdsat+phiMinVbs); - PlusDeriv(&d_bsarg,&d_vdsat,&d_phiMinVbs); - SqrtDeriv(&d_bsarg,&d_bsarg); - - } else { - bsarg = sphi/(1.0+0.5*(lvbs-vdsat)/here->MOS2tPhi); - TimesDeriv(&d_bsarg,&d_vdsat,-1.0); - d_bsarg.value += lvbs; d_bsarg.d1_r += 1.0; - TimesDeriv(&d_bsarg,&d_bsarg,0.5/here->MOS2tPhi); - d_bsarg.value += 1.0; - InvDeriv(&d_bsarg,&d_bsarg); - TimesDeriv(&d_bsarg,&d_bsarg,sphi); - - } - bodys = bsarg*bsarg*bsarg-sarg3; - CubeDeriv(&d_bodys,&d_bsarg); - TimesDeriv(&d_dummy,&d_sarg3,-1.0); - PlusDeriv(&d_bodys,&d_bodys,&d_dummy); - if (model->MOS2maxDriftVel <= 0) { - if (model->MOS2substrateDoping == 0.0) goto line610; - if (xlamda > 0.0) goto line610; - argv = (lvds-vdsat)/4.0; - TimesDeriv(&d_argv,&d_vdsat,-1.0); - d_argv.value += lvds; d_argv.d1_r += 1.0; - TimesDeriv(&d_argv,&d_argv,0.25); - - sargv = sqrt(1.0+argv*argv); - MultDeriv(&d_sargv,&d_argv,&d_argv); - d_sargv.value += 1.0; - SqrtDeriv(&d_sargv,&d_sargv); - arg1 = sqrt(argv+sargv); - PlusDeriv(&d_arg,&d_sargv,&d_argv); - SqrtDeriv(&d_arg,&d_arg); - xlfact = model->MOS2xd/(EffectiveLength*lvds); - EqualDeriv(&d_xlfact,&d_r); d_xlfact.value = lvds; - InvDeriv(&d_xlfact,&d_xlfact); - TimesDeriv(&d_xlfact,&d_xlfact,model->MOS2xd/EffectiveLength); - xlamda = xlfact*arg1; - MultDeriv(&d_xlamda,&d_xlfact,&d_arg); - } else { - argv = (vgsx-vbin)/eta-vdsat; - TimesDeriv(&d_argv,&d_vbin,-1.0); - PlusDeriv(&d_argv,&d_argv,&d_vgsx); - TimesDeriv(&d_argv,&d_argv,1/eta); - TimesDeriv(&d_dummy,&d_vdsat,-1.0); - PlusDeriv(&d_argv,&d_argv,&d_dummy); - xdv = model->MOS2xd/sqrt(model->MOS2channelCharge); /*const*/ - xlv = model->MOS2maxDriftVel*xdv/(2.0*ueff); - InvDeriv(&d_xlv,&d_ueff); - TimesDeriv(&d_xlv,&d_xlv,model->MOS2maxDriftVel*xdv*0.5); - /* retained for historical interest - vqchan = argv-gammad*bsarg; - MultDeriv(&d_vqchan,&d_gammad,&d_bsarg); - TimesDeriv(&d_vqchan,&d_vqchan,-1); - PlusDeriv(&d_vqchan,&d_vqchan,&d_argv); - */ - /* gammad = gamasd - vl = model->MOS2maxDriftVel*EffectiveLength;const*/ - if (model->MOS2substrateDoping == 0.0) goto line610; - if (xlamda > 0.0) goto line610; - argv = lvds-vdsat; - TimesDeriv(&d_argv,&d_vdsat,-1.0); - d_argv.value += lvds; - d_argv.d1_r += 1.0; - if (argv < 0.0) - EqualDeriv(&d_argv,&d_zero); - argv = MAX(argv,0.0); - xls = sqrt(xlv*xlv+argv); - MultDeriv(&d_xls,&d_xlv,&d_xlv); - PlusDeriv(&d_xls,&d_xls,&d_argv); - SqrtDeriv(&d_xls,&d_xls); - /* dummy9 = xlv*xlv + argv */ - xlfact = xdv/(EffectiveLength*lvds); - EqualDeriv(&d_xlfact,&d_r); - d_xlfact.value += lvds; - InvDeriv(&d_xlfact,&d_xlfact); - TimesDeriv(&d_xlfact,&d_xlfact,xdv/EffectiveLength); - xlamda = xlfact*(xls-xlv); - TimesDeriv(&d_xlamda,&d_xlv,-1.0); - PlusDeriv(&d_xlamda,&d_xlamda,&d_xls); - MultDeriv(&d_xlamda,&d_xlamda,&d_xlfact); - - } - } -line610: - - /* - * limit channel shortening at punch-through */ - xwb = model->MOS2xd*sbiarg; /*const*/ - xld = EffectiveLength-xwb; /*const*/ - clfact = 1.0-xlamda*lvds; - EqualDeriv(&d_clfact,&d_r); d_clfact.value = lvds; - d_clfact.d1_r = -1; - MultDeriv(&d_clfact,&d_clfact,&d_xlamda); - d_clfact.value += 1.0; - xleff = EffectiveLength*clfact; - TimesDeriv(&d_xleff,&d_clfact,EffectiveLength); - deltal = xlamda*lvds*EffectiveLength; - EqualDeriv(&d_delta1,&d_r); - d_delta1.value = EffectiveLength*lvds; - d_delta1.d1_r = EffectiveLength; - MultDeriv(&d_delta1,&d_delta1,&d_xlamda); - - - if (model->MOS2substrateDoping == 0.0) xwb = 0.25e-6; - if (xleff < xwb) { - xleff = xwb/(1.0+(deltal-xld)/xwb); - EqualDeriv(&d_xleff,&d_delta1);d_xleff.value -= xld; - TimesDeriv(&d_xleff,&d_xleff,1/xwb);d_xleff.value += 1.0; - InvDeriv(&d_xleff,&d_xleff); - TimesDeriv(&d_xleff,&d_xleff,xwb); - clfact = xleff/EffectiveLength; - TimesDeriv(&d_clfact,&d_xleff,1/EffectiveLength); - - /* dfact = xleff*xleff/(xwb*xwb); */ - } - /* - * evaluate effective beta (effective kp) - */ - beta1 = Beta*ufact/clfact; - DivDeriv(&d_beta1,&d_ufact,&d_clfact); - TimesDeriv(&d_beta1,&d_beta1,Beta); - /* - * test for mode of operation and branch appropriately */ - gammad = gamasd; - EqualDeriv(&d_gammad,&d_gamasd); - if (lvds <= 1.0e-10) { - if (lvgs <= von) { - if ((model->MOS2fastSurfaceStateDensity == 0.0) || - (OxideCap == 0.0)) { - here->MOS2gds = 0.0; - d_cdrain.d1_q = 0.0; - d_cdrain.d2_q2 = 0.0; - d_cdrain.d3_q3 = 0.0; - goto line1050; - } - - here->MOS2gds = beta1*(von-vbin-gammad*sarg1)*exp(argg* - (lvgs-von)); - MultDeriv(&d_dummy,&d_gammad,&d_sarg); - PlusDeriv(&d_dummy,&d_dummy,&d_vbin); - TimesDeriv(&d_dummy,&d_dummy,-1.0); - PlusDeriv(&d_dummy,&d_dummy,&d_von); - MultDeriv(&d_mos2gds,&d_beta1,&d_dummy); - TimesDeriv(&d_dummy,&d_von,-1.0); - PlusDeriv(&d_dummy,&d_dummy,&d_p); - d_dummy.value += lvgs; - MultDeriv(&d_dummy,&d_dummy,&d_argg); - ExpDeriv(&d_dummy,&d_dummy); - MultDeriv(&d_mos2gds,&d_mos2gds,&d_dummy); - d_cdrain.d1_r = d_mos2gds.value; - d_cdrain.d2_r2 = d_mos2gds.d1_r; - d_cdrain.d3_r3 = d_mos2gds.d2_r2; - /* dummy1 = von - vbin - gamasd*sarg */ - goto line1050; - } - - - here->MOS2gds = beta1*(lvgs-vbin-gammad*sarg1); - MultDeriv(&d_mos2gds,&d_gammad,&d_sarg); - PlusDeriv(&d_mos2gds,&d_mos2gds,&d_vbin); - TimesDeriv(&d_mos2gds,&d_mos2gds,-1.0); - MultDeriv(&d_mos2gds,&d_mos2gds,&d_beta1); - d_cdrain.d1_r = d_mos2gds.value; - d_cdrain.d2_r2 = d_mos2gds.d1_r; - d_cdrain.d3_r3 = d_mos2gds.d2_r2; - - goto line1050; - } - - if (lvgs > von) goto line900; - /* - * subthreshold region */ - if (vdsat <= 0) { - here->MOS2gds = 0.0; - d_cdrain.d1_r = 0.0; - d_cdrain.d2_r2 = 0.0; - d_cdrain.d3_r3 = 0.0; - /* if (lvgs > vth) goto doneval; */ - goto line1050; - } - vdson = MIN(vdsat,lvds); - if (vdsat <= lvds) { - EqualDeriv(&d_vdson,&d_vdsat); - } else { - EqualDeriv(&d_vdson,&d_r); - d_vdson.value = lvds; - } - if (lvds > vdsat) { - barg = bsarg; - EqualDeriv(&d_barg,&d_bsarg); - body = bodys; - EqualDeriv(&d_body,&d_bodys); - } - cdson = beta1*((von-vbin-eta*vdson*0.5)*vdson-gammad*body/1.5); - MultDeriv(&d_dummy,&d_gammad,&d_body); - TimesDeriv(&d_cdson,&d_dummy,-1/1.5); - TimesDeriv(&d_dummy,&d_vdson,0.5*eta); - PlusDeriv(&d_dummy,&d_dummy,&d_vbin); - TimesDeriv(&d_dummy,&d_dummy,-1.0); - PlusDeriv(&d_dummy,&d_dummy,&d_von); - MultDeriv(&d_dummy,&d_dummy,&d_vdson); - PlusDeriv(&d_dummy,&d_dummy,&d_cdson); - MultDeriv(&d_cdson,&d_dummy,&d_beta1); - expg = exp(argg*(lvgs-von)); - TimesDeriv(&d_expg,&d_von,-1.0); - d_expg.value += lvgs; - d_expg.d1_p += 1.0; - MultDeriv(&d_expg,&d_expg,&d_argg); - ExpDeriv(&d_expg,&d_expg); - - cdrain = cdson*expg; - MultDeriv(&d_cdrain,&d_cdson,&d_expg); - /* - gmw = cdrain*argg; - here->MOS2gm = gmw; - tmp = gmw*(lvgs-von)/xn; - */ - goto doneval; - -line900: - if (lvds <= vdsat) { - /* - * linear region */ - cdrain = beta1*((lvgs-vbin-eta*lvds/2.0)*lvds-gammad*body/1.5); - MultDeriv(&d_dummy,&d_gammad,&d_body); - TimesDeriv(&d_dummy,&d_dummy,-1/1.5); - EqualDeriv(&d_cdrain,&d_r); - d_cdrain.value = eta*lvds*0.5; - d_cdrain.d1_r = 0.5*eta; - PlusDeriv(&d_cdrain,&d_cdrain,&d_vbin); - TimesDeriv(&d_cdrain,&d_cdrain,-1.0); - d_cdrain.value += lvgs; - d_cdrain.d1_p += 1.0; - EqualDeriv(&d_dummy,&d_r); - d_dummy.value = lvds; - MultDeriv(&d_cdrain,&d_cdrain,&d_dummy); - MultDeriv(&d_dummy,&d_gammad,&d_body); - TimesDeriv(&d_dummy,&d_dummy,-1/1.5); - PlusDeriv(&d_cdrain,&d_cdrain,&d_dummy); - MultDeriv(&d_cdrain,&d_cdrain,&d_beta1); - } else { - /* - * saturation region */ - cdrain = beta1*((lvgs-vbin-eta* - vdsat/2.0)*vdsat-gammad*bodys/1.5); - TimesDeriv(&d_cdrain,&d_vdsat,0.5*eta); - PlusDeriv(&d_cdrain,&d_cdrain,&d_vbin); - TimesDeriv(&d_cdrain,&d_cdrain,-1.0); - d_cdrain.value += lvgs; - d_cdrain.d1_p += 1.0; - MultDeriv(&d_cdrain,&d_cdrain,&d_vdsat); - MultDeriv(&d_dummy,&d_gammad,&d_bodys); - TimesDeriv(&d_dummy,&d_dummy,-1/1.5); - PlusDeriv(&d_cdrain,&d_cdrain,&d_dummy); - MultDeriv(&d_cdrain,&d_cdrain,&d_beta1); - } - /* - * compute charges for "on" region */ - goto doneval; - /* - * finish special cases */ -line1050: - cdrain = 0.0; - here->MOS2gm = 0.0; - here->MOS2gmbs = 0.0; -d_cdrain.value = 0.0; -d_cdrain.d1_p = 0.0; -d_cdrain.d1_q = 0.0; -d_cdrain.d2_p2 = 0.0; -d_cdrain.d2_q2 = 0.0; -d_cdrain.d2_pq = 0.0; -d_cdrain.d2_qr = 0.0; -d_cdrain.d2_pr = 0.0; -d_cdrain.d3_p3 = 0.0; -d_cdrain.d3_q3 = 0.0; -d_cdrain.d3_p2r = 0.0; -d_cdrain.d3_p2q = 0.0; -d_cdrain.d3_q2r = 0.0; -d_cdrain.d3_pq2 = 0.0; -d_cdrain.d3_pr2 = 0.0; -d_cdrain.d3_qr2 = 0.0; -d_cdrain.d3_pqr = 0.0; -} - - /* - * finished - */ - -/*================HERE=================*/ -doneval: - /* - * COMPUTE EQUIVALENT DRAIN CURRENT SOURCE - */ - /* - * now we do the hard part of the bulk-drain and bulk-source - * diode - we evaluate the non-linear capacitance and - * charge - * the basic equations are not hard, but the implementation - * is somewhat long in an attempt to avoid log/exponential - * evaluations - */ - /* - * charge storage elements * - *.. bulk-drain and bulk-source depletion capacitances - */ - if (vbs < here->MOS2tDepCap){ - arg=1-vbs/here->MOS2tBulkPot; - /* - * the following block looks somewhat long and messy, - * but since most users use the default grading - * coefficients of .5, and sqrt is MUCH faster than an - * exp(log()) we use this special case code to buy time. - * (as much as 10% of total job time!) - */ - if(model->MOS2bulkJctBotGradingCoeff == - model->MOS2bulkJctSideGradingCoeff) { - if(model->MOS2bulkJctBotGradingCoeff == .5) { - sarg = sargsw = 1/sqrt(arg); - } else { - sarg = sargsw = - exp(-model->MOS2bulkJctBotGradingCoeff* - log(arg)); - } - } else { - if(model->MOS2bulkJctBotGradingCoeff == .5) { - sarg = 1/sqrt(arg); - } else { - sarg = exp(-model->MOS2bulkJctBotGradingCoeff* - log(arg)); - } - if(model->MOS2bulkJctSideGradingCoeff == .5) { - sargsw = 1/sqrt(arg); - } else { - sargsw =exp(-model->MOS2bulkJctSideGradingCoeff* - log(arg)); - } - } - lcapbs=here->MOS2Cbs*sarg+ - here->MOS2Cbssw*sargsw; - lcapbs2 = model->MOS2type*0.5/here->MOS2tBulkPot*( - here->MOS2Cbs*model->MOS2bulkJctBotGradingCoeff* - sarg/arg + here->MOS2Cbssw* - model->MOS2bulkJctSideGradingCoeff*sargsw/arg); - lcapbs3 = here->MOS2Cbs*sarg* - model->MOS2bulkJctBotGradingCoeff* - (model->MOS2bulkJctBotGradingCoeff+1); - lcapbs3 += here->MOS2Cbssw*sargsw* - model->MOS2bulkJctSideGradingCoeff* - (model->MOS2bulkJctSideGradingCoeff+1); - lcapbs3 = lcapbs3/(6*here->MOS2tBulkPot* - here->MOS2tBulkPot*arg*arg); - } else { - /* *(ckt->CKTstate0 + here->MOS2qbs)= here->MOS2f4s + - vbs*(here->MOS2f2s+vbs*(here->MOS2f3s/2));*/ - lcapbs=here->MOS2f2s+here->MOS2f3s*vbs; - lcapbs2 = 0.5*here->MOS2f3s; - lcapbs3 = 0; - } - if (vbd < here->MOS2tDepCap) { - arg=1-vbd/here->MOS2tBulkPot; - /* - * the following block looks somewhat long and messy, - * but since most users use the default grading - * coefficients of .5, and sqrt is MUCH faster than an - * exp(log()) we use this special case code to buy time. - * (as much as 10% of total job time!) - */ - if(model->MOS2bulkJctBotGradingCoeff == .5 && - model->MOS2bulkJctSideGradingCoeff == .5) { - sarg = sargsw = 1/sqrt(arg); - } else { - if(model->MOS2bulkJctBotGradingCoeff == .5) { - sarg = 1/sqrt(arg); - } else { - sarg = exp(-model->MOS2bulkJctBotGradingCoeff* - log(arg)); - } - if(model->MOS2bulkJctSideGradingCoeff == .5) { - sargsw = 1/sqrt(arg); - } else { - sargsw =exp(-model->MOS2bulkJctSideGradingCoeff* - log(arg)); - } - } - lcapbd=here->MOS2Cbd*sarg+ - here->MOS2Cbdsw*sargsw; - lcapbd2 = model->MOS2type*0.5/here->MOS2tBulkPot*( - here->MOS2Cbd*model->MOS2bulkJctBotGradingCoeff* - sarg/arg + here->MOS2Cbdsw* - model->MOS2bulkJctSideGradingCoeff*sargsw/arg); - lcapbd3 = here->MOS2Cbd*sarg* - model->MOS2bulkJctBotGradingCoeff* - (model->MOS2bulkJctBotGradingCoeff+1); - lcapbd3 += here->MOS2Cbdsw*sargsw* - model->MOS2bulkJctSideGradingCoeff* - (model->MOS2bulkJctSideGradingCoeff+1); - lcapbd3 = lcapbd3/(6*here->MOS2tBulkPot* - here->MOS2tBulkPot*arg*arg); - } else { - lcapbd=here->MOS2f2d + vbd * here->MOS2f3d; - lcapbd2=0.5*here->MOS2f3d; - lcapbd3=0; - } - /* - * meyer's capacitor model */ - /* - * the meyer capacitance equations are in DEVqmeyer - * these expressions are derived from those equations. - * these expressions are incorrect; they assume just one - * controlling variable for each charge storage element - * while actually there are several; the MOS2 small - * signal ac linear model is also wrong because it - * ignores controlled capacitive elements. these can be - * corrected (as can the linear ss ac model) if the - * expressions for the charge are available - */ - - -{ - - - double phi; - double cox; - double vddif; - double vddif1; - double vddif2; - /* von, vgst and vdsat have already been adjusted for - possible source-drain interchange */ - - - - phi = here->MOS2tPhi; - cox = OxideCap; - if (vgst <= -phi) { - lcapgb2=lcapgb3=lcapgs2=lcapgs3=lcapgd2=lcapgd3=0; - } else if (vgst <= -phi/2) { - lcapgb2= -cox/(4*phi); - lcapgb3=lcapgs2=lcapgs3=lcapgd2=lcapgd3=0; - } else if (vgst <= 0) { - lcapgb2= -cox/(4*phi); - lcapgb3=lcapgs3=lcapgd2=lcapgd3=0; - lcapgs2 = cox/(3*phi); - } else { /* the MOS2modes are around because - vds has not been adjusted */ - if (vdsat <= here->MOS2mode*vds) { - lcapgb2=lcapgb3=lcapgs2=lcapgs3=lcapgd2=lcapgd3=0; - } else { - vddif = 2.0*vdsat-here->MOS2mode*vds; - vddif1 = vdsat-here->MOS2mode*vds/*-1.0e-12*/; - vddif2 = vddif*vddif; - lcapgd2 = -vdsat*here->MOS2mode*vds*cox/(3*vddif*vddif2); - lcapgd3 = - here->MOS2mode*vds*cox*(vddif - 6*vdsat)/(9*vddif2*vddif2); - lcapgs2 = -vddif1*here->MOS2mode*vds*cox/(3*vddif*vddif2); - lcapgs3 = - here->MOS2mode*vds*cox*(vddif - 6*vddif1)/(9*vddif2*vddif2); - lcapgb2=lcapgb3=0; - } - } - } - - /* the b-s and b-d diodes need no processing ... */ - here->capbs2 = lcapbs2; - here->capbs3 = lcapbs3; - here->capbd2 = lcapbd2; - here->capbd3 = lcapbd3; - here->gbs2 = lgbs2; - here->gbs3 = lgbs3; - here->gbd2 = lgbd2; - here->gbd3 = lgbd3; - here->capgb2 = model->MOS2type*lcapgb2; - here->capgb3 = lcapgb3; - /* - * process to get Taylor coefficients, taking into * account type and mode. - */ -gm2 = d_cdrain.d2_p2; -gb2 = d_cdrain.d2_q2; -gds2 = d_cdrain.d2_r2; -gmb = d_cdrain.d2_pq; -gbds = d_cdrain.d2_qr; -gmds = d_cdrain.d2_pr; -gm3 = d_cdrain.d3_p3; -gb3 = d_cdrain.d3_q3; -gds3 = d_cdrain.d3_r3; -gm2ds = d_cdrain.d3_p2r; -gm2b = d_cdrain.d3_p2q; -gb2ds = d_cdrain.d3_q2r; -gmb2 = d_cdrain.d3_pq2; -gmds2 = d_cdrain.d3_pr2; -gbds2 = d_cdrain.d3_qr2; -gmbds = d_cdrain.d3_pqr; - - if (here->MOS2mode == 1) - { - /* normal mode - no source-drain interchange */ - - here->cdr_x2 = gm2; - here->cdr_y2 = gb2; - here->cdr_z2 = gds2; - here->cdr_xy = gmb; - here->cdr_yz = gbds; - here->cdr_xz = gmds; - here->cdr_x3 = gm3; - here->cdr_y3 = gb3; - here->cdr_z3 = gds3; - here->cdr_x2z = gm2ds; - here->cdr_x2y = gm2b; - here->cdr_y2z = gb2ds; - here->cdr_xy2 = gmb2; - here->cdr_xz2 = gmds2; - here->cdr_yz2 = gbds2; - here->cdr_xyz = gmbds; - - /* the gate caps have been divided and made into Taylor coeffs., but not adjusted for type */ - - here->capgs2 = model->MOS2type*lcapgs2; - here->capgs3 = lcapgs3; - here->capgd2 = model->MOS2type*lcapgd2; - here->capgd3 = lcapgd3; -} else { - /* - * inverse mode - source and drain interchanged */ -here->cdr_x2 = -gm2; -here->cdr_y2 = -gb2; -here->cdr_z2 = -(gm2 + gb2 + gds2 + 2*(gmb + gmds + gbds)); -here->cdr_xy = -gmb; -here->cdr_yz = gmb + gb2 + gbds; -here->cdr_xz = gm2 + gmb + gmds; -here->cdr_x3 = -gm3; -here->cdr_y3 = -gb3; -here->cdr_z3 = gm3 + gb3 + gds3 + - 3*(gm2b + gm2ds + gmb2 + gb2ds + gmds2 + gbds2) + 6*gmbds ; -here->cdr_x2z = gm3 + gm2b + gm2ds; -here->cdr_x2y = -gm2b; -here->cdr_y2z = gmb2 + gb3 + gb2ds; -here->cdr_xy2 = -gmb2; -here->cdr_xz2 = -(gm3 + 2*(gm2b + gm2ds + gmbds) + - gmb2 + gmds2); -here->cdr_yz2 = -(gb3 + 2*(gmb2 + gb2ds + gmbds) + - gm2b + gbds2); -here->cdr_xyz = gm2b + gmb2 + gmbds; - - here->capgs2 = model->MOS2type*lcapgd2; - here->capgs3 = lcapgd3; - - here->capgd2 = model->MOS2type*lcapgs2; - here->capgd3 = lcapgs3; - -} - -/* now to adjust for type and multiply by factors to convert to Taylor coeffs. */ - -here->cdr_x2 = 0.5*model->MOS2type*here->cdr_x2; -here->cdr_y2 = 0.5*model->MOS2type*here->cdr_y2; -here->cdr_z2 = 0.5*model->MOS2type*here->cdr_z2; -here->cdr_xy = model->MOS2type*here->cdr_xy; -here->cdr_yz = model->MOS2type*here->cdr_yz; -here->cdr_xz = model->MOS2type*here->cdr_xz; -here->cdr_x3 = here->cdr_x3/6.; -here->cdr_y3 = here->cdr_y3/6.; -here->cdr_z3 = here->cdr_z3/6.; -here->cdr_x2z = 0.5*here->cdr_x2z; -here->cdr_x2y = 0.5*here->cdr_x2y; -here->cdr_y2z = 0.5*here->cdr_y2z; -here->cdr_xy2 = 0.5*here->cdr_xy2; -here->cdr_xz2 = 0.5*here->cdr_xz2; -here->cdr_yz2 = 0.5*here->cdr_yz2; - - - } - } - return(OK); - } diff --git a/src/spicelib/devices/mos2/mos2ext.h b/src/spicelib/devices/mos2/mos2ext.h deleted file mode 100644 index ff9ebd162..000000000 --- a/src/spicelib/devices/mos2/mos2ext.h +++ /dev/null @@ -1,29 +0,0 @@ -/********** -Copyright 1990 Regents of the University of California. All rights reserved. -Author: 1985 Thomas L. Quarles -Modified: 2000 AlansFixes -**********/ - -extern int MOS2acLoad(GENmodel*,CKTcircuit*); -extern int MOS2ask(CKTcircuit*,GENinstance*,int,IFvalue*,IFvalue*); -extern int MOS2mAsk(CKTcircuit*,GENmodel*,int,IFvalue*); -extern int MOS2convTest(GENmodel*,CKTcircuit*); -extern int MOS2delete(GENinstance*); -extern int MOS2getic(GENmodel*,CKTcircuit*); -extern int MOS2load(GENmodel*,CKTcircuit*); -extern int MOS2mParam(int,IFvalue*,GENmodel*); -extern int MOS2param(int,IFvalue*,GENinstance*,IFvalue*); -extern int MOS2pzLoad(GENmodel*,CKTcircuit*,SPcomplex*); -extern int MOS2sAcLoad(GENmodel*,CKTcircuit*); -extern int MOS2sLoad(GENmodel*,CKTcircuit*); -extern void MOS2sPrint(GENmodel*,CKTcircuit*); -extern int MOS2sSetup(SENstruct*,GENmodel*); -extern int MOS2sUpdate(GENmodel*,CKTcircuit*); -extern int MOS2setup(SMPmatrix*,GENmodel*,CKTcircuit*,int*); -extern int MOS2unsetup(GENmodel*,CKTcircuit*); -extern int MOS2temp(GENmodel*,CKTcircuit*); -extern int MOS2trunc(GENmodel*,CKTcircuit*,double*); -extern int MOS2disto(int,GENmodel*,CKTcircuit*); -extern int MOS2noise(int,int,GENmodel*,CKTcircuit*,Ndata*,double*); - -extern int MOS2dSetup(GENmodel*,CKTcircuit*); diff --git a/src/spicelib/devices/mos2/mos2ic.c b/src/spicelib/devices/mos2/mos2ic.c deleted file mode 100644 index d0fbb74fa..000000000 --- a/src/spicelib/devices/mos2/mos2ic.c +++ /dev/null @@ -1,46 +0,0 @@ -/********** -Copyright 1990 Regents of the University of California. All rights reserved. -Author: 1985 Thomas L. Quarles -**********/ -/* - */ - -#include "ngspice/ngspice.h" -#include "ngspice/cktdefs.h" -#include "mos2defs.h" -#include "ngspice/sperror.h" -#include "ngspice/suffix.h" - - -int -MOS2getic(GENmodel *inModel, CKTcircuit *ckt) -{ - MOS2model *model = (MOS2model *)inModel; - MOS2instance *here; - /* - * grab initial conditions out of rhs array. User specified, so use - * external nodes to get values - */ - - for( ; model ; model = MOS2nextModel(model)) { - for(here = MOS2instances(model); here ; here = MOS2nextInstance(here)) { - - if(!here->MOS2icVBSGiven) { - here->MOS2icVBS = - *(ckt->CKTrhs + here->MOS2bNode) - - *(ckt->CKTrhs + here->MOS2sNode); - } - if(!here->MOS2icVDSGiven) { - here->MOS2icVDS = - *(ckt->CKTrhs + here->MOS2dNode) - - *(ckt->CKTrhs + here->MOS2sNode); - } - if(!here->MOS2icVGSGiven) { - here->MOS2icVGS = - *(ckt->CKTrhs + here->MOS2gNode) - - *(ckt->CKTrhs + here->MOS2sNode); - } - } - } - return(OK); -} diff --git a/src/spicelib/devices/mos2/mos2init.c b/src/spicelib/devices/mos2/mos2init.c deleted file mode 100644 index fe6c6559e..000000000 --- a/src/spicelib/devices/mos2/mos2init.c +++ /dev/null @@ -1,76 +0,0 @@ -#include "ngspice/config.h" - -#include "ngspice/devdefs.h" - -#include "mos2itf.h" -#include "mos2ext.h" -#include "mos2init.h" - - -SPICEdev MOS2info = { - .DEVpublic = { - .name = "Mos2", - .description = "Level 2 MOSfet model with Meyer capacitance model", - .terms = &MOS2nSize, - .numNames = &MOS2nSize, - .termNames = MOS2names, - .numInstanceParms = &MOS2pTSize, - .instanceParms = MOS2pTable, - .numModelParms = &MOS2mPTSize, - .modelParms = MOS2mPTable, - .flags = DEV_DEFAULT, - -#ifdef XSPICE - .cm_func = NULL, - .num_conn = 0, - .conn = NULL, - .num_param = 0, - .param = NULL, - .num_inst_var = 0, - .inst_var = NULL, -#endif - }, - - .DEVparam = MOS2param, - .DEVmodParam = MOS2mParam, - .DEVload = MOS2load, - .DEVsetup = MOS2setup, - .DEVunsetup = MOS2unsetup, - .DEVpzSetup = MOS2setup, - .DEVtemperature = MOS2temp, - .DEVtrunc = MOS2trunc, - .DEVfindBranch = NULL, - .DEVacLoad = MOS2acLoad, - .DEVaccept = NULL, - .DEVdestroy = NULL, - .DEVmodDelete = NULL, - .DEVdelete = MOS2delete, - .DEVsetic = MOS2getic, - .DEVask = MOS2ask, - .DEVmodAsk = MOS2mAsk, - .DEVpzLoad = MOS2pzLoad, - .DEVconvTest = MOS2convTest, - .DEVsenSetup = MOS2sSetup, - .DEVsenLoad = MOS2sLoad, - .DEVsenUpdate = MOS2sUpdate, - .DEVsenAcLoad = MOS2sAcLoad, - .DEVsenPrint = MOS2sPrint, - .DEVsenTrunc = NULL, - .DEVdisto = MOS2disto, - .DEVnoise = MOS2noise, - .DEVsoaCheck = NULL, - .DEVinstSize = &MOS2iSize, - .DEVmodSize = &MOS2mSize, - -#ifdef CIDER - .DEVdump = NULL, - .DEVacct = NULL, -#endif -}; - - -SPICEdev * -get_mos2_info(void) -{ - return &MOS2info; -} diff --git a/src/spicelib/devices/mos2/mos2init.h b/src/spicelib/devices/mos2/mos2init.h deleted file mode 100644 index b7ba9b220..000000000 --- a/src/spicelib/devices/mos2/mos2init.h +++ /dev/null @@ -1,13 +0,0 @@ -#ifndef _MOS2INIT_H -#define _MOS2INIT_H - -extern IFparm MOS2pTable[ ]; -extern IFparm MOS2mPTable[ ]; -extern char *MOS2names[ ]; -extern int MOS2pTSize; -extern int MOS2mPTSize; -extern int MOS2nSize; -extern int MOS2iSize; -extern int MOS2mSize; - -#endif diff --git a/src/spicelib/devices/mos2/mos2itf.h b/src/spicelib/devices/mos2/mos2itf.h deleted file mode 100644 index 2d51c4a7d..000000000 --- a/src/spicelib/devices/mos2/mos2itf.h +++ /dev/null @@ -1,9 +0,0 @@ -/********** -Copyright 1990 Regents of the University of California. All rights reserved. -**********/ -#ifndef DEV_MOS2 -#define DEV_MOS2 - -SPICEdev *get_mos2_info(void); - -#endif diff --git a/src/spicelib/devices/mos2/mos2load.c b/src/spicelib/devices/mos2/mos2load.c deleted file mode 100644 index 161a1641a..000000000 --- a/src/spicelib/devices/mos2/mos2load.c +++ /dev/null @@ -1,1392 +0,0 @@ -/********** -Copyright 1990 Regents of the University of California. All rights reserved. -Author: 1985 Thomas L. Quarles -Modified: 2000 alansFixes -**********/ - -#include "ngspice/ngspice.h" -#include "ngspice/devdefs.h" -#include "ngspice/cktdefs.h" -#include "mos2defs.h" -#include "ngspice/trandefs.h" -#include "ngspice/const.h" -#include "ngspice/sperror.h" -#include "ngspice/suffix.h" - -/* assuming silicon - make definition for epsilon of silicon */ -#define EPSSIL (11.7 * 8.854214871e-12) - -static double sig1[4] = {1.0, -1.0, 1.0, -1.0}; -static double sig2[4] = {1.0, 1.0,-1.0, -1.0}; - -int -MOS2load(GENmodel *inModel, CKTcircuit *ckt) - /* actually load the current value into the - * sparse matrix previously provided - */ -{ - MOS2model *model = (MOS2model *)inModel; - MOS2instance *here; - int error; - double Beta; - double DrainSatCur; - double EffectiveLength; - double GateBulkOverlapCap; - double GateDrainOverlapCap; - double GateSourceOverlapCap; - double OxideCap; - double SourceSatCur; - double arg; - double cbhat; - double cdhat; - double cdrain = 0.0; - double cdreq; - double ceq; - double ceqbd; - double ceqbs; - double ceqgb; - double ceqgd; - double ceqgs; - double delvbd; - double delvbs; - double delvds; - double delvgd; - double delvgs; - double evbd; - double evbs; - double gcgb; - double gcgd; - double gcgs; - double geq; - double sarg; - double sargsw; - double vbd; - double vbs; - double vds; - double vdsat; - double vgb1; - double vgb; - double vgd1; - double vgd; - double vgdo; - double vgs1; - double vgs; - double von; - double vt; /* K * T / Q */ -#ifndef PREDICTOR - double xfact = 0.0; -#endif - double capgs = 0.0; /* total gate-source capacitance */ - double capgd = 0.0; /* total gate-drain capacitance */ - double capgb = 0.0; /* total gate-bulk capacitance */ - int xnrm; - int xrev; - int Check; -#ifndef NOBYPASS - double tempv; -#endif /*NOBYPASS*/ -#ifdef CAPBYPASS - int senflag; -#endif /* CAPBYPASS */ - int SenCond=0; - -#ifdef CAPBYPASS - senflag = 0; - if(ckt->CKTsenInfo){ - if(ckt->CKTsenInfo->SENstatus == PERTURBATION){ - if((ckt->CKTsenInfo->SENmode == ACSEN)|| - (ckt->CKTsenInfo->SENmode == TRANSEN)){ - senflag = 1; - } - } - } -#endif /* CAPBYPASS */ - - /* loop through all the MOS2 device models */ - for( ; model != NULL; model = MOS2nextModel(model)) { - - /* loop through all the instances of the model */ - for (here = MOS2instances(model); here != NULL ; - here=MOS2nextInstance(here)) { - - vt = CONSTKoverQ * here->MOS2temp; - Check=1; - if(ckt->CKTsenInfo){ -#ifdef SENSDEBUG - printf("MOS2load %s\n",here->MOS2name); -#endif /* SENSDEBUG */ - - if(ckt->CKTsenInfo->SENstatus == PERTURBATION) { - if(here->MOS2senPertFlag == OFF)continue; - } - SenCond = here->MOS2senPertFlag; - - } - - EffectiveLength=here->MOS2l - 2*model->MOS2latDiff; - - if( (here->MOS2tSatCurDens == 0) || - (here->MOS2drainArea == 0) || - (here->MOS2sourceArea == 0)) { - DrainSatCur = here->MOS2m * here->MOS2tSatCur; - SourceSatCur = here->MOS2m * here->MOS2tSatCur; - } else { - DrainSatCur = here->MOS2m * here->MOS2tSatCurDens * - here->MOS2drainArea; - SourceSatCur = here->MOS2m * here->MOS2tSatCurDens * - here->MOS2sourceArea; - } - GateSourceOverlapCap = model->MOS2gateSourceOverlapCapFactor * - here->MOS2m * here->MOS2w; - GateDrainOverlapCap = model->MOS2gateDrainOverlapCapFactor * - here->MOS2m * here->MOS2w; - GateBulkOverlapCap = model->MOS2gateBulkOverlapCapFactor * - here->MOS2m * EffectiveLength; - Beta = here->MOS2tTransconductance * here->MOS2w * - here->MOS2m/EffectiveLength; - OxideCap = model->MOS2oxideCapFactor * EffectiveLength * - here->MOS2m * here->MOS2w; - - - if(SenCond){ -#ifdef SENSDEBUG - printf("MOS2senPertFlag = ON \n"); -#endif /* SENSDEBUG */ - if((ckt->CKTsenInfo->SENmode == TRANSEN) && - (ckt->CKTmode & MODEINITTRAN)) { - vgs = *(ckt->CKTstate1 + here->MOS2vgs); - vds = *(ckt->CKTstate1 + here->MOS2vds); - vbs = *(ckt->CKTstate1 + here->MOS2vbs); - vbd = *(ckt->CKTstate1 + here->MOS2vbd); - vgb = vgs - vbs; - vgd = vgs - vds; - } - else if (ckt->CKTsenInfo->SENmode == ACSEN){ - vgb = model->MOS2type * ( - *(ckt->CKTrhsOp+here->MOS2gNode) - - *(ckt->CKTrhsOp+here->MOS2bNode)); - vbs = *(ckt->CKTstate0 + here->MOS2vbs); - vbd = *(ckt->CKTstate0 + here->MOS2vbd); - vgd = vgb + vbd ; - vgs = vgb + vbs ; - vds = vbs - vbd ; - } - else{ - vgs = *(ckt->CKTstate0 + here->MOS2vgs); - vds = *(ckt->CKTstate0 + here->MOS2vds); - vbs = *(ckt->CKTstate0 + here->MOS2vbs); - vbd = *(ckt->CKTstate0 + here->MOS2vbd); - vgb = vgs - vbs; - vgd = vgs - vds; - } -#ifdef SENSDEBUG - printf(" vbs = %.7e ,vbd = %.7e,vgb = %.7e\n",vbs,vbd,vgb); - printf(" vgs = %.7e ,vds = %.7e,vgd = %.7e\n",vgs,vds,vgd); -#endif /* SENSDEBUG */ - goto next1; - } - - - if((ckt->CKTmode & (MODEINITFLOAT | MODEINITPRED |MODEINITSMSIG - | MODEINITTRAN)) || - ( (ckt->CKTmode & MODEINITFIX) && (!here->MOS2off) ) ) { -#ifndef PREDICTOR - if(ckt->CKTmode & (MODEINITPRED | MODEINITTRAN) ) { - - /* predictor step */ - - xfact=ckt->CKTdelta/ckt->CKTdeltaOld[1]; - *(ckt->CKTstate0 + here->MOS2vbs) = - *(ckt->CKTstate1 + here->MOS2vbs); - vbs = (1+xfact)* (*(ckt->CKTstate1 + here->MOS2vbs)) - -(xfact * (*(ckt->CKTstate2 + here->MOS2vbs))); - *(ckt->CKTstate0 + here->MOS2vgs) = - *(ckt->CKTstate1 + here->MOS2vgs); - vgs = (1+xfact)* (*(ckt->CKTstate1 + here->MOS2vgs)) - -(xfact * (*(ckt->CKTstate2 + here->MOS2vgs))); - *(ckt->CKTstate0 + here->MOS2vds) = - *(ckt->CKTstate1 + here->MOS2vds); - vds = (1+xfact)* (*(ckt->CKTstate1 + here->MOS2vds)) - -(xfact * (*(ckt->CKTstate2 + here->MOS2vds))); - *(ckt->CKTstate0 + here->MOS2vbd) = - *(ckt->CKTstate0 + here->MOS2vbs)- - *(ckt->CKTstate0 + here->MOS2vds); - } else { -#endif /* PREDICTOR */ - - /* general iteration */ - - - vbs = model->MOS2type * ( - *(ckt->CKTrhsOld+here->MOS2bNode) - - *(ckt->CKTrhsOld+here->MOS2sNodePrime)); - vgs = model->MOS2type * ( - *(ckt->CKTrhsOld+here->MOS2gNode) - - *(ckt->CKTrhsOld+here->MOS2sNodePrime)); - vds = model->MOS2type * ( - *(ckt->CKTrhsOld+here->MOS2dNodePrime) - - *(ckt->CKTrhsOld+here->MOS2sNodePrime)); -#ifndef PREDICTOR - } -#endif /* PREDICTOR */ - - /* now some common crunching for some more useful quantities */ - - - vbd=vbs-vds; - vgd=vgs-vds; - vgdo = *(ckt->CKTstate0 + here->MOS2vgs) - - *(ckt->CKTstate0 + here->MOS2vds); - delvbs = vbs - *(ckt->CKTstate0 + here->MOS2vbs); - delvbd = vbd - *(ckt->CKTstate0 + here->MOS2vbd); - delvgs = vgs - *(ckt->CKTstate0 + here->MOS2vgs); - delvds = vds - *(ckt->CKTstate0 + here->MOS2vds); - delvgd = vgd-vgdo; - - /* these are needed for convergence testing */ - if (here->MOS2mode >= 0) { - cdhat= - here->MOS2cd - - here->MOS2gbd * delvbd + - here->MOS2gmbs * delvbs + - here->MOS2gm * delvgs + - here->MOS2gds * delvds ; - } else { - cdhat= - here->MOS2cd + - ( here->MOS2gmbs - - here->MOS2gbd) * delvbd - - here->MOS2gm * delvgd + - here->MOS2gds * delvds ; - } - cbhat= - here->MOS2cbs + - here->MOS2cbd + - here->MOS2gbd * delvbd + - here->MOS2gbs * delvbs ; - - - /* now lets see if we can bypass (ugh) */ - /* the following massive if should all be one - * single compound if statement, but most compilers - * can't handle it in one piece, so it is broken up - * into several stages here - */ -#ifndef NOBYPASS - tempv = MAX(fabs(cbhat),fabs(here->MOS2cbs+here->MOS2cbd))+ - ckt->CKTabstol; - if((!(ckt->CKTmode & (MODEINITPRED|MODEINITTRAN|MODEINITSMSIG) - )) && (ckt->CKTbypass) ) - if ( (fabs(cbhat-(here->MOS2cbs + here->MOS2cbd)) - < ckt->CKTreltol * tempv)) - if( (fabs(delvbs) < (ckt->CKTreltol * MAX(fabs(vbs), - fabs(*(ckt->CKTstate0+here->MOS2vbs)))+ - ckt->CKTvoltTol))) - if ( (fabs(delvbd) < (ckt->CKTreltol * MAX(fabs(vbd), - fabs(*(ckt->CKTstate0+here->MOS2vbd)))+ - ckt->CKTvoltTol)) ) - if( (fabs(delvgs) < (ckt->CKTreltol * MAX(fabs(vgs), - fabs(*(ckt->CKTstate0+here->MOS2vgs)))+ - ckt->CKTvoltTol)) ) - if ( (fabs(delvds) < (ckt->CKTreltol * MAX(fabs(vds), - fabs(*(ckt->CKTstate0+here->MOS2vds)))+ - ckt->CKTvoltTol)) ) - if( (fabs(cdhat- here->MOS2cd) < - ckt->CKTreltol * MAX(fabs(cdhat),fabs( - here->MOS2cd)) + ckt->CKTabstol) ) { - /* bypass code */ - /* nothing interesting has changed since last - * iteration on this device, so we just - * copy all the values computed last iteration - * out and keep going - */ - vbs = *(ckt->CKTstate0 + here->MOS2vbs); - vbd = *(ckt->CKTstate0 + here->MOS2vbd); - vgs = *(ckt->CKTstate0 + here->MOS2vgs); - vds = *(ckt->CKTstate0 + here->MOS2vds); - vgd = vgs - vds; - vgb = vgs - vbs; - cdrain = here->MOS2mode * (here->MOS2cd + here->MOS2cbd); - if(ckt->CKTmode & (MODETRAN | MODETRANOP)) { - capgs = ( *(ckt->CKTstate0 + here->MOS2capgs)+ - *(ckt->CKTstate1 + here->MOS2capgs)+ - GateSourceOverlapCap ); - capgd = ( *(ckt->CKTstate0 + here->MOS2capgd)+ - *(ckt->CKTstate1 + here->MOS2capgd)+ - GateDrainOverlapCap ); - capgb = ( *(ckt->CKTstate0 + here->MOS2capgb)+ - *(ckt->CKTstate1 + here->MOS2capgb)+ - GateBulkOverlapCap ); - if(ckt->CKTsenInfo){ - here->MOS2cgs = capgs; - here->MOS2cgd = capgd; - here->MOS2cgb = capgb; - } - } - goto bypass; - } -#endif /*NOBYPASS*/ - /* ok - bypass is out, do it the hard way */ - - von = model->MOS2type * here->MOS2von; - /* - * limiting - * We want to keep device voltages from changing - * so fast that the exponentials churn out overflows - * and similar rudeness - */ - if(*(ckt->CKTstate0 + here->MOS2vds) >=0) { - vgs = DEVfetlim(vgs,*(ckt->CKTstate0 + here->MOS2vgs) - ,von); - vds = vgs - vgd; - vds = DEVlimvds(vds,*(ckt->CKTstate0 + here->MOS2vds)); - vgd = vgs - vds; - } else { - vgd = DEVfetlim(vgd,vgdo,von); - vds = vgs - vgd; - if(!(ckt->CKTfixLimit)) { - vds = -DEVlimvds(-vds,-(*(ckt->CKTstate0 + - here->MOS2vds))); - } - vgs = vgd + vds; - } - if(vds >= 0) { - vbs = DEVpnjlim(vbs,*(ckt->CKTstate0 + here->MOS2vbs), - vt,here->MOS2sourceVcrit,&Check); - vbd = vbs-vds; - } else { - vbd = DEVpnjlim(vbd,*(ckt->CKTstate0 + here->MOS2vbd), - vt,here->MOS2drainVcrit,&Check); - vbs = vbd + vds; - } - } else { - /* ok - not one of the simple cases, so we have to - * look at other possibilities - */ - - if((ckt->CKTmode & MODEINITJCT) && !here->MOS2off) { - vds= model->MOS2type * here->MOS2icVDS; - vgs= model->MOS2type * here->MOS2icVGS; - vbs= model->MOS2type * here->MOS2icVBS; - if((vds==0) && (vgs==0) && (vbs==0) && - ((ckt->CKTmode & - (MODETRAN|MODEDCOP|MODEDCTRANCURVE)) || - (!(ckt->CKTmode & MODEUIC)))) { - vbs = -1; - vgs = model->MOS2type * here->MOS2tVto; - vds = 0; - } - } else { - vbs=vgs=vds=0; - } - } - - /* now all the preliminaries are over - we can start doing the - * real work - */ - - vbd = vbs - vds; - vgd = vgs - vds; - vgb = vgs - vbs; - - /* bulk-source and bulk-drain doides - * here we just evaluate the ideal diode current and the - * correspoinding derivative (conductance). - */ - -next1: if(vbs <= -3*vt) { - here->MOS2gbs = ckt->CKTgmin; - here->MOS2cbs = here->MOS2gbs*vbs-SourceSatCur; - } else { - evbs = exp(MIN(MAX_EXP_ARG,vbs/vt)); - here->MOS2gbs = SourceSatCur*evbs/vt + ckt->CKTgmin; - here->MOS2cbs = SourceSatCur*(evbs-1) + ckt->CKTgmin*vbs; - } - if(vbd <= -3*vt) { - here->MOS2gbd = ckt->CKTgmin; - here->MOS2cbd = here->MOS2gbd*vbd-DrainSatCur; - } else { - evbd = exp(MIN(MAX_EXP_ARG,vbd/vt)); - here->MOS2gbd = DrainSatCur*evbd/vt + ckt->CKTgmin; - here->MOS2cbd = DrainSatCur*(evbd-1) + ckt->CKTgmin*vbd; - } - - if(vds >= 0) { - /* normal mode */ - here->MOS2mode = 1; - } else { - /* inverse mode */ - here->MOS2mode = -1; - } - { - /* moseq2(vds,vbs,vgs,gm,gds,gmbs,qg,qc,qb, - * cggb,cgdb,cgsb,cbgb,cbdb,cbsb) - */ - /* note: cgdb, cgsb, cbdb, cbsb never used */ - - /* - * this routine evaluates the drain current, its derivatives and - * the charges associated with the gate, channel and bulk - * for mosfets - * - */ - - double arg1; - double sarg1; - double a4[4],b4[4],x4[8],poly4[8]; - double beta1; - double dsrgdb; - double d2sdb2; - double sphi = 0.0; /* square root of phi */ - double sphi3 = 0.0; /* square root of phi cubed */ - double barg; - double d2bdb2; - double factor; - double dbrgdb; - double eta; - double vbin; - double argd = 0.0; - double args = 0.0; - double argss; - double argsd; - double argxs = 0.0; - double argxd = 0.0; - double daddb2; - double dasdb2; - double dbargd; - double dbargs; - double dbxwd; - double dbxws; - double dgddb2; - double dgddvb; - double dgdvds; - double gamasd; - double xwd; - double xws; - double ddxwd; - double gammad; - double vth; - double cfs; - double cdonco; - double xn = 0.0; - double argg = 0.0; - double vgst; - double sarg3; - double sbiarg; - double dgdvbs; - double body; - double gdbdv; - double dodvbs; - double dodvds = 0.0; - double dxndvd = 0.0; - double dxndvb = 0.0; - double udenom; - double dudvgs; - double dudvds; - double dudvbs; - double gammd2; - double argv; - double vgsx; - double ufact; - double ueff; - double dsdvgs; - double dsdvbs; - double a1; - double a3; - double a; - double b1; - double b3; - double b; - double c1; - double c; - double d1; - double fi; - double p0; - double p2; - double p3; - double p4; - double p; - double r3; - double r; - double ro; - double s2; - double s; - double v1; - double v2; - double xv; - double y3; - double delta4; - double xvalid = 0.0; - double bsarg = 0.0; - double dbsrdb = 0.0; - double bodys = 0.0; - double gdbdvs = 0.0; - double sargv; - double xlfact; - double dldsat; - double xdv; - double xlv; - double vqchan; - double dqdsat; - double vl; - double dfundg; - double dfunds; - double dfundb; - double xls; - double dldvgs; - double dldvds; - double dldvbs; - double dfact; - double clfact; - double xleff; - double deltal; - double xwb; - double vdson; - double cdson; - double didvds; - double gdson; - double gmw; - double gbson; - double expg; - double xld; - double xlamda = model->MOS2lambda; - /* 'local' variables - these switch d & s around appropriately - * so that we don't have to worry about vds < 0 - */ - double lvbs = here->MOS2mode==1?vbs:vbd; - double lvds = here->MOS2mode*vds; - double lvgs = here->MOS2mode==1?vgs:vgd; - double phiMinVbs = here->MOS2tPhi - lvbs; - double tmp; /* a temporary variable, not used for more than */ - /* about 10 lines at a time */ - int iknt; - int jknt; - int i; - int j; - - /* - * compute some useful quantities - */ - - if (lvbs <= 0.0) { - sarg1 = sqrt(phiMinVbs); - dsrgdb = -0.5/sarg1; - d2sdb2 = 0.5*dsrgdb/phiMinVbs; - } else { - sphi = sqrt(here->MOS2tPhi); - sphi3 = here->MOS2tPhi*sphi; - sarg1 = sphi/(1.0+0.5*lvbs/here->MOS2tPhi); - tmp = sarg1/sphi3; - dsrgdb = -0.5*sarg1*tmp; - d2sdb2 = -dsrgdb*tmp; - } - if ((lvbs-lvds) <= 0) { - barg = sqrt(phiMinVbs+lvds); - dbrgdb = -0.5/barg; - d2bdb2 = 0.5*dbrgdb/(phiMinVbs+lvds); - } else { - sphi = sqrt(here->MOS2tPhi);/* added by HT 050523 */ - sphi3 = here->MOS2tPhi*sphi;/* added by HT 050523 */ - barg = sphi/(1.0+0.5*(lvbs-lvds)/here->MOS2tPhi); - tmp = barg/sphi3; - dbrgdb = -0.5*barg*tmp; - d2bdb2 = -dbrgdb*tmp; - } - /* - * calculate threshold voltage (von) - * narrow-channel effect - */ - - /*XXX constant per device */ - factor = 0.125*model->MOS2narrowFactor*2.0*M_PI*EPSSIL/ - OxideCap*EffectiveLength; - /*XXX constant per device */ - eta = 1.0+factor; - vbin = here->MOS2tVbi*model->MOS2type+factor*phiMinVbs; - if ((model->MOS2gamma > 0.0) || - (model->MOS2substrateDoping > 0.0)) { - xwd = model->MOS2xd*barg; - xws = model->MOS2xd*sarg1; - - /* - * short-channel effect with vds .ne. 0.0 - */ - - argss = 0.0; - argsd = 0.0; - dbargs = 0.0; - dbargd = 0.0; - dgdvds = 0.0; - dgddb2 = 0.0; - if (model->MOS2junctionDepth > 0) { - tmp = 2.0/model->MOS2junctionDepth; - argxs = 1.0+xws*tmp; - argxd = 1.0+xwd*tmp; - args = sqrt(argxs); - argd = sqrt(argxd); - tmp = .5*model->MOS2junctionDepth/EffectiveLength; - argss = tmp * (args-1.0); - argsd = tmp * (argd-1.0); - } - gamasd = model->MOS2gamma*(1.0-argss-argsd); - dbxwd = model->MOS2xd*dbrgdb; - dbxws = model->MOS2xd*dsrgdb; - if (model->MOS2junctionDepth > 0) { - tmp = 0.5/EffectiveLength; - dbargs = tmp*dbxws/args; - dbargd = tmp*dbxwd/argd; - dasdb2 = -model->MOS2xd*( d2sdb2+dsrgdb*dsrgdb* - model->MOS2xd/(model->MOS2junctionDepth*argxs))/ - (EffectiveLength*args); - daddb2 = -model->MOS2xd*( d2bdb2+dbrgdb*dbrgdb* - model->MOS2xd/(model->MOS2junctionDepth*argxd))/ - (EffectiveLength*argd); - dgddb2 = -0.5*model->MOS2gamma*(dasdb2+daddb2); - } - dgddvb = -model->MOS2gamma*(dbargs+dbargd); - if (model->MOS2junctionDepth > 0) { - ddxwd = -dbxwd; - dgdvds = -model->MOS2gamma*0.5*ddxwd/(EffectiveLength*argd); - } - } else { - gamasd = model->MOS2gamma; - gammad = model->MOS2gamma; - dgddvb = 0.0; - dgdvds = 0.0; - dgddb2 = 0.0; - } - von = vbin+gamasd*sarg1; - vth = von; - vdsat = 0.0; - if (model->MOS2fastSurfaceStateDensity != 0.0 && OxideCap != 0.0) { - /* XXX constant per model */ - cfs = CHARGE*model->MOS2fastSurfaceStateDensity* - 1e4 /*(cm**2/m**2)*/; - cdonco = -(gamasd*dsrgdb+dgddvb*sarg1)+factor; - - xn = 1.0+cfs/OxideCap*here->MOS2m* - here->MOS2w*EffectiveLength+cdonco; - - tmp = vt*xn; - von = von+tmp; - argg = 1.0/tmp; - vgst = lvgs-von; - } else { - vgst = lvgs-von; - if (lvgs <= vbin) { - /* - * cutoff region - */ - here->MOS2gds = 0.0; - goto line1050; - } - } - - /* - * compute some more useful quantities - */ - - sarg3 = sarg1*sarg1*sarg1; - /* XXX constant per model */ - sbiarg = sqrt(here->MOS2tBulkPot); - gammad = gamasd; - dgdvbs = dgddvb; - body = barg*barg*barg-sarg3; - gdbdv = 2.0*gammad*(barg*barg*dbrgdb-sarg1*sarg1*dsrgdb); - dodvbs = -factor+dgdvbs*sarg1+gammad*dsrgdb; - if (model->MOS2fastSurfaceStateDensity == 0.0) goto line400; - if (OxideCap == 0.0) goto line410; - dxndvb = 2.0*dgdvbs*dsrgdb+gammad*d2sdb2+dgddb2*sarg1; - dodvbs = dodvbs+vt*dxndvb; - dxndvd = dgdvds*dsrgdb; - dodvds = dgdvds*sarg1+vt*dxndvd; - /* - * evaluate effective mobility and its derivatives - */ -line400: - if (OxideCap <= 0.0) goto line410; - udenom = vgst; - tmp = model->MOS2critField * 100 /* cm/m */ * EPSSIL/ - model->MOS2oxideCapFactor; - if (udenom <= tmp) goto line410; - ufact = exp(model->MOS2critFieldExp*log(tmp/udenom)); - ueff = model->MOS2surfaceMobility * 1e-4 /*(m**2/cm**2) */ *ufact; - dudvgs = -ufact*model->MOS2critFieldExp/udenom; - dudvds = 0.0; - dudvbs = model->MOS2critFieldExp*ufact*dodvbs/vgst; - goto line500; -line410: - ufact = 1.0; - ueff = model->MOS2surfaceMobility * 1e-4 /*(m**2/cm**2) */ ; - dudvgs = 0.0; - dudvds = 0.0; - dudvbs = 0.0; - /* - * evaluate saturation voltage and its derivatives according to - * grove-frohman equation - */ -line500: - vgsx = lvgs; - gammad = gamasd/eta; - dgdvbs = dgddvb; - if (model->MOS2fastSurfaceStateDensity != 0 && OxideCap != 0) { - vgsx = MAX(lvgs,von); - } - if (gammad > 0) { - gammd2 = gammad*gammad; - argv = (vgsx-vbin)/eta+phiMinVbs; - if (argv <= 0.0) { - vdsat = 0.0; - dsdvgs = 0.0; - dsdvbs = 0.0; - } else { - arg1 = sqrt(1.0+4.0*argv/gammd2); - vdsat = (vgsx-vbin)/eta+gammd2*(1.0-arg1)/2.0; - vdsat = MAX(vdsat,0.0); - dsdvgs = (1.0-1.0/arg1)/eta; - dsdvbs = (gammad*(1.0-arg1)+2.0*argv/(gammad*arg1))/ - eta*dgdvbs+1.0/arg1+factor*dsdvgs; - } - } else { - vdsat = (vgsx-vbin)/eta; - vdsat = MAX(vdsat,0.0); - dsdvgs = 1.0; - dsdvbs = 0.0; - } - if (model->MOS2maxDriftVel > 0) { - /* - * evaluate saturation voltage and its derivatives - * according to baum's theory of scattering velocity - * saturation - */ - gammd2 = gammad*gammad; - v1 = (vgsx-vbin)/eta+phiMinVbs; - v2 = phiMinVbs; - xv = model->MOS2maxDriftVel*EffectiveLength/ueff; - a1 = gammad/0.75; - b1 = -2.0*(v1+xv); - c1 = -2.0*gammad*xv; - d1 = 2.0*v1*(v2+xv)-v2*v2-4.0/3.0*gammad*sarg3; - a = -b1; - b = a1*c1-4.0*d1; - c = -d1*(a1*a1-4.0*b1)-c1*c1; - r = -a*a/3.0+b; - s = 2.0*a*a*a/27.0-a*b/3.0+c; - r3 = r*r*r; - s2 = s*s; - p = s2/4.0+r3/27.0; - p0 = fabs(p); - p2 = sqrt(p0); - if (p < 0) { - ro = sqrt(s2/4.0+p0); - ro = log(ro)/3.0; - ro = exp(ro); - fi = atan(-2.0*p2/s); - y3 = 2.0*ro*cos(fi/3.0)-a/3.0; - } else { - p3 = (-s/2.0+p2); - p3 = exp(log(fabs(p3))/3.0); - p4 = (-s/2.0-p2); - p4 = exp(log(fabs(p4))/3.0); - y3 = p3+p4-a/3.0; - } - iknt = 0; - a3 = sqrt(a1*a1/4.0-b1+y3); - b3 = sqrt(y3*y3/4.0-d1); - for(i = 1;i<=4;i++) { - a4[i-1] = a1/2.0+sig1[i-1]*a3; - b4[i-1] = y3/2.0+sig2[i-1]*b3; - delta4 = a4[i-1]*a4[i-1]/4.0-b4[i-1]; - if (delta4 < 0) continue; - iknt = iknt+1; - tmp = sqrt(delta4); - x4[iknt-1] = -a4[i-1]/2.0+tmp; - iknt = iknt+1; - x4[iknt-1] = -a4[i-1]/2.0-tmp; - } - jknt = 0; - for(j = 1;j<=iknt;j++) { - if (x4[j-1] <= 0) continue; - /* XXX implement this sanely */ - poly4[j-1] = x4[j-1]*x4[j-1]*x4[j-1]*x4[j-1]+a1*x4[j-1]* - x4[j-1]*x4[j-1]; - poly4[j-1] = poly4[j-1]+b1*x4[j-1]*x4[j-1]+c1*x4[j-1]+d1; - if (fabs(poly4[j-1]) > 1.0e-6) continue; - jknt = jknt+1; - if (jknt <= 1) { - xvalid = x4[j-1]; - } - if (x4[j-1] > xvalid) continue; - xvalid = x4[j-1]; - } - if (jknt > 0) { - vdsat = xvalid*xvalid-phiMinVbs; - } - } - /* - * evaluate effective channel length and its derivatives - */ - if (lvds != 0.0) { - gammad = gamasd; - if ((lvbs-vdsat) <= 0) { - bsarg = sqrt(vdsat+phiMinVbs); - dbsrdb = -0.5/bsarg; - } else { - sphi = sqrt(here->MOS2tPhi);/* added by HT 050523 */ - sphi3 = here->MOS2tPhi*sphi;/* added by HT 050523 */ - bsarg = sphi/(1.0+0.5*(lvbs-vdsat)/here->MOS2tPhi); - dbsrdb = -0.5*bsarg*bsarg/sphi3; - } - bodys = bsarg*bsarg*bsarg-sarg3; - gdbdvs = 2.0*gammad*(bsarg*bsarg*dbsrdb-sarg1*sarg1*dsrgdb); - if (model->MOS2maxDriftVel <= 0) { - if (model->MOS2substrateDoping == 0.0) goto line610; - if (xlamda > 0.0) goto line610; - argv = (lvds-vdsat)/4.0; - sargv = sqrt(1.0+argv*argv); - arg1 = sqrt(argv+sargv); - xlfact = model->MOS2xd/(EffectiveLength*lvds); - xlamda = xlfact*arg1; - dldsat = lvds*xlamda/(8.0*sargv); - } else { - argv = (vgsx-vbin)/eta-vdsat; - xdv = model->MOS2xd/sqrt(model->MOS2channelCharge); - xlv = model->MOS2maxDriftVel*xdv/(2.0*ueff); - vqchan = argv-gammad*bsarg; - dqdsat = -1.0+gammad*dbsrdb; - vl = model->MOS2maxDriftVel*EffectiveLength; - dfunds = vl*dqdsat-ueff*vqchan; - dfundg = (vl-ueff*vdsat)/eta; - dfundb = -vl*(1.0+dqdsat-factor/eta)+ueff* - (gdbdvs-dgdvbs*bodys/1.5)/eta; - dsdvgs = -dfundg/dfunds; - dsdvbs = -dfundb/dfunds; - if (model->MOS2substrateDoping == 0.0) goto line610; - if (xlamda > 0.0) goto line610; - argv = lvds-vdsat; - argv = MAX(argv,0.0); - xls = sqrt(xlv*xlv+argv); - dldsat = xdv/(2.0*xls); - xlfact = xdv/(EffectiveLength*lvds); - xlamda = xlfact*(xls-xlv); - dldsat = dldsat/EffectiveLength; - } - dldvgs = dldsat*dsdvgs; - dldvds = -xlamda+dldsat; - dldvbs = dldsat*dsdvbs; - } else { -line610: - dldvgs = 0.0; - dldvds = 0.0; - dldvbs = 0.0; - } - /* - * limit channel shortening at punch-through - */ - xwb = model->MOS2xd*sbiarg; - xld = EffectiveLength-xwb; - clfact = 1.0-xlamda*lvds; - dldvds = -xlamda-dldvds; - xleff = EffectiveLength*clfact; - deltal = xlamda*lvds*EffectiveLength; - if (model->MOS2substrateDoping == 0.0) xwb = 0.25e-6; - if (xleff < xwb) { - xleff = xwb/(1.0+(deltal-xld)/xwb); - clfact = xleff/EffectiveLength; - dfact = xleff*xleff/(xwb*xwb); - dldvgs = dfact*dldvgs; - dldvds = dfact*dldvds; - dldvbs = dfact*dldvbs; - } - /* - * evaluate effective beta (effective kp) - */ - beta1 = Beta*ufact/clfact; - /* - * test for mode of operation and branch appropriately - */ - gammad = gamasd; - dgdvbs = dgddvb; - if (lvds <= 1.0e-10) { - if (lvgs <= von) { - if ((model->MOS2fastSurfaceStateDensity == 0.0) || - (OxideCap == 0.0)) { - here->MOS2gds = 0.0; - goto line1050; - } - - here->MOS2gds = beta1*(von-vbin-gammad*sarg1)*exp(argg* - (lvgs-von)); - goto line1050; - } - - - here->MOS2gds = beta1*(lvgs-vbin-gammad*sarg1); - goto line1050; - } - - if (model->MOS2fastSurfaceStateDensity != 0 && OxideCap != 0) { - if (lvgs > von) goto line900; - } else { - if (lvgs > vbin) goto line900; - goto doneval; - } - - if (lvgs > von) goto line900; - /* - * subthreshold region - */ - if (vdsat <= 0) { - here->MOS2gds = 0.0; - if (lvgs > vth) goto doneval; - goto line1050; - } - vdson = MIN(vdsat,lvds); - if (lvds > vdsat) { - barg = bsarg; - dbrgdb = dbsrdb; - body = bodys; - gdbdv = gdbdvs; - } - cdson = beta1*((von-vbin-eta*vdson*0.5)*vdson-gammad*body/1.5); - didvds = beta1*(von-vbin-eta*vdson-gammad*barg); - gdson = -cdson*dldvds/clfact-beta1*dgdvds*body/1.5; - if (lvds < vdsat) gdson = gdson+didvds; - gbson = -cdson*dldvbs/clfact+beta1* - (dodvbs*vdson+factor*vdson-dgdvbs*body/1.5-gdbdv); - if (lvds > vdsat) gbson = gbson+didvds*dsdvbs; - expg = exp(argg*(lvgs-von)); - cdrain = cdson*expg; - gmw = cdrain*argg; - here->MOS2gm = gmw; - if (lvds > vdsat) here->MOS2gm = gmw+didvds*dsdvgs*expg; - tmp = gmw*(lvgs-von)/xn; - here->MOS2gds = gdson*expg-here->MOS2gm*dodvds-tmp*dxndvd; - here->MOS2gmbs = gbson*expg-here->MOS2gm*dodvbs-tmp*dxndvb; - goto doneval; - -line900: - if (lvds <= vdsat) { - /* - * linear region - */ - cdrain = beta1*((lvgs-vbin-eta*lvds/2.0)*lvds-gammad*body/1.5); - arg1 = cdrain*(dudvgs/ufact-dldvgs/clfact); - here->MOS2gm = arg1+beta1*lvds; - arg1 = cdrain*(dudvds/ufact-dldvds/clfact); - here->MOS2gds = arg1+beta1*(lvgs-vbin-eta* - lvds-gammad*barg-dgdvds*body/1.5); - arg1 = cdrain*(dudvbs/ufact-dldvbs/clfact); - here->MOS2gmbs = arg1-beta1*(gdbdv+dgdvbs*body/1.5-factor*lvds); - } else { - /* - * saturation region - */ - cdrain = beta1*((lvgs-vbin-eta* - vdsat/2.0)*vdsat-gammad*bodys/1.5); - arg1 = cdrain*(dudvgs/ufact-dldvgs/clfact); - here->MOS2gm = arg1+beta1*vdsat+beta1*(lvgs- - vbin-eta*vdsat-gammad*bsarg)*dsdvgs; - here->MOS2gds = -cdrain*dldvds/clfact-beta1*dgdvds*bodys/1.5; - arg1 = cdrain*(dudvbs/ufact-dldvbs/clfact); - here->MOS2gmbs = arg1-beta1*(gdbdvs+dgdvbs*bodys/1.5-factor* - vdsat)+beta1* (lvgs-vbin-eta*vdsat-gammad*bsarg)*dsdvbs; - } - /* - * compute charges for "on" region - */ - goto doneval; - /* - * finish special cases - */ -line1050: - cdrain = 0.0; - here->MOS2gm = 0.0; - here->MOS2gmbs = 0.0; - /* - * finished - */ - - } -doneval: - here->MOS2von = model->MOS2type * von; - here->MOS2vdsat = model->MOS2type * vdsat; - /* - * COMPUTE EQUIVALENT DRAIN CURRENT SOURCE - */ - here->MOS2cd=here->MOS2mode * cdrain - here->MOS2cbd; - - if (ckt->CKTmode & (MODETRAN | MODETRANOP|MODEINITSMSIG)) { - /* - * now we do the hard part of the bulk-drain and bulk-source - * diode - we evaluate the non-linear capacitance and - * charge - * - * the basic equations are not hard, but the implementation - * is somewhat long in an attempt to avoid log/exponential - * evaluations - */ - /* - * charge storage elements - * - *.. bulk-drain and bulk-source depletion capacitances - */ -#ifdef CAPBYPASS - if(((ckt->CKTmode & (MODEINITPRED | MODEINITTRAN) ) || - fabs(delvbs) >= ckt->CKTreltol * MAX(fabs(vbs), - fabs(*(ckt->CKTstate0+here->MOS2vbs)))+ - ckt->CKTvoltTol)|| senflag) -#endif /*CAPBYPASS*/ - - { - /* can't bypass the diode capacitance calculations */ - if(here->MOS2Cbs != 0 || here->MOS2Cbssw != 0) { - if (vbs < here->MOS2tDepCap){ - arg=1-vbs/here->MOS2tBulkPot; - /* - * the following block looks somewhat long and messy, - * but since most users use the default grading - * coefficients of .5, and sqrt is MUCH faster than an - * exp(log()) we use this special case code to buy time. - * (as much as 10% of total job time!) - */ - if(model->MOS2bulkJctBotGradingCoeff == - model->MOS2bulkJctSideGradingCoeff) { - if(model->MOS2bulkJctBotGradingCoeff == .5) { - sarg = sargsw = 1/sqrt(arg); - } else { - sarg = sargsw = - exp(-model->MOS2bulkJctBotGradingCoeff* - log(arg)); - } - } else { - if(model->MOS2bulkJctBotGradingCoeff == .5) { - sarg = 1/sqrt(arg); - } else { - sarg = exp(-model->MOS2bulkJctBotGradingCoeff* - log(arg)); - } - if(model->MOS2bulkJctSideGradingCoeff == .5) { - sargsw = 1/sqrt(arg); - } else { - sargsw =exp(-model->MOS2bulkJctSideGradingCoeff* - log(arg)); - } - } - *(ckt->CKTstate0 + here->MOS2qbs) = - here->MOS2tBulkPot*(here->MOS2Cbs* - (1-arg*sarg)/(1-model->MOS2bulkJctBotGradingCoeff) - +here->MOS2Cbssw* - (1-arg*sargsw)/ - (1-model->MOS2bulkJctSideGradingCoeff)); - here->MOS2capbs=here->MOS2Cbs*sarg+ - here->MOS2Cbssw*sargsw; - } else { - *(ckt->CKTstate0 + here->MOS2qbs) = here->MOS2f4s + - vbs*(here->MOS2f2s+vbs*(here->MOS2f3s/2)); - here->MOS2capbs=here->MOS2f2s+here->MOS2f3s*vbs; - } - } else { - *(ckt->CKTstate0 + here->MOS2qbs) = 0; - here->MOS2capbs=0; - } - } -#ifdef CAPBYPASS - if(((ckt->CKTmode & (MODEINITPRED | MODEINITTRAN) ) || - fabs(delvbd) >= ckt->CKTreltol * MAX(fabs(vbd), - fabs(*(ckt->CKTstate0+here->MOS2vbd)))+ - ckt->CKTvoltTol)|| senflag) -#endif /*CAPBYPASS*/ - - /* can't bypass the diode capacitance calculations */ - { - if(here->MOS2Cbd != 0 || here->MOS2Cbdsw != 0 ) { - if (vbd < here->MOS2tDepCap) { - arg=1-vbd/here->MOS2tBulkPot; - /* - * the following block looks somewhat long and messy, - * but since most users use the default grading - * coefficients of .5, and sqrt is MUCH faster than an - * exp(log()) we use this special case code to buy time. - * (as much as 10% of total job time!) - */ - if(model->MOS2bulkJctBotGradingCoeff == .5 && - model->MOS2bulkJctSideGradingCoeff == .5) { - sarg = sargsw = 1/sqrt(arg); - } else { - if(model->MOS2bulkJctBotGradingCoeff == .5) { - sarg = 1/sqrt(arg); - } else { - sarg = exp(-model->MOS2bulkJctBotGradingCoeff* - log(arg)); - } - if(model->MOS2bulkJctSideGradingCoeff == .5) { - sargsw = 1/sqrt(arg); - } else { - sargsw =exp(-model->MOS2bulkJctSideGradingCoeff* - log(arg)); - } - } - *(ckt->CKTstate0 + here->MOS2qbd) = - here->MOS2tBulkPot*(here->MOS2Cbd* - (1-arg*sarg) - /(1-model->MOS2bulkJctBotGradingCoeff) - +here->MOS2Cbdsw* - (1-arg*sargsw) - /(1-model->MOS2bulkJctSideGradingCoeff)); - here->MOS2capbd=here->MOS2Cbd*sarg+ - here->MOS2Cbdsw*sargsw; - } else { - *(ckt->CKTstate0 + here->MOS2qbd) = here->MOS2f4d + - vbd * (here->MOS2f2d + vbd * here->MOS2f3d/2); - here->MOS2capbd=here->MOS2f2d + vbd * here->MOS2f3d; - } - } else { - *(ckt->CKTstate0 + here->MOS2qbd) = 0; - here->MOS2capbd = 0; - } - } - if(SenCond && (ckt->CKTsenInfo->SENmode==TRANSEN)) goto next2; - - if ( ckt->CKTmode & MODETRAN ) { - /* (above only excludes tranop, since we're only at this - * point if tran or tranop ) - */ - - /* - * calculate equivalent conductances and currents for - * depletion capacitors - */ - - /* integrate the capacitors and save results */ - - error = NIintegrate(ckt,&geq,&ceq,here->MOS2capbd, - here->MOS2qbd); - if(error) return(error); - here->MOS2gbd += geq; - here->MOS2cbd += *(ckt->CKTstate0 + here->MOS2cqbd); - here->MOS2cd -= *(ckt->CKTstate0 + here->MOS2cqbd); - error = NIintegrate(ckt,&geq,&ceq,here->MOS2capbs, - here->MOS2qbs); - if(error) return(error); - here->MOS2gbs += geq; - here->MOS2cbs += *(ckt->CKTstate0 + here->MOS2cqbs); - } - } - - if(SenCond) goto next2; - /* - * check convergence - */ - if ( (here->MOS2off == 0) || - (!(ckt->CKTmode & (MODEINITFIX|MODEINITSMSIG))) ){ - if (Check == 1) { - ckt->CKTnoncon++; - ckt->CKTtroubleElt = (GENinstance *) here; - } - } -next2: *(ckt->CKTstate0 + here->MOS2vbs) = vbs; - *(ckt->CKTstate0 + here->MOS2vbd) = vbd; - *(ckt->CKTstate0 + here->MOS2vgs) = vgs; - *(ckt->CKTstate0 + here->MOS2vds) = vds; - - /* - * meyer's capacitor model - */ - if ( ckt->CKTmode & (MODETRAN|MODETRANOP|MODEINITSMSIG)) { - /* - * calculate meyer's capacitors - */ - if (here->MOS2mode > 0){ - DEVqmeyer (vgs,vgd,vgb,von,vdsat, - (ckt->CKTstate0 + here->MOS2capgs), - (ckt->CKTstate0 + here->MOS2capgd), - (ckt->CKTstate0 + here->MOS2capgb), - here->MOS2tPhi,OxideCap); - } else { - DEVqmeyer (vgd,vgs,vgb,von,vdsat, - (ckt->CKTstate0 + here->MOS2capgd), - (ckt->CKTstate0 + here->MOS2capgs), - (ckt->CKTstate0 + here->MOS2capgb), - here->MOS2tPhi,OxideCap); - } - vgs1 = *(ckt->CKTstate1 + here->MOS2vgs); - vgd1 = vgs1 - *(ckt->CKTstate1 + here->MOS2vds); - vgb1 = vgs1 - *(ckt->CKTstate1 + here->MOS2vbs); - if(ckt->CKTmode & MODETRANOP) { - capgs = 2 * *(ckt->CKTstate0 + here->MOS2capgs)+ - GateSourceOverlapCap; - capgd = 2 * *(ckt->CKTstate0 + here->MOS2capgd)+ - GateDrainOverlapCap; - capgb = 2 * *(ckt->CKTstate0 + here->MOS2capgb)+ - GateBulkOverlapCap; - } else { - capgs = *(ckt->CKTstate0 + here->MOS2capgs)+ - *(ckt->CKTstate1 + here->MOS2capgs)+ - GateSourceOverlapCap; - capgd = *(ckt->CKTstate0 + here->MOS2capgd)+ - *(ckt->CKTstate1 + here->MOS2capgd)+ - GateDrainOverlapCap; - capgb = *(ckt->CKTstate0 + here->MOS2capgb)+ - *(ckt->CKTstate1 + here->MOS2capgb)+ - GateBulkOverlapCap; - } - if(ckt->CKTsenInfo){ - here->MOS2cgs = capgs; - here->MOS2cgd = capgd; - here->MOS2cgb = capgb; - } - /* - * store small-signal parameters (for meyer's model) - * all parameters already stored, so done... - */ - - if(SenCond){ - if(ckt->CKTsenInfo->SENmode & (DCSEN|ACSEN)){ - continue; - } - } - -#ifndef PREDICTOR - if(ckt->CKTmode & (MODEINITPRED | MODEINITTRAN) ) { - *(ckt->CKTstate0 + here->MOS2qgs) = - (1+xfact) * *(ckt->CKTstate1 + here->MOS2qgs) - -xfact * *(ckt->CKTstate2 + here->MOS2qgs); - *(ckt->CKTstate0 + here->MOS2qgd) = - (1+xfact) * *(ckt->CKTstate1 + here->MOS2qgd) - -xfact * *(ckt->CKTstate2 + here->MOS2qgd); - *(ckt->CKTstate0 + here->MOS2qgb) = - (1+xfact) * *(ckt->CKTstate1 + here->MOS2qgb) - -xfact * *(ckt->CKTstate2 + here->MOS2qgb); - } else { -#endif /* PREDICTOR */ - if(ckt->CKTmode & MODETRAN) { - *(ckt->CKTstate0 + here->MOS2qgs) = (vgs-vgs1)*capgs + - *(ckt->CKTstate1 + here->MOS2qgs) ; - *(ckt->CKTstate0 + here->MOS2qgd) = (vgd-vgd1)*capgd + - *(ckt->CKTstate1 + here->MOS2qgd) ; - *(ckt->CKTstate0 + here->MOS2qgb) = (vgb-vgb1)*capgb + - *(ckt->CKTstate1 + here->MOS2qgb) ; - } else { - /* TRANOP */ - *(ckt->CKTstate0 + here->MOS2qgs) = capgs*vgs; - *(ckt->CKTstate0 + here->MOS2qgd) = capgd*vgd; - *(ckt->CKTstate0 + here->MOS2qgb) = capgb*vgb; - } -#ifndef PREDICTOR - } -#endif /* PREDICTOR */ - } -#ifndef NOBYPASS -bypass: -#endif /* NOBYPASS */ - - if(SenCond) continue; - - - if((ckt->CKTmode & MODEINITTRAN) || (!(ckt->CKTmode & MODETRAN)) ) { - /* initialize to zero charge conductances and current */ - - gcgs=0; - ceqgs=0; - gcgd=0; - ceqgd=0; - gcgb=0; - ceqgb=0; - } else { - if(capgs == 0) *(ckt->CKTstate0 + here->MOS2cqgs) =0; - if(capgd == 0) *(ckt->CKTstate0 + here->MOS2cqgd) =0; - if(capgb == 0) *(ckt->CKTstate0 + here->MOS2cqgb) =0; - /* - * calculate equivalent conductances and currents for - * meyer"s capacitors - */ - error = NIintegrate(ckt,&gcgs,&ceqgs,capgs,here->MOS2qgs); - if(error) return(error); - error = NIintegrate(ckt,&gcgd,&ceqgd,capgd,here->MOS2qgd); - if(error) return(error); - error = NIintegrate(ckt,&gcgb,&ceqgb,capgb,here->MOS2qgb); - if(error) return(error); - ceqgs=ceqgs-gcgs*vgs+ckt->CKTag[0]* - *(ckt->CKTstate0 + here->MOS2qgs); - ceqgd=ceqgd-gcgd*vgd+ckt->CKTag[0]* - *(ckt->CKTstate0 + here->MOS2qgd); - ceqgb=ceqgb-gcgb*vgb+ckt->CKTag[0]* - *(ckt->CKTstate0 + here->MOS2qgb); - } - /* - * store charge storage info for meyer's cap in lx table - */ - - /* - * load current vector - */ - ceqbs = model->MOS2type * - (here->MOS2cbs-(here->MOS2gbs)*vbs); - ceqbd = model->MOS2type * - (here->MOS2cbd-(here->MOS2gbd)*vbd); - if (here->MOS2mode >= 0) { - xnrm=1; - xrev=0; - cdreq=model->MOS2type*(cdrain-here->MOS2gds*vds- - here->MOS2gm*vgs-here->MOS2gmbs*vbs); - } else { - xnrm=0; - xrev=1; - cdreq = -(model->MOS2type)*(cdrain-here->MOS2gds*(-vds)- - here->MOS2gm*vgd-here->MOS2gmbs*vbd); - } - *(ckt->CKTrhs + here->MOS2gNode) -= - model->MOS2type * (ceqgs + ceqgb + ceqgd); - *(ckt->CKTrhs + here->MOS2bNode) -= - (ceqbs+ceqbd-model->MOS2type * ceqgb); - *(ckt->CKTrhs + here->MOS2dNodePrime) += - ceqbd - cdreq + model->MOS2type * ceqgd; - *(ckt->CKTrhs + here->MOS2sNodePrime) += - cdreq + ceqbs + model->MOS2type * ceqgs; - -#if 0 - printf(" loading %s at time %g\n", here->MOS2name, ckt->CKTtime); - printf("%g %g %g %g %g\n", here->MOS2drainConductance, - gcgd+gcgs+gcgb, here->MOS2sourceConductance, - here->MOS2gbd, here->MOS2gbs); - printf("%g %g %g %g %g\n", -gcgb, 0.0, 0.0, - here->MOS2gds, here->MOS2gm); - printf("%g %g %g %g %g\n", here->MOS2gds, here->MOS2gmbs, - gcgd, -gcgs, -gcgd); - printf("%g %g %g %g %g\n", -gcgs, -gcgd, 0.0, -gcgs, 0.0); -#endif - - /* - * load y matrix - */ - *(here->MOS2DdPtr) += (here->MOS2drainConductance); - *(here->MOS2GgPtr) += gcgd+gcgs+gcgb; - *(here->MOS2SsPtr) += (here->MOS2sourceConductance); - *(here->MOS2BbPtr) += (here->MOS2gbd+here->MOS2gbs+gcgb); - *(here->MOS2DPdpPtr) += here->MOS2drainConductance+here->MOS2gds+ - here->MOS2gbd+xrev*(here->MOS2gm+here->MOS2gmbs)+gcgd; - *(here->MOS2SPspPtr) += here->MOS2sourceConductance+here->MOS2gds+ - here->MOS2gbs+xnrm*(here->MOS2gm+here->MOS2gmbs)+gcgs; - *(here->MOS2DdpPtr) -= here->MOS2drainConductance; - *(here->MOS2GbPtr) -= gcgb; - *(here->MOS2GdpPtr) -= gcgd; - *(here->MOS2GspPtr) -= gcgs; - *(here->MOS2SspPtr) -= here->MOS2sourceConductance; - *(here->MOS2BgPtr) -= gcgb; - *(here->MOS2BdpPtr) -= here->MOS2gbd; - *(here->MOS2BspPtr) -= here->MOS2gbs; - *(here->MOS2DPdPtr) -= here->MOS2drainConductance; - *(here->MOS2DPgPtr) += ((xnrm-xrev)*here->MOS2gm-gcgd); - *(here->MOS2DPbPtr) += (-here->MOS2gbd+(xnrm-xrev)*here->MOS2gmbs); - *(here->MOS2DPspPtr) -= here->MOS2gds+xnrm*(here->MOS2gm+ - here->MOS2gmbs); - *(here->MOS2SPgPtr) -= (xnrm-xrev)*here->MOS2gm+gcgs; - *(here->MOS2SPsPtr) -= here->MOS2sourceConductance; - *(here->MOS2SPbPtr) -= here->MOS2gbs+(xnrm-xrev)*here->MOS2gmbs; - *(here->MOS2SPdpPtr) -= here->MOS2gds+xrev*(here->MOS2gm+ - here->MOS2gmbs); - } - } - return(OK); -} diff --git a/src/spicelib/devices/mos2/mos2mask.c b/src/spicelib/devices/mos2/mos2mask.c deleted file mode 100644 index b3cfda751..000000000 --- a/src/spicelib/devices/mos2/mos2mask.c +++ /dev/null @@ -1,143 +0,0 @@ -/********** -Copyright 1990 Regents of the University of California. All rights reserved. -Author: 1985 Thomas L. Quarles -**********/ - -#include "ngspice/ngspice.h" -#include "ngspice/const.h" -#include "ngspice/ifsim.h" -#include "mos2defs.h" -#include "ngspice/sperror.h" -#include "ngspice/suffix.h" - -int -MOS2mAsk(CKTcircuit *ckt, GENmodel *inModel, int param, - IFvalue *value) -{ - MOS2model *model = (MOS2model *)inModel; - - NG_IGNORE(ckt); - - switch(param) { - case MOS2_MOD_TNOM: - value->rValue = model->MOS2tnom - CONSTCtoK; - break; - case MOS2_MOD_VTO: - value->rValue = model->MOS2vt0; - break; - case MOS2_MOD_KP: - value->rValue = model->MOS2transconductance; - break; - case MOS2_MOD_GAMMA: - value->rValue = model->MOS2gamma; - break; - case MOS2_MOD_PHI: - value->rValue = model->MOS2phi; - break; - case MOS2_MOD_LAMBDA: - value->rValue = model->MOS2lambda; - break; - case MOS2_MOD_RD: - value->rValue = model->MOS2drainResistance; - break; - case MOS2_MOD_RS: - value->rValue = model->MOS2sourceResistance; - break; - case MOS2_MOD_CBD: - value->rValue = model->MOS2capBD; - break; - case MOS2_MOD_CBS: - value->rValue = model->MOS2capBS; - break; - case MOS2_MOD_IS: - value->rValue = model->MOS2jctSatCur; - break; - case MOS2_MOD_PB: - value->rValue = model->MOS2bulkJctPotential; - break; - case MOS2_MOD_CGSO: - value->rValue = model->MOS2gateSourceOverlapCapFactor; - break; - case MOS2_MOD_CGDO: - value->rValue = model->MOS2gateDrainOverlapCapFactor; - break; - case MOS2_MOD_CGBO: - value->rValue = model->MOS2gateBulkOverlapCapFactor; - break; - case MOS2_MOD_CJ: - value->rValue = model->MOS2bulkCapFactor; - break; - case MOS2_MOD_MJ: - value->rValue = model->MOS2bulkJctBotGradingCoeff; - break; - case MOS2_MOD_CJSW: - value->rValue = model->MOS2sideWallCapFactor; - break; - case MOS2_MOD_MJSW: - value->rValue = model->MOS2bulkJctSideGradingCoeff; - break; - case MOS2_MOD_JS: - value->rValue = model->MOS2jctSatCurDensity; - break; - case MOS2_MOD_TOX: - value->rValue = model->MOS2oxideThickness; - break; - case MOS2_MOD_LD: - value->rValue = model->MOS2latDiff; - break; - case MOS2_MOD_RSH: - value->rValue = model->MOS2sheetResistance; - break; - case MOS2_MOD_U0: - value->rValue = model->MOS2surfaceMobility; - break; - case MOS2_MOD_FC: - value->rValue = model->MOS2fwdCapDepCoeff; - break; - case MOS2_MOD_NSUB: - value->rValue = model->MOS2substrateDoping; - break; - case MOS2_MOD_TPG: - value->rValue = model->MOS2gateType; - break; - case MOS2_MOD_NSS: - value->rValue = model->MOS2surfaceStateDensity; - break; - case MOS2_MOD_NFS: - value->rValue = model->MOS2fastSurfaceStateDensity; - break; - case MOS2_MOD_DELTA: - value->rValue = model->MOS2narrowFactor; - break; - case MOS2_MOD_UEXP: - value->rValue = model->MOS2critFieldExp; - break; - case MOS2_MOD_VMAX: - value->rValue = model->MOS2maxDriftVel; - break; - case MOS2_MOD_XJ: - value->rValue = model->MOS2junctionDepth; - break; - case MOS2_MOD_NEFF: - value->rValue = model->MOS2channelCharge; - break; - case MOS2_MOD_UCRIT: - value->rValue = model->MOS2critField; - break; - case MOS2_MOD_KF: - value->rValue = model->MOS2fNcoef; - break; - case MOS2_MOD_AF: - value->rValue = model->MOS2fNexp; - break; - case MOS2_MOD_TYPE: - if (model->MOS2type > 0) - value->sValue = "nmos"; - else - value->sValue = "pmos"; - break; - default: - return(E_BADPARM); - } - return(OK); -} diff --git a/src/spicelib/devices/mos2/mos2mpar.c b/src/spicelib/devices/mos2/mos2mpar.c deleted file mode 100644 index 49967db0a..000000000 --- a/src/spicelib/devices/mos2/mos2mpar.c +++ /dev/null @@ -1,185 +0,0 @@ -/********** -Copyright 1990 Regents of the University of California. All rights reserved. -Author: 1985 Thomas L. Quarles -**********/ -/* - */ - -#include "ngspice/ngspice.h" -#include "ngspice/const.h" -#include "ngspice/ifsim.h" -#include "mos2defs.h" -#include "ngspice/sperror.h" -#include "ngspice/suffix.h" - - -int -MOS2mParam(int param, IFvalue *value, GENmodel *inModel) -{ - MOS2model *model = (MOS2model *)inModel; - switch(param) { - case MOS2_MOD_TNOM: - model->MOS2tnom = value->rValue+CONSTCtoK; - model->MOS2tnomGiven = TRUE; - break; - case MOS2_MOD_VTO: - model->MOS2vt0 = value->rValue; - model->MOS2vt0Given = TRUE; - break; - case MOS2_MOD_KP: - model->MOS2transconductance = value->rValue; - model->MOS2transconductanceGiven = TRUE; - break; - case MOS2_MOD_GAMMA: - model->MOS2gamma = value->rValue; - model->MOS2gammaGiven = TRUE; - break; - case MOS2_MOD_PHI: - model->MOS2phi = value->rValue; - model->MOS2phiGiven = TRUE; - break; - case MOS2_MOD_LAMBDA: - model->MOS2lambda = value->rValue; - model->MOS2lambdaGiven = TRUE; - break; - case MOS2_MOD_RD: - model->MOS2drainResistance = value->rValue; - model->MOS2drainResistanceGiven = TRUE; - break; - case MOS2_MOD_RS: - model->MOS2sourceResistance = value->rValue; - model->MOS2sourceResistanceGiven = TRUE; - break; - case MOS2_MOD_CBD: - model->MOS2capBD = value->rValue; - model->MOS2capBDGiven = TRUE; - break; - case MOS2_MOD_CBS: - model->MOS2capBS = value->rValue; - model->MOS2capBSGiven = TRUE; - break; - case MOS2_MOD_IS: - model->MOS2jctSatCur = value->rValue; - model->MOS2jctSatCurGiven = TRUE; - break; - case MOS2_MOD_PB: - model->MOS2bulkJctPotential = value->rValue; - model->MOS2bulkJctPotentialGiven = TRUE; - break; - case MOS2_MOD_CGSO: - model->MOS2gateSourceOverlapCapFactor = value->rValue; - model->MOS2gateSourceOverlapCapFactorGiven = TRUE; - break; - case MOS2_MOD_CGDO: - model->MOS2gateDrainOverlapCapFactor = value->rValue; - model->MOS2gateDrainOverlapCapFactorGiven = TRUE; - break; - case MOS2_MOD_CGBO: - model->MOS2gateBulkOverlapCapFactor = value->rValue; - model->MOS2gateBulkOverlapCapFactorGiven = TRUE; - break; - case MOS2_MOD_CJ: - model->MOS2bulkCapFactor = value->rValue; - model->MOS2bulkCapFactorGiven = TRUE; - break; - case MOS2_MOD_MJ: - model->MOS2bulkJctBotGradingCoeff = value->rValue; - model->MOS2bulkJctBotGradingCoeffGiven = TRUE; - break; - case MOS2_MOD_CJSW: - model->MOS2sideWallCapFactor = value->rValue; - model->MOS2sideWallCapFactorGiven = TRUE; - break; - case MOS2_MOD_MJSW: - model->MOS2bulkJctSideGradingCoeff = value->rValue; - model->MOS2bulkJctSideGradingCoeffGiven = TRUE; - break; - case MOS2_MOD_JS: - model->MOS2jctSatCurDensity = value->rValue; - model->MOS2jctSatCurDensityGiven = TRUE; - break; - case MOS2_MOD_TOX: - model->MOS2oxideThickness = value->rValue; - model->MOS2oxideThicknessGiven = TRUE; - break; - case MOS2_MOD_LD: - model->MOS2latDiff = value->rValue; - model->MOS2latDiffGiven = TRUE; - break; - case MOS2_MOD_RSH: - model->MOS2sheetResistance = value->rValue; - model->MOS2sheetResistanceGiven = TRUE; - break; - case MOS2_MOD_U0: - model->MOS2surfaceMobility = value->rValue; - model->MOS2surfaceMobilityGiven = TRUE; - break; - case MOS2_MOD_FC: - model->MOS2fwdCapDepCoeff = value->rValue; - model->MOS2fwdCapDepCoeffGiven = TRUE; - break; - case MOS2_MOD_NSUB: - model->MOS2substrateDoping = value->rValue; - model->MOS2substrateDopingGiven = TRUE; - break; - case MOS2_MOD_TPG: - model->MOS2gateType = value->iValue; - model->MOS2gateTypeGiven = TRUE; - break; - case MOS2_MOD_NSS: - model->MOS2surfaceStateDensity = value->rValue; - model->MOS2surfaceStateDensityGiven = TRUE; - break; - case MOS2_MOD_NFS: - model->MOS2fastSurfaceStateDensity = value->rValue; - model->MOS2fastSurfaceStateDensityGiven = TRUE; - break; - case MOS2_MOD_DELTA: - model->MOS2narrowFactor = value->rValue; - model->MOS2narrowFactorGiven = TRUE; - break; - case MOS2_MOD_UEXP: - model->MOS2critFieldExp = value->rValue; - model->MOS2critFieldExpGiven = TRUE; - break; - case MOS2_MOD_VMAX: - model->MOS2maxDriftVel = value->rValue; - model->MOS2maxDriftVelGiven = TRUE; - break; - case MOS2_MOD_XJ: - model->MOS2junctionDepth = value->rValue; - model->MOS2junctionDepthGiven = TRUE; - break; - case MOS2_MOD_NEFF: - model->MOS2channelCharge = value->rValue; - model->MOS2channelChargeGiven = TRUE; - break; - case MOS2_MOD_UCRIT: - model->MOS2critField = value->rValue; - model->MOS2critFieldGiven = TRUE; - break; - case MOS2_MOD_NMOS: - if(value->iValue) { - model->MOS2type = 1; - model->MOS2typeGiven = TRUE; - } - break; - case MOS2_MOD_PMOS: - if(value->iValue) { - model->MOS2type = -1; - model->MOS2typeGiven = TRUE; - } - break; - case MOS2_MOD_KF: - model->MOS2fNcoef = value->rValue; - model->MOS2fNcoefGiven = TRUE; - break; - case MOS2_MOD_AF: - model->MOS2fNexp = value->rValue; - model->MOS2fNexpGiven = TRUE; - break; - default: - return(E_BADPARM); - } - return(OK); -} diff --git a/src/spicelib/devices/mos2/mos2noi.c b/src/spicelib/devices/mos2/mos2noi.c deleted file mode 100644 index 4069c653c..000000000 --- a/src/spicelib/devices/mos2/mos2noi.c +++ /dev/null @@ -1,180 +0,0 @@ -/********** -Copyright 1990 Regents of the University of California. All rights reserved. -Author: 1987 Gary W. Ng -Modified: 2000 AlansFixes -**********/ - -#include "ngspice/ngspice.h" -#include "mos2defs.h" -#include "ngspice/cktdefs.h" -#include "ngspice/iferrmsg.h" -#include "ngspice/noisedef.h" -#include "ngspice/suffix.h" - -/* - * MOS2noise (mode, operation, firstModel, ckt, data, OnDens) - * This routine names and evaluates all of the noise sources - * associated with MOSFET's. It starts with the model *firstModel and - * traverses all of its insts. It then proceeds to any other models - * on the linked list. The total output noise density generated by - * all of the MOSFET's is summed with the variable "OnDens". - */ - - -int -MOS2noise (int mode, int operation, GENmodel *genmodel, CKTcircuit *ckt, - Ndata *data, double *OnDens) -{ - NOISEAN *job = (NOISEAN *) ckt->CKTcurJob; - - MOS2model *firstModel = (MOS2model *) genmodel; - MOS2model *model; - MOS2instance *inst; - double tempOnoise; - double tempInoise; - double noizDens[MOS2NSRCS]; - double lnNdens[MOS2NSRCS]; - int i; - - /* define the names of the noise sources */ - - static char *MOS2nNames[MOS2NSRCS] = { /* Note that we have to keep the order */ - "_rd", /* noise due to rd */ /* consistent with thestrchr definitions */ - "_rs", /* noise due to rs */ /* in MOS2defs.h */ - "_id", /* noise due to id */ - "_1overf", /* flicker (1/f) noise */ - "" /* total transistor noise */ - }; - - for (model=firstModel; model != NULL; model=MOS2nextModel(model)) { - for (inst=MOS2instances(model); inst != NULL; inst=MOS2nextInstance(inst)) { - - switch (operation) { - - case N_OPEN: - - /* see if we have to to produce a summary report */ - /* if so, name all the noise generators */ - - if (job->NStpsSm != 0) { - switch (mode) { - - case N_DENS: - for (i=0; i < MOS2NSRCS; i++) { - NOISE_ADD_OUTVAR(ckt, data, "onoise_%s%s", inst->MOS2name, MOS2nNames[i]); - } - break; - - case INT_NOIZ: - for (i=0; i < MOS2NSRCS; i++) { - NOISE_ADD_OUTVAR(ckt, data, "onoise_total_%s%s", inst->MOS2name, MOS2nNames[i]); - NOISE_ADD_OUTVAR(ckt, data, "inoise_total_%s%s", inst->MOS2name, MOS2nNames[i]); - } - break; - } - } - break; - - case N_CALC: - switch (mode) { - - case N_DENS: - NevalSrc(&noizDens[MOS2RDNOIZ],&lnNdens[MOS2RDNOIZ], - ckt,THERMNOISE,inst->MOS2dNodePrime,inst->MOS2dNode, - inst->MOS2drainConductance); - - NevalSrc(&noizDens[MOS2RSNOIZ],&lnNdens[MOS2RSNOIZ], - ckt,THERMNOISE,inst->MOS2sNodePrime,inst->MOS2sNode, - inst->MOS2sourceConductance); - - NevalSrc(&noizDens[MOS2IDNOIZ],&lnNdens[MOS2IDNOIZ], - ckt,THERMNOISE,inst->MOS2dNodePrime,inst->MOS2sNodePrime, - (2.0/3.0 * fabs(inst->MOS2gm))); - - NevalSrc(&noizDens[MOS2FLNOIZ], NULL, ckt, - N_GAIN,inst->MOS2dNodePrime, inst->MOS2sNodePrime, - (double)0.0); - noizDens[MOS2FLNOIZ] *= model->MOS2fNcoef * - exp(model->MOS2fNexp * - log(MAX(fabs(inst->MOS2cd),N_MINLOG))) / - (data->freq * inst->MOS2w * - inst->MOS2m * - (inst->MOS2l - 2*model->MOS2latDiff) * - model->MOS2oxideCapFactor * model->MOS2oxideCapFactor); - lnNdens[MOS2FLNOIZ] = - log(MAX(noizDens[MOS2FLNOIZ],N_MINLOG)); - - noizDens[MOS2TOTNOIZ] = noizDens[MOS2RDNOIZ] + - noizDens[MOS2RSNOIZ] + - noizDens[MOS2IDNOIZ] + - noizDens[MOS2FLNOIZ]; - lnNdens[MOS2TOTNOIZ] = - log(MAX(noizDens[MOS2TOTNOIZ], N_MINLOG)); - - *OnDens += noizDens[MOS2TOTNOIZ]; - - if (data->delFreq == 0.0) { - - /* if we haven't done any previous integration, we need to */ - /* initialize our "history" variables */ - - for (i=0; i < MOS2NSRCS; i++) { - inst->MOS2nVar[LNLSTDENS][i] = lnNdens[i]; - } - - /* clear out our integration variables if it's the first pass */ - - if (data->freq == job->NstartFreq) { - for (i=0; i < MOS2NSRCS; i++) { - inst->MOS2nVar[OUTNOIZ][i] = 0.0; - inst->MOS2nVar[INNOIZ][i] = 0.0; - } - } - } else { /* data->delFreq != 0.0 (we have to integrate) */ - for (i=0; i < MOS2NSRCS; i++) { - if (i != MOS2TOTNOIZ) { - tempOnoise = Nintegrate(noizDens[i], lnNdens[i], - inst->MOS2nVar[LNLSTDENS][i], data); - tempInoise = Nintegrate(noizDens[i] * data->GainSqInv , - lnNdens[i] + data->lnGainInv, - inst->MOS2nVar[LNLSTDENS][i] + data->lnGainInv, - data); - inst->MOS2nVar[LNLSTDENS][i] = lnNdens[i]; - data->outNoiz += tempOnoise; - data->inNoise += tempInoise; - if (job->NStpsSm != 0) { - inst->MOS2nVar[OUTNOIZ][i] += tempOnoise; - inst->MOS2nVar[OUTNOIZ][MOS2TOTNOIZ] += tempOnoise; - inst->MOS2nVar[INNOIZ][i] += tempInoise; - inst->MOS2nVar[INNOIZ][MOS2TOTNOIZ] += tempInoise; - } - } - } - } - if (data->prtSummary) { - for (i=0; i < MOS2NSRCS; i++) { /* print a summary report */ - data->outpVector[data->outNumber++] = noizDens[i]; - } - } - break; - - case INT_NOIZ: /* already calculated, just output */ - if (job->NStpsSm != 0) { - for (i=0; i < MOS2NSRCS; i++) { - data->outpVector[data->outNumber++] = inst->MOS2nVar[OUTNOIZ][i]; - data->outpVector[data->outNumber++] = inst->MOS2nVar[INNOIZ][i]; - } - } /* if */ - break; - } /* switch (mode) */ - break; - - case N_CLOSE: - return (OK); /* do nothing, the main calling routine will close */ - break; /* the plots */ - } /* switch (operation) */ - } /* for inst */ - } /* for model */ - -return(OK); -} diff --git a/src/spicelib/devices/mos2/mos2par.c b/src/spicelib/devices/mos2/mos2par.c deleted file mode 100644 index 732be5471..000000000 --- a/src/spicelib/devices/mos2/mos2par.c +++ /dev/null @@ -1,128 +0,0 @@ -/********** -Copyright 1990 Regents of the University of California. All rights reserved. -Author: 1985 Thomas L. Quarles -Modified: 2000 AlansFixes -**********/ -/* - */ - -#include "ngspice/ngspice.h" -#include "ngspice/const.h" -#include "ngspice/ifsim.h" -#include "mos2defs.h" -#include "ngspice/sperror.h" -#include "ngspice/suffix.h" -#include "ngspice/fteext.h" - - -/* ARGSUSED */ -int -MOS2param(int param, IFvalue *value, GENinstance *inst, - IFvalue *select) -{ - double scale; - - MOS2instance *here = (MOS2instance *)inst; - - NG_IGNORE(select); - - if (!cp_getvar("scale", CP_REAL, &scale, 0)) - scale = 1; - - switch (param) { - case MOS2_TEMP: - here->MOS2temp = value->rValue+CONSTCtoK; - here->MOS2tempGiven = TRUE; - break; - case MOS2_DTEMP: - here->MOS2dtemp = value->rValue; - here->MOS2dtempGiven = TRUE; - break; - case MOS2_M: - here->MOS2m = value->rValue; - here->MOS2mGiven = TRUE; - break; - case MOS2_W: - here->MOS2w = value->rValue * scale; - here->MOS2wGiven = TRUE; - break; - case MOS2_L: - here->MOS2l = value->rValue * scale; - here->MOS2lGiven = TRUE; - break; - case MOS2_AS: - here->MOS2sourceArea = value->rValue * scale * scale; - here->MOS2sourceAreaGiven = TRUE; - break; - case MOS2_AD: - here->MOS2drainArea = value->rValue * scale * scale; - here->MOS2drainAreaGiven = TRUE; - break; - case MOS2_PS: - here->MOS2sourcePerimiter = value->rValue * scale; - here->MOS2sourcePerimiterGiven = TRUE; - break; - case MOS2_PD: - here->MOS2drainPerimiter = value->rValue * scale; - here->MOS2drainPerimiterGiven = TRUE; - break; - case MOS2_NRS: - here->MOS2sourceSquares = value->rValue; - here->MOS2sourceSquaresGiven = TRUE; - break; - case MOS2_NRD: - here->MOS2drainSquares = value->rValue; - here->MOS2drainSquaresGiven = TRUE; - break; - case MOS2_OFF: - here->MOS2off = (value->iValue != 0); - break; - case MOS2_IC_VBS: - here->MOS2icVBS = value->rValue; - here->MOS2icVBSGiven = TRUE; - break; - case MOS2_IC_VDS: - here->MOS2icVDS = value->rValue; - here->MOS2icVDSGiven = TRUE; - break; - case MOS2_IC_VGS: - here->MOS2icVGS = value->rValue; - here->MOS2icVGSGiven = TRUE; - break; - case MOS2_IC: - /* FALLTHROUGH added to suppress GCC warning due to - * -Wimplicit-fallthrough flag */ - switch (value->v.numValue) { - case 3: - here->MOS2icVBS = *(value->v.vec.rVec+2); - here->MOS2icVBSGiven = TRUE; - /* FALLTHROUGH */ - case 2: - here->MOS2icVGS = *(value->v.vec.rVec+1); - here->MOS2icVGSGiven = TRUE; - /* FALLTHROUGH */ - case 1: - here->MOS2icVDS = *(value->v.vec.rVec); - here->MOS2icVDSGiven = TRUE; - break; - default: - return(E_BADPARM); - } - break; - case MOS2_L_SENS: - if(value->iValue) { - here->MOS2senParmNo = 1; - here->MOS2sens_l = 1; - } - break; - case MOS2_W_SENS: - if(value->iValue) { - here->MOS2senParmNo = 1; - here->MOS2sens_w = 1; - } - break; - default: - return(E_BADPARM); - } - return(OK); -} diff --git a/src/spicelib/devices/mos2/mos2pzld.c b/src/spicelib/devices/mos2/mos2pzld.c deleted file mode 100644 index c7c262937..000000000 --- a/src/spicelib/devices/mos2/mos2pzld.c +++ /dev/null @@ -1,132 +0,0 @@ -/********** -Copyright 1990 Regents of the University of California. All rights reserved. -Author: 1985 Thomas L. Quarles -Modified: 2000 AlansFixes -**********/ -/* - */ - -#include "ngspice/ngspice.h" -#include "ngspice/cktdefs.h" -#include "ngspice/complex.h" -#include "mos2defs.h" -#include "ngspice/sperror.h" -#include "ngspice/suffix.h" - - -int -MOS2pzLoad(GENmodel *inModel, CKTcircuit *ckt, SPcomplex *s) -{ - MOS2model *model = (MOS2model *)inModel; - MOS2instance *here; - int xnrm; - int xrev; - double xgs; - double xgd; - double xgb; - double xbd; - double xbs; - double capgs; - double capgd; - double capgb; - double GateBulkOverlapCap; - double GateDrainOverlapCap; - double GateSourceOverlapCap; - double EffectiveLength; - - for( ; model != NULL; model = MOS2nextModel(model)) { - for(here = MOS2instances(model); here!= NULL; - here = MOS2nextInstance(here)) { - - if (here->MOS2mode < 0) { - xnrm=0; - xrev=1; - } else { - xnrm=1; - xrev=0; - } - /* - * meyer's model parameters - */ - EffectiveLength=here->MOS2l - 2*model->MOS2latDiff; - - GateSourceOverlapCap = model->MOS2gateSourceOverlapCapFactor * - here->MOS2m * here->MOS2w; - GateDrainOverlapCap = model->MOS2gateDrainOverlapCapFactor * - here->MOS2m * here->MOS2w; - GateBulkOverlapCap = model->MOS2gateBulkOverlapCapFactor * - here->MOS2m * EffectiveLength; - - capgs = ( 2* *(ckt->CKTstate0+here->MOS2capgs)+ - GateSourceOverlapCap ); - capgd = ( 2* *(ckt->CKTstate0+here->MOS2capgd)+ - GateDrainOverlapCap ); - capgb = ( 2* *(ckt->CKTstate0+here->MOS2capgb)+ - GateBulkOverlapCap ); - xgs = capgs; - xgd = capgd; - xgb = capgb; - xbd = here->MOS2capbd; - xbs = here->MOS2capbs; - /*printf("mos2: xgs=%g, xgd=%g, xgb=%g, xbd=%g, xbs=%g\n", - xgs,xgd,xgb,xbd,xbs);*/ - /* - * load matrix - */ - - *(here->MOS2GgPtr ) += (xgd+xgs+xgb)*s->real; - *(here->MOS2GgPtr +1) += (xgd+xgs+xgb)*s->imag; - *(here->MOS2BbPtr ) += (xgb+xbd+xbs)*s->real; - *(here->MOS2BbPtr +1) += (xgb+xbd+xbs)*s->imag; - *(here->MOS2DPdpPtr ) += (xgd+xbd)*s->real; - *(here->MOS2DPdpPtr +1) += (xgd+xbd)*s->imag; - *(here->MOS2SPspPtr ) += (xgs+xbs)*s->real; - *(here->MOS2SPspPtr +1) += (xgs+xbs)*s->imag; - *(here->MOS2GbPtr ) -= xgb*s->real; - *(here->MOS2GbPtr +1) -= xgb*s->imag; - *(here->MOS2GdpPtr ) -= xgd*s->real; - *(here->MOS2GdpPtr +1) -= xgd*s->imag; - *(here->MOS2GspPtr ) -= xgs*s->real; - *(here->MOS2GspPtr +1) -= xgs*s->imag; - *(here->MOS2BgPtr ) -= xgb*s->real; - *(here->MOS2BgPtr +1) -= xgb*s->imag; - *(here->MOS2BdpPtr ) -= xbd*s->real; - *(here->MOS2BdpPtr +1) -= xbd*s->imag; - *(here->MOS2BspPtr ) -= xbs*s->real; - *(here->MOS2BspPtr +1) -= xbs*s->imag; - *(here->MOS2DPgPtr ) -= xgd*s->real; - *(here->MOS2DPgPtr +1) -= xgd*s->imag; - *(here->MOS2DPbPtr ) -= xbd*s->real; - *(here->MOS2DPbPtr +1) -= xbd*s->imag; - *(here->MOS2SPgPtr ) -= xgs*s->real; - *(here->MOS2SPgPtr +1) -= xgs*s->imag; - *(here->MOS2SPbPtr ) -= xbs*s->real; - *(here->MOS2SPbPtr +1) -= xbs*s->imag; - *(here->MOS2DdPtr) += here->MOS2drainConductance; - *(here->MOS2SsPtr) += here->MOS2sourceConductance; - *(here->MOS2BbPtr) += here->MOS2gbd+here->MOS2gbs; - *(here->MOS2DPdpPtr) += here->MOS2drainConductance+ - here->MOS2gds+here->MOS2gbd+ - xrev*(here->MOS2gm+here->MOS2gmbs); - *(here->MOS2SPspPtr) += here->MOS2sourceConductance+ - here->MOS2gds+here->MOS2gbs+ - xnrm*(here->MOS2gm+here->MOS2gmbs); - *(here->MOS2DdpPtr) -= here->MOS2drainConductance; - *(here->MOS2SspPtr) -= here->MOS2sourceConductance; - *(here->MOS2BdpPtr) -= here->MOS2gbd; - *(here->MOS2BspPtr) -= here->MOS2gbs; - *(here->MOS2DPdPtr) -= here->MOS2drainConductance; - *(here->MOS2DPgPtr) += (xnrm-xrev)*here->MOS2gm; - *(here->MOS2DPbPtr) += -here->MOS2gbd+(xnrm-xrev)*here->MOS2gmbs; - *(here->MOS2DPspPtr) -= here->MOS2gds+ - xnrm*(here->MOS2gm+here->MOS2gmbs); - *(here->MOS2SPgPtr) -= (xnrm-xrev)*here->MOS2gm; - *(here->MOS2SPsPtr) -= here->MOS2sourceConductance; - *(here->MOS2SPbPtr) -= here->MOS2gbs+(xnrm-xrev)*here->MOS2gmbs; - *(here->MOS2SPdpPtr) -= here->MOS2gds+ - xrev*(here->MOS2gm+here->MOS2gmbs); - - } - } - return(OK); -} diff --git a/src/spicelib/devices/mos2/mos2sacl.c b/src/spicelib/devices/mos2/mos2sacl.c deleted file mode 100644 index 4b2561c49..000000000 --- a/src/spicelib/devices/mos2/mos2sacl.c +++ /dev/null @@ -1,781 +0,0 @@ -/********** -Copyright 1990 Regents of the University of California. All rights reserved. -Author: 1985 Thomas L. Quarles - -This function is obsolete (was used by an old sensitivity analysis) -**********/ - -/* actually load the current ac sensitivity - * information into the array previously provided - */ - -#include "ngspice/ngspice.h" -#include "ngspice/smpdefs.h" -#include "ngspice/cktdefs.h" -#include "ngspice/const.h" -#include "mos2defs.h" -#include "ngspice/sperror.h" -#include "ngspice/suffix.h" - -int -MOS2sAcLoad(GENmodel *inModel, CKTcircuit *ckt) -{ - MOS2model *model = (MOS2model *)inModel; - MOS2instance *here; - int xnrm; - int xrev; - double A0; - double Apert = 0.0; - double DELA; - double DELAinv; - double gdpr0; - double gspr0; - double gds0; - double gbs0; - double gbd0; - double gm0; - double gmbs0; - double gdpr; - double gspr; - double gds; - double gbs; - double gbd; - double gm; - double gmbs; - double xcgs0; - double xcgd0; - double xcgb0; - double xbd0; - double xbs0; - double xcgs; - double xcgd; - double xcgb; - double xbd; - double xbs; - double vbsOp; - double vbdOp; - double vspr; - double vdpr; - double vgs; - double vgd; - double vgb; - double vbs; - double vbd; - double vds; - double ivspr; - double ivdpr; - double ivgs; - double ivgd; - double ivgb; - double ivbs; - double ivbd; - double ivds; - double cspr; - double cdpr; - double cgs; - double cgd; - double cgb; - double cbs; - double cbd; - double cds; - double cs0; - double csprm0; - double cd0; - double cdprm0; - double cg0; - double cb0; - double cs; - double csprm; - double cd; - double cdprm; - double cg; - double cb; - double icspr; - double icdpr; - double icgs; - double icgd; - double icgb; - double icbs; - double icbd; - double icds; - double ics0; - double icsprm0; - double icd0; - double icdprm0; - double icg0; - double icb0; - double ics; - double icsprm; - double icd; - double icdprm; - double icg; - double icb; - double DvDp = 0.0; - int i; - int flag; - int error; - int iparmno; - double arg; - double sarg; - double sargsw; - double SaveState[44]; - int save_mode; - SENstruct *info; - -#ifdef SENSDEBUG - printf("MOS2senacload\n"); - printf("CKTomega = %.5e\n",ckt->CKTomega); -#endif /* SENSDEBUG */ - info = ckt->CKTsenInfo; - info->SENstatus = PERTURBATION; - for( ; model != NULL; model = MOS2nextModel(model)) { - for(here = MOS2instances(model); here!= NULL; - here = MOS2nextInstance(here)) { - - /* save the unperturbed values in the state vector */ - for(i=0; i <= 16; i++) - *(SaveState + i) = *(ckt->CKTstate0 + here->MOS2states + i); - - *(SaveState + 17) = here->MOS2sourceConductance; - *(SaveState + 18) = here->MOS2drainConductance; - *(SaveState + 19) = here->MOS2cd; - *(SaveState + 20) = here->MOS2cbs; - *(SaveState + 21) = here->MOS2cbd; - *(SaveState + 22) = here->MOS2gmbs; - *(SaveState + 23) = here->MOS2gm; - *(SaveState + 24) = here->MOS2gds; - *(SaveState + 25) = here->MOS2gbd; - *(SaveState + 26) = here->MOS2gbs; - *(SaveState + 27) = here->MOS2capbd; - *(SaveState + 28) = here->MOS2capbs; - *(SaveState + 29) = here->MOS2Cbd; - *(SaveState + 30) = here->MOS2Cbdsw; - *(SaveState + 31) = here->MOS2Cbs; - *(SaveState + 32) = here->MOS2Cbssw; - *(SaveState + 33) = here->MOS2f2d; - *(SaveState + 34) = here->MOS2f3d; - *(SaveState + 35) = here->MOS2f4d; - *(SaveState + 36) = here->MOS2f2s; - *(SaveState + 37) = here->MOS2f3s; - *(SaveState + 38) = here->MOS2f4s; - *(SaveState + 39) = here->MOS2cgs; - *(SaveState + 40) = here->MOS2cgd; - *(SaveState + 41) = here->MOS2cgb; - *(SaveState + 42) = here->MOS2vdsat; - *(SaveState + 43) = here->MOS2von; - save_mode = here->MOS2mode; - - xnrm=1; - xrev=0; - if (here->MOS2mode < 0) { - xnrm=0; - xrev=1; - } - - vbsOp = model->MOS2type * ( - *(ckt->CKTrhsOp+here->MOS2bNode) - - *(ckt->CKTrhsOp+here->MOS2sNodePrime)); - vbdOp = model->MOS2type * ( - *(ckt->CKTrhsOp+here->MOS2bNode) - - *(ckt->CKTrhsOp+here->MOS2dNodePrime)); - vspr = *(ckt->CKTrhsOld + here->MOS2sNode) - - *(ckt->CKTrhsOld + - here->MOS2sNodePrime) ; - ivspr = *(ckt->CKTirhsOld + here->MOS2sNode) - - *(ckt->CKTirhsOld + - here->MOS2sNodePrime) ; - vdpr = *(ckt->CKTrhsOld + here->MOS2dNode) - - *(ckt->CKTrhsOld + - here->MOS2dNodePrime) ; - ivdpr = *(ckt->CKTirhsOld + here->MOS2dNode) - - *(ckt->CKTirhsOld + - here->MOS2dNodePrime) ; - vgb = *(ckt->CKTrhsOld + here->MOS2gNode) - - *(ckt->CKTrhsOld + - here->MOS2bNode) ; - ivgb = *(ckt->CKTirhsOld + here->MOS2gNode) - - *(ckt->CKTirhsOld + - here->MOS2bNode) ; - vbs = *(ckt->CKTrhsOld + here->MOS2bNode) - - *(ckt->CKTrhsOld + - here->MOS2sNodePrime) ; - ivbs = *(ckt->CKTirhsOld + here->MOS2bNode) - - *(ckt->CKTirhsOld + - here->MOS2sNodePrime) ; - vbd = *(ckt->CKTrhsOld + here->MOS2bNode) - - *(ckt->CKTrhsOld + - here->MOS2dNodePrime) ; - ivbd = *(ckt->CKTirhsOld + here->MOS2bNode) - - *(ckt->CKTirhsOld + - here->MOS2dNodePrime) ; - vds = vbs - vbd ; - ivds = ivbs - ivbd ; - vgs = vgb + vbs ; - ivgs = ivgb + ivbs ; - vgd = vgb + vbd ; - ivgd = ivgb + ivbd ; - -#ifdef SENSDEBUG - printf("senacload instance name %s\n",here->MOS2name); - printf("gate = %d ,drain = %d, drainprm = %d\n", - here->MOS2gNode,here->MOS2dNode,here->MOS2dNodePrime); - printf("source = %d , sourceprm = %d ,body = %d, senparmno = %d\n", - here->MOS2sNode ,here->MOS2sNodePrime, - here->MOS2bNode,here->MOS2senParmNo); - printf("\n without perturbation \n"); -#endif /* SENSDEBUG */ - /* without perturbation */ - *(ckt->CKTstate0 + here->MOS2vbs) = vbsOp; - *(ckt->CKTstate0 + here->MOS2vbd) = vbdOp; - - here->MOS2senPertFlag = ON ; - if(info->SENacpertflag == 1){ - /* store the unperturbed values of small signal parameters */ - if((error = MOS2load((GENmodel*)model,ckt)) != 0) - return(error); - *(here->MOS2senCgs) = here->MOS2cgs; - *(here->MOS2senCgd) = here->MOS2cgd; - *(here->MOS2senCgb) = here->MOS2cgb; - *(here->MOS2senCbd) = here->MOS2capbd; - *(here->MOS2senCbs) = here->MOS2capbs; - *(here->MOS2senGds) = here->MOS2gds; - *(here->MOS2senGbs) = here->MOS2gbs; - *(here->MOS2senGbd) = here->MOS2gbd; - *(here->MOS2senGm) = here->MOS2gm; - *(here->MOS2senGmbs) = here->MOS2gmbs; - - } - xcgs0= *(here->MOS2senCgs) * ckt->CKTomega; - xcgd0= *(here->MOS2senCgd) * ckt->CKTomega; - xcgb0= *(here->MOS2senCgb) * ckt->CKTomega; - xbd0= *(here->MOS2senCbd) * ckt->CKTomega; - xbs0= *(here->MOS2senCbs) * ckt->CKTomega; - gds0= *(here->MOS2senGds); - gbs0= *(here->MOS2senGbs); - gbd0= *(here->MOS2senGbd); - gm0= *(here->MOS2senGm); - gmbs0= *(here->MOS2senGmbs); - gdpr0 = here->MOS2drainConductance; - gspr0 = here->MOS2sourceConductance; - - - cspr = gspr0 * vspr ; - icspr = gspr0 * ivspr ; - cdpr = gdpr0 * vdpr ; - icdpr = gdpr0 * ivdpr ; - cgs = ( - xcgs0 * ivgs ); - icgs = xcgs0 * vgs ; - cgd = ( - xcgd0 * ivgd ); - icgd = xcgd0 * vgd ; - cgb = ( - xcgb0 * ivgb ); - icgb = xcgb0 * vgb ; - cbs = ( gbs0 * vbs - xbs0 * ivbs ); - icbs = ( xbs0 * vbs + gbs0 * ivbs ); - cbd = ( gbd0 * vbd - xbd0 * ivbd ); - icbd = ( xbd0 * vbd + gbd0 * ivbd ); - cds = ( gds0 * vds + xnrm * (gm0 * vgs + gmbs0 * vbs) - - xrev * (gm0 * vgd + gmbs0 * vbd) ); - icds = ( gds0 * ivds + xnrm * (gm0 * ivgs + gmbs0 * ivbs) - - xrev * (gm0 * ivgd + gmbs0 * ivbd) ); - - cs0 = cspr; - ics0 = icspr; - csprm0 = ( -cspr - cgs - cbs - cds ) ; - icsprm0 = ( -icspr - icgs - icbs - icds ) ; - cd0 = cdpr; - icd0 = icdpr; - cdprm0 = ( -cdpr - cgd - cbd + cds ) ; - icdprm0 = ( -icdpr - icgd - icbd + icds ) ; - cg0 = cgs + cgd + cgb ; - icg0 = icgs + icgd + icgb ; - cb0 = cbs + cbd - cgb ; - icb0 = icbs + icbd - icgb ; -#ifdef SENSDEBUG - printf("gspr0 = %.7e , gdpr0 = %.7e , gds0 = %.7e, gbs0 = %.7e\n", - gspr0,gdpr0,gds0,gbs0); - printf("gbd0 = %.7e , gm0 = %.7e , gmbs0 = %.7e\n",gbd0,gm0,gmbs0); - printf("xcgs0 = %.7e , xcgd0 = %.7e , xcgb0 = %.7e,", - xcgs0,xcgd0,xcgb0); - printf("xbd0 = %.7e,xbs0 = %.7e\n", xbd0,xbs0); - printf("vbs = %.7e , vbd = %.7e , vgb = %.7e\n",vbs,vbd,vgb); - printf("ivbs = %.7e , ivbd = %.7e , ivgb = %.7e\n",ivbs,ivbd,ivgb); - printf("cbs0 = %.7e , cbd0 = %.7e , cgb0 = %.7e\n",cbs,cbd,cgb); - printf("cb0 = %.7e , cg0 = %.7e , cs0 = %.7e\n",cb0,cg0,cs0); - printf("csprm0 = %.7e, cd0 = %.7e, cdprm0 = %.7e\n", - csprm0,cd0,cdprm0); - printf("icb0 = %.7e , icg0 = %.7e , ics0 = %.7e\n",icb0,icg0,ics0); - printf("icsprm0 = %.7e, icd0 = %.7e, icdprm0 = %.7e\n", - icsprm0,icd0,icdprm0); - printf("\nPerturbation of vbs\n"); -#endif /* SENSDEBUG */ - - /* Perturbation of vbs */ - flag = 1; - A0 = vbsOp; - DELA = info->SENpertfac * CONSTvt0 ; - DELAinv = 1.0/DELA; - - if(info->SENacpertflag == 1){ - /* store the values of small signal parameters - * corresponding to perturbed vbs */ - Apert = A0 + DELA; - *(ckt->CKTstate0 + here->MOS2vbs) = Apert; - *(ckt->CKTstate0 + here->MOS2vbd) = vbdOp; - - if((error = MOS2load((GENmodel*)model,ckt)) != 0) - return(error); - - *(here->MOS2senCgs + 1) = here->MOS2cgs; - *(here->MOS2senCgd + 1) = here->MOS2cgd; - *(here->MOS2senCgb + 1) = here->MOS2cgb; - *(here->MOS2senCbd + 1) = here->MOS2capbd; - *(here->MOS2senCbs + 1) = here->MOS2capbs; - *(here->MOS2senGds + 1) = here->MOS2gds; - *(here->MOS2senGbs + 1) = here->MOS2gbs; - *(here->MOS2senGbd + 1) = here->MOS2gbd; - *(here->MOS2senGm + 1) = here->MOS2gm; - *(here->MOS2senGmbs + 1) = here->MOS2gmbs; - - *(ckt->CKTstate0 + here->MOS2vbs) = A0; - - - } - - goto load; - - -pertvbd: /* Perturbation of vbd */ -#ifdef SENSDEBUG - printf("\nPerturbation of vbd\n"); -#endif /* SENSDEBUG */ - - flag = 2; - A0 = vbdOp; - DELA = info->SENpertfac * CONSTvt0 + 1e-8; - DELAinv = 1.0/DELA; - - if(info->SENacpertflag == 1){ - /* store the values of small signal parameters - * corresponding to perturbed vbd */ - Apert = A0 + DELA; - *(ckt->CKTstate0 + here->MOS2vbs) = vbsOp; - *(ckt->CKTstate0 + here->MOS2vbd) = Apert; - - if((error = MOS2load((GENmodel*)model,ckt)) != 0) - return(error); - - *(here->MOS2senCgs + 2) = here->MOS2cgs; - *(here->MOS2senCgd + 2) = here->MOS2cgd; - *(here->MOS2senCgb + 2) = here->MOS2cgb; - *(here->MOS2senCbd + 2) = here->MOS2capbd; - *(here->MOS2senCbs + 2) = here->MOS2capbs; - *(here->MOS2senGds + 2) = here->MOS2gds; - *(here->MOS2senGbs + 2) = here->MOS2gbs; - *(here->MOS2senGbd + 2) = here->MOS2gbd; - *(here->MOS2senGm + 2) = here->MOS2gm; - *(here->MOS2senGmbs + 2) = here->MOS2gmbs; - - *(ckt->CKTstate0 + here->MOS2vbd) = A0; - - } - - goto load; - - -pertvgb: /* Perturbation of vgb */ -#ifdef SENSDEBUG - printf("\nPerturbation of vgb\n"); -#endif /* SENSDEBUG */ - - flag = 3; - A0 = model->MOS2type * (*(ckt->CKTrhsOp + here->MOS2gNode) - - *(ckt->CKTrhsOp + here->MOS2bNode)); - DELA = info->SENpertfac * A0 + 1e-8; - DELAinv = model->MOS2type * 1.0/DELA; - - - if(info->SENacpertflag == 1){ - /* store the values of small signal parameters - * corresponding to perturbed vgb */ - *(ckt->CKTstate0 + here->MOS2vbs) = vbsOp; - *(ckt->CKTstate0 + here->MOS2vbd) = vbdOp; - *(ckt->CKTrhsOp + here->MOS2bNode) -= DELA; - - if((error = MOS2load((GENmodel*)model,ckt)) != 0) - return(error); - - *(here->MOS2senCgs + 3) = here->MOS2cgs; - *(here->MOS2senCgd + 3) = here->MOS2cgd; - *(here->MOS2senCgb + 3) = here->MOS2cgb; - *(here->MOS2senCbd + 3) = here->MOS2capbd; - *(here->MOS2senCbs + 3) = here->MOS2capbs; - *(here->MOS2senGds + 3) = here->MOS2gds; - *(here->MOS2senGbs + 3) = here->MOS2gbs; - *(here->MOS2senGbd + 3) = here->MOS2gbd; - *(here->MOS2senGm + 3) = here->MOS2gm; - *(here->MOS2senGmbs + 3) = here->MOS2gmbs; - - - *(ckt->CKTrhsOp + here->MOS2bNode) += DELA; - } - goto load; - -pertl: /* Perturbation of length */ - - if(here->MOS2sens_l == 0){ - goto pertw; - } -#ifdef SENSDEBUG - printf("\nPerturbation of length\n"); -#endif /* SENSDEBUG */ - flag = 4; - A0 = here->MOS2l; - DELA = info->SENpertfac * A0; - DELAinv = 1.0/DELA; - - if(info->SENacpertflag == 1){ - /* store the values of small signal parameters - * corresponding to perturbed length */ - Apert = A0 + DELA; - here->MOS2l = Apert; - - *(ckt->CKTstate0 + here->MOS2vbs) = vbsOp; - *(ckt->CKTstate0 + here->MOS2vbd) = vbdOp; - - if((error = MOS2load((GENmodel*)model,ckt)) != 0) return(error); - - *(here->MOS2senCgs + 4) = here->MOS2cgs; - *(here->MOS2senCgd + 4) = here->MOS2cgd; - *(here->MOS2senCgb + 4) = here->MOS2cgb; - *(here->MOS2senCbd + 4) = here->MOS2capbd; - *(here->MOS2senCbs + 4) = here->MOS2capbs; - *(here->MOS2senGds + 4) = here->MOS2gds; - *(here->MOS2senGbs + 4) = here->MOS2gbs; - *(here->MOS2senGbd + 4) = here->MOS2gbd; - *(here->MOS2senGm + 4) = here->MOS2gm; - *(here->MOS2senGmbs + 4) = here->MOS2gmbs; - - here->MOS2l = A0; - - } - - goto load; - -pertw: /* Perturbation of width */ - if(here->MOS2sens_w == 0) - goto next; -#ifdef SENSDEBUG - printf("\nPerturbation of width\n"); -#endif /* SENSDEBUG */ - flag = 5; - A0 = here->MOS2w; - DELA = info->SENpertfac * A0; - DELAinv = 1.0/DELA; - Apert = A0 + DELA; - - if(info->SENacpertflag == 1){ - /* store the values of small signal parameters - * corresponding to perturbed width */ - here->MOS2w = Apert; - here->MOS2drainArea *= (1 + info->SENpertfac); - here->MOS2sourceArea *= (1 + info->SENpertfac); - here->MOS2Cbd *= (1 + info->SENpertfac); - here->MOS2Cbs *= (1 + info->SENpertfac); - if(here->MOS2drainPerimiter){ - here->MOS2Cbdsw += here->MOS2Cbdsw * - DELA/here->MOS2drainPerimiter; - } - if(here->MOS2sourcePerimiter){ - here->MOS2Cbssw += here->MOS2Cbssw * - DELA/here->MOS2sourcePerimiter; - } - if(vbdOp >= here->MOS2tDepCap){ - arg = 1-model->MOS2fwdCapDepCoeff; - sarg = exp( (-model->MOS2bulkJctBotGradingCoeff) * - log(arg) ); - sargsw = exp( (-model->MOS2bulkJctSideGradingCoeff) * - log(arg) ); - here->MOS2f2d = here->MOS2Cbd*(1-model->MOS2fwdCapDepCoeff* - (1+model->MOS2bulkJctBotGradingCoeff))* sarg/arg - + here->MOS2Cbdsw*(1-model->MOS2fwdCapDepCoeff* - (1+model->MOS2bulkJctSideGradingCoeff))* - sargsw/arg; - here->MOS2f3d = here->MOS2Cbd * - model->MOS2bulkJctBotGradingCoeff * sarg/arg/ - here->MOS2tBulkPot + here->MOS2Cbdsw * - model->MOS2bulkJctSideGradingCoeff * sargsw/arg / - here->MOS2tBulkPot; - here->MOS2f4d = here->MOS2Cbd*here->MOS2tBulkPot* - (1-arg*sarg)/(1-model->MOS2bulkJctBotGradingCoeff) - + here->MOS2Cbdsw*here->MOS2tBulkPot*(1-arg*sargsw)/ - (1-model->MOS2bulkJctSideGradingCoeff) - -here->MOS2f3d/2* - (here->MOS2tDepCap*here->MOS2tDepCap) - -here->MOS2tDepCap * here->MOS2f2d; - } - if(vbsOp >= here->MOS2tDepCap){ - arg = 1-model->MOS2fwdCapDepCoeff; - sarg = exp( (-model->MOS2bulkJctBotGradingCoeff) * - log(arg) ); - sargsw = exp( (-model->MOS2bulkJctSideGradingCoeff) * - log(arg) ); - here->MOS2f2s = here->MOS2Cbs*(1-model->MOS2fwdCapDepCoeff* - (1+model->MOS2bulkJctBotGradingCoeff))* sarg/arg - + here->MOS2Cbssw*(1-model->MOS2fwdCapDepCoeff* - (1+model->MOS2bulkJctSideGradingCoeff))* - sargsw/arg; - here->MOS2f3s = here->MOS2Cbs * - model->MOS2bulkJctBotGradingCoeff * sarg/arg/ - here->MOS2tBulkPot + here->MOS2Cbssw * - model->MOS2bulkJctSideGradingCoeff * sargsw/arg / - here->MOS2tBulkPot; - here->MOS2f4s = here->MOS2Cbs*here->MOS2tBulkPot* - (1-arg*sarg)/(1-model->MOS2bulkJctBotGradingCoeff) - + here->MOS2Cbssw*here->MOS2tBulkPot*(1-arg*sargsw)/ - (1-model->MOS2bulkJctSideGradingCoeff) - -here->MOS2f3s/2* - (here->MOS2tDepCap*here->MOS2tDepCap) - -here->MOS2tDepCap * here->MOS2f2s; - } - - *(ckt->CKTstate0 + here->MOS2vbs) = vbsOp; - *(ckt->CKTstate0 + here->MOS2vbd) = vbdOp; - - if((error = MOS2load((GENmodel*)model,ckt)) != 0) return(error); - - *(here->MOS2senCgs + 5) = here->MOS2cgs; - *(here->MOS2senCgd + 5) = here->MOS2cgd; - *(here->MOS2senCgb + 5) = here->MOS2cgb; - *(here->MOS2senCbd + 5) = here->MOS2capbd; - *(here->MOS2senCbs + 5) = here->MOS2capbs; - *(here->MOS2senGds + 5) = here->MOS2gds; - *(here->MOS2senGbs + 5) = here->MOS2gbs; - *(here->MOS2senGbd + 5) = here->MOS2gbd; - *(here->MOS2senGm + 5) = here->MOS2gm; - *(here->MOS2senGmbs + 5) = here->MOS2gmbs; - - here->MOS2w = A0; - here->MOS2drainArea /= (1 + info->SENpertfac); - here->MOS2sourceArea /= (1 + info->SENpertfac); - } - -load: - - gds= *(here->MOS2senGds + flag); - gbs= *(here->MOS2senGbs + flag); - gbd= *(here->MOS2senGbd + flag); - gm= *(here->MOS2senGm + flag); - gmbs= *(here->MOS2senGmbs + flag); - if(flag == 5){ - gdpr = here->MOS2drainConductance * Apert/A0; - gspr = here->MOS2sourceConductance * Apert/A0; - } - else{ - gdpr = here->MOS2drainConductance; - gspr = here->MOS2sourceConductance; - } - - xcgs= *(here->MOS2senCgs + flag) * ckt->CKTomega; - xcgd= *(here->MOS2senCgd + flag) * ckt->CKTomega; - xcgb= *(here->MOS2senCgb + flag) * ckt->CKTomega; - xbd= *(here->MOS2senCbd + flag) * ckt->CKTomega; - xbs= *(here->MOS2senCbs + flag) * ckt->CKTomega; - -#ifdef SENSDEBUG - printf("flag = %d \n",flag); - printf("gspr = %.7e , gdpr = %.7e , gds = %.7e, gbs = %.7e\n", - gspr,gdpr,gds,gbs); - printf("gbd = %.7e , gm = %.7e , gmbs = %.7e\n",gbd,gm,gmbs); - printf("xcgs = %.7e , xcgd = %.7e , xcgb = %.7e,", xcgs,xcgd,xcgb); - printf("xbd = %.7e,xbs = %.7e\n", xbd,xbs); -#endif /* SENSDEBUG */ - cspr = gspr * vspr ; - icspr = gspr * ivspr ; - cdpr = gdpr * vdpr ; - icdpr = gdpr * ivdpr ; - cgs = ( - xcgs * ivgs ); - icgs = xcgs * vgs ; - cgd = ( - xcgd * ivgd ); - icgd = xcgd * vgd ; - cgb = ( - xcgb * ivgb ); - icgb = xcgb * vgb ; - cbs = ( gbs * vbs - xbs * ivbs ); - icbs = ( xbs * vbs + gbs * ivbs ); - cbd = ( gbd * vbd - xbd * ivbd ); - icbd = ( xbd * vbd + gbd * ivbd ); - cds = ( gds * vds + xnrm * (gm * vgs + gmbs * vbs) - - xrev * (gm * vgd + gmbs * vbd) ); - icds = ( gds * ivds + xnrm * (gm * ivgs + gmbs * ivbs) - - xrev * (gm * ivgd + gmbs * ivbd) ); - - cs = cspr; - ics = icspr; - csprm = ( -cspr - cgs - cbs - cds ) ; - icsprm = ( -icspr - icgs - icbs - icds ) ; - cd = cdpr; - icd = icdpr; - cdprm = ( -cdpr - cgd - cbd + cds ) ; - icdprm = ( -icdpr - icgd - icbd + icds ) ; - cg = cgs + cgd + cgb ; - icg = icgs + icgd + icgb ; - cb = cbs + cbd - cgb ; - icb = icbs + icbd - icgb ; - -#ifdef SENSDEBUG - printf("vbs = %.7e , vbd = %.7e , vgb = %.7e\n",vbs,vbd,vgb); - printf("ivbs = %.7e , ivbd = %.7e , ivgb = %.7e\n",ivbs,ivbd,ivgb); - printf("cbs = %.7e , cbd = %.7e , cgb = %.7e\n",cbs,cbd,cgb); - printf("cb = %.7e , cg = %.7e , cs = %.7e\n",cb,cg,cs); - printf("csprm = %.7e, cd = %.7e, cdprm = %.7e\n",csprm,cd,cdprm); - printf("icb = %.7e , icg = %.7e , ics = %.7e\n",icb,icg,ics); - printf("icsprm = %.7e, icd = %.7e, icdprm = %.7e\n", - icsprm,icd,icdprm); -#endif /* SENSDEBUG */ - for(iparmno = 1;iparmno<=info->SENparms;iparmno++){ - if ((flag == 4) || (iparmno != here->MOS2senParmNo) ) continue; - if ((flag == 5) || (iparmno != (here->MOS2senParmNo + - (int) here->MOS2sens_l)) ) continue; - switch(flag){ - case 1: - DvDp = model->MOS2type * - (info->SEN_Sap[here->MOS2bNode][iparmno] - - info->SEN_Sap[here->MOS2sNodePrime][iparmno]); - break; - case 2: - DvDp = model->MOS2type * - ( info->SEN_Sap[here->MOS2bNode][iparmno] - - info->SEN_Sap[here->MOS2dNodePrime][iparmno]); - break; - case 3: - DvDp = model->MOS2type * - ( info->SEN_Sap[here->MOS2gNode][iparmno] - - info->SEN_Sap[here->MOS2bNode][iparmno]); - break; - case 4: - DvDp = 1; - break; - case 5: - DvDp = 1; - break; - } - *(info->SEN_RHS[here->MOS2bNode] + iparmno) -= - ( cb - cb0) * DELAinv * DvDp; - *(info->SEN_iRHS[here->MOS2bNode] + iparmno) -= - ( icb - icb0) * DELAinv * DvDp; - - *(info->SEN_RHS[here->MOS2gNode] + iparmno) -= - ( cg - cg0) * DELAinv * DvDp; - *(info->SEN_iRHS[here->MOS2gNode] + iparmno) -= - ( icg - icg0) * DELAinv * DvDp; - - if(here->MOS2sNode != here->MOS2sNodePrime){ - *(info->SEN_RHS[here->MOS2sNode] + iparmno) -= - ( cs - cs0) * DELAinv * DvDp; - *(info->SEN_iRHS[here->MOS2sNode] + iparmno) -= - ( ics - ics0) * DELAinv * DvDp; - } - - *(info->SEN_RHS[here->MOS2sNodePrime] + iparmno) -= - ( csprm - csprm0) * DELAinv * DvDp; - *(info->SEN_iRHS[here->MOS2sNodePrime] + iparmno) -= - ( icsprm - icsprm0) * DELAinv * DvDp; - - if(here->MOS2dNode != here->MOS2dNodePrime){ - *(info->SEN_RHS[here->MOS2dNode] + iparmno) -= - ( cd - cd0) * DELAinv * DvDp; - *(info->SEN_iRHS[here->MOS2dNode] + iparmno) -= - ( icd - icd0) * DELAinv * DvDp; - } - - *(info->SEN_RHS[here->MOS2dNodePrime] + iparmno) -= - ( cdprm - cdprm0) * DELAinv * DvDp; - *(info->SEN_iRHS[here->MOS2dNodePrime] + iparmno) -= - ( icdprm - icdprm0) * DELAinv * DvDp; -#ifdef SENSDEBUG - printf("after loading\n"); - printf("DvDp = %.5e , DELAinv = %.5e ,flag = %d ,", - DvDp,DELAinv,flag); - printf("iparmno = %d,senparmno = %d\n" - ,iparmno,here->MOS2senParmNo); - printf("A0 = %.5e , Apert = %.5e ,CONSTvt0 = %.5e \n", - A0,Apert,CONSTvt0); - printf("senb = %.7e + j%.7e ", - *(info->SEN_RHS[here->MOS2bNode] + iparmno), - *(info->SEN_iRHS[here->MOS2bNode] + iparmno)); - printf("seng = %.7e + j%.7e ", - *(info->SEN_RHS[here->MOS2gNode] + iparmno), - *(info->SEN_iRHS[here->MOS2gNode] + iparmno)); - printf("sens = %.7e + j%.7e ", - *(info->SEN_RHS[here->MOS2sNode] + iparmno), - *(info->SEN_iRHS[here->MOS2sNode] + iparmno)); - printf("sensprm = %.7e + j%.7e ", - *(info->SEN_RHS[here->MOS2sNodePrime] + iparmno), - *(info->SEN_iRHS[here->MOS2sNodePrime] + iparmno)); - printf("send = %.7e + j%.7e ", - *(info->SEN_RHS[here->MOS2dNode] + iparmno), - *(info->SEN_iRHS[here->MOS2dNode] + iparmno)); - printf("sendprm = %.7e + j%.7e ", - *(info->SEN_RHS[here->MOS2dNodePrime] + iparmno), - *(info->SEN_iRHS[here->MOS2dNodePrime] + iparmno)); -#endif /* SENSDEBUG */ - - } - switch(flag){ - case 1: - goto pertvbd ; - case 2: - goto pertvgb ; - case 3: - goto pertl ; - case 4: - goto pertw ; - case 5: - break; - } -next: - ; - - /* put the unperturbed values back into the state vector */ - for(i=0; i <= 16; i++) - *(ckt->CKTstate0 + here->MOS2states + i) = *(SaveState + i); - - here->MOS2sourceConductance = *(SaveState + 17) ; - here->MOS2drainConductance = *(SaveState + 18) ; - here->MOS2cd = *(SaveState + 19) ; - here->MOS2cbs = *(SaveState + 20) ; - here->MOS2cbd = *(SaveState + 21) ; - here->MOS2gmbs = *(SaveState + 22) ; - here->MOS2gm = *(SaveState + 23) ; - here->MOS2gds = *(SaveState + 24) ; - here->MOS2gbd = *(SaveState + 25) ; - here->MOS2gbs = *(SaveState + 26) ; - here->MOS2capbd = *(SaveState + 27) ; - here->MOS2capbs = *(SaveState + 28) ; - here->MOS2Cbd = *(SaveState + 29) ; - here->MOS2Cbdsw = *(SaveState + 30) ; - here->MOS2Cbs = *(SaveState + 31) ; - here->MOS2Cbssw = *(SaveState + 32) ; - here->MOS2f2d = *(SaveState + 33) ; - here->MOS2f3d = *(SaveState + 34) ; - here->MOS2f4d = *(SaveState + 35) ; - here->MOS2f2s = *(SaveState + 36) ; - here->MOS2f3s = *(SaveState + 37) ; - here->MOS2f4s = *(SaveState + 38) ; - here->MOS2cgs = *(SaveState + 39) ; - here->MOS2cgd = *(SaveState + 40) ; - here->MOS2cgb = *(SaveState + 41) ; - here->MOS2vdsat = *(SaveState + 42) ; - here->MOS2von = *(SaveState + 43) ; - here->MOS2mode = save_mode ; - - here->MOS2senPertFlag = OFF; - } - } - info->SENstatus = NORMAL; -#ifdef SENSDEBUG - printf("MOS2senacload end\n"); -#endif /* SENSDEBUG */ - return(OK); -} - - diff --git a/src/spicelib/devices/mos2/mos2set.c b/src/spicelib/devices/mos2/mos2set.c deleted file mode 100644 index 3c3acfd4d..000000000 --- a/src/spicelib/devices/mos2/mos2set.c +++ /dev/null @@ -1,261 +0,0 @@ -/********** -Copyright 1990 Regents of the University of California. All rights reserved. -Author: 1985 Thomas L. Quarles -Modified: 2000 AlansFixes -**********/ - -#include "ngspice/ngspice.h" -#include "ngspice/smpdefs.h" -#include "ngspice/const.h" -#include "ngspice/cktdefs.h" -#include "mos2defs.h" -#include "ngspice/sperror.h" -#include "ngspice/suffix.h" - -int -MOS2setup(SMPmatrix *matrix, GENmodel *inModel, CKTcircuit *ckt, int *states) - /* load the MOS2 device structure with those pointers needed later - * for fast matrix loading - */ -{ - MOS2model *model = (MOS2model *)inModel; - MOS2instance *here; - int error; - CKTnode *tmp; - - /* loop through all the MOS2 device models */ - for( ; model != NULL; model = MOS2nextModel(model)) { - - if(!model->MOS2typeGiven) { - model->MOS2type = NMOS; - } - if(!model->MOS2latDiffGiven) { - model->MOS2latDiff = 0; - } - if(!model->MOS2jctSatCurDensityGiven) { - model->MOS2jctSatCurDensity = 0; - } - if(!model->MOS2jctSatCurGiven) { - model->MOS2jctSatCur = 1e-14; - } - if(!model->MOS2drainResistanceGiven) { - model->MOS2drainResistance = 0; - } - if(!model->MOS2sourceResistanceGiven) { - model->MOS2sourceResistance = 0; - } - if(!model->MOS2sheetResistanceGiven) { - model->MOS2sheetResistance = 0; - } - if(!model->MOS2gateSourceOverlapCapFactorGiven) { - model->MOS2gateSourceOverlapCapFactor = 0; - } - if(!model->MOS2gateDrainOverlapCapFactorGiven) { - model->MOS2gateDrainOverlapCapFactor = 0; - } - if(!model->MOS2gateBulkOverlapCapFactorGiven) { - model->MOS2gateBulkOverlapCapFactor = 0; - } - if(!model->MOS2vt0Given) { - model->MOS2vt0 = 0; - } - if(!model->MOS2bulkJctPotentialGiven) { - model->MOS2bulkJctPotential = .8; - } - if(!model->MOS2capBDGiven) { - model->MOS2capBD = 0; - } - if(!model->MOS2capBSGiven) { - model->MOS2capBS = 0; - } - if(!model->MOS2sideWallCapFactorGiven) { - model->MOS2sideWallCapFactor = 0; - } - if(!model->MOS2bulkJctBotGradingCoeffGiven) { - model->MOS2bulkJctBotGradingCoeff = .5; - } - if(!model->MOS2bulkJctSideGradingCoeffGiven) { - model->MOS2bulkJctSideGradingCoeff = .33; - } - if(!model->MOS2fwdCapDepCoeffGiven) { - model->MOS2fwdCapDepCoeff = .5; - } - if(!model->MOS2phiGiven) { - model->MOS2phi = .6; - } - if(!model->MOS2lambdaGiven) { - model->MOS2lambda = 0; - } - if(!model->MOS2gammaGiven) { - model->MOS2gamma = 0; - } - if(!model->MOS2narrowFactorGiven) { - model->MOS2narrowFactor = 0; - } - if(!model->MOS2critFieldExpGiven) { - model->MOS2critFieldExp = 0; - } - if(!model->MOS2critFieldGiven) { - model->MOS2critField = 1e4; - } - if(!model->MOS2maxDriftVelGiven) { - model->MOS2maxDriftVel = 0; - } - if(!model->MOS2junctionDepthGiven) { - model->MOS2junctionDepth = 0; - } - if(!model->MOS2channelChargeGiven) { - model->MOS2channelCharge = 1; - } - if(!model->MOS2fastSurfaceStateDensityGiven) { - model->MOS2fastSurfaceStateDensity = 0; - } - if(!model->MOS2fNcoefGiven) { - model->MOS2fNcoef = 0; - } - if(!model->MOS2fNexpGiven) { - model->MOS2fNexp = 1; - } - - /* loop through all the instances of the model */ - for (here = MOS2instances(model); here != NULL ; - here=MOS2nextInstance(here)) { - - CKTnode *tmpNode; - IFuid tmpName; - - /* allocate a chunk of the state vector */ - here->MOS2states = *states; - *states += MOS2numStates; - - if(ckt->CKTsenInfo && (ckt->CKTsenInfo->SENmode & TRANSEN) ){ - *states += MOS2numSenStates * (ckt->CKTsenInfo->SENparms); - } - - if(!here->MOS2drainPerimiterGiven) { - here->MOS2drainPerimiter = 0; - } - if(!here->MOS2icVBSGiven) { - here->MOS2icVBS = 0; - } - if(!here->MOS2icVDSGiven) { - here->MOS2icVDS = 0; - } - if(!here->MOS2icVGSGiven) { - here->MOS2icVGS = 0; - } - if(!here->MOS2sourcePerimiterGiven) { - here->MOS2sourcePerimiter = 0; - } - if(!here->MOS2vdsatGiven) { - here->MOS2vdsat = 0; - } - if (!here->MOS2drainSquaresGiven) { - here->MOS2drainSquares=1; - } - if (!here->MOS2sourceSquaresGiven) { - here->MOS2sourceSquares=1; - } - if ((model->MOS2drainResistance != 0 - || (here->MOS2drainSquares != 0 - && model->MOS2sheetResistance != 0))) { - if (here->MOS2dNodePrime == 0) { - error = CKTmkVolt(ckt,&tmp,here->MOS2name,"internal#drain"); - if(error) return(error); - here->MOS2dNodePrime = tmp->number; - - if (ckt->CKTcopyNodesets) { - if (CKTinst2Node(ckt,here,1,&tmpNode,&tmpName)==OK) { - if (tmpNode->nsGiven) { - tmp->nodeset=tmpNode->nodeset; - tmp->nsGiven=tmpNode->nsGiven; - } - } - } - } - - } else { - here->MOS2dNodePrime = here->MOS2dNode; - } - - if( ( (model->MOS2sourceResistance != 0) || - ((here->MOS2sourceSquares != 0) && - (model->MOS2sheetResistance != 0)) )) { - if (here->MOS2sNodePrime == 0) { - error = CKTmkVolt(ckt,&tmp,here->MOS2name,"internal#source"); - if(error) return(error); - here->MOS2sNodePrime = tmp->number; - - if (ckt->CKTcopyNodesets) { - if (CKTinst2Node(ckt,here,3,&tmpNode,&tmpName)==OK) { - if (tmpNode->nsGiven) { - tmp->nodeset=tmpNode->nodeset; - tmp->nsGiven=tmpNode->nsGiven; - } - } - } - } - - } else { - here->MOS2sNodePrime = here->MOS2sNode; - } - -/* macro to make elements with built in test for out of memory */ -#define TSTALLOC(ptr,first,second) \ -do { if((here->ptr = SMPmakeElt(matrix, here->first, here->second)) == NULL){\ - return(E_NOMEM);\ -} } while(0) - - TSTALLOC(MOS2DdPtr, MOS2dNode, MOS2dNode); - TSTALLOC(MOS2GgPtr, MOS2gNode, MOS2gNode); - TSTALLOC(MOS2SsPtr, MOS2sNode, MOS2sNode); - TSTALLOC(MOS2BbPtr, MOS2bNode, MOS2bNode); - TSTALLOC(MOS2DPdpPtr, MOS2dNodePrime, MOS2dNodePrime); - TSTALLOC(MOS2SPspPtr, MOS2sNodePrime, MOS2sNodePrime); - TSTALLOC(MOS2DdpPtr, MOS2dNode, MOS2dNodePrime); - TSTALLOC(MOS2GbPtr, MOS2gNode, MOS2bNode); - TSTALLOC(MOS2GdpPtr, MOS2gNode, MOS2dNodePrime); - TSTALLOC(MOS2GspPtr, MOS2gNode, MOS2sNodePrime); - TSTALLOC(MOS2SspPtr, MOS2sNode, MOS2sNodePrime); - TSTALLOC(MOS2BdpPtr, MOS2bNode, MOS2dNodePrime); - TSTALLOC(MOS2BspPtr, MOS2bNode, MOS2sNodePrime); - TSTALLOC(MOS2DPspPtr, MOS2dNodePrime, MOS2sNodePrime); - TSTALLOC(MOS2DPdPtr, MOS2dNodePrime, MOS2dNode); - TSTALLOC(MOS2BgPtr, MOS2bNode, MOS2gNode); - TSTALLOC(MOS2DPgPtr, MOS2dNodePrime, MOS2gNode); - TSTALLOC(MOS2SPgPtr, MOS2sNodePrime, MOS2gNode); - TSTALLOC(MOS2SPsPtr, MOS2sNodePrime, MOS2sNode); - TSTALLOC(MOS2DPbPtr, MOS2dNodePrime, MOS2bNode); - TSTALLOC(MOS2SPbPtr, MOS2sNodePrime, MOS2bNode); - TSTALLOC(MOS2SPdpPtr, MOS2sNodePrime, MOS2dNodePrime); - - } - } - return(OK); -} - -int -MOS2unsetup(GENmodel *inModel, CKTcircuit *ckt) -{ - MOS2model *model; - MOS2instance *here; - - for (model = (MOS2model *)inModel; model != NULL; - model = MOS2nextModel(model)) - { - for (here = MOS2instances(model); here != NULL; - here=MOS2nextInstance(here)) - { - if (here->MOS2sNodePrime > 0 - && here->MOS2sNodePrime != here->MOS2sNode) - CKTdltNNum(ckt, here->MOS2sNodePrime); - here->MOS2sNodePrime = 0; - - if (here->MOS2dNodePrime > 0 - && here->MOS2dNodePrime != here->MOS2dNode) - CKTdltNNum(ckt, here->MOS2dNodePrime); - here->MOS2dNodePrime = 0; - } - } - return OK; -} diff --git a/src/spicelib/devices/mos2/mos2sld.c b/src/spicelib/devices/mos2/mos2sld.c deleted file mode 100644 index 84c213ce0..000000000 --- a/src/spicelib/devices/mos2/mos2sld.c +++ /dev/null @@ -1,623 +0,0 @@ -/********** -Copyright 1990 Regents of the University of California. All rights reserved. -Author: 1985 Thomas L. Quarles - -This function is obsolete (was used by an old sensitivity analysis) -**********/ - -/* actually load the current sensitivity - * information into the array previously provided - */ - -#include "ngspice/ngspice.h" -#include "ngspice/smpdefs.h" -#include "ngspice/cktdefs.h" -#include "mos2defs.h" -#include "ngspice/sperror.h" -#include "ngspice/suffix.h" - -int -MOS2sLoad(GENmodel *inModel, CKTcircuit *ckt) -{ - MOS2model *model = (MOS2model *)inModel; - MOS2instance *here; - double SaveState[44]; - int save_mode; - int i; - int iparmno; - int error; - int flag; - double A0; - double DELA; - double Apert; - double DELAinv; - double gspr0; - double gspr; - double gdpr0; - double gdpr; - double cdpr0; - double cspr0; - double cd0; - double cbd0; - double cbs0; - double cd; - double cbd; - double cbs; - double DcdprDp; - double DcsprDp; - double DcbDp; - double DcdDp; - double DcbsDp; - double DcbdDp; - double DcdprmDp; - double DcsprmDp; - double qgs0; - double qgd0; - double qgb0; - double qbd0; - double qbd; - double qbs0; - double qbs; - double DqgsDp; - double DqgdDp; - double DqgbDp; - double DqbdDp; - double DqbsDp; - double Osxpgs; - double Osxpgd; - double Osxpgb; - double Osxpbd; - double Osxpbs; - double tag0; - double tag1; - double arg; - double sarg; - double sargsw; - int offset; - double EffectiveLength; - SENstruct *info; - -#ifdef SENSDEBUG - printf("MOS2senload \n"); - printf("CKTtime = %.5e\n",ckt->CKTtime); - printf("CKTorder = %d\n",ckt->CKTorder); -#endif /* SENSDEBUG */ - - info = ckt->CKTsenInfo; - info->SENstatus = PERTURBATION; - - tag0 = ckt->CKTag[0]; - tag1 = ckt->CKTag[1]; - if(ckt->CKTorder == 1){ - tag1 = 0; - } - - /* loop through all the models */ - for( ; model != NULL; model = MOS2nextModel(model)) { - - /* loop through all the instances of the model */ - for (here = MOS2instances(model); here != NULL ; - here=MOS2nextInstance(here)) { - -#ifdef SENSDEBUG - printf("senload instance name %s\n",here->MOS2name); - printf("gate = %d ,drain = %d, drainprm = %d\n", - here->MOS2gNode,here->MOS2dNode,here->MOS2dNodePrime); - printf("source = %d , sourceprm = %d ,body = %d, senparmno = %d\n", - here->MOS2sNode ,here->MOS2sNodePrime, - here->MOS2bNode,here->MOS2senParmNo); -#endif /* SENSDEBUG */ - - - /* save the unperturbed values in the state vector */ - for(i=0; i <= 16; i++){ - *(SaveState + i) = *(ckt->CKTstate0 + here->MOS2states + i); - } - - *(SaveState + 17) = here->MOS2sourceConductance; - *(SaveState + 18) = here->MOS2drainConductance; - *(SaveState + 19) = here->MOS2cd; - *(SaveState + 20) = here->MOS2cbs; - *(SaveState + 21) = here->MOS2cbd; - *(SaveState + 22) = here->MOS2gmbs; - *(SaveState + 23) = here->MOS2gm; - *(SaveState + 24) = here->MOS2gds; - *(SaveState + 25) = here->MOS2gbd; - *(SaveState + 26) = here->MOS2gbs; - *(SaveState + 27) = here->MOS2capbd; - *(SaveState + 28) = here->MOS2capbs; - *(SaveState + 29) = here->MOS2Cbd; - *(SaveState + 30) = here->MOS2Cbdsw; - *(SaveState + 31) = here->MOS2Cbs; - *(SaveState + 32) = here->MOS2Cbssw; - *(SaveState + 33) = here->MOS2f2d; - *(SaveState + 34) = here->MOS2f3d; - *(SaveState + 35) = here->MOS2f4d; - *(SaveState + 36) = here->MOS2f2s; - *(SaveState + 37) = here->MOS2f3s; - *(SaveState + 38) = here->MOS2f4s; - *(SaveState + 39) = here->MOS2cgs; - *(SaveState + 40) = here->MOS2cgd; - *(SaveState + 41) = here->MOS2cgb; - *(SaveState + 42) = here->MOS2vdsat; - *(SaveState + 43) = here->MOS2von; - save_mode = here->MOS2mode; - - - if(here->MOS2senParmNo == 0) goto next1; - -#ifdef SENSDEBUG - printf("without perturbation \n"); - printf("gbd =%.5e\n",here->MOS2gbd); - printf("satCur =%.5e\n",here->MOS2tSatCur); - printf("satCurDens =%.5e\n",here->MOS2tSatCurDens); - printf("vbd =%.5e\n",*(ckt->CKTstate0 + here->MOS2vbd)); -#endif /* SENSDEBUG */ - - cdpr0= here->MOS2cd; - cspr0= -(here->MOS2cd + here->MOS2cbd + here->MOS2cbs); - if((info->SENmode == TRANSEN) && - (ckt->CKTmode & MODEINITTRAN)){ - qgs0 = *(ckt->CKTstate1 + here->MOS2qgs); - qgd0 = *(ckt->CKTstate1 + here->MOS2qgd); - qgb0 = *(ckt->CKTstate1 + here->MOS2qgb); - } - else{ - qgs0 = *(ckt->CKTstate0 + here->MOS2qgs); - qgd0 = *(ckt->CKTstate0 + here->MOS2qgd); - qgb0 = *(ckt->CKTstate0 + here->MOS2qgb); - } - - here->MOS2senPertFlag = ON; - error = MOS2load((GENmodel*)model,ckt); - if(error) return(error); - - cd0 = here->MOS2cd ; - cbd0 = here->MOS2cbd ; - cbs0 = here->MOS2cbs ; - gspr0= here->MOS2sourceConductance ; - gdpr0= here->MOS2drainConductance ; - - qbs0 = *(ckt->CKTstate0 + here->MOS2qbs); - qbd0 = *(ckt->CKTstate0 + here->MOS2qbd); - - for( flag = 0 ; flag <= 1 ; flag++){ - if(here->MOS2sens_l == 0) - if(flag == 0) goto next2; - if(here->MOS2sens_w == 0) - if(flag == 1) goto next2; - if(flag == 0){ - A0 = here->MOS2l; - DELA = info->SENpertfac * A0; - DELAinv = 1.0/DELA; - Apert = A0 + DELA; - here->MOS2l = Apert; - } - else{ - A0 = here->MOS2w; - DELA = info->SENpertfac * A0; - DELAinv = 1.0/DELA; - Apert = A0 + DELA; - here->MOS2w = Apert; - here->MOS2drainArea *= (1 + info->SENpertfac); - here->MOS2sourceArea *= (1 + info->SENpertfac); - here->MOS2Cbd *= (1 + info->SENpertfac); - here->MOS2Cbs *= (1 + info->SENpertfac); - if(here->MOS2drainPerimiter){ - here->MOS2Cbdsw += here->MOS2Cbdsw * - DELA/here->MOS2drainPerimiter; - } - if(here->MOS2sourcePerimiter){ - here->MOS2Cbssw += here->MOS2Cbssw * - DELA/here->MOS2sourcePerimiter; - } - if(*(ckt->CKTstate0 + here->MOS2vbd) >= - here->MOS2tDepCap){ - arg = 1-model->MOS2fwdCapDepCoeff; - sarg = exp( (-model->MOS2bulkJctBotGradingCoeff) * - log(arg) ); - sargsw = exp( (-model->MOS2bulkJctSideGradingCoeff) * - log(arg) ); - here->MOS2f2d = here->MOS2Cbd* - (1-model->MOS2fwdCapDepCoeff* - (1+model->MOS2bulkJctBotGradingCoeff))* sarg/arg - + here->MOS2Cbdsw*(1-model->MOS2fwdCapDepCoeff* - (1+model->MOS2bulkJctSideGradingCoeff))* - sargsw/arg; - here->MOS2f3d = here->MOS2Cbd * - model->MOS2bulkJctBotGradingCoeff * sarg/arg/ - here->MOS2tBulkPot + here->MOS2Cbdsw * - model->MOS2bulkJctSideGradingCoeff * - sargsw/arg / here->MOS2tBulkPot; - here->MOS2f4d = here->MOS2Cbd* - here->MOS2tBulkPot*(1-arg*sarg)/ - (1-model->MOS2bulkJctBotGradingCoeff) - + here->MOS2Cbdsw*here->MOS2tBulkPot* - (1-arg*sargsw)/ - (1-model->MOS2bulkJctSideGradingCoeff) - -here->MOS2f3d/2* - (here->MOS2tDepCap*here->MOS2tDepCap) - -here->MOS2tDepCap * here->MOS2f2d; - } - if(*(ckt->CKTstate0 + here->MOS2vbs) >= - here->MOS2tDepCap){ - arg = 1-model->MOS2fwdCapDepCoeff; - sarg = exp( (-model->MOS2bulkJctBotGradingCoeff) * - log(arg) ); - sargsw = exp( (-model->MOS2bulkJctSideGradingCoeff) * - log(arg) ); - here->MOS2f2s = here->MOS2Cbs* - (1-model->MOS2fwdCapDepCoeff* - (1+model->MOS2bulkJctBotGradingCoeff))* sarg/arg - + here->MOS2Cbssw*(1-model->MOS2fwdCapDepCoeff* - (1+model->MOS2bulkJctSideGradingCoeff))* - sargsw/arg; - here->MOS2f3s = here->MOS2Cbs * - model->MOS2bulkJctBotGradingCoeff * sarg/arg/ - here->MOS2tBulkPot + here->MOS2Cbssw * - model->MOS2bulkJctSideGradingCoeff *sargsw/arg / - here->MOS2tBulkPot; - here->MOS2f4s = here->MOS2Cbs*here->MOS2tBulkPot* - (1-arg*sarg)/ - (1-model->MOS2bulkJctBotGradingCoeff) - + here->MOS2Cbssw*here->MOS2tBulkPot* - (1-arg*sargsw)/ - (1-model->MOS2bulkJctSideGradingCoeff) - -here->MOS2f3s/2* - (here->MOS2tDepCap*here->MOS2tDepCap) - -here->MOS2tDepCap * here->MOS2f2s; - } - here->MOS2drainConductance *= Apert/A0; - here->MOS2sourceConductance *= Apert/A0; - } - - -#ifdef SENSDEBUG - if(flag == 0) - printf("perturbation of l\n"); - if(flag == 1) - printf("perturbation of w\n"); -#endif /* SENSDEBUG */ - - error = MOS2load((GENmodel*)model,ckt); - if(error) return(error); - - if(flag == 0){ - here->MOS2l = A0; - } - else{ - here->MOS2w = A0; - here->MOS2drainArea /= (1 + info->SENpertfac); - here->MOS2sourceArea /= (1 + info->SENpertfac); - here->MOS2drainConductance *= A0/Apert; - here->MOS2sourceConductance *= A0/Apert; - } - cd = here->MOS2cd ; - cbd = here->MOS2cbd ; - cbs = here->MOS2cbs ; - - gspr= here->MOS2sourceConductance ; - gdpr= here->MOS2drainConductance ; - - DcdDp = (cd - cd0) * DELAinv; - DcbsDp = (cbs - cbs0) * DELAinv; - DcbdDp = (cbd - cbd0) * DELAinv; - DcbDp = ( DcbsDp + DcbdDp ); - - DcdprDp = 0; - DcsprDp = 0; - if(here->MOS2dNode != here->MOS2dNodePrime) - if(gdpr0) DcdprDp = cdpr0 * (gdpr - gdpr0)/gdpr0 * DELAinv; - if(here->MOS2sNode != here->MOS2sNodePrime) - if(gspr0) DcsprDp = cspr0 * (gspr - gspr0)/gspr0 * DELAinv; - - DcdprmDp = ( - DcdprDp + DcdDp); - DcsprmDp = ( - DcbsDp - DcdDp - DcbdDp - DcsprDp); - - if(flag == 0){ - EffectiveLength = here->MOS2l - - 2*model->MOS2latDiff; - if(EffectiveLength == 0){ - DqgsDp = 0; - DqgdDp = 0; - DqgbDp = 0; - } - else{ - DqgsDp = model->MOS2type * qgs0 / EffectiveLength; - DqgdDp = model->MOS2type * qgd0 / EffectiveLength; - DqgbDp = model->MOS2type * qgb0 / EffectiveLength; - } - } - else{ - DqgsDp = model->MOS2type * qgs0 / here->MOS2w; - DqgdDp = model->MOS2type * qgd0 / here->MOS2w; - DqgbDp = model->MOS2type * qgb0 / here->MOS2w; - } - - - qbd = *(ckt->CKTstate0 + here->MOS2qbd); - qbs = *(ckt->CKTstate0 + here->MOS2qbs); - - DqbsDp = model->MOS2type * (qbs - qbs0)*DELAinv; - DqbdDp = model->MOS2type * (qbd - qbd0)*DELAinv; - - if(flag == 0){ - *(here->MOS2dphigs_dl) = DqgsDp; - *(here->MOS2dphigd_dl) = DqgdDp; - *(here->MOS2dphibs_dl) = DqbsDp; - *(here->MOS2dphibd_dl) = DqbdDp; - *(here->MOS2dphigb_dl) = DqgbDp; - } - else{ - *(here->MOS2dphigs_dw) = DqgsDp; - *(here->MOS2dphigd_dw) = DqgdDp; - *(here->MOS2dphibs_dw) = DqbsDp; - *(here->MOS2dphibd_dw) = DqbdDp; - *(here->MOS2dphigb_dw) = DqgbDp; - } - - -#ifdef SENSDEBUG - printf("CKTag[0]=%.7e,CKTag[1]=%.7e,flag= %d\n", - ckt->CKTag[0],ckt->CKTag[1],flag); - printf("cd0 = %.7e ,cd = %.7e,\n",cd0,cd); - printf("cbs0 = %.7e ,cbs = %.7e,\n",cbs0,cbs); - printf("cbd0 = %.7e ,cbd = %.7e,\n",cbd0,cbd); - printf("DcdprmDp = %.7e,\n",DcdprmDp); - printf("DcsprmDp = %.7e,\n",DcsprmDp); - printf("DcdprDp = %.7e,\n",DcdprDp); - printf("DcsprDp = %.7e,\n",DcsprDp); - printf("qgs0 = %.7e \n",qgs0); - printf("qgd0 = %.7e \n",qgd0); - printf("qgb0 = %.7e \n",qgb0); - printf("qbs0 = %.7e ,qbs = %.7e,\n",qbs0,qbs); - printf("qbd0 = %.7e ,qbd = %.7e,\n",qbd0,qbd); - printf("DqgsDp = %.7e \n",DqgsDp); - printf("DqgdDp = %.7e \n",DqgdDp); - printf("DqgbDp = %.7e \n",DqgbDp); - printf("DqbsDp = %.7e \n",DqbsDp); - printf("DqbdDp = %.7e \n",DqbdDp); - printf("EffectiveLength = %.7e \n",EffectiveLength); - printf("tdepCap = %.7e \n",here->MOS2tDepCap); - printf("\n"); -#endif /* SENSDEBUG*/ - if((info->SENmode == TRANSEN) && - (ckt->CKTmode & MODEINITTRAN)) - goto next2; - - /* - * load RHS matrix - */ - - if(flag == 0){ - *(info->SEN_RHS[here->MOS2bNode] + here->MOS2senParmNo) -= - model->MOS2type * DcbDp; - *(info->SEN_RHS[here->MOS2dNode] + here->MOS2senParmNo) -= - model->MOS2type * DcdprDp; - *(info->SEN_RHS[here->MOS2dNodePrime] + here->MOS2senParmNo) - -= model->MOS2type * DcdprmDp; - *(info->SEN_RHS[here->MOS2sNode] + here->MOS2senParmNo) -= - model->MOS2type * DcsprDp; - *(info->SEN_RHS[here->MOS2sNodePrime] + here->MOS2senParmNo) - -= model->MOS2type * DcsprmDp; - } - else{ - offset = here->MOS2sens_l; - - *(info->SEN_RHS[here->MOS2bNode] + here->MOS2senParmNo + - offset) -= model->MOS2type * DcbDp; - *(info->SEN_RHS[here->MOS2dNode] + here->MOS2senParmNo + - offset) -= model->MOS2type * DcdprDp; - *(info->SEN_RHS[here->MOS2dNodePrime] + here->MOS2senParmNo - + offset) -= model->MOS2type * DcdprmDp; - *(info->SEN_RHS[here->MOS2sNode] + here->MOS2senParmNo + - offset) -= model->MOS2type * DcsprDp; - *(info->SEN_RHS[here->MOS2sNodePrime] + here->MOS2senParmNo - + offset) -= model->MOS2type * DcsprmDp; - } -#ifdef SENSDEBUG - printf("after loading\n"); - if(flag == 0){ - printf("DcbDp=%.7e\n", - *(info->SEN_RHS[here->MOS2bNode] + - here->MOS2senParmNo)); - printf("DcdprDp=%.7e\n", - *(info->SEN_RHS[here->MOS2dNode] + - here->MOS2senParmNo)); - printf("DcsprDp=%.7e\n", - *(info->SEN_RHS[here->MOS2sNode] + - here->MOS2senParmNo)); - printf("DcdprmDp=%.7e\n", - *(info->SEN_RHS[here->MOS2dNodePrime] + - here->MOS2senParmNo)); - printf("DcsprmDp=%.7e\n", - *(info->SEN_RHS[here->MOS2sNodePrime] + - here->MOS2senParmNo)); - printf("\n"); - } - else{ - printf("DcbDp=%.7e\n", - *(info->SEN_RHS[here->MOS2bNode] + - here->MOS2senParmNo + here->MOS2sens_l)); - printf("DcdprDp=%.7e\n", - *(info->SEN_RHS[here->MOS2dNode] + - here->MOS2senParmNo + here->MOS2sens_l)); - printf("DcsprDp=%.7e\n", - *(info->SEN_RHS[here->MOS2sNode] + - here->MOS2senParmNo + here->MOS2sens_l)); - printf("DcdprmDp=%.7e\n", - *(info->SEN_RHS[here->MOS2dNodePrime] + - here->MOS2senParmNo + here->MOS2sens_l)); - printf("DcsprmDp=%.7e\n", - *(info->SEN_RHS[here->MOS2sNodePrime] + - here->MOS2senParmNo + here->MOS2sens_l)); - } -#endif /* SENSDEBUG*/ -next2: - ; - } -next1: - if((info->SENmode == DCSEN) || - (ckt->CKTmode&MODETRANOP) ) goto restore; - if((info->SENmode == TRANSEN) && - (ckt->CKTmode & MODEINITTRAN)) goto restore; - for(iparmno = 1;iparmno<=info->SENparms;iparmno++){ -#ifdef SENSDEBUG - printf("after conductive currents\n"); - printf("iparmno = %d\n",iparmno); - printf("DcbDp=%.7e\n", - *(info->SEN_RHS[here->MOS2bNode] + iparmno)); - printf("DcdprDp=%.7e\n", - *(info->SEN_RHS[here->MOS2dNode] + iparmno)); - printf("DcdprmDp=%.7e\n", - *(info->SEN_RHS[here->MOS2dNodePrime] + iparmno)); - printf("DcsprDp=%.7e\n", - *(info->SEN_RHS[here->MOS2sNode] + iparmno)); - printf("DcsprmDp=%.7e\n", - *(info->SEN_RHS[here->MOS2sNodePrime] + iparmno)); - printf("\n"); -#endif /* SENSDEBUG */ - Osxpgs = tag0 * *(ckt->CKTstate1 + here->MOS2sensxpgs + - 10*(iparmno - 1)) - + tag1 * *(ckt->CKTstate1 + here->MOS2sensxpgs + - 10*(iparmno - 1) + 1); - - Osxpgd = tag0 * *(ckt->CKTstate1 + here->MOS2sensxpgd + - 10*(iparmno - 1)) - + tag1 * *(ckt->CKTstate1 + here->MOS2sensxpgd + - 10*(iparmno - 1) + 1); - - Osxpbs = tag0 * *(ckt->CKTstate1 + here->MOS2sensxpbs + - 10*(iparmno - 1)) - + tag1 * *(ckt->CKTstate1 + here->MOS2sensxpbs + - 10*(iparmno - 1) + 1); - - Osxpbd =tag0 * *(ckt->CKTstate1 + here->MOS2sensxpbd + - 10*(iparmno - 1)) - + tag1 * *(ckt->CKTstate1 + here->MOS2sensxpbd + - 10*(iparmno - 1) + 1); - Osxpgb = tag0 * *(ckt->CKTstate1 + here->MOS2sensxpgb + - 10*(iparmno - 1)) - + tag1 * *(ckt->CKTstate1 + here->MOS2sensxpgb + - 10*(iparmno - 1) + 1); - -#ifdef SENSDEBUG - printf("iparmno=%d\n",iparmno); - printf("sxpgs=%.7e,sdgs=%.7e\n", - *(ckt->CKTstate1 + here->MOS2sensxpgs + - 10*(iparmno - 1)), *(ckt->CKTstate1 + - here->MOS2sensxpgs + 10*(iparmno - 1) + 1)); - printf("sxpgd=%.7e,sdgd=%.7e\n", - *(ckt->CKTstate1 + here->MOS2sensxpgd + - 10*(iparmno - 1)), *(ckt->CKTstate1 + - here->MOS2sensxpgd + 10*(iparmno - 1) + 1)); - printf("sxpbs=%.7e,sdbs=%.7e\n", - *(ckt->CKTstate1 + here->MOS2sensxpbs + - 10*(iparmno - 1)), *(ckt->CKTstate1 + - here->MOS2sensxpbs + 10*(iparmno - 1) + 1)); - printf("sxpbd=%.7e,sdbd=%.7e\n", - *(ckt->CKTstate1 + here->MOS2sensxpbd + - 10*(iparmno - 1)), *(ckt->CKTstate1 + - here->MOS2sensxpbd + 10*(iparmno - 1) + 1)); - printf("sxpgb=%.7e,sdgb=%.7e\n", - *(ckt->CKTstate1 + here->MOS2sensxpgb + - 10*(iparmno - 1)), *(ckt->CKTstate1 + - here->MOS2sensxpgb + 10*(iparmno - 1) + 1)); - printf("before loading DqDp\n"); - printf("Osxpgs=%.7e,Osxpgd=%.7e\n",Osxpgs,Osxpgd); - printf("Osxpbs=%.7e,Osxpbd=%.7e,Osxpgb=%.7e\n", - Osxpbs,Osxpbd,Osxpgb); - printf("\n"); -#endif /* SENSDEBUG */ - if(here->MOS2sens_l && (iparmno == here->MOS2senParmNo)){ - Osxpgs -= tag0 * *(here->MOS2dphigs_dl); - Osxpgd -= tag0 * *(here->MOS2dphigd_dl); - Osxpbs -= tag0 * *(here->MOS2dphibs_dl); - Osxpbd -= tag0 * *(here->MOS2dphibd_dl); - Osxpgb -= tag0 * *(here->MOS2dphigb_dl); - } - if(here->MOS2sens_w && - (iparmno == (here->MOS2senParmNo + - (int) here->MOS2sens_l))){ - Osxpgs -= tag0 * *(here->MOS2dphigs_dw); - Osxpgd -= tag0 * *(here->MOS2dphigd_dw); - Osxpbs -= tag0 * *(here->MOS2dphibs_dw); - Osxpbd -= tag0 * *(here->MOS2dphibd_dw); - Osxpgb -= tag0 * *(here->MOS2dphigb_dw); - } -#ifdef SENSDEBUG - printf("after loading DqDp\n"); - printf("DqgsDp=%.7e",DqgsDp); - printf("Osxpgs=%.7e,Osxpgd=%.7e\n",Osxpgs,Osxpgd); - printf("Osxpbs=%.7e,Osxpbd=%.7e,Osxpgb=%.7e\n", - Osxpbs,Osxpbd,Osxpgb); -#endif /* SENSDEBUG */ - - *(info->SEN_RHS[here->MOS2bNode] + iparmno) += - Osxpbs + Osxpbd -Osxpgb; - *(info->SEN_RHS[here->MOS2gNode] + iparmno) += - Osxpgs + Osxpgd + Osxpgb; - - *(info->SEN_RHS[here->MOS2dNodePrime] + iparmno) -= - Osxpgd + Osxpbd ; - - *(info->SEN_RHS[here->MOS2sNodePrime] + iparmno) -= - Osxpgs + Osxpbs; -#ifdef SENSDEBUG - printf("after capacitive currents\n"); - printf("DcbDp=%.7e\n", - *(info->SEN_RHS[here->MOS2bNode] + iparmno)); - printf("DcdprDp=%.7e\n", - *(info->SEN_RHS[here->MOS2dNode] + iparmno)); - printf("DcdprmDp=%.7e\n", - *(info->SEN_RHS[here->MOS2dNodePrime] + iparmno)); - printf("DcsprDp=%.7e\n", - *(info->SEN_RHS[here->MOS2sNode] + iparmno)); - printf("DcsprmDp=%.7e\n", - *(info->SEN_RHS[here->MOS2sNodePrime] + iparmno)); -#endif /* SENSDEBUG */ - - } -restore: /* put the unperturbed values back into the state vector */ - for(i=0; i <= 16; i++) - *(ckt->CKTstate0 + here->MOS2states + i) = *(SaveState + i); - here->MOS2sourceConductance = *(SaveState + 17) ; - here->MOS2drainConductance = *(SaveState + 18) ; - here->MOS2cd = *(SaveState + 19) ; - here->MOS2cbs = *(SaveState + 20) ; - here->MOS2cbd = *(SaveState + 21) ; - here->MOS2gmbs = *(SaveState + 22) ; - here->MOS2gm = *(SaveState + 23) ; - here->MOS2gds = *(SaveState + 24) ; - here->MOS2gbd = *(SaveState + 25) ; - here->MOS2gbs = *(SaveState + 26) ; - here->MOS2capbd = *(SaveState + 27) ; - here->MOS2capbs = *(SaveState + 28) ; - here->MOS2Cbd = *(SaveState + 29) ; - here->MOS2Cbdsw = *(SaveState + 30) ; - here->MOS2Cbs = *(SaveState + 31) ; - here->MOS2Cbssw = *(SaveState + 32) ; - here->MOS2f2d = *(SaveState + 33) ; - here->MOS2f3d = *(SaveState + 34) ; - here->MOS2f4d = *(SaveState + 35) ; - here->MOS2f2s = *(SaveState + 36) ; - here->MOS2f3s = *(SaveState + 37) ; - here->MOS2f4s = *(SaveState + 38) ; - here->MOS2cgs = *(SaveState + 39) ; - here->MOS2cgd = *(SaveState + 40) ; - here->MOS2cgb = *(SaveState + 41) ; - here->MOS2vdsat = *(SaveState + 42) ; - here->MOS2von = *(SaveState + 43) ; - here->MOS2mode = save_mode ; - - here->MOS2senPertFlag = OFF; - - } - } - info->SENstatus = NORMAL; -#ifdef SENSDEBUG - printf("MOS2senload end\n"); -#endif /* SENSDEBUG */ - return(OK); -} - diff --git a/src/spicelib/devices/mos2/mos2sprt.c b/src/spicelib/devices/mos2/mos2sprt.c deleted file mode 100644 index 303c14b86..000000000 --- a/src/spicelib/devices/mos2/mos2sprt.c +++ /dev/null @@ -1,63 +0,0 @@ -/********** -Copyright 1990 Regents of the University of California. All rights reserved. -Author: 1985 Thomas L. Quarles -Modified: 2000 AlansFixes - -This function is obsolete (was used by an old sensitivity analysis) -**********/ - -#include "ngspice/ngspice.h" -#include "ngspice/smpdefs.h" -#include "ngspice/cktdefs.h" -#include "mos2defs.h" -#include "ngspice/sperror.h" -#include "ngspice/suffix.h" - -void -MOS2sPrint(GENmodel *inModel, CKTcircuit *ckt) - /* Pretty print the sensitivity info for all the MOS2 - * devices in the circuit. - */ -{ - MOS2model *model = (MOS2model *)inModel; - MOS2instance *here; - - printf("LEVEL 2 MOSFETS-----------------\n"); - /* loop through all the MOS2 models */ - for( ; model != NULL; model = MOS2nextModel(model)) { - - printf("Model name:%s\n",model->MOS2modName); - - /* loop through all the instances of the model */ - for (here = MOS2instances(model); here != NULL ; - here=MOS2nextInstance(here)) { - - printf(" Instance name:%s\n",here->MOS2name); - printf(" Drain, Gate , Source nodes: %s, %s ,%s\n", - CKTnodName(ckt,here->MOS2dNode),CKTnodName(ckt,here->MOS2gNode), - CKTnodName(ckt,here->MOS2sNode)); - - printf(" Multiplier: %g ",here->MOS2m); - printf(here->MOS2mGiven ? "(specified)\n" : "(default)\n"); - printf(" Length: %g ",here->MOS2l); - printf(here->MOS2lGiven ? "(specified)\n" : "(default)\n"); - printf(" Width: %g ",here->MOS2w); - printf(here->MOS2wGiven ? "(specified)\n" : "(default)\n"); - if(here->MOS2sens_l == 1){ - printf(" MOS2senParmNo:l = %d ",here->MOS2senParmNo); - } - else{ - printf(" MOS2senParmNo:l = 0 "); - } - if(here->MOS2sens_w == 1){ - printf(" w = %d \n",here->MOS2senParmNo + here->MOS2sens_l); - } - else{ - printf(" w = 0 \n"); - } - - - } - } -} - diff --git a/src/spicelib/devices/mos2/mos2sset.c b/src/spicelib/devices/mos2/mos2sset.c deleted file mode 100644 index b82661c20..000000000 --- a/src/spicelib/devices/mos2/mos2sset.c +++ /dev/null @@ -1,50 +0,0 @@ -/********** -Copyright 1990 Regents of the University of California. All rights reserved. -Author: 1985 Thomas L. Quarles - -This function is obsolete (was used by an old sensitivity analysis) -**********/ - -#include "ngspice/ngspice.h" -#include "ngspice/smpdefs.h" -#include "ngspice/cktdefs.h" -#include "mos2defs.h" -#include "ngspice/sperror.h" -#include "ngspice/suffix.h" - -int -MOS2sSetup(SENstruct *info, GENmodel *inModel) -/* loop through all the devices and - * allocate parameter #s to design parameters - */ -{ - MOS2model *model = (MOS2model *)inModel; - MOS2instance *here; - - /* loop through all the models */ - for( ; model != NULL; model = MOS2nextModel(model)) { - - /* loop through all the instances of the model */ - for (here = MOS2instances(model); here != NULL ; - here=MOS2nextInstance(here)) { - - if(here->MOS2senParmNo){ - if((here->MOS2sens_l)&&(here->MOS2sens_w)){ - here->MOS2senParmNo = ++(info->SENparms); - ++(info->SENparms);/* MOS has two design parameters */ - } - else{ - here->MOS2senParmNo = ++(info->SENparms); - } - } - here->MOS2senPertFlag = OFF; - if((here->MOS2sens = TMALLOC(double, 70)) == NULL) { - return(E_NOMEM); - } - - } - } - return(OK); -} - - diff --git a/src/spicelib/devices/mos2/mos2supd.c b/src/spicelib/devices/mos2/mos2supd.c deleted file mode 100644 index 85c19481f..000000000 --- a/src/spicelib/devices/mos2/mos2supd.c +++ /dev/null @@ -1,180 +0,0 @@ -/********** -Copyright 1990 Regents of the University of California. All rights reserved. -Author: 1985 Thomas L. Quarles - -This function is obsolete (was used by an old sensitivity analysis) -**********/ - -/* update the charge sensitivities and their derivatives */ - -#include "ngspice/ngspice.h" -#include "ngspice/smpdefs.h" -#include "ngspice/cktdefs.h" -#include "mos2defs.h" -#include "ngspice/sperror.h" -#include "ngspice/suffix.h" - -int -MOS2sUpdate(GENmodel *inModel, CKTcircuit *ckt) -{ - MOS2model *model = (MOS2model *)inModel; - MOS2instance *here; - int iparmno; - double sb; - double sg; - double sdprm; - double ssprm; - double sxpgs; - double sxpgd; - double sxpbs; - double sxpbd; - double sxpgb; - double dummy1; - double dummy2; - SENstruct *info; - - - if(ckt->CKTtime == 0) return(OK); - info = ckt->CKTsenInfo; - -#ifdef SENSDEBUG - printf("MOS2senupdate\n"); - printf("CKTtime = %.5e\n",ckt->CKTtime); -#endif /* SENSDEBUG */ - - sxpgs = 0; - sxpgd = 0; - sxpbs = 0; - sxpbd = 0; - sxpgb = 0; - dummy1 = 0; - dummy2 = 0; - - /* loop through all the MOS2 models */ - for( ; model != NULL; model = MOS2nextModel(model)) { - - /* loop through all the instances of the model */ - for (here = MOS2instances(model); here != NULL ; - here=MOS2nextInstance(here)) { - -#ifdef SENSDEBUG - printf("senupdate instance name %s\n",here->MOS2name); - printf("before loading\n"); - printf("CKTag[0] = %.2e,CKTag[1] = %.2e\n", - ckt->CKTag[0],ckt->CKTag[1]); - printf("capgs = %.7e\n",here->MOS2cgs); - printf("capgd = %.7e\n",here->MOS2cgd); - printf("capgb = %.7e\n",here->MOS2cgb); - printf("capbs = %.7e\n",here->MOS2capbs); - printf("capbd = %.7e\n",here->MOS2capbd); -#endif /* SENSDEBUG */ - - for(iparmno = 1;iparmno<=info->SENparms;iparmno++){ - - sb = *(info->SEN_Sap[here->MOS2bNode] + iparmno); - sg = *(info->SEN_Sap[here->MOS2gNode] + iparmno); - ssprm = *(info->SEN_Sap[here->MOS2sNodePrime] + iparmno); - sdprm = *(info->SEN_Sap[here->MOS2dNodePrime] + iparmno); -#ifdef SENSDEBUG - printf("iparmno = %d\n",iparmno); - printf("sb = %.7e,sg = %.7e\n",sb,sg); - printf("ssprm = %.7e,sdprm = %.7e\n",ssprm,sdprm); -#endif /* SENSDEBUG */ - - sxpgs = (sg - ssprm) * here->MOS2cgs ; - sxpgd = (sg - sdprm) * here->MOS2cgd ; - sxpgb = (sg - sb) * here->MOS2cgb ; - sxpbs = (sb - ssprm) * here->MOS2capbs ; - sxpbd = (sb - sdprm) * here->MOS2capbd ; - - if(here->MOS2sens_l && (iparmno == here->MOS2senParmNo)){ - sxpgs += *(here->MOS2dphigs_dl); - sxpgd += *(here->MOS2dphigd_dl); - sxpbs += *(here->MOS2dphibs_dl); - sxpbd += *(here->MOS2dphibd_dl); - sxpgb += *(here->MOS2dphigb_dl); - } - if(here->MOS2sens_w && - (iparmno == (here->MOS2senParmNo + - (int) here->MOS2sens_l))){ - sxpgs += *(here->MOS2dphigs_dw); - sxpgd += *(here->MOS2dphigd_dw); - sxpbs += *(here->MOS2dphibs_dw); - sxpbd += *(here->MOS2dphibd_dw); - sxpgb += *(here->MOS2dphigb_dw); - } - if(ckt->CKTmode & MODEINITTRAN) { - *(ckt->CKTstate1 + here->MOS2sensxpgs + - 10 * (iparmno - 1)) = sxpgs; - *(ckt->CKTstate1 + here->MOS2sensxpgd + - 10 * (iparmno - 1)) = sxpgd; - *(ckt->CKTstate1 + here->MOS2sensxpbs + - 10 * (iparmno - 1)) = sxpbs; - *(ckt->CKTstate1 + here->MOS2sensxpbd + - 10 * (iparmno - 1)) = sxpbd; - *(ckt->CKTstate1 + here->MOS2sensxpgb + - 10 * (iparmno - 1)) = sxpgb; - *(ckt->CKTstate1 + here->MOS2sensxpgs + - 10 * (iparmno - 1) + 1) = 0; - *(ckt->CKTstate1 + here->MOS2sensxpgd + - 10 * (iparmno - 1) + 1) = 0; - *(ckt->CKTstate1 + here->MOS2sensxpbs + - 10 * (iparmno - 1) + 1) = 0; - *(ckt->CKTstate1 + here->MOS2sensxpbd + - 10 * (iparmno - 1) + 1) = 0; - *(ckt->CKTstate1 + here->MOS2sensxpgb + - 10 * (iparmno - 1) + 1) = 0; - goto next; - } - - *(ckt->CKTstate0 + here->MOS2sensxpgs + - 10 * (iparmno - 1)) = sxpgs; - *(ckt->CKTstate0 + here->MOS2sensxpgd + - 10 * (iparmno - 1)) = sxpgd; - *(ckt->CKTstate0 + here->MOS2sensxpbs + - 10 * (iparmno - 1)) = sxpbs; - *(ckt->CKTstate0 + here->MOS2sensxpbd + - 10 * (iparmno - 1)) = sxpbd; - *(ckt->CKTstate0 + here->MOS2sensxpgb + - 10 * (iparmno - 1)) = sxpgb; - - NIintegrate(ckt,&dummy1,&dummy2,here->MOS2cgs, - here->MOS2sensxpgs + 10*(iparmno -1)); - NIintegrate(ckt,&dummy1,&dummy2,here->MOS2cgd, - here->MOS2sensxpgd + 10*(iparmno -1)); - NIintegrate(ckt,&dummy1,&dummy2,here->MOS2cgb, - here->MOS2sensxpgb + 10*(iparmno -1)); - NIintegrate(ckt,&dummy1,&dummy2,here->MOS2capbs, - here->MOS2sensxpbs + 10*(iparmno -1)); - NIintegrate(ckt,&dummy1,&dummy2,here->MOS2capbd, - here->MOS2sensxpbd + 10*(iparmno -1)); -next: - ; -#ifdef SENSDEBUG - printf("after loading\n"); - printf("sxpgs = %.7e,sdotxpgs = %.7e\n", - sxpgs,*(ckt->CKTstate0 + here->MOS2sensxpgs + - 10 * (iparmno - 1) + 1)); - printf("sxpgd = %.7e,sdotxpgd = %.7e\n", - sxpgd,*(ckt->CKTstate0 + here->MOS2sensxpgd + - 10 * (iparmno - 1) + 1)); - printf("sxpgb = %.7e,sdotxpgb = %.7e\n", - sxpgb,*(ckt->CKTstate0 + here->MOS2sensxpgb + - 10 * (iparmno - 1) + 1)); - printf("sxpbs = %.7e,sdotxpbs = %.7e\n", - sxpbs,*(ckt->CKTstate0 + here->MOS2sensxpbs + - 10 * (iparmno - 1) + 1)); - printf("sxpbd = %.7e,sdotxpbd = %.7e\n", - sxpbd,*(ckt->CKTstate0 + here->MOS2sensxpbd + - 10 * (iparmno - 1) + 1)); -#endif /* SENSDEBUG */ - } - } - } -#ifdef SENSDEBUG - printf("MOS2senupdate end\n"); -#endif /* SENSDEBUG */ - return(OK); - -} - diff --git a/src/spicelib/devices/mos2/mos2temp.c b/src/spicelib/devices/mos2/mos2temp.c deleted file mode 100644 index f51deef98..000000000 --- a/src/spicelib/devices/mos2/mos2temp.c +++ /dev/null @@ -1,343 +0,0 @@ -/********** -Copyright 1990 Regents of the University of California. All rights reserved. -Author: 1985 Thomas L. Quarles -Modified: 2000 AlansFixes -**********/ - -#include "ngspice/ngspice.h" -#include "ngspice/cktdefs.h" -#include "mos2defs.h" -#include "ngspice/const.h" -#include "ngspice/sperror.h" -#include "ngspice/suffix.h" - -/* assuming silicon - make definition for epsilon of silicon */ -#define EPSSIL (11.7 * 8.854214871e-12) - -int -MOS2temp(GENmodel *inModel, CKTcircuit *ckt) -{ - MOS2model *model = (MOS2model *)inModel; - MOS2instance *here; - double egfet; - double wkfngs; - double wkfng; - double fermig; - double fermis; - double vfb; - double fact1,fact2; - double vt,vtnom; - double kt,kt1; - double egfet1; - double arg1; - double pbfact,pbfact1; - double ratio,ratio4; - double phio; - double pbo; - double gmaold,gmanew; - double capfact; - /* loop through all the resistor models */ - for( ; model != NULL; model = MOS2nextModel(model)) { - - /* perform model defaulting */ - - /* now model parameter preprocessing */ - if(!model->MOS2tnomGiven) { - model->MOS2tnom = ckt->CKTnomTemp; - } - fact1 = model->MOS2tnom/REFTEMP; - vtnom = model->MOS2tnom*CONSTKoverQ; - kt1 = CONSTboltz * model->MOS2tnom; - egfet1 = 1.16-(7.02e-4*model->MOS2tnom*model->MOS2tnom)/ - (model->MOS2tnom+1108); - arg1 = -egfet1/(kt1+kt1)+1.1150877/(CONSTboltz*(REFTEMP+REFTEMP)); - pbfact1 = -2*vtnom *(1.5*log(fact1)+CHARGE*arg1); - - if (model->MOS2phi <= 0.0) { - SPfrontEnd->IFerrorf (ERR_FATAL, - "%s: Phi is not positive.", model->MOS2modName); - return(E_BADPARM); - } - - if(!model->MOS2oxideThicknessGiven) { - model->MOS2oxideThickness = 1e-7; - } - model->MOS2oxideCapFactor = 3.9 * 8.854214871e-12/ - model->MOS2oxideThickness; - - if(!model->MOS2surfaceMobilityGiven) model->MOS2surfaceMobility=600; - if(!model->MOS2transconductanceGiven) { - model->MOS2transconductance = model->MOS2surfaceMobility - * 1e-4 /*(m**2/cm**2) */ * model->MOS2oxideCapFactor; - } - if(model->MOS2substrateDopingGiven) { - if(model->MOS2substrateDoping *1e6 /*(cm**3/m**3)*/ >1.45e16) { - if(!model->MOS2phiGiven) { - model->MOS2phi = 2*vtnom* - log(model->MOS2substrateDoping* - 1e6 /*(cm**3/m**3)*//1.45e16); - model->MOS2phi = MAX(.1,model->MOS2phi); - } - fermis = model->MOS2type * .5 * model->MOS2phi; - wkfng = 3.2; - if(!model->MOS2gateTypeGiven) model->MOS2gateType=1; - if(model->MOS2gateType != 0) { - fermig = model->MOS2type * model->MOS2gateType*.5*egfet1; - wkfng = 3.25 + .5 * egfet1 - fermig; - } - wkfngs = wkfng - (3.25 + .5 * egfet1 +fermis); - if(!model->MOS2gammaGiven) { - model->MOS2gamma = sqrt(2 * 11.70 * 8.854214871e-12 * - CHARGE * model->MOS2substrateDoping * - 1e6 /*(cm**3/m**3)*/)/model->MOS2oxideCapFactor; - } - if(!model->MOS2vt0Given) { - if(!model->MOS2surfaceStateDensityGiven) - model->MOS2surfaceStateDensity=0; - vfb = wkfngs - - model->MOS2surfaceStateDensity * - 1e4 /*(cm**2/m**2)*/ * CHARGE/model->MOS2oxideCapFactor; - model->MOS2vt0 = vfb + model->MOS2type * - (model->MOS2gamma * sqrt(model->MOS2phi)+ - model->MOS2phi); - } else { - vfb = model->MOS2vt0 - model->MOS2type * (model->MOS2gamma* - sqrt(model->MOS2phi)+model->MOS2phi); - } - model->MOS2xd = sqrt((EPSSIL+EPSSIL)/ - (CHARGE*model->MOS2substrateDoping *1e6 /*(cm**3/m**3)*/)); - } else { - model->MOS2substrateDoping = 0; - SPfrontEnd->IFerrorf (ERR_FATAL, "%s: Nsub < Ni", - model->MOS2modName); - return(E_BADPARM); - } - } - if(!model->MOS2bulkCapFactorGiven) { - model->MOS2bulkCapFactor = sqrt(EPSSIL*CHARGE* - model->MOS2substrateDoping* 1e6 /*cm**3/m**3*/ - /(2*model->MOS2bulkJctPotential)); - } - - - /* loop through all instances of the model */ - for(here = MOS2instances(model); here!= NULL; - here = MOS2nextInstance(here)) { - double czbd; /* zero voltage bulk-drain capacitance */ - double czbdsw; /* zero voltage bulk-drain sidewall capacitance */ - double czbs; /* zero voltage bulk-source capacitance */ - double czbssw; /* zero voltage bulk-source sidewall capacitance */ - double arg; /* 1 - fc */ - double sarg; /* (1-fc) ^^ (-mj) */ - double sargsw; /* (1-fc) ^^ (-mjsw) */ - - /* perform the parameter defaulting */ - if(!here->MOS2dtempGiven) { - here->MOS2dtemp = 0.0; - } - - if(!here->MOS2tempGiven) { - here->MOS2temp = ckt->CKTtemp + here->MOS2dtemp; - } - here->MOS2mode = 1; - here->MOS2von = 0; - - vt = here->MOS2temp * CONSTKoverQ; - ratio = here->MOS2temp/model->MOS2tnom; - fact2 = here->MOS2temp/REFTEMP; - kt = here->MOS2temp * CONSTboltz; - egfet = 1.16-(7.02e-4*here->MOS2temp*here->MOS2temp)/ - (here->MOS2temp+1108); - arg = -egfet/(kt+kt)+1.1150877/(CONSTboltz*(REFTEMP+REFTEMP)); - pbfact = -2*vt *(1.5*log(fact2)+CHARGE*arg); - - if(!here->MOS2drainAreaGiven) { - here->MOS2drainArea = ckt->CKTdefaultMosAD; - } - if(!here->MOS2mGiven) { - here->MOS2m = ckt->CKTdefaultMosM; - } - if(!here->MOS2lGiven) { - here->MOS2l = ckt->CKTdefaultMosL; - } - if(!here->MOS2sourceAreaGiven) { - here->MOS2sourceArea = ckt->CKTdefaultMosAS; - } - if(!here->MOS2wGiven) { - here->MOS2w = ckt->CKTdefaultMosW; - } - if(model->MOS2drainResistanceGiven) { - if(model->MOS2drainResistance != 0) { - here->MOS2drainConductance = here->MOS2m / - model->MOS2drainResistance; - } else { - here->MOS2drainConductance = 0; - } - } else if (model->MOS2sheetResistanceGiven) { - if((model->MOS2sheetResistance != 0) && - (here->MOS2drainSquares != 0)) { - here->MOS2drainConductance = - here->MOS2m / - (model->MOS2sheetResistance*here->MOS2drainSquares); - } else { - here->MOS2drainConductance = 0; - } - } else { - here->MOS2drainConductance = 0; - } - if(model->MOS2sourceResistanceGiven) { - if(model->MOS2sourceResistance != 0) { - here->MOS2sourceConductance = here->MOS2m / - model->MOS2sourceResistance; - } else { - here->MOS2sourceConductance = 0; - } - } else if (model->MOS2sheetResistanceGiven) { - if ((model->MOS2sheetResistance != 0) && - (here->MOS2sourceSquares != 0)) { - here->MOS2sourceConductance = - here->MOS2m / - (model->MOS2sheetResistance*here->MOS2sourceSquares); - } else { - here->MOS2sourceConductance = 0; - } - } else { - here->MOS2sourceConductance = 0; - } - if(here->MOS2l - 2 * model->MOS2latDiff <=0) { - SPfrontEnd->IFerrorf (ERR_WARNING, - "%s: effective channel length less than zero", - here->MOS2name); - } - - ratio4 = ratio * sqrt(ratio); - here->MOS2tTransconductance = model->MOS2transconductance / ratio4; - here->MOS2tSurfMob = model->MOS2surfaceMobility/ratio4; - phio= (model->MOS2phi-pbfact1)/fact1; - here->MOS2tPhi = fact2 * phio + pbfact; - here->MOS2tVbi = - model->MOS2vt0 - model->MOS2type * - (model->MOS2gamma* sqrt(model->MOS2phi)) - +.5*(egfet1-egfet) - + model->MOS2type*.5* (here->MOS2tPhi-model->MOS2phi); - here->MOS2tVto = here->MOS2tVbi + model->MOS2type * - model->MOS2gamma * sqrt(here->MOS2tPhi); - here->MOS2tSatCur = model->MOS2jctSatCur* - exp(-egfet/vt+egfet1/vtnom); - here->MOS2tSatCurDens = model->MOS2jctSatCurDensity * - exp(-egfet/vt+egfet1/vtnom); - pbo = (model->MOS2bulkJctPotential - pbfact1)/fact1; - gmaold = (model->MOS2bulkJctPotential-pbo)/pbo; - capfact = 1/(1+model->MOS2bulkJctBotGradingCoeff* - (4e-4*(model->MOS2tnom-REFTEMP)-gmaold)); - here->MOS2tCbd = model->MOS2capBD * capfact; - here->MOS2tCbs = model->MOS2capBS * capfact; - here->MOS2tCj = model->MOS2bulkCapFactor * capfact; - capfact = 1/(1+model->MOS2bulkJctSideGradingCoeff* - (4e-4*(model->MOS2tnom-REFTEMP)-gmaold)); - here->MOS2tCjsw = model->MOS2sideWallCapFactor * capfact; - here->MOS2tBulkPot = fact2 * pbo+pbfact; - gmanew = (here->MOS2tBulkPot-pbo)/pbo; - capfact = (1+model->MOS2bulkJctBotGradingCoeff* - (4e-4*(here->MOS2temp-REFTEMP)-gmanew)); - here->MOS2tCbd *= capfact; - here->MOS2tCbs *= capfact; - here->MOS2tCj *= capfact; - capfact = (1+model->MOS2bulkJctSideGradingCoeff* - (4e-4*(here->MOS2temp-REFTEMP)-gmanew)); - here->MOS2tCjsw *= capfact; - here->MOS2tDepCap = model->MOS2fwdCapDepCoeff * here->MOS2tBulkPot; - - - if( (here->MOS2tSatCurDens == 0) || - (here->MOS2drainArea == 0) || - (here->MOS2sourceArea == 0) ) { - here->MOS2sourceVcrit = here->MOS2drainVcrit = - vt*log(vt/(CONSTroot2*here->MOS2m*here->MOS2tSatCur)); - } else { - here->MOS2drainVcrit = - vt * log( vt / (CONSTroot2 * - here->MOS2m * - here->MOS2tSatCurDens * here->MOS2drainArea)); - here->MOS2sourceVcrit = - vt * log( vt / (CONSTroot2 * - here->MOS2m * - here->MOS2tSatCurDens * here->MOS2sourceArea)); - } - if(model->MOS2capBDGiven) { - czbd = here->MOS2tCbd * here->MOS2m; - } else { - if(model->MOS2bulkCapFactorGiven) { - czbd=here->MOS2tCj*here->MOS2drainArea * here->MOS2m; - } else { - czbd=0; - } - } - if(model->MOS2sideWallCapFactorGiven) { - czbdsw= here->MOS2tCjsw * here->MOS2drainPerimiter * - here->MOS2m;; - } else { - czbdsw=0; - } - arg = 1-model->MOS2fwdCapDepCoeff; - sarg = exp( (-model->MOS2bulkJctBotGradingCoeff) * log(arg) ); - sargsw = exp( (-model->MOS2bulkJctSideGradingCoeff) * log(arg) ); - here->MOS2Cbd = czbd; - here->MOS2Cbdsw = czbdsw; - here->MOS2f2d = czbd*(1-model->MOS2fwdCapDepCoeff* - (1+model->MOS2bulkJctBotGradingCoeff))* sarg/arg - + czbdsw*(1-model->MOS2fwdCapDepCoeff* - (1+model->MOS2bulkJctSideGradingCoeff))* - sargsw/arg; - here->MOS2f3d = czbd * model->MOS2bulkJctBotGradingCoeff * sarg/arg/ - here->MOS2tBulkPot - + czbdsw * model->MOS2bulkJctSideGradingCoeff * sargsw/arg / - here->MOS2tBulkPot; - here->MOS2f4d = czbd*here->MOS2tBulkPot*(1-arg*sarg)/ - (1-model->MOS2bulkJctBotGradingCoeff) - + czbdsw*here->MOS2tBulkPot*(1-arg*sargsw)/ - (1-model->MOS2bulkJctSideGradingCoeff) - -here->MOS2f3d/2* - (here->MOS2tDepCap*here->MOS2tDepCap) - -here->MOS2tDepCap * here->MOS2f2d; - if(model->MOS2capBSGiven) { - czbs=here->MOS2tCbs * here->MOS2m; - } else { - if(model->MOS2bulkCapFactorGiven) { - czbs=here->MOS2tCj*here->MOS2sourceArea * here->MOS2m; - } else { - czbs=0; - } - } - if(model->MOS2sideWallCapFactorGiven) { - czbssw = here->MOS2tCjsw * here->MOS2sourcePerimiter * - here->MOS2m; - } else { - czbssw=0; - } - arg = 1-model->MOS2fwdCapDepCoeff; - sarg = exp( (-model->MOS2bulkJctBotGradingCoeff) * log(arg) ); - sargsw = exp( (-model->MOS2bulkJctSideGradingCoeff) * log(arg) ); - here->MOS2Cbs = czbs; - here->MOS2Cbssw = czbssw; - here->MOS2f2s = czbs*(1-model->MOS2fwdCapDepCoeff* - (1+model->MOS2bulkJctBotGradingCoeff))* sarg/arg - + czbssw*(1-model->MOS2fwdCapDepCoeff* - (1+model->MOS2bulkJctSideGradingCoeff))* - sargsw/arg; - here->MOS2f3s = czbs * model->MOS2bulkJctBotGradingCoeff * sarg/arg/ - here->MOS2tBulkPot - + czbssw * model->MOS2bulkJctSideGradingCoeff * sargsw/arg / - here->MOS2tBulkPot; - here->MOS2f4s = czbs*here->MOS2tBulkPot*(1-arg*sarg)/ - (1-model->MOS2bulkJctBotGradingCoeff) - + czbssw*here->MOS2tBulkPot*(1-arg*sargsw)/ - (1-model->MOS2bulkJctSideGradingCoeff) - -here->MOS2f3s/2* - (here->MOS2tDepCap*here->MOS2tDepCap) - -here->MOS2tDepCap * here->MOS2f2s; - - } - } - return(OK); -} diff --git a/src/spicelib/devices/mos2/mos2trun.c b/src/spicelib/devices/mos2/mos2trun.c deleted file mode 100644 index 20de2ef8b..000000000 --- a/src/spicelib/devices/mos2/mos2trun.c +++ /dev/null @@ -1,30 +0,0 @@ -/********** -Copyright 1990 Regents of the University of California. All rights reserved. -Author: 1985 Thomas L. Quarles -**********/ -/* - */ - -#include "ngspice/ngspice.h" -#include "ngspice/cktdefs.h" -#include "mos2defs.h" -#include "ngspice/sperror.h" -#include "ngspice/suffix.h" - - -int -MOS2trunc(GENmodel *inModel, CKTcircuit *ckt, double *timeStep) -{ - MOS2model *model = (MOS2model *)inModel; - MOS2instance *here; - - for( ; model != NULL; model = MOS2nextModel(model)) { - for(here=MOS2instances(model);here!=NULL;here = MOS2nextInstance(here)){ - - CKTterr(here->MOS2qgs,ckt,timeStep); - CKTterr(here->MOS2qgd,ckt,timeStep); - CKTterr(here->MOS2qgb,ckt,timeStep); - } - } - return(OK); -} diff --git a/src/spicelib/devices/mos3/Makefile.am b/src/spicelib/devices/mos3/Makefile.am deleted file mode 100644 index 393ff7894..000000000 --- a/src/spicelib/devices/mos3/Makefile.am +++ /dev/null @@ -1,37 +0,0 @@ -## Process this file with automake to produce Makefile.in - -noinst_LTLIBRARIES = libmos3.la - -libmos3_la_SOURCES = \ - mos3.c \ - mos3acld.c \ - mos3ask.c \ - mos3conv.c \ - mos3defs.h \ - mos3del.c \ - mos3dist.c \ - mos3dset.c \ - mos3ext.h \ - mos3ic.c \ - mos3init.c \ - mos3init.h \ - mos3itf.h \ - mos3load.c \ - mos3mask.c \ - mos3mpar.c \ - mos3noi.c \ - mos3par.c \ - mos3pzld.c \ - mos3sacl.c \ - mos3set.c \ - mos3sld.c \ - mos3sprt.c \ - mos3sset.c \ - mos3supd.c \ - mos3temp.c \ - mos3trun.c - - -AM_CPPFLAGS = @AM_CPPFLAGS@ -I$(top_srcdir)/src/include -AM_CFLAGS = $(STATIC) -MAINTAINERCLEANFILES = Makefile.in diff --git a/src/spicelib/devices/mos3/mos3.c b/src/spicelib/devices/mos3/mos3.c deleted file mode 100644 index 553840366..000000000 --- a/src/spicelib/devices/mos3/mos3.c +++ /dev/null @@ -1,173 +0,0 @@ -/********** -Copyright 1990 Regents of the University of California. All rights reserved. -Author: 1987 Thomas L. Quarles -Modified: 2000 AlansFixes -**********/ - -#include "ngspice/ngspice.h" -#include "ngspice/devdefs.h" -#include "ngspice/ifsim.h" -#include "mos3defs.h" -#include "ngspice/suffix.h" - -IFparm MOS3pTable[] = { /* parameters */ - IOPU("m", MOS3_M, IF_REAL , "Multiplier"), - IOPU("l", MOS3_L, IF_REAL , "Length"), - IOPU("w", MOS3_W, IF_REAL , "Width"), - IOPU("ad", MOS3_AD, IF_REAL , "Drain area"), - IOPU("as", MOS3_AS, IF_REAL , "Source area"), - IOPU("pd", MOS3_PD, IF_REAL , "Drain perimeter"), - IOPU("ps", MOS3_PS, IF_REAL , "Source perimeter"), - OP("id", MOS3_CD, IF_REAL, "Drain current"), - OPR("cd", MOS3_CD, IF_REAL, "Drain current"), - OPU("ibd", MOS3_CBD, IF_REAL, "B-D junction current"), - OPU("ibs", MOS3_CBS, IF_REAL, "B-S junction current"), - OPU("is", MOS3_CS, IF_REAL, "Source current"), - OPU("ig", MOS3_CG, IF_REAL, "Gate current"), - OPU("ib", MOS3_CB, IF_REAL, "Bulk current"), - OP("vgs", MOS3_VGS, IF_REAL, "Gate-Source voltage"), - OP("vds", MOS3_VDS, IF_REAL, "Drain-Source voltage"), - OP("vbs", MOS3_VBS, IF_REAL, "Bulk-Source voltage"), - OPU("vbd", MOS3_VBD, IF_REAL, "Bulk-Drain voltage"), - IOPU("nrd", MOS3_NRD, IF_REAL , "Drain squares"), - IOPU("nrs", MOS3_NRS, IF_REAL , "Source squares"), - IP("off", MOS3_OFF, IF_FLAG , "Device initially off"), - IOPAU("icvds", MOS3_IC_VDS, IF_REAL , "Initial D-S voltage"), - IOPAU("icvgs", MOS3_IC_VGS, IF_REAL , "Initial G-S voltage"), - IOPAU("icvbs", MOS3_IC_VBS, IF_REAL , "Initial B-S voltage"), - IOPU("ic", MOS3_IC, IF_REALVEC, "Vector of D-S, G-S, B-S voltages"), - IOPU("temp", MOS3_TEMP, IF_REAL , "Instance operating temperature"), - IOPU("dtemp", MOS3_DTEMP, IF_REAL , "Instance temperature difference"), - IP("sens_l", MOS3_L_SENS, IF_FLAG, "flag to request sensitivity WRT length"), - IP("sens_w", MOS3_W_SENS, IF_FLAG, "flag to request sensitivity WRT width"), - OPU("dnode", MOS3_DNODE, IF_INTEGER, "Number of drain node"), - OPU("gnode", MOS3_GNODE, IF_INTEGER, "Number of gate node"), - OPU("snode", MOS3_SNODE, IF_INTEGER, "Number of source node"), - OPU("bnode", MOS3_BNODE, IF_INTEGER, "Number of bulk node"), - OPU("dnodeprime", MOS3_DNODEPRIME,IF_INTEGER,"Number of internal drain node"), - OPU("snodeprime", MOS3_SNODEPRIME,IF_INTEGER,"Number of internal source node"), - OP("von", MOS3_VON, IF_REAL, "Turn-on voltage"), - OP("vdsat", MOS3_VDSAT, IF_REAL, "Saturation drain voltage"), - OPU("sourcevcrit", MOS3_SOURCEVCRIT, IF_REAL, "Critical source voltage"), - OPU("drainvcrit", MOS3_DRAINVCRIT, IF_REAL, "Critical drain voltage"), - OP("rs", MOS3_SOURCERESIST, IF_REAL, "Source resistance"), - OPU("sourceconductance", MOS3_SOURCECONDUCT, IF_REAL, "Source conductance"), - OP("rd", MOS3_DRAINRESIST, IF_REAL, "Drain resistance"), - OPU("drainconductance", MOS3_DRAINCONDUCT, IF_REAL, "Drain conductance"), - OP("gm", MOS3_GM, IF_REAL, "Transconductance"), - OP("gds", MOS3_GDS, IF_REAL, "Drain-Source conductance"), - OP("gmb", MOS3_GMBS, IF_REAL, "Bulk-Source transconductance"), - OPR("gmbs", MOS3_GMBS, IF_REAL, "Bulk-Source transconductance"), - OPU("gbd", MOS3_GBD, IF_REAL, "Bulk-Drain conductance"), - OPU("gbs", MOS3_GBS, IF_REAL, "Bulk-Source conductance"), - - OP("cbd", MOS3_CAPBD, IF_REAL, "Bulk-Drain capacitance"), - OP("cbs", MOS3_CAPBS, IF_REAL, "Bulk-Source capacitance"), - OP("cgs", MOS3_CAPGS, IF_REAL, "Gate-Source capacitance"), -/* OPR("cgs", MOS3_CGS, IF_REAL , "Gate-Source capacitance"),*/ - OP("cgd", MOS3_CAPGD, IF_REAL, "Gate-Drain capacitance"), -/* OPR("cgd", MOS3_CGD, IF_REAL , "Gate-Drain capacitance"),*/ - OP("cgb", MOS3_CAPGB, IF_REAL, "Gate-Bulk capacitance"), - - OPU("cqgs",MOS3_CQGS,IF_REAL,"Capacitance due to gate-source charge storage"), - OPU("cqgd",MOS3_CQGD, IF_REAL,"Capacitance due to gate-drain charge storage"), - OPU("cqgb",MOS3_CQGB, IF_REAL,"Capacitance due to gate-bulk charge storage"), - OPU("cqbd",MOS3_CQBD,IF_REAL,"Capacitance due to bulk-drain charge storage"), - OPU("cqbs",MOS3_CQBS,IF_REAL,"Capacitance due to bulk-source charge storage"), - - OPU("cbd0",MOS3_CAPZEROBIASBD,IF_REAL,"Zero-Bias B-D junction capacitance"), - OPU("cbdsw0",MOS3_CAPZEROBIASBDSW,IF_REAL, - "Zero-Bias B-D sidewall capacitance"), - OPU("cbs0",MOS3_CAPZEROBIASBS,IF_REAL,"Zero-Bias B-S junction capacitance"), - OPU("cbssw0",MOS3_CAPZEROBIASBSSW,IF_REAL, - "Zero-Bias B-S sidewall capacitance"), - OPU("qbs", MOS3_QBS, IF_REAL, "Bulk-Source charge storage"), - OPU("qgs", MOS3_QGS, IF_REAL, "Gate-Source charge storage"), - OPU("qgd", MOS3_QGD, IF_REAL, "Gate-Drain charge storage"), - OPU("qgb", MOS3_QGB, IF_REAL, "Gate-Bulk charge storage"), - OPU("qbd", MOS3_QBD, IF_REAL, "Bulk-Drain charge storage"), - OPU("p", MOS3_POWER, IF_REAL, "Instantaneous power"), - OPU("sens_l_dc", MOS3_L_SENS_DC, IF_REAL, "dc sensitivity wrt length"), - OPU("sens_l_real",MOS3_L_SENS_REAL, IF_REAL, - "real part of ac sensitivity wrt length"), - OPU("sens_l_imag",MOS3_L_SENS_IMAG, IF_REAL, - "imag part of ac sensitivity wrt length"), - OPU("sens_l_cplx",MOS3_L_SENS_CPLX, IF_COMPLEX, "ac sensitivity wrt length"), - OPU("sens_l_mag", MOS3_L_SENS_MAG, IF_REAL, - "sensitivity wrt l of ac magnitude"), - OPU("sens_l_ph", MOS3_L_SENS_PH, IF_REAL, "sensitivity wrt l of ac phase"), - OPU("sens_w_dc", MOS3_W_SENS_DC, IF_REAL, "dc sensitivity wrt width"), - OPU("sens_w_real",MOS3_W_SENS_REAL, IF_REAL, - "real part of ac sensitivity wrt width"), - OPU("sens_w_imag",MOS3_W_SENS_IMAG, IF_REAL, - "imag part of ac sensitivity wrt width"), - OPU("sens_w_mag", MOS3_W_SENS_MAG, IF_REAL, - "sensitivity wrt w of ac magnitude"), - OPU("sens_w_ph", MOS3_W_SENS_PH, IF_REAL, "sensitivity wrt w of ac phase"), - OPU("sens_w_cplx",MOS3_W_SENS_CPLX, IF_COMPLEX, "ac sensitivity wrt width") -}; - -IFparm MOS3mPTable[] = { /* model parameters */ - OP("type", MOS3_MOD_TYPE, IF_STRING ,"N-channel or P-channel MOS"), - IP("nmos", MOS3_MOD_NMOS, IF_FLAG ,"N type MOSfet model"), - IP("pmos", MOS3_MOD_PMOS, IF_FLAG ,"P type MOSfet model"), - IOP("vto", MOS3_MOD_VTO, IF_REAL ,"Threshold voltage"), - IOPR("vt0", MOS3_MOD_VTO, IF_REAL ,"Threshold voltage"), - IOP("kp", MOS3_MOD_KP, IF_REAL ,"Transconductance parameter"), - IOP("gamma", MOS3_MOD_GAMMA, IF_REAL ,"Bulk threshold parameter"), - IOP("phi", MOS3_MOD_PHI, IF_REAL ,"Surface potential"), - IOP("rd", MOS3_MOD_RD, IF_REAL ,"Drain ohmic resistance"), - IOP("rs", MOS3_MOD_RS, IF_REAL ,"Source ohmic resistance"), - IOPA("cbd", MOS3_MOD_CBD, IF_REAL ,"B-D junction capacitance"), - IOPA("cbs", MOS3_MOD_CBS, IF_REAL ,"B-S junction capacitance"), - IOP("is", MOS3_MOD_IS, IF_REAL ,"Bulk junction sat. current"), - IOP("pb", MOS3_MOD_PB, IF_REAL ,"Bulk junction potential"), - IOPA("cgso", MOS3_MOD_CGSO, IF_REAL ,"Gate-source overlap cap."), - IOPA("cgdo", MOS3_MOD_CGDO, IF_REAL ,"Gate-drain overlap cap."), - IOPA("cgbo", MOS3_MOD_CGBO, IF_REAL ,"Gate-bulk overlap cap."), - IOP("rsh", MOS3_MOD_RSH, IF_REAL ,"Sheet resistance"), - IOPA("cj", MOS3_MOD_CJ, IF_REAL ,"Bottom junction cap per area"), - IOP("mj", MOS3_MOD_MJ, IF_REAL ,"Bottom grading coefficient"), - IOPA("cjsw", MOS3_MOD_CJSW, IF_REAL ,"Side junction cap per area"), - IOP("mjsw", MOS3_MOD_MJSW, IF_REAL ,"Side grading coefficient"), - IOPU("js", MOS3_MOD_JS, IF_REAL ,"Bulk jct. sat. current density"), - IOP("tox", MOS3_MOD_TOX, IF_REAL ,"Oxide thickness"), - IOP("ld", MOS3_MOD_LD, IF_REAL ,"Lateral diffusion"), - IOP("xl", MOS3_MOD_XL, IF_REAL ,"Length mask adjustment"), - IOP("wd", MOS3_MOD_WD, IF_REAL ,"Width Narrowing (Diffusion)"), - IOP("xw", MOS3_MOD_XW, IF_REAL ,"Width mask adjustment"), - IOPU("delvto", MOS3_MOD_DELVTO, IF_REAL ,"Threshold voltage Adjust"), - IOPUR("delvt0", MOS3_MOD_DELVTO, IF_REAL ,"Threshold voltage Adjust"), - IOP("u0", MOS3_MOD_U0, IF_REAL ,"Surface mobility"), - IOPR("uo", MOS3_MOD_U0, IF_REAL ,"Surface mobility"), - IOP("fc", MOS3_MOD_FC, IF_REAL ,"Forward bias jct. fit parm."), - IOP("nsub", MOS3_MOD_NSUB, IF_REAL ,"Substrate doping"), - IOP("tpg", MOS3_MOD_TPG, IF_INTEGER,"Gate type"), - IOP("nss", MOS3_MOD_NSS, IF_REAL ,"Surface state density"), - IOP("vmax", MOS3_MOD_VMAX, IF_REAL ,"Maximum carrier drift velocity"), - IOP("xj", MOS3_MOD_XJ, IF_REAL ,"Junction depth"), - IOP("nfs", MOS3_MOD_NFS, IF_REAL ,"Fast surface state density"), - IOP("xd", MOS3_MOD_XD, IF_REAL ,"Depletion layer width"), - IOP("alpha", MOS3_MOD_ALPHA, IF_REAL ,"Alpha"), - IOP("eta", MOS3_MOD_ETA, IF_REAL ,"Vds dependence of threshold voltage"), - IOP("delta", MOS3_MOD_DELTA, IF_REAL ,"Width effect on threshold"), - IOP("input_delta", MOS3_DELTA, IF_REAL ,""), - IOP("theta", MOS3_MOD_THETA, IF_REAL ,"Vgs dependence on mobility"), - IOP("kappa", MOS3_MOD_KAPPA, IF_REAL ,"Kappa"), - IOPU("tnom", MOS3_MOD_TNOM, IF_REAL ,"Parameter measurement temperature"), - IOP("kf", MOS3_MOD_KF, IF_REAL ,"Flicker noise coefficient"), - IOP("af", MOS3_MOD_AF, IF_REAL ,"Flicker noise exponent") -}; - -char *MOS3names[] = { - "Drain", - "Gate", - "Source", - "Bulk" -}; - -int MOS3nSize = NUMELEMS(MOS3names); -int MOS3pTSize = NUMELEMS(MOS3pTable); -int MOS3mPTSize = NUMELEMS(MOS3mPTable); -int MOS3iSize = sizeof(MOS3instance); -int MOS3mSize = sizeof(MOS3model); diff --git a/src/spicelib/devices/mos3/mos3acld.c b/src/spicelib/devices/mos3/mos3acld.c deleted file mode 100644 index 49c014e4f..000000000 --- a/src/spicelib/devices/mos3/mos3acld.c +++ /dev/null @@ -1,124 +0,0 @@ -/********** -Copyright 1990 Regents of the University of California. All rights reserved. -Author: 1985 Thomas L. Quarles -Modified: 2000 AlansFixes -**********/ -/* - */ - -#include "ngspice/ngspice.h" -#include "ngspice/cktdefs.h" -#include "mos3defs.h" -#include "ngspice/sperror.h" -#include "ngspice/suffix.h" - - -int -MOS3acLoad(GENmodel *inModel, CKTcircuit *ckt) -{ - MOS3model *model = (MOS3model *)inModel; - MOS3instance *here; - int xnrm; - int xrev; - double EffectiveLength; - double EffectiveWidth; - double xgs; - double xgd; - double xgb; - double xbd; - double xbs; - double capgs; - double capgd; - double capgb; - double GateBulkOverlapCap; - double GateDrainOverlapCap; - double GateSourceOverlapCap; - - for( ; model != NULL; model = MOS3nextModel(model)) { - for(here = MOS3instances(model); here!= NULL; - here = MOS3nextInstance(here)) { - - if (here->MOS3mode < 0) { - xnrm=0; - xrev=1; - } else { - xnrm=1; - xrev=0; - } - /* - * charge oriented model parameters - */ - EffectiveWidth=here->MOS3w-2*model->MOS3widthNarrow+ - model->MOS3widthAdjust; - EffectiveLength=here->MOS3l - 2*model->MOS3latDiff+ - model->MOS3lengthAdjust; - - GateSourceOverlapCap = model->MOS3gateSourceOverlapCapFactor * - here->MOS3m * EffectiveWidth; - GateDrainOverlapCap = model->MOS3gateDrainOverlapCapFactor * - here->MOS3m * EffectiveWidth; - GateBulkOverlapCap = model->MOS3gateBulkOverlapCapFactor * - here->MOS3m * EffectiveLength; - /* - * meyer"s model parameters - */ - capgs = ( *(ckt->CKTstate0+here->MOS3capgs)+ - *(ckt->CKTstate0+here->MOS3capgs) + - GateSourceOverlapCap ); - capgd = ( *(ckt->CKTstate0+here->MOS3capgd)+ - *(ckt->CKTstate0+here->MOS3capgd) + - GateDrainOverlapCap ); - capgb = ( *(ckt->CKTstate0+here->MOS3capgb)+ - *(ckt->CKTstate0+here->MOS3capgb) + - GateBulkOverlapCap ); - xgs = capgs * ckt->CKTomega; - xgd = capgd * ckt->CKTomega; - xgb = capgb * ckt->CKTomega; - xbd = here->MOS3capbd * ckt->CKTomega; - xbs = here->MOS3capbs * ckt->CKTomega; - - /* - * load matrix - */ - - *(here->MOS3GgPtr +1) += xgd+xgs+xgb; - *(here->MOS3BbPtr +1) += xgb+xbd+xbs; - *(here->MOS3DPdpPtr +1) += xgd+xbd; - *(here->MOS3SPspPtr +1) += xgs+xbs; - *(here->MOS3GbPtr +1) -= xgb; - *(here->MOS3GdpPtr +1) -= xgd; - *(here->MOS3GspPtr +1) -= xgs; - *(here->MOS3BgPtr +1) -= xgb; - *(here->MOS3BdpPtr +1) -= xbd; - *(here->MOS3BspPtr +1) -= xbs; - *(here->MOS3DPgPtr +1) -= xgd; - *(here->MOS3DPbPtr +1) -= xbd; - *(here->MOS3SPgPtr +1) -= xgs; - *(here->MOS3SPbPtr +1) -= xbs; - *(here->MOS3DdPtr) += here->MOS3drainConductance; - *(here->MOS3SsPtr) += here->MOS3sourceConductance; - *(here->MOS3BbPtr) += here->MOS3gbd+here->MOS3gbs; - *(here->MOS3DPdpPtr) += here->MOS3drainConductance+ - here->MOS3gds+here->MOS3gbd+ - xrev*(here->MOS3gm+here->MOS3gmbs); - *(here->MOS3SPspPtr) += here->MOS3sourceConductance+ - here->MOS3gds+here->MOS3gbs+ - xnrm*(here->MOS3gm+here->MOS3gmbs); - *(here->MOS3DdpPtr) -= here->MOS3drainConductance; - *(here->MOS3SspPtr) -= here->MOS3sourceConductance; - *(here->MOS3BdpPtr) -= here->MOS3gbd; - *(here->MOS3BspPtr) -= here->MOS3gbs; - *(here->MOS3DPdPtr) -= here->MOS3drainConductance; - *(here->MOS3DPgPtr) += (xnrm-xrev)*here->MOS3gm; - *(here->MOS3DPbPtr) += -here->MOS3gbd+(xnrm-xrev)*here->MOS3gmbs; - *(here->MOS3DPspPtr) -= here->MOS3gds+ - xnrm*(here->MOS3gm+here->MOS3gmbs); - *(here->MOS3SPgPtr) -= (xnrm-xrev)*here->MOS3gm; - *(here->MOS3SPsPtr) -= here->MOS3sourceConductance; - *(here->MOS3SPbPtr) -= here->MOS3gbs+(xnrm-xrev)*here->MOS3gmbs; - *(here->MOS3SPdpPtr) -= here->MOS3gds+ - xrev*(here->MOS3gm+here->MOS3gmbs); - } - } - return(OK); -} diff --git a/src/spicelib/devices/mos3/mos3ask.c b/src/spicelib/devices/mos3/mos3ask.c deleted file mode 100644 index cadbbde3c..000000000 --- a/src/spicelib/devices/mos3/mos3ask.c +++ /dev/null @@ -1,442 +0,0 @@ -/********** -Copyright 1990 Regents of the University of California. All rights reserved. -Author: 1987 Mathew Lew and Thomas L. Quarles -Modified: 2000 AlansFixes -**********/ - -#include "ngspice/ngspice.h" -#include "ngspice/const.h" -#include "ngspice/ifsim.h" -#include "ngspice/cktdefs.h" -#include "ngspice/devdefs.h" -#include "mos3defs.h" -#include "ngspice/sperror.h" -#include "ngspice/suffix.h" - -/*ARGSUSED*/ -int -MOS3ask(CKTcircuit *ckt, GENinstance *inst, int which, IFvalue *value, - IFvalue *select) -{ - MOS3instance *here = (MOS3instance *)inst; - double vr; - double vi; - double sr; - double si; - double vm; - static char *msg = "Current and power not available for ac analysis"; - switch(which) { - case MOS3_TEMP: - value->rValue = here->MOS3temp-CONSTCtoK; - return(OK); - case MOS3_DTEMP: - value->rValue = here->MOS3dtemp; - return(OK); - case MOS3_CGS: - value->rValue = 2* *(ckt->CKTstate0 + here->MOS3capgs); - return(OK); - case MOS3_CGD: - value->rValue = 2* *(ckt->CKTstate0 + here->MOS3capgd); - return(OK); - case MOS3_M: - value->rValue = here->MOS3m; - return(OK); - case MOS3_L: - value->rValue = here->MOS3l; - return(OK); - case MOS3_W: - value->rValue = here->MOS3w; - return(OK); - case MOS3_AS: - value->rValue = here->MOS3sourceArea; - return(OK); - case MOS3_AD: - value->rValue = here->MOS3drainArea; - return(OK); - case MOS3_PS: - value->rValue = here->MOS3sourcePerimiter; - return(OK); - case MOS3_PD: - value->rValue = here->MOS3drainPerimiter; - return(OK); - case MOS3_NRS: - value->rValue = here->MOS3sourceSquares; - return(OK); - case MOS3_NRD: - value->rValue = here->MOS3drainSquares; - return(OK); - case MOS3_OFF: - value->rValue = here->MOS3off; - return(OK); - case MOS3_IC_VBS: - value->rValue = here->MOS3icVBS; - return(OK); - case MOS3_IC_VDS: - value->rValue = here->MOS3icVDS; - return(OK); - case MOS3_IC_VGS: - value->rValue = here->MOS3icVGS; - return(OK); - case MOS3_DNODE: - value->iValue = here->MOS3dNode; - return(OK); - case MOS3_GNODE: - value->iValue = here->MOS3gNode; - return(OK); - case MOS3_SNODE: - value->iValue = here->MOS3sNode; - return(OK); - case MOS3_BNODE: - value->iValue = here->MOS3bNode; - return(OK); - case MOS3_DNODEPRIME: - value->iValue = here->MOS3dNodePrime; - return(OK); - case MOS3_SNODEPRIME: - value->iValue = here->MOS3sNodePrime; - return(OK); - case MOS3_SOURCECONDUCT: - value->rValue = here->MOS3sourceConductance; - return(OK); - case MOS3_DRAINCONDUCT: - value->rValue = here->MOS3drainConductance; - return(OK); - case MOS3_SOURCERESIST: - if (here->MOS3sNodePrime != here->MOS3sNode) - value->rValue = 1.0 / here->MOS3sourceConductance; - else - value->rValue = 0.0; - return(OK); - case MOS3_DRAINRESIST: - if (here->MOS3dNodePrime != here->MOS3dNode) - value->rValue = 1.0 / here->MOS3drainConductance; - else - value->rValue = 0.0; - return(OK); - case MOS3_VON: - value->rValue = here->MOS3von; - return(OK); - case MOS3_VDSAT: - value->rValue = here->MOS3vdsat; - return(OK); - case MOS3_SOURCEVCRIT: - value->rValue = here->MOS3sourceVcrit; - return(OK); - case MOS3_DRAINVCRIT: - value->rValue = here->MOS3drainVcrit; - return(OK); - case MOS3_CD: - value->rValue = here->MOS3cd; - return(OK); - case MOS3_CBS: - value->rValue = here->MOS3cbs; - return(OK); - case MOS3_CBD: - value->rValue = here->MOS3cbd; - return(OK); - case MOS3_GMBS: - value->rValue = here->MOS3gmbs; - return(OK); - case MOS3_GM: - value->rValue = here->MOS3gm; - return(OK); - case MOS3_GDS: - value->rValue = here->MOS3gds; - return(OK); - case MOS3_GBD: - value->rValue = here->MOS3gbd; - return(OK); - case MOS3_GBS: - value->rValue = here->MOS3gbs; - return(OK); - case MOS3_CAPBD: - value->rValue = here->MOS3capbd; - return(OK); - case MOS3_CAPBS: - value->rValue = here->MOS3capbs; - return(OK); - case MOS3_CAPZEROBIASBD: - value->rValue = here->MOS3Cbd; - return(OK); - case MOS3_CAPZEROBIASBDSW: - value->rValue = here->MOS3Cbdsw; - return(OK); - case MOS3_CAPZEROBIASBS: - value->rValue = here->MOS3Cbs; - return(OK); - case MOS3_CAPZEROBIASBSSW: - value->rValue = here->MOS3Cbssw; - return(OK); - case MOS3_VBD: - value->rValue = *(ckt->CKTstate0 + here->MOS3vbd); - return(OK); - case MOS3_VBS: - value->rValue = *(ckt->CKTstate0 + here->MOS3vbs); - return(OK); - case MOS3_VGS: - value->rValue = *(ckt->CKTstate0 + here->MOS3vgs); - return(OK); - case MOS3_VDS: - value->rValue = *(ckt->CKTstate0 + here->MOS3vds); - return(OK); - case MOS3_CAPGS: - value->rValue = 2* *(ckt->CKTstate0 + here->MOS3capgs); -/* add overlap capacitance */ - value->rValue += (MOS3modPtr(here)->MOS3gateSourceOverlapCapFactor) - * here->MOS3m - * (here->MOS3w - +MOS3modPtr(here)->MOS3widthAdjust - -2*(MOS3modPtr(here)->MOS3widthNarrow)); - return(OK); - case MOS3_QGS: - value->rValue = *(ckt->CKTstate0 + here->MOS3qgs); - return(OK); - case MOS3_CQGS: - value->rValue = *(ckt->CKTstate0 + here->MOS3cqgs); - return(OK); - case MOS3_CAPGD: - value->rValue = 2* *(ckt->CKTstate0 + here->MOS3capgd); -/* add overlap capacitance */ - value->rValue += (MOS3modPtr(here)->MOS3gateDrainOverlapCapFactor) - * here->MOS3m - * (here->MOS3w - +MOS3modPtr(here)->MOS3widthAdjust - -2*(MOS3modPtr(here)->MOS3widthNarrow)); - return(OK); - case MOS3_QGD: - value->rValue = *(ckt->CKTstate0 + here->MOS3qgd); - return(OK); - case MOS3_CQGD: - value->rValue = *(ckt->CKTstate0 + here->MOS3cqgd); - return(OK); - case MOS3_CAPGB: - value->rValue = 2* *(ckt->CKTstate0 + here->MOS3capgb); -/* add overlap capacitance */ - value->rValue += (MOS3modPtr(here)->MOS3gateBulkOverlapCapFactor) - * here->MOS3m - * (here->MOS3l - +MOS3modPtr(here)->MOS3lengthAdjust - -2*(MOS3modPtr(here)->MOS3latDiff)); - return(OK); - case MOS3_QGB: - value->rValue = *(ckt->CKTstate0 + here->MOS3qgb); - return(OK); - case MOS3_CQGB: - value->rValue = *(ckt->CKTstate0 + here->MOS3cqgb); - return(OK); - case MOS3_QBD: - value->rValue = *(ckt->CKTstate0 + here->MOS3qbd); - return(OK); - case MOS3_CQBD: - value->rValue = *(ckt->CKTstate0 + here->MOS3cqbd); - return(OK); - case MOS3_QBS: - value->rValue = *(ckt->CKTstate0 + here->MOS3qbs); - return(OK); - case MOS3_CQBS: - value->rValue = *(ckt->CKTstate0 + here->MOS3cqbs); - return(OK); - case MOS3_L_SENS_DC: - if(ckt->CKTsenInfo){ - value->rValue = *(ckt->CKTsenInfo->SEN_Sap[select->iValue + 1]+ - here->MOS3senParmNo); - } - return(OK); - case MOS3_L_SENS_REAL: - if(ckt->CKTsenInfo){ - value->rValue = *(ckt->CKTsenInfo->SEN_RHS[select->iValue + 1]+ - here->MOS3senParmNo); - } - return(OK); - case MOS3_L_SENS_IMAG: - if(ckt->CKTsenInfo){ - value->rValue = *(ckt->CKTsenInfo->SEN_iRHS[select->iValue + 1]+ - here->MOS3senParmNo); - } - return(OK); - case MOS3_L_SENS_MAG: - if(ckt->CKTsenInfo){ - vr = *(ckt->CKTrhsOld + select->iValue + 1); - vi = *(ckt->CKTirhsOld + select->iValue + 1); - vm = sqrt(vr*vr + vi*vi); - if(vm == 0){ - value->rValue = 0; - return(OK); - } - sr = *(ckt->CKTsenInfo->SEN_RHS[select->iValue + 1]+ - here->MOS3senParmNo); - si = *(ckt->CKTsenInfo->SEN_iRHS[select->iValue + 1]+ - here->MOS3senParmNo); - value->rValue = (vr * sr + vi * si)/vm; - } - return(OK); - case MOS3_L_SENS_PH: - if(ckt->CKTsenInfo){ - vr = *(ckt->CKTrhsOld + select->iValue + 1); - vi = *(ckt->CKTirhsOld + select->iValue + 1); - vm = vr*vr + vi*vi; - if(vm == 0){ - value->rValue = 0; - return(OK); - } - sr = *(ckt->CKTsenInfo->SEN_RHS[select->iValue + 1]+ - here->MOS3senParmNo); - si = *(ckt->CKTsenInfo->SEN_iRHS[select->iValue + 1]+ - here->MOS3senParmNo); - value->rValue = (vr * si - vi * sr)/vm; - } - return(OK); - case MOS3_L_SENS_CPLX: - if(ckt->CKTsenInfo){ - value->cValue.real= - *(ckt->CKTsenInfo->SEN_RHS[select->iValue + 1]+ - here->MOS3senParmNo); - value->cValue.imag= - *(ckt->CKTsenInfo->SEN_iRHS[select->iValue + 1]+ - here->MOS3senParmNo); - } - return(OK); - case MOS3_W_SENS_DC: - if(ckt->CKTsenInfo){ - value->rValue = *(ckt->CKTsenInfo->SEN_Sap[select->iValue + 1]+ - here->MOS3senParmNo + here->MOS3sens_l); - } - return(OK); - case MOS3_W_SENS_REAL: - if(ckt->CKTsenInfo){ - value->rValue = *(ckt->CKTsenInfo->SEN_RHS[select->iValue + 1]+ - here->MOS3senParmNo + here->MOS3sens_l); - } - return(OK); - case MOS3_W_SENS_IMAG: - if(ckt->CKTsenInfo){ - value->rValue = *(ckt->CKTsenInfo->SEN_iRHS[select->iValue + 1]+ - here->MOS3senParmNo + here->MOS3sens_l); - } - return(OK); - case MOS3_W_SENS_MAG: - if(ckt->CKTsenInfo){ - vr = *(ckt->CKTrhsOld + select->iValue + 1); - vi = *(ckt->CKTirhsOld + select->iValue + 1); - vm = sqrt(vr*vr + vi*vi); - if(vm == 0){ - value->rValue = 0; - return(OK); - } - sr = *(ckt->CKTsenInfo->SEN_RHS[select->iValue + 1]+ - here->MOS3senParmNo + here->MOS3sens_l); - si = *(ckt->CKTsenInfo->SEN_iRHS[select->iValue + 1]+ - here->MOS3senParmNo + here->MOS3sens_l); - value->rValue = (vr * sr + vi * si)/vm; - } - return(OK); - case MOS3_W_SENS_PH: - if(ckt->CKTsenInfo){ - vr = *(ckt->CKTrhsOld + select->iValue + 1); - vi = *(ckt->CKTirhsOld + select->iValue + 1); - vm = vr*vr + vi*vi; - if(vm == 0){ - value->rValue = 0; - return(OK); - } - sr = *(ckt->CKTsenInfo->SEN_RHS[select->iValue + 1]+ - here->MOS3senParmNo + here->MOS3sens_l); - si = *(ckt->CKTsenInfo->SEN_iRHS[select->iValue + 1]+ - here->MOS3senParmNo + here->MOS3sens_l); - value->rValue = (vr * si - vi * sr)/vm; - } - return(OK); - case MOS3_W_SENS_CPLX: - if(ckt->CKTsenInfo){ - value->cValue.real= - *(ckt->CKTsenInfo->SEN_RHS[select->iValue + 1]+ - here->MOS3senParmNo + here->MOS3sens_l); - value->cValue.imag= - *(ckt->CKTsenInfo->SEN_iRHS[select->iValue + 1]+ - here->MOS3senParmNo + here->MOS3sens_l); - } - return(OK); - case MOS3_CB : - if (ckt->CKTcurrentAnalysis & DOING_AC) { - errMsg = TMALLOC(char, strlen(msg) + 1); - errRtn = "MOS3ask.c"; - strcpy(errMsg,msg); - return(E_ASKCURRENT); - } else { - value->rValue = here->MOS3cbd + here->MOS3cbs - *(ckt->CKTstate0 - + here->MOS3cqgb); - } - return(OK); - case MOS3_CG : - if (ckt->CKTcurrentAnalysis & DOING_AC) { - errMsg = TMALLOC(char, strlen(msg) + 1); - errRtn = "MOS3ask.c"; - strcpy(errMsg,msg); - return(E_ASKCURRENT); - } else if (ckt->CKTcurrentAnalysis & (DOING_DCOP | DOING_TRCV)) { - value->rValue = 0; - } else if ((ckt->CKTcurrentAnalysis & DOING_TRAN) && - (ckt->CKTmode & MODETRANOP)) { - value->rValue = 0; - } else { - value->rValue = *(ckt->CKTstate0 + here->MOS3cqgb) + - *(ckt->CKTstate0 + here->MOS3cqgd) + *(ckt->CKTstate0 + - here->MOS3cqgs); - } - return(OK); - case MOS3_CS : - if (ckt->CKTcurrentAnalysis & DOING_AC) { - errMsg = TMALLOC(char, strlen(msg) + 1); - errRtn = "MOS3ask.c"; - strcpy(errMsg,msg); - return(E_ASKCURRENT); - } else { - value->rValue = -here->MOS3cd; - value->rValue -= here->MOS3cbd + here->MOS3cbs - - *(ckt->CKTstate0 + here->MOS3cqgb); - if ((ckt->CKTcurrentAnalysis & DOING_TRAN) && - !(ckt->CKTmode & MODETRANOP)) { - value->rValue -= *(ckt->CKTstate0 + here->MOS3cqgb) + - *(ckt->CKTstate0 + here->MOS3cqgd) + - *(ckt->CKTstate0 + here->MOS3cqgs); - } - } - return(OK); - case MOS3_POWER : - if (ckt->CKTcurrentAnalysis & DOING_AC) { - errMsg = TMALLOC(char, strlen(msg) + 1); - errRtn = "MOS3ask.c"; - strcpy(errMsg,msg); - return(E_ASKPOWER); - } else { - double temp; - - value->rValue = here->MOS3cd * - *(ckt->CKTrhsOld + here->MOS3dNode); - value->rValue += (here->MOS3cbd + here->MOS3cbs - - *(ckt->CKTstate0 + here->MOS3cqgb)) * - *(ckt->CKTrhsOld + here->MOS3bNode); - if ((ckt->CKTcurrentAnalysis & DOING_TRAN) && - !(ckt->CKTmode & MODETRANOP)) { - value->rValue += (*(ckt->CKTstate0 + here->MOS3cqgb) + - *(ckt->CKTstate0 + here->MOS3cqgd) + - *(ckt->CKTstate0 + here->MOS3cqgs)) * - *(ckt->CKTrhsOld + here->MOS3gNode); - } - temp = -here->MOS3cd; - temp -= here->MOS3cbd + here->MOS3cbs ; - if ((ckt->CKTcurrentAnalysis & DOING_TRAN) && - !(ckt->CKTmode & MODETRANOP)) { - temp -= *(ckt->CKTstate0 + here->MOS3cqgb) + - *(ckt->CKTstate0 + here->MOS3cqgd) + - *(ckt->CKTstate0 + here->MOS3cqgs); - } - value->rValue += temp * *(ckt->CKTrhsOld + here->MOS3sNode); - } - return(OK); - default: - return(E_BADPARM); - } - /* NOTREACHED */ -} - diff --git a/src/spicelib/devices/mos3/mos3conv.c b/src/spicelib/devices/mos3/mos3conv.c deleted file mode 100644 index a746bb581..000000000 --- a/src/spicelib/devices/mos3/mos3conv.c +++ /dev/null @@ -1,99 +0,0 @@ -/********** -Copyright 1990 Regents of the University of California. All rights reserved. -Author: 1985 Thomas L. Quarles -**********/ - -#include "ngspice/ngspice.h" -#include "ngspice/cktdefs.h" -#include "mos3defs.h" -#include "ngspice/sperror.h" -#include "ngspice/suffix.h" - -int -MOS3convTest(GENmodel *inModel, CKTcircuit *ckt) -{ - MOS3model *model = (MOS3model *)inModel; - MOS3instance *here; - double delvbs; - double delvbd; - double delvgs; - double delvds; - double delvgd; - double cbhat; - double cdhat; - double vbs; - double vbd; - double vgs; - double vds; - double vgd; - double vgdo; - double tol; - - for( ; model != NULL; model = MOS3nextModel(model)) { - for(here = MOS3instances(model); here!= NULL; - here = MOS3nextInstance(here)) { - - vbs = model->MOS3type * ( - *(ckt->CKTrhs+here->MOS3bNode) - - *(ckt->CKTrhs+here->MOS3sNodePrime)); - vgs = model->MOS3type * ( - *(ckt->CKTrhs+here->MOS3gNode) - - *(ckt->CKTrhs+here->MOS3sNodePrime)); - vds = model->MOS3type * ( - *(ckt->CKTrhs+here->MOS3dNodePrime) - - *(ckt->CKTrhs+here->MOS3sNodePrime)); - vbd=vbs-vds; - vgd=vgs-vds; - vgdo = *(ckt->CKTstate0 + here->MOS3vgs) - - *(ckt->CKTstate0 + here->MOS3vds); - delvbs = vbs - *(ckt->CKTstate0 + here->MOS3vbs); - delvbd = vbd - *(ckt->CKTstate0 + here->MOS3vbd); - delvgs = vgs - *(ckt->CKTstate0 + here->MOS3vgs); - delvds = vds - *(ckt->CKTstate0 + here->MOS3vds); - delvgd = vgd-vgdo; - - /* these are needed for convergence testing */ - - if (here->MOS3mode >= 0) { - cdhat= - here->MOS3cd- - here->MOS3gbd * delvbd + - here->MOS3gmbs * delvbs + - here->MOS3gm * delvgs + - here->MOS3gds * delvds ; - } else { - cdhat= - here->MOS3cd - - ( here->MOS3gbd - - here->MOS3gmbs) * delvbd - - here->MOS3gm * delvgd + - here->MOS3gds * delvds ; - } - cbhat= - here->MOS3cbs + - here->MOS3cbd + - here->MOS3gbd * delvbd + - here->MOS3gbs * delvbs ; - /* - * check convergence - */ - tol=ckt->CKTreltol*MAX(fabs(cdhat),fabs(here->MOS3cd))+ - ckt->CKTabstol; - if (fabs(cdhat-here->MOS3cd) >= tol) { - ckt->CKTnoncon++; - ckt->CKTtroubleElt = (GENinstance *) here; - return(OK); /* no reason to continue, we haven't converged */ - } else { - tol=ckt->CKTreltol* - MAX(fabs(cbhat),fabs(here->MOS3cbs+here->MOS3cbd)) - + ckt->CKTabstol; - if (fabs(cbhat-(here->MOS3cbs+here->MOS3cbd)) > tol) { - ckt->CKTnoncon++; - ckt->CKTtroubleElt = (GENinstance *) here; - return(OK); /* no reason to continue, we haven't converged*/ - } - } - } - } - return(OK); -} diff --git a/src/spicelib/devices/mos3/mos3defs.h b/src/spicelib/devices/mos3/mos3defs.h deleted file mode 100644 index 3f61aea80..000000000 --- a/src/spicelib/devices/mos3/mos3defs.h +++ /dev/null @@ -1,572 +0,0 @@ -/********** -Copyright 1990 Regents of the University of California. All rights reserved. -Author: 1985 Thomas L. Quarles -Modified: 2000 AlanFixes -**********/ - -#ifndef MOS3 -#define MOS3 - -#include "ngspice/ifsim.h" -#include "ngspice/cktdefs.h" -#include "ngspice/gendefs.h" -#include "ngspice/complex.h" -#include "ngspice/noisedef.h" - - /* declarations for level 3 MOSFETs */ - -/* indices to the array of MOSFET(3) noise sources */ - -enum { - MOS3RDNOIZ = 0, - MOS3RSNOIZ, - MOS3IDNOIZ, - MOS3FLNOIZ, - MOS3TOTNOIZ, - /* finally, the number of noise sources */ - MOS3NSRCS -}; - -/* information needed for each instance */ - -typedef struct sMOS3instance { - - struct GENinstance gen; - -#define MOS3modPtr(inst) ((struct sMOS3model *)((inst)->gen.GENmodPtr)) -#define MOS3nextInstance(inst) ((struct sMOS3instance *)((inst)->gen.GENnextInstance)) -#define MOS3name gen.GENname -#define MOS3states gen.GENstate - - const int MOS3dNode; /* number of the gate node of the mosfet */ - const int MOS3gNode; /* number of the gate node of the mosfet */ - const int MOS3sNode; /* number of the source node of the mosfet */ - const int MOS3bNode; /* number of the bulk node of the mosfet */ - int MOS3dNodePrime; /* number of the internal drain node of the mosfet */ - int MOS3sNodePrime; /* number of the internal source node of the mosfet */ - - double MOS3m; /* parallel device multiplier */ - double MOS3l; /* the length of the channel region */ - double MOS3w; /* the width of the channel region */ - double MOS3drainArea; /* the area of the drain diffusion */ - double MOS3sourceArea; /* the area of the source diffusion */ - double MOS3drainSquares; /* the length of the drain in squares */ - double MOS3sourceSquares; /* the length of the source in squares */ - double MOS3drainPerimiter; - double MOS3sourcePerimiter; - double MOS3sourceConductance; /*conductance of source(or 0):set in setup*/ - double MOS3drainConductance; /*conductance of drain(or 0):set in setup*/ - double MOS3temp; /* operating temperature of this instance */ - double MOS3dtemp; /* temperature difference for this instance */ - - double MOS3tTransconductance; /* temperature corrected transconductance*/ - double MOS3tSurfMob; /* temperature corrected surface mobility */ - double MOS3tPhi; /* temperature corrected Phi */ - double MOS3tVto; /* temperature corrected Vto */ - double MOS3tSatCur; /* temperature corrected saturation Cur. */ - double MOS3tSatCurDens; /* temperature corrected saturation Cur. density*/ - double MOS3tCbd; /* temperature corrected B-D Capacitance */ - double MOS3tCbs; /* temperature corrected B-S Capacitance */ - double MOS3tCj; /* temperature corrected Bulk bottom Capacitance */ - double MOS3tCjsw; /* temperature corrected Bulk side Capacitance */ - double MOS3tBulkPot; /* temperature corrected Bulk potential */ - double MOS3tDepCap; /* temperature adjusted transition point in */ - /* the cureve matching Fc * Vj */ - double MOS3tVbi; /* temperature adjusted Vbi */ - - double MOS3icVBS; /* initial condition B-S voltage */ - double MOS3icVDS; /* initial condition D-S voltage */ - double MOS3icVGS; /* initial condition G-S voltage */ - double MOS3von; - double MOS3vdsat; - double MOS3sourceVcrit; /* vcrit for pos. vds */ - double MOS3drainVcrit; /* vcrit for neg. vds */ - double MOS3cd; - double MOS3cbs; - double MOS3cbd; - double MOS3gmbs; - double MOS3gm; - double MOS3gds; - double MOS3gbd; - double MOS3gbs; - double MOS3capbd; - double MOS3capbs; - double MOS3Cbd; - double MOS3Cbdsw; - double MOS3Cbs; - double MOS3Cbssw; - double MOS3f2d; - double MOS3f3d; - double MOS3f4d; - double MOS3f2s; - double MOS3f3s; - double MOS3f4s; - int MOS3mode; /* device mode : 1 = normal, -1 = inverse */ - - - unsigned MOS3off :1;/* non-zero to indicate device is off for dc analysis*/ - unsigned MOS3tempGiven :1; /* instance temperature specified */ - unsigned MOS3dtempGiven :1; /* instance temperature difference specified */ - unsigned MOS3mGiven :1; - unsigned MOS3lGiven :1; - unsigned MOS3wGiven :1; - unsigned MOS3drainAreaGiven :1; - unsigned MOS3sourceAreaGiven :1; - unsigned MOS3drainSquaresGiven :1; - unsigned MOS3sourceSquaresGiven :1; - unsigned MOS3drainPerimiterGiven :1; - unsigned MOS3sourcePerimiterGiven :1; - unsigned MOS3dNodePrimeSet :1; - unsigned MOS3sNodePrimeSet :1; - unsigned MOS3icVBSGiven :1; - unsigned MOS3icVDSGiven :1; - unsigned MOS3icVGSGiven :1; - unsigned MOS3vonGiven :1; - unsigned MOS3vdsatGiven :1; - unsigned MOS3modeGiven :1; - - - double *MOS3DdPtr; /* pointer to sparse matrix element at - * (Drain node,drain node) */ - double *MOS3GgPtr; /* pointer to sparse matrix element at - * (gate node,gate node) */ - double *MOS3SsPtr; /* pointer to sparse matrix element at - * (source node,source node) */ - double *MOS3BbPtr; /* pointer to sparse matrix element at - * (bulk node,bulk node) */ - double *MOS3DPdpPtr; /* pointer to sparse matrix element at - * (drain prime node,drain prime node) */ - double *MOS3SPspPtr; /* pointer to sparse matrix element at - * (source prime node,source prime node) */ - double *MOS3DdpPtr; /* pointer to sparse matrix element at - * (drain node,drain prime node) */ - double *MOS3GbPtr; /* pointer to sparse matrix element at - * (gate node,bulk node) */ - double *MOS3GdpPtr; /* pointer to sparse matrix element at - * (gate node,drain prime node) */ - double *MOS3GspPtr; /* pointer to sparse matrix element at - * (gate node,source prime node) */ - double *MOS3SspPtr; /* pointer to sparse matrix element at - * (source node,source prime node) */ - double *MOS3BdpPtr; /* pointer to sparse matrix element at - * (bulk node,drain prime node) */ - double *MOS3BspPtr; /* pointer to sparse matrix element at - * (bulk node,source prime node) */ - double *MOS3DPspPtr; /* pointer to sparse matrix element at - * (drain prime node,source prime node) */ - double *MOS3DPdPtr; /* pointer to sparse matrix element at - * (drain prime node,drain node) */ - double *MOS3BgPtr; /* pointer to sparse matrix element at - * (bulk node,gate node) */ - double *MOS3DPgPtr; /* pointer to sparse matrix element at - * (drain prime node,gate node) */ - - double *MOS3SPgPtr; /* pointer to sparse matrix element at - * (source prime node,gate node) */ - double *MOS3SPsPtr; /* pointer to sparse matrix element at - * (source prime node,source node) */ - double *MOS3DPbPtr; /* pointer to sparse matrix element at - * (drain prime node,bulk node) */ - double *MOS3SPbPtr; /* pointer to sparse matrix element at - * (source prime node,bulk node) */ - double *MOS3SPdpPtr; /* pointer to sparse matrix element at - * (source prime node,drain prime node) */ - int MOS3senParmNo; /* parameter # for sensitivity use; - set equal to 0 if neither length - nor width of the mosfet is a design - parameter */ - unsigned MOS3sens_l :1; /* field which indicates whether - length of the mosfet is a design - parameter or not */ - unsigned MOS3sens_w :1; /* field which indicates whether - width of the mosfet is a design - parameter or not */ - unsigned MOS3senPertFlag :1; /* indictes whether the the parameter of - the particular instance is to be perturbed */ - double MOS3cgs; - double MOS3cgd; - double MOS3cgb; - double *MOS3sens; - -#define MOS3senGdpr MOS3sens -#define MOS3senGspr MOS3sens + 1 -#define MOS3senCgs MOS3sens + 2 /* contains pertured values of cgs */ -#define MOS3senCgd MOS3sens + 8 /* contains perturbed values of cgd*/ -#define MOS3senCgb MOS3sens + 14 /* contains perturbed values of cgb*/ -#define MOS3senCbd MOS3sens + 20 /* contains perturbed values of cbd*/ -#define MOS3senCbs MOS3sens + 26 /* contains perturbed values of cbs*/ -#define MOS3senGds MOS3sens + 32 /* contains perturbed values of gds*/ -#define MOS3senGbs MOS3sens + 38 /* contains perturbed values of gbs*/ -#define MOS3senGbd MOS3sens + 44 /* contains perturbed values of gbd*/ -#define MOS3senGm MOS3sens + 50 /* contains perturbed values of gm*/ -#define MOS3senGmbs MOS3sens + 56 /* contains perturbed values of gmbs*/ -#define MOS3dphigs_dl MOS3sens + 62 -#define MOS3dphigd_dl MOS3sens + 63 -#define MOS3dphigb_dl MOS3sens + 64 -#define MOS3dphibs_dl MOS3sens + 65 -#define MOS3dphibd_dl MOS3sens + 66 -#define MOS3dphigs_dw MOS3sens + 67 -#define MOS3dphigd_dw MOS3sens + 68 -#define MOS3dphigb_dw MOS3sens + 69 -#define MOS3dphibs_dw MOS3sens + 70 -#define MOS3dphibd_dw MOS3sens + 71 - - /* distortion stuff */ -/* - * naming convention: - * x = vgs - * y = vbs - * z = vds - * cdr = cdrain - */ - - -#define MOS3NDCOEFFS 30 - -#ifndef NODISTO - double MOS3dCoeffs[MOS3NDCOEFFS]; -#else /* NODISTO */ - double *MOS3dCoeffs; -#endif /* NODISTO */ - -#ifndef CONFIG - -#define capbs2 MOS3dCoeffs[0] -#define capbs3 MOS3dCoeffs[1] -#define capbd2 MOS3dCoeffs[2] -#define capbd3 MOS3dCoeffs[3] -#define gbs2 MOS3dCoeffs[4] -#define gbs3 MOS3dCoeffs[5] -#define gbd2 MOS3dCoeffs[6] -#define gbd3 MOS3dCoeffs[7] -#define capgb2 MOS3dCoeffs[8] -#define capgb3 MOS3dCoeffs[9] -#define cdr_x2 MOS3dCoeffs[10] -#define cdr_y2 MOS3dCoeffs[11] -#define cdr_z2 MOS3dCoeffs[12] -#define cdr_xy MOS3dCoeffs[13] -#define cdr_yz MOS3dCoeffs[14] -#define cdr_xz MOS3dCoeffs[15] -#define cdr_x3 MOS3dCoeffs[16] -#define cdr_y3 MOS3dCoeffs[17] -#define cdr_z3 MOS3dCoeffs[18] -#define cdr_x2z MOS3dCoeffs[19] -#define cdr_x2y MOS3dCoeffs[20] -#define cdr_y2z MOS3dCoeffs[21] -#define cdr_xy2 MOS3dCoeffs[22] -#define cdr_xz2 MOS3dCoeffs[23] -#define cdr_yz2 MOS3dCoeffs[24] -#define cdr_xyz MOS3dCoeffs[25] -#define capgs2 MOS3dCoeffs[26] -#define capgs3 MOS3dCoeffs[27] -#define capgd2 MOS3dCoeffs[28] -#define capgd3 MOS3dCoeffs[29] - -#endif - - /* end distortion coeffs. */ - -#ifndef NONOISE - double MOS3nVar[NSTATVARS][MOS3NSRCS]; -#else /* NONOISE */ - double **MOS3nVar; -#endif /* NONOISE */ - -} MOS3instance ; - -#define MOS3vbd MOS3states+ 0 -#define MOS3vbs MOS3states+ 1 -#define MOS3vgs MOS3states+ 2 -#define MOS3vds MOS3states+ 3 - -/* meyer capacitances */ -#define MOS3capgs MOS3states+ 4 /* gate-source capacitor value */ -#define MOS3qgs MOS3states+ 5 /* gate-source capacitor charge */ -#define MOS3cqgs MOS3states+ 6 /* gate-source capacitor current */ - -#define MOS3capgd MOS3states+ 7 /* gate-drain capacitor value */ -#define MOS3qgd MOS3states+ 8 /* gate-drain capacitor charge */ -#define MOS3cqgd MOS3states+ 9 /* gate-drain capacitor current */ - -#define MOS3capgb MOS3states+ 10/* gate-bulk capacitor value */ -#define MOS3qgb MOS3states+ 11 /* gate-bulk capacitor charge */ -#define MOS3cqgb MOS3states+ 12 /* gate-bulk capacitor current */ - -/* diode capacitances */ -#define MOS3qbd MOS3states+ 13 /* bulk-drain capacitor charge */ -#define MOS3cqbd MOS3states+ 14 /* bulk-drain capacitor current */ - -#define MOS3qbs MOS3states+ 15 /* bulk-source capacitor charge */ -#define MOS3cqbs MOS3states+ 16 /* bulk-source capacitor current */ - -#define MOS3NUMSTATES 17 - - -#define MOS3sensxpgs MOS3states+17 /* charge sensitivities and their derivatives - +18 for the derivatives - pointer to the - beginning of the array */ -#define MOS3sensxpgd MOS3states+19 -#define MOS3sensxpgb MOS3states+21 -#define MOS3sensxpbs MOS3states+23 -#define MOS3sensxpbd MOS3states+25 - -#define MOS3numSenStates 10 - - -/* per model data */ - - /* NOTE: parameters marked 'input - use xxxx' are paramters for - * which a temperature correction is applied in MOS3temp, thus - * the MOS3xxxx value in the per-instance structure should be used - * instead in all calculations - */ - -typedef struct sMOS3model { /* model structure for a resistor */ - - struct GENmodel gen; - -#define MOS3modType gen.GENmodType -#define MOS3nextModel(inst) ((struct sMOS3model *)((inst)->gen.GENnextModel)) -#define MOS3instances(inst) ((MOS3instance *)((inst)->gen.GENinstances)) -#define MOS3modName gen.GENmodName - - int MOS3type; /* device type : 1 = nmos, -1 = pmos */ - double MOS3tnom; /* temperature at which parameters measured */ - double MOS3latDiff; - double MOS3lengthAdjust; /* New parm: mask adjustment to length */ - double MOS3widthNarrow; /* New parm to reduce effective width */ - double MOS3widthAdjust; /* New parm: mask adjustment to width */ - double MOS3delvt0; /* New parm: adjustment calculated vtO */ - double MOS3jctSatCurDensity; /* input - use tSatCurDens*/ - double MOS3jctSatCur; /* input - use tSatCur instead */ - double MOS3drainResistance; - double MOS3sourceResistance; - double MOS3sheetResistance; - double MOS3transconductance; /* input - use tTransconductance */ - double MOS3gateSourceOverlapCapFactor; - double MOS3gateDrainOverlapCapFactor; - double MOS3gateBulkOverlapCapFactor; - double MOS3oxideCapFactor; - double MOS3vt0; /* input - use tVto */ - double MOS3capBD; /* input - use tCbs */ - double MOS3capBS; /* input - use tCbd */ - double MOS3bulkCapFactor; /* input - use tCj */ - double MOS3sideWallCapFactor; /* input - use tCjsw */ - double MOS3bulkJctPotential; /* input - use tBulkPot */ - double MOS3bulkJctBotGradingCoeff; - double MOS3bulkJctSideGradingCoeff; - double MOS3fwdCapDepCoeff; - double MOS3phi; /* input - use tPhi */ - double MOS3gamma; - double MOS3substrateDoping; - int MOS3gateType; - double MOS3surfaceStateDensity; - double MOS3oxideThickness; - double MOS3surfaceMobility; /* input - use tSurfMob */ - double MOS3eta; - double MOS3junctionDepth; - double MOS3coeffDepLayWidth; /* xd */ - double MOS3narrowFactor; /* delta */ - double MOS3delta; /* input delta */ - double MOS3fastSurfaceStateDensity; /* nfs */ - double MOS3theta; /* theta */ - double MOS3maxDriftVel; /* vmax */ - double MOS3alpha; /* alpha */ - double MOS3kappa; /* kappa */ - double MOS3fNcoef; - double MOS3fNexp; - - unsigned MOS3typeGiven :1; - unsigned MOS3latDiffGiven :1; - unsigned MOS3lengthAdjustGiven :1; - unsigned MOS3widthNarrowGiven :1; - unsigned MOS3widthAdjustGiven :1; - unsigned MOS3delvt0Given :1; - unsigned MOS3jctSatCurDensityGiven :1; - unsigned MOS3jctSatCurGiven :1; - unsigned MOS3drainResistanceGiven :1; - unsigned MOS3sourceResistanceGiven :1; - unsigned MOS3sheetResistanceGiven :1; - unsigned MOS3transconductanceGiven :1; - unsigned MOS3gateSourceOverlapCapFactorGiven :1; - unsigned MOS3gateDrainOverlapCapFactorGiven :1; - unsigned MOS3gateBulkOverlapCapFactorGiven :1; - unsigned MOS3vt0Given :1; - unsigned MOS3capBDGiven :1; - unsigned MOS3capBSGiven :1; - unsigned MOS3bulkCapFactorGiven :1; - unsigned MOS3sideWallCapFactorGiven :1; - unsigned MOS3bulkJctPotentialGiven :1; - unsigned MOS3bulkJctBotGradingCoeffGiven :1; - unsigned MOS3bulkJctSideGradingCoeffGiven :1; - unsigned MOS3fwdCapDepCoeffGiven :1; - unsigned MOS3phiGiven :1; - unsigned MOS3gammaGiven :1; - unsigned MOS3substrateDopingGiven :1; - unsigned MOS3gateTypeGiven :1; - unsigned MOS3surfaceStateDensityGiven :1; - unsigned MOS3oxideThicknessGiven :1; - unsigned MOS3surfaceMobilityGiven :1; - unsigned MOS3etaGiven :1; - unsigned MOS3junctionDepthGiven :1; - unsigned MOS3deltaGiven :1; /* delta */ - unsigned MOS3fastSurfaceStateDensityGiven :1; /* nfs */ - unsigned MOS3thetaGiven :1; /* theta */ - unsigned MOS3maxDriftVelGiven :1; /* vmax */ - unsigned MOS3kappaGiven :1; /* kappa */ - unsigned MOS3tnomGiven :1; /* Tnom was given? */ - unsigned MOS3fNcoefGiven :1; - unsigned MOS3fNexpGiven :1; - -} MOS3model; - -#ifndef NMOS -#define NMOS 1 -#define PMOS -1 -#endif /*NMOS*/ - -/* device parameters */ -enum { - MOS3_W = 1, - MOS3_L, - MOS3_AS, - MOS3_AD, - MOS3_PS, - MOS3_PD, - MOS3_NRS, - MOS3_NRD, - MOS3_OFF, - MOS3_IC, - MOS3_IC_VBS, - MOS3_IC_VDS, - MOS3_IC_VGS, - MOS3_W_SENS, - MOS3_L_SENS, - MOS3_CB, - MOS3_CG, - MOS3_CS, - MOS3_POWER, - MOS3_CGS, - MOS3_CGD, - MOS3_DNODE, - MOS3_GNODE, - MOS3_SNODE, - MOS3_BNODE, - MOS3_DNODEPRIME, - MOS3_SNODEPRIME, - MOS3_SOURCECONDUCT, - MOS3_DRAINCONDUCT, - MOS3_VON, - MOS3_VDSAT, - MOS3_SOURCEVCRIT, - MOS3_DRAINVCRIT, - MOS3_CD, - MOS3_CBS, - MOS3_CBD, - MOS3_GMBS, - MOS3_GM, - MOS3_GDS, - MOS3_GBD, - MOS3_GBS, - MOS3_CAPBD, - MOS3_CAPBS, - MOS3_CAPZEROBIASBD, - MOS3_CAPZEROBIASBDSW, - MOS3_CAPZEROBIASBS, - MOS3_CAPZEROBIASBSSW, - MOS3_VBD, - MOS3_VBS, - MOS3_VGS, - MOS3_VDS, - MOS3_CAPGS, - MOS3_QGS, - MOS3_CQGS, - MOS3_CAPGD, - MOS3_QGD, - MOS3_CQGD, - MOS3_CAPGB, - MOS3_QGB, - MOS3_CQGB, - MOS3_QBD, - MOS3_CQBD, - MOS3_QBS, - MOS3_CQBS, - MOS3_W_SENS_REAL, - MOS3_W_SENS_IMAG, - MOS3_W_SENS_MAG, - MOS3_W_SENS_PH, - MOS3_W_SENS_CPLX, - MOS3_L_SENS_REAL, - MOS3_L_SENS_IMAG, - MOS3_L_SENS_MAG, - MOS3_L_SENS_PH, - MOS3_L_SENS_CPLX, - MOS3_W_SENS_DC, - MOS3_L_SENS_DC, - MOS3_TEMP, - MOS3_SOURCERESIST, - MOS3_DRAINRESIST, - MOS3_M, - MOS3_DTEMP, -}; - -/* model parameters */ -enum { - MOS3_MOD_VTO = 101, - MOS3_MOD_KP, - MOS3_MOD_GAMMA, - MOS3_MOD_PHI, - MOS3_MOD_RD, - MOS3_MOD_RS, - MOS3_MOD_CBD, - MOS3_MOD_CBS, - MOS3_MOD_IS, - MOS3_MOD_PB, - MOS3_MOD_CGSO, - MOS3_MOD_CGDO, - MOS3_MOD_CGBO, - MOS3_MOD_RSH, - MOS3_MOD_CJ, - MOS3_MOD_MJ, - MOS3_MOD_CJSW, - MOS3_MOD_MJSW, - MOS3_MOD_JS, - MOS3_MOD_TOX, - MOS3_MOD_LD, - MOS3_MOD_U0, - MOS3_MOD_FC, - MOS3_MOD_NSUB, - MOS3_MOD_TPG, - MOS3_MOD_NSS, - MOS3_MOD_ETA, - MOS3_MOD_DELTA, - MOS3_MOD_NFS, - MOS3_MOD_THETA, - MOS3_MOD_VMAX, - MOS3_MOD_KAPPA, - MOS3_MOD_NMOS, - MOS3_MOD_PMOS, - MOS3_MOD_XJ, - MOS3_MOD_UEXP, - MOS3_MOD_NEFF, - MOS3_MOD_XD, - MOS3_MOD_ALPHA, - MOS3_DELTA, - MOS3_MOD_TNOM, - MOS3_MOD_KF, - MOS3_MOD_AF, - MOS3_MOD_TYPE, - MOS3_MOD_XL, - MOS3_MOD_WD, - MOS3_MOD_XW, - MOS3_MOD_DELVTO, -}; - -/* device questions */ - - -/* model questions */ - -#include "mos3ext.h" - -#endif /*MOS3*/ diff --git a/src/spicelib/devices/mos3/mos3del.c b/src/spicelib/devices/mos3/mos3del.c deleted file mode 100644 index e1fa9e76c..000000000 --- a/src/spicelib/devices/mos3/mos3del.c +++ /dev/null @@ -1,18 +0,0 @@ -/********** -Copyright 1990 Regents of the University of California. All rights reserved. -Author: 1985 Thomas L. Quarles -**********/ - -#include "ngspice/ngspice.h" -#include "mos3defs.h" -#include "ngspice/sperror.h" -#include "ngspice/suffix.h" - - -int -MOS3delete(GENinstance *gen_inst) -{ - MOS3instance *inst = (MOS3instance *) gen_inst; - FREE(inst->MOS3sens); - return OK; -} diff --git a/src/spicelib/devices/mos3/mos3dist.c b/src/spicelib/devices/mos3/mos3dist.c deleted file mode 100644 index 25fa52b76..000000000 --- a/src/spicelib/devices/mos3/mos3dist.c +++ /dev/null @@ -1,1378 +0,0 @@ -/********** -Copyright 1990 Regents of the University of California. All rights reserved. -Author: 1988 Jaijeet S Roychowdhury -**********/ - -#include "ngspice/ngspice.h" -#include "ngspice/cktdefs.h" -#include "mos3defs.h" -#include "ngspice/sperror.h" -#include "ngspice/distodef.h" -#include "ngspice/suffix.h" - -int -MOS3disto(int mode, GENmodel *genmodel, CKTcircuit *ckt) -/* assuming here that ckt->CKTomega has been initialised to - * the correct value - */ -{ - MOS3model *model = (MOS3model *) genmodel; - DISTOAN* job = (DISTOAN*) ckt->CKTcurJob; - DpassStr pass; - double r1h1x,i1h1x; - double r1h1y,i1h1y; - double r1h1z, i1h1z; - double r1h2x, i1h2x; - double r1h2y, i1h2y; - double r1h2z, i1h2z; - double r1hm2x,i1hm2x; - double r1hm2y,i1hm2y; - double r1hm2z, i1hm2z; - double r2h11x,i2h11x; - double r2h11y,i2h11y; - double r2h11z, i2h11z; - double r2h1m2x,i2h1m2x; - double r2h1m2y,i2h1m2y; - double r2h1m2z, i2h1m2z; - double temp, itemp; - MOS3instance *here; - -if (mode == D_SETUP) - return(MOS3dSetup(genmodel,ckt)); - -if ((mode == D_TWOF1) || (mode == D_THRF1) || - (mode == D_F1PF2) || (mode == D_F1MF2) || - (mode == D_2F1MF2)) { - - /* loop through all the MOS3 models */ -for( ; model != NULL; model = MOS3nextModel(model)) { - - /* loop through all the instances of the model */ - for (here = MOS3instances(model); here != NULL ; - here=MOS3nextInstance(here)) { - - /* loading starts here */ - - switch (mode) { - case D_TWOF1: - /* x = vgs, y = vbs z = vds */ - - /* getting first order (linear) Volterra kernel */ - r1h1x = *(job->r1H1ptr + (here->MOS3gNode)) - - *(job->r1H1ptr + (here->MOS3sNodePrime)); - i1h1x = *(job->i1H1ptr + (here->MOS3gNode)) - - *(job->i1H1ptr + (here->MOS3sNodePrime)); - - r1h1y = *(job->r1H1ptr + (here->MOS3bNode)) - - *(job->r1H1ptr + (here->MOS3sNodePrime)); - i1h1y = *(job->i1H1ptr + (here->MOS3bNode)) - - *(job->i1H1ptr + (here->MOS3sNodePrime)); - - r1h1z = *(job->r1H1ptr + (here->MOS3dNodePrime)) - - *(job->r1H1ptr + (here->MOS3sNodePrime)); - i1h1z = *(job->i1H1ptr + (here->MOS3dNodePrime)) - - *(job->i1H1ptr + (here->MOS3sNodePrime)); - - /* loading starts here */ - /* loading cdrain term */ - - temp = DFn2F1(here->cdr_x2, - here->cdr_y2, - here->cdr_z2, - here->cdr_xy, - here->cdr_yz, - here->cdr_xz, - r1h1x, - i1h1x, - r1h1y, - i1h1y, - r1h1z, - i1h1z); - - itemp = DFi2F1(here->cdr_x2, - here->cdr_y2, - here->cdr_z2, - here->cdr_xy, - here->cdr_yz, - here->cdr_xz, - r1h1x, - i1h1x, - r1h1y, - i1h1y, - r1h1z, - i1h1z); - - *(ckt->CKTrhs + (here->MOS3dNodePrime)) -= temp; - *(ckt->CKTirhs + (here->MOS3dNodePrime)) -= itemp; - *(ckt->CKTrhs + (here->MOS3sNodePrime)) += temp; - *(ckt->CKTirhs + (here->MOS3sNodePrime)) += itemp; - - /* cdrain term over */ - - /* loading gbs term */ - - temp = D1n2F1(here->gbs2, - r1h1y, - i1h1y); - - itemp = D1i2F1(here->gbs2, - r1h1y, - i1h1y); - - - *(ckt->CKTrhs + (here->MOS3bNode)) -= temp; - *(ckt->CKTirhs + (here->MOS3bNode)) -= itemp; - *(ckt->CKTrhs + (here->MOS3sNodePrime)) += temp; - *(ckt->CKTirhs + (here->MOS3sNodePrime)) += itemp; - - /* gbs over */ - - /* loading gbd term */ - - temp = D1n2F1(here->gbd2, - r1h1y - r1h1z, - i1h1y - i1h1z); - - itemp = D1i2F1(here->gbd2, - r1h1y - r1h1z, - i1h1y - i1h1z); - - - *(ckt->CKTrhs + (here->MOS3bNode)) -= temp; - *(ckt->CKTirhs + (here->MOS3bNode)) -= itemp; - *(ckt->CKTrhs + (here->MOS3dNodePrime)) += temp; - *(ckt->CKTirhs + (here->MOS3dNodePrime)) += itemp; - - /* gbd over */ - - /* loading capgs term */ - - temp = -ckt->CKTomega * - D1i2F1(here->capgs2, - r1h1x, - i1h1x); - - itemp = ckt->CKTomega * - D1n2F1(here->capgs2, - r1h1x, - i1h1x); - - *(ckt->CKTrhs + (here->MOS3gNode)) -= temp; - *(ckt->CKTirhs + (here->MOS3gNode)) -= itemp; - *(ckt->CKTrhs + (here->MOS3sNodePrime)) += temp; - *(ckt->CKTirhs + (here->MOS3sNodePrime)) += itemp; - - /* capgs over */ - - /* loading capgd term */ - - temp = -ckt->CKTomega * - D1i2F1(here->capgd2, - r1h1x - r1h1z, - i1h1x - i1h1z); - - itemp = ckt->CKTomega * - D1n2F1(here->capgd2, - r1h1x - r1h1z, - i1h1x - i1h1z); - - - *(ckt->CKTrhs + (here->MOS3gNode)) -= temp; - *(ckt->CKTirhs + (here->MOS3gNode)) -= itemp; - *(ckt->CKTrhs + (here->MOS3dNodePrime)) += temp; - *(ckt->CKTirhs + (here->MOS3dNodePrime)) += itemp; - - /* capgd over */ - /* loading capgb term */ - - temp = -ckt->CKTomega * - D1i2F1(here->capgb2, - r1h1x - r1h1y, - i1h1x - i1h1y); - - itemp = ckt->CKTomega * - D1n2F1(here->capgb2, - r1h1x - r1h1y, - i1h1x - i1h1y); - - *(ckt->CKTrhs + (here->MOS3gNode)) -= temp; - *(ckt->CKTirhs + (here->MOS3gNode)) -= itemp; - *(ckt->CKTrhs + (here->MOS3bNode)) += temp; - *(ckt->CKTirhs + (here->MOS3bNode)) += itemp; - - /* capgb over */ - - /* loading capbs term */ - - temp = -ckt->CKTomega * - D1i2F1(here->capbs2, - r1h1y, - i1h1y); - - itemp = ckt->CKTomega * - D1n2F1(here->capbs2, - r1h1y, - i1h1y); - - - *(ckt->CKTrhs + (here->MOS3bNode)) -= temp; - *(ckt->CKTirhs + (here->MOS3bNode)) -= itemp; - *(ckt->CKTrhs + (here->MOS3sNodePrime)) += temp; - *(ckt->CKTirhs + (here->MOS3sNodePrime)) += itemp; - - /* capbs over */ - - /* loading capbd term */ - - temp = -ckt->CKTomega * - D1i2F1(here->capbd2, - r1h1y - r1h1z, - i1h1y - i1h1z); - - itemp = ckt->CKTomega * - D1n2F1(here->capbd2, - r1h1y - r1h1z, - i1h1y - i1h1z); - - - *(ckt->CKTrhs + (here->MOS3bNode)) -= temp; - *(ckt->CKTirhs + (here->MOS3bNode)) -= itemp; - *(ckt->CKTrhs + (here->MOS3dNodePrime)) += temp; - *(ckt->CKTirhs + (here->MOS3dNodePrime)) += itemp; - - /* capbd over */ - /* all done */ - - break; - - case D_THRF1: - /* x = vgs, y = vbs z = vds */ - - /* getting first order (linear) Volterra kernel */ - r1h1x = *(job->r1H1ptr + (here->MOS3gNode)) - - *(job->r1H1ptr + (here->MOS3sNodePrime)); - i1h1x = *(job->i1H1ptr + (here->MOS3gNode)) - - *(job->i1H1ptr + (here->MOS3sNodePrime)); - - r1h1y = *(job->r1H1ptr + (here->MOS3bNode)) - - *(job->r1H1ptr + (here->MOS3sNodePrime)); - i1h1y = *(job->i1H1ptr + (here->MOS3bNode)) - - *(job->i1H1ptr + (here->MOS3sNodePrime)); - - r1h1z = *(job->r1H1ptr + (here->MOS3dNodePrime)) - - *(job->r1H1ptr + (here->MOS3sNodePrime)); - i1h1z = *(job->i1H1ptr + (here->MOS3dNodePrime)) - - *(job->i1H1ptr + (here->MOS3sNodePrime)); - - r2h11x = *(job->r2H11ptr + (here->MOS3gNode)) - - *(job->r2H11ptr + (here->MOS3sNodePrime)); - i2h11x = *(job->i2H11ptr + (here->MOS3gNode)) - - *(job->i2H11ptr + (here->MOS3sNodePrime)); - - r2h11y = *(job->r2H11ptr + (here->MOS3bNode)) - - *(job->r2H11ptr + (here->MOS3sNodePrime)); - i2h11y = *(job->i2H11ptr + (here->MOS3bNode)) - - *(job->i2H11ptr + (here->MOS3sNodePrime)); - - r2h11z = *(job->r2H11ptr + (here->MOS3dNodePrime)) - - *(job->r2H11ptr + (here->MOS3sNodePrime)); - i2h11z = *(job->i2H11ptr + (here->MOS3dNodePrime)) - - *(job->i2H11ptr + (here->MOS3sNodePrime)); - /* loading starts here */ - /* loading cdrain term */ - - temp = DFn3F1(here->cdr_x2, - here->cdr_y2, - here->cdr_z2, - here->cdr_xy, - here->cdr_yz, - here->cdr_xz, - here->cdr_x3, - here->cdr_y3, - here->cdr_z3, - here->cdr_x2y, - here->cdr_x2z, - here->cdr_xy2, - here->cdr_y2z, - here->cdr_xz2, - here->cdr_yz2, - here->cdr_xyz, - r1h1x, - i1h1x, - r1h1y, - i1h1y, - r1h1z, - i1h1z, - r2h11x, - i2h11x, - r2h11y, - i2h11y, - r2h11z, - i2h11z); - itemp = DFi3F1(here->cdr_x2, - here->cdr_y2, - here->cdr_z2, - here->cdr_xy, - here->cdr_yz, - here->cdr_xz, - here->cdr_x3, - here->cdr_y3, - here->cdr_z3, - here->cdr_x2y, - here->cdr_x2z, - here->cdr_xy2, - here->cdr_y2z, - here->cdr_xz2, - here->cdr_yz2, - here->cdr_xyz, - r1h1x, - i1h1x, - r1h1y, - i1h1y, - r1h1z, - i1h1z, - r2h11x, - i2h11x, - r2h11y, - i2h11y, - r2h11z, - i2h11z); - - - *(ckt->CKTrhs + (here->MOS3dNodePrime)) -= temp; - *(ckt->CKTirhs + (here->MOS3dNodePrime)) -= itemp; - *(ckt->CKTrhs + (here->MOS3sNodePrime)) += temp; - *(ckt->CKTirhs + (here->MOS3sNodePrime)) += itemp; - - /* cdrain term over */ - - /* loading gbs term */ - - temp = D1n3F1(here->gbs2, - here->gbs3, - r1h1y, - i1h1y, - r2h11y, - i2h11y); - - - itemp = D1i3F1(here->gbs2, - here->gbs3, - r1h1y, - i1h1y, - r2h11y, - i2h11y); - - - *(ckt->CKTrhs + (here->MOS3bNode)) -= temp; - *(ckt->CKTirhs + (here->MOS3bNode)) -= itemp; - *(ckt->CKTrhs + (here->MOS3sNodePrime)) += temp; - *(ckt->CKTirhs + (here->MOS3sNodePrime)) += itemp; - - /* gbs over */ - - /* loading gbd term */ - - temp = D1n3F1(here->gbd2, - here->gbd3, - r1h1y - r1h1z, - i1h1y - i1h1z, - r2h11y - r2h11z, - i2h11y - i2h11z); - - itemp = D1i3F1(here->gbd2, - here->gbd3, - r1h1y - r1h1z, - i1h1y - i1h1z, - r2h11y - r2h11z, - i2h11y - i2h11z); - - *(ckt->CKTrhs + (here->MOS3bNode)) -= temp; - *(ckt->CKTirhs + (here->MOS3bNode)) -= itemp; - *(ckt->CKTrhs + (here->MOS3dNodePrime)) += temp; - *(ckt->CKTirhs + (here->MOS3dNodePrime)) += itemp; - - /* gbd over */ - - /* loading capgs term */ - - temp = -ckt->CKTomega * - D1i3F1(here->capgs2, - here->capgs3, - r1h1x, - i1h1x, - r2h11x, - i2h11x); - - itemp = ckt->CKTomega * - D1n3F1(here->capgs2, - here->capgs3, - r1h1x, - i1h1x, - r2h11x, - i2h11x); - - *(ckt->CKTrhs + (here->MOS3gNode)) -= temp; - *(ckt->CKTirhs + (here->MOS3gNode)) -= itemp; - *(ckt->CKTrhs + (here->MOS3sNodePrime)) += temp; - *(ckt->CKTirhs + (here->MOS3sNodePrime)) += itemp; - - /* capgs over */ - - /* loading capgd term */ - - temp = -ckt->CKTomega * - D1i3F1(here->capgd2, - here->capgd3, - r1h1x - r1h1z, - i1h1x - i1h1z, - r2h11x - r2h11z, - i2h11x - i2h11z); - - itemp = ckt->CKTomega * - D1n3F1(here->capgd2, - here->capgd3, - r1h1x - r1h1z, - i1h1x - i1h1z, - r2h11x - r2h11z, - i2h11x - i2h11z); - - - *(ckt->CKTrhs + (here->MOS3gNode)) -= temp; - *(ckt->CKTirhs + (here->MOS3gNode)) -= itemp; - *(ckt->CKTrhs + (here->MOS3dNodePrime)) += temp; - *(ckt->CKTirhs + (here->MOS3dNodePrime)) += itemp; - - /* capgd over */ - /* loading capgb term */ - - temp = -ckt->CKTomega * - D1i3F1(here->capgb2, - here->capgb3, - r1h1x - r1h1y, - i1h1x - i1h1y, - r2h11x - r2h11y, - i2h11x - i2h11y); - - itemp = ckt->CKTomega * - D1n3F1(here->capgb2, - here->capgb3, - r1h1x - r1h1y, - i1h1x - i1h1y, - r2h11x - r2h11y, - i2h11x - i2h11y); - - *(ckt->CKTrhs + (here->MOS3gNode)) -= temp; - *(ckt->CKTirhs + (here->MOS3gNode)) -= itemp; - *(ckt->CKTrhs + (here->MOS3bNode)) += temp; - *(ckt->CKTirhs + (here->MOS3bNode)) += itemp; - - /* capgb over */ - - /* loading capbs term */ - - temp = -ckt->CKTomega * - D1i3F1(here->capbs2, - here->capbs3, - r1h1y, - i1h1y, - r2h11y, - i2h11y); - - itemp = ckt->CKTomega * - D1n3F1(here->capbs2, - here->capbs3, - r1h1y, - i1h1y, - r2h11y, - i2h11y); - - - *(ckt->CKTrhs + (here->MOS3bNode)) -= temp; - *(ckt->CKTirhs + (here->MOS3bNode)) -= itemp; - *(ckt->CKTrhs + (here->MOS3sNodePrime)) += temp; - *(ckt->CKTirhs + (here->MOS3sNodePrime)) += itemp; - - /* capbs over */ - - /* loading capbd term */ - - temp = -ckt->CKTomega * - D1i3F1(here->capbd2, - here->capbd3, - r1h1y - r1h1z, - i1h1y - i1h1z, - r2h11y - r2h11z, - i2h11y - i2h11z); - - itemp = ckt->CKTomega * - D1n3F1(here->capbd2, - here->capbd3, - r1h1y - r1h1z, - i1h1y - i1h1z, - r2h11y - r2h11z, - i2h11y - i2h11z); - - - *(ckt->CKTrhs + (here->MOS3bNode)) -= temp; - *(ckt->CKTirhs + (here->MOS3bNode)) -= itemp; - *(ckt->CKTrhs + (here->MOS3dNodePrime)) += temp; - *(ckt->CKTirhs + (here->MOS3dNodePrime)) += itemp; - - /* capbd over */ - /* all done */ - - break; - case D_F1PF2: - /* x = vgs, y = vbs z = vds */ - - /* getting first order (linear) Volterra kernel */ - r1h1x = *(job->r1H1ptr + (here->MOS3gNode)) - - *(job->r1H1ptr + (here->MOS3sNodePrime)); - i1h1x = *(job->i1H1ptr + (here->MOS3gNode)) - - *(job->i1H1ptr + (here->MOS3sNodePrime)); - - r1h1y = *(job->r1H1ptr + (here->MOS3bNode)) - - *(job->r1H1ptr + (here->MOS3sNodePrime)); - i1h1y = *(job->i1H1ptr + (here->MOS3bNode)) - - *(job->i1H1ptr + (here->MOS3sNodePrime)); - - r1h1z = *(job->r1H1ptr + (here->MOS3dNodePrime)) - - *(job->r1H1ptr + (here->MOS3sNodePrime)); - i1h1z = *(job->i1H1ptr + (here->MOS3dNodePrime)) - - *(job->i1H1ptr + (here->MOS3sNodePrime)); - - r1h2x = *(job->r1H2ptr + (here->MOS3gNode)) - - *(job->r1H2ptr + (here->MOS3sNodePrime)); - i1h2x = *(job->i1H2ptr + (here->MOS3gNode)) - - *(job->i1H2ptr + (here->MOS3sNodePrime)); - - r1h2y = *(job->r1H2ptr + (here->MOS3bNode)) - - *(job->r1H2ptr + (here->MOS3sNodePrime)); - i1h2y = *(job->i1H2ptr + (here->MOS3bNode)) - - *(job->i1H2ptr + (here->MOS3sNodePrime)); - - r1h2z = *(job->r1H2ptr + (here->MOS3dNodePrime)) - - *(job->r1H2ptr + (here->MOS3sNodePrime)); - i1h2z = *(job->i1H2ptr + (here->MOS3dNodePrime)) - - *(job->i1H2ptr + (here->MOS3sNodePrime)); - - /* loading starts here */ - /* loading cdrain term */ - - temp = DFnF12(here->cdr_x2, - here->cdr_y2, - here->cdr_z2, - here->cdr_xy, - here->cdr_yz, - here->cdr_xz, - r1h1x, - i1h1x, - r1h1y, - i1h1y, - r1h1z, - i1h1z, - r1h2x, - i1h2x, - r1h2y, - i1h2y, - r1h2z, - i1h2z); - - itemp = DFiF12(here->cdr_x2, - here->cdr_y2, - here->cdr_z2, - here->cdr_xy, - here->cdr_yz, - here->cdr_xz, - r1h1x, - i1h1x, - r1h1y, - i1h1y, - r1h1z, - i1h1z, - r1h2x, - i1h2x, - r1h2y, - i1h2y, - r1h2z, - i1h2z); - - *(ckt->CKTrhs + (here->MOS3dNodePrime)) -= temp; - *(ckt->CKTirhs + (here->MOS3dNodePrime)) -= itemp; - *(ckt->CKTrhs + (here->MOS3sNodePrime)) += temp; - *(ckt->CKTirhs + (here->MOS3sNodePrime)) += itemp; - - /* cdrain term over */ - - /* loading gbs term */ - - temp = D1nF12(here->gbs2, - r1h1y, - i1h1y, - r1h2y, - i1h2y); - - itemp = D1iF12(here->gbs2, - r1h1y, - i1h1y, - r1h2y, - i1h2y); - - - *(ckt->CKTrhs + (here->MOS3bNode)) -= temp; - *(ckt->CKTirhs + (here->MOS3bNode)) -= itemp; - *(ckt->CKTrhs + (here->MOS3sNodePrime)) += temp; - *(ckt->CKTirhs + (here->MOS3sNodePrime)) += itemp; - - /* gbs over */ - - /* loading gbd term */ - - temp = D1nF12(here->gbd2, - r1h1y - r1h1z, - i1h1y - i1h1z, - r1h2y - r1h2z, - i1h2y - i1h2z); - - itemp = D1iF12(here->gbd2, - r1h1y - r1h1z, - i1h1y - i1h1z, - r1h2y - r1h2z, - i1h2y - i1h2z); - - - *(ckt->CKTrhs + (here->MOS3bNode)) -= temp; - *(ckt->CKTirhs + (here->MOS3bNode)) -= itemp; - *(ckt->CKTrhs + (here->MOS3dNodePrime)) += temp; - *(ckt->CKTirhs + (here->MOS3dNodePrime)) += itemp; - - /* gbd over */ - - /* loading capgs term */ - - temp = -ckt->CKTomega * - D1iF12(here->capgs2, - r1h1x, - i1h1x, - r1h2x, - i1h2x); - - itemp = ckt->CKTomega * - D1nF12(here->capgs2, - r1h1x, - i1h1x, - r1h2x, - i1h2x); - - *(ckt->CKTrhs + (here->MOS3gNode)) -= temp; - *(ckt->CKTirhs + (here->MOS3gNode)) -= itemp; - *(ckt->CKTrhs + (here->MOS3sNodePrime)) += temp; - *(ckt->CKTirhs + (here->MOS3sNodePrime)) += itemp; - - /* capgs over */ - - /* loading capgd term */ - - temp = -ckt->CKTomega * - D1iF12(here->capgd2, - r1h1x - r1h1z, - i1h1x - i1h1z, - r1h2x - r1h2z, - i1h2x - i1h2z); - - itemp = ckt->CKTomega * - D1nF12(here->capgd2, - r1h1x - r1h1z, - i1h1x - i1h1z, - r1h2x - r1h2z, - i1h2x - i1h2z); - - - *(ckt->CKTrhs + (here->MOS3gNode)) -= temp; - *(ckt->CKTirhs + (here->MOS3gNode)) -= itemp; - *(ckt->CKTrhs + (here->MOS3dNodePrime)) += temp; - *(ckt->CKTirhs + (here->MOS3dNodePrime)) += itemp; - - /* capgd over */ - /* loading capgb term */ - - temp = -ckt->CKTomega * - D1iF12(here->capgb2, - r1h1x - r1h1y, - i1h1x - i1h1y, - r1h2x - r1h2y, - i1h2x - i1h2y); - - itemp = ckt->CKTomega * - D1nF12(here->capgb2, - r1h1x - r1h1y, - i1h1x - i1h1y, - r1h2x - r1h2y, - i1h2x - i1h2y); - - *(ckt->CKTrhs + (here->MOS3gNode)) -= temp; - *(ckt->CKTirhs + (here->MOS3gNode)) -= itemp; - *(ckt->CKTrhs + (here->MOS3bNode)) += temp; - *(ckt->CKTirhs + (here->MOS3bNode)) += itemp; - - /* capgb over */ - - /* loading capbs term */ - - temp = -ckt->CKTomega * - D1iF12(here->capbs2, - r1h1y, - i1h1y, - r1h2y, - i1h2y); - - itemp = ckt->CKTomega * - D1nF12(here->capbs2, - r1h1y, - i1h1y, - r1h2y, - i1h2y); - - - *(ckt->CKTrhs + (here->MOS3bNode)) -= temp; - *(ckt->CKTirhs + (here->MOS3bNode)) -= itemp; - *(ckt->CKTrhs + (here->MOS3sNodePrime)) += temp; - *(ckt->CKTirhs + (here->MOS3sNodePrime)) += itemp; - - /* capbs over */ - - /* loading capbd term */ - - temp = -ckt->CKTomega * - D1iF12(here->capbd2, - r1h1y - r1h1z, - i1h1y - i1h1z, - r1h2y - r1h2z, - i1h2y - i1h2z); - - itemp = ckt->CKTomega * - D1nF12(here->capbd2, - r1h1y - r1h1z, - i1h1y - i1h1z, - r1h2y - r1h2z, - i1h2y - i1h2z); - - - *(ckt->CKTrhs + (here->MOS3bNode)) -= temp; - *(ckt->CKTirhs + (here->MOS3bNode)) -= itemp; - *(ckt->CKTrhs + (here->MOS3dNodePrime)) += temp; - *(ckt->CKTirhs + (here->MOS3dNodePrime)) += itemp; - - /* capbd over */ - /* all done */ - - break; - case D_F1MF2: - /* x = vgs, y = vbs z = vds */ - - /* getting first order (linear) Volterra kernel */ - r1h1x = *(job->r1H1ptr + (here->MOS3gNode)) - - *(job->r1H1ptr + (here->MOS3sNodePrime)); - i1h1x = *(job->i1H1ptr + (here->MOS3gNode)) - - *(job->i1H1ptr + (here->MOS3sNodePrime)); - - r1h1y = *(job->r1H1ptr + (here->MOS3bNode)) - - *(job->r1H1ptr + (here->MOS3sNodePrime)); - i1h1y = *(job->i1H1ptr + (here->MOS3bNode)) - - *(job->i1H1ptr + (here->MOS3sNodePrime)); - - r1h1z = *(job->r1H1ptr + (here->MOS3dNodePrime)) - - *(job->r1H1ptr + (here->MOS3sNodePrime)); - i1h1z = *(job->i1H1ptr + (here->MOS3dNodePrime)) - - *(job->i1H1ptr + (here->MOS3sNodePrime)); - - r1hm2x = *(job->r1H2ptr + (here->MOS3gNode)) - - *(job->r1H2ptr + (here->MOS3sNodePrime)); - i1hm2x = -(*(job->i1H2ptr + (here->MOS3gNode)) - - *(job->i1H2ptr + (here->MOS3sNodePrime))); - - r1hm2y = *(job->r1H2ptr + (here->MOS3bNode)) - - *(job->r1H2ptr + (here->MOS3sNodePrime)); - i1hm2y = -(*(job->i1H2ptr + (here->MOS3bNode)) - - *(job->i1H2ptr + (here->MOS3sNodePrime))); - - r1hm2z = *(job->r1H2ptr + (here->MOS3dNodePrime)) - - *(job->r1H2ptr + (here->MOS3sNodePrime)); - i1hm2z = -(*(job->i1H2ptr + (here->MOS3dNodePrime)) - - *(job->i1H2ptr + (here->MOS3sNodePrime))); - - /* loading starts here */ - /* loading cdrain term */ - - temp = DFnF12(here->cdr_x2, - here->cdr_y2, - here->cdr_z2, - here->cdr_xy, - here->cdr_yz, - here->cdr_xz, - r1h1x, - i1h1x, - r1h1y, - i1h1y, - r1h1z, - i1h1z, - r1hm2x, - i1hm2x, - r1hm2y, - i1hm2y, - r1hm2z, - i1hm2z); - - itemp = DFiF12(here->cdr_x2, - here->cdr_y2, - here->cdr_z2, - here->cdr_xy, - here->cdr_yz, - here->cdr_xz, - r1h1x, - i1h1x, - r1h1y, - i1h1y, - r1h1z, - i1h1z, - r1hm2x, - i1hm2x, - r1hm2y, - i1hm2y, - r1hm2z, - i1hm2z); - - *(ckt->CKTrhs + (here->MOS3dNodePrime)) -= temp; - *(ckt->CKTirhs + (here->MOS3dNodePrime)) -= itemp; - *(ckt->CKTrhs + (here->MOS3sNodePrime)) += temp; - *(ckt->CKTirhs + (here->MOS3sNodePrime)) += itemp; - - /* cdrain term over */ - - /* loading gbs term */ - - temp = D1nF12(here->gbs2, - r1h1y, - i1h1y, - r1hm2y, - i1hm2y); - - itemp = D1iF12(here->gbs2, - r1h1y, - i1h1y, - r1hm2y, - i1hm2y); - - - *(ckt->CKTrhs + (here->MOS3bNode)) -= temp; - *(ckt->CKTirhs + (here->MOS3bNode)) -= itemp; - *(ckt->CKTrhs + (here->MOS3sNodePrime)) += temp; - *(ckt->CKTirhs + (here->MOS3sNodePrime)) += itemp; - - /* gbs over */ - - /* loading gbd term */ - - temp = D1nF12(here->gbd2, - r1h1y - r1h1z, - i1h1y - i1h1z, - r1hm2y - r1hm2z, - i1hm2y - i1hm2z); - - itemp = D1iF12(here->gbd2, - r1h1y - r1h1z, - i1h1y - i1h1z, - r1hm2y - r1hm2z, - i1hm2y - i1hm2z); - - - *(ckt->CKTrhs + (here->MOS3bNode)) -= temp; - *(ckt->CKTirhs + (here->MOS3bNode)) -= itemp; - *(ckt->CKTrhs + (here->MOS3dNodePrime)) += temp; - *(ckt->CKTirhs + (here->MOS3dNodePrime)) += itemp; - - /* gbd over */ - - /* loading capgs term */ - - temp = -ckt->CKTomega * - D1iF12(here->capgs2, - r1h1x, - i1h1x, - r1hm2x, - i1hm2x); - - itemp = ckt->CKTomega * - D1nF12(here->capgs2, - r1h1x, - i1h1x, - r1hm2x, - i1hm2x); - - *(ckt->CKTrhs + (here->MOS3gNode)) -= temp; - *(ckt->CKTirhs + (here->MOS3gNode)) -= itemp; - *(ckt->CKTrhs + (here->MOS3sNodePrime)) += temp; - *(ckt->CKTirhs + (here->MOS3sNodePrime)) += itemp; - - /* capgs over */ - - /* loading capgd term */ - - temp = -ckt->CKTomega * - D1iF12(here->capgd2, - r1h1x - r1h1z, - i1h1x - i1h1z, - r1hm2x - r1hm2z, - i1hm2x - i1hm2z); - - itemp = ckt->CKTomega * - D1nF12(here->capgd2, - r1h1x - r1h1z, - i1h1x - i1h1z, - r1hm2x - r1hm2z, - i1hm2x - i1hm2z); - - - *(ckt->CKTrhs + (here->MOS3gNode)) -= temp; - *(ckt->CKTirhs + (here->MOS3gNode)) -= itemp; - *(ckt->CKTrhs + (here->MOS3dNodePrime)) += temp; - *(ckt->CKTirhs + (here->MOS3dNodePrime)) += itemp; - - /* capgd over */ - /* loading capgb term */ - - temp = -ckt->CKTomega * - D1iF12(here->capgb2, - r1h1x - r1h1y, - i1h1x - i1h1y, - r1hm2x - r1hm2y, - i1hm2x - i1hm2y); - - itemp = ckt->CKTomega * - D1nF12(here->capgb2, - r1h1x - r1h1y, - i1h1x - i1h1y, - r1hm2x - r1hm2y, - i1hm2x - i1hm2y); - - *(ckt->CKTrhs + (here->MOS3gNode)) -= temp; - *(ckt->CKTirhs + (here->MOS3gNode)) -= itemp; - *(ckt->CKTrhs + (here->MOS3bNode)) += temp; - *(ckt->CKTirhs + (here->MOS3bNode)) += itemp; - - /* capgb over */ - - /* loading capbs term */ - - temp = -ckt->CKTomega * - D1iF12(here->capbs2, - r1h1y, - i1h1y, - r1hm2y, - i1hm2y); - - itemp = ckt->CKTomega * - D1nF12(here->capbs2, - r1h1y, - i1h1y, - r1hm2y, - i1hm2y); - - - *(ckt->CKTrhs + (here->MOS3bNode)) -= temp; - *(ckt->CKTirhs + (here->MOS3bNode)) -= itemp; - *(ckt->CKTrhs + (here->MOS3sNodePrime)) += temp; - *(ckt->CKTirhs + (here->MOS3sNodePrime)) += itemp; - - /* capbs over */ - - /* loading capbd term */ - - temp = -ckt->CKTomega * - D1iF12(here->capbd2, - r1h1y - r1h1z, - i1h1y - i1h1z, - r1hm2y - r1hm2z, - i1hm2y - i1hm2z); - - itemp = ckt->CKTomega * - D1nF12(here->capbd2, - r1h1y - r1h1z, - i1h1y - i1h1z, - r1hm2y - r1hm2z, - i1hm2y - i1hm2z); - - - *(ckt->CKTrhs + (here->MOS3bNode)) -= temp; - *(ckt->CKTirhs + (here->MOS3bNode)) -= itemp; - *(ckt->CKTrhs + (here->MOS3dNodePrime)) += temp; - *(ckt->CKTirhs + (here->MOS3dNodePrime)) += itemp; - - /* capbd over */ - /* all done */ - - break; - case D_2F1MF2: - /* x = vgs, y = vbs z = vds */ - - /* getting first order (linear) Volterra kernel */ - r1h1x = *(job->r1H1ptr + (here->MOS3gNode)) - - *(job->r1H1ptr + (here->MOS3sNodePrime)); - i1h1x = *(job->i1H1ptr + (here->MOS3gNode)) - - *(job->i1H1ptr + (here->MOS3sNodePrime)); - - r1h1y = *(job->r1H1ptr + (here->MOS3bNode)) - - *(job->r1H1ptr + (here->MOS3sNodePrime)); - i1h1y = *(job->i1H1ptr + (here->MOS3bNode)) - - *(job->i1H1ptr + (here->MOS3sNodePrime)); - - r1h1z = *(job->r1H1ptr + (here->MOS3dNodePrime)) - - *(job->r1H1ptr + (here->MOS3sNodePrime)); - i1h1z = *(job->i1H1ptr + (here->MOS3dNodePrime)) - - *(job->i1H1ptr + (here->MOS3sNodePrime)); - - r1hm2x = *(job->r1H2ptr + (here->MOS3gNode)) - - *(job->r1H2ptr + (here->MOS3sNodePrime)); - i1hm2x = -(*(job->i1H2ptr + (here->MOS3gNode)) - - *(job->i1H2ptr + (here->MOS3sNodePrime))); - - r1hm2y = *(job->r1H2ptr + (here->MOS3bNode)) - - *(job->r1H2ptr + (here->MOS3sNodePrime)); - i1hm2y = -(*(job->i1H2ptr + (here->MOS3bNode)) - - *(job->i1H2ptr + (here->MOS3sNodePrime))); - - r1hm2z = *(job->r1H2ptr + (here->MOS3dNodePrime)) - - *(job->r1H2ptr + (here->MOS3sNodePrime)); - i1hm2z = -(*(job->i1H2ptr + (here->MOS3dNodePrime)) - - *(job->i1H2ptr + (here->MOS3sNodePrime))); - - r2h11x = *(job->r1H1ptr + (here->MOS3gNode)) - - *(job->r1H1ptr + (here->MOS3sNodePrime)); - i2h11x = *(job->i1H1ptr + (here->MOS3gNode)) - - *(job->i1H1ptr + (here->MOS3sNodePrime)); - - r2h11y = *(job->r1H1ptr + (here->MOS3bNode)) - - *(job->r1H1ptr + (here->MOS3sNodePrime)); - i2h11y = *(job->i1H1ptr + (here->MOS3bNode)) - - *(job->i1H1ptr + (here->MOS3sNodePrime)); - - r2h11z = *(job->r1H1ptr + (here->MOS3dNodePrime)) - - *(job->r1H1ptr + (here->MOS3sNodePrime)); - i2h11z = *(job->i1H1ptr + (here->MOS3dNodePrime)) - - *(job->i1H1ptr + (here->MOS3sNodePrime)); - - r2h1m2x = *(job->r2H1m2ptr + (here->MOS3gNode)) - - *(job->r2H1m2ptr + (here->MOS3sNodePrime)); - i2h1m2x = *(job->i2H1m2ptr + (here->MOS3gNode)) - - *(job->i2H1m2ptr + (here->MOS3sNodePrime)); - - r2h1m2y = *(job->r2H1m2ptr + (here->MOS3bNode)) - - *(job->r2H1m2ptr + (here->MOS3sNodePrime)); - i2h1m2y = *(job->i2H1m2ptr + (here->MOS3bNode)) - - *(job->i2H1m2ptr + (here->MOS3sNodePrime)); - -r2h1m2z = *(job->r2H1m2ptr + (here->MOS3dNodePrime)) - - *(job->r2H1m2ptr + (here->MOS3sNodePrime)); -i2h1m2z = *(job->i2H1m2ptr + (here->MOS3dNodePrime)) - - *(job->i2H1m2ptr + (here->MOS3sNodePrime)); - - /* loading starts here */ - /* loading cdrain term */ - -pass.cxx = here->cdr_x2; -pass.cyy = here->cdr_y2; -pass.czz = here->cdr_z2; -pass.cxy = here->cdr_xy; -pass.cyz = here->cdr_yz; -pass.cxz = here->cdr_xz; -pass.cxxx = here->cdr_x3; -pass.cyyy = here->cdr_y3; -pass.czzz = here->cdr_z3; -pass.cxxy = here->cdr_x2y; -pass.cxxz = here->cdr_x2z; -pass.cxyy = here->cdr_xy2; -pass.cyyz = here->cdr_y2z; -pass.cxzz = here->cdr_xz2; -pass.cyzz = here->cdr_yz2; -pass.cxyz = here->cdr_xyz; -pass.r1h1x = r1h1x; -pass.i1h1x = i1h1x; -pass.r1h1y = r1h1y; -pass.i1h1y = i1h1y; -pass.r1h1z = r1h1z; -pass.i1h1z = i1h1z; -pass.r1h2x = r1hm2x; -pass.i1h2x = i1hm2x; -pass.r1h2y = r1hm2y; -pass.i1h2y = i1hm2y; -pass.r1h2z = r1hm2z; -pass.i1h2z = i1hm2z; -pass.r2h11x = r2h11x; -pass.i2h11x = i2h11x; -pass.r2h11y = r2h11y; -pass.i2h11y = i2h11y; -pass.r2h11z = r2h11z; -pass.i2h11z = i2h11z; -pass.h2f1f2x = r2h1m2x; -pass.ih2f1f2x = i2h1m2x; -pass.h2f1f2y = r2h1m2y; -pass.ih2f1f2y = i2h1m2y; -pass.h2f1f2z = r2h1m2z; -pass.ih2f1f2z = i2h1m2z; - temp = DFn2F12(&pass); - - itemp = DFi2F12(&pass); - - - *(ckt->CKTrhs + (here->MOS3dNodePrime)) -= temp; - *(ckt->CKTirhs + (here->MOS3dNodePrime)) -= itemp; - *(ckt->CKTrhs + (here->MOS3sNodePrime)) += temp; - *(ckt->CKTirhs + (here->MOS3sNodePrime)) += itemp; - - /* cdrain term over */ - - /* loading gbs term */ - - temp = D1n2F12(here->gbs2, - here->gbs3, - r1h1y, - i1h1y, - r1hm2y, - i1hm2y, - r2h11y, - i2h11y, - r2h1m2y, - i2h1m2y); - - - - itemp = D1i2F12(here->gbs2, - here->gbs3, - r1h1y, - i1h1y, - r1hm2y, - i1hm2y, - r2h11y, - i2h11y, - r2h1m2y, - i2h1m2y); - - - *(ckt->CKTrhs + (here->MOS3bNode)) -= temp; - *(ckt->CKTirhs + (here->MOS3bNode)) -= itemp; - *(ckt->CKTrhs + (here->MOS3sNodePrime)) += temp; - *(ckt->CKTirhs + (here->MOS3sNodePrime)) += itemp; - - /* gbs over */ - - /* loading gbd term */ - - temp = D1n2F12(here->gbd2, - here->gbd3, - r1h1y - r1h1z, - i1h1y - i1h1z, - r1hm2y - r1hm2z, - i1hm2y - i1hm2z, - r2h11y - r2h11z, - i2h11y - i2h11z, - r2h1m2y - r2h1m2z, - i2h1m2y - i2h1m2z); - - itemp = D1i2F12(here->gbd2, - here->gbd3, - r1h1y - r1h1z, - i1h1y - i1h1z, - r1hm2y - r1hm2z, - i1hm2y - i1hm2z, - r2h11y - r2h11z, - i2h11y - i2h11z, - r2h1m2y - r2h1m2z, - i2h1m2y - i2h1m2z); - - *(ckt->CKTrhs + (here->MOS3bNode)) -= temp; - *(ckt->CKTirhs + (here->MOS3bNode)) -= itemp; - *(ckt->CKTrhs + (here->MOS3dNodePrime)) += temp; - *(ckt->CKTirhs + (here->MOS3dNodePrime)) += itemp; - - /* gbd over */ - - /* loading capgs term */ - - temp = -ckt->CKTomega * - D1i2F12(here->capgs2, - here->capgs3, - r1h1x, - i1h1x, - r1hm2x, - i1hm2x, - r2h11x, - i2h11x, - r2h1m2x, - i2h1m2x); - - itemp = ckt->CKTomega * - D1n2F12(here->capgs2, - here->capgs3, - r1h1x, - i1h1x, - r1hm2x, - i1hm2x, - r2h11x, - i2h11x, - r2h1m2x, - i2h1m2x); - - *(ckt->CKTrhs + (here->MOS3gNode)) -= temp; - *(ckt->CKTirhs + (here->MOS3gNode)) -= itemp; - *(ckt->CKTrhs + (here->MOS3sNodePrime)) += temp; - *(ckt->CKTirhs + (here->MOS3sNodePrime)) += itemp; - - /* capgs over */ - - /* loading capgd term */ - - temp = -ckt->CKTomega * - D1i2F12(here->capgd2, - here->capgd3, - r1h1x - r1h1z, - i1h1x - i1h1z, - r1hm2x - r1hm2z, - i1hm2x - i1hm2z, - r2h11x - r2h11z, - i2h11x - i2h11z, - r2h1m2x - r2h1m2z, - i2h1m2x - i2h1m2z); - - itemp = ckt->CKTomega * - D1n2F12(here->capgd2, - here->capgd3, - r1h1x - r1h1z, - i1h1x - i1h1z, - r1hm2x - r1hm2z, - i1hm2x - i1hm2z, - r2h11x - r2h11z, - i2h11x - i2h11z, - r2h1m2x - r2h1m2z, - i2h1m2x - i2h1m2z); - - - *(ckt->CKTrhs + (here->MOS3gNode)) -= temp; - *(ckt->CKTirhs + (here->MOS3gNode)) -= itemp; - *(ckt->CKTrhs + (here->MOS3dNodePrime)) += temp; - *(ckt->CKTirhs + (here->MOS3dNodePrime)) += itemp; - - /* capgd over */ - /* loading capgb term */ - - temp = -ckt->CKTomega * - D1i2F12(here->capgb2, - here->capgb3, - r1h1x - r1h1y, - i1h1x - i1h1y, - r1hm2x - r1hm2y, - i1hm2x - i1hm2y, - r2h11x - r2h11y, - i2h11x - i2h11y, - r2h1m2x - r2h1m2y, - i2h1m2x - i2h1m2y); - - itemp = ckt->CKTomega * - D1n2F12(here->capgb2, - here->capgb3, - r1h1x - r1h1y, - i1h1x - i1h1y, - r1hm2x - r1hm2y, - i1hm2x - i1hm2y, - r2h11x - r2h11y, - i2h11x - i2h11y, - r2h1m2x - r2h1m2y, - i2h1m2x - i2h1m2y); - - *(ckt->CKTrhs + (here->MOS3gNode)) -= temp; - *(ckt->CKTirhs + (here->MOS3gNode)) -= itemp; - *(ckt->CKTrhs + (here->MOS3bNode)) += temp; - *(ckt->CKTirhs + (here->MOS3bNode)) += itemp; - - /* capgb over */ - - /* loading capbs term */ - - temp = -ckt->CKTomega * - D1i2F12(here->capbs2, - here->capbs3, - r1h1y, - i1h1y, - r1hm2y, - i1hm2y, - r2h11y, - i2h11y, - r2h1m2y, - i2h1m2y); - - itemp = ckt->CKTomega * - D1n2F12(here->capbs2, - here->capbs3, - r1h1y, - i1h1y, - r1hm2y, - i1hm2y, - r2h11y, - i2h11y, - r2h1m2y, - i2h1m2y); - - - *(ckt->CKTrhs + (here->MOS3bNode)) -= temp; - *(ckt->CKTirhs + (here->MOS3bNode)) -= itemp; - *(ckt->CKTrhs + (here->MOS3sNodePrime)) += temp; - *(ckt->CKTirhs + (here->MOS3sNodePrime)) += itemp; - - /* capbs over */ - - /* loading capbd term */ - - temp = -ckt->CKTomega * - D1i2F12(here->capbd2, - here->capbd3, - r1h1y - r1h1z, - i1h1y - i1h1z, - r1hm2y - r1hm2z, - i1hm2y - i1hm2z, - r2h11y - r2h11z, - i2h11y - i2h11z, - r2h1m2y - r2h1m2z, - i2h1m2y - i2h1m2z); - - itemp = ckt->CKTomega * - D1n2F12(here->capbd2, - here->capbd3, - r1h1y - r1h1z, - i1h1y - i1h1z, - r1hm2y - r1hm2z, - i1hm2y - i1hm2z, - r2h11y - r2h11z, - i2h11y - i2h11z, - r2h1m2y - r2h1m2z, - i2h1m2y - i2h1m2z); - - - *(ckt->CKTrhs + (here->MOS3bNode)) -= temp; - *(ckt->CKTirhs + (here->MOS3bNode)) -= itemp; - *(ckt->CKTrhs + (here->MOS3dNodePrime)) += temp; - *(ckt->CKTirhs + (here->MOS3dNodePrime)) += itemp; - - /* capbd over */ - /* all done */ - - break; - default: -; - } - } -} -return(OK); -} - else - return(E_BADPARM); -} diff --git a/src/spicelib/devices/mos3/mos3dset.c b/src/spicelib/devices/mos3/mos3dset.c deleted file mode 100644 index 21c7fb783..000000000 --- a/src/spicelib/devices/mos3/mos3dset.c +++ /dev/null @@ -1,962 +0,0 @@ -/********** -Copyright 1990 Regents of the University of California. All rights reserved. -Author: 1988 Jaijeet S Roychowdhury -Modified: 2000 AlansFixes -**********/ - -#include "ngspice/ngspice.h" -#include "ngspice/cktdefs.h" -#include "ngspice/devdefs.h" -#include "mos3defs.h" -#include "ngspice/trandefs.h" -#include "ngspice/distodef.h" -#include "ngspice/const.h" -#include "ngspice/sperror.h" -#include "ngspice/suffix.h" - -int -MOS3dSetup(GENmodel *inModel, CKTcircuit *ckt) - /* actually load the current value into the - * sparse matrix previously provided - */ -{ - MOS3model *model = (MOS3model *)inModel; - MOS3instance *here; - double Beta; - double DrainSatCur; - double EffectiveLength; - double EffectiveWidth; - double GateBulkOverlapCap; - double GateDrainOverlapCap; - double GateSourceOverlapCap; - double OxideCap; - double SourceSatCur; - double arg; - double cdrain; - double evbs; - double sarg; - double sargsw; - double lvgs; - double vbd; - double vbs; - double vds; - double vdsat; - double vgb; - double vgd; - double vgs; - double von; - double lcapgs2,lcapgs3; /* total gate-source capacitance */ - double lcapgd2,lcapgd3; /* total gate-drain capacitance */ - double lcapgb2,lcapgb3; /* total gate-bulk capacitance */ - double lgbs, lgbs2, lgbs3; - double lgbd, lgbd2, lgbd3; - double gm2, gb2, gds2, gmb, gmds, gbds; - double gm3, gb3, gds3, gm2ds, gm2b, gb2ds, gbds2, gmb2, gmds2, gmbds; - double lcapbd, lcapbd2, lcapbd3; - double lcapbs, lcapbs2, lcapbs3; - double ebd; - double vt; /* vt at instance temperature */ - Dderivs d_cdrain; - - - - /* loop through all the MOS3 device models */ - for( ; model != NULL; model = MOS3nextModel(model)) { - - /* loop through all the instances of the model */ - for (here = MOS3instances(model); here != NULL ; - here=MOS3nextInstance(here)) { - - vt = CONSTKoverQ * here->MOS3temp; - - /* first, we compute a few useful values - these could be - * pre-computed, but for historical reasons are still done - * here. They may be moved at the expense of instance size - */ - - EffectiveWidth=here->MOS3w-2*model->MOS3widthNarrow+ - model->MOS3widthAdjust; - EffectiveLength=here->MOS3l - 2*model->MOS3latDiff+ - model->MOS3lengthAdjust; - - if( (here->MOS3tSatCurDens == 0) || - (here->MOS3drainArea == 0) || - (here->MOS3sourceArea == 0)) { - DrainSatCur = here->MOS3m * here->MOS3tSatCur; - SourceSatCur = here->MOS3m * here->MOS3tSatCur; - } else { - DrainSatCur = here->MOS3tSatCurDens * - here->MOS3m * here->MOS3drainArea; - SourceSatCur = here->MOS3tSatCurDens * - here->MOS3m * here->MOS3sourceArea; - } - GateSourceOverlapCap = model->MOS3gateSourceOverlapCapFactor * - here->MOS3m * EffectiveWidth; - GateDrainOverlapCap = model->MOS3gateDrainOverlapCapFactor * - here->MOS3m * EffectiveWidth; - GateBulkOverlapCap = model->MOS3gateBulkOverlapCapFactor * - here->MOS3m * EffectiveLength; - Beta = here->MOS3tTransconductance * here->MOS3m * - EffectiveWidth/EffectiveLength; - OxideCap = model->MOS3oxideCapFactor * EffectiveLength * - here->MOS3m * EffectiveWidth; - - /* - * ok - now to do the start-up operations - * - * we must get values for vbs, vds, and vgs from somewhere - * so we either predict them or recover them from last iteration - * These are the two most common cases - either a prediction - * step or the general iteration step and they - * share some code, so we put them first - others later on - */ - - - /* general iteration */ - - vbs = model->MOS3type * ( - *(ckt->CKTrhsOld+here->MOS3bNode) - - *(ckt->CKTrhsOld+here->MOS3sNodePrime)); - vgs = model->MOS3type * ( - *(ckt->CKTrhsOld+here->MOS3gNode) - - *(ckt->CKTrhsOld+here->MOS3sNodePrime)); - vds = model->MOS3type * ( - *(ckt->CKTrhsOld+here->MOS3dNodePrime) - - *(ckt->CKTrhsOld+here->MOS3sNodePrime)); - - /* now some common crunching for some more useful quantities */ - - - - /* - * now all the preliminaries are over - we can start doing the - * real work - */ - vbd = vbs - vds; - vgd = vgs - vds; - vgb = vgs - vbs; - - /* bulk-source and bulk-drain doides - * here we just evaluate the ideal diode current and the - * correspoinding derivative (conductance). - */ - if(vbs <= 0) { - lgbs = SourceSatCur/vt; - lgbs += ckt->CKTgmin; - lgbs2 = lgbs3 = 0; - } else { - evbs = exp(MIN(MAX_EXP_ARG,vbs/vt)); - lgbs = SourceSatCur*evbs/vt + ckt->CKTgmin; - lgbs2 = model->MOS3type *0.5 * (lgbs - ckt->CKTgmin)/vt; - lgbs3 = model->MOS3type *lgbs2/(vt*3); - - } - if(vbd <= 0) { - lgbd = DrainSatCur/vt; - lgbd += ckt->CKTgmin; - lgbd2 = lgbd3 = 0; - } else { - ebd = exp(MIN(MAX_EXP_ARG,vbd/vt)); - lgbd = DrainSatCur*ebd/vt +ckt->CKTgmin; - lgbd2 = model->MOS3type *0.5 * (lgbd - ckt->CKTgmin)/vt; - lgbd3 = model->MOS3type *lgbd2/(vt*3); - } - - - /* now to determine whether the user was able to correctly - * identify the source and drain of his device - */ - if(vds >= 0) { - /* normal mode */ - here->MOS3mode = 1; - } else { - /* inverse mode */ - here->MOS3mode = -1; - } - - { - /* - * subroutine moseq3(vds,vbs,vgs,gm,gds,gmbs, - * qg,qc,qb,cggb,cgdb,cgsb,cbgb,cbdb,cbsb) - */ - - /* - * this routine evaluates the drain current, its derivatives and - * the charges associated with the gate, channel and bulk - * for mosfets based on semi-empirical equations - */ - - /* - common /mosarg/ vto,beta,gamma,phi,phib,cox,xnsub,xnfs,xd,xj,xld, - 1 xlamda,uo,uexp,vbp,utra,vmax,xneff,xl,xw,vbi,von,vdsat,qspof, - 2 beta0,beta1,cdrain,xqco,xqc,fnarrw,fshort,lev - common /status/ omega,time,delta,delold(7),ag(7),vt,xni,egfet, - 1 xmu,sfactr,mode,modedc,icalc,initf,method,iord,maxord,noncon, - 2 iterno,itemno,nosolv,modac,ipiv,ivmflg,ipostp,iscrch,iofile - common /knstnt/ twopi,xlog2,xlog10,root2,rad,boltz,charge,ctok, - 1 gmin,reltol,abstol,vntol,trtol,chgtol,eps0,epssil,epsox, - 2 pivtol,pivrel - */ - - /* equivalence (xlamda,alpha),(vbp,theta),(uexp,eta),(utra,xkappa)*/ - - double coeff0 = 0.0631353e0; - double coeff1 = 0.8013292e0; - double coeff2 = -0.01110777e0; - double oneoverxl; /* 1/effective length */ - double eta; /* eta from model after length factor */ - double phibs; /* phi - vbs */ - double sqphbs; /* square root of phibs */ - double sqphis; /* square root of phi */ - double wps; - double oneoverxj; /* 1/junction depth */ - double xjonxl; /* junction depth/effective length */ - double djonxj; - double wponxj; - double arga; - double argb; - double argc; - double gammas; - double fbodys; - double fbody; - double onfbdy; - double qbonco; - double vbix; - double wconxj; - double vth; - double csonco; - double cdonco; - double vgsx; - double onfg; - double fgate; - double us; - double xn = 0.0; - double vdsc; - double onvdsc = 0.0; - double vdsx; - double cdnorm; - double cdo; - double fdrain = 0.0; - double gdsat; - double cdsat; - double emax; - double delxl; - double dlonxl; - double xlfact; - double ondvt; - double onxn; - double wfact; - double fshort; - double lvds, lvbs, lvbd; - Dderivs d_onxn, d_ondvt, d_wfact, d_MOS3gds; - Dderivs d_emax, d_delxl, d_dlonxl, d_xlfact; - Dderivs d_cdonco, d_fdrain, d_cdsat, d_gdsat; - Dderivs d_vdsx, d_cdo, d_cdnorm, d_Beta, d_dummy; - Dderivs d_vdsc, d_onvdsc, d_arga, d_argb; - Dderivs d_onfg, d_fgate, d_us, d_vgsx; - Dderivs d_von, d_xn, d_vth, d_onfbdy, d_qbonco, d_vbix; - Dderivs d_argc, d_fshort, d_gammas, d_fbodys, d_fbody; - Dderivs d_wps, d_wconxj, d_wponxj; - Dderivs d_phibs, d_sqphbs; - Dderivs d_p, d_q, d_r, d_zero, d_vdsat; - - /* - * bypasses the computation of charges - */ - if (here->MOS3mode == 1) { - lvgs = vgs; - lvds = vds; - lvbs = vbs; - lvbd = vbd; - } else { - lvgs = vgd; - lvds = -vds; - lvbs = vbd; - lvbd = vbs; - } - - /* - * reference cdrain equations to source and - * charge equations to bulk - */ -d_p.value = 0.0; -d_p.d1_p = 1.0; -d_p.d1_q = 0.0; -d_p.d1_r = 0.0; -d_p.d2_p2 = 0.0; -d_p.d2_q2 = 0.0; -d_p.d2_r2 = 0.0; -d_p.d2_pq = 0.0; -d_p.d2_qr = 0.0; -d_p.d2_pr = 0.0; -d_p.d3_p3 = 0.0; -d_p.d3_q3 = 0.0; -d_p.d3_r3 = 0.0; -d_p.d3_p2r = 0.0; -d_p.d3_p2q = 0.0; -d_p.d3_q2r = 0.0; -d_p.d3_pq2 = 0.0; -d_p.d3_pr2 = 0.0; -d_p.d3_qr2 = 0.0; -d_p.d3_pqr = 0.0; - EqualDeriv(&d_q,&d_p); - EqualDeriv(&d_r,&d_p); - EqualDeriv(&d_zero,&d_p); - d_q.d1_p = d_r.d1_p = d_zero.d1_p = 0.0; - d_q.d1_q = d_r.d1_r = 1.0; - vdsat = 0.0; - EqualDeriv(&d_vdsat,&d_zero); - oneoverxl = 1.0/EffectiveLength;/*const*/ - eta = model->MOS3eta * 8.15e-22/(model->MOS3oxideCapFactor* - EffectiveLength*EffectiveLength*EffectiveLength);/*const*/ - /* - *.....square root term - */ - if ( lvbs <= 0.0 ) { - phibs = here->MOS3tPhi-lvbs; - EqualDeriv(&d_phibs,&d_q); - d_phibs.value = lvbs; - TimesDeriv(&d_phibs,&d_phibs,-1.0); - d_phibs.value += here->MOS3tPhi; - sqphbs = sqrt(phibs); - SqrtDeriv(&d_sqphbs,&d_phibs); - } else { - sqphis = sqrt(here->MOS3tPhi);/*const*/ - /*sqphs3 = here->MOS3tPhi*sqphis;const*/ - sqphbs = sqphis/(1.0+lvbs/ - (here->MOS3tPhi+here->MOS3tPhi)); - EqualDeriv(&d_sqphbs,&d_q); d_sqphbs.value = lvbs; - TimesDeriv(&d_sqphbs,&d_sqphbs,1/(here->MOS3tPhi+here->MOS3tPhi)); - d_sqphbs.value += 1.0; - InvDeriv(&d_sqphbs,&d_sqphbs); - TimesDeriv(&d_sqphbs,&d_sqphbs,sqphis); - phibs = sqphbs*sqphbs; - MultDeriv(&d_phibs,&d_sqphbs,&d_sqphbs); - } - /* - *.....short channel effect factor - */ - if ( (model->MOS3junctionDepth != 0.0) && - (model->MOS3coeffDepLayWidth != 0.0) ) { - wps = model->MOS3coeffDepLayWidth*sqphbs; - TimesDeriv(&d_wps,&d_sqphbs,model->MOS3coeffDepLayWidth); - oneoverxj = 1.0/model->MOS3junctionDepth;/*const*/ - xjonxl = model->MOS3junctionDepth*oneoverxl;/*const*/ - djonxj = model->MOS3latDiff*oneoverxj;/*const*/ - wponxj = wps*oneoverxj; - TimesDeriv(&d_wponxj,&d_wps,oneoverxj); - wconxj = coeff0+coeff1*wponxj+coeff2*wponxj*wponxj; - TimesDeriv(&d_wconxj,&d_wponxj,coeff2); - d_wconxj.value += coeff1; - MultDeriv(&d_wconxj,&d_wconxj,&d_wponxj); - d_wconxj.value += coeff0; - arga = wconxj + djonxj; - EqualDeriv(&d_arga,&d_wconxj); d_arga.value += djonxj; - argc = wponxj/(1.0+wponxj); - EqualDeriv(&d_argc,&d_wponxj); - d_argc.value += 1.0; - InvDeriv(&d_argc,&d_argc); - MultDeriv(&d_argc,&d_argc,&d_wponxj); - argb = sqrt(1.0-argc*argc); - MultDeriv(&d_argb,&d_argc,&d_argc); - TimesDeriv(&d_argb,&d_argb,-1.0); - d_argb.value += 1.0; - SqrtDeriv(&d_argb,&d_argb); - - fshort = 1.0-xjonxl*(arga*argb-djonxj); - MultDeriv(&d_fshort,&d_arga,&d_argb); - d_fshort.value -= djonxj; - TimesDeriv(&d_fshort,&d_fshort,-xjonxl); - d_fshort.value += 1.0; - } else { - fshort = 1.0; - EqualDeriv(&d_fshort,&d_zero); - d_fshort.value = 1.0; - - } - /* - *.....body effect - */ - gammas = model->MOS3gamma*fshort; - TimesDeriv(&d_gammas,&d_fshort,model->MOS3gamma); - fbodys = 0.5*gammas/(sqphbs+sqphbs); - DivDeriv(&d_fbodys,&d_gammas,&d_sqphbs); - TimesDeriv(&d_fbodys,&d_fbodys,0.25); - fbody = fbodys+model->MOS3narrowFactor/EffectiveWidth; - EqualDeriv(&d_fbody,&d_fbodys); - d_fbody.value += fbody - fbodys; - - onfbdy = 1.0/(1.0+fbody); - EqualDeriv(&d_onfbdy,&d_fbody); - d_onfbdy.value += 1.0; - InvDeriv(&d_onfbdy,&d_onfbdy); - qbonco =gammas*sqphbs+model->MOS3narrowFactor*phibs/EffectiveWidth; - EqualDeriv(&d_dummy,&d_phibs); - TimesDeriv(&d_dummy,&d_dummy,model->MOS3narrowFactor*EffectiveWidth); - MultDeriv(&d_qbonco,&d_gammas,&d_sqphbs); - PlusDeriv(&d_qbonco,&d_qbonco,&d_dummy); - /* - *.....static feedback effect - */ - vbix = here->MOS3tVbi*model->MOS3type-eta*(lvds); - EqualDeriv(&d_vbix,&d_r); d_vbix.value = vbix; - d_vbix.d1_r = -eta; - /* - *.....threshold voltage - */ - vth = vbix+qbonco; - PlusDeriv(&d_vth,&d_vbix,&d_qbonco); - /* - *.....joint weak inversion and strong inversion - */ - von = vth; - EqualDeriv(&d_von,&d_vth); - if ( model->MOS3fastSurfaceStateDensity != 0.0 ) { - csonco = CHARGE*model->MOS3fastSurfaceStateDensity * - 1e4 /*(cm**2/m**2)*/ *EffectiveLength*EffectiveWidth * - here->MOS3m/OxideCap; /*const*/ - cdonco = 0.5*qbonco/phibs; - DivDeriv(&d_cdonco,&d_qbonco,&d_phibs); - TimesDeriv(&d_cdonco,&d_cdonco,0.5); - xn = 1.0+csonco+cdonco; - EqualDeriv(&d_xn,&d_cdonco); - d_xn.value += 1.0 + csonco; - von = vth+vt*xn; - TimesDeriv(&d_von,&d_xn,vt); - PlusDeriv(&d_von,&d_von,&d_vth); - - - } else { - /* - *.....cutoff region - */ - if ( lvgs <= von ) { - cdrain = 0.0; - EqualDeriv(&d_cdrain,&d_zero); - goto innerline1000; - } - } - /* - *.....device is on - */ - vgsx = MAX(lvgs,von); -if (lvgs >= von) { -EqualDeriv(&d_vgsx,&d_p); -d_vgsx.value = lvgs; -} else { -EqualDeriv(&d_vgsx,&d_von); -} - /* - *.....mobility modulation by gate voltage - */ - onfg = 1.0+model->MOS3theta*(vgsx-vth); - TimesDeriv(&d_onfg,&d_vth,-1.0); - PlusDeriv(&d_onfg,&d_onfg,&d_vgsx); - TimesDeriv(&d_onfg,&d_onfg,model->MOS3theta); - d_onfg.value += 1.0; - fgate = 1.0/onfg; - InvDeriv(&d_fgate,&d_onfg); - us = here->MOS3tSurfMob * 1e-4 /*(m**2/cm**2)*/ *fgate; - TimesDeriv(&d_us,&d_fgate,here->MOS3tSurfMob * 1e-4); - /* - *.....saturation voltage - */ - vdsat = (vgsx-vth)*onfbdy; - TimesDeriv(&d_vdsat,&d_vth, -1.0); - PlusDeriv(&d_vdsat,&d_vdsat,&d_vgsx); - MultDeriv(&d_vdsat,&d_vdsat,&d_onfbdy); - if ( model->MOS3maxDriftVel <= 0.0 ) { - } else { - vdsc = EffectiveLength*model->MOS3maxDriftVel/us; - InvDeriv(&d_vdsc,&d_us); - TimesDeriv(&d_vdsc,&d_vdsc,EffectiveLength*model->MOS3maxDriftVel); - onvdsc = 1.0/vdsc; - InvDeriv(&d_onvdsc,&d_vdsc); - arga = (vgsx-vth)*onfbdy; - /* note arga = vdsat at this point */ - EqualDeriv(&d_arga,&d_vdsat); - argb = sqrt(arga*arga+vdsc*vdsc); - MultDeriv(&d_dummy,&d_arga,&d_arga); - MultDeriv(&d_argb,&d_vdsc,&d_vdsc); - PlusDeriv(&d_argb,&d_argb,&d_dummy); - SqrtDeriv(&d_argb,&d_argb); - vdsat = arga+vdsc-argb; - TimesDeriv(&d_vdsat,&d_argb,-1.0); - PlusDeriv(&d_vdsat,&d_vdsat,&d_vdsc); - PlusDeriv(&d_vdsat,&d_vdsat,&d_arga); - } - /* - *.....current factors in linear region - */ - vdsx = MIN((lvds),vdsat); -if (lvds < vdsat) { -EqualDeriv(&d_vdsx,&d_r); -d_vdsx.value = lvds; -} else { -EqualDeriv(&d_vdsx,&d_vdsat); -} - - if ( vdsx == 0.0 ) goto line900; - cdo = vgsx-vth-0.5*(1.0+fbody)*vdsx; - EqualDeriv(&d_cdo,&d_fbody); - d_cdo.value += 1.0; - MultDeriv(&d_cdo,&d_cdo,&d_vdsx); - TimesDeriv(&d_cdo,&d_cdo,0.5); - PlusDeriv(&d_cdo,&d_cdo,&d_vth); - TimesDeriv(&d_cdo,&d_cdo,-1.0); - PlusDeriv(&d_cdo,&d_cdo,&d_vgsx); - - - /* - *.....normalized drain current - */ - cdnorm = cdo*vdsx; - MultDeriv(&d_cdnorm,&d_cdo,&d_vdsx); - /* - *.....drain current without velocity saturation effect - */ -/* Beta is a constant till now */ - Beta = Beta*fgate; - TimesDeriv(&d_Beta,&d_fgate,Beta); - cdrain = Beta*cdnorm; - MultDeriv(&d_cdrain,&d_Beta,&d_cdnorm); - /* - *.....velocity saturation factor - */ - if ( model->MOS3maxDriftVel != 0.0 ) { - fdrain = 1.0/(1.0+vdsx*onvdsc); - MultDeriv(&d_fdrain,&d_vdsx,&d_onvdsc); - d_fdrain.value += 1.0; - InvDeriv(&d_fdrain,&d_fdrain); - /* - *.....drain current - */ - cdrain = fdrain*cdrain; - MultDeriv(&d_cdrain,&d_cdrain,&d_fdrain); - Beta = Beta*fdrain; - MultDeriv(&d_Beta,&d_Beta,&d_fdrain); - - } - /* - *.....channel length modulation - */ - if ( (lvds) <= vdsat ) goto line700; - if ( model->MOS3maxDriftVel == 0.0 ) goto line510; - if (model->MOS3alpha == 0.0) goto line700; - cdsat = cdrain; - EqualDeriv(&d_cdsat,&d_cdrain); - gdsat = cdsat*(1.0-fdrain)*onvdsc; - TimesDeriv(&d_dummy,&d_fdrain,-1.0); - d_dummy.value += 1.0; - MultDeriv(&d_gdsat,&d_cdsat,&d_dummy); - MultDeriv(&d_gdsat,&d_gdsat,&d_onvdsc); - gdsat = MAX(1.0e-12,gdsat); - if (gdsat == 1.0e-12) { - EqualDeriv(&d_gdsat,&d_zero); - d_gdsat.value = gdsat; - } - - emax = cdsat*oneoverxl/gdsat; - DivDeriv(&d_emax,&d_cdsat,&d_gdsat); - TimesDeriv(&d_emax,&d_emax,oneoverxl); - - - arga = 0.5*emax*model->MOS3alpha; - TimesDeriv(&d_arga,&d_emax,0.5*model->MOS3alpha); - argc = model->MOS3kappa*model->MOS3alpha;/*const*/ - argb = sqrt(arga*arga+argc*((lvds)-vdsat)); - TimesDeriv(&d_dummy,&d_vdsat,-1.0); - d_dummy.value += lvds; - d_dummy.d1_r += 1.0; - TimesDeriv(&d_argb,&d_dummy,argc); - MultDeriv(&d_dummy,&d_arga,&d_arga); - PlusDeriv(&d_argb,&d_argb,&d_dummy); - SqrtDeriv(&d_argb,&d_argb); - delxl = argb-arga; - TimesDeriv(&d_delxl,&d_arga,-1.0); - PlusDeriv(&d_delxl,&d_argb,&d_delxl); - goto line520; -line510: - delxl = sqrt(model->MOS3kappa*((lvds)-vdsat)*model->MOS3alpha); - TimesDeriv(&d_delxl,&d_vdsat,-1.0); - d_delxl.value += lvds; - d_delxl.d1_r += 1.0; - TimesDeriv(&d_delxl,&d_delxl,model->MOS3kappa*model->MOS3alpha); - SqrtDeriv(&d_delxl,&d_delxl); - - /* - *.....punch through approximation - */ -line520: - if ( delxl > (0.5*EffectiveLength) ) { - delxl = EffectiveLength - (EffectiveLength*EffectiveLength/ - delxl*0.25); - InvDeriv(&d_delxl,&d_delxl); - TimesDeriv(&d_delxl,&d_delxl,-EffectiveLength*EffectiveLength*0.25); - d_delxl.value += EffectiveLength; - } - /* - *.....saturation region - */ - dlonxl = delxl*oneoverxl; - TimesDeriv(&d_dlonxl,&d_delxl,oneoverxl); - xlfact = 1.0/(1.0-dlonxl); - TimesDeriv(&d_xlfact,&d_dlonxl,-1.0); - d_xlfact.value += 1.0; - InvDeriv(&d_xlfact,&d_xlfact); - - cdrain = cdrain*xlfact; - MultDeriv(&d_cdrain,&d_cdrain,&d_xlfact); - /* - *.....finish strong inversion case - */ -line700: - if ( lvgs < von ) { - /* - *.....weak inversion - */ - onxn = 1.0/xn; - InvDeriv(&d_onxn,&d_xn); - ondvt = onxn/vt; - TimesDeriv(&d_ondvt,&d_onxn,1/vt); - wfact = exp( (lvgs-von)*ondvt ); - TimesDeriv(&d_wfact,&d_von,-1.0); - d_wfact.value += lvgs; - d_wfact.d1_p += 1.0; - MultDeriv(&d_wfact,&d_wfact,&d_ondvt); - ExpDeriv(&d_wfact,&d_wfact); - cdrain = cdrain*wfact; - MultDeriv(&d_cdrain,&d_cdrain,&d_wfact); - } - /* - *.....charge computation - */ - goto innerline1000; - /* - *.....special case of vds = 0.0d0 - */ - -line900: - Beta = Beta*fgate; - /* Beta is still a constant */ - TimesDeriv(&d_Beta,&d_fgate,Beta); - cdrain = 0.0; - EqualDeriv(&d_cdrain,&d_zero); - here->MOS3gds = Beta*(vgsx-vth); - TimesDeriv(&d_MOS3gds,&d_vth,-1.0); - PlusDeriv(&d_MOS3gds,&d_MOS3gds,&d_vgsx); - MultDeriv(&d_MOS3gds,&d_MOS3gds,&d_Beta); - if ( (model->MOS3fastSurfaceStateDensity != 0.0) && - (lvgs < von) ) { - here->MOS3gds *=exp((lvgs-von)/(vt*xn)); - TimesDeriv(&d_dummy,&d_von,-1.0); - d_dummy.value += lvgs; - d_dummy.d1_p += 1.0; - DivDeriv(&d_dummy,&d_dummy,&d_xn); - TimesDeriv(&d_dummy,&d_dummy,1/vt); - ExpDeriv(&d_dummy,&d_dummy); - MultDeriv(&d_MOS3gds,&d_MOS3gds,&d_dummy); - } - d_cdrain.d1_r = d_MOS3gds.value; - d_cdrain.d2_r2 = d_MOS3gds.d1_r; - d_cdrain.d3_r3 = d_MOS3gds.d2_r2; - - - -innerline1000:; - /* - *.....done - */ - } - - - /* - * COMPUTE EQUIVALENT DRAIN CURRENT SOURCE - */ - /* - * now we do the hard part of the bulk-drain and bulk-source - * diode - we evaluate the non-linear capacitance and - * charge - * - * the basic equations are not hard, but the implementation - * is somewhat long in an attempt to avoid log/exponential - * evaluations - */ - /* - * charge storage elements - * - *.. bulk-drain and bulk-source depletion capacitances - */ - if (vbs < here->MOS3tDepCap){ - arg=1-vbs/here->MOS3tBulkPot; - /* - * the following block looks somewhat long and messy, - * but since most users use the default grading - * coefficients of .5, and sqrt is MUCH faster than an - * exp(log()) we use this special case code to buy time. - * (as much as 10% of total job time!) - */ - if(model->MOS3bulkJctBotGradingCoeff == - model->MOS3bulkJctSideGradingCoeff) { - if(model->MOS3bulkJctBotGradingCoeff == .5) { - sarg = sargsw = 1/sqrt(arg); - } else { - sarg = sargsw = - exp(-model->MOS3bulkJctBotGradingCoeff* - log(arg)); - } - } else { - if(model->MOS3bulkJctBotGradingCoeff == .5) { - sarg = 1/sqrt(arg); - } else { - sarg = exp(-model->MOS3bulkJctBotGradingCoeff* - log(arg)); - } - if(model->MOS3bulkJctSideGradingCoeff == .5) { - sargsw = 1/sqrt(arg); - } else { - sargsw =exp(-model->MOS3bulkJctSideGradingCoeff* - log(arg)); - } - } - lcapbs=here->MOS3Cbs*sarg+ - here->MOS3Cbssw*sargsw; - lcapbs2 = model->MOS3type*0.5/here->MOS3tBulkPot*( - here->MOS3Cbs*model->MOS3bulkJctBotGradingCoeff* - sarg/arg + here->MOS3Cbssw* - model->MOS3bulkJctSideGradingCoeff*sargsw/arg); - lcapbs3 = here->MOS3Cbs*sarg* - model->MOS3bulkJctBotGradingCoeff* - (model->MOS3bulkJctBotGradingCoeff+1); - lcapbs3 += here->MOS3Cbssw*sargsw* - model->MOS3bulkJctSideGradingCoeff* - (model->MOS3bulkJctSideGradingCoeff+1); - lcapbs3 = lcapbs3/(6*here->MOS3tBulkPot* - here->MOS3tBulkPot*arg*arg); - } else { - /* *(ckt->CKTstate0 + here->MOS3qbs)= here->MOS3f4s + - vbs*(here->MOS3f2s+vbs*(here->MOS3f3s/2));*/ - lcapbs=here->MOS3f2s+here->MOS3f3s*vbs; - lcapbs2 = 0.5*here->MOS3f3s; - lcapbs3 = 0; - } - if (vbd < here->MOS3tDepCap) { - arg=1-vbd/here->MOS3tBulkPot; - /* - * the following block looks somewhat long and messy, - * but since most users use the default grading - * coefficients of .5, and sqrt is MUCH faster than an - * exp(log()) we use this special case code to buy time. - * (as much as 10% of total job time!) - */ - if(model->MOS3bulkJctBotGradingCoeff == .5 && - model->MOS3bulkJctSideGradingCoeff == .5) { - sarg = sargsw = 1/sqrt(arg); - } else { - if(model->MOS3bulkJctBotGradingCoeff == .5) { - sarg = 1/sqrt(arg); - } else { - sarg = exp(-model->MOS3bulkJctBotGradingCoeff* - log(arg)); - } - if(model->MOS3bulkJctSideGradingCoeff == .5) { - sargsw = 1/sqrt(arg); - } else { - sargsw =exp(-model->MOS3bulkJctSideGradingCoeff* - log(arg)); - } - } - lcapbd=here->MOS3Cbd*sarg+ - here->MOS3Cbdsw*sargsw; - lcapbd2 = model->MOS3type*0.5/here->MOS3tBulkPot*( - here->MOS3Cbd*model->MOS3bulkJctBotGradingCoeff* - sarg/arg + here->MOS3Cbdsw* - model->MOS3bulkJctSideGradingCoeff*sargsw/arg); - lcapbd3 = here->MOS3Cbd*sarg* - model->MOS3bulkJctBotGradingCoeff* - (model->MOS3bulkJctBotGradingCoeff+1); - lcapbd3 += here->MOS3Cbdsw*sargsw* - model->MOS3bulkJctSideGradingCoeff* - (model->MOS3bulkJctSideGradingCoeff+1); - lcapbd3 = lcapbd3/(6*here->MOS3tBulkPot* - here->MOS3tBulkPot*arg*arg); - } else { - lcapbd=here->MOS3f2d + vbd * here->MOS3f3d; - lcapbd2=0.5*here->MOS3f3d; - lcapbd3=0; - } - /* - * meyer's capacitor model - */ - /* - * the meyer capacitance equations are in DEVqmeyer - * these expressions are derived from those equations. - * these expressions are incorrect; they assume just one - * controlling variable for each charge storage element - * while actually there are several; the MOS3 small - * signal ac linear model is also wrong because it - * ignores controlled capacitive elements. these can be - * corrected (as can the linear ss ac model) if the - * expressions for the charge are available - */ - - -{ - - - double phi; - double cox; - double vddif; - double vddif1; - double vddif2; - double vgst; - /* von, lvgs and vdsat have already been adjusted for - possible source-drain interchange */ - - - - vgst = lvgs -von; - phi = here->MOS3tPhi; - cox = OxideCap; - if (vgst <= -phi) { - lcapgb2=lcapgb3=lcapgs2=lcapgs3=lcapgd2=lcapgd3=0; - } else if (vgst <= -phi/2) { - lcapgb2= -cox/(4*phi); - lcapgb3=lcapgs2=lcapgs3=lcapgd2=lcapgd3=0; - } else if (vgst <= 0) { - lcapgb2= -cox/(4*phi); - lcapgb3=lcapgs3=lcapgd2=lcapgd3=0; - lcapgs2 = cox/(3*phi); - } else { /* the MOS3modes are around because - vds has not been adjusted */ - if (vdsat <= here->MOS3mode*vds) { - lcapgb2=lcapgb3=lcapgs2=lcapgs3=lcapgd2=lcapgd3=0; - } else { - vddif = 2.0*vdsat-here->MOS3mode*vds; - vddif1 = vdsat-here->MOS3mode*vds/*-1.0e-12*/; - vddif2 = vddif*vddif; - lcapgd2 = -vdsat*here->MOS3mode*vds*cox/(3*vddif*vddif2); - lcapgd3 = - here->MOS3mode*vds*cox*(vddif - 6*vdsat)/(9*vddif2*vddif2); - lcapgs2 = -vddif1*here->MOS3mode*vds*cox/(3*vddif*vddif2); - lcapgs3 = - here->MOS3mode*vds*cox*(vddif - 6*vddif1)/(9*vddif2*vddif2); - lcapgb2=lcapgb3=0; - } - } - } - - /* the b-s and b-d diodes need no processing ... */ - here->capbs2 = lcapbs2; - here->capbs3 = lcapbs3; - here->capbd2 = lcapbd2; - here->capbd3 = lcapbd3; - here->gbs2 = lgbs2; - here->gbs3 = lgbs3; - here->gbd2 = lgbd2; - here->gbd3 = lgbd3; - here->capgb2 = model->MOS3type*lcapgb2; - here->capgb3 = lcapgb3; - /* - * process to get Taylor coefficients, taking into - * account type and mode. - */ -gm2 = d_cdrain.d2_p2; -gb2 = d_cdrain.d2_q2; -gds2 = d_cdrain.d2_r2; -gmb = d_cdrain.d2_pq; -gbds = d_cdrain.d2_qr; -gmds = d_cdrain.d2_pr; -gm3 = d_cdrain.d3_p3; -gb3 = d_cdrain.d3_q3; -gds3 = d_cdrain.d3_r3; -gm2ds = d_cdrain.d3_p2r; -gm2b = d_cdrain.d3_p2q; -gb2ds = d_cdrain.d3_q2r; -gmb2 = d_cdrain.d3_pq2; -gmds2 = d_cdrain.d3_pr2; -gbds2 = d_cdrain.d3_qr2; -gmbds = d_cdrain.d3_pqr; - - if (here->MOS3mode == 1) - { - /* normal mode - no source-drain interchange */ - - here->cdr_x2 = gm2; - here->cdr_y2 = gb2;; - here->cdr_z2 = gds2;; - here->cdr_xy = gmb; - here->cdr_yz = gbds; - here->cdr_xz = gmds; - here->cdr_x3 = gm3; - here->cdr_y3 = gb3; - here->cdr_z3 = gds3; - here->cdr_x2z = gm2ds; - here->cdr_x2y = gm2b; - here->cdr_y2z = gb2ds; - here->cdr_xy2 = gmb2; - here->cdr_xz2 = gmds2; - here->cdr_yz2 = gbds2; - here->cdr_xyz = gmbds; - - /* the gate caps have been divided and made into - Taylor coeffs., but not adjusted for type */ - - here->capgs2 = model->MOS3type*lcapgs2; - here->capgs3 = lcapgs3; - here->capgd2 = model->MOS3type*lcapgd2; - here->capgd3 = lcapgd3; -} else { - /* - * inverse mode - source and drain interchanged - */ - -here->cdr_x2 = -gm2; -here->cdr_y2 = -gb2; -here->cdr_z2 = -(gm2 + gb2 + gds2 + 2*(gmb + gmds + gbds)); -here->cdr_xy = -gmb; -here->cdr_yz = gmb + gb2 + gbds; -here->cdr_xz = gm2 + gmb + gmds; -here->cdr_x3 = -gm3; -here->cdr_y3 = -gb3; -here->cdr_z3 = gm3 + gb3 + gds3 + - 3*(gm2b + gm2ds + gmb2 + gb2ds + gmds2 + gbds2) + 6*gmbds ; -here->cdr_x2z = gm3 + gm2b + gm2ds; -here->cdr_x2y = -gm2b; -here->cdr_y2z = gmb2 + gb3 + gb2ds; -here->cdr_xy2 = -gmb2; -here->cdr_xz2 = -(gm3 + 2*(gm2b + gm2ds + gmbds) + - gmb2 + gmds2); -here->cdr_yz2 = -(gb3 + 2*(gmb2 + gb2ds + gmbds) + - gm2b + gbds2); -here->cdr_xyz = gm2b + gmb2 + gmbds; - - here->capgs2 = model->MOS3type*lcapgd2; - here->capgs3 = lcapgd3; - - here->capgd2 = model->MOS3type*lcapgs2; - here->capgd3 = lcapgs3; - -} - -/* now to adjust for type and multiply by factors to convert to Taylor coeffs. */ - -here->cdr_x2 = 0.5*model->MOS3type*here->cdr_x2; -here->cdr_y2 = 0.5*model->MOS3type*here->cdr_y2; -here->cdr_z2 = 0.5*model->MOS3type*here->cdr_z2; -here->cdr_xy = model->MOS3type*here->cdr_xy; -here->cdr_yz = model->MOS3type*here->cdr_yz; -here->cdr_xz = model->MOS3type*here->cdr_xz; -here->cdr_x3 = here->cdr_x3/6.; -here->cdr_y3 = here->cdr_y3/6.; -here->cdr_z3 = here->cdr_z3/6.; -here->cdr_x2z = 0.5*here->cdr_x2z; -here->cdr_x2y = 0.5*here->cdr_x2y; -here->cdr_y2z = 0.5*here->cdr_y2z; -here->cdr_xy2 = 0.5*here->cdr_xy2; -here->cdr_xz2 = 0.5*here->cdr_xz2; -here->cdr_yz2 = 0.5*here->cdr_yz2; - - - } - } - return(OK); -} diff --git a/src/spicelib/devices/mos3/mos3ext.h b/src/spicelib/devices/mos3/mos3ext.h deleted file mode 100644 index 956da1c91..000000000 --- a/src/spicelib/devices/mos3/mos3ext.h +++ /dev/null @@ -1,28 +0,0 @@ -/********** -Copyright 1990 Regents of the University of California. All rights reserved. -Author: 1985 Thomas L. Quarles -Modified: 2000 AlansFixes -**********/ - -extern int MOS3acLoad(GENmodel*,CKTcircuit*); -extern int MOS3ask(CKTcircuit*,GENinstance*,int,IFvalue*,IFvalue*); -extern int MOS3convTest(GENmodel *,CKTcircuit *); -extern int MOS3delete(GENinstance*); -extern int MOS3getic(GENmodel*,CKTcircuit*); -extern int MOS3load(GENmodel*,CKTcircuit*); -extern int MOS3mAsk(CKTcircuit*,GENmodel*,int,IFvalue*); -extern int MOS3mParam(int,IFvalue*,GENmodel*); -extern int MOS3param(int,IFvalue*,GENinstance*,IFvalue*); -extern int MOS3pzLoad(GENmodel*,CKTcircuit*,SPcomplex*); -extern int MOS3sAcLoad(GENmodel*,CKTcircuit*); -extern int MOS3sLoad(GENmodel*,CKTcircuit*); -extern void MOS3sPrint(GENmodel*,CKTcircuit*); -extern int MOS3sSetup(SENstruct*,GENmodel*); -extern int MOS3sUpdate(GENmodel*,CKTcircuit*); -extern int MOS3setup(SMPmatrix*,GENmodel*,CKTcircuit*,int*); -extern int MOS3unsetup(GENmodel*,CKTcircuit*); -extern int MOS3temp(GENmodel*,CKTcircuit*); -extern int MOS3trunc(GENmodel*,CKTcircuit*,double*); -extern int MOS3disto(int,GENmodel*,CKTcircuit*); -extern int MOS3noise(int,int,GENmodel*,CKTcircuit*,Ndata*,double*); -extern int MOS3dSetup(GENmodel*,CKTcircuit*); diff --git a/src/spicelib/devices/mos3/mos3ic.c b/src/spicelib/devices/mos3/mos3ic.c deleted file mode 100644 index 76dcd58e2..000000000 --- a/src/spicelib/devices/mos3/mos3ic.c +++ /dev/null @@ -1,46 +0,0 @@ -/********** -Copyright 1990 Regents of the University of California. All rights reserved. -Author: 1985 Thomas L. Quarles -**********/ -/* - */ - -#include "ngspice/ngspice.h" -#include "ngspice/cktdefs.h" -#include "mos3defs.h" -#include "ngspice/sperror.h" -#include "ngspice/suffix.h" - - -int -MOS3getic(GENmodel *inModel, CKTcircuit *ckt) -{ - MOS3model *model = (MOS3model *)inModel; - MOS3instance *here; - /* - * grab initial conditions out of rhs array. User specified, so use - * external nodes to get values - */ - - for( ; model ; model = MOS3nextModel(model)) { - for(here = MOS3instances(model); here ; here = MOS3nextInstance(here)) { - - if(!here->MOS3icVBSGiven) { - here->MOS3icVBS = - *(ckt->CKTrhs + here->MOS3bNode) - - *(ckt->CKTrhs + here->MOS3sNode); - } - if(!here->MOS3icVDSGiven) { - here->MOS3icVDS = - *(ckt->CKTrhs + here->MOS3dNode) - - *(ckt->CKTrhs + here->MOS3sNode); - } - if(!here->MOS3icVGSGiven) { - here->MOS3icVGS = - *(ckt->CKTrhs + here->MOS3gNode) - - *(ckt->CKTrhs + here->MOS3sNode); - } - } - } - return(OK); -} diff --git a/src/spicelib/devices/mos3/mos3init.c b/src/spicelib/devices/mos3/mos3init.c deleted file mode 100644 index b69bdc6f0..000000000 --- a/src/spicelib/devices/mos3/mos3init.c +++ /dev/null @@ -1,76 +0,0 @@ -#include "ngspice/config.h" - -#include "ngspice/devdefs.h" - -#include "mos3itf.h" -#include "mos3ext.h" -#include "mos3init.h" - - -SPICEdev MOS3info = { - .DEVpublic = { - .name = "Mos3", - .description = "Level 3 MOSfet model with Meyer capacitance model", - .terms = &MOS3nSize, - .numNames = &MOS3nSize, - .termNames = MOS3names, - .numInstanceParms = &MOS3pTSize, - .instanceParms = MOS3pTable, - .numModelParms = &MOS3mPTSize, - .modelParms = MOS3mPTable, - .flags = DEV_DEFAULT, - -#ifdef XSPICE - .cm_func = NULL, - .num_conn = 0, - .conn = NULL, - .num_param = 0, - .param = NULL, - .num_inst_var = 0, - .inst_var = NULL, -#endif - }, - - .DEVparam = MOS3param, - .DEVmodParam = MOS3mParam, - .DEVload = MOS3load, - .DEVsetup = MOS3setup, - .DEVunsetup = MOS3unsetup, - .DEVpzSetup = MOS3setup, - .DEVtemperature = MOS3temp, - .DEVtrunc = MOS3trunc, - .DEVfindBranch = NULL, - .DEVacLoad = MOS3acLoad, - .DEVaccept = NULL, - .DEVdestroy = NULL, - .DEVmodDelete = NULL, - .DEVdelete = MOS3delete, - .DEVsetic = MOS3getic, - .DEVask = MOS3ask, - .DEVmodAsk = MOS3mAsk, - .DEVpzLoad = MOS3pzLoad, - .DEVconvTest = MOS3convTest, - .DEVsenSetup = MOS3sSetup, - .DEVsenLoad = MOS3sLoad, - .DEVsenUpdate = MOS3sUpdate, - .DEVsenAcLoad = MOS3sAcLoad, - .DEVsenPrint = MOS3sPrint, - .DEVsenTrunc = NULL, - .DEVdisto = MOS3disto, - .DEVnoise = MOS3noise, - .DEVsoaCheck = NULL, - .DEVinstSize = &MOS3iSize, - .DEVmodSize = &MOS3mSize, - -#ifdef CIDER - .DEVdump = NULL, - .DEVacct = NULL, -#endif -}; - - -SPICEdev * -get_mos3_info(void) -{ - return &MOS3info; -} diff --git a/src/spicelib/devices/mos3/mos3init.h b/src/spicelib/devices/mos3/mos3init.h deleted file mode 100644 index 3c527cb79..000000000 --- a/src/spicelib/devices/mos3/mos3init.h +++ /dev/null @@ -1,13 +0,0 @@ -#ifndef _MOS3INIT_H -#define _MOS3INIT_H - -extern IFparm MOS3pTable[ ]; -extern IFparm MOS3mPTable[ ]; -extern char *MOS3names[ ]; -extern int MOS3pTSize; -extern int MOS3mPTSize; -extern int MOS3nSize; -extern int MOS3iSize; -extern int MOS3mSize; - -#endif diff --git a/src/spicelib/devices/mos3/mos3itf.h b/src/spicelib/devices/mos3/mos3itf.h deleted file mode 100644 index e7c301cd7..000000000 --- a/src/spicelib/devices/mos3/mos3itf.h +++ /dev/null @@ -1,9 +0,0 @@ -/********** -Copyright 1990 Regents of the University of California. All rights reserved. -**********/ -#ifndef DEV_MOS3 -#define DEV_MOS3 - -SPICEdev *get_mos3_info(void); - -#endif diff --git a/src/spicelib/devices/mos3/mos3load.c b/src/spicelib/devices/mos3/mos3load.c deleted file mode 100644 index cd020b9eb..000000000 --- a/src/spicelib/devices/mos3/mos3load.c +++ /dev/null @@ -1,1268 +0,0 @@ -/********** -Copyright 1990 Regents of the University of California. All rights reserved. -Author: 1985 Thomas L. Quarles -Modified: 2000 AlansFixes -**********/ - -#include "ngspice/ngspice.h" -#include "ngspice/cktdefs.h" -#include "ngspice/devdefs.h" -#include "mos3defs.h" -#include "ngspice/trandefs.h" -#include "ngspice/const.h" -#include "ngspice/sperror.h" -#include "ngspice/suffix.h" - -/* actually load the current value into the sparse matrix previously - * provided */ -int -MOS3load(GENmodel *inModel, CKTcircuit *ckt) -{ - MOS3model *model = (MOS3model *)inModel; - MOS3instance *here; - double Beta; - double DrainSatCur; - double EffectiveLength; - double EffectiveWidth; - double GateBulkOverlapCap; - double GateDrainOverlapCap; - double GateSourceOverlapCap; - double OxideCap; - double SourceSatCur; - double arg; - double cbhat; - double cdhat; - double cdrain; - double cdreq; - double ceq; - double ceqbd; - double ceqbs; - double ceqgb; - double ceqgd; - double ceqgs; - double delvbd; - double delvbs; - double delvds; - double delvgd; - double delvgs; - double evbd; - double evbs; - double gcgb; - double gcgd; - double gcgs; - double geq; - double sarg; - double sargsw; - double vbd; - double vbs; - double vds; - double vdsat; - double vgb1; - double vgb; - double vgd1; - double vgd; - double vgdo; - double vgs1; - double vgs; - double von; -#ifndef PREDICTOR - double xfact = 0.0; -#endif - int xnrm; - int xrev; - double capgs = 0.0; /* total gate-source capacitance */ - double capgd = 0.0; /* total gate-drain capacitance */ - double capgb = 0.0; /* total gate-bulk capacitance */ - int Check; -#ifndef NOBYPASS - double tempv; -#endif /*NOBYPASS*/ - int error; -#ifdef CAPBYPASS - int senflag; -#endif /*CAPBYPASS*/ - int SenCond; - double vt; /* vt at instance temperature */ - -#ifdef CAPBYPASS - senflag = 0; -#endif /* CAPBYPASS */ - if(ckt->CKTsenInfo){ - if(ckt->CKTsenInfo->SENstatus == PERTURBATION) { - if((ckt->CKTsenInfo->SENmode == ACSEN)|| - (ckt->CKTsenInfo->SENmode == TRANSEN)){ -#ifdef CAPBYPASS - senflag = 1; -#endif /* CAPBYPASS */ - - } - goto next; - } - } - - /* loop through all the MOS3 device models */ - next: - for( ; model != NULL; model = MOS3nextModel(model)) { - - /* loop through all the instances of the model */ - for (here = MOS3instances(model); here != NULL ; - here=MOS3nextInstance(here)) { - - vt = CONSTKoverQ * here->MOS3temp; - Check=1; - - if(ckt->CKTsenInfo){ -#ifdef SENSDEBUG - printf("MOS3load \n"); -#endif /* SENSDEBUG */ - - if(ckt->CKTsenInfo->SENstatus == PERTURBATION) - if(here->MOS3senPertFlag == OFF)continue; - - } - SenCond = ckt->CKTsenInfo && here->MOS3senPertFlag; - - /* first, we compute a few useful values - these could be - * pre-computed, but for historical reasons are still done - * here. They may be moved at the expense of instance - * size */ - - EffectiveWidth=here->MOS3w-2*model->MOS3widthNarrow+ - model->MOS3widthAdjust; - EffectiveLength=here->MOS3l - 2*model->MOS3latDiff+ - model->MOS3lengthAdjust; - - if( (here->MOS3tSatCurDens == 0) || - (here->MOS3drainArea == 0) || - (here->MOS3sourceArea == 0)) { - DrainSatCur = here->MOS3m * here->MOS3tSatCur; - SourceSatCur = here->MOS3m * here->MOS3tSatCur; - } else { - DrainSatCur = here->MOS3m * here->MOS3tSatCurDens * - here->MOS3drainArea; - SourceSatCur = here->MOS3m * here->MOS3tSatCurDens * - here->MOS3sourceArea; - } - GateSourceOverlapCap = model->MOS3gateSourceOverlapCapFactor * - here->MOS3m * EffectiveWidth; - GateDrainOverlapCap = model->MOS3gateDrainOverlapCapFactor * - here->MOS3m * EffectiveWidth; - GateBulkOverlapCap = model->MOS3gateBulkOverlapCapFactor * - here->MOS3m * EffectiveLength; - Beta = here->MOS3tTransconductance * - here->MOS3m * EffectiveWidth/EffectiveLength; - OxideCap = model->MOS3oxideCapFactor * EffectiveLength * - here->MOS3m * EffectiveWidth; - - if(SenCond){ -#ifdef SENSDEBUG - printf("MOS3senPertFlag = ON \n"); -#endif /* SENSDEBUG */ - if((ckt->CKTsenInfo->SENmode == TRANSEN) && - (ckt->CKTmode & MODEINITTRAN)) { - vgs = *(ckt->CKTstate1 + here->MOS3vgs); - vds = *(ckt->CKTstate1 + here->MOS3vds); - vbs = *(ckt->CKTstate1 + here->MOS3vbs); - vbd = *(ckt->CKTstate1 + here->MOS3vbd); - vgb = vgs - vbs; - vgd = vgs - vds; - } - else if (ckt->CKTsenInfo->SENmode == ACSEN){ - vgb = model->MOS3type * ( - *(ckt->CKTrhsOp+here->MOS3gNode) - - *(ckt->CKTrhsOp+here->MOS3bNode)); - vbs = *(ckt->CKTstate0 + here->MOS3vbs); - vbd = *(ckt->CKTstate0 + here->MOS3vbd); - vgd = vgb + vbd ; - vgs = vgb + vbs ; - vds = vbs - vbd ; - } - else{ - vgs = *(ckt->CKTstate0 + here->MOS3vgs); - vds = *(ckt->CKTstate0 + here->MOS3vds); - vbs = *(ckt->CKTstate0 + here->MOS3vbs); - vbd = *(ckt->CKTstate0 + here->MOS3vbd); - vgb = vgs - vbs; - vgd = vgs - vds; - } -#ifdef SENSDEBUG - printf(" vbs = %.7e ,vbd = %.7e,vgb = %.7e\n",vbs,vbd,vgb); - printf(" vgs = %.7e ,vds = %.7e,vgd = %.7e\n",vgs,vds,vgd); -#endif /* SENSDEBUG */ - goto next1; - } - - - /* - * ok - now to do the start-up operations - * - * we must get values for vbs, vds, and vgs from somewhere - * so we either predict them or recover them from last - * iteration These are the two most common cases - either - * a prediction step or the general iteration step and - * they share some code, so we put them first - others - * later on */ - - if((ckt->CKTmode & (MODEINITFLOAT | MODEINITPRED | MODEINITSMSIG | - MODEINITTRAN)) || - ( (ckt->CKTmode & MODEINITFIX) && (!here->MOS3off) ) ) { -#ifndef PREDICTOR - if(ckt->CKTmode & (MODEINITPRED | MODEINITTRAN) ) { - - /* predictor step */ - - xfact=ckt->CKTdelta/ckt->CKTdeltaOld[1]; - *(ckt->CKTstate0 + here->MOS3vbs) = - *(ckt->CKTstate1 + here->MOS3vbs); - vbs = (1+xfact)* (*(ckt->CKTstate1 + here->MOS3vbs)) - -(xfact * (*(ckt->CKTstate2 + here->MOS3vbs))); - *(ckt->CKTstate0 + here->MOS3vgs) = - *(ckt->CKTstate1 + here->MOS3vgs); - vgs = (1+xfact)* (*(ckt->CKTstate1 + here->MOS3vgs)) - -(xfact * (*(ckt->CKTstate2 + here->MOS3vgs))); - *(ckt->CKTstate0 + here->MOS3vds) = - *(ckt->CKTstate1 + here->MOS3vds); - vds = (1+xfact)* (*(ckt->CKTstate1 + here->MOS3vds)) - -(xfact * (*(ckt->CKTstate2 + here->MOS3vds))); - *(ckt->CKTstate0 + here->MOS3vbd) = - *(ckt->CKTstate0 + here->MOS3vbs)- - *(ckt->CKTstate0 + here->MOS3vds); - } else { -#endif /*PREDICTOR*/ - - /* general iteration */ - - vbs = model->MOS3type * ( - *(ckt->CKTrhsOld+here->MOS3bNode) - - *(ckt->CKTrhsOld+here->MOS3sNodePrime)); - vgs = model->MOS3type * ( - *(ckt->CKTrhsOld+here->MOS3gNode) - - *(ckt->CKTrhsOld+here->MOS3sNodePrime)); - vds = model->MOS3type * ( - *(ckt->CKTrhsOld+here->MOS3dNodePrime) - - *(ckt->CKTrhsOld+here->MOS3sNodePrime)); -#ifndef PREDICTOR - } -#endif /*PREDICTOR*/ - - /* now some common crunching for some more useful quantities */ - - vbd=vbs-vds; - vgd=vgs-vds; - vgdo = *(ckt->CKTstate0 + here->MOS3vgs) - - *(ckt->CKTstate0 + here->MOS3vds); - delvbs = vbs - *(ckt->CKTstate0 + here->MOS3vbs); - delvbd = vbd - *(ckt->CKTstate0 + here->MOS3vbd); - delvgs = vgs - *(ckt->CKTstate0 + here->MOS3vgs); - delvds = vds - *(ckt->CKTstate0 + here->MOS3vds); - delvgd = vgd-vgdo; - - /* these are needed for convergence testing */ - - if (here->MOS3mode >= 0) { - cdhat= - here->MOS3cd- - here->MOS3gbd * delvbd + - here->MOS3gmbs * delvbs + - here->MOS3gm * delvgs + - here->MOS3gds * delvds ; - } else { - cdhat= - here->MOS3cd - - ( here->MOS3gbd - - here->MOS3gmbs) * delvbd - - here->MOS3gm * delvgd + - here->MOS3gds * delvds ; - } - cbhat= - here->MOS3cbs + - here->MOS3cbd + - here->MOS3gbd * delvbd + - here->MOS3gbs * delvbs ; -#ifndef NOBYPASS - /* now lets see if we can bypass (ugh) */ - /* the following mess should be one if statement, but - * many compilers can't handle it all at once, so it - * is split into several successive if statements - */ - tempv = MAX(fabs(cbhat),fabs(here->MOS3cbs - + here->MOS3cbd))+ckt->CKTabstol; - if((!(ckt->CKTmode & (MODEINITPRED|MODEINITTRAN|MODEINITSMSIG) - )) && (ckt->CKTbypass) ) - if ( (fabs(cbhat-(here->MOS3cbs + - here->MOS3cbd)) < ckt->CKTreltol * - tempv)) - if( (fabs(delvbs) < (ckt->CKTreltol * MAX(fabs(vbs), - fabs(*(ckt->CKTstate0+here->MOS3vbs)))+ - ckt->CKTvoltTol))) - if ( (fabs(delvbd) < (ckt->CKTreltol * MAX(fabs(vbd), - fabs(*(ckt->CKTstate0+here->MOS3vbd)))+ - ckt->CKTvoltTol)) ) - if( (fabs(delvgs) < (ckt->CKTreltol * MAX(fabs(vgs), - fabs(*(ckt->CKTstate0+here->MOS3vgs)))+ - ckt->CKTvoltTol))) - if ( (fabs(delvds) < (ckt->CKTreltol * MAX(fabs(vds), - fabs(*(ckt->CKTstate0+here->MOS3vds)))+ - ckt->CKTvoltTol)) ) - if( (fabs(cdhat- here->MOS3cd) < - ckt->CKTreltol * MAX(fabs(cdhat),fabs( - here->MOS3cd)) + ckt->CKTabstol) ) { - /* bypass code */ - /* nothing interesting has changed since last - * iteration on this device, so we just - * copy all the values computed last iteration out - * and keep going - */ - vbs = *(ckt->CKTstate0 + here->MOS3vbs); - vbd = *(ckt->CKTstate0 + here->MOS3vbd); - vgs = *(ckt->CKTstate0 + here->MOS3vgs); - vds = *(ckt->CKTstate0 + here->MOS3vds); - vgd = vgs - vds; - vgb = vgs - vbs; - cdrain = here->MOS3mode * (here->MOS3cd + here->MOS3cbd); - if(ckt->CKTmode & (MODETRAN | MODETRANOP)) { - capgs = ( *(ckt->CKTstate0+here->MOS3capgs)+ - *(ckt->CKTstate1+here->MOS3capgs) + - GateSourceOverlapCap ); - capgd = ( *(ckt->CKTstate0+here->MOS3capgd)+ - *(ckt->CKTstate1+here->MOS3capgd) + - GateDrainOverlapCap ); - capgb = ( *(ckt->CKTstate0+here->MOS3capgb)+ - *(ckt->CKTstate1+here->MOS3capgb) + - GateBulkOverlapCap ); - } - goto bypass; - } -#endif /*NOBYPASS*/ - /* ok - bypass is out, do it the hard way */ - - von = model->MOS3type * here->MOS3von; - -#ifndef NODELIMITING - /* - * limiting - * we want to keep device voltages from changing - * so fast that the exponentials churn out overflows - * and similar rudeness - */ - - if(*(ckt->CKTstate0 + here->MOS3vds) >=0) { - vgs = DEVfetlim(vgs,*(ckt->CKTstate0 + here->MOS3vgs) - ,von); - vds = vgs - vgd; - vds = DEVlimvds(vds,*(ckt->CKTstate0 + here->MOS3vds)); - vgd = vgs - vds; - } else { - vgd = DEVfetlim(vgd,vgdo,von); - vds = vgs - vgd; - if(!(ckt->CKTfixLimit)) { - vds = -DEVlimvds(-vds,-(*(ckt->CKTstate0 + - here->MOS3vds))); - } - vgs = vgd + vds; - } - if(vds >= 0) { - vbs = DEVpnjlim(vbs,*(ckt->CKTstate0 + here->MOS3vbs), - vt,here->MOS3sourceVcrit,&Check); - vbd = vbs-vds; - } else { - vbd = DEVpnjlim(vbd,*(ckt->CKTstate0 + here->MOS3vbd), - vt,here->MOS3drainVcrit,&Check); - vbs = vbd + vds; - } -#endif /*NODELIMITING*/ - - } else { - - /* ok - not one of the simple cases, so we have to - * look at all of the possibilities for why we were - * called. We still just initialize the three voltages - */ - - if((ckt->CKTmode & MODEINITJCT) && !here->MOS3off) { - vds= model->MOS3type * here->MOS3icVDS; - vgs= model->MOS3type * here->MOS3icVGS; - vbs= model->MOS3type * here->MOS3icVBS; - if((vds==0) && (vgs==0) && (vbs==0) && - ((ckt->CKTmode & - (MODETRAN|MODEDCOP|MODEDCTRANCURVE)) || - (!(ckt->CKTmode & MODEUIC)))) { - vbs = -1; - vgs = model->MOS3type * here->MOS3tVto; - vds = 0; - } - } else { - vbs=vgs=vds=0; - } - } - - /* - * now all the preliminaries are over - we can start doing the - * real work - */ - vbd = vbs - vds; - vgd = vgs - vds; - vgb = vgs - vbs; - - - /* - * bulk-source and bulk-drain diodes - * here we just evaluate the ideal diode current and the - * corresponding derivative (conductance). - */ - -next1: if(vbs <= -3*vt) { - arg=3*vt/(vbs*CONSTe); - arg = arg * arg * arg; - here->MOS3cbs = -SourceSatCur*(1+arg)+ckt->CKTgmin*vbs; - here->MOS3gbs = SourceSatCur*3*arg/vbs+ckt->CKTgmin; - } else { - evbs = exp(MIN(MAX_EXP_ARG,vbs/vt)); - here->MOS3gbs = SourceSatCur*evbs/vt + ckt->CKTgmin; - here->MOS3cbs = SourceSatCur*(evbs-1) + ckt->CKTgmin*vbs; - } - if(vbd <= -3*vt) { - arg=3*vt/(vbd*CONSTe); - arg = arg * arg * arg; - here->MOS3cbd = -DrainSatCur*(1+arg)+ckt->CKTgmin*vbd; - here->MOS3gbd = DrainSatCur*3*arg/vbd+ckt->CKTgmin; - } else { - evbd = exp(MIN(MAX_EXP_ARG,vbd/vt)); - here->MOS3gbd = DrainSatCur*evbd/vt + ckt->CKTgmin; - here->MOS3cbd = DrainSatCur*(evbd-1) + ckt->CKTgmin*vbd; - } - - /* now to determine whether the user was able to correctly - * identify the source and drain of his device - */ - if(vds >= 0) { - /* normal mode */ - here->MOS3mode = 1; - } else { - /* inverse mode */ - here->MOS3mode = -1; - } - - { - /* - * subroutine moseq3(vds,vbs,vgs,gm,gds,gmbs, - * qg,qc,qb,cggb,cgdb,cgsb,cbgb,cbdb,cbsb) - */ - - /* this routine evaluates the drain current, its - * derivatives and the charges associated with the - * gate, channel and bulk for mosfets based on - * semi-empirical equations */ - - double coeff0 = 0.0631353e0; - double coeff1 = 0.8013292e0; - double coeff2 = -0.01110777e0; - double oneoverxl; /* 1/effective length */ - double eta; /* eta from model after length factor */ - double phibs; /* phi - vbs */ - double sqphbs; /* square root of phibs */ - double dsqdvb; /* */ - double sqphis; /* square root of phi */ - double sqphs3; /* square root of phi cubed */ - double wps; - double oneoverxj; /* 1/junction depth */ - double xjonxl; /* junction depth/effective length */ - double djonxj; - double wponxj; - double arga; - double argb; - double argc; - double dwpdvb; - double dadvb; - double dbdvb; - double gammas; - double fbodys; - double fbody; - double onfbdy; - double qbonco; - double vbix; - double wconxj; - double dfsdvb; - double dfbdvb; - double dqbdvb; - double vth; - double dvtdvb; - double csonco; - double cdonco; - double dxndvb = 0.0; - double dvodvb = 0.0; - double dvodvd = 0.0; - double vgsx; - double dvtdvd; - double onfg; - double fgate; - double us; - double dfgdvg; - double dfgdvd; - double dfgdvb; - double dvsdvg; - double dvsdvb; - double dvsdvd; - double xn = 0.0; - double vdsc; - double onvdsc = 0.0; - double dvsdga; - double vdsx; - double dcodvb; - double cdnorm; - double cdo; - double cd1; - double fdrain = 0.0; - double fd2; - double dfddvg = 0.0; - double dfddvb = 0.0; - double dfddvd = 0.0; - double gdsat; - double cdsat; - double gdoncd; - double gdonfd; - double gdonfg; - double dgdvg; - double dgdvd; - double dgdvb; - double emax; - double emongd; - double demdvg; - double demdvd; - double demdvb; - double delxl; - double dldvd; - double dldem; - double ddldvg; - double ddldvd; - double ddldvb; - double dlonxl; - double xlfact; - double diddl; - double gds0 = 0.0; - double emoncd; - double ondvt; - double onxn; - double wfact; - double gms; - double gmw; - double fshort; - - /* - * bypasses the computation of charges - */ - - /* - * reference cdrain equations to source and - * charge equations to bulk - */ - vdsat = 0.0; - oneoverxl = 1.0/EffectiveLength; - eta = model->MOS3eta * 8.15e-22/(model->MOS3oxideCapFactor* - EffectiveLength*EffectiveLength*EffectiveLength); - /* - *.....square root term - */ - if ( (here->MOS3mode==1?vbs:vbd) <= 0.0 ) { - phibs = here->MOS3tPhi-(here->MOS3mode==1?vbs:vbd); - sqphbs = sqrt(phibs); - dsqdvb = -0.5/sqphbs; - } else { - sqphis = sqrt(here->MOS3tPhi); - sqphs3 = here->MOS3tPhi*sqphis; - sqphbs = sqphis/(1.0+(here->MOS3mode==1?vbs:vbd)/ - (here->MOS3tPhi+here->MOS3tPhi)); - phibs = sqphbs*sqphbs; - dsqdvb = -phibs/(sqphs3+sqphs3); - } - /* - *.....short channel effect factor - */ - if ( (model->MOS3junctionDepth != 0.0) && - (model->MOS3coeffDepLayWidth != 0.0) ) { - wps = model->MOS3coeffDepLayWidth*sqphbs; - oneoverxj = 1.0/model->MOS3junctionDepth; - xjonxl = model->MOS3junctionDepth*oneoverxl; - djonxj = model->MOS3latDiff*oneoverxj; - wponxj = wps*oneoverxj; - wconxj = coeff0+coeff1*wponxj+coeff2*wponxj*wponxj; - arga = wconxj+djonxj; - argc = wponxj/(1.0+wponxj); - argb = sqrt(1.0-argc*argc); - fshort = 1.0-xjonxl*(arga*argb-djonxj); - dwpdvb = model->MOS3coeffDepLayWidth*dsqdvb; - dadvb = (coeff1+coeff2*(wponxj+wponxj))*dwpdvb*oneoverxj; - dbdvb = -argc*argc*(1.0-argc)*dwpdvb/(argb*wps); - dfsdvb = -xjonxl*(dadvb*argb+arga*dbdvb); - } else { - fshort = 1.0; - dfsdvb = 0.0; - } - /* - *.....body effect - */ - gammas = model->MOS3gamma*fshort; - fbodys = 0.5*gammas/(sqphbs+sqphbs); - fbody = fbodys+model->MOS3narrowFactor/EffectiveWidth; - onfbdy = 1.0/(1.0+fbody); - dfbdvb = -fbodys*dsqdvb/sqphbs+fbodys*dfsdvb/fshort; - qbonco =gammas*sqphbs+model->MOS3narrowFactor*phibs/EffectiveWidth; - dqbdvb = gammas*dsqdvb+model->MOS3gamma*dfsdvb*sqphbs- - model->MOS3narrowFactor/EffectiveWidth; - /* - *.....static feedback effect - */ - vbix = here->MOS3tVbi*model->MOS3type-eta*(here->MOS3mode*vds); - /* - *.....threshold voltage - */ - vth = vbix+qbonco; - dvtdvd = -eta; - dvtdvb = dqbdvb; - /* - *.....joint weak inversion and strong inversion - */ - von = vth; - if ( model->MOS3fastSurfaceStateDensity != 0.0 ) { - csonco = CHARGE*model->MOS3fastSurfaceStateDensity * - 1e4 /*(cm**2/m**2)*/ *EffectiveLength*EffectiveWidth * - here->MOS3m/OxideCap; - cdonco = qbonco/(phibs+phibs); - xn = 1.0+csonco+cdonco; - von = vth+vt*xn; - dxndvb = dqbdvb/(phibs+phibs)-qbonco*dsqdvb/(phibs*sqphbs); - dvodvd = dvtdvd; - dvodvb = dvtdvb+vt*dxndvb; - } else { - /* - *.....cutoff region - */ - if ( (here->MOS3mode==1?vgs:vgd) <= von ) { - cdrain = 0.0; - here->MOS3gm = 0.0; - here->MOS3gds = 0.0; - here->MOS3gmbs = 0.0; - goto innerline1000; - } - } - /* - *.....device is on - */ - vgsx = MAX((here->MOS3mode==1?vgs:vgd),von); - /* - *.....mobility modulation by gate voltage - */ - onfg = 1.0+model->MOS3theta*(vgsx-vth); - fgate = 1.0/onfg; - us = here->MOS3tSurfMob * 1e-4 /*(m**2/cm**2)*/ *fgate; - dfgdvg = -model->MOS3theta*fgate*fgate; - dfgdvd = -dfgdvg*dvtdvd; - dfgdvb = -dfgdvg*dvtdvb; - /* - *.....saturation voltage - */ - vdsat = (vgsx-vth)*onfbdy; - if ( model->MOS3maxDriftVel <= 0.0 ) { - dvsdvg = onfbdy; - dvsdvd = -dvsdvg*dvtdvd; - dvsdvb = -dvsdvg*dvtdvb-vdsat*dfbdvb*onfbdy; - } else { - vdsc = EffectiveLength*model->MOS3maxDriftVel/us; - onvdsc = 1.0/vdsc; - arga = (vgsx-vth)*onfbdy; - argb = sqrt(arga*arga+vdsc*vdsc); - vdsat = arga+vdsc-argb; - dvsdga = (1.0-arga/argb)*onfbdy; - dvsdvg = dvsdga-(1.0-vdsc/argb)*vdsc*dfgdvg*onfg; - dvsdvd = -dvsdvg*dvtdvd; - dvsdvb = -dvsdvg*dvtdvb-arga*dvsdga*dfbdvb; - } - /* - *.....current factors in linear region - */ - vdsx = MIN((here->MOS3mode*vds),vdsat); - if ( vdsx == 0.0 ) goto line900; - cdo = vgsx-vth-0.5*(1.0+fbody)*vdsx; - dcodvb = -dvtdvb-0.5*dfbdvb*vdsx; - /* - *.....normalized drain current - */ - cdnorm = cdo*vdsx; - here->MOS3gm = vdsx; - if ((here->MOS3mode*vds) > vdsat) here->MOS3gds = -dvtdvd*vdsx; - else here->MOS3gds = vgsx-vth-(1.0+fbody+dvtdvd)*vdsx; - here->MOS3gmbs = dcodvb*vdsx; - /* - *.....drain current without velocity saturation effect - */ - cd1 = Beta*cdnorm; - Beta = Beta*fgate; - cdrain = Beta*cdnorm; - here->MOS3gm = Beta*here->MOS3gm+dfgdvg*cd1; - here->MOS3gds = Beta*here->MOS3gds+dfgdvd*cd1; - here->MOS3gmbs = Beta*here->MOS3gmbs+dfgdvb*cd1; - /* - *.....velocity saturation factor - */ - if ( model->MOS3maxDriftVel > 0.0 ) { - fdrain = 1.0/(1.0+vdsx*onvdsc); - fd2 = fdrain*fdrain; - arga = fd2*vdsx*onvdsc*onfg; - dfddvg = -dfgdvg*arga; - if ((here->MOS3mode*vds) > vdsat) dfddvd = -dfgdvd*arga; - else dfddvd = -dfgdvd*arga-fd2*onvdsc; - dfddvb = -dfgdvb*arga; - /* - *.....drain current - */ - here->MOS3gm = fdrain*here->MOS3gm+dfddvg*cdrain; - here->MOS3gds = fdrain*here->MOS3gds+dfddvd*cdrain; - here->MOS3gmbs = fdrain*here->MOS3gmbs+dfddvb*cdrain; - cdrain = fdrain*cdrain; - Beta = Beta*fdrain; - } - /* - *.....channel length modulation - */ - - if ( (here->MOS3mode*vds) <= vdsat ) { - if ( (model->MOS3maxDriftVel > 0.0) || - (model->MOS3alpha == 0.0) || - (ckt->CKTbadMos3) ) goto line700; - else { - arga = (here->MOS3mode*vds)/vdsat; - delxl = sqrt(model->MOS3kappa*model->MOS3alpha*vdsat/8); - dldvd = 4*delxl*arga*arga*arga/vdsat; - arga *= arga; - arga *= arga; - delxl *= arga; - ddldvg = 0.0; - ddldvd = -dldvd; - ddldvb = 0.0; - goto line520; - } - } - - if ( model->MOS3maxDriftVel <= 0.0 ) goto line510; - if (model->MOS3alpha == 0.0) goto line700; - cdsat = cdrain; - gdsat = cdsat*(1.0-fdrain)*onvdsc; - gdsat = MAX(1.0e-12,gdsat); - gdoncd = gdsat/cdsat; - gdonfd = gdsat/(1.0-fdrain); - gdonfg = gdsat*onfg; - dgdvg = gdoncd*here->MOS3gm-gdonfd*dfddvg+gdonfg*dfgdvg; - dgdvd = gdoncd*here->MOS3gds-gdonfd*dfddvd+gdonfg*dfgdvd; - dgdvb = gdoncd*here->MOS3gmbs-gdonfd*dfddvb+gdonfg*dfgdvb; - - if (ckt->CKTbadMos3) - emax = cdsat*oneoverxl/gdsat; - else - emax = model->MOS3kappa * cdsat*oneoverxl/gdsat; - emoncd = emax/cdsat; - emongd = emax/gdsat; - demdvg = emoncd*here->MOS3gm-emongd*dgdvg; - demdvd = emoncd*here->MOS3gds-emongd*dgdvd; - demdvb = emoncd*here->MOS3gmbs-emongd*dgdvb; - - arga = 0.5*emax*model->MOS3alpha; - argc = model->MOS3kappa*model->MOS3alpha; - argb = sqrt(arga*arga+argc*((here->MOS3mode*vds)-vdsat)); - delxl = argb-arga; - if (argb != 0.0) { - dldvd = argc/(argb+argb); - dldem = 0.5*(arga/argb-1.0)*model->MOS3alpha; - } else { - dldvd = 0.0; - dldem = 0.0; - } - ddldvg = dldem*demdvg; - ddldvd = dldem*demdvd-dldvd; - ddldvb = dldem*demdvb; - goto line520; -line510: - if (ckt->CKTbadMos3) { - delxl = sqrt(model->MOS3kappa*((here->MOS3mode*vds)-vdsat)* - model->MOS3alpha); - dldvd = 0.5*delxl/((here->MOS3mode*vds)-vdsat); - } else { - delxl = sqrt(model->MOS3kappa*model->MOS3alpha* - ((here->MOS3mode*vds)-vdsat+(vdsat/8))); - dldvd = 0.5*delxl/((here->MOS3mode*vds)-vdsat+(vdsat/8)); - } - ddldvg = 0.0; - ddldvd = -dldvd; - ddldvb = 0.0; - /* - *.....punch through approximation - */ -line520: - if ( delxl > (0.5*EffectiveLength) ) { - delxl = EffectiveLength-(EffectiveLength*EffectiveLength/ - (4.0*delxl)); - arga = 4.0*(EffectiveLength-delxl)*(EffectiveLength-delxl)/ - (EffectiveLength*EffectiveLength); - ddldvg = ddldvg*arga; - ddldvd = ddldvd*arga; - ddldvb = ddldvb*arga; - dldvd = dldvd*arga; - } - /* - *.....saturation region - */ - dlonxl = delxl*oneoverxl; - xlfact = 1.0/(1.0-dlonxl); - - cd1 = cdrain; - cdrain = cdrain*xlfact; - diddl = cdrain/(EffectiveLength-delxl); - here->MOS3gm = here->MOS3gm*xlfact+diddl*ddldvg; - here->MOS3gmbs = here->MOS3gmbs*xlfact+diddl*ddldvb; - gds0 = diddl*ddldvd; - here->MOS3gm = here->MOS3gm+gds0*dvsdvg; - here->MOS3gmbs = here->MOS3gmbs+gds0*dvsdvb; - here->MOS3gds = here->MOS3gds*xlfact+diddl*dldvd+gds0*dvsdvd; -/* here->MOS3gds = (here->MOS3gds*xlfact)+gds0*dvsdvd- - (cd1*ddldvd/(EffectiveLength*(1-2*dlonxl+dlonxl*dlonxl)));*/ - - /* - *.....finish strong inversion case - */ -line700: - if ( (here->MOS3mode==1?vgs:vgd) < von ) { - /* - *.....weak inversion - */ - onxn = 1.0/xn; - ondvt = onxn/vt; - wfact = exp( ((here->MOS3mode==1?vgs:vgd)-von)*ondvt ); - cdrain = cdrain*wfact; - gms = here->MOS3gm*wfact; - gmw = cdrain*ondvt; - here->MOS3gm = gmw; - if ((here->MOS3mode*vds) > vdsat) { - here->MOS3gm = here->MOS3gm+gds0*dvsdvg*wfact; - } - here->MOS3gds = here->MOS3gds*wfact+(gms-gmw)*dvodvd; - here->MOS3gmbs = here->MOS3gmbs*wfact+(gms-gmw)*dvodvb-gmw* - ((here->MOS3mode==1?vgs:vgd)-von)*onxn*dxndvb; - } - /* - *.....charge computation - */ - goto innerline1000; - /* - *.....special case of vds = 0.0d0 - */ -line900: - Beta = Beta*fgate; - cdrain = 0.0; - here->MOS3gm = 0.0; - here->MOS3gds = Beta*(vgsx-vth); - here->MOS3gmbs = 0.0; - if ( (model->MOS3fastSurfaceStateDensity != 0.0) && - ((here->MOS3mode==1?vgs:vgd) < von) ) { - here->MOS3gds *=exp(((here->MOS3mode==1?vgs:vgd)-von)/(vt*xn)); - } -innerline1000:; - /* - *.....done - */ - } - - - /* now deal with n vs p polarity */ - - here->MOS3von = model->MOS3type * von; - here->MOS3vdsat = model->MOS3type * vdsat; - /* line 490 */ - /* - * COMPUTE EQUIVALENT DRAIN CURRENT SOURCE - */ - here->MOS3cd=here->MOS3mode * cdrain - here->MOS3cbd; - - if (ckt->CKTmode & (MODETRAN | MODETRANOP | MODEINITSMSIG)) { - /* - * now we do the hard part of the bulk-drain and bulk-source - * diode - we evaluate the non-linear capacitance and - * charge - * - * the basic equations are not hard, but the implementation - * is somewhat long in an attempt to avoid log/exponential - * evaluations - */ - /* - * charge storage elements - * - *.. bulk-drain and bulk-source depletion capacitances - */ -#ifdef CAPBYPASS - if(((ckt->CKTmode & (MODEINITPRED | MODEINITTRAN) ) || - fabs(delvbs) >= ckt->CKTreltol * MAX(fabs(vbs), - fabs(*(ckt->CKTstate0+here->MOS3vbs)))+ - ckt->CKTvoltTol)|| senflag ) -#endif /*CAPBYPASS*/ - - { - /* can't bypass the diode capacitance calculations */ - if(here->MOS3Cbs != 0 || here->MOS3Cbssw != 0 ) { - if (vbs < here->MOS3tDepCap){ - arg=1-vbs/here->MOS3tBulkPot; - /* - * the following block looks somewhat long and messy, - * but since most users use the default grading - * coefficients of .5, and sqrt is MUCH faster than an - * exp(log()) we use this special case code to buy time. - * (as much as 10% of total job time!) - */ - if(model->MOS3bulkJctBotGradingCoeff == - model->MOS3bulkJctSideGradingCoeff) { - if(model->MOS3bulkJctBotGradingCoeff == .5) { - sarg = sargsw = 1/sqrt(arg); - } else { - sarg = sargsw = - exp(-model->MOS3bulkJctBotGradingCoeff* - log(arg)); - } - } else { - if(model->MOS3bulkJctBotGradingCoeff == .5) { - sarg = 1/sqrt(arg); - } else { - sarg = exp(-model->MOS3bulkJctBotGradingCoeff* - log(arg)); - } - if(model->MOS3bulkJctSideGradingCoeff == .5) { - sargsw = 1/sqrt(arg); - } else { - sargsw =exp(-model->MOS3bulkJctSideGradingCoeff* - log(arg)); - } - } - *(ckt->CKTstate0 + here->MOS3qbs) = - here->MOS3tBulkPot*(here->MOS3Cbs* - (1-arg*sarg)/(1-model->MOS3bulkJctBotGradingCoeff) - +here->MOS3Cbssw* - (1-arg*sargsw)/ - (1-model->MOS3bulkJctSideGradingCoeff)); - here->MOS3capbs=here->MOS3Cbs*sarg+ - here->MOS3Cbssw*sargsw; - } else { - *(ckt->CKTstate0 + here->MOS3qbs) = here->MOS3f4s + - vbs*(here->MOS3f2s+vbs*(here->MOS3f3s/2)); - here->MOS3capbs=here->MOS3f2s+here->MOS3f3s*vbs; - } - } else { - *(ckt->CKTstate0 + here->MOS3qbs) = 0; - here->MOS3capbs=0; - } - } -#ifdef CAPBYPASS - if(((ckt->CKTmode & (MODEINITPRED | MODEINITTRAN) ) || - fabs(delvbd) >= ckt->CKTreltol * MAX(fabs(vbd), - fabs(*(ckt->CKTstate0+here->MOS3vbd)))+ - ckt->CKTvoltTol)|| senflag ) -#endif /*CAPBYPASS*/ - /* can't bypass the diode capacitance calculations */ - { - if(here->MOS3Cbd != 0 || here->MOS3Cbdsw != 0 ) { - if (vbd < here->MOS3tDepCap) { - arg=1-vbd/here->MOS3tBulkPot; - /* - * the following block looks somewhat long and messy, - * but since most users use the default grading - * coefficients of .5, and sqrt is MUCH faster than an - * exp(log()) we use this special case code to buy time. - * (as much as 10% of total job time!) - */ - if(model->MOS3bulkJctBotGradingCoeff == .5 && - model->MOS3bulkJctSideGradingCoeff == .5) { - sarg = sargsw = 1/sqrt(arg); - } else { - if(model->MOS3bulkJctBotGradingCoeff == .5) { - sarg = 1/sqrt(arg); - } else { - sarg = exp(-model->MOS3bulkJctBotGradingCoeff* - log(arg)); - } - if(model->MOS3bulkJctSideGradingCoeff == .5) { - sargsw = 1/sqrt(arg); - } else { - sargsw =exp(-model->MOS3bulkJctSideGradingCoeff* - log(arg)); - } - } - *(ckt->CKTstate0 + here->MOS3qbd) = - here->MOS3tBulkPot*(here->MOS3Cbd* - (1-arg*sarg) - /(1-model->MOS3bulkJctBotGradingCoeff) - +here->MOS3Cbdsw* - (1-arg*sargsw) - /(1-model->MOS3bulkJctSideGradingCoeff)); - here->MOS3capbd=here->MOS3Cbd*sarg+ - here->MOS3Cbdsw*sargsw; - } else { - *(ckt->CKTstate0 + here->MOS3qbd) = here->MOS3f4d + - vbd * (here->MOS3f2d + vbd * here->MOS3f3d/2); - here->MOS3capbd=here->MOS3f2d + vbd * here->MOS3f3d; - } - } else { - *(ckt->CKTstate0 + here->MOS3qbd) = 0; - here->MOS3capbd = 0; - } - } - if(SenCond && (ckt->CKTsenInfo->SENmode==TRANSEN)) goto next2; - - if ( ckt->CKTmode & MODETRAN ) { - /* (above only excludes tranop, since we're only at this - * point if tran or tranop ) - */ - - /* - * calculate equivalent conductances and currents for - * depletion capacitors - */ - - /* integrate the capacitors and save results */ - - error = NIintegrate(ckt,&geq,&ceq,here->MOS3capbd, - here->MOS3qbd); - if(error) return(error); - here->MOS3gbd += geq; - here->MOS3cbd += *(ckt->CKTstate0 + here->MOS3cqbd); - here->MOS3cd -= *(ckt->CKTstate0 + here->MOS3cqbd); - error = NIintegrate(ckt,&geq,&ceq,here->MOS3capbs, - here->MOS3qbs); - if(error) return(error); - here->MOS3gbs += geq; - here->MOS3cbs += *(ckt->CKTstate0 + here->MOS3cqbs); - } - } - if(SenCond) goto next2; - - /* - * check convergence - */ - if ( (here->MOS3off == 0) || - (!(ckt->CKTmode & (MODEINITFIX|MODEINITSMSIG))) ){ - if (Check == 1) { - ckt->CKTnoncon++; - ckt->CKTtroubleElt = (GENinstance *) here; - } - } - - - /* save things away for next time */ - - next2: *(ckt->CKTstate0 + here->MOS3vbs) = vbs; - *(ckt->CKTstate0 + here->MOS3vbd) = vbd; - *(ckt->CKTstate0 + here->MOS3vgs) = vgs; - *(ckt->CKTstate0 + here->MOS3vds) = vds; - - - /* - * meyer's capacitor model - */ - if ( ckt->CKTmode & (MODETRAN | MODETRANOP | MODEINITSMSIG) ) { - /* - * calculate meyer's capacitors - */ - /* - * new cmeyer - this just evaluates at the current time, - * expects you to remember values from previous time - * returns 1/2 of non-constant portion of capacitance - * you must add in the other half from previous time - * and the constant part - */ - if (here->MOS3mode > 0){ - DEVqmeyer (vgs,vgd,vgb,von,vdsat, - (ckt->CKTstate0 + here->MOS3capgs), - (ckt->CKTstate0 + here->MOS3capgd), - (ckt->CKTstate0 + here->MOS3capgb), - here->MOS3tPhi,OxideCap); - } else { - DEVqmeyer (vgd,vgs,vgb,von,vdsat, - (ckt->CKTstate0 + here->MOS3capgd), - (ckt->CKTstate0 + here->MOS3capgs), - (ckt->CKTstate0 + here->MOS3capgb), - here->MOS3tPhi,OxideCap); - } - vgs1 = *(ckt->CKTstate1 + here->MOS3vgs); - vgd1 = vgs1 - *(ckt->CKTstate1 + here->MOS3vds); - vgb1 = vgs1 - *(ckt->CKTstate1 + here->MOS3vbs); - if(ckt->CKTmode & MODETRANOP) { - capgs = 2 * *(ckt->CKTstate0+here->MOS3capgs)+ - GateSourceOverlapCap ; - capgd = 2 * *(ckt->CKTstate0+here->MOS3capgd)+ - GateDrainOverlapCap ; - capgb = 2 * *(ckt->CKTstate0+here->MOS3capgb)+ - GateBulkOverlapCap ; - } else { - capgs = ( *(ckt->CKTstate0+here->MOS3capgs)+ - *(ckt->CKTstate1+here->MOS3capgs) + - GateSourceOverlapCap ); - capgd = ( *(ckt->CKTstate0+here->MOS3capgd)+ - *(ckt->CKTstate1+here->MOS3capgd) + - GateDrainOverlapCap ); - capgb = ( *(ckt->CKTstate0+here->MOS3capgb)+ - *(ckt->CKTstate1+here->MOS3capgb) + - GateBulkOverlapCap ); - } - if(ckt->CKTsenInfo){ - here->MOS3cgs = capgs; - here->MOS3cgd = capgd; - here->MOS3cgb = capgb; - } - - /* - * store small-signal parameters (for meyer's model) - * all parameters already stored, so done... - */ - - - if(SenCond){ - if(ckt->CKTsenInfo->SENmode & (DCSEN|ACSEN)) { - continue; - } - } -#ifndef PREDICTOR - if (ckt->CKTmode & (MODEINITPRED | MODEINITTRAN) ) { - *(ckt->CKTstate0 + here->MOS3qgs) = - (1+xfact) * *(ckt->CKTstate1 + here->MOS3qgs) - - xfact * *(ckt->CKTstate2 + here->MOS3qgs); - *(ckt->CKTstate0 + here->MOS3qgd) = - (1+xfact) * *(ckt->CKTstate1 + here->MOS3qgd) - - xfact * *(ckt->CKTstate2 + here->MOS3qgd); - *(ckt->CKTstate0 + here->MOS3qgb) = - (1+xfact) * *(ckt->CKTstate1 + here->MOS3qgb) - - xfact * *(ckt->CKTstate2 + here->MOS3qgb); - } else { -#endif /*PREDICTOR*/ - if(ckt->CKTmode & MODETRAN) { - *(ckt->CKTstate0 + here->MOS3qgs) = (vgs-vgs1)*capgs + - *(ckt->CKTstate1 + here->MOS3qgs) ; - *(ckt->CKTstate0 + here->MOS3qgd) = (vgd-vgd1)*capgd + - *(ckt->CKTstate1 + here->MOS3qgd) ; - *(ckt->CKTstate0 + here->MOS3qgb) = (vgb-vgb1)*capgb + - *(ckt->CKTstate1 + here->MOS3qgb) ; - } else { - /* TRANOP only */ - *(ckt->CKTstate0 + here->MOS3qgs) = vgs*capgs; - *(ckt->CKTstate0 + here->MOS3qgd) = vgd*capgd; - *(ckt->CKTstate0 + here->MOS3qgb) = vgb*capgb; - } -#ifndef PREDICTOR - } -#endif /*PREDICTOR*/ - } -#ifndef NOBYPASS - bypass: -#endif - if(SenCond) continue; - - if ( (ckt->CKTmode & (MODEINITTRAN)) || - (! (ckt->CKTmode & (MODETRAN)) ) ) { - /* - * initialize to zero charge conductances - * and current - */ - gcgs=0; - ceqgs=0; - gcgd=0; - ceqgd=0; - gcgb=0; - ceqgb=0; - } else { - if(capgs == 0) *(ckt->CKTstate0 + here->MOS3cqgs) =0; - if(capgd == 0) *(ckt->CKTstate0 + here->MOS3cqgd) =0; - if(capgb == 0) *(ckt->CKTstate0 + here->MOS3cqgb) =0; - /* - * calculate equivalent conductances and currents for - * meyer"s capacitors - */ - error = NIintegrate(ckt,&gcgs,&ceqgs,capgs,here->MOS3qgs); - if(error) return(error); - error = NIintegrate(ckt,&gcgd,&ceqgd,capgd,here->MOS3qgd); - if(error) return(error); - error = NIintegrate(ckt,&gcgb,&ceqgb,capgb,here->MOS3qgb); - if(error) return(error); - ceqgs=ceqgs-gcgs*vgs+ckt->CKTag[0]* - *(ckt->CKTstate0 + here->MOS3qgs); - ceqgd=ceqgd-gcgd*vgd+ckt->CKTag[0]* - *(ckt->CKTstate0 + here->MOS3qgd); - ceqgb=ceqgb-gcgb*vgb+ckt->CKTag[0]* - *(ckt->CKTstate0 + here->MOS3qgb); - } - /* - * store charge storage info for meyer's cap in lx table - */ - - /* - * load current vector - */ - ceqbs = model->MOS3type * - (here->MOS3cbs-(here->MOS3gbs)*vbs); - ceqbd = model->MOS3type * - (here->MOS3cbd-(here->MOS3gbd)*vbd); - if (here->MOS3mode >= 0) { - xnrm=1; - xrev=0; - cdreq=model->MOS3type*(cdrain-here->MOS3gds*vds- - here->MOS3gm*vgs-here->MOS3gmbs*vbs); - } else { - xnrm=0; - xrev=1; - cdreq = -(model->MOS3type)*(cdrain-here->MOS3gds*(-vds)- - here->MOS3gm*vgd-here->MOS3gmbs*vbd); - } - *(ckt->CKTrhs + here->MOS3gNode) -= - (model->MOS3type * (ceqgs + ceqgb + ceqgd)); - *(ckt->CKTrhs + here->MOS3bNode) -= - (ceqbs + ceqbd - model->MOS3type * ceqgb); - *(ckt->CKTrhs + here->MOS3dNodePrime) += - (ceqbd - cdreq + model->MOS3type * ceqgd); - *(ckt->CKTrhs + here->MOS3sNodePrime) += - cdreq + ceqbs + model->MOS3type * ceqgs; - /* - * load y matrix - */ -#if 0 -printf(" loading %s at time %g\n",here->MOS3name,ckt->CKTtime); -printf("%g %g %g %g %g\n", here->MOS3drainConductance,gcgd+gcgs+gcgb, - here->MOS3sourceConductance,here->MOS3gbd,here->MOS3gbs); -printf("%g %g %g %g %g\n",-gcgb,0.0,0.0,here->MOS3gds,here->MOS3gm); -printf("%g %g %g %g %g\n", here->MOS3gds,here->MOS3gmbs,gcgd,-gcgs,-gcgd); -printf("%g %g %g %g %g\n", -gcgs,-gcgd,0.0,-gcgs,0.0); -#endif - *(here->MOS3DdPtr) += (here->MOS3drainConductance); - *(here->MOS3GgPtr) += ((gcgd+gcgs+gcgb)); - *(here->MOS3SsPtr) += (here->MOS3sourceConductance); - *(here->MOS3BbPtr) += (here->MOS3gbd+here->MOS3gbs+gcgb); - *(here->MOS3DPdpPtr) += - (here->MOS3drainConductance+here->MOS3gds+ - here->MOS3gbd+xrev*(here->MOS3gm+here->MOS3gmbs)+gcgd); - *(here->MOS3SPspPtr) += - (here->MOS3sourceConductance+here->MOS3gds+ - here->MOS3gbs+xnrm*(here->MOS3gm+here->MOS3gmbs)+gcgs); - *(here->MOS3DdpPtr) += (-here->MOS3drainConductance); - *(here->MOS3GbPtr) -= gcgb; - *(here->MOS3GdpPtr) -= gcgd; - *(here->MOS3GspPtr) -= gcgs; - *(here->MOS3SspPtr) += (-here->MOS3sourceConductance); - *(here->MOS3BgPtr) -= gcgb; - *(here->MOS3BdpPtr) -= here->MOS3gbd; - *(here->MOS3BspPtr) -= here->MOS3gbs; - *(here->MOS3DPdPtr) += (-here->MOS3drainConductance); - *(here->MOS3DPgPtr) += ((xnrm-xrev)*here->MOS3gm-gcgd); - *(here->MOS3DPbPtr) += (-here->MOS3gbd+(xnrm-xrev)*here->MOS3gmbs); - *(here->MOS3DPspPtr) += (-here->MOS3gds- - xnrm*(here->MOS3gm+here->MOS3gmbs)); - *(here->MOS3SPgPtr) += (-(xnrm-xrev)*here->MOS3gm-gcgs); - *(here->MOS3SPsPtr) += (-here->MOS3sourceConductance); - *(here->MOS3SPbPtr) += (-here->MOS3gbs-(xnrm-xrev)*here->MOS3gmbs); - *(here->MOS3SPdpPtr) += (-here->MOS3gds- - xrev*(here->MOS3gm+here->MOS3gmbs)); - } - } - return(OK); -} - diff --git a/src/spicelib/devices/mos3/mos3mask.c b/src/spicelib/devices/mos3/mos3mask.c deleted file mode 100644 index d66c89029..000000000 --- a/src/spicelib/devices/mos3/mos3mask.c +++ /dev/null @@ -1,168 +0,0 @@ -/********** -Copyright 1990 Regents of the University of California. All rights reserved. -Author: 1987 Thomas L. Quarles -Modified: 2000 AlansFixes -**********/ -/* - */ - -#include "ngspice/ngspice.h" -#include "ngspice/const.h" -#include "ngspice/ifsim.h" -#include "ngspice/cktdefs.h" -#include "ngspice/devdefs.h" -#include "mos3defs.h" -#include "ngspice/sperror.h" -#include "ngspice/suffix.h" - - -/*ARGSUSED*/ -int -MOS3mAsk(CKTcircuit *ckt, GENmodel *inst, int which, IFvalue *value) -{ - MOS3model *here = (MOS3model *)inst; - - NG_IGNORE(ckt); - - switch(which) { - case MOS3_MOD_TNOM: - value->rValue = here->MOS3tnom-CONSTCtoK; - return(OK); - case MOS3_MOD_VTO: - value->rValue = here->MOS3vt0; - return(OK); - case MOS3_MOD_KP: - value->rValue = here->MOS3transconductance; - return(OK); - case MOS3_MOD_GAMMA: - value->rValue = here->MOS3gamma; - return(OK); - case MOS3_MOD_PHI: - value->rValue = here->MOS3phi; - return(OK); - case MOS3_MOD_RD: - value->rValue = here->MOS3drainResistance; - return(OK); - case MOS3_MOD_RS: - value->rValue = here->MOS3sourceResistance; - return(OK); - case MOS3_MOD_CBD: - value->rValue = here->MOS3capBD; - return(OK); - case MOS3_MOD_CBS: - value->rValue = here->MOS3capBS; - return(OK); - case MOS3_MOD_IS: - value->rValue = here->MOS3jctSatCur; - return(OK); - case MOS3_MOD_PB: - value->rValue = here->MOS3bulkJctPotential; - return(OK); - case MOS3_MOD_CGSO: - value->rValue = here->MOS3gateSourceOverlapCapFactor; - return(OK); - case MOS3_MOD_CGDO: - value->rValue = here->MOS3gateDrainOverlapCapFactor; - return(OK); - case MOS3_MOD_CGBO: - value->rValue = here->MOS3gateBulkOverlapCapFactor; - return(OK); - case MOS3_MOD_CJ: - value->rValue = here->MOS3bulkCapFactor; - return(OK); - case MOS3_MOD_MJ: - value->rValue = here->MOS3bulkJctBotGradingCoeff; - return(OK); - case MOS3_MOD_CJSW: - value->rValue = here->MOS3sideWallCapFactor; - return(OK); - case MOS3_MOD_MJSW: - value->rValue = here->MOS3bulkJctSideGradingCoeff; - return(OK); - case MOS3_MOD_JS: - value->rValue = here->MOS3jctSatCurDensity; - return(OK); - case MOS3_MOD_TOX: - value->rValue = here->MOS3oxideThickness; - return(OK); - case MOS3_MOD_LD: - value->rValue = here->MOS3latDiff; - return(OK); - case MOS3_MOD_XL: - value->rValue = here->MOS3lengthAdjust; - return(OK); - case MOS3_MOD_WD: - value->rValue = here->MOS3widthNarrow; - return(OK); - case MOS3_MOD_XW: - value->rValue = here->MOS3widthAdjust; - return(OK); - case MOS3_MOD_DELVTO: - value->rValue = here->MOS3delvt0; - return(OK); - case MOS3_MOD_RSH: - value->rValue = here->MOS3sheetResistance; - return(OK); - case MOS3_MOD_U0: - value->rValue = here->MOS3surfaceMobility; - return(OK); - case MOS3_MOD_FC: - value->rValue = here->MOS3fwdCapDepCoeff; - return(OK); - case MOS3_MOD_NSUB: - value->rValue = here->MOS3substrateDoping; - return(OK); - case MOS3_MOD_TPG: - value->iValue = here->MOS3gateType; - return(OK); - case MOS3_MOD_NSS: - value->rValue = here->MOS3surfaceStateDensity; - return(OK); - case MOS3_MOD_NFS: - value->rValue = here->MOS3fastSurfaceStateDensity; - return(OK); - case MOS3_MOD_DELTA: - value->rValue = here->MOS3narrowFactor; - return(OK); - case MOS3_MOD_VMAX: - value->rValue = here->MOS3maxDriftVel; - return(OK); - case MOS3_MOD_XJ: - value->rValue = here->MOS3junctionDepth; - return(OK); - case MOS3_MOD_ETA: - value->rValue = here->MOS3eta; - return(OK); - case MOS3_MOD_XD: - value->rValue = here->MOS3coeffDepLayWidth; - return(OK); - case MOS3_DELTA: - value->rValue = here->MOS3delta; - return(OK); - case MOS3_MOD_THETA: - value->rValue = here->MOS3theta; - return(OK); - case MOS3_MOD_ALPHA: - value->rValue = here->MOS3alpha; - return(OK); - case MOS3_MOD_KAPPA: - value->rValue = here->MOS3kappa; - return(OK); - case MOS3_MOD_KF: - value->rValue = here->MOS3fNcoef; - return(OK); - case MOS3_MOD_AF: - value->rValue = here->MOS3fNexp; - return(OK); - case MOS3_MOD_TYPE: - if (here->MOS3type > 0) - value->sValue = "nmos"; - else - value->sValue = "pmos"; - return(OK); - default: - return(E_BADPARM); - } - /* NOTREACHED */ -} - diff --git a/src/spicelib/devices/mos3/mos3mpar.c b/src/spicelib/devices/mos3/mos3mpar.c deleted file mode 100644 index 8b4a57e87..000000000 --- a/src/spicelib/devices/mos3/mos3mpar.c +++ /dev/null @@ -1,198 +0,0 @@ -/********** -Copyright 1990 Regents of the University of California. All rights reserved. -Author: 1985 Thomas L. Quarles -Modified: 2000 AlansFixes -**********/ -/* - */ - -#include "ngspice/ngspice.h" -#include "ngspice/const.h" -#include "ngspice/ifsim.h" -#include "mos3defs.h" -#include "ngspice/sperror.h" -#include "ngspice/suffix.h" - - -int -MOS3mParam(int param, IFvalue *value, GENmodel *inModel) -{ - MOS3model *model = (MOS3model *)inModel; - switch(param) { - case MOS3_MOD_VTO: - model->MOS3vt0 = value->rValue; - model->MOS3vt0Given = TRUE; - break; - case MOS3_MOD_KP: - model->MOS3transconductance = value->rValue; - model->MOS3transconductanceGiven = TRUE; - break; - case MOS3_MOD_GAMMA: - model->MOS3gamma = value->rValue; - model->MOS3gammaGiven = TRUE; - break; - case MOS3_MOD_PHI: - model->MOS3phi = value->rValue; - model->MOS3phiGiven = TRUE; - break; - case MOS3_MOD_RD: - model->MOS3drainResistance = value->rValue; - model->MOS3drainResistanceGiven = TRUE; - break; - case MOS3_MOD_RS: - model->MOS3sourceResistance = value->rValue; - model->MOS3sourceResistanceGiven = TRUE; - break; - case MOS3_MOD_CBD: - model->MOS3capBD = value->rValue; - model->MOS3capBDGiven = TRUE; - break; - case MOS3_MOD_CBS: - model->MOS3capBS = value->rValue; - model->MOS3capBSGiven = TRUE; - break; - case MOS3_MOD_IS: - model->MOS3jctSatCur = value->rValue; - model->MOS3jctSatCurGiven = TRUE; - break; - case MOS3_MOD_PB: - model->MOS3bulkJctPotential = value->rValue; - model->MOS3bulkJctPotentialGiven = TRUE; - break; - case MOS3_MOD_CGSO: - model->MOS3gateSourceOverlapCapFactor = value->rValue; - model->MOS3gateSourceOverlapCapFactorGiven = TRUE; - break; - case MOS3_MOD_CGDO: - model->MOS3gateDrainOverlapCapFactor = value->rValue; - model->MOS3gateDrainOverlapCapFactorGiven = TRUE; - break; - case MOS3_MOD_CGBO: - model->MOS3gateBulkOverlapCapFactor = value->rValue; - model->MOS3gateBulkOverlapCapFactorGiven = TRUE; - break; - case MOS3_MOD_RSH: - model->MOS3sheetResistance = value->rValue; - model->MOS3sheetResistanceGiven = TRUE; - break; - case MOS3_MOD_CJ: - model->MOS3bulkCapFactor = value->rValue; - model->MOS3bulkCapFactorGiven = TRUE; - break; - case MOS3_MOD_MJ: - model->MOS3bulkJctBotGradingCoeff = value->rValue; - model->MOS3bulkJctBotGradingCoeffGiven = TRUE; - break; - case MOS3_MOD_CJSW: - model->MOS3sideWallCapFactor = value->rValue; - model->MOS3sideWallCapFactorGiven = TRUE; - break; - case MOS3_MOD_MJSW: - model->MOS3bulkJctSideGradingCoeff = value->rValue; - model->MOS3bulkJctSideGradingCoeffGiven = TRUE; - break; - case MOS3_MOD_JS: - model->MOS3jctSatCurDensity = value->rValue; - model->MOS3jctSatCurDensityGiven = TRUE; - break; - case MOS3_MOD_TOX: - model->MOS3oxideThickness = value->rValue; - model->MOS3oxideThicknessGiven = TRUE; - break; - case MOS3_MOD_LD: - model->MOS3latDiff = value->rValue; - model->MOS3latDiffGiven = TRUE; - break; - case MOS3_MOD_XL: - model->MOS3lengthAdjust = value->rValue; - model->MOS3lengthAdjustGiven = TRUE; - break; - case MOS3_MOD_WD: - model->MOS3widthNarrow = value->rValue; - model->MOS3widthNarrowGiven = TRUE; - break; - case MOS3_MOD_XW: - model->MOS3widthAdjust = value->rValue; - model->MOS3widthAdjustGiven = TRUE; - break; - case MOS3_MOD_DELVTO: - model->MOS3delvt0 = value->rValue; - model->MOS3delvt0Given = TRUE; - break; - case MOS3_MOD_U0: - model->MOS3surfaceMobility = value->rValue; - model->MOS3surfaceMobilityGiven = TRUE; - break; - case MOS3_MOD_FC: - model->MOS3fwdCapDepCoeff = value->rValue; - model->MOS3fwdCapDepCoeffGiven = TRUE; - break; - case MOS3_MOD_NSUB: - model->MOS3substrateDoping = value->rValue; - model->MOS3substrateDopingGiven = TRUE; - break; - case MOS3_MOD_TPG: - model->MOS3gateType = value->iValue; - model->MOS3gateTypeGiven = TRUE; - break; - case MOS3_MOD_NSS: - model->MOS3surfaceStateDensity = value->rValue; - model->MOS3surfaceStateDensityGiven = TRUE; - break; - case MOS3_MOD_ETA: - model->MOS3eta = value->rValue; - model->MOS3etaGiven = TRUE; - break; - case MOS3_MOD_DELTA: - model->MOS3delta = value->rValue; - model->MOS3deltaGiven = TRUE; - break; - case MOS3_MOD_NFS: - model->MOS3fastSurfaceStateDensity = value->rValue; - model->MOS3fastSurfaceStateDensityGiven = TRUE; - break; - case MOS3_MOD_THETA: - model->MOS3theta = value->rValue; - model->MOS3thetaGiven = TRUE; - break; - case MOS3_MOD_VMAX: - model->MOS3maxDriftVel = value->rValue; - model->MOS3maxDriftVelGiven = TRUE; - break; - case MOS3_MOD_KAPPA: - model->MOS3kappa = value->rValue; - model->MOS3kappaGiven = TRUE; - break; - case MOS3_MOD_NMOS: - if(value->iValue) { - model->MOS3type = 1; - model->MOS3typeGiven = TRUE; - } - break; - case MOS3_MOD_PMOS: - if(value->iValue) { - model->MOS3type = -1; - model->MOS3typeGiven = TRUE; - } - break; - case MOS3_MOD_XJ: - model->MOS3junctionDepth = value->rValue; - model->MOS3junctionDepthGiven = TRUE; - break; - case MOS3_MOD_TNOM: - model->MOS3tnom = value->rValue+CONSTCtoK; - model->MOS3tnomGiven = TRUE; - break; - case MOS3_MOD_KF: - model->MOS3fNcoef = value->rValue; - model->MOS3fNcoefGiven = TRUE; - break; - case MOS3_MOD_AF: - model->MOS3fNexp = value->rValue; - model->MOS3fNexpGiven = TRUE; - break; - default: - return(E_BADPARM); - } - return(OK); -} diff --git a/src/spicelib/devices/mos3/mos3noi.c b/src/spicelib/devices/mos3/mos3noi.c deleted file mode 100644 index 82008d9b5..000000000 --- a/src/spicelib/devices/mos3/mos3noi.c +++ /dev/null @@ -1,180 +0,0 @@ -/********** -Copyright 1990 Regents of the University of California. All rights reserved. -Author: 1987 Gary W. Ng -Modified: 2000 AlansFixes -**********/ - -#include "ngspice/ngspice.h" -#include "mos3defs.h" -#include "ngspice/cktdefs.h" -#include "ngspice/iferrmsg.h" -#include "ngspice/noisedef.h" -#include "ngspice/suffix.h" - -/* - * MOS3noise (mode, operation, firstModel, ckt, data, OnDens) - * This routine names and evaluates all of the noise sources - * associated with MOSFET's. It starts with the model *firstModel and - * traverses all of its insts. It then proceeds to any other models - * on the linked list. The total output noise density generated by - * all of the MOSFET's is summed with the variable "OnDens". - */ - - -int -MOS3noise (int mode, int operation, GENmodel *genmodel, CKTcircuit *ckt, - Ndata *data, double *OnDens) -{ - NOISEAN *job = (NOISEAN *) ckt->CKTcurJob; - - MOS3model *firstModel = (MOS3model *) genmodel; - MOS3model *model; - MOS3instance *inst; - double tempOnoise; - double tempInoise; - double noizDens[MOS3NSRCS]; - double lnNdens[MOS3NSRCS]; - int i; - - /* define the names of the noise sources */ - - static char *MOS3nNames[MOS3NSRCS] = { /* Note that we have to keep the order */ - "_rd", /* noise due to rd */ /* consistent with thestrchr definitions */ - "_rs", /* noise due to rs */ /* in MOS3defs.h */ - "_id", /* noise due to id */ - "_1overf", /* flicker (1/f) noise */ - "" /* total transistor noise */ - }; - - for (model=firstModel; model != NULL; model=MOS3nextModel(model)) { - for (inst=MOS3instances(model); inst != NULL; inst=MOS3nextInstance(inst)) { - - switch (operation) { - - case N_OPEN: - - /* see if we have to to produce a summary report */ - /* if so, name all the noise generators */ - - if (job->NStpsSm != 0) { - switch (mode) { - - case N_DENS: - for (i=0; i < MOS3NSRCS; i++) { - NOISE_ADD_OUTVAR(ckt, data, "onoise_%s%s", inst->MOS3name, MOS3nNames[i]); - } - break; - - case INT_NOIZ: - for (i=0; i < MOS3NSRCS; i++) { - NOISE_ADD_OUTVAR(ckt, data, "onoise_total_%s%s", inst->MOS3name, MOS3nNames[i]); - NOISE_ADD_OUTVAR(ckt, data, "inoise_total_%s%s", inst->MOS3name, MOS3nNames[i]); - } - break; - } - } - break; - - case N_CALC: - switch (mode) { - - case N_DENS: - NevalSrc(&noizDens[MOS3RDNOIZ],&lnNdens[MOS3RDNOIZ], - ckt,THERMNOISE,inst->MOS3dNodePrime,inst->MOS3dNode, - inst->MOS3drainConductance); - - NevalSrc(&noizDens[MOS3RSNOIZ],&lnNdens[MOS3RSNOIZ], - ckt,THERMNOISE,inst->MOS3sNodePrime,inst->MOS3sNode, - inst->MOS3sourceConductance); - - NevalSrc(&noizDens[MOS3IDNOIZ],&lnNdens[MOS3IDNOIZ], - ckt,THERMNOISE,inst->MOS3dNodePrime,inst->MOS3sNodePrime, - (2.0/3.0 * fabs(inst->MOS3gm))); - - NevalSrc(&noizDens[MOS3FLNOIZ], NULL, ckt, - N_GAIN,inst->MOS3dNodePrime, inst->MOS3sNodePrime, - (double)0.0); - noizDens[MOS3FLNOIZ] *= model->MOS3fNcoef * - exp(model->MOS3fNexp * - log(MAX(fabs(inst->MOS3cd),N_MINLOG))) / - (data->freq * - (inst->MOS3w - 2*model->MOS3widthNarrow) * - (inst->MOS3l - 2*model->MOS3latDiff) * - model->MOS3oxideCapFactor * model->MOS3oxideCapFactor); - lnNdens[MOS3FLNOIZ] = - log(MAX(noizDens[MOS3FLNOIZ],N_MINLOG)); - - noizDens[MOS3TOTNOIZ] = noizDens[MOS3RDNOIZ] + - noizDens[MOS3RSNOIZ] + - noizDens[MOS3IDNOIZ] + - noizDens[MOS3FLNOIZ]; - lnNdens[MOS3TOTNOIZ] = - log(MAX(noizDens[MOS3TOTNOIZ], N_MINLOG)); - - *OnDens += noizDens[MOS3TOTNOIZ]; - - if (data->delFreq == 0.0) { - - /* if we haven't done any previous integration, we need to */ - /* initialize our "history" variables */ - - for (i=0; i < MOS3NSRCS; i++) { - inst->MOS3nVar[LNLSTDENS][i] = lnNdens[i]; - } - - /* clear out our integration variables if it's the first pass */ - - if (data->freq == job->NstartFreq) { - for (i=0; i < MOS3NSRCS; i++) { - inst->MOS3nVar[OUTNOIZ][i] = 0.0; - inst->MOS3nVar[INNOIZ][i] = 0.0; - } - } - } else { /* data->delFreq != 0.0 (we have to integrate) */ - for (i=0; i < MOS3NSRCS; i++) { - if (i != MOS3TOTNOIZ) { - tempOnoise = Nintegrate(noizDens[i], lnNdens[i], - inst->MOS3nVar[LNLSTDENS][i], data); - tempInoise = Nintegrate(noizDens[i] * data->GainSqInv , - lnNdens[i] + data->lnGainInv, - inst->MOS3nVar[LNLSTDENS][i] + data->lnGainInv, - data); - inst->MOS3nVar[LNLSTDENS][i] = lnNdens[i]; - data->outNoiz += tempOnoise; - data->inNoise += tempInoise; - if (job->NStpsSm != 0) { - inst->MOS3nVar[OUTNOIZ][i] += tempOnoise; - inst->MOS3nVar[OUTNOIZ][MOS3TOTNOIZ] += tempOnoise; - inst->MOS3nVar[INNOIZ][i] += tempInoise; - inst->MOS3nVar[INNOIZ][MOS3TOTNOIZ] += tempInoise; - } - } - } - } - if (data->prtSummary) { - for (i=0; i < MOS3NSRCS; i++) { /* print a summary report */ - data->outpVector[data->outNumber++] = noizDens[i]; - } - } - break; - - case INT_NOIZ: /* already calculated, just output */ - if (job->NStpsSm != 0) { - for (i=0; i < MOS3NSRCS; i++) { - data->outpVector[data->outNumber++] = inst->MOS3nVar[OUTNOIZ][i]; - data->outpVector[data->outNumber++] = inst->MOS3nVar[INNOIZ][i]; - } - } /* if */ - break; - } /* switch (mode) */ - break; - - case N_CLOSE: - return (OK); /* do nothing, the main calling routine will close */ - break; /* the plots */ - } /* switch (operation) */ - } /* for inst */ - } /* for model */ - -return(OK); -} diff --git a/src/spicelib/devices/mos3/mos3par.c b/src/spicelib/devices/mos3/mos3par.c deleted file mode 100644 index 725700a90..000000000 --- a/src/spicelib/devices/mos3/mos3par.c +++ /dev/null @@ -1,127 +0,0 @@ -/********** -Copyright 1990 Regents of the University of California. All rights reserved. -Author: 1985 Thomas L. Quarles -Modified: 2000 AlansFixes -**********/ -/* - */ - -#include "ngspice/ngspice.h" -#include "ngspice/const.h" -#include "ngspice/ifsim.h" -#include "mos3defs.h" -#include "ngspice/sperror.h" -#include "ngspice/suffix.h" -#include "ngspice/fteext.h" - - -/* ARGSUSED */ -int -MOS3param(int param, IFvalue *value, GENinstance *inst, IFvalue *select) -{ - double scale; - - MOS3instance *here = (MOS3instance *)inst; - - NG_IGNORE(select); - - if (!cp_getvar("scale", CP_REAL, &scale, 0)) - scale = 1; - - switch (param) { - case MOS3_M: - here->MOS3m = value->rValue; - here->MOS3mGiven = TRUE; - break; - case MOS3_W: - here->MOS3w = value->rValue * scale; - here->MOS3wGiven = TRUE; - break; - case MOS3_L: - here->MOS3l = value->rValue * scale; - here->MOS3lGiven = TRUE; - break; - case MOS3_AS: - here->MOS3sourceArea = value->rValue * scale * scale; - here->MOS3sourceAreaGiven = TRUE; - break; - case MOS3_AD: - here->MOS3drainArea = value->rValue * scale * scale; - here->MOS3drainAreaGiven = TRUE; - break; - case MOS3_PS: - here->MOS3sourcePerimiter = value->rValue * scale; - here->MOS3sourcePerimiterGiven = TRUE; - break; - case MOS3_PD: - here->MOS3drainPerimiter = value->rValue * scale; - here->MOS3drainPerimiterGiven = TRUE; - break; - case MOS3_NRS: - here->MOS3sourceSquares = value->rValue; - here->MOS3sourceSquaresGiven = TRUE; - break; - case MOS3_NRD: - here->MOS3drainSquares = value->rValue; - here->MOS3drainSquaresGiven = TRUE; - break; - case MOS3_OFF: - here->MOS3off = (value->iValue != 0); - break; - case MOS3_IC_VBS: - here->MOS3icVBS = value->rValue; - here->MOS3icVBSGiven = TRUE; - break; - case MOS3_IC_VDS: - here->MOS3icVDS = value->rValue; - here->MOS3icVDSGiven = TRUE; - break; - case MOS3_IC_VGS: - here->MOS3icVGS = value->rValue; - here->MOS3icVGSGiven = TRUE; - break; - case MOS3_TEMP: - here->MOS3temp = value->rValue+CONSTCtoK; - here->MOS3tempGiven = TRUE; - break; - case MOS3_DTEMP: - here->MOS3dtemp = value->rValue; - here->MOS3dtempGiven = TRUE; - break; - case MOS3_IC: - /* FALLTHROUGH added to suppress GCC warning due to - * -Wimplicit-fallthrough flag */ - switch (value->v.numValue) { - case 3: - here->MOS3icVBS = *(value->v.vec.rVec+2); - here->MOS3icVBSGiven = TRUE; - /* FALLTHROUGH */ - case 2: - here->MOS3icVGS = *(value->v.vec.rVec+1); - here->MOS3icVGSGiven = TRUE; - /* FALLTHROUGH */ - case 1: - here->MOS3icVDS = *(value->v.vec.rVec); - here->MOS3icVDSGiven = TRUE; - break; - default: - return(E_BADPARM); - } - break; - case MOS3_L_SENS: - if(value->iValue) { - here->MOS3senParmNo = 1; - here->MOS3sens_l = 1; - } - break; - case MOS3_W_SENS: - if(value->iValue) { - here->MOS3senParmNo = 1; - here->MOS3sens_w = 1; - } - break; - default: - return(E_BADPARM); - } - return(OK); -} diff --git a/src/spicelib/devices/mos3/mos3pzld.c b/src/spicelib/devices/mos3/mos3pzld.c deleted file mode 100644 index 7ac8d5891..000000000 --- a/src/spicelib/devices/mos3/mos3pzld.c +++ /dev/null @@ -1,134 +0,0 @@ -/********** -Copyright 1990 Regents of the University of California. All rights reserved. -Author: 1985 Thomas L. Quarles -Modified: 2000 AlansFixes -**********/ -/* - */ - -#include "ngspice/ngspice.h" -#include "ngspice/cktdefs.h" -#include "ngspice/complex.h" -#include "mos3defs.h" -#include "ngspice/sperror.h" -#include "ngspice/suffix.h" - - -int -MOS3pzLoad(GENmodel *inModel, CKTcircuit *ckt, SPcomplex *s) -{ - MOS3model *model = (MOS3model *)inModel; - MOS3instance *here; - int xnrm; - int xrev; - double xgs; - double xgd; - double xgb; - double xbd; - double xbs; - double capgs; - double capgd; - double capgb; - double GateBulkOverlapCap; - double GateDrainOverlapCap; - double GateSourceOverlapCap; - double EffectiveLength; - double EffectiveWidth; - - for( ; model != NULL; model = MOS3nextModel(model)) { - for(here = MOS3instances(model); here!= NULL; - here = MOS3nextInstance(here)) { - - if (here->MOS3mode < 0) { - xnrm=0; - xrev=1; - } else { - xnrm=1; - xrev=0; - } - /* - * meyer's model parameters - */ - EffectiveWidth=here->MOS3w-2*model->MOS3widthNarrow+ - model->MOS3widthAdjust; - EffectiveLength=here->MOS3l - 2*model->MOS3latDiff+ - model->MOS3lengthAdjust; - GateSourceOverlapCap = model->MOS3gateSourceOverlapCapFactor * - here->MOS3m * EffectiveWidth; - GateDrainOverlapCap = model->MOS3gateDrainOverlapCapFactor * - here->MOS3m * EffectiveWidth; - GateBulkOverlapCap = model->MOS3gateBulkOverlapCapFactor * - here->MOS3m * EffectiveLength; - capgs = ( 2* *(ckt->CKTstate0+here->MOS3capgs)+ - GateSourceOverlapCap ); - capgd = ( 2* *(ckt->CKTstate0+here->MOS3capgd)+ - GateDrainOverlapCap ); - capgb = ( 2* *(ckt->CKTstate0+here->MOS3capgb)+ - GateBulkOverlapCap ); - xgs = capgs; - xgd = capgd; - xgb = capgb; - xbd = here->MOS3capbd; - xbs = here->MOS3capbs; - /*printf("mos2: xgs=%g, xgd=%g, xgb=%g, xbd=%g, xbs=%g\n", - xgs,xgd,xgb,xbd,xbs);*/ - /* - * load matrix - */ - - *(here->MOS3GgPtr ) += (xgd+xgs+xgb)*s->real; - *(here->MOS3GgPtr +1) += (xgd+xgs+xgb)*s->imag; - *(here->MOS3BbPtr ) += (xgb+xbd+xbs)*s->real; - *(here->MOS3BbPtr +1) += (xgb+xbd+xbs)*s->imag; - *(here->MOS3DPdpPtr ) += (xgd+xbd)*s->real; - *(here->MOS3DPdpPtr +1) += (xgd+xbd)*s->imag; - *(here->MOS3SPspPtr ) += (xgs+xbs)*s->real; - *(here->MOS3SPspPtr +1) += (xgs+xbs)*s->imag; - *(here->MOS3GbPtr ) -= xgb*s->real; - *(here->MOS3GbPtr +1) -= xgb*s->imag; - *(here->MOS3GdpPtr ) -= xgd*s->real; - *(here->MOS3GdpPtr +1) -= xgd*s->imag; - *(here->MOS3GspPtr ) -= xgs*s->real; - *(here->MOS3GspPtr +1) -= xgs*s->imag; - *(here->MOS3BgPtr ) -= xgb*s->real; - *(here->MOS3BgPtr +1) -= xgb*s->imag; - *(here->MOS3BdpPtr ) -= xbd*s->real; - *(here->MOS3BdpPtr +1) -= xbd*s->imag; - *(here->MOS3BspPtr ) -= xbs*s->real; - *(here->MOS3BspPtr +1) -= xbs*s->imag; - *(here->MOS3DPgPtr ) -= xgd*s->real; - *(here->MOS3DPgPtr +1) -= xgd*s->imag; - *(here->MOS3DPbPtr ) -= xbd*s->real; - *(here->MOS3DPbPtr +1) -= xbd*s->imag; - *(here->MOS3SPgPtr ) -= xgs*s->real; - *(here->MOS3SPgPtr +1) -= xgs*s->imag; - *(here->MOS3SPbPtr ) -= xbs*s->real; - *(here->MOS3SPbPtr +1) -= xbs*s->imag; - *(here->MOS3DdPtr) += here->MOS3drainConductance; - *(here->MOS3SsPtr) += here->MOS3sourceConductance; - *(here->MOS3BbPtr) += here->MOS3gbd+here->MOS3gbs; - *(here->MOS3DPdpPtr) += here->MOS3drainConductance+ - here->MOS3gds+here->MOS3gbd+ - xrev*(here->MOS3gm+here->MOS3gmbs); - *(here->MOS3SPspPtr) += here->MOS3sourceConductance+ - here->MOS3gds+here->MOS3gbs+ - xnrm*(here->MOS3gm+here->MOS3gmbs); - *(here->MOS3DdpPtr) -= here->MOS3drainConductance; - *(here->MOS3SspPtr) -= here->MOS3sourceConductance; - *(here->MOS3BdpPtr) -= here->MOS3gbd; - *(here->MOS3BspPtr) -= here->MOS3gbs; - *(here->MOS3DPdPtr) -= here->MOS3drainConductance; - *(here->MOS3DPgPtr) += (xnrm-xrev)*here->MOS3gm; - *(here->MOS3DPbPtr) += -here->MOS3gbd+(xnrm-xrev)*here->MOS3gmbs; - *(here->MOS3DPspPtr) -= here->MOS3gds+ - xnrm*(here->MOS3gm+here->MOS3gmbs); - *(here->MOS3SPgPtr) -= (xnrm-xrev)*here->MOS3gm; - *(here->MOS3SPsPtr) -= here->MOS3sourceConductance; - *(here->MOS3SPbPtr) -= here->MOS3gbs+(xnrm-xrev)*here->MOS3gmbs; - *(here->MOS3SPdpPtr) -= here->MOS3gds+ - xrev*(here->MOS3gm+here->MOS3gmbs); - - } - } - return(OK); -} diff --git a/src/spicelib/devices/mos3/mos3sacl.c b/src/spicelib/devices/mos3/mos3sacl.c deleted file mode 100644 index d4a14aa98..000000000 --- a/src/spicelib/devices/mos3/mos3sacl.c +++ /dev/null @@ -1,786 +0,0 @@ -/********** -Copyright 1990 Regents of the University of California. All rights reserved. -Author: 1985 Thomas L. Quarles - -This function is obsolete (was used by an old sensitivity analysis) -**********/ - -/* actually load the current ac sensitivity - * information into the array previously provided - */ - -#include "ngspice/ngspice.h" -#include "ngspice/smpdefs.h" -#include "ngspice/cktdefs.h" -#include "ngspice/const.h" -#include "mos3defs.h" -#include "ngspice/sperror.h" -#include "ngspice/suffix.h" - -int -MOS3sAcLoad(GENmodel *inModel, CKTcircuit *ckt) -{ - MOS3model *model = (MOS3model *)inModel; - MOS3instance *here; - int xnrm; - int xrev; - double A0; - double Apert = 0.0; - double DELA; - double DELAinv; - double gdpr0; - double gspr0; - double gds0; - double gbs0; - double gbd0; - double gm0; - double gmbs0; - double gdpr; - double gspr; - double gds; - double gbs; - double gbd; - double gm; - double gmbs; - double xcgs0; - double xcgd0; - double xcgb0; - double xbd0; - double xbs0; - double xcgs; - double xcgd; - double xcgb; - double xbd; - double xbs; - double vbsOp; - double vbdOp; - double vspr; - double vdpr; - double vgs; - double vgd; - double vgb; - double vbs; - double vbd; - double vds; - double ivspr; - double ivdpr; - double ivgs; - double ivgd; - double ivgb; - double ivbs; - double ivbd; - double ivds; - double cspr; - double cdpr; - double cgs; - double cgd; - double cgb; - double cbs; - double cbd; - double cds; - double cs0; - double csprm0; - double cd0; - double cdprm0; - double cg0; - double cb0; - double cs; - double csprm; - double cd; - double cdprm; - double cg; - double cb; - double icspr; - double icdpr; - double icgs; - double icgd; - double icgb; - double icbs; - double icbd; - double icds; - double ics0; - double icsprm0; - double icd0; - double icdprm0; - double icg0; - double icb0; - double ics; - double icsprm; - double icd; - double icdprm; - double icg; - double icb; - double DvDp = 0.0; - int i; - int flag; - int error; - int iparmno; - double arg; - double sarg; - double sargsw; - double SaveState[44]; - int save_mode; - SENstruct *info; - -#ifdef SENSDEBUG - printf("MOS3senacload\n"); - printf("CKTomega = %.5e\n",ckt->CKTomega); -#endif /* SENSDEBUG */ - info = ckt->CKTsenInfo; - info->SENstatus = PERTURBATION; - for( ; model != NULL; model = MOS3nextModel(model)) { - for(here = MOS3instances(model); here!= NULL; - here = MOS3nextInstance(here)) { - - /* save the unperturbed values in the state vector */ - for(i=0; i <= 16; i++) - *(SaveState + i) = *(ckt->CKTstate0 + here->MOS3states + i); - - *(SaveState + 17) = here->MOS3sourceConductance; - *(SaveState + 18) = here->MOS3drainConductance; - *(SaveState + 19) = here->MOS3cd; - *(SaveState + 20) = here->MOS3cbs; - *(SaveState + 21) = here->MOS3cbd; - *(SaveState + 22) = here->MOS3gmbs; - *(SaveState + 23) = here->MOS3gm; - *(SaveState + 24) = here->MOS3gds; - *(SaveState + 25) = here->MOS3gbd; - *(SaveState + 26) = here->MOS3gbs; - *(SaveState + 27) = here->MOS3capbd; - *(SaveState + 28) = here->MOS3capbs; - *(SaveState + 29) = here->MOS3Cbd; - *(SaveState + 30) = here->MOS3Cbdsw; - *(SaveState + 31) = here->MOS3Cbs; - *(SaveState + 32) = here->MOS3Cbssw; - *(SaveState + 33) = here->MOS3f2d; - *(SaveState + 34) = here->MOS3f3d; - *(SaveState + 35) = here->MOS3f4d; - *(SaveState + 36) = here->MOS3f2s; - *(SaveState + 37) = here->MOS3f3s; - *(SaveState + 38) = here->MOS3f4s; - *(SaveState + 39) = here->MOS3cgs; - *(SaveState + 40) = here->MOS3cgd; - *(SaveState + 41) = here->MOS3cgb; - *(SaveState + 42) = here->MOS3vdsat; - *(SaveState + 43) = here->MOS3von; - save_mode = here->MOS3mode; - - xnrm=1; - xrev=0; - if (here->MOS3mode < 0) { - xnrm=0; - xrev=1; - } - - vbsOp = model->MOS3type * ( - *(ckt->CKTrhsOp+here->MOS3bNode) - - *(ckt->CKTrhsOp+here->MOS3sNodePrime)); - vbdOp = model->MOS3type * ( - *(ckt->CKTrhsOp+here->MOS3bNode) - - *(ckt->CKTrhsOp+here->MOS3dNodePrime)); - vspr = *(ckt->CKTrhsOld + here->MOS3sNode) - - *(ckt->CKTrhsOld + - here->MOS3sNodePrime) ; - ivspr = *(ckt->CKTirhsOld + here->MOS3sNode) - - *(ckt->CKTirhsOld + - here->MOS3sNodePrime) ; - vdpr = *(ckt->CKTrhsOld + here->MOS3dNode) - - *(ckt->CKTrhsOld + - here->MOS3dNodePrime) ; - ivdpr = *(ckt->CKTirhsOld + here->MOS3dNode) - - *(ckt->CKTirhsOld + - here->MOS3dNodePrime) ; - vgb = *(ckt->CKTrhsOld + here->MOS3gNode) - - *(ckt->CKTrhsOld + - here->MOS3bNode) ; - ivgb = *(ckt->CKTirhsOld + here->MOS3gNode) - - *(ckt->CKTirhsOld + - here->MOS3bNode) ; - vbs = *(ckt->CKTrhsOld + here->MOS3bNode) - - *(ckt->CKTrhsOld + - here->MOS3sNodePrime) ; - ivbs = *(ckt->CKTirhsOld + here->MOS3bNode) - - *(ckt->CKTirhsOld + - here->MOS3sNodePrime) ; - vbd = *(ckt->CKTrhsOld + here->MOS3bNode) - - *(ckt->CKTrhsOld + - here->MOS3dNodePrime) ; - ivbd = *(ckt->CKTirhsOld + here->MOS3bNode) - - *(ckt->CKTirhsOld + - here->MOS3dNodePrime) ; - vds = vbs - vbd ; - ivds = ivbs - ivbd ; - vgs = vgb + vbs ; - ivgs = ivgb + ivbs ; - vgd = vgb + vbd ; - ivgd = ivgb + ivbd ; - -#ifdef SENSDEBUG - printf("senacload instance name %s\n",here->MOS3name); - printf("gate = %d ,drain = %d, drainprm = %d\n", - here->MOS3gNode,here->MOS3dNode,here->MOS3dNodePrime); - printf("source = %d , sourceprm = %d ,body = %d, senparmno = %d\n", - here->MOS3sNode ,here->MOS3sNodePrime, - here->MOS3bNode,here->MOS3senParmNo); - printf("\n without perturbation \n"); -#endif /* SENSDEBUG */ - /* without perturbation */ - *(ckt->CKTstate0 + here->MOS3vbs) = vbsOp; - *(ckt->CKTstate0 + here->MOS3vbd) = vbdOp; - - here->MOS3senPertFlag = ON ; - if(info->SENacpertflag == 1){ - /* store the unperturbed values of small signal parameters */ - if((error = MOS3load((GENmodel*)model,ckt)) != 0) - return(error); - *(here->MOS3senCgs) = here->MOS3cgs; - *(here->MOS3senCgd) = here->MOS3cgd; - *(here->MOS3senCgb) = here->MOS3cgb; - *(here->MOS3senCbd) = here->MOS3capbd; - *(here->MOS3senCbs) = here->MOS3capbs; - *(here->MOS3senGds) = here->MOS3gds; - *(here->MOS3senGbs) = here->MOS3gbs; - *(here->MOS3senGbd) = here->MOS3gbd; - *(here->MOS3senGm) = here->MOS3gm; - *(here->MOS3senGmbs) = here->MOS3gmbs; - - } - xcgs0= *(here->MOS3senCgs) * ckt->CKTomega; - xcgd0= *(here->MOS3senCgd) * ckt->CKTomega; - xcgb0= *(here->MOS3senCgb) * ckt->CKTomega; - xbd0= *(here->MOS3senCbd) * ckt->CKTomega; - xbs0= *(here->MOS3senCbs) * ckt->CKTomega; - gds0= *(here->MOS3senGds); - gbs0= *(here->MOS3senGbs); - gbd0= *(here->MOS3senGbd); - gm0= *(here->MOS3senGm); - gmbs0= *(here->MOS3senGmbs); - gdpr0 = here->MOS3drainConductance; - gspr0 = here->MOS3sourceConductance; - - - cspr = gspr0 * vspr ; - icspr = gspr0 * ivspr ; - cdpr = gdpr0 * vdpr ; - icdpr = gdpr0 * ivdpr ; - cgs = ( - xcgs0 * ivgs ); - icgs = xcgs0 * vgs ; - cgd = ( - xcgd0 * ivgd ); - icgd = xcgd0 * vgd ; - cgb = ( - xcgb0 * ivgb ); - icgb = xcgb0 * vgb ; - cbs = ( gbs0 * vbs - xbs0 * ivbs ); - icbs = ( xbs0 * vbs + gbs0 * ivbs ); - cbd = ( gbd0 * vbd - xbd0 * ivbd ); - icbd = ( xbd0 * vbd + gbd0 * ivbd ); - cds = ( gds0 * vds + xnrm * (gm0 * vgs + gmbs0 * vbs) - - xrev * (gm0 * vgd + gmbs0 * vbd) ); - icds = ( gds0 * ivds + xnrm * (gm0 * ivgs + gmbs0 * ivbs) - - xrev * (gm0 * ivgd + gmbs0 * ivbd) ); - - cs0 = cspr; - ics0 = icspr; - csprm0 = ( -cspr - cgs - cbs - cds ) ; - icsprm0 = ( -icspr - icgs - icbs - icds ) ; - cd0 = cdpr; - icd0 = icdpr; - cdprm0 = ( -cdpr - cgd - cbd + cds ) ; - icdprm0 = ( -icdpr - icgd - icbd + icds ) ; - cg0 = cgs + cgd + cgb ; - icg0 = icgs + icgd + icgb ; - cb0 = cbs + cbd - cgb ; - icb0 = icbs + icbd - icgb ; -#ifdef SENSDEBUG - printf("gspr0 = %.7e , gdpr0 = %.7e , gds0 = %.7e, gbs0 = %.7e\n", - gspr0,gdpr0,gds0,gbs0); - printf("gbd0 = %.7e , gm0 = %.7e , gmbs0 = %.7e\n",gbd0,gm0,gmbs0); - printf("xcgs0 = %.7e , xcgd0 = %.7e ,", xcgs0,xcgd0); - printf("xcgb0 = %.7e, xbd0 = %.7e,xbs0 = %.7e\n" ,xcgb0,xbd0,xbs0); - printf("vbs = %.7e , vbd = %.7e , vgb = %.7e\n",vbs,vbd,vgb); - printf("ivbs = %.7e , ivbd = %.7e , ivgb = %.7e\n",ivbs,ivbd,ivgb); - printf("cbs0 = %.7e , cbd0 = %.7e , cgb0 = %.7e\n",cbs,cbd,cgb); - printf("cb0 = %.7e , cg0 = %.7e , cs0 = %.7e\n",cb0,cg0,cs0); - printf("csprm0 = %.7e, cd0 = %.7e, cdprm0 = %.7e\n", - csprm0,cd0,cdprm0); - printf("icb0 = %.7e , icg0 = %.7e , ics0 = %.7e\n",icb0,icg0,ics0); - printf("icsprm0 = %.7e, icd0 = %.7e, icdprm0 = %.7e\n", - icsprm0,icd0,icdprm0); - printf("\nPerturbation of vbs\n"); -#endif /* SENSDEBUG */ - - /* Perturbation of vbs */ - flag = 1; - A0 = vbsOp; - DELA = info->SENpertfac * CONSTvt0 ; - DELAinv = 1.0/DELA; - - if(info->SENacpertflag == 1){ - /* store the values of small signal parameters - * corresponding to perturbed vbs */ - Apert = A0 + DELA; - *(ckt->CKTstate0 + here->MOS3vbs) = Apert; - *(ckt->CKTstate0 + here->MOS3vbd) = vbdOp; - - if((error = MOS3load((GENmodel*)model,ckt)) != 0) - return(error); - - *(here->MOS3senCgs + 1) = here->MOS3cgs; - *(here->MOS3senCgd + 1) = here->MOS3cgd; - *(here->MOS3senCgb + 1) = here->MOS3cgb; - *(here->MOS3senCbd + 1) = here->MOS3capbd; - *(here->MOS3senCbs + 1) = here->MOS3capbs; - *(here->MOS3senGds + 1) = here->MOS3gds; - *(here->MOS3senGbs + 1) = here->MOS3gbs; - *(here->MOS3senGbd + 1) = here->MOS3gbd; - *(here->MOS3senGm + 1) = here->MOS3gm; - *(here->MOS3senGmbs + 1) = here->MOS3gmbs; - - *(ckt->CKTstate0 + here->MOS3vbs) = A0; - - - } - - goto load; - - -pertvbd: /* Perturbation of vbd */ -#ifdef SENSDEBUG - printf("\nPerturbation of vbd\n"); -#endif /* SENSDEBUG */ - - flag = 2; - A0 = vbdOp; - DELA = info->SENpertfac * CONSTvt0 + 1e-8; - DELAinv = 1.0/DELA; - - if(info->SENacpertflag == 1){ - /* store the values of small signal parameters - * corresponding to perturbed vbd */ - Apert = A0 + DELA; - *(ckt->CKTstate0 + here->MOS3vbs) = vbsOp; - *(ckt->CKTstate0 + here->MOS3vbd) = Apert; - - if((error = MOS3load((GENmodel*)model,ckt)) != 0) - return(error); - - *(here->MOS3senCgs + 2) = here->MOS3cgs; - *(here->MOS3senCgd + 2) = here->MOS3cgd; - *(here->MOS3senCgb + 2) = here->MOS3cgb; - *(here->MOS3senCbd + 2) = here->MOS3capbd; - *(here->MOS3senCbs + 2) = here->MOS3capbs; - *(here->MOS3senGds + 2) = here->MOS3gds; - *(here->MOS3senGbs + 2) = here->MOS3gbs; - *(here->MOS3senGbd + 2) = here->MOS3gbd; - *(here->MOS3senGm + 2) = here->MOS3gm; - *(here->MOS3senGmbs + 2) = here->MOS3gmbs; - - *(ckt->CKTstate0 + here->MOS3vbd) = A0; - - } - - goto load; - - -pertvgb: /* Perturbation of vgb */ -#ifdef SENSDEBUG - printf("\nPerturbation of vgb\n"); -#endif /* SENSDEBUG */ - - flag = 3; - A0 = model->MOS3type * (*(ckt->CKTrhsOp + here->MOS3gNode) - - *(ckt->CKTrhsOp + here->MOS3bNode)); - DELA = info->SENpertfac * A0 + 1e-8; - DELAinv = model->MOS3type * 1.0/DELA; - - - if(info->SENacpertflag == 1){ - /* store the values of small signal parameters - * corresponding to perturbed vgb */ - *(ckt->CKTstate0 + here->MOS3vbs) = vbsOp; - *(ckt->CKTstate0 + here->MOS3vbd) = vbdOp; - *(ckt->CKTrhsOp + here->MOS3bNode) -= DELA; - - if((error = MOS3load((GENmodel*)model,ckt)) != 0) - return(error); - - *(here->MOS3senCgs + 3) = here->MOS3cgs; - *(here->MOS3senCgd + 3) = here->MOS3cgd; - *(here->MOS3senCgb + 3) = here->MOS3cgb; - *(here->MOS3senCbd + 3) = here->MOS3capbd; - *(here->MOS3senCbs + 3) = here->MOS3capbs; - *(here->MOS3senGds + 3) = here->MOS3gds; - *(here->MOS3senGbs + 3) = here->MOS3gbs; - *(here->MOS3senGbd + 3) = here->MOS3gbd; - *(here->MOS3senGm + 3) = here->MOS3gm; - *(here->MOS3senGmbs + 3) = here->MOS3gmbs; - - - *(ckt->CKTrhsOp + here->MOS3bNode) += DELA; - } - goto load; - -pertl: /* Perturbation of length */ - - if(here->MOS3sens_l == 0){ - goto pertw; - } -#ifdef SENSDEBUG - printf("\nPerturbation of length\n"); -#endif /* SENSDEBUG */ - flag = 4; - A0 = here->MOS3l; - DELA = info->SENpertfac * A0; - DELAinv = 1.0/DELA; - - if(info->SENacpertflag == 1){ - /* store the values of small signal parameters - * corresponding to perturbed length */ - Apert = A0 + DELA; - here->MOS3l = Apert; - - *(ckt->CKTstate0 + here->MOS3vbs) = vbsOp; - *(ckt->CKTstate0 + here->MOS3vbd) = vbdOp; - - if((error = MOS3load((GENmodel*)model,ckt)) != 0) - return(error); - - *(here->MOS3senCgs + 4) = here->MOS3cgs; - *(here->MOS3senCgd + 4) = here->MOS3cgd; - *(here->MOS3senCgb + 4) = here->MOS3cgb; - *(here->MOS3senCbd + 4) = here->MOS3capbd; - *(here->MOS3senCbs + 4) = here->MOS3capbs; - *(here->MOS3senGds + 4) = here->MOS3gds; - *(here->MOS3senGbs + 4) = here->MOS3gbs; - *(here->MOS3senGbd + 4) = here->MOS3gbd; - *(here->MOS3senGm + 4) = here->MOS3gm; - *(here->MOS3senGmbs + 4) = here->MOS3gmbs; - - here->MOS3l = A0; - - } - - goto load; - -pertw: /* Perturbation of width */ - if(here->MOS3sens_w == 0) - goto next; -#ifdef SENSDEBUG - printf("\nPerturbation of width\n"); -#endif /* SENSDEBUG */ - flag = 5; - A0 = here->MOS3w; - DELA = info->SENpertfac * A0; - DELAinv = 1.0/DELA; - Apert = A0 + DELA; - - if(info->SENacpertflag == 1){ - /* store the values of small signal parameters - * corresponding to perturbed width */ - here->MOS3w = Apert; - here->MOS3drainArea *= (1 + info->SENpertfac); - here->MOS3sourceArea *= (1 + info->SENpertfac); - here->MOS3Cbd *= (1 + info->SENpertfac); - here->MOS3Cbs *= (1 + info->SENpertfac); - if(here->MOS3drainPerimiter){ - here->MOS3Cbdsw += here->MOS3Cbdsw * - DELA/here->MOS3drainPerimiter; - } - if(here->MOS3sourcePerimiter){ - here->MOS3Cbssw += here->MOS3Cbssw * - DELA/here->MOS3sourcePerimiter; - } - if(vbdOp >= here->MOS3tDepCap){ - arg = 1-model->MOS3fwdCapDepCoeff; - sarg = exp( (-model->MOS3bulkJctBotGradingCoeff) * - log(arg) ); - sargsw = exp( (-model->MOS3bulkJctSideGradingCoeff) * - log(arg) ); - here->MOS3f2d = here->MOS3Cbd*(1-model->MOS3fwdCapDepCoeff* - (1+model->MOS3bulkJctBotGradingCoeff))* sarg/arg - + here->MOS3Cbdsw*(1-model->MOS3fwdCapDepCoeff* - (1+model->MOS3bulkJctSideGradingCoeff))* - sargsw/arg; - here->MOS3f3d = here->MOS3Cbd * - model->MOS3bulkJctBotGradingCoeff * sarg/arg/ - model->MOS3bulkJctPotential - + here->MOS3Cbdsw * - model->MOS3bulkJctSideGradingCoeff * sargsw/arg / - model->MOS3bulkJctPotential; - here->MOS3f4d = here->MOS3Cbd*model->MOS3bulkJctPotential* - (1-arg*sarg)/ (1-model->MOS3bulkJctBotGradingCoeff) - + here->MOS3Cbdsw*model->MOS3bulkJctPotential* - (1-arg*sargsw)/ - (1-model->MOS3bulkJctSideGradingCoeff) - -here->MOS3f3d/2* - (here->MOS3tDepCap*here->MOS3tDepCap) - -here->MOS3tDepCap * here->MOS3f2d; - } - if(vbsOp >= here->MOS3tDepCap){ - arg = 1-model->MOS3fwdCapDepCoeff; - sarg = exp( (-model->MOS3bulkJctBotGradingCoeff) * - log(arg) ); - sargsw = exp( (-model->MOS3bulkJctSideGradingCoeff) * - log(arg) ); - here->MOS3f2s = here->MOS3Cbs*(1-model->MOS3fwdCapDepCoeff* - (1+model->MOS3bulkJctBotGradingCoeff))* sarg/arg - + here->MOS3Cbssw*(1-model->MOS3fwdCapDepCoeff* - (1+model->MOS3bulkJctSideGradingCoeff))* - sargsw/arg; - here->MOS3f3s = here->MOS3Cbs * - model->MOS3bulkJctBotGradingCoeff * sarg/arg/ - model->MOS3bulkJctPotential + here->MOS3Cbssw * - model->MOS3bulkJctSideGradingCoeff * sargsw/arg / - model->MOS3bulkJctPotential; - here->MOS3f4s = here->MOS3Cbs*model->MOS3bulkJctPotential* - (1-arg*sarg)/ (1-model->MOS3bulkJctBotGradingCoeff) - + here->MOS3Cbssw*model->MOS3bulkJctPotential* - (1-arg*sargsw)/ - (1-model->MOS3bulkJctSideGradingCoeff) - -here->MOS3f3s/2* - (here->MOS3tBulkPot*here->MOS3tBulkPot) - -here->MOS3tBulkPot * here->MOS3f2s; - } - - *(ckt->CKTstate0 + here->MOS3vbs) = vbsOp; - *(ckt->CKTstate0 + here->MOS3vbd) = vbdOp; - - if((error = MOS3load((GENmodel*)model,ckt)) != 0) - return(error); - - *(here->MOS3senCgs + 5) = here->MOS3cgs; - *(here->MOS3senCgd + 5) = here->MOS3cgd; - *(here->MOS3senCgb + 5) = here->MOS3cgb; - *(here->MOS3senCbd + 5) = here->MOS3capbd; - *(here->MOS3senCbs + 5) = here->MOS3capbs; - *(here->MOS3senGds + 5) = here->MOS3gds; - *(here->MOS3senGbs + 5) = here->MOS3gbs; - *(here->MOS3senGbd + 5) = here->MOS3gbd; - *(here->MOS3senGm + 5) = here->MOS3gm; - *(here->MOS3senGmbs + 5) = here->MOS3gmbs; - - here->MOS3w = A0; - here->MOS3drainArea /= (1 + info->SENpertfac); - here->MOS3sourceArea /= (1 + info->SENpertfac); - } - -load: - - gds= *(here->MOS3senGds + flag); - gbs= *(here->MOS3senGbs + flag); - gbd= *(here->MOS3senGbd + flag); - gm= *(here->MOS3senGm + flag); - gmbs= *(here->MOS3senGmbs + flag); - if(flag == 5){ - gdpr = here->MOS3drainConductance * Apert/A0; - gspr = here->MOS3sourceConductance * Apert/A0; - } - else{ - gdpr = here->MOS3drainConductance; - gspr = here->MOS3sourceConductance; - } - - xcgs= *(here->MOS3senCgs + flag) * ckt->CKTomega; - xcgd= *(here->MOS3senCgd + flag) * ckt->CKTomega; - xcgb= *(here->MOS3senCgb + flag) * ckt->CKTomega; - xbd= *(here->MOS3senCbd + flag) * ckt->CKTomega; - xbs= *(here->MOS3senCbs + flag) * ckt->CKTomega; - -#ifdef SENSDEBUG - printf("flag = %d \n",flag); - printf("gspr = %.7e , gdpr = %.7e , gds = %.7e, gbs = %.7e\n", - gspr,gdpr,gds,gbs); - printf("gbd = %.7e , gm = %.7e , gmbs = %.7e\n",gbd,gm,gmbs); - printf("xcgs = %.7e , xcgd = %.7e , xcgb = %.7e,", xcgs,xcgd,xcgb); - printf("xbd = %.7e,xbs = %.7e\n" ,xbd,xbs); -#endif /* SENSDEBUG */ - cspr = gspr * vspr ; - icspr = gspr * ivspr ; - cdpr = gdpr * vdpr ; - icdpr = gdpr * ivdpr ; - cgs = ( - xcgs * ivgs ); - icgs = xcgs * vgs ; - cgd = ( - xcgd * ivgd ); - icgd = xcgd * vgd ; - cgb = ( - xcgb * ivgb ); - icgb = xcgb * vgb ; - cbs = ( gbs * vbs - xbs * ivbs ); - icbs = ( xbs * vbs + gbs * ivbs ); - cbd = ( gbd * vbd - xbd * ivbd ); - icbd = ( xbd * vbd + gbd * ivbd ); - cds = ( gds * vds + xnrm * (gm * vgs + gmbs * vbs) - - xrev * (gm * vgd + gmbs * vbd) ); - icds = ( gds * ivds + xnrm * (gm * ivgs + gmbs * ivbs) - - xrev * (gm * ivgd + gmbs * ivbd) ); - - cs = cspr; - ics = icspr; - csprm = ( -cspr - cgs - cbs - cds ) ; - icsprm = ( -icspr - icgs - icbs - icds ) ; - cd = cdpr; - icd = icdpr; - cdprm = ( -cdpr - cgd - cbd + cds ) ; - icdprm = ( -icdpr - icgd - icbd + icds ) ; - cg = cgs + cgd + cgb ; - icg = icgs + icgd + icgb ; - cb = cbs + cbd - cgb ; - icb = icbs + icbd - icgb ; - -#ifdef SENSDEBUG - printf("vbs = %.7e , vbd = %.7e , vgb = %.7e\n",vbs,vbd,vgb); - printf("ivbs = %.7e , ivbd = %.7e , ivgb = %.7e\n",ivbs,ivbd,ivgb); - printf("cbs = %.7e , cbd = %.7e , cgb = %.7e\n",cbs,cbd,cgb); - printf("cb = %.7e , cg = %.7e , cs = %.7e\n",cb,cg,cs); - printf("csprm = %.7e, cd = %.7e, cdprm = %.7e\n",csprm,cd,cdprm); - printf("icb = %.7e , icg = %.7e , ics = %.7e\n",icb,icg,ics); - printf("icsprm = %.7e, icd = %.7e, icdprm = %.7e\n", - icsprm,icd,icdprm); -#endif /* SENSDEBUG */ - for(iparmno = 1;iparmno<=info->SENparms;iparmno++){ - if( (flag == 4) && (iparmno != here->MOS3senParmNo) ) continue; - if( (flag == 5) && (iparmno != (here->MOS3senParmNo + - (int) here->MOS3sens_l)) ) continue; - - switch(flag){ - case 1: - DvDp = model->MOS3type * - (info->SEN_Sap[here->MOS3bNode][iparmno] - - info->SEN_Sap[here->MOS3sNodePrime][iparmno]); - break; - case 2: - DvDp = model->MOS3type * - ( info->SEN_Sap[here->MOS3bNode][iparmno] - - info->SEN_Sap[here->MOS3dNodePrime][iparmno]); - break; - case 3: - DvDp = model->MOS3type * - ( info->SEN_Sap[here->MOS3gNode][iparmno] - - info->SEN_Sap[here->MOS3bNode][iparmno]); - break; - case 4: - DvDp = 1; - break; - case 5: - DvDp = 1; - break; - } - *(info->SEN_RHS[here->MOS3bNode] + iparmno) -= - ( cb - cb0) * DELAinv * DvDp; - *(info->SEN_iRHS[here->MOS3bNode] + iparmno) -= - ( icb - icb0) * DELAinv * DvDp; - - *(info->SEN_RHS[here->MOS3gNode] + iparmno) -= - ( cg - cg0) * DELAinv * DvDp; - *(info->SEN_iRHS[here->MOS3gNode] + iparmno) -= - ( icg - icg0) * DELAinv * DvDp; - - if(here->MOS3sNode != here->MOS3sNodePrime){ - *(info->SEN_RHS[here->MOS3sNode] + iparmno) -= - ( cs - cs0) * DELAinv * DvDp; - *(info->SEN_iRHS[here->MOS3sNode] + iparmno) -= - ( ics - ics0) * DELAinv * DvDp; - } - - *(info->SEN_RHS[here->MOS3sNodePrime] + iparmno) -= - ( csprm - csprm0) * DELAinv * DvDp; - *(info->SEN_iRHS[here->MOS3sNodePrime] + iparmno) -= - ( icsprm - icsprm0) * DELAinv * DvDp; - - if(here->MOS3dNode != here->MOS3dNodePrime){ - *(info->SEN_RHS[here->MOS3dNode] + iparmno) -= - ( cd - cd0) * DELAinv * DvDp; - *(info->SEN_iRHS[here->MOS3dNode] + iparmno) -= - ( icd - icd0) * DELAinv * DvDp; - } - - *(info->SEN_RHS[here->MOS3dNodePrime] + iparmno) -= - ( cdprm - cdprm0) * DELAinv * DvDp; - *(info->SEN_iRHS[here->MOS3dNodePrime] + iparmno) -= - ( icdprm - icdprm0) * DELAinv * DvDp; -#ifdef SENSDEBUG - printf("after loading\n"); - printf("DvDp = %.5e , DELAinv = %.5e ,flag = %d ,", - DvDp,DELAinv,flag); - printf("iparmno = %d,senparmno = %d\n", - iparmno,here->MOS3senParmNo); - printf("A0 = %.5e , Apert = %.5e ,CONSTvt0 = %.5e \n", - A0,Apert,CONSTvt0); - printf("senb = %.7e + j%.7e ", - *(info->SEN_RHS[here->MOS3bNode] + iparmno), - *(info->SEN_iRHS[here->MOS3bNode] + iparmno)); - printf("seng = %.7e + j%.7e ", - *(info->SEN_RHS[here->MOS3gNode] + iparmno), - *(info->SEN_iRHS[here->MOS3gNode] + iparmno)); - printf("sens = %.7e + j%.7e ", - *(info->SEN_RHS[here->MOS3sNode] + iparmno), - *(info->SEN_iRHS[here->MOS3sNode] + iparmno)); - printf("sensprm = %.7e + j%.7e ", - *(info->SEN_RHS[here->MOS3sNodePrime] + iparmno), - *(info->SEN_iRHS[here->MOS3sNodePrime] + iparmno)); - printf("send = %.7e + j%.7e ", - *(info->SEN_RHS[here->MOS3dNode] + iparmno), - *(info->SEN_iRHS[here->MOS3dNode] + iparmno)); - printf("sendprm = %.7e + j%.7e ", - *(info->SEN_RHS[here->MOS3dNodePrime] + iparmno), - *(info->SEN_iRHS[here->MOS3dNodePrime] + iparmno)); -#endif /* SENSDEBUG */ - - } - switch(flag){ - case 1: - goto pertvbd ; - case 2: - goto pertvgb ; - case 3: - goto pertl ; - case 4: - goto pertw ; - case 5: - break; - } -next: - ; - - /* put the unperturbed values back into the state vector */ - for(i=0; i <= 16; i++) - *(ckt->CKTstate0 + here->MOS3states + i) = *(SaveState + i); - - here->MOS3sourceConductance = *(SaveState + 17) ; - here->MOS3drainConductance = *(SaveState + 18) ; - here->MOS3cd = *(SaveState + 19) ; - here->MOS3cbs = *(SaveState + 20) ; - here->MOS3cbd = *(SaveState + 21) ; - here->MOS3gmbs = *(SaveState + 22) ; - here->MOS3gm = *(SaveState + 23) ; - here->MOS3gds = *(SaveState + 24) ; - here->MOS3gbd = *(SaveState + 25) ; - here->MOS3gbs = *(SaveState + 26) ; - here->MOS3capbd = *(SaveState + 27) ; - here->MOS3capbs = *(SaveState + 28) ; - here->MOS3Cbd = *(SaveState + 29) ; - here->MOS3Cbdsw = *(SaveState + 30) ; - here->MOS3Cbs = *(SaveState + 31) ; - here->MOS3Cbssw = *(SaveState + 32) ; - here->MOS3f2d = *(SaveState + 33) ; - here->MOS3f3d = *(SaveState + 34) ; - here->MOS3f4d = *(SaveState + 35) ; - here->MOS3f2s = *(SaveState + 36) ; - here->MOS3f3s = *(SaveState + 37) ; - here->MOS3f4s = *(SaveState + 38) ; - here->MOS3cgs = *(SaveState + 39) ; - here->MOS3cgd = *(SaveState + 40) ; - here->MOS3cgb = *(SaveState + 41) ; - here->MOS3vdsat = *(SaveState + 42) ; - here->MOS3von = *(SaveState + 43) ; - here->MOS3mode = save_mode ; - - here->MOS3senPertFlag = OFF; - } - } - info->SENstatus = NORMAL; -#ifdef SENSDEBUG - printf("MOS3senacload end\n"); -#endif /* SENSDEBUG */ - return(OK); -} - - diff --git a/src/spicelib/devices/mos3/mos3set.c b/src/spicelib/devices/mos3/mos3set.c deleted file mode 100644 index 4432ba461..000000000 --- a/src/spicelib/devices/mos3/mos3set.c +++ /dev/null @@ -1,286 +0,0 @@ -/********** -Copyright 1990 Regents of the University of California. All rights reserved. -Author: 1985 Thomas L. Quarlesù -Modified: 2000 AlansFixes -**********/ - -#include "ngspice/ngspice.h" -#include "ngspice/smpdefs.h" -#include "ngspice/cktdefs.h" -#include "mos3defs.h" -#include "ngspice/const.h" -#include "ngspice/sperror.h" -#include "ngspice/suffix.h" - -/* assuming silicon - make definition for epsilon of silicon */ -#define EPSSIL (11.7 * 8.854214871e-12) - -int -MOS3setup(SMPmatrix *matrix, GENmodel *inModel, CKTcircuit *ckt, int *states) - /* load the MOS3 device structure with those pointers needed later - * for fast matrix loading - */ - -{ - MOS3model *model = (MOS3model *)inModel; - MOS3instance *here; - int error; - CKTnode *tmp; - - /* loop through all the MOS3 device models */ - for( ; model != NULL; model = MOS3nextModel(model)) { - - /* perform model defaulting */ - if(!model->MOS3typeGiven) { - model->MOS3type = NMOS; - } - if(!model->MOS3latDiffGiven) { - model->MOS3latDiff = 0; - } - if(!model->MOS3lengthAdjustGiven) { - model->MOS3lengthAdjust = 0; - } - if(!model->MOS3widthNarrowGiven) { - model->MOS3widthNarrow = 0; - } - if(!model->MOS3widthAdjustGiven) { - model->MOS3widthAdjust = 0; - } - if(!model->MOS3delvt0Given) { - model->MOS3delvt0 = 0; - } - if(!model->MOS3jctSatCurDensityGiven) { - model->MOS3jctSatCurDensity = 0; - } - if(!model->MOS3jctSatCurGiven) { - model->MOS3jctSatCur = 1e-14; - } - if(!model->MOS3drainResistanceGiven) { - model->MOS3drainResistance = 0; - } - if(!model->MOS3sourceResistanceGiven) { - model->MOS3sourceResistance = 0; - } - if(!model->MOS3sheetResistanceGiven) { - model->MOS3sheetResistance = 0; - } - if(!model->MOS3transconductanceGiven) { - model->MOS3transconductance = 2e-5; - } - if(!model->MOS3gateSourceOverlapCapFactorGiven) { - model->MOS3gateSourceOverlapCapFactor = 0; - } - if(!model->MOS3gateDrainOverlapCapFactorGiven) { - model->MOS3gateDrainOverlapCapFactor = 0; - } - if(!model->MOS3gateBulkOverlapCapFactorGiven) { - model->MOS3gateBulkOverlapCapFactor = 0; - } - if(!model->MOS3vt0Given) { - model->MOS3vt0 = 0; - } - if(!model->MOS3capBDGiven) { - model->MOS3capBD = 0; - } - if(!model->MOS3capBSGiven) { - model->MOS3capBS = 0; - } - if(!model->MOS3bulkCapFactorGiven) { - model->MOS3bulkCapFactor = 0; - } - if(!model->MOS3sideWallCapFactorGiven) { - model->MOS3sideWallCapFactor = 0; - } - if(!model->MOS3bulkJctPotentialGiven) { - model->MOS3bulkJctPotential = .8; - } - if(!model->MOS3bulkJctBotGradingCoeffGiven) { - model->MOS3bulkJctBotGradingCoeff = .5; - } - if(!model->MOS3bulkJctSideGradingCoeffGiven) { - model->MOS3bulkJctSideGradingCoeff = .33; - } - if(!model->MOS3fwdCapDepCoeffGiven) { - model->MOS3fwdCapDepCoeff = .5; - } - if(!model->MOS3phiGiven) { - model->MOS3phi = .6; - } - if(!model->MOS3gammaGiven) { - model->MOS3gamma = 0; - } - if(!model->MOS3deltaGiven) { - model->MOS3delta = 0; - } - if(!model->MOS3maxDriftVelGiven) { - model->MOS3maxDriftVel = 0; - } - if(!model->MOS3junctionDepthGiven) { - model->MOS3junctionDepth = 0; - } - if(!model->MOS3fastSurfaceStateDensityGiven) { - model->MOS3fastSurfaceStateDensity = 0; - } - if(!model->MOS3etaGiven) { - model->MOS3eta = 0; - } - if(!model->MOS3thetaGiven) { - model->MOS3theta = 0; - } - if(!model->MOS3kappaGiven) { - model->MOS3kappa = .2; - } - if(!model->MOS3oxideThicknessGiven) { - model->MOS3oxideThickness = 1e-7; - } - if(!model->MOS3fNcoefGiven) { - model->MOS3fNcoef = 0; - } - if(!model->MOS3fNexpGiven) { - model->MOS3fNexp = 1; - } - - /* loop through all the instances of the model */ - for (here = MOS3instances(model); here != NULL ; - here=MOS3nextInstance(here)) { - - CKTnode *tmpNode; - IFuid tmpName; - - /* allocate a chunk of the state vector */ - here->MOS3states = *states; - *states += MOS3NUMSTATES; - - if(!here->MOS3drainAreaGiven) { - here->MOS3drainArea = ckt->CKTdefaultMosAD; - } - if(!here->MOS3drainPerimiterGiven) { - here->MOS3drainPerimiter = 0; - } - if(!here->MOS3drainSquaresGiven) { - here->MOS3drainSquares = 1; - } - if(!here->MOS3icVBSGiven) { - here->MOS3icVBS = 0; - } - if(!here->MOS3icVDSGiven) { - here->MOS3icVDS = 0; - } - if(!here->MOS3icVGSGiven) { - here->MOS3icVGS = 0; - } - if(!here->MOS3sourcePerimiterGiven) { - here->MOS3sourcePerimiter = 0; - } - if(!here->MOS3sourceSquaresGiven) { - here->MOS3sourceSquares = 1; - } - if(!here->MOS3vdsatGiven) { - here->MOS3vdsat = 0; - } - if(!here->MOS3vonGiven) { - here->MOS3von = 0; - } - if(!here->MOS3modeGiven) { - here->MOS3mode = 1; - } - - if((model->MOS3drainResistance != 0 || - (model->MOS3sheetResistance != 0 && - here->MOS3drainSquares != 0 ) )) { - if (here->MOS3dNodePrime == 0) { - error = CKTmkVolt(ckt,&tmp,here->MOS3name,"internal#drain"); - if(error) return(error); - here->MOS3dNodePrime = tmp->number; - if (ckt->CKTcopyNodesets) { - if (CKTinst2Node(ckt,here,1,&tmpNode,&tmpName)==OK) { - if (tmpNode->nsGiven) { - tmp->nodeset=tmpNode->nodeset; - tmp->nsGiven=tmpNode->nsGiven; - } - } - } - } - } else { - here->MOS3dNodePrime = here->MOS3dNode; - } - - if((model->MOS3sourceResistance != 0 || - (model->MOS3sheetResistance != 0 && - here->MOS3sourceSquares != 0 ) )) { - if (here->MOS3sNodePrime == 0) { - error = CKTmkVolt(ckt,&tmp,here->MOS3name,"internal#source"); - if(error) return(error); - here->MOS3sNodePrime = tmp->number; - if (ckt->CKTcopyNodesets) { - if (CKTinst2Node(ckt,here,3,&tmpNode,&tmpName)==OK) { - if (tmpNode->nsGiven) { - tmp->nodeset=tmpNode->nodeset; - tmp->nsGiven=tmpNode->nsGiven; - } - } - } - } - } else { - here->MOS3sNodePrime = here->MOS3sNode; - } - -/* macro to make elements with built in test for out of memory */ -#define TSTALLOC(ptr,first,second) \ -do { if((here->ptr = SMPmakeElt(matrix, here->first, here->second)) == NULL){\ - return(E_NOMEM);\ -} } while(0) - - TSTALLOC(MOS3DdPtr, MOS3dNode, MOS3dNode); - TSTALLOC(MOS3GgPtr, MOS3gNode, MOS3gNode); - TSTALLOC(MOS3SsPtr, MOS3sNode, MOS3sNode); - TSTALLOC(MOS3BbPtr, MOS3bNode, MOS3bNode); - TSTALLOC(MOS3DPdpPtr, MOS3dNodePrime, MOS3dNodePrime); - TSTALLOC(MOS3SPspPtr, MOS3sNodePrime, MOS3sNodePrime); - TSTALLOC(MOS3DdpPtr, MOS3dNode, MOS3dNodePrime); - TSTALLOC(MOS3GbPtr, MOS3gNode, MOS3bNode); - TSTALLOC(MOS3GdpPtr, MOS3gNode, MOS3dNodePrime); - TSTALLOC(MOS3GspPtr, MOS3gNode, MOS3sNodePrime); - TSTALLOC(MOS3SspPtr, MOS3sNode, MOS3sNodePrime); - TSTALLOC(MOS3BdpPtr, MOS3bNode, MOS3dNodePrime); - TSTALLOC(MOS3BspPtr, MOS3bNode, MOS3sNodePrime); - TSTALLOC(MOS3DPspPtr, MOS3dNodePrime, MOS3sNodePrime); - TSTALLOC(MOS3DPdPtr, MOS3dNodePrime, MOS3dNode); - TSTALLOC(MOS3BgPtr, MOS3bNode, MOS3gNode); - TSTALLOC(MOS3DPgPtr, MOS3dNodePrime, MOS3gNode); - TSTALLOC(MOS3SPgPtr, MOS3sNodePrime, MOS3gNode); - TSTALLOC(MOS3SPsPtr, MOS3sNodePrime, MOS3sNode); - TSTALLOC(MOS3DPbPtr, MOS3dNodePrime, MOS3bNode); - TSTALLOC(MOS3SPbPtr, MOS3sNodePrime, MOS3bNode); - TSTALLOC(MOS3SPdpPtr, MOS3sNodePrime, MOS3dNodePrime); - - } - } - return(OK); -} - -int -MOS3unsetup(GENmodel *inModel, CKTcircuit *ckt) -{ - MOS3model *model; - MOS3instance *here; - - for (model = (MOS3model *)inModel; model != NULL; - model = MOS3nextModel(model)) - { - for (here = MOS3instances(model); here != NULL; - here=MOS3nextInstance(here)) - { - if (here->MOS3sNodePrime > 0 - && here->MOS3sNodePrime != here->MOS3sNode) - CKTdltNNum(ckt, here->MOS3sNodePrime); - here->MOS3sNodePrime= 0; - - if (here->MOS3dNodePrime > 0 - && here->MOS3dNodePrime != here->MOS3dNode) - CKTdltNNum(ckt, here->MOS3dNodePrime); - here->MOS3dNodePrime= 0; - } - } - return OK; -} diff --git a/src/spicelib/devices/mos3/mos3sld.c b/src/spicelib/devices/mos3/mos3sld.c deleted file mode 100644 index cdd6b3ca2..000000000 --- a/src/spicelib/devices/mos3/mos3sld.c +++ /dev/null @@ -1,624 +0,0 @@ -/********** -Copyright 1990 Regents of the University of California. All rights reserved. -Author: 1985 Thomas L. Quarles -Modified: 2000 AlansFixes - -This function is obsolete (was used by an old sensitivity analysis) -**********/ - -/* actually load the current sensitivity - * information into the array previously provided - */ - -#include "ngspice/ngspice.h" -#include "ngspice/smpdefs.h" -#include "ngspice/cktdefs.h" -#include "mos3defs.h" -#include "ngspice/sperror.h" -#include "ngspice/suffix.h" - -int -MOS3sLoad(GENmodel *inModel, CKTcircuit *ckt) -{ - MOS3model *model = (MOS3model *)inModel; - MOS3instance *here; - double SaveState[44]; - int save_mode; - int i; - int iparmno; - int error; - int flag; - double A0; - double DELA; - double Apert; - double DELAinv; - double gspr0; - double gspr; - double gdpr0; - double gdpr; - double cdpr0; - double cspr0; - double cd0; - double cbd0; - double cbs0; - double cd; - double cbd; - double cbs; - double DcdprDp; - double DcsprDp; - double DcbDp; - double DcdDp; - double DcbsDp; - double DcbdDp; - double DcdprmDp; - double DcsprmDp; - double qgs0; - double qgd0; - double qgb0; - double qbd0; - double qbd; - double qbs0; - double qbs; - double DqgsDp; - double DqgdDp; - double DqgbDp; - double DqbdDp; - double DqbsDp; - double Osxpgs; - double Osxpgd; - double Osxpgb; - double Osxpbd; - double Osxpbs; - double tag0; - double tag1; - double arg; - double sarg; - double sargsw; - int offset; - double EffectiveLength; - double EffectiveWidth; - SENstruct *info; - -#ifdef SENSDEBUG - printf("MOS3senload \n"); - printf("CKTtime = %.5e\n",ckt->CKTtime); - printf("CKTorder = %d\n",ckt->CKTorder); -#endif /* SENSDEBUG */ - - info = ckt->CKTsenInfo; - info->SENstatus = PERTURBATION; - - tag0 = ckt->CKTag[0]; - tag1 = ckt->CKTag[1]; - if(ckt->CKTorder == 1){ - tag1 = 0; - } - - /* loop through all the models */ - for( ; model != NULL; model = MOS3nextModel(model)) { - - /* loop through all the instances of the model */ - for (here = MOS3instances(model); here != NULL ; - here=MOS3nextInstance(here)) { - -#ifdef SENSDEBUG - printf("senload instance name %s\n",here->MOS3name); - printf("gate = %d ,drain = %d, drainprm = %d\n", - here->MOS3gNode,here->MOS3dNode,here->MOS3dNodePrime); - printf("source = %d , sourceprm = %d ,body = %d, senparmno = %d\n", - here->MOS3sNode ,here->MOS3sNodePrime, - here->MOS3bNode,here->MOS3senParmNo); -#endif /* SENSDEBUG */ - - - /* save the unperturbed values in the state vector */ - for(i=0; i <= 16; i++){ - *(SaveState + i) = *(ckt->CKTstate0 + here->MOS3states + i); - } - - *(SaveState + 17) = here->MOS3sourceConductance; - *(SaveState + 18) = here->MOS3drainConductance; - *(SaveState + 19) = here->MOS3cd; - *(SaveState + 20) = here->MOS3cbs; - *(SaveState + 21) = here->MOS3cbd; - *(SaveState + 22) = here->MOS3gmbs; - *(SaveState + 23) = here->MOS3gm; - *(SaveState + 24) = here->MOS3gds; - *(SaveState + 25) = here->MOS3gbd; - *(SaveState + 26) = here->MOS3gbs; - *(SaveState + 27) = here->MOS3capbd; - *(SaveState + 28) = here->MOS3capbs; - *(SaveState + 29) = here->MOS3Cbd; - *(SaveState + 30) = here->MOS3Cbdsw; - *(SaveState + 31) = here->MOS3Cbs; - *(SaveState + 32) = here->MOS3Cbssw; - *(SaveState + 33) = here->MOS3f2d; - *(SaveState + 34) = here->MOS3f3d; - *(SaveState + 35) = here->MOS3f4d; - *(SaveState + 36) = here->MOS3f2s; - *(SaveState + 37) = here->MOS3f3s; - *(SaveState + 38) = here->MOS3f4s; - *(SaveState + 39) = here->MOS3cgs; - *(SaveState + 40) = here->MOS3cgd; - *(SaveState + 41) = here->MOS3cgb; - *(SaveState + 42) = here->MOS3vdsat; - *(SaveState + 43) = here->MOS3von; - save_mode = here->MOS3mode; - - - if(here->MOS3senParmNo == 0) goto next1; - -#ifdef SENSDEBUG - printf("without perturbation \n"); -#endif /* SENSDEBUG */ - - cdpr0= here->MOS3cd; - cspr0= -(here->MOS3cd + here->MOS3cbd + here->MOS3cbs); - if((info->SENmode == TRANSEN) && - (ckt->CKTmode & MODEINITTRAN)){ - qgs0 = *(ckt->CKTstate1 + here->MOS3qgs); - qgd0 = *(ckt->CKTstate1 + here->MOS3qgd); - qgb0 = *(ckt->CKTstate1 + here->MOS3qgb); - } - else{ - qgs0 = *(ckt->CKTstate0 + here->MOS3qgs); - qgd0 = *(ckt->CKTstate0 + here->MOS3qgd); - qgb0 = *(ckt->CKTstate0 + here->MOS3qgb); - } - - here->MOS3senPertFlag = ON; - error = MOS3load((GENmodel*)model,ckt); - if(error) return(error); - - cd0 = here->MOS3cd ; - cbd0 = here->MOS3cbd ; - cbs0 = here->MOS3cbs ; - gspr0= here->MOS3sourceConductance ; - gdpr0= here->MOS3drainConductance ; - - qbs0 = *(ckt->CKTstate0 + here->MOS3qbs); - qbd0 = *(ckt->CKTstate0 + here->MOS3qbd); - - for( flag = 0 ; flag <= 1 ; flag++){ - if(here->MOS3sens_l == 0) - if(flag == 0) goto next2; - if(here->MOS3sens_w == 0) - if(flag == 1) goto next2; - if(flag == 0){ - A0 = here->MOS3l; - DELA = info->SENpertfac * A0; - DELAinv = 1.0/DELA; - Apert = A0 + DELA; - here->MOS3l = Apert; - } - else{ - A0 = here->MOS3w; - DELA = info->SENpertfac * A0; - DELAinv = 1.0/DELA; - Apert = A0 + DELA; - here->MOS3w = Apert; - here->MOS3drainArea *= (1 + info->SENpertfac); - here->MOS3sourceArea *= (1 + info->SENpertfac); - here->MOS3Cbd *= (1 + info->SENpertfac); - here->MOS3Cbs *= (1 + info->SENpertfac); - if(here->MOS3drainPerimiter){ - here->MOS3Cbdsw += here->MOS3Cbdsw * - DELA/here->MOS3drainPerimiter; - } - if(here->MOS3sourcePerimiter){ - here->MOS3Cbssw += here->MOS3Cbssw * - DELA/here->MOS3sourcePerimiter; - } - if(*(ckt->CKTstate0 + here->MOS3vbd) >= - here->MOS3tDepCap){ - arg = 1-model->MOS3fwdCapDepCoeff; - sarg = exp( (-model->MOS3bulkJctBotGradingCoeff) * - log(arg) ); - sargsw = exp( (-model->MOS3bulkJctSideGradingCoeff) * - log(arg) ); - here->MOS3f2d = here->MOS3Cbd* - (1-model->MOS3fwdCapDepCoeff* - (1+model->MOS3bulkJctBotGradingCoeff))* sarg/arg - + here->MOS3Cbdsw*(1-model->MOS3fwdCapDepCoeff* - (1+model->MOS3bulkJctSideGradingCoeff))* - sargsw/arg; - here->MOS3f3d = here->MOS3Cbd * - model->MOS3bulkJctBotGradingCoeff * sarg/arg/ - model->MOS3bulkJctPotential - + here->MOS3Cbdsw * - model->MOS3bulkJctSideGradingCoeff *sargsw/arg / - model->MOS3bulkJctPotential; - here->MOS3f4d = here->MOS3Cbd* - model->MOS3bulkJctPotential*(1-arg*sarg)/ - (1-model->MOS3bulkJctBotGradingCoeff) - + here->MOS3Cbdsw*model->MOS3bulkJctPotential* - (1-arg*sargsw)/ - (1-model->MOS3bulkJctSideGradingCoeff) - -here->MOS3f3d/2* - (here->MOS3tDepCap*here->MOS3tDepCap) - -here->MOS3tDepCap * here->MOS3f2d; - } - if(*(ckt->CKTstate0 + here->MOS3vbs) >= - here->MOS3tDepCap){ - arg = 1-model->MOS3fwdCapDepCoeff; - sarg = exp( (-model->MOS3bulkJctBotGradingCoeff) * - log(arg) ); - sargsw = exp( (-model->MOS3bulkJctSideGradingCoeff) * - log(arg) ); - here->MOS3f2s = here->MOS3Cbs* - (1-model->MOS3fwdCapDepCoeff* - (1+model->MOS3bulkJctBotGradingCoeff))* sarg/arg - + here->MOS3Cbssw*(1-model->MOS3fwdCapDepCoeff* - (1+model->MOS3bulkJctSideGradingCoeff))* - sargsw/arg; - here->MOS3f3s = here->MOS3Cbs * - model->MOS3bulkJctBotGradingCoeff * sarg/arg/ - model->MOS3bulkJctPotential - + here->MOS3Cbssw * - model->MOS3bulkJctSideGradingCoeff * sargsw/arg/ - model->MOS3bulkJctPotential; - here->MOS3f4s = here->MOS3Cbs* - model->MOS3bulkJctPotential*(1-arg*sarg)/ - (1-model->MOS3bulkJctBotGradingCoeff) - + here->MOS3Cbssw*model->MOS3bulkJctPotential* - (1-arg*sargsw)/ - (1-model->MOS3bulkJctSideGradingCoeff) - -here->MOS3f3s/2* - (here->MOS3tBulkPot*here->MOS3tBulkPot) - -here->MOS3tBulkPot * here->MOS3f2s; - } - here->MOS3drainConductance *= Apert/A0; - here->MOS3sourceConductance *= Apert/A0; - } - - -#ifdef SENSDEBUG - if(flag == 0) - printf("perturbation of l\n"); - if(flag == 1) - printf("perturbation of w\n"); -#endif /* SENSDEBUG */ - - error = MOS3load((GENmodel*)model,ckt); - if(error) return(error); - - if(flag == 0){ - here->MOS3l = A0; - } - else{ - here->MOS3w = A0; - here->MOS3drainArea /= (1 + info->SENpertfac); - here->MOS3sourceArea /= (1 + info->SENpertfac); - here->MOS3drainConductance *= A0/Apert; - here->MOS3sourceConductance *= A0/Apert; - } - cd = here->MOS3cd ; - cbd = here->MOS3cbd ; - cbs = here->MOS3cbs ; - - gspr= here->MOS3sourceConductance ; - gdpr= here->MOS3drainConductance ; - - DcdDp = (cd - cd0) * DELAinv; - DcbsDp = (cbs - cbs0) * DELAinv; - DcbdDp = (cbd - cbd0) * DELAinv; - DcbDp = ( DcbsDp + DcbdDp ); - - DcdprDp = 0; - DcsprDp = 0; - if(here->MOS3dNode != here->MOS3dNodePrime) - if(gdpr0) DcdprDp = cdpr0 * (gdpr - gdpr0)/gdpr0 * DELAinv; - if(here->MOS3sNode != here->MOS3sNodePrime) - if(gspr0) DcsprDp = cspr0 * (gspr - gspr0)/gspr0 * DELAinv; - - DcdprmDp = ( - DcdprDp + DcdDp); - DcsprmDp = ( - DcbsDp - DcdDp - DcbdDp - DcsprDp); - - if(flag == 0){ - EffectiveLength = here->MOS3l - - 2*model->MOS3latDiff + model->MOS3lengthAdjust; - if(EffectiveLength == 0){ - DqgsDp = 0; - DqgdDp = 0; - DqgbDp = 0; - } - else{ - DqgsDp = model->MOS3type * qgs0 / EffectiveLength; - DqgdDp = model->MOS3type * qgd0 / EffectiveLength; - DqgbDp = model->MOS3type * qgb0 / EffectiveLength; - } - } - else{ - EffectiveWidth = here->MOS3w - - 2*model->MOS3widthNarrow + model->MOS3widthAdjust; - DqgsDp = model->MOS3type * qgs0 / EffectiveWidth; - DqgdDp = model->MOS3type * qgd0 / EffectiveWidth; - DqgbDp = model->MOS3type * qgb0 / EffectiveWidth; - } - - - qbd = *(ckt->CKTstate0 + here->MOS3qbd); - qbs = *(ckt->CKTstate0 + here->MOS3qbs); - - DqbsDp = model->MOS3type * (qbs - qbs0)*DELAinv; - DqbdDp = model->MOS3type * (qbd - qbd0)*DELAinv; - - if(flag == 0){ - *(here->MOS3dphigs_dl) = DqgsDp; - *(here->MOS3dphigd_dl) = DqgdDp; - *(here->MOS3dphibs_dl) = DqbsDp; - *(here->MOS3dphibd_dl) = DqbdDp; - *(here->MOS3dphigb_dl) = DqgbDp; - } - else{ - *(here->MOS3dphigs_dw) = DqgsDp; - *(here->MOS3dphigd_dw) = DqgdDp; - *(here->MOS3dphibs_dw) = DqbsDp; - *(here->MOS3dphibd_dw) = DqbdDp; - *(here->MOS3dphigb_dw) = DqgbDp; - } - - -#ifdef SENSDEBUG - printf("CKTag[0]=%.7e,CKTag[1]=%.7e,flag= %d\n", - ckt->CKTag[0],ckt->CKTag[1],flag); - printf("cd0 = %.7e ,cd = %.7e,\n",cd0,cd); - printf("cbs0 = %.7e ,cbs = %.7e,\n",cbs0,cbs); - printf("cbd0 = %.7e ,cbd = %.7e,\n",cbd0,cbd); - printf("DcdprmDp = %.7e,\n",DcdprmDp); - printf("DcsprmDp = %.7e,\n",DcsprmDp); - printf("DcdprDp = %.7e,\n",DcdprDp); - printf("DcsprDp = %.7e,\n",DcsprDp); - printf("qgs0 = %.7e \n",qgs0); - printf("qgd0 = %.7e \n",qgd0); - printf("qgb0 = %.7e \n",qgb0); - printf("qbs0 = %.7e ,qbs = %.7e,\n",qbs0,qbs); - printf("qbd0 = %.7e ,qbd = %.7e,\n",qbd0,qbd); - printf("DqgsDp = %.7e \n",DqgsDp); - printf("DqgdDp = %.7e \n",DqgdDp); - printf("DqgbDp = %.7e \n",DqgbDp); - printf("DqbsDp = %.7e \n",DqbsDp); - printf("DqbdDp = %.7e \n",DqbdDp); - printf("EffectiveLength = %.7e \n",EffectiveLength); - printf("tdepCap = %.7e \n",here->MOS3tDepCap); - printf("\n"); -#endif /* SENSDEBUG*/ - if((info->SENmode == TRANSEN) && - (ckt->CKTmode & MODEINITTRAN)) - goto next2; - - /* - * load RHS matrix - */ - - if(flag == 0){ - *(info->SEN_RHS[here->MOS3bNode] + here->MOS3senParmNo) - -= model->MOS3type * DcbDp; - *(info->SEN_RHS[here->MOS3dNode] + here->MOS3senParmNo) - -= model->MOS3type * DcdprDp; - *(info->SEN_RHS[here->MOS3dNodePrime] + here->MOS3senParmNo) - -= model->MOS3type * DcdprmDp; - *(info->SEN_RHS[here->MOS3sNode] + here->MOS3senParmNo) - -= model->MOS3type * DcsprDp; - *(info->SEN_RHS[here->MOS3sNodePrime] + here->MOS3senParmNo) - -= model->MOS3type * DcsprmDp; - } - else{ - offset = here->MOS3sens_l; - - *(info->SEN_RHS[here->MOS3bNode] + here->MOS3senParmNo + - offset) -= model->MOS3type * DcbDp; - *(info->SEN_RHS[here->MOS3dNode] + here->MOS3senParmNo + - offset) -= model->MOS3type * DcdprDp; - *(info->SEN_RHS[here->MOS3dNodePrime] + here->MOS3senParmNo - + offset) -= model->MOS3type * DcdprmDp; - *(info->SEN_RHS[here->MOS3sNode] + here->MOS3senParmNo + - offset) -= model->MOS3type * DcsprDp; - *(info->SEN_RHS[here->MOS3sNodePrime] + here->MOS3senParmNo - + offset) -= model->MOS3type * DcsprmDp; - } -#ifdef SENSDEBUG - printf("after loading\n"); - if(flag == 0){ - printf("DcbDp=%.7e\n", - *(info->SEN_RHS[here->MOS3bNode] + - here->MOS3senParmNo)); - printf("DcdprDp=%.7e\n", - *(info->SEN_RHS[here->MOS3dNode] + - here->MOS3senParmNo)); - printf("DcsprDp=%.7e\n", - *(info->SEN_RHS[here->MOS3sNode] + - here->MOS3senParmNo)); - printf("DcdprmDp=%.7e\n", - *(info->SEN_RHS[here->MOS3dNodePrime] + - here->MOS3senParmNo)); - printf("DcsprmDp=%.7e\n", - *(info->SEN_RHS[here->MOS3sNodePrime] + - here->MOS3senParmNo)); - printf("\n"); - } - else{ - printf("DcbDp=%.7e\n", - *(info->SEN_RHS[here->MOS3bNode] + - here->MOS3senParmNo + here->MOS3sens_l)); - printf("DcdprDp=%.7e\n", - *(info->SEN_RHS[here->MOS3dNode] + - here->MOS3senParmNo + here->MOS3sens_l)); - printf("DcsprDp=%.7e\n", - *(info->SEN_RHS[here->MOS3sNode] + - here->MOS3senParmNo + here->MOS3sens_l)); - printf("DcdprmDp=%.7e\n", - *(info->SEN_RHS[here->MOS3dNodePrime] + - here->MOS3senParmNo + here->MOS3sens_l)); - printf("DcsprmDp=%.7e\n", - *(info->SEN_RHS[here->MOS3sNodePrime] + - here->MOS3senParmNo + here->MOS3sens_l)); - } -#endif /* SENSDEBUG*/ -next2: - ; - } -next1: - if((info->SENmode == DCSEN) || - (ckt->CKTmode&MODETRANOP) ) goto restore; - if((info->SENmode == TRANSEN) && - (ckt->CKTmode & MODEINITTRAN)) goto restore; - for(iparmno = 1;iparmno<=info->SENparms;iparmno++){ -#ifdef SENSDEBUG - printf("after conductive currents\n"); - printf("iparmno = %d\n",iparmno); - printf("DcbDp=%.7e\n", - *(info->SEN_RHS[here->MOS3bNode] + iparmno)); - printf("DcdprDp=%.7e\n", - *(info->SEN_RHS[here->MOS3dNode] + iparmno)); - printf("DcdprmDp=%.7e\n", - *(info->SEN_RHS[here->MOS3dNodePrime] + iparmno)); - printf("DcsprDp=%.7e\n", - *(info->SEN_RHS[here->MOS3sNode] + iparmno)); - printf("DcsprmDp=%.7e\n", - *(info->SEN_RHS[here->MOS3sNodePrime] + iparmno)); - printf("\n"); -#endif /* SENSDEBUG */ - Osxpgs = tag0 * *(ckt->CKTstate1 + here->MOS3sensxpgs + - 10*(iparmno - 1)) - + tag1 * *(ckt->CKTstate1 + here->MOS3sensxpgs + - 10*(iparmno - 1) + 1); - - Osxpgd = tag0 * *(ckt->CKTstate1 + here->MOS3sensxpgd + - 10*(iparmno - 1)) - + tag1 * *(ckt->CKTstate1 + here->MOS3sensxpgd + - 10*(iparmno - 1) + 1); - - Osxpbs = tag0 * *(ckt->CKTstate1 + here->MOS3sensxpbs + - 10*(iparmno - 1)) - + tag1 * *(ckt->CKTstate1 + here->MOS3sensxpbs + - 10*(iparmno - 1) + 1); - - Osxpbd =tag0 * *(ckt->CKTstate1 + here->MOS3sensxpbd + - 10*(iparmno - 1)) - + tag1 * *(ckt->CKTstate1 + here->MOS3sensxpbd + - 10*(iparmno - 1) + 1); - Osxpgb = tag0 * *(ckt->CKTstate1 + here->MOS3sensxpgb + - 10*(iparmno - 1)) - + tag1 * *(ckt->CKTstate1 + here->MOS3sensxpgb + - 10*(iparmno - 1) + 1); - -#ifdef SENSDEBUG - printf("iparmno=%d\n",iparmno); - printf("sxpgs=%.7e,sdgs=%.7e\n", - *(ckt->CKTstate1 + here->MOS3sensxpgs + - 10*(iparmno - 1)), *(ckt->CKTstate1 + - here->MOS3sensxpgs + 10*(iparmno - 1) + 1)); - printf("sxpgd=%.7e,sdgd=%.7e\n", - *(ckt->CKTstate1 + here->MOS3sensxpgd + - 10*(iparmno - 1)), *(ckt->CKTstate1 + - here->MOS3sensxpgd + 10*(iparmno - 1) + 1)); - printf("sxpbs=%.7e,sdbs=%.7e\n", - *(ckt->CKTstate1 + here->MOS3sensxpbs + - 10*(iparmno - 1)), *(ckt->CKTstate1 + - here->MOS3sensxpbs + 10*(iparmno - 1) + 1)); - printf("sxpbd=%.7e,sdbd=%.7e\n", - *(ckt->CKTstate1 + here->MOS3sensxpbd + - 10*(iparmno - 1)), *(ckt->CKTstate1 + - here->MOS3sensxpbd + 10*(iparmno - 1) + 1)); - printf("sxpgb=%.7e,sdgb=%.7e\n", - *(ckt->CKTstate1 + here->MOS3sensxpgb + - 10*(iparmno - 1)), *(ckt->CKTstate1 + - here->MOS3sensxpgb + 10*(iparmno - 1) + 1)); - printf("before loading DqDp\n"); - printf("Osxpgs=%.7e,Osxpgd=%.7e\n",Osxpgs,Osxpgd); - printf("Osxpbs=%.7e,Osxpbd=%.7e,Osxpgb=%.7e\n", - Osxpbs,Osxpbd,Osxpgb); - printf("\n"); -#endif /* SENSDEBUG */ - if(here->MOS3sens_l && (iparmno == here->MOS3senParmNo)){ - Osxpgs -= tag0 * *(here->MOS3dphigs_dl); - Osxpgd -= tag0 * *(here->MOS3dphigd_dl); - Osxpbs -= tag0 * *(here->MOS3dphibs_dl); - Osxpbd -= tag0 * *(here->MOS3dphibd_dl); - Osxpgb -= tag0 * *(here->MOS3dphigb_dl); - } - if(here->MOS3sens_w && - (iparmno == (here->MOS3senParmNo + - (int) here->MOS3sens_l))){ - Osxpgs -= tag0 * *(here->MOS3dphigs_dw); - Osxpgd -= tag0 * *(here->MOS3dphigd_dw); - Osxpbs -= tag0 * *(here->MOS3dphibs_dw); - Osxpbd -= tag0 * *(here->MOS3dphibd_dw); - Osxpgb -= tag0 * *(here->MOS3dphigb_dw); - } -#ifdef SENSDEBUG - printf("after loading DqDp\n"); - printf("DqgsDp=%.7e",DqgsDp); - printf("Osxpgs=%.7e,Osxpgd=%.7e\n",Osxpgs,Osxpgd); - printf("Osxpbs=%.7e,Osxpbd=%.7e,Osxpgb=%.7e\n", - Osxpbs,Osxpbd,Osxpgb); -#endif /* SENSDEBUG */ - - *(info->SEN_RHS[here->MOS3bNode] + iparmno) += - Osxpbs + Osxpbd -Osxpgb; - *(info->SEN_RHS[here->MOS3gNode] + iparmno) += - Osxpgs + Osxpgd + Osxpgb; - - *(info->SEN_RHS[here->MOS3dNodePrime] + iparmno) -= - Osxpgd + Osxpbd ; - *(info->SEN_RHS[here->MOS3sNodePrime] + iparmno) -= - Osxpgs + Osxpbs; -#ifdef SENSDEBUG - printf("after capacitive currents\n"); - printf("DcbDp=%.7e\n", - *(info->SEN_RHS[here->MOS3bNode] + iparmno)); - printf("DcdprDp=%.7e\n", - *(info->SEN_RHS[here->MOS3dNode] + iparmno)); - printf("DcdprmDp=%.7e\n", - *(info->SEN_RHS[here->MOS3dNodePrime] + iparmno)); - printf("DcsprDp=%.7e\n", - *(info->SEN_RHS[here->MOS3sNode] + iparmno)); - printf("DcsprmDp=%.7e\n", - *(info->SEN_RHS[here->MOS3sNodePrime] + iparmno)); -#endif /* SENSDEBUG */ - - } -restore: /* put the unperturbed values back into the state vector */ - for(i=0; i <= 16; i++) - *(ckt->CKTstate0 + here->MOS3states + i) = *(SaveState + i); - here->MOS3sourceConductance = *(SaveState + 17) ; - here->MOS3drainConductance = *(SaveState + 18) ; - here->MOS3cd = *(SaveState + 19) ; - here->MOS3cbs = *(SaveState + 20) ; - here->MOS3cbd = *(SaveState + 21) ; - here->MOS3gmbs = *(SaveState + 22) ; - here->MOS3gm = *(SaveState + 23) ; - here->MOS3gds = *(SaveState + 24) ; - here->MOS3gbd = *(SaveState + 25) ; - here->MOS3gbs = *(SaveState + 26) ; - here->MOS3capbd = *(SaveState + 27) ; - here->MOS3capbs = *(SaveState + 28) ; - here->MOS3Cbd = *(SaveState + 29) ; - here->MOS3Cbdsw = *(SaveState + 30) ; - here->MOS3Cbs = *(SaveState + 31) ; - here->MOS3Cbssw = *(SaveState + 32) ; - here->MOS3f2d = *(SaveState + 33) ; - here->MOS3f3d = *(SaveState + 34) ; - here->MOS3f4d = *(SaveState + 35) ; - here->MOS3f2s = *(SaveState + 36) ; - here->MOS3f3s = *(SaveState + 37) ; - here->MOS3f4s = *(SaveState + 38) ; - here->MOS3cgs = *(SaveState + 39) ; - here->MOS3cgd = *(SaveState + 40) ; - here->MOS3cgb = *(SaveState + 41) ; - here->MOS3vdsat = *(SaveState + 42) ; - here->MOS3von = *(SaveState + 43) ; - here->MOS3mode = save_mode ; - - here->MOS3senPertFlag = OFF; - - } - } - info->SENstatus = NORMAL; -#ifdef SENSDEBUG - printf("MOS3senload end\n"); -#endif /* SENSDEBUG */ - return(OK); -} - diff --git a/src/spicelib/devices/mos3/mos3sprt.c b/src/spicelib/devices/mos3/mos3sprt.c deleted file mode 100644 index cfa7356c7..000000000 --- a/src/spicelib/devices/mos3/mos3sprt.c +++ /dev/null @@ -1,64 +0,0 @@ -/********** -Copyright 1990 Regents of the University of California. All rights reserved. -Author: 1985 Thomas L. Quarles -Modified: 2000 AlansFixes - -This function is obsolete (was used by an old sensitivity analysis) -**********/ - - /* Pretty print the sensitivity info for all the MOS3 - * devices in the circuit. - */ - -#include "ngspice/ngspice.h" -#include "ngspice/smpdefs.h" -#include "ngspice/cktdefs.h" -#include "mos3defs.h" -#include "ngspice/sperror.h" -#include "ngspice/suffix.h" - -void -MOS3sPrint(GENmodel *inModel, CKTcircuit *ckt) -{ - MOS3model *model = (MOS3model *)inModel; - MOS3instance *here; - - printf("LEVEL 3 MOSFETS-----------------\n"); - /* loop through all the MOS3 models */ - for( ; model != NULL; model = MOS3nextModel(model)) { - - printf("Model name:%s\n",model->MOS3modName); - - /* loop through all the instances of the model */ - for (here = MOS3instances(model); here != NULL ; - here=MOS3nextInstance(here)) { - - printf(" Instance name:%s\n",here->MOS3name); - printf(" Drain, Gate , Source nodes: %s, %s ,%s\n", - CKTnodName(ckt,here->MOS3dNode),CKTnodName(ckt,here->MOS3gNode), - CKTnodName(ckt,here->MOS3sNode)); - - printf(" Multiplier: %g ",here->MOS3m); - printf(here->MOS3mGiven ? "(specified)\n" : "(default)\n"); - printf(" Length: %g ",here->MOS3l); - printf(here->MOS3lGiven ? "(specified)\n" : "(default)\n"); - printf(" Width: %g ",here->MOS3w); - printf(here->MOS3wGiven ? "(specified)\n" : "(default)\n"); - if(here->MOS3sens_l == 1){ - printf(" MOS3senParmNo:l = %d ",here->MOS3senParmNo); - } - else{ - printf(" MOS3senParmNo:l = 0 "); - } - if(here->MOS3sens_w == 1){ - printf(" w = %d \n",here->MOS3senParmNo + here->MOS3sens_l); - } - else{ - printf(" w = 0 \n"); - } - - - } - } -} - diff --git a/src/spicelib/devices/mos3/mos3sset.c b/src/spicelib/devices/mos3/mos3sset.c deleted file mode 100644 index 0be5ee875..000000000 --- a/src/spicelib/devices/mos3/mos3sset.c +++ /dev/null @@ -1,51 +0,0 @@ -/********** -Copyright 1990 Regents of the University of California. All rights reserved. -Author: 1985 Thomas L. Quarles - -This function is obsolete (was used by an old sensitivity analysis) -**********/ - - /* loop through all the devices and - * allocate parameter #s to design parameters - */ - -#include "ngspice/ngspice.h" -#include "ngspice/smpdefs.h" -#include "ngspice/cktdefs.h" -#include "mos3defs.h" -#include "ngspice/sperror.h" -#include "ngspice/suffix.h" - -int -MOS3sSetup(SENstruct *info, GENmodel *inModel) -{ - MOS3model *model = (MOS3model *)inModel; - MOS3instance *here; - - /* loop through all the models */ - for( ; model != NULL; model = MOS3nextModel(model)) { - - /* loop through all the instances of the model */ - for (here = MOS3instances(model); here != NULL ; - here=MOS3nextInstance(here)) { - - if(here->MOS3senParmNo){ - if((here->MOS3sens_l)&&(here->MOS3sens_w)){ - here->MOS3senParmNo = ++(info->SENparms); - ++(info->SENparms);/* MOS has two design parameters */ - } - else{ - here->MOS3senParmNo = ++(info->SENparms); - } - } - here->MOS3senPertFlag = OFF; - if((here->MOS3sens = TMALLOC(double, 72)) == NULL) { - return(E_NOMEM); - } - - } - } - return(OK); -} - - diff --git a/src/spicelib/devices/mos3/mos3supd.c b/src/spicelib/devices/mos3/mos3supd.c deleted file mode 100644 index fda91e187..000000000 --- a/src/spicelib/devices/mos3/mos3supd.c +++ /dev/null @@ -1,180 +0,0 @@ -/********** -Copyright 1990 Regents of the University of California. All rights reserved. -Author: 1985 Thomas L. Quarles - -This function is obsolete (was used by an old sensitivity analysis) -**********/ - -#include "ngspice/ngspice.h" -#include "ngspice/smpdefs.h" -#include "ngspice/cktdefs.h" -#include "mos3defs.h" -#include "ngspice/sperror.h" -#include "ngspice/suffix.h" - -int -MOS3sUpdate(GENmodel *inModel, CKTcircuit *ckt) -{ - MOS3model *model = (MOS3model *)inModel; - MOS3instance *here; - int iparmno; - double sb; - double sg; - double sdprm; - double ssprm; - double sxpgs; - double sxpgd; - double sxpbs; - double sxpbd; - double sxpgb; - double dummy1; - double dummy2; - SENstruct *info; - - - if(ckt->CKTtime == 0) return(OK); - info = ckt->CKTsenInfo; - -#ifdef SENSDEBUG - printf("MOS3senupdate\n"); - printf("CKTtime = %.5e\n",ckt->CKTtime); -#endif /* SENSDEBUG */ - - sxpgs = 0; - sxpgd = 0; - sxpbs = 0; - sxpbd = 0; - sxpgb = 0; - dummy1 = 0; - dummy2 = 0; - - /* loop through all the MOS3 models */ - for( ; model != NULL; model = MOS3nextModel(model)) { - - /* loop through all the instances of the model */ - for (here = MOS3instances(model); here != NULL ; - here=MOS3nextInstance(here)) { - -#ifdef SENSDEBUG - printf("senupdate instance name %s\n",here->MOS3name); - printf("before loading\n"); - printf("CKTag[0] = %.2e,CKTag[1] = %.2e\n", - ckt->CKTag[0],ckt->CKTag[1]); - printf("capgs = %.7e\n",here->MOS3cgs); - printf("capgd = %.7e\n",here->MOS3cgd); - printf("capgb = %.7e\n",here->MOS3cgb); - printf("capbs = %.7e\n",here->MOS3capbs); - printf("capbd = %.7e\n",here->MOS3capbd); -#endif /* SENSDEBUG */ - - for(iparmno = 1;iparmno<=info->SENparms;iparmno++){ - - sb = *(info->SEN_Sap[here->MOS3bNode] + iparmno); - sg = *(info->SEN_Sap[here->MOS3gNode] + iparmno); - ssprm = *(info->SEN_Sap[here->MOS3sNodePrime] + iparmno); - sdprm = *(info->SEN_Sap[here->MOS3dNodePrime] + iparmno); -#ifdef SENSDEBUG - printf("iparmno = %d\n",iparmno); - printf("sb = %.7e,sg = %.7e\n",sb,sg); - printf("ssprm = %.7e,sdprm = %.7e\n",ssprm,sdprm); -#endif /* SENSDEBUG */ - - sxpgs = (sg - ssprm) * here->MOS3cgs ; - sxpgd = (sg - sdprm) * here->MOS3cgd ; - sxpgb = (sg - sb) * here->MOS3cgb ; - sxpbs = (sb - ssprm) * here->MOS3capbs ; - sxpbd = (sb - sdprm) * here->MOS3capbd ; - - if(here->MOS3sens_l && (iparmno == here->MOS3senParmNo)){ - sxpgs += *(here->MOS3dphigs_dl); - sxpgd += *(here->MOS3dphigd_dl); - sxpbs += *(here->MOS3dphibs_dl); - sxpbd += *(here->MOS3dphibd_dl); - sxpgb += *(here->MOS3dphigb_dl); - } - if(here->MOS3sens_w && - (iparmno == (here->MOS3senParmNo + - (int) here->MOS3sens_l))){ - sxpgs += *(here->MOS3dphigs_dw); - sxpgd += *(here->MOS3dphigd_dw); - sxpbs += *(here->MOS3dphibs_dw); - sxpbd += *(here->MOS3dphibd_dw); - sxpgb += *(here->MOS3dphigb_dw); - } - if(ckt->CKTmode & MODEINITTRAN) { - *(ckt->CKTstate1 + here->MOS3sensxpgs + - 10 * (iparmno - 1)) = sxpgs; - *(ckt->CKTstate1 + here->MOS3sensxpgd + - 10 * (iparmno - 1)) = sxpgd; - *(ckt->CKTstate1 + here->MOS3sensxpbs + - 10 * (iparmno - 1)) = sxpbs; - *(ckt->CKTstate1 + here->MOS3sensxpbd + - 10 * (iparmno - 1)) = sxpbd; - *(ckt->CKTstate1 + here->MOS3sensxpgb + - 10 * (iparmno - 1)) = sxpgb; - *(ckt->CKTstate1 + here->MOS3sensxpgs + - 10 * (iparmno - 1) + 1) = 0; - *(ckt->CKTstate1 + here->MOS3sensxpgd + - 10 * (iparmno - 1) + 1) = 0; - *(ckt->CKTstate1 + here->MOS3sensxpbs + - 10 * (iparmno - 1) + 1) = 0; - *(ckt->CKTstate1 + here->MOS3sensxpbd + - 10 * (iparmno - 1) + 1) = 0; - *(ckt->CKTstate1 + here->MOS3sensxpgb + - 10 * (iparmno - 1) + 1) = 0; - goto next; - } - - *(ckt->CKTstate0 + here->MOS3sensxpgs + - 10 * (iparmno - 1)) = sxpgs; - *(ckt->CKTstate0 + here->MOS3sensxpgd + - 10 * (iparmno - 1)) = sxpgd; - *(ckt->CKTstate0 + here->MOS3sensxpbs + - 10 * (iparmno - 1)) = sxpbs; - *(ckt->CKTstate0 + here->MOS3sensxpbd + - 10 * (iparmno - 1)) = sxpbd; - *(ckt->CKTstate0 + here->MOS3sensxpgb + - 10 * (iparmno - 1)) = sxpgb; - - NIintegrate(ckt,&dummy1,&dummy2,here->MOS3cgs, - here->MOS3sensxpgs + 10*(iparmno -1)); - NIintegrate(ckt,&dummy1,&dummy2,here->MOS3cgd, - here->MOS3sensxpgd + 10*(iparmno -1)); - NIintegrate(ckt,&dummy1,&dummy2,here->MOS3cgb, - here->MOS3sensxpgb + 10*(iparmno -1)); - NIintegrate(ckt,&dummy1,&dummy2,here->MOS3capbs, - here->MOS3sensxpbs + 10*(iparmno -1)); - NIintegrate(ckt,&dummy1,&dummy2,here->MOS3capbd, - here->MOS3sensxpbd + 10*(iparmno -1)); - - -next: - ; -#ifdef SENSDEBUG - printf("after loading\n"); - printf("sxpgs = %.7e,sdotxpgs = %.7e\n", - sxpgs,*(ckt->CKTstate0 + here->MOS3sensxpgs + - 10 * (iparmno - 1) + 1)); - printf("sxpgd = %.7e,sdotxpgd = %.7e\n", - sxpgd,*(ckt->CKTstate0 + here->MOS3sensxpgd + - 10 * (iparmno - 1) + 1)); - printf("sxpgb = %.7e,sdotxpgb = %.7e\n", - sxpgb,*(ckt->CKTstate0 + here->MOS3sensxpgb + - 10 * (iparmno - 1) + 1)); - printf("sxpbs = %.7e,sdotxpbs = %.7e\n", - sxpbs,*(ckt->CKTstate0 + here->MOS3sensxpbs + - 10 * (iparmno - 1) + 1)); - printf("sxpbd = %.7e,sdotxpbd = %.7e\n", - sxpbd,*(ckt->CKTstate0 + here->MOS3sensxpbd + - 10 * (iparmno - 1) + 1)); -#endif /* SENSDEBUG */ - } - } - } -#ifdef SENSDEBUG - printf("MOS3senupdate end\n"); -#endif /* SENSDEBUG */ - return(OK); - -} - diff --git a/src/spicelib/devices/mos3/mos3temp.c b/src/spicelib/devices/mos3/mos3temp.c deleted file mode 100644 index 9dc912b70..000000000 --- a/src/spicelib/devices/mos3/mos3temp.c +++ /dev/null @@ -1,343 +0,0 @@ -/********** -Copyright 1990 Regents of the University of California. All rights reserved. -Author: 1985 Thomas L. Quarles -Modified: 2000 AlansFixes -**********/ - -#include "ngspice/ngspice.h" -#include "ngspice/cktdefs.h" -#include "mos3defs.h" -#include "ngspice/const.h" -#include "ngspice/sperror.h" -#include "ngspice/suffix.h" - -/* assuming silicon - make definition for epsilon of silicon */ -#define EPSSIL (11.7 * 8.854214871e-12) - -int -MOS3temp(GENmodel *inModel, CKTcircuit *ckt) -{ - MOS3model *model = (MOS3model *)inModel; - MOS3instance *here; - double wkfngs; - double wkfng; - double fermig; - double fermis; - double vfb; - double fact1,fact2; - double vt,vtnom; - double kt,kt1; - double ratio,ratio4; - double egfet,egfet1; - double pbfact,pbfact1,pbo; - double phio; - double arg1; - double capfact; - double gmanew,gmaold; - double ni_temp, nifact; - /* loop through all the mosfet models */ - for( ; model != NULL; model = MOS3nextModel(model)) { - - if(!model->MOS3tnomGiven) { - model->MOS3tnom = ckt->CKTnomTemp; - } - fact1 = model->MOS3tnom/REFTEMP; - vtnom = model->MOS3tnom*CONSTKoverQ; - kt1 = CONSTboltz * model->MOS3tnom; - egfet1 = 1.16-(7.02e-4*model->MOS3tnom*model->MOS3tnom)/ - (model->MOS3tnom+1108); - arg1 = -egfet1/(kt1+kt1)+1.1150877/(CONSTboltz*(REFTEMP+REFTEMP)); - pbfact1 = -2*vtnom *(1.5*log(fact1)+CHARGE*arg1); - nifact=(model->MOS3tnom/300)*sqrt(model->MOS3tnom/300); - nifact*=exp(0.5*egfet1*((1/(double)300)-(1/model->MOS3tnom))/ - CONSTKoverQ); - ni_temp=1.45e16*nifact; - - if (model->MOS3phi <= 0.0) { - SPfrontEnd->IFerrorf (ERR_FATAL, - "%s: Phi is not positive.", model->MOS3modName); - return(E_BADPARM); - } - - model->MOS3oxideCapFactor = 3.9 * 8.854214871e-12/ - model->MOS3oxideThickness; - if(!model->MOS3surfaceMobilityGiven) model->MOS3surfaceMobility=600; - if(!model->MOS3transconductanceGiven) { - model->MOS3transconductance = model->MOS3surfaceMobility * - model->MOS3oxideCapFactor * 1e-4; - } - if(model->MOS3substrateDopingGiven) { - if(model->MOS3substrateDoping*1e6 /*(cm**3/m**3)*/ >ni_temp) { - if(!model->MOS3phiGiven) { - model->MOS3phi = 2*vtnom* - log(model->MOS3substrateDoping* - 1e6/*(cm**3/m**3)*//ni_temp); - model->MOS3phi = MAX(.1,model->MOS3phi); - } - fermis = model->MOS3type * .5 * model->MOS3phi; - wkfng = 3.2; - if(!model->MOS3gateTypeGiven) model->MOS3gateType=1; - if(model->MOS3gateType != 0) { - fermig = model->MOS3type * model->MOS3gateType*.5*egfet1; - wkfng = 3.25 + .5 * egfet1 - fermig; - } - wkfngs = wkfng - (3.25 + .5 * egfet1 +fermis); - if(!model->MOS3gammaGiven) { - model->MOS3gamma = sqrt(2 * EPSSIL * - CHARGE * model->MOS3substrateDoping* - 1e6 /*(cm**3/m**3)*/ )/ model->MOS3oxideCapFactor; - } - if(!model->MOS3vt0Given) { - if(!model->MOS3surfaceStateDensityGiven) - model->MOS3surfaceStateDensity=0; - vfb = wkfngs - model->MOS3surfaceStateDensity * 1e4 - * CHARGE/model->MOS3oxideCapFactor; - model->MOS3vt0 = vfb + model->MOS3type * - (model->MOS3gamma * sqrt(model->MOS3phi)+ - model->MOS3phi); - } else { - vfb = model->MOS3vt0 - model->MOS3type * (model->MOS3gamma* - sqrt(model->MOS3phi)+model->MOS3phi); - } - model->MOS3alpha = (EPSSIL+EPSSIL)/ - (CHARGE*model->MOS3substrateDoping*1e6 /*(cm**3/m**3)*/ ); - model->MOS3coeffDepLayWidth = sqrt(model->MOS3alpha); - } else { - model->MOS3substrateDoping = 0; - SPfrontEnd->IFerrorf (ERR_FATAL, - "%s: Nsub < Ni ", model->MOS3modName); - return(E_BADPARM); - } - } - /* now model parameter preprocessing */ - model->MOS3narrowFactor = model->MOS3delta * 0.5 * M_PI * EPSSIL / - model->MOS3oxideCapFactor ; - - - /* loop through all instances of the model */ - for(here = MOS3instances(model); here!= NULL; - here = MOS3nextInstance(here)) { - - double czbd; /* zero voltage bulk-drain capacitance */ - double czbdsw; /* zero voltage bulk-drain sidewall capacitance */ - double czbs; /* zero voltage bulk-source capacitance */ - double czbssw; /* zero voltage bulk-source sidewall capacitance */ - double arg; /* 1 - fc */ - double sarg; /* (1-fc) ^^ (-mj) */ - double sargsw; /* (1-fc) ^^ (-mjsw) */ - - /* perform the parameter defaulting */ - - if(!here->MOS3dtempGiven) { - here->MOS3dtemp = 0.0; - } - - if(!here->MOS3tempGiven) { - here->MOS3temp = ckt->CKTtemp + here->MOS3dtemp; - } - vt = here->MOS3temp * CONSTKoverQ; - ratio = here->MOS3temp/model->MOS3tnom; - fact2 = here->MOS3temp/REFTEMP; - kt = here->MOS3temp * CONSTboltz; - egfet = 1.16-(7.02e-4*here->MOS3temp*here->MOS3temp)/ - (here->MOS3temp+1108); - arg = -egfet/(kt+kt)+1.1150877/(CONSTboltz*(REFTEMP+REFTEMP)); - pbfact = -2*vt *(1.5*log(fact2)+CHARGE*arg); - - if(!here->MOS3mGiven) { - here->MOS3m = ckt->CKTdefaultMosM; - } - if(!here->MOS3lGiven) { - here->MOS3l = ckt->CKTdefaultMosL; - } - if(!here->MOS3sourceAreaGiven) { - here->MOS3sourceArea = ckt->CKTdefaultMosAS; - } - if(!here->MOS3wGiven) { - here->MOS3w = ckt->CKTdefaultMosW; - } - if(model->MOS3drainResistanceGiven) { - if(model->MOS3drainResistance != 0) { - here->MOS3drainConductance = here->MOS3m / - model->MOS3drainResistance; - } else { - here->MOS3drainConductance = 0; - } - } else if (model->MOS3sheetResistanceGiven) { - if ((model->MOS3sheetResistance != 0) && - (here->MOS3drainSquares != 0)) { - here->MOS3drainConductance = - here->MOS3m / - (model->MOS3sheetResistance*here->MOS3drainSquares); - } else { - here->MOS3drainConductance = 0; - } - } else { - here->MOS3drainConductance = 0; - } - if(model->MOS3sourceResistanceGiven) { - if(model->MOS3sourceResistance != 0) { - here->MOS3sourceConductance = here->MOS3m / - model->MOS3sourceResistance; - } else { - here->MOS3sourceConductance = 0; - } - } else if (model->MOS3sheetResistanceGiven) { - if ((model->MOS3sheetResistance != 0) && - (here->MOS3sourceSquares != 0)) { - here->MOS3sourceConductance = - here->MOS3m / - (model->MOS3sheetResistance*here->MOS3sourceSquares); - } else { - here->MOS3sourceConductance = 0; - } - } else { - here->MOS3sourceConductance = 0; - } - - if(here->MOS3l - 2 * model->MOS3latDiff + - model->MOS3lengthAdjust <= 0) { - SPfrontEnd->IFerrorf (ERR_FATAL, - "%s: effective channel length less than zero", - here->MOS3name); - return(E_PARMVAL); - } - - if(here->MOS3w - 2 * model->MOS3widthNarrow + - model->MOS3widthAdjust <= 0) { - SPfrontEnd->IFerrorf (ERR_FATAL, - "%s: effective channel width less than zero", - here->MOS3name); - return(E_PARMVAL); - } - - ratio4 = ratio * sqrt(ratio); - here->MOS3tTransconductance = model->MOS3transconductance / ratio4; - here->MOS3tSurfMob = model->MOS3surfaceMobility/ratio4; - phio= (model->MOS3phi-pbfact1)/fact1; - here->MOS3tPhi = fact2 * phio + pbfact; - here->MOS3tVbi = - model->MOS3delvt0 + - model->MOS3vt0 - model->MOS3type * - (model->MOS3gamma* sqrt(model->MOS3phi)) - +.5*(egfet1-egfet) - + model->MOS3type*.5* (here->MOS3tPhi-model->MOS3phi); - here->MOS3tVto = here->MOS3tVbi + model->MOS3type * - model->MOS3gamma * sqrt(here->MOS3tPhi); - here->MOS3tSatCur = model->MOS3jctSatCur* - exp(-egfet/vt+egfet1/vtnom); - here->MOS3tSatCurDens = model->MOS3jctSatCurDensity * - exp(-egfet/vt+egfet1/vtnom); - pbo = (model->MOS3bulkJctPotential - pbfact1)/fact1; - gmaold = (model->MOS3bulkJctPotential-pbo)/pbo; - capfact = 1/(1+model->MOS3bulkJctBotGradingCoeff* - (4e-4*(model->MOS3tnom-REFTEMP)-gmaold)); - here->MOS3tCbd = model->MOS3capBD * capfact; - here->MOS3tCbs = model->MOS3capBS * capfact; - here->MOS3tCj = model->MOS3bulkCapFactor * capfact; - capfact = 1/(1+model->MOS3bulkJctSideGradingCoeff* - (4e-4*(model->MOS3tnom-REFTEMP)-gmaold)); - here->MOS3tCjsw = model->MOS3sideWallCapFactor * capfact; - here->MOS3tBulkPot = fact2 * pbo+pbfact; - gmanew = (here->MOS3tBulkPot-pbo)/pbo; - capfact = (1+model->MOS3bulkJctBotGradingCoeff* - (4e-4*(here->MOS3temp-REFTEMP)-gmanew)); - here->MOS3tCbd *= capfact; - here->MOS3tCbs *= capfact; - here->MOS3tCj *= capfact; - capfact = (1+model->MOS3bulkJctSideGradingCoeff* - (4e-4*(here->MOS3temp-REFTEMP)-gmanew)); - here->MOS3tCjsw *= capfact; - here->MOS3tDepCap = model->MOS3fwdCapDepCoeff * here->MOS3tBulkPot; - - if( (model->MOS3jctSatCurDensity == 0) || - (here->MOS3drainArea == 0) || - (here->MOS3sourceArea == 0) ) { - here->MOS3sourceVcrit = here->MOS3drainVcrit = - vt*log(vt/(CONSTroot2*here->MOS3m*here->MOS3tSatCur)); - } else { - here->MOS3drainVcrit = - vt * log( vt / (CONSTroot2 * - here->MOS3m * - here->MOS3tSatCurDens * here->MOS3drainArea)); - here->MOS3sourceVcrit = - vt * log( vt / (CONSTroot2 * - here->MOS3m * - here->MOS3tSatCurDens * here->MOS3sourceArea)); - } - if(model->MOS3capBDGiven) { - czbd = here->MOS3tCbd * here->MOS3m; - } else { - if(model->MOS3bulkCapFactorGiven) { - czbd=here->MOS3tCj*here->MOS3drainArea * here->MOS3m; - } else { - czbd=0; - } - } - if(model->MOS3sideWallCapFactorGiven) { - czbdsw= here->MOS3tCjsw * here->MOS3drainPerimiter * - here->MOS3m; - } else { - czbdsw=0; - } - arg = 1-model->MOS3fwdCapDepCoeff; - sarg = exp( (-model->MOS3bulkJctBotGradingCoeff) * log(arg) ); - sargsw = exp( (-model->MOS3bulkJctSideGradingCoeff) * log(arg) ); - here->MOS3Cbd = czbd; - here->MOS3Cbdsw = czbdsw; - here->MOS3f2d = czbd*(1-model->MOS3fwdCapDepCoeff* - (1+model->MOS3bulkJctBotGradingCoeff))* sarg/arg - + czbdsw*(1-model->MOS3fwdCapDepCoeff* - (1+model->MOS3bulkJctSideGradingCoeff))* - sargsw/arg; - here->MOS3f3d = czbd * model->MOS3bulkJctBotGradingCoeff * sarg/arg/ - here->MOS3tBulkPot - + czbdsw * model->MOS3bulkJctSideGradingCoeff * sargsw/arg / - here->MOS3tBulkPot; - here->MOS3f4d = czbd*here->MOS3tBulkPot*(1-arg*sarg)/ - (1-model->MOS3bulkJctBotGradingCoeff) - + czbdsw*here->MOS3tBulkPot*(1-arg*sargsw)/ - (1-model->MOS3bulkJctSideGradingCoeff) - -here->MOS3f3d/2* - (here->MOS3tDepCap*here->MOS3tDepCap) - -here->MOS3tDepCap * here->MOS3f2d; - if(model->MOS3capBSGiven) { - czbs = here->MOS3tCbs * here->MOS3m; - } else { - if(model->MOS3bulkCapFactorGiven) { - czbs=here->MOS3tCj*here->MOS3sourceArea * here->MOS3m; - } else { - czbs=0; - } - } - if(model->MOS3sideWallCapFactorGiven) { - czbssw = here->MOS3tCjsw * here->MOS3sourcePerimiter * - here->MOS3m; - } else { - czbssw=0; - } - arg = 1-model->MOS3fwdCapDepCoeff; - sarg = exp( (-model->MOS3bulkJctBotGradingCoeff) * log(arg) ); - sargsw = exp( (-model->MOS3bulkJctSideGradingCoeff) * log(arg) ); - here->MOS3Cbs = czbs; - here->MOS3Cbssw = czbssw; - here->MOS3f2s = czbs*(1-model->MOS3fwdCapDepCoeff* - (1+model->MOS3bulkJctBotGradingCoeff))* sarg/arg - + czbssw*(1-model->MOS3fwdCapDepCoeff* - (1+model->MOS3bulkJctSideGradingCoeff))* - sargsw/arg; - here->MOS3f3s = czbs * model->MOS3bulkJctBotGradingCoeff * sarg/arg/ - here->MOS3tBulkPot - + czbssw * model->MOS3bulkJctSideGradingCoeff * sargsw/arg / - here->MOS3tBulkPot; - here->MOS3f4s = czbs*here->MOS3tBulkPot*(1-arg*sarg)/ - (1-model->MOS3bulkJctBotGradingCoeff) - + czbssw*here->MOS3tBulkPot*(1-arg*sargsw)/ - (1-model->MOS3bulkJctSideGradingCoeff) - -here->MOS3f3s/2* - (here->MOS3tDepCap*here->MOS3tDepCap) - -here->MOS3tDepCap * here->MOS3f2s; - } - } - return(OK); -} diff --git a/src/spicelib/devices/mos3/mos3trun.c b/src/spicelib/devices/mos3/mos3trun.c deleted file mode 100644 index e345617a5..000000000 --- a/src/spicelib/devices/mos3/mos3trun.c +++ /dev/null @@ -1,27 +0,0 @@ -/********** -Copyright 1990 Regents of the University of California. All rights reserved. -Author: 1985 Thomas L. Quarles -**********/ - -#include "ngspice/ngspice.h" -#include "ngspice/cktdefs.h" -#include "mos3defs.h" -#include "ngspice/sperror.h" -#include "ngspice/suffix.h" - -int -MOS3trunc(GENmodel *inModel, CKTcircuit *ckt, double *timeStep) -{ - MOS3model *model = (MOS3model *)inModel; - MOS3instance *here; - - for( ; model != NULL; model = MOS3nextModel(model)) { - for(here=MOS3instances(model);here!=NULL;here = MOS3nextInstance(here)){ - - CKTterr(here->MOS3qgs,ckt,timeStep); - CKTterr(here->MOS3qgd,ckt,timeStep); - CKTterr(here->MOS3qgb,ckt,timeStep); - } - } - return(OK); -} diff --git a/src/spicelib/devices/mos6/ChangeLog b/src/spicelib/devices/mos6/ChangeLog deleted file mode 100644 index f5b99d3c2..000000000 --- a/src/spicelib/devices/mos6/ChangeLog +++ /dev/null @@ -1,3 +0,0 @@ -1999-08-20 Paolo Nenzi - * mos6itf.h: added patch to the interface code. The patch was - downloaded from ftp://ftp.mpce.mq.edu.au/pub/elec/spice/patches diff --git a/src/spicelib/devices/mos6/Makefile.am b/src/spicelib/devices/mos6/Makefile.am deleted file mode 100644 index e0121599d..000000000 --- a/src/spicelib/devices/mos6/Makefile.am +++ /dev/null @@ -1,28 +0,0 @@ -## Process this file with automake to produce Makefile.in - -noinst_LTLIBRARIES = libmos6.la - -libmos6_la_SOURCES = \ - mos6.c \ - mos6ask.c \ - mos6conv.c \ - mos6defs.h \ - mos6del.c \ - mos6ext.h \ - mos6ic.c \ - mos6init.c \ - mos6init.h \ - mos6itf.h \ - mos6load.c \ - mos6mask.c \ - mos6mpar.c \ - mos6par.c \ - mos6set.c \ - mos6temp.c \ - mos6trun.c - - - -AM_CPPFLAGS = @AM_CPPFLAGS@ -I$(top_srcdir)/src/include -AM_CFLAGS = $(STATIC) -MAINTAINERCLEANFILES = Makefile.in diff --git a/src/spicelib/devices/mos6/mos6.c b/src/spicelib/devices/mos6/mos6.c deleted file mode 100644 index 65435f59e..000000000 --- a/src/spicelib/devices/mos6/mos6.c +++ /dev/null @@ -1,169 +0,0 @@ -/********** -Copyright 1990 Regents of the University of California. All rights reserved. -Author: 1989 Takayasu Sakurai -**********/ - -#include "ngspice/ngspice.h" -#include "ngspice/devdefs.h" -#include "ngspice/ifsim.h" -#include "mos6defs.h" -#include "ngspice/suffix.h" - -IFparm MOS6pTable[] = { /* parameters */ - IOPU("l", MOS6_L, IF_REAL , "Length"), - IOPU("w", MOS6_W, IF_REAL , "Width"), - IOPU("m", MOS6_M, IF_REAL , "Parallel Multiplier"), - IOPU("ad", MOS6_AD, IF_REAL , "Drain area"), - IOPU("as", MOS6_AS, IF_REAL , "Source area"), - IOPU("pd", MOS6_PD, IF_REAL , "Drain perimeter"), - IOPU("ps", MOS6_PS, IF_REAL , "Source perimeter"), - OP( "id", MOS6_CD, IF_REAL, "Drain current"), - OPR( "cd", MOS6_CD, IF_REAL, "Drain current"), - OP( "is", MOS6_CS, IF_REAL, "Source current"), - OP( "ig", MOS6_CG, IF_REAL, "Gate current "), - OP( "ib", MOS6_CB, IF_REAL, "Bulk current "), - OP( "ibs", MOS6_CBS, IF_REAL, "B-S junction capacitance"), - OP( "ibd", MOS6_CBD, IF_REAL, "B-D junction capacitance"), - OP( "vgs", MOS6_VGS, IF_REAL, "Gate-Source voltage"), - OP( "vds", MOS6_VDS, IF_REAL, "Drain-Source voltage"), - OP( "vbs", MOS6_VBS, IF_REAL, "Bulk-Source voltage"), - OPU( "vbd", MOS6_VBD, IF_REAL, "Bulk-Drain voltage"), - IOPU("nrd", MOS6_NRD, IF_REAL , "Drain squares"), - IOPU("nrs", MOS6_NRS, IF_REAL , "Source squares"), - IP("off", MOS6_OFF, IF_FLAG , "Device initially off"), - IOPAU("icvds", MOS6_IC_VDS, IF_REAL , "Initial D-S voltage"), - IOPAU("icvgs", MOS6_IC_VGS, IF_REAL , "Initial G-S voltage"), - IOPAU("icvbs", MOS6_IC_VBS, IF_REAL , "Initial B-S voltage"), - IOPU("temp", MOS6_TEMP, IF_REAL, "Instance temperature"), - IOPU("dtemp", MOS6_DTEMP, IF_REAL, "Instance temperature difference"), - IP( "ic", MOS6_IC, IF_REALVEC, "Vector of D-S, G-S, B-S voltages"), - IP( "sens_l", MOS6_L_SENS, IF_FLAG, "flag to request sensitivity WRT length"), - IP( "sens_w", MOS6_W_SENS, IF_FLAG, "flag to request sensitivity WRT width"), - -/* - OP( "cgs", MOS6_CGS, IF_REAL , "Gate-Source capacitance"), - OP( "cgd", MOS6_CGD, IF_REAL , "Gate-Drain capacitance"), -*/ - - OPU( "dnode", MOS6_DNODE, IF_INTEGER, "Number of the drain node "), - OPU( "gnode", MOS6_GNODE, IF_INTEGER, "Number of the gate node "), - OPU( "snode", MOS6_SNODE, IF_INTEGER, "Number of the source node "), - OPU( "bnode", MOS6_BNODE, IF_INTEGER, "Number of the node "), - OPU( "dnodeprime", MOS6_DNODEPRIME, IF_INTEGER, "Number of int. drain node"), - OPU( "snodeprime", MOS6_SNODEPRIME, IF_INTEGER, "Number of int. source node "), - OP( "rs", MOS6_SOURCERESIST, IF_REAL, "Source resistance"), - OPU("sourceconductance", MOS6_SOURCECONDUCT, IF_REAL, "Source conductance"), - OP( "rd", MOS6_DRAINRESIST, IF_REAL, "Drain resistance"), - OPU( "drainconductance", MOS6_DRAINCONDUCT, IF_REAL, "Drain conductance"), - OP( "von", MOS6_VON, IF_REAL, "Turn-on voltage"), - OP( "vdsat", MOS6_VDSAT, IF_REAL, "Saturation drain voltage"), - OPU( "sourcevcrit", MOS6_SOURCEVCRIT,IF_REAL, "Critical source voltage"), - OPU( "drainvcrit", MOS6_DRAINVCRIT, IF_REAL, "Critical drain voltage"), - - OP( "gmbs", MOS6_GMBS, IF_REAL, "Bulk-Source transconductance"), - OP( "gm", MOS6_GM, IF_REAL, "Transconductance"), - OP( "gds", MOS6_GDS, IF_REAL, "Drain-Source conductance"), - OP( "gbd", MOS6_GBD, IF_REAL, "Bulk-Drain conductance"), - OP( "gbs", MOS6_GBS, IF_REAL, "Bulk-Source conductance"), - - OP( "cgs", MOS6_CAPGS, IF_REAL, "Gate-Source capacitance"), - OP( "cgd", MOS6_CAPGD, IF_REAL, "Gate-Drain capacitance"), - OP( "cgb", MOS6_CAPGB, IF_REAL, "Gate-Bulk capacitance"), - OP( "cbd", MOS6_CAPBD, IF_REAL, "Bulk-Drain capacitance"), - OP( "cbs", MOS6_CAPBS, IF_REAL, "Bulk-Source capacitance"), - - OP( "cbd0", MOS6_CAPZEROBIASBD, IF_REAL, "Zero-Bias B-D junction capacitance"), - OP( "cbdsw0", MOS6_CAPZEROBIASBDSW, IF_REAL, " "), - OP( "cbs0", MOS6_CAPZEROBIASBS, IF_REAL, "Zero-Bias B-S junction capacitance"), - OP( "cbssw0", MOS6_CAPZEROBIASBSSW, IF_REAL, " "), - - OPU( "cqgs",MOS6_CQGS,IF_REAL,"Capacitance due to gate-source charge storage"), - OPU( "cqgd",MOS6_CQGD,IF_REAL,"Capacitance due to gate-drain charge storage"), - OPU( "cqgb",MOS6_CQGB,IF_REAL,"Capacitance due to gate-bulk charge storage"), - OPU( "cqbd",MOS6_CQBD,IF_REAL,"Capacitance due to bulk-drain charge storage"), - OPU( "cqbs",MOS6_CQBS,IF_REAL,"Capacitance due to bulk-source charge storage"), - OPU( "qgs", MOS6_QGS, IF_REAL, "Gate-Source charge storage"), - OPU( "qgd", MOS6_QGD, IF_REAL, "Gate-Drain charge storage"), - OPU( "qgb", MOS6_QGB, IF_REAL, "Gate-Bulk charge storage"), - OPU( "qbd", MOS6_QBD, IF_REAL, "Bulk-Drain charge storage"), - OPU( "qbs", MOS6_QBS, IF_REAL, "Bulk-Source charge storage"), - OPU( "p", MOS6_POWER, IF_REAL, "Instaneous power"), - OPU( "sens_l_dc", MOS6_L_SENS_DC, IF_REAL, "dc sensitivity wrt length"), - OPU( "sens_l_real", MOS6_L_SENS_REAL,IF_REAL, - "real part of ac sensitivity wrt length"), - OPU( "sens_l_imag", MOS6_L_SENS_IMAG,IF_REAL, - "imag part of ac sensitivity wrt length"), - OPU( "sens_l_mag", MOS6_L_SENS_MAG, IF_REAL, - "sensitivity wrt l of ac magnitude"), - OPU( "sens_l_ph", MOS6_L_SENS_PH, IF_REAL, - "sensitivity wrt l of ac phase"), - OPU( "sens_l_cplx", MOS6_L_SENS_CPLX,IF_COMPLEX, "ac sensitivity wrt length"), - OPU( "sens_w_dc", MOS6_W_SENS_DC, IF_REAL, "dc sensitivity wrt width"), - OPU( "sens_w_real", MOS6_W_SENS_REAL,IF_REAL, - "real part of ac sensitivity wrt width"), - OPU( "sens_w_imag", MOS6_W_SENS_IMAG,IF_REAL, - "imag part of ac sensitivity wrt width"), - OPU( "sens_w_mag", MOS6_W_SENS_MAG, IF_REAL, - "sensitivity wrt w of ac magnitude"), - OPU( "sens_w_ph", MOS6_W_SENS_PH, IF_REAL, - "sensitivity wrt w of ac phase"), - OPU( "sens_w_cplx", MOS6_W_SENS_CPLX,IF_COMPLEX, "ac sensitivity wrt width") -}; - -IFparm MOS6mPTable[] = { /* model parameters */ - OP("type", MOS6_MOD_TYPE, IF_STRING ,"N-channel or P-channel MOS"), - IOP("vto", MOS6_MOD_VTO, IF_REAL ,"Threshold voltage"), - IOPR("vt0", MOS6_MOD_VTO, IF_REAL ,"Threshold voltage"), - IOP("kv", MOS6_MOD_KV, IF_REAL ,"Saturation voltage factor"), - IOP("nv", MOS6_MOD_NV, IF_REAL ,"Saturation voltage coeff."), - IOP("kc", MOS6_MOD_KC, IF_REAL ,"Saturation current factor"), - IOP("nc", MOS6_MOD_NC, IF_REAL ,"Saturation current coeff."), - IOP("nvth", MOS6_MOD_NVTH, IF_REAL ,"Threshold voltage coeff."), - IOP("ps", MOS6_MOD_PS, IF_REAL ,"Sat. current modification par."), - IOP("gamma", MOS6_MOD_GAMMA, IF_REAL ,"Bulk threshold parameter"), - IOP("gamma1",MOS6_MOD_GAMMA1,IF_REAL ,"Bulk threshold parameter 1"), - IOP("sigma", MOS6_MOD_SIGMA, IF_REAL ,"Static feedback effect par."), - IOP("phi", MOS6_MOD_PHI, IF_REAL ,"Surface potential"), - IOP("lambda",MOS6_MOD_LAMBDA,IF_REAL ,"Channel length modulation param."), - IOP("lambda0",MOS6_MOD_LAMDA0,IF_REAL ,"Channel length modulation param. 0"), - IOP("lambda1",MOS6_MOD_LAMDA1,IF_REAL ,"Channel length modulation param. 1"), - IOP("rd", MOS6_MOD_RD, IF_REAL ,"Drain ohmic resistance"), - IOP("rs", MOS6_MOD_RS, IF_REAL ,"Source ohmic resistance"), - IOPA("cbd", MOS6_MOD_CBD, IF_REAL ,"B-D junction capacitance"), - IOPA("cbs", MOS6_MOD_CBS, IF_REAL ,"B-S junction capacitance"), - IOP("is", MOS6_MOD_IS, IF_REAL ,"Bulk junction sat. current"), - IOP("pb", MOS6_MOD_PB, IF_REAL ,"Bulk junction potential"), - IOPA("cgso", MOS6_MOD_CGSO, IF_REAL ,"Gate-source overlap cap."), - IOPA("cgdo", MOS6_MOD_CGDO, IF_REAL ,"Gate-drain overlap cap."), - IOPA("cgbo", MOS6_MOD_CGBO, IF_REAL ,"Gate-bulk overlap cap."), - IOP("rsh", MOS6_MOD_RSH, IF_REAL ,"Sheet resistance"), - IOPA("cj", MOS6_MOD_CJ, IF_REAL ,"Bottom junction cap per area"), - IOP("mj", MOS6_MOD_MJ, IF_REAL ,"Bottom grading coefficient"), - IOPA("cjsw", MOS6_MOD_CJSW, IF_REAL ,"Side junction cap per area"), - IOP("mjsw", MOS6_MOD_MJSW, IF_REAL ,"Side grading coefficient"), - IOP("js", MOS6_MOD_JS, IF_REAL ,"Bulk jct. sat. current density"), - IOP("ld", MOS6_MOD_LD, IF_REAL ,"Lateral diffusion"), - IOP("tox", MOS6_MOD_TOX, IF_REAL ,"Oxide thickness"), - IOP("u0", MOS6_MOD_U0, IF_REAL ,"Surface mobility"), - IOPR("uo", MOS6_MOD_U0, IF_REAL ,"Surface mobility"), - IOP("fc", MOS6_MOD_FC, IF_REAL ,"Forward bias jct. fit parm."), - IP("nmos", MOS6_MOD_NMOS, IF_FLAG ,"N type MOSfet model"), - IP("pmos", MOS6_MOD_PMOS, IF_FLAG ,"P type MOSfet model"), - IOP("tpg", MOS6_MOD_TPG, IF_INTEGER,"Gate type"), - IOP("nsub", MOS6_MOD_NSUB, IF_REAL ,"Substrate doping"), - IOP("nss", MOS6_MOD_NSS, IF_REAL ,"Surface state density"), - IOP("tnom", MOS6_MOD_TNOM, IF_REAL ,"Parameter measurement temperature") -}; - -char *MOS6names[] = { - "Drain", - "Gate", - "Source", - "Bulk" -}; - -int MOS6nSize = NUMELEMS(MOS6names); -int MOS6pTSize = NUMELEMS(MOS6pTable); -int MOS6mPTSize = NUMELEMS(MOS6mPTable); -int MOS6iSize = sizeof(MOS6instance); -int MOS6mSize = sizeof(MOS6model); diff --git a/src/spicelib/devices/mos6/mos6ask.c b/src/spicelib/devices/mos6/mos6ask.c deleted file mode 100644 index fc4aec4c1..000000000 --- a/src/spicelib/devices/mos6/mos6ask.c +++ /dev/null @@ -1,474 +0,0 @@ -/********** -Copyright 1990 Regents of the University of California. All rights reserved. -Author: 1989 Takayasu Sakurai -Modified: 2000 AlansFixes -**********/ - -#include "ngspice/ngspice.h" -#include "ngspice/const.h" -#include "ngspice/ifsim.h" -#include "ngspice/cktdefs.h" -#include "ngspice/devdefs.h" -#include "mos6defs.h" -#include "ngspice/sperror.h" -#include "ngspice/suffix.h" - -/*ARGSUSED*/ -int -MOS6ask(CKTcircuit *ckt, GENinstance *inst, int which, - IFvalue *value, IFvalue *select) -{ - MOS6instance *here = (MOS6instance*)inst; - double vr; - double vi; - double sr; - double si; - double vm; - static char *msg = "Current and power not available for ac analysis"; - switch(which) { - case MOS6_TEMP: - value->rValue = here->MOS6temp - CONSTCtoK; - return(OK); - case MOS6_DTEMP: - value->rValue = here->MOS6dtemp; - return(OK); - case MOS6_CGS: - value->rValue = 2* *(ckt->CKTstate0 + here->MOS6capgs); - value->rValue *= here->MOS6m; - return(OK); - case MOS6_CGD: - value->rValue = 2* *(ckt->CKTstate0 + here->MOS6capgd); - value->rValue *= here->MOS6m; - return(OK); - case MOS6_L: - value->rValue = here->MOS6l; - return(OK); - case MOS6_W: - value->rValue = here->MOS6w; - value->rValue *= here->MOS6m; - return(OK); - case MOS6_M: - value->rValue = here->MOS6m; - return(OK); - case MOS6_AS: - value->rValue = here->MOS6sourceArea; - value->rValue *= here->MOS6m; - return(OK); - case MOS6_AD: - value->rValue = here->MOS6drainArea; - value->rValue *= here->MOS6m; - return(OK); - case MOS6_PS: - value->rValue = here->MOS6sourcePerimiter; - value->rValue *= here->MOS6m; - return(OK); - case MOS6_PD: - value->rValue = here->MOS6drainPerimiter; - value->rValue *= here->MOS6m; - return(OK); - case MOS6_NRS: - value->rValue = here->MOS6sourceSquares; - value->rValue *= here->MOS6m; - return(OK); - case MOS6_NRD: - value->rValue = here->MOS6drainSquares; - value->rValue *= here->MOS6m; - return(OK); - case MOS6_OFF: - value->rValue = here->MOS6off; - return(OK); - case MOS6_IC_VBS: - value->rValue = here->MOS6icVBS; - return(OK); - case MOS6_IC_VDS: - value->rValue = here->MOS6icVDS; - return(OK); - case MOS6_IC_VGS: - value->rValue = here->MOS6icVGS; - return(OK); - case MOS6_DNODE: - value->iValue = here->MOS6dNode; - return(OK); - case MOS6_GNODE: - value->iValue = here->MOS6gNode; - return(OK); - case MOS6_SNODE: - value->iValue = here->MOS6sNode; - return(OK); - case MOS6_BNODE: - value->iValue = here->MOS6bNode; - return(OK); - case MOS6_DNODEPRIME: - value->iValue = here->MOS6dNodePrime; - return(OK); - case MOS6_SNODEPRIME: - value->iValue = here->MOS6sNodePrime; - return(OK); - case MOS6_SOURCECONDUCT: - value->rValue = here->MOS6sourceConductance; - value->rValue *= here->MOS6m; - return(OK); - case MOS6_DRAINCONDUCT: - value->rValue = here->MOS6drainConductance; - value->rValue *= here->MOS6m; - return(OK); - case MOS6_SOURCERESIST: - if (here->MOS6sNodePrime != here->MOS6sNode) - value->rValue = 1.0 / here->MOS6sourceConductance; - else - value->rValue = 0.0; - value->rValue /= here->MOS6m; - return(OK); - case MOS6_DRAINRESIST: - if (here->MOS6dNodePrime != here->MOS6dNode) - value->rValue = 1.0 / here->MOS6drainConductance; - else - value->rValue = 0.0; - value->rValue /= here->MOS6m; - return(OK); - case MOS6_VON: - value->rValue = here->MOS6von; - return(OK); - case MOS6_VDSAT: - value->rValue = here->MOS6vdsat; - return(OK); - case MOS6_SOURCEVCRIT: - value->rValue = here->MOS6sourceVcrit; - return(OK); - case MOS6_DRAINVCRIT: - value->rValue = here->MOS6drainVcrit; - return(OK); - case MOS6_CD: - value->rValue = here->MOS6cd; - value->rValue *= here->MOS6m; - return(OK); - case MOS6_CBS: - value->rValue = here->MOS6cbs; - value->rValue *= here->MOS6m; - return(OK); - case MOS6_CBD: - value->rValue = here->MOS6cbd; - value->rValue *= here->MOS6m; - return(OK); - case MOS6_GMBS: - value->rValue = here->MOS6gmbs; - value->rValue *= here->MOS6m; - return(OK); - case MOS6_GM: - value->rValue = here->MOS6gm; - value->rValue *= here->MOS6m; - return(OK); - case MOS6_GDS: - value->rValue = here->MOS6gds; - value->rValue *= here->MOS6m; - return(OK); - case MOS6_GBD: - value->rValue = here->MOS6gbd; - value->rValue *= here->MOS6m; - return(OK); - case MOS6_GBS: - value->rValue = here->MOS6gbs; - value->rValue *= here->MOS6m; - return(OK); - case MOS6_CAPBD: - value->rValue = here->MOS6capbd; - value->rValue *= here->MOS6m; - return(OK); - case MOS6_CAPBS: - value->rValue = here->MOS6capbs; - value->rValue *= here->MOS6m; - return(OK); - case MOS6_CAPZEROBIASBD: - value->rValue = here->MOS6Cbd; - value->rValue *= here->MOS6m; - return(OK); - case MOS6_CAPZEROBIASBDSW: - value->rValue = here->MOS6Cbdsw; - value->rValue *= here->MOS6m; - return(OK); - case MOS6_CAPZEROBIASBS: - value->rValue = here->MOS6Cbs; - value->rValue *= here->MOS6m; - return(OK); - case MOS6_CAPZEROBIASBSSW: - value->rValue = here->MOS6Cbssw; - value->rValue *= here->MOS6m; - return(OK); - case MOS6_VBD: - value->rValue = *(ckt->CKTstate0 + here->MOS6vbd); - return(OK); - case MOS6_VBS: - value->rValue = *(ckt->CKTstate0 + here->MOS6vbs); - return(OK); - case MOS6_VGS: - value->rValue = *(ckt->CKTstate0 + here->MOS6vgs); - return(OK); - case MOS6_VDS: - value->rValue = *(ckt->CKTstate0 + here->MOS6vds); - return(OK); - case MOS6_CAPGS: - value->rValue = 2* *(ckt->CKTstate0 + here->MOS6capgs); - /* add overlap capacitance */ - value->rValue += (MOS6modPtr(here)->MOS6gateSourceOverlapCapFactor) - * (here->MOS6w); - value->rValue *= here->MOS6m; - return(OK); - case MOS6_QGS: - value->rValue = *(ckt->CKTstate0 + here->MOS6qgs); - value->rValue *= here->MOS6m; - return(OK); - case MOS6_CQGS: - value->rValue = *(ckt->CKTstate0 + here->MOS6cqgs); - value->rValue *= here->MOS6m; - return(OK); - case MOS6_CAPGD: - value->rValue = 2* *(ckt->CKTstate0 + here->MOS6capgd); - /* add overlap capacitance */ - value->rValue += (MOS6modPtr(here)->MOS6gateSourceOverlapCapFactor) - * (here->MOS6w); - value->rValue *= here->MOS6m; - return(OK); - case MOS6_QGD: - value->rValue = *(ckt->CKTstate0 + here->MOS6qgd); - value->rValue *= here->MOS6m; - return(OK); - case MOS6_CQGD: - value->rValue = *(ckt->CKTstate0 + here->MOS6cqgd); - value->rValue *= here->MOS6m; - return(OK); - case MOS6_CAPGB: - value->rValue = 2* *(ckt->CKTstate0 + here->MOS6capgb); - /* add overlap capacitance */ - value->rValue += (MOS6modPtr(here)->MOS6gateBulkOverlapCapFactor) - * (here->MOS6l - -2*(MOS6modPtr(here)->MOS6latDiff)); - value->rValue *= here->MOS6m; - return(OK); - case MOS6_QGB: - value->rValue = *(ckt->CKTstate0 + here->MOS6qgb); - value->rValue *= here->MOS6m; - return(OK); - case MOS6_CQGB: - value->rValue = *(ckt->CKTstate0 + here->MOS6cqgb); - value->rValue *= here->MOS6m; - return(OK); - case MOS6_QBD: - value->rValue = *(ckt->CKTstate0 + here->MOS6qbd); - value->rValue *= here->MOS6m; - return(OK); - case MOS6_CQBD: - value->rValue = *(ckt->CKTstate0 + here->MOS6cqbd); - value->rValue *= here->MOS6m; - return(OK); - case MOS6_QBS: - value->rValue = *(ckt->CKTstate0 + here->MOS6qbs); - value->rValue *= here->MOS6m; - return(OK); - case MOS6_CQBS: - value->rValue = *(ckt->CKTstate0 + here->MOS6cqbs); - value->rValue *= here->MOS6m; - return(OK); - case MOS6_L_SENS_DC: - if(ckt->CKTsenInfo && here->MOS6sens_l){ - value->rValue = *(ckt->CKTsenInfo->SEN_Sap[select->iValue + 1]+ - here->MOS6senParmNo); - } - return(OK); - case MOS6_L_SENS_REAL: - if(ckt->CKTsenInfo && here->MOS6sens_l){ - value->rValue = *(ckt->CKTsenInfo->SEN_RHS[select->iValue + 1]+ - here->MOS6senParmNo); - } - return(OK); - case MOS6_L_SENS_IMAG: - if(ckt->CKTsenInfo && here->MOS6sens_l){ - value->rValue = *(ckt->CKTsenInfo->SEN_iRHS[select->iValue + 1]+ - here->MOS6senParmNo); - } - return(OK); - case MOS6_L_SENS_MAG: - if(ckt->CKTsenInfo && here->MOS6sens_l){ - vr = *(ckt->CKTrhsOld + select->iValue + 1); - vi = *(ckt->CKTirhsOld + select->iValue + 1); - vm = sqrt(vr*vr + vi*vi); - if(vm == 0){ - value->rValue = 0; - return(OK); - } - sr = *(ckt->CKTsenInfo->SEN_RHS[select->iValue + 1]+ - here->MOS6senParmNo); - si = *(ckt->CKTsenInfo->SEN_iRHS[select->iValue + 1]+ - here->MOS6senParmNo); - value->rValue = (vr * sr + vi * si)/vm; - } - return(OK); - case MOS6_L_SENS_PH: - if(ckt->CKTsenInfo && here->MOS6sens_l){ - vr = *(ckt->CKTrhsOld + select->iValue + 1); - vi = *(ckt->CKTirhsOld + select->iValue + 1); - vm = vr*vr + vi*vi; - if(vm == 0){ - value->rValue = 0; - return(OK); - } - sr = *(ckt->CKTsenInfo->SEN_RHS[select->iValue + 1]+ - here->MOS6senParmNo); - si = *(ckt->CKTsenInfo->SEN_iRHS[select->iValue + 1]+ - here->MOS6senParmNo); - value->rValue = (vr * si - vi * sr)/vm; - } - return(OK); - case MOS6_L_SENS_CPLX: - if(ckt->CKTsenInfo && here->MOS6sens_l){ - value->cValue.real= *(ckt->CKTsenInfo->SEN_RHS[select->iValue + 1]+ - here->MOS6senParmNo); - value->cValue.imag= *(ckt->CKTsenInfo->SEN_iRHS[select->iValue + 1]+ - here->MOS6senParmNo); - } - return(OK); - case MOS6_W_SENS_DC: - if(ckt->CKTsenInfo && here->MOS6sens_w){ - value->rValue = *(ckt->CKTsenInfo->SEN_Sap[select->iValue + 1]+ - here->MOS6senParmNo + here->MOS6sens_l); - } - return(OK); - case MOS6_W_SENS_REAL: - if(ckt->CKTsenInfo && here->MOS6sens_w){ - value->rValue = *(ckt->CKTsenInfo->SEN_RHS[select->iValue + 1]+ - here->MOS6senParmNo + here->MOS6sens_l); - } - return(OK); - case MOS6_W_SENS_IMAG: - if(ckt->CKTsenInfo && here->MOS6sens_w){ - value->rValue = *(ckt->CKTsenInfo->SEN_iRHS[select->iValue + 1]+ - here->MOS6senParmNo + here->MOS6sens_l); - } - return(OK); - case MOS6_W_SENS_MAG: - if(ckt->CKTsenInfo && here->MOS6sens_w){ - vr = *(ckt->CKTrhsOld + select->iValue + 1); - vi = *(ckt->CKTirhsOld + select->iValue + 1); - vm = sqrt(vr*vr + vi*vi); - if(vm == 0){ - value->rValue = 0; - return(OK); - } - sr = *(ckt->CKTsenInfo->SEN_RHS[select->iValue + 1]+ - here->MOS6senParmNo + here->MOS6sens_l); - si = *(ckt->CKTsenInfo->SEN_iRHS[select->iValue + 1]+ - here->MOS6senParmNo + here->MOS6sens_l); - value->rValue = (vr * sr + vi * si)/vm; - } - return(OK); - case MOS6_W_SENS_PH: - if(ckt->CKTsenInfo && here->MOS6sens_w){ - vr = *(ckt->CKTrhsOld + select->iValue + 1); - vi = *(ckt->CKTirhsOld + select->iValue + 1); - vm = vr*vr + vi*vi; - if(vm == 0){ - value->rValue = 0; - return(OK); - } - sr = *(ckt->CKTsenInfo->SEN_RHS[select->iValue + 1]+ - here->MOS6senParmNo + here->MOS6sens_l); - si = *(ckt->CKTsenInfo->SEN_iRHS[select->iValue + 1]+ - here->MOS6senParmNo + here->MOS6sens_l); - value->rValue = (vr * si - vi * sr)/vm; - } - return(OK); - case MOS6_W_SENS_CPLX: - if(ckt->CKTsenInfo && here->MOS6sens_w){ - value->cValue.real= *(ckt->CKTsenInfo->SEN_RHS[select->iValue + 1]+ - here->MOS6senParmNo + here->MOS6sens_l); - value->cValue.imag= *(ckt->CKTsenInfo->SEN_iRHS[select->iValue + 1]+ - here->MOS6senParmNo + here->MOS6sens_l); - } - return(OK); - case MOS6_CB : - if (ckt->CKTcurrentAnalysis & DOING_AC) { - errMsg = TMALLOC(char, strlen(msg) + 1); - errRtn = "MOS6ask.c"; - strcpy(errMsg,msg); - return(E_ASKCURRENT); - } else { - value->rValue = here->MOS6cbd + here->MOS6cbs - *(ckt->CKTstate0 - + here->MOS6cqgb); - } - value->rValue *= here->MOS6m; - return(OK); - case MOS6_CG : - if (ckt->CKTcurrentAnalysis & DOING_AC) { - errMsg = TMALLOC(char, strlen(msg) + 1); - errRtn = "MOS6ask.c"; - strcpy(errMsg,msg); - return(E_ASKCURRENT); - } else if (ckt->CKTcurrentAnalysis & (DOING_DCOP | DOING_TRCV)) { - value->rValue = 0; - } else if ((ckt->CKTcurrentAnalysis & DOING_TRAN) && - (ckt->CKTmode & MODETRANOP)) { - value->rValue = 0; - } else { - value->rValue = *(ckt->CKTstate0 + here->MOS6cqgb) + - *(ckt->CKTstate0 + here->MOS6cqgd) + *(ckt->CKTstate0 + - here->MOS6cqgs); - } - value->rValue *= here->MOS6m; - return(OK); - case MOS6_CS : - if (ckt->CKTcurrentAnalysis & DOING_AC) { - errMsg = TMALLOC(char, strlen(msg) + 1); - errRtn = "MOS6ask.c"; - strcpy(errMsg,msg); - return(E_ASKCURRENT); - } else { - value->rValue = -here->MOS6cd; - value->rValue -= here->MOS6cbd + here->MOS6cbs - - *(ckt->CKTstate0 + here->MOS6cqgb); - if ((ckt->CKTcurrentAnalysis & DOING_TRAN) && - !(ckt->CKTmode & MODETRANOP)) { - value->rValue -= *(ckt->CKTstate0 + here->MOS6cqgb) + - *(ckt->CKTstate0 + here->MOS6cqgd) + - *(ckt->CKTstate0 + here->MOS6cqgs); - } - } - value->rValue *= here->MOS6m; - return(OK); - case MOS6_POWER : - if (ckt->CKTcurrentAnalysis & DOING_AC) { - errMsg = TMALLOC(char, strlen(msg) + 1); - errRtn = "MOS6ask.c"; - strcpy(errMsg,msg); - return(E_ASKPOWER); - } else { - double temp; - - value->rValue = here->MOS6cd * - *(ckt->CKTrhsOld + here->MOS6dNode); - value->rValue += (here->MOS6cbd + here->MOS6cbs - - *(ckt->CKTstate0 + here->MOS6cqgb)) * - *(ckt->CKTrhsOld + here->MOS6bNode); - if ((ckt->CKTcurrentAnalysis & DOING_TRAN) && - !(ckt->CKTmode & MODETRANOP)) { - value->rValue += (*(ckt->CKTstate0 + here->MOS6cqgb) + - *(ckt->CKTstate0 + here->MOS6cqgd) + - *(ckt->CKTstate0 + here->MOS6cqgs)) * - *(ckt->CKTrhsOld + here->MOS6gNode); - } - temp = -here->MOS6cd; - temp -= here->MOS6cbd + here->MOS6cbs ; - if ((ckt->CKTcurrentAnalysis & DOING_TRAN) && - !(ckt->CKTmode & MODETRANOP)) { - temp -= *(ckt->CKTstate0 + here->MOS6cqgb) + - *(ckt->CKTstate0 + here->MOS6cqgd) + - *(ckt->CKTstate0 + here->MOS6cqgs); - } - value->rValue += temp * *(ckt->CKTrhsOld + here->MOS6sNode); - } - value->rValue *= here->MOS6m; - return(OK); - default: - return(E_BADPARM); - } - /* NOTREACHED */ -} - diff --git a/src/spicelib/devices/mos6/mos6conv.c b/src/spicelib/devices/mos6/mos6conv.c deleted file mode 100644 index 5b97b61d1..000000000 --- a/src/spicelib/devices/mos6/mos6conv.c +++ /dev/null @@ -1,99 +0,0 @@ -/********** -Copyright 1990 Regents of the University of California. All rights reserved. -Author: 1989 Takayasu Sakurai -**********/ - -#include "ngspice/ngspice.h" -#include "ngspice/cktdefs.h" -#include "mos6defs.h" -#include "ngspice/sperror.h" -#include "ngspice/suffix.h" - -int -MOS6convTest(GENmodel *inModel, CKTcircuit *ckt) -{ - MOS6model *model = (MOS6model*)inModel; - MOS6instance *here; - double delvbs; - double delvbd; - double delvgs; - double delvds; - double delvgd; - double cbhat; - double cdhat; - double vbs; - double vbd; - double vgs; - double vds; - double vgd; - double vgdo; - double tol; - - for( ; model != NULL; model = MOS6nextModel(model)) { - for(here = MOS6instances(model); here!= NULL; - here = MOS6nextInstance(here)) { - - vbs = model->MOS6type * ( - *(ckt->CKTrhs+here->MOS6bNode) - - *(ckt->CKTrhs+here->MOS6sNodePrime)); - vgs = model->MOS6type * ( - *(ckt->CKTrhs+here->MOS6gNode) - - *(ckt->CKTrhs+here->MOS6sNodePrime)); - vds = model->MOS6type * ( - *(ckt->CKTrhs+here->MOS6dNodePrime) - - *(ckt->CKTrhs+here->MOS6sNodePrime)); - vbd=vbs-vds; - vgd=vgs-vds; - vgdo = *(ckt->CKTstate0 + here->MOS6vgs) - - *(ckt->CKTstate0 + here->MOS6vds); - delvbs = vbs - *(ckt->CKTstate0 + here->MOS6vbs); - delvbd = vbd - *(ckt->CKTstate0 + here->MOS6vbd); - delvgs = vgs - *(ckt->CKTstate0 + here->MOS6vgs); - delvds = vds - *(ckt->CKTstate0 + here->MOS6vds); - delvgd = vgd-vgdo; - - /* these are needed for convergence testing */ - - if (here->MOS6mode >= 0) { - cdhat= - here->MOS6cd- - here->MOS6gbd * delvbd + - here->MOS6gmbs * delvbs + - here->MOS6gm * delvgs + - here->MOS6gds * delvds ; - } else { - cdhat= - here->MOS6cd - - ( here->MOS6gbd - - here->MOS6gmbs) * delvbd - - here->MOS6gm * delvgd + - here->MOS6gds * delvds ; - } - cbhat= - here->MOS6cbs + - here->MOS6cbd + - here->MOS6gbd * delvbd + - here->MOS6gbs * delvbs ; - /* - * check convergence - */ - tol=ckt->CKTreltol*MAX(fabs(cdhat),fabs(here->MOS6cd))+ - ckt->CKTabstol; - if (fabs(cdhat-here->MOS6cd) >= tol) { - ckt->CKTnoncon++; - ckt->CKTtroubleElt = (GENinstance *) here; - return(OK); /* no reason to continue, we haven't converged */ - } else { - tol=ckt->CKTreltol* - MAX(fabs(cbhat),fabs(here->MOS6cbs+here->MOS6cbd))+ - ckt->CKTabstol; - if (fabs(cbhat-(here->MOS6cbs+here->MOS6cbd)) > tol) { - ckt->CKTnoncon++; - ckt->CKTtroubleElt = (GENinstance *) here; - return(OK); /* no reason to continue, we haven't converged*/ - } - } - } - } - return(OK); -} diff --git a/src/spicelib/devices/mos6/mos6defs.h b/src/spicelib/devices/mos6/mos6defs.h deleted file mode 100644 index 8d1719fee..000000000 --- a/src/spicelib/devices/mos6/mos6defs.h +++ /dev/null @@ -1,481 +0,0 @@ -/********** -Copyright 1990 Regents of the University of California. All rights reserved. -Author: 1985 Thomas L. Quarles -**********/ - -#ifndef MOS6 -#define MOS6 - -#include "ngspice/ifsim.h" -#include "ngspice/cktdefs.h" -#include "ngspice/gendefs.h" -#include "ngspice/complex.h" - -/* declarations for level 5 MOSFETs */ - -/* information needed for each instance */ - -typedef struct sMOS6instance { - - struct GENinstance gen; - -#define MOS6modPtr(inst) ((struct sMOS6model *)((inst)->gen.GENmodPtr)) -#define MOS6nextInstance(inst) ((struct sMOS6instance *)((inst)->gen.GENnextInstance)) -#define MOS6name gen.GENname -#define MOS6states gen.GENstate - - const int MOS6dNode; /* number of the gate node of the mosfet */ - const int MOS6gNode; /* number of the gate node of the mosfet */ - const int MOS6sNode; /* number of the source node of the mosfet */ - const int MOS6bNode; /* number of the bulk node of the mosfet */ - int MOS6dNodePrime; /* number of the internal drain node of the mosfet */ - int MOS6sNodePrime; /* number of the internal source node of the mosfet */ - - double MOS6l; /* the length of the channel region */ - double MOS6w; /* the width of the channel region */ - double MOS6m; /* the parallel multiplier */ - double MOS6drainArea; /* the area of the drain diffusion */ - double MOS6sourceArea; /* the area of the source diffusion */ - double MOS6drainSquares; /* the length of the drain in squares */ - double MOS6sourceSquares; /* the length of the source in squares */ - double MOS6drainPerimiter; - double MOS6sourcePerimiter; - double MOS6sourceConductance; /*conductance of source(or 0):set in setup*/ - double MOS6drainConductance; /*conductance of drain(or 0):set in setup*/ - double MOS6temp; /* operating temperature of this instance */ - double MOS6dtemp; /* instance temperature difference from circuit */ - - double MOS6tKv; /* temperature corrected drain linear cond. factor*/ - double MOS6tKc; /* temperature corrected saturation cur. factor*/ - double MOS6tSurfMob; /* temperature corrected surface mobility */ - double MOS6tPhi; /* temperature corrected Phi */ - double MOS6tVto; /* temperature corrected Vto */ - double MOS6tSatCur; /* temperature corrected saturation Cur. */ - double MOS6tSatCurDens; /* temperature corrected saturation Cur. density*/ - double MOS6tCbd; /* temperature corrected B-D Capacitance */ - double MOS6tCbs; /* temperature corrected B-S Capacitance */ - double MOS6tCj; /* temperature corrected Bulk bottom Capacitance */ - double MOS6tCjsw; /* temperature corrected Bulk side Capacitance */ - double MOS6tBulkPot; /* temperature corrected Bulk potential */ - double MOS6tDepCap; /* temperature adjusted transition point in */ - /* the cureve matching Fc * Vj */ - double MOS6tVbi; /* temperature adjusted Vbi */ - - double MOS6icVBS; /* initial condition B-S voltage */ - double MOS6icVDS; /* initial condition D-S voltage */ - double MOS6icVGS; /* initial condition G-S voltage */ - double MOS6von; - double MOS6vdsat; - double MOS6sourceVcrit; /* Vcrit for pos. vds */ - double MOS6drainVcrit; /* Vcrit for pos. vds */ - double MOS6cd; - double MOS6cbs; - double MOS6cbd; - double MOS6gmbs; - double MOS6gm; - double MOS6gds; - double MOS6gbd; - double MOS6gbs; - double MOS6capbd; - double MOS6capbs; - double MOS6Cbd; - double MOS6Cbdsw; - double MOS6Cbs; - double MOS6Cbssw; - double MOS6f2d; - double MOS6f3d; - double MOS6f4d; - double MOS6f2s; - double MOS6f3s; - double MOS6f4s; - int MOS6mode; /* device mode : 1 = normal, -1 = inverse */ - - - unsigned MOS6off:1; /* non-zero to indicate device is off for dc analysis*/ - unsigned MOS6tempGiven :1; /* instance temperature specified */ - unsigned MOS6dtempGiven :1; - unsigned MOS6lGiven :1; - unsigned MOS6wGiven :1; - unsigned MOS6mGiven :1; - unsigned MOS6drainAreaGiven :1; - unsigned MOS6sourceAreaGiven :1; - unsigned MOS6drainSquaresGiven :1; - unsigned MOS6sourceSquaresGiven :1; - unsigned MOS6drainPerimiterGiven :1; - unsigned MOS6sourcePerimiterGiven :1; - unsigned MOS6dNodePrimeSet :1; - unsigned MOS6sNodePrimeSet :1; - unsigned MOS6icVBSGiven :1; - unsigned MOS6icVDSGiven :1; - unsigned MOS6icVGSGiven :1; - unsigned MOS6vonGiven :1; - unsigned MOS6vdsatGiven :1; - unsigned MOS6modeGiven :1; - - - double *MOS6DdPtr; /* pointer to sparse matrix element at - * (Drain node,drain node) */ - double *MOS6GgPtr; /* pointer to sparse matrix element at - * (gate node,gate node) */ - double *MOS6SsPtr; /* pointer to sparse matrix element at - * (source node,source node) */ - double *MOS6BbPtr; /* pointer to sparse matrix element at - * (bulk node,bulk node) */ - double *MOS6DPdpPtr; /* pointer to sparse matrix element at - * (drain prime node,drain prime node) */ - double *MOS6SPspPtr; /* pointer to sparse matrix element at - * (source prime node,source prime node) */ - double *MOS6DdpPtr; /* pointer to sparse matrix element at - * (drain node,drain prime node) */ - double *MOS6GbPtr; /* pointer to sparse matrix element at - * (gate node,bulk node) */ - double *MOS6GdpPtr; /* pointer to sparse matrix element at - * (gate node,drain prime node) */ - double *MOS6GspPtr; /* pointer to sparse matrix element at - * (gate node,source prime node) */ - double *MOS6SspPtr; /* pointer to sparse matrix element at - * (source node,source prime node) */ - double *MOS6BdpPtr; /* pointer to sparse matrix element at - * (bulk node,drain prime node) */ - double *MOS6BspPtr; /* pointer to sparse matrix element at - * (bulk node,source prime node) */ - double *MOS6DPspPtr; /* pointer to sparse matrix element at - * (drain prime node,source prime node) */ - double *MOS6DPdPtr; /* pointer to sparse matrix element at - * (drain prime node,drain node) */ - double *MOS6BgPtr; /* pointer to sparse matrix element at - * (bulk node,gate node) */ - double *MOS6DPgPtr; /* pointer to sparse matrix element at - * (drain prime node,gate node) */ - - double *MOS6SPgPtr; /* pointer to sparse matrix element at - * (source prime node,gate node) */ - double *MOS6SPsPtr; /* pointer to sparse matrix element at - * (source prime node,source node) */ - double *MOS6DPbPtr; /* pointer to sparse matrix element at - * (drain prime node,bulk node) */ - double *MOS6SPbPtr; /* pointer to sparse matrix element at - * (source prime node,bulk node) */ - double *MOS6SPdpPtr; /* pointer to sparse matrix element at - * (source prime node,drain prime node) */ - - int MOS6senParmNo; /* parameter # for sensitivity use; - set equal to 0 if neither length - nor width of the mosfet is a design - parameter */ - unsigned MOS6sens_l :1; /* field which indicates whether - length of the mosfet is a design - parameter or not */ - unsigned MOS6sens_w :1; /* field which indicates whether - width of the mosfet is a design - parameter or not */ - unsigned MOS6senPertFlag :1; /* indictes whether the the - parameter of the particular instance is - to be perturbed */ - double MOS6cgs; - double MOS6cgd; - double MOS6cgb; - double *MOS6sens; - -#define MOS6senCgs MOS6sens /* contains pertured values of cgs */ -#define MOS6senCgd MOS6sens + 6 /* contains perturbed values of cgd*/ -#define MOS6senCgb MOS6sens + 12 /* contains perturbed values of cgb*/ -#define MOS6senCbd MOS6sens + 18 /* contains perturbed values of cbd*/ -#define MOS6senCbs MOS6sens + 24 /* contains perturbed values of cbs*/ -#define MOS6senGds MOS6sens + 30 /* contains perturbed values of gds*/ -#define MOS6senGbs MOS6sens + 36 /* contains perturbed values of gbs*/ -#define MOS6senGbd MOS6sens + 42 /* contains perturbed values of gbd*/ -#define MOS6senGm MOS6sens + 48 /* contains perturbed values of gm*/ -#define MOS6senGmbs MOS6sens + 54 /* contains perturbed values of gmbs*/ -#define MOS6dphigs_dl MOS6sens + 60 -#define MOS6dphigd_dl MOS6sens + 61 -#define MOS6dphigb_dl MOS6sens + 62 -#define MOS6dphibs_dl MOS6sens + 63 -#define MOS6dphibd_dl MOS6sens + 64 -#define MOS6dphigs_dw MOS6sens + 65 -#define MOS6dphigd_dw MOS6sens + 66 -#define MOS6dphigb_dw MOS6sens + 67 -#define MOS6dphibs_dw MOS6sens + 68 -#define MOS6dphibd_dw MOS6sens + 69 - -} MOS6instance ; - -#define MOS6vbd MOS6states+ 0 /* bulk-drain voltage */ -#define MOS6vbs MOS6states+ 1 /* bulk-source voltage */ -#define MOS6vgs MOS6states+ 2 /* gate-source voltage */ -#define MOS6vds MOS6states+ 3 /* drain-source voltage */ - -#define MOS6capgs MOS6states+4 /* gate-source capacitor value */ -#define MOS6qgs MOS6states+ 5 /* gate-source capacitor charge */ -#define MOS6cqgs MOS6states+ 6 /* gate-source capacitor current */ - -#define MOS6capgd MOS6states+ 7 /* gate-drain capacitor value */ -#define MOS6qgd MOS6states+ 8 /* gate-drain capacitor charge */ -#define MOS6cqgd MOS6states+ 9 /* gate-drain capacitor current */ - -#define MOS6capgb MOS6states+10 /* gate-bulk capacitor value */ -#define MOS6qgb MOS6states+ 11 /* gate-bulk capacitor charge */ -#define MOS6cqgb MOS6states+ 12 /* gate-bulk capacitor current */ - -#define MOS6qbd MOS6states+ 13 /* bulk-drain capacitor charge */ -#define MOS6cqbd MOS6states+ 14 /* bulk-drain capacitor current */ - -#define MOS6qbs MOS6states+ 15 /* bulk-source capacitor charge */ -#define MOS6cqbs MOS6states+ 16 /* bulk-source capacitor current */ - -#define MOS6numStates 17 - -#define MOS6sensxpgs MOS6states+17 /* charge sensitivities and their derivatives. - * +18 for the derivatives - * pointer to the beginning of the array */ -#define MOS6sensxpgd MOS6states+19 -#define MOS6sensxpgb MOS6states+21 -#define MOS6sensxpbs MOS6states+23 -#define MOS6sensxpbd MOS6states+25 - -#define MOS6numSenStates 10 - - -/* per model data */ - - /* NOTE: parameters marked 'input - use xxxx' are paramters for - * which a temperature correction is applied in MOS6temp, thus - * the MOS6xxxx value in the per-instance structure should be used - * instead in all calculations - */ - - -typedef struct sMOS6model { /* model structure for a resistor */ - - struct GENmodel gen; - -#define MOS6modType gen.GENmodType -#define MOS6nextModel(inst) ((struct sMOS6model *)((inst)->gen.GENnextModel)) -#define MOS6instances(inst) ((MOS6instance *)((inst)->gen.GENinstances)) -#define MOS6modName gen.GENmodName - - int MOS6type; /* device type : 1 = nmos, -1 = pmos */ - double MOS6tnom; /* temperature at which parameters measured */ - double MOS6latDiff; - double MOS6jctSatCurDensity; /* input - use tSatCurDens */ - double MOS6jctSatCur; /* input - use tSatCur */ - double MOS6drainResistance; - double MOS6sourceResistance; - double MOS6sheetResistance; - double MOS6kv; /* input - use tKv */ - double MOS6nv; /* drain linear conductance factor*/ - double MOS6kc; /* input - use tKc */ - double MOS6nc; /* saturation current coeff.*/ - double MOS6nvth; /* threshold voltage coeff.*/ - double MOS6ps; /* saturation current modification parameter*/ - double MOS6gateSourceOverlapCapFactor; - double MOS6gateDrainOverlapCapFactor; - double MOS6gateBulkOverlapCapFactor; - double MOS6oxideCapFactor; - double MOS6vt0; /* input - use tVto */ - double MOS6capBD; /* input - use tCbd */ - double MOS6capBS; /* input - use tCbs */ - double MOS6bulkCapFactor; /* input - use tCj */ - double MOS6sideWallCapFactor; /* input - use tCjsw */ - double MOS6bulkJctPotential; /* input - use tBulkPot */ - double MOS6bulkJctBotGradingCoeff; - double MOS6bulkJctSideGradingCoeff; - double MOS6fwdCapDepCoeff; - double MOS6phi; /* input - use tPhi */ - double MOS6gamma; - double MOS6gamma1; /* secondary back-gate effect parametr */ - double MOS6sigma; - double MOS6lambda; - double MOS6lamda0; - double MOS6lamda1; - double MOS6substrateDoping; - int MOS6gateType; - double MOS6surfaceStateDensity; - double MOS6oxideThickness; - double MOS6surfaceMobility; /* input - use tSurfMob */ - - unsigned MOS6typeGiven :1; - unsigned MOS6latDiffGiven :1; - unsigned MOS6jctSatCurDensityGiven :1; - unsigned MOS6jctSatCurGiven :1; - unsigned MOS6drainResistanceGiven :1; - unsigned MOS6sourceResistanceGiven :1; - unsigned MOS6sheetResistanceGiven :1; - unsigned MOS6kvGiven :1; - unsigned MOS6nvGiven :1; - unsigned MOS6kcGiven :1; - unsigned MOS6ncGiven :1; - unsigned MOS6nvthGiven :1; - unsigned MOS6psGiven :1; - unsigned MOS6gateSourceOverlapCapFactorGiven :1; - unsigned MOS6gateDrainOverlapCapFactorGiven :1; - unsigned MOS6gateBulkOverlapCapFactorGiven :1; - unsigned MOS6vt0Given :1; - unsigned MOS6capBDGiven :1; - unsigned MOS6capBSGiven :1; - unsigned MOS6bulkCapFactorGiven :1; - unsigned MOS6sideWallCapFactorGiven :1; - unsigned MOS6bulkJctPotentialGiven :1; - unsigned MOS6bulkJctBotGradingCoeffGiven :1; - unsigned MOS6bulkJctSideGradingCoeffGiven :1; - unsigned MOS6fwdCapDepCoeffGiven :1; - unsigned MOS6phiGiven :1; - unsigned MOS6gammaGiven :1; - unsigned MOS6gamma1Given :1; - unsigned MOS6sigmaGiven :1; - unsigned MOS6lambdaGiven :1; - unsigned MOS6lamda0Given :1; - unsigned MOS6lamda1Given :1; - unsigned MOS6substrateDopingGiven :1; - unsigned MOS6gateTypeGiven :1; - unsigned MOS6surfaceStateDensityGiven :1; - unsigned MOS6oxideThicknessGiven :1; - unsigned MOS6surfaceMobilityGiven :1; - unsigned MOS6tnomGiven :1; - -} MOS6model; - -#ifndef NMOS -#define NMOS 1 -#define PMOS -1 -#endif /*NMOS*/ - -/* device parameters */ -enum { - MOS6_W = 1, - MOS6_L, - MOS6_AS, - MOS6_AD, - MOS6_PS, - MOS6_PD, - MOS6_NRS, - MOS6_NRD, - MOS6_OFF, - MOS6_IC, - MOS6_IC_VBS, - MOS6_IC_VDS, - MOS6_IC_VGS, - MOS6_W_SENS, - MOS6_L_SENS, - MOS6_CB, - MOS6_CG, - MOS6_CS, - MOS6_POWER, - MOS6_TEMP, - MOS6_DTEMP, - MOS6_M, -}; - -/* model paramerers */ -enum { - MOS6_MOD_VTO = 101, - MOS6_MOD_KV, - MOS6_MOD_NV, - MOS6_MOD_KC, - MOS6_MOD_NC, - MOS6_MOD_NVTH, - MOS6_MOD_PS, - MOS6_MOD_GAMMA, - MOS6_MOD_GAMMA1, - MOS6_MOD_SIGMA, - MOS6_MOD_PHI, - MOS6_MOD_LAMBDA, - MOS6_MOD_LAMDA0, - MOS6_MOD_LAMDA1, - MOS6_MOD_RD, - MOS6_MOD_RS, - MOS6_MOD_CBD, - MOS6_MOD_CBS, - MOS6_MOD_IS, - MOS6_MOD_PB, - MOS6_MOD_CGSO, - MOS6_MOD_CGDO, - MOS6_MOD_CGBO, - MOS6_MOD_CJ, - MOS6_MOD_MJ, - MOS6_MOD_CJSW, - MOS6_MOD_MJSW, - MOS6_MOD_JS, - MOS6_MOD_TOX, - MOS6_MOD_LD, - MOS6_MOD_RSH, - MOS6_MOD_U0, - MOS6_MOD_FC, - MOS6_MOD_NSUB, - MOS6_MOD_TPG, - MOS6_MOD_NSS, - MOS6_MOD_NMOS, - MOS6_MOD_PMOS, - MOS6_MOD_TNOM, - MOS6_MOD_TYPE, -}; - -/* device questions */ -enum { - MOS6_CGS = 201, - MOS6_CGD, - MOS6_DNODE, - MOS6_GNODE, - MOS6_SNODE, - MOS6_BNODE, - MOS6_DNODEPRIME, - MOS6_SNODEPRIME, - MOS6_SOURCECONDUCT, - MOS6_DRAINCONDUCT, - MOS6_VON, - MOS6_VDSAT, - MOS6_SOURCEVCRIT, - MOS6_DRAINVCRIT, - MOS6_CD, - MOS6_CBS, - MOS6_CBD, - MOS6_GMBS, - MOS6_GM, - MOS6_GDS, - MOS6_GBD, - MOS6_GBS, - MOS6_CAPBD, - MOS6_CAPBS, - MOS6_CAPZEROBIASBD, - MOS6_CAPZEROBIASBDSW, - MOS6_CAPZEROBIASBS, - MOS6_CAPZEROBIASBSSW, - MOS6_VBD, - MOS6_VBS, - MOS6_VGS, - MOS6_VDS, - MOS6_CAPGS, - MOS6_QGS, - MOS6_CQGS, - MOS6_CAPGD, - MOS6_QGD, - MOS6_CQGD, - MOS6_CAPGB, - MOS6_QGB, - MOS6_CQGB, - MOS6_QBD, - MOS6_CQBD, - MOS6_QBS, - MOS6_CQBS, - MOS6_L_SENS_REAL, - MOS6_L_SENS_IMAG, - MOS6_L_SENS_MAG, - MOS6_L_SENS_PH, - MOS6_L_SENS_CPLX, - MOS6_W_SENS_REAL, - MOS6_W_SENS_IMAG, - MOS6_W_SENS_MAG, - MOS6_W_SENS_PH, - MOS6_W_SENS_CPLX, - MOS6_L_SENS_DC, - MOS6_W_SENS_DC, - MOS6_SOURCERESIST, - MOS6_DRAINRESIST, -}; - -/* model questions */ - -#include "mos6ext.h" - -#endif /*MOS6*/ - diff --git a/src/spicelib/devices/mos6/mos6del.c b/src/spicelib/devices/mos6/mos6del.c deleted file mode 100644 index d98554482..000000000 --- a/src/spicelib/devices/mos6/mos6del.c +++ /dev/null @@ -1,18 +0,0 @@ -/********** -Copyright 1990 Regents of the University of California. All rights reserved. -Author: 1985 Thomas L. Quarles -**********/ - -#include "ngspice/ngspice.h" -#include "mos6defs.h" -#include "ngspice/sperror.h" -#include "ngspice/suffix.h" - - -int -MOS6delete(GENinstance *gen_inst) -{ - MOS6instance *inst = (MOS6instance *) gen_inst; - FREE(inst->MOS6sens); - return OK; -} diff --git a/src/spicelib/devices/mos6/mos6ext.h b/src/spicelib/devices/mos6/mos6ext.h deleted file mode 100644 index 77f9f6b53..000000000 --- a/src/spicelib/devices/mos6/mos6ext.h +++ /dev/null @@ -1,19 +0,0 @@ -/********** -Copyright 1990 Regents of the University of California. All rights reserved. -Author: 1985 Thomas L. Quarles -**********/ - -extern int MOS6acLoad(GENmodel *,CKTcircuit*); -extern int MOS6ask(CKTcircuit*,GENinstance*,int,IFvalue*,IFvalue*); -extern int MOS6delete(GENinstance*); -extern int MOS6getic(GENmodel*,CKTcircuit*); -extern int MOS6load(GENmodel*,CKTcircuit*); -extern int MOS6mAsk(CKTcircuit *,GENmodel *,int,IFvalue*); -extern int MOS6mParam(int,IFvalue*,GENmodel*); -extern int MOS6param(int,IFvalue*,GENinstance*,IFvalue*); -extern int MOS6pzLoad(GENmodel*,CKTcircuit*,SPcomplex*); -extern int MOS6setup(SMPmatrix*,GENmodel*,CKTcircuit*,int*); -extern int MOS6unsetup(GENmodel*,CKTcircuit*); -extern int MOS6temp(GENmodel*,CKTcircuit*); -extern int MOS6trunc(GENmodel*,CKTcircuit*,double*); -extern int MOS6convTest(GENmodel*,CKTcircuit*); diff --git a/src/spicelib/devices/mos6/mos6ic.c b/src/spicelib/devices/mos6/mos6ic.c deleted file mode 100644 index e2a290e8e..000000000 --- a/src/spicelib/devices/mos6/mos6ic.c +++ /dev/null @@ -1,46 +0,0 @@ -/********** -Copyright 1990 Regents of the University of California. All rights reserved. -Author: 1989 Takayasu Sakurai -**********/ -/* - */ - -#include "ngspice/ngspice.h" -#include "ngspice/cktdefs.h" -#include "mos6defs.h" -#include "ngspice/sperror.h" -#include "ngspice/suffix.h" - - -int -MOS6getic(GENmodel *inModel, CKTcircuit *ckt) -{ - MOS6model *model = (MOS6model *)inModel; - MOS6instance *here; - /* - * grab initial conditions out of rhs array. User specified, so use - * external nodes to get values - */ - - for( ; model ; model = MOS6nextModel(model)) { - for(here = MOS6instances(model); here ; here = MOS6nextInstance(here)) { - - if(!here->MOS6icVBSGiven) { - here->MOS6icVBS = - *(ckt->CKTrhs + here->MOS6bNode) - - *(ckt->CKTrhs + here->MOS6sNode); - } - if(!here->MOS6icVDSGiven) { - here->MOS6icVDS = - *(ckt->CKTrhs + here->MOS6dNode) - - *(ckt->CKTrhs + here->MOS6sNode); - } - if(!here->MOS6icVGSGiven) { - here->MOS6icVGS = - *(ckt->CKTrhs + here->MOS6gNode) - - *(ckt->CKTrhs + here->MOS6sNode); - } - } - } - return(OK); -} diff --git a/src/spicelib/devices/mos6/mos6init.c b/src/spicelib/devices/mos6/mos6init.c deleted file mode 100644 index 9fa5ef000..000000000 --- a/src/spicelib/devices/mos6/mos6init.c +++ /dev/null @@ -1,76 +0,0 @@ -#include "ngspice/config.h" - -#include "ngspice/devdefs.h" - -#include "mos6itf.h" -#include "mos6ext.h" -#include "mos6init.h" - - -SPICEdev MOS6info = { - .DEVpublic = { - .name = "Mos6", - .description = "Level 6 MOSfet model with Meyer capacitance model", - .terms = &MOS6nSize, - .numNames = &MOS6nSize, - .termNames = MOS6names, - .numInstanceParms = &MOS6pTSize, - .instanceParms = MOS6pTable, - .numModelParms = &MOS6mPTSize, - .modelParms = MOS6mPTable, - .flags = DEV_DEFAULT, - -#ifdef XSPICE - .cm_func = NULL, - .num_conn = 0, - .conn = NULL, - .num_param = 0, - .param = NULL, - .num_inst_var = 0, - .inst_var = NULL, -#endif - }, - - .DEVparam = MOS6param, - .DEVmodParam = MOS6mParam, - .DEVload = MOS6load, - .DEVsetup = MOS6setup, - .DEVunsetup = MOS6unsetup, - .DEVpzSetup = NULL, - .DEVtemperature = MOS6temp, - .DEVtrunc = MOS6trunc, - .DEVfindBranch = NULL, - .DEVacLoad = NULL, - .DEVaccept = NULL, - .DEVdestroy = NULL, - .DEVmodDelete = NULL, - .DEVdelete = MOS6delete, - .DEVsetic = MOS6getic, - .DEVask = MOS6ask, - .DEVmodAsk = MOS6mAsk, - .DEVpzLoad = NULL, - .DEVconvTest = MOS6convTest, - .DEVsenSetup = NULL, - .DEVsenLoad = NULL, - .DEVsenUpdate = NULL, - .DEVsenAcLoad = NULL, - .DEVsenPrint = NULL, - .DEVsenTrunc = NULL, - .DEVdisto = NULL, - .DEVnoise = NULL, - .DEVsoaCheck = NULL, - .DEVinstSize = &MOS6iSize, - .DEVmodSize = &MOS6mSize, - -#ifdef CIDER - .DEVdump = NULL, - .DEVacct = NULL, -#endif -}; - - -SPICEdev * -get_mos6_info(void) -{ - return &MOS6info; -} diff --git a/src/spicelib/devices/mos6/mos6init.h b/src/spicelib/devices/mos6/mos6init.h deleted file mode 100644 index 391bbf28b..000000000 --- a/src/spicelib/devices/mos6/mos6init.h +++ /dev/null @@ -1,13 +0,0 @@ -#ifndef _MOS6INIT_H -#define _MOS6INIT_H - -extern IFparm MOS6pTable[ ]; -extern IFparm MOS6mPTable[ ]; -extern char *MOS6names[ ]; -extern int MOS6nSize; -extern int MOS6pTSize; -extern int MOS6mPTSize; -extern int MOS6iSize; -extern int MOS6mSize; - -#endif diff --git a/src/spicelib/devices/mos6/mos6itf.h b/src/spicelib/devices/mos6/mos6itf.h deleted file mode 100644 index 7b7fa6951..000000000 --- a/src/spicelib/devices/mos6/mos6itf.h +++ /dev/null @@ -1,11 +0,0 @@ -/********** -Copyright 1990 Regents of the University of California. All rights reserved. -Author: 1989 T. Sakurai -Modified: 1999 Paolo Nenzi -**********/ -#ifndef DEV_MOS6 -#define DEV_MOS6 - -SPICEdev *get_mos6_info(void); - -#endif diff --git a/src/spicelib/devices/mos6/mos6load.c b/src/spicelib/devices/mos6/mos6load.c deleted file mode 100644 index 8ab2d0281..000000000 --- a/src/spicelib/devices/mos6/mos6load.c +++ /dev/null @@ -1,956 +0,0 @@ -/********** -Copyright 1990 Regents of the University of California. All rights reserved. -Author: 1989 Takayasu Sakurai -Modified: 2000 AlansFixes -**********/ - -#include "ngspice/ngspice.h" -#include "ngspice/cktdefs.h" -#include "ngspice/devdefs.h" -#include "mos6defs.h" -#include "ngspice/trandefs.h" -#include "ngspice/const.h" -#include "ngspice/sperror.h" -#include "ngspice/suffix.h" - -int -MOS6load(GENmodel *inModel, CKTcircuit *ckt) - /* actually load the current value into the - * sparse matrix previously provided - */ -{ - MOS6model *model = (MOS6model *) inModel; - MOS6instance *here; - double betac; - double DrainSatCur; - double EffectiveLength; - double GateBulkOverlapCap; - double GateDrainOverlapCap; - double GateSourceOverlapCap; - double OxideCap; - double SourceSatCur; - double arg; - double cbhat; - double cdhat; - double cdrain; - double cdreq; - double ceq; - double ceqbd; - double ceqbs; - double ceqgb; - double ceqgd; - double ceqgs; - double delvbd; - double delvbs; - double delvds; - double delvgd; - double delvgs; - double evbd; - double evbs; - double gcgb; - double gcgd; - double gcgs; - double geq; - double sarg; - double sargsw; - double vbd; - double vbs; - double vds; - double vdsat; - double vgb1; - double vgb; - double vgd1; - double vgd; - double vgdo; - double vgs1; - double vgs; - double von; - double vt; -#ifndef PREDICTOR - double xfact = 0.0; -#endif - int xnrm; - int xrev; - double capgs = 0.0; /* total gate-source capacitance */ - double capgd = 0.0; /* total gate-drain capacitance */ - double capgb = 0.0; /* total gate-bulk capacitance */ - int Check; -#ifndef NOBYPASS - double tempv; -#endif /*NOBYPASS*/ - int error; -#ifdef CAPBYPASS - int senflag; -#endif /* CAPBYPASS */ - int SenCond; - - double m; - -#ifdef CAPBYPASS - senflag = 0; - if(ckt->CKTsenInfo && ckt->CKTsenInfo->SENstatus == PERTURBATION && - (ckt->CKTsenInfo->SENmode & (ACSEN | TRANSEN))) { - senflag = 1; - } -#endif /* CAPBYPASS */ - - /* loop through all the MOS6 device models */ - for( ; model != NULL; model = MOS6nextModel(model)) { - - /* loop through all the instances of the model */ - for (here = MOS6instances(model); here != NULL ; - here=MOS6nextInstance(here)) { - - vt = CONSTKoverQ * here->MOS6temp; - Check=1; - if(ckt->CKTsenInfo){ -#ifdef SENSDEBUG - printf("MOS6load \n"); -#endif /* SENSDEBUG */ - - if((ckt->CKTsenInfo->SENstatus == PERTURBATION)&& - (here->MOS6senPertFlag == OFF))continue; - - } - SenCond = ckt->CKTsenInfo && here->MOS6senPertFlag; - -/* - -*/ - - - /* first, we compute a few useful values - these could be - * pre-computed, but for historical reasons are still done - * here. They may be moved at the expense of instance size - */ - - EffectiveLength=here->MOS6l - 2*model->MOS6latDiff; - if( (here->MOS6tSatCurDens == 0) || - (here->MOS6drainArea == 0) || - (here->MOS6sourceArea == 0)) { - DrainSatCur = here->MOS6tSatCur; - SourceSatCur = here->MOS6tSatCur; - } else { - DrainSatCur = here->MOS6tSatCurDens * - here->MOS6drainArea; - SourceSatCur = here->MOS6tSatCurDens * - here->MOS6sourceArea; - } - GateSourceOverlapCap = model->MOS6gateSourceOverlapCapFactor * - here->MOS6w; - GateDrainOverlapCap = model->MOS6gateDrainOverlapCapFactor * - here->MOS6w; - GateBulkOverlapCap = model->MOS6gateBulkOverlapCapFactor * - EffectiveLength; - betac = here->MOS6tKc * here->MOS6w/EffectiveLength; - OxideCap = model->MOS6oxideCapFactor * EffectiveLength * - here->MOS6w; - /* - * ok - now to do the start-up operations - * - * we must get values for vbs, vds, and vgs from somewhere - * so we either predict them or recover them from last iteration - * These are the two most common cases - either a prediction - * step or the general iteration step and they - * share some code, so we put them first - others later on - */ - - if(SenCond){ -#ifdef SENSDEBUG - printf("MOS6senPertFlag = ON \n"); -#endif /* SENSDEBUG */ - if((ckt->CKTsenInfo->SENmode == TRANSEN) && - (ckt->CKTmode & MODEINITTRAN)) { - vgs = *(ckt->CKTstate1 + here->MOS6vgs); - vds = *(ckt->CKTstate1 + here->MOS6vds); - vbs = *(ckt->CKTstate1 + here->MOS6vbs); - vbd = *(ckt->CKTstate1 + here->MOS6vbd); - vgb = vgs - vbs; - vgd = vgs - vds; - } - else if (ckt->CKTsenInfo->SENmode == ACSEN){ - vgb = model->MOS6type * ( - *(ckt->CKTrhsOp+here->MOS6gNode) - - *(ckt->CKTrhsOp+here->MOS6bNode)); - vbs = *(ckt->CKTstate0 + here->MOS6vbs); - vbd = *(ckt->CKTstate0 + here->MOS6vbd); - vgd = vgb + vbd ; - vgs = vgb + vbs ; - vds = vbs - vbd ; - } - else{ - vgs = *(ckt->CKTstate0 + here->MOS6vgs); - vds = *(ckt->CKTstate0 + here->MOS6vds); - vbs = *(ckt->CKTstate0 + here->MOS6vbs); - vbd = *(ckt->CKTstate0 + here->MOS6vbd); - vgb = vgs - vbs; - vgd = vgs - vds; - } -#ifdef SENSDEBUG - printf(" vbs = %.7e ,vbd = %.7e,vgb = %.7e\n",vbs,vbd,vgb); - printf(" vgs = %.7e ,vds = %.7e,vgd = %.7e\n",vgs,vds,vgd); -#endif /* SENSDEBUG */ - goto next1; - } - - - if((ckt->CKTmode & (MODEINITFLOAT | MODEINITPRED | MODEINITSMSIG - | MODEINITTRAN)) || - ( (ckt->CKTmode & MODEINITFIX) && (!here->MOS6off) ) ) { -#ifndef PREDICTOR - if(ckt->CKTmode & (MODEINITPRED | MODEINITTRAN) ) { - - /* predictor step */ - - xfact=ckt->CKTdelta/ckt->CKTdeltaOld[1]; - *(ckt->CKTstate0 + here->MOS6vbs) = - *(ckt->CKTstate1 + here->MOS6vbs); - vbs = (1+xfact)* (*(ckt->CKTstate1 + here->MOS6vbs)) - -(xfact * (*(ckt->CKTstate2 + here->MOS6vbs))); - *(ckt->CKTstate0 + here->MOS6vgs) = - *(ckt->CKTstate1 + here->MOS6vgs); - vgs = (1+xfact)* (*(ckt->CKTstate1 + here->MOS6vgs)) - -(xfact * (*(ckt->CKTstate2 + here->MOS6vgs))); - *(ckt->CKTstate0 + here->MOS6vds) = - *(ckt->CKTstate1 + here->MOS6vds); - vds = (1+xfact)* (*(ckt->CKTstate1 + here->MOS6vds)) - -(xfact * (*(ckt->CKTstate2 + here->MOS6vds))); - *(ckt->CKTstate0 + here->MOS6vbd) = - *(ckt->CKTstate0 + here->MOS6vbs)- - *(ckt->CKTstate0 + here->MOS6vds); - } else { -#endif /* PREDICTOR */ - - /* general iteration */ - - vbs = model->MOS6type * ( - *(ckt->CKTrhsOld+here->MOS6bNode) - - *(ckt->CKTrhsOld+here->MOS6sNodePrime)); - vgs = model->MOS6type * ( - *(ckt->CKTrhsOld+here->MOS6gNode) - - *(ckt->CKTrhsOld+here->MOS6sNodePrime)); - vds = model->MOS6type * ( - *(ckt->CKTrhsOld+here->MOS6dNodePrime) - - *(ckt->CKTrhsOld+here->MOS6sNodePrime)); -#ifndef PREDICTOR - } -#endif /* PREDICTOR */ - - /* now some common crunching for some more useful quantities */ - - vbd=vbs-vds; - vgd=vgs-vds; - vgdo = *(ckt->CKTstate0 + here->MOS6vgs) - - *(ckt->CKTstate0 + here->MOS6vds); - delvbs = vbs - *(ckt->CKTstate0 + here->MOS6vbs); - delvbd = vbd - *(ckt->CKTstate0 + here->MOS6vbd); - delvgs = vgs - *(ckt->CKTstate0 + here->MOS6vgs); - delvds = vds - *(ckt->CKTstate0 + here->MOS6vds); - delvgd = vgd-vgdo; - - /* these are needed for convergence testing */ - - if (here->MOS6mode >= 0) { - cdhat= - here->MOS6cd- - here->MOS6gbd * delvbd + - here->MOS6gmbs * delvbs + - here->MOS6gm * delvgs + - here->MOS6gds * delvds ; - } else { - cdhat= - here->MOS6cd - - ( here->MOS6gbd - - here->MOS6gmbs) * delvbd - - here->MOS6gm * delvgd + - here->MOS6gds * delvds ; - } - cbhat= - here->MOS6cbs + - here->MOS6cbd + - here->MOS6gbd * delvbd + - here->MOS6gbs * delvbs ; -/* - -*/ -#ifndef NOBYPASS - /* now lets see if we can bypass (ugh) */ - /* the following mess should be one if statement, but - * many compilers can't handle it all at once, so it - * is split into several successive if statements - */ - tempv = MAX(fabs(cbhat),fabs(here->MOS6cbs - + here->MOS6cbd))+ckt->CKTabstol; - if((!(ckt->CKTmode & (MODEINITPRED|MODEINITTRAN|MODEINITSMSIG) - )) && (ckt->CKTbypass) ) - if ( (fabs(cbhat-(here->MOS6cbs + - here->MOS6cbd)) < ckt->CKTreltol * - tempv)) - if( (fabs(delvbs) < (ckt->CKTreltol * MAX(fabs(vbs), - fabs(*(ckt->CKTstate0+here->MOS6vbs)))+ - ckt->CKTvoltTol))) - if ( (fabs(delvbd) < (ckt->CKTreltol * MAX(fabs(vbd), - fabs(*(ckt->CKTstate0+here->MOS6vbd)))+ - ckt->CKTvoltTol)) ) - if( (fabs(delvgs) < (ckt->CKTreltol * MAX(fabs(vgs), - fabs(*(ckt->CKTstate0+here->MOS6vgs)))+ - ckt->CKTvoltTol))) - if ( (fabs(delvds) < (ckt->CKTreltol * MAX(fabs(vds), - fabs(*(ckt->CKTstate0+here->MOS6vds)))+ - ckt->CKTvoltTol)) ) - if( (fabs(cdhat- here->MOS6cd) < - ckt->CKTreltol * MAX(fabs(cdhat),fabs( - here->MOS6cd)) + ckt->CKTabstol) ) { - /* bypass code * - * nothing interesting has changed since last - * iteration on this device, so we just - * copy all the values computed last iteration out - * and keep going - */ - vbs = *(ckt->CKTstate0 + here->MOS6vbs); - vbd = *(ckt->CKTstate0 + here->MOS6vbd); - vgs = *(ckt->CKTstate0 + here->MOS6vgs); - vds = *(ckt->CKTstate0 + here->MOS6vds); - vgd = vgs - vds; - vgb = vgs - vbs; - cdrain = here->MOS6mode * (here->MOS6cd + here->MOS6cbd); - if(ckt->CKTmode & (MODETRAN | MODETRANOP)) { - capgs = ( *(ckt->CKTstate0+here->MOS6capgs)+ - *(ckt->CKTstate1+here->MOS6capgs) + - GateSourceOverlapCap ); - capgd = ( *(ckt->CKTstate0+here->MOS6capgd)+ - *(ckt->CKTstate1+here->MOS6capgd) + - GateDrainOverlapCap ); - capgb = ( *(ckt->CKTstate0+here->MOS6capgb)+ - *(ckt->CKTstate1+here->MOS6capgb) + - GateBulkOverlapCap ); - - if(ckt->CKTsenInfo){ - here->MOS6cgs = capgs; - here->MOS6cgd = capgd; - here->MOS6cgb = capgb; - } - } - goto bypass; - } -#endif /*NOBYPASS*/ -/* - -*/ - - /* ok - bypass is out, do it the hard way */ - - von = model->MOS6type * here->MOS6von; - -#ifndef NODELIMITING - /* - * limiting - * we want to keep device voltages from changing - * so fast that the exponentials churn out overflows - * and similar rudeness - */ - - if(*(ckt->CKTstate0 + here->MOS6vds) >=0) { - vgs = DEVfetlim(vgs,*(ckt->CKTstate0 + here->MOS6vgs) - ,von); - vds = vgs - vgd; - vds = DEVlimvds(vds,*(ckt->CKTstate0 + here->MOS6vds)); - vgd = vgs - vds; - } else { - vgd = DEVfetlim(vgd,vgdo,von); - vds = vgs - vgd; - if(!(ckt->CKTfixLimit)) { - vds = -DEVlimvds(-vds,-(*(ckt->CKTstate0 + - here->MOS6vds))); - } - vgs = vgd + vds; - } - if(vds >= 0) { - vbs = DEVpnjlim(vbs,*(ckt->CKTstate0 + here->MOS6vbs), - vt,here->MOS6sourceVcrit,&Check); - vbd = vbs-vds; - } else { - vbd = DEVpnjlim(vbd,*(ckt->CKTstate0 + here->MOS6vbd), - vt,here->MOS6drainVcrit,&Check); - vbs = vbd + vds; - } -#endif /*NODELIMITING*/ -/* - -*/ - - } else { - - /* ok - not one of the simple cases, so we have to - * look at all of the possibilities for why we were - * called. We still just initialize the three voltages - */ - - if((ckt->CKTmode & MODEINITJCT) && !here->MOS6off) { - vds= model->MOS6type * here->MOS6icVDS; - vgs= model->MOS6type * here->MOS6icVGS; - vbs= model->MOS6type * here->MOS6icVBS; - if((vds==0) && (vgs==0) && (vbs==0) && - ((ckt->CKTmode & - (MODETRAN|MODEDCOP|MODEDCTRANCURVE)) || - (!(ckt->CKTmode & MODEUIC)))) { - vbs = -1; - vgs = model->MOS6type * here->MOS6tVto; - vds = 0; - } - } else { - vbs=vgs=vds=0; - } - } -/* - -*/ - - - /* - * now all the preliminaries are over - we can start doing the - * real work - */ - vbd = vbs - vds; - vgd = vgs - vds; - vgb = vgs - vbs; - - - /* - * bulk-source and bulk-drain diodes - * here we just evaluate the ideal diode current and the - * corresponding derivative (conductance). - */ -next1: if(vbs <= -3*vt) { - here->MOS6gbs = ckt->CKTgmin; - here->MOS6cbs = here->MOS6gbs*vbs-SourceSatCur; - } else { - evbs = exp(MIN(MAX_EXP_ARG,vbs/vt)); - here->MOS6gbs = SourceSatCur*evbs/vt + ckt->CKTgmin; - here->MOS6cbs = SourceSatCur*(evbs-1) + ckt->CKTgmin*vbs; - } - if(vbd <= -3*vt) { - here->MOS6gbd = ckt->CKTgmin; - here->MOS6cbd = here->MOS6gbd*vbd-DrainSatCur; - } else { - evbd = exp(MIN(MAX_EXP_ARG,vbd/vt)); - here->MOS6gbd = DrainSatCur*evbd/vt + ckt->CKTgmin; - here->MOS6cbd = DrainSatCur*(evbd-1) + ckt->CKTgmin*vbd; - } - - /* now to determine whether the user was able to correctly - * identify the source and drain of his device - */ - if(vds >= 0) { - /* normal mode */ - here->MOS6mode = 1; - } else { - /* inverse mode */ - here->MOS6mode = -1; - } -/* - -*/ - - { - /* - * this block of code evaluates the drain current and its - * derivatives using the n-th power MOS model and the - * charges associated with the gate, channel and bulk for - * mosfets - * - */ - - /* the following 14 variables are local to this code block until - * it is obvious that they can be made global - */ - double arg1; - double sarg1; - double vgon; - double vdshere, vbsvbd; - double idsat, lambda, vonbm = 0.0; - double vdst, vdst2, ivdst1, vdstg; - - vbsvbd = (here->MOS6mode==1?vbs:vbd); - if (vbsvbd <= 0 ) { - sarg1 = sqrt(here->MOS6tPhi - vbsvbd); - } else { - sarg1 = sqrt(here->MOS6tPhi); - sarg1 = sarg1 - vbsvbd / (sarg1+sarg1); - sarg1 = MAX(0,sarg1); - } - vdshere = vds * here->MOS6mode; - von=(here->MOS6tVbi*model->MOS6type)+model->MOS6gamma*sarg1 - - model->MOS6gamma1 * vbsvbd - - model->MOS6sigma * vdshere; - vgon = (here->MOS6mode==1?vgs:vgd) - von; - - if (vgon <= 0) { - /* - * cutoff region - */ - vdsat = 0; - cdrain=0; - here->MOS6gm=0; - here->MOS6gds=0; - here->MOS6gmbs=0; - - } else { - if (sarg1 <= 0) { - arg1=0; - } else { - if ((here->MOS6mode==1?vbs:vbd) <= 0 ) { - vonbm = model->MOS6gamma1 - + model->MOS6gamma / (sarg1 + sarg1); - } else { - vonbm = model->MOS6gamma1 - + model->MOS6gamma / 2 / sqrt(here->MOS6tPhi); - } - } - sarg1 = log(vgon); - vdsat = model->MOS6kv * exp(sarg1 * model->MOS6nv); - idsat = betac * exp(sarg1 * model->MOS6nc); - lambda = model->MOS6lamda0 - model->MOS6lamda1 * vbsvbd; - /* - * saturation region - */ - cdrain = idsat * (1 + lambda * vdshere); - here->MOS6gm = cdrain * model->MOS6nc / vgon; - here->MOS6gds = here->MOS6gm * model->MOS6sigma - + idsat * lambda; - here->MOS6gmbs = here->MOS6gm * vonbm - - idsat * model->MOS6lamda1 * vdshere; - if (vdsat > vdshere){ - /* - * linear region - */ - vdst = vdshere / vdsat; - vdst2 = (2 - vdst) * vdst; - vdstg = - vdst * model->MOS6nv / vgon; - ivdst1 = cdrain * (2 - vdst - vdst); - cdrain = cdrain * vdst2; - here->MOS6gm = here->MOS6gm * vdst2 + ivdst1 * vdstg; - here->MOS6gds = here->MOS6gds * vdst2 + ivdst1 - * (1 / vdsat + vdstg * model->MOS6sigma); - here->MOS6gmbs = here->MOS6gmbs * vdst2 - + ivdst1 * vdstg * vonbm; - } - } - /* - * finished - */ - } -/* - -*/ - - - /* now deal with n vs p polarity */ - - here->MOS6von = model->MOS6type * von; - here->MOS6vdsat = model->MOS6type * vdsat; - /* line 490 */ - /* - * COMPUTE EQUIVALENT DRAIN CURRENT SOURCE - */ - here->MOS6cd=here->MOS6mode * cdrain - here->MOS6cbd; - - if (ckt->CKTmode & (MODETRAN | MODETRANOP | MODEINITSMSIG)) { - /* - * now we do the hard part of the bulk-drain and bulk-source - * diode - we evaluate the non-linear capacitance and - * charge - * - * the basic equations are not hard, but the implementation - * is somewhat long in an attempt to avoid log/exponential - * evaluations - */ - /* - * charge storage elements - * - *.. bulk-drain and bulk-source depletion capacitances - */ -#ifdef CAPBYPASS - if(((ckt->CKTmode & (MODEINITPRED | MODEINITTRAN) ) || - fabs(delvbs) >= ckt->CKTreltol * MAX(fabs(vbs), - fabs(*(ckt->CKTstate0+here->MOS6vbs)))+ - ckt->CKTvoltTol)|| senflag) -#endif /*CAPBYPASS*/ - { - /* can't bypass the diode capacitance calculations */ - if(here->MOS6Cbs != 0 || here->MOS6Cbssw != 0 ) { - if (vbs < here->MOS6tDepCap){ - arg=1-vbs/here->MOS6tBulkPot; - /* - * the following block looks somewhat long and messy, - * but since most users use the default grading - * coefficients of .5, and sqrt is MUCH faster than an - * exp(log()) we use this special case code to buy time. - * (as much as 10% of total job time!) - */ - if(model->MOS6bulkJctBotGradingCoeff == - model->MOS6bulkJctSideGradingCoeff) { - if(model->MOS6bulkJctBotGradingCoeff == .5) { - sarg = sargsw = 1/sqrt(arg); - } else { - sarg = sargsw = - exp(-model->MOS6bulkJctBotGradingCoeff* - log(arg)); - } - } else { - if(model->MOS6bulkJctBotGradingCoeff == .5) { - sarg = 1/sqrt(arg); - } else { - sarg = exp(-model->MOS6bulkJctBotGradingCoeff* - log(arg)); - } - if(model->MOS6bulkJctSideGradingCoeff == .5) { - sargsw = 1/sqrt(arg); - } else { - sargsw =exp(-model->MOS6bulkJctSideGradingCoeff* - log(arg)); - } - } - *(ckt->CKTstate0 + here->MOS6qbs) = - here->MOS6tBulkPot*(here->MOS6Cbs* - (1-arg*sarg)/(1-model->MOS6bulkJctBotGradingCoeff) - +here->MOS6Cbssw* - (1-arg*sargsw)/ - (1-model->MOS6bulkJctSideGradingCoeff)); - here->MOS6capbs=here->MOS6Cbs*sarg+ - here->MOS6Cbssw*sargsw; - } else { - *(ckt->CKTstate0 + here->MOS6qbs) = here->MOS6f4s + - vbs*(here->MOS6f2s+vbs*(here->MOS6f3s/2)); - here->MOS6capbs=here->MOS6f2s+here->MOS6f3s*vbs; - } - } else { - *(ckt->CKTstate0 + here->MOS6qbs) = 0; - here->MOS6capbs=0; - } - } -#ifdef CAPBYPASS - if(((ckt->CKTmode & (MODEINITPRED | MODEINITTRAN) ) || - fabs(delvbd) >= ckt->CKTreltol * MAX(fabs(vbd), - fabs(*(ckt->CKTstate0+here->MOS6vbd)))+ - ckt->CKTvoltTol)|| senflag) -#endif /*CAPBYPASS*/ - /* can't bypass the diode capacitance calculations */ - { - if(here->MOS6Cbd != 0 || here->MOS6Cbdsw != 0 ) { - if (vbd < here->MOS6tDepCap) { - arg=1-vbd/here->MOS6tBulkPot; - /* - * the following block looks somewhat long and messy, - * but since most users use the default grading - * coefficients of .5, and sqrt is MUCH faster than an - * exp(log()) we use this special case code to buy time. - * (as much as 10% of total job time!) - */ - if(model->MOS6bulkJctBotGradingCoeff == .5 && - model->MOS6bulkJctSideGradingCoeff == .5) { - sarg = sargsw = 1/sqrt(arg); - } else { - if(model->MOS6bulkJctBotGradingCoeff == .5) { - sarg = 1/sqrt(arg); - } else { - sarg = exp(-model->MOS6bulkJctBotGradingCoeff* - log(arg)); - } - if(model->MOS6bulkJctSideGradingCoeff == .5) { - sargsw = 1/sqrt(arg); - } else { - sargsw =exp(-model->MOS6bulkJctSideGradingCoeff* - log(arg)); - } - } - *(ckt->CKTstate0 + here->MOS6qbd) = - here->MOS6tBulkPot*(here->MOS6Cbd* - (1-arg*sarg) - /(1-model->MOS6bulkJctBotGradingCoeff) - +here->MOS6Cbdsw* - (1-arg*sargsw) - /(1-model->MOS6bulkJctSideGradingCoeff)); - here->MOS6capbd=here->MOS6Cbd*sarg+ - here->MOS6Cbdsw*sargsw; - } else { - *(ckt->CKTstate0 + here->MOS6qbd) = here->MOS6f4d + - vbd * (here->MOS6f2d + vbd * here->MOS6f3d/2); - here->MOS6capbd=here->MOS6f2d + vbd * here->MOS6f3d; - } - } else { - *(ckt->CKTstate0 + here->MOS6qbd) = 0; - here->MOS6capbd = 0; - } - } -/* - -*/ - - - if(SenCond && (ckt->CKTsenInfo->SENmode==TRANSEN)) goto next2; - - if ( ckt->CKTmode & MODETRAN ) { - /* (above only excludes tranop, since we're only at this - * point if tran or tranop ) - */ - - /* - * calculate equivalent conductances and currents for - * depletion capacitors - */ - - /* integrate the capacitors and save results */ - - error = NIintegrate(ckt,&geq,&ceq,here->MOS6capbd, - here->MOS6qbd); - if(error) return(error); - here->MOS6gbd += geq; - here->MOS6cbd += *(ckt->CKTstate0 + here->MOS6cqbd); - here->MOS6cd -= *(ckt->CKTstate0 + here->MOS6cqbd); - error = NIintegrate(ckt,&geq,&ceq,here->MOS6capbs, - here->MOS6qbs); - if(error) return(error); - here->MOS6gbs += geq; - here->MOS6cbs += *(ckt->CKTstate0 + here->MOS6cqbs); - } - } -/* - -*/ - - - if(SenCond) goto next2; - - - /* - * check convergence - */ - if ( (here->MOS6off == 0) || - (!(ckt->CKTmode & (MODEINITFIX|MODEINITSMSIG))) ){ - if (Check == 1) { - ckt->CKTnoncon++; - ckt->CKTtroubleElt = (GENinstance *) here; - } - } -/* - -*/ - - - /* save things away for next time */ - -next2: *(ckt->CKTstate0 + here->MOS6vbs) = vbs; - *(ckt->CKTstate0 + here->MOS6vbd) = vbd; - *(ckt->CKTstate0 + here->MOS6vgs) = vgs; - *(ckt->CKTstate0 + here->MOS6vds) = vds; - -/* - -*/ - - /* - * meyer's capacitor model - */ - if ( ckt->CKTmode & (MODETRAN | MODETRANOP | MODEINITSMSIG) ) { - /* - * calculate meyer's capacitors - */ - /* - * new cmeyer - this just evaluates at the current time, - * expects you to remember values from previous time - * returns 1/2 of non-constant portion of capacitance - * you must add in the other half from previous time - * and the constant part - */ - if (here->MOS6mode > 0){ - DEVqmeyer (vgs,vgd,vgb,von,vdsat, - (ckt->CKTstate0 + here->MOS6capgs), - (ckt->CKTstate0 + here->MOS6capgd), - (ckt->CKTstate0 + here->MOS6capgb), - here->MOS6tPhi,OxideCap); - } else { - DEVqmeyer (vgd,vgs,vgb,von,vdsat, - (ckt->CKTstate0 + here->MOS6capgd), - (ckt->CKTstate0 + here->MOS6capgs), - (ckt->CKTstate0 + here->MOS6capgb), - here->MOS6tPhi,OxideCap); - } - vgs1 = *(ckt->CKTstate1 + here->MOS6vgs); - vgd1 = vgs1 - *(ckt->CKTstate1 + here->MOS6vds); - vgb1 = vgs1 - *(ckt->CKTstate1 + here->MOS6vbs); - if(ckt->CKTmode & (MODETRANOP|MODEINITSMSIG)) { - capgs = 2 * *(ckt->CKTstate0+here->MOS6capgs)+ - GateSourceOverlapCap ; - capgd = 2 * *(ckt->CKTstate0+here->MOS6capgd)+ - GateDrainOverlapCap ; - capgb = 2 * *(ckt->CKTstate0+here->MOS6capgb)+ - GateBulkOverlapCap ; - } else { - capgs = ( *(ckt->CKTstate0+here->MOS6capgs)+ - *(ckt->CKTstate1+here->MOS6capgs) + - GateSourceOverlapCap ); - capgd = ( *(ckt->CKTstate0+here->MOS6capgd)+ - *(ckt->CKTstate1+here->MOS6capgd) + - GateDrainOverlapCap ); - capgb = ( *(ckt->CKTstate0+here->MOS6capgb)+ - *(ckt->CKTstate1+here->MOS6capgb) + - GateBulkOverlapCap ); - } - if(ckt->CKTsenInfo){ - here->MOS6cgs = capgs; - here->MOS6cgd = capgd; - here->MOS6cgb = capgb; - } -/* - -*/ - - /* - * store small-signal parameters (for meyer's model) - * all parameters already stored, so done... - */ - if(SenCond){ - if((ckt->CKTsenInfo->SENmode == DCSEN)|| - (ckt->CKTsenInfo->SENmode == ACSEN)){ - continue; - } - } - -#ifndef PREDICTOR - if (ckt->CKTmode & (MODEINITPRED | MODEINITTRAN) ) { - *(ckt->CKTstate0 + here->MOS6qgs) = - (1+xfact) * *(ckt->CKTstate1 + here->MOS6qgs) - - xfact * *(ckt->CKTstate2 + here->MOS6qgs); - *(ckt->CKTstate0 + here->MOS6qgd) = - (1+xfact) * *(ckt->CKTstate1 + here->MOS6qgd) - - xfact * *(ckt->CKTstate2 + here->MOS6qgd); - *(ckt->CKTstate0 + here->MOS6qgb) = - (1+xfact) * *(ckt->CKTstate1 + here->MOS6qgb) - - xfact * *(ckt->CKTstate2 + here->MOS6qgb); - } else { -#endif /*PREDICTOR*/ - if(ckt->CKTmode & MODETRAN) { - *(ckt->CKTstate0 + here->MOS6qgs) = (vgs-vgs1)*capgs + - *(ckt->CKTstate1 + here->MOS6qgs) ; - *(ckt->CKTstate0 + here->MOS6qgd) = (vgd-vgd1)*capgd + - *(ckt->CKTstate1 + here->MOS6qgd) ; - *(ckt->CKTstate0 + here->MOS6qgb) = (vgb-vgb1)*capgb + - *(ckt->CKTstate1 + here->MOS6qgb) ; - } else { - /* TRANOP only */ - *(ckt->CKTstate0 + here->MOS6qgs) = vgs*capgs; - *(ckt->CKTstate0 + here->MOS6qgd) = vgd*capgd; - *(ckt->CKTstate0 + here->MOS6qgb) = vgb*capgb; - } -#ifndef PREDICTOR - } -#endif /*PREDICTOR*/ - } -#ifndef NOBYPASS -bypass: -#endif - if(SenCond) continue; - - if ( (ckt->CKTmode & (MODEINITTRAN)) || - (! (ckt->CKTmode & (MODETRAN)) ) ) { - /* - * initialize to zero charge conductances - * and current - */ - gcgs=0; - ceqgs=0; - gcgd=0; - ceqgd=0; - gcgb=0; - ceqgb=0; - } else { - if(capgs == 0) *(ckt->CKTstate0 + here->MOS6cqgs) =0; - if(capgd == 0) *(ckt->CKTstate0 + here->MOS6cqgd) =0; - if(capgb == 0) *(ckt->CKTstate0 + here->MOS6cqgb) =0; - /* - * calculate equivalent conductances and currents for - * meyer"s capacitors - */ - error = NIintegrate(ckt,&gcgs,&ceqgs,capgs,here->MOS6qgs); - if(error) return(error); - error = NIintegrate(ckt,&gcgd,&ceqgd,capgd,here->MOS6qgd); - if(error) return(error); - error = NIintegrate(ckt,&gcgb,&ceqgb,capgb,here->MOS6qgb); - if(error) return(error); - ceqgs=ceqgs-gcgs*vgs+ckt->CKTag[0]* - *(ckt->CKTstate0 + here->MOS6qgs); - ceqgd=ceqgd-gcgd*vgd+ckt->CKTag[0]* - *(ckt->CKTstate0 + here->MOS6qgd); - ceqgb=ceqgb-gcgb*vgb+ckt->CKTag[0]* - *(ckt->CKTstate0 + here->MOS6qgb); - } - /* - * store charge storage info for meyer's cap in lx table - */ - - /* - * load current vector - */ - - m = here->MOS6m; - - ceqbs = model->MOS6type * - (here->MOS6cbs-(here->MOS6gbs)*vbs); - ceqbd = model->MOS6type * - (here->MOS6cbd-(here->MOS6gbd)*vbd); - if (here->MOS6mode >= 0) { - xnrm=1; - xrev=0; - cdreq=model->MOS6type*(cdrain-here->MOS6gds*vds- - here->MOS6gm*vgs-here->MOS6gmbs*vbs); - } else { - xnrm=0; - xrev=1; - cdreq = -(model->MOS6type)*(cdrain-here->MOS6gds*(-vds)- - here->MOS6gm*vgd-here->MOS6gmbs*vbd); - } - *(ckt->CKTrhs + here->MOS6gNode) -= - m * (model->MOS6type * (ceqgs + ceqgb + ceqgd)); - *(ckt->CKTrhs + here->MOS6bNode) -= - m * (ceqbs + ceqbd - model->MOS6type * ceqgb); - *(ckt->CKTrhs + here->MOS6dNodePrime) += - m * (ceqbd - cdreq + model->MOS6type * ceqgd); - *(ckt->CKTrhs + here->MOS6sNodePrime) += - m * (cdreq + ceqbs + model->MOS6type * ceqgs); - /* - * load y matrix - */ - - *(here->MOS6DdPtr) += m * (here->MOS6drainConductance); - *(here->MOS6GgPtr) += m * ((gcgd+gcgs+gcgb)); - *(here->MOS6SsPtr) += m * (here->MOS6sourceConductance); - *(here->MOS6BbPtr) += m * (here->MOS6gbd+here->MOS6gbs+gcgb); - *(here->MOS6DPdpPtr) += - m * (here->MOS6drainConductance+here->MOS6gds+ - here->MOS6gbd+xrev*(here->MOS6gm+here->MOS6gmbs)+gcgd); - *(here->MOS6SPspPtr) += - m * (here->MOS6sourceConductance+here->MOS6gds+ - here->MOS6gbs+xnrm*(here->MOS6gm+here->MOS6gmbs)+gcgs); - *(here->MOS6DdpPtr) += m * (-here->MOS6drainConductance); - *(here->MOS6GbPtr) -= m * gcgb; - *(here->MOS6GdpPtr) -= m * gcgd; - *(here->MOS6GspPtr) -= m * gcgs; - *(here->MOS6SspPtr) += m * (-here->MOS6sourceConductance); - *(here->MOS6BgPtr) -= m * gcgb; - *(here->MOS6BdpPtr) -= m * (here->MOS6gbd); - *(here->MOS6BspPtr) -= m * (here->MOS6gbs); - *(here->MOS6DPdPtr) += m * (-here->MOS6drainConductance); - *(here->MOS6DPgPtr) += m * ((xnrm-xrev)*here->MOS6gm-gcgd); - *(here->MOS6DPbPtr) += m * (-here->MOS6gbd+(xnrm-xrev)*here->MOS6gmbs); - *(here->MOS6DPspPtr) += m * (-here->MOS6gds-xnrm* - (here->MOS6gm+here->MOS6gmbs)); - *(here->MOS6SPgPtr) += m * (-(xnrm-xrev)*here->MOS6gm-gcgs); - *(here->MOS6SPsPtr) += m * (-here->MOS6sourceConductance); - *(here->MOS6SPbPtr) += m * (-here->MOS6gbs-(xnrm-xrev)*here->MOS6gmbs); - *(here->MOS6SPdpPtr) += m * (-here->MOS6gds-xrev* - (here->MOS6gm+here->MOS6gmbs)); - } - } - return(OK); -} diff --git a/src/spicelib/devices/mos6/mos6mask.c b/src/spicelib/devices/mos6/mos6mask.c deleted file mode 100644 index 6f6df15a3..000000000 --- a/src/spicelib/devices/mos6/mos6mask.c +++ /dev/null @@ -1,143 +0,0 @@ -/********** -Copyright 1990 Regents of the University of California. All rights reserved. -Author: 1989 Takayasu Sakurai -**********/ - -#include "ngspice/ngspice.h" -#include "ngspice/const.h" -#include "ngspice/ifsim.h" -#include "mos6defs.h" -#include "ngspice/sperror.h" -#include "ngspice/suffix.h" - -int -MOS6mAsk(CKTcircuit *ckt, GENmodel *inModel, int param, - IFvalue *value) -{ - MOS6model *model = (MOS6model *)inModel; - - NG_IGNORE(ckt); - - switch(param) { - case MOS6_MOD_TNOM: - value->rValue = model->MOS6tnom; - break; - case MOS6_MOD_VTO: - value->rValue = model->MOS6vt0; - break; - case MOS6_MOD_KV: - value->rValue = model->MOS6kv; - break; - case MOS6_MOD_NV: - value->rValue = model->MOS6nv; - break; - case MOS6_MOD_KC: - value->rValue = model->MOS6kc; - break; - case MOS6_MOD_NC: - value->rValue = model->MOS6nc; - break; - case MOS6_MOD_NVTH: - value->rValue = model->MOS6nvth; - break; - case MOS6_MOD_PS: - value->rValue = model->MOS6ps; - break; - case MOS6_MOD_GAMMA: - value->rValue = model->MOS6gamma; - break; - case MOS6_MOD_GAMMA1: - value->rValue = model->MOS6gamma1; - break; - case MOS6_MOD_SIGMA: - value->rValue = model->MOS6sigma; - break; - case MOS6_MOD_PHI: - value->rValue = model->MOS6phi; - break; - case MOS6_MOD_LAMBDA: - value->rValue = model->MOS6lambda; - break; - case MOS6_MOD_LAMDA0: - value->rValue = model->MOS6lamda0; - break; - case MOS6_MOD_LAMDA1: - value->rValue = model->MOS6lamda1; - break; - case MOS6_MOD_RD: - value->rValue = model->MOS6drainResistance; - break; - case MOS6_MOD_RS: - value->rValue = model->MOS6sourceResistance; - break; - case MOS6_MOD_CBD: - value->rValue = model->MOS6capBD; - break; - case MOS6_MOD_CBS: - value->rValue = model->MOS6capBS; - break; - case MOS6_MOD_IS: - value->rValue = model->MOS6jctSatCur; - break; - case MOS6_MOD_PB: - value->rValue = model->MOS6bulkJctPotential; - break; - case MOS6_MOD_CGSO: - value->rValue = model->MOS6gateSourceOverlapCapFactor; - break; - case MOS6_MOD_CGDO: - value->rValue = model->MOS6gateDrainOverlapCapFactor; - break; - case MOS6_MOD_CGBO: - value->rValue = model->MOS6gateBulkOverlapCapFactor; - break; - case MOS6_MOD_CJ: - value->rValue = model->MOS6bulkCapFactor; - break; - case MOS6_MOD_MJ: - value->rValue = model->MOS6bulkJctBotGradingCoeff; - break; - case MOS6_MOD_CJSW: - value->rValue = model->MOS6sideWallCapFactor; - break; - case MOS6_MOD_MJSW: - value->rValue = model->MOS6bulkJctSideGradingCoeff; - break; - case MOS6_MOD_JS: - value->rValue = model->MOS6jctSatCurDensity; - break; - case MOS6_MOD_TOX: - value->rValue = model->MOS6oxideThickness; - break; - case MOS6_MOD_LD: - value->rValue = model->MOS6latDiff; - break; - case MOS6_MOD_RSH: - value->rValue = model->MOS6sheetResistance; - break; - case MOS6_MOD_U0: - value->rValue = model->MOS6surfaceMobility; - break; - case MOS6_MOD_FC: - value->rValue = model->MOS6fwdCapDepCoeff; - break; - case MOS6_MOD_NSS: - value->rValue = model->MOS6surfaceStateDensity; - break; - case MOS6_MOD_NSUB: - value->rValue = model->MOS6substrateDoping; - break; - case MOS6_MOD_TPG: - value->iValue = model->MOS6gateType; - break; - case MOS6_MOD_TYPE: - if (model->MOS6type > 0) - value->sValue = "nmos"; - else - value->sValue = "pmos"; - break; - default: - return(E_BADPARM); - } - return(OK); -} diff --git a/src/spicelib/devices/mos6/mos6mpar.c b/src/spicelib/devices/mos6/mos6mpar.c deleted file mode 100644 index 58f7bea00..000000000 --- a/src/spicelib/devices/mos6/mos6mpar.c +++ /dev/null @@ -1,185 +0,0 @@ -/********** -Copyright 1990 Regents of the University of California. All rights reserved. -Author: 1989 Takayasu Sakurai -**********/ -/* - */ - -#include "ngspice/ngspice.h" -#include "ngspice/const.h" -#include "ngspice/ifsim.h" -#include "mos6defs.h" -#include "ngspice/sperror.h" -#include "ngspice/suffix.h" - - -int -MOS6mParam(int param, IFvalue *value, GENmodel *inModel) -{ - MOS6model *model = (MOS6model *)inModel; - switch(param) { - case MOS6_MOD_TNOM: - model->MOS6tnom = value->rValue+CONSTCtoK; - model->MOS6tnomGiven = TRUE; - break; - case MOS6_MOD_VTO: - model->MOS6vt0 = value->rValue; - model->MOS6vt0Given = TRUE; - break; - case MOS6_MOD_KV: - model->MOS6kv = value->rValue; - model->MOS6kvGiven = TRUE; - break; - case MOS6_MOD_NV: - model->MOS6nv = value->rValue; - model->MOS6nvGiven = TRUE; - break; - case MOS6_MOD_KC: - model->MOS6kc = value->rValue; - model->MOS6kcGiven = TRUE; - break; - case MOS6_MOD_NC: - model->MOS6nc = value->rValue; - model->MOS6ncGiven = TRUE; - break; - case MOS6_MOD_NVTH: - model->MOS6nvth = value->rValue; - model->MOS6nvthGiven = TRUE; - break; - case MOS6_MOD_PS: - model->MOS6ps = value->rValue; - model->MOS6psGiven = TRUE; - break; - case MOS6_MOD_GAMMA: - model->MOS6gamma = value->rValue; - model->MOS6gammaGiven = TRUE; - break; - case MOS6_MOD_GAMMA1: - model->MOS6gamma1 = value->rValue; - model->MOS6gamma1Given = TRUE; - break; - case MOS6_MOD_SIGMA: - model->MOS6sigma = value->rValue; - model->MOS6sigmaGiven = TRUE; - break; - case MOS6_MOD_PHI: - model->MOS6phi = value->rValue; - model->MOS6phiGiven = TRUE; - break; - case MOS6_MOD_LAMBDA: - model->MOS6lambda = value->rValue; - model->MOS6lambdaGiven = TRUE; - break; - case MOS6_MOD_LAMDA0: - model->MOS6lamda0 = value->rValue; - model->MOS6lamda0Given = TRUE; - break; - case MOS6_MOD_LAMDA1: - model->MOS6lamda1 = value->rValue; - model->MOS6lamda1Given = TRUE; - break; - case MOS6_MOD_RD: - model->MOS6drainResistance = value->rValue; - model->MOS6drainResistanceGiven = TRUE; - break; - case MOS6_MOD_RS: - model->MOS6sourceResistance = value->rValue; - model->MOS6sourceResistanceGiven = TRUE; - break; - case MOS6_MOD_CBD: - model->MOS6capBD = value->rValue; - model->MOS6capBDGiven = TRUE; - break; - case MOS6_MOD_CBS: - model->MOS6capBS = value->rValue; - model->MOS6capBSGiven = TRUE; - break; - case MOS6_MOD_IS: - model->MOS6jctSatCur = value->rValue; - model->MOS6jctSatCurGiven = TRUE; - break; - case MOS6_MOD_PB: - model->MOS6bulkJctPotential = value->rValue; - model->MOS6bulkJctPotentialGiven = TRUE; - break; - case MOS6_MOD_CGSO: - model->MOS6gateSourceOverlapCapFactor = value->rValue; - model->MOS6gateSourceOverlapCapFactorGiven = TRUE; - break; - case MOS6_MOD_CGDO: - model->MOS6gateDrainOverlapCapFactor = value->rValue; - model->MOS6gateDrainOverlapCapFactorGiven = TRUE; - break; - case MOS6_MOD_CGBO: - model->MOS6gateBulkOverlapCapFactor = value->rValue; - model->MOS6gateBulkOverlapCapFactorGiven = TRUE; - break; - case MOS6_MOD_CJ: - model->MOS6bulkCapFactor = value->rValue; - model->MOS6bulkCapFactorGiven = TRUE; - break; - case MOS6_MOD_MJ: - model->MOS6bulkJctBotGradingCoeff = value->rValue; - model->MOS6bulkJctBotGradingCoeffGiven = TRUE; - break; - case MOS6_MOD_CJSW: - model->MOS6sideWallCapFactor = value->rValue; - model->MOS6sideWallCapFactorGiven = TRUE; - break; - case MOS6_MOD_MJSW: - model->MOS6bulkJctSideGradingCoeff = value->rValue; - model->MOS6bulkJctSideGradingCoeffGiven = TRUE; - break; - case MOS6_MOD_JS: - model->MOS6jctSatCurDensity = value->rValue; - model->MOS6jctSatCurDensityGiven = TRUE; - break; - case MOS6_MOD_TOX: - model->MOS6oxideThickness = value->rValue; - model->MOS6oxideThicknessGiven = TRUE; - break; - case MOS6_MOD_LD: - model->MOS6latDiff = value->rValue; - model->MOS6latDiffGiven = TRUE; - break; - case MOS6_MOD_RSH: - model->MOS6sheetResistance = value->rValue; - model->MOS6sheetResistanceGiven = TRUE; - break; - case MOS6_MOD_U0: - model->MOS6surfaceMobility = value->rValue; - model->MOS6surfaceMobilityGiven = TRUE; - break; - case MOS6_MOD_FC: - model->MOS6fwdCapDepCoeff = value->rValue; - model->MOS6fwdCapDepCoeffGiven = TRUE; - break; - case MOS6_MOD_NSS: - model->MOS6surfaceStateDensity = value->rValue; - model->MOS6surfaceStateDensityGiven = TRUE; - break; - case MOS6_MOD_NSUB: - model->MOS6substrateDoping = value->rValue; - model->MOS6substrateDopingGiven = TRUE; - break; - case MOS6_MOD_TPG: - model->MOS6gateType = value->iValue; - model->MOS6gateTypeGiven = TRUE; - break; - case MOS6_MOD_NMOS: - if(value->iValue) { - model->MOS6type = 1; - model->MOS6typeGiven = TRUE; - } - break; - case MOS6_MOD_PMOS: - if(value->iValue) { - model->MOS6type = -1; - model->MOS6typeGiven = TRUE; - } - break; - default: - return(E_BADPARM); - } - return(OK); -} diff --git a/src/spicelib/devices/mos6/mos6par.c b/src/spicelib/devices/mos6/mos6par.c deleted file mode 100644 index a26d76248..000000000 --- a/src/spicelib/devices/mos6/mos6par.c +++ /dev/null @@ -1,120 +0,0 @@ -/********** -Copyright 1990 Regents of the University of California. All rights reserved. -Author: 1989 Takayasu Sakurai -**********/ -/* - */ - -#include "ngspice/ngspice.h" -#include "ngspice/const.h" -#include "ngspice/ifsim.h" -#include "mos6defs.h" -#include "ngspice/sperror.h" -#include "ngspice/suffix.h" - - -/* ARGSUSED */ -int -MOS6param(int param, IFvalue *value, GENinstance *inst, IFvalue *select) -{ - MOS6instance *here = (MOS6instance *)inst; - - NG_IGNORE(select); - - switch (param) { - case MOS6_TEMP: - here->MOS6temp = value->rValue+CONSTCtoK; - here->MOS6tempGiven = TRUE; - break; - case MOS6_DTEMP: - here->MOS6dtemp = value->rValue; - here->MOS6dtempGiven = TRUE; - break; - case MOS6_W: - here->MOS6w = value->rValue; - here->MOS6wGiven = TRUE; - break; - case MOS6_L: - here->MOS6l = value->rValue; - here->MOS6lGiven = TRUE; - break; - case MOS6_M: - here->MOS6m = value->rValue; - here->MOS6mGiven = TRUE; - break; - case MOS6_AS: - here->MOS6sourceArea = value->rValue; - here->MOS6sourceAreaGiven = TRUE; - break; - case MOS6_AD: - here->MOS6drainArea = value->rValue; - here->MOS6drainAreaGiven = TRUE; - break; - case MOS6_PS: - here->MOS6sourcePerimiter = value->rValue; - here->MOS6sourcePerimiterGiven = TRUE; - break; - case MOS6_PD: - here->MOS6drainPerimiter = value->rValue; - here->MOS6drainPerimiterGiven = TRUE; - break; - case MOS6_NRS: - here->MOS6sourceSquares = value->rValue; - here->MOS6sourceSquaresGiven = TRUE; - break; - case MOS6_NRD: - here->MOS6drainSquares = value->rValue; - here->MOS6drainSquaresGiven = TRUE; - break; - case MOS6_OFF: - here->MOS6off = (value->iValue != 0); - break; - case MOS6_IC_VBS: - here->MOS6icVBS = value->rValue; - here->MOS6icVBSGiven = TRUE; - break; - case MOS6_IC_VDS: - here->MOS6icVDS = value->rValue; - here->MOS6icVDSGiven = TRUE; - break; - case MOS6_IC_VGS: - here->MOS6icVGS = value->rValue; - here->MOS6icVGSGiven = TRUE; - break; - case MOS6_IC: - /* FALLTHROUGH added to suppress GCC warning due to - * -Wimplicit-fallthrough flag */ - switch (value->v.numValue) { - case 3: - here->MOS6icVBS = *(value->v.vec.rVec+2); - here->MOS6icVBSGiven = TRUE; - /* FALLTHROUGH */ - case 2: - here->MOS6icVGS = *(value->v.vec.rVec+1); - here->MOS6icVGSGiven = TRUE; - /* FALLTHROUGH */ - case 1: - here->MOS6icVDS = *(value->v.vec.rVec); - here->MOS6icVDSGiven = TRUE; - break; - default: - return(E_BADPARM); - } - break; - case MOS6_L_SENS: - if(value->iValue) { - here->MOS6senParmNo = 1; - here->MOS6sens_l = 1; - } - break; - case MOS6_W_SENS: - if(value->iValue) { - here->MOS6senParmNo = 1; - here->MOS6sens_w = 1; - } - break; - default: - return(E_BADPARM); - } - return(OK); -} diff --git a/src/spicelib/devices/mos6/mos6set.c b/src/spicelib/devices/mos6/mos6set.c deleted file mode 100644 index 79bd2bf6b..000000000 --- a/src/spicelib/devices/mos6/mos6set.c +++ /dev/null @@ -1,248 +0,0 @@ -/********** -Copyright 1990 Regents of the University of California. All rights reserved. -Author: 1989 Takayasu Sakurai -Modified: 2000 AlansFixes -**********/ - - /* load the MOS6 device structure with those pointers needed later - * for fast matrix loading - */ - -#include "ngspice/ngspice.h" -#include "ngspice/smpdefs.h" -#include "ngspice/cktdefs.h" -#include "mos6defs.h" -#include "ngspice/sperror.h" -#include "ngspice/suffix.h" - -int -MOS6setup(SMPmatrix *matrix, GENmodel *inModel, CKTcircuit *ckt, - int *states) -{ - MOS6model *model = (MOS6model *)inModel; - MOS6instance *here; - int error; - CKTnode *tmp; - - /* loop through all the MOS6 device models */ - for( ; model != NULL; model = MOS6nextModel(model)) { - - if(!model->MOS6typeGiven) { - model->MOS6type = NMOS; - } - if(!model->MOS6latDiffGiven) { - model->MOS6latDiff = 0; - } - if(!model->MOS6jctSatCurDensityGiven) { - model->MOS6jctSatCurDensity = 0; - } - if(!model->MOS6jctSatCurGiven) { - model->MOS6jctSatCur = 1e-14; - } - if(!model->MOS6kvGiven) { - model->MOS6kv = 2; - } - if(!model->MOS6nvGiven) { - model->MOS6nv = 0.5; - } - if(!model->MOS6kcGiven) { - model->MOS6kc = 5e-5; - } - if(!model->MOS6ncGiven) { - model->MOS6nc = 1; - } - if(!model->MOS6nvthGiven) { - model->MOS6nvth = 0.5; - } - if(!model->MOS6psGiven) { - model->MOS6ps = 0; - } - if(!model->MOS6gateSourceOverlapCapFactorGiven) { - model->MOS6gateSourceOverlapCapFactor = 0; - } - if(!model->MOS6gateDrainOverlapCapFactorGiven) { - model->MOS6gateDrainOverlapCapFactor = 0; - } - if(!model->MOS6gateBulkOverlapCapFactorGiven) { - model->MOS6gateBulkOverlapCapFactor = 0; - } - if(!model->MOS6vt0Given) { - model->MOS6vt0 = 0; - } - if(!model->MOS6bulkCapFactorGiven) { - model->MOS6bulkCapFactor = 0; - } - if(!model->MOS6sideWallCapFactorGiven) { - model->MOS6sideWallCapFactor = 0; - } - if(!model->MOS6bulkJctPotentialGiven) { - model->MOS6bulkJctPotential = .8; - } - if(!model->MOS6bulkJctBotGradingCoeffGiven) { - model->MOS6bulkJctBotGradingCoeff = .5; - } - if(!model->MOS6bulkJctSideGradingCoeffGiven) { - model->MOS6bulkJctSideGradingCoeff = .5; - } - if(!model->MOS6fwdCapDepCoeffGiven) { - model->MOS6fwdCapDepCoeff = .5; - } - if(!model->MOS6phiGiven) { - model->MOS6phi = .6; - } - if(!model->MOS6lamda0Given) { - model->MOS6lamda0 = 0; - if(model->MOS6lambdaGiven) { - model->MOS6lamda0 = model->MOS6lambda; - } - } - if(!model->MOS6lamda1Given) { - model->MOS6lamda1 = 0; - } - if(!model->MOS6sigmaGiven) { - model->MOS6sigma = 0; - } - if(!model->MOS6gammaGiven) { - model->MOS6gamma = 0; - } - if(!model->MOS6gamma1Given) { - model->MOS6gamma1 = 0; - } - - /* loop through all the instances of the model */ - for (here = MOS6instances(model); here != NULL ; - here=MOS6nextInstance(here)) { - CKTnode *tmpNode; - IFuid tmpName; - - if(!here->MOS6drainPerimiterGiven) { - here->MOS6drainPerimiter = 0; - } - if(!here->MOS6icVBSGiven) { - here->MOS6icVBS = 0; - } - if(!here->MOS6icVDSGiven) { - here->MOS6icVDS = 0; - } - if(!here->MOS6icVGSGiven) { - here->MOS6icVGS = 0; - } - if(!here->MOS6sourcePerimiterGiven) { - here->MOS6sourcePerimiter = 0; - } - if(!here->MOS6vdsatGiven) { - here->MOS6vdsat = 0; - } - if(!here->MOS6vonGiven) { - here->MOS6von = 0; - } - if(!here->MOS6mGiven) { - here->MOS6m = 1; - } - - - /* allocate a chunk of the state vector */ - here->MOS6states = *states; - *states += MOS6numStates; - if(ckt->CKTsenInfo && (ckt->CKTsenInfo->SENmode & TRANSEN) ){ - *states += MOS6numSenStates * (ckt->CKTsenInfo->SENparms); - } - - if((model->MOS6drainResistance != 0 || - (model->MOS6sheetResistance != 0 && - here->MOS6drainSquares != 0) )) { - if (here->MOS6dNodePrime == 0) { - error = CKTmkVolt(ckt,&tmp,here->MOS6name,"drain"); - if(error) return(error); - here->MOS6dNodePrime = tmp->number; - if (ckt->CKTcopyNodesets) { - if (CKTinst2Node(ckt,here,1,&tmpNode,&tmpName)==OK) { - if (tmpNode->nsGiven) { - tmp->nodeset=tmpNode->nodeset; - tmp->nsGiven=tmpNode->nsGiven; - } - } - } - } - } else { - here->MOS6dNodePrime = here->MOS6dNode; - } - - if((model->MOS6sourceResistance != 0 || - (model->MOS6sheetResistance != 0 && - here->MOS6sourceSquares != 0) )) { - if (here->MOS6sNodePrime == 0) { - error = CKTmkVolt(ckt,&tmp,here->MOS6name,"source"); - if(error) return(error); - here->MOS6sNodePrime = tmp->number; - if (ckt->CKTcopyNodesets) { - if (CKTinst2Node(ckt,here,3,&tmpNode,&tmpName)==OK) { - if (tmpNode->nsGiven) { - tmp->nodeset=tmpNode->nodeset; - tmp->nsGiven=tmpNode->nsGiven; - } - } - } - } - } else { - here->MOS6sNodePrime = here->MOS6sNode; - } -/* macro to make elements with built in test for out of memory */ -#define TSTALLOC(ptr,first,second) \ -do { if((here->ptr = SMPmakeElt(matrix, here->first, here->second)) == NULL){\ - return(E_NOMEM);\ -} } while(0) - - TSTALLOC(MOS6DdPtr,MOS6dNode,MOS6dNode); - TSTALLOC(MOS6GgPtr,MOS6gNode,MOS6gNode); - TSTALLOC(MOS6SsPtr,MOS6sNode,MOS6sNode); - TSTALLOC(MOS6BbPtr,MOS6bNode,MOS6bNode); - TSTALLOC(MOS6DPdpPtr,MOS6dNodePrime,MOS6dNodePrime); - TSTALLOC(MOS6SPspPtr,MOS6sNodePrime,MOS6sNodePrime); - TSTALLOC(MOS6DdpPtr,MOS6dNode,MOS6dNodePrime); - TSTALLOC(MOS6GbPtr,MOS6gNode,MOS6bNode); - TSTALLOC(MOS6GdpPtr,MOS6gNode,MOS6dNodePrime); - TSTALLOC(MOS6GspPtr,MOS6gNode,MOS6sNodePrime); - TSTALLOC(MOS6SspPtr,MOS6sNode,MOS6sNodePrime); - TSTALLOC(MOS6BdpPtr,MOS6bNode,MOS6dNodePrime); - TSTALLOC(MOS6BspPtr,MOS6bNode,MOS6sNodePrime); - TSTALLOC(MOS6DPspPtr,MOS6dNodePrime,MOS6sNodePrime); - TSTALLOC(MOS6DPdPtr,MOS6dNodePrime,MOS6dNode); - TSTALLOC(MOS6BgPtr,MOS6bNode,MOS6gNode); - TSTALLOC(MOS6DPgPtr,MOS6dNodePrime,MOS6gNode); - TSTALLOC(MOS6SPgPtr,MOS6sNodePrime,MOS6gNode); - TSTALLOC(MOS6SPsPtr,MOS6sNodePrime,MOS6sNode); - TSTALLOC(MOS6DPbPtr,MOS6dNodePrime,MOS6bNode); - TSTALLOC(MOS6SPbPtr,MOS6sNodePrime,MOS6bNode); - TSTALLOC(MOS6SPdpPtr,MOS6sNodePrime,MOS6dNodePrime); - - } - } - return(OK); -} - -int -MOS6unsetup(GENmodel *inModel, CKTcircuit *ckt) -{ - MOS6model *model; - MOS6instance *here; - - for (model = (MOS6model *)inModel; model != NULL; - model = MOS6nextModel(model)) - { - for (here = MOS6instances(model); here != NULL; - here=MOS6nextInstance(here)) - { - if (here->MOS6sNodePrime > 0 - && here->MOS6sNodePrime != here->MOS6sNode) - CKTdltNNum(ckt, here->MOS6sNodePrime); - here->MOS6sNodePrime= 0; - - if (here->MOS6dNodePrime > 0 - && here->MOS6dNodePrime != here->MOS6dNode) - CKTdltNNum(ckt, here->MOS6dNodePrime); - here->MOS6dNodePrime= 0; - } - } - return OK; -} diff --git a/src/spicelib/devices/mos6/mos6temp.c b/src/spicelib/devices/mos6/mos6temp.c deleted file mode 100644 index bb263a997..000000000 --- a/src/spicelib/devices/mos6/mos6temp.c +++ /dev/null @@ -1,331 +0,0 @@ -/********** -Copyright 1990 Regents of the University of California. All rights reserved. -Author: 1989 Takayasu Sakurai -**********/ - -#include "ngspice/ngspice.h" -#include "ngspice/cktdefs.h" -#include "mos6defs.h" -#include "ngspice/const.h" -#include "ngspice/sperror.h" -#include "ngspice/suffix.h" - -int -MOS6temp(GENmodel *inModel, CKTcircuit *ckt) -{ - MOS6model *model = (MOS6model *)inModel; - MOS6instance *here; - - double egfet,egfet1; - double fact1,fact2; - double kt,kt1; - double arg1; - double ratio,ratio4; - double phio; - double pbo; - double gmanew,gmaold; - double capfact; - double pbfact1,pbfact; - double vt,vtnom; - double wkfngs; - double wkfng; - double fermig; - double fermis; - double vfb; - /* loop through all the resistor models */ - for( ; model != NULL; model = MOS6nextModel(model)) { - - - /* perform model defaulting */ - if(!model->MOS6tnomGiven) { - model->MOS6tnom = ckt->CKTnomTemp; - } - - fact1 = model->MOS6tnom/REFTEMP; - vtnom = model->MOS6tnom*CONSTKoverQ; - kt1 = CONSTboltz * model->MOS6tnom; - egfet1 = 1.16-(7.02e-4*model->MOS6tnom*model->MOS6tnom)/ - (model->MOS6tnom+1108); - arg1 = -egfet1/(kt1+kt1)+1.1150877/(CONSTboltz*(REFTEMP+REFTEMP)); - pbfact1 = -2*vtnom *(1.5*log(fact1)+CHARGE*arg1); - - /* now model parameter preprocessing */ - - if (model->MOS6phi <= 0.0) { - SPfrontEnd->IFerrorf (ERR_FATAL, - "%s: Phi is not positive.", model->MOS6modName); - return(E_BADPARM); - } - - if(!model->MOS6oxideThicknessGiven || model->MOS6oxideThickness == 0) { - model->MOS6oxideCapFactor = 0; - } else { - model->MOS6oxideCapFactor = 3.9 * 8.854214871e-12/ - model->MOS6oxideThickness; - if(!model->MOS6kcGiven) { - if(!model->MOS6surfaceMobilityGiven) { - model->MOS6surfaceMobility=600; - } - model->MOS6kc = 0.5 * model->MOS6surfaceMobility * - model->MOS6oxideCapFactor * 1e-4 /*(m**2/cm**2)*/; - } - if(model->MOS6substrateDopingGiven) { - if(model->MOS6substrateDoping*1e6 /*(cm**3/m**3)*/ >1.45e16) { - if(!model->MOS6phiGiven) { - model->MOS6phi = 2*vtnom* - log(model->MOS6substrateDoping* - 1e6/*(cm**3/m**3)*//1.45e16); - model->MOS6phi = MAX(.1,model->MOS6phi); - } - fermis = model->MOS6type * .5 * model->MOS6phi; - wkfng = 3.2; - if(!model->MOS6gateTypeGiven) model->MOS6gateType=1; - if(model->MOS6gateType != 0) { - fermig = model->MOS6type *model->MOS6gateType*.5*egfet1; - wkfng = 3.25 + .5 * egfet1 - fermig; - } - wkfngs = wkfng - (3.25 + .5 * egfet1 +fermis); - if(!model->MOS6gammaGiven) { - model->MOS6gamma = sqrt(2 * 11.70 * 8.854214871e-12 * - CHARGE * model->MOS6substrateDoping* - 1e6/*(cm**3/m**3)*/)/ - model->MOS6oxideCapFactor; - } - if(!model->MOS6gamma1Given) { - model->MOS6gamma1 = 0.0; - } - if(!model->MOS6vt0Given) { - if(!model->MOS6surfaceStateDensityGiven) - model->MOS6surfaceStateDensity=0; - vfb = wkfngs - - model->MOS6surfaceStateDensity * - 1e4 /*(cm**2/m**2)*/ * - CHARGE/model->MOS6oxideCapFactor; - model->MOS6vt0 = vfb + model->MOS6type * - (model->MOS6gamma * sqrt(model->MOS6phi)+ - model->MOS6phi); - } - } else { - model->MOS6substrateDoping = 0; - SPfrontEnd->IFerrorf (ERR_FATAL, - "%s: Nsub < Ni", model->MOS6modName); - return(E_BADPARM); - } - } - } - - - /* loop through all instances of the model */ - for(here = MOS6instances(model); here!= NULL; - here = MOS6nextInstance(here)) { - - double czbd; /* zero voltage bulk-drain capacitance */ - double czbdsw; /* zero voltage bulk-drain sidewall capacitance */ - double czbs; /* zero voltage bulk-source capacitance */ - double czbssw; /* zero voltage bulk-source sidewall capacitance */ - double arg; /* 1 - fc */ - double sarg; /* (1-fc) ^^ (-mj) */ - double sargsw; /* (1-fc) ^^ (-mjsw) */ - - /* perform the parameter defaulting */ - if(!here->MOS6dtempGiven) { - here->MOS6dtemp = 0.0; - } - if(!here->MOS6tempGiven) { - here->MOS6temp = ckt->CKTtemp + here->MOS6dtemp; - } - vt = here->MOS6temp * CONSTKoverQ; - ratio = here->MOS6temp/model->MOS6tnom; - fact2 = here->MOS6temp/REFTEMP; - kt = here->MOS6temp * CONSTboltz; - egfet = 1.16-(7.02e-4*here->MOS6temp*here->MOS6temp)/ - (here->MOS6temp+1108); - arg = -egfet/(kt+kt)+1.1150877/(CONSTboltz*(REFTEMP+REFTEMP)); - pbfact = -2*vt *(1.5*log(fact2)+CHARGE*arg); - - if(!here->MOS6drainAreaGiven) { - here->MOS6drainArea = ckt->CKTdefaultMosAD; - } - if(!here->MOS6lGiven) { - here->MOS6l = ckt->CKTdefaultMosL; - } - if(!here->MOS6sourceAreaGiven) { - here->MOS6sourceArea = ckt->CKTdefaultMosAS; - } - if(!here->MOS6wGiven) { - here->MOS6w = ckt->CKTdefaultMosW; - } - - if(here->MOS6l - 2 * model->MOS6latDiff <=0) { - SPfrontEnd->IFerrorf (ERR_WARNING, - "%s: effective channel length less than zero", - model->MOS6modName); - } - ratio4 = ratio * sqrt(ratio); - here->MOS6tKv = model->MOS6kv; - here->MOS6tKc = model->MOS6kc / ratio4; - here->MOS6tSurfMob = model->MOS6surfaceMobility/ratio4; - phio= (model->MOS6phi-pbfact1)/fact1; - here->MOS6tPhi = fact2 * phio + pbfact; - here->MOS6tVbi = - model->MOS6vt0 - model->MOS6type * - (model->MOS6gamma* sqrt(model->MOS6phi)) - +.5*(egfet1-egfet) - + model->MOS6type*.5* (here->MOS6tPhi-model->MOS6phi); - here->MOS6tVto = here->MOS6tVbi + model->MOS6type * - model->MOS6gamma * sqrt(here->MOS6tPhi); - here->MOS6tSatCur = model->MOS6jctSatCur* - exp(-egfet/vt+egfet1/vtnom); - here->MOS6tSatCurDens = model->MOS6jctSatCurDensity * - exp(-egfet/vt+egfet1/vtnom); - pbo = (model->MOS6bulkJctPotential - pbfact1)/fact1; - gmaold = (model->MOS6bulkJctPotential-pbo)/pbo; - capfact = 1/(1+model->MOS6bulkJctBotGradingCoeff* - (4e-4*(model->MOS6tnom-REFTEMP)-gmaold)); - here->MOS6tCbd = model->MOS6capBD * capfact; - here->MOS6tCbs = model->MOS6capBS * capfact; - here->MOS6tCj = model->MOS6bulkCapFactor * capfact; - capfact = 1/(1+model->MOS6bulkJctSideGradingCoeff* - (4e-4*(model->MOS6tnom-REFTEMP)-gmaold)); - here->MOS6tCjsw = model->MOS6sideWallCapFactor * capfact; - here->MOS6tBulkPot = fact2 * pbo+pbfact; - gmanew = (here->MOS6tBulkPot-pbo)/pbo; - capfact = (1+model->MOS6bulkJctBotGradingCoeff* - (4e-4*(here->MOS6temp-REFTEMP)-gmanew)); - here->MOS6tCbd *= capfact; - here->MOS6tCbs *= capfact; - here->MOS6tCj *= capfact; - capfact = (1+model->MOS6bulkJctSideGradingCoeff* - (4e-4*(here->MOS6temp-REFTEMP)-gmanew)); - here->MOS6tCjsw *= capfact; - here->MOS6tDepCap = model->MOS6fwdCapDepCoeff * here->MOS6tBulkPot; - if( (here->MOS6tSatCurDens == 0) || - (here->MOS6drainArea == 0) || - (here->MOS6sourceArea == 0) ) { - here->MOS6sourceVcrit = here->MOS6drainVcrit = - vt*log(vt/(CONSTroot2*here->MOS6tSatCur)); - } else { - here->MOS6drainVcrit = - vt * log( vt / (CONSTroot2 * - here->MOS6tSatCurDens * here->MOS6drainArea)); - here->MOS6sourceVcrit = - vt * log( vt / (CONSTroot2 * - here->MOS6tSatCurDens * here->MOS6sourceArea)); - } - - if(model->MOS6capBDGiven) { - czbd = here->MOS6tCbd; - } else { - if(model->MOS6bulkCapFactorGiven) { - czbd=here->MOS6tCj*here->MOS6drainArea; - } else { - czbd=0; - } - } - if(model->MOS6sideWallCapFactorGiven) { - czbdsw= here->MOS6tCjsw * here->MOS6drainPerimiter; - } else { - czbdsw=0; - } - arg = 1-model->MOS6fwdCapDepCoeff; - sarg = exp( (-model->MOS6bulkJctBotGradingCoeff) * log(arg) ); - sargsw = exp( (-model->MOS6bulkJctSideGradingCoeff) * log(arg) ); - here->MOS6Cbd = czbd; - here->MOS6Cbdsw = czbdsw; - here->MOS6f2d = czbd*(1-model->MOS6fwdCapDepCoeff* - (1+model->MOS6bulkJctBotGradingCoeff))* sarg/arg - + czbdsw*(1-model->MOS6fwdCapDepCoeff* - (1+model->MOS6bulkJctSideGradingCoeff))* - sargsw/arg; - here->MOS6f3d = czbd * model->MOS6bulkJctBotGradingCoeff * sarg/arg/ - here->MOS6tBulkPot - + czbdsw * model->MOS6bulkJctSideGradingCoeff * sargsw/arg / - here->MOS6tBulkPot; - here->MOS6f4d = czbd*here->MOS6tBulkPot*(1-arg*sarg)/ - (1-model->MOS6bulkJctBotGradingCoeff) - + czbdsw*here->MOS6tBulkPot*(1-arg*sargsw)/ - (1-model->MOS6bulkJctSideGradingCoeff) - -here->MOS6f3d/2* - (here->MOS6tDepCap*here->MOS6tDepCap) - -here->MOS6tDepCap * here->MOS6f2d; - if(model->MOS6capBSGiven) { - czbs=here->MOS6tCbs; - } else { - if(model->MOS6bulkCapFactorGiven) { - czbs=here->MOS6tCj*here->MOS6sourceArea; - } else { - czbs=0; - } - } - if(model->MOS6sideWallCapFactorGiven) { - czbssw = here->MOS6tCjsw * here->MOS6sourcePerimiter; - } else { - czbssw=0; - } - arg = 1-model->MOS6fwdCapDepCoeff; - sarg = exp( (-model->MOS6bulkJctBotGradingCoeff) * log(arg) ); - sargsw = exp( (-model->MOS6bulkJctSideGradingCoeff) * log(arg) ); - here->MOS6Cbs = czbs; - here->MOS6Cbssw = czbssw; - here->MOS6f2s = czbs*(1-model->MOS6fwdCapDepCoeff* - (1+model->MOS6bulkJctBotGradingCoeff))* sarg/arg - + czbssw*(1-model->MOS6fwdCapDepCoeff* - (1+model->MOS6bulkJctSideGradingCoeff))* - sargsw/arg; - here->MOS6f3s = czbs * model->MOS6bulkJctBotGradingCoeff * sarg/arg/ - here->MOS6tBulkPot - + czbssw * model->MOS6bulkJctSideGradingCoeff * sargsw/arg / - here->MOS6tBulkPot; - here->MOS6f4s = czbs*here->MOS6tBulkPot*(1-arg*sarg)/ - (1-model->MOS6bulkJctBotGradingCoeff) - + czbssw*here->MOS6tBulkPot*(1-arg*sargsw)/ - (1-model->MOS6bulkJctSideGradingCoeff) - -here->MOS6f3s/2* - (here->MOS6tDepCap*here->MOS6tDepCap) - -here->MOS6tDepCap * here->MOS6f2s; - - - if(model->MOS6drainResistanceGiven) { - if(model->MOS6drainResistance != 0) { - here->MOS6drainConductance = 1/model->MOS6drainResistance; - } else { - here->MOS6drainConductance = 0; - } - } else if (model->MOS6sheetResistanceGiven) { - if( (!here->MOS6drainSquaresGiven) || - ( here->MOS6drainSquares==0) ){ - here->MOS6drainSquares=1; - } - if(model->MOS6sheetResistance != 0) { - here->MOS6drainConductance = - 1/(model->MOS6sheetResistance*here->MOS6drainSquares); - } else { - here->MOS6drainConductance = 0; - } - } else { - here->MOS6drainConductance = 0; - } - if(model->MOS6sourceResistanceGiven) { - if(model->MOS6sourceResistance != 0) { - here->MOS6sourceConductance = 1/model->MOS6sourceResistance; - } else { - here->MOS6sourceConductance = 0; - } - } else if (model->MOS6sheetResistanceGiven) { - if( (!here->MOS6sourceSquaresGiven) || - ( here->MOS6sourceSquares==0) ) { - here->MOS6sourceSquares=1; - } - if(model->MOS6sheetResistance != 0) { - here->MOS6sourceConductance = - 1/(model->MOS6sheetResistance*here->MOS6sourceSquares); - } else { - here->MOS6sourceConductance = 0; - } - } else { - here->MOS6sourceConductance = 0; - } - } - } - return(OK); -} diff --git a/src/spicelib/devices/mos6/mos6trun.c b/src/spicelib/devices/mos6/mos6trun.c deleted file mode 100644 index b86c33cd4..000000000 --- a/src/spicelib/devices/mos6/mos6trun.c +++ /dev/null @@ -1,30 +0,0 @@ -/********** -Copyright 1990 Regents of the University of California. All rights reserved. -Author: 1989 Takayasu Sakurai -**********/ -/* - */ - -#include "ngspice/ngspice.h" -#include "ngspice/cktdefs.h" -#include "mos6defs.h" -#include "ngspice/sperror.h" -#include "ngspice/suffix.h" - - -int -MOS6trunc(GENmodel *inModel, CKTcircuit *ckt, double *timeStep) -{ - MOS6model *model = (MOS6model *)inModel; - MOS6instance *here; - - for( ; model != NULL; model = MOS6nextModel(model)) { - for(here=MOS6instances(model);here!=NULL;here = MOS6nextInstance(here)){ - - CKTterr(here->MOS6qgs,ckt,timeStep); - CKTterr(here->MOS6qgd,ckt,timeStep); - CKTterr(here->MOS6qgb,ckt,timeStep); - } - } - return(OK); -} diff --git a/src/spicelib/devices/mos9/Makefile.am b/src/spicelib/devices/mos9/Makefile.am deleted file mode 100644 index ef11ba738..000000000 --- a/src/spicelib/devices/mos9/Makefile.am +++ /dev/null @@ -1,38 +0,0 @@ -## Process this file with automake to produce Makefile.in - -noinst_LTLIBRARIES = libmos9.la - -libmos9_la_SOURCES = \ - mos9.c \ - mos9acld.c \ - mos9ask.c \ - mos9conv.c \ - mos9defs.h \ - mos9del.c \ - mos9dist.c \ - mos9dset.c \ - mos9ext.h \ - mos9ic.c \ - mos9init.c \ - mos9init.h \ - mos9itf.h \ - mos9load.c \ - mos9mask.c \ - mos9mpar.c \ - mos9noi.c \ - mos9par.c \ - mos9pzld.c \ - mos9sacl.c \ - mos9set.c \ - mos9sld.c \ - mos9sprt.c \ - mos9sset.c \ - mos9supd.c \ - mos9temp.c \ - mos9trun.c - - - -AM_CPPFLAGS = @AM_CPPFLAGS@ -I$(top_srcdir)/src/include -AM_CFLAGS = $(STATIC) -MAINTAINERCLEANFILES = Makefile.in diff --git a/src/spicelib/devices/mos9/mos9.c b/src/spicelib/devices/mos9/mos9.c deleted file mode 100644 index a8754ee99..000000000 --- a/src/spicelib/devices/mos9/mos9.c +++ /dev/null @@ -1,174 +0,0 @@ -/********** -Copyright 1990 Regents of the University of California. All rights reserved. -Author: 1987 Thomas L. Quarles -Modified: Alan Gillespie -**********/ - -#include "ngspice/ngspice.h" -#include "ngspice/devdefs.h" -#include "ngspice/ifsim.h" -#include "mos9defs.h" -#include "ngspice/suffix.h" - -IFparm MOS9pTable[] = { /* parameters */ - - IOPU("m", MOS9_M, IF_REAL , "Multiplier"), - IOPU("l", MOS9_L, IF_REAL , "Length"), - IOPU("w", MOS9_W, IF_REAL , "Width"), - IOPU("ad", MOS9_AD, IF_REAL , "Drain area"), - IOPU("as", MOS9_AS, IF_REAL , "Source area"), - IOPU("pd", MOS9_PD, IF_REAL , "Drain perimeter"), - IOPU("ps", MOS9_PS, IF_REAL , "Source perimeter"), - OP("id", MOS9_CD, IF_REAL, "Drain current"), - OPR("cd", MOS9_CD, IF_REAL, "Drain current"), - OPU("ibd", MOS9_CBD, IF_REAL, "B-D junction current"), - OPU("ibs", MOS9_CBS, IF_REAL, "B-S junction current"), - OPU("is", MOS9_CS, IF_REAL, "Source current"), - OPU("ig", MOS9_CG, IF_REAL, "Gate current"), - OPU("ib", MOS9_CB, IF_REAL, "Bulk current"), - OP("vgs", MOS9_VGS, IF_REAL, "Gate-Source voltage"), - OP("vds", MOS9_VDS, IF_REAL, "Drain-Source voltage"), - OP("vbs", MOS9_VBS, IF_REAL, "Bulk-Source voltage"), - OPU("vbd", MOS9_VBD, IF_REAL, "Bulk-Drain voltage"), - IOPU("nrd", MOS9_NRD, IF_REAL , "Drain squares"), - IOPU("nrs", MOS9_NRS, IF_REAL , "Source squares"), - IP("off", MOS9_OFF, IF_FLAG , "Device initially off"), - IOPAU("icvds", MOS9_IC_VDS, IF_REAL , "Initial D-S voltage"), - IOPAU("icvgs", MOS9_IC_VGS, IF_REAL , "Initial G-S voltage"), - IOPAU("icvbs", MOS9_IC_VBS, IF_REAL , "Initial B-S voltage"), - IOPU("ic", MOS9_IC, IF_REALVEC, "Vector of D-S, G-S, B-S voltages"), - IOPU("temp", MOS9_TEMP, IF_REAL , "Instance operating temperature"), - IOPU("dtemp", MOS9_DTEMP, IF_REAL , "Instance operating temperature difference"), - IP("sens_l", MOS9_L_SENS, IF_FLAG, "flag to request sensitivity WRT length"), - IP("sens_w", MOS9_W_SENS, IF_FLAG, "flag to request sensitivity WRT width"), - OPU("dnode", MOS9_DNODE, IF_INTEGER, "Number of drain node"), - OPU("gnode", MOS9_GNODE, IF_INTEGER, "Number of gate node"), - OPU("snode", MOS9_SNODE, IF_INTEGER, "Number of source node"), - OPU("bnode", MOS9_BNODE, IF_INTEGER, "Number of bulk node"), - OPU("dnodeprime", MOS9_DNODEPRIME,IF_INTEGER,"Number of internal drain node"), - OPU("snodeprime", MOS9_SNODEPRIME,IF_INTEGER,"Number of internal source node"), - OP("von", MOS9_VON, IF_REAL, "Turn-on voltage"), - OP("vdsat", MOS9_VDSAT, IF_REAL, "Saturation drain voltage"), - OPU("sourcevcrit", MOS9_SOURCEVCRIT, IF_REAL, "Critical source voltage"), - OPU("drainvcrit", MOS9_DRAINVCRIT, IF_REAL, "Critical drain voltage"), - OP("rs", MOS9_SOURCERESIST, IF_REAL, "Source resistance"), - OPU("sourceconductance", MOS9_SOURCECONDUCT, IF_REAL, "Source conductance"), - OP("rd", MOS9_DRAINRESIST, IF_REAL, "Drain resistance"), - OPU("drainconductance", MOS9_DRAINCONDUCT, IF_REAL, "Drain conductance"), - OP("gm", MOS9_GM, IF_REAL, "Transconductance"), - OP("gds", MOS9_GDS, IF_REAL, "Drain-Source conductance"), - OP("gmb", MOS9_GMBS, IF_REAL, "Bulk-Source transconductance"), - OPR("gmbs", MOS9_GMBS, IF_REAL, "Bulk-Source transconductance"), - OPU("gbd", MOS9_GBD, IF_REAL, "Bulk-Drain conductance"), - OPU("gbs", MOS9_GBS, IF_REAL, "Bulk-Source conductance"), - - OP("cbd", MOS9_CAPBD, IF_REAL, "Bulk-Drain capacitance"), - OP("cbs", MOS9_CAPBS, IF_REAL, "Bulk-Source capacitance"), - OP("cgs", MOS9_CAPGS, IF_REAL, "Gate-Source capacitance"), -/* OPR("cgs", MOS9_CGS, IF_REAL , "Gate-Source capacitance"),*/ - OP("cgd", MOS9_CAPGD, IF_REAL, "Gate-Drain capacitance"), -/* OPR("cgd", MOS9_CGD, IF_REAL , "Gate-Drain capacitance"),*/ - OP("cgb", MOS9_CAPGB, IF_REAL, "Gate-Bulk capacitance"), - - OPU("cqgs",MOS9_CQGS,IF_REAL,"Capacitance due to gate-source charge storage"), - OPU("cqgd",MOS9_CQGD, IF_REAL,"Capacitance due to gate-drain charge storage"), - OPU("cqgb",MOS9_CQGB, IF_REAL,"Capacitance due to gate-bulk charge storage"), - OPU("cqbd",MOS9_CQBD,IF_REAL,"Capacitance due to bulk-drain charge storage"), - OPU("cqbs",MOS9_CQBS,IF_REAL,"Capacitance due to bulk-source charge storage"), - - OPU("cbd0",MOS9_CAPZEROBIASBD,IF_REAL,"Zero-Bias B-D junction capacitance"), - OPU("cbdsw0",MOS9_CAPZEROBIASBDSW,IF_REAL, - "Zero-Bias B-D sidewall capacitance"), - OPU("cbs0",MOS9_CAPZEROBIASBS,IF_REAL,"Zero-Bias B-S junction capacitance"), - OPU("cbssw0",MOS9_CAPZEROBIASBSSW,IF_REAL, - "Zero-Bias B-S sidewall capacitance"), - OPU("qbs", MOS9_QBS, IF_REAL, "Bulk-Source charge storage"), - OPU("qgs", MOS9_QGS, IF_REAL, "Gate-Source charge storage"), - OPU("qgd", MOS9_QGD, IF_REAL, "Gate-Drain charge storage"), - OPU("qgb", MOS9_QGB, IF_REAL, "Gate-Bulk charge storage"), - OPU("qbd", MOS9_QBD, IF_REAL, "Bulk-Drain charge storage"), - OPU("p", MOS9_POWER, IF_REAL, "Instantaneous power"), - OPU("sens_l_dc", MOS9_L_SENS_DC, IF_REAL, "dc sensitivity wrt length"), - OPU("sens_l_real",MOS9_L_SENS_REAL, IF_REAL, - "real part of ac sensitivity wrt length"), - OPU("sens_l_imag",MOS9_L_SENS_IMAG, IF_REAL, - "imag part of ac sensitivity wrt length"), - OPU("sens_l_cplx",MOS9_L_SENS_CPLX, IF_COMPLEX, "ac sensitivity wrt length"), - OPU("sens_l_mag", MOS9_L_SENS_MAG, IF_REAL, - "sensitivity wrt l of ac magnitude"), - OPU("sens_l_ph", MOS9_L_SENS_PH, IF_REAL, "sensitivity wrt l of ac phase"), - OPU("sens_w_dc", MOS9_W_SENS_DC, IF_REAL, "dc sensitivity wrt width"), - OPU("sens_w_real",MOS9_W_SENS_REAL, IF_REAL, - "real part of ac sensitivity wrt width"), - OPU("sens_w_imag",MOS9_W_SENS_IMAG, IF_REAL, - "imag part of ac sensitivity wrt width"), - OPU("sens_w_mag", MOS9_W_SENS_MAG, IF_REAL, - "sensitivity wrt w of ac magnitude"), - OPU("sens_w_ph", MOS9_W_SENS_PH, IF_REAL, "sensitivity wrt w of ac phase"), - OPU("sens_w_cplx",MOS9_W_SENS_CPLX, IF_COMPLEX, "ac sensitivity wrt width") -}; - -IFparm MOS9mPTable[] = { /* model parameters */ - OP("type", MOS9_MOD_TYPE, IF_STRING ,"N-channel or P-channel MOS"), - IP("nmos", MOS9_MOD_NMOS, IF_FLAG ,"N type MOSfet model"), - IP("pmos", MOS9_MOD_PMOS, IF_FLAG ,"P type MOSfet model"), - IOP("vto", MOS9_MOD_VTO, IF_REAL ,"Threshold voltage"), - IOPR("vt0", MOS9_MOD_VTO, IF_REAL ,"Threshold voltage"), - IOP("kp", MOS9_MOD_KP, IF_REAL ,"Transconductance parameter"), - IOP("gamma", MOS9_MOD_GAMMA, IF_REAL ,"Bulk threshold parameter"), - IOP("phi", MOS9_MOD_PHI, IF_REAL ,"Surface potential"), - IOP("rd", MOS9_MOD_RD, IF_REAL ,"Drain ohmic resistance"), - IOP("rs", MOS9_MOD_RS, IF_REAL ,"Source ohmic resistance"), - IOPA("cbd", MOS9_MOD_CBD, IF_REAL ,"B-D junction capacitance"), - IOPA("cbs", MOS9_MOD_CBS, IF_REAL ,"B-S junction capacitance"), - IOP("is", MOS9_MOD_IS, IF_REAL ,"Bulk junction sat. current"), - IOP("pb", MOS9_MOD_PB, IF_REAL ,"Bulk junction potential"), - IOPA("cgso", MOS9_MOD_CGSO, IF_REAL ,"Gate-source overlap cap."), - IOPA("cgdo", MOS9_MOD_CGDO, IF_REAL ,"Gate-drain overlap cap."), - IOPA("cgbo", MOS9_MOD_CGBO, IF_REAL ,"Gate-bulk overlap cap."), - IOP("rsh", MOS9_MOD_RSH, IF_REAL ,"Sheet resistance"), - IOPA("cj", MOS9_MOD_CJ, IF_REAL ,"Bottom junction cap per area"), - IOP("mj", MOS9_MOD_MJ, IF_REAL ,"Bottom grading coefficient"), - IOPA("cjsw", MOS9_MOD_CJSW, IF_REAL ,"Side junction cap per area"), - IOP("mjsw", MOS9_MOD_MJSW, IF_REAL ,"Side grading coefficient"), - IOPU("js", MOS9_MOD_JS, IF_REAL ,"Bulk jct. sat. current density"), - IOP("tox", MOS9_MOD_TOX, IF_REAL ,"Oxide thickness"), - IOP("ld", MOS9_MOD_LD, IF_REAL ,"Lateral diffusion"), - IOP("xl", MOS9_MOD_XL, IF_REAL ,"Length mask adjustment"), - IOP("wd", MOS9_MOD_WD, IF_REAL ,"Width Narrowing (Diffusion)"), - IOP("xw", MOS9_MOD_XW, IF_REAL ,"Width mask adjustment"), - IOPU("delvto", MOS9_MOD_DELVTO, IF_REAL ,"Threshold voltage Adjust"), - IOPUR("delvt0", MOS9_MOD_DELVTO, IF_REAL ,"Threshold voltage Adjust"), - IOP("u0", MOS9_MOD_U0, IF_REAL ,"Surface mobility"), - IOPR("uo", MOS9_MOD_U0, IF_REAL ,"Surface mobility"), - IOP("fc", MOS9_MOD_FC, IF_REAL ,"Forward bias jct. fit parm."), - IOP("nsub", MOS9_MOD_NSUB, IF_REAL ,"Substrate doping"), - IOP("tpg", MOS9_MOD_TPG, IF_INTEGER,"Gate type"), - IOP("nss", MOS9_MOD_NSS, IF_REAL ,"Surface state density"), - IOP("vmax", MOS9_MOD_VMAX, IF_REAL ,"Maximum carrier drift velocity"), - IOP("xj", MOS9_MOD_XJ, IF_REAL ,"Junction depth"), - IOP("nfs", MOS9_MOD_NFS, IF_REAL ,"Fast surface state density"), - IOP("xd", MOS9_MOD_XD, IF_REAL ,"Depletion layer width"), - IOP("alpha", MOS9_MOD_ALPHA, IF_REAL ,"Alpha"), - IOP("eta", MOS9_MOD_ETA, IF_REAL ,"Vds dependence of threshold voltage"), - IOP("delta", MOS9_MOD_DELTA, IF_REAL ,"Width effect on threshold"), - IOP("input_delta", MOS9_DELTA, IF_REAL ,""), - IOP("theta", MOS9_MOD_THETA, IF_REAL ,"Vgs dependence on mobility"), - IOP("kappa", MOS9_MOD_KAPPA, IF_REAL ,"Kappa"), - IOPU("tnom", MOS9_MOD_TNOM, IF_REAL ,"Parameter measurement temperature"), - IOP("kf", MOS9_MOD_KF, IF_REAL ,"Flicker noise coefficient"), - IOP("af", MOS9_MOD_AF, IF_REAL ,"Flicker noise exponent") -}; - -char *MOS9names[] = { - "Drain", - "Gate", - "Source", - "Bulk" -}; - -int MOS9nSize = NUMELEMS(MOS9names); -int MOS9pTSize = NUMELEMS(MOS9pTable); -int MOS9mPTSize = NUMELEMS(MOS9mPTable); -int MOS9iSize = sizeof(MOS9instance); -int MOS9mSize = sizeof(MOS9model); diff --git a/src/spicelib/devices/mos9/mos9acld.c b/src/spicelib/devices/mos9/mos9acld.c deleted file mode 100644 index ceefd8c32..000000000 --- a/src/spicelib/devices/mos9/mos9acld.c +++ /dev/null @@ -1,125 +0,0 @@ -/********** -Copyright 1990 Regents of the University of California. All rights reserved. -Author: 1985 Thomas L. Quarles -Modified: Alan Gillespie -**********/ -/* - */ - -#include "ngspice/ngspice.h" -#include "ngspice/cktdefs.h" -#include "mos9defs.h" -#include "ngspice/sperror.h" -#include "ngspice/suffix.h" - - -int -MOS9acLoad(GENmodel *inModel, CKTcircuit *ckt) -{ - MOS9model *model = (MOS9model *)inModel; - MOS9instance *here; - int xnrm; - int xrev; - double EffectiveLength; - double EffectiveWidth; - double xgs; - double xgd; - double xgb; - double xbd; - double xbs; - double capgs; - double capgd; - double capgb; - double GateBulkOverlapCap; - double GateDrainOverlapCap; - double GateSourceOverlapCap; - - for( ; model != NULL; model = MOS9nextModel(model)) { - for(here = MOS9instances(model); here!= NULL; - here = MOS9nextInstance(here)) { - - if (here->MOS9mode < 0) { - xnrm=0; - xrev=1; - } else { - xnrm=1; - xrev=0; - } - /* - * charge oriented model parameters - */ - EffectiveWidth=here->MOS9w-2*model->MOS9widthNarrow+ - model->MOS9widthAdjust; - EffectiveLength=here->MOS9l - 2*model->MOS9latDiff+ - model->MOS9lengthAdjust; - GateSourceOverlapCap = model->MOS9gateSourceOverlapCapFactor * - here->MOS9m * EffectiveWidth; - GateDrainOverlapCap = model->MOS9gateDrainOverlapCapFactor * - here->MOS9m * EffectiveWidth; - GateBulkOverlapCap = model->MOS9gateBulkOverlapCapFactor * - here->MOS9m * EffectiveLength; - - - /* - * meyer"s model parameters - */ - capgs = ( *(ckt->CKTstate0+here->MOS9capgs)+ - *(ckt->CKTstate0+here->MOS9capgs) + - GateSourceOverlapCap ); - capgd = ( *(ckt->CKTstate0+here->MOS9capgd)+ - *(ckt->CKTstate0+here->MOS9capgd) + - GateDrainOverlapCap ); - capgb = ( *(ckt->CKTstate0+here->MOS9capgb)+ - *(ckt->CKTstate0+here->MOS9capgb) + - GateBulkOverlapCap ); - xgs = capgs * ckt->CKTomega; - xgd = capgd * ckt->CKTomega; - xgb = capgb * ckt->CKTomega; - xbd = here->MOS9capbd * ckt->CKTomega; - xbs = here->MOS9capbs * ckt->CKTomega; - - /* - * load matrix - */ - - *(here->MOS9GgPtr +1) += xgd+xgs+xgb; - *(here->MOS9BbPtr +1) += xgb+xbd+xbs; - *(here->MOS9DPdpPtr +1) += xgd+xbd; - *(here->MOS9SPspPtr +1) += xgs+xbs; - *(here->MOS9GbPtr +1) -= xgb; - *(here->MOS9GdpPtr +1) -= xgd; - *(here->MOS9GspPtr +1) -= xgs; - *(here->MOS9BgPtr +1) -= xgb; - *(here->MOS9BdpPtr +1) -= xbd; - *(here->MOS9BspPtr +1) -= xbs; - *(here->MOS9DPgPtr +1) -= xgd; - *(here->MOS9DPbPtr +1) -= xbd; - *(here->MOS9SPgPtr +1) -= xgs; - *(here->MOS9SPbPtr +1) -= xbs; - *(here->MOS9DdPtr) += here->MOS9drainConductance; - *(here->MOS9SsPtr) += here->MOS9sourceConductance; - *(here->MOS9BbPtr) += here->MOS9gbd+here->MOS9gbs; - *(here->MOS9DPdpPtr) += here->MOS9drainConductance+ - here->MOS9gds+here->MOS9gbd+ - xrev*(here->MOS9gm+here->MOS9gmbs); - *(here->MOS9SPspPtr) += here->MOS9sourceConductance+ - here->MOS9gds+here->MOS9gbs+ - xnrm*(here->MOS9gm+here->MOS9gmbs); - *(here->MOS9DdpPtr) -= here->MOS9drainConductance; - *(here->MOS9SspPtr) -= here->MOS9sourceConductance; - *(here->MOS9BdpPtr) -= here->MOS9gbd; - *(here->MOS9BspPtr) -= here->MOS9gbs; - *(here->MOS9DPdPtr) -= here->MOS9drainConductance; - *(here->MOS9DPgPtr) += (xnrm-xrev)*here->MOS9gm; - *(here->MOS9DPbPtr) += -here->MOS9gbd+(xnrm-xrev)*here->MOS9gmbs; - *(here->MOS9DPspPtr) -= here->MOS9gds+ - xnrm*(here->MOS9gm+here->MOS9gmbs); - *(here->MOS9SPgPtr) -= (xnrm-xrev)*here->MOS9gm; - *(here->MOS9SPsPtr) -= here->MOS9sourceConductance; - *(here->MOS9SPbPtr) -= here->MOS9gbs+(xnrm-xrev)*here->MOS9gmbs; - *(here->MOS9SPdpPtr) -= here->MOS9gds+ - xrev*(here->MOS9gm+here->MOS9gmbs); - } - } - return(OK); -} diff --git a/src/spicelib/devices/mos9/mos9ask.c b/src/spicelib/devices/mos9/mos9ask.c deleted file mode 100644 index 56533509a..000000000 --- a/src/spicelib/devices/mos9/mos9ask.c +++ /dev/null @@ -1,439 +0,0 @@ -/********** -Copyright 1990 Regents of the University of California. All rights reserved. -Author: 1987 Mathew Lew and Thomas L. Quarles -Modified: Alan Gillespie -**********/ - -#include "ngspice/ngspice.h" -#include "ngspice/const.h" -#include "ngspice/ifsim.h" -#include "ngspice/cktdefs.h" -#include "ngspice/devdefs.h" -#include "mos9defs.h" -#include "ngspice/sperror.h" -#include "ngspice/suffix.h" - -/*ARGSUSED*/ -int -MOS9ask(CKTcircuit *ckt, GENinstance *inst, int which, - IFvalue *value, IFvalue *select) -{ - MOS9instance *here = (MOS9instance *)inst; - double vr; - double vi; - double sr; - double si; - double vm; - static char *msg = "Current and power not available for ac analysis"; - switch(which) { - case MOS9_TEMP: - value->rValue = here->MOS9temp-CONSTCtoK; - return(OK); - case MOS9_CGS: - value->rValue = 2* *(ckt->CKTstate0 + here->MOS9capgs); - return(OK); - case MOS9_CGD: - value->rValue = 2* *(ckt->CKTstate0 + here->MOS9capgd); - return(OK); - case MOS9_M: - value->rValue = here->MOS9m; - return(OK); - case MOS9_L: - value->rValue = here->MOS9l; - return(OK); - case MOS9_W: - value->rValue = here->MOS9w; - return(OK); - case MOS9_AS: - value->rValue = here->MOS9sourceArea; - return(OK); - case MOS9_AD: - value->rValue = here->MOS9drainArea; - return(OK); - case MOS9_PS: - value->rValue = here->MOS9sourcePerimiter; - return(OK); - case MOS9_PD: - value->rValue = here->MOS9drainPerimiter; - return(OK); - case MOS9_NRS: - value->rValue = here->MOS9sourceSquares; - return(OK); - case MOS9_NRD: - value->rValue = here->MOS9drainSquares; - return(OK); - case MOS9_OFF: - value->rValue = here->MOS9off; - return(OK); - case MOS9_IC_VBS: - value->rValue = here->MOS9icVBS; - return(OK); - case MOS9_IC_VDS: - value->rValue = here->MOS9icVDS; - return(OK); - case MOS9_IC_VGS: - value->rValue = here->MOS9icVGS; - return(OK); - case MOS9_DNODE: - value->iValue = here->MOS9dNode; - return(OK); - case MOS9_GNODE: - value->iValue = here->MOS9gNode; - return(OK); - case MOS9_SNODE: - value->iValue = here->MOS9sNode; - return(OK); - case MOS9_BNODE: - value->iValue = here->MOS9bNode; - return(OK); - case MOS9_DNODEPRIME: - value->iValue = here->MOS9dNodePrime; - return(OK); - case MOS9_SNODEPRIME: - value->iValue = here->MOS9sNodePrime; - return(OK); - case MOS9_SOURCECONDUCT: - value->rValue = here->MOS9sourceConductance; - return(OK); - case MOS9_DRAINCONDUCT: - value->rValue = here->MOS9drainConductance; - return(OK); - case MOS9_SOURCERESIST: - if (here->MOS9sNodePrime != here->MOS9sNode) - value->rValue = 1.0 / here->MOS9sourceConductance; - else - value->rValue = 0.0; - return(OK); - case MOS9_DRAINRESIST: - if (here->MOS9dNodePrime != here->MOS9dNode) - value->rValue = 1.0 / here->MOS9drainConductance; - else - value->rValue = 0.0; - return(OK); - case MOS9_VON: - value->rValue = here->MOS9von; - return(OK); - case MOS9_VDSAT: - value->rValue = here->MOS9vdsat; - return(OK); - case MOS9_SOURCEVCRIT: - value->rValue = here->MOS9sourceVcrit; - return(OK); - case MOS9_DRAINVCRIT: - value->rValue = here->MOS9drainVcrit; - return(OK); - case MOS9_CD: - value->rValue = here->MOS9cd; - return(OK); - case MOS9_CBS: - value->rValue = here->MOS9cbs; - return(OK); - case MOS9_CBD: - value->rValue = here->MOS9cbd; - return(OK); - case MOS9_GMBS: - value->rValue = here->MOS9gmbs; - return(OK); - case MOS9_GM: - value->rValue = here->MOS9gm; - return(OK); - case MOS9_GDS: - value->rValue = here->MOS9gds; - return(OK); - case MOS9_GBD: - value->rValue = here->MOS9gbd; - return(OK); - case MOS9_GBS: - value->rValue = here->MOS9gbs; - return(OK); - case MOS9_CAPBD: - value->rValue = here->MOS9capbd; - return(OK); - case MOS9_CAPBS: - value->rValue = here->MOS9capbs; - return(OK); - case MOS9_CAPZEROBIASBD: - value->rValue = here->MOS9Cbd; - return(OK); - case MOS9_CAPZEROBIASBDSW: - value->rValue = here->MOS9Cbdsw; - return(OK); - case MOS9_CAPZEROBIASBS: - value->rValue = here->MOS9Cbs; - return(OK); - case MOS9_CAPZEROBIASBSSW: - value->rValue = here->MOS9Cbssw; - return(OK); - case MOS9_VBD: - value->rValue = *(ckt->CKTstate0 + here->MOS9vbd); - return(OK); - case MOS9_VBS: - value->rValue = *(ckt->CKTstate0 + here->MOS9vbs); - return(OK); - case MOS9_VGS: - value->rValue = *(ckt->CKTstate0 + here->MOS9vgs); - return(OK); - case MOS9_VDS: - value->rValue = *(ckt->CKTstate0 + here->MOS9vds); - return(OK); - case MOS9_CAPGS: - value->rValue = 2* *(ckt->CKTstate0 + here->MOS9capgs); -/* add overlap capacitance */ - value->rValue += (MOS9modPtr(here)->MOS9gateSourceOverlapCapFactor) - * here->MOS9m - * (here->MOS9w - +MOS9modPtr(here)->MOS9widthAdjust - -2*(MOS9modPtr(here)->MOS9widthNarrow)); - return(OK); - case MOS9_QGS: - value->rValue = *(ckt->CKTstate0 + here->MOS9qgs); - return(OK); - case MOS9_CQGS: - value->rValue = *(ckt->CKTstate0 + here->MOS9cqgs); - return(OK); - case MOS9_CAPGD: - value->rValue = 2* *(ckt->CKTstate0 + here->MOS9capgd); -/* add overlap capacitance */ - value->rValue += (MOS9modPtr(here)->MOS9gateDrainOverlapCapFactor) - * here->MOS9m - * (here->MOS9w - +MOS9modPtr(here)->MOS9widthAdjust - -2*(MOS9modPtr(here)->MOS9widthNarrow)); - return(OK); - case MOS9_QGD: - value->rValue = *(ckt->CKTstate0 + here->MOS9qgd); - return(OK); - case MOS9_CQGD: - value->rValue = *(ckt->CKTstate0 + here->MOS9cqgd); - return(OK); - case MOS9_CAPGB: - value->rValue = 2* *(ckt->CKTstate0 + here->MOS9capgb); -/* add overlap capacitance */ - value->rValue += (MOS9modPtr(here)->MOS9gateBulkOverlapCapFactor) - * here->MOS9m - * (here->MOS9l - +MOS9modPtr(here)->MOS9lengthAdjust - -2*(MOS9modPtr(here)->MOS9latDiff)); - return(OK); - case MOS9_QGB: - value->rValue = *(ckt->CKTstate0 + here->MOS9qgb); - return(OK); - case MOS9_CQGB: - value->rValue = *(ckt->CKTstate0 + here->MOS9cqgb); - return(OK); - case MOS9_QBD: - value->rValue = *(ckt->CKTstate0 + here->MOS9qbd); - return(OK); - case MOS9_CQBD: - value->rValue = *(ckt->CKTstate0 + here->MOS9cqbd); - return(OK); - case MOS9_QBS: - value->rValue = *(ckt->CKTstate0 + here->MOS9qbs); - return(OK); - case MOS9_CQBS: - value->rValue = *(ckt->CKTstate0 + here->MOS9cqbs); - return(OK); - case MOS9_L_SENS_DC: - if(ckt->CKTsenInfo){ - value->rValue = *(ckt->CKTsenInfo->SEN_Sap[select->iValue + 1]+ - here->MOS9senParmNo); - } - return(OK); - case MOS9_L_SENS_REAL: - if(ckt->CKTsenInfo){ - value->rValue = *(ckt->CKTsenInfo->SEN_RHS[select->iValue + 1]+ - here->MOS9senParmNo); - } - return(OK); - case MOS9_L_SENS_IMAG: - if(ckt->CKTsenInfo){ - value->rValue = *(ckt->CKTsenInfo->SEN_iRHS[select->iValue + 1]+ - here->MOS9senParmNo); - } - return(OK); - case MOS9_L_SENS_MAG: - if(ckt->CKTsenInfo){ - vr = *(ckt->CKTrhsOld + select->iValue + 1); - vi = *(ckt->CKTirhsOld + select->iValue + 1); - vm = sqrt(vr*vr + vi*vi); - if(vm == 0){ - value->rValue = 0; - return(OK); - } - sr = *(ckt->CKTsenInfo->SEN_RHS[select->iValue + 1]+ - here->MOS9senParmNo); - si = *(ckt->CKTsenInfo->SEN_iRHS[select->iValue + 1]+ - here->MOS9senParmNo); - value->rValue = (vr * sr + vi * si)/vm; - } - return(OK); - case MOS9_L_SENS_PH: - if(ckt->CKTsenInfo){ - vr = *(ckt->CKTrhsOld + select->iValue + 1); - vi = *(ckt->CKTirhsOld + select->iValue + 1); - vm = vr*vr + vi*vi; - if(vm == 0){ - value->rValue = 0; - return(OK); - } - sr = *(ckt->CKTsenInfo->SEN_RHS[select->iValue + 1]+ - here->MOS9senParmNo); - si = *(ckt->CKTsenInfo->SEN_iRHS[select->iValue + 1]+ - here->MOS9senParmNo); - value->rValue = (vr * si - vi * sr)/vm; - } - return(OK); - case MOS9_L_SENS_CPLX: - if(ckt->CKTsenInfo){ - value->cValue.real= - *(ckt->CKTsenInfo->SEN_RHS[select->iValue + 1]+ - here->MOS9senParmNo); - value->cValue.imag= - *(ckt->CKTsenInfo->SEN_iRHS[select->iValue + 1]+ - here->MOS9senParmNo); - } - return(OK); - case MOS9_W_SENS_DC: - if(ckt->CKTsenInfo){ - value->rValue = *(ckt->CKTsenInfo->SEN_Sap[select->iValue + 1]+ - here->MOS9senParmNo + here->MOS9sens_l); - } - return(OK); - case MOS9_W_SENS_REAL: - if(ckt->CKTsenInfo){ - value->rValue = *(ckt->CKTsenInfo->SEN_RHS[select->iValue + 1]+ - here->MOS9senParmNo + here->MOS9sens_l); - } - return(OK); - case MOS9_W_SENS_IMAG: - if(ckt->CKTsenInfo){ - value->rValue = *(ckt->CKTsenInfo->SEN_iRHS[select->iValue + 1]+ - here->MOS9senParmNo + here->MOS9sens_l); - } - return(OK); - case MOS9_W_SENS_MAG: - if(ckt->CKTsenInfo){ - vr = *(ckt->CKTrhsOld + select->iValue + 1); - vi = *(ckt->CKTirhsOld + select->iValue + 1); - vm = sqrt(vr*vr + vi*vi); - if(vm == 0){ - value->rValue = 0; - return(OK); - } - sr = *(ckt->CKTsenInfo->SEN_RHS[select->iValue + 1]+ - here->MOS9senParmNo + here->MOS9sens_l); - si = *(ckt->CKTsenInfo->SEN_iRHS[select->iValue + 1]+ - here->MOS9senParmNo + here->MOS9sens_l); - value->rValue = (vr * sr + vi * si)/vm; - } - return(OK); - case MOS9_W_SENS_PH: - if(ckt->CKTsenInfo){ - vr = *(ckt->CKTrhsOld + select->iValue + 1); - vi = *(ckt->CKTirhsOld + select->iValue + 1); - vm = vr*vr + vi*vi; - if(vm == 0){ - value->rValue = 0; - return(OK); - } - sr = *(ckt->CKTsenInfo->SEN_RHS[select->iValue + 1]+ - here->MOS9senParmNo + here->MOS9sens_l); - si = *(ckt->CKTsenInfo->SEN_iRHS[select->iValue + 1]+ - here->MOS9senParmNo + here->MOS9sens_l); - value->rValue = (vr * si - vi * sr)/vm; - } - return(OK); - case MOS9_W_SENS_CPLX: - if(ckt->CKTsenInfo){ - value->cValue.real= - *(ckt->CKTsenInfo->SEN_RHS[select->iValue + 1]+ - here->MOS9senParmNo + here->MOS9sens_l); - value->cValue.imag= - *(ckt->CKTsenInfo->SEN_iRHS[select->iValue + 1]+ - here->MOS9senParmNo + here->MOS9sens_l); - } - return(OK); - case MOS9_CB : - if (ckt->CKTcurrentAnalysis & DOING_AC) { - errMsg = TMALLOC(char, strlen(msg) + 1); - errRtn = "MOS9ask.c"; - strcpy(errMsg,msg); - return(E_ASKCURRENT); - } else { - value->rValue = here->MOS9cbd + here->MOS9cbs - *(ckt->CKTstate0 - + here->MOS9cqgb); - } - return(OK); - case MOS9_CG : - if (ckt->CKTcurrentAnalysis & DOING_AC) { - errMsg = TMALLOC(char, strlen(msg) + 1); - errRtn = "MOS9ask.c"; - strcpy(errMsg,msg); - return(E_ASKCURRENT); - } else if (ckt->CKTcurrentAnalysis & (DOING_DCOP | DOING_TRCV)) { - value->rValue = 0; - } else if ((ckt->CKTcurrentAnalysis & DOING_TRAN) && - (ckt->CKTmode & MODETRANOP)) { - value->rValue = 0; - } else { - value->rValue = *(ckt->CKTstate0 + here->MOS9cqgb) + - *(ckt->CKTstate0 + here->MOS9cqgd) + *(ckt->CKTstate0 + - here->MOS9cqgs); - } - return(OK); - case MOS9_CS : - if (ckt->CKTcurrentAnalysis & DOING_AC) { - errMsg = TMALLOC(char, strlen(msg) + 1); - errRtn = "MOS9ask.c"; - strcpy(errMsg,msg); - return(E_ASKCURRENT); - } else { - value->rValue = -here->MOS9cd; - value->rValue -= here->MOS9cbd + here->MOS9cbs - - *(ckt->CKTstate0 + here->MOS9cqgb); - if ((ckt->CKTcurrentAnalysis & DOING_TRAN) && - !(ckt->CKTmode & MODETRANOP)) { - value->rValue -= *(ckt->CKTstate0 + here->MOS9cqgb) + - *(ckt->CKTstate0 + here->MOS9cqgd) + - *(ckt->CKTstate0 + here->MOS9cqgs); - } - } - return(OK); - case MOS9_POWER : - if (ckt->CKTcurrentAnalysis & DOING_AC) { - errMsg = TMALLOC(char, strlen(msg) + 1); - errRtn = "MOS9ask.c"; - strcpy(errMsg,msg); - return(E_ASKPOWER); - } else { - double temp; - - value->rValue = here->MOS9cd * - *(ckt->CKTrhsOld + here->MOS9dNode); - value->rValue += (here->MOS9cbd + here->MOS9cbs - - *(ckt->CKTstate0 + here->MOS9cqgb)) * - *(ckt->CKTrhsOld + here->MOS9bNode); - if ((ckt->CKTcurrentAnalysis & DOING_TRAN) && - !(ckt->CKTmode & MODETRANOP)) { - value->rValue += (*(ckt->CKTstate0 + here->MOS9cqgb) + - *(ckt->CKTstate0 + here->MOS9cqgd) + - *(ckt->CKTstate0 + here->MOS9cqgs)) * - *(ckt->CKTrhsOld + here->MOS9gNode); - } - temp = -here->MOS9cd; - temp -= here->MOS9cbd + here->MOS9cbs ; - if ((ckt->CKTcurrentAnalysis & DOING_TRAN) && - !(ckt->CKTmode & MODETRANOP)) { - temp -= *(ckt->CKTstate0 + here->MOS9cqgb) + - *(ckt->CKTstate0 + here->MOS9cqgd) + - *(ckt->CKTstate0 + here->MOS9cqgs); - } - value->rValue += temp * *(ckt->CKTrhsOld + here->MOS9sNode); - } - return(OK); - default: - return(E_BADPARM); - } - /* NOTREACHED */ -} - diff --git a/src/spicelib/devices/mos9/mos9conv.c b/src/spicelib/devices/mos9/mos9conv.c deleted file mode 100644 index 0667db025..000000000 --- a/src/spicelib/devices/mos9/mos9conv.c +++ /dev/null @@ -1,101 +0,0 @@ -/********** -Copyright 1990 Regents of the University of California. All rights reserved. -Author: 1985 Thomas L. Quarles -Modified: Alan Gillespie -**********/ - -#include "ngspice/ngspice.h" -#include "ngspice/cktdefs.h" -#include "mos9defs.h" -#include "ngspice/sperror.h" - -#include "ngspice/suffix.h" - -int -MOS9convTest(GENmodel *inModel, CKTcircuit *ckt) -{ - MOS9model *model = (MOS9model *)inModel; - MOS9instance *here; - double delvbs; - double delvbd; - double delvgs; - double delvds; - double delvgd; - double cbhat; - double cdhat; - double vbs; - double vbd; - double vgs; - double vds; - double vgd; - double vgdo; - double tol; - - for( ; model != NULL; model = MOS9nextModel(model)) { - for(here = MOS9instances(model); here!= NULL; - here = MOS9nextInstance(here)) { - - vbs = model->MOS9type * ( - *(ckt->CKTrhs+here->MOS9bNode) - - *(ckt->CKTrhs+here->MOS9sNodePrime)); - vgs = model->MOS9type * ( - *(ckt->CKTrhs+here->MOS9gNode) - - *(ckt->CKTrhs+here->MOS9sNodePrime)); - vds = model->MOS9type * ( - *(ckt->CKTrhs+here->MOS9dNodePrime) - - *(ckt->CKTrhs+here->MOS9sNodePrime)); - vbd=vbs-vds; - vgd=vgs-vds; - vgdo = *(ckt->CKTstate0 + here->MOS9vgs) - - *(ckt->CKTstate0 + here->MOS9vds); - delvbs = vbs - *(ckt->CKTstate0 + here->MOS9vbs); - delvbd = vbd - *(ckt->CKTstate0 + here->MOS9vbd); - delvgs = vgs - *(ckt->CKTstate0 + here->MOS9vgs); - delvds = vds - *(ckt->CKTstate0 + here->MOS9vds); - delvgd = vgd-vgdo; - - /* these are needed for convergence testing */ - - if (here->MOS9mode >= 0) { - cdhat= - here->MOS9cd- - here->MOS9gbd * delvbd + - here->MOS9gmbs * delvbs + - here->MOS9gm * delvgs + - here->MOS9gds * delvds ; - } else { - cdhat= - here->MOS9cd - - ( here->MOS9gbd - - here->MOS9gmbs) * delvbd - - here->MOS9gm * delvgd + - here->MOS9gds * delvds ; - } - cbhat= - here->MOS9cbs + - here->MOS9cbd + - here->MOS9gbd * delvbd + - here->MOS9gbs * delvbs ; - /* - * check convergence - */ - tol=ckt->CKTreltol*MAX(fabs(cdhat),fabs(here->MOS9cd))+ - ckt->CKTabstol; - if (fabs(cdhat-here->MOS9cd) >= tol) { - ckt->CKTnoncon++; - ckt->CKTtroubleElt = (GENinstance *) here; - return(OK); /* no reason to continue, we haven't converged */ - } else { - tol=ckt->CKTreltol* - MAX(fabs(cbhat),fabs(here->MOS9cbs+here->MOS9cbd)) - + ckt->CKTabstol; - if (fabs(cbhat-(here->MOS9cbs+here->MOS9cbd)) > tol) { - ckt->CKTnoncon++; - ckt->CKTtroubleElt = (GENinstance *) here; - return(OK); /* no reason to continue, we haven't converged*/ - } - } - } - } - return(OK); -} diff --git a/src/spicelib/devices/mos9/mos9defs.h b/src/spicelib/devices/mos9/mos9defs.h deleted file mode 100644 index 6f39b5019..000000000 --- a/src/spicelib/devices/mos9/mos9defs.h +++ /dev/null @@ -1,575 +0,0 @@ -/********** -Copyright 1990 Regents of the University of California. All rights reserved. -Author: 1985 Thomas L. Quarles -Modified: Alan Gillespie -**********/ - -#ifndef MOS9 -#define MOS9 - -#include "ngspice/ifsim.h" -#include "ngspice/cktdefs.h" -#include "ngspice/gendefs.h" -#include "ngspice/complex.h" -#include "ngspice/noisedef.h" - - /* declarations for level 9 MOSFETs */ - -/* indices to the array of MOSFET(9) noise sources */ - -enum { - MOS9RDNOIZ = 0, - MOS9RSNOIZ, - MOS9IDNOIZ, - MOS9FLNOIZ, - MOS9TOTNOIZ, - /* finally, the number of noise sources */ - MOS9NSRCS -}; - -/* information needed for each instance */ - -typedef struct sMOS9instance { - - struct GENinstance gen; - -#define MOS9modPtr(inst) ((struct sMOS9model *)((inst)->gen.GENmodPtr)) -#define MOS9nextInstance(inst) ((struct sMOS9instance *)((inst)->gen.GENnextInstance)) -#define MOS9name gen.GENname -#define MOS9states gen.GENstate - - const int MOS9dNode; /* number of the gate node of the mosfet */ - const int MOS9gNode; /* number of the gate node of the mosfet */ - const int MOS9sNode; /* number of the source node of the mosfet */ - const int MOS9bNode; /* number of the bulk node of the mosfet */ - int MOS9dNodePrime; /* number of the internal drain node of the mosfet */ - int MOS9sNodePrime; /* number of the internal source node of the mosfet */ - - double MOS9m; /* parallel device multiplier */ - double MOS9l; /* the length of the channel region */ - double MOS9w; /* the width of the channel region */ - double MOS9drainArea; /* the area of the drain diffusion */ - double MOS9sourceArea; /* the area of the source diffusion */ - double MOS9drainSquares; /* the length of the drain in squares */ - double MOS9sourceSquares; /* the length of the source in squares */ - double MOS9drainPerimiter; - double MOS9sourcePerimiter; - double MOS9sourceConductance; /*conductance of source(or 0):set in setup*/ - double MOS9drainConductance; /*conductance of drain(or 0):set in setup*/ - double MOS9temp; /* operating temperature of this instance */ - double MOS9dtemp; /* instance temperature difference */ - - double MOS9tTransconductance; /* temperature corrected transconductance*/ - double MOS9tSurfMob; /* temperature corrected surface mobility */ - double MOS9tPhi; /* temperature corrected Phi */ - double MOS9tVto; /* temperature corrected Vto */ - double MOS9tSatCur; /* temperature corrected saturation Cur. */ - double MOS9tSatCurDens; /* temperature corrected saturation Cur. density*/ - double MOS9tCbd; /* temperature corrected B-D Capacitance */ - double MOS9tCbs; /* temperature corrected B-S Capacitance */ - double MOS9tCj; /* temperature corrected Bulk bottom Capacitance */ - double MOS9tCjsw; /* temperature corrected Bulk side Capacitance */ - double MOS9tBulkPot; /* temperature corrected Bulk potential */ - double MOS9tDepCap; /* temperature adjusted transition point in */ - /* the cureve matching Fc * Vj */ - double MOS9tVbi; /* temperature adjusted Vbi */ - - double MOS9icVBS; /* initial condition B-S voltage */ - double MOS9icVDS; /* initial condition D-S voltage */ - double MOS9icVGS; /* initial condition G-S voltage */ - double MOS9von; - double MOS9vdsat; - double MOS9sourceVcrit; /* vcrit for pos. vds */ - double MOS9drainVcrit; /* vcrit for neg. vds */ - double MOS9cd; - double MOS9cbs; - double MOS9cbd; - double MOS9gmbs; - double MOS9gm; - double MOS9gds; - double MOS9gbd; - double MOS9gbs; - double MOS9capbd; - double MOS9capbs; - double MOS9Cbd; - double MOS9Cbdsw; - double MOS9Cbs; - double MOS9Cbssw; - double MOS9f2d; - double MOS9f3d; - double MOS9f4d; - double MOS9f2s; - double MOS9f3s; - double MOS9f4s; - int MOS9mode; /* device mode : 1 = normal, -1 = inverse */ - - - unsigned MOS9off :1;/* non-zero to indicate device is off for dc analysis*/ - unsigned MOS9tempGiven :1; /* instance temperature specified */ - unsigned MOS9dtempGiven :1; /* instance temperature difference specified*/ - - unsigned MOS9mGiven :1; - - unsigned MOS9lGiven :1; - unsigned MOS9wGiven :1; - unsigned MOS9drainAreaGiven :1; - unsigned MOS9sourceAreaGiven :1; - unsigned MOS9drainSquaresGiven :1; - unsigned MOS9sourceSquaresGiven :1; - unsigned MOS9drainPerimiterGiven :1; - unsigned MOS9sourcePerimiterGiven :1; - unsigned MOS9dNodePrimeSet :1; - unsigned MOS9sNodePrimeSet :1; - unsigned MOS9icVBSGiven :1; - unsigned MOS9icVDSGiven :1; - unsigned MOS9icVGSGiven :1; - unsigned MOS9vonGiven :1; - unsigned MOS9vdsatGiven :1; - unsigned MOS9modeGiven :1; - - - double *MOS9DdPtr; /* pointer to sparse matrix element at - * (Drain node,drain node) */ - double *MOS9GgPtr; /* pointer to sparse matrix element at - * (gate node,gate node) */ - double *MOS9SsPtr; /* pointer to sparse matrix element at - * (source node,source node) */ - double *MOS9BbPtr; /* pointer to sparse matrix element at - * (bulk node,bulk node) */ - double *MOS9DPdpPtr; /* pointer to sparse matrix element at - * (drain prime node,drain prime node) */ - double *MOS9SPspPtr; /* pointer to sparse matrix element at - * (source prime node,source prime node) */ - double *MOS9DdpPtr; /* pointer to sparse matrix element at - * (drain node,drain prime node) */ - double *MOS9GbPtr; /* pointer to sparse matrix element at - * (gate node,bulk node) */ - double *MOS9GdpPtr; /* pointer to sparse matrix element at - * (gate node,drain prime node) */ - double *MOS9GspPtr; /* pointer to sparse matrix element at - * (gate node,source prime node) */ - double *MOS9SspPtr; /* pointer to sparse matrix element at - * (source node,source prime node) */ - double *MOS9BdpPtr; /* pointer to sparse matrix element at - * (bulk node,drain prime node) */ - double *MOS9BspPtr; /* pointer to sparse matrix element at - * (bulk node,source prime node) */ - double *MOS9DPspPtr; /* pointer to sparse matrix element at - * (drain prime node,source prime node) */ - double *MOS9DPdPtr; /* pointer to sparse matrix element at - * (drain prime node,drain node) */ - double *MOS9BgPtr; /* pointer to sparse matrix element at - * (bulk node,gate node) */ - double *MOS9DPgPtr; /* pointer to sparse matrix element at - * (drain prime node,gate node) */ - - double *MOS9SPgPtr; /* pointer to sparse matrix element at - * (source prime node,gate node) */ - double *MOS9SPsPtr; /* pointer to sparse matrix element at - * (source prime node,source node) */ - double *MOS9DPbPtr; /* pointer to sparse matrix element at - * (drain prime node,bulk node) */ - double *MOS9SPbPtr; /* pointer to sparse matrix element at - * (source prime node,bulk node) */ - double *MOS9SPdpPtr; /* pointer to sparse matrix element at - * (source prime node,drain prime node) */ - int MOS9senParmNo; /* parameter # for sensitivity use; - set equal to 0 if neither length - nor width of the mosfet is a design - parameter */ - unsigned MOS9sens_l :1; /* field which indicates whether - length of the mosfet is a design - parameter or not */ - unsigned MOS9sens_w :1; /* field which indicates whether - width of the mosfet is a design - parameter or not */ - unsigned MOS9senPertFlag :1; /* indictes whether the the parameter of - the particular instance is to be perturbed */ - double MOS9cgs; - double MOS9cgd; - double MOS9cgb; - double *MOS9sens; - -#define MOS9senGdpr MOS9sens -#define MOS9senGspr MOS9sens + 1 -#define MOS9senCgs MOS9sens + 2 /* contains pertured values of cgs */ -#define MOS9senCgd MOS9sens + 8 /* contains perturbed values of cgd*/ -#define MOS9senCgb MOS9sens + 14 /* contains perturbed values of cgb*/ -#define MOS9senCbd MOS9sens + 20 /* contains perturbed values of cbd*/ -#define MOS9senCbs MOS9sens + 26 /* contains perturbed values of cbs*/ -#define MOS9senGds MOS9sens + 32 /* contains perturbed values of gds*/ -#define MOS9senGbs MOS9sens + 38 /* contains perturbed values of gbs*/ -#define MOS9senGbd MOS9sens + 44 /* contains perturbed values of gbd*/ -#define MOS9senGm MOS9sens + 50 /* contains perturbed values of gm*/ -#define MOS9senGmbs MOS9sens + 56 /* contains perturbed values of gmbs*/ -#define MOS9dphigs_dl MOS9sens + 62 -#define MOS9dphigd_dl MOS9sens + 63 -#define MOS9dphigb_dl MOS9sens + 64 -#define MOS9dphibs_dl MOS9sens + 65 -#define MOS9dphibd_dl MOS9sens + 66 -#define MOS9dphigs_dw MOS9sens + 67 -#define MOS9dphigd_dw MOS9sens + 68 -#define MOS9dphigb_dw MOS9sens + 69 -#define MOS9dphibs_dw MOS9sens + 70 -#define MOS9dphibd_dw MOS9sens + 71 - - /* distortion stuff */ -/* - * naming convention: - * x = vgs - * y = vbs - * z = vds - * cdr = cdrain - */ - - -#define MOS9NDCOEFFS 30 - -#ifndef NODISTO - double MOS9dCoeffs[MOS9NDCOEFFS]; -#else /* NODISTO */ - double *MOS9dCoeffs; -#endif /* NODISTO */ - -#ifndef CONFIG - -#define capbs2 MOS9dCoeffs[0] -#define capbs3 MOS9dCoeffs[1] -#define capbd2 MOS9dCoeffs[2] -#define capbd3 MOS9dCoeffs[3] -#define gbs2 MOS9dCoeffs[4] -#define gbs3 MOS9dCoeffs[5] -#define gbd2 MOS9dCoeffs[6] -#define gbd3 MOS9dCoeffs[7] -#define capgb2 MOS9dCoeffs[8] -#define capgb3 MOS9dCoeffs[9] -#define cdr_x2 MOS9dCoeffs[10] -#define cdr_y2 MOS9dCoeffs[11] -#define cdr_z2 MOS9dCoeffs[12] -#define cdr_xy MOS9dCoeffs[13] -#define cdr_yz MOS9dCoeffs[14] -#define cdr_xz MOS9dCoeffs[15] -#define cdr_x3 MOS9dCoeffs[16] -#define cdr_y3 MOS9dCoeffs[17] -#define cdr_z3 MOS9dCoeffs[18] -#define cdr_x2z MOS9dCoeffs[19] -#define cdr_x2y MOS9dCoeffs[20] -#define cdr_y2z MOS9dCoeffs[21] -#define cdr_xy2 MOS9dCoeffs[22] -#define cdr_xz2 MOS9dCoeffs[23] -#define cdr_yz2 MOS9dCoeffs[24] -#define cdr_xyz MOS9dCoeffs[25] -#define capgs2 MOS9dCoeffs[26] -#define capgs3 MOS9dCoeffs[27] -#define capgd2 MOS9dCoeffs[28] -#define capgd3 MOS9dCoeffs[29] - -#endif - - /* end distortion coeffs. */ - -#ifndef NONOISE - double MOS9nVar[NSTATVARS][MOS9NSRCS]; -#else /* NONOISE */ - double **MOS9nVar; -#endif /* NONOISE */ - -} MOS9instance ; - -#define MOS9vbd MOS9states+ 0 -#define MOS9vbs MOS9states+ 1 -#define MOS9vgs MOS9states+ 2 -#define MOS9vds MOS9states+ 3 - -/* meyer capacitances */ -#define MOS9capgs MOS9states+ 4 /* gate-source capacitor value */ -#define MOS9qgs MOS9states+ 5 /* gate-source capacitor charge */ -#define MOS9cqgs MOS9states+ 6 /* gate-source capacitor current */ - -#define MOS9capgd MOS9states+ 7 /* gate-drain capacitor value */ -#define MOS9qgd MOS9states+ 8 /* gate-drain capacitor charge */ -#define MOS9cqgd MOS9states+ 9 /* gate-drain capacitor current */ - -#define MOS9capgb MOS9states+ 10/* gate-bulk capacitor value */ -#define MOS9qgb MOS9states+ 11 /* gate-bulk capacitor charge */ -#define MOS9cqgb MOS9states+ 12 /* gate-bulk capacitor current */ - -/* diode capacitances */ -#define MOS9qbd MOS9states+ 13 /* bulk-drain capacitor charge */ -#define MOS9cqbd MOS9states+ 14 /* bulk-drain capacitor current */ - -#define MOS9qbs MOS9states+ 15 /* bulk-source capacitor charge */ -#define MOS9cqbs MOS9states+ 16 /* bulk-source capacitor current */ - -#define MOS9NUMSTATES 17 - - -#define MOS9sensxpgs MOS9states+17 /* charge sensitivities and their derivatives - +18 for the derivatives - pointer to the - beginning of the array */ -#define MOS9sensxpgd MOS9states+19 -#define MOS9sensxpgb MOS9states+21 -#define MOS9sensxpbs MOS9states+23 -#define MOS9sensxpbd MOS9states+25 - -#define MOS9numSenStates 10 - - -/* per model data */ - - /* NOTE: parameters marked 'input - use xxxx' are paramters for - * which a temperature correction is applied in MOS9temp, thus - * the MOS9xxxx value in the per-instance structure should be used - * instead in all calculations - */ - -typedef struct sMOS9model { /* model structure for a resistor */ - - struct GENmodel gen; - -#define MOS9modType gen.GENmodType -#define MOS9nextModel(inst) ((struct sMOS9model *)((inst)->gen.GENnextModel)) -#define MOS9instances(inst) ((MOS9instance *)((inst)->gen.GENinstances)) -#define MOS9modName gen.GENmodName - - int MOS9type; /* device type : 1 = nmos, -1 = pmos */ - double MOS9tnom; /* temperature at which parameters measured */ - double MOS9latDiff; - double MOS9lengthAdjust; /* New parm: mask adjustment to length */ - double MOS9widthNarrow; /* New parm to reduce effective width */ - double MOS9widthAdjust; /* New parm: mask adjustment to width */ - double MOS9delvt0; /* New parm: adjustment to calculated vtO */ - double MOS9jctSatCurDensity; /* input - use tSatCurDens*/ - double MOS9jctSatCur; /* input - use tSatCur instead */ - double MOS9drainResistance; - double MOS9sourceResistance; - double MOS9sheetResistance; - double MOS9transconductance; /* input - use tTransconductance */ - double MOS9gateSourceOverlapCapFactor; - double MOS9gateDrainOverlapCapFactor; - double MOS9gateBulkOverlapCapFactor; - double MOS9oxideCapFactor; - double MOS9vt0; /* input - use tVto */ - double MOS9capBD; /* input - use tCbs */ - double MOS9capBS; /* input - use tCbd */ - double MOS9bulkCapFactor; /* input - use tCj */ - double MOS9sideWallCapFactor; /* input - use tCjsw */ - double MOS9bulkJctPotential; /* input - use tBulkPot */ - double MOS9bulkJctBotGradingCoeff; - double MOS9bulkJctSideGradingCoeff; - double MOS9fwdCapDepCoeff; - double MOS9phi; /* input - use tPhi */ - double MOS9gamma; - double MOS9substrateDoping; - int MOS9gateType; - double MOS9surfaceStateDensity; - double MOS9oxideThickness; - double MOS9surfaceMobility; /* input - use tSurfMob */ - double MOS9eta; - double MOS9junctionDepth; - double MOS9coeffDepLayWidth; /* xd */ - double MOS9narrowFactor; /* delta */ - double MOS9delta; /* input delta */ - double MOS9fastSurfaceStateDensity; /* nfs */ - double MOS9theta; /* theta */ - double MOS9maxDriftVel; /* vmax */ - double MOS9alpha; /* alpha */ - double MOS9kappa; /* kappa */ - double MOS9fNcoef; - double MOS9fNexp; - - unsigned MOS9typeGiven :1; - unsigned MOS9latDiffGiven :1; - unsigned MOS9lengthAdjustGiven :1; - unsigned MOS9widthNarrowGiven :1; - unsigned MOS9widthAdjustGiven :1; - unsigned MOS9delvt0Given :1; - unsigned MOS9jctSatCurDensityGiven :1; - unsigned MOS9jctSatCurGiven :1; - unsigned MOS9drainResistanceGiven :1; - unsigned MOS9sourceResistanceGiven :1; - unsigned MOS9sheetResistanceGiven :1; - unsigned MOS9transconductanceGiven :1; - unsigned MOS9gateSourceOverlapCapFactorGiven :1; - unsigned MOS9gateDrainOverlapCapFactorGiven :1; - unsigned MOS9gateBulkOverlapCapFactorGiven :1; - unsigned MOS9vt0Given :1; - unsigned MOS9capBDGiven :1; - unsigned MOS9capBSGiven :1; - unsigned MOS9bulkCapFactorGiven :1; - unsigned MOS9sideWallCapFactorGiven :1; - unsigned MOS9bulkJctPotentialGiven :1; - unsigned MOS9bulkJctBotGradingCoeffGiven :1; - unsigned MOS9bulkJctSideGradingCoeffGiven :1; - unsigned MOS9fwdCapDepCoeffGiven :1; - unsigned MOS9phiGiven :1; - unsigned MOS9gammaGiven :1; - unsigned MOS9substrateDopingGiven :1; - unsigned MOS9gateTypeGiven :1; - unsigned MOS9surfaceStateDensityGiven :1; - unsigned MOS9oxideThicknessGiven :1; - unsigned MOS9surfaceMobilityGiven :1; - unsigned MOS9etaGiven :1; - unsigned MOS9junctionDepthGiven :1; - unsigned MOS9deltaGiven :1; /* delta */ - unsigned MOS9fastSurfaceStateDensityGiven :1; /* nfs */ - unsigned MOS9thetaGiven :1; /* theta */ - unsigned MOS9maxDriftVelGiven :1; /* vmax */ - unsigned MOS9kappaGiven :1; /* kappa */ - unsigned MOS9tnomGiven :1; /* Tnom was given? */ - unsigned MOS9fNcoefGiven :1; - unsigned MOS9fNexpGiven :1; - -} MOS9model; - -#ifndef NMOS -#define NMOS 1 -#define PMOS -1 -#endif /*NMOS*/ - -/* device parameters */ -enum { - MOS9_W = 1, - MOS9_L, - MOS9_AS, - MOS9_AD, - MOS9_PS, - MOS9_PD, - MOS9_NRS, - MOS9_NRD, - MOS9_OFF, - MOS9_IC, - MOS9_IC_VBS, - MOS9_IC_VDS, - MOS9_IC_VGS, - MOS9_W_SENS, - MOS9_L_SENS, - MOS9_CB, - MOS9_CG, - MOS9_CS, - MOS9_POWER, - MOS9_CGS, - MOS9_CGD, - MOS9_DNODE, - MOS9_GNODE, - MOS9_SNODE, - MOS9_BNODE, - MOS9_DNODEPRIME, - MOS9_SNODEPRIME, - MOS9_SOURCECONDUCT, - MOS9_DRAINCONDUCT, - MOS9_VON, - MOS9_VDSAT, - MOS9_SOURCEVCRIT, - MOS9_DRAINVCRIT, - MOS9_CD, - MOS9_CBS, - MOS9_CBD, - MOS9_GMBS, - MOS9_GM, - MOS9_GDS, - MOS9_GBD, - MOS9_GBS, - MOS9_CAPBD, - MOS9_CAPBS, - MOS9_CAPZEROBIASBD, - MOS9_CAPZEROBIASBDSW, - MOS9_CAPZEROBIASBS, - MOS9_CAPZEROBIASBSSW, - MOS9_VBD, - MOS9_VBS, - MOS9_VGS, - MOS9_VDS, - MOS9_CAPGS, - MOS9_QGS, - MOS9_CQGS, - MOS9_CAPGD, - MOS9_QGD, - MOS9_CQGD, - MOS9_CAPGB, - MOS9_QGB, - MOS9_CQGB, - MOS9_QBD, - MOS9_CQBD, - MOS9_QBS, - MOS9_CQBS, - MOS9_W_SENS_REAL, - MOS9_W_SENS_IMAG, - MOS9_W_SENS_MAG, - MOS9_W_SENS_PH, - MOS9_W_SENS_CPLX, - MOS9_L_SENS_REAL, - MOS9_L_SENS_IMAG, - MOS9_L_SENS_MAG, - MOS9_L_SENS_PH, - MOS9_L_SENS_CPLX, - MOS9_W_SENS_DC, - MOS9_L_SENS_DC, - MOS9_TEMP, - MOS9_SOURCERESIST, - MOS9_DRAINRESIST, - MOS9_M, - MOS9_DTEMP, -}; - -/* model parameters */ -enum { - MOS9_MOD_VTO = 101, - MOS9_MOD_KP, - MOS9_MOD_GAMMA, - MOS9_MOD_PHI, - MOS9_MOD_RD, - MOS9_MOD_RS, - MOS9_MOD_CBD, - MOS9_MOD_CBS, - MOS9_MOD_IS, - MOS9_MOD_PB, - MOS9_MOD_CGSO, - MOS9_MOD_CGDO, - MOS9_MOD_CGBO, - MOS9_MOD_RSH, - MOS9_MOD_CJ, - MOS9_MOD_MJ, - MOS9_MOD_CJSW, - MOS9_MOD_MJSW, - MOS9_MOD_JS, - MOS9_MOD_TOX, - MOS9_MOD_LD, - MOS9_MOD_U0, - MOS9_MOD_FC, - MOS9_MOD_NSUB, - MOS9_MOD_TPG, - MOS9_MOD_NSS, - MOS9_MOD_ETA, - MOS9_MOD_DELTA, - MOS9_MOD_NFS, - MOS9_MOD_THETA, - MOS9_MOD_VMAX, - MOS9_MOD_KAPPA, - MOS9_MOD_NMOS, - MOS9_MOD_PMOS, - MOS9_MOD_XJ, - MOS9_MOD_UEXP, - MOS9_MOD_NEFF, - MOS9_MOD_XD, - MOS9_MOD_ALPHA, - MOS9_DELTA, - MOS9_MOD_TNOM, - MOS9_MOD_KF, - MOS9_MOD_AF, - MOS9_MOD_TYPE, - MOS9_MOD_XL, - MOS9_MOD_WD, - MOS9_MOD_XW, - MOS9_MOD_DELVTO, -}; - -/* device questions */ - - -/* model questions */ - -#include "mos9ext.h" - -#endif /*MOS9*/ - diff --git a/src/spicelib/devices/mos9/mos9del.c b/src/spicelib/devices/mos9/mos9del.c deleted file mode 100644 index f2f8b669f..000000000 --- a/src/spicelib/devices/mos9/mos9del.c +++ /dev/null @@ -1,19 +0,0 @@ -/********** -Copyright 1990 Regents of the University of California. All rights reserved. -Author: 1985 Thomas L. Quarles -Modified: Alan Gillespie -**********/ - -#include "ngspice/ngspice.h" -#include "mos9defs.h" -#include "ngspice/sperror.h" -#include "ngspice/suffix.h" - - -int -MOS9delete(GENinstance *gen_inst) -{ - MOS9instance *inst = (MOS9instance *) gen_inst; - FREE(inst->MOS9sens); - return OK; -} diff --git a/src/spicelib/devices/mos9/mos9dist.c b/src/spicelib/devices/mos9/mos9dist.c deleted file mode 100644 index fe1f9649a..000000000 --- a/src/spicelib/devices/mos9/mos9dist.c +++ /dev/null @@ -1,1383 +0,0 @@ -/********** -Copyright 1990 Regents of the University of California. All rights reserved. -Author: 1988 Jaijeet S Roychowdhury -Modified: Alan Gillespie -**********/ - -#include "ngspice/ngspice.h" -#include "ngspice/cktdefs.h" -#include "mos9defs.h" -#include "ngspice/sperror.h" -#include "ngspice/distodef.h" -#include "ngspice/suffix.h" - -int -MOS9disto( - int mode, - GENmodel *genmodel, - CKTcircuit *ckt) - -/* assuming here that ckt->CKTomega has been initialised to - * the correct value - */ -{ - MOS9model *model = (MOS9model *) genmodel; - DISTOAN* job = (DISTOAN*) ckt->CKTcurJob; - DpassStr pass; - double r1h1x,i1h1x; - double r1h1y,i1h1y; - double r1h1z, i1h1z; - double r1h2x, i1h2x; - double r1h2y, i1h2y; - double r1h2z, i1h2z; - double r1hm2x,i1hm2x; - double r1hm2y,i1hm2y; - double r1hm2z, i1hm2z; - double r2h11x,i2h11x; - double r2h11y,i2h11y; - double r2h11z, i2h11z; - double r2h1m2x,i2h1m2x; - double r2h1m2y,i2h1m2y; - double r2h1m2z, i2h1m2z; - double temp, itemp; - register MOS9instance *here; - -if (mode == D_SETUP) - return(MOS9dSetup(genmodel,ckt)); - -if ((mode == D_TWOF1) || (mode == D_THRF1) || - (mode == D_F1PF2) || (mode == D_F1MF2) || - (mode == D_2F1MF2)) { - - /* loop through all the MOS9 models */ -for( ; model != NULL; model = MOS9nextModel(model)) { - - /* loop through all the instances of the model */ - for (here = MOS9instances(model); here != NULL ; - here=MOS9nextInstance(here)) { - - /* loading starts here */ - - switch (mode) { - case D_TWOF1: - /* x = vgs, y = vbs z = vds */ - - /* getting first order (linear) Volterra kernel */ - r1h1x = *(job->r1H1ptr + (here->MOS9gNode)) - - *(job->r1H1ptr + (here->MOS9sNodePrime)); - i1h1x = *(job->i1H1ptr + (here->MOS9gNode)) - - *(job->i1H1ptr + (here->MOS9sNodePrime)); - - r1h1y = *(job->r1H1ptr + (here->MOS9bNode)) - - *(job->r1H1ptr + (here->MOS9sNodePrime)); - i1h1y = *(job->i1H1ptr + (here->MOS9bNode)) - - *(job->i1H1ptr + (here->MOS9sNodePrime)); - - r1h1z = *(job->r1H1ptr + (here->MOS9dNodePrime)) - - *(job->r1H1ptr + (here->MOS9sNodePrime)); - i1h1z = *(job->i1H1ptr + (here->MOS9dNodePrime)) - - *(job->i1H1ptr + (here->MOS9sNodePrime)); - - /* loading starts here */ - /* loading cdrain term */ - - temp = DFn2F1(here->cdr_x2, - here->cdr_y2, - here->cdr_z2, - here->cdr_xy, - here->cdr_yz, - here->cdr_xz, - r1h1x, - i1h1x, - r1h1y, - i1h1y, - r1h1z, - i1h1z); - - itemp = DFi2F1(here->cdr_x2, - here->cdr_y2, - here->cdr_z2, - here->cdr_xy, - here->cdr_yz, - here->cdr_xz, - r1h1x, - i1h1x, - r1h1y, - i1h1y, - r1h1z, - i1h1z); - - *(ckt->CKTrhs + (here->MOS9dNodePrime)) -= temp; - *(ckt->CKTirhs + (here->MOS9dNodePrime)) -= itemp; - *(ckt->CKTrhs + (here->MOS9sNodePrime)) += temp; - *(ckt->CKTirhs + (here->MOS9sNodePrime)) += itemp; - - /* cdrain term over */ - - /* loading gbs term */ - - temp = D1n2F1(here->gbs2, - r1h1y, - i1h1y); - - itemp = D1i2F1(here->gbs2, - r1h1y, - i1h1y); - - - *(ckt->CKTrhs + (here->MOS9bNode)) -= temp; - *(ckt->CKTirhs + (here->MOS9bNode)) -= itemp; - *(ckt->CKTrhs + (here->MOS9sNodePrime)) += temp; - *(ckt->CKTirhs + (here->MOS9sNodePrime)) += itemp; - - /* gbs over */ - - /* loading gbd term */ - - temp = D1n2F1(here->gbd2, - r1h1y - r1h1z, - i1h1y - i1h1z); - - itemp = D1i2F1(here->gbd2, - r1h1y - r1h1z, - i1h1y - i1h1z); - - - *(ckt->CKTrhs + (here->MOS9bNode)) -= temp; - *(ckt->CKTirhs + (here->MOS9bNode)) -= itemp; - *(ckt->CKTrhs + (here->MOS9dNodePrime)) += temp; - *(ckt->CKTirhs + (here->MOS9dNodePrime)) += itemp; - - /* gbd over */ - - /* loading capgs term */ - - temp = -ckt->CKTomega * - D1i2F1(here->capgs2, - r1h1x, - i1h1x); - - itemp = ckt->CKTomega * - D1n2F1(here->capgs2, - r1h1x, - i1h1x); - - *(ckt->CKTrhs + (here->MOS9gNode)) -= temp; - *(ckt->CKTirhs + (here->MOS9gNode)) -= itemp; - *(ckt->CKTrhs + (here->MOS9sNodePrime)) += temp; - *(ckt->CKTirhs + (here->MOS9sNodePrime)) += itemp; - - /* capgs over */ - - /* loading capgd term */ - - temp = -ckt->CKTomega * - D1i2F1(here->capgd2, - r1h1x - r1h1z, - i1h1x - i1h1z); - - itemp = ckt->CKTomega * - D1n2F1(here->capgd2, - r1h1x - r1h1z, - i1h1x - i1h1z); - - - *(ckt->CKTrhs + (here->MOS9gNode)) -= temp; - *(ckt->CKTirhs + (here->MOS9gNode)) -= itemp; - *(ckt->CKTrhs + (here->MOS9dNodePrime)) += temp; - *(ckt->CKTirhs + (here->MOS9dNodePrime)) += itemp; - - /* capgd over */ - /* loading capgb term */ - - temp = -ckt->CKTomega * - D1i2F1(here->capgb2, - r1h1x - r1h1y, - i1h1x - i1h1y); - - itemp = ckt->CKTomega * - D1n2F1(here->capgb2, - r1h1x - r1h1y, - i1h1x - i1h1y); - - *(ckt->CKTrhs + (here->MOS9gNode)) -= temp; - *(ckt->CKTirhs + (here->MOS9gNode)) -= itemp; - *(ckt->CKTrhs + (here->MOS9bNode)) += temp; - *(ckt->CKTirhs + (here->MOS9bNode)) += itemp; - - /* capgb over */ - - /* loading capbs term */ - - temp = -ckt->CKTomega * - D1i2F1(here->capbs2, - r1h1y, - i1h1y); - - itemp = ckt->CKTomega * - D1n2F1(here->capbs2, - r1h1y, - i1h1y); - - - *(ckt->CKTrhs + (here->MOS9bNode)) -= temp; - *(ckt->CKTirhs + (here->MOS9bNode)) -= itemp; - *(ckt->CKTrhs + (here->MOS9sNodePrime)) += temp; - *(ckt->CKTirhs + (here->MOS9sNodePrime)) += itemp; - - /* capbs over */ - - /* loading capbd term */ - - temp = -ckt->CKTomega * - D1i2F1(here->capbd2, - r1h1y - r1h1z, - i1h1y - i1h1z); - - itemp = ckt->CKTomega * - D1n2F1(here->capbd2, - r1h1y - r1h1z, - i1h1y - i1h1z); - - - *(ckt->CKTrhs + (here->MOS9bNode)) -= temp; - *(ckt->CKTirhs + (here->MOS9bNode)) -= itemp; - *(ckt->CKTrhs + (here->MOS9dNodePrime)) += temp; - *(ckt->CKTirhs + (here->MOS9dNodePrime)) += itemp; - - /* capbd over */ - /* all done */ - - break; - - case D_THRF1: - /* x = vgs, y = vbs z = vds */ - - /* getting first order (linear) Volterra kernel */ - r1h1x = *(job->r1H1ptr + (here->MOS9gNode)) - - *(job->r1H1ptr + (here->MOS9sNodePrime)); - i1h1x = *(job->i1H1ptr + (here->MOS9gNode)) - - *(job->i1H1ptr + (here->MOS9sNodePrime)); - - r1h1y = *(job->r1H1ptr + (here->MOS9bNode)) - - *(job->r1H1ptr + (here->MOS9sNodePrime)); - i1h1y = *(job->i1H1ptr + (here->MOS9bNode)) - - *(job->i1H1ptr + (here->MOS9sNodePrime)); - - r1h1z = *(job->r1H1ptr + (here->MOS9dNodePrime)) - - *(job->r1H1ptr + (here->MOS9sNodePrime)); - i1h1z = *(job->i1H1ptr + (here->MOS9dNodePrime)) - - *(job->i1H1ptr + (here->MOS9sNodePrime)); - - r2h11x = *(job->r2H11ptr + (here->MOS9gNode)) - - *(job->r2H11ptr + (here->MOS9sNodePrime)); - i2h11x = *(job->i2H11ptr + (here->MOS9gNode)) - - *(job->i2H11ptr + (here->MOS9sNodePrime)); - - r2h11y = *(job->r2H11ptr + (here->MOS9bNode)) - - *(job->r2H11ptr + (here->MOS9sNodePrime)); - i2h11y = *(job->i2H11ptr + (here->MOS9bNode)) - - *(job->i2H11ptr + (here->MOS9sNodePrime)); - - r2h11z = *(job->r2H11ptr + (here->MOS9dNodePrime)) - - *(job->r2H11ptr + (here->MOS9sNodePrime)); - i2h11z = *(job->i2H11ptr + (here->MOS9dNodePrime)) - - *(job->i2H11ptr + (here->MOS9sNodePrime)); - /* loading starts here */ - /* loading cdrain term */ - - temp = DFn3F1(here->cdr_x2, - here->cdr_y2, - here->cdr_z2, - here->cdr_xy, - here->cdr_yz, - here->cdr_xz, - here->cdr_x3, - here->cdr_y3, - here->cdr_z3, - here->cdr_x2y, - here->cdr_x2z, - here->cdr_xy2, - here->cdr_y2z, - here->cdr_xz2, - here->cdr_yz2, - here->cdr_xyz, - r1h1x, - i1h1x, - r1h1y, - i1h1y, - r1h1z, - i1h1z, - r2h11x, - i2h11x, - r2h11y, - i2h11y, - r2h11z, - i2h11z); - itemp = DFi3F1(here->cdr_x2, - here->cdr_y2, - here->cdr_z2, - here->cdr_xy, - here->cdr_yz, - here->cdr_xz, - here->cdr_x3, - here->cdr_y3, - here->cdr_z3, - here->cdr_x2y, - here->cdr_x2z, - here->cdr_xy2, - here->cdr_y2z, - here->cdr_xz2, - here->cdr_yz2, - here->cdr_xyz, - r1h1x, - i1h1x, - r1h1y, - i1h1y, - r1h1z, - i1h1z, - r2h11x, - i2h11x, - r2h11y, - i2h11y, - r2h11z, - i2h11z); - - - *(ckt->CKTrhs + (here->MOS9dNodePrime)) -= temp; - *(ckt->CKTirhs + (here->MOS9dNodePrime)) -= itemp; - *(ckt->CKTrhs + (here->MOS9sNodePrime)) += temp; - *(ckt->CKTirhs + (here->MOS9sNodePrime)) += itemp; - - /* cdrain term over */ - - /* loading gbs term */ - - temp = D1n3F1(here->gbs2, - here->gbs3, - r1h1y, - i1h1y, - r2h11y, - i2h11y); - - - itemp = D1i3F1(here->gbs2, - here->gbs3, - r1h1y, - i1h1y, - r2h11y, - i2h11y); - - - *(ckt->CKTrhs + (here->MOS9bNode)) -= temp; - *(ckt->CKTirhs + (here->MOS9bNode)) -= itemp; - *(ckt->CKTrhs + (here->MOS9sNodePrime)) += temp; - *(ckt->CKTirhs + (here->MOS9sNodePrime)) += itemp; - - /* gbs over */ - - /* loading gbd term */ - - temp = D1n3F1(here->gbd2, - here->gbd3, - r1h1y - r1h1z, - i1h1y - i1h1z, - r2h11y - r2h11z, - i2h11y - i2h11z); - - itemp = D1i3F1(here->gbd2, - here->gbd3, - r1h1y - r1h1z, - i1h1y - i1h1z, - r2h11y - r2h11z, - i2h11y - i2h11z); - - *(ckt->CKTrhs + (here->MOS9bNode)) -= temp; - *(ckt->CKTirhs + (here->MOS9bNode)) -= itemp; - *(ckt->CKTrhs + (here->MOS9dNodePrime)) += temp; - *(ckt->CKTirhs + (here->MOS9dNodePrime)) += itemp; - - /* gbd over */ - - /* loading capgs term */ - - temp = -ckt->CKTomega * - D1i3F1(here->capgs2, - here->capgs3, - r1h1x, - i1h1x, - r2h11x, - i2h11x); - - itemp = ckt->CKTomega * - D1n3F1(here->capgs2, - here->capgs3, - r1h1x, - i1h1x, - r2h11x, - i2h11x); - - *(ckt->CKTrhs + (here->MOS9gNode)) -= temp; - *(ckt->CKTirhs + (here->MOS9gNode)) -= itemp; - *(ckt->CKTrhs + (here->MOS9sNodePrime)) += temp; - *(ckt->CKTirhs + (here->MOS9sNodePrime)) += itemp; - - /* capgs over */ - - /* loading capgd term */ - - temp = -ckt->CKTomega * - D1i3F1(here->capgd2, - here->capgd3, - r1h1x - r1h1z, - i1h1x - i1h1z, - r2h11x - r2h11z, - i2h11x - i2h11z); - - itemp = ckt->CKTomega * - D1n3F1(here->capgd2, - here->capgd3, - r1h1x - r1h1z, - i1h1x - i1h1z, - r2h11x - r2h11z, - i2h11x - i2h11z); - - - *(ckt->CKTrhs + (here->MOS9gNode)) -= temp; - *(ckt->CKTirhs + (here->MOS9gNode)) -= itemp; - *(ckt->CKTrhs + (here->MOS9dNodePrime)) += temp; - *(ckt->CKTirhs + (here->MOS9dNodePrime)) += itemp; - - /* capgd over */ - /* loading capgb term */ - - temp = -ckt->CKTomega * - D1i3F1(here->capgb2, - here->capgb3, - r1h1x - r1h1y, - i1h1x - i1h1y, - r2h11x - r2h11y, - i2h11x - i2h11y); - - itemp = ckt->CKTomega * - D1n3F1(here->capgb2, - here->capgb3, - r1h1x - r1h1y, - i1h1x - i1h1y, - r2h11x - r2h11y, - i2h11x - i2h11y); - - *(ckt->CKTrhs + (here->MOS9gNode)) -= temp; - *(ckt->CKTirhs + (here->MOS9gNode)) -= itemp; - *(ckt->CKTrhs + (here->MOS9bNode)) += temp; - *(ckt->CKTirhs + (here->MOS9bNode)) += itemp; - - /* capgb over */ - - /* loading capbs term */ - - temp = -ckt->CKTomega * - D1i3F1(here->capbs2, - here->capbs3, - r1h1y, - i1h1y, - r2h11y, - i2h11y); - - itemp = ckt->CKTomega * - D1n3F1(here->capbs2, - here->capbs3, - r1h1y, - i1h1y, - r2h11y, - i2h11y); - - - *(ckt->CKTrhs + (here->MOS9bNode)) -= temp; - *(ckt->CKTirhs + (here->MOS9bNode)) -= itemp; - *(ckt->CKTrhs + (here->MOS9sNodePrime)) += temp; - *(ckt->CKTirhs + (here->MOS9sNodePrime)) += itemp; - - /* capbs over */ - - /* loading capbd term */ - - temp = -ckt->CKTomega * - D1i3F1(here->capbd2, - here->capbd3, - r1h1y - r1h1z, - i1h1y - i1h1z, - r2h11y - r2h11z, - i2h11y - i2h11z); - - itemp = ckt->CKTomega * - D1n3F1(here->capbd2, - here->capbd3, - r1h1y - r1h1z, - i1h1y - i1h1z, - r2h11y - r2h11z, - i2h11y - i2h11z); - - - *(ckt->CKTrhs + (here->MOS9bNode)) -= temp; - *(ckt->CKTirhs + (here->MOS9bNode)) -= itemp; - *(ckt->CKTrhs + (here->MOS9dNodePrime)) += temp; - *(ckt->CKTirhs + (here->MOS9dNodePrime)) += itemp; - - /* capbd over */ - /* all done */ - - break; - case D_F1PF2: - /* x = vgs, y = vbs z = vds */ - - /* getting first order (linear) Volterra kernel */ - r1h1x = *(job->r1H1ptr + (here->MOS9gNode)) - - *(job->r1H1ptr + (here->MOS9sNodePrime)); - i1h1x = *(job->i1H1ptr + (here->MOS9gNode)) - - *(job->i1H1ptr + (here->MOS9sNodePrime)); - - r1h1y = *(job->r1H1ptr + (here->MOS9bNode)) - - *(job->r1H1ptr + (here->MOS9sNodePrime)); - i1h1y = *(job->i1H1ptr + (here->MOS9bNode)) - - *(job->i1H1ptr + (here->MOS9sNodePrime)); - - r1h1z = *(job->r1H1ptr + (here->MOS9dNodePrime)) - - *(job->r1H1ptr + (here->MOS9sNodePrime)); - i1h1z = *(job->i1H1ptr + (here->MOS9dNodePrime)) - - *(job->i1H1ptr + (here->MOS9sNodePrime)); - - r1h2x = *(job->r1H2ptr + (here->MOS9gNode)) - - *(job->r1H2ptr + (here->MOS9sNodePrime)); - i1h2x = *(job->i1H2ptr + (here->MOS9gNode)) - - *(job->i1H2ptr + (here->MOS9sNodePrime)); - - r1h2y = *(job->r1H2ptr + (here->MOS9bNode)) - - *(job->r1H2ptr + (here->MOS9sNodePrime)); - i1h2y = *(job->i1H2ptr + (here->MOS9bNode)) - - *(job->i1H2ptr + (here->MOS9sNodePrime)); - - r1h2z = *(job->r1H2ptr + (here->MOS9dNodePrime)) - - *(job->r1H2ptr + (here->MOS9sNodePrime)); - i1h2z = *(job->i1H2ptr + (here->MOS9dNodePrime)) - - *(job->i1H2ptr + (here->MOS9sNodePrime)); - - /* loading starts here */ - /* loading cdrain term */ - - temp = DFnF12(here->cdr_x2, - here->cdr_y2, - here->cdr_z2, - here->cdr_xy, - here->cdr_yz, - here->cdr_xz, - r1h1x, - i1h1x, - r1h1y, - i1h1y, - r1h1z, - i1h1z, - r1h2x, - i1h2x, - r1h2y, - i1h2y, - r1h2z, - i1h2z); - - itemp = DFiF12(here->cdr_x2, - here->cdr_y2, - here->cdr_z2, - here->cdr_xy, - here->cdr_yz, - here->cdr_xz, - r1h1x, - i1h1x, - r1h1y, - i1h1y, - r1h1z, - i1h1z, - r1h2x, - i1h2x, - r1h2y, - i1h2y, - r1h2z, - i1h2z); - - *(ckt->CKTrhs + (here->MOS9dNodePrime)) -= temp; - *(ckt->CKTirhs + (here->MOS9dNodePrime)) -= itemp; - *(ckt->CKTrhs + (here->MOS9sNodePrime)) += temp; - *(ckt->CKTirhs + (here->MOS9sNodePrime)) += itemp; - - /* cdrain term over */ - - /* loading gbs term */ - - temp = D1nF12(here->gbs2, - r1h1y, - i1h1y, - r1h2y, - i1h2y); - - itemp = D1iF12(here->gbs2, - r1h1y, - i1h1y, - r1h2y, - i1h2y); - - - *(ckt->CKTrhs + (here->MOS9bNode)) -= temp; - *(ckt->CKTirhs + (here->MOS9bNode)) -= itemp; - *(ckt->CKTrhs + (here->MOS9sNodePrime)) += temp; - *(ckt->CKTirhs + (here->MOS9sNodePrime)) += itemp; - - /* gbs over */ - - /* loading gbd term */ - - temp = D1nF12(here->gbd2, - r1h1y - r1h1z, - i1h1y - i1h1z, - r1h2y - r1h2z, - i1h2y - i1h2z); - - itemp = D1iF12(here->gbd2, - r1h1y - r1h1z, - i1h1y - i1h1z, - r1h2y - r1h2z, - i1h2y - i1h2z); - - - *(ckt->CKTrhs + (here->MOS9bNode)) -= temp; - *(ckt->CKTirhs + (here->MOS9bNode)) -= itemp; - *(ckt->CKTrhs + (here->MOS9dNodePrime)) += temp; - *(ckt->CKTirhs + (here->MOS9dNodePrime)) += itemp; - - /* gbd over */ - - /* loading capgs term */ - - temp = -ckt->CKTomega * - D1iF12(here->capgs2, - r1h1x, - i1h1x, - r1h2x, - i1h2x); - - itemp = ckt->CKTomega * - D1nF12(here->capgs2, - r1h1x, - i1h1x, - r1h2x, - i1h2x); - - *(ckt->CKTrhs + (here->MOS9gNode)) -= temp; - *(ckt->CKTirhs + (here->MOS9gNode)) -= itemp; - *(ckt->CKTrhs + (here->MOS9sNodePrime)) += temp; - *(ckt->CKTirhs + (here->MOS9sNodePrime)) += itemp; - - /* capgs over */ - - /* loading capgd term */ - - temp = -ckt->CKTomega * - D1iF12(here->capgd2, - r1h1x - r1h1z, - i1h1x - i1h1z, - r1h2x - r1h2z, - i1h2x - i1h2z); - - itemp = ckt->CKTomega * - D1nF12(here->capgd2, - r1h1x - r1h1z, - i1h1x - i1h1z, - r1h2x - r1h2z, - i1h2x - i1h2z); - - - *(ckt->CKTrhs + (here->MOS9gNode)) -= temp; - *(ckt->CKTirhs + (here->MOS9gNode)) -= itemp; - *(ckt->CKTrhs + (here->MOS9dNodePrime)) += temp; - *(ckt->CKTirhs + (here->MOS9dNodePrime)) += itemp; - - /* capgd over */ - /* loading capgb term */ - - temp = -ckt->CKTomega * - D1iF12(here->capgb2, - r1h1x - r1h1y, - i1h1x - i1h1y, - r1h2x - r1h2y, - i1h2x - i1h2y); - - itemp = ckt->CKTomega * - D1nF12(here->capgb2, - r1h1x - r1h1y, - i1h1x - i1h1y, - r1h2x - r1h2y, - i1h2x - i1h2y); - - *(ckt->CKTrhs + (here->MOS9gNode)) -= temp; - *(ckt->CKTirhs + (here->MOS9gNode)) -= itemp; - *(ckt->CKTrhs + (here->MOS9bNode)) += temp; - *(ckt->CKTirhs + (here->MOS9bNode)) += itemp; - - /* capgb over */ - - /* loading capbs term */ - - temp = -ckt->CKTomega * - D1iF12(here->capbs2, - r1h1y, - i1h1y, - r1h2y, - i1h2y); - - itemp = ckt->CKTomega * - D1nF12(here->capbs2, - r1h1y, - i1h1y, - r1h2y, - i1h2y); - - - *(ckt->CKTrhs + (here->MOS9bNode)) -= temp; - *(ckt->CKTirhs + (here->MOS9bNode)) -= itemp; - *(ckt->CKTrhs + (here->MOS9sNodePrime)) += temp; - *(ckt->CKTirhs + (here->MOS9sNodePrime)) += itemp; - - /* capbs over */ - - /* loading capbd term */ - - temp = -ckt->CKTomega * - D1iF12(here->capbd2, - r1h1y - r1h1z, - i1h1y - i1h1z, - r1h2y - r1h2z, - i1h2y - i1h2z); - - itemp = ckt->CKTomega * - D1nF12(here->capbd2, - r1h1y - r1h1z, - i1h1y - i1h1z, - r1h2y - r1h2z, - i1h2y - i1h2z); - - - *(ckt->CKTrhs + (here->MOS9bNode)) -= temp; - *(ckt->CKTirhs + (here->MOS9bNode)) -= itemp; - *(ckt->CKTrhs + (here->MOS9dNodePrime)) += temp; - *(ckt->CKTirhs + (here->MOS9dNodePrime)) += itemp; - - /* capbd over */ - /* all done */ - - break; - case D_F1MF2: - /* x = vgs, y = vbs z = vds */ - - /* getting first order (linear) Volterra kernel */ - r1h1x = *(job->r1H1ptr + (here->MOS9gNode)) - - *(job->r1H1ptr + (here->MOS9sNodePrime)); - i1h1x = *(job->i1H1ptr + (here->MOS9gNode)) - - *(job->i1H1ptr + (here->MOS9sNodePrime)); - - r1h1y = *(job->r1H1ptr + (here->MOS9bNode)) - - *(job->r1H1ptr + (here->MOS9sNodePrime)); - i1h1y = *(job->i1H1ptr + (here->MOS9bNode)) - - *(job->i1H1ptr + (here->MOS9sNodePrime)); - - r1h1z = *(job->r1H1ptr + (here->MOS9dNodePrime)) - - *(job->r1H1ptr + (here->MOS9sNodePrime)); - i1h1z = *(job->i1H1ptr + (here->MOS9dNodePrime)) - - *(job->i1H1ptr + (here->MOS9sNodePrime)); - - r1hm2x = *(job->r1H2ptr + (here->MOS9gNode)) - - *(job->r1H2ptr + (here->MOS9sNodePrime)); - i1hm2x = -(*(job->i1H2ptr + (here->MOS9gNode)) - - *(job->i1H2ptr + (here->MOS9sNodePrime))); - - r1hm2y = *(job->r1H2ptr + (here->MOS9bNode)) - - *(job->r1H2ptr + (here->MOS9sNodePrime)); - i1hm2y = -(*(job->i1H2ptr + (here->MOS9bNode)) - - *(job->i1H2ptr + (here->MOS9sNodePrime))); - - r1hm2z = *(job->r1H2ptr + (here->MOS9dNodePrime)) - - *(job->r1H2ptr + (here->MOS9sNodePrime)); - i1hm2z = -(*(job->i1H2ptr + (here->MOS9dNodePrime)) - - *(job->i1H2ptr + (here->MOS9sNodePrime))); - - /* loading starts here */ - /* loading cdrain term */ - - temp = DFnF12(here->cdr_x2, - here->cdr_y2, - here->cdr_z2, - here->cdr_xy, - here->cdr_yz, - here->cdr_xz, - r1h1x, - i1h1x, - r1h1y, - i1h1y, - r1h1z, - i1h1z, - r1hm2x, - i1hm2x, - r1hm2y, - i1hm2y, - r1hm2z, - i1hm2z); - - itemp = DFiF12(here->cdr_x2, - here->cdr_y2, - here->cdr_z2, - here->cdr_xy, - here->cdr_yz, - here->cdr_xz, - r1h1x, - i1h1x, - r1h1y, - i1h1y, - r1h1z, - i1h1z, - r1hm2x, - i1hm2x, - r1hm2y, - i1hm2y, - r1hm2z, - i1hm2z); - - *(ckt->CKTrhs + (here->MOS9dNodePrime)) -= temp; - *(ckt->CKTirhs + (here->MOS9dNodePrime)) -= itemp; - *(ckt->CKTrhs + (here->MOS9sNodePrime)) += temp; - *(ckt->CKTirhs + (here->MOS9sNodePrime)) += itemp; - - /* cdrain term over */ - - /* loading gbs term */ - - temp = D1nF12(here->gbs2, - r1h1y, - i1h1y, - r1hm2y, - i1hm2y); - - itemp = D1iF12(here->gbs2, - r1h1y, - i1h1y, - r1hm2y, - i1hm2y); - - - *(ckt->CKTrhs + (here->MOS9bNode)) -= temp; - *(ckt->CKTirhs + (here->MOS9bNode)) -= itemp; - *(ckt->CKTrhs + (here->MOS9sNodePrime)) += temp; - *(ckt->CKTirhs + (here->MOS9sNodePrime)) += itemp; - - /* gbs over */ - - /* loading gbd term */ - - temp = D1nF12(here->gbd2, - r1h1y - r1h1z, - i1h1y - i1h1z, - r1hm2y - r1hm2z, - i1hm2y - i1hm2z); - - itemp = D1iF12(here->gbd2, - r1h1y - r1h1z, - i1h1y - i1h1z, - r1hm2y - r1hm2z, - i1hm2y - i1hm2z); - - - *(ckt->CKTrhs + (here->MOS9bNode)) -= temp; - *(ckt->CKTirhs + (here->MOS9bNode)) -= itemp; - *(ckt->CKTrhs + (here->MOS9dNodePrime)) += temp; - *(ckt->CKTirhs + (here->MOS9dNodePrime)) += itemp; - - /* gbd over */ - - /* loading capgs term */ - - temp = -ckt->CKTomega * - D1iF12(here->capgs2, - r1h1x, - i1h1x, - r1hm2x, - i1hm2x); - - itemp = ckt->CKTomega * - D1nF12(here->capgs2, - r1h1x, - i1h1x, - r1hm2x, - i1hm2x); - - *(ckt->CKTrhs + (here->MOS9gNode)) -= temp; - *(ckt->CKTirhs + (here->MOS9gNode)) -= itemp; - *(ckt->CKTrhs + (here->MOS9sNodePrime)) += temp; - *(ckt->CKTirhs + (here->MOS9sNodePrime)) += itemp; - - /* capgs over */ - - /* loading capgd term */ - - temp = -ckt->CKTomega * - D1iF12(here->capgd2, - r1h1x - r1h1z, - i1h1x - i1h1z, - r1hm2x - r1hm2z, - i1hm2x - i1hm2z); - - itemp = ckt->CKTomega * - D1nF12(here->capgd2, - r1h1x - r1h1z, - i1h1x - i1h1z, - r1hm2x - r1hm2z, - i1hm2x - i1hm2z); - - - *(ckt->CKTrhs + (here->MOS9gNode)) -= temp; - *(ckt->CKTirhs + (here->MOS9gNode)) -= itemp; - *(ckt->CKTrhs + (here->MOS9dNodePrime)) += temp; - *(ckt->CKTirhs + (here->MOS9dNodePrime)) += itemp; - - /* capgd over */ - /* loading capgb term */ - - temp = -ckt->CKTomega * - D1iF12(here->capgb2, - r1h1x - r1h1y, - i1h1x - i1h1y, - r1hm2x - r1hm2y, - i1hm2x - i1hm2y); - - itemp = ckt->CKTomega * - D1nF12(here->capgb2, - r1h1x - r1h1y, - i1h1x - i1h1y, - r1hm2x - r1hm2y, - i1hm2x - i1hm2y); - - *(ckt->CKTrhs + (here->MOS9gNode)) -= temp; - *(ckt->CKTirhs + (here->MOS9gNode)) -= itemp; - *(ckt->CKTrhs + (here->MOS9bNode)) += temp; - *(ckt->CKTirhs + (here->MOS9bNode)) += itemp; - - /* capgb over */ - - /* loading capbs term */ - - temp = -ckt->CKTomega * - D1iF12(here->capbs2, - r1h1y, - i1h1y, - r1hm2y, - i1hm2y); - - itemp = ckt->CKTomega * - D1nF12(here->capbs2, - r1h1y, - i1h1y, - r1hm2y, - i1hm2y); - - - *(ckt->CKTrhs + (here->MOS9bNode)) -= temp; - *(ckt->CKTirhs + (here->MOS9bNode)) -= itemp; - *(ckt->CKTrhs + (here->MOS9sNodePrime)) += temp; - *(ckt->CKTirhs + (here->MOS9sNodePrime)) += itemp; - - /* capbs over */ - - /* loading capbd term */ - - temp = -ckt->CKTomega * - D1iF12(here->capbd2, - r1h1y - r1h1z, - i1h1y - i1h1z, - r1hm2y - r1hm2z, - i1hm2y - i1hm2z); - - itemp = ckt->CKTomega * - D1nF12(here->capbd2, - r1h1y - r1h1z, - i1h1y - i1h1z, - r1hm2y - r1hm2z, - i1hm2y - i1hm2z); - - - *(ckt->CKTrhs + (here->MOS9bNode)) -= temp; - *(ckt->CKTirhs + (here->MOS9bNode)) -= itemp; - *(ckt->CKTrhs + (here->MOS9dNodePrime)) += temp; - *(ckt->CKTirhs + (here->MOS9dNodePrime)) += itemp; - - /* capbd over */ - /* all done */ - - break; - case D_2F1MF2: - /* x = vgs, y = vbs z = vds */ - - /* getting first order (linear) Volterra kernel */ - r1h1x = *(job->r1H1ptr + (here->MOS9gNode)) - - *(job->r1H1ptr + (here->MOS9sNodePrime)); - i1h1x = *(job->i1H1ptr + (here->MOS9gNode)) - - *(job->i1H1ptr + (here->MOS9sNodePrime)); - - r1h1y = *(job->r1H1ptr + (here->MOS9bNode)) - - *(job->r1H1ptr + (here->MOS9sNodePrime)); - i1h1y = *(job->i1H1ptr + (here->MOS9bNode)) - - *(job->i1H1ptr + (here->MOS9sNodePrime)); - - r1h1z = *(job->r1H1ptr + (here->MOS9dNodePrime)) - - *(job->r1H1ptr + (here->MOS9sNodePrime)); - i1h1z = *(job->i1H1ptr + (here->MOS9dNodePrime)) - - *(job->i1H1ptr + (here->MOS9sNodePrime)); - - r1hm2x = *(job->r1H2ptr + (here->MOS9gNode)) - - *(job->r1H2ptr + (here->MOS9sNodePrime)); - i1hm2x = -(*(job->i1H2ptr + (here->MOS9gNode)) - - *(job->i1H2ptr + (here->MOS9sNodePrime))); - - r1hm2y = *(job->r1H2ptr + (here->MOS9bNode)) - - *(job->r1H2ptr + (here->MOS9sNodePrime)); - i1hm2y = -(*(job->i1H2ptr + (here->MOS9bNode)) - - *(job->i1H2ptr + (here->MOS9sNodePrime))); - - r1hm2z = *(job->r1H2ptr + (here->MOS9dNodePrime)) - - *(job->r1H2ptr + (here->MOS9sNodePrime)); - i1hm2z = -(*(job->i1H2ptr + (here->MOS9dNodePrime)) - - *(job->i1H2ptr + (here->MOS9sNodePrime))); - - r2h11x = *(job->r1H1ptr + (here->MOS9gNode)) - - *(job->r1H1ptr + (here->MOS9sNodePrime)); - i2h11x = *(job->i1H1ptr + (here->MOS9gNode)) - - *(job->i1H1ptr + (here->MOS9sNodePrime)); - - r2h11y = *(job->r1H1ptr + (here->MOS9bNode)) - - *(job->r1H1ptr + (here->MOS9sNodePrime)); - i2h11y = *(job->i1H1ptr + (here->MOS9bNode)) - - *(job->i1H1ptr + (here->MOS9sNodePrime)); - - r2h11z = *(job->r1H1ptr + (here->MOS9dNodePrime)) - - *(job->r1H1ptr + (here->MOS9sNodePrime)); - i2h11z = *(job->i1H1ptr + (here->MOS9dNodePrime)) - - *(job->i1H1ptr + (here->MOS9sNodePrime)); - - r2h1m2x = *(job->r2H1m2ptr + (here->MOS9gNode)) - - *(job->r2H1m2ptr + (here->MOS9sNodePrime)); - i2h1m2x = *(job->i2H1m2ptr + (here->MOS9gNode)) - - *(job->i2H1m2ptr + (here->MOS9sNodePrime)); - - r2h1m2y = *(job->r2H1m2ptr + (here->MOS9bNode)) - - *(job->r2H1m2ptr + (here->MOS9sNodePrime)); - i2h1m2y = *(job->i2H1m2ptr + (here->MOS9bNode)) - - *(job->i2H1m2ptr + (here->MOS9sNodePrime)); - -r2h1m2z = *(job->r2H1m2ptr + (here->MOS9dNodePrime)) - - *(job->r2H1m2ptr + (here->MOS9sNodePrime)); -i2h1m2z = *(job->i2H1m2ptr + (here->MOS9dNodePrime)) - - *(job->i2H1m2ptr + (here->MOS9sNodePrime)); - - /* loading starts here */ - /* loading cdrain term */ - -pass.cxx = here->cdr_x2; -pass.cyy = here->cdr_y2; -pass.czz = here->cdr_z2; -pass.cxy = here->cdr_xy; -pass.cyz = here->cdr_yz; -pass.cxz = here->cdr_xz; -pass.cxxx = here->cdr_x3; -pass.cyyy = here->cdr_y3; -pass.czzz = here->cdr_z3; -pass.cxxy = here->cdr_x2y; -pass.cxxz = here->cdr_x2z; -pass.cxyy = here->cdr_xy2; -pass.cyyz = here->cdr_y2z; -pass.cxzz = here->cdr_xz2; -pass.cyzz = here->cdr_yz2; -pass.cxyz = here->cdr_xyz; -pass.r1h1x = r1h1x; -pass.i1h1x = i1h1x; -pass.r1h1y = r1h1y; -pass.i1h1y = i1h1y; -pass.r1h1z = r1h1z; -pass.i1h1z = i1h1z; -pass.r1h2x = r1hm2x; -pass.i1h2x = i1hm2x; -pass.r1h2y = r1hm2y; -pass.i1h2y = i1hm2y; -pass.r1h2z = r1hm2z; -pass.i1h2z = i1hm2z; -pass.r2h11x = r2h11x; -pass.i2h11x = i2h11x; -pass.r2h11y = r2h11y; -pass.i2h11y = i2h11y; -pass.r2h11z = r2h11z; -pass.i2h11z = i2h11z; -pass.h2f1f2x = r2h1m2x; -pass.ih2f1f2x = i2h1m2x; -pass.h2f1f2y = r2h1m2y; -pass.ih2f1f2y = i2h1m2y; -pass.h2f1f2z = r2h1m2z; -pass.ih2f1f2z = i2h1m2z; - temp = DFn2F12(&pass); - - itemp = DFi2F12(&pass); - - - *(ckt->CKTrhs + (here->MOS9dNodePrime)) -= temp; - *(ckt->CKTirhs + (here->MOS9dNodePrime)) -= itemp; - *(ckt->CKTrhs + (here->MOS9sNodePrime)) += temp; - *(ckt->CKTirhs + (here->MOS9sNodePrime)) += itemp; - - /* cdrain term over */ - - /* loading gbs term */ - - temp = D1n2F12(here->gbs2, - here->gbs3, - r1h1y, - i1h1y, - r1hm2y, - i1hm2y, - r2h11y, - i2h11y, - r2h1m2y, - i2h1m2y); - - - - itemp = D1i2F12(here->gbs2, - here->gbs3, - r1h1y, - i1h1y, - r1hm2y, - i1hm2y, - r2h11y, - i2h11y, - r2h1m2y, - i2h1m2y); - - - *(ckt->CKTrhs + (here->MOS9bNode)) -= temp; - *(ckt->CKTirhs + (here->MOS9bNode)) -= itemp; - *(ckt->CKTrhs + (here->MOS9sNodePrime)) += temp; - *(ckt->CKTirhs + (here->MOS9sNodePrime)) += itemp; - - /* gbs over */ - - /* loading gbd term */ - - temp = D1n2F12(here->gbd2, - here->gbd3, - r1h1y - r1h1z, - i1h1y - i1h1z, - r1hm2y - r1hm2z, - i1hm2y - i1hm2z, - r2h11y - r2h11z, - i2h11y - i2h11z, - r2h1m2y - r2h1m2z, - i2h1m2y - i2h1m2z); - - itemp = D1i2F12(here->gbd2, - here->gbd3, - r1h1y - r1h1z, - i1h1y - i1h1z, - r1hm2y - r1hm2z, - i1hm2y - i1hm2z, - r2h11y - r2h11z, - i2h11y - i2h11z, - r2h1m2y - r2h1m2z, - i2h1m2y - i2h1m2z); - - *(ckt->CKTrhs + (here->MOS9bNode)) -= temp; - *(ckt->CKTirhs + (here->MOS9bNode)) -= itemp; - *(ckt->CKTrhs + (here->MOS9dNodePrime)) += temp; - *(ckt->CKTirhs + (here->MOS9dNodePrime)) += itemp; - - /* gbd over */ - - /* loading capgs term */ - - temp = -ckt->CKTomega * - D1i2F12(here->capgs2, - here->capgs3, - r1h1x, - i1h1x, - r1hm2x, - i1hm2x, - r2h11x, - i2h11x, - r2h1m2x, - i2h1m2x); - - itemp = ckt->CKTomega * - D1n2F12(here->capgs2, - here->capgs3, - r1h1x, - i1h1x, - r1hm2x, - i1hm2x, - r2h11x, - i2h11x, - r2h1m2x, - i2h1m2x); - - *(ckt->CKTrhs + (here->MOS9gNode)) -= temp; - *(ckt->CKTirhs + (here->MOS9gNode)) -= itemp; - *(ckt->CKTrhs + (here->MOS9sNodePrime)) += temp; - *(ckt->CKTirhs + (here->MOS9sNodePrime)) += itemp; - - /* capgs over */ - - /* loading capgd term */ - - temp = -ckt->CKTomega * - D1i2F12(here->capgd2, - here->capgd3, - r1h1x - r1h1z, - i1h1x - i1h1z, - r1hm2x - r1hm2z, - i1hm2x - i1hm2z, - r2h11x - r2h11z, - i2h11x - i2h11z, - r2h1m2x - r2h1m2z, - i2h1m2x - i2h1m2z); - - itemp = ckt->CKTomega * - D1n2F12(here->capgd2, - here->capgd3, - r1h1x - r1h1z, - i1h1x - i1h1z, - r1hm2x - r1hm2z, - i1hm2x - i1hm2z, - r2h11x - r2h11z, - i2h11x - i2h11z, - r2h1m2x - r2h1m2z, - i2h1m2x - i2h1m2z); - - - *(ckt->CKTrhs + (here->MOS9gNode)) -= temp; - *(ckt->CKTirhs + (here->MOS9gNode)) -= itemp; - *(ckt->CKTrhs + (here->MOS9dNodePrime)) += temp; - *(ckt->CKTirhs + (here->MOS9dNodePrime)) += itemp; - - /* capgd over */ - /* loading capgb term */ - - temp = -ckt->CKTomega * - D1i2F12(here->capgb2, - here->capgb3, - r1h1x - r1h1y, - i1h1x - i1h1y, - r1hm2x - r1hm2y, - i1hm2x - i1hm2y, - r2h11x - r2h11y, - i2h11x - i2h11y, - r2h1m2x - r2h1m2y, - i2h1m2x - i2h1m2y); - - itemp = ckt->CKTomega * - D1n2F12(here->capgb2, - here->capgb3, - r1h1x - r1h1y, - i1h1x - i1h1y, - r1hm2x - r1hm2y, - i1hm2x - i1hm2y, - r2h11x - r2h11y, - i2h11x - i2h11y, - r2h1m2x - r2h1m2y, - i2h1m2x - i2h1m2y); - - *(ckt->CKTrhs + (here->MOS9gNode)) -= temp; - *(ckt->CKTirhs + (here->MOS9gNode)) -= itemp; - *(ckt->CKTrhs + (here->MOS9bNode)) += temp; - *(ckt->CKTirhs + (here->MOS9bNode)) += itemp; - - /* capgb over */ - - /* loading capbs term */ - - temp = -ckt->CKTomega * - D1i2F12(here->capbs2, - here->capbs3, - r1h1y, - i1h1y, - r1hm2y, - i1hm2y, - r2h11y, - i2h11y, - r2h1m2y, - i2h1m2y); - - itemp = ckt->CKTomega * - D1n2F12(here->capbs2, - here->capbs3, - r1h1y, - i1h1y, - r1hm2y, - i1hm2y, - r2h11y, - i2h11y, - r2h1m2y, - i2h1m2y); - - - *(ckt->CKTrhs + (here->MOS9bNode)) -= temp; - *(ckt->CKTirhs + (here->MOS9bNode)) -= itemp; - *(ckt->CKTrhs + (here->MOS9sNodePrime)) += temp; - *(ckt->CKTirhs + (here->MOS9sNodePrime)) += itemp; - - /* capbs over */ - - /* loading capbd term */ - - temp = -ckt->CKTomega * - D1i2F12(here->capbd2, - here->capbd3, - r1h1y - r1h1z, - i1h1y - i1h1z, - r1hm2y - r1hm2z, - i1hm2y - i1hm2z, - r2h11y - r2h11z, - i2h11y - i2h11z, - r2h1m2y - r2h1m2z, - i2h1m2y - i2h1m2z); - - itemp = ckt->CKTomega * - D1n2F12(here->capbd2, - here->capbd3, - r1h1y - r1h1z, - i1h1y - i1h1z, - r1hm2y - r1hm2z, - i1hm2y - i1hm2z, - r2h11y - r2h11z, - i2h11y - i2h11z, - r2h1m2y - r2h1m2z, - i2h1m2y - i2h1m2z); - - - *(ckt->CKTrhs + (here->MOS9bNode)) -= temp; - *(ckt->CKTirhs + (here->MOS9bNode)) -= itemp; - *(ckt->CKTrhs + (here->MOS9dNodePrime)) += temp; - *(ckt->CKTirhs + (here->MOS9dNodePrime)) += itemp; - - /* capbd over */ - /* all done */ - - break; - default: -; - } - } -} -return(OK); -} - else - return(E_BADPARM); -} diff --git a/src/spicelib/devices/mos9/mos9dset.c b/src/spicelib/devices/mos9/mos9dset.c deleted file mode 100644 index 00f38aa80..000000000 --- a/src/spicelib/devices/mos9/mos9dset.c +++ /dev/null @@ -1,964 +0,0 @@ -/********** -Copyright 1990 Regents of the University of California. All rights reserved. -Author: 1988 Jaijeet S Roychowdhury -Modified: Alan Gillespie -**********/ - -#include "ngspice/ngspice.h" -#include "ngspice/cktdefs.h" -#include "ngspice/devdefs.h" -#include "mos9defs.h" -#include "ngspice/trandefs.h" -#include "ngspice/distodef.h" -#include "ngspice/const.h" -#include "ngspice/sperror.h" -#include "ngspice/suffix.h" - -int -MOS9dSetup(GENmodel *inModel, CKTcircuit *ckt) - /* actually load the current value into the - * sparse matrix previously provided - */ -{ - MOS9model *model = (MOS9model *)inModel; - MOS9instance *here; - double Beta; - double DrainSatCur; - double EffectiveLength; - double EffectiveWidth; - double GateBulkOverlapCap; - double GateDrainOverlapCap; - double GateSourceOverlapCap; - double OxideCap; - double SourceSatCur; - double arg; - double cdrain; - double evbs; - double sarg; - double sargsw; - double lvgs; - double vbd; - double vbs; - double vds; - double vdsat; - double vgb; - double vgd; - double vgs; - double von; - double lcapgs2,lcapgs3; /* total gate-source capacitance */ - double lcapgd2,lcapgd3; /* total gate-drain capacitance */ - double lcapgb2,lcapgb3; /* total gate-bulk capacitance */ - double lgbs, lgbs2, lgbs3; - double lgbd, lgbd2, lgbd3; - double gm2, gb2, gds2, gmb, gmds, gbds; - double gm3, gb3, gds3, gm2ds, gm2b, gb2ds, gbds2, gmb2, gmds2, gmbds; - double lcapbd, lcapbd2, lcapbd3; - double lcapbs, lcapbs2, lcapbs3; - double ebd; - double vt; /* vt at instance temperature */ - Dderivs d_cdrain; - - - - /* loop through all the MOS9 device models */ - for( ; model != NULL; model = MOS9nextModel(model)) { - - /* loop through all the instances of the model */ - for (here = MOS9instances(model); here != NULL ; - here=MOS9nextInstance(here)) { - - vt = CONSTKoverQ * here->MOS9temp; - - - /* first, we compute a few useful values - these could be - * pre-computed, but for historical reasons are still done - * here. They may be moved at the expense of instance size - */ - - EffectiveWidth=here->MOS9w-2*model->MOS9widthNarrow+ - model->MOS9widthAdjust; - EffectiveLength=here->MOS9l - 2*model->MOS9latDiff+ - model->MOS9lengthAdjust; - - if( (here->MOS9tSatCurDens == 0) || - (here->MOS9drainArea == 0) || - (here->MOS9sourceArea == 0)) { - DrainSatCur = here->MOS9m * here->MOS9tSatCur; - SourceSatCur = here->MOS9m * here->MOS9tSatCur; - } else { - DrainSatCur = here->MOS9tSatCurDens * - here->MOS9m * here->MOS9drainArea; - SourceSatCur = here->MOS9tSatCurDens * - here->MOS9m * here->MOS9sourceArea; - } - GateSourceOverlapCap = model->MOS9gateSourceOverlapCapFactor * - here->MOS9m * EffectiveWidth; - GateDrainOverlapCap = model->MOS9gateDrainOverlapCapFactor * - here->MOS9m * EffectiveWidth; - GateBulkOverlapCap = model->MOS9gateBulkOverlapCapFactor * - here->MOS9m * EffectiveLength; - Beta = here->MOS9tTransconductance * here->MOS9m * - EffectiveWidth/EffectiveLength; - OxideCap = model->MOS9oxideCapFactor * EffectiveLength * - here->MOS9m * EffectiveWidth; - - - /* - * ok - now to do the start-up operations - * - * we must get values for vbs, vds, and vgs from somewhere - * so we either predict them or recover them from last iteration - * These are the two most common cases - either a prediction - * step or the general iteration step and they - * share some code, so we put them first - others later on - */ - - - /* general iteration */ - - vbs = model->MOS9type * ( - *(ckt->CKTrhsOld+here->MOS9bNode) - - *(ckt->CKTrhsOld+here->MOS9sNodePrime)); - vgs = model->MOS9type * ( - *(ckt->CKTrhsOld+here->MOS9gNode) - - *(ckt->CKTrhsOld+here->MOS9sNodePrime)); - vds = model->MOS9type * ( - *(ckt->CKTrhsOld+here->MOS9dNodePrime) - - *(ckt->CKTrhsOld+here->MOS9sNodePrime)); - - /* now some common crunching for some more useful quantities */ - - - - /* - * now all the preliminaries are over - we can start doing the - * real work - */ - vbd = vbs - vds; - vgd = vgs - vds; - vgb = vgs - vbs; - - /* bulk-source and bulk-drain doides - * here we just evaluate the ideal diode current and the - * correspoinding derivative (conductance). - */ -/*next1:*/ if(vbs <= 0) { - lgbs = SourceSatCur/vt; - lgbs += ckt->CKTgmin; - lgbs2 = lgbs3 = 0; - } else { - evbs = exp(MIN(MAX_EXP_ARG,vbs/vt)); - lgbs = SourceSatCur*evbs/vt + ckt->CKTgmin; - lgbs2 = model->MOS9type *0.5 * (lgbs - ckt->CKTgmin)/vt; - lgbs3 = model->MOS9type *lgbs2/(vt*3); - - } - if(vbd <= 0) { - lgbd = DrainSatCur/vt; - lgbd += ckt->CKTgmin; - lgbd2 = lgbd3 = 0; - } else { - ebd = exp(MIN(MAX_EXP_ARG,vbd/vt)); - lgbd = DrainSatCur*ebd/vt +ckt->CKTgmin; - lgbd2 = model->MOS9type *0.5 * (lgbd - ckt->CKTgmin)/vt; - lgbd3 = model->MOS9type *lgbd2/(vt*3); - } - - - /* now to determine whether the user was able to correctly - * identify the source and drain of his device - */ - if(vds >= 0) { - /* normal mode */ - here->MOS9mode = 1; - } else { - /* inverse mode */ - here->MOS9mode = -1; - } - - { - /* - * subroutine moseq3(vds,vbs,vgs,gm,gds,gmbs, - * qg,qc,qb,cggb,cgdb,cgsb,cbgb,cbdb,cbsb) - */ - - /* - * this routine evaluates the drain current, its derivatives and - * the charges associated with the gate, channel and bulk - * for mosfets based on semi-empirical equations - */ - - /* - common /mosarg/ vto,beta,gamma,phi,phib,cox,xnsub,xnfs,xd,xj,xld, - 1 xlamda,uo,uexp,vbp,utra,vmax,xneff,xl,xw,vbi,von,vdsat,qspof, - 2 beta0,beta1,cdrain,xqco,xqc,fnarrw,fshort,lev - common /status/ omega,time,delta,delold(7),ag(7),vt,xni,egfet, - 1 xmu,sfactr,mode,modedc,icalc,initf,method,iord,maxord,noncon, - 2 iterno,itemno,nosolv,modac,ipiv,ivmflg,ipostp,iscrch,iofile - common /knstnt/ twopi,xlog2,xlog10,root2,rad,boltz,charge,ctok, - 1 gmin,reltol,abstol,vntol,trtol,chgtol,eps0,epssil,epsox, - 2 pivtol,pivrel - */ - - /* equivalence (xlamda,alpha),(vbp,theta),(uexp,eta),(utra,xkappa)*/ - - double coeff0 = 0.0631353e0; - double coeff1 = 0.8013292e0; - double coeff2 = -0.01110777e0; - double oneoverxl; /* 1/effective length */ - double eta; /* eta from model after length factor */ - double phibs; /* phi - vbs */ - double sqphbs; /* square root of phibs */ - double sqphis; /* square root of phi */ - double wps; - double oneoverxj; /* 1/junction depth */ - double xjonxl; /* junction depth/effective length */ - double djonxj; - double wponxj; - double arga; - double argb; - double argc; - double gammas; - double fbodys; - double fbody; - double onfbdy; - double qbonco; - double vbix; - double wconxj; - double vth; - double csonco; - double cdonco; - double vgsx; - double onfg; - double fgate; - double us; - double xn = 0.0; - double vdsc; - double onvdsc = 0.0; - double vdsx; - double cdnorm; - double cdo; - double fdrain = 0.0; - double gdsat; - double cdsat; - double emax; - double delxl; - double dlonxl; - double xlfact; - double ondvt; - double onxn; - double wfact; - double fshort; - double lvds, lvbs, lvbd; - Dderivs d_onxn, d_ondvt, d_wfact, d_MOS9gds; - Dderivs d_emax, d_delxl, d_dlonxl, d_xlfact; - Dderivs d_cdonco, d_fdrain, d_cdsat, d_gdsat; - Dderivs d_vdsx, d_cdo, d_cdnorm, d_Beta, d_dummy; - Dderivs d_vdsc, d_onvdsc, d_arga, d_argb; - Dderivs d_onfg, d_fgate, d_us, d_vgsx; - Dderivs d_von, d_xn, d_vth, d_onfbdy, d_qbonco, d_vbix; - Dderivs d_argc, d_fshort, d_gammas, d_fbodys, d_fbody; - Dderivs d_wps, d_wconxj, d_wponxj; - Dderivs d_phibs, d_sqphbs; - Dderivs d_p, d_q, d_r, d_zero, d_vdsat; - - /* - * bypasses the computation of charges - */ - if (here->MOS9mode == 1) { - lvgs = vgs; - lvds = vds; - lvbs = vbs; - lvbd = vbd; - } else { - lvgs = vgd; - lvds = -vds; - lvbs = vbd; - lvbd = vbs; - } - - /* - * reference cdrain equations to source and - * charge equations to bulk - */ -d_p.value = 0.0; -d_p.d1_p = 1.0; -d_p.d1_q = 0.0; -d_p.d1_r = 0.0; -d_p.d2_p2 = 0.0; -d_p.d2_q2 = 0.0; -d_p.d2_r2 = 0.0; -d_p.d2_pq = 0.0; -d_p.d2_qr = 0.0; -d_p.d2_pr = 0.0; -d_p.d3_p3 = 0.0; -d_p.d3_q3 = 0.0; -d_p.d3_r3 = 0.0; -d_p.d3_p2r = 0.0; -d_p.d3_p2q = 0.0; -d_p.d3_q2r = 0.0; -d_p.d3_pq2 = 0.0; -d_p.d3_pr2 = 0.0; -d_p.d3_qr2 = 0.0; -d_p.d3_pqr = 0.0; - EqualDeriv(&d_q,&d_p); - EqualDeriv(&d_r,&d_p); - EqualDeriv(&d_zero,&d_p); - d_q.d1_p = d_r.d1_p = d_zero.d1_p = 0.0; - d_q.d1_q = d_r.d1_r = 1.0; - vdsat = 0.0; - EqualDeriv(&d_vdsat,&d_zero); - oneoverxl = 1.0/EffectiveLength;/*const*/ - eta = model->MOS9eta * 8.15e-22/(model->MOS9oxideCapFactor* - EffectiveLength*EffectiveLength*EffectiveLength);/*const*/ - /* - *.....square root term - */ - if ( lvbs <= 0.0 ) { - phibs = here->MOS9tPhi-lvbs; - EqualDeriv(&d_phibs,&d_q); - d_phibs.value = lvbs; - TimesDeriv(&d_phibs,&d_phibs,-1.0); - d_phibs.value += here->MOS9tPhi; - sqphbs = sqrt(phibs); - SqrtDeriv(&d_sqphbs,&d_phibs); - } else { - sqphis = sqrt(here->MOS9tPhi);/*const*/ - /*sqphs3 = here->MOS9tPhi*sqphis;const*/ - sqphbs = sqphis/(1.0+lvbs/ - (here->MOS9tPhi+here->MOS9tPhi)); - EqualDeriv(&d_sqphbs,&d_q); d_sqphbs.value = lvbs; - TimesDeriv(&d_sqphbs,&d_sqphbs,1/(here->MOS9tPhi+here->MOS9tPhi)); - d_sqphbs.value += 1.0; - InvDeriv(&d_sqphbs,&d_sqphbs); - TimesDeriv(&d_sqphbs,&d_sqphbs,sqphis); - phibs = sqphbs*sqphbs; - MultDeriv(&d_phibs,&d_sqphbs,&d_sqphbs); - } - /* - *.....short channel effect factor - */ - if ( (model->MOS9junctionDepth != 0.0) && - (model->MOS9coeffDepLayWidth != 0.0) ) { - wps = model->MOS9coeffDepLayWidth*sqphbs; - TimesDeriv(&d_wps,&d_sqphbs,model->MOS9coeffDepLayWidth); - oneoverxj = 1.0/model->MOS9junctionDepth;/*const*/ - xjonxl = model->MOS9junctionDepth*oneoverxl;/*const*/ - djonxj = model->MOS9latDiff*oneoverxj;/*const*/ - wponxj = wps*oneoverxj; - TimesDeriv(&d_wponxj,&d_wps,oneoverxj); - wconxj = coeff0+coeff1*wponxj+coeff2*wponxj*wponxj; - TimesDeriv(&d_wconxj,&d_wponxj,coeff2); - d_wconxj.value += coeff1; - MultDeriv(&d_wconxj,&d_wconxj,&d_wponxj); - d_wconxj.value += coeff0; - arga = wconxj + djonxj; - EqualDeriv(&d_arga,&d_wconxj); d_arga.value += djonxj; - argc = wponxj/(1.0+wponxj); - EqualDeriv(&d_argc,&d_wponxj); - d_argc.value += 1.0; - InvDeriv(&d_argc,&d_argc); - MultDeriv(&d_argc,&d_argc,&d_wponxj); - argb = sqrt(1.0-argc*argc); - MultDeriv(&d_argb,&d_argc,&d_argc); - TimesDeriv(&d_argb,&d_argb,-1.0); - d_argb.value += 1.0; - SqrtDeriv(&d_argb,&d_argb); - - fshort = 1.0-xjonxl*(arga*argb-djonxj); - MultDeriv(&d_fshort,&d_arga,&d_argb); - d_fshort.value -= djonxj; - TimesDeriv(&d_fshort,&d_fshort,-xjonxl); - d_fshort.value += 1.0; - } else { - fshort = 1.0; - EqualDeriv(&d_fshort,&d_zero); - d_fshort.value = 1.0; - - } - /* - *.....body effect - */ - gammas = model->MOS9gamma*fshort; - TimesDeriv(&d_gammas,&d_fshort,model->MOS9gamma); - fbodys = 0.5*gammas/(sqphbs+sqphbs); - DivDeriv(&d_fbodys,&d_gammas,&d_sqphbs); - TimesDeriv(&d_fbodys,&d_fbodys,0.25); - fbody = fbodys+model->MOS9narrowFactor/EffectiveWidth; - EqualDeriv(&d_fbody,&d_fbodys); - d_fbody.value += fbody - fbodys; - - onfbdy = 1.0/(1.0+fbody); - EqualDeriv(&d_onfbdy,&d_fbody); - d_onfbdy.value += 1.0; - InvDeriv(&d_onfbdy,&d_onfbdy); - qbonco =gammas*sqphbs+model->MOS9narrowFactor*phibs/EffectiveWidth; - EqualDeriv(&d_dummy,&d_phibs); - TimesDeriv(&d_dummy,&d_dummy,model->MOS9narrowFactor*EffectiveWidth); - MultDeriv(&d_qbonco,&d_gammas,&d_sqphbs); - PlusDeriv(&d_qbonco,&d_qbonco,&d_dummy); - /* - *.....static feedback effect - */ - vbix = here->MOS9tVbi*model->MOS9type-eta*(lvds); - EqualDeriv(&d_vbix,&d_r); d_vbix.value = vbix; - d_vbix.d1_r = -eta; - /* - *.....threshold voltage - */ - vth = vbix+qbonco; - PlusDeriv(&d_vth,&d_vbix,&d_qbonco); - /* - *.....joint weak inversion and strong inversion - */ - von = vth; - EqualDeriv(&d_von,&d_vth); - if ( model->MOS9fastSurfaceStateDensity != 0.0 ) { - csonco = CHARGE*model->MOS9fastSurfaceStateDensity * - 1e4 /*(cm**2/m**2)*/ *EffectiveLength*EffectiveWidth * - here->MOS9m/OxideCap; /*const*/ - cdonco = 0.5*qbonco/phibs; - DivDeriv(&d_cdonco,&d_qbonco,&d_phibs); - TimesDeriv(&d_cdonco,&d_cdonco,0.5); - xn = 1.0+csonco+cdonco; - EqualDeriv(&d_xn,&d_cdonco); - d_xn.value += 1.0 + csonco; - von = vth+vt*xn; - TimesDeriv(&d_von,&d_xn,vt); - PlusDeriv(&d_von,&d_von,&d_vth); - - - } else { - /* - *.....cutoff region - */ - if ( lvgs <= von ) { - cdrain = 0.0; - EqualDeriv(&d_cdrain,&d_zero); - goto innerline1000; - } - } - /* - *.....device is on - */ - vgsx = MAX(lvgs,von); -if (lvgs >= von) { -EqualDeriv(&d_vgsx,&d_p); -d_vgsx.value = lvgs; -} else { -EqualDeriv(&d_vgsx,&d_von); -} - /* - *.....mobility modulation by gate voltage - */ - onfg = 1.0+model->MOS9theta*(vgsx-vth); - TimesDeriv(&d_onfg,&d_vth,-1.0); - PlusDeriv(&d_onfg,&d_onfg,&d_vgsx); - TimesDeriv(&d_onfg,&d_onfg,model->MOS9theta); - d_onfg.value += 1.0; - fgate = 1.0/onfg; - InvDeriv(&d_fgate,&d_onfg); - us = here->MOS9tSurfMob * 1e-4 /*(m**2/cm**2)*/ *fgate; - TimesDeriv(&d_us,&d_fgate,here->MOS9tSurfMob * 1e-4); - /* - *.....saturation voltage - */ - vdsat = (vgsx-vth)*onfbdy; - TimesDeriv(&d_vdsat,&d_vth, -1.0); - PlusDeriv(&d_vdsat,&d_vdsat,&d_vgsx); - MultDeriv(&d_vdsat,&d_vdsat,&d_onfbdy); - if ( model->MOS9maxDriftVel <= 0.0 ) { - } else { - vdsc = EffectiveLength*model->MOS9maxDriftVel/us; - InvDeriv(&d_vdsc,&d_us); - TimesDeriv(&d_vdsc,&d_vdsc,EffectiveLength*model->MOS9maxDriftVel); - onvdsc = 1.0/vdsc; - InvDeriv(&d_onvdsc,&d_vdsc); - arga = (vgsx-vth)*onfbdy; - /* note arga = vdsat at this point */ - EqualDeriv(&d_arga,&d_vdsat); - argb = sqrt(arga*arga+vdsc*vdsc); - MultDeriv(&d_dummy,&d_arga,&d_arga); - MultDeriv(&d_argb,&d_vdsc,&d_vdsc); - PlusDeriv(&d_argb,&d_argb,&d_dummy); - SqrtDeriv(&d_argb,&d_argb); - vdsat = arga+vdsc-argb; - TimesDeriv(&d_vdsat,&d_argb,-1.0); - PlusDeriv(&d_vdsat,&d_vdsat,&d_vdsc); - PlusDeriv(&d_vdsat,&d_vdsat,&d_arga); - } - /* - *.....current factors in linear region - */ - vdsx = MIN((lvds),vdsat); -if (lvds < vdsat) { -EqualDeriv(&d_vdsx,&d_r); -d_vdsx.value = lvds; -} else { -EqualDeriv(&d_vdsx,&d_vdsat); -} - - if ( vdsx == 0.0 ) goto line900; - cdo = vgsx-vth-0.5*(1.0+fbody)*vdsx; - EqualDeriv(&d_cdo,&d_fbody); - d_cdo.value += 1.0; - MultDeriv(&d_cdo,&d_cdo,&d_vdsx); - TimesDeriv(&d_cdo,&d_cdo,0.5); - PlusDeriv(&d_cdo,&d_cdo,&d_vth); - TimesDeriv(&d_cdo,&d_cdo,-1.0); - PlusDeriv(&d_cdo,&d_cdo,&d_vgsx); - - - /* - *.....normalized drain current - */ - cdnorm = cdo*vdsx; - MultDeriv(&d_cdnorm,&d_cdo,&d_vdsx); - /* - *.....drain current without velocity saturation effect - */ -/* Beta is a constant till now */ - Beta = Beta*fgate; - TimesDeriv(&d_Beta,&d_fgate,Beta); - cdrain = Beta*cdnorm; - MultDeriv(&d_cdrain,&d_Beta,&d_cdnorm); - /* - *.....velocity saturation factor - */ - if ( model->MOS9maxDriftVel != 0.0 ) { - fdrain = 1.0/(1.0+vdsx*onvdsc); - MultDeriv(&d_fdrain,&d_vdsx,&d_onvdsc); - d_fdrain.value += 1.0; - InvDeriv(&d_fdrain,&d_fdrain); - /* - *.....drain current - */ - cdrain = fdrain*cdrain; - MultDeriv(&d_cdrain,&d_cdrain,&d_fdrain); - Beta = Beta*fdrain; - MultDeriv(&d_Beta,&d_Beta,&d_fdrain); - - } - /* - *.....channel length modulation - */ - if ( (lvds) <= vdsat ) goto line700; - if ( model->MOS9maxDriftVel == 0.0 ) goto line510; - if (model->MOS9alpha == 0.0) goto line700; - cdsat = cdrain; - EqualDeriv(&d_cdsat,&d_cdrain); - gdsat = cdsat*(1.0-fdrain)*onvdsc; - TimesDeriv(&d_dummy,&d_fdrain,-1.0); - d_dummy.value += 1.0; - MultDeriv(&d_gdsat,&d_cdsat,&d_dummy); - MultDeriv(&d_gdsat,&d_gdsat,&d_onvdsc); - gdsat = MAX(1.0e-12,gdsat); - if (gdsat == 1.0e-12) { - EqualDeriv(&d_gdsat,&d_zero); - d_gdsat.value = gdsat; - } - - emax = cdsat*oneoverxl/gdsat; - DivDeriv(&d_emax,&d_cdsat,&d_gdsat); - TimesDeriv(&d_emax,&d_emax,oneoverxl); - - - arga = 0.5*emax*model->MOS9alpha; - TimesDeriv(&d_arga,&d_emax,0.5*model->MOS9alpha); - argc = model->MOS9kappa*model->MOS9alpha;/*const*/ - argb = sqrt(arga*arga+argc*((lvds)-vdsat)); - TimesDeriv(&d_dummy,&d_vdsat,-1.0); - d_dummy.value += lvds; - d_dummy.d1_r += 1.0; - TimesDeriv(&d_argb,&d_dummy,argc); - MultDeriv(&d_dummy,&d_arga,&d_arga); - PlusDeriv(&d_argb,&d_argb,&d_dummy); - SqrtDeriv(&d_argb,&d_argb); - delxl = argb-arga; - TimesDeriv(&d_delxl,&d_arga,-1.0); - PlusDeriv(&d_delxl,&d_argb,&d_delxl); - goto line520; -line510: - delxl = sqrt(model->MOS9kappa*((lvds)-vdsat)*model->MOS9alpha); - TimesDeriv(&d_delxl,&d_vdsat,-1.0); - d_delxl.value += lvds; - d_delxl.d1_r += 1.0; - TimesDeriv(&d_delxl,&d_delxl,model->MOS9kappa*model->MOS9alpha); - SqrtDeriv(&d_delxl,&d_delxl); - - /* - *.....punch through approximation - */ -line520: - if ( delxl > (0.5*EffectiveLength) ) { - delxl = EffectiveLength - (EffectiveLength*EffectiveLength/ - delxl*0.25); - InvDeriv(&d_delxl,&d_delxl); - TimesDeriv(&d_delxl,&d_delxl,-EffectiveLength*EffectiveLength*0.25); - d_delxl.value += EffectiveLength; - } - /* - *.....saturation region - */ - dlonxl = delxl*oneoverxl; - TimesDeriv(&d_dlonxl,&d_delxl,oneoverxl); - xlfact = 1.0/(1.0-dlonxl); - TimesDeriv(&d_xlfact,&d_dlonxl,-1.0); - d_xlfact.value += 1.0; - InvDeriv(&d_xlfact,&d_xlfact); - - cdrain = cdrain*xlfact; - MultDeriv(&d_cdrain,&d_cdrain,&d_xlfact); - /* - *.....finish strong inversion case - */ -line700: - if ( lvgs < von ) { - /* - *.....weak inversion - */ - onxn = 1.0/xn; - InvDeriv(&d_onxn,&d_xn); - ondvt = onxn/vt; - TimesDeriv(&d_ondvt,&d_onxn,1/vt); - wfact = exp( (lvgs-von)*ondvt ); - TimesDeriv(&d_wfact,&d_von,-1.0); - d_wfact.value += lvgs; - d_wfact.d1_p += 1.0; - MultDeriv(&d_wfact,&d_wfact,&d_ondvt); - ExpDeriv(&d_wfact,&d_wfact); - cdrain = cdrain*wfact; - MultDeriv(&d_cdrain,&d_cdrain,&d_wfact); - } - /* - *.....charge computation - */ - goto innerline1000; - /* - *.....special case of vds = 0.0d0 - */ - -line900: - Beta = Beta*fgate; - /* Beta is still a constant */ - TimesDeriv(&d_Beta,&d_fgate,Beta); - cdrain = 0.0; - EqualDeriv(&d_cdrain,&d_zero); - here->MOS9gds = Beta*(vgsx-vth); - TimesDeriv(&d_MOS9gds,&d_vth,-1.0); - PlusDeriv(&d_MOS9gds,&d_MOS9gds,&d_vgsx); - MultDeriv(&d_MOS9gds,&d_MOS9gds,&d_Beta); - if ( (model->MOS9fastSurfaceStateDensity != 0.0) && - (lvgs < von) ) { - here->MOS9gds *=exp((lvgs-von)/(vt*xn)); - TimesDeriv(&d_dummy,&d_von,-1.0); - d_dummy.value += lvgs; - d_dummy.d1_p += 1.0; - DivDeriv(&d_dummy,&d_dummy,&d_xn); - TimesDeriv(&d_dummy,&d_dummy,1/vt); - ExpDeriv(&d_dummy,&d_dummy); - MultDeriv(&d_MOS9gds,&d_MOS9gds,&d_dummy); - } - d_cdrain.d1_r = d_MOS9gds.value; - d_cdrain.d2_r2 = d_MOS9gds.d1_r; - d_cdrain.d3_r3 = d_MOS9gds.d2_r2; - - - -innerline1000:; - /* - *.....done - */ - } - - - /* - * COMPUTE EQUIVALENT DRAIN CURRENT SOURCE - */ - /* - * now we do the hard part of the bulk-drain and bulk-source - * diode - we evaluate the non-linear capacitance and - * charge - * - * the basic equations are not hard, but the implementation - * is somewhat long in an attempt to avoid log/exponential - * evaluations - */ - /* - * charge storage elements - * - *.. bulk-drain and bulk-source depletion capacitances - */ - if (vbs < here->MOS9tDepCap){ - arg=1-vbs/here->MOS9tBulkPot; - /* - * the following block looks somewhat long and messy, - * but since most users use the default grading - * coefficients of .5, and sqrt is MUCH faster than an - * exp(log()) we use this special case code to buy time. - * (as much as 10% of total job time!) - */ - if(model->MOS9bulkJctBotGradingCoeff == - model->MOS9bulkJctSideGradingCoeff) { - if(model->MOS9bulkJctBotGradingCoeff == .5) { - sarg = sargsw = 1/sqrt(arg); - } else { - sarg = sargsw = - exp(-model->MOS9bulkJctBotGradingCoeff* - log(arg)); - } - } else { - if(model->MOS9bulkJctBotGradingCoeff == .5) { - sarg = 1/sqrt(arg); - } else { - sarg = exp(-model->MOS9bulkJctBotGradingCoeff* - log(arg)); - } - if(model->MOS9bulkJctSideGradingCoeff == .5) { - sargsw = 1/sqrt(arg); - } else { - sargsw =exp(-model->MOS9bulkJctSideGradingCoeff* - log(arg)); - } - } - lcapbs=here->MOS9Cbs*sarg+ - here->MOS9Cbssw*sargsw; - lcapbs2 = model->MOS9type*0.5/here->MOS9tBulkPot*( - here->MOS9Cbs*model->MOS9bulkJctBotGradingCoeff* - sarg/arg + here->MOS9Cbssw* - model->MOS9bulkJctSideGradingCoeff*sargsw/arg); - lcapbs3 = here->MOS9Cbs*sarg* - model->MOS9bulkJctBotGradingCoeff* - (model->MOS9bulkJctBotGradingCoeff+1); - lcapbs3 += here->MOS9Cbssw*sargsw* - model->MOS9bulkJctSideGradingCoeff* - (model->MOS9bulkJctSideGradingCoeff+1); - lcapbs3 = lcapbs3/(6*here->MOS9tBulkPot* - here->MOS9tBulkPot*arg*arg); - } else { - /* *(ckt->CKTstate0 + here->MOS9qbs)= here->MOS9f4s + - vbs*(here->MOS9f2s+vbs*(here->MOS9f3s/2));*/ - lcapbs=here->MOS9f2s+here->MOS9f3s*vbs; - lcapbs2 = 0.5*here->MOS9f3s; - lcapbs3 = 0; - } - if (vbd < here->MOS9tDepCap) { - arg=1-vbd/here->MOS9tBulkPot; - /* - * the following block looks somewhat long and messy, - * but since most users use the default grading - * coefficients of .5, and sqrt is MUCH faster than an - * exp(log()) we use this special case code to buy time. - * (as much as 10% of total job time!) - */ - if(model->MOS9bulkJctBotGradingCoeff == .5 && - model->MOS9bulkJctSideGradingCoeff == .5) { - sarg = sargsw = 1/sqrt(arg); - } else { - if(model->MOS9bulkJctBotGradingCoeff == .5) { - sarg = 1/sqrt(arg); - } else { - sarg = exp(-model->MOS9bulkJctBotGradingCoeff* - log(arg)); - } - if(model->MOS9bulkJctSideGradingCoeff == .5) { - sargsw = 1/sqrt(arg); - } else { - sargsw =exp(-model->MOS9bulkJctSideGradingCoeff* - log(arg)); - } - } - lcapbd=here->MOS9Cbd*sarg+ - here->MOS9Cbdsw*sargsw; - lcapbd2 = model->MOS9type*0.5/here->MOS9tBulkPot*( - here->MOS9Cbd*model->MOS9bulkJctBotGradingCoeff* - sarg/arg + here->MOS9Cbdsw* - model->MOS9bulkJctSideGradingCoeff*sargsw/arg); - lcapbd3 = here->MOS9Cbd*sarg* - model->MOS9bulkJctBotGradingCoeff* - (model->MOS9bulkJctBotGradingCoeff+1); - lcapbd3 += here->MOS9Cbdsw*sargsw* - model->MOS9bulkJctSideGradingCoeff* - (model->MOS9bulkJctSideGradingCoeff+1); - lcapbd3 = lcapbd3/(6*here->MOS9tBulkPot* - here->MOS9tBulkPot*arg*arg); - } else { - lcapbd=here->MOS9f2d + vbd * here->MOS9f3d; - lcapbd2=0.5*here->MOS9f3d; - lcapbd3=0; - } - /* - * meyer's capacitor model - */ - /* - * the meyer capacitance equations are in DEVqmeyer - * these expressions are derived from those equations. - * these expressions are incorrect; they assume just one - * controlling variable for each charge storage element - * while actually there are several; the MOS9 small - * signal ac linear model is also wrong because it - * ignores controlled capacitive elements. these can be - * corrected (as can the linear ss ac model) if the - * expressions for the charge are available - */ - - -{ - - - double phi; - double cox; - double vddif; - double vddif1; - double vddif2; - double vgst; - /* von, lvgs and vdsat have already been adjusted for - possible source-drain interchange */ - - - - vgst = lvgs -von; - phi = here->MOS9tPhi; - cox = OxideCap; - if (vgst <= -phi) { - lcapgb2=lcapgb3=lcapgs2=lcapgs3=lcapgd2=lcapgd3=0; - } else if (vgst <= -phi/2) { - lcapgb2= -cox/(4*phi); - lcapgb3=lcapgs2=lcapgs3=lcapgd2=lcapgd3=0; - } else if (vgst <= 0) { - lcapgb2= -cox/(4*phi); - lcapgb3=lcapgs3=lcapgd2=lcapgd3=0; - lcapgs2 = cox/(3*phi); - } else { /* the MOS9modes are around because - vds has not been adjusted */ - if (vdsat <= here->MOS9mode*vds) { - lcapgb2=lcapgb3=lcapgs2=lcapgs3=lcapgd2=lcapgd3=0; - } else { - vddif = 2.0*vdsat-here->MOS9mode*vds; - vddif1 = vdsat-here->MOS9mode*vds/*-1.0e-12*/; - vddif2 = vddif*vddif; - lcapgd2 = -vdsat*here->MOS9mode*vds*cox/(3*vddif*vddif2); - lcapgd3 = - here->MOS9mode*vds*cox*(vddif - 6*vdsat)/(9*vddif2*vddif2); - lcapgs2 = -vddif1*here->MOS9mode*vds*cox/(3*vddif*vddif2); - lcapgs3 = - here->MOS9mode*vds*cox*(vddif - 6*vddif1)/(9*vddif2*vddif2); - lcapgb2=lcapgb3=0; - } - } - } - - /* the b-s and b-d diodes need no processing ... */ - here->capbs2 = lcapbs2; - here->capbs3 = lcapbs3; - here->capbd2 = lcapbd2; - here->capbd3 = lcapbd3; - here->gbs2 = lgbs2; - here->gbs3 = lgbs3; - here->gbd2 = lgbd2; - here->gbd3 = lgbd3; - here->capgb2 = model->MOS9type*lcapgb2; - here->capgb3 = lcapgb3; - /* - * process to get Taylor coefficients, taking into - * account type and mode. - */ -gm2 = d_cdrain.d2_p2; -gb2 = d_cdrain.d2_q2; -gds2 = d_cdrain.d2_r2; -gmb = d_cdrain.d2_pq; -gbds = d_cdrain.d2_qr; -gmds = d_cdrain.d2_pr; -gm3 = d_cdrain.d3_p3; -gb3 = d_cdrain.d3_q3; -gds3 = d_cdrain.d3_r3; -gm2ds = d_cdrain.d3_p2r; -gm2b = d_cdrain.d3_p2q; -gb2ds = d_cdrain.d3_q2r; -gmb2 = d_cdrain.d3_pq2; -gmds2 = d_cdrain.d3_pr2; -gbds2 = d_cdrain.d3_qr2; -gmbds = d_cdrain.d3_pqr; - - if (here->MOS9mode == 1) - { - /* normal mode - no source-drain interchange */ - - here->cdr_x2 = gm2; - here->cdr_y2 = gb2;; - here->cdr_z2 = gds2;; - here->cdr_xy = gmb; - here->cdr_yz = gbds; - here->cdr_xz = gmds; - here->cdr_x3 = gm3; - here->cdr_y3 = gb3; - here->cdr_z3 = gds3; - here->cdr_x2z = gm2ds; - here->cdr_x2y = gm2b; - here->cdr_y2z = gb2ds; - here->cdr_xy2 = gmb2; - here->cdr_xz2 = gmds2; - here->cdr_yz2 = gbds2; - here->cdr_xyz = gmbds; - - /* the gate caps have been divided and made into - Taylor coeffs., but not adjusted for type */ - - here->capgs2 = model->MOS9type*lcapgs2; - here->capgs3 = lcapgs3; - here->capgd2 = model->MOS9type*lcapgd2; - here->capgd3 = lcapgd3; -} else { - /* - * inverse mode - source and drain interchanged - */ - -here->cdr_x2 = -gm2; -here->cdr_y2 = -gb2; -here->cdr_z2 = -(gm2 + gb2 + gds2 + 2*(gmb + gmds + gbds)); -here->cdr_xy = -gmb; -here->cdr_yz = gmb + gb2 + gbds; -here->cdr_xz = gm2 + gmb + gmds; -here->cdr_x3 = -gm3; -here->cdr_y3 = -gb3; -here->cdr_z3 = gm3 + gb3 + gds3 + - 3*(gm2b + gm2ds + gmb2 + gb2ds + gmds2 + gbds2) + 6*gmbds ; -here->cdr_x2z = gm3 + gm2b + gm2ds; -here->cdr_x2y = -gm2b; -here->cdr_y2z = gmb2 + gb3 + gb2ds; -here->cdr_xy2 = -gmb2; -here->cdr_xz2 = -(gm3 + 2*(gm2b + gm2ds + gmbds) + - gmb2 + gmds2); -here->cdr_yz2 = -(gb3 + 2*(gmb2 + gb2ds + gmbds) + - gm2b + gbds2); -here->cdr_xyz = gm2b + gmb2 + gmbds; - - here->capgs2 = model->MOS9type*lcapgd2; - here->capgs3 = lcapgd3; - - here->capgd2 = model->MOS9type*lcapgs2; - here->capgd3 = lcapgs3; - -} - -/* now to adjust for type and multiply by factors to convert to Taylor coeffs. */ - -here->cdr_x2 = 0.5*model->MOS9type*here->cdr_x2; -here->cdr_y2 = 0.5*model->MOS9type*here->cdr_y2; -here->cdr_z2 = 0.5*model->MOS9type*here->cdr_z2; -here->cdr_xy = model->MOS9type*here->cdr_xy; -here->cdr_yz = model->MOS9type*here->cdr_yz; -here->cdr_xz = model->MOS9type*here->cdr_xz; -here->cdr_x3 = here->cdr_x3/6.; -here->cdr_y3 = here->cdr_y3/6.; -here->cdr_z3 = here->cdr_z3/6.; -here->cdr_x2z = 0.5*here->cdr_x2z; -here->cdr_x2y = 0.5*here->cdr_x2y; -here->cdr_y2z = 0.5*here->cdr_y2z; -here->cdr_xy2 = 0.5*here->cdr_xy2; -here->cdr_xz2 = 0.5*here->cdr_xz2; -here->cdr_yz2 = 0.5*here->cdr_yz2; - - - } - } - return(OK); -} diff --git a/src/spicelib/devices/mos9/mos9ext.h b/src/spicelib/devices/mos9/mos9ext.h deleted file mode 100644 index e4ac75db0..000000000 --- a/src/spicelib/devices/mos9/mos9ext.h +++ /dev/null @@ -1,28 +0,0 @@ -/********** -Copyright 1990 Regents of the University of California. All rights reserved. -Author: 1985 Thomas L. Quarles -Modified: Alan Gillespie -**********/ - -extern int MOS9acLoad(GENmodel*,CKTcircuit*); -extern int MOS9ask(CKTcircuit*,GENinstance*,int,IFvalue*,IFvalue*); -extern int MOS9convTest(GENmodel *,CKTcircuit *); -extern int MOS9delete(GENinstance*); -extern int MOS9getic(GENmodel*,CKTcircuit*); -extern int MOS9load(GENmodel*,CKTcircuit*); -extern int MOS9mAsk(CKTcircuit*,GENmodel*,int,IFvalue*); -extern int MOS9mParam(int,IFvalue*,GENmodel*); -extern int MOS9param(int,IFvalue*,GENinstance*,IFvalue*); -extern int MOS9pzLoad(GENmodel*,CKTcircuit*,SPcomplex*); -extern int MOS9sAcLoad(GENmodel*,CKTcircuit*); -extern int MOS9sLoad(GENmodel*,CKTcircuit*); -extern void MOS9sPrint(GENmodel*,CKTcircuit*); -extern int MOS9sSetup(SENstruct*,GENmodel*); -extern int MOS9sUpdate(GENmodel*,CKTcircuit*); -extern int MOS9setup(SMPmatrix*,GENmodel*,CKTcircuit*,int*); -extern int MOS9unsetup(GENmodel*,CKTcircuit*); -extern int MOS9temp(GENmodel*,CKTcircuit*); -extern int MOS9trunc(GENmodel*,CKTcircuit*,double*); -extern int MOS9disto(int,GENmodel*,CKTcircuit*); -extern int MOS9noise(int,int,GENmodel*,CKTcircuit*,Ndata*,double*); -extern int MOS9dSetup(GENmodel*,CKTcircuit*); diff --git a/src/spicelib/devices/mos9/mos9ic.c b/src/spicelib/devices/mos9/mos9ic.c deleted file mode 100644 index 63cb3f635..000000000 --- a/src/spicelib/devices/mos9/mos9ic.c +++ /dev/null @@ -1,47 +0,0 @@ -/********** -Copyright 1990 Regents of the University of California. All rights reserved. -Author: 1985 Thomas L. Quarles -Modified: Alan Gillespie -**********/ -/* - */ - -#include "ngspice/ngspice.h" -#include "ngspice/cktdefs.h" -#include "mos9defs.h" -#include "ngspice/sperror.h" -#include "ngspice/suffix.h" - - -int -MOS9getic(GENmodel *inModel, CKTcircuit *ckt) -{ - MOS9model *model = (MOS9model *)inModel; - MOS9instance *here; - /* - * grab initial conditions out of rhs array. User specified, so use - * external nodes to get values - */ - - for( ; model ; model = MOS9nextModel(model)) { - for(here = MOS9instances(model); here ; here = MOS9nextInstance(here)) { - - if(!here->MOS9icVBSGiven) { - here->MOS9icVBS = - *(ckt->CKTrhs + here->MOS9bNode) - - *(ckt->CKTrhs + here->MOS9sNode); - } - if(!here->MOS9icVDSGiven) { - here->MOS9icVDS = - *(ckt->CKTrhs + here->MOS9dNode) - - *(ckt->CKTrhs + here->MOS9sNode); - } - if(!here->MOS9icVGSGiven) { - here->MOS9icVGS = - *(ckt->CKTrhs + here->MOS9gNode) - - *(ckt->CKTrhs + here->MOS9sNode); - } - } - } - return(OK); -} diff --git a/src/spicelib/devices/mos9/mos9init.c b/src/spicelib/devices/mos9/mos9init.c deleted file mode 100644 index 84ba1eb8a..000000000 --- a/src/spicelib/devices/mos9/mos9init.c +++ /dev/null @@ -1,76 +0,0 @@ -#include "ngspice/config.h" - -#include "ngspice/devdefs.h" - -#include "mos9itf.h" -#include "mos9ext.h" -#include "mos9init.h" - - -SPICEdev MOS9info = { - .DEVpublic = { - .name = "Mos9", - .description = "Modified Level 3 MOSfet model", - .terms = &MOS9nSize, - .numNames = &MOS9nSize, - .termNames = MOS9names, - .numInstanceParms = &MOS9pTSize, - .instanceParms = MOS9pTable, - .numModelParms = &MOS9mPTSize, - .modelParms = MOS9mPTable, - .flags = DEV_DEFAULT, - -#ifdef XSPICE - .cm_func = NULL, - .num_conn = 0, - .conn = NULL, - .num_param = 0, - .param = NULL, - .num_inst_var = 0, - .inst_var = NULL, -#endif - }, - - .DEVparam = MOS9param, - .DEVmodParam = MOS9mParam, - .DEVload = MOS9load, - .DEVsetup = MOS9setup, - .DEVunsetup = MOS9unsetup, - .DEVpzSetup = MOS9setup, - .DEVtemperature = MOS9temp, - .DEVtrunc = MOS9trunc, - .DEVfindBranch = NULL, - .DEVacLoad = MOS9acLoad, - .DEVaccept = NULL, - .DEVdestroy = NULL, - .DEVmodDelete = NULL, - .DEVdelete = MOS9delete, - .DEVsetic = MOS9getic, - .DEVask = MOS9ask, - .DEVmodAsk = MOS9mAsk, - .DEVpzLoad = MOS9pzLoad, - .DEVconvTest = MOS9convTest, - .DEVsenSetup = MOS9sSetup, - .DEVsenLoad = MOS9sLoad, - .DEVsenUpdate = MOS9sUpdate, - .DEVsenAcLoad = MOS9sAcLoad, - .DEVsenPrint = MOS9sPrint, - .DEVsenTrunc = NULL, - .DEVdisto = MOS9disto, - .DEVnoise = MOS9noise, - .DEVsoaCheck = NULL, - .DEVinstSize = &MOS9iSize, - .DEVmodSize = &MOS9mSize, - -#ifdef CIDER - .DEVdump = NULL, - .DEVacct = NULL, -#endif -}; - - -SPICEdev * -get_mos9_info(void) -{ - return &MOS9info; -} diff --git a/src/spicelib/devices/mos9/mos9init.h b/src/spicelib/devices/mos9/mos9init.h deleted file mode 100644 index 5163e2188..000000000 --- a/src/spicelib/devices/mos9/mos9init.h +++ /dev/null @@ -1,13 +0,0 @@ -#ifndef _MOS9INIT_H -#define _MOS9INIT_H - -extern IFparm MOS9pTable[ ]; -extern IFparm MOS9mPTable[ ]; -extern char *MOS9names[ ]; -extern int MOS9pTSize; -extern int MOS9mPTSize; -extern int MOS9nSize; -extern int MOS9iSize; -extern int MOS9mSize; - -#endif diff --git a/src/spicelib/devices/mos9/mos9itf.h b/src/spicelib/devices/mos9/mos9itf.h deleted file mode 100644 index 98c13c194..000000000 --- a/src/spicelib/devices/mos9/mos9itf.h +++ /dev/null @@ -1,10 +0,0 @@ -/********** -Copyright 1990 Regents of the University of California. All rights reserved. -**********/ - -#ifndef DEV_MOS9 -#define DEV_MOS9 - -SPICEdev *get_mos9_info(void); - -#endif diff --git a/src/spicelib/devices/mos9/mos9load.c b/src/spicelib/devices/mos9/mos9load.c deleted file mode 100644 index 51539c763..000000000 --- a/src/spicelib/devices/mos9/mos9load.c +++ /dev/null @@ -1,1283 +0,0 @@ -/********** -Copyright 1990 Regents of the University of California. All rights reserved. -Author: 1985 Thomas L. Quarles -Modified: Alan Gillespie -**********/ - -#include "ngspice/ngspice.h" -#include "ngspice/cktdefs.h" -#include "ngspice/devdefs.h" -#include "mos9defs.h" -#include "ngspice/trandefs.h" -#include "ngspice/const.h" -#include "ngspice/sperror.h" -#include "ngspice/suffix.h" - -int -MOS9load(GENmodel *inModel, CKTcircuit *ckt) - /* actually load the current value into the - * sparse matrix previously provided - */ -{ - MOS9model *model = (MOS9model *)inModel; - MOS9instance *here; - double Beta; - double DrainSatCur; - double EffectiveLength; - double EffectiveWidth; - double GateBulkOverlapCap; - double GateDrainOverlapCap; - double GateSourceOverlapCap; - double OxideCap; - double SourceSatCur; - double arg; - double cbhat; - double cdhat; - double cdrain; - double cdreq; - double ceq; - double ceqbd; - double ceqbs; - double ceqgb; - double ceqgd; - double ceqgs; - double delvbd; - double delvbs; - double delvds; - double delvgd; - double delvgs; - double evbd; - double evbs; - double gcgb; - double gcgd; - double gcgs; - double geq; - double sarg; - double sargsw; - double vbd; - double vbs; - double vds; - double vdsat; - double vgb1; - double vgb; - double vgd1; - double vgd; - double vgdo; - double vgs1; - double vgs; - double von; -#ifndef PREDICTOR - double xfact = 0.0; -#endif - int xnrm; - int xrev; - double capgs = 0.0; /* total gate-source capacitance */ - double capgd = 0.0; /* total gate-drain capacitance */ - double capgb = 0.0; /* total gate-bulk capacitance */ - int Check; -#ifndef NOBYPASS - double tempv; -#endif /*NOBYPASS*/ - int error; -#ifdef CAPBYPASS - int senflag; -#endif /* CAPBYPASS */ - int SenCond; - double vt; /* vt at instance temperature */ - - -#ifdef CAPBYPASS - senflag = 0; -#endif /* CAPBYPASS */ - if(ckt->CKTsenInfo){ - if(ckt->CKTsenInfo->SENstatus == PERTURBATION) { - if((ckt->CKTsenInfo->SENmode == ACSEN)|| - (ckt->CKTsenInfo->SENmode == TRANSEN)){ -#ifdef CAPBYPASS - senflag = 1; -#endif /* CAPBYPASS */ - } - goto next; - } - } - - /* loop through all the MOS9 device models */ -next: - for( ; model != NULL; model = MOS9nextModel(model)) { - - /* loop through all the instances of the model */ - for (here = MOS9instances(model); here != NULL ; - here=MOS9nextInstance(here)) { - - vt = CONSTKoverQ * here->MOS9temp; - Check=1; - - if(ckt->CKTsenInfo){ -#ifdef SENSDEBUG - printf("MOS9load \n"); -#endif /* SENSDEBUG */ - - if(ckt->CKTsenInfo->SENstatus == PERTURBATION) - if(here->MOS9senPertFlag == OFF)continue; - - } - SenCond = ckt->CKTsenInfo && here->MOS9senPertFlag; - - /* first, we compute a few useful values - these could be - * pre-computed, but for historical reasons are still done - * here. They may be moved at the expense of instance size - */ - - EffectiveWidth=here->MOS9w-2*model->MOS9widthNarrow+ - model->MOS9widthAdjust; - EffectiveLength=here->MOS9l - 2*model->MOS9latDiff+ - model->MOS9lengthAdjust; - - if( (here->MOS9tSatCurDens == 0) || - (here->MOS9drainArea == 0) || - (here->MOS9sourceArea == 0)) { - DrainSatCur = here->MOS9m * here->MOS9tSatCur; - SourceSatCur = here->MOS9m * here->MOS9tSatCur; - } else { - DrainSatCur = here->MOS9m * here->MOS9tSatCurDens * - here->MOS9drainArea; - SourceSatCur = here->MOS9m * here->MOS9tSatCurDens * - here->MOS9sourceArea; - } - GateSourceOverlapCap = model->MOS9gateSourceOverlapCapFactor * - here->MOS9m * EffectiveWidth; - GateDrainOverlapCap = model->MOS9gateDrainOverlapCapFactor * - here->MOS9m * EffectiveWidth; - GateBulkOverlapCap = model->MOS9gateBulkOverlapCapFactor * - here->MOS9m * EffectiveLength; - Beta = here->MOS9tTransconductance * - here->MOS9m * EffectiveWidth/EffectiveLength; - OxideCap = model->MOS9oxideCapFactor * EffectiveLength * - here->MOS9m * EffectiveWidth; - - - if(SenCond){ -#ifdef SENSDEBUG - printf("MOS9senPertFlag = ON \n"); -#endif /* SENSDEBUG */ - if((ckt->CKTsenInfo->SENmode == TRANSEN) && - (ckt->CKTmode & MODEINITTRAN)) { - vgs = *(ckt->CKTstate1 + here->MOS9vgs); - vds = *(ckt->CKTstate1 + here->MOS9vds); - vbs = *(ckt->CKTstate1 + here->MOS9vbs); - vbd = *(ckt->CKTstate1 + here->MOS9vbd); - vgb = vgs - vbs; - vgd = vgs - vds; - } - else if (ckt->CKTsenInfo->SENmode == ACSEN){ - vgb = model->MOS9type * ( - *(ckt->CKTrhsOp+here->MOS9gNode) - - *(ckt->CKTrhsOp+here->MOS9bNode)); - vbs = *(ckt->CKTstate0 + here->MOS9vbs); - vbd = *(ckt->CKTstate0 + here->MOS9vbd); - vgd = vgb + vbd ; - vgs = vgb + vbs ; - vds = vbs - vbd ; - } - else{ - vgs = *(ckt->CKTstate0 + here->MOS9vgs); - vds = *(ckt->CKTstate0 + here->MOS9vds); - vbs = *(ckt->CKTstate0 + here->MOS9vbs); - vbd = *(ckt->CKTstate0 + here->MOS9vbd); - vgb = vgs - vbs; - vgd = vgs - vds; - } -#ifdef SENSDEBUG - printf(" vbs = %.7e ,vbd = %.7e,vgb = %.7e\n",vbs,vbd,vgb); - printf(" vgs = %.7e ,vds = %.7e,vgd = %.7e\n",vgs,vds,vgd); -#endif /* SENSDEBUG */ - goto next1; - } - - - /* - * ok - now to do the start-up operations - * - * we must get values for vbs, vds, and vgs from somewhere - * so we either predict them or recover them from last iteration - * These are the two most common cases - either a prediction - * step or the general iteration step and they - * share some code, so we put them first - others later on - */ - - if((ckt->CKTmode & (MODEINITFLOAT | MODEINITPRED | MODEINITSMSIG | - MODEINITTRAN)) || - ( (ckt->CKTmode & MODEINITFIX) && (!here->MOS9off) ) ) { -#ifndef PREDICTOR - if(ckt->CKTmode & (MODEINITPRED | MODEINITTRAN) ) { - - /* predictor step */ - - xfact=ckt->CKTdelta/ckt->CKTdeltaOld[1]; - *(ckt->CKTstate0 + here->MOS9vbs) = - *(ckt->CKTstate1 + here->MOS9vbs); - vbs = (1+xfact)* (*(ckt->CKTstate1 + here->MOS9vbs)) - -(xfact * (*(ckt->CKTstate2 + here->MOS9vbs))); - *(ckt->CKTstate0 + here->MOS9vgs) = - *(ckt->CKTstate1 + here->MOS9vgs); - vgs = (1+xfact)* (*(ckt->CKTstate1 + here->MOS9vgs)) - -(xfact * (*(ckt->CKTstate2 + here->MOS9vgs))); - *(ckt->CKTstate0 + here->MOS9vds) = - *(ckt->CKTstate1 + here->MOS9vds); - vds = (1+xfact)* (*(ckt->CKTstate1 + here->MOS9vds)) - -(xfact * (*(ckt->CKTstate2 + here->MOS9vds))); - *(ckt->CKTstate0 + here->MOS9vbd) = - *(ckt->CKTstate0 + here->MOS9vbs)- - *(ckt->CKTstate0 + here->MOS9vds); - } else { -#endif /*PREDICTOR*/ - - /* general iteration */ - - vbs = model->MOS9type * ( - *(ckt->CKTrhsOld+here->MOS9bNode) - - *(ckt->CKTrhsOld+here->MOS9sNodePrime)); - vgs = model->MOS9type * ( - *(ckt->CKTrhsOld+here->MOS9gNode) - - *(ckt->CKTrhsOld+here->MOS9sNodePrime)); - vds = model->MOS9type * ( - *(ckt->CKTrhsOld+here->MOS9dNodePrime) - - *(ckt->CKTrhsOld+here->MOS9sNodePrime)); -#ifndef PREDICTOR - } -#endif /*PREDICTOR*/ - - /* now some common crunching for some more useful quantities */ - - vbd=vbs-vds; - vgd=vgs-vds; - vgdo = *(ckt->CKTstate0 + here->MOS9vgs) - - *(ckt->CKTstate0 + here->MOS9vds); - delvbs = vbs - *(ckt->CKTstate0 + here->MOS9vbs); - delvbd = vbd - *(ckt->CKTstate0 + here->MOS9vbd); - delvgs = vgs - *(ckt->CKTstate0 + here->MOS9vgs); - delvds = vds - *(ckt->CKTstate0 + here->MOS9vds); - delvgd = vgd-vgdo; - - /* these are needed for convergence testing */ - - if (here->MOS9mode >= 0) { - cdhat= - here->MOS9cd- - here->MOS9gbd * delvbd + - here->MOS9gmbs * delvbs + - here->MOS9gm * delvgs + - here->MOS9gds * delvds ; - } else { - cdhat= - here->MOS9cd - - ( here->MOS9gbd - - here->MOS9gmbs) * delvbd - - here->MOS9gm * delvgd + - here->MOS9gds * delvds ; - } - cbhat= - here->MOS9cbs + - here->MOS9cbd + - here->MOS9gbd * delvbd + - here->MOS9gbs * delvbs ; -#ifndef NOBYPASS - /* now lets see if we can bypass (ugh) */ - /* the following mess should be one if statement, but - * many compilers can't handle it all at once, so it - * is split into several successive if statements - */ - tempv = MAX(fabs(cbhat),fabs(here->MOS9cbs - + here->MOS9cbd))+ckt->CKTabstol; - if((!(ckt->CKTmode & (MODEINITPRED|MODEINITTRAN|MODEINITSMSIG) - )) && (ckt->CKTbypass) ) - if ( (fabs(cbhat-(here->MOS9cbs + - here->MOS9cbd)) < ckt->CKTreltol * - tempv)) - if( (fabs(delvbs) < (ckt->CKTreltol * MAX(fabs(vbs), - fabs(*(ckt->CKTstate0+here->MOS9vbs)))+ - ckt->CKTvoltTol))) - if ( (fabs(delvbd) < (ckt->CKTreltol * MAX(fabs(vbd), - fabs(*(ckt->CKTstate0+here->MOS9vbd)))+ - ckt->CKTvoltTol)) ) - if( (fabs(delvgs) < (ckt->CKTreltol * MAX(fabs(vgs), - fabs(*(ckt->CKTstate0+here->MOS9vgs)))+ - ckt->CKTvoltTol))) - if ( (fabs(delvds) < (ckt->CKTreltol * MAX(fabs(vds), - fabs(*(ckt->CKTstate0+here->MOS9vds)))+ - ckt->CKTvoltTol)) ) - if( (fabs(cdhat- here->MOS9cd) < - ckt->CKTreltol * MAX(fabs(cdhat),fabs( - here->MOS9cd)) + ckt->CKTabstol) ) { - /* bypass code * - * nothing interesting has changed since last - * iteration on this device, so we just - * copy all the values computed last iteration out - * and keep going - */ - vbs = *(ckt->CKTstate0 + here->MOS9vbs); - vbd = *(ckt->CKTstate0 + here->MOS9vbd); - vgs = *(ckt->CKTstate0 + here->MOS9vgs); - vds = *(ckt->CKTstate0 + here->MOS9vds); - vgd = vgs - vds; - vgb = vgs - vbs; - cdrain = here->MOS9mode * (here->MOS9cd + here->MOS9cbd); - if(ckt->CKTmode & (MODETRAN | MODETRANOP)) { - capgs = ( *(ckt->CKTstate0+here->MOS9capgs)+ - *(ckt->CKTstate1+here->MOS9capgs) + - GateSourceOverlapCap ); - capgd = ( *(ckt->CKTstate0+here->MOS9capgd)+ - *(ckt->CKTstate1+here->MOS9capgd) + - GateDrainOverlapCap ); - capgb = ( *(ckt->CKTstate0+here->MOS9capgb)+ - *(ckt->CKTstate1+here->MOS9capgb) + - GateBulkOverlapCap ); - } - goto bypass; - } -#endif /*NOBYPASS*/ - /* ok - bypass is out, do it the hard way */ - - von = model->MOS9type * here->MOS9von; - -#ifndef NODELIMITING - /* - * limiting - * we want to keep device voltages from changing - * so fast that the exponentials churn out overflows - * and similar rudeness - */ - - if(*(ckt->CKTstate0 + here->MOS9vds) >=0) { - vgs = DEVfetlim(vgs,*(ckt->CKTstate0 + here->MOS9vgs) - ,von); - vds = vgs - vgd; - vds = DEVlimvds(vds,*(ckt->CKTstate0 + here->MOS9vds)); - vgd = vgs - vds; - } else { - vgd = DEVfetlim(vgd,vgdo,von); - vds = vgs - vgd; - if(!(ckt->CKTfixLimit)) { - vds = -DEVlimvds(-vds,-(*(ckt->CKTstate0 + - here->MOS9vds))); - } - vgs = vgd + vds; - } - if(vds >= 0) { - vbs = DEVpnjlim(vbs,*(ckt->CKTstate0 + here->MOS9vbs), - vt,here->MOS9sourceVcrit,&Check); - vbd = vbs-vds; - } else { - vbd = DEVpnjlim(vbd,*(ckt->CKTstate0 + here->MOS9vbd), - vt,here->MOS9drainVcrit,&Check); - vbs = vbd + vds; - } -#endif /*NODELIMITING*/ - - } else { - - /* ok - not one of the simple cases, so we have to - * look at all of the possibilities for why we were - * called. We still just initialize the three voltages - */ - - if((ckt->CKTmode & MODEINITJCT) && !here->MOS9off) { - vds= model->MOS9type * here->MOS9icVDS; - vgs= model->MOS9type * here->MOS9icVGS; - vbs= model->MOS9type * here->MOS9icVBS; - if((vds==0) && (vgs==0) && (vbs==0) && - ((ckt->CKTmode & - (MODETRAN|MODEDCOP|MODEDCTRANCURVE)) || - (!(ckt->CKTmode & MODEUIC)))) { - vbs = -1; - vgs = model->MOS9type * here->MOS9tVto; - vds = 0; - } - } else { - vbs=vgs=vds=0; - } - } - - /* - * now all the preliminaries are over - we can start doing the - * real work - */ - vbd = vbs - vds; - vgd = vgs - vds; - vgb = vgs - vbs; - - - /* - * bulk-source and bulk-drain diodes - * here we just evaluate the ideal diode current and the - * corresponding derivative (conductance). - */ - -next1: if(vbs <= -3*vt) { - arg=3*vt/(vbs*CONSTe); - arg = arg * arg * arg; - here->MOS9cbs = -SourceSatCur*(1+arg)+ckt->CKTgmin*vbs; - here->MOS9gbs = SourceSatCur*3*arg/vbs+ckt->CKTgmin; - } else { - evbs = exp(MIN(MAX_EXP_ARG,vbs/vt)); - here->MOS9gbs = SourceSatCur*evbs/vt + ckt->CKTgmin; - here->MOS9cbs = SourceSatCur*(evbs-1) + ckt->CKTgmin*vbs; - } - if(vbd <= -3*vt) { - arg=3*vt/(vbd*CONSTe); - arg = arg * arg * arg; - here->MOS9cbd = -DrainSatCur*(1+arg)+ckt->CKTgmin*vbd; - here->MOS9gbd = DrainSatCur*3*arg/vbd+ckt->CKTgmin; - } else { - evbd = exp(MIN(MAX_EXP_ARG,vbd/vt)); - here->MOS9gbd = DrainSatCur*evbd/vt + ckt->CKTgmin; - here->MOS9cbd = DrainSatCur*(evbd-1) + ckt->CKTgmin*vbd; - } - - - /* now to determine whether the user was able to correctly - * identify the source and drain of his device - */ - if(vds >= 0) { - /* normal mode */ - here->MOS9mode = 1; - } else { - /* inverse mode */ - here->MOS9mode = -1; - } - - { - /* - * subroutine moseq3(vds,vbs,vgs,gm,gds,gmbs, - * qg,qc,qb,cggb,cgdb,cgsb,cbgb,cbdb,cbsb) - */ - - /* - * this routine evaluates the drain current, its derivatives and - * the charges associated with the gate, channel and bulk - * for mosfets based on semi-empirical equations - */ - - /* - common /mosarg/ vto,beta,gamma,phi,phib,cox,xnsub,xnfs,xd,xj,xld, - 1 xlamda,uo,uexp,vbp,utra,vmax,xneff,xl,xw,vbi,von,vdsat,qspof, - 2 beta0,beta1,cdrain,xqco,xqc,fnarrw,fshort,lev - common /status/ omega,time,delta,delold(7),ag(7),vt,xni,egfet, - 1 xmu,sfactr,mode,modedc,icalc,initf,method,iord,maxord,noncon, - 2 iterno,itemno,nosolv,modac,ipiv,ivmflg,ipostp,iscrch,iofile - common /knstnt/ twopi,xlog2,xlog10,root2,rad,boltz,charge,ctok, - 1 gmin,reltol,abstol,vntol,trtol,chgtol,eps0,epssil,epsox, - 2 pivtol,pivrel - */ - - /* equivalence (xlamda,alpha),(vbp,theta),(uexp,eta),(utra,xkappa)*/ - - double coeff0 = 0.0631353e0; - double coeff1 = 0.8013292e0; - double coeff2 = -0.01110777e0; - double oneoverxl; /* 1/effective length */ - double eta; /* eta from model after length factor */ - double phibs; /* phi - vbs */ - double sqphbs; /* square root of phibs */ - double dsqdvb; /* */ - double sqphis; /* square root of phi */ - double sqphs3; /* square root of phi cubed */ - double wps; - double oneoverxj; /* 1/junction depth */ - double xjonxl; /* junction depth/effective length */ - double djonxj; - double wponxj; - double arga; - double argb; - double argc; - double dwpdvb; - double dadvb; - double dbdvb; - double gammas; - double fbodys; - double fbody; - double onfbdy; - double qbonco; - double vbix; - double wconxj; - double dfsdvb; - double dfbdvb; - double dqbdvb; - double vth; - double dvtdvb; - double csonco; - double cdonco; - double dxndvb = 0.0; - double dvodvb = 0.0; - double dvodvd = 0.0; - double vgsx; - double dvtdvd; - double onfg; - double fgate; - double us; - double dfgdvg; - double dfgdvd; - double dfgdvb; - double dvsdvg; - double dvsdvb; - double dvsdvd; - double xn = 0.0; - double vdsc; - double onvdsc = 0.0; - double dvsdga; - double vdsx; - double dcodvb; - double cdnorm; - double cdo; - double cd1; - double fdrain = 0.0; - double fd2; - double dfddvg = 0.0; - double dfddvb = 0.0; - double dfddvd = 0.0; - double gdsat; - double cdsat; - double gdoncd; - double gdonfd; - double gdonfg; - double dgdvg; - double dgdvd; - double dgdvb; - double emax; - double emongd; - double demdvg; - double demdvd; - double demdvb; - double delxl; - double dldvd; - double dldem; - double ddldvg; - double ddldvd; - double ddldvb; - double dlonxl; - double xlfact; - double diddl; - double gds0 = 0.0; - double emoncd; - double ondvt; - double onxn; - double wfact; - double gms; - double gmw; - double fshort; - - /* - * bypasses the computation of charges - */ - - /* - * reference cdrain equations to source and - * charge equations to bulk - */ - vdsat = 0.0; - oneoverxl = 1.0/EffectiveLength; - eta = model->MOS9eta * 8.15e-22/(model->MOS9oxideCapFactor* - EffectiveLength*EffectiveLength*EffectiveLength); - /* - *.....square root term - */ - if ( (here->MOS9mode==1?vbs:vbd) <= 0.0 ) { - phibs = here->MOS9tPhi-(here->MOS9mode==1?vbs:vbd); - sqphbs = sqrt(phibs); - dsqdvb = -0.5/sqphbs; - } else { - sqphis = sqrt(here->MOS9tPhi); - sqphs3 = here->MOS9tPhi*sqphis; - sqphbs = sqphis/(1.0+(here->MOS9mode==1?vbs:vbd)/ - (here->MOS9tPhi+here->MOS9tPhi)); - phibs = sqphbs*sqphbs; - dsqdvb = -phibs/(sqphs3+sqphs3); - } - /* - *.....short channel effect factor - */ - if ( (model->MOS9junctionDepth != 0.0) && - (model->MOS9coeffDepLayWidth != 0.0) ) { - wps = model->MOS9coeffDepLayWidth*sqphbs; - oneoverxj = 1.0/model->MOS9junctionDepth; - xjonxl = model->MOS9junctionDepth*oneoverxl; - djonxj = model->MOS9latDiff*oneoverxj; - wponxj = wps*oneoverxj; - wconxj = coeff0+coeff1*wponxj+coeff2*wponxj*wponxj; - arga = wconxj+djonxj; - argc = wponxj/(1.0+wponxj); - argb = sqrt(1.0-argc*argc); - fshort = 1.0-xjonxl*(arga*argb-djonxj); - dwpdvb = model->MOS9coeffDepLayWidth*dsqdvb; - dadvb = (coeff1+coeff2*(wponxj+wponxj))*dwpdvb*oneoverxj; - dbdvb = -argc*argc*(1.0-argc)*dwpdvb/(argb*wps); - dfsdvb = -xjonxl*(dadvb*argb+arga*dbdvb); - } else { - fshort = 1.0; - dfsdvb = 0.0; - } - /* - *.....body effect - */ - gammas = model->MOS9gamma*fshort; - fbodys = 0.5*gammas/(sqphbs+sqphbs); - fbody = fbodys+model->MOS9narrowFactor/EffectiveWidth; - onfbdy = 1.0/(1.0+fbody); - dfbdvb = -fbodys*dsqdvb/sqphbs+fbodys*dfsdvb/fshort; - qbonco =gammas*sqphbs+model->MOS9narrowFactor*phibs/EffectiveWidth; - dqbdvb = gammas*dsqdvb+model->MOS9gamma*dfsdvb*sqphbs- - model->MOS9narrowFactor/EffectiveWidth; - - /* - *.....static feedback effect - */ - vbix = here->MOS9tVbi*model->MOS9type-eta*(here->MOS9mode*vds); - /* - *.....threshold voltage - */ - vth = vbix+qbonco; - dvtdvd = -eta; - dvtdvb = dqbdvb; - /* - *.....joint weak inversion and strong inversion - */ - von = vth; - if ( model->MOS9fastSurfaceStateDensity != 0.0 ) { - csonco = CHARGE*model->MOS9fastSurfaceStateDensity * - 1e4 /*(cm**2/m**2)*/ *EffectiveLength*EffectiveWidth * - here->MOS9m/OxideCap; - cdonco = qbonco/(phibs+phibs); - xn = 1.0+csonco+cdonco; - von = vth+vt*xn; - dxndvb = dqbdvb/(phibs+phibs)-qbonco*dsqdvb/(phibs*sqphbs); - dvodvd = dvtdvd; - dvodvb = dvtdvb+vt*dxndvb; - } else { - /* - *.....cutoff region - */ - if ( (here->MOS9mode==1?vgs:vgd) <= von ) { - cdrain = 0.0; - here->MOS9gm = 0.0; - here->MOS9gds = 0.0; - here->MOS9gmbs = 0.0; - goto innerline1000; - } - } - /* - *.....device is on - */ - vgsx = MAX((here->MOS9mode==1?vgs:vgd),von); - /* - *.....mobility modulation by gate voltage - */ - onfg = 1.0+model->MOS9theta*(vgsx-vth); - fgate = 1.0/onfg; - us = here->MOS9tSurfMob * 1e-4 /*(m**2/cm**2)*/ *fgate; - dfgdvg = -model->MOS9theta*fgate*fgate; - dfgdvd = -dfgdvg*dvtdvd; - dfgdvb = -dfgdvg*dvtdvb; - /* - *.....saturation voltage - */ - vdsat = (vgsx-vth)*onfbdy; - if ( model->MOS9maxDriftVel <= 0.0 ) { - dvsdvg = onfbdy; - dvsdvd = -dvsdvg*dvtdvd; - dvsdvb = -dvsdvg*dvtdvb-vdsat*dfbdvb*onfbdy; - } else { - vdsc = EffectiveLength*model->MOS9maxDriftVel/us; - onvdsc = 1.0/vdsc; - arga = (vgsx-vth)*onfbdy; - argb = sqrt(arga*arga+vdsc*vdsc); - vdsat = arga+vdsc-argb; - dvsdga = (1.0-arga/argb)*onfbdy; - dvsdvg = dvsdga-(1.0-vdsc/argb)*vdsc*dfgdvg*onfg; - dvsdvd = -dvsdvg*dvtdvd; - dvsdvb = -dvsdvg*dvtdvb-arga*dvsdga*dfbdvb; - } - /* - *.....current factors in linear region - */ - vdsx = MIN((here->MOS9mode*vds),vdsat); - if ( vdsx == 0.0 ) goto line900; - cdo = vgsx-vth-0.5*(1.0+fbody)*vdsx; - dcodvb = -dvtdvb-0.5*dfbdvb*vdsx; - /* - *.....normalized drain current - */ - cdnorm = cdo*vdsx; - here->MOS9gm = vdsx; - if ((here->MOS9mode*vds) > vdsat) here->MOS9gds = -dvtdvd*vdsx; - else here->MOS9gds = vgsx-vth-(1.0+fbody+dvtdvd)*vdsx; - here->MOS9gmbs = dcodvb*vdsx; - /* - *.....drain current without velocity saturation effect - */ - cd1 = Beta*cdnorm; - Beta = Beta*fgate; - cdrain = Beta*cdnorm; - here->MOS9gm = Beta*here->MOS9gm+dfgdvg*cd1; - here->MOS9gds = Beta*here->MOS9gds+dfgdvd*cd1; - here->MOS9gmbs = Beta*here->MOS9gmbs+dfgdvb*cd1; - /* - *.....velocity saturation factor - */ - if ( model->MOS9maxDriftVel > 0.0 ) { - fdrain = 1.0/(1.0+vdsx*onvdsc); - fd2 = fdrain*fdrain; - arga = fd2*vdsx*onvdsc*onfg; - dfddvg = -dfgdvg*arga; - if ((here->MOS9mode*vds) > vdsat) dfddvd = -dfgdvd*arga; - else dfddvd = -dfgdvd*arga-fd2*onvdsc; - dfddvb = -dfgdvb*arga; - /* - *.....drain current - */ - here->MOS9gm = fdrain*here->MOS9gm+dfddvg*cdrain; - here->MOS9gds = fdrain*here->MOS9gds+dfddvd*cdrain; - here->MOS9gmbs = fdrain*here->MOS9gmbs+dfddvb*cdrain; - cdrain = fdrain*cdrain; - Beta = Beta*fdrain; - } - /* - *.....channel length modulation - */ - if ((here->MOS9mode*vds) <= vdsat) { - if ( (model->MOS9maxDriftVel > 0.0) || - (model->MOS9alpha == 0.0) || - (ckt->CKTbadMos3) ) goto line700; - else { - arga = (here->MOS9mode*vds)/vdsat; - delxl = sqrt(model->MOS9kappa*model->MOS9alpha*vdsat/8); - dldvd = 4*delxl*arga*arga*arga/vdsat; - arga *= arga; - arga *= arga; - delxl *= arga; - ddldvg = 0.0; - ddldvd = -dldvd; - ddldvb = 0.0; - goto line520; - } - } - if ( model->MOS9maxDriftVel <= 0.0 ) goto line510; - if (model->MOS9alpha == 0.0) goto line700; - cdsat = cdrain; - gdsat = cdsat*(1.0-fdrain)*onvdsc; - gdsat = MAX(1.0e-12,gdsat); - gdoncd = gdsat/cdsat; - gdonfd = gdsat/(1.0-fdrain); - gdonfg = gdsat*onfg; - dgdvg = gdoncd*here->MOS9gm-gdonfd*dfddvg+gdonfg*dfgdvg; - dgdvd = gdoncd*here->MOS9gds-gdonfd*dfddvd+gdonfg*dfgdvd; - dgdvb = gdoncd*here->MOS9gmbs-gdonfd*dfddvb+gdonfg*dfgdvb; - - if (ckt->CKTbadMos3) - emax = cdsat*oneoverxl/gdsat; - else - emax = model->MOS9kappa * cdsat*oneoverxl/gdsat; - emoncd = emax/cdsat; - emongd = emax/gdsat; - demdvg = emoncd*here->MOS9gm-emongd*dgdvg; - demdvd = emoncd*here->MOS9gds-emongd*dgdvd; - demdvb = emoncd*here->MOS9gmbs-emongd*dgdvb; - - arga = 0.5*emax*model->MOS9alpha; - argc = model->MOS9kappa*model->MOS9alpha; - argb = sqrt(arga*arga+argc*((here->MOS9mode*vds)-vdsat)); - delxl = argb-arga; - dldvd = argc/(argb+argb); - dldem = 0.5*(arga/argb-1.0)*model->MOS9alpha; - ddldvg = dldem*demdvg; - ddldvd = dldem*demdvd-dldvd; - ddldvb = dldem*demdvb; - goto line520; -line510: - if (ckt->CKTbadMos3) { - delxl = sqrt(model->MOS9kappa*((here->MOS9mode*vds)-vdsat)* - model->MOS9alpha); - dldvd = 0.5*delxl/((here->MOS9mode*vds)-vdsat); - } else { - delxl = sqrt(model->MOS9kappa*model->MOS9alpha* - ((here->MOS9mode*vds)-vdsat+(vdsat/8))); - dldvd = 0.5*delxl/((here->MOS9mode*vds)-vdsat+(vdsat/8)); - } - ddldvg = 0.0; - ddldvd = -dldvd; - ddldvb = 0.0; - /* - *.....punch through approximation - */ -line520: - if ( delxl > (0.5*EffectiveLength) ) { - delxl = EffectiveLength-(EffectiveLength*EffectiveLength/ - (4.0*delxl)); - arga = 4.0*(EffectiveLength-delxl)*(EffectiveLength-delxl)/ - (EffectiveLength*EffectiveLength); - ddldvg = ddldvg*arga; - ddldvd = ddldvd*arga; - ddldvb = ddldvb*arga; - dldvd = dldvd*arga; - } - /* - *.....saturation region - */ - dlonxl = delxl*oneoverxl; - xlfact = 1.0/(1.0-dlonxl); - cd1 = cdrain; - cdrain = cdrain*xlfact; - diddl = cdrain/(EffectiveLength-delxl); - here->MOS9gm = here->MOS9gm*xlfact+diddl*ddldvg; - here->MOS9gmbs = here->MOS9gmbs*xlfact+diddl*ddldvb; - gds0 = diddl*ddldvd; - here->MOS9gm = here->MOS9gm+gds0*dvsdvg; - here->MOS9gmbs = here->MOS9gmbs+gds0*dvsdvb; - here->MOS9gds = here->MOS9gds*xlfact+diddl*dldvd+gds0*dvsdvd; -/* here->MOS9gds = (here->MOS9gds*xlfact)+gds0*dvsdvd- - (cd1*ddldvd/(EffectiveLength*(1-2*dlonxl+dlonxl*dlonxl)));*/ - - /* - *.....finish strong inversion case - */ -line700: - if ( (here->MOS9mode==1?vgs:vgd) < von ) { - /* - *.....weak inversion - */ - onxn = 1.0/xn; - ondvt = onxn/vt; - wfact = exp( ((here->MOS9mode==1?vgs:vgd)-von)*ondvt ); - cdrain = cdrain*wfact; - gms = here->MOS9gm*wfact; - gmw = cdrain*ondvt; - here->MOS9gm = gmw; - if ((here->MOS9mode*vds) > vdsat) { - here->MOS9gm = here->MOS9gm+gds0*dvsdvg*wfact; - } - here->MOS9gds = here->MOS9gds*wfact+(gms-gmw)*dvodvd; - here->MOS9gmbs = here->MOS9gmbs*wfact+(gms-gmw)*dvodvb-gmw* - ((here->MOS9mode==1?vgs:vgd)-von)*onxn*dxndvb; - } - /* - *.....charge computation - */ - goto innerline1000; - /* - *.....special case of vds = 0.0d0 - */ -line900: - Beta = Beta*fgate; - cdrain = 0.0; - here->MOS9gm = 0.0; - here->MOS9gds = Beta*(vgsx-vth); - here->MOS9gmbs = 0.0; - if ( (model->MOS9fastSurfaceStateDensity != 0.0) && - ((here->MOS9mode==1?vgs:vgd) < von) ) { - here->MOS9gds *=exp(((here->MOS9mode==1?vgs:vgd)-von)/(vt*xn)); - } -innerline1000:; - /* - *.....done - */ - } - - - /* now deal with n vs p polarity */ - - here->MOS9von = model->MOS9type * von; - here->MOS9vdsat = model->MOS9type * vdsat; - /* line 490 */ - /* - * COMPUTE EQUIVALENT DRAIN CURRENT SOURCE - */ - here->MOS9cd=here->MOS9mode * cdrain - here->MOS9cbd; - - if (ckt->CKTmode & (MODETRAN | MODETRANOP | MODEINITSMSIG)) { - /* - * now we do the hard part of the bulk-drain and bulk-source - * diode - we evaluate the non-linear capacitance and - * charge - * - * the basic equations are not hard, but the implementation - * is somewhat long in an attempt to avoid log/exponential - * evaluations - */ - /* - * charge storage elements - * - *.. bulk-drain and bulk-source depletion capacitances - */ -#ifdef CAPBYPASS - if(((ckt->CKTmode & (MODEINITPRED | MODEINITTRAN) ) || - fabs(delvbs) >= ckt->CKTreltol * MAX(fabs(vbs), - fabs(*(ckt->CKTstate0+here->MOS9vbs)))+ - ckt->CKTvoltTol)|| senflag ) -#endif /*CAPBYPASS*/ - { - /* can't bypass the diode capacitance calculations */ - if(here->MOS9Cbs != 0 || here->MOS9Cbssw != 0 ) { - if (vbs < here->MOS9tDepCap){ - arg=1-vbs/here->MOS9tBulkPot; - /* - * the following block looks somewhat long and messy, - * but since most users use the default grading - * coefficients of .5, and sqrt is MUCH faster than an - * exp(log()) we use this special case code to buy time. - * (as much as 10% of total job time!) - */ - if(model->MOS9bulkJctBotGradingCoeff == - model->MOS9bulkJctSideGradingCoeff) { - if(model->MOS9bulkJctBotGradingCoeff == .5) { - sarg = sargsw = 1/sqrt(arg); - } else { - sarg = sargsw = - exp(-model->MOS9bulkJctBotGradingCoeff* - log(arg)); - } - } else { - if(model->MOS9bulkJctBotGradingCoeff == .5) { - sarg = 1/sqrt(arg); - } else { - sarg = exp(-model->MOS9bulkJctBotGradingCoeff* - log(arg)); - } - if(model->MOS9bulkJctSideGradingCoeff == .5) { - sargsw = 1/sqrt(arg); - } else { - sargsw =exp(-model->MOS9bulkJctSideGradingCoeff* - log(arg)); - } - } - *(ckt->CKTstate0 + here->MOS9qbs) = - here->MOS9tBulkPot*(here->MOS9Cbs* - (1-arg*sarg)/(1-model->MOS9bulkJctBotGradingCoeff) - +here->MOS9Cbssw* - (1-arg*sargsw)/ - (1-model->MOS9bulkJctSideGradingCoeff)); - here->MOS9capbs=here->MOS9Cbs*sarg+ - here->MOS9Cbssw*sargsw; - } else { - *(ckt->CKTstate0 + here->MOS9qbs) = here->MOS9f4s + - vbs*(here->MOS9f2s+vbs*(here->MOS9f3s/2)); - here->MOS9capbs=here->MOS9f2s+here->MOS9f3s*vbs; - } - } else { - *(ckt->CKTstate0 + here->MOS9qbs) = 0; - here->MOS9capbs=0; - } - } -#ifdef CAPBYPASS - if(((ckt->CKTmode & (MODEINITPRED | MODEINITTRAN) ) || - fabs(delvbd) >= ckt->CKTreltol * MAX(fabs(vbd), - fabs(*(ckt->CKTstate0+here->MOS9vbd)))+ - ckt->CKTvoltTol)|| senflag ) -#endif /*CAPBYPASS*/ - /* can't bypass the diode capacitance calculations */ - { - if(here->MOS9Cbd != 0 || here->MOS9Cbdsw != 0 ) { - if (vbd < here->MOS9tDepCap) { - arg=1-vbd/here->MOS9tBulkPot; - /* - * the following block looks somewhat long and messy, - * but since most users use the default grading - * coefficients of .5, and sqrt is MUCH faster than an - * exp(log()) we use this special case code to buy time. - * (as much as 10% of total job time!) - */ - if(model->MOS9bulkJctBotGradingCoeff == .5 && - model->MOS9bulkJctSideGradingCoeff == .5) { - sarg = sargsw = 1/sqrt(arg); - } else { - if(model->MOS9bulkJctBotGradingCoeff == .5) { - sarg = 1/sqrt(arg); - } else { - sarg = exp(-model->MOS9bulkJctBotGradingCoeff* - log(arg)); - } - if(model->MOS9bulkJctSideGradingCoeff == .5) { - sargsw = 1/sqrt(arg); - } else { - sargsw =exp(-model->MOS9bulkJctSideGradingCoeff* - log(arg)); - } - } - *(ckt->CKTstate0 + here->MOS9qbd) = - here->MOS9tBulkPot*(here->MOS9Cbd* - (1-arg*sarg) - /(1-model->MOS9bulkJctBotGradingCoeff) - +here->MOS9Cbdsw* - (1-arg*sargsw) - /(1-model->MOS9bulkJctSideGradingCoeff)); - here->MOS9capbd=here->MOS9Cbd*sarg+ - here->MOS9Cbdsw*sargsw; - } else { - *(ckt->CKTstate0 + here->MOS9qbd) = here->MOS9f4d + - vbd * (here->MOS9f2d + vbd * here->MOS9f3d/2); - here->MOS9capbd=here->MOS9f2d + vbd * here->MOS9f3d; - } - } else { - *(ckt->CKTstate0 + here->MOS9qbd) = 0; - here->MOS9capbd = 0; - } - } - - if(SenCond && (ckt->CKTsenInfo->SENmode==TRANSEN)) goto next2; - - if ( ckt->CKTmode & MODETRAN ) { - /* (above only excludes tranop, since we're only at this - * point if tran or tranop ) - */ - - /* - * calculate equivalent conductances and currents for - * depletion capacitors - */ - - /* integrate the capacitors and save results */ - - error = NIintegrate(ckt,&geq,&ceq,here->MOS9capbd, - here->MOS9qbd); - if(error) return(error); - here->MOS9gbd += geq; - here->MOS9cbd += *(ckt->CKTstate0 + here->MOS9cqbd); - here->MOS9cd -= *(ckt->CKTstate0 + here->MOS9cqbd); - error = NIintegrate(ckt,&geq,&ceq,here->MOS9capbs, - here->MOS9qbs); - if(error) return(error); - here->MOS9gbs += geq; - here->MOS9cbs += *(ckt->CKTstate0 + here->MOS9cqbs); - } - } - - if(SenCond) goto next2; - - /* - * check convergence - */ - if ( (here->MOS9off == 0) || - (!(ckt->CKTmode & (MODEINITFIX|MODEINITSMSIG))) ){ - if (Check == 1) { - ckt->CKTnoncon++; - ckt->CKTtroubleElt = (GENinstance *) here; - } - } - - - - /* save things away for next time */ - -next2: *(ckt->CKTstate0 + here->MOS9vbs) = vbs; - *(ckt->CKTstate0 + here->MOS9vbd) = vbd; - *(ckt->CKTstate0 + here->MOS9vgs) = vgs; - *(ckt->CKTstate0 + here->MOS9vds) = vds; - - - - /* - * meyer's capacitor model - */ - if ( ckt->CKTmode & (MODETRAN | MODETRANOP | MODEINITSMSIG) ) { - /* - * calculate meyer's capacitors - */ - /* - * new cmeyer - this just evaluates at the current time, - * expects you to remember values from previous time - * returns 1/2 of non-constant portion of capacitance - * you must add in the other half from previous time - * and the constant part - */ - if (here->MOS9mode > 0){ - DEVqmeyer (vgs,vgd,vgb,von,vdsat, - (ckt->CKTstate0 + here->MOS9capgs), - (ckt->CKTstate0 + here->MOS9capgd), - (ckt->CKTstate0 + here->MOS9capgb), - here->MOS9tPhi,OxideCap); - } else { - DEVqmeyer (vgd,vgs,vgb,von,vdsat, - (ckt->CKTstate0 + here->MOS9capgd), - (ckt->CKTstate0 + here->MOS9capgs), - (ckt->CKTstate0 + here->MOS9capgb), - here->MOS9tPhi,OxideCap); - } - vgs1 = *(ckt->CKTstate1 + here->MOS9vgs); - vgd1 = vgs1 - *(ckt->CKTstate1 + here->MOS9vds); - vgb1 = vgs1 - *(ckt->CKTstate1 + here->MOS9vbs); - if(ckt->CKTmode & MODETRANOP) { - capgs = 2 * *(ckt->CKTstate0+here->MOS9capgs)+ - GateSourceOverlapCap ; - capgd = 2 * *(ckt->CKTstate0+here->MOS9capgd)+ - GateDrainOverlapCap ; - capgb = 2 * *(ckt->CKTstate0+here->MOS9capgb)+ - GateBulkOverlapCap ; - } else { - capgs = ( *(ckt->CKTstate0+here->MOS9capgs)+ - *(ckt->CKTstate1+here->MOS9capgs) + - GateSourceOverlapCap ); - capgd = ( *(ckt->CKTstate0+here->MOS9capgd)+ - *(ckt->CKTstate1+here->MOS9capgd) + - GateDrainOverlapCap ); - capgb = ( *(ckt->CKTstate0+here->MOS9capgb)+ - *(ckt->CKTstate1+here->MOS9capgb) + - GateBulkOverlapCap ); - } - if(ckt->CKTsenInfo){ - here->MOS9cgs = capgs; - here->MOS9cgd = capgd; - here->MOS9cgb = capgb; - } - - - /* - * store small-signal parameters (for meyer's model) - * all parameters already stored, so done... - */ - - - if(SenCond){ - if(ckt->CKTsenInfo->SENmode & (DCSEN|ACSEN)) { - continue; - } - } -#ifndef PREDICTOR - if (ckt->CKTmode & (MODEINITPRED | MODEINITTRAN) ) { - *(ckt->CKTstate0 + here->MOS9qgs) = - (1+xfact) * *(ckt->CKTstate1 + here->MOS9qgs) - - xfact * *(ckt->CKTstate2 + here->MOS9qgs); - *(ckt->CKTstate0 + here->MOS9qgd) = - (1+xfact) * *(ckt->CKTstate1 + here->MOS9qgd) - - xfact * *(ckt->CKTstate2 + here->MOS9qgd); - *(ckt->CKTstate0 + here->MOS9qgb) = - (1+xfact) * *(ckt->CKTstate1 + here->MOS9qgb) - - xfact * *(ckt->CKTstate2 + here->MOS9qgb); - } else { -#endif /*PREDICTOR*/ - if(ckt->CKTmode & MODETRAN) { - *(ckt->CKTstate0 + here->MOS9qgs) = (vgs-vgs1)*capgs + - *(ckt->CKTstate1 + here->MOS9qgs) ; - *(ckt->CKTstate0 + here->MOS9qgd) = (vgd-vgd1)*capgd + - *(ckt->CKTstate1 + here->MOS9qgd) ; - *(ckt->CKTstate0 + here->MOS9qgb) = (vgb-vgb1)*capgb + - *(ckt->CKTstate1 + here->MOS9qgb) ; - } else { - /* TRANOP only */ - *(ckt->CKTstate0 + here->MOS9qgs) = vgs*capgs; - *(ckt->CKTstate0 + here->MOS9qgd) = vgd*capgd; - *(ckt->CKTstate0 + here->MOS9qgb) = vgb*capgb; - } -#ifndef PREDICTOR - } -#endif /*PREDICTOR*/ - } -#ifndef NOBYPASS -bypass: -#endif - if(SenCond) continue; - - - if ( (ckt->CKTmode & (MODEINITTRAN)) || - (! (ckt->CKTmode & (MODETRAN)) ) ) { - /* - * initialize to zero charge conductances - * and current - */ - gcgs=0; - ceqgs=0; - gcgd=0; - ceqgd=0; - gcgb=0; - ceqgb=0; - } else { - if(capgs == 0) *(ckt->CKTstate0 + here->MOS9cqgs) =0; - if(capgd == 0) *(ckt->CKTstate0 + here->MOS9cqgd) =0; - if(capgb == 0) *(ckt->CKTstate0 + here->MOS9cqgb) =0; - /* - * calculate equivalent conductances and currents for - * meyer"s capacitors - */ - error = NIintegrate(ckt,&gcgs,&ceqgs,capgs,here->MOS9qgs); - if(error) return(error); - error = NIintegrate(ckt,&gcgd,&ceqgd,capgd,here->MOS9qgd); - if(error) return(error); - error = NIintegrate(ckt,&gcgb,&ceqgb,capgb,here->MOS9qgb); - if(error) return(error); - ceqgs=ceqgs-gcgs*vgs+ckt->CKTag[0]* - *(ckt->CKTstate0 + here->MOS9qgs); - ceqgd=ceqgd-gcgd*vgd+ckt->CKTag[0]* - *(ckt->CKTstate0 + here->MOS9qgd); - ceqgb=ceqgb-gcgb*vgb+ckt->CKTag[0]* - *(ckt->CKTstate0 + here->MOS9qgb); - } - /* - * store charge storage info for meyer's cap in lx table - */ - - - /* - * load current vector - */ - ceqbs = model->MOS9type * - (here->MOS9cbs-(here->MOS9gbs)*vbs); - ceqbd = model->MOS9type * - (here->MOS9cbd-(here->MOS9gbd)*vbd); - if (here->MOS9mode >= 0) { - xnrm=1; - xrev=0; - cdreq=model->MOS9type*(cdrain-here->MOS9gds*vds- - here->MOS9gm*vgs-here->MOS9gmbs*vbs); - } else { - xnrm=0; - xrev=1; - cdreq = -(model->MOS9type)*(cdrain-here->MOS9gds*(-vds)- - here->MOS9gm*vgd-here->MOS9gmbs*vbd); - } - *(ckt->CKTrhs + here->MOS9gNode) -= - (model->MOS9type * (ceqgs + ceqgb + ceqgd)); - *(ckt->CKTrhs + here->MOS9bNode) -= - (ceqbs + ceqbd - model->MOS9type * ceqgb); - *(ckt->CKTrhs + here->MOS9dNodePrime) += - (ceqbd - cdreq + model->MOS9type * ceqgd); - *(ckt->CKTrhs + here->MOS9sNodePrime) += - cdreq + ceqbs + model->MOS9type * ceqgs; - /* - * load y matrix - */ -/*printf(" loading %s at time %g\n",here->MOS9name,ckt->CKTtime);*/ -/*printf("%g %g %g %g %g\n", here->MOS9drainConductance,gcgd+gcgs+gcgb, - here->MOS9sourceConductance,here->MOS9gbd,here->MOS9gbs);*/ -/*printf("%g %g %g %g %g\n",-gcgb,0.0,0.0,here->MOS9gds,here->MOS9gm);*/ -/*printf("%g %g %g %g %g\n", here->MOS9gds,here->MOS9gmbs,gcgd,-gcgs,-gcgd);*/ -/*printf("%g %g %g %g %g\n", -gcgs,-gcgd,0.0,-gcgs,0.0);*/ - - *(here->MOS9DdPtr) += (here->MOS9drainConductance); - *(here->MOS9GgPtr) += ((gcgd+gcgs+gcgb)); - *(here->MOS9SsPtr) += (here->MOS9sourceConductance); - *(here->MOS9BbPtr) += (here->MOS9gbd+here->MOS9gbs+gcgb); - *(here->MOS9DPdpPtr) += - (here->MOS9drainConductance+here->MOS9gds+ - here->MOS9gbd+xrev*(here->MOS9gm+here->MOS9gmbs)+gcgd); - *(here->MOS9SPspPtr) += - (here->MOS9sourceConductance+here->MOS9gds+ - here->MOS9gbs+xnrm*(here->MOS9gm+here->MOS9gmbs)+gcgs); - *(here->MOS9DdpPtr) += (-here->MOS9drainConductance); - *(here->MOS9GbPtr) -= gcgb; - *(here->MOS9GdpPtr) -= gcgd; - *(here->MOS9GspPtr) -= gcgs; - *(here->MOS9SspPtr) += (-here->MOS9sourceConductance); - *(here->MOS9BgPtr) -= gcgb; - *(here->MOS9BdpPtr) -= here->MOS9gbd; - *(here->MOS9BspPtr) -= here->MOS9gbs; - *(here->MOS9DPdPtr) += (-here->MOS9drainConductance); - *(here->MOS9DPgPtr) += ((xnrm-xrev)*here->MOS9gm-gcgd); - *(here->MOS9DPbPtr) += (-here->MOS9gbd+(xnrm-xrev)*here->MOS9gmbs); - *(here->MOS9DPspPtr) += (-here->MOS9gds- - xnrm*(here->MOS9gm+here->MOS9gmbs)); - *(here->MOS9SPgPtr) += (-(xnrm-xrev)*here->MOS9gm-gcgs); - *(here->MOS9SPsPtr) += (-here->MOS9sourceConductance); - *(here->MOS9SPbPtr) += (-here->MOS9gbs-(xnrm-xrev)*here->MOS9gmbs); - *(here->MOS9SPdpPtr) += (-here->MOS9gds- - xrev*(here->MOS9gm+here->MOS9gmbs)); - } - } - return(OK); -} diff --git a/src/spicelib/devices/mos9/mos9mask.c b/src/spicelib/devices/mos9/mos9mask.c deleted file mode 100644 index fd5a07726..000000000 --- a/src/spicelib/devices/mos9/mos9mask.c +++ /dev/null @@ -1,169 +0,0 @@ -/********** -Copyright 1990 Regents of the University of California. All rights reserved. -Author: 1987 Thomas L. Quarles -Modified: Alan Gillespie -**********/ -/* - */ - -#include "ngspice/ngspice.h" -#include "ngspice/const.h" -#include "ngspice/ifsim.h" -#include "ngspice/cktdefs.h" -#include "ngspice/devdefs.h" -#include "mos9defs.h" -#include "ngspice/sperror.h" -#include "ngspice/suffix.h" - - -/*ARGSUSED*/ -int -MOS9mAsk(CKTcircuit *ckt, GENmodel *inst, int which, IFvalue *value) -{ - MOS9model *here = (MOS9model *)inst; - - NG_IGNORE(ckt); - - switch(which) { - case MOS9_MOD_TNOM: - value->rValue = here->MOS9tnom-CONSTCtoK; - return(OK); - case MOS9_MOD_VTO: - value->rValue = here->MOS9vt0; - return(OK); - case MOS9_MOD_KP: - value->rValue = here->MOS9transconductance; - return(OK); - case MOS9_MOD_GAMMA: - value->rValue = here->MOS9gamma; - return(OK); - case MOS9_MOD_PHI: - value->rValue = here->MOS9phi; - return(OK); - case MOS9_MOD_RD: - value->rValue = here->MOS9drainResistance; - return(OK); - case MOS9_MOD_RS: - value->rValue = here->MOS9sourceResistance; - return(OK); - case MOS9_MOD_CBD: - value->rValue = here->MOS9capBD; - return(OK); - case MOS9_MOD_CBS: - value->rValue = here->MOS9capBS; - return(OK); - case MOS9_MOD_IS: - value->rValue = here->MOS9jctSatCur; - return(OK); - case MOS9_MOD_PB: - value->rValue = here->MOS9bulkJctPotential; - return(OK); - case MOS9_MOD_CGSO: - value->rValue = here->MOS9gateSourceOverlapCapFactor; - return(OK); - case MOS9_MOD_CGDO: - value->rValue = here->MOS9gateDrainOverlapCapFactor; - return(OK); - case MOS9_MOD_CGBO: - value->rValue = here->MOS9gateBulkOverlapCapFactor; - return(OK); - case MOS9_MOD_CJ: - value->rValue = here->MOS9bulkCapFactor; - return(OK); - case MOS9_MOD_MJ: - value->rValue = here->MOS9bulkJctBotGradingCoeff; - return(OK); - case MOS9_MOD_CJSW: - value->rValue = here->MOS9sideWallCapFactor; - return(OK); - case MOS9_MOD_MJSW: - value->rValue = here->MOS9bulkJctSideGradingCoeff; - return(OK); - case MOS9_MOD_JS: - value->rValue = here->MOS9jctSatCurDensity; - return(OK); - case MOS9_MOD_TOX: - value->rValue = here->MOS9oxideThickness; - return(OK); - case MOS9_MOD_LD: - value->rValue = here->MOS9latDiff; - return(OK); - case MOS9_MOD_XL: - value->rValue = here->MOS9lengthAdjust; - return(OK); - case MOS9_MOD_WD: - value->rValue = here->MOS9widthNarrow; - return(OK); - case MOS9_MOD_XW: - value->rValue = here->MOS9widthAdjust; - return(OK); - case MOS9_MOD_DELVTO: - value->rValue = here->MOS9delvt0; - return(OK); - case MOS9_MOD_RSH: - value->rValue = here->MOS9sheetResistance; - return(OK); - case MOS9_MOD_U0: - value->rValue = here->MOS9surfaceMobility; - return(OK); - case MOS9_MOD_FC: - value->rValue = here->MOS9fwdCapDepCoeff; - return(OK); - case MOS9_MOD_NSUB: - value->rValue = here->MOS9substrateDoping; - return(OK); - case MOS9_MOD_TPG: - value->iValue = here->MOS9gateType; - return(OK); - case MOS9_MOD_NSS: - value->rValue = here->MOS9surfaceStateDensity; - return(OK); - case MOS9_MOD_NFS: - value->rValue = here->MOS9fastSurfaceStateDensity; - return(OK); - case MOS9_MOD_DELTA: - value->rValue = here->MOS9narrowFactor; - return(OK); - case MOS9_MOD_VMAX: - value->rValue = here->MOS9maxDriftVel; - return(OK); - case MOS9_MOD_XJ: - value->rValue = here->MOS9junctionDepth; - return(OK); - case MOS9_MOD_ETA: - value->rValue = here->MOS9eta; - return(OK); - case MOS9_MOD_XD: - value->rValue = here->MOS9coeffDepLayWidth; - return(OK); - case MOS9_DELTA: - value->rValue = here->MOS9delta; - return(OK); - case MOS9_MOD_THETA: - value->rValue = here->MOS9theta; - return(OK); - case MOS9_MOD_ALPHA: - value->rValue = here->MOS9alpha; - return(OK); - case MOS9_MOD_KAPPA: - value->rValue = here->MOS9kappa; - return(OK); - case MOS9_MOD_KF: - value->rValue = here->MOS9fNcoef; - return(OK); - case MOS9_MOD_AF: - value->rValue = here->MOS9fNexp; - return(OK); - - case MOS9_MOD_TYPE: - if (here->MOS9type > 0) - value->sValue = "nmos"; - else - value->sValue = "pmos"; - return(OK); - default: - return(E_BADPARM); - } - /* NOTREACHED */ -} - diff --git a/src/spicelib/devices/mos9/mos9mpar.c b/src/spicelib/devices/mos9/mos9mpar.c deleted file mode 100644 index 4e3bbb183..000000000 --- a/src/spicelib/devices/mos9/mos9mpar.c +++ /dev/null @@ -1,198 +0,0 @@ -/********** -Copyright 1990 Regents of the University of California. All rights reserved. -Author: 1985 Thomas L. Quarles -Modified: Alan Gillespie -**********/ -/* - */ - -#include "ngspice/ngspice.h" -#include "ngspice/const.h" -#include "ngspice/ifsim.h" -#include "mos9defs.h" -#include "ngspice/sperror.h" -#include "ngspice/suffix.h" - - -int -MOS9mParam(int param, IFvalue *value, GENmodel *inModel) -{ - register MOS9model *model = (MOS9model *)inModel; - switch(param) { - case MOS9_MOD_VTO: - model->MOS9vt0 = value->rValue; - model->MOS9vt0Given = TRUE; - break; - case MOS9_MOD_KP: - model->MOS9transconductance = value->rValue; - model->MOS9transconductanceGiven = TRUE; - break; - case MOS9_MOD_GAMMA: - model->MOS9gamma = value->rValue; - model->MOS9gammaGiven = TRUE; - break; - case MOS9_MOD_PHI: - model->MOS9phi = value->rValue; - model->MOS9phiGiven = TRUE; - break; - case MOS9_MOD_RD: - model->MOS9drainResistance = value->rValue; - model->MOS9drainResistanceGiven = TRUE; - break; - case MOS9_MOD_RS: - model->MOS9sourceResistance = value->rValue; - model->MOS9sourceResistanceGiven = TRUE; - break; - case MOS9_MOD_CBD: - model->MOS9capBD = value->rValue; - model->MOS9capBDGiven = TRUE; - break; - case MOS9_MOD_CBS: - model->MOS9capBS = value->rValue; - model->MOS9capBSGiven = TRUE; - break; - case MOS9_MOD_IS: - model->MOS9jctSatCur = value->rValue; - model->MOS9jctSatCurGiven = TRUE; - break; - case MOS9_MOD_PB: - model->MOS9bulkJctPotential = value->rValue; - model->MOS9bulkJctPotentialGiven = TRUE; - break; - case MOS9_MOD_CGSO: - model->MOS9gateSourceOverlapCapFactor = value->rValue; - model->MOS9gateSourceOverlapCapFactorGiven = TRUE; - break; - case MOS9_MOD_CGDO: - model->MOS9gateDrainOverlapCapFactor = value->rValue; - model->MOS9gateDrainOverlapCapFactorGiven = TRUE; - break; - case MOS9_MOD_CGBO: - model->MOS9gateBulkOverlapCapFactor = value->rValue; - model->MOS9gateBulkOverlapCapFactorGiven = TRUE; - break; - case MOS9_MOD_RSH: - model->MOS9sheetResistance = value->rValue; - model->MOS9sheetResistanceGiven = TRUE; - break; - case MOS9_MOD_CJ: - model->MOS9bulkCapFactor = value->rValue; - model->MOS9bulkCapFactorGiven = TRUE; - break; - case MOS9_MOD_MJ: - model->MOS9bulkJctBotGradingCoeff = value->rValue; - model->MOS9bulkJctBotGradingCoeffGiven = TRUE; - break; - case MOS9_MOD_CJSW: - model->MOS9sideWallCapFactor = value->rValue; - model->MOS9sideWallCapFactorGiven = TRUE; - break; - case MOS9_MOD_MJSW: - model->MOS9bulkJctSideGradingCoeff = value->rValue; - model->MOS9bulkJctSideGradingCoeffGiven = TRUE; - break; - case MOS9_MOD_JS: - model->MOS9jctSatCurDensity = value->rValue; - model->MOS9jctSatCurDensityGiven = TRUE; - break; - case MOS9_MOD_TOX: - model->MOS9oxideThickness = value->rValue; - model->MOS9oxideThicknessGiven = TRUE; - break; - case MOS9_MOD_LD: - model->MOS9latDiff = value->rValue; - model->MOS9latDiffGiven = TRUE; - break; - case MOS9_MOD_XL: - model->MOS9lengthAdjust = value->rValue; - model->MOS9lengthAdjustGiven = TRUE; - break; - case MOS9_MOD_WD: - model->MOS9widthNarrow = value->rValue; - model->MOS9widthNarrowGiven = TRUE; - break; - case MOS9_MOD_XW: - model->MOS9widthAdjust = value->rValue; - model->MOS9widthAdjustGiven = TRUE; - break; - case MOS9_MOD_DELVTO: - model->MOS9delvt0 = value->rValue; - model->MOS9delvt0Given = TRUE; - break; - case MOS9_MOD_U0: - model->MOS9surfaceMobility = value->rValue; - model->MOS9surfaceMobilityGiven = TRUE; - break; - case MOS9_MOD_FC: - model->MOS9fwdCapDepCoeff = value->rValue; - model->MOS9fwdCapDepCoeffGiven = TRUE; - break; - case MOS9_MOD_NSUB: - model->MOS9substrateDoping = value->rValue; - model->MOS9substrateDopingGiven = TRUE; - break; - case MOS9_MOD_TPG: - model->MOS9gateType = value->iValue; - model->MOS9gateTypeGiven = TRUE; - break; - case MOS9_MOD_NSS: - model->MOS9surfaceStateDensity = value->rValue; - model->MOS9surfaceStateDensityGiven = TRUE; - break; - case MOS9_MOD_ETA: - model->MOS9eta = value->rValue; - model->MOS9etaGiven = TRUE; - break; - case MOS9_MOD_DELTA: - model->MOS9delta = value->rValue; - model->MOS9deltaGiven = TRUE; - break; - case MOS9_MOD_NFS: - model->MOS9fastSurfaceStateDensity = value->rValue; - model->MOS9fastSurfaceStateDensityGiven = TRUE; - break; - case MOS9_MOD_THETA: - model->MOS9theta = value->rValue; - model->MOS9thetaGiven = TRUE; - break; - case MOS9_MOD_VMAX: - model->MOS9maxDriftVel = value->rValue; - model->MOS9maxDriftVelGiven = TRUE; - break; - case MOS9_MOD_KAPPA: - model->MOS9kappa = value->rValue; - model->MOS9kappaGiven = TRUE; - break; - case MOS9_MOD_NMOS: - if(value->iValue) { - model->MOS9type = 1; - model->MOS9typeGiven = TRUE; - } - break; - case MOS9_MOD_PMOS: - if(value->iValue) { - model->MOS9type = -1; - model->MOS9typeGiven = TRUE; - } - break; - case MOS9_MOD_XJ: - model->MOS9junctionDepth = value->rValue; - model->MOS9junctionDepthGiven = TRUE; - break; - case MOS9_MOD_TNOM: - model->MOS9tnom = value->rValue+CONSTCtoK; - model->MOS9tnomGiven = TRUE; - break; - case MOS9_MOD_KF: - model->MOS9fNcoef = value->rValue; - model->MOS9fNcoefGiven = TRUE; - break; - case MOS9_MOD_AF: - model->MOS9fNexp = value->rValue; - model->MOS9fNexpGiven = TRUE; - break; - default: - return(E_BADPARM); - } - return(OK); -} diff --git a/src/spicelib/devices/mos9/mos9noi.c b/src/spicelib/devices/mos9/mos9noi.c deleted file mode 100644 index 69f9bfd80..000000000 --- a/src/spicelib/devices/mos9/mos9noi.c +++ /dev/null @@ -1,181 +0,0 @@ -/********** -Copyright 1990 Regents of the University of California. All rights reserved. -Author: 1987 Gary W. Ng -Modified: Alan Gillespie -**********/ - -#include "ngspice/ngspice.h" -#include "mos9defs.h" -#include "ngspice/cktdefs.h" -#include "ngspice/iferrmsg.h" -#include "ngspice/noisedef.h" -#include "ngspice/suffix.h" - -/* - * MOS9noise (mode, operation, firstModel, ckt, data, OnDens) - * This routine names and evaluates all of the noise sources - * associated with MOSFET's. It starts with the model *firstModel and - * traverses all of its insts. It then proceeds to any other models - * on the linked list. The total output noise density generated by - * all of the MOSFET's is summed with the variable "OnDens". - */ - - -int -MOS9noise (int mode, int operation, GENmodel *genmodel, CKTcircuit *ckt, - Ndata *data, double *OnDens) -{ - NOISEAN *job = (NOISEAN *) ckt->CKTcurJob; - - MOS9model *firstModel = (MOS9model *) genmodel; - MOS9model *model; - MOS9instance *inst; - double tempOnoise; - double tempInoise; - double noizDens[MOS9NSRCS]; - double lnNdens[MOS9NSRCS]; - int i; - - /* define the names of the noise sources */ - - static char *MOS9nNames[MOS9NSRCS] = { /* Note that we have to keep the order */ - "_rd", /* noise due to rd */ /* consistent with the index definitions */ - "_rs", /* noise due to rs */ /* in MOS9defs.h */ - "_id", /* noise due to id */ - "_1overf", /* flicker (1/f) noise */ - "" /* total transistor noise */ - }; - - for (model=firstModel; model != NULL; model=MOS9nextModel(model)) { - for (inst=MOS9instances(model); inst != NULL; inst=MOS9nextInstance(inst)) { - - switch (operation) { - - case N_OPEN: - - /* see if we have to to produce a summary report */ - /* if so, name all the noise generators */ - - if (job->NStpsSm != 0) { - switch (mode) { - - case N_DENS: - for (i=0; i < MOS9NSRCS; i++) { - NOISE_ADD_OUTVAR(ckt, data, "onoise_%s%s", inst->MOS9name, MOS9nNames[i]); - } - break; - - case INT_NOIZ: - for (i=0; i < MOS9NSRCS; i++) { - NOISE_ADD_OUTVAR(ckt, data, "onoise_total_%s%s", inst->MOS9name, MOS9nNames[i]); - NOISE_ADD_OUTVAR(ckt, data, "inoise_total_%s%s", inst->MOS9name, MOS9nNames[i]); - } - break; - } - } - break; - - case N_CALC: - switch (mode) { - - case N_DENS: - NevalSrc(&noizDens[MOS9RDNOIZ],&lnNdens[MOS9RDNOIZ], - ckt,THERMNOISE,inst->MOS9dNodePrime,inst->MOS9dNode, - inst->MOS9drainConductance); - - NevalSrc(&noizDens[MOS9RSNOIZ],&lnNdens[MOS9RSNOIZ], - ckt,THERMNOISE,inst->MOS9sNodePrime,inst->MOS9sNode, - inst->MOS9sourceConductance); - - NevalSrc(&noizDens[MOS9IDNOIZ],&lnNdens[MOS9IDNOIZ], - ckt,THERMNOISE,inst->MOS9dNodePrime,inst->MOS9sNodePrime, - (2.0/3.0 * fabs(inst->MOS9gm))); - - NevalSrc(&noizDens[MOS9FLNOIZ], NULL, ckt, - N_GAIN,inst->MOS9dNodePrime, inst->MOS9sNodePrime, - (double)0.0); - noizDens[MOS9FLNOIZ] *= model->MOS9fNcoef * - exp(model->MOS9fNexp * - log(MAX(fabs(inst->MOS9cd),N_MINLOG))) / - (data->freq * - (inst->MOS9w - 2*model->MOS9widthNarrow) * - inst->MOS9m * - (inst->MOS9l - 2*model->MOS9latDiff) * - model->MOS9oxideCapFactor * model->MOS9oxideCapFactor); - lnNdens[MOS9FLNOIZ] = - log(MAX(noizDens[MOS9FLNOIZ],N_MINLOG)); - - noizDens[MOS9TOTNOIZ] = noizDens[MOS9RDNOIZ] + - noizDens[MOS9RSNOIZ] + - noizDens[MOS9IDNOIZ] + - noizDens[MOS9FLNOIZ]; - lnNdens[MOS9TOTNOIZ] = - log(MAX(noizDens[MOS9TOTNOIZ], N_MINLOG)); - - *OnDens += noizDens[MOS9TOTNOIZ]; - - if (data->delFreq == 0.0) { - - /* if we haven't done any previous integration, we need to */ - /* initialize our "history" variables */ - - for (i=0; i < MOS9NSRCS; i++) { - inst->MOS9nVar[LNLSTDENS][i] = lnNdens[i]; - } - - /* clear out our integration variables if it's the first pass */ - - if (data->freq == job->NstartFreq) { - for (i=0; i < MOS9NSRCS; i++) { - inst->MOS9nVar[OUTNOIZ][i] = 0.0; - inst->MOS9nVar[INNOIZ][i] = 0.0; - } - } - } else { /* data->delFreq != 0.0 (we have to integrate) */ - for (i=0; i < MOS9NSRCS; i++) { - if (i != MOS9TOTNOIZ) { - tempOnoise = Nintegrate(noizDens[i], lnNdens[i], - inst->MOS9nVar[LNLSTDENS][i], data); - tempInoise = Nintegrate(noizDens[i] * data->GainSqInv , - lnNdens[i] + data->lnGainInv, - inst->MOS9nVar[LNLSTDENS][i] + data->lnGainInv, - data); - inst->MOS9nVar[LNLSTDENS][i] = lnNdens[i]; - data->outNoiz += tempOnoise; - data->inNoise += tempInoise; - if (job->NStpsSm != 0) { - inst->MOS9nVar[OUTNOIZ][i] += tempOnoise; - inst->MOS9nVar[OUTNOIZ][MOS9TOTNOIZ] += tempOnoise; - inst->MOS9nVar[INNOIZ][i] += tempInoise; - inst->MOS9nVar[INNOIZ][MOS9TOTNOIZ] += tempInoise; - } - } - } - } - if (data->prtSummary) { - for (i=0; i < MOS9NSRCS; i++) { /* print a summary report */ - data->outpVector[data->outNumber++] = noizDens[i]; - } - } - break; - - case INT_NOIZ: /* already calculated, just output */ - if (job->NStpsSm != 0) { - for (i=0; i < MOS9NSRCS; i++) { - data->outpVector[data->outNumber++] = inst->MOS9nVar[OUTNOIZ][i]; - data->outpVector[data->outNumber++] = inst->MOS9nVar[INNOIZ][i]; - } - } /* if */ - break; - } /* switch (mode) */ - break; - - case N_CLOSE: - return (OK); /* do nothing, the main calling routine will close */ - break; /* the plots */ - } /* switch (operation) */ - } /* for inst */ - } /* for model */ - -return(OK); -} diff --git a/src/spicelib/devices/mos9/mos9par.c b/src/spicelib/devices/mos9/mos9par.c deleted file mode 100644 index f31fa4ff5..000000000 --- a/src/spicelib/devices/mos9/mos9par.c +++ /dev/null @@ -1,122 +0,0 @@ -/********** -Copyright 1990 Regents of the University of California. All rights reserved. -Author: 1985 Thomas L. Quarles -Modified: Alan Gillespie -**********/ -/* - */ - -#include "ngspice/ngspice.h" -#include "ngspice/const.h" -#include "ngspice/ifsim.h" -#include "mos9defs.h" -#include "ngspice/sperror.h" -#include "ngspice/suffix.h" - - -/* ARGSUSED */ -int -MOS9param(int param, IFvalue *value, GENinstance *inst, - IFvalue *select) -{ - MOS9instance *here = (MOS9instance *)inst; - - NG_IGNORE(select); - - switch (param) { - case MOS9_M: - here->MOS9m = value->rValue; - here->MOS9mGiven = TRUE; - break; - case MOS9_W: - here->MOS9w = value->rValue; - here->MOS9wGiven = TRUE; - break; - case MOS9_L: - here->MOS9l = value->rValue; - here->MOS9lGiven = TRUE; - break; - case MOS9_AS: - here->MOS9sourceArea = value->rValue; - here->MOS9sourceAreaGiven = TRUE; - break; - case MOS9_AD: - here->MOS9drainArea = value->rValue; - here->MOS9drainAreaGiven = TRUE; - break; - case MOS9_PS: - here->MOS9sourcePerimiter = value->rValue; - here->MOS9sourcePerimiterGiven = TRUE; - break; - case MOS9_PD: - here->MOS9drainPerimiter = value->rValue; - here->MOS9drainPerimiterGiven = TRUE; - break; - case MOS9_NRS: - here->MOS9sourceSquares = value->rValue; - here->MOS9sourceSquaresGiven = TRUE; - break; - case MOS9_NRD: - here->MOS9drainSquares = value->rValue; - here->MOS9drainSquaresGiven = TRUE; - break; - case MOS9_OFF: - here->MOS9off = (value->iValue != 0); - break; - case MOS9_IC_VBS: - here->MOS9icVBS = value->rValue; - here->MOS9icVBSGiven = TRUE; - break; - case MOS9_IC_VDS: - here->MOS9icVDS = value->rValue; - here->MOS9icVDSGiven = TRUE; - break; - case MOS9_IC_VGS: - here->MOS9icVGS = value->rValue; - here->MOS9icVGSGiven = TRUE; - break; - case MOS9_TEMP: - here->MOS9temp = value->rValue+CONSTCtoK; - here->MOS9tempGiven = TRUE; - break; - case MOS9_DTEMP: - here->MOS9dtemp = value->rValue; - here->MOS9dtempGiven = TRUE; - break; - case MOS9_IC: - /* FALLTHROUGH added to suppress GCC warning due to - * -Wimplicit-fallthrough flag */ - switch (value->v.numValue) { - case 3: - here->MOS9icVBS = *(value->v.vec.rVec+2); - here->MOS9icVBSGiven = TRUE; - /* FALLTHROUGH */ - case 2: - here->MOS9icVGS = *(value->v.vec.rVec+1); - here->MOS9icVGSGiven = TRUE; - /* FALLTHROUGH */ - case 1: - here->MOS9icVDS = *(value->v.vec.rVec); - here->MOS9icVDSGiven = TRUE; - break; - default: - return(E_BADPARM); - } - break; - case MOS9_L_SENS: - if(value->iValue) { - here->MOS9senParmNo = 1; - here->MOS9sens_l = 1; - } - break; - case MOS9_W_SENS: - if(value->iValue) { - here->MOS9senParmNo = 1; - here->MOS9sens_w = 1; - } - break; - default: - return(E_BADPARM); - } - return(OK); -} diff --git a/src/spicelib/devices/mos9/mos9pzld.c b/src/spicelib/devices/mos9/mos9pzld.c deleted file mode 100644 index 7c140a052..000000000 --- a/src/spicelib/devices/mos9/mos9pzld.c +++ /dev/null @@ -1,137 +0,0 @@ -/********** -Copyright 1990 Regents of the University of California. All rights reserved. -Author: 1985 Thomas L. Quarles -Modified: Alan Gillespie -**********/ -/* - */ - -#include "ngspice/ngspice.h" -#include "ngspice/cktdefs.h" -#include "ngspice/complex.h" -#include "mos9defs.h" -#include "ngspice/sperror.h" -#include "ngspice/suffix.h" - - -int -MOS9pzLoad(GENmodel *inModel, CKTcircuit *ckt, SPcomplex *s) -{ - MOS9model *model = (MOS9model *)inModel; - MOS9instance *here; - int xnrm; - int xrev; - double xgs; - double xgd; - double xgb; - double xbd; - double xbs; - double capgs; - double capgd; - double capgb; - double GateBulkOverlapCap; - double GateDrainOverlapCap; - double GateSourceOverlapCap; - double EffectiveLength; - double EffectiveWidth; - - for( ; model != NULL; model = MOS9nextModel(model)) { - for(here = MOS9instances(model); here!= NULL; - here = MOS9nextInstance(here)) { - - if (here->MOS9mode < 0) { - xnrm=0; - xrev=1; - } else { - xnrm=1; - xrev=0; - } - /* - * meyer's model parameters - */ - - EffectiveWidth=here->MOS9w-2*model->MOS9widthNarrow+ - model->MOS9widthAdjust; - EffectiveLength=here->MOS9l - 2*model->MOS9latDiff+ - model->MOS9lengthAdjust; - - GateSourceOverlapCap = model->MOS9gateSourceOverlapCapFactor * - here->MOS9m * EffectiveWidth; - GateDrainOverlapCap = model->MOS9gateDrainOverlapCapFactor * - here->MOS9m * EffectiveWidth; - GateBulkOverlapCap = model->MOS9gateBulkOverlapCapFactor * - here->MOS9m * EffectiveLength; - - capgs = ( 2* *(ckt->CKTstate0+here->MOS9capgs)+ - GateSourceOverlapCap ); - capgd = ( 2* *(ckt->CKTstate0+here->MOS9capgd)+ - GateDrainOverlapCap ); - capgb = ( 2* *(ckt->CKTstate0+here->MOS9capgb)+ - GateBulkOverlapCap ); - xgs = capgs; - xgd = capgd; - xgb = capgb; - xbd = here->MOS9capbd; - xbs = here->MOS9capbs; - /*printf("mos2: xgs=%g, xgd=%g, xgb=%g, xbd=%g, xbs=%g\n", - xgs,xgd,xgb,xbd,xbs);*/ - /* - * load matrix - */ - - *(here->MOS9GgPtr ) += (xgd+xgs+xgb)*s->real; - *(here->MOS9GgPtr +1) += (xgd+xgs+xgb)*s->imag; - *(here->MOS9BbPtr ) += (xgb+xbd+xbs)*s->real; - *(here->MOS9BbPtr +1) += (xgb+xbd+xbs)*s->imag; - *(here->MOS9DPdpPtr ) += (xgd+xbd)*s->real; - *(here->MOS9DPdpPtr +1) += (xgd+xbd)*s->imag; - *(here->MOS9SPspPtr ) += (xgs+xbs)*s->real; - *(here->MOS9SPspPtr +1) += (xgs+xbs)*s->imag; - *(here->MOS9GbPtr ) -= xgb*s->real; - *(here->MOS9GbPtr +1) -= xgb*s->imag; - *(here->MOS9GdpPtr ) -= xgd*s->real; - *(here->MOS9GdpPtr +1) -= xgd*s->imag; - *(here->MOS9GspPtr ) -= xgs*s->real; - *(here->MOS9GspPtr +1) -= xgs*s->imag; - *(here->MOS9BgPtr ) -= xgb*s->real; - *(here->MOS9BgPtr +1) -= xgb*s->imag; - *(here->MOS9BdpPtr ) -= xbd*s->real; - *(here->MOS9BdpPtr +1) -= xbd*s->imag; - *(here->MOS9BspPtr ) -= xbs*s->real; - *(here->MOS9BspPtr +1) -= xbs*s->imag; - *(here->MOS9DPgPtr ) -= xgd*s->real; - *(here->MOS9DPgPtr +1) -= xgd*s->imag; - *(here->MOS9DPbPtr ) -= xbd*s->real; - *(here->MOS9DPbPtr +1) -= xbd*s->imag; - *(here->MOS9SPgPtr ) -= xgs*s->real; - *(here->MOS9SPgPtr +1) -= xgs*s->imag; - *(here->MOS9SPbPtr ) -= xbs*s->real; - *(here->MOS9SPbPtr +1) -= xbs*s->imag; - *(here->MOS9DdPtr) += here->MOS9drainConductance; - *(here->MOS9SsPtr) += here->MOS9sourceConductance; - *(here->MOS9BbPtr) += here->MOS9gbd+here->MOS9gbs; - *(here->MOS9DPdpPtr) += here->MOS9drainConductance+ - here->MOS9gds+here->MOS9gbd+ - xrev*(here->MOS9gm+here->MOS9gmbs); - *(here->MOS9SPspPtr) += here->MOS9sourceConductance+ - here->MOS9gds+here->MOS9gbs+ - xnrm*(here->MOS9gm+here->MOS9gmbs); - *(here->MOS9DdpPtr) -= here->MOS9drainConductance; - *(here->MOS9SspPtr) -= here->MOS9sourceConductance; - *(here->MOS9BdpPtr) -= here->MOS9gbd; - *(here->MOS9BspPtr) -= here->MOS9gbs; - *(here->MOS9DPdPtr) -= here->MOS9drainConductance; - *(here->MOS9DPgPtr) += (xnrm-xrev)*here->MOS9gm; - *(here->MOS9DPbPtr) += -here->MOS9gbd+(xnrm-xrev)*here->MOS9gmbs; - *(here->MOS9DPspPtr) -= here->MOS9gds+ - xnrm*(here->MOS9gm+here->MOS9gmbs); - *(here->MOS9SPgPtr) -= (xnrm-xrev)*here->MOS9gm; - *(here->MOS9SPsPtr) -= here->MOS9sourceConductance; - *(here->MOS9SPbPtr) -= here->MOS9gbs+(xnrm-xrev)*here->MOS9gmbs; - *(here->MOS9SPdpPtr) -= here->MOS9gds+ - xrev*(here->MOS9gm+here->MOS9gmbs); - - } - } - return(OK); -} diff --git a/src/spicelib/devices/mos9/mos9sacl.c b/src/spicelib/devices/mos9/mos9sacl.c deleted file mode 100644 index f1e303d99..000000000 --- a/src/spicelib/devices/mos9/mos9sacl.c +++ /dev/null @@ -1,781 +0,0 @@ -/********** -Copyright 1990 Regents of the University of California. All rights reserved. -Author: 1985 Thomas L. Quarles -Modified: Alan Gillespie - -This function is obsolete (was used by an old sensitivity analysis) -**********/ - -/* actually load the current ac sensitivity - * information into the array previously provided - */ - -#include "ngspice/ngspice.h" -#include "ngspice/smpdefs.h" -#include "ngspice/cktdefs.h" -#include "ngspice/const.h" -#include "mos9defs.h" -#include "ngspice/sperror.h" -#include "ngspice/suffix.h" - -int -MOS9sAcLoad(GENmodel *inModel, CKTcircuit *ckt) -{ - MOS9model *model = (MOS9model *)inModel; - MOS9instance *here; - int xnrm; - int xrev; - double A0; - double Apert = 0.0; - double DELA; - double DELAinv; - double gdpr0; - double gspr0; - double gds0; - double gbs0; - double gbd0; - double gm0; - double gmbs0; - double gdpr; - double gspr; - double gds; - double gbs; - double gbd; - double gm; - double gmbs; - double xcgs0; - double xcgd0; - double xcgb0; - double xbd0; - double xbs0; - double xcgs; - double xcgd; - double xcgb; - double xbd; - double xbs; - double vbsOp; - double vbdOp; - double vspr; - double vdpr; - double vgs; - double vgd; - double vgb; - double vbs; - double vbd; - double vds; - double ivspr; - double ivdpr; - double ivgs; - double ivgd; - double ivgb; - double ivbs; - double ivbd; - double ivds; - double cspr; - double cdpr; - double cgs; - double cgd; - double cgb; - double cbs; - double cbd; - double cds; - double cs0; - double csprm0; - double cd0; - double cdprm0; - double cg0; - double cb0; - double cs; - double csprm; - double cd; - double cdprm; - double cg; - double cb; - double icspr; - double icdpr; - double icgs; - double icgd; - double icgb; - double icbs; - double icbd; - double icds; - double ics0; - double icsprm0; - double icd0; - double icdprm0; - double icg0; - double icb0; - double ics; - double icsprm; - double icd; - double icdprm; - double icg; - double icb; - double DvDp = 0.0; - int i; - int flag; - int error; - int iparmno; - double arg; - double sarg; - double sargsw; - double SaveState[44]; - int save_mode; - SENstruct *info; - -#ifdef SENSDEBUG - printf("MOS9senacload\n"); - printf("CKTomega = %.5e\n",ckt->CKTomega); -#endif /* SENSDEBUG */ - info = ckt->CKTsenInfo; - info->SENstatus = PERTURBATION; - for( ; model != NULL; model = MOS9nextModel(model)) { - for(here = MOS9instances(model); here!= NULL; - here = MOS9nextInstance(here)) { - - /* save the unperturbed values in the state vector */ - for(i=0; i <= 16; i++) - *(SaveState + i) = *(ckt->CKTstate0 + here->MOS9states + i); - - *(SaveState + 17) = here->MOS9sourceConductance; - *(SaveState + 18) = here->MOS9drainConductance; - *(SaveState + 19) = here->MOS9cd; - *(SaveState + 20) = here->MOS9cbs; - *(SaveState + 21) = here->MOS9cbd; - *(SaveState + 22) = here->MOS9gmbs; - *(SaveState + 23) = here->MOS9gm; - *(SaveState + 24) = here->MOS9gds; - *(SaveState + 25) = here->MOS9gbd; - *(SaveState + 26) = here->MOS9gbs; - *(SaveState + 27) = here->MOS9capbd; - *(SaveState + 28) = here->MOS9capbs; - *(SaveState + 29) = here->MOS9Cbd; - *(SaveState + 30) = here->MOS9Cbdsw; - *(SaveState + 31) = here->MOS9Cbs; - *(SaveState + 32) = here->MOS9Cbssw; - *(SaveState + 33) = here->MOS9f2d; - *(SaveState + 34) = here->MOS9f3d; - *(SaveState + 35) = here->MOS9f4d; - *(SaveState + 36) = here->MOS9f2s; - *(SaveState + 37) = here->MOS9f3s; - *(SaveState + 38) = here->MOS9f4s; - *(SaveState + 39) = here->MOS9cgs; - *(SaveState + 40) = here->MOS9cgd; - *(SaveState + 41) = here->MOS9cgb; - *(SaveState + 42) = here->MOS9vdsat; - *(SaveState + 43) = here->MOS9von; - save_mode = here->MOS9mode; - - xnrm=1; - xrev=0; - if (here->MOS9mode < 0) { - xnrm=0; - xrev=1; - } - - vbsOp = model->MOS9type * ( - *(ckt->CKTrhsOp+here->MOS9bNode) - - *(ckt->CKTrhsOp+here->MOS9sNodePrime)); - vbdOp = model->MOS9type * ( - *(ckt->CKTrhsOp+here->MOS9bNode) - - *(ckt->CKTrhsOp+here->MOS9dNodePrime)); - vspr = *(ckt->CKTrhsOld + here->MOS9sNode) - - *(ckt->CKTrhsOld + - here->MOS9sNodePrime) ; - ivspr = *(ckt->CKTirhsOld + here->MOS9sNode) - - *(ckt->CKTirhsOld + - here->MOS9sNodePrime) ; - vdpr = *(ckt->CKTrhsOld + here->MOS9dNode) - - *(ckt->CKTrhsOld + - here->MOS9dNodePrime) ; - ivdpr = *(ckt->CKTirhsOld + here->MOS9dNode) - - *(ckt->CKTirhsOld + - here->MOS9dNodePrime) ; - vgb = *(ckt->CKTrhsOld + here->MOS9gNode) - - *(ckt->CKTrhsOld + - here->MOS9bNode) ; - ivgb = *(ckt->CKTirhsOld + here->MOS9gNode) - - *(ckt->CKTirhsOld + - here->MOS9bNode) ; - vbs = *(ckt->CKTrhsOld + here->MOS9bNode) - - *(ckt->CKTrhsOld + - here->MOS9sNodePrime) ; - ivbs = *(ckt->CKTirhsOld + here->MOS9bNode) - - *(ckt->CKTirhsOld + - here->MOS9sNodePrime) ; - vbd = *(ckt->CKTrhsOld + here->MOS9bNode) - - *(ckt->CKTrhsOld + - here->MOS9dNodePrime) ; - ivbd = *(ckt->CKTirhsOld + here->MOS9bNode) - - *(ckt->CKTirhsOld + - here->MOS9dNodePrime) ; - vds = vbs - vbd ; - ivds = ivbs - ivbd ; - vgs = vgb + vbs ; - ivgs = ivgb + ivbs ; - vgd = vgb + vbd ; - ivgd = ivgb + ivbd ; - -#ifdef SENSDEBUG - printf("senacload instance name %s\n",here->MOS9name); - printf("gate = %d ,drain = %d, drainprm = %d\n", - here->MOS9gNode,here->MOS9dNode,here->MOS9dNodePrime); - printf("source = %d , sourceprm = %d ,body = %d, senparmno = %d\n", - here->MOS9sNode ,here->MOS9sNodePrime, - here->MOS9bNode,here->MOS9senParmNo); - printf("\n without perturbation \n"); -#endif /* SENSDEBUG */ - /* without perturbation */ - *(ckt->CKTstate0 + here->MOS9vbs) = vbsOp; - *(ckt->CKTstate0 + here->MOS9vbd) = vbdOp; - - here->MOS9senPertFlag = ON ; - if(info->SENacpertflag == 1){ - /* store the unperturbed values of small signal parameters */ - if((error = MOS9load((GENmodel*)model,ckt)) != 0) return(error); - *(here->MOS9senCgs) = here->MOS9cgs; - *(here->MOS9senCgd) = here->MOS9cgd; - *(here->MOS9senCgb) = here->MOS9cgb; - *(here->MOS9senCbd) = here->MOS9capbd; - *(here->MOS9senCbs) = here->MOS9capbs; - *(here->MOS9senGds) = here->MOS9gds; - *(here->MOS9senGbs) = here->MOS9gbs; - *(here->MOS9senGbd) = here->MOS9gbd; - *(here->MOS9senGm) = here->MOS9gm; - *(here->MOS9senGmbs) = here->MOS9gmbs; - - } - xcgs0= *(here->MOS9senCgs) * ckt->CKTomega; - xcgd0= *(here->MOS9senCgd) * ckt->CKTomega; - xcgb0= *(here->MOS9senCgb) * ckt->CKTomega; - xbd0= *(here->MOS9senCbd) * ckt->CKTomega; - xbs0= *(here->MOS9senCbs) * ckt->CKTomega; - gds0= *(here->MOS9senGds); - gbs0= *(here->MOS9senGbs); - gbd0= *(here->MOS9senGbd); - gm0= *(here->MOS9senGm); - gmbs0= *(here->MOS9senGmbs); - gdpr0 = here->MOS9drainConductance; - gspr0 = here->MOS9sourceConductance; - - - cspr = gspr0 * vspr ; - icspr = gspr0 * ivspr ; - cdpr = gdpr0 * vdpr ; - icdpr = gdpr0 * ivdpr ; - cgs = ( - xcgs0 * ivgs ); - icgs = xcgs0 * vgs ; - cgd = ( - xcgd0 * ivgd ); - icgd = xcgd0 * vgd ; - cgb = ( - xcgb0 * ivgb ); - icgb = xcgb0 * vgb ; - cbs = ( gbs0 * vbs - xbs0 * ivbs ); - icbs = ( xbs0 * vbs + gbs0 * ivbs ); - cbd = ( gbd0 * vbd - xbd0 * ivbd ); - icbd = ( xbd0 * vbd + gbd0 * ivbd ); - cds = ( gds0 * vds + xnrm * (gm0 * vgs + gmbs0 * vbs) - - xrev * (gm0 * vgd + gmbs0 * vbd) ); - icds = ( gds0 * ivds + xnrm * (gm0 * ivgs + gmbs0 * ivbs) - - xrev * (gm0 * ivgd + gmbs0 * ivbd) ); - - cs0 = cspr; - ics0 = icspr; - csprm0 = ( -cspr - cgs - cbs - cds ) ; - icsprm0 = ( -icspr - icgs - icbs - icds ) ; - cd0 = cdpr; - icd0 = icdpr; - cdprm0 = ( -cdpr - cgd - cbd + cds ) ; - icdprm0 = ( -icdpr - icgd - icbd + icds ) ; - cg0 = cgs + cgd + cgb ; - icg0 = icgs + icgd + icgb ; - cb0 = cbs + cbd - cgb ; - icb0 = icbs + icbd - icgb ; -#ifdef SENSDEBUG - printf("gspr0 = %.7e , gdpr0 = %.7e , gds0 = %.7e, gbs0 = %.7e\n", - gspr0,gdpr0,gds0,gbs0); - printf("gbd0 = %.7e , gm0 = %.7e , gmbs0 = %.7e\n",gbd0,gm0,gmbs0); - printf("xcgs0 = %.7e , xcgd0 = %.7e ,", xcgs0,xcgd0); - printf("xcgb0 = %.7e, xbd0 = %.7e,xbs0 = %.7e\n" ,xcgb0,xbd0,xbs0); - printf("vbs = %.7e , vbd = %.7e , vgb = %.7e\n",vbs,vbd,vgb); - printf("ivbs = %.7e , ivbd = %.7e , ivgb = %.7e\n",ivbs,ivbd,ivgb); - printf("cbs0 = %.7e , cbd0 = %.7e , cgb0 = %.7e\n",cbs,cbd,cgb); - printf("cb0 = %.7e , cg0 = %.7e , cs0 = %.7e\n",cb0,cg0,cs0); - printf("csprm0 = %.7e, cd0 = %.7e, cdprm0 = %.7e\n", - csprm0,cd0,cdprm0); - printf("icb0 = %.7e , icg0 = %.7e , ics0 = %.7e\n",icb0,icg0,ics0); - printf("icsprm0 = %.7e, icd0 = %.7e, icdprm0 = %.7e\n", - icsprm0,icd0,icdprm0); - printf("\nPerturbation of vbs\n"); -#endif /* SENSDEBUG */ - - /* Perturbation of vbs */ - flag = 1; - A0 = vbsOp; - DELA = info->SENpertfac * CONSTvt0 ; - DELAinv = 1.0/DELA; - - if(info->SENacpertflag == 1){ - /* store the values of small signal parameters - * corresponding to perturbed vbs */ - Apert = A0 + DELA; - *(ckt->CKTstate0 + here->MOS9vbs) = Apert; - *(ckt->CKTstate0 + here->MOS9vbd) = vbdOp; - - if((error = MOS9load((GENmodel*)model,ckt)) != 0) return(error); - - *(here->MOS9senCgs + 1) = here->MOS9cgs; - *(here->MOS9senCgd + 1) = here->MOS9cgd; - *(here->MOS9senCgb + 1) = here->MOS9cgb; - *(here->MOS9senCbd + 1) = here->MOS9capbd; - *(here->MOS9senCbs + 1) = here->MOS9capbs; - *(here->MOS9senGds + 1) = here->MOS9gds; - *(here->MOS9senGbs + 1) = here->MOS9gbs; - *(here->MOS9senGbd + 1) = here->MOS9gbd; - *(here->MOS9senGm + 1) = here->MOS9gm; - *(here->MOS9senGmbs + 1) = here->MOS9gmbs; - - *(ckt->CKTstate0 + here->MOS9vbs) = A0; - - - } - - goto load; - - -pertvbd: /* Perturbation of vbd */ -#ifdef SENSDEBUG - printf("\nPerturbation of vbd\n"); -#endif /* SENSDEBUG */ - - flag = 2; - A0 = vbdOp; - DELA = info->SENpertfac * CONSTvt0 + 1e-8; - DELAinv = 1.0/DELA; - - if(info->SENacpertflag == 1){ - /* store the values of small signal parameters - * corresponding to perturbed vbd */ - Apert = A0 + DELA; - *(ckt->CKTstate0 + here->MOS9vbs) = vbsOp; - *(ckt->CKTstate0 + here->MOS9vbd) = Apert; - - if((error = MOS9load((GENmodel*)model,ckt)) != 0) return(error); - - *(here->MOS9senCgs + 2) = here->MOS9cgs; - *(here->MOS9senCgd + 2) = here->MOS9cgd; - *(here->MOS9senCgb + 2) = here->MOS9cgb; - *(here->MOS9senCbd + 2) = here->MOS9capbd; - *(here->MOS9senCbs + 2) = here->MOS9capbs; - *(here->MOS9senGds + 2) = here->MOS9gds; - *(here->MOS9senGbs + 2) = here->MOS9gbs; - *(here->MOS9senGbd + 2) = here->MOS9gbd; - *(here->MOS9senGm + 2) = here->MOS9gm; - *(here->MOS9senGmbs + 2) = here->MOS9gmbs; - - *(ckt->CKTstate0 + here->MOS9vbd) = A0; - - } - - goto load; - - -pertvgb: /* Perturbation of vgb */ -#ifdef SENSDEBUG - printf("\nPerturbation of vgb\n"); -#endif /* SENSDEBUG */ - - flag = 3; - A0 = model->MOS9type * (*(ckt->CKTrhsOp + here->MOS9gNode) - - *(ckt->CKTrhsOp + here->MOS9bNode)); - DELA = info->SENpertfac * A0 + 1e-8; - DELAinv = model->MOS9type * 1.0/DELA; - - - if(info->SENacpertflag == 1){ - /* store the values of small signal parameters - * corresponding to perturbed vgb */ - *(ckt->CKTstate0 + here->MOS9vbs) = vbsOp; - *(ckt->CKTstate0 + here->MOS9vbd) = vbdOp; - *(ckt->CKTrhsOp + here->MOS9bNode) -= DELA; - - if((error = MOS9load((GENmodel*)model,ckt)) != 0) return(error); - - *(here->MOS9senCgs + 3) = here->MOS9cgs; - *(here->MOS9senCgd + 3) = here->MOS9cgd; - *(here->MOS9senCgb + 3) = here->MOS9cgb; - *(here->MOS9senCbd + 3) = here->MOS9capbd; - *(here->MOS9senCbs + 3) = here->MOS9capbs; - *(here->MOS9senGds + 3) = here->MOS9gds; - *(here->MOS9senGbs + 3) = here->MOS9gbs; - *(here->MOS9senGbd + 3) = here->MOS9gbd; - *(here->MOS9senGm + 3) = here->MOS9gm; - *(here->MOS9senGmbs + 3) = here->MOS9gmbs; - - - *(ckt->CKTrhsOp + here->MOS9bNode) += DELA; - } - goto load; - -pertl: /* Perturbation of length */ - - if(here->MOS9sens_l == 0){ - goto pertw; - } -#ifdef SENSDEBUG - printf("\nPerturbation of length\n"); -#endif /* SENSDEBUG */ - flag = 4; - A0 = here->MOS9l; - DELA = info->SENpertfac * A0; - DELAinv = 1.0/DELA; - - if(info->SENacpertflag == 1){ - /* store the values of small signal parameters - * corresponding to perturbed length */ - Apert = A0 + DELA; - here->MOS9l = Apert; - - *(ckt->CKTstate0 + here->MOS9vbs) = vbsOp; - *(ckt->CKTstate0 + here->MOS9vbd) = vbdOp; - - if((error = MOS9load((GENmodel*)model,ckt)) != 0) return(error); - - *(here->MOS9senCgs + 4) = here->MOS9cgs; - *(here->MOS9senCgd + 4) = here->MOS9cgd; - *(here->MOS9senCgb + 4) = here->MOS9cgb; - *(here->MOS9senCbd + 4) = here->MOS9capbd; - *(here->MOS9senCbs + 4) = here->MOS9capbs; - *(here->MOS9senGds + 4) = here->MOS9gds; - *(here->MOS9senGbs + 4) = here->MOS9gbs; - *(here->MOS9senGbd + 4) = here->MOS9gbd; - *(here->MOS9senGm + 4) = here->MOS9gm; - *(here->MOS9senGmbs + 4) = here->MOS9gmbs; - - here->MOS9l = A0; - - } - - goto load; - -pertw: /* Perturbation of width */ - if(here->MOS9sens_w == 0) - goto next; -#ifdef SENSDEBUG - printf("\nPerturbation of width\n"); -#endif /* SENSDEBUG */ - flag = 5; - A0 = here->MOS9w; - DELA = info->SENpertfac * A0; - DELAinv = 1.0/DELA; - Apert = A0 + DELA; - - if(info->SENacpertflag == 1){ - /* store the values of small signal parameters - * corresponding to perturbed width */ - here->MOS9w = Apert; - here->MOS9drainArea *= (1 + info->SENpertfac); - here->MOS9sourceArea *= (1 + info->SENpertfac); - here->MOS9Cbd *= (1 + info->SENpertfac); - here->MOS9Cbs *= (1 + info->SENpertfac); - if(here->MOS9drainPerimiter){ - here->MOS9Cbdsw += here->MOS9Cbdsw * - DELA/here->MOS9drainPerimiter; - } - if(here->MOS9sourcePerimiter){ - here->MOS9Cbssw += here->MOS9Cbssw * - DELA/here->MOS9sourcePerimiter; - } - if(vbdOp >= here->MOS9tDepCap){ - arg = 1-model->MOS9fwdCapDepCoeff; - sarg = exp( (-model->MOS9bulkJctBotGradingCoeff) * - log(arg) ); - sargsw = exp( (-model->MOS9bulkJctSideGradingCoeff) * - log(arg) ); - here->MOS9f2d = here->MOS9Cbd*(1-model->MOS9fwdCapDepCoeff* - (1+model->MOS9bulkJctBotGradingCoeff))* sarg/arg - + here->MOS9Cbdsw*(1-model->MOS9fwdCapDepCoeff* - (1+model->MOS9bulkJctSideGradingCoeff))* - sargsw/arg; - here->MOS9f3d = here->MOS9Cbd * - model->MOS9bulkJctBotGradingCoeff * sarg/arg/ - model->MOS9bulkJctPotential - + here->MOS9Cbdsw * - model->MOS9bulkJctSideGradingCoeff * sargsw/arg / - model->MOS9bulkJctPotential; - here->MOS9f4d = here->MOS9Cbd*model->MOS9bulkJctPotential* - (1-arg*sarg)/ (1-model->MOS9bulkJctBotGradingCoeff) - + here->MOS9Cbdsw*model->MOS9bulkJctPotential* - (1-arg*sargsw)/ - (1-model->MOS9bulkJctSideGradingCoeff) - -here->MOS9f3d/2* - (here->MOS9tDepCap*here->MOS9tDepCap) - -here->MOS9tDepCap * here->MOS9f2d; - } - if(vbsOp >= here->MOS9tDepCap){ - arg = 1-model->MOS9fwdCapDepCoeff; - sarg = exp( (-model->MOS9bulkJctBotGradingCoeff) * - log(arg) ); - sargsw = exp( (-model->MOS9bulkJctSideGradingCoeff) * - log(arg) ); - here->MOS9f2s = here->MOS9Cbs*(1-model->MOS9fwdCapDepCoeff* - (1+model->MOS9bulkJctBotGradingCoeff))* sarg/arg - + here->MOS9Cbssw*(1-model->MOS9fwdCapDepCoeff* - (1+model->MOS9bulkJctSideGradingCoeff))* - sargsw/arg; - here->MOS9f3s = here->MOS9Cbs * - model->MOS9bulkJctBotGradingCoeff * sarg/arg/ - model->MOS9bulkJctPotential + here->MOS9Cbssw * - model->MOS9bulkJctSideGradingCoeff * sargsw/arg / - model->MOS9bulkJctPotential; - here->MOS9f4s = here->MOS9Cbs*model->MOS9bulkJctPotential* - (1-arg*sarg)/ (1-model->MOS9bulkJctBotGradingCoeff) - + here->MOS9Cbssw*model->MOS9bulkJctPotential* - (1-arg*sargsw)/ - (1-model->MOS9bulkJctSideGradingCoeff) - -here->MOS9f3s/2* - (here->MOS9tBulkPot*here->MOS9tBulkPot) - -here->MOS9tBulkPot * here->MOS9f2s; - } - - *(ckt->CKTstate0 + here->MOS9vbs) = vbsOp; - *(ckt->CKTstate0 + here->MOS9vbd) = vbdOp; - - if((error = MOS9load((GENmodel*)model,ckt)) != 0) return(error); - - *(here->MOS9senCgs + 5) = here->MOS9cgs; - *(here->MOS9senCgd + 5) = here->MOS9cgd; - *(here->MOS9senCgb + 5) = here->MOS9cgb; - *(here->MOS9senCbd + 5) = here->MOS9capbd; - *(here->MOS9senCbs + 5) = here->MOS9capbs; - *(here->MOS9senGds + 5) = here->MOS9gds; - *(here->MOS9senGbs + 5) = here->MOS9gbs; - *(here->MOS9senGbd + 5) = here->MOS9gbd; - *(here->MOS9senGm + 5) = here->MOS9gm; - *(here->MOS9senGmbs + 5) = here->MOS9gmbs; - - here->MOS9w = A0; - here->MOS9drainArea /= (1 + info->SENpertfac); - here->MOS9sourceArea /= (1 + info->SENpertfac); - } - -load: - - gds= *(here->MOS9senGds + flag); - gbs= *(here->MOS9senGbs + flag); - gbd= *(here->MOS9senGbd + flag); - gm= *(here->MOS9senGm + flag); - gmbs= *(here->MOS9senGmbs + flag); - if(flag == 5){ - gdpr = here->MOS9drainConductance * Apert/A0; - gspr = here->MOS9sourceConductance * Apert/A0; - } - else{ - gdpr = here->MOS9drainConductance; - gspr = here->MOS9sourceConductance; - } - - xcgs= *(here->MOS9senCgs + flag) * ckt->CKTomega; - xcgd= *(here->MOS9senCgd + flag) * ckt->CKTomega; - xcgb= *(here->MOS9senCgb + flag) * ckt->CKTomega; - xbd= *(here->MOS9senCbd + flag) * ckt->CKTomega; - xbs= *(here->MOS9senCbs + flag) * ckt->CKTomega; - -#ifdef SENSDEBUG - printf("flag = %d \n",flag); - printf("gspr = %.7e , gdpr = %.7e , gds = %.7e, gbs = %.7e\n", - gspr,gdpr,gds,gbs); - printf("gbd = %.7e , gm = %.7e , gmbs = %.7e\n",gbd,gm,gmbs); - printf("xcgs = %.7e , xcgd = %.7e , xcgb = %.7e,", xcgs,xcgd,xcgb); - printf("xbd = %.7e,xbs = %.7e\n" ,xbd,xbs); -#endif /* SENSDEBUG */ - cspr = gspr * vspr ; - icspr = gspr * ivspr ; - cdpr = gdpr * vdpr ; - icdpr = gdpr * ivdpr ; - cgs = ( - xcgs * ivgs ); - icgs = xcgs * vgs ; - cgd = ( - xcgd * ivgd ); - icgd = xcgd * vgd ; - cgb = ( - xcgb * ivgb ); - icgb = xcgb * vgb ; - cbs = ( gbs * vbs - xbs * ivbs ); - icbs = ( xbs * vbs + gbs * ivbs ); - cbd = ( gbd * vbd - xbd * ivbd ); - icbd = ( xbd * vbd + gbd * ivbd ); - cds = ( gds * vds + xnrm * (gm * vgs + gmbs * vbs) - - xrev * (gm * vgd + gmbs * vbd) ); - icds = ( gds * ivds + xnrm * (gm * ivgs + gmbs * ivbs) - - xrev * (gm * ivgd + gmbs * ivbd) ); - - cs = cspr; - ics = icspr; - csprm = ( -cspr - cgs - cbs - cds ) ; - icsprm = ( -icspr - icgs - icbs - icds ) ; - cd = cdpr; - icd = icdpr; - cdprm = ( -cdpr - cgd - cbd + cds ) ; - icdprm = ( -icdpr - icgd - icbd + icds ) ; - cg = cgs + cgd + cgb ; - icg = icgs + icgd + icgb ; - cb = cbs + cbd - cgb ; - icb = icbs + icbd - icgb ; - -#ifdef SENSDEBUG - printf("vbs = %.7e , vbd = %.7e , vgb = %.7e\n",vbs,vbd,vgb); - printf("ivbs = %.7e , ivbd = %.7e , ivgb = %.7e\n",ivbs,ivbd,ivgb); - printf("cbs = %.7e , cbd = %.7e , cgb = %.7e\n",cbs,cbd,cgb); - printf("cb = %.7e , cg = %.7e , cs = %.7e\n",cb,cg,cs); - printf("csprm = %.7e, cd = %.7e, cdprm = %.7e\n",csprm,cd,cdprm); - printf("icb = %.7e , icg = %.7e , ics = %.7e\n",icb,icg,ics); - printf("icsprm = %.7e, icd = %.7e, icdprm = %.7e\n", - icsprm,icd,icdprm); -#endif /* SENSDEBUG */ - for(iparmno = 1;iparmno<=info->SENparms;iparmno++){ - if( (flag == 4) && (iparmno != here->MOS9senParmNo) ) continue; - if( (flag == 5) && (iparmno != (here->MOS9senParmNo + - (int) here->MOS9sens_l)) ) continue; - - switch(flag){ - case 1: - DvDp = model->MOS9type * - (info->SEN_Sap[here->MOS9bNode][iparmno] - - info->SEN_Sap[here->MOS9sNodePrime][iparmno]); - break; - case 2: - DvDp = model->MOS9type * - ( info->SEN_Sap[here->MOS9bNode][iparmno] - - info->SEN_Sap[here->MOS9dNodePrime][iparmno]); - break; - case 3: - DvDp = model->MOS9type * - ( info->SEN_Sap[here->MOS9gNode][iparmno] - - info->SEN_Sap[here->MOS9bNode][iparmno]); - break; - case 4: - DvDp = 1; - break; - case 5: - DvDp = 1; - break; - } - *(info->SEN_RHS[here->MOS9bNode] + iparmno) -= - ( cb - cb0) * DELAinv * DvDp; - *(info->SEN_iRHS[here->MOS9bNode] + iparmno) -= - ( icb - icb0) * DELAinv * DvDp; - - *(info->SEN_RHS[here->MOS9gNode] + iparmno) -= - ( cg - cg0) * DELAinv * DvDp; - *(info->SEN_iRHS[here->MOS9gNode] + iparmno) -= - ( icg - icg0) * DELAinv * DvDp; - - if(here->MOS9sNode != here->MOS9sNodePrime){ - *(info->SEN_RHS[here->MOS9sNode] + iparmno) -= - ( cs - cs0) * DELAinv * DvDp; - *(info->SEN_iRHS[here->MOS9sNode] + iparmno) -= - ( ics - ics0) * DELAinv * DvDp; - } - - *(info->SEN_RHS[here->MOS9sNodePrime] + iparmno) -= - ( csprm - csprm0) * DELAinv * DvDp; - *(info->SEN_iRHS[here->MOS9sNodePrime] + iparmno) -= - ( icsprm - icsprm0) * DELAinv * DvDp; - - if(here->MOS9dNode != here->MOS9dNodePrime){ - *(info->SEN_RHS[here->MOS9dNode] + iparmno) -= - ( cd - cd0) * DELAinv * DvDp; - *(info->SEN_iRHS[here->MOS9dNode] + iparmno) -= - ( icd - icd0) * DELAinv * DvDp; - } - - *(info->SEN_RHS[here->MOS9dNodePrime] + iparmno) -= - ( cdprm - cdprm0) * DELAinv * DvDp; - *(info->SEN_iRHS[here->MOS9dNodePrime] + iparmno) -= - ( icdprm - icdprm0) * DELAinv * DvDp; -#ifdef SENSDEBUG - printf("after loading\n"); - printf("DvDp = %.5e , DELAinv = %.5e ,flag = %d ,", - DvDp,DELAinv,flag); - printf("iparmno = %d,senparmno = %d\n", - iparmno,here->MOS9senParmNo); - printf("A0 = %.5e , Apert = %.5e ,CONSTvt0 = %.5e \n", - A0,Apert,CONSTvt0); - printf("senb = %.7e + j%.7e ", - *(info->SEN_RHS[here->MOS9bNode] + iparmno), - *(info->SEN_iRHS[here->MOS9bNode] + iparmno)); - printf("seng = %.7e + j%.7e ", - *(info->SEN_RHS[here->MOS9gNode] + iparmno), - *(info->SEN_iRHS[here->MOS9gNode] + iparmno)); - printf("sens = %.7e + j%.7e ", - *(info->SEN_RHS[here->MOS9sNode] + iparmno), - *(info->SEN_iRHS[here->MOS9sNode] + iparmno)); - printf("sensprm = %.7e + j%.7e ", - *(info->SEN_RHS[here->MOS9sNodePrime] + iparmno), - *(info->SEN_iRHS[here->MOS9sNodePrime] + iparmno)); - printf("send = %.7e + j%.7e ", - *(info->SEN_RHS[here->MOS9dNode] + iparmno), - *(info->SEN_iRHS[here->MOS9dNode] + iparmno)); - printf("sendprm = %.7e + j%.7e ", - *(info->SEN_RHS[here->MOS9dNodePrime] + iparmno), - *(info->SEN_iRHS[here->MOS9dNodePrime] + iparmno)); -#endif /* SENSDEBUG */ - - } - switch(flag){ - case 1: - goto pertvbd ; - case 2: - goto pertvgb ; - case 3: - goto pertl ; - case 4: - goto pertw ; - case 5: - break; - } -next: - ; - - /* put the unperturbed values back into the state vector */ - for(i=0; i <= 16; i++) - *(ckt->CKTstate0 + here->MOS9states + i) = *(SaveState + i); - - here->MOS9sourceConductance = *(SaveState + 17) ; - here->MOS9drainConductance = *(SaveState + 18) ; - here->MOS9cd = *(SaveState + 19) ; - here->MOS9cbs = *(SaveState + 20) ; - here->MOS9cbd = *(SaveState + 21) ; - here->MOS9gmbs = *(SaveState + 22) ; - here->MOS9gm = *(SaveState + 23) ; - here->MOS9gds = *(SaveState + 24) ; - here->MOS9gbd = *(SaveState + 25) ; - here->MOS9gbs = *(SaveState + 26) ; - here->MOS9capbd = *(SaveState + 27) ; - here->MOS9capbs = *(SaveState + 28) ; - here->MOS9Cbd = *(SaveState + 29) ; - here->MOS9Cbdsw = *(SaveState + 30) ; - here->MOS9Cbs = *(SaveState + 31) ; - here->MOS9Cbssw = *(SaveState + 32) ; - here->MOS9f2d = *(SaveState + 33) ; - here->MOS9f3d = *(SaveState + 34) ; - here->MOS9f4d = *(SaveState + 35) ; - here->MOS9f2s = *(SaveState + 36) ; - here->MOS9f3s = *(SaveState + 37) ; - here->MOS9f4s = *(SaveState + 38) ; - here->MOS9cgs = *(SaveState + 39) ; - here->MOS9cgd = *(SaveState + 40) ; - here->MOS9cgb = *(SaveState + 41) ; - here->MOS9vdsat = *(SaveState + 42) ; - here->MOS9von = *(SaveState + 43) ; - here->MOS9mode = save_mode ; - - here->MOS9senPertFlag = OFF; - } - } - info->SENstatus = NORMAL; -#ifdef SENSDEBUG - printf("MOS9senacload end\n"); -#endif /* SENSDEBUG */ - return(OK); -} - - diff --git a/src/spicelib/devices/mos9/mos9set.c b/src/spicelib/devices/mos9/mos9set.c deleted file mode 100644 index 1dddbd7e7..000000000 --- a/src/spicelib/devices/mos9/mos9set.c +++ /dev/null @@ -1,286 +0,0 @@ -/********** -Copyright 1990 Regents of the University of California. All rights reserved. -Author: 1985 Thomas L. Quarles -Modified: Alan Gillespie -**********/ - -#include "ngspice/ngspice.h" -#include "ngspice/smpdefs.h" -#include "ngspice/cktdefs.h" -#include "mos9defs.h" -#include "ngspice/const.h" -#include "ngspice/sperror.h" -#include "ngspice/suffix.h" - -/* assuming silicon - make definition for epsilon of silicon */ -#define EPSSIL (11.7 * 8.854214871e-12) - -int -MOS9setup(SMPmatrix *matrix, GENmodel *inModel, CKTcircuit *ckt, int *states) - /* load the MOS9 device structure with those pointers needed later - * for fast matrix loading - */ - -{ - register MOS9model *model = (MOS9model *)inModel; - register MOS9instance *here; - int error; - CKTnode *tmp; - - /* loop through all the MOS9 device models */ - for( ; model != NULL; model = MOS9nextModel(model)) { - - /* perform model defaulting */ - if(!model->MOS9typeGiven) { - model->MOS9type = NMOS; - } - if(!model->MOS9latDiffGiven) { - model->MOS9latDiff = 0; - } - if(!model->MOS9lengthAdjustGiven) { - model->MOS9lengthAdjust = 0; - } - if(!model->MOS9widthNarrowGiven) { - model->MOS9widthNarrow = 0; - } - if(!model->MOS9widthAdjustGiven) { - model->MOS9widthAdjust = 0; - } - if(!model->MOS9delvt0Given) { - model->MOS9delvt0 = 0; - } - if(!model->MOS9jctSatCurDensityGiven) { - model->MOS9jctSatCurDensity = 0; - } - if(!model->MOS9jctSatCurGiven) { - model->MOS9jctSatCur = 1e-14; - } - if(!model->MOS9drainResistanceGiven) { - model->MOS9drainResistance = 0; - } - if(!model->MOS9sourceResistanceGiven) { - model->MOS9sourceResistance = 0; - } - if(!model->MOS9sheetResistanceGiven) { - model->MOS9sheetResistance = 0; - } - if(!model->MOS9transconductanceGiven) { - model->MOS9transconductance = 2e-5; - } - if(!model->MOS9gateSourceOverlapCapFactorGiven) { - model->MOS9gateSourceOverlapCapFactor = 0; - } - if(!model->MOS9gateDrainOverlapCapFactorGiven) { - model->MOS9gateDrainOverlapCapFactor = 0; - } - if(!model->MOS9gateBulkOverlapCapFactorGiven) { - model->MOS9gateBulkOverlapCapFactor = 0; - } - if(!model->MOS9vt0Given) { - model->MOS9vt0 = 0; - } - if(!model->MOS9capBDGiven) { - model->MOS9capBD = 0; - } - if(!model->MOS9capBSGiven) { - model->MOS9capBS = 0; - } - if(!model->MOS9bulkCapFactorGiven) { - model->MOS9bulkCapFactor = 0; - } - if(!model->MOS9sideWallCapFactorGiven) { - model->MOS9sideWallCapFactor = 0; - } - if(!model->MOS9bulkJctPotentialGiven) { - model->MOS9bulkJctPotential = .8; - } - if(!model->MOS9bulkJctBotGradingCoeffGiven) { - model->MOS9bulkJctBotGradingCoeff = .5; - } - if(!model->MOS9bulkJctSideGradingCoeffGiven) { - model->MOS9bulkJctSideGradingCoeff = .33; - } - if(!model->MOS9fwdCapDepCoeffGiven) { - model->MOS9fwdCapDepCoeff = .5; - } - if(!model->MOS9phiGiven) { - model->MOS9phi = .6; - } - if(!model->MOS9gammaGiven) { - model->MOS9gamma = 0; - } - if(!model->MOS9deltaGiven) { - model->MOS9delta = 0; - } - if(!model->MOS9maxDriftVelGiven) { - model->MOS9maxDriftVel = 0; - } - if(!model->MOS9junctionDepthGiven) { - model->MOS9junctionDepth = 0; - } - if(!model->MOS9fastSurfaceStateDensityGiven) { - model->MOS9fastSurfaceStateDensity = 0; - } - if(!model->MOS9etaGiven) { - model->MOS9eta = 0; - } - if(!model->MOS9thetaGiven) { - model->MOS9theta = 0; - } - if(!model->MOS9kappaGiven) { - model->MOS9kappa = .2; - } - if(!model->MOS9oxideThicknessGiven) { - model->MOS9oxideThickness = 1e-7; - } - if(!model->MOS9fNcoefGiven) { - model->MOS9fNcoef = 0; - } - if(!model->MOS9fNexpGiven) { - model->MOS9fNexp = 1; - } - - /* loop through all the instances of the model */ - for (here = MOS9instances(model); here != NULL ; - here=MOS9nextInstance(here)) { - - CKTnode *tmpNode; - IFuid tmpName; - - /* allocate a chunk of the state vector */ - here->MOS9states = *states; - *states += MOS9NUMSTATES; - - if(!here->MOS9drainAreaGiven) { - here->MOS9drainArea = ckt->CKTdefaultMosAD; - } - if(!here->MOS9drainPerimiterGiven) { - here->MOS9drainPerimiter = 0; - } - if(!here->MOS9drainSquaresGiven) { - here->MOS9drainSquares = 1; - } - if(!here->MOS9icVBSGiven) { - here->MOS9icVBS = 0; - } - if(!here->MOS9icVDSGiven) { - here->MOS9icVDS = 0; - } - if(!here->MOS9icVGSGiven) { - here->MOS9icVGS = 0; - } - if(!here->MOS9sourcePerimiterGiven) { - here->MOS9sourcePerimiter = 0; - } - if(!here->MOS9sourceSquaresGiven) { - here->MOS9sourceSquares = 1; - } - if(!here->MOS9vdsatGiven) { - here->MOS9vdsat = 0; - } - if(!here->MOS9vonGiven) { - here->MOS9von = 0; - } - if(!here->MOS9modeGiven) { - here->MOS9mode = 1; - } - - if((model->MOS9drainResistance != 0 || - (model->MOS9sheetResistance != 0 && - here->MOS9drainSquares != 0 ) )) { - if (here->MOS9dNodePrime==0) { - error = CKTmkVolt(ckt,&tmp,here->MOS9name,"internal#drain"); - if(error) return(error); - here->MOS9dNodePrime = tmp->number; - if (ckt->CKTcopyNodesets) { - if (CKTinst2Node(ckt,here,1,&tmpNode,&tmpName)==OK) { - if (tmpNode->nsGiven) { - tmp->nodeset=tmpNode->nodeset; - tmp->nsGiven=tmpNode->nsGiven; - } - } - } - } - } else { - here->MOS9dNodePrime = here->MOS9dNode; - } - - if((model->MOS9sourceResistance != 0 || - (model->MOS9sheetResistance != 0 && - here->MOS9sourceSquares != 0 ) )) { - if (here->MOS9sNodePrime == 0) { - error = CKTmkVolt(ckt,&tmp,here->MOS9name,"internal#source"); - if(error) return(error); - here->MOS9sNodePrime = tmp->number; - if (ckt->CKTcopyNodesets) { - if (CKTinst2Node(ckt,here,3,&tmpNode,&tmpName)==OK) { - if (tmpNode->nsGiven) { - tmp->nodeset=tmpNode->nodeset; - tmp->nsGiven=tmpNode->nsGiven; - } - } - } - } - } else { - here->MOS9sNodePrime = here->MOS9sNode; - } - -/* macro to make elements with built in test for out of memory */ -#define TSTALLOC(ptr,first,second) \ -do { if((here->ptr = SMPmakeElt(matrix, here->first, here->second)) == NULL){\ - return(E_NOMEM);\ -} } while(0) - - TSTALLOC(MOS9DdPtr, MOS9dNode, MOS9dNode); - TSTALLOC(MOS9GgPtr, MOS9gNode, MOS9gNode); - TSTALLOC(MOS9SsPtr, MOS9sNode, MOS9sNode); - TSTALLOC(MOS9BbPtr, MOS9bNode, MOS9bNode); - TSTALLOC(MOS9DPdpPtr, MOS9dNodePrime, MOS9dNodePrime); - TSTALLOC(MOS9SPspPtr, MOS9sNodePrime, MOS9sNodePrime); - TSTALLOC(MOS9DdpPtr, MOS9dNode, MOS9dNodePrime); - TSTALLOC(MOS9GbPtr, MOS9gNode, MOS9bNode); - TSTALLOC(MOS9GdpPtr, MOS9gNode, MOS9dNodePrime); - TSTALLOC(MOS9GspPtr, MOS9gNode, MOS9sNodePrime); - TSTALLOC(MOS9SspPtr, MOS9sNode, MOS9sNodePrime); - TSTALLOC(MOS9BdpPtr, MOS9bNode, MOS9dNodePrime); - TSTALLOC(MOS9BspPtr, MOS9bNode, MOS9sNodePrime); - TSTALLOC(MOS9DPspPtr, MOS9dNodePrime, MOS9sNodePrime); - TSTALLOC(MOS9DPdPtr, MOS9dNodePrime, MOS9dNode); - TSTALLOC(MOS9BgPtr, MOS9bNode, MOS9gNode); - TSTALLOC(MOS9DPgPtr, MOS9dNodePrime, MOS9gNode); - TSTALLOC(MOS9SPgPtr, MOS9sNodePrime, MOS9gNode); - TSTALLOC(MOS9SPsPtr, MOS9sNodePrime, MOS9sNode); - TSTALLOC(MOS9DPbPtr, MOS9dNodePrime, MOS9bNode); - TSTALLOC(MOS9SPbPtr, MOS9sNodePrime, MOS9bNode); - TSTALLOC(MOS9SPdpPtr, MOS9sNodePrime, MOS9dNodePrime); - - } - } - return(OK); -} - -int -MOS9unsetup(GENmodel *inModel, CKTcircuit *ckt) -{ - MOS9model *model; - MOS9instance *here; - - for (model = (MOS9model *)inModel; model != NULL; - model = MOS9nextModel(model)) - { - for (here = MOS9instances(model); here != NULL; - here=MOS9nextInstance(here)) - { - if (here->MOS9sNodePrime > 0 - && here->MOS9sNodePrime != here->MOS9sNode) - CKTdltNNum(ckt, here->MOS9sNodePrime); - here->MOS9sNodePrime= 0; - - if (here->MOS9dNodePrime > 0 - && here->MOS9dNodePrime != here->MOS9dNode) - CKTdltNNum(ckt, here->MOS9dNodePrime); - here->MOS9dNodePrime= 0; - } - } - return OK; -} diff --git a/src/spicelib/devices/mos9/mos9sld.c b/src/spicelib/devices/mos9/mos9sld.c deleted file mode 100644 index 83b2c8b21..000000000 --- a/src/spicelib/devices/mos9/mos9sld.c +++ /dev/null @@ -1,624 +0,0 @@ -/********** -Copyright 1990 Regents of the University of California. All rights reserved. -Author: 1985 Thomas L. Quarles -Modified: Alan Gillespie - -This function is obsolete (was used by an old sensitivity analysis) -**********/ - -/* actually load the current sensitivity - * information into the array previously provided - */ - -#include "ngspice/ngspice.h" -#include "ngspice/smpdefs.h" -#include "ngspice/cktdefs.h" -#include "mos9defs.h" -#include "ngspice/sperror.h" -#include "ngspice/suffix.h" - -int -MOS9sLoad(GENmodel *inModel, CKTcircuit *ckt) -{ - MOS9model *model = (MOS9model *)inModel; - MOS9instance *here; - double SaveState[44]; - int save_mode; - int i; - int iparmno; - int error; - int flag; - double A0; - double DELA; - double Apert; - double DELAinv; - double gspr0; - double gspr; - double gdpr0; - double gdpr; - double cdpr0; - double cspr0; - double cd0; - double cbd0; - double cbs0; - double cd; - double cbd; - double cbs; - double DcdprDp; - double DcsprDp; - double DcbDp; - double DcdDp; - double DcbsDp; - double DcbdDp; - double DcdprmDp; - double DcsprmDp; - double qgs0; - double qgd0; - double qgb0; - double qbd0; - double qbd; - double qbs0; - double qbs; - double DqgsDp; - double DqgdDp; - double DqgbDp; - double DqbdDp; - double DqbsDp; - double Osxpgs; - double Osxpgd; - double Osxpgb; - double Osxpbd; - double Osxpbs; - double tag0; - double tag1; - double arg; - double sarg; - double sargsw; - int offset; - double EffectiveLength; - double EffectiveWidth; - SENstruct *info; - -#ifdef SENSDEBUG - printf("MOS9senload \n"); - printf("CKTtime = %.5e\n",ckt->CKTtime); - printf("CKTorder = %d\n",ckt->CKTorder); -#endif /* SENSDEBUG */ - - info = ckt->CKTsenInfo; - info->SENstatus = PERTURBATION; - - tag0 = ckt->CKTag[0]; - tag1 = ckt->CKTag[1]; - if(ckt->CKTorder == 1){ - tag1 = 0; - } - - /* loop through all the models */ - for( ; model != NULL; model = MOS9nextModel(model)) { - - /* loop through all the instances of the model */ - for (here = MOS9instances(model); here != NULL ; - here=MOS9nextInstance(here)) { - -#ifdef SENSDEBUG - printf("senload instance name %s\n",here->MOS9name); - printf("gate = %d ,drain = %d, drainprm = %d\n", - here->MOS9gNode,here->MOS9dNode,here->MOS9dNodePrime); - printf("source = %d , sourceprm = %d ,body = %d, senparmno = %d\n", - here->MOS9sNode ,here->MOS9sNodePrime, - here->MOS9bNode,here->MOS9senParmNo); -#endif /* SENSDEBUG */ - - - /* save the unperturbed values in the state vector */ - for(i=0; i <= 16; i++){ - *(SaveState + i) = *(ckt->CKTstate0 + here->MOS9states + i); - } - - *(SaveState + 17) = here->MOS9sourceConductance; - *(SaveState + 18) = here->MOS9drainConductance; - *(SaveState + 19) = here->MOS9cd; - *(SaveState + 20) = here->MOS9cbs; - *(SaveState + 21) = here->MOS9cbd; - *(SaveState + 22) = here->MOS9gmbs; - *(SaveState + 23) = here->MOS9gm; - *(SaveState + 24) = here->MOS9gds; - *(SaveState + 25) = here->MOS9gbd; - *(SaveState + 26) = here->MOS9gbs; - *(SaveState + 27) = here->MOS9capbd; - *(SaveState + 28) = here->MOS9capbs; - *(SaveState + 29) = here->MOS9Cbd; - *(SaveState + 30) = here->MOS9Cbdsw; - *(SaveState + 31) = here->MOS9Cbs; - *(SaveState + 32) = here->MOS9Cbssw; - *(SaveState + 33) = here->MOS9f2d; - *(SaveState + 34) = here->MOS9f3d; - *(SaveState + 35) = here->MOS9f4d; - *(SaveState + 36) = here->MOS9f2s; - *(SaveState + 37) = here->MOS9f3s; - *(SaveState + 38) = here->MOS9f4s; - *(SaveState + 39) = here->MOS9cgs; - *(SaveState + 40) = here->MOS9cgd; - *(SaveState + 41) = here->MOS9cgb; - *(SaveState + 42) = here->MOS9vdsat; - *(SaveState + 43) = here->MOS9von; - save_mode = here->MOS9mode; - - - if(here->MOS9senParmNo == 0) goto next1; - -#ifdef SENSDEBUG - printf("without perturbation \n"); -#endif /* SENSDEBUG */ - - cdpr0= here->MOS9cd; - cspr0= -(here->MOS9cd + here->MOS9cbd + here->MOS9cbs); - if((info->SENmode == TRANSEN) && - (ckt->CKTmode & MODEINITTRAN)){ - qgs0 = *(ckt->CKTstate1 + here->MOS9qgs); - qgd0 = *(ckt->CKTstate1 + here->MOS9qgd); - qgb0 = *(ckt->CKTstate1 + here->MOS9qgb); - } - else{ - qgs0 = *(ckt->CKTstate0 + here->MOS9qgs); - qgd0 = *(ckt->CKTstate0 + here->MOS9qgd); - qgb0 = *(ckt->CKTstate0 + here->MOS9qgb); - } - - here->MOS9senPertFlag = ON; - error = MOS9load((GENmodel*)model,ckt); - if(error) return(error); - - cd0 = here->MOS9cd ; - cbd0 = here->MOS9cbd ; - cbs0 = here->MOS9cbs ; - gspr0= here->MOS9sourceConductance ; - gdpr0= here->MOS9drainConductance ; - - qbs0 = *(ckt->CKTstate0 + here->MOS9qbs); - qbd0 = *(ckt->CKTstate0 + here->MOS9qbd); - - for( flag = 0 ; flag <= 1 ; flag++){ - if(here->MOS9sens_l == 0) - if(flag == 0) goto next2; - if(here->MOS9sens_w == 0) - if(flag == 1) goto next2; - if(flag == 0){ - A0 = here->MOS9l; - DELA = info->SENpertfac * A0; - DELAinv = 1.0/DELA; - Apert = A0 + DELA; - here->MOS9l = Apert; - } - else{ - A0 = here->MOS9w; - DELA = info->SENpertfac * A0; - DELAinv = 1.0/DELA; - Apert = A0 + DELA; - here->MOS9w = Apert; - here->MOS9drainArea *= (1 + info->SENpertfac); - here->MOS9sourceArea *= (1 + info->SENpertfac); - here->MOS9Cbd *= (1 + info->SENpertfac); - here->MOS9Cbs *= (1 + info->SENpertfac); - if(here->MOS9drainPerimiter){ - here->MOS9Cbdsw += here->MOS9Cbdsw * - DELA/here->MOS9drainPerimiter; - } - if(here->MOS9sourcePerimiter){ - here->MOS9Cbssw += here->MOS9Cbssw * - DELA/here->MOS9sourcePerimiter; - } - if(*(ckt->CKTstate0 + here->MOS9vbd) >= - here->MOS9tDepCap){ - arg = 1-model->MOS9fwdCapDepCoeff; - sarg = exp( (-model->MOS9bulkJctBotGradingCoeff) * - log(arg) ); - sargsw = exp( (-model->MOS9bulkJctSideGradingCoeff) * - log(arg) ); - here->MOS9f2d = here->MOS9Cbd* - (1-model->MOS9fwdCapDepCoeff* - (1+model->MOS9bulkJctBotGradingCoeff))* sarg/arg - + here->MOS9Cbdsw*(1-model->MOS9fwdCapDepCoeff* - (1+model->MOS9bulkJctSideGradingCoeff))* - sargsw/arg; - here->MOS9f3d = here->MOS9Cbd * - model->MOS9bulkJctBotGradingCoeff * sarg/arg/ - model->MOS9bulkJctPotential - + here->MOS9Cbdsw * - model->MOS9bulkJctSideGradingCoeff *sargsw/arg / - model->MOS9bulkJctPotential; - here->MOS9f4d = here->MOS9Cbd* - model->MOS9bulkJctPotential*(1-arg*sarg)/ - (1-model->MOS9bulkJctBotGradingCoeff) - + here->MOS9Cbdsw*model->MOS9bulkJctPotential* - (1-arg*sargsw)/ - (1-model->MOS9bulkJctSideGradingCoeff) - -here->MOS9f3d/2* - (here->MOS9tDepCap*here->MOS9tDepCap) - -here->MOS9tDepCap * here->MOS9f2d; - } - if(*(ckt->CKTstate0 + here->MOS9vbs) >= - here->MOS9tDepCap){ - arg = 1-model->MOS9fwdCapDepCoeff; - sarg = exp( (-model->MOS9bulkJctBotGradingCoeff) * - log(arg) ); - sargsw = exp( (-model->MOS9bulkJctSideGradingCoeff) * - log(arg) ); - here->MOS9f2s = here->MOS9Cbs* - (1-model->MOS9fwdCapDepCoeff* - (1+model->MOS9bulkJctBotGradingCoeff))* sarg/arg - + here->MOS9Cbssw*(1-model->MOS9fwdCapDepCoeff* - (1+model->MOS9bulkJctSideGradingCoeff))* - sargsw/arg; - here->MOS9f3s = here->MOS9Cbs * - model->MOS9bulkJctBotGradingCoeff * sarg/arg/ - model->MOS9bulkJctPotential - + here->MOS9Cbssw * - model->MOS9bulkJctSideGradingCoeff * sargsw/arg/ - model->MOS9bulkJctPotential; - here->MOS9f4s = here->MOS9Cbs* - model->MOS9bulkJctPotential*(1-arg*sarg)/ - (1-model->MOS9bulkJctBotGradingCoeff) - + here->MOS9Cbssw*model->MOS9bulkJctPotential* - (1-arg*sargsw)/ - (1-model->MOS9bulkJctSideGradingCoeff) - -here->MOS9f3s/2* - (here->MOS9tBulkPot*here->MOS9tBulkPot) - -here->MOS9tBulkPot * here->MOS9f2s; - } - here->MOS9drainConductance *= Apert/A0; - here->MOS9sourceConductance *= Apert/A0; - } - - -#ifdef SENSDEBUG - if(flag == 0) - printf("perturbation of l\n"); - if(flag == 1) - printf("perturbation of w\n"); -#endif /* SENSDEBUG */ - - error = MOS9load((GENmodel*)model,ckt); - if(error) return(error); - - if(flag == 0){ - here->MOS9l = A0; - } - else{ - here->MOS9w = A0; - here->MOS9drainArea /= (1 + info->SENpertfac); - here->MOS9sourceArea /= (1 + info->SENpertfac); - here->MOS9drainConductance *= A0/Apert; - here->MOS9sourceConductance *= A0/Apert; - } - cd = here->MOS9cd ; - cbd = here->MOS9cbd ; - cbs = here->MOS9cbs ; - - gspr= here->MOS9sourceConductance ; - gdpr= here->MOS9drainConductance ; - - DcdDp = (cd - cd0) * DELAinv; - DcbsDp = (cbs - cbs0) * DELAinv; - DcbdDp = (cbd - cbd0) * DELAinv; - DcbDp = ( DcbsDp + DcbdDp ); - - DcdprDp = 0; - DcsprDp = 0; - if(here->MOS9dNode != here->MOS9dNodePrime) - if(gdpr0) DcdprDp = cdpr0 * (gdpr - gdpr0)/gdpr0 * DELAinv; - if(here->MOS9sNode != here->MOS9sNodePrime) - if(gspr0) DcsprDp = cspr0 * (gspr - gspr0)/gspr0 * DELAinv; - - DcdprmDp = ( - DcdprDp + DcdDp); - DcsprmDp = ( - DcbsDp - DcdDp - DcbdDp - DcsprDp); - - if(flag == 0){ - EffectiveLength = here->MOS9l - - 2*model->MOS9latDiff + model->MOS9lengthAdjust; - if(EffectiveLength == 0){ - DqgsDp = 0; - DqgdDp = 0; - DqgbDp = 0; - } - else{ - DqgsDp = model->MOS9type * qgs0 / EffectiveLength; - DqgdDp = model->MOS9type * qgd0 / EffectiveLength; - DqgbDp = model->MOS9type * qgb0 / EffectiveLength; - } - } - else{ - EffectiveWidth = here->MOS9w - - 2*model->MOS9widthNarrow + model->MOS9widthAdjust; - DqgsDp = model->MOS9type * qgs0 / EffectiveWidth; - DqgdDp = model->MOS9type * qgd0 / EffectiveWidth; - DqgbDp = model->MOS9type * qgb0 / EffectiveWidth; - } - - - qbd = *(ckt->CKTstate0 + here->MOS9qbd); - qbs = *(ckt->CKTstate0 + here->MOS9qbs); - - DqbsDp = model->MOS9type * (qbs - qbs0)*DELAinv; - DqbdDp = model->MOS9type * (qbd - qbd0)*DELAinv; - - if(flag == 0){ - *(here->MOS9dphigs_dl) = DqgsDp; - *(here->MOS9dphigd_dl) = DqgdDp; - *(here->MOS9dphibs_dl) = DqbsDp; - *(here->MOS9dphibd_dl) = DqbdDp; - *(here->MOS9dphigb_dl) = DqgbDp; - } - else{ - *(here->MOS9dphigs_dw) = DqgsDp; - *(here->MOS9dphigd_dw) = DqgdDp; - *(here->MOS9dphibs_dw) = DqbsDp; - *(here->MOS9dphibd_dw) = DqbdDp; - *(here->MOS9dphigb_dw) = DqgbDp; - } - - -#ifdef SENSDEBUG - printf("CKTag[0]=%.7e,CKTag[1]=%.7e,flag= %d\n", - ckt->CKTag[0],ckt->CKTag[1],flag); - printf("cd0 = %.7e ,cd = %.7e,\n",cd0,cd); - printf("cbs0 = %.7e ,cbs = %.7e,\n",cbs0,cbs); - printf("cbd0 = %.7e ,cbd = %.7e,\n",cbd0,cbd); - printf("DcdprmDp = %.7e,\n",DcdprmDp); - printf("DcsprmDp = %.7e,\n",DcsprmDp); - printf("DcdprDp = %.7e,\n",DcdprDp); - printf("DcsprDp = %.7e,\n",DcsprDp); - printf("qgs0 = %.7e \n",qgs0); - printf("qgd0 = %.7e \n",qgd0); - printf("qgb0 = %.7e \n",qgb0); - printf("qbs0 = %.7e ,qbs = %.7e,\n",qbs0,qbs); - printf("qbd0 = %.7e ,qbd = %.7e,\n",qbd0,qbd); - printf("DqgsDp = %.7e \n",DqgsDp); - printf("DqgdDp = %.7e \n",DqgdDp); - printf("DqgbDp = %.7e \n",DqgbDp); - printf("DqbsDp = %.7e \n",DqbsDp); - printf("DqbdDp = %.7e \n",DqbdDp); - printf("EffectiveLength = %.7e \n",EffectiveLength); - printf("tdepCap = %.7e \n",here->MOS9tDepCap); - printf("\n"); -#endif /* SENSDEBUG*/ - if((info->SENmode == TRANSEN) && - (ckt->CKTmode & MODEINITTRAN)) - goto next2; - - /* - * load RHS matrix - */ - - if(flag == 0){ - *(info->SEN_RHS[here->MOS9bNode] + here->MOS9senParmNo) - -= model->MOS9type * DcbDp; - *(info->SEN_RHS[here->MOS9dNode] + here->MOS9senParmNo) - -= model->MOS9type * DcdprDp; - *(info->SEN_RHS[here->MOS9dNodePrime] + here->MOS9senParmNo) - -= model->MOS9type * DcdprmDp; - *(info->SEN_RHS[here->MOS9sNode] + here->MOS9senParmNo) - -= model->MOS9type * DcsprDp; - *(info->SEN_RHS[here->MOS9sNodePrime] + here->MOS9senParmNo) - -= model->MOS9type * DcsprmDp; - } - else{ - offset = here->MOS9sens_l; - - *(info->SEN_RHS[here->MOS9bNode] + here->MOS9senParmNo + - offset) -= model->MOS9type * DcbDp; - *(info->SEN_RHS[here->MOS9dNode] + here->MOS9senParmNo + - offset) -= model->MOS9type * DcdprDp; - *(info->SEN_RHS[here->MOS9dNodePrime] + here->MOS9senParmNo - + offset) -= model->MOS9type * DcdprmDp; - *(info->SEN_RHS[here->MOS9sNode] + here->MOS9senParmNo + - offset) -= model->MOS9type * DcsprDp; - *(info->SEN_RHS[here->MOS9sNodePrime] + here->MOS9senParmNo - + offset) -= model->MOS9type * DcsprmDp; - } -#ifdef SENSDEBUG - printf("after loading\n"); - if(flag == 0){ - printf("DcbDp=%.7e\n", - *(info->SEN_RHS[here->MOS9bNode] + - here->MOS9senParmNo)); - printf("DcdprDp=%.7e\n", - *(info->SEN_RHS[here->MOS9dNode] + - here->MOS9senParmNo)); - printf("DcsprDp=%.7e\n", - *(info->SEN_RHS[here->MOS9sNode] + - here->MOS9senParmNo)); - printf("DcdprmDp=%.7e\n", - *(info->SEN_RHS[here->MOS9dNodePrime] + - here->MOS9senParmNo)); - printf("DcsprmDp=%.7e\n", - *(info->SEN_RHS[here->MOS9sNodePrime] + - here->MOS9senParmNo)); - printf("\n"); - } - else{ - printf("DcbDp=%.7e\n", - *(info->SEN_RHS[here->MOS9bNode] + - here->MOS9senParmNo + here->MOS9sens_l)); - printf("DcdprDp=%.7e\n", - *(info->SEN_RHS[here->MOS9dNode] + - here->MOS9senParmNo + here->MOS9sens_l)); - printf("DcsprDp=%.7e\n", - *(info->SEN_RHS[here->MOS9sNode] + - here->MOS9senParmNo + here->MOS9sens_l)); - printf("DcdprmDp=%.7e\n", - *(info->SEN_RHS[here->MOS9dNodePrime] + - here->MOS9senParmNo + here->MOS9sens_l)); - printf("DcsprmDp=%.7e\n", - *(info->SEN_RHS[here->MOS9sNodePrime] + - here->MOS9senParmNo + here->MOS9sens_l)); - } -#endif /* SENSDEBUG*/ -next2: - ; - } -next1: - if((info->SENmode == DCSEN) || - (ckt->CKTmode&MODETRANOP) ) goto restore; - if((info->SENmode == TRANSEN) && - (ckt->CKTmode & MODEINITTRAN)) goto restore; - for(iparmno = 1;iparmno<=info->SENparms;iparmno++){ -#ifdef SENSDEBUG - printf("after conductive currents\n"); - printf("iparmno = %d\n",iparmno); - printf("DcbDp=%.7e\n", - *(info->SEN_RHS[here->MOS9bNode] + iparmno)); - printf("DcdprDp=%.7e\n", - *(info->SEN_RHS[here->MOS9dNode] + iparmno)); - printf("DcdprmDp=%.7e\n", - *(info->SEN_RHS[here->MOS9dNodePrime] + iparmno)); - printf("DcsprDp=%.7e\n", - *(info->SEN_RHS[here->MOS9sNode] + iparmno)); - printf("DcsprmDp=%.7e\n", - *(info->SEN_RHS[here->MOS9sNodePrime] + iparmno)); - printf("\n"); -#endif /* SENSDEBUG */ - Osxpgs = tag0 * *(ckt->CKTstate1 + here->MOS9sensxpgs + - 10*(iparmno - 1)) - + tag1 * *(ckt->CKTstate1 + here->MOS9sensxpgs + - 10*(iparmno - 1) + 1); - - Osxpgd = tag0 * *(ckt->CKTstate1 + here->MOS9sensxpgd + - 10*(iparmno - 1)) - + tag1 * *(ckt->CKTstate1 + here->MOS9sensxpgd + - 10*(iparmno - 1) + 1); - - Osxpbs = tag0 * *(ckt->CKTstate1 + here->MOS9sensxpbs + - 10*(iparmno - 1)) - + tag1 * *(ckt->CKTstate1 + here->MOS9sensxpbs + - 10*(iparmno - 1) + 1); - - Osxpbd =tag0 * *(ckt->CKTstate1 + here->MOS9sensxpbd + - 10*(iparmno - 1)) - + tag1 * *(ckt->CKTstate1 + here->MOS9sensxpbd + - 10*(iparmno - 1) + 1); - Osxpgb = tag0 * *(ckt->CKTstate1 + here->MOS9sensxpgb + - 10*(iparmno - 1)) - + tag1 * *(ckt->CKTstate1 + here->MOS9sensxpgb + - 10*(iparmno - 1) + 1); - -#ifdef SENSDEBUG - printf("iparmno=%d\n",iparmno); - printf("sxpgs=%.7e,sdgs=%.7e\n", - *(ckt->CKTstate1 + here->MOS9sensxpgs + - 10*(iparmno - 1)), *(ckt->CKTstate1 + - here->MOS9sensxpgs + 10*(iparmno - 1) + 1)); - printf("sxpgd=%.7e,sdgd=%.7e\n", - *(ckt->CKTstate1 + here->MOS9sensxpgd + - 10*(iparmno - 1)), *(ckt->CKTstate1 + - here->MOS9sensxpgd + 10*(iparmno - 1) + 1)); - printf("sxpbs=%.7e,sdbs=%.7e\n", - *(ckt->CKTstate1 + here->MOS9sensxpbs + - 10*(iparmno - 1)), *(ckt->CKTstate1 + - here->MOS9sensxpbs + 10*(iparmno - 1) + 1)); - printf("sxpbd=%.7e,sdbd=%.7e\n", - *(ckt->CKTstate1 + here->MOS9sensxpbd + - 10*(iparmno - 1)), *(ckt->CKTstate1 + - here->MOS9sensxpbd + 10*(iparmno - 1) + 1)); - printf("sxpgb=%.7e,sdgb=%.7e\n", - *(ckt->CKTstate1 + here->MOS9sensxpgb + - 10*(iparmno - 1)), *(ckt->CKTstate1 + - here->MOS9sensxpgb + 10*(iparmno - 1) + 1)); - printf("before loading DqDp\n"); - printf("Osxpgs=%.7e,Osxpgd=%.7e\n",Osxpgs,Osxpgd); - printf("Osxpbs=%.7e,Osxpbd=%.7e,Osxpgb=%.7e\n", - Osxpbs,Osxpbd,Osxpgb); - printf("\n"); -#endif /* SENSDEBUG */ - if(here->MOS9sens_l && (iparmno == here->MOS9senParmNo)){ - Osxpgs -= tag0 * *(here->MOS9dphigs_dl); - Osxpgd -= tag0 * *(here->MOS9dphigd_dl); - Osxpbs -= tag0 * *(here->MOS9dphibs_dl); - Osxpbd -= tag0 * *(here->MOS9dphibd_dl); - Osxpgb -= tag0 * *(here->MOS9dphigb_dl); - } - if(here->MOS9sens_w && - (iparmno == (here->MOS9senParmNo + - (int) here->MOS9sens_l))){ - Osxpgs -= tag0 * *(here->MOS9dphigs_dw); - Osxpgd -= tag0 * *(here->MOS9dphigd_dw); - Osxpbs -= tag0 * *(here->MOS9dphibs_dw); - Osxpbd -= tag0 * *(here->MOS9dphibd_dw); - Osxpgb -= tag0 * *(here->MOS9dphigb_dw); - } -#ifdef SENSDEBUG - printf("after loading DqDp\n"); - printf("DqgsDp=%.7e",DqgsDp); - printf("Osxpgs=%.7e,Osxpgd=%.7e\n",Osxpgs,Osxpgd); - printf("Osxpbs=%.7e,Osxpbd=%.7e,Osxpgb=%.7e\n", - Osxpbs,Osxpbd,Osxpgb); -#endif /* SENSDEBUG */ - - *(info->SEN_RHS[here->MOS9bNode] + iparmno) += - Osxpbs + Osxpbd -Osxpgb; - *(info->SEN_RHS[here->MOS9gNode] + iparmno) += - Osxpgs + Osxpgd + Osxpgb; - - *(info->SEN_RHS[here->MOS9dNodePrime] + iparmno) -= - Osxpgd + Osxpbd ; - *(info->SEN_RHS[here->MOS9sNodePrime] + iparmno) -= - Osxpgs + Osxpbs; -#ifdef SENSDEBUG - printf("after capacitive currents\n"); - printf("DcbDp=%.7e\n", - *(info->SEN_RHS[here->MOS9bNode] + iparmno)); - printf("DcdprDp=%.7e\n", - *(info->SEN_RHS[here->MOS9dNode] + iparmno)); - printf("DcdprmDp=%.7e\n", - *(info->SEN_RHS[here->MOS9dNodePrime] + iparmno)); - printf("DcsprDp=%.7e\n", - *(info->SEN_RHS[here->MOS9sNode] + iparmno)); - printf("DcsprmDp=%.7e\n", - *(info->SEN_RHS[here->MOS9sNodePrime] + iparmno)); -#endif /* SENSDEBUG */ - - } -restore: /* put the unperturbed values back into the state vector */ - for(i=0; i <= 16; i++) - *(ckt->CKTstate0 + here->MOS9states + i) = *(SaveState + i); - here->MOS9sourceConductance = *(SaveState + 17) ; - here->MOS9drainConductance = *(SaveState + 18) ; - here->MOS9cd = *(SaveState + 19) ; - here->MOS9cbs = *(SaveState + 20) ; - here->MOS9cbd = *(SaveState + 21) ; - here->MOS9gmbs = *(SaveState + 22) ; - here->MOS9gm = *(SaveState + 23) ; - here->MOS9gds = *(SaveState + 24) ; - here->MOS9gbd = *(SaveState + 25) ; - here->MOS9gbs = *(SaveState + 26) ; - here->MOS9capbd = *(SaveState + 27) ; - here->MOS9capbs = *(SaveState + 28) ; - here->MOS9Cbd = *(SaveState + 29) ; - here->MOS9Cbdsw = *(SaveState + 30) ; - here->MOS9Cbs = *(SaveState + 31) ; - here->MOS9Cbssw = *(SaveState + 32) ; - here->MOS9f2d = *(SaveState + 33) ; - here->MOS9f3d = *(SaveState + 34) ; - here->MOS9f4d = *(SaveState + 35) ; - here->MOS9f2s = *(SaveState + 36) ; - here->MOS9f3s = *(SaveState + 37) ; - here->MOS9f4s = *(SaveState + 38) ; - here->MOS9cgs = *(SaveState + 39) ; - here->MOS9cgd = *(SaveState + 40) ; - here->MOS9cgb = *(SaveState + 41) ; - here->MOS9vdsat = *(SaveState + 42) ; - here->MOS9von = *(SaveState + 43) ; - here->MOS9mode = save_mode ; - - here->MOS9senPertFlag = OFF; - - } - } - info->SENstatus = NORMAL; -#ifdef SENSDEBUG - printf("MOS9senload end\n"); -#endif /* SENSDEBUG */ - return(OK); -} - diff --git a/src/spicelib/devices/mos9/mos9sprt.c b/src/spicelib/devices/mos9/mos9sprt.c deleted file mode 100644 index 7ced05e6a..000000000 --- a/src/spicelib/devices/mos9/mos9sprt.c +++ /dev/null @@ -1,64 +0,0 @@ -/********** -Copyright 1990 Regents of the University of California. All rights reserved. -Author: 1985 Thomas L. Quarles -Modified: Alan Gillespie - -This function is obsolete (was used by an old sensitivity analysis) -**********/ - - /* Pretty print the sensitivity info for all the MOS9 - * devices in the circuit. - */ - -#include "ngspice/ngspice.h" -#include "ngspice/smpdefs.h" -#include "ngspice/cktdefs.h" -#include "mos9defs.h" -#include "ngspice/sperror.h" -#include "ngspice/suffix.h" - -void -MOS9sPrint(GENmodel *inModel, CKTcircuit *ckt) -{ - MOS9model *model = (MOS9model *)inModel; - MOS9instance *here; - - printf("LEVEL 9 MOSFETS (AG) -----------------\n"); - /* loop through all the MOS9 models */ - for( ; model != NULL; model = MOS9nextModel(model)) { - - printf("Model name:%s\n",model->MOS9modName); - - /* loop through all the instances of the model */ - for (here = MOS9instances(model); here != NULL ; - here=MOS9nextInstance(here)) { - - printf(" Instance name:%s\n",here->MOS9name); - printf(" Drain, Gate , Source nodes: %s, %s ,%s\n", - CKTnodName(ckt,here->MOS9dNode),CKTnodName(ckt,here->MOS9gNode), - CKTnodName(ckt,here->MOS9sNode)); - - printf(" Multiplier: %g ",here->MOS9m); - printf(here->MOS9mGiven ? "(specified)\n" : "(default)\n"); - printf(" Length: %g ",here->MOS9l); - printf(here->MOS9lGiven ? "(specified)\n" : "(default)\n"); - printf(" Width: %g ",here->MOS9w); - printf(here->MOS9wGiven ? "(specified)\n" : "(default)\n"); - if(here->MOS9sens_l == 1){ - printf(" MOS9senParmNo:l = %d ",here->MOS9senParmNo); - } - else{ - printf(" MOS9senParmNo:l = 0 "); - } - if(here->MOS9sens_w == 1){ - printf(" w = %d \n",here->MOS9senParmNo + here->MOS9sens_l); - } - else{ - printf(" w = 0 \n"); - } - - - } - } -} - diff --git a/src/spicelib/devices/mos9/mos9sset.c b/src/spicelib/devices/mos9/mos9sset.c deleted file mode 100644 index 7e8324a81..000000000 --- a/src/spicelib/devices/mos9/mos9sset.c +++ /dev/null @@ -1,52 +0,0 @@ -/********** -Copyright 1990 Regents of the University of California. All rights reserved. -Author: 1985 Thomas L. Quarles -Modified: Alan Gillespie - -This function is obsolete (was used by an old sensitivity analysis) -**********/ - - /* loop through all the devices and - * allocate parameter #s to design parameters - */ - -#include "ngspice/ngspice.h" -#include "ngspice/smpdefs.h" -#include "ngspice/cktdefs.h" -#include "mos9defs.h" -#include "ngspice/sperror.h" -#include "ngspice/suffix.h" - -int -MOS9sSetup(SENstruct *info, GENmodel *inModel) -{ - MOS9model *model = (MOS9model *)inModel; - MOS9instance *here; - - /* loop through all the models */ - for( ; model != NULL; model = MOS9nextModel(model)) { - - /* loop through all the instances of the model */ - for (here = MOS9instances(model); here != NULL ; - here=MOS9nextInstance(here)) { - - if(here->MOS9senParmNo){ - if((here->MOS9sens_l)&&(here->MOS9sens_w)){ - here->MOS9senParmNo = ++(info->SENparms); - ++(info->SENparms);/* MOS has two design parameters */ - } - else{ - here->MOS9senParmNo = ++(info->SENparms); - } - } - here->MOS9senPertFlag = OFF; - if((here->MOS9sens = TMALLOC(double, 72)) == NULL) { - return(E_NOMEM); - } - - } - } - return(OK); -} - - diff --git a/src/spicelib/devices/mos9/mos9supd.c b/src/spicelib/devices/mos9/mos9supd.c deleted file mode 100644 index 8048f25fd..000000000 --- a/src/spicelib/devices/mos9/mos9supd.c +++ /dev/null @@ -1,181 +0,0 @@ -/********** -Copyright 1990 Regents of the University of California. All rights reserved. -Author: 1985 Thomas L. Quarles -Modified: Alan Gillespie - -This function is obsolete (was used by an old sensitivity analysis) -**********/ - -#include "ngspice/ngspice.h" -#include "ngspice/smpdefs.h" -#include "ngspice/cktdefs.h" -#include "mos9defs.h" -#include "ngspice/sperror.h" -#include "ngspice/suffix.h" - -int -MOS9sUpdate(GENmodel *inModel, CKTcircuit *ckt) -{ - MOS9model *model = (MOS9model *)inModel; - MOS9instance *here; - int iparmno; - double sb; - double sg; - double sdprm; - double ssprm; - double sxpgs; - double sxpgd; - double sxpbs; - double sxpbd; - double sxpgb; - double dummy1; - double dummy2; - SENstruct *info; - - - if(ckt->CKTtime == 0) return(OK); - info = ckt->CKTsenInfo; - -#ifdef SENSDEBUG - printf("MOS9senupdate\n"); - printf("CKTtime = %.5e\n",ckt->CKTtime); -#endif /* SENSDEBUG */ - - sxpgs = 0; - sxpgd = 0; - sxpbs = 0; - sxpbd = 0; - sxpgb = 0; - dummy1 = 0; - dummy2 = 0; - - /* loop through all the MOS9 models */ - for( ; model != NULL; model = MOS9nextModel(model)) { - - /* loop through all the instances of the model */ - for (here = MOS9instances(model); here != NULL ; - here=MOS9nextInstance(here)) { - -#ifdef SENSDEBUG - printf("senupdate instance name %s\n",here->MOS9name); - printf("before loading\n"); - printf("CKTag[0] = %.2e,CKTag[1] = %.2e\n", - ckt->CKTag[0],ckt->CKTag[1]); - printf("capgs = %.7e\n",here->MOS9cgs); - printf("capgd = %.7e\n",here->MOS9cgd); - printf("capgb = %.7e\n",here->MOS9cgb); - printf("capbs = %.7e\n",here->MOS9capbs); - printf("capbd = %.7e\n",here->MOS9capbd); -#endif /* SENSDEBUG */ - - for(iparmno = 1;iparmno<=info->SENparms;iparmno++){ - - sb = *(info->SEN_Sap[here->MOS9bNode] + iparmno); - sg = *(info->SEN_Sap[here->MOS9gNode] + iparmno); - ssprm = *(info->SEN_Sap[here->MOS9sNodePrime] + iparmno); - sdprm = *(info->SEN_Sap[here->MOS9dNodePrime] + iparmno); -#ifdef SENSDEBUG - printf("iparmno = %d\n",iparmno); - printf("sb = %.7e,sg = %.7e\n",sb,sg); - printf("ssprm = %.7e,sdprm = %.7e\n",ssprm,sdprm); -#endif /* SENSDEBUG */ - - sxpgs = (sg - ssprm) * here->MOS9cgs ; - sxpgd = (sg - sdprm) * here->MOS9cgd ; - sxpgb = (sg - sb) * here->MOS9cgb ; - sxpbs = (sb - ssprm) * here->MOS9capbs ; - sxpbd = (sb - sdprm) * here->MOS9capbd ; - - if(here->MOS9sens_l && (iparmno == here->MOS9senParmNo)){ - sxpgs += *(here->MOS9dphigs_dl); - sxpgd += *(here->MOS9dphigd_dl); - sxpbs += *(here->MOS9dphibs_dl); - sxpbd += *(here->MOS9dphibd_dl); - sxpgb += *(here->MOS9dphigb_dl); - } - if(here->MOS9sens_w && - (iparmno == (here->MOS9senParmNo + - (int) here->MOS9sens_l))){ - sxpgs += *(here->MOS9dphigs_dw); - sxpgd += *(here->MOS9dphigd_dw); - sxpbs += *(here->MOS9dphibs_dw); - sxpbd += *(here->MOS9dphibd_dw); - sxpgb += *(here->MOS9dphigb_dw); - } - if(ckt->CKTmode & MODEINITTRAN) { - *(ckt->CKTstate1 + here->MOS9sensxpgs + - 10 * (iparmno - 1)) = sxpgs; - *(ckt->CKTstate1 + here->MOS9sensxpgd + - 10 * (iparmno - 1)) = sxpgd; - *(ckt->CKTstate1 + here->MOS9sensxpbs + - 10 * (iparmno - 1)) = sxpbs; - *(ckt->CKTstate1 + here->MOS9sensxpbd + - 10 * (iparmno - 1)) = sxpbd; - *(ckt->CKTstate1 + here->MOS9sensxpgb + - 10 * (iparmno - 1)) = sxpgb; - *(ckt->CKTstate1 + here->MOS9sensxpgs + - 10 * (iparmno - 1) + 1) = 0; - *(ckt->CKTstate1 + here->MOS9sensxpgd + - 10 * (iparmno - 1) + 1) = 0; - *(ckt->CKTstate1 + here->MOS9sensxpbs + - 10 * (iparmno - 1) + 1) = 0; - *(ckt->CKTstate1 + here->MOS9sensxpbd + - 10 * (iparmno - 1) + 1) = 0; - *(ckt->CKTstate1 + here->MOS9sensxpgb + - 10 * (iparmno - 1) + 1) = 0; - goto next; - } - - *(ckt->CKTstate0 + here->MOS9sensxpgs + - 10 * (iparmno - 1)) = sxpgs; - *(ckt->CKTstate0 + here->MOS9sensxpgd + - 10 * (iparmno - 1)) = sxpgd; - *(ckt->CKTstate0 + here->MOS9sensxpbs + - 10 * (iparmno - 1)) = sxpbs; - *(ckt->CKTstate0 + here->MOS9sensxpbd + - 10 * (iparmno - 1)) = sxpbd; - *(ckt->CKTstate0 + here->MOS9sensxpgb + - 10 * (iparmno - 1)) = sxpgb; - - NIintegrate(ckt,&dummy1,&dummy2,here->MOS9cgs, - here->MOS9sensxpgs + 10*(iparmno -1)); - NIintegrate(ckt,&dummy1,&dummy2,here->MOS9cgd, - here->MOS9sensxpgd + 10*(iparmno -1)); - NIintegrate(ckt,&dummy1,&dummy2,here->MOS9cgb, - here->MOS9sensxpgb + 10*(iparmno -1)); - NIintegrate(ckt,&dummy1,&dummy2,here->MOS9capbs, - here->MOS9sensxpbs + 10*(iparmno -1)); - NIintegrate(ckt,&dummy1,&dummy2,here->MOS9capbd, - here->MOS9sensxpbd + 10*(iparmno -1)); - - -next: - ; -#ifdef SENSDEBUG - printf("after loading\n"); - printf("sxpgs = %.7e,sdotxpgs = %.7e\n", - sxpgs,*(ckt->CKTstate0 + here->MOS9sensxpgs + - 10 * (iparmno - 1) + 1)); - printf("sxpgd = %.7e,sdotxpgd = %.7e\n", - sxpgd,*(ckt->CKTstate0 + here->MOS9sensxpgd + - 10 * (iparmno - 1) + 1)); - printf("sxpgb = %.7e,sdotxpgb = %.7e\n", - sxpgb,*(ckt->CKTstate0 + here->MOS9sensxpgb + - 10 * (iparmno - 1) + 1)); - printf("sxpbs = %.7e,sdotxpbs = %.7e\n", - sxpbs,*(ckt->CKTstate0 + here->MOS9sensxpbs + - 10 * (iparmno - 1) + 1)); - printf("sxpbd = %.7e,sdotxpbd = %.7e\n", - sxpbd,*(ckt->CKTstate0 + here->MOS9sensxpbd + - 10 * (iparmno - 1) + 1)); -#endif /* SENSDEBUG */ - } - } - } -#ifdef SENSDEBUG - printf("MOS9senupdate end\n"); -#endif /* SENSDEBUG */ - return(OK); - -} - diff --git a/src/spicelib/devices/mos9/mos9temp.c b/src/spicelib/devices/mos9/mos9temp.c deleted file mode 100644 index 7f829ac2e..000000000 --- a/src/spicelib/devices/mos9/mos9temp.c +++ /dev/null @@ -1,349 +0,0 @@ -/********** -Copyright 1990 Regents of the University of California. All rights reserved. -Author: 1985 Thomas L. Quarles -Modified: Alan Gillespie -**********/ - -#include "ngspice/ngspice.h" -#include "ngspice/cktdefs.h" -#include "mos9defs.h" -#include "ngspice/const.h" -#include "ngspice/sperror.h" -#include "ngspice/suffix.h" - -/* assuming silicon - make definition for epsilon of silicon */ -#define EPSSIL (11.7 * 8.854214871e-12) - -int -MOS9temp(GENmodel *inModel, CKTcircuit *ckt) -{ - MOS9model *model = (MOS9model *)inModel; - MOS9instance *here; - double wkfngs; - double wkfng; - double fermig; - double fermis; - double vfb; - double fact1,fact2; - double vt,vtnom; - double kt,kt1; - double ratio,ratio4; - double egfet,egfet1; - double pbfact,pbfact1,pbo; - double phio; - double arg1; - double capfact; - double gmanew,gmaold; - double ni_temp, nifact; - /* loop through all the mosfet models */ - for( ; model != NULL; model = MOS9nextModel(model)) { - - if(!model->MOS9tnomGiven) { - model->MOS9tnom = ckt->CKTnomTemp; - } - fact1 = model->MOS9tnom/REFTEMP; - vtnom = model->MOS9tnom*CONSTKoverQ; - kt1 = CONSTboltz * model->MOS9tnom; - egfet1 = 1.16-(7.02e-4*model->MOS9tnom*model->MOS9tnom)/ - (model->MOS9tnom+1108); - arg1 = -egfet1/(kt1+kt1)+1.1150877/(CONSTboltz*(REFTEMP+REFTEMP)); - pbfact1 = -2*vtnom *(1.5*log(fact1)+CHARGE*arg1); - - nifact=(model->MOS9tnom/300)*sqrt(model->MOS9tnom/300); - nifact*=exp(0.5*egfet1*((1/(double)300)-(1/model->MOS9tnom))/ - CONSTKoverQ); - ni_temp=1.45e16*nifact; - - if (model->MOS9phi <= 0.0) { - SPfrontEnd->IFerrorf (ERR_FATAL, - "%s: Phi is not positive.", model->MOS9modName); - return(E_BADPARM); - } - - model->MOS9oxideCapFactor = 3.9 * 8.854214871e-12/ - model->MOS9oxideThickness; - if(!model->MOS9surfaceMobilityGiven) model->MOS9surfaceMobility=600; - if(!model->MOS9transconductanceGiven) { - model->MOS9transconductance = model->MOS9surfaceMobility * - model->MOS9oxideCapFactor * 1e-4; - } - if(model->MOS9substrateDopingGiven) { - if(model->MOS9substrateDoping*1e6 /*(cm**3/m**3)*/ >ni_temp) { - - if(!model->MOS9phiGiven) { - model->MOS9phi = 2*vtnom* - log(model->MOS9substrateDoping* - - 1e6/*(cm**3/m**3)*//ni_temp); - - model->MOS9phi = MAX(.1,model->MOS9phi); - } - fermis = model->MOS9type * .5 * model->MOS9phi; - wkfng = 3.2; - if(!model->MOS9gateTypeGiven) model->MOS9gateType=1; - if(model->MOS9gateType != 0) { - fermig = model->MOS9type * model->MOS9gateType*.5*egfet1; - wkfng = 3.25 + .5 * egfet1 - fermig; - } - wkfngs = wkfng - (3.25 + .5 * egfet1 +fermis); - if(!model->MOS9gammaGiven) { - model->MOS9gamma = sqrt(2 * EPSSIL * - CHARGE * model->MOS9substrateDoping* - 1e6 /*(cm**3/m**3)*/ )/ model->MOS9oxideCapFactor; - } - if(!model->MOS9vt0Given) { - if(!model->MOS9surfaceStateDensityGiven) - model->MOS9surfaceStateDensity=0; - vfb = wkfngs - model->MOS9surfaceStateDensity * 1e4 - * CHARGE/model->MOS9oxideCapFactor; - model->MOS9vt0 = vfb + model->MOS9type * - (model->MOS9gamma * sqrt(model->MOS9phi)+ - model->MOS9phi); - } else { - vfb = model->MOS9vt0 - model->MOS9type * (model->MOS9gamma* - sqrt(model->MOS9phi)+model->MOS9phi); - } - model->MOS9alpha = (EPSSIL+EPSSIL)/ - (CHARGE*model->MOS9substrateDoping*1e6 /*(cm**3/m**3)*/ ); - model->MOS9coeffDepLayWidth = sqrt(model->MOS9alpha); - } else { - model->MOS9substrateDoping = 0; - SPfrontEnd->IFerrorf (ERR_FATAL, - "%s: Nsub < Ni ", model->MOS9modName); - return(E_BADPARM); - } - } - /* now model parameter preprocessing */ - model->MOS9narrowFactor = model->MOS9delta * 0.5 * M_PI * EPSSIL / - model->MOS9oxideCapFactor ; - - - /* loop through all instances of the model */ - for(here = MOS9instances(model); here!= NULL; - here = MOS9nextInstance(here)) { - - double czbd; /* zero voltage bulk-drain capacitance */ - double czbdsw; /* zero voltage bulk-drain sidewall capacitance */ - double czbs; /* zero voltage bulk-source capacitance */ - double czbssw; /* zero voltage bulk-source sidewall capacitance */ - double arg; /* 1 - fc */ - double sarg; /* (1-fc) ^^ (-mj) */ - double sargsw; /* (1-fc) ^^ (-mjsw) */ - - /* perform the parameter defaulting */ - - if(!here->MOS9dtempGiven) { - here->MOS9dtemp = 0.0; - } - - if(!here->MOS9tempGiven) { - here->MOS9temp = ckt->CKTtemp + here->MOS9dtemp; - } - vt = here->MOS9temp * CONSTKoverQ; - ratio = here->MOS9temp/model->MOS9tnom; - fact2 = here->MOS9temp/REFTEMP; - kt = here->MOS9temp * CONSTboltz; - egfet = 1.16-(7.02e-4*here->MOS9temp*here->MOS9temp)/ - (here->MOS9temp+1108); - arg = -egfet/(kt+kt)+1.1150877/(CONSTboltz*(REFTEMP+REFTEMP)); - pbfact = -2*vt *(1.5*log(fact2)+CHARGE*arg); - - if(!here->MOS9mGiven) { - here->MOS9m = ckt->CKTdefaultMosM; - } - - if(!here->MOS9lGiven) { - here->MOS9l = ckt->CKTdefaultMosL; - } - if(!here->MOS9sourceAreaGiven) { - here->MOS9sourceArea = ckt->CKTdefaultMosAS; - } - if(!here->MOS9wGiven) { - here->MOS9w = ckt->CKTdefaultMosW; - } - if(model->MOS9drainResistanceGiven) { - if(model->MOS9drainResistance != 0) { - here->MOS9drainConductance = here->MOS9m / - model->MOS9drainResistance; - } else { - here->MOS9drainConductance = 0; - } - } else if (model->MOS9sheetResistanceGiven) { - if ((model->MOS9sheetResistance != 0) && - (here->MOS9drainSquares != 0)) { - here->MOS9drainConductance = - here->MOS9m / - (model->MOS9sheetResistance*here->MOS9drainSquares); - } else { - here->MOS9drainConductance = 0; - } - } else { - here->MOS9drainConductance = 0; - } - if(model->MOS9sourceResistanceGiven) { - if(model->MOS9sourceResistance != 0) { - here->MOS9sourceConductance = here->MOS9m / - model->MOS9sourceResistance; - } else { - here->MOS9sourceConductance = 0; - } - } else if (model->MOS9sheetResistanceGiven) { - if ((model->MOS9sheetResistance != 0) && - (here->MOS9sourceSquares != 0)) { - here->MOS9sourceConductance = - here->MOS9m / - (model->MOS9sheetResistance*here->MOS9sourceSquares); - } else { - here->MOS9sourceConductance = 0; - } - } else { - here->MOS9sourceConductance = 0; - } - - if(here->MOS9l - 2 * model->MOS9latDiff + - model->MOS9lengthAdjust <1e-6) { - SPfrontEnd->IFerrorf (ERR_FATAL, - "%s: effective channel length less than zero", - here->MOS9name); - return(E_PARMVAL); - } - - if(here->MOS9w - 2 * model->MOS9widthNarrow + - model->MOS9widthAdjust <1e-6) { - SPfrontEnd->IFerrorf (ERR_FATAL, - "%s: effective channel width less than zero", - here->MOS9name); - return(E_PARMVAL); - } - - - ratio4 = ratio * sqrt(ratio); - here->MOS9tTransconductance = model->MOS9transconductance / ratio4; - here->MOS9tSurfMob = model->MOS9surfaceMobility/ratio4; - phio= (model->MOS9phi-pbfact1)/fact1; - here->MOS9tPhi = fact2 * phio + pbfact; - here->MOS9tVbi = - model->MOS9delvt0 + - model->MOS9vt0 - model->MOS9type * - (model->MOS9gamma* sqrt(model->MOS9phi)) - +.5*(egfet1-egfet) - + model->MOS9type*.5* (here->MOS9tPhi-model->MOS9phi); - here->MOS9tVto = here->MOS9tVbi + model->MOS9type * - model->MOS9gamma * sqrt(here->MOS9tPhi); - here->MOS9tSatCur = model->MOS9jctSatCur* - exp(-egfet/vt+egfet1/vtnom); - here->MOS9tSatCurDens = model->MOS9jctSatCurDensity * - exp(-egfet/vt+egfet1/vtnom); - pbo = (model->MOS9bulkJctPotential - pbfact1)/fact1; - gmaold = (model->MOS9bulkJctPotential-pbo)/pbo; - capfact = 1/(1+model->MOS9bulkJctBotGradingCoeff* - (4e-4*(model->MOS9tnom-REFTEMP)-gmaold)); - here->MOS9tCbd = model->MOS9capBD * capfact; - here->MOS9tCbs = model->MOS9capBS * capfact; - here->MOS9tCj = model->MOS9bulkCapFactor * capfact; - capfact = 1/(1+model->MOS9bulkJctSideGradingCoeff* - (4e-4*(model->MOS9tnom-REFTEMP)-gmaold)); - here->MOS9tCjsw = model->MOS9sideWallCapFactor * capfact; - here->MOS9tBulkPot = fact2 * pbo+pbfact; - gmanew = (here->MOS9tBulkPot-pbo)/pbo; - capfact = (1+model->MOS9bulkJctBotGradingCoeff* - (4e-4*(here->MOS9temp-REFTEMP)-gmanew)); - here->MOS9tCbd *= capfact; - here->MOS9tCbs *= capfact; - here->MOS9tCj *= capfact; - capfact = (1+model->MOS9bulkJctSideGradingCoeff* - (4e-4*(here->MOS9temp-REFTEMP)-gmanew)); - here->MOS9tCjsw *= capfact; - here->MOS9tDepCap = model->MOS9fwdCapDepCoeff * here->MOS9tBulkPot; - - if( (model->MOS9jctSatCurDensity == 0) || - (here->MOS9drainArea == 0) || - (here->MOS9sourceArea == 0) ) { - here->MOS9sourceVcrit = here->MOS9drainVcrit = - vt*log(vt/(CONSTroot2*here->MOS9m*here->MOS9tSatCur)); - } else { - here->MOS9drainVcrit = - vt * log( vt / (CONSTroot2 * - here->MOS9m * - here->MOS9tSatCurDens * here->MOS9drainArea)); - here->MOS9sourceVcrit = - vt * log( vt / (CONSTroot2 * - here->MOS9m * - here->MOS9tSatCurDens * here->MOS9sourceArea)); - } - if(model->MOS9capBDGiven) { - czbd = here->MOS9tCbd * here->MOS9m; - } else { - if(model->MOS9bulkCapFactorGiven) { - czbd=here->MOS9tCj*here->MOS9drainArea * here->MOS9m; - } else { - czbd=0; - } - } - if(model->MOS9sideWallCapFactorGiven) { - czbdsw= here->MOS9tCjsw * here->MOS9drainPerimiter * - here->MOS9m; - } else { - czbdsw=0; - } - arg = 1-model->MOS9fwdCapDepCoeff; - sarg = exp( (-model->MOS9bulkJctBotGradingCoeff) * log(arg) ); - sargsw = exp( (-model->MOS9bulkJctSideGradingCoeff) * log(arg) ); - here->MOS9Cbd = czbd; - here->MOS9Cbdsw = czbdsw; - here->MOS9f2d = czbd*(1-model->MOS9fwdCapDepCoeff* - (1+model->MOS9bulkJctBotGradingCoeff))* sarg/arg - + czbdsw*(1-model->MOS9fwdCapDepCoeff* - (1+model->MOS9bulkJctSideGradingCoeff))* - sargsw/arg; - here->MOS9f3d = czbd * model->MOS9bulkJctBotGradingCoeff * sarg/arg/ - here->MOS9tBulkPot - + czbdsw * model->MOS9bulkJctSideGradingCoeff * sargsw/arg / - here->MOS9tBulkPot; - here->MOS9f4d = czbd*here->MOS9tBulkPot*(1-arg*sarg)/ - (1-model->MOS9bulkJctBotGradingCoeff) - + czbdsw*here->MOS9tBulkPot*(1-arg*sargsw)/ - (1-model->MOS9bulkJctSideGradingCoeff) - -here->MOS9f3d/2* - (here->MOS9tDepCap*here->MOS9tDepCap) - -here->MOS9tDepCap * here->MOS9f2d; - if(model->MOS9capBSGiven) { - czbs = here->MOS9tCbs * here->MOS9m; - } else { - if(model->MOS9bulkCapFactorGiven) { - czbs=here->MOS9tCj*here->MOS9sourceArea * here->MOS9m; - } else { - czbs=0; - } - } - if(model->MOS9sideWallCapFactorGiven) { - czbssw = here->MOS9tCjsw * here->MOS9sourcePerimiter * - here->MOS9m; - } else { - czbssw=0; - } - arg = 1-model->MOS9fwdCapDepCoeff; - sarg = exp( (-model->MOS9bulkJctBotGradingCoeff) * log(arg) ); - sargsw = exp( (-model->MOS9bulkJctSideGradingCoeff) * log(arg) ); - here->MOS9Cbs = czbs; - here->MOS9Cbssw = czbssw; - here->MOS9f2s = czbs*(1-model->MOS9fwdCapDepCoeff* - (1+model->MOS9bulkJctBotGradingCoeff))* sarg/arg - + czbssw*(1-model->MOS9fwdCapDepCoeff* - (1+model->MOS9bulkJctSideGradingCoeff))* - sargsw/arg; - here->MOS9f3s = czbs * model->MOS9bulkJctBotGradingCoeff * sarg/arg/ - here->MOS9tBulkPot - + czbssw * model->MOS9bulkJctSideGradingCoeff * sargsw/arg / - here->MOS9tBulkPot; - here->MOS9f4s = czbs*here->MOS9tBulkPot*(1-arg*sarg)/ - (1-model->MOS9bulkJctBotGradingCoeff) - + czbssw*here->MOS9tBulkPot*(1-arg*sargsw)/ - (1-model->MOS9bulkJctSideGradingCoeff) - -here->MOS9f3s/2* - (here->MOS9tDepCap*here->MOS9tDepCap) - -here->MOS9tDepCap * here->MOS9f2s; - } - } - return(OK); -} diff --git a/src/spicelib/devices/mos9/mos9trun.c b/src/spicelib/devices/mos9/mos9trun.c deleted file mode 100644 index f04f01f66..000000000 --- a/src/spicelib/devices/mos9/mos9trun.c +++ /dev/null @@ -1,31 +0,0 @@ -/********** -Copyright 1990 Regents of the University of California. All rights reserved. -Author: 1985 Thomas L. Quarles -Modified: Alan Gillespie -**********/ - -#include "ngspice/ngspice.h" -#include "ngspice/cktdefs.h" -#include "mos9defs.h" -#include "ngspice/sperror.h" -#include "ngspice/suffix.h" - -int -MOS9trunc( - GENmodel *inModel, - CKTcircuit *ckt, - double *timeStep) -{ - MOS9model *model = (MOS9model *)inModel; - MOS9instance *here; - - for( ; model != NULL; model = MOS9nextModel(model)) { - for(here=MOS9instances(model);here!=NULL;here = MOS9nextInstance(here)){ - - CKTterr(here->MOS9qgs,ckt,timeStep); - CKTterr(here->MOS9qgd,ckt,timeStep); - CKTterr(here->MOS9qgb,ckt,timeStep); - } - } - return(OK); -} diff --git a/src/spicelib/devices/nbjt/Makefile.am b/src/spicelib/devices/nbjt/Makefile.am deleted file mode 100644 index 02e440020..000000000 --- a/src/spicelib/devices/nbjt/Makefile.am +++ /dev/null @@ -1,29 +0,0 @@ -## Process this file with automake to produce Makefile.in - -noinst_LTLIBRARIES = libnbjt.la - -libnbjt_la_SOURCES = \ - nbjt.c \ - nbjtacld.c \ - nbjtask.c \ - nbjtdefs.h \ - nbjtdel.c \ - nbjtdump.c \ - nbjtext.h \ - nbjtinit.c \ - nbjtinit.h \ - nbjtitf.h \ - nbjtload.c \ - nbjtmpar.c \ - nbjtparm.c \ - nbjtpzld.c \ - nbjtset.c \ - nbjttemp.c \ - nbjttrun.c - - - -AM_CPPFLAGS = @AM_CPPFLAGS@ -I$(top_srcdir)/src/include -AM_CFLAGS = $(STATIC) - -MAINTAINERCLEANFILES = Makefile.in diff --git a/src/spicelib/devices/nbjt/nbjt.c b/src/spicelib/devices/nbjt/nbjt.c deleted file mode 100644 index 58d210a58..000000000 --- a/src/spicelib/devices/nbjt/nbjt.c +++ /dev/null @@ -1,69 +0,0 @@ -/********** -Copyright 1992 Regents of the University of California. All rights reserved. -Author: 1987 Kartikeya Mayaram, U. C. Berkeley CAD Group -**********/ - -#include "ngspice/ngspice.h" -#include "ngspice/devdefs.h" -#include "nbjtdefs.h" -#include "ngspice/suffix.h" - -/* - * This file defines the Numerical BJT data structures that are available to - * the next level(s) up the calling hierarchy - */ - -IFparm NBJTpTable[] = { /* parameters */ - IP("off", NBJT_OFF, IF_FLAG, "Device initially off"), - IP("ic.file", NBJT_IC_FILE, IF_STRING, "Initial condition file"), - IOP("area", NBJT_AREA, IF_REAL, "Area factor"), - IP("save", NBJT_PRINT, IF_INTEGER, "Save Solutions"), - IPR("print", NBJT_PRINT, IF_INTEGER, "Print Solutions"), - OP("g11", NBJT_G11, IF_REAL, "Conductance"), - OP("c11", NBJT_C11, IF_REAL, "Capacitance"), - OP("y11", NBJT_Y11, IF_COMPLEX, "Admittance"), - OP("g12", NBJT_G12, IF_REAL, "Conductance"), - OP("c12", NBJT_C12, IF_REAL, "Capacitance"), - OP("y12", NBJT_Y12, IF_COMPLEX, "Admittance"), - OPU("g13", NBJT_G13, IF_REAL, "Conductance"), - OPU("c13", NBJT_C13, IF_REAL, "Capacitance"), - OPU("y13", NBJT_Y13, IF_COMPLEX, "Admittance"), - OP("g21", NBJT_G21, IF_REAL, "Conductance"), - OP("c21", NBJT_C21, IF_REAL, "Capacitance"), - OP("y21", NBJT_Y21, IF_COMPLEX, "Admittance"), - OP("g22", NBJT_G22, IF_REAL, "Conductance"), - OP("c22", NBJT_C22, IF_REAL, "Capacitance"), - OP("y22", NBJT_Y22, IF_COMPLEX, "Admittance"), - OPU("g23", NBJT_G23, IF_REAL, "Conductance"), - OPU("c23", NBJT_C23, IF_REAL, "Capacitance"), - OPU("y23", NBJT_Y23, IF_COMPLEX, "Admittance"), - OPU("g31", NBJT_G31, IF_REAL, "Conductance"), - OPU("c31", NBJT_C31, IF_REAL, "Capacitance"), - OPU("y31", NBJT_Y31, IF_COMPLEX, "Admittance"), - OPU("g32", NBJT_G32, IF_REAL, "Conductance"), - OPU("c32", NBJT_C32, IF_REAL, "Capacitance"), - OPU("y32", NBJT_Y32, IF_COMPLEX, "Admittance"), - OPU("g33", NBJT_G33, IF_REAL, "Conductance"), - OPU("c33", NBJT_C33, IF_REAL, "Capacitance"), - OPU("y33", NBJT_Y33, IF_COMPLEX, "Admittance"), - IOP("temp", NBJT_TEMP, IF_REAL, "Instance Temperature") -}; - -IFparm NBJTmPTable[] = { /* model parameters */ - /* numerical-device models no longer have parameters */ - /* one is left behind to keep the table from being empty */ - IP("nbjt", NBJT_MOD_NBJT, IF_FLAG, "Numerical BJT Model") -}; - -char *NBJTnames[] = { - "Collector", - "Base", - "Emitter", - "Substrate" -}; - -int NBJTnSize = NUMELEMS(NBJTnames); -int NBJTpTSize = NUMELEMS(NBJTpTable); -int NBJTmPTSize = NUMELEMS(NBJTmPTable); -int NBJTiSize = sizeof(NBJTinstance); -int NBJTmSize = sizeof(NBJTmodel); diff --git a/src/spicelib/devices/nbjt/nbjtacld.c b/src/spicelib/devices/nbjt/nbjtacld.c deleted file mode 100644 index 24de3f1d1..000000000 --- a/src/spicelib/devices/nbjt/nbjtacld.c +++ /dev/null @@ -1,96 +0,0 @@ -/********** -Copyright 1992 Regents of the University of California. All rights reserved. -Author: 1987 Kartikeya Mayaram, U. C. Berkeley CAD Group -**********/ - -/* - * Function to load the COMPLEX circuit matrix using the small signal - * parameters saved during a previous DC operating point analysis. - */ - -#include "ngspice/ngspice.h" -#include "ngspice/cktdefs.h" -#include "nbjtdefs.h" -#include "ngspice/sperror.h" -#include "ngspice/complex.h" -#include "../../../ciderlib/oned/onedext.h" -#include "ngspice/cidersupt.h" -#include "ngspice/numglobs.h" -#include "ngspice/suffix.h" - -/* External Declarations */ -extern int ONEacDebug; - -int -NBJTacLoad(GENmodel *inModel, CKTcircuit *ckt) -{ - register NBJTmodel *model = (NBJTmodel *) inModel; - register NBJTinstance *inst; - SPcomplex yIeVce, yIeVbe; - SPcomplex yIcVce, yIcVbe; - double startTime; - - for (; model != NULL; model = NBJTnextModel(model)) { - FieldDepMobility = model->NBJTmodels->MODLfieldDepMobility; - Srh = model->NBJTmodels->MODLsrh; - Auger = model->NBJTmodels->MODLauger; - AvalancheGen = model->NBJTmodels->MODLavalancheGen; - AcAnalysisMethod = model->NBJTmethods->METHacAnalysisMethod; - MobDeriv = model->NBJTmethods->METHmobDeriv; - ONEacDebug = model->NBJToutputs->OUTPacDebug; - - for (inst = NBJTinstances(model); inst != NULL; - inst = NBJTnextInstance(inst)) { - - startTime = SPfrontEnd->IFseconds(); - /* Get Temp.-Dep. Global Parameters */ - GLOBgetGlobals(&(inst->NBJTglobals)); - - model->NBJTmethods->METHacAnalysisMethod = - NBJTadmittance(inst->NBJTpDevice, ckt->CKTomega, - &yIeVce, &yIcVce, &yIeVbe, &yIcVbe); - - *(inst->NBJTcolColPtr) += yIcVce.real; - *(inst->NBJTcolColPtr + 1) += yIcVce.imag; - *(inst->NBJTcolBasePtr) += yIcVbe.real; - *(inst->NBJTcolBasePtr + 1) += yIcVbe.imag; - *(inst->NBJTcolEmitPtr) -= yIcVbe.real + yIcVce.real; - *(inst->NBJTcolEmitPtr + 1) -= yIcVbe.imag + yIcVce.imag; - *(inst->NBJTbaseColPtr) -= yIcVce.real - yIeVce.real; - *(inst->NBJTbaseColPtr + 1) -= yIcVce.imag - yIeVce.imag; - *(inst->NBJTbaseBasePtr) -= yIcVbe.real - yIeVbe.real; - *(inst->NBJTbaseBasePtr + 1) -= yIcVbe.imag - yIeVbe.imag; - *(inst->NBJTbaseEmitPtr) += yIcVbe.real + yIcVce.real - yIeVbe.real - yIeVce.real; - *(inst->NBJTbaseEmitPtr + 1) += yIcVbe.imag + yIcVce.imag - yIeVbe.imag - yIeVce.imag; - *(inst->NBJTemitColPtr) -= yIeVce.real; - *(inst->NBJTemitColPtr + 1) -= yIeVce.imag; - *(inst->NBJTemitBasePtr) -= yIeVbe.real; - *(inst->NBJTemitBasePtr + 1) -= yIeVbe.imag; - *(inst->NBJTemitEmitPtr) += yIeVbe.real + yIeVce.real; - *(inst->NBJTemitEmitPtr + 1) += yIeVbe.imag + yIeVce.imag; - if (ckt->CKTomega != 0.0) { - inst->NBJTc11 = yIcVce.imag / ckt->CKTomega; - inst->NBJTc12 = yIcVbe.imag / ckt->CKTomega; - inst->NBJTc21 = (yIeVce.imag - yIcVce.imag) / ckt->CKTomega; - inst->NBJTc22 = (yIeVbe.imag - yIcVbe.imag) / ckt->CKTomega; - } else { - inst->NBJTc11 = 0.0; /* XXX What else can be done?! */ - inst->NBJTc12 = 0.0; /* XXX What else can be done?! */ - inst->NBJTc21 = 0.0; /* XXX What else can be done?! */ - inst->NBJTc22 = 0.0; /* XXX What else can be done?! */ - } - inst->NBJTy11r = yIcVce.real; - inst->NBJTy11i = yIcVce.imag; - inst->NBJTy12r = yIcVbe.real; - inst->NBJTy12i = yIcVbe.imag; - inst->NBJTy21r = yIeVce.real - yIcVce.real; - inst->NBJTy21i = yIeVce.imag - yIcVce.imag; - inst->NBJTy22r = yIeVbe.real - yIcVbe.real; - inst->NBJTy22i = yIeVbe.imag - yIcVbe.imag; - inst->NBJTsmSigAvail = TRUE; - inst->NBJTpDevice->pStats->totalTime[STAT_AC] += - SPfrontEnd->IFseconds() - startTime; - } - } - return (OK); -} diff --git a/src/spicelib/devices/nbjt/nbjtask.c b/src/spicelib/devices/nbjt/nbjtask.c deleted file mode 100644 index 5ae1ab5fa..000000000 --- a/src/spicelib/devices/nbjt/nbjtask.c +++ /dev/null @@ -1,210 +0,0 @@ -/********** -Copyright 1990 Regents of the University of California. All rights reserved. -Author: 1987 Thomas L. Quarles -**********/ - -#include "ngspice/ngspice.h" -#include "ngspice/const.h" -#include "ngspice/ifsim.h" -#include "ngspice/cktdefs.h" -#include "ngspice/devdefs.h" -#include "nbjtdefs.h" -#include "ngspice/sperror.h" -#include "ngspice/suffix.h" - -/* Check out this one */ -extern int NBJTinitSmSig(NBJTinstance *); - - -/* ARGSUSED */ -int -NBJTask(CKTcircuit *ckt, GENinstance *inInst, int which, IFvalue *value, IFvalue *select) -{ - NBJTinstance *inst = (NBJTinstance *) inInst; - - NG_IGNORE(select); - - switch (which) { - case NBJT_AREA: - value->rValue = inst->NBJTarea; - return (OK); - case NBJT_TEMP: - value->rValue = inst->NBJTtemp - CONSTCtoK; - return (OK); - case NBJT_G11: - value->rValue = *(ckt->CKTstate0 + inst->NBJTdIcDVce); - return (OK); - case NBJT_G12: - value->rValue = *(ckt->CKTstate0 + inst->NBJTdIcDVbe); - return (OK); - case NBJT_G13: - value->rValue = -*(ckt->CKTstate0 + inst->NBJTdIcDVce) - - *(ckt->CKTstate0 + inst->NBJTdIcDVbe); - return (OK); - case NBJT_G21: - value->rValue = *(ckt->CKTstate0 + inst->NBJTdIeDVce) - - *(ckt->CKTstate0 + inst->NBJTdIcDVce); - return (OK); - case NBJT_G22: - value->rValue = *(ckt->CKTstate0 + inst->NBJTdIeDVbe) - - *(ckt->CKTstate0 + inst->NBJTdIcDVbe); - return (OK); - case NBJT_G23: - value->rValue = -*(ckt->CKTstate0 + inst->NBJTdIeDVce) - + *(ckt->CKTstate0 + inst->NBJTdIcDVce) /* XXX there was a ;*/ - -*(ckt->CKTstate0 + inst->NBJTdIeDVbe) - + *(ckt->CKTstate0 + inst->NBJTdIcDVbe); - return (OK); - case NBJT_G31: - value->rValue = -*(ckt->CKTstate0 + inst->NBJTdIeDVce); - return (OK); - case NBJT_G32: - value->rValue = -*(ckt->CKTstate0 + inst->NBJTdIeDVbe); - return (OK); - case NBJT_G33: - value->rValue = *(ckt->CKTstate0 + inst->NBJTdIeDVce) - + *(ckt->CKTstate0 + inst->NBJTdIeDVbe); - return (OK); - case NBJT_C11: - if (!inst->NBJTsmSigAvail - && ckt->CKTcurrentAnalysis != DOING_TRAN) { - NBJTinitSmSig(inst); - } - value->rValue = inst->NBJTc11; - return (OK); - case NBJT_C12: - if (!inst->NBJTsmSigAvail - && ckt->CKTcurrentAnalysis != DOING_TRAN) { - NBJTinitSmSig(inst); - } - value->rValue = inst->NBJTc12; - return (OK); - case NBJT_C13: - if (!inst->NBJTsmSigAvail - && ckt->CKTcurrentAnalysis != DOING_TRAN) { - NBJTinitSmSig(inst); - } - value->rValue = -inst->NBJTc11 - inst->NBJTc12; - return (OK); - case NBJT_C21: - if (!inst->NBJTsmSigAvail - && ckt->CKTcurrentAnalysis != DOING_TRAN) { - NBJTinitSmSig(inst); - } - value->rValue = inst->NBJTc21; - return (OK); - case NBJT_C22: - if (!inst->NBJTsmSigAvail - && ckt->CKTcurrentAnalysis != DOING_TRAN) { - NBJTinitSmSig(inst); - } - value->rValue = inst->NBJTc22; - return (OK); - case NBJT_C23: - if (!inst->NBJTsmSigAvail - && ckt->CKTcurrentAnalysis != DOING_TRAN) { - NBJTinitSmSig(inst); - } - value->rValue = -inst->NBJTc21 - inst->NBJTc22; - return (OK); - case NBJT_C31: - if (!inst->NBJTsmSigAvail - && ckt->CKTcurrentAnalysis != DOING_TRAN) { - NBJTinitSmSig(inst); - } - value->rValue = -inst->NBJTc11 - inst->NBJTc21; - return (OK); - case NBJT_C32: - if (!inst->NBJTsmSigAvail - && ckt->CKTcurrentAnalysis != DOING_TRAN) { - NBJTinitSmSig(inst); - } - value->rValue = -inst->NBJTc12 - inst->NBJTc22; - return (OK); - case NBJT_C33: - if (!inst->NBJTsmSigAvail - && ckt->CKTcurrentAnalysis != DOING_TRAN) { - NBJTinitSmSig(inst); - } - value->rValue = inst->NBJTc11 + inst->NBJTc21 - + inst->NBJTc12 + inst->NBJTc22; - return (OK); - case NBJT_Y11: - if (!inst->NBJTsmSigAvail - && ckt->CKTcurrentAnalysis != DOING_TRAN) { - NBJTinitSmSig(inst); - } - value->cValue.real = inst->NBJTy11r; - value->cValue.imag = inst->NBJTy11i; - return (OK); - case NBJT_Y12: - if (!inst->NBJTsmSigAvail - && ckt->CKTcurrentAnalysis != DOING_TRAN) { - NBJTinitSmSig(inst); - } - value->cValue.real = inst->NBJTy12r; - value->cValue.imag = inst->NBJTy12i; - return (OK); - case NBJT_Y13: - if (!inst->NBJTsmSigAvail - && ckt->CKTcurrentAnalysis != DOING_TRAN) { - NBJTinitSmSig(inst); - } - value->cValue.real = -inst->NBJTy11r - inst->NBJTy12r; - value->cValue.imag = -inst->NBJTy11i - inst->NBJTy12i; - return (OK); - case NBJT_Y21: - if (!inst->NBJTsmSigAvail - && ckt->CKTcurrentAnalysis != DOING_TRAN) { - NBJTinitSmSig(inst); - } - value->cValue.real = inst->NBJTy21r; - value->cValue.imag = inst->NBJTy21i; - return (OK); - case NBJT_Y22: - if (!inst->NBJTsmSigAvail - && ckt->CKTcurrentAnalysis != DOING_TRAN) { - NBJTinitSmSig(inst); - } - value->cValue.real = inst->NBJTy22r; - value->cValue.imag = inst->NBJTy22i; - return (OK); - case NBJT_Y23: - if (!inst->NBJTsmSigAvail - && ckt->CKTcurrentAnalysis != DOING_TRAN) { - NBJTinitSmSig(inst); - } - value->cValue.real = -inst->NBJTy21r - inst->NBJTy22r; - value->cValue.imag = -inst->NBJTy21i - inst->NBJTy22i; - return (OK); - case NBJT_Y31: - if (!inst->NBJTsmSigAvail - && ckt->CKTcurrentAnalysis != DOING_TRAN) { - NBJTinitSmSig(inst); - } - value->cValue.real = -inst->NBJTy11r - inst->NBJTy21r; - value->cValue.imag = -inst->NBJTy11i - inst->NBJTy21i; - return (OK); - case NBJT_Y32: - if (!inst->NBJTsmSigAvail - && ckt->CKTcurrentAnalysis != DOING_TRAN) { - NBJTinitSmSig(inst); - } - value->cValue.real = -inst->NBJTy12r - inst->NBJTy22r; - value->cValue.imag = -inst->NBJTy12i - inst->NBJTy22i; - return (OK); - case NBJT_Y33: - if (!inst->NBJTsmSigAvail - && ckt->CKTcurrentAnalysis != DOING_TRAN) { - NBJTinitSmSig(inst); - } - value->cValue.real = inst->NBJTy11r + inst->NBJTy21r - + inst->NBJTy12r + inst->NBJTy22r; - value->cValue.imag = inst->NBJTy11i + inst->NBJTy21i - + inst->NBJTy12i + inst->NBJTy22i; - return (OK); - default: - return (E_BADPARM); - } - /* NOTREACHED */ -} diff --git a/src/spicelib/devices/nbjt/nbjtdefs.h b/src/spicelib/devices/nbjt/nbjtdefs.h deleted file mode 100644 index 54588a0b2..000000000 --- a/src/spicelib/devices/nbjt/nbjtdefs.h +++ /dev/null @@ -1,170 +0,0 @@ -/********** -Copyright 1991 Regents of the University of California. All rights reserved. -Authors: 1987 Karti Mayaram, 1991 David Gates -**********/ - -#ifndef NBJT_H -#define NBJT_H - -/* data structures used to describe 1D Numerical BJTs */ - -/* circuit level includes */ -#include "ngspice/ifsim.h" -#include "ngspice/cktdefs.h" -#include "ngspice/gendefs.h" - -/* device level includes */ -#include "ngspice/onemesh.h" -#include "ngspice/onedev.h" -#include "ngspice/profile.h" -#include "ngspice/numglobs.h" -#include "ngspice/carddefs.h" - -/* information needed per instance */ -typedef struct sNBJTinstance { - - struct GENinstance gen; - -#define NBJTmodPtr(inst) ((struct sNBJTmodel *)((inst)->gen.GENmodPtr)) -#define NBJTnextInstance(inst) ((struct sNBJTinstance *)((inst)->gen.GENnextInstance)) -#define NBJTname gen.GENname -#define NBJTstate gen.GENstate - -#define NBJTvbe NBJTstate -#define NBJTvce NBJTstate+1 -#define NBJTic NBJTstate+2 -#define NBJTie NBJTstate+3 -#define NBJTdIeDVce NBJTstate+4 -#define NBJTdIeDVbe NBJTstate+5 -#define NBJTdIcDVce NBJTstate+6 -#define NBJTdIcDVbe NBJTstate+7 -#define NBJTnumStates 8 - - const int NBJTcolNode; /* number of collector node of bjt */ - const int NBJTbaseNode; /* number of base node of bjt */ - const int NBJTemitNode; /* number of emitter node of bjt */ - ONEdevice *NBJTpDevice; - GLOBvalues NBJTglobals; /* Temp.-Dep. Global Parameters */ - int NBJTtype; - double NBJTarea; /* area factor of the BJT */ - double NBJTtemp; /* Instance Temperature */ - double NBJTc11; /* small-signal capacitance */ - double NBJTy11r; /* small-signal admittance, real part */ - double NBJTy11i; /* small-signal admittance, imag part */ - double NBJTc12; /* small-signal capacitance */ - double NBJTy12r; /* small-signal admittance, real part */ - double NBJTy12i; /* small-signal admittance, imag part */ - double NBJTc21; /* small-signal capacitance */ - double NBJTy21r; /* small-signal admittance, real part */ - double NBJTy21i; /* small-signal admittance, imag part */ - double NBJTc22; /* small-signal capacitance */ - double NBJTy22r; /* small-signal admittance, real part */ - double NBJTy22i; /* small-signal admittance, imag part */ - int NBJTprint; - char *NBJTicFile; /* Name of initial condition file */ - double *NBJTcolColPtr; /* pointer to sparse matrix at - * (collector,collector) */ - double *NBJTbaseBasePtr; /* pointer to sparse matrix at (base,base) */ - double *NBJTemitEmitPtr; /* pointer to sparse matrix at - * (emitter,emitter) */ - double *NBJTcolBasePtr; /* pointer to sparse matrix at - * (collector,base) */ - double *NBJTcolEmitPtr; /* pointer to sparse matrix at - * (collector,emitter) */ - double *NBJTbaseColPtr; /* pointer to sparse matrix at - * (base,collector) */ - double *NBJTbaseEmitPtr; /* pointer to sparse matrix at (base,emitter) */ - double *NBJTemitColPtr; /* pointer to sparse matrix at - * (emitter,collector) */ - double *NBJTemitBasePtr; /* pointer to sparse matrix at (emitter,base) */ - int NBJToff; /* 'off' flag for bjt */ - unsigned NBJTsmSigAvail:1; /* flag to indicate small-signal done */ - unsigned NBJTareaGiven:1; /* flag to indicate area was specified */ - unsigned NBJTicFileGiven:1; /* flag to indicate init. cond. file given */ - unsigned NBJTprintGiven:1; /* flag to indicate if print was given */ - unsigned NBJTtempGiven:1; /* flag to indicate if temp was given */ -} NBJTinstance; - -/* per model data */ -typedef struct sNBJTmodel { /* model structure for a bjt */ - - struct GENmodel gen; - -#define NBJTmodType gen.GENmodType -#define NBJTnextModel(inst) ((struct sNBJTmodel *)((inst)->gen.GENnextModel)) -#define NBJTinstances(inst) ((NBJTinstance *)((inst)->gen.GENinstances)) -#define NBJTmodName gen.GENmodName - - MESHcard *NBJTxMeshes; /* list of xmesh cards */ - MESHcard *NBJTyMeshes; /* list of ymesh cards */ - DOMNcard *NBJTdomains; /* list of domain cards */ - BDRYcard *NBJTboundaries; /* list of boundary cards */ - DOPcard *NBJTdopings; /* list of doping cards */ - ELCTcard *NBJTelectrodes; /* list of electrode cards */ - CONTcard *NBJTcontacts; /* list of contact cards */ - MODLcard *NBJTmodels; /* list of model cards */ - MATLcard *NBJTmaterials; /* list of material cards */ - MOBcard *NBJTmobility; /* list of mobility cards */ - METHcard *NBJTmethods; /* list of method cards */ - OPTNcard *NBJToptions; /* list of option cards */ - OUTPcard *NBJToutputs; /* list of output cards */ - ONEtranInfo *NBJTpInfo; /* transient analysis information */ - DOPprofile *NBJTprofiles; /* expanded list of doping profiles */ - DOPtable *NBJTdopTables; /* list of tables used by profiles */ - ONEmaterial *NBJTmatlInfo; /* list of material info structures */ -} NBJTmodel; - -/* type of BJT */ -#define NPN 1 -#define PNP -1 - -/* device parameters */ -enum { - NBJT_AREA = 1, - NBJT_OFF, - NBJT_IC_FILE, - NBJT_PRINT, - NBJT_TEMP, -}; - -enum { - NBJT_G11 = 8, - NBJT_C11, - NBJT_Y11, - NBJT_G12, - NBJT_C12, - NBJT_Y12, - NBJT_G13, - NBJT_C13, - NBJT_Y13, - NBJT_G21, - NBJT_C21, - NBJT_Y21, - NBJT_G22, - NBJT_C22, - NBJT_Y22, - NBJT_G23, - NBJT_C23, - NBJT_Y23, - NBJT_G31, - NBJT_C31, - NBJT_Y31, - NBJT_G32, - NBJT_C32, - NBJT_Y32, - NBJT_G33, - NBJT_C33, - NBJT_Y33, -}; - -/* model parameters */ -/* NOTE: all true model parameters have been moved to IFcardInfo structures */ -#define NBJT_MOD_NBJT 101 - -/* device questions */ - -/* model questions */ - -#include "nbjtext.h" - -#endif /* NBJT_H */ diff --git a/src/spicelib/devices/nbjt/nbjtdel.c b/src/spicelib/devices/nbjt/nbjtdel.c deleted file mode 100644 index b4997932e..000000000 --- a/src/spicelib/devices/nbjt/nbjtdel.c +++ /dev/null @@ -1,26 +0,0 @@ -/********** -Copyright 1992 Regents of the University of California. All rights reserved. -Author: 1987 Kartikeya Mayaram, U. C. Berkeley CAD Group -**********/ - -/* - * This routine deletes a NBJT instance from the circuit and frees the - * storage it was using. - */ - -#include "ngspice/ngspice.h" -#include "nbjtdefs.h" -#include "../../../ciderlib/oned/onedext.h" -#include "ngspice/sperror.h" -#include "ngspice/suffix.h" - - -int -NBJTdelete(GENinstance *gen_inst) -{ - NBJTinstance *inst = (NBJTinstance *) gen_inst; - - ONEdestroy(inst->NBJTpDevice); - - return OK; -} diff --git a/src/spicelib/devices/nbjt/nbjtdump.c b/src/spicelib/devices/nbjt/nbjtdump.c deleted file mode 100644 index c78c9f8aa..000000000 --- a/src/spicelib/devices/nbjt/nbjtdump.c +++ /dev/null @@ -1,174 +0,0 @@ -/********** -Copyright 1992 Regents of the University of California. All rights reserved. -Author: 1987 Kartikeya Mayaram, U. C. Berkeley CAD Group -Author: 1991 David A. Gates, U. C. Berkeley CAD Group -**********/ - -/* - * This is a simple routine to dump the internal device states. It produces - * states for .OP, .DC, & .TRAN simulations. - */ - -#include "ngspice/ngspice.h" -#include "ngspice/cktdefs.h" -#include "nbjtdefs.h" -#include "../../../ciderlib/oned/onedext.h" -#include "ngspice/cidersupt.h" -#include "ngspice/suffix.h" - - -/* Forward Declarations */ -static void NBJTputHeader(FILE *, CKTcircuit *, NBJTinstance *); - -/* State Counter */ -static int state_numOP = 0; -static int state_numDC = 0; -static int state_numTR = 0; - -void -NBJTdump(GENmodel *inModel, CKTcircuit *ckt) -{ - register NBJTmodel *model = (NBJTmodel *) inModel; - register NBJTinstance *inst; - OUTPcard *output; - FILE *fpState; - char fileName[BSIZE_SP]; - char description[BSIZE_SP]; - char *prefix; - int *state_num; - int anyOutput = 0; - BOOLEAN writeAscii = TRUE; - - if (ckt->CKTmode & MODEDCOP) { - prefix = "OP"; - state_num = &state_numOP; - sprintf(description, "..."); - } else if (ckt->CKTmode & MODEDCTRANCURVE) { - prefix = "DC"; - state_num = &state_numDC; - sprintf(description, "sweep = % e", ckt->CKTtime); - } else if (ckt->CKTmode & MODETRAN) { - prefix = "TR"; - state_num = &state_numTR; - sprintf(description, "time = % e", ckt->CKTtime); - } else { - /* Not a recognized CKT mode. */ - return; - } - - for (; model != NULL; model = NBJTnextModel(model)) { - output = model->NBJToutputs; - for (inst = NBJTinstances(model); inst != NULL; - inst = NBJTnextInstance(inst)) { - - if (inst->NBJTprintGiven) { - if ((ckt->CKTmode & MODETRAN) && - ((ckt->CKTstat->STATaccepted - 1) % inst->NBJTprint != 0)) { - continue; - } - anyOutput = 1; - sprintf(fileName, "%s%s.%d.%s", output->OUTProotFile, prefix, - *state_num, inst->NBJTname); - - writeAscii = compareFiletypeVar("ascii"); - - fpState = fopen(fileName, (writeAscii ? "w" : "wb")); - if (!fpState) { - perror(fileName); - } else { - NBJTputHeader(fpState, ckt, inst); - ONEprnSolution(fpState, inst->NBJTpDevice, - model->NBJToutputs, writeAscii, "nbjt"); - fclose(fpState); - LOGmakeEntry(fileName, description); - } - } - } - } - if (anyOutput) { - (*state_num)++; - } -} - -#define NBJTnumOutputs 9 - -static -void -NBJTputHeader(FILE *file, CKTcircuit *ckt, NBJTinstance *inst) -{ - char *reference; - double refVal = 0.0; - int numVars = NBJTnumOutputs; - - if (ckt->CKTmode & MODEDCOP) { - reference = NULL; - } else if (ckt->CKTmode & MODEDCTRANCURVE) { - reference = "sweep"; - refVal = ckt->CKTtime; - numVars++; - } else if (ckt->CKTmode & MODETRAN) { - reference = "time"; - refVal = ckt->CKTtime; - numVars++; - } else { - reference = NULL; - } - fprintf(file, "Title: Device %s external state\n", inst->NBJTname); - fprintf(file, "Plotname: Device Operating Point\n"); - fprintf(file, "Command: deftype v conductance S\n"); - fprintf(file, "Flags: real\n"); - fprintf(file, "No. Variables: %d\n", numVars); - fprintf(file, "No. Points: 1\n"); - numVars = 0; - fprintf(file, "Variables:\n"); - if (reference) { - fprintf(file, "\t%d %s unknown\n", numVars++, reference); - } - fprintf(file, "\t%d v13 voltage\n", numVars++); - fprintf(file, "\t%d v23 voltage\n", numVars++); - fprintf(file, "\t%d i1 current\n", numVars++); - fprintf(file, "\t%d i2 current\n", numVars++); - fprintf(file, "\t%d i3 current\n", numVars++); - fprintf(file, "\t%d g22 conductance\n", numVars++); - fprintf(file, "\t%d g21 conductance\n", numVars++); - fprintf(file, "\t%d g12 conductance\n", numVars++); - fprintf(file, "\t%d g11 conductance\n", numVars++); - fprintf(file, "Values:\n0"); - if (reference) { - fprintf(file, "\t% e\n", refVal); - } - fprintf(file, "\t% e\n", *(ckt->CKTstate0 + inst->NBJTvce)); - fprintf(file, "\t% e\n", *(ckt->CKTstate0 + inst->NBJTvbe)); - fprintf(file, "\t% e\n", *(ckt->CKTstate0 + inst->NBJTic)); - fprintf(file, "\t% e\n", *(ckt->CKTstate0 + inst->NBJTie) - - *(ckt->CKTstate0 + inst->NBJTic)); - fprintf(file, "\t% e\n", -*(ckt->CKTstate0 + inst->NBJTie)); - fprintf(file, "\t% e\n", *(ckt->CKTstate0 + inst->NBJTdIeDVbe) - - *(ckt->CKTstate0 + inst->NBJTdIcDVbe)); - fprintf(file, "\t% e\n", *(ckt->CKTstate0 + inst->NBJTdIeDVce) - - *(ckt->CKTstate0 + inst->NBJTdIcDVce)); - fprintf(file, "\t% e\n", *(ckt->CKTstate0 + inst->NBJTdIcDVbe)); - fprintf(file, "\t% e\n", *(ckt->CKTstate0 + inst->NBJTdIcDVce)); -} - -void -NBJTacct(GENmodel *inModel, CKTcircuit *ckt, FILE *file) -{ - register NBJTmodel *model = (NBJTmodel *) inModel; - register NBJTinstance *inst; - OUTPcard *output; - - NG_IGNORE(ckt); - - for (; model != NULL; model = NBJTnextModel(model)) { - output = model->NBJToutputs; - for (inst = NBJTinstances(model); inst != NULL; - inst = NBJTnextInstance(inst)) { - - if (output->OUTPstats) { - ONEmemStats(file, inst->NBJTpDevice); - ONEcpuStats(file, inst->NBJTpDevice); - } - } - } -} diff --git a/src/spicelib/devices/nbjt/nbjtext.h b/src/spicelib/devices/nbjt/nbjtext.h deleted file mode 100644 index 3d8f5d333..000000000 --- a/src/spicelib/devices/nbjt/nbjtext.h +++ /dev/null @@ -1,25 +0,0 @@ -/********** -Copyright 1990 Regents of the University of California. All rights reserved. -Author: 1987 Karti Mayaram -**********/ - -#ifndef __NBJT_H -#define __NBJT_H - -extern int NBJTacLoad(GENmodel *, CKTcircuit *); -extern int NBJTask(CKTcircuit *, GENinstance *, int, IFvalue *, IFvalue *); -extern int NBJTdelete(GENinstance *); -extern int NBJTgetic(GENmodel *, CKTcircuit *); -extern int NBJTload(GENmodel *, CKTcircuit *); -extern int NBJTmParam(int, IFvalue *, GENmodel *); -extern int NBJTparam(int, IFvalue *, GENinstance *, IFvalue *); -extern int NBJTpzLoad(GENmodel *, CKTcircuit *, SPcomplex *); -extern int NBJTsetup(SMPmatrix *, GENmodel *, CKTcircuit *, int *); -extern int NBJTtemp(GENmodel *, CKTcircuit *); -extern int NBJTtrunc(GENmodel *, CKTcircuit *, double *); - -extern void NBJTdump(GENmodel *, CKTcircuit *); -extern void NBJTacct(GENmodel *, CKTcircuit *, FILE *); - - -#endif /* NBJT_H */ diff --git a/src/spicelib/devices/nbjt/nbjtinit.c b/src/spicelib/devices/nbjt/nbjtinit.c deleted file mode 100644 index 48378d766..000000000 --- a/src/spicelib/devices/nbjt/nbjtinit.c +++ /dev/null @@ -1,76 +0,0 @@ -#include "ngspice/config.h" - -#include "ngspice/devdefs.h" - -#include "nbjtitf.h" -#include "nbjtext.h" -#include "nbjtinit.h" - - -SPICEdev NBJTinfo = { - .DEVpublic = { - .name = "NBJT", - .description = "1D Numerical Bipolar Junction Transistor model", - .terms = &NBJTnSize, - .numNames = &NBJTnSize, - .termNames = NBJTnames, - .numInstanceParms = &NBJTpTSize, - .instanceParms = NBJTpTable, - .numModelParms = &NBJTmPTSize, - .modelParms = NBJTmPTable, - .flags = DEV_DEFAULT, - -#ifdef XSPICE - .cm_func = NULL, - .num_conn = 0, - .conn = NULL, - .num_param = 0, - .param = NULL, - .num_inst_var = 0, - .inst_var = NULL, -#endif - }, - - .DEVparam = NBJTparam, - .DEVmodParam = NBJTmParam, - .DEVload = NBJTload, - .DEVsetup = NBJTsetup, - .DEVunsetup = NULL, - .DEVpzSetup = NBJTsetup, - .DEVtemperature = NBJTtemp, - .DEVtrunc = NBJTtrunc, - .DEVfindBranch = NULL, - .DEVacLoad = NBJTacLoad, - .DEVaccept = NULL, - .DEVdestroy = NULL, - .DEVmodDelete = NULL, - .DEVdelete = NBJTdelete, - .DEVsetic = NULL, - .DEVask = NBJTask, - .DEVmodAsk = NULL, - .DEVpzLoad = NBJTpzLoad, - .DEVconvTest = NULL, - .DEVsenSetup = NULL, - .DEVsenLoad = NULL, - .DEVsenUpdate = NULL, - .DEVsenAcLoad = NULL, - .DEVsenPrint = NULL, - .DEVsenTrunc = NULL, - .DEVdisto = NULL, - .DEVnoise = NULL, - .DEVsoaCheck = NULL, - .DEVinstSize = &NBJTiSize, - .DEVmodSize = &NBJTmSize, - -#ifdef CIDER - .DEVdump = NBJTdump, - .DEVacct = NBJTacct, -#endif -}; - - -SPICEdev * -get_nbjt_info(void) -{ - return &NBJTinfo; -} diff --git a/src/spicelib/devices/nbjt/nbjtinit.h b/src/spicelib/devices/nbjt/nbjtinit.h deleted file mode 100644 index e7c6cae38..000000000 --- a/src/spicelib/devices/nbjt/nbjtinit.h +++ /dev/null @@ -1,13 +0,0 @@ -#ifndef _NBJTINIT_H -#define _NBJTINIT_H - -extern IFparm NBJTpTable[ ]; -extern IFparm NBJTmPTable[ ]; -extern char *NBJTnames[ ]; -extern int NBJTpTSize; -extern int NBJTmPTSize; -extern int NBJTnSize; -extern int NBJTiSize; -extern int NBJTmSize; - -#endif diff --git a/src/spicelib/devices/nbjt/nbjtitf.h b/src/spicelib/devices/nbjt/nbjtitf.h deleted file mode 100644 index 2479b5396..000000000 --- a/src/spicelib/devices/nbjt/nbjtitf.h +++ /dev/null @@ -1,12 +0,0 @@ -/********** -Copyright 1991 Regents of the University of California. All rights reserved. -**********/ - -#ifndef DEV_NBJT -#define DEV_NBJT - -extern SPICEdev *get_nbjt_info(void); - - -#endif - diff --git a/src/spicelib/devices/nbjt/nbjtload.c b/src/spicelib/devices/nbjt/nbjtload.c deleted file mode 100644 index b4a4fe99f..000000000 --- a/src/spicelib/devices/nbjt/nbjtload.c +++ /dev/null @@ -1,513 +0,0 @@ -/********** -Copyright 1992 Regents of the University of California. All rights reserved. -Author: 1987 Kartikeya Mayaram, U. C. Berkeley CAD Group -**********/ - -/* - * This is the function called each iteration to evaluate the numerical BJTs - * in the circuit and load them into the matrix as appropriate - */ - -#include "ngspice/ngspice.h" -#include "ngspice/devdefs.h" -#include "ngspice/cktdefs.h" -#include "nbjtdefs.h" -#include "ngspice/trandefs.h" -#include "ngspice/sperror.h" -#include "../../../ciderlib/oned/onedext.h" -#include "ngspice/cidersupt.h" -#include "ngspice/suffix.h" - -/* Forward declarations */ -int NBJTinitSmSig(NBJTinstance *); - -/* External Declarations */ -extern int ONEdcDebug; -extern int ONEtranDebug; -extern int ONEacDebug; - - -int -NBJTload(GENmodel *inModel, CKTcircuit *ckt) -{ - register NBJTmodel *model = (NBJTmodel *) inModel; - register NBJTinstance *inst; - register ONEdevice *pDevice; - double startTime, startTime2, totalTime, totalTime2; - double tol; - double ic=0, ie=0; - double iceq, ieeq; - double ichat = 0.0, iehat = 0.0; - double delVce, delVbe; - double vce, vbe /*, vbc*/; - double dIeDVce=0, dIeDVbe=0; - double dIcDVce=0, dIcDVbe=0; - double xfact; - int icheck; - int icheck1; - int i; - double deltaNorm[7]; - int devConverged = 0; - int numDevNonCon; - int deviceType; - int doInitSolve; - int doVoltPred; - char *initStateName; - - /* loop through all the models */ - for (; model != NULL; model = NBJTnextModel(model)) { - FieldDepMobility = model->NBJTmodels->MODLfieldDepMobility; - Srh = model->NBJTmodels->MODLsrh; - Auger = model->NBJTmodels->MODLauger; - AvalancheGen = model->NBJTmodels->MODLavalancheGen; - MobDeriv = model->NBJTmethods->METHmobDeriv; - MaxIterations = model->NBJTmethods->METHitLim; - ONEdcDebug = model->NBJToutputs->OUTPdcDebug; - ONEtranDebug = model->NBJToutputs->OUTPtranDebug; - ONEacDebug = model->NBJToutputs->OUTPacDebug; - deviceType = model->NBJToptions->OPTNdeviceType; - doVoltPred = model->NBJTmethods->METHvoltPred; - - if (ckt->CKTmode & MODEINITPRED) { - /* compute normalized deltas and predictor coeff */ - if (!(ckt->CKTmode & MODEDCTRANCURVE)) { - model->NBJTpInfo->order = ckt->CKTorder; - model->NBJTpInfo->method = ckt->CKTintegrateMethod; - for (i = 0; i <= ckt->CKTmaxOrder; i++) { - deltaNorm[i] = ckt->CKTdeltaOld[i] / TNorm; - } - computeIntegCoeff(ckt->CKTintegrateMethod, ckt->CKTorder, - model->NBJTpInfo->intCoeff, deltaNorm); - computePredCoeff(ckt->CKTintegrateMethod, ckt->CKTorder, - model->NBJTpInfo->predCoeff, deltaNorm); - } - } else if (ckt->CKTmode & MODEINITTRAN) { - model->NBJTpInfo->order = ckt->CKTorder; - model->NBJTpInfo->method = ckt->CKTintegrateMethod; - for (i = 0; i <= ckt->CKTmaxOrder; i++) { - deltaNorm[i] = ckt->CKTdeltaOld[i] / TNorm; - } - computeIntegCoeff(ckt->CKTintegrateMethod, ckt->CKTorder, - model->NBJTpInfo->intCoeff, deltaNorm); - } - /* loop through all the instances of the model */ - for (inst = NBJTinstances(model); inst != NULL; - inst = NBJTnextInstance(inst)) { - - pDevice = inst->NBJTpDevice; - - totalTime = 0.0; - startTime = SPfrontEnd->IFseconds(); - - /* Get Temp.-Dep. Global Parameters */ - GLOBgetGlobals(&(inst->NBJTglobals)); - - /* - * initialization - */ - - pDevice->devStates = ckt->CKTstates; - icheck = 1; - doInitSolve = FALSE; - initStateName = NULL; - if (ckt->CKTmode & MODEINITSMSIG) { - vbe = *(ckt->CKTstate0 + inst->NBJTvbe); - vce = *(ckt->CKTstate0 + inst->NBJTvce); - delVbe = 0.0; - delVce = 0.0; - NBJTsetBCs(pDevice, vce, vbe); - } else if (ckt->CKTmode & MODEINITTRAN) { - *(ckt->CKTstate0 + inst->NBJTvbe) = - *(ckt->CKTstate1 + inst->NBJTvbe); - *(ckt->CKTstate0 + inst->NBJTvce) = - *(ckt->CKTstate1 + inst->NBJTvce); - vbe = *(ckt->CKTstate1 + inst->NBJTvbe); - vce = *(ckt->CKTstate1 + inst->NBJTvce); - ONEsaveState(pDevice); - delVbe = 0.0; - delVce = 0.0; - } else if ((ckt->CKTmode & MODEINITJCT) && - (ckt->CKTmode & MODETRANOP) && (ckt->CKTmode & MODEUIC)) { - doInitSolve = TRUE; - initStateName = inst->NBJTicFile; - vbe = 0.0; - vce = 0.0; - delVbe = vbe; - delVce = vce; - } else if ((ckt->CKTmode & MODEINITJCT) && (inst->NBJToff == 0)) { - doInitSolve = TRUE; - initStateName = inst->NBJTicFile; - vbe = inst->NBJTtype * 0.6; - vce = inst->NBJTtype * 1.0; - delVbe = vbe; - delVce = vce; - } else if (ckt->CKTmode & MODEINITJCT) { - doInitSolve = TRUE; - vbe = 0.0; - vce = 0.0; - delVbe = vbe; - delVce = vce; - } else if ((ckt->CKTmode & MODEINITFIX) && inst->NBJToff) { - vbe = 0.0; - vce = 0.0; - delVbe = vbe; - delVce = vce; - } else { - if (ckt->CKTmode & MODEINITPRED) { - *(ckt->CKTstate0 + inst->NBJTvbe) = - *(ckt->CKTstate1 + inst->NBJTvbe); - *(ckt->CKTstate0 + inst->NBJTvce) = - *(ckt->CKTstate1 + inst->NBJTvce); - *(ckt->CKTstate0 + inst->NBJTic) = - *(ckt->CKTstate1 + inst->NBJTic); - *(ckt->CKTstate0 + inst->NBJTie) = - *(ckt->CKTstate1 + inst->NBJTie); - *(ckt->CKTstate0 + inst->NBJTdIeDVce) = - *(ckt->CKTstate1 + inst->NBJTdIeDVce); - *(ckt->CKTstate0 + inst->NBJTdIeDVbe) = - *(ckt->CKTstate1 + inst->NBJTdIeDVbe); - *(ckt->CKTstate0 + inst->NBJTdIcDVce) = - *(ckt->CKTstate1 + inst->NBJTdIcDVce); - *(ckt->CKTstate0 + inst->NBJTdIcDVbe) = - *(ckt->CKTstate1 + inst->NBJTdIcDVbe); - if (!(ckt->CKTmode & MODEDCTRANCURVE)) { - /* no linear prediction on device voltages */ - vbe = *(ckt->CKTstate1 + inst->NBJTvbe); - vce = *(ckt->CKTstate1 + inst->NBJTvce); - ONEpredict(pDevice, model->NBJTpInfo); - } else { - if (doVoltPred) { - /* linear prediction */ - xfact=ckt->CKTdelta/ckt->CKTdeltaOld[1]; - vbe = (1+xfact) * (*(ckt->CKTstate1 + inst->NBJTvbe)) - - (xfact) * (*(ckt->CKTstate2 + inst->NBJTvbe)); - vce = (1+xfact) * (*(ckt->CKTstate1 + inst->NBJTvce)) - - (xfact) * (*(ckt->CKTstate2 + inst->NBJTvce)); - } else { - vbe = *(ckt->CKTstate1 + inst->NBJTvbe); - vce = *(ckt->CKTstate1 + inst->NBJTvce); - } - } - } else { - /* - * compute new nonlinear branch voltages - */ - vbe = *(ckt->CKTrhsOld + inst->NBJTbaseNode) - - *(ckt->CKTrhsOld + inst->NBJTemitNode); - vce = *(ckt->CKTrhsOld + inst->NBJTcolNode) - - *(ckt->CKTrhsOld + inst->NBJTemitNode); - } - delVbe = vbe - *(ckt->CKTstate0 + inst->NBJTvbe); - delVce = vce - *(ckt->CKTstate0 + inst->NBJTvce); - ichat = *(ckt->CKTstate0 + inst->NBJTic) - - *(ckt->CKTstate0 + inst->NBJTdIcDVbe) * delVbe - - *(ckt->CKTstate0 + inst->NBJTdIcDVce) * delVce; - iehat = *(ckt->CKTstate0 + inst->NBJTie) - - *(ckt->CKTstate0 + inst->NBJTdIeDVbe) * delVbe - - *(ckt->CKTstate0 + inst->NBJTdIeDVce) * delVce; - -#ifndef NOBYPASS - /* - * bypass if solution has not changed - */ - /* - * the following collections of if's would be just one if the average - * compiler could handle it, but many find the expression too - * complicated, thus the split. - */ - if ((ckt->CKTbypass) && pDevice->converged && - (!(ckt->CKTmode & MODEINITPRED)) && - (fabs(delVbe) < (ckt->CKTreltol * MAX(fabs(vbe), - fabs(*(ckt->CKTstate0 + inst->NBJTvbe))) + - ckt->CKTvoltTol))) - if ((fabs(delVce) < ckt->CKTreltol * MAX(fabs(vce), - fabs(*(ckt->CKTstate0 + inst->NBJTvce))) + - ckt->CKTvoltTol)) - if ((fabs(ichat - *(ckt->CKTstate0 + inst->NBJTic)) < - ckt->CKTreltol * MAX(fabs(ichat), - fabs(*(ckt->CKTstate0 + inst->NBJTic))) + - ckt->CKTabstol)) - if ((fabs(iehat - *(ckt->CKTstate0 + inst->NBJTie)) < - ckt->CKTreltol * MAX(fabs(iehat), - fabs(*(ckt->CKTstate0 + inst->NBJTie))) + - ckt->CKTabstol)) { - /* - * bypassing.... - */ - vbe = *(ckt->CKTstate0 + inst->NBJTvbe); - vce = *(ckt->CKTstate0 + inst->NBJTvce); - ic = *(ckt->CKTstate0 + inst->NBJTic); - ie = *(ckt->CKTstate0 + inst->NBJTie); - dIeDVce = *(ckt->CKTstate0 + inst->NBJTdIeDVce); - dIeDVbe = *(ckt->CKTstate0 + inst->NBJTdIeDVbe); - dIcDVce = *(ckt->CKTstate0 + inst->NBJTdIcDVce); - dIcDVbe = *(ckt->CKTstate0 + inst->NBJTdIcDVbe); - goto load; - } -#endif /* NOBYPASS */ - /* - * limit nonlinear branch voltages - */ - icheck1 = 1; - vbe = inst->NBJTtype * limitVbe(inst->NBJTtype * vbe, - inst->NBJTtype * *(ckt->CKTstate0 + inst->NBJTvbe), &icheck); - /* - vbc = vbe - vce; - vbc = inst->NBJTtype * limitVbe(inst->NBJTtype * vbc, - inst->NBJTtype * (*(ckt->CKTstate0 + inst->NBJTvbe) - - *(ckt->CKTstate0 + inst->NBJTvce)), &icheck1); - vce = vbe - vbc; - */ - vce = inst->NBJTtype * limitVce(inst->NBJTtype * vce, - inst->NBJTtype * *(ckt->CKTstate0 + inst->NBJTvce), &icheck1); - if (icheck1 == 1) - icheck = 1; - delVbe = vbe - *(ckt->CKTstate0 + inst->NBJTvbe); - delVce = vce - *(ckt->CKTstate0 + inst->NBJTvce); - } - if (doInitSolve) { - if (ONEdcDebug) { - printVoltages(stdout, - model->NBJTmodName, inst->NBJTname, - deviceType, 2, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0); - } - startTime2 = SPfrontEnd->IFseconds(); - ONEequilSolve(pDevice); - totalTime2 = SPfrontEnd->IFseconds() - startTime2; - pDevice->pStats->totalTime[STAT_SETUP] += totalTime2; - pDevice->pStats->totalTime[STAT_DC] -= totalTime2; - - ONEbiasSolve(pDevice, MaxIterations, FALSE, NULL); - - *(ckt->CKTstate0 + inst->NBJTvbe) = 0.0; - *(ckt->CKTstate0 + inst->NBJTvce) = 0.0; - - if (initStateName != NULL) { - if (ONEreadState(pDevice, initStateName, 2, &vce, &vbe ) < 0) { - fprintf(stderr, - "NBJTload: trouble reading state-file %s\n", initStateName); - } else { - NBJTsetBCs(pDevice, vce, vbe); - delVce = delVbe = 0.0; - } - } - } - /* - * determine dc current and derivatives using the numerical routines - */ - if (ckt->CKTmode & (MODEDCOP | MODETRANOP | MODEDCTRANCURVE | MODEINITSMSIG)) { - - numDevNonCon = 0; - inst->NBJTc11 = inst->NBJTy11r = inst->NBJTy11i = 0.0; - inst->NBJTc12 = inst->NBJTy12r = inst->NBJTy12i = 0.0; - inst->NBJTc21 = inst->NBJTy21r = inst->NBJTy21i = 0.0; - inst->NBJTc22 = inst->NBJTy22r = inst->NBJTy22i = 0.0; - inst->NBJTsmSigAvail = FALSE; - devNonCon: - NBJTproject(pDevice, delVce, delVbe, vbe); - if (ONEdcDebug) { - printVoltages(stdout, - model->NBJTmodName, inst->NBJTname, - deviceType, 2, vce, delVce, vbe, delVbe, 0.0, 0.0); - } - ONEbiasSolve(pDevice, MaxIterations, FALSE, model->NBJTpInfo); - - devConverged = pDevice->converged; - if (devConverged && finite(pDevice->rhsNorm)) { - /* compute the currents */ - NBJTcurrent(pDevice, FALSE, NULL, - &ie, &ic); - NBJTconductance(pDevice, FALSE, NULL, - &dIeDVce, &dIcDVce, &dIeDVbe, &dIcDVbe); - /* - * Add Gmin terms to everything in case we are operating at - * abnormally low current levels - */ - ie += ckt->CKTgmin * (vce + vbe); - dIeDVce += ckt->CKTgmin; - dIeDVbe += ckt->CKTgmin; - ic += ckt->CKTgmin * (2.0 * vce - vbe); - dIcDVce += 2.0 * ckt->CKTgmin; - dIcDVbe -= ckt->CKTgmin; - - } else { - /* reduce the voltage step until converged */ - /* restore the boundary potential to previous value */ - NBJTsetBCs(pDevice, vce - delVce, vbe - delVbe); - ONEstoreInitialGuess(pDevice); - ONEresetJacobian(pDevice); - delVbe *= 0.5; - delVce *= 0.5; - vbe = delVbe + *(ckt->CKTstate0 + inst->NBJTvbe); - vce = delVce + *(ckt->CKTstate0 + inst->NBJTvce); - numDevNonCon++; - icheck = 1; - if (numDevNonCon > 10) { - printVoltages(stderr, - model->NBJTmodName, inst->NBJTname, - deviceType, 2, vce, delVce, vbe, delVbe, 0.0, 0.0); - fprintf(stderr, - "*** Non-convergence during load ***\n"); - totalTime += SPfrontEnd->IFseconds() - startTime; - pDevice->pStats->totalTime[STAT_DC] += totalTime; - ckt->CKTtroubleElt = (GENinstance *) inst; - return (E_BADMATRIX); - } else { - goto devNonCon; - } - } - - } - if ((ckt->CKTmode & (MODETRAN | MODEAC)) || - ((ckt->CKTmode & MODETRANOP) && (ckt->CKTmode & MODEUIC)) || - (ckt->CKTmode & MODEINITSMSIG)) { - /* - * store small-signal parameters - */ - if ((!(ckt->CKTmode & MODETRANOP)) || - (!(ckt->CKTmode & MODEUIC))) { - if (ckt->CKTmode & MODEINITSMSIG) { - totalTime += SPfrontEnd->IFseconds() - startTime; - pDevice->pStats->totalTime[STAT_DC] += totalTime; - startTime2 = SPfrontEnd->IFseconds(); - NBJTinitSmSig(inst); - pDevice->pStats->totalTime[STAT_AC] += - SPfrontEnd->IFseconds() - startTime2; - continue; - } else { - inst->NBJTsmSigAvail = FALSE; - } - /* - * transient analysis - */ - if (ckt->CKTmode & MODEINITPRED) { - NBJTsetBCs(pDevice, vce, vbe); - ONEstoreInitialGuess(pDevice); - } else { - NBJTupdate(pDevice, delVce, delVbe, vbe, TRUE); - } - if (ONEtranDebug) { - printVoltages(stdout, - model->NBJTmodName, inst->NBJTname, - deviceType, 2, vce, delVce, vbe, delVbe, 0.0, 0.0); - } - ONEbiasSolve(pDevice, 0, TRUE, model->NBJTpInfo); - if (!finite(pDevice->rhsNorm)) { - /* Timestep took us to never-never land. */ - totalTime += SPfrontEnd->IFseconds() - startTime; - pDevice->pStats->totalTime[STAT_TRAN] += totalTime; - ckt->CKTtroubleElt = (GENinstance *) inst; - return (E_BADMATRIX); - } - devConverged = ONEdeviceConverged(pDevice); - pDevice->converged = devConverged; - - /* compute the currents */ - NBJTcurrent(pDevice, TRUE, - model->NBJTpInfo->intCoeff, &ie, &ic); - NBJTconductance(pDevice, TRUE, - model->NBJTpInfo->intCoeff, - &dIeDVce, &dIcDVce, &dIeDVbe, &dIcDVbe); - - /* - * Add Gmin terms to everything in case we are operating at - * abnormally low current levels - */ - ie += ckt->CKTgmin * (vce + vbe); - dIeDVce += ckt->CKTgmin; - dIeDVbe += ckt->CKTgmin; - ic += ckt->CKTgmin * (2.0 * vce - vbe); - dIcDVce += 2.0 * ckt->CKTgmin; - dIcDVbe -= ckt->CKTgmin; - } - } - /* - * check convergence - */ - if ((!(ckt->CKTmode & MODEINITFIX)) || (!(inst->NBJToff))) { - if (icheck == 1 || !devConverged) { - ckt->CKTnoncon++; - ckt->CKTtroubleElt = (GENinstance *) inst; - } else { - tol = ckt->CKTreltol * MAX(fabs(ichat), fabs(ic)) + ckt->CKTabstol; - if (fabs(ichat - ic) > tol) { - ckt->CKTnoncon++; - ckt->CKTtroubleElt = (GENinstance *) inst; - } else { - tol = ckt->CKTreltol * MAX(fabs(iehat), fabs(ie)) + - ckt->CKTabstol; - if (fabs(iehat - ie) > tol) { - ckt->CKTnoncon++; - ckt->CKTtroubleElt = (GENinstance *) inst; - } - } - } - } - *(ckt->CKTstate0 + inst->NBJTvbe) = vbe; - *(ckt->CKTstate0 + inst->NBJTvce) = vce; - *(ckt->CKTstate0 + inst->NBJTic) = ic; - *(ckt->CKTstate0 + inst->NBJTie) = ie; - *(ckt->CKTstate0 + inst->NBJTdIeDVce) = dIeDVce; - *(ckt->CKTstate0 + inst->NBJTdIeDVbe) = dIeDVbe; - *(ckt->CKTstate0 + inst->NBJTdIcDVce) = dIcDVce; - *(ckt->CKTstate0 + inst->NBJTdIcDVbe) = dIcDVbe; - - load: - /* - * load current excitation vector - */ - iceq = ic - dIcDVce * vce - dIcDVbe * vbe; - ieeq = ie - dIeDVce * vce - dIeDVbe * vbe; - *(ckt->CKTrhs + inst->NBJTcolNode) -= iceq; - *(ckt->CKTrhs + inst->NBJTbaseNode) -= ieeq - iceq; - *(ckt->CKTrhs + inst->NBJTemitNode) += ieeq; - - /* - * load y matrix - */ - *(inst->NBJTcolColPtr) += dIcDVce; - *(inst->NBJTcolBasePtr) += dIcDVbe; - *(inst->NBJTcolEmitPtr) -= dIcDVbe + dIcDVce; - *(inst->NBJTbaseColPtr) -= dIcDVce - dIeDVce; - *(inst->NBJTbaseBasePtr) -= dIcDVbe - dIeDVbe; - *(inst->NBJTbaseEmitPtr) += dIcDVbe + dIcDVce - dIeDVbe - dIeDVce; - *(inst->NBJTemitColPtr) -= dIeDVce; - *(inst->NBJTemitBasePtr) -= dIeDVbe; - *(inst->NBJTemitEmitPtr) += dIeDVbe + dIeDVce; - - totalTime += SPfrontEnd->IFseconds() - startTime; - if (ckt->CKTmode & MODETRAN) { - pDevice->pStats->totalTime[STAT_TRAN] += totalTime; - } else { - pDevice->pStats->totalTime[STAT_DC] += totalTime; - } - } - } - return (OK); -} - -int -NBJTinitSmSig(NBJTinstance *inst) -{ - SPcomplex yIeVce, yIeVbe; - SPcomplex yIcVce, yIcVbe; - double omega = NBJTmodPtr(inst)->NBJTmethods->METHomega; - - AcAnalysisMethod = SOR_ONLY; - (void) NBJTadmittance(inst->NBJTpDevice, omega, - &yIeVce, &yIcVce, &yIeVbe, &yIcVbe); - inst->NBJTc11 = yIcVce.imag / omega; - inst->NBJTc12 = yIcVbe.imag / omega; - inst->NBJTc21 = (yIeVce.imag - yIcVce.imag) / omega; - inst->NBJTc22 = (yIeVbe.imag - yIcVbe.imag) / omega; - inst->NBJTy11r = yIcVce.real; - inst->NBJTy11i = yIcVce.imag; - inst->NBJTy12r = yIcVbe.real; - inst->NBJTy12i = yIcVbe.imag; - inst->NBJTy21r = yIeVce.real - yIcVce.real; - inst->NBJTy21i = yIeVce.imag - yIcVce.imag; - inst->NBJTy22r = yIeVbe.real - yIcVbe.real; - inst->NBJTy22i = yIeVbe.imag - yIcVbe.imag; - inst->NBJTsmSigAvail = TRUE; - return (OK); -} diff --git a/src/spicelib/devices/nbjt/nbjtmpar.c b/src/spicelib/devices/nbjt/nbjtmpar.c deleted file mode 100644 index 4eeb090d1..000000000 --- a/src/spicelib/devices/nbjt/nbjtmpar.c +++ /dev/null @@ -1,32 +0,0 @@ -/********** -Copyright 1992 Regents of the University of California. All rights reserved. -Author: 1987 Kartikeya Mayaram, U. C. Berkeley CAD Group -**********/ - -/* - * This routine sets model parameters for NBJTs in the circuit. - */ - -#include "ngspice/ngspice.h" -#include "ngspice/const.h" -#include "ngspice/ifsim.h" -#include "nbjtdefs.h" -#include "ngspice/sperror.h" -#include "ngspice/suffix.h" - -int -NBJTmParam(int param, IFvalue *value, GENmodel *inModel) -{ - NG_IGNORE(value); - NG_IGNORE(inModel); - - switch (param) { - case NBJT_MOD_NBJT: - /* no action - already know it is a numerical bjt, but this */ - /* makes life easier for spice-2 like parsers */ - break; - default: - return (E_BADPARM); - } - return (OK); -} diff --git a/src/spicelib/devices/nbjt/nbjtparm.c b/src/spicelib/devices/nbjt/nbjtparm.c deleted file mode 100644 index 9c6af3df0..000000000 --- a/src/spicelib/devices/nbjt/nbjtparm.c +++ /dev/null @@ -1,48 +0,0 @@ -/********** -Copyright 1992 Regents of the University of California. All rights reserved. -Author: 1987 Kartikeya Mayaram, U. C. Berkeley CAD Group -**********/ - -/* - * This routine sets instance parameters for NBJTs in the circuit. - */ - -#include "ngspice/ngspice.h" -#include "ngspice/const.h" -#include "ngspice/ifsim.h" -#include "nbjtdefs.h" -#include "ngspice/sperror.h" -#include "ngspice/suffix.h" - -int -NBJTparam(int param, IFvalue *value, GENinstance *inInst, IFvalue *select) -{ - register NBJTinstance *inst = (NBJTinstance *) inInst; - - NG_IGNORE(select); - - switch (param) { - case NBJT_AREA: - inst->NBJTarea = value->rValue; - inst->NBJTareaGiven = TRUE; - break; - case NBJT_OFF: - inst->NBJToff = TRUE; - break; - case NBJT_IC_FILE: - inst->NBJTicFile = value->sValue; - inst->NBJTicFileGiven = TRUE; - break; - case NBJT_PRINT: - inst->NBJTprint = value->iValue; - inst->NBJTprintGiven = TRUE; - break; - case NBJT_TEMP: - inst->NBJTtemp = value->rValue + CONSTCtoK; - inst->NBJTtempGiven = TRUE; - break; - default: - return (E_BADPARM); - } - return (OK); -} diff --git a/src/spicelib/devices/nbjt/nbjtpzld.c b/src/spicelib/devices/nbjt/nbjtpzld.c deleted file mode 100644 index b45007dab..000000000 --- a/src/spicelib/devices/nbjt/nbjtpzld.c +++ /dev/null @@ -1,89 +0,0 @@ -/********** -Copyright 1992 Regents of the University of California. All rights reserved. -Author: 1987 Kartikeya Mayaram, U. C. Berkeley CAD Group -**********/ - -/* - * Function to load the COMPLEX circuit matrix using the small signal - * parameters saved during a previous DC operating point analysis. - */ - -#include "ngspice/ngspice.h" -#include "ngspice/cktdefs.h" -#include "nbjtdefs.h" -#include "../../../ciderlib/oned/onedext.h" -#include "ngspice/cidersupt.h" -#include "ngspice/sperror.h" -#include "ngspice/complex.h" -#include "ngspice/suffix.h" - -/* External Declarations */ -extern int ONEacDebug; - -int -NBJTpzLoad(GENmodel *inModel, CKTcircuit *ckt, SPcomplex *s) -{ - register NBJTmodel *model = (NBJTmodel *) inModel; - register NBJTinstance *inst; - SPcomplex yIeVce, yIeVbe; - SPcomplex yIcVce, yIcVbe; - double startTime; - - NG_IGNORE(ckt); - - for (; model != NULL; model = NBJTnextModel(model)) { - FieldDepMobility = model->NBJTmodels->MODLfieldDepMobility; - Srh = model->NBJTmodels->MODLsrh; - Auger = model->NBJTmodels->MODLauger; - AvalancheGen = model->NBJTmodels->MODLavalancheGen; - AcAnalysisMethod = model->NBJTmethods->METHacAnalysisMethod; - MobDeriv = model->NBJTmethods->METHmobDeriv; - ONEacDebug = model->NBJToutputs->OUTPacDebug; - - for (inst = NBJTinstances(model); inst != NULL; - inst = NBJTnextInstance(inst)) { - - startTime = SPfrontEnd->IFseconds(); - /* Get Temp.-Dep. Global Parameters */ - GLOBgetGlobals(&(inst->NBJTglobals)); - - NBJTys(inst->NBJTpDevice, s, - &yIeVce, &yIcVce, &yIeVbe, &yIcVbe); - - if (ONEacDebug) { - fprintf(stdout, "BJT admittances: %s:%s at s = % .5g, % .5g\n", - model->NBJTmodName, inst->NBJTname, s->real, s->imag); - fprintf(stdout, "Ycc: % .5g,% .5g\n", - yIcVce.real, yIcVce.imag); - fprintf(stdout, "Ycb: % .5g,% .5g\n", - yIcVbe.real, yIcVbe.imag); - fprintf(stdout, "Ybc: % .5g,% .5g\n", - yIeVce.real - yIcVce.real, yIeVce.imag - yIcVce.imag); - fprintf(stdout, "Ybb: % .5g,% .5g\n", - yIeVbe.real - yIcVbe.real, yIeVbe.imag - yIcVbe.imag); - } - *(inst->NBJTcolColPtr) += yIcVce.real; - *(inst->NBJTcolColPtr + 1) += yIcVce.imag; - *(inst->NBJTcolBasePtr) += yIcVbe.real; - *(inst->NBJTcolBasePtr + 1) += yIcVbe.imag; - *(inst->NBJTcolEmitPtr) -= yIcVbe.real + yIcVce.real; - *(inst->NBJTcolEmitPtr + 1) -= yIcVbe.imag + yIcVce.imag; - *(inst->NBJTbaseColPtr) -= yIcVce.real - yIeVce.real; - *(inst->NBJTbaseColPtr + 1) -= yIcVce.imag - yIeVce.imag; - *(inst->NBJTbaseBasePtr) -= yIcVbe.real - yIeVbe.real; - *(inst->NBJTbaseBasePtr + 1) -= yIcVbe.imag - yIeVbe.imag; - *(inst->NBJTbaseEmitPtr) += yIcVbe.real + yIcVce.real - yIeVbe.real - yIeVce.real; - *(inst->NBJTbaseEmitPtr + 1) += yIcVbe.imag + yIcVce.imag - yIeVbe.imag - yIeVce.imag; - *(inst->NBJTemitColPtr) -= yIeVce.real; - *(inst->NBJTemitColPtr + 1) -= yIeVce.imag; - *(inst->NBJTemitBasePtr) -= yIeVbe.real; - *(inst->NBJTemitBasePtr + 1) -= yIeVbe.imag; - *(inst->NBJTemitEmitPtr) += yIeVbe.real + yIeVce.real; - *(inst->NBJTemitEmitPtr + 1) += yIeVbe.imag + yIeVce.imag; - - inst->NBJTpDevice->pStats->totalTime[STAT_AC] += - SPfrontEnd->IFseconds() - startTime; - } - } - return (OK); -} diff --git a/src/spicelib/devices/nbjt/nbjtset.c b/src/spicelib/devices/nbjt/nbjtset.c deleted file mode 100644 index 187dab974..000000000 --- a/src/spicelib/devices/nbjt/nbjtset.c +++ /dev/null @@ -1,240 +0,0 @@ -/********** -Copyright 1991 Regents of the University of California. All rights reserved. -Author: 1987 Kartikeya Mayaram, U. C. Berkeley CAD Group -**********/ - -#include "ngspice/ngspice.h" -#include "ngspice/cktdefs.h" -#include "ngspice/smpdefs.h" -#include "nbjtdefs.h" -#include "ngspice/numconst.h" -#include "ngspice/numenum.h" -#include "ngspice/sperror.h" -#include "../../../ciderlib/oned/onedext.h" -#include "ngspice/cidersupt.h" -#include "ngspice/ciderinp.h" -#include "ngspice/suffix.h" -#include "ngspice/meshext.h" - -#define TSCALLOC(var, size, type)\ -if (size && (var =(type *)calloc(1, (unsigned)(size)*sizeof(type))) == NULL) {\ - return(E_NOMEM);\ -} - -int -NBJTsetup(SMPmatrix *matrix, GENmodel *inModel, CKTcircuit *ckt, int *states) -/* - * load the diode structure with those pointers needed later for fast matrix - * loading - */ -{ - register NBJTmodel *model = (NBJTmodel *) inModel; - register NBJTinstance *inst; - METHcard *methods; - MODLcard *models; - OPTNcard *options; - OUTPcard *outputs; - int error; - int xMeshSize; - ONEdevice *pDevice; - ONEcoord *xCoordList = NULL; - ONEdomain *domainList = NULL; - DOPprofile *profileList = NULL; - DOPtable *dopTableList = NULL; - ONEmaterial *pM, *pMaterial = NULL, *materialList = NULL; - double startTime; - - - /* loop through all the diode models */ - for (; model != NULL; model = NBJTnextModel(model)) { - if (!model->NBJTpInfo) { - TSCALLOC(model->NBJTpInfo, 1, ONEtranInfo); - } - methods = model->NBJTmethods; - if (!methods) { - TSCALLOC(methods, 1, METHcard); - model->NBJTmethods = methods; - } - models = model->NBJTmodels; - if (!models) { - TSCALLOC(models, 1, MODLcard); - model->NBJTmodels = models; - } - options = model->NBJToptions; - if (!options) { - TSCALLOC(options, 1, OPTNcard); - model->NBJToptions = options; - } - outputs = model->NBJToutputs; - if (!outputs) { - TSCALLOC(outputs, 1, OUTPcard); - model->NBJToutputs = outputs; - } - if (!methods->METHvoltPredGiven) { - methods->METHvoltPred = FALSE; - } - if (!methods->METHmobDerivGiven) { - methods->METHmobDeriv = TRUE; - } - if (!methods->METHoneCarrierGiven) { - methods->METHoneCarrier = FALSE; - } - if (!methods->METHacAnalysisMethodGiven) { - methods->METHacAnalysisMethod = SOR; - } - if (!methods->METHdabstolGiven) { - methods->METHdabstol = DABSTOL1D; - } - if (!methods->METHdreltolGiven) { - methods->METHdreltol = ckt->CKTreltol; - } - if (!methods->METHitLimGiven) { - methods->METHitLim = 20; - } - if (!methods->METHomegaGiven || methods->METHomega <= 0.0) { - methods->METHomega = 2.0 * M_PI /* radians/sec */ ; - } - if (!options->OPTNdefaGiven || options->OPTNdefa <= 0.0) { - options->OPTNdefa = 1.0e4 /* cm^2 */ ; - } - if (!options->OPTNbaseLengthGiven) { - options->OPTNbaseLength = 0.0; - } - if (!options->OPTNbaseAreaGiven) { - options->OPTNbaseArea = 1.0; - } - if (!options->OPTNdeviceTypeGiven) { - options->OPTNdeviceType = OPTN_BIPOLAR; - } - if (!options->OPTNicFileGiven) { - options->OPTNicFile = NULL; - options->OPTNunique = FALSE; /* Can't form a unique name. */ - } - if (!options->OPTNuniqueGiven) { - options->OPTNunique = FALSE; - } - - /* Set up the rest of the card lists */ - if ((error = MODLsetup(model->NBJTmodels)) != 0) - return (error); - BandGapNarrowing = models->MODLbandGapNarrowing; - ConcDepLifetime = models->MODLconcDepLifetime; - TempDepMobility = models->MODLtempDepMobility; - ConcDepMobility = models->MODLconcDepMobility; - - if ((error = OUTPsetup(model->NBJToutputs)) != 0) - return (error); - if ((error = MATLsetup(model->NBJTmaterials, &materialList)) != 0) - return (error); - if ((error = MOBsetup(model->NBJTmobility, materialList)) != 0) - return (error); - if ((error = MESHsetup('x', model->NBJTxMeshes, &xCoordList, &xMeshSize)) != 0) - return (error); - if ((error = DOMNsetup(model->NBJTdomains, &domainList, - xCoordList, NULL, materialList)) != 0) - return (error); - if ((error = BDRYsetup(model->NBJTboundaries, - xCoordList, NULL, domainList)) != 0) - return (error); - if ((error = CONTsetup(model->NBJTcontacts, NULL)) != 0) - return (error); - if ((error = DOPsetup(model->NBJTdopings, &profileList, - &dopTableList, xCoordList, NULL)) != 0) - return (error); - model->NBJTmatlInfo = materialList; - model->NBJTprofiles = profileList; - model->NBJTdopTables = dopTableList; - - /* loop through all the instances of the model */ - for (inst = NBJTinstances(model); inst != NULL; - inst = NBJTnextInstance(inst)) { - - startTime = SPfrontEnd->IFseconds(); - - if (!inst->NBJTprintGiven) { - inst->NBJTprint = 0; - } else if (inst->NBJTprint <= 0) { - inst->NBJTprint = 1; - } - if (!inst->NBJTicFileGiven) { - if (options->OPTNunique) { - inst->NBJTicFile = tprintf("%s.%s", options->OPTNicFile, inst->NBJTname); - } else if (options->OPTNicFile != NULL) { - inst->NBJTicFile = tprintf("%s", options->OPTNicFile); - } else { - inst->NBJTicFile = NULL; - } - } - inst->NBJTstate = *states; - *states += NBJTnumStates; - - if (!inst->NBJTpDevice) { - /* Assign the mesh info to each instance. */ - TSCALLOC(pDevice, 1, ONEdevice); - TSCALLOC(pDevice->pStats, 1, ONEstats); - pDevice->name = inst->NBJTname; - pDevice->solverType = SLV_NONE; - pDevice->numNodes = xMeshSize; - pDevice->abstol = methods->METHdabstol; - pDevice->reltol = methods->METHdreltol; - pDevice->rhsImag = NULL; - TSCALLOC(pDevice->elemArray, pDevice->numNodes, ONEelem *); - - /* Create a copy of material data that can change with temperature. */ - pDevice->pMaterials = NULL; - for (pM = materialList; pM != NULL; pM = pM->next) { - if (pDevice->pMaterials == NULL) { - TSCALLOC(pMaterial, 1, ONEmaterial); - pDevice->pMaterials = pMaterial; - } else { - TSCALLOC(pMaterial->next, 1, ONEmaterial); - pMaterial = pMaterial->next; - } - /* Copy everything, then fix the incorrect pointer. */ - memcpy(pMaterial, pM, sizeof(ONEmaterial)); - pMaterial->next = NULL; - } - - /* generate the mesh structure for the device */ - ONEbuildMesh(pDevice, xCoordList, domainList, pDevice->pMaterials); - - if (options->OPTNbaseDepthGiven) { - /* The base contact depth has been specified in the input. */ - pDevice->baseIndex = MESHlocate(xCoordList, options->OPTNbaseDepth); - } else { - pDevice->baseIndex = -1; /* Invalid index acts as a flag */ - } - /* store the device info in the instance */ - inst->NBJTpDevice = pDevice; - } - /* Now update the state pointers. */ - ONEgetStatePointers(inst->NBJTpDevice, states); - - /* Wipe out statistics from previous runs (if any). */ - memset(inst->NBJTpDevice->pStats, 0, sizeof(ONEstats)); - - inst->NBJTpDevice->pStats->totalTime[STAT_SETUP] += - SPfrontEnd->IFseconds() - startTime; - - /* macro to make elements with built in test for out of memory */ -#define TSTALLOC(ptr,first,second) \ -do { if ((inst->ptr = SMPmakeElt(matrix, inst->first, inst->second)) == NULL){\ - return(E_NOMEM);\ -} } while(0) - - TSTALLOC(NBJTcolColPtr, NBJTcolNode, NBJTcolNode); - TSTALLOC(NBJTbaseBasePtr, NBJTbaseNode, NBJTbaseNode); - TSTALLOC(NBJTemitEmitPtr, NBJTemitNode, NBJTemitNode); - TSTALLOC(NBJTcolBasePtr, NBJTcolNode, NBJTbaseNode); - TSTALLOC(NBJTcolEmitPtr, NBJTcolNode, NBJTemitNode); - TSTALLOC(NBJTbaseColPtr, NBJTbaseNode, NBJTcolNode); - TSTALLOC(NBJTbaseEmitPtr, NBJTbaseNode, NBJTemitNode); - TSTALLOC(NBJTemitColPtr, NBJTemitNode, NBJTcolNode); - TSTALLOC(NBJTemitBasePtr, NBJTemitNode, NBJTbaseNode); - } - /* Clean up lists */ - killCoordInfo(xCoordList); - killDomainInfo(domainList); - } - return (OK); -} diff --git a/src/spicelib/devices/nbjt/nbjttemp.c b/src/spicelib/devices/nbjt/nbjttemp.c deleted file mode 100644 index ac412b910..000000000 --- a/src/spicelib/devices/nbjt/nbjttemp.c +++ /dev/null @@ -1,155 +0,0 @@ -/********** -Copyright 1992 Regents of the University of California. All rights reserved. -Author: 1987 Kartikeya Mayaram, U. C. Berkeley CAD Group -Author: 1992 David A. Gates, U. C. Berkeley CAD Group -**********/ - -#include "ngspice/ngspice.h" -#include "ngspice/cktdefs.h" -#include "nbjtdefs.h" -#include "ngspice/numenum.h" -#include "ngspice/carddefs.h" -#include "ngspice/sperror.h" -#include "../../../ciderlib/oned/onedext.h" -#include "ngspice/cidersupt.h" -#include "ngspice/suffix.h" - -extern int ONEdcDebug; - -int -NBJTtemp(GENmodel *inModel, CKTcircuit *ckt) -/* - * perform the temperature update to the bjt - */ -{ - register NBJTmodel *model = (NBJTmodel *) inModel; - register NBJTinstance *inst; - METHcard *methods; - MODLcard *models; - OPTNcard *options; - OUTPcard *outputs; - ONEmaterial *pM, *pMaterial, *pNextMaterial; - ONEdevice *pDevice; - double startTime; - int baseIndex, indexBE=0, indexBC=0; - - - /* loop through all the bjt models */ - for (; model != NULL; model = NBJTnextModel(model)) { - methods = model->NBJTmethods; - models = model->NBJTmodels; - options = model->NBJToptions; - outputs = model->NBJToutputs; - - if (!options->OPTNtnomGiven) { - options->OPTNtnom = ckt->CKTnomTemp; - } - for (pM = model->NBJTmatlInfo; pM != NULL; pM = pM->next) { - pM->tnom = options->OPTNtnom; - } - - BandGapNarrowing = models->MODLbandGapNarrowing; - ConcDepLifetime = models->MODLconcDepLifetime; - TempDepMobility = models->MODLtempDepMobility; - ConcDepMobility = models->MODLconcDepMobility; - - for (inst = NBJTinstances(model); inst != NULL; - inst = NBJTnextInstance(inst)) { - - startTime = SPfrontEnd->IFseconds(); - - if (!inst->NBJTtempGiven) { - inst->NBJTtemp = ckt->CKTtemp; - } - if (!inst->NBJTareaGiven || inst->NBJTarea <= 0.0) { - inst->NBJTarea = 1.0; - } - inst->NBJTpDevice->area = inst->NBJTarea * options->OPTNdefa; - - /* Compute and save globals for this instance. */ - GLOBcomputeGlobals(&(inst->NBJTglobals), inst->NBJTtemp); - - /* Calculate new sets of material parameters. */ - pM = model->NBJTmatlInfo; - pMaterial = inst->NBJTpDevice->pMaterials; - for (; pM != NULL; pM = pM->next, pMaterial = pMaterial->next) { - - /* Copy the original values, then fix the incorrect pointer. */ - pNextMaterial = pMaterial->next; - memcpy(pMaterial, pM, sizeof(ONEmaterial)); - pMaterial->next = pNextMaterial; - - /* Now do the temperature dependence. */ - MATLtempDep(pMaterial, pMaterial->tnom); - if (outputs->OUTPmaterial) { - printMaterialInfo(pMaterial); - } - } - - /* Assign doping to the mesh. */ - ONEsetDoping(inst->NBJTpDevice, model->NBJTprofiles, - model->NBJTdopTables); - - /* Assign other physical parameters to the mesh. */ - ONEsetup(inst->NBJTpDevice); - - /* Assign boundary condition parameters. */ - ONEsetBCparams(inst->NBJTpDevice, model->NBJTboundaries, - model->NBJTcontacts); - - /* Normalize everything. */ - ONEnormalize(inst->NBJTpDevice); - - /* Find the device's type. */ - if (inst->NBJTpDevice->elemArray[1]->pNodes[0]->netConc < 0.0) { - inst->NBJTtype = PNP; - } else { - inst->NBJTtype = NPN; - } - - /* Find the location of the base index. */ - pDevice = inst->NBJTpDevice; - baseIndex = pDevice->baseIndex; - if (baseIndex <= 0) { - if (options->OPTNbaseDepthGiven) { - printf("Warning: base contact not on node -- adjusting contact\n"); - } - NBJTjunctions(pDevice, &indexBE, &indexBC); - pDevice->baseIndex = (indexBE + indexBC) / 2; - } - if (inst->NBJTtype == PNP) { - pDevice->elemArray[pDevice->baseIndex]->pNodes[0]->baseType = N_TYPE; - } else if (inst->NBJTtype == NPN) { - pDevice->elemArray[pDevice->baseIndex]->pNodes[0]->baseType = P_TYPE; - } else { - printf("NBJTtemp: unknown BJT type \n"); - } - if (baseIndex <= 0 && !options->OPTNbaseDepthGiven) { - ONEdcDebug = FALSE; - ONEequilSolve(pDevice); - adjustBaseContact(pDevice, indexBE, indexBC); - } - printf("BJT: base contact depth is %g um at node %d\n", - pDevice->elemArray[pDevice->baseIndex]->pNodes[0]->x * 1e4, - pDevice->baseIndex); - - /* Find, normalize and convert to reciprocal-form the base length. */ - pDevice->baseLength = options->OPTNbaseLength; - if (pDevice->baseLength > 0.0) { - pDevice->baseLength /= LNorm; - pDevice->baseLength = 1.0 / pDevice->baseLength; - } else if (pDevice->elemArray[pDevice->baseIndex]->evalNodes[0]) { - pDevice->baseLength = pDevice->elemArray[pDevice->baseIndex]->rDx; - } else { - pDevice->baseLength = pDevice->elemArray[pDevice->baseIndex - 1]->rDx; - } - /* Adjust reciprocal base length to account for base area factor */ - pDevice->baseLength *= options->OPTNbaseArea; - - inst->NBJTpDevice->pStats->totalTime[STAT_SETUP] += - SPfrontEnd->IFseconds() - startTime; - - } - } - return (OK); -} diff --git a/src/spicelib/devices/nbjt/nbjttrun.c b/src/spicelib/devices/nbjt/nbjttrun.c deleted file mode 100644 index d7c620a48..000000000 --- a/src/spicelib/devices/nbjt/nbjttrun.c +++ /dev/null @@ -1,49 +0,0 @@ -/********** -Copyright 1992 Regents of the University of California. All rights reserved. -Author: 1987 Kartikeya Mayaram, U. C. Berkeley CAD Group -**********/ - -/* - * This routine performs truncation error calculations for NBJTs in the - * circuit. - */ - -#include "ngspice/ngspice.h" -#include "ngspice/cktdefs.h" -#include "nbjtdefs.h" -#include "ngspice/sperror.h" -#include "../../../ciderlib/oned/onedext.h" -#include "ngspice/cidersupt.h" -#include "ngspice/suffix.h" - - -int -NBJTtrunc(GENmodel *inModel, CKTcircuit *ckt, double *timeStep) -{ - register NBJTmodel *model = (NBJTmodel *) inModel; - register NBJTinstance *inst; - double deltaNew; - double deltaNorm[7]; - double startTime; - int i; - - for (i = 0; i <= ckt->CKTmaxOrder; i++) { - deltaNorm[i] = ckt->CKTdeltaOld[i] / TNorm; - } - for (; model != NULL; model = NBJTnextModel(model)) { - model->NBJTpInfo->order = ckt->CKTorder; - model->NBJTpInfo->delta = deltaNorm; - model->NBJTpInfo->lteCoeff = computeLTECoeff(model->NBJTpInfo); - for (inst = NBJTinstances(model); inst != NULL; - inst = NBJTnextInstance(inst)) { - - startTime = SPfrontEnd->IFseconds(); - deltaNew = ONEtrunc(inst->NBJTpDevice, model->NBJTpInfo, - ckt->CKTdelta); - *timeStep = MIN(*timeStep, deltaNew); - inst->NBJTpDevice->pStats->totalTime[STAT_TRAN] += - SPfrontEnd->IFseconds() - startTime; - } - } - return (OK); -} diff --git a/src/spicelib/devices/nbjt2/Makefile.am b/src/spicelib/devices/nbjt2/Makefile.am deleted file mode 100644 index fdf5c0e18..000000000 --- a/src/spicelib/devices/nbjt2/Makefile.am +++ /dev/null @@ -1,29 +0,0 @@ -## Process this file with automake to produce Makefile.in - -noinst_LTLIBRARIES = libnbjt2.la - -libnbjt2_la_SOURCES = \ - nbt2.c \ - nbt2acld.c \ - nbt2ask.c \ - nbjt2def.h \ - nbt2del.c \ - nbt2dump.c \ - nbjt2ext.h \ - nbt2init.c \ - nbt2init.h \ - nbjt2itf.h \ - nbt2load.c \ - nbt2mpar.c \ - nbt2parm.c \ - nbt2pzld.c \ - nbt2set.c \ - nbt2temp.c \ - nbt2trun.c - - - -AM_CPPFLAGS = @AM_CPPFLAGS@ -I$(top_srcdir)/src/include -AM_CFLAGS = $(STATIC) - -MAINTAINERCLEANFILES = Makefile.in diff --git a/src/spicelib/devices/nbjt2/nbjt2def.h b/src/spicelib/devices/nbjt2/nbjt2def.h deleted file mode 100644 index d48d080d9..000000000 --- a/src/spicelib/devices/nbjt2/nbjt2def.h +++ /dev/null @@ -1,169 +0,0 @@ -/********** -Copyright 1991 Regents of the University of California. All rights reserved. -Authors: 1987 Karti Mayaram, 1991 David Gates -**********/ - -#ifndef NBJT2_H -#define NBJT2_H - -/* structures to describe 2d Numerical Bipolar Junction Transistors */ - -/* circuit level includes */ -#include "ngspice/ifsim.h" -#include "ngspice/cktdefs.h" -#include "ngspice/gendefs.h" - -/* device level includes */ -#include "ngspice/twomesh.h" -#include "ngspice/twodev.h" -#include "ngspice/profile.h" -#include "ngspice/numglobs.h" -#include "ngspice/carddefs.h" - -/* information needed per instance */ -typedef struct sNBJT2instance { - - struct GENinstance gen; - -#define NBJT2modPtr(inst) ((struct sNBJT2model *)((inst)->gen.GENmodPtr)) -#define NBJT2nextInstance(inst) ((struct sNBJT2instance *)((inst)->gen.GENnextInstance)) -#define NBJT2name gen.GENname -#define NBJT2state gen.GENstate - -#define NBJT2vbe NBJT2state -#define NBJT2vce NBJT2state+1 -#define NBJT2ic NBJT2state+2 -#define NBJT2ie NBJT2state+3 -#define NBJT2dIeDVce NBJT2state+4 -#define NBJT2dIeDVbe NBJT2state+5 -#define NBJT2dIcDVce NBJT2state+6 -#define NBJT2dIcDVbe NBJT2state+7 -#define NBJT2numStates 8 - - const int NBJT2colNode; /* number of collector node of bjt */ - const int NBJT2baseNode; /* number of base node of bjt */ - const int NBJT2emitNode; /* number of emitter node of bjt */ - double NBJT2width; /* width factor for the bjt */ - double NBJT2area; /* area factor for the bjt */ - TWOdevice *NBJT2pDevice; - GLOBvalues NBJT2globals; /* Temp.-Dep. Global Parameters */ - int NBJT2type; - double NBJT2temp; /* Instance Temperature */ - double NBJT2c11; /* small-signal capacitance */ - double NBJT2y11r; /* small-signal admittance, real part */ - double NBJT2y11i; /* small-signal admittance, imag part */ - double NBJT2c12; /* small-signal capacitance */ - double NBJT2y12r; /* small-signal admittance, real part */ - double NBJT2y12i; /* small-signal admittance, imag part */ - double NBJT2c21; /* small-signal capacitance */ - double NBJT2y21r; /* small-signal admittance, real part */ - double NBJT2y21i; /* small-signal admittance, imag part */ - double NBJT2c22; /* small-signal capacitance */ - double NBJT2y22r; /* small-signal admittance, real part */ - double NBJT2y22i; /* small-signal admittance, imag part */ - int NBJT2print; - char *NBJT2icFile; /* Name of initial condition file */ - double *NBJT2colColPtr; /* pointer to sparse matrix at - * (collector,collector) */ - double *NBJT2baseBasePtr; /* pointer to sparse matrix at (base,base) */ - double *NBJT2emitEmitPtr; /* pointer to sparse matrix at - * (emitter,emitter) */ - double *NBJT2colBasePtr; /* pointer to sparse matrix at - * (collector,base) */ - double *NBJT2colEmitPtr; /* pointer to sparse matrix at - * (collector,emitter) */ - double *NBJT2baseColPtr; /* pointer to sparse matrix at - * (base,collector) */ - double *NBJT2baseEmitPtr; /* pointer to sparse matrix at (base,emitter) */ - double *NBJT2emitColPtr; /* pointer to sparse matrix at - * (emitter,collector) */ - double *NBJT2emitBasePtr; /* pointer to sparse matrix at (emitter,base) */ - int NBJT2off; /* 'off' flag for bjt */ - unsigned NBJT2smSigAvail:1; /* flag to indicate small-signal done */ - unsigned NBJT2widthGiven:1; /* flag to indicate width was specified */ - unsigned NBJT2areaGiven:1; /* flag to indicate area was specified */ - unsigned NBJT2icFileGiven:1; /* flag to indicate init. cond. file given */ - unsigned NBJT2printGiven:1; /* flag to indicate print given */ - unsigned NBJT2tempGiven:1; /* flag to indicate temp given */ -} NBJT2instance; - -/* per model data */ -typedef struct sNBJT2model { /* model structure for a bjt */ - - struct GENmodel gen; - -#define NBJT2modType gen.GENmodType -#define NBJT2nextModel(inst) ((struct sNBJT2model *)((inst)->gen.GENnextModel)) -#define NBJT2instances(inst) ((NBJT2instance *)((inst)->gen.GENinstances)) -#define NBJT2modName gen.GENmodName - - MESHcard *NBJT2xMeshes; /* list of xmesh cards */ - MESHcard *NBJT2yMeshes; /* list of ymesh cards */ - DOMNcard *NBJT2domains; /* list of domain cards */ - BDRYcard *NBJT2boundaries; /* list of boundary cards */ - DOPcard *NBJT2dopings; /* list of doping cards */ - ELCTcard *NBJT2electrodes; /* list of electrode cards */ - CONTcard *NBJT2contacts; /* list of contact cards */ - MODLcard *NBJT2models; /* list of model cards */ - MATLcard *NBJT2materials; /* list of material cards */ - MOBcard *NBJT2mobility; /* list of mobility cards */ - METHcard *NBJT2methods; /* list of method cards */ - OPTNcard *NBJT2options; /* list of option cards */ - OUTPcard *NBJT2outputs; /* list of output cards */ - TWOtranInfo *NBJT2pInfo; /* transient analysis information */ - DOPprofile *NBJT2profiles; /* expanded list of doping profiles */ - DOPtable *NBJT2dopTables; /* list of tables used by profiles */ - TWOmaterial *NBJT2matlInfo; /* list of material info structures */ -} NBJT2model; - -/* type of 2D BJT */ -#define NPN 1 -#define PNP -1 - -/* device parameters */ -#define NBJT2_WIDTH 1 -#define NBJT2_AREA 2 -#define NBJT2_OFF 3 -#define NBJT2_IC_FILE 4 -#define NBJT2_PRINT 7 -#define NBJT2_TEMP 8 - -#define NBJT2_G11 9 -#define NBJT2_C11 10 -#define NBJT2_Y11 11 -#define NBJT2_G12 12 -#define NBJT2_C12 13 -#define NBJT2_Y12 14 -#define NBJT2_G13 15 -#define NBJT2_C13 16 -#define NBJT2_Y13 17 -#define NBJT2_G21 18 -#define NBJT2_C21 19 -#define NBJT2_Y21 20 -#define NBJT2_G22 21 -#define NBJT2_C22 22 -#define NBJT2_Y22 23 -#define NBJT2_G23 24 -#define NBJT2_C23 25 -#define NBJT2_Y23 26 -#define NBJT2_G31 27 -#define NBJT2_C31 28 -#define NBJT2_Y31 29 -#define NBJT2_G32 30 -#define NBJT2_C32 31 -#define NBJT2_Y32 32 -#define NBJT2_G33 33 -#define NBJT2_C33 34 -#define NBJT2_Y33 35 - -/* model parameters */ -/* NOTE: all true model parameters have been moved to IFcardInfo structures */ -#define NBJT2_MOD_NBJT 1 - -/* device questions */ - -/* model questions */ - -#include "nbjt2ext.h" - -#endif /* NBJT2_H */ diff --git a/src/spicelib/devices/nbjt2/nbjt2ext.h b/src/spicelib/devices/nbjt2/nbjt2ext.h deleted file mode 100644 index 3e6ec0b96..000000000 --- a/src/spicelib/devices/nbjt2/nbjt2ext.h +++ /dev/null @@ -1,25 +0,0 @@ -/********** -Copyright 1990 Regents of the University of California. All rights reserved. -Author: 1987 Karti Mayaram -**********/ - -#ifndef NBJT2EXT_H -#define NBJT2EXT_H - - -extern int NBJT2acLoad(GENmodel *, CKTcircuit *); -extern int NBJT2ask(CKTcircuit *, GENinstance *, int, IFvalue *, IFvalue *); -extern int NBJT2delete(GENinstance *); -extern int NBJT2getic(GENmodel *, CKTcircuit *); -extern int NBJT2load(GENmodel *, CKTcircuit *); -extern int NBJT2mParam(int, IFvalue *, GENmodel *); -extern int NBJT2param(int, IFvalue *, GENinstance *, IFvalue *); -extern int NBJT2pzLoad(GENmodel *, CKTcircuit *, SPcomplex *); -extern int NBJT2setup(SMPmatrix *, GENmodel *, CKTcircuit *, int *); -extern int NBJT2temp(GENmodel *, CKTcircuit *); -extern int NBJT2trunc(GENmodel *, CKTcircuit *, double *); - -extern void NBJT2dump(GENmodel *, CKTcircuit *); -extern void NBJT2acct(GENmodel *, CKTcircuit *, FILE *); - -#endif /* NBJT2EXT_H */ diff --git a/src/spicelib/devices/nbjt2/nbjt2itf.h b/src/spicelib/devices/nbjt2/nbjt2itf.h deleted file mode 100644 index 73eda8397..000000000 --- a/src/spicelib/devices/nbjt2/nbjt2itf.h +++ /dev/null @@ -1,10 +0,0 @@ -/********** -Copyright 1991 Regents of the University of California. All rights reserved. -**********/ - -#ifndef DEV_NBJT2 -#define DEV_NBJT2 - -extern SPICEdev *get_nbjt2_info(void); - -#endif diff --git a/src/spicelib/devices/nbjt2/nbt2.c b/src/spicelib/devices/nbjt2/nbt2.c deleted file mode 100644 index 3541600c8..000000000 --- a/src/spicelib/devices/nbjt2/nbt2.c +++ /dev/null @@ -1,71 +0,0 @@ -/********** -Copyright 1992 Regents of the University of California. All rights reserved. -Author: 1987 Kartikeya Mayaram, U. C. Berkeley CAD Group -**********/ - -#include "ngspice/ngspice.h" -#include "ngspice/devdefs.h" -#include "nbjt2def.h" -#include "ngspice/suffix.h" - -/* - * This file defines the 2d Numerical BJT data structures that are available - * to the next level(s) up the calling hierarchy - */ - -IFparm NBJT2pTable[] = { /* parameters */ - IP("off", NBJT2_OFF, IF_FLAG, "Device initially off"), - IP("ic.file", NBJT2_IC_FILE, IF_STRING, "Initial condition file"), - IOP("w", NBJT2_WIDTH, IF_REAL, "Width factor"), - IOP("area", NBJT2_AREA, IF_REAL, "Area factor"), - IP("save", NBJT2_PRINT, IF_INTEGER, "Save solutions"), - IPR("print", NBJT2_PRINT, IF_INTEGER, "Print solutions"), - OP("g11", NBJT2_G11, IF_REAL, "Conductance"), - OP("c11", NBJT2_C11, IF_REAL, "Capacitance"), - OP("y11", NBJT2_Y11, IF_COMPLEX, "Admittance"), - OP("g12", NBJT2_G12, IF_REAL, "Conductance"), - OP("c12", NBJT2_C12, IF_REAL, "Capacitance"), - OP("y12", NBJT2_Y12, IF_COMPLEX, "Admittance"), - OPU("g13", NBJT2_G13, IF_REAL, "Conductance"), - OPU("c13", NBJT2_C13, IF_REAL, "Capacitance"), - OPU("y13", NBJT2_Y13, IF_COMPLEX, "Admittance"), - OP("g21", NBJT2_G21, IF_REAL, "Conductance"), - OP("c21", NBJT2_C21, IF_REAL, "Capacitance"), - OP("y21", NBJT2_Y21, IF_COMPLEX, "Admittance"), - OP("g22", NBJT2_G22, IF_REAL, "Conductance"), - OP("c22", NBJT2_C22, IF_REAL, "Capacitance"), - OP("y22", NBJT2_Y22, IF_COMPLEX, "Admittance"), - OPU("g23", NBJT2_G23, IF_REAL, "Conductance"), - OPU("c23", NBJT2_C23, IF_REAL, "Capacitance"), - OPU("y23", NBJT2_Y23, IF_COMPLEX, "Admittance"), - OPU("g31", NBJT2_G31, IF_REAL, "Conductance"), - OPU("c31", NBJT2_C31, IF_REAL, "Capacitance"), - OPU("y31", NBJT2_Y31, IF_COMPLEX, "Admittance"), - OPU("g32", NBJT2_G32, IF_REAL, "Conductance"), - OPU("c32", NBJT2_C32, IF_REAL, "Capacitance"), - OPU("y32", NBJT2_Y32, IF_COMPLEX, "Admittance"), - OPU("g33", NBJT2_G33, IF_REAL, "Conductance"), - OPU("c33", NBJT2_C33, IF_REAL, "Capacitance"), - OPU("y33", NBJT2_Y33, IF_COMPLEX, "Admittance"), - IOP("temp", NBJT2_TEMP, IF_REAL, "Instance Temperature") -}; - -IFparm NBJT2mPTable[] = { /* model parameters */ - /* numerical-device models no longer have parameters */ - /* one is left behind to keep the table from being empty */ - IP("nbjt", NBJT2_MOD_NBJT, IF_FLAG, "Numerical BJT Model") -}; - - -char *NBJT2names[] = { - "Collector", - "Base", - "Emitter", - "Substrate" -}; - -int NBJT2nSize = NUMELEMS(NBJT2names); -int NBJT2pTSize = NUMELEMS(NBJT2pTable); -int NBJT2mPTSize = NUMELEMS(NBJT2mPTable); -int NBJT2iSize = sizeof(NBJT2instance); -int NBJT2mSize = sizeof(NBJT2model); diff --git a/src/spicelib/devices/nbjt2/nbt2acld.c b/src/spicelib/devices/nbjt2/nbt2acld.c deleted file mode 100644 index 811f57a7e..000000000 --- a/src/spicelib/devices/nbjt2/nbt2acld.c +++ /dev/null @@ -1,97 +0,0 @@ -/********** -Copyright 1992 Regents of the University of California. All rights reserved. -Author: 1987 Kartikeya Mayaram, U. C. Berkeley CAD Group -**********/ - -/* - * Function to load the COMPLEX circuit matrix using the small signal - * parameters saved during a previous DC operating point analysis. - */ - -#include "ngspice/ngspice.h" -#include "ngspice/cktdefs.h" -#include "nbjt2def.h" -#include "ngspice/sperror.h" -#include "ngspice/complex.h" -#include "../../../ciderlib/twod/twoddefs.h" -#include "../../../ciderlib/twod/twodext.h" -#include "ngspice/cidersupt.h" -#include "ngspice/suffix.h" - - -int -NBJT2acLoad(GENmodel *inModel, CKTcircuit *ckt) -{ - register NBJT2model *model = (NBJT2model *) inModel; - register NBJT2instance *inst; - SPcomplex yIeVce, yIeVbe; - SPcomplex yIcVce, yIcVbe; - double startTime; - - for (; model != NULL; model = NBJT2nextModel(model)) { - FieldDepMobility = model->NBJT2models->MODLfieldDepMobility; - TransDepMobility = model->NBJT2models->MODLtransDepMobility; - SurfaceMobility = model->NBJT2models->MODLsurfaceMobility; - Srh = model->NBJT2models->MODLsrh; - Auger = model->NBJT2models->MODLauger; - AvalancheGen = model->NBJT2models->MODLavalancheGen; - OneCarrier = model->NBJT2methods->METHoneCarrier; - AcAnalysisMethod = model->NBJT2methods->METHacAnalysisMethod; - MobDeriv = model->NBJT2methods->METHmobDeriv; - TWOacDebug = model->NBJT2outputs->OUTPacDebug; - - for (inst = NBJT2instances(model); inst != NULL; - inst = NBJT2nextInstance(inst)) { - - startTime = SPfrontEnd->IFseconds(); - /* Get Temp.-Dep. Global Parameters */ - GLOBgetGlobals(&(inst->NBJT2globals)); - - model->NBJT2methods->METHacAnalysisMethod = - NBJT2admittance(inst->NBJT2pDevice, ckt->CKTomega, - &yIeVce, &yIcVce, &yIeVbe, &yIcVbe); - - *(inst->NBJT2colColPtr) += yIcVce.real; - *(inst->NBJT2colColPtr + 1) += yIcVce.imag; - *(inst->NBJT2colBasePtr) += yIcVbe.real; - *(inst->NBJT2colBasePtr + 1) += yIcVbe.imag; - *(inst->NBJT2colEmitPtr) -= yIcVbe.real + yIcVce.real; - *(inst->NBJT2colEmitPtr + 1) -= yIcVbe.imag + yIcVce.imag; - *(inst->NBJT2baseColPtr) -= yIcVce.real + yIeVce.real; - *(inst->NBJT2baseColPtr + 1) -= yIcVce.imag + yIeVce.imag; - *(inst->NBJT2baseBasePtr) -= yIcVbe.real + yIeVbe.real; - *(inst->NBJT2baseBasePtr + 1) -= yIcVbe.imag + yIeVbe.imag; - *(inst->NBJT2baseEmitPtr) += yIcVbe.real + yIcVce.real + yIeVbe.real + yIeVce.real; - *(inst->NBJT2baseEmitPtr + 1) += yIcVbe.imag + yIcVce.imag + yIeVbe.imag + yIeVce.imag; - *(inst->NBJT2emitColPtr) += yIeVce.real; - *(inst->NBJT2emitColPtr + 1) += yIeVce.imag; - *(inst->NBJT2emitBasePtr) += yIeVbe.real; - *(inst->NBJT2emitBasePtr + 1) += yIeVbe.imag; - *(inst->NBJT2emitEmitPtr) -= yIeVbe.real + yIeVce.real; - *(inst->NBJT2emitEmitPtr + 1) -= yIeVbe.imag + yIeVce.imag; - if (ckt->CKTomega != 0.0) { - inst->NBJT2c11 = yIcVce.imag / ckt->CKTomega; - inst->NBJT2c12 = yIcVbe.imag / ckt->CKTomega; - inst->NBJT2c21 = (yIeVce.imag - yIcVce.imag) / ckt->CKTomega; - inst->NBJT2c22 = (yIeVbe.imag - yIcVbe.imag) / ckt->CKTomega; - } else { - inst->NBJT2c11 = 0.0; /* XXX What else can be done?! */ - inst->NBJT2c12 = 0.0; /* XXX What else can be done?! */ - inst->NBJT2c21 = 0.0; /* XXX What else can be done?! */ - inst->NBJT2c22 = 0.0; /* XXX What else can be done?! */ - } - inst->NBJT2y11r = yIcVce.real; - inst->NBJT2y11i = yIcVce.imag; - inst->NBJT2y12r = yIcVbe.real; - inst->NBJT2y12i = yIcVbe.imag; - inst->NBJT2y21r = yIeVce.real - yIcVce.real; - inst->NBJT2y21i = yIeVce.imag - yIcVce.imag; - inst->NBJT2y22r = yIeVbe.real - yIcVbe.real; - inst->NBJT2y22i = yIeVbe.imag - yIcVbe.imag; - inst->NBJT2smSigAvail = TRUE; - inst->NBJT2pDevice->pStats->totalTime[STAT_AC] += - SPfrontEnd->IFseconds() - startTime; - } - } - return (OK); -} diff --git a/src/spicelib/devices/nbjt2/nbt2ask.c b/src/spicelib/devices/nbjt2/nbt2ask.c deleted file mode 100644 index 129ec55d2..000000000 --- a/src/spicelib/devices/nbjt2/nbt2ask.c +++ /dev/null @@ -1,214 +0,0 @@ -/********** -Copyright 1990 Regents of the University of California. All rights reserved. -Author: 1987 Thomas L. Quarles -**********/ - -#include "ngspice/ngspice.h" -#include "ngspice/const.h" -#include "ngspice/ifsim.h" -#include "ngspice/cktdefs.h" -#include "ngspice/devdefs.h" -#include "nbjt2def.h" -#include "ngspice/sperror.h" -#include "ngspice/suffix.h" - - -/* Check out this one */ -extern int NBJT2initSmSig(NBJT2instance *); - - -/* ARGSUSED */ -int -NBJT2ask(CKTcircuit *ckt, GENinstance *inInst, int which, IFvalue *value, IFvalue *select) -{ - NBJT2instance *inst = (NBJT2instance *) inInst; - - NG_IGNORE(select); - - switch (which) { - case NBJT2_WIDTH: - value->rValue = inst->NBJT2width; - return (OK); - case NBJT2_AREA: - value->rValue = inst->NBJT2area; - return (OK); - case NBJT2_TEMP: - value->rValue = inst->NBJT2temp - CONSTCtoK; - return (OK); - case NBJT2_G11: - value->rValue = *(ckt->CKTstate0 + inst->NBJT2dIcDVce); - return (OK); - case NBJT2_G12: - value->rValue = *(ckt->CKTstate0 + inst->NBJT2dIcDVbe); - return (OK); - case NBJT2_G13: - value->rValue = -*(ckt->CKTstate0 + inst->NBJT2dIcDVce) - - *(ckt->CKTstate0 + inst->NBJT2dIcDVbe); - return (OK); - case NBJT2_G21: - value->rValue = *(ckt->CKTstate0 + inst->NBJT2dIeDVce) - - *(ckt->CKTstate0 + inst->NBJT2dIcDVce); - return (OK); - case NBJT2_G22: - value->rValue = *(ckt->CKTstate0 + inst->NBJT2dIeDVbe) - - *(ckt->CKTstate0 + inst->NBJT2dIcDVbe); - return (OK); - case NBJT2_G23: - value->rValue = -*(ckt->CKTstate0 + inst->NBJT2dIeDVce) - + *(ckt->CKTstate0 + inst->NBJT2dIcDVce) - -*(ckt->CKTstate0 + inst->NBJT2dIeDVbe) - + *(ckt->CKTstate0 + inst->NBJT2dIcDVbe); - return (OK); - case NBJT2_G31: - value->rValue = -*(ckt->CKTstate0 + inst->NBJT2dIeDVce); - return (OK); - case NBJT2_G32: - value->rValue = -*(ckt->CKTstate0 + inst->NBJT2dIeDVbe); - return (OK); - case NBJT2_G33: - value->rValue = *(ckt->CKTstate0 + inst->NBJT2dIeDVce) - + *(ckt->CKTstate0 + inst->NBJT2dIeDVbe); - return (OK); - case NBJT2_C11: - if (!inst->NBJT2smSigAvail - && ckt->CKTcurrentAnalysis != DOING_TRAN) { - NBJT2initSmSig(inst); - } - value->rValue = inst->NBJT2c11; - return (OK); - case NBJT2_C12: - if (!inst->NBJT2smSigAvail - && ckt->CKTcurrentAnalysis != DOING_TRAN) { - NBJT2initSmSig(inst); - } - value->rValue = inst->NBJT2c12; - return (OK); - case NBJT2_C13: - if (!inst->NBJT2smSigAvail - && ckt->CKTcurrentAnalysis != DOING_TRAN) { - NBJT2initSmSig(inst); - } - value->rValue = -inst->NBJT2c11 - inst->NBJT2c12; - return (OK); - case NBJT2_C21: - if (!inst->NBJT2smSigAvail - && ckt->CKTcurrentAnalysis != DOING_TRAN) { - NBJT2initSmSig(inst); - } - value->rValue = inst->NBJT2c21; - return (OK); - case NBJT2_C22: - if (!inst->NBJT2smSigAvail - && ckt->CKTcurrentAnalysis != DOING_TRAN) { - NBJT2initSmSig(inst); - } - value->rValue = inst->NBJT2c22; - return (OK); - case NBJT2_C23: - if (!inst->NBJT2smSigAvail - && ckt->CKTcurrentAnalysis != DOING_TRAN) { - NBJT2initSmSig(inst); - } - value->rValue = -inst->NBJT2c21 - inst->NBJT2c22; - return (OK); - case NBJT2_C31: - if (!inst->NBJT2smSigAvail - && ckt->CKTcurrentAnalysis != DOING_TRAN) { - NBJT2initSmSig(inst); - } - value->rValue = -inst->NBJT2c11 - inst->NBJT2c21; - return (OK); - case NBJT2_C32: - if (!inst->NBJT2smSigAvail - && ckt->CKTcurrentAnalysis != DOING_TRAN) { - NBJT2initSmSig(inst); - } - value->rValue = -inst->NBJT2c12 - inst->NBJT2c22; - return (OK); - case NBJT2_C33: - if (!inst->NBJT2smSigAvail - && ckt->CKTcurrentAnalysis != DOING_TRAN) { - NBJT2initSmSig(inst); - } - value->rValue = inst->NBJT2c11 + inst->NBJT2c21 - + inst->NBJT2c12 + inst->NBJT2c22; - return (OK); - case NBJT2_Y11: - if (!inst->NBJT2smSigAvail - && ckt->CKTcurrentAnalysis != DOING_TRAN) { - NBJT2initSmSig(inst); - } - value->cValue.real = inst->NBJT2y11r; - value->cValue.imag = inst->NBJT2y11i; - return (OK); - case NBJT2_Y12: - if (!inst->NBJT2smSigAvail - && ckt->CKTcurrentAnalysis != DOING_TRAN) { - NBJT2initSmSig(inst); - } - value->cValue.real = inst->NBJT2y12r; - value->cValue.imag = inst->NBJT2y12i; - return (OK); - case NBJT2_Y13: - if (!inst->NBJT2smSigAvail - && ckt->CKTcurrentAnalysis != DOING_TRAN) { - NBJT2initSmSig(inst); - } - value->cValue.real = -inst->NBJT2y11r - inst->NBJT2y12r; - value->cValue.imag = -inst->NBJT2y11i - inst->NBJT2y12i; - return (OK); - case NBJT2_Y21: - if (!inst->NBJT2smSigAvail - && ckt->CKTcurrentAnalysis != DOING_TRAN) { - NBJT2initSmSig(inst); - } - value->cValue.real = inst->NBJT2y21r; - value->cValue.imag = inst->NBJT2y21i; - return (OK); - case NBJT2_Y22: - if (!inst->NBJT2smSigAvail - && ckt->CKTcurrentAnalysis != DOING_TRAN) { - NBJT2initSmSig(inst); - } - value->cValue.real = inst->NBJT2y22r; - value->cValue.imag = inst->NBJT2y22i; - return (OK); - case NBJT2_Y23: - if (!inst->NBJT2smSigAvail - && ckt->CKTcurrentAnalysis != DOING_TRAN) { - NBJT2initSmSig(inst); - } - value->cValue.real = -inst->NBJT2y21r - inst->NBJT2y22r; - value->cValue.imag = -inst->NBJT2y21i - inst->NBJT2y22i; - return (OK); - case NBJT2_Y31: - if (!inst->NBJT2smSigAvail - && ckt->CKTcurrentAnalysis != DOING_TRAN) { - NBJT2initSmSig(inst); - } - value->cValue.real = -inst->NBJT2y11r - inst->NBJT2y21r; - value->cValue.imag = -inst->NBJT2y11i - inst->NBJT2y21i; - return (OK); - case NBJT2_Y32: - if (!inst->NBJT2smSigAvail - && ckt->CKTcurrentAnalysis != DOING_TRAN) { - NBJT2initSmSig(inst); - } - value->cValue.real = -inst->NBJT2y12r - inst->NBJT2y22r; - value->cValue.imag = -inst->NBJT2y12i - inst->NBJT2y22i; - return (OK); - case NBJT2_Y33: - if (!inst->NBJT2smSigAvail - && ckt->CKTcurrentAnalysis != DOING_TRAN) { - NBJT2initSmSig(inst); - } - value->cValue.real = inst->NBJT2y11r + inst->NBJT2y21r - + inst->NBJT2y12r + inst->NBJT2y22r; - value->cValue.imag = inst->NBJT2y11i + inst->NBJT2y21i - + inst->NBJT2y12i + inst->NBJT2y22i; - return (OK); - default: - return (E_BADPARM); - } - /* NOTREACHED */ -} diff --git a/src/spicelib/devices/nbjt2/nbt2del.c b/src/spicelib/devices/nbjt2/nbt2del.c deleted file mode 100644 index 4288abe46..000000000 --- a/src/spicelib/devices/nbjt2/nbt2del.c +++ /dev/null @@ -1,27 +0,0 @@ -/********** -Copyright 1992 Regents of the University of California. All rights reserved. -Author: 1987 Kartikeya Mayaram, U. C. Berkeley CAD Group -**********/ - -/* - * This routine deletes a NBJT2 instance from the circuit and frees the - * storage it was using. - */ - -#include "ngspice/ngspice.h" -#include "nbjt2def.h" -#include "../../../ciderlib/twod/twoddefs.h" -#include "../../../ciderlib/twod/twodext.h" -#include "ngspice/sperror.h" -#include "ngspice/suffix.h" - - -int -NBJT2delete(GENinstance *gen_inst) -{ - NBJT2instance *inst = (NBJT2instance *) gen_inst; - - TWOdestroy(inst->NBJT2pDevice); - - return OK; -} diff --git a/src/spicelib/devices/nbjt2/nbt2dump.c b/src/spicelib/devices/nbjt2/nbt2dump.c deleted file mode 100644 index 4ce4cc614..000000000 --- a/src/spicelib/devices/nbjt2/nbt2dump.c +++ /dev/null @@ -1,175 +0,0 @@ -/********** -Copyright 1992 Regents of the University of California. All rights reserved. -Author: 1987 Kartikeya Mayaram, U. C. Berkeley CAD Group -Author: 1991 David A. Gates, U. C. Berkeley CAD Group -**********/ - -/* - * This is a simple routine to dump the internal device states. It produces - * states for .OP, .DC, & .TRAN simulations. - */ - -#include "ngspice/ngspice.h" -#include "ngspice/cktdefs.h" -#include "nbjt2def.h" -#include "../../../ciderlib/twod/twoddefs.h" -#include "../../../ciderlib/twod/twodext.h" -#include "ngspice/cidersupt.h" -#include "ngspice/suffix.h" - - -/* Forward Declarations */ -static void NBJT2putHeader(FILE *, CKTcircuit *, NBJT2instance *); - -/* State Counter */ -static int state_numOP = 0; -static int state_numDC = 0; -static int state_numTR = 0; - -void -NBJT2dump(GENmodel *inModel, CKTcircuit *ckt) -{ - register NBJT2model *model = (NBJT2model *) inModel; - register NBJT2instance *inst; - OUTPcard *output; - FILE *fpState; - char fileName[BSIZE_SP]; - char description[BSIZE_SP]; - char *prefix; - int *state_num; - int anyOutput = 0; - BOOLEAN writeAscii = TRUE; - - if (ckt->CKTmode & MODEDCOP) { - prefix = "OP"; - state_num = &state_numOP; - sprintf(description, "..."); - } else if (ckt->CKTmode & MODEDCTRANCURVE) { - prefix = "DC"; - state_num = &state_numDC; - sprintf(description, "sweep = % e", ckt->CKTtime); - } else if (ckt->CKTmode & MODETRAN) { - prefix = "TR"; - state_num = &state_numTR; - sprintf(description, "time = % e", ckt->CKTtime); - } else { - /* Not a recognized CKT mode. */ - return; - } - - for (; model != NULL; model = NBJT2nextModel(model)) { - output = model->NBJT2outputs; - for (inst = NBJT2instances(model); inst != NULL; - inst = NBJT2nextInstance(inst)) { - - if (inst->NBJT2printGiven) { - if ((ckt->CKTmode & MODETRAN) && - ((ckt->CKTstat->STATaccepted - 1) % inst->NBJT2print != 0)) { - continue; - } - anyOutput = 1; - sprintf(fileName, "%s%s.%d.%s", output->OUTProotFile, prefix, - *state_num, inst->NBJT2name); - - writeAscii = compareFiletypeVar("ascii"); - - fpState = fopen(fileName, (writeAscii ? "w" : "wb")); - if (!fpState) { - perror(fileName); - } else { - NBJT2putHeader(fpState, ckt, inst); - TWOprnSolution(fpState, inst->NBJT2pDevice, - model->NBJT2outputs, writeAscii, "nbjt2"); - fclose(fpState); - LOGmakeEntry(fileName, description); - } - } - } - } - if (anyOutput) { - (*state_num)++; - } -} - -#define NBJT2numOutputs 9 - -static -void -NBJT2putHeader(FILE *file, CKTcircuit *ckt, NBJT2instance *inst) -{ - char *reference; - double refVal = 0.0; - int numVars = NBJT2numOutputs; - - if (ckt->CKTmode & MODEDCOP) { - reference = NULL; - } else if (ckt->CKTmode & MODEDCTRANCURVE) { - reference = "sweep"; - refVal = ckt->CKTtime; - numVars++; - } else if (ckt->CKTmode & MODETRAN) { - reference = "time"; - refVal = ckt->CKTtime; - numVars++; - } else { - reference = NULL; - } - fprintf(file, "Title: Device %s external state\n", inst->NBJT2name); - fprintf(file, "Plotname: Device Operating Point\n"); - fprintf(file, "Command: deftype v conductance S\n"); - fprintf(file, "Flags: real\n"); - fprintf(file, "No. Variables: %d\n", numVars); - fprintf(file, "No. Points: 1\n"); - numVars = 0; - fprintf(file, "Variables:\n"); - if (reference) { - fprintf(file, "\t%d %s unknown\n", numVars++, reference); - } - fprintf(file, "\t%d v13 voltage\n", numVars++); - fprintf(file, "\t%d v23 voltage\n", numVars++); - fprintf(file, "\t%d i1 current\n", numVars++); - fprintf(file, "\t%d i2 current\n", numVars++); - fprintf(file, "\t%d i3 current\n", numVars++); - fprintf(file, "\t%d g22 conductance\n", numVars++); - fprintf(file, "\t%d g21 conductance\n", numVars++); - fprintf(file, "\t%d g12 conductance\n", numVars++); - fprintf(file, "\t%d g11 conductance\n", numVars++); - fprintf(file, "Values:\n0"); - if (reference) { - fprintf(file, "\t% e\n", refVal); - } - fprintf(file, "\t% e\n", *(ckt->CKTstate0 + inst->NBJT2vce)); - fprintf(file, "\t% e\n", *(ckt->CKTstate0 + inst->NBJT2vbe)); - fprintf(file, "\t% e\n", *(ckt->CKTstate0 + inst->NBJT2ic)); - fprintf(file, "\t% e\n", - *(ckt->CKTstate0 + inst->NBJT2ie) - - *(ckt->CKTstate0 + inst->NBJT2ic)); - fprintf(file, "\t% e\n", *(ckt->CKTstate0 + inst->NBJT2ie)); - fprintf(file, "\t% e\n", *(ckt->CKTstate0 + inst->NBJT2dIeDVbe) - - *(ckt->CKTstate0 + inst->NBJT2dIcDVbe)); - fprintf(file, "\t% e\n", *(ckt->CKTstate0 + inst->NBJT2dIeDVce) - - *(ckt->CKTstate0 + inst->NBJT2dIcDVce)); - fprintf(file, "\t% e\n", *(ckt->CKTstate0 + inst->NBJT2dIcDVbe)); - fprintf(file, "\t% e\n", *(ckt->CKTstate0 + inst->NBJT2dIcDVce)); -} - -void -NBJT2acct(GENmodel *inModel, CKTcircuit *ckt, FILE *file) -{ - register NBJT2model *model = (NBJT2model *) inModel; - register NBJT2instance *inst; - OUTPcard *output; - - NG_IGNORE(ckt); - - for (; model != NULL; model = NBJT2nextModel(model)) { - output = model->NBJT2outputs; - for (inst = NBJT2instances(model); inst != NULL; - inst = NBJT2nextInstance(inst)) { - - if (output->OUTPstats) { - TWOmemStats(file, inst->NBJT2pDevice); - TWOcpuStats(file, inst->NBJT2pDevice); - } - } - } -} diff --git a/src/spicelib/devices/nbjt2/nbt2init.c b/src/spicelib/devices/nbjt2/nbt2init.c deleted file mode 100644 index d76e326ec..000000000 --- a/src/spicelib/devices/nbjt2/nbt2init.c +++ /dev/null @@ -1,76 +0,0 @@ -#include "ngspice/config.h" - -#include "ngspice/devdefs.h" - -#include "nbjt2itf.h" -#include "nbjt2ext.h" -#include "nbt2init.h" - - -SPICEdev NBJT2info = { - .DEVpublic = { - .name = "NBJT2", - .description = "2D Numerical Bipolar Junction Transistor model", - .terms = &NBJT2nSize, - .numNames = &NBJT2nSize, - .termNames = NBJT2names, - .numInstanceParms = &NBJT2pTSize, - .instanceParms = NBJT2pTable, - .numModelParms = &NBJT2mPTSize, - .modelParms = NBJT2mPTable, - .flags = DEV_DEFAULT, - -#ifdef XSPICE - .cm_func = NULL, - .num_conn = 0, - .conn = NULL, - .num_param = 0, - .param = NULL, - .num_inst_var = 0, - .inst_var = NULL, -#endif - }, - - .DEVparam = NBJT2param, - .DEVmodParam = NBJT2mParam, - .DEVload = NBJT2load, - .DEVsetup = NBJT2setup, - .DEVunsetup = NULL, - .DEVpzSetup = NBJT2setup, - .DEVtemperature = NBJT2temp, - .DEVtrunc = NBJT2trunc, - .DEVfindBranch = NULL, - .DEVacLoad = NBJT2acLoad, - .DEVaccept = NULL, - .DEVdestroy = NULL, - .DEVmodDelete = NULL, - .DEVdelete = NBJT2delete, - .DEVsetic = NULL, - .DEVask = NBJT2ask, - .DEVmodAsk = NULL, - .DEVpzLoad = NBJT2pzLoad, - .DEVconvTest = NULL, - .DEVsenSetup = NULL, - .DEVsenLoad = NULL, - .DEVsenUpdate = NULL, - .DEVsenAcLoad = NULL, - .DEVsenPrint = NULL, - .DEVsenTrunc = NULL, - .DEVdisto = NULL, - .DEVnoise = NULL, - .DEVsoaCheck = NULL, - .DEVinstSize = &NBJT2iSize, - .DEVmodSize = &NBJT2mSize, - -#ifdef CIDER - .DEVdump = NBJT2dump, - .DEVacct = NBJT2acct, -#endif -}; - - -SPICEdev * -get_nbjt2_info(void) -{ - return &NBJT2info; -} diff --git a/src/spicelib/devices/nbjt2/nbt2init.h b/src/spicelib/devices/nbjt2/nbt2init.h deleted file mode 100644 index 52b001494..000000000 --- a/src/spicelib/devices/nbjt2/nbt2init.h +++ /dev/null @@ -1,13 +0,0 @@ -#ifndef _NBJT2INIT_H -#define _NBJT2INIT_H - -extern IFparm NBJT2pTable[ ]; -extern IFparm NBJT2mPTable[ ]; -extern char *NBJT2names[ ]; -extern int NBJT2pTSize; -extern int NBJT2mPTSize; -extern int NBJT2nSize; -extern int NBJT2iSize; -extern int NBJT2mSize; - -#endif diff --git a/src/spicelib/devices/nbjt2/nbt2load.c b/src/spicelib/devices/nbjt2/nbt2load.c deleted file mode 100644 index a8a82d491..000000000 --- a/src/spicelib/devices/nbjt2/nbt2load.c +++ /dev/null @@ -1,502 +0,0 @@ -/********** -Copyright 1992 Regents of the University of California. All rights reserved. -Author: 1987 Kartikeya Mayaram, U. C. Berkeley CAD Group -**********/ - -/* - * This is the function called each iteration to evaluate the 2d numerical - * BJTs in the circuit and load them into the matrix as appropriate - */ - -#include "ngspice/ngspice.h" -#include "ngspice/devdefs.h" -#include "ngspice/cktdefs.h" -#include "nbjt2def.h" -#include "ngspice/trandefs.h" -#include "ngspice/sperror.h" -#include "../../../ciderlib/twod/twoddefs.h" -#include "../../../ciderlib/twod/twodext.h" -#include "ngspice/cidersupt.h" -#include "ngspice/suffix.h" - -/* External Declarations */ - -/* Check out this one */ -extern int NBJT2initSmSig(NBJT2instance *); - - - - -int -NBJT2load(GENmodel *inModel, CKTcircuit *ckt) -{ - register NBJT2model *model = (NBJT2model *) inModel; - register NBJT2instance *inst; - register TWOdevice *pDevice; - double startTime, startTime2, totalTime, totalTime2; - double tol; - double ic = 0.0, ie = 0.0; - double iceq, ieeq; - double ichat = 0.0, iehat = 0.0; - double delVce, delVbe; - double vce, vbe; - double dIeDVce = 0.0, dIeDVbe = 0.0; - double dIcDVce = 0.0, dIcDVbe = 0.0; - double xfact; - int icheck; - int icheck1; - int i; - double deltaNorm[7]; - int devConverged = 0; - int numDevNonCon; - int deviceType; - int doInitSolve; - int doVoltPred; - char *initStateName; - - /* loop through all the models */ - for (; model != NULL; model = NBJT2nextModel(model)) { - FieldDepMobility = model->NBJT2models->MODLfieldDepMobility; - TransDepMobility = model->NBJT2models->MODLtransDepMobility; - SurfaceMobility = model->NBJT2models->MODLsurfaceMobility; - Srh = model->NBJT2models->MODLsrh; - Auger = model->NBJT2models->MODLauger; - AvalancheGen = model->NBJT2models->MODLavalancheGen; - OneCarrier = model->NBJT2methods->METHoneCarrier; - MobDeriv = model->NBJT2methods->METHmobDeriv; - MaxIterations = model->NBJT2methods->METHitLim; - TWOdcDebug = model->NBJT2outputs->OUTPdcDebug; - TWOtranDebug = model->NBJT2outputs->OUTPtranDebug; - TWOacDebug = model->NBJT2outputs->OUTPacDebug; - deviceType = model->NBJT2options->OPTNdeviceType; - doVoltPred = model->NBJT2methods->METHvoltPred; - - if (ckt->CKTmode & MODEINITPRED) { - /* compute normalized deltas and predictor coeff */ - if (!(ckt->CKTmode & MODEDCTRANCURVE)) { - model->NBJT2pInfo->order = ckt->CKTorder; - model->NBJT2pInfo->method = ckt->CKTintegrateMethod; - for (i = 0; i <= ckt->CKTmaxOrder; i++) { - deltaNorm[i] = ckt->CKTdeltaOld[i] / TNorm; - } - computeIntegCoeff(ckt->CKTintegrateMethod, ckt->CKTorder, - model->NBJT2pInfo->intCoeff, deltaNorm); - computePredCoeff(ckt->CKTintegrateMethod, ckt->CKTorder, - model->NBJT2pInfo->predCoeff, deltaNorm); - } - } else if (ckt->CKTmode & MODEINITTRAN) { - model->NBJT2pInfo->order = ckt->CKTorder; - model->NBJT2pInfo->method = ckt->CKTintegrateMethod; - for (i = 0; i <= ckt->CKTmaxOrder; i++) { - deltaNorm[i] = ckt->CKTdeltaOld[i] / TNorm; - } - computeIntegCoeff(ckt->CKTintegrateMethod, ckt->CKTorder, - model->NBJT2pInfo->intCoeff, deltaNorm); - } - /* loop through all the instances of the model */ - for (inst = NBJT2instances(model); inst != NULL; - inst = NBJT2nextInstance(inst)) { - - pDevice = inst->NBJT2pDevice; - - totalTime = 0.0; - startTime = SPfrontEnd->IFseconds(); - - /* Get Temp.-Dep. Global Parameters */ - GLOBgetGlobals(&(inst->NBJT2globals)); - - /* - * initialization - */ - pDevice->devStates = ckt->CKTstates; - icheck = 1; - doInitSolve = FALSE; - initStateName = NULL; - if (ckt->CKTmode & MODEINITSMSIG) { - vbe = *(ckt->CKTstate0 + inst->NBJT2vbe); - vce = *(ckt->CKTstate0 + inst->NBJT2vce); - delVbe = 0.0; - delVce = 0.0; - NBJT2setBCs(pDevice, vce, vbe); - } else if (ckt->CKTmode & MODEINITTRAN) { - *(ckt->CKTstate0 + inst->NBJT2vbe) = - *(ckt->CKTstate1 + inst->NBJT2vbe); - *(ckt->CKTstate0 + inst->NBJT2vce) = - *(ckt->CKTstate1 + inst->NBJT2vce); - vbe = *(ckt->CKTstate1 + inst->NBJT2vbe); - vce = *(ckt->CKTstate1 + inst->NBJT2vce); - TWOsaveState(pDevice); - delVbe = 0.0; - delVce = 0.0; - } else if ((ckt->CKTmode & MODEINITJCT) && - (ckt->CKTmode & MODETRANOP) && (ckt->CKTmode & MODEUIC)) { - doInitSolve = TRUE; - initStateName = inst->NBJT2icFile; - vbe = 0.0; - vce = 0.0; - delVbe = vbe; - delVce = vce; - } else if ((ckt->CKTmode & MODEINITJCT) && (inst->NBJT2off == 0)) { - doInitSolve = TRUE; - initStateName = inst->NBJT2icFile; - if (deviceType == OPTN_JFET) { - vbe = 0.0; - vce = inst->NBJT2type * 0.5; - } else { - vbe = inst->NBJT2type * 0.6; - vce = inst->NBJT2type * 1.0; - } - delVbe = vbe; - delVce = vce; - } else if (ckt->CKTmode & MODEINITJCT) { - doInitSolve = TRUE; - vbe = 0.0; - vce = 0.0; - delVbe = vbe; - delVce = vce; - } else if ((ckt->CKTmode & MODEINITFIX) && inst->NBJT2off) { - vbe = 0.0; - vce = 0.0; - delVbe = vbe; - delVce = vce; - } else { - if (ckt->CKTmode & MODEINITPRED) { - *(ckt->CKTstate0 + inst->NBJT2vbe) = - *(ckt->CKTstate1 + inst->NBJT2vbe); - *(ckt->CKTstate0 + inst->NBJT2vce) = - *(ckt->CKTstate1 + inst->NBJT2vce); - *(ckt->CKTstate0 + inst->NBJT2ic) = - *(ckt->CKTstate1 + inst->NBJT2ic); - *(ckt->CKTstate0 + inst->NBJT2ie) = - *(ckt->CKTstate1 + inst->NBJT2ie); - *(ckt->CKTstate0 + inst->NBJT2dIeDVce) = - *(ckt->CKTstate1 + inst->NBJT2dIeDVce); - *(ckt->CKTstate0 + inst->NBJT2dIeDVbe) = - *(ckt->CKTstate1 + inst->NBJT2dIeDVbe); - *(ckt->CKTstate0 + inst->NBJT2dIcDVce) = - *(ckt->CKTstate1 + inst->NBJT2dIcDVce); - *(ckt->CKTstate0 + inst->NBJT2dIcDVbe) = - *(ckt->CKTstate1 + inst->NBJT2dIcDVbe); - /* compute normalized deltas and predictor coeff */ - if (!(ckt->CKTmode & MODEDCTRANCURVE)) { - /* no linear prediction on device voltages */ - vbe = *(ckt->CKTstate1 + inst->NBJT2vbe); - vce = *(ckt->CKTstate1 + inst->NBJT2vce); - TWOpredict(pDevice, model->NBJT2pInfo); - } else { - if (doVoltPred) { - /* linear prediction */ - xfact=ckt->CKTdelta/ckt->CKTdeltaOld[1]; - vbe = (1+xfact) * (*(ckt->CKTstate1 + inst->NBJT2vbe)) - - (xfact) * (*(ckt->CKTstate2 + inst->NBJT2vbe)); - vce = (1+xfact) * (*(ckt->CKTstate1 + inst->NBJT2vce)) - - (xfact) * (*(ckt->CKTstate2 + inst->NBJT2vce)); - } else { - vbe = *(ckt->CKTstate1 + inst->NBJT2vbe); - vce = *(ckt->CKTstate1 + inst->NBJT2vce); - } - } - } else { - /* - * compute new nonlinear branch voltages - */ - vbe = *(ckt->CKTrhsOld + inst->NBJT2baseNode) - - *(ckt->CKTrhsOld + inst->NBJT2emitNode); - vce = *(ckt->CKTrhsOld + inst->NBJT2colNode) - - *(ckt->CKTrhsOld + inst->NBJT2emitNode); - } - delVbe = vbe - *(ckt->CKTstate0 + inst->NBJT2vbe); - delVce = vce - *(ckt->CKTstate0 + inst->NBJT2vce); - ichat = *(ckt->CKTstate0 + inst->NBJT2ic) + - *(ckt->CKTstate0 + inst->NBJT2dIcDVbe) * delVbe + - *(ckt->CKTstate0 + inst->NBJT2dIcDVce) * delVce; - iehat = *(ckt->CKTstate0 + inst->NBJT2ie) + - *(ckt->CKTstate0 + inst->NBJT2dIeDVbe) * delVbe + - *(ckt->CKTstate0 + inst->NBJT2dIeDVce) * delVce; - - -#ifndef NOBYPASS - /* - * bypass if solution has not changed - */ - /* - * the following collections of if's would be just one if the average - * compiler could handle it, but many find the expression too - * complicated, thus the split. - */ - if ((ckt->CKTbypass) && pDevice->converged && - (!(ckt->CKTmode & MODEINITPRED)) && - (fabs(delVbe) < (ckt->CKTreltol * MAX(fabs(vbe), - fabs(*(ckt->CKTstate0 + inst->NBJT2vbe))) + - ckt->CKTvoltTol))) - if ((fabs(delVce) < ckt->CKTreltol * MAX(fabs(vce), - fabs(*(ckt->CKTstate0 + inst->NBJT2vce))) + - ckt->CKTvoltTol)) - if ((fabs(ichat - *(ckt->CKTstate0 + inst->NBJT2ic)) < - ckt->CKTreltol * MAX(fabs(ichat), - fabs(*(ckt->CKTstate0 + inst->NBJT2ic))) + - ckt->CKTabstol)) - if ((fabs(iehat - *(ckt->CKTstate0 + inst->NBJT2ie)) < - ckt->CKTreltol * MAX(fabs(iehat), - fabs(*(ckt->CKTstate0 + inst->NBJT2ie))) + - ckt->CKTabstol)) { - /* - * bypassing.... - */ - vbe = *(ckt->CKTstate0 + inst->NBJT2vbe); - vce = *(ckt->CKTstate0 + inst->NBJT2vce); - ic = *(ckt->CKTstate0 + inst->NBJT2ic); - ie = *(ckt->CKTstate0 + inst->NBJT2ie); - dIeDVce = *(ckt->CKTstate0 + inst->NBJT2dIeDVce); - dIeDVbe = *(ckt->CKTstate0 + inst->NBJT2dIeDVbe); - dIcDVce = *(ckt->CKTstate0 + inst->NBJT2dIcDVce); - dIcDVbe = *(ckt->CKTstate0 + inst->NBJT2dIcDVbe); - goto load; - } -#endif /* NOBYPASS */ - /* - * limit nonlinear branch voltages - */ - icheck1 = 1; - if (deviceType == OPTN_JFET) { - double vbc, vbc0; - vbe = inst->NBJT2type * limitJunctionVoltage(inst->NBJT2type * vbe, - inst->NBJT2type * *(ckt->CKTstate0 + inst->NBJT2vbe), &icheck); - vbc = vbe - vce; - vbc0 = *(ckt->CKTstate0 + inst->NBJT2vbe) - - *(ckt->CKTstate0 + inst->NBJT2vce); - vbc = inst->NBJT2type * limitJunctionVoltage(inst->NBJT2type * vbc, - inst->NBJT2type * vbc0, &icheck); - if (icheck1 == 1) - icheck = 1; - vce = vbe - vbc; - } else { - vbe = inst->NBJT2type * limitJunctionVoltage(inst->NBJT2type * vbe, - inst->NBJT2type * *(ckt->CKTstate0 + inst->NBJT2vbe), &icheck); - vce = inst->NBJT2type * limitVce(inst->NBJT2type * vce, - inst->NBJT2type * *(ckt->CKTstate0 + inst->NBJT2vce), &icheck1); - if (icheck1 == 1) - icheck = 1; - } - delVbe = vbe - *(ckt->CKTstate0 + inst->NBJT2vbe); - delVce = vce - *(ckt->CKTstate0 + inst->NBJT2vce); - NBJT2setBCs(pDevice, vce - delVce, vbe - delVbe); - } - - if (doInitSolve) { - if (TWOdcDebug) { - printVoltages(stdout, model->NBJT2modName, inst->NBJT2name, - deviceType, 2, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0); - } - startTime2 = SPfrontEnd->IFseconds(); - TWOequilSolve(pDevice); - totalTime2 = SPfrontEnd->IFseconds() - startTime2; - pDevice->pStats->totalTime[STAT_SETUP] += totalTime2; - pDevice->pStats->totalTime[STAT_DC] -= totalTime2; - - TWObiasSolve(pDevice, MaxIterations, FALSE, NULL); - - *(ckt->CKTstate0 + inst->NBJT2vbe) = 0.0; - *(ckt->CKTstate0 + inst->NBJT2vce) = 0.0; - - if (initStateName != NULL) { - if (TWOreadState(pDevice, initStateName, 2, &vce, &vbe, NULL ) < 0) { - fprintf(stderr, - "NBJT2load: trouble reading state-file %s\n", initStateName); - } else { - NBJT2setBCs(pDevice, vce, vbe); - delVce = delVbe = 0.0; - } - } - } - /* - * determine dc current and derivatives using the numerical routines - */ - if (ckt->CKTmode & (MODEDCOP | MODETRANOP | MODEDCTRANCURVE | MODEINITSMSIG)) { - - numDevNonCon = 0; - inst->NBJT2c11 = inst->NBJT2y11r = inst->NBJT2y11i = 0.0; - inst->NBJT2c12 = inst->NBJT2y12r = inst->NBJT2y12i = 0.0; - inst->NBJT2c21 = inst->NBJT2y21r = inst->NBJT2y21i = 0.0; - inst->NBJT2c22 = inst->NBJT2y22r = inst->NBJT2y22i = 0.0; - inst->NBJT2smSigAvail = FALSE; - devNonCon: - NBJT2project(pDevice, delVce, delVbe); - if (TWOdcDebug) { - printVoltages(stdout, model->NBJT2modName, inst->NBJT2name, - deviceType, 2, vce, delVce, vbe, delVbe, 0.0, 0.0); - } - TWObiasSolve(pDevice, MaxIterations, FALSE, model->NBJT2pInfo); - - devConverged = pDevice->converged; - if (devConverged && finite(pDevice->rhsNorm)) { - /* compute the currents */ - NBJT2current(pDevice, FALSE, NULL, &ie, &ic); - NBJT2conductance(pDevice, FALSE, NULL, - &dIeDVce, &dIcDVce, &dIeDVbe, &dIcDVbe); - - } else { - /* reduce the voltage step until converged */ - /* restore boundary nodes to previous potential */ - NBJT2setBCs(pDevice, vce - delVce, vbe - delVbe); - TWOstoreInitialGuess(pDevice); - TWOresetJacobian(pDevice); - delVbe *= 0.5; - delVce *= 0.5; - vbe = delVbe + *(ckt->CKTstate0 + inst->NBJT2vbe); - vce = delVce + *(ckt->CKTstate0 + inst->NBJT2vce); - numDevNonCon++; - icheck = 1; - if (numDevNonCon > 10) { - printVoltages(stderr, model->NBJT2modName, inst->NBJT2name, - deviceType, 2, vce, delVce, vbe, delVbe, 0.0, 0.0); - fprintf(stderr, "*** Non-convergence during load ***\n"); - totalTime += SPfrontEnd->IFseconds() - startTime; - pDevice->pStats->totalTime[STAT_DC] += totalTime; - ckt->CKTtroubleElt = (GENinstance *) inst; - return (E_BADMATRIX); - } else { - goto devNonCon; - } - } - } - if ((ckt->CKTmode & (MODETRAN | MODEAC)) || - ((ckt->CKTmode & MODETRANOP) && (ckt->CKTmode & MODEUIC)) || - (ckt->CKTmode & MODEINITSMSIG)) { - /* - * store small-signal parameters - */ - if ((!(ckt->CKTmode & MODETRANOP)) || - (!(ckt->CKTmode & MODEUIC))) { - if (ckt->CKTmode & MODEINITSMSIG) { - totalTime += SPfrontEnd->IFseconds() - startTime; - pDevice->pStats->totalTime[STAT_DC] += totalTime; - startTime2 = SPfrontEnd->IFseconds(); - NBJT2initSmSig(inst); - pDevice->pStats->totalTime[STAT_AC] += - SPfrontEnd->IFseconds() - startTime2; - continue; - } else { - inst->NBJT2smSigAvail = FALSE; - } - /* - * transient analysis - */ - if (ckt->CKTmode & MODEINITPRED) { - NBJT2setBCs(pDevice, vce, vbe); - TWOstoreInitialGuess(pDevice); - } else { - NBJT2update(pDevice, delVce, delVbe, TRUE); - } - if (TWOtranDebug) { - printVoltages(stdout, model->NBJT2modName, inst->NBJT2name, - deviceType, 2, vce, delVce, vbe, delVbe, 0.0, 0.0); - } - TWObiasSolve(pDevice, 0, TRUE, model->NBJT2pInfo); - if (!finite(pDevice->rhsNorm)) { - totalTime += SPfrontEnd->IFseconds() - startTime; - pDevice->pStats->totalTime[STAT_TRAN] += totalTime; - ckt->CKTtroubleElt = (GENinstance *) inst; - return (E_BADMATRIX); - } - devConverged = TWOdeviceConverged(pDevice); - pDevice->converged = devConverged; - - /* compute the currents */ - NBJT2current(pDevice, TRUE, - model->NBJT2pInfo->intCoeff, &ie, &ic); - NBJT2conductance(pDevice, TRUE, - model->NBJT2pInfo->intCoeff, - &dIeDVce, &dIcDVce, &dIeDVbe, &dIcDVbe); - } - } - /* - * check convergence - */ - if ((!(ckt->CKTmode & MODEINITFIX)) || (!(inst->NBJT2off))) { - if (icheck == 1 || !devConverged) { - ckt->CKTnoncon++; - ckt->CKTtroubleElt = (GENinstance *) inst; - } else { - tol = ckt->CKTreltol * MAX(fabs(ichat), fabs(ic)) + ckt->CKTabstol; - if (fabs(ichat - ic) > tol) { - ckt->CKTnoncon++; - ckt->CKTtroubleElt = (GENinstance *) inst; - } else { - tol = ckt->CKTreltol * MAX(fabs(iehat), fabs(ie)) + - ckt->CKTabstol; - if (fabs(iehat - ie) > tol) { - ckt->CKTnoncon++; - ckt->CKTtroubleElt = (GENinstance *) inst; - } - } - } - } - *(ckt->CKTstate0 + inst->NBJT2vbe) = vbe; - *(ckt->CKTstate0 + inst->NBJT2vce) = vce; - *(ckt->CKTstate0 + inst->NBJT2ic) = ic; - *(ckt->CKTstate0 + inst->NBJT2ie) = ie; - *(ckt->CKTstate0 + inst->NBJT2dIeDVce) = dIeDVce; - *(ckt->CKTstate0 + inst->NBJT2dIeDVbe) = dIeDVbe; - *(ckt->CKTstate0 + inst->NBJT2dIcDVce) = dIcDVce; - *(ckt->CKTstate0 + inst->NBJT2dIcDVbe) = dIcDVbe; - - load: - /* - * load current excitation vector - */ - - iceq = ic - dIcDVce * vce - dIcDVbe * vbe; - ieeq = ie - dIeDVce * vce - dIeDVbe * vbe; - *(ckt->CKTrhs + inst->NBJT2colNode) -= iceq; - *(ckt->CKTrhs + inst->NBJT2baseNode) += ieeq + iceq; - *(ckt->CKTrhs + inst->NBJT2emitNode) -= ieeq; - /* - * load y matrix - */ - *(inst->NBJT2colColPtr) += dIcDVce; - *(inst->NBJT2colBasePtr) += dIcDVbe; - *(inst->NBJT2colEmitPtr) -= dIcDVbe + dIcDVce; - *(inst->NBJT2baseColPtr) -= dIcDVce + dIeDVce; - *(inst->NBJT2baseBasePtr) -= dIcDVbe + dIeDVbe; - *(inst->NBJT2baseEmitPtr) += dIcDVbe + dIcDVce + dIeDVbe + dIeDVce; - *(inst->NBJT2emitColPtr) += dIeDVce; - *(inst->NBJT2emitBasePtr) += dIeDVbe; - *(inst->NBJT2emitEmitPtr) -= dIeDVbe + dIeDVce; - - totalTime += SPfrontEnd->IFseconds() - startTime; - if (ckt->CKTmode & MODETRAN) { - pDevice->pStats->totalTime[STAT_TRAN] += totalTime; - } else { - pDevice->pStats->totalTime[STAT_DC] += totalTime; - } - } - } - return (OK); -} - -int -NBJT2initSmSig(NBJT2instance *inst) -{ - SPcomplex yIeVce, yIeVbe; - SPcomplex yIcVce, yIcVbe; - double omega = NBJT2modPtr(inst)->NBJT2methods->METHomega; - - AcAnalysisMethod = SOR_ONLY; - (void) NBJT2admittance(inst->NBJT2pDevice, omega, - &yIeVce, &yIcVce, &yIeVbe, &yIcVbe); - inst->NBJT2c11 = yIcVce.imag / omega; - inst->NBJT2c12 = yIcVbe.imag / omega; - inst->NBJT2c21 = (yIeVce.imag - yIcVce.imag) / omega; - inst->NBJT2c22 = (yIeVbe.imag - yIcVbe.imag) / omega; - inst->NBJT2y11r = yIcVce.real; - inst->NBJT2y11i = yIcVce.imag; - inst->NBJT2y12r = yIcVbe.real; - inst->NBJT2y12i = yIcVbe.imag; - inst->NBJT2y21r = yIeVce.real - yIcVce.real; - inst->NBJT2y21i = yIeVce.imag - yIcVce.imag; - inst->NBJT2y22r = yIeVbe.real - yIcVbe.real; - inst->NBJT2y22i = yIeVbe.imag - yIcVbe.imag; - inst->NBJT2smSigAvail = TRUE; - return (OK); -} diff --git a/src/spicelib/devices/nbjt2/nbt2mpar.c b/src/spicelib/devices/nbjt2/nbt2mpar.c deleted file mode 100644 index f7b0439ed..000000000 --- a/src/spicelib/devices/nbjt2/nbt2mpar.c +++ /dev/null @@ -1,32 +0,0 @@ -/********** -Copyright 1992 Regents of the University of California. All rights reserved. -Author: 1987 Kartikeya Mayaram, U. C. Berkeley CAD Group -**********/ - -/* - * This routine sets model parameters for NBJT2s in the circuit. - */ - -#include "ngspice/ngspice.h" -#include "ngspice/const.h" -#include "ngspice/ifsim.h" -#include "nbjt2def.h" -#include "ngspice/sperror.h" -#include "ngspice/suffix.h" - -int -NBJT2mParam(int param, IFvalue *value, GENmodel *inModel) -{ - NG_IGNORE(value); - NG_IGNORE(inModel); - - switch (param) { - case NBJT2_MOD_NBJT: - /* no action - already know it is a 2d-numerical bjt, but this */ - /* makes life easier for spice-2 like parsers */ - break; - default: - return (E_BADPARM); - } - return (OK); -} diff --git a/src/spicelib/devices/nbjt2/nbt2parm.c b/src/spicelib/devices/nbjt2/nbt2parm.c deleted file mode 100644 index 489ed57dc..000000000 --- a/src/spicelib/devices/nbjt2/nbt2parm.c +++ /dev/null @@ -1,52 +0,0 @@ -/********** -Copyright 1992 Regents of the University of California. All rights reserved. -Author: 1987 Kartikeya Mayaram, U. C. Berkeley CAD Group -**********/ - -/* - * This routine sets instance parameters for NBJT2s in the circuit. - */ - -#include "ngspice/ngspice.h" -#include "ngspice/const.h" -#include "ngspice/ifsim.h" -#include "nbjt2def.h" -#include "ngspice/sperror.h" -#include "ngspice/suffix.h" - -int -NBJT2param(int param, IFvalue *value, GENinstance *inInst, IFvalue *select) -{ - register NBJT2instance *inst = (NBJT2instance *) inInst; - - NG_IGNORE(select); - - switch (param) { - case NBJT2_WIDTH: - inst->NBJT2width = value->rValue; - inst->NBJT2widthGiven = TRUE; - break; - case NBJT2_AREA: - inst->NBJT2area = value->rValue; - inst->NBJT2areaGiven = TRUE; - break; - case NBJT2_OFF: - inst->NBJT2off = TRUE; - break; - case NBJT2_IC_FILE: - inst->NBJT2icFile = value->sValue; - inst->NBJT2icFileGiven = TRUE; - break; - case NBJT2_PRINT: - inst->NBJT2print = value->iValue; - inst->NBJT2printGiven = TRUE; - break; - case NBJT2_TEMP: - inst->NBJT2temp = value->rValue + CONSTCtoK; - inst->NBJT2tempGiven = TRUE; - break; - default: - return (E_BADPARM); - } - return (OK); -} diff --git a/src/spicelib/devices/nbjt2/nbt2pzld.c b/src/spicelib/devices/nbjt2/nbt2pzld.c deleted file mode 100644 index f508ecbba..000000000 --- a/src/spicelib/devices/nbjt2/nbt2pzld.c +++ /dev/null @@ -1,75 +0,0 @@ -/********** -Copyright 1992 Regents of the University of California. All rights reserved. -Author: 1987 Kartikeya Mayaram, U. C. Berkeley CAD Group -**********/ - -#include "ngspice/ngspice.h" -#include "ngspice/cktdefs.h" -#include "ngspice/complex.h" -#include "nbjt2def.h" -#include "ngspice/sperror.h" -#include "../../../ciderlib/twod/twoddefs.h" -#include "../../../ciderlib/twod/twodext.h" -#include "ngspice/cidersupt.h" -#include "ngspice/suffix.h" - - -int -NBJT2pzLoad(GENmodel *inModel, CKTcircuit *ckt, SPcomplex *s) -{ - register NBJT2model *model = (NBJT2model *) inModel; - register NBJT2instance *inst; - SPcomplex yIeVce, yIeVbe; - SPcomplex yIcVce, yIcVbe; - double startTime; - - NG_IGNORE(ckt); - - for (; model != NULL; model = NBJT2nextModel(model)) { - FieldDepMobility = model->NBJT2models->MODLfieldDepMobility; - TransDepMobility = model->NBJT2models->MODLtransDepMobility; - SurfaceMobility = model->NBJT2models->MODLsurfaceMobility; - Srh = model->NBJT2models->MODLsrh; - Auger = model->NBJT2models->MODLauger; - AvalancheGen = model->NBJT2models->MODLavalancheGen; - OneCarrier = model->NBJT2methods->METHoneCarrier; - AcAnalysisMethod = model->NBJT2methods->METHacAnalysisMethod; - MobDeriv = model->NBJT2methods->METHmobDeriv; - TWOacDebug = model->NBJT2outputs->OUTPacDebug; - - for (inst = NBJT2instances(model); inst != NULL; - inst = NBJT2nextInstance(inst)) { - - startTime = SPfrontEnd->IFseconds(); - - /* Get Temp.-Dep. Global Parameters */ - GLOBgetGlobals(&(inst->NBJT2globals)); - - NBJT2ys(inst->NBJT2pDevice, s, - &yIeVce, &yIcVce, &yIeVbe, &yIcVbe); - - *(inst->NBJT2colColPtr) += yIcVce.real; - *(inst->NBJT2colColPtr + 1) += yIcVce.imag; - *(inst->NBJT2colBasePtr) += yIcVbe.real; - *(inst->NBJT2colBasePtr + 1) += yIcVbe.imag; - *(inst->NBJT2colEmitPtr) -= yIcVbe.real + yIcVce.real; - *(inst->NBJT2colEmitPtr + 1) -= yIcVbe.imag + yIcVce.imag; - *(inst->NBJT2baseColPtr) -= yIcVce.real + yIeVce.real; - *(inst->NBJT2baseColPtr + 1) -= yIcVce.imag + yIeVce.imag; - *(inst->NBJT2baseBasePtr) -= yIcVbe.real + yIeVbe.real; - *(inst->NBJT2baseBasePtr + 1) -= yIcVbe.imag + yIeVbe.imag; - *(inst->NBJT2baseEmitPtr) += yIcVbe.real + yIcVce.real + yIeVbe.real + yIeVce.real; - *(inst->NBJT2baseEmitPtr + 1) += yIcVbe.imag + yIcVce.imag + yIeVbe.imag + yIeVce.imag; - *(inst->NBJT2emitColPtr) += yIeVce.real; - *(inst->NBJT2emitColPtr + 1) += yIeVce.imag; - *(inst->NBJT2emitBasePtr) += yIeVbe.real; - *(inst->NBJT2emitBasePtr + 1) += yIeVbe.imag; - *(inst->NBJT2emitEmitPtr) -= yIeVbe.real + yIeVce.real; - *(inst->NBJT2emitEmitPtr + 1) -= yIeVbe.imag + yIeVce.imag; - - inst->NBJT2pDevice->pStats->totalTime[STAT_AC] += - SPfrontEnd->IFseconds() - startTime; - } - } - return (OK); -} diff --git a/src/spicelib/devices/nbjt2/nbt2set.c b/src/spicelib/devices/nbjt2/nbt2set.c deleted file mode 100644 index a39fe7684..000000000 --- a/src/spicelib/devices/nbjt2/nbt2set.c +++ /dev/null @@ -1,258 +0,0 @@ -/********** -Copyright 1991 Regents of the University of California. All rights reserved. -Author: 1987 Kartikeya Mayaram, U. C. Berkeley CAD Group -**********/ - -#include "ngspice/ngspice.h" -#include "ngspice/cktdefs.h" -#include "ngspice/smpdefs.h" -#include "nbjt2def.h" -#include "ngspice/numconst.h" -#include "ngspice/numenum.h" -#include "ngspice/meshext.h" -#include "ngspice/sperror.h" -#include "../../../ciderlib/twod/twoddefs.h" -#include "../../../ciderlib/twod/twodext.h" -#include "ngspice/ciderinp.h" -#include "ngspice/cidersupt.h" -#include "ngspice/suffix.h" - -#define TSCALLOC(var, size, type)\ -if (size && (var = (type *)calloc(1, (unsigned)(size)*sizeof(type))) == NULL) {\ - return(E_NOMEM);\ -} - -int -NBJT2setup(SMPmatrix *matrix, GENmodel *inModel, CKTcircuit *ckt, int *states) -/* - * load the structure with those pointers needed later for fast matrix - * loading - */ -{ - register NBJT2model *model = (NBJT2model *) inModel; - register NBJT2instance *inst; - METHcard *methods; - MODLcard *models; - OPTNcard *options; - OUTPcard *outputs; - int error, xIndex; - int xMeshSize, yMeshSize; - TWOdevice *pDevice; - TWOcoord *xCoordList = NULL; - TWOcoord *yCoordList = NULL; - TWOdomain *domainList = NULL; - TWOelectrode *electrodeList = NULL; - TWOmaterial *pM, *pMaterial = NULL, *materialList = NULL; - DOPprofile *profileList = NULL; - DOPtable *dopTableList = NULL; - double startTime; - - - - /* loop through all the models */ - for (; model != NULL; model = NBJT2nextModel(model)) { - if (!model->NBJT2pInfo) { - TSCALLOC(model->NBJT2pInfo, 1, TWOtranInfo); - } - methods = model->NBJT2methods; - if (!methods) { - TSCALLOC(methods, 1, METHcard); - model->NBJT2methods = methods; - } - models = model->NBJT2models; - if (!models) { - TSCALLOC(models, 1, MODLcard); - model->NBJT2models = models; - } - options = model->NBJT2options; - if (!options) { - TSCALLOC(options, 1, OPTNcard); - model->NBJT2options = options; - } - outputs = model->NBJT2outputs; - if (!outputs) { - TSCALLOC(outputs, 1, OUTPcard); - model->NBJT2outputs = outputs; - } - if (!methods->METHvoltPredGiven) { - methods->METHvoltPred = FALSE; - } - if (!methods->METHmobDerivGiven) { - methods->METHmobDeriv = TRUE; - } - if (!methods->METHoneCarrierGiven) { - methods->METHoneCarrier = FALSE; - } - if (!methods->METHacAnalysisMethodGiven) { - methods->METHacAnalysisMethod = SOR; - } - if (!methods->METHdabstolGiven) { - methods->METHdabstol = DABSTOL2D; - } - if (!methods->METHdreltolGiven) { - methods->METHdreltol = ckt->CKTreltol; - } - if (!methods->METHitLimGiven) { - methods->METHitLim = 50; - } - if (!methods->METHomegaGiven || methods->METHomega <= 0.0) { - methods->METHomega = 2.0 * M_PI /* radians/sec */ ; - } - if (!options->OPTNdefaGiven || options->OPTNdefa <= 0.0) { - options->OPTNdefa = 1.0e4 /* cm^2 */ ; - } - if (!options->OPTNdeflGiven || options->OPTNdefl <= 0.0) { - options->OPTNdefl = 1.0e2 /* cm */ ; - } - if (!options->OPTNdefwGiven && options->OPTNdefaGiven) { - options->OPTNdefw = options->OPTNdefa / options->OPTNdefl; - } else if (!options->OPTNdefwGiven || options->OPTNdefw <= 0.0) { - options->OPTNdefw = 1.0e2 /* cm */ ; - } - if (!options->OPTNdeviceTypeGiven) { - options->OPTNdeviceType = OPTN_BIPOLAR; - } - if (!options->OPTNicFileGiven) { - options->OPTNicFile = NULL; - options->OPTNunique = FALSE; /* Can't form a unique name. */ - } - if (!options->OPTNuniqueGiven) { - options->OPTNunique = FALSE; - } - OneCarrier = methods->METHoneCarrier; - - /* Set up the rest of the card lists */ - if ((error = MODLsetup(model->NBJT2models)) != 0) - return (error); - BandGapNarrowing = models->MODLbandGapNarrowing; - ConcDepLifetime = models->MODLconcDepLifetime; - TempDepMobility = models->MODLtempDepMobility; - ConcDepMobility = models->MODLconcDepMobility; - SurfaceMobility = models->MODLsurfaceMobility; - - if ((error = OUTPsetup(model->NBJT2outputs)) != 0) - return (error); - if ((error = MATLsetup(model->NBJT2materials, &materialList)) != 0) - return (error); - if ((error = MOBsetup(model->NBJT2mobility, materialList)) != 0) - return (error); - if ((error = MESHsetup('x', model->NBJT2xMeshes, &xCoordList, &xMeshSize)) != 0) - return (error); - if ((error = MESHsetup('y', model->NBJT2yMeshes, &yCoordList, &yMeshSize)) != 0) - return (error); - if ((error = DOMNsetup(model->NBJT2domains, &domainList, - xCoordList, yCoordList, materialList)) != 0) - return (error); - if ((error = BDRYsetup(model->NBJT2boundaries, - xCoordList, yCoordList, domainList)) != 0) - return (error); - if ((error = ELCTsetup(model->NBJT2electrodes, &electrodeList, - xCoordList, yCoordList)) != 0) - return (error); - /* Make sure electrodes are OK. */ - checkElectrodes(electrodeList, 3); /* NBJT2 has 3 electrodes */ - - if ((error = CONTsetup(model->NBJT2contacts, electrodeList)) != 0) - return (error); - if ((error = DOPsetup(model->NBJT2dopings, &profileList, - &dopTableList, xCoordList, yCoordList)) != 0) - return (error); - model->NBJT2matlInfo = materialList; - model->NBJT2profiles = profileList; - model->NBJT2dopTables = dopTableList; - - /* loop through all the instances of the model */ - for (inst = NBJT2instances(model); inst != NULL; - inst = NBJT2nextInstance(inst)) { - - startTime = SPfrontEnd->IFseconds(); - - if (!inst->NBJT2printGiven) { - inst->NBJT2print = 0; - } else if (inst->NBJT2print <= 0) { - inst->NBJT2print = 1; - } - if (!inst->NBJT2icFileGiven) { - if (options->OPTNunique) { - inst->NBJT2icFile = tprintf("%s.%s", options->OPTNicFile, inst->NBJT2name); - } else if (options->OPTNicFile != NULL) { - inst->NBJT2icFile = tprintf("%s", options->OPTNicFile); - } else { - inst->NBJT2icFile = NULL; - } - } - inst->NBJT2state = *states; - *states += NBJT2numStates; - - if (!inst->NBJT2pDevice) { - /* Assign the mesh and profile info to each instance. */ - TSCALLOC(pDevice, 1, TWOdevice); - TSCALLOC(pDevice->pStats, 1, TWOstats); - pDevice->name = inst->NBJT2name; - pDevice->solverType = SLV_NONE; - pDevice->numXNodes = xMeshSize; - pDevice->numYNodes = yMeshSize; - pDevice->xScale = MESHmkArray(xCoordList, xMeshSize); - pDevice->yScale = MESHmkArray(yCoordList, yMeshSize); - pDevice->abstol = methods->METHdabstol; - pDevice->reltol = methods->METHdreltol; - pDevice->rhsImag = NULL; - TSCALLOC(pDevice->elemArray, pDevice->numXNodes, TWOelem **); - for (xIndex = 1; xIndex < pDevice->numXNodes; xIndex++) { - TSCALLOC(pDevice->elemArray[xIndex], pDevice->numYNodes, TWOelem *); - } - - /* Create a copy of material data that can change with temperature. */ - pDevice->pMaterials = NULL; - for (pM = materialList; pM != NULL; pM = pM->next) { - if (pDevice->pMaterials == NULL) { - TSCALLOC(pMaterial, 1, TWOmaterial); - pDevice->pMaterials = pMaterial; - } else { - TSCALLOC(pMaterial->next, 1, TWOmaterial); - pMaterial = pMaterial->next; - } - /* Copy everything, then fix the incorrect pointer. */ - memcpy(pMaterial, pM, sizeof(TWOmaterial)); - pMaterial->next = NULL; - } - - /* Generate the mesh structure for the device. */ - TWObuildMesh(pDevice, domainList, electrodeList, pDevice->pMaterials); - - /* Store the device info in the instance. */ - inst->NBJT2pDevice = pDevice; - } - /* Now update the state pointers. */ - TWOgetStatePointers(inst->NBJT2pDevice, states); - - /* Wipe out statistics from previous runs (if any). */ - memset(inst->NBJT2pDevice->pStats, 0, sizeof(TWOstats)); - - inst->NBJT2pDevice->pStats->totalTime[STAT_SETUP] += - SPfrontEnd->IFseconds() - startTime; - - /* macro to make elements with built in test for out of memory */ -#define TSTALLOC(ptr,first,second) \ -do { if ((inst->ptr = SMPmakeElt(matrix, inst->first, inst->second)) == NULL){\ - return(E_NOMEM);\ -} } while(0) - - TSTALLOC(NBJT2colColPtr, NBJT2colNode, NBJT2colNode); - TSTALLOC(NBJT2colBasePtr, NBJT2colNode, NBJT2baseNode); - TSTALLOC(NBJT2colEmitPtr, NBJT2colNode, NBJT2emitNode); - TSTALLOC(NBJT2baseColPtr, NBJT2baseNode, NBJT2colNode); - TSTALLOC(NBJT2baseBasePtr, NBJT2baseNode, NBJT2baseNode); - TSTALLOC(NBJT2baseEmitPtr, NBJT2baseNode, NBJT2emitNode); - TSTALLOC(NBJT2emitColPtr, NBJT2emitNode, NBJT2colNode); - TSTALLOC(NBJT2emitBasePtr, NBJT2emitNode, NBJT2baseNode); - TSTALLOC(NBJT2emitEmitPtr, NBJT2emitNode, NBJT2emitNode); - } - /* Clean up lists */ - killCoordInfo(xCoordList); - killCoordInfo(yCoordList); - killDomainInfo(domainList); - killElectrodeInfo(electrodeList); - } - return (OK); -} diff --git a/src/spicelib/devices/nbjt2/nbt2temp.c b/src/spicelib/devices/nbjt2/nbt2temp.c deleted file mode 100644 index ad58f276d..000000000 --- a/src/spicelib/devices/nbjt2/nbt2temp.c +++ /dev/null @@ -1,126 +0,0 @@ -/********** -Copyright 1992 Regents of the University of California. All rights reserved. -Author: 1987 Kartikeya Mayaram, U. C. Berkeley CAD Group -Author: 1992 David A. Gates, U. C. Berkeley CAD Group -**********/ - -#include "ngspice/ngspice.h" -#include "ngspice/cktdefs.h" -#include "nbjt2def.h" -#include "ngspice/numenum.h" -#include "ngspice/carddefs.h" -#include "ngspice/sperror.h" -#include "../../../ciderlib/twod/twoddefs.h" -#include "../../../ciderlib/twod/twodext.h" -#include "ngspice/cidersupt.h" -#include "ngspice/suffix.h" - - -int -NBJT2temp(GENmodel *inModel, CKTcircuit *ckt) -/* - * perform the temperature update - */ -{ - register NBJT2model *model = (NBJT2model *) inModel; - register NBJT2instance *inst; - METHcard *methods; - MODLcard *models; - OPTNcard *options; - OUTPcard *outputs; - TWOmaterial *pM, *pMaterial, *pNextMaterial; - double startTime; - - - /* loop through all the models */ - for (; model != NULL; model = NBJT2nextModel(model)) { - methods = model->NBJT2methods; - models = model->NBJT2models; - options = model->NBJT2options; - outputs = model->NBJT2outputs; - - if (!options->OPTNtnomGiven) { - options->OPTNtnom = ckt->CKTnomTemp; - } - for (pM = model->NBJT2matlInfo; pM != NULL; - pM = pM->next) { - pM->tnom = options->OPTNtnom; - } - - BandGapNarrowing = models->MODLbandGapNarrowing; - ConcDepLifetime = models->MODLconcDepLifetime; - TempDepMobility = models->MODLtempDepMobility; - ConcDepMobility = models->MODLconcDepMobility; - SurfaceMobility = models->MODLsurfaceMobility; - MatchingMobility = models->MODLmatchingMobility; - OneCarrier = methods->METHoneCarrier; - - for (inst = NBJT2instances(model); inst != NULL; - inst = NBJT2nextInstance(inst)) { - - startTime = SPfrontEnd->IFseconds(); - - if (!inst->NBJT2tempGiven) { - inst->NBJT2temp = ckt->CKTtemp; - } - if (!inst->NBJT2areaGiven || inst->NBJT2area <= 0.0) { - inst->NBJT2area = 1.0; - } - if (!inst->NBJT2widthGiven || inst->NBJT2width <= 0.0) { - inst->NBJT2width = 1.0; - } - inst->NBJT2pDevice->width = - inst->NBJT2area * inst->NBJT2width * options->OPTNdefw; - - /* Compute and save globals for this instance. */ - GLOBcomputeGlobals(&(inst->NBJT2globals), inst->NBJT2temp); - - /* Calculate new sets of material parameters. */ - pM = model->NBJT2matlInfo; - pMaterial = inst->NBJT2pDevice->pMaterials; - for (; pM != NULL; pM = pM->next, pMaterial = pMaterial->next) { - - /* Copy everything, then fix the incorrect pointer. */ - pNextMaterial = pMaterial->next; - memcpy(pMaterial, pM, sizeof(TWOmaterial)); - pMaterial->next = pNextMaterial; - - /* Now do the temperature dependence. */ - MATLtempDep(pMaterial, pMaterial->tnom); - if (outputs->OUTPmaterial) { - printMaterialInfo(pMaterial); - } - } - - /* Assign doping to the mesh. */ - TWOsetDoping(inst->NBJT2pDevice, model->NBJT2profiles, - model->NBJT2dopTables); - - /* Assign physical parameters to the mesh. */ - TWOsetup(inst->NBJT2pDevice); - - /* Assign boundary condition parameters. */ - TWOsetBCparams(inst->NBJT2pDevice, model->NBJT2boundaries); - - /* Normalize everything. */ - TWOnormalize(inst->NBJT2pDevice); - - /* Find the device's type. */ - if (inst->NBJT2pDevice->pFirstContact->pNodes[0]->netConc < 0.0) { - inst->NBJT2type = PNP; - if (OneCarrier) { - methods->METHoneCarrier = P_TYPE; - } - } else { - inst->NBJT2type = NPN; - if (OneCarrier) { - methods->METHoneCarrier = N_TYPE; - } - } - - inst->NBJT2pDevice->pStats->totalTime[STAT_SETUP] += - SPfrontEnd->IFseconds() - startTime; - } - } - return (OK); -} diff --git a/src/spicelib/devices/nbjt2/nbt2trun.c b/src/spicelib/devices/nbjt2/nbt2trun.c deleted file mode 100644 index 31254aa7b..000000000 --- a/src/spicelib/devices/nbjt2/nbt2trun.c +++ /dev/null @@ -1,52 +0,0 @@ -/********** -Copyright 1992 Regents of the University of California. All rights reserved. -Author: 1987 Kartikeya Mayaram, U. C. Berkeley CAD Group -**********/ - -/* - * This routine performs truncation error calculations for NBJT2s in the - * circuit. - */ - -#include "ngspice/ngspice.h" -#include "ngspice/cktdefs.h" -#include "nbjt2def.h" -#include "ngspice/sperror.h" -#include "../../../ciderlib/twod/twoddefs.h" -#include "../../../ciderlib/twod/twodext.h" -#include "ngspice/cidersupt.h" -#include "ngspice/suffix.h" - - -int -NBJT2trunc(GENmodel *inModel, CKTcircuit *ckt, double *timeStep) -{ - register NBJT2model *model = (NBJT2model *) inModel; - register NBJT2instance *inst; - double deltaNew; - double deltaNorm[7]; - double startTime; - int i; - - for (i = 0; i <= ckt->CKTmaxOrder; i++) { - deltaNorm[i] = ckt->CKTdeltaOld[i] / TNorm; - } - - for (; model != NULL; model = NBJT2nextModel(model)) { - OneCarrier = model->NBJT2methods->METHoneCarrier; - model->NBJT2pInfo->order = ckt->CKTorder; - model->NBJT2pInfo->delta = deltaNorm; - model->NBJT2pInfo->lteCoeff = computeLTECoeff(model->NBJT2pInfo); - for (inst = NBJT2instances(model); inst != NULL; - inst = NBJT2nextInstance(inst)) { - - startTime = SPfrontEnd->IFseconds(); - deltaNew = TWOtrunc(inst->NBJT2pDevice, model->NBJT2pInfo, - ckt->CKTdelta); - *timeStep = MIN(*timeStep, deltaNew); - inst->NBJT2pDevice->pStats->totalTime[STAT_TRAN] += - SPfrontEnd->IFseconds() - startTime; - } - } - return (OK); -} diff --git a/src/spicelib/devices/ndev/Makefile.am b/src/spicelib/devices/ndev/Makefile.am deleted file mode 100644 index da761fd44..000000000 --- a/src/spicelib/devices/ndev/Makefile.am +++ /dev/null @@ -1,30 +0,0 @@ -## Process this file with automake to produce Makefile.in - -noinst_LTLIBRARIES = libndev.la - -libndev_la_SOURCES = \ - ndev.c \ - ndevacld.c \ - ndevaccept.c \ - ndevask.c \ - ndevdefs.h \ - ndevdump.c \ - ndevext.h \ - ndevexch.h \ - ndevinit.c \ - ndevinit.h \ - ndevitf.h \ - ndevload.c \ - ndevmdel.c \ - ndevmpar.c \ - ndevparm.c \ - ndevpzld.c \ - ndevset.c \ - ndevtemp.c \ - ndevtrun.c - - -AM_CPPFLAGS = @AM_CPPFLAGS@ -I$(top_srcdir)/src/include -AM_CFLAGS = $(STATIC) - -MAINTAINERCLEANFILES = Makefile.in diff --git a/src/spicelib/devices/ndev/ndev.c b/src/spicelib/devices/ndev/ndev.c deleted file mode 100644 index 7537768e7..000000000 --- a/src/spicelib/devices/ndev/ndev.c +++ /dev/null @@ -1,39 +0,0 @@ -/********** -Permit to use it as your wish. -Author: 2007 Gong Ding, gdiso@ustc.edu -University of Science and Technology of China -**********/ - -#include "ngspice/ngspice.h" -#include "ngspice/devdefs.h" -#include "ndevdefs.h" -#include "ngspice/suffix.h" - - -IFparm NDEVpTable[] = { /* parameters */ - /* numerical-device models no longer have parameters */ - /* one is left behind to keep the table from being empty */ - IP("ndev", NDEV_MOD_NDEV, IF_FLAG, "Numerical Device"), -}; - -IFparm NDEVmPTable[] = { /* model parameters */ - IP("ndev", NDEV_MOD_NDEV, IF_FLAG, "Numerical Device"), - IP("remote", NDEV_REMOTE, IF_STRING, "Remote computer run device simulation"), - IP("port", NDEV_PORT, IF_INTEGER, "Remote port") -}; - -char *NDEVnames[] = { - "pin1", - "pin2", - "pin3", - "pin4", - "pin5", - "pin6", - "pin7" -}; - -int NDEVnSize = NUMELEMS(NDEVnames); -int NDEVpTSize = NUMELEMS(NDEVpTable); -int NDEVmPTSize = NUMELEMS(NDEVmPTable); -int NDEViSize = sizeof(NDEVinstance); -int NDEVmSize = sizeof(NDEVmodel); diff --git a/src/spicelib/devices/ndev/ndevaccept.c b/src/spicelib/devices/ndev/ndevaccept.c deleted file mode 100644 index 34e5313a0..000000000 --- a/src/spicelib/devices/ndev/ndevaccept.c +++ /dev/null @@ -1,67 +0,0 @@ -/********** -Copyright 1990 Regents of the University of California. All rights reserved. -Author: 1987 Thomas L. Quarles -**********/ - -#include "ngspice/ngspice.h" -#include "ngspice/const.h" -#include "ngspice/ifsim.h" -#include "ngspice/cktdefs.h" -#include "ngspice/devdefs.h" -#include "ndevdefs.h" -#include "ngspice/complex.h" -#include "ngspice/sperror.h" -#include "ngspice/suffix.h" - - - -int NDEVaccept(CKTcircuit *ckt, GENmodel *inModel) -{ - NDEVmodel *model = (NDEVmodel *)inModel; - NDEVinstance *here; - /* loop through all the ndev models */ - for( ; model != NULL; model = NDEVnextModel(model)) - { - /* loop through all the instances of the model */ - for (here = NDEVinstances(model); here != NULL ; here=NDEVnextInstance(here)) - { - /* set ckt accept_flag */ - here->CKTInfo.DEV_CALL = NDEV_ACCEPT; - here->CKTInfo.CKTmode = ckt->CKTmode; - here->CKTInfo.time = ckt->CKTtime; - here->CKTInfo.dt = ckt->CKTdelta; - here->CKTInfo.dt_old = ckt->CKTdeltaOld[0]; - here->CKTInfo.accept_flag = 1; - send(model->sock,&here->CKTInfo,sizeof(sCKTinfo),0); - } - } - return (OK); - /* NOTREACHED */ -} - - -int NDEVconvTest(GENmodel *inModel, CKTcircuit *ckt) -{ - NDEVmodel *model = (NDEVmodel *)inModel; - NDEVinstance *here; - - for( ; model != NULL; model = NDEVnextModel(model)) { - for(here=NDEVinstances(model);here!=NULL;here = NDEVnextInstance(here)){ - - /* - * get convergence information from ndev - */ - here->CKTInfo.DEV_CALL = NDEV_CONVERGINCE_TEST; - send(model->sock,&here->CKTInfo,sizeof(sCKTinfo),0); - recv(model->sock,&here->CKTInfo,sizeof(sCKTinfo),MSG_WAITALL); - - if (here->CKTInfo.convergence_flag<0) { - /* no reason to continue - we've failed... */ - ckt->CKTnoncon++; - ckt->CKTtroubleElt = (GENinstance *) here; - return(OK); - } - } - } - return(OK); -} diff --git a/src/spicelib/devices/ndev/ndevacld.c b/src/spicelib/devices/ndev/ndevacld.c deleted file mode 100644 index b2becfee5..000000000 --- a/src/spicelib/devices/ndev/ndevacld.c +++ /dev/null @@ -1,26 +0,0 @@ -/********** -Copyright 1992 Regents of the University of California. All rights reserved. -Author: 1987 Kartikeya Mayaram, U. C. Berkeley CAD Group -**********/ - -/* - * Function to load the COMPLEX circuit matrix using the small signal - * parameters saved during a previous DC operating point analysis. - */ - -#include "ngspice/ngspice.h" -#include "ngspice/cktdefs.h" -#include "ndevdefs.h" -#include "ngspice/sperror.h" -#include "ngspice/complex.h" -#include "ngspice/suffix.h" - - -int -NDEVacLoad(GENmodel *inModel, CKTcircuit *ckt) -{ - NG_IGNORE(inModel); - NG_IGNORE(ckt); - - return (OK); -} diff --git a/src/spicelib/devices/ndev/ndevask.c b/src/spicelib/devices/ndev/ndevask.c deleted file mode 100644 index a8e0b4a51..000000000 --- a/src/spicelib/devices/ndev/ndevask.c +++ /dev/null @@ -1,34 +0,0 @@ -/********** -Copyright 1990 Regents of the University of California. All rights reserved. -Author: 1987 Thomas L. Quarles -**********/ - -#include "ngspice/ngspice.h" -#include "ngspice/const.h" -#include "ngspice/ifsim.h" -#include "ngspice/cktdefs.h" -#include "ngspice/devdefs.h" -#include "ndevdefs.h" -#include "ngspice/complex.h" -#include "ngspice/sperror.h" -#include "ngspice/suffix.h" - - -/* ARGSUSED */ -int -NDEVask( - CKTcircuit *ckt, - GENinstance *inInst, - int which, - IFvalue *value, - IFvalue *select ) -{ - NG_IGNORE(ckt); - NG_IGNORE(inInst); - NG_IGNORE(which); - NG_IGNORE(value); - NG_IGNORE(select); - - return (OK); - /* NOTREACHED */ -} diff --git a/src/spicelib/devices/ndev/ndevdefs.h b/src/spicelib/devices/ndev/ndevdefs.h deleted file mode 100644 index a7f6ff143..000000000 --- a/src/spicelib/devices/ndev/ndevdefs.h +++ /dev/null @@ -1,78 +0,0 @@ -/********** -Permit to use it as your wish. -Author: 2007 Gong Ding, gdiso@ustc.edu -University of Science and Technology of China -**********/ - -#ifndef NDEV_H -#define NDEV_H - - -/* circuit level includes */ -#include "ngspice/ifsim.h" -#include "ngspice/inpmacs.h" -#include "ngspice/cktdefs.h" -#include "ngspice/gendefs.h" -#include "ndevexch.h" - -/* network function */ -#include -#include /* IPv4 socket address structres. */ -#include /* Access to DNS lookups. */ -#include /* inet_ntop function. */ -#include /* Socket functions. */ - -/* information needed per instance */ -typedef struct sNDEVinstance { - - struct GENinstance gen; - -#define NDEVmodPtr(inst) ((struct sNDEVmodel *)((inst)->gen.GENmodPtr)) -#define NDEVnextInstance(inst) ((struct sNDEVinstance *)((inst)->gen.GENnextInstance)) -#define NDEVstate gen.GENstate - - const int pin[7]; /* max 7 terminals are allowed */ - int term; /* the real number of terminals */ - CKTnode *node[7]; /* the array of CKT node's node pointer */ - char *bname[7]; /* the electrode boundary label for numerical solver */ - sCKTinfo CKTInfo; - sDeviceinfo Ndevinfo; - sPINinfo PINinfos[7]; - double * mat_pointer[49]; /* the pointer array to matrix */ -} NDEVinstance; - - -/* per model data */ - -typedef struct sNDEVmodel { /* model structure for a diode */ - - struct GENmodel gen; - -#define NDEVmodType gen.GENmodType -#define NDEVnextModel(inst) ((struct sNDEVmodel *)((inst)->gen.GENnextModel)) -#define NDEVinstances(inst) ((NDEVinstance *)((inst)->gen.GENinstances)) -#define NDEVmodName gen.GENmodName - - char * NDEVmodelfile; - char * host; - int port; /* Port number. */ - int sock; /* Our connection socket. */ - -} NDEVmodel; - - - - -/* device parameters */ -#define NDEV_MODEL_FILE 1 -/* model parameters */ -enum { - NDEV_MOD_NDEV = 101, - NDEV_REMOTE, - NDEV_PORT, -}; - -#include "ndevext.h" - - -#endif /* NDEV_H */ diff --git a/src/spicelib/devices/ndev/ndevdump.c b/src/spicelib/devices/ndev/ndevdump.c deleted file mode 100644 index 4789bf12f..000000000 --- a/src/spicelib/devices/ndev/ndevdump.c +++ /dev/null @@ -1,46 +0,0 @@ -/********** -Copyright 1992 Regents of the University of California. All rights reserved. -Author: 1987 Kartikeya Mayaram, U. C. Berkeley CAD Group -Author: 1991 David A. Gates, U. C. Berkeley CAD Group -**********/ - -/* - * This is a simple routine to dump the internal device states. It produces - * states for .OP, .DC, & .TRAN simulations. - */ - -#include "ngspice/ngspice.h" -#include "ngspice/cktdefs.h" -#include "ndevdefs.h" -#include "ngspice/suffix.h" - - -/* State Counter - * static int state_numOP = 0; - * static int state_numDC = 0; - * static int state_numTR = 0; - */ - -void -NDEV_dump( - GENmodel *inModel, - CKTcircuit *ckt ) -{ - NG_IGNORE(inModel); - NG_IGNORE(ckt); - -} - - - -void -NDEV_acct( - GENmodel *inModel, - CKTcircuit *ckt, - FILE *file ) -{ - NG_IGNORE(inModel); - NG_IGNORE(ckt); - NG_IGNORE(file); - -} diff --git a/src/spicelib/devices/ndev/ndevexch.h b/src/spicelib/devices/ndev/ndevexch.h deleted file mode 100644 index 9fde3312c..000000000 --- a/src/spicelib/devices/ndev/ndevexch.h +++ /dev/null @@ -1,69 +0,0 @@ -#ifndef _netexchange_h_ -#define _netexchange_h_ - -#define NG_QUERY "This is ngspice. Are you ready?" -#define NDEV_REPLY "Waiting orders!" -#define NG_STOP "Ngspice finished, goodbye." - -#define NDEV_LOAD 0x0001 -#define NDEV_ACCEPT 0x0002 -#define NDEV_CONVERGINCE_TEST 0x0004 -#define NDEV_TRUNCATION_ERROR 0x0008 - -#define NDEV_TEMPERATURE 0x1000 -#define NDEV_AC_LOAD 0x0010 -#define NDEV_PZ_LOAD 0x0020 - -#ifndef ngspice_CKTDEFS_H -/* defines for CKTmode */ -/* this should be the same as cktdefs.h */ -/* old 'mode' parameters */ -#define MODE 0x3 -#define MODETRAN 0x1 -#define MODEAC 0x2 - -/* old 'modedc' parameters */ -#define MODEDC 0x70 -#define MODEDCOP 0x10 -#define MODETRANOP 0x20 -#define MODEDCTRANCURVE 0x40 - -/* old 'initf' parameters */ -#define INITF 0x3f00 -#define MODEINITFLOAT 0x100 -#define MODEINITJCT 0x200 -#define MODEINITFIX 0x400 -#define MODEINITSMSIG 0x800 -#define MODEINITTRAN 0x1000 -#define MODEINITPRED 0x2000 - -/* old 'nosolv' paramater */ -#define MODEUIC 0x10000l -#endif - -typedef struct { -char NDEVname[32]; -int term; -}sDeviceinfo; - - -typedef struct { -int pin; -char name[32]; -double V,I; -double V_old; -double dI_dV[7]; -} sPINinfo; - -typedef struct { -long DEV_CALL; -long CKTmode; -double time; -double dt; -double dt_old; -double omega; -int accept_flag; -int convergence_flag; -}sCKTinfo; - -#endif diff --git a/src/spicelib/devices/ndev/ndevext.h b/src/spicelib/devices/ndev/ndevext.h deleted file mode 100644 index 66e6bc8a5..000000000 --- a/src/spicelib/devices/ndev/ndevext.h +++ /dev/null @@ -1,27 +0,0 @@ -/********** -Copyright 1990 Regents of the University of California. All rights reserved. -Author: 1987 Karti Mayaram -**********/ - -#ifndef NDEVEXT_H -#define NDEVEXT_H - - -extern int NDEVacLoad(GENmodel *, CKTcircuit *); -extern int NDEVask(CKTcircuit *, GENinstance *, int, IFvalue *, IFvalue *); -extern int NDEVgetic(GENmodel *, CKTcircuit *); -extern int NDEVload(GENmodel *, CKTcircuit *); -extern int NDEVaccept(CKTcircuit *, GENmodel *); -extern int NDEVconvTest(GENmodel *, CKTcircuit *); -extern int NDEVmDelete(GENmodel *); -extern int NDEVmParam(int, IFvalue *, GENmodel *); -extern int NDEVparam(int, IFvalue *, GENinstance *, IFvalue *); -extern int NDEVpzLoad(GENmodel *, CKTcircuit *, SPcomplex *); -extern int NDEVsetup(SMPmatrix *, GENmodel *, CKTcircuit *, int *); -extern int NDEVtemp(GENmodel *, CKTcircuit *); -extern int NDEVtrunc(GENmodel *, CKTcircuit *, double *); - -extern void NDEV_dump(GENmodel *, CKTcircuit *); -extern void NDEV_acct(GENmodel *, CKTcircuit *, FILE *); - -#endif /* NDEVEXT_H */ diff --git a/src/spicelib/devices/ndev/ndevinit.c b/src/spicelib/devices/ndev/ndevinit.c deleted file mode 100644 index ef1b43e78..000000000 --- a/src/spicelib/devices/ndev/ndevinit.c +++ /dev/null @@ -1,76 +0,0 @@ -#include "ngspice/config.h" - -#include "ngspice/devdefs.h" - -#include "ndevitf.h" -#include "ndevext.h" -#include "ndevinit.h" - - -SPICEdev NDEVinfo = { - .DEVpublic = { - .name = "NDEV", - .description = "Numerical Device", - .terms = &NDEVnSize, - .numNames = &NDEVnSize, - .termNames = NDEVnames, - .numInstanceParms = &NDEVpTSize, - .instanceParms = NDEVpTable, - .numModelParms = &NDEVmPTSize, - .modelParms = NDEVmPTable, - .flags = DEV_DEFAULT, - -#ifdef XSPICE - .cm_func = NULL, - .num_conn = 0, - .conn = NULL, - .num_param = 0, - .param = NULL, - .num_inst_var = 0, - .inst_var = NULL, -#endif - }, - - .DEVparam = NDEVparam, - .DEVmodParam = NDEVmParam, - .DEVload = NDEVload, - .DEVsetup = NDEVsetup, - .DEVunsetup = NULL, - .DEVpzSetup = NDEVsetup, - .DEVtemperature = NDEVtemp, - .DEVtrunc = NDEVtrunc, - .DEVfindBranch = NULL, - .DEVacLoad = NDEVacLoad, - .DEVaccept = NDEVaccept, - .DEVdestroy = NULL, - .DEVmodDelete = NDEVmDelete, - .DEVdelete = NULL, - .DEVsetic = NDEVgetic, - .DEVask = NDEVask, - .DEVmodAsk = NULL, - .DEVpzLoad = NDEVpzLoad, - .DEVconvTest = NDEVconvTest, - .DEVsenSetup = NULL, - .DEVsenLoad = NULL, - .DEVsenUpdate = NULL, - .DEVsenAcLoad = NULL, - .DEVsenPrint = NULL, - .DEVsenTrunc = NULL, - .DEVdisto = NULL, - .DEVnoise = NULL, - .DEVsoaCheck = NULL, - .DEVinstSize = &NDEViSize, - .DEVmodSize = &NDEVmSize, - -#ifdef CIDER - .DEVdump = NULL, - .DEVacct = NULL, -#endif -}; - - -SPICEdev * -get_ndev_info(void) -{ - return &NDEVinfo; -} diff --git a/src/spicelib/devices/ndev/ndevinit.h b/src/spicelib/devices/ndev/ndevinit.h deleted file mode 100644 index 6ce2397de..000000000 --- a/src/spicelib/devices/ndev/ndevinit.h +++ /dev/null @@ -1,13 +0,0 @@ -#ifndef _NDEVINIT_H -#define _NDEVINIT_H - -extern IFparm NDEVpTable[ ]; -extern IFparm NDEVmPTable[ ]; -extern char *NDEVnames[ ]; -extern int NDEVpTSize; -extern int NDEVmPTSize; -extern int NDEVnSize; -extern int NDEViSize; -extern int NDEVmSize; - -#endif diff --git a/src/spicelib/devices/ndev/ndevitf.h b/src/spicelib/devices/ndev/ndevitf.h deleted file mode 100644 index f347f3998..000000000 --- a/src/spicelib/devices/ndev/ndevitf.h +++ /dev/null @@ -1,10 +0,0 @@ -/********** -Copyright 1991 Regents of the University of California. All rights reserved. -**********/ - -#ifndef DEV_NDEV -#define DEV_NDEV - -extern SPICEdev *get_ndev_info(void); - -#endif diff --git a/src/spicelib/devices/ndev/ndevload.c b/src/spicelib/devices/ndev/ndevload.c deleted file mode 100644 index c13631ab5..000000000 --- a/src/spicelib/devices/ndev/ndevload.c +++ /dev/null @@ -1,100 +0,0 @@ -/********** -Permit to use it as your wish. -Author: 2007 Gong Ding, gdiso@ustc.edu -University of Science and Technology of China -**********/ - -#include "ngspice/ngspice.h" -#include "ngspice/devdefs.h" -#include "ngspice/cktdefs.h" -#include "ndevdefs.h" -#include "ngspice/numenum.h" -#include "ngspice/trandefs.h" -#include "ngspice/complex.h" -#include "ngspice/sperror.h" -#include "ngspice/suffix.h" - - -int -NDEVload(GENmodel * inModel, CKTcircuit * ckt) -{ - NDEVmodel *model = (NDEVmodel *)inModel; - NDEVinstance *here; - int i,j; - - /* loop through all the ndev models */ - for( ; model != NULL; model = NDEVnextModel(model)) - { - - /* loop through all the instances of the model */ - for (here = NDEVinstances(model); here != NULL ; here=NDEVnextInstance(here)) - { - /* sent ckt information to device simulator */ - here->CKTInfo.DEV_CALL = NDEV_LOAD; - here->CKTInfo.CKTmode = ckt->CKTmode; - here->CKTInfo.time = ckt->CKTtime; - here->CKTInfo.dt = ckt->CKTdelta; - here->CKTInfo.dt_old = ckt->CKTdeltaOld[0]; - here->CKTInfo.accept_flag = 0; - send(model->sock,&here->CKTInfo,sizeof(sCKTinfo),0); - - /* send terminal voltage to device simulator */ - for(i=0;iterm;i++) - { - here->PINinfos[i].V_old = here->PINinfos[i].V; - here->PINinfos[i].V = *(ckt->CKTrhsOld+here->pin[i]); - send(model->sock,&here->PINinfos[i],sizeof(here->PINinfos[i]),0); - } - } - } - - /* loop through all the ndev models */ - - for(model = (NDEVmodel *)inModel; model != NULL; model = NDEVnextModel(model)) - { - - /* loop through all the instances of the model */ - for (here = NDEVinstances(model); here != NULL ; here=NDEVnextInstance(here)) - { - /* reveive terminal current and conductional matrix from device simulator */ - for(i=0;iterm;i++) - { - recv(model->sock,&here->PINinfos[i],sizeof(here->PINinfos[i]),MSG_WAITALL); - *(ckt->CKTrhs+here->pin[i]) += here->PINinfos[i].I; - for(j=0;jterm;j++) - *(here->mat_pointer[i*here->term+j]) += here->PINinfos[i].dI_dV[j]; - } - } - } - - return(OK); -} - -int NDEVgetic(GENmodel *inModel, CKTcircuit *ckt) -{ - NDEVmodel *model = (NDEVmodel*)inModel; - NDEVinstance *here; - - NG_IGNORE(ckt); - - /* - * grab initial conditions out of rhs array. User specified, so use - * external nodes to get values - */ - - printf("set ic\n"); - - for( ; model ; model = NDEVnextModel(model)) { - for(here = NDEVinstances(model); here ; here = NDEVnextInstance(here)) { -/* - if(!here->DIOinitCondGiven) { - here->DIOinitCond = - *(ckt->CKTrhs + here->DIOposNode) - - *(ckt->CKTrhs + here->DIOnegNode); - - } -*/ - } - } - return(OK); -} diff --git a/src/spicelib/devices/ndev/ndevmdel.c b/src/spicelib/devices/ndev/ndevmdel.c deleted file mode 100644 index 13890f86c..000000000 --- a/src/spicelib/devices/ndev/ndevmdel.c +++ /dev/null @@ -1,21 +0,0 @@ -/********** -Copyright 1992 Regents of the University of California. All rights reserved. -Author: 1987 Kartikeya Mayaram, U. C. Berkeley CAD Group -**********/ - -#include "ngspice/ngspice.h" -#include "ndevdefs.h" -#include "ngspice/sperror.h" -#include "ngspice/suffix.h" - - -int -NDEVmDelete(GENmodel *gen_model) -{ - NDEVmodel *model = (NDEVmodel *) gen_model; - - close(model->sock); - printf("Disconnect to remote NDEV server %s:%d\n", model->host, model->port); - - return OK; -} diff --git a/src/spicelib/devices/ndev/ndevmpar.c b/src/spicelib/devices/ndev/ndevmpar.c deleted file mode 100644 index 77beaf6b7..000000000 --- a/src/spicelib/devices/ndev/ndevmpar.c +++ /dev/null @@ -1,38 +0,0 @@ -/********** -Copyright 1992 Regents of the University of California. All rights reserved. -Author: 1987 Kartikeya Mayaram, U. C. Berkeley CAD Group -**********/ - -/* - * This routine sets model parameters for NDEVs in the circuit. - */ - -#include "ngspice/ngspice.h" -#include "ngspice/const.h" -#include "ngspice/ifsim.h" -#include "ndevdefs.h" -#include "ngspice/sperror.h" -#include "ngspice/suffix.h" - -int -NDEVmParam(int param, IFvalue * value, GENmodel * inModel) -{ - - NDEVmodel *model = (NDEVmodel *) inModel; - switch (param) { - case NDEV_REMOTE: - model->host = value->sValue; - break; - case NDEV_PORT: - model->port = value->iValue; - break; - case NDEV_MOD_NDEV: - /* no action , but this */ - /* makes life easier for spice-2 like parsers */ - break; - default: - return (E_BADPARM); - } - - return (OK); -} diff --git a/src/spicelib/devices/ndev/ndevparm.c b/src/spicelib/devices/ndev/ndevparm.c deleted file mode 100644 index 8ba980dd0..000000000 --- a/src/spicelib/devices/ndev/ndevparm.c +++ /dev/null @@ -1,33 +0,0 @@ -/********** -Copyright 1992 Regents of the University of California. All rights reserved. -Author: 1987 Kartikeya Mayaram, U. C. Berkeley CAD Group -**********/ - -#include "ngspice/ngspice.h" -#include "ngspice/ifsim.h" -#include "ngspice/const.h" -#include "ndevdefs.h" -#include "ngspice/sperror.h" -#include "ngspice/suffix.h" - -int -NDEVparam( - int param, - IFvalue *value, - GENinstance *inInst, - IFvalue *select ) -{ - NG_IGNORE(value); - NG_IGNORE(inInst); - NG_IGNORE(select); - - switch (param) { - case NDEV_MOD_NDEV: - /* no action , but this */ - /* makes life easier for spice-2 like parsers */ - break; - default: - return (E_BADPARM); - } - return (OK); -} diff --git a/src/spicelib/devices/ndev/ndevpzld.c b/src/spicelib/devices/ndev/ndevpzld.c deleted file mode 100644 index ab05140f1..000000000 --- a/src/spicelib/devices/ndev/ndevpzld.c +++ /dev/null @@ -1,25 +0,0 @@ -/********** -Copyright 1992 Regents of the University of California. All rights reserved. -Author: 1987 Kartikeya Mayaram, U. C. Berkeley CAD Group -**********/ - -#include "ngspice/ngspice.h" -#include "ngspice/cktdefs.h" -#include "ngspice/complex.h" -#include "ngspice/sperror.h" -#include "ndevdefs.h" -#include "ngspice/suffix.h" - - -int -NDEVpzLoad( - GENmodel *inModel, - register CKTcircuit *ckt, - SPcomplex *s ) -{ - NG_IGNORE(inModel); - NG_IGNORE(ckt); - NG_IGNORE(s); - - return (OK); -} diff --git a/src/spicelib/devices/ndev/ndevset.c b/src/spicelib/devices/ndev/ndevset.c deleted file mode 100644 index 5fdffb575..000000000 --- a/src/spicelib/devices/ndev/ndevset.c +++ /dev/null @@ -1,163 +0,0 @@ -/********** -Permit to use it as your wish. -Author: 2007 Gong Ding, gdiso@ustc.edu -University of Science and Technology of China -**********/ - -#include "ngspice/ngspice.h" -#include "ngspice/cktdefs.h" -#include "ngspice/smpdefs.h" -#include "ndevdefs.h" -#include "ngspice/numconst.h" -#include "ngspice/numenum.h" -#include "ngspice/sperror.h" -#include "ngspice/suffix.h" - -#define TSCALLOC(var, size, type)\ -if (size && (var =(type *)calloc(1, (unsigned)(size)*sizeof(type))) == NULL) {\ - return(E_NOMEM);\ -} - -int NDEVmodelConnect(NDEVmodel *inModel); - - -int NDEVsetup(SMPmatrix *matrix, GENmodel *inModel, CKTcircuit *ckt, int *states) -/* - * load the structure with those pointers needed later for fast matrix - * loading - */ -{ - NDEVmodel *model = (NDEVmodel *)inModel; - NDEVinstance *here; - int i,j; - CKTnode *node; - - NG_IGNORE(ckt); - NG_IGNORE(states); - - /* loop through all the ndev models */ - for( ; model != NULL; model = NDEVnextModel(model)) { - - /* connect to remote device simulator */ - if(NDEVmodelConnect(model)) return E_PRIVATE; - - /* loop through all the instances of the model */ - for (here = NDEVinstances(model); here != NULL ; - here=NDEVnextInstance(here)) { - - here->Ndevinfo.term = here->term; - strncpy(here->Ndevinfo.NDEVname, here->gen.GENname, 32); - send(model->sock,&(here->Ndevinfo),sizeof(here->Ndevinfo),0); -/* macro to make elements with built in test for out of memory */ -#define TSTALLOC(ptr,first,second) \ -do { if((here->ptr = SMPmakeElt(matrix, here->first, here->second)) == NULL){\ - return(E_NOMEM);\ -} } while(0) - - for(i=0;iterm;i++) - for(j=0;jterm;j++) - { - TSTALLOC(mat_pointer[i*here->term+j], pin[i], pin[j]); - } - - for(i=0;iterm;i++) - { - node = here->node[i]; - here->PINinfos[i].pin=node->number; - strncpy(here->PINinfos[i].name,here->bname[i],32); - here->PINinfos[i].V = 0.0; - send(model->sock,&here->PINinfos[i],sizeof(here->PINinfos[i]),0); - } - - } - } - return(OK); - -} - -int NDEVmodelConnect(NDEVmodel *inModel) -{ - NDEVmodel *model = inModel; - struct hostent *hostlist; /* List of hosts returned by gethostbyname. */ - char dotted_ip[15]; /* Buffer for converting - the resolved address to - a readable format. */ - struct sockaddr_in sa; /* Connection address. */ - char *buf = TMALLOC(char, 128); - - /* Look up the hostname with DNS. gethostbyname - (at least most UNIX versions of it) properly - handles dotted IP addresses as well as hostnames. */ - hostlist = gethostbyname(model->host); - if (hostlist == NULL) - { - fprintf(stderr,"NDEV: Unable to resolve host %s.\n", model->host); - return E_PRIVATE; - } - /* Good, we have an address. However, some sites - are moving over to IPv6 (the newer version of - IP), and we're not ready for it (since it uses - a new address format). It's a good idea to check - for this. */ - if (hostlist->h_addrtype != AF_INET) - { - fprintf(stderr,"NDEV: Host %s doesn't seem to be an IPv4 address.\n",model->host); - return E_PRIVATE; - } - - /* inet_ntop converts a 32-bit IP address to - the dotted string notation (suitable for printing). - hostlist->h_addr_list is an array of possible addresses - (in case a name resolves to more than on IP). In most - cases we just want the first. */ - inet_ntop(AF_INET, hostlist->h_addr_list[0], dotted_ip, 15); - /* Create a socket for the connection. */ - model->sock = socket(PF_INET, SOCK_STREAM, IPPROTO_IP); - - if (model->sock < 0) - { - fprintf(stderr, "NDEV: Unable to create a socket %s.\n", strerror(errno)); - return E_PRIVATE; - } - /* Fill in the sockaddr_in structure. The address is - already in network byte order (from the gethostbyname - call). We need to convert the port number with the htons - macro. Before we do anything else, we'll zero out the - entire structure. */ - - memset(&sa, 0, sizeof(struct sockaddr_in)); - sa.sin_port = htons(model->port); - /* The IP address was returned as a char * for - various reasons. - Just memcpy it into the sockaddr_in structure. */ - memcpy(&sa.sin_addr, hostlist->h_addr_list[0], - (size_t) hostlist->h_length); - /* This is an Internet socket. */ - sa.sin_family = AF_INET; - /* Connect! */ - if (connect(model->sock, (struct sockaddr *)&sa, sizeof(sa)) < 0) - { - fprintf(stderr, "NDEV: Unable to connect %s\n",strerror(errno)); - return E_PRIVATE; - } - - sprintf(buf, NG_QUERY); - send(model->sock, buf, 128, 0); - if(recv(model->sock, buf, 128, MSG_WAITALL) < 128) - { - fprintf(stderr, "NDEV: Remote answer error. %s\n",strerror(errno)); - return E_PRIVATE; - } - - if(strncmp(buf, NDEV_REPLY, sizeof(NDEV_REPLY))) - { - fprintf(stderr, "NDEV: Remote answer error. %s\n", buf); - return E_PRIVATE; - } - - - free(buf); - return (OK); -} - - diff --git a/src/spicelib/devices/ndev/ndevtemp.c b/src/spicelib/devices/ndev/ndevtemp.c deleted file mode 100644 index fa7c3c40b..000000000 --- a/src/spicelib/devices/ndev/ndevtemp.c +++ /dev/null @@ -1,28 +0,0 @@ -/********** -Copyright 1992 Regents of the University of California. All rights reserved. -Author: 1987 Kartikeya Mayaram, U. C. Berkeley CAD Group -Author: 1992 David A. Gates, U. C. Berkeley CAD Group -**********/ - -#include "ngspice/ngspice.h" -#include "ngspice/cktdefs.h" -#include "ndevdefs.h" -#include "ngspice/numenum.h" -#include "ngspice/carddefs.h" -#include "ngspice/sperror.h" -#include "ngspice/suffix.h" - - -int -NDEVtemp( - GENmodel *inModel, - register CKTcircuit *ckt ) -/* - * perform the temperature update to the diode - */ -{ - NG_IGNORE(inModel); - NG_IGNORE(ckt); - - return (OK); -} diff --git a/src/spicelib/devices/ndev/ndevtrun.c b/src/spicelib/devices/ndev/ndevtrun.c deleted file mode 100644 index 358749ff3..000000000 --- a/src/spicelib/devices/ndev/ndevtrun.c +++ /dev/null @@ -1,26 +0,0 @@ -/********** -Copyright 1992 Regents of the University of California. All rights reserved. -Author: 1987 Kartikeya Mayaram, U. C. Berkeley CAD Group -**********/ - -#include "ngspice/ngspice.h" -#include "ngspice/cktdefs.h" -#include "ndevdefs.h" -#include "ngspice/sperror.h" -#include "ngspice/suffix.h" - - - -int -NDEVtrunc( - GENmodel *inModel, - register CKTcircuit *ckt, - double *timeStep ) - -{ - NG_IGNORE(inModel); - NG_IGNORE(ckt); - NG_IGNORE(timeStep); - - return (OK); -} diff --git a/src/spicelib/devices/numd/Makefile.am b/src/spicelib/devices/numd/Makefile.am deleted file mode 100644 index 51a9102c8..000000000 --- a/src/spicelib/devices/numd/Makefile.am +++ /dev/null @@ -1,28 +0,0 @@ -## Process this file with automake to produce Makefile.in - -noinst_LTLIBRARIES = libnumd.la - -libnumd_la_SOURCES = \ - numd.c \ - numdacld.c \ - numdask.c \ - numddefs.h \ - numddel.c \ - numddump.c \ - numdext.h \ - numdinit.c \ - numdinit.h \ - numditf.h \ - numdload.c \ - numdmpar.c \ - numdparm.c \ - numdpzld.c \ - numdset.c \ - numdtemp.c \ - numdtrun.c - - -AM_CPPFLAGS = @AM_CPPFLAGS@ -I$(top_srcdir)/src/include -AM_CFLAGS = $(STATIC) - -MAINTAINERCLEANFILES = Makefile.in diff --git a/src/spicelib/devices/numd/numd.c b/src/spicelib/devices/numd/numd.c deleted file mode 100644 index f792d79f6..000000000 --- a/src/spicelib/devices/numd/numd.c +++ /dev/null @@ -1,53 +0,0 @@ -/********** -Copyright 1992 Regents of the University of California. All rights reserved. -Author: 1987 Kartikeya Mayaram, U. C. Berkeley CAD Group -**********/ - -#include "ngspice/ngspice.h" -#include "ngspice/devdefs.h" -#include "numddefs.h" -#include "ngspice/suffix.h" - -IFparm NUMDpTable[] = { /* parameters */ - IP("off", NUMD_OFF, IF_FLAG, "Initially off"), - IP("ic.file", NUMD_IC_FILE, IF_STRING, "Initial conditions file"), - IOP("area", NUMD_AREA, IF_REAL, "Area factor"), - IP("save", NUMD_PRINT, IF_INTEGER, "Save Solutions"), - IPR("print", NUMD_PRINT, IF_INTEGER, "Print Solutions"), - OP("vd", NUMD_VD, IF_REAL, "Voltage"), - OPR("voltage", NUMD_VD, IF_REAL, "Voltage"), - OP("id", NUMD_ID, IF_REAL, "Current"), - OPR("current", NUMD_ID, IF_REAL, "Current"), - OP("g11", NUMD_G11, IF_REAL, "Conductance"), - OPR("conductance", NUMD_G11, IF_REAL, "Conductance"), - OP("c11", NUMD_C11, IF_REAL, "Capacitance"), - OPR("capacitance", NUMD_C11, IF_REAL, "Capacitance"), - OP("y11", NUMD_Y11, IF_COMPLEX, "Admittance"), - OPU("g12", NUMD_G12, IF_REAL, "Conductance"), - OPU("c12", NUMD_C12, IF_REAL, "Capacitance"), - OPU("y12", NUMD_Y12, IF_COMPLEX, "Admittance"), - OPU("g21", NUMD_G21, IF_REAL, "Conductance"), - OPU("c21", NUMD_C21, IF_REAL, "Capacitance"), - OPU("y21", NUMD_Y21, IF_COMPLEX, "Admittance"), - OPU("g22", NUMD_G22, IF_REAL, "Conductance"), - OPU("c22", NUMD_C22, IF_REAL, "Capacitance"), - OPU("y22", NUMD_Y22, IF_COMPLEX, "Admittance"), - IOP("temp", NUMD_TEMP, IF_REAL, "Instance Temperature") -}; - -IFparm NUMDmPTable[] = { /* model parameters */ - /* numerical-device models no longer have parameters */ - /* one is left behind to keep the table from being empty */ - IP("numd", NUMD_MOD_NUMD, IF_REAL, "Numerical Diode") -}; - -char *NUMDnames[] = { - "D+", - "D-" -}; - -int NUMDnSize = NUMELEMS(NUMDnames); -int NUMDpTSize = NUMELEMS(NUMDpTable); -int NUMDmPTSize = NUMELEMS(NUMDmPTable); -int NUMDiSize = sizeof(NUMDinstance); -int NUMDmSize = sizeof(NUMDmodel); diff --git a/src/spicelib/devices/numd/numdacld.c b/src/spicelib/devices/numd/numdacld.c deleted file mode 100644 index 6026f9f0c..000000000 --- a/src/spicelib/devices/numd/numdacld.c +++ /dev/null @@ -1,74 +0,0 @@ -/********** -Copyright 1992 Regents of the University of California. All rights reserved. -Author: 1987 Kartikeya Mayaram, U. C. Berkeley CAD Group -**********/ - -/* - * Function to load the COMPLEX circuit matrix using the small signal - * parameters saved during a previous DC operating point analysis. - */ - -#include "ngspice/ngspice.h" -#include "ngspice/cktdefs.h" -#include "numddefs.h" -#include "ngspice/sperror.h" -#include "ngspice/complex.h" -#include "../../../ciderlib/oned/onedext.h" -#include "ngspice/cidersupt.h" -#include "ngspice/numglobs.h" -#include "ngspice/suffix.h" - -/* External Declarations */ -extern int ONEacDebug; - -int -NUMDacLoad(GENmodel *inModel, CKTcircuit *ckt) -{ - register NUMDmodel *model = (NUMDmodel *) inModel; - register NUMDinstance *inst; - SPcomplex y; - double startTime; - - /* loop through all the diode models */ - for (; model != NULL; model = NUMDnextModel(model)) { - FieldDepMobility = model->NUMDmodels->MODLfieldDepMobility; - Srh = model->NUMDmodels->MODLsrh; - Auger = model->NUMDmodels->MODLauger; - AvalancheGen = model->NUMDmodels->MODLavalancheGen; - AcAnalysisMethod = model->NUMDmethods->METHacAnalysisMethod; - MobDeriv = model->NUMDmethods->METHmobDeriv; - ONEacDebug = model->NUMDoutputs->OUTPacDebug; - - for (inst = NUMDinstances(model); inst != NULL; - inst = NUMDnextInstance(inst)) { - - startTime = SPfrontEnd->IFseconds(); - /* Get Temp.-Dep. Global Parameters */ - GLOBgetGlobals(&(inst->NUMDglobals)); - - model->NUMDmethods->METHacAnalysisMethod = - NUMDadmittance(inst->NUMDpDevice, - ckt->CKTomega, &y); - - *(inst->NUMDposPosPtr) += y.real; - *(inst->NUMDposPosPtr + 1) += y.imag; - *(inst->NUMDnegNegPtr) += y.real; - *(inst->NUMDnegNegPtr + 1) += y.imag; - *(inst->NUMDnegPosPtr) -= y.real; - *(inst->NUMDnegPosPtr + 1) -= y.imag; - *(inst->NUMDposNegPtr) -= y.real; - *(inst->NUMDposNegPtr + 1) -= y.imag; - if (ckt->CKTomega != 0.0) { - inst->NUMDc11 = y.imag / ckt->CKTomega; - } else { - inst->NUMDc11 = 0.0; /* XXX What else can be done?! */ - } - inst->NUMDy11r = y.real; - inst->NUMDy11i = y.imag; - inst->NUMDsmSigAvail = TRUE; - inst->NUMDpDevice->pStats->totalTime[STAT_AC] += - SPfrontEnd->IFseconds() - startTime; - } - } - return (OK); -} diff --git a/src/spicelib/devices/numd/numdask.c b/src/spicelib/devices/numd/numdask.c deleted file mode 100644 index b7ba9c510..000000000 --- a/src/spicelib/devices/numd/numdask.c +++ /dev/null @@ -1,117 +0,0 @@ -/********** -Copyright 1990 Regents of the University of California. All rights reserved. -Author: 1987 Thomas L. Quarles -**********/ - -#include "ngspice/ngspice.h" -#include "ngspice/const.h" -#include "ngspice/ifsim.h" -#include "ngspice/cktdefs.h" -#include "ngspice/devdefs.h" -#include "numddefs.h" -#include "ngspice/complex.h" -#include "ngspice/sperror.h" -#include "ngspice/suffix.h" - -/* Check out this one */ -extern int NUMDinitSmSig(NUMDinstance *); - - -/* ARGSUSED */ -int -NUMDask(CKTcircuit *ckt, GENinstance *inInst, int which, IFvalue *value, IFvalue *select) -{ - NUMDinstance *inst = (NUMDinstance *) inInst; - - NG_IGNORE(select); - - switch (which) { - case NUMD_AREA: - value->rValue = inst->NUMDarea; - return (OK); - case NUMD_TEMP: - value->rValue = inst->NUMDtemp - CONSTCtoK; - return (OK); - case NUMD_VD: - value->rValue = *(ckt->CKTstate0 + inst->NUMDvoltage); - return (OK); - case NUMD_ID: - value->rValue = *(ckt->CKTstate0 + inst->NUMDid); - return (OK); - case NUMD_G11: - value->rValue = *(ckt->CKTstate0 + inst->NUMDconduct); - return (OK); - case NUMD_G12: - value->rValue = -*(ckt->CKTstate0 + inst->NUMDconduct); - return (OK); - case NUMD_G21: - value->rValue = -*(ckt->CKTstate0 + inst->NUMDconduct); - return (OK); - case NUMD_G22: - value->rValue = *(ckt->CKTstate0 + inst->NUMDconduct); - return (OK); - case NUMD_C11: - if (!inst->NUMDsmSigAvail - && ckt->CKTcurrentAnalysis != DOING_TRAN) { - NUMDinitSmSig(inst); - } - value->rValue = inst->NUMDc11; - return (OK); - case NUMD_C12: - if (!inst->NUMDsmSigAvail - && ckt->CKTcurrentAnalysis != DOING_TRAN) { - NUMDinitSmSig(inst); - } - value->rValue = -inst->NUMDc11; - return (OK); - case NUMD_C21: - if (!inst->NUMDsmSigAvail - && ckt->CKTcurrentAnalysis != DOING_TRAN) { - NUMDinitSmSig(inst); - } - value->rValue = -inst->NUMDc11; - return (OK); - case NUMD_C22: - if (!inst->NUMDsmSigAvail - && ckt->CKTcurrentAnalysis != DOING_TRAN) { - NUMDinitSmSig(inst); - } - value->rValue = inst->NUMDc11; - return (OK); - case NUMD_Y11: - if (!inst->NUMDsmSigAvail - && ckt->CKTcurrentAnalysis != DOING_TRAN) { - NUMDinitSmSig(inst); - } - value->cValue.real = inst->NUMDy11r; - value->cValue.imag = inst->NUMDy11i; - return (OK); - case NUMD_Y12: - if (!inst->NUMDsmSigAvail - && ckt->CKTcurrentAnalysis != DOING_TRAN) { - NUMDinitSmSig(inst); - } - value->cValue.real = -inst->NUMDy11r; - value->cValue.imag = -inst->NUMDy11i; - return (OK); - case NUMD_Y21: - if (!inst->NUMDsmSigAvail - && ckt->CKTcurrentAnalysis != DOING_TRAN) { - NUMDinitSmSig(inst); - } - value->cValue.real = -inst->NUMDy11r; - value->cValue.imag = -inst->NUMDy11i; - return (OK); - case NUMD_Y22: - if (!inst->NUMDsmSigAvail - && ckt->CKTcurrentAnalysis != DOING_TRAN) { - NUMDinitSmSig(inst); - } - value->cValue.real = inst->NUMDy11r; - value->cValue.imag = inst->NUMDy11i; - return (OK); - default: - return (E_BADPARM); - } - /* NOTREACHED */ -} diff --git a/src/spicelib/devices/numd/numddefs.h b/src/spicelib/devices/numd/numddefs.h deleted file mode 100644 index e9e27b217..000000000 --- a/src/spicelib/devices/numd/numddefs.h +++ /dev/null @@ -1,136 +0,0 @@ -/********** -Copyright 1991 Regents of the University of California. All rights reserved. -Authors: 1987 Karti Mayaram, 1991 David Gates -**********/ - -#ifndef NUMD_H -#define NUMD_H - -/* data structures used to describe 1D numerical diodes */ - -/* circuit level includes */ -#include "ngspice/ifsim.h" -#include "ngspice/cktdefs.h" -#include "ngspice/gendefs.h" - -/* device level includes */ -#include "ngspice/onemesh.h" -#include "ngspice/onedev.h" -#include "ngspice/profile.h" -#include "ngspice/numglobs.h" -#include "ngspice/carddefs.h" - -/* information needed per instance */ -typedef struct sNUMDinstance { - - struct GENinstance gen; - -#define NUMDmodPtr(inst) ((struct sNUMDmodel *)((inst)->gen.GENmodPtr)) -#define NUMDnextInstance(inst) ((struct sNUMDinstance *)((inst)->gen.GENnextInstance)) -#define NUMDname gen.GENname -#define NUMDstate gen.GENstate - -#define NUMDvoltage NUMDstate -#define NUMDid NUMDstate+1 -#define NUMDconduct NUMDstate+2 -#define NUMDnumStates 3 - - const int NUMDposNode; /* number of positive node of diode */ - const int NUMDnegNode; /* number of negative node of diode */ - ONEdevice *NUMDpDevice; - GLOBvalues NUMDglobals; /* Temp.-Dep. Global Parameters */ - int NUMDtype; /* device type pn or np */ - double NUMDarea; /* area factor for the diode */ - double NUMDtemp; /* instance temperature */ - double NUMDc11; /* small-signal capacitance */ - double NUMDy11r; /* small-signal admittance, real part */ - double NUMDy11i; /* small-signal admittance, imag part */ - int NUMDprint; /* number of timesteps after which print - * internal */ - char *NUMDicFile; /* Name of initial condition file */ - double *NUMDnegPosPtr; /* pointer to sparse matrix at - * (negative,positive) */ - double *NUMDposNegPtr; /* pointer to sparse matrix at - * (positive,negative) */ - double *NUMDposPosPtr; /* pointer to sparse matrix at - * (positive,positive) */ - double *NUMDnegNegPtr; /* pointer to sparse matrix at - * (negative,negative) */ - - int NUMDoff; /* 'off' flag for diode */ - unsigned NUMDsmSigAvail:1; /* flag to indicate small-signal done */ - unsigned NUMDareaGiven:1; /* flag to indicate area was specified */ - unsigned NUMDicFileGiven:1; /* flag to indicate init. cond. file given */ - unsigned NUMDtempGiven:1; /* flag to indicate temp was specified */ - unsigned NUMDprintGiven:1; /* flag to indicate if print was specified */ -} NUMDinstance; - - -/* per model data */ - -typedef struct sNUMDmodel { /* model structure for a diode */ - - struct GENmodel gen; - -#define NUMDmodType gen.GENmodType -#define NUMDnextModel(inst) ((struct sNUMDmodel *)((inst)->gen.GENnextModel)) -#define NUMDinstances(inst) ((NUMDinstance *)((inst)->gen.GENinstances)) -#define NUMDmodName gen.GENmodName - - MESHcard *NUMDxMeshes; /* list of xmesh cards */ - MESHcard *NUMDyMeshes; /* list of ymesh cards */ - DOMNcard *NUMDdomains; /* list of domain cards */ - BDRYcard *NUMDboundaries; /* list of boundary cards */ - DOPcard *NUMDdopings; /* list of doping cards */ - ELCTcard *NUMDelectrodes; /* list of electrode cards */ - CONTcard *NUMDcontacts; /* list of contact cards */ - MODLcard *NUMDmodels; /* list of model cards */ - MATLcard *NUMDmaterials; /* list of material cards */ - MOBcard *NUMDmobility; /* list of mobility cards */ - METHcard *NUMDmethods; /* list of method cards */ - OPTNcard *NUMDoptions; /* list of option cards */ - OUTPcard *NUMDoutputs; /* list of output cards */ - ONEtranInfo *NUMDpInfo; /* transient analysis information */ - DOPprofile *NUMDprofiles; /* expanded list of doping profiles */ - DOPtable *NUMDdopTables; /* list of tables used by profiles */ - ONEmaterial *NUMDmatlInfo; /* list of material info structures */ -} NUMDmodel; - -/* type of 1D diode */ -#define PN 1 -#define NP -1 - -/* device parameters */ -enum { - NUMD_AREA = 1, - NUMD_IC_FILE, - NUMD_OFF, - NUMD_PRINT, - NUMD_TEMP, - NUMD_VD, - NUMD_ID, - NUMD_G11, - NUMD_C11, - NUMD_Y11, - NUMD_G12, - NUMD_C12, - NUMD_Y12, - NUMD_G21, - NUMD_C21, - NUMD_Y21, - NUMD_G22, - NUMD_C22, - NUMD_Y22, -}; - -/* model parameters */ -/* NOTE: all true model parameters have been moved to IFcardInfo structures */ -#define NUMD_MOD_NUMD 101 - -/* device questions */ - -/* model questions */ - -#include "numdext.h" - -#endif /* NUMD_H */ diff --git a/src/spicelib/devices/numd/numddel.c b/src/spicelib/devices/numd/numddel.c deleted file mode 100644 index fb1a42839..000000000 --- a/src/spicelib/devices/numd/numddel.c +++ /dev/null @@ -1,21 +0,0 @@ -/********** -Copyright 1992 Regents of the University of California. All rights reserved. -Author: 1987 Kartikeya Mayaram, U. C. Berkeley CAD Group -**********/ - -#include "ngspice/ngspice.h" -#include "numddefs.h" -#include "../../../ciderlib/oned/onedext.h" -#include "ngspice/sperror.h" -#include "ngspice/suffix.h" - - -int -NUMDdelete(GENinstance *gen_inst) -{ - NUMDinstance *inst = (NUMDinstance *) gen_inst; - - ONEdestroy(inst->NUMDpDevice); - - return OK; -} diff --git a/src/spicelib/devices/numd/numddump.c b/src/spicelib/devices/numd/numddump.c deleted file mode 100644 index 25ce945e5..000000000 --- a/src/spicelib/devices/numd/numddump.c +++ /dev/null @@ -1,161 +0,0 @@ -/********** -Copyright 1992 Regents of the University of California. All rights reserved. -Author: 1987 Kartikeya Mayaram, U. C. Berkeley CAD Group -Author: 1991 David A. Gates, U. C. Berkeley CAD Group -**********/ - -/* - * This is a simple routine to dump the internal device states. It produces - * states for .OP, .DC, & .TRAN simulations. - */ - -#include "ngspice/ngspice.h" -#include "ngspice/cktdefs.h" -#include "numddefs.h" -#include "../../../ciderlib/oned/onedext.h" -#include "ngspice/cidersupt.h" -#include "ngspice/suffix.h" - - -/* Forward Declarations */ -static void NUMDputHeader(FILE *, CKTcircuit *, NUMDinstance *); - -/* State Counter */ -static int state_numOP = 0; -static int state_numDC = 0; -static int state_numTR = 0; - -void -NUMDdump(GENmodel *inModel, CKTcircuit *ckt) -{ - register NUMDmodel *model = (NUMDmodel *) inModel; - register NUMDinstance *inst; - OUTPcard *output; - FILE *fpState; - char fileName[BSIZE_SP]; - char description[BSIZE_SP]; - char *prefix; - int *state_num; - int anyOutput = 0; - BOOLEAN writeAscii = TRUE; - - if (ckt->CKTmode & MODEDCOP) { - prefix = "OP"; - state_num = &state_numOP; - sprintf(description, "..."); - } else if (ckt->CKTmode & MODEDCTRANCURVE) { - prefix = "DC"; - state_num = &state_numDC; - sprintf(description, "sweep = % e", ckt->CKTtime); - } else if (ckt->CKTmode & MODETRAN) { - prefix = "TR"; - state_num = &state_numTR; - sprintf(description, "time = % e", ckt->CKTtime); - } else { - /* Not a recognized CKT mode. */ - return; - } - - for (; model != NULL; model = NUMDnextModel(model)) { - output = model->NUMDoutputs; - for (inst = NUMDinstances(model); inst != NULL; - inst = NUMDnextInstance(inst)) { - - if (inst->NUMDprintGiven) { - if ((ckt->CKTmode & MODETRAN) && - ((ckt->CKTstat->STATaccepted - 1) % inst->NUMDprint != 0)) { - continue; - } - anyOutput = 1; - sprintf(fileName, "%s%s.%d.%s", output->OUTProotFile, prefix, - *state_num, inst->NUMDname); - - writeAscii = compareFiletypeVar("ascii"); - - fpState = fopen(fileName, (writeAscii ? "w" : "wb")); - if (!fpState) { - perror(fileName); - } else { - NUMDputHeader(fpState, ckt, inst); - ONEprnSolution(fpState, inst->NUMDpDevice, - model->NUMDoutputs, writeAscii, "numd"); - fclose(fpState); - LOGmakeEntry(fileName, description); - } - } - } - } - if (anyOutput) { - (*state_num)++; - } -} - -#define NUMDnumOutputs 4 - -static -void -NUMDputHeader(FILE *file, CKTcircuit *ckt, NUMDinstance *inst) -{ - char *reference; - double refVal = 0.0; - int numVars = NUMDnumOutputs; - - if (ckt->CKTmode & MODEDCOP) { - reference = NULL; - } else if (ckt->CKTmode & MODEDCTRANCURVE) { - reference = "sweep"; - refVal = ckt->CKTtime; - numVars++; - } else if (ckt->CKTmode & MODETRAN) { - reference = "time"; - refVal = ckt->CKTtime; - numVars++; - } else { - reference = NULL; - } - fprintf(file, "Title: Device %s external state\n", inst->NUMDname); - fprintf(file, "Plotname: Device Operating Point\n"); - fprintf(file, "Command: deftype v conductance S\n"); - fprintf(file, "Flags: real\n"); - fprintf(file, "No. Variables: %d\n", numVars); - fprintf(file, "No. Points: 1\n"); - numVars = 0; - fprintf(file, "Variables:\n"); - if (reference) { - fprintf(file, "\t%d %s unknown\n", numVars++, reference); - } - fprintf(file, "\t%d v12 voltage\n", numVars++); - fprintf(file, "\t%d i1 current\n", numVars++); - fprintf(file, "\t%d i2 current\n", numVars++); - fprintf(file, "\t%d g11 conductance\n", numVars++); - fprintf(file, "Values:\n0"); - if (reference) { - fprintf(file, "\t% e\n", refVal); - } - fprintf(file, "\t% e\n", *(ckt->CKTstate0 + inst->NUMDvoltage)); - fprintf(file, "\t% e\n", *(ckt->CKTstate0 + inst->NUMDid)); - fprintf(file, "\t% e\n", - *(ckt->CKTstate0 + inst->NUMDid)); - fprintf(file, "\t% e\n", *(ckt->CKTstate0 + inst->NUMDconduct)); -} - -void -NUMDacct(GENmodel *inModel, CKTcircuit *ckt, FILE *file) -{ - register NUMDmodel *model = (NUMDmodel *) inModel; - register NUMDinstance *inst; - OUTPcard *output; - - NG_IGNORE(ckt); - - for (; model != NULL; model = NUMDnextModel(model)) { - output = model->NUMDoutputs; - for (inst = NUMDinstances(model); inst != NULL; - inst = NUMDnextInstance(inst)) { - - if (output->OUTPstats) { - ONEmemStats(file, inst->NUMDpDevice); - ONEcpuStats(file, inst->NUMDpDevice); - } - } - } -} diff --git a/src/spicelib/devices/numd/numdext.h b/src/spicelib/devices/numd/numdext.h deleted file mode 100644 index 39406ffca..000000000 --- a/src/spicelib/devices/numd/numdext.h +++ /dev/null @@ -1,25 +0,0 @@ -/********** -Copyright 1990 Regents of the University of California. All rights reserved. -Author: 1987 Karti Mayaram -**********/ - -#ifndef NUMDEXT_H -#define NUMDEXT_H - - -extern int NUMDacLoad(GENmodel *, CKTcircuit *); -extern int NUMDask(CKTcircuit *, GENinstance *, int, IFvalue *, IFvalue *); -extern int NUMDdelete(GENinstance *); -extern int NUMDgetic(GENmodel *, CKTcircuit *); -extern int NUMDload(GENmodel *, CKTcircuit *); -extern int NUMDmParam(int, IFvalue *, GENmodel *); -extern int NUMDparam(int, IFvalue *, GENinstance *, IFvalue *); -extern int NUMDpzLoad(GENmodel *, CKTcircuit *, SPcomplex *); -extern int NUMDsetup(SMPmatrix *, GENmodel *, CKTcircuit *, int *); -extern int NUMDtemp(GENmodel *, CKTcircuit *); -extern int NUMDtrunc(GENmodel *, CKTcircuit *, double *); - -extern void NUMDdump(GENmodel *, CKTcircuit *); -extern void NUMDacct(GENmodel *, CKTcircuit *, FILE *); - -#endif /* NUMDEXT_H */ diff --git a/src/spicelib/devices/numd/numdinit.c b/src/spicelib/devices/numd/numdinit.c deleted file mode 100644 index ba242600b..000000000 --- a/src/spicelib/devices/numd/numdinit.c +++ /dev/null @@ -1,76 +0,0 @@ -#include "ngspice/config.h" - -#include "ngspice/devdefs.h" - -#include "numditf.h" -#include "numdext.h" -#include "numdinit.h" - - -SPICEdev NUMDinfo = { - .DEVpublic = { - .name = "NUMD", - .description = "1D Numerical Junction Diode model", - .terms = &NUMDnSize, - .numNames = &NUMDnSize, - .termNames = NUMDnames, - .numInstanceParms = &NUMDpTSize, - .instanceParms = NUMDpTable, - .numModelParms = &NUMDmPTSize, - .modelParms = NUMDmPTable, - .flags = DEV_DEFAULT, - -#ifdef XSPICE - .cm_func = NULL, - .num_conn = 0, - .conn = NULL, - .num_param = 0, - .param = NULL, - .num_inst_var = 0, - .inst_var = NULL, -#endif - }, - - .DEVparam = NUMDparam, - .DEVmodParam = NUMDmParam, - .DEVload = NUMDload, - .DEVsetup = NUMDsetup, - .DEVunsetup = NULL, - .DEVpzSetup = NUMDsetup, - .DEVtemperature = NUMDtemp, - .DEVtrunc = NUMDtrunc, - .DEVfindBranch = NULL, - .DEVacLoad = NUMDacLoad, - .DEVaccept = NULL, - .DEVdestroy = NULL, - .DEVmodDelete = NULL, - .DEVdelete = NUMDdelete, - .DEVsetic = NULL, - .DEVask = NUMDask, - .DEVmodAsk = NULL, - .DEVpzLoad = NUMDpzLoad, - .DEVconvTest = NULL, - .DEVsenSetup = NULL, - .DEVsenLoad = NULL, - .DEVsenUpdate = NULL, - .DEVsenAcLoad = NULL, - .DEVsenPrint = NULL, - .DEVsenTrunc = NULL, - .DEVdisto = NULL, - .DEVnoise = NULL, - .DEVsoaCheck = NULL, - .DEVinstSize = &NUMDiSize, - .DEVmodSize = &NUMDmSize, - -#ifdef CIDER - .DEVdump = NUMDdump, - .DEVacct = NUMDacct, -#endif -}; - - -SPICEdev * -get_numd_info(void) -{ - return &NUMDinfo; -} diff --git a/src/spicelib/devices/numd/numdinit.h b/src/spicelib/devices/numd/numdinit.h deleted file mode 100644 index ac1ad767a..000000000 --- a/src/spicelib/devices/numd/numdinit.h +++ /dev/null @@ -1,13 +0,0 @@ -#ifndef _NUMDINIT_H -#define _NUMDINIT_H - -extern IFparm NUMDpTable[ ]; -extern IFparm NUMDmPTable[ ]; -extern char *NUMDnames[ ]; -extern int NUMDpTSize; -extern int NUMDmPTSize; -extern int NUMDnSize; -extern int NUMDiSize; -extern int NUMDmSize; - -#endif diff --git a/src/spicelib/devices/numd/numditf.h b/src/spicelib/devices/numd/numditf.h deleted file mode 100644 index 3475aa874..000000000 --- a/src/spicelib/devices/numd/numditf.h +++ /dev/null @@ -1,10 +0,0 @@ -/********** -Copyright 1991 Regents of the University of California. All rights reserved. -**********/ - -#ifndef DEV_NUMD -#define DEV_NUMD - -extern SPICEdev *get_numd_info(void); - -#endif diff --git a/src/spicelib/devices/numd/numdload.c b/src/spicelib/devices/numd/numdload.c deleted file mode 100644 index 1a01f28c5..000000000 --- a/src/spicelib/devices/numd/numdload.c +++ /dev/null @@ -1,389 +0,0 @@ -/********** -Copyright 1992 Regents of the University of California. All rights reserved. -Author: 1987 Kartikeya Mayaram, U. C. Berkeley CAD Group -**********/ - -#include "ngspice/ngspice.h" -#include "ngspice/devdefs.h" -#include "ngspice/cktdefs.h" -#include "numddefs.h" -#include "ngspice/numenum.h" -#include "ngspice/trandefs.h" -#include "ngspice/complex.h" -#include "ngspice/sperror.h" -#include "../../../ciderlib/oned/onedext.h" -#include "ngspice/cidersupt.h" -#include "ngspice/suffix.h" - - - -/* Forward declarations */ -int NUMDinitSmSig(NUMDinstance *); - -/* External Declarations */ -extern int ONEdcDebug; -extern int ONEtranDebug; -extern int ONEacDebug; - - -int -NUMDload(GENmodel *inModel, CKTcircuit *ckt) -{ - register NUMDmodel *model = (NUMDmodel *) inModel; - register NUMDinstance *inst; - register ONEdevice *pDevice; - double startTime, startTime2, totalTime, totalTime2; - double tol; /* temporary for tolerance calculations */ - double id = 0.0; - double ideq; - double idhat = 0.0; - double delVd; - double vd; /* current diode voltage */ - double gd = 0.0; - double xfact; - int check; - int i; - double deltaNorm[7]; - int devConverged = FALSE; - int numDevNonCon; - int deviceType; - int doInitSolve; - int doVoltPred; - char *initStateName; - - /* loop through all the diode models */ - for (; model != NULL; model = NUMDnextModel(model)) { - /* Do model things */ - FieldDepMobility = model->NUMDmodels->MODLfieldDepMobility; - Srh = model->NUMDmodels->MODLsrh; - Auger = model->NUMDmodels->MODLauger; - AvalancheGen = model->NUMDmodels->MODLavalancheGen; - MobDeriv = model->NUMDmethods->METHmobDeriv; - MaxIterations = model->NUMDmethods->METHitLim; - ONEdcDebug = model->NUMDoutputs->OUTPdcDebug; - ONEtranDebug = model->NUMDoutputs->OUTPtranDebug; - ONEacDebug = model->NUMDoutputs->OUTPacDebug; - deviceType = model->NUMDoptions->OPTNdeviceType; - doVoltPred = model->NUMDmethods->METHvoltPred; - - if (ckt->CKTmode & MODEINITPRED) { - /* compute normalized deltas and predictor coeff */ - if (!(ckt->CKTmode & MODEDCTRANCURVE)) { - model->NUMDpInfo->order = ckt->CKTorder; - model->NUMDpInfo->method = ckt->CKTintegrateMethod; - for (i = 0; i <= ckt->CKTmaxOrder; i++) { - deltaNorm[i] = ckt->CKTdeltaOld[i] / TNorm; - } - computeIntegCoeff(ckt->CKTintegrateMethod, ckt->CKTorder, - model->NUMDpInfo->intCoeff, deltaNorm); - computePredCoeff(ckt->CKTintegrateMethod, ckt->CKTorder, - model->NUMDpInfo->predCoeff, deltaNorm); - } - } else if (ckt->CKTmode & MODEINITTRAN) { - model->NUMDpInfo->order = ckt->CKTorder; - model->NUMDpInfo->method = ckt->CKTintegrateMethod; - for (i = 0; i <= ckt->CKTmaxOrder; i++) { - deltaNorm[i] = ckt->CKTdeltaOld[i] / TNorm; - } - computeIntegCoeff(ckt->CKTintegrateMethod, ckt->CKTorder, - model->NUMDpInfo->intCoeff, deltaNorm); - } - /* Now do instance things */ - for (inst = NUMDinstances(model); inst != NULL; - inst = NUMDnextInstance(inst)) { - - pDevice = inst->NUMDpDevice; - - totalTime = 0.0; - startTime = SPfrontEnd->IFseconds(); - - /* Get Temp.-Dep. Global Parameters */ - GLOBgetGlobals(&(inst->NUMDglobals)); - - /* - * this routine loads diodes for dc and transient analyses. - */ - pDevice->devStates = ckt->CKTstates; - /* - * initialization - */ - check = 1; - doInitSolve = FALSE; - initStateName = NULL; - if (ckt->CKTmode & MODEINITSMSIG) { - vd = *(ckt->CKTstate0 + inst->NUMDvoltage); - delVd = 0.0; - NUMDsetBCs(pDevice, vd); - } else if (ckt->CKTmode & MODEINITTRAN) { - *(ckt->CKTstate0 + inst->NUMDvoltage) = - *(ckt->CKTstate1 + inst->NUMDvoltage); - vd = *(ckt->CKTstate1 + inst->NUMDvoltage); - ONEsaveState(pDevice); - delVd = 0.0; - } else if ((ckt->CKTmode & MODEINITJCT) && - (ckt->CKTmode & MODETRANOP) && (ckt->CKTmode & MODEUIC)) { - doInitSolve = TRUE; - initStateName = inst->NUMDicFile; - vd = 0.0; - delVd = vd; - } else if ((ckt->CKTmode & MODEINITJCT) && inst->NUMDoff) { - doInitSolve = TRUE; - vd = 0.0; - delVd = vd; - } else if (ckt->CKTmode & MODEINITJCT) { - doInitSolve = TRUE; - initStateName = inst->NUMDicFile; - if (deviceType == OPTN_DIODE) { - vd = inst->NUMDtype * 0.5; - } else if (deviceType == OPTN_MOSCAP) { - vd = inst->NUMDtype * 0.8; - } else { - vd = 0.0; - } - delVd = vd; - } else if (ckt->CKTmode & MODEINITFIX && inst->NUMDoff) { - vd = 0.0; - delVd = vd; - } else { - if (ckt->CKTmode & MODEINITPRED) { - *(ckt->CKTstate0 + inst->NUMDvoltage) = - *(ckt->CKTstate1 + inst->NUMDvoltage); - *(ckt->CKTstate0 + inst->NUMDid) = - *(ckt->CKTstate1 + inst->NUMDid); - *(ckt->CKTstate0 + inst->NUMDconduct) = - *(ckt->CKTstate1 + inst->NUMDconduct); - /* compute the normalized deltas */ - if (!(ckt->CKTmode & MODEDCTRANCURVE)) { - /* no linear prediction on device voltages */ - vd = *(ckt->CKTstate1 + inst->NUMDvoltage); - ONEpredict(pDevice, model->NUMDpInfo); - } else { - if (doVoltPred) { - /* linear prediction */ - xfact=ckt->CKTdelta/ckt->CKTdeltaOld[1]; - vd = (1+xfact) * (*(ckt->CKTstate1 + inst->NUMDvoltage)) - - (xfact) * (*(ckt->CKTstate2 + inst->NUMDvoltage)); - } else { - vd = *(ckt->CKTstate1 + inst->NUMDvoltage); - } - } - } else { - vd = *(ckt->CKTrhsOld + inst->NUMDposNode) - - *(ckt->CKTrhsOld + inst->NUMDnegNode); - } - delVd = vd - *(ckt->CKTstate0 + inst->NUMDvoltage); - idhat = *(ckt->CKTstate0 + inst->NUMDid) + - *(ckt->CKTstate0 + inst->NUMDconduct) * delVd; - /* - * bypass if solution has not changed - */ - if ((ckt->CKTbypass) && pDevice->converged && - !(ckt->CKTmode & MODEINITPRED)) { - tol = ckt->CKTvoltTol + ckt->CKTreltol * - MAX(fabs(vd), fabs(*(ckt->CKTstate0 + inst->NUMDvoltage))); - if (fabs(delVd) < tol) { - tol = ckt->CKTreltol * - MAX(fabs(idhat), fabs(*(ckt->CKTstate0 + inst->NUMDid))) + - ckt->CKTabstol; - if (fabs(idhat - *(ckt->CKTstate0 + inst->NUMDid)) - < tol) { - vd = *(ckt->CKTstate0 + inst->NUMDvoltage); - id = *(ckt->CKTstate0 + inst->NUMDid); - gd = *(ckt->CKTstate0 + inst->NUMDconduct); - goto load; - } - } - } - /* - * limit new junction voltage - */ - if (deviceType == OPTN_DIODE) { - vd = inst->NUMDtype * limitJunctionVoltage(inst->NUMDtype * vd, - inst->NUMDtype * *(ckt->CKTstate0 + inst->NUMDvoltage), &check); - } else if (deviceType == OPTN_MOSCAP) { - vd = inst->NUMDtype * limitVgb(inst->NUMDtype * vd, - inst->NUMDtype * *(ckt->CKTstate0 + inst->NUMDvoltage), &check); - } else { - vd = inst->NUMDtype * limitResistorVoltage(inst->NUMDtype * vd, - inst->NUMDtype * *(ckt->CKTstate0 + inst->NUMDvoltage), &check); - } - delVd = vd - *(ckt->CKTstate0 + inst->NUMDvoltage); - } - if (doInitSolve) { - if (ONEdcDebug) { - printVoltages(stdout, model->NUMDmodName, inst->NUMDname, - deviceType, 1, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0); - } - startTime2 = SPfrontEnd->IFseconds(); - ONEequilSolve(pDevice); - totalTime2 = SPfrontEnd->IFseconds() - startTime2; - pDevice->pStats->totalTime[STAT_SETUP] += totalTime2; - pDevice->pStats->totalTime[STAT_DC] -= totalTime2; - - ONEbiasSolve(pDevice, MaxIterations, FALSE, NULL); - - *(ckt->CKTstate0 + inst->NUMDvoltage) = 0.0; - - if (initStateName != NULL) { - if (ONEreadState(pDevice, initStateName, 1, &vd, NULL ) < 0) { - fprintf(stderr, - "NUMDload: trouble reading state-file %s\n", initStateName); - } else { - NUMDsetBCs(pDevice, vd); - delVd = 0.0; - } - } - } - /* - * compute dc current and derivatives - */ - /* use the routines for numerical simulation */ - - if (ckt->CKTmode & (MODEDCOP | MODETRANOP | MODEDCTRANCURVE | MODEINITSMSIG)) { - numDevNonCon = 0; - inst->NUMDc11 = inst->NUMDy11r = inst->NUMDy11i = 0.0; - inst->NUMDsmSigAvail = FALSE; - devNonCon: - NUMDproject(pDevice, delVd); - if (ONEdcDebug) { - printVoltages(stdout, model->NUMDmodName, inst->NUMDname, - deviceType, 1, vd, delVd, 0.0, 0.0, 0.0, 0.0); - } - ONEbiasSolve(pDevice, MaxIterations, FALSE, NULL); - devConverged = pDevice->converged; - if (devConverged && finite(pDevice->rhsNorm)) { - /* Get the current and conductance information. */ - NUMDcurrent(pDevice, FALSE, NULL, &id); - NUMDconductance(pDevice, FALSE, NULL, &gd); - } else { - /* reduce the voltage step until converged */ - /* restore the boundary potential to previous value */ - NUMDsetBCs(pDevice, vd - delVd); - ONEstoreInitialGuess(pDevice); - ONEresetJacobian(pDevice); - delVd *= 0.5; - vd = delVd + *(ckt->CKTstate0 + inst->NUMDvoltage); - numDevNonCon++; - check = 1; - if (numDevNonCon > 10) { - printVoltages(stderr, model->NUMDmodName, inst->NUMDname, - deviceType, 1, vd, delVd, 0.0, 0.0, 0.0, 0.0); - fprintf(stderr, "*** Non-convergence during load ***\n"); - totalTime += SPfrontEnd->IFseconds() - startTime; - pDevice->pStats->totalTime[STAT_DC] += totalTime; - ckt->CKTtroubleElt = (GENinstance *) inst; - return (E_BADMATRIX); - } else { - goto devNonCon; - } - } - } - if ( (ckt->CKTmode & (MODETRAN | MODEAC | MODEINITSMSIG)) || - ((ckt->CKTmode & MODETRANOP) && (ckt->CKTmode & MODEUIC))) { - /* - * store small-signal parameters - */ - if ((!(ckt->CKTmode & MODETRANOP)) || (!(ckt->CKTmode & MODEUIC))) { - if (ckt->CKTmode & MODEINITSMSIG) { - totalTime = SPfrontEnd->IFseconds() - startTime; - pDevice->pStats->totalTime[STAT_DC] += totalTime; - startTime2 = SPfrontEnd->IFseconds(); - NUMDinitSmSig(inst); - pDevice->pStats->totalTime[STAT_AC] += - SPfrontEnd->IFseconds() - startTime2; - continue; - } else { - inst->NUMDsmSigAvail = FALSE; - } - /* - * transient analysis - */ - if (ckt->CKTmode & MODEINITPRED) { - NUMDsetBCs(pDevice, vd); - ONEstoreInitialGuess(pDevice); - } else { - NUMDupdate(pDevice, delVd, TRUE); - } - if (ONEtranDebug) { - printVoltages(stdout, model->NUMDmodName, inst->NUMDname, - deviceType, 1, vd, delVd, 0.0, 0.0, 0.0, 0.0); - } - - ONEbiasSolve(pDevice, 0, TRUE, model->NUMDpInfo); - - if (!finite(pDevice->rhsNorm)) { - totalTime += SPfrontEnd->IFseconds() - startTime; - pDevice->pStats->totalTime[STAT_TRAN] += totalTime; - ckt->CKTtroubleElt = (GENinstance *) inst; - return (E_BADMATRIX); - } - - pDevice->converged = devConverged = ONEdeviceConverged(pDevice); - - /* extract the current and conductance information */ - NUMDcurrent(pDevice, TRUE, model->NUMDpInfo->intCoeff, &id); - NUMDconductance(pDevice, TRUE, model->NUMDpInfo->intCoeff, &gd); - } - } - /* - * check convergence - */ - if ((!(ckt->CKTmode & MODEINITFIX)) || (!(inst->NUMDoff))) { - if (check == 1 || !devConverged) { - ckt->CKTnoncon++; - ckt->CKTtroubleElt = (GENinstance *) inst; - } else { - tol = ckt->CKTreltol * MAX(fabs(idhat), fabs(id)) + ckt->CKTabstol; - if (fabs(idhat - id) > tol) { - ckt->CKTnoncon++; - ckt->CKTtroubleElt = (GENinstance *) inst; - } - } - } - *(ckt->CKTstate0 + inst->NUMDvoltage) = vd; - *(ckt->CKTstate0 + inst->NUMDid) = id; - *(ckt->CKTstate0 + inst->NUMDconduct) = gd; - - load: - - /* - * load current vector - */ - - ideq = id - gd * vd; - *(ckt->CKTrhs + inst->NUMDnegNode) += ideq; - *(ckt->CKTrhs + inst->NUMDposNode) -= ideq; - - /* - * load matrix - */ - *(inst->NUMDposPosPtr) += gd; - *(inst->NUMDnegNegPtr) += gd; - *(inst->NUMDnegPosPtr) -= gd; - *(inst->NUMDposNegPtr) -= gd; - - totalTime += SPfrontEnd->IFseconds() - startTime; - if (ckt->CKTmode & MODETRAN) { - pDevice->pStats->totalTime[STAT_TRAN] += totalTime; - } else { - pDevice->pStats->totalTime[STAT_DC] += totalTime; - } - } - } - return (OK); -} - -int -NUMDinitSmSig(NUMDinstance *inst) -{ - SPcomplex yd; - double omega = NUMDmodPtr(inst)->NUMDmethods->METHomega; - - AcAnalysisMethod = SOR_ONLY; - (void) NUMDadmittance(inst->NUMDpDevice, omega, &yd); - inst->NUMDc11 = yd.imag / omega; - inst->NUMDy11r = yd.real; - inst->NUMDy11i = yd.imag; - inst->NUMDsmSigAvail = TRUE; - return (OK); -} diff --git a/src/spicelib/devices/numd/numdmpar.c b/src/spicelib/devices/numd/numdmpar.c deleted file mode 100644 index 18b0eb04e..000000000 --- a/src/spicelib/devices/numd/numdmpar.c +++ /dev/null @@ -1,32 +0,0 @@ -/********** -Copyright 1992 Regents of the University of California. All rights reserved. -Author: 1987 Kartikeya Mayaram, U. C. Berkeley CAD Group -**********/ - -/* - * This routine sets model parameters for NUMDs in the circuit. - */ - -#include "ngspice/ngspice.h" -#include "ngspice/const.h" -#include "ngspice/ifsim.h" -#include "numddefs.h" -#include "ngspice/sperror.h" -#include "ngspice/suffix.h" - -int -NUMDmParam(int param, IFvalue *value, GENmodel *inModel) -{ - NG_IGNORE(value); - NG_IGNORE(inModel); - - switch (param) { - case NUMD_MOD_NUMD: - /* no action - already know it is a 1d-numerical diode, but this */ - /* makes life easier for spice-2 like parsers */ - break; - default: - return (E_BADPARM); - } - return (OK); -} diff --git a/src/spicelib/devices/numd/numdparm.c b/src/spicelib/devices/numd/numdparm.c deleted file mode 100644 index 5ab8c3ff3..000000000 --- a/src/spicelib/devices/numd/numdparm.c +++ /dev/null @@ -1,44 +0,0 @@ -/********** -Copyright 1992 Regents of the University of California. All rights reserved. -Author: 1987 Kartikeya Mayaram, U. C. Berkeley CAD Group -**********/ - -#include "ngspice/ngspice.h" -#include "ngspice/ifsim.h" -#include "ngspice/const.h" -#include "numddefs.h" -#include "ngspice/sperror.h" -#include "ngspice/suffix.h" - -int -NUMDparam(int param, IFvalue *value, GENinstance *inInst, IFvalue *select) -{ - NUMDinstance *inst = (NUMDinstance *) inInst; - - NG_IGNORE(select); - - switch (param) { - case NUMD_AREA: - inst->NUMDarea = value->rValue; - inst->NUMDareaGiven = TRUE; - break; - case NUMD_OFF: - inst->NUMDoff = TRUE; - break; - case NUMD_IC_FILE: - inst->NUMDicFile = value->sValue; - inst->NUMDicFileGiven = TRUE; - break; - case NUMD_PRINT: - inst->NUMDprint = value->iValue; - inst->NUMDprintGiven = TRUE; - break; - case NUMD_TEMP: - inst->NUMDtemp = value->rValue + CONSTCtoK; - inst->NUMDtempGiven = TRUE; - break; - default: - return (E_BADPARM); - } - return (OK); -} diff --git a/src/spicelib/devices/numd/numdpzld.c b/src/spicelib/devices/numd/numdpzld.c deleted file mode 100644 index 408d3b0ff..000000000 --- a/src/spicelib/devices/numd/numdpzld.c +++ /dev/null @@ -1,61 +0,0 @@ -/********** -Copyright 1992 Regents of the University of California. All rights reserved. -Author: 1987 Kartikeya Mayaram, U. C. Berkeley CAD Group -**********/ - -#include "ngspice/ngspice.h" -#include "ngspice/cktdefs.h" -#include "ngspice/complex.h" -#include "ngspice/sperror.h" -#include "numddefs.h" -#include "../../../ciderlib/oned/onedext.h" -#include "ngspice/cidersupt.h" -#include "ngspice/suffix.h" - -/* External Declarations */ -extern int ONEacDebug; - -int -NUMDpzLoad(GENmodel *inModel, CKTcircuit *ckt, SPcomplex *s) -{ - register NUMDmodel *model = (NUMDmodel *) inModel; - register NUMDinstance *inst; - SPcomplex y; - double startTime; - - NG_IGNORE(ckt); - - /* loop through all the diode models */ - for (; model != NULL; model = NUMDnextModel(model)) { - FieldDepMobility = model->NUMDmodels->MODLfieldDepMobility; - Srh = model->NUMDmodels->MODLsrh; - Auger = model->NUMDmodels->MODLauger; - AvalancheGen = model->NUMDmodels->MODLavalancheGen; - AcAnalysisMethod = model->NUMDmethods->METHacAnalysisMethod; - MobDeriv = model->NUMDmethods->METHmobDeriv; - ONEacDebug = model->NUMDoutputs->OUTPacDebug; - - for (inst = NUMDinstances(model); inst != NULL; - inst = NUMDnextInstance(inst)) { - - startTime = SPfrontEnd->IFseconds(); - /* Get Temp.-Dep. Global Parameters */ - GLOBgetGlobals(&(inst->NUMDglobals)); - - NUMDys(inst->NUMDpDevice, s, &y); - - *(inst->NUMDposPosPtr) += y.real; - *(inst->NUMDposPosPtr + 1) += y.imag; - *(inst->NUMDnegNegPtr) += y.real; - *(inst->NUMDnegNegPtr + 1) += y.imag; - *(inst->NUMDnegPosPtr) -= y.real; - *(inst->NUMDnegPosPtr + 1) -= y.imag; - *(inst->NUMDposNegPtr) -= y.real; - *(inst->NUMDposNegPtr + 1) -= y.imag; - - inst->NUMDpDevice->pStats->totalTime[STAT_AC] += - SPfrontEnd->IFseconds() - startTime; - } - } - return (OK); -} diff --git a/src/spicelib/devices/numd/numdset.c b/src/spicelib/devices/numd/numdset.c deleted file mode 100644 index 63748b2e0..000000000 --- a/src/spicelib/devices/numd/numdset.c +++ /dev/null @@ -1,224 +0,0 @@ -/********** -Copyright 1991 Regents of the University of California. All rights reserved. -Author: 1987 Kartikeya Mayaram, U. C. Berkeley CAD Group -**********/ - -#include "ngspice/ngspice.h" -#include "ngspice/cktdefs.h" -#include "ngspice/smpdefs.h" -#include "numddefs.h" -#include "ngspice/numconst.h" -#include "ngspice/numenum.h" -#include "ngspice/sperror.h" -#include "../../../ciderlib/oned/onedext.h" -#include "ngspice/cidersupt.h" -#include "ngspice/ciderinp.h" -#include "ngspice/suffix.h" -#include "ngspice/meshext.h" - -#define TSCALLOC(var, size, type)\ -if (size && (var =(type *)calloc(1, (unsigned)(size)*sizeof(type))) == NULL) {\ - return(E_NOMEM);\ -} - - -int -NUMDsetup(SMPmatrix *matrix, GENmodel *inModel, CKTcircuit *ckt, int *states) -/* - * load the structure with those pointers needed later for fast matrix - * loading - */ -{ - register NUMDmodel *model = (NUMDmodel *) inModel; - register NUMDinstance *inst; - METHcard *methods; - MODLcard *models; - OPTNcard *options; - OUTPcard *outputs; - int error; - int xMeshSize; - ONEdevice *pDevice; - ONEcoord *xCoordList = NULL; - ONEdomain *domainList = NULL; - ONEmaterial *pM, *pMaterial = NULL, *materialList = NULL; - DOPprofile *profileList = NULL; - DOPtable *dopTableList = NULL; - double startTime; - - - /* loop through all the models */ - for (; model != NULL; model = NUMDnextModel(model)) { - if (!model->NUMDpInfo) { - TSCALLOC(model->NUMDpInfo, 1, ONEtranInfo); - } - methods = model->NUMDmethods; - if (!methods) { - TSCALLOC(methods, 1, METHcard); - model->NUMDmethods = methods; - } - models = model->NUMDmodels; - if (!models) { - TSCALLOC(models, 1, MODLcard); - model->NUMDmodels = models; - } - options = model->NUMDoptions; - if (!options) { - TSCALLOC(options, 1, OPTNcard); - model->NUMDoptions = options; - } - outputs = model->NUMDoutputs; - if (!outputs) { - TSCALLOC(outputs, 1, OUTPcard); - model->NUMDoutputs = outputs; - } - if (!methods->METHvoltPredGiven) { - methods->METHvoltPred = FALSE; - } - if (!methods->METHmobDerivGiven) { - methods->METHmobDeriv = TRUE; - } - if (!methods->METHoneCarrierGiven) { - methods->METHoneCarrier = FALSE; - } - if (!methods->METHacAnalysisMethodGiven) { - methods->METHacAnalysisMethod = SOR; - } - if (!methods->METHdabstolGiven) { - methods->METHdabstol = DABSTOL1D; - } - if (!methods->METHdreltolGiven) { - methods->METHdreltol = ckt->CKTreltol; - } - if (!methods->METHitLimGiven) { - methods->METHitLim = 20; - } - if (!methods->METHomegaGiven || methods->METHomega <= 0.0) { - methods->METHomega = 2.0 * M_PI /* radians/sec */ ; - } - if (!options->OPTNdefaGiven || options->OPTNdefa <= 0.0) { - options->OPTNdefa = 1.0e4 /* cm^2 */ ; - } - if (!options->OPTNdeviceTypeGiven) { - options->OPTNdeviceType = OPTN_DIODE; - } - if (!options->OPTNicFileGiven) { - options->OPTNicFile = NULL; - options->OPTNunique = FALSE; /* Can't form a unique name. */ - } - if (!options->OPTNuniqueGiven) { - options->OPTNunique = FALSE; - } - - /* Set up the rest of the card lists */ - if ((error = MODLsetup(model->NUMDmodels)) != 0) - return (error); - BandGapNarrowing = models->MODLbandGapNarrowing; - ConcDepLifetime = models->MODLconcDepLifetime; - TempDepMobility = models->MODLtempDepMobility; - ConcDepMobility = models->MODLconcDepMobility; - - if ((error = OUTPsetup(model->NUMDoutputs)) != 0) - return (error); - if ((error = MATLsetup(model->NUMDmaterials, &materialList)) != 0) - return (error); - if ((error = MOBsetup(model->NUMDmobility, materialList)) != 0) - return (error); - if ((error = MESHsetup('x', model->NUMDxMeshes, &xCoordList, &xMeshSize)) != 0) - return (error); - if ((error = DOMNsetup(model->NUMDdomains, &domainList, - xCoordList, NULL, materialList)) != 0) - return (error); - if ((error = BDRYsetup(model->NUMDboundaries, - xCoordList, NULL, domainList)) != 0) - return (error); - if ((error = CONTsetup(model->NUMDcontacts, NULL)) != 0) - return (error); - if ((error = DOPsetup(model->NUMDdopings, &profileList, - &dopTableList, xCoordList, NULL)) != 0) - return (error); - model->NUMDmatlInfo = materialList; - model->NUMDprofiles = profileList; - model->NUMDdopTables = dopTableList; - - /* loop through all the instances of the model */ - for (inst = NUMDinstances(model); inst != NULL; - inst = NUMDnextInstance(inst)) { - - startTime = SPfrontEnd->IFseconds(); - - if ((!inst->NUMDprintGiven)) { - inst->NUMDprint = 0; - } else if (inst->NUMDprint <= 0) { - inst->NUMDprint = 1; - } - if ((!inst->NUMDicFileGiven)) { - if (options->OPTNunique) { - inst->NUMDicFile = tprintf("%s.%s", options->OPTNicFile, inst->NUMDname); - } else if (options->OPTNicFile != NULL) { - inst->NUMDicFile = tprintf("%s", options->OPTNicFile); - } else { - inst->NUMDicFile = NULL; - } - } - inst->NUMDstate = *states; - *states += NUMDnumStates; - - if (!inst->NUMDpDevice) { - /* Assign the mesh info to each instance. */ - TSCALLOC(pDevice, 1, ONEdevice); - TSCALLOC(pDevice->pStats, 1, ONEstats); - pDevice->name = inst->NUMDname; - pDevice->solverType = SLV_NONE; - pDevice->numNodes = xMeshSize; - pDevice->abstol = methods->METHdabstol; - pDevice->reltol = methods->METHdreltol; - pDevice->rhsImag = NULL; - TSCALLOC(pDevice->elemArray, pDevice->numNodes, ONEelem *); - - /* Create a copy of material data that can change with temperature. */ - pDevice->pMaterials = NULL; - for (pM = materialList; pM != NULL; pM = pM->next) { - if (pDevice->pMaterials == NULL) { - TSCALLOC(pMaterial, 1, ONEmaterial); - pDevice->pMaterials = pMaterial; - } else { - TSCALLOC(pMaterial->next, 1, ONEmaterial); - pMaterial = pMaterial->next; - } - /* Copy everything, then fix the incorrect pointer. */ - memcpy(pMaterial, pM, sizeof(ONEmaterial)); - pMaterial->next = NULL; - } - - /* generate the mesh structure for the device */ - ONEbuildMesh(pDevice, xCoordList, domainList, pDevice->pMaterials); - - /* store the device info in the instance */ - inst->NUMDpDevice = pDevice; - } - /* Now update the state pointers. */ - ONEgetStatePointers(inst->NUMDpDevice, states); - - /* Wipe out statistics from previous runs (if any). */ - memset(inst->NUMDpDevice->pStats, 0, sizeof(ONEstats)); - - inst->NUMDpDevice->pStats->totalTime[STAT_SETUP] += - SPfrontEnd->IFseconds() - startTime; - - /* macro to make elements with built in test for out of memory */ -#define TSTALLOC(ptr,first,second) \ -do { if ((inst->ptr = SMPmakeElt(matrix, inst->first, inst->second)) == NULL){\ - return(E_NOMEM);\ -} } while(0) - - TSTALLOC(NUMDposPosPtr, NUMDposNode, NUMDposNode); - TSTALLOC(NUMDnegNegPtr, NUMDnegNode, NUMDnegNode); - TSTALLOC(NUMDnegPosPtr, NUMDnegNode, NUMDposNode); - TSTALLOC(NUMDposNegPtr, NUMDposNode, NUMDnegNode); - } - /* Clean up lists */ - killCoordInfo(xCoordList); - killDomainInfo(domainList); - } - return (OK); -} diff --git a/src/spicelib/devices/numd/numdtemp.c b/src/spicelib/devices/numd/numdtemp.c deleted file mode 100644 index 365bc008c..000000000 --- a/src/spicelib/devices/numd/numdtemp.c +++ /dev/null @@ -1,129 +0,0 @@ -/********** -Copyright 1992 Regents of the University of California. All rights reserved. -Author: 1987 Kartikeya Mayaram, U. C. Berkeley CAD Group -Author: 1992 David A. Gates, U. C. Berkeley CAD Group -**********/ - -#include "ngspice/ngspice.h" -#include "ngspice/cktdefs.h" -#include "numddefs.h" -#include "ngspice/numenum.h" -#include "ngspice/carddefs.h" -#include "ngspice/sperror.h" -#include "../../../ciderlib/oned/onedext.h" -#include "ngspice/cidersupt.h" -#include "ngspice/suffix.h" - - -int -NUMDtemp(GENmodel *inModel, CKTcircuit *ckt) -/* - * perform the temperature update to the diode - */ -{ - register NUMDmodel *model = (NUMDmodel *) inModel; - register NUMDinstance *inst; - METHcard *methods; - MODLcard *models; - OPTNcard *options; - OUTPcard *outputs; - ONEmaterial *pM, *pMaterial, *pNextMaterial; - double startTime; - - - /* loop through all the diode models */ - for (; model != NULL; model = NUMDnextModel(model)) { - methods = model->NUMDmethods; - models = model->NUMDmodels; - options = model->NUMDoptions; - outputs = model->NUMDoutputs; - - if (!options->OPTNtnomGiven) { - options->OPTNtnom = ckt->CKTnomTemp; - } - for (pM = model->NUMDmatlInfo; pM != NULL; pM = pM->next) { - pM->tnom = options->OPTNtnom; - } - - BandGapNarrowing = models->MODLbandGapNarrowing; - ConcDepLifetime = models->MODLconcDepLifetime; - TempDepMobility = models->MODLtempDepMobility; - ConcDepMobility = models->MODLconcDepMobility; - - for (inst = NUMDinstances(model); inst != NULL; - inst = NUMDnextInstance(inst)) { - - startTime = SPfrontEnd->IFseconds(); - - if (!inst->NUMDtempGiven) { - inst->NUMDtemp = ckt->CKTtemp; - } - if (!inst->NUMDareaGiven || inst->NUMDarea <= 0.0) { - inst->NUMDarea = 1.0; - } - inst->NUMDpDevice->area = inst->NUMDarea * options->OPTNdefa; - - /* Compute and save globals for this instance. */ - GLOBcomputeGlobals(&(inst->NUMDglobals), inst->NUMDtemp); - if (outputs->OUTPglobals) { - GLOBprnGlobals(stdout, &(inst->NUMDglobals)); - } - /* Calculate new sets of material parameters. */ - pM = model->NUMDmatlInfo; - pMaterial = inst->NUMDpDevice->pMaterials; - for (; pM != NULL; pM = pM->next, pMaterial = pMaterial->next) { - - /* Copy the original values, then fix the incorrect pointer. */ - pNextMaterial = pMaterial->next; - memcpy(pMaterial, pM, sizeof(ONEmaterial)); - pMaterial->next = pNextMaterial; - - /* Now do the temperature dependence. */ - MATLtempDep(pMaterial, pMaterial->tnom); - if (outputs->OUTPmaterial) { - printMaterialInfo(pMaterial); - } - } - - /* Assign doping to the mesh. */ - ONEsetDoping(inst->NUMDpDevice, model->NUMDprofiles, - model->NUMDdopTables); - - /* Assign other physical parameters to the mesh. */ - ONEsetup(inst->NUMDpDevice); - - /* Assign boundary condition parameters. */ - ONEsetBCparams(inst->NUMDpDevice, model->NUMDboundaries, - model->NUMDcontacts); - - /* Normalize everything. */ - ONEnormalize(inst->NUMDpDevice); - - /* Find the device's polarity type. */ - switch (options->OPTNdeviceType) { - case OPTN_DIODE: - if (inst->NUMDpDevice->elemArray[1] - ->pNodes[0]->netConc < 0.0) { - inst->NUMDtype = PN; - } else { - inst->NUMDtype = NP; - } - break; - case OPTN_MOSCAP: - if (inst->NUMDpDevice->elemArray[inst->NUMDpDevice->numNodes - 1] - ->pNodes[1]->netConc < 0.0) { - inst->NUMDtype = PN; - } else { - inst->NUMDtype = NP; - } - break; - default: - inst->NUMDtype = PN; - break; - } - inst->NUMDpDevice->pStats->totalTime[STAT_SETUP] += - SPfrontEnd->IFseconds() - startTime; - } - } - return (OK); -} diff --git a/src/spicelib/devices/numd/numdtrun.c b/src/spicelib/devices/numd/numdtrun.c deleted file mode 100644 index 901995829..000000000 --- a/src/spicelib/devices/numd/numdtrun.c +++ /dev/null @@ -1,44 +0,0 @@ -/********** -Copyright 1992 Regents of the University of California. All rights reserved. -Author: 1987 Kartikeya Mayaram, U. C. Berkeley CAD Group -**********/ - -#include "ngspice/ngspice.h" -#include "ngspice/cktdefs.h" -#include "numddefs.h" -#include "ngspice/sperror.h" -#include "../../../ciderlib/oned/onedext.h" -#include "ngspice/suffix.h" -#include "ngspice/cidersupt.h" - - - -int -NUMDtrunc(GENmodel *inModel, CKTcircuit *ckt, double *timeStep) -{ - register NUMDmodel *model = (NUMDmodel *) inModel; - register NUMDinstance *inst; - double deltaNew; - double deltaNorm[7]; - double startTime; - int i; - - for (i = 0; i <= ckt->CKTmaxOrder; i++) { - deltaNorm[i] = ckt->CKTdeltaOld[i] / TNorm; - } - for (; model != NULL; model = NUMDnextModel(model)) { - model->NUMDpInfo->order = ckt->CKTorder; - model->NUMDpInfo->delta = deltaNorm; - model->NUMDpInfo->lteCoeff = computeLTECoeff(model->NUMDpInfo); - for (inst = NUMDinstances(model); inst != NULL; - inst = NUMDnextInstance(inst)) { - - startTime = SPfrontEnd->IFseconds(); - deltaNew = ONEtrunc(inst->NUMDpDevice, model->NUMDpInfo, ckt->CKTdelta); - *timeStep = MIN(*timeStep, deltaNew); - inst->NUMDpDevice->pStats->totalTime[STAT_TRAN] += - SPfrontEnd->IFseconds() - startTime; - } - } - return (OK); -} diff --git a/src/spicelib/devices/numd2/Makefile.am b/src/spicelib/devices/numd2/Makefile.am deleted file mode 100644 index f6ef98b6a..000000000 --- a/src/spicelib/devices/numd2/Makefile.am +++ /dev/null @@ -1,29 +0,0 @@ -## Process this file with automake to produce Makefile.in - -noinst_LTLIBRARIES = libnumd2.la - -libnumd2_la_SOURCES = \ - nud2.c \ - nud2acld.c \ - nud2ask.c \ - numd2def.h \ - nud2del.c \ - nud2dump.c \ - numd2ext.h \ - numd2init.c \ - numd2init.h \ - numd2itf.h \ - nud2load.c \ - nud2mpar.c \ - nud2parm.c \ - nud2pzld.c \ - nud2set.c \ - nud2temp.c \ - nud2trun.c - - - -AM_CPPFLAGS = @AM_CPPFLAGS@ -I$(top_srcdir)/src/include -AM_CFLAGS = $(STATIC) - -MAINTAINERCLEANFILES = Makefile.in diff --git a/src/spicelib/devices/numd2/nud2.c b/src/spicelib/devices/numd2/nud2.c deleted file mode 100644 index 87674dd74..000000000 --- a/src/spicelib/devices/numd2/nud2.c +++ /dev/null @@ -1,59 +0,0 @@ -/********** -Copyright 1992 Regents of the University of California. All rights reserved. -Author: 1987 Kartikeya Mayaram, U. C. Berkeley CAD Group -**********/ - -#include "ngspice/ngspice.h" -#include "ngspice/devdefs.h" -#include "numd2def.h" -#include "ngspice/suffix.h" - -/* - * This file defines the 2d Numerical Diode data structures that are - * available to the next level(s) up the calling hierarchy - */ - -IFparm NUMD2pTable[] = { /* parameters */ - IP("off", NUMD2_OFF, IF_FLAG, "Initially off"), - IP("ic.file", NUMD2_IC_FILE, IF_STRING, "Initial condition file"), - IOP("w", NUMD2_WIDTH, IF_REAL, "Width factor"), - IOP("area", NUMD2_AREA, IF_REAL, "Area factor"), - IP("save", NUMD2_PRINT, IF_INTEGER, "Save solutions"), - IPR("print", NUMD2_PRINT, IF_INTEGER, "Print solutions"), - OP("vd", NUMD2_VD, IF_REAL, "Voltage"), - OPR("voltage", NUMD2_VD, IF_REAL, "Voltage"), - OP("id", NUMD2_ID, IF_REAL, "Current"), - OPR("current", NUMD2_ID, IF_REAL, "Current"), - OP("g11", NUMD2_G11, IF_REAL, "Conductance"), - OPR("conductance", NUMD2_G11, IF_REAL, "Conductance"), - OP("c11", NUMD2_C11, IF_REAL, "Capacitance"), - OPR("capacitance", NUMD2_C11, IF_REAL, "Capacitance"), - OP("y11", NUMD2_Y11, IF_COMPLEX, "Admittance"), - OPU("g12", NUMD2_G12, IF_REAL, "Conductance"), - OPU("c12", NUMD2_C12, IF_REAL, "Capacitance"), - OPU("y12", NUMD2_Y12, IF_COMPLEX, "Admittance"), - OPU("g21", NUMD2_G21, IF_REAL, "Conductance"), - OPU("c21", NUMD2_C21, IF_REAL, "Capacitance"), - OPU("y21", NUMD2_Y21, IF_COMPLEX, "Admittance"), - OPU("g22", NUMD2_G22, IF_REAL, "Conductance"), - OPU("c22", NUMD2_C22, IF_REAL, "Capacitance"), - OPU("y22", NUMD2_Y22, IF_COMPLEX, "Admittance"), - IOP("temp", NUMD2_TEMP, IF_REAL, "Instance Temperature") -}; - -IFparm NUMD2mPTable[] = { /* model parameters */ - /* numerical-device models no longer have parameters */ - /* one is left behind to keep the table from being empty */ - IP("numd", NUMD2_MOD_NUMD, IF_FLAG, "Numerical 2d-Diode Model") -}; - -char *NUMD2names[] = { - "Anode", - "Cathode" -}; - -int NUMD2nSize = NUMELEMS(NUMD2names); -int NUMD2pTSize = NUMELEMS(NUMD2pTable); -int NUMD2mPTSize = NUMELEMS(NUMD2mPTable); -int NUMD2iSize = sizeof(NUMD2instance); -int NUMD2mSize = sizeof(NUMD2model); diff --git a/src/spicelib/devices/numd2/nud2acld.c b/src/spicelib/devices/numd2/nud2acld.c deleted file mode 100644 index d0f05583d..000000000 --- a/src/spicelib/devices/numd2/nud2acld.c +++ /dev/null @@ -1,75 +0,0 @@ -/********** -Copyright 1992 Regents of the University of California. All rights reserved. -Author: 1987 Kartikeya Mayaram, U. C. Berkeley CAD Group -**********/ - -/* - * Function to load the COMPLEX circuit matrix using the small signal - * parameters saved during a previous DC operating point analysis. - */ - -#include "ngspice/ngspice.h" -#include "ngspice/cktdefs.h" -#include "numd2def.h" -#include "ngspice/sperror.h" -#include "ngspice/complex.h" -#include "../../../ciderlib/twod/twoddefs.h" -#include "../../../ciderlib/twod/twodext.h" -#include "ngspice/cidersupt.h" -#include "ngspice/numglobs.h" -#include "ngspice/suffix.h" - - -int -NUMD2acLoad(GENmodel *inModel, CKTcircuit *ckt) -{ - register NUMD2model *model = (NUMD2model *) inModel; - register NUMD2instance *inst; - SPcomplex y; - double startTime; - - /* loop through all the diode models */ - for (; model != NULL; model = NUMD2nextModel(model)) { - FieldDepMobility = model->NUMD2models->MODLfieldDepMobility; - TransDepMobility = model->NUMD2models->MODLtransDepMobility; - SurfaceMobility = model->NUMD2models->MODLsurfaceMobility; - Srh = model->NUMD2models->MODLsrh; - Auger = model->NUMD2models->MODLauger; - AvalancheGen = model->NUMD2models->MODLavalancheGen; - OneCarrier = model->NUMD2methods->METHoneCarrier; - AcAnalysisMethod = model->NUMD2methods->METHacAnalysisMethod; - MobDeriv = model->NUMD2methods->METHmobDeriv; - TWOacDebug = model->NUMD2outputs->OUTPacDebug; - - for (inst = NUMD2instances(model); inst != NULL; - inst = NUMD2nextInstance(inst)) { - - startTime = SPfrontEnd->IFseconds(); - /* Get Temp.-Dep. Global Parameters */ - GLOBgetGlobals(&(inst->NUMD2globals)); - - model->NUMD2methods->METHacAnalysisMethod = - NUMD2admittance(inst->NUMD2pDevice, ckt->CKTomega, &y); - - *(inst->NUMD2posPosPtr) += y.real; - *(inst->NUMD2posPosPtr + 1) += y.imag; - *(inst->NUMD2negNegPtr) += y.real; - *(inst->NUMD2negNegPtr + 1) += y.imag; - *(inst->NUMD2negPosPtr) -= y.real; - *(inst->NUMD2negPosPtr + 1) -= y.imag; - *(inst->NUMD2posNegPtr) -= y.real; - *(inst->NUMD2posNegPtr + 1) -= y.imag; - if (ckt->CKTomega != 0.0) { - inst->NUMD2c11 = y.imag / ckt->CKTomega; - } else { - inst->NUMD2c11 = 0.0; /* XXX What else can be done?! */ - } - inst->NUMD2y11r = y.real; - inst->NUMD2y11i = y.imag; - inst->NUMD2smSigAvail = TRUE; - inst->NUMD2pDevice->pStats->totalTime[STAT_AC] += - SPfrontEnd->IFseconds() - startTime; - } - } - return (OK); -} diff --git a/src/spicelib/devices/numd2/nud2ask.c b/src/spicelib/devices/numd2/nud2ask.c deleted file mode 100644 index 178ce00ac..000000000 --- a/src/spicelib/devices/numd2/nud2ask.c +++ /dev/null @@ -1,119 +0,0 @@ -/********** -Copyright 1990 Regents of the University of California. All rights reserved. -Author: 1987 Thomas L. Quarles -**********/ - -#include "ngspice/ngspice.h" -#include "ngspice/const.h" -#include "ngspice/ifsim.h" -#include "ngspice/cktdefs.h" -#include "ngspice/devdefs.h" -#include "numd2def.h" -#include "ngspice/sperror.h" -#include "ngspice/suffix.h" - - -/* Check out this one */ -extern int NUMD2initSmSig(NUMD2instance *); - -/* ARGSUSED */ -int -NUMD2ask(CKTcircuit *ckt, GENinstance *inInst, int which, IFvalue *value, IFvalue *select) -{ - NUMD2instance *inst = (NUMD2instance *) inInst; - - NG_IGNORE(select); - - switch (which) { - case NUMD2_WIDTH: - value->rValue = inst->NUMD2width; - return (OK); - case NUMD2_AREA: - value->rValue = inst->NUMD2area; - return (OK); - case NUMD2_TEMP: - value->rValue = inst->NUMD2temp - CONSTCtoK; - return (OK); - case NUMD2_VD: - value->rValue = *(ckt->CKTstate0 + inst->NUMD2voltage); - return (OK); - case NUMD2_ID: - value->rValue = *(ckt->CKTstate0 + inst->NUMD2id); - return (OK); - case NUMD2_G11: - value->rValue = *(ckt->CKTstate0 + inst->NUMD2conduct); - return (OK); - case NUMD2_G12: - value->rValue = -*(ckt->CKTstate0 + inst->NUMD2conduct); - return (OK); - case NUMD2_G21: - value->rValue = -*(ckt->CKTstate0 + inst->NUMD2conduct); - return (OK); - case NUMD2_G22: - value->rValue = *(ckt->CKTstate0 + inst->NUMD2conduct); - return (OK); - case NUMD2_C11: - if (!inst->NUMD2smSigAvail - && ckt->CKTcurrentAnalysis != DOING_TRAN) { - NUMD2initSmSig(inst); - } - value->rValue = inst->NUMD2c11; - return (OK); - case NUMD2_C12: - if (!inst->NUMD2smSigAvail - && ckt->CKTcurrentAnalysis != DOING_TRAN) { - NUMD2initSmSig(inst); - } - value->rValue = -inst->NUMD2c11; - return (OK); - case NUMD2_C21: - if (!inst->NUMD2smSigAvail - && ckt->CKTcurrentAnalysis != DOING_TRAN) { - NUMD2initSmSig(inst); - } - value->rValue = -inst->NUMD2c11; - return (OK); - case NUMD2_C22: - if (!inst->NUMD2smSigAvail - && ckt->CKTcurrentAnalysis != DOING_TRAN) { - NUMD2initSmSig(inst); - } - value->rValue = inst->NUMD2c11; - return (OK); - case NUMD2_Y11: - if (!inst->NUMD2smSigAvail - && ckt->CKTcurrentAnalysis != DOING_TRAN) { - NUMD2initSmSig(inst); - } - value->cValue.real = inst->NUMD2y11r; - value->cValue.imag = inst->NUMD2y11i; - return (OK); - case NUMD2_Y12: - if (!inst->NUMD2smSigAvail - && ckt->CKTcurrentAnalysis != DOING_TRAN) { - NUMD2initSmSig(inst); - } - value->cValue.real = -inst->NUMD2y11r; - value->cValue.imag = -inst->NUMD2y11i; - return (OK); - case NUMD2_Y21: - if (!inst->NUMD2smSigAvail - && ckt->CKTcurrentAnalysis != DOING_TRAN) { - NUMD2initSmSig(inst); - } - value->cValue.real = -inst->NUMD2y11r; - value->cValue.imag = -inst->NUMD2y11i; - return (OK); - case NUMD2_Y22: - if (!inst->NUMD2smSigAvail - && ckt->CKTcurrentAnalysis != DOING_TRAN) { - NUMD2initSmSig(inst); - } - value->cValue.real = inst->NUMD2y11r; - value->cValue.imag = inst->NUMD2y11i; - return (OK); - default: - return (E_BADPARM); - } - /* NOTREACHED */ -} diff --git a/src/spicelib/devices/numd2/nud2del.c b/src/spicelib/devices/numd2/nud2del.c deleted file mode 100644 index 42d0ffdb8..000000000 --- a/src/spicelib/devices/numd2/nud2del.c +++ /dev/null @@ -1,22 +0,0 @@ -/********** -Copyright 1992 Regents of the University of California. All rights reserved. -Author: 1987 Kartikeya Mayaram, U. C. Berkeley CAD Group -**********/ - -#include "ngspice/ngspice.h" -#include "numd2def.h" -#include "../../../ciderlib/twod/twoddefs.h" -#include "../../../ciderlib/twod/twodext.h" -#include "ngspice/sperror.h" -#include "ngspice/suffix.h" - - -int -NUMD2delete(GENinstance *gen_inst) -{ - NUMD2instance *inst = (NUMD2instance *) gen_inst; - - TWOdestroy(inst->NUMD2pDevice); - - return OK; -} diff --git a/src/spicelib/devices/numd2/nud2dump.c b/src/spicelib/devices/numd2/nud2dump.c deleted file mode 100644 index 612bd16db..000000000 --- a/src/spicelib/devices/numd2/nud2dump.c +++ /dev/null @@ -1,162 +0,0 @@ -/********** -Copyright 1992 Regents of the University of California. All rights reserved. -Author: 1987 Kartikeya Mayaram, U. C. Berkeley CAD Group -Author: 1991 David A. Gates, U. C. Berkeley CAD Group -**********/ - -/* - * This is a simple routine to dump the internal device states. It produces - * states for .OP, .DC, & .TRAN simulations. - */ - -#include "ngspice/ngspice.h" -#include "ngspice/cktdefs.h" -#include "numd2def.h" -#include "../../../ciderlib/twod/twoddefs.h" -#include "../../../ciderlib/twod/twodext.h" -#include "ngspice/cidersupt.h" -#include "ngspice/suffix.h" - - -/* Forward Declarations */ -static void NUMD2putHeader(FILE *, CKTcircuit *, NUMD2instance *); - -/* State Counter */ -static int state_numOP = 0; -static int state_numDC = 0; -static int state_numTR = 0; - -void -NUMD2dump(GENmodel *inModel, CKTcircuit *ckt) -{ - register NUMD2model *model = (NUMD2model *) inModel; - register NUMD2instance *inst; - OUTPcard *output; - FILE *fpState; - char fileName[BSIZE_SP]; - char description[BSIZE_SP]; - char *prefix; - int *state_num; - int anyOutput = 0; - BOOLEAN writeAscii = TRUE; - - if (ckt->CKTmode & MODEDCOP) { - prefix = "OP"; - state_num = &state_numOP; - sprintf(description, "..."); - } else if (ckt->CKTmode & MODEDCTRANCURVE) { - prefix = "DC"; - state_num = &state_numDC; - sprintf(description, "sweep = % e", ckt->CKTtime); - } else if (ckt->CKTmode & MODETRAN) { - prefix = "TR"; - state_num = &state_numTR; - sprintf(description, "time = % e", ckt->CKTtime); - } else { - /* Not a recognized CKT mode. */ - return; - } - - for (; model != NULL; model = NUMD2nextModel(model)) { - output = model->NUMD2outputs; - for (inst = NUMD2instances(model); inst != NULL; - inst = NUMD2nextInstance(inst)) { - - if (inst->NUMD2printGiven) { - if ((ckt->CKTmode & MODETRAN) && - ((ckt->CKTstat->STATaccepted - 1) % inst->NUMD2print != 0)) { - continue; - } - anyOutput = 1; - sprintf(fileName, "%s%s.%d.%s", output->OUTProotFile, prefix, - *state_num, inst->NUMD2name); - - writeAscii = compareFiletypeVar("ascii"); - - fpState = fopen(fileName, (writeAscii ? "w" : "wb")); - if (!fpState) { - perror(fileName); - } else { - NUMD2putHeader(fpState, ckt, inst); - TWOprnSolution(fpState, inst->NUMD2pDevice, - model->NUMD2outputs, writeAscii, "numd2"); - fclose(fpState); - LOGmakeEntry(fileName, description); - } - } - } - } - if (anyOutput) { - (*state_num)++; - } -} - -#define NUMD2numOutputs 4 - -static -void -NUMD2putHeader(FILE *file, CKTcircuit *ckt, NUMD2instance *inst) -{ - char *reference; - double refVal = 0.0; - int numVars = NUMD2numOutputs; - - if (ckt->CKTmode & MODEDCOP) { - reference = NULL; - } else if (ckt->CKTmode & MODEDCTRANCURVE) { - reference = "sweep"; - refVal = ckt->CKTtime; - numVars++; - } else if (ckt->CKTmode & MODETRAN) { - reference = "time"; - refVal = ckt->CKTtime; - numVars++; - } else { - reference = NULL; - } - fprintf(file, "Title: Device %s external state\n", inst->NUMD2name); - fprintf(file, "Plotname: Device Operating Point\n"); - fprintf(file, "Command: deftype v conductance S\n"); - fprintf(file, "Flags: real\n"); - fprintf(file, "No. Variables: %d\n", numVars); - fprintf(file, "No. Points: 1\n"); - numVars = 0; - fprintf(file, "Variables:\n"); - if (reference) { - fprintf(file, "\t%d %s unknown\n", numVars++, reference); - } - fprintf(file, "\t%d v12 voltage\n", numVars++); - fprintf(file, "\t%d i1 current\n", numVars++); - fprintf(file, "\t%d i2 current\n", numVars++); - fprintf(file, "\t%d g11 conductance\n", numVars++); - fprintf(file, "Values:\n0"); - if (reference) { - fprintf(file, "\t% e\n", refVal); - } - fprintf(file, "\t% e\n", *(ckt->CKTstate0 + inst->NUMD2voltage)); - fprintf(file, "\t% e\n", *(ckt->CKTstate0 + inst->NUMD2id)); - fprintf(file, "\t% e\n", - *(ckt->CKTstate0 + inst->NUMD2id)); - fprintf(file, "\t% e\n", *(ckt->CKTstate0 + inst->NUMD2conduct)); -} - -void -NUMD2acct(GENmodel *inModel, CKTcircuit *ckt, FILE *file) -{ - register NUMD2model *model = (NUMD2model *) inModel; - register NUMD2instance *inst; - OUTPcard *output; - - NG_IGNORE(ckt); - - for (; model != NULL; model = NUMD2nextModel(model)) { - output = model->NUMD2outputs; - for (inst = NUMD2instances(model); inst != NULL; - inst = NUMD2nextInstance(inst)) { - - if (output->OUTPstats) { - TWOmemStats(file, inst->NUMD2pDevice); - TWOcpuStats(file, inst->NUMD2pDevice); - } - } - } -} diff --git a/src/spicelib/devices/numd2/nud2load.c b/src/spicelib/devices/numd2/nud2load.c deleted file mode 100644 index b5bfd382b..000000000 --- a/src/spicelib/devices/numd2/nud2load.c +++ /dev/null @@ -1,398 +0,0 @@ -/********** -Copyright 1992 Regents of the University of California. All rights reserved. -Author: 1987 Kartikeya Mayaram, U. C. Berkeley CAD Group -**********/ - -/* - * This is the function called each iteration to evaluate the 2d numerical - * Diodes in the circuit and load them into the matrix as appropriate - */ - -#include "ngspice/ngspice.h" -#include "ngspice/devdefs.h" -#include "ngspice/cktdefs.h" -#include "numd2def.h" -#include "ngspice/trandefs.h" -#include "ngspice/sperror.h" -#include "../../../ciderlib/twod/twoddefs.h" -#include "../../../ciderlib/twod/twodext.h" -#include "ngspice/cidersupt.h" -#include "ngspice/suffix.h" - - -/* Forward declarations */ -int NUMD2initSmSig(NUMD2instance *); - - -int -NUMD2load(GENmodel *inModel, CKTcircuit *ckt) -{ - register NUMD2model *model = (NUMD2model *) inModel; - register NUMD2instance *inst; - register TWOdevice *pDevice; - double startTime, startTime2, totalTime, totalTime2; - double id=0.; - double idhat = 0.0; - double ideq; - double gd=0.; - double xfact; - double tol; /* temporary for tolerance calculations */ - double vd; /* current diode voltage */ - double delVd; - int Check; - double deltaNorm[7]; - int devConverged = FALSE; - int i; - int numDevNonCon; - int deviceType; - int doInitSolve; - int doVoltPred; - char *initStateName; - - /* loop through all the diode models */ - for (; model != NULL; model = NUMD2nextModel(model)) { - FieldDepMobility = model->NUMD2models->MODLfieldDepMobility; - TransDepMobility = model->NUMD2models->MODLtransDepMobility; - SurfaceMobility = model->NUMD2models->MODLsurfaceMobility; - Srh = model->NUMD2models->MODLsrh; - Auger = model->NUMD2models->MODLauger; - AvalancheGen = model->NUMD2models->MODLavalancheGen; - OneCarrier = model->NUMD2methods->METHoneCarrier; - MobDeriv = model->NUMD2methods->METHmobDeriv; - MaxIterations = model->NUMD2methods->METHitLim; - TWOdcDebug = model->NUMD2outputs->OUTPdcDebug; - TWOtranDebug = model->NUMD2outputs->OUTPtranDebug; - TWOacDebug = model->NUMD2outputs->OUTPacDebug; - deviceType = model->NUMD2options->OPTNdeviceType; - doVoltPred = model->NUMD2methods->METHvoltPred; - - if (ckt->CKTmode & MODEINITPRED) { - /* compute normalized deltas and predictor coeff */ - if (!(ckt->CKTmode & MODEDCTRANCURVE)) { - model->NUMD2pInfo->order = ckt->CKTorder; - model->NUMD2pInfo->method = ckt->CKTintegrateMethod; - for (i = 0; i <= ckt->CKTmaxOrder; i++) { - deltaNorm[i] = ckt->CKTdeltaOld[i] / TNorm; - } - computeIntegCoeff(ckt->CKTintegrateMethod, ckt->CKTorder, - model->NUMD2pInfo->intCoeff, deltaNorm); - computePredCoeff(ckt->CKTintegrateMethod, ckt->CKTorder, - model->NUMD2pInfo->predCoeff, deltaNorm); - } - } else if (ckt->CKTmode & MODEINITTRAN) { - model->NUMD2pInfo->order = ckt->CKTorder; -/* model->NUMD2pInfo->method = GEAR; */ - model->NUMD2pInfo->method = ckt->CKTintegrateMethod; - for (i = 0; i <= ckt->CKTmaxOrder; i++) { - deltaNorm[i] = ckt->CKTdeltaOld[i] / TNorm; - } - computeIntegCoeff(ckt->CKTintegrateMethod, ckt->CKTorder, - model->NUMD2pInfo->intCoeff, deltaNorm); - } - /* loop through all the instances of the model */ - for (inst = NUMD2instances(model); inst != NULL; - inst = NUMD2nextInstance(inst)) { - - pDevice = inst->NUMD2pDevice; - - totalTime = 0.0; - startTime = SPfrontEnd->IFseconds(); - - /* Get Temp.-Dep. Global Parameters */ - GLOBgetGlobals(&(inst->NUMD2globals)); - - pDevice->devStates = ckt->CKTstates; - /* - * initialization - */ - Check = 1; - doInitSolve = FALSE; - initStateName = NULL; - if (ckt->CKTmode & MODEINITSMSIG) { - vd = *(ckt->CKTstate0 + inst->NUMD2voltage); - delVd = 0.0; - NUMD2setBCs(pDevice, vd); - } else if (ckt->CKTmode & MODEINITTRAN) { - *(ckt->CKTstate0 + inst->NUMD2voltage) = - *(ckt->CKTstate1 + inst->NUMD2voltage); - vd = *(ckt->CKTstate1 + inst->NUMD2voltage); - TWOsaveState(pDevice); - delVd = 0.0; - } else if ((ckt->CKTmode & MODEINITJCT) && - (ckt->CKTmode & MODETRANOP) && (ckt->CKTmode & MODEUIC)) { - doInitSolve = TRUE; - initStateName = inst->NUMD2icFile; - vd = 0.0; - delVd = vd; - } else if ((ckt->CKTmode & MODEINITJCT) && inst->NUMD2off) { - doInitSolve = TRUE; - vd = 0.0; - delVd = vd; - } else if (ckt->CKTmode & MODEINITJCT) { - doInitSolve = TRUE; - initStateName = inst->NUMD2icFile; - if (deviceType == OPTN_DIODE) { - vd = inst->NUMD2type * 0.6; - } else if (deviceType == OPTN_MOSCAP) { - vd = inst->NUMD2type * 0.8; - } else { - vd = 0.0; - } - delVd = vd; - } else if (ckt->CKTmode & MODEINITFIX && inst->NUMD2off) { - vd = 0.0; - delVd = vd; - } else { - if (ckt->CKTmode & MODEINITPRED) { - *(ckt->CKTstate0 + inst->NUMD2voltage) = - *(ckt->CKTstate1 + inst->NUMD2voltage); - *(ckt->CKTstate0 + inst->NUMD2id) = - *(ckt->CKTstate1 + inst->NUMD2id); - *(ckt->CKTstate0 + inst->NUMD2conduct) = - *(ckt->CKTstate1 + inst->NUMD2conduct); - if (!(ckt->CKTmode & MODEDCTRANCURVE)) { - /* no linear prediction on device voltages */ - vd = *(ckt->CKTstate1 + inst->NUMD2voltage); - TWOpredict(pDevice, model->NUMD2pInfo); - } else { - if (doVoltPred) { - /* linear prediction */ - xfact=ckt->CKTdelta/ckt->CKTdeltaOld[1]; - vd = (1+xfact) * (*(ckt->CKTstate1 + inst->NUMD2voltage)) - - (xfact) * (*(ckt->CKTstate2 + inst->NUMD2voltage)); - } else { - vd = *(ckt->CKTstate1 + inst->NUMD2voltage); - } - } - } else { - vd = *(ckt->CKTrhsOld + inst->NUMD2posNode) - - *(ckt->CKTrhsOld + inst->NUMD2negNode); - } - delVd = vd - *(ckt->CKTstate0 + inst->NUMD2voltage); - idhat = *(ckt->CKTstate0 + inst->NUMD2id) + - *(ckt->CKTstate0 + inst->NUMD2conduct) * delVd; - /* - * bypass if solution has not changed - */ - if ((ckt->CKTbypass) && pDevice->converged && - !(ckt->CKTmode & MODEINITPRED)) { - tol = ckt->CKTvoltTol + ckt->CKTreltol * - MAX(fabs(vd), fabs(*(ckt->CKTstate0 + inst->NUMD2voltage))); - if (fabs(delVd) < tol) { - tol = ckt->CKTreltol * - MAX(fabs(idhat), fabs(*(ckt->CKTstate0 + inst->NUMD2id))) + - ckt->CKTabstol; - if (fabs(idhat - *(ckt->CKTstate0 + inst->NUMD2id)) - < tol) { - vd = *(ckt->CKTstate0 + inst->NUMD2voltage); - id = *(ckt->CKTstate0 + inst->NUMD2id); - gd = *(ckt->CKTstate0 + inst->NUMD2conduct); - goto load; - } - } - } - /* - * limit new junction voltage - */ - if (deviceType == OPTN_DIODE) { - vd = inst->NUMD2type * limitJunctionVoltage( - inst->NUMD2type * vd, - inst->NUMD2type * *(ckt->CKTstate0 + inst->NUMD2voltage), - &Check); - } else if (deviceType == OPTN_MOSCAP) { - vd = inst->NUMD2type * limitVgb( - inst->NUMD2type * vd, - inst->NUMD2type * *(ckt->CKTstate0 + inst->NUMD2voltage), - &Check); - } else { - vd = inst->NUMD2type * limitResistorVoltage( - inst->NUMD2type * vd, - inst->NUMD2type * *(ckt->CKTstate0 + inst->NUMD2voltage), - &Check); - } - delVd = vd - *(ckt->CKTstate0 + inst->NUMD2voltage); - NUMD2setBCs(pDevice, vd - delVd); - } - if (doInitSolve) { - if (TWOdcDebug) { - printVoltages(stdout, - model->NUMD2modName, inst->NUMD2name, - deviceType, 1, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0); - } - startTime2 = SPfrontEnd->IFseconds(); - TWOequilSolve(pDevice); - totalTime2 = SPfrontEnd->IFseconds() - startTime2; - pDevice->pStats->totalTime[STAT_SETUP] += totalTime2; - pDevice->pStats->totalTime[STAT_DC] -= totalTime2; - - TWObiasSolve(pDevice, MaxIterations, FALSE, NULL); - - *(ckt->CKTstate0 + inst->NUMD2voltage) = 0.0; - - if (initStateName != NULL) { - if (TWOreadState(pDevice, initStateName, 1, &vd, NULL, NULL ) < 0) { - fprintf(stderr, - "NUMD2load: trouble reading state-file %s\n", initStateName); - } else { - *(ckt->CKTstate0 + inst->NUMD2voltage) = vd; - NUMD2setBCs(pDevice, vd); - delVd = 0.0; - } - } - } - /* - * compute dc current and derivitives - */ - /* use the routines for numerical simulation */ - - if (ckt->CKTmode & (MODEDCOP | MODETRANOP | MODEDCTRANCURVE | MODEINITSMSIG)) { - numDevNonCon = 0; - inst->NUMD2c11 = inst->NUMD2y11r = inst->NUMD2y11i = 0.0; - inst->NUMD2smSigAvail = FALSE; - devNonCon: - NUMD2project(pDevice, delVd); - if (TWOdcDebug) { - printVoltages(stdout, - model->NUMD2modName, inst->NUMD2name, - deviceType, 1, vd, delVd, 0.0, 0.0, 0.0, 0.0); - } - TWObiasSolve(pDevice, MaxIterations, FALSE, model->NUMD2pInfo); - devConverged = pDevice->converged; - - if (devConverged && finite(pDevice->rhsNorm)) { - /* extract the current and conductance information */ - NUMD2current(pDevice, FALSE, NULL, &id); - NUMD2conductance(pDevice, FALSE, NULL, &gd); - } else { - /* do voltage step backtracking */ - /* restore the boundary nodes to the previous value */ - NUMD2setBCs(pDevice, vd - delVd); - TWOstoreInitialGuess(pDevice); - TWOresetJacobian(pDevice); - delVd *= 0.5; - vd = delVd + *(ckt->CKTstate0 + inst->NUMD2voltage); - numDevNonCon++; - Check = 1; - if (numDevNonCon > 10) { - printVoltages(stderr, - model->NUMD2modName, inst->NUMD2name, - deviceType, 1, vd, delVd, 0.0, 0.0, 0.0, 0.0); - fprintf(stderr, - "*** Non-convergence during load ***\n"); - totalTime += SPfrontEnd->IFseconds() - startTime; - pDevice->pStats->totalTime[STAT_DC] += totalTime; - ckt->CKTtroubleElt = (GENinstance *) inst; - return (E_BADMATRIX); - } else { - goto devNonCon; - } - } - } - if ( (ckt->CKTmode & (MODETRAN | MODEAC | MODEINITSMSIG)) || - ((ckt->CKTmode & MODETRANOP) && (ckt->CKTmode & MODEUIC))) { - /* - * store small-signal parameters - */ - if ((!(ckt->CKTmode & MODETRANOP)) || - (!(ckt->CKTmode & MODEUIC))) { - if (ckt->CKTmode & MODEINITSMSIG) { - totalTime = SPfrontEnd->IFseconds() - startTime; - pDevice->pStats->totalTime[STAT_DC] += totalTime; - startTime2 = SPfrontEnd->IFseconds(); - NUMD2initSmSig(inst); - pDevice->pStats->totalTime[STAT_AC] += - SPfrontEnd->IFseconds() - startTime2; - continue; - } else { - inst->NUMD2smSigAvail = FALSE; - } - /* - * transient analysis - */ - if (ckt->CKTmode & MODEINITPRED) { - NUMD2setBCs(pDevice, vd); - TWOstoreInitialGuess(pDevice); - } else { - NUMD2update(pDevice, delVd, TRUE); - } - if (TWOtranDebug) { - printVoltages(stdout, - model->NUMD2modName, inst->NUMD2name, - deviceType, 1, vd, delVd, 0.0, 0.0, 0.0, 0.0); - } - TWObiasSolve(pDevice, 0, TRUE, model->NUMD2pInfo); - - if (!finite(pDevice->rhsNorm)) { - totalTime += SPfrontEnd->IFseconds() - startTime; - pDevice->pStats->totalTime[STAT_TRAN] += totalTime; - ckt->CKTtroubleElt = (GENinstance *) inst; - return (E_BADMATRIX); - } - devConverged = TWOdeviceConverged(pDevice); - pDevice->converged = devConverged; - - /* extract the current and conductance information */ - NUMD2current(pDevice, TRUE, model->NUMD2pInfo->intCoeff, &id); - NUMD2conductance(pDevice, TRUE, model->NUMD2pInfo->intCoeff, &gd); - } - } - /* - * check convergence - */ - if ((!(ckt->CKTmode & MODEINITFIX)) || (!(inst->NUMD2off))) { - if (Check == 1 || !devConverged) { - ckt->CKTnoncon++; - ckt->CKTtroubleElt = (GENinstance *) inst; - } else { - tol = ckt->CKTreltol * MAX(fabs(idhat), fabs(id)) + ckt->CKTabstol; - if (fabs(idhat - id) > tol) { - ckt->CKTnoncon++; - ckt->CKTtroubleElt = (GENinstance *) inst; - } - } - } - *(ckt->CKTstate0 + inst->NUMD2voltage) = vd; - *(ckt->CKTstate0 + inst->NUMD2id) = id; - *(ckt->CKTstate0 + inst->NUMD2conduct) = gd; - - load: - - /* - * load current vector - */ - ideq = id - gd * vd; - *(ckt->CKTrhs + inst->NUMD2negNode) += ideq; - *(ckt->CKTrhs + inst->NUMD2posNode) -= ideq; - /* - * load matrix - */ - *(inst->NUMD2posPosPtr) += gd; - *(inst->NUMD2negNegPtr) += gd; - *(inst->NUMD2negPosPtr) -= gd; - *(inst->NUMD2posNegPtr) -= gd; - - totalTime += SPfrontEnd->IFseconds() - startTime; - if (ckt->CKTmode & MODETRAN) { - pDevice->pStats->totalTime[STAT_TRAN] += totalTime; - } else { - pDevice->pStats->totalTime[STAT_DC] += totalTime; - } - } - } - return (OK); -} - -int -NUMD2initSmSig(NUMD2instance *inst) -{ - SPcomplex yd; - double omega = NUMD2modPtr(inst)->NUMD2methods->METHomega; - - AcAnalysisMethod = SOR_ONLY; - (void) NUMD2admittance(inst->NUMD2pDevice, omega, &yd); - inst->NUMD2c11 = yd.imag / omega; - inst->NUMD2y11r = yd.real; - inst->NUMD2y11i = yd.imag; - inst->NUMD2smSigAvail = TRUE; - return (OK); -} diff --git a/src/spicelib/devices/numd2/nud2mpar.c b/src/spicelib/devices/numd2/nud2mpar.c deleted file mode 100644 index 54061c054..000000000 --- a/src/spicelib/devices/numd2/nud2mpar.c +++ /dev/null @@ -1,32 +0,0 @@ -/********** -Copyright 1992 Regents of the University of California. All rights reserved. -Author: 1987 Kartikeya Mayaram, U. C. Berkeley CAD Group -**********/ - -/* - * This routine sets model parameters for NUMD2s in the circuit. - */ - -#include "ngspice/ngspice.h" -#include "ngspice/const.h" -#include "ngspice/ifsim.h" -#include "numd2def.h" -#include "ngspice/sperror.h" -#include "ngspice/suffix.h" - -int -NUMD2mParam(int param, IFvalue *value, GENmodel *inModel) -{ - NG_IGNORE(value); - NG_IGNORE(inModel); - - switch (param) { - case NUMD2_MOD_NUMD: - /* no action - already know it is a 2d-numerical diode, but this */ - /* makes life easier for spice-2 like parsers */ - break; - default: - return (E_BADPARM); - } - return (OK); -} diff --git a/src/spicelib/devices/numd2/nud2parm.c b/src/spicelib/devices/numd2/nud2parm.c deleted file mode 100644 index 122c3e2b0..000000000 --- a/src/spicelib/devices/numd2/nud2parm.c +++ /dev/null @@ -1,48 +0,0 @@ -/********** -Copyright 1992 Regents of the University of California. All rights reserved. -Author: 1987 Kartikeya Mayaram, U. C. Berkeley CAD Group -**********/ - -#include "ngspice/ngspice.h" -#include "ngspice/const.h" -#include "ngspice/ifsim.h" -#include "numd2def.h" -#include "ngspice/sperror.h" -#include "ngspice/suffix.h" - -int -NUMD2param(int param, IFvalue *value, GENinstance *inInst, IFvalue *select) -{ - NUMD2instance *inst = (NUMD2instance *) inInst; - - NG_IGNORE(select); - - switch (param) { - case NUMD2_WIDTH: - inst->NUMD2width = value->rValue; - inst->NUMD2widthGiven = TRUE; - break; - case NUMD2_AREA: - inst->NUMD2area = value->rValue; - inst->NUMD2areaGiven = TRUE; - break; - case NUMD2_OFF: - inst->NUMD2off = TRUE; - break; - case NUMD2_IC_FILE: - inst->NUMD2icFile = value->sValue; - inst->NUMD2icFileGiven = TRUE; - break; - case NUMD2_PRINT: - inst->NUMD2print = value->iValue; - inst->NUMD2printGiven = TRUE; - break; - case NUMD2_TEMP: - inst->NUMD2temp = value->rValue + CONSTCtoK; - inst->NUMD2tempGiven = TRUE; - break; - default: - return (E_BADPARM); - } - return (OK); -} diff --git a/src/spicelib/devices/numd2/nud2pzld.c b/src/spicelib/devices/numd2/nud2pzld.c deleted file mode 100644 index 8cf962a66..000000000 --- a/src/spicelib/devices/numd2/nud2pzld.c +++ /dev/null @@ -1,63 +0,0 @@ -/********** -Copyright 1992 Regents of the University of California. All rights reserved. -Author: 1987 Kartikeya Mayaram, U. C. Berkeley CAD Group -**********/ - -#include "ngspice/ngspice.h" -#include "ngspice/cktdefs.h" -#include "ngspice/complex.h" -#include "ngspice/sperror.h" -#include "numd2def.h" -#include "../../../ciderlib/twod/twoddefs.h" -#include "../../../ciderlib/twod/twodext.h" -#include "ngspice/cidersupt.h" -#include "ngspice/suffix.h" - - -int -NUMD2pzLoad(GENmodel *inModel, CKTcircuit *ckt, SPcomplex *s) -{ - register NUMD2model *model = (NUMD2model *) inModel; - register NUMD2instance *inst; - SPcomplex y; - double startTime; - - NG_IGNORE(ckt); - - /* loop through all the diode models */ - for (; model != NULL; model = NUMD2nextModel(model)) { - FieldDepMobility = model->NUMD2models->MODLfieldDepMobility; - TransDepMobility = model->NUMD2models->MODLtransDepMobility; - SurfaceMobility = model->NUMD2models->MODLsurfaceMobility; - Srh = model->NUMD2models->MODLsrh; - Auger = model->NUMD2models->MODLauger; - AvalancheGen = model->NUMD2models->MODLavalancheGen; - OneCarrier = model->NUMD2methods->METHoneCarrier; - AcAnalysisMethod = model->NUMD2methods->METHacAnalysisMethod; - MobDeriv = model->NUMD2methods->METHmobDeriv; - TWOacDebug = model->NUMD2outputs->OUTPacDebug; - - for (inst = NUMD2instances(model); inst != NULL; - inst = NUMD2nextInstance(inst)) { - - startTime = SPfrontEnd->IFseconds(); - /* Get Temp.-Dep. Global Parameters */ - GLOBgetGlobals(&(inst->NUMD2globals)); - - NUMD2ys(inst->NUMD2pDevice, s, &y); - - *(inst->NUMD2posPosPtr) += y.real; - *(inst->NUMD2posPosPtr + 1) += y.imag; - *(inst->NUMD2negNegPtr) += y.real; - *(inst->NUMD2negNegPtr + 1) += y.imag; - *(inst->NUMD2negPosPtr) -= y.real; - *(inst->NUMD2negPosPtr + 1) -= y.imag; - *(inst->NUMD2posNegPtr) -= y.real; - *(inst->NUMD2posNegPtr + 1) -= y.imag; - - inst->NUMD2pDevice->pStats->totalTime[STAT_AC] += - SPfrontEnd->IFseconds() - startTime; - } - } - return (OK); -} diff --git a/src/spicelib/devices/numd2/nud2set.c b/src/spicelib/devices/numd2/nud2set.c deleted file mode 100644 index 571dcdadc..000000000 --- a/src/spicelib/devices/numd2/nud2set.c +++ /dev/null @@ -1,251 +0,0 @@ -/********** -Copyright 1991 Regents of the University of California. All rights reserved. -Author: 1987 Kartikeya Mayaram, U. C. Berkeley CAD Group -**********/ - -#include "ngspice/ngspice.h" -#include "ngspice/cktdefs.h" -#include "ngspice/smpdefs.h" -#include "numd2def.h" -#include "ngspice/numconst.h" -#include "ngspice/numenum.h" -#include "ngspice/meshext.h" -#include "ngspice/sperror.h" -#include "../../../ciderlib/twod/twoddefs.h" -#include "../../../ciderlib/twod/twodext.h" -#include "ngspice/cidersupt.h" -#include "ngspice/ciderinp.h" -#include "ngspice/suffix.h" - -#define TSCALLOC(var, size, type)\ -if (size && (var =(type *)calloc(1, (unsigned)(size)*sizeof(type))) == NULL) {\ - return(E_NOMEM);\ -} - -int -NUMD2setup(SMPmatrix *matrix, GENmodel *inModel, CKTcircuit *ckt, int *states) -/* - * load the structure with those pointers needed later for fast matrix - * loading - */ -{ - register NUMD2model *model = (NUMD2model *) inModel; - register NUMD2instance *inst; - METHcard *methods; - MODLcard *models; - OPTNcard *options; - OUTPcard *outputs; - int error, xIndex; - int xMeshSize, yMeshSize; - TWOdevice *pDevice; - TWOcoord *xCoordList = NULL; - TWOcoord *yCoordList = NULL; - TWOdomain *domainList = NULL; - TWOelectrode *electrodeList = NULL; - TWOmaterial *pM, *pMaterial = NULL, *materialList = NULL; - DOPprofile *profileList = NULL; - DOPtable *dopTableList = NULL; - double startTime; - - - /* loop through all the models */ - for (; model != NULL; model = NUMD2nextModel(model)) { - if (!model->NUMD2pInfo) { - TSCALLOC(model->NUMD2pInfo, 1, TWOtranInfo); - } - methods = model->NUMD2methods; - if (!methods) { - TSCALLOC(methods, 1, METHcard); - model->NUMD2methods = methods; - } - models = model->NUMD2models; - if (!models) { - TSCALLOC(models, 1, MODLcard); - model->NUMD2models = models; - } - options = model->NUMD2options; - if (!options) { - TSCALLOC(options, 1, OPTNcard); - model->NUMD2options = options; - } - outputs = model->NUMD2outputs; - if (!outputs) { - TSCALLOC(outputs, 1, OUTPcard); - model->NUMD2outputs = outputs; - } - if (!methods->METHvoltPredGiven) { - methods->METHvoltPred = FALSE; - } - if (!methods->METHmobDerivGiven) { - methods->METHmobDeriv = TRUE; - } - if (!methods->METHoneCarrierGiven) { - methods->METHoneCarrier = FALSE; - } - if (!methods->METHacAnalysisMethodGiven) { - methods->METHacAnalysisMethod = SOR; - } - if (!methods->METHdabstolGiven) { - methods->METHdabstol = DABSTOL2D; - } - if (!methods->METHdreltolGiven) { - methods->METHdreltol = ckt->CKTreltol; - } - if (!methods->METHitLimGiven) { - methods->METHitLim = 50; - } - if (!methods->METHomegaGiven || methods->METHomega <= 0.0) { - methods->METHomega = 2.0 * M_PI /* radians/sec */ ; - } - if (!options->OPTNdefaGiven || options->OPTNdefa <= 0.0) { - options->OPTNdefa = 1.0e4 /* cm^2 */ ; - } - if (!options->OPTNdeflGiven || options->OPTNdefl <= 0.0) { - options->OPTNdefl = 1.0e2 /* cm */ ; - } - if (!options->OPTNdefwGiven && options->OPTNdefaGiven) { - options->OPTNdefw = options->OPTNdefa / options->OPTNdefl; - } else if (!options->OPTNdefwGiven || options->OPTNdefw <= 0.0) { - options->OPTNdefw = 1.0e2 /* cm */ ; - } - if (!options->OPTNdeviceTypeGiven) { - options->OPTNdeviceType = OPTN_DIODE; - } - if (!options->OPTNicFileGiven) { - options->OPTNicFile = NULL; - options->OPTNunique = FALSE; /* Can't form a unique name. */ - } - if (!options->OPTNuniqueGiven) { - options->OPTNunique = FALSE; - } - OneCarrier = methods->METHoneCarrier; - - /* Set up the rest of the card lists */ - if ((error = MODLsetup(model->NUMD2models)) != 0) - return (error); - BandGapNarrowing = models->MODLbandGapNarrowing; - ConcDepLifetime = models->MODLconcDepLifetime; - TempDepMobility = models->MODLtempDepMobility; - ConcDepMobility = models->MODLconcDepMobility; - SurfaceMobility = models->MODLsurfaceMobility; - - if ((error = OUTPsetup(model->NUMD2outputs)) != 0) - return (error); - if ((error = MATLsetup(model->NUMD2materials, &materialList)) != 0) - return (error); - if ((error = MOBsetup(model->NUMD2mobility, materialList)) != 0) - return (error); - if ((error = MESHsetup('x', model->NUMD2xMeshes, &xCoordList, &xMeshSize)) != 0) - return (error); - if ((error = MESHsetup('y', model->NUMD2yMeshes, &yCoordList, &yMeshSize)) != 0) - return (error); - if ((error = DOMNsetup(model->NUMD2domains, &domainList, - xCoordList, yCoordList, materialList)) != 0) - return (error); - if ((error = BDRYsetup(model->NUMD2boundaries, - xCoordList, yCoordList, domainList)) != 0) - return (error); - if ((error = ELCTsetup(model->NUMD2electrodes, &electrodeList, - xCoordList, yCoordList)) != 0) - return (error); - /* Make sure electrodes are OK. */ - checkElectrodes(electrodeList, 2); /* NUMD2 has 4 electrodes */ - - if ((error = CONTsetup(model->NUMD2contacts, electrodeList)) != 0) - return (error); - if ((error = DOPsetup(model->NUMD2dopings, &profileList, - &dopTableList, xCoordList, yCoordList)) != 0) - return (error); - model->NUMD2matlInfo = materialList; - model->NUMD2profiles = profileList; - model->NUMD2dopTables = dopTableList; - - /* loop through all the instances of the model */ - for (inst = NUMD2instances(model); inst != NULL; - inst = NUMD2nextInstance(inst)) { - - startTime = SPfrontEnd->IFseconds(); - - if (!inst->NUMD2printGiven) { - inst->NUMD2print = 0; - } else if (inst->NUMD2print <= 0) { - inst->NUMD2print = 1; - } - if (!inst->NUMD2icFileGiven) { - if (options->OPTNunique) { - inst->NUMD2icFile = tprintf("%s.%s", options->OPTNicFile, inst->NUMD2name); - } else if (options->OPTNicFile != NULL) { - inst->NUMD2icFile = tprintf("%s", options->OPTNicFile); - } else { - inst->NUMD2icFile = NULL; - } - } - inst->NUMD2state = *states; - *states += NUMD2numStates; - - if (!inst->NUMD2pDevice) { - /* Assign the mesh and profile info to each instance. */ - TSCALLOC(pDevice, 1, TWOdevice); - TSCALLOC(pDevice->pStats, 1, TWOstats); - pDevice->name = inst->NUMD2name; - pDevice->solverType = SLV_NONE; - pDevice->numXNodes = xMeshSize; - pDevice->numYNodes = yMeshSize; - pDevice->xScale = MESHmkArray(xCoordList, xMeshSize); - pDevice->yScale = MESHmkArray(yCoordList, yMeshSize); - pDevice->abstol = methods->METHdabstol; - pDevice->reltol = methods->METHdreltol; - TSCALLOC(pDevice->elemArray, pDevice->numXNodes, TWOelem **); - for (xIndex = 1; xIndex < pDevice->numXNodes; xIndex++) { - TSCALLOC(pDevice->elemArray[xIndex], pDevice->numYNodes, TWOelem *); - } - - /* Create a copy of material data that can change with temperature. */ - pDevice->pMaterials = NULL; - for (pM = materialList; pM != NULL; pM = pM->next) { - if (pDevice->pMaterials == NULL) { - TSCALLOC(pMaterial, 1, TWOmaterial); - pDevice->pMaterials = pMaterial; - } else { - TSCALLOC(pMaterial->next, 1, TWOmaterial); - pMaterial = pMaterial->next; - } - /* Copy everything, then fix the incorrect pointer. */ - memcpy(pMaterial, pM, sizeof(TWOmaterial)); - pMaterial->next = NULL; - } - - /* Generate the mesh structure for the device. */ - TWObuildMesh(pDevice, domainList, electrodeList, pDevice->pMaterials); - - /* Store the device info in the instance. */ - inst->NUMD2pDevice = pDevice; - } - /* Now update the state pointers. */ - TWOgetStatePointers(inst->NUMD2pDevice, states); - - /* Wipe out statistics from previous runs (if any). */ - memset(inst->NUMD2pDevice->pStats, 0, sizeof(TWOstats)); - - inst->NUMD2pDevice->pStats->totalTime[STAT_SETUP] += - SPfrontEnd->IFseconds() - startTime; - - /* macro to make elements with built in test for out of memory */ -#define TSTALLOC(ptr,first,second) \ -do { if ((inst->ptr = SMPmakeElt(matrix, inst->first, inst->second)) == NULL){\ - return(E_NOMEM);\ -} } while(0) - - TSTALLOC(NUMD2posPosPtr, NUMD2posNode, NUMD2posNode); - TSTALLOC(NUMD2negNegPtr, NUMD2negNode, NUMD2negNode); - TSTALLOC(NUMD2negPosPtr, NUMD2negNode, NUMD2posNode); - TSTALLOC(NUMD2posNegPtr, NUMD2posNode, NUMD2negNode); - } - /* Clean up lists */ - killCoordInfo(xCoordList); - killCoordInfo(yCoordList); - killDomainInfo(domainList); - killElectrodeInfo(electrodeList); - } - return (OK); -} diff --git a/src/spicelib/devices/numd2/nud2temp.c b/src/spicelib/devices/numd2/nud2temp.c deleted file mode 100644 index 2a59707b8..000000000 --- a/src/spicelib/devices/numd2/nud2temp.c +++ /dev/null @@ -1,123 +0,0 @@ -/********** -Copyright 1992 Regents of the University of California. All rights reserved. -Author: 1987 Kartikeya Mayaram, U. C. Berkeley CAD Group -Author: 1992 David A. Gates, U. C. Berkeley CAD Group -**********/ - -#include "ngspice/ngspice.h" -#include "ngspice/cktdefs.h" -#include "numd2def.h" -#include "ngspice/numenum.h" -#include "ngspice/carddefs.h" -#include "ngspice/sperror.h" -#include "../../../ciderlib/twod/twoddefs.h" -#include "../../../ciderlib/twod/twodext.h" -#include "ngspice/cidersupt.h" -#include "ngspice/suffix.h" - - -int -NUMD2temp(GENmodel *inModel, CKTcircuit *ckt) -/* - * perform the temperature update - */ -{ - register NUMD2model *model = (NUMD2model *) inModel; - register NUMD2instance *inst; - METHcard *methods; - MODLcard *models; - OPTNcard *options; - OUTPcard *outputs; - TWOmaterial *pM, *pMaterial, *pNextMaterial; - double startTime; - - /* loop through all the models */ - for (; model != NULL; model = NUMD2nextModel(model)) { - methods = model->NUMD2methods; - models = model->NUMD2models; - options = model->NUMD2options; - outputs = model->NUMD2outputs; - - if (!options->OPTNtnomGiven) { - options->OPTNtnom = ckt->CKTnomTemp; - } - for (pM = model->NUMD2matlInfo; pM != NULL; - pM = pM->next) { - pM->tnom = options->OPTNtnom; - } - BandGapNarrowing = models->MODLbandGapNarrowing; - ConcDepLifetime = models->MODLconcDepLifetime; - TempDepMobility = models->MODLtempDepMobility; - ConcDepMobility = models->MODLconcDepMobility; - SurfaceMobility = models->MODLsurfaceMobility; - MatchingMobility = models->MODLmatchingMobility; - OneCarrier = methods->METHoneCarrier; - - for (inst = NUMD2instances(model); inst != NULL; - inst = NUMD2nextInstance(inst)) { - - startTime = SPfrontEnd->IFseconds(); - - if (!inst->NUMD2tempGiven) { - inst->NUMD2temp = ckt->CKTtemp; - } - if (!inst->NUMD2areaGiven || inst->NUMD2area <= 0.0) { - inst->NUMD2area = 1.0; - } - if (!inst->NUMD2widthGiven || inst->NUMD2width <= 0.0) { - inst->NUMD2width = 1.0; - } - inst->NUMD2pDevice->width = - inst->NUMD2area * inst->NUMD2width * options->OPTNdefw; - - /* Compute and save globals for this instance. */ - GLOBcomputeGlobals(&(inst->NUMD2globals), inst->NUMD2temp); - - /* Calculate new sets of material parameters. */ - pM = model->NUMD2matlInfo; - pMaterial = inst->NUMD2pDevice->pMaterials; - for (; pM != NULL; pM = pM->next, pMaterial = pMaterial->next) { - - /* Copy everything, then fix the incorrect pointer. */ - pNextMaterial = pMaterial->next; - memcpy(pMaterial, pM, sizeof(TWOmaterial)); - pMaterial->next = pNextMaterial; - - /* Now do the temperature dependence. */ - MATLtempDep(pMaterial, pMaterial->tnom); - if (outputs->OUTPmaterial) { - printMaterialInfo(pMaterial); - } - } - - /* Assign doping to the mesh. */ - TWOsetDoping(inst->NUMD2pDevice, model->NUMD2profiles, - model->NUMD2dopTables); - - /* Assign physical parameters to the mesh. */ - TWOsetup(inst->NUMD2pDevice); - - /* Assign boundary condition parameters. */ - TWOsetBCparams(inst->NUMD2pDevice, model->NUMD2boundaries); - - /* Normalize everything. */ - TWOnormalize(inst->NUMD2pDevice); - - /* Find the device's type. */ - if (inst->NUMD2pDevice->pFirstContact->pNodes[0]->netConc < 0.0) { - inst->NUMD2type = PN; - if (OneCarrier) { - methods->METHoneCarrier = P_TYPE; - } - } else { - inst->NUMD2type = NP; - if (OneCarrier) { - methods->METHoneCarrier = N_TYPE; - } - } - inst->NUMD2pDevice->pStats->totalTime[STAT_SETUP] += - SPfrontEnd->IFseconds() - startTime; - } - } - return (OK); -} diff --git a/src/spicelib/devices/numd2/nud2trun.c b/src/spicelib/devices/numd2/nud2trun.c deleted file mode 100644 index 7dd50bc85..000000000 --- a/src/spicelib/devices/numd2/nud2trun.c +++ /dev/null @@ -1,46 +0,0 @@ -/********** -Copyright 1992 Regents of the University of California. All rights reserved. -Author: 1987 Kartikeya Mayaram, U. C. Berkeley CAD Group -**********/ - -#include "ngspice/ngspice.h" -#include "ngspice/cktdefs.h" -#include "numd2def.h" -#include "ngspice/sperror.h" -#include "../../../ciderlib/twod/twoddefs.h" -#include "../../../ciderlib/twod/twodext.h" -#include "ngspice/suffix.h" -#include "ngspice/cidersupt.h" - -int -NUMD2trunc(GENmodel *inModel, CKTcircuit *ckt, double *timeStep) -{ - register NUMD2model *model = (NUMD2model *) inModel; - register NUMD2instance *inst; - double deltaNew; - double deltaNorm[7]; - double startTime; - int i; - - for (i = 0; i <= ckt->CKTmaxOrder; i++) { - deltaNorm[i] = ckt->CKTdeltaOld[i] / TNorm; - } - - for (; model != NULL; model = NUMD2nextModel(model)) { - OneCarrier = model->NUMD2methods->METHoneCarrier; - model->NUMD2pInfo->order = ckt->CKTorder; - model->NUMD2pInfo->delta = deltaNorm; - model->NUMD2pInfo->lteCoeff = computeLTECoeff(model->NUMD2pInfo); - for (inst = NUMD2instances(model); inst != NULL; - inst = NUMD2nextInstance(inst)) { - - startTime = SPfrontEnd->IFseconds(); - deltaNew = TWOtrunc(inst->NUMD2pDevice, model->NUMD2pInfo, - ckt->CKTdelta); - *timeStep = MIN(*timeStep, deltaNew); - inst->NUMD2pDevice->pStats->totalTime[STAT_TRAN] += - SPfrontEnd->IFseconds() - startTime; - } - } - return (OK); -} diff --git a/src/spicelib/devices/numd2/numd2def.h b/src/spicelib/devices/numd2/numd2def.h deleted file mode 100644 index 58742da00..000000000 --- a/src/spicelib/devices/numd2/numd2def.h +++ /dev/null @@ -1,138 +0,0 @@ -/********** -Copyright 1991 Regents of the University of California. All rights reserved. -Authors: 1987 Karti Mayaram, 1991 David Gates -**********/ - -#ifndef NUMD2_H -#define NUMD2_H - -/* data structures used to describe 2D numerical diodes */ - -/* circuit level includes */ -#include "ngspice/ifsim.h" -#include "ngspice/cktdefs.h" -#include "ngspice/gendefs.h" - -/* device level includes */ -#include "ngspice/twomesh.h" -#include "ngspice/twodev.h" -#include "ngspice/profile.h" -#include "ngspice/numglobs.h" -#include "ngspice/carddefs.h" - -/* information needed per instance */ -typedef struct sNUMD2instance { - - struct GENinstance gen; - -#define NUMD2modPtr(inst) ((struct sNUMD2model *)((inst)->gen.GENmodPtr)) -#define NUMD2nextInstance(inst) ((struct sNUMD2instance *)((inst)->gen.GENnextInstance)) -#define NUMD2name gen.GENname -#define NUMD2state gen.GENstate - -#define NUMD2voltage NUMD2state -#define NUMD2id NUMD2state+1 -#define NUMD2conduct NUMD2state+2 -#define NUMD2numStates 3 - - const int NUMD2posNode; /* number of positive node of diode */ - const int NUMD2negNode; /* number of negative node of diode */ - TWOdevice *NUMD2pDevice; - GLOBvalues NUMD2globals; /* Temp.-Dep. Global Parameters */ - int NUMD2type; /* device type pn or np */ - double NUMD2width; /* width factor for the diode */ - double NUMD2area; /* area factor for the diode */ - double NUMD2temp; /* instance temperature */ - double NUMD2c11; /* small-signal capacitance */ - double NUMD2y11r; /* small-signal admittance, real part */ - double NUMD2y11i; /* small-signal admittance, imag part */ - int NUMD2print; /* number of timesteps after which print - * internal */ - char *NUMD2icFile; /* Name of initial condition file */ - double *NUMD2negPosPtr; /* pointer to sparse matrix at - * (negative,positive) */ - double *NUMD2posNegPtr; /* pointer to sparse matrix at - * (positive,negative) */ - double *NUMD2posPosPtr; /* pointer to sparse matrix at - * (positive,positive) */ - double *NUMD2negNegPtr; /* pointer to sparse matrix at - * (negative,negative) */ - - int NUMD2off; /* 'off' flag for diode */ - unsigned NUMD2smSigAvail:1; /* flag to indicate small-signal done */ - unsigned NUMD2widthGiven:1; /* flag to indicate width was specified */ - unsigned NUMD2areaGiven:1; /* flag to indicate area was specified */ - unsigned NUMD2icFileGiven:1; /* flag to indicate init. cond. file given */ - unsigned NUMD2tempGiven:1; /* flag to indicate temp was specified */ - unsigned NUMD2printGiven:1; /* flag to indicate if print was specified */ -} NUMD2instance; - - -/* per model data */ - -typedef struct sNUMD2model { /* model structure for a diode */ - - struct GENmodel gen; - -#define NUMD2modType gen.GENmodType -#define NUMD2nextModel(inst) ((struct sNUMD2model *)((inst)->gen.GENnextModel)) -#define NUMD2instances(inst) ((NUMD2instance *)((inst)->gen.GENinstances)) -#define NUMD2modName gen.GENmodName - - MESHcard *NUMD2xMeshes; /* list of xmesh cards */ - MESHcard *NUMD2yMeshes; /* list of ymesh cards */ - DOMNcard *NUMD2domains; /* list of domain cards */ - BDRYcard *NUMD2boundaries; /* list of boundary cards */ - DOPcard *NUMD2dopings; /* list of doping cards */ - ELCTcard *NUMD2electrodes; /* list of electrode cards */ - CONTcard *NUMD2contacts; /* list of contact cards */ - MODLcard *NUMD2models; /* list of model cards */ - MATLcard *NUMD2materials; /* list of material cards */ - MOBcard *NUMD2mobility; /* list of mobility cards */ - METHcard *NUMD2methods; /* list of method cards */ - OPTNcard *NUMD2options; /* list of option cards */ - OUTPcard *NUMD2outputs; /* list of output cards */ - TWOtranInfo *NUMD2pInfo; /* transient analysis information */ - DOPprofile *NUMD2profiles; /* expanded list of doping profiles */ - DOPtable *NUMD2dopTables; /* list of tables used by profiles */ - TWOmaterial *NUMD2matlInfo; /* list of material info structures */ -} NUMD2model; - -/* type of 2D diode */ -#define PN 1 -#define NP -1 - -/* device parameters */ -#define NUMD2_WIDTH 1 -#define NUMD2_AREA 2 -#define NUMD2_IC_FILE 3 -#define NUMD2_OFF 4 -#define NUMD2_PRINT 5 -#define NUMD2_TEMP 6 -#define NUMD2_VD 7 -#define NUMD2_ID 8 - -#define NUMD2_G11 9 -#define NUMD2_C11 10 -#define NUMD2_Y11 11 -#define NUMD2_G12 12 -#define NUMD2_C12 13 -#define NUMD2_Y12 14 -#define NUMD2_G21 15 -#define NUMD2_C21 16 -#define NUMD2_Y21 17 -#define NUMD2_G22 18 -#define NUMD2_C22 19 -#define NUMD2_Y22 20 - -/* model parameters */ -/* NOTE: all true model parameters have been moved to IFcardInfo structures */ -#define NUMD2_MOD_NUMD 101 - -/* device questions */ - -/* model questions */ - -#include "numd2ext.h" - -#endif /* NUMD2_H */ diff --git a/src/spicelib/devices/numd2/numd2ext.h b/src/spicelib/devices/numd2/numd2ext.h deleted file mode 100644 index 618c4c7c4..000000000 --- a/src/spicelib/devices/numd2/numd2ext.h +++ /dev/null @@ -1,26 +0,0 @@ -/********** -Copyright 1990 Regents of the University of California. All rights reserved. -Author: 1987 Karti Mayaram -**********/ - -#ifndef NUMD2EXT_H -#define NUMD2EXT_H - - -extern int NUMD2acLoad(GENmodel *, CKTcircuit *); -extern int NUMD2ask(CKTcircuit *, GENinstance *, int, IFvalue *, IFvalue *); -extern int NUMD2delete(GENinstance *); -extern int NUMD2getic(GENmodel *, CKTcircuit *); -extern int NUMD2load(GENmodel *, CKTcircuit *); -extern int NUMD2mParam(int, IFvalue *, GENmodel *); -extern int NUMD2param(int, IFvalue *, GENinstance *, IFvalue *); -extern int NUMD2pzLoad(GENmodel *, CKTcircuit *, SPcomplex *); -extern int NUMD2setup(SMPmatrix *, GENmodel *, CKTcircuit *, int *); -extern int NUMD2temp(GENmodel *, CKTcircuit *); -extern int NUMD2trunc(GENmodel *, CKTcircuit *, double *); - -extern void NUMD2dump(GENmodel *, CKTcircuit *); -extern void NUMD2acct(GENmodel *, CKTcircuit *, FILE *); - - -#endif /* NUMD2EXT_H */ diff --git a/src/spicelib/devices/numd2/numd2init.c b/src/spicelib/devices/numd2/numd2init.c deleted file mode 100644 index 6b2ab458a..000000000 --- a/src/spicelib/devices/numd2/numd2init.c +++ /dev/null @@ -1,76 +0,0 @@ -#include "ngspice/config.h" - -#include "ngspice/devdefs.h" - -#include "numd2itf.h" -#include "numd2ext.h" -#include "numd2init.h" - - -SPICEdev NUMD2info = { - .DEVpublic = { - .name = "NUMD2", - .description = "2D Numerical Junction Diode model", - .terms = &NUMD2nSize, - .numNames = &NUMD2nSize, - .termNames = NUMD2names, - .numInstanceParms = &NUMD2pTSize, - .instanceParms = NUMD2pTable, - .numModelParms = &NUMD2mPTSize, - .modelParms = NUMD2mPTable, - .flags = DEV_DEFAULT, - -#ifdef XSPICE - .cm_func = NULL, - .num_conn = 0, - .conn = NULL, - .num_param = 0, - .param = NULL, - .num_inst_var = 0, - .inst_var = NULL, -#endif - }, - - .DEVparam = NUMD2param, - .DEVmodParam = NUMD2mParam, - .DEVload = NUMD2load, - .DEVsetup = NUMD2setup, - .DEVunsetup = NULL, - .DEVpzSetup = NUMD2setup, - .DEVtemperature = NUMD2temp, - .DEVtrunc = NUMD2trunc, - .DEVfindBranch = NULL, - .DEVacLoad = NUMD2acLoad, - .DEVaccept = NULL, - .DEVdestroy = NULL, - .DEVmodDelete = NULL, - .DEVdelete = NUMD2delete, - .DEVsetic = NULL, - .DEVask = NUMD2ask, - .DEVmodAsk = NULL, - .DEVpzLoad = NUMD2pzLoad, - .DEVconvTest = NULL, - .DEVsenSetup = NULL, - .DEVsenLoad = NULL, - .DEVsenUpdate = NULL, - .DEVsenAcLoad = NULL, - .DEVsenPrint = NULL, - .DEVsenTrunc = NULL, - .DEVdisto = NULL, - .DEVnoise = NULL, - .DEVsoaCheck = NULL, - .DEVinstSize = &NUMD2iSize, - .DEVmodSize = &NUMD2mSize, - -#ifdef CIDER - .DEVdump = NUMD2dump, - .DEVacct = NUMD2acct, -#endif -}; - - -SPICEdev * -get_numd2_info(void) -{ - return &NUMD2info; -} diff --git a/src/spicelib/devices/numd2/numd2init.h b/src/spicelib/devices/numd2/numd2init.h deleted file mode 100644 index dbbcf7d2f..000000000 --- a/src/spicelib/devices/numd2/numd2init.h +++ /dev/null @@ -1,13 +0,0 @@ -#ifndef _NUMD2INIT_H -#define _NUMD2INIT_H - -extern IFparm NUMD2pTable[ ]; -extern IFparm NUMD2mPTable[ ]; -extern char *NUMD2names[ ]; -extern int NUMD2pTSize; -extern int NUMD2mPTSize; -extern int NUMD2nSize; -extern int NUMD2iSize; -extern int NUMD2mSize; - -#endif diff --git a/src/spicelib/devices/numd2/numd2itf.h b/src/spicelib/devices/numd2/numd2itf.h deleted file mode 100644 index 2dc39132a..000000000 --- a/src/spicelib/devices/numd2/numd2itf.h +++ /dev/null @@ -1,10 +0,0 @@ -/********** -Copyright 1991 Regents of the University of California. All rights reserved. -**********/ - -#ifndef DEV_NUMD2 -#define DEV_NUMD2 - -extern SPICEdev *get_numd2_info(void); - -#endif diff --git a/src/spicelib/devices/numos/Makefile.am b/src/spicelib/devices/numos/Makefile.am deleted file mode 100644 index 5540675a9..000000000 --- a/src/spicelib/devices/numos/Makefile.am +++ /dev/null @@ -1,29 +0,0 @@ -## Process this file with automake to produce Makefile.in - -noinst_LTLIBRARIES = libnumos.la - -libnumos_la_SOURCES = \ - numm.c \ - nummacld.c \ - nummask.c \ - numosdef.h \ - nummdel.c \ - nummdump.c \ - numosext.h \ - numosinit.c \ - numosinit.h \ - numositf.h \ - nummload.c \ - nummmpar.c \ - nummparm.c \ - nummpzld.c \ - nummset.c \ - nummtemp.c \ - nummtrun.c - - - -AM_CPPFLAGS = @AM_CPPFLAGS@ -I$(top_srcdir)/src/include -AM_CFLAGS = $(STATIC) - -MAINTAINERCLEANFILES = Makefile.in diff --git a/src/spicelib/devices/numos/numm.c b/src/spicelib/devices/numos/numm.c deleted file mode 100644 index 688d3d352..000000000 --- a/src/spicelib/devices/numos/numm.c +++ /dev/null @@ -1,93 +0,0 @@ -/********** -Copyright 1991 Regents of the University of California. All rights reserved. -Author: 1987 Kartikeya Mayaram, U. C. Berkeley CAD Group -Author: 1991 David A. Gates, U. C. Berkeley CAD Group -**********/ - -#include "ngspice/ngspice.h" -#include "ngspice/devdefs.h" -#include "numosdef.h" -#include "ngspice/suffix.h" - -/* - * This file defines the 2d Numerical MOSFET data structures that are - * available to the next level(s) up the calling hierarchy - */ - -IFparm NUMOSpTable[] = { /* parameters */ - IP("off", NUMOS_OFF, IF_FLAG, "Device initially off"), - IP("ic.file", NUMOS_IC_FILE, IF_STRING, "Initial condition file"), - IOP("area", NUMOS_AREA, IF_REAL, "Area factor"), - IOP("w", NUMOS_WIDTH, IF_REAL, "Width factor"), - IOP("l", NUMOS_LENGTH, IF_REAL, "Length factor"), - IP("save", NUMOS_PRINT, IF_INTEGER, "Save solutions"), - IPR("print", NUMOS_PRINT, IF_INTEGER, "Print solutions"), - OP("g11", NUMOS_G11, IF_REAL, "Conductance"), - OP("c11", NUMOS_C11, IF_REAL, "Capacitance"), - OP("y11", NUMOS_Y11, IF_COMPLEX, "Admittance"), - OP("g12", NUMOS_G12, IF_REAL, "Conductance"), - OP("c12", NUMOS_C12, IF_REAL, "Capacitance"), - OP("y12", NUMOS_Y12, IF_COMPLEX, "Admittance"), - OP("g13", NUMOS_G13, IF_REAL, "Conductance"), - OP("c13", NUMOS_C13, IF_REAL, "Capacitance"), - OP("y13", NUMOS_Y13, IF_COMPLEX, "Admittance"), - OPU("g14", NUMOS_G14, IF_REAL, "Conductance"), - OPU("c14", NUMOS_C14, IF_REAL, "Capacitance"), - OPU("y14", NUMOS_Y14, IF_COMPLEX, "Admittance"), - OP("g21", NUMOS_G21, IF_REAL, "Conductance"), - OP("c21", NUMOS_C21, IF_REAL, "Capacitance"), - OP("y21", NUMOS_Y21, IF_COMPLEX, "Admittance"), - OP("g22", NUMOS_G22, IF_REAL, "Conductance"), - OP("c22", NUMOS_C22, IF_REAL, "Capacitance"), - OP("y22", NUMOS_Y22, IF_COMPLEX, "Admittance"), - OP("g23", NUMOS_G23, IF_REAL, "Conductance"), - OP("c23", NUMOS_C23, IF_REAL, "Capacitance"), - OP("y23", NUMOS_Y23, IF_COMPLEX, "Admittance"), - OPU("g24", NUMOS_G24, IF_REAL, "Conductance"), - OPU("c24", NUMOS_C24, IF_REAL, "Capacitance"), - OPU("y24", NUMOS_Y24, IF_COMPLEX, "Admittance"), - OP("g31", NUMOS_G31, IF_REAL, "Conductance"), - OP("c31", NUMOS_C31, IF_REAL, "Capacitance"), - OP("y31", NUMOS_Y31, IF_COMPLEX, "Admittance"), - OP("g32", NUMOS_G32, IF_REAL, "Conductance"), - OP("c32", NUMOS_C32, IF_REAL, "Capacitance"), - OP("y32", NUMOS_Y32, IF_COMPLEX, "Admittance"), - OP("g33", NUMOS_G33, IF_REAL, "Conductance"), - OP("c33", NUMOS_C33, IF_REAL, "Capacitance"), - OP("y33", NUMOS_Y33, IF_COMPLEX, "Admittance"), - OPU("g34", NUMOS_G34, IF_REAL, "Conductance"), - OPU("c34", NUMOS_C34, IF_REAL, "Capacitance"), - OPU("y34", NUMOS_Y34, IF_COMPLEX, "Admittance"), - OPU("g41", NUMOS_G41, IF_REAL, "Conductance"), - OPU("c41", NUMOS_C41, IF_REAL, "Capacitance"), - OPU("y41", NUMOS_Y41, IF_COMPLEX, "Admittance"), - OPU("g42", NUMOS_G42, IF_REAL, "Conductance"), - OPU("c42", NUMOS_C42, IF_REAL, "Capacitance"), - OPU("y42", NUMOS_Y42, IF_COMPLEX, "Admittance"), - OPU("g43", NUMOS_G43, IF_REAL, "Conductance"), - OPU("c43", NUMOS_C43, IF_REAL, "Capacitance"), - OPU("y43", NUMOS_Y43, IF_COMPLEX, "Admittance"), - OPU("g44", NUMOS_G44, IF_REAL, "Conductance"), - OPU("c44", NUMOS_C44, IF_REAL, "Capacitance"), - OPU("y44", NUMOS_Y44, IF_COMPLEX, "Admittance"), - IOP("temp", NUMOS_TEMP, IF_REAL, "Instance temperature") -}; - -IFparm NUMOSmPTable[] = { /* model parameters */ - /* numerical-device models no longer have parameters */ - /* one is left behind to keep the table from being empty */ - IP("numos", NUMOS_MOD_NUMOS, IF_FLAG, "Numerical MOSFET"), -}; - -char *NUMOSnames[] = { - "Drain", - "Gate", - "Source", - "Substrate" -}; - -int NUMOSnSize = NUMELEMS(NUMOSnames); -int NUMOSpTSize = NUMELEMS(NUMOSpTable); -int NUMOSmPTSize = NUMELEMS(NUMOSmPTable); -int NUMOSiSize = sizeof(NUMOSinstance); -int NUMOSmSize = sizeof(NUMOSmodel); diff --git a/src/spicelib/devices/numos/nummacld.c b/src/spicelib/devices/numos/nummacld.c deleted file mode 100644 index bdf115a20..000000000 --- a/src/spicelib/devices/numos/nummacld.c +++ /dev/null @@ -1,153 +0,0 @@ -/********** -Copyright 1991 Regents of the University of California. All rights reserved. -Author: 1987 Kartikeya Mayaram, U. C. Berkeley CAD Group -**********/ - -/* - * Function to load the COMPLEX circuit matrix using the small signal - * parameters saved during a previous DC operating point analysis. - */ - -#include "ngspice/ngspice.h" -#include "ngspice/cktdefs.h" -#include "numosdef.h" -#include "ngspice/sperror.h" -#include "ngspice/suffix.h" -#include "ngspice/complex.h" -#include "../../../ciderlib/twod/twoddefs.h" -#include "../../../ciderlib/twod/twodext.h" -#include "ngspice/cidersupt.h" - - -int -NUMOSacLoad(GENmodel *inModel, CKTcircuit *ckt) -{ - register NUMOSmodel *model = (NUMOSmodel *) inModel; - register NUMOSinstance *inst; - struct mosAdmittances yAc; - double startTime; - - for (; model != NULL; model = NUMOSnextModel(model)) { - FieldDepMobility = model->NUMOSmodels->MODLfieldDepMobility; - TransDepMobility = model->NUMOSmodels->MODLtransDepMobility; - SurfaceMobility = model->NUMOSmodels->MODLsurfaceMobility; - Srh = model->NUMOSmodels->MODLsrh; - Auger = model->NUMOSmodels->MODLauger; - AvalancheGen = model->NUMOSmodels->MODLavalancheGen; - OneCarrier = model->NUMOSmethods->METHoneCarrier; - AcAnalysisMethod = model->NUMOSmethods->METHacAnalysisMethod; - MobDeriv = model->NUMOSmethods->METHmobDeriv; - TWOacDebug = model->NUMOSoutputs->OUTPacDebug; - - for (inst = NUMOSinstances(model); inst != NULL; - inst = NUMOSnextInstance(inst)) { - - startTime = SPfrontEnd->IFseconds(); - /* Get Temp.-Dep. Global Parameters */ - GLOBgetGlobals(&(inst->NUMOSglobals)); - - model->NUMOSmethods->METHacAnalysisMethod = - NUMOSadmittance(inst->NUMOSpDevice, - ckt->CKTomega, &yAc); - - *(inst->NUMOSdrainDrainPtr) += yAc.yIdVdb.real; - *(inst->NUMOSdrainDrainPtr + 1) += yAc.yIdVdb.imag; - *(inst->NUMOSdrainSourcePtr) += yAc.yIdVsb.real; - *(inst->NUMOSdrainSourcePtr + 1) += yAc.yIdVsb.imag; - *(inst->NUMOSdrainGatePtr) += yAc.yIdVgb.real; - *(inst->NUMOSdrainGatePtr + 1) += yAc.yIdVgb.imag; - *(inst->NUMOSdrainBulkPtr) -= - yAc.yIdVdb.real + yAc.yIdVsb.real + yAc.yIdVgb.real; - *(inst->NUMOSdrainBulkPtr + 1) -= - yAc.yIdVdb.imag + yAc.yIdVsb.imag + yAc.yIdVgb.imag; - - *(inst->NUMOSsourceDrainPtr) += yAc.yIsVdb.real; - *(inst->NUMOSsourceDrainPtr + 1) += yAc.yIsVdb.imag; - *(inst->NUMOSsourceSourcePtr) += yAc.yIsVsb.real; - *(inst->NUMOSsourceSourcePtr + 1) += yAc.yIsVsb.imag; - *(inst->NUMOSsourceGatePtr) += yAc.yIsVgb.real; - *(inst->NUMOSsourceGatePtr + 1) += yAc.yIsVgb.imag; - *(inst->NUMOSsourceBulkPtr) -= - yAc.yIsVdb.real + yAc.yIsVsb.real + yAc.yIsVgb.real; - *(inst->NUMOSsourceBulkPtr + 1) -= - yAc.yIsVdb.imag + yAc.yIsVsb.imag + yAc.yIsVgb.imag; - - *(inst->NUMOSgateDrainPtr) += yAc.yIgVdb.real; - *(inst->NUMOSgateDrainPtr + 1) += yAc.yIgVdb.imag; - *(inst->NUMOSgateSourcePtr) += yAc.yIgVsb.real; - *(inst->NUMOSgateSourcePtr + 1) += yAc.yIgVsb.imag; - *(inst->NUMOSgateGatePtr) += yAc.yIgVgb.real; - *(inst->NUMOSgateGatePtr + 1) += yAc.yIgVgb.imag; - *(inst->NUMOSgateBulkPtr) -= - yAc.yIgVdb.real + yAc.yIgVsb.real + yAc.yIgVgb.real; - *(inst->NUMOSgateBulkPtr + 1) -= - yAc.yIgVdb.imag + yAc.yIgVsb.imag + yAc.yIgVgb.imag; - - *(inst->NUMOSbulkDrainPtr) -= - yAc.yIdVdb.real + yAc.yIsVdb.real + yAc.yIgVdb.real; - *(inst->NUMOSbulkDrainPtr + 1) -= - yAc.yIdVdb.imag + yAc.yIsVdb.imag + yAc.yIgVdb.imag; - *(inst->NUMOSbulkSourcePtr) -= - yAc.yIdVsb.real + yAc.yIsVsb.real + yAc.yIgVsb.real; - *(inst->NUMOSbulkSourcePtr + 1) -= - yAc.yIdVsb.imag + yAc.yIsVsb.imag + yAc.yIgVsb.imag; - *(inst->NUMOSbulkGatePtr) -= - yAc.yIdVgb.real + yAc.yIsVgb.real + yAc.yIgVgb.real; - *(inst->NUMOSbulkGatePtr + 1) -= - yAc.yIdVgb.imag + yAc.yIsVgb.imag + yAc.yIgVgb.imag; - *(inst->NUMOSbulkBulkPtr) += yAc.yIdVdb.real + yAc.yIdVsb.real + - yAc.yIdVgb.real + yAc.yIsVdb.real + - yAc.yIsVsb.real + yAc.yIsVgb.real + - yAc.yIgVdb.real + yAc.yIgVsb.real + - yAc.yIgVgb.real; - *(inst->NUMOSbulkBulkPtr + 1) -= yAc.yIdVdb.imag + yAc.yIdVsb.imag + - yAc.yIdVgb.imag + yAc.yIsVdb.imag + - yAc.yIsVsb.imag + yAc.yIsVgb.imag + - yAc.yIgVdb.imag + yAc.yIgVsb.imag + - yAc.yIgVgb.imag; - if (ckt->CKTomega != 0.0) { - inst->NUMOSc11 = yAc.yIdVdb.imag / ckt->CKTomega; - inst->NUMOSc12 = yAc.yIdVgb.imag / ckt->CKTomega; - inst->NUMOSc13 = yAc.yIdVsb.imag / ckt->CKTomega; - inst->NUMOSc21 = yAc.yIgVdb.imag / ckt->CKTomega; - inst->NUMOSc22 = yAc.yIgVgb.imag / ckt->CKTomega; - inst->NUMOSc23 = yAc.yIgVsb.imag / ckt->CKTomega; - inst->NUMOSc31 = yAc.yIsVdb.imag / ckt->CKTomega; - inst->NUMOSc32 = yAc.yIsVgb.imag / ckt->CKTomega; - inst->NUMOSc33 = yAc.yIsVsb.imag / ckt->CKTomega; - } else { - inst->NUMOSc11 = 0.0; /* XXX What else can be done?! */ - inst->NUMOSc12 = 0.0; /* XXX What else can be done?! */ - inst->NUMOSc13 = 0.0; /* XXX What else can be done?! */ - inst->NUMOSc21 = 0.0; /* XXX What else can be done?! */ - inst->NUMOSc22 = 0.0; /* XXX What else can be done?! */ - inst->NUMOSc23 = 0.0; /* XXX What else can be done?! */ - inst->NUMOSc31 = 0.0; /* XXX What else can be done?! */ - inst->NUMOSc32 = 0.0; /* XXX What else can be done?! */ - inst->NUMOSc33 = 0.0; /* XXX What else can be done?! */ - } - inst->NUMOSy11r = yAc.yIdVdb.real; - inst->NUMOSy11i = yAc.yIdVdb.imag; - inst->NUMOSy12r = yAc.yIdVgb.real; - inst->NUMOSy12i = yAc.yIdVgb.imag; - inst->NUMOSy13r = yAc.yIdVsb.real; - inst->NUMOSy13i = yAc.yIdVsb.imag; - inst->NUMOSy21r = yAc.yIgVdb.real; - inst->NUMOSy21i = yAc.yIgVdb.imag; - inst->NUMOSy22r = yAc.yIgVgb.real; - inst->NUMOSy22i = yAc.yIgVgb.imag; - inst->NUMOSy23r = yAc.yIgVsb.real; - inst->NUMOSy23i = yAc.yIgVsb.imag; - inst->NUMOSy31r = yAc.yIsVdb.real; - inst->NUMOSy31i = yAc.yIsVdb.imag; - inst->NUMOSy32r = yAc.yIsVgb.real; - inst->NUMOSy32i = yAc.yIsVgb.imag; - inst->NUMOSy33r = yAc.yIsVsb.real; - inst->NUMOSy33i = yAc.yIsVsb.imag; - inst->NUMOSsmSigAvail = TRUE; - inst->NUMOSpDevice->pStats->totalTime[STAT_AC] += - SPfrontEnd->IFseconds() - startTime; - } - } - return (OK); -} diff --git a/src/spicelib/devices/numos/nummask.c b/src/spicelib/devices/numos/nummask.c deleted file mode 100644 index 7dd2bc3b5..000000000 --- a/src/spicelib/devices/numos/nummask.c +++ /dev/null @@ -1,357 +0,0 @@ -/********** -Copyright 1990 Regents of the University of California. All rights reserved. -Author: 1987 Thomas L. Quarles -**********/ - -#include "ngspice/ngspice.h" -#include "ngspice/const.h" -#include "ngspice/ifsim.h" -#include "ngspice/cktdefs.h" -#include "ngspice/devdefs.h" -#include "numosdef.h" -#include "ngspice/sperror.h" -#include "ngspice/suffix.h" - -/* Externals Declarations */ -extern int NUMOSinitSmSig(NUMOSinstance *); - -/* ARGSUSED */ -int -NUMOSask(CKTcircuit *ckt, GENinstance *inInst, int which, IFvalue *value, IFvalue *select) -{ - NUMOSinstance *inst = (NUMOSinstance *) inInst; - - NG_IGNORE(select); - - switch (which) { - case NUMOS_AREA: - value->rValue = inst->NUMOSarea; - return (OK); - case NUMOS_WIDTH: - value->rValue = inst->NUMOSwidth; - return (OK); - case NUMOS_LENGTH: - value->rValue = inst->NUMOSlength; - return (OK); - case NUMOS_TEMP: - value->rValue = inst->NUMOStemp - CONSTCtoK; - return (OK); - case NUMOS_G11: - value->rValue = *(ckt->CKTstate0 + inst->NUMOSdIdDVdb); - return (OK); - case NUMOS_G12: - value->rValue = *(ckt->CKTstate0 + inst->NUMOSdIdDVgb); - return (OK); - case NUMOS_G13: - value->rValue = *(ckt->CKTstate0 + inst->NUMOSdIdDVsb); - return (OK); - case NUMOS_G14: - value->rValue = -*(ckt->CKTstate0 + inst->NUMOSdIdDVdb) - - *(ckt->CKTstate0 + inst->NUMOSdIdDVgb) - - *(ckt->CKTstate0 + inst->NUMOSdIdDVsb); - return (OK); - case NUMOS_G21: - value->rValue = *(ckt->CKTstate0 + inst->NUMOSdIgDVdb); - return (OK); - case NUMOS_G22: - value->rValue = *(ckt->CKTstate0 + inst->NUMOSdIgDVgb); - return (OK); - case NUMOS_G23: - value->rValue = *(ckt->CKTstate0 + inst->NUMOSdIgDVsb); - return (OK); - case NUMOS_G24: - value->rValue = -*(ckt->CKTstate0 + inst->NUMOSdIgDVdb) - - *(ckt->CKTstate0 + inst->NUMOSdIgDVgb) - - *(ckt->CKTstate0 + inst->NUMOSdIgDVsb); - return (OK); - case NUMOS_G31: - value->rValue = *(ckt->CKTstate0 + inst->NUMOSdIsDVdb); - return (OK); - case NUMOS_G32: - value->rValue = *(ckt->CKTstate0 + inst->NUMOSdIsDVgb); - return (OK); - case NUMOS_G33: - value->rValue = *(ckt->CKTstate0 + inst->NUMOSdIsDVsb); - return (OK); - case NUMOS_G34: - value->rValue = -*(ckt->CKTstate0 + inst->NUMOSdIsDVdb) - - *(ckt->CKTstate0 + inst->NUMOSdIsDVgb) - - *(ckt->CKTstate0 + inst->NUMOSdIsDVsb); - return (OK); - case NUMOS_G41: - value->rValue = -*(ckt->CKTstate0 + inst->NUMOSdIdDVdb) - - *(ckt->CKTstate0 + inst->NUMOSdIgDVdb) - - *(ckt->CKTstate0 + inst->NUMOSdIsDVdb); - return (OK); - case NUMOS_G42: - value->rValue = -*(ckt->CKTstate0 + inst->NUMOSdIdDVgb) - - *(ckt->CKTstate0 + inst->NUMOSdIgDVgb) - - *(ckt->CKTstate0 + inst->NUMOSdIsDVgb); - return (OK); - case NUMOS_G43: - value->rValue = -*(ckt->CKTstate0 + inst->NUMOSdIdDVsb) - - *(ckt->CKTstate0 + inst->NUMOSdIgDVsb) - - *(ckt->CKTstate0 + inst->NUMOSdIsDVsb); - return (OK); - case NUMOS_G44: - value->rValue = *(ckt->CKTstate0 + inst->NUMOSdIdDVdb) - + *(ckt->CKTstate0 + inst->NUMOSdIgDVdb) - + *(ckt->CKTstate0 + inst->NUMOSdIsDVdb) - + *(ckt->CKTstate0 + inst->NUMOSdIdDVgb) - + *(ckt->CKTstate0 + inst->NUMOSdIgDVgb) - + *(ckt->CKTstate0 + inst->NUMOSdIsDVgb) - + *(ckt->CKTstate0 + inst->NUMOSdIdDVsb) - + *(ckt->CKTstate0 + inst->NUMOSdIgDVsb) - + *(ckt->CKTstate0 + inst->NUMOSdIsDVsb); - return (OK); - case NUMOS_C11: - if (!inst->NUMOSsmSigAvail - && ckt->CKTcurrentAnalysis != DOING_TRAN) { - NUMOSinitSmSig(inst); - } - value->rValue = inst->NUMOSc11; - return (OK); - case NUMOS_C12: - if (!inst->NUMOSsmSigAvail - && ckt->CKTcurrentAnalysis != DOING_TRAN) { - NUMOSinitSmSig(inst); - } - value->rValue = inst->NUMOSc12; - return (OK); - case NUMOS_C13: - if (!inst->NUMOSsmSigAvail - && ckt->CKTcurrentAnalysis != DOING_TRAN) { - NUMOSinitSmSig(inst); - } - value->rValue = inst->NUMOSc13; - return (OK); - case NUMOS_C14: - if (!inst->NUMOSsmSigAvail - && ckt->CKTcurrentAnalysis != DOING_TRAN) { - NUMOSinitSmSig(inst); - } - value->rValue = -inst->NUMOSc11 - inst->NUMOSc12 - inst->NUMOSc13; - return (OK); - case NUMOS_C21: - if (!inst->NUMOSsmSigAvail - && ckt->CKTcurrentAnalysis != DOING_TRAN) { - NUMOSinitSmSig(inst); - } - value->rValue = inst->NUMOSc21; - return (OK); - case NUMOS_C22: - if (!inst->NUMOSsmSigAvail - && ckt->CKTcurrentAnalysis != DOING_TRAN) { - NUMOSinitSmSig(inst); - } - value->rValue = inst->NUMOSc22; - return (OK); - case NUMOS_C23: - if (!inst->NUMOSsmSigAvail - && ckt->CKTcurrentAnalysis != DOING_TRAN) { - NUMOSinitSmSig(inst); - } - value->rValue = inst->NUMOSc23; - return (OK); - case NUMOS_C24: - if (!inst->NUMOSsmSigAvail - && ckt->CKTcurrentAnalysis != DOING_TRAN) { - NUMOSinitSmSig(inst); - } - value->rValue = -inst->NUMOSc21 - inst->NUMOSc22 - inst->NUMOSc23; - return (OK); - case NUMOS_C31: - if (!inst->NUMOSsmSigAvail - && ckt->CKTcurrentAnalysis != DOING_TRAN) { - NUMOSinitSmSig(inst); - } - value->rValue = inst->NUMOSc31; - return (OK); - case NUMOS_C32: - if (!inst->NUMOSsmSigAvail - && ckt->CKTcurrentAnalysis != DOING_TRAN) { - NUMOSinitSmSig(inst); - } - value->rValue = inst->NUMOSc32; - return (OK); - case NUMOS_C33: - if (!inst->NUMOSsmSigAvail - && ckt->CKTcurrentAnalysis != DOING_TRAN) { - NUMOSinitSmSig(inst); - } - value->rValue = inst->NUMOSc33; - return (OK); - case NUMOS_C34: - if (!inst->NUMOSsmSigAvail - && ckt->CKTcurrentAnalysis != DOING_TRAN) { - NUMOSinitSmSig(inst); - } - value->rValue = -inst->NUMOSc31 - inst->NUMOSc32 - inst->NUMOSc33; - return (OK); - case NUMOS_C41: - if (!inst->NUMOSsmSigAvail - && ckt->CKTcurrentAnalysis != DOING_TRAN) { - NUMOSinitSmSig(inst); - } - value->rValue = -inst->NUMOSc11 - inst->NUMOSc21 - inst->NUMOSc31; - return (OK); - case NUMOS_C42: - if (!inst->NUMOSsmSigAvail - && ckt->CKTcurrentAnalysis != DOING_TRAN) { - NUMOSinitSmSig(inst); - } - value->rValue = -inst->NUMOSc12 - inst->NUMOSc22 - inst->NUMOSc32; - return (OK); - case NUMOS_C43: - if (!inst->NUMOSsmSigAvail - && ckt->CKTcurrentAnalysis != DOING_TRAN) { - NUMOSinitSmSig(inst); - } - value->rValue = -inst->NUMOSc13 - inst->NUMOSc23 - inst->NUMOSc33; - return (OK); - case NUMOS_C44: - if (!inst->NUMOSsmSigAvail - && ckt->CKTcurrentAnalysis != DOING_TRAN) { - NUMOSinitSmSig(inst); - } - value->rValue = inst->NUMOSc11 + inst->NUMOSc12 + inst->NUMOSc13 - + inst->NUMOSc21 + inst->NUMOSc22 + inst->NUMOSc23 - + inst->NUMOSc31 + inst->NUMOSc32 + inst->NUMOSc33; - return (OK); - case NUMOS_Y11: - if (!inst->NUMOSsmSigAvail - && ckt->CKTcurrentAnalysis != DOING_TRAN) { - NUMOSinitSmSig(inst); - } - value->cValue.real = inst->NUMOSy11r; - value->cValue.imag = inst->NUMOSy11i; - return (OK); - case NUMOS_Y12: - if (!inst->NUMOSsmSigAvail - && ckt->CKTcurrentAnalysis != DOING_TRAN) { - NUMOSinitSmSig(inst); - } - value->cValue.real = inst->NUMOSy12r; - value->cValue.imag = inst->NUMOSy12i; - return (OK); - case NUMOS_Y13: - if (!inst->NUMOSsmSigAvail - && ckt->CKTcurrentAnalysis != DOING_TRAN) { - NUMOSinitSmSig(inst); - } - value->cValue.real = inst->NUMOSy13r; - value->cValue.imag = inst->NUMOSy13i; - return (OK); - case NUMOS_Y14: - if (!inst->NUMOSsmSigAvail - && ckt->CKTcurrentAnalysis != DOING_TRAN) { - NUMOSinitSmSig(inst); - } - value->cValue.real = -inst->NUMOSy11r - inst->NUMOSy11r - inst->NUMOSy11r; - value->cValue.imag = -inst->NUMOSy11i - inst->NUMOSy11i - inst->NUMOSy11i; - return (OK); - case NUMOS_Y21: - if (!inst->NUMOSsmSigAvail - && ckt->CKTcurrentAnalysis != DOING_TRAN) { - NUMOSinitSmSig(inst); - } - value->cValue.real = inst->NUMOSy21r; - value->cValue.imag = inst->NUMOSy21i; - return (OK); - case NUMOS_Y22: - if (!inst->NUMOSsmSigAvail - && ckt->CKTcurrentAnalysis != DOING_TRAN) { - NUMOSinitSmSig(inst); - } - value->cValue.real = inst->NUMOSy22r; - value->cValue.imag = inst->NUMOSy22i; - return (OK); - case NUMOS_Y23: - if (!inst->NUMOSsmSigAvail - && ckt->CKTcurrentAnalysis != DOING_TRAN) { - NUMOSinitSmSig(inst); - } - value->cValue.real = inst->NUMOSy23r; - value->cValue.imag = inst->NUMOSy23i; - return (OK); - case NUMOS_Y24: - if (!inst->NUMOSsmSigAvail - && ckt->CKTcurrentAnalysis != DOING_TRAN) { - NUMOSinitSmSig(inst); - } - value->cValue.real = -inst->NUMOSy21r - inst->NUMOSy22r - inst->NUMOSy23r; - value->cValue.imag = -inst->NUMOSy21i - inst->NUMOSy22i - inst->NUMOSy23i; - return (OK); - case NUMOS_Y31: - if (!inst->NUMOSsmSigAvail - && ckt->CKTcurrentAnalysis != DOING_TRAN) { - NUMOSinitSmSig(inst); - } - value->cValue.real = inst->NUMOSy31r; - value->cValue.imag = inst->NUMOSy31i; - return (OK); - case NUMOS_Y32: - if (!inst->NUMOSsmSigAvail - && ckt->CKTcurrentAnalysis != DOING_TRAN) { - NUMOSinitSmSig(inst); - } - value->cValue.real = inst->NUMOSy32r; - value->cValue.imag = inst->NUMOSy32i; - return (OK); - case NUMOS_Y33: - if (!inst->NUMOSsmSigAvail - && ckt->CKTcurrentAnalysis != DOING_TRAN) { - NUMOSinitSmSig(inst); - } - value->cValue.real = inst->NUMOSy33r; - value->cValue.imag = inst->NUMOSy33i; - return (OK); - case NUMOS_Y34: - if (!inst->NUMOSsmSigAvail - && ckt->CKTcurrentAnalysis != DOING_TRAN) { - NUMOSinitSmSig(inst); - } - value->cValue.real = -inst->NUMOSy31r - inst->NUMOSy32r - inst->NUMOSy33r; - value->cValue.imag = -inst->NUMOSy31i - inst->NUMOSy32i - inst->NUMOSy33i; - return (OK); - case NUMOS_Y41: - if (!inst->NUMOSsmSigAvail - && ckt->CKTcurrentAnalysis != DOING_TRAN) { - NUMOSinitSmSig(inst); - } - value->cValue.real = -inst->NUMOSy11r - inst->NUMOSy21r - inst->NUMOSy31r; - value->cValue.imag = -inst->NUMOSy11i - inst->NUMOSy21i - inst->NUMOSy31i; - return (OK); - case NUMOS_Y42: - if (!inst->NUMOSsmSigAvail - && ckt->CKTcurrentAnalysis != DOING_TRAN) { - NUMOSinitSmSig(inst); - } - value->cValue.real = -inst->NUMOSy12r - inst->NUMOSy22r - inst->NUMOSy32r; - value->cValue.imag = -inst->NUMOSy12i - inst->NUMOSy22i - inst->NUMOSy32i; - return (OK); - case NUMOS_Y43: - if (!inst->NUMOSsmSigAvail - && ckt->CKTcurrentAnalysis != DOING_TRAN) { - NUMOSinitSmSig(inst); - } - value->cValue.real = -inst->NUMOSy13r - inst->NUMOSy23r - inst->NUMOSy33r; - value->cValue.imag = -inst->NUMOSy13i - inst->NUMOSy23i - inst->NUMOSy33i; - return (OK); - case NUMOS_Y44: - if (!inst->NUMOSsmSigAvail - && ckt->CKTcurrentAnalysis != DOING_TRAN) { - NUMOSinitSmSig(inst); - } - value->cValue.real = inst->NUMOSy11r + inst->NUMOSy21r + inst->NUMOSy31r - + inst->NUMOSy12r + inst->NUMOSy22r + inst->NUMOSy32r - + inst->NUMOSy13r + inst->NUMOSy23r + inst->NUMOSy33r; - value->cValue.imag = inst->NUMOSy11i + inst->NUMOSy21i + inst->NUMOSy31i - + inst->NUMOSy12i + inst->NUMOSy22i + inst->NUMOSy32i - + inst->NUMOSy13i + inst->NUMOSy23i + inst->NUMOSy33i; - return (OK); - default: - return (E_BADPARM); - } - /* NOTREACHED */ -} diff --git a/src/spicelib/devices/numos/nummdel.c b/src/spicelib/devices/numos/nummdel.c deleted file mode 100644 index 850c806da..000000000 --- a/src/spicelib/devices/numos/nummdel.c +++ /dev/null @@ -1,27 +0,0 @@ -/********** -Copyright 1991 Regents of the University of California. All rights reserved. -Author: 1987 Kartikeya Mayaram, U. C. Berkeley CAD Group -**********/ - -/* - * This routine deletes a NUMOS instance from the circuit and frees the - * storage it was using. - */ - -#include "ngspice/ngspice.h" -#include "numosdef.h" -#include "../../../ciderlib/twod/twoddefs.h" -#include "../../../ciderlib/twod/twodext.h" -#include "ngspice/sperror.h" -#include "ngspice/suffix.h" - - -int -NUMOSdelete(GENinstance *gen_inst) -{ - NUMOSinstance *inst = (NUMOSinstance *) gen_inst; - - TWOdestroy(inst->NUMOSpDevice); - - return OK; -} diff --git a/src/spicelib/devices/numos/nummdump.c b/src/spicelib/devices/numos/nummdump.c deleted file mode 100644 index 7fddbaa4a..000000000 --- a/src/spicelib/devices/numos/nummdump.c +++ /dev/null @@ -1,176 +0,0 @@ -/********** -Copyright 1992 Regents of the University of California. All rights reserved. -Author: 1987 Kartikeya Mayaram, U. C. Berkeley CAD Group -Author: 1991 David A. Gates, U. C. Berkeley CAD Group -**********/ - -/* - * This is a simple routine to dump the internal device states. It produces - * states for .OP, .DC, & .TRAN simulations. - */ - -#include "ngspice/ngspice.h" -#include "ngspice/cktdefs.h" -#include "numosdef.h" -#include "../../../ciderlib/twod/twoddefs.h" -#include "../../../ciderlib/twod/twodext.h" -#include "ngspice/cidersupt.h" -#include "ngspice/suffix.h" - - -/* Forward Declarations */ -static void NUMOSputHeader(FILE *, CKTcircuit *, NUMOSinstance *); - -/* State Counter */ -static int state_numOP = 0; -static int state_numDC = 0; -static int state_numTR = 0; - -void -NUMOSdump(GENmodel *inModel, CKTcircuit *ckt) -{ - register NUMOSmodel *model = (NUMOSmodel *) inModel; - register NUMOSinstance *inst; - OUTPcard *output; - FILE *fpState; - char fileName[BSIZE_SP]; - char description[BSIZE_SP]; - char *prefix; - int *state_num; - int anyOutput = 0; - BOOLEAN writeAscii = TRUE; - - if (ckt->CKTmode & MODEDCOP) { - prefix = "OP"; - state_num = &state_numOP; - sprintf(description, "..."); - } else if (ckt->CKTmode & MODEDCTRANCURVE) { - prefix = "DC"; - state_num = &state_numDC; - sprintf(description, "sweep = % e", ckt->CKTtime); - } else if (ckt->CKTmode & MODETRAN) { - prefix = "TR"; - state_num = &state_numTR; - sprintf(description, "time = % e", ckt->CKTtime); - } else { - /* Not a recognized CKT mode. */ - return; - } - - for (; model != NULL; model = NUMOSnextModel(model)) { - output = model->NUMOSoutputs; - for (inst = NUMOSinstances(model); inst != NULL; - inst = NUMOSnextInstance(inst)) { - - if (inst->NUMOSprintGiven) { - if ((ckt->CKTmode & MODETRAN) && - ((ckt->CKTstat->STATaccepted - 1) % inst->NUMOSprint != 0)) { - continue; - } - anyOutput = 1; - sprintf(fileName, "%s%s.%d.%s", output->OUTProotFile, prefix, - *state_num, inst->NUMOSname); - - writeAscii = compareFiletypeVar("ascii"); - - fpState = fopen(fileName, (writeAscii ? "w" : "wb")); - if (!fpState) { - perror(fileName); - } else { - NUMOSputHeader(fpState, ckt, inst); - TWOprnSolution(fpState, inst->NUMOSpDevice, - model->NUMOSoutputs, writeAscii, "numos"); - fclose(fpState); - LOGmakeEntry(fileName, description); - } - } - } - } - if (anyOutput) { - (*state_num)++; - } -} - -#define NUMOSnumOutputs 10 - -static -void -NUMOSputHeader(FILE *file, CKTcircuit *ckt, NUMOSinstance *inst) -{ - char *reference; - double refVal = 0.0; - int numVars = NUMOSnumOutputs; - - if (ckt->CKTmode & MODEDCOP) { - reference = NULL; - } else if (ckt->CKTmode & MODEDCTRANCURVE) { - reference = "sweep"; - refVal = ckt->CKTtime; - numVars++; - } else if (ckt->CKTmode & MODETRAN) { - reference = "time"; - refVal = ckt->CKTtime; - numVars++; - } else { - reference = NULL; - } - fprintf(file, "Title: Device %s external state\n", inst->NUMOSname); - fprintf(file, "Plotname: Device Operating Point\n"); - fprintf(file, "Command: deftype v conductance S\n"); - fprintf(file, "Flags: real\n"); - fprintf(file, "No. Variables: %d\n", numVars); - fprintf(file, "No. Points: 1\n"); - numVars = 0; - fprintf(file, "Variables:\n"); - if (reference) { - fprintf(file, "\t%d %s unknown\n", numVars++, reference); - } - fprintf(file, "\t%d v14 voltage\n", numVars++); - fprintf(file, "\t%d v24 voltage\n", numVars++); - fprintf(file, "\t%d v34 voltage\n", numVars++); - fprintf(file, "\t%d i1 current\n", numVars++); - fprintf(file, "\t%d i2 current\n", numVars++); - fprintf(file, "\t%d i3 current\n", numVars++); - fprintf(file, "\t%d i4 current\n", numVars++); - fprintf(file, "\t%d g11 conductance\n", numVars++); - fprintf(file, "\t%d g12 conductance\n", numVars++); - fprintf(file, "\t%d g13 conductance\n", numVars++); - fprintf(file, "Values:\n0"); - if (reference) { - fprintf(file, "\t% e\n", refVal); - } - fprintf(file, "\t% e\n", *(ckt->CKTstate0 + inst->NUMOSvdb)); - fprintf(file, "\t% e\n", *(ckt->CKTstate0 + inst->NUMOSvgb)); - fprintf(file, "\t% e\n", *(ckt->CKTstate0 + inst->NUMOSvsb)); - fprintf(file, "\t% e\n", *(ckt->CKTstate0 + inst->NUMOSid)); - fprintf(file, "\t% e\n", *(ckt->CKTstate0 + inst->NUMOSig)); - fprintf(file, "\t% e\n", *(ckt->CKTstate0 + inst->NUMOSis)); - fprintf(file, "\t% e\n", -*(ckt->CKTstate0 + inst->NUMOSid) - - *(ckt->CKTstate0 + inst->NUMOSig) - - *(ckt->CKTstate0 + inst->NUMOSis)); - fprintf(file, "\t% e\n", *(ckt->CKTstate0 + inst->NUMOSdIdDVdb)); - fprintf(file, "\t% e\n", *(ckt->CKTstate0 + inst->NUMOSdIdDVgb)); - fprintf(file, "\t% e\n", *(ckt->CKTstate0 + inst->NUMOSdIdDVsb)); -} - -void -NUMOSacct(GENmodel *inModel, CKTcircuit *ckt, FILE *file) -{ - register NUMOSmodel *model = (NUMOSmodel *) inModel; - register NUMOSinstance *inst; - OUTPcard *output; - - NG_IGNORE(ckt); - - for (; model != NULL; model = NUMOSnextModel(model)) { - output = model->NUMOSoutputs; - for (inst = NUMOSinstances(model); inst != NULL; - inst = NUMOSnextInstance(inst)) { - - if (output->OUTPstats) { - TWOmemStats(file, inst->NUMOSpDevice); - TWOcpuStats(file, inst->NUMOSpDevice); - } - } - } -} diff --git a/src/spicelib/devices/numos/nummload.c b/src/spicelib/devices/numos/nummload.c deleted file mode 100644 index 67b7a6e5d..000000000 --- a/src/spicelib/devices/numos/nummload.c +++ /dev/null @@ -1,640 +0,0 @@ -/********** -Copyright 1991 Regents of the University of California. All rights reserved. -Author: 1987 Kartikeya Mayaram, U. C. Berkeley CAD Group -**********/ - -/* - * This is the function called each iteration to evaluate the 2d numerical - * MOSFETs in the circuit and load them into the matrix as appropriate - */ - -#include "ngspice/ngspice.h" -#include "ngspice/devdefs.h" -#include "ngspice/cktdefs.h" -#include "numosdef.h" -#include "ngspice/trandefs.h" -#include "ngspice/sperror.h" -#include "../../../ciderlib/twod/twoddefs.h" -#include "../../../ciderlib/twod/twodext.h" -#include "ngspice/cidersupt.h" -#include "ngspice/suffix.h" - - - -/* Forward Declarations */ - -int NUMOSinitSmSig(NUMOSinstance *inst); - -int -NUMOSload(GENmodel *inModel, CKTcircuit *ckt) -{ - register NUMOSmodel *model = (NUMOSmodel *) inModel; - register NUMOSinstance *inst; - register TWOdevice *pDevice; - double startTime, startTime2, totalTime, totalTime2; - double tol; - double xfact; - double id = 0.0, is = 0.0, ig = 0.0; - double ideq, iseq, igeq; - double idhat = 0.0, ishat = 0.0, ighat = 0.0; - double delVdb, delVsb, delVgb; - double vdb, vsb, vgb; - int icheck; - int icheck1; - int i; - double deltaNorm[7]; - int devConverged = 0; - int numDevNonCon; - int deviceType; - int doInitSolve; - int doVoltPred; - char *initStateName; - - struct mosConductances g; - /* remove compiler warning */ - g.dIdDVdb = 0.0; - g.dIdDVsb = 0.0; - g.dIdDVgb = 0.0; - g.dIsDVdb = 0.0; - g.dIsDVsb = 0.0; - g.dIsDVgb = 0.0; - g.dIgDVdb = 0.0; - g.dIgDVsb = 0.0; - g.dIgDVgb = 0.0; - /* loop through all the models */ - for (; model != NULL; model = NUMOSnextModel(model)) { - FieldDepMobility = model->NUMOSmodels->MODLfieldDepMobility; - TransDepMobility = model->NUMOSmodels->MODLtransDepMobility; - SurfaceMobility = model->NUMOSmodels->MODLsurfaceMobility; - Srh = model->NUMOSmodels->MODLsrh; - Auger = model->NUMOSmodels->MODLauger; - AvalancheGen = model->NUMOSmodels->MODLavalancheGen; - OneCarrier = model->NUMOSmethods->METHoneCarrier; - MobDeriv = model->NUMOSmethods->METHmobDeriv; - MaxIterations = model->NUMOSmethods->METHitLim; - TWOdcDebug = model->NUMOSoutputs->OUTPdcDebug; - TWOtranDebug = model->NUMOSoutputs->OUTPtranDebug; - TWOacDebug = model->NUMOSoutputs->OUTPacDebug; - deviceType = model->NUMOSoptions->OPTNdeviceType; - doVoltPred = model->NUMOSmethods->METHvoltPred; - - if (ckt->CKTmode & MODEINITPRED) { - /* compute normalized deltas and predictor coeff */ - if (!(ckt->CKTmode & MODEDCTRANCURVE)) { - model->NUMOSpInfo->order = ckt->CKTorder; - model->NUMOSpInfo->method = ckt->CKTintegrateMethod; - for (i = 0; i <= ckt->CKTmaxOrder; i++) { - deltaNorm[i] = ckt->CKTdeltaOld[i] / TNorm; - } - computeIntegCoeff(ckt->CKTintegrateMethod, ckt->CKTorder, - model->NUMOSpInfo->intCoeff, deltaNorm); - computePredCoeff(ckt->CKTintegrateMethod, ckt->CKTorder, - model->NUMOSpInfo->predCoeff, deltaNorm); - } - } else if (ckt->CKTmode & MODEINITTRAN) { - model->NUMOSpInfo->order = ckt->CKTorder; - model->NUMOSpInfo->method = ckt->CKTintegrateMethod; - for (i = 0; i <= ckt->CKTmaxOrder; i++) { - deltaNorm[i] = ckt->CKTdeltaOld[i] / TNorm; - } - computeIntegCoeff(ckt->CKTintegrateMethod, ckt->CKTorder, - model->NUMOSpInfo->intCoeff, deltaNorm); - } - /* loop through all the instances of the model */ - for (inst = NUMOSinstances(model); inst != NULL; - inst = NUMOSnextInstance(inst)) { - - pDevice = inst->NUMOSpDevice; - - totalTime = 0.0; - startTime = SPfrontEnd->IFseconds(); - - /* Get Temp.-Dep. Global Parameters */ - GLOBgetGlobals(&(inst->NUMOSglobals)); - - /* - * initialization - */ - pDevice->devStates = ckt->CKTstates; - icheck = 1; - doInitSolve = FALSE; - initStateName = NULL; - if (ckt->CKTmode & MODEINITSMSIG) { - vdb = *(ckt->CKTstate0 + inst->NUMOSvdb); - vsb = *(ckt->CKTstate0 + inst->NUMOSvsb); - vgb = *(ckt->CKTstate0 + inst->NUMOSvgb); - delVdb = 0.0; - delVsb = 0.0; - delVgb = 0.0; - NUMOSsetBCs(pDevice, vdb, vsb, vgb); - } else if (ckt->CKTmode & MODEINITTRAN) { - *(ckt->CKTstate0 + inst->NUMOSvdb) = - *(ckt->CKTstate1 + inst->NUMOSvdb); - *(ckt->CKTstate0 + inst->NUMOSvsb) = - *(ckt->CKTstate1 + inst->NUMOSvsb); - *(ckt->CKTstate0 + inst->NUMOSvgb) = - *(ckt->CKTstate1 + inst->NUMOSvgb); - vdb = *(ckt->CKTstate1 + inst->NUMOSvdb); - vsb = *(ckt->CKTstate1 + inst->NUMOSvsb); - vgb = *(ckt->CKTstate1 + inst->NUMOSvgb); - TWOsaveState(pDevice); - delVdb = 0.0; - delVsb = 0.0; - delVgb = 0.0; - } else if ((ckt->CKTmode & MODEINITJCT) && - (ckt->CKTmode & MODETRANOP) && (ckt->CKTmode & MODEUIC)) { - doInitSolve = TRUE; - initStateName = inst->NUMOSicFile; - vdb = 0.0; - vsb = 0.0; - vgb = 0.0; - delVdb = vdb; - delVsb = vsb; - delVgb = vgb; - } else if ((ckt->CKTmode & MODEINITJCT) && (inst->NUMOSoff == 0)) { - doInitSolve = TRUE; - initStateName = inst->NUMOSicFile; - if (deviceType == OPTN_BIPOLAR) { - /* d,g,s,b => c,b,e,s */ - vdb = 0.0; - vsb = -inst->NUMOStype * 1.0; - vgb = -inst->NUMOStype * (1.0 - 0.6); - } else if (deviceType == OPTN_JFET) { - vdb = inst->NUMOStype * 0.5; - vsb = 0.0; - vgb = 0.0; - } else { - vdb = inst->NUMOStype * 0.5; - vsb = 0.0; - vgb = inst->NUMOStype * 1.0; - } - delVdb = vdb; - delVsb = vsb; - delVgb = vgb; - } else if (ckt->CKTmode & MODEINITJCT) { - doInitSolve = TRUE; - vdb = 0.0; - vsb = 0.0; - vgb = 0.0; - delVdb = vdb; - delVsb = vsb; - delVgb = vgb; - } else if ((ckt->CKTmode & MODEINITFIX) && inst->NUMOSoff) { - vdb = 0.0; - vsb = 0.0; - vgb = 0.0; - delVdb = vdb; - delVsb = vsb; - delVgb = vgb; - } else { - if (ckt->CKTmode & MODEINITPRED) { - *(ckt->CKTstate0 + inst->NUMOSvdb) = - *(ckt->CKTstate1 + inst->NUMOSvdb); - *(ckt->CKTstate0 + inst->NUMOSvsb) = - *(ckt->CKTstate1 + inst->NUMOSvsb); - *(ckt->CKTstate0 + inst->NUMOSvgb) = - *(ckt->CKTstate1 + inst->NUMOSvgb); - *(ckt->CKTstate0 + inst->NUMOSid) = - *(ckt->CKTstate1 + inst->NUMOSid); - *(ckt->CKTstate0 + inst->NUMOSis) = - *(ckt->CKTstate1 + inst->NUMOSis); - *(ckt->CKTstate0 + inst->NUMOSig) = - *(ckt->CKTstate1 + inst->NUMOSig); - *(ckt->CKTstate0 + inst->NUMOSdIdDVdb) = - *(ckt->CKTstate1 + inst->NUMOSdIdDVdb); - *(ckt->CKTstate0 + inst->NUMOSdIdDVsb) = - *(ckt->CKTstate1 + inst->NUMOSdIdDVsb); - *(ckt->CKTstate0 + inst->NUMOSdIdDVgb) = - *(ckt->CKTstate1 + inst->NUMOSdIdDVgb); - *(ckt->CKTstate0 + inst->NUMOSdIsDVdb) = - *(ckt->CKTstate1 + inst->NUMOSdIsDVdb); - *(ckt->CKTstate0 + inst->NUMOSdIsDVsb) = - *(ckt->CKTstate1 + inst->NUMOSdIsDVsb); - *(ckt->CKTstate0 + inst->NUMOSdIsDVgb) = - *(ckt->CKTstate1 + inst->NUMOSdIsDVgb); - *(ckt->CKTstate0 + inst->NUMOSdIgDVdb) = - *(ckt->CKTstate1 + inst->NUMOSdIgDVdb); - *(ckt->CKTstate0 + inst->NUMOSdIgDVsb) = - *(ckt->CKTstate1 + inst->NUMOSdIgDVsb); - *(ckt->CKTstate0 + inst->NUMOSdIgDVgb) = - *(ckt->CKTstate1 + inst->NUMOSdIgDVgb); - if (!(ckt->CKTmode & MODEDCTRANCURVE)) { - /* no linear prediction on device voltages */ - vdb = *(ckt->CKTstate1 + inst->NUMOSvdb); - vsb = *(ckt->CKTstate1 + inst->NUMOSvsb); - vgb = *(ckt->CKTstate1 + inst->NUMOSvgb); - TWOpredict(pDevice, model->NUMOSpInfo); - } else { - if (doVoltPred) { - /* linear prediction */ - xfact=ckt->CKTdelta/ckt->CKTdeltaOld[1]; - vdb = (1+xfact) * (*(ckt->CKTstate1 + inst->NUMOSvdb)) - - (xfact) * (*(ckt->CKTstate2 + inst->NUMOSvdb)); - vsb = (1+xfact) * (*(ckt->CKTstate1 + inst->NUMOSvsb)) - - (xfact) * (*(ckt->CKTstate2 + inst->NUMOSvsb)); - vgb = (1+xfact) * (*(ckt->CKTstate1 + inst->NUMOSvgb)) - - (xfact) * (*(ckt->CKTstate2 + inst->NUMOSvgb)); - } else { - vdb = *(ckt->CKTstate1 + inst->NUMOSvdb); - vsb = *(ckt->CKTstate1 + inst->NUMOSvsb); - vgb = *(ckt->CKTstate1 + inst->NUMOSvgb); - } - } - } else { - /* - * compute new nonlinear branch voltages - */ - vdb = *(ckt->CKTrhsOld + inst->NUMOSdrainNode) - - *(ckt->CKTrhsOld + inst->NUMOSbulkNode); - vsb = *(ckt->CKTrhsOld + inst->NUMOSsourceNode) - - *(ckt->CKTrhsOld + inst->NUMOSbulkNode); - vgb = *(ckt->CKTrhsOld + inst->NUMOSgateNode) - - *(ckt->CKTrhsOld + inst->NUMOSbulkNode); - } - delVdb = vdb - *(ckt->CKTstate0 + inst->NUMOSvdb); - delVsb = vsb - *(ckt->CKTstate0 + inst->NUMOSvsb); - delVgb = vgb - *(ckt->CKTstate0 + inst->NUMOSvgb); - idhat = *(ckt->CKTstate0 + inst->NUMOSid) - + *(ckt->CKTstate0 + inst->NUMOSdIdDVdb) * delVdb - + *(ckt->CKTstate0 + inst->NUMOSdIdDVsb) * delVsb - + *(ckt->CKTstate0 + inst->NUMOSdIdDVgb) * delVgb; - ishat = *(ckt->CKTstate0 + inst->NUMOSis) - + *(ckt->CKTstate0 + inst->NUMOSdIsDVdb) * delVdb - + *(ckt->CKTstate0 + inst->NUMOSdIsDVsb) * delVsb - + *(ckt->CKTstate0 + inst->NUMOSdIsDVgb) * delVgb; - ighat = *(ckt->CKTstate0 + inst->NUMOSig) - + *(ckt->CKTstate0 + inst->NUMOSdIgDVdb) * delVdb - + *(ckt->CKTstate0 + inst->NUMOSdIgDVsb) * delVsb - + *(ckt->CKTstate0 + inst->NUMOSdIgDVgb) * delVgb; - - -#ifndef NOBYPASS - /* - * bypass if solution has not changed - */ - /* - * the following collections of if's would be just one if the average - * compiler could handle it, but many find the expression too - * complicated, thus the split. - */ - if ((ckt->CKTbypass) && pDevice->converged && - (!(ckt->CKTmode & MODEINITPRED)) && - (fabs(delVdb) < (ckt->CKTreltol * MAX(fabs(vdb), - fabs(*(ckt->CKTstate0 + inst->NUMOSvdb))) + - ckt->CKTvoltTol))) - if ((fabs(delVsb) < ckt->CKTreltol * MAX(fabs(vsb), - fabs(*(ckt->CKTstate0 + inst->NUMOSvsb))) + - ckt->CKTvoltTol)) - if ((fabs(delVgb) < ckt->CKTreltol * MAX(fabs(vgb), - fabs(*(ckt->CKTstate0 + inst->NUMOSvgb))) + - ckt->CKTvoltTol)) - if ((fabs(idhat - *(ckt->CKTstate0 + inst->NUMOSid)) < - ckt->CKTreltol * MAX(fabs(idhat), - fabs(*(ckt->CKTstate0 + inst->NUMOSid))) + - ckt->CKTabstol)) - if ((fabs(ishat - *(ckt->CKTstate0 + inst->NUMOSis)) < - ckt->CKTreltol * MAX(fabs(ishat), - fabs(*(ckt->CKTstate0 + inst->NUMOSis))) + - ckt->CKTabstol)) - if ((fabs(ighat - *(ckt->CKTstate0 + inst->NUMOSig)) < - ckt->CKTreltol * MAX(fabs(ighat), - fabs(*(ckt->CKTstate0 + inst->NUMOSig))) + - ckt->CKTabstol)) { - /* - * bypassing.... - */ - vdb = *(ckt->CKTstate0 + inst->NUMOSvdb); - vsb = *(ckt->CKTstate0 + inst->NUMOSvsb); - vgb = *(ckt->CKTstate0 + inst->NUMOSvgb); - id = *(ckt->CKTstate0 + inst->NUMOSid); - is = *(ckt->CKTstate0 + inst->NUMOSis); - ig = *(ckt->CKTstate0 + inst->NUMOSig); - g.dIdDVdb = *(ckt->CKTstate0 + inst->NUMOSdIdDVdb); - g.dIdDVsb = *(ckt->CKTstate0 + inst->NUMOSdIdDVsb); - g.dIdDVgb = *(ckt->CKTstate0 + inst->NUMOSdIdDVgb); - g.dIsDVdb = *(ckt->CKTstate0 + inst->NUMOSdIsDVdb); - g.dIsDVsb = *(ckt->CKTstate0 + inst->NUMOSdIsDVsb); - g.dIsDVgb = *(ckt->CKTstate0 + inst->NUMOSdIsDVgb); - g.dIgDVdb = *(ckt->CKTstate0 + inst->NUMOSdIgDVdb); - g.dIgDVsb = *(ckt->CKTstate0 + inst->NUMOSdIgDVsb); - g.dIgDVgb = *(ckt->CKTstate0 + inst->NUMOSdIgDVgb); - goto load; - } -#endif /* NOBYPASS */ - /* - * limit nonlinear branch voltages - */ - icheck1 = 1; - if (deviceType == OPTN_BIPOLAR) { - double vbe, vbe0; - double vce, vce0; - - vdb = -inst->NUMOStype * limitJunctionVoltage(-inst->NUMOStype * vdb, - -inst->NUMOStype * *(ckt->CKTstate0 + inst->NUMOSvdb), &icheck); - vce = vdb - vsb; - vce0 = *(ckt->CKTstate0 + inst->NUMOSvdb) - - *(ckt->CKTstate0 + inst->NUMOSvsb); - vce = inst->NUMOStype * limitVce(inst->NUMOStype * vce, - inst->NUMOStype * vce0, &icheck1); - if (icheck1 == 1) - icheck = 1; - vsb = vdb - vce; - vbe = vgb - vsb; - vbe0 = *(ckt->CKTstate0 + inst->NUMOSvgb) - - *(ckt->CKTstate0 + inst->NUMOSvsb); - vbe = inst->NUMOStype * limitVbe(inst->NUMOStype * vbe, - inst->NUMOStype * vbe0, &icheck1); - if (icheck1 == 1) - icheck = 1; - vgb = vbe + vsb; - } else { - vdb = -inst->NUMOStype * limitJunctionVoltage(-inst->NUMOStype * vdb, - -inst->NUMOStype * *(ckt->CKTstate0 + inst->NUMOSvdb), &icheck); - vsb = -inst->NUMOStype * limitJunctionVoltage(-inst->NUMOStype * vsb, - -inst->NUMOStype * *(ckt->CKTstate0 + inst->NUMOSvsb), &icheck1); - if (icheck1 == 1) - icheck = 1; - vgb = inst->NUMOStype * limitVgb(inst->NUMOStype * vgb, - inst->NUMOStype * *(ckt->CKTstate0 + inst->NUMOSvgb), &icheck1); - if (icheck1 == 1) - icheck = 1; - } - delVdb = vdb - *(ckt->CKTstate0 + inst->NUMOSvdb); - delVsb = vsb - *(ckt->CKTstate0 + inst->NUMOSvsb); - delVgb = vgb - *(ckt->CKTstate0 + inst->NUMOSvgb); - NUMOSsetBCs(pDevice, vdb - delVdb, vsb - delVsb, vgb - delVgb); - } - - if (doInitSolve) { - if (TWOdcDebug) { - printVoltages(stdout, model->NUMOSmodName, inst->NUMOSname, - deviceType, 3, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0); - } - startTime2 = SPfrontEnd->IFseconds(); - TWOequilSolve(pDevice); - totalTime2 = SPfrontEnd->IFseconds() - startTime2; - pDevice->pStats->totalTime[STAT_SETUP] += totalTime2; - pDevice->pStats->totalTime[STAT_DC] -= totalTime2; - - TWObiasSolve(pDevice, MaxIterations, FALSE, NULL); - - *(ckt->CKTstate0 + inst->NUMOSvdb) = 0.0; - *(ckt->CKTstate0 + inst->NUMOSvsb) = 0.0; - *(ckt->CKTstate0 + inst->NUMOSvgb) = 0.0; - - if (initStateName != NULL) { - if (TWOreadState(pDevice, initStateName, 3, &vdb, &vgb, &vsb ) < 0) { - fprintf(stderr, - "NUMOSload: trouble reading state-file %s\n", initStateName); - } else { - NUMOSsetBCs(pDevice, vdb, vsb, vgb); - delVdb = delVsb = delVgb = 0.0; - } - } - } - /* - * determine dc current and derivatives using the numerical routines - */ - if (ckt->CKTmode & (MODEDCOP | MODETRANOP | MODEDCTRANCURVE | MODEINITSMSIG)) { - numDevNonCon = 0; - inst->NUMOSc11 = inst->NUMOSy11r = inst->NUMOSy11i = 0.0; - inst->NUMOSc12 = inst->NUMOSy12r = inst->NUMOSy12i = 0.0; - inst->NUMOSc13 = inst->NUMOSy13r = inst->NUMOSy13i = 0.0; - inst->NUMOSc21 = inst->NUMOSy21r = inst->NUMOSy21i = 0.0; - inst->NUMOSc22 = inst->NUMOSy22r = inst->NUMOSy22i = 0.0; - inst->NUMOSc23 = inst->NUMOSy23r = inst->NUMOSy23i = 0.0; - inst->NUMOSc31 = inst->NUMOSy31r = inst->NUMOSy31i = 0.0; - inst->NUMOSc32 = inst->NUMOSy32r = inst->NUMOSy32i = 0.0; - inst->NUMOSc33 = inst->NUMOSy33r = inst->NUMOSy33i = 0.0; - inst->NUMOSsmSigAvail = FALSE; - devNonCon: - NUMOSproject(pDevice, delVdb, delVsb, delVgb); - if (TWOdcDebug) { - printVoltages(stdout, model->NUMOSmodName, inst->NUMOSname, - deviceType, 3, vdb, delVdb, vgb, delVgb, vsb, delVsb); - } - TWObiasSolve(pDevice, MaxIterations, FALSE, model->NUMOSpInfo); - - devConverged = pDevice->converged; - if (devConverged && finite(pDevice->rhsNorm)) { - /* compute the currents */ - NUMOScurrent(pDevice, FALSE, NULL, &id, &is, &ig); - NUMOSconductance(pDevice, FALSE, NULL, &g); - /* - * Add gmin to the gate conductance terms since they will be zero. - * XXX This messes up the gXY output values, but we choose not to - * correct this error, because it shouldn't cause practical problems. - */ - g.dIgDVdb += ckt->CKTgmin; - g.dIgDVsb += ckt->CKTgmin; - g.dIgDVgb += ckt->CKTgmin; - - } else { - /* reduce the voltage step until converged */ - /* restore boundary nodes to previous potential */ - NUMOSsetBCs(pDevice, - vdb - delVdb, vsb - delVsb, vgb - delVgb); - TWOstoreInitialGuess(pDevice); - TWOresetJacobian(pDevice); - delVdb *= 0.5; - delVsb *= 0.5; - delVgb *= 0.5; - vdb = delVdb + *(ckt->CKTstate0 + inst->NUMOSvdb); - vsb = delVsb + *(ckt->CKTstate0 + inst->NUMOSvsb); - vgb = delVgb + *(ckt->CKTstate0 + inst->NUMOSvgb); - numDevNonCon++; - icheck = 1; - if (numDevNonCon > 10) { - printVoltages(stderr, model->NUMOSmodName, inst->NUMOSname, - deviceType, 3, vdb, delVdb, vgb, delVgb, vsb, delVsb); - fprintf(stderr, "*** Non-convergence during load ***\n"); - totalTime += SPfrontEnd->IFseconds() - startTime; - pDevice->pStats->totalTime[STAT_DC] += totalTime; - ckt->CKTtroubleElt = (GENinstance *) inst; - return (E_BADMATRIX); - } else { - goto devNonCon; - } - } - } - if ((ckt->CKTmode & (MODETRAN | MODEAC)) || - ((ckt->CKTmode & MODETRANOP) && (ckt->CKTmode & MODEUIC)) || - (ckt->CKTmode & MODEINITSMSIG)) { - /* - * store small-signal parameters - */ - if ((!(ckt->CKTmode & MODETRANOP)) || - (!(ckt->CKTmode & MODEUIC))) { - if (ckt->CKTmode & MODEINITSMSIG) { - totalTime += SPfrontEnd->IFseconds() - startTime; - pDevice->pStats->totalTime[STAT_DC] += totalTime; - startTime2 = SPfrontEnd->IFseconds(); - NUMOSinitSmSig(inst); - pDevice->pStats->totalTime[STAT_AC] += - SPfrontEnd->IFseconds() - startTime2; - continue; - } else { - inst->NUMOSsmSigAvail = FALSE; - } - /* - * transient analysis - */ - if (ckt->CKTmode & MODEINITPRED) { - NUMOSsetBCs(pDevice, vdb, vsb, vgb); - TWOstoreInitialGuess(pDevice); - } else { - NUMOSupdate(pDevice, delVdb, delVsb, delVgb, TRUE); - } - if (TWOtranDebug) { - printVoltages(stdout, model->NUMOSmodName, inst->NUMOSname, - deviceType, 3, vdb, delVdb, vgb, delVgb, vsb, delVsb); - } - TWObiasSolve(pDevice, 0, TRUE, model->NUMOSpInfo); - if (!finite(pDevice->rhsNorm)) { - totalTime += SPfrontEnd->IFseconds() - startTime; - pDevice->pStats->totalTime[STAT_TRAN] += totalTime; - ckt->CKTtroubleElt = (GENinstance *) inst; - return (E_BADMATRIX); - } - devConverged = TWOdeviceConverged(pDevice); - pDevice->converged = devConverged; - - /* compute the currents and conductances */ - NUMOScurrent(pDevice, TRUE, model->NUMOSpInfo->intCoeff, - &id, &is, &ig); - NUMOSconductance(pDevice, TRUE, - model->NUMOSpInfo->intCoeff, &g); - } - } - /* - * check convergence - */ - if ((!(ckt->CKTmode & MODEINITFIX)) || (!(inst->NUMOSoff))) { - if (icheck == 1 || !devConverged) { - ckt->CKTnoncon++; - ckt->CKTtroubleElt = (GENinstance *) inst; - } else { - tol = ckt->CKTreltol * MAX(fabs(idhat), fabs(id)) + ckt->CKTabstol; - if (fabs(idhat - id) > tol) { - ckt->CKTnoncon++; - ckt->CKTtroubleElt = (GENinstance *) inst; - } else { - tol = ckt->CKTreltol * MAX(fabs(ishat), fabs(is)) + - ckt->CKTabstol; - if (fabs(ishat - is) > tol) { - ckt->CKTnoncon++; - ckt->CKTtroubleElt = (GENinstance *) inst; - } else { - tol = ckt->CKTreltol * MAX(fabs(ighat), fabs(ig)) + - ckt->CKTabstol; - if (fabs(ighat - ig) > tol) { - ckt->CKTnoncon++; - ckt->CKTtroubleElt = (GENinstance *) inst; - } - } - } - } - } - *(ckt->CKTstate0 + inst->NUMOSvdb) = vdb; - *(ckt->CKTstate0 + inst->NUMOSvsb) = vsb; - *(ckt->CKTstate0 + inst->NUMOSvgb) = vgb; - *(ckt->CKTstate0 + inst->NUMOSid) = id; - *(ckt->CKTstate0 + inst->NUMOSis) = is; - *(ckt->CKTstate0 + inst->NUMOSig) = ig; - *(ckt->CKTstate0 + inst->NUMOSdIdDVdb) = g.dIdDVdb; - *(ckt->CKTstate0 + inst->NUMOSdIdDVsb) = g.dIdDVsb; - *(ckt->CKTstate0 + inst->NUMOSdIdDVgb) = g.dIdDVgb; - *(ckt->CKTstate0 + inst->NUMOSdIsDVdb) = g.dIsDVdb; - *(ckt->CKTstate0 + inst->NUMOSdIsDVsb) = g.dIsDVsb; - *(ckt->CKTstate0 + inst->NUMOSdIsDVgb) = g.dIsDVgb; - *(ckt->CKTstate0 + inst->NUMOSdIgDVdb) = g.dIgDVdb; - *(ckt->CKTstate0 + inst->NUMOSdIgDVsb) = g.dIgDVsb; - *(ckt->CKTstate0 + inst->NUMOSdIgDVgb) = g.dIgDVgb; - - load: - /* - * load current excitation vector - */ - - ideq = id - g.dIdDVdb * vdb - g.dIdDVsb * vsb - g.dIdDVgb * vgb; - iseq = is - g.dIsDVdb * vdb - g.dIsDVsb * vsb - g.dIsDVgb * vgb; - igeq = ig - g.dIgDVdb * vdb - g.dIgDVsb * vsb - g.dIgDVgb * vgb; - *(ckt->CKTrhs + inst->NUMOSdrainNode) -= ideq; - *(ckt->CKTrhs + inst->NUMOSsourceNode) -= iseq; - *(ckt->CKTrhs + inst->NUMOSgateNode) -= igeq; - *(ckt->CKTrhs + inst->NUMOSbulkNode) += ideq + iseq + igeq; - /* - * load y matrix - */ - - *(inst->NUMOSdrainDrainPtr) += g.dIdDVdb; - *(inst->NUMOSdrainSourcePtr) += g.dIdDVsb; - *(inst->NUMOSdrainGatePtr) += g.dIdDVgb; - *(inst->NUMOSdrainBulkPtr) -= g.dIdDVdb + g.dIdDVsb + g.dIdDVgb; - - *(inst->NUMOSsourceDrainPtr) += g.dIsDVdb; - *(inst->NUMOSsourceSourcePtr) += g.dIsDVsb; - *(inst->NUMOSsourceGatePtr) += g.dIsDVgb; - *(inst->NUMOSsourceBulkPtr) -= g.dIsDVdb + g.dIsDVsb + g.dIsDVgb; - - *(inst->NUMOSgateDrainPtr) += g.dIgDVdb; - *(inst->NUMOSgateSourcePtr) += g.dIgDVsb; - *(inst->NUMOSgateGatePtr) += g.dIgDVgb; - *(inst->NUMOSgateBulkPtr) -= g.dIgDVdb + g.dIgDVsb + g.dIgDVgb; - - *(inst->NUMOSbulkDrainPtr) -= g.dIdDVdb + g.dIsDVdb + g.dIgDVdb; - *(inst->NUMOSbulkSourcePtr) -= g.dIdDVsb + g.dIsDVsb + g.dIgDVsb; - *(inst->NUMOSbulkGatePtr) -= g.dIdDVgb + g.dIsDVgb + g.dIgDVgb; - *(inst->NUMOSbulkBulkPtr) += g.dIdDVdb + g.dIdDVsb + g.dIdDVgb - + g.dIsDVdb + g.dIsDVsb + g.dIsDVgb - + g.dIgDVdb + g.dIgDVsb + g.dIgDVgb; - - totalTime += SPfrontEnd->IFseconds() - startTime; - if (ckt->CKTmode & MODETRAN) { - pDevice->pStats->totalTime[STAT_TRAN] += totalTime; - } else { - pDevice->pStats->totalTime[STAT_DC] += totalTime; - } - } - } - return (OK); -} - -int -NUMOSinitSmSig(NUMOSinstance *inst) -{ - struct mosAdmittances yAc; - double omega = NUMOSmodPtr(inst)->NUMOSmethods->METHomega; - - AcAnalysisMethod = SOR_ONLY; - (void) NUMOSadmittance(inst->NUMOSpDevice, omega, &yAc); - inst->NUMOSc11 = yAc.yIdVdb.imag / omega; - inst->NUMOSc12 = yAc.yIdVgb.imag / omega; - inst->NUMOSc13 = yAc.yIdVsb.imag / omega; - inst->NUMOSc21 = yAc.yIgVdb.imag / omega; - inst->NUMOSc22 = yAc.yIgVgb.imag / omega; - inst->NUMOSc23 = yAc.yIgVsb.imag / omega; - inst->NUMOSc31 = yAc.yIsVdb.imag / omega; - inst->NUMOSc32 = yAc.yIsVgb.imag / omega; - inst->NUMOSc33 = yAc.yIsVsb.imag / omega; - inst->NUMOSy11r = yAc.yIdVdb.real; - inst->NUMOSy11i = yAc.yIdVdb.imag; - inst->NUMOSy12r = yAc.yIdVgb.real; - inst->NUMOSy12i = yAc.yIdVgb.imag; - inst->NUMOSy13r = yAc.yIdVsb.real; - inst->NUMOSy13i = yAc.yIdVsb.imag; - inst->NUMOSy21r = yAc.yIgVdb.real; - inst->NUMOSy21i = yAc.yIgVdb.imag; - inst->NUMOSy22r = yAc.yIgVgb.real; - inst->NUMOSy22i = yAc.yIgVgb.imag; - inst->NUMOSy23r = yAc.yIgVsb.real; - inst->NUMOSy23i = yAc.yIgVsb.imag; - inst->NUMOSy31r = yAc.yIsVdb.real; - inst->NUMOSy31i = yAc.yIsVdb.imag; - inst->NUMOSy32r = yAc.yIsVgb.real; - inst->NUMOSy32i = yAc.yIsVgb.imag; - inst->NUMOSy33r = yAc.yIsVsb.real; - inst->NUMOSy33i = yAc.yIsVsb.imag; - inst->NUMOSsmSigAvail = TRUE; - return (OK); -} diff --git a/src/spicelib/devices/numos/nummmpar.c b/src/spicelib/devices/numos/nummmpar.c deleted file mode 100644 index 86e6e9620..000000000 --- a/src/spicelib/devices/numos/nummmpar.c +++ /dev/null @@ -1,32 +0,0 @@ -/********** -Copyright 1991 Regents of the University of California. All rights reserved. -Author: 1987 Kartikeya Mayaram, U. C. Berkeley CAD Group -**********/ - -/* - * This routine sets model parameters for NUMOSs in the circuit. - */ - -#include "ngspice/ngspice.h" -#include "ngspice/const.h" -#include "ngspice/ifsim.h" -#include "numosdef.h" -#include "ngspice/sperror.h" -#include "ngspice/suffix.h" - -int -NUMOSmParam(int param, IFvalue *value, GENmodel *inModel) -{ - NG_IGNORE(value); - NG_IGNORE(inModel); - - switch (param) { - case NUMOS_MOD_NUMOS: - /* no action - already know it is a 2d-numerical MOS, but this */ - /* makes life easier for spice-2 like parsers */ - break; - default: - return (E_BADPARM); - } - return (OK); -} diff --git a/src/spicelib/devices/numos/nummparm.c b/src/spicelib/devices/numos/nummparm.c deleted file mode 100644 index 56a793389..000000000 --- a/src/spicelib/devices/numos/nummparm.c +++ /dev/null @@ -1,56 +0,0 @@ -/********** -Copyright 1991 Regents of the University of California. All rights reserved. -Author: 1987 Kartikeya Mayaram, U. C. Berkeley CAD Group -**********/ - -/* - * This routine sets instance parameters for NUMOSs in the circuit. - */ - -#include "ngspice/ngspice.h" -#include "ngspice/const.h" -#include "ngspice/ifsim.h" -#include "numosdef.h" -#include "ngspice/sperror.h" -#include "ngspice/suffix.h" - -int -NUMOSparam(int param, IFvalue *value, GENinstance *inInst, IFvalue *select) -{ - register NUMOSinstance *inst = (NUMOSinstance *) inInst; - - NG_IGNORE(select); - - switch (param) { - case NUMOS_AREA: - inst->NUMOSarea = value->rValue; - inst->NUMOSareaGiven = TRUE; - break; - case NUMOS_WIDTH: - inst->NUMOSwidth = value->rValue; - inst->NUMOSwidthGiven = TRUE; - break; - case NUMOS_LENGTH: - inst->NUMOSlength = value->rValue; - inst->NUMOSlengthGiven = TRUE; - break; - case NUMOS_OFF: - inst->NUMOSoff = TRUE; - break; - case NUMOS_IC_FILE: - inst->NUMOSicFile = value->sValue; - inst->NUMOSicFileGiven = TRUE; - break; - case NUMOS_PRINT: - inst->NUMOSprint = value->iValue; - inst->NUMOSprintGiven = TRUE; - break; - case NUMOS_TEMP: - inst->NUMOStemp = value->rValue + CONSTCtoK; - inst->NUMOStempGiven = TRUE; - break; - default: - return (E_BADPARM); - } - return (OK); -} diff --git a/src/spicelib/devices/numos/nummpzld.c b/src/spicelib/devices/numos/nummpzld.c deleted file mode 100644 index 2a4fd183a..000000000 --- a/src/spicelib/devices/numos/nummpzld.c +++ /dev/null @@ -1,107 +0,0 @@ -/********** -Copyright 1991 Regents of the University of California. All rights reserved. -Author: 1987 Kartikeya Mayaram, U. C. Berkeley CAD Group -**********/ - -#include "ngspice/ngspice.h" -#include "ngspice/cktdefs.h" -#include "ngspice/complex.h" -#include "numosdef.h" -#include "ngspice/sperror.h" -#include "../../../ciderlib/twod/twoddefs.h" -#include "../../../ciderlib/twod/twodext.h" -#include "ngspice/cidersupt.h" -#include "ngspice/suffix.h" - - -int -NUMOSpzLoad(GENmodel *inModel, CKTcircuit *ckt, SPcomplex *s) -{ - register NUMOSmodel *model = (NUMOSmodel *) inModel; - register NUMOSinstance *inst; - struct mosAdmittances yAc; - double startTime; - - NG_IGNORE(ckt); - - for (; model != NULL; model = NUMOSnextModel(model)) { - FieldDepMobility = model->NUMOSmodels->MODLfieldDepMobility; - TransDepMobility = model->NUMOSmodels->MODLtransDepMobility; - SurfaceMobility = model->NUMOSmodels->MODLsurfaceMobility; - Srh = model->NUMOSmodels->MODLsrh; - Auger = model->NUMOSmodels->MODLauger; - AvalancheGen = model->NUMOSmodels->MODLavalancheGen; - OneCarrier = model->NUMOSmethods->METHoneCarrier; - AcAnalysisMethod = model->NUMOSmethods->METHacAnalysisMethod; - MobDeriv = model->NUMOSmethods->METHmobDeriv; - TWOacDebug = model->NUMOSoutputs->OUTPacDebug; - - for (inst = NUMOSinstances(model); inst != NULL; - inst = NUMOSnextInstance(inst)) { - - startTime = SPfrontEnd->IFseconds(); - /* Get Temp.-Dep. Global Parameters */ - GLOBgetGlobals(&(inst->NUMOSglobals)); - - NUMOSys(inst->NUMOSpDevice, s, &yAc); - - *(inst->NUMOSdrainDrainPtr) += yAc.yIdVdb.real; - *(inst->NUMOSdrainDrainPtr + 1) += yAc.yIdVdb.imag; - *(inst->NUMOSdrainSourcePtr) += yAc.yIdVsb.real; - *(inst->NUMOSdrainSourcePtr + 1) += yAc.yIdVsb.imag; - *(inst->NUMOSdrainGatePtr) += yAc.yIdVgb.real; - *(inst->NUMOSdrainGatePtr + 1) += yAc.yIdVgb.imag; - *(inst->NUMOSdrainBulkPtr) -= - yAc.yIdVdb.real + yAc.yIdVsb.real + yAc.yIdVgb.real; - *(inst->NUMOSdrainBulkPtr + 1) -= - yAc.yIdVdb.imag + yAc.yIdVsb.imag + yAc.yIdVgb.imag; - - *(inst->NUMOSsourceDrainPtr) += yAc.yIsVdb.real; - *(inst->NUMOSsourceDrainPtr + 1) += yAc.yIsVdb.imag; - *(inst->NUMOSsourceSourcePtr) += yAc.yIsVsb.real; - *(inst->NUMOSsourceSourcePtr + 1) += yAc.yIsVsb.imag; - *(inst->NUMOSsourceGatePtr) += yAc.yIsVgb.real; - *(inst->NUMOSsourceGatePtr + 1) += yAc.yIsVgb.imag; - *(inst->NUMOSsourceBulkPtr) -= - yAc.yIsVdb.real + yAc.yIsVsb.real + yAc.yIsVgb.real; - *(inst->NUMOSsourceBulkPtr + 1) -= - yAc.yIsVdb.imag + yAc.yIsVsb.imag + yAc.yIsVgb.imag; - - *(inst->NUMOSgateDrainPtr) += yAc.yIgVdb.real; - *(inst->NUMOSgateDrainPtr + 1) += yAc.yIgVdb.imag; - *(inst->NUMOSgateSourcePtr) += yAc.yIgVsb.real; - *(inst->NUMOSgateSourcePtr + 1) += yAc.yIgVsb.imag; - *(inst->NUMOSgateGatePtr) += yAc.yIgVgb.real; - *(inst->NUMOSgateGatePtr + 1) += yAc.yIgVgb.imag; - *(inst->NUMOSgateBulkPtr) -= - yAc.yIgVdb.real + yAc.yIgVsb.real + yAc.yIgVgb.real; - *(inst->NUMOSgateBulkPtr + 1) -= - yAc.yIgVdb.imag + yAc.yIgVsb.imag + yAc.yIgVgb.imag; - - *(inst->NUMOSbulkDrainPtr) -= - yAc.yIdVdb.real + yAc.yIsVdb.real + yAc.yIgVdb.real; - *(inst->NUMOSbulkDrainPtr + 1) -= - yAc.yIdVdb.imag + yAc.yIsVdb.imag + yAc.yIgVdb.imag; - *(inst->NUMOSbulkSourcePtr) -= - yAc.yIdVsb.real + yAc.yIsVsb.real + yAc.yIgVsb.real; - *(inst->NUMOSbulkSourcePtr + 1) -= - yAc.yIdVsb.imag + yAc.yIsVsb.imag + yAc.yIgVsb.imag; - *(inst->NUMOSbulkGatePtr) -= - yAc.yIdVgb.real + yAc.yIsVgb.real + yAc.yIgVgb.real; - *(inst->NUMOSbulkGatePtr + 1) -= - yAc.yIdVgb.imag + yAc.yIsVgb.imag + yAc.yIgVgb.imag; - *(inst->NUMOSbulkBulkPtr) += - yAc.yIdVdb.real + yAc.yIdVsb.real + yAc.yIdVgb.real + - yAc.yIsVdb.real + yAc.yIsVsb.real + yAc.yIsVgb.real + - yAc.yIgVdb.real + yAc.yIgVsb.real + yAc.yIgVgb.real; - *(inst->NUMOSbulkBulkPtr + 1) -= - yAc.yIdVdb.imag + yAc.yIdVsb.imag + yAc.yIdVgb.imag + - yAc.yIsVdb.imag + yAc.yIsVsb.imag + yAc.yIsVgb.imag + - yAc.yIgVdb.imag + yAc.yIgVsb.imag + yAc.yIgVgb.imag; - - inst->NUMOSpDevice->pStats->totalTime[STAT_AC] += - SPfrontEnd->IFseconds() - startTime; - } - } - return (OK); -} diff --git a/src/spicelib/devices/numos/nummset.c b/src/spicelib/devices/numos/nummset.c deleted file mode 100644 index 37f0efc31..000000000 --- a/src/spicelib/devices/numos/nummset.c +++ /dev/null @@ -1,262 +0,0 @@ -/********** -Copyright 1991 Regents of the University of California. All rights reserved. -Author: 1987 Kartikeya Mayaram, U. C. Berkeley CAD Group -**********/ - -#include "ngspice/ngspice.h" -#include "ngspice/cktdefs.h" -#include "ngspice/smpdefs.h" -#include "numosdef.h" -#include "ngspice/numconst.h" -#include "ngspice/numenum.h" -#include "ngspice/meshext.h" -#include "ngspice/sperror.h" -#include "../../../ciderlib/twod/twoddefs.h" -#include "../../../ciderlib/twod/twodext.h" -#include "ngspice/cidersupt.h" -#include "ngspice/ciderinp.h" -#include "ngspice/suffix.h" - -#define TSCALLOC(var, size, type)\ -if (size && (var = (type *)calloc(1, (unsigned)(size)*sizeof(type))) == NULL) {\ - return(E_NOMEM);\ -} - -int -NUMOSsetup(SMPmatrix *matrix, GENmodel *inModel, CKTcircuit *ckt, int *states) -/* - * load the structure with those pointers needed later for fast matrix - * loading - */ -{ - register NUMOSmodel *model = (NUMOSmodel *) inModel; - register NUMOSinstance *inst; - METHcard *methods; - MODLcard *models; - OPTNcard *options; - OUTPcard *outputs; - int error, xIndex; - int xMeshSize, yMeshSize; - TWOdevice *pDevice; - TWOcoord *xCoordList = NULL; - TWOcoord *yCoordList = NULL; - TWOdomain *domainList = NULL; - TWOelectrode *electrodeList = NULL; - TWOmaterial *pM, *pMaterial = NULL, *materialList = NULL; - DOPprofile *profileList = NULL; - DOPtable *dopTableList = NULL; - double startTime; - - /* loop through all the models */ - for (; model != NULL; model = NUMOSnextModel(model)) { - if (!model->NUMOSpInfo) { - TSCALLOC(model->NUMOSpInfo, 1, TWOtranInfo); - } - methods = model->NUMOSmethods; - if (!methods) { - TSCALLOC(methods, 1, METHcard); - model->NUMOSmethods = methods; - } - models = model->NUMOSmodels; - if (!models) { - TSCALLOC(models, 1, MODLcard); - model->NUMOSmodels = models; - } - options = model->NUMOSoptions; - if (!options) { - TSCALLOC(options, 1, OPTNcard); - model->NUMOSoptions = options; - } - outputs = model->NUMOSoutputs; - if (!outputs) { - TSCALLOC(outputs, 1, OUTPcard); - model->NUMOSoutputs = outputs; - } - if (!methods->METHvoltPredGiven) { - methods->METHvoltPred = FALSE; - } - if (!methods->METHmobDerivGiven) { - methods->METHmobDeriv = TRUE; - } - if (!methods->METHoneCarrierGiven) { - methods->METHoneCarrier = FALSE; - } - if (!methods->METHacAnalysisMethodGiven) { - methods->METHacAnalysisMethod = SOR; - } - if (!methods->METHdabstolGiven) { - methods->METHdabstol = DABSTOL2D; - } - if (!methods->METHdreltolGiven) { - methods->METHdreltol = ckt->CKTreltol; - } - if (!methods->METHitLimGiven) { - methods->METHitLim = 50; - } - if (!methods->METHomegaGiven || methods->METHomega <= 0.0) { - methods->METHomega = 2.0 * M_PI /* radians/sec */ ; - } - if (!options->OPTNdefaGiven || options->OPTNdefa <= 0.0) { - options->OPTNdefa = 1.0e4 /* cm^2 */ ; - } - if (!options->OPTNdeflGiven || options->OPTNdefl <= 0.0) { - options->OPTNdefl = 1.0e2 /* cm */ ; - } - if (!options->OPTNdefwGiven && options->OPTNdefaGiven) { - options->OPTNdefw = options->OPTNdefa / options->OPTNdefl; - } else if (!options->OPTNdefwGiven || options->OPTNdefw <= 0.0) { - options->OPTNdefw = 1.0e2 /* cm */ ; - } - if (!options->OPTNdeviceTypeGiven) { - options->OPTNdeviceType = OPTN_MOSFET; - } - if (!options->OPTNicFileGiven) { - options->OPTNicFile = NULL; - options->OPTNunique = FALSE; /* Can't form a unique name. */ - } - if (!options->OPTNuniqueGiven) { - options->OPTNunique = FALSE; - } - OneCarrier = methods->METHoneCarrier; - - /* Set up the rest of the card lists */ - if ((error = MODLsetup(model->NUMOSmodels)) != 0) - return (error); - BandGapNarrowing = models->MODLbandGapNarrowing; - ConcDepLifetime = models->MODLconcDepLifetime; - TempDepMobility = models->MODLtempDepMobility; - ConcDepMobility = models->MODLconcDepMobility; - SurfaceMobility = models->MODLsurfaceMobility; - - if ((error = OUTPsetup(model->NUMOSoutputs)) != 0) - return (error); - if ((error = MATLsetup(model->NUMOSmaterials, &materialList)) != 0) - return (error); - if ((error = MOBsetup(model->NUMOSmobility, materialList)) != 0) - return (error); - if ((error = MESHsetup('x', model->NUMOSxMeshes, &xCoordList, &xMeshSize)) != 0) - return (error); - if ((error = MESHsetup('y', model->NUMOSyMeshes, &yCoordList, &yMeshSize)) != 0) - return (error); - if ((error = DOMNsetup(model->NUMOSdomains, &domainList, - xCoordList, yCoordList, materialList)) != 0) - return (error); - if ((error = BDRYsetup(model->NUMOSboundaries, - xCoordList, yCoordList, domainList)) != 0) - return (error); - if ((error = ELCTsetup(model->NUMOSelectrodes, &electrodeList, - xCoordList, yCoordList)) != 0) - return (error); - /* Make sure electrodes are OK. */ - checkElectrodes(electrodeList, 4); /* NUMOS has 4 electrodes */ - - if ((error = CONTsetup(model->NUMOScontacts, electrodeList)) != 0) - return (error); - if ((error = DOPsetup(model->NUMOSdopings, &profileList, - &dopTableList, xCoordList, yCoordList)) != 0) - return (error); - model->NUMOSmatlInfo = materialList; - model->NUMOSprofiles = profileList; - model->NUMOSdopTables = dopTableList; - - /* loop through all the instances of the model */ - for (inst = NUMOSinstances(model); inst != NULL; - inst = NUMOSnextInstance(inst)) { - - startTime = SPfrontEnd->IFseconds(); - - if (!inst->NUMOSprintGiven) { - inst->NUMOSprint = 0; - } else if (inst->NUMOSprint <= 0) { - inst->NUMOSprint = 1; - } - if (!inst->NUMOSicFileGiven) { - if (options->OPTNunique) { - inst->NUMOSicFile = tprintf("%s.%s", options->OPTNicFile, inst->NUMOSname); - } else if (options->OPTNicFile != NULL) { - inst->NUMOSicFile = tprintf("%s", options->OPTNicFile); - } else { - inst->NUMOSicFile = NULL; - } - } - inst->NUMOSstate = *states; - *states += NUMOSnumStates; - - if (!inst->NUMOSpDevice) { - /* Assign the mesh info to each instance. */ - TSCALLOC(pDevice, 1, TWOdevice); - TSCALLOC(pDevice->pStats, 1, TWOstats); - pDevice->name = inst->NUMOSname; - pDevice->solverType = SLV_NONE; - pDevice->numXNodes = xMeshSize; - pDevice->numYNodes = yMeshSize; - pDevice->xScale = MESHmkArray(xCoordList, xMeshSize); - pDevice->yScale = MESHmkArray(yCoordList, yMeshSize); - pDevice->abstol = methods->METHdabstol; - pDevice->reltol = methods->METHdreltol; - TSCALLOC(pDevice->elemArray, pDevice->numXNodes, TWOelem **); - for (xIndex = 1; xIndex < pDevice->numXNodes; xIndex++) { - TSCALLOC(pDevice->elemArray[xIndex], pDevice->numYNodes, TWOelem *); - } - - /* Create a copy of material data that can change with temperature. */ - pDevice->pMaterials = NULL; - for (pM = materialList; pM != NULL; pM = pM->next) { - if (pDevice->pMaterials == NULL) { - TSCALLOC(pMaterial, 1, TWOmaterial); - pDevice->pMaterials = pMaterial; - } else { - TSCALLOC(pMaterial->next, 1, TWOmaterial); - pMaterial = pMaterial->next; - } - /* Copy everything, then fix the incorrect pointer. */ - memcpy(pMaterial, pM, sizeof(TWOmaterial)); - pMaterial->next = NULL; - } - - /* Generate the mesh structure for the device. */ - TWObuildMesh(pDevice, domainList, electrodeList, pDevice->pMaterials); - - /* Store the device info in the instance. */ - inst->NUMOSpDevice = pDevice; - } - /* Now update the state pointers. */ - TWOgetStatePointers(inst->NUMOSpDevice, states); - - /* Wipe out statistics from previous runs (if any). */ - memset(inst->NUMOSpDevice->pStats, 0, sizeof(TWOstats)); - - inst->NUMOSpDevice->pStats->totalTime[STAT_SETUP] += - SPfrontEnd->IFseconds() - startTime; - - /* macro to make elements with built in test for out of memory */ -#define TSTALLOC(ptr,first,second) \ -do { if ((inst->ptr = SMPmakeElt(matrix, inst->first, inst->second)) == NULL){\ - return(E_NOMEM);\ -} } while(0) - - TSTALLOC(NUMOSdrainDrainPtr, NUMOSdrainNode, NUMOSdrainNode); - TSTALLOC(NUMOSdrainSourcePtr, NUMOSdrainNode, NUMOSsourceNode); - TSTALLOC(NUMOSdrainGatePtr, NUMOSdrainNode, NUMOSgateNode); - TSTALLOC(NUMOSdrainBulkPtr, NUMOSdrainNode, NUMOSbulkNode); - TSTALLOC(NUMOSsourceDrainPtr, NUMOSsourceNode, NUMOSdrainNode); - TSTALLOC(NUMOSsourceSourcePtr, NUMOSsourceNode, NUMOSsourceNode); - TSTALLOC(NUMOSsourceGatePtr, NUMOSsourceNode, NUMOSgateNode); - TSTALLOC(NUMOSsourceBulkPtr, NUMOSsourceNode, NUMOSbulkNode); - TSTALLOC(NUMOSgateDrainPtr, NUMOSgateNode, NUMOSdrainNode); - TSTALLOC(NUMOSgateSourcePtr, NUMOSgateNode, NUMOSsourceNode); - TSTALLOC(NUMOSgateGatePtr, NUMOSgateNode, NUMOSgateNode); - TSTALLOC(NUMOSgateBulkPtr, NUMOSgateNode, NUMOSbulkNode); - TSTALLOC(NUMOSbulkDrainPtr, NUMOSbulkNode, NUMOSdrainNode); - TSTALLOC(NUMOSbulkSourcePtr, NUMOSbulkNode, NUMOSsourceNode); - TSTALLOC(NUMOSbulkGatePtr, NUMOSbulkNode, NUMOSgateNode); - TSTALLOC(NUMOSbulkBulkPtr, NUMOSbulkNode, NUMOSbulkNode); - } - /* Clean up lists */ - killCoordInfo(xCoordList); - killCoordInfo(yCoordList); - killDomainInfo(domainList); - killElectrodeInfo(electrodeList); - } - return (OK); -} diff --git a/src/spicelib/devices/numos/nummtemp.c b/src/spicelib/devices/numos/nummtemp.c deleted file mode 100644 index 14a1a2ead..000000000 --- a/src/spicelib/devices/numos/nummtemp.c +++ /dev/null @@ -1,124 +0,0 @@ -/********** -Copyright 1991 Regents of the University of California. All rights reserved. -Author: 1987 Kartikeya Mayaram, U. C. Berkeley CAD Group -Author: 1991 David A. Gates, U. C. Berkeley CAD Group -**********/ - -#include "ngspice/ngspice.h" -#include "ngspice/cktdefs.h" -#include "numosdef.h" -#include "ngspice/numenum.h" -#include "ngspice/carddefs.h" -#include "ngspice/sperror.h" -#include "../../../ciderlib/twod/twoddefs.h" -#include "../../../ciderlib/twod/twodext.h" -#include "ngspice/cidersupt.h" -#include "ngspice/suffix.h" - - -int -NUMOStemp(GENmodel *inModel, CKTcircuit *ckt) -/* - * perform the temperature update - */ -{ - register NUMOSmodel *model = (NUMOSmodel *) inModel; - register NUMOSinstance *inst; - METHcard *methods; - MODLcard *models; - OPTNcard *options; - OUTPcard *outputs; - TWOmaterial *pM, *pMaterial, *pNextMaterial; - double startTime; - - - /* loop through all the models */ - for (; model != NULL; model = NUMOSnextModel(model)) { - methods = model->NUMOSmethods; - models = model->NUMOSmodels; - options = model->NUMOSoptions; - outputs = model->NUMOSoutputs; - - if (!options->OPTNtnomGiven) { - options->OPTNtnom = ckt->CKTnomTemp; - } - for (pM = model->NUMOSmatlInfo; pM != NULL; - pM = pM->next) { - pM->tnom = options->OPTNtnom; - } - BandGapNarrowing = models->MODLbandGapNarrowing; - ConcDepLifetime = models->MODLconcDepLifetime; - TempDepMobility = models->MODLtempDepMobility; - ConcDepMobility = models->MODLconcDepMobility; - SurfaceMobility = models->MODLsurfaceMobility; - MatchingMobility = models->MODLmatchingMobility; - OneCarrier = methods->METHoneCarrier; - - for (inst = NUMOSinstances(model); inst != NULL; - inst = NUMOSnextInstance(inst)) { - - startTime = SPfrontEnd->IFseconds(); - - if (!inst->NUMOStempGiven) { - inst->NUMOStemp = ckt->CKTtemp; - } - if (!inst->NUMOSareaGiven || inst->NUMOSarea <= 0.0) { - inst->NUMOSarea = 1.0; - } - if (!inst->NUMOSwidthGiven || inst->NUMOSwidth <= 0.0) { - inst->NUMOSwidth = 1.0; - } - inst->NUMOSpDevice->width = - inst->NUMOSarea * inst->NUMOSwidth * options->OPTNdefw; - - /* Compute and save globals for this instance. */ - GLOBcomputeGlobals(&(inst->NUMOSglobals), inst->NUMOStemp); - - /* Calculate new sets of material parameters. */ - pM = model->NUMOSmatlInfo; - pMaterial = inst->NUMOSpDevice->pMaterials; - for (; pM != NULL; pM = pM->next, pMaterial = pMaterial->next) { - - /* Copy everything, then fix the incorrect pointer. */ - pNextMaterial = pMaterial->next; - memcpy(pMaterial, pM, sizeof(TWOmaterial)); - pMaterial->next = pNextMaterial; - - /* Now do the temperature dependence. */ - MATLtempDep(pMaterial, pMaterial->tnom); - if (outputs->OUTPmaterial) { - printMaterialInfo(pMaterial); - } - } - - /* Assign doping to the mesh. */ - TWOsetDoping(inst->NUMOSpDevice, model->NUMOSprofiles, - model->NUMOSdopTables); - - /* Assign physical parameters to the mesh. */ - TWOsetup(inst->NUMOSpDevice); - - /* Assign boundary condition parameters. */ - TWOsetBCparams(inst->NUMOSpDevice, model->NUMOSboundaries); - - /* Normalize everything. */ - TWOnormalize(inst->NUMOSpDevice); - - /* Find the device's type. */ - if (inst->NUMOSpDevice->pFirstContact->pNodes[0]->netConc < 0.0) { - inst->NUMOStype = P_CH; - if (OneCarrier) { - methods->METHoneCarrier = P_TYPE; - } - } else { - inst->NUMOStype = N_CH; - if (OneCarrier) { - methods->METHoneCarrier = N_TYPE; - } - } - inst->NUMOSpDevice->pStats->totalTime[STAT_SETUP] += - SPfrontEnd->IFseconds() - startTime; - } - } - return (OK); -} diff --git a/src/spicelib/devices/numos/nummtrun.c b/src/spicelib/devices/numos/nummtrun.c deleted file mode 100644 index 3cb3389f8..000000000 --- a/src/spicelib/devices/numos/nummtrun.c +++ /dev/null @@ -1,52 +0,0 @@ -/********** -Copyright 1991 Regents of the University of California. All rights reserved. -Author: 1987 Kartikeya Mayaram, U. C. Berkeley CAD Group -**********/ - -/* - * This routine performs truncation error calculations for NUMOSs in the - * circuit. - */ - -#include "ngspice/ngspice.h" -#include "ngspice/cktdefs.h" -#include "numosdef.h" -#include "ngspice/sperror.h" -#include "../../../ciderlib/twod/twoddefs.h" -#include "../../../ciderlib/twod/twodext.h" -#include "ngspice/cidersupt.h" -#include "ngspice/suffix.h" - - -int -NUMOStrunc(GENmodel *inModel, CKTcircuit *ckt, double *timeStep) -{ - register NUMOSmodel *model = (NUMOSmodel *) inModel; - register NUMOSinstance *inst; - double deltaNew; - double deltaNorm[7]; - double startTime; - int i; - - for (i = 0; i <= ckt->CKTmaxOrder; i++) { - deltaNorm[i] = ckt->CKTdeltaOld[i] / TNorm; - } - - for (; model != NULL; model = NUMOSnextModel(model)) { - OneCarrier = model->NUMOSmethods->METHoneCarrier; - model->NUMOSpInfo->order = ckt->CKTorder; - model->NUMOSpInfo->delta = deltaNorm; - model->NUMOSpInfo->lteCoeff = computeLTECoeff(model->NUMOSpInfo); - for (inst = NUMOSinstances(model); inst != NULL; - inst = NUMOSnextInstance(inst)) { - - startTime = SPfrontEnd->IFseconds(); - deltaNew = TWOtrunc(inst->NUMOSpDevice, model->NUMOSpInfo, - ckt->CKTdelta); - *timeStep = MIN(*timeStep, deltaNew); - inst->NUMOSpDevice->pStats->totalTime[STAT_TRAN] += - SPfrontEnd->IFseconds() - startTime; - } - } - return (OK); -} diff --git a/src/spicelib/devices/numos/numosdef.h b/src/spicelib/devices/numos/numosdef.h deleted file mode 100644 index 5a5b1ed5d..000000000 --- a/src/spicelib/devices/numos/numosdef.h +++ /dev/null @@ -1,219 +0,0 @@ -/********** -Copyright 1991 Regents of the University of California. All rights reserved. -Authors: 1987 Karti Mayaram, 1991 David Gates -**********/ - -#ifndef NUMOS_H -#define NUMOS_H - -/* data structures used to describe 2D Numerical MOSFETs */ - -/* circuit level includes */ -#include "ngspice/ifsim.h" -#include "ngspice/cktdefs.h" -#include "ngspice/gendefs.h" - -/* device level includes */ -#include "ngspice/twomesh.h" -#include "ngspice/twodev.h" -#include "ngspice/profile.h" -#include "ngspice/numglobs.h" -#include "ngspice/carddefs.h" - -/* information needed per instance */ -typedef struct sNUMOSinstance { - - struct GENinstance gen; - -#define NUMOSmodPtr(inst) ((struct sNUMOSmodel *)((inst)->gen.GENmodPtr)) -#define NUMOSnextInstance(inst) ((struct sNUMOSinstance *)((inst)->gen.GENnextInstance)) -#define NUMOSname gen.GENname -#define NUMOSstate gen.GENstate - -#define NUMOSvdb NUMOSstate -#define NUMOSvsb NUMOSstate+1 -#define NUMOSvgb NUMOSstate+2 -#define NUMOSid NUMOSstate+3 -#define NUMOSis NUMOSstate+4 -#define NUMOSig NUMOSstate+5 -#define NUMOSdIdDVdb NUMOSstate+6 -#define NUMOSdIdDVsb NUMOSstate+7 -#define NUMOSdIdDVgb NUMOSstate+8 -#define NUMOSdIsDVdb NUMOSstate+9 -#define NUMOSdIsDVsb NUMOSstate+10 -#define NUMOSdIsDVgb NUMOSstate+11 -#define NUMOSdIgDVdb NUMOSstate+12 -#define NUMOSdIgDVsb NUMOSstate+13 -#define NUMOSdIgDVgb NUMOSstate+14 -#define NUMOSnumStates 15 - - const int NUMOSdrainNode; /* number of drain node of MOSFET */ - const int NUMOSgateNode; /* number of gate node of MOSFET */ - const int NUMOSsourceNode; /* number of source node of MOSFET */ - const int NUMOSbulkNode; /* number of bulk node of MOSFET */ - double NUMOSarea; /* area factor for the mosfet */ - double NUMOSwidth; /* width factor for the mosfet */ - double NUMOSlength; /* length factor for the mosfet */ - TWOdevice *NUMOSpDevice; - int NUMOStype; - double NUMOStemp; /* Instance Temperature */ - double NUMOSc11; /* small-signal capacitance */ - double NUMOSy11r; /* small-signal admittance, real part */ - double NUMOSy11i; /* small-signal admittance, imag part */ - double NUMOSc12; /* small-signal capacitance */ - double NUMOSy12r; /* small-signal admittance, real part */ - double NUMOSy12i; /* small-signal admittance, imag part */ - double NUMOSc13; /* small-signal capacitance */ - double NUMOSy13r; /* small-signal admittance, real part */ - double NUMOSy13i; /* small-signal admittance, imag part */ - double NUMOSc21; /* small-signal capacitance */ - double NUMOSy21r; /* small-signal admittance, real part */ - double NUMOSy21i; /* small-signal admittance, imag part */ - double NUMOSc22; /* small-signal capacitance */ - double NUMOSy22r; /* small-signal admittance, real part */ - double NUMOSy22i; /* small-signal admittance, imag part */ - double NUMOSc23; /* small-signal capacitance */ - double NUMOSy23r; /* small-signal admittance, real part */ - double NUMOSy23i; /* small-signal admittance, imag part */ - double NUMOSc31; /* small-signal capacitance */ - double NUMOSy31r; /* small-signal admittance, real part */ - double NUMOSy31i; /* small-signal admittance, imag part */ - double NUMOSc32; /* small-signal capacitance */ - double NUMOSy32r; /* small-signal admittance, real part */ - double NUMOSy32i; /* small-signal admittance, imag part */ - double NUMOSc33; /* small-signal capacitance */ - double NUMOSy33r; /* small-signal admittance, real part */ - double NUMOSy33i; /* small-signal admittance, imag part */ - GLOBvalues NUMOSglobals; /* Temp.-Dep. Global Parameters */ - int NUMOSprint; /* print timepoints */ - char *NUMOSicFile; /* Name of initial condition file */ - double *NUMOSdrainDrainPtr; /* pointer to sparse matrix at (drain,drain) */ - double *NUMOSdrainSourcePtr; /* pointer to sparse matrix at (drain,source) */ - double *NUMOSdrainGatePtr; /* pointer to sparse matrix at (drain,gate) */ - double *NUMOSdrainBulkPtr; /* pointer to sparse matrix at (drain,bulk) */ - double *NUMOSsourceDrainPtr; /* pointer to sparse matrix at (source,drain) */ - double *NUMOSsourceSourcePtr; /* pointer to sparse matrix at - * (source,source) */ - double *NUMOSsourceGatePtr; /* pointer to sparse matrix at (source,gate) */ - double *NUMOSsourceBulkPtr; /* pointer to sparse matrix at (source,bulk) */ - double *NUMOSgateDrainPtr; /* pointer to sparse matrix at (gate,drain) */ - double *NUMOSgateSourcePtr; /* pointer to sparse matrix at (gate,source) */ - double *NUMOSgateGatePtr; /* pointer to sparse matrix at (gate,gate) */ - double *NUMOSgateBulkPtr; /* pointer to sparse matrix at (gate,bulk) */ - double *NUMOSbulkDrainPtr; /* pointer to sparse matrix at (bulk,drain) */ - double *NUMOSbulkSourcePtr; /* pointer to sparse matrix at (bulk,source) */ - double *NUMOSbulkGatePtr; /* pointer to sparse matrix at (bulk,gate) */ - double *NUMOSbulkBulkPtr; /* pointer to sparse matrix at (bulk,bulk) */ - - int NUMOSoff; /* 'off' flag for mosfet */ - unsigned NUMOSsmSigAvail:1; /* flag to indicate small-signal done */ - unsigned NUMOSareaGiven:1; /* flag to indicate area was specified */ - unsigned NUMOSwidthGiven:1; /* flag to indicate width was specified */ - unsigned NUMOSlengthGiven:1; /* flag to indicate length was specified */ - unsigned NUMOSicFileGiven:1; /* flag to indicate init. cond. file given */ - unsigned NUMOSprintGiven:1; /* flag to indicate print was given */ - unsigned NUMOStempGiven:1; /* flag to indicate temp was given */ -} NUMOSinstance; - -/* per model data */ -typedef struct sNUMOSmodel { /* model structure for a numerical device */ - - struct GENmodel gen; - -#define NUMOSmodType gen.GENmodType -#define NUMOSnextModel(inst) ((struct sNUMOSmodel *)((inst)->gen.GENnextModel)) -#define NUMOSinstances(inst) ((NUMOSinstance *)((inst)->gen.GENinstances)) -#define NUMOSmodName gen.GENmodName - - MESHcard *NUMOSxMeshes; /* list of xmesh cards */ - MESHcard *NUMOSyMeshes; /* list of ymesh cards */ - DOMNcard *NUMOSdomains; /* list of domain cards */ - BDRYcard *NUMOSboundaries; /* list of boundary cards */ - DOPcard *NUMOSdopings; /* list of doping cards */ - ELCTcard *NUMOSelectrodes; /* list of electrode cards */ - CONTcard *NUMOScontacts; /* list of contact cards */ - MODLcard *NUMOSmodels; /* list of model cards */ - MATLcard *NUMOSmaterials; /* list of material cards */ - MOBcard *NUMOSmobility; /* list of mobility cards */ - METHcard *NUMOSmethods; /* list of method cards */ - OPTNcard *NUMOSoptions; /* list of option cards */ - OUTPcard *NUMOSoutputs; /* list of output cards */ - TWOtranInfo *NUMOSpInfo; /* transient analysis information */ - DOPprofile *NUMOSprofiles; /* expanded list of doping profiles */ - DOPtable *NUMOSdopTables; /* list of tables used by profiles */ - TWOmaterial *NUMOSmatlInfo; /* list of material info structures */ -} NUMOSmodel; - -/* type of 2D MOSFET */ -#define N_CH 1 -#define P_CH -1 - -/* device parameters */ -#define NUMOS_AREA 1 -#define NUMOS_WIDTH 2 -#define NUMOS_LENGTH 3 -#define NUMOS_OFF 4 -#define NUMOS_IC_FILE 5 -#define NUMOS_PRINT 9 -#define NUMOS_TEMP 10 - -#define NUMOS_G11 11 -#define NUMOS_C11 12 -#define NUMOS_Y11 13 -#define NUMOS_G12 14 -#define NUMOS_C12 15 -#define NUMOS_Y12 16 -#define NUMOS_G13 17 -#define NUMOS_C13 18 -#define NUMOS_Y13 19 -#define NUMOS_G14 20 -#define NUMOS_C14 21 -#define NUMOS_Y14 22 -#define NUMOS_G21 23 -#define NUMOS_C21 24 -#define NUMOS_Y21 25 -#define NUMOS_G22 26 -#define NUMOS_C22 27 -#define NUMOS_Y22 28 -#define NUMOS_G23 29 -#define NUMOS_C23 30 -#define NUMOS_Y23 31 -#define NUMOS_G24 32 -#define NUMOS_C24 33 -#define NUMOS_Y24 34 -#define NUMOS_G31 35 -#define NUMOS_C31 36 -#define NUMOS_Y31 37 -#define NUMOS_G32 38 -#define NUMOS_C32 39 -#define NUMOS_Y32 40 -#define NUMOS_G33 41 -#define NUMOS_C33 42 -#define NUMOS_Y33 43 -#define NUMOS_G34 44 -#define NUMOS_C34 45 -#define NUMOS_Y34 46 -#define NUMOS_G41 47 -#define NUMOS_C41 48 -#define NUMOS_Y41 49 -#define NUMOS_G42 50 -#define NUMOS_C42 51 -#define NUMOS_Y42 52 -#define NUMOS_G43 53 -#define NUMOS_C43 54 -#define NUMOS_Y43 55 -#define NUMOS_G44 56 -#define NUMOS_C44 57 -#define NUMOS_Y44 58 - -/* model parameters */ -/* NOTE: all true model parameters have been moved to IFcardInfo structures */ -#define NUMOS_MOD_NUMOS 1 - -/* device questions */ - -/* model questions */ - -#include "numosext.h" - -#endif /* NUMOS_H */ diff --git a/src/spicelib/devices/numos/numosext.h b/src/spicelib/devices/numos/numosext.h deleted file mode 100644 index 1aa2d4dd5..000000000 --- a/src/spicelib/devices/numos/numosext.h +++ /dev/null @@ -1,25 +0,0 @@ -/********** -Copyright 1990 Regents of the University of California. All rights reserved. -Author: 1987 Karti Mayaram -**********/ - -#ifndef NUMOSEXT_H -#define NUMOSEXT_H - - -extern int NUMOSacLoad(GENmodel *, CKTcircuit *); -extern int NUMOSask(CKTcircuit *, GENinstance *, int, IFvalue *, IFvalue *); -extern int NUMOSdelete(GENinstance *); -extern int NUMOSgetic(GENmodel *, CKTcircuit *); -extern int NUMOSload(GENmodel *, CKTcircuit *); -extern int NUMOSmParam(int, IFvalue *, GENmodel *); -extern int NUMOSparam(int, IFvalue *, GENinstance *, IFvalue *); -extern int NUMOSpzLoad(GENmodel *, CKTcircuit *, SPcomplex *); -extern int NUMOSsetup(SMPmatrix *, GENmodel *, CKTcircuit *, int *); -extern int NUMOStemp(GENmodel *, CKTcircuit *); -extern int NUMOStrunc(GENmodel *, CKTcircuit *, double *); - -extern void NUMOSdump(GENmodel *, CKTcircuit *); -extern void NUMOSacct(GENmodel *, CKTcircuit *, FILE *); - -#endif /* NUMOSEXT_H */ diff --git a/src/spicelib/devices/numos/numosinit.c b/src/spicelib/devices/numos/numosinit.c deleted file mode 100644 index c6d8026f0..000000000 --- a/src/spicelib/devices/numos/numosinit.c +++ /dev/null @@ -1,76 +0,0 @@ -#include "ngspice/config.h" - -#include "ngspice/devdefs.h" - -#include "numositf.h" -#include "numosext.h" -#include "numosinit.h" - - -SPICEdev NUMOSinfo = { - .DEVpublic = { - .name = "NUMOS", - .description = "2D Numerical MOS Field Effect Transistor model", - .terms = &NUMOSnSize, - .numNames = &NUMOSnSize, - .termNames = NUMOSnames, - .numInstanceParms = &NUMOSpTSize, - .instanceParms = NUMOSpTable, - .numModelParms = &NUMOSmPTSize, - .modelParms = NUMOSmPTable, - .flags = DEV_DEFAULT, - -#ifdef XSPICE - .cm_func = NULL, - .num_conn = 0, - .conn = NULL, - .num_param = 0, - .param = NULL, - .num_inst_var = 0, - .inst_var = NULL, -#endif - }, - - .DEVparam = NUMOSparam, - .DEVmodParam = NUMOSmParam, - .DEVload = NUMOSload, - .DEVsetup = NUMOSsetup, - .DEVunsetup = NULL, - .DEVpzSetup = NUMOSsetup, - .DEVtemperature = NUMOStemp, - .DEVtrunc = NUMOStrunc, - .DEVfindBranch = NULL, - .DEVacLoad = NUMOSacLoad, - .DEVaccept = NULL, - .DEVdestroy = NULL, - .DEVmodDelete = NULL, - .DEVdelete = NUMOSdelete, - .DEVsetic = NULL, - .DEVask = NUMOSask, - .DEVmodAsk = NULL, - .DEVpzLoad = NUMOSpzLoad, - .DEVconvTest = NULL, - .DEVsenSetup = NULL, - .DEVsenLoad = NULL, - .DEVsenUpdate = NULL, - .DEVsenAcLoad = NULL, - .DEVsenPrint = NULL, - .DEVsenTrunc = NULL, - .DEVdisto = NULL, - .DEVnoise = NULL, - .DEVsoaCheck = NULL, - .DEVinstSize = &NUMOSiSize, - .DEVmodSize = &NUMOSmSize, - -#ifdef CIDER - .DEVdump = NUMOSdump, - .DEVacct = NUMOSacct, -#endif -}; - - -SPICEdev * -get_numos_info(void) -{ - return &NUMOSinfo; -} diff --git a/src/spicelib/devices/numos/numosinit.h b/src/spicelib/devices/numos/numosinit.h deleted file mode 100644 index 3139c1e34..000000000 --- a/src/spicelib/devices/numos/numosinit.h +++ /dev/null @@ -1,13 +0,0 @@ -#ifndef _NUMOSINIT_H -#define _NUMOSINIT_H - -extern IFparm NUMOSpTable[ ]; -extern IFparm NUMOSmPTable[ ]; -extern char *NUMOSnames[ ]; -extern int NUMOSpTSize; -extern int NUMOSmPTSize; -extern int NUMOSnSize; -extern int NUMOSiSize; -extern int NUMOSmSize; - -#endif diff --git a/src/spicelib/devices/numos/numositf.h b/src/spicelib/devices/numos/numositf.h deleted file mode 100644 index 2a66e5284..000000000 --- a/src/spicelib/devices/numos/numositf.h +++ /dev/null @@ -1,10 +0,0 @@ -/********** -Copyright 1991 Regents of the University of California. All rights reserved. -**********/ - -#ifndef DEV_NUMOS -#define DEV_NUMOS - -extern SPICEdev *get_numos_info(void); - -#endif diff --git a/src/spicelib/devices/soi3/Makefile.am b/src/spicelib/devices/soi3/Makefile.am deleted file mode 100644 index bb852423e..000000000 --- a/src/spicelib/devices/soi3/Makefile.am +++ /dev/null @@ -1,30 +0,0 @@ -## Process this file with automake to produce Makefile.in - -noinst_LTLIBRARIES = libsoi3.la - -libsoi3_la_SOURCES = \ - soi3.c \ - soi3acld.c \ - soi3ask.c \ - soi3cap.c \ - soi3conv.c \ - soi3defs.h \ - soi3ext.h \ - soi3ic.c \ - soi3init.c \ - soi3init.h \ - soi3itf.h \ - soi3load.c \ - soi3mask.c \ - soi3mpar.c \ - soi3nois.c \ - soi3par.c \ - soi3set.c \ - soi3temp.c \ - soi3trun.c - - - -AM_CPPFLAGS = @AM_CPPFLAGS@ -I$(top_srcdir)/src/include -AM_CFLAGS = $(STATIC) -MAINTAINERCLEANFILES = Makefile.in diff --git a/src/spicelib/devices/soi3/README b/src/spicelib/devices/soi3/README deleted file mode 100644 index 4fa56ee9d..000000000 --- a/src/spicelib/devices/soi3/README +++ /dev/null @@ -1,55 +0,0 @@ -Licence Agreement (STAG) from DERA - -1. The STAG Computer Model is subject to Copyright owned by the United Kingdom -Secretary of State for Defence acting through the Defence Evaluation and Research Agency -(DERA). It is made available to licensee (hereinafter LICENSEE) on the following conditions:- - -2. Downloading the STAG Model deems acceptance of the terms of the licence. - -3. DERA grants to LICENSEE a royalty free non-exclusive licence to use the furnished STAG -Model. LICENSEE is permitted to copy, distribute, and transfer the STAG Model to -customers for their royalty free use on the same licence terms. - -4. LICENSEE acknowledges that STAG is a research tool still in the development stage, that -it is being supplied "as is", without any accompanying services or improvements from -DERA. - -5. LICENSEE acknowledges that STAG is a Model developed by the Department of -Electronics and Computer Science at the University of Southampton (UOS), England, and is -incorporated within SPICE 3f5, a program developed by the Department of Electrical -Engineering and Computer Science at the University of California, Berkeley, California -(UCB). As such, LICENSEE acknowledges that in addition to the rights licensed by DERA, -UCB itself imposes restrictions on use, copying, and distribution of the SPICE 3f5 program -and its derivatives. - -6. LICENSEE undertakes to obtain any separate licence required for the use of SPICE 3f5 -from UCB. - -7. DERA make no representations or warranties, express or implied. DERA shall not be held -liable for any liability nor for any direct, indirect, or consequential damages with respect to -any claim by LICENSEE or any third party on account of or arising from this Agreement or -use of STAG. - -8. Title to copyright of all portions of STAG developed at UOS and/or DERA together with -associated documentation shall at all times remain with DERA, and LICENSEE agrees to -preserve same. LICENSEE agrees to ensure that this information and appropriate copyright -notice is reproduced with any copies of STAG or any modified versions derived from it. - -9. This agreement shall be construed, interpreted, and applied in accordance with the laws -of England. - -for DERA by: - -J B EDWARDS -IPD5A -10 NOV 1997 - -Intellectual Property Department -Defence Evaluation and Research Agency -St Andrews Road -Malvern -WR14 3PS -United Kingdom - -phone: +44 - 1684 - 894234 -fax: +44 - 1684 - 894146 diff --git a/src/spicelib/devices/soi3/soi3.c b/src/spicelib/devices/soi3/soi3.c deleted file mode 100644 index be5dc3aa4..000000000 --- a/src/spicelib/devices/soi3/soi3.c +++ /dev/null @@ -1,240 +0,0 @@ -/********** -STAG version 2.7 -Copyright 2000 owned by the United Kingdom Secretary of State for Defence -acting through the Defence Evaluation and Research Agency. -Developed by : Jim Benson, - Department of Electronics and Computer Science, - University of Southampton, - United Kingdom. -With help from : Nele D'Halleweyn, Ketan Mistry, Bill Redman-White, and Craig Easson. - -Based on STAG version 2.1 -Developed by : Mike Lee, -With help from : Bernard Tenbroek, Bill Redman-White, Mike Uren, Chris Edwards - and John Bunyan. -Acknowledgements : Rupert Howes and Pete Mole. -**********/ - -/********** -Modified by Paolo Nenzi 2002 -ngspice integration -**********/ - -#include "ngspice/ngspice.h" -#include "ngspice/devdefs.h" -#include "ngspice/ifsim.h" -#include "soi3defs.h" -#include "ngspice/suffix.h" - - -char *SOI3names[] = { - "Drain", - "Front Gate", - "Source", - "Back Gate", - "Bulk", - "Thermal" -}; - - -IFparm SOI3pTable[] = { /* parameters */ - IOP("l", SOI3_L, IF_REAL, "Length"), - IOP("w", SOI3_W, IF_REAL, "Width"), - IOP("m", SOI3_M, IF_REAL, "Parallel Multiplier"), - IOP("as", SOI3_AS, IF_REAL, "Source area"), - IOP("ad", SOI3_AD, IF_REAL, "Drain area"), - IOP("ab", SOI3_AB, IF_REAL, "Body area"), - IOP("nrd", SOI3_NRD, IF_REAL, "Drain squares"), - IOP("nrs", SOI3_NRS, IF_REAL, "Source squares"), - IP("off", SOI3_OFF, IF_FLAG, "Device initially off"), - IOP("icvds", SOI3_IC_VDS, IF_REAL, "Initial D-S voltage"), - IOP("icvgfs", SOI3_IC_VGFS, IF_REAL, "Initial GF-S voltage"), - IOP("icvgbs", SOI3_IC_VGBS, IF_REAL, "Initial GB-S voltage"), - IOP("icvbs", SOI3_IC_VBS, IF_REAL, "Initial B-S voltage"), - IOP("temp", SOI3_TEMP, IF_REAL, "Instance temperature"), - IOP("rt", SOI3_RT, IF_REAL, "Instance Lumped Thermal Resistance"), - IOP("ct", SOI3_CT, IF_REAL, "Instance Lumped Thermal Capacitance"), - IOP("rt1", SOI3_RT1, IF_REAL, "Second Thermal Resistance"), - IOP("ct1", SOI3_CT1, IF_REAL, "Second Thermal Capacitance"), - IOP("rt2", SOI3_RT2, IF_REAL, "Third Thermal Resistance"), - IOP("ct2", SOI3_CT2, IF_REAL, "Third Thermal Capacitance"), - IOP("rt3", SOI3_RT3, IF_REAL, "Fourth Thermal Resistance"), - IOP("ct3", SOI3_CT3, IF_REAL, "Fourth Thermal Capacitance"), - IOP("rt4", SOI3_RT4, IF_REAL, "Fifth Thermal Resistance"), - IOP("ct4", SOI3_CT4, IF_REAL, "Fifth Thermal Capacitance"), - - IP( "ic", SOI3_IC, IF_REALVEC,"Vector of D-S, GF-S, GB-S, B-S voltages"), -/* IP( "sens_l", SOI3_L_SENS, IF_FLAG, "flag to request sensitivity WRT length"), - IP( "sens_w", SOI3_W_SENS, IF_FLAG, "flag to request sensitivity WRT width"),*/ - OP( "dnode", SOI3_DNODE, IF_INTEGER, "Number of the drain node "), - OP( "gfnode", SOI3_GFNODE, IF_INTEGER, "Number of frt. gate node "), - OP( "snode", SOI3_SNODE, IF_INTEGER, "Number of the source node "), - OP( "gbnode", SOI3_GBNODE, IF_INTEGER, "Number of back gate node "), - OP( "bnode", SOI3_BNODE, IF_INTEGER, "Number of the body node "), - OP( "dnodeprime", SOI3_DNODEPRIME, IF_INTEGER, "Number of int. drain node"), - OP( "snodeprime", SOI3_SNODEPRIME, IF_INTEGER, "Number of int. source node "), - OP( "tnode", SOI3_TNODE, IF_INTEGER, "Number of thermal node "), - OP( "branch", SOI3_BRANCH, IF_INTEGER, "Number of thermal branch "), - OP( "sourceconductance", SOI3_SOURCECONDUCT, IF_REAL, "Conductance of source"), - OP( "drainconductance", SOI3_DRAINCONDUCT, IF_REAL, "Conductance of drain"), - OP( "von", SOI3_VON, IF_REAL, "Effective Threshold Voltage (von) "), - OP( "vfbf", SOI3_VFBF, IF_REAL, "Temperature adjusted flat band voltage"), - OP( "vdsat", SOI3_VDSAT, IF_REAL, "Saturation drain voltage"), - OP( "sourcevcrit", SOI3_SOURCEVCRIT,IF_REAL, "Critical source voltage"), - OP( "drainvcrit", SOI3_DRAINVCRIT, IF_REAL, "Critical drain voltage"), - OP( "id", SOI3_ID, IF_REAL, "Drain current"), - OP( "ibs", SOI3_IBS, IF_REAL, "B-S junction current"), - OP( "ibd", SOI3_IBD, IF_REAL, "B-D junction current"), - OP( "gmbs", SOI3_GMBS, IF_REAL, "Bulk-Source transconductance"), - OP( "gmf", SOI3_GMF, IF_REAL, "Front transconductance"), - OP( "gmb", SOI3_GMB, IF_REAL, "Back transconductance"), - OP( "gds", SOI3_GDS, IF_REAL, "Drain-Source conductance"), - OP( "gbd", SOI3_GBD, IF_REAL, "Bulk-Drain conductance"), - OP( "gbs", SOI3_GBS, IF_REAL, "Bulk-Source conductance"), - OP( "capbd", SOI3_CAPBD, IF_REAL, "Bulk-Drain capacitance"), - OP( "capbs", SOI3_CAPBS, IF_REAL, "Bulk-Source capacitance"), - OP( "cbd0", SOI3_CAPZEROBIASBD, IF_REAL, "Zero-Bias B-D junction capacitance"), - OP( "cbs0", SOI3_CAPZEROBIASBS, IF_REAL, "Zero-Bias B-S junction capacitance"), - OP( "vbd", SOI3_VBD, IF_REAL, "Bulk-Drain voltage"), - OP( "vbs", SOI3_VBS, IF_REAL, "Bulk-Source voltage"), - OP( "vgfs", SOI3_VGFS, IF_REAL, "Front gate-Source voltage"), - OP( "vgbs", SOI3_VGBS, IF_REAL, "Back gate-Source voltage"), - OP( "vds", SOI3_VDS, IF_REAL, "Drain-Source voltage"), - OP( "qgf", SOI3_QGF, IF_REAL, "Front Gate charge storage"), - OP( "iqgf",SOI3_IQGF,IF_REAL,"Current due to front gate charge storage"), -/* - OP( "qgb", SOI3_QGB, IF_REAL, "Back Gate charge storage"), - OP( "iqgb",SOI3_IQGB,IF_REAL,"Current due to back gate charge storage"), -*/ - OP( "qd", SOI3_QD, IF_REAL, "Drain charge storage"), - OP( "iqd",SOI3_IQD,IF_REAL,"Current due to drain charge storage"), - OP( "qs", SOI3_QS, IF_REAL, "Source charge storage"), - OP( "iqs",SOI3_IQS,IF_REAL,"Current due to source charge storage"), - OP( "qbd", SOI3_QBD, IF_REAL, "Bulk-Drain charge storage"), - OP( "iqbd",SOI3_IQBD,IF_REAL,"Current due to bulk-drain charge storage"), - OP( "qbs", SOI3_QBS, IF_REAL, "Bulk-Source charge storage"), - OP( "iqbs",SOI3_IQBS,IF_REAL,"Currnet due to bulk-source charge storage"), -/* extra stuff for newer model -msll Jan96 */ - OP( "vfbb", SOI3_VFBB, IF_REAL, "Temperature adjusted back flat band voltage") - -/*, - OP( "sens_l_dc", SOI3_L_SENS_DC, IF_REAL, "dc sensitivity wrt length"), - OP( "sens_l_real", SOI3_L_SENS_REAL,IF_REAL, - "real part of ac sensitivity wrt length"), - OP( "sens_l_imag", SOI3_L_SENS_IMAG,IF_REAL, - "imag part of ac sensitivity wrt length"), - OP( "sens_l_mag", SOI3_L_SENS_MAG, IF_REAL, - "sensitivity wrt l of ac magnitude"), - OP( "sens_l_ph", SOI3_L_SENS_PH, IF_REAL, - "sensitivity wrt l of ac phase"), - OP( "sens_l_cplx", SOI3_L_SENS_CPLX,IF_COMPLEX, "ac sensitivity wrt length"), - OP( "sens_w_dc", SOI3_W_SENS_DC, IF_REAL, "dc sensitivity wrt width"), - OP( "sens_w_real", SOI3_W_SENS_REAL,IF_REAL, - "real part of ac sensitivity wrt width"), - OP( "sens_w_imag", SOI3_W_SENS_IMAG,IF_REAL, - "imag part of ac sensitivity wrt width"), - OP( "sens_w_mag", SOI3_W_SENS_MAG, IF_REAL, - "sensitivity wrt w of ac magnitude"), - OP( "sens_w_ph", SOI3_W_SENS_PH, IF_REAL, - "sensitivity wrt w of ac phase"), - OP( "sens_w_cplx", SOI3_W_SENS_CPLX,IF_COMPLEX, "ac sensitivity wrt width")*/ -}; - -IFparm SOI3mPTable[] = { /* model parameters */ - IOP("vto", SOI3_MOD_VTO, IF_REAL ,"Threshold voltage"), - IOPR("vt0", SOI3_MOD_VTO, IF_REAL ,"Threshold voltage"), - IOP("vfbf", SOI3_MOD_VFBF, IF_REAL ,"Flat band voltage"), - IOP("kp", SOI3_MOD_KP, IF_REAL ,"Transconductance parameter"), - IOP("gamma", SOI3_MOD_GAMMA, IF_REAL ,"Body Factor"), - IOP("phi", SOI3_MOD_PHI, IF_REAL ,"Surface potential"), - IOP("lambda",SOI3_MOD_LAMBDA,IF_REAL ,"Channel length modulation"), - IOP("theta", SOI3_MOD_THETA, IF_REAL ,"Vertical field mobility degradation"), - IOP("rd", SOI3_MOD_RD, IF_REAL ,"Drain ohmic resistance"), - IOP("rs", SOI3_MOD_RS, IF_REAL ,"Source ohmic resistance"), - IOP("cbd", SOI3_MOD_CBD, IF_REAL ,"B-D junction capacitance"), - IOP("cbs", SOI3_MOD_CBS, IF_REAL ,"B-S junction capacitance"), - IOP("is", SOI3_MOD_IS, IF_REAL ,"Bulk junction sat. current"), - IOP("is1", SOI3_MOD_IS1, IF_REAL ,"2nd Bulk junction sat. current"), - IOP("pb", SOI3_MOD_PB, IF_REAL ,"Bulk junction potential"), - IOP("cgfso", SOI3_MOD_CGFSO, IF_REAL ,"Front Gate-source overlap cap."), - IOP("cgfdo", SOI3_MOD_CGFDO, IF_REAL ,"Front Gate-drain overlap cap."), - IOP("cgfbo", SOI3_MOD_CGFBO, IF_REAL ,"Front Gate-bulk overlap cap."), - IOP("cgbso", SOI3_MOD_CGBSO, IF_REAL ,"Back Gate-source overlap cap."), - IOP("cgbdo", SOI3_MOD_CGBDO, IF_REAL ,"Back Gate-drain overlap cap."), - IOP("cgbbo", SOI3_MOD_CGBBO, IF_REAL ,"Back Gate-bulk overlap cap."), - IOP("rsh", SOI3_MOD_RSH, IF_REAL ,"Sheet resistance"), - IOP("cj", SOI3_MOD_CJSW, IF_REAL ,"Side junction cap per area"), - IOP("mj", SOI3_MOD_MJSW, IF_REAL ,"Side grading coefficient"), - IOP("js", SOI3_MOD_JS, IF_REAL ,"Bulk jct. sat. current density"), - IOP("js1", SOI3_MOD_JS1, IF_REAL ,"2nd Bulk jct. sat. current density"), - IOP("tof", SOI3_MOD_TOF, IF_REAL ,"Front Oxide thickness"), - IOP("tob", SOI3_MOD_TOB, IF_REAL ,"Back Oxide thickness"), - IOP("tb", SOI3_MOD_TB, IF_REAL ,"Bulk film thickness"), - IOP("ld", SOI3_MOD_LD, IF_REAL ,"Lateral diffusion"), - IOP("u0", SOI3_MOD_U0, IF_REAL ,"Surface mobility"), - IOPR("uo", SOI3_MOD_U0, IF_REAL ,"Surface mobility"), - IOP("fc", SOI3_MOD_FC, IF_REAL ,"Forward bias jct. fit parm."), - IP("nsoi", SOI3_MOD_NSOI3, IF_FLAG ,"N type SOI3fet model"), - IP("psoi", SOI3_MOD_PSOI3, IF_FLAG ,"P type SOI3fet model"), - IOP("kox", SOI3_MOD_KOX, IF_REAL ,"Oxide thermal conductivity"), - IOP("shsi", SOI3_MOD_SHSI, IF_REAL ,"Specific heat of silicon"), - IOP("dsi", SOI3_MOD_DSI, IF_REAL ,"Density of silicon"), - IOP("nsub", SOI3_MOD_NSUB, IF_REAL ,"Substrate doping"), - IOP("tpg", SOI3_MOD_TPG, IF_INTEGER,"Gate type"), - IOP("nqff", SOI3_MOD_NQFF, IF_REAL ,"Front fixed oxide charge density"), - IOP("nqfb", SOI3_MOD_NQFB, IF_REAL ,"Back fixed oxide charge density"), - IOP("nssf", SOI3_MOD_NSSF, IF_REAL ,"Front surface state density"), - IOP("nssb", SOI3_MOD_NSSB, IF_REAL ,"Back surface state density"), - IOP("tnom", SOI3_MOD_TNOM, IF_REAL ,"Parameter measurement temp"), - IP("kf", SOI3_MOD_KF, IF_REAL ,"Flicker noise coefficient"), - IP("af", SOI3_MOD_AF, IF_REAL ,"Flicker noise exponent"), -/* extra stuff for newer model - msll Jan96 */ - IOP("sigma", SOI3_MOD_SIGMA, IF_REAL ,"DIBL coefficient"), - IOP("chifb", SOI3_MOD_CHIFB, IF_REAL ,"Temperature coeff of flatband voltage"), - IOP("chiphi",SOI3_MOD_CHIPHI, IF_REAL ,"Temperature coeff of PHI"), - IOP("deltaw",SOI3_MOD_DELTAW,IF_REAL ,"Narrow width factor"), - IOP("deltal",SOI3_MOD_DELTAL,IF_REAL ,"Short channel factor"), - IOP("vsat", SOI3_MOD_VSAT, IF_REAL ,"Saturation velocity"), - IOP("k", SOI3_MOD_K, IF_REAL ,"Thermal exponent"), - IOP("lx", SOI3_MOD_LX, IF_REAL ,"Channel length modulation (alternative)"), - IOP("vp", SOI3_MOD_VP, IF_REAL ,"Channel length modulation (alt. empirical)"), - IOP("eta", SOI3_MOD_ETA, IF_REAL ,"Impact ionization field adjustment factor"), - IOP("alpha0",SOI3_MOD_ALPHA0,IF_REAL ,"First impact ionisation coeff (alpha0)"), - IOP("beta0", SOI3_MOD_BETA0, IF_REAL ,"Second impact ionisation coeff (beta0)"), - IOP("lm", SOI3_MOD_LM, IF_REAL ,"Impact ion. drain region length"), - IOP("lm1", SOI3_MOD_LM1, IF_REAL ,"Impact ion. drain region length coeff"), - IOP("lm2", SOI3_MOD_LM2, IF_REAL ,"Impact ion. drain region length coeff"), - IOP("etad", SOI3_MOD_ETAD, IF_REAL ,"Diode ideality factor"), - IOP("etad1", SOI3_MOD_ETAD1, IF_REAL ,"2nd Diode ideality factor"), - IOP("chibeta",SOI3_MOD_CHIBETA,IF_REAL ,"Impact ionisation temperature coefficient"), - IOP("vfbb", SOI3_MOD_VFBB, IF_REAL ,"Back Flat band voltage"), - IOP("gammab",SOI3_MOD_GAMMAB,IF_REAL ,"Back Body Factor"), - IOP("chid", SOI3_MOD_CHID, IF_REAL ,"Junction temperature factor"), - IOP("chid1", SOI3_MOD_CHID1, IF_REAL ,"2nd Junction temperature factor"), - IOP("dvt", SOI3_MOD_DVT, IF_INTEGER,"Switch for temperature dependence of vt in diodes"), - IOP("nlev", SOI3_MOD_NLEV, IF_INTEGER,"Level switch for flicker noise model"), - IOP("betabjt",SOI3_MOD_BETABJT,IF_REAL ,"Beta for BJT"), - IOP("tauf", SOI3_MOD_TAUFBJT,IF_REAL ,"Forward tau for BJT"), - IOP("taur", SOI3_MOD_TAURBJT,IF_REAL ,"Reverse tau for BJT"), - IOP("betaexp",SOI3_MOD_BETAEXP,IF_REAL ,"Exponent for Beta of BJT"), - IOP("tauexp", SOI3_MOD_TAUEXP,IF_REAL, "Exponent for Transit time of BJT"), - IOP("rsw", SOI3_MOD_RSW, IF_REAL ,"Source resistance width scaling factor"), - IOP("rdw", SOI3_MOD_RDW, IF_REAL ,"Drain resistance width scaling factor"), - IOP("fmin", SOI3_MOD_FMIN, IF_REAL ,"Minimum feature size of technology"), - IOP("vtex", SOI3_MOD_VTEX, IF_REAL ,"Extracted threshold voltage"), - IOP("vdex", SOI3_MOD_VDEX, IF_REAL ,"Drain bias at which vtex extracted"), - IOP("delta0",SOI3_MOD_DELTA0,IF_REAL ,"Surface potential factor for vtex conversion"), - IOP("csf", SOI3_MOD_CSF ,IF_REAL ,"Saturation region charge sharing factor"), - IOP("nplus", SOI3_MOD_NPLUS ,IF_REAL ,"Doping concentration of N+ or P+ regions"), - IOP("rta", SOI3_MOD_RTA ,IF_REAL ,"Thermal resistance area scaling factor"), - IOP("cta", SOI3_MOD_CTA ,IF_REAL ,"Thermal capacitance area scaling factor"), - IOP("mexp", SOI3_MOD_MEXP ,IF_REAL ,"Exponent for CLM smoothing") -}; - - -int SOI3nSize = NUMELEMS(SOI3names); -int SOI3pTSize = NUMELEMS(SOI3pTable); -int SOI3mPTSize = NUMELEMS(SOI3mPTable); -int SOI3iSize = sizeof(SOI3instance); -int SOI3mSize = sizeof(SOI3model); - diff --git a/src/spicelib/devices/soi3/soi3acld.c b/src/spicelib/devices/soi3/soi3acld.c deleted file mode 100644 index b98e6b4f8..000000000 --- a/src/spicelib/devices/soi3/soi3acld.c +++ /dev/null @@ -1,446 +0,0 @@ -/********** -STAG version 2.7 -Copyright 2000 owned by the United Kingdom Secretary of State for Defence -acting through the Defence Evaluation and Research Agency. -Developed by : Jim Benson, - Department of Electronics and Computer Science, - University of Southampton, - United Kingdom. -With help from : Nele D'Halleweyn, Ketan Mistry, Bill Redman-White, - and Craig Easson. - -Based on STAG version 2.1 -Developed by : Mike Lee, -With help from : Bernard Tenbroek, Bill Redman-White, Mike Uren, Chris Edwards - and John Bunyan. -Acknowledgements : Rupert Howes and Pete Mole. -**********/ - -/********** -Modified by Paolo Nenzi 2002 -ngspice integration -**********/ - -#include "ngspice/ngspice.h" -#include "ngspice/cktdefs.h" -#include "soi3defs.h" -#include "ngspice/sperror.h" -#include "ngspice/suffix.h" - - -int -SOI3acLoad(GENmodel *inModel, CKTcircuit *ckt) -{ - SOI3model *model = (SOI3model*)inModel; - SOI3instance *here; - int xnrm; - int xrev; - - double cgfgf,cgfd,cgfs,cgfdeltaT,cgfgb; - double cdgf,cdd,cds,cddeltaT,cdgb; - double csgf,csd,css,csdeltaT,csgb; - double cbgf,cbd,cbs,cbdeltaT,cbgb; - double cgbgf,cgbd,cgbs,cgbdeltaT,cgbgb; - - double xcgfgf,xcgfd,xcgfs,xcgfdeltaT,xcgfgb; - double xcdgf,xcdd,xcds,xcddeltaT,xcdgb; - double xcsgf,xcsd,xcss,xcsdeltaT,xcsgb; - double xcbgf,xcbd,xcbs,xcbdeltaT,xcbgb; - double xcgbgf,xcgbd,xcgbs,xcgbdeltaT,xcgbgb; - - double capbd,capbs; /* diode capacitances */ - - double xcBJTbsbs,xcBJTbsdeltaT; - double xcBJTbdbd,xcBJTbddeltaT; - - double rtargs[5]; - double grt[5]; - double ctargs[5]; - double xct[5]; /* 1/reactance of thermal cap */ - int tnodeindex; - - double cgfb0; - double cgfd0; - double cgfs0; - - double cgbb0; - double cgbd0; - double cgbs0; - - double EffectiveLength; - - double omega; - - double m; - - omega = ckt->CKTomega; - - for( ; model != NULL; model = SOI3nextModel(model)) - { - for(here = SOI3instances(model); here!= NULL; - here = SOI3nextInstance(here)) - { - - if (here->SOI3mode < 0) - { - xnrm=0; - xrev=1; - } - else - { - xnrm=1; - xrev=0; - } - - EffectiveLength=here->SOI3l - 2*model->SOI3latDiff; - - /* JimB - can use basic device geometry to estimate front and back */ - /* overlap capacitances to a first approximation. Use this default */ - /* model if capacitance factors aren't given in model netlist. */ - - /* Calculate front gate overlap capacitances. */ - - if(model->SOI3frontGateSourceOverlapCapFactorGiven) - { - cgfs0 = model->SOI3frontGateSourceOverlapCapFactor * here->SOI3w; - } - else - { - cgfs0 = model->SOI3latDiff * here->SOI3w * model->SOI3frontOxideCapFactor; - } - if(model->SOI3frontGateDrainOverlapCapFactorGiven) - { - cgfd0 = model->SOI3frontGateDrainOverlapCapFactor * here->SOI3w; - } - else - { - cgfd0 = model->SOI3latDiff * here->SOI3w * model->SOI3frontOxideCapFactor; - } - if(model->SOI3frontGateBulkOverlapCapFactorGiven) - { - cgfb0 = model->SOI3frontGateBulkOverlapCapFactor * EffectiveLength; - } - else - { - cgfb0 = EffectiveLength * (0.1*1e-6*model->SOI3minimumFeatureSize) - * model->SOI3frontOxideCapFactor; - } - - /* Calculate back gate overlap capacitances. */ - - if( (model->SOI3backGateSourceOverlapCapAreaFactorGiven) && - (!model->SOI3backGateSourceOverlapCapAreaFactor || here->SOI3asGiven) ) - { - cgbs0 = model->SOI3backGateSourceOverlapCapAreaFactor * here->SOI3as; - } - else - { - cgbs0 = (2*1e-6*model->SOI3minimumFeatureSize + model->SOI3latDiff) * here->SOI3w - * model->SOI3backOxideCapFactor; - } - if( (model->SOI3backGateDrainOverlapCapAreaFactorGiven) && - (!model->SOI3backGateDrainOverlapCapAreaFactor || here->SOI3adGiven) ) - { - cgbd0 = model->SOI3backGateDrainOverlapCapAreaFactor * here->SOI3ad; - } - else - { - cgbd0 = (2*1e-6*model->SOI3minimumFeatureSize + model->SOI3latDiff) * here->SOI3w - * model->SOI3backOxideCapFactor; - } - if( (model->SOI3backGateBulkOverlapCapAreaFactorGiven) && - (!model->SOI3backGateBulkOverlapCapAreaFactor || here->SOI3abGiven) ) - { - cgbb0 = model->SOI3backGateBulkOverlapCapAreaFactor * here->SOI3ab; - } - else - { - cgbb0 = EffectiveLength * (0.1*1e-6*model->SOI3minimumFeatureSize + here->SOI3w) - * model->SOI3backOxideCapFactor; - } - - capbd = here->SOI3capbd; - capbs = here->SOI3capbs; - - cgfgf = *(ckt->CKTstate0 + here->SOI3cgfgf); - cgfd = *(ckt->CKTstate0 + here->SOI3cgfd); - cgfs = *(ckt->CKTstate0 + here->SOI3cgfs); - cgfdeltaT = *(ckt->CKTstate0 + here->SOI3cgfdeltaT); - cgfgb = *(ckt->CKTstate0 + here->SOI3cgfgb); - csgf = *(ckt->CKTstate0 + here->SOI3csgf); - csd = *(ckt->CKTstate0 + here->SOI3csd); - css = *(ckt->CKTstate0 + here->SOI3css); - csdeltaT = *(ckt->CKTstate0 + here->SOI3csdeltaT); - csgb = *(ckt->CKTstate0 + here->SOI3csgb); - cdgf = *(ckt->CKTstate0 + here->SOI3cdgf); - cdd = *(ckt->CKTstate0 + here->SOI3cdd); - cds = *(ckt->CKTstate0 + here->SOI3cds); - cddeltaT = *(ckt->CKTstate0 + here->SOI3cddeltaT); - cdgb = *(ckt->CKTstate0 + here->SOI3cdgb); - cgbgf = *(ckt->CKTstate0 + here->SOI3cgbgf); - cgbd = *(ckt->CKTstate0 + here->SOI3cgbd); - cgbs = *(ckt->CKTstate0 + here->SOI3cgbs); - cgbdeltaT = *(ckt->CKTstate0 + here->SOI3cgbdeltaT); - cgbgb = *(ckt->CKTstate0 + here->SOI3cgbgb); - cbgf = -(cgfgf + cdgf + csgf + cgbgf); - cbd = -(cgfd + cdd + csd + cgbd); - cbs = -(cgfs + cds + css + cgbs); - cbdeltaT = -(cgfdeltaT + cddeltaT + csdeltaT + cgbdeltaT); - cbgb = -(cgfgb + cdgb + csgb + cgbgb); - - xcgfgf = (cgfgf + cgfd0 + cgfs0 + cgfb0) * omega; - xcgfd = (cgfd - cgfd0) * omega; - xcgfs = (cgfs - cgfs0) * omega; - xcgfdeltaT = cgfdeltaT * omega; - xcgfgb = cgfgb * omega; - xcdgf = (cdgf - cgfd0) * omega; - xcdd = (cdd + capbd + cgfd0 + cgbd0) * omega; - xcds = cds * omega; - xcddeltaT = cddeltaT * omega; - xcdgb = (cdgb - cgbd0) * omega; - xcsgf = (csgf - cgfs0) * omega; - xcsd = csd * omega; - xcss = (css + capbs + cgfs0 + cgbs0) * omega; - xcsdeltaT = csdeltaT * omega; - xcsgb = (csgb - cgbs0) * omega; - xcbgf = (cbgf - cgfb0) * omega; - xcbd = (cbd - capbd) * omega; - xcbs = (cbs - capbs) * omega; - xcbdeltaT = cbdeltaT * omega; - xcbgb = (cbgb - cgbb0) * omega; - xcgbgf = cgbgf * omega; - xcgbd = (cgbd - cgbd0) * omega; - xcgbs = (cgbs - cgbs0) * omega; - xcgbdeltaT = cgbdeltaT * omega; - xcgbgb = (cgbgb + cgbd0 + cgbs0 + cgbb0) * omega; - - xcBJTbsbs = *(ckt->CKTstate0 + here->SOI3cBJTbsbs) * omega; - xcBJTbsdeltaT = *(ckt->CKTstate0 + here->SOI3cBJTbsdeltaT) * omega; - xcBJTbdbd = *(ckt->CKTstate0 + here->SOI3cBJTbdbd) * omega; - xcBJTbddeltaT = *(ckt->CKTstate0 + here->SOI3cBJTbddeltaT) * omega; - - /* JimB - 15/9/99 */ - /* Code for multiple thermal time constants. Start by moving all */ - /* rt and ct constants into arrays. */ - rtargs[0]=here->SOI3rt; - rtargs[1]=here->SOI3rt1; - rtargs[2]=here->SOI3rt2; - rtargs[3]=here->SOI3rt3; - rtargs[4]=here->SOI3rt4; - - ctargs[0]=here->SOI3ct; - ctargs[1]=here->SOI3ct1; - ctargs[2]=here->SOI3ct2; - ctargs[3]=here->SOI3ct3; - ctargs[4]=here->SOI3ct4; - - /* Set all admittance components to zero. */ - grt[0]=grt[1]=grt[2]=grt[3]=grt[4]=0.0; - xct[0]=xct[1]=xct[2]=xct[3]=xct[4]=0.0; - /* Now calculate conductances and susceptances from rt and ct. */ - /* Don't need to worry about divide by zero when calculating */ - /* grt components, as soi3setup() only creates a thermal node */ - /* if corresponding rt is greater than zero. */ - for(tnodeindex=0;tnodeindexSOI3numThermalNodes;tnodeindex++) - { - xct[tnodeindex] = ctargs[tnodeindex] * ckt->CKTomega; - grt[tnodeindex] = 1/rtargs[tnodeindex]; - } - /* End JimB */ - - /* - * load matrix - */ - - m = here->SOI3m; - - *(here->SOI3GF_gfPtr + 1) += m * xcgfgf; - *(here->SOI3GF_gbPtr + 1) += m * xcgfgb; - *(here->SOI3GF_dpPtr + 1) += m * xcgfd; - *(here->SOI3GF_spPtr + 1) += m * xcgfs; - *(here->SOI3GF_bPtr + 1) -= m * (xcgfgf + xcgfd + xcgfs + xcgfgb); - - *(here->SOI3GB_gfPtr + 1) += m * xcgbgf; - *(here->SOI3GB_gbPtr + 1) += m * xcgbgb; - *(here->SOI3GB_dpPtr + 1) += m * xcgbd; - *(here->SOI3GB_spPtr + 1) += m * xcgbs; - *(here->SOI3GB_bPtr + 1) -= m * (xcgbgf + xcgbd + xcgbs + xcgbgb); - - *(here->SOI3B_gfPtr + 1) += m * xcbgf; - *(here->SOI3B_gbPtr + 1) += m * xcbgb; - *(here->SOI3B_dpPtr + 1) += m * (xcbd-xcBJTbdbd); - *(here->SOI3B_spPtr + 1) += m * (xcbs-xcBJTbsbs); - *(here->SOI3B_bPtr + 1) += m * (-(xcbgf+xcbd+xcbs+xcbgb) - +xcBJTbsbs+xcBJTbdbd); - - *(here->SOI3DP_gfPtr + 1) += m * xcdgf; - *(here->SOI3DP_gbPtr + 1) += m * xcdgb; - *(here->SOI3DP_dpPtr + 1) += m * (xcdd+xcBJTbdbd); - *(here->SOI3DP_spPtr + 1) += m * xcds; - *(here->SOI3DP_bPtr + 1) -= m * (xcdgf + xcdd + xcds + xcdgb + xcBJTbdbd); - - *(here->SOI3SP_gfPtr + 1) += m * xcsgf; - *(here->SOI3SP_gbPtr + 1) += m * xcsgb; - *(here->SOI3SP_dpPtr + 1) += m * xcsd; - *(here->SOI3SP_spPtr + 1) += m * (xcss+xcBJTbsbs); - *(here->SOI3SP_bPtr + 1) -= m * (xcsgf + xcsd + xcss + xcsgb + xcBJTbsbs); - -/* if no thermal behaviour specified, then put in zero valued indpt. voltage source - between TOUT and ground */ - if (here->SOI3rt==0) - { - *(here->SOI3TOUT_ibrPtr + 1) += m * 1.0; - *(here->SOI3IBR_toutPtr + 1) += m * 1.0; - *(ckt->CKTirhs + (here->SOI3branch)) = 0; - } - else - { - *(here->SOI3TOUT_toutPtr + 1) += m * xct[0]; - if (here->SOI3numThermalNodes > 1) - { - *(here->SOI3TOUT_tout1Ptr + 1) += m * (-xct[0]); - *(here->SOI3TOUT1_toutPtr + 1) += m * (-xct[0]); - *(here->SOI3TOUT1_tout1Ptr + 1) += m * (xct[0]+xct[1]); - } - if (here->SOI3numThermalNodes > 2) - { - *(here->SOI3TOUT1_tout2Ptr + 1) += m * (-xct[1]); - *(here->SOI3TOUT2_tout1Ptr + 1) += m * (-xct[1]); - *(here->SOI3TOUT2_tout2Ptr + 1) += m * (xct[1]+xct[2]); - } - if (here->SOI3numThermalNodes > 3) - { - *(here->SOI3TOUT2_tout3Ptr + 1) += m * (-xct[2]); - *(here->SOI3TOUT3_tout2Ptr + 1) += m * (-xct[2]); - *(here->SOI3TOUT3_tout3Ptr + 1) += m * (xct[2]+xct[3]); - } - if (here->SOI3numThermalNodes > 4) - { - *(here->SOI3TOUT3_tout4Ptr + 1) += m * (-xct[3]); - *(here->SOI3TOUT4_tout3Ptr + 1) += m * (-xct[3]); - *(here->SOI3TOUT4_tout4Ptr + 1) += m * (xct[3]+xct[4]); - } - *(here->SOI3GF_toutPtr + 1) += m * xcgfdeltaT*model->SOI3type; - *(here->SOI3DP_toutPtr + 1) += m * (xcddeltaT - xcBJTbddeltaT)*model->SOI3type; - *(here->SOI3SP_toutPtr + 1) += m * (xcsdeltaT - xcBJTbsdeltaT)*model->SOI3type; - *(here->SOI3B_toutPtr + 1) += m * model->SOI3type * - (xcbdeltaT + xcBJTbsdeltaT + xcBJTbddeltaT); - *(here->SOI3GB_toutPtr + 1) += m * xcgbdeltaT*model->SOI3type; - } - - - /* and now real part */ - *(here->SOI3D_dPtr) += (m * here->SOI3drainConductance); - *(here->SOI3D_dpPtr) += (m * (-here->SOI3drainConductance)); - *(here->SOI3DP_dPtr) += (m * (-here->SOI3drainConductance)); - - *(here->SOI3S_sPtr) += (m * here->SOI3sourceConductance); - *(here->SOI3S_spPtr) += (m * (-here->SOI3sourceConductance)); - *(here->SOI3SP_sPtr) += (m * (-here->SOI3sourceConductance)); - - *(here->SOI3DP_gfPtr) += ((m * (xnrm-xrev)*here->SOI3gmf + - xnrm*here->SOI3gMmf)); - *(here->SOI3DP_gbPtr) += (m * ((xnrm-xrev)*here->SOI3gmb + - xnrm*here->SOI3gMmb)); - *(here->SOI3DP_dpPtr) += m * (here->SOI3drainConductance+here->SOI3gds+ - here->SOI3gbd+xrev*(here->SOI3gmf+here->SOI3gmbs+ - here->SOI3gmb)+xnrm*here->SOI3gMd); - *(here->SOI3DP_spPtr) += m * (-here->SOI3gds - here->SOI3gBJTdb_bs - -xnrm*(here->SOI3gmf+here->SOI3gmb+here->SOI3gmbs + - here->SOI3gMmf+here->SOI3gMmb+here->SOI3gMmbs+here->SOI3gMd)); - *(here->SOI3DP_bPtr) += m * (-here->SOI3gbd + here->SOI3gBJTdb_bs - +(xnrm-xrev)*here->SOI3gmbs+ - xnrm*here->SOI3gMmbs); - - *(here->SOI3SP_gfPtr) += m * (-(xnrm-xrev)*here->SOI3gmf+ - xrev*here->SOI3gMmf); - *(here->SOI3SP_gbPtr) += m * (-(xnrm-xrev)*here->SOI3gmb+ - xrev*here->SOI3gMmb); - *(here->SOI3SP_dpPtr) += m * (-here->SOI3gds - here->SOI3gBJTsb_bd - -xrev*(here->SOI3gmf+here->SOI3gmb+here->SOI3gmbs+ - here->SOI3gMmf+here->SOI3gMmb+here->SOI3gMmbs+here->SOI3gMd)); - *(here->SOI3SP_spPtr) += m * (here->SOI3sourceConductance+here->SOI3gds+ - here->SOI3gbs+xnrm*(here->SOI3gmf+here->SOI3gmbs+ - here->SOI3gmb)+xrev*here->SOI3gMd); - *(here->SOI3SP_bPtr) += m * (-here->SOI3gbs + here->SOI3gBJTsb_bd - -(xnrm-xrev)*here->SOI3gmbs+ - xrev*here->SOI3gMmbs); - - *(here->SOI3B_gfPtr) += m * (-here->SOI3gMmf); - *(here->SOI3B_gbPtr) += m * (-here->SOI3gMmb); - *(here->SOI3B_dpPtr) += m * (-(here->SOI3gbd) + here->SOI3gBJTsb_bd + - xrev*(here->SOI3gMmf+here->SOI3gMmb+ - here->SOI3gMmbs+here->SOI3gMd) - - xnrm*here->SOI3gMd); - *(here->SOI3B_spPtr) += m * (-(here->SOI3gbs) + here->SOI3gBJTdb_bs + - xnrm*(here->SOI3gMmf+here->SOI3gMmb+ - here->SOI3gMmbs+here->SOI3gMd) - - xrev*here->SOI3gMd); - *(here->SOI3B_bPtr) += m * (here->SOI3gbd+here->SOI3gbs - - here->SOI3gMmbs - - here->SOI3gBJTdb_bs - here->SOI3gBJTsb_bd); - -/* if no thermal behaviour specified, then put in zero valued indpt. voltage source - between TOUT and ground */ - if (here->SOI3rt==0) - { - *(here->SOI3TOUT_ibrPtr) += m * 1.0; - *(here->SOI3IBR_toutPtr) += m * 1.0; - *(ckt->CKTrhs + (here->SOI3branch)) = 0; - } - else - { - *(here->SOI3TOUT_toutPtr) += m * (-(here->SOI3gPdT)+grt[0]); - if (here->SOI3numThermalNodes > 1) - { - *(here->SOI3TOUT_tout1Ptr) += m * (-grt[0]); - *(here->SOI3TOUT1_toutPtr) += m * (-grt[0]); - *(here->SOI3TOUT1_tout1Ptr) += m * (grt[0]+grt[1]); - } - if (here->SOI3numThermalNodes > 2) - { - *(here->SOI3TOUT1_tout2Ptr) += m * (-grt[1]); - *(here->SOI3TOUT2_tout1Ptr) += m * (-grt[1]); - *(here->SOI3TOUT2_tout2Ptr) += m * (grt[1]+grt[2]); - } - if (here->SOI3numThermalNodes > 3) - { - *(here->SOI3TOUT2_tout3Ptr) += m * (-grt[2]); - *(here->SOI3TOUT3_tout2Ptr) += m * (-grt[2]); - *(here->SOI3TOUT3_tout3Ptr) += m * (grt[2]+grt[3]); - } - if (here->SOI3numThermalNodes > 4) - { - *(here->SOI3TOUT3_tout4Ptr) += m * (-grt[3]); - *(here->SOI3TOUT4_tout3Ptr) += m * (-grt[3]); - *(here->SOI3TOUT4_tout4Ptr) += m * (grt[3]+grt[4]); - } - - *(here->SOI3TOUT_dpPtr) += m * (xnrm*(-(here->SOI3gPds*model->SOI3type)) - +xrev*(here->SOI3gPds+here->SOI3gPmf+ - here->SOI3gPmb+here->SOI3gPmbs)* - model->SOI3type); - *(here->SOI3TOUT_gfPtr) += m * (-(here->SOI3gPmf*model->SOI3type)); - *(here->SOI3TOUT_gbPtr) += m * (-(here->SOI3gPmb*model->SOI3type)); - *(here->SOI3TOUT_bPtr) += m * (-(here->SOI3gPmbs*model->SOI3type)); - *(here->SOI3TOUT_spPtr) += m * (xnrm*(here->SOI3gPds+here->SOI3gPmf+ - here->SOI3gPmb+here->SOI3gPmbs)*model->SOI3type - +xrev*(-(here->SOI3gPds*model->SOI3type))); - - *(here->SOI3DP_toutPtr) += m * (xnrm-xrev)*here->SOI3gt*model->SOI3type; - *(here->SOI3SP_toutPtr) += m * (xrev-xnrm)*here->SOI3gt*model->SOI3type; -/* need to mult by type in above as conductances will be used with exterior voltages - which will be -ve for PMOS except for gPdT */ -/* now for thermal influence on impact ionisation current and transient stuff */ - *(here->SOI3DP_toutPtr) += m * (xnrm*here->SOI3gMdeltaT - - here->SOI3gbdT + here->SOI3gBJTdb_deltaT)*model->SOI3type; - *(here->SOI3SP_toutPtr) += m * (xrev*here->SOI3gMdeltaT - - here->SOI3gbsT + here->SOI3gBJTsb_deltaT)*model->SOI3type; - *(here->SOI3B_toutPtr) -= m * (here->SOI3gMdeltaT - here->SOI3gbsT - - here->SOI3gbdT + here->SOI3gBJTdb_deltaT + - here->SOI3gBJTsb_deltaT)*model->SOI3type; - } - } - } - return(OK); -} diff --git a/src/spicelib/devices/soi3/soi3ask.c b/src/spicelib/devices/soi3/soi3ask.c deleted file mode 100644 index 70f931977..000000000 --- a/src/spicelib/devices/soi3/soi3ask.c +++ /dev/null @@ -1,600 +0,0 @@ -/********** -STAG version 2.7 -Copyright 2000 owned by the United Kingdom Secretary of State for Defence -acting through the Defence Evaluation and Research Agency. -Developed by : Jim Benson, - Department of Electronics and Computer Science, - University of Southampton, - United Kingdom. -With help from : Nele D'Halleweyn, Ketan Mistry, Bill Redman-White, and Craig Easson. - -Based on STAG version 2.1 -Developed by : Mike Lee, -With help from : Bernard Tenbroek, Bill Redman-White, Mike Uren, Chris Edwards - and John Bunyan. -Acknowledgements : Rupert Howes and Pete Mole. -**********/ - -/********** -Modified by Paolo Nenzi 2002 -ngspice integration -**********/ - -#include "ngspice/ngspice.h" -#include "ngspice/const.h" -#include "ngspice/ifsim.h" -#include "ngspice/cktdefs.h" -#include "ngspice/devdefs.h" -#include "soi3defs.h" -#include "ngspice/sperror.h" -#include "ngspice/suffix.h" - - -/*ARGSUSED*/ -int -SOI3ask(CKTcircuit *ckt, GENinstance *inst, int which, IFvalue *value, - IFvalue *select) -{ - SOI3instance *here = (SOI3instance*)inst; - - NG_IGNORE(select); - - /* The line below belong to the parts of the case statement that are also - * commented out */ -/* double vr; */ -/* double vi; */ -/* double sr; */ -/* double si; */ -/* double vm; */ -/* static char *msg = "Current and power not available for ac analysis"; */ - - switch(which) { - case SOI3_L: - value->rValue = here->SOI3l; - return(OK); - case SOI3_W: - value->rValue = here->SOI3w; - return(OK); - case SOI3_M: - value->rValue = here->SOI3m; - return(OK); - case SOI3_AS: - value->rValue = here->SOI3as; - return(OK); - case SOI3_AD: - value->rValue = here->SOI3ad; - return(OK); - case SOI3_AB: - value->rValue = here->SOI3ab; - return(OK); - case SOI3_NRS: - value->rValue = here->SOI3sourceSquares; - return(OK); - case SOI3_NRD: - value->rValue = here->SOI3drainSquares; - return(OK); - case SOI3_OFF: - value->rValue = here->SOI3off; - return(OK); - case SOI3_IC_VDS: - value->rValue = here->SOI3icVDS; - return(OK); - case SOI3_IC_VGFS: - value->rValue = here->SOI3icVGFS; - return(OK); - case SOI3_IC_VGBS: - value->rValue = here->SOI3icVGBS; - return(OK); - case SOI3_IC_VBS: - value->rValue = here->SOI3icVBS; - return(OK); - case SOI3_TEMP: - value->rValue = here->SOI3temp-CONSTCtoK; - return(OK); - case SOI3_RT: - value->rValue = here->SOI3rt; - value->rValue /= here->SOI3m; - return(OK); - case SOI3_CT: - value->rValue = here->SOI3ct; - value->rValue *= here->SOI3m; - return(OK); - case SOI3_DNODE: - value->iValue = here->SOI3dNode; - return(OK); - case SOI3_GFNODE: - value->iValue = here->SOI3gfNode; - return(OK); - case SOI3_SNODE: - value->iValue = here->SOI3sNode; - return(OK); - case SOI3_GBNODE: - value->iValue = here->SOI3gbNode; - return(OK); - case SOI3_BNODE: - value->iValue = here->SOI3bNode; - return(OK); - case SOI3_DNODEPRIME: - value->iValue = here->SOI3dNodePrime; - return(OK); - case SOI3_SNODEPRIME: - value->iValue = here->SOI3sNodePrime; - return(OK); - case SOI3_TNODE: - value->iValue = here->SOI3toutNode; - return(OK); - case SOI3_BRANCH: - value->iValue = here->SOI3branch; - return(OK); - case SOI3_SOURCECONDUCT: - value->rValue = here->SOI3sourceConductance; - value->rValue *= here->SOI3m; - return(OK); - case SOI3_DRAINCONDUCT: - value->rValue = here->SOI3drainConductance; - value->rValue *= here->SOI3m; - return(OK); - case SOI3_VON: - value->rValue = here->SOI3tVto; - return(OK); - case SOI3_VFBF: - value->rValue = here->SOI3tVfbF; - return(OK); - case SOI3_VDSAT: - value->rValue = here->SOI3vdsat; - return(OK); - case SOI3_SOURCEVCRIT: - value->rValue = here->SOI3sourceVcrit; - return(OK); - case SOI3_DRAINVCRIT: - value->rValue = here->SOI3drainVcrit; - return(OK); - case SOI3_ID: - value->rValue = here->SOI3id; - value->rValue *= here->SOI3m; - return(OK); - case SOI3_IBS: - value->rValue = here->SOI3ibs; - value->rValue *= here->SOI3m; - return(OK); - case SOI3_IBD: - value->rValue = here->SOI3ibd; - value->rValue *= here->SOI3m; - return(OK); - case SOI3_GMBS: - value->rValue = here->SOI3gmbs; - value->rValue *= here->SOI3m; - return(OK); - case SOI3_GMF: - value->rValue = here->SOI3gmf; - value->rValue *= here->SOI3m; - return(OK); - case SOI3_GMB: - value->rValue = here->SOI3gmb; - value->rValue *= here->SOI3m; - return(OK); - case SOI3_GDS: - value->rValue = here->SOI3gds; - value->rValue *= here->SOI3m; - return(OK); - case SOI3_GBD: - value->rValue = here->SOI3gbd; - value->rValue *= here->SOI3m; - return(OK); - case SOI3_GBS: - value->rValue = here->SOI3gbs; - value->rValue *= here->SOI3m; - return(OK); - case SOI3_CAPBD: - value->rValue = here->SOI3capbd; - value->rValue *= here->SOI3m; - return(OK); - case SOI3_CAPBS: - value->rValue = here->SOI3capbs; - value->rValue *= here->SOI3m; - return(OK); - case SOI3_CAPZEROBIASBD: - value->rValue = here->SOI3Cbd; - value->rValue *= here->SOI3m; - return(OK); - case SOI3_CAPZEROBIASBS: - value->rValue = here->SOI3Cbs; - value->rValue *= here->SOI3m; - return(OK); - case SOI3_VBD: - value->rValue = *(ckt->CKTstate0 + here->SOI3vbd); - return(OK); - case SOI3_VBS: - value->rValue = *(ckt->CKTstate0 + here->SOI3vbs); - return(OK); - case SOI3_VGFS: - value->rValue = *(ckt->CKTstate0 + here->SOI3vgfs); - return(OK); - case SOI3_VGBS: - value->rValue = *(ckt->CKTstate0 + here->SOI3vgbs); - return(OK); - case SOI3_VDS: - value->rValue = *(ckt->CKTstate0 + here->SOI3vds); - return(OK); - case SOI3_QGF: - value->rValue = *(ckt->CKTstate0 + here->SOI3qgf); - value->rValue *= here->SOI3m; - return(OK); - case SOI3_IQGF: - value->rValue = *(ckt->CKTstate0 + here->SOI3iqgf); - value->rValue *= here->SOI3m; - return(OK); - case SOI3_QD: - value->rValue = *(ckt->CKTstate0 + here->SOI3qd); - value->rValue *= here->SOI3m; - return(OK); - case SOI3_IQD: - value->rValue = *(ckt->CKTstate0 + here->SOI3iqd); - value->rValue *= here->SOI3m; - return(OK); - case SOI3_QS: - value->rValue = *(ckt->CKTstate0 + here->SOI3qs); - value->rValue *= here->SOI3m; - return(OK); - case SOI3_IQS: - value->rValue = *(ckt->CKTstate0 + here->SOI3iqs); - value->rValue *= here->SOI3m; - return(OK); - case SOI3_CGFGF: - value->rValue = *(ckt->CKTstate0 + here->SOI3cgfgf); - value->rValue *= here->SOI3m; - return (OK); - case SOI3_CGFD: - value->rValue = *(ckt->CKTstate0 + here->SOI3cgfd); - value->rValue *= here->SOI3m; - return (OK); - case SOI3_CGFS: - value->rValue = *(ckt->CKTstate0 + here->SOI3cgfs); - value->rValue *= here->SOI3m; - return (OK); - case SOI3_CGFDELTAT: - value->rValue = *(ckt->CKTstate0 + here->SOI3cgfdeltaT); - value->rValue *= here->SOI3m; - return (OK); - case SOI3_CGFGB: - value->rValue = *(ckt->CKTstate0 + here->SOI3cgfgb); - value->rValue *= here->SOI3m; - return (OK); - case SOI3_CDGF: - value->rValue = *(ckt->CKTstate0 + here->SOI3cdgf); - value->rValue *= here->SOI3m; - return (OK); - case SOI3_CDD: - value->rValue = *(ckt->CKTstate0 + here->SOI3cdd); - value->rValue *= here->SOI3m; - return (OK); - case SOI3_CDS: - value->rValue = *(ckt->CKTstate0 + here->SOI3cds); - value->rValue *= here->SOI3m; - return (OK); - case SOI3_CDDELTAT: - value->rValue = *(ckt->CKTstate0 + here->SOI3cddeltaT); - value->rValue *= here->SOI3m; - return (OK); - case SOI3_CDGB: - value->rValue = *(ckt->CKTstate0 + here->SOI3cdgb); - value->rValue *= here->SOI3m; - return (OK); - case SOI3_CSGF: - value->rValue = *(ckt->CKTstate0 + here->SOI3csgf); - value->rValue *= here->SOI3m; - return (OK); - case SOI3_CSD: - value->rValue = *(ckt->CKTstate0 + here->SOI3csd); - value->rValue *= here->SOI3m; - return (OK); - case SOI3_CSS: - value->rValue = *(ckt->CKTstate0 + here->SOI3css); - value->rValue *= here->SOI3m; - return (OK); - case SOI3_CSDELTAT: - value->rValue = *(ckt->CKTstate0 + here->SOI3csdeltaT); - value->rValue *= here->SOI3m; - return (OK); - case SOI3_CSGB: - value->rValue = *(ckt->CKTstate0 + here->SOI3csgb); - value->rValue *= here->SOI3m; - return (OK); - case SOI3_CGBGF: - value->rValue = *(ckt->CKTstate0 + here->SOI3cgbgf); - value->rValue *= here->SOI3m; - return (OK); - case SOI3_CGBD: - value->rValue = *(ckt->CKTstate0 + here->SOI3cgbd); - value->rValue *= here->SOI3m; - return (OK); - case SOI3_CGBS: - value->rValue = *(ckt->CKTstate0 + here->SOI3cgbs); - value->rValue *= here->SOI3m; - return (OK); - case SOI3_CGBDELTAT: - value->rValue = *(ckt->CKTstate0 + here->SOI3cgbdeltaT); - value->rValue *= here->SOI3m; - return (OK); - case SOI3_CGBGB: - value->rValue = *(ckt->CKTstate0 + here->SOI3cgbgb); - value->rValue *= here->SOI3m; - return (OK); - case SOI3_QBD: - value->rValue = *(ckt->CKTstate0 + here->SOI3qbd); - value->rValue *= here->SOI3m; - return(OK); - case SOI3_IQBD: - value->rValue = *(ckt->CKTstate0 + here->SOI3iqbd); - value->rValue *= here->SOI3m; - return(OK); - case SOI3_QBS: - value->rValue = *(ckt->CKTstate0 + here->SOI3qbs); - value->rValue *= here->SOI3m; - return(OK); - case SOI3_IQBS: - value->rValue = *(ckt->CKTstate0 + here->SOI3iqbs); - value->rValue *= here->SOI3m; - return(OK); -/* extra stuff for newer model - msll Jan96 */ - case SOI3_VFBB: - value->rValue = here->SOI3tVfbB; - return(OK); - case SOI3_RT1: - value->rValue = here->SOI3rt1; - value->rValue /= here->SOI3m; - return(OK); - case SOI3_CT1: - value->rValue = here->SOI3ct1; - value->rValue *= here->SOI3m; - return(OK); - case SOI3_RT2: - value->rValue = here->SOI3rt2; - value->rValue /= here->SOI3m; - return(OK); - case SOI3_CT2: - value->rValue = here->SOI3ct2; - value->rValue *= here->SOI3m; - return(OK); - case SOI3_RT3: - value->rValue = here->SOI3rt3; - value->rValue /= here->SOI3m; - return(OK); - case SOI3_CT3: - value->rValue = here->SOI3ct3; - value->rValue *= here->SOI3m; - return(OK); - case SOI3_RT4: - value->rValue = here->SOI3rt4; - value->rValue /= here->SOI3m; - return(OK); - case SOI3_CT4: - value->rValue = here->SOI3ct4; - value->rValue *= here->SOI3m; - return(OK); - -/* - case SOI3_L_SENS_DC: - if(ckt->CKTsenInfo && here->SOI3sens_l){ - value->rValue = *(ckt->CKTsenInfo->SEN_Sap[select->iValue + 1]+ - here->SOI3senParmNo); - } - return(OK); - case SOI3_L_SENS_REAL: - if(ckt->CKTsenInfo && here->SOI3sens_l){ - value->rValue = *(ckt->CKTsenInfo->SEN_RHS[select->iValue + 1]+ - here->SOI3senParmNo); - } - return(OK); - case SOI3_L_SENS_IMAG: - if(ckt->CKTsenInfo && here->SOI3sens_l){ - value->rValue = *(ckt->CKTsenInfo->SEN_iRHS[select->iValue + 1]+ - here->SOI3senParmNo); - } - return(OK); - case SOI3_L_SENS_MAG: - if(ckt->CKTsenInfo && here->SOI3sens_l){ - vr = *(ckt->CKTrhsOld + select->iValue + 1); - vi = *(ckt->CKTirhsOld + select->iValue + 1); - vm = sqrt(vr*vr + vi*vi); - if(vm == 0){ - value->rValue = 0; - return(OK); - } - sr = *(ckt->CKTsenInfo->SEN_RHS[select->iValue + 1]+ - here->SOI3senParmNo); - si = *(ckt->CKTsenInfo->SEN_iRHS[select->iValue + 1]+ - here->SOI3senParmNo); - value->rValue = (vr * sr + vi * si)/vm; - } - return(OK); - case SOI3_L_SENS_PH: - if(ckt->CKTsenInfo && here->SOI3sens_l){ - vr = *(ckt->CKTrhsOld + select->iValue + 1); - vi = *(ckt->CKTirhsOld + select->iValue + 1); - vm = vr*vr + vi*vi; - if(vm == 0){ - value->rValue = 0; - return(OK); - } - sr = *(ckt->CKTsenInfo->SEN_RHS[select->iValue + 1]+ - here->SOI3senParmNo); - si = *(ckt->CKTsenInfo->SEN_iRHS[select->iValue + 1]+ - here->SOI3senParmNo); - value->rValue = (vr * si - vi * sr)/vm; - } - return(OK); - case SOI3_L_SENS_CPLX: - if(ckt->CKTsenInfo && here->SOI3sens_l){ - value->cValue.real= - *(ckt->CKTsenInfo->SEN_RHS[select->iValue + 1]+ - here->SOI3senParmNo); - value->cValue.imag= - *(ckt->CKTsenInfo->SEN_iRHS[select->iValue + 1]+ - here->SOI3senParmNo); - } - return(OK); - case SOI3_W_SENS_DC: - if(ckt->CKTsenInfo && here->SOI3sens_w){ - value->rValue = *(ckt->CKTsenInfo->SEN_Sap[select->iValue + 1]+ - here->SOI3senParmNo + here->SOI3sens_l); - } - return(OK); - case SOI3_W_SENS_REAL: - if(ckt->CKTsenInfo && here->SOI3sens_w){ - value->rValue = *(ckt->CKTsenInfo->SEN_RHS[select->iValue + 1]+ - here->SOI3senParmNo + here->SOI3sens_l); - } - return(OK); - case SOI3_W_SENS_IMAG: - if(ckt->CKTsenInfo && here->SOI3sens_w){ - value->rValue = *(ckt->CKTsenInfo->SEN_iRHS[select->iValue + 1]+ - here->SOI3senParmNo + here->SOI3sens_l); - } - return(OK); - case SOI3_W_SENS_MAG: - if(ckt->CKTsenInfo && here->SOI3sens_w){ - vr = *(ckt->CKTrhsOld + select->iValue + 1); - vi = *(ckt->CKTirhsOld + select->iValue + 1); - vm = sqrt(vr*vr + vi*vi); - if(vm == 0){ - value->rValue = 0; - return(OK); - } - sr = *(ckt->CKTsenInfo->SEN_RHS[select->iValue + 1]+ - here->SOI3senParmNo + here->SOI3sens_l); - si = *(ckt->CKTsenInfo->SEN_iRHS[select->iValue + 1]+ - here->SOI3senParmNo + here->SOI3sens_l); - value->rValue = (vr * sr + vi * si)/vm; - } - return(OK); - case SOI3_W_SENS_PH: - if(ckt->CKTsenInfo && here->SOI3sens_w){ - vr = *(ckt->CKTrhsOld + select->iValue + 1); - vi = *(ckt->CKTirhsOld + select->iValue + 1); - vm = vr*vr + vi*vi; - if(vm == 0){ - value->rValue = 0; - return(OK); - } - sr = *(ckt->CKTsenInfo->SEN_RHS[select->iValue + 1]+ - here->SOI3senParmNo + here->SOI3sens_l); - si = *(ckt->CKTsenInfo->SEN_iRHS[select->iValue + 1]+ - here->SOI3senParmNo + here->SOI3sens_l); - value->rValue = (vr * si - vi * sr)/vm; - } - return(OK); - case SOI3_W_SENS_CPLX: - if(ckt->CKTsenInfo && here->SOI3sens_w){ - value->cValue.real= - *(ckt->CKTsenInfo->SEN_RHS[select->iValue + 1]+ - here->SOI3senParmNo + here->SOI3sens_l); - value->cValue.imag= - *(ckt->CKTsenInfo->SEN_iRHS[select->iValue + 1]+ - here->SOI3senParmNo + here->SOI3sens_l); - } - return(OK); */ - -/* - case SOI3_IS : - if (ckt->CKTcurrentAnalysis & DOING_AC) { - errMsg = TMALLOC(char, strlen(msg) + 1); - errRtn = "SOI3ask.c"; - strcpy(errMsg,msg); - return(E_ASKCURRENT); - } else { - value->rValue = -here->SOI3id; - value->rValue -= here->SOI3ibd + here->SOI3ibs - - *(ckt->CKTstate0 + here->SOI3iqgfb); - if ((ckt->CKTcurrentAnalysis & DOING_TRAN) && - !(ckt->CKTmode & MODETRANOP)) { - value->rValue -= *(ckt->CKTstate0 + here->SOI3iqgfb) + - *(ckt->CKTstate0 + here->SOI3iqgfd) + - *(ckt->CKTstate0 + here->SOI3iqgfs); - } - } - return(OK); - case SOI3_IB : - if (ckt->CKTcurrentAnalysis & DOING_AC) { - errMsg = TMALLOC(char, strlen(msg) + 1); - errRtn = "SOI3ask.c"; - strcpy(errMsg,msg); - return(E_ASKCURRENT); - } else { - value->rValue = here->SOI3ibd + here->SOI3ibs - - *(ckt->CKTstate0 + here->SOI3iqgfb); - } - return(OK); - case SOI3_IGF : - if (ckt->CKTcurrentAnalysis & DOING_AC) { - errMsg = TMALLOC(char, strlen(msg) + 1); - errRtn = "SOI3ask.c"; - strcpy(errMsg,msg); - return(E_ASKCURRENT); - } else if (ckt->CKTcurrentAnalysis & (DOING_DCOP | DOING_TRCV)) { - value->rValue = 0; - } else if ((ckt->CKTcurrentAnalysis & DOING_TRAN) && - (ckt->CKTmode & MODETRANOP)) { - value->rValue = 0; - } else { - value->rValue = *(ckt->CKTstate0 + here->SOI3iqgfb) + - *(ckt->CKTstate0 + here->SOI3iqgfd) + *(ckt->CKTstate0 + - here->SOI3iqgfs); - } - return(OK); - case SOI3_IGB : - if (ckt->CKTcurrentAnalysis & DOING_AC) { - errMsg = TMALLOC(char, strlen(msg) + 1); - errRtn = "SOI3ask.c"; - strcpy(errMsg,msg); - return(E_ASKCURRENT); - } else if (ckt->CKTcurrentAnalysis & (DOING_DCOP | DOING_TRCV)) { - value->rValue = 0; - } else if ((ckt->CKTcurrentAnalysis & DOING_TRAN) && - (ckt->CKTmode & MODETRANOP)) { - value->rValue = 0; - } else { - value->rValue = *(ckt->CKTstate0 + here->SOI3iqgfb) + - *(ckt->CKTstate0 + here->SOI3iqgfd) + *(ckt->CKTstate0 + - here->SOI3iqgfs); - } - return(OK); - case SOI3_POWER : - if (ckt->CKTcurrentAnalysis & DOING_AC) { - errMsg = TMALLOC(char, strlen(msg) + 1); - errRtn = "SOI3ask.c"; - strcpy(errMsg,msg); - return(E_ASKPOWER); - } else { - double temp; - - value->rValue = here->SOI3id * - *(ckt->CKTrhsOld + here->SOI3dNode); - value->rValue += ((here->SOI3ibd + here->SOI3ibs) - - *(ckt->CKTstate0 + here->SOI3iqgfb)) * - *(ckt->CKTrhsOld + here->SOI3bNode); - if ((ckt->CKTcurrentAnalysis & DOING_TRAN) && - !(ckt->CKTmode & MODETRANOP)) { - value->rValue += (*(ckt->CKTstate0 + here->SOI3iqgfb) + - *(ckt->CKTstate0 + here->SOI3iqgfd) + - *(ckt->CKTstate0 + here->SOI3iqgfs)) * - *(ckt->CKTrhsOld + here->SOI3gfNode); - } - temp = -here->SOI3id; - temp -= here->SOI3ibd + here->SOI3ibs ; - if ((ckt->CKTcurrentAnalysis & DOING_TRAN) && - !(ckt->CKTmode & MODETRANOP)) { - temp -= *(ckt->CKTstate0 + here->SOI3iqgfb) + - *(ckt->CKTstate0 + here->SOI3iqgfd) + - *(ckt->CKTstate0 + here->SOI3iqgfs); - } - value->rValue += temp * *(ckt->CKTrhsOld + here->SOI3sNode); - } - return(OK); -*/ - default: - return(E_BADPARM); - } - /* NOTREACHED */ -} - diff --git a/src/spicelib/devices/soi3/soi3cap.c b/src/spicelib/devices/soi3/soi3cap.c deleted file mode 100644 index 9daec56c8..000000000 --- a/src/spicelib/devices/soi3/soi3cap.c +++ /dev/null @@ -1,491 +0,0 @@ -/********** -STAG version 2.7 -Copyright 2000 owned by the United Kingdom Secretary of State for Defence -acting through the Defence Evaluation and Research Agency. -Developed by : Jim Benson, - Department of Electronics and Computer Science, - University of Southampton, - United Kingdom. -With help from : Nele D'Halleweyn, Ketan Mistry, Bill Redman-White, - and Craig Easson. - -Based on STAG version 2.1 -Developed by : Mike Lee, -With help from : Bernard Tenbroek, Bill Redman-White, Mike Uren, Chris Edwards - and John Bunyan. -Acknowledgements : Rupert Howes and Pete Mole. -**********/ - -/********** -Modified by Paolo Nenzi 2002 -ngspice integration -**********/ - -#include "ngspice/ngspice.h" -#include "ngspice/cktdefs.h" -#include "ngspice/suffix.h" -#include "soi3defs.h" -#include "ngspice/trandefs.h" -#include "ngspice/const.h" - - -void -SOI3cap(double vgB, double Phiplusvsb, double gammaB, - double paramargs[10], - double Bfargs[2], double alpha_args[5], double psi_st0args[5], - double vGTargs[5], - double psi_sLargs[5], double psi_s0args[5], - double ldargs[5], - double *Qg, double *Qb, double *Qd, double *QgB, - double *cgfgf, double *cgfd, double *cgfs, double *cgfdeltaT, - double *cgfgb, double *cbgf, double *cbd, double *cbs, - double *cbdeltaT, double *cbgb, double *cdgf, double *cdd, - double *cds, double *cddeltaT, double *cdgb, double *cgbgf, - double *cgbd, double *cgbs, double *cgbdeltaT, double *cgbgb - ) -/****** Part 1 - declare local variables. ******/ - -{ -double WCox,WCob,L; -double gamma,eta_s,vt,delta,sigma,chiFB; -double Bf,pDBf_Dpsi_st0; -double alpha,Dalpha_Dvgfb,Dalpha_Dvdb,Dalpha_Dvsb,Dalpha_DdeltaT; -double Dpsi_st0_Dvgfb,Dpsi_st0_Dvdb,Dpsi_st0_Dvsb,Dpsi_st0_DdeltaT; -double vGT,DvGT_Dvgfb,DvGT_Dvdb,DvGT_Dvsb,DvGT_DdeltaT; -double psi_sL,Dpsi_sL_Dvgfb,Dpsi_sL_Dvdb,Dpsi_sL_Dvsb,Dpsi_sL_DdeltaT; -double psi_s0,Dpsi_s0_Dvgfb,Dpsi_s0_Dvdb,Dpsi_s0_Dvsb,Dpsi_s0_DdeltaT; -double ld,Dld_Dvgfb,Dld_Dvdb,Dld_Dvsb,Dld_DdeltaT; - -double Lprime,Fc; -double Qbprime,Qcprime,Qdprime,Qgprime,Qb2prime,Qc2prime,Qd2prime,Qg2prime; -double Dlimc,Dlimd; -double Vqd,Vqs; -double F,F2; -double cq,dq; -double dercq,derdq; -double sigmaC,Eqc,Eqd; -double DVqs_Dvgfb,DVqs_Dvdb,DVqs_Dvsb,DVqs_DdeltaT; -double DF_Dvgfb,DF_Dvdb,DF_Dvsb,DF_DdeltaT; -double ccgf,ccd,ccs,ccdeltaT,ccgb; - - -double vg,vgacc,Egacc,tmpacc,Qacc; -double csf; - -NG_IGNORE(gammaB); -NG_IGNORE(Phiplusvsb); -NG_IGNORE(vgB); - -/****** Part 2 - extract variables passed from soi3load(), which ******/ -/****** have been passed to soi3cap() in *arg arrays. ******/ - -WCox = paramargs[0]; -L = paramargs[1]; -gamma = paramargs[2]; -eta_s = paramargs[3]; -vt = paramargs[4]; -delta = paramargs[5]; -WCob = paramargs[6]; -sigma = paramargs[7]; -chiFB = paramargs[8]; -csf = paramargs[9]; -Bf = Bfargs[0]; -pDBf_Dpsi_st0 = Bfargs[1]; -alpha = alpha_args[0]; -Dalpha_Dvgfb = alpha_args[1]; -Dalpha_Dvdb = alpha_args[2]; -Dalpha_Dvsb = alpha_args[3]; -Dalpha_DdeltaT = alpha_args[4]; - -Dpsi_st0_Dvgfb = psi_st0args[1]; -Dpsi_st0_Dvdb = psi_st0args[2]; -Dpsi_st0_Dvsb = psi_st0args[3]; -Dpsi_st0_DdeltaT = psi_st0args[4]; - -vGT = vGTargs[0]; -DvGT_Dvgfb = vGTargs[1]; -DvGT_Dvdb = vGTargs[2]; -DvGT_Dvsb = vGTargs[3]; -DvGT_DdeltaT = vGTargs[4]; - -psi_sL = psi_sLargs[0]; -Dpsi_sL_Dvgfb = psi_sLargs[1]; -Dpsi_sL_Dvdb = psi_sLargs[2]; -Dpsi_sL_Dvsb = psi_sLargs[3]; -Dpsi_sL_DdeltaT = psi_sLargs[4]; -psi_s0 = psi_s0args[0]; -Dpsi_s0_Dvgfb = psi_s0args[1]; -Dpsi_s0_Dvdb = psi_s0args[2]; -Dpsi_s0_Dvsb = psi_s0args[3]; -Dpsi_s0_DdeltaT = psi_s0args[4]; -ld = ldargs[0]; -Dld_Dvgfb = ldargs[1]; -Dld_Dvdb = ldargs[2]; -Dld_Dvsb = ldargs[3]; -Dld_DdeltaT = ldargs[4]; - - -/****** Part 3 - define some important quantities. ******/ - -sigmaC = 1E-8; - -Vqd = (vGT - alpha*psi_sL); /* This is -qd/Cof */ -Vqs = (vGT - alpha*psi_s0); /* This is -qs/Cof */ -if (Vqs<=0) -{ /* deep subthreshold contingency */ - F = 1; -} else -{ - F = Vqd/Vqs; - if (F<0) - { /* physically impossible situation */ - F=0; - } -} -F2 = F*F; - -Fc = 1 + ld/L; -Lprime = L/Fc; - - -/****** Part 4 - calculate normalised (see note below) terminal ******/ -/****** charge expressions for the GCA region. ******/ - -/* JimB - important note */ -/* The charge expressions Qcprime, Qd2prime etc in this file are not charges */ -/* but voltages! Each expression is equal to the derived expression for the */ -/* total charge in each region, but divided by a factor WL'Cof. This is */ -/* compensated for later on. */ - -/* Channel charge Qc1 */ -cq = (F*F + F + 1)/(F+1); -Qcprime = -2*Vqs*cq/3; - -if ((-Qcprime/sigmaC) MAX_EXP_ARG) { - vgacc = vg; - tmpacc = 1; -} else { - Egacc = exp(-vg/vt); - vgacc = -vt*log(1+Egacc); - tmpacc = Egacc/(1+Egacc); -} -Qacc = -WCox*L*vgacc; - -/* Now work out GCA region charges */ - -*Qb = WCox*Lprime*Qbprime + Qacc; - -*Qd = WCox*Lprime*Qdprime; - -*Qg = WCox*Lprime*Qgprime - Qacc; - - -/****** Part 7 - calculate normalised (see note below) terminal ******/ -/****** charge expressions for the saturated drain region. ******/ - -Qc2prime = -Vqd; - -/* Basic expression for the intrinsic body charge in the saturation region is */ -/* modified by csf, to reflect the fact that the body charge will be shared */ -/* between the gate and the drain/body depletion region. This factor must be */ -/* between 0 and 1, since it represents the fraction of ld over which qb is */ -/* integrated to give Qb2. */ -Qb2prime = -gamma*csf*(Bf + delta*psi_sL); - -Qd2prime = 0.5*Qc2prime; -/* JimB - 9/1/99. Re-partition drain region charge */ -/* Qd2prime = Qc2prime; */ - -Qg2prime = -Qc2prime-Qb2prime; - -*Qb += WCox*ld*Qb2prime; -*Qd += WCox*ld*Qd2prime; -*Qg += WCox*ld*Qg2prime; - - -/****** Part 8 - calculate full capacitance expressions, accounting ******/ -/****** for both GCA and drain region contributions. As explained ******/ -/****** in part 5, *cbgf, *cbd etc only derivatives of GCA charge ******/ -/****** expression w.r.t. Vx. Now need to include Lprime/ld ******/ -/****** dependence on Vx as well. ******/ - -*cbgf = WCox*(Lprime*(*cbgf) - ld*csf*(pDBf_Dpsi_st0*Dpsi_st0_Dvgfb + delta*Dpsi_sL_Dvgfb + - (psi_sL*Dalpha_Dvgfb/gamma)) + - (Qb2prime - Qbprime/(Fc*Fc))*Dld_Dvgfb - ); -*cbd = WCox*(Lprime*(*cbd) - ld*csf*(pDBf_Dpsi_st0*Dpsi_st0_Dvdb + delta*Dpsi_sL_Dvdb + - (psi_sL*Dalpha_Dvdb/gamma)) + - (Qb2prime - Qbprime/(Fc*Fc))*Dld_Dvdb - ); -*cbs = WCox*(Lprime*(*cbs) - ld*csf*(pDBf_Dpsi_st0*Dpsi_st0_Dvsb + delta*Dpsi_sL_Dvsb + - (psi_sL*Dalpha_Dvsb/gamma)) + - (Qb2prime - Qbprime/(Fc*Fc))*Dld_Dvsb - ); -*cbdeltaT = WCox*(Lprime*(*cbdeltaT) - ld*csf*(pDBf_Dpsi_st0*Dpsi_st0_DdeltaT + delta*Dpsi_sL_DdeltaT + - (psi_sL*Dalpha_DdeltaT/gamma)) + - (Qb2prime - Qbprime/(Fc*Fc))*Dld_DdeltaT - ); -*cbgb = 0; - - -ccgf = WCox*(Lprime*(ccgf) - ld*(DvGT_Dvgfb - alpha*Dpsi_sL_Dvgfb - psi_sL*Dalpha_Dvgfb) + - (Qc2prime - Qcprime/(Fc*Fc))*Dld_Dvgfb - ); -ccd = WCox*(Lprime*(ccd) - ld*(DvGT_Dvdb - alpha*Dpsi_sL_Dvdb - psi_sL*Dalpha_Dvdb) + - (Qc2prime - Qcprime/(Fc*Fc))*Dld_Dvdb - ); -ccs = WCox*(Lprime*(ccs) - ld*(DvGT_Dvsb - alpha*Dpsi_sL_Dvsb - psi_sL*Dalpha_Dvsb) + - (Qc2prime - Qcprime/(Fc*Fc))*Dld_Dvsb - ); -ccdeltaT = WCox*(Lprime*(ccdeltaT) - - ld*(DvGT_DdeltaT - alpha*Dpsi_sL_DdeltaT - psi_sL*Dalpha_DdeltaT) + - (Qc2prime - Qcprime/(Fc*Fc))*Dld_DdeltaT - ); -ccgb = 0; - - -*cdgf = WCox*(Lprime*(*cdgf) - 0.5*ld*(DvGT_Dvgfb - alpha*Dpsi_sL_Dvgfb - psi_sL*Dalpha_Dvgfb) + - (Qd2prime - Qdprime/(Fc*Fc))*Dld_Dvgfb - ); -*cdd = WCox*(Lprime*(*cdd) - 0.5*ld*(DvGT_Dvdb - alpha*Dpsi_sL_Dvdb - psi_sL*Dalpha_Dvdb) + - (Qd2prime - Qdprime/(Fc*Fc))*Dld_Dvdb - ); -*cds = WCox*(Lprime*(*cds) - 0.5*ld*(DvGT_Dvsb - alpha*Dpsi_sL_Dvsb - psi_sL*Dalpha_Dvsb) + - (Qd2prime - Qdprime/(Fc*Fc))*Dld_Dvsb - ); -*cddeltaT = WCox*(Lprime*(*cddeltaT) - 0.5*ld*(DvGT_DdeltaT - - alpha*Dpsi_sL_DdeltaT - psi_sL*Dalpha_DdeltaT) + - (Qd2prime - Qdprime/(Fc*Fc))*Dld_DdeltaT - ); -*cdgb = 0; - -/****** Part 9 - Finally, include accumulation charge derivatives. ******/ - -/* Now include accumulation charge derivs */ - -*cbgf += -WCox*L*tmpacc; -*cbd += -WCox*L*tmpacc*sigma; -*cbs += -WCox*L*tmpacc*(-sigma); -*cbdeltaT += -WCox*L*tmpacc*chiFB; -*cbgb += 0; - -*cgfgf = -(ccgf + *cbgf); -*cgfd = -(ccd + *cbd); -*cgfs = -(ccs + *cbs); -*cgfdeltaT = -(ccdeltaT + *cbdeltaT); -*cgfgb = 0; - -/****** Part 10 - Back gate stuff - doesn't work, so set to zero. ******/ - -/* Should move this before the accumulation section for consistency, but */ -/* doesn't matter, as all intrinsic back-gate capacitances set to zero -anyway. */ - -*QgB = 0; - -*cgbgf = 0; -*cgbd = 0; -*cgbs = 0; -*cgbgb = 0; -*cgbdeltaT = 0; - -} - -void -SOI3capEval(CKTcircuit *ckt, - double Frontcapargs[6], - double Backcapargs[6], - double cgfgf, double cgfd, double cgfs, double cgfdeltaT, double cgfgb, - double cdgf, double cdd, double cds, double cddeltaT, double cdgb, - double csgf, double csd, double css, double csdeltaT, double csgb, - double cbgf, double cbd, double cbs, double cbdeltaT, double cbgb, - double cgbgf, double cgbd, double cgbs, double cgbdeltaT, double cgbgb, - - double *gcgfgf, double *gcgfd, double *gcgfs, double *gcgfdeltaT, double *gcgfgb, - double *gcdgf, double *gcdd, double *gcds, double *gcddeltaT, double *gcdgb, - double *gcsgf, double *gcsd, double *gcss, double *gcsdeltaT, double *gcsgb, - double *gcbgf, double *gcbd, double *gcbs, double *gcbdeltaT, double *gcbgb, - double *gcgbgf, double *gcgbd, double *gcgbs, double *gcgbdeltaT, double *gcgbgb, - double *qgatef, double *qbody, double *qdrn, double *qsrc, double *qgateb) - -{ -double cgfd0,cgfs0,cgfb0; -double cgbd0,cgbs0,cgbb0; -double vgfd,vgfs,vgfb; -double vgbd,vgbs,vgbb; -double ag0; -double qgfd,qgfs,qgfb; -double qgbd,qgbs,qgbb; - -cgfd0 = Frontcapargs[0]; -cgfs0 = Frontcapargs[1]; -cgfb0 = Frontcapargs[2]; -vgfd = Frontcapargs[3]; -vgfs = Frontcapargs[4]; -vgfb = Frontcapargs[5]; - -cgbd0 = Backcapargs[0]; -cgbs0 = Backcapargs[1]; -cgbb0 = Backcapargs[2]; -vgbd = Backcapargs[3]; -vgbs = Backcapargs[4]; -vgbb = Backcapargs[5]; - -/* stuff below includes overlap caps' conductances */ -ag0 = ckt->CKTag[0]; - -*gcgfgf = (cgfgf + cgfd0 + cgfs0 + cgfb0) * ag0; -*gcgfd = (cgfd - cgfd0) * ag0; -*gcgfs = (cgfs - cgfs0) * ag0; -*gcgfdeltaT = cgfdeltaT * ag0; -*gcgfgb = cgfgb * ag0; - -*gcdgf = (cdgf - cgfd0) * ag0; -*gcdd = (cdd + cgfd0 + cgbd0) * ag0; -*gcds = cds * ag0; -*gcddeltaT = cddeltaT * ag0; -*gcdgb = (cdgb - cgbd0) * ag0; - -*gcsgf = (csgf - cgfs0) * ag0; -*gcsd = csd * ag0; -*gcss = (css + cgfs0 + cgbs0) * ag0; -*gcsdeltaT = csdeltaT * ag0; -*gcsgb = (csgb - cgbs0) * ag0; - -*gcbgf = (cbgf - cgfb0) * ag0; -*gcbd = cbd * ag0; -*gcbs = cbs * ag0; -*gcbdeltaT = cbdeltaT * ag0; -*gcbgb = (cbgb - cgbb0) * ag0; - -*gcgbgf = cgbgf * ag0; -*gcgbd = (cgbd - cgbd0) * ag0; -*gcgbs = (cgbs - cgbs0) * ag0; -*gcgbdeltaT = cgbdeltaT * ag0; -*gcgbgb = (cgbgb + cgbd0 + cgbs0 + cgbb0) * ag0; - -qgfd = cgfd0 * vgfd; -qgfs = cgfs0 * vgfs; -qgfb = cgfb0 * vgfb; - -qgbd = cgbd0 * vgbd; -qgbs = cgbs0 * vgbs; -qgbb = cgbb0 * vgbb; - -*qgatef = *qgatef + qgfd + qgfs + qgfb; -*qbody = *qbody - qgfb - qgbb; -*qdrn = *qdrn - qgfd - qgbd; -*qgateb = *qgateb + qgbd + qgbs + qgbb; -*qsrc = -(*qgatef + *qbody + *qdrn + *qgateb); -} diff --git a/src/spicelib/devices/soi3/soi3conv.c b/src/spicelib/devices/soi3/soi3conv.c deleted file mode 100644 index 88fa9cbdc..000000000 --- a/src/spicelib/devices/soi3/soi3conv.c +++ /dev/null @@ -1,222 +0,0 @@ -/********** -STAG version 2.7 -Copyright 2000 owned by the United Kingdom Secretary of State for Defence -acting through the Defence Evaluation and Research Agency. -Developed by : Jim Benson, - Department of Electronics and Computer Science, - University of Southampton, - United Kingdom. -With help from : Nele D'Halleweyn, Ketan Mistry, Bill Redman-White, and Craig Easson. - -Based on STAG version 2.1 -Developed by : Mike Lee, -With help from : Bernard Tenbroek, Bill Redman-White, Mike Uren, Chris Edwards - and John Bunyan. -Acknowledgements : Rupert Howes and Pete Mole. -**********/ - -/********** -Modified by Paolo Nenzi 2002 -ngspice integration -**********/ - -#include "ngspice/ngspice.h" -#include "ngspice/cktdefs.h" -#include "soi3defs.h" -#include "ngspice/sperror.h" -#include "ngspice/suffix.h" - - -int -SOI3convTest(GENmodel *inModel, CKTcircuit *ckt) -{ - SOI3model *model = (SOI3model*)inModel; - SOI3instance *here; - double delvbs; - double delvbd; - double delvgfs; - double delvgbs; - double delvds; - double delvgfd; - double delvgbd; - double deldeltaT; - double ibhat; - double idhat; - double iPthat; - double vbs; - double vbd; - double vgfs; - double vgbs; - double vds; - double deltaT; - double vgfd; - double vgbd; - double vgfdo; - double vgbdo; - double tol; - /* debug stuff */ - /* FILE *fp,*fopen(); */ - - for( ; model != NULL; model = SOI3nextModel(model)) { - for(here = SOI3instances(model); here!= NULL; - here = SOI3nextInstance(here)) { - - vbs = model->SOI3type * ( - *(ckt->CKTrhs+here->SOI3bNode) - - *(ckt->CKTrhs+here->SOI3sNodePrime)); - vgfs = model->SOI3type * ( - *(ckt->CKTrhs+here->SOI3gfNode) - - *(ckt->CKTrhs+here->SOI3sNodePrime)); - vgbs = model->SOI3type * ( - *(ckt->CKTrhs+here->SOI3gbNode) - - *(ckt->CKTrhs+here->SOI3sNodePrime)); - vds = model->SOI3type * ( - *(ckt->CKTrhs+here->SOI3dNodePrime) - - *(ckt->CKTrhs+here->SOI3sNodePrime)); - deltaT = MAX(0,*(ckt->CKTrhs+here->SOI3toutNode)); - /* voltage deltaT is V(tout) wrt thermal ground */ - vbd=vbs-vds; - vgfd=vgfs-vds; - vgbd=vgbs-vds; - vgfdo = *(ckt->CKTstate0 + here->SOI3vgfs) - - *(ckt->CKTstate0 + here->SOI3vds); - vgbdo = *(ckt->CKTstate0 + here->SOI3vgbs) - - *(ckt->CKTstate0 + here->SOI3vds); - delvbs = vbs - *(ckt->CKTstate0 + here->SOI3vbs); - delvbd = vbd - *(ckt->CKTstate0 + here->SOI3vbd); - delvgfs = vgfs - *(ckt->CKTstate0 + here->SOI3vgfs); - delvgbs = vgbs - *(ckt->CKTstate0 + here->SOI3vgbs); - delvds = vds - *(ckt->CKTstate0 + here->SOI3vds); - delvgfd = vgfd-vgfdo; - delvgbd = vgbd-vgbdo; - deldeltaT = deltaT - *(ckt->CKTstate0 + here->SOI3deltaT); - - /* these are needed for convergence testing */ - - if (here->SOI3mode >= 0) { /* normal */ - idhat= - here->SOI3id- - here->SOI3gbd * delvbd - - here->SOI3gbdT * deldeltaT + /* for -ibd bit of id */ - (here->SOI3gmbs + - here->SOI3gMmbs) * delvbs + - (here->SOI3gmf + - here->SOI3gMmf) * delvgfs + - (here->SOI3gmb + - here->SOI3gMmb) * delvgbs + - (here->SOI3gds + - here->SOI3gMd) * delvds + - (here->SOI3gt + - here->SOI3gMdeltaT) * deldeltaT + - here->SOI3gBJTdb_bs * delvbs + - here->SOI3gBJTdb_deltaT * deldeltaT; - ibhat= - here->SOI3ibs + - here->SOI3ibd + - here->SOI3gbd * delvbd + - here->SOI3gbdT * deldeltaT + - here->SOI3gbs * delvbs + - here->SOI3gbsT * deldeltaT - - here->SOI3iMdb - - here->SOI3gMmbs * delvbs - - (here->SOI3gMmf)* delvgfs - - (here->SOI3gMmb)* delvgbs - - here->SOI3gMd * delvds - - here->SOI3gMdeltaT * deldeltaT - - here->SOI3iBJTsb - - here->SOI3gBJTsb_bd * delvbd - - here->SOI3gBJTsb_deltaT * deldeltaT - - here->SOI3iBJTdb - - here->SOI3gBJTdb_bs * delvbs - - here->SOI3gBJTdb_deltaT * deldeltaT; - } else { /* A over T */ - idhat= - here->SOI3id - - ( here->SOI3gbd + - here->SOI3gmbs) * delvbd - - (here->SOI3gmf) * delvgfd - - (here->SOI3gmb) * delvgbd + - (here->SOI3gds) * delvds - - (here->SOI3gt + - here->SOI3gbdT) * deldeltaT + - here->SOI3gBJTdb_bs * delvbs + - here->SOI3gBJTdb_deltaT * deldeltaT; - ibhat= - here->SOI3ibs + - here->SOI3ibd + - here->SOI3gbd * delvbd + - here->SOI3gbdT * deldeltaT + - here->SOI3gbs * delvbs + - here->SOI3gbsT * deldeltaT - - here->SOI3iMsb - - here->SOI3gMmbs * delvbd - - here->SOI3gMmf * delvgfd - - here->SOI3gMmb * delvgbd + - here->SOI3gMd * delvds - /* gMd should go with vsd */ - here->SOI3gMdeltaT * deldeltaT - - here->SOI3iBJTsb - - here->SOI3gBJTsb_bd * delvbd - - here->SOI3gBJTsb_deltaT * deldeltaT - - here->SOI3iBJTdb - - here->SOI3gBJTdb_bs * delvbs - - here->SOI3gBJTdb_deltaT * deldeltaT; - } - iPthat = - here->SOI3iPt + - here->SOI3gPmbs * delvbs + - here->SOI3gPmf * delvgfs + - here->SOI3gPmb * delvgbs + - here->SOI3gPds * delvds * here->SOI3mode + - here->SOI3gPdT * deldeltaT; - /* - * check convergence - */ - tol=ckt->CKTreltol*MAX(fabs(idhat),fabs(here->SOI3id))+ - ckt->CKTabstol; - if (fabs(idhat-here->SOI3id) >= tol) { - ckt->CKTnoncon++; - - /* JimB - Remove line containing ckt->CKTtroubleElt for the */ - /* Simetrix DLL version - element removed from ckt structure */ - ckt->CKTtroubleElt = (GENinstance *) here; - - return(OK); /* no reason to continue, we haven't converged */ - } else { - tol=ckt->CKTreltol* - MAX(fabs(ibhat),fabs(here->SOI3ibs+here->SOI3ibd - - here->SOI3iMdb - here->SOI3iMsb - - here->SOI3iBJTdb - here->SOI3iBJTsb))+ - ckt->CKTabstol; - if (fabs(ibhat-(here->SOI3ibs+here->SOI3ibd - - here->SOI3iMdb - here->SOI3iMsb - - here->SOI3iBJTdb - here->SOI3iBJTsb)) > tol) { - ckt->CKTnoncon++; - - /* JimB - Remove line containing ckt->CKTtroubleElt for the */ - /* Simetrix DLL version - element removed from ckt structure */ - ckt->CKTtroubleElt = (GENinstance *) here; - return(OK); /* no reason to continue,we haven't converged*/ - } else { - tol=ckt->CKTreltol*MAX(fabs(iPthat), - fabs(here->SOI3iPt))+ckt->CKTabstol; - if (fabs(iPthat-here->SOI3iPt) >= tol) { - ckt->CKTnoncon++; - - /* JimB - Remove line containing ckt->CKTtroubleElt for the */ - /* Simetrix DLL version - element removed from ckt structure */ - ckt->CKTtroubleElt = (GENinstance *) here; - return(OK); /* no reason to continue,we haven't converged*/ - } - } - } -/* debug stuff */ -/* fp=fopen("level3.dat","a"); - fprintf(fp,"%2.3f %2.3f %.15e %.15e %.15e %.15e %.15e %.15e %.15e\n", - vgfs-vbs,vds,ckt->CKTtime,here->SOI3debug1,here->SOI3debug2,here->SOI3debug3, - here->SOI3debug4,here->SOI3debug5,here->SOI3debug6); - fclose(fp); -*/ - } - } - return(OK); -} diff --git a/src/spicelib/devices/soi3/soi3defs.h b/src/spicelib/devices/soi3/soi3defs.h deleted file mode 100644 index c0cd9c1fc..000000000 --- a/src/spicelib/devices/soi3/soi3defs.h +++ /dev/null @@ -1,869 +0,0 @@ -/********** -STAG version 2.7 -Copyright 2000 owned by the United Kingdom Secretary of State for Defence -acting through the Defence Evaluation and Research Agency. -Developed by : Jim Benson, - Department of Electronics and Computer Science, - University of Southampton, - United Kingdom. -With help from : Nele D'Halleweyn, Ketan Mistry, Bill Redman-White, - and Craig Easson. - -Based on STAG version 2.1 -Developed by : Mike Lee, -With help from : Bernard Tenbroek, Bill Redman-White, Mike Uren, Chris Edwards - and John Bunyan. -Acknowledgements : Rupert Howes and Pete Mole. -**********/ - -/********** -Modified by Paolo Nenzi 2002 -ngspice integration -**********/ - -#ifndef SOI3 -#define SOI3 - -#include "ngspice/ifsim.h" -#include "ngspice/cktdefs.h" -#include "ngspice/gendefs.h" -#include "ngspice/complex.h" -#include "ngspice/noisedef.h" - - -/* declarations for SOI3 MOSFETs */ - -/* indices to the array of SOI(3) noise sources */ - -enum { - SOI3RDNOIZ = 0, - SOI3RSNOIZ, - SOI3IDNOIZ, - SOI3FLNOIZ, - SOI3TOTNOIZ, - /* finally, the number of noise sources */ - SOI3NSRCS -}; - -/* information needed for each instance */ - -typedef struct sSOI3instance { - - struct GENinstance gen; - -#define SOI3modPtr(inst) ((struct sSOI3model *)((inst)->gen.GENmodPtr)) -#define SOI3nextInstance(inst) ((struct sSOI3instance *)((inst)->gen.GENnextInstance)) -#define SOI3name gen.GENname -#define SOI3states gen.GENstate - - const int SOI3dNode; /* number of the drain node of the mosfet */ - const int SOI3gfNode; /* number of the front gate node of the mosfet */ - const int SOI3sNode; /* number of the source node of the mosfet */ - const int SOI3gbNode; /* number of the back gate node of the mosfet */ - const int SOI3bNode; /* number of the bulk node of the mosfet */ - const int SOI3toutNode; /* number of thermal output node (tout) */ - - int SOI3branch; /* branch number for zero voltage source if no thermal */ - - int SOI3dNodePrime; /* number of the internal drain node of the mosfet */ - int SOI3sNodePrime; /* number of the internal source node of the mosfet */ - - - int SOI3tout1Node; /* first internal thermal node */ - int SOI3tout2Node; /* second internal thermal node */ - int SOI3tout3Node; /* third internal thermal node */ - int SOI3tout4Node; /* fourth internal thermal node */ - - double SOI3l; /* the length of the channel region */ - double SOI3w; /* the width of the channel region */ - double SOI3m; /* the parallel multiplier parameter */ - - double SOI3as; /* Area of source region */ - double SOI3ad; /* Area of drain region */ - double SOI3ab; /* Area of body region */ - - double SOI3drainSquares; /* the length of the drain in squares */ - double SOI3sourceSquares; /* the length of the source in squares */ - - double SOI3sourceConductance; /*conductance of source(or 0):set in setup*/ - double SOI3drainConductance; /*conductance of drain(or 0):set in setup*/ - double SOI3temp; /* operating temperature of this instance */ - double SOI3rt; /* Thermal resistance */ - double SOI3ct; /* Thermal capacitance */ - double SOI3rt1; /* 1st internal Thermal resistance */ - double SOI3ct1; /* 1st internal Thermal capacitance */ - double SOI3rt2; /* 2nd internal Thermal resistance */ - double SOI3ct2; /* 2nd internal Thermal capacitance */ - double SOI3rt3; /* 3rd internal Thermal resistance */ - double SOI3ct3; /* 3rd internal Thermal capacitance */ - double SOI3rt4; /* 4th internal Thermal resistance */ - double SOI3ct4; /* 4th internal Thermal capacitance */ - - double SOI3tTransconductance; /* temperature corrected transconductance (KP param) */ - double SOI3ueff; /* passed on to noise model */ - double SOI3tSurfMob; /* temperature corrected surface mobility */ - double SOI3tPhi; /* temperature corrected Phi */ - double SOI3tVto; /* temperature corrected Vto */ - double SOI3tVfbF; /* temperature corrected Vfb */ - double SOI3tVfbB; /* temperature corrected Vfb (back gate) */ - double SOI3tSatCur; /* temperature corrected jnct saturation Cur. */ - double SOI3tSatCur1; /* temperature corrected jnct saturation Cur. */ - double SOI3tSatCurDens; /* temperature corrected jnct saturation Cur. density */ - double SOI3tSatCurDens1; /* temperature corrected jnct saturation Cur. density */ - double SOI3tCbd; /* temperature corrected B-D Capacitance */ - double SOI3tCbs; /* temperature corrected B-S Capacitance */ - double SOI3tCjsw; /* temperature corrected Bulk side Capacitance */ - double SOI3tBulkPot; /* temperature corrected Bulk potential */ - double SOI3tDepCap; /* temperature adjusted transition point in */ - /* the curve matching Fc * Vj */ - double SOI3tVbi; /* temperature adjusted Vbi diode built-in voltage */ - - double SOI3icVBS; /* initial condition B-S voltage */ - double SOI3icVDS; /* initial condition D-S voltage */ - double SOI3icVGFS; /* initial condition GF-S voltage */ - double SOI3icVGBS; /* initial condition GB-S voltage */ - double SOI3von; - double SOI3vdsat; - double SOI3sourceVcrit; /* Vcrit for pos. vds */ - double SOI3drainVcrit; /* Vcrit for pos. vds */ - double SOI3id; /* DC drain current */ - double SOI3ibs; /* bulk source current */ - double SOI3ibd; /* bulk drain current */ - double SOI3iMdb; /* drain bulk impact ionisation current */ - double SOI3iMsb; /* source bulk impact ionisation cur. (rev mode) */ - double SOI3iPt; /* heat 'current' in thermal circuit */ - double SOI3gmbs; - double SOI3gmf; - double SOI3gmb; - double SOI3gds; - double SOI3gt; /* change of channel current wrt deltaT */ - double SOI3gdsnotherm; /* gds0 at elevated temp - ac use only) */ - double SOI3gMmbs; - double SOI3gMmf; - double SOI3gMmb; - double SOI3gMd; - double SOI3gMdeltaT; - double SOI3iBJTdb; - double SOI3gBJTdb_bs; - double SOI3gBJTdb_deltaT; - double SOI3iBJTsb; - double SOI3gBJTsb_bd; - double SOI3gBJTsb_deltaT; - double SOI3gPmf; /* change of Pt wrt vgfs */ - double SOI3gPmb; /* change of Pt wrt vgbs */ - double SOI3gPmbs; /* change of Pt wrt vbs */ - double SOI3gPds; /* change of Pt wrt vds */ - double SOI3gPdT; /* change of Pt wrt deltaT */ - double SOI3gbd; /* for body drain current */ - double SOI3gbdT; /* for body drain current */ - double SOI3gbs; /* for body source current */ - double SOI3gbsT; /* for body source current */ - double SOI3capbd; - double SOI3capbs; - double SOI3Cbd; - double SOI3Cbs; - double SOI3f2d; - double SOI3f3d; - double SOI3f4d; - double SOI3f2s; - double SOI3f3s; - double SOI3f4s; - double SOI3dDT_dVds; /* sm-sig gT term */ - double SOI3dId_dDT; /* sm-sig source term */ -/*debug stuff*/ - double SOI3debug1; - double SOI3debug2; - double SOI3debug3; - double SOI3debug4; - double SOI3debug5; - double SOI3debug6; -/* extra stuff for newer model - msll Jan96 */ - -/* - * naming convention: - * x = vgs - * y = vbs - * z = vds - * cdr = cdrain - */ - int SOI3mode; /* device mode : 1 = normal, -1 = inverse */ - int SOI3backstate; /* indicates charge condition of back surface */ - int SOI3numThermalNodes; /* Number of thermal nodes required */ - - unsigned SOI3off:1; /* non-zero to indicate device is off for dc analysis*/ - unsigned SOI3tempGiven :1; /* instance temperature specified */ - unsigned SOI3lGiven :1; - unsigned SOI3wGiven :1; - unsigned SOI3mGiven :1; - unsigned SOI3asGiven:1; - unsigned SOI3adGiven:1; - unsigned SOI3abGiven:1; - unsigned SOI3drainSquaresGiven :1; - unsigned SOI3sourceSquaresGiven :1; - unsigned SOI3dNodePrimeSet :1; - unsigned SOI3sNodePrimeSet :1; - unsigned SOI3icVBSGiven :1; - unsigned SOI3icVDSGiven :1; - unsigned SOI3icVGFSGiven:1; - unsigned SOI3icVGBSGiven:1; - unsigned SOI3rtGiven:1; - unsigned SOI3ctGiven:1; - unsigned SOI3rt1Given:1; - unsigned SOI3ct1Given:1; - unsigned SOI3rt2Given:1; - unsigned SOI3ct2Given:1; - unsigned SOI3rt3Given:1; - unsigned SOI3ct3Given:1; - unsigned SOI3rt4Given:1; - unsigned SOI3ct4Given:1; - unsigned SOI3vonGiven :1; - unsigned SOI3vdsatGiven :1; - unsigned SOI3modeGiven :1; - - - double *SOI3D_dPtr; /* pointer to sparse matrix element at - * (Drain node,drain node) */ - double *SOI3D_dpPtr; /* pointer to sparse matrix element at - * (drain node,drain prime node) */ - double *SOI3DP_dPtr; /* pointer to sparse matrix element at - * (drain prime node,drain node) */ - double *SOI3S_sPtr; /* pointer to sparse matrix element at - * (source node,source node) */ - double *SOI3S_spPtr; /* pointer to sparse matrix element at - * (source node,source prime node) */ - double *SOI3SP_sPtr; /* pointer to sparse matrix element at - * (source prime node,source node) */ - double *SOI3GF_gfPtr; /* pointer to sparse matrix element at - * (front gate node,front gate node) */ - double *SOI3GF_gbPtr; /* pointer to sparse matrix element at - * (front gate node,back gate node) */ - double *SOI3GF_dpPtr; /* pointer to sparse matrix element at - * (front gate node,drain prime node) */ - double *SOI3GF_spPtr; /* pointer to sparse matrix element at - * (front gate node,source prime node) */ - double *SOI3GF_bPtr; /* pointer to sparse matrix element at - * (front gate node,bulk node) */ - double *SOI3GB_gfPtr; /* pointer to sparse matrix element at - * (back gate node,front gate node) */ - double *SOI3GB_gbPtr; /* pointer to sparse matrix element at - * (back gate node,back gate node) */ - double *SOI3GB_dpPtr; /* pointer to sparse matrix element at - * (back gate node,drain prime node) */ - double *SOI3GB_spPtr; /* pointer to sparse matrix element at - * (back gate node,source prime node) */ - double *SOI3GB_bPtr; /* pointer to sparse matrix element at - * (back gate node,bulk node) */ - double *SOI3DP_gfPtr; /* pointer to sparse matrix element at - * (drain prime node,front gate node) */ - double *SOI3DP_gbPtr; /* pointer to sparse matrix element at - * (drain prime node,back gate node) */ - double *SOI3DP_dpPtr; /* pointer to sparse matrix element at - * (drain prime node,drain prime node) */ - double *SOI3DP_spPtr; /* pointer to sparse matrix element at - * (drain prime node,source prime node) */ - double *SOI3DP_bPtr; /* pointer to sparse matrix element at - * (drain prime node,bulk node) */ - double *SOI3SP_gfPtr; /* pointer to sparse matrix element at - * (source prime node,front gate node) */ - double *SOI3SP_gbPtr; /* pointer to sparse matrix element at - * (source prime node,back gate node) */ - double *SOI3SP_dpPtr; /* pointer to sparse matrix element at - * (source prime node,drain prime node) */ - double *SOI3SP_spPtr; /* pointer to sparse matrix element at - * (source prime node,source prime node) */ - double *SOI3SP_bPtr; /* pointer to sparse matrix element at - * (source prime node,bulk node) */ - double *SOI3B_gfPtr; /* pointer to sparse matrix element at - * (bulk node,front gate node) */ - double *SOI3B_gbPtr; /* pointer to sparse matrix element at - * (bulk node,back gate node) */ - double *SOI3B_dpPtr; /* pointer to sparse matrix element at - * (bulk node,drain prime node) */ - double *SOI3B_spPtr; /* pointer to sparse matrix element at - * (bulk node,source prime node) */ - double *SOI3B_bPtr; /* pointer to sparse matrix element at - * (bulk node,bulk node) */ - -/** Now for Thermal Node **/ - - double *SOI3TOUT_toutPtr; - double *SOI3TOUT_dpPtr; - double *SOI3TOUT_gfPtr; - double *SOI3TOUT_gbPtr; - double *SOI3TOUT_bPtr; - double *SOI3TOUT_spPtr; - - double *SOI3GF_toutPtr; - double *SOI3GB_toutPtr; - double *SOI3DP_toutPtr; - double *SOI3SP_toutPtr; - - double *SOI3TOUT_ibrPtr; /* these are for zero voltage source should */ - double *SOI3IBR_toutPtr; /* no thermal behaviour be specified */ - - double *SOI3B_toutPtr; /* for impact ionisation current source */ - - double *SOI3TOUT_tout1Ptr; - double *SOI3TOUT1_toutPtr; - double *SOI3TOUT1_tout1Ptr; - double *SOI3TOUT1_tout2Ptr; - double *SOI3TOUT2_tout1Ptr; - double *SOI3TOUT2_tout2Ptr; - double *SOI3TOUT2_tout3Ptr; - double *SOI3TOUT3_tout2Ptr; - double *SOI3TOUT3_tout3Ptr; - double *SOI3TOUT3_tout4Ptr; - double *SOI3TOUT4_tout3Ptr; - double *SOI3TOUT4_tout4Ptr; - -#ifndef NONOISE - double SOI3nVar[NSTATVARS][SOI3NSRCS]; -#else /* NONOISE */ - double **SOI3nVar; -#endif /* NONOISE */ - -} SOI3instance ; - -#define SOI3vbd SOI3states+ 0 /* bulk-drain voltage */ -#define SOI3vbs SOI3states+ 1 /* bulk-source voltage */ -#define SOI3vgfs SOI3states+ 2 /* front gate-source voltage */ -#define SOI3vgbs SOI3states+ 3 /* back gate-source voltage */ -#define SOI3vds SOI3states+ 4 /* drain-source voltage */ -#define SOI3deltaT SOI3states+ 5 /* final temperature difference */ - -#define SOI3qgf SOI3states + 6 /* front gate charge */ -#define SOI3iqgf SOI3states +7 /* front gate current */ - -#define SOI3qgb SOI3states+ 8 /* back gate charge */ -#define SOI3iqgb SOI3states+ 9 /* back gate current */ - -#define SOI3qd SOI3states+ 10 /* drain charge */ -#define SOI3iqd SOI3states+ 11 /* drain current */ - -#define SOI3qs SOI3states+ 14 /* body charge */ -#define SOI3iqs SOI3states+ 15 /* body current */ - -#define SOI3cgfgf SOI3states+ 16 -#define SOI3cgfd SOI3states+ 17 -#define SOI3cgfs SOI3states+ 18 -#define SOI3cgfdeltaT SOI3states+ 19 -#define SOI3cgfgb SOI3states+ 20 - -#define SOI3cdgf SOI3states+ 21 -#define SOI3cdd SOI3states+ 22 -#define SOI3cds SOI3states+ 23 -#define SOI3cddeltaT SOI3states+ 24 -#define SOI3cdgb SOI3states+ 25 - -#define SOI3csgf SOI3states+ 26 -#define SOI3csd SOI3states+ 27 -#define SOI3css SOI3states+ 28 -#define SOI3csdeltaT SOI3states+ 29 -#define SOI3csgb SOI3states+ 30 - -#define SOI3cgbgf SOI3states + 31 -#define SOI3cgbd SOI3states + 32 -#define SOI3cgbs SOI3states + 33 -#define SOI3cgbdeltaT SOI3states+ 34 -#define SOI3cgbgb SOI3states + 35 - -#define SOI3qbd SOI3states+ 36 /* body-drain capacitor charge */ -#define SOI3iqbd SOI3states+ 37 /* body-drain capacitor current */ - -#define SOI3qbs SOI3states+ 38 /* body-source capacitor charge */ -#define SOI3iqbs SOI3states+ 39 /* body-source capacitor current */ - -#define SOI3qt SOI3states+ 40 /* Energy or 'charge' associated with ct */ -#define SOI3iqt SOI3states+ 41 /* equiv current source for ct */ -#define SOI3qt1 SOI3states+ 42 /* Energy or 'charge' associated with ct */ -#define SOI3iqt1 SOI3states+ 43 /* equiv current source for ct */ -#define SOI3qt2 SOI3states+ 44 /* Energy or 'charge' associated with ct */ -#define SOI3iqt2 SOI3states+ 45 /* equiv current source for ct */ -#define SOI3qt3 SOI3states+ 46 /* Energy or 'charge' associated with ct */ -#define SOI3iqt3 SOI3states+ 47 /* equiv current source for ct */ -#define SOI3qt4 SOI3states+ 48 /* Energy or 'charge' associated with ct */ -#define SOI3iqt4 SOI3states+ 49 /* equiv current source for ct */ - -#define SOI3qBJTbs SOI3states+ 50 -#define SOI3iqBJTbs SOI3states+ 51 - -#define SOI3qBJTbd SOI3states+ 52 -#define SOI3iqBJTbd SOI3states+ 53 - -#define SOI3cBJTbsbs SOI3states+ 54 -#define SOI3cBJTbsdeltaT SOI3states+ 55 - -#define SOI3cBJTbdbd SOI3states+ 56 -#define SOI3cBJTbddeltaT SOI3states+ 57 - -#define SOI3idrain SOI3states+ 58 /* final drain current at timepoint (no define) */ - -#define SOI3deltaT1 SOI3states+ 59 /* final temperature difference */ -#define SOI3deltaT2 SOI3states+ 60 /* final temperature difference */ -#define SOI3deltaT3 SOI3states+ 61 /* final temperature difference */ -#define SOI3deltaT4 SOI3states+ 62 /* final temperature difference */ -#define SOI3deltaT5 SOI3states+ 63 /* final temperature difference */ - -#define SOI3numStates 64 - -/* per model data */ - - /* NOTE: parameters marked 'input - use xxxx' are paramters for - * which a temperature correction is applied in SOI3temp, thus - * the SOI3xxxx value in the per-instance structure should be used - * instead in all calculations - */ - - -typedef struct sSOI3model { /* model structure for an SOI3 MOSFET */ - - struct GENmodel gen; - -#define SOI3modType gen.GENmodType -#define SOI3nextModel(inst) ((struct sSOI3model *)((inst)->gen.GENnextModel)) -#define SOI3instances(inst) ((SOI3instance *)((inst)->gen.GENinstances)) -#define SOI3modName gen.GENmodName - - int SOI3type; /* device type : 1 = nsoi, -1 = psoi */ - double SOI3tnom; /* temperature at which parameters measured */ - double SOI3latDiff; - double SOI3jctSatCurDensity; /* input - use tSatCurDens (jnct)*/ - double SOI3jctSatCurDensity1; /* input - use tSatCurDens1 (jnct)*/ - double SOI3jctSatCur; /* input - use tSatCur (jnct Is)*/ - double SOI3jctSatCur1; /* input - use tSatCur1 (jnct Is)*/ - double SOI3drainResistance; - double SOI3sourceResistance; - double SOI3sheetResistance; - double SOI3transconductance; /* (KP) input - use tTransconductance */ - double SOI3frontGateSourceOverlapCapFactor; - double SOI3frontGateDrainOverlapCapFactor; - double SOI3frontGateBulkOverlapCapFactor; - double SOI3backGateSourceOverlapCapAreaFactor; - double SOI3backGateDrainOverlapCapAreaFactor; - double SOI3backGateBulkOverlapCapAreaFactor; - double SOI3frontOxideCapFactor; /* Cof NO DEFINES */ - double SOI3backOxideCapFactor; /* Cob OR */ - double SOI3bodyCapFactor; /* Cb FLAGS */ - double SOI3C_bb; /* Cb in series with Cob */ - double SOI3C_fb; /* Cb in series with Cof */ - double SOI3C_ssf; /* q*NQFF */ - double SOI3C_ssb; /* q*NQFB */ - double SOI3C_fac; /* C_ob/(C_ob+C_b+C_ssb) */ - double SOI3vt0; /* input - use tVto */ - double SOI3vfbF; /* flat-band voltage. input - use tVfbF */ - double SOI3vfbB; /* back flat-band voltage. input - use tVfbB */ - double SOI3gamma; /* gamma */ - double SOI3gammaB; /* back gamma */ - double SOI3capBD; /* input - use tCbd */ - double SOI3capBS; /* input - use tCbs */ - double SOI3sideWallCapFactor; /* input - use tCjsw */ - double SOI3bulkJctPotential; /* input - use tBulkPot */ - double SOI3bulkJctSideGradingCoeff; /* MJSW */ - double SOI3fwdCapDepCoeff; /* FC */ - double SOI3phi; /* input - use tPhi */ - double SOI3vbi; /* input - use tVbi */ - double SOI3lambda; - double SOI3theta; - double SOI3substrateDoping; /* Nsub */ - double SOI3substrateCharge; /* Qb - no define/flag */ - int SOI3gateType; /* +1=same, -1=different, 0=Al */ - double SOI3frontFixedChargeDensity; - double SOI3backFixedChargeDensity; - double SOI3frontSurfaceStateDensity; - double SOI3backSurfaceStateDensity; - double SOI3frontOxideThickness; - double SOI3backOxideThickness; - double SOI3bodyThickness; - double SOI3surfaceMobility; /* input - use tSurfMob */ - double SOI3oxideThermalConductivity; - double SOI3siliconSpecificHeat; - double SOI3siliconDensity; - double SOI3fNcoef; - double SOI3fNexp; -/* new stuff for newer model - msll Jan96 */ - double SOI3sigma; /* DIBL factor */ - double SOI3chiFB; /* temperature coeff of flatband voltage */ - double SOI3chiPHI; /* temperature coeff of PHI */ - double SOI3deltaW; /* narrow width effect factor */ - double SOI3deltaL; /* short channel effect factor */ - double SOI3vsat; /* input - saturation velocity, use tVsat */ - double SOI3TVF0; /* internal use - precalculation of exp to save time */ - double SOI3k; /* thermal exponent for mobility factor */ - double SOI3lx; /* channel length modulation factor */ - double SOI3vp; /* channel length modulation empirical voltage */ - double SOI3eta; /* Imp. ion. field adjustment factor */ - double SOI3alpha0; /* 1st impact ionisation coeff */ - double SOI3beta0; /* 2nd impact ionisation coeff */ - double SOI3lm; /* impact ion. drain region length cf LX */ - double SOI3lm1; /* impact ion. drain region coeff */ - double SOI3lm2; /* impact ion. drain region coeff */ - double SOI3etad; /* diode ideality factor */ - double SOI3etad1; /* 2nd diode ideality factor */ - double SOI3chibeta; /* temp coeff of BETA0 */ - double SOI3chid; /* temp factor for junction 1 */ - double SOI3chid1; /* temp factor for junction 2 */ - int SOI3dvt; /* switch for temp dependence of vt in diodes */ - int SOI3nLev; /* level switch for noise model */ - double SOI3betaBJT; /* beta for Eber Moll BJT model */ - double SOI3tauFBJT; /* forward BJT transit time */ - double SOI3tauRBJT; /* reverse BJT transit time */ - double SOI3betaEXP; - double SOI3tauEXP; - double SOI3rsw; /* source resistance width scaling factor */ - double SOI3rdw; /* drain resistance width scaling factor */ - double SOI3minimumFeatureSize; /* minimum feature size of simulated process technology */ - double SOI3vtex; /* Extracted threshold voltage */ - double SOI3vdex; /* Drain bias at which vtex extracted */ - double SOI3delta0; /* Surface potential factor for vtex conversion */ - double SOI3satChargeShareFactor; /* Saturation region charge sharing factor */ - double SOI3nplusDoping; /* Doping concentration of N+ or P+ regions */ - double SOI3rta; /* thermal resistance area scaling factor */ - double SOI3cta; /* thermal capacitance area scaling factor */ - double SOI3mexp; /* exponent for CLM smoothing */ - - unsigned SOI3typeGiven :1; - unsigned SOI3latDiffGiven :1; - unsigned SOI3jctSatCurDensityGiven :1; - unsigned SOI3jctSatCurDensity1Given :1; - unsigned SOI3jctSatCurGiven :1; - unsigned SOI3jctSatCur1Given :1; - unsigned SOI3drainResistanceGiven :1; - unsigned SOI3sourceResistanceGiven :1; - unsigned SOI3sheetResistanceGiven :1; - unsigned SOI3transconductanceGiven :1; - unsigned SOI3frontGateSourceOverlapCapFactorGiven :1; - unsigned SOI3frontGateDrainOverlapCapFactorGiven :1; - unsigned SOI3frontGateBulkOverlapCapFactorGiven :1; - unsigned SOI3backGateSourceOverlapCapAreaFactorGiven :1; - unsigned SOI3backGateDrainOverlapCapAreaFactorGiven :1; - unsigned SOI3backGateBulkOverlapCapAreaFactorGiven :1; - unsigned SOI3subsBiasFactorGiven :1; - unsigned SOI3bodyFactorGiven :1; - unsigned SOI3vt0Given :1; - unsigned SOI3vfbFGiven :1; - unsigned SOI3vfbBGiven :1; - unsigned SOI3gammaGiven :1; - unsigned SOI3gammaBGiven :1; - unsigned SOI3capBDGiven :1; - unsigned SOI3capBSGiven :1; - unsigned SOI3sideWallCapFactorGiven :1; - unsigned SOI3bulkJctPotentialGiven :1; - unsigned SOI3bulkJctSideGradingCoeffGiven :1; - unsigned SOI3fwdCapDepCoeffGiven :1; - unsigned SOI3phiGiven :1; - unsigned SOI3lambdaGiven :1; - unsigned SOI3thetaGiven :1; - unsigned SOI3substrateDopingGiven :1; - unsigned SOI3gateTypeGiven :1; - unsigned SOI3frontFixedChargeDensityGiven :1; - unsigned SOI3backFixedChargeDensityGiven :1; - unsigned SOI3frontSurfaceStateDensityGiven :1; - unsigned SOI3backSurfaceStateDensityGiven :1; - unsigned SOI3frontOxideThicknessGiven :1; - unsigned SOI3backOxideThicknessGiven :1; - unsigned SOI3bodyThicknessGiven :1; - unsigned SOI3surfaceMobilityGiven :1; - unsigned SOI3tnomGiven :1; - unsigned SOI3oxideThermalConductivityGiven :1; - unsigned SOI3siliconSpecificHeatGiven :1; - unsigned SOI3siliconDensityGiven :1; - unsigned SOI3fNcoefGiven :1; - unsigned SOI3fNexpGiven :1; -/* extra stuff for newer model - msll Jan96 */ - unsigned SOI3sigmaGiven :1; - unsigned SOI3chiFBGiven :1; - unsigned SOI3chiPHIGiven :1; - unsigned SOI3deltaWGiven :1; - unsigned SOI3deltaLGiven :1; - unsigned SOI3vsatGiven :1; - unsigned SOI3kGiven :1; - unsigned SOI3lxGiven :1; - unsigned SOI3vpGiven :1; - unsigned SOI3useLAMBDA :1; - unsigned SOI3etaGiven :1; - unsigned SOI3alpha0Given :1; - unsigned SOI3beta0Given :1; - unsigned SOI3lmGiven :1; - unsigned SOI3lm1Given :1; - unsigned SOI3lm2Given :1; - unsigned SOI3etadGiven :1; - unsigned SOI3etad1Given :1; - unsigned SOI3chibetaGiven :1; - unsigned SOI3chidGiven :1; - unsigned SOI3chid1Given :1; - unsigned SOI3dvtGiven :1; - unsigned SOI3nLevGiven :1; - unsigned SOI3betaBJTGiven :1; - unsigned SOI3tauFBJTGiven :1; - unsigned SOI3tauRBJTGiven :1; - unsigned SOI3betaEXPGiven :1; - unsigned SOI3tauEXPGiven :1; - unsigned SOI3rswGiven :1; - unsigned SOI3rdwGiven :1; - unsigned SOI3minimumFeatureSizeGiven :1; - unsigned SOI3vtexGiven :1; - unsigned SOI3vdexGiven :1; - unsigned SOI3delta0Given :1; - unsigned SOI3satChargeShareFactorGiven :1; - unsigned SOI3nplusDopingGiven :1; - unsigned SOI3rtaGiven :1; - unsigned SOI3ctaGiven :1; - unsigned SOI3mexpGiven :1; - -} SOI3model; - -#ifndef NSOI3 -#define NSOI3 1 -#define PSOI3 -1 -#endif /*NSOI3*/ - -/* device parameters */ -#define SOI3_W 1 -#define SOI3_L 2 -#define SOI3_M 25 -enum { - SOI3_AS = 3, - SOI3_AD, - SOI3_AB, - SOI3_PS, - SOI3_PD, - SOI3_PB, - SOI3_NRS, - SOI3_NRD, - SOI3_OFF, - SOI3_IC, - SOI3_IC_VBS, - SOI3_IC_VDS, - SOI3_IC_VGFS, - SOI3_IC_VGBS, - SOI3_W_SENS, - SOI3_L_SENS, - SOI3_IB, - SOI3_IGF, - SOI3_IGB, - SOI3_IS, - SOI3_POWER, - SOI3_TEMP, -}; - -/* model parameters */ -#define SOI3_MOD_VTO 101 -#define SOI3_MOD_VFBF 149 -enum { - SOI3_MOD_KP = 102, - SOI3_MOD_GAMMA, - SOI3_MOD_PHI, - SOI3_MOD_LAMBDA, -}; - -#define SOI3_MOD_THETA 139 -enum { - SOI3_MOD_RD = 106, - SOI3_MOD_RS, - SOI3_MOD_CBD, - SOI3_MOD_CBS, - SOI3_MOD_IS, - SOI3_MOD_PB, - SOI3_MOD_CGFSO, - SOI3_MOD_CGFDO, - SOI3_MOD_CGFBO, -}; - -enum { - SOI3_MOD_CGBSO = 144, - SOI3_MOD_CGBDO, - SOI3_MOD_CGBBO, -}; - -enum { - SOI3_MOD_CJ = 115, - SOI3_MOD_MJ, - SOI3_MOD_CJSW, - SOI3_MOD_MJSW, - SOI3_MOD_JS, - SOI3_MOD_TOF, -}; - -#define SOI3_MOD_TOB 133 -#define SOI3_MOD_TB 134 -enum { - SOI3_MOD_LD = 121, - SOI3_MOD_RSH, - SOI3_MOD_U0, - SOI3_MOD_FC, - SOI3_MOD_NSUB, - SOI3_MOD_TPG, -}; - -#define SOI3_MOD_NQFF 147 -#define SOI3_MOD_NQFB 148 -#define SOI3_MOD_NSSF 127 -#define SOI3_MOD_NSSB 135 -enum { - SOI3_MOD_NSOI3 = 128, - SOI3_MOD_PSOI3, - SOI3_MOD_TNOM, - SOI3_MOD_KF, - SOI3_MOD_AF, -}; - -#define SOI3_MOD_KOX 142 -#define SOI3_MOD_SHSI 143 -/* extra stuff for newer model - msll Jan96 */ -enum { - SOI3_MOD_SIGMA = 150, - SOI3_MOD_CHIFB, - SOI3_MOD_CHIPHI, - SOI3_MOD_DELTAW, - SOI3_MOD_DELTAL, - SOI3_MOD_VSAT, - SOI3_MOD_K, - SOI3_MOD_LX, - SOI3_MOD_VP, - SOI3_MOD_ETA, -}; - -#define SOI3_MOD_ALPHA0 140 -#define SOI3_MOD_BETA0 141 -enum { - SOI3_MOD_LM = 160, - SOI3_MOD_LM1, - SOI3_MOD_LM2, - SOI3_MOD_ETAD, - SOI3_MOD_ETAD1, - SOI3_MOD_IS1, - SOI3_MOD_JS1, - SOI3_MOD_CHIBETA, - SOI3_MOD_VFBB, - SOI3_MOD_GAMMAB, - SOI3_MOD_CHID, - SOI3_MOD_CHID1, - SOI3_MOD_DVT, - SOI3_MOD_NLEV, - SOI3_MOD_BETABJT, -}; - -enum { - SOI3_MOD_TAUFBJT = 176, - SOI3_MOD_TAURBJT, - SOI3_MOD_BETAEXP, - SOI3_MOD_TAUEXP, - SOI3_MOD_RSW, - SOI3_MOD_RDW, -}; - -enum { - SOI3_MOD_FMIN = 382, - SOI3_MOD_VTEX, - SOI3_MOD_VDEX, - SOI3_MOD_DELTA0, - SOI3_MOD_CSF, - SOI3_MOD_DSI, - SOI3_MOD_NPLUS, - SOI3_MOD_RTA, - SOI3_MOD_CTA, - SOI3_MOD_MEXP, -}; - -/* device questions */ -enum { - SOI3_DNODE = 201, - SOI3_GFNODE, - SOI3_SNODE, - SOI3_GBNODE, - SOI3_BNODE, - SOI3_DNODEPRIME, - SOI3_SNODEPRIME, - SOI3_TNODE, - SOI3_BRANCH, - SOI3_SOURCECONDUCT, - SOI3_DRAINCONDUCT, - SOI3_VON, - SOI3_VFBF, - SOI3_VDSAT, - SOI3_SOURCEVCRIT, - SOI3_DRAINVCRIT, - SOI3_ID, - SOI3_IBS, - SOI3_IBD, - SOI3_GMBS, - SOI3_GMF, - SOI3_GMB, - SOI3_GDS, - SOI3_GBD, - SOI3_GBS, - SOI3_CAPBD, - SOI3_CAPBS, - SOI3_CAPZEROBIASBD, - SOI3_CAPZEROBIASBDSW, - SOI3_CAPZEROBIASBS, - SOI3_CAPZEROBIASBSSW, - SOI3_VBD, - SOI3_VBS, - SOI3_VGFS, - SOI3_VGBS, - SOI3_VDS, - SOI3_QGF, - SOI3_IQGF, - SOI3_QGB, - SOI3_IQGB, - SOI3_QD, - SOI3_IQD, - SOI3_QS, - SOI3_IQS, - SOI3_QBD, - SOI3_IQBD, - SOI3_QBS, - SOI3_IQBS, - SOI3_CGFGF, - SOI3_CGFD, - SOI3_CGFS, - SOI3_CGFDELTAT, - SOI3_CGFGB, - SOI3_CDGF, - SOI3_CDD, - SOI3_CDS, - SOI3_CDDELTAT, - SOI3_CDGB, - SOI3_CSGF, - SOI3_CSD, - SOI3_CSS, - SOI3_CSDELTAT, - SOI3_CSGB, - SOI3_CGBGF, - SOI3_CGBD, - SOI3_CGBS, - SOI3_CGBDELTAT, - SOI3_CGBGB, - SOI3_L_SENS_REAL, - SOI3_L_SENS_IMAG, - SOI3_L_SENS_MAG, - SOI3_L_SENS_PH, - SOI3_L_SENS_CPLX, - SOI3_W_SENS_REAL, - SOI3_W_SENS_IMAG, - SOI3_W_SENS_MAG, - SOI3_W_SENS_PH, - SOI3_W_SENS_CPLX, - SOI3_L_SENS_DC, - SOI3_W_SENS_DC, - SOI3_RT, - SOI3_CT, - SOI3_VFBB, - SOI3_RT1, - SOI3_CT1, - SOI3_RT2, - SOI3_CT2, - SOI3_RT3, - SOI3_CT3, - SOI3_RT4, - SOI3_CT4, - SOI3_ITOT, -}; - -/* model questions */ - -#include "soi3ext.h" - -#endif /*SOI3*/ - diff --git a/src/spicelib/devices/soi3/soi3ext.h b/src/spicelib/devices/soi3/soi3ext.h deleted file mode 100644 index ba6200813..000000000 --- a/src/spicelib/devices/soi3/soi3ext.h +++ /dev/null @@ -1,64 +0,0 @@ -/********** -STAG version 2.7 -Copyright 2000 owned by the United Kingdom Secretary of State for Defence -acting through the Defence Evaluation and Research Agency. -Developed by : Jim Benson, - Department of Electronics and Computer Science, - University of Southampton, - United Kingdom. -With help from : Nele D'Halleweyn, Ketan Mistry, Bill Redman-White, - and Craig Easson. - -Based on STAG version 2.1 -Developed by : Mike Lee, -With help from : Bernard Tenbroek, Bill Redman-White, Mike Uren, Chris Edwards - and John Bunyan. -Acknowledgements : Rupert Howes and Pete Mole. -**********/ - -/********** -Modified by Paolo Nenzi 2002 -ngspice integration -**********/ - -extern int SOI3acLoad(GENmodel *,CKTcircuit*); -extern int SOI3ask(CKTcircuit*,GENinstance*,int,IFvalue*,IFvalue*); -extern int SOI3getic(GENmodel*,CKTcircuit*); -extern int SOI3load(GENmodel*,CKTcircuit*); -extern int SOI3mAsk(CKTcircuit *,GENmodel *,int,IFvalue*); -extern int SOI3mParam(int,IFvalue*,GENmodel*); -extern void SOI3cap(double,double,double, - double*,double*,double*,double*, - double*,double*,double*,double*, - double*,double*,double*,double*, - double*,double*,double*,double*,double*, - double*,double*,double*,double*,double*, - double*,double*,double*,double*,double*, - double*,double*,double*,double*,double*); -extern void SOI3capEval(CKTcircuit*,double*,double*, - double,double,double,double,double, - double,double,double,double,double, - double,double,double,double,double, - double,double,double,double,double, - double,double,double,double,double, - double*,double*,double*,double*,double*, - double*,double*,double*,double*,double*, - double*,double*,double*,double*,double*, - double*,double*,double*,double*,double*, - double*,double*,double*,double*,double*, - double*,double*,double*,double*,double*); -extern int SOI3param(int,IFvalue*,GENinstance*,IFvalue*); -/* extern int SOI3pzLoad(GENmodel*,CKTcircuit*,SPcomplex*); | -extern int SOI3sAcLoad(GENmodel*,CKTcircuit*); | -extern int SOI3sLoad(GENmodel*,CKTcircuit*); | Ignored -extern void SOI3sPrint(GENmodel*,CKTcircuit*); | -extern int SOI3sSetup(SENstruct*,GENmodel*); | -extern int SOI3sUpdate(GENmodel*,CKTcircuit*); | */ -extern int SOI3setup(SMPmatrix*,GENmodel*,CKTcircuit*,int*); -extern int SOI3unsetup(GENmodel*,CKTcircuit*); -extern int SOI3temp(GENmodel*,CKTcircuit*); -extern int SOI3trunc(GENmodel*,CKTcircuit*,double*); -extern int SOI3convTest(GENmodel*,CKTcircuit*); - -/* extern int SOI3disto(int,GENmodel*,CKTcircuit*); */ -extern int SOI3noise(int,int,GENmodel*,CKTcircuit*,Ndata*,double*); diff --git a/src/spicelib/devices/soi3/soi3ic.c b/src/spicelib/devices/soi3/soi3ic.c deleted file mode 100644 index 6013eba4c..000000000 --- a/src/spicelib/devices/soi3/soi3ic.c +++ /dev/null @@ -1,66 +0,0 @@ -/********** -STAG version 2.7 -Copyright 2000 owned by the United Kingdom Secretary of State for Defence -acting through the Defence Evaluation and Research Agency. -Developed by : Jim Benson, - Department of Electronics and Computer Science, - University of Southampton, - United Kingdom. -With help from : Nele D'Halleweyn, Ketan Mistry, Bill Redman-White, and Craig Easson. - -Based on STAG version 2.1 -Developed by : Mike Lee, -With help from : Bernard Tenbroek, Bill Redman-White, Mike Uren, Chris Edwards - and John Bunyan. -Acknowledgements : Rupert Howes and Pete Mole. -**********/ - -/********** -Modified by Paolo Nenzi 2002 -ngspice integration -**********/ - -#include "ngspice/ngspice.h" -#include "ngspice/cktdefs.h" -#include "soi3defs.h" -#include "ngspice/sperror.h" -#include "ngspice/suffix.h" - - -int -SOI3getic(GENmodel *inModel, CKTcircuit *ckt) -{ - SOI3model *model = (SOI3model *)inModel; - SOI3instance *here; - /* - * grab initial conditions out of rhs array. User specified, so use - * external nodes to get values - */ - - for( ; model ; model = SOI3nextModel(model)) { - for(here = SOI3instances(model); here ; here = SOI3nextInstance(here)) { - - if(!here->SOI3icVBSGiven) { - here->SOI3icVBS = - *(ckt->CKTrhs + here->SOI3bNode) - - *(ckt->CKTrhs + here->SOI3sNode); - } - if(!here->SOI3icVDSGiven) { - here->SOI3icVDS = - *(ckt->CKTrhs + here->SOI3dNode) - - *(ckt->CKTrhs + here->SOI3sNode); - } - if(!here->SOI3icVGFSGiven) { - here->SOI3icVGFS = - *(ckt->CKTrhs + here->SOI3gfNode) - - *(ckt->CKTrhs + here->SOI3sNode); - } - if(!here->SOI3icVGBSGiven) { - here->SOI3icVGBS = - *(ckt->CKTrhs + here->SOI3gbNode) - - *(ckt->CKTrhs + here->SOI3sNode); - } - } - } - return(OK); -} diff --git a/src/spicelib/devices/soi3/soi3init.c b/src/spicelib/devices/soi3/soi3init.c deleted file mode 100644 index 7ec5c604d..000000000 --- a/src/spicelib/devices/soi3/soi3init.c +++ /dev/null @@ -1,76 +0,0 @@ -#include "ngspice/config.h" - -#include "ngspice/devdefs.h" - -#include "soi3itf.h" -#include "soi3ext.h" -#include "soi3init.h" - - -SPICEdev SOI3info = { - .DEVpublic = { - .name = "SOI3", - .description = "Basic Thick Film SOI3 model v2.7", - .terms = &SOI3nSize, - .numNames = &SOI3nSize, - .termNames = SOI3names, - .numInstanceParms = &SOI3pTSize, - .instanceParms = SOI3pTable, - .numModelParms = &SOI3mPTSize, - .modelParms = SOI3mPTable, - .flags = DEV_DEFAULT, - -#ifdef XSPICE - .cm_func = NULL, - .num_conn = 0, - .conn = NULL, - .num_param = 0, - .param = NULL, - .num_inst_var = 0, - .inst_var = NULL, -#endif - }, - - .DEVparam = SOI3param, - .DEVmodParam = SOI3mParam, - .DEVload = SOI3load, - .DEVsetup = SOI3setup, - .DEVunsetup = SOI3unsetup, - .DEVpzSetup = SOI3setup, - .DEVtemperature = SOI3temp, - .DEVtrunc = SOI3trunc, - .DEVfindBranch = NULL, - .DEVacLoad = SOI3acLoad, - .DEVaccept = NULL, - .DEVdestroy = NULL, - .DEVmodDelete = NULL, - .DEVdelete = NULL, - .DEVsetic = SOI3getic, - .DEVask = SOI3ask, - .DEVmodAsk = SOI3mAsk, - .DEVpzLoad = NULL, - .DEVconvTest = SOI3convTest, - .DEVsenSetup = NULL, - .DEVsenLoad = NULL, - .DEVsenUpdate = NULL, - .DEVsenAcLoad = NULL, - .DEVsenPrint = NULL, - .DEVsenTrunc = NULL, - .DEVdisto = NULL, - .DEVnoise = SOI3noise, - .DEVsoaCheck = NULL, - .DEVinstSize = &SOI3iSize, - .DEVmodSize = &SOI3mSize, - -#ifdef CIDER - .DEVdump = NULL, - .DEVacct = NULL, -#endif -}; - - -SPICEdev * -get_soi3_info(void) -{ - return &SOI3info; -} diff --git a/src/spicelib/devices/soi3/soi3init.h b/src/spicelib/devices/soi3/soi3init.h deleted file mode 100644 index 0a957206e..000000000 --- a/src/spicelib/devices/soi3/soi3init.h +++ /dev/null @@ -1,13 +0,0 @@ -#ifndef _SOI3INIT_H -#define _SOI3INIT_H - -extern IFparm SOI3pTable[ ]; -extern IFparm SOI3mPTable[ ]; -extern char *SOI3names[ ]; -extern int SOI3pTSize; -extern int SOI3mPTSize; -extern int SOI3nSize; -extern int SOI3iSize; -extern int SOI3mSize; - -#endif diff --git a/src/spicelib/devices/soi3/soi3itf.h b/src/spicelib/devices/soi3/soi3itf.h deleted file mode 100644 index 3ea642221..000000000 --- a/src/spicelib/devices/soi3/soi3itf.h +++ /dev/null @@ -1,29 +0,0 @@ -/********** -STAG version 2.7 -Copyright 2000 owned by the United Kingdom Secretary of State for Defence -acting through the Defence Evaluation and Research Agency. -Developed by : Jim Benson, - Department of Electronics and Computer Science, - University of Southampton, - United Kingdom. -With help from : Nele D'Halleweyn, Ketan Mistry, Bill Redman-White, and Craig Easson. - -Based on STAG version 2.1 -Developed by : Mike Lee, -With help from : Bernard Tenbroek, Bill Redman-White, Mike Uren, Chris Edwards - and John Bunyan. -Acknowledgements : Rupert Howes and Pete Mole. -**********/ - -/********** -Modified by Paolo Nenzi 2002 -ngspice integration -**********/ - -#ifndef DEV_SOI3 -#define DEV_SOI3 - -SPICEdev *get_soi3_info(void); - - -#endif diff --git a/src/spicelib/devices/soi3/soi3load.c b/src/spicelib/devices/soi3/soi3load.c deleted file mode 100644 index ffd5d3354..000000000 --- a/src/spicelib/devices/soi3/soi3load.c +++ /dev/null @@ -1,2607 +0,0 @@ -/********** -STAG version 2.7 -Copyright 2000 owned by the United Kingdom Secretary of State for Defence -acting through the Defence Evaluation and Research Agency. -Developed by : Jim Benson, - Department of Electronics and Computer Science, - University of Southampton, - United Kingdom. -With help from : Nele D'Halleweyn, Ketan Mistry, Bill Redman-White, - and Craig Easson. - -Based on STAG version 2.1 -Developed by : Mike Lee, -With help from : Bernard Tenbroek, Bill Redman-White, Mike Uren, Chris Edwards - and John Bunyan. -Acknowledgements : Rupert Howes and Pete Mole. -**********/ - -/********** -Modified by Paolo Nenzi 2002 -ngspice integration -**********/ - -#include "ngspice/ngspice.h" -#include "ngspice/cktdefs.h" -#include "ngspice/devdefs.h" -#include "soi3defs.h" -#include "ngspice/trandefs.h" -#include "ngspice/const.h" -#include "ngspice/sperror.h" -#include "ngspice/suffix.h" - -extern double DEVsoipnjlim(double, double, double, double, int *); - -int -SOI3load(GENmodel *inModel, CKTcircuit *ckt) - /* actually load the current value into the - * sparse matrix previously provided - */ -{ - SOI3model *model = (SOI3model *) inModel; - SOI3instance *here; - double Beta; - double DrainSatCur; /* for drain pn junction */ - double SourceSatCur; /* for source pn junction */ - double DrainSatCur1; /* for 2nd drain pn junction */ - double SourceSatCur1; /* for 2nd source pn junction */ - double EffectiveLength,logL; - double FrontGateBulkOverlapCap; - double FrontGateDrainOverlapCap; - double FrontGateSourceOverlapCap; - double BackGateBulkOverlapCap; - double BackGateDrainOverlapCap; - double BackGateSourceOverlapCap; - double Frontcapargs[6]; - double Backcapargs[6]; - double FrontOxideCap; - double BackOxideCap; - double arg; - double ibhat; - double idhat; - double iPthat; /* needed for convergence */ - double ieqPt; /* value of equivalent current source */ - double idrain; - double idreq; - double ieq; - double ieqct,ieqct1,ieqct2,ieqct3,ieqct4; - double ieqbd; - double ieqbs; - double iMdbeq; - double iMsbeq; - double iBJTdbeq; - double iBJTsbeq; - double delvbd; - double delvbs; - double delvds; - double delvgfd; - double delvgfs; - double delvgbd; - double delvgbs; - double deldeltaT; - double evbd,evbd1; - double evbs,evbs1; - double rtargs[5]; - double grt[5]; - double gct[5]; - int tnodeindex; - double geq; - double sarg; - double vbd; - double vbs; - double vds; -/* the next lot are so we can cast the problem with the body node as ref */ - double vsb; - double vdb; - double vgbb; -/* now back to our regular programming */ -/* vgfb exists already for gate cap calc */ - double deltaT,deltaT1 = 0.0,deltaT2 = 0.0,deltaT3 = 0.0; - double deltaT4 = 0.0,deltaT5 = 0.0; - - double vdsat_ext; - double vgfb; - double vgfd; - double vgbd; - double vgfdo; - double vgbdo; - double vgfs; - double vgbs; - double von; - double vt; -#ifndef PREDICTOR - double xfact; -#endif - int xnrm; - int xrev; - -/* now stuff needed for new charge model */ - double paramargs[10]; - double Bfargs[2],alpha_args[5]; - double psi_st0args[5]; - double vGTargs[5]; - double psi_sLargs[5],psi_s0args[5]; - double ldargs[5]; - double qgatef,qdrn,qsrc,qbody,qgateb; - double ieqqgf,ieqqd,ieqqs,ieqqgb; - - double cgfgf,cgfd,cgfs,cgfdeltaT,cgfgb; - double cdgf,cdd,cds,cddeltaT,cdgb; - double csgf,csd,css,csdeltaT,csgb; - double cbgf,cbd,cbs,cbdeltaT,cbgb; - double cgbgf,cgbd,cgbs,cgbdeltaT,cgbgb; - double gcgfgf,gcgfd,gcgfs,gcgfdeltaT,gcgfgb; - double gcdgf,gcdd,gcds,gcddeltaT,gcdgb; - double gcsgf,gcsd,gcss,gcsdeltaT,gcsgb; - double gcbgf,gcbd,gcbs,gcbdeltaT,gcbgb; - double gcgbgf,gcgbd,gcgbs,gcgbdeltaT,gcgbgb; - - /* remove compiler warnings */ - cgfgf=cgfd=cgfs=cgfdeltaT=cgfgb = 0; - cdgf=cdd=cds=cddeltaT=cdgb = 0; - csgf=csd=css=csdeltaT=csgb = 0; - cbgf=cbd=cbs=cbdeltaT=cbgb = 0; - cgbgf=cgbd=cgbs=cgbdeltaT=cgbgb = 0; - - double alphaBJT; - double tauFBJTeff,tauRBJTeff; - double ISts,IS1ts,IStd,IS1td; - double ieqqBJTbs,ieqqBJTbd; - double gcBJTbsbs,gcBJTbsdeltaT; - double gcBJTbdbd,gcBJTbddeltaT; - double ag0; - - int Check; - int ByPass; - -#ifndef NOBYPASS - double tempv; -#endif /*NOBYPASS*/ - int error; -#ifdef CAPBYPASS - int senflag; -#endif /* CAPBYPASS */ - - double m; - - for( ; model != NULL; model = SOI3nextModel(model)) { - - /* loop through all the instances of the model */ - for (here = SOI3instances(model); here != NULL ; - here=SOI3nextInstance(here)) { - - vt = CONSTKoverQ * here->SOI3temp; - Check=1; - ByPass=0; - - /* first, we compute a few useful values - these could be - * pre-computed, but for historical reasons are still done - * here. They may be moved at the expense of instance size - */ - - EffectiveLength=here->SOI3l - 2*model->SOI3latDiff; - logL = log(EffectiveLength); - if (here->SOI3tSatCurDens == 0) { - DrainSatCur = here->SOI3tSatCur; - SourceSatCur = here->SOI3tSatCur; - } else { - DrainSatCur = here->SOI3tSatCurDens * - here->SOI3w; - SourceSatCur = here->SOI3tSatCurDens * - here->SOI3w; - } - if (here->SOI3tSatCurDens1 == 0) { - DrainSatCur1 = here->SOI3tSatCur1; - SourceSatCur1 = here->SOI3tSatCur1; - } else { - DrainSatCur1 = here->SOI3tSatCurDens1 * - here->SOI3w; - SourceSatCur1 = here->SOI3tSatCurDens1 * - here->SOI3w; - } -/* NB Junction sat. cur. density is NOW PER UNIT WIDTH */ - - /* JimB - can use basic device geometry to estimate front and back */ - /* overlap capacitances to a first approximation. Use this default */ - /* model if capacitance factors aren't given in model netlist. */ - - /* Calculate front gate overlap capacitances. */ - - if(model->SOI3frontGateSourceOverlapCapFactorGiven) - { - FrontGateSourceOverlapCap = model->SOI3frontGateSourceOverlapCapFactor * here->SOI3w; - } - else - { - FrontGateSourceOverlapCap = model->SOI3latDiff * here->SOI3w * model->SOI3frontOxideCapFactor; - } - if(model->SOI3frontGateDrainOverlapCapFactorGiven) - { - FrontGateDrainOverlapCap = model->SOI3frontGateDrainOverlapCapFactor * here->SOI3w; - } - else - { - FrontGateDrainOverlapCap = model->SOI3latDiff * here->SOI3w * model->SOI3frontOxideCapFactor; - } - if(model->SOI3frontGateBulkOverlapCapFactorGiven) - { - FrontGateBulkOverlapCap = model->SOI3frontGateBulkOverlapCapFactor * EffectiveLength; - } - else - { - FrontGateBulkOverlapCap = EffectiveLength * (0.1*1e-6*model->SOI3minimumFeatureSize) - * model->SOI3frontOxideCapFactor; - } - - /* Calculate back gate overlap capacitances. */ - - if( (model->SOI3backGateSourceOverlapCapAreaFactorGiven) && - (!model->SOI3backGateSourceOverlapCapAreaFactor || here->SOI3asGiven) ) - { - BackGateSourceOverlapCap = model->SOI3backGateSourceOverlapCapAreaFactor * here->SOI3as; - } - else - { - BackGateSourceOverlapCap = (2*1e-6*model->SOI3minimumFeatureSize + model->SOI3latDiff) * here->SOI3w - * model->SOI3backOxideCapFactor; - } - if( (model->SOI3backGateDrainOverlapCapAreaFactorGiven) && - (!model->SOI3backGateDrainOverlapCapAreaFactor || here->SOI3adGiven) ) - { - BackGateDrainOverlapCap = model->SOI3backGateDrainOverlapCapAreaFactor * here->SOI3ad; - } - else - { - BackGateDrainOverlapCap = (2*1e-6*model->SOI3minimumFeatureSize + model->SOI3latDiff) * here->SOI3w - * model->SOI3backOxideCapFactor; - } - if( (model->SOI3backGateBulkOverlapCapAreaFactorGiven) && - (!model->SOI3backGateBulkOverlapCapAreaFactor || here->SOI3abGiven) ) - { - BackGateBulkOverlapCap = model->SOI3backGateBulkOverlapCapAreaFactor * here->SOI3ab; - } - else - { - BackGateBulkOverlapCap = EffectiveLength * (0.1*1e-6*model->SOI3minimumFeatureSize + here->SOI3w) - * model->SOI3backOxideCapFactor; - } - - Beta = here->SOI3tTransconductance * here->SOI3w/EffectiveLength; - /* reset mu_eff to ambient temp value in SI units */ - here->SOI3ueff = here->SOI3tTransconductance/ - model->SOI3frontOxideCapFactor; - FrontOxideCap = model->SOI3frontOxideCapFactor * EffectiveLength * - here->SOI3w; - BackOxideCap = model->SOI3backOxideCapFactor * EffectiveLength * - here->SOI3w; - /* - * ok - now to do the start-up operations - * - * we must get values for vbs, vds, vgfs and vgbs from somewhere - * so we either predict them or recover them from last iteration - * These are the two most common cases - either a prediction - * step or the general iteration step and they - * share some code, so we put them first - others later on - */ - - /* yeah, but we'll then use vsb and vdb for the real work */ - -/* we will use conventional voltages to save * - * work rewriting the convergence criteria */ - - if((ckt->CKTmode & (MODEINITFLOAT | MODEINITPRED | MODEINITSMSIG - | MODEINITTRAN)) || - ( (ckt->CKTmode & MODEINITFIX) && (!here->SOI3off) ) ) - { -#ifndef PREDICTOR - if(ckt->CKTmode & (MODEINITPRED | MODEINITTRAN) ) - { - - /* predictor step */ - - xfact=ckt->CKTdelta/ckt->CKTdeltaOld[1]; - *(ckt->CKTstate0 + here->SOI3vbs) = - *(ckt->CKTstate1 + here->SOI3vbs); - vbs = (1+xfact)* (*(ckt->CKTstate1 + here->SOI3vbs)) - -(xfact * (*(ckt->CKTstate2 + here->SOI3vbs))); - *(ckt->CKTstate0 + here->SOI3vgfs) = - *(ckt->CKTstate1 + here->SOI3vgfs); - vgfs = (1+xfact)* (*(ckt->CKTstate1 + here->SOI3vgfs)) - -(xfact * (*(ckt->CKTstate2 + here->SOI3vgfs))); - *(ckt->CKTstate0 + here->SOI3vgbs) = - *(ckt->CKTstate1 + here->SOI3vgbs); - vgbs = (1+xfact)* (*(ckt->CKTstate1 + here->SOI3vgbs)) - -(xfact * (*(ckt->CKTstate2 + here->SOI3vgbs))); - *(ckt->CKTstate0 + here->SOI3vds) = - *(ckt->CKTstate1 + here->SOI3vds); - vds = (1+xfact)* (*(ckt->CKTstate1 + here->SOI3vds)) - -(xfact * (*(ckt->CKTstate2 + here->SOI3vds))); - *(ckt->CKTstate0 + here->SOI3vbd) = - *(ckt->CKTstate0 + here->SOI3vbs)- - *(ckt->CKTstate0 + here->SOI3vds); - *(ckt->CKTstate0 + here->SOI3deltaT) = - *(ckt->CKTstate1 + here->SOI3deltaT); - deltaT = MAX(0,(1+xfact)* (*(ckt->CKTstate1 + here->SOI3deltaT)) - -(xfact * (*(ckt->CKTstate2 + here->SOI3deltaT)))); - /* need to stop deltaT being -ve */ - - /* JimB - 19/5/99 */ - if (here->SOI3numThermalNodes == 0) - { - deltaT1=deltaT2=deltaT3=deltaT4=deltaT5=0.0; - } - if (here->SOI3numThermalNodes == 1) - { - deltaT1=deltaT; - deltaT2=deltaT3=deltaT4=deltaT5=0.0; - } - if (here->SOI3numThermalNodes == 2) - { - deltaT1 = MAX(0,(1+xfact)* (*(ckt->CKTstate1 + here->SOI3deltaT1)) - -(xfact * (*(ckt->CKTstate2 + here->SOI3deltaT1)))); - deltaT2 = MAX(0,(1+xfact)* (*(ckt->CKTstate1 + here->SOI3deltaT2)) - -(xfact * (*(ckt->CKTstate2 + here->SOI3deltaT2)))); - deltaT3=deltaT4=deltaT5=0.0; - } - if (here->SOI3numThermalNodes == 3) - { - deltaT1 = MAX(0,(1+xfact)* (*(ckt->CKTstate1 + here->SOI3deltaT1)) - -(xfact * (*(ckt->CKTstate2 + here->SOI3deltaT1)))); - deltaT2 = MAX(0,(1+xfact)* (*(ckt->CKTstate1 + here->SOI3deltaT2)) - -(xfact * (*(ckt->CKTstate2 + here->SOI3deltaT2)))); - deltaT3 = MAX(0,(1+xfact)* (*(ckt->CKTstate1 + here->SOI3deltaT3)) - -(xfact * (*(ckt->CKTstate2 + here->SOI3deltaT3)))); - deltaT4=deltaT5=0.0; - } - if (here->SOI3numThermalNodes == 4) - { - deltaT1 = MAX(0,(1+xfact)* (*(ckt->CKTstate1 + here->SOI3deltaT1)) - -(xfact * (*(ckt->CKTstate2 + here->SOI3deltaT1)))); - deltaT2 = MAX(0,(1+xfact)* (*(ckt->CKTstate1 + here->SOI3deltaT2)) - -(xfact * (*(ckt->CKTstate2 + here->SOI3deltaT2)))); - deltaT3 = MAX(0,(1+xfact)* (*(ckt->CKTstate1 + here->SOI3deltaT3)) - -(xfact * (*(ckt->CKTstate2 + here->SOI3deltaT3)))); - deltaT4 = MAX(0,(1+xfact)* (*(ckt->CKTstate1 + here->SOI3deltaT4)) - -(xfact * (*(ckt->CKTstate2 + here->SOI3deltaT4)))); - deltaT5=0.0; - } - if (here->SOI3numThermalNodes == 5) - { - deltaT1 = MAX(0,(1+xfact)* (*(ckt->CKTstate1 + here->SOI3deltaT1)) - -(xfact * (*(ckt->CKTstate2 + here->SOI3deltaT1)))); - deltaT2 = MAX(0,(1+xfact)* (*(ckt->CKTstate1 + here->SOI3deltaT2)) - -(xfact * (*(ckt->CKTstate2 + here->SOI3deltaT2)))); - deltaT3 = MAX(0,(1+xfact)* (*(ckt->CKTstate1 + here->SOI3deltaT3)) - -(xfact * (*(ckt->CKTstate2 + here->SOI3deltaT3)))); - deltaT4 = MAX(0,(1+xfact)* (*(ckt->CKTstate1 + here->SOI3deltaT4)) - -(xfact * (*(ckt->CKTstate2 + here->SOI3deltaT4)))); - deltaT5 =MAX(0,deltaT-deltaT1-deltaT2-deltaT3-deltaT4); - } - - *(ckt->CKTstate0 + here->SOI3idrain) = - *(ckt->CKTstate1 + here->SOI3idrain); - *(ckt->CKTstate0 + here->SOI3cgfgf) = - *(ckt->CKTstate1 + here->SOI3cgfgf); - *(ckt->CKTstate0 + here->SOI3cgfd) = - *(ckt->CKTstate1 + here->SOI3cgfd); - *(ckt->CKTstate0 + here->SOI3cgfs) = - *(ckt->CKTstate1 + here->SOI3cgfs); - *(ckt->CKTstate0 + here->SOI3cgfdeltaT) = - *(ckt->CKTstate1 + here->SOI3cgfdeltaT); - *(ckt->CKTstate0 + here->SOI3cgfgb) = - *(ckt->CKTstate1 + here->SOI3cgfgb); - *(ckt->CKTstate0 + here->SOI3csgf) = - *(ckt->CKTstate1 + here->SOI3csgf); - *(ckt->CKTstate0 + here->SOI3csd) = - *(ckt->CKTstate1 + here->SOI3csd); - *(ckt->CKTstate0 + here->SOI3css) = - *(ckt->CKTstate1 + here->SOI3css); - *(ckt->CKTstate0 + here->SOI3csdeltaT) = - *(ckt->CKTstate1 + here->SOI3csdeltaT); - *(ckt->CKTstate0 + here->SOI3csgb) = - *(ckt->CKTstate1 + here->SOI3csgb); - *(ckt->CKTstate0 + here->SOI3cdgf) = - *(ckt->CKTstate1 + here->SOI3cdgf); - *(ckt->CKTstate0 + here->SOI3cdd) = - *(ckt->CKTstate1 + here->SOI3cdd); - *(ckt->CKTstate0 + here->SOI3cds) = - *(ckt->CKTstate1 + here->SOI3cds); - *(ckt->CKTstate0 + here->SOI3cddeltaT) = - *(ckt->CKTstate1 + here->SOI3cddeltaT); - *(ckt->CKTstate0 + here->SOI3cdgb) = - *(ckt->CKTstate1 + here->SOI3cdgb); - *(ckt->CKTstate0 + here->SOI3cgbgf) = - *(ckt->CKTstate1 + here->SOI3cgbgf); - *(ckt->CKTstate0 + here->SOI3cgbd) = - *(ckt->CKTstate1 + here->SOI3cgbd); - *(ckt->CKTstate0 + here->SOI3cgbs) = - *(ckt->CKTstate1 + here->SOI3cgbs); - *(ckt->CKTstate0 + here->SOI3cgbdeltaT) = - *(ckt->CKTstate1 + here->SOI3cgbdeltaT); - *(ckt->CKTstate0 + here->SOI3cgbgb) = - *(ckt->CKTstate1 + here->SOI3cgbgb); - *(ckt->CKTstate0 + here->SOI3cBJTbsbs) = - *(ckt->CKTstate1 + here->SOI3cBJTbsbs); - *(ckt->CKTstate0 + here->SOI3cBJTbsdeltaT) = - *(ckt->CKTstate1 + here->SOI3cBJTbsdeltaT); - *(ckt->CKTstate0 + here->SOI3cBJTbdbd) = - *(ckt->CKTstate1 + here->SOI3cBJTbdbd); - *(ckt->CKTstate0 + here->SOI3cBJTbddeltaT) = - *(ckt->CKTstate1 + here->SOI3cBJTbddeltaT); - } - else - { -#endif /* PREDICTOR */ - - /* general iteration */ - - vbs = model->SOI3type * ( - *(ckt->CKTrhsOld+here->SOI3bNode) - - *(ckt->CKTrhsOld+here->SOI3sNodePrime)); - vgfs = model->SOI3type * ( - *(ckt->CKTrhsOld+here->SOI3gfNode) - - *(ckt->CKTrhsOld+here->SOI3sNodePrime)); - vgbs = model->SOI3type * ( - *(ckt->CKTrhsOld+here->SOI3gbNode) - - *(ckt->CKTrhsOld+here->SOI3sNodePrime)); - vds = model->SOI3type * ( - *(ckt->CKTrhsOld+here->SOI3dNodePrime) - - *(ckt->CKTrhsOld+here->SOI3sNodePrime)); - deltaT = MAX(0,*(ckt->CKTrhsOld+here->SOI3toutNode)); - /* voltage deltaT is V(tout) wrt ground - and shoule be positive */ -/* the next lot are needed for the (extra) thermal capacitances */ - /* JimB - 19/5/99 */ - if (here->SOI3numThermalNodes == 0) - { - deltaT1=deltaT2=deltaT3=deltaT4=deltaT5=0; - } - if (here->SOI3numThermalNodes == 1) - { - deltaT1=deltaT; - deltaT2=deltaT3=deltaT4=deltaT5=0; - } - if (here->SOI3numThermalNodes == 2) - { - deltaT2 = MAX(0,*(ckt->CKTrhsOld+here->SOI3tout1Node)); - deltaT1 = deltaT - deltaT2; - deltaT3=deltaT4=deltaT5=0; - } - if (here->SOI3numThermalNodes == 3) - { - deltaT3 = MAX(0,*(ckt->CKTrhsOld+here->SOI3tout2Node)); - deltaT2 = MAX(0,*(ckt->CKTrhsOld+here->SOI3tout1Node) - deltaT3); - deltaT1 = deltaT - deltaT2 - deltaT3; - deltaT4=deltaT5=0; - } - if (here->SOI3numThermalNodes == 4) - { - deltaT4 = MAX(0,*(ckt->CKTrhsOld+here->SOI3tout3Node)); - deltaT3 = MAX(0,*(ckt->CKTrhsOld+here->SOI3tout2Node) - deltaT4); - deltaT2 = MAX(0,*(ckt->CKTrhsOld+here->SOI3tout1Node) - deltaT3 - deltaT4); - deltaT1 = deltaT - deltaT2 - deltaT3 - deltaT4; - deltaT5=0; - } - if (here->SOI3numThermalNodes == 5) - { - deltaT5 = MAX(0,*(ckt->CKTrhsOld+here->SOI3tout4Node)); - deltaT4 = MAX(0,*(ckt->CKTrhsOld+here->SOI3tout3Node) - deltaT5); - deltaT3 = MAX(0,*(ckt->CKTrhsOld+here->SOI3tout2Node) - deltaT4 - deltaT5); - deltaT2 = MAX(0,*(ckt->CKTrhsOld+here->SOI3tout1Node) - deltaT3 - deltaT4 - deltaT5); - deltaT1 = deltaT - deltaT2 - deltaT3 - deltaT4 - deltaT5; - } -#ifndef PREDICTOR - } -#endif /* PREDICTOR */ - - - /* now some common crunching for some more useful quantities */ - /* bloody useful in our case */ - - vbd=vbs-vds; - vdb=-vbd; - vsb=-vbs; - - vgfd=vgfs-vds; - vgbd=vgbs-vds; - vgbb=vgbs-vbs; - vgfdo = *(ckt->CKTstate0 + here->SOI3vgfs) - - *(ckt->CKTstate0 + here->SOI3vds); - vgbdo = *(ckt->CKTstate0 + here->SOI3vgbs) - - *(ckt->CKTstate0 + here->SOI3vds); - delvbs = vbs - *(ckt->CKTstate0 + here->SOI3vbs); - delvbd = vbd - *(ckt->CKTstate0 + here->SOI3vbd); - delvgfs = vgfs - *(ckt->CKTstate0 + here->SOI3vgfs); - delvgbs = vgbs - *(ckt->CKTstate0 + here->SOI3vgbs); - delvds = vds - *(ckt->CKTstate0 + here->SOI3vds); - delvgfd = vgfd-vgfdo; - delvgbd = vgbd-vgbdo; - deldeltaT = deltaT - *(ckt->CKTstate0 + here->SOI3deltaT); - - /* these are needed for convergence testing */ - /* we're keeping these the same as convergence on - vgfs, vbs, vbd, vgbs, deltaT is equiv to conv. - on vgfb, vsb, vdb, vgb_b, deltaT */ - - if (here->SOI3mode >= 0) { /* normal */ - idhat= - here->SOI3id- - here->SOI3gbd * delvbd - - here->SOI3gbdT * deldeltaT + /* for -ibd bit of id */ - (here->SOI3gmbs + - here->SOI3gMmbs) * delvbs + - (here->SOI3gmf + - here->SOI3gMmf) * delvgfs + - (here->SOI3gmb + - here->SOI3gMmb) * delvgbs + - (here->SOI3gds + - here->SOI3gMd) * delvds + - (here->SOI3gt + - here->SOI3gMdeltaT) * deldeltaT + - here->SOI3gBJTdb_bs * delvbs + - here->SOI3gBJTdb_deltaT * deldeltaT; - ibhat= - here->SOI3ibs + - here->SOI3ibd + - here->SOI3gbd * delvbd + - here->SOI3gbdT * deldeltaT + - here->SOI3gbs * delvbs + - here->SOI3gbsT * deldeltaT - - here->SOI3iMdb - - here->SOI3gMmbs * delvbs - - here->SOI3gMmf * delvgfs - - here->SOI3gMmb * delvgbs - - here->SOI3gMd * delvds - - here->SOI3gMdeltaT * deldeltaT - - here->SOI3iBJTsb - - here->SOI3gBJTsb_bd * delvbd - - here->SOI3gBJTsb_deltaT * deldeltaT - - here->SOI3iBJTdb - - here->SOI3gBJTdb_bs * delvbs - - here->SOI3gBJTdb_deltaT * deldeltaT; - } else { /* A over T */ - idhat= - here->SOI3id - - ( here->SOI3gbd + - here->SOI3gmbs) * delvbd - - (here->SOI3gmf) * delvgfd - - (here->SOI3gmb) * delvgbd + - (here->SOI3gds) * delvds - - (here->SOI3gt + - here->SOI3gbdT) * deldeltaT + - here->SOI3gBJTdb_bs * delvbs + - here->SOI3gBJTdb_deltaT * deldeltaT; - ibhat= - here->SOI3ibs + - here->SOI3ibd + - here->SOI3gbd * delvbd + - here->SOI3gbdT * deldeltaT + - here->SOI3gbs * delvbs + - here->SOI3gbsT * deldeltaT - - here->SOI3iMsb - - here->SOI3gMmbs * delvbd - - here->SOI3gMmf * delvgfd - - here->SOI3gMmb * delvgbd + - here->SOI3gMd * delvds - /* gMd should go with vsd */ - here->SOI3gMdeltaT * deldeltaT - - here->SOI3iBJTsb - - here->SOI3gBJTsb_bd * delvbd - - here->SOI3gBJTsb_deltaT * deldeltaT - - here->SOI3iBJTdb - - here->SOI3gBJTdb_bs * delvbs - - here->SOI3gBJTdb_deltaT * deldeltaT; - } -/* thermal current source comparator */ - iPthat =here->SOI3iPt + - here->SOI3gPmbs * delvbs + - here->SOI3gPmf * delvgfs + - here->SOI3gPmb * delvgbs + - here->SOI3gPds * delvds * here->SOI3mode + - here->SOI3gPdT * deldeltaT; - -#ifndef NOBYPASS - /* now lets see if we can bypass (ugh) */ - /* the following mess should be one if statement, but - * many compilers can't handle it all at once, so it - * is split into several successive if statements - */ - /* bypass just needs to check any four voltages have not changed - so leave as before to avoid hassle */ - tempv = MAX(fabs(ibhat),fabs(here->SOI3ibs - + here->SOI3ibd-here->SOI3iMsb - - here->SOI3iMdb - here->SOI3iBJTdb - - here->SOI3iBJTsb))+ckt->CKTabstol; - if((!(ckt->CKTmode & (MODEINITPRED|MODEINITTRAN|MODEINITSMSIG) - )) && (ckt->CKTbypass) ) - if ( (fabs(ibhat-(here->SOI3ibs + - here->SOI3ibd-here->SOI3iMdb - - here->SOI3iMsb - here->SOI3iBJTdb - - here->SOI3iBJTsb)) < ckt->CKTreltol * - tempv)) - if( (fabs(delvbs) < (ckt->CKTreltol * MAX(fabs(vbs), - fabs(*(ckt->CKTstate0+here->SOI3vbs)))+ - ckt->CKTvoltTol))) - if ( (fabs(delvbd) < (ckt->CKTreltol * MAX(fabs(vbd), - fabs(*(ckt->CKTstate0+here->SOI3vbd)))+ - ckt->CKTvoltTol)) ) - if( (fabs(delvgfs) < (ckt->CKTreltol * MAX(fabs(vgfs), - fabs(*(ckt->CKTstate0+here->SOI3vgfs)))+ - ckt->CKTvoltTol))) - if( (fabs(delvgbs) < (ckt->CKTreltol * MAX(fabs(vgbs), - fabs(*(ckt->CKTstate0+here->SOI3vgbs)))+ - ckt->CKTvoltTol))) - if ( (fabs(delvds) < (ckt->CKTreltol * MAX(fabs(vds), - fabs(*(ckt->CKTstate0+here->SOI3vds)))+ - ckt->CKTvoltTol)) ) - if ( (fabs(deldeltaT) < (ckt->CKTreltol * MAX(fabs(deltaT), - fabs(*(ckt->CKTstate0+here->SOI3deltaT)))+ - ckt->CKTvoltTol)) ) - if( (fabs(iPthat- here->SOI3iPt) < - ckt->CKTreltol * MAX(fabs(iPthat),fabs( - here->SOI3iPt)) + ckt->CKTabstol) ) - if( (fabs(idhat- here->SOI3id) < - ckt->CKTreltol * MAX(fabs(idhat),fabs( - here->SOI3id)) + ckt->CKTabstol) ) { - /* bypass code */ - /* nothing interesting has changed since last - * iteration on this device, so we just - * copy all the values computed last iteration out - * and keep going - */ - vbs = *(ckt->CKTstate0 + here->SOI3vbs); - vbd = *(ckt->CKTstate0 + here->SOI3vbd); - vgfs = *(ckt->CKTstate0 + here->SOI3vgfs); - vgbs = *(ckt->CKTstate0 + here->SOI3vgbs); - vds = *(ckt->CKTstate0 + here->SOI3vds); - deltaT = *(ckt->CKTstate0 + here->SOI3deltaT); - deltaT1 = *(ckt->CKTstate0 + here->SOI3deltaT1); - deltaT2 = *(ckt->CKTstate0 + here->SOI3deltaT2); - deltaT3 = *(ckt->CKTstate0 + here->SOI3deltaT3); - deltaT4 = *(ckt->CKTstate0 + here->SOI3deltaT4); - deltaT5 = *(ckt->CKTstate0 + here->SOI3deltaT5); - /* and now the extra ones */ - vsb=-vbs; - vdb=-vbd; - vgfb = vgfs - vbs; - vgbb = vgbs - vbs; - - /* JimB - 15/9/99 */ - /* Code for multiple thermal time constants. Start by moving all */ - /* rt constants into arrays. */ - rtargs[0]=here->SOI3rt; - rtargs[1]=here->SOI3rt1; - rtargs[2]=here->SOI3rt2; - rtargs[3]=here->SOI3rt3; - rtargs[4]=here->SOI3rt4; - - /* Set all conductance components to zero. */ - grt[0]=grt[1]=grt[2]=grt[3]=grt[4]=0.0; - /* Now calculate conductances from rt. */ - /* Don't need to worry about divide by zero when calculating */ - /* grt components, as soi3setup() only creates a thermal node */ - /* if corresponding rt is greater than zero. */ - for(tnodeindex=0;tnodeindexSOI3numThermalNodes;tnodeindex++) - { - grt[tnodeindex]=1/rtargs[tnodeindex]; - } - /* End JimB */ - - vgfd = vgfs - vds; - vgbd = vgbs - vds; - if (here->SOI3mode==1) - { - idrain = here->SOI3id + here->SOI3ibd - here->SOI3iMdb - - here->SOI3iBJTdb; - } - else - { - idrain = -here->SOI3id - here->SOI3ibd - + here->SOI3iBJTdb; - } - - /* Pt doesn't need changing as it's in here->SOI3iPt */ - - if((ckt->CKTmode & (MODETRAN | MODEAC)) || - (ckt->CKTmode & MODETRANOP)) - { - cgfgf = *(ckt->CKTstate0 + here->SOI3cgfgf); - cgfd = *(ckt->CKTstate0 + here->SOI3cgfd); - cgfs = *(ckt->CKTstate0 + here->SOI3cgfs); - cgfdeltaT = *(ckt->CKTstate0 + here->SOI3cgfdeltaT); - cgfgb = *(ckt->CKTstate0 + here->SOI3cgfgb); - csgf = *(ckt->CKTstate0 + here->SOI3csgf); - csd = *(ckt->CKTstate0 + here->SOI3csd); - css = *(ckt->CKTstate0 + here->SOI3css); - csdeltaT = *(ckt->CKTstate0 + here->SOI3csdeltaT); - csgb = *(ckt->CKTstate0 + here->SOI3csgb); - cdgf = *(ckt->CKTstate0 + here->SOI3cdgf); - cdd = *(ckt->CKTstate0 + here->SOI3cdd); - cds = *(ckt->CKTstate0 + here->SOI3cds); - cddeltaT = *(ckt->CKTstate0 + here->SOI3cddeltaT); - cdgb = *(ckt->CKTstate0 + here->SOI3cdgb); - cgbgf = *(ckt->CKTstate0 + here->SOI3cgbgf); - cgbd = *(ckt->CKTstate0 + here->SOI3cgbd); - cgbs = *(ckt->CKTstate0 + here->SOI3cgbs); - cgbdeltaT = *(ckt->CKTstate0 + here->SOI3cgbdeltaT); - cgbgb = *(ckt->CKTstate0 + here->SOI3cgbgb); - cbgf = -(cgfgf + cdgf + csgf + cgbgf); - cbd = -(cgfd + cdd + csd + cgbd); - cbs = -(cgfs + cds + css + cgbs); - cbdeltaT = -(cgfdeltaT + cddeltaT + csdeltaT + cgbdeltaT); - cbgb = -(cgfgb + cdgb + csgb + cgbgb); - qgatef = *(ckt->CKTstate0 + here->SOI3qgf); - qdrn = *(ckt->CKTstate0 + here->SOI3qd); - qsrc = *(ckt->CKTstate0 + here->SOI3qs); - qgateb = *(ckt->CKTstate0 + here->SOI3qgb); - qbody = -(qgatef + qdrn + qsrc + qgateb); - ByPass = 1; - goto bypass1; - } - goto bypass2; - } -#endif /*NOBYPASS*/ - - /* ok - bypass is out, do it the hard way */ - - von = model->SOI3type * here->SOI3von; - -#ifndef NODELIMITING - /* - * limiting - * we want to keep device voltages from changing - * so fast that the exponentials churn out overflows - * and similar rudeness - */ - - if(*(ckt->CKTstate0 + here->SOI3vds) >=0) - { - vgfs = DEVfetlim(vgfs,*(ckt->CKTstate0 + here->SOI3vgfs) - ,von); - vds = vgfs - vgfd; - vds = DEVlimvds(vds,*(ckt->CKTstate0 + here->SOI3vds)); - vgfd = vgfs - vds; - } - else - { - vgfd = DEVfetlim(vgfd,vgfdo,von); - vds = vgfs - vgfd; - if(!(ckt->CKTfixLimit)) - { - vds = -DEVlimvds(-vds,-(*(ckt->CKTstate0 + - here->SOI3vds))); - } - vgfs = vgfd + vds; - } - if(vds >= 0) - { - vbs = DEVsoipnjlim(vbs,*(ckt->CKTstate0 + here->SOI3vbs), - vt,here->SOI3sourceVcrit,&Check); - vbd = vbs-vds; - } - else - { - vbd = DEVsoipnjlim(vbd,*(ckt->CKTstate0 + here->SOI3vbd), - vt,here->SOI3drainVcrit,&Check); - vbs = vbd + vds; - } - - - /* and now some limiting of the temperature rise */ - if (deltaT>(10 + *(ckt->CKTstate0 + here->SOI3deltaT))) - { - deltaT = 10 + *(ckt->CKTstate0 + here->SOI3deltaT); - - /* need limiting, therefore must also impose limits on other - thermal voltages. - */ - - /* JimB - 19/5/99 */ - if (here->SOI3numThermalNodes == 0) - { - deltaT1=deltaT2=deltaT3=deltaT4=deltaT5=0; - } - if (here->SOI3numThermalNodes == 1) - { - deltaT1=deltaT; - deltaT2=deltaT3=deltaT4=deltaT5=0; - } - if (here->SOI3numThermalNodes == 2) - { - deltaT2 = MAX(0,*(ckt->CKTrhsOld+here->SOI3tout1Node)); - deltaT1 = deltaT - deltaT2; - deltaT3=deltaT4=deltaT5=0; - } - if (here->SOI3numThermalNodes == 3) - { - deltaT3 = MAX(0,*(ckt->CKTrhsOld+here->SOI3tout2Node)); - deltaT2 = MAX(0,*(ckt->CKTrhsOld+here->SOI3tout1Node) - deltaT3); - deltaT1 = deltaT - deltaT2 - deltaT3; - deltaT4=deltaT5=0; - } - if (here->SOI3numThermalNodes == 4) - { - deltaT4 = MAX(0,*(ckt->CKTrhsOld+here->SOI3tout3Node)); - deltaT3 = MAX(0,*(ckt->CKTrhsOld+here->SOI3tout2Node) - deltaT4); - deltaT2 = MAX(0,*(ckt->CKTrhsOld+here->SOI3tout1Node) - deltaT3 - deltaT4); - deltaT1 = deltaT - deltaT2 - deltaT3 - deltaT4; - deltaT5=0; - } - if (here->SOI3numThermalNodes == 5) - { - deltaT5 = MAX(0,*(ckt->CKTrhsOld+here->SOI3tout4Node)); - deltaT4 = MAX(0,*(ckt->CKTrhsOld+here->SOI3tout3Node) - deltaT5); - deltaT3 = MAX(0,*(ckt->CKTrhsOld+here->SOI3tout2Node) - deltaT4 - deltaT5); - deltaT2 = MAX(0,*(ckt->CKTrhsOld+here->SOI3tout1Node) - deltaT3 - deltaT4 - deltaT5); - deltaT1 = deltaT - deltaT2 - deltaT3 - deltaT4 - deltaT5; - } - - Check = 1; - } -#endif /*NODELIMITING*/ - - } else { - - /* ok - not one of the simple cases, so we have to - * look at all of the possibilities for why we were - * called. We still just initialize the three voltages - */ - - if((ckt->CKTmode & MODEINITJCT) && !here->SOI3off) - { - vds= model->SOI3type * here->SOI3icVDS; - vgfs= model->SOI3type * here->SOI3icVGFS; - vgbs= model->SOI3type * here->SOI3icVGBS; - vbs= model->SOI3type * here->SOI3icVBS; - deltaT=deltaT1=deltaT2=deltaT3=deltaT4=deltaT5=0.0; - if((vds==0) && (vgfs==0) && (vbs==0) && (vgbs==0) && - ((ckt->CKTmode & - (MODETRAN|MODEDCOP|MODEDCTRANCURVE)) || - (!(ckt->CKTmode & MODEUIC)))) - { - vbs = -1; - vgfs = model->SOI3type * here->SOI3tVto; - vds = 0; - vgbs = 0; - deltaT=deltaT1=deltaT2=deltaT3=deltaT4=deltaT5=0.0; - } - } - else - { - vbs=vgfs=vds=vgbs=deltaT=deltaT1=deltaT2=deltaT3=deltaT4=deltaT5=0.0; - } - } - - - /* - * now all the preliminaries are over - we can start doing the - * real work - */ - vbd = vbs - vds; - vgfd = vgfs - vds; - vgbd = vgbs - vds; - vgfb = vgfs - vbs; - vgbb = vgbs - vbs; - vsb = -vbs; - vdb = -vbd; - - - /* now to determine whether the user was able to correctly - * identify the source and drain of his device - */ - if(vds >= 0) { - /* normal mode */ - here->SOI3mode = 1; - } else { - /* inverse mode */ - here->SOI3mode = -1; - } - - { /* begin block */ - - /* - * This block works out drain current and derivatives. - * It does this via the calculation of the surface potential - * which is a bit complex mostly for reasons of continuity - * and robustness - c'est la vie. - * - */ - - /* the following variables are local to this code block until - * it is obvious that they can be made global - */ - double vg; - double eta_s; /* 1+Citf/Cof */ - double gamma,sigma; - double Egy = 0.0,vgy,Sgy; - double psi_ss; - double AL,A0,LL,L0; - double ALx,A0x,EAL = 0.0,EA0 = 0.0; - double logterm0,logtermL; - double Vgconst0,VgconstL; - double Egx0 = 0.0,EgxL = 0.0; - double vgx0,vgxL; - double psi_si0,psi_siL,psi_st0; - double Esi0 = 0.0,EsiL = 0.0,Ess0 = 0.0; - double theta2; - double TVF; /* thermal velocity-saturation factor */ - double Mmob; - double sqt0,sqt0one; - double alpha,delta,Bf; - double vGBF,vGT,vGBT; - double PSI; - double S; - double psi_sLsat; - double Esd0 = 0.0,EsdL = 0.0; - - double psi_s0,psi_sL; - double fL,f0; - double DfL_Dvgfb,DfL_Dvdb,DfL_Dvsb,DfL_DdeltaT; - double Df0_Dvgfb,Df0_Dvdb,Df0_Dvsb,Df0_DdeltaT; - double ld,Dld_Dvgfb,Dld_Dvdb,Dld_Dvsb,Dld_DdeltaT; - - double ich0; - - double pDpsi_si0_Dvgx0,pDpsi_siL_DvgxL; - double Dvgx0_Dvgfb,pDvgx0_Dvg,Dvgx0_Dvsb,Dvgx0_Dvdb,Dvgx0_DdeltaT; - double DvgxL_Dvgfb,pDvgxL_Dvg,DvgxL_Dvsb,DvgxL_Dvdb,DvgxL_DdeltaT; - double pDpsi_si0_Dvsb,pDpsi_siL_Dvdb; - double Dpsi_si0_Dvgfb,Dpsi_si0_Dvsb,Dpsi_si0_Dvdb; - double Dpsi_siL_Dvgfb,Dpsi_siL_Dvsb,Dpsi_siL_Dvdb; - double Dpsi_ss_Dvgfb,Dpsi_ss_Dvsb,Dpsi_ss_Dvdb; - double Dpsi_st0_Dvgfb,Dpsi_st0_Dvsb,Dpsi_st0_Dvdb; - double pDdelta_Dpsi_st0; - double Dalpha_Dvgfb,Dalpha_Dvdb,Dalpha_Dvsb,Dalpha_DdeltaT; - double DPSI_Dvgfb,DPSI_Dvdb,DPSI_Dvsb,DPSI_DdeltaT; - double pDBf_Dpsi_st0,DvGT_Dvgfb,DvGT_Dvsb,DvGT_Dvdb,DvGT_DdeltaT; - double D,DS_Dvgfb,DS_Dvsb,DS_Dvdb,DS_DdeltaT; - double Dpsi_sLsat_Dvgfb,Dpsi_sLsat_Dvsb,Dpsi_sLsat_Dvdb; - double gmg,gmd,gms,gmt; - double Dpsi_si0_DdeltaT,Dpsi_siL_DdeltaT; - double Dpsi_ss_DdeltaT,Dpsi_st0_DdeltaT; - double Dpsi_sLsat_DdeltaT; - double Dpsi_sL_Dvgfb,Dpsi_s0_Dvgfb,Dpsi_sL_Dvdb,Dpsi_s0_Dvdb; - double Dpsi_sL_Dvsb,Dpsi_s0_Dvsb,Dpsi_sL_DdeltaT,Dpsi_s0_DdeltaT; - - double vdsat; - double Dvdsat_Dvgfb,Dvdsat_Dvsb,Dvdsat_Dvdb,Dvdsat_DdeltaT; - int i; - double vds2m,vdsat2m,Em,vdslim; - double Dvdslim_Dvgfb,Dvdslim_Dvdb,Dvdslim_Dvsb,Dvdslim_DdeltaT; - double Vmx; - double DVmx_Dvgfb,DVmx_Dvdb,DVmx_Dvsb,DVmx_DdeltaT; - double Vm1,Em1,Vm1x; - double DVm1x_Dvgfb,DVm1x_Dvdb,DVm1x_Dvsb,DVm1x_DdeltaT; - double vgeff,lm,lmeff,Elm,Dlm_Dvgfb,Dlm_Dvdb,Dlm_Dvsb,Dlm_DdeltaT; - - double Mminus1=0; - double EM,betaM; - double gMg,gMd,gMs; - double Fm; /* mobility degradation factor */ - double Y; /* channel length modulation factor */ - double tmp,tmp1; /* temporary var to aid pre-calculation */ - double TMF; /* thermal mobility factor */ - int vgx0trans,vgxLtrans; /* flags to indicate if vg transform performed */ - int psi_s0_trans,psi_sL_trans=0; - int Ess0_trans,Esd0_trans,EsdL_trans; - int A0trans,ALtrans; - - double vT,EchiD,EchiD1; - double BetaBJTeff; - -/* Now we use a nasty trick - if device is A over T, must "swap" drain and source - potentials. we do a literal switch and change it back for the outside world. */ - if (here->SOI3mode == -1) { - SWAP(double, vsb, vdb); - } - -/* Intrinsic Electrical Bit - has a bit of thermal due to TTC */ - sigma = model->SOI3sigma/(EffectiveLength); - eta_s = 1 + (model->SOI3C_ssf/model->SOI3frontOxideCapFactor); - vg = vgfb - here->SOI3tVfbF * model->SOI3type - + sigma*(here->SOI3mode*vds) - - model->SOI3chiFB*deltaT; - gamma = model->SOI3gamma * (1 + (model->SOI3deltaW)/(here->SOI3w)) - * (1 - (model->SOI3deltaL)/EffectiveLength); -/* must introduce some limiting to prevent exp overflow */ - if (vg > (vt*MAX_EXP_ARG)) { - vgy = vg; - } else { - Egy = exp(vg/vt); - vgy = vt*log(1+Egy); - } - Sgy = sqrt((vgy/eta_s) + (gamma*gamma)/(4*eta_s*eta_s)); - psi_ss = (Sgy-0.5*gamma/eta_s)*(Sgy-0.5*gamma/eta_s); - A0 = here->SOI3tPhi + vsb; - AL = here->SOI3tPhi + vdb; - if (A0 > (vt*MAX_EXP_ARG)) { - A0x = A0; - A0trans = 0; - } else { - EA0 = exp(A0/vt); - A0x = vt * log(1+EA0); - A0trans = 1; - } - if (AL > (vt*MAX_EXP_ARG)) { - ALx = AL; - ALtrans = 0; - } else { - EAL = exp(AL/vt); - ALx = vt * log(1+EAL); - ALtrans = 1; - } -/* if vg is very large then don't need to transform - vg into vgx. -*/ - Vgconst0 = eta_s*A0x - vt*(eta_s - 1) + gamma*sqrt(A0x); - if ((vg-Vgconst0) < (5 * vt * MAX_EXP_ARG)) { - vgx0trans = 1; - Egx0 = exp((vg - Vgconst0)/(5*vt)); - vgx0 = (5*vt) * log(1 + Egx0) + Vgconst0; - } else { - vgx0trans = 0; /* no transform performed */ - vgx0 = vg; - } - - - VgconstL = eta_s*ALx - vt*(eta_s - 1) + gamma*sqrt(ALx); - if ((vg-VgconstL) < (5 * vt * MAX_EXP_ARG)) { - vgxLtrans = 1; - EgxL = exp((vg - VgconstL)/(5*vt)); - vgxL = (5*vt) * log(1 + EgxL) + VgconstL; - } else { - vgxLtrans = 0; /* no transform performed */ - vgxL = vg; - } - - L0 = vgx0 - eta_s*(A0 - vt); - LL = vgxL - eta_s*(AL - vt); - logterm0 = ((L0/gamma)*(L0/gamma) - A0)/vt; - logtermL = ((LL/gamma)*(LL/gamma) - AL)/vt; - if (logterm0<=0) { /* can only happen due to numerical problems with sqrt*/ - psi_si0 = A0 + model->SOI3chiPHI*deltaT + vt*log(vt/(gamma*gamma)); - } else { - psi_si0 = A0 + model->SOI3chiPHI*deltaT + vt*log(logterm0); - } - if (logtermL<=0) { - psi_siL = AL + model->SOI3chiPHI*deltaT + vt*log(vt/(gamma*gamma)); - } else { - psi_siL = AL + model->SOI3chiPHI*deltaT + vt*log(logtermL); - } - - if ((psi_si0-psi_ss) < vt*MAX_EXP_ARG) { - Ess0 = exp((psi_si0-psi_ss)/vt); - Ess0_trans = 1; - if (psi_si0 > (vt * MAX_EXP_ARG)) { /* psi_si0 is BIG */ - psi_st0 = psi_si0 - vt*log(1+Ess0); - psi_s0_trans = 0; - } else { - Esi0 = exp(psi_si0/vt); - psi_st0 = vt*log(1+(Esi0/(1+Ess0))); - psi_s0_trans = 1; - } - } else { - psi_st0 = psi_ss; - Ess0_trans = 0; - psi_s0_trans = 0; - } - -/* now for psi_sLsat - has thermal influence ! (if vel sat is included) */ - TMF = exp(-model->SOI3k*log(1+(deltaT/here->SOI3temp))); - sqt0 = sqrt(psi_st0+1E-25); - sqt0one = sqrt(1+psi_st0); -/* delta is formulated this way so we can change it here and nowhere else */ - delta = 0.5/sqt0one; - pDdelta_Dpsi_st0 = -0.25/((1+psi_st0)*sqt0one); - alpha = eta_s+gamma*delta; - vGBF = vg - psi_st0; - Bf = sqt0 - delta*psi_st0; - vGT = vg - gamma*Bf; - vGBT = vGT + alpha*vt; - - if(model->SOI3vsat == 0) { - theta2 = 0; - TVF = 0.0; /* could be any nominal value */ - } else { - TVF = 0.8*exp((here->SOI3temp+deltaT)/600); - theta2 = (here->SOI3tSurfMob/(model->SOI3vsat))*1e-2 /*cm to m*/ - *TMF*(1+TVF)/(EffectiveLength*(1+model->SOI3TVF0)); - /* theta2=1/(L.Ec) */ - } - Mmob = theta2 - 0.5*model->SOI3theta; - - PSI = MAX(0,(vGT/alpha) - psi_st0); - S = 0.5*(1+sqrt(1 + (2*Mmob*PSI)/(1+model->SOI3theta*vGBF))); - psi_sLsat = psi_st0 + PSI/S; - - if ((psi_si0 - psi_sLsat)<(vt*MAX_EXP_ARG)) { - Esd0 = exp((psi_si0 - psi_sLsat)/vt); - Esd0_trans = 1; - if (psi_s0_trans) { - psi_s0 = vt*log(1+Esi0/(1+Esd0)); - } else { - psi_s0 = psi_si0 - vt*log(1+Esd0); - } - } else { - psi_s0 = psi_sLsat; - Esd0_trans = 0; - } - - if ((psi_siL - psi_sLsat)<(vt*MAX_EXP_ARG)) { - EsdL = exp((psi_siL - psi_sLsat)/vt); - EsdL_trans = 1; - if (psi_siL < (vt * MAX_EXP_ARG)) { - EsiL = exp(psi_siL/vt); - psi_sL = vt*log(1+EsiL/(1+EsdL)); - psi_sL_trans = 1; - } else { - psi_sL = psi_siL - vt*log(1+EsdL); - psi_sL_trans = 0; - } - } else { - psi_sL = psi_sLsat; - EsdL_trans = 0; - } -/* if, after all that, we have impossible situation due to numerical limiting schemes ... */ - - if (psi_s0>psi_sL) { - psi_sL = psi_s0; - } - -/* now we can finally work out surface potential for source and drain end */ - -/* now surface potential is ready */ - - f0 = (vGBT - 0.5*alpha*psi_s0)*psi_s0; - fL = (vGBT - 0.5*alpha*psi_sL)*psi_sL; - - ich0 = Beta * (fL - f0); /* This is "intrinsic" bit */ - -/* now for derivatives - they're a bit of a nightmare * - * notation pD... means PARTIAL derivative whilst D... * - * means FULL derivative */ - -/* first sub-threshold */ - - if (vg > (vt*MAX_EXP_ARG)) { - Dpsi_ss_Dvgfb = (1-0.5*gamma/(eta_s*Sgy))/eta_s; - } else { - Dpsi_ss_Dvgfb = (1-0.5*gamma/(eta_s*Sgy))*(Egy/(1+Egy))/eta_s; - } - Dpsi_ss_Dvsb = Dpsi_ss_Dvgfb*(-sigma); - Dpsi_ss_Dvdb = Dpsi_ss_Dvgfb*(sigma); - Dpsi_ss_DdeltaT = Dpsi_ss_Dvgfb*(-model->SOI3chiFB); - -/* now for strong inversion */ - - pDpsi_si0_Dvgx0 = 2*vt*L0/(L0*L0-gamma*gamma*A0); - pDpsi_siL_DvgxL = 2*vt*LL/(LL*LL-gamma*gamma*AL); - - /* if vg is transformed, must have deriv accordingly, else it is 1 */ - - if (vgx0trans) { - Dvgx0_Dvgfb = pDvgx0_Dvg = Egx0/(1+Egx0); - if (A0trans) { - /* JimB - 27/8/98 */ - /* Get divide by zero errors when A0x is equal to zero */ - /* Temporary fix - add small constant to denominator */ -/* Dvgx0_Dvsb = pDvgx0_Dvg * (-sigma) + - (1-pDvgx0_Dvg)*(eta_s+0.5*gamma/sqrt(A0x))* - (EA0/(1+EA0)); */ - Dvgx0_Dvsb = pDvgx0_Dvg * (-sigma) + - (1-pDvgx0_Dvg)*(eta_s+0.5*gamma/(sqrt(A0x)+1e-25))* - (EA0/(1+EA0)); - /* End JimB */ - } else { - /* JimB - 27/8/97 */ - /* Temporary fix - add small constant to denominator */ - /*Dvgx0_Dvsb = pDvgx0_Dvg * (-sigma) + - (1-pDvgx0_Dvg)*(eta_s+0.5*gamma/sqrt(A0)); */ - Dvgx0_Dvsb = pDvgx0_Dvg * (-sigma) + - (1-pDvgx0_Dvg)*(eta_s+0.5*gamma/(sqrt(A0)+1e-25)); - /* End JimB */ - } - Dvgx0_Dvdb = pDvgx0_Dvg*(sigma); - Dvgx0_DdeltaT = pDvgx0_Dvg*(-model->SOI3chiFB); - } else { - Dvgx0_Dvgfb = pDvgx0_Dvg = 1; - Dvgx0_Dvsb = (-sigma); - Dvgx0_Dvdb = (sigma); - Dvgx0_DdeltaT = (-model->SOI3chiFB); - } - - if (vgxLtrans) { - DvgxL_Dvgfb = pDvgxL_Dvg = EgxL/(1+EgxL); - DvgxL_Dvsb = pDvgxL_Dvg * (-sigma); - if (ALtrans) { - /* JimB - 27/8/98 */ - /* Get divide by zero errors when ALx is equal to zero */ - /* Temporary fix - add small constant to denominator */ - /*DvgxL_Dvdb = pDvgxL_Dvg * (sigma) + - (1-pDvgxL_Dvg)*(eta_s+0.5*gamma/sqrt(ALx))* - (EAL/(1+EAL)); */ - DvgxL_Dvdb = pDvgxL_Dvg * (sigma) + - (1-pDvgxL_Dvg)*(eta_s+0.5*gamma/(sqrt(ALx)+1e-25))* - (EAL/(1+EAL)); - /* End JimB */ - } else { - /* JimB - 27/8/97 */ - /* Temporary fix - add small constant to denominator */ -/* DvgxL_Dvdb = pDvgxL_Dvg * (sigma) + - (1-pDvgxL_Dvg)*(eta_s+0.5*gamma/sqrt(AL)); */ - DvgxL_Dvdb = pDvgxL_Dvg * (sigma) + - (1-pDvgxL_Dvg)*(eta_s+0.5*gamma/(sqrt(AL)+1e-25)); - /* End JimB */ - } - DvgxL_DdeltaT = pDvgxL_Dvg * (-model->SOI3chiFB); - } else { - DvgxL_Dvgfb = 1; - DvgxL_Dvsb = (-sigma); - DvgxL_Dvdb = (sigma); - DvgxL_DdeltaT = (-model->SOI3chiFB); - } - - pDpsi_si0_Dvsb = 1 - (2*vt*eta_s*L0+vt*gamma*gamma)/(L0*L0-gamma*gamma*A0); - pDpsi_siL_Dvdb = 1 - (2*vt*eta_s*LL+vt*gamma*gamma)/(LL*LL-gamma*gamma*AL); - - Dpsi_si0_Dvgfb = pDpsi_si0_Dvgx0*Dvgx0_Dvgfb; - Dpsi_si0_Dvsb = pDpsi_si0_Dvgx0*Dvgx0_Dvsb + pDpsi_si0_Dvsb; - Dpsi_si0_Dvdb = pDpsi_si0_Dvgx0*Dvgx0_Dvdb; - Dpsi_si0_DdeltaT = model->SOI3chiPHI + - pDpsi_si0_Dvgx0*Dvgx0_DdeltaT; - - Dpsi_siL_Dvgfb = pDpsi_siL_DvgxL*DvgxL_Dvgfb; - Dpsi_siL_Dvsb = pDpsi_siL_DvgxL*DvgxL_Dvsb; - Dpsi_siL_Dvdb = pDpsi_siL_DvgxL*DvgxL_Dvdb + pDpsi_siL_Dvdb; - Dpsi_siL_DdeltaT = model->SOI3chiPHI + - pDpsi_siL_DvgxL*DvgxL_DdeltaT; - -/* now we can get full deriv of first guess - but also, partials of psi_s0 and psi_sL, the - final values have similar structure, so do - them now as well */ - - /* deriv of psi_s etc wrt psi_si must be according to transform used */ - - if (Ess0_trans) { - if (psi_s0_trans) { - tmp = (Esi0/(1+Ess0+Esi0))/(1+Ess0); - tmp1 = (Esi0/(1+Ess0+Esi0))*(Ess0/(1+Ess0)); - } else { - tmp = 1/(1+Ess0); - tmp1 = Ess0*tmp; - } - Dpsi_st0_Dvgfb = tmp*Dpsi_si0_Dvgfb + tmp1*Dpsi_ss_Dvgfb; - Dpsi_st0_Dvsb = tmp*Dpsi_si0_Dvsb + tmp1*Dpsi_ss_Dvsb; - Dpsi_st0_Dvdb = tmp*Dpsi_si0_Dvdb + tmp1*Dpsi_ss_Dvdb; - Dpsi_st0_DdeltaT = tmp*Dpsi_si0_DdeltaT + tmp1*Dpsi_ss_DdeltaT; - } else { - Dpsi_st0_Dvgfb = Dpsi_ss_Dvgfb; - Dpsi_st0_Dvdb = Dpsi_ss_Dvdb; - Dpsi_st0_Dvsb = Dpsi_ss_Dvsb; - Dpsi_st0_DdeltaT = Dpsi_ss_DdeltaT; - } - -/* now some itsy bitsy quantities useful all over the shop */ - /* Ddelta_Dpsi_st0 is defined earlier with delta to allow - change of delta expression in one place */ - - pDBf_Dpsi_st0 = 0.5/sqt0 - psi_st0*pDdelta_Dpsi_st0 - delta; - - DvGT_Dvgfb = 1 - gamma*pDBf_Dpsi_st0*Dpsi_st0_Dvgfb; - DvGT_Dvsb = (-sigma) - gamma*pDBf_Dpsi_st0*Dpsi_st0_Dvsb; - DvGT_Dvdb = (sigma) - gamma*pDBf_Dpsi_st0*Dpsi_st0_Dvdb; - DvGT_DdeltaT = (-model->SOI3chiFB) - gamma*pDBf_Dpsi_st0*Dpsi_st0_DdeltaT; - - Dalpha_Dvgfb = gamma*pDdelta_Dpsi_st0*Dpsi_st0_Dvgfb; - Dalpha_Dvsb = gamma*pDdelta_Dpsi_st0*Dpsi_st0_Dvsb; - Dalpha_Dvdb = gamma*pDdelta_Dpsi_st0*Dpsi_st0_Dvdb; - Dalpha_DdeltaT = gamma*pDdelta_Dpsi_st0*Dpsi_st0_DdeltaT; - -/* Now for saturation stuff psi_sLsat */ -/* NB no need for special case, theta2=0 ==> Mmob=-theta/2 */ - - if (PSI != 0) { /* stops unnecessary math if PSI = 0 */ - DPSI_Dvgfb = (DvGT_Dvgfb - (vGT/alpha)*Dalpha_Dvgfb - )/alpha - Dpsi_st0_Dvgfb; - DPSI_Dvsb = (DvGT_Dvsb - (vGT/alpha)*Dalpha_Dvsb - )/alpha - Dpsi_st0_Dvsb; - DPSI_Dvdb = (DvGT_Dvdb - (vGT/alpha)*Dalpha_Dvdb - )/alpha - Dpsi_st0_Dvdb; - DPSI_DdeltaT = (DvGT_DdeltaT - (vGT/alpha)*Dalpha_DdeltaT - )/alpha - Dpsi_st0_DdeltaT; - - D = 2*(1+model->SOI3theta*vGBF)* - sqrt(1 + (2*Mmob*PSI)/(1+model->SOI3theta*vGBF)); - - DS_Dvgfb = (Mmob/D)*DPSI_Dvgfb - - (Mmob*PSI*(model->SOI3theta)/(D*(1+model->SOI3theta*vGBF))) - *(1-Dpsi_st0_Dvgfb); - DS_Dvsb = (Mmob/D)*DPSI_Dvsb - - (Mmob*PSI*(model->SOI3theta)/(D*(1+model->SOI3theta*vGBF))) - *((-sigma)-Dpsi_st0_Dvsb); - DS_Dvdb = (Mmob/D)*DPSI_Dvdb - - (Mmob*PSI*(model->SOI3theta)/(D*(1+model->SOI3theta*vGBF))) - *((sigma)-Dpsi_st0_Dvdb); - DS_DdeltaT = (Mmob/D)*DPSI_DdeltaT - - (Mmob*PSI*(model->SOI3theta)/(D*(1+model->SOI3theta*vGBF))) - *((-model->SOI3chiFB)-Dpsi_st0_DdeltaT) - - (PSI/D)*theta2*(model->SOI3k/(deltaT+here->SOI3temp) - - TVF/(600*(1+TVF))); - - Dpsi_sLsat_Dvgfb = Dpsi_st0_Dvgfb + - DPSI_Dvgfb/S - - PSI*DS_Dvgfb/(S*S); - Dpsi_sLsat_Dvsb = Dpsi_st0_Dvsb + - DPSI_Dvsb/S - - PSI*DS_Dvsb/(S*S); - Dpsi_sLsat_Dvdb = Dpsi_st0_Dvdb + - DPSI_Dvdb/S - - PSI*DS_Dvdb/(S*S); - Dpsi_sLsat_DdeltaT = Dpsi_st0_DdeltaT + - DPSI_DdeltaT/S - - PSI*DS_DdeltaT/(S*S); - } else { - Dpsi_sLsat_Dvgfb = Dpsi_st0_Dvgfb; - Dpsi_sLsat_Dvsb = Dpsi_st0_Dvsb; - Dpsi_sLsat_Dvdb = Dpsi_st0_Dvdb; - Dpsi_sLsat_DdeltaT = Dpsi_st0_DdeltaT; - } - - if (Esd0_trans) { - if (psi_s0_trans) { - tmp = (Esi0/(1+Esd0+Esi0))/(1+Esd0); - tmp1 = (Esi0/(1+Esd0+Esi0))*(Esd0/(1+Esd0)); - } else { - tmp = 1/(1+Esd0); - tmp1 = Esd0*tmp; - } - Dpsi_s0_Dvgfb = tmp*Dpsi_si0_Dvgfb + tmp1*Dpsi_sLsat_Dvgfb; - Dpsi_s0_Dvdb = tmp*Dpsi_si0_Dvdb + tmp1*Dpsi_sLsat_Dvdb; - Dpsi_s0_Dvsb = tmp*Dpsi_si0_Dvsb + tmp1*Dpsi_sLsat_Dvsb; - Dpsi_s0_DdeltaT = tmp*Dpsi_si0_DdeltaT + tmp1*Dpsi_sLsat_DdeltaT; - } else { - Dpsi_s0_Dvgfb = Dpsi_sLsat_Dvgfb; - Dpsi_s0_Dvdb = Dpsi_sLsat_Dvdb; - Dpsi_s0_Dvsb = Dpsi_sLsat_Dvsb; - Dpsi_s0_DdeltaT = Dpsi_sLsat_DdeltaT; - } - - if (EsdL_trans) { - if (psi_sL_trans) { - tmp = (EsiL/(1+EsdL+EsiL))/(1+EsdL); - tmp1 = (EsiL/(1+EsdL+EsiL))*(EsdL/(1+EsdL)); - } else { - tmp = 1/(1+EsdL); - tmp1 = EsdL*tmp; - } - Dpsi_sL_Dvgfb = tmp*Dpsi_siL_Dvgfb + tmp1*Dpsi_sLsat_Dvgfb; - Dpsi_sL_Dvdb = tmp*Dpsi_siL_Dvdb + tmp1*Dpsi_sLsat_Dvdb; - Dpsi_sL_Dvsb = tmp*Dpsi_siL_Dvsb + tmp1*Dpsi_sLsat_Dvsb; - Dpsi_sL_DdeltaT = tmp*Dpsi_siL_DdeltaT + tmp1*Dpsi_sLsat_DdeltaT; - } else { - Dpsi_sL_Dvgfb = Dpsi_sLsat_Dvgfb; - Dpsi_sL_Dvdb = Dpsi_sLsat_Dvdb; - Dpsi_sL_Dvsb = Dpsi_sLsat_Dvsb; - Dpsi_sL_DdeltaT = Dpsi_sLsat_DdeltaT; - } - -/* now for the whole kaboodle */ - - DfL_Dvgfb = psi_sL*(DvGT_Dvgfb + vt*Dalpha_Dvgfb) - - psi_sL*psi_sL*0.5*Dalpha_Dvgfb + - (vGBT - alpha*psi_sL)*Dpsi_sL_Dvgfb; - Df0_Dvgfb = psi_s0*(DvGT_Dvgfb + vt*Dalpha_Dvgfb) - - psi_s0*psi_s0*0.5*Dalpha_Dvgfb + - (vGBT - alpha*psi_s0)*Dpsi_s0_Dvgfb; - - DfL_Dvdb = psi_sL*(DvGT_Dvdb + vt*Dalpha_Dvdb) - - psi_sL*psi_sL*0.5*Dalpha_Dvdb + - (vGBT - alpha*psi_sL)*Dpsi_sL_Dvdb; - Df0_Dvdb = psi_s0*(DvGT_Dvdb + vt*Dalpha_Dvdb) - - psi_s0*psi_s0*0.5*Dalpha_Dvdb + - (vGBT - alpha*psi_s0)*Dpsi_s0_Dvdb; - - DfL_Dvsb = psi_sL*(DvGT_Dvsb + vt*Dalpha_Dvsb) - - psi_sL*psi_sL*0.5*Dalpha_Dvsb + - (vGBT - alpha*psi_sL)*Dpsi_sL_Dvsb; - Df0_Dvsb = psi_s0*(DvGT_Dvsb + vt*Dalpha_Dvsb) - - psi_s0*psi_s0*0.5*Dalpha_Dvsb + - (vGBT - alpha*psi_s0)*Dpsi_s0_Dvsb; - - DfL_DdeltaT = psi_sL*(DvGT_DdeltaT + vt*Dalpha_DdeltaT) - - psi_sL*psi_sL*0.5*Dalpha_DdeltaT + - (vGBT - alpha*psi_sL)*Dpsi_sL_DdeltaT; - Df0_DdeltaT = psi_s0*(DvGT_DdeltaT + vt*Dalpha_DdeltaT) - - psi_s0*psi_s0*0.5*Dalpha_DdeltaT + - (vGBT - alpha*psi_s0)*Dpsi_s0_DdeltaT; - -/* put them all together and what have you got ...? */ - - gmg = Beta*(DfL_Dvgfb - Df0_Dvgfb); - - gmd = Beta*(DfL_Dvdb - Df0_Dvdb); - - gms = Beta*(DfL_Dvsb - Df0_Dvsb); - - gmt = Beta*(DfL_DdeltaT - Df0_DdeltaT); - -/* End Intrinsic Electrical Bit */ - - -/* - * High Field Mobility Effects - */ - Fm = 1 + model->SOI3theta*(vg - 0.5*(psi_sL + psi_s0)) + - theta2 * (psi_sL - psi_s0); - ich0 = ich0/Fm; - here->SOI3ueff = here->SOI3ueff/Fm; - gmg = (gmg-ich0*(model->SOI3theta* - (1-0.5*(Dpsi_sL_Dvgfb + Dpsi_s0_Dvgfb)) + - theta2*(Dpsi_sL_Dvgfb - Dpsi_s0_Dvgfb) - ) - )/Fm; - gmd = (gmd-ich0*(model->SOI3theta* - (sigma-0.5*(Dpsi_sL_Dvdb + Dpsi_s0_Dvdb)) + - theta2*(Dpsi_sL_Dvdb - Dpsi_s0_Dvdb) - ) - )/Fm; - gms = (gms-ich0*(model->SOI3theta* - (-sigma-0.5*(Dpsi_sL_Dvsb + Dpsi_s0_Dvsb)) + - theta2*(Dpsi_sL_Dvsb - Dpsi_s0_Dvsb) - ) - )/Fm; - gmt = (gmt-ich0*(model->SOI3theta* - ((-model->SOI3chiFB)-0.5*(Dpsi_sL_DdeltaT + Dpsi_s0_DdeltaT) - ) + - theta2*(Dpsi_sL_DdeltaT - Dpsi_s0_DdeltaT - - (psi_sL - psi_s0)*(model->SOI3k/(deltaT+here->SOI3temp) - - TVF/(600*(1+TVF)) - ) - ) - ) - )/Fm; - -/* - * End High Field Mobility Effects - */ - -/* Now to define bits which affect the drain region */ -/* - * Channel Length Modulation - */ - - /* JimB - add thermal voltage to vdsat to ensure it remains above zero in subthreshold */ - vdsat = psi_sLsat - psi_st0 + vt; - Dvdsat_Dvgfb = Dpsi_sLsat_Dvgfb - Dpsi_st0_Dvgfb; - Dvdsat_Dvsb = Dpsi_sLsat_Dvsb - Dpsi_st0_Dvsb; - Dvdsat_Dvdb = Dpsi_sLsat_Dvdb - Dpsi_st0_Dvdb; - Dvdsat_DdeltaT = Dpsi_sLsat_DdeltaT - Dpsi_st0_DdeltaT; - - m = model->SOI3mexp; - - if (m>0) - { - if (vdsat>0) - { - vds2m = 1; - vdsat2m = 1; - for (i=0; i<2*m; i=i+1) - { - vds2m = vds2m*(vds*here->SOI3mode); - vdsat2m = vdsat2m*vdsat; - } - Em = exp(-log(vds2m+vdsat2m)/(2*m)); - vdslim = (here->SOI3mode*vds)*vdsat*Em; - Dvdslim_Dvgfb = (here->SOI3mode*vds*Em*Dvdsat_Dvgfb*vds2m)/(vds2m+vdsat2m); - Dvdslim_Dvdb = (here->SOI3mode*vds*Em*Dvdsat_Dvdb*vds2m + vdsat*Em*vdsat2m)/(vds2m+vdsat2m); - Dvdslim_Dvsb = (here->SOI3mode*vds*Em*Dvdsat_Dvsb*vds2m - vdsat*Em*vdsat2m)/(vds2m+vdsat2m); - Dvdslim_DdeltaT = (here->SOI3mode*vds*Em*Dvdsat_DdeltaT*vds2m)/(vds2m+vdsat2m); - - Vmx = (here->SOI3mode*vds) - vdslim; - DVmx_Dvgfb = -Dvdslim_Dvgfb; - DVmx_Dvdb = 1 - Dvdslim_Dvdb; - DVmx_Dvsb = -1 - Dvdslim_Dvsb; - DVmx_DdeltaT = -Dvdslim_DdeltaT; - } - else - { - Vmx = 0; - DVmx_Dvgfb = 0; - DVmx_Dvdb = 0; - DVmx_Dvsb = 0; - DVmx_DdeltaT = 0; - } - } - else - { - Vmx = (here->SOI3mode*vds) - vdsat; - DVmx_Dvgfb = -Dvdsat_Dvgfb; - DVmx_Dvdb = 1 - Dvdsat_Dvdb; - DVmx_Dvsb = -1 - Dvdsat_Dvsb; - DVmx_DdeltaT = -Dvdsat_DdeltaT; - } - - if (model->SOI3useLAMBDA) - { - ld = model->SOI3lambda*Vmx; - tmp = model->SOI3lambda; - } - else - { - ld = model->SOI3lx * log(1 + Vmx/model->SOI3vp); - tmp = model->SOI3lx/(model->SOI3vp + Vmx); - } - - Y = 1 + (ld/EffectiveLength); - - Dld_Dvgfb = tmp * DVmx_Dvgfb; - Dld_Dvdb = tmp * DVmx_Dvdb; - Dld_Dvsb = tmp * DVmx_Dvsb; - Dld_DdeltaT = tmp * DVmx_DdeltaT; - - gmg = gmg * Y + (ich0/EffectiveLength) * Dld_Dvgfb; - gmd = gmd * Y + (ich0/EffectiveLength) * Dld_Dvdb; - gms = gms * Y + (ich0/EffectiveLength) * Dld_Dvsb; - gmt = gmt * Y + (ich0/EffectiveLength) * Dld_DdeltaT; - - ich0 = ich0 * Y; - /* Need to do ich0 last as its old value is needed for gds */ - -/* - * End Channel Length Modulation - */ - - here->SOI3gdsnotherm = here->SOI3gds; - - /************** Thermal Mobility Stuff **************/ - - /* thermal effect on intrinsic electrical circuit */ - idrain = ich0 * TMF; /* idrain has new value now */ - here->SOI3ueff *= TMF; - gmg = gmg * TMF; -/* here->SOI3gmb = here->SOI3gmb * TMF; */ - gms = gms * TMF; - gmd = gmd * TMF; - /* deltaT is indpt voltage now */ - gmt = gmt*TMF - (model->SOI3k/(deltaT+here->SOI3temp)) * idrain; - ich0 = idrain; - - /* - * finished intrinsic electrical - */ -/* - * Impact Ionisation current sources - */ - - Vm1 = (here->SOI3mode*vds) + model->SOI3eta*(psi_s0 - psi_sLsat); - if (Vm1 > (vt*MAX_EXP_ARG)) { - Vm1x = Vm1; - tmp = 1; - } else { - Em1 = exp(MIN(MAX_EXP_ARG,Vm1/vt)); - Vm1x = vt * log(1 + Em1) + 1e-25; - tmp = (Em1/(1+Em1)); - } - DVm1x_Dvgfb = tmp*model->SOI3eta*(Dpsi_s0_Dvgfb - Dpsi_sLsat_Dvgfb); - DVm1x_Dvdb = tmp*(model->SOI3eta*(Dpsi_s0_Dvdb - Dpsi_sLsat_Dvdb) + 1); - DVm1x_Dvsb = tmp*(model->SOI3eta*(Dpsi_s0_Dvsb - Dpsi_sLsat_Dvsb) - 1); - DVm1x_DdeltaT = tmp*model->SOI3eta*(Dpsi_s0_DdeltaT - Dpsi_sLsat_DdeltaT); - - vgeff = vg - vsb - eta_s*here->SOI3tPhi - gamma*sqrt(here->SOI3tPhi); - lm = model->SOI3lm + model->SOI3lm1*(here->SOI3mode*vds-vgeff) - + model->SOI3lm2*(here->SOI3mode*vds-vgeff)*(here->SOI3mode*vds-vgeff); - Elm = exp(MIN(MAX_EXP_ARG,lm/MAX(1e-10,(model->SOI3lm/40)))); - lmeff = (model->SOI3lm/40)*log(1+Elm); - betaM = 100*(model->SOI3beta0 + model->SOI3chibeta*deltaT); - EM = exp(MIN(MAX_EXP_ARG,-(lmeff*betaM)/Vm1x)); - Mminus1 = (100*model->SOI3alpha0/betaM) * Vm1x * EM; - if (here->SOI3mode==1) { - here->SOI3iMdb=Mminus1*ich0; - here->SOI3iMsb=0; - } else { - here->SOI3iMsb=Mminus1*ich0; - here->SOI3iMdb=0; - } - tmp = (Elm/(1+Elm))* - (model->SOI3lm1 + 2*model->SOI3lm2*(here->SOI3mode*vds-vgeff)); - Dlm_Dvgfb = -tmp; - Dlm_Dvdb = tmp*(1-sigma); - Dlm_Dvsb = tmp*(sigma); - Dlm_DdeltaT = tmp*(model->SOI3chiFB); - tmp = (ich0/Vm1x); - tmp1 = (1+(lmeff*betaM/Vm1x)); - gMg = Mminus1 * (gmg + tmp * (tmp1*DVm1x_Dvgfb - betaM*Dlm_Dvgfb)); - gMd = Mminus1 * (gmd + tmp * (tmp1*DVm1x_Dvdb - betaM*Dlm_Dvdb)); - gMs = Mminus1 * (gms + tmp * (tmp1*DVm1x_Dvsb - betaM*Dlm_Dvsb)); - - here->SOI3gMmf = gMg; - here->SOI3gMmb = 0; - here->SOI3gMmbs= -(gMs + gMg + gMd); - here->SOI3gMd = gMd; - here->SOI3gMdeltaT = Mminus1*(gmt+ - tmp*(tmp1*DVm1x_DdeltaT - betaM*Dlm_DdeltaT - - lmeff*model->SOI3chibeta*100) - - (ich0*model->SOI3chibeta*100/betaM) - ); - -/* - * End Impact Ionisation current sources - */ - -/***** time to convert to conventional names for (trans)conductances *****/ - - here->SOI3gmf = gmg; - here->SOI3gmb = 0; /* FOR NOW */ - here->SOI3gmbs = -(gms + gmg + gmd); - here->SOI3gds = gmd; - here->SOI3gt = gmt; - vdsat_ext = psi_sLsat - psi_s0; - - /* now for thermal subcircuit values */ - tmp = (here->SOI3drainConductance==0?0:(1/(here->SOI3drainConductance))); - tmp += (here->SOI3sourceConductance==0?0:(1/(here->SOI3sourceConductance))); - /* tmp = RS+RD */ - here->SOI3iPt = (here->SOI3mode*vds + idrain*tmp)*idrain; - here->SOI3gPmf = (here->SOI3mode*vds + 2*idrain*tmp)*here->SOI3gmf; - here->SOI3gPmb = (here->SOI3mode*vds + 2*idrain*tmp)*here->SOI3gmb; - here->SOI3gPmbs = (here->SOI3mode*vds + 2*idrain*tmp)*here->SOI3gmbs; - here->SOI3gPds = idrain + (here->SOI3mode*vds + 2*idrain*tmp)*here->SOI3gds; - here->SOI3gPdT = (here->SOI3mode*vds + 2*idrain*tmp)*here->SOI3gt; - - /* JimB - 15/9/99 */ - /* Code for multiple thermal time constants. Start by moving all */ - /* rt constants into arrays. */ - rtargs[0]=here->SOI3rt; - rtargs[1]=here->SOI3rt1; - rtargs[2]=here->SOI3rt2; - rtargs[3]=here->SOI3rt3; - rtargs[4]=here->SOI3rt4; - - /* Set all conductance components to zero. */ - grt[0]=grt[1]=grt[2]=grt[3]=grt[4]=0.0; - /* Now calculate conductances from rt. */ - /* Don't need to worry about divide by zero when calculating */ - /* grt components, as soi3setup() only creates a thermal node */ - /* if corresponding rt is greater than zero. */ - for(tnodeindex=0;tnodeindexSOI3numThermalNodes;tnodeindex++) - { - grt[tnodeindex]=1/rtargs[tnodeindex]; - } - /* End JimB */ - -/* now end nasty trick - if vsb and vdb have been switched, reverse them back */ - if (here->SOI3mode == -1) - { - SWAP(double, vsb, vdb); - } - - /* - * bulk-source and bulk-drain diodes - * includes parasitic BJT and 2nd diode - * - */ - - tmp = here->SOI3temp+deltaT; - tmp1 = here->SOI3temp + model->SOI3dvt * deltaT; - vT = CONSTKoverQ * tmp1; - - if ((model->SOI3betaEXP) != 1.0) - { - if ((model->SOI3betaEXP) != 2.0) - { - BetaBJTeff = model->SOI3betaBJT * - exp(-(model->SOI3betaEXP)*logL); - } - else - { - BetaBJTeff = model->SOI3betaBJT/ - (EffectiveLength*EffectiveLength); - } - } - else - { - BetaBJTeff = model->SOI3betaBJT/EffectiveLength; - } - - alphaBJT = BetaBJTeff/(BetaBJTeff + 1); - - EchiD = exp(MIN(MAX_EXP_ARG, - (model->SOI3chid * deltaT)/(here->SOI3temp*tmp) - ) - ); - EchiD1 = exp(MIN(MAX_EXP_ARG, - (model->SOI3chid1 * deltaT)/(here->SOI3temp*tmp) - ) - ); - ISts = SourceSatCur*EchiD; - IS1ts = SourceSatCur1*EchiD1; - - evbs = exp(MIN(MAX_EXP_ARG,vbs/((model->SOI3etad)*vT))); - evbs1 = exp(MIN(MAX_EXP_ARG,vbs/((model->SOI3etad1)*vT))); -/* First Junction */ - here->SOI3ibs = ISts * (evbs-1); - here->SOI3gbs = ISts*evbs/((model->SOI3etad)*vT); - here->SOI3gbsT = ISts*((evbs-1)*model->SOI3chid/(tmp*tmp) - - evbs*vbs*model->SOI3dvt/((model->SOI3etad)*vT*tmp1)); -/* Now Bipolar */ - here->SOI3iBJTdb = alphaBJT * ISts * (evbs-1); - here->SOI3gBJTdb_bs = alphaBJT * here->SOI3gbs; - here->SOI3gBJTdb_deltaT = alphaBJT * here->SOI3gbsT; -/* Now second junction and gmin */ - /* JimB - make gmin code consistent */ - here->SOI3ibs += IS1ts * (evbs1-1) + ckt->CKTgmin*vbs; - here->SOI3gbs += IS1ts*evbs1/((model->SOI3etad1)*vT) + ckt->CKTgmin; - /* End JimB */ - here->SOI3gbsT += IS1ts*((evbs1-1)*model->SOI3chid1/(tmp*tmp) - - evbs1*vbs*model->SOI3dvt/((model->SOI3etad1)*vT*tmp1) - ); - - - IStd = DrainSatCur*EchiD; - IS1td = DrainSatCur1*EchiD1; - - evbd = exp(MIN(MAX_EXP_ARG,vbd/((model->SOI3etad)*vT))); - evbd1 = exp(MIN(MAX_EXP_ARG,vbd/((model->SOI3etad1)*vT))); -/* First Junction */ - here->SOI3ibd = IStd *(evbd-1); - here->SOI3gbd = IStd*evbd/((model->SOI3etad)*vT); - here->SOI3gbdT = IStd*((evbd-1)*model->SOI3chid/(tmp*tmp) - - evbd*vbd*model->SOI3dvt/((model->SOI3etad)*vT*tmp1)); -/* Now Bipolar */ - here->SOI3iBJTsb = alphaBJT * IStd *(evbd-1); - here->SOI3gBJTsb_bd = alphaBJT * here->SOI3gbd; - here->SOI3gBJTsb_deltaT = alphaBJT * here->SOI3gbdT; -/* Now second junction and gmin */ - /* JimB - make gmin code consistent */ - here->SOI3ibd += IS1td *(evbd1-1) + ckt->CKTgmin*vbd; - here->SOI3gbd += IS1td*evbd1/((model->SOI3etad1)*vT) + ckt->CKTgmin; - /* End JimB */ - here->SOI3gbdT += IS1td*((evbd1-1)*model->SOI3chid1/(tmp*tmp) - - evbd1*vbd*model->SOI3dvt/((model->SOI3etad1)*vT*tmp1) - ); - - -/* initialise von for voltage limiting purposes */ - von = (here->SOI3tVfbF * model->SOI3type) + psi_s0 + gamma*sqt0 - + sigma*(here->SOI3mode*vds) - - model->SOI3chiFB*deltaT; - -/* finally if we're going to do charge/capacitance calcs, store - * some stuff to pass to function. Need to use arrays 'cos there's - * a limit to how many parameters you can pass in standard C - */ - paramargs[0] = here->SOI3w*model->SOI3frontOxideCapFactor; - paramargs[1] = EffectiveLength; - paramargs[2] = gamma; - paramargs[3] = eta_s; - paramargs[4] = vt; - paramargs[5] = delta; - paramargs[6] = here->SOI3w*model->SOI3backOxideCapFactor; - paramargs[7] = sigma; - paramargs[8] = model->SOI3chiFB; - paramargs[9] = model->SOI3satChargeShareFactor; - Bfargs[0] = Bf; - Bfargs[1] = pDBf_Dpsi_st0; - alpha_args[0] = alpha; - alpha_args[1] = Dalpha_Dvgfb; - alpha_args[2] = Dalpha_Dvdb; - alpha_args[3] = Dalpha_Dvsb; - alpha_args[4] = Dalpha_DdeltaT; - psi_st0args[0] = psi_st0; - psi_st0args[1] = Dpsi_st0_Dvgfb; - psi_st0args[2] = Dpsi_st0_Dvdb; - psi_st0args[3] = Dpsi_st0_Dvsb; - psi_st0args[4] = Dpsi_st0_DdeltaT; - vGTargs[0] = vGT; - vGTargs[1] = DvGT_Dvgfb; - vGTargs[2] = DvGT_Dvdb; - vGTargs[3] = DvGT_Dvsb; - vGTargs[4] = DvGT_DdeltaT; - psi_sLargs[0] = psi_sL; - psi_sLargs[1] = Dpsi_sL_Dvgfb; - psi_sLargs[2] = Dpsi_sL_Dvdb; - psi_sLargs[3] = Dpsi_sL_Dvsb; - psi_sLargs[4] = Dpsi_sL_DdeltaT; - psi_s0args[0] = psi_s0; - psi_s0args[1] = Dpsi_s0_Dvgfb; - psi_s0args[2] = Dpsi_s0_Dvdb; - psi_s0args[3] = Dpsi_s0_Dvsb; - psi_s0args[4] = Dpsi_s0_DdeltaT; - ldargs[0] = ld; - ldargs[1] = Dld_Dvgfb; - ldargs[2] = Dld_Dvdb; - ldargs[3] = Dld_Dvsb; - ldargs[4] = Dld_DdeltaT; -/* debug stuff */ - here->SOI3debug1 = psi_sL; - here->SOI3debug2 = psi_s0; - here->SOI3debug3 = fL; - here->SOI3debug4 = f0; - here->SOI3debug5 = gmd; - here->SOI3debug6 = gms; - - } /* end block */ - - - - /* now deal with n vs p polarity */ - - here->SOI3von = model->SOI3type * von; - here->SOI3vdsat = model->SOI3type * vdsat_ext; - /* line 490 */ - /* - * COMPUTE EQUIVALENT DRAIN CURRENT SOURCE - * - OLD here->SOI3id=here->SOI3mode * idrain - here->SOI3ibd; - */ - if (here->SOI3mode==1) { - here->SOI3id= idrain - here->SOI3ibd + here->SOI3iMdb - + here->SOI3iBJTdb; - } else { - here->SOI3id= -idrain - here->SOI3ibd - + here->SOI3iBJTdb; - } - - - /* JimB - 4/1/99 */ - /* Tidy up depletion capacitance code, and remove unwanted */ - /* compile options. */ - - if (ckt->CKTmode & (MODETRAN | MODETRANOP | MODEINITSMSIG)) - { - /* - * Now we do the hard part of the bulk-drain and bulk-source - * diode - we evaluate the non-linear capacitance and - * charge - * - * The basic equations are not hard, but the implementation - * is somewhat long in an attempt to avoid log/exponential - * evaluations. This is because most users use the default - * grading coefficients of 0.5, and sqrt is MUCH faster than - * an exp(log()), so we use this special case to buy time - - * as much as 10% of total job time! - */ - - /******** Bulk-source depletion capacitance ********/ - -#ifdef CAPBYPASS - if(((ckt->CKTmode & (MODEINITPRED | MODEINITTRAN) ) || - fabs(delvbs) >= ckt->CKTreltol * MAX(fabs(vbs), - fabs(*(ckt->CKTstate0+here->SOI3vbs)))+ - ckt->CKTvoltTol)) -#endif /*CAPBYPASS*/ - { - if(here->SOI3Cbs != 0) - { - if (vbs < here->SOI3tDepCap) - { - arg=1-vbs/here->SOI3tBulkPot; - if(model->SOI3bulkJctSideGradingCoeff == 0.5) - { - sarg = 1/sqrt(arg); - } - else - { - sarg = exp(-model->SOI3bulkJctSideGradingCoeff* - log(arg)); - } - *(ckt->CKTstate0 + here->SOI3qbs) = - here->SOI3tBulkPot*(here->SOI3Cbs* - (1-arg*sarg)/(1-model->SOI3bulkJctSideGradingCoeff)); - here->SOI3capbs=here->SOI3Cbs*sarg; - } - else - { - *(ckt->CKTstate0 + here->SOI3qbs) = here->SOI3f4s + - vbs*(here->SOI3f2s+vbs*(here->SOI3f3s/2)); - here->SOI3capbs=here->SOI3f2s+here->SOI3f3s*vbs; - } - } - else - { - *(ckt->CKTstate0 + here->SOI3qbs) = 0; - here->SOI3capbs=0; - } - } - - /******** End bulk-source depletion capcitance ********/ - - /******** Bulk-drain depletion capacitance ********/ - -#ifdef CAPBYPASS - if(((ckt->CKTmode & (MODEINITPRED | MODEINITTRAN) ) || - fabs(delvbd) >= ckt->CKTreltol * MAX(fabs(vbd), - fabs(*(ckt->CKTstate0+here->SOI3vbd)))+ - ckt->CKTvoltTol)) -#endif /*CAPBYPASS*/ - { - if(here->SOI3Cbd != 0) - { - if (vbd < here->SOI3tDepCap) - { - arg=1-vbd/here->SOI3tBulkPot; - if(model->SOI3bulkJctSideGradingCoeff == 0.5) - { - sarg = 1/sqrt(arg); - } - else - { - sarg = exp(-model->SOI3bulkJctSideGradingCoeff* - log(arg)); - } - *(ckt->CKTstate0 + here->SOI3qbd) = - here->SOI3tBulkPot*(here->SOI3Cbd* - (1-arg*sarg)/(1-model->SOI3bulkJctSideGradingCoeff)); - here->SOI3capbd=here->SOI3Cbd*sarg; - } - else - { - *(ckt->CKTstate0 + here->SOI3qbd) = here->SOI3f4d + - vbd * (here->SOI3f2d + vbd *(here->SOI3f3d/2)); - here->SOI3capbd=here->SOI3f2d + vbd * here->SOI3f3d; - } - } - else - { - *(ckt->CKTstate0 + here->SOI3qbd) = 0; - here->SOI3capbd = 0; - } - } - - /******** End bulk-drain depletion capacitance ********/ - - -/* Need to work out charge on thermal cap */ - *(ckt->CKTstate0 + here->SOI3qt) = here->SOI3ct * deltaT1; - *(ckt->CKTstate0 + here->SOI3qt1) = here->SOI3ct1 * deltaT2; - *(ckt->CKTstate0 + here->SOI3qt2) = here->SOI3ct2 * deltaT3; - *(ckt->CKTstate0 + here->SOI3qt3) = here->SOI3ct3 * deltaT4; - *(ckt->CKTstate0 + here->SOI3qt4) = here->SOI3ct4 * deltaT5; -/* ct is constant, so integral is trivial */ - - if ( (ckt->CKTmode & MODETRAN) || ( (ckt->CKTmode&MODEINITTRAN) - && !(ckt->CKTmode&MODEUIC)) ) { - /* (above only excludes tranop, since we're only at this - * point if tran or tranop ) - */ - - /* - * calculate equivalent conductances and currents for - * depletion capacitors - */ - - /* integrate the capacitors and save results */ - - error = NIintegrate(ckt,&geq,&ieq,here->SOI3capbd, - here->SOI3qbd); - if(error) return(error); - here->SOI3gbd += geq; - here->SOI3ibd += *(ckt->CKTstate0 + here->SOI3iqbd); - here->SOI3id -= *(ckt->CKTstate0 + here->SOI3iqbd); - error = NIintegrate(ckt,&geq,&ieq,here->SOI3capbs, - here->SOI3qbs); - if(error) return(error); - here->SOI3gbs += geq; - here->SOI3ibs += *(ckt->CKTstate0 + here->SOI3iqbs); - } - } - - - /* - * check convergence - */ - if ( (here->SOI3off == 0) || - (!(ckt->CKTmode & (MODEINITFIX|MODEINITSMSIG))) ){ - if (Check == 1) { - ckt->CKTnoncon++; - } - } - - /* - * new capacitor model - */ - if ((ckt->CKTmode & (MODETRAN | MODEAC | MODEINITSMSIG)) || - ((ckt->CKTmode & MODETRANOP) && (ckt->CKTmode & MODEUIC)) - ){ - /* - * calculate charges and capacitances - */ - /* - * Partially Depleted model => back surface neglected - * so back capacitances are ignored. - */ - /* - * All the args assume vsb and vdb are 'correct' - * so must make sure we're getting right values - * back. - */ - if (here->SOI3mode > 0) - { - SOI3cap((vgbb-here->SOI3tVfbB),(here->SOI3tPhi + vsb),model->SOI3gammaB, - paramargs, - Bfargs,alpha_args,psi_st0args, - vGTargs, - psi_sLargs,psi_s0args, - ldargs, - &qgatef,&qbody,&qdrn,&qgateb, - &cgfgf,&cgfd,&cgfs,&cgfdeltaT,&cgfgb, - &cbgf,&cbd,&cbs,&cbdeltaT,&cbgb, - &cdgf,&cdd,&cds,&cddeltaT,&cdgb, - &cgbgf,&cgbd,&cgbs,&cgbdeltaT,&cgbgb); - csgf = -(cgfgf + cdgf + cbgf + cgbgf); - csd = -(cgfd + cdd + cbd + cgbd); - css = -(cgfs + cds + cbs + cgbs); - csdeltaT = -(cgfdeltaT + cddeltaT + cbdeltaT + cgbdeltaT); - csgb = -(cgfgb + cdgb + cbgb + cgbgb); - } - else - { - SOI3cap((vgbb-here->SOI3tVfbB),(here->SOI3tPhi + vdb),model->SOI3gammaB, - paramargs, - Bfargs,alpha_args,psi_st0args, - vGTargs, - psi_sLargs,psi_s0args, - ldargs, - &qgatef,&qbody,&qsrc,&qgateb, - &cgfgf,&cgfs,&cgfd,&cgfdeltaT,&cgfgb, - &cbgf,&cbs,&cbd,&cbdeltaT,&cbgb, - &csgf,&css,&csd,&csdeltaT,&csgb, - &cgbgf,&cgbs,&cgbd,&cgbdeltaT,&cgbgb); - cdgf = -(cgfgf + csgf + cbgf + cgbgf); - cdd = -(cgfd + csd + cbd + cgbd); - cds = -(cgfs + css + cbs + cgbs); - cddeltaT = -(cgfdeltaT + csdeltaT + cbdeltaT + cgbdeltaT); - cdgb = -(cgfgb + csgb + cbgb + cgbgb); - } - - *(ckt->CKTstate0 + here->SOI3cgfgf) = cgfgf; - *(ckt->CKTstate0 + here->SOI3cgfd) = cgfd; - *(ckt->CKTstate0 + here->SOI3cgfs) = cgfs; - *(ckt->CKTstate0 + here->SOI3cgfdeltaT) = cgfdeltaT; - *(ckt->CKTstate0 + here->SOI3cgfgb) = cgfgb; - - *(ckt->CKTstate0 + here->SOI3csgf) = csgf; - *(ckt->CKTstate0 + here->SOI3csd) = csd; - *(ckt->CKTstate0 + here->SOI3css) = css; - *(ckt->CKTstate0 + here->SOI3csdeltaT) = csdeltaT; - *(ckt->CKTstate0 + here->SOI3csgb) = csgb; - - *(ckt->CKTstate0 + here->SOI3cdgf) = cdgf; - *(ckt->CKTstate0 + here->SOI3cdd) = cdd; - *(ckt->CKTstate0 + here->SOI3cds) = cds; - *(ckt->CKTstate0 + here->SOI3cddeltaT) = cddeltaT; - *(ckt->CKTstate0 + here->SOI3cdgb) = cdgb; - - *(ckt->CKTstate0 + here->SOI3cgbgf) = cgbgf; - *(ckt->CKTstate0 + here->SOI3cgbd) = cgbd; - *(ckt->CKTstate0 + here->SOI3cgbs) = cgbs; - *(ckt->CKTstate0 + here->SOI3cgbdeltaT) = cgbdeltaT; - *(ckt->CKTstate0 + here->SOI3cgbgb) = cgbgb; - - -/* got charges and caps now, must get equiv conductances/current sources - * but first work out charge and caps for BJT charge storage - */ - - if ((model->SOI3tauEXP) != 2.0) - { - if ((model->SOI3tauEXP) != 1.0) - { - tauFBJTeff = model->SOI3tauFBJT * - exp((model->SOI3tauEXP)*logL); - tauRBJTeff = model->SOI3tauRBJT * - exp((model->SOI3tauEXP)*logL); - } - else - { - tauFBJTeff = model->SOI3tauFBJT*EffectiveLength; - tauRBJTeff = model->SOI3tauRBJT*EffectiveLength; - } - } - else - { - tauFBJTeff = model->SOI3tauFBJT*(EffectiveLength*EffectiveLength); - tauRBJTeff = model->SOI3tauRBJT*(EffectiveLength*EffectiveLength); - } - - *(ckt->CKTstate0 + here->SOI3qBJTbs) = tauFBJTeff * - here->SOI3iBJTdb; - *(ckt->CKTstate0 + here->SOI3cBJTbsbs) = tauFBJTeff * - here->SOI3gBJTdb_bs; - *(ckt->CKTstate0 + here->SOI3cBJTbsdeltaT) = tauFBJTeff * - here->SOI3gBJTdb_deltaT; - - *(ckt->CKTstate0 + here->SOI3qBJTbd) = tauRBJTeff * - here->SOI3iBJTsb; - *(ckt->CKTstate0 + here->SOI3cBJTbdbd) = tauRBJTeff * - here->SOI3gBJTsb_bd; - *(ckt->CKTstate0 + here->SOI3cBJTbddeltaT) = tauRBJTeff * - here->SOI3gBJTsb_deltaT; - } /* end of charge/cap calculations */ - - - /* save things away for next time */ - - *(ckt->CKTstate0 + here->SOI3vbs) = vbs; - *(ckt->CKTstate0 + here->SOI3vbd) = vbd; - *(ckt->CKTstate0 + here->SOI3vgfs) = vgfs; - *(ckt->CKTstate0 + here->SOI3vgbs) = vgbs; - *(ckt->CKTstate0 + here->SOI3vds) = vds; - *(ckt->CKTstate0 + here->SOI3deltaT) = deltaT; - *(ckt->CKTstate0 + here->SOI3deltaT1) = deltaT1; - *(ckt->CKTstate0 + here->SOI3deltaT2) = deltaT2; - *(ckt->CKTstate0 + here->SOI3deltaT3) = deltaT3; - *(ckt->CKTstate0 + here->SOI3deltaT4) = deltaT4; - *(ckt->CKTstate0 + here->SOI3deltaT5) = deltaT5; - *(ckt->CKTstate0 + here->SOI3idrain) = idrain; - - if((!(ckt->CKTmode & (MODETRAN | MODEAC))) && - ((!(ckt->CKTmode & MODETRANOP)) || - (!(ckt->CKTmode & MODEUIC))) && (!(ckt->CKTmode - & MODEINITSMSIG))) goto bypass2; -#ifndef NOBYPASS -bypass1: -#endif - if (here->SOI3mode>0) { - Frontcapargs[0] = FrontGateDrainOverlapCap; - Frontcapargs[1] = FrontGateSourceOverlapCap; - Frontcapargs[2] = FrontGateBulkOverlapCap; - Frontcapargs[3] = vgfd; - Frontcapargs[4] = vgfs; - Frontcapargs[5] = vgfb; - Backcapargs[0] = BackGateDrainOverlapCap; - Backcapargs[1] = BackGateSourceOverlapCap; - Backcapargs[2] = BackGateBulkOverlapCap; - Backcapargs[3] = vgbd; - Backcapargs[4] = vgbs; - Backcapargs[5] = vgbb; - SOI3capEval(ckt, - Frontcapargs, - Backcapargs, - cgfgf,cgfd,cgfs,cgfdeltaT,cgfgb, - cdgf,cdd,cds,cddeltaT,cdgb, - csgf,csd,css,csdeltaT,csgb, - cbgf,cbd,cbs,cbdeltaT,cbgb, - cgbgf,cgbd,cgbs,cgbdeltaT,cgbgb, - &gcgfgf,&gcgfd,&gcgfs,&gcgfdeltaT,&gcgfgb, - &gcdgf,&gcdd,&gcds,&gcddeltaT,&gcdgb, - &gcsgf,&gcsd,&gcss,&gcsdeltaT,&gcsgb, - &gcbgf,&gcbd,&gcbs,&gcbdeltaT,&gcbgb, - &gcgbgf,&gcgbd,&gcgbs,&gcgbdeltaT,&gcgbgb, - &qgatef,&qbody,&qdrn,&qsrc,&qgateb); - } else { - Frontcapargs[0] = FrontGateSourceOverlapCap; - Frontcapargs[1] = FrontGateDrainOverlapCap; - Frontcapargs[2] = FrontGateBulkOverlapCap; - Frontcapargs[3] = vgfs; - Frontcapargs[4] = vgfd; - Frontcapargs[5] = vgfb; - Backcapargs[0] = BackGateSourceOverlapCap; - Backcapargs[1] = BackGateDrainOverlapCap; - Backcapargs[2] = BackGateBulkOverlapCap; - Backcapargs[3] = vgbs; - Backcapargs[4] = vgbd; - Backcapargs[5] = vgbb; - SOI3capEval(ckt, - Frontcapargs, - Backcapargs, - cgfgf,cgfs,cgfd,cgfdeltaT,cgfgb, - csgf,css,csd,csdeltaT,csgb, - cdgf,cds,cdd,cddeltaT,cdgb, - cbgf,cbs,cbd,cbdeltaT,cbgb, - cgbgf,cgbs,cgbd,cgbdeltaT,cgbgb, - &gcgfgf,&gcgfs,&gcgfd,&gcgfdeltaT,&gcgfgb, - &gcsgf,&gcss,&gcsd,&gcsdeltaT,&gcsgb, - &gcdgf,&gcds,&gcdd,&gcddeltaT,&gcdgb, - &gcbgf,&gcbs,&gcbd,&gcbdeltaT,&gcbgb, - &gcgbgf,&gcgbs,&gcgbd,&gcgbdeltaT,&gcgbgb, - &qgatef,&qbody,&qsrc,&qdrn,&qgateb); - } - ag0 = ckt->CKTag[0]; - gcBJTbsbs = ag0 * *(ckt->CKTstate0+here->SOI3cBJTbsbs); - gcBJTbsdeltaT = ag0 * *(ckt->CKTstate0+here->SOI3cBJTbsdeltaT); - gcBJTbdbd = ag0 * *(ckt->CKTstate0+here->SOI3cBJTbdbd); - gcBJTbddeltaT = ag0 * *(ckt->CKTstate0+here->SOI3cBJTbddeltaT); - - if (ByPass) goto line860; /* already stored charges */ - - *(ckt->CKTstate0 + here->SOI3qgf) = qgatef; - *(ckt->CKTstate0 + here->SOI3qd) = qdrn; - *(ckt->CKTstate0 + here->SOI3qs) = qsrc; - *(ckt->CKTstate0 + here->SOI3qgb) = qgateb; - /* NB, we've kept charge/cap associated with diodes separately */ - - if((!(ckt->CKTmode & (MODEAC | MODETRAN))) && - (ckt->CKTmode & MODETRANOP ) && (ckt->CKTmode & - MODEUIC )) goto bypass2; - - /* store small signal parameters */ - if(ckt->CKTmode & MODEINITSMSIG ) { - *(ckt->CKTstate0+here->SOI3cgfgf) = cgfgf; - *(ckt->CKTstate0+here->SOI3cgfd) = cgfd; - *(ckt->CKTstate0+here->SOI3cgfs) = cgfs; - *(ckt->CKTstate0+here->SOI3cgfdeltaT) = cgfdeltaT; - *(ckt->CKTstate0+here->SOI3cgfgb) = cgfgb; - *(ckt->CKTstate0+here->SOI3cdgf) = cdgf; - *(ckt->CKTstate0+here->SOI3cdd) = cdd; - *(ckt->CKTstate0+here->SOI3cds) = cds; - *(ckt->CKTstate0+here->SOI3cddeltaT) = cddeltaT; - *(ckt->CKTstate0+here->SOI3cdgb) = cdgb; - *(ckt->CKTstate0+here->SOI3csgf) = csgf; - *(ckt->CKTstate0+here->SOI3csd) = csd; - *(ckt->CKTstate0+here->SOI3css) = css; - *(ckt->CKTstate0+here->SOI3csdeltaT) = csdeltaT; - *(ckt->CKTstate0+here->SOI3csgb) = csgb; - *(ckt->CKTstate0+here->SOI3cgbgf) = cgbgf; - *(ckt->CKTstate0+here->SOI3cgbd) = cgbd; - *(ckt->CKTstate0+here->SOI3cgbs) = cgbs; - *(ckt->CKTstate0+here->SOI3cgbdeltaT) = cgbdeltaT; - *(ckt->CKTstate0+here->SOI3cgbgb) = cgbgb; - - goto End; - } - - if (ckt->CKTmode & MODEINITTRAN) { - *(ckt->CKTstate1 + here->SOI3qgf) = - *(ckt->CKTstate0 + here->SOI3qgf); - *(ckt->CKTstate1 + here->SOI3qd) = - *(ckt->CKTstate0 + here->SOI3qd); - *(ckt->CKTstate1 + here->SOI3qs) = - *(ckt->CKTstate0 + here->SOI3qs); - *(ckt->CKTstate1 + here->SOI3qgb) = - *(ckt->CKTstate0 + here->SOI3qgb); - *(ckt->CKTstate1 + here->SOI3qBJTbs) = - *(ckt->CKTstate0 + here->SOI3qBJTbs); - *(ckt->CKTstate1 + here->SOI3qBJTbd) = - *(ckt->CKTstate0 + here->SOI3qBJTbd); - } - - /* - * numerical integration of intrinsic caps - * and BJT caps - */ - error = NIintegrate(ckt,&geq,&ieq,0.0,here->SOI3qgf); - if(error) return(error); - error = NIintegrate(ckt,&geq,&ieq,0.0,here->SOI3qd); - if(error) return(error); - error = NIintegrate(ckt,&geq,&ieq,0.0,here->SOI3qs); - if(error) return(error); - error = NIintegrate(ckt,&geq,&ieq,0.0,here->SOI3qgb); - if(error) return(error); - - error = NIintegrate(ckt,&geq,&ieq,0.0,here->SOI3qBJTbs); - if(error) return(error); - error = NIintegrate(ckt,&geq,&ieq,0.0,here->SOI3qBJTbd); - if(error) return(error); - goto line860; - -bypass2: - - /* - * initialize to zero charge conductances - * and current (DC and TRANOP) - */ - ieqqgf = ieqqd = ieqqs = ieqqgb = 0.0; - gcgfgf = gcgfd = gcgfs = gcgfdeltaT = gcgfgb = 0.0; - gcdgf = gcdd = gcds = gcddeltaT = gcdgb = 0.0; - gcsgf = gcsd = gcss = gcsdeltaT = gcsgb = 0.0; - gcbgf = gcbd = gcbs = gcbdeltaT = gcbgb = 0.0; - gcgbgf = gcgbd = gcgbs = gcgbdeltaT = gcgbgb = 0.0; - gct[0]=gct[1]=gct[2]=gct[3]=gct[4]=0.0; - ieqct=ieqct1=ieqct2=ieqct3=ieqct4=0.0; - ieqqBJTbs = ieqqBJTbd = 0.0; - gcBJTbsbs = gcBJTbsdeltaT = gcBJTbdbd = gcBJTbddeltaT = 0.0; - goto LoadUp; - -line860: - - /* evaluate equivalent charge currents */ - - ieqqgf = *(ckt->CKTstate0 + here->SOI3iqgf) - - gcgfgf * vgfb - gcgfd * vdb - gcgfs * vsb - gcgfdeltaT * deltaT - - gcgfgb * vgbb; - ieqqd = *(ckt->CKTstate0 + here->SOI3iqd) - - gcdgf * vgfb - gcdd * vdb - gcds * vsb - gcddeltaT * deltaT - - gcdgb * vgbb; - ieqqs = *(ckt->CKTstate0 + here->SOI3iqs) - - gcsgf * vgfb - gcsd * vdb - gcss * vsb - gcsdeltaT * deltaT - - gcsgb * vgbb; - ieqqgb = *(ckt->CKTstate0 + here->SOI3iqgb) - - gcgbgf * vgfb - gcgbd * vdb - gcgbs * vsb - gcgbdeltaT * deltaT - - gcgbgb * vgbb; - - ieqqBJTbs = *(ckt->CKTstate0 + here->SOI3iqBJTbs) - - gcBJTbsbs * vbs - gcBJTbsdeltaT * deltaT; - ieqqBJTbd = *(ckt->CKTstate0 + here->SOI3iqBJTbd) - - gcBJTbdbd * vbd - gcBJTbddeltaT * deltaT; - - /* now for the thermal capacitance - is constant and linear so no need - to fart about with equiv current */ - - - error = NIintegrate(ckt,&gct[0],&ieqct,here->SOI3ct, - here->SOI3qt); - if(error) return(error); - error = NIintegrate(ckt,&gct[1],&ieqct1,here->SOI3ct1, - here->SOI3qt1); - if(error) return(error); - error = NIintegrate(ckt,&gct[2],&ieqct2,here->SOI3ct2, - here->SOI3qt2); - if(error) return(error); - error = NIintegrate(ckt,&gct[3],&ieqct3,here->SOI3ct3, - here->SOI3qt3); - if(error) return(error); - error = NIintegrate(ckt,&gct[4],&ieqct4,here->SOI3ct4, - here->SOI3qt4); - if(error) return(error); - -LoadUp: - - /* - * load current vector - */ - - m = here->SOI3m; - - ieqbs = model->SOI3type * - (here->SOI3ibs-(here->SOI3gbs-ckt->CKTgmin)*vbs - -(here->SOI3gbsT)*deltaT); - ieqbd = model->SOI3type * - (here->SOI3ibd-(here->SOI3gbd-ckt->CKTgmin)*vbd - -(here->SOI3gbdT)*deltaT); - iBJTdbeq = model->SOI3type * - (here->SOI3iBJTdb -(here->SOI3gBJTdb_bs)*vbs - -(here->SOI3gBJTdb_deltaT)*deltaT); - iBJTsbeq = model->SOI3type * - (here->SOI3iBJTsb -(here->SOI3gBJTsb_bd)*vbd - -(here->SOI3gBJTsb_deltaT)*deltaT); - ieqPt = here->SOI3iPt - (here->SOI3gPds*(here->SOI3mode*vds)+ - here->SOI3gPmf*(here->SOI3mode==1?vgfs:vgfd)+ - here->SOI3gPmb*(here->SOI3mode==1?vgbs:vgbd)+ - here->SOI3gPmbs*(here->SOI3mode==1?vbs:vbd)+ - here->SOI3gPdT*(deltaT)); - if (here->SOI3mode >= 0) - { - xnrm=1; - xrev=0; - idreq=model->SOI3type*(idrain-here->SOI3gds*vds- - here->SOI3gmf*vgfs-here->SOI3gmbs*vbs- - here->SOI3gmb*vgbs-here->SOI3gt*deltaT); - iMdbeq=model->SOI3type*(here->SOI3iMdb-here->SOI3gMd*vds- - here->SOI3gMmf*vgfs-here->SOI3gMmbs*vbs- - here->SOI3gMmb*vgbs-here->SOI3gMdeltaT*deltaT); - iMsbeq=0; - } - else - { - xnrm=0; - xrev=1; - idreq = -(model->SOI3type)*(idrain-here->SOI3gds*(-vds)- - here->SOI3gmf*vgfd-here->SOI3gmbs*vbd- - here->SOI3gmb*vgbd-here->SOI3gt*deltaT); - iMsbeq= (model->SOI3type)*(here->SOI3iMsb-here->SOI3gMd*(-vds)- - here->SOI3gMmf*vgfd-here->SOI3gMmbs*vbd- - here->SOI3gMmb*vgbd-here->SOI3gMdeltaT*deltaT); - iMdbeq = 0; - } - *(ckt->CKTrhs + here->SOI3gfNode) -= m * (model->SOI3type * ieqqgf); - *(ckt->CKTrhs + here->SOI3gbNode) -= m * (model->SOI3type * ieqqgb); - *(ckt->CKTrhs + here->SOI3bNode) += m * (-(ieqbs + ieqbd) + - iMdbeq + iMsbeq /* one is 0 */ - +iBJTdbeq + iBJTsbeq - + model->SOI3type * (ieqqgf + ieqqd + ieqqs + ieqqgb) - - model->SOI3type * (ieqqBJTbs + ieqqBJTbd)); - *(ckt->CKTrhs + here->SOI3dNodePrime) += m * ((ieqbd-idreq) - - iMdbeq - iBJTdbeq - - model->SOI3type * (ieqqd) - + model->SOI3type * (ieqqBJTbd)); - *(ckt->CKTrhs + here->SOI3sNodePrime) += m * ((idreq + ieqbs) - - iMsbeq - iBJTsbeq - - model->SOI3type * (ieqqs) - + model->SOI3type * (ieqqBJTbs)); - *(ckt->CKTrhs + here->SOI3toutNode) += m * (ieqPt-ieqct); - if (here->SOI3numThermalNodes > 1) - { - *(ckt->CKTrhs + here->SOI3tout1Node) += m * (ieqct-ieqct1); - } - if (here->SOI3numThermalNodes > 2) - { - *(ckt->CKTrhs + here->SOI3tout2Node) += m * (ieqct1-ieqct2); - } - if (here->SOI3numThermalNodes > 3) - { - *(ckt->CKTrhs + here->SOI3tout3Node) += m * (ieqct2-ieqct3); - } - if (here->SOI3numThermalNodes > 4) - { - *(ckt->CKTrhs + here->SOI3tout4Node) += m * (ieqct3-ieqct4); - } - - - /* load y matrix */ - - *(here->SOI3D_dPtr) += m * (here->SOI3drainConductance); - *(here->SOI3D_dpPtr) += m * (-here->SOI3drainConductance); - *(here->SOI3DP_dPtr) += m * (-here->SOI3drainConductance); - - *(here->SOI3S_sPtr) += m * (here->SOI3sourceConductance); - *(here->SOI3S_spPtr) += m * (-here->SOI3sourceConductance); - *(here->SOI3SP_sPtr) += m * (-here->SOI3sourceConductance); - - *(here->SOI3GF_gfPtr) += m * gcgfgf; - *(here->SOI3GF_dpPtr) += m * gcgfd; - *(here->SOI3GF_spPtr) += m * gcgfs; - *(here->SOI3GF_gbPtr) += m * gcgfgb; - *(here->SOI3GF_bPtr) -= m * (gcgfgf + gcgfd + gcgfs + gcgfgb); - - *(here->SOI3DP_gfPtr) += m * ((xnrm-xrev)*here->SOI3gmf + gcdgf+ - xnrm*here->SOI3gMmf); - *(here->SOI3DP_dpPtr) += m * ((here->SOI3drainConductance+here->SOI3gds+ - here->SOI3gbd+xrev*(here->SOI3gmf+here->SOI3gmbs+ - here->SOI3gmb)+xnrm*here->SOI3gMd + gcdd)+ - gcBJTbdbd); - *(here->SOI3DP_spPtr) += m * ((-here->SOI3gds - here->SOI3gBJTdb_bs - -xnrm*(here->SOI3gmf+here->SOI3gmb+here->SOI3gmbs + - here->SOI3gMmf+here->SOI3gMmb+here->SOI3gMmbs+here->SOI3gMd)) + - gcds); - *(here->SOI3DP_gbPtr) += m * (((xnrm-xrev)*here->SOI3gmb + - xnrm*here->SOI3gMmb) + gcdgb); - *(here->SOI3DP_bPtr) += m * ((-here->SOI3gbd + here->SOI3gBJTdb_bs + - (xnrm-xrev)*here->SOI3gmbs + - xnrm*here->SOI3gMmbs) - - (gcdgf + gcdd + gcds + gcdgb + gcBJTbdbd)); - - *(here->SOI3SP_gfPtr) += m * ((-(xnrm-xrev)*here->SOI3gmf+ - xrev*here->SOI3gMmf) + - gcsgf); - *(here->SOI3SP_dpPtr) += m * ((-here->SOI3gds - here->SOI3gBJTsb_bd - -xrev*(here->SOI3gmf+here->SOI3gmb+here->SOI3gmbs+ - here->SOI3gMmf+here->SOI3gMmb+here->SOI3gMmbs+here->SOI3gMd)) + - gcsd); - *(here->SOI3SP_spPtr) += m * ((here->SOI3sourceConductance+here->SOI3gds+ - here->SOI3gbs+xnrm*(here->SOI3gmf+here->SOI3gmbs+ - here->SOI3gmb)+xrev*here->SOI3gMd + gcss)+ - gcBJTbsbs); - *(here->SOI3SP_gbPtr) += m * ((-(xnrm-xrev)*here->SOI3gmb+ - xrev*here->SOI3gMmb) + gcsgb); - *(here->SOI3SP_bPtr) += m * ((-here->SOI3gbs + here->SOI3gBJTsb_bd - - (xnrm-xrev)*here->SOI3gmbs+ - xrev*here->SOI3gMmbs) - - (gcsgf + gcsd + gcss + gcsgb + gcBJTbsbs)); - - *(here->SOI3GB_gfPtr) += m * gcgbgf; - *(here->SOI3GB_dpPtr) += m * gcgbd; - *(here->SOI3GB_spPtr) += m * gcgbs; - *(here->SOI3GB_gbPtr) += m * gcgbgb; - *(here->SOI3GB_bPtr) -= m * (gcgbgf + gcgbd + gcgbs + gcgbgb); - - *(here->SOI3B_gfPtr) += m * (-here->SOI3gMmf + gcbgf); - *(here->SOI3B_dpPtr) += m * (-(here->SOI3gbd) + here->SOI3gBJTsb_bd + - xrev*(here->SOI3gMmf+here->SOI3gMmb+ - here->SOI3gMmbs+here->SOI3gMd) - - xnrm*here->SOI3gMd + - gcbd - gcBJTbdbd); - *(here->SOI3B_spPtr) += m * (-(here->SOI3gbs) + here->SOI3gBJTdb_bs + - xnrm*(here->SOI3gMmf+here->SOI3gMmb+ - here->SOI3gMmbs+here->SOI3gMd) - - xrev*here->SOI3gMd + - gcbs - gcBJTbsbs); - *(here->SOI3B_gbPtr) += m * (-(here->SOI3gMmb) + gcbgb); - *(here->SOI3B_bPtr) += m * ((here->SOI3gbd+here->SOI3gbs - - here->SOI3gMmbs - - here->SOI3gBJTdb_bs - here->SOI3gBJTsb_bd) - - (gcbgf+gcbd+gcbs+gcbgb) + - gcBJTbsbs+gcBJTbdbd); - - -/* if no thermal behaviour specified, then put in zero valued indpt. voltage source - between TOUT and ground */ - if (here->SOI3rt==0) - { - *(here->SOI3TOUT_ibrPtr) += m * 1.0 ; - *(here->SOI3IBR_toutPtr) += m * 1.0 ; - *(ckt->CKTrhs + (here->SOI3branch)) = 0 ; - } - else - { - *(here->SOI3TOUT_toutPtr) += m * (-(here->SOI3gPdT)+grt[0]+gct[0]); - - if (here->SOI3numThermalNodes > 1) - { - *(here->SOI3TOUT_tout1Ptr) += m * (-grt[0]-gct[0]); - *(here->SOI3TOUT1_toutPtr) += m * (-grt[0]-gct[0]); - *(here->SOI3TOUT1_tout1Ptr) += m * (grt[0]+grt[1]+gct[0]+gct[1]); - } - if (here->SOI3numThermalNodes > 2) - { - *(here->SOI3TOUT1_tout2Ptr) += m * (-grt[1]-gct[1]); - *(here->SOI3TOUT2_tout1Ptr) += m * (-grt[1]-gct[1]); - *(here->SOI3TOUT2_tout2Ptr) += m * (grt[1]+grt[2]+gct[1]+gct[2]); - } - if (here->SOI3numThermalNodes > 3) - { - *(here->SOI3TOUT2_tout3Ptr) += m * (-grt[2]-gct[2]); - *(here->SOI3TOUT3_tout2Ptr) += m * (-grt[2]-gct[2]); - *(here->SOI3TOUT3_tout3Ptr) += m * (grt[2]+grt[3]+gct[2]+gct[3]); - } - if (here->SOI3numThermalNodes > 4) - { - *(here->SOI3TOUT3_tout4Ptr) += m * (-grt[3]-gct[3]); - *(here->SOI3TOUT4_tout3Ptr) += m * (-grt[3]-gct[3]); - *(here->SOI3TOUT4_tout4Ptr) += m * (grt[3]+grt[4]+gct[3]+gct[4]); - } - - *(here->SOI3TOUT_dpPtr) += m * (xnrm*(-(here->SOI3gPds*model->SOI3type)) - +xrev*(here->SOI3gPds+here->SOI3gPmf+ - here->SOI3gPmb+here->SOI3gPmbs)* - model->SOI3type); - *(here->SOI3TOUT_gfPtr) += m * (-(here->SOI3gPmf*model->SOI3type)); - *(here->SOI3TOUT_gbPtr) += m * (-(here->SOI3gPmb*model->SOI3type)); - *(here->SOI3TOUT_bPtr) += m * (-(here->SOI3gPmbs*model->SOI3type)); - *(here->SOI3TOUT_spPtr) += m * (xnrm*(here->SOI3gPds+here->SOI3gPmf+ - here->SOI3gPmb+here->SOI3gPmbs)*model->SOI3type - +xrev*(-(here->SOI3gPds*model->SOI3type))); - - *(here->SOI3DP_toutPtr) += m * (xnrm-xrev)*here->SOI3gt*model->SOI3type; - *(here->SOI3SP_toutPtr) += m * (xrev-xnrm)*here->SOI3gt*model->SOI3type; -/* need to mult by type in above as conductances will be used with exterior voltages - which will be -ve for PMOS except for gPdT */ -/* now for thermal influence on impact ionisation current and tranisent stuff */ - *(here->SOI3GF_toutPtr) += m * gcgfdeltaT*model->SOI3type; - *(here->SOI3DP_toutPtr) += m * (xnrm*here->SOI3gMdeltaT + gcddeltaT - - here->SOI3gbdT + here->SOI3gBJTdb_deltaT - - gcBJTbddeltaT)*model->SOI3type; - *(here->SOI3SP_toutPtr) += m * (xrev*here->SOI3gMdeltaT + gcsdeltaT - - here->SOI3gbsT + here->SOI3gBJTsb_deltaT - - gcBJTbsdeltaT)*model->SOI3type; - *(here->SOI3GB_toutPtr) += m * gcgbdeltaT*model->SOI3type; - *(here->SOI3B_toutPtr) -= m * (here->SOI3gMdeltaT - gcbdeltaT - - here->SOI3gbsT - here->SOI3gbdT + - here->SOI3gBJTdb_deltaT + - here->SOI3gBJTsb_deltaT - -gcBJTbsdeltaT-gcBJTbddeltaT)*model->SOI3type; - } -End: ; - } - } - return(OK); -} - - - /* DEVsoipnjlim(vnew,vold,vt,vcrit,icheck) - * limit the per-iteration change of PN junction voltages - */ - -double -DEVsoipnjlim(double vnew, double vold, double vt, double vcrit, int *icheck) -{ - double arg; - - if((vnew > vcrit) && (fabs(vnew - vold) > (vt + vt))) { - if(vold > 0) { - arg = 1 + (vnew - vold) / vt; - if(arg > 0) { - vnew = vold + vt * log(arg); - } else { - vnew = vcrit; - } - } else { - vnew = vt *log(vnew/vt); - } - *icheck = 1; - } else { - if (fabs(vnew - vold) < (vt + vt)) { - *icheck = 0; - } else { - if (vnew>vold) { - *icheck = 0; - } else { - arg = 1 + (vold - vnew) / vt; - vnew = vold - vt*log(arg); - *icheck = 1; - } - } - } - return(vnew); -} diff --git a/src/spicelib/devices/soi3/soi3mask.c b/src/spicelib/devices/soi3/soi3mask.c deleted file mode 100644 index 4855d0706..000000000 --- a/src/spicelib/devices/soi3/soi3mask.c +++ /dev/null @@ -1,290 +0,0 @@ -/********** -STAG version 2.7 -Copyright 2000 owned by the United Kingdom Secretary of State for Defence -acting through the Defence Evaluation and Research Agency. -Developed by : Jim Benson, - Department of Electronics and Computer Science, - University of Southampton, - United Kingdom. -With help from : Nele D'Halleweyn, Ketan Mistry, Bill Redman-White, and Craig Easson. - -Based on STAG version 2.1 -Developed by : Mike Lee, -With help from : Bernard Tenbroek, Bill Redman-White, Mike Uren, Chris Edwards - and John Bunyan. -Acknowledgements : Rupert Howes and Pete Mole. -**********/ - -/********** -Modified by Paolo Nenzi 2002 -ngspice integration -**********/ - -#include "ngspice/ngspice.h" -#include "ngspice/const.h" -#include "ngspice/ifsim.h" -#include "ngspice/cktdefs.h" -#include "ngspice/devdefs.h" -#include "soi3defs.h" -#include "ngspice/sperror.h" -#include "ngspice/suffix.h" - - -/*ARGSUSED*/ -int -SOI3mAsk(CKTcircuit *ckt, GENmodel *inst, int which, IFvalue *value) -{ - SOI3model *model = (SOI3model *)inst; - - NG_IGNORE(ckt); - - switch(which) { - case SOI3_MOD_VTO: - value->rValue = model->SOI3vt0; - return(OK); - case SOI3_MOD_VFBF: - value->rValue = model->SOI3vfbF; - return(OK); - case SOI3_MOD_KP: - value->rValue = model->SOI3transconductance; - return(OK); - case SOI3_MOD_GAMMA: - value->rValue = model->SOI3gamma; - return(OK); - case SOI3_MOD_PHI: - value->rValue = model->SOI3phi; - return(OK); - case SOI3_MOD_LAMBDA: - value->rValue = model->SOI3lambda; - return(OK); - case SOI3_MOD_THETA: - value->rValue = model->SOI3theta; - return(OK); - case SOI3_MOD_RD: - value->rValue = model->SOI3drainResistance; - return(OK); - case SOI3_MOD_RS: - value->rValue = model->SOI3sourceResistance; - return(OK); - case SOI3_MOD_CBD: - value->rValue = model->SOI3capBD; - return(OK); - case SOI3_MOD_CBS: - value->rValue = model->SOI3capBS; - return(OK); - case SOI3_MOD_IS: - value->rValue = model->SOI3jctSatCur; - return(OK); - case SOI3_MOD_IS1: - value->rValue = model->SOI3jctSatCur1; - return(OK); - case SOI3_MOD_PB: - value->rValue = model->SOI3bulkJctPotential; - return(OK); - case SOI3_MOD_CGFSO: - value->rValue = model->SOI3frontGateSourceOverlapCapFactor; - return(OK); - case SOI3_MOD_CGFDO: - value->rValue = model->SOI3frontGateDrainOverlapCapFactor; - return(OK); - case SOI3_MOD_CGFBO: - value->rValue = model->SOI3frontGateBulkOverlapCapFactor; - return(OK); - case SOI3_MOD_CGBSO: - value->rValue = model->SOI3backGateSourceOverlapCapAreaFactor; - return(OK); - case SOI3_MOD_CGBDO: - value->rValue = model->SOI3backGateDrainOverlapCapAreaFactor; - return(OK); - case SOI3_MOD_CGBBO: - value->rValue = model->SOI3backGateBulkOverlapCapAreaFactor; - return(OK); - case SOI3_MOD_RSH: - value->rValue = model->SOI3sheetResistance; - return(OK); - case SOI3_MOD_CJSW: - value->rValue = model->SOI3sideWallCapFactor; - return(OK); - case SOI3_MOD_MJSW: - value->rValue = model->SOI3bulkJctSideGradingCoeff; - return(OK); - case SOI3_MOD_JS: - value->rValue = model->SOI3jctSatCurDensity; - return(OK); - case SOI3_MOD_JS1: - value->rValue = model->SOI3jctSatCurDensity1; - return(OK); - case SOI3_MOD_TOF: - value->rValue = model->SOI3frontOxideThickness; - return(OK); - case SOI3_MOD_TOB: - value->rValue = model->SOI3backOxideThickness; - return(OK); - case SOI3_MOD_TB: - value->rValue = model->SOI3bodyThickness; - return(OK); - case SOI3_MOD_LD: - value->rValue = model->SOI3latDiff; - return(OK); - case SOI3_MOD_U0: - value->rValue = model->SOI3surfaceMobility; - return(OK); - case SOI3_MOD_FC: - value->rValue = model->SOI3fwdCapDepCoeff; - return(OK); - case SOI3_MOD_KOX: - value->rValue = model->SOI3oxideThermalConductivity; - return(OK); - case SOI3_MOD_SHSI: - value->rValue = model->SOI3siliconSpecificHeat; - return(OK); - case SOI3_MOD_DSI: - value->rValue = model->SOI3siliconDensity; - return(OK); - case SOI3_MOD_NSUB: - value->rValue = model->SOI3substrateDoping; - return(OK); - case SOI3_MOD_TPG: - value->iValue = model->SOI3gateType; - return(OK); - case SOI3_MOD_NQFF: - value->rValue = model->SOI3frontFixedChargeDensity; - return(OK); - case SOI3_MOD_NQFB: - value->rValue = model->SOI3backFixedChargeDensity; - return(OK); - case SOI3_MOD_NSSF: - value->rValue = model->SOI3frontSurfaceStateDensity; - return(OK); - case SOI3_MOD_NSSB: - value->rValue = model->SOI3backSurfaceStateDensity; - return(OK); - case SOI3_MOD_TNOM: - value->rValue = model->SOI3tnom-CONSTCtoK; - return(OK); -/* extra stuff for newer model - msll Jan96 */ - case SOI3_MOD_SIGMA: - value->rValue = model->SOI3sigma; - return(OK); - case SOI3_MOD_CHIFB: - value->rValue = model->SOI3chiFB; - return(OK); - case SOI3_MOD_CHIPHI: - value->rValue = model->SOI3chiPHI; - return(OK); - case SOI3_MOD_DELTAW: - value->rValue = model->SOI3deltaW; - return(OK); - case SOI3_MOD_DELTAL: - value->rValue = model->SOI3deltaL; - return(OK); - case SOI3_MOD_VSAT: - value->rValue = model->SOI3vsat; - return(OK); - case SOI3_MOD_K: - value->rValue = model->SOI3k; - return(OK); - case SOI3_MOD_LX: - value->rValue = model->SOI3lx; - return(OK); - case SOI3_MOD_VP: - value->rValue = model->SOI3vp; - return(OK); - case SOI3_MOD_ETA: - value->rValue = model->SOI3eta; - return(OK); - case SOI3_MOD_ALPHA0: - value->rValue = model->SOI3alpha0; - return(OK); - case SOI3_MOD_BETA0: - value->rValue = model->SOI3beta0; - return(OK); - case SOI3_MOD_LM: - value->rValue = model->SOI3lm; - return(OK); - case SOI3_MOD_LM1: - value->rValue = model->SOI3lm1; - return(OK); - case SOI3_MOD_LM2: - value->rValue = model->SOI3lm2; - return(OK); - case SOI3_MOD_ETAD: - value->rValue = model->SOI3etad; - return(OK); - case SOI3_MOD_ETAD1: - value->rValue = model->SOI3etad1; - return(OK); - case SOI3_MOD_CHIBETA: - value->rValue = model->SOI3chibeta; - return(OK); - case SOI3_MOD_VFBB: - value->rValue = model->SOI3vfbB; - return(OK); - case SOI3_MOD_GAMMAB: - value->rValue = model->SOI3gammaB; - return(OK); - case SOI3_MOD_CHID: - value->rValue = model->SOI3chid; - return(OK); - case SOI3_MOD_CHID1: - value->rValue = model->SOI3chid1; - return(OK); - case SOI3_MOD_DVT: - value->iValue = model->SOI3dvt; - return(OK); - case SOI3_MOD_NLEV: - value->iValue = model->SOI3nLev; - return(OK); - case SOI3_MOD_BETABJT: - value->rValue = model->SOI3betaBJT; - return(OK); - case SOI3_MOD_TAUFBJT: - value->rValue = model->SOI3tauFBJT; - return(OK); - case SOI3_MOD_TAURBJT: - value->rValue = model->SOI3tauRBJT; - return(OK); - case SOI3_MOD_BETAEXP: - value->rValue = model->SOI3betaEXP; - return(OK); - case SOI3_MOD_TAUEXP: - value->rValue = model->SOI3tauEXP; - return(OK); - case SOI3_MOD_RSW: - value->rValue = model->SOI3rsw; - return(OK); - case SOI3_MOD_RDW: - value->rValue = model->SOI3rdw; - return(OK); - case SOI3_MOD_FMIN: - value->rValue = model->SOI3minimumFeatureSize; - return(OK); - case SOI3_MOD_VTEX: - value->rValue = model->SOI3vtex; - return(OK); - case SOI3_MOD_VDEX: - value->rValue = model->SOI3vdex; - return(OK); - case SOI3_MOD_DELTA0: - value->rValue = model->SOI3delta0; - return(OK); - case SOI3_MOD_CSF: - value->rValue = model->SOI3satChargeShareFactor; - return(OK); - case SOI3_MOD_NPLUS: - value->rValue = model->SOI3nplusDoping; - return(OK); - case SOI3_MOD_RTA: - value->rValue = model->SOI3rta; - return(OK); - case SOI3_MOD_CTA: - value->rValue = model->SOI3cta; - return(OK); - case SOI3_MOD_MEXP: - value->rValue = model->SOI3mexp; - return(OK); - default: - return(E_BADPARM); - } - /* NOTREACHED */ -} diff --git a/src/spicelib/devices/soi3/soi3mpar.c b/src/spicelib/devices/soi3/soi3mpar.c deleted file mode 100644 index 14ee12567..000000000 --- a/src/spicelib/devices/soi3/soi3mpar.c +++ /dev/null @@ -1,393 +0,0 @@ -/********** -STAG version 2.7 -Copyright 2000 owned by the United Kingdom Secretary of State for Defence -acting through the Defence Evaluation and Research Agency. -Developed by : Jim Benson, - Department of Electronics and Computer Science, - University of Southampton, - United Kingdom. -With help from : Nele D'Halleweyn, Ketan Mistry, Bill Redman-White, and Craig Easson. - -Based on STAG version 2.1 -Developed by : Mike Lee, -With help from : Bernard Tenbroek, Bill Redman-White, Mike Uren, Chris Edwards - and John Bunyan. -Acknowledgements : Rupert Howes and Pete Mole. -**********/ - -/********** -Modified by Paolo Nenzi 2002 -ngspice integration -**********/ - -#include "ngspice/ngspice.h" -#include "ngspice/const.h" -#include "ngspice/ifsim.h" -#include "soi3defs.h" -#include "ngspice/sperror.h" -#include "ngspice/suffix.h" - -int -SOI3mParam(int param, IFvalue *value, GENmodel *inModel) -{ - register SOI3model *model = (SOI3model *)inModel; - switch(param) { - case SOI3_MOD_VTO: - model->SOI3vt0 = value->rValue; - model->SOI3vt0Given = TRUE; - break; - case SOI3_MOD_VFBF: - model->SOI3vfbF = value->rValue; - model->SOI3vfbFGiven = TRUE; - break; - case SOI3_MOD_KP: - model->SOI3transconductance = value->rValue; - model->SOI3transconductanceGiven = TRUE; - break; - case SOI3_MOD_GAMMA: - model->SOI3gamma = value->rValue; - model->SOI3gammaGiven = TRUE; - break; - case SOI3_MOD_PHI: - model->SOI3phi = value->rValue; - model->SOI3phiGiven = TRUE; - break; - case SOI3_MOD_LAMBDA: - model->SOI3lambda = value->rValue; - model->SOI3lambdaGiven = TRUE; - break; - case SOI3_MOD_THETA: - model->SOI3theta = value->rValue; - model->SOI3thetaGiven = TRUE; - break; - case SOI3_MOD_RD: - model->SOI3drainResistance = value->rValue; - model->SOI3drainResistanceGiven = TRUE; - break; - case SOI3_MOD_RS: - model->SOI3sourceResistance = value->rValue; - model->SOI3sourceResistanceGiven = TRUE; - break; - case SOI3_MOD_CBD: - model->SOI3capBD = value->rValue; - model->SOI3capBDGiven = TRUE; - break; - case SOI3_MOD_CBS: - model->SOI3capBS = value->rValue; - model->SOI3capBSGiven = TRUE; - break; - case SOI3_MOD_IS: - model->SOI3jctSatCur = value->rValue; - model->SOI3jctSatCurGiven = TRUE; - break; - case SOI3_MOD_IS1: - model->SOI3jctSatCur1 = value->rValue; - model->SOI3jctSatCur1Given = TRUE; - break; - case SOI3_MOD_PB: - model->SOI3bulkJctPotential = value->rValue; - model->SOI3bulkJctPotentialGiven = TRUE; - break; - case SOI3_MOD_CGFSO: - model->SOI3frontGateSourceOverlapCapFactor = value->rValue; - model->SOI3frontGateSourceOverlapCapFactorGiven = TRUE; - break; - case SOI3_MOD_CGFDO: - model->SOI3frontGateDrainOverlapCapFactor = value->rValue; - model->SOI3frontGateDrainOverlapCapFactorGiven = TRUE; - break; - case SOI3_MOD_CGFBO: - model->SOI3frontGateBulkOverlapCapFactor = value->rValue; - model->SOI3frontGateBulkOverlapCapFactorGiven = TRUE; - break; - case SOI3_MOD_CGBSO: - model->SOI3backGateSourceOverlapCapAreaFactor = value->rValue; - model->SOI3backGateSourceOverlapCapAreaFactorGiven = TRUE; - break; - case SOI3_MOD_CGBDO: - model->SOI3backGateDrainOverlapCapAreaFactor = value->rValue; - model->SOI3backGateDrainOverlapCapAreaFactorGiven = TRUE; - break; - case SOI3_MOD_CGBBO: - model->SOI3backGateBulkOverlapCapAreaFactor = value->rValue; - model->SOI3backGateBulkOverlapCapAreaFactorGiven = TRUE; - break; -/* case SOI3_MOD_CJ: - model->SOI3bulkCapFactor = value->rValue; - model->SOI3bulkCapFactorGiven = TRUE; - break; - case SOI3_MOD_MJ: - model->SOI3bulkJctBotGradingCoeff = value->rValue; - model->SOI3bulkJctBotGradingCoeffGiven = TRUE; - break; */ - case SOI3_MOD_RSH: - model->SOI3sheetResistance = value->rValue; - model->SOI3sheetResistanceGiven = TRUE; - break; - case SOI3_MOD_CJSW: - model->SOI3sideWallCapFactor = value->rValue; - model->SOI3sideWallCapFactorGiven = TRUE; - break; - case SOI3_MOD_MJSW: - model->SOI3bulkJctSideGradingCoeff = value->rValue; - model->SOI3bulkJctSideGradingCoeffGiven = TRUE; - break; - case SOI3_MOD_JS: - model->SOI3jctSatCurDensity = value->rValue; - model->SOI3jctSatCurDensityGiven = TRUE; - break; - case SOI3_MOD_JS1: - model->SOI3jctSatCurDensity1 = value->rValue; - model->SOI3jctSatCurDensity1Given = TRUE; - break; - case SOI3_MOD_TOF: - model->SOI3frontOxideThickness = value->rValue; - model->SOI3frontOxideThicknessGiven = TRUE; - break; - case SOI3_MOD_TOB: - model->SOI3backOxideThickness = value->rValue; - model->SOI3backOxideThicknessGiven = TRUE; - break; - case SOI3_MOD_TB: - model->SOI3bodyThickness = value->rValue; - model->SOI3bodyThicknessGiven = TRUE; - break; - case SOI3_MOD_LD: - model->SOI3latDiff = value->rValue; - model->SOI3latDiffGiven = TRUE; - break; - case SOI3_MOD_U0: - model->SOI3surfaceMobility = value->rValue; - model->SOI3surfaceMobilityGiven = TRUE; - break; - case SOI3_MOD_FC: - model->SOI3fwdCapDepCoeff = value->rValue; - model->SOI3fwdCapDepCoeffGiven = TRUE; - break; - case SOI3_MOD_NSOI3: - if(value->iValue) { - model->SOI3type = 1; - model->SOI3typeGiven = TRUE; - } - break; - case SOI3_MOD_PSOI3: - if(value->iValue) { - model->SOI3type = -1; - model->SOI3typeGiven = TRUE; - } - break; - case SOI3_MOD_KOX: - model->SOI3oxideThermalConductivity = value->rValue; - model->SOI3oxideThermalConductivityGiven = TRUE; - break; - case SOI3_MOD_SHSI: - model->SOI3siliconSpecificHeat = value->rValue; - model->SOI3siliconSpecificHeatGiven = TRUE; - break; - case SOI3_MOD_DSI: - model->SOI3siliconDensity = value->rValue; - model->SOI3siliconDensityGiven = TRUE; - break; - case SOI3_MOD_NSUB: - model->SOI3substrateDoping = value->rValue; - model->SOI3substrateDopingGiven = TRUE; - break; - case SOI3_MOD_TPG: - model->SOI3gateType = value->iValue; - model->SOI3gateTypeGiven = TRUE; - break; - case SOI3_MOD_NQFF: - model->SOI3frontFixedChargeDensity = value->rValue; - model->SOI3frontFixedChargeDensityGiven = TRUE; - break; - case SOI3_MOD_NQFB: - model->SOI3backFixedChargeDensity = value->rValue; - model->SOI3backFixedChargeDensityGiven = TRUE; - break; - case SOI3_MOD_NSSF: - model->SOI3frontSurfaceStateDensity = value->rValue; - model->SOI3frontSurfaceStateDensityGiven = TRUE; - break; - case SOI3_MOD_NSSB: - model->SOI3backSurfaceStateDensity = value->rValue; - model->SOI3backSurfaceStateDensityGiven = TRUE; - break; - case SOI3_MOD_TNOM: - model->SOI3tnom = value->rValue+CONSTCtoK; - model->SOI3tnomGiven = TRUE; - break; - case SOI3_MOD_KF: - model->SOI3fNcoef = value->rValue; - model->SOI3fNcoefGiven = TRUE; - break; - case SOI3_MOD_AF: - model->SOI3fNexp = value->rValue; - model->SOI3fNexpGiven = TRUE; - break; -/* extra stuff for newer model - msll Jan96 */ - case SOI3_MOD_SIGMA: - model->SOI3sigma = value->rValue; - model->SOI3sigmaGiven = TRUE; - break; - case SOI3_MOD_CHIFB: - model->SOI3chiFB = value->rValue; - model->SOI3chiFBGiven = TRUE; - break; - case SOI3_MOD_CHIPHI: - model->SOI3chiPHI = value->rValue; - model->SOI3chiPHIGiven = TRUE; - break; - case SOI3_MOD_DELTAW: - model->SOI3deltaW = value->rValue; - model->SOI3deltaWGiven = TRUE; - break; - case SOI3_MOD_DELTAL: - model->SOI3deltaL = value->rValue; - model->SOI3deltaLGiven = TRUE; - break; - case SOI3_MOD_VSAT: - model->SOI3vsat = value->rValue; - model->SOI3vsatGiven = TRUE; - break; - case SOI3_MOD_K: - model->SOI3k = value->rValue; - model->SOI3kGiven = TRUE; - break; - case SOI3_MOD_LX: - model->SOI3lx = value->rValue; - model->SOI3lxGiven = TRUE; - break; - case SOI3_MOD_VP: - model->SOI3vp = value->rValue; - model->SOI3vpGiven = TRUE; - break; - case SOI3_MOD_ETA: - model->SOI3eta = value->rValue; - model->SOI3etaGiven = TRUE; - break; - case SOI3_MOD_ALPHA0: - model->SOI3alpha0 = value->rValue; - model->SOI3alpha0Given = TRUE; - break; - case SOI3_MOD_BETA0: - model->SOI3beta0 = value->rValue; - model->SOI3beta0Given = TRUE; - break; - case SOI3_MOD_LM: - model->SOI3lm = value->rValue; - model->SOI3lmGiven = TRUE; - break; - case SOI3_MOD_LM1: - model->SOI3lm1 = value->rValue; - model->SOI3lm1Given = TRUE; - break; - case SOI3_MOD_LM2: - model->SOI3lm2 = value->rValue; - model->SOI3lm2Given = TRUE; - break; - case SOI3_MOD_ETAD: - model->SOI3etad = value->rValue; - model->SOI3etadGiven = TRUE; - break; - case SOI3_MOD_ETAD1: - model->SOI3etad1 = value->rValue; - model->SOI3etad1Given = TRUE; - break; - case SOI3_MOD_CHIBETA: - model->SOI3chibeta = value->rValue; - model->SOI3chibetaGiven = TRUE; - break; - case SOI3_MOD_VFBB: - model->SOI3vfbB = value->rValue; - model->SOI3vfbBGiven = TRUE; - break; - case SOI3_MOD_GAMMAB: - model->SOI3gammaB = value->rValue; - model->SOI3gammaBGiven = TRUE; - break; - case SOI3_MOD_CHID: - model->SOI3chid = value->rValue; - model->SOI3chidGiven = TRUE; - break; - case SOI3_MOD_CHID1: - model->SOI3chid1 = value->rValue; - model->SOI3chid1Given = TRUE; - break; - case SOI3_MOD_DVT: - model->SOI3dvt = value->iValue; - model->SOI3dvtGiven = TRUE; - break; - case SOI3_MOD_NLEV: - model->SOI3nLev = value->iValue; - model->SOI3nLevGiven = TRUE; - break; - case SOI3_MOD_BETABJT: - model->SOI3betaBJT = value->rValue; - model->SOI3betaBJTGiven = TRUE; - break; - case SOI3_MOD_TAUFBJT: - model->SOI3tauFBJT = value->rValue; - model->SOI3tauFBJTGiven = TRUE; - break; - case SOI3_MOD_TAURBJT: - model->SOI3tauRBJT = value->rValue; - model->SOI3tauRBJTGiven = TRUE; - break; - case SOI3_MOD_BETAEXP: - model->SOI3betaEXP = value->rValue; - model->SOI3betaEXPGiven = TRUE; - break; - case SOI3_MOD_TAUEXP: - model->SOI3tauEXP = value->rValue; - model->SOI3tauEXPGiven = TRUE; - break; - case SOI3_MOD_RSW: - model->SOI3rsw = value->rValue; - model->SOI3rswGiven = TRUE; - break; - case SOI3_MOD_RDW: - model->SOI3rdw = value->rValue; - model->SOI3rdwGiven = TRUE; - break; - case SOI3_MOD_FMIN: - model->SOI3minimumFeatureSize = value->rValue; - model->SOI3minimumFeatureSizeGiven = TRUE; - break; - case SOI3_MOD_VTEX: - model->SOI3vtex = value->rValue; - model->SOI3vtexGiven = TRUE; - break; - case SOI3_MOD_VDEX: - model->SOI3vdex = value->rValue; - model->SOI3vdexGiven = TRUE; - break; - case SOI3_MOD_DELTA0: - model->SOI3delta0 = value->rValue; - model->SOI3delta0Given = TRUE; - break; - case SOI3_MOD_CSF: - model->SOI3satChargeShareFactor = value->rValue; - model->SOI3satChargeShareFactorGiven = TRUE; - break; - case SOI3_MOD_NPLUS: - model->SOI3nplusDoping = value->rValue; - model->SOI3nplusDopingGiven = TRUE; - break; - case SOI3_MOD_RTA: - model->SOI3rta = value->rValue; - model->SOI3rtaGiven = TRUE; - break; - case SOI3_MOD_CTA: - model->SOI3cta = value->rValue; - model->SOI3ctaGiven = TRUE; - break; - case SOI3_MOD_MEXP: - model->SOI3mexp = value->rValue; - model->SOI3mexpGiven = TRUE; - break; - - default: - return(E_BADPARM); - } - return(OK); -} diff --git a/src/spicelib/devices/soi3/soi3nois.c b/src/spicelib/devices/soi3/soi3nois.c deleted file mode 100644 index 3e0817501..000000000 --- a/src/spicelib/devices/soi3/soi3nois.c +++ /dev/null @@ -1,247 +0,0 @@ -/********** -STAG version 2.7 -Copyright 2000 owned by the United Kingdom Secretary of State for Defence -acting through the Defence Evaluation and Research Agency. -Developed by : Jim Benson, - Department of Electronics and Computer Science, - University of Southampton, - United Kingdom. -With help from : Nele D'Halleweyn, Bill Redman-White, and Craig Easson. - -Based on STAG version 2.1 -Developed by : Mike Lee, -With help from : Bernard Tenbroek, Bill Redman-White, Mike Uren, Chris Edwards - and John Bunyan. -Acknowledgements : Rupert Howes and Pete Mole. -**********/ - -/********** -Modified by Paolo Nenzi 2002 -ngspice integration -**********/ - -#include "ngspice/ngspice.h" -#include "soi3defs.h" -#include "ngspice/cktdefs.h" -#include "ngspice/iferrmsg.h" -#include "ngspice/noisedef.h" -#include "ngspice/const.h" -#include "ngspice/suffix.h" - - -/* This routine is VERY closely based on the standard MOS noise function. - * SOI3noise (mode, operation, firstModel, ckt, data, OnDens) - * This routine names and evaluates all of the noise sources - * associated with MOSFET's. It starts with the model *firstModel and - * traverses all of its insts. It then proceeds to any other models - * on the linked list. The total output noise density generated by - * all of the MOSFET's is summed with the variable "OnDens". - */ - - -int -SOI3noise (int mode, int operation, GENmodel *genmodel, CKTcircuit *ckt, - Ndata *data, double *OnDens) - -{ - NOISEAN *job = (NOISEAN *) ckt->CKTcurJob; - - SOI3model *firstModel = (SOI3model *) genmodel; - SOI3model *model; - SOI3instance *inst; - double tempOnoise; - double tempInoise; - double noizDens[SOI3NSRCS]; - double lnNdens[SOI3NSRCS]; - double gain; - double EffectiveLength; - int i; - - /* define the names of the noise sources */ - - - - static char *SOI3nNames[SOI3NSRCS] = { /* Note that we have to keep the order */ - "_rd", /* noise due to rd */ /* consistent with the index definitions */ - "_rs", /* noise due to rs */ /* in SOI3defs.h */ - "_id", /* noise due to id */ - "_1overf", /* flicker (1/f) noise */ - "" /* total transistor noise */ - }; - - for (model=firstModel; model != NULL; model=SOI3nextModel(model)) { - for (inst=SOI3instances(model); inst != NULL; inst=SOI3nextInstance(inst)) { - - switch (operation) { - - case N_OPEN: - - /* see if we have to to produce a summary report */ - /* if so, name all the noise generators */ - - if (job->NStpsSm != 0) { - switch (mode) { - - case N_DENS: - for (i=0; i < SOI3NSRCS; i++) { - NOISE_ADD_OUTVAR(ckt, data, "onoise_%s%s", inst->SOI3name, SOI3nNames[i]); - } - break; - - case INT_NOIZ: - for (i=0; i < SOI3NSRCS; i++) { - NOISE_ADD_OUTVAR(ckt, data, "onoise_total_%s%s", inst->SOI3name, SOI3nNames[i]); - NOISE_ADD_OUTVAR(ckt, data, "inoise_total_%s%s", inst->SOI3name, SOI3nNames[i]); - } - break; - } - } - break; - - case N_CALC: - switch (mode) { - - case N_DENS: -/* just get gain from eval routine. Do thermal - * noise ourselves as we have local temperature - * rise. Also can use channel charge so model - * is valid in ALL regions and not just saturation. - */ - EffectiveLength=inst->SOI3l - 2*model->SOI3latDiff; - NevalSrc(&noizDens[SOI3RDNOIZ], NULL, - ckt,N_GAIN,inst->SOI3dNodePrime,inst->SOI3dNode, - (double)0.0); - noizDens[SOI3RDNOIZ] *= 4 * CONSTboltz * - (ckt->CKTtemp + *(ckt->CKTstate0 + inst->SOI3deltaT)) * - inst->SOI3drainConductance * inst->SOI3m; - lnNdens[SOI3RDNOIZ] = log(MAX(noizDens[SOI3RDNOIZ],N_MINLOG)); - - NevalSrc(&noizDens[SOI3RSNOIZ], NULL, - ckt,N_GAIN,inst->SOI3sNodePrime,inst->SOI3sNode, - (double)0.0); - noizDens[SOI3RSNOIZ] *= 4 * CONSTboltz * - (ckt->CKTtemp + *(ckt->CKTstate0 + inst->SOI3deltaT)) * - inst->SOI3sourceConductance * inst->SOI3m; - lnNdens[SOI3RSNOIZ] = log(MAX(noizDens[SOI3RSNOIZ],N_MINLOG)); - - NevalSrc(&gain, NULL, ckt, - N_GAIN,inst->SOI3dNodePrime, inst->SOI3sNodePrime, - (double)0.0); - - noizDens[SOI3IDNOIZ] = (gain * 4 * CONSTboltz * - (ckt->CKTtemp + *(ckt->CKTstate0 + inst->SOI3deltaT)) * - inst->SOI3ueff * inst->SOI3m * - fabs(*(ckt->CKTstate0 + inst->SOI3qd) + - *(ckt->CKTstate0 + inst->SOI3qs)))/ - (EffectiveLength*EffectiveLength); - lnNdens[SOI3IDNOIZ] = log(MAX(noizDens[SOI3IDNOIZ],N_MINLOG)); - - switch (model->SOI3nLev) { - case 2: - noizDens[SOI3FLNOIZ] = gain * model->SOI3fNcoef * - (inst->SOI3gmf * inst->SOI3m)*(inst->SOI3gmf * inst->SOI3m)/ - (model->SOI3frontOxideCapFactor * - inst->SOI3w * inst->SOI3m * EffectiveLength * - exp(model->SOI3fNexp * - log(MAX(fabs(data->freq),N_MINLOG))) - ); - break; - - case 1: - noizDens[SOI3FLNOIZ] = gain * model->SOI3fNcoef * - exp(model->SOI3fNexp * - log(MAX(fabs(inst->SOI3id * inst->SOI3m),N_MINLOG))) / - (data->freq * EffectiveLength * inst->SOI3w * inst->SOI3m * - model->SOI3frontOxideCapFactor); - break; - - case 0: - default: - noizDens[SOI3FLNOIZ] = gain * model->SOI3fNcoef * - exp(model->SOI3fNexp * - log(MAX(fabs(inst->SOI3id),N_MINLOG))) / - (data->freq * EffectiveLength * EffectiveLength * - model->SOI3frontOxideCapFactor); - break; - } - - - - - lnNdens[SOI3FLNOIZ] = - log(MAX(noizDens[SOI3FLNOIZ],N_MINLOG)); - - noizDens[SOI3TOTNOIZ] = noizDens[SOI3RDNOIZ] + - noizDens[SOI3RSNOIZ] + - noizDens[SOI3IDNOIZ] + - noizDens[SOI3FLNOIZ]; - lnNdens[SOI3TOTNOIZ] = - log(MAX(noizDens[SOI3TOTNOIZ], N_MINLOG)); - - *OnDens += noizDens[SOI3TOTNOIZ]; - - if (data->delFreq == 0.0) { - - /* if we haven't done any previous integration, we need to */ - /* initialize our "history" variables */ - - for (i=0; i < SOI3NSRCS; i++) { - inst->SOI3nVar[LNLSTDENS][i] = lnNdens[i]; - } - - /* clear out our integration variables if it's the first pass */ - - if (data->freq == job->NstartFreq) { - for (i=0; i < SOI3NSRCS; i++) { - inst->SOI3nVar[OUTNOIZ][i] = 0.0; - inst->SOI3nVar[INNOIZ][i] = 0.0; - } - } - } else { /* data->delFreq != 0.0 (we have to integrate) */ - for (i=0; i < SOI3NSRCS; i++) { - if (i != SOI3TOTNOIZ) { - tempOnoise = Nintegrate(noizDens[i], lnNdens[i], - inst->SOI3nVar[LNLSTDENS][i], data); - tempInoise = Nintegrate(noizDens[i] * data->GainSqInv , - lnNdens[i] + data->lnGainInv, - inst->SOI3nVar[LNLSTDENS][i] + data->lnGainInv, - data); - inst->SOI3nVar[LNLSTDENS][i] = lnNdens[i]; - data->outNoiz += tempOnoise; - data->inNoise += tempInoise; - if (job->NStpsSm != 0) { - inst->SOI3nVar[OUTNOIZ][i] += tempOnoise; - inst->SOI3nVar[OUTNOIZ][SOI3TOTNOIZ] += tempOnoise; - inst->SOI3nVar[INNOIZ][i] += tempInoise; - inst->SOI3nVar[INNOIZ][SOI3TOTNOIZ] += tempInoise; - } - } - } - } - if (data->prtSummary) { - for (i=0; i < SOI3NSRCS; i++) { /* print a summary report */ - data->outpVector[data->outNumber++] = noizDens[i]; - } - } - break; - - case INT_NOIZ: /* already calculated, just output */ - if (job->NStpsSm != 0) { - for (i=0; i < SOI3NSRCS; i++) { - data->outpVector[data->outNumber++] = inst->SOI3nVar[OUTNOIZ][i]; - data->outpVector[data->outNumber++] = inst->SOI3nVar[INNOIZ][i]; - } - } /* if */ - break; - } /* switch (mode) */ - break; - - case N_CLOSE: - return (OK); /* do nothing, the main calling routine will close */ - break; /* the plots */ - } /* switch (operation) */ - } /* for inst */ - } /* for model */ - -return(OK); -} diff --git a/src/spicelib/devices/soi3/soi3par.c b/src/spicelib/devices/soi3/soi3par.c deleted file mode 100644 index 7650d1fd3..000000000 --- a/src/spicelib/devices/soi3/soi3par.c +++ /dev/null @@ -1,175 +0,0 @@ -/********** -STAG version 2.7 -Copyright 2000 owned by the United Kingdom Secretary of State for Defence -acting through the Defence Evaluation and Research Agency. -Developed by : Jim Benson, - Department of Electronics and Computer Science, - University of Southampton, - United Kingdom. -With help from : Nele D'Halleweyn, Ketan Mistry, Bill Redman-White, and Craig Easson. - -Based on STAG version 2.1 -Developed by : Mike Lee, -With help from : Bernard Tenbroek, Bill Redman-White, Mike Uren, Chris Edwards - and John Bunyan. -Acknowledgements : Rupert Howes and Pete Mole. -**********/ - -/********** -Modified by Paolo Nenzi 2002 -ngspice integration -**********/ - -#include "ngspice/ngspice.h" -#include "ngspice/const.h" -#include "ngspice/ifsim.h" -#include "soi3defs.h" -#include "ngspice/sperror.h" -#include "ngspice/suffix.h" - - -/* ARGSUSED */ -int -SOI3param(int param, IFvalue *value, GENinstance *inst, IFvalue *select) -{ - SOI3instance *here = (SOI3instance *)inst; - - NG_IGNORE(select); - - switch (param) { - case SOI3_L: - here->SOI3l = value->rValue; - here->SOI3lGiven = TRUE; - break; - case SOI3_W: - here->SOI3w = value->rValue; - here->SOI3wGiven = TRUE; - break; - case SOI3_M: - here->SOI3m = value->rValue; - here->SOI3mGiven = TRUE; - break; - case SOI3_AS: - here->SOI3as = value->rValue; - here->SOI3asGiven = TRUE; - break; - case SOI3_AD: - here->SOI3ad = value->rValue; - here->SOI3adGiven = TRUE; - break; - case SOI3_AB: - here->SOI3ab = value->rValue; - here->SOI3abGiven = TRUE; - break; - case SOI3_NRD: - here->SOI3drainSquares = value->rValue; - here->SOI3drainSquaresGiven = TRUE; - break; - case SOI3_NRS: - here->SOI3sourceSquares = value->rValue; - here->SOI3sourceSquaresGiven = TRUE; - break; - case SOI3_OFF: - here->SOI3off = (value->iValue != 0); - break; - case SOI3_IC_VDS: - here->SOI3icVDS = value->rValue; - here->SOI3icVDSGiven = TRUE; - break; - case SOI3_IC_VGFS: - here->SOI3icVGFS = value->rValue; - here->SOI3icVGFSGiven = TRUE; - break; - case SOI3_IC_VGBS: - here->SOI3icVGBS = value->rValue; - here->SOI3icVGBSGiven = TRUE; - break; - case SOI3_IC_VBS: - here->SOI3icVBS = value->rValue; - here->SOI3icVBSGiven = TRUE; - break; - case SOI3_TEMP: - here->SOI3temp = value->rValue+CONSTCtoK; - here->SOI3tempGiven = TRUE; - break; - case SOI3_RT: - here->SOI3rt = value->rValue; - here->SOI3rtGiven = TRUE; - break; - case SOI3_CT: - here->SOI3ct = value->rValue; - here->SOI3ctGiven = TRUE; - break; - case SOI3_RT1: - here->SOI3rt1 = value->rValue; - here->SOI3rt1Given = TRUE; - break; - case SOI3_CT1: - here->SOI3ct1 = value->rValue; - here->SOI3ct1Given = TRUE; - break; - case SOI3_RT2: - here->SOI3rt2 = value->rValue; - here->SOI3rt2Given = TRUE; - break; - case SOI3_CT2: - here->SOI3ct2 = value->rValue; - here->SOI3ct2Given = TRUE; - break; - case SOI3_RT3: - here->SOI3rt3 = value->rValue; - here->SOI3rt3Given = TRUE; - break; - case SOI3_CT3: - here->SOI3ct3 = value->rValue; - here->SOI3ct3Given = TRUE; - break; - case SOI3_RT4: - here->SOI3rt4 = value->rValue; - here->SOI3rt4Given = TRUE; - break; - case SOI3_CT4: - here->SOI3ct4 = value->rValue; - here->SOI3ct4Given = TRUE; - break; - case SOI3_IC: - /* FALLTHROUGH added to suppress GCC warning due to - * -Wimplicit-fallthrough flag */ - switch (value->v.numValue) { - case 4: - here->SOI3icVBS = *(value->v.vec.rVec+3); - here->SOI3icVBSGiven = TRUE; - /* FALLTHROUGH */ - case 3: - here->SOI3icVGBS = *(value->v.vec.rVec+2); - here->SOI3icVGBSGiven = TRUE; - /* FALLTHROUGH */ - case 2: - here->SOI3icVGFS = *(value->v.vec.rVec+1); - here->SOI3icVGFSGiven = TRUE; - /* FALLTHROUGH */ - case 1: - here->SOI3icVDS = *(value->v.vec.rVec); - here->SOI3icVDSGiven = TRUE; - break; - default: - return(E_BADPARM); - } - break; -/* case SOI3_L_SENS: - if(value->iValue) { - here->SOI3senParmNo = 1; - here->SOI3sens_l = 1; - } - break; - case SOI3_W_SENS: - if(value->iValue) { - here->SOI3senParmNo = 1; - here->SOI3sens_w = 1; - } - break; */ - default: - return(E_BADPARM); - } - return(OK); -} diff --git a/src/spicelib/devices/soi3/soi3set.c b/src/spicelib/devices/soi3/soi3set.c deleted file mode 100644 index eb7178c9d..000000000 --- a/src/spicelib/devices/soi3/soi3set.c +++ /dev/null @@ -1,710 +0,0 @@ -/********** -STAG version 2.7 -Copyright 2000 owned by the United Kingdom Secretary of State for Defence -acting through the Defence Evaluation and Research Agency. -Developed by : Jim Benson, - Department of Electronics and Computer Science, - University of Southampton, - United Kingdom. -With help from : Nele D'Halleweyn, Ketan Mistry, Bill Redman-White, - and Craig Easson. - -Based on STAG version 2.1 -Developed by : Mike Lee, -With help from : Bernard Tenbroek, Bill Redman-White, Mike Uren, Chris Edwards - and John Bunyan. -Acknowledgements : Rupert Howes and Pete Mole. -**********/ - -/********** -Modified by Paolo Nenzi 2002 -ngspice integration -**********/ - -#include "ngspice/ngspice.h" -#include "ngspice/smpdefs.h" -#include "ngspice/cktdefs.h" -#include "soi3defs.h" -#include "ngspice/sperror.h" -#include "ngspice/suffix.h" - - -int -SOI3setup(SMPmatrix *matrix, GENmodel *inModel, CKTcircuit *ckt, int *states) -{ - SOI3model *model = (SOI3model *)inModel; - SOI3instance *here; - int error; - CKTnode *tmp; - - /* JimB - new variable for RT and CT scaling */ - double thermal_area; - - double rtargs[5]; - double * rtptr; - int node_count; - - CKTnode *tmpNode; - IFuid tmpName; - - - - /****** Part 1 - set any model parameters that are not present in ******/ - /****** the netlist to default values. ******/ - - /* loop through all the SOI3 device models */ - for( ; model != NULL; model = SOI3nextModel(model)) { - - if(!model->SOI3typeGiven) { - model->SOI3type = NSOI3; - } - if(!model->SOI3latDiffGiven) { - model->SOI3latDiff = 0; - } - if(!model->SOI3jctSatCurDensityGiven) { - model->SOI3jctSatCurDensity = 1.0e-10; - } - if(!model->SOI3jctSatCurDensity1Given) { - model->SOI3jctSatCurDensity1 = 0.0; - } - if(!model->SOI3jctSatCurGiven) { - model->SOI3jctSatCur = 0.0; - } - if(!model->SOI3jctSatCur1Given) { - model->SOI3jctSatCur1 = 0.0; - } - if(!model->SOI3transconductanceGiven) { - model->SOI3transconductance = 2e-5; - } - if(!model->SOI3frontGateSourceOverlapCapFactorGiven) { - model->SOI3frontGateSourceOverlapCapFactor = 0; - } - if(!model->SOI3frontGateDrainOverlapCapFactorGiven) { - model->SOI3frontGateDrainOverlapCapFactor = 0; - } - if(!model->SOI3frontGateBulkOverlapCapFactorGiven) { - model->SOI3frontGateBulkOverlapCapFactor = 0; - } - if(!model->SOI3backGateSourceOverlapCapAreaFactorGiven) { - model->SOI3backGateSourceOverlapCapAreaFactor = 0; - } - if(!model->SOI3backGateDrainOverlapCapAreaFactorGiven) { - model->SOI3backGateDrainOverlapCapAreaFactor = 0; - } - if(!model->SOI3backGateBulkOverlapCapAreaFactorGiven) { - model->SOI3backGateBulkOverlapCapAreaFactor = 0; - } - if(!model->SOI3sideWallCapFactorGiven) { - model->SOI3sideWallCapFactor = 0; - } - if(!model->SOI3bulkJctPotentialGiven) { - model->SOI3bulkJctPotential = 0.8; - } - if(!model->SOI3bulkJctSideGradingCoeffGiven) { - model->SOI3bulkJctSideGradingCoeff = 0.5; - } - if(!model->SOI3fwdCapDepCoeffGiven) { - model->SOI3fwdCapDepCoeff = 0.5; - } - if(!model->SOI3lambdaGiven) { - model->SOI3lambda = 0; - } - if(!model->SOI3thetaGiven) { - model->SOI3theta = 0; - } - /* JimB - If SiO2 thermal conductivity given in netlist then use */ - /* that value, otherwise use literature value. (Units W/K*m). */ - if(!model->SOI3oxideThermalConductivityGiven) { - model->SOI3oxideThermalConductivity = 1.4; - } - /* JimB - If Si specific heat given in netlist then use that value, */ - /* otherwise use literature value. (Units J/kg*K). */ - if(!model->SOI3siliconSpecificHeatGiven) { - model->SOI3siliconSpecificHeat = 700; - } - /* JimB - If density of Si given in netlist then use that value, */ - /* otherwise use literature value. (kg/m^3). */ - if(!model->SOI3siliconDensityGiven) { - model->SOI3siliconDensity = 2330; - } - if(!model->SOI3frontFixedChargeDensityGiven) { - model->SOI3frontFixedChargeDensity = 0; - } - if(!model->SOI3backFixedChargeDensityGiven) { - model->SOI3backFixedChargeDensity = 0; - } - if(!model->SOI3frontSurfaceStateDensityGiven) { - model->SOI3frontSurfaceStateDensity = 0; - } - if(!model->SOI3backSurfaceStateDensityGiven) { - model->SOI3backSurfaceStateDensity = 0; - } - if(!model->SOI3gammaGiven) { - model->SOI3gamma = 0; - } - if(!model->SOI3fNcoefGiven) { - model->SOI3fNcoef = 0; - } - if(!model->SOI3fNexpGiven) { - model->SOI3fNexp = 1; - } -/* extra stuff for newer model - msll Jan96 */ - if(!model->SOI3sigmaGiven) { - model->SOI3sigma = 0; - } - if(!model->SOI3chiFBGiven) { - model->SOI3chiFB = 0; - } - if(!model->SOI3chiPHIGiven) { - model->SOI3chiPHI = 0; - } - if(!model->SOI3deltaWGiven) { - model->SOI3deltaW = 0; - } - if(!model->SOI3deltaLGiven) { - model->SOI3deltaL = 0; - } - if(!model->SOI3vsatGiven) { - model->SOI3vsat = 0; /* special case - must check for it */ - } - if(!model->SOI3kGiven) { - model->SOI3k = 1.5; /* defaults to old SPICE value */ - } - if(!model->SOI3lxGiven) { - model->SOI3lx = 0; - } - if(!model->SOI3vpGiven) { - model->SOI3vp = 0; - } - if(!model->SOI3gammaBGiven) { - model->SOI3gammaB = 0; - } - if(!model->SOI3etaGiven) { - model->SOI3eta = 1.0; /* normal field for imp. ion. */ - } - if(!model->SOI3alpha0Given) { - model->SOI3alpha0=0; - } - if(!model->SOI3beta0Given) { - model->SOI3beta0=1.92e6; - } - if(!model->SOI3lmGiven) { - model->SOI3lm = 0; - } - if(!model->SOI3lm1Given) { - model->SOI3lm1 = 0; - } - if(!model->SOI3lm2Given) { - model->SOI3lm2 = 0; - } - if((!model->SOI3etadGiven) || (model->SOI3etad == 0 )) { - model->SOI3etad = 1.0; - } - if((!model->SOI3etad1Given) || (model->SOI3etad1 == 0 )) { - model->SOI3etad1 = 1.0; - } - if(!model->SOI3chibetaGiven) { - model->SOI3chibeta = 0.0; - } - if(!model->SOI3dvtGiven) { - model->SOI3dvt = 1; - } - if(!model->SOI3nLevGiven) { - model->SOI3nLev = 0; - } - if(!model->SOI3betaBJTGiven) { - model->SOI3betaBJT = 0.0; - } - if(!model->SOI3tauFBJTGiven) { - model->SOI3tauFBJT = 0.0; - } - if(!model->SOI3tauRBJTGiven) { - model->SOI3tauRBJT = 0.0; - } - if(!model->SOI3betaEXPGiven) { - model->SOI3betaEXP = 2.0; - } - if(!model->SOI3tauEXPGiven) { - model->SOI3tauEXP = 0.0; - } - if(!model->SOI3rswGiven) { - model->SOI3rsw = 0.0; - } - if(!model->SOI3rdwGiven) { - model->SOI3rdw = 0.0; - } - if(!model->SOI3minimumFeatureSizeGiven) { - model->SOI3minimumFeatureSize = 0.0; - } - if(!model->SOI3vtexGiven) { - model->SOI3vtex = 0.0; - } - if(!model->SOI3vdexGiven) { - model->SOI3vdex = 0.0; - } - if(!model->SOI3delta0Given) { - model->SOI3delta0 = 0.0; - } - if(!model->SOI3satChargeShareFactorGiven) { - model->SOI3satChargeShareFactor = 0.5; - } - if(!model->SOI3nplusDopingGiven) { - model->SOI3nplusDoping = 1e20; - } - if(!model->SOI3rtaGiven) { - model->SOI3rta = 0; - } - if(!model->SOI3ctaGiven) { - model->SOI3cta = 0; - } - if(!model->SOI3mexpGiven) { - model->SOI3mexp = 0; - } - - /* now check to determine which CLM model to use */ - if((model->SOI3lx != 0) && (model->SOI3lambda != 0)) - { - - SPfrontEnd->IFerrorf (ERR_WARNING, - "%s: Non-zero values for BOTH LAMBDA and LX. \nDefaulting to simple LAMBDA model", - model->SOI3modName); - - model->SOI3useLAMBDA = TRUE; - } - - /* if only lx given, AND vp!=0, AND mexp (integer) is at least 1, use lx/vp, else basic lambda model*/ - if ((model->SOI3lxGiven) && (model->SOI3lx != 0) && - (!model->SOI3lambdaGiven) && (model->SOI3vp != 0) && (model->SOI3mexp > 0)) - { - model->SOI3useLAMBDA = FALSE; - } - else - { - model->SOI3useLAMBDA = TRUE; - } - - - /****** Part 2 - set any instance parameters that are not present ******/ - /****** in the netlist to default values. ******/ - - /* loop through all the instances of the model */ - for (here = SOI3instances(model); here != NULL ; - here=SOI3nextInstance(here)) { - - - if(!here->SOI3icVBSGiven) { - here->SOI3icVBS = 0; - } - if(!here->SOI3icVDSGiven) { - here->SOI3icVDS = 0; - } - if(!here->SOI3icVGFSGiven) { - here->SOI3icVGFS = 0; - } - if(!here->SOI3icVGBSGiven) { - here->SOI3icVGBS = 0; - } - if(!here->SOI3drainSquaresGiven || here->SOI3drainSquares==0) { - here->SOI3drainSquares=1; - } - if(!here->SOI3sourceSquaresGiven || here->SOI3sourceSquares==0) { - here->SOI3sourceSquares=1; - } - - if (!here->SOI3mGiven) - here->SOI3m = 1; - - /****** Part 3 - Initialise transconductances. ******/ - - /* initialise gM's */ - here->SOI3iMdb= 0.0; - here->SOI3iMsb= 0.0; - here->SOI3gMmbs = 0.0; - here->SOI3gMmf = 0.0; - here->SOI3gMmb = 0.0; - here->SOI3gMd = 0.0; - here->SOI3gMdeltaT = 0.0; - - /* allocate a chunk of the state vector */ - here->SOI3states = *states; - *states += SOI3numStates; -/* if(ckt->CKTsenInfo && (ckt->CKTsenInfo->SENmode & TRANSEN) ){ - *states += SOI3numSenStates * (ckt->CKTsenInfo->SENparms); - } -*/ - /****** Part 4 - check resistance values for internal nodes, ******/ - /****** to see which internal nodes need to be created. ******/ - - /* Start with internal source and drain nodes */ - - if((model->SOI3drainResistance != 0 - || (model->SOI3sheetResistance != 0 && - here->SOI3drainSquares != 0) - || model->SOI3rdw != 0) - && here->SOI3dNodePrime == 0) - { - error = CKTmkVolt(ckt,&tmp,here->SOI3name,"drain"); - - if(error) - { - return(error); - } - here->SOI3dNodePrime = tmp->number; - - if (ckt->CKTcopyNodesets) { - if (CKTinst2Node(ckt,here,1,&tmpNode,&tmpName)==OK) { - if (tmpNode->nsGiven) { - tmp->nodeset=tmpNode->nodeset; - tmp->nsGiven=tmpNode->nsGiven; - } - } - } - - } - else - { - here->SOI3dNodePrime = here->SOI3dNode; - } - - if((model->SOI3sourceResistance != 0 || - (model->SOI3sheetResistance != 0 && - here->SOI3sourceSquares != 0) || - model->SOI3rsw != 0) && - here->SOI3sNodePrime==0) - { - error = CKTmkVolt(ckt,&tmp,here->SOI3name,"source"); - - if(error) - { - return(error); - } - here->SOI3sNodePrime = tmp->number; - - if (ckt->CKTcopyNodesets) { - if (CKTinst2Node(ckt,here,3,&tmpNode,&tmpName)==OK) { - if (tmpNode->nsGiven) { - tmp->nodeset=tmpNode->nodeset; - tmp->nsGiven=tmpNode->nsGiven; - } - } - } - - - } - else - { - here->SOI3sNodePrime = here->SOI3sNode; - } - - /* Now for thermal node */ - - /* JimB - If minimum feature size has non-zero value, then this */ - /* will be used to calculate thermal area of SiO2 - this gives */ - /* more accurate values of RT for short-channel devices. Assume*/ - /* 4*fmin added to L, and 2*fmin added to W (fmin in microns). */ - thermal_area = (here->SOI3w + 2*1e-6*model->SOI3minimumFeatureSize) - * (here->SOI3l + 4*1e-6*model->SOI3minimumFeatureSize); - - /* Now calculate RT and CT. */ - - /* If RT is given on instance line, use it, otherwise calculate from */ - /* above variables. */ - if (!here->SOI3rtGiven) - { - if (model->SOI3rtaGiven) - { - here->SOI3rt = model->SOI3rta/thermal_area; - } - else - { - if (model->SOI3oxideThermalConductivity != 0) - { - here->SOI3rt = model->SOI3backOxideThickness / - (model->SOI3oxideThermalConductivity * thermal_area); - } - else - /* If conductivity set to zero in netlist, switch off self-heating. */ - { - here->SOI3rt = 0; - } - } - } - if (!here->SOI3rt1Given) - { - here->SOI3rt1=0; - } - if (!here->SOI3rt2Given) - { - here->SOI3rt2=0; - } - if (!here->SOI3rt3Given) - { - here->SOI3rt3=0; - } - if (!here->SOI3rt4Given) - { - here->SOI3rt4=0; - } - - /* Now same thing for CT, but less complex as CT=0 does not cause problems */ - if (!here->SOI3ctGiven) - { - if (model->SOI3ctaGiven) - { - here->SOI3ct = model->SOI3cta*thermal_area; - } - else - { - here->SOI3ct = model->SOI3siliconDensity * model->SOI3siliconSpecificHeat * - thermal_area * model->SOI3bodyThickness; - } - } - if (!here->SOI3ct1Given) - { - here->SOI3ct1=0; - } - if (!here->SOI3ct2Given) - { - here->SOI3ct2=0; - } - if (!here->SOI3ct3Given) - { - here->SOI3ct3=0; - } - if (!here->SOI3ct4Given) - { - here->SOI3ct4=0; - } - - /* JimB - 15/9/99 */ - rtargs[0]=here->SOI3rt; - rtargs[1]=here->SOI3rt1; - rtargs[2]=here->SOI3rt2; - rtargs[3]=here->SOI3rt3; - rtargs[4]=here->SOI3rt4; - rtptr = rtargs; /* Set pointer to start address of rtargs array. */ - node_count=0; - - while ( (*rtptr) && (node_count<5) ) - { - node_count++; - if (node_count<5) - { - rtptr++; /* Increment pointer to next array element. */ - } - } - here->SOI3numThermalNodes=node_count; - - /* Thermal node is now external and so is automatically created by CKTcreate in INP2A. - It is also bound to the created node's number. However, if rt=0 then no thermal so - make tout be the thermal ground. Can't simply use CKTbindNode 'cos the row and column - associated with the original node has already been created. Thus problems will occur - during pivoting. Instead put zero voltage source here. First create branch for it.*/ - - if ((here->SOI3rt == 0) && (here->SOI3branch == 0)) - { - error = CKTmkCur(ckt,&tmp,here->SOI3name,"branch"); - - if(error) - { - return(error); - } - here->SOI3branch = tmp->number; - } - else - { /* have thermal - now how many time constants ? */ - if ((here->SOI3numThermalNodes > 1) && - (here->SOI3tout1Node == 0)) - { - error = CKTmkVolt(ckt,&tmp,here->SOI3name,"tout1"); - if (error) return (error); - here->SOI3tout1Node = tmp->number; - } - else - { - here->SOI3tout1Node = 0; - } - if ((here->SOI3numThermalNodes > 2) && - (here->SOI3tout2Node == 0)) - { - error = CKTmkVolt(ckt,&tmp,here->SOI3name,"tout2"); - if (error) return (error); - here->SOI3tout2Node = tmp->number; - } - else - { - here->SOI3tout2Node = 0; - } - if ((here->SOI3numThermalNodes > 3) && - (here->SOI3tout3Node == 0)) - { - error = CKTmkVolt(ckt,&tmp,here->SOI3name,"tout3"); - if (error) return (error); - here->SOI3tout3Node = tmp->number; - } - else - { - here->SOI3tout3Node = 0; - } - if ((here->SOI3numThermalNodes > 4) && - (here->SOI3tout4Node == 0)) - { - error = CKTmkVolt(ckt,&tmp,here->SOI3name,"tout4"); - if (error) return (error); - here->SOI3tout4Node = tmp->number; - } - else - { - here->SOI3tout4Node = 0; - } - } - - -/****** Part 5 - allocate memory to matrix elements corresponding to ******/ -/****** pairs of nodes. ******/ - -/* macro to make elements with built in test for out of memory */ - -#define TSTALLOC(ptr,first,second) \ -do { if((here->ptr = SMPmakeElt(matrix, here->first, here->second)) == NULL){\ - return(E_NOMEM);\ -} } while(0) - - - TSTALLOC(SOI3D_dPtr,SOI3dNode,SOI3dNode); - TSTALLOC(SOI3D_dpPtr,SOI3dNode,SOI3dNodePrime); - TSTALLOC(SOI3DP_dPtr,SOI3dNodePrime,SOI3dNode); - - TSTALLOC(SOI3S_sPtr,SOI3sNode,SOI3sNode); - TSTALLOC(SOI3S_spPtr,SOI3sNode,SOI3sNodePrime); - TSTALLOC(SOI3SP_sPtr,SOI3sNodePrime,SOI3sNode); - - TSTALLOC(SOI3GF_gfPtr,SOI3gfNode,SOI3gfNode); - TSTALLOC(SOI3GF_gbPtr,SOI3gfNode,SOI3gbNode); - TSTALLOC(SOI3GF_dpPtr,SOI3gfNode,SOI3dNodePrime); - TSTALLOC(SOI3GF_spPtr,SOI3gfNode,SOI3sNodePrime); - TSTALLOC(SOI3GF_bPtr,SOI3gfNode,SOI3bNode); - - TSTALLOC(SOI3GB_gfPtr,SOI3gbNode,SOI3gfNode); - TSTALLOC(SOI3GB_gbPtr,SOI3gbNode,SOI3gbNode); - TSTALLOC(SOI3GB_dpPtr,SOI3gbNode,SOI3dNodePrime); - TSTALLOC(SOI3GB_spPtr,SOI3gbNode,SOI3sNodePrime); - TSTALLOC(SOI3GB_bPtr,SOI3gbNode,SOI3bNode); - - TSTALLOC(SOI3B_gfPtr,SOI3bNode,SOI3gfNode); - TSTALLOC(SOI3B_gbPtr,SOI3bNode,SOI3gbNode); - TSTALLOC(SOI3B_dpPtr,SOI3bNode,SOI3dNodePrime); - TSTALLOC(SOI3B_spPtr,SOI3bNode,SOI3sNodePrime); - TSTALLOC(SOI3B_bPtr,SOI3bNode,SOI3bNode); - - TSTALLOC(SOI3DP_gfPtr,SOI3dNodePrime,SOI3gfNode); - TSTALLOC(SOI3DP_gbPtr,SOI3dNodePrime,SOI3gbNode); - TSTALLOC(SOI3DP_dpPtr,SOI3dNodePrime,SOI3dNodePrime); - TSTALLOC(SOI3DP_spPtr,SOI3dNodePrime,SOI3sNodePrime); - TSTALLOC(SOI3DP_bPtr,SOI3dNodePrime,SOI3bNode); - - TSTALLOC(SOI3SP_gfPtr,SOI3sNodePrime,SOI3gfNode); - TSTALLOC(SOI3SP_gbPtr,SOI3sNodePrime,SOI3gbNode); - TSTALLOC(SOI3SP_dpPtr,SOI3sNodePrime,SOI3dNodePrime); - TSTALLOC(SOI3SP_spPtr,SOI3sNodePrime,SOI3sNodePrime); - TSTALLOC(SOI3SP_bPtr,SOI3sNodePrime,SOI3bNode); - - if (here->SOI3rt == 0) - { - TSTALLOC(SOI3TOUT_ibrPtr,SOI3toutNode,SOI3branch); - TSTALLOC(SOI3IBR_toutPtr,SOI3branch,SOI3toutNode); - } - else - { - TSTALLOC(SOI3TOUT_toutPtr,SOI3toutNode,SOI3toutNode); - if (here->SOI3numThermalNodes > 1) - { - TSTALLOC(SOI3TOUT_tout1Ptr,SOI3toutNode,SOI3tout1Node); - TSTALLOC(SOI3TOUT1_toutPtr,SOI3tout1Node,SOI3toutNode); - TSTALLOC(SOI3TOUT1_tout1Ptr,SOI3tout1Node,SOI3tout1Node); - } - if (here->SOI3numThermalNodes > 2) - { - TSTALLOC(SOI3TOUT1_tout2Ptr,SOI3tout1Node,SOI3tout2Node); - TSTALLOC(SOI3TOUT2_tout1Ptr,SOI3tout2Node,SOI3tout1Node); - TSTALLOC(SOI3TOUT2_tout2Ptr,SOI3tout2Node,SOI3tout2Node); - } - if (here->SOI3numThermalNodes > 3) - { - TSTALLOC(SOI3TOUT2_tout3Ptr,SOI3tout2Node,SOI3tout3Node); - TSTALLOC(SOI3TOUT3_tout2Ptr,SOI3tout3Node,SOI3tout2Node); - TSTALLOC(SOI3TOUT3_tout3Ptr,SOI3tout3Node,SOI3tout3Node); - } - if (here->SOI3numThermalNodes > 4) - { - TSTALLOC(SOI3TOUT3_tout4Ptr,SOI3tout3Node,SOI3tout4Node); - TSTALLOC(SOI3TOUT4_tout3Ptr,SOI3tout4Node,SOI3tout3Node); - TSTALLOC(SOI3TOUT4_tout4Ptr,SOI3tout4Node,SOI3tout4Node); - } - - TSTALLOC(SOI3TOUT_toutPtr,SOI3toutNode,SOI3toutNode); - TSTALLOC(SOI3TOUT_gfPtr,SOI3toutNode,SOI3gfNode); - TSTALLOC(SOI3TOUT_gbPtr,SOI3toutNode,SOI3gbNode); - TSTALLOC(SOI3TOUT_dpPtr,SOI3toutNode,SOI3dNodePrime); - TSTALLOC(SOI3TOUT_spPtr,SOI3toutNode,SOI3sNodePrime); - TSTALLOC(SOI3TOUT_bPtr,SOI3toutNode,SOI3bNode); - - TSTALLOC(SOI3GF_toutPtr,SOI3gfNode,SOI3toutNode); - TSTALLOC(SOI3GB_toutPtr,SOI3gbNode,SOI3toutNode); - TSTALLOC(SOI3DP_toutPtr,SOI3dNodePrime,SOI3toutNode); - TSTALLOC(SOI3SP_toutPtr,SOI3sNodePrime,SOI3toutNode); - TSTALLOC(SOI3B_toutPtr,SOI3bNode,SOI3toutNode); - } - } - } - return(OK); -} - - - -int -SOI3unsetup(GENmodel *inModel, CKTcircuit *ckt) -{ - SOI3model *model; - SOI3instance *here; - - for (model = (SOI3model *)inModel; model != NULL; - model = SOI3nextModel(model)) - { - for (here = SOI3instances(model); here != NULL; - here=SOI3nextInstance(here)) - { - if (here->SOI3tout4Node > 0) - CKTdltNNum(ckt, here->SOI3tout4Node); - here->SOI3tout4Node = 0; - - if (here->SOI3tout3Node > 0) - CKTdltNNum(ckt, here->SOI3tout3Node); - here->SOI3tout3Node = 0; - - if (here->SOI3tout2Node > 0) - CKTdltNNum(ckt, here->SOI3tout2Node); - here->SOI3tout2Node = 0; - - if (here->SOI3tout1Node > 0) - CKTdltNNum(ckt, here->SOI3tout1Node); - here->SOI3tout1Node = 0; - - if (here->SOI3branch > 0) - CKTdltNNum(ckt, here->SOI3branch); - here->SOI3branch=0; - - if (here->SOI3sNodePrime > 0 - && here->SOI3sNodePrime != here->SOI3sNode) - CKTdltNNum(ckt, here->SOI3sNodePrime); - here->SOI3sNodePrime= 0; - - if (here->SOI3dNodePrime > 0 - && here->SOI3dNodePrime != here->SOI3dNode) - CKTdltNNum(ckt, here->SOI3dNodePrime); - here->SOI3dNodePrime= 0; - - } - } - return OK; -} diff --git a/src/spicelib/devices/soi3/soi3temp.c b/src/spicelib/devices/soi3/soi3temp.c deleted file mode 100644 index be5837dfa..000000000 --- a/src/spicelib/devices/soi3/soi3temp.c +++ /dev/null @@ -1,604 +0,0 @@ -/********** -STAG version 2.7 -Copyright 2000 owned by the United Kingdom Secretary of State for Defence -acting through the Defence Evaluation and Research Agency. -Developed by : Jim Benson, - Department of Electronics and Computer Science, - University of Southampton, - United Kingdom. -With help from : Nele D'Halleweyn, Ketan Mistry, Bill Redman-White, and Craig Easson. - -Based on STAG version 2.1 -Developed by : Mike Lee, -With help from : Bernard Tenbroek, Bill Redman-White, Mike Uren, Chris Edwards - and John Bunyan. -Acknowledgements : Rupert Howes and Pete Mole. -**********/ - -/********** -Modified by Paolo Nenzi 2002 -ngspice integration -**********/ - -#include "ngspice/ngspice.h" -#include "ngspice/cktdefs.h" -#include "soi3defs.h" -#include "ngspice/const.h" -#include "ngspice/sperror.h" -#include "ngspice/suffix.h" - - -int -SOI3temp(GENmodel *inModel, CKTcircuit *ckt) -{ - SOI3model *model = (SOI3model *)inModel; - SOI3instance *here; - -/* All variables ending in 1 denote that they pertain to the model - and so use model->SOI3tnom for temperature - the others use - here->SOI3temp. REFTEMP is temp at which hard-coded quantities - are given. */ - - double egfet,egfet1; /* Band Gap */ - double fact1,fact2; /* temperature/REFTEMP */ - double kt,kt1; /* kT @ various temps */ - double arg1; /* ??? */ - double ratio,ratio4; /* (temp/tnom) and (temp/tnom)^(3/2) */ - double phio; /* temp adjusted phi PHI0*/ - double pbo; - double gmanew,gmaold; - double capfact; - double pbfact1,pbfact; /* ??? */ - double vt,vtnom; - double wkfngfs; /* work function difference phi(gate,Si) */ - double wkfngf; /* work fn of front gate */ - double wkfngbs; /* work fn diff of back gate = 0 usu. */ - double fermig; /* fermi level of gate */ - double fermis; /* fermi level of Si */ - double xd_max; /* Minimum Si film thickness for this model to be valid */ - double eta_s; - - /* JimB - new variables for improved threshold voltage conversion model. */ - - double Edelta0; - double psi_delta0; - - /* loop through all the transistor models */ - for( ; model != NULL; model = SOI3nextModel(model)) - { - - /* perform model defaulting */ - if(!model->SOI3tnomGiven) - { - model->SOI3tnom = ckt->CKTnomTemp; - } - - fact1 = model->SOI3tnom/REFTEMP; - vtnom = model->SOI3tnom*CONSTKoverQ; - kt1 = CONSTboltz * model->SOI3tnom; - egfet1 = 1.16-(7.02e-4*model->SOI3tnom*model->SOI3tnom)/ - (model->SOI3tnom+1108); - arg1 = -egfet1/(kt1+kt1)+1.1150877/(CONSTboltz*(REFTEMP+REFTEMP)); - /* this is -Egnom + Egref. - sign due to it being in bracket with log(fact1) - 'cos we wanted log(1/fact1). */ - pbfact1 = -2*vtnom *(1.5*log(fact1)+CHARGE*arg1); - /* 2 comes from fact phi=2*phi_F - ^ */ - - /* now model parameter preprocessing */ - - if(!model->SOI3frontOxideThicknessGiven || - model->SOI3frontOxideThickness == 0 || - !model->SOI3backOxideThicknessGiven || - model->SOI3backOxideThickness == 0 || - !model->SOI3bodyThicknessGiven || - model->SOI3bodyThickness == 0) - { - - SPfrontEnd->IFerrorf (ERR_FATAL, - "%s: SOI3 device film thickness must be supplied", - model->SOI3modName); - return(E_BADPARM); - } - else /* Oxide and film thicknesses are supplied. */ - { - model->SOI3frontOxideCapFactor = 3.9 * 8.854214871e-12/ - model->SOI3frontOxideThickness; - model->SOI3backOxideCapFactor = 3.9 * 8.854214871e-12/ - model->SOI3backOxideThickness; - model->SOI3bodyCapFactor = 11.7 * 8.854214871e-12/ - model->SOI3bodyThickness; - model->SOI3C_ssf = CHARGE*model->SOI3frontSurfaceStateDensity*1e4; - model->SOI3C_ssb = CHARGE*model->SOI3backSurfaceStateDensity*1e4; - eta_s = 1 + model->SOI3C_ssf/model->SOI3frontOxideCapFactor; - - if(!model->SOI3transconductanceGiven) - { - if(!model->SOI3surfaceMobilityGiven) - { - model->SOI3surfaceMobility=600; - } - model->SOI3transconductance = model->SOI3surfaceMobility * - model->SOI3frontOxideCapFactor * 1e-4 /*(m**2/cm**2) - for mobility */; - } - - if(model->SOI3substrateDopingGiven) - { /* work everything out */ - if(model->SOI3substrateDoping*1e6 /*(cm**3/m**3)*/ >1.45e16) - { - if(!model->SOI3phiGiven) - { - model->SOI3phi = 2*vtnom* - log(model->SOI3substrateDoping* - 1e6/*(cm**3/m**3)*//1.45e16); - model->SOI3phi = MAX(0.1,model->SOI3phi); - } -/* Now that we have ascertained both the doping * - * and the body film thickness, check to see * - * if we have a thick film device. If not, complain ! */ - xd_max=2*sqrt((2* 11.7 * 8.854214871e-12 * model->SOI3phi)/ - (CHARGE*1e6 /*(cm**3/m**3)*/ * model->SOI3substrateDoping)); - - if(model->SOI3bodyThickness < xd_max) - { - SPfrontEnd->IFerrorf (ERR_WARNING, - "%s: Body Film thickness may be too small \nfor this model to be valid", - model->SOI3modName); - /* return(E_PAUSE); don't want to stop, - just issue a warning */ - } -/* End of thick film check - msll 21/2/94 - Changed to only give warning - msll 31/10/95 */ - if(!model->SOI3vfbFGiven) - { - if(!model->SOI3frontFixedChargeDensityGiven) - model->SOI3frontFixedChargeDensity = 0; - fermis = model->SOI3type * 0.5 * model->SOI3phi; - wkfngf = 3.2; - if(!model->SOI3gateTypeGiven) model->SOI3gateType=1; - if(model->SOI3gateType != 0) - { - fermig = model->SOI3type *model->SOI3gateType*0.5*egfet1; - wkfngf = 3.25 + 0.5 * egfet1 - fermig; - } - wkfngfs = wkfngf - (3.25 + 0.5 * egfet1 +fermis); - - /* Fixed oxide charge is normally +ve for both - n and p-channel, so need -ve voltage to neutralise it */ - model->SOI3vfbF = wkfngfs - - model->SOI3frontFixedChargeDensity * - 1e4 /*(cm**2/m**2)*/ * - CHARGE/model->SOI3frontOxideCapFactor; - } - if(!model->SOI3vfbBGiven) - { - wkfngbs = (1-model->SOI3type)*0.5*model->SOI3phi; - /* assume p-sub */ - model->SOI3vfbB = wkfngbs - - model->SOI3backFixedChargeDensity * - 1e4 /*(cm**2/m**2)*/ * - CHARGE/model->SOI3backOxideCapFactor; - } - - if(!model->SOI3gammaGiven) - { - model->SOI3gamma = sqrt(2 * 11.70 * 8.854214871e-12 * - CHARGE * model->SOI3substrateDoping * - 1e6 /*(cm**3/m**3)*/)/model->SOI3frontOxideCapFactor; - } - - if(!model->SOI3gammaBGiven) - { - model->SOI3gammaB = sqrt(2 * 11.70 * 8.854214871e-12 * - CHARGE * model->SOI3substrateDoping * - 1e6 /*(cm**3/m**3)*/)/model->SOI3backOxideCapFactor; - } - if(model->SOI3vt0Given) - { /* NSUB given AND VT0 given - change vfbF */ - model->SOI3vfbF = model->SOI3vt0 - model->SOI3type * - (eta_s*model->SOI3phi + - model->SOI3gamma*sqrt(model->SOI3phi)); - } - else - { - if(model->SOI3vtexGiven) - { /* JimB - Improved threshold voltage conversion model. */ - if (model->SOI3delta0 < 0) - { - model->SOI3delta0 = 0; - } - if (model->SOI3vdex < 0) - { - /* Use convention that Vd at which Vtex was extracted */ - /* is always +ve. */ - model->SOI3vdex = -model->SOI3vdex; - } - /* Exponential term delta*phiF/phit (SOI3phi = 2phiF) */ - Edelta0 = exp(MIN(MAX_EXP_ARG, - (model->SOI3delta0*model->SOI3phi)/(2*vtnom)) - ); - /* Modified surface potential term (2+delta)*phiF + vdex/2 */ - /* (SOI3phi = 2phiF) */ - psi_delta0 = ((2+model->SOI3delta0)*model->SOI3phi/2) + - model->SOI3vdex/2; - model->SOI3vfbF = model->SOI3vtex - model->SOI3type * - (eta_s*psi_delta0 + model->SOI3gamma* - sqrt(psi_delta0 + vtnom*Edelta0) - ); - } - } - } - else /* Substrate doping less than intrinsic silicon, so set to zero. */ - { - model->SOI3substrateDoping = 0; - SPfrontEnd->IFerrorf (ERR_FATAL, - "%s: Nsub < Ni", model->SOI3modName); - return(E_BADPARM); - } - } - else /* NSUB not given, have to assume that VT0, PHI and GAMMA are given */ - { - xd_max=(2* 11.7 * 8.854214871e-12*sqrt(model->SOI3phi))/ - (model->SOI3gamma*model->SOI3frontOxideCapFactor); - if(model->SOI3bodyThickness < xd_max) - { - SPfrontEnd->IFerrorf (ERR_WARNING, - "%s :Body Film thickness may be too small \nfor this model to be valid", - model->SOI3modName); - /* return(E_PAUSE); */ - } -/* End of thick film check - msll 21/2/94 - Changed to only give warning - msll 31/10/95 */ - - /* If vtext given in netlist, but no vt0. */ - if( (model->SOI3vtexGiven) && (!model->SOI3vt0Given) ) - { /* JimB - Improved threshold voltage conversion model. */ - if (model->SOI3delta0 < 0) - { - model->SOI3delta0 = 0; - } - if (model->SOI3vdex < 0) - { - /* Use convention that Vd at which Vtex was extracted */ - /* is always +ve. */ - model->SOI3vdex = -model->SOI3vdex; - } - /* Exponential term delta*phiF/phit (SOI3phi = 2phiF) */ - Edelta0 = exp(MIN(MAX_EXP_ARG, - (model->SOI3delta0*model->SOI3phi)/(2*vtnom)) - ); - /* Modified surface potential term (2+delta)*phiF + vdex/2 */ - /* (SOI3phi = 2phiF) */ - psi_delta0 = ((2+model->SOI3delta0)*model->SOI3phi/2) + - model->SOI3vdex/2; - model->SOI3vfbF = model->SOI3vtex - model->SOI3type * - (eta_s*psi_delta0 + model->SOI3gamma* - sqrt(psi_delta0 + vtnom*Edelta0) - ); - } - else /* If no vtex, then use vt0, either netlist or default value. */ - { /* Use standard threshold voltage model. */ - model->SOI3vfbF = model->SOI3vt0 - model->SOI3type * - (eta_s*model->SOI3phi + model->SOI3gamma*sqrt(model->SOI3phi)); - } - if (!model->SOI3vfbBGiven) - { - model->SOI3vfbB = 0; /* NSUB not given, vfbB not given */ - } - } - } - if((model->SOI3vsatGiven)&&(model->SOI3vsat != 0)) - { - model->SOI3TVF0 = 0.8*exp(model->SOI3tnom/600); - } - else - { - model->SOI3TVF0 = 0; - } - - - /* loop through all instances of the model */ - for(here = SOI3instances(model); here!= NULL; - here = SOI3nextInstance(here)) - { - - double czbd; /* zero voltage bulk-drain capacitance */ - double czbs; /* zero voltage bulk-source capacitance */ - double cj0; /* default value of zero voltage bulk-source/drain capacitance*/ - double Nratio; /* ratio of Nsub*Nplus/Nsub+Nplus */ - double arg; /* 1 - fc */ - double sarg; /* (1-fc) ^^ (-mj) */ - - /* perform the parameter defaulting */ - - /* JimB - if device temperature not given, OR, if self-heating switched */ - /* on, then set device temperature equal to circuit temperature. Can't */ - /* set device temp with self-heating on, otherwise get multiple thermal */ - /* ground nodes, but doesn't matter, since any sizeable thermal gradient*/ - /* across an IC circuit is probably due to self-heating anyway. */ - if ( (!here->SOI3tempGiven) || (here->SOI3rt != 0) ) - { - here->SOI3temp = ckt->CKTtemp; - } - vt = here->SOI3temp * CONSTKoverQ; - ratio = here->SOI3temp/model->SOI3tnom; - fact2 = here->SOI3temp/REFTEMP; - kt = here->SOI3temp * CONSTboltz; - egfet = 1.16-(7.02e-4*here->SOI3temp*here->SOI3temp)/ - (here->SOI3temp+1108); - if (!model->SOI3chidGiven) - { - model->SOI3chid = CHARGE*egfet/CONSTboltz; - } - if (!model->SOI3chid1Given) - { - model->SOI3chid1 = CHARGE*egfet/CONSTboltz; - } - arg = -egfet/(kt+kt)+1.1150877/(CONSTboltz*(REFTEMP+REFTEMP)); - pbfact = -2*vt *(1.5*log(fact2)+CHARGE*arg); - - if(!here->SOI3lGiven) - { - here->SOI3l = ckt->CKTdefaultMosL; - } - if(!here->SOI3wGiven) - { - here->SOI3w = ckt->CKTdefaultMosW; - } - - if(here->SOI3l - 2 * model->SOI3latDiff <=0) - { - SPfrontEnd->IFerrorf (ERR_WARNING, - "%s: Effective channel length less than zero \nIncreasing \ - this instance length by 2*LD to remove effect of LD", - here->SOI3name); - here->SOI3l += 2*model->SOI3latDiff; - } - ratio4 = exp(model->SOI3k*log(ratio)); /* ratio4 = (temp/tnom)^k */ - /* i.e. mobilitites prop to */ - /* T^-(k) where k=1.5 for old SPICE */ - here->SOI3tTransconductance = model->SOI3transconductance / ratio4; - here->SOI3tSurfMob = model->SOI3surfaceMobility/ratio4; - phio= (model->SOI3phi-pbfact1)/fact1; /* this is PHI @ REFTEMP */ - here->SOI3tPhi = fact2 * phio + pbfact; - here->SOI3tVfbF = model->SOI3vfbF + - (model->SOI3type * model->SOI3gateType * 0.5*(egfet1-egfet)) + - (model->SOI3type * 0.5 * (model->SOI3phi - here->SOI3tPhi)); - here->SOI3tVfbB = model->SOI3vfbB + - (1-model->SOI3type)*0.5*(here->SOI3tPhi-model->SOI3phi); - - here->SOI3tVto = here->SOI3tVfbF + model->SOI3type * - (model->SOI3gamma * sqrt(here->SOI3tPhi) + eta_s*here->SOI3tPhi); - - here->SOI3tSatCur = model->SOI3jctSatCur* - exp(-egfet/vt+egfet1/vtnom); - here->SOI3tSatCur1 = model->SOI3jctSatCur1* - exp(-egfet/vt+egfet1/vtnom); - here->SOI3tSatCurDens = model->SOI3jctSatCurDensity * - exp(-egfet/vt+egfet1/vtnom); - here->SOI3tSatCurDens1 = model->SOI3jctSatCurDensity1 * - exp(-egfet/vt+egfet1/vtnom); - - pbo = (model->SOI3bulkJctPotential - pbfact1)/fact1; - gmaold = (model->SOI3bulkJctPotential-pbo)/pbo; - capfact = 1/(1+model->SOI3bulkJctSideGradingCoeff* - (4e-4*(model->SOI3tnom-REFTEMP)-gmaold)); - here->SOI3tCbd = model->SOI3capBD * capfact; - here->SOI3tCbs = model->SOI3capBS * capfact; - here->SOI3tCjsw = model->SOI3sideWallCapFactor * capfact; - here->SOI3tBulkPot = fact2 * pbo+pbfact; - gmanew = (here->SOI3tBulkPot-pbo)/pbo; - capfact = (1+model->SOI3bulkJctSideGradingCoeff* - (4e-4*(here->SOI3temp-REFTEMP)-gmanew)); - here->SOI3tCbd *= capfact; - here->SOI3tCbs *= capfact; - here->SOI3tCjsw *= capfact; - here->SOI3tDepCap = model->SOI3fwdCapDepCoeff * here->SOI3tBulkPot; - - if (here->SOI3tSatCurDens == 0) - { - if (here->SOI3tSatCur == 0) - { - here->SOI3sourceVcrit = here->SOI3drainVcrit = - vt*log(vt/(CONSTroot2*1.0e-15)); - } - else - { - here->SOI3sourceVcrit = here->SOI3drainVcrit = - vt*log(vt/(CONSTroot2*here->SOI3tSatCur)); - } - } - else - { - here->SOI3drainVcrit = - vt * log( vt / (CONSTroot2 * - here->SOI3tSatCurDens * (here->SOI3w))); - here->SOI3sourceVcrit = - vt * log( vt / (CONSTroot2 * - here->SOI3tSatCurDens * (here->SOI3w))); - } - - if(model->SOI3capBDGiven) - { - czbd = here->SOI3tCbd; - } - else - { - if(model->SOI3sideWallCapFactorGiven) - { - czbd = here->SOI3tCjsw * (here->SOI3w*model->SOI3bodyThickness); - } - /* JimB - 2/1/99. Calculate default value for Cj0 */ - /* using PN junction theory. */ - else - { - Nratio = (1e6*model->SOI3nplusDoping * model->SOI3substrateDoping)/ - (model->SOI3nplusDoping + model->SOI3substrateDoping); - cj0 = sqrt((Nratio * 11.7 * 8.854214871e-12 * CHARGE)/ - (2 * here->SOI3tBulkPot)); - - /* JimB - temperature dependence code */ - gmaold = (model->SOI3bulkJctPotential-pbo)/pbo; - capfact = 1/(1+model->SOI3bulkJctSideGradingCoeff* - (4e-4*(model->SOI3tnom-REFTEMP)-gmaold)); - cj0 *= capfact; - gmanew = (here->SOI3tBulkPot-pbo)/pbo; - capfact = (1+model->SOI3bulkJctSideGradingCoeff* - (4e-4*(here->SOI3temp-REFTEMP)-gmanew)); - cj0 *= capfact; - - czbd = cj0 * (here->SOI3w*model->SOI3bodyThickness); - } - } - - arg = 1-model->SOI3fwdCapDepCoeff; - sarg = exp( (-model->SOI3bulkJctSideGradingCoeff) * log(arg) ); - here->SOI3Cbd = czbd; - here->SOI3f2d = czbd*(1-model->SOI3fwdCapDepCoeff* - (1+model->SOI3bulkJctSideGradingCoeff))* - sarg/arg; - here->SOI3f3d = czbd * model->SOI3bulkJctSideGradingCoeff * sarg/arg / - here->SOI3tBulkPot; - here->SOI3f4d = czbd*here->SOI3tBulkPot*(1-arg*sarg)/ - (1-model->SOI3bulkJctSideGradingCoeff) - -here->SOI3f3d/2* - (here->SOI3tDepCap*here->SOI3tDepCap) - -here->SOI3tDepCap * here->SOI3f2d; - - if(model->SOI3capBSGiven) - { - czbs=here->SOI3tCbs; - } - else - { - if(model->SOI3sideWallCapFactorGiven) - { - czbs=here->SOI3tCjsw * (here->SOI3w*model->SOI3bodyThickness); - } - /* JimB - 2/1/99. Calculate default value for Cj0 */ - /* using PN junction theory. */ - else - { - Nratio = (1e6*model->SOI3nplusDoping * model->SOI3substrateDoping)/ - (model->SOI3nplusDoping + model->SOI3substrateDoping); - cj0 = sqrt((Nratio * 11.7 * 8.854214871e-12 * CHARGE)/ - (2 * here->SOI3tBulkPot)); - - /* JimB - temperature dependence code */ - gmaold = (model->SOI3bulkJctPotential-pbo)/pbo; - capfact = 1/(1+model->SOI3bulkJctSideGradingCoeff* - (4e-4*(model->SOI3tnom-REFTEMP)-gmaold)); - cj0 *= capfact; - gmanew = (here->SOI3tBulkPot-pbo)/pbo; - capfact = (1+model->SOI3bulkJctSideGradingCoeff* - (4e-4*(here->SOI3temp-REFTEMP)-gmanew)); - cj0 *= capfact; - - czbs = cj0 * (here->SOI3w*model->SOI3bodyThickness); - } - } - arg = 1-model->SOI3fwdCapDepCoeff; - sarg = exp( (-model->SOI3bulkJctSideGradingCoeff) * log(arg) ); - here->SOI3Cbs = czbs; - here->SOI3f2s = czbs*(1-model->SOI3fwdCapDepCoeff* - (1+model->SOI3bulkJctSideGradingCoeff))* - sarg/arg; - here->SOI3f3s = czbs * model->SOI3bulkJctSideGradingCoeff * sarg/arg / - here->SOI3tBulkPot; - here->SOI3f4s = czbs*here->SOI3tBulkPot*(1-arg*sarg)/ - (1-model->SOI3bulkJctSideGradingCoeff) - -here->SOI3f3s/2* - (here->SOI3tDepCap*here->SOI3tDepCap) - -here->SOI3tDepCap * here->SOI3f2s; - - if(model->SOI3drainResistanceGiven) - { - if(model->SOI3drainResistance != 0) - { - here->SOI3drainConductance = 1/model->SOI3drainResistance; - } - else - { - here->SOI3drainConductance = 0; - } - } - else if (model->SOI3sheetResistanceGiven) - { - if(model->SOI3sheetResistance != 0) - { - here->SOI3drainConductance = - 1/(model->SOI3sheetResistance*here->SOI3drainSquares); - } - else - { - here->SOI3drainConductance = 0; - } - } - else if(model->SOI3rdwGiven) - { - if (model->SOI3rdw != 0) - { - /* JimB - 1e6 multiplying factor converts W from m to microns */ - here->SOI3drainConductance = - (here->SOI3w/model->SOI3rdw)*1e6; - } - else - { - here->SOI3drainConductance = 0; - } - } - else - { - here->SOI3drainConductance = 0; - } - - if(model->SOI3sourceResistanceGiven) - { - if(model->SOI3sourceResistance != 0) - { - here->SOI3sourceConductance = 1/model->SOI3sourceResistance; - } - else - { - here->SOI3sourceConductance = 0; - } - } - else if (model->SOI3sheetResistanceGiven) - { - if(model->SOI3sheetResistance != 0) - { - here->SOI3sourceConductance = - 1/(model->SOI3sheetResistance*here->SOI3sourceSquares); - } - else - { - here->SOI3sourceConductance = 0; - } - } - else if(model->SOI3rswGiven) - { - if (model->SOI3rsw != 0) - { - /* JimB - 1e6 multiplying factor converts W from m to microns */ - here->SOI3sourceConductance = - (here->SOI3w/model->SOI3rsw)*1e6; - } - else - { - here->SOI3sourceConductance = 0; - } - } - else - { - here->SOI3sourceConductance = 0; - } -/* extra stuff for newer model - msll Jan96 */ - } /* finish looping through all instances of the model*/ - } /* finish looping through all the transistor models */ - return(OK); -} - - - - diff --git a/src/spicelib/devices/soi3/soi3trun.c b/src/spicelib/devices/soi3/soi3trun.c deleted file mode 100644 index 22c3f0a2b..000000000 --- a/src/spicelib/devices/soi3/soi3trun.c +++ /dev/null @@ -1,46 +0,0 @@ -/********** -STAG version 2.7 -Copyright 2000 owned by the United Kingdom Secretary of State for Defence -acting through the Defence Evaluation and Research Agency. -Developed by : Jim Benson, - Department of Electronics and Computer Science, - University of Southampton, - United Kingdom. -With help from : Nele D'Halleweyn, Ketan Mistry, Bill Redman-White, and Craig Easson. - -Based on STAG version 2.1 -Developed by : Mike Lee, -With help from : Bernard Tenbroek, Bill Redman-White, Mike Uren, Chris Edwards - and John Bunyan. -Acknowledgements : Rupert Howes and Pete Mole. -**********/ - -/********** -Modified by Paolo Nenzi 2002 -ngspice integration -**********/ - -#include "ngspice/ngspice.h" -#include "ngspice/cktdefs.h" -#include "soi3defs.h" -#include "ngspice/sperror.h" -#include "ngspice/suffix.h" - - -int -SOI3trunc(GENmodel *inModel, CKTcircuit *ckt, double *timeStep) -{ - SOI3model *model = (SOI3model *)inModel; - SOI3instance *here; - - for( ; model != NULL; model = SOI3nextModel(model)) - { - for(here=SOI3instances(model);here!=NULL;here = SOI3nextInstance(here)) - { - CKTterr(here->SOI3qgf,ckt,timeStep); - CKTterr(here->SOI3qd,ckt,timeStep); - CKTterr(here->SOI3qs,ckt,timeStep); - } - } - return(OK); -} diff --git a/src/spicelib/devices/sw/Makefile.am b/src/spicelib/devices/sw/Makefile.am deleted file mode 100644 index a8595b927..000000000 --- a/src/spicelib/devices/sw/Makefile.am +++ /dev/null @@ -1,27 +0,0 @@ -## Process this file with automake to produce Makefile.in - -noinst_LTLIBRARIES = libsw.la - -libsw_la_SOURCES = \ - sw.c \ - swacload.c \ - swask.c \ - swdefs.h \ - swext.h \ - swinit.c \ - swinit.h \ - switf.h \ - swload.c \ - swmask.c \ - swmparam.c \ - swnoise.c \ - swparam.c \ - swpzload.c \ - swsetup.c \ - swtrunc.c - - - -AM_CPPFLAGS = @AM_CPPFLAGS@ -I$(top_srcdir)/src/include -AM_CFLAGS = $(STATIC) -MAINTAINERCLEANFILES = Makefile.in diff --git a/src/spicelib/devices/sw/sw.c b/src/spicelib/devices/sw/sw.c deleted file mode 100644 index 536060abb..000000000 --- a/src/spicelib/devices/sw/sw.c +++ /dev/null @@ -1,44 +0,0 @@ -/********** -Copyright 1990 Regents of the University of California. All rights reserved. -Author: 1987 -**********/ - -#include "ngspice/ngspice.h" -#include "ngspice/devdefs.h" -#include "ngspice/ifsim.h" -#include "swdefs.h" -#include "ngspice/suffix.h" - -IFparm SWpTable[] = { /* parameters */ - IP("on", SW_IC_ON, IF_FLAG, "Switch initially closed"), - IP("off", SW_IC_OFF, IF_FLAG, "Switch initially open"), - IOPU("pos_node", SW_POS_NODE, IF_INTEGER, "Positive node of switch"), - IOPU("neg_node", SW_NEG_NODE, IF_INTEGER, "Negative node of switch"), - OPU("cont_p_node", SW_POS_CONT_NODE, IF_INTEGER, "Positive contr. node of switch"), - OPU("cont_n_node", SW_NEG_CONT_NODE, IF_INTEGER, "Positive contr. node of switch"), - OP("i", SW_CURRENT, IF_REAL, "Switch current"), - OP("p", SW_POWER, IF_REAL, "Switch power") -}; - -IFparm SWmPTable[] = { /* model parameters */ - IOPU("sw", SW_MOD_SW, IF_FLAG, "Switch model"), - IOPU("vt", SW_MOD_VTH, IF_REAL, "Threshold voltage"), - IOPU("vh", SW_MOD_VHYS, IF_REAL, "Hysteresis voltage"), - IOPU("ron", SW_MOD_RON, IF_REAL, "Resistance when closed"), - OPU("gon", SW_MOD_GON, IF_REAL, "Conductance when closed"), - IOPU("roff", SW_MOD_ROFF, IF_REAL, "Resistance when open"), - OPU("goff", SW_MOD_GOFF, IF_REAL, "Conductance when open") -}; - -char *SWnames[] = { - "S+", - "S-", - "SC+", - "SC-" -}; - -int SWnSize = NUMELEMS(SWnames); -int SWpTSize = NUMELEMS(SWpTable); -int SWmPTSize = NUMELEMS(SWmPTable); -int SWiSize = sizeof(SWinstance); -int SWmSize = sizeof(SWmodel); diff --git a/src/spicelib/devices/sw/swacload.c b/src/spicelib/devices/sw/swacload.c deleted file mode 100644 index e8b2c03d7..000000000 --- a/src/spicelib/devices/sw/swacload.c +++ /dev/null @@ -1,37 +0,0 @@ -/********** -Copyright 1990 Regents of the University of California. All rights reserved. -Author: 1985 Gordon Jacobs -**********/ - -#include "ngspice/ngspice.h" -#include "ngspice/cktdefs.h" -#include "swdefs.h" -#include "ngspice/sperror.h" -#include "ngspice/suffix.h" - - -int -SWacLoad(GENmodel *inModel, CKTcircuit *ckt) -{ - SWmodel *model = (SWmodel *) inModel; - SWinstance *here; - double g_now; - int current_state; - - for (; model; model = SWnextModel(model)) - for (here = SWinstances(model); here; here = SWnextInstance(here)) { - - /* In AC analysis, just propogate the state... */ - - current_state = (int) ckt->CKTstate0[here->SWswitchstate]; - - g_now = current_state ? model->SWonConduct : model->SWoffConduct; - - *(here->SWposPosPtr) += g_now; - *(here->SWposNegPtr) -= g_now; - *(here->SWnegPosPtr) -= g_now; - *(here->SWnegNegPtr) += g_now; - } - - return OK; -} diff --git a/src/spicelib/devices/sw/swask.c b/src/spicelib/devices/sw/swask.c deleted file mode 100644 index 8c1555c04..000000000 --- a/src/spicelib/devices/sw/swask.c +++ /dev/null @@ -1,72 +0,0 @@ -/********** -Copyright 1990 Regents of the University of California. All rights reserved. -Author: 1987 Thomas L. Quarles -**********/ - -/* - * This routine gives access to the internal device parameters - * of voltage controlled SWitch - */ - -#include "ngspice/ngspice.h" -#include "ngspice/cktdefs.h" -#include "ngspice/devdefs.h" -#include "ngspice/ifsim.h" -#include "swdefs.h" -#include "ngspice/sperror.h" -#include "ngspice/suffix.h" - - -int -SWask(CKTcircuit *ckt, GENinstance *inst, int which, IFvalue *value, IFvalue *select) -{ - SWinstance *here = (SWinstance *) inst; - static char *msg = "Current and power not available in ac analysis"; - - NG_IGNORE(select); - - switch (which) { - case SW_POS_NODE: - value->iValue = here->SWposNode; - return OK; - case SW_NEG_NODE: - value->iValue = here->SWnegNode; - return OK; - case SW_POS_CONT_NODE: - value->iValue = here->SWposCntrlNode; - return OK; - case SW_NEG_CONT_NODE: - value->iValue = here->SWnegCntrlNode; - return OK; - case SW_CURRENT: - if (ckt->CKTcurrentAnalysis & DOING_AC) { - errMsg = TMALLOC(char, strlen(msg) + 1); - errRtn = "SWask"; - strcpy(errMsg, msg); - return E_ASKCURRENT; - } else { - value->rValue = - (ckt->CKTrhsOld[here->SWposNode] - - ckt->CKTrhsOld[here->SWnegNode]) * - here->SWcond; - } - return OK; - case SW_POWER: - if (ckt->CKTcurrentAnalysis & DOING_AC) { - errMsg = TMALLOC(char, strlen(msg) + 1); - errRtn = "SWask"; - strcpy(errMsg, msg); - return E_ASKPOWER; - } else { - value->rValue = - (ckt->CKTrhsOld[here->SWposNode] - - ckt->CKTrhsOld[here->SWnegNode]) * - (ckt->CKTrhsOld[here->SWposNode] - - ckt->CKTrhsOld[here->SWnegNode]) * - here->SWcond; - } - return OK; - default: - return E_BADPARM; - } -} diff --git a/src/spicelib/devices/sw/swdefs.h b/src/spicelib/devices/sw/swdefs.h deleted file mode 100644 index a0df78a8d..000000000 --- a/src/spicelib/devices/sw/swdefs.h +++ /dev/null @@ -1,115 +0,0 @@ -/********** -Copyright 1990 Regents of the University of California. All rights reserved. -Author: 1985 Gordon M. Jacobs -Modified: 2000 AlansFixes -**********/ - -#ifndef SW -#define SW - -#include "ngspice/ifsim.h" -#include "ngspice/cktdefs.h" -#include "ngspice/gendefs.h" -#include "ngspice/complex.h" -#include "ngspice/noisedef.h" - -/* structures used to describe voltage controlled switches */ - - -/* information to describe each instance */ - -typedef struct sSWinstance { - - struct GENinstance gen; - -#define SWmodPtr(inst) ((struct sSWmodel *)((inst)->gen.GENmodPtr)) -#define SWnextInstance(inst) ((struct sSWinstance *)((inst)->gen.GENnextInstance)) -#define SWname gen.GENname -#define SWstate gen.GENstate - - const int SWposNode; /* number of positive node of switch */ - const int SWnegNode; /* number of negative node of switch */ - const int SWposCntrlNode; /* number of positive controlling node of switch */ - const int SWnegCntrlNode; /* number of negative controlling node of switch */ - - double *SWposPosPtr; /* pointer to sparse matrix diagonal at - (positive,positive) for switch conductance */ - double *SWnegPosPtr; /* pointer to sparse matrix offdiagonal at - (neagtive,positive) for switch conductance */ - double *SWposNegPtr; /* pointer to sparse matrix offdiagonal at - (positive,neagtive) for switch conductance */ - double *SWnegNegPtr; /* pointer to sparse matrix diagonal at - (neagtive,neagtive) for switch conductance */ - - double SWcond; /* conductance of the switch now */ - - unsigned SWzero_stateGiven : 1; /* flag to indicate initial state */ -#ifndef NONOISE - double SWnVar[NSTATVARS]; -#else - double *SWnVar; -#endif -} SWinstance; - -/* data per model */ - -#define SW_ON_CONDUCTANCE 1.0 /* default on conductance = 1 mho */ -#define SW_OFF_CONDUCTANCE ckt->CKTgmin /* default off conductance */ -#define SW_NUM_STATES 2 - -#define SWswitchstate SWstate+0 -#define SWctrlvalue SWstate+1 - - -typedef struct sSWmodel { /* model structure for a switch */ - - struct GENmodel gen; - -#define SWmodType gen.GENmodType -#define SWnextModel(inst) ((struct sSWmodel *)((inst)->gen.GENnextModel)) -#define SWinstances(inst) ((SWinstance *) ((inst)->gen.GENinstances)) -#define SWmodName gen.GENmodName - - double SWonResistance; /* switch "on" resistance */ - double SWoffResistance; /* switch "off" resistance */ - double SWvThreshold; /* switching threshold voltage */ - double SWvHysteresis; /* switching hysteresis voltage */ - double SWonConduct; /* switch "on" conductance */ - double SWoffConduct; /* switch "off" conductance */ - - unsigned SWonGiven : 1; /* flag to indicate on-resistance was specified */ - unsigned SWoffGiven : 1; /* flag to indicate off-resistance was " */ - unsigned SWthreshGiven : 1; /* flag to indicate threshold volt was given */ - unsigned SWhystGiven : 1; /* flag to indicate hysteresis volt was given */ -} SWmodel; - -/* device parameters */ -enum { - SW_IC_ON = 1, - SW_IC_OFF, - SW_POS_NODE, - SW_NEG_NODE, - SW_POS_CONT_NODE, - SW_NEG_CONT_NODE, - SW_CURRENT, - SW_POWER, -}; - -/* model parameters */ -enum { - SW_MOD_SW = 101, - SW_MOD_RON, - SW_MOD_ROFF, - SW_MOD_VTH, - SW_MOD_VHYS, - SW_MOD_GON, - SW_MOD_GOFF, -}; - -/* device questions */ - -/* model questions */ - -#include "swext.h" - -#endif diff --git a/src/spicelib/devices/sw/swext.h b/src/spicelib/devices/sw/swext.h deleted file mode 100644 index e2d0e3e66..000000000 --- a/src/spicelib/devices/sw/swext.h +++ /dev/null @@ -1,16 +0,0 @@ -/********** -Copyright 1990 Regents of the University of California. All rights reserved. -Author: 1985 Gordon M. Jacobs -Modified: 2000 AlansFixes -**********/ - -extern int SWacLoad(GENmodel *, CKTcircuit *); -extern int SWask(CKTcircuit *, GENinstance *, int, IFvalue *, IFvalue *); -extern int SWload(GENmodel *, CKTcircuit *); -extern int SWmAsk(CKTcircuit *, GENmodel *, int, IFvalue *); -extern int SWmParam(int, IFvalue *, GENmodel *); -extern int SWparam(int, IFvalue *, GENinstance *, IFvalue *); -extern int SWpzLoad(GENmodel *, CKTcircuit *, SPcomplex *); -extern int SWsetup(SMPmatrix *, GENmodel *, CKTcircuit *, int *); -extern int SWnoise(int, int, GENmodel *, CKTcircuit *, Ndata *, double *); -extern int SWtrunc(GENmodel *, CKTcircuit *, double *); diff --git a/src/spicelib/devices/sw/swinit.c b/src/spicelib/devices/sw/swinit.c deleted file mode 100644 index 075df7575..000000000 --- a/src/spicelib/devices/sw/swinit.c +++ /dev/null @@ -1,77 +0,0 @@ -/* Modified: Alansfixes */ -#include "ngspice/config.h" - -#include "ngspice/devdefs.h" - -#include "switf.h" -#include "swext.h" -#include "swinit.h" - - -SPICEdev SWinfo = { - .DEVpublic = { - .name = "Switch", - .description = "Ideal voltage controlled switch", - .terms = &SWnSize, - .numNames = &SWnSize, - .termNames = SWnames, - .numInstanceParms = &SWpTSize, - .instanceParms = SWpTable, - .numModelParms = &SWmPTSize, - .modelParms = SWmPTable, - .flags = 0, - -#ifdef XSPICE - .cm_func = NULL, - .num_conn = 0, - .conn = NULL, - .num_param = 0, - .param = NULL, - .num_inst_var = 0, - .inst_var = NULL, -#endif - }, - - .DEVparam = SWparam, - .DEVmodParam = SWmParam, - .DEVload = SWload, - .DEVsetup = SWsetup, - .DEVunsetup = NULL, - .DEVpzSetup = SWsetup, - .DEVtemperature = NULL, - .DEVtrunc = SWtrunc, - .DEVfindBranch = NULL, - .DEVacLoad = SWacLoad, - .DEVaccept = NULL, - .DEVdestroy = NULL, - .DEVmodDelete = NULL, - .DEVdelete = NULL, - .DEVsetic = NULL, - .DEVask = SWask, - .DEVmodAsk = SWmAsk, - .DEVpzLoad = SWpzLoad, - .DEVconvTest = NULL, - .DEVsenSetup = NULL, - .DEVsenLoad = NULL, - .DEVsenUpdate = NULL, - .DEVsenAcLoad = NULL, - .DEVsenPrint = NULL, - .DEVsenTrunc = NULL, - .DEVdisto = NULL, - .DEVnoise = SWnoise, - .DEVsoaCheck = NULL, - .DEVinstSize = &SWiSize, - .DEVmodSize = &SWmSize, - -#ifdef CIDER - .DEVdump = NULL, - .DEVacct = NULL, -#endif -}; - - -SPICEdev * -get_sw_info(void) -{ - return &SWinfo; -} diff --git a/src/spicelib/devices/sw/swinit.h b/src/spicelib/devices/sw/swinit.h deleted file mode 100644 index 2ec0cd37c..000000000 --- a/src/spicelib/devices/sw/swinit.h +++ /dev/null @@ -1,13 +0,0 @@ -#ifndef _SWINIT_H -#define _SWINIT_H - -extern IFparm SWpTable[]; -extern IFparm SWmPTable[]; -extern char *SWnames[]; -extern int SWpTSize; -extern int SWmPTSize; -extern int SWnSize; -extern int SWiSize; -extern int SWmSize; - -#endif diff --git a/src/spicelib/devices/sw/switf.h b/src/spicelib/devices/sw/switf.h deleted file mode 100644 index 0aee8110c..000000000 --- a/src/spicelib/devices/sw/switf.h +++ /dev/null @@ -1,9 +0,0 @@ -/********** -Copyright 1990 Regents of the University of California. All rights reserved. -**********/ -#ifndef DEV_SW -#define DEV_SW - -extern SPICEdev *get_sw_info(void); - -#endif diff --git a/src/spicelib/devices/sw/swload.c b/src/spicelib/devices/sw/swload.c deleted file mode 100644 index 4150d736f..000000000 --- a/src/spicelib/devices/sw/swload.c +++ /dev/null @@ -1,149 +0,0 @@ -/********** -Copyright 1990 Regents of the University of California. All rights reserved. -Author: 1985 Gordon Jacobs -Modified: 2001 Jon Engelbert -**********/ - -#include "ngspice/ngspice.h" -#include "ngspice/cktdefs.h" -#include "ngspice/fteext.h" -#include "swdefs.h" -#include "ngspice/trandefs.h" -#include "ngspice/sperror.h" -#include "ngspice/suffix.h" - - -int -SWload(GENmodel *inModel, CKTcircuit *ckt) -{ - SWmodel *model = (SWmodel *) inModel; - SWinstance *here; - double g_now; - double v_ctrl; - double previous_state = -1; - double current_state = -1; - double old_current_state = -1; - double REALLY_OFF = 0, REALLY_ON = 1; // switch is on or off, not in hysteresis region. - double HYST_OFF = 2, HYST_ON = 3; // switch is on or off while control value is in hysteresis region. - // double previous_region = -1; - // double current_region = -1; - - for (; model; model = SWnextModel(model)) - for (here = SWinstances(model); here; here = SWnextInstance(here)) { - - old_current_state = ckt->CKTstate0[here->SWswitchstate]; - previous_state = ckt->CKTstate1[here->SWswitchstate]; - - v_ctrl = - ckt->CKTrhsOld[here->SWposCntrlNode] - - ckt->CKTrhsOld[here->SWnegCntrlNode]; - - /* decide the state of the switch */ - - if (ckt->CKTmode & (MODEINITFIX | MODEINITJCT)) { - - if (here->SWzero_stateGiven) { - /* switch specified "on" */ - if (model->SWvHysteresis >= 0 && v_ctrl > model->SWvThreshold + model->SWvHysteresis) - current_state = REALLY_ON; - else if (model->SWvHysteresis < 0 && v_ctrl > model->SWvThreshold - model->SWvHysteresis) - current_state = REALLY_ON; - else - current_state = HYST_ON; - } else { - if (model->SWvHysteresis >= 0 && v_ctrl < model->SWvThreshold - model->SWvHysteresis) - current_state = REALLY_OFF; - else if (model->SWvHysteresis < 0 && v_ctrl < model->SWvThreshold + model->SWvHysteresis) - current_state = REALLY_OFF; - else - current_state = HYST_OFF; - } - - } else if (ckt->CKTmode & (MODEINITSMSIG)) { - - current_state = previous_state; - - } else if (ckt->CKTmode & (MODEINITFLOAT)) { - - /* use state0 since INITTRAN or INITPRED already called */ - if (model->SWvHysteresis > 0) { - if (v_ctrl > (model->SWvThreshold + model->SWvHysteresis)) - current_state = REALLY_ON; - else if (v_ctrl < (model->SWvThreshold - model->SWvHysteresis)) - current_state = REALLY_OFF; - else - current_state = old_current_state; - } else { // negative hysteresis case. - if (v_ctrl > (model->SWvThreshold - model->SWvHysteresis)) - current_state = REALLY_ON; - else if (v_ctrl < (model->SWvThreshold + model->SWvHysteresis)) - current_state = REALLY_OFF; - else { // in hysteresis... change value if going from low to hysteresis, or from hi to hysteresis. - // if previous state was in hysteresis, then don't change the state.. - if (previous_state == HYST_OFF || previous_state == HYST_ON) - current_state = previous_state; - else if (previous_state == REALLY_ON) - current_state = HYST_OFF; - else if (previous_state == REALLY_OFF) - current_state = HYST_ON; - else - internalerror("bad value for previous state in swload"); - } - } - - if (current_state != old_current_state) { - ckt->CKTnoncon++; /* ensure one more iteration */ - ckt->CKTtroubleElt = (GENinstance *) here; - } - - } else if (ckt->CKTmode & (MODEINITTRAN | MODEINITPRED)) { - - if (model->SWvHysteresis > 0) { - if (v_ctrl > (model->SWvThreshold + model->SWvHysteresis)) - current_state = REALLY_ON; - else if (v_ctrl < (model->SWvThreshold - model->SWvHysteresis)) - current_state = REALLY_OFF; - else - current_state = previous_state; - } else { // negative hysteresis case. - if (v_ctrl > (model->SWvThreshold - model->SWvHysteresis)) - current_state = REALLY_ON; - else if (v_ctrl < (model->SWvThreshold + model->SWvHysteresis)) - current_state = REALLY_OFF; - else { - current_state = 0.0; - if (previous_state == HYST_ON || previous_state == HYST_OFF) - current_state = previous_state; - else if (previous_state == REALLY_ON) - current_state = REALLY_OFF; - else if (previous_state == REALLY_OFF) - current_state = REALLY_ON; - } - } - } - - // code added to force the state to be updated. - // there is a possible problem. What if, during the transient analysis, the time is stepped - // forward enough to change the switch's state, but that time point is rejected as being too - // distant and then the time is pushed back to a time before the switch changed states. - // After analyzing the transient code, it seems that this is not a problem because state updating - // occurs before the convergence loop in transient processing. - - ckt->CKTstate0[here->SWswitchstate] = current_state; - ckt->CKTstate0[here->SWctrlvalue] = v_ctrl; - - if (current_state == REALLY_ON || current_state == HYST_ON) - g_now = model->SWonConduct; - else - g_now = model->SWoffConduct; - - here->SWcond = g_now; - - *(here->SWposPosPtr) += g_now; - *(here->SWposNegPtr) -= g_now; - *(here->SWnegPosPtr) -= g_now; - *(here->SWnegNegPtr) += g_now; - } - - return OK; -} diff --git a/src/spicelib/devices/sw/swmask.c b/src/spicelib/devices/sw/swmask.c deleted file mode 100644 index 3fec325d2..000000000 --- a/src/spicelib/devices/sw/swmask.c +++ /dev/null @@ -1,49 +0,0 @@ -/********** -Copyright 1990 Regents of the University of California. All rights reserved. -Author: 1987 Thomas L. Quarles -**********/ - -/* - * This routine gives access to the internal model parameter - * of voltage controlled SWitch - */ - -#include "ngspice/ngspice.h" -#include "ngspice/cktdefs.h" -#include "ngspice/devdefs.h" -#include "ngspice/ifsim.h" -#include "swdefs.h" -#include "ngspice/sperror.h" -#include "ngspice/suffix.h" - - -int -SWmAsk(CKTcircuit *ckt, GENmodel *inModel, int which, IFvalue *value) -{ - SWmodel *model = (SWmodel *) inModel; - - NG_IGNORE(ckt); - - switch (which) { - case SW_MOD_RON: - value->rValue = model->SWonResistance; - return OK; - case SW_MOD_ROFF: - value->rValue = model->SWoffResistance; - return OK; - case SW_MOD_VTH: - value->rValue = model->SWvThreshold; - return OK; - case SW_MOD_VHYS: - value->rValue = model->SWvHysteresis; - return OK; - case SW_MOD_GON: - value->rValue = model->SWonConduct; - return OK; - case SW_MOD_GOFF: - value->rValue = model->SWoffConduct; - return OK; - default: - return E_BADPARM; - } -} diff --git a/src/spicelib/devices/sw/swmparam.c b/src/spicelib/devices/sw/swmparam.c deleted file mode 100644 index 501c54618..000000000 --- a/src/spicelib/devices/sw/swmparam.c +++ /dev/null @@ -1,50 +0,0 @@ -/********** -Copyright 1990 Regents of the University of California. All rights reserved. -Author: 1985 Gordon Jacobs -Modified: 2001 Jon Engelbert -**********/ - -#include "ngspice/ngspice.h" -#include "swdefs.h" -#include "ngspice/ifsim.h" -#include "ngspice/sperror.h" -#include "ngspice/suffix.h" - - -int -SWmParam(int param, IFvalue *value, GENmodel *inModel) -{ - SWmodel *model = (SWmodel *) inModel; - - switch (param) { - case SW_MOD_SW: - /* just says that this is a switch */ - break; - case SW_MOD_RON: - model->SWonResistance = value->rValue; - model->SWonConduct = 1.0 / value->rValue; - model->SWonGiven = TRUE; - break; - case SW_MOD_ROFF: - model->SWoffResistance = value->rValue; - model->SWoffConduct = 1.0 / value->rValue; - model->SWoffGiven = TRUE; - break; - case SW_MOD_VTH: - /* take absolute value of hysteresis voltage */ - model->SWvThreshold = value->rValue; - model->SWthreshGiven = TRUE; - break; - case SW_MOD_VHYS: - /* take absolute value of hysteresis voltage */ - // model->SWvHysteresis = (value->rValue < 0) ? -(value->rValue) : - // value->rValue; - model->SWvHysteresis = value->rValue; - model->SWhystGiven = TRUE; - break; - default: - return E_BADPARM; - } - - return OK; -} diff --git a/src/spicelib/devices/sw/swnoise.c b/src/spicelib/devices/sw/swnoise.c deleted file mode 100644 index ed0ce79c6..000000000 --- a/src/spicelib/devices/sw/swnoise.c +++ /dev/null @@ -1,115 +0,0 @@ -/********** -Copyright 1990 Regents of the University of California. All rights reserved. -Author: 1987 Gary W. Ng -**********/ - -#include "ngspice/ngspice.h" -#include "swdefs.h" -#include "ngspice/cktdefs.h" -#include "ngspice/iferrmsg.h" -#include "ngspice/noisedef.h" -#include "ngspice/suffix.h" - -/* - * SWnoise (mode, operation, firstModel, ckt, data, OnDens) - * This routine names and evaluates all of the noise sources - * associated with voltage- controlled switches. It starts with the - * model *firstModel and traverses all of its instances. It then - * proceeds to any other models on the linked list. The total output - * noise density generated by the SW's is summed in the variable - * "OnDens". - */ - - -int -SWnoise(int mode, int operation, GENmodel *genmodel, CKTcircuit *ckt, Ndata *data, double *OnDens) -{ - NOISEAN *job = (NOISEAN *) ckt->CKTcurJob; - - SWmodel *firstModel = (SWmodel *) genmodel; - SWmodel *model; - SWinstance *inst; - double tempOutNoise; - double tempInNoise; - double noizDens; - double lnNdens; - int current_state; - - for (model = firstModel; model; model = SWnextModel(model)) - for (inst = SWinstances(model); inst; inst = SWnextInstance(inst)) { - - switch (operation) { - - case N_OPEN: - - /* see if we have to to produce a summary report */ - /* if so, name the noise generator */ - - if (job->NStpsSm != 0) - switch (mode) { - case N_DENS: - NOISE_ADD_OUTVAR(ckt, data, "onoise_%s%s", inst->SWname, ""); - break; - case INT_NOIZ: - NOISE_ADD_OUTVAR(ckt, data, "onoise_total_%s%s", inst->SWname, ""); - NOISE_ADD_OUTVAR(ckt, data, "inoise_total_%s%s", inst->SWname, ""); - break; - } - break; - - case N_CALC: - switch (mode) { - - case N_DENS: - current_state = (int) ckt->CKTstate0[inst->SWswitchstate]; - NevalSrc(&noizDens, &lnNdens, ckt, THERMNOISE, - inst->SWposNode, inst->SWnegNode, - current_state ? model->SWonConduct : model->SWoffConduct); - - *OnDens += noizDens; - - if (data->delFreq == 0.0) { - - /* if we haven't done any previous integration, we need to */ - /* initialize our "history" variables */ - - inst->SWnVar[LNLSTDENS] = lnNdens; - - /* clear out our integration variable if it's the first pass */ - - if (data->freq == job->NstartFreq) - inst->SWnVar[OUTNOIZ] = 0.0; - } else { /* data->delFreq != 0.0 (we have to integrate) */ - tempOutNoise = Nintegrate(noizDens, lnNdens, - inst->SWnVar[LNLSTDENS], data); - tempInNoise = Nintegrate(noizDens * - data->GainSqInv, lnNdens + data->lnGainInv, - inst->SWnVar[LNLSTDENS] + data->lnGainInv, - data); - inst->SWnVar[OUTNOIZ] += tempOutNoise; - inst->SWnVar[INNOIZ] += tempInNoise; - data->outNoiz += tempOutNoise; - data->inNoise += tempInNoise; - inst->SWnVar[LNLSTDENS] = lnNdens; - } - if (data->prtSummary) - data->outpVector[data->outNumber++] = noizDens; - break; - - case INT_NOIZ: /* already calculated, just output */ - if (job->NStpsSm != 0) { - data->outpVector[data->outNumber++] = inst->SWnVar[OUTNOIZ]; - data->outpVector[data->outNumber++] = inst->SWnVar[INNOIZ]; - } - break; - } - break; - - case N_CLOSE: - return OK; /* do nothing, the main calling routine will close */ - break; /* the plots */ - } - } - - return OK; -} diff --git a/src/spicelib/devices/sw/swparam.c b/src/spicelib/devices/sw/swparam.c deleted file mode 100644 index dd1bd9d0c..000000000 --- a/src/spicelib/devices/sw/swparam.c +++ /dev/null @@ -1,34 +0,0 @@ -/********** -Copyright 1990 Regents of the University of California. All rights reserved. -Author: 1985 Gordon Jacobs -**********/ - -#include "ngspice/ngspice.h" -#include "swdefs.h" -#include "ngspice/ifsim.h" -#include "ngspice/sperror.h" -#include "ngspice/suffix.h" - - -int -SWparam(int param, IFvalue *value, GENinstance *inst, IFvalue *select) -{ - SWinstance *here = (SWinstance *) inst; - - NG_IGNORE(select); - - switch (param) { - case SW_IC_ON: - if (value->iValue) - here->SWzero_stateGiven = TRUE; - break; - case SW_IC_OFF: - if (value->iValue) - here->SWzero_stateGiven = FALSE; - break; - default: - return E_BADPARM; - } - - return OK; -} diff --git a/src/spicelib/devices/sw/swpzload.c b/src/spicelib/devices/sw/swpzload.c deleted file mode 100644 index ff23edb16..000000000 --- a/src/spicelib/devices/sw/swpzload.c +++ /dev/null @@ -1,40 +0,0 @@ -/********** -Copyright 1990 Regents of the University of California. All rights reserved. -Author: 1985 Gordon Jacobs -**********/ - -#include "ngspice/ngspice.h" -#include "ngspice/cktdefs.h" -#include "swdefs.h" -#include "ngspice/sperror.h" -#include "ngspice/complex.h" -#include "ngspice/suffix.h" - - -int -SWpzLoad(GENmodel *inModel, CKTcircuit *ckt, SPcomplex *s) -{ - SWmodel *model = (SWmodel *) inModel; - SWinstance *here; - double g_now; - int current_state; - - NG_IGNORE(s); - - for (; model; model = SWnextModel(model)) - for (here = SWinstances(model); here; here = SWnextInstance(here)) { - - /* In AC analysis, just propogate the state... */ - - current_state = (int) ckt->CKTstate0[here->SWswitchstate]; - - g_now = current_state ? model->SWonConduct : model->SWoffConduct; - - *(here->SWposPosPtr) += g_now; - *(here->SWposNegPtr) -= g_now; - *(here->SWnegPosPtr) -= g_now; - *(here->SWnegNegPtr) += g_now; - } - - return OK; -} diff --git a/src/spicelib/devices/sw/swsetup.c b/src/spicelib/devices/sw/swsetup.c deleted file mode 100644 index 14e2baea7..000000000 --- a/src/spicelib/devices/sw/swsetup.c +++ /dev/null @@ -1,58 +0,0 @@ -/********** -Copyright 1990 Regents of the University of California. All rights reserved. -Author: 1985 Gordon Jacobs -**********/ - -#include "ngspice/ngspice.h" -#include "ngspice/smpdefs.h" -#include "ngspice/cktdefs.h" -#include "swdefs.h" -#include "ngspice/sperror.h" -#include "ngspice/suffix.h" - -#define TSTALLOC(ptr, first, second) \ - do { \ - if ((here->ptr = SMPmakeElt(matrix, here->first, here->second)) == NULL) \ - return E_NOMEM; \ - } while (0) - - -int -SWsetup(SMPmatrix *matrix, GENmodel *inModel, CKTcircuit *ckt, int *states) -{ - SWmodel *model = (SWmodel *) inModel; - SWinstance *here; - - for (; model; model = SWnextModel(model)) { - - /* Default Value Processing for Switch Model */ - if (!model->SWthreshGiven) - model->SWvThreshold = 0; - if (!model->SWhystGiven) - model->SWvHysteresis = 0; - if (!model->SWonGiven) { - model->SWonConduct = SW_ON_CONDUCTANCE; - model->SWonResistance = 1.0 / model->SWonConduct; - } - if (!model->SWoffGiven) { - model->SWoffConduct = SW_OFF_CONDUCTANCE; - model->SWoffResistance = 1.0 / model->SWoffConduct; - } - - for (here = SWinstances(model); here; here = SWnextInstance(here)) { - - here->SWstate = *states; - *states += SW_NUM_STATES; - - /* Default Value Processing for Switch Instance */ - /* none */ - - TSTALLOC(SWposPosPtr, SWposNode, SWposNode); - TSTALLOC(SWposNegPtr, SWposNode, SWnegNode); - TSTALLOC(SWnegPosPtr, SWnegNode, SWposNode); - TSTALLOC(SWnegNegPtr, SWnegNode, SWnegNode); - } - } - - return OK; -} diff --git a/src/spicelib/devices/sw/swtrunc.c b/src/spicelib/devices/sw/swtrunc.c deleted file mode 100644 index 81866e285..000000000 --- a/src/spicelib/devices/sw/swtrunc.c +++ /dev/null @@ -1,50 +0,0 @@ -/********** -Copyright 1990 Regents of the University of California. All rights reserved. -Author: 1985 Thomas L. Quarles -Modified: 2000 AlansFixes -**********/ - -#include "ngspice/ngspice.h" -#include "ngspice/cktdefs.h" -#include "ngspice/sperror.h" -#include "ngspice/suffix.h" -#include "swdefs.h" - - -int -SWtrunc(GENmodel *inModel, CKTcircuit *ckt, double *timeStep) -{ - SWmodel *model = (SWmodel *) inModel; - SWinstance *here; - double lastChange, maxChange, maxStep, ref; - - for (; model; model = SWnextModel(model)) - for (here = SWinstances(model); here; here = SWnextInstance(here)) { - lastChange = - ckt->CKTstate0[here->SWctrlvalue] - - ckt->CKTstate1[here->SWctrlvalue]; - if (ckt->CKTstate0[here->SWswitchstate] == 0) { - ref = model->SWvThreshold + model->SWvHysteresis; - if (ckt->CKTstate0[here->SWctrlvalue] < ref && lastChange > 0) { - maxChange = - (ref - ckt->CKTstate0[here->SWctrlvalue]) * 0.75 - + 0.05; - maxStep = maxChange / lastChange * ckt->CKTdeltaOld[0]; - if (*timeStep > maxStep) - *timeStep = maxStep; - } - } else { - ref = model->SWvThreshold - model->SWvHysteresis; - if (ckt->CKTstate0[here->SWctrlvalue] > ref && lastChange < 0) { - maxChange = - (ref - ckt->CKTstate0[here->SWctrlvalue]) * 0.75 - - 0.05; - maxStep = maxChange / lastChange * ckt->CKTdeltaOld[0]; - if (*timeStep > maxStep) - *timeStep = maxStep; - } - } - } - - return OK; -} diff --git a/src/spicelib/devices/tra/Makefile.am b/src/spicelib/devices/tra/Makefile.am deleted file mode 100644 index 5d499d35b..000000000 --- a/src/spicelib/devices/tra/Makefile.am +++ /dev/null @@ -1,24 +0,0 @@ -## Process this file with automake to produce Makefile.in - -noinst_LTLIBRARIES = libtra.la - -libtra_la_SOURCES = \ - tra.c \ - traacct.c \ - traacld.c \ - traask.c \ - tradefs.h \ - traext.h \ - trainit.c \ - trainit.h \ - traitf.h \ - traload.c \ - traparam.c \ - trasetup.c \ - tratemp.c \ - tratrunc.c - - -AM_CPPFLAGS = @AM_CPPFLAGS@ -I$(top_srcdir)/src/include -AM_CFLAGS = $(STATIC) -MAINTAINERCLEANFILES = Makefile.in diff --git a/src/spicelib/devices/tra/tra.c b/src/spicelib/devices/tra/tra.c deleted file mode 100644 index ba1e0bdd6..000000000 --- a/src/spicelib/devices/tra/tra.c +++ /dev/null @@ -1,43 +0,0 @@ -/********** -Copyright 1990 Regents of the University of California. All rights reserved. -Author: 1987 Thomas L. Quarles -**********/ - -#include "ngspice/ngspice.h" -#include "ngspice/devdefs.h" -#include "ngspice/ifsim.h" -#include "tradefs.h" -#include "ngspice/suffix.h" - -IFparm TRApTable[] = { /* parameters */ - IOPU( "z0", TRA_Z0, IF_REAL , "Characteristic impedance"), - IOPUR( "zo", TRA_Z0, IF_REAL , "Characteristic impedance"), - IOPAU( "f", TRA_FREQ, IF_REAL , "Frequency"), - IOPAU( "td", TRA_TD, IF_REAL , "Transmission delay"), - IOPAU( "nl", TRA_NL, IF_REAL , "Normalized length at frequency given"), - IOPAU( "v1", TRA_V1, IF_REAL , "Initial voltage at end 1"), - IOPAU( "v2", TRA_V2, IF_REAL , "Initial voltage at end 2"), - IOPAU( "i1", TRA_I1, IF_REAL , "Initial current at end 1"), - IOPAU( "i2", TRA_I2, IF_REAL , "Initial current at end 2"), - IP("ic", TRA_IC, IF_REALVEC,"Initial condition vector:v1,i1,v2,i2"), - OP("rel", TRA_RELTOL, IF_REAL , "Rel. rate of change of deriv. for bkpt"), - OP("abs", TRA_ABSTOL, IF_REAL , "Abs. rate of change of deriv. for bkpt"), - OPU( "pos_node1",TRA_POS_NODE1,IF_INTEGER,"Positive node of end 1 of t. line"), - OPU( "neg_node1",TRA_NEG_NODE1,IF_INTEGER,"Negative node of end 1 of t. line"), - OPU( "pos_node2",TRA_POS_NODE2,IF_INTEGER,"Positive node of end 2 of t. line"), - OPU( "neg_node2",TRA_NEG_NODE2,IF_INTEGER,"Negative node of end 2 of t. line"), - OPU( "delays",TRA_DELAY, IF_REALVEC, "Delayed values of excitation") -}; - -char *TRAnames[] = { - "P1+", - "P1-", - "P2+", - "P2-" -}; - -int TRAnSize = NUMELEMS(TRAnames); -int TRApTSize = NUMELEMS(TRApTable); -int TRAmPTSize = 0; -int TRAiSize = sizeof(TRAinstance); -int TRAmSize = sizeof(TRAmodel); diff --git a/src/spicelib/devices/tra/traacct.c b/src/spicelib/devices/tra/traacct.c deleted file mode 100644 index 5198df4ac..000000000 --- a/src/spicelib/devices/tra/traacct.c +++ /dev/null @@ -1,129 +0,0 @@ -/********** -Copyright 1990 Regents of the University of California. All rights reserved. -Author: 1985 Thomas L. Quarles -**********/ -/* - */ - -#include "ngspice/ngspice.h" -#include "ngspice/cktdefs.h" -#include "tradefs.h" -#include "ngspice/sperror.h" -#include "ngspice/suffix.h" - - -int -TRAaccept(CKTcircuit *ckt, GENmodel *inModel) -{ - TRAmodel *model = (TRAmodel *)inModel; - TRAinstance *here; - int i=0,j; - double v1,v2,v3,v4; - double v5,v6,d1,d2,d3,d4; - double *from,*to; - int error; - - - /* loop through all the transmission line models */ - for( ; model != NULL; model = TRAnextModel(model)) { - - /* loop through all the instances of the model */ - for (here = TRAinstances(model); here != NULL ; - here=TRAnextInstance(here)) { - - if( (ckt->CKTtime - here->TRAtd) > *(here->TRAdelays+6)) { - /* shift! */ - for(i=2;iTRAsizeDelay && - (ckt->CKTtime - here->TRAtd > *(here->TRAdelays+3*i));i++) - { /* loop does it all */ ; } - i -= 2; - for(j=i;j<=here->TRAsizeDelay;j++) { - from = here->TRAdelays + 3*j; - to = here->TRAdelays + 3*(j-i); - *(to) = *(from); - *(to+1) = *(from+1); - *(to+2) = *(from+2); - } - here->TRAsizeDelay -= i; - } - if(ckt->CKTtime - *(here->TRAdelays+3*here->TRAsizeDelay) > - ckt->CKTminBreak) { - if(here->TRAallocDelay <= here->TRAsizeDelay) { - /* need to grab some more space */ - here->TRAallocDelay += 5; - here->TRAdelays = TREALLOC(double, here->TRAdelays, (here->TRAallocDelay + 1) * 3); - } - here->TRAsizeDelay ++; - to = (here->TRAdelays +3*here->TRAsizeDelay); - *to = ckt->CKTtime; - to = (here->TRAdelays+1+3*here->TRAsizeDelay); - *to = ( *(ckt->CKTrhsOld + here->TRAposNode2) - -*(ckt->CKTrhsOld + here->TRAnegNode2)) - + *(ckt->CKTrhsOld + here->TRAbrEq2)* - here->TRAimped; - *(here->TRAdelays+2+3*here->TRAsizeDelay) = - ( *(ckt->CKTrhsOld + here->TRAposNode1) - -*(ckt->CKTrhsOld + here->TRAnegNode1)) - + *(ckt->CKTrhsOld + here->TRAbrEq1)* - here->TRAimped; -#ifdef NOTDEF - v1 = *(here->TRAdelays+1+3*here->TRAsizeDelay); - v2 = *(here->TRAdelays+1+3*(here->TRAsizeDelay-1)); - v3 = *(here->TRAdelays+2+3*here->TRAsizeDelay); - v4 = *(here->TRAdelays+2+3*(here->TRAsizeDelay-1)); - if( (fabs(v1-v2) >= 50*ckt->CKTreltol* - MAX(fabs(v1),fabs(v2))+50*ckt->CKTvoltTol) || - (fabs(v3-v4) >= 50*ckt->CKTreltol* - MAX(fabs(v3),fabs(v4))+50*ckt->CKTvoltTol) ) { - /* changing - need to schedule after delay */ - /*printf("%s: at %g set for %g and %g\n",here->TRAname, - ckt->CKTtime, - ckt->CKTtime+here->TRAtd, - *(here->TRAdelays+3*here->TRAsizeDelay-3)+ - here->TRAtd);*/ - error = CKTsetBreak(ckt,ckt->CKTtime+here->TRAtd); - if(error) return(error); - /* also set for break after PREVIOUS point */ - error = CKTsetBreak(ckt, - *(here->TRAdelays+3*here->TRAsizeDelay -3) + - here->TRAtd); - CKTbreakDump(ckt); - if(error) return(error); - } -#else - v1 = *(here->TRAdelays+1+3*here->TRAsizeDelay); - v2 = *(here->TRAdelays+1+3*(here->TRAsizeDelay-1)); - v3 = *(here->TRAdelays+1+3*(here->TRAsizeDelay-2)); - v4 = *(here->TRAdelays+2+3*here->TRAsizeDelay); - v5 = *(here->TRAdelays+2+3*(here->TRAsizeDelay-1)); - v6 = *(here->TRAdelays+2+3*(here->TRAsizeDelay-2)); - d1 = (v1-v2)/ckt->CKTdeltaOld[0]; - d2 = (v2-v3)/ckt->CKTdeltaOld[1]; - d3 = (v4-v5)/ckt->CKTdeltaOld[0]; - d4 = (v5-v6)/ckt->CKTdeltaOld[1]; - /*printf("%s: at %g derivs are %g, %g and %g, %g\n", - here->TRAname,ckt->CKTtime,d1,d2,d3,d4);*/ - if( (fabs(d1-d2) >= here->TRAreltol*MAX(fabs(d1),fabs(d2))+ - here->TRAabstol) || - (fabs(d3-d4) >= here->TRAreltol*MAX(fabs(d3),fabs(d4))+ - here->TRAabstol) ) { - /* derivitive changing - need to schedule after delay */ - /*printf("%s: at %g set for %g\n",here->TRAname, - ckt->CKTtime, - *(here->TRAdelays+3*here->TRAsizeDelay-3)+here->TRAtd - );*/ - /*printf("%g, %g, %g -> %g, %g \n",v1,v2,v3,d1,d2);*/ - /*printf("%g, %g, %g -> %g, %g \n",v4,v5,v6,d3,d4);*/ - /* also set for break after PREVIOUS point */ - /*printf("setting break\n");*/ - error = CKTsetBreak(ckt, - *(here->TRAdelays+3*here->TRAsizeDelay -3) + - here->TRAtd); - if(error) return(error); - } -#endif /*NOTDEF*/ - } - } - } - return(OK); -} diff --git a/src/spicelib/devices/tra/traacld.c b/src/spicelib/devices/tra/traacld.c deleted file mode 100644 index 094b277f0..000000000 --- a/src/spicelib/devices/tra/traacld.c +++ /dev/null @@ -1,65 +0,0 @@ -/********** -Copyright 1990 Regents of the University of California. All rights reserved. -Author: 1985 Thomas L. Quarles -**********/ - -#include "ngspice/ngspice.h" -#include "ngspice/cktdefs.h" -#include "tradefs.h" -#include "ngspice/sperror.h" -#include "ngspice/suffix.h" - -int -TRAacLoad(GENmodel *inModel, CKTcircuit *ckt) - /* actually load the current values into the - * sparse matrix previously provided - */ -{ - TRAmodel *model = (TRAmodel *)inModel; - TRAinstance *here; - double real; - double imag; - - /* loop through all the transmission line models */ - for( ; model != NULL; model = TRAnextModel(model)) { - - /* loop through all the instances of the model */ - for (here = TRAinstances(model); here != NULL ; - here=TRAnextInstance(here)) { - - real = cos(-ckt->CKTomega*here->TRAtd); - imag = sin(-ckt->CKTomega*here->TRAtd); - - *(here->TRApos1Pos1Ptr) += here->TRAconduct; - *(here->TRApos1Int1Ptr) -= here->TRAconduct; - *(here->TRAneg1Ibr1Ptr) -= 1; - *(here->TRApos2Pos2Ptr) += here->TRAconduct; - *(here->TRAneg2Ibr2Ptr) -= 1; - *(here->TRAint1Pos1Ptr) -= here->TRAconduct; - *(here->TRAint1Int1Ptr) += here->TRAconduct; - *(here->TRAint1Ibr1Ptr) += 1; - *(here->TRAint2Int2Ptr) += here->TRAconduct; - *(here->TRAint2Ibr2Ptr) += 1; - *(here->TRAibr1Neg1Ptr) -= 1; - *(here->TRAibr1Pos2Ptr+0) -= real; - *(here->TRAibr1Pos2Ptr+1) -= imag; - *(here->TRAibr1Neg2Ptr+0) += real; - *(here->TRAibr1Neg2Ptr+1) += imag; - *(here->TRAibr1Int1Ptr) += 1; - *(here->TRAibr1Ibr2Ptr+0) -= real * here->TRAimped; - *(here->TRAibr1Ibr2Ptr+1) -= imag * here->TRAimped; - *(here->TRAibr2Pos1Ptr+0) -= real; - *(here->TRAibr2Pos1Ptr+1) -= imag; - *(here->TRAibr2Neg1Ptr+0) += real; - *(here->TRAibr2Neg1Ptr+1) += imag; - *(here->TRAibr2Neg2Ptr) -= 1; - *(here->TRAibr2Int2Ptr) += 1; - *(here->TRAibr2Ibr1Ptr+0) -= real * here->TRAimped; - *(here->TRAibr2Ibr1Ptr+1) -= imag * here->TRAimped; - *(here->TRApos2Int2Ptr) -= here->TRAconduct; - *(here->TRAint2Pos2Ptr) -= here->TRAconduct; - - } - } - return(OK); -} diff --git a/src/spicelib/devices/tra/traask.c b/src/spicelib/devices/tra/traask.c deleted file mode 100644 index a8e0042b2..000000000 --- a/src/spicelib/devices/tra/traask.c +++ /dev/null @@ -1,100 +0,0 @@ -/********** -Copyright 1990 Regents of the University of California. All rights reserved. -Author: 1987 Thomas L. Quarles -**********/ -/* - */ - -/* - * This routine gives access to the internal device parameter - * of TRAnsmission lines - */ - -#include "ngspice/ngspice.h" -#include "ngspice/cktdefs.h" -#include "ngspice/devdefs.h" -#include "ngspice/ifsim.h" -#include "tradefs.h" -#include "ngspice/sperror.h" -#include "ngspice/suffix.h" - - -/* ARGSUSED */ -int -TRAask(CKTcircuit *ckt, GENinstance *inst, int which, IFvalue *value, IFvalue *select) -{ - TRAinstance *here = (TRAinstance *)inst; - int temp; - double *v, *w; - - NG_IGNORE(select); - NG_IGNORE(ckt); - - switch(which) { - case TRA_POS_NODE1: - value->iValue = here->TRAposNode1; - return (OK); - case TRA_NEG_NODE1: - value->iValue = here->TRAnegNode1; - return (OK); - case TRA_POS_NODE2: - value->iValue = here->TRAposNode2; - return (OK); - case TRA_NEG_NODE2: - value->iValue = here->TRAnegNode2; - return (OK); - case TRA_INT_NODE1: - value->iValue = here->TRAintNode1; - return (OK); - case TRA_INT_NODE2: - value->iValue = here->TRAintNode2; - return (OK); - case TRA_Z0: - value->rValue = here->TRAimped; - return (OK); - case TRA_TD: - value->rValue = here->TRAtd; - return (OK); - case TRA_NL: - value->rValue = here->TRAnl; - return (OK); - case TRA_FREQ: - value->rValue = here->TRAf; - return (OK); - case TRA_V1: - value->rValue = here->TRAinitVolt1; - return (OK); - case TRA_I1: - value->rValue = here->TRAinitCur1; - return (OK); - case TRA_V2: - value->rValue = here->TRAinitVolt2; - return (OK); - case TRA_I2: - value->rValue = here->TRAinitCur2; - return (OK); - case TRA_RELTOL: - value->rValue = here->TRAreltol; - return (OK); - case TRA_ABSTOL: - value->rValue = here->TRAabstol; - return (OK); - case TRA_BR_EQ1: - value->rValue = here->TRAbrEq1; - return (OK); - case TRA_BR_EQ2: - value->rValue = here->TRAbrEq2; - return (OK); - case TRA_DELAY: - value->v.vec.rVec = TMALLOC(double, here->TRAsizeDelay); - value->v.numValue = temp = here->TRAsizeDelay; - v = value->v.vec.rVec; - w = here->TRAdelays; - while (temp--) - *v++ = *w++; - return (OK); - default: - return (E_BADPARM); - } - /* NOTREACHED */ -} diff --git a/src/spicelib/devices/tra/tradefs.h b/src/spicelib/devices/tra/tradefs.h deleted file mode 100644 index 3c6617947..000000000 --- a/src/spicelib/devices/tra/tradefs.h +++ /dev/null @@ -1,137 +0,0 @@ -/********** -Copyright 1990 Regents of the University of California. All rights reserved. -Author: 1985 Thomas L. Quarles -**********/ - -#ifndef TRA -#define TRA - - -#include "ngspice/ifsim.h" -#include "ngspice/cktdefs.h" -#include "ngspice/gendefs.h" -#include "ngspice/complex.h" - - /* definitions used to describe transmission liness */ - - -/* information used to describe a single instance */ - -typedef struct sTRAinstance { - - struct GENinstance gen; - -#define TRAmodPtr(inst) ((struct sTRAmodel *)((inst)->gen.GENmodPtr)) -#define TRAnextInstance(inst) ((struct sTRAinstance *)((inst)->gen.GENnextInstance)) -#define TRAname gen.GENname -#define TRAstate gen.GENstate - - const int TRAposNode1; /* number of positive node of end 1 of t. line */ - const int TRAnegNode1; /* number of negative node of end 1 of t. line */ - const int TRAposNode2; /* number of positive node of end 2 of t. line */ - const int TRAnegNode2; /* number of negative node of end 2 of t. line */ - int TRAintNode1; /* number of internal node of end 1 of t. line */ - int TRAintNode2; /* number of internal node of end 2 of t. line */ - - double TRAimped; /* impedance - input */ - double TRAconduct; /* conductance - calculated */ - double TRAtd; /* propagation delay */ - double TRAnl; /* normalized length */ - double TRAf; /* frequency at which nl is measured */ - double TRAinput1; /* accumulated excitation for port 1 */ - double TRAinput2; /* accumulated excitation for port 2 */ - double TRAinitVolt1; /* initial condition: voltage on port 1 */ - double TRAinitCur1; /* initial condition: current at port 1 */ - double TRAinitVolt2; /* initial condition: voltage on port 2 */ - double TRAinitCur2; /* initial condition: current at port 2 */ - double TRAreltol; /* relative deriv. tol. for breakpoint setting */ - double TRAabstol; /* absolute deriv. tol. for breakpoint setting */ - double *TRAdelays; /* delayed values of excitation */ - int TRAsizeDelay; /* size of active delayed table */ - int TRAallocDelay; /* allocated size of delayed table */ - int TRAbrEq1; /* number of branch equation for end 1 of t. line */ - int TRAbrEq2; /* number of branch equation for end 2 of t. line */ - double *TRAibr1Ibr2Ptr; /* pointer to sparse matrix */ - double *TRAibr1Int1Ptr; /* pointer to sparse matrix */ - double *TRAibr1Neg1Ptr; /* pointer to sparse matrix */ - double *TRAibr1Neg2Ptr; /* pointer to sparse matrix */ - double *TRAibr1Pos2Ptr; /* pointer to sparse matrix */ - double *TRAibr2Ibr1Ptr; /* pointer to sparse matrix */ - double *TRAibr2Int2Ptr; /* pointer to sparse matrix */ - double *TRAibr2Neg1Ptr; /* pointer to sparse matrix */ - double *TRAibr2Neg2Ptr; /* pointer to sparse matrix */ - double *TRAibr2Pos1Ptr; /* pointer to sparse matrix */ - double *TRAint1Ibr1Ptr; /* pointer to sparse matrix */ - double *TRAint1Int1Ptr; /* pointer to sparse matrix */ - double *TRAint1Pos1Ptr; /* pointer to sparse matrix */ - double *TRAint2Ibr2Ptr; /* pointer to sparse matrix */ - double *TRAint2Int2Ptr; /* pointer to sparse matrix */ - double *TRAint2Pos2Ptr; /* pointer to sparse matrix */ - double *TRAneg1Ibr1Ptr; /* pointer to sparse matrix */ - double *TRAneg2Ibr2Ptr; /* pointer to sparse matrix */ - double *TRApos1Int1Ptr; /* pointer to sparse matrix */ - double *TRApos1Pos1Ptr; /* pointer to sparse matrix */ - double *TRApos2Int2Ptr; /* pointer to sparse matrix */ - double *TRApos2Pos2Ptr; /* pointer to sparse matrix */ - unsigned TRAimpedGiven : 1; /* flag to indicate impedence was specified */ - unsigned TRAtdGiven : 1; /* flag to indicate delay was specified */ - unsigned TRAnlGiven : 1; /* flag to indicate norm length was specified */ - unsigned TRAfGiven : 1; /* flag to indicate freq was specified */ - unsigned TRAicV1Given : 1; /* flag to ind. init. voltage at port 1 given */ - unsigned TRAicC1Given : 1; /* flag to ind. init. current at port 1 given */ - unsigned TRAicV2Given : 1; /* flag to ind. init. voltage at port 2 given */ - unsigned TRAicC2Given : 1; /* flag to ind. init. current at port 2 given */ - unsigned TRAreltolGiven:1; /* flag to ind. relative deriv. tol. given */ - unsigned TRAabstolGiven:1; /* flag to ind. absolute deriv. tol. given */ -} TRAinstance ; - - -/* per model data */ - -typedef struct sTRAmodel { /* model structure for a transmission lines */ - - struct GENmodel gen; - -#define TRAmodType gen.GENmodType -#define TRAnextModel(inst) ((struct sTRAmodel *)((inst)->gen.GENnextModel)) -#define TRAinstances(inst) ((TRAinstance *)((inst)->gen.GENinstances)) -#define TRAmodName gen.GENmodName - -} TRAmodel; - -/* device parameters */ -enum { - TRA_Z0 = 1, - TRA_TD, - TRA_NL, - TRA_FREQ, - TRA_V1, - TRA_I1, - TRA_V2, - TRA_I2, - TRA_IC, - TRA_RELTOL, - TRA_ABSTOL, - TRA_POS_NODE1, - TRA_NEG_NODE1, - TRA_POS_NODE2, - TRA_NEG_NODE2, - TRA_INPUT1, - TRA_INPUT2, - TRA_DELAY, - TRA_BR_EQ1, - TRA_BR_EQ2, - TRA_INT_NODE1, - TRA_INT_NODE2, -}; - -/* model parameters */ - -/* device questions */ - -/* model questions */ - -#include "traext.h" - -#endif /*TRA*/ - diff --git a/src/spicelib/devices/tra/traext.h b/src/spicelib/devices/tra/traext.h deleted file mode 100644 index d79fafd2d..000000000 --- a/src/spicelib/devices/tra/traext.h +++ /dev/null @@ -1,15 +0,0 @@ -/********** -Copyright 1990 Regents of the University of California. All rights reserved. -Author: 1985 Thomas L. Quarles -**********/ - -extern int TRAacLoad(GENmodel*,CKTcircuit*); -extern int TRAaccept(CKTcircuit*,GENmodel*); -extern int TRAask(CKTcircuit*,GENinstance*,int,IFvalue*,IFvalue*); -extern int TRAload(GENmodel*,CKTcircuit*); -extern int TRAmAsk(CKTcircuit*,GENmodel*,int,IFvalue*); -extern int TRAparam(int,IFvalue*,GENinstance*,IFvalue*); -extern int TRAsetup(SMPmatrix*,GENmodel*,CKTcircuit*,int*); -extern int TRAunsetup(GENmodel*,CKTcircuit*); -extern int TRAtemp(GENmodel*,CKTcircuit*); -extern int TRAtrunc(GENmodel*,CKTcircuit*,double*); diff --git a/src/spicelib/devices/tra/trainit.c b/src/spicelib/devices/tra/trainit.c deleted file mode 100644 index d266e6750..000000000 --- a/src/spicelib/devices/tra/trainit.c +++ /dev/null @@ -1,76 +0,0 @@ -#include "ngspice/config.h" - -#include "ngspice/devdefs.h" - -#include "traitf.h" -#include "traext.h" -#include "trainit.h" - - -SPICEdev TRAinfo = { - .DEVpublic = { - .name = "Tranline", - .description = "Lossless transmission line", - .terms = &TRAnSize, - .numNames = &TRAnSize, - .termNames = TRAnames, - .numInstanceParms = &TRApTSize, - .instanceParms = TRApTable, - .numModelParms = NULL, - .modelParms = NULL, - .flags = 0, - -#ifdef XSPICE - .cm_func = NULL, - .num_conn = 0, - .conn = NULL, - .num_param = 0, - .param = NULL, - .num_inst_var = 0, - .inst_var = NULL, -#endif - }, - - .DEVparam = TRAparam, - .DEVmodParam = NULL, - .DEVload = TRAload, - .DEVsetup = TRAsetup, - .DEVunsetup = TRAunsetup, - .DEVpzSetup = TRAsetup, - .DEVtemperature = TRAtemp, - .DEVtrunc = TRAtrunc, - .DEVfindBranch = NULL, - .DEVacLoad = TRAacLoad, - .DEVaccept = TRAaccept, - .DEVdestroy = NULL, - .DEVmodDelete = NULL, - .DEVdelete = NULL, - .DEVsetic = NULL, - .DEVask = TRAask, - .DEVmodAsk = NULL, - .DEVpzLoad = NULL, - .DEVconvTest = NULL, - .DEVsenSetup = NULL, - .DEVsenLoad = NULL, - .DEVsenUpdate = NULL, - .DEVsenAcLoad = NULL, - .DEVsenPrint = NULL, - .DEVsenTrunc = NULL, - .DEVdisto = NULL, - .DEVnoise = NULL, - .DEVsoaCheck = NULL, - .DEVinstSize = &TRAiSize, - .DEVmodSize = &TRAmSize, - -#ifdef CIDER - .DEVdump = NULL, - .DEVacct = NULL, -#endif -}; - - -SPICEdev * -get_tra_info(void) -{ - return &TRAinfo; -} diff --git a/src/spicelib/devices/tra/trainit.h b/src/spicelib/devices/tra/trainit.h deleted file mode 100644 index bd29e1a87..000000000 --- a/src/spicelib/devices/tra/trainit.h +++ /dev/null @@ -1,11 +0,0 @@ -#ifndef _TRAINIT_H -#define _TRAINIT_H - -extern IFparm TRApTable[ ]; -extern char *TRAnames[ ]; -extern int TRApTSize; -extern int TRAnSize; -extern int TRAiSize; -extern int TRAmSize; - -#endif diff --git a/src/spicelib/devices/tra/traitf.h b/src/spicelib/devices/tra/traitf.h deleted file mode 100644 index 0ba2a2ef8..000000000 --- a/src/spicelib/devices/tra/traitf.h +++ /dev/null @@ -1,9 +0,0 @@ -/********** -Copyright 1990 Regents of the University of California. All rights reserved. -**********/ -#ifndef DEV_TRA -#define DEV_TRA - -SPICEdev *get_tra_info(void); - -#endif diff --git a/src/spicelib/devices/tra/traload.c b/src/spicelib/devices/tra/traload.c deleted file mode 100644 index fcda3f01d..000000000 --- a/src/spicelib/devices/tra/traload.c +++ /dev/null @@ -1,150 +0,0 @@ -/********** -Copyright 1990 Regents of the University of California. All rights reserved. -Author: 1985 Thomas L. Quarles -**********/ -/* - */ - -#include "ngspice/ngspice.h" -#include "ngspice/cktdefs.h" -#include "tradefs.h" -#include "ngspice/trandefs.h" -#include "ngspice/sperror.h" -#include "ngspice/suffix.h" - - -/*ARGSUSED*/ -int -TRAload(GENmodel *inModel, CKTcircuit *ckt) - /* actually load the current values into the - * sparse matrix previously provided - */ -{ - TRAmodel *model = (TRAmodel *)inModel; - TRAinstance *here; - double t1,t2,t3; - double f1,f2,f3; - int i; - - /* loop through all the transmission line models */ - for( ; model != NULL; model = TRAnextModel(model)) { - - /* loop through all the instances of the model */ - for (here = TRAinstances(model); here != NULL ; - here=TRAnextInstance(here)) { - - *(here->TRApos1Pos1Ptr) += here->TRAconduct; - *(here->TRApos1Int1Ptr) -= here->TRAconduct; - *(here->TRAneg1Ibr1Ptr) -= 1; - *(here->TRApos2Pos2Ptr) += here->TRAconduct; - *(here->TRAneg2Ibr2Ptr) -= 1; - *(here->TRAint1Pos1Ptr) -= here->TRAconduct; - *(here->TRAint1Int1Ptr) += here->TRAconduct; - *(here->TRAint1Ibr1Ptr) += 1; - *(here->TRAint2Int2Ptr) += here->TRAconduct; - *(here->TRAint2Ibr2Ptr) += 1; - *(here->TRAibr1Neg1Ptr) -= 1; - *(here->TRAibr1Int1Ptr) += 1; - *(here->TRAibr2Neg2Ptr) -= 1; - *(here->TRAibr2Int2Ptr) += 1; - *(here->TRApos2Int2Ptr) -= here->TRAconduct; - *(here->TRAint2Pos2Ptr) -= here->TRAconduct; - - if(ckt->CKTmode & MODEDC) { - *(here->TRAibr1Pos2Ptr) -= 1; - *(here->TRAibr1Neg2Ptr) += 1; - *(here->TRAibr1Ibr2Ptr) -= (1-ckt->CKTgmin)*here->TRAimped; - *(here->TRAibr2Pos1Ptr) -= 1; - *(here->TRAibr2Neg1Ptr) += 1; - *(here->TRAibr2Ibr1Ptr) -= (1-ckt->CKTgmin)*here->TRAimped; - } else { - if (ckt->CKTmode & MODEINITTRAN) { - if(ckt->CKTmode & MODEUIC) { - here->TRAinput1 = here->TRAinitVolt2 + here->TRAinitCur2 - * here->TRAimped; - here->TRAinput2 = here->TRAinitVolt1 + here->TRAinitCur1 - * here->TRAimped; - } else { - here->TRAinput1 = - ( *(ckt->CKTrhsOld+here->TRAposNode2) - - *(ckt->CKTrhsOld+here->TRAnegNode2) ) - + ( *(ckt->CKTrhsOld+here->TRAbrEq2) - *here->TRAimped); - here->TRAinput2 = - ( *(ckt->CKTrhsOld+here->TRAposNode1) - - *(ckt->CKTrhsOld+here->TRAnegNode1) ) - + ( *(ckt->CKTrhsOld+here->TRAbrEq1) - *here->TRAimped); - } - *(here->TRAdelays ) = -2*here->TRAtd; - *(here->TRAdelays+3) = -here->TRAtd; - *(here->TRAdelays+6) = 0; - *(here->TRAdelays+1) = *(here->TRAdelays +4) = - *(here->TRAdelays+7) = here->TRAinput1; - *(here->TRAdelays+2) = *(here->TRAdelays +5) = - *(here->TRAdelays+8) = here->TRAinput2; - here->TRAsizeDelay = 2; - } else { - if(ckt->CKTmode & MODEINITPRED) { - for(i=2;(iTRAsizeDelay) && - (*(here->TRAdelays +3*i) <= - (ckt->CKTtime-here->TRAtd));i++) {;/*loop does it*/} - t1 = *(here->TRAdelays + (3*(i-2))); - t2 = *(here->TRAdelays + (3*(i-1))); - t3 = *(here->TRAdelays + (3*(i ))); - if( (t2-t1)==0 || (t3-t2) == 0) continue; - f1 = (ckt->CKTtime - here->TRAtd - t2) * - (ckt->CKTtime - here->TRAtd - t3) ; - f2 = (ckt->CKTtime - here->TRAtd - t1) * - (ckt->CKTtime - here->TRAtd - t3) ; - f3 = (ckt->CKTtime - here->TRAtd - t1) * - (ckt->CKTtime - here->TRAtd - t2) ; - if((t2-t1)==0) { /* should never happen, but don't want - * to divide by zero, EVER... */ - f1=0; - f2=0; - } else { - f1 /= (t1-t2); - f2 /= (t2-t1); - } - if((t3-t2)==0) { /* should never happen, but don't want - * to divide by zero, EVER... */ - f2=0; - f3=0; - } else { - f2 /= (t2-t3); - f3 /= (t2-t3); - } - if((t3-t1)==0) { /* should never happen, but don't want - * to divide by zero, EVER... */ - f1=0; - f2=0; - } else { - f1 /= (t1-t3); - f3 /= (t1-t3); - } - /*printf("at time %g, using %g, %g, %g\n",ckt->CKTtime, - t1,t2,t3); - printf("values %g, %g, %g \n", - *(here->TRAdelays + (3*(i-2))+1), - *(here->TRAdelays + (3*(i-1))+1), - *(here->TRAdelays + (3*(i ))+1) ); - printf("and %g, %g, %g \n", - *(here->TRAdelays + (3*(i-2))+2), - *(here->TRAdelays + (3*(i-1))+2), - *(here->TRAdelays + (3*(i ))+2) );*/ - here->TRAinput1 = f1 * *(here->TRAdelays + (3*(i-2))+1) - + f2 * *(here->TRAdelays + (3*(i-1))+1) - + f3 * *(here->TRAdelays + (3*(i ))+1); - here->TRAinput2 = f1 * *(here->TRAdelays + (3*(i-2))+2) - + f2 * *(here->TRAdelays + (3*(i-1))+2) - + f3 * *(here->TRAdelays + (3*(i ))+2); - } - } - *(ckt->CKTrhs + here->TRAbrEq1) += here->TRAinput1; - *(ckt->CKTrhs + here->TRAbrEq2) += here->TRAinput2; - } - } - } - return(OK); -} diff --git a/src/spicelib/devices/tra/traparam.c b/src/spicelib/devices/tra/traparam.c deleted file mode 100644 index 7f302feb8..000000000 --- a/src/spicelib/devices/tra/traparam.c +++ /dev/null @@ -1,88 +0,0 @@ -/********** -Copyright 1990 Regents of the University of California. All rights reserved. -Author: 1985 Thomas L. Quarles -**********/ -/* - */ - -#include "ngspice/ngspice.h" -#include "tradefs.h" -#include "ngspice/ifsim.h" -#include "ngspice/sperror.h" -#include "ngspice/suffix.h" - - -/* ARGSUSED */ -int -TRAparam(int param, IFvalue *value, GENinstance *inst, IFvalue *select) -{ - TRAinstance *here = (TRAinstance *)inst; - - NG_IGNORE(select); - - switch (param) { - case TRA_RELTOL: - here->TRAreltol = value->rValue; - here->TRAreltolGiven = TRUE; - break; - case TRA_ABSTOL: - here->TRAabstol = value->rValue; - here->TRAabstolGiven = TRUE; - break; - case TRA_Z0: - here->TRAimped = value->rValue; - here->TRAimpedGiven = TRUE; - break; - case TRA_TD: - here->TRAtd = value->rValue; - here->TRAtdGiven = TRUE; - break; - case TRA_NL: - here->TRAnl= value->rValue; - here->TRAnlGiven = TRUE; - break; - case TRA_FREQ: - here->TRAf= value->rValue; - here->TRAfGiven = TRUE; - break; - case TRA_V1: - here->TRAinitVolt1 = value->rValue; - here->TRAicV1Given = TRUE; - break; - case TRA_I1: - here->TRAinitCur1 = value->rValue; - here->TRAicC1Given = TRUE; - break; - case TRA_V2: - here->TRAinitVolt2 = value->rValue; - here->TRAicV2Given = TRUE; - break; - case TRA_I2: - here->TRAinitCur2 = value->rValue; - here->TRAicC2Given = TRUE; - break; - case TRA_IC: - /* FALLTHROUGH ded to suppress GCC warning due to - * -Wimplicit-fallthrough flag */ - switch (value->v.numValue) { - case 4: - here->TRAinitCur2 = *(value->v.vec.rVec+3); - /* FALLTHROUGH */ - case 3: - here->TRAinitVolt2 = *(value->v.vec.rVec+2); - /* FALLTHROUGH */ - case 2: - here->TRAinitCur1 = *(value->v.vec.rVec+1); - /* FALLTHROUGH */ - case 1: - here->TRAinitVolt1 = *(value->v.vec.rVec); - break; - default: - return(E_BADPARM); - } - break; - default: - return(E_BADPARM); - } - return(OK); -} diff --git a/src/spicelib/devices/tra/trasetup.c b/src/spicelib/devices/tra/trasetup.c deleted file mode 100644 index 8ad68e8ca..000000000 --- a/src/spicelib/devices/tra/trasetup.c +++ /dev/null @@ -1,147 +0,0 @@ -/********** -Copyright 1990 Regents of the University of California. All rights reserved. -Author: 1985 Thomas L. Quarles -**********/ -/* - */ - -#include "ngspice/ngspice.h" -#include "ngspice/smpdefs.h" -#include "ngspice/cktdefs.h" -#include "tradefs.h" -#include "ngspice/sperror.h" -#include "ngspice/suffix.h" - - -/* ARGSUSED */ -int -TRAsetup(SMPmatrix *matrix, GENmodel *inModel, CKTcircuit *ckt, int *state) - /* load the transmission line structure with those pointers needed later - * for fast matrix loading - */ -{ - TRAmodel *model = (TRAmodel *)inModel; - TRAinstance *here; - int error; - CKTnode *tmp; - - NG_IGNORE(state); - - /* loop through all the transmission line models */ - for( ; model != NULL; model = TRAnextModel(model)) { - - /* loop through all the instances of the model */ - for (here = TRAinstances(model); here != NULL ; - here=TRAnextInstance(here)) { - - if(here->TRAbrEq1==0) { - error = CKTmkVolt(ckt,&tmp,here->TRAname,"i1"); - if(error) return(error); - here->TRAbrEq1 = tmp->number; - } - - if(here->TRAbrEq2==0) { - error = CKTmkVolt(ckt,&tmp,here->TRAname,"i2"); - if(error) return(error); - here->TRAbrEq2 = tmp->number; - } - - if(here->TRAintNode1==0) { - error = CKTmkVolt(ckt,&tmp,here->TRAname,"int1"); - if(error) return(error); - here->TRAintNode1 = tmp->number; - } - - if(here->TRAintNode2==0) { - error = CKTmkVolt(ckt,&tmp,here->TRAname,"int2"); - if(error) return(error); - here->TRAintNode2 = tmp->number; - } - - /* allocate the delay table */ - here->TRAdelays = TMALLOC(double, 15); - here->TRAallocDelay = 4; - -/* macro to make elements with built in test for out of memory */ -#define TSTALLOC(ptr,first,second) \ -do { if((here->ptr = SMPmakeElt(matrix, here->first, here->second)) == NULL){\ - return(E_NOMEM);\ -} } while(0) - - TSTALLOC(TRAibr1Ibr2Ptr, TRAbrEq1, TRAbrEq2); - TSTALLOC(TRAibr1Int1Ptr, TRAbrEq1, TRAintNode1); - TSTALLOC(TRAibr1Neg1Ptr, TRAbrEq1, TRAnegNode1); - TSTALLOC(TRAibr1Neg2Ptr, TRAbrEq1, TRAnegNode2); - TSTALLOC(TRAibr1Pos2Ptr, TRAbrEq1, TRAposNode2); - TSTALLOC(TRAibr2Ibr1Ptr, TRAbrEq2, TRAbrEq1); - TSTALLOC(TRAibr2Int2Ptr, TRAbrEq2, TRAintNode2); - TSTALLOC(TRAibr2Neg1Ptr, TRAbrEq2, TRAnegNode1); - TSTALLOC(TRAibr2Neg2Ptr, TRAbrEq2, TRAnegNode2); - TSTALLOC(TRAibr2Pos1Ptr, TRAbrEq2, TRAposNode1); - TSTALLOC(TRAint1Ibr1Ptr, TRAintNode1, TRAbrEq1); - TSTALLOC(TRAint1Int1Ptr, TRAintNode1, TRAintNode1); - TSTALLOC(TRAint1Pos1Ptr, TRAintNode1, TRAposNode1); - TSTALLOC(TRAint2Ibr2Ptr, TRAintNode2, TRAbrEq2); - TSTALLOC(TRAint2Int2Ptr, TRAintNode2, TRAintNode2); - TSTALLOC(TRAint2Pos2Ptr, TRAintNode2, TRAposNode2); - TSTALLOC(TRAneg1Ibr1Ptr, TRAnegNode1, TRAbrEq1); - TSTALLOC(TRAneg2Ibr2Ptr, TRAnegNode2, TRAbrEq2); - TSTALLOC(TRApos1Int1Ptr, TRAposNode1, TRAintNode1); - TSTALLOC(TRApos1Pos1Ptr, TRAposNode1, TRAposNode1); - TSTALLOC(TRApos2Int2Ptr, TRAposNode2, TRAintNode2); - TSTALLOC(TRApos2Pos2Ptr, TRAposNode2, TRAposNode2); - - if(!here->TRAnlGiven) { - here->TRAnl = .25; - } - if(!here->TRAfGiven) { - here->TRAf = 1e9; - } - if(!here->TRAreltolGiven) { - here->TRAreltol = 1; - } - if(!here->TRAabstolGiven) { - here->TRAabstol = 1; - } - if(!here->TRAimpedGiven) { - SPfrontEnd->IFerrorf (ERR_FATAL, - "%s: transmission line z0 must be given", - here->TRAname); - return(E_BADPARM); - } - } - } - return(OK); -} - -int -TRAunsetup(GENmodel *inModel, CKTcircuit *ckt) -{ - TRAmodel *model; - TRAinstance *here; - - for (model = (TRAmodel *)inModel; model != NULL; - model = TRAnextModel(model)) - { - for (here = TRAinstances(model); here != NULL; - here=TRAnextInstance(here)) - { - if (here->TRAintNode2 > 0) - CKTdltNNum(ckt, here->TRAintNode2); - here->TRAintNode2= 0; - - if (here->TRAintNode1 > 0) - CKTdltNNum(ckt, here->TRAintNode1); - here->TRAintNode1= 0; - - if (here->TRAbrEq2 > 0) - CKTdltNNum(ckt, here->TRAbrEq2); - here->TRAbrEq2= 0; - - if (here->TRAbrEq1 > 0) - CKTdltNNum(ckt, here->TRAbrEq1); - here->TRAbrEq1= 0; - } - } - return OK; -} diff --git a/src/spicelib/devices/tra/tratemp.c b/src/spicelib/devices/tra/tratemp.c deleted file mode 100644 index 5f202cfdc..000000000 --- a/src/spicelib/devices/tra/tratemp.c +++ /dev/null @@ -1,42 +0,0 @@ -/********** -Copyright 1990 Regents of the University of California. All rights reserved. -Author: 1985 Thomas L. Quarles -**********/ -/* - */ - -#include "ngspice/ngspice.h" -#include "ngspice/smpdefs.h" -#include "ngspice/cktdefs.h" -#include "tradefs.h" -#include "ngspice/sperror.h" -#include "ngspice/suffix.h" - - -/* ARGSUSED */ -int -TRAtemp(GENmodel *inModel, CKTcircuit *ckt) - /* - * pre-process parameters for later use - */ -{ - TRAmodel *model = (TRAmodel *)inModel; - TRAinstance *here; - - NG_IGNORE(ckt); - - /* loop through all the transmission line models */ - for( ; model != NULL; model = TRAnextModel(model)) { - - /* loop through all the instances of the model */ - for (here = TRAinstances(model); here != NULL ; - here=TRAnextInstance(here)) { - - if(!here->TRAtdGiven) { - here->TRAtd = here->TRAnl/here->TRAf; - } - here->TRAconduct = 1/here->TRAimped; - } - } - return(OK); -} diff --git a/src/spicelib/devices/tra/tratrunc.c b/src/spicelib/devices/tra/tratrunc.c deleted file mode 100644 index f750c220b..000000000 --- a/src/spicelib/devices/tra/tratrunc.c +++ /dev/null @@ -1,77 +0,0 @@ -/********** -Copyright 1990 Regents of the University of California. All rights reserved. -Author: 1985 Thomas L. Quarles -**********/ -/* - */ - -#include "ngspice/ngspice.h" -#include "ngspice/cktdefs.h" -#include "tradefs.h" -#include "ngspice/sperror.h" -#include "ngspice/suffix.h" - - -int -TRAtrunc(GENmodel *inModel, CKTcircuit *ckt, double *timeStep) - -{ - TRAmodel *model = (TRAmodel *)inModel; - TRAinstance *here; - double v1,v2,v3,v4; - double v5,v6,d1,d2,d3,d4; - double tmp; - - /* loop through all the transmission line models */ - for( ; model != NULL; model = TRAnextModel(model)) { - - /* loop through all the instances of the model */ - for (here = TRAinstances(model); here != NULL ; - here=TRAnextInstance(here)) { - - v1 = ( *(ckt->CKTrhsOld + here->TRAposNode2) - - *(ckt->CKTrhsOld + here->TRAnegNode2)) - + *(ckt->CKTrhsOld + here->TRAbrEq2) * - here->TRAimped; - v2 = *(here->TRAdelays+1+3*(here->TRAsizeDelay)); - v3 = *(here->TRAdelays+1+3*(here->TRAsizeDelay-1)); - v4 = ( *(ckt->CKTrhsOld + here->TRAposNode1) - - *(ckt->CKTrhsOld + here->TRAnegNode1)) - + *(ckt->CKTrhsOld + here->TRAbrEq1) * - here->TRAimped; - v5 = *(here->TRAdelays+2+3*(here->TRAsizeDelay)); - v6 = *(here->TRAdelays+2+3*(here->TRAsizeDelay-1)); - d1 = (v1-v2)/ckt->CKTdeltaOld[1]; - d2 = (v2-v3)/ckt->CKTdeltaOld[2]; - d3 = (v4-v5)/ckt->CKTdeltaOld[1]; - d4 = (v5-v6)/ckt->CKTdeltaOld[2]; - /*printf("%s: at %g derivs are %g, %g and %g, %g\n", - here->TRAname,ckt->CKTtime,d1,d2,d3,d4);*/ - if( (fabs(d1-d2) >= here->TRAreltol*MAX(fabs(d1),fabs(d2))+ - here->TRAabstol) || - (fabs(d3-d4) >= here->TRAreltol*MAX(fabs(d3),fabs(d4))+ - here->TRAabstol) ) { - /* derivitive changing - need to schedule after delay */ - /*printf("%s: at %g set for %g\n",here->TRAname, - ckt->CKTtime, - *(here->TRAdelays+3*here->TRAsizeDelay-3)+here->TRAtd - );*/ - /*printf("%g, %g, %g -> %g, %g \n",v1,v2,v3,d1,d2);*/ - /*printf("%g, %g, %g -> %g, %g \n",v4,v5,v6,d3,d4);*/ - /* also set for break after PREVIOUS point */ - /*printf("setting break\n");*/ - /* will need to set a breakpoint at - *(here->TRAdelays+3*(here->TRAsizeDelay)) + here->TRAtd - so we need to make sure we don't step past it - */ - /* the previous timepoint plus the delay */ - tmp = *(here->TRAdelays+3*here->TRAsizeDelay) + here->TRAtd; - /* minus current time */ - tmp -= ckt->CKTtime; - *timeStep = MIN(*timeStep,tmp); - } - } - } - return(OK); -} - diff --git a/src/spicelib/devices/txl/Makefile.am b/src/spicelib/devices/txl/Makefile.am deleted file mode 100644 index 5761503e3..000000000 --- a/src/spicelib/devices/txl/Makefile.am +++ /dev/null @@ -1,24 +0,0 @@ -## Process this file with automake to produce Makefile.in - -noinst_LTLIBRARIES = libtxl.la - -libtxl_la_SOURCES = \ - txl.c \ - txlacct.c \ - txlask.c \ - txldefs.h \ - txlext.h \ - txlfbr.c \ - txlinit.h \ - txlitf.h \ - txlload.c \ - txlparam.c \ - txlmask.c \ - txlmpar.c \ - txlsetup.c \ - txlinit.c - -AM_CPPFLAGS = @AM_CPPFLAGS@ -I$(top_srcdir)/src/include -AM_CFLAGS = $(STATIC) - -MAINTAINERCLEANFILES = Makefile.in diff --git a/src/spicelib/devices/txl/txl.c b/src/spicelib/devices/txl/txl.c deleted file mode 100644 index 9da8f15e0..000000000 --- a/src/spicelib/devices/txl/txl.c +++ /dev/null @@ -1,37 +0,0 @@ -/********** -Copyright 1992 Regents of the University of California. All rights -reserved. -Author: 1992 Charles Hough -**********/ - -#include "ngspice/ngspice.h" -#include "txldefs.h" -#include "ngspice/devdefs.h" -#include "ngspice/ifsim.h" -#include "ngspice/suffix.h" - -IFparm TXLpTable[] = { - IP("pos_node", TXL_IN_NODE, IF_INTEGER,"Positive node of txl"), - IP("neg_node", TXL_OUT_NODE, IF_INTEGER,"Negative node of txl"), - IOP("length", TXL_LENGTH, IF_REAL,"length of line"), -}; - -IFparm TXLmPTable[] = { /* model parameters */ - IOP( "r", TXL_R, IF_REAL,"resistance per length"), - IOP( "l", TXL_L, IF_REAL,"inductance per length"), - IOP( "c", TXL_C, IF_REAL,"capacitance per length"), - IOP( "g", TXL_G, IF_REAL,"conductance per length"), - IOP( "length", TXL_length, IF_REAL,"length"), - IP( "txl", TXL_MOD_R, IF_FLAG,"Device is a txl model"), -}; - -char *TXLnames[] = { - "Y+", - "Y-" -}; - -int TXLnSize = NUMELEMS(TXLnames); -int TXLiSize = sizeof(TXLinstance); -int TXLmSize = sizeof(TXLmodel); -int TXLmPTSize = NUMELEMS(TXLmPTable); -int TXLpTSize = NUMELEMS(TXLpTable); diff --git a/src/spicelib/devices/txl/txlacct.c b/src/spicelib/devices/txl/txlacct.c deleted file mode 100644 index 608815d03..000000000 --- a/src/spicelib/devices/txl/txlacct.c +++ /dev/null @@ -1,73 +0,0 @@ -/********** -Copyright 1992 Regents of the University of California. All rights -reserved. -Author: 1992 Charles Hough -**********/ - - -#include "ngspice/ngspice.h" -#include "ngspice/fteext.h" -#include "ngspice/cktdefs.h" -#include "txldefs.h" -#include "ngspice/sperror.h" -#include "ngspice/suffix.h" - - -int -TXLaccept(CKTcircuit *ckt, GENmodel *inModel) - /* set up the breakpoint table. - */ -{ - TXLmodel *model = (TXLmodel *)inModel; - TXLinstance *here; - int hint; - double h, v, v1; - NODE *nd; - TXLine *tx; - - /* loop through all the voltage source models */ - for( ; model != NULL; model = TXLnextModel(model)) { - - /* loop through all the instances of the model */ - for (here = TXLinstances(model); here != NULL ; - here=TXLnextInstance(here)) { - - h = ckt->CKTdelta; - hint = (int) (h * 1e12); - if (hint != 0) { - tx = here->txline; - nd = tx->in_node; - if (nd->dvtag == 0) { - v = nd->V; - v1 = nd->V = *(ckt->CKTrhs + here->TXLposNode); - nd->dv = (v1 - v) / hint; - nd->dvtag = 1; - } - nd = tx->out_node; - if (nd->dvtag == 0) { - v = nd->V; - v1 = nd->V = *(ckt->CKTrhs + here->TXLnegNode); - nd->dv = (v1 - v) / hint; - nd->dvtag = 1; - } - } - else { - /* can't happen. */ - printf("zero h detected\n"); - controlled_exit(1); - } - } - } - model = (TXLmodel *)inModel; - for( ; model != NULL; model = TXLnextModel(model)) { - for (here = TXLinstances(model); here != NULL ; - here=TXLnextInstance(here)) { - nd = here->txline->in_node; - nd->dvtag = 0; - nd = here->txline->out_node; - nd->dvtag = 0; - } - } - - return(OK); -} diff --git a/src/spicelib/devices/txl/txlask.c b/src/spicelib/devices/txl/txlask.c deleted file mode 100644 index 6cb7c91fa..000000000 --- a/src/spicelib/devices/txl/txlask.c +++ /dev/null @@ -1,40 +0,0 @@ -/********** -Copyright 1992 Regents of the University of California. All rights -reserved. -Author: 1992 Charles Hough -**********/ - - -#include "ngspice/ngspice.h" -#include "ngspice/const.h" -#include "txldefs.h" -#include "ngspice/ifsim.h" -#include "ngspice/cktdefs.h" -#include "ngspice/sperror.h" -#include "ngspice/suffix.h" - - -/*ARGSUSED*/ -int -TXLask(CKTcircuit *ckt, GENinstance *inst, int which, IFvalue *value, IFvalue *select) -{ - TXLinstance *fast = (TXLinstance *)inst; - - NG_IGNORE(select); - NG_IGNORE(ckt); - - switch(which) { - case TXL_OUT_NODE: - value->iValue = fast->TXLnegNode; - return(OK); - case TXL_IN_NODE: - value->iValue = fast->TXLposNode; - return(OK); - case TXL_LENGTH: - value->rValue = fast->TXLlength; - return(OK); - default: - return(E_BADPARM); - } - /* NOTREACHED */ -} diff --git a/src/spicelib/devices/txl/txldefs.h b/src/spicelib/devices/txl/txldefs.h deleted file mode 100644 index 3fd7207a6..000000000 --- a/src/spicelib/devices/txl/txldefs.h +++ /dev/null @@ -1,100 +0,0 @@ -#ifndef TXL -#define TXL - -#include "ngspice/ifsim.h" -#include "ngspice/cktdefs.h" -#include "ngspice/gendefs.h" -#include "ngspice/complex.h" -#include "ngspice/noisedef.h" -#include "ngspice/swec.h" - -/* information used to describe a single instance */ - -typedef struct sTXLinstance { - - struct GENinstance gen; - -#define TXLmodPtr(inst) ((struct sTXLmodel *)((inst)->gen.GENmodPtr)) -#define TXLnextInstance(inst) ((struct sTXLinstance *)((inst)->gen.GENnextInstance)) -#define TXLname gen.GENname -#define TXLstates gen.GENstate - - int TXLposNode; - int TXLnegNode; - double TXLlength; - int TXLibr1; - int TXLibr2; - TXLine *txline; /* pointer to SWEC txline type */ - TXLine *txline2; /* pointer to SWEC txline type. temporary storage */ - char *in_node_name; - char *out_node_name; - int TXLbranch; /* unused */ - - double *TXLposPosPtr; - double *TXLposNegPtr; - double *TXLnegPosPtr; - double *TXLnegNegPtr; - double *TXLibr1PosPtr; - double *TXLibr2NegPtr; - double *TXLposIbr1Ptr; - double *TXLnegIbr2Ptr; - double *TXLibr1NegPtr; - double *TXLibr2PosPtr; - double *TXLibr1Ibr1Ptr; - double *TXLibr2Ibr2Ptr; - double *TXLibr1Ibr2Ptr; - double *TXLibr2Ibr1Ptr; - - unsigned TXLibr1Given : 1; - unsigned TXLibr2Given : 1; - unsigned TXLdcGiven : 1; - unsigned TXLlengthgiven : 1; /* flag to indicate that instance parameter len is specified */ - -} TXLinstance ; - - -/* per model data */ - -typedef struct sTXLmodel { /* model structure for a txl */ - - struct GENmodel gen; - -#define TXLmodType gen.GENmodType -#define TXLnextModel(inst) ((struct sTXLmodel *)((inst)->gen.GENnextModel)) -#define TXLinstances(inst) ((TXLinstance *)((inst)->gen.GENinstances)) -#define TXLmodName gen.GENmodName - - double R; - double L; - double G; - double C; - double length; - unsigned Rgiven : 1; /* flag to indicate R was specified */ - unsigned Lgiven : 1; /* flag to indicate L was specified */ - unsigned Ggiven : 1; /* flag to indicate G was specified */ - unsigned Cgiven : 1; /* flag to indicate C was specified */ - unsigned lengthgiven : 1; /* flag to indicate length was specified */ - -} TXLmodel; - -/* instance parameters */ -enum { - TXL_IN_NODE = 1, - TXL_OUT_NODE, - TXL_LENGTH, -}; - -/* model parameters */ -enum { - TXL_R = 101, - TXL_C, - TXL_G, - TXL_L, - TXL_length, - TXL_MOD_R, -}; - -#include "txlext.h" -extern VI_list_txl *pool_vi_txl; - -#endif /*TXL*/ diff --git a/src/spicelib/devices/txl/txlext.h b/src/spicelib/devices/txl/txlext.h deleted file mode 100644 index 994b9af18..000000000 --- a/src/spicelib/devices/txl/txlext.h +++ /dev/null @@ -1,11 +0,0 @@ - -extern int TXLaccept(CKTcircuit*,GENmodel*); -extern int TXLask(CKTcircuit*, GENinstance*, int, IFvalue*, IFvalue*); -extern int TXLfindBr(CKTcircuit*, GENmodel*, IFuid); -extern int TXLload(GENmodel*,CKTcircuit*); -extern int TXLmodAsk(CKTcircuit*, GENmodel*, int, IFvalue*); -extern int TXLmParam(int,IFvalue*,GENmodel*); -extern int TXLparam(int,IFvalue*,GENinstance*,IFvalue*); -extern int TXLsetup(SMPmatrix*,GENmodel*,CKTcircuit*,int*); -extern int TXLunsetup(GENmodel*, CKTcircuit*); -extern int TXLdevDelete(GENinstance*); diff --git a/src/spicelib/devices/txl/txlfbr.c b/src/spicelib/devices/txl/txlfbr.c deleted file mode 100644 index 46503a403..000000000 --- a/src/spicelib/devices/txl/txlfbr.c +++ /dev/null @@ -1,37 +0,0 @@ -/********** -Copyright 1992 Regents of the University of California. All rights -reserved. -Author: 1992 Charles Hough -**********/ - - -#include "ngspice/ngspice.h" -#include "ngspice/cktdefs.h" -#include "txldefs.h" -#include "ngspice/sperror.h" -#include "ngspice/suffix.h" - - -int -TXLfindBr(CKTcircuit *ckt, GENmodel *inModel, IFuid name) -{ - TXLmodel *model = (TXLmodel *)inModel; - TXLinstance *here; - int error; - CKTnode *tmp; - - for( ; model != NULL; model = TXLnextModel(model)) { - for (here = TXLinstances(model); here != NULL; - here = TXLnextInstance(here)) { - if(here->TXLname == name) { - if(here->TXLbranch == 0) { - error = CKTmkCur(ckt,&tmp,here->TXLname,"branch"); - if(error) return(error); - here->TXLbranch = tmp->number; - } - return(here->TXLbranch); - } - } - } - return(0); -} diff --git a/src/spicelib/devices/txl/txlinit.c b/src/spicelib/devices/txl/txlinit.c deleted file mode 100644 index 594f0eb4e..000000000 --- a/src/spicelib/devices/txl/txlinit.c +++ /dev/null @@ -1,81 +0,0 @@ -/********** -Copyright 1992 Regents of the University of California. All rights -reserved. -Author: 1992 Charles Hough -**********/ -#include "ngspice/config.h" - -#include "ngspice/devdefs.h" - -#include "txlitf.h" -#include "txlext.h" -#include "txlinit.h" - - -SPICEdev TXLinfo = { - .DEVpublic = { - .name = "TransLine", - .description = "Simple Lossy Transmission Line", - .terms = &TXLnSize, - .numNames = &TXLnSize, - .termNames = TXLnames, - .numInstanceParms = &TXLpTSize, - .instanceParms = TXLpTable, - .numModelParms = &TXLmPTSize, - .modelParms = TXLmPTable, - .flags = 0, - -#ifdef XSPICE - .cm_func = NULL, - .num_conn = 0, - .conn = NULL, - .num_param = 0, - .param = NULL, - .num_inst_var = 0, - .inst_var = NULL, -#endif - }, - - .DEVparam = TXLparam, - .DEVmodParam = TXLmParam, - .DEVload = TXLload, - .DEVsetup = TXLsetup, - .DEVunsetup = TXLunsetup, - .DEVpzSetup = NULL, - .DEVtemperature = NULL, - .DEVtrunc = NULL, - .DEVfindBranch = NULL, - .DEVacLoad = TXLload, - .DEVaccept = NULL, - .DEVdestroy = NULL, - .DEVmodDelete = NULL, - .DEVdelete = TXLdevDelete, - .DEVsetic = NULL, - .DEVask = TXLask, - .DEVmodAsk = TXLmodAsk, - .DEVpzLoad = NULL, - .DEVconvTest = NULL, - .DEVsenSetup = NULL, - .DEVsenLoad = NULL, - .DEVsenUpdate = NULL, - .DEVsenAcLoad = NULL, - .DEVsenPrint = NULL, - .DEVsenTrunc = NULL, - .DEVdisto = NULL, - .DEVnoise = NULL, - .DEVsoaCheck = NULL, - .DEVinstSize = &TXLiSize, - .DEVmodSize = &TXLmSize, - -#ifdef CIDER - .DEVdump = NULL, - .DEVacct = NULL, -#endif -}; - - -SPICEdev * -get_txl_info(void) -{ - return &TXLinfo; -} diff --git a/src/spicelib/devices/txl/txlinit.h b/src/spicelib/devices/txl/txlinit.h deleted file mode 100644 index 7a64d3706..000000000 --- a/src/spicelib/devices/txl/txlinit.h +++ /dev/null @@ -1,18 +0,0 @@ -/********** -Copyright 1992 Regents of the University of California. All rights -reserved. -Author: 1992 Charles Hough -**********/ -#ifndef _TXLINIT_H -#define _TXLINIT_H - -extern IFparm TXLpTable[ ]; -extern IFparm TXLmPTable[ ]; -extern int TXLmPTSize; -extern int TXLpTSize; -extern char *TXLnames[ ]; -extern int TXLiSize; -extern int TXLmSize; -extern int TXLnSize; - -#endif diff --git a/src/spicelib/devices/txl/txlitf.h b/src/spicelib/devices/txl/txlitf.h deleted file mode 100644 index b4e306300..000000000 --- a/src/spicelib/devices/txl/txlitf.h +++ /dev/null @@ -1,12 +0,0 @@ -/********** -Copyright 1992 Regents of the University of California. All rights -reserved. -Author: 1992 Charles Hough -**********/ - -#ifndef DEV_TXL -#define DEV_TXL - -SPICEdev *get_txl_info(void); - -#endif diff --git a/src/spicelib/devices/txl/txlload.c b/src/spicelib/devices/txl/txlload.c deleted file mode 100644 index 212fad344..000000000 --- a/src/spicelib/devices/txl/txlload.c +++ /dev/null @@ -1,682 +0,0 @@ -/********** -Copyright 1992 Regents of the University of California. All rights -reserved. -Author: 1992 Charles Hough -**********/ - - -#include "ngspice/ngspice.h" -#include "txldefs.h" -#include "ngspice/sperror.h" -#include "ngspice/suffix.h" - - -static double ratio[MAX_CP_TX_LINES]; -static int update_cnv_txl(TXLine*, double); -static VI_list_txl *new_vi_txl(void); -static void free_vi_txl(VI_list_txl*); -static int add_new_vi_txl(TXLinstance*, CKTcircuit*, int); -static int get_pvs_vi_txl(int, int, TXLine*, double*, double*, double*, double*, double*, - double*, double*, double*); -static int right_consts_txl(TXLine*, int, int, double, double, int, int, CKTcircuit*); -static int update_delayed_cnv_txl(TXLine*, double); -static int multC(double, double, double, double, double*, double*); -static int expC(double, double, double, double*, double*); -static void copy_tx(TXLine *, TXLine *); - -/*ARGSUSED*/ -int -TXLload(GENmodel *inModel, CKTcircuit *ckt) -{ - TXLmodel *model = (TXLmodel *)inModel; - TXLinstance *here; - TXLine *tx, *tx2; - int k, l; - int time, time2; - double h, h1, f; - int hint; - double hf; - NODE *nd; - double v, v1, g; - int cond1; - CKTnode *node; - VI_list_txl *vi, *vi_before; - int i, before, delta; - - double gmin; /* dc solution */ - - /* debug - printf("before txlload\n"); - SMPprint(ckt->CKTmatrix, NULL); - */ - - h = ckt->CKTdelta; - h1 = 0.5 * h; - time2 = (int) (ckt->CKTtime * 1e12); - hint = (int)(h * 1e12); - hf = h * 1e12; - time = (int) ((ckt->CKTtime - ckt->CKTdelta) * 1e12); - - cond1= ckt->CKTmode & MODEDC; - - gmin = 0.1 * ckt->CKTgmin; /* dc solution */ - - for( ; model != NULL; model = TXLnextModel(model)) { - for (here = TXLinstances(model); here != NULL ; - here=TXLnextInstance(here)) { - - tx = here->txline; - - *here->TXLposPosPtr += gmin; /* dc solution */ - *here->TXLnegNegPtr += gmin; - *here->TXLnegPosPtr += gmin; - *here->TXLposNegPtr += gmin; - - if (cond1 || tx->vi_head == NULL) continue; - - if (time < tx->vi_tail->time) { - time = tx->vi_tail->time; - hint = time2 - time; - } - - vi_before = tx->vi_tail; - before = tx->vi_tail->time; - - if (time > tx->vi_tail->time) { - - copy_tx(tx, here->txline2); - add_new_vi_txl(here, ckt, time); - - delta = time - before; - - nd = tx->in_node; - v = vi_before->v_i; - nd->V = tx->vi_tail->v_i; - v1 = nd->V; - nd->dv = (v1 - v) / delta; - - nd = tx->out_node; - v = vi_before->v_o; - v1 = nd->V = tx->vi_tail->v_o; - nd->dv = (v1 - v) / delta; - - if (tx->lsl) continue; - update_cnv_txl(tx, delta); - if (tx->ext) update_delayed_cnv_txl(tx, delta); - } - } - } - - model = (TXLmodel *)inModel; - for( ; model != NULL; model = TXLnextModel(model)) { - for (here = TXLinstances(model); here != NULL ; - here=TXLnextInstance(here)) { - - tx = here->txline; - tx2 = here->txline2; - - if (!tx->lsl && hf > tx->taul) { - - fprintf(stderr, "your time step is too large for TXL tau.\n"); -/* fprintf(stderr, "please decrease max time step in .tran card.\n"); - fprintf(stderr, ".tran tstep tstop tstart tmax.\n"); - fprintf(stderr, "make tmax smaller than %e and try again.\n", - tx->taul * 1e-12); - return (1111); -*/ - fprintf(stderr, "tmax is now set to %e.\n", 0.9 * tx->taul * 1e-12); - ckt->CKTmaxStep = 0.9 * tx->taul * 1e-12; - - } - - if (cond1) { - if (here->TXLlengthgiven) - g = model->R * here->TXLlength; - else g = model->R * TXLmodPtr(here)->length; - *(here->TXLposIbr1Ptr) += 1.0; - *(here->TXLnegIbr2Ptr) += 1.0; - *(here->TXLibr1Ibr1Ptr) += 1.0; - *(here->TXLibr1Ibr2Ptr) += 1.0; - *(here->TXLibr2PosPtr) += 1.0; - *(here->TXLibr2NegPtr) -= 1.0; - *(here->TXLibr2Ibr1Ptr) -= g; - - continue; - - } - - /* dc setup */ - if (here->TXLdcGiven == 0 && !cond1) { - nd = tx->in_node; - for (node = ckt->CKTnodes;node; node = node->next) { - if (strcmp(nd->name->id, node->name) == 0) { - tx->dc1 = tx2->dc1 = ckt->CKTrhsOld[node->number]; - nd->V = tx->dc1; - break; - } - } - nd = tx->out_node; - for (node = ckt->CKTnodes;node; node = node->next) { - if (strcmp(nd->name->id, node->name) == 0) { - tx->dc2 = tx2->dc2 = ckt->CKTrhsOld[node->number]; - nd->V = tx->dc2; - break; - } - } - here->TXLdcGiven = 1; - - vi = new_vi_txl(); - vi->time = 0; - - vi->i_i = *(ckt->CKTrhsOld + here->TXLibr1); - vi->i_o = *(ckt->CKTrhsOld + here->TXLibr2); - - vi->v_i = tx->dc1; - vi->v_o = tx->dc2; - - for (i = 0; i < 3; i++) { - tx->h1_term[i].cnv_i = - - tx->dc1 * tx->h1_term[i].c / tx->h1_term[i].x; - tx->h1_term[i].cnv_o = - - tx->dc2 * tx->h1_term[i].c / tx->h1_term[i].x; - } - for (i = 0; i < 3; i++) { - tx->h2_term[i].cnv_i = 0.0; - tx->h2_term[i].cnv_o = 0.0; - } - for (i = 0; i < 6; i++) { - tx->h3_term[i].cnv_i = - - tx->dc1 * tx->h3_term[i].c / tx->h3_term[i].x; - tx->h3_term[i].cnv_o = - - tx->dc2 * tx->h3_term[i].c / tx->h3_term[i].x; - } - vi->next = NULL; - tx->vi_tail = vi; - tx->vi_head = vi; - here->txline2->vi_tail = vi; - here->txline2->vi_head = vi; - - } - - /* change 6,6 1/18/93 - *(here->TXLibr1Ibr1Ptr) -= 1.0; - *(here->TXLibr2Ibr2Ptr) -= 1.0; - *(here->TXLposIbr1Ptr) += 1.0; - *(here->TXLnegIbr2Ptr) += 1.0; - *(here->TXLibr1PosPtr) += tx->sqtCdL + h1 * tx->h1C; - *(here->TXLibr2NegPtr) += tx->sqtCdL + h1 * tx->h1C; - */ - *(here->TXLibr1Ibr1Ptr) = -1.0; - *(here->TXLibr2Ibr2Ptr) = -1.0; - *(here->TXLposIbr1Ptr) = 1.0; - *(here->TXLnegIbr2Ptr) = 1.0; - *(here->TXLibr1PosPtr) = tx->sqtCdL + h1 * tx->h1C; - *(here->TXLibr2NegPtr) = tx->sqtCdL + h1 * tx->h1C; - - k = here->TXLibr1; - l = here->TXLibr2; - - copy_tx(tx2, tx); - - if (right_consts_txl(tx2, time, time2, h, h1, k, l, ckt)) { - if (tx->lsl) { - f = ratio[0] * tx->h3_aten; - *(here->TXLibr1NegPtr) = -f; - *(here->TXLibr2PosPtr) = -f; - f = ratio[0] * tx->h2_aten; - *(here->TXLibr1Ibr2Ptr) = -f; - *(here->TXLibr2Ibr1Ptr) = -f; - } - else { - tx->ext = 1; - tx->ratio = ratio[0]; - if (ratio[0] > 0.0) { - f = ratio[0] * (h1 * (tx->h3_term[0].c - + tx->h3_term[1].c + tx->h3_term[2].c - + tx->h3_term[3].c + tx->h3_term[4].c - + tx->h3_term[5].c ) + tx->h3_aten); - *(here->TXLibr1NegPtr) = -f; - *(here->TXLibr2PosPtr) = -f; - f = ratio[0] * (h1 * ( tx->h2_term[0].c - + tx->h2_term[1].c + tx->h2_term[2].c ) - + tx->h2_aten); - *(here->TXLibr1Ibr2Ptr) = -f; - *(here->TXLibr2Ibr1Ptr) = -f; - } - } - } - else tx->ext = 0; - } - } - - if (cond1) return (OK); - - /* debug - printf("after txlload\n"); - SMPprint(ckt->CKTmatrix, NULL); - */ - - return(OK); -} - -static void -copy_tx(TXLine *new, TXLine *old) -{ - int i; - VI_list_txl *temp; - - new->lsl = old->lsl; - new->ext = old->ext; - new->ratio = old->ratio; - new->taul = old->taul; - new->sqtCdL = old->sqtCdL; - new->h2_aten = old->h2_aten; - new->h3_aten = old->h3_aten; - new->h1C = old->h1C; - for (i= 0; i < 3; i++) { - new->h1e[i] = old->h1e[i]; - - new->h1_term[i].c = old->h1_term[i].c; - new->h1_term[i].x = old->h1_term[i].x; - new->h1_term[i].cnv_i = old->h1_term[i].cnv_i; - new->h1_term[i].cnv_o = old->h1_term[i].cnv_o; - - new->h2_term[i].c = old->h2_term[i].c; - new->h2_term[i].x = old->h2_term[i].x; - new->h2_term[i].cnv_i = old->h2_term[i].cnv_i; - new->h2_term[i].cnv_o = old->h2_term[i].cnv_o; - } - for (i= 0; i < 6; i++) { - new->h3_term[i].c = old->h3_term[i].c; - new->h3_term[i].x = old->h3_term[i].x; - new->h3_term[i].cnv_i = old->h3_term[i].cnv_i; - new->h3_term[i].cnv_o = old->h3_term[i].cnv_o; - } - - new->ifImg = old->ifImg; - if (new->vi_tail != old->vi_tail) { - /* someting wrong */ - controlled_exit(0); - } - - while (new->vi_head->time < old->vi_head->time) { - temp = new->vi_head; - new->vi_head = new->vi_head->next; - free_vi_txl(temp); - } - -} - - -static int -update_cnv_txl(TXLine *tx, double h) -{ - int i; - - double ai, bi, ao, bo; - double e, t; - - ai = tx->in_node->V; - ao = tx->out_node->V; - bi = tx->in_node->dv; - bo = tx->out_node->dv; - - for (i = 0; i < 3; i++) { - TERM *tm; - tm = &(tx->h1_term[i]); - - e = tx->h1e[i]; - - t = tm->c / tm->x; - bi *= t; - bo *= t; - - tm->cnv_i = (tm->cnv_i - bi*h) * e + (e - 1.0)*(ai*t + 1.0e+12*bi/tm->x); - tm->cnv_o = (tm->cnv_o - bo*h) * e + (e - 1.0)*(ao*t + 1.0e+12*bo/tm->x); - } - return (1); -} - - -static VI_list_txl -*new_vi_txl(void) -{ - VI_list_txl *q; - - if (pool_vi_txl) { - q = pool_vi_txl; - pool_vi_txl = pool_vi_txl->pool; - return(q); - } else - return(TMALLOC(VI_list_txl, 1)); -} - -static void -free_vi_txl(VI_list_txl *q) -{ - q->pool = pool_vi_txl; - pool_vi_txl = q; -} - - -static int -add_new_vi_txl(TXLinstance *here, CKTcircuit *ckt, int time) -{ - VI_list_txl *vi; - TXLine *tx, *tx2; - - tx = here->txline; - tx2 = here->txline2; - - vi = new_vi_txl(); - vi->time = time; - tx->vi_tail->next = vi; - tx2->vi_tail->next = vi; - vi->next = NULL; - tx->vi_tail = vi; - tx2->vi_tail = vi; - - vi->v_i = *(ckt->CKTrhsOld + here->TXLposNode); - vi->v_o = *(ckt->CKTrhsOld + here->TXLnegNode); - vi->i_i = *(ckt->CKTrhsOld + here->TXLibr1); - vi->i_o = *(ckt->CKTrhsOld + here->TXLibr2); - return(1); -} - - -static int -get_pvs_vi_txl(int t1, int t2, TXLine *tx, double *v1_i, double *v2_i, double *i1_i, double *i2_i, - double *v1_o, double *v2_o, double *i1_o, double *i2_o) -{ - double ta, tb; - VI_list_txl *vi, *vi1; - double f; - int ext = 0; - - ta = t1 - tx->taul; - tb = t2 - tx->taul; - if (tb <= 0) { - *v1_i = *v2_i = tx->dc1; - *v2_o = *v1_o = tx->dc2; - *i1_i = *i2_i = *i1_o = *i2_o = 0; - return(ext); - } - - if (ta <= 0) { - *i1_i = *i1_o = 0.0; - *v1_i = tx->dc1; - *v1_o = tx->dc2; - vi1 = tx->vi_head; - vi = vi1->next; - } else { - vi1 = tx->vi_head; - for (vi = vi1->next; vi->time < ta; vi = vi->next) { - /* free_vi_txl(vi1); */ - vi1 = vi; - } - f = (ta - vi1->time) / (vi->time - vi1->time); - *v1_i = vi1->v_i + f * (vi->v_i - vi1->v_i); - *v1_o = vi1->v_o + f * (vi->v_o - vi1->v_o); - *i1_i = vi1->i_i + f * (vi->i_i - vi1->i_i); - *i1_o = vi1->i_o + f * (vi->i_o - vi1->i_o); - tx->vi_head = vi1; - } - - if (tb > t1) { - - /* fprintf(stderr, "pvs: time = %d\n", t2); */ - ext = 1; - /* - f = tb - t1; - *v2_i = tx->in_node->V + tx->in_node->dv * f; - *v2_o = tx->out_node->V + tx->out_node->dv * f; - - if (vi) { - for (; vi->time != t1; vi = vi->next) - vi1 = vi; - - f /= (double) (t1 - vi1->time); - *i2_i = vi->i_i + f * (vi->i_i - vi1->i_i); - *i2_o = vi->i_o + f * (vi->i_o - vi1->i_o); - } else { - *i2_i = vi1->i_i; - *i2_o = vi1->i_o; - } - */ - ratio[0] = f = (tb - t1) / (t2 - t1); - if (vi) - for (; vi->time != t1; vi = vi->next) - ; - else - vi = vi1; - f = 1 - f; - *v2_i = vi->v_i * f; - *v2_o = vi->v_o * f; - *i2_i = vi->i_i * f; - *i2_o = vi->i_o * f; - } else { - for (; vi->time < tb; vi = vi->next) - vi1 = vi; - - f = (tb - vi1->time) / (vi->time - vi1->time); - *v2_i = vi1->v_i + f * (vi->v_i - vi1->v_i); - *v2_o = vi1->v_o + f * (vi->v_o - vi1->v_o); - *i2_i = vi1->i_i + f * (vi->i_i - vi1->i_i); - *i2_o = vi1->i_o + f * (vi->i_o - vi1->i_o); - } - - return(ext); -} - - -static int -right_consts_txl(TXLine *tx, int t, int time, double h, double h1, int l1, int l2, CKTcircuit *ckt) -/*** h1 = 0.5 * h ***/ -{ - int i; - double ff=0.0, gg=0.0, e; - double v1_i, v2_i, i1_i, i2_i; - double v1_o, v2_o, i1_o, i2_o; - int ext; - - if (! tx->lsl) { - double ff1=0.0; - for (i = 0; i < 3; i++) { - tx->h1e[i] = e = exp(tx->h1_term[i].x * h); - ff1 -= tx->h1_term[i].c * e; - ff -= tx->h1_term[i].cnv_i * e; - gg -= tx->h1_term[i].cnv_o * e; - } - ff += ff1 * h1 * tx->in_node->V; - gg += ff1 * h1 * tx->out_node->V; - } - - ext = get_pvs_vi_txl(t, time, tx, &v1_i, &v2_i, &i1_i, &i2_i, &v1_o, &v2_o, &i1_o, &i2_o); - - if (tx->lsl) { - ff = tx->h3_aten * v2_o + tx->h2_aten * i2_o; - gg = tx->h3_aten * v2_i + tx->h2_aten * i2_i; - } else { - if (tx->ifImg) { - double a, b, er, ei, a1, b1, a2, b2; - - for (i = 0; i < 4; i++) { - TERM *tm; - tm = &(tx->h3_term[i]); - e = exp(tm->x * h); - tm->cnv_i = tm->cnv_i * e + h1 * tm->c * (v1_i * e + v2_i); - tm->cnv_o = tm->cnv_o * e + h1 * tm->c * (v1_o * e + v2_o); - } - expC(tx->h3_term[4].x, tx->h3_term[5].x, h, &er, &ei); - a2 = h1 * tx->h3_term[4].c; - b2 = h1 * tx->h3_term[5].c; - - a = tx->h3_term[4].cnv_i; - b = tx->h3_term[5].cnv_i; - multC(a, b, er, ei, &a, &b); - multC(a2, b2, v1_i * er + v2_i, v1_i * ei, &a1, &b1); - tx->h3_term[4].cnv_i = a + a1; - tx->h3_term[5].cnv_i = b + b1; - - a = tx->h3_term[4].cnv_o; - b = tx->h3_term[5].cnv_o; - multC(a, b, er, ei, &a, &b); - multC(a2, b2, v1_o * er + v2_o, v1_o * ei, &a1, &b1); - tx->h3_term[4].cnv_o = a + a1; - tx->h3_term[5].cnv_o = b + b1; - - ff += tx->h3_aten * v2_o; - gg += tx->h3_aten * v2_i; - - for (i = 0; i < 5; i++) { - ff += tx->h3_term[i].cnv_o; - gg += tx->h3_term[i].cnv_i; - } - ff += tx->h3_term[4].cnv_o; - gg += tx->h3_term[4].cnv_i; - - { - TERM *tm; - tm = &(tx->h2_term[0]); - - e = exp(tm->x * h); - tm->cnv_i = tm->cnv_i * e + h1 * tm->c * (i1_i * e + i2_i); - tm->cnv_o = tm->cnv_o * e + h1 * tm->c * (i1_o * e + i2_o); - } - expC(tx->h2_term[1].x, tx->h2_term[2].x, h, &er, &ei); - a2 = h1 * tx->h2_term[1].c; - b2 = h1 * tx->h2_term[2].c; - - a = tx->h2_term[1].cnv_i; - b = tx->h2_term[2].cnv_i; - multC(a, b, er, ei, &a, &b); - multC(a2, b2, i1_i * er + i2_i, i1_i * ei, &a1, &b1); - tx->h2_term[1].cnv_i = a + a1; - tx->h2_term[2].cnv_i = b + b1; - - a = tx->h2_term[1].cnv_o; - b = tx->h2_term[2].cnv_o; - multC(a, b, er, ei, &a, &b); - multC(a2, b2, i1_o * er + i2_o, i1_o * ei, &a1, &b1); - tx->h2_term[1].cnv_o = a + a1; - tx->h2_term[2].cnv_o = b + b1; - - ff += tx->h2_aten * i2_o + tx->h2_term[0].cnv_o + - 2.0 * tx->h2_term[1].cnv_o; - gg += tx->h2_aten * i2_i + tx->h2_term[0].cnv_i + - 2.0 * tx->h2_term[1].cnv_i; - } else { - for (i = 0; i < 6; i++) { - TERM *tm; - tm = &(tx->h3_term[i]); - - e = exp(tm->x * h); - tm->cnv_i = tm->cnv_i * e + h1 * tm->c * (v1_i * e + v2_i); - tm->cnv_o = tm->cnv_o * e + h1 * tm->c * (v1_o * e + v2_o); - } - - ff += tx->h3_aten * v2_o; - gg += tx->h3_aten * v2_i; - - for (i = 0; i < 6; i++) { - ff += tx->h3_term[i].cnv_o; - gg += tx->h3_term[i].cnv_i; - } - - for (i = 0; i < 3; i++) { - TERM *tm; - tm = &(tx->h2_term[i]); - - e = exp(tm->x * h); - tm->cnv_i = tm->cnv_i * e + h1 * tm->c * (i1_i * e + i2_i); - tm->cnv_o = tm->cnv_o * e + h1 * tm->c * (i1_o * e + i2_o); - } - - ff += tx->h2_aten * i2_o; - gg += tx->h2_aten * i2_i; - - for (i = 0; i < 3; i++) { - ff += tx->h2_term[i].cnv_o; - gg += tx->h2_term[i].cnv_i; - } - } - } - - *(ckt->CKTrhs + l1) = ff; - *(ckt->CKTrhs + l2) = gg; - - return(ext); -} - - -static int update_delayed_cnv_txl(TXLine *tx, double h) -{ - double ratio1; - double f; - VI_list_txl *vi; - TERM *tms; - - h *= 0.5e-12; - ratio1 = tx->ratio; - vi = tx->vi_tail; - - if (ratio1 > 0.0) { - tms = tx->h3_term; - f = h * ratio1 * vi->v_i; - tms[0].cnv_i += f * tms[0].c; - tms[1].cnv_i += f * tms[1].c; - tms[2].cnv_i += f * tms[2].c; - tms[3].cnv_i += f * tms[3].c; - tms[4].cnv_i += f * tms[4].c; - tms[5].cnv_i += f * tms[5].c; - - f = h * ratio1 * vi->v_o; - tms[0].cnv_o += f * tms[0].c; - tms[1].cnv_o += f * tms[1].c; - tms[2].cnv_o += f * tms[2].c; - tms[3].cnv_o += f * tms[3].c; - tms[4].cnv_o += f * tms[4].c; - tms[5].cnv_o += f * tms[5].c; - - tms = tx->h2_term; - f = h * ratio1 * vi->i_i; - tms[0].cnv_i += f * tms[0].c; - tms[1].cnv_i += f * tms[1].c; - tms[2].cnv_i += f * tms[2].c; - - f = h * ratio1 * vi->i_o; - tms[0].cnv_o += f * tms[0].c; - tms[1].cnv_o += f * tms[1].c; - tms[2].cnv_o += f * tms[2].c; - } - - return(1); -} - -static int -expC(double ar, double ai, double h, double *cr, double *ci) -{ - double e, cs, si; - - e = exp(ar * h); - cs = cos(ai * h); - si = sin(ai * h); - *cr = e * cs; - *ci = e * si; - - return(1); -} - -static int -multC(double ar, double ai, double br, double bi, double *cr, double *ci) -{ - double tp; - - tp = ar*br - ai*bi; - *ci = ar*bi + ai*br; - *cr = tp; - - return (1); - -} - diff --git a/src/spicelib/devices/txl/txlmask.c b/src/spicelib/devices/txl/txlmask.c deleted file mode 100644 index 23cd40881..000000000 --- a/src/spicelib/devices/txl/txlmask.c +++ /dev/null @@ -1,47 +0,0 @@ -/********** -Copyright 1992 Regents of the University of California. All rights -reserved. -Author: 1992 Charles Hough -**********/ - - -#include "ngspice/ngspice.h" -#include "ngspice/const.h" -#include "ngspice/cktdefs.h" -#include "ngspice/ifsim.h" -#include "txldefs.h" -#include "ngspice/sperror.h" -#include "ngspice/devdefs.h" -#include "ngspice/suffix.h" -#include "ngspice/swec.h" - - -/* ARGSUSED */ -int -TXLmodAsk(CKTcircuit *ckt, GENmodel *inModel, int which, IFvalue *value) -{ - TXLmodel *model = (TXLmodel *)inModel; - - NG_IGNORE(ckt); - - switch(which) { - case TXL_R: - value->rValue = model->R; - return(OK); - case TXL_C: - value->rValue = model->C; - return(OK); - case TXL_G: - value->rValue = model->G; - return(OK); - case TXL_L: - value->rValue = model->L; - return(OK); - case TXL_length: - value->rValue = model->length; - return(OK); - default: - return(E_BADPARM); - } -} - diff --git a/src/spicelib/devices/txl/txlmpar.c b/src/spicelib/devices/txl/txlmpar.c deleted file mode 100644 index 7374d17de..000000000 --- a/src/spicelib/devices/txl/txlmpar.c +++ /dev/null @@ -1,47 +0,0 @@ -/********** -Copyright 1992 Regents of the University of California. All rights -reserved. -Author: 1992 Charles Hough -**********/ - - -#include "ngspice/ngspice.h" -#include "ngspice/const.h" -#include "ngspice/ifsim.h" -#include "txldefs.h" -#include "ngspice/sperror.h" -#include "ngspice/suffix.h" - - -int -TXLmParam(int param, IFvalue *value, GENmodel *inModel) -{ - TXLmodel *model = (TXLmodel *)inModel; - switch(param) { - case TXL_R: - model->R = value->rValue; - model->Rgiven = TRUE; - break; - case TXL_L: - model->L = value->rValue; - model->Lgiven = TRUE; - break; - case TXL_G: - model->G = value->rValue; - model->Ggiven = TRUE; - break; - case TXL_C: - model->C = value->rValue; - model->Cgiven = TRUE; - break; - case TXL_length: - model->length = value->rValue; - model->lengthgiven = TRUE; - break; - case TXL_MOD_R: - break; - default: - return(E_BADPARM); - } - return(OK); -} diff --git a/src/spicelib/devices/txl/txlparam.c b/src/spicelib/devices/txl/txlparam.c deleted file mode 100644 index 5d6b66369..000000000 --- a/src/spicelib/devices/txl/txlparam.c +++ /dev/null @@ -1,38 +0,0 @@ -/********** -Copyright 1992 Regents of the University of California. All rights -reserved. -Author: 1992 Charles Hough -**********/ - -#include "ngspice/ngspice.h" -#include "ngspice/const.h" -#include "ngspice/ifsim.h" -#include "txldefs.h" -#include "ngspice/sperror.h" -#include "ngspice/suffix.h" - - -/* ARGSUSED */ -int -TXLparam(int param, IFvalue *value, GENinstance *inst, IFvalue *select) -{ - TXLinstance *here = (TXLinstance *)inst; - - NG_IGNORE(select); - - switch(param) { - case TXL_IN_NODE: - here->TXLposNode = value->iValue; - break; - case TXL_OUT_NODE: - here->TXLnegNode = value->iValue; - break; - case TXL_LENGTH: - here->TXLlength = value->rValue; - here->TXLlengthgiven = TRUE; - break; - default: - return(E_BADPARM); - } - return(OK); -} diff --git a/src/spicelib/devices/txl/txlsetup.c b/src/spicelib/devices/txl/txlsetup.c deleted file mode 100644 index 01192d6d4..000000000 --- a/src/spicelib/devices/txl/txlsetup.c +++ /dev/null @@ -1,1192 +0,0 @@ -/********** -Copyright 1992 Regents of the University of California. All rights -reserved. -Author: 1992 Charles Hough -**********/ - - -#include "ngspice/ngspice.h" -#include "ngspice/fteext.h" -#include "ngspice/smpdefs.h" -#include "txldefs.h" -#include "ngspice/sperror.h" -#include "ngspice/suffix.h" - - -static int ReadTxL(TXLinstance*, CKTcircuit*); -/*static int multC();*/ -static int main_pade(double, double, double, double, double, TXLine*); -static int mac(double, double, double*, double*, double*, double*, double*); -/*static int divC();*/ -static int div_C(double, double, double, double, double*, double*); -static int div3(double, double, double, double, double*, double*); -/*static double approx1();*/ -/*static double approx2();*/ -static int find_roots(double, double, double, double*, double*, double*); -/*static double f3();*/ -/*static double f2();*/ -/*static int expC();*/ -/*static double exp_approx1();*/ -/*static double exp_approx2();*/ -static int exp_pade(double, double, double, double, double, TXLine*); -/*static int exp_div3();*/ -static int exp_find_roots(double, double, double, double*, double*, double* ); -static double eval2(double, double, double, double); -static int get_c(double, double, double, double, double, double, double, double*, double*); -static int get_h3(TXLine*); -static int Gaussian_Elimination2(int); -static int Gaussian_Elimination1(int); -static int pade(double); -static int update_h1C_c(TXLine *); -static void y_pade(double, double, double, double, TXLine*); -static double root3(double, double, double, double); -static NDnamePt insert_ND(char*, NDnamePt*); -static NODE *insert_node(char*); -static NODE *NEW_node(void); -/*static VI_list_txl *new_vi_txl();*/ - -NODE *node_tab = NULL; -NDnamePt ndn_btree = NULL; -VI_list_txl *pool_vi_txl = NULL; - -/* pade.c */ -/** -static double xx1, xx2, xx3, xx4, xx5, xx6; -static double cc1, cc2, cc3, cc4, cc5, cc6; -**/ - -/* y.c */ -static double sqtCdL; -static double b1, b2, b3, b4, b5; -static double p1, p2, p3, q1, q2, q3; -static double c1, c2, c3, x1, x2, x3; -static double A[3][4]; - -/* exp.c */ -static double RG, tau, RC, GL; -static double a0, a1, a2, a3, a4, a5; -static double ep1, ep2, ep3, eq1, eq2, eq3; -static double ec1, ec2, ec3, ex1, ex2, ex3; -static int ifImg; -static double AA[3][4]; - -#define epsi 1.0e-16 -#define epsi2 1.0e-28 - -/* ARGSUSED */ -int -TXLsetup(SMPmatrix *matrix, GENmodel *inModel, CKTcircuit*ckt, int *state) -{ - TXLmodel *model = (TXLmodel *)inModel; - TXLinstance *here; - CKTnode *tmp; - int error; - - NG_IGNORE(state); - - /* loop through all the models */ - for( ; model != NULL; model = TXLnextModel(model)) { - - if (!model->Rgiven) { - SPfrontEnd->IFerrorf (ERR_FATAL, - "model %s: lossy line series resistance not given", model->TXLmodName); - return(E_BADPARM); - } - if (!model->Ggiven) { - SPfrontEnd->IFerrorf (ERR_FATAL, - "model %s: lossy line parallel conductance not given", model->TXLmodName); - return(E_BADPARM); - } - if (!model->Lgiven) { - SPfrontEnd->IFerrorf (ERR_FATAL, - "model %s: lossy line series inductance not given", model->TXLmodName); - return (E_BADPARM); - } - if (!model->Cgiven) { - SPfrontEnd->IFerrorf (ERR_FATAL, - "model %s: lossy line parallel capacitance not given", model->TXLmodName); - return (E_BADPARM); - } - if (!model->lengthgiven) { - SPfrontEnd->IFerrorf (ERR_FATAL, - "model %s: lossy line length must be given", model->TXLmodName); - return (E_BADPARM); - } - - /* loop through all the instances of the model */ - for (here = TXLinstances(model); here != NULL ; - here=TXLnextInstance(here)) { - -/* macro to make elements with built in test for out of memory */ -#define TSTALLOC(ptr,first,second) \ -do { if((here->ptr = SMPmakeElt(matrix, here->first, here->second)) == NULL){\ - return(E_NOMEM);\ -} } while(0) - - if (! here->TXLibr1Given) { - error = CKTmkCur(ckt, &tmp, here->TXLname, "branch1"); - if (error) return (error); - here->TXLibr1 = tmp->number; - } - if (! here->TXLibr2Given) { - error = CKTmkCur(ckt, &tmp, here->TXLname, "branch2"); - if (error) return (error); - here->TXLibr2 = tmp->number; - } - - TSTALLOC(TXLposPosPtr, TXLposNode, TXLposNode); - TSTALLOC(TXLposNegPtr, TXLposNode, TXLnegNode); - TSTALLOC(TXLnegPosPtr, TXLnegNode, TXLposNode); - TSTALLOC(TXLnegNegPtr, TXLnegNode, TXLnegNode); - TSTALLOC(TXLibr1PosPtr, TXLibr1, TXLposNode); - TSTALLOC(TXLibr2NegPtr, TXLibr2, TXLnegNode); - TSTALLOC(TXLnegIbr2Ptr, TXLnegNode, TXLibr2); - TSTALLOC(TXLposIbr1Ptr, TXLposNode, TXLibr1); - TSTALLOC(TXLibr1Ibr1Ptr, TXLibr1, TXLibr1); - TSTALLOC(TXLibr2Ibr2Ptr, TXLibr2, TXLibr2); - TSTALLOC(TXLibr1NegPtr, TXLibr1, TXLnegNode); - TSTALLOC(TXLibr2PosPtr, TXLibr2, TXLposNode); - TSTALLOC(TXLibr1Ibr2Ptr, TXLibr1, TXLibr2); - TSTALLOC(TXLibr2Ibr1Ptr, TXLibr2, TXLibr1); - - here->in_node_name = CKTnodName(ckt,here->TXLposNode); - here->out_node_name = CKTnodName(ckt,here->TXLnegNode); - ReadTxL(here, ckt); - - } - } - - return(OK); -} - -int -TXLunsetup(GENmodel *inModel, CKTcircuit *ckt) -{ - TXLmodel *model; - TXLinstance *here; - - for (model = (TXLmodel *) inModel; model != NULL; - model = TXLnextModel(model)) { - for (here = TXLinstances(model); here != NULL; - here = TXLnextInstance(here)) { - - if (here->TXLibr2) { - CKTdltNNum(ckt, here->TXLibr2); - here->TXLibr2 = 0; - } - - if (here->TXLibr1) { - CKTdltNNum(ckt, here->TXLibr1); - here->TXLibr1 = 0; - } - - here->TXLdcGiven=0; - - } - } - return OK; -} - -/*** -static VI_list_txl -*new_vi_txl(void) -{ - VI_list_txl *q; - - if (pool_vi_txl) { - q = pool_vi_txl; - pool_vi_txl = pool_vi_txl->pool; - return(q); - } else - return(TMALLOC(VI_list_txl, 1)); -} -***/ - -static int -ReadTxL(TXLinstance *tx, CKTcircuit *ckt) -{ - double R, L, G, C, l; - char *p, *n; - NODE *nd; - ETXLine *et; - TXLine *t, *t2; - RLINE *line; - ERLINE *er; - double LL = 1e-12; - - NG_IGNORE(ckt); - - p = tx->in_node_name; - n = tx->out_node_name; - - line = TMALLOC(RLINE, 1); - er = TMALLOC(ERLINE, 1); - et = TMALLOC(ETXLine, 1); - t = TMALLOC(TXLine, 1); - t2 = TMALLOC(TXLine, 1); - tx->txline = t; - tx->txline2 = t2; - t->newtp = 0; - t2->newtp = 0; - t->vi_head = t->vi_tail = NULL; - nd = insert_node(p); - et->link = nd->tptr; - nd->tptr = et; - et->line = t; - t->in_node = nd; - t2->in_node = nd; - er->link = nd->rlptr; - nd->rlptr = er; - er->rl = line; - line->in_node = nd; - et = TMALLOC(ETXLine, 1); - nd = insert_node(n); - et->link = nd->tptr; - nd->tptr = et; - et->line = t; - t->out_node = nd; - t2->out_node = nd; - er = TMALLOC(ERLINE, 1); - er->link = nd->rlptr; - nd->rlptr = er; - er->rl = line; - line->out_node = nd; - t->dc1 = t->dc2 = 0.0; - t2->dc1 = t2->dc2 = 0.0; - t->lsl = 0; - t2->lsl = 0; - l = 0.0; - - R = TXLmodPtr(tx)->R; - L = TXLmodPtr(tx)->L; - L = MAX(L, LL); - C = TXLmodPtr(tx)->C; - G = TXLmodPtr(tx)->G; - if (tx->TXLlengthgiven == TRUE) - l = tx->TXLlength; - else l = TXLmodPtr(tx)->length; - - - if (l == 0.0) { - fprintf(stderr, "(Error) transmission line of zero length\n"); - controlled_exit(EXIT_FAILURE); - } - else { - if (R / L < 5.0e+5) { - line->g = 1.0e+2; - if (G < 1.0e-2) { - t->lsl = 1; /* lossless line */ - t->taul = sqrt(C * L) * l * 1.0e12; - t->h3_aten = t->sqtCdL = sqrt(C / L); - t->h2_aten = 1.0; - t->h1C = 0.0; - } - } - else line->g = 1.0 / (R * l); - } - - if (! t->lsl) - main_pade(R, L, G, C, l, t); - - return(1); -} - - -/**************************************************************** - pade.c : Calculate the Pade Approxximation of Y(s) - ****************************************************************/ - - -static int -main_pade(double R, double L, double G, double C, double l, TXLine *h) -{ - y_pade(R, L, G, C, h); - h->ifImg = exp_pade(R, L, G, C, l, h); - get_h3(h); - h->taul *= 1.0e12; - update_h1C_c(h); - - return(1); -} - -static int -div_C(double ar, double ai, double br, double bi, double *cr, double *ci) -{ - *cr = ar * br + ai * bi; - *ci = - ar * bi + ai * br; - *cr = *cr / (br * br + bi * bi); - *ci = *ci / (br * br + bi * bi); - return (1); -} - -/*** -static int expC(ar, ai, h, cr, ci) - double ar, ai, *cr, *ci; - float h; -{ - double e, cs, si; - - e = exp((double) ar * h); - cs = cos((double) ai * h); - si = sin((double) ai * h); - *cr = e * cs; - *ci = e * si; - - return(1); -} -***/ - -/*** -static int multC(ar, ai, br, bi, cr, ci) - double ar, ai, br, bi; - double *cr, *ci; -{ - *cr = ar*br - ai*bi; - *ci = ar*bi + ai*br; - - return(1); -} -***/ - -/*** -static int divC(ar, ai, br, bi, cr, ci) - double ar, ai, br, bi; - double *cr, *ci; -{ - double t; - t = br*br + bi*bi; - *cr = (ar*br + ai*bi) / t; - *ci = (ai*br - ar*bi) / t; - - return(1); -} -***/ - -static int -get_h3(TXLine *h) -{ - double cc1, cc2, cc3, cc4, cc5, cc6; - double xx1, xx2, xx3, xx4, xx5, xx6; - - h->h3_aten = h->h2_aten * h->sqtCdL; - h->h3_term[0].x = xx1 = h->h1_term[0].x; - h->h3_term[1].x = xx2 = h->h1_term[1].x; - h->h3_term[2].x = xx3 = h->h1_term[2].x; - h->h3_term[3].x = xx4 = h->h2_term[0].x; - h->h3_term[4].x = xx5 = h->h2_term[1].x; - h->h3_term[5].x = xx6 = h->h2_term[2].x; - cc1 = h->h1_term[0].c; - cc2 = h->h1_term[1].c; - cc3 = h->h1_term[2].c; - cc4 = h->h2_term[0].c; - cc5 = h->h2_term[1].c; - cc6 = h->h2_term[2].c; - - if (h->ifImg) { - double r, i; - - h->h3_term[0].c = cc1 + cc1 * (cc4/(xx1-xx4) + - 2.0*(cc5*xx1-xx6*cc6-xx5*cc5)/(xx1*xx1-2.0*xx5*xx1+xx5*xx5+xx6*xx6)); - h->h3_term[1].c = cc2 + cc2 * (cc4/(xx2-xx4) + - 2.0*(cc5*xx2-xx6*cc6-xx5*cc5)/(xx2*xx2-2.0*xx5*xx2+xx5*xx5+xx6*xx6)); - h->h3_term[2].c = cc3 + cc3 * (cc4/(xx3-xx4) + - 2.0*(cc5*xx3-xx6*cc6-xx5*cc5)/(xx3*xx3-2.0*xx5*xx3+xx5*xx5+xx6*xx6)); - - h->h3_term[3].c = cc4 + cc4 * (cc1/(xx4-xx1) + cc2/(xx4-xx2) + cc3/(xx4-xx3)); - - h->h3_term[4].c = cc5; - h->h3_term[5].c = cc6; - div_C(cc5, cc6, xx5-xx1, xx6, &r, &i); - h->h3_term[4].c += r * cc1; - h->h3_term[5].c += i * cc1; - div_C(cc5, cc6, xx5-xx2, xx6, &r, &i); - h->h3_term[4].c += r * cc2; - h->h3_term[5].c += i * cc2; - div_C(cc5, cc6, xx5-xx3, xx6, &r, &i); - h->h3_term[4].c += r * cc3; - h->h3_term[5].c += i * cc3; - } else { - h->h3_term[0].c = cc1 + cc1 * (cc4/(xx1-xx4) + cc5/(xx1-xx5) + cc6/(xx1-xx6)); - h->h3_term[1].c = cc2 + cc2 * (cc4/(xx2-xx4) + cc5/(xx2-xx5) + cc6/(xx2-xx6)); - h->h3_term[2].c = cc3 + cc3 * (cc4/(xx3-xx4) + cc5/(xx3-xx5) + cc6/(xx3-xx6)); - - h->h3_term[3].c = cc4 + cc4 * (cc1/(xx4-xx1) + cc2/(xx4-xx2) + cc3/(xx4-xx3)); - h->h3_term[4].c = cc5 + cc5 * (cc1/(xx5-xx1) + cc2/(xx5-xx2) + cc3/(xx5-xx3)); - h->h3_term[5].c = cc6 + cc6 * (cc1/(xx6-xx1) + cc2/(xx6-xx2) + cc3/(xx6-xx3)); - } - - return(1); -} - -static int -update_h1C_c(TXLine *h) -{ - int i; - double d = 0; - - for (i = 0; i < 3; i++) { - h->h1_term[i].c *= h->sqtCdL; - d += h->h1_term[i].c; - } - h->h1C = d; - - for (i = 0; i < 3; i++) - h->h2_term[i].c *= h->h2_aten; - - for (i = 0; i < 6; i++) - h->h3_term[i].c *= h->h3_aten; - - return(1); -} -/**************************************************************** - y.c : Calculate the Pade Approximation of Y(s) - ****************************************************************/ - - -static double -eval2(double a, double b, double c, double x) -{ - return(a*x*x + b*x + c); -} - -/*** -static double approx1(st) - double st; -{ - double s3, s2, s1; - - s1 = st; - s2 = s1 * s1; - s3 = s2 * s1; - - return((s3 + q1*s2 + q2*s1 + q3) / (s3 + p1*s2 + p2*s1 + p3)); -} -***/ -/*** -static double approx2(st) - double st; -{ - return(1.0 + c1/(st - x1) + c2/(st - x2) + c3/(st - x3)); -} -***/ - -static void -y_pade(double R, double L, double G, double C, TXLine *h) -{ - - /* float RdL, GdC; */ - double RdL, GdC; - - sqtCdL = sqrt(C / L); - RdL = R / L; - GdC = G / C; - - mac(GdC, RdL, &b1, &b2, &b3, &b4, &b5); - - A[0][0] = 1.0 - sqrt(GdC / RdL); - A[0][1] = b1; - A[0][2] = b2; - A[0][3] = -b3; - - A[1][0] = b1; - A[1][1] = b2; - A[1][2] = b3; - A[1][3] = -b4; - - A[2][0] = b2; - A[2][1] = b3; - A[2][2] = b4; - A[2][3] = -b5; - - Gaussian_Elimination1(3); - - p3 = A[0][3]; - p2 = A[1][3]; - p1 = A[2][3]; - - q1 = p1 + b1; - q2 = b1 * p1 + p2 + b2; - q3 = p3 * sqrt(GdC / RdL); - - find_roots(p1, p2, p3, &x1, &x2, &x3); - c1 = eval2(q1 - p1, q2 - p2, q3 - p3, x1) / - eval2(3.0, 2.0 * p1, p2, x1); - c2 = eval2(q1 - p1, q2 - p2, q3 - p3, x2) / - eval2(3.0, 2.0 * p1, p2, x2); - c3 = eval2(q1 - p1, q2 - p2, q3 - p3, x3) / - eval2(3.0, 2.0 * p1, p2, x3); - - h->sqtCdL = sqtCdL; - h->h1_term[0].c = c1; - h->h1_term[1].c = c2; - h->h1_term[2].c = c3; - h->h1_term[0].x = x1; - h->h1_term[1].x = x2; - h->h1_term[2].x = x3; - -} - -static int -Gaussian_Elimination1(int dims) -{ - int i, j, k, dim; - double f; - int imax; - double max; - - dim = dims; - - for (i = 0; i < dim; i++) { - imax = i; - max = ABS(A[i][i]); - for (j = i+1; j < dim; j++) - if (ABS(A[j][i]) > max) { - imax = j; - max = ABS(A[j][i]); - } - if (max < epsi) { - fprintf(stderr, " can not choose a pivot \n"); - controlled_exit(EXIT_FAILURE); - } - if (imax != i) - for (k = i; k <= dim; k++) { - SWAP(double, A[i][k], A[imax][k]); - } - - f = 1.0 / A[i][i]; - A[i][i] = 1.0; - - for (j = i+1; j <= dim; j++) - A[i][j] *= f; - - for (j = 0; j < dim ; j++) { - if (i == j) - continue; - f = A[j][i]; - A[j][i] = 0.0; - for (k = i+1; k <= dim; k++) - A[j][k] -= f * A[i][k]; - } - } - return(1); -} - -static double root3(double a1_in, double a2_in, double a3_in, double x) -{ - double t1, t2; - - t1 = x*x*x + a1_in*x*x + a2_in*x + a3_in; - t2 = 3.0*x*x + 2.0*a1_in*x + a2_in; - - return(x - t1 / t2); -} - -static int -div3(double a1_in, double a2_in, double a3_in, - double x, double *p1_in, double *p2_in) -{ - NG_IGNORE(a2_in); - - *p1_in = a1_in + x; - *p2_in = -a3_in / x; - - return(1); -} - - -/**************************************************************** - Calculate the Maclaurin series of F(z) - - F(z) = sqrt((1+az) / (1+bz)) - = 1 + b1 z + b2 z^2 + b3 z^3 + b4 z^4 + b5 z^5 - ****************************************************************/ - -/*** -static double f3(double a, double b, double z) -{ - double t4, t3, t2, t1; - double t14, t13, t12, t11; - double sqt11; - - t1 = 1 / (1.0 + b * z); - t2 = t1 * t1; - t3 = t2 * t1; - t4 = t3 * t1; - - t11 = (1.0 + a * z) * t1; - t12 = (1.0 + a * z) * t2; - t13 = (1.0 + a * z) * t3; - t14 = (1.0 + a * z) * t4; - - sqt11 = sqrt(t11); - - - return( - -0.5 * (-2.0*a*b*t2 + 2.0*b*b*t13) * (a*t1 - b*t12) / (t11*sqt11) - +3.0/8.0 * (a*t1-b*t12)*(a*t1-b*t12)*(a*t1-b*t12) / (t11*t11*sqt11) - +0.5 * (4.0*a*b*b*t3 + 2.0*a*b*b*t3 - 6.0*b*b*b*t14) / sqt11 - -0.25 * (-2.0*a*b*t2 + 2.0*b*b*t13) * (a*t1-b*(1.0+a*z)) / - (t11*sqt11) - ); -} -***/ - -/*** -static double f2(a, b, z) - double a, b, z; -{ - double t3, t2, t1; - double t13, t12, t11; - double sqt11; - - t1 = 1 / (1.0 + b * z); - t2 = t1 * t1; - t3 = t2 * t1; - - t11 = (1.0 + a * z) * t1; - t12 = (1.0 + a * z) * t2; - t13 = (1.0 + a * z) * t3; - - sqt11 = sqrt(t11); - - return( - -0.25 * (a*t1-b*t12) * (a*t1-b*t12) / (t11*sqt11) - +0.5 * (-2.0*a*b*t2 + 2.0*b*b*t13) / sqt11 - ); -} -***/ - -static int mac(double at, double bt, double *b1_in, double *b2_in, - double *b3_in, double *b4_in, double *b5_in) - /* float at, bt; */ -{ - double a, b; - double y1, y2, y3, y4, y5; - - a = at; - b = bt; - - y1 = *b1_in = 0.5 * (a - b); - y2 = 0.5 * (3.0 * b * b - 2.0 * a * b - a * a) * y1 / (a - b); - y3 = ((3.0 * b * b + a * a) * y1 * y1 + 0.5 * (3.0 * b * b - - 2.0 * a * b - a * a) * y2) / (a - b); - y4 = ((3.0 * b * b - 3.0 * a * a) * y1 * y1 * y1 + (9.0 * b * b - + 3.0 * a * a) * y1 * y2 + 0.5 * (3.0 * b * b - 2.0 * a * b - - a * a) * y3) / (a - b); - y5 = (12.0 * a * a * y1 * y1 * y1 * y1 + y1 * y1 * y2 * ( - 18.0 * b * b - 18.0 * a * a) + (9.0 * b * b + 3.0 * a * a) * - (y2 * y2 + y1 * y3) + (3.0 * b * b + a * a) * y1 * y3 + - 0.5 * (3.0 * b * b - 2.0 * a * b - a * a) * y4) / (a - b); - - *b2_in = y2 / 2.0; - *b3_in = y3 / 6.0; - *b4_in = y4 / 24.0; - *b5_in = y5 / 120.0; - - return 1; -} - - -/**************************************************** - exp.c - ****************************************************/ - -/*** -static double exp_approx1(double st) -{ - double s3, s2, s1; - - s1 = st; - s2 = s1 * s1; - s3 = s2 * s1; - - return(exp((double) - st * tau - a0) * - (s3 + eq1*s2 + eq2*s1 + eq3) / (s3 + ep1*s2 + ep2*s1 + ep3)); -} -***/ - -static int get_c(double eq1_in, double eq2_in, double eq3_in, - double ep1_in, double ep2_in, double a, double b, double *cr, double *ci) -{ - double d, n; - - d = (3.0*(a*a-b*b)+2.0*ep1_in*a+ep2_in)*(3.0*(a*a-b*b)+2.0*ep1_in*a+ep2_in); - d += (6.0*a*b+2.0*ep1_in*b)*(6.0*a*b+2.0*ep1_in*b); - n = -(eq1_in*(a*a-b*b)+eq2_in*a+eq3_in)*(6.0*a*b+2.0*ep1_in*b); - n += (2.0*eq1_in*a*b+eq2_in*b)*(3.0*(a*a-b*b)+2.0*ep1_in*a+ep2_in); - *ci = n/d; - n = (3.0*(a*a-b*b)+2.0*ep1_in*a+ep2_in)*(eq1_in*(a*a-b*b)+eq2_in*a+eq3_in); - n += (6.0*a*b+2.0*ep1_in*b)*(2.0*eq1_in*a*b+eq2_in*b); - *cr = n/d; - - return(1); -} - -/*** -static double exp_approx2(double st) -{ - if (ifImg) - return(1.0 + ec1/(st - ex1) + 2.0*(ec2*(st-ex2)-ec3*ex3) / - ((st-ex2)*(st-ex2) + ex3*ex3)); - else - return(1.0 + ec1/(st - ex1) + ec2/(st - ex2) + ec3/(st - ex3)); -} -***/ - -static int -exp_pade(double R, double L, double G, double C, double l, TXLine *h) -{ - double RdL, GdC; - - tau = sqrt(L*C); - RdL = R / L; - GdC = G / C; - RG = R * G; - RC = R * C; - GL = G * L; - - { - double a, b, t; - double y1, y2, y3, y4, y5, y6; - - a = RdL; - b = GdC; - t = tau; - - /* - y1 = 0.5 * (a + b); - y2 = a * b - y1 * y1; - y3 = - a * b * y1 - 2.0 * y1 * y2 + y1 * y1 * y1; - y4 = 2.0 * a * b * y1 * y1 - a * b * y2 - 2.0 * y2 * y2 - - 2.0 * y1 * y3 + 5.0 * y1 * y1 * y2 - - 2.0 * y1 * y1 * y1 * y1; - y5 = 6.0 * a * b * (y1 * y2 - y1 * y1 * y1) - a * b * y3 - - 2.0 * y1 * y4 - - 6.0 * y2 * y3 + 12.0 * y2 * y2 * y1 + 7.0 * y1 * y1 * y3 - -10.0 * y1 * y1 * y1 * y2 - 8.0 * y1 * y1 * y1 * y2 - + 6.0 * y1 * y1 * y1 * y1 * y1; - y6 = 24.0 * a * b * y1 * y1 * y1 * y1 - 36.0 * a * b * y1 * y1 * y2 - + 6.0 * a * b * y2 * y2 + 8.0 * a * b * y1 * y3 - 2.0 * y2 * y4 - - 2.0 * y1 * y5 + 2.0 * y1 * y1 * y4 - a * b * y4 -6.0 * y3 * y3 - + 44.0 * y1 * y2 * y3 + 60.0 * y1 * y1 * y1 * y1 * y2 - -24.0 * y1 * y1 * y1 * y1 * y1 * y1 + 12.0 * y2 * y2 * y2 - -54.0 * y1 * y1 * y2 * y2 + 7.0 * y1 * y1 * y4 - -24.0 * y1 * y1 * y1 * y3 - 24.0 * y1 * y1 * y2 * y2 - -8.0 * y1 * y1 * y1 * y3 + 24.0 * y1 * y1 * y1 * y1 * y2 - - 6.0 * y2 * y4; - */ - - y1 = 0.5 * (a + b); - y2 = a * b - y1 * y1; - y3 = -3.0 * y1 * y2; - y4 = -3.0 * y2 * y2 - 4.0 * y1 * y3; - y5 = - 5.0 * y1 * y4 -10.0 * y2 * y3; - y6 = -10.0 * y3 * y3 - 15.0 * y2 * y4 - 6.0 * y1 * y5; - - a0 = y1 * t; - a1 = y2 * t * t / 2.0; - a2 = y3 * t * t * t / 6.0; - a3 = y4 * t * t * t * t / 24.0; - a4 = y5 * t * t * t * t * t / 120.0; - a5 = y6 * t * t * t * t * t * t / 720.0; - - } - - a0 *= l; - a1 *= l; - a2 *= l; - a3 *= l; - a4 *= l; - a5 *= l; - - pade(l); - - h->taul = tau * l; - h->h2_aten = exp(- a0); - h->h2_term[0].c = ec1; - h->h2_term[1].c = ec2; - h->h2_term[2].c = ec3; - h->h2_term[0].x = ex1; - h->h2_term[1].x = ex2; - h->h2_term[2].x = ex3; - - return(ifImg); -} - -static int pade(double l) -{ - int i, j; - double a[6]; - double b[6]; - - a[1] = -a1; - a[2] = -a2; - a[3] = -a3; - a[4] = -a4; - a[5] = -a5; - - b[0] = 1.0; - b[1] = a[1]; - for (i = 2; i <= 5; i++) { - b[i] = 0.0; - for (j = 1; j <= i; j++) - b[i] += j * a[j] * b[i-j]; - b[i] = b[i] / (double) i; - } - - AA[0][0] = 1.0 - exp(a0 - l * sqrt(RG)); - AA[0][1] = b[1]; - AA[0][2] = b[2]; - AA[0][3] = -b[3]; - - AA[1][0] = b[1]; - AA[1][1] = b[2]; - AA[1][2] = b[3]; - AA[1][3] = -b[4]; - - AA[2][0] = b[2]; - AA[2][1] = b[3]; - AA[2][2] = b[4]; - AA[2][3] = -b[5]; - - Gaussian_Elimination2(3); - - ep3 = AA[0][3]; - ep2 = AA[1][3]; - ep1 = AA[2][3]; - - eq1 = ep1 + b[1]; - eq2 = b[1] * ep1 + ep2 + b[2]; - eq3 = ep3 * exp(a0 - l * sqrt(RG)); - - ep3 = ep3 / (tau*tau*tau); - ep2 = ep2 / (tau*tau); - ep1 = ep1 / tau; - eq3 = eq3 / (tau*tau*tau); - eq2 = eq2 / (tau*tau); - eq1 = eq1 / tau; - /* - printf("factor = %e\n", exp(-a0)); - printf("ep1 = %e ep2 = %e ep3 = %e\n", ep1, ep2, ep3); - */ - exp_find_roots(ep1, ep2, ep3, &ex1, &ex2, &ex3); - /* - printf("roots are %e %e %e \n", ex1, ex2, ex3); - */ - ec1 = eval2(eq1 - ep1, eq2 - ep2, eq3 - ep3, ex1) / - eval2(3.0, 2.0 * ep1, ep2, ex1); - if (ifImg) - get_c(eq1 - ep1, eq2 - ep2, eq3 - ep3, ep1, ep2, ex2, ex3, &ec2, &ec3); - else { - ec2 = eval2(eq1 - ep1, eq2 - ep2, eq3 - ep3, ex2) / - eval2(3.0, 2.0 * ep1, ep2, ex2); - ec3 = eval2(eq1 - ep1, eq2 - ep2, eq3 - ep3, ex3) / - eval2(3.0, 2.0 * ep1, ep2, ex3); - } - return (1); -} - -static int -Gaussian_Elimination2(int dims) -{ - int i, j, k, dim; - double f; - double max; - int imax; - - dim = dims; - - for (i = 0; i < dim; i++) { - imax = i; - max = ABS(AA[i][i]); - for (j = i+1; j < dim; j++) - if (ABS(AA[j][i]) > max) { - imax = j; - max = ABS(AA[j][i]); - } - if (max < epsi2) { - fprintf(stderr, " can not choose a pivot \n"); - controlled_exit(EXIT_FAILURE); - } - if (imax != i) - for (k = i; k <= dim; k++) { - SWAP(double, AA[i][k], AA[imax][k]); - } - - f = 1.0 / AA[i][i]; - AA[i][i] = 1.0; - - for (j = i+1; j <= dim; j++) - AA[i][j] *= f; - - for (j = 0; j < dim ; j++) { - if (i == j) - continue; - f = AA[j][i]; - AA[j][i] = 0.0; - for (k = i+1; k <= dim; k++) - AA[j][k] -= f * AA[i][k]; - } - } - return(1); -} - -/*** -static int -exp_div3(double a1, double a2, double a3, double x, - double *p1, double *p2) - { - *p1 = a1 + x; - *p2 = - a3 / x; - - return(1); -} -***/ - -/*** - ***/ - -static int exp_find_roots(double a1_in, double a2_in, double a3_in, - double *ex1_in, double *ex2_in, double *ex3_in) -{ - double x, t; - double p, q; - - q = (a1_in*a1_in-3.0*a2_in) / 9.0; - p = (2.0*a1_in*a1_in*a1_in-9.0*a1_in*a2_in+27.0*a3_in) / 54.0; - t = q*q*q - p*p; - if (t >= 0.0) { - t = acos(p /(q * sqrt(q))); - x = -2.0*sqrt(q)*cos(t / 3.0) - a1_in/3.0; - } else { - if (p > 0.0) { - t = pow(sqrt(-t)+p, 1.0 / 3.0); - x = -(t + q / t) - a1_in/3.0; - } else if (p == 0.0) { - x = -a1_in/3.0; - } else { - t = pow(sqrt(-t)-p, 1.0 / 3.0); - x = (t + q / t) - a1_in/3.0; - } - } - { - double ex1a; - int i = 0; - ex1a = x; - for (t = root3(a1_in, a2_in, a3_in, x); ABS(t-x) > 5.0e-4; - t = root3(a1_in, a2_in, a3_in, x)) { - if (++i == 32) { - x = ex1a; - break; - } - else { - x = t; - } - } - } - /*** - x = a1; - for (t = root3(a1, a2, a3, x); ABS(t-x) > epsi2; - t = root3(a1, a2, a3, x)) { - x = t; - i++; - if (i > 1000) { - x = 0.5 * (x + root3(a1, a2, a3, x)); - j++; - if (j == 3) - break; - i = 0; - } - } - ***/ - *ex1_in = x; - div3(a1_in, a2_in, a3_in, x, &a1_in, &a2_in); - - t = a1_in * a1_in - 4.0 * a2_in; - if (t < 0) { - ifImg = 1; - printf("***** Two Imaginary Roots.\n"); - *ex3_in = 0.5 * sqrt(-t); - *ex2_in = -0.5 * a1_in; - } else { - ifImg = 0; - t *= 1.0e-16; - t = sqrt(t)*1.0e8; - if (a1_in >= 0.0) - *ex2_in = t = -0.5 * (a1_in + t); - else - *ex2_in = t = -0.5 * (a1_in - t); - *ex3_in = a2_in / t; - /* - *ex2 = 0.5 * (-a1 + t); - *ex3 = 0.5 * (-a1 - t); - */ - } - - return(1); -} -static NDnamePt -insert_ND(char *name, NDnamePt *ndn) -{ - int cmp; - NDnamePt p; - - if (*ndn == NULL) { - p = *ndn = TMALLOC(NDname, 1); - p->nd = NULL; - p->right = p->left = NULL; - strcpy(p->id, name); - return(p); - } - cmp = strcmp((*ndn)->id, name); - if (cmp == 0) - return(*ndn); - else { - if (cmp < 0) - return(insert_ND(name, &((*ndn)->left))); - else - return(insert_ND(name, &((*ndn)->right))); - } -} - - -static NODE -*insert_node(char *name) -{ - NDnamePt n; - NODE *p; - - n = insert_ND(name, &ndn_btree); - if (n->nd == NULL) { - p = NEW_node(); - p->name = n; - n->nd = p; - p->next = node_tab; - node_tab = p; - return(p); - } else - return(n->nd); -} - -static NODE -*NEW_node(void) -{ - NODE *n; - - n = TMALLOC(NODE, 1); - n->mptr = NULL; - n->gptr = NULL; - n->cptr = NULL; - n->rptr = NULL; - n->tptr = NULL; - n->cplptr = NULL; - n->rlptr = NULL; - n->ddptr = NULL; - n->cvccsptr = NULL; - n->vccsptr = NULL; - n->CL = 0.0; - n->V = n->dv = 0.0; - n->gsum = n->cgsum = 0; - n->is = 0; - n->tag = 0; - n->flag = 0; - n->region = NULL; - n->ofile = NULL; - n->dvtag = 0; - - return(n); -} - -static int find_roots(double a1_in, double a2_in, double a3_in, - double *x1r, double *x2r, double *x3r) -{ - double x, t; - double p, q; - - q = (a1_in*a1_in-3.0*a2_in) / 9.0; - p = (2.0*a1_in*a1_in*a1_in-9.0*a1_in*a2_in+27.0*a3_in) / 54.0; - t = q*q*q - p*p; - if (t >= 0.0) { - t = acos(p /(q * sqrt(q))); - x = -2.0*sqrt(q)*cos(t / 3.0) - a1_in/3.0; - } else { - if (p > 0.0) { - t = pow(sqrt(-t)+p, 1.0 / 3.0); - x = -(t + q / t) - a1_in/3.0; - } else if (p == 0.0) { - x = -a1_in/3.0; - } else { - t = pow(sqrt(-t)-p, 1.0 / 3.0); - x = (t + q / t) - a1_in/3.0; - } - } - { - double x_backup = x; - int i = 0; - for (t = root3(a1_in, a2_in, a3_in, x); ABS(t-x) > 5.0e-4; - t = root3(a1_in, a2_in, a3_in, x)) - if (++i == 32) { - x = x_backup; - break; - } else - x = t; - } - /* - x = a1; - i = 0; - j = 0; - for (t = root3(a1, a2, a3, x); ABS(t-x) > epsi; - t = root3(a1, a2, a3, x)) { - x = t; - i++; - if (i > 1000) { - x = 0.5 * (x + root3(a1, a2, a3, x)); - j++; - if (j == 3) - break; - i = 0; - } - } - */ - - *x1r = x; - div3(a1_in, a2_in, a3_in, x, &a1_in, &a2_in); - - t = a1_in * a1_in - 4.0 * a2_in; - if (t < 0) { - printf("***** Two Imaginary Roots in Characteristic Admittance.\n"); - controlled_exit(EXIT_FAILURE); - } - - t *= 1.0e-18; - t = sqrt(t) * 1.0e9; - if (a1_in >= 0.0) - *x2r = t = -0.5 * (a1_in + t); - else - *x2r = t = -0.5 * (a1_in - t); - *x3r = a2_in / t; - /* - *x2 = 0.5 * (-a1 + t); - *x3 = 0.5 * (-a1 - t); - */ - return(1); -} - -int -TXLdevDelete(GENinstance* inst) -{ - VI_list_txl *tmplist, *prevlist; - TXLinstance* here = (TXLinstance*)inst; - if (here->txline2) - tfree(here->txline2); - if (here->txline) { - prevlist = tmplist = here->txline->vi_head; - while(tmplist) { - tmplist = tmplist->next; - tfree(prevlist); - prevlist = tmplist; - } - tfree(here->txline); - } - return OK; -} diff --git a/src/spicelib/devices/urc/Makefile.am b/src/spicelib/devices/urc/Makefile.am deleted file mode 100644 index 232d508ef..000000000 --- a/src/spicelib/devices/urc/Makefile.am +++ /dev/null @@ -1,22 +0,0 @@ -## Process this file with automake to produce Makefile.in - -noinst_LTLIBRARIES = liburc.la - -liburc_la_SOURCES = \ - urc.c \ - urcask.c \ - urcdefs.h \ - urcext.h \ - urcinit.c \ - urcinit.h \ - urcitf.h \ - urcmask.c \ - urcmpar.c \ - urcparam.c \ - urcsetup.c - - - -AM_CPPFLAGS = @AM_CPPFLAGS@ -I$(top_srcdir)/src/include -AM_CFLAGS = $(STATIC) -MAINTAINERCLEANFILES = Makefile.in diff --git a/src/spicelib/devices/urc/urc.c b/src/spicelib/devices/urc/urc.c deleted file mode 100644 index 238220fa0..000000000 --- a/src/spicelib/devices/urc/urc.c +++ /dev/null @@ -1,39 +0,0 @@ -/********** -Copyright 1990 Regents of the University of California. All rights reserved. -Author: 1987 Thomas L. Quarles -**********/ - -#include "ngspice/ngspice.h" -#include "ngspice/devdefs.h" -#include "urcdefs.h" -#include "ngspice/suffix.h" - -IFparm URCpTable[] = { /* parameters */ - IOPU( "l", URC_LEN, IF_REAL, "Length of transmission line"), - IOPU( "n", URC_LUMPS, IF_INTEGER, "Number of lumps"), - OPU( "pos_node",URC_POS_NODE,IF_INTEGER,"Positive node of URC"), - OPU( "neg_node",URC_NEG_NODE,IF_INTEGER,"Negative node of URC"), - OPU( "gnd", URC_GND_NODE,IF_INTEGER,"Ground node of URC") -}; - -IFparm URCmPTable[] = { /* model parameters */ - IOP( "k", URC_MOD_K, IF_REAL, "Propagation constant"), - IOPA( "fmax", URC_MOD_FMAX, IF_REAL, "Maximum frequency of interest"), - IOP( "rperl", URC_MOD_RPERL, IF_REAL, "Resistance per unit length"), - IOPA( "cperl", URC_MOD_CPERL, IF_REAL, "Capacitance per unit length"), - IOP( "isperl", URC_MOD_ISPERL, IF_REAL, "Saturation current per length"), - IOP( "rsperl", URC_MOD_RSPERL, IF_REAL, "Diode resistance per length"), - IP( "urc", URC_MOD_URC, IF_FLAG, "Uniform R.C. line model") -}; - -char *URCnames[] = { - "P1", - "P2", - "Ref" -}; - -int URCnSize = NUMELEMS(URCnames); -int URCpTSize = NUMELEMS(URCpTable); -int URCmPTSize = NUMELEMS(URCmPTable); -int URCiSize = sizeof(URCinstance); -int URCmSize = sizeof(URCmodel); diff --git a/src/spicelib/devices/urc/urcask.c b/src/spicelib/devices/urc/urcask.c deleted file mode 100644 index 702b454cf..000000000 --- a/src/spicelib/devices/urc/urcask.c +++ /dev/null @@ -1,52 +0,0 @@ -/********** -Copyright 1990 Regents of the University of California. All rights reserved. -Author: 1987 Thomas L. Quarles -**********/ -/* - */ - - -/* - * This routine gives access to the internal device parameters - * of Uniform distributed RC lines - */ - -#include "ngspice/ngspice.h" -#include "ngspice/cktdefs.h" -#include "ngspice/devdefs.h" -#include "ngspice/ifsim.h" -#include "urcdefs.h" -#include "ngspice/sperror.h" -#include "ngspice/suffix.h" - - -/* ARGSUSED */ -int -URCask(CKTcircuit *ckt, GENinstance *inst, int which, IFvalue *value, IFvalue *select) -{ - URCinstance *here = (URCinstance *)inst; - - NG_IGNORE(select); - NG_IGNORE(ckt); - - switch(which) { - case URC_POS_NODE: - value->iValue = here->URCposNode; - return (OK); - case URC_NEG_NODE: - value->iValue = here->URCnegNode; - return (OK); - case URC_GND_NODE: - value->iValue = here->URCgndNode; - return (OK); - case URC_LEN: - value->rValue = here->URClength; - return (OK); - case URC_LUMPS: - value->iValue = here->URClumps; - return (OK); - default: - return (E_BADPARM); - } - /* NOTREACHED */ -} diff --git a/src/spicelib/devices/urc/urcdefs.h b/src/spicelib/devices/urc/urcdefs.h deleted file mode 100644 index 3dddbd82f..000000000 --- a/src/spicelib/devices/urc/urcdefs.h +++ /dev/null @@ -1,91 +0,0 @@ -/********** -Copyright 1990 Regents of the University of California. All rights reserved. -Author: 1985 Thomas L. Quarles -**********/ - -#ifndef URC -#define URC - - -#include "ngspice/ifsim.h" -#include "ngspice/cktdefs.h" -#include "ngspice/gendefs.h" -#include "ngspice/complex.h" - - /* - * structures used to describe uniform RC lines - */ - -/* information needed for each instance */ - -typedef struct sURCinstance { - - struct GENinstance gen; - -#define URCmodPtr(inst) ((struct sURCmodel *)((inst)->gen.GENmodPtr)) -#define URCnextInstance(inst) ((struct sURCinstance *)((inst)->gen.GENnextInstance)) -#define URCname gen.GENname -#define URCstate gen.GENstate - - const int URCposNode; /* number of positive node of URC */ - const int URCnegNode; /* number of negative node of URC */ - const int URCgndNode; /* number of the "ground" node of the URC */ - - double URClength; /* length of line */ - int URClumps; /* number of lumps in line */ - unsigned URClenGiven : 1; /* flag to indicate length was specified */ - unsigned URClumpsGiven : 1; /* flag to indicate lumps was specified */ -} URCinstance ; - -/* per model data */ - -typedef struct sURCmodel { /* model structure for a resistor */ - - struct GENmodel gen; - -#define URCmodType gen.GENmodType -#define URCnextModel(inst) ((struct sURCmodel *)((inst)->gen.GENnextModel)) -#define URCinstances(inst) ((URCinstance *)((inst)->gen.GENinstances)) -#define URCmodName gen.GENmodName - - double URCk; /* propagation constant for URC */ - double URCfmax; /* max frequence of interest */ - double URCrPerL; /* resistance per unit length */ - double URCcPerL; /* capacitance per unit length */ - double URCisPerL; /* diode saturation current per unit length */ - double URCrsPerL; /* diode resistance per unit length */ - unsigned URCkGiven : 1; /* flag to indicate k was specified */ - unsigned URCfmaxGiven : 1; /* flag to indicate fmax was specified */ - unsigned URCrPerLGiven : 1; /* flag to indicate rPerL was specified */ - unsigned URCcPerLGiven : 1; /* flag to indicate cPerL was specified */ - unsigned URCisPerLGiven : 1; /* flag to indicate isPerL was specified */ - unsigned URCrsPerLGiven : 1; /* flag to indicate rsPerL was specified */ -} URCmodel; - -/* device parameters */ -enum { - URC_LEN = 1, - URC_LUMPS, - URC_POS_NODE, - URC_NEG_NODE, - URC_GND_NODE, -}; - -/* model parameters */ -enum { - URC_MOD_K = 101, - URC_MOD_FMAX, - URC_MOD_RPERL, - URC_MOD_CPERL, - URC_MOD_ISPERL, - URC_MOD_RSPERL, - URC_MOD_URC, -}; - -/* device questions */ - -/* model questions */ - -#include "urcext.h" - -#endif /*URC*/ diff --git a/src/spicelib/devices/urc/urcext.h b/src/spicelib/devices/urc/urcext.h deleted file mode 100644 index f7880251c..000000000 --- a/src/spicelib/devices/urc/urcext.h +++ /dev/null @@ -1,15 +0,0 @@ -/********** -Copyright 1990 Regents of the University of California. All rights reserved. -Author: 1985 Thomas L. Quarles -**********/ -#ifndef _URCEXT_H -#define _URCEXT_H - -extern int URCask(CKTcircuit*,GENinstance*,int,IFvalue*,IFvalue*); -extern int URCmAsk(CKTcircuit*,GENmodel*,int,IFvalue*); -extern int URCmParam(int,IFvalue*,GENmodel*); -extern int URCparam(int,IFvalue*,GENinstance*,IFvalue*); -extern int URCsetup(SMPmatrix*,GENmodel*,CKTcircuit*,int*); -extern int URCunsetup(GENmodel*,CKTcircuit*); - -#endif diff --git a/src/spicelib/devices/urc/urcinit.c b/src/spicelib/devices/urc/urcinit.c deleted file mode 100644 index 1fa5ffd6b..000000000 --- a/src/spicelib/devices/urc/urcinit.c +++ /dev/null @@ -1,76 +0,0 @@ -#include "ngspice/config.h" - -#include "ngspice/devdefs.h" - -#include "urcitf.h" -#include "urcext.h" -#include "urcinit.h" - - -SPICEdev URCinfo = { - .DEVpublic = { - .name = "URC", - .description = "Uniform R.C. line", - .terms = &URCnSize, - .numNames = &URCnSize, - .termNames = URCnames, - .numInstanceParms = &URCpTSize, - .instanceParms = URCpTable, - .numModelParms = &URCmPTSize, - .modelParms = URCmPTable, - .flags = 0, - -#ifdef XSPICE - .cm_func = NULL, - .num_conn = 0, - .conn = NULL, - .num_param = 0, - .param = NULL, - .num_inst_var = 0, - .inst_var = NULL, -#endif - }, - - .DEVparam = URCparam, - .DEVmodParam = URCmParam, - .DEVload = NULL, - .DEVsetup = URCsetup, - .DEVunsetup = URCunsetup, - .DEVpzSetup = URCsetup, - .DEVtemperature = NULL, - .DEVtrunc = NULL, - .DEVfindBranch = NULL, - .DEVacLoad = NULL, - .DEVaccept = NULL, - .DEVdestroy = NULL, - .DEVmodDelete = NULL, - .DEVdelete = NULL, - .DEVsetic = NULL, - .DEVask = URCask, - .DEVmodAsk = URCmAsk, - .DEVpzLoad = NULL, - .DEVconvTest = NULL, - .DEVsenSetup = NULL, - .DEVsenLoad = NULL, - .DEVsenUpdate = NULL, - .DEVsenAcLoad = NULL, - .DEVsenPrint = NULL, - .DEVsenTrunc = NULL, - .DEVdisto = NULL, - .DEVnoise = NULL, - .DEVsoaCheck = NULL, - .DEVinstSize = &URCiSize, - .DEVmodSize = &URCmSize, - -#ifdef CIDER - .DEVdump = NULL, - .DEVacct = NULL, -#endif -}; - - -SPICEdev * -get_urc_info(void) -{ - return &URCinfo; -} diff --git a/src/spicelib/devices/urc/urcinit.h b/src/spicelib/devices/urc/urcinit.h deleted file mode 100644 index 845e6e459..000000000 --- a/src/spicelib/devices/urc/urcinit.h +++ /dev/null @@ -1,13 +0,0 @@ -#ifndef _URCINIT_H -#define _URCINIT_H - -extern IFparm URCpTable[ ]; -extern IFparm URCmPTable[ ]; -extern char *URCnames[ ]; -extern int URCpTSize; -extern int URCmPTSize; -extern int URCnSize; -extern int URCiSize; -extern int URCmSize; - -#endif diff --git a/src/spicelib/devices/urc/urcitf.h b/src/spicelib/devices/urc/urcitf.h deleted file mode 100644 index 8cd534c75..000000000 --- a/src/spicelib/devices/urc/urcitf.h +++ /dev/null @@ -1,9 +0,0 @@ -/********** -Copyright 1990 Regents of the University of California. All rights reserved. -**********/ -#ifndef DEV_URC -#define DEV_URC - -extern SPICEdev *get_urc_info(void); - -#endif diff --git a/src/spicelib/devices/urc/urcmask.c b/src/spicelib/devices/urc/urcmask.c deleted file mode 100644 index 98a0f0511..000000000 --- a/src/spicelib/devices/urc/urcmask.c +++ /dev/null @@ -1,53 +0,0 @@ -/********** -Copyright 1990 Regents of the University of California. All rights reserved. -Author: 1987 Thomas L. Quarles -**********/ -/* - */ - -/* - * This routine gives access to the internal model parameters - * of Uniform distributed RC lines - */ - -#include "ngspice/ngspice.h" -#include "ngspice/cktdefs.h" -#include "ngspice/devdefs.h" -#include "ngspice/ifsim.h" -#include "urcdefs.h" -#include "ngspice/sperror.h" -#include "ngspice/suffix.h" - - -/* ARGSUSED */ -int -URCmAsk(CKTcircuit *ckt, GENmodel *inst, int which, IFvalue *value) -{ - URCmodel *here = (URCmodel *)inst; - - NG_IGNORE(ckt); - - switch(which) { - case URC_MOD_K: - value->rValue = here->URCk; - return (OK); - case URC_MOD_FMAX: - value->rValue = here->URCfmax; - return (OK); - case URC_MOD_RPERL: - value->rValue = here->URCrPerL; - return (OK); - case URC_MOD_CPERL: - value->rValue = here->URCcPerL; - return (OK); - case URC_MOD_ISPERL: - value->rValue = here->URCisPerL; - return (OK); - case URC_MOD_RSPERL: - value->rValue = here->URCrsPerL; - return (OK); - default: - return (E_BADPARM); - } - /* NOTREACHED */ -} diff --git a/src/spicelib/devices/urc/urcmpar.c b/src/spicelib/devices/urc/urcmpar.c deleted file mode 100644 index df429a96f..000000000 --- a/src/spicelib/devices/urc/urcmpar.c +++ /dev/null @@ -1,52 +0,0 @@ -/********** -Copyright 1990 Regents of the University of California. All rights reserved. -Author: 1987 Thomas L. Quarles -**********/ -/* - */ - -#include "ngspice/ngspice.h" -#include "urcdefs.h" -#include "ngspice/ifsim.h" -#include "ngspice/sperror.h" -#include "ngspice/suffix.h" - - -int -URCmParam(int param, IFvalue *value, GENmodel *inModel) -{ - URCmodel *model = (URCmodel *)inModel; - switch(param) { - case URC_MOD_K: - model->URCk = value->rValue; - model->URCkGiven = TRUE; - break; - case URC_MOD_FMAX: - model->URCfmax = value->rValue; - model->URCfmaxGiven = TRUE; - break; - case URC_MOD_RPERL: - model->URCrPerL = value->rValue; - model->URCrPerLGiven = TRUE; - break; - case URC_MOD_CPERL: - model->URCcPerL = value->rValue; - model->URCcPerLGiven = TRUE; - break; - case URC_MOD_ISPERL: - model->URCisPerL = value->rValue; - model->URCisPerLGiven = TRUE; - break; - case URC_MOD_RSPERL: - model->URCrsPerL = value->rValue; - model->URCrsPerLGiven = TRUE; - break; - case URC_MOD_URC: - /* no operation - already know we are a URC, but this makes*/ - /* spice-2 like parsers happy */ - break; - default: - return(E_BADPARM); - } - return(OK); -} diff --git a/src/spicelib/devices/urc/urcparam.c b/src/spicelib/devices/urc/urcparam.c deleted file mode 100644 index dd9799a37..000000000 --- a/src/spicelib/devices/urc/urcparam.c +++ /dev/null @@ -1,36 +0,0 @@ -/********** -Copyright 1990 Regents of the University of California. All rights reserved. -Author: 1987 Thomas L. Quarles -**********/ -/* - */ - -#include "ngspice/ngspice.h" -#include "ngspice/ifsim.h" -#include "urcdefs.h" -#include "ngspice/sperror.h" -#include "ngspice/suffix.h" - - -/* ARGSUSED */ -int -URCparam(int param, IFvalue *value, GENinstance *inst, IFvalue *select) -{ - URCinstance *here = (URCinstance *)inst; - - NG_IGNORE(select); - - switch(param) { - case URC_LEN: - here->URClength = value->rValue; - here->URClenGiven = TRUE; - break; - case URC_LUMPS: - here->URClumps = value->iValue; - here->URClumpsGiven = TRUE; - break; - default: - return(E_BADPARM); - } - return(OK); -} diff --git a/src/spicelib/devices/urc/urcsetup.c b/src/spicelib/devices/urc/urcsetup.c deleted file mode 100644 index 0a7adbc30..000000000 --- a/src/spicelib/devices/urc/urcsetup.c +++ /dev/null @@ -1,322 +0,0 @@ -/********** -Copyright 1990 Regents of the University of California. All rights reserved. -Author: 1987 Thomas L. Quarles -**********/ - -#include "ngspice/ngspice.h" -#include "ngspice/ifsim.h" -#include "urcdefs.h" -#include "ngspice/cktdefs.h" -#include "ngspice/gendefs.h" -#include "ngspice/sperror.h" -#include "ngspice/suffix.h" - -/* ARGSUSED */ -int -URCsetup(SMPmatrix *matrix, GENmodel *inModel, CKTcircuit *ckt, int *state) - /* create the resistors/capacitors used to model the URC - */ -{ - URCmodel *model = (URCmodel *)inModel; - URCinstance *here; - int rtype; - int ctype; - int dtype; - CKTnode * lowl; - CKTnode * lowr; - CKTnode * hil; - CKTnode * hir; - char *nameelt; - char *namehi; - CKTnode *nodehi; - CKTnode *nodelo; - char *namelo; - double r; - double c; - IFvalue ptemp; - double p; - double r0; - double c0; - double i0; - double r1; - double c1; - double i1; - double rd; - double wnorm; - double prop; - int i; - GENinstance *fast; - GENmodel *modfast; /* capacitor or diode model */ - GENmodel *rmodfast; /* resistor model */ - int error; - IFuid dioUid; - IFuid resUid; - IFuid capUid; - IFuid eltUid; - - NG_IGNORE(state); - NG_IGNORE(matrix); - - rtype = CKTtypelook("Resistor"); - ctype = CKTtypelook("Capacitor"); - dtype = CKTtypelook("Diode"); - /* loop through all the URC models */ - for( ; model != NULL; model = URCnextModel(model)) { - if(!model->URCkGiven) - model->URCk = 1.5; - if(!model->URCfmaxGiven) - model->URCfmax = 1e9; - if(!model->URCrPerLGiven) - model->URCrPerL = 1000; - if(!model->URCcPerLGiven) - model->URCcPerL = 1e-12; - -/* may need to put in limits: k>=1.1, freq <=1e9, rperl >=.1 */ - - /* loop through all the instances of the model */ - for (here = URCinstances(model); here != NULL ; - here=URCnextInstance(here)) - { - p = model->URCk; - r0 = here->URClength * model->URCrPerL; - c0 = here->URClength * model->URCcPerL; - i0 = here->URClength * model->URCisPerL; - if(!here->URClumpsGiven) { - wnorm = model->URCfmax * r0 * c0 * 2.0 * M_PI; - here->URClumps=(int)MAX(3.0,log(wnorm*(((p-1)/p)*((p-1)/p)))/log(p)); - if(wnorm <35) here->URClumps=3; - /* may want to limit lumps to <= 100 or something like that */ - } - r1 = (r0*(p-1))/((2*(pow(p,(double)here->URClumps)))-2); - c1 = (c0 * (p-1))/((pow(p,(double)(here->URClumps-1)))*(p+1)-2); - i1 = (i0 * (p-1))/((pow(p,(double)(here->URClumps-1)))*(p+1)-2); - rd = here->URClength * here->URClumps * model->URCrsPerL; - /* may want to check that c1 > 0 */ - prop=1; - - if(model->URCisPerLGiven) { - error = SPfrontEnd->IFnewUid (ckt, &dioUid, here->URCname, - "diodemod", UID_MODEL, NULL); - if(error) return(error); - modfast = NULL; - error = CKTmodCrt(ckt,dtype,&modfast, - dioUid); - if(error) return(error); - ptemp.rValue = c1; - error= CKTpModName("cjo",&ptemp,ckt,dtype,dioUid,&modfast); - if(error) return(error); - ptemp.rValue = rd; - error = CKTpModName("rs",&ptemp,ckt,dtype,dioUid,&modfast); - if(error) return(error); - ptemp.rValue = i1; - error = CKTpModName("is",&ptemp,ckt,dtype,dioUid,&modfast); - if(error) return(error); - } else { - error = SPfrontEnd->IFnewUid (ckt, &capUid, - here->URCname, "capmod", UID_MODEL, NULL); - if(error) return(error); - modfast = NULL; - error = CKTmodCrt(ckt,ctype,&modfast, - capUid); - if(error) return(error); - } - - error = SPfrontEnd->IFnewUid (ckt, &resUid, here->URCname, - "resmod", UID_MODEL, NULL); - if(error) return(error); - rmodfast = NULL; - error = CKTmodCrt(ckt,rtype,&rmodfast,resUid); - if(error) return(error); - lowl = CKTnum2nod(ckt,here->URCposNode); - hir = CKTnum2nod(ckt,here->URCnegNode); - for(i=1;i<=here->URClumps;i++) { - namehi = tprintf("hi%d", i); - error = CKTmkVolt(ckt, &nodehi, here->URCname, namehi); - if(error) return(error); - hil = nodehi; - if(i==here->URClumps) { - lowr = hil; - } else { - namelo = tprintf("lo%d", i); - error = CKTmkVolt(ckt, &nodelo, here->URCname, - namelo); - if(error) return(error); - lowr = nodelo; - } - r = prop*r1; - c = prop*c1; - - nameelt = tprintf("rlo%d", i); - error = SPfrontEnd->IFnewUid (ckt, &eltUid, here->URCname, - nameelt, UID_INSTANCE, NULL); - if(error) return(error); - error = CKTcrtElt(ckt,rmodfast, - &fast,eltUid); - if(error) return(error); - error = CKTbindNode(ckt,fast,1,lowl); - if(error) return(error); - error = CKTbindNode(ckt,fast,2,lowr); - if(error) return(error); - ptemp.rValue = r; - error = CKTpName("resistance",&ptemp,ckt,rtype,nameelt,&fast); - if(error) return(error); - - nameelt = tprintf("rhi%d", i); - error = SPfrontEnd->IFnewUid (ckt, &eltUid, here->URCname, - nameelt, UID_INSTANCE, NULL); - if(error) return(error); - error = CKTcrtElt(ckt,rmodfast, - &fast,eltUid); - if(error) return(error); - error = CKTbindNode(ckt,fast,1,hil); - if(error) return(error); - error = CKTbindNode(ckt,fast,2,hir); - if(error) return(error); - ptemp.rValue = r; - error = CKTpName("resistance",&ptemp,ckt,rtype,nameelt,&fast); - if(error) return(error); - - if(model->URCisPerLGiven) { - /* use diode */ - nameelt = tprintf("dlo%d", i); - error = SPfrontEnd->IFnewUid (ckt, &eltUid, - here->URCname,nameelt,UID_INSTANCE, - NULL); - if(error) return(error); - error = CKTcrtElt(ckt,modfast, - &fast, eltUid); - if(error) return(error); - error = CKTbindNode(ckt,fast,1,lowr); - if(error) return(error); - error = CKTbindNode(ckt,fast,2, - CKTnum2nod(ckt, here->URCgndNode)); - if(error) return(error); - ptemp.rValue = prop; - error = CKTpName("area",&ptemp,ckt,dtype,nameelt,&fast); - if(error) return(error); - } else { - /* use simple capacitor */ - nameelt = tprintf("clo%d", i); - error = SPfrontEnd->IFnewUid (ckt, &eltUid, here->URCname - ,nameelt, UID_INSTANCE, NULL); - if(error) return(error); - error = CKTcrtElt(ckt,modfast, - &fast, eltUid); - if(error) return(error); - error = CKTbindNode(ckt,fast,1,lowr); - if(error) return(error); - error = CKTbindNode(ckt,fast,2, - CKTnum2nod(ckt, here->URCgndNode)); - if(error) return(error); - ptemp.rValue = c; - error = CKTpName("capacitance",&ptemp,ckt,ctype,nameelt, - &fast); - if(error) return(error); - } - - if(i!=here->URClumps){ - if(model->URCisPerLGiven) { - /* use diode */ - nameelt = tprintf("dhi%d", i); - error = SPfrontEnd->IFnewUid (ckt, &eltUid, - here->URCname,nameelt,UID_INSTANCE, - NULL); - if(error) return(error); - error = CKTcrtElt(ckt,modfast, - &fast,eltUid); - if(error) return(error); - error = CKTbindNode(ckt,fast,1,hil); - if(error) return(error); - error = CKTbindNode(ckt,fast,2, - CKTnum2nod(ckt, here->URCgndNode)); - if(error) return(error); - ptemp.rValue = prop; - error=CKTpName("area",&ptemp,ckt,dtype,nameelt,&fast); - if(error) return(error); - } else { - /* use simple capacitor */ - nameelt = tprintf("chi%d", i); - error = SPfrontEnd->IFnewUid (ckt, &eltUid, - here->URCname,nameelt,UID_INSTANCE, - NULL); - if(error) return(error); - error = CKTcrtElt(ckt,modfast, - &fast,eltUid); - if(error) return(error); - error = CKTbindNode(ckt,fast,1,hil); - if(error) return(error); - error = CKTbindNode(ckt,fast,2, - CKTnum2nod(ckt, here->URCgndNode)); - if(error) return(error); - ptemp.rValue = c; - error =CKTpName("capacitance",&ptemp,ckt,ctype,nameelt, - &fast); - if(error) return(error); - } - } - prop *= p; - lowl = lowr; - hir = hil; - } - } - } - return(OK); -} - -int -URCunsetup(GENmodel *inModel, CKTcircuit *ckt) -{ - IFuid varUid; - int error; - URCinstance *here; - URCmodel *model = (URCmodel *) inModel; - GENinstance *in; - GENmodel *modfast; - - /* Delete models, devices, and intermediate nodes; */ - - for ( ; model; model = URCnextModel(model)) { - for (here = URCinstances(model); here; - here = URCnextInstance(here)) - { - if(model->URCisPerLGiven) { - /* Diodes */ - error = SPfrontEnd->IFnewUid (ckt, &varUid, - here->URCname, - "diodemod", - UID_MODEL, - NULL); - } else { - /* Capacitors */ - error = SPfrontEnd->IFnewUid (ckt, &varUid, - here->URCname, - "capmod", - UID_MODEL, - NULL); - } - if (error && error != E_EXISTS) - return error; - - modfast = CKTfndMod(ckt, varUid); - if (!modfast) - return E_NOMOD; - - for (in = modfast->GENinstances; in; in = in->GENnextInstance) - CKTdltNNum(ckt, GENnode(in)[0]); - - CKTdltMod(ckt, modfast); /* Does the elements too */ - - /* Resistors */ - error = SPfrontEnd->IFnewUid (ckt, &varUid, here->URCname, - "resmod", UID_MODEL, NULL); - if (error && error != E_EXISTS) - return error; - - modfast = CKTfndMod(ckt, varUid); - if (!modfast) - return E_NOMOD; - CKTdltMod(ckt, modfast); - } - } - return OK; -} diff --git a/src/spicelib/devices/vbic/Makefile.am b/src/spicelib/devices/vbic/Makefile.am deleted file mode 100644 index 961357a86..000000000 --- a/src/spicelib/devices/vbic/Makefile.am +++ /dev/null @@ -1,32 +0,0 @@ -## Process this file with automake to produce Makefile.in - -noinst_LTLIBRARIES = libvbic.la - -libvbic_la_SOURCES = \ - vbic.c \ - vbicacld.c \ - vbicask.c \ - vbicconv.c \ - vbicdefs.h \ - vbicext.h \ - vbicgetic.c \ - vbicinit.c \ - vbicinit.h \ - vbicitf.h \ - vbicload.c \ - vbicmask.c \ - vbicmpar.c \ - vbicnoise.c \ - vbicparam.c \ - vbicpzld.c \ - vbicsetup.c \ - vbicsoachk.c \ - vbictemp.c \ - vbictrunc.c - - - -AM_CPPFLAGS = @AM_CPPFLAGS@ -I$(top_srcdir)/src/include -AM_CFLAGS = $(STATIC) - -MAINTAINERCLEANFILES = Makefile.in diff --git a/src/spicelib/devices/vbic/vbic.c b/src/spicelib/devices/vbic/vbic.c deleted file mode 100644 index 50bae6289..000000000 --- a/src/spicelib/devices/vbic/vbic.c +++ /dev/null @@ -1,200 +0,0 @@ -/********** -Copyright 1990 Regents of the University of California. All rights reserved. -Author: 1985 Thomas L. Quarles -Model Author: 1995 Colin McAndrew Motorola -Spice3 Implementation: 2003 Dietmar Warning DAnalyse GmbH -**********/ - -/* - * This file defines the VBIC data structures that are - * available to the next level(s) up the calling hierarchy - */ - -#include "ngspice/ngspice.h" -#include "ngspice/devdefs.h" -#include "vbicdefs.h" -#include "ngspice/suffix.h" - -IFparm VBICpTable[] = { /* parameters */ - IOPU("area", VBIC_AREA, IF_REAL, "Area factor"), - IOPU("off", VBIC_OFF, IF_FLAG, "Device initially off"), - IP("ic", VBIC_IC, IF_REALVEC, "Initial condition vector"), - IOPAU("icvbe", VBIC_IC_VBE, IF_REAL, "Initial B-E voltage"), - IOPAU("icvce", VBIC_IC_VCE, IF_REAL, "Initial C-E voltage"), - IOPU("temp", VBIC_TEMP, IF_REAL, "Instance temperature"), - IOPU("dtemp", VBIC_DTEMP, IF_REAL, "Instance delta temperature"), - IOPU("m", VBIC_M, IF_REAL, "Multiplier"), - - OPU("collnode", VBIC_QUEST_COLLNODE, IF_INTEGER, "Number of collector node"), - OPU("basenode", VBIC_QUEST_BASENODE, IF_INTEGER, "Number of base node"), - OPU("emitnode", VBIC_QUEST_EMITNODE, IF_INTEGER, "Number of emitter node"), - OPU("subsnode", VBIC_QUEST_SUBSNODE, IF_INTEGER, "Number of substrate node"), - OPU("collCXnode",VBIC_QUEST_COLLCXNODE,IF_INTEGER, "Internal collector node"), - OPU("collCInode",VBIC_QUEST_COLLCINODE,IF_INTEGER, "Internal collector node"), - OPU("baseBXnode",VBIC_QUEST_BASEBXNODE,IF_INTEGER, "Internal base node"), - OPU("baseBInode",VBIC_QUEST_BASEBINODE,IF_INTEGER, "Internal base node"), - OPU("baseBPnode",VBIC_QUEST_BASEBPNODE,IF_INTEGER, "Internal base node"), - OPU("emitEInode",VBIC_QUEST_EMITEINODE,IF_INTEGER, "Internal emitter node"), - OPU("subsSInode",VBIC_QUEST_SUBSSINODE,IF_INTEGER, "Internal substrate node"), - OP("vbe", VBIC_QUEST_VBE, IF_REAL, "B-E voltage"), - OP("vbc", VBIC_QUEST_VBC, IF_REAL, "B-C voltage"), - OP("ic", VBIC_QUEST_CC, IF_REAL, "Collector current"), - OP("ib", VBIC_QUEST_CB, IF_REAL, "Base current"), - OP("ie", VBIC_QUEST_CE, IF_REAL, "Emitter current"), - OP("is", VBIC_QUEST_CS, IF_REAL, "Substrate current"), - OP("gm", VBIC_QUEST_GM, IF_REAL, "Small signal transconductance dIc/dVbe"), - OP("go", VBIC_QUEST_GO, IF_REAL, "Small signal output conductance dIc/dVbc"), - OP("gpi", VBIC_QUEST_GPI, IF_REAL, "Small signal input conductance dIb/dVbe"), - OP("gmu", VBIC_QUEST_GMU, IF_REAL, "Small signal conductance dIb/dVbc"), - OP("gx", VBIC_QUEST_GX, IF_REAL, "Conductance from base to internal base"), - OP("cbe", VBIC_QUEST_CBE, IF_REAL, "Internal base to emitter capacitance"), - OP("cbex", VBIC_QUEST_CBEX, IF_REAL, "External base to emitter capacitance"), - OP("cbc", VBIC_QUEST_CBC, IF_REAL, "Internal base to collector capacitance"), - OP("cbcx", VBIC_QUEST_CBCX, IF_REAL, "External Base to collector capacitance"), - OP("cbep", VBIC_QUEST_CBEP, IF_REAL, "Parasitic Base to emitter capacitance"), - OP("cbcp", VBIC_QUEST_CBCP, IF_REAL, "Parasitic Base to collector capacitance"), - OP("p", VBIC_QUEST_POWER,IF_REAL, "Power dissipation"), - OPU("geqcb",VBIC_QUEST_GEQCB,IF_REAL, "Internal C-B-base cap. equiv. cond."), - OPU("geqbx",VBIC_QUEST_GEQBX,IF_REAL, "External C-B-base cap. equiv. cond."), - OPU("qbe", VBIC_QUEST_QBE, IF_REAL, "Charge storage B-E junction"), - OPU("cqbe", VBIC_QUEST_CQBE, IF_REAL, "Cap. due to charge storage in B-E jct."), - OPU("qbc", VBIC_QUEST_QBC, IF_REAL, "Charge storage B-C junction"), - OPU("cqbc", VBIC_QUEST_CQBC, IF_REAL, "Cap. due to charge storage in B-C jct."), - OPU("qbx", VBIC_QUEST_QBX, IF_REAL, "Charge storage B-X junction"), - OPU("cqbx", VBIC_QUEST_CQBX, IF_REAL, "Cap. due to charge storage in B-X jct.") -}; - -IFparm VBICmPTable[] = { /* model parameters */ - OP("type", VBIC_MOD_TYPE, IF_STRING, "NPN or PNP"), - IOPU("npn", VBIC_MOD_NPN, IF_FLAG, "NPN type device"), - IOPU("pnp", VBIC_MOD_PNP, IF_FLAG, "PNP type device"), - IOP("tnom", VBIC_MOD_TNOM, IF_REAL, "Parameter measurement temperature"), - IOPR("tref", VBIC_MOD_TNOM, IF_REAL, "Parameter measurement temperature"), - IOP("rcx", VBIC_MOD_RCX, IF_REAL, "Extrinsic coll resistance"), - IOP("rci", VBIC_MOD_RCI, IF_REAL, "Intrinsic coll resistance"), - IOP("vo", VBIC_MOD_VO, IF_REAL, "Epi drift saturation voltage"), - IOP("gamm", VBIC_MOD_GAMM, IF_REAL, "Epi doping parameter"), - IOP("hrcf", VBIC_MOD_HRCF, IF_REAL, "High current RC factor"), - IOP("rbx", VBIC_MOD_RBX, IF_REAL, "Extrinsic base resistance"), - IOP("rbi", VBIC_MOD_RBI, IF_REAL, "Intrinsic base resistance"), - IOP("re", VBIC_MOD_RE, IF_REAL, "Intrinsic emitter resistance"), - IOP("rs", VBIC_MOD_RS, IF_REAL, "Intrinsic substrate resistance"), - IOP("rbp", VBIC_MOD_RBP, IF_REAL, "Parasitic base resistance"), - IOP("is", VBIC_MOD_IS, IF_REAL, "Transport saturation current"), - IOP("nf", VBIC_MOD_NF, IF_REAL, "Forward emission coefficient"), - IOP("nr", VBIC_MOD_NR, IF_REAL, "Reverse emission coefficient"), - IOP("fc", VBIC_MOD_FC, IF_REAL, "Fwd bias depletion capacitance limit"), - IOP("cbeo", VBIC_MOD_CBEO, IF_REAL, "Extrinsic B-E overlap capacitance"), - IOP("cje", VBIC_MOD_CJE, IF_REAL, "Zero bias B-E depletion capacitance"), - IOP("pe", VBIC_MOD_PE, IF_REAL, "B-E built in potential"), - IOP("me", VBIC_MOD_ME, IF_REAL, "B-E junction grading coefficient"), - IOP("aje", VBIC_MOD_AJE, IF_REAL, "B-E capacitance smoothing factor"), - IOP("cbco", VBIC_MOD_CBCO, IF_REAL, "Extrinsic B-C overlap capacitance"), - IOP("cjc", VBIC_MOD_CJC, IF_REAL, "Zero bias B-C depletion capacitance"), - IOP("qco", VBIC_MOD_QCO, IF_REAL, "Epi charge parameter"), - IOP("cjep", VBIC_MOD_CJEP, IF_REAL, "B-C extrinsic zero bias capacitance"), - IOP("pc", VBIC_MOD_PC, IF_REAL, "B-C built in potential"), - IOP("mc", VBIC_MOD_MC, IF_REAL, "B-C junction grading coefficient"), - IOP("ajc", VBIC_MOD_AJC, IF_REAL, "B-C capacitance smoothing factor"), - IOP("cjcp", VBIC_MOD_CJCP, IF_REAL, "Zero bias S-C capacitance"), - IOP("ps", VBIC_MOD_PS, IF_REAL, "S-C junction built in potential"), - IOP("ms", VBIC_MOD_MS, IF_REAL, "S-C junction grading coefficient"), - IOP("ajs", VBIC_MOD_AJS, IF_REAL, "S-C capacitance smoothing factor"), - IOP("ibei", VBIC_MOD_IBEI, IF_REAL, "Ideal B-E saturation current"), - IOP("wbe", VBIC_MOD_WBE, IF_REAL, "Portion of IBEI from Vbei, 1-WBE from Vbex"), - IOP("nei", VBIC_MOD_NEI, IF_REAL, "Ideal B-E emission coefficient"), - IOP("iben", VBIC_MOD_IBEN, IF_REAL, "Non-ideal B-E saturation current"), - IOP("nen", VBIC_MOD_NEN, IF_REAL, "Non-ideal B-E emission coefficient"), - IOP("ibci", VBIC_MOD_IBCI, IF_REAL, "Ideal B-C saturation current"), - IOP("nci", VBIC_MOD_NCI, IF_REAL, "Ideal B-C emission coefficient"), - IOP("ibcn", VBIC_MOD_IBCN, IF_REAL, "Non-ideal B-C saturation current"), - IOP("ncn", VBIC_MOD_NCN, IF_REAL, "Non-ideal B-C emission coefficient"), - IOP("avc1", VBIC_MOD_AVC1, IF_REAL, "B-C weak avalanche parameter 1"), - IOP("avc2", VBIC_MOD_AVC2, IF_REAL, "B-C weak avalanche parameter 2"), - IOP("isp", VBIC_MOD_ISP, IF_REAL, "Parasitic transport saturation current"), - IOP("wsp", VBIC_MOD_WSP, IF_REAL, "Portion of ICCP"), - IOP("nfp", VBIC_MOD_NFP, IF_REAL, "Parasitic fwd emission coefficient"), - IOP("ibeip", VBIC_MOD_IBEIP, IF_REAL, "Ideal parasitic B-E saturation current"), - IOP("ibenp", VBIC_MOD_IBENP, IF_REAL, "Non-ideal parasitic B-E saturation current"), - IOP("ibcip", VBIC_MOD_IBCIP, IF_REAL, "Ideal parasitic B-C saturation current"), - IOP("ncip", VBIC_MOD_NCIP, IF_REAL, "Ideal parasitic B-C emission coefficient"), - IOP("ibcnp", VBIC_MOD_IBCNP, IF_REAL, "Nonideal parasitic B-C saturation current"), - IOP("ncnp", VBIC_MOD_NCNP, IF_REAL, "Nonideal parasitic B-C emission coefficient"), - IOP("vef", VBIC_MOD_VEF, IF_REAL, "Forward Early voltage"), - IOP("ver", VBIC_MOD_VER, IF_REAL, "Reverse Early voltage"), - IOP("ikf", VBIC_MOD_IKF, IF_REAL, "Forward knee current"), - IOP("ikr", VBIC_MOD_IKR, IF_REAL, "Reverse knee current"), - IOP("ikp", VBIC_MOD_IKP, IF_REAL, "Parasitic knee current"), - IOP("tf", VBIC_MOD_TF, IF_REAL, "Ideal forward transit time"), - IOP("qtf", VBIC_MOD_QTF, IF_REAL, "Variation of TF with base-width modulation"), - IOP("xtf", VBIC_MOD_XTF, IF_REAL, "Coefficient for bias dependence of TF"), - IOP("vtf", VBIC_MOD_VTF, IF_REAL, "Voltage giving VBC dependence of TF"), - IOP("itf", VBIC_MOD_ITF, IF_REAL, "High current dependence of TF"), - IOP("tr", VBIC_MOD_TR, IF_REAL, "Ideal reverse transit time"), - IOP("td", VBIC_MOD_TD, IF_REAL, "Forward excess-phase delay time"), - IOP("kfn", VBIC_MOD_KFN, IF_REAL, "B-E Flicker Noise Coefficient"), - IOP("afn", VBIC_MOD_AFN, IF_REAL, "B-E Flicker Noise Exponent"), - IOP("bfn", VBIC_MOD_BFN, IF_REAL, "B-E Flicker Noise 1/f dependence"), - IOP("xre", VBIC_MOD_XRE, IF_REAL, "Temperature exponent of RE"), - IOP("xrb", VBIC_MOD_XRB, IF_REAL, "Temperature exponent of RB"), - IOP("xrbi", VBIC_MOD_XRBI, IF_REAL, "Temperature exponent of RBI"), - IOP("xrc", VBIC_MOD_XRC, IF_REAL, "Temperature exponent of RC"), - IOP("xrci", VBIC_MOD_XRCI, IF_REAL, "Temperature exponent of RCI"), - IOP("xrs", VBIC_MOD_XRS, IF_REAL, "Temperature exponent of RS"), - IOP("xvo", VBIC_MOD_XVO, IF_REAL, "Temperature exponent of VO"), - IOP("ea", VBIC_MOD_EA, IF_REAL, "Activation energy for IS"), - IOP("eaie", VBIC_MOD_EAIE, IF_REAL, "Activation energy for IBEI"), - IOP("eaic", VBIC_MOD_EAIC, IF_REAL, "Activation energy for IBCI/IBEIP"), - IOP("eais", VBIC_MOD_EAIS, IF_REAL, "Activation energy for IBCIP"), - IOP("eane", VBIC_MOD_EANE, IF_REAL, "Activation energy for IBEN"), - IOP("eanc", VBIC_MOD_EANC, IF_REAL, "Activation energy for IBCN/IBENP"), - IOP("eans", VBIC_MOD_EANS, IF_REAL, "Activation energy for IBCNP"), - IOP("xis", VBIC_MOD_XIS, IF_REAL, "Temperature exponent of IS"), - IOP("xii", VBIC_MOD_XII, IF_REAL, "Temperature exponent of IBEI,IBCI,IBEIP,IBCIP"), - IOP("xin", VBIC_MOD_XIN, IF_REAL, "Temperature exponent of IBEN,IBCN,IBENP,IBCNP"), - IOP("tnf", VBIC_MOD_TNF, IF_REAL, "Temperature exponent of NF"), - IOP("tavc", VBIC_MOD_TAVC, IF_REAL, "Temperature exponent of AVC2"), - IOP("rth", VBIC_MOD_RTH, IF_REAL, "Thermal resistance"), - IOP("cth", VBIC_MOD_CTH, IF_REAL, "Thermal capacitance"), - IOP("vrt", VBIC_MOD_VRT, IF_REAL, "Punch-through voltage of internal B-C junction"), - IOP("art", VBIC_MOD_ART, IF_REAL, "Smoothing parameter for reach-through"), - IOP("ccso", VBIC_MOD_CCSO, IF_REAL, "Fixed C-S capacitance"), - IOP("qbm", VBIC_MOD_QBM, IF_REAL, "Select SGP qb formulation"), - IOP("nkf", VBIC_MOD_NKF, IF_REAL, "High current beta rolloff"), - IOP("xikf", VBIC_MOD_XIKF, IF_REAL, "Temperature exponent of IKF"), - IOP("xrcx", VBIC_MOD_XRCX, IF_REAL, "Temperature exponent of RCX"), - IOP("xrbx", VBIC_MOD_XRBX, IF_REAL, "Temperature exponent of RBX"), - IOP("xrbp", VBIC_MOD_XRBP, IF_REAL, "Temperature exponent of RBP"), - IOP("isrr", VBIC_MOD_ISRR, IF_REAL, "Separate IS for fwd and rev"), - IOP("xisr", VBIC_MOD_XISR, IF_REAL, "Temperature exponent of ISR"), - IOP("dear", VBIC_MOD_DEAR, IF_REAL, "Delta activation energy for ISRR"), - IOP("eap", VBIC_MOD_EAP, IF_REAL, "Exitivation energy for ISP"), - IOP("vbbe", VBIC_MOD_VBBE, IF_REAL, "B-E breakdown voltage"), - IOP("nbbe", VBIC_MOD_NBBE, IF_REAL, "B-E breakdown emission coefficient"), - IOP("ibbe", VBIC_MOD_IBBE, IF_REAL, "B-E breakdown current"), - IOP("tvbbe1",VBIC_MOD_TVBBE1,IF_REAL, "Linear temperature coefficient of VBBE"), - IOP("tvbbe2",VBIC_MOD_TVBBE2,IF_REAL, "Quadratic temperature coefficient of VBBE"), - IOP("tnbbe", VBIC_MOD_TNBBE, IF_REAL, "Temperature coefficient of NBBE"), - IOP("ebbe", VBIC_MOD_EBBE, IF_REAL, "exp(-VBBE/(NBBE*Vtv))"), - IOP("dtemp", VBIC_MOD_DTEMP, IF_REAL, "Locale Temperature difference"), - IOP("vers", VBIC_MOD_VERS, IF_REAL, "Revision Version"), - IOP("vref", VBIC_MOD_VREF, IF_REAL, "Reference Version"), - IOP("vbe_max", VBIC_MOD_VBE_MAX, IF_REAL, "maximum voltage B-E junction"), - IOP("vbc_max", VBIC_MOD_VBC_MAX, IF_REAL, "maximum voltage B-C junction"), - IOP("vce_max", VBIC_MOD_VCE_MAX, IF_REAL, "maximum voltage C-E branch") -}; - -char *VBICnames[] = { - "collector", - "base", - "emitter", - "substrate", - "temp" -}; - - -int VBICnSize = NUMELEMS(VBICnames); -int VBICpTSize = NUMELEMS(VBICpTable); -int VBICmPTSize = NUMELEMS(VBICmPTable); -int VBICiSize = sizeof(VBICinstance); -int VBICmSize = sizeof(VBICmodel); diff --git a/src/spicelib/devices/vbic/vbicacld.c b/src/spicelib/devices/vbic/vbicacld.c deleted file mode 100644 index 0844fccd0..000000000 --- a/src/spicelib/devices/vbic/vbicacld.c +++ /dev/null @@ -1,286 +0,0 @@ -/********** -Copyright 1990 Regents of the University of California. All rights reserved. -Author: 1985 Thomas L. Quarles -Model Author: 1995 Colin McAndrew Motorola -Spice3 Implementation: 2003 Dietmar Warning DAnalyse GmbH -**********/ - -/* - * Function to load the COMPLEX circuit matrix using the - * small signal parameters saved during a previous DC operating - * point analysis. - */ - -#include "ngspice/ngspice.h" -#include "ngspice/cktdefs.h" -#include "vbicdefs.h" -#include "ngspice/sperror.h" -#include "ngspice/suffix.h" - -int -VBICacLoad(GENmodel *inModel, CKTcircuit *ckt) -{ - VBICinstance *here; - VBICmodel *model = (VBICmodel*)inModel; - double Ibe_Vbei,Ibex_Vbex - ,Itzf_Vbei,Itzf_Vbci,Itzr_Vbci,Itzr_Vbei,Ibc_Vbci - ,Ibc_Vbei,Ibep_Vbep,Ircx_Vrcx,Irci_Vrci - ,Irci_Vbci,Irci_Vbcx,Irbx_Vrbx,Irbi_Vrbi,Irbi_Vbei - ,Irbi_Vbci,Ire_Vre,Irbp_Vrbp,Irbp_Vbep,Irbp_Vbci - ,Ibcp_Vbcp,Iccp_Vbep,Irs_Vrs,Iccp_Vbci,Iccp_Vbcp; - double XQbe_Vbei, XQbe_Vbci, XQbex_Vbex, XQbc_Vbci, - XQbcx_Vbcx, XQbep_Vbep, XQbep_Vbci, - XQbcp_Vbcp; - - /* loop through all the models */ - for( ; model != NULL; model = VBICnextModel(model)) { - - /* loop through all the instances of the model */ - for( here = VBICinstances(model); here!= NULL; - here = VBICnextInstance(here)) { - - Ibe_Vbei = *(ckt->CKTstate0 + here->VBICibe_Vbei); - Ibex_Vbex = *(ckt->CKTstate0 + here->VBICibex_Vbex); - Itzf_Vbei = *(ckt->CKTstate0 + here->VBICitzf_Vbei); - Itzf_Vbci = *(ckt->CKTstate0 + here->VBICitzf_Vbci); - Itzr_Vbci = *(ckt->CKTstate0 + here->VBICitzr_Vbci); - Itzr_Vbei = *(ckt->CKTstate0 + here->VBICitzr_Vbei); - Ibc_Vbci = *(ckt->CKTstate0 + here->VBICibc_Vbci); - Ibc_Vbei = *(ckt->CKTstate0 + here->VBICibc_Vbei); - Ibep_Vbep = *(ckt->CKTstate0 + here->VBICibep_Vbep); - Irci_Vrci = *(ckt->CKTstate0 + here->VBICirci_Vrci); - Irci_Vbci = *(ckt->CKTstate0 + here->VBICirci_Vbci); - Irci_Vbcx = *(ckt->CKTstate0 + here->VBICirci_Vbcx); - Irbi_Vrbi = *(ckt->CKTstate0 + here->VBICirbi_Vrbi); - Irbi_Vbei = *(ckt->CKTstate0 + here->VBICirbi_Vbei); - Irbi_Vbci = *(ckt->CKTstate0 + here->VBICirbi_Vbci); - Irbp_Vrbp = *(ckt->CKTstate0 + here->VBICirbp_Vrbp); - Irbp_Vbep = *(ckt->CKTstate0 + here->VBICirbp_Vbep); - Irbp_Vbci = *(ckt->CKTstate0 + here->VBICirbp_Vbci); - Ibcp_Vbcp = *(ckt->CKTstate0 + here->VBICibcp_Vbcp); - Iccp_Vbep = *(ckt->CKTstate0 + here->VBICiccp_Vbep); - Iccp_Vbci = *(ckt->CKTstate0 + here->VBICiccp_Vbci); - Iccp_Vbcp = *(ckt->CKTstate0 + here->VBICiccp_Vbcp); - Ircx_Vrcx = *(ckt->CKTstate0 + here->VBICircx_Vrcx); - Irbx_Vrbx = *(ckt->CKTstate0 + here->VBICirbx_Vrbx); - Irs_Vrs = *(ckt->CKTstate0 + here->VBICirs_Vrs); - Ire_Vre = *(ckt->CKTstate0 + here->VBICire_Vre); - -/* -c The real part -*/ -/* -c Stamp element: Ibe -*/ - *(here->VBICbaseBIBaseBIPtr) += Ibe_Vbei; - *(here->VBICbaseBIEmitEIPtr) += -Ibe_Vbei; - *(here->VBICemitEIBaseBIPtr) += -Ibe_Vbei; - *(here->VBICemitEIEmitEIPtr) += Ibe_Vbei; -/* -c Stamp element: Ibex -*/ - *(here->VBICbaseBXBaseBXPtr) += Ibex_Vbex; - *(here->VBICbaseBXEmitEIPtr) += -Ibex_Vbex; - *(here->VBICemitEIBaseBXPtr) += -Ibex_Vbex; - *(here->VBICemitEIEmitEIPtr) += Ibex_Vbex; -/* -c Stamp element: Itzf -*/ - *(here->VBICcollCIBaseBIPtr) += Itzf_Vbei; - *(here->VBICcollCIEmitEIPtr) += -Itzf_Vbei; - *(here->VBICcollCIBaseBIPtr) += Itzf_Vbci; - *(here->VBICcollCICollCIPtr) += -Itzf_Vbci; - *(here->VBICemitEIBaseBIPtr) += -Itzf_Vbei; - *(here->VBICemitEIEmitEIPtr) += Itzf_Vbei; - *(here->VBICemitEIBaseBIPtr) += -Itzf_Vbci; - *(here->VBICemitEICollCIPtr) += Itzf_Vbci; -/* -c Stamp element: Itzr -*/ - *(here->VBICemitEIBaseBIPtr) += Itzr_Vbei; - *(here->VBICemitEIEmitEIPtr) += -Itzr_Vbei; - *(here->VBICemitEIBaseBIPtr) += Itzr_Vbci; - *(here->VBICemitEICollCIPtr) += -Itzr_Vbci; - *(here->VBICcollCIBaseBIPtr) += -Itzr_Vbei; - *(here->VBICcollCIEmitEIPtr) += Itzr_Vbei; - *(here->VBICcollCIBaseBIPtr) += -Itzr_Vbci; - *(here->VBICcollCICollCIPtr) += Itzr_Vbci; -/* -c Stamp element: Ibc -*/ - *(here->VBICbaseBIBaseBIPtr) += Ibc_Vbci; - *(here->VBICbaseBICollCIPtr) += -Ibc_Vbci; - *(here->VBICbaseBIBaseBIPtr) += Ibc_Vbei; - *(here->VBICbaseBIEmitEIPtr) += -Ibc_Vbei; - *(here->VBICcollCIBaseBIPtr) += -Ibc_Vbci; - *(here->VBICcollCICollCIPtr) += Ibc_Vbci; - *(here->VBICcollCIBaseBIPtr) += -Ibc_Vbei; - *(here->VBICcollCIEmitEIPtr) += Ibc_Vbei; -/* -c Stamp element: Ibep -*/ - *(here->VBICbaseBXBaseBXPtr) += Ibep_Vbep; - *(here->VBICbaseBXBaseBPPtr) += -Ibep_Vbep; - *(here->VBICbaseBPBaseBXPtr) += -Ibep_Vbep; - *(here->VBICbaseBPBaseBPPtr) += Ibep_Vbep; -/* -c Stamp element: Rcx -*/ - *(here->VBICcollCollPtr) += Ircx_Vrcx; - *(here->VBICcollCXCollCXPtr) += Ircx_Vrcx; - *(here->VBICcollCXCollPtr) += -Ircx_Vrcx; - *(here->VBICcollCollCXPtr) += -Ircx_Vrcx; -/* -c Stamp element: Irci -*/ - *(here->VBICcollCXCollCXPtr) += Irci_Vrci; - *(here->VBICcollCXCollCIPtr) += -Irci_Vrci; - *(here->VBICcollCXBaseBIPtr) += Irci_Vbci; - *(here->VBICcollCXCollCIPtr) += -Irci_Vbci; - *(here->VBICcollCXBaseBIPtr) += Irci_Vbcx; - *(here->VBICcollCXCollCXPtr) += -Irci_Vbcx; - *(here->VBICcollCICollCXPtr) += -Irci_Vrci; - *(here->VBICcollCICollCIPtr) += Irci_Vrci; - *(here->VBICcollCIBaseBIPtr) += -Irci_Vbci; - *(here->VBICcollCICollCIPtr) += Irci_Vbci; - *(here->VBICcollCIBaseBIPtr) += -Irci_Vbcx; - *(here->VBICcollCICollCXPtr) += Irci_Vbcx; -/* -c Stamp element: Rbx -*/ - *(here->VBICbaseBasePtr) += Irbx_Vrbx; - *(here->VBICbaseBXBaseBXPtr) += Irbx_Vrbx; - *(here->VBICbaseBXBasePtr) += -Irbx_Vrbx; - *(here->VBICbaseBaseBXPtr) += -Irbx_Vrbx; -/* -c Stamp element: Irbi -*/ - *(here->VBICbaseBXBaseBXPtr) += Irbi_Vrbi; - *(here->VBICbaseBXBaseBIPtr) += -Irbi_Vrbi; - *(here->VBICbaseBXBaseBIPtr) += Irbi_Vbei; - *(here->VBICbaseBXEmitEIPtr) += -Irbi_Vbei; - *(here->VBICbaseBXBaseBIPtr) += Irbi_Vbci; - *(here->VBICbaseBXCollCIPtr) += -Irbi_Vbci; - *(here->VBICbaseBIBaseBXPtr) += -Irbi_Vrbi; - *(here->VBICbaseBIBaseBIPtr) += Irbi_Vrbi; - *(here->VBICbaseBIBaseBIPtr) += -Irbi_Vbei; - *(here->VBICbaseBIEmitEIPtr) += Irbi_Vbei; - *(here->VBICbaseBIBaseBIPtr) += -Irbi_Vbci; - *(here->VBICbaseBICollCIPtr) += Irbi_Vbci; -/* -c Stamp element: Re -*/ - *(here->VBICemitEmitPtr) += Ire_Vre; - *(here->VBICemitEIEmitEIPtr) += Ire_Vre; - *(here->VBICemitEIEmitPtr) += -Ire_Vre; - *(here->VBICemitEmitEIPtr) += -Ire_Vre; -/* -c Stamp element: Irbp -*/ - *(here->VBICbaseBPBaseBPPtr) += Irbp_Vrbp; - *(here->VBICbaseBPCollCXPtr) += -Irbp_Vrbp; - *(here->VBICbaseBPBaseBXPtr) += Irbp_Vbep; - *(here->VBICbaseBPBaseBPPtr) += -Irbp_Vbep; - *(here->VBICbaseBPBaseBIPtr) += Irbp_Vbci; - *(here->VBICbaseBPCollCIPtr) += -Irbp_Vbci; - *(here->VBICcollCXBaseBPPtr) += -Irbp_Vrbp; - *(here->VBICcollCXCollCXPtr) += Irbp_Vrbp; - *(here->VBICcollCXBaseBXPtr) += -Irbp_Vbep; - *(here->VBICcollCXBaseBPPtr) += Irbp_Vbep; - *(here->VBICcollCXBaseBIPtr) += -Irbp_Vbci; - *(here->VBICcollCXCollCIPtr) += Irbp_Vbci; -/* -c Stamp element: Ibcp -*/ - *(here->VBICsubsSISubsSIPtr) += Ibcp_Vbcp; - *(here->VBICsubsSIBaseBPPtr) += -Ibcp_Vbcp; - *(here->VBICbaseBPSubsSIPtr) += -Ibcp_Vbcp; - *(here->VBICbaseBPBaseBPPtr) += Ibcp_Vbcp; -/* -c Stamp element: Iccp -*/ - *(here->VBICbaseBXBaseBXPtr) += Iccp_Vbep; - *(here->VBICbaseBXBaseBPPtr) += -Iccp_Vbep; - *(here->VBICbaseBXBaseBIPtr) += Iccp_Vbci; - *(here->VBICbaseBXCollCIPtr) += -Iccp_Vbci; - *(here->VBICbaseBXSubsSIPtr) += Iccp_Vbcp; - *(here->VBICbaseBXBaseBPPtr) += -Iccp_Vbcp; - *(here->VBICsubsSIBaseBXPtr) += -Iccp_Vbep; - *(here->VBICsubsSIBaseBPPtr) += Iccp_Vbep; - *(here->VBICsubsSIBaseBIPtr) += -Iccp_Vbci; - *(here->VBICsubsSICollCIPtr) += Iccp_Vbci; - *(here->VBICsubsSISubsSIPtr) += -Iccp_Vbcp; - *(here->VBICsubsSIBaseBPPtr) += Iccp_Vbcp; -/* -c Stamp element: Rs -*/ - *(here->VBICsubsSubsPtr) += Irs_Vrs; - *(here->VBICsubsSISubsSIPtr) += Irs_Vrs; - *(here->VBICsubsSISubsPtr) += -Irs_Vrs; - *(here->VBICsubsSubsSIPtr) += -Irs_Vrs; -/* -c The complex part -*/ - XQbe_Vbei = *(ckt->CKTstate0 + here->VBICcqbe) * ckt->CKTomega; - XQbe_Vbci = *(ckt->CKTstate0 + here->VBICcqbeci) * ckt->CKTomega; - XQbex_Vbex = *(ckt->CKTstate0 + here->VBICcqbex) * ckt->CKTomega; - XQbc_Vbci = *(ckt->CKTstate0 + here->VBICcqbc) * ckt->CKTomega; - XQbcx_Vbcx = *(ckt->CKTstate0 + here->VBICcqbcx) * ckt->CKTomega; - XQbep_Vbep = *(ckt->CKTstate0 + here->VBICcqbep) * ckt->CKTomega; - XQbep_Vbci = *(ckt->CKTstate0 + here->VBICcqbepci) * ckt->CKTomega; - XQbcp_Vbcp = *(ckt->CKTstate0 + here->VBICcqbcp) * ckt->CKTomega; -/* -c Stamp element: Qbe -*/ - *(here->VBICbaseBIBaseBIPtr + 1) += XQbe_Vbei; - *(here->VBICbaseBIEmitEIPtr + 1) += -XQbe_Vbei; - *(here->VBICbaseBIBaseBIPtr + 1) += XQbe_Vbci; - *(here->VBICbaseBICollCIPtr + 1) += -XQbe_Vbci; - *(here->VBICemitEIBaseBIPtr + 1) += -XQbe_Vbei; - *(here->VBICemitEIEmitEIPtr + 1) += XQbe_Vbei; - *(here->VBICemitEIBaseBIPtr + 1) += -XQbe_Vbci; - *(here->VBICemitEICollCIPtr + 1) += XQbe_Vbci; -/* -c Stamp element: Qbex -*/ - *(here->VBICbaseBXBaseBXPtr + 1) += XQbex_Vbex; - *(here->VBICbaseBXEmitEIPtr + 1) += -XQbex_Vbex; - *(here->VBICemitEIBaseBXPtr + 1) += -XQbex_Vbex; - *(here->VBICemitEIEmitEIPtr + 1) += XQbex_Vbex; -/* -c Stamp element: Qbc -*/ - *(here->VBICbaseBIBaseBIPtr + 1) += XQbc_Vbci; - *(here->VBICbaseBICollCIPtr + 1) += -XQbc_Vbci; - *(here->VBICcollCIBaseBIPtr + 1) += -XQbc_Vbci; - *(here->VBICcollCICollCIPtr + 1) += XQbc_Vbci; -/* -c Stamp element: Qbcx -*/ - *(here->VBICbaseBIBaseBIPtr + 1) += XQbcx_Vbcx; - *(here->VBICbaseBICollCXPtr + 1) += -XQbcx_Vbcx; - *(here->VBICcollCXBaseBIPtr + 1) += -XQbcx_Vbcx; - *(here->VBICcollCXCollCXPtr + 1) += XQbcx_Vbcx; -/* -c Stamp element: Qbep -*/ - *(here->VBICbaseBXBaseBXPtr + 1) += XQbep_Vbep; - *(here->VBICbaseBXBaseBPPtr + 1) += -XQbep_Vbep; - *(here->VBICbaseBXBaseBIPtr + 1) += XQbep_Vbci; - *(here->VBICbaseBXCollCIPtr + 1) += -XQbep_Vbci; - *(here->VBICbaseBPBaseBXPtr + 1) += -XQbep_Vbep; - *(here->VBICbaseBPBaseBPPtr + 1) += XQbep_Vbep; - *(here->VBICbaseBPBaseBIPtr + 1) += -XQbep_Vbci; - *(here->VBICbaseBPCollCIPtr + 1) += XQbep_Vbci; -/* -c Stamp element: Qbcp -*/ - *(here->VBICsubsSISubsSIPtr + 1) += XQbcp_Vbcp; - *(here->VBICsubsSIBaseBPPtr + 1) += -XQbcp_Vbcp; - *(here->VBICbaseBPSubsSIPtr + 1) += -XQbcp_Vbcp; - *(here->VBICbaseBPBaseBPPtr + 1) += XQbcp_Vbcp; - - } - } - return(OK); -} diff --git a/src/spicelib/devices/vbic/vbicask.c b/src/spicelib/devices/vbic/vbicask.c deleted file mode 100644 index 877ed7a4f..000000000 --- a/src/spicelib/devices/vbic/vbicask.c +++ /dev/null @@ -1,168 +0,0 @@ -/********** -Copyright 1990 Regents of the University of California. All rights reserved. -Author: 1985 Mathew Lew and Thomas L. Quarles -Model Author: 1995 Colin McAndrew Motorola -Spice3 Implementation: 2003 Dietmar Warning DAnalyse GmbH -**********/ - -/* - * This routine gives access to the internal device - * parameters for VBICs - */ - -#include "ngspice/ngspice.h" -#include "ngspice/const.h" -#include "ngspice/cktdefs.h" -#include "vbicdefs.h" -#include "ngspice/ifsim.h" -#include "ngspice/sperror.h" -#include "ngspice/suffix.h" - -/*ARGSUSED*/ -int -VBICask(CKTcircuit *ckt, GENinstance *instPtr, int which, IFvalue *value, IFvalue *select) -{ - IFvalue IC, IB, IE, IS; - VBICinstance *here = (VBICinstance*)instPtr; - - switch(which) { - case VBIC_AREA: - value->rValue = here->VBICarea; - return(OK); - case VBIC_OFF: - value->iValue = here->VBICoff; - return(OK); - case VBIC_IC_VBE: - value->rValue = here->VBICicVBE; - return(OK); - case VBIC_IC_VCE: - value->rValue = here->VBICicVCE; - return(OK); - case VBIC_TEMP: - value->rValue = here->VBICtemp - CONSTCtoK; - return(OK); - case VBIC_M: - value->rValue = here->VBICm; - return(OK); - case VBIC_QUEST_COLLNODE: - value->iValue = here->VBICcollNode; - return(OK); - case VBIC_QUEST_BASENODE: - value->iValue = here->VBICbaseNode; - return(OK); - case VBIC_QUEST_EMITNODE: - value->iValue = here->VBICemitNode; - return(OK); - case VBIC_QUEST_SUBSNODE: - value->iValue = here->VBICsubsNode; - return(OK); - case VBIC_QUEST_COLLCXNODE: - value->iValue = here->VBICcollCXNode; - return(OK); - case VBIC_QUEST_BASEBXNODE: - value->iValue = here->VBICbaseBXNode; - return(OK); - case VBIC_QUEST_EMITEINODE: - value->iValue = here->VBICemitEINode; - return(OK); - case VBIC_QUEST_SUBSSINODE: - value->iValue = here->VBICsubsSINode; - return(OK); - case VBIC_QUEST_VBE: - value->rValue = *(ckt->CKTstate0 + here->VBICvbei); - return(OK); - case VBIC_QUEST_VBC: - value->rValue = *(ckt->CKTstate0 + here->VBICvbci); - return(OK); - case VBIC_QUEST_CC: - value->rValue = *(ckt->CKTstate0 + here->VBICitzf) - - *(ckt->CKTstate0 + here->VBICitzr) - - *(ckt->CKTstate0 + here->VBICibc); - value->rValue *= VBICmodPtr(here)->VBICtype; - return(OK); - case VBIC_QUEST_CB: - value->rValue = *(ckt->CKTstate0 + here->VBICibe) + - *(ckt->CKTstate0 + here->VBICibc) + - *(ckt->CKTstate0 + here->VBICibex) + - *(ckt->CKTstate0 + here->VBICibep) + - *(ckt->CKTstate0 + here->VBICiccp); - value->rValue *= VBICmodPtr(here)->VBICtype; - return(OK); - case VBIC_QUEST_CE: - value->rValue = - *(ckt->CKTstate0 + here->VBICibe) - - *(ckt->CKTstate0 + here->VBICibex) - - *(ckt->CKTstate0 + here->VBICitzf) + - *(ckt->CKTstate0 + here->VBICitzr); - value->rValue *= VBICmodPtr(here)->VBICtype; - return(OK); - case VBIC_QUEST_CS: - value->rValue = *(ckt->CKTstate0 + here->VBICiccp) - - *(ckt->CKTstate0 + here->VBICibcp); - value->rValue *= VBICmodPtr(here)->VBICtype; - return(OK); - case VBIC_QUEST_POWER: - VBICask(ckt, instPtr, VBIC_QUEST_CC, &IC, select); - VBICask(ckt, instPtr, VBIC_QUEST_CB, &IB, select); - VBICask(ckt, instPtr, VBIC_QUEST_CE, &IE, select); - VBICask(ckt, instPtr, VBIC_QUEST_CS, &IS, select); - value->rValue = fabs(*(ckt->CKTstate0 + here->VBICibe) * *(ckt->CKTstate0 + here->VBICvbei)) + - fabs(*(ckt->CKTstate0 + here->VBICibc) * *(ckt->CKTstate0 + here->VBICvbci)) + - fabs(*(ckt->CKTstate0 + here->VBICitzf) - *(ckt->CKTstate0 + here->VBICitzr)) - * fabs(*(ckt->CKTstate0 + here->VBICvbei) - *(ckt->CKTstate0 + here->VBICvbci)) + - fabs(*(ckt->CKTstate0 + here->VBICibex) * *(ckt->CKTstate0 + here->VBICvbex)) + - fabs(*(ckt->CKTstate0 + here->VBICibep) * *(ckt->CKTstate0 + here->VBICvbep)) + - fabs(*(ckt->CKTstate0 + here->VBICibcp) * *(ckt->CKTstate0 + here->VBICvbcp)) + - fabs(*(ckt->CKTstate0 + here->VBICiccp)) - * fabs(*(ckt->CKTstate0 + here->VBICvbep) - *(ckt->CKTstate0 + here->VBICvbcp)) + - fabs(IC.rValue * IC.rValue * here->VBICtextCollResist) + - fabs(IC.rValue * *(ckt->CKTstate0 + here->VBICvrci)) + - fabs(IB.rValue * IB.rValue * here->VBICtextBaseResist) + - fabs(IB.rValue * *(ckt->CKTstate0 + here->VBICvrbi)) + - fabs(IE.rValue * IE.rValue * here->VBICtemitterResist) + - fabs(IS.rValue * *(ckt->CKTstate0 + here->VBICvrbp)); - return(OK); - case VBIC_QUEST_GM: - value->rValue = *(ckt->CKTstate0 + here->VBICitzf_Vbei); - return(OK); - case VBIC_QUEST_GO: - value->rValue = *(ckt->CKTstate0 + here->VBICitzf_Vbci); - return(OK); - case VBIC_QUEST_GPI: - value->rValue = *(ckt->CKTstate0 + here->VBICibe_Vbei); - return(OK); - case VBIC_QUEST_GMU: - value->rValue = *(ckt->CKTstate0 + here->VBICibc_Vbci); - return(OK); - case VBIC_QUEST_GX: - value->rValue = *(ckt->CKTstate0 + here->VBICirbi_Vrbi); - return(OK); - case VBIC_QUEST_CBE: - value->rValue = here->VBICcapbe; - return(OK); - case VBIC_QUEST_CBEX: - value->rValue = here->VBICcapbex; - return(OK); - case VBIC_QUEST_CBC: - value->rValue = here->VBICcapbc; - return(OK); - case VBIC_QUEST_CBCX: - value->rValue = here->VBICcapbcx; - return(OK); - case VBIC_QUEST_CBEP: - value->rValue = here->VBICcapbep; - return(OK); - case VBIC_QUEST_CBCP: - value->rValue = here->VBICcapbcp; - return(OK); - case VBIC_QUEST_QBE: - value->rValue = *(ckt->CKTstate0 + here->VBICqbe); - return(OK); - case VBIC_QUEST_QBC: - value->rValue = *(ckt->CKTstate0 + here->VBICqbc); - return(OK); - default: - return(E_BADPARM); - } - /* NOTREACHED */ -} - diff --git a/src/spicelib/devices/vbic/vbicconv.c b/src/spicelib/devices/vbic/vbicconv.c deleted file mode 100644 index f1def73fa..000000000 --- a/src/spicelib/devices/vbic/vbicconv.c +++ /dev/null @@ -1,202 +0,0 @@ -/********** -Copyright 1990 Regents of the University of California. All rights reserved. -Author: 1985 Thomas L. Quarles -Model Author: 1995 Colin McAndrew Motorola -Spice3 Implementation: 2003 Dietmar Warning DAnalyse GmbH -**********/ - -/* - * This routine performs the device convergence test for - * VBICs in the circuit. - */ - -#include "ngspice/ngspice.h" -#include "ngspice/cktdefs.h" -#include "vbicdefs.h" -#include "ngspice/sperror.h" -#include "ngspice/suffix.h" - -int -VBICconvTest(GENmodel *inModel, CKTcircuit *ckt) -{ - VBICinstance *here; - VBICmodel *model = (VBICmodel *) inModel; - double tol; - double delvbei; - double delvbex; - double delvbci; - double delvbcx; - double delvbep; - double delvrci; - double delvrbi; - double delvrbp; - double delvbcp; - double ibehat; - double ibexhat; - double itzfhat; - double itzrhat; - double ibchat; - double ibephat; - double ircihat; - double irbihat; - double irbphat; - double ibcphat; - double iccphat; - double Vbei, Vbex, Vbci, Vbcx, Vbep, Vrci, Vrbi, Vrbp, Vbcp; - double Ibe, Ibex, Itzf, Itzr, Ibc, Ibep, Irci, Irbi, Irbp, Ibcp, Iccp; - - for( ; model != NULL; model = VBICnextModel(model)) { - for(here=VBICinstances(model);here!=NULL;here = VBICnextInstance(here)) { - - Vbei=model->VBICtype*( - *(ckt->CKTrhsOld+here->VBICbaseBINode)- - *(ckt->CKTrhsOld+here->VBICemitEINode)); - Vbex=model->VBICtype*( - *(ckt->CKTrhsOld+here->VBICbaseBXNode)- - *(ckt->CKTrhsOld+here->VBICemitEINode)); - Vbci =model->VBICtype*( - *(ckt->CKTrhsOld+here->VBICbaseBINode)- - *(ckt->CKTrhsOld+here->VBICcollCINode)); - Vbcx =model->VBICtype*( - *(ckt->CKTrhsOld+here->VBICbaseBINode)- - *(ckt->CKTrhsOld+here->VBICcollCXNode)); - Vbep =model->VBICtype*( - *(ckt->CKTrhsOld+here->VBICbaseBXNode)- - *(ckt->CKTrhsOld+here->VBICbaseBPNode)); - Vrci =model->VBICtype*( - *(ckt->CKTrhsOld+here->VBICcollCXNode)- - *(ckt->CKTrhsOld+here->VBICcollCINode)); - Vrbi =model->VBICtype*( - *(ckt->CKTrhsOld+here->VBICbaseBXNode)- - *(ckt->CKTrhsOld+here->VBICbaseBINode)); - Vrbp =model->VBICtype*( - *(ckt->CKTrhsOld+here->VBICbaseBPNode)- - *(ckt->CKTrhsOld+here->VBICcollCXNode)); - Vbcp =model->VBICtype*( - *(ckt->CKTrhsOld+here->VBICsubsSINode)- - *(ckt->CKTrhsOld+here->VBICbaseBPNode)); - delvbei = Vbei - *(ckt->CKTstate0 + here->VBICvbei); - delvbex = Vbex - *(ckt->CKTstate0 + here->VBICvbex); - delvbci = Vbci - *(ckt->CKTstate0 + here->VBICvbci); - delvbcx = Vbcx - *(ckt->CKTstate0 + here->VBICvbcx); - delvbep = Vbep - *(ckt->CKTstate0 + here->VBICvbep); - delvrci = Vrci - *(ckt->CKTstate0 + here->VBICvrci); - delvrbi = Vrbi - *(ckt->CKTstate0 + here->VBICvrbi); - delvrbp = Vrbp - *(ckt->CKTstate0 + here->VBICvrbp); - delvbcp = Vbcp - *(ckt->CKTstate0 + here->VBICvbcp); - ibehat = *(ckt->CKTstate0 + here->VBICibe) + - *(ckt->CKTstate0 + here->VBICibe_Vbei)*delvbei; - ibexhat = *(ckt->CKTstate0 + here->VBICibex) + - *(ckt->CKTstate0 + here->VBICibex_Vbex)*delvbex; - itzfhat = *(ckt->CKTstate0 + here->VBICitzf) + - *(ckt->CKTstate0 + here->VBICitzf_Vbei)*delvbei + *(ckt->CKTstate0 + here->VBICitzf_Vbci)*delvbci; - itzrhat = *(ckt->CKTstate0 + here->VBICitzr) + - *(ckt->CKTstate0 + here->VBICitzr_Vbei)*delvbei + *(ckt->CKTstate0 + here->VBICitzr_Vbci)*delvbci; - ibchat = *(ckt->CKTstate0 + here->VBICibc) + - *(ckt->CKTstate0 + here->VBICibc_Vbei)*delvbei + *(ckt->CKTstate0 + here->VBICibc_Vbci)*delvbci; - ibephat = *(ckt->CKTstate0 + here->VBICibep) + - *(ckt->CKTstate0 + here->VBICibep_Vbep)*delvbep; - ircihat = *(ckt->CKTstate0 + here->VBICirci) + *(ckt->CKTstate0 + here->VBICirci_Vrci)*delvrci + - *(ckt->CKTstate0 + here->VBICirci_Vbcx)*delvbcx + *(ckt->CKTstate0 + here->VBICirci_Vbci)*delvbci; - irbihat = *(ckt->CKTstate0 + here->VBICirbi) + *(ckt->CKTstate0 + here->VBICirbi_Vrbi)*delvrbi + - *(ckt->CKTstate0 + here->VBICirbi_Vbei)*delvbei + *(ckt->CKTstate0 + here->VBICirbi_Vbci)*delvbci; - irbphat = *(ckt->CKTstate0 + here->VBICirbp) + *(ckt->CKTstate0 + here->VBICirbp_Vrbp)*delvrbp + - *(ckt->CKTstate0 + here->VBICirbp_Vbep)*delvbep + *(ckt->CKTstate0 + here->VBICirbp_Vbci)*delvbci; - ibcphat = *(ckt->CKTstate0 + here->VBICibcp) + - *(ckt->CKTstate0 + here->VBICibcp_Vbcp)*delvbcp; - iccphat = *(ckt->CKTstate0 + here->VBICiccp) + *(ckt->CKTstate0 + here->VBICiccp_Vbep)*delvbep + - *(ckt->CKTstate0 + here->VBICiccp_Vbci)*delvbci + *(ckt->CKTstate0 + here->VBICiccp_Vbcp)*delvbcp; - Ibe = *(ckt->CKTstate0 + here->VBICibe); - Ibex = *(ckt->CKTstate0 + here->VBICibex); - Itzf = *(ckt->CKTstate0 + here->VBICitzf); - Itzr = *(ckt->CKTstate0 + here->VBICitzr); - Ibc = *(ckt->CKTstate0 + here->VBICibc); - Ibep = *(ckt->CKTstate0 + here->VBICibep); - Irci = *(ckt->CKTstate0 + here->VBICirci); - Irbi = *(ckt->CKTstate0 + here->VBICirbi); - Irbp = *(ckt->CKTstate0 + here->VBICirbp); - Ibcp = *(ckt->CKTstate0 + here->VBICibcp); - Iccp = *(ckt->CKTstate0 + here->VBICiccp); - /* - * check convergence - */ - tol=ckt->CKTreltol*MAX(fabs(ibehat),fabs(Ibe))+ckt->CKTabstol; - if (fabs(ibehat-Ibe) > tol) { - ckt->CKTnoncon++; - ckt->CKTtroubleElt = (GENinstance *) here; - return(OK); /* no reason to continue - we've failed... */ - } else { - tol=ckt->CKTreltol*MAX(fabs(ibexhat),fabs(Ibex))+ckt->CKTabstol; - if (fabs(ibexhat-Ibex) > tol) { - ckt->CKTnoncon++; - ckt->CKTtroubleElt = (GENinstance *) here; - return(OK); /* no reason to continue - we've failed... */ - } else { - tol=ckt->CKTreltol*MAX(fabs(itzfhat),fabs(Itzf))+ckt->CKTabstol; - if (fabs(itzfhat-Itzf) > tol) { - ckt->CKTnoncon++; - ckt->CKTtroubleElt = (GENinstance *) here; - return(OK); /* no reason to continue - we've failed... */ - } else { - tol=ckt->CKTreltol*MAX(fabs(itzrhat),fabs(Itzr))+ckt->CKTabstol; - if (fabs(itzrhat-Itzr) > tol) { - ckt->CKTnoncon++; - ckt->CKTtroubleElt = (GENinstance *) here; - return(OK); /* no reason to continue - we've failed... */ - } else { - tol=ckt->CKTreltol*MAX(fabs(ibchat),fabs(Ibc))+ckt->CKTabstol; - if (fabs(ibchat-Ibc) > tol) { - ckt->CKTnoncon++; - ckt->CKTtroubleElt = (GENinstance *) here; - return(OK); /* no reason to continue - we've failed... */ - } else { - tol=ckt->CKTreltol*MAX(fabs(ibephat),fabs(Ibep))+ckt->CKTabstol; - if (fabs(ibephat-Ibep) > tol) { - ckt->CKTnoncon++; - ckt->CKTtroubleElt = (GENinstance *) here; - return(OK); /* no reason to continue - we've failed... */ - } else { - tol=ckt->CKTreltol*MAX(fabs(ircihat),fabs(Irci))+ckt->CKTabstol; - if (fabs(ircihat-Irci) > tol) { - ckt->CKTnoncon++; - ckt->CKTtroubleElt = (GENinstance *) here; - return(OK); /* no reason to continue - we've failed... */ - } else { - tol=ckt->CKTreltol*MAX(fabs(irbihat),fabs(Irbi))+ckt->CKTabstol; - if (fabs(irbihat-Irbi) > tol) { - ckt->CKTnoncon++; - ckt->CKTtroubleElt = (GENinstance *) here; - return(OK); /* no reason to continue - we've failed... */ - } else { - tol=ckt->CKTreltol*MAX(fabs(irbphat),fabs(Irbp))+ckt->CKTabstol; - if (fabs(irbphat-Irbp) > tol) { - ckt->CKTnoncon++; - ckt->CKTtroubleElt = (GENinstance *) here; - return(OK); /* no reason to continue - we've failed... */ - } else { - tol=ckt->CKTreltol*MAX(fabs(ibcphat),fabs(Ibcp))+ckt->CKTabstol; - if (fabs(ibcphat-Ibcp) > tol) { - ckt->CKTnoncon++; - ckt->CKTtroubleElt = (GENinstance *) here; - return(OK); /* no reason to continue - we've failed... */ - } else { - tol=ckt->CKTreltol*MAX(fabs(iccphat),fabs(Iccp))+ckt->CKTabstol; - if (fabs(iccphat-Iccp) > tol) { - ckt->CKTnoncon++; - ckt->CKTtroubleElt = (GENinstance *) here; - return(OK); /* no reason to continue - we've failed... */ - } - } - } - } - } - } - } - } - } - } - } - } - } - return(OK); -} diff --git a/src/spicelib/devices/vbic/vbicdefs.h b/src/spicelib/devices/vbic/vbicdefs.h deleted file mode 100644 index 1ed3f31f1..000000000 --- a/src/spicelib/devices/vbic/vbicdefs.h +++ /dev/null @@ -1,796 +0,0 @@ -/********** -Copyright 1990 Regents of the University of California. All rights reserved. -Author: 1985 Thomas L. Quarles -Model Author: 1995 Colin McAndrew Motorola -Spice3 Implementation: 2003 Dietmar Warning DAnalyse GmbH -**********/ - -#ifndef VBIC -#define VBIC - -#include "ngspice/cktdefs.h" -#include "ngspice/ifsim.h" -#include "ngspice/gendefs.h" -#include "ngspice/complex.h" -#include "ngspice/noisedef.h" - -/* structures to describe Bipolar Junction Transistors */ - -/* indices to array of VBIC noise sources */ - -enum { - VBICRCNOIZ = 0, - VBICRCINOIZ, - VBICRBNOIZ, - VBICRBINOIZ, - VBICRENOIZ, - VBICRBPNOIZ, - VBICRSNOIZ, - VBICICNOIZ, - VBICIBNOIZ, - VBICIBEPNOIZ, - VBICICCPNOIZ, - VBICFLBENOIZ, - VBICFLBEPNOIZ, - VBICTOTNOIZ, - /* finally, the number of noise sources */ - VBICNSRCS -}; - -/* data needed to describe a single instance */ - -typedef struct sVBICinstance { - - struct GENinstance gen; - -#define VBICmodPtr(inst) ((struct sVBICmodel *)((inst)->gen.GENmodPtr)) -#define VBICnextInstance(inst) ((struct sVBICinstance *)((inst)->gen.GENnextInstance)) -#define VBICname gen.GENname -#define VBICstate gen.GENstate - - const int VBICcollNode; /* number of collector node of vbic */ - const int VBICbaseNode; /* number of base node of vbic */ - const int VBICemitNode; /* number of emitter node of vbic */ - const int VBICsubsNode; /* number of substrate node of vbic */ - const int VBICtempNode; /* number of the temperature node of the vbic */ - int VBICcollCXNode; /* number of internal collector node of vbic */ - int VBICcollCINode; /* number of internal collector node of vbic */ - int VBICbaseBXNode; /* number of internal base node of vbic */ - int VBICbaseBINode; /* number of internal base node of vbic */ - int VBICemitEINode; /* number of internal emitter node of vbic */ - int VBICbaseBPNode; /* number of internal base node of vbic */ - int VBICsubsSINode; /* number of internal substrate node */ - - double VBICarea; /* area factor for the vbic */ - double VBICicVBE; /* initial condition voltage B-E*/ - double VBICicVCE; /* initial condition voltage C-E*/ - double VBICtemp; /* instance temperature */ - double VBICdtemp; /* instance delta temperature */ - double VBICm; /* multiply factor for the vbic */ - - double VBICtVcrit; - double VBICtextCollResist; - double VBICtintCollResist; - double VBICtepiSatVoltage; - double VBICtepiDoping; - double VBICtextBaseResist; - double VBICtintBaseResist; - double VBICtemitterResist; - double VBICtsubstrateResist; - double VBICtparBaseResist; - double VBICtsatCur; - double VBICtemissionCoeffF; - double VBICtemissionCoeffR; - double VBICtdepletionCapBE; - double VBICtpotentialBE; - double VBICtdepletionCapBC; - double VBICtextCapBC; - double VBICtpotentialBC; - double VBICtextCapSC; - double VBICtpotentialSC; - double VBICtidealSatCurBE; - double VBICtnidealSatCurBE; - double VBICtidealSatCurBC; - double VBICtnidealSatCurBC; - double VBICtavalanchePar2BC; - double VBICtparasitSatCur; - double VBICtidealParasitSatCurBE; - double VBICtnidealParasitSatCurBE; - double VBICtidealParasitSatCurBC; - double VBICtnidealParasitSatCurBC; - double VBICtrollOffF; - double VBICtsepISRR; - double VBICtvbbe; - double VBICtnbbe; - - double *VBICcollCollPtr; /* pointer to sparse matrix at - * (collector,collector) */ - double *VBICbaseBasePtr; /* pointer to sparse matrix at - * (base,base) */ - double *VBICemitEmitPtr; /* pointer to sparse matrix at - * (emitter,emitter) */ - double *VBICsubsSubsPtr; /* pointer to sparse matrix at - * (substrate,substrate) */ - double *VBICcollCXCollCXPtr; /* pointer to sparse matrix at - * (collector prime,collector prime) */ - double *VBICcollCICollCIPtr; /* pointer to sparse matrix at - * (collector prime,collector prime) */ - double *VBICbaseBXBaseBXPtr; /* pointer to sparse matrix at - * (base prime,base prime) */ - double *VBICbaseBIBaseBIPtr; /* pointer to sparse matrix at - * (collector prime,collector prime) */ - double *VBICbaseBPBaseBPPtr; /* pointer to sparse matrix at - * (collector prime,collector prime) */ - double *VBICemitEIEmitEIPtr; /* pointer to sparse matrix at - * (emitter prime,emitter prime) */ - double *VBICsubsSISubsSIPtr; /* pointer to sparse matrix at - * (substrate prime, substrate prime) */ - - double *VBICbaseEmitPtr; /* pointer to sparse matrix at - * (base,emit) */ - double *VBICemitBasePtr; /* pointer to sparse matrix at - * (emit,base) */ - double *VBICbaseCollPtr; /* pointer to sparse matrix at - * (base,coll) */ - double *VBICcollBasePtr; /* pointer to sparse matrix at - * (coll,base) */ - double *VBICcollCollCXPtr; /* pointer to sparse matrix at - * (collector,collector prime) */ - double *VBICbaseBaseBXPtr; /* pointer to sparse matrix at - * (base,base prime) */ - double *VBICemitEmitEIPtr; /* pointer to sparse matrix at - * (emitter,emitter prime) */ - double *VBICsubsSubsSIPtr; /* pointer to sparse matrix at - * (substrate, Substrate connection) */ - double *VBICcollCXCollCIPtr; /* pointer to sparse matrix at - * (collector prime,base prime) */ - double *VBICcollCXBaseBXPtr; /* pointer to sparse matrix at - * (collector prime,collector prime) */ - double *VBICcollCXBaseBIPtr; /* pointer to sparse matrix at - * (collector prime,collector prime) */ - double *VBICcollCXBaseBPPtr; /* pointer to sparse matrix at - * (collector prime,base prime) */ - double *VBICcollCIBaseBIPtr; /* pointer to sparse matrix at - * (collector prime,base) */ - double *VBICcollCIEmitEIPtr; /* pointer to sparse matrix at - * (collector prime,emitter prime) */ - double *VBICbaseBXBaseBIPtr; /* pointer to sparse matrix at - * (base primt,emitter prime) */ - double *VBICbaseBXEmitEIPtr; /* pointer to sparse matrix at - * (base primt,emitter prime) */ - double *VBICbaseBXBaseBPPtr; /* pointer to sparse matrix at - * (base primt,emitter prime) */ - double *VBICbaseBXSubsSIPtr; /* pointer to sparse matrix at - * (base primt,emitter prime) */ - double *VBICbaseBIEmitEIPtr; /* pointer to sparse matrix at - * (base primt,emitter prime) */ - double *VBICbaseBPSubsSIPtr; /* pointer to sparse matrix at - * (base primt,emitter prime) */ - - double *VBICcollCXCollPtr; /* pointer to sparse matrix at - * (collector prime,collector) */ - double *VBICbaseBXBasePtr; /* pointer to sparse matrix at - * (base prime,base ) */ - double *VBICemitEIEmitPtr; /* pointer to sparse matrix at - * (emitter prime,emitter) */ - double *VBICsubsSISubsPtr; /* pointer to sparse matrix at - * (Substrate connection, substrate) */ - double *VBICcollCICollCXPtr; /* pointer to sparse matrix at - * (collector prime,base prime) */ - double *VBICbaseBICollCXPtr; /* pointer to sparse matrix at - * (base prime,collector prime) */ - double *VBICbaseBPCollCXPtr; /* pointer to sparse matrix at - * (base primt,emitter prime) */ - double *VBICbaseBXCollCIPtr; /* pointer to sparse matrix at - * (base,collector prime) */ - double *VBICbaseBICollCIPtr; /* pointer to sparse matrix at - * (base,collector prime) */ - double *VBICemitEICollCIPtr; /* pointer to sparse matrix at - * (emitter prime,collector prime) */ - double *VBICbaseBPCollCIPtr; /* pointer to sparse matrix at - * (base primt,emitter prime) */ - double *VBICsubsSICollCIPtr; /* pointer to sparse matrix at - * (substrate,collector prime) */ - double *VBICbaseBIBaseBXPtr; /* pointer to sparse matrix at - * (base primt,emitter prime) */ - double *VBICemitEIBaseBXPtr; /* pointer to sparse matrix at - * (emitter prime,base prime) */ - double *VBICbaseBPBaseBXPtr; /* pointer to sparse matrix at - * (base primt,emitter prime) */ - double *VBICsubsSIBaseBXPtr; /* pointer to sparse matrix at - * (substrate,substrate) */ - double *VBICemitEIBaseBIPtr; /* pointer to sparse matrix at - * (emitter prime,base prime) */ - double *VBICbaseBPBaseBIPtr; /* pointer to sparse matrix at - * (base primt,emitter prime) */ - double *VBICsubsSIBaseBIPtr; /* pointer to sparse matrix at - * (substrate,base prime) */ - double *VBICsubsSIBaseBPPtr; /* pointer to sparse matrix at - * (substrate,substrate) */ - - /* self heating */ - double *VBICcollTempPtr; - double *VBICbaseTempPtr; - double *VBICemitTempPtr; - double *VBICsubsTempPtr; - double *VBICcollCItempPtr; - double *VBICcollCXtempPtr; - double *VBICbaseBItempPtr; - double *VBICbaseBXtempPtr; - double *VBICbaseBPtempPtr; - double *VBICemitEItempPtr; - double *VBICsubsSItempPtr; - double *VBICtempCollPtr; - double *VBICtempCollCIPtr; - double *VBICtempCollCXPtr; - double *VBICtempBasePtr; - double *VBICtempBaseBIPtr; - double *VBICtempBaseBXPtr; - double *VBICtempBaseBPPtr; - double *VBICtempEmitPtr; - double *VBICtempEmitEIPtr; - double *VBICtempSubsPtr; - double *VBICtempSubsSIPtr; - double *VBICtempTempPtr; - - unsigned VBICareaGiven :1; /* flag to indicate area was specified */ - unsigned VBICoff :1; /* 'off' flag for vbic */ - unsigned VBICicVBEGiven :1; /* flag to indicate VBE init. cond. given */ - unsigned VBICicVCEGiven :1; /* flag to indicate VCE init. cond. given */ - unsigned VBICtempGiven :1; /* temperature given for vbic instance*/ - unsigned VBICdtempGiven :1; /* delta temperature given for vbic instance*/ - unsigned VBICmGiven :1; /* flag to indicate multiplier was specified */ - - double VBICcapbe; - double VBICcapbex; - double VBICcapbc; - double VBICcapbcx; - double VBICcapbep; - double VBICcapbcp; - double VBICcapcth; - - int VBIC_selfheat; /* self-heating enabled */ - -#ifndef NONOISE - double VBICnVar[NSTATVARS][VBICNSRCS]; -#else /*NONOISE*/ - double **VBICnVar; -#endif /*NONOISE*/ -/* the above to avoid allocating memory when it is not needed */ - -} VBICinstance ; - -/* entries in the state vector for vbic: */ - -#define VBICvbei VBICstate -#define VBICvbex VBICstate+1 -#define VBICvbci VBICstate+2 -#define VBICvbcx VBICstate+3 -#define VBICvbep VBICstate+4 -#define VBICvrci VBICstate+5 -#define VBICvrbi VBICstate+6 -#define VBICvrbp VBICstate+7 -#define VBICvbcp VBICstate+8 - -#define VBICibe VBICstate+9 -#define VBICibe_Vbei VBICstate+10 - -#define VBICibex VBICstate+11 -#define VBICibex_Vbex VBICstate+12 - -#define VBICitzf VBICstate+13 -#define VBICitzf_Vbei VBICstate+14 -#define VBICitzf_Vbci VBICstate+15 - -#define VBICitzr VBICstate+16 -#define VBICitzr_Vbci VBICstate+17 -#define VBICitzr_Vbei VBICstate+18 - -#define VBICibc VBICstate+19 -#define VBICibc_Vbci VBICstate+20 -#define VBICibc_Vbei VBICstate+21 - -#define VBICibep VBICstate+22 -#define VBICibep_Vbep VBICstate+23 - -#define VBICirci VBICstate+24 -#define VBICirci_Vrci VBICstate+25 -#define VBICirci_Vbci VBICstate+26 -#define VBICirci_Vbcx VBICstate+27 - -#define VBICirbi VBICstate+28 -#define VBICirbi_Vrbi VBICstate+29 -#define VBICirbi_Vbei VBICstate+30 -#define VBICirbi_Vbci VBICstate+31 - -#define VBICirbp VBICstate+32 -#define VBICirbp_Vrbp VBICstate+33 -#define VBICirbp_Vbep VBICstate+34 -#define VBICirbp_Vbci VBICstate+35 - - -#define VBICqbe VBICstate+36 -#define VBICcqbe VBICstate+37 -#define VBICcqbeci VBICstate+38 - -#define VBICqbex VBICstate+39 -#define VBICcqbex VBICstate+40 - -#define VBICqbc VBICstate+41 -#define VBICcqbc VBICstate+42 - -#define VBICqbcx VBICstate+43 -#define VBICcqbcx VBICstate+44 - -#define VBICqbep VBICstate+45 -#define VBICcqbep VBICstate+46 -#define VBICcqbepci VBICstate+47 - -#define VBICqbeo VBICstate+48 -#define VBICcqbeo VBICstate+49 -#define VBICgqbeo VBICstate+50 - -#define VBICqbco VBICstate+51 -#define VBICcqbco VBICstate+52 -#define VBICgqbco VBICstate+53 - -#define VBICibcp VBICstate+54 -#define VBICibcp_Vbcp VBICstate+55 - -#define VBICiccp VBICstate+56 -#define VBICiccp_Vbep VBICstate+57 -#define VBICiccp_Vbci VBICstate+58 -#define VBICiccp_Vbcp VBICstate+59 - -#define VBICqbcp VBICstate+60 -#define VBICcqbcp VBICstate+61 - -#define VBICircx_Vrcx VBICstate+62 -#define VBICirbx_Vrbx VBICstate+63 -#define VBICirs_Vrs VBICstate+64 -#define VBICire_Vre VBICstate+65 - -#define VBICqcth VBICstate+66 /* thermal capacitor charge */ -#define VBICcqcth VBICstate+67 /* thermal capacitor current */ - -#define VBICvrth VBICstate+68 -#define VBICicth_Vrth VBICstate+69 - -#define VBICnumStates 70 - -/* per model data */ -typedef struct sVBICmodel { /* model structure for a vbic */ - - struct GENmodel gen; - -#define VBICmodType gen.GENmodType -#define VBICnextModel(inst) ((struct sVBICmodel *)((inst)->gen.GENnextModel)) -#define VBICinstances(inst) ((VBICinstance *)((inst)->gen.GENinstances)) -#define VBICmodName gen.GENmodName - - int VBICtype; - - double VBICtnom; - double VBICextCollResist; - double VBICintCollResist; - double VBICepiSatVoltage; - double VBICepiDoping; - double VBIChighCurFac; - double VBICextBaseResist; - double VBICintBaseResist; - double VBICemitterResist; - double VBICsubstrateResist; - double VBICparBaseResist; - double VBICsatCur; - double VBICemissionCoeffF; - double VBICemissionCoeffR; - double VBICdeplCapLimitF; - double VBICextOverlapCapBE; - double VBICdepletionCapBE; - double VBICpotentialBE; - double VBICjunctionExpBE; - double VBICsmoothCapBE; - double VBICextOverlapCapBC; - double VBICdepletionCapBC; - double VBICepiCharge; - double VBICextCapBC; - double VBICpotentialBC; - double VBICjunctionExpBC; - double VBICsmoothCapBC; - double VBICextCapSC; - double VBICpotentialSC; - double VBICjunctionExpSC; - double VBICsmoothCapSC; - double VBICidealSatCurBE; - double VBICportionIBEI; - double VBICidealEmissCoeffBE; - double VBICnidealSatCurBE; - double VBICnidealEmissCoeffBE; - double VBICidealSatCurBC; - double VBICidealEmissCoeffBC; - double VBICnidealSatCurBC; - double VBICnidealEmissCoeffBC; - double VBICavalanchePar1BC; - double VBICavalanchePar2BC; - double VBICparasitSatCur; - double VBICportionICCP; - double VBICparasitFwdEmissCoeff; - double VBICidealParasitSatCurBE; - double VBICnidealParasitSatCurBE; - double VBICidealParasitSatCurBC; - double VBICidealParasitEmissCoeffBC; - double VBICnidealParasitSatCurBC; - double VBICnidealParasitEmissCoeffBC; - double VBICearlyVoltF; - double VBICearlyVoltR; - double VBICrollOffF; - double VBICrollOffR; - double VBICparRollOff; - double VBICtransitTimeF; - double VBICvarTransitTimeF; - double VBICtransitTimeBiasCoeffF; - double VBICtransitTimeFVBC; - double VBICtransitTimeHighCurrentF; - double VBICtransitTimeR; - double VBICdelayTimeF; - double VBICfNcoef; - double VBICfNexpA; - double VBICfNexpB; - double VBICtempExpRE; - double VBICtempExpRB; - double VBICtempExpRBI; - double VBICtempExpRC; - double VBICtempExpRCI; - double VBICtempExpRS; - double VBICtempExpVO; - double VBICactivEnergyEA; - double VBICactivEnergyEAIE; - double VBICactivEnergyEAIC; - double VBICactivEnergyEAIS; - double VBICactivEnergyEANE; - double VBICactivEnergyEANC; - double VBICactivEnergyEANS; - double VBICtempExpIS; - double VBICtempExpII; - double VBICtempExpIN; - double VBICtempExpNF; - double VBICtempExpAVC; - double VBICthermalResist; - double VBICthermalCapacitance; - double VBICpunchThroughVoltageBC; - double VBICdeplCapCoeff1; - double VBICfixedCapacitanceCS; - double VBICsgpQBselector; - double VBIChighCurrentBetaRolloff; - double VBICtempExpIKF; - double VBICtempExpRCX; - double VBICtempExpRBX; - double VBICtempExpRBP; - double VBICsepISRR; - double VBICtempExpXISR; - double VBICdear; - double VBICeap; - double VBICvbbe; - double VBICnbbe; - double VBICibbe; - double VBICtvbbe1; - double VBICtvbbe2; - double VBICtnbbe; - double VBICebbe; - double VBIClocTempDiff; - double VBICrevVersion; - double VBICrefVersion; - - double VBICvbeMax; /* maximum voltage over B-E junction */ - double VBICvbcMax; /* maximum voltage over B-C junction */ - double VBICvceMax; /* maximum voltage over C-E branch */ - - unsigned VBICtnomGiven : 1; - unsigned VBICextCollResistGiven : 1; - unsigned VBICintCollResistGiven : 1; - unsigned VBICepiSatVoltageGiven : 1; - unsigned VBICepiDopingGiven : 1; - unsigned VBIChighCurFacGiven : 1; - unsigned VBICextBaseResistGiven : 1; - unsigned VBICintBaseResistGiven : 1; - unsigned VBICemitterResistGiven : 1; - unsigned VBICsubstrateResistGiven : 1; - unsigned VBICparBaseResistGiven : 1; - unsigned VBICsatCurGiven : 1; - unsigned VBICemissionCoeffFGiven : 1; - unsigned VBICemissionCoeffRGiven : 1; - unsigned VBICdeplCapLimitFGiven : 1; - unsigned VBICextOverlapCapBEGiven : 1; - unsigned VBICdepletionCapBEGiven : 1; - unsigned VBICpotentialBEGiven : 1; - unsigned VBICjunctionExpBEGiven : 1; - unsigned VBICsmoothCapBEGiven : 1; - unsigned VBICextOverlapCapBCGiven : 1; - unsigned VBICdepletionCapBCGiven : 1; - unsigned VBICepiChargeGiven : 1; - unsigned VBICextCapBCGiven : 1; - unsigned VBICpotentialBCGiven : 1; - unsigned VBICjunctionExpBCGiven : 1; - unsigned VBICsmoothCapBCGiven : 1; - unsigned VBICextCapSCGiven : 1; - unsigned VBICpotentialSCGiven : 1; - unsigned VBICjunctionExpSCGiven : 1; - unsigned VBICsmoothCapSCGiven : 1; - unsigned VBICidealSatCurBEGiven : 1; - unsigned VBICportionIBEIGiven : 1; - unsigned VBICidealEmissCoeffBEGiven : 1; - unsigned VBICnidealSatCurBEGiven : 1; - unsigned VBICnidealEmissCoeffBEGiven : 1; - unsigned VBICidealSatCurBCGiven : 1; - unsigned VBICidealEmissCoeffBCGiven : 1; - unsigned VBICnidealSatCurBCGiven : 1; - unsigned VBICnidealEmissCoeffBCGiven : 1; - unsigned VBICavalanchePar1BCGiven : 1; - unsigned VBICavalanchePar2BCGiven : 1; - unsigned VBICparasitSatCurGiven : 1; - unsigned VBICportionICCPGiven : 1; - unsigned VBICparasitFwdEmissCoeffGiven : 1; - unsigned VBICidealParasitSatCurBEGiven : 1; - unsigned VBICnidealParasitSatCurBEGiven : 1; - unsigned VBICidealParasitSatCurBCGiven : 1; - unsigned VBICidealParasitEmissCoeffBCGiven : 1; - unsigned VBICnidealParasitSatCurBCGiven : 1; - unsigned VBICnidealParasitEmissCoeffBCGiven : 1; - unsigned VBICearlyVoltFGiven : 1; - unsigned VBICearlyVoltRGiven : 1; - unsigned VBICrollOffFGiven : 1; - unsigned VBICrollOffRGiven : 1; - unsigned VBICparRollOffGiven : 1; - unsigned VBICtransitTimeFGiven : 1; - unsigned VBICvarTransitTimeFGiven : 1; - unsigned VBICtransitTimeBiasCoeffFGiven : 1; - unsigned VBICtransitTimeFVBCGiven : 1; - unsigned VBICtransitTimeHighCurrentFGiven : 1; - unsigned VBICtransitTimeRGiven : 1; - unsigned VBICdelayTimeFGiven : 1; - unsigned VBICfNcoefGiven : 1; - unsigned VBICfNexpAGiven : 1; - unsigned VBICfNexpBGiven : 1; - unsigned VBICtempExpREGiven : 1; - unsigned VBICtempExpRBGiven : 1; - unsigned VBICtempExpRBIGiven : 1; - unsigned VBICtempExpRCGiven : 1; - unsigned VBICtempExpRCIGiven : 1; - unsigned VBICtempExpRSGiven : 1; - unsigned VBICtempExpVOGiven : 1; - unsigned VBICactivEnergyEAGiven : 1; - unsigned VBICactivEnergyEAIEGiven : 1; - unsigned VBICactivEnergyEAICGiven : 1; - unsigned VBICactivEnergyEAISGiven : 1; - unsigned VBICactivEnergyEANEGiven : 1; - unsigned VBICactivEnergyEANCGiven : 1; - unsigned VBICactivEnergyEANSGiven : 1; - unsigned VBICtempExpISGiven : 1; - unsigned VBICtempExpIIGiven : 1; - unsigned VBICtempExpINGiven : 1; - unsigned VBICtempExpNFGiven : 1; - unsigned VBICtempExpAVCGiven : 1; - unsigned VBICthermalResistGiven : 1; - unsigned VBICthermalCapacitanceGiven : 1; - unsigned VBICpunchThroughVoltageBCGiven : 1; - unsigned VBICdeplCapCoeff1Given : 1; - unsigned VBICfixedCapacitanceCSGiven : 1; - unsigned VBICsgpQBselectorGiven : 1; - unsigned VBIChighCurrentBetaRolloffGiven : 1; - unsigned VBICtempExpIKFGiven : 1; - unsigned VBICtempExpRCXGiven : 1; - unsigned VBICtempExpRBXGiven : 1; - unsigned VBICtempExpRBPGiven : 1; - unsigned VBICsepISRRGiven : 1; - unsigned VBICtempExpXISRGiven : 1; - unsigned VBICdearGiven : 1; - unsigned VBICeapGiven : 1; - unsigned VBICvbbeGiven : 1; - unsigned VBICnbbeGiven : 1; - unsigned VBICibbeGiven : 1; - unsigned VBICtvbbe1Given : 1; - unsigned VBICtvbbe2Given : 1; - unsigned VBICtnbbeGiven : 1; - unsigned VBICebbeGiven : 1; - unsigned VBIClocTempDiffGiven : 1; - unsigned VBICrevVersionGiven : 1; - unsigned VBICrefVersionGiven : 1; - unsigned VBICvbeMaxGiven : 1; - unsigned VBICvbcMaxGiven : 1; - unsigned VBICvceMaxGiven : 1; -} VBICmodel; - -#ifndef NPN -#define NPN 1 -#define PNP -1 -#endif /*NPN*/ - -/* device parameters */ -enum { - VBIC_AREA = 1, - VBIC_OFF, - VBIC_IC, - VBIC_IC_VBE, - VBIC_IC_VCE, - VBIC_TEMP, - VBIC_DTEMP, - VBIC_M, -}; - -/* model parameters */ -enum { - VBIC_MOD_NPN = 101, - VBIC_MOD_PNP, - VBIC_MOD_TNOM, - VBIC_MOD_RCX, - VBIC_MOD_RCI, - VBIC_MOD_VO, - VBIC_MOD_GAMM, - VBIC_MOD_HRCF, - VBIC_MOD_RBX, - VBIC_MOD_RBI, - VBIC_MOD_RE, - VBIC_MOD_RS, - VBIC_MOD_RBP, - VBIC_MOD_IS, - VBIC_MOD_NF, - VBIC_MOD_NR, - VBIC_MOD_FC, - VBIC_MOD_CBEO, - VBIC_MOD_CJE, - VBIC_MOD_PE, - VBIC_MOD_ME, - VBIC_MOD_AJE, - VBIC_MOD_CBCO, - VBIC_MOD_CJC, - VBIC_MOD_QCO, - VBIC_MOD_CJEP, - VBIC_MOD_PC, - VBIC_MOD_MC, - VBIC_MOD_AJC, - VBIC_MOD_CJCP, - VBIC_MOD_PS, - VBIC_MOD_MS, - VBIC_MOD_AJS, - VBIC_MOD_IBEI, - VBIC_MOD_WBE, - VBIC_MOD_NEI, - VBIC_MOD_IBEN, - VBIC_MOD_NEN, - VBIC_MOD_IBCI, - VBIC_MOD_NCI, - VBIC_MOD_IBCN, - VBIC_MOD_NCN, - VBIC_MOD_AVC1, - VBIC_MOD_AVC2, - VBIC_MOD_ISP, - VBIC_MOD_WSP, - VBIC_MOD_NFP, - VBIC_MOD_IBEIP, - VBIC_MOD_IBENP, - VBIC_MOD_IBCIP, - VBIC_MOD_NCIP, - VBIC_MOD_IBCNP, - VBIC_MOD_NCNP, - VBIC_MOD_VEF, - VBIC_MOD_VER, - VBIC_MOD_IKF, - VBIC_MOD_IKR, - VBIC_MOD_IKP, - VBIC_MOD_TF, - VBIC_MOD_QTF, - VBIC_MOD_XTF, - VBIC_MOD_VTF, - VBIC_MOD_ITF, - VBIC_MOD_TR, - VBIC_MOD_TD, - VBIC_MOD_KFN, - VBIC_MOD_AFN, - VBIC_MOD_BFN, - VBIC_MOD_XRE, - VBIC_MOD_XRB, - VBIC_MOD_XRBI, - VBIC_MOD_XRC, - VBIC_MOD_XRCI, - VBIC_MOD_XRS, - VBIC_MOD_XVO, - VBIC_MOD_EA, - VBIC_MOD_EAIE, - VBIC_MOD_EAIC, - VBIC_MOD_EAIS, - VBIC_MOD_EANE, - VBIC_MOD_EANC, - VBIC_MOD_EANS, - VBIC_MOD_XIS, - VBIC_MOD_XII, - VBIC_MOD_XIN, - VBIC_MOD_TNF, - VBIC_MOD_TAVC, - VBIC_MOD_RTH, - VBIC_MOD_CTH, - VBIC_MOD_VRT, - VBIC_MOD_ART, - VBIC_MOD_CCSO, - VBIC_MOD_QBM, - VBIC_MOD_NKF, - VBIC_MOD_XIKF, - VBIC_MOD_XRCX, - VBIC_MOD_XRBX, - VBIC_MOD_XRBP, - VBIC_MOD_ISRR, - VBIC_MOD_XISR, - VBIC_MOD_DEAR, - VBIC_MOD_EAP, - VBIC_MOD_VBBE, - VBIC_MOD_NBBE, - VBIC_MOD_IBBE, - VBIC_MOD_TVBBE1, - VBIC_MOD_TVBBE2, - VBIC_MOD_TNBBE, - VBIC_MOD_EBBE, - VBIC_MOD_DTEMP, - VBIC_MOD_VERS, - VBIC_MOD_VREF, - VBIC_MOD_VBE_MAX, - VBIC_MOD_VBC_MAX, - VBIC_MOD_VCE_MAX, -}; - -/* device questions */ -enum { - VBIC_QUEST_FT = 221, - VBIC_QUEST_COLLNODE, - VBIC_QUEST_BASENODE, - VBIC_QUEST_EMITNODE, - VBIC_QUEST_SUBSNODE, - VBIC_QUEST_COLLCXNODE, - VBIC_QUEST_COLLCINODE, - VBIC_QUEST_BASEBXNODE, - VBIC_QUEST_BASEBINODE, - VBIC_QUEST_BASEBPNODE, - VBIC_QUEST_EMITEINODE, - VBIC_QUEST_SUBSSINODE, - VBIC_QUEST_VBE, - VBIC_QUEST_VBC, - VBIC_QUEST_CC, - VBIC_QUEST_CB, - VBIC_QUEST_CE, - VBIC_QUEST_CS, - VBIC_QUEST_GM, - VBIC_QUEST_GO, - VBIC_QUEST_GPI, - VBIC_QUEST_GMU, - VBIC_QUEST_GX, - VBIC_QUEST_QBE, - VBIC_QUEST_CQBE, - VBIC_QUEST_QBC, - VBIC_QUEST_CQBC, - VBIC_QUEST_QBX, - VBIC_QUEST_CQBX, - VBIC_QUEST_QBCP, - VBIC_QUEST_CQBCP, - VBIC_QUEST_CEXBC, - VBIC_QUEST_GEQCB, - VBIC_QUEST_GCSUB, - VBIC_QUEST_GDSUB, - VBIC_QUEST_GEQBX, - VBIC_QUEST_CBE, - VBIC_QUEST_CBEX, - VBIC_QUEST_CBC, - VBIC_QUEST_CBCX, - VBIC_QUEST_CBEP, - VBIC_QUEST_CBCP, - VBIC_QUEST_POWER, -}; - -/* model questions */ -enum { - VBIC_MOD_COLLCONDUCT = 301, - VBIC_MOD_BASECONDUCT, - VBIC_MOD_EMITTERCONDUCT, - VBIC_MOD_SUBSTRATECONDUCT, - VBIC_MOD_TYPE, -}; - -#include "vbicext.h" -#endif /*VBIC*/ diff --git a/src/spicelib/devices/vbic/vbicext.h b/src/spicelib/devices/vbic/vbicext.h deleted file mode 100644 index 975f75c8e..000000000 --- a/src/spicelib/devices/vbic/vbicext.h +++ /dev/null @@ -1,28 +0,0 @@ -/********** -Copyright 1990 Regents of the University of California. All rights reserved. -Author: 1985 Thomas L. Quarles -Model Author: 1995 Colin McAndrew Motorola -Spice3 Implementation: 2003 Dietmar Warning DAnalyse GmbH -**********/ -#ifndef __VBICEXT_H -#define __VBICEXT_H - - -extern int VBICacLoad(GENmodel *,CKTcircuit*); -extern int VBICask(CKTcircuit *,GENinstance*,int,IFvalue*,IFvalue*); -extern int VBICconvTest(GENmodel*,CKTcircuit*); -extern int VBICdelete(GENinstance*); -extern int VBICgetic(GENmodel*,CKTcircuit*); -extern int VBICload(GENmodel*,CKTcircuit*); -extern int VBICmAsk(CKTcircuit*,GENmodel*,int,IFvalue*); -extern int VBICmParam(int,IFvalue*,GENmodel*); -extern int VBICparam(int,IFvalue*,GENinstance*,IFvalue*); -extern int VBICpzLoad(GENmodel*, CKTcircuit*, SPcomplex*); -extern int VBICsetup(SMPmatrix*,GENmodel*,CKTcircuit*,int*); -extern int VBICunsetup(GENmodel*,CKTcircuit*); -extern int VBICtemp(GENmodel*,CKTcircuit*); -extern int VBICtrunc(GENmodel*,CKTcircuit*,double*); -extern int VBICnoise(int,int,GENmodel*,CKTcircuit*,Ndata*,double*); -extern int VBICsoaCheck(CKTcircuit *, GENmodel *); - -#endif diff --git a/src/spicelib/devices/vbic/vbicgetic.c b/src/spicelib/devices/vbic/vbicgetic.c deleted file mode 100644 index 54598720b..000000000 --- a/src/spicelib/devices/vbic/vbicgetic.c +++ /dev/null @@ -1,47 +0,0 @@ -/********** -Copyright 1990 Regents of the University of California. All rights reserved. -Author: 1985 Thomas L. Quarles -Model Author: 1995 Colin McAndrew Motorola -Spice3 Implementation: 2003 Dietmar Warning DAnalyse GmbH -**********/ - -/* - * This routine gets the device initial conditions for the VBICs - * from the RHS vector - */ - -#include "ngspice/ngspice.h" -#include "ngspice/cktdefs.h" -#include "vbicdefs.h" -#include "ngspice/sperror.h" -#include "ngspice/suffix.h" - - -int -VBICgetic(GENmodel *inModel, CKTcircuit *ckt) -{ - - VBICmodel *model = (VBICmodel*)inModel; - VBICinstance *here; - /* - * grab initial conditions out of rhs array. User specified, so use - * external nodes to get values - */ - - for( ; model ; model = VBICnextModel(model)) { - for(here = VBICinstances(model); here ; here = VBICnextInstance(here)) { - - if(!here->VBICicVBEGiven) { - here->VBICicVBE = - *(ckt->CKTrhs + here->VBICbaseNode) - - *(ckt->CKTrhs + here->VBICemitNode); - } - if(!here->VBICicVCEGiven) { - here->VBICicVCE = - *(ckt->CKTrhs + here->VBICcollNode) - - *(ckt->CKTrhs + here->VBICemitNode); - } - } - } - return(OK); -} diff --git a/src/spicelib/devices/vbic/vbicinit.c b/src/spicelib/devices/vbic/vbicinit.c deleted file mode 100644 index f7f37112f..000000000 --- a/src/spicelib/devices/vbic/vbicinit.c +++ /dev/null @@ -1,81 +0,0 @@ -/* - * vbicinit.c - */ - - -#include "ngspice/config.h" - -#include "ngspice/devdefs.h" - -#include "vbicitf.h" -#include "vbicext.h" -#include "vbicinit.h" - - -SPICEdev VBICinfo = { - .DEVpublic = { - .name = "VBIC", - .description = "Vertical Bipolar Inter-Company Model", - .terms = &VBICnSize, - .numNames = &VBICnSize, - .termNames = VBICnames, - .numInstanceParms = &VBICpTSize, - .instanceParms = VBICpTable, - .numModelParms = &VBICmPTSize, - .modelParms = VBICmPTable, - .flags = DEV_DEFAULT, - -#ifdef XSPICE - .cm_func = NULL, - .num_conn = 0, - .conn = NULL, - .num_param = 0, - .param = NULL, - .num_inst_var = 0, - .inst_var = NULL, -#endif - }, - - .DEVparam = VBICparam, - .DEVmodParam = VBICmParam, - .DEVload = VBICload, - .DEVsetup = VBICsetup, - .DEVunsetup = VBICunsetup, - .DEVpzSetup = VBICsetup, - .DEVtemperature = VBICtemp, - .DEVtrunc = VBICtrunc, - .DEVfindBranch = NULL, - .DEVacLoad = VBICacLoad, - .DEVaccept = NULL, - .DEVdestroy = NULL, - .DEVmodDelete = NULL, - .DEVdelete = NULL, - .DEVsetic = VBICgetic, - .DEVask = VBICask, - .DEVmodAsk = VBICmAsk, - .DEVpzLoad = VBICpzLoad, - .DEVconvTest = VBICconvTest, - .DEVsenSetup = NULL, - .DEVsenLoad = NULL, - .DEVsenUpdate = NULL, - .DEVsenAcLoad = NULL, - .DEVsenPrint = NULL, - .DEVsenTrunc = NULL, - .DEVdisto = NULL, - .DEVnoise = VBICnoise, - .DEVsoaCheck = VBICsoaCheck, - .DEVinstSize = &VBICiSize, - .DEVmodSize = &VBICmSize, - -#ifdef CIDER - .DEVdump = NULL, - .DEVacct = NULL, -#endif -}; - - -SPICEdev * -get_vbic_info(void) -{ - return &VBICinfo; -} diff --git a/src/spicelib/devices/vbic/vbicinit.h b/src/spicelib/devices/vbic/vbicinit.h deleted file mode 100644 index 02d412e23..000000000 --- a/src/spicelib/devices/vbic/vbicinit.h +++ /dev/null @@ -1,13 +0,0 @@ -#ifndef _VBICINIT_H -#define _VBICINIT_H - -extern IFparm VBICpTable[ ]; -extern IFparm VBICmPTable[ ]; -extern char *VBICnames[ ]; -extern int VBICpTSize; -extern int VBICmPTSize; -extern int VBICnSize; -extern int VBICiSize; -extern int VBICmSize; - -#endif diff --git a/src/spicelib/devices/vbic/vbicitf.h b/src/spicelib/devices/vbic/vbicitf.h deleted file mode 100644 index c088c07a2..000000000 --- a/src/spicelib/devices/vbic/vbicitf.h +++ /dev/null @@ -1,12 +0,0 @@ -/********** -Copyright 1990 Regents of the University of California. All rights reserved. -Author: 1985 Thomas L. Quarles -Model Author: 1995 Colin McAndrew Motorola -Spice3 Implementation: 2003 Dietmar Warning DAnalyse GmbH -**********/ -#ifndef DEV_VBIC -#define DEV_VBIC - -extern SPICEdev *get_vbic_info(void); - -#endif diff --git a/src/spicelib/devices/vbic/vbicload.c b/src/spicelib/devices/vbic/vbicload.c deleted file mode 100644 index 5ebf217e6..000000000 --- a/src/spicelib/devices/vbic/vbicload.c +++ /dev/null @@ -1,3980 +0,0 @@ -/********** -Copyright 1990 Regents of the University of California. All rights reserved. -Author: 1985 Thomas L. Quarles -Model Author: 1995 Colin McAndrew Motorola -Spice3 Implementation: 2003 Dietmar Warning DAnalyse GmbH -**********/ - -/* - * This is the function called each iteration to evaluate the - * VBICs in the circuit and load them into the matrix as appropriate - */ - -#include "ngspice/ngspice.h" -#include "ngspice/cktdefs.h" -#include "vbicdefs.h" -#include "ngspice/const.h" -#include "ngspice/trandefs.h" -#include "ngspice/sperror.h" -#include "ngspice/devdefs.h" - -int vbic_4T_et_cf_fj(double *, - double *,double *,double *,double *,double *,double *, - double *,double *,double *,double *,double *,double *, double *, - double *,double *,double *,double *,double *,double *, double *, - double *,double *,double *,double *,double *,double *, double *, - double *,double *,double *,double *,double *,double *, double *, - double *,double *,double *,double *,double *,double *, double *, - double *,double *,double *,double *,double *,double *, double *, - double *,double *,double *,double *,double *,double *, double *, - double *,double *,double *,double *,double *,double *, double *, - double *,double *,double *,double *,double *,double *, double *, - double *,double *,double *,double *,double *,double *, double *, - double *,double *,double *,double *,double *,double *, double *, - double *,double *,double *,double *,double *,double *, double *, - double *,double *,double *,double *,double *,double *, double *, - double *,double *,double *,double *,double *,double *, double *, - double *,double *,double *,double *,double *,double *, double *, - double *,double *,double *,double *,double *,double *, double *, - double *,double *); - -int -VBICload(GENmodel *inModel, CKTcircuit *ckt) - /* actually load the current resistance value into the - * sparse matrix previously provided - */ -{ - VBICmodel *model = (VBICmodel*)inModel; - VBICinstance *here; - double p[108] - ,Vrth=0.0,Vbei,Vbex,Vbci,Vbep,Vbcp - ,Vrcx,Vbcx,Vrci,Vrbx,Vrbi,Vre,Vrbp - ,Vrs,Vbe,Vbc,Vcei=0.0,Vcep=0.0,Ibe,Ibe_Vrth=0.0 - ,Ibe_Vbei,Ibex,Ibex_Vrth=0.0,Ibex_Vbex,Itzf,Itzf_Vrth=0.0,Itzf_Vbei - ,Itzf_Vbci,Itzr,Itzr_Vrth=0.0,Itzr_Vbci,Itzr_Vbei,Ibc,Ibc_Vrth=0.0 - ,Ibc_Vbci,Ibc_Vbei,Ibep,Ibep_Vrth=0.0,Ibep_Vbep,Ircx,Ircx_Vrcx - ,Ircx_Vrth=0.0,Irci,Irci_Vrci,Irci_Vrth=0.0,Irci_Vbci,Irci_Vbcx,Irbx - ,Irbx_Vrbx,Irbx_Vrth=0.0,Irbi,Irbi_Vrbi,Irbi_Vrth=0.0,Irbi_Vbei,Irbi_Vbci - ,Ire,Ire_Vre,Ire_Vrth=0.0,Irbp,Irbp_Vrbp,Irbp_Vrth=0.0,Irbp_Vbep - ,Irbp_Vbci,Qbe,Qbe_Vrth,Qbe_Vbei,Qbe_Vbci,Qbex,Qbex_Vrth - ,Qbex_Vbex,Qbc,Qbc_Vrth,Qbc_Vbci,Qbcx,Qbcx_Vrth,Qbcx_Vbcx - ,Qbep,Qbep_Vrth,Qbep_Vbep,Qbep_Vbci,Qbeo,Qbeo_Vbe,Qbco - ,Qbco_Vbc,Ibcp,Ibcp_Vrth=0.0,Ibcp_Vbcp,Iccp,Iccp_Vrth=0.0,Iccp_Vbep - ,Iccp_Vbci,Iccp_Vbcp,Irs,Irs_Vrs,Irs_Vrth=0.0,Qbcp,Qbcp_Vrth - ,Qbcp_Vbcp,Irth,Irth_Vrth=0.0,Ith=0.0,Ith_Vrth=0.0,Ith_Vbei=0.0,Ith_Vbci=0.0 - ,Ith_Vcei=0.0,Ith_Vbex=0.0,Ith_Vbep=0.0,Ith_Vrs=0.0,Ith_Vbcp=0.0,Ith_Vcep=0.0,Ith_Vrcx=0.0 - ,Ith_Vrci=0.0,Ith_Vbcx=0.0,Ith_Vrbx=0.0,Ith_Vrbi=0.0,Ith_Vre=0.0,Ith_Vrbp=0.0,Qcth - ,Qcth_Vrth,SCALE; - int iret; - double vce; -#ifndef PREDICTOR - double xfact; -#endif - double vt; - double delvbei; - double delvbex; - double delvbci; - double delvbcx; - double delvbep; - double delvrci; - double delvrbi; - double delvrbp; - double delvbcp; - double ibehat; - double ibexhat; - double itzfhat; - double itzrhat; - double ibchat; - double ibephat; - double ircihat; - double irbihat; - double irbphat; - double ibcphat; - double iccphat; - double ceq, geq, rhs_current; - int icheck=1; - int ichk1, ichk2, ichk3, ichk4, ichk5, ichk6; - int error; - double gqbeo, cqbeo, gqbco, cqbco, gbcx, cbcx; - double Icth, Icth_Vrth; - - /* loop through all the models */ - for( ; model != NULL; model = VBICnextModel(model)) { - - /* loop through all the instances of the model */ - for (here = VBICinstances(model); here != NULL ; - here=VBICnextInstance(here)) { - - vt = here->VBICtemp * CONSTKoverQ; - - gbcx = 0.0; - cbcx = 0.0; - gqbeo = 0.0; - cqbeo = 0.0; - gqbco = 0.0; - cqbco = 0.0; - Icth = 0.0, Icth_Vrth = 0.0; - /* - * model parameters - */ - p[0] = model->VBICtnom; - p[1] = here->VBICtextCollResist; - p[2] = here->VBICtintCollResist; - p[3] = here->VBICtepiSatVoltage; - p[4] = here->VBICtepiDoping; - p[5] = model->VBIChighCurFac; - p[6] = here->VBICtextBaseResist; - p[7] = here->VBICtintBaseResist; - p[8] = here->VBICtemitterResist; - p[9] = here->VBICtsubstrateResist; - p[10] = here->VBICtparBaseResist; - p[11] = here->VBICtsatCur; - p[12] = here->VBICtemissionCoeffF; - p[13] = here->VBICtemissionCoeffR; - p[14] = model->VBICdeplCapLimitF; - p[15] = model->VBICextOverlapCapBE; - p[16] = here->VBICtdepletionCapBE; - p[17] = here->VBICtpotentialBE; - p[18] = model->VBICjunctionExpBE; - p[19] = model->VBICsmoothCapBE; - p[20] = model->VBICextOverlapCapBC; - p[21] = here->VBICtdepletionCapBC; - p[22] = model->VBICepiCharge; - p[23] = here->VBICtextCapBC; - p[24] = here->VBICtpotentialBC; - p[25] = model->VBICjunctionExpBC; - p[26] = model->VBICsmoothCapBC; - p[27] = here->VBICtextCapSC; - p[28] = here->VBICtpotentialSC; - p[29] = model->VBICjunctionExpSC; - p[30] = model->VBICsmoothCapSC; - p[31] = here->VBICtidealSatCurBE; - p[32] = model->VBICportionIBEI; - p[33] = model->VBICidealEmissCoeffBE; - p[34] = here->VBICtnidealSatCurBE; - p[35] = model->VBICnidealEmissCoeffBE; - p[36] = here->VBICtidealSatCurBC; - p[37] = model->VBICidealEmissCoeffBC; - p[38] = here->VBICtnidealSatCurBC; - p[39] = model->VBICnidealEmissCoeffBC; - p[40] = model->VBICavalanchePar1BC; - p[41] = here->VBICtavalanchePar2BC; - p[42] = here->VBICtparasitSatCur; - p[43] = model->VBICportionICCP; - p[44] = model->VBICparasitFwdEmissCoeff; - p[45] = here->VBICtidealParasitSatCurBE; - p[46] = here->VBICtnidealParasitSatCurBE; - p[47] = here->VBICtidealParasitSatCurBC; - p[48] = model->VBICidealParasitEmissCoeffBC; - p[49] = here->VBICtnidealParasitSatCurBC; - p[50] = model->VBICnidealParasitEmissCoeffBC; - p[51] = model->VBICearlyVoltF; - p[52] = model->VBICearlyVoltR; - p[53] = here->VBICtrollOffF; - p[54] = model->VBICrollOffR; - p[55] = model->VBICparRollOff; - p[56] = model->VBICtransitTimeF; - p[57] = model->VBICvarTransitTimeF; - p[58] = model->VBICtransitTimeBiasCoeffF; - p[59] = model->VBICtransitTimeFVBC; - p[60] = model->VBICtransitTimeHighCurrentF; - p[61] = model->VBICtransitTimeR; - p[62] = model->VBICdelayTimeF; - p[63] = model->VBICfNcoef; - p[64] = model->VBICfNexpA; - p[65] = model->VBICfNexpB; - p[66] = model->VBICtempExpRE; - p[67] = model->VBICtempExpRBI; - p[68] = model->VBICtempExpRCI; - p[69] = model->VBICtempExpRS; - p[70] = model->VBICtempExpVO; - p[71] = model->VBICactivEnergyEA; - p[72] = model->VBICactivEnergyEAIE; - p[73] = model->VBICactivEnergyEAIC; - p[74] = model->VBICactivEnergyEAIS; - p[75] = model->VBICactivEnergyEANE; - p[76] = model->VBICactivEnergyEANC; - p[77] = model->VBICactivEnergyEANS; - p[78] = model->VBICtempExpIS; - p[79] = model->VBICtempExpII; - p[80] = model->VBICtempExpIN; - p[81] = model->VBICtempExpNF; - p[82] = model->VBICtempExpAVC; - p[83] = model->VBICthermalResist; - p[84] = model->VBICthermalCapacitance; - p[85] = model->VBICpunchThroughVoltageBC; - p[86] = model->VBICdeplCapCoeff1; - p[87] = model->VBICfixedCapacitanceCS; - p[88] = model->VBICsgpQBselector; - p[89] = model->VBIChighCurrentBetaRolloff; - p[90] = model->VBICtempExpIKF; - p[91] = model->VBICtempExpRCX; - p[92] = model->VBICtempExpRBX; - p[93] = model->VBICtempExpRBP; - p[94] = here->VBICtsepISRR; - p[95] = model->VBICtempExpXISR; - p[96] = model->VBICdear; - p[97] = model->VBICeap; - p[98] = here->VBICtvbbe; - p[99] = here->VBICtnbbe; - p[100] = model->VBICibbe; - p[101] = model->VBICtvbbe1; - p[102] = model->VBICtvbbe2; - p[103] = model->VBICtnbbe; - p[104] = model->VBICebbe; - p[105] = model->VBIClocTempDiff; - p[106] = model->VBICrevVersion; - p[107] = model->VBICrefVersion; - - SCALE = here->VBICarea * here->VBICm; - - /* - * initialization - */ - icheck=1; - if(ckt->CKTmode & MODEINITSMSIG) { - Vbe = model->VBICtype*( - *(ckt->CKTrhsOld+here->VBICbaseNode)- - *(ckt->CKTrhsOld+here->VBICemitNode)); - Vbc = model->VBICtype*( - *(ckt->CKTrhsOld+here->VBICbaseNode)- - *(ckt->CKTrhsOld+here->VBICcollNode)); - Vbei = *(ckt->CKTstate0 + here->VBICvbei); - Vbex = *(ckt->CKTstate0 + here->VBICvbex); - Vbci = *(ckt->CKTstate0 + here->VBICvbci); - Vbcx = *(ckt->CKTstate0 + here->VBICvbcx); - Vbep = *(ckt->CKTstate0 + here->VBICvbep); - Vrci = *(ckt->CKTstate0 + here->VBICvrci); - Vrbi = *(ckt->CKTstate0 + here->VBICvrbi); - Vrbp = *(ckt->CKTstate0 + here->VBICvrbp); - Vrcx = model->VBICtype*( - *(ckt->CKTrhsOld+here->VBICcollNode)- - *(ckt->CKTrhsOld+here->VBICcollCXNode)); - Vrbx = model->VBICtype*( - *(ckt->CKTrhsOld+here->VBICbaseNode)- - *(ckt->CKTrhsOld+here->VBICbaseBXNode)); - Vre = model->VBICtype*( - *(ckt->CKTrhsOld+here->VBICemitNode)- - *(ckt->CKTrhsOld+here->VBICemitEINode)); - Vbcp = *(ckt->CKTstate0 + here->VBICvbcp); - Vrs = model->VBICtype*( - *(ckt->CKTrhsOld+here->VBICsubsNode)- - *(ckt->CKTrhsOld+here->VBICsubsSINode)); - if (here->VBIC_selfheat) - Vrth = *(ckt->CKTstate0 + here->VBICvrth); - } else if(ckt->CKTmode & MODEINITTRAN) { - Vbe = model->VBICtype*( - *(ckt->CKTrhsOld+here->VBICbaseNode)- - *(ckt->CKTrhsOld+here->VBICemitNode)); - Vbc = model->VBICtype*( - *(ckt->CKTrhsOld+here->VBICbaseNode)- - *(ckt->CKTrhsOld+here->VBICcollNode)); - Vbei = *(ckt->CKTstate1 + here->VBICvbei); - Vbex = *(ckt->CKTstate1 + here->VBICvbex); - Vbci = *(ckt->CKTstate1 + here->VBICvbci); - Vbcx = *(ckt->CKTstate1 + here->VBICvbcx); - Vbep = *(ckt->CKTstate1 + here->VBICvbep); - Vrci = *(ckt->CKTstate1 + here->VBICvrci); - Vrbi = *(ckt->CKTstate1 + here->VBICvrbi); - Vrbp = *(ckt->CKTstate1 + here->VBICvrbp); - Vrcx = model->VBICtype*( - *(ckt->CKTrhsOld+here->VBICcollNode)- - *(ckt->CKTrhsOld+here->VBICcollCXNode)); - Vrbx = model->VBICtype*( - *(ckt->CKTrhsOld+here->VBICbaseNode)- - *(ckt->CKTrhsOld+here->VBICbaseBXNode)); - Vre = model->VBICtype*( - *(ckt->CKTrhsOld+here->VBICemitNode)- - *(ckt->CKTrhsOld+here->VBICemitEINode)); - Vbcp = *(ckt->CKTstate1 + here->VBICvbcp); - Vrs = model->VBICtype*( - *(ckt->CKTrhsOld+here->VBICsubsNode)- - *(ckt->CKTrhsOld+here->VBICsubsSINode)); - if (here->VBIC_selfheat) - Vrth = *(ckt->CKTstate1 + here->VBICvrth); - } else if((ckt->CKTmode & MODEINITJCT) && - (ckt->CKTmode & MODETRANOP) && (ckt->CKTmode & MODEUIC)){ - Vbe=model->VBICtype*here->VBICicVBE; - Vbei=Vbex=Vbe; - vce=model->VBICtype*here->VBICicVCE; - Vbc=Vbe-vce; - Vbci=Vbcx=Vbc; - Vbep=Vbcp=0.0; - Vrci=Vrbi=Vrbp=0.0; - Vrcx=Vrbx=Vre=Vrs=0.0; - Vrth = 0.0, Icth = 0.0, Icth_Vrth = 0.0; - } else if((ckt->CKTmode & MODEINITJCT) && (here->VBICoff==0)) { - Vbe=Vbei=Vbex=model->VBICtype*here->VBICtVcrit; - Vbc=Vbci=Vbcx=Vbep=0.0; - Vbcp=Vbc-Vbe; - Vrci=Vrbi=Vrbp=0.0; - Vrcx=Vrbx=Vre=Vrs=0.0; - Vrth = 0.0, Icth = 0.0, Icth_Vrth = 0.0; - } else if((ckt->CKTmode & MODEINITJCT) || - ( (ckt->CKTmode & MODEINITFIX) && (here->VBICoff!=0))) { - Vbe=0.0; - Vbei=Vbex=Vbe; - Vbc=0.0; - Vbci=Vbcx=Vbc; - Vbep=Vbcp=0.0; - Vrci=Vrbi=Vrbp=0.0; - Vrcx=Vrbx=Vre=Vrs=0.0; - Vrth = 0.0, Icth = 0.0, Icth_Vrth = 0.0; - } else { -#ifndef PREDICTOR - if(ckt->CKTmode & MODEINITPRED) { - xfact = ckt->CKTdelta/ckt->CKTdeltaOld[1]; - Vbei = (1+xfact) * *(ckt->CKTstate1 + here->VBICvbei)- - xfact * *(ckt->CKTstate2 + here->VBICvbei); - Vbex = (1+xfact) * *(ckt->CKTstate1 + here->VBICvbex)- - xfact * *(ckt->CKTstate2 + here->VBICvbex); - Vbci = (1+xfact) * *(ckt->CKTstate1 + here->VBICvbci)- - xfact * *(ckt->CKTstate2 + here->VBICvbci); - Vbcx = (1+xfact) * *(ckt->CKTstate1 + here->VBICvbcx)- - xfact * *(ckt->CKTstate2 + here->VBICvbcx); - Vbep = (1+xfact) * *(ckt->CKTstate1 + here->VBICvbep)- - xfact * *(ckt->CKTstate2 + here->VBICvbep); - Vrci = (1+xfact) * *(ckt->CKTstate1 + here->VBICvrci)- - xfact * *(ckt->CKTstate2 + here->VBICvrci); - Vrbi = (1+xfact) * *(ckt->CKTstate1 + here->VBICvrbi)- - xfact * *(ckt->CKTstate2 + here->VBICvrbi); - Vrbp = (1+xfact) * *(ckt->CKTstate1 + here->VBICvrbp)- - xfact * *(ckt->CKTstate2 + here->VBICvrbp); - Vbcp = (1+xfact) * *(ckt->CKTstate1 + here->VBICvbcp)- - xfact * *(ckt->CKTstate2 + here->VBICvbcp); - if (here->VBIC_selfheat) { - Vrth = (1.0 + xfact)* (*(ckt->CKTstate1 + here->VBICvrth)) - - ( xfact * (*(ckt->CKTstate2 + here->VBICvrth))); - *(ckt->CKTstate0 + here->VBICvrth) = - *(ckt->CKTstate1 + here->VBICvrth); - } - *(ckt->CKTstate0 + here->VBICvbei) = - *(ckt->CKTstate1 + here->VBICvbei); - *(ckt->CKTstate0 + here->VBICvbex) = - *(ckt->CKTstate1 + here->VBICvbex); - *(ckt->CKTstate0 + here->VBICvbci) = - *(ckt->CKTstate1 + here->VBICvbci); - *(ckt->CKTstate0 + here->VBICvbcx) = - *(ckt->CKTstate1 + here->VBICvbcx); - *(ckt->CKTstate0 + here->VBICvbep) = - *(ckt->CKTstate1 + here->VBICvbep); - *(ckt->CKTstate0 + here->VBICvrci) = - *(ckt->CKTstate1 + here->VBICvrci); - *(ckt->CKTstate0 + here->VBICvrbi) = - *(ckt->CKTstate1 + here->VBICvrbi); - *(ckt->CKTstate0 + here->VBICvrbp) = - *(ckt->CKTstate1 + here->VBICvrbp); - *(ckt->CKTstate0 + here->VBICvbcp) = - *(ckt->CKTstate1 + here->VBICvbcp); - *(ckt->CKTstate0 + here->VBICibe) = - *(ckt->CKTstate1 + here->VBICibe); - *(ckt->CKTstate0 + here->VBICibe_Vbei) = - *(ckt->CKTstate1 + here->VBICibe_Vbei); - *(ckt->CKTstate0 + here->VBICibex) = - *(ckt->CKTstate1 + here->VBICibex); - *(ckt->CKTstate0 + here->VBICibex_Vbex) = - *(ckt->CKTstate1 + here->VBICibex_Vbex); - *(ckt->CKTstate0 + here->VBICitzf) = - *(ckt->CKTstate1 + here->VBICitzf); - *(ckt->CKTstate0 + here->VBICitzf_Vbei) = - *(ckt->CKTstate1 + here->VBICitzf_Vbei); - *(ckt->CKTstate0 + here->VBICitzf_Vbci) = - *(ckt->CKTstate1 + here->VBICitzf_Vbci); - *(ckt->CKTstate0 + here->VBICitzr) = - *(ckt->CKTstate1 + here->VBICitzr); - *(ckt->CKTstate0 + here->VBICitzr_Vbei) = - *(ckt->CKTstate1 + here->VBICitzf_Vbei); - *(ckt->CKTstate0 + here->VBICitzr_Vbci) = - *(ckt->CKTstate1 + here->VBICitzr_Vbci); - *(ckt->CKTstate0 + here->VBICibc) = - *(ckt->CKTstate1 + here->VBICibc); - *(ckt->CKTstate0 + here->VBICibc_Vbci) = - *(ckt->CKTstate1 + here->VBICibc_Vbci); - *(ckt->CKTstate0 + here->VBICibc_Vbei) = - *(ckt->CKTstate1 + here->VBICibc_Vbei); - *(ckt->CKTstate0 + here->VBICibep) = - *(ckt->CKTstate1 + here->VBICibep); - *(ckt->CKTstate0 + here->VBICibep_Vbep) = - *(ckt->CKTstate1 + here->VBICibep_Vbep); - *(ckt->CKTstate0 + here->VBICirci) = - *(ckt->CKTstate1 + here->VBICirci); - *(ckt->CKTstate0 + here->VBICirci_Vrci) = - *(ckt->CKTstate1 + here->VBICirci_Vrci); - *(ckt->CKTstate0 + here->VBICirci_Vbci) = - *(ckt->CKTstate1 + here->VBICirci_Vbci); - *(ckt->CKTstate0 + here->VBICirci_Vbcx) = - *(ckt->CKTstate1 + here->VBICirci_Vbcx); - *(ckt->CKTstate0 + here->VBICirbi) = - *(ckt->CKTstate1 + here->VBICirbi); - *(ckt->CKTstate0 + here->VBICirbi_Vrbi) = - *(ckt->CKTstate1 + here->VBICirbi_Vrbi); - *(ckt->CKTstate0 + here->VBICirbi_Vbei) = - *(ckt->CKTstate1 + here->VBICirbi_Vbei); - *(ckt->CKTstate0 + here->VBICirbi_Vbci) = - *(ckt->CKTstate1 + here->VBICirbi_Vbci); - *(ckt->CKTstate0 + here->VBICirbp) = - *(ckt->CKTstate1 + here->VBICirbp); - *(ckt->CKTstate0 + here->VBICirbp_Vrbp) = - *(ckt->CKTstate1 + here->VBICirbp_Vrbp); - *(ckt->CKTstate0 + here->VBICirbp_Vbep) = - *(ckt->CKTstate1 + here->VBICirbp_Vbep); - *(ckt->CKTstate0 + here->VBICirbp_Vbci) = - *(ckt->CKTstate1 + here->VBICirbp_Vbci); - *(ckt->CKTstate0 + here->VBICibcp) = - *(ckt->CKTstate1 + here->VBICibcp); - *(ckt->CKTstate0 + here->VBICibcp_Vbcp) = - *(ckt->CKTstate1 + here->VBICibcp_Vbcp); - *(ckt->CKTstate0 + here->VBICiccp) = - *(ckt->CKTstate1 + here->VBICiccp); - *(ckt->CKTstate0 + here->VBICiccp_Vbep) = - *(ckt->CKTstate1 + here->VBICiccp_Vbep); - *(ckt->CKTstate0 + here->VBICiccp_Vbci) = - *(ckt->CKTstate1 + here->VBICiccp_Vbci); - *(ckt->CKTstate0 + here->VBICiccp_Vbcp) = - *(ckt->CKTstate1 + here->VBICiccp_Vbcp); - *(ckt->CKTstate0 + here->VBICgqbeo) = - *(ckt->CKTstate1 + here->VBICgqbeo); - *(ckt->CKTstate0 + here->VBICgqbco) = - *(ckt->CKTstate1 + here->VBICgqbco); - *(ckt->CKTstate0 + here->VBICircx_Vrcx) = - *(ckt->CKTstate1 + here->VBICircx_Vrcx); - *(ckt->CKTstate0 + here->VBICirbx_Vrbx) = - *(ckt->CKTstate1 + here->VBICirbx_Vrbx); - *(ckt->CKTstate0 + here->VBICirs_Vrs) = - *(ckt->CKTstate1 + here->VBICirs_Vrs); - *(ckt->CKTstate0 + here->VBICire_Vre) = - *(ckt->CKTstate1 + here->VBICire_Vre); - if (here->VBIC_selfheat) - *(ckt->CKTstate0 + here->VBICqcth) = - *(ckt->CKTstate1 + here->VBICqcth); - } else { -#endif /* PREDICTOR */ - /* - * compute new nonlinear branch voltages - */ - Vbei = model->VBICtype*( - *(ckt->CKTrhsOld+here->VBICbaseBINode)- - *(ckt->CKTrhsOld+here->VBICemitEINode)); - Vbex = model->VBICtype*( - *(ckt->CKTrhsOld+here->VBICbaseBXNode)- - *(ckt->CKTrhsOld+here->VBICemitEINode)); - Vbci = model->VBICtype*( - *(ckt->CKTrhsOld+here->VBICbaseBINode)- - *(ckt->CKTrhsOld+here->VBICcollCINode)); - Vbcx = model->VBICtype*( - *(ckt->CKTrhsOld+here->VBICbaseBINode)- - *(ckt->CKTrhsOld+here->VBICcollCXNode)); - Vbep = model->VBICtype*( - *(ckt->CKTrhsOld+here->VBICbaseBXNode)- - *(ckt->CKTrhsOld+here->VBICbaseBPNode)); - Vrci = model->VBICtype*( - *(ckt->CKTrhsOld+here->VBICcollCXNode)- - *(ckt->CKTrhsOld+here->VBICcollCINode)); - Vrbi = model->VBICtype*( - *(ckt->CKTrhsOld+here->VBICbaseBXNode)- - *(ckt->CKTrhsOld+here->VBICbaseBINode)); - Vrbp = model->VBICtype*( - *(ckt->CKTrhsOld+here->VBICbaseBPNode)- - *(ckt->CKTrhsOld+here->VBICcollCXNode)); - Vbcp = model->VBICtype*( - *(ckt->CKTrhsOld+here->VBICsubsSINode)- - *(ckt->CKTrhsOld+here->VBICbaseBPNode)); - if (here->VBIC_selfheat) - Vrth = *(ckt->CKTrhsOld + here->VBICtempNode); -#ifndef PREDICTOR - } -#endif /* PREDICTOR */ - delvbei = Vbei - *(ckt->CKTstate0 + here->VBICvbei); - delvbex = Vbex - *(ckt->CKTstate0 + here->VBICvbex); - delvbci = Vbci - *(ckt->CKTstate0 + here->VBICvbci); - delvbcx = Vbcx - *(ckt->CKTstate0 + here->VBICvbcx); - delvbep = Vbep - *(ckt->CKTstate0 + here->VBICvbep); - delvrci = Vrci - *(ckt->CKTstate0 + here->VBICvrci); - delvrbi = Vrbi - *(ckt->CKTstate0 + here->VBICvrbi); - delvrbp = Vrbp - *(ckt->CKTstate0 + here->VBICvrbp); - delvbcp = Vbcp - *(ckt->CKTstate0 + here->VBICvbcp); - - Vbe = model->VBICtype*( - *(ckt->CKTrhsOld+here->VBICbaseNode)- - *(ckt->CKTrhsOld+here->VBICemitNode)); - Vbc = model->VBICtype*( - *(ckt->CKTrhsOld+here->VBICbaseNode)- - *(ckt->CKTrhsOld+here->VBICcollNode)); - Vrcx = model->VBICtype*( - *(ckt->CKTrhsOld+here->VBICcollNode)- - *(ckt->CKTrhsOld+here->VBICcollCXNode)); - Vrbx = model->VBICtype*( - *(ckt->CKTrhsOld+here->VBICbaseNode)- - *(ckt->CKTrhsOld+here->VBICbaseBXNode)); - Vre = model->VBICtype*( - *(ckt->CKTrhsOld+here->VBICemitNode)- - *(ckt->CKTrhsOld+here->VBICemitEINode)); - Vrs = model->VBICtype*( - *(ckt->CKTrhsOld+here->VBICsubsNode)- - *(ckt->CKTrhsOld+here->VBICsubsSINode)); - if (here->VBIC_selfheat) - Vrth = *(ckt->CKTrhsOld + here->VBICtempNode); - - ibehat = *(ckt->CKTstate0 + here->VBICibe) + - *(ckt->CKTstate0 + here->VBICibe_Vbei)*delvbei; - ibexhat = *(ckt->CKTstate0 + here->VBICibex) + - *(ckt->CKTstate0 + here->VBICibex_Vbex)*delvbex; - itzfhat = *(ckt->CKTstate0 + here->VBICitzf) + - *(ckt->CKTstate0 + here->VBICitzf_Vbei)*delvbei + *(ckt->CKTstate0 + here->VBICitzf_Vbci)*delvbci; - itzrhat = *(ckt->CKTstate0 + here->VBICitzr) + - *(ckt->CKTstate0 + here->VBICitzr_Vbei)*delvbei + *(ckt->CKTstate0 + here->VBICitzr_Vbci)*delvbci; - ibchat = *(ckt->CKTstate0 + here->VBICibc) + - *(ckt->CKTstate0 + here->VBICibc_Vbei)*delvbei + *(ckt->CKTstate0 + here->VBICibc_Vbci)*delvbci; - ibephat = *(ckt->CKTstate0 + here->VBICibep) + - *(ckt->CKTstate0 + here->VBICibep_Vbep)*delvbep; - ircihat = *(ckt->CKTstate0 + here->VBICirci) + *(ckt->CKTstate0 + here->VBICirci_Vrci)*delvrci + - *(ckt->CKTstate0 + here->VBICirci_Vbcx)*delvbcx + *(ckt->CKTstate0 + here->VBICirci_Vbci)*delvbci; - irbihat = *(ckt->CKTstate0 + here->VBICirbi) + *(ckt->CKTstate0 + here->VBICirbi_Vrbi)*delvrbi + - *(ckt->CKTstate0 + here->VBICirbi_Vbei)*delvbei + *(ckt->CKTstate0 + here->VBICirbi_Vbci)*delvbci; - irbphat = *(ckt->CKTstate0 + here->VBICirbp) + *(ckt->CKTstate0 + here->VBICirbp_Vrbp)*delvrbp + - *(ckt->CKTstate0 + here->VBICirbp_Vbep)*delvbep + *(ckt->CKTstate0 + here->VBICirbp_Vbci)*delvbci; - ibcphat = *(ckt->CKTstate0 + here->VBICibcp) + - *(ckt->CKTstate0 + here->VBICibcp_Vbcp)*delvbcp; - iccphat = *(ckt->CKTstate0 + here->VBICiccp) + *(ckt->CKTstate0 + here->VBICiccp_Vbep)*delvbep + - *(ckt->CKTstate0 + here->VBICiccp_Vbci)*delvbci + *(ckt->CKTstate0 + here->VBICiccp_Vbcp)*delvbcp; - /* - * bypass if solution has not changed - */ - /* the following collections of if's would be just one - * if the average compiler could handle it, but many - * find the expression too complicated, thus the split. - * ... no bypass in case of selfheating - */ - if( (ckt->CKTbypass) && (!(ckt->CKTmode & MODEINITPRED)) && !here->VBIC_selfheat && - (fabs(delvbei) < (ckt->CKTreltol*MAX(fabs(Vbei), - fabs(*(ckt->CKTstate0 + here->VBICvbei)))+ - ckt->CKTvoltTol)) ) - if( (fabs(delvbex) < ckt->CKTreltol*MAX(fabs(Vbex), - fabs(*(ckt->CKTstate0 + here->VBICvbex)))+ - ckt->CKTvoltTol) ) - if( (fabs(delvbci) < ckt->CKTreltol*MAX(fabs(Vbci), - fabs(*(ckt->CKTstate0 + here->VBICvbci)))+ - ckt->CKTvoltTol) ) - if( (fabs(delvbcx) < ckt->CKTreltol*MAX(fabs(Vbcx), - fabs(*(ckt->CKTstate0 + here->VBICvbcx)))+ - ckt->CKTvoltTol) ) - if( (fabs(delvbep) < ckt->CKTreltol*MAX(fabs(Vbep), - fabs(*(ckt->CKTstate0 + here->VBICvbep)))+ - ckt->CKTvoltTol) ) - if( (fabs(delvrci) < ckt->CKTreltol*MAX(fabs(Vrci), - fabs(*(ckt->CKTstate0 + here->VBICvrci)))+ - ckt->CKTvoltTol) ) - if( (fabs(delvrbi) < ckt->CKTreltol*MAX(fabs(Vrbi), - fabs(*(ckt->CKTstate0 + here->VBICvrbi)))+ - ckt->CKTvoltTol) ) - if( (fabs(delvrbp) < ckt->CKTreltol*MAX(fabs(Vrbp), - fabs(*(ckt->CKTstate0 + here->VBICvrbp)))+ - ckt->CKTvoltTol) ) - if( (fabs(delvbcp) < ckt->CKTreltol*MAX(fabs(Vbcp), - fabs(*(ckt->CKTstate0 + here->VBICvbcp)))+ - ckt->CKTvoltTol) ) - if( (fabs(ibehat-*(ckt->CKTstate0 + here->VBICibe)) < - ckt->CKTreltol* MAX(fabs(ibehat), - fabs(*(ckt->CKTstate0 + here->VBICibe)))+ - ckt->CKTabstol) ) - if( (fabs(ibexhat-*(ckt->CKTstate0 + here->VBICibex)) < - ckt->CKTreltol* MAX(fabs(ibexhat), - fabs(*(ckt->CKTstate0 + here->VBICibex)))+ - ckt->CKTabstol) ) - if( (fabs(itzfhat-*(ckt->CKTstate0 + here->VBICitzf)) < - ckt->CKTreltol* MAX(fabs(itzfhat), - fabs(*(ckt->CKTstate0 + here->VBICitzf)))+ - ckt->CKTabstol) ) - if( (fabs(itzrhat-*(ckt->CKTstate0 + here->VBICitzr)) < - ckt->CKTreltol* MAX(fabs(itzrhat), - fabs(*(ckt->CKTstate0 + here->VBICitzr)))+ - ckt->CKTabstol) ) - if( (fabs(ibchat-*(ckt->CKTstate0 + here->VBICibc)) < - ckt->CKTreltol* MAX(fabs(ibchat), - fabs(*(ckt->CKTstate0 + here->VBICibc)))+ - ckt->CKTabstol) ) - if( (fabs(ibephat-*(ckt->CKTstate0 + here->VBICibep)) < - ckt->CKTreltol* MAX(fabs(ibephat), - fabs(*(ckt->CKTstate0 + here->VBICibep)))+ - ckt->CKTabstol) ) - if( (fabs(ircihat-*(ckt->CKTstate0 + here->VBICirci)) < - ckt->CKTreltol* MAX(fabs(ircihat), - fabs(*(ckt->CKTstate0 + here->VBICirci)))+ - ckt->CKTabstol) ) - if( (fabs(irbihat-*(ckt->CKTstate0 + here->VBICirbi)) < - ckt->CKTreltol* MAX(fabs(irbihat), - fabs(*(ckt->CKTstate0 + here->VBICirbi)))+ - ckt->CKTabstol) ) - if( (fabs(irbphat-*(ckt->CKTstate0 + here->VBICirbp)) < - ckt->CKTreltol* MAX(fabs(irbphat), - fabs(*(ckt->CKTstate0 + here->VBICirbp)))+ - ckt->CKTabstol) ) - if( (fabs(ibcphat-*(ckt->CKTstate0 + here->VBICibcp)) < - ckt->CKTreltol* MAX(fabs(ibcphat), - fabs(*(ckt->CKTstate0 + here->VBICibcp)))+ - ckt->CKTabstol) ) - if( (fabs(iccphat-*(ckt->CKTstate0 + here->VBICiccp)) < - ckt->CKTreltol* MAX(fabs(iccphat), - fabs(*(ckt->CKTstate0 + here->VBICiccp)))+ - ckt->CKTabstol) ) { - /* - * bypassing.... - */ - Vbei = *(ckt->CKTstate0 + here->VBICvbei); - Vbex = *(ckt->CKTstate0 + here->VBICvbex); - Vbci = *(ckt->CKTstate0 + here->VBICvbci); - Vbcx = *(ckt->CKTstate0 + here->VBICvbcx); - Vbep = *(ckt->CKTstate0 + here->VBICvbep); - Vrci = *(ckt->CKTstate0 + here->VBICvrci); - Vrbi = *(ckt->CKTstate0 + here->VBICvrbi); - Vrbp = *(ckt->CKTstate0 + here->VBICvrbp); - Vbcp = *(ckt->CKTstate0 + here->VBICvbcp); - Ibe = *(ckt->CKTstate0 + here->VBICibe); - Ibe_Vbei = *(ckt->CKTstate0 + here->VBICibe_Vbei); - Ibex = *(ckt->CKTstate0 + here->VBICibex); - Ibex_Vbex = *(ckt->CKTstate0 + here->VBICibex_Vbex); - Itzf = *(ckt->CKTstate0 + here->VBICitzf); - Itzf_Vbei = *(ckt->CKTstate0 + here->VBICitzf_Vbei); - Itzf_Vbci = *(ckt->CKTstate0 + here->VBICitzf_Vbci); - Itzr = *(ckt->CKTstate0 + here->VBICitzr); - Itzr_Vbci = *(ckt->CKTstate0 + here->VBICitzr_Vbci); - Itzr_Vbei = *(ckt->CKTstate0 + here->VBICitzr_Vbei); - Ibc = *(ckt->CKTstate0 + here->VBICibc); - Ibc_Vbci = *(ckt->CKTstate0 + here->VBICibc_Vbci); - Ibc_Vbei = *(ckt->CKTstate0 + here->VBICibc_Vbei); - Ibep = *(ckt->CKTstate0 + here->VBICibep); - Ibep_Vbep = *(ckt->CKTstate0 + here->VBICibep_Vbep); - Irci = *(ckt->CKTstate0 + here->VBICirci); - Irci_Vrci = *(ckt->CKTstate0 + here->VBICirci_Vrci); - Irci_Vbci = *(ckt->CKTstate0 + here->VBICirci_Vbci); - Irci_Vbcx = *(ckt->CKTstate0 + here->VBICirci_Vbcx); - Irbi = *(ckt->CKTstate0 + here->VBICirbi); - Irbi_Vrbi = *(ckt->CKTstate0 + here->VBICirbi_Vrbi); - Irbi_Vbei = *(ckt->CKTstate0 + here->VBICirbi_Vbei); - Irbi_Vbci = *(ckt->CKTstate0 + here->VBICirbi_Vbci); - Irbp = *(ckt->CKTstate0 + here->VBICirbp); - Irbp_Vrbp = *(ckt->CKTstate0 + here->VBICirbp_Vrbp); - Irbp_Vbep = *(ckt->CKTstate0 + here->VBICirbp_Vbep); - Irbp_Vbci = *(ckt->CKTstate0 + here->VBICirbp_Vbci); - Ibcp = *(ckt->CKTstate0 + here->VBICibcp); - Ibcp_Vbcp = *(ckt->CKTstate0 + here->VBICibcp_Vbcp); - Iccp = *(ckt->CKTstate0 + here->VBICiccp); - Iccp_Vbep = *(ckt->CKTstate0 + here->VBICiccp_Vbep); - Iccp_Vbci = *(ckt->CKTstate0 + here->VBICiccp_Vbci); - Iccp_Vbcp = *(ckt->CKTstate0 + here->VBICiccp_Vbcp); - gqbeo = *(ckt->CKTstate0 + here->VBICgqbeo); - gqbco = *(ckt->CKTstate0 + here->VBICgqbco); - Ircx_Vrcx = *(ckt->CKTstate0 + here->VBICircx_Vrcx); - Irbx_Vrbx = *(ckt->CKTstate0 + here->VBICirbx_Vrbx); - Irs_Vrs = *(ckt->CKTstate0 + here->VBICirs_Vrs); - Ire_Vre = *(ckt->CKTstate0 + here->VBICire_Vre); - goto load; - } - /* - * limit nonlinear branch voltages - */ - ichk1 = 1, ichk2 = 1, ichk3 = 1, ichk4 = 1, ichk5 = 1, ichk6 = 0; - Vbei = DEVpnjlim(Vbei,*(ckt->CKTstate0 + here->VBICvbei),vt, - here->VBICtVcrit,&icheck); - Vbex = DEVpnjlim(Vbex,*(ckt->CKTstate0 + here->VBICvbex),vt, - here->VBICtVcrit,&ichk1); - Vbci = DEVpnjlim(Vbci,*(ckt->CKTstate0 + here->VBICvbci),vt, - here->VBICtVcrit,&ichk2); - Vbcx = DEVpnjlim(Vbcx,*(ckt->CKTstate0 + here->VBICvbcx),vt, - here->VBICtVcrit,&ichk3); - Vbep = DEVpnjlim(Vbep,*(ckt->CKTstate0 + here->VBICvbep),vt, - here->VBICtVcrit,&ichk4); - Vbcp = DEVpnjlim(Vbcp,*(ckt->CKTstate0 + here->VBICvbcp),vt, - here->VBICtVcrit,&ichk5); - if (here->VBIC_selfheat) { - ichk6 = 1; - Vrth = DEVlimitlog(Vrth, - *(ckt->CKTstate0 + here->VBICvrth),100,&ichk6); - } - if ((ichk1 == 1) || (ichk2 == 1) || (ichk3 == 1) || (ichk4 == 1) || (ichk5 == 1) || (ichk6 == 1)) icheck=1; - } - /* - * determine dc current and derivatives - */ - Vcei = Vbei - Vbci; - Vcep = Vbep - Vbcp; - iret = vbic_4T_et_cf_fj(p - ,&Vrth, &Vbei, &Vbex, &Vbci, &Vbep, &Vbcp - ,&Vrcx, &Vbcx, &Vrci, &Vrbx, &Vrbi, &Vre, &Vrbp - ,&Vrs, &Vbe, &Vbc, &Vcei, &Vcep, &Ibe, &Ibe_Vrth - ,&Ibe_Vbei, &Ibex, &Ibex_Vrth, &Ibex_Vbex, &Itzf, &Itzf_Vrth, &Itzf_Vbei - ,&Itzf_Vbci, &Itzr, &Itzr_Vrth, &Itzr_Vbci, &Itzr_Vbei, &Ibc, &Ibc_Vrth - ,&Ibc_Vbci, &Ibc_Vbei, &Ibep, &Ibep_Vrth, &Ibep_Vbep, &Ircx, &Ircx_Vrcx - ,&Ircx_Vrth, &Irci, &Irci_Vrci, &Irci_Vrth, &Irci_Vbci, &Irci_Vbcx, &Irbx - ,&Irbx_Vrbx, &Irbx_Vrth, &Irbi, &Irbi_Vrbi, &Irbi_Vrth, &Irbi_Vbei, &Irbi_Vbci - ,&Ire, &Ire_Vre, &Ire_Vrth, &Irbp, &Irbp_Vrbp, &Irbp_Vrth, &Irbp_Vbep - ,&Irbp_Vbci, &Qbe, &Qbe_Vrth, &Qbe_Vbei, &Qbe_Vbci, &Qbex, &Qbex_Vrth - ,&Qbex_Vbex, &Qbc, &Qbc_Vrth, &Qbc_Vbci, &Qbcx, &Qbcx_Vrth, &Qbcx_Vbcx - ,&Qbep, &Qbep_Vrth, &Qbep_Vbep, &Qbep_Vbci, &Qbeo, &Qbeo_Vbe, &Qbco - ,&Qbco_Vbc, &Ibcp, &Ibcp_Vrth, &Ibcp_Vbcp, &Iccp, &Iccp_Vrth, &Iccp_Vbep - ,&Iccp_Vbci, &Iccp_Vbcp, &Irs, &Irs_Vrs, &Irs_Vrth, &Qbcp, &Qbcp_Vrth - ,&Qbcp_Vbcp, &Irth, &Irth_Vrth, &Ith, &Ith_Vrth, &Ith_Vbei, &Ith_Vbci - ,&Ith_Vcei, &Ith_Vbex, &Ith_Vbep, &Ith_Vrs, &Ith_Vbcp, &Ith_Vcep, &Ith_Vrcx - ,&Ith_Vrci, &Ith_Vbcx, &Ith_Vrbx, &Ith_Vrbi, &Ith_Vre, &Ith_Vrbp, &Qcth - ,&Qcth_Vrth, &SCALE); - - Ibe += ckt->CKTgmin*Vbei; - Ibe_Vbei += ckt->CKTgmin; - Ibex += ckt->CKTgmin*Vbex; - Ibex_Vbex += ckt->CKTgmin; - Ibc += ckt->CKTgmin*Vbci; - Ibc_Vbci += ckt->CKTgmin; - Ibep += ckt->CKTgmin*Vbep; - Ibep_Vbep += ckt->CKTgmin; - Irci += ckt->CKTgmin*Vrci; - Irci_Vrci += ckt->CKTgmin; - Irci += ckt->CKTgmin*Vbci; - Irci_Vbci += ckt->CKTgmin; - Irci += ckt->CKTgmin*Vbcx; - Irci_Vbcx += ckt->CKTgmin; - Ibcp += ckt->CKTgmin*Vbcp; - Ibcp_Vbcp += ckt->CKTgmin; - - if( (ckt->CKTmode & (MODEDCTRANCURVE | MODETRAN | MODEAC)) || - ((ckt->CKTmode & MODETRANOP) && (ckt->CKTmode & MODEUIC)) || - (ckt->CKTmode & MODEINITSMSIG)) { - /* - * charge storage elements - */ - - *(ckt->CKTstate0 + here->VBICqbe) = Qbe; - *(ckt->CKTstate0 + here->VBICqbex) = Qbex; - *(ckt->CKTstate0 + here->VBICqbc) = Qbc; - *(ckt->CKTstate0 + here->VBICqbcx) = Qbcx; - *(ckt->CKTstate0 + here->VBICqbep) = Qbep; - *(ckt->CKTstate0 + here->VBICqbeo) = Qbeo; - *(ckt->CKTstate0 + here->VBICqbco) = Qbco; - *(ckt->CKTstate0 + here->VBICqbcp) = Qbcp; - if (here->VBIC_selfheat) - *(ckt->CKTstate0 + here->VBICqcth) = Qcth; - - here->VBICcapbe = Qbe_Vbei; - here->VBICcapbex = Qbex_Vbex; - here->VBICcapbc = Qbc_Vbci; - here->VBICcapbcx = Qbcx_Vbcx; - here->VBICcapbep = Qbep_Vbep; - here->VBICcapbcp = Qbcp_Vbcp; - here->VBICcapcth = Qcth_Vrth; - - /* - * store small-signal parameters - */ - if ( (!(ckt->CKTmode & MODETRANOP))|| - (!(ckt->CKTmode & MODEUIC)) ) { - if(ckt->CKTmode & MODEINITSMSIG) { - *(ckt->CKTstate0 + here->VBICcqbe) = Qbe_Vbei; - *(ckt->CKTstate0 + here->VBICcqbeci) = Qbe_Vbci; - *(ckt->CKTstate0 + here->VBICcqbex) = Qbex_Vbex; - *(ckt->CKTstate0 + here->VBICcqbc) = Qbc_Vbci; - *(ckt->CKTstate0 + here->VBICcqbcx) = Qbcx_Vbcx; - *(ckt->CKTstate0 + here->VBICcqbep) = Qbep_Vbep; - *(ckt->CKTstate0 + here->VBICcqbepci) = Qbep_Vbci; - *(ckt->CKTstate0 + here->VBICcqbeo) = Qbeo_Vbe; - *(ckt->CKTstate0 + here->VBICcqbco) = Qbco_Vbc; - *(ckt->CKTstate0 + here->VBICcqbcp) = Qbcp_Vbcp; - if (here->VBIC_selfheat) - *(ckt->CKTstate0 + here->VBICcqcth) = Qcth_Vrth; - continue; /* go to 1000 */ - } - /* - * transient analysis - */ - - if(ckt->CKTmode & MODEINITTRAN) { - *(ckt->CKTstate1 + here->VBICqbe) = - *(ckt->CKTstate0 + here->VBICqbe) ; - *(ckt->CKTstate1 + here->VBICqbex) = - *(ckt->CKTstate0 + here->VBICqbex) ; - *(ckt->CKTstate1 + here->VBICqbc) = - *(ckt->CKTstate0 + here->VBICqbc) ; - *(ckt->CKTstate1 + here->VBICqbcx) = - *(ckt->CKTstate0 + here->VBICqbcx) ; - *(ckt->CKTstate1 + here->VBICqbep) = - *(ckt->CKTstate0 + here->VBICqbep) ; - *(ckt->CKTstate1 + here->VBICqbeo) = - *(ckt->CKTstate0 + here->VBICqbeo) ; - *(ckt->CKTstate1 + here->VBICqbco) = - *(ckt->CKTstate0 + here->VBICqbco) ; - *(ckt->CKTstate1 + here->VBICqbcp) = - *(ckt->CKTstate0 + here->VBICqbcp) ; - if (here->VBIC_selfheat) - *(ckt->CKTstate1 + here->VBICqcth) = - *(ckt->CKTstate0 + here->VBICqcth) ; - } - error = NIintegrate(ckt,&geq,&ceq,Qbe_Vbei,here->VBICqbe); - if(error) return(error); - Ibe_Vbei = Ibe_Vbei + geq; - Ibe = Ibe + *(ckt->CKTstate0 + here->VBICcqbe); - - error = NIintegrate(ckt,&geq,&ceq,Qbex_Vbex,here->VBICqbex); - if(error) return(error); - Ibex_Vbex = Ibex_Vbex + geq; - Ibex = Ibex + *(ckt->CKTstate0 + here->VBICcqbex); - - error = NIintegrate(ckt,&geq,&ceq,Qbc_Vbci,here->VBICqbc); - if(error) return(error); - Ibc_Vbci = Ibc_Vbci + geq; - Ibc = Ibc + *(ckt->CKTstate0 + here->VBICcqbc); - - error = NIintegrate(ckt,&geq,&ceq,Qbcx_Vbcx,here->VBICqbcx); - if(error) return(error); - gbcx = geq; - cbcx = *(ckt->CKTstate0 + here->VBICcqbcx); - - error = NIintegrate(ckt,&geq,&ceq,Qbep_Vbep,here->VBICqbep); - if(error) return(error); - Ibep_Vbep = Ibep_Vbep + geq; - Ibep = Ibep + *(ckt->CKTstate0 + here->VBICcqbep); - - error = NIintegrate(ckt,&geq,&ceq,Qbcp_Vbcp,here->VBICqbcp); - if(error) return(error); - Ibcp_Vbcp = Ibcp_Vbcp + geq; - Ibcp = Ibcp + *(ckt->CKTstate0 + here->VBICcqbcp); - - if (here->VBIC_selfheat) - { - error = NIintegrate(ckt,&geq,&ceq,Qcth_Vrth,here->VBICqcth); - if(error) return(error); - Icth_Vrth = geq; - Icth = *(ckt->CKTstate0 + here->VBICcqcth); - } - - if(ckt->CKTmode & MODEINITTRAN) { - *(ckt->CKTstate1 + here->VBICcqbe) = - *(ckt->CKTstate0 + here->VBICcqbe); - *(ckt->CKTstate1 + here->VBICcqbex) = - *(ckt->CKTstate0 + here->VBICcqbex); - *(ckt->CKTstate1 + here->VBICcqbc) = - *(ckt->CKTstate0 + here->VBICcqbc); - *(ckt->CKTstate1 + here->VBICcqbcx) = - *(ckt->CKTstate0 + here->VBICcqbcx); - *(ckt->CKTstate1 + here->VBICcqbep) = - *(ckt->CKTstate0 + here->VBICcqbep); - *(ckt->CKTstate1 + here->VBICcqbcp) = - *(ckt->CKTstate0 + here->VBICcqbcp); - if (here->VBIC_selfheat) - *(ckt->CKTstate1 + here->VBICcqcth) = - *(ckt->CKTstate0 + here->VBICcqcth); - } - } - } - - /* - * check convergence - */ - if ( (!(ckt->CKTmode & MODEINITFIX))||(!(here->VBICoff))) { - if (icheck == 1) { - ckt->CKTnoncon++; - ckt->CKTtroubleElt = (GENinstance *) here; - } - } - - /* - * charge storage for outer b-e and b-c junctions - */ - if(ckt->CKTmode & (MODETRAN | MODEAC)) { - error = NIintegrate(ckt,&gqbeo,&cqbeo,Qbeo_Vbe,here->VBICqbeo); - if(error) return(error); - error = NIintegrate(ckt,&gqbco,&cqbco,Qbco_Vbc,here->VBICqbco); - if(error) return(error); - if(ckt->CKTmode & MODEINITTRAN) { - *(ckt->CKTstate1 + here->VBICcqbeo) = - *(ckt->CKTstate0 + here->VBICcqbeo); - *(ckt->CKTstate1 + here->VBICcqbco) = - *(ckt->CKTstate0 + here->VBICcqbco); - } - } - - *(ckt->CKTstate0 + here->VBICvbei) = Vbei; - *(ckt->CKTstate0 + here->VBICvbex) = Vbex; - *(ckt->CKTstate0 + here->VBICvbci) = Vbci; - *(ckt->CKTstate0 + here->VBICvbcx) = Vbcx; - *(ckt->CKTstate0 + here->VBICvbep) = Vbep; - *(ckt->CKTstate0 + here->VBICvrci) = Vrci; - *(ckt->CKTstate0 + here->VBICvrbi) = Vrbi; - *(ckt->CKTstate0 + here->VBICvrbp) = Vrbp; - *(ckt->CKTstate0 + here->VBICvbcp) = Vbcp; - - *(ckt->CKTstate0 + here->VBICibe) = Ibe; - *(ckt->CKTstate0 + here->VBICibe_Vbei) = Ibe_Vbei; - *(ckt->CKTstate0 + here->VBICibex) = Ibex; - *(ckt->CKTstate0 + here->VBICibex_Vbex) = Ibex_Vbex; - *(ckt->CKTstate0 + here->VBICitzf) = Itzf; - *(ckt->CKTstate0 + here->VBICitzf_Vbei) = Itzf_Vbei; - *(ckt->CKTstate0 + here->VBICitzf_Vbci) = Itzf_Vbci; - *(ckt->CKTstate0 + here->VBICitzr) = Itzr; - *(ckt->CKTstate0 + here->VBICitzr_Vbci) = Itzr_Vbci; - *(ckt->CKTstate0 + here->VBICitzr_Vbei) = Itzr_Vbei; - *(ckt->CKTstate0 + here->VBICibc) = Ibc; - *(ckt->CKTstate0 + here->VBICibc_Vbci) = Ibc_Vbci; - *(ckt->CKTstate0 + here->VBICibc_Vbei) = Ibc_Vbei; - *(ckt->CKTstate0 + here->VBICibep) = Ibep; - *(ckt->CKTstate0 + here->VBICibep_Vbep) = Ibep_Vbep; - *(ckt->CKTstate0 + here->VBICirci) = Irci; - *(ckt->CKTstate0 + here->VBICirci_Vrci) = Irci_Vrci; - *(ckt->CKTstate0 + here->VBICirci_Vbci) = Irci_Vbci; - *(ckt->CKTstate0 + here->VBICirci_Vbcx) = Irci_Vbcx; - *(ckt->CKTstate0 + here->VBICirbi) = Irbi; - *(ckt->CKTstate0 + here->VBICirbi_Vrbi) = Irbi_Vrbi; - *(ckt->CKTstate0 + here->VBICirbi_Vbei) = Irbi_Vbei; - *(ckt->CKTstate0 + here->VBICirbi_Vbci) = Irbi_Vbci; - *(ckt->CKTstate0 + here->VBICirbp) = Irbp; - *(ckt->CKTstate0 + here->VBICirbp_Vrbp) = Irbp_Vrbp; - *(ckt->CKTstate0 + here->VBICirbp_Vbep) = Irbp_Vbep; - *(ckt->CKTstate0 + here->VBICirbp_Vbci) = Irbp_Vbci; - *(ckt->CKTstate0 + here->VBICibcp) = Ibcp; - *(ckt->CKTstate0 + here->VBICibcp_Vbcp) = Ibcp_Vbcp; - *(ckt->CKTstate0 + here->VBICiccp) = Iccp; - *(ckt->CKTstate0 + here->VBICiccp_Vbep) = Iccp_Vbep; - *(ckt->CKTstate0 + here->VBICiccp_Vbci) = Iccp_Vbci; - *(ckt->CKTstate0 + here->VBICiccp_Vbcp) = Iccp_Vbcp; - *(ckt->CKTstate0 + here->VBICgqbeo) = gqbeo; - *(ckt->CKTstate0 + here->VBICgqbco) = gqbco; - *(ckt->CKTstate0 + here->VBICircx_Vrcx) = Ircx_Vrcx; - *(ckt->CKTstate0 + here->VBICirbx_Vrbx) = Irbx_Vrbx; - *(ckt->CKTstate0 + here->VBICirs_Vrs) = Irs_Vrs; - *(ckt->CKTstate0 + here->VBICire_Vre) = Ire_Vre; - *(ckt->CKTstate0 + here->VBICcqcth) = Icth; - *(ckt->CKTstate0 + here->VBICicth_Vrth) = Icth_Vrth; - -load: - /* - * load current excitation vector and matrix - */ - rhs_current = model->VBICtype * (*(ckt->CKTstate0 + here->VBICcqbeo) - Vbe * gqbeo); - *(ckt->CKTrhs + here->VBICbaseNode) += -rhs_current; - *(ckt->CKTrhs + here->VBICemitNode) += rhs_current; - *(here->VBICbaseBasePtr) += gqbeo; - *(here->VBICemitEmitPtr) += gqbeo; - *(here->VBICbaseEmitPtr) += -gqbeo; - *(here->VBICemitBasePtr) += -gqbeo; - - rhs_current = model->VBICtype * (*(ckt->CKTstate0 + here->VBICcqbco) - Vbc * gqbco); - *(ckt->CKTrhs + here->VBICbaseNode) += -rhs_current; - *(ckt->CKTrhs + here->VBICcollNode) += rhs_current; - *(here->VBICbaseBasePtr) += gqbco; - *(here->VBICcollCollPtr) += gqbco; - *(here->VBICbaseCollPtr) += -gqbco; - *(here->VBICcollBasePtr) += -gqbco; - - *(ckt->CKTrhs + here->VBICbaseBINode) += -cbcx; - *(ckt->CKTrhs + here->VBICcollCXNode) += cbcx; - *(here->VBICbaseBIBaseBIPtr) += gbcx; - *(here->VBICcollCXCollCXPtr) += gbcx; - *(here->VBICbaseBICollCXPtr) += -gbcx; - *(here->VBICcollCXBaseBIPtr) += -gbcx; - -/* -c MNA at internal nodes -c -c Stamp element: Ibe -*/ - rhs_current = model->VBICtype * (Ibe - Ibe_Vbei*Vbei); - *(ckt->CKTrhs + here->VBICbaseBINode) += -rhs_current; - *(here->VBICbaseBIBaseBIPtr) += Ibe_Vbei; - *(here->VBICbaseBIEmitEIPtr) += -Ibe_Vbei; - *(ckt->CKTrhs + here->VBICemitEINode) += rhs_current; - *(here->VBICemitEIBaseBIPtr) += -Ibe_Vbei; - *(here->VBICemitEIEmitEIPtr) += Ibe_Vbei; -/* -c Stamp element: Ibex -*/ - rhs_current = model->VBICtype * (Ibex - Ibex_Vbex*Vbex); - *(ckt->CKTrhs + here->VBICbaseBXNode) += -rhs_current; - *(here->VBICbaseBXBaseBXPtr) += Ibex_Vbex; - *(here->VBICbaseBXEmitEIPtr) += -Ibex_Vbex; - *(ckt->CKTrhs + here->VBICemitEINode) += rhs_current; - *(here->VBICemitEIBaseBXPtr) += -Ibex_Vbex; - *(here->VBICemitEIEmitEIPtr) += Ibex_Vbex; - -/* -c Stamp element: Itzf -*/ - rhs_current = model->VBICtype * (Itzf - Itzf_Vbei*Vbei - Itzf_Vbci*Vbci); - *(ckt->CKTrhs + here->VBICcollCINode) += -rhs_current; - *(here->VBICcollCIBaseBIPtr) += Itzf_Vbei; - *(here->VBICcollCIEmitEIPtr) += -Itzf_Vbei; - *(here->VBICcollCIBaseBIPtr) += Itzf_Vbci; - *(here->VBICcollCICollCIPtr) += -Itzf_Vbci; - *(ckt->CKTrhs + here->VBICemitEINode) += rhs_current; - *(here->VBICemitEIBaseBIPtr) += -Itzf_Vbei; - *(here->VBICemitEIEmitEIPtr) += Itzf_Vbei; - *(here->VBICemitEIBaseBIPtr) += -Itzf_Vbci; - *(here->VBICemitEICollCIPtr) += Itzf_Vbci; -/* -c Stamp element: Itzr -*/ - rhs_current = model->VBICtype * (Itzr - Itzr_Vbei*Vbei - Itzr_Vbci*Vbci); - *(ckt->CKTrhs + here->VBICemitEINode) += -rhs_current; - *(here->VBICemitEIBaseBIPtr) += Itzr_Vbei; - *(here->VBICemitEIEmitEIPtr) += -Itzr_Vbei; - *(here->VBICemitEIBaseBIPtr) += Itzr_Vbci; - *(here->VBICemitEICollCIPtr) += -Itzr_Vbci; - *(ckt->CKTrhs + here->VBICcollCINode) += rhs_current; - *(here->VBICcollCIBaseBIPtr) += -Itzr_Vbei; - *(here->VBICcollCIEmitEIPtr) += Itzr_Vbei; - *(here->VBICcollCIBaseBIPtr) += -Itzr_Vbci; - *(here->VBICcollCICollCIPtr) += Itzr_Vbci; -/* -c Stamp element: Ibc -*/ - rhs_current = model->VBICtype * (Ibc - Ibc_Vbci*Vbci - Ibc_Vbei*Vbei); - *(ckt->CKTrhs + here->VBICbaseBINode) += -rhs_current; - *(here->VBICbaseBIBaseBIPtr) += Ibc_Vbci; - *(here->VBICbaseBICollCIPtr) += -Ibc_Vbci; - *(here->VBICbaseBIBaseBIPtr) += Ibc_Vbei; - *(here->VBICbaseBIEmitEIPtr) += -Ibc_Vbei; - *(ckt->CKTrhs + here->VBICcollCINode) += rhs_current; - *(here->VBICcollCIBaseBIPtr) += -Ibc_Vbci; - *(here->VBICcollCICollCIPtr) += Ibc_Vbci; - *(here->VBICcollCIBaseBIPtr) += -Ibc_Vbei; - *(here->VBICcollCIEmitEIPtr) += Ibc_Vbei; -/* -c Stamp element: Ibep -*/ - rhs_current = model->VBICtype * (Ibep - Ibep_Vbep*Vbep); - *(ckt->CKTrhs + here->VBICbaseBXNode) += -rhs_current; - *(here->VBICbaseBXBaseBXPtr) += Ibep_Vbep; - *(here->VBICbaseBXBaseBPPtr) += -Ibep_Vbep; - *(ckt->CKTrhs + here->VBICbaseBPNode) += rhs_current; - *(here->VBICbaseBPBaseBXPtr) += -Ibep_Vbep; - *(here->VBICbaseBPBaseBPPtr) += Ibep_Vbep; -/* -c Stamp element: Rcx -*/ - *(here->VBICcollCollPtr) += Ircx_Vrcx; - *(here->VBICcollCXCollCXPtr) += Ircx_Vrcx; - *(here->VBICcollCXCollPtr) += -Ircx_Vrcx; - *(here->VBICcollCollCXPtr) += -Ircx_Vrcx; - -/* -c Stamp element: Irci -*/ - rhs_current = model->VBICtype * (Irci - Irci_Vrci*Vrci - Irci_Vbci*Vbci - Irci_Vbcx*Vbcx); - *(ckt->CKTrhs + here->VBICcollCXNode) += -rhs_current; - *(here->VBICcollCXCollCXPtr) += Irci_Vrci; - *(here->VBICcollCXCollCIPtr) += -Irci_Vrci; - *(here->VBICcollCXBaseBIPtr) += Irci_Vbci; - *(here->VBICcollCXCollCIPtr) += -Irci_Vbci; - *(here->VBICcollCXBaseBIPtr) += Irci_Vbcx; - *(here->VBICcollCXCollCXPtr) += -Irci_Vbcx; - *(ckt->CKTrhs + here->VBICcollCINode) += rhs_current; - *(here->VBICcollCICollCXPtr) += -Irci_Vrci; - *(here->VBICcollCICollCIPtr) += Irci_Vrci; - *(here->VBICcollCIBaseBIPtr) += -Irci_Vbci; - *(here->VBICcollCICollCIPtr) += Irci_Vbci; - *(here->VBICcollCIBaseBIPtr) += -Irci_Vbcx; - *(here->VBICcollCICollCXPtr) += Irci_Vbcx; -/* -c Stamp element: Rbx -*/ - *(here->VBICbaseBasePtr) += Irbx_Vrbx; - *(here->VBICbaseBXBaseBXPtr) += Irbx_Vrbx; - *(here->VBICbaseBXBasePtr) += -Irbx_Vrbx; - *(here->VBICbaseBaseBXPtr) += -Irbx_Vrbx; -/* -c Stamp element: Irbi -*/ - rhs_current = model->VBICtype * (Irbi - Irbi_Vrbi*Vrbi - Irbi_Vbei*Vbei - Irbi_Vbci*Vbci); - *(ckt->CKTrhs + here->VBICbaseBXNode) += -rhs_current; - *(here->VBICbaseBXBaseBXPtr) += Irbi_Vrbi; - *(here->VBICbaseBXBaseBIPtr) += -Irbi_Vrbi; - *(here->VBICbaseBXBaseBIPtr) += Irbi_Vbei; - *(here->VBICbaseBXEmitEIPtr) += -Irbi_Vbei; - *(here->VBICbaseBXBaseBIPtr) += Irbi_Vbci; - *(here->VBICbaseBXCollCIPtr) += -Irbi_Vbci; - *(ckt->CKTrhs + here->VBICbaseBINode) += rhs_current; - *(here->VBICbaseBIBaseBXPtr) += -Irbi_Vrbi; - *(here->VBICbaseBIBaseBIPtr) += Irbi_Vrbi; - *(here->VBICbaseBIBaseBIPtr) += -Irbi_Vbei; - *(here->VBICbaseBIEmitEIPtr) += Irbi_Vbei; - *(here->VBICbaseBIBaseBIPtr) += -Irbi_Vbci; - *(here->VBICbaseBICollCIPtr) += Irbi_Vbci; -/* -c Stamp element: Re -*/ - *(here->VBICemitEmitPtr) += Ire_Vre; - *(here->VBICemitEIEmitEIPtr) += Ire_Vre; - *(here->VBICemitEIEmitPtr) += -Ire_Vre; - *(here->VBICemitEmitEIPtr) += -Ire_Vre; -/* -c Stamp element: Irbp -*/ - rhs_current = model->VBICtype * (Irbp - Irbp_Vrbp*Vrbp - Irbp_Vbep*Vbep - Irbp_Vbci*Vbci); - *(ckt->CKTrhs + here->VBICbaseBPNode) += -rhs_current; - *(here->VBICbaseBPBaseBPPtr) += Irbp_Vrbp; - *(here->VBICbaseBPCollCXPtr) += -Irbp_Vrbp; - *(here->VBICbaseBPBaseBXPtr) += Irbp_Vbep; - *(here->VBICbaseBPBaseBPPtr) += -Irbp_Vbep; - *(here->VBICbaseBPBaseBIPtr) += Irbp_Vbci; - *(here->VBICbaseBPCollCIPtr) += -Irbp_Vbci; - *(ckt->CKTrhs + here->VBICcollCXNode) += rhs_current; - *(here->VBICcollCXBaseBPPtr) += -Irbp_Vrbp; - *(here->VBICcollCXCollCXPtr) += Irbp_Vrbp; - *(here->VBICcollCXBaseBXPtr) += -Irbp_Vbep; - *(here->VBICcollCXBaseBPPtr) += Irbp_Vbep; - *(here->VBICcollCXBaseBIPtr) += -Irbp_Vbci; - *(here->VBICcollCXCollCIPtr) += Irbp_Vbci; -/* -c Stamp element: Ibcp -*/ - rhs_current = model->VBICtype * (Ibcp - Ibcp_Vbcp*Vbcp); - *(ckt->CKTrhs + here->VBICsubsSINode) += -rhs_current; - *(here->VBICsubsSISubsSIPtr) += Ibcp_Vbcp; - *(here->VBICsubsSIBaseBPPtr) += -Ibcp_Vbcp; - *(ckt->CKTrhs + here->VBICbaseBPNode) += rhs_current; - *(here->VBICbaseBPSubsSIPtr) += -Ibcp_Vbcp; - *(here->VBICbaseBPBaseBPPtr) += Ibcp_Vbcp; -/* -c Stamp element: Iccp -*/ - rhs_current = model->VBICtype * (Iccp - Iccp_Vbep*Vbep - Iccp_Vbci*Vbci - Iccp_Vbcp*Vbcp); - *(ckt->CKTrhs + here->VBICbaseBXNode) += -rhs_current; - *(here->VBICbaseBXBaseBXPtr) += Iccp_Vbep; - *(here->VBICbaseBXBaseBPPtr) += -Iccp_Vbep; - *(here->VBICbaseBXBaseBIPtr) += Iccp_Vbci; - *(here->VBICbaseBXCollCIPtr) += -Iccp_Vbci; - *(here->VBICbaseBXSubsSIPtr) += Iccp_Vbcp; - *(here->VBICbaseBXBaseBPPtr) += -Iccp_Vbcp; - *(ckt->CKTrhs + here->VBICsubsSINode) += rhs_current; - *(here->VBICsubsSIBaseBXPtr) += -Iccp_Vbep; - *(here->VBICsubsSIBaseBPPtr) += Iccp_Vbep; - *(here->VBICsubsSIBaseBIPtr) += -Iccp_Vbci; - *(here->VBICsubsSICollCIPtr) += Iccp_Vbci; - *(here->VBICsubsSISubsSIPtr) += -Iccp_Vbcp; - *(here->VBICsubsSIBaseBPPtr) += Iccp_Vbcp; -/* -c Stamp element: Rs -*/ - *(here->VBICsubsSubsPtr) += Irs_Vrs; - *(here->VBICsubsSISubsSIPtr) += Irs_Vrs; - *(here->VBICsubsSISubsPtr) += -Irs_Vrs; - *(here->VBICsubsSubsSIPtr) += -Irs_Vrs; - - if (here->VBIC_selfheat) { -/* -c Stamp element: Ibe -*/ - rhs_current = -Ibe_Vrth*Vrth; - *(ckt->CKTrhs + here->VBICbaseBINode) += -rhs_current; - *(here->VBICbaseBItempPtr) += Ibe_Vrth; - *(ckt->CKTrhs + here->VBICemitEINode) += rhs_current; - *(here->VBICemitEItempPtr) += -Ibe_Vrth; -/* -c Stamp element: Ibex -*/ - rhs_current = -Ibex_Vrth*Vrth; - *(ckt->CKTrhs + here->VBICbaseBXNode) += -rhs_current; - *(here->VBICbaseBXtempPtr) += Ibex_Vrth; - *(ckt->CKTrhs + here->VBICemitEINode) += rhs_current; - *(here->VBICemitEItempPtr) += -Ibex_Vrth; -/* -c Stamp element: Itzf -*/ - rhs_current = -Itzf_Vrth*Vrth; - *(ckt->CKTrhs + here->VBICcollCINode) += -rhs_current; - *(here->VBICcollCItempPtr) += Itzf_Vrth; - *(ckt->CKTrhs + here->VBICemitEINode) += rhs_current; - *(here->VBICemitEItempPtr) += -Itzf_Vrth; -/* -c Stamp element: Itzr -*/ - rhs_current = -Itzr_Vrth*Vrth; - *(ckt->CKTrhs + here->VBICemitEINode) += -rhs_current; - *(here->VBICemitEItempPtr) += Itzr_Vrth; - *(ckt->CKTrhs + here->VBICcollCINode) += rhs_current; - *(here->VBICcollCItempPtr) += -Itzr_Vrth; -/* -c Stamp element: Ibc -*/ - rhs_current = -Ibc_Vrth*Vrth; - *(ckt->CKTrhs + here->VBICbaseBINode) += -rhs_current; - *(here->VBICbaseBItempPtr) += Ibc_Vrth; - *(ckt->CKTrhs + here->VBICcollCINode) += rhs_current; - *(here->VBICcollCItempPtr) += -Ibc_Vrth; -/* -c Stamp element: Ibep -*/ - rhs_current = -Ibep_Vrth*Vrth; - *(ckt->CKTrhs + here->VBICbaseBXNode) += -rhs_current; - *(here->VBICbaseBXtempPtr) += Ibep_Vrth; - *(ckt->CKTrhs + here->VBICbaseBPNode) += rhs_current; - *(here->VBICbaseBPtempPtr) += -Ibep_Vrth; -/* -c Stamp element: Rcx -*/ - rhs_current = -Ircx_Vrth * Vrth; - *(ckt->CKTrhs + here->VBICcollNode) += -rhs_current; - *(here->VBICcollTempPtr) += Ircx_Vrth; - *(ckt->CKTrhs + here->VBICcollCXNode) += rhs_current; - *(here->VBICcollCXtempPtr) += -Ircx_Vrth; -/* -c Stamp element: Irci -*/ - rhs_current = -Irci_Vrth*Vrth; - *(ckt->CKTrhs + here->VBICcollCXNode) += -rhs_current; - *(here->VBICcollCXtempPtr) += Irci_Vrth; - *(ckt->CKTrhs + here->VBICcollCINode) += rhs_current; - *(here->VBICcollCItempPtr) += -Irci_Vrth; -/* -c Stamp element: Rbx -*/ - rhs_current = -Irbx_Vrth * Vrth; - *(ckt->CKTrhs + here->VBICbaseNode) += -rhs_current; - *(here->VBICbaseTempPtr) += Irbx_Vrth; - *(ckt->CKTrhs + here->VBICbaseBXNode) += rhs_current; - *(here->VBICbaseBXtempPtr) += -Irbx_Vrth; -/* -c Stamp element: Irbi -*/ - rhs_current = -Irbi_Vrth*Vrth; - *(ckt->CKTrhs + here->VBICbaseBXNode) += -rhs_current; - *(here->VBICbaseBXtempPtr) += Irbi_Vrth; - *(ckt->CKTrhs + here->VBICbaseBINode) += rhs_current; - *(here->VBICbaseBItempPtr) += -Irbi_Vrth; -/* -c Stamp element: Re -*/ - rhs_current = -Ire_Vrth * Vrth; - *(ckt->CKTrhs + here->VBICemitNode) += -rhs_current; - *(here->VBICemitTempPtr) += Ire_Vrth; - *(ckt->CKTrhs + here->VBICemitEINode) += rhs_current; - *(here->VBICemitEItempPtr) += -Ire_Vrth; -/* -c Stamp element: Irbp -*/ - rhs_current = -Irbp_Vrth*Vrth; - *(ckt->CKTrhs + here->VBICbaseBPNode) += -rhs_current; - *(here->VBICbaseBPtempPtr) += Irbp_Vrth; - *(ckt->CKTrhs + here->VBICcollCXNode) += rhs_current; - *(here->VBICcollCXtempPtr) += -Irbp_Vrth; -/* -c Stamp element: Ibcp -*/ - rhs_current = -Ibcp_Vrth*Vrth; - *(ckt->CKTrhs + here->VBICsubsSINode) += -rhs_current; - *(here->VBICsubsSItempPtr) += Ibcp_Vrth; - *(ckt->CKTrhs + here->VBICbaseBPNode) += rhs_current; - *(here->VBICbaseBPtempPtr) += -Ibcp_Vrth; -/* -c Stamp element: Iccp -*/ - rhs_current = -Iccp_Vrth*Vrth; - *(ckt->CKTrhs + here->VBICbaseBXNode) += -rhs_current; - *(here->VBICbaseBXtempPtr) += Iccp_Vrth; - *(ckt->CKTrhs + here->VBICsubsSINode) += rhs_current; - *(here->VBICsubsSItempPtr) += -Iccp_Vrth; -/* -c Stamp element: Rs -*/ - rhs_current = -Irs_Vrth * Vrth; - *(ckt->CKTrhs + here->VBICsubsNode) += -rhs_current; - *(here->VBICsubsTempPtr) += Irs_Vrth; - *(ckt->CKTrhs + here->VBICsubsSINode) += rhs_current; - *(here->VBICsubsSItempPtr) += -Irs_Vrth; -/* -c Stamp element: Rth -*/ - *(here->VBICtempTempPtr) += Irth_Vrth; -/* -c Stamp element: Cth -*/ - rhs_current = Icth - Icth_Vrth*Vrth; - *(ckt->CKTrhs + here->VBICtempNode) += -rhs_current; - *(here->VBICtempTempPtr) += Icth_Vrth; -/* -c Stamp element: Ith -*/ - rhs_current = -Ith - Ith_Vrth*Vrth - - Ith_Vbei*Vbei - Ith_Vbci*Vbci - Ith_Vcei*Vcei - - Ith_Vbex*Vbex - Ith_Vbep*Vbep - Ith_Vbcp*Vbcp - - Ith_Vcep*Vcep - Ith_Vrci*Vrci - Ith_Vbcx*Vbcx - - Ith_Vrbi*Vrbi - Ith_Vrbp*Vrbp - - Ith_Vrcx*Vrcx - Ith_Vrbx*Vrbx - Ith_Vre*Vre - Ith_Vrs*Vrs; - - *(ckt->CKTrhs + here->VBICtempNode) += rhs_current; - - *(here->VBICtempTempPtr) += -Ith_Vrth; - - *(here->VBICtempBaseBIPtr) += -Ith_Vbei; - *(here->VBICtempEmitEIPtr) += +Ith_Vbei; - *(here->VBICtempBaseBIPtr) += -Ith_Vbci; - *(here->VBICtempCollCIPtr) += +Ith_Vbci; - *(here->VBICtempCollCIPtr) += -Ith_Vcei; - *(here->VBICtempEmitEIPtr) += +Ith_Vcei; - *(here->VBICtempBaseBXPtr) += -Ith_Vbex; - *(here->VBICtempEmitEIPtr) += +Ith_Vbex; - *(here->VBICtempBaseBXPtr) += -Ith_Vbep; - *(here->VBICtempBaseBPPtr) += +Ith_Vbep; - *(here->VBICtempSubsPtr) += -Ith_Vbcp; - *(here->VBICtempBaseBPPtr) += +Ith_Vbcp; - *(here->VBICtempBaseBXPtr) += -Ith_Vcep; - *(here->VBICtempSubsPtr) += +Ith_Vcep; - *(here->VBICtempCollCXPtr) += -Ith_Vrci; - *(here->VBICtempCollCIPtr) += +Ith_Vrci; - *(here->VBICtempBaseBIPtr) += -Ith_Vbcx; - *(here->VBICtempCollCXPtr) += +Ith_Vbcx; - *(here->VBICtempBaseBXPtr) += -Ith_Vrbi; - *(here->VBICtempBaseBIPtr) += +Ith_Vrbi; - *(here->VBICtempBaseBPPtr) += -Ith_Vrbp; - *(here->VBICtempCollCXPtr) += +Ith_Vrbp; - *(here->VBICtempCollPtr) += -Ith_Vrcx; - *(here->VBICtempCollCXPtr) += +Ith_Vrcx; - *(here->VBICtempBasePtr) += -Ith_Vrbx; - *(here->VBICtempBaseBXPtr) += +Ith_Vrbx; - *(here->VBICtempEmitPtr) += -Ith_Vre; - *(here->VBICtempEmitEIPtr) += +Ith_Vre; - *(here->VBICtempSubsPtr) += -Ith_Vrs; - *(here->VBICtempSubsSIPtr) += +Ith_Vrs; - } - } - - } - return(OK); -} - -int vbic_4T_et_cf_fj(double *p - ,double *Vrth, double *Vbei, double *Vbex, double *Vbci, double *Vbep, double *Vbcp - ,double *Vrcx, double *Vbcx, double *Vrci, double *Vrbx, double *Vrbi, double *Vre, double *Vrbp - ,double *Vrs, double *Vbe, double *Vbc, double *Vcei, double *Vcep, double *Ibe, double *Ibe_Vrth - ,double *Ibe_Vbei, double *Ibex, double *Ibex_Vrth, double *Ibex_Vbex, double *Itzf, double *Itzf_Vrth, double *Itzf_Vbei - ,double *Itzf_Vbci, double *Itzr, double *Itzr_Vrth, double *Itzr_Vbci, double *Itzr_Vbei, double *Ibc, double *Ibc_Vrth - ,double *Ibc_Vbci, double *Ibc_Vbei, double *Ibep, double *Ibep_Vrth, double *Ibep_Vbep, double *Ircx, double *Ircx_Vrcx - ,double *Ircx_Vrth, double *Irci, double *Irci_Vrci, double *Irci_Vrth, double *Irci_Vbci, double *Irci_Vbcx, double *Irbx - ,double *Irbx_Vrbx, double *Irbx_Vrth, double *Irbi, double *Irbi_Vrbi, double *Irbi_Vrth, double *Irbi_Vbei, double *Irbi_Vbci - ,double *Ire, double *Ire_Vre, double *Ire_Vrth, double *Irbp, double *Irbp_Vrbp, double *Irbp_Vrth, double *Irbp_Vbep - ,double *Irbp_Vbci, double *Qbe, double *Qbe_Vrth, double *Qbe_Vbei, double *Qbe_Vbci, double *Qbex, double *Qbex_Vrth - ,double *Qbex_Vbex, double *Qbc, double *Qbc_Vrth, double *Qbc_Vbci, double *Qbcx, double *Qbcx_Vrth, double *Qbcx_Vbcx - ,double *Qbep, double *Qbep_Vrth, double *Qbep_Vbep, double *Qbep_Vbci, double *Qbeo, double *Qbeo_Vbe, double *Qbco - ,double *Qbco_Vbc, double *Ibcp, double *Ibcp_Vrth, double *Ibcp_Vbcp, double *Iccp, double *Iccp_Vrth, double *Iccp_Vbep - ,double *Iccp_Vbci, double *Iccp_Vbcp, double *Irs, double *Irs_Vrs, double *Irs_Vrth, double *Qbcp, double *Qbcp_Vrth - ,double *Qbcp_Vbcp, double *Irth, double *Irth_Vrth, double *Ith, double *Ith_Vrth, double *Ith_Vbei, double *Ith_Vbci - ,double *Ith_Vcei, double *Ith_Vbex, double *Ith_Vbep, double *Ith_Vrs, double *Ith_Vbcp, double *Ith_Vcep, double *Ith_Vrcx - ,double *Ith_Vrci, double *Ith_Vbcx, double *Ith_Vrbx, double *Ith_Vrbi, double *Ith_Vre, double *Ith_Vrbp, double *Qcth - ,double *Qcth_Vrth, double *SCALE) -{ -double Tini,Tdev,Tdev_Vrth,Vtv,Vtv_Tdev,Vtv_Vrth,rT; -double rT_Tdev,rT_Vrth,dT,dT_Tdev,dT_Vrth,xvar1,xvar1_rT; -double xvar1_Vrth,IKFatT,IKFatT_xvar1,IKFatT_Vrth,RCXatT,RCXatT_xvar1,RCXatT_Vrth; -double RCIatT,RCIatT_xvar1,RCIatT_Vrth,RBXatT,RBXatT_xvar1,RBXatT_Vrth,RBIatT; -double RBIatT_xvar1,RBIatT_Vrth,REatT,REatT_xvar1,REatT_Vrth,RSatT,RSatT_xvar1; -double RSatT_Vrth,RBPatT,RBPatT_xvar1,RBPatT_Vrth,xvar2,xvar2_rT,xvar2_Vrth; -double xvar3,xvar3_rT,xvar3_Vrth,xvar3_Vtv,xvar4,xvar4_xvar3,xvar4_Vrth; -double xvar1_xvar2,xvar1_xvar4,xvar5,xvar6,xvar6_xvar1,xvar6_Vrth,ISatT; -double ISatT_xvar6,ISatT_Vrth,ISRRatT,ISRRatT_xvar6,ISRRatT_Vrth,ISPatT,ISPatT_xvar6; -double ISPatT_Vrth,IBEIatT,IBEIatT_xvar6,IBEIatT_Vrth,IBENatT,IBENatT_xvar6,IBENatT_Vrth; -double IBCIatT,IBCIatT_xvar6,IBCIatT_Vrth,IBCNatT,IBCNatT_xvar6,IBCNatT_Vrth,IBEIPatT; -double IBEIPatT_xvar6,IBEIPatT_Vrth,IBENPatT,IBENPatT_xvar6,IBENPatT_Vrth,IBCIPatT,IBCIPatT_xvar6; -double IBCIPatT_Vrth,IBCNPatT,IBCNPatT_xvar6,IBCNPatT_Vrth,NFatT,NFatT_dT,NFatT_Vrth; -double NRatT,NRatT_dT,NRatT_Vrth,AVC2atT,AVC2atT_dT,AVC2atT_Vrth,VBBEatT; -double VBBEatT_dT,VBBEatT_Vrth,NBBEatT,NBBEatT_dT,NBBEatT_Vrth,xvar2_Vtv,xvar3_xvar2; -double xvar4_rT,xvar4_Vtv,xvar5_xvar4,xvar5_Vrth,xvar1_xvar3,xvar1_xvar5,psiio; -double psiio_Vtv,psiio_Vrth,psiio_rT,psiio_xvar6,psiin,psiin_psiio,psiin_Vrth; -double psiin_rT,psiin_Vtv,psiin_xvar1,xvar2_psiin,xvar4_xvar1,PEatT,PEatT_psiin; -double PEatT_Vrth,PEatT_Vtv,PEatT_xvar4,PCatT,PCatT_psiin,PCatT_Vrth,PCatT_Vtv; -double PCatT_xvar4,PSatT,PSatT_psiin,PSatT_Vrth,PSatT_Vtv,PSatT_xvar4,xvar1_PEatT; -double xvar2_xvar1,CJEatT,CJEatT_xvar2,CJEatT_Vrth,xvar1_PCatT,CJCatT,CJCatT_xvar2; -double CJCatT_Vrth,CJEPatT,CJEPatT_xvar2,CJEPatT_Vrth,xvar1_PSatT,CJCPatT,CJCPatT_xvar2; -double CJCPatT_Vrth,GAMMatT,GAMMatT_xvar1,GAMMatT_Vrth,GAMMatT_xvar3,VOatT,VOatT_xvar1; -double VOatT_Vrth,xvar1_VBBEatT,xvar1_NBBEatT,xvar1_Vtv,EBBEatT,EBBEatT_xvar1,EBBEatT_Vrth; -double IVEF,IVER,IIKF,IIKF_IKFatT,IIKF_Vrth,IIKR,IIKP; -double IVO,IVO_VOatT,IVO_Vrth,IHRCF,IVTF,IITF,slTF; -double dv0,dv0_PEatT,dv0_Vrth,dvh,dvh_Vbei,dvh_dv0,dvh_Vrth; -double pwq,qlo,qlo_PEatT,qlo_Vrth,qlo_Vbei,qhi,qhi_dvh; -double qhi_Vbei,qhi_Vrth,qhi_PEatT,xvar1_Vbei,xvar3_xvar1,xvar3_Vbei,qlo_xvar3; -double qdbe,qdbe_qlo,qdbe_Vrth,qdbe_Vbei,qdbe_qhi,mv0,mv0_dv0; -double mv0_Vrth,vl0,vl0_dv0,vl0_Vrth,vl0_mv0,xvar1_vl0,q0; -double q0_PEatT,q0_Vrth,q0_xvar3,dv,dv_Vbei,dv_dv0,dv_Vrth; -double mv,mv_dv,mv_Vbei,mv_Vrth,vl,vl_dv,vl_Vbei; -double vl_Vrth,vl_mv,vl_dv0,xvar1_vl,qdbe_vl,qdbe_vl0,qdbe_q0; -double dvh_Vbex,qlo_Vbex,qhi_Vbex,xvar1_Vbex,xvar3_Vbex,qdbex,qdbex_qlo; -double qdbex_Vrth,qdbex_Vbex,qdbex_qhi,dv_Vbex,mv_Vbex,vl_Vbex,qdbex_vl; -double qdbex_vl0,qdbex_q0,dv0_PCatT,dvh_Vbci,qlo_PCatT,qlo_Vbci,qhi_Vbci; -double qhi_PCatT,xvar1_Vbci,xvar3_Vbci,qdbc,qdbc_qlo,qdbc_Vrth,qdbc_Vbci; -double qdbc_qhi,vn0,vn0_dv0,vn0_Vrth,vnl0,vnl0_vn0,vnl0_Vrth; -double vl0_vnl0,qlo0,qlo0_PCatT,qlo0_Vrth,qlo0_xvar3,vn,vn_Vbci; -double vn_dv0,vn_Vrth,vnl,vnl_vn,vnl_Vbci,vnl_Vrth,vl_vnl; -double vl_Vbci,sel,sel_vnl,sel_Vbci,sel_Vrth,crt,crt_xvar1; -double crt_Vrth,xvar1_dv0,cmx,cmx_xvar1,cmx_Vrth,cl,cl_sel; -double cl_Vbci,cl_Vrth,cl_crt,cl_cmx,ql,ql_Vbci,ql_vl; -double ql_Vrth,ql_vl0,ql_cl,qdbc_ql,qdbc_qlo0,q0_PCatT,dv_Vbci; -double mv_Vbci,qdbc_vl,qdbc_vl0,qdbc_q0,dvh_Vbep,qlo_Vbep,qhi_Vbep; -double xvar1_Vbep,xvar3_Vbep,qdbep,qdbep_qlo,qdbep_Vrth,qdbep_Vbep,qdbep_qhi; -double vn_Vbep,vnl_Vbep,vl_Vbep,sel_Vbep,cl_Vbep,ql_Vbep,qdbep_ql; -double qdbep_qlo0,dv_Vbep,mv_Vbep,qdbep_vl,qdbep_vl0,qdbep_q0,dv0_PSatT; -double dvh_Vbcp,qlo_PSatT,qlo_Vbcp,qhi_Vbcp,qhi_PSatT,xvar1_Vbcp,xvar3_Vbcp; -double qdbcp,qdbcp_qlo,qdbcp_Vrth,qdbcp_Vbcp,qdbcp_qhi,q0_PSatT; -double dv_Vbcp,mv_Vbcp,vl_Vbcp,qdbcp_vl,qdbcp_vl0,qdbcp_q0,argi; -double argi_Vbei,argi_NFatT,argi_Vrth,argi_Vtv,expi,expi_argi,expi_Vbei; -double expi_Vrth,Ifi,Ifi_ISatT,Ifi_Vrth,Ifi_expi,Ifi_Vbei,argi_Vbci; -double argi_NRatT,expi_Vbci,Iri,Iri_ISatT,Iri_Vrth,Iri_ISRRatT,Iri_expi; -double Iri_Vbci,q1z,q1z_qdbe,q1z_Vrth,q1z_Vbei,q1z_qdbc,q1z_Vbci; -double q1,q1_q1z,q1_Vrth,q1_Vbei,q1_Vbci,q2,q2_Ifi; -double q2_Vrth,q2_Vbei,q2_IIKF,q2_Iri,q2_Vbci,xvar3_q1,xvar1_q2; -double xvar4_Vbei,xvar4_Vbci,qb,qb_q1,qb_Vrth,qb_Vbei,qb_Vbci; -double qb_xvar4,xvar2_Vbei,xvar2_Vbci,qb_xvar2,Itzr_Iri,Itzr_qb,Itzf_Ifi; -double Itzf_qb,argi_Vbep,expi_Vbep,argx,argx_Vbci,argx_Vtv,argx_Vrth; -double expx,expx_argx,expx_Vbci,expx_Vrth,Ifp,Ifp_ISPatT,Ifp_Vrth; -double Ifp_expi,Ifp_Vbep,Ifp_expx,Ifp_Vbci,q2p,q2p_Ifp,q2p_Vrth; -double q2p_Vbep,q2p_Vbci,qbp,qbp_q2p,qbp_Vrth,qbp_Vbep,qbp_Vbci; -double argi_Vbcp,expi_Vbcp,Irp,Irp_ISPatT,Irp_Vrth,Irp_expi,Irp_Vbcp; -double Iccp_Ifp,Iccp_Irp,Iccp_qbp,argn,argn_Vbei,argn_Vtv,argn_Vrth; -double expn,expn_argn,expn_Vbei,expn_Vrth,argx_VBBEatT,argx_Vbei,argx_NBBEatT; -double expx_Vbei,Ibe_IBEIatT,Ibe_expi,Ibe_IBENatT,Ibe_expn,Ibe_expx,Ibe_EBBEatT; -double argi_Vbex,expi_Vbex,argn_Vbex,expn_Vbex,argx_Vbex,expx_Vbex,Ibex_IBEIatT; -double Ibex_expi,Ibex_IBENatT,Ibex_expn,Ibex_expx,Ibex_EBBEatT,argn_Vbci,expn_Vbci; -double Ibcj,Ibcj_IBCIatT,Ibcj_Vrth,Ibcj_expi,Ibcj_Vbci,Ibcj_IBCNatT,Ibcj_expn; -double argn_Vbep,expn_Vbep,Ibep_IBEIPatT,Ibep_expi,Ibep_IBENPatT,Ibep_expn,vl_PCatT; -double xvar3_vl,xvar1_AVC2atT,avalf,avalf_vl,avalf_Vrth,avalf_Vbci,avalf_xvar4; -double Igc,Igc_Itzf,Igc_Vrth,Igc_Vbei,Igc_Vbci,Igc_Itzr,Igc_Ibcj; -double Igc_avalf,Ibc_Ibcj,Ibc_Igc,Ircx_RCXatT,argx_Vbcx,expx_Vbcx,Kbci; -double Kbci_GAMMatT,Kbci_Vrth,Kbci_expi,Kbci_Vbci,Kbcx,Kbcx_GAMMatT,Kbcx_Vrth; -double Kbcx_expx,Kbcx_Vbcx,rKp1,rKp1_Kbci,rKp1_Vrth,rKp1_Vbci,rKp1_Kbcx; -double rKp1_Vbcx,xvar1_rKp1,xvar1_Vbcx,Iohm,Iohm_Vrci,Iohm_Vtv,Iohm_Vrth; -double Iohm_Kbci,Iohm_Vbci,Iohm_Kbcx,Iohm_Vbcx,Iohm_xvar1,Iohm_RCIatT,derf; -double derf_IVO,derf_Vrth,derf_RCIatT,derf_Iohm,derf_Vrci,derf_Vbci,derf_Vbcx; -double Irci_Iohm,Irci_derf,Irbx_RBXatT,Irbi_qb,Irbi_RBIatT,Ire_REatT,Irbp_qbp; -double Irbp_RBPatT,argn_Vbcp,expn_Vbcp,Ibcp_IBCIPatT,Ibcp_expi,Ibcp_IBCNPatT,Ibcp_expn; -double Irs_RSatT,sgIf,rIf,rIf_Ifi,rIf_Vrth,rIf_Vbei,mIf; -double mIf_rIf,mIf_Vrth,mIf_Vbei,tff,tff_q1,tff_Vrth,tff_Vbei; -double tff_Vbci,tff_xvar2,tff_mIf,Qbe_CJEatT,Qbe_qdbe,Qbe_tff,Qbe_Ifi; -double Qbe_qb,Qbex_CJEatT,Qbex_qdbex,Qbc_CJCatT,Qbc_qdbc,Qbc_Iri,Qbc_Kbci; -double Qbcx_Kbcx,Qbep_CJEPatT,Qbep_qdbep,Qbep_Ifp,Qbcp_CJCPatT,Qbcp_qdbcp,Ith_Ibe; -double Ith_Ibc,Ith_Itzf,Ith_Itzr,Ith_Ibex,Ith_Ibep,Ith_Irs,Ith_Ibcp; -double Ith_Iccp,Ith_Ircx,Ith_Irci,Ith_Irbx,Ith_Irbi,Ith_Ire,Ith_Irbp; - -/* Function and derivative code */ - - Tini=2.731500e+02+p[0]; - Tdev=(2.731500e+02+p[0])+(*Vrth); - Tdev_Vrth=1.0; - Vtv=1.380662e-23*Tdev/1.602189e-19; - Vtv_Tdev=8.617347e-5; - Vtv_Vrth=Vtv_Tdev*Tdev_Vrth; - rT=Tdev/Tini; - rT_Tdev=1.0/Tini; - rT_Vrth=rT_Tdev*Tdev_Vrth; - dT=Tdev-Tini; - dT_Tdev=1.0; - dT_Vrth=dT_Tdev*Tdev_Vrth; - xvar1=pow(rT,p[90]); - xvar1_rT=xvar1*p[90]/rT; - xvar1_Vrth=xvar1_rT*rT_Vrth; - IKFatT=p[53]*xvar1; - IKFatT_xvar1=p[53]; - IKFatT_Vrth=IKFatT_xvar1*xvar1_Vrth; - xvar1=pow(rT,p[91]); - xvar1_rT=xvar1*p[91]/rT; - xvar1_Vrth=xvar1_rT*rT_Vrth; - RCXatT=p[1]*xvar1; - RCXatT_xvar1=p[1]; - RCXatT_Vrth=RCXatT_xvar1*xvar1_Vrth; - xvar1=pow(rT,p[68]); - xvar1_rT=xvar1*p[68]/rT; - xvar1_Vrth=xvar1_rT*rT_Vrth; - RCIatT=p[2]*xvar1; - RCIatT_xvar1=p[2]; - RCIatT_Vrth=RCIatT_xvar1*xvar1_Vrth; - xvar1=pow(rT,p[92]); - xvar1_rT=xvar1*p[92]/rT; - xvar1_Vrth=xvar1_rT*rT_Vrth; - RBXatT=p[6]*xvar1; - RBXatT_xvar1=p[6]; - RBXatT_Vrth=RBXatT_xvar1*xvar1_Vrth; - xvar1=pow(rT,p[67]); - xvar1_rT=xvar1*p[67]/rT; - xvar1_Vrth=xvar1_rT*rT_Vrth; - RBIatT=p[7]*xvar1; - RBIatT_xvar1=p[7]; - RBIatT_Vrth=RBIatT_xvar1*xvar1_Vrth; - xvar1=pow(rT,p[66]); - xvar1_rT=xvar1*p[66]/rT; - xvar1_Vrth=xvar1_rT*rT_Vrth; - REatT=p[8]*xvar1; - REatT_xvar1=p[8]; - REatT_Vrth=REatT_xvar1*xvar1_Vrth; - xvar1=pow(rT,p[69]); - xvar1_rT=xvar1*p[69]/rT; - xvar1_Vrth=xvar1_rT*rT_Vrth; - RSatT=p[9]*xvar1; - RSatT_xvar1=p[9]; - RSatT_Vrth=RSatT_xvar1*xvar1_Vrth; - xvar1=pow(rT,p[93]); - xvar1_rT=xvar1*p[93]/rT; - xvar1_Vrth=xvar1_rT*rT_Vrth; - RBPatT=p[10]*xvar1; - RBPatT_xvar1=p[10]; - RBPatT_Vrth=RBPatT_xvar1*xvar1_Vrth; - xvar2=pow(rT,p[78]); - xvar2_rT=xvar2*p[78]/rT; - xvar2_Vrth=xvar2_rT*rT_Vrth; - xvar3=-p[71]*(1.0-rT)/Vtv; - xvar3_rT=p[71]/Vtv; - xvar3_Vtv=p[71]*(1.0-rT)/(Vtv*Vtv); - xvar3_Vrth=xvar3_rT*rT_Vrth; - xvar3_Vrth=xvar3_Vrth+xvar3_Vtv*Vtv_Vrth; - xvar4=exp(xvar3); - xvar4_xvar3=xvar4; - xvar4_Vrth=xvar4_xvar3*xvar3_Vrth; - xvar1=(xvar2*xvar4); - xvar1_xvar2=xvar4; - xvar1_xvar4=xvar2; - xvar1_Vrth=xvar1_xvar2*xvar2_Vrth; - xvar1_Vrth=xvar1_Vrth+xvar1_xvar4*xvar4_Vrth; - xvar5=(1.0/p[12]); - xvar6=pow(xvar1,xvar5); - xvar6_xvar1=xvar6*xvar5/xvar1; - xvar6_Vrth=xvar6_xvar1*xvar1_Vrth; - ISatT=p[11]*xvar6; - ISatT_xvar6=p[11]; - ISatT_Vrth=ISatT_xvar6*xvar6_Vrth; - xvar2=pow(rT,p[95]); - xvar2_rT=xvar2*p[95]/rT; - xvar2_Vrth=xvar2_rT*rT_Vrth; - xvar3=-p[96]*(1.0-rT)/Vtv; - xvar3_rT=p[96]/Vtv; - xvar3_Vtv=p[96]*(1.0-rT)/(Vtv*Vtv); - xvar3_Vrth=xvar3_rT*rT_Vrth; - xvar3_Vrth=xvar3_Vrth+xvar3_Vtv*Vtv_Vrth; - xvar4=exp(xvar3); - xvar4_xvar3=xvar4; - xvar4_Vrth=xvar4_xvar3*xvar3_Vrth; - xvar1=(xvar2*xvar4); - xvar1_xvar2=xvar4; - xvar1_xvar4=xvar2; - xvar1_Vrth=xvar1_xvar2*xvar2_Vrth; - xvar1_Vrth=xvar1_Vrth+xvar1_xvar4*xvar4_Vrth; - xvar5=(1.0/p[13]); - xvar6=pow(xvar1,xvar5); - xvar6_xvar1=xvar6*xvar5/xvar1; - xvar6_Vrth=xvar6_xvar1*xvar1_Vrth; - ISRRatT=p[94]*xvar6; - ISRRatT_xvar6=p[94]; - ISRRatT_Vrth=ISRRatT_xvar6*xvar6_Vrth; - xvar2=pow(rT,p[78]); - xvar2_rT=xvar2*p[78]/rT; - xvar2_Vrth=xvar2_rT*rT_Vrth; - xvar3=-p[97]*(1.0-rT)/Vtv; - xvar3_rT=p[97]/Vtv; - xvar3_Vtv=p[97]*(1.0-rT)/(Vtv*Vtv); - xvar3_Vrth=xvar3_rT*rT_Vrth; - xvar3_Vrth=xvar3_Vrth+xvar3_Vtv*Vtv_Vrth; - xvar4=exp(xvar3); - xvar4_xvar3=xvar4; - xvar4_Vrth=xvar4_xvar3*xvar3_Vrth; - xvar1=(xvar2*xvar4); - xvar1_xvar2=xvar4; - xvar1_xvar4=xvar2; - xvar1_Vrth=xvar1_xvar2*xvar2_Vrth; - xvar1_Vrth=xvar1_Vrth+xvar1_xvar4*xvar4_Vrth; - xvar5=(1.0/p[44]); - xvar6=pow(xvar1,xvar5); - xvar6_xvar1=xvar6*xvar5/xvar1; - xvar6_Vrth=xvar6_xvar1*xvar1_Vrth; - ISPatT=p[42]*xvar6; - ISPatT_xvar6=p[42]; - ISPatT_Vrth=ISPatT_xvar6*xvar6_Vrth; - xvar2=pow(rT,p[79]); - xvar2_rT=xvar2*p[79]/rT; - xvar2_Vrth=xvar2_rT*rT_Vrth; - xvar3=-p[72]*(1.0-rT)/Vtv; - xvar3_rT=p[72]/Vtv; - xvar3_Vtv=p[72]*(1.0-rT)/(Vtv*Vtv); - xvar3_Vrth=xvar3_rT*rT_Vrth; - xvar3_Vrth=xvar3_Vrth+xvar3_Vtv*Vtv_Vrth; - xvar4=exp(xvar3); - xvar4_xvar3=xvar4; - xvar4_Vrth=xvar4_xvar3*xvar3_Vrth; - xvar1=(xvar2*xvar4); - xvar1_xvar2=xvar4; - xvar1_xvar4=xvar2; - xvar1_Vrth=xvar1_xvar2*xvar2_Vrth; - xvar1_Vrth=xvar1_Vrth+xvar1_xvar4*xvar4_Vrth; - xvar5=(1.0/p[33]); - xvar6=pow(xvar1,xvar5); - xvar6_xvar1=xvar6*xvar5/xvar1; - xvar6_Vrth=xvar6_xvar1*xvar1_Vrth; - IBEIatT=p[31]*xvar6; - IBEIatT_xvar6=p[31]; - IBEIatT_Vrth=IBEIatT_xvar6*xvar6_Vrth; - xvar2=pow(rT,p[80]); - xvar2_rT=xvar2*p[80]/rT; - xvar2_Vrth=xvar2_rT*rT_Vrth; - xvar3=-p[75]*(1.0-rT)/Vtv; - xvar3_rT=p[75]/Vtv; - xvar3_Vtv=p[75]*(1.0-rT)/(Vtv*Vtv); - xvar3_Vrth=xvar3_rT*rT_Vrth; - xvar3_Vrth=xvar3_Vrth+xvar3_Vtv*Vtv_Vrth; - xvar4=exp(xvar3); - xvar4_xvar3=xvar4; - xvar4_Vrth=xvar4_xvar3*xvar3_Vrth; - xvar1=(xvar2*xvar4); - xvar1_xvar2=xvar4; - xvar1_xvar4=xvar2; - xvar1_Vrth=xvar1_xvar2*xvar2_Vrth; - xvar1_Vrth=xvar1_Vrth+xvar1_xvar4*xvar4_Vrth; - xvar5=(1.0/p[35]); - xvar6=pow(xvar1,xvar5); - xvar6_xvar1=xvar6*xvar5/xvar1; - xvar6_Vrth=xvar6_xvar1*xvar1_Vrth; - IBENatT=p[34]*xvar6; - IBENatT_xvar6=p[34]; - IBENatT_Vrth=IBENatT_xvar6*xvar6_Vrth; - xvar2=pow(rT,p[79]); - xvar2_rT=xvar2*p[79]/rT; - xvar2_Vrth=xvar2_rT*rT_Vrth; - xvar3=-p[73]*(1.0-rT)/Vtv; - xvar3_rT=p[73]/Vtv; - xvar3_Vtv=p[73]*(1.0-rT)/(Vtv*Vtv); - xvar3_Vrth=xvar3_rT*rT_Vrth; - xvar3_Vrth=xvar3_Vrth+xvar3_Vtv*Vtv_Vrth; - xvar4=exp(xvar3); - xvar4_xvar3=xvar4; - xvar4_Vrth=xvar4_xvar3*xvar3_Vrth; - xvar1=(xvar2*xvar4); - xvar1_xvar2=xvar4; - xvar1_xvar4=xvar2; - xvar1_Vrth=xvar1_xvar2*xvar2_Vrth; - xvar1_Vrth=xvar1_Vrth+xvar1_xvar4*xvar4_Vrth; - xvar5=(1.0/p[37]); - xvar6=pow(xvar1,xvar5); - xvar6_xvar1=xvar6*xvar5/xvar1; - xvar6_Vrth=xvar6_xvar1*xvar1_Vrth; - IBCIatT=p[36]*xvar6; - IBCIatT_xvar6=p[36]; - IBCIatT_Vrth=IBCIatT_xvar6*xvar6_Vrth; - xvar2=pow(rT,p[80]); - xvar2_rT=xvar2*p[80]/rT; - xvar2_Vrth=xvar2_rT*rT_Vrth; - xvar3=-p[76]*(1.0-rT)/Vtv; - xvar3_rT=p[76]/Vtv; - xvar3_Vtv=p[76]*(1.0-rT)/(Vtv*Vtv); - xvar3_Vrth=xvar3_rT*rT_Vrth; - xvar3_Vrth=xvar3_Vrth+xvar3_Vtv*Vtv_Vrth; - xvar4=exp(xvar3); - xvar4_xvar3=xvar4; - xvar4_Vrth=xvar4_xvar3*xvar3_Vrth; - xvar1=(xvar2*xvar4); - xvar1_xvar2=xvar4; - xvar1_xvar4=xvar2; - xvar1_Vrth=xvar1_xvar2*xvar2_Vrth; - xvar1_Vrth=xvar1_Vrth+xvar1_xvar4*xvar4_Vrth; - xvar5=(1.0/p[39]); - xvar6=pow(xvar1,xvar5); - xvar6_xvar1=xvar6*xvar5/xvar1; - xvar6_Vrth=xvar6_xvar1*xvar1_Vrth; - IBCNatT=p[38]*xvar6; - IBCNatT_xvar6=p[38]; - IBCNatT_Vrth=IBCNatT_xvar6*xvar6_Vrth; - xvar2=pow(rT,p[79]); - xvar2_rT=xvar2*p[79]/rT; - xvar2_Vrth=xvar2_rT*rT_Vrth; - xvar3=-p[73]*(1.0-rT)/Vtv; - xvar3_rT=p[73]/Vtv; - xvar3_Vtv=p[73]*(1.0-rT)/(Vtv*Vtv); - xvar3_Vrth=xvar3_rT*rT_Vrth; - xvar3_Vrth=xvar3_Vrth+xvar3_Vtv*Vtv_Vrth; - xvar4=exp(xvar3); - xvar4_xvar3=xvar4; - xvar4_Vrth=xvar4_xvar3*xvar3_Vrth; - xvar1=(xvar2*xvar4); - xvar1_xvar2=xvar4; - xvar1_xvar4=xvar2; - xvar1_Vrth=xvar1_xvar2*xvar2_Vrth; - xvar1_Vrth=xvar1_Vrth+xvar1_xvar4*xvar4_Vrth; - xvar5=(1.0/p[37]); - xvar6=pow(xvar1,xvar5); - xvar6_xvar1=xvar6*xvar5/xvar1; - xvar6_Vrth=xvar6_xvar1*xvar1_Vrth; - IBEIPatT=p[45]*xvar6; - IBEIPatT_xvar6=p[45]; - IBEIPatT_Vrth=IBEIPatT_xvar6*xvar6_Vrth; - xvar2=pow(rT,p[80]); - xvar2_rT=xvar2*p[80]/rT; - xvar2_Vrth=xvar2_rT*rT_Vrth; - xvar3=-p[76]*(1.0-rT)/Vtv; - xvar3_rT=p[76]/Vtv; - xvar3_Vtv=p[76]*(1.0-rT)/(Vtv*Vtv); - xvar3_Vrth=xvar3_rT*rT_Vrth; - xvar3_Vrth=xvar3_Vrth+xvar3_Vtv*Vtv_Vrth; - xvar4=exp(xvar3); - xvar4_xvar3=xvar4; - xvar4_Vrth=xvar4_xvar3*xvar3_Vrth; - xvar1=(xvar2*xvar4); - xvar1_xvar2=xvar4; - xvar1_xvar4=xvar2; - xvar1_Vrth=xvar1_xvar2*xvar2_Vrth; - xvar1_Vrth=xvar1_Vrth+xvar1_xvar4*xvar4_Vrth; - xvar5=(1.0/p[39]); - xvar6=pow(xvar1,xvar5); - xvar6_xvar1=xvar6*xvar5/xvar1; - xvar6_Vrth=xvar6_xvar1*xvar1_Vrth; - IBENPatT=p[46]*xvar6; - IBENPatT_xvar6=p[46]; - IBENPatT_Vrth=IBENPatT_xvar6*xvar6_Vrth; - xvar2=pow(rT,p[79]); - xvar2_rT=xvar2*p[79]/rT; - xvar2_Vrth=xvar2_rT*rT_Vrth; - xvar3=-p[74]*(1.0-rT)/Vtv; - xvar3_rT=p[74]/Vtv; - xvar3_Vtv=p[74]*(1.0-rT)/(Vtv*Vtv); - xvar3_Vrth=xvar3_rT*rT_Vrth; - xvar3_Vrth=xvar3_Vrth+xvar3_Vtv*Vtv_Vrth; - xvar4=exp(xvar3); - xvar4_xvar3=xvar4; - xvar4_Vrth=xvar4_xvar3*xvar3_Vrth; - xvar1=(xvar2*xvar4); - xvar1_xvar2=xvar4; - xvar1_xvar4=xvar2; - xvar1_Vrth=xvar1_xvar2*xvar2_Vrth; - xvar1_Vrth=xvar1_Vrth+xvar1_xvar4*xvar4_Vrth; - xvar5=(1.0/p[48]); - xvar6=pow(xvar1,xvar5); - xvar6_xvar1=xvar6*xvar5/xvar1; - xvar6_Vrth=xvar6_xvar1*xvar1_Vrth; - IBCIPatT=p[47]*xvar6; - IBCIPatT_xvar6=p[47]; - IBCIPatT_Vrth=IBCIPatT_xvar6*xvar6_Vrth; - xvar2=pow(rT,p[80]); - xvar2_rT=xvar2*p[80]/rT; - xvar2_Vrth=xvar2_rT*rT_Vrth; - xvar3=-p[77]*(1.0-rT)/Vtv; - xvar3_rT=p[77]/Vtv; - xvar3_Vtv=p[77]*(1.0-rT)/(Vtv*Vtv); - xvar3_Vrth=xvar3_rT*rT_Vrth; - xvar3_Vrth=xvar3_Vrth+xvar3_Vtv*Vtv_Vrth; - xvar4=exp(xvar3); - xvar4_xvar3=xvar4; - xvar4_Vrth=xvar4_xvar3*xvar3_Vrth; - xvar1=(xvar2*xvar4); - xvar1_xvar2=xvar4; - xvar1_xvar4=xvar2; - xvar1_Vrth=xvar1_xvar2*xvar2_Vrth; - xvar1_Vrth=xvar1_Vrth+xvar1_xvar4*xvar4_Vrth; - xvar5=(1.0/p[50]); - xvar6=pow(xvar1,xvar5); - xvar6_xvar1=xvar6*xvar5/xvar1; - xvar6_Vrth=xvar6_xvar1*xvar1_Vrth; - IBCNPatT=p[49]*xvar6; - IBCNPatT_xvar6=p[49]; - IBCNPatT_Vrth=IBCNPatT_xvar6*xvar6_Vrth; - NFatT=p[12]*(1.0+dT*p[81]); - NFatT_dT=p[12]*p[81]; - NFatT_Vrth=NFatT_dT*dT_Vrth; - NRatT=p[13]*(1.0+dT*p[81]); - NRatT_dT=p[13]*p[81]; - NRatT_Vrth=NRatT_dT*dT_Vrth; - AVC2atT=p[41]*(1.0+dT*p[82]); - AVC2atT_dT=p[41]*p[82]; - AVC2atT_Vrth=AVC2atT_dT*dT_Vrth; - VBBEatT=p[98]*(1.0+dT*(p[101]+dT*p[102])); - VBBEatT_dT=(2.0*dT*p[102]+p[101])*p[98]; - VBBEatT_Vrth=VBBEatT_dT*dT_Vrth; - NBBEatT=p[99]*(1.0+dT*p[103]); - NBBEatT_dT=p[99]*p[103]; - NBBEatT_Vrth=NBBEatT_dT*dT_Vrth; - xvar2=0.5*p[17]*rT/Vtv; - xvar2_rT=0.5*p[17]/Vtv; - xvar2_Vtv=-0.5*p[17]*rT/(Vtv*Vtv); - xvar2_Vrth=xvar2_rT*rT_Vrth; - xvar2_Vrth=xvar2_Vrth+xvar2_Vtv*Vtv_Vrth; - xvar3=exp(xvar2); - xvar3_xvar2=xvar3; - xvar3_Vrth=xvar3_xvar2*xvar2_Vrth; - xvar4=-0.5*p[17]*rT/Vtv; - xvar4_rT=-0.5*p[17]/Vtv; - xvar4_Vtv=0.5*p[17]*rT/(Vtv*Vtv); - xvar4_Vrth=xvar4_rT*rT_Vrth; - xvar4_Vrth=xvar4_Vrth+xvar4_Vtv*Vtv_Vrth; - xvar5=exp(xvar4); - xvar5_xvar4=xvar5; - xvar5_Vrth=xvar5_xvar4*xvar4_Vrth; - xvar1=xvar3-xvar5; - xvar1_xvar3=1.0; - xvar1_xvar5=-1.0; - xvar1_Vrth=xvar1_xvar3*xvar3_Vrth; - xvar1_Vrth=xvar1_Vrth+xvar1_xvar5*xvar5_Vrth; - xvar6=log(xvar1); - xvar6_xvar1=1.0/xvar1; - xvar6_Vrth=xvar6_xvar1*xvar1_Vrth; - psiio=2.0*(Vtv/rT)*xvar6; - psiio_Vtv=2.0*xvar6/rT; - psiio_rT=-2.0*Vtv*xvar6/(rT*rT); - psiio_xvar6=2.0*Vtv/rT; - psiio_Vrth=psiio_Vtv*Vtv_Vrth; - psiio_Vrth=psiio_Vrth+psiio_rT*rT_Vrth; - psiio_Vrth=psiio_Vrth+psiio_xvar6*xvar6_Vrth; - xvar1=log(rT); - xvar1_rT=1.0/rT; - xvar1_Vrth=xvar1_rT*rT_Vrth; - psiin=psiio*rT-3.0*Vtv*xvar1-p[72]*(rT-1.0); - psiin_psiio=rT; - psiin_rT=psiio-p[72]; - psiin_Vtv=-3.0*xvar1; - psiin_xvar1=-3.0*Vtv; - psiin_Vrth=psiin_psiio*psiio_Vrth; - psiin_Vrth=psiin_Vrth+psiin_rT*rT_Vrth; - psiin_Vrth=psiin_Vrth+psiin_Vtv*Vtv_Vrth; - psiin_Vrth=psiin_Vrth+psiin_xvar1*xvar1_Vrth; - xvar2=-psiin/Vtv; - xvar2_psiin=-1.0/Vtv; - xvar2_Vtv=psiin/(Vtv*Vtv); - xvar2_Vrth=xvar2_psiin*psiin_Vrth; - xvar2_Vrth=xvar2_Vrth+xvar2_Vtv*Vtv_Vrth; - xvar3=exp(xvar2); - xvar3_xvar2=xvar3; - xvar3_Vrth=xvar3_xvar2*xvar2_Vrth; - xvar1=0.5*(1.0+sqrt(1.0+4.0*xvar3)); - xvar1_xvar3=1.0/sqrt(4.0*xvar3+1.0); - xvar1_Vrth=xvar1_xvar3*xvar3_Vrth; - xvar4=log(xvar1); - xvar4_xvar1=1.0/xvar1; - xvar4_Vrth=xvar4_xvar1*xvar1_Vrth; - PEatT=psiin+2.0*Vtv*xvar4; - PEatT_psiin=1.0; - PEatT_Vtv=2.0*xvar4; - PEatT_xvar4=2.0*Vtv; - PEatT_Vrth=PEatT_psiin*psiin_Vrth; - PEatT_Vrth=PEatT_Vrth+PEatT_Vtv*Vtv_Vrth; - PEatT_Vrth=PEatT_Vrth+PEatT_xvar4*xvar4_Vrth; - xvar2=0.5*p[24]*rT/Vtv; - xvar2_rT=0.5*p[24]/Vtv; - xvar2_Vtv=-0.5*p[24]*rT/(Vtv*Vtv); - xvar2_Vrth=xvar2_rT*rT_Vrth; - xvar2_Vrth=xvar2_Vrth+xvar2_Vtv*Vtv_Vrth; - xvar3=exp(xvar2); - xvar3_xvar2=xvar3; - xvar3_Vrth=xvar3_xvar2*xvar2_Vrth; - xvar4=-0.5*p[24]*rT/Vtv; - xvar4_rT=-0.5*p[24]/Vtv; - xvar4_Vtv=0.5*p[24]*rT/(Vtv*Vtv); - xvar4_Vrth=xvar4_rT*rT_Vrth; - xvar4_Vrth=xvar4_Vrth+xvar4_Vtv*Vtv_Vrth; - xvar5=exp(xvar4); - xvar5_xvar4=xvar5; - xvar5_Vrth=xvar5_xvar4*xvar4_Vrth; - xvar1=xvar3-xvar5; - xvar1_xvar3=1.0; - xvar1_xvar5=-1.0; - xvar1_Vrth=xvar1_xvar3*xvar3_Vrth; - xvar1_Vrth=xvar1_Vrth+xvar1_xvar5*xvar5_Vrth; - xvar6=log(xvar1); - xvar6_xvar1=1.0/xvar1; - xvar6_Vrth=xvar6_xvar1*xvar1_Vrth; - psiio=2.0*(Vtv/rT)*xvar6; - psiio_Vtv=2.0*xvar6/rT; - psiio_rT=-2.0*Vtv*xvar6/(rT*rT); - psiio_xvar6=2.0*Vtv/rT; - psiio_Vrth=psiio_Vtv*Vtv_Vrth; - psiio_Vrth=psiio_Vrth+psiio_rT*rT_Vrth; - psiio_Vrth=psiio_Vrth+psiio_xvar6*xvar6_Vrth; - xvar1=log(rT); - xvar1_rT=1.0/rT; - xvar1_Vrth=xvar1_rT*rT_Vrth; - psiin=psiio*rT-3.0*Vtv*xvar1-p[73]*(rT-1.0); - psiin_psiio=rT; - psiin_rT=psiio-p[73]; - psiin_Vtv=-3.0*xvar1; - psiin_xvar1=-3.0*Vtv; - psiin_Vrth=psiin_psiio*psiio_Vrth; - psiin_Vrth=psiin_Vrth+psiin_rT*rT_Vrth; - psiin_Vrth=psiin_Vrth+psiin_Vtv*Vtv_Vrth; - psiin_Vrth=psiin_Vrth+psiin_xvar1*xvar1_Vrth; - xvar2=-psiin/Vtv; - xvar2_psiin=-1.0/Vtv; - xvar2_Vtv=psiin/(Vtv*Vtv); - xvar2_Vrth=xvar2_psiin*psiin_Vrth; - xvar2_Vrth=xvar2_Vrth+xvar2_Vtv*Vtv_Vrth; - xvar3=exp(xvar2); - xvar3_xvar2=xvar3; - xvar3_Vrth=xvar3_xvar2*xvar2_Vrth; - xvar1=0.5*(1.0+sqrt(1.0+4.0*xvar3)); - xvar1_xvar3=1.0/sqrt(4.0*xvar3+1.0); - xvar1_Vrth=xvar1_xvar3*xvar3_Vrth; - xvar4=log(xvar1); - xvar4_xvar1=1.0/xvar1; - xvar4_Vrth=xvar4_xvar1*xvar1_Vrth; - PCatT=psiin+2.0*Vtv*xvar4; - PCatT_psiin=1.0; - PCatT_Vtv=2.0*xvar4; - PCatT_xvar4=2.0*Vtv; - PCatT_Vrth=PCatT_psiin*psiin_Vrth; - PCatT_Vrth=PCatT_Vrth+PCatT_Vtv*Vtv_Vrth; - PCatT_Vrth=PCatT_Vrth+PCatT_xvar4*xvar4_Vrth; - xvar2=0.5*p[28]*rT/Vtv; - xvar2_rT=0.5*p[28]/Vtv; - xvar2_Vtv=-0.5*p[28]*rT/(Vtv*Vtv); - xvar2_Vrth=xvar2_rT*rT_Vrth; - xvar2_Vrth=xvar2_Vrth+xvar2_Vtv*Vtv_Vrth; - xvar3=exp(xvar2); - xvar3_xvar2=xvar3; - xvar3_Vrth=xvar3_xvar2*xvar2_Vrth; - xvar4=-0.5*p[28]*rT/Vtv; - xvar4_rT=-0.5*p[28]/Vtv; - xvar4_Vtv=0.5*p[28]*rT/(Vtv*Vtv); - xvar4_Vrth=xvar4_rT*rT_Vrth; - xvar4_Vrth=xvar4_Vrth+xvar4_Vtv*Vtv_Vrth; - xvar5=exp(xvar4); - xvar5_xvar4=xvar5; - xvar5_Vrth=xvar5_xvar4*xvar4_Vrth; - xvar1=xvar3-xvar5; - xvar1_xvar3=1.0; - xvar1_xvar5=-1.0; - xvar1_Vrth=xvar1_xvar3*xvar3_Vrth; - xvar1_Vrth=xvar1_Vrth+xvar1_xvar5*xvar5_Vrth; - xvar6=log(xvar1); - xvar6_xvar1=1.0/xvar1; - xvar6_Vrth=xvar6_xvar1*xvar1_Vrth; - psiio=2.0*(Vtv/rT)*xvar6; - psiio_Vtv=2.0*xvar6/rT; - psiio_rT=-2.0*Vtv*xvar6/(rT*rT); - psiio_xvar6=2.0*Vtv/rT; - psiio_Vrth=psiio_Vtv*Vtv_Vrth; - psiio_Vrth=psiio_Vrth+psiio_rT*rT_Vrth; - psiio_Vrth=psiio_Vrth+psiio_xvar6*xvar6_Vrth; - xvar1=log(rT); - xvar1_rT=1.0/rT; - xvar1_Vrth=xvar1_rT*rT_Vrth; - psiin=psiio*rT-3.0*Vtv*xvar1-p[74]*(rT-1.0); - psiin_psiio=rT; - psiin_rT=psiio-p[74]; - psiin_Vtv=-3.0*xvar1; - psiin_xvar1=-3.0*Vtv; - psiin_Vrth=psiin_psiio*psiio_Vrth; - psiin_Vrth=psiin_Vrth+psiin_rT*rT_Vrth; - psiin_Vrth=psiin_Vrth+psiin_Vtv*Vtv_Vrth; - psiin_Vrth=psiin_Vrth+psiin_xvar1*xvar1_Vrth; - xvar2=-psiin/Vtv; - xvar2_psiin=-1.0/Vtv; - xvar2_Vtv=psiin/(Vtv*Vtv); - xvar2_Vrth=xvar2_psiin*psiin_Vrth; - xvar2_Vrth=xvar2_Vrth+xvar2_Vtv*Vtv_Vrth; - xvar3=exp(xvar2); - xvar3_xvar2=xvar3; - xvar3_Vrth=xvar3_xvar2*xvar2_Vrth; - xvar1=0.5*(1.0+sqrt(1.0+4.0*xvar3)); - xvar1_xvar3=1.0/sqrt(4.0*xvar3+1.0); - xvar1_Vrth=xvar1_xvar3*xvar3_Vrth; - xvar4=log(xvar1); - xvar4_xvar1=1.0/xvar1; - xvar4_Vrth=xvar4_xvar1*xvar1_Vrth; - PSatT=psiin+2.0*Vtv*xvar4; - PSatT_psiin=1.0; - PSatT_Vtv=2.0*xvar4; - PSatT_xvar4=2.0*Vtv; - PSatT_Vrth=PSatT_psiin*psiin_Vrth; - PSatT_Vrth=PSatT_Vrth+PSatT_Vtv*Vtv_Vrth; - PSatT_Vrth=PSatT_Vrth+PSatT_xvar4*xvar4_Vrth; - xvar1=p[17]/PEatT; - xvar1_PEatT=-p[17]/(PEatT*PEatT); - xvar1_Vrth=xvar1_PEatT*PEatT_Vrth; - xvar2=pow(xvar1,p[18]); - xvar2_xvar1=xvar2*p[18]/xvar1; - xvar2_Vrth=xvar2_xvar1*xvar1_Vrth; - CJEatT=p[16]*xvar2; - CJEatT_xvar2=p[16]; - CJEatT_Vrth=CJEatT_xvar2*xvar2_Vrth; - xvar1=p[24]/PCatT; - xvar1_PCatT=-p[24]/(PCatT*PCatT); - xvar1_Vrth=xvar1_PCatT*PCatT_Vrth; - xvar2=pow(xvar1,p[25]); - xvar2_xvar1=xvar2*p[25]/xvar1; - xvar2_Vrth=xvar2_xvar1*xvar1_Vrth; - CJCatT=p[21]*xvar2; - CJCatT_xvar2=p[21]; - CJCatT_Vrth=CJCatT_xvar2*xvar2_Vrth; - xvar1=p[24]/PCatT; - xvar1_PCatT=-p[24]/(PCatT*PCatT); - xvar1_Vrth=xvar1_PCatT*PCatT_Vrth; - xvar2=pow(xvar1,p[25]); - xvar2_xvar1=xvar2*p[25]/xvar1; - xvar2_Vrth=xvar2_xvar1*xvar1_Vrth; - CJEPatT=p[23]*xvar2; - CJEPatT_xvar2=p[23]; - CJEPatT_Vrth=CJEPatT_xvar2*xvar2_Vrth; - xvar1=p[28]/PSatT; - xvar1_PSatT=-p[28]/(PSatT*PSatT); - xvar1_Vrth=xvar1_PSatT*PSatT_Vrth; - xvar2=pow(xvar1,p[29]); - xvar2_xvar1=xvar2*p[29]/xvar1; - xvar2_Vrth=xvar2_xvar1*xvar1_Vrth; - CJCPatT=p[27]*xvar2; - CJCPatT_xvar2=p[27]; - CJCPatT_Vrth=CJCPatT_xvar2*xvar2_Vrth; - xvar1=pow(rT,p[78]); - xvar1_rT=xvar1*p[78]/rT; - xvar1_Vrth=xvar1_rT*rT_Vrth; - xvar2=-p[71]*(1.0-rT)/Vtv; - xvar2_rT=p[71]/Vtv; - xvar2_Vtv=p[71]*(1.0-rT)/(Vtv*Vtv); - xvar2_Vrth=xvar2_rT*rT_Vrth; - xvar2_Vrth=xvar2_Vrth+xvar2_Vtv*Vtv_Vrth; - xvar3=exp(xvar2); - xvar3_xvar2=xvar3; - xvar3_Vrth=xvar3_xvar2*xvar2_Vrth; - GAMMatT=p[4]*xvar1*xvar3; - GAMMatT_xvar1=p[4]*xvar3; - GAMMatT_xvar3=p[4]*xvar1; - GAMMatT_Vrth=GAMMatT_xvar1*xvar1_Vrth; - GAMMatT_Vrth=GAMMatT_Vrth+GAMMatT_xvar3*xvar3_Vrth; - xvar1=pow(rT,p[70]); - xvar1_rT=xvar1*p[70]/rT; - xvar1_Vrth=xvar1_rT*rT_Vrth; - VOatT=p[3]*xvar1; - VOatT_xvar1=p[3]; - VOatT_Vrth=VOatT_xvar1*xvar1_Vrth; - xvar1=-VBBEatT/(NBBEatT*Vtv); - xvar1_VBBEatT=-1.0/(NBBEatT*Vtv); - xvar1_NBBEatT=VBBEatT/((NBBEatT*NBBEatT)*Vtv); - xvar1_Vtv=VBBEatT/(NBBEatT*(Vtv*Vtv)); - xvar1_Vrth=xvar1_VBBEatT*VBBEatT_Vrth; - xvar1_Vrth=xvar1_Vrth+xvar1_NBBEatT*NBBEatT_Vrth; - xvar1_Vrth=xvar1_Vrth+xvar1_Vtv*Vtv_Vrth; - EBBEatT=exp(xvar1); - EBBEatT_xvar1=EBBEatT; - EBBEatT_Vrth=EBBEatT_xvar1*xvar1_Vrth; - if(p[51]>0.0){ - IVEF=1.0/p[51]; - }else{ - IVEF=0.0; - } - if(p[52]>0.0){ - IVER=1.0/p[52]; - }else{ - IVER=0.0; - } - if(p[53]>0.0){ - IIKF=1.0/IKFatT; - IIKF_IKFatT=-1.0/(IKFatT*IKFatT); - IIKF_Vrth=IIKF_IKFatT*IKFatT_Vrth; - }else{ - IIKF=0.0; - IIKF_Vrth=0.0; - } - if(p[54]>0.0){ - IIKR=1.0/p[54]; - }else{ - IIKR=0.0; - } - if(p[55]>0.0){ - IIKP=1.0/p[55]; - }else{ - IIKP=0.0; - } - if(p[3]>0.0){ - IVO=1.0/VOatT; - IVO_VOatT=-1.0/(VOatT*VOatT); - IVO_Vrth=IVO_VOatT*VOatT_Vrth; - }else{ - IVO=0.0; - IVO_Vrth=0.0; - } - if(p[5]>0.0){ - IHRCF=1.0/p[5]; - }else{ - IHRCF=0.0; - } - if(p[59]>0.0){ - IVTF=1.0/p[59]; - }else{ - IVTF=0.0; - } - if(p[60]>0.0){ - IITF=1.0/p[60]; - }else{ - IITF=0.0; - } - if(p[60]>0.0){ - slTF=0.0; - }else{ - slTF=1.0; - } - dv0=-PEatT*p[14]; - dv0_PEatT=-p[14]; - dv0_Vrth=dv0_PEatT*PEatT_Vrth; - if(p[19]<=0.0){ - dvh=(*Vbei)+dv0; - dvh_Vbei=1.0; - dvh_dv0=1.0; - dvh_Vrth=dvh_dv0*dv0_Vrth; - if(dvh>0.0){ - xvar1=(1.0-p[14]); - xvar2=(-1.0-p[18]); - pwq=pow(xvar1,xvar2); - qlo=PEatT*(1.0-pwq*(1.0-p[14])*(1.0-p[14]))/(1.0-p[18]); - qlo_PEatT=(1.0-((1.0-p[14])*(1.0-p[14]))*pwq)/(1.0-p[18]); - qlo_Vbei=0.0; - qlo_Vrth=qlo_PEatT*PEatT_Vrth; - qhi=dvh*(1.0-p[14]+0.5*p[18]*dvh/PEatT)*pwq; - qhi_dvh=(0.5*dvh*p[18]/PEatT-p[14]+1.0)*pwq+0.5*dvh*p[18]*pwq/PEatT; - qhi_PEatT=-0.5*(dvh*dvh)*p[18]*pwq/(PEatT*PEatT); - qhi_Vbei=qhi_dvh*dvh_Vbei; - qhi_Vrth=qhi_dvh*dvh_Vrth; - qhi_Vrth=qhi_Vrth+qhi_PEatT*PEatT_Vrth; - }else{ - xvar1=(1.0-(*Vbei)/PEatT); - xvar1_Vbei=-1.0/PEatT; - xvar1_PEatT=(*Vbei)/(PEatT*PEatT); - xvar1_Vrth=xvar1_PEatT*PEatT_Vrth; - xvar2=(1.0-p[18]); - xvar3=pow(xvar1,xvar2); - xvar3_xvar1=xvar3*xvar2/xvar1; - xvar3_Vbei=xvar3_xvar1*xvar1_Vbei; - xvar3_Vrth=xvar3_xvar1*xvar1_Vrth; - qlo=PEatT*(1.0-xvar3)/(1.0-p[18]); - qlo_PEatT=(1.0-xvar3)/(1.0-p[18]); - qlo_xvar3=-PEatT/(1.0-p[18]); - qlo_Vrth=qlo_PEatT*PEatT_Vrth; - qlo_Vbei=qlo_xvar3*xvar3_Vbei; - qlo_Vrth=qlo_Vrth+qlo_xvar3*xvar3_Vrth; - qhi=0.0; - qhi_Vbei=0.0; - qhi_Vrth=0.0; - } - qdbe=qlo+qhi; - qdbe_qlo=1.0; - qdbe_qhi=1.0; - qdbe_Vrth=qdbe_qlo*qlo_Vrth; - qdbe_Vbei=qdbe_qlo*qlo_Vbei; - qdbe_Vbei=qdbe_Vbei+qdbe_qhi*qhi_Vbei; - qdbe_Vrth=qdbe_Vrth+qdbe_qhi*qhi_Vrth; - }else{ - mv0=sqrt(dv0*dv0+4.0*p[19]*p[19]); - mv0_dv0=dv0/sqrt((dv0*dv0)+4.0*(p[19]*p[19])); - mv0_Vrth=mv0_dv0*dv0_Vrth; - vl0=-0.5*(dv0+mv0); - vl0_dv0=-0.5; - vl0_mv0=-0.5; - vl0_Vrth=vl0_dv0*dv0_Vrth; - vl0_Vrth=vl0_Vrth+vl0_mv0*mv0_Vrth; - xvar1=(1.0-vl0/PEatT); - xvar1_vl0=-1.0/PEatT; - xvar1_PEatT=vl0/(PEatT*PEatT); - xvar1_Vrth=xvar1_vl0*vl0_Vrth; - xvar1_Vrth=xvar1_Vrth+xvar1_PEatT*PEatT_Vrth; - xvar2=(1.0-p[18]); - xvar3=pow(xvar1,xvar2); - xvar3_xvar1=xvar3*xvar2/xvar1; - xvar3_Vrth=xvar3_xvar1*xvar1_Vrth; - q0=-PEatT*xvar3/(1.0-p[18]); - q0_PEatT=-xvar3/(1.0-p[18]); - q0_xvar3=-PEatT/(1.0-p[18]); - q0_Vrth=q0_PEatT*PEatT_Vrth; - q0_Vrth=q0_Vrth+q0_xvar3*xvar3_Vrth; - dv=(*Vbei)+dv0; - dv_Vbei=1.0; - dv_dv0=1.0; - dv_Vrth=dv_dv0*dv0_Vrth; - mv=sqrt(dv*dv+4.0*p[19]*p[19]); - mv_dv=dv/sqrt((dv*dv)+4.0*(p[19]*p[19])); - mv_Vbei=mv_dv*dv_Vbei; - mv_Vrth=mv_dv*dv_Vrth; - vl=0.5*(dv-mv)-dv0; - vl_dv=0.5; - vl_mv=-0.5; - vl_dv0=-1.0; - vl_Vbei=vl_dv*dv_Vbei; - vl_Vrth=vl_dv*dv_Vrth; - vl_Vbei=vl_Vbei+vl_mv*mv_Vbei; - vl_Vrth=vl_Vrth+vl_mv*mv_Vrth; - vl_Vrth=vl_Vrth+vl_dv0*dv0_Vrth; - xvar1=(1.0-vl/PEatT); - xvar1_vl=-1.0/PEatT; - xvar1_PEatT=vl/(PEatT*PEatT); - xvar1_Vbei=xvar1_vl*vl_Vbei; - xvar1_Vrth=xvar1_vl*vl_Vrth; - xvar1_Vrth=xvar1_Vrth+xvar1_PEatT*PEatT_Vrth; - xvar2=(1.0-p[18]); - xvar3=pow(xvar1,xvar2); - xvar3_xvar1=xvar3*xvar2/xvar1; - xvar3_Vbei=xvar3_xvar1*xvar1_Vbei; - xvar3_Vrth=xvar3_xvar1*xvar1_Vrth; - qlo=-PEatT*xvar3/(1.0-p[18]); - qlo_PEatT=-xvar3/(1.0-p[18]); - qlo_xvar3=-PEatT/(1.0-p[18]); - qlo_Vrth=qlo_PEatT*PEatT_Vrth; - qlo_Vbei=qlo_xvar3*xvar3_Vbei; - qlo_Vrth=qlo_Vrth+qlo_xvar3*xvar3_Vrth; - xvar1=(1.0-p[14]); - xvar2=(-p[18]); - xvar3=pow(xvar1,xvar2); - qdbe=qlo+xvar3*((*Vbei)-vl+vl0)-q0; - qdbe_qlo=1.0; - qdbe_Vbei=xvar3; - qdbe_vl=-xvar3; - qdbe_vl0=xvar3; - qdbe_q0=-1.0; - qdbe_Vrth=qdbe_qlo*qlo_Vrth; - qdbe_Vbei=qdbe_Vbei+qdbe_qlo*qlo_Vbei; - qdbe_Vbei=qdbe_Vbei+qdbe_vl*vl_Vbei; - qdbe_Vrth=qdbe_Vrth+qdbe_vl*vl_Vrth; - qdbe_Vrth=qdbe_Vrth+qdbe_vl0*vl0_Vrth; - qdbe_Vrth=qdbe_Vrth+qdbe_q0*q0_Vrth; - } - dv0=-PEatT*p[14]; - dv0_PEatT=-p[14]; - dv0_Vrth=dv0_PEatT*PEatT_Vrth; - if(p[19]<=0.0){ - dvh=(*Vbex)+dv0; - dvh_Vbex=1.0; - dvh_dv0=1.0; - dvh_Vrth=dvh_dv0*dv0_Vrth; - if(dvh>0.0){ - xvar1=(1.0-p[14]); - xvar2=(-1.0-p[18]); - pwq=pow(xvar1,xvar2); - qlo=PEatT*(1.0-pwq*(1.0-p[14])*(1.0-p[14]))/(1.0-p[18]); - qlo_PEatT=(1.0-((1.0-p[14])*(1.0-p[14]))*pwq)/(1.0-p[18]); - qlo_Vbex=0.0; - qlo_Vrth=qlo_PEatT*PEatT_Vrth; - qhi=dvh*(1.0-p[14]+0.5*p[18]*dvh/PEatT)*pwq; - qhi_dvh=(0.5*dvh*p[18]/PEatT-p[14]+1.0)*pwq+0.5*dvh*p[18]*pwq/PEatT; - qhi_PEatT=-0.5*(dvh*dvh)*p[18]*pwq/(PEatT*PEatT); - qhi_Vbex=qhi_dvh*dvh_Vbex; - qhi_Vrth=qhi_dvh*dvh_Vrth; - qhi_Vrth=qhi_Vrth+qhi_PEatT*PEatT_Vrth; - }else{ - xvar1=(1.0-(*Vbex)/PEatT); - xvar1_Vbex=-1.0/PEatT; - xvar1_PEatT=(*Vbex)/(PEatT*PEatT); - xvar1_Vrth=xvar1_PEatT*PEatT_Vrth; - xvar2=(1.0-p[18]); - xvar3=pow(xvar1,xvar2); - xvar3_xvar1=xvar3*xvar2/xvar1; - xvar3_Vbex=xvar3_xvar1*xvar1_Vbex; - xvar3_Vrth=xvar3_xvar1*xvar1_Vrth; - qlo=PEatT*(1.0-xvar3)/(1.0-p[18]); - qlo_PEatT=(1.0-xvar3)/(1.0-p[18]); - qlo_xvar3=-PEatT/(1.0-p[18]); - qlo_Vrth=qlo_PEatT*PEatT_Vrth; - qlo_Vbex=qlo_xvar3*xvar3_Vbex; - qlo_Vrth=qlo_Vrth+qlo_xvar3*xvar3_Vrth; - qhi=0.0; - qhi_Vbex=0.0; - qhi_Vrth=0.0; - } - qdbex=qlo+qhi; - qdbex_qlo=1.0; - qdbex_qhi=1.0; - qdbex_Vrth=qdbex_qlo*qlo_Vrth; - qdbex_Vbex=qdbex_qlo*qlo_Vbex; - qdbex_Vbex=qdbex_Vbex+qdbex_qhi*qhi_Vbex; - qdbex_Vrth=qdbex_Vrth+qdbex_qhi*qhi_Vrth; - }else{ - mv0=sqrt(dv0*dv0+4.0*p[19]*p[19]); - mv0_dv0=dv0/sqrt((dv0*dv0)+4.0*(p[19]*p[19])); - mv0_Vrth=mv0_dv0*dv0_Vrth; - vl0=-0.5*(dv0+mv0); - vl0_dv0=-0.5; - vl0_mv0=-0.5; - vl0_Vrth=vl0_dv0*dv0_Vrth; - vl0_Vrth=vl0_Vrth+vl0_mv0*mv0_Vrth; - xvar1=(1.0-vl0/PEatT); - xvar1_vl0=-1.0/PEatT; - xvar1_PEatT=vl0/(PEatT*PEatT); - xvar1_Vrth=xvar1_vl0*vl0_Vrth; - xvar1_Vrth=xvar1_Vrth+xvar1_PEatT*PEatT_Vrth; - xvar2=(1.0-p[18]); - xvar3=pow(xvar1,xvar2); - xvar3_xvar1=xvar3*xvar2/xvar1; - xvar3_Vrth=xvar3_xvar1*xvar1_Vrth; - q0=-PEatT*xvar3/(1.0-p[18]); - q0_PEatT=-xvar3/(1.0-p[18]); - q0_xvar3=-PEatT/(1.0-p[18]); - q0_Vrth=q0_PEatT*PEatT_Vrth; - q0_Vrth=q0_Vrth+q0_xvar3*xvar3_Vrth; - dv=(*Vbex)+dv0; - dv_Vbex=1.0; - dv_dv0=1.0; - dv_Vrth=dv_dv0*dv0_Vrth; - mv=sqrt(dv*dv+4.0*p[19]*p[19]); - mv_dv=dv/sqrt((dv*dv)+4.0*(p[19]*p[19])); - mv_Vbex=mv_dv*dv_Vbex; - mv_Vrth=mv_dv*dv_Vrth; - vl=0.5*(dv-mv)-dv0; - vl_dv=0.5; - vl_mv=-0.5; - vl_dv0=-1.0; - vl_Vbex=vl_dv*dv_Vbex; - vl_Vrth=vl_dv*dv_Vrth; - vl_Vbex=vl_Vbex+vl_mv*mv_Vbex; - vl_Vrth=vl_Vrth+vl_mv*mv_Vrth; - vl_Vrth=vl_Vrth+vl_dv0*dv0_Vrth; - xvar1=(1.0-vl/PEatT); - xvar1_vl=-1.0/PEatT; - xvar1_PEatT=vl/(PEatT*PEatT); - xvar1_Vbex=xvar1_vl*vl_Vbex; - xvar1_Vrth=xvar1_vl*vl_Vrth; - xvar1_Vrth=xvar1_Vrth+xvar1_PEatT*PEatT_Vrth; - xvar2=(1.0-p[18]); - xvar3=pow(xvar1,xvar2); - xvar3_xvar1=xvar3*xvar2/xvar1; - xvar3_Vbex=xvar3_xvar1*xvar1_Vbex; - xvar3_Vrth=xvar3_xvar1*xvar1_Vrth; - qlo=-PEatT*xvar3/(1.0-p[18]); - qlo_PEatT=-xvar3/(1.0-p[18]); - qlo_xvar3=-PEatT/(1.0-p[18]); - qlo_Vrth=qlo_PEatT*PEatT_Vrth; - qlo_Vbex=qlo_xvar3*xvar3_Vbex; - qlo_Vrth=qlo_Vrth+qlo_xvar3*xvar3_Vrth; - xvar1=(1.0-p[14]); - xvar2=(-p[18]); - xvar3=pow(xvar1,xvar2); - qdbex=qlo+xvar3*((*Vbex)-vl+vl0)-q0; - qdbex_qlo=1.0; - qdbex_Vbex=xvar3; - qdbex_vl=-xvar3; - qdbex_vl0=xvar3; - qdbex_q0=-1.0; - qdbex_Vrth=qdbex_qlo*qlo_Vrth; - qdbex_Vbex=qdbex_Vbex+qdbex_qlo*qlo_Vbex; - qdbex_Vbex=qdbex_Vbex+qdbex_vl*vl_Vbex; - qdbex_Vrth=qdbex_Vrth+qdbex_vl*vl_Vrth; - qdbex_Vrth=qdbex_Vrth+qdbex_vl0*vl0_Vrth; - qdbex_Vrth=qdbex_Vrth+qdbex_q0*q0_Vrth; - } - dv0=-PCatT*p[14]; - dv0_PCatT=-p[14]; - dv0_Vrth=dv0_PCatT*PCatT_Vrth; - if(p[26]<=0.0){ - dvh=(*Vbci)+dv0; - dvh_Vbci=1.0; - dvh_dv0=1.0; - dvh_Vrth=dvh_dv0*dv0_Vrth; - if(dvh>0.0){ - xvar1=(1.0-p[14]); - xvar2=(-1.0-p[25]); - pwq=pow(xvar1,xvar2); - qlo=PCatT*(1.0-pwq*(1.0-p[14])*(1.0-p[14]))/(1.0-p[25]); - qlo_PCatT=(1.0-((1.0-p[14])*(1.0-p[14]))*pwq)/(1.0-p[25]); - qlo_Vbci=0.0; - qlo_Vrth=qlo_PCatT*PCatT_Vrth; - qhi=dvh*(1.0-p[14]+0.5*p[25]*dvh/PCatT)*pwq; - qhi_dvh=(0.5*dvh*p[25]/PCatT-p[14]+1.0)*pwq+0.5*dvh*p[25]*pwq/PCatT; - qhi_PCatT=-0.5*(dvh*dvh)*p[25]*pwq/(PCatT*PCatT); - qhi_Vbci=qhi_dvh*dvh_Vbci; - qhi_Vrth=qhi_dvh*dvh_Vrth; - qhi_Vrth=qhi_Vrth+qhi_PCatT*PCatT_Vrth; - }else{ - if((p[85]>0.0)&&((*Vbci)<-p[85])){ - xvar1=(1.0+p[85]/PCatT); - xvar1_PCatT=-p[85]/(PCatT*PCatT); - xvar1_Vrth=xvar1_PCatT*PCatT_Vrth; - xvar2=(1.0-p[25]); - xvar3=pow(xvar1,xvar2); - xvar3_xvar1=xvar3*xvar2/xvar1; - xvar3_Vrth=xvar3_xvar1*xvar1_Vrth; - qlo=PCatT*(1.0-xvar3*(1.0-((1.0-p[25])*((*Vbci)+p[85]))/(PCatT+p[85])))/(1.0-p[25]); - qlo_PCatT=(1.0-(1.0-(1.0-p[25])*(p[85]+(*Vbci))/(p[85]+PCatT))*xvar3)/(1.0-p[25])-PCatT*(p[85]+(*Vbci))*xvar3/((p[85]+PCatT)*(p[85]+PCatT)); - qlo_xvar3=PCatT*((1.0-p[25])*(p[85]+(*Vbci))/(p[85]+PCatT)-1.0)/(1.0-p[25]); - qlo_Vbci=PCatT*xvar3/(p[85]+PCatT); - qlo_Vrth=qlo_PCatT*PCatT_Vrth; - qlo_Vrth=qlo_Vrth+qlo_xvar3*xvar3_Vrth; - }else{ - xvar1=(1.0-(*Vbci)/PCatT); - xvar1_Vbci=-1.0/PCatT; - xvar1_PCatT=(*Vbci)/(PCatT*PCatT); - xvar1_Vrth=xvar1_PCatT*PCatT_Vrth; - xvar2=(1.0-p[25]); - xvar3=pow(xvar1,xvar2); - xvar3_xvar1=xvar3*xvar2/xvar1; - xvar3_Vbci=xvar3_xvar1*xvar1_Vbci; - xvar3_Vrth=xvar3_xvar1*xvar1_Vrth; - qlo=PCatT*(1.0-xvar3)/(1.0-p[25]); - qlo_PCatT=(1.0-xvar3)/(1.0-p[25]); - qlo_xvar3=-PCatT/(1.0-p[25]); - qlo_Vrth=qlo_PCatT*PCatT_Vrth; - qlo_Vbci=qlo_xvar3*xvar3_Vbci; - qlo_Vrth=qlo_Vrth+qlo_xvar3*xvar3_Vrth; - } - qhi=0.0; - qhi_Vbci=0.0; - qhi_Vrth=0.0; - } - qdbc=qlo+qhi; - qdbc_qlo=1.0; - qdbc_qhi=1.0; - qdbc_Vrth=qdbc_qlo*qlo_Vrth; - qdbc_Vbci=qdbc_qlo*qlo_Vbci; - qdbc_Vbci=qdbc_Vbci+qdbc_qhi*qhi_Vbci; - qdbc_Vrth=qdbc_Vrth+qdbc_qhi*qhi_Vrth; - }else{ - if((p[85]>0.0)&&(p[86]>0.0)){ - vn0=(p[85]+dv0)/(p[85]-dv0); - vn0_dv0=(p[85]+dv0)/((p[85]-dv0)*(p[85]-dv0))+1.0/(p[85]-dv0); - vn0_Vrth=vn0_dv0*dv0_Vrth; - vnl0=2.0*vn0/(sqrt((vn0-1.0)*(vn0-1.0)+4.0*p[26]*p[26])+sqrt((vn0+1.0)*(vn0+1.0)+4.0*p[86]*p[86])); - vnl0_vn0=2.0/(sqrt(((vn0+1.0)*(vn0+1.0))+4.0*(p[86]*p[86]))+sqrt(((vn0-1.0)*(vn0-1.0))+4.0*(p[26]*p[26])))-2.0*vn0*((vn0+1.0)/sqrt(((vn0+1.0)*(vn0+1.0))+4.0*(p[86]*p[86]))+(vn0-1.0)/sqrt(((vn0-1.0)*(vn0-1.0))+4.0*(p[26]*p[26])))/((sqrt(((vn0+1.0)*(vn0+1.0))+4.0*(p[86]*p[86]))+sqrt(((vn0-1.0)*(vn0-1.0))+4.0*(p[26]*p[26])))*(sqrt(((vn0+1.0)*(vn0+1.0))+4.0*(p[86]*p[86]))+sqrt(((vn0-1.0)*(vn0-1.0))+4.0*(p[26]*p[26])))); - vnl0_Vrth=vnl0_vn0*vn0_Vrth; - vl0=0.5*(vnl0*(p[85]-dv0)-p[85]-dv0); - vl0_vnl0=0.5*(p[85]-dv0); - vl0_dv0=0.5*(-vnl0-1.0); - vl0_Vrth=vl0_vnl0*vnl0_Vrth; - vl0_Vrth=vl0_Vrth+vl0_dv0*dv0_Vrth; - xvar1=(1.0-vl0/PCatT); - xvar1_vl0=-1.0/PCatT; - xvar1_PCatT=vl0/(PCatT*PCatT); - xvar1_Vrth=xvar1_vl0*vl0_Vrth; - xvar1_Vrth=xvar1_Vrth+xvar1_PCatT*PCatT_Vrth; - xvar2=(1.0-p[25]); - xvar3=pow(xvar1,xvar2); - xvar3_xvar1=xvar3*xvar2/xvar1; - xvar3_Vrth=xvar3_xvar1*xvar1_Vrth; - qlo0=PCatT*(1.0-xvar3)/(1.0-p[25]); - qlo0_PCatT=(1.0-xvar3)/(1.0-p[25]); - qlo0_xvar3=-PCatT/(1.0-p[25]); - qlo0_Vrth=qlo0_PCatT*PCatT_Vrth; - qlo0_Vrth=qlo0_Vrth+qlo0_xvar3*xvar3_Vrth; - vn=(2.0*(*Vbci)+p[85]+dv0)/(p[85]-dv0); - vn_Vbci=2.0/(p[85]-dv0); - vn_dv0=(p[85]+2.0*(*Vbci)+dv0)/((p[85]-dv0)*(p[85]-dv0))+1.0/(p[85]-dv0); - vn_Vrth=vn_dv0*dv0_Vrth; - vnl=2.0*vn/(sqrt((vn-1.0)*(vn-1.0)+4.0*p[26]*p[26])+sqrt((vn+1.0)*(vn+1.0)+4.0*p[86]*p[86])); - vnl_vn=2.0/(sqrt(((vn+1.0)*(vn+1.0))+4.0*(p[86]*p[86]))+sqrt(((vn-1.0)*(vn-1.0))+4.0*(p[26]*p[26])))-2.0*vn*((vn+1.0)/sqrt(((vn+1.0)*(vn+1.0))+4.0*(p[86]*p[86]))+(vn-1.0)/sqrt(((vn-1.0)*(vn-1.0))+4.0*(p[26]*p[26])))/((sqrt(((vn+1.0)*(vn+1.0))+4.0*(p[86]*p[86]))+sqrt(((vn-1.0)*(vn-1.0))+4.0*(p[26]*p[26])))*(sqrt(((vn+1.0)*(vn+1.0))+4.0*(p[86]*p[86]))+sqrt(((vn-1.0)*(vn-1.0))+4.0*(p[26]*p[26])))); - vnl_Vbci=vnl_vn*vn_Vbci; - vnl_Vrth=vnl_vn*vn_Vrth; - vl=0.5*(vnl*(p[85]-dv0)-p[85]-dv0); - vl_vnl=0.5*(p[85]-dv0); - vl_dv0=0.5*(-vnl-1.0); - vl_Vbci=vl_vnl*vnl_Vbci; - vl_Vrth=vl_vnl*vnl_Vrth; - vl_Vrth=vl_Vrth+vl_dv0*dv0_Vrth; - xvar1=(1.0-vl/PCatT); - xvar1_vl=-1.0/PCatT; - xvar1_PCatT=vl/(PCatT*PCatT); - xvar1_Vbci=xvar1_vl*vl_Vbci; - xvar1_Vrth=xvar1_vl*vl_Vrth; - xvar1_Vrth=xvar1_Vrth+xvar1_PCatT*PCatT_Vrth; - xvar2=(1.0-p[25]); - xvar3=pow(xvar1,xvar2); - xvar3_xvar1=xvar3*xvar2/xvar1; - xvar3_Vbci=xvar3_xvar1*xvar1_Vbci; - xvar3_Vrth=xvar3_xvar1*xvar1_Vrth; - qlo=PCatT*(1.0-xvar3)/(1.0-p[25]); - qlo_PCatT=(1.0-xvar3)/(1.0-p[25]); - qlo_xvar3=-PCatT/(1.0-p[25]); - qlo_Vrth=qlo_PCatT*PCatT_Vrth; - qlo_Vbci=qlo_xvar3*xvar3_Vbci; - qlo_Vrth=qlo_Vrth+qlo_xvar3*xvar3_Vrth; - sel=0.5*(vnl+1.0); - sel_vnl=0.5; - sel_Vbci=sel_vnl*vnl_Vbci; - sel_Vrth=sel_vnl*vnl_Vrth; - xvar1=(1.0+p[85]/PCatT); - xvar1_PCatT=-p[85]/(PCatT*PCatT); - xvar1_Vrth=xvar1_PCatT*PCatT_Vrth; - xvar2=(-p[25]); - crt=pow(xvar1,xvar2); - crt_xvar1=crt*xvar2/xvar1; - crt_Vrth=crt_xvar1*xvar1_Vrth; - xvar1=(1.0+dv0/PCatT); - xvar1_dv0=1.0/PCatT; - xvar1_PCatT=-dv0/(PCatT*PCatT); - xvar1_Vrth=xvar1_dv0*dv0_Vrth; - xvar1_Vrth=xvar1_Vrth+xvar1_PCatT*PCatT_Vrth; - xvar2=(-p[25]); - cmx=pow(xvar1,xvar2); - cmx_xvar1=cmx*xvar2/xvar1; - cmx_Vrth=cmx_xvar1*xvar1_Vrth; - cl=(1.0-sel)*crt+sel*cmx; - cl_sel=cmx-crt; - cl_crt=1.0-sel; - cl_cmx=sel; - cl_Vbci=cl_sel*sel_Vbci; - cl_Vrth=cl_sel*sel_Vrth; - cl_Vrth=cl_Vrth+cl_crt*crt_Vrth; - cl_Vrth=cl_Vrth+cl_cmx*cmx_Vrth; - ql=((*Vbci)-vl+vl0)*cl; - ql_Vbci=cl; - ql_vl=-cl; - ql_vl0=cl; - ql_cl=vl0-vl+(*Vbci); - ql_Vbci=ql_Vbci+ql_vl*vl_Vbci; - ql_Vrth=ql_vl*vl_Vrth; - ql_Vrth=ql_Vrth+ql_vl0*vl0_Vrth; - ql_Vbci=ql_Vbci+ql_cl*cl_Vbci; - ql_Vrth=ql_Vrth+ql_cl*cl_Vrth; - qdbc=ql+qlo-qlo0; - qdbc_ql=1.0; - qdbc_qlo=1.0; - qdbc_qlo0=-1.0; - qdbc_Vbci=qdbc_ql*ql_Vbci; - qdbc_Vrth=qdbc_ql*ql_Vrth; - qdbc_Vrth=qdbc_Vrth+qdbc_qlo*qlo_Vrth; - qdbc_Vbci=qdbc_Vbci+qdbc_qlo*qlo_Vbci; - qdbc_Vrth=qdbc_Vrth+qdbc_qlo0*qlo0_Vrth; - }else{ - mv0=sqrt(dv0*dv0+4.0*p[26]*p[26]); - mv0_dv0=dv0/sqrt((dv0*dv0)+4.0*(p[26]*p[26])); - mv0_Vrth=mv0_dv0*dv0_Vrth; - vl0=-0.5*(dv0+mv0); - vl0_dv0=-0.5; - vl0_mv0=-0.5; - vl0_Vrth=vl0_dv0*dv0_Vrth; - vl0_Vrth=vl0_Vrth+vl0_mv0*mv0_Vrth; - xvar1=(1.0-vl0/PCatT); - xvar1_vl0=-1.0/PCatT; - xvar1_PCatT=vl0/(PCatT*PCatT); - xvar1_Vrth=xvar1_vl0*vl0_Vrth; - xvar1_Vrth=xvar1_Vrth+xvar1_PCatT*PCatT_Vrth; - xvar2=(1.0-p[25]); - xvar3=pow(xvar1,xvar2); - xvar3_xvar1=xvar3*xvar2/xvar1; - xvar3_Vrth=xvar3_xvar1*xvar1_Vrth; - q0=-PCatT*xvar3/(1.0-p[25]); - q0_PCatT=-xvar3/(1.0-p[25]); - q0_xvar3=-PCatT/(1.0-p[25]); - q0_Vrth=q0_PCatT*PCatT_Vrth; - q0_Vrth=q0_Vrth+q0_xvar3*xvar3_Vrth; - dv=(*Vbci)+dv0; - dv_Vbci=1.0; - dv_dv0=1.0; - dv_Vrth=dv_dv0*dv0_Vrth; - mv=sqrt(dv*dv+4.0*p[26]*p[26]); - mv_dv=dv/sqrt((dv*dv)+4.0*(p[26]*p[26])); - mv_Vbci=mv_dv*dv_Vbci; - mv_Vrth=mv_dv*dv_Vrth; - vl=0.5*(dv-mv)-dv0; - vl_dv=0.5; - vl_mv=-0.5; - vl_dv0=-1.0; - vl_Vbci=vl_dv*dv_Vbci; - vl_Vrth=vl_dv*dv_Vrth; - vl_Vbci=vl_Vbci+vl_mv*mv_Vbci; - vl_Vrth=vl_Vrth+vl_mv*mv_Vrth; - vl_Vrth=vl_Vrth+vl_dv0*dv0_Vrth; - xvar1=(1.0-vl/PCatT); - xvar1_vl=-1.0/PCatT; - xvar1_PCatT=vl/(PCatT*PCatT); - xvar1_Vbci=xvar1_vl*vl_Vbci; - xvar1_Vrth=xvar1_vl*vl_Vrth; - xvar1_Vrth=xvar1_Vrth+xvar1_PCatT*PCatT_Vrth; - xvar2=(1.0-p[25]); - xvar3=pow(xvar1,xvar2); - xvar3_xvar1=xvar3*xvar2/xvar1; - xvar3_Vbci=xvar3_xvar1*xvar1_Vbci; - xvar3_Vrth=xvar3_xvar1*xvar1_Vrth; - qlo=-PCatT*xvar3/(1.0-p[25]); - qlo_PCatT=-xvar3/(1.0-p[25]); - qlo_xvar3=-PCatT/(1.0-p[25]); - qlo_Vrth=qlo_PCatT*PCatT_Vrth; - qlo_Vbci=qlo_xvar3*xvar3_Vbci; - qlo_Vrth=qlo_Vrth+qlo_xvar3*xvar3_Vrth; - xvar1=(1.0-p[14]); - xvar2=(-p[25]); - xvar3=pow(xvar1,xvar2); - qdbc=qlo+xvar3*((*Vbci)-vl+vl0)-q0; - qdbc_qlo=1.0; - qdbc_Vbci=xvar3; - qdbc_vl=-xvar3; - qdbc_vl0=xvar3; - qdbc_q0=-1.0; - qdbc_Vrth=qdbc_qlo*qlo_Vrth; - qdbc_Vbci=qdbc_Vbci+qdbc_qlo*qlo_Vbci; - qdbc_Vbci=qdbc_Vbci+qdbc_vl*vl_Vbci; - qdbc_Vrth=qdbc_Vrth+qdbc_vl*vl_Vrth; - qdbc_Vrth=qdbc_Vrth+qdbc_vl0*vl0_Vrth; - qdbc_Vrth=qdbc_Vrth+qdbc_q0*q0_Vrth; - } - } - dv0=-PCatT*p[14]; - dv0_PCatT=-p[14]; - dv0_Vrth=dv0_PCatT*PCatT_Vrth; - if(p[26]<=0.0){ - dvh=(*Vbep)+dv0; - dvh_Vbep=1.0; - dvh_dv0=1.0; - dvh_Vrth=dvh_dv0*dv0_Vrth; - if(dvh>0.0){ - xvar1=(1.0-p[14]); - xvar2=(-1.0-p[25]); - pwq=pow(xvar1,xvar2); - qlo=PCatT*(1.0-pwq*(1.0-p[14])*(1.0-p[14]))/(1.0-p[25]); - qlo_PCatT=(1.0-((1.0-p[14])*(1.0-p[14]))*pwq)/(1.0-p[25]); - qlo_Vbep=0.0; - qlo_Vrth=qlo_PCatT*PCatT_Vrth; - qhi=dvh*(1.0-p[14]+0.5*p[25]*dvh/PCatT)*pwq; - qhi_dvh=(0.5*dvh*p[25]/PCatT-p[14]+1.0)*pwq+0.5*dvh*p[25]*pwq/PCatT; - qhi_PCatT=-0.5*(dvh*dvh)*p[25]*pwq/(PCatT*PCatT); - qhi_Vbep=qhi_dvh*dvh_Vbep; - qhi_Vrth=qhi_dvh*dvh_Vrth; - qhi_Vrth=qhi_Vrth+qhi_PCatT*PCatT_Vrth; - }else{ - if((p[85]>0.0)&&((*Vbep)<-p[85])){ - xvar1=(1.0+p[85]/PCatT); - xvar1_PCatT=-p[85]/(PCatT*PCatT); - xvar1_Vrth=xvar1_PCatT*PCatT_Vrth; - xvar2=(1.0-p[25]); - xvar3=pow(xvar1,xvar2); - xvar3_xvar1=xvar3*xvar2/xvar1; - xvar3_Vrth=xvar3_xvar1*xvar1_Vrth; - qlo=PCatT*(1.0-xvar3*(1.0-((1.0-p[25])*((*Vbep)+p[85]))/(PCatT+p[85])))/(1.0-p[25]); - qlo_PCatT=(1.0-(1.0-(1.0-p[25])*(p[85]+(*Vbep))/(p[85]+PCatT))*xvar3)/(1.0-p[25])-PCatT*(p[85]+(*Vbep))*xvar3/((p[85]+PCatT)*(p[85]+PCatT)); - qlo_xvar3=PCatT*((1.0-p[25])*(p[85]+(*Vbep))/(p[85]+PCatT)-1.0)/(1.0-p[25]); - qlo_Vbep=PCatT*xvar3/(p[85]+PCatT); - qlo_Vrth=qlo_PCatT*PCatT_Vrth; - qlo_Vrth=qlo_Vrth+qlo_xvar3*xvar3_Vrth; - }else{ - xvar1=(1.0-(*Vbep)/PCatT); - xvar1_Vbep=-1.0/PCatT; - xvar1_PCatT=(*Vbep)/(PCatT*PCatT); - xvar1_Vrth=xvar1_PCatT*PCatT_Vrth; - xvar2=(1.0-p[25]); - xvar3=pow(xvar1,xvar2); - xvar3_xvar1=xvar3*xvar2/xvar1; - xvar3_Vbep=xvar3_xvar1*xvar1_Vbep; - xvar3_Vrth=xvar3_xvar1*xvar1_Vrth; - qlo=PCatT*(1.0-xvar3)/(1.0-p[25]); - qlo_PCatT=(1.0-xvar3)/(1.0-p[25]); - qlo_xvar3=-PCatT/(1.0-p[25]); - qlo_Vrth=qlo_PCatT*PCatT_Vrth; - qlo_Vbep=qlo_xvar3*xvar3_Vbep; - qlo_Vrth=qlo_Vrth+qlo_xvar3*xvar3_Vrth; - } - qhi=0.0; - qhi_Vbep=0.0; - qhi_Vrth=0.0; - } - qdbep=qlo+qhi; - qdbep_qlo=1.0; - qdbep_qhi=1.0; - qdbep_Vrth=qdbep_qlo*qlo_Vrth; - qdbep_Vbep=qdbep_qlo*qlo_Vbep; - qdbep_Vbep=qdbep_Vbep+qdbep_qhi*qhi_Vbep; - qdbep_Vrth=qdbep_Vrth+qdbep_qhi*qhi_Vrth; - }else{ - if((p[85]>0.0)&&(p[86]>0.0)){ - vn0=(p[85]+dv0)/(p[85]-dv0); - vn0_dv0=(p[85]+dv0)/((p[85]-dv0)*(p[85]-dv0))+1.0/(p[85]-dv0); - vn0_Vrth=vn0_dv0*dv0_Vrth; - vnl0=2.0*vn0/(sqrt((vn0-1.0)*(vn0-1.0)+4.0*p[26]*p[26])+sqrt((vn0+1.0)*(vn0+1.0)+4.0*p[86]*p[86])); - vnl0_vn0=2.0/(sqrt(((vn0+1.0)*(vn0+1.0))+4.0*(p[86]*p[86]))+sqrt(((vn0-1.0)*(vn0-1.0))+4.0*(p[26]*p[26])))-2.0*vn0*((vn0+1.0)/sqrt(((vn0+1.0)*(vn0+1.0))+4.0*(p[86]*p[86]))+(vn0-1.0)/sqrt(((vn0-1.0)*(vn0-1.0))+4.0*(p[26]*p[26])))/((sqrt(((vn0+1.0)*(vn0+1.0))+4.0*(p[86]*p[86]))+sqrt(((vn0-1.0)*(vn0-1.0))+4.0*(p[26]*p[26])))*(sqrt(((vn0+1.0)*(vn0+1.0))+4.0*(p[86]*p[86]))+sqrt(((vn0-1.0)*(vn0-1.0))+4.0*(p[26]*p[26])))); - vnl0_Vrth=vnl0_vn0*vn0_Vrth; - vl0=0.5*(vnl0*(p[85]-dv0)-p[85]-dv0); - vl0_vnl0=0.5*(p[85]-dv0); - vl0_dv0=0.5*(-vnl0-1.0); - vl0_Vrth=vl0_vnl0*vnl0_Vrth; - vl0_Vrth=vl0_Vrth+vl0_dv0*dv0_Vrth; - xvar1=(1.0-vl0/PCatT); - xvar1_vl0=-1.0/PCatT; - xvar1_PCatT=vl0/(PCatT*PCatT); - xvar1_Vrth=xvar1_vl0*vl0_Vrth; - xvar1_Vrth=xvar1_Vrth+xvar1_PCatT*PCatT_Vrth; - xvar2=(1.0-p[25]); - xvar3=pow(xvar1,xvar2); - xvar3_xvar1=xvar3*xvar2/xvar1; - xvar3_Vrth=xvar3_xvar1*xvar1_Vrth; - qlo0=PCatT*(1.0-xvar3)/(1.0-p[25]); - qlo0_PCatT=(1.0-xvar3)/(1.0-p[25]); - qlo0_xvar3=-PCatT/(1.0-p[25]); - qlo0_Vrth=qlo0_PCatT*PCatT_Vrth; - qlo0_Vrth=qlo0_Vrth+qlo0_xvar3*xvar3_Vrth; - vn=(2.0*(*Vbep)+p[85]+dv0)/(p[85]-dv0); - vn_Vbep=2.0/(p[85]-dv0); - vn_dv0=(p[85]+2.0*(*Vbep)+dv0)/((p[85]-dv0)*(p[85]-dv0))+1.0/(p[85]-dv0); - vn_Vrth=vn_dv0*dv0_Vrth; - vnl=2.0*vn/(sqrt((vn-1.0)*(vn-1.0)+4.0*p[26]*p[26])+sqrt((vn+1.0)*(vn+1.0)+4.0*p[86]*p[86])); - vnl_vn=2.0/(sqrt(((vn+1.0)*(vn+1.0))+4.0*(p[86]*p[86]))+sqrt(((vn-1.0)*(vn-1.0))+4.0*(p[26]*p[26])))-2.0*vn*((vn+1.0)/sqrt(((vn+1.0)*(vn+1.0))+4.0*(p[86]*p[86]))+(vn-1.0)/sqrt(((vn-1.0)*(vn-1.0))+4.0*(p[26]*p[26])))/((sqrt(((vn+1.0)*(vn+1.0))+4.0*(p[86]*p[86]))+sqrt(((vn-1.0)*(vn-1.0))+4.0*(p[26]*p[26])))*(sqrt(((vn+1.0)*(vn+1.0))+4.0*(p[86]*p[86]))+sqrt(((vn-1.0)*(vn-1.0))+4.0*(p[26]*p[26])))); - vnl_Vbep=vnl_vn*vn_Vbep; - vnl_Vrth=vnl_vn*vn_Vrth; - vl=0.5*(vnl*(p[85]-dv0)-p[85]-dv0); - vl_vnl=0.5*(p[85]-dv0); - vl_dv0=0.5*(-vnl-1.0); - vl_Vbep=vl_vnl*vnl_Vbep; - vl_Vrth=vl_vnl*vnl_Vrth; - vl_Vrth=vl_Vrth+vl_dv0*dv0_Vrth; - xvar1=(1.0-vl/PCatT); - xvar1_vl=-1.0/PCatT; - xvar1_PCatT=vl/(PCatT*PCatT); - xvar1_Vbep=xvar1_vl*vl_Vbep; - xvar1_Vrth=xvar1_vl*vl_Vrth; - xvar1_Vrth=xvar1_Vrth+xvar1_PCatT*PCatT_Vrth; - xvar2=(1.0-p[25]); - xvar3=pow(xvar1,xvar2); - xvar3_xvar1=xvar3*xvar2/xvar1; - xvar3_Vbep=xvar3_xvar1*xvar1_Vbep; - xvar3_Vrth=xvar3_xvar1*xvar1_Vrth; - qlo=PCatT*(1.0-xvar3)/(1.0-p[25]); - qlo_PCatT=(1.0-xvar3)/(1.0-p[25]); - qlo_xvar3=-PCatT/(1.0-p[25]); - qlo_Vrth=qlo_PCatT*PCatT_Vrth; - qlo_Vbep=qlo_xvar3*xvar3_Vbep; - qlo_Vrth=qlo_Vrth+qlo_xvar3*xvar3_Vrth; - sel=0.5*(vnl+1.0); - sel_vnl=0.5; - sel_Vbep=sel_vnl*vnl_Vbep; - sel_Vrth=sel_vnl*vnl_Vrth; - xvar1=(1.0+p[85]/PCatT); - xvar1_PCatT=-p[85]/(PCatT*PCatT); - xvar1_Vrth=xvar1_PCatT*PCatT_Vrth; - xvar2=(-p[25]); - crt=pow(xvar1,xvar2); - crt_xvar1=crt*xvar2/xvar1; - crt_Vrth=crt_xvar1*xvar1_Vrth; - xvar1=(1.0+dv0/PCatT); - xvar1_dv0=1.0/PCatT; - xvar1_PCatT=-dv0/(PCatT*PCatT); - xvar1_Vrth=xvar1_dv0*dv0_Vrth; - xvar1_Vrth=xvar1_Vrth+xvar1_PCatT*PCatT_Vrth; - xvar2=(-p[25]); - cmx=pow(xvar1,xvar2); - cmx_xvar1=cmx*xvar2/xvar1; - cmx_Vrth=cmx_xvar1*xvar1_Vrth; - cl=(1.0-sel)*crt+sel*cmx; - cl_sel=cmx-crt; - cl_crt=1.0-sel; - cl_cmx=sel; - cl_Vbep=cl_sel*sel_Vbep; - cl_Vrth=cl_sel*sel_Vrth; - cl_Vrth=cl_Vrth+cl_crt*crt_Vrth; - cl_Vrth=cl_Vrth+cl_cmx*cmx_Vrth; - ql=((*Vbep)-vl+vl0)*cl; - ql_Vbep=cl; - ql_vl=-cl; - ql_vl0=cl; - ql_cl=vl0-vl+(*Vbep); - ql_Vbep=ql_Vbep+ql_vl*vl_Vbep; - ql_Vrth=ql_vl*vl_Vrth; - ql_Vrth=ql_Vrth+ql_vl0*vl0_Vrth; - ql_Vbep=ql_Vbep+ql_cl*cl_Vbep; - ql_Vrth=ql_Vrth+ql_cl*cl_Vrth; - qdbep=ql+qlo-qlo0; - qdbep_ql=1.0; - qdbep_qlo=1.0; - qdbep_qlo0=-1.0; - qdbep_Vbep=qdbep_ql*ql_Vbep; - qdbep_Vrth=qdbep_ql*ql_Vrth; - qdbep_Vrth=qdbep_Vrth+qdbep_qlo*qlo_Vrth; - qdbep_Vbep=qdbep_Vbep+qdbep_qlo*qlo_Vbep; - qdbep_Vrth=qdbep_Vrth+qdbep_qlo0*qlo0_Vrth; - }else{ - mv0=sqrt(dv0*dv0+4.0*p[26]*p[26]); - mv0_dv0=dv0/sqrt((dv0*dv0)+4.0*(p[26]*p[26])); - mv0_Vrth=mv0_dv0*dv0_Vrth; - vl0=-0.5*(dv0+mv0); - vl0_dv0=-0.5; - vl0_mv0=-0.5; - vl0_Vrth=vl0_dv0*dv0_Vrth; - vl0_Vrth=vl0_Vrth+vl0_mv0*mv0_Vrth; - xvar1=(1.0-vl0/PCatT); - xvar1_vl0=-1.0/PCatT; - xvar1_PCatT=vl0/(PCatT*PCatT); - xvar1_Vrth=xvar1_vl0*vl0_Vrth; - xvar1_Vrth=xvar1_Vrth+xvar1_PCatT*PCatT_Vrth; - xvar2=(1.0-p[25]); - xvar3=pow(xvar1,xvar2); - xvar3_xvar1=xvar3*xvar2/xvar1; - xvar3_Vrth=xvar3_xvar1*xvar1_Vrth; - q0=-PCatT*xvar3/(1.0-p[25]); - q0_PCatT=-xvar3/(1.0-p[25]); - q0_xvar3=-PCatT/(1.0-p[25]); - q0_Vrth=q0_PCatT*PCatT_Vrth; - q0_Vrth=q0_Vrth+q0_xvar3*xvar3_Vrth; - dv=(*Vbep)+dv0; - dv_Vbep=1.0; - dv_dv0=1.0; - dv_Vrth=dv_dv0*dv0_Vrth; - mv=sqrt(dv*dv+4.0*p[26]*p[26]); - mv_dv=dv/sqrt((dv*dv)+4.0*(p[26]*p[26])); - mv_Vbep=mv_dv*dv_Vbep; - mv_Vrth=mv_dv*dv_Vrth; - vl=0.5*(dv-mv)-dv0; - vl_dv=0.5; - vl_mv=-0.5; - vl_dv0=-1.0; - vl_Vbep=vl_dv*dv_Vbep; - vl_Vrth=vl_dv*dv_Vrth; - vl_Vbep=vl_Vbep+vl_mv*mv_Vbep; - vl_Vrth=vl_Vrth+vl_mv*mv_Vrth; - vl_Vrth=vl_Vrth+vl_dv0*dv0_Vrth; - xvar1=(1.0-vl/PCatT); - xvar1_vl=-1.0/PCatT; - xvar1_PCatT=vl/(PCatT*PCatT); - xvar1_Vbep=xvar1_vl*vl_Vbep; - xvar1_Vrth=xvar1_vl*vl_Vrth; - xvar1_Vrth=xvar1_Vrth+xvar1_PCatT*PCatT_Vrth; - xvar2=(1.0-p[25]); - xvar3=pow(xvar1,xvar2); - xvar3_xvar1=xvar3*xvar2/xvar1; - xvar3_Vbep=xvar3_xvar1*xvar1_Vbep; - xvar3_Vrth=xvar3_xvar1*xvar1_Vrth; - qlo=-PCatT*xvar3/(1.0-p[25]); - qlo_PCatT=-xvar3/(1.0-p[25]); - qlo_xvar3=-PCatT/(1.0-p[25]); - qlo_Vrth=qlo_PCatT*PCatT_Vrth; - qlo_Vbep=qlo_xvar3*xvar3_Vbep; - qlo_Vrth=qlo_Vrth+qlo_xvar3*xvar3_Vrth; - xvar1=(1.0-p[14]); - xvar2=(-p[25]); - xvar3=pow(xvar1,xvar2); - qdbep=qlo+xvar3*((*Vbep)-vl+vl0)-q0; - qdbep_qlo=1.0; - qdbep_Vbep=xvar3; - qdbep_vl=-xvar3; - qdbep_vl0=xvar3; - qdbep_q0=-1.0; - qdbep_Vrth=qdbep_qlo*qlo_Vrth; - qdbep_Vbep=qdbep_Vbep+qdbep_qlo*qlo_Vbep; - qdbep_Vbep=qdbep_Vbep+qdbep_vl*vl_Vbep; - qdbep_Vrth=qdbep_Vrth+qdbep_vl*vl_Vrth; - qdbep_Vrth=qdbep_Vrth+qdbep_vl0*vl0_Vrth; - qdbep_Vrth=qdbep_Vrth+qdbep_q0*q0_Vrth; - } - } - if(p[27]>0.0){ - dv0=-PSatT*p[14]; - dv0_PSatT=-p[14]; - dv0_Vrth=dv0_PSatT*PSatT_Vrth; - if(p[30]<=0.0){ - dvh=(*Vbcp)+dv0; - dvh_Vbcp=1.0; - dvh_dv0=1.0; - dvh_Vrth=dvh_dv0*dv0_Vrth; - if(dvh>0.0){ - xvar1=(1.0-p[14]); - xvar2=(-1.0-p[29]); - pwq=pow(xvar1,xvar2); - qlo=PSatT*(1.0-pwq*(1.0-p[14])*(1.0-p[14]))/(1.0-p[29]); - qlo_PSatT=(1.0-((1.0-p[14])*(1.0-p[14]))*pwq)/(1.0-p[29]); - qlo_Vbcp=0.0; - qlo_Vrth=qlo_PSatT*PSatT_Vrth; - qhi=dvh*(1.0-p[14]+0.5*p[29]*dvh/PSatT)*pwq; - qhi_dvh=(0.5*dvh*p[29]/PSatT-p[14]+1.0)*pwq+0.5*dvh*p[29]*pwq/PSatT; - qhi_PSatT=-0.5*(dvh*dvh)*p[29]*pwq/(PSatT*PSatT); - qhi_Vbcp=qhi_dvh*dvh_Vbcp; - qhi_Vrth=qhi_dvh*dvh_Vrth; - qhi_Vrth=qhi_Vrth+qhi_PSatT*PSatT_Vrth; - }else{ - xvar1=(1.0-(*Vbcp)/PSatT); - xvar1_Vbcp=-1.0/PSatT; - xvar1_PSatT=(*Vbcp)/(PSatT*PSatT); - xvar1_Vrth=xvar1_PSatT*PSatT_Vrth; - xvar2=(1.0-p[29]); - xvar3=pow(xvar1,xvar2); - xvar3_xvar1=xvar3*xvar2/xvar1; - xvar3_Vbcp=xvar3_xvar1*xvar1_Vbcp; - xvar3_Vrth=xvar3_xvar1*xvar1_Vrth; - qlo=PSatT*(1.0-xvar3)/(1.0-p[29]); - qlo_PSatT=(1.0-xvar3)/(1.0-p[29]); - qlo_xvar3=-PSatT/(1.0-p[29]); - qlo_Vrth=qlo_PSatT*PSatT_Vrth; - qlo_Vbcp=qlo_xvar3*xvar3_Vbcp; - qlo_Vrth=qlo_Vrth+qlo_xvar3*xvar3_Vrth; - qhi=0.0; - qhi_Vrth=0.0; - qhi_Vbcp=0.0; - } - qdbcp=qlo+qhi; - qdbcp_qlo=1.0; - qdbcp_qhi=1.0; - qdbcp_Vrth=qdbcp_qlo*qlo_Vrth; - qdbcp_Vbcp=qdbcp_qlo*qlo_Vbcp; - qdbcp_Vrth=qdbcp_Vrth+qdbcp_qhi*qhi_Vrth; - qdbcp_Vbcp=qdbcp_Vbcp+qdbcp_qhi*qhi_Vbcp; - }else{ - mv0=sqrt(dv0*dv0+4.0*p[30]*p[30]); - mv0_dv0=dv0/sqrt((dv0*dv0)+4.0*(p[30]*p[30])); - mv0_Vrth=mv0_dv0*dv0_Vrth; - vl0=-0.5*(dv0+mv0); - vl0_dv0=-0.5; - vl0_mv0=-0.5; - vl0_Vrth=vl0_dv0*dv0_Vrth; - vl0_Vrth=vl0_Vrth+vl0_mv0*mv0_Vrth; - xvar1=(1.0-vl0/PSatT); - xvar1_vl0=-1.0/PSatT; - xvar1_PSatT=vl0/(PSatT*PSatT); - xvar1_Vrth=xvar1_vl0*vl0_Vrth; - xvar1_Vrth=xvar1_Vrth+xvar1_PSatT*PSatT_Vrth; - xvar2=(1.0-p[29]); - xvar3=pow(xvar1,xvar2); - xvar3_xvar1=xvar3*xvar2/xvar1; - xvar3_Vrth=xvar3_xvar1*xvar1_Vrth; - q0=-PSatT*xvar3/(1.0-p[29]); - q0_PSatT=-xvar3/(1.0-p[29]); - q0_xvar3=-PSatT/(1.0-p[29]); - q0_Vrth=q0_PSatT*PSatT_Vrth; - q0_Vrth=q0_Vrth+q0_xvar3*xvar3_Vrth; - dv=(*Vbcp)+dv0; - dv_Vbcp=1.0; - dv_dv0=1.0; - dv_Vrth=dv_dv0*dv0_Vrth; - mv=sqrt(dv*dv+4.0*p[30]*p[30]); - mv_dv=dv/sqrt((dv*dv)+4.0*(p[30]*p[30])); - mv_Vbcp=mv_dv*dv_Vbcp; - mv_Vrth=mv_dv*dv_Vrth; - vl=0.5*(dv-mv)-dv0; - vl_dv=0.5; - vl_mv=-0.5; - vl_dv0=-1.0; - vl_Vbcp=vl_dv*dv_Vbcp; - vl_Vrth=vl_dv*dv_Vrth; - vl_Vbcp=vl_Vbcp+vl_mv*mv_Vbcp; - vl_Vrth=vl_Vrth+vl_mv*mv_Vrth; - vl_Vrth=vl_Vrth+vl_dv0*dv0_Vrth; - xvar1=(1.0-vl/PSatT); - xvar1_vl=-1.0/PSatT; - xvar1_PSatT=vl/(PSatT*PSatT); - xvar1_Vbcp=xvar1_vl*vl_Vbcp; - xvar1_Vrth=xvar1_vl*vl_Vrth; - xvar1_Vrth=xvar1_Vrth+xvar1_PSatT*PSatT_Vrth; - xvar2=(1.0-p[29]); - xvar3=pow(xvar1,xvar2); - xvar3_xvar1=xvar3*xvar2/xvar1; - xvar3_Vbcp=xvar3_xvar1*xvar1_Vbcp; - xvar3_Vrth=xvar3_xvar1*xvar1_Vrth; - qlo=-PSatT*xvar3/(1.0-p[29]); - qlo_PSatT=-xvar3/(1.0-p[29]); - qlo_xvar3=-PSatT/(1.0-p[29]); - qlo_Vrth=qlo_PSatT*PSatT_Vrth; - qlo_Vbcp=qlo_xvar3*xvar3_Vbcp; - qlo_Vrth=qlo_Vrth+qlo_xvar3*xvar3_Vrth; - xvar1=(1.0-p[14]); - xvar2=(-p[29]); - xvar3=pow(xvar1,xvar2); - qdbcp=qlo+xvar3*((*Vbcp)-vl+vl0)-q0; - qdbcp_qlo=1.0; - qdbcp_Vbcp=xvar3; - qdbcp_vl=-xvar3; - qdbcp_vl0=xvar3; - qdbcp_q0=-1.0; - qdbcp_Vrth=qdbcp_qlo*qlo_Vrth; - qdbcp_Vbcp=qdbcp_Vbcp+qdbcp_qlo*qlo_Vbcp; - qdbcp_Vbcp=qdbcp_Vbcp+qdbcp_vl*vl_Vbcp; - qdbcp_Vrth=qdbcp_Vrth+qdbcp_vl*vl_Vrth; - qdbcp_Vrth=qdbcp_Vrth+qdbcp_vl0*vl0_Vrth; - qdbcp_Vrth=qdbcp_Vrth+qdbcp_q0*q0_Vrth; - } - }else{ - qdbcp=0.0; - qdbcp_Vrth=0.0; - qdbcp_Vbcp=0.0; - } - argi=(*Vbei)/(NFatT*Vtv); - argi_Vbei=1.0/(NFatT*Vtv); - argi_NFatT=-(*Vbei)/((NFatT*NFatT)*Vtv); - argi_Vtv=-(*Vbei)/(NFatT*(Vtv*Vtv)); - argi_Vrth=argi_NFatT*NFatT_Vrth; - argi_Vrth=argi_Vrth+argi_Vtv*Vtv_Vrth; - expi=exp(argi); - expi_argi=expi; - expi_Vbei=expi_argi*argi_Vbei; - expi_Vrth=expi_argi*argi_Vrth; - Ifi=ISatT*(expi-1.0); - Ifi_ISatT=expi-1.0; - Ifi_expi=ISatT; - Ifi_Vrth=Ifi_ISatT*ISatT_Vrth; - Ifi_Vbei=Ifi_expi*expi_Vbei; - Ifi_Vrth=Ifi_Vrth+Ifi_expi*expi_Vrth; - argi=(*Vbci)/(NRatT*Vtv); - argi_Vbci=1.0/(NRatT*Vtv); - argi_NRatT=-(*Vbci)/((NRatT*NRatT)*Vtv); - argi_Vtv=-(*Vbci)/(NRatT*(Vtv*Vtv)); - argi_Vrth=argi_NRatT*NRatT_Vrth; - argi_Vrth=argi_Vrth+argi_Vtv*Vtv_Vrth; - expi=exp(argi); - expi_argi=expi; - expi_Vbci=expi_argi*argi_Vbci; - expi_Vrth=expi_argi*argi_Vrth; - Iri=ISatT*ISRRatT*(expi-1.0); - Iri_ISatT=(expi-1.0)*ISRRatT; - Iri_ISRRatT=(expi-1.0)*ISatT; - Iri_expi=ISatT*ISRRatT; - Iri_Vrth=Iri_ISatT*ISatT_Vrth; - Iri_Vrth=Iri_Vrth+Iri_ISRRatT*ISRRatT_Vrth; - Iri_Vbci=Iri_expi*expi_Vbci; - Iri_Vrth=Iri_Vrth+Iri_expi*expi_Vrth; - q1z=1.0+qdbe*IVER+qdbc*IVEF; - q1z_qdbe=IVER; - q1z_qdbc=IVEF; - q1z_Vrth=q1z_qdbe*qdbe_Vrth; - q1z_Vbei=q1z_qdbe*qdbe_Vbei; - q1z_Vrth=q1z_Vrth+q1z_qdbc*qdbc_Vrth; - q1z_Vbci=q1z_qdbc*qdbc_Vbci; - q1=0.5*(sqrt((q1z-1.0e-4)*(q1z-1.0e-4)+1.0e-8)+q1z-1.0e-4)+1.0e-4; - q1_q1z=0.5*((q1z-1.0e-4)/sqrt(((q1z-1.0e-4)*(q1z-1.0e-4))+1.0e-8)+1.0); - q1_Vrth=q1_q1z*q1z_Vrth; - q1_Vbei=q1_q1z*q1z_Vbei; - q1_Vbci=q1_q1z*q1z_Vbci; - q2=Ifi*IIKF+Iri*IIKR; - q2_Ifi=IIKF; - q2_IIKF=Ifi; - q2_Iri=IIKR; - q2_Vrth=q2_Ifi*Ifi_Vrth; - q2_Vbei=q2_Ifi*Ifi_Vbei; - q2_Vrth=q2_Vrth+q2_IIKF*IIKF_Vrth; - q2_Vrth=q2_Vrth+q2_Iri*Iri_Vrth; - q2_Vbci=q2_Iri*Iri_Vbci; - if(p[88]<0.5){ - xvar2=1.0/p[89]; - xvar3=pow(q1,xvar2); - xvar3_q1=xvar3*xvar2/q1; - xvar3_Vrth=xvar3_q1*q1_Vrth; - xvar3_Vbei=xvar3_q1*q1_Vbei; - xvar3_Vbci=xvar3_q1*q1_Vbci; - xvar1=(xvar3+4.0*q2); - xvar1_xvar3=1.0; - xvar1_q2=4.0; - xvar1_Vrth=xvar1_xvar3*xvar3_Vrth; - xvar1_Vbei=xvar1_xvar3*xvar3_Vbei; - xvar1_Vbci=xvar1_xvar3*xvar3_Vbci; - xvar1_Vrth=xvar1_Vrth+xvar1_q2*q2_Vrth; - xvar1_Vbei=xvar1_Vbei+xvar1_q2*q2_Vbei; - xvar1_Vbci=xvar1_Vbci+xvar1_q2*q2_Vbci; - xvar4=pow(xvar1,p[89]); - xvar4_xvar1=xvar4*p[89]/xvar1; - xvar4_Vrth=xvar4_xvar1*xvar1_Vrth; - xvar4_Vbei=xvar4_xvar1*xvar1_Vbei; - xvar4_Vbci=xvar4_xvar1*xvar1_Vbci; - qb=0.5*(q1+xvar4); - qb_q1=0.5; - qb_xvar4=0.5; - qb_Vrth=qb_q1*q1_Vrth; - qb_Vbei=qb_q1*q1_Vbei; - qb_Vbci=qb_q1*q1_Vbci; - qb_Vrth=qb_Vrth+qb_xvar4*xvar4_Vrth; - qb_Vbei=qb_Vbei+qb_xvar4*xvar4_Vbei; - qb_Vbci=qb_Vbci+qb_xvar4*xvar4_Vbci; - }else{ - xvar1=(1.0+4.0*q2); - xvar1_q2=4.0; - xvar1_Vrth=xvar1_q2*q2_Vrth; - xvar1_Vbei=xvar1_q2*q2_Vbei; - xvar1_Vbci=xvar1_q2*q2_Vbci; - xvar2=pow(xvar1,p[89]); - xvar2_xvar1=xvar2*p[89]/xvar1; - xvar2_Vrth=xvar2_xvar1*xvar1_Vrth; - xvar2_Vbei=xvar2_xvar1*xvar1_Vbei; - xvar2_Vbci=xvar2_xvar1*xvar1_Vbci; - qb=0.5*q1*(1.0+xvar2); - qb_q1=0.5*(xvar2+1.0); - qb_xvar2=0.5*q1; - qb_Vrth=qb_q1*q1_Vrth; - qb_Vbei=qb_q1*q1_Vbei; - qb_Vbci=qb_q1*q1_Vbci; - qb_Vrth=qb_Vrth+qb_xvar2*xvar2_Vrth; - qb_Vbei=qb_Vbei+qb_xvar2*xvar2_Vbei; - qb_Vbci=qb_Vbci+qb_xvar2*xvar2_Vbci; - } - (*Itzr)=Iri/qb; - Itzr_Iri=1.0/qb; - Itzr_qb=-Iri/(qb*qb); - *Itzr_Vrth=Itzr_Iri*Iri_Vrth; - *Itzr_Vbci=Itzr_Iri*Iri_Vbci; - *Itzr_Vrth=(*Itzr_Vrth)+Itzr_qb*qb_Vrth; - *Itzr_Vbei=Itzr_qb*qb_Vbei; - *Itzr_Vbci=(*Itzr_Vbci)+Itzr_qb*qb_Vbci; - (*Itzf)=Ifi/qb; - Itzf_Ifi=1.0/qb; - Itzf_qb=-Ifi/(qb*qb); - *Itzf_Vrth=Itzf_Ifi*Ifi_Vrth; - *Itzf_Vbei=Itzf_Ifi*Ifi_Vbei; - *Itzf_Vrth=(*Itzf_Vrth)+Itzf_qb*qb_Vrth; - *Itzf_Vbei=(*Itzf_Vbei)+Itzf_qb*qb_Vbei; - *Itzf_Vbci=Itzf_qb*qb_Vbci; - if(p[42]>0.0){ - argi=(*Vbep)/(p[44]*Vtv); - argi_Vbep=1.0/(p[44]*Vtv); - argi_Vtv=-(*Vbep)/(p[44]*(Vtv*Vtv)); - argi_Vrth=argi_Vtv*Vtv_Vrth; - expi=exp(argi); - expi_argi=expi; - expi_Vbep=expi_argi*argi_Vbep; - expi_Vrth=expi_argi*argi_Vrth; - argx=(*Vbci)/(p[44]*Vtv); - argx_Vbci=1.0/(p[44]*Vtv); - argx_Vtv=-(*Vbci)/(p[44]*(Vtv*Vtv)); - argx_Vrth=argx_Vtv*Vtv_Vrth; - expx=exp(argx); - expx_argx=expx; - expx_Vbci=expx_argx*argx_Vbci; - expx_Vrth=expx_argx*argx_Vrth; - Ifp=ISPatT*(p[43]*expi+(1.0-p[43])*expx-1.0); - Ifp_ISPatT=expi*p[43]+expx*(1.0-p[43])-1.0; - Ifp_expi=ISPatT*p[43]; - Ifp_expx=ISPatT*(1.0-p[43]); - Ifp_Vrth=Ifp_ISPatT*ISPatT_Vrth; - Ifp_Vbep=Ifp_expi*expi_Vbep; - Ifp_Vrth=Ifp_Vrth+Ifp_expi*expi_Vrth; - Ifp_Vbci=Ifp_expx*expx_Vbci; - Ifp_Vrth=Ifp_Vrth+Ifp_expx*expx_Vrth; - q2p=Ifp*IIKP; - q2p_Ifp=IIKP; - q2p_Vrth=q2p_Ifp*Ifp_Vrth; - q2p_Vbep=q2p_Ifp*Ifp_Vbep; - q2p_Vbci=q2p_Ifp*Ifp_Vbci; - qbp=0.5*(1.0+sqrt(1.0+4.0*q2p)); - qbp_q2p=1.0/sqrt(4.0*q2p+1.0); - qbp_Vrth=qbp_q2p*q2p_Vrth; - qbp_Vbep=qbp_q2p*q2p_Vbep; - qbp_Vbci=qbp_q2p*q2p_Vbci; - argi=(*Vbcp)/(p[44]*Vtv); - argi_Vbcp=1.0/(p[44]*Vtv); - argi_Vtv=-(*Vbcp)/(p[44]*(Vtv*Vtv)); - argi_Vrth=argi_Vtv*Vtv_Vrth; - expi=exp(argi); - expi_argi=expi; - expi_Vbcp=expi_argi*argi_Vbcp; - expi_Vrth=expi_argi*argi_Vrth; - Irp=ISPatT*(expi-1.0); - Irp_ISPatT=expi-1.0; - Irp_expi=ISPatT; - Irp_Vrth=Irp_ISPatT*ISPatT_Vrth; - Irp_Vbcp=Irp_expi*expi_Vbcp; - Irp_Vrth=Irp_Vrth+Irp_expi*expi_Vrth; - (*Iccp)=(Ifp-Irp)/qbp; - Iccp_Ifp=1.0/qbp; - Iccp_Irp=-1.0/qbp; - Iccp_qbp=-(Ifp-Irp)/(qbp*qbp); - *Iccp_Vrth=Iccp_Ifp*Ifp_Vrth; - *Iccp_Vbep=Iccp_Ifp*Ifp_Vbep; - *Iccp_Vbci=Iccp_Ifp*Ifp_Vbci; - *Iccp_Vrth=(*Iccp_Vrth)+Iccp_Irp*Irp_Vrth; - *Iccp_Vbcp=Iccp_Irp*Irp_Vbcp; - *Iccp_Vrth=(*Iccp_Vrth)+Iccp_qbp*qbp_Vrth; - *Iccp_Vbep=(*Iccp_Vbep)+Iccp_qbp*qbp_Vbep; - *Iccp_Vbci=(*Iccp_Vbci)+Iccp_qbp*qbp_Vbci; - }else{ - Ifp=0.0; - Ifp_Vrth=0.0; - Ifp_Vbep=0.0; - Ifp_Vbci=0.0; - qbp=1.0; - qbp_Vrth=0.0; - qbp_Vbep=0.0; - qbp_Vbci=0.0; - (*Iccp)=0.0; - *Iccp_Vrth=0.0; - *Iccp_Vbep=0.0; - *Iccp_Vbci=0.0; - *Iccp_Vbcp=0.0; - } - if(p[32]==1.0){ - argi=(*Vbei)/(p[33]*Vtv); - argi_Vbei=1.0/(p[33]*Vtv); - argi_Vtv=-(*Vbei)/(p[33]*(Vtv*Vtv)); - argi_Vrth=argi_Vtv*Vtv_Vrth; - expi=exp(argi); - expi_argi=expi; - expi_Vbei=expi_argi*argi_Vbei; - expi_Vrth=expi_argi*argi_Vrth; - argn=(*Vbei)/(p[35]*Vtv); - argn_Vbei=1.0/(p[35]*Vtv); - argn_Vtv=-(*Vbei)/(p[35]*(Vtv*Vtv)); - argn_Vrth=argn_Vtv*Vtv_Vrth; - expn=exp(argn); - expn_argn=expn; - expn_Vbei=expn_argn*argn_Vbei; - expn_Vrth=expn_argn*argn_Vrth; - if(p[98]>0.0){ - argx=(-VBBEatT-(*Vbei))/(NBBEatT*Vtv); - argx_VBBEatT=-1.0/(NBBEatT*Vtv); - argx_Vbei=-1.0/(NBBEatT*Vtv); - argx_NBBEatT=-(-(*Vbei)-VBBEatT)/((NBBEatT*NBBEatT)*Vtv); - argx_Vtv=-(-(*Vbei)-VBBEatT)/(NBBEatT*(Vtv*Vtv)); - argx_Vrth=argx_VBBEatT*VBBEatT_Vrth; - argx_Vrth=argx_Vrth+argx_NBBEatT*NBBEatT_Vrth; - argx_Vrth=argx_Vrth+argx_Vtv*Vtv_Vrth; - expx=exp(argx); - expx_argx=expx; - expx_Vrth=expx_argx*argx_Vrth; - expx_Vbei=expx_argx*argx_Vbei; - (*Ibe)=IBEIatT*(expi-1.0)+IBENatT*(expn-1.0)-p[100]*(expx-EBBEatT); - Ibe_IBEIatT=expi-1.0; - Ibe_expi=IBEIatT; - Ibe_IBENatT=expn-1.0; - Ibe_expn=IBENatT; - Ibe_expx=-p[100]; - Ibe_EBBEatT=p[100]; - *Ibe_Vrth=Ibe_IBEIatT*IBEIatT_Vrth; - *Ibe_Vbei=Ibe_expi*expi_Vbei; - *Ibe_Vrth=(*Ibe_Vrth)+Ibe_expi*expi_Vrth; - *Ibe_Vrth=(*Ibe_Vrth)+Ibe_IBENatT*IBENatT_Vrth; - *Ibe_Vbei=(*Ibe_Vbei)+Ibe_expn*expn_Vbei; - *Ibe_Vrth=(*Ibe_Vrth)+Ibe_expn*expn_Vrth; - *Ibe_Vrth=(*Ibe_Vrth)+Ibe_expx*expx_Vrth; - *Ibe_Vbei=(*Ibe_Vbei)+Ibe_expx*expx_Vbei; - *Ibe_Vrth=(*Ibe_Vrth)+Ibe_EBBEatT*EBBEatT_Vrth; - }else{ - (*Ibe)=IBEIatT*(expi-1.0)+IBENatT*(expn-1.0); - Ibe_IBEIatT=expi-1.0; - Ibe_expi=IBEIatT; - Ibe_IBENatT=expn-1.0; - Ibe_expn=IBENatT; - *Ibe_Vrth=Ibe_IBEIatT*IBEIatT_Vrth; - *Ibe_Vbei=Ibe_expi*expi_Vbei; - *Ibe_Vrth=(*Ibe_Vrth)+Ibe_expi*expi_Vrth; - *Ibe_Vrth=(*Ibe_Vrth)+Ibe_IBENatT*IBENatT_Vrth; - *Ibe_Vbei=(*Ibe_Vbei)+Ibe_expn*expn_Vbei; - *Ibe_Vrth=(*Ibe_Vrth)+Ibe_expn*expn_Vrth; - } - (*Ibex)=0.0; - *Ibex_Vrth=0.0; - *Ibex_Vbex=0.0; - }else if(p[32]==0.0){ - (*Ibe)=0.0; - *Ibe_Vrth=0.0; - *Ibe_Vbei=0.0; - argi=(*Vbex)/(p[33]*Vtv); - argi_Vbex=1.0/(p[33]*Vtv); - argi_Vtv=-(*Vbex)/(p[33]*(Vtv*Vtv)); - argi_Vrth=argi_Vtv*Vtv_Vrth; - expi=exp(argi); - expi_argi=expi; - expi_Vbex=expi_argi*argi_Vbex; - expi_Vrth=expi_argi*argi_Vrth; - argn=(*Vbex)/(p[35]*Vtv); - argn_Vbex=1.0/(p[35]*Vtv); - argn_Vtv=-(*Vbex)/(p[35]*(Vtv*Vtv)); - argn_Vrth=argn_Vtv*Vtv_Vrth; - expn=exp(argn); - expn_argn=expn; - expn_Vbex=expn_argn*argn_Vbex; - expn_Vrth=expn_argn*argn_Vrth; - if(p[98]>0.0){ - argx=(-VBBEatT-(*Vbex))/(NBBEatT*Vtv); - argx_VBBEatT=-1.0/(NBBEatT*Vtv); - argx_Vbex=-1.0/(NBBEatT*Vtv); - argx_NBBEatT=-(-(*Vbex)-VBBEatT)/((NBBEatT*NBBEatT)*Vtv); - argx_Vtv=-(-(*Vbex)-VBBEatT)/(NBBEatT*(Vtv*Vtv)); - argx_Vrth=argx_VBBEatT*VBBEatT_Vrth; - argx_Vrth=argx_Vrth+argx_NBBEatT*NBBEatT_Vrth; - argx_Vrth=argx_Vrth+argx_Vtv*Vtv_Vrth; - expx=exp(argx); - expx_argx=expx; - expx_Vrth=expx_argx*argx_Vrth; - expx_Vbex=expx_argx*argx_Vbex; - (*Ibex)=IBEIatT*(expi-1.0)+IBENatT*(expn-1.0)-p[100]*(expx-EBBEatT); - Ibex_IBEIatT=expi-1.0; - Ibex_expi=IBEIatT; - Ibex_IBENatT=expn-1.0; - Ibex_expn=IBENatT; - Ibex_expx=-p[100]; - Ibex_EBBEatT=p[100]; - *Ibex_Vrth=Ibex_IBEIatT*IBEIatT_Vrth; - *Ibex_Vbex=Ibex_expi*expi_Vbex; - *Ibex_Vrth=(*Ibex_Vrth)+Ibex_expi*expi_Vrth; - *Ibex_Vrth=(*Ibex_Vrth)+Ibex_IBENatT*IBENatT_Vrth; - *Ibex_Vbex=(*Ibex_Vbex)+Ibex_expn*expn_Vbex; - *Ibex_Vrth=(*Ibex_Vrth)+Ibex_expn*expn_Vrth; - *Ibex_Vrth=(*Ibex_Vrth)+Ibex_expx*expx_Vrth; - *Ibex_Vbex=(*Ibex_Vbex)+Ibex_expx*expx_Vbex; - *Ibex_Vrth=(*Ibex_Vrth)+Ibex_EBBEatT*EBBEatT_Vrth; - }else{ - (*Ibex)=IBEIatT*(expi-1.0)+IBENatT*(expn-1.0); - Ibex_IBEIatT=expi-1.0; - Ibex_expi=IBEIatT; - Ibex_IBENatT=expn-1.0; - Ibex_expn=IBENatT; - *Ibex_Vrth=Ibex_IBEIatT*IBEIatT_Vrth; - *Ibex_Vbex=Ibex_expi*expi_Vbex; - *Ibex_Vrth=(*Ibex_Vrth)+Ibex_expi*expi_Vrth; - *Ibex_Vrth=(*Ibex_Vrth)+Ibex_IBENatT*IBENatT_Vrth; - *Ibex_Vbex=(*Ibex_Vbex)+Ibex_expn*expn_Vbex; - *Ibex_Vrth=(*Ibex_Vrth)+Ibex_expn*expn_Vrth; - } - }else{ - argi=(*Vbei)/(p[33]*Vtv); - argi_Vbei=1.0/(p[33]*Vtv); - argi_Vtv=-(*Vbei)/(p[33]*(Vtv*Vtv)); - argi_Vrth=argi_Vtv*Vtv_Vrth; - expi=exp(argi); - expi_argi=expi; - expi_Vbei=expi_argi*argi_Vbei; - expi_Vrth=expi_argi*argi_Vrth; - argn=(*Vbei)/(p[35]*Vtv); - argn_Vbei=1.0/(p[35]*Vtv); - argn_Vtv=-(*Vbei)/(p[35]*(Vtv*Vtv)); - argn_Vrth=argn_Vtv*Vtv_Vrth; - expn=exp(argn); - expn_argn=expn; - expn_Vbei=expn_argn*argn_Vbei; - expn_Vrth=expn_argn*argn_Vrth; - if(p[98]>0.0){ - argx=(-VBBEatT-(*Vbei))/(NBBEatT*Vtv); - argx_VBBEatT=-1.0/(NBBEatT*Vtv); - argx_Vbei=-1.0/(NBBEatT*Vtv); - argx_NBBEatT=-(-(*Vbei)-VBBEatT)/((NBBEatT*NBBEatT)*Vtv); - argx_Vtv=-(-(*Vbei)-VBBEatT)/(NBBEatT*(Vtv*Vtv)); - argx_Vrth=argx_VBBEatT*VBBEatT_Vrth; - argx_Vrth=argx_Vrth+argx_NBBEatT*NBBEatT_Vrth; - argx_Vrth=argx_Vrth+argx_Vtv*Vtv_Vrth; - expx=exp(argx); - expx_argx=expx; - expx_Vrth=expx_argx*argx_Vrth; - expx_Vbei=expx_argx*argx_Vbei; - (*Ibe)=p[32]*(IBEIatT*(expi-1.0)+IBENatT*(expn-1.0)-p[100]*(expx-EBBEatT)); - Ibe_IBEIatT=(expi-1.0)*p[32]; - Ibe_expi=IBEIatT*p[32]; - Ibe_IBENatT=(expn-1.0)*p[32]; - Ibe_expn=IBENatT*p[32]; - Ibe_expx=-p[100]*p[32]; - Ibe_EBBEatT=p[100]*p[32]; - *Ibe_Vrth=Ibe_IBEIatT*IBEIatT_Vrth; - *Ibe_Vbei=Ibe_expi*expi_Vbei; - *Ibe_Vrth=(*Ibe_Vrth)+Ibe_expi*expi_Vrth; - *Ibe_Vrth=(*Ibe_Vrth)+Ibe_IBENatT*IBENatT_Vrth; - *Ibe_Vbei=(*Ibe_Vbei)+Ibe_expn*expn_Vbei; - *Ibe_Vrth=(*Ibe_Vrth)+Ibe_expn*expn_Vrth; - *Ibe_Vrth=(*Ibe_Vrth)+Ibe_expx*expx_Vrth; - *Ibe_Vbei=(*Ibe_Vbei)+Ibe_expx*expx_Vbei; - *Ibe_Vrth=(*Ibe_Vrth)+Ibe_EBBEatT*EBBEatT_Vrth; - }else{ - (*Ibe)=p[32]*(IBEIatT*(expi-1.0)+IBENatT*(expn-1.0)); - Ibe_IBEIatT=(expi-1.0)*p[32]; - Ibe_expi=IBEIatT*p[32]; - Ibe_IBENatT=(expn-1.0)*p[32]; - Ibe_expn=IBENatT*p[32]; - *Ibe_Vrth=Ibe_IBEIatT*IBEIatT_Vrth; - *Ibe_Vbei=Ibe_expi*expi_Vbei; - *Ibe_Vrth=(*Ibe_Vrth)+Ibe_expi*expi_Vrth; - *Ibe_Vrth=(*Ibe_Vrth)+Ibe_IBENatT*IBENatT_Vrth; - *Ibe_Vbei=(*Ibe_Vbei)+Ibe_expn*expn_Vbei; - *Ibe_Vrth=(*Ibe_Vrth)+Ibe_expn*expn_Vrth; - } - argi=(*Vbex)/(p[33]*Vtv); - argi_Vbex=1.0/(p[33]*Vtv); - argi_Vtv=-(*Vbex)/(p[33]*(Vtv*Vtv)); - argi_Vrth=argi_Vtv*Vtv_Vrth; - expi=exp(argi); - expi_argi=expi; - expi_Vbex=expi_argi*argi_Vbex; - expi_Vrth=expi_argi*argi_Vrth; - argn=(*Vbex)/(p[35]*Vtv); - argn_Vbex=1.0/(p[35]*Vtv); - argn_Vtv=-(*Vbex)/(p[35]*(Vtv*Vtv)); - argn_Vrth=argn_Vtv*Vtv_Vrth; - expn=exp(argn); - expn_argn=expn; - expn_Vbex=expn_argn*argn_Vbex; - expn_Vrth=expn_argn*argn_Vrth; - if(p[98]>0.0){ - argx=(-VBBEatT-(*Vbex))/(NBBEatT*Vtv); - argx_VBBEatT=-1.0/(NBBEatT*Vtv); - argx_Vbex=-1.0/(NBBEatT*Vtv); - argx_NBBEatT=-(-(*Vbex)-VBBEatT)/((NBBEatT*NBBEatT)*Vtv); - argx_Vtv=-(-(*Vbex)-VBBEatT)/(NBBEatT*(Vtv*Vtv)); - argx_Vrth=argx_VBBEatT*VBBEatT_Vrth; - argx_Vrth=argx_Vrth+argx_NBBEatT*NBBEatT_Vrth; - argx_Vrth=argx_Vrth+argx_Vtv*Vtv_Vrth; - expx=exp(argx); - expx_argx=expx; - expx_Vrth=expx_argx*argx_Vrth; - expx_Vbex=expx_argx*argx_Vbex; - (*Ibex)=(1.0-p[32])*(IBEIatT*(expi-1.0)+IBENatT*(expn-1.0)-p[100]*(expx-EBBEatT)); - Ibex_IBEIatT=(expi-1.0)*(1.0-p[32]); - Ibex_expi=IBEIatT*(1.0-p[32]); - Ibex_IBENatT=(expn-1.0)*(1.0-p[32]); - Ibex_expn=IBENatT*(1.0-p[32]); - Ibex_expx=-p[100]*(1.0-p[32]); - Ibex_EBBEatT=p[100]*(1.0-p[32]); - *Ibex_Vrth=Ibex_IBEIatT*IBEIatT_Vrth; - *Ibex_Vbex=Ibex_expi*expi_Vbex; - *Ibex_Vrth=(*Ibex_Vrth)+Ibex_expi*expi_Vrth; - *Ibex_Vrth=(*Ibex_Vrth)+Ibex_IBENatT*IBENatT_Vrth; - *Ibex_Vbex=(*Ibex_Vbex)+Ibex_expn*expn_Vbex; - *Ibex_Vrth=(*Ibex_Vrth)+Ibex_expn*expn_Vrth; - *Ibex_Vrth=(*Ibex_Vrth)+Ibex_expx*expx_Vrth; - *Ibex_Vbex=(*Ibex_Vbex)+Ibex_expx*expx_Vbex; - *Ibex_Vrth=(*Ibex_Vrth)+Ibex_EBBEatT*EBBEatT_Vrth; - }else{ - (*Ibex)=(1.0-p[32])*(IBEIatT*(expi-1.0)+IBENatT*(expn-1.0)); - Ibex_IBEIatT=(expi-1.0)*(1.0-p[32]); - Ibex_expi=IBEIatT*(1.0-p[32]); - Ibex_IBENatT=(expn-1.0)*(1.0-p[32]); - Ibex_expn=IBENatT*(1.0-p[32]); - *Ibex_Vrth=Ibex_IBEIatT*IBEIatT_Vrth; - *Ibex_Vbex=Ibex_expi*expi_Vbex; - *Ibex_Vrth=(*Ibex_Vrth)+Ibex_expi*expi_Vrth; - *Ibex_Vrth=(*Ibex_Vrth)+Ibex_IBENatT*IBENatT_Vrth; - *Ibex_Vbex=(*Ibex_Vbex)+Ibex_expn*expn_Vbex; - *Ibex_Vrth=(*Ibex_Vrth)+Ibex_expn*expn_Vrth; - } - } - argi=(*Vbci)/(p[37]*Vtv); - argi_Vbci=1.0/(p[37]*Vtv); - argi_Vtv=-(*Vbci)/(p[37]*(Vtv*Vtv)); - argi_Vrth=argi_Vtv*Vtv_Vrth; - expi=exp(argi); - expi_argi=expi; - expi_Vbci=expi_argi*argi_Vbci; - expi_Vrth=expi_argi*argi_Vrth; - argn=(*Vbci)/(p[39]*Vtv); - argn_Vbci=1.0/(p[39]*Vtv); - argn_Vtv=-(*Vbci)/(p[39]*(Vtv*Vtv)); - argn_Vrth=argn_Vtv*Vtv_Vrth; - expn=exp(argn); - expn_argn=expn; - expn_Vbci=expn_argn*argn_Vbci; - expn_Vrth=expn_argn*argn_Vrth; - Ibcj=IBCIatT*(expi-1.0)+IBCNatT*(expn-1.0); - Ibcj_IBCIatT=expi-1.0; - Ibcj_expi=IBCIatT; - Ibcj_IBCNatT=expn-1.0; - Ibcj_expn=IBCNatT; - Ibcj_Vrth=Ibcj_IBCIatT*IBCIatT_Vrth; - Ibcj_Vbci=Ibcj_expi*expi_Vbci; - Ibcj_Vrth=Ibcj_Vrth+Ibcj_expi*expi_Vrth; - Ibcj_Vrth=Ibcj_Vrth+Ibcj_IBCNatT*IBCNatT_Vrth; - Ibcj_Vbci=Ibcj_Vbci+Ibcj_expn*expn_Vbci; - Ibcj_Vrth=Ibcj_Vrth+Ibcj_expn*expn_Vrth; - if((p[45]>0.0)||(p[46]>0.0)){ - argi=(*Vbep)/(p[37]*Vtv); - argi_Vbep=1.0/(p[37]*Vtv); - argi_Vtv=-(*Vbep)/(p[37]*(Vtv*Vtv)); - argi_Vrth=argi_Vtv*Vtv_Vrth; - expi=exp(argi); - expi_argi=expi; - expi_Vbep=expi_argi*argi_Vbep; - expi_Vrth=expi_argi*argi_Vrth; - argn=(*Vbep)/(p[39]*Vtv); - argn_Vbep=1.0/(p[39]*Vtv); - argn_Vtv=-(*Vbep)/(p[39]*(Vtv*Vtv)); - argn_Vrth=argn_Vtv*Vtv_Vrth; - expn=exp(argn); - expn_argn=expn; - expn_Vbep=expn_argn*argn_Vbep; - expn_Vrth=expn_argn*argn_Vrth; - (*Ibep)=IBEIPatT*(expi-1.0)+IBENPatT*(expn-1.0); - Ibep_IBEIPatT=expi-1.0; - Ibep_expi=IBEIPatT; - Ibep_IBENPatT=expn-1.0; - Ibep_expn=IBENPatT; - *Ibep_Vrth=Ibep_IBEIPatT*IBEIPatT_Vrth; - *Ibep_Vbep=Ibep_expi*expi_Vbep; - *Ibep_Vrth=(*Ibep_Vrth)+Ibep_expi*expi_Vrth; - *Ibep_Vrth=(*Ibep_Vrth)+Ibep_IBENPatT*IBENPatT_Vrth; - *Ibep_Vbep=(*Ibep_Vbep)+Ibep_expn*expn_Vbep; - *Ibep_Vrth=(*Ibep_Vrth)+Ibep_expn*expn_Vrth; - }else{ - (*Ibep)=0.0; - *Ibep_Vrth=0.0; - *Ibep_Vbep=0.0; - } - if(p[40]>0.0){ - vl=0.5*(sqrt((PCatT-(*Vbci))*(PCatT-(*Vbci))+0.01)+(PCatT-(*Vbci))); - vl_PCatT=0.5*((PCatT-(*Vbci))/sqrt(((PCatT-(*Vbci))*(PCatT-(*Vbci)))+0.01)+1.0); - vl_Vbci=0.5*(-(PCatT-(*Vbci))/sqrt(((PCatT-(*Vbci))*(PCatT-(*Vbci)))+0.01)-1.0); - vl_Vrth=vl_PCatT*PCatT_Vrth; - xvar2=(p[25]-1.0); - xvar3=pow(vl,xvar2); - xvar3_vl=xvar3*xvar2/vl; - xvar3_Vrth=xvar3_vl*vl_Vrth; - xvar3_Vbci=xvar3_vl*vl_Vbci; - xvar1=-AVC2atT*xvar3; - xvar1_AVC2atT=-xvar3; - xvar1_xvar3=-AVC2atT; - xvar1_Vrth=xvar1_AVC2atT*AVC2atT_Vrth; - xvar1_Vrth=xvar1_Vrth+xvar1_xvar3*xvar3_Vrth; - xvar1_Vbci=xvar1_xvar3*xvar3_Vbci; - xvar4=exp(xvar1); - xvar4_xvar1=xvar4; - xvar4_Vrth=xvar4_xvar1*xvar1_Vrth; - xvar4_Vbci=xvar4_xvar1*xvar1_Vbci; - avalf=p[40]*vl*xvar4; - avalf_vl=p[40]*xvar4; - avalf_xvar4=p[40]*vl; - avalf_Vrth=avalf_vl*vl_Vrth; - avalf_Vbci=avalf_vl*vl_Vbci; - avalf_Vrth=avalf_Vrth+avalf_xvar4*xvar4_Vrth; - avalf_Vbci=avalf_Vbci+avalf_xvar4*xvar4_Vbci; - Igc=((*Itzf)-(*Itzr)-Ibcj)*avalf; - Igc_Itzf=avalf; - Igc_Itzr=-avalf; - Igc_Ibcj=-avalf; - Igc_avalf=-(*Itzr)+(*Itzf)-Ibcj; - Igc_Vrth=Igc_Itzf*(*Itzf_Vrth); - Igc_Vbei=Igc_Itzf*(*Itzf_Vbei); - Igc_Vbci=Igc_Itzf*(*Itzf_Vbci); - Igc_Vrth=Igc_Vrth+Igc_Itzr*(*Itzr_Vrth); - Igc_Vbci=Igc_Vbci+Igc_Itzr*(*Itzr_Vbci); - Igc_Vbei=Igc_Vbei+Igc_Itzr*(*Itzr_Vbei); - Igc_Vrth=Igc_Vrth+Igc_Ibcj*Ibcj_Vrth; - Igc_Vbci=Igc_Vbci+Igc_Ibcj*Ibcj_Vbci; - Igc_Vrth=Igc_Vrth+Igc_avalf*avalf_Vrth; - Igc_Vbci=Igc_Vbci+Igc_avalf*avalf_Vbci; - }else{ - Igc=0.0; - Igc_Vrth=0.0; - Igc_Vbei=0.0; - Igc_Vbci=0.0; - } - (*Ibc)=Ibcj-Igc; - Ibc_Ibcj=1.0; - Ibc_Igc=-1.0; - *Ibc_Vrth=Ibc_Ibcj*Ibcj_Vrth; - *Ibc_Vbci=Ibc_Ibcj*Ibcj_Vbci; - *Ibc_Vrth=(*Ibc_Vrth)+Ibc_Igc*Igc_Vrth; - *Ibc_Vbei=Ibc_Igc*Igc_Vbei; - *Ibc_Vbci=(*Ibc_Vbci)+Ibc_Igc*Igc_Vbci; - if(p[1]>0.0){ - (*Ircx)=(*Vrcx)/RCXatT; - *Ircx_Vrcx=1.0/RCXatT; - Ircx_RCXatT=-(*Vrcx)/(RCXatT*RCXatT); - *Ircx_Vrth=Ircx_RCXatT*RCXatT_Vrth; - }else{ - (*Ircx)=0.0; - *Ircx_Vrcx=0.0; - *Ircx_Vrth=0.0; - } - argi=(*Vbci)/Vtv; - argi_Vbci=1.0/Vtv; - argi_Vtv=-(*Vbci)/(Vtv*Vtv); - argi_Vrth=argi_Vtv*Vtv_Vrth; - expi=exp(argi); - expi_argi=expi; - expi_Vbci=expi_argi*argi_Vbci; - expi_Vrth=expi_argi*argi_Vrth; - argx=(*Vbcx)/Vtv; - argx_Vbcx=1.0/Vtv; - argx_Vtv=-(*Vbcx)/(Vtv*Vtv); - argx_Vrth=argx_Vtv*Vtv_Vrth; - expx=exp(argx); - expx_argx=expx; - expx_Vbcx=expx_argx*argx_Vbcx; - expx_Vrth=expx_argx*argx_Vrth; - Kbci=sqrt(1.0+GAMMatT*expi); - Kbci_GAMMatT=expi/(2.0*sqrt(expi*GAMMatT+1.0)); - Kbci_expi=GAMMatT/(2.0*sqrt(expi*GAMMatT+1.0)); - Kbci_Vrth=Kbci_GAMMatT*GAMMatT_Vrth; - Kbci_Vbci=Kbci_expi*expi_Vbci; - Kbci_Vrth=Kbci_Vrth+Kbci_expi*expi_Vrth; - Kbcx=sqrt(1.0+GAMMatT*expx); - Kbcx_GAMMatT=expx/(2.0*sqrt(expx*GAMMatT+1.0)); - Kbcx_expx=GAMMatT/(2.0*sqrt(expx*GAMMatT+1.0)); - Kbcx_Vrth=Kbcx_GAMMatT*GAMMatT_Vrth; - Kbcx_Vbcx=Kbcx_expx*expx_Vbcx; - Kbcx_Vrth=Kbcx_Vrth+Kbcx_expx*expx_Vrth; - if(p[2]>0.0){ - rKp1=(Kbci+1.0)/(Kbcx+1.0); - rKp1_Kbci=1.0/(Kbcx+1.0); - rKp1_Kbcx=-(Kbci+1.0)/((Kbcx+1.0)*(Kbcx+1.0)); - rKp1_Vrth=rKp1_Kbci*Kbci_Vrth; - rKp1_Vbci=rKp1_Kbci*Kbci_Vbci; - rKp1_Vrth=rKp1_Vrth+rKp1_Kbcx*Kbcx_Vrth; - rKp1_Vbcx=rKp1_Kbcx*Kbcx_Vbcx; - xvar1=log(rKp1); - xvar1_rKp1=1.0/rKp1; - xvar1_Vrth=xvar1_rKp1*rKp1_Vrth; - xvar1_Vbci=xvar1_rKp1*rKp1_Vbci; - xvar1_Vbcx=xvar1_rKp1*rKp1_Vbcx; - Iohm=((*Vrci)+Vtv*(Kbci-Kbcx-xvar1))/RCIatT; - Iohm_Vrci=1.0/RCIatT; - Iohm_Vtv=(-xvar1-Kbcx+Kbci)/RCIatT; - Iohm_Kbci=Vtv/RCIatT; - Iohm_Kbcx=-Vtv/RCIatT; - Iohm_xvar1=-Vtv/RCIatT; - Iohm_RCIatT=-(Vtv*(-xvar1-Kbcx+Kbci)+(*Vrci))/(RCIatT*RCIatT); - Iohm_Vrth=Iohm_Vtv*Vtv_Vrth; - Iohm_Vrth=Iohm_Vrth+Iohm_Kbci*Kbci_Vrth; - Iohm_Vbci=Iohm_Kbci*Kbci_Vbci; - Iohm_Vrth=Iohm_Vrth+Iohm_Kbcx*Kbcx_Vrth; - Iohm_Vbcx=Iohm_Kbcx*Kbcx_Vbcx; - Iohm_Vrth=Iohm_Vrth+Iohm_xvar1*xvar1_Vrth; - Iohm_Vbci=Iohm_Vbci+Iohm_xvar1*xvar1_Vbci; - Iohm_Vbcx=Iohm_Vbcx+Iohm_xvar1*xvar1_Vbcx; - Iohm_Vrth=Iohm_Vrth+Iohm_RCIatT*RCIatT_Vrth; - derf=IVO*RCIatT*Iohm/(1.0+0.5*IVO*IHRCF*sqrt((*Vrci)*(*Vrci)+0.01)); - derf_IVO=Iohm*RCIatT/(0.5*IHRCF*IVO*sqrt(((*Vrci)*(*Vrci))+0.01)+1.0)-0.5*IHRCF*Iohm*IVO*RCIatT*sqrt(((*Vrci)*(*Vrci))+0.01)/((0.5*IHRCF*IVO*sqrt(((*Vrci)*(*Vrci))+0.01)+1.0)*(0.5*IHRCF*IVO*sqrt(((*Vrci)*(*Vrci))+0.01)+1.0)); - derf_RCIatT=Iohm*IVO/(0.5*IHRCF*IVO*sqrt(((*Vrci)*(*Vrci))+0.01)+1.0); - derf_Iohm=IVO*RCIatT/(0.5*IHRCF*IVO*sqrt(((*Vrci)*(*Vrci))+0.01)+1.0); - derf_Vrci=-0.5*IHRCF*Iohm*(IVO*IVO)*RCIatT*(*Vrci)/(sqrt(((*Vrci)*(*Vrci))+0.01)*((0.5*IHRCF*IVO*sqrt(((*Vrci)*(*Vrci))+0.01)+1.0)*(0.5*IHRCF*IVO*sqrt(((*Vrci)*(*Vrci))+0.01)+1.0))); - derf_Vrth=derf_IVO*IVO_Vrth; - derf_Vrth=derf_Vrth+derf_RCIatT*RCIatT_Vrth; - derf_Vrci=derf_Vrci+derf_Iohm*Iohm_Vrci; - derf_Vrth=derf_Vrth+derf_Iohm*Iohm_Vrth; - derf_Vbci=derf_Iohm*Iohm_Vbci; - derf_Vbcx=derf_Iohm*Iohm_Vbcx; - (*Irci)=Iohm/sqrt(1.0+derf*derf); - Irci_Iohm=1.0/sqrt((derf*derf)+1.0); - Irci_derf=-derf*Iohm/pow(((derf*derf)+1.0),(3.0/2.0)); - *Irci_Vrci=Irci_Iohm*Iohm_Vrci; - *Irci_Vrth=Irci_Iohm*Iohm_Vrth; - *Irci_Vbci=Irci_Iohm*Iohm_Vbci; - *Irci_Vbcx=Irci_Iohm*Iohm_Vbcx; - *Irci_Vrth=(*Irci_Vrth)+Irci_derf*derf_Vrth; - *Irci_Vrci=(*Irci_Vrci)+Irci_derf*derf_Vrci; - *Irci_Vbci=(*Irci_Vbci)+Irci_derf*derf_Vbci; - *Irci_Vbcx=(*Irci_Vbcx)+Irci_derf*derf_Vbcx; - }else{ - (*Irci)=0.0; - *Irci_Vrci=0.0; - *Irci_Vrth=0.0; - *Irci_Vbci=0.0; - *Irci_Vbcx=0.0; - } - if(p[6]>0.0){ - (*Irbx)=(*Vrbx)/RBXatT; - *Irbx_Vrbx=1.0/RBXatT; - Irbx_RBXatT=-(*Vrbx)/(RBXatT*RBXatT); - *Irbx_Vrth=Irbx_RBXatT*RBXatT_Vrth; - }else{ - (*Irbx)=0.0; - *Irbx_Vrbx=0.0; - *Irbx_Vrth=0.0; - } - if(p[7]>0.0){ - (*Irbi)=(*Vrbi)*qb/RBIatT; - *Irbi_Vrbi=qb/RBIatT; - Irbi_qb=(*Vrbi)/RBIatT; - Irbi_RBIatT=-qb*(*Vrbi)/(RBIatT*RBIatT); - *Irbi_Vrth=Irbi_qb*qb_Vrth; - *Irbi_Vbei=Irbi_qb*qb_Vbei; - *Irbi_Vbci=Irbi_qb*qb_Vbci; - *Irbi_Vrth=(*Irbi_Vrth)+Irbi_RBIatT*RBIatT_Vrth; - }else{ - (*Irbi)=0.0; - *Irbi_Vrbi=0.0; - *Irbi_Vrth=0.0; - *Irbi_Vbei=0.0; - *Irbi_Vbci=0.0; - } - if(p[8]>0.0){ - (*Ire)=(*Vre)/REatT; - *Ire_Vre=1.0/REatT; - Ire_REatT=-(*Vre)/(REatT*REatT); - *Ire_Vrth=Ire_REatT*REatT_Vrth; - }else{ - (*Ire)=0.0; - *Ire_Vre=0.0; - *Ire_Vrth=0.0; - } - if(p[10]>0.0){ - (*Irbp)=(*Vrbp)*qbp/RBPatT; - *Irbp_Vrbp=qbp/RBPatT; - Irbp_qbp=(*Vrbp)/RBPatT; - Irbp_RBPatT=-qbp*(*Vrbp)/(RBPatT*RBPatT); - *Irbp_Vrth=Irbp_qbp*qbp_Vrth; - *Irbp_Vbep=Irbp_qbp*qbp_Vbep; - *Irbp_Vbci=Irbp_qbp*qbp_Vbci; - *Irbp_Vrth=(*Irbp_Vrth)+Irbp_RBPatT*RBPatT_Vrth; - }else{ - (*Irbp)=0.0; - *Irbp_Vrbp=0.0; - *Irbp_Vrth=0.0; - *Irbp_Vbep=0.0; - *Irbp_Vbci=0.0; - } - if((p[47]>0.0)||(p[49]>0.0)){ - argi=(*Vbcp)/(p[48]*Vtv); - argi_Vbcp=1.0/(p[48]*Vtv); - argi_Vtv=-(*Vbcp)/(p[48]*(Vtv*Vtv)); - argi_Vrth=argi_Vtv*Vtv_Vrth; - expi=exp(argi); - expi_argi=expi; - expi_Vbcp=expi_argi*argi_Vbcp; - expi_Vrth=expi_argi*argi_Vrth; - argn=(*Vbcp)/(p[50]*Vtv); - argn_Vbcp=1.0/(p[50]*Vtv); - argn_Vtv=-(*Vbcp)/(p[50]*(Vtv*Vtv)); - argn_Vrth=argn_Vtv*Vtv_Vrth; - expn=exp(argn); - expn_argn=expn; - expn_Vbcp=expn_argn*argn_Vbcp; - expn_Vrth=expn_argn*argn_Vrth; - (*Ibcp)=IBCIPatT*(expi-1.0)+IBCNPatT*(expn-1.0); - Ibcp_IBCIPatT=expi-1.0; - Ibcp_expi=IBCIPatT; - Ibcp_IBCNPatT=expn-1.0; - Ibcp_expn=IBCNPatT; - *Ibcp_Vrth=Ibcp_IBCIPatT*IBCIPatT_Vrth; - *Ibcp_Vbcp=Ibcp_expi*expi_Vbcp; - *Ibcp_Vrth=(*Ibcp_Vrth)+Ibcp_expi*expi_Vrth; - *Ibcp_Vrth=(*Ibcp_Vrth)+Ibcp_IBCNPatT*IBCNPatT_Vrth; - *Ibcp_Vbcp=(*Ibcp_Vbcp)+Ibcp_expn*expn_Vbcp; - *Ibcp_Vrth=(*Ibcp_Vrth)+Ibcp_expn*expn_Vrth; - }else{ - (*Ibcp)=0.0; - *Ibcp_Vrth=0.0; - *Ibcp_Vbcp=0.0; - } - if(p[9]>0.0){ - (*Irs)=(*Vrs)/RSatT; - *Irs_Vrs=1.0/RSatT; - Irs_RSatT=-(*Vrs)/(RSatT*RSatT); - *Irs_Vrth=Irs_RSatT*RSatT_Vrth; - }else{ - (*Irs)=0.0; - *Irs_Vrs=0.0; - *Irs_Vrth=0.0; - } - if(Ifi>0.0){ - sgIf=1.0; - }else{ - sgIf=0.0; - } - rIf=Ifi*sgIf*IITF; - rIf_Ifi=IITF*sgIf; - rIf_Vrth=rIf_Ifi*Ifi_Vrth; - rIf_Vbei=rIf_Ifi*Ifi_Vbei; - mIf=rIf/(rIf+1.0); - mIf_rIf=1.0/(rIf+1.0)-rIf/((rIf+1.0)*(rIf+1.0)); - mIf_Vrth=mIf_rIf*rIf_Vrth; - mIf_Vbei=mIf_rIf*rIf_Vbei; - xvar1=(*Vbci)*IVTF/1.44; - xvar1_Vbci=0.6944444*IVTF; - xvar2=exp(xvar1); - xvar2_xvar1=xvar2; - xvar2_Vbci=xvar2_xvar1*xvar1_Vbci; - tff=p[56]*(1.0+p[57]*q1)*(1.0+p[58]*xvar2*(slTF+mIf*mIf)*sgIf); - tff_q1=p[57]*p[56]*(sgIf*(slTF+(mIf*mIf))*p[58]*xvar2+1.0); - tff_xvar2=(q1*p[57]+1.0)*sgIf*(slTF+(mIf*mIf))*p[56]*p[58]; - tff_mIf=2.0*mIf*(q1*p[57]+1.0)*sgIf*p[56]*p[58]*xvar2; - tff_Vrth=tff_q1*q1_Vrth; - tff_Vbei=tff_q1*q1_Vbei; - tff_Vbci=tff_q1*q1_Vbci; - tff_Vbci=tff_Vbci+tff_xvar2*xvar2_Vbci; - tff_Vrth=tff_Vrth+tff_mIf*mIf_Vrth; - tff_Vbei=tff_Vbei+tff_mIf*mIf_Vbei; - (*Qbe)=CJEatT*qdbe*p[32]+tff*Ifi/qb; - Qbe_CJEatT=qdbe*p[32]; - Qbe_qdbe=CJEatT*p[32]; - Qbe_tff=Ifi/qb; - Qbe_Ifi=tff/qb; - Qbe_qb=-Ifi*tff/(qb*qb); - *Qbe_Vrth=Qbe_CJEatT*CJEatT_Vrth; - *Qbe_Vrth=(*Qbe_Vrth)+Qbe_qdbe*qdbe_Vrth; - *Qbe_Vbei=Qbe_qdbe*qdbe_Vbei; - *Qbe_Vrth=(*Qbe_Vrth)+Qbe_tff*tff_Vrth; - *Qbe_Vbei=(*Qbe_Vbei)+Qbe_tff*tff_Vbei; - *Qbe_Vbci=Qbe_tff*tff_Vbci; - *Qbe_Vrth=(*Qbe_Vrth)+Qbe_Ifi*Ifi_Vrth; - *Qbe_Vbei=(*Qbe_Vbei)+Qbe_Ifi*Ifi_Vbei; - *Qbe_Vrth=(*Qbe_Vrth)+Qbe_qb*qb_Vrth; - *Qbe_Vbei=(*Qbe_Vbei)+Qbe_qb*qb_Vbei; - *Qbe_Vbci=(*Qbe_Vbci)+Qbe_qb*qb_Vbci; - (*Qbex)=CJEatT*qdbex*(1.0-p[32]); - Qbex_CJEatT=qdbex*(1.0-p[32]); - Qbex_qdbex=CJEatT*(1.0-p[32]); - *Qbex_Vrth=Qbex_CJEatT*CJEatT_Vrth; - *Qbex_Vrth=(*Qbex_Vrth)+Qbex_qdbex*qdbex_Vrth; - *Qbex_Vbex=Qbex_qdbex*qdbex_Vbex; - (*Qbc)=CJCatT*qdbc+p[61]*Iri+p[22]*Kbci; - Qbc_CJCatT=qdbc; - Qbc_qdbc=CJCatT; - Qbc_Iri=p[61]; - Qbc_Kbci=p[22]; - *Qbc_Vrth=Qbc_CJCatT*CJCatT_Vrth; - *Qbc_Vrth=(*Qbc_Vrth)+Qbc_qdbc*qdbc_Vrth; - *Qbc_Vbci=Qbc_qdbc*qdbc_Vbci; - *Qbc_Vrth=(*Qbc_Vrth)+Qbc_Iri*Iri_Vrth; - *Qbc_Vbci=(*Qbc_Vbci)+Qbc_Iri*Iri_Vbci; - *Qbc_Vrth=(*Qbc_Vrth)+Qbc_Kbci*Kbci_Vrth; - *Qbc_Vbci=(*Qbc_Vbci)+Qbc_Kbci*Kbci_Vbci; - (*Qbcx)=p[22]*Kbcx; - Qbcx_Kbcx=p[22]; - *Qbcx_Vrth=Qbcx_Kbcx*Kbcx_Vrth; - *Qbcx_Vbcx=Qbcx_Kbcx*Kbcx_Vbcx; - (*Qbep)=CJEPatT*qdbep+p[61]*Ifp; - Qbep_CJEPatT=qdbep; - Qbep_qdbep=CJEPatT; - Qbep_Ifp=p[61]; - *Qbep_Vrth=Qbep_CJEPatT*CJEPatT_Vrth; - *Qbep_Vrth=(*Qbep_Vrth)+Qbep_qdbep*qdbep_Vrth; - *Qbep_Vbep=Qbep_qdbep*qdbep_Vbep; - *Qbep_Vrth=(*Qbep_Vrth)+Qbep_Ifp*Ifp_Vrth; - *Qbep_Vbep=(*Qbep_Vbep)+Qbep_Ifp*Ifp_Vbep; - *Qbep_Vbci=Qbep_Ifp*Ifp_Vbci; - (*Qbcp)=CJCPatT*qdbcp+p[87]*(*Vbcp); - Qbcp_CJCPatT=qdbcp; - Qbcp_qdbcp=CJCPatT; - *Qbcp_Vbcp=p[87]; - *Qbcp_Vrth=Qbcp_CJCPatT*CJCPatT_Vrth; - *Qbcp_Vrth=(*Qbcp_Vrth)+Qbcp_qdbcp*qdbcp_Vrth; - *Qbcp_Vbcp=(*Qbcp_Vbcp)+Qbcp_qdbcp*qdbcp_Vbcp; - (*Qbeo)=(*Vbe)*p[15]; - *Qbeo_Vbe=p[15]; - (*Qbco)=(*Vbc)*p[20]; - *Qbco_Vbc=p[20]; - (*Ith)=-((*Ibe)*(*Vbei)+(*Ibc)*(*Vbci)+((*Itzf)-(*Itzr))*(*Vcei)+(*Ibex)*(*Vbex)+(*Ibep)*(*Vbep)+(*Irs)*(*Vrs)+(*Ibcp)*(*Vbcp)+(*Iccp)*(*Vcep)+(*Ircx)*(*Vrcx)+(*Irci)*(*Vrci)+(*Irbx)*(*Vrbx)+(*Irbi)*(*Vrbi)+(*Ire)*(*Vre)+(*Irbp)*(*Vrbp)); - Ith_Ibe=-(*Vbei); - *Ith_Vbei=-(*Ibe); - Ith_Ibc=-(*Vbci); - *Ith_Vbci=-(*Ibc); - Ith_Itzf=-(*Vcei); - Ith_Itzr=(*Vcei); - *Ith_Vcei=(*Itzr)-(*Itzf); - Ith_Ibex=-(*Vbex); - *Ith_Vbex=-(*Ibex); - Ith_Ibep=-(*Vbep); - *Ith_Vbep=-(*Ibep); - Ith_Irs=-(*Vrs); - *Ith_Vrs=-(*Irs); - Ith_Ibcp=-(*Vbcp); - *Ith_Vbcp=-(*Ibcp); - Ith_Iccp=-(*Vcep); - *Ith_Vcep=-(*Iccp); - Ith_Ircx=-(*Vrcx); - *Ith_Vrcx=-(*Ircx); - Ith_Irci=-(*Vrci); - *Ith_Vrci=-(*Irci); - Ith_Irbx=-(*Vrbx); - *Ith_Vrbx=-(*Irbx); - Ith_Irbi=-(*Vrbi); - *Ith_Vrbi=-(*Irbi); - Ith_Ire=-(*Vre); - *Ith_Vre=-(*Ire); - Ith_Irbp=-(*Vrbp); - *Ith_Vrbp=-(*Irbp); - *Ith_Vrth=Ith_Ibe*(*Ibe_Vrth); - *Ith_Vbei=(*Ith_Vbei)+Ith_Ibe*(*Ibe_Vbei); - *Ith_Vrth=(*Ith_Vrth)+Ith_Ibc*(*Ibc_Vrth); - *Ith_Vbci=(*Ith_Vbci)+Ith_Ibc*(*Ibc_Vbci); - *Ith_Vbei=(*Ith_Vbei)+Ith_Ibc*(*Ibc_Vbei); - *Ith_Vrth=(*Ith_Vrth)+Ith_Itzf*(*Itzf_Vrth); - *Ith_Vbei=(*Ith_Vbei)+Ith_Itzf*(*Itzf_Vbei); - *Ith_Vbci=(*Ith_Vbci)+Ith_Itzf*(*Itzf_Vbci); - *Ith_Vrth=(*Ith_Vrth)+Ith_Itzr*(*Itzr_Vrth); - *Ith_Vbci=(*Ith_Vbci)+Ith_Itzr*(*Itzr_Vbci); - *Ith_Vbei=(*Ith_Vbei)+Ith_Itzr*(*Itzr_Vbei); - *Ith_Vrth=(*Ith_Vrth)+Ith_Ibex*(*Ibex_Vrth); - *Ith_Vbex=(*Ith_Vbex)+Ith_Ibex*(*Ibex_Vbex); - *Ith_Vrth=(*Ith_Vrth)+Ith_Ibep*(*Ibep_Vrth); - *Ith_Vbep=(*Ith_Vbep)+Ith_Ibep*(*Ibep_Vbep); - *Ith_Vrs=(*Ith_Vrs)+Ith_Irs*(*Irs_Vrs); - *Ith_Vrth=(*Ith_Vrth)+Ith_Irs*(*Irs_Vrth); - *Ith_Vrth=(*Ith_Vrth)+Ith_Ibcp*(*Ibcp_Vrth); - *Ith_Vbcp=(*Ith_Vbcp)+Ith_Ibcp*(*Ibcp_Vbcp); - *Ith_Vrth=(*Ith_Vrth)+Ith_Iccp*(*Iccp_Vrth); - *Ith_Vbep=(*Ith_Vbep)+Ith_Iccp*(*Iccp_Vbep); - *Ith_Vbci=(*Ith_Vbci)+Ith_Iccp*(*Iccp_Vbci); - *Ith_Vbcp=(*Ith_Vbcp)+Ith_Iccp*(*Iccp_Vbcp); - *Ith_Vrcx=(*Ith_Vrcx)+Ith_Ircx*(*Ircx_Vrcx); - *Ith_Vrth=(*Ith_Vrth)+Ith_Ircx*(*Ircx_Vrth); - *Ith_Vrci=(*Ith_Vrci)+Ith_Irci*(*Irci_Vrci); - *Ith_Vrth=(*Ith_Vrth)+Ith_Irci*(*Irci_Vrth); - *Ith_Vbci=(*Ith_Vbci)+Ith_Irci*(*Irci_Vbci); - *Ith_Vbcx=Ith_Irci*(*Irci_Vbcx); - *Ith_Vrbx=(*Ith_Vrbx)+Ith_Irbx*(*Irbx_Vrbx); - *Ith_Vrth=(*Ith_Vrth)+Ith_Irbx*(*Irbx_Vrth); - *Ith_Vrbi=(*Ith_Vrbi)+Ith_Irbi*(*Irbi_Vrbi); - *Ith_Vrth=(*Ith_Vrth)+Ith_Irbi*(*Irbi_Vrth); - *Ith_Vbei=(*Ith_Vbei)+Ith_Irbi*(*Irbi_Vbei); - *Ith_Vbci=(*Ith_Vbci)+Ith_Irbi*(*Irbi_Vbci); - *Ith_Vre=(*Ith_Vre)+Ith_Ire*(*Ire_Vre); - *Ith_Vrth=(*Ith_Vrth)+Ith_Ire*(*Ire_Vrth); - *Ith_Vrbp=(*Ith_Vrbp)+Ith_Irbp*(*Irbp_Vrbp); - *Ith_Vrth=(*Ith_Vrth)+Ith_Irbp*(*Irbp_Vrth); - *Ith_Vbep=(*Ith_Vbep)+Ith_Irbp*(*Irbp_Vbep); - *Ith_Vbci=(*Ith_Vbci)+Ith_Irbp*(*Irbp_Vbci); - if(p[83]>0.0){ - (*Irth)=(*Vrth)/p[83]; - *Irth_Vrth=1.0/p[83]; - }else{ - (*Irth)=0.0; - *Irth_Vrth=0.0; - } - (*Qcth)=(*Vrth)*p[84]; - *Qcth_Vrth=p[84]; - -/* Scale outputs */ - - if((*SCALE)!=1.0){ - *Ibe=(*SCALE)*(*Ibe); - *Ibe_Vrth=(*SCALE)*(*Ibe_Vrth); - *Ibe_Vbei=(*SCALE)*(*Ibe_Vbei); - *Ibex=(*SCALE)*(*Ibex); - *Ibex_Vrth=(*SCALE)*(*Ibex_Vrth); - *Ibex_Vbex=(*SCALE)*(*Ibex_Vbex); - *Itzf=(*SCALE)*(*Itzf); - *Itzf_Vrth=(*SCALE)*(*Itzf_Vrth); - *Itzf_Vbei=(*SCALE)*(*Itzf_Vbei); - *Itzf_Vbci=(*SCALE)*(*Itzf_Vbci); - *Itzr=(*SCALE)*(*Itzr); - *Itzr_Vrth=(*SCALE)*(*Itzr_Vrth); - *Itzr_Vbci=(*SCALE)*(*Itzr_Vbci); - *Itzr_Vbei=(*SCALE)*(*Itzr_Vbei); - *Ibc=(*SCALE)*(*Ibc); - *Ibc_Vrth=(*SCALE)*(*Ibc_Vrth); - *Ibc_Vbci=(*SCALE)*(*Ibc_Vbci); - *Ibc_Vbei=(*SCALE)*(*Ibc_Vbei); - *Ibep=(*SCALE)*(*Ibep); - *Ibep_Vrth=(*SCALE)*(*Ibep_Vrth); - *Ibep_Vbep=(*SCALE)*(*Ibep_Vbep); - *Ircx=(*SCALE)*(*Ircx); - *Ircx_Vrcx=(*SCALE)*(*Ircx_Vrcx); - *Ircx_Vrth=(*SCALE)*(*Ircx_Vrth); - *Irci=(*SCALE)*(*Irci); - *Irci_Vrci=(*SCALE)*(*Irci_Vrci); - *Irci_Vrth=(*SCALE)*(*Irci_Vrth); - *Irci_Vbci=(*SCALE)*(*Irci_Vbci); - *Irci_Vbcx=(*SCALE)*(*Irci_Vbcx); - *Irbx=(*SCALE)*(*Irbx); - *Irbx_Vrbx=(*SCALE)*(*Irbx_Vrbx); - *Irbx_Vrth=(*SCALE)*(*Irbx_Vrth); - *Irbi=(*SCALE)*(*Irbi); - *Irbi_Vrbi=(*SCALE)*(*Irbi_Vrbi); - *Irbi_Vrth=(*SCALE)*(*Irbi_Vrth); - *Irbi_Vbei=(*SCALE)*(*Irbi_Vbei); - *Irbi_Vbci=(*SCALE)*(*Irbi_Vbci); - *Ire=(*SCALE)*(*Ire); - *Ire_Vre=(*SCALE)*(*Ire_Vre); - *Ire_Vrth=(*SCALE)*(*Ire_Vrth); - *Irbp=(*SCALE)*(*Irbp); - *Irbp_Vrbp=(*SCALE)*(*Irbp_Vrbp); - *Irbp_Vrth=(*SCALE)*(*Irbp_Vrth); - *Irbp_Vbep=(*SCALE)*(*Irbp_Vbep); - *Irbp_Vbci=(*SCALE)*(*Irbp_Vbci); - *Qbe=(*SCALE)*(*Qbe); - *Qbe_Vrth=(*SCALE)*(*Qbe_Vrth); - *Qbe_Vbei=(*SCALE)*(*Qbe_Vbei); - *Qbe_Vbci=(*SCALE)*(*Qbe_Vbci); - *Qbex=(*SCALE)*(*Qbex); - *Qbex_Vrth=(*SCALE)*(*Qbex_Vrth); - *Qbex_Vbex=(*SCALE)*(*Qbex_Vbex); - *Qbc=(*SCALE)*(*Qbc); - *Qbc_Vrth=(*SCALE)*(*Qbc_Vrth); - *Qbc_Vbci=(*SCALE)*(*Qbc_Vbci); - *Qbcx=(*SCALE)*(*Qbcx); - *Qbcx_Vrth=(*SCALE)*(*Qbcx_Vrth); - *Qbcx_Vbcx=(*SCALE)*(*Qbcx_Vbcx); - *Qbep=(*SCALE)*(*Qbep); - *Qbep_Vrth=(*SCALE)*(*Qbep_Vrth); - *Qbep_Vbep=(*SCALE)*(*Qbep_Vbep); - *Qbep_Vbci=(*SCALE)*(*Qbep_Vbci); - *Qbeo=(*SCALE)*(*Qbeo); - *Qbeo_Vbe=(*SCALE)*(*Qbeo_Vbe); - *Qbco=(*SCALE)*(*Qbco); - *Qbco_Vbc=(*SCALE)*(*Qbco_Vbc); - *Ibcp=(*SCALE)*(*Ibcp); - *Ibcp_Vrth=(*SCALE)*(*Ibcp_Vrth); - *Ibcp_Vbcp=(*SCALE)*(*Ibcp_Vbcp); - *Iccp=(*SCALE)*(*Iccp); - *Iccp_Vrth=(*SCALE)*(*Iccp_Vrth); - *Iccp_Vbep=(*SCALE)*(*Iccp_Vbep); - *Iccp_Vbci=(*SCALE)*(*Iccp_Vbci); - *Iccp_Vbcp=(*SCALE)*(*Iccp_Vbcp); - *Irs=(*SCALE)*(*Irs); - *Irs_Vrs=(*SCALE)*(*Irs_Vrs); - *Irs_Vrth=(*SCALE)*(*Irs_Vrth); - *Qbcp=(*SCALE)*(*Qbcp); - *Qbcp_Vrth=(*SCALE)*(*Qbcp_Vrth); - *Qbcp_Vbcp=(*SCALE)*(*Qbcp_Vbcp); - *Irth=(*SCALE)*(*Irth); - *Irth_Vrth=(*SCALE)*(*Irth_Vrth); - *Ith=(*SCALE)*(*Ith); - *Ith_Vrth=(*SCALE)*(*Ith_Vrth); - *Ith_Vbei=(*SCALE)*(*Ith_Vbei); - *Ith_Vbci=(*SCALE)*(*Ith_Vbci); - *Ith_Vcei=(*SCALE)*(*Ith_Vcei); - *Ith_Vbex=(*SCALE)*(*Ith_Vbex); - *Ith_Vbep=(*SCALE)*(*Ith_Vbep); - *Ith_Vrs=(*SCALE)*(*Ith_Vrs); - *Ith_Vbcp=(*SCALE)*(*Ith_Vbcp); - *Ith_Vcep=(*SCALE)*(*Ith_Vcep); - *Ith_Vrcx=(*SCALE)*(*Ith_Vrcx); - *Ith_Vrci=(*SCALE)*(*Ith_Vrci); - *Ith_Vbcx=(*SCALE)*(*Ith_Vbcx); - *Ith_Vrbx=(*SCALE)*(*Ith_Vrbx); - *Ith_Vrbi=(*SCALE)*(*Ith_Vrbi); - *Ith_Vre=(*SCALE)*(*Ith_Vre); - *Ith_Vrbp=(*SCALE)*(*Ith_Vrbp); - *Qcth=(*SCALE)*(*Qcth); - *Qcth_Vrth=(*SCALE)*(*Qcth_Vrth); - } - return(0); -} diff --git a/src/spicelib/devices/vbic/vbicmask.c b/src/spicelib/devices/vbic/vbicmask.c deleted file mode 100644 index d5f61d901..000000000 --- a/src/spicelib/devices/vbic/vbicmask.c +++ /dev/null @@ -1,377 +0,0 @@ -/********** -Copyright 1990 Regents of the University of California. All rights reserved. -Author: 1987 Mathew Lew and Thomas L. Quarles -Model Author: 1995 Colin McAndrew Motorola -Spice3 Implementation: 2003 Dietmar Warning DAnalyse GmbH -**********/ - -#include "ngspice/ngspice.h" -#include "ngspice/const.h" -#include "ngspice/ifsim.h" -#include "ngspice/cktdefs.h" -#include "ngspice/devdefs.h" -#include "vbicdefs.h" -#include "ngspice/sperror.h" -#include "ngspice/suffix.h" - - -/*ARGSUSED*/ -int -VBICmAsk(CKTcircuit *ckt, GENmodel *instPtr, int which, IFvalue *value) -{ - VBICmodel *here = (VBICmodel*)instPtr; - - NG_IGNORE(ckt); - - switch(which) { - case VBIC_MOD_TNOM: - value->rValue = here->VBICtnom; - return(OK); - case VBIC_MOD_RCX: - value->rValue = here->VBICextCollResist; - return(OK); - case VBIC_MOD_RCI: - value->rValue = here->VBICintCollResist; - return(OK); - case VBIC_MOD_VO: - value->rValue = here->VBICepiSatVoltage; - return(OK); - case VBIC_MOD_GAMM: - value->rValue = here->VBICepiDoping; - return(OK); - case VBIC_MOD_HRCF: - value->rValue = here->VBIChighCurFac; - return(OK); - case VBIC_MOD_RBX: - value->rValue = here->VBICextBaseResist; - return(OK); - case VBIC_MOD_RBI: - value->rValue = here->VBICintBaseResist; - return(OK); - case VBIC_MOD_RE: - value->rValue = here->VBICemitterResist; - return(OK); - case VBIC_MOD_RS: - value->rValue = here->VBICsubstrateResist; - return(OK); - case VBIC_MOD_RBP: - value->rValue = here->VBICparBaseResist; - return(OK); - case VBIC_MOD_IS: - value->rValue = here->VBICsatCur; - return(OK); - case VBIC_MOD_NF: - value->rValue = here->VBICemissionCoeffF; - return(OK); - case VBIC_MOD_NR: - value->rValue = here->VBICemissionCoeffR; - return(OK); - case VBIC_MOD_FC: - value->rValue = here->VBICdeplCapLimitF; - return(OK); - case VBIC_MOD_CBEO: - value->rValue = here->VBICextOverlapCapBE; - return(OK); - case VBIC_MOD_CJE: - value->rValue = here->VBICdepletionCapBE; - return(OK); - case VBIC_MOD_PE: - value->rValue = here->VBICpotentialBE; - return(OK); - case VBIC_MOD_ME: - value->rValue = here->VBICjunctionExpBE; - return(OK); - case VBIC_MOD_AJE: - value->rValue = here->VBICsmoothCapBE; - return(OK); - case VBIC_MOD_CBCO: - value->rValue = here->VBICextOverlapCapBC; - return(OK); - case VBIC_MOD_CJC: - value->rValue = here->VBICdepletionCapBC; - return(OK); - case VBIC_MOD_QCO: - value->rValue = here->VBICepiCharge; - return(OK); - case VBIC_MOD_CJEP: - value->rValue = here->VBICextCapBC; - return(OK); - case VBIC_MOD_PC: - value->rValue = here->VBICpotentialBC; - return(OK); - case VBIC_MOD_MC: - value->rValue = here->VBICjunctionExpBC; - return(OK); - case VBIC_MOD_AJC: - value->rValue = here->VBICsmoothCapBC; - return(OK); - case VBIC_MOD_CJCP: - value->rValue = here->VBICextCapSC; - return(OK); - case VBIC_MOD_PS: - value->rValue = here->VBICpotentialSC; - return(OK); - case VBIC_MOD_MS: - value->rValue = here->VBICjunctionExpSC; - return(OK); - case VBIC_MOD_AJS: - value->rValue = here->VBICsmoothCapSC; - return(OK); - case VBIC_MOD_IBEI: - value->rValue = here->VBICidealSatCurBE; - return(OK); - case VBIC_MOD_WBE: - value->rValue = here->VBICportionIBEI; - return(OK); - case VBIC_MOD_NEI: - value->rValue = here->VBICidealEmissCoeffBE; - return(OK); - case VBIC_MOD_IBEN: - value->rValue = here->VBICnidealSatCurBE; - return(OK); - case VBIC_MOD_NEN: - value->rValue = here->VBICnidealEmissCoeffBE; - return(OK); - case VBIC_MOD_IBCI: - value->rValue = here->VBICidealSatCurBC; - return(OK); - case VBIC_MOD_NCI: - value->rValue = here->VBICidealEmissCoeffBC; - return(OK); - case VBIC_MOD_IBCN: - value->rValue = here->VBICnidealSatCurBC; - return(OK); - case VBIC_MOD_NCN: - value->rValue = here->VBICnidealEmissCoeffBC; - return(OK); - case VBIC_MOD_AVC1: - value->rValue = here->VBICavalanchePar1BC; - return(OK); - case VBIC_MOD_AVC2: - value->rValue = here->VBICavalanchePar2BC; - return(OK); - case VBIC_MOD_ISP: - value->rValue = here->VBICparasitSatCur; - return(OK); - case VBIC_MOD_WSP: - value->rValue = here->VBICportionICCP; - return(OK); - case VBIC_MOD_NFP: - value->rValue = here->VBICparasitFwdEmissCoeff; - return(OK); - case VBIC_MOD_IBEIP: - value->rValue = here->VBICidealParasitSatCurBE; - return(OK); - case VBIC_MOD_IBENP: - value->rValue = here->VBICnidealParasitSatCurBE; - return(OK); - case VBIC_MOD_IBCIP: - value->rValue = here->VBICidealParasitSatCurBC; - return(OK); - case VBIC_MOD_NCIP: - value->rValue = here->VBICidealParasitEmissCoeffBC; - return(OK); - case VBIC_MOD_IBCNP: - value->rValue = here->VBICnidealParasitSatCurBC; - return(OK); - case VBIC_MOD_NCNP: - value->rValue = here->VBICnidealParasitEmissCoeffBC; - return(OK); - case VBIC_MOD_VEF: - value->rValue = here->VBICearlyVoltF; - return(OK); - case VBIC_MOD_VER: - value->rValue = here->VBICearlyVoltR; - return(OK); - case VBIC_MOD_IKF: - value->rValue = here->VBICrollOffF; - return(OK); - case VBIC_MOD_IKR: - value->rValue = here->VBICrollOffR; - return(OK); - case VBIC_MOD_IKP: - value->rValue = here->VBICparRollOff; - return(OK); - case VBIC_MOD_TF: - value->rValue = here->VBICtransitTimeF; - return(OK); - case VBIC_MOD_QTF: - value->rValue = here->VBICvarTransitTimeF; - return(OK); - case VBIC_MOD_XTF: - value->rValue = here->VBICtransitTimeBiasCoeffF; - return(OK); - case VBIC_MOD_VTF: - value->rValue = here->VBICtransitTimeFVBC; - return(OK); - case VBIC_MOD_ITF: - value->rValue = here->VBICtransitTimeHighCurrentF; - return(OK); - case VBIC_MOD_TR: - value->rValue = here->VBICtransitTimeR; - return(OK); - case VBIC_MOD_TD: - value->rValue = here->VBICdelayTimeF; - return(OK); - case VBIC_MOD_KFN: - value->rValue = here->VBICfNcoef; - return(OK); - case VBIC_MOD_AFN: - value->rValue = here->VBICfNexpA; - return(OK); - case VBIC_MOD_BFN: - value->rValue = here->VBICfNexpB; - return(OK); - case VBIC_MOD_XRE: - value->rValue = here->VBICtempExpRE; - return(OK); - case VBIC_MOD_XRB: - value->rValue = here->VBICtempExpRB; - return(OK); - case VBIC_MOD_XRBI: - value->rValue = here->VBICtempExpRBI; - return(OK); - case VBIC_MOD_XRC: - value->rValue = here->VBICtempExpRC; - return(OK); - case VBIC_MOD_XRCI: - value->rValue = here->VBICtempExpRCI; - return(OK); - case VBIC_MOD_XRS: - value->rValue = here->VBICtempExpRS; - return(OK); - case VBIC_MOD_XVO: - value->rValue = here->VBICtempExpVO; - return(OK); - case VBIC_MOD_EA: - value->rValue = here->VBICactivEnergyEA; - return(OK); - case VBIC_MOD_EAIE: - value->rValue = here->VBICactivEnergyEAIE; - return(OK); - case VBIC_MOD_EAIC: - value->rValue = here->VBICactivEnergyEAIC; - return(OK); - case VBIC_MOD_EAIS: - value->rValue = here->VBICactivEnergyEAIS; - return(OK); - case VBIC_MOD_EANE: - value->rValue = here->VBICactivEnergyEANE; - return(OK); - case VBIC_MOD_EANC: - value->rValue = here->VBICactivEnergyEANC; - return(OK); - case VBIC_MOD_EANS: - value->rValue = here->VBICactivEnergyEANS; - return(OK); - case VBIC_MOD_XIS: - value->rValue = here->VBICtempExpIS; - return(OK); - case VBIC_MOD_XII: - value->rValue = here->VBICtempExpII; - return(OK); - case VBIC_MOD_XIN: - value->rValue = here->VBICtempExpIN; - return(OK); - case VBIC_MOD_TNF: - value->rValue = here->VBICtempExpNF; - return(OK); - case VBIC_MOD_TAVC: - value->rValue = here->VBICtempExpAVC; - return(OK); - case VBIC_MOD_RTH: - value->rValue = here->VBICthermalResist; - return(OK); - case VBIC_MOD_CTH: - value->rValue = here->VBICthermalCapacitance; - return(OK); - case VBIC_MOD_VRT: - value->rValue = here->VBICpunchThroughVoltageBC; - return(OK); - case VBIC_MOD_ART: - value->rValue = here->VBICdeplCapCoeff1; - return(OK); - case VBIC_MOD_CCSO: - value->rValue = here->VBICfixedCapacitanceCS; - return(OK); - case VBIC_MOD_QBM: - value->rValue = here->VBICsgpQBselector; - return(OK); - case VBIC_MOD_NKF: - value->rValue = here->VBIChighCurrentBetaRolloff; - return(OK); - case VBIC_MOD_XIKF: - value->rValue = here->VBICtempExpIKF; - return(OK); - case VBIC_MOD_XRCX: - value->rValue = here->VBICtempExpRCX; - return(OK); - case VBIC_MOD_XRBX: - value->rValue = here->VBICtempExpRBX; - return(OK); - case VBIC_MOD_XRBP: - value->rValue = here->VBICtempExpRBP; - return(OK); - case VBIC_MOD_ISRR: - value->rValue = here->VBICsepISRR; - return(OK); - case VBIC_MOD_XISR: - value->rValue = here->VBICtempExpXISR; - return(OK); - case VBIC_MOD_DEAR: - value->rValue = here->VBICdear; - return(OK); - case VBIC_MOD_EAP: - value->rValue = here->VBICeap; - return(OK); - case VBIC_MOD_VBBE: - value->rValue = here->VBICvbbe; - return(OK); - case VBIC_MOD_NBBE: - value->rValue = here->VBICnbbe; - return(OK); - case VBIC_MOD_IBBE: - value->rValue = here->VBICibbe; - return(OK); - case VBIC_MOD_TVBBE1: - value->rValue = here->VBICtvbbe1; - return(OK); - case VBIC_MOD_TVBBE2: - value->rValue = here->VBICtvbbe2; - return(OK); - case VBIC_MOD_TNBBE: - value->rValue = here->VBICtnbbe; - return(OK); - case VBIC_MOD_EBBE: - value->rValue = here->VBICebbe; - return(OK); - case VBIC_MOD_DTEMP: - value->rValue = here->VBIClocTempDiff; - return(OK); - case VBIC_MOD_VERS: - value->rValue = here->VBICrevVersion; - return(OK); - case VBIC_MOD_VREF: - value->rValue = here->VBICrefVersion; - return(OK); - case VBIC_MOD_VBE_MAX: - value->rValue = here->VBICvbeMax; - return(OK); - case VBIC_MOD_VBC_MAX: - value->rValue = here->VBICvbcMax; - return(OK); - case VBIC_MOD_VCE_MAX: - value->rValue = here->VBICvceMax; - return(OK); - case VBIC_MOD_TYPE: - if (here->VBICtype == NPN) - value->sValue = "npn"; - else - value->sValue = "pnp"; - return(OK); - default: - return(E_BADPARM); - } - /* NOTREACHED */ -} - diff --git a/src/spicelib/devices/vbic/vbicmpar.c b/src/spicelib/devices/vbic/vbicmpar.c deleted file mode 100644 index 16bd00386..000000000 --- a/src/spicelib/devices/vbic/vbicmpar.c +++ /dev/null @@ -1,516 +0,0 @@ -/********** -Copyright 1990 Regents of the University of California. All rights reserved. -Author: 1985 Thomas L. Quarles -Model Author: 1995 Colin McAndrew Motorola -Spice3 Implementation: 2003 Dietmar Warning DAnalyse GmbH -**********/ - -/* - * This routine sets model parameters for - * VBICs in the circuit. - */ - -#include "ngspice/ngspice.h" -#include "ngspice/const.h" -#include "ngspice/ifsim.h" -#include "vbicdefs.h" -#include "ngspice/sperror.h" -#include "ngspice/suffix.h" - -#define R_MIN 0.01 - -int -VBICmParam(int param, IFvalue *value, GENmodel *inModel) -{ - VBICmodel *mods = (VBICmodel*)inModel; - - switch(param) { - case VBIC_MOD_NPN: - if(value->iValue) { - mods->VBICtype = NPN; - } - break; - case VBIC_MOD_PNP: - if(value->iValue) { - mods->VBICtype = PNP; - } - break; - - case VBIC_MOD_TNOM: - mods->VBICtnom = value->rValue; - mods->VBICtnomGiven = TRUE; - break; - case VBIC_MOD_RCX: - mods->VBICextCollResist = value->rValue; - if (mods->VBICextCollResist < R_MIN) { - mods->VBICextCollResist = R_MIN; - } - mods->VBICextCollResistGiven = TRUE; - break; - case VBIC_MOD_RCI: - mods->VBICintCollResist = value->rValue; - if (mods->VBICintCollResist < R_MIN) { - mods->VBICintCollResist = R_MIN; - } - mods->VBICintCollResistGiven = TRUE; - break; - case VBIC_MOD_VO: - mods->VBICepiSatVoltage = value->rValue; - mods->VBICepiSatVoltageGiven = TRUE; - break; - case VBIC_MOD_GAMM: - mods->VBICepiDoping = value->rValue; - mods->VBICepiDopingGiven = TRUE; - break; - case VBIC_MOD_HRCF: - mods->VBIChighCurFac = value->rValue; - mods->VBIChighCurFacGiven = TRUE; - break; - case VBIC_MOD_RBX: - mods->VBICextBaseResist = value->rValue; - if (mods->VBICextBaseResist < R_MIN) { - mods->VBICextBaseResist = R_MIN; - } - mods->VBICextBaseResistGiven = TRUE; - break; - case VBIC_MOD_RBI: - mods->VBICintBaseResist = value->rValue; - if (mods->VBICintBaseResist < R_MIN) { - mods->VBICintBaseResist = R_MIN; - } - mods->VBICintBaseResistGiven = TRUE; - break; - case VBIC_MOD_RE: - mods->VBICemitterResist = value->rValue; - if (mods->VBICemitterResist < R_MIN) { - mods->VBICemitterResist = R_MIN; - } - mods->VBICemitterResistGiven = TRUE; - break; - case VBIC_MOD_RS: - mods->VBICsubstrateResist = value->rValue; - if (mods->VBICsubstrateResist < R_MIN) { - mods->VBICsubstrateResist = R_MIN; - } - mods->VBICsubstrateResistGiven = TRUE; - break; - case VBIC_MOD_RBP: - mods->VBICparBaseResist = value->rValue; - if (mods->VBICparBaseResist < R_MIN) { - mods->VBICparBaseResist = R_MIN; - } - mods->VBICparBaseResistGiven = TRUE; - break; - case VBIC_MOD_IS: - mods->VBICsatCur = value->rValue; - mods->VBICsatCurGiven = TRUE; - break; - case VBIC_MOD_NF: - mods->VBICemissionCoeffF = value->rValue; - mods->VBICemissionCoeffFGiven = TRUE; - break; - case VBIC_MOD_NR: - mods->VBICemissionCoeffR = value->rValue; - mods->VBICemissionCoeffRGiven = TRUE; - break; - case VBIC_MOD_FC: - mods->VBICdeplCapLimitF = value->rValue; - mods->VBICdeplCapLimitFGiven = TRUE; - break; - case VBIC_MOD_CBEO: - mods->VBICextOverlapCapBE = value->rValue; - mods->VBICextOverlapCapBEGiven=TRUE; - break; - case VBIC_MOD_CJE: - mods->VBICdepletionCapBE = value->rValue; - mods->VBICdepletionCapBEGiven = TRUE; - break; - case VBIC_MOD_PE: - mods->VBICpotentialBE = value->rValue; - mods->VBICpotentialBEGiven = TRUE; - break; - case VBIC_MOD_ME: - mods->VBICjunctionExpBE = value->rValue; - mods->VBICjunctionExpBEGiven = TRUE; - break; - case VBIC_MOD_AJE: - mods->VBICsmoothCapBE = value->rValue; - mods->VBICsmoothCapBEGiven = TRUE; - break; - case VBIC_MOD_CBCO: - mods->VBICextOverlapCapBC = value->rValue; - mods->VBICextOverlapCapBCGiven=TRUE; - break; - case VBIC_MOD_CJC: - mods->VBICdepletionCapBC = value->rValue; - mods->VBICdepletionCapBCGiven = TRUE; - break; - case VBIC_MOD_QCO: - mods->VBICepiCharge = value->rValue; - mods->VBICepiChargeGiven = TRUE; - break; - case VBIC_MOD_CJEP: - mods->VBICextCapBC = value->rValue; - mods->VBICextCapBCGiven = TRUE; - break; - case VBIC_MOD_PC: - mods->VBICpotentialBC = value->rValue; - mods->VBICpotentialBCGiven = TRUE; - break; - case VBIC_MOD_MC: - mods->VBICjunctionExpBC = value->rValue; - mods->VBICjunctionExpBCGiven = TRUE; - break; - case VBIC_MOD_AJC: - mods->VBICsmoothCapBC = value->rValue; - mods->VBICsmoothCapBCGiven = TRUE; - break; - case VBIC_MOD_CJCP: - mods->VBICextCapSC = value->rValue; - mods->VBICextCapSCGiven = TRUE; - break; - case VBIC_MOD_PS: - mods->VBICpotentialSC = value->rValue; - mods->VBICpotentialSCGiven = TRUE; - break; - case VBIC_MOD_MS: - mods->VBICjunctionExpSC = value->rValue; - mods->VBICjunctionExpSCGiven = TRUE; - break; - case VBIC_MOD_AJS: - mods->VBICsmoothCapSC = value->rValue; - mods->VBICsmoothCapSCGiven = TRUE; - break; - case VBIC_MOD_IBEI: - mods->VBICidealSatCurBE = value->rValue; - mods->VBICidealSatCurBEGiven = TRUE; - break; - case VBIC_MOD_WBE: - mods->VBICportionIBEI = value->rValue; - mods->VBICportionIBEIGiven = TRUE; - break; - case VBIC_MOD_NEI: - mods->VBICidealEmissCoeffBE = value->rValue; - mods->VBICidealEmissCoeffBEGiven = TRUE; - break; - case VBIC_MOD_IBEN: - mods->VBICnidealSatCurBE = value->rValue; - mods->VBICnidealSatCurBEGiven = TRUE; - break; - case VBIC_MOD_NEN: - mods->VBICnidealEmissCoeffBE = value->rValue; - mods->VBICnidealEmissCoeffBEGiven = TRUE; - break; - case VBIC_MOD_IBCI: - mods->VBICidealSatCurBC = value->rValue; - mods->VBICidealSatCurBCGiven = TRUE; - break; - case VBIC_MOD_NCI: - mods->VBICidealEmissCoeffBC = value->rValue; - mods->VBICidealEmissCoeffBCGiven = TRUE; - break; - case VBIC_MOD_IBCN: - mods->VBICnidealSatCurBC = value->rValue; - mods->VBICnidealSatCurBCGiven = TRUE; - break; - case VBIC_MOD_NCN: - mods->VBICnidealEmissCoeffBC = value->rValue; - mods->VBICnidealEmissCoeffBCGiven = TRUE; - break; - case VBIC_MOD_AVC1: - mods->VBICavalanchePar1BC = value->rValue; - mods->VBICavalanchePar1BCGiven = TRUE; - break; - case VBIC_MOD_AVC2: - mods->VBICavalanchePar2BC = value->rValue; - mods->VBICavalanchePar2BCGiven = TRUE; - break; - case VBIC_MOD_ISP: - mods->VBICparasitSatCur = value->rValue; - mods->VBICparasitSatCurGiven = TRUE; - break; - case VBIC_MOD_WSP: - mods->VBICportionICCP = value->rValue; - mods->VBICportionICCPGiven = TRUE; - break; - case VBIC_MOD_NFP: - mods->VBICparasitFwdEmissCoeff = value->rValue; - mods->VBICparasitFwdEmissCoeffGiven = TRUE; - break; - case VBIC_MOD_IBEIP: - mods->VBICidealParasitSatCurBE = value->rValue; - mods->VBICidealParasitSatCurBEGiven = TRUE; - break; - case VBIC_MOD_IBENP: - mods->VBICnidealParasitSatCurBE = value->rValue; - mods->VBICnidealParasitSatCurBEGiven = TRUE; - break; - case VBIC_MOD_IBCIP: - mods->VBICidealParasitSatCurBC = value->rValue; - mods->VBICidealParasitSatCurBCGiven = TRUE; - break; - case VBIC_MOD_NCIP: - mods->VBICidealParasitEmissCoeffBC = value->rValue; - mods->VBICidealParasitEmissCoeffBCGiven = TRUE; - break; - case VBIC_MOD_IBCNP: - mods->VBICnidealParasitSatCurBC = value->rValue; - mods->VBICnidealParasitSatCurBCGiven = TRUE; - break; - case VBIC_MOD_NCNP: - mods->VBICnidealParasitEmissCoeffBC = value->rValue; - mods->VBICnidealParasitEmissCoeffBCGiven = TRUE; - break; - case VBIC_MOD_VEF: - mods->VBICearlyVoltF = value->rValue; - mods->VBICearlyVoltFGiven = TRUE; - break; - case VBIC_MOD_VER: - mods->VBICearlyVoltR = value->rValue; - mods->VBICearlyVoltRGiven = TRUE; - break; - case VBIC_MOD_IKF: - mods->VBICrollOffF = value->rValue; - mods->VBICrollOffFGiven = TRUE; - break; - case VBIC_MOD_IKR: - mods->VBICrollOffR = value->rValue; - mods->VBICrollOffRGiven = TRUE; - break; - case VBIC_MOD_IKP: - mods->VBICparRollOff = value->rValue; - mods->VBICparRollOffGiven = TRUE; - break; - case VBIC_MOD_TF: - mods->VBICtransitTimeF = value->rValue; - mods->VBICtransitTimeFGiven = TRUE; - break; - case VBIC_MOD_QTF: - mods->VBICvarTransitTimeF = value->rValue; - mods->VBICvarTransitTimeFGiven = TRUE; - break; - case VBIC_MOD_XTF: - mods->VBICtransitTimeBiasCoeffF = value->rValue; - mods->VBICtransitTimeBiasCoeffFGiven = TRUE; - break; - case VBIC_MOD_VTF: - mods->VBICtransitTimeFVBC = value->rValue; - mods->VBICtransitTimeFVBCGiven = TRUE; - break; - case VBIC_MOD_ITF: - mods->VBICtransitTimeHighCurrentF = value->rValue; - mods->VBICtransitTimeHighCurrentFGiven = TRUE; - break; - case VBIC_MOD_TR: - mods->VBICtransitTimeR = value->rValue; - mods->VBICtransitTimeRGiven = TRUE; - break; - case VBIC_MOD_TD: - mods->VBICdelayTimeF = value->rValue; - mods->VBICdelayTimeFGiven = TRUE; - break; - case VBIC_MOD_KFN: - mods->VBICfNcoef = value->rValue; - mods->VBICfNcoefGiven = TRUE; - break; - case VBIC_MOD_AFN: - mods->VBICfNexpA = value->rValue; - mods->VBICfNexpAGiven = TRUE; - break; - case VBIC_MOD_BFN: - mods->VBICfNexpB = value->rValue; - mods->VBICfNexpBGiven = TRUE; - break; - case VBIC_MOD_XRE: - mods->VBICtempExpRE = value->rValue; - mods->VBICtempExpREGiven = TRUE; - break; - case VBIC_MOD_XRB: - mods->VBICtempExpRB = value->rValue; - mods->VBICtempExpRBGiven = TRUE; - break; - case VBIC_MOD_XRBI: - mods->VBICtempExpRBI = value->rValue; - mods->VBICtempExpRBIGiven = TRUE; - break; - case VBIC_MOD_XRC: - mods->VBICtempExpRC = value->rValue; - mods->VBICtempExpRCGiven = TRUE; - break; - case VBIC_MOD_XRCI: - mods->VBICtempExpRCI = value->rValue; - mods->VBICtempExpRCIGiven = TRUE; - break; - case VBIC_MOD_XRS: - mods->VBICtempExpRS = value->rValue; - mods->VBICtempExpRSGiven = TRUE; - break; - case VBIC_MOD_XVO: - mods->VBICtempExpVO = value->rValue; - mods->VBICtempExpVOGiven = TRUE; - break; - case VBIC_MOD_EA: - mods->VBICactivEnergyEA = value->rValue; - mods->VBICactivEnergyEAGiven = TRUE; - break; - case VBIC_MOD_EAIE: - mods->VBICactivEnergyEAIE = value->rValue; - mods->VBICactivEnergyEAIEGiven = TRUE; - break; - case VBIC_MOD_EAIC: - mods->VBICactivEnergyEAIC = value->rValue; - mods->VBICactivEnergyEAICGiven = TRUE; - break; - case VBIC_MOD_EAIS: - mods->VBICactivEnergyEAIS = value->rValue; - mods->VBICactivEnergyEAISGiven = TRUE; - break; - case VBIC_MOD_EANE: - mods->VBICactivEnergyEANE = value->rValue; - mods->VBICactivEnergyEANEGiven = TRUE; - break; - case VBIC_MOD_EANC: - mods->VBICactivEnergyEANC = value->rValue; - mods->VBICactivEnergyEANCGiven = TRUE; - break; - case VBIC_MOD_EANS: - mods->VBICactivEnergyEANS = value->rValue; - mods->VBICactivEnergyEANSGiven = TRUE; - break; - case VBIC_MOD_XIS: - mods->VBICtempExpIS = value->rValue; - mods->VBICtempExpISGiven = TRUE; - break; - case VBIC_MOD_XII: - mods->VBICtempExpII = value->rValue; - mods->VBICtempExpIIGiven = TRUE; - break; - case VBIC_MOD_XIN: - mods->VBICtempExpIN = value->rValue; - mods->VBICtempExpINGiven = TRUE; - break; - case VBIC_MOD_TNF: - mods->VBICtempExpNF = value->rValue; - mods->VBICtempExpNFGiven = TRUE; - break; - case VBIC_MOD_TAVC: - mods->VBICtempExpAVC = value->rValue; - mods->VBICtempExpAVCGiven = TRUE; - break; - case VBIC_MOD_RTH: - mods->VBICthermalResist = value->rValue; - mods->VBICthermalResistGiven = TRUE; - break; - case VBIC_MOD_CTH: - mods->VBICthermalCapacitance = value->rValue; - mods->VBICthermalCapacitanceGiven = TRUE; - break; - case VBIC_MOD_VRT: - mods->VBICpunchThroughVoltageBC = value->rValue; - mods->VBICpunchThroughVoltageBCGiven = TRUE; - break; - case VBIC_MOD_ART: - mods->VBICdeplCapCoeff1 = value->rValue; - mods->VBICdeplCapCoeff1Given = TRUE; - break; - case VBIC_MOD_CCSO: - mods->VBICfixedCapacitanceCS = value->rValue; - mods->VBICfixedCapacitanceCSGiven = TRUE; - break; - case VBIC_MOD_QBM: - mods->VBICsgpQBselector = value->rValue; - mods->VBICsgpQBselectorGiven = TRUE; - break; - case VBIC_MOD_NKF: - mods->VBIChighCurrentBetaRolloff = value->rValue; - mods->VBIChighCurrentBetaRolloffGiven = TRUE; - break; - case VBIC_MOD_XIKF: - mods->VBICtempExpIKF = value->rValue; - mods->VBICtempExpIKFGiven = TRUE; - break; - case VBIC_MOD_XRCX: - mods->VBICtempExpRCX = value->rValue; - mods->VBICtempExpRCXGiven = TRUE; - break; - case VBIC_MOD_XRBX: - mods->VBICtempExpRBX = value->rValue; - mods->VBICtempExpRBXGiven = TRUE; - break; - case VBIC_MOD_XRBP: - mods->VBICtempExpRBP = value->rValue; - mods->VBICtempExpRBPGiven = TRUE; - break; - case VBIC_MOD_ISRR: - mods->VBICsepISRR = value->rValue; - mods->VBICsepISRRGiven = TRUE; - break; - case VBIC_MOD_XISR: - mods->VBICtempExpXISR = value->rValue; - mods->VBICtempExpXISRGiven = TRUE; - break; - case VBIC_MOD_DEAR: - mods->VBICdear = value->rValue; - mods->VBICdearGiven = TRUE; - break; - case VBIC_MOD_EAP: - mods->VBICeap = value->rValue; - mods->VBICeapGiven = TRUE; - break; - case VBIC_MOD_VBBE: - mods->VBICvbbe = value->rValue; - mods->VBICvbbeGiven = TRUE; - break; - case VBIC_MOD_NBBE: - mods->VBICnbbe = value->rValue; - mods->VBICnbbeGiven = TRUE; - break; - case VBIC_MOD_IBBE: - mods->VBICibbe = value->rValue; - mods->VBICibbeGiven = TRUE; - break; - case VBIC_MOD_TVBBE1: - mods->VBICtvbbe1 = value->rValue; - mods->VBICtvbbe1Given = TRUE; - break; - case VBIC_MOD_TVBBE2: - mods->VBICtvbbe2 = value->rValue; - mods->VBICtvbbe2Given = TRUE; - break; - case VBIC_MOD_TNBBE: - mods->VBICtnbbe = value->rValue; - mods->VBICtnbbeGiven = TRUE; - break; - case VBIC_MOD_EBBE: - mods->VBICebbe = value->rValue; - mods->VBICebbeGiven = TRUE; - break; - case VBIC_MOD_DTEMP: - mods->VBIClocTempDiff = value->rValue; - mods->VBIClocTempDiffGiven = TRUE; - break; - case VBIC_MOD_VERS: - mods->VBICrevVersion = value->rValue; - mods->VBICrevVersionGiven = TRUE; - break; - case VBIC_MOD_VREF: - mods->VBICrefVersion = value->rValue; - mods->VBICrefVersionGiven = TRUE; - break; - case VBIC_MOD_VBE_MAX: - mods->VBICvbeMax = value->rValue; - mods->VBICvbeMaxGiven = TRUE; - break; - case VBIC_MOD_VBC_MAX: - mods->VBICvbcMax = value->rValue; - mods->VBICvbcMaxGiven = TRUE; - break; - case VBIC_MOD_VCE_MAX: - mods->VBICvceMax = value->rValue; - mods->VBICvceMaxGiven = TRUE; - break; - default: - return(E_BADPARM); - } - return(OK); -} diff --git a/src/spicelib/devices/vbic/vbicnoise.c b/src/spicelib/devices/vbic/vbicnoise.c deleted file mode 100644 index 42516da59..000000000 --- a/src/spicelib/devices/vbic/vbicnoise.c +++ /dev/null @@ -1,246 +0,0 @@ -/********** -Copyright 1990 Regents of the University of California. All rights reserved. -Author: 1987 Gary W. Ng -Model Author: 1995 Colin McAndrew Motorola -Spice3 Implementation: 2003 Dietmar Warning DAnalyse GmbH -**********/ - -#include "ngspice/ngspice.h" -#include "vbicdefs.h" -#include "ngspice/cktdefs.h" -#include "ngspice/iferrmsg.h" -#include "ngspice/noisedef.h" -#include "ngspice/suffix.h" - -/* - * VBICnoise (mode, operation, firstModel, ckt, data, OnDens) - * - * This routine names and evaluates all of the noise sources - * associated with VBIC's. It starts with the model *firstModel and - * traverses all of its insts. It then proceeds to any other models - * on the linked list. The total output noise density generated by - * all of the VBIC's is summed with the variable "OnDens". - */ - - -int -VBICnoise (int mode, int operation, GENmodel *genmodel, CKTcircuit *ckt, Ndata *data, double *OnDens) -{ - NOISEAN *job = (NOISEAN *) ckt->CKTcurJob; - - VBICmodel *firstModel = (VBICmodel *) genmodel; - VBICmodel *model; - VBICinstance *inst; - double tempOnoise; - double tempInoise; - double noizDens[VBICNSRCS]; - double lnNdens[VBICNSRCS]; - int i; - - /* define the names of the noise sources */ - - static char *VBICnNames[VBICNSRCS] = { - /* Note that we have to keep the order consistent with the - strchr definitions in VBICdefs.h */ - "_rc", /* noise due to rc */ - "_rci", /* noise due to rci */ - "_rb", /* noise due to rb */ - "_rbi", /* noise due to rbi */ - "_re", /* noise due to re */ - "_rbp", /* noise due to rbp */ - "_rs", /* noise due to rs */ - "_ic", /* noise due to ic */ - "_ib", /* noise due to ib */ - "_ibep", /* noise due to ibep */ - "_iccp", /* noise due to iccp */ - "_1overfbe", /* flicker (1/f) noise ibe */ - "_1overfbep", /* flicker (1/f) noise ibep */ - "" /* total transistor noise */ - }; - - for (model=firstModel; model != NULL; model=VBICnextModel(model)) { - for (inst=VBICinstances(model); inst != NULL; - inst=VBICnextInstance(inst)) { - - switch (operation) { - - case N_OPEN: - - /* see if we have to to produce a summary report */ - /* if so, name all the noise generators */ - - if (job->NStpsSm != 0) { - switch (mode) { - - case N_DENS: - for (i=0; i < VBICNSRCS; i++) { - NOISE_ADD_OUTVAR(ckt, data, "onoise_%s%s", inst->VBICname, VBICnNames[i]); - } - break; - - case INT_NOIZ: - for (i=0; i < VBICNSRCS; i++) { - NOISE_ADD_OUTVAR(ckt, data, "onoise_total_%s%s", inst->VBICname, VBICnNames[i]); - NOISE_ADD_OUTVAR(ckt, data, "inoise_total_%s%s", inst->VBICname, VBICnNames[i]); - } - break; - } - } - break; - - case N_CALC: - switch (mode) { - - case N_DENS: - NevalSrc(&noizDens[VBICRCNOIZ],&lnNdens[VBICRCNOIZ], - ckt,THERMNOISE,inst->VBICcollCXNode,inst->VBICcollNode, - *(ckt->CKTstate0 + inst->VBICircx_Vrcx)); - - NevalSrc(&noizDens[VBICRCINOIZ],&lnNdens[VBICRCINOIZ], - ckt,THERMNOISE,inst->VBICcollCXNode,inst->VBICcollCINode, - *(ckt->CKTstate0 + inst->VBICirci_Vrci)); - - NevalSrc(&noizDens[VBICRBNOIZ],&lnNdens[VBICRBNOIZ], - ckt,THERMNOISE,inst->VBICbaseBXNode,inst->VBICbaseNode, - *(ckt->CKTstate0 + inst->VBICirbx_Vrbx)); - - NevalSrc(&noizDens[VBICRBINOIZ],&lnNdens[VBICRBINOIZ], - ckt,THERMNOISE,inst->VBICbaseBXNode,inst->VBICbaseBINode, - *(ckt->CKTstate0 + inst->VBICirbi_Vrbi)); - - NevalSrc(&noizDens[VBICRENOIZ],&lnNdens[VBICRENOIZ], - ckt,THERMNOISE,inst->VBICemitEINode,inst->VBICemitNode, - *(ckt->CKTstate0 + inst->VBICire_Vre)); - - NevalSrc(&noizDens[VBICRBPNOIZ],&lnNdens[VBICRBPNOIZ], - ckt,THERMNOISE,inst->VBICemitEINode,inst->VBICemitNode, - *(ckt->CKTstate0 + inst->VBICirbp_Vrbp)); - - NevalSrc(&noizDens[VBICRSNOIZ],&lnNdens[VBICRSNOIZ], - ckt,THERMNOISE,inst->VBICsubsSINode,inst->VBICsubsNode, - *(ckt->CKTstate0 + inst->VBICirs_Vrs)); - - - NevalSrc(&noizDens[VBICICNOIZ],&lnNdens[VBICICNOIZ], - ckt,SHOTNOISE,inst->VBICcollCINode, inst->VBICemitEINode, - *(ckt->CKTstate0 + inst->VBICitzf)); - - NevalSrc(&noizDens[VBICIBNOIZ],&lnNdens[VBICIBNOIZ], - ckt,SHOTNOISE,inst->VBICbaseBINode, inst->VBICemitEINode, - *(ckt->CKTstate0 + inst->VBICibe)); - - NevalSrc(&noizDens[VBICIBEPNOIZ],&lnNdens[VBICIBEPNOIZ], - ckt,SHOTNOISE,inst->VBICbaseBXNode, inst->VBICbaseBPNode, - *(ckt->CKTstate0 + inst->VBICibep)); - - NevalSrc(&noizDens[VBICICCPNOIZ],&lnNdens[VBICICCPNOIZ], - ckt,SHOTNOISE,inst->VBICbaseBXNode, inst->VBICsubsSINode, - *(ckt->CKTstate0 + inst->VBICiccp)); - - - NevalSrc(&noizDens[VBICFLBENOIZ], NULL, ckt, - N_GAIN,inst->VBICbaseBINode, inst->VBICemitEINode, - (double)0.0); - noizDens[VBICFLBENOIZ] *= inst->VBICm * model->VBICfNcoef * - exp(model->VBICfNexpA * - log(MAX(fabs(*(ckt->CKTstate0 + inst->VBICibe)/inst->VBICm),N_MINLOG))) / - pow(data->freq, model->VBICfNexpB); - lnNdens[VBICFLBENOIZ] = - log(MAX(noizDens[VBICFLBENOIZ],N_MINLOG)); - - NevalSrc(&noizDens[VBICFLBEPNOIZ], NULL, ckt, - N_GAIN,inst->VBICbaseBXNode, inst->VBICbaseBPNode, - (double)0.0); - noizDens[VBICFLBEPNOIZ] *= inst->VBICm * model->VBICfNcoef * - exp(model->VBICfNexpA * - log(MAX(fabs(*(ckt->CKTstate0 + inst->VBICibep)/inst->VBICm),N_MINLOG))) / - pow(data->freq, model->VBICfNexpB); - lnNdens[VBICFLBEPNOIZ] = - log(MAX(noizDens[VBICFLBEPNOIZ],N_MINLOG)); - - - noizDens[VBICTOTNOIZ] = noizDens[VBICRCNOIZ] + - noizDens[VBICRCINOIZ] + - noizDens[VBICRBNOIZ] + - noizDens[VBICRBINOIZ] + - noizDens[VBICRENOIZ] + - noizDens[VBICRBPNOIZ] + - noizDens[VBICICNOIZ] + - noizDens[VBICIBNOIZ] + - noizDens[VBICIBEPNOIZ] + - noizDens[VBICFLBENOIZ] + - noizDens[VBICFLBEPNOIZ]; - - lnNdens[VBICTOTNOIZ] = - log(noizDens[VBICTOTNOIZ]); - - *OnDens += noizDens[VBICTOTNOIZ]; - - if (data->delFreq == 0.0) { - - /* if we haven't done any previous integration, we need to */ - /* initialize our "history" variables */ - - for (i=0; i < VBICNSRCS; i++) { - inst->VBICnVar[LNLSTDENS][i] = lnNdens[i]; - } - - /* clear out our integration variables if it's the first pass */ - - if (data->freq == job->NstartFreq) { - for (i=0; i < VBICNSRCS; i++) { - inst->VBICnVar[OUTNOIZ][i] = 0.0; - inst->VBICnVar[INNOIZ][i] = 0.0; - } - } - } else { /* data->delFreq != 0.0 (we have to integrate) */ - -/* In order to get the best curve fit, we have to integrate each component separately */ - - for (i=0; i < VBICNSRCS; i++) { - if (i != VBICTOTNOIZ) { - tempOnoise = Nintegrate(noizDens[i], lnNdens[i], - inst->VBICnVar[LNLSTDENS][i], data); - tempInoise = Nintegrate(noizDens[i] * data->GainSqInv , - lnNdens[i] + data->lnGainInv, - inst->VBICnVar[LNLSTDENS][i] + data->lnGainInv, - data); - inst->VBICnVar[LNLSTDENS][i] = lnNdens[i]; - data->outNoiz += tempOnoise; - data->inNoise += tempInoise; - if (job->NStpsSm != 0) { - inst->VBICnVar[OUTNOIZ][i] += tempOnoise; - inst->VBICnVar[OUTNOIZ][VBICTOTNOIZ] += tempOnoise; - inst->VBICnVar[INNOIZ][i] += tempInoise; - inst->VBICnVar[INNOIZ][VBICTOTNOIZ] += tempInoise; - } - } - } - } - if (data->prtSummary) { - for (i=0; i < VBICNSRCS; i++) { /* print a summary report */ - data->outpVector[data->outNumber++] = noizDens[i]; - } - } - break; - - case INT_NOIZ: /* already calculated, just output */ - if (job->NStpsSm != 0) { - for (i=0; i < VBICNSRCS; i++) { - data->outpVector[data->outNumber++] = inst->VBICnVar[OUTNOIZ][i]; - data->outpVector[data->outNumber++] = inst->VBICnVar[INNOIZ][i]; - } - } /* if */ - break; - } /* switch (mode) */ - break; - - case N_CLOSE: - return (OK); /* do nothing, the main calling routine will close */ - break; /* the plots */ - } /* switch (operation) */ - } /* for inst */ - } /* for model */ - -return(OK); -} diff --git a/src/spicelib/devices/vbic/vbicparam.c b/src/spicelib/devices/vbic/vbicparam.c deleted file mode 100644 index 5ffea4cc4..000000000 --- a/src/spicelib/devices/vbic/vbicparam.c +++ /dev/null @@ -1,77 +0,0 @@ -/********** -Copyright 1990 Regents of the University of California. All rights reserved. -Author: 1985 Thomas L. Quarles -Model Author: 1995 Colin McAndrew Motorola -Spice3 Implementation: 2003 Dietmar Warning DAnalyse GmbH -**********/ - -/* - * This routine sets instance parameters for - * VBICs in the circuit. - */ - -#include "ngspice/ngspice.h" -#include "ngspice/const.h" -#include "ngspice/ifsim.h" -#include "vbicdefs.h" -#include "ngspice/sperror.h" -#include "ngspice/suffix.h" - - -/* ARGSUSED */ -int -VBICparam(int param, IFvalue *value, GENinstance *instPtr, IFvalue *select) -{ - VBICinstance *here = (VBICinstance*)instPtr; - - NG_IGNORE(select); - - switch (param) { - case VBIC_AREA: - here->VBICarea = value->rValue; - here->VBICareaGiven = TRUE; - break; - case VBIC_OFF: - here->VBICoff = (value->iValue != 0); - break; - case VBIC_IC_VBE: - here->VBICicVBE = value->rValue; - here->VBICicVBEGiven = TRUE; - break; - case VBIC_IC_VCE: - here->VBICicVCE = value->rValue; - here->VBICicVCEGiven = TRUE; - break; - case VBIC_TEMP: - here->VBICtemp = value->rValue+CONSTCtoK; - here->VBICtempGiven = TRUE; - break; - case VBIC_DTEMP: - here->VBICdtemp = value->rValue; - here->VBICdtempGiven = TRUE; - break; - case VBIC_M: - here->VBICm = value->rValue; - here->VBICmGiven = TRUE; - break; - case VBIC_IC : - /* FALLTHROUGH added to suppress GCC warning due to - * -Wimplicit-fallthrough flag */ - switch (value->v.numValue) { - case 2: - here->VBICicVCE = *(value->v.vec.rVec+1); - here->VBICicVCEGiven = TRUE; - /* FALLTHROUGH */ - case 1: - here->VBICicVBE = *(value->v.vec.rVec); - here->VBICicVBEGiven = TRUE; - break; - default: - return(E_BADPARM); - } - break; - default: - return(E_BADPARM); - } - return(OK); -} diff --git a/src/spicelib/devices/vbic/vbicpzld.c b/src/spicelib/devices/vbic/vbicpzld.c deleted file mode 100644 index 18c59410a..000000000 --- a/src/spicelib/devices/vbic/vbicpzld.c +++ /dev/null @@ -1,318 +0,0 @@ -/********** -Copyright 1990 Regents of the University of California. All rights reserved. -Author: 1985 Thomas L. Quarles -Model Author: 1995 Colin McAndrew Motorola -Spice3 Implementation: 2003 Dietmar Warning DAnalyse GmbH -**********/ - -/* - * Function to load the COMPLEX circuit matrix using the - * small signal parameters saved during a previous DC operating - * point analysis. - */ - -#include "ngspice/ngspice.h" -#include "ngspice/cktdefs.h" -#include "vbicdefs.h" -#include "ngspice/sperror.h" -#include "ngspice/suffix.h" - -int -VBICpzLoad(GENmodel *inModel, CKTcircuit *ckt, SPcomplex *s) -{ - VBICinstance *here; - VBICmodel *model = (VBICmodel*)inModel; - double Ibe_Vbei,Ibex_Vbex - ,Itzf_Vbei,Itzf_Vbci,Itzr_Vbci,Itzr_Vbei,Ibc_Vbci - ,Ibc_Vbei,Ibep_Vbep,Ircx_Vrcx,Irci_Vrci - ,Irci_Vbci,Irci_Vbcx,Irbx_Vrbx,Irbi_Vrbi,Irbi_Vbei - ,Irbi_Vbci,Ire_Vre,Irbp_Vrbp,Irbp_Vbep,Irbp_Vbci - ,Ibcp_Vbcp,Iccp_Vbep,Irs_Vrs,Iccp_Vbci,Iccp_Vbcp; - double XQbe_Vbei, XQbe_Vbci, XQbex_Vbex, XQbc_Vbci, - XQbcx_Vbcx, XQbep_Vbep, XQbep_Vbci, - XQbcp_Vbcp; - - /* loop through all the models */ - for( ; model != NULL; model = VBICnextModel(model)) { - - /* loop through all the instances of the model */ - for( here = VBICinstances(model); here!= NULL; - here = VBICnextInstance(here)) { - - Ibe_Vbei = *(ckt->CKTstate0 + here->VBICibe_Vbei); - Ibex_Vbex = *(ckt->CKTstate0 + here->VBICibex_Vbex); - Itzf_Vbei = *(ckt->CKTstate0 + here->VBICitzf_Vbei); - Itzf_Vbci = *(ckt->CKTstate0 + here->VBICitzf_Vbci); - Itzr_Vbci = *(ckt->CKTstate0 + here->VBICitzr_Vbci); - Itzr_Vbei = *(ckt->CKTstate0 + here->VBICitzr_Vbei); - Ibc_Vbci = *(ckt->CKTstate0 + here->VBICibc_Vbci); - Ibc_Vbei = *(ckt->CKTstate0 + here->VBICibc_Vbei); - Ibep_Vbep = *(ckt->CKTstate0 + here->VBICibep_Vbep); - Irci_Vrci = *(ckt->CKTstate0 + here->VBICirci_Vrci); - Irci_Vbci = *(ckt->CKTstate0 + here->VBICirci_Vbci); - Irci_Vbcx = *(ckt->CKTstate0 + here->VBICirci_Vbcx); - Irbi_Vrbi = *(ckt->CKTstate0 + here->VBICirbi_Vrbi); - Irbi_Vbei = *(ckt->CKTstate0 + here->VBICirbi_Vbei); - Irbi_Vbci = *(ckt->CKTstate0 + here->VBICirbi_Vbci); - Irbp_Vrbp = *(ckt->CKTstate0 + here->VBICirbp_Vrbp); - Irbp_Vbep = *(ckt->CKTstate0 + here->VBICirbp_Vbep); - Irbp_Vbci = *(ckt->CKTstate0 + here->VBICirbp_Vbci); - Ibcp_Vbcp = *(ckt->CKTstate0 + here->VBICibcp_Vbcp); - Iccp_Vbep = *(ckt->CKTstate0 + here->VBICiccp_Vbep); - Iccp_Vbci = *(ckt->CKTstate0 + here->VBICiccp_Vbci); - Iccp_Vbcp = *(ckt->CKTstate0 + here->VBICiccp_Vbcp); - Ircx_Vrcx = *(ckt->CKTstate0 + here->VBICircx_Vrcx); - Irbx_Vrbx = *(ckt->CKTstate0 + here->VBICirbx_Vrbx); - Irs_Vrs = *(ckt->CKTstate0 + here->VBICirs_Vrs); - Ire_Vre = *(ckt->CKTstate0 + here->VBICire_Vre); - -/* -c The real part -*/ -/* -c Stamp element: Ibe -*/ - *(here->VBICbaseBIBaseBIPtr) += Ibe_Vbei; - *(here->VBICbaseBIEmitEIPtr) += -Ibe_Vbei; - *(here->VBICemitEIBaseBIPtr) += -Ibe_Vbei; - *(here->VBICemitEIEmitEIPtr) += Ibe_Vbei; -/* -c Stamp element: Ibex -*/ - *(here->VBICbaseBXBaseBXPtr) += Ibex_Vbex; - *(here->VBICbaseBXEmitEIPtr) += -Ibex_Vbex; - *(here->VBICemitEIBaseBXPtr) += -Ibex_Vbex; - *(here->VBICemitEIEmitEIPtr) += Ibex_Vbex; -/* -c Stamp element: Itzf -*/ - *(here->VBICcollCIBaseBIPtr) += Itzf_Vbei; - *(here->VBICcollCIEmitEIPtr) += -Itzf_Vbei; - *(here->VBICcollCIBaseBIPtr) += Itzf_Vbci; - *(here->VBICcollCICollCIPtr) += -Itzf_Vbci; - *(here->VBICemitEIBaseBIPtr) += -Itzf_Vbei; - *(here->VBICemitEIEmitEIPtr) += Itzf_Vbei; - *(here->VBICemitEIBaseBIPtr) += -Itzf_Vbci; - *(here->VBICemitEICollCIPtr) += Itzf_Vbci; -/* -c Stamp element: Itzr -*/ - *(here->VBICemitEIBaseBIPtr) += Itzr_Vbci; - *(here->VBICemitEICollCIPtr) += -Itzr_Vbci; - *(here->VBICemitEIBaseBIPtr) += Itzr_Vbei; - *(here->VBICemitEIEmitEIPtr) += -Itzr_Vbei; - *(here->VBICcollCIBaseBIPtr) += -Itzr_Vbci; - *(here->VBICcollCICollCIPtr) += Itzr_Vbci; - *(here->VBICcollCIBaseBIPtr) += -Itzr_Vbei; - *(here->VBICcollCIEmitEIPtr) += Itzr_Vbei; -/* -c Stamp element: Ibc -*/ - *(here->VBICbaseBIBaseBIPtr) += Ibc_Vbci; - *(here->VBICbaseBICollCIPtr) += -Ibc_Vbci; - *(here->VBICbaseBIBaseBIPtr) += Ibc_Vbei; - *(here->VBICbaseBIEmitEIPtr) += -Ibc_Vbei; - *(here->VBICcollCIBaseBIPtr) += -Ibc_Vbci; - *(here->VBICcollCICollCIPtr) += Ibc_Vbci; - *(here->VBICcollCIBaseBIPtr) += -Ibc_Vbei; - *(here->VBICcollCIEmitEIPtr) += Ibc_Vbei; -/* -c Stamp element: Ibep -*/ - *(here->VBICbaseBXBaseBXPtr) += Ibep_Vbep; - *(here->VBICbaseBXBaseBPPtr) += -Ibep_Vbep; - *(here->VBICbaseBPBaseBXPtr) += -Ibep_Vbep; - *(here->VBICbaseBPBaseBPPtr) += Ibep_Vbep; -/* -c Stamp element: Ircx -*/ - *(here->VBICcollCollPtr) += Ircx_Vrcx; - *(here->VBICcollCXCollCXPtr) += Ircx_Vrcx; - *(here->VBICcollCXCollPtr) += -Ircx_Vrcx; - *(here->VBICcollCollCXPtr) += -Ircx_Vrcx; -/* -c Stamp element: Irci -*/ - *(here->VBICcollCXCollCXPtr) += Irci_Vrci; - *(here->VBICcollCXCollCIPtr) += -Irci_Vrci; - *(here->VBICcollCXBaseBIPtr) += Irci_Vbci; - *(here->VBICcollCXCollCIPtr) += -Irci_Vbci; - *(here->VBICcollCXBaseBIPtr) += Irci_Vbcx; - *(here->VBICcollCXCollCXPtr) += -Irci_Vbcx; - *(here->VBICcollCICollCXPtr) += -Irci_Vrci; - *(here->VBICcollCICollCIPtr) += Irci_Vrci; - *(here->VBICcollCIBaseBIPtr) += -Irci_Vbci; - *(here->VBICcollCICollCIPtr) += Irci_Vbci; - *(here->VBICcollCIBaseBIPtr) += -Irci_Vbcx; - *(here->VBICcollCICollCXPtr) += Irci_Vbcx; -/* -c Stamp element: Irbx -*/ - *(here->VBICbaseBasePtr) += Irbx_Vrbx; - *(here->VBICbaseBXBaseBXPtr) += Irbx_Vrbx; - *(here->VBICbaseBXBasePtr) += -Irbx_Vrbx; - *(here->VBICbaseBaseBXPtr) += -Irbx_Vrbx; -/* -c Stamp element: Irbi -*/ - *(here->VBICbaseBXBaseBXPtr) += Irbi_Vrbi; - *(here->VBICbaseBXBaseBIPtr) += -Irbi_Vrbi; - *(here->VBICbaseBXBaseBIPtr) += Irbi_Vbei; - *(here->VBICbaseBXEmitEIPtr) += -Irbi_Vbei; - *(here->VBICbaseBXBaseBIPtr) += Irbi_Vbci; - *(here->VBICbaseBXCollCIPtr) += -Irbi_Vbci; - *(here->VBICbaseBIBaseBXPtr) += -Irbi_Vrbi; - *(here->VBICbaseBIBaseBIPtr) += Irbi_Vrbi; - *(here->VBICbaseBIBaseBIPtr) += -Irbi_Vbei; - *(here->VBICbaseBIEmitEIPtr) += Irbi_Vbei; - *(here->VBICbaseBIBaseBIPtr) += -Irbi_Vbci; - *(here->VBICbaseBICollCIPtr) += Irbi_Vbci; -/* -c Stamp element: Ire -*/ - *(here->VBICemitEmitPtr) += Ire_Vre; - *(here->VBICemitEIEmitEIPtr) += Ire_Vre; - *(here->VBICemitEIEmitPtr) += -Ire_Vre; - *(here->VBICemitEmitEIPtr) += -Ire_Vre; -/* -c Stamp element: Irbp -*/ - *(here->VBICbaseBPBaseBPPtr) += Irbp_Vrbp; - *(here->VBICbaseBPCollCXPtr) += -Irbp_Vrbp; - *(here->VBICbaseBPBaseBXPtr) += Irbp_Vbep; - *(here->VBICbaseBPBaseBPPtr) += -Irbp_Vbep; - *(here->VBICbaseBPBaseBIPtr) += Irbp_Vbci; - *(here->VBICbaseBPCollCIPtr) += -Irbp_Vbci; - *(here->VBICcollCXBaseBPPtr) += -Irbp_Vrbp; - *(here->VBICcollCXCollCXPtr) += Irbp_Vrbp; - *(here->VBICcollCXBaseBXPtr) += -Irbp_Vbep; - *(here->VBICcollCXBaseBPPtr) += Irbp_Vbep; - *(here->VBICcollCXBaseBIPtr) += -Irbp_Vbci; - *(here->VBICcollCXCollCIPtr) += Irbp_Vbci; -/* -c Stamp element: Ibcp -*/ - *(here->VBICsubsSISubsSIPtr) += Ibcp_Vbcp; - *(here->VBICsubsSIBaseBPPtr) += -Ibcp_Vbcp; - *(here->VBICbaseBPSubsSIPtr) += -Ibcp_Vbcp; - *(here->VBICbaseBPBaseBPPtr) += Ibcp_Vbcp; -/* -c Stamp element: Iccp -*/ - *(here->VBICbaseBXBaseBXPtr) += Iccp_Vbep; - *(here->VBICbaseBXBaseBPPtr) += -Iccp_Vbep; - *(here->VBICbaseBXBaseBIPtr) += Iccp_Vbci; - *(here->VBICbaseBXCollCIPtr) += -Iccp_Vbci; - *(here->VBICbaseBXSubsSIPtr) += Iccp_Vbcp; - *(here->VBICbaseBXBaseBPPtr) += -Iccp_Vbcp; - *(here->VBICsubsSIBaseBXPtr) += -Iccp_Vbep; - *(here->VBICsubsSIBaseBPPtr) += Iccp_Vbep; - *(here->VBICsubsSIBaseBIPtr) += -Iccp_Vbci; - *(here->VBICsubsSICollCIPtr) += Iccp_Vbci; - *(here->VBICsubsSISubsSIPtr) += -Iccp_Vbcp; - *(here->VBICsubsSIBaseBPPtr) += Iccp_Vbcp; -/* -c Stamp element: Irs -*/ - *(here->VBICsubsSubsPtr) += Irs_Vrs; - *(here->VBICsubsSISubsSIPtr) += Irs_Vrs; - *(here->VBICsubsSISubsPtr) += -Irs_Vrs; - *(here->VBICsubsSubsSIPtr) += -Irs_Vrs; -/* -c The complex part -*/ - XQbe_Vbei = *(ckt->CKTstate0 + here->VBICcqbe); - XQbe_Vbci = *(ckt->CKTstate0 + here->VBICcqbeci); - XQbex_Vbex = *(ckt->CKTstate0 + here->VBICcqbex); - XQbc_Vbci = *(ckt->CKTstate0 + here->VBICcqbc); - XQbcx_Vbcx = *(ckt->CKTstate0 + here->VBICcqbcx); - XQbep_Vbep = *(ckt->CKTstate0 + here->VBICcqbep); - XQbep_Vbci = *(ckt->CKTstate0 + here->VBICcqbepci); - XQbcp_Vbcp = *(ckt->CKTstate0 + here->VBICcqbcp); -/* -c Stamp element: Qbe -*/ - *(here->VBICbaseBIBaseBIPtr) += XQbe_Vbei * (s->real); - *(here->VBICbaseBIBaseBIPtr + 1) += XQbe_Vbei * (s->imag); - *(here->VBICbaseBIEmitEIPtr) += -XQbe_Vbei * (s->real); - *(here->VBICbaseBIEmitEIPtr + 1) += -XQbe_Vbei * (s->imag); - *(here->VBICbaseBIBaseBIPtr) += XQbe_Vbci * (s->real); - *(here->VBICbaseBIBaseBIPtr + 1) += XQbe_Vbci * (s->imag); - *(here->VBICbaseBICollCIPtr) += -XQbe_Vbci * (s->real); - *(here->VBICbaseBICollCIPtr + 1) += -XQbe_Vbci * (s->imag); - *(here->VBICemitEIBaseBIPtr) += -XQbe_Vbei * (s->real); - *(here->VBICemitEIBaseBIPtr + 1) += -XQbe_Vbei * (s->imag); - *(here->VBICemitEIEmitEIPtr) += XQbe_Vbei * (s->real); - *(here->VBICemitEIEmitEIPtr + 1) += XQbe_Vbei * (s->imag); - *(here->VBICemitEIBaseBIPtr) += -XQbe_Vbci * (s->real); - *(here->VBICemitEIBaseBIPtr + 1) += -XQbe_Vbci * (s->imag); - *(here->VBICemitEICollCIPtr) += XQbe_Vbci * (s->real); - *(here->VBICemitEICollCIPtr + 1) += XQbe_Vbci * (s->imag); -/* -c Stamp element: Qbex -*/ - *(here->VBICbaseBXBaseBXPtr) += XQbex_Vbex * (s->real); - *(here->VBICbaseBXBaseBXPtr + 1) += XQbex_Vbex * (s->imag); - *(here->VBICbaseBXEmitEIPtr) += -XQbex_Vbex * (s->real); - *(here->VBICbaseBXEmitEIPtr + 1) += -XQbex_Vbex * (s->imag); - *(here->VBICemitEIBaseBXPtr) += -XQbex_Vbex * (s->real); - *(here->VBICemitEIBaseBXPtr + 1) += -XQbex_Vbex * (s->imag); - *(here->VBICemitEIEmitEIPtr ) += XQbex_Vbex * (s->real); - *(here->VBICemitEIEmitEIPtr + 1) += XQbex_Vbex * (s->imag); -/* -c Stamp element: Qbc -*/ - *(here->VBICbaseBIBaseBIPtr) += XQbc_Vbci * (s->real); - *(here->VBICbaseBIBaseBIPtr + 1) += XQbc_Vbci * (s->imag); - *(here->VBICbaseBICollCIPtr) += -XQbc_Vbci * (s->real); - *(here->VBICbaseBICollCIPtr + 1) += -XQbc_Vbci * (s->imag); - *(here->VBICcollCIBaseBIPtr) += -XQbc_Vbci * (s->real); - *(here->VBICcollCIBaseBIPtr + 1) += -XQbc_Vbci * (s->imag); - *(here->VBICcollCICollCIPtr) += XQbc_Vbci * (s->real); - *(here->VBICcollCICollCIPtr + 1) += XQbc_Vbci * (s->imag); -/* -c Stamp element: Qbcx -*/ - *(here->VBICbaseBIBaseBIPtr) += XQbcx_Vbcx * (s->real); - *(here->VBICbaseBIBaseBIPtr + 1) += XQbcx_Vbcx * (s->imag); - *(here->VBICbaseBICollCXPtr) += -XQbcx_Vbcx * (s->real); - *(here->VBICbaseBICollCXPtr + 1) += -XQbcx_Vbcx * (s->imag); - *(here->VBICcollCXBaseBIPtr) += -XQbcx_Vbcx * (s->real); - *(here->VBICcollCXBaseBIPtr + 1) += -XQbcx_Vbcx * (s->imag); - *(here->VBICcollCXCollCXPtr) += XQbcx_Vbcx * (s->real); - *(here->VBICcollCXCollCXPtr + 1) += XQbcx_Vbcx * (s->imag); -/* -c Stamp element: Qbep -*/ - *(here->VBICbaseBXBaseBXPtr) += XQbep_Vbep * (s->real); - *(here->VBICbaseBXBaseBXPtr + 1) += XQbep_Vbep * (s->imag); - *(here->VBICbaseBXBaseBPPtr) += -XQbep_Vbep * (s->real); - *(here->VBICbaseBXBaseBPPtr + 1) += -XQbep_Vbep * (s->imag); - *(here->VBICbaseBXBaseBIPtr) += XQbep_Vbci * (s->real); - *(here->VBICbaseBXBaseBIPtr + 1) += XQbep_Vbci * (s->imag); - *(here->VBICbaseBXCollCIPtr) += -XQbep_Vbci * (s->real); - *(here->VBICbaseBXCollCIPtr + 1) += -XQbep_Vbci * (s->imag); - *(here->VBICbaseBPBaseBXPtr) += -XQbep_Vbep * (s->real); - *(here->VBICbaseBPBaseBXPtr + 1) += -XQbep_Vbep * (s->imag); - *(here->VBICbaseBPBaseBPPtr) += XQbep_Vbep * (s->real); - *(here->VBICbaseBPBaseBPPtr + 1) += XQbep_Vbep * (s->imag); - *(here->VBICbaseBPBaseBIPtr) += -XQbep_Vbci * (s->real); - *(here->VBICbaseBPBaseBIPtr + 1) += -XQbep_Vbci * (s->imag); - *(here->VBICbaseBPCollCIPtr) += XQbep_Vbci * (s->real); - *(here->VBICbaseBPCollCIPtr + 1) += XQbep_Vbci * (s->imag); -/* -c Stamp element: Qbcp -*/ - *(here->VBICsubsSISubsSIPtr) += XQbcp_Vbcp * (s->real); - *(here->VBICsubsSISubsSIPtr + 1) += XQbcp_Vbcp * (s->imag); - *(here->VBICsubsSIBaseBPPtr) += -XQbcp_Vbcp * (s->real); - *(here->VBICsubsSIBaseBPPtr + 1) += -XQbcp_Vbcp * (s->imag); - *(here->VBICbaseBPSubsSIPtr) += -XQbcp_Vbcp * (s->real); - *(here->VBICbaseBPSubsSIPtr + 1) += -XQbcp_Vbcp * (s->imag); - *(here->VBICbaseBPBaseBPPtr) += XQbcp_Vbcp * (s->real); - *(here->VBICbaseBPBaseBPPtr + 1) += XQbcp_Vbcp * (s->imag); - - } - } - return(OK); -} diff --git a/src/spicelib/devices/vbic/vbicsetup.c b/src/spicelib/devices/vbic/vbicsetup.c deleted file mode 100644 index ef6b238ea..000000000 --- a/src/spicelib/devices/vbic/vbicsetup.c +++ /dev/null @@ -1,640 +0,0 @@ -/********** -Copyright 1990 Regents of the University of California. All rights reserved. -Author: 1985 Thomas L. Quarles -Model Author: 1995 Colin McAndrew Motorola -Spice3 Implementation: 2003 Dietmar Warning DAnalyse GmbH -**********/ - -/* - * This routine should only be called when circuit topology - * changes, since its computations do not depend on most - * device or model parameters, only on topology (as - * affected by emitter, collector, and base resistances) - */ - -#include "ngspice/ngspice.h" -#include "ngspice/cktdefs.h" -#include "ngspice/smpdefs.h" -#include "vbicdefs.h" -#include "ngspice/const.h" -#include "ngspice/sperror.h" -#include "ngspice/ifsim.h" -#include "ngspice/suffix.h" - -int -VBICsetup(SMPmatrix *matrix, GENmodel *inModel, CKTcircuit *ckt, int *states) - /* load the VBIC structure with those pointers needed later - * for fast matrix loading - */ -{ - VBICmodel *model = (VBICmodel*)inModel; - VBICinstance *here; - int error; - CKTnode *tmp; - - /* loop through all the transistor models */ - for( ; model != NULL; model = VBICnextModel(model)) { - - if(model->VBICtype != NPN && model->VBICtype != PNP) { - model->VBICtype = NPN; - } - if(!model->VBICtnomGiven) { - model->VBICtnom = 27.0; - } - if(!model->VBICextCollResistGiven) { - model->VBICextCollResist = 0.0; - } - if(!model->VBICintCollResistGiven) { - model->VBICintCollResist = 0.1; - } - if(!model->VBICepiSatVoltageGiven) { - model->VBICepiSatVoltage = 0.0; - } - if(!model->VBICepiDopingGiven) { - model->VBICepiDoping = 0.0; - } - if(!model->VBIChighCurFacGiven) { - model->VBIChighCurFac = 1.0; - } - if(!model->VBICextBaseResistGiven) { - model->VBICextBaseResist = 0.0; - } - if(!model->VBICintBaseResistGiven) { - model->VBICintBaseResist = 0.1; - } - if(!model->VBICemitterResistGiven) { - model->VBICemitterResist = 0.0; - } - if(!model->VBICsubstrateResistGiven) { - model->VBICsubstrateResist = 0.0; - } - if(!model->VBICparBaseResistGiven) { - model->VBICparBaseResist = 0.1; - } - if(!model->VBICsatCurGiven) { - model->VBICsatCur = 1e-16; - } - if(!model->VBICemissionCoeffFGiven) { - model->VBICemissionCoeffF = 1.0; - } - if(!model->VBICemissionCoeffRGiven) { - model->VBICemissionCoeffR = 1.0; - } - if(!model->VBICdeplCapLimitFGiven) { - model->VBICdeplCapLimitF = 0.9; - } - if(!model->VBICextOverlapCapBEGiven) { - model->VBICextOverlapCapBE = 0.0; - } - if(!model->VBICdepletionCapBEGiven) { - model->VBICdepletionCapBE = 0.0; - } - if(!model->VBICpotentialBEGiven) { - model->VBICpotentialBE = 0.75; - } - if(!model->VBICjunctionExpBEGiven) { - model->VBICjunctionExpBE = 0.33; - } - if(!model->VBICsmoothCapBEGiven) { - model->VBICsmoothCapBE = -0.5; - } - if(!model->VBICextOverlapCapBCGiven) { - model->VBICextOverlapCapBC = 0.0; - } - if(!model->VBICdepletionCapBCGiven) { - model->VBICdepletionCapBC = 0.0; - } - if(!model->VBICepiChargeGiven) { - model->VBICepiCharge = 0.0; - } - if(!model->VBICextCapBCGiven) { - model->VBICextCapBC = 0.0; - } - if(!model->VBICpotentialBCGiven) { - model->VBICpotentialBC = 0.75; - } - if(!model->VBICjunctionExpBCGiven) { - model->VBICjunctionExpBC = 0.33; - } - if(!model->VBICsmoothCapBCGiven) { - model->VBICsmoothCapBC = -0.5; - } - if(!model->VBICextCapSCGiven) { - model->VBICextCapSC = 0.0; - } - if(!model->VBICpotentialSCGiven) { - model->VBICpotentialSC = 0.75; - } - if(!model->VBICjunctionExpSCGiven) { - model->VBICjunctionExpSC = 0.33; - } - if(!model->VBICsmoothCapSCGiven) { - model->VBICsmoothCapSC = -0.5; - } - if(!model->VBICidealSatCurBEGiven) { - model->VBICidealSatCurBE = 1e-18; - } - if(!model->VBICportionIBEIGiven) { - model->VBICportionIBEI = 1.0; - } - if(!model->VBICidealEmissCoeffBEGiven) { - model->VBICidealEmissCoeffBE = 1.0; - } - if(!model->VBICnidealSatCurBEGiven) { - model->VBICnidealSatCurBE = 0.0; - } - if(!model->VBICnidealEmissCoeffBEGiven) { - model->VBICnidealEmissCoeffBE = 2.0; - } - if(!model->VBICidealSatCurBCGiven) { - model->VBICidealSatCurBC = 1e-16; - } - if(!model->VBICidealEmissCoeffBCGiven) { - model->VBICidealEmissCoeffBC = 1.0; - } - if(!model->VBICnidealSatCurBCGiven) { - model->VBICnidealSatCurBC = 0.0; - } - if(!model->VBICnidealEmissCoeffBCGiven) { - model->VBICnidealEmissCoeffBC = 2.0; - } - if(!model->VBICavalanchePar1BCGiven) { - model->VBICavalanchePar1BC = 0.0; - } - if(!model->VBICavalanchePar2BCGiven) { - model->VBICavalanchePar2BC = 0.0; - } - if(!model->VBICparasitSatCurGiven) { - model->VBICparasitSatCur = 0.0; - } - if(!model->VBICportionICCPGiven) { - model->VBICportionICCP = 1.0; - } - if(!model->VBICparasitFwdEmissCoeffGiven) { - model->VBICparasitFwdEmissCoeff = 1.0; - } - if(!model->VBICidealParasitSatCurBEGiven) { - model->VBICidealParasitSatCurBE = 0.0; - } - if(!model->VBICnidealParasitSatCurBEGiven) { - model->VBICnidealParasitSatCurBE = 0.0; - } - if(!model->VBICidealParasitSatCurBCGiven) { - model->VBICidealParasitSatCurBC = 0.0; - } - if(!model->VBICidealParasitEmissCoeffBCGiven) { - model->VBICidealParasitEmissCoeffBC = 1.0; - } - if(!model->VBICnidealParasitSatCurBCGiven) { - model->VBICnidealParasitSatCurBC = 0.0; - } - if(!model->VBICnidealParasitEmissCoeffBCGiven) { - model->VBICnidealParasitEmissCoeffBC = 2.0; - } - if(!model->VBICearlyVoltFGiven) { - model->VBICearlyVoltF = 0.0; - } - if(!model->VBICearlyVoltRGiven) { - model->VBICearlyVoltR = 0.0; - } - if(!model->VBICrollOffFGiven) { - model->VBICrollOffF = 0.0; - } - if(!model->VBICrollOffRGiven) { - model->VBICrollOffR = 0.0; - } - if(!model->VBICparRollOffGiven) { - model->VBICparRollOff = 0.0; - } - if(!model->VBICtransitTimeFGiven) { - model->VBICtransitTimeF = 0.0; - } - if(!model->VBICvarTransitTimeFGiven) { - model->VBICvarTransitTimeF = 0.0; - } - if(!model->VBICtransitTimeBiasCoeffFGiven) { - model->VBICtransitTimeBiasCoeffF = 0.0; - } - if(!model->VBICtransitTimeFVBCGiven) { - model->VBICtransitTimeFVBC = 0.0; - } - if(!model->VBICtransitTimeHighCurrentFGiven) { - model->VBICtransitTimeHighCurrentF = 0.0; - } - if(!model->VBICtransitTimeRGiven) { - model->VBICtransitTimeR = 0.0; - } - if(!model->VBICdelayTimeFGiven) { - model->VBICdelayTimeF = 0.0; - } - if(!model->VBICfNcoefGiven) { - model->VBICfNcoef = 0.0; - } - if(!model->VBICfNexpAGiven) { - model->VBICfNexpA = 1.0; - } - if(!model->VBICfNexpBGiven) { - model->VBICfNexpB = 1.0; - } - if(!model->VBICtempExpREGiven) { - model->VBICtempExpRE = 0.0; - } - if(!model->VBICtempExpRBGiven) { - model->VBICtempExpRB = 0.0; - } - if(!model->VBICtempExpRBIGiven) { - model->VBICtempExpRBI = 0.0; - } - if(!model->VBICtempExpRCGiven) { - model->VBICtempExpRC = 0.0; - } - if(!model->VBICtempExpRCIGiven) { - model->VBICtempExpRCI = 0.0; - } - if(!model->VBICtempExpRSGiven) { - model->VBICtempExpRS = 0.0; - } - if(!model->VBICtempExpVOGiven) { - model->VBICtempExpVO = 0.0; - } - if(!model->VBICactivEnergyEAGiven) { - model->VBICactivEnergyEA = 1.12; - } - if(!model->VBICactivEnergyEAIEGiven) { - model->VBICactivEnergyEAIE = 1.12; - } - if(!model->VBICactivEnergyEAICGiven) { - model->VBICactivEnergyEAIC = 1.12; - } - if(!model->VBICactivEnergyEAISGiven) { - model->VBICactivEnergyEAIS = 1.12; - } - if(!model->VBICactivEnergyEANEGiven) { - model->VBICactivEnergyEANE = 1.12; - } - if(!model->VBICactivEnergyEANCGiven) { - model->VBICactivEnergyEANC = 1.12; - } - if(!model->VBICactivEnergyEANSGiven) { - model->VBICactivEnergyEANS = 1.12; - } - if(!model->VBICtempExpISGiven) { - model->VBICtempExpIS = 3.0; - } - if(!model->VBICtempExpIIGiven) { - model->VBICtempExpII = 3.0; - } - if(!model->VBICtempExpINGiven) { - model->VBICtempExpIN = 3.0; - } - if(!model->VBICtempExpNFGiven) { - model->VBICtempExpNF = 0.0; - } - if(!model->VBICtempExpAVCGiven) { - model->VBICtempExpAVC = 0.0; - } - if(!model->VBICthermalResistGiven) { - model->VBICthermalResist = 0.0; - } - if(!model->VBICthermalCapacitanceGiven) { - model->VBICthermalCapacitance = 0.0; - } - if(!model->VBICpunchThroughVoltageBCGiven) { - model->VBICpunchThroughVoltageBC = 0.0; - } - if(!model->VBICdeplCapCoeff1Given) { - model->VBICdeplCapCoeff1 = 0.1; - } - if(!model->VBICfixedCapacitanceCSGiven) { - model->VBICfixedCapacitanceCS = 0.0; - } - if(!model->VBICsgpQBselectorGiven) { - model->VBICsgpQBselector = 0.0; - } - if(!model->VBIChighCurrentBetaRolloffGiven) { - model->VBIChighCurrentBetaRolloff = 0.5; - } - if(!model->VBICtempExpIKFGiven) { - model->VBICtempExpIKF = 0.0; - } - if(!model->VBICtempExpRCXGiven) { - model->VBICtempExpRCX = 0.0; - } - if(!model->VBICtempExpRBXGiven) { - model->VBICtempExpRBX = 0.0; - } - if(!model->VBICtempExpRBPGiven) { - model->VBICtempExpRBP = 0.0; - } - if(!model->VBICsepISRRGiven) { - model->VBICsepISRR = 1.0; - } - if(!model->VBICtempExpXISRGiven) { - model->VBICtempExpXISR = 0.0; - } - if(!model->VBICdearGiven) { - model->VBICdear = 0.0; - } - if(!model->VBICeapGiven) { - model->VBICeap = 1.12; - } - if(!model->VBICvbbeGiven) { - model->VBICvbbe = 0.0; - } - if(!model->VBICnbbeGiven) { - model->VBICnbbe = 1.0; - } - if(!model->VBICibbeGiven) { - model->VBICibbe = 1e-06; - } - if(!model->VBICtvbbe1Given) { - model->VBICtvbbe1 = 0.0; - } - if(!model->VBICtvbbe2Given) { - model->VBICtvbbe2 = 0.0; - } - if(!model->VBICtnbbeGiven) { - model->VBICtnbbe = 0.0; - } - if(!model->VBICebbeGiven) { - model->VBICebbe = 0.0; - } - if(!model->VBIClocTempDiffGiven) { - model->VBIClocTempDiff = 0.0; - } - if(!model->VBICrevVersionGiven) { - model->VBICrevVersion = 1.2; - } - if(!model->VBICrefVersionGiven) { - model->VBICrefVersion = 0.0; - } - - if(model->VBICtempExpRBGiven && !model->VBICtempExpRBIGiven) { - model->VBICtempExpRBI = model->VBICtempExpRB; - } - if(model->VBICtempExpRBGiven && !model->VBICtempExpRBXGiven) { - model->VBICtempExpRBX = model->VBICtempExpRB; - } - if(model->VBICtempExpRCGiven && !model->VBICtempExpRCIGiven) { - model->VBICtempExpRCI = model->VBICtempExpRC; - } - if(model->VBICtempExpRCGiven && !model->VBICtempExpRCXGiven) { - model->VBICtempExpRCX = model->VBICtempExpRC; - } - - if(!model->VBICvbeMaxGiven) { - model->VBICvbeMax = 1e99; - } - if(!model->VBICvbcMaxGiven) { - model->VBICvbcMax = 1e99; - } - if(!model->VBICvceMaxGiven) { - model->VBICvceMax = 1e99; - } - - /* loop through all the instances of the model */ - for (here = VBICinstances(model); here != NULL ; - here=VBICnextInstance(here)) { - CKTnode *tmpNode; - IFuid tmpName; - - if(!here->VBICareaGiven) { - here->VBICarea = 1.0; - } - if(!here->VBICmGiven) { - here->VBICm = 1.0; - } - if(!here->VBICdtempGiven) { - here->VBICdtemp = 0.0; - } - - here->VBICstate = *states; - *states += VBICnumStates; - - if(model->VBICextCollResist == 0) { - here->VBICcollCXNode = here->VBICcollNode; - } else if(here->VBICcollCXNode == 0) { - error = CKTmkVolt(ckt,&tmp,here->VBICname,"collector"); - if(error) return(error); - here->VBICcollCXNode = tmp->number; - if (ckt->CKTcopyNodesets) { - if (CKTinst2Node(ckt,here,1,&tmpNode,&tmpName)==OK) { - if (tmpNode->nsGiven) { - tmp->nodeset=tmpNode->nodeset; - tmp->nsGiven=tmpNode->nsGiven; - } - } - } - } - if(model->VBICextBaseResist == 0) { - here->VBICbaseBXNode = here->VBICbaseNode; - } else if(here->VBICbaseBXNode == 0){ - error = CKTmkVolt(ckt,&tmp,here->VBICname, "base"); - if(error) return(error); - here->VBICbaseBXNode = tmp->number; - if (ckt->CKTcopyNodesets) { - if (CKTinst2Node(ckt,here,2,&tmpNode,&tmpName)==OK) { - if (tmpNode->nsGiven) { - tmp->nodeset=tmpNode->nodeset; - tmp->nsGiven=tmpNode->nsGiven; - } - } - } - } - if(model->VBICemitterResist == 0) { - here->VBICemitEINode = here->VBICemitNode; - } else if(here->VBICemitEINode == 0) { - error = CKTmkVolt(ckt,&tmp,here->VBICname, "emitter"); - if(error) return(error); - here->VBICemitEINode = tmp->number; - if (ckt->CKTcopyNodesets) { - if (CKTinst2Node(ckt,here,3,&tmpNode,&tmpName)==OK) { - if (tmpNode->nsGiven) { - tmp->nodeset=tmpNode->nodeset; - tmp->nsGiven=tmpNode->nsGiven; - } - } - } - } - if(model->VBICsubstrateResist == 0) { - here->VBICsubsSINode = here->VBICsubsNode; - } else if(here->VBICsubsSINode == 0) { - error = CKTmkVolt(ckt,&tmp,here->VBICname, "substrate"); - if(error) return(error); - here->VBICsubsSINode = tmp->number; - if (ckt->CKTcopyNodesets) { - if (CKTinst2Node(ckt,here,4,&tmpNode,&tmpName)==OK) { - if (tmpNode->nsGiven) { - tmp->nodeset=tmpNode->nodeset; - tmp->nsGiven=tmpNode->nsGiven; - } - } - } - } - - if((model->VBICthermalResistGiven) && (model->VBICthermalResist > 0.0)) - here->VBIC_selfheat = 1; - else - here->VBIC_selfheat = 0; - - if((model->VBICthermalResistGiven) && (model->VBICthermalCapacitance < 1e-12)) - model->VBICthermalCapacitance = 1e-12; - - - if(here->VBICcollCINode == 0) { - error = CKTmkVolt(ckt, &tmp, here->VBICname, "collCI"); - if(error) return(error); - here->VBICcollCINode = tmp->number; - } - - if(here->VBICbaseBPNode == 0) { - error = CKTmkVolt(ckt, &tmp, here->VBICname, "baseBP"); - if(error) return(error); - here->VBICbaseBPNode = tmp->number; - } - - if(here->VBICbaseBINode == 0) { - error = CKTmkVolt(ckt, &tmp, here->VBICname, "baseBI"); - if(error) return(error); - here->VBICbaseBINode = tmp->number; - } - -/* macro to make elements with built in test for out of memory */ -#define TSTALLOC(ptr,first,second) \ -do { if((here->ptr = SMPmakeElt(matrix, here->first, here->second)) == NULL){\ - return(E_NOMEM);\ -} } while(0) - TSTALLOC(VBICcollCollPtr,VBICcollNode,VBICcollNode); - TSTALLOC(VBICbaseBasePtr,VBICbaseNode,VBICbaseNode); - TSTALLOC(VBICemitEmitPtr,VBICemitNode,VBICemitNode); - TSTALLOC(VBICsubsSubsPtr,VBICsubsNode,VBICsubsNode); - TSTALLOC(VBICcollCXCollCXPtr,VBICcollCXNode,VBICcollCXNode); - TSTALLOC(VBICcollCICollCIPtr,VBICcollCINode,VBICcollCINode); - TSTALLOC(VBICbaseBXBaseBXPtr,VBICbaseBXNode,VBICbaseBXNode); - TSTALLOC(VBICbaseBIBaseBIPtr,VBICbaseBINode,VBICbaseBINode); - TSTALLOC(VBICemitEIEmitEIPtr,VBICemitEINode,VBICemitEINode); - TSTALLOC(VBICbaseBPBaseBPPtr,VBICbaseBPNode,VBICbaseBPNode); - TSTALLOC(VBICsubsSISubsSIPtr,VBICsubsSINode,VBICsubsSINode); - - TSTALLOC(VBICbaseEmitPtr,VBICbaseNode,VBICemitNode); - TSTALLOC(VBICemitBasePtr,VBICemitNode,VBICbaseNode); - TSTALLOC(VBICbaseCollPtr,VBICbaseNode,VBICcollNode); - TSTALLOC(VBICcollBasePtr,VBICcollNode,VBICbaseNode); - TSTALLOC(VBICcollCollCXPtr,VBICcollNode,VBICcollCXNode); - TSTALLOC(VBICbaseBaseBXPtr,VBICbaseNode,VBICbaseBXNode); - TSTALLOC(VBICemitEmitEIPtr,VBICemitNode,VBICemitEINode); - TSTALLOC(VBICsubsSubsSIPtr,VBICsubsNode,VBICsubsSINode); - TSTALLOC(VBICcollCXCollCIPtr,VBICcollCXNode,VBICcollCINode); - TSTALLOC(VBICcollCXBaseBXPtr,VBICcollCXNode,VBICbaseBXNode); - TSTALLOC(VBICcollCXBaseBIPtr,VBICcollCXNode,VBICbaseBINode); - TSTALLOC(VBICcollCXBaseBPPtr,VBICcollCXNode,VBICbaseBPNode); - TSTALLOC(VBICcollCIBaseBIPtr,VBICcollCINode,VBICbaseBINode); - TSTALLOC(VBICcollCIEmitEIPtr,VBICcollCINode,VBICemitEINode); - TSTALLOC(VBICbaseBXBaseBIPtr,VBICbaseBXNode,VBICbaseBINode); - TSTALLOC(VBICbaseBXEmitEIPtr,VBICbaseBXNode,VBICemitEINode); - TSTALLOC(VBICbaseBXBaseBPPtr,VBICbaseBXNode,VBICbaseBPNode); - TSTALLOC(VBICbaseBXSubsSIPtr,VBICbaseBXNode,VBICsubsSINode); - TSTALLOC(VBICbaseBIEmitEIPtr,VBICbaseBINode,VBICemitEINode); - TSTALLOC(VBICbaseBPSubsSIPtr,VBICbaseBPNode,VBICsubsSINode); - - TSTALLOC(VBICcollCXCollPtr,VBICcollCXNode,VBICcollNode); - TSTALLOC(VBICbaseBXBasePtr,VBICbaseBXNode,VBICbaseNode); - TSTALLOC(VBICemitEIEmitPtr,VBICemitEINode,VBICemitNode); - TSTALLOC(VBICsubsSISubsPtr,VBICsubsSINode,VBICsubsNode); - TSTALLOC(VBICcollCICollCXPtr,VBICcollCINode,VBICcollCXNode); - TSTALLOC(VBICbaseBICollCXPtr,VBICbaseBINode,VBICcollCXNode); - TSTALLOC(VBICbaseBPCollCXPtr,VBICbaseBPNode,VBICcollCXNode); - TSTALLOC(VBICbaseBXCollCIPtr,VBICbaseBXNode,VBICcollCINode); - TSTALLOC(VBICbaseBICollCIPtr,VBICbaseBINode,VBICcollCINode); - TSTALLOC(VBICemitEICollCIPtr,VBICemitEINode,VBICcollCINode); - TSTALLOC(VBICbaseBPCollCIPtr,VBICbaseBPNode,VBICcollCINode); - TSTALLOC(VBICbaseBIBaseBXPtr,VBICbaseBINode,VBICbaseBXNode); - TSTALLOC(VBICemitEIBaseBXPtr,VBICemitEINode,VBICbaseBXNode); - TSTALLOC(VBICbaseBPBaseBXPtr,VBICbaseBPNode,VBICbaseBXNode); - TSTALLOC(VBICsubsSIBaseBXPtr,VBICsubsSINode,VBICbaseBXNode); - TSTALLOC(VBICemitEIBaseBIPtr,VBICemitEINode,VBICbaseBINode); - TSTALLOC(VBICbaseBPBaseBIPtr,VBICbaseBPNode,VBICbaseBINode); - TSTALLOC(VBICsubsSICollCIPtr,VBICsubsSINode,VBICcollCINode); - TSTALLOC(VBICsubsSIBaseBIPtr,VBICsubsSINode,VBICbaseBINode); - TSTALLOC(VBICsubsSIBaseBPPtr,VBICsubsSINode,VBICbaseBPNode); - - if (here->VBIC_selfheat) { - TSTALLOC(VBICcollTempPtr,VBICcollNode,VBICtempNode); - TSTALLOC(VBICbaseTempPtr,VBICbaseNode,VBICtempNode); - TSTALLOC(VBICemitTempPtr,VBICemitNode,VBICtempNode); - TSTALLOC(VBICsubsTempPtr,VBICsubsNode,VBICtempNode); - TSTALLOC(VBICcollCItempPtr,VBICcollCINode,VBICtempNode); - TSTALLOC(VBICcollCXtempPtr,VBICcollCXNode,VBICtempNode); - TSTALLOC(VBICbaseBItempPtr,VBICbaseBINode,VBICtempNode); - TSTALLOC(VBICbaseBXtempPtr,VBICbaseBXNode,VBICtempNode); - TSTALLOC(VBICbaseBPtempPtr,VBICbaseBPNode,VBICtempNode); - TSTALLOC(VBICemitEItempPtr,VBICemitEINode,VBICtempNode); - TSTALLOC(VBICsubsSItempPtr,VBICsubsSINode,VBICtempNode); - TSTALLOC(VBICtempCollPtr,VBICtempNode,VBICcollNode); - TSTALLOC(VBICtempCollCIPtr,VBICtempNode,VBICcollCINode); - TSTALLOC(VBICtempCollCXPtr,VBICtempNode,VBICcollCXNode); - TSTALLOC(VBICtempBaseBIPtr,VBICtempNode,VBICbaseBINode); - TSTALLOC(VBICtempBasePtr,VBICtempNode,VBICbaseNode); - TSTALLOC(VBICtempBaseBXPtr,VBICtempNode,VBICbaseBXNode); - TSTALLOC(VBICtempBaseBPPtr,VBICtempNode,VBICbaseBPNode); - TSTALLOC(VBICtempEmitPtr,VBICtempNode,VBICemitNode); - TSTALLOC(VBICtempEmitEIPtr,VBICtempNode,VBICemitEINode); - TSTALLOC(VBICtempSubsPtr,VBICtempNode,VBICsubsNode); - TSTALLOC(VBICtempSubsSIPtr,VBICtempNode,VBICsubsSINode); - TSTALLOC(VBICtempTempPtr,VBICtempNode,VBICtempNode); - } - - } - } - return(OK); -} - -int -VBICunsetup( - GENmodel *inModel, - CKTcircuit *ckt) -{ - VBICmodel *model; - VBICinstance *here; - - for (model = (VBICmodel *)inModel; model != NULL; - model = VBICnextModel(model)) - { - for (here = VBICinstances(model); here != NULL; - here=VBICnextInstance(here)) - { - if (here->VBICbaseBINode > 0) - CKTdltNNum(ckt, here->VBICbaseBINode); - here->VBICbaseBINode = 0; - - if (here->VBICbaseBPNode > 0) - CKTdltNNum(ckt, here->VBICbaseBPNode); - here->VBICbaseBPNode = 0; - - if (here->VBICcollCINode > 0) - CKTdltNNum(ckt, here->VBICcollCINode); - here->VBICcollCINode = 0; - - if (here->VBICsubsSINode > 0 - && here->VBICsubsSINode != here->VBICsubsNode) - CKTdltNNum(ckt, here->VBICsubsSINode); - here->VBICsubsSINode = 0; - - if (here->VBICemitEINode > 0 - && here->VBICemitEINode != here->VBICemitNode) - CKTdltNNum(ckt, here->VBICemitEINode); - here->VBICemitEINode = 0; - - if (here->VBICbaseBXNode > 0 - && here->VBICbaseBXNode != here->VBICbaseNode) - CKTdltNNum(ckt, here->VBICbaseBXNode); - here->VBICbaseBXNode = 0; - - if (here->VBICcollCXNode > 0 - && here->VBICcollCXNode != here->VBICcollNode) - CKTdltNNum(ckt, here->VBICcollCXNode); - here->VBICcollCXNode = 0; - } - } - return OK; -} diff --git a/src/spicelib/devices/vbic/vbicsoachk.c b/src/spicelib/devices/vbic/vbicsoachk.c deleted file mode 100644 index 34d6755ac..000000000 --- a/src/spicelib/devices/vbic/vbicsoachk.c +++ /dev/null @@ -1,72 +0,0 @@ -/********** -Copyright 2013 Dietmar Warning. All rights reserved. -Author: 2013 Dietmar Warning -**********/ - -#include "ngspice/ngspice.h" -#include "ngspice/cktdefs.h" -#include "vbicdefs.h" -#include "ngspice/trandefs.h" -#include "ngspice/sperror.h" -#include "ngspice/suffix.h" -#include "ngspice/cpdefs.h" - - -int -VBICsoaCheck(CKTcircuit *ckt, GENmodel *inModel) -{ - VBICmodel *model = (VBICmodel *) inModel; - VBICinstance *here; - double vbe, vbc, vce; /* actual bjt voltages */ - int maxwarns; - static int warns_vbe = 0, warns_vbc = 0, warns_vce = 0; - - if (!ckt) { - warns_vbe = 0; - warns_vbc = 0; - warns_vce = 0; - return OK; - } - - maxwarns = ckt->CKTsoaMaxWarns; - - for (; model; model = VBICnextModel(model)) { - - for (here = VBICinstances(model); here; here=VBICnextInstance(here)) { - - vbe = fabs(ckt->CKTrhsOld [here->VBICbaseNode] - - ckt->CKTrhsOld [here->VBICemitNode]); - vbc = fabs(ckt->CKTrhsOld [here->VBICbaseNode] - - ckt->CKTrhsOld [here->VBICcollNode]); - vce = fabs(ckt->CKTrhsOld [here->VBICcollNode] - - ckt->CKTrhsOld [here->VBICemitNode]); - - if (vbe > model->VBICvbeMax) - if (warns_vbe < maxwarns) { - soa_printf(ckt, (GENinstance*) here, - "|Vbe|=%g has exceeded Vbe_max=%g\n", - vbe, model->VBICvbeMax); - warns_vbe++; - } - - if (vbc > model->VBICvbcMax) - if (warns_vbc < maxwarns) { - soa_printf(ckt, (GENinstance*) here, - "|Vbc|=%g has exceeded Vbc_max=%g\n", - vbc, model->VBICvbcMax); - warns_vbc++; - } - - if (vce > model->VBICvceMax) - if (warns_vce < maxwarns) { - soa_printf(ckt, (GENinstance*) here, - "|Vce|=%g has exceeded Vce_max=%g\n", - vce, model->VBICvceMax); - warns_vce++; - } - - } - } - - return OK; -} diff --git a/src/spicelib/devices/vbic/vbictemp.c b/src/spicelib/devices/vbic/vbictemp.c deleted file mode 100644 index 9b35acdfe..000000000 --- a/src/spicelib/devices/vbic/vbictemp.c +++ /dev/null @@ -1,449 +0,0 @@ -/********** -Copyright 1990 Regents of the University of California. All rights reserved. -Author: 1985 Thomas L. Quarles -Model Author: 1995 Colin McAndrew Motorola -Spice3 Implementation: 2003 Dietmar Warning DAnalyse GmbH -**********/ - -#include "ngspice/ngspice.h" -#include "ngspice/cktdefs.h" -#include "ngspice/smpdefs.h" -#include "vbicdefs.h" -#include "ngspice/const.h" -#include "ngspice/sperror.h" -#include "ngspice/ifsim.h" -#include "ngspice/suffix.h" - - -/* ARGSUSED */ - -int iret, vbic_4T_et_cf_t(double *, double *, double *); - -int -VBICtemp(GENmodel *inModel, CKTcircuit *ckt) - /* Pre-compute many useful parameters - */ -{ - VBICmodel *model = (VBICmodel *)inModel; - VBICinstance *here; - double p[108], pnom[108], TAMB; - double vt; - - /* loop through all the bipolar models */ - for( ; model != NULL; model = VBICnextModel(model)) { - - /* loop through all the instances of the model */ - for (here = VBICinstances(model); here != NULL ; - here=VBICnextInstance(here)) { - - if(!here->VBICtempGiven) here->VBICtemp = ckt->CKTtemp; - - if(here->VBICdtempGiven) here->VBICtemp = here->VBICtemp + here->VBICdtemp; - - TAMB = here->VBICtemp - CONSTCtoK; - - pnom[0] = model->VBICtnom; - pnom[1] = model->VBICextCollResist; - pnom[2] = model->VBICintCollResist; - pnom[3] = model->VBICepiSatVoltage; - pnom[4] = model->VBICepiDoping; - pnom[5] = model->VBIChighCurFac; - pnom[6] = model->VBICextBaseResist; - pnom[7] = model->VBICintBaseResist; - pnom[8] = model->VBICemitterResist; - pnom[9] = model->VBICsubstrateResist; - pnom[10] = model->VBICparBaseResist; - pnom[11] = model->VBICsatCur; - pnom[12] = model->VBICemissionCoeffF; - pnom[13] = model->VBICemissionCoeffR; - pnom[14] = model->VBICdeplCapLimitF; - pnom[15] = model->VBICextOverlapCapBE; - pnom[16] = model->VBICdepletionCapBE; - pnom[17] = model->VBICpotentialBE; - pnom[18] = model->VBICjunctionExpBE; - pnom[19] = model->VBICsmoothCapBE; - pnom[20] = model->VBICextOverlapCapBC; - pnom[21] = model->VBICdepletionCapBC; - pnom[22] = model->VBICepiCharge; - pnom[23] = model->VBICextCapBC; - pnom[24] = model->VBICpotentialBC; - pnom[25] = model->VBICjunctionExpBC; - pnom[26] = model->VBICsmoothCapBC; - pnom[27] = model->VBICextCapSC; - pnom[28] = model->VBICpotentialSC; - pnom[29] = model->VBICjunctionExpSC; - pnom[30] = model->VBICsmoothCapSC; - pnom[31] = model->VBICidealSatCurBE; - pnom[32] = model->VBICportionIBEI; - pnom[33] = model->VBICidealEmissCoeffBE; - pnom[34] = model->VBICnidealSatCurBE; - pnom[35] = model->VBICnidealEmissCoeffBE; - pnom[36] = model->VBICidealSatCurBC; - pnom[37] = model->VBICidealEmissCoeffBC; - pnom[38] = model->VBICnidealSatCurBC; - pnom[39] = model->VBICnidealEmissCoeffBC; - pnom[40] = model->VBICavalanchePar1BC; - pnom[41] = model->VBICavalanchePar2BC; - pnom[42] = model->VBICparasitSatCur; - pnom[43] = model->VBICportionICCP; - pnom[44] = model->VBICparasitFwdEmissCoeff; - pnom[45] = model->VBICidealParasitSatCurBE; - pnom[46] = model->VBICnidealParasitSatCurBE; - pnom[47] = model->VBICidealParasitSatCurBC; - pnom[48] = model->VBICidealParasitEmissCoeffBC; - pnom[49] = model->VBICnidealParasitSatCurBC; - pnom[50] = model->VBICnidealParasitEmissCoeffBC; - pnom[51] = model->VBICearlyVoltF; - pnom[52] = model->VBICearlyVoltR; - pnom[53] = model->VBICrollOffF; - pnom[54] = model->VBICrollOffR; - pnom[55] = model->VBICparRollOff; - pnom[56] = model->VBICtransitTimeF; - pnom[57] = model->VBICvarTransitTimeF; - pnom[58] = model->VBICtransitTimeBiasCoeffF; - pnom[59] = model->VBICtransitTimeFVBC; - pnom[60] = model->VBICtransitTimeHighCurrentF; - pnom[61] = model->VBICtransitTimeR; - pnom[62] = model->VBICdelayTimeF; - pnom[63] = model->VBICfNcoef; - pnom[64] = model->VBICfNexpA; - pnom[65] = model->VBICfNexpB; - pnom[66] = model->VBICtempExpRE; - pnom[67] = model->VBICtempExpRBI; - pnom[68] = model->VBICtempExpRCI; - pnom[69] = model->VBICtempExpRS; - pnom[70] = model->VBICtempExpVO; - pnom[71] = model->VBICactivEnergyEA; - pnom[72] = model->VBICactivEnergyEAIE; - pnom[73] = model->VBICactivEnergyEAIC; - pnom[74] = model->VBICactivEnergyEAIS; - pnom[75] = model->VBICactivEnergyEANE; - pnom[76] = model->VBICactivEnergyEANC; - pnom[77] = model->VBICactivEnergyEANS; - pnom[78] = model->VBICtempExpIS; - pnom[79] = model->VBICtempExpII; - pnom[80] = model->VBICtempExpIN; - pnom[81] = model->VBICtempExpNF; - pnom[82] = model->VBICtempExpAVC; - pnom[83] = model->VBICthermalResist; - pnom[84] = model->VBICthermalCapacitance; - pnom[85] = model->VBICpunchThroughVoltageBC; - pnom[86] = model->VBICdeplCapCoeff1; - pnom[87] = model->VBICfixedCapacitanceCS; - pnom[88] = model->VBICsgpQBselector; - pnom[89] = model->VBIChighCurrentBetaRolloff; - pnom[90] = model->VBICtempExpIKF; - pnom[91] = model->VBICtempExpRCX; - pnom[92] = model->VBICtempExpRBX; - pnom[93] = model->VBICtempExpRBP; - pnom[94] = model->VBICsepISRR; - pnom[95] = model->VBICtempExpXISR; - pnom[96] = model->VBICdear; - pnom[97] = model->VBICeap; - pnom[98] = model->VBICvbbe; - pnom[99] = model->VBICnbbe; - pnom[100] = model->VBICibbe; - pnom[101] = model->VBICtvbbe1; - pnom[102] = model->VBICtvbbe2; - pnom[103] = model->VBICtnbbe; - pnom[104] = model->VBICebbe; - pnom[105] = model->VBIClocTempDiff; - pnom[106] = model->VBICrevVersion; - pnom[107] = model->VBICrefVersion; - - iret = vbic_4T_et_cf_t(p,pnom,&TAMB); - - here->VBICtextCollResist = p[1]; - here->VBICtintCollResist = p[2]; - here->VBICtepiSatVoltage = p[3]; - here->VBICtepiDoping = p[4]; - here->VBICtextBaseResist = p[6]; - here->VBICtintBaseResist = p[7]; - here->VBICtemitterResist = p[8]; - here->VBICtsubstrateResist = p[9]; - here->VBICtparBaseResist = p[10]; - here->VBICtsatCur = p[11]; - here->VBICtemissionCoeffF = p[12]; - here->VBICtemissionCoeffR = p[13]; - here->VBICtdepletionCapBE = p[16]; - here->VBICtpotentialBE = p[17]; - here->VBICtdepletionCapBC = p[21]; - here->VBICtextCapBC = p[23]; - here->VBICtpotentialBC = p[24]; - here->VBICtextCapSC = p[27]; - here->VBICtpotentialSC = p[28]; - here->VBICtidealSatCurBE = p[31]; - here->VBICtnidealSatCurBE = p[34]; - here->VBICtidealSatCurBC = p[36]; - here->VBICtnidealSatCurBC = p[38]; - here->VBICtavalanchePar2BC = p[41]; - here->VBICtparasitSatCur = p[42]; - here->VBICtidealParasitSatCurBE = p[45]; - here->VBICtnidealParasitSatCurBE = p[46]; - here->VBICtidealParasitSatCurBC = p[47]; - here->VBICtnidealParasitSatCurBC = p[49]; - here->VBICtrollOffF = p[53]; - here->VBICtsepISRR = p[94]; - here->VBICtvbbe = p[98]; - here->VBICtnbbe = p[99]; - - vt = here->VBICtemp * CONSTKoverQ; - here->VBICtVcrit = vt * - log(vt / (CONSTroot2*model->VBICsatCur*here->VBICarea*here->VBICm)); - } - } - return(OK); -} - -int vbic_4T_et_cf_t(double *p, double *pnom, double *TAMB) -{ - double Tini, Tdev, Vtv, rT, dT, xvar1; - double xvar2, xvar3, xvar4, xvar5, xvar6, psiio; - double psiin; - -/* Direct copy p<-pnom for temperature independent parameters */ - - p[5]=pnom[5]; - p[14]=pnom[14]; - p[15]=pnom[15]; - p[18]=pnom[18]; - p[19]=pnom[19]; - p[20]=pnom[20]; - p[22]=pnom[22]; - p[25]=pnom[25]; - p[26]=pnom[26]; - p[29]=pnom[29]; - p[30]=pnom[30]; - p[32]=pnom[32]; - p[33]=pnom[33]; - p[35]=pnom[35]; - p[37]=pnom[37]; - p[39]=pnom[39]; - p[40]=pnom[40]; - p[43]=pnom[43]; - p[44]=pnom[44]; - p[48]=pnom[48]; - p[50]=pnom[50]; - p[51]=pnom[51]; - p[52]=pnom[52]; - p[54]=pnom[54]; - p[55]=pnom[55]; - p[56]=pnom[56]; - p[57]=pnom[57]; - p[58]=pnom[58]; - p[59]=pnom[59]; - p[60]=pnom[60]; - p[61]=pnom[61]; - p[62]=pnom[62]; - p[63]=pnom[63]; - p[64]=pnom[64]; - p[65]=pnom[65]; - p[66]=pnom[66]; - p[67]=pnom[67]; - p[68]=pnom[68]; - p[69]=pnom[69]; - p[70]=pnom[70]; - p[71]=pnom[71]; - p[72]=pnom[72]; - p[73]=pnom[73]; - p[74]=pnom[74]; - p[75]=pnom[75]; - p[76]=pnom[76]; - p[77]=pnom[77]; - p[78]=pnom[78]; - p[79]=pnom[79]; - p[80]=pnom[80]; - p[81]=pnom[81]; - p[82]=pnom[82]; - p[83]=pnom[83]; - p[84]=pnom[84]; - p[85]=pnom[85]; - p[86]=pnom[86]; - p[87]=pnom[87]; - p[88]=pnom[88]; - p[89]=pnom[89]; - p[90]=pnom[90]; - p[91]=pnom[91]; - p[92]=pnom[92]; - p[93]=pnom[93]; - p[95]=pnom[95]; - p[96]=pnom[96]; - p[97]=pnom[97]; - p[100]=pnom[100]; - p[101]=pnom[101]; - p[102]=pnom[102]; - p[103]=pnom[103]; - p[105]=pnom[105]; - p[106]=pnom[106]; - p[107]=pnom[107]; - -/* Temperature mappings for model parameters */ - - Tini=2.731500e+02+pnom[0]; - Tdev=(2.731500e+02+(*TAMB))+pnom[105]; - Vtv=1.380662e-23*Tdev/1.602189e-19; - rT=Tdev/Tini; - dT=Tdev-Tini; - xvar1=pow(rT,pnom[90]); - p[53]=pnom[53]*xvar1; - xvar1=pow(rT,pnom[91]); - p[1]=pnom[1]*xvar1; - xvar1=pow(rT,pnom[68]); - p[2]=pnom[2]*xvar1; - xvar1=pow(rT,pnom[92]); - p[6]=pnom[6]*xvar1; - xvar1=pow(rT,pnom[67]); - p[7]=pnom[7]*xvar1; - xvar1=pow(rT,pnom[66]); - p[8]=pnom[8]*xvar1; - xvar1=pow(rT,pnom[69]); - p[9]=pnom[9]*xvar1; - xvar1=pow(rT,pnom[93]); - p[10]=pnom[10]*xvar1; - xvar2=pow(rT,pnom[78]); - xvar3=-pnom[71]*(1.0-rT)/Vtv; - xvar4=exp(xvar3); - xvar1=(xvar2*xvar4); - xvar5=(1.0/pnom[12]); - xvar6=pow(xvar1,xvar5); - p[11]=pnom[11]*xvar6; - xvar2=pow(rT,pnom[95]); - xvar3=-pnom[96]*(1.0-rT)/Vtv; - xvar4=exp(xvar3); - xvar1=(xvar2*xvar4); - xvar5=(1.0/pnom[13]); - xvar6=pow(xvar1,xvar5); - p[94]=pnom[94]*xvar6; - xvar2=pow(rT,pnom[78]); - xvar3=-pnom[97]*(1.0-rT)/Vtv; - xvar4=exp(xvar3); - xvar1=(xvar2*xvar4); - xvar5=(1.0/pnom[44]); - xvar6=pow(xvar1,xvar5); - p[42]=pnom[42]*xvar6; - xvar2=pow(rT,pnom[79]); - xvar3=-pnom[72]*(1.0-rT)/Vtv; - xvar4=exp(xvar3); - xvar1=(xvar2*xvar4); - xvar5=(1.0/pnom[33]); - xvar6=pow(xvar1,xvar5); - p[31]=pnom[31]*xvar6; - xvar2=pow(rT,pnom[80]); - xvar3=-pnom[75]*(1.0-rT)/Vtv; - xvar4=exp(xvar3); - xvar1=(xvar2*xvar4); - xvar5=(1.0/pnom[35]); - xvar6=pow(xvar1,xvar5); - p[34]=pnom[34]*xvar6; - xvar2=pow(rT,pnom[79]); - xvar3=-pnom[73]*(1.0-rT)/Vtv; - xvar4=exp(xvar3); - xvar1=(xvar2*xvar4); - xvar5=(1.0/pnom[37]); - xvar6=pow(xvar1,xvar5); - p[36]=pnom[36]*xvar6; - xvar2=pow(rT,pnom[80]); - xvar3=-pnom[76]*(1.0-rT)/Vtv; - xvar4=exp(xvar3); - xvar1=(xvar2*xvar4); - xvar5=(1.0/pnom[39]); - xvar6=pow(xvar1,xvar5); - p[38]=pnom[38]*xvar6; - xvar2=pow(rT,pnom[79]); - xvar3=-pnom[73]*(1.0-rT)/Vtv; - xvar4=exp(xvar3); - xvar1=(xvar2*xvar4); - xvar5=(1.0/pnom[37]); - xvar6=pow(xvar1,xvar5); - p[45]=pnom[45]*xvar6; - xvar2=pow(rT,pnom[80]); - xvar3=-pnom[76]*(1.0-rT)/Vtv; - xvar4=exp(xvar3); - xvar1=(xvar2*xvar4); - xvar5=(1.0/pnom[39]); - xvar6=pow(xvar1,xvar5); - p[46]=pnom[46]*xvar6; - xvar2=pow(rT,pnom[79]); - xvar3=-pnom[74]*(1.0-rT)/Vtv; - xvar4=exp(xvar3); - xvar1=(xvar2*xvar4); - xvar5=(1.0/pnom[48]); - xvar6=pow(xvar1,xvar5); - p[47]=pnom[47]*xvar6; - xvar2=pow(rT,pnom[80]); - xvar3=-pnom[77]*(1.0-rT)/Vtv; - xvar4=exp(xvar3); - xvar1=(xvar2*xvar4); - xvar5=(1.0/pnom[50]); - xvar6=pow(xvar1,xvar5); - p[49]=pnom[49]*xvar6; - p[12]=pnom[12]*(1.0+dT*pnom[81]); - p[13]=pnom[13]*(1.0+dT*pnom[81]); - p[41]=pnom[41]*(1.0+dT*pnom[82]); - p[98]=pnom[98]*(1.0+dT*(pnom[101]+dT*pnom[102])); - p[99]=pnom[99]*(1.0+dT*pnom[103]); - xvar2=0.5*pnom[17]*rT/Vtv; - xvar3=exp(xvar2); - xvar4=-0.5*pnom[17]*rT/Vtv; - xvar5=exp(xvar4); - xvar1=xvar3-xvar5; - xvar6=log(xvar1); - psiio=2.0*(Vtv/rT)*xvar6; - xvar1=log(rT); - psiin=psiio*rT-3.0*Vtv*xvar1-pnom[72]*(rT-1.0); - xvar2=-psiin/Vtv; - xvar3=exp(xvar2); - xvar1=0.5*(1.0+sqrt(1.0+4.0*xvar3)); - xvar4=log(xvar1); - p[17]=psiin+2.0*Vtv*xvar4; - xvar2=0.5*pnom[24]*rT/Vtv; - xvar3=exp(xvar2); - xvar4=-0.5*pnom[24]*rT/Vtv; - xvar5=exp(xvar4); - xvar1=xvar3-xvar5; - xvar6=log(xvar1); - psiio=2.0*(Vtv/rT)*xvar6; - xvar1=log(rT); - psiin=psiio*rT-3.0*Vtv*xvar1-pnom[73]*(rT-1.0); - xvar2=-psiin/Vtv; - xvar3=exp(xvar2); - xvar1=0.5*(1.0+sqrt(1.0+4.0*xvar3)); - xvar4=log(xvar1); - p[24]=psiin+2.0*Vtv*xvar4; - xvar2=0.5*pnom[28]*rT/Vtv; - xvar3=exp(xvar2); - xvar4=-0.5*pnom[28]*rT/Vtv; - xvar5=exp(xvar4); - xvar1=xvar3-xvar5; - xvar6=log(xvar1); - psiio=2.0*(Vtv/rT)*xvar6; - xvar1=log(rT); - psiin=psiio*rT-3.0*Vtv*xvar1-pnom[74]*(rT-1.0); - xvar2=-psiin/Vtv; - xvar3=exp(xvar2); - xvar1=0.5*(1.0+sqrt(1.0+4.0*xvar3)); - xvar4=log(xvar1); - p[28]=psiin+2.0*Vtv*xvar4; - xvar1=pnom[17]/p[17]; - xvar2=pow(xvar1,pnom[18]); - p[16]=pnom[16]*xvar2; - xvar1=pnom[24]/p[24]; - xvar2=pow(xvar1,pnom[25]); - p[21]=pnom[21]*xvar2; - xvar1=pnom[24]/p[24]; - xvar2=pow(xvar1,pnom[25]); - p[23]=pnom[23]*xvar2; - xvar1=pnom[28]/p[28]; - xvar2=pow(xvar1,pnom[29]); - p[27]=pnom[27]*xvar2; - xvar1=pow(rT,pnom[78]); - xvar2=-pnom[71]*(1.0-rT)/Vtv; - xvar3=exp(xvar2); - p[4]=pnom[4]*xvar1*xvar3; - xvar1=pow(rT,pnom[70]); - p[3]=pnom[3]*xvar1; - xvar1=-p[98]/(p[99]*Vtv); - p[104]=exp(xvar1); - p[0]=(*TAMB)+p[105]; - return(0); -} diff --git a/src/spicelib/devices/vbic/vbictrunc.c b/src/spicelib/devices/vbic/vbictrunc.c deleted file mode 100644 index eb8603edf..000000000 --- a/src/spicelib/devices/vbic/vbictrunc.c +++ /dev/null @@ -1,41 +0,0 @@ -/********** -Copyright 1990 Regents of the University of California. All rights reserved. -Author: 1985 Thomas L. Quarles -Model Author: 1995 Colin McAndrew Motorola -Spice3 Implementation: 2003 Dietmar Warning DAnalyse GmbH -**********/ - -/* - * This routine performs truncation error calculations for - * VBICs in the circuit. - */ - -#include "ngspice/ngspice.h" -#include "ngspice/cktdefs.h" -#include "vbicdefs.h" -#include "ngspice/sperror.h" -#include "ngspice/suffix.h" - - -int -VBICtrunc(GENmodel *inModel, CKTcircuit *ckt, double *timeStep) -{ - VBICmodel *model = (VBICmodel*)inModel; - VBICinstance *here; - - for( ; model != NULL; model = VBICnextModel(model)) { - for(here=VBICinstances(model);here!=NULL; - here = VBICnextInstance(here)){ - - CKTterr(here->VBICqbe,ckt,timeStep); - CKTterr(here->VBICqbex,ckt,timeStep); - CKTterr(here->VBICqbc,ckt,timeStep); - CKTterr(here->VBICqbcx,ckt,timeStep); - CKTterr(here->VBICqbep,ckt,timeStep); - CKTterr(here->VBICqbeo,ckt,timeStep); - CKTterr(here->VBICqbco,ckt,timeStep); - CKTterr(here->VBICqbcp,ckt,timeStep); - } - } - return(OK); -} diff --git a/src/spicelib/devices/vccs/Makefile.am b/src/spicelib/devices/vccs/Makefile.am deleted file mode 100644 index c5800f22e..000000000 --- a/src/spicelib/devices/vccs/Makefile.am +++ /dev/null @@ -1,26 +0,0 @@ -## Process this file with automake to produce Makefile.in - -noinst_LTLIBRARIES = libvccs.la - -libvccs_la_SOURCES = \ - vccs.c \ - vccsask.c \ - vccsdefs.h \ - vccsext.h \ - vccsinit.c \ - vccsinit.h \ - vccsitf.h \ - vccsload.c \ - vccspar.c \ - vccspzld.c \ - vccssacl.c \ - vccsset.c \ - vccssld.c \ - vccssprt.c \ - vccssset.c - - - -AM_CPPFLAGS = @AM_CPPFLAGS@ -I$(top_srcdir)/src/include -AM_CFLAGS = $(STATIC) -MAINTAINERCLEANFILES = Makefile.in diff --git a/src/spicelib/devices/vccs/vccs.c b/src/spicelib/devices/vccs/vccs.c deleted file mode 100644 index 087f3cc28..000000000 --- a/src/spicelib/devices/vccs/vccs.c +++ /dev/null @@ -1,46 +0,0 @@ -/********** -Copyright 1990 Regents of the University of California. All rights reserved. -Author: 1987 Thomas L. Quarles -**********/ - -#include "ngspice/ngspice.h" -#include "ngspice/devdefs.h" -#include "ngspice/ifsim.h" -#include "vccsdefs.h" -#include "ngspice/suffix.h" - -IFparm VCCSpTable[] = { /* parameters */ - IOPU("gain", VCCS_TRANS, IF_REAL, "Transconductance of source (gain)"), - IOP ( "m", VCCS_M, IF_REAL , "Parallel multiplier"), - IP("sens_trans", VCCS_TRANS_SENS,IF_FLAG, - "flag to request sensitivity WRT transconductance"), - OPU("pos_node", VCCS_POS_NODE, IF_INTEGER, "Positive node of source"), - OPU("neg_node", VCCS_NEG_NODE, IF_INTEGER, "Negative node of source"), - OPU("cont_p_node",VCCS_CONT_P_NODE,IF_INTEGER, - "Positive node of contr. source"), - OPU("cont_n_node",VCCS_CONT_N_NODE,IF_INTEGER, - "Negative node of contr. source"), - IP("ic", VCCS_IC, IF_REAL, "Initial condition of controlling source"), - OP("i", VCCS_CURRENT,IF_REAL, "Output current"), - OP("v", VCCS_VOLTS,IF_REAL, "Voltage across output"), - OP("p", VCCS_POWER, IF_REAL, "Power"), - OPU("sens_dc", VCCS_QUEST_SENS_DC, IF_REAL, "dc sensitivity "), - OPU("sens_real", VCCS_QUEST_SENS_REAL, IF_REAL, "real part of ac sensitivity"), - OPU("sens_imag", VCCS_QUEST_SENS_IMAG, IF_REAL, "imag part of ac sensitivity"), - OPU("sens_mag", VCCS_QUEST_SENS_MAG, IF_REAL, "sensitivity of ac magnitude"), - OPU("sens_ph", VCCS_QUEST_SENS_PH, IF_REAL, "sensitivity of ac phase"), - OPU("sens_cplx", VCCS_QUEST_SENS_CPLX, IF_COMPLEX, "ac sensitivity") -}; - -char *VCCSnames[] = { - "V+", - "V-", - "VC+", - "VC-" -}; - -int VCCSnSize = NUMELEMS(VCCSnames); -int VCCSpTSize = NUMELEMS(VCCSpTable); -int VCCSmPTSize = 0; -int VCCSiSize = sizeof(VCCSinstance); -int VCCSmSize = sizeof(VCCSmodel); diff --git a/src/spicelib/devices/vccs/vccsask.c b/src/spicelib/devices/vccs/vccsask.c deleted file mode 100644 index 64eef29af..000000000 --- a/src/spicelib/devices/vccs/vccsask.c +++ /dev/null @@ -1,145 +0,0 @@ -/********** -Copyright 1990 Regents of the University of California. All rights reserved. -Author: 1987 Thomas L. Quarles -**********/ - -/* - * This routine gives access to the internal device parameters - * of Voltage Controlled Current Source - */ - -#include "ngspice/ngspice.h" -#include "ngspice/cktdefs.h" -#include "ngspice/devdefs.h" -#include "ngspice/ifsim.h" -#include "vccsdefs.h" -#include "ngspice/sperror.h" -#include "ngspice/suffix.h" - -/* ARGSUSED */ -int -VCCSask(CKTcircuit *ckt, GENinstance *inst, int which, IFvalue *value, IFvalue *select) -{ - VCCSinstance *here = (VCCSinstance*)inst; - double vr; - double vi; - double sr; - double si; - double vm; - static char *msg = "Current and power not available for ac analysis"; - switch(which) { - case VCCS_TRANS: - value->rValue = here->VCCScoeff; - return (OK); - case VCCS_M: - value->rValue = here->VCCSmValue; - return (OK); - case VCCS_POS_NODE: - value->iValue = here->VCCSposNode; - return (OK); - case VCCS_NEG_NODE: - value->iValue = here->VCCSnegNode; - return (OK); - case VCCS_CONT_P_NODE: - value->iValue = here->VCCScontPosNode; - return (OK); - case VCCS_CONT_N_NODE: - value->iValue = here->VCCScontNegNode; - return (OK); - case VCCS_CONT_V_OLD: - value->rValue = *(ckt->CKTstate0 + here->VCCScontVOld); - return (OK); - case VCCS_QUEST_SENS_DC: - if(ckt->CKTsenInfo){ - value->rValue = *(ckt->CKTsenInfo->SEN_Sap[select->iValue + 1]+ - here->VCCSsenParmNo); - } - return(OK); - case VCCS_QUEST_SENS_REAL: - if(ckt->CKTsenInfo){ - value->rValue = *(ckt->CKTsenInfo->SEN_RHS[select->iValue + 1]+ - here->VCCSsenParmNo); - } - return(OK); - case VCCS_QUEST_SENS_IMAG: - if(ckt->CKTsenInfo){ - value->rValue = *(ckt->CKTsenInfo->SEN_iRHS[select->iValue + 1]+ - here->VCCSsenParmNo); - } - return(OK); - case VCCS_QUEST_SENS_MAG: - if(ckt->CKTsenInfo){ - vr = *(ckt->CKTrhsOld + select->iValue + 1); - vi = *(ckt->CKTirhsOld + select->iValue + 1); - vm = sqrt(vr*vr + vi*vi); - if(vm == 0){ - value->rValue = 0; - return(OK); - } - sr = *(ckt->CKTsenInfo->SEN_RHS[select->iValue + 1]+ - here->VCCSsenParmNo); - si = *(ckt->CKTsenInfo->SEN_iRHS[select->iValue + 1]+ - here->VCCSsenParmNo); - value->rValue = (vr * sr + vi * si)/vm; - } - return(OK); - case VCCS_QUEST_SENS_PH: - if(ckt->CKTsenInfo){ - vr = *(ckt->CKTrhsOld + select->iValue + 1); - vi = *(ckt->CKTirhsOld + select->iValue + 1); - vm = vr*vr + vi*vi; - if(vm == 0){ - value->rValue = 0; - return(OK); - } - sr = *(ckt->CKTsenInfo->SEN_RHS[select->iValue + 1]+ - here->VCCSsenParmNo); - si = *(ckt->CKTsenInfo->SEN_iRHS[select->iValue + 1]+ - here->VCCSsenParmNo); - value->rValue = (vr * si - vi * sr)/vm; - } - return(OK); - case VCCS_QUEST_SENS_CPLX: - if(ckt->CKTsenInfo){ - value->cValue.real= - *(ckt->CKTsenInfo->SEN_RHS[select->iValue + 1]+ - here->VCCSsenParmNo); - value->cValue.imag= - *(ckt->CKTsenInfo->SEN_iRHS[select->iValue + 1]+ - here->VCCSsenParmNo); - } - return(OK); - case VCCS_CURRENT: - if (ckt->CKTcurrentAnalysis & DOING_AC) { - errMsg = TMALLOC(char, strlen(msg) + 1); - errRtn = "VCCSask"; - strcpy(errMsg,msg); - return(E_ASKCURRENT); - } else { - value->rValue = (*(ckt->CKTrhsOld+here->VCCScontPosNode) - - *(ckt->CKTrhsOld + here->VCCScontNegNode)) * - (here->VCCScoeff); - } - return (OK); - case VCCS_VOLTS: - value->rValue = (*(ckt->CKTrhsOld+here->VCCSposNode) - - *(ckt->CKTrhsOld + here->VCCSnegNode)); - return (OK); - case VCCS_POWER: - if (ckt->CKTcurrentAnalysis & DOING_AC) { - errMsg = TMALLOC(char, strlen(msg) + 1); - errRtn = "VCCSask"; - strcpy(errMsg,msg); - return(E_ASKPOWER); - } else { - value->rValue = (*(ckt->CKTrhsOld+here->VCCScontPosNode) - - *(ckt->CKTrhsOld + here->VCCScontNegNode)) * - (here->VCCScoeff) * (*(ckt->CKTrhsOld+here->VCCSposNode) - - *(ckt->CKTrhsOld + here->VCCSnegNode)); - } - return (OK); - default: - return (E_BADPARM); - } - /* NOTREACHED */ -} diff --git a/src/spicelib/devices/vccs/vccsdefs.h b/src/spicelib/devices/vccs/vccsdefs.h deleted file mode 100644 index dfe146852..000000000 --- a/src/spicelib/devices/vccs/vccsdefs.h +++ /dev/null @@ -1,102 +0,0 @@ -/********** -Copyright 1990 Regents of the University of California. All rights reserved. -Author: 1985 Thomas L. Quarles -**********/ - -#ifndef VCCS -#define VCCS - -#include "ngspice/ifsim.h" -#include "ngspice/cktdefs.h" -#include "ngspice/gendefs.h" -#include "ngspice/complex.h" - - /* - * structures to describe Voltage Controlled Current Sources - */ - -/* information to describe a single instance */ - -typedef struct sVCCSinstance { - - struct GENinstance gen; - -#define VCCSmodPtr(inst) ((struct sVCCSmodel *)((inst)->gen.GENmodPtr)) -#define VCCSnextInstance(inst) ((struct sVCCSinstance *)((inst)->gen.GENnextInstance)) -#define VCCSname gen.GENname -#define VCCSstates gen.GENstate - - const int VCCSposNode; /* number of positive node of source */ - const int VCCSnegNode; /* number of negative node of source */ - const int VCCScontPosNode; /* number of positive node of controlling source */ - const int VCCScontNegNode; /* number of negative node of controlling source */ - - double VCCSinitCond; /* initial condition (of controlling source) */ - double VCCScoeff; /* coefficient */ - double VCCSmValue; /* Parallel multiplier */ - - double *VCCSposContPosPtr; /* pointer to sparse matrix element at - * (positive node, control positive node) */ - double *VCCSposContNegPtr; /* pointer to sparse matrix element at - * (negative node, control negative node) */ - double *VCCSnegContPosPtr; /* pointer to sparse matrix element at - * (positive node, control positive node) */ - double *VCCSnegContNegPtr; /* pointer to sparse matrix element at - * (negative node, control negative node) */ - unsigned VCCScoeffGiven :1 ;/* flag to indicate function coeffs given */ - unsigned VCCSmGiven :1 ;/* flag to indicate multiplier given */ - - int VCCSsenParmNo; /* parameter # for sensitivity use; - set equal to 0 if not a design parameter*/ - -} VCCSinstance ; - -#define VCCSvOld VCCSstates -#define VCCScontVOld VCCSstates + 1 - -/* per model data */ - -typedef struct sVCCSmodel { /* model structure for a source */ - - struct GENmodel gen; - -#define VCCSmodType gen.GENmodType -#define VCCSnextModel(inst) ((struct sVCCSmodel *)((inst)->gen.GENnextModel)) -#define VCCSinstances(inst) ((VCCSinstance *)((inst)->gen.GENinstances)) -#define VCCSmodName gen.GENmodName - -} VCCSmodel; - -/* device parameters */ -enum { - VCCS_TRANS = 1, - VCCS_IC, - VCCS_POS_NODE, - VCCS_NEG_NODE, - VCCS_CONT_P_NODE, - VCCS_CONT_N_NODE, - VCCS_CONT_V_OLD, - VCCS_TRANS_SENS, - VCCS_CURRENT, - VCCS_POWER, - VCCS_VOLTS, - VCCS_M, -}; - -/* model parameters */ - -/* device questions */ -enum { - VCCS_QUEST_SENS_REAL = 201, - VCCS_QUEST_SENS_IMAG, - VCCS_QUEST_SENS_MAG, - VCCS_QUEST_SENS_PH, - VCCS_QUEST_SENS_CPLX, - VCCS_QUEST_SENS_DC, -}; - -/* model questions */ - -#include "vccsext.h" - -#endif /*VCCS*/ diff --git a/src/spicelib/devices/vccs/vccsext.h b/src/spicelib/devices/vccs/vccsext.h deleted file mode 100644 index 4220e6888..000000000 --- a/src/spicelib/devices/vccs/vccsext.h +++ /dev/null @@ -1,14 +0,0 @@ -/********** -Copyright 1990 Regents of the University of California. All rights reserved. -Author: 1985 Thomas L. Quarles -**********/ - -extern int VCCSask(CKTcircuit*,GENinstance*,int,IFvalue*,IFvalue*); -extern int VCCSload(GENmodel*,CKTcircuit*); -extern int VCCSparam(int,IFvalue*,GENinstance*,IFvalue*); -extern int VCCSpzLoad(GENmodel*,CKTcircuit*,SPcomplex*); -extern int VCCSsAcLoad(GENmodel*,CKTcircuit*); -extern int VCCSsLoad(GENmodel*,CKTcircuit*); -extern int VCCSsSetup(SENstruct*,GENmodel*); -extern void VCCSsPrint(GENmodel*,CKTcircuit*); -extern int VCCSsetup(SMPmatrix*,GENmodel*,CKTcircuit*,int*); diff --git a/src/spicelib/devices/vccs/vccsinit.c b/src/spicelib/devices/vccs/vccsinit.c deleted file mode 100644 index 5fe58f7d2..000000000 --- a/src/spicelib/devices/vccs/vccsinit.c +++ /dev/null @@ -1,76 +0,0 @@ -#include "ngspice/config.h" - -#include "ngspice/devdefs.h" - -#include "vccsitf.h" -#include "vccsext.h" -#include "vccsinit.h" - - -SPICEdev VCCSinfo = { - .DEVpublic = { - .name = "VCCS", - .description = "Voltage controlled current source", - .terms = &VCCSnSize, - .numNames = &VCCSnSize, - .termNames = VCCSnames, - .numInstanceParms = &VCCSpTSize, - .instanceParms = VCCSpTable, - .numModelParms = NULL, - .modelParms = NULL, - .flags = DEV_DEFAULT, - -#ifdef XSPICE - .cm_func = NULL, - .num_conn = 0, - .conn = NULL, - .num_param = 0, - .param = NULL, - .num_inst_var = 0, - .inst_var = NULL, -#endif - }, - - .DEVparam = VCCSparam, - .DEVmodParam = NULL, - .DEVload = VCCSload, - .DEVsetup = VCCSsetup, - .DEVunsetup = NULL, - .DEVpzSetup = VCCSsetup, - .DEVtemperature = NULL, - .DEVtrunc = NULL, - .DEVfindBranch = NULL, - .DEVacLoad = VCCSload, - .DEVaccept = NULL, - .DEVdestroy = NULL, - .DEVmodDelete = NULL, - .DEVdelete = NULL, - .DEVsetic = NULL, - .DEVask = VCCSask, - .DEVmodAsk = NULL, - .DEVpzLoad = VCCSpzLoad, - .DEVconvTest = NULL, - .DEVsenSetup = VCCSsSetup, - .DEVsenLoad = VCCSsLoad, - .DEVsenUpdate = NULL, - .DEVsenAcLoad = VCCSsAcLoad, - .DEVsenPrint = VCCSsPrint, - .DEVsenTrunc = NULL, - .DEVdisto = NULL, - .DEVnoise = NULL, - .DEVsoaCheck = NULL, - .DEVinstSize = &VCCSiSize, - .DEVmodSize = &VCCSmSize, - -#ifdef CIDER - .DEVdump = NULL, - .DEVacct = NULL, -#endif -}; - - -SPICEdev * -get_vccs_info(void) -{ - return &VCCSinfo; -} diff --git a/src/spicelib/devices/vccs/vccsinit.h b/src/spicelib/devices/vccs/vccsinit.h deleted file mode 100644 index 71756fd9d..000000000 --- a/src/spicelib/devices/vccs/vccsinit.h +++ /dev/null @@ -1,11 +0,0 @@ -#ifndef _VCCSINIT_H -#define _VCCSINIT_H - -extern IFparm VCCSpTable[ ]; -extern char *VCCSnames[ ]; -extern int VCCSpTSize; -extern int VCCSnSize; -extern int VCCSiSize; -extern int VCCSmSize; - -#endif diff --git a/src/spicelib/devices/vccs/vccsitf.h b/src/spicelib/devices/vccs/vccsitf.h deleted file mode 100644 index 2427acb4d..000000000 --- a/src/spicelib/devices/vccs/vccsitf.h +++ /dev/null @@ -1,9 +0,0 @@ -/********** -Copyright 1990 Regents of the University of California. All rights reserved. -**********/ -#ifndef DEV_VCCS -#define DEV_VCCS - -extern SPICEdev *get_vccs_info(void); - -#endif diff --git a/src/spicelib/devices/vccs/vccsload.c b/src/spicelib/devices/vccs/vccsload.c deleted file mode 100644 index 81c98e77b..000000000 --- a/src/spicelib/devices/vccs/vccsload.c +++ /dev/null @@ -1,41 +0,0 @@ -/********** -Copyright 1990 Regents of the University of California. All rights reserved. -Author: 1985 Thomas L. Quarles -**********/ -/* - */ - -#include "ngspice/ngspice.h" -#include "ngspice/cktdefs.h" -#include "vccsdefs.h" -#include "ngspice/sperror.h" -#include "ngspice/suffix.h" - - -/*ARGSUSED*/ -int -VCCSload(GENmodel *inModel, CKTcircuit *ckt) - /* actually load the current values into the - * sparse matrix previously provided - */ -{ - VCCSmodel *model = (VCCSmodel *)inModel; - VCCSinstance *here; - - NG_IGNORE(ckt); - - /* loop through all the source models */ - for( ; model != NULL; model = VCCSnextModel(model)) { - - /* loop through all the instances of the model */ - for (here = VCCSinstances(model); here != NULL ; - here=VCCSnextInstance(here)) { - - *(here->VCCSposContPosPtr) += here->VCCScoeff ; - *(here->VCCSposContNegPtr) -= here->VCCScoeff ; - *(here->VCCSnegContPosPtr) -= here->VCCScoeff ; - *(here->VCCSnegContNegPtr) += here->VCCScoeff ; - } - } - return(OK); -} diff --git a/src/spicelib/devices/vccs/vccspar.c b/src/spicelib/devices/vccs/vccspar.c deleted file mode 100644 index 98c88279a..000000000 --- a/src/spicelib/devices/vccs/vccspar.c +++ /dev/null @@ -1,41 +0,0 @@ -/********** -Copyright 1990 Regents of the University of California. All rights reserved. -Author: 1985 Thomas L. Quarles -**********/ -/* - */ - -#include "ngspice/ngspice.h" -#include "ngspice/ifsim.h" -#include "vccsdefs.h" -#include "ngspice/sperror.h" -#include "ngspice/suffix.h" - - -/* ARGSUSED */ -int -VCCSparam(int param, IFvalue *value, GENinstance *inst, IFvalue *select) -{ - VCCSinstance *here = (VCCSinstance *)inst; - - NG_IGNORE(select); - - switch(param) { - case VCCS_TRANS: - here->VCCScoeff = value->rValue; - here->VCCScoeffGiven = TRUE; - if (here->VCCSmGiven) - here->VCCScoeff *= here->VCCSmValue; - break; - case VCCS_M: - here->VCCSmValue = value->rValue; - here->VCCSmGiven = TRUE; - break; - case VCCS_TRANS_SENS: - here->VCCSsenParmNo = value->iValue; - break; - default: - return(E_BADPARM); - } - return(OK); -} diff --git a/src/spicelib/devices/vccs/vccspzld.c b/src/spicelib/devices/vccs/vccspzld.c deleted file mode 100644 index da07c62c4..000000000 --- a/src/spicelib/devices/vccs/vccspzld.c +++ /dev/null @@ -1,43 +0,0 @@ -/********** -Copyright 1990 Regents of the University of California. All rights reserved. -Author: 1985 Thomas L. Quarles -**********/ -/* - */ - -#include "ngspice/ngspice.h" -#include "ngspice/cktdefs.h" -#include "ngspice/complex.h" -#include "ngspice/sperror.h" -#include "vccsdefs.h" -#include "ngspice/suffix.h" - - -/*ARGSUSED*/ -int -VCCSpzLoad(GENmodel *inModel, CKTcircuit *ckt, SPcomplex *s) - /* actually load the current values into the - * sparse matrix previously provided - */ -{ - VCCSmodel *model = (VCCSmodel *)inModel; - VCCSinstance *here; - - NG_IGNORE(s); - NG_IGNORE(ckt); - - /* loop through all the source models */ - for( ; model != NULL; model = VCCSnextModel(model)) { - - /* loop through all the instances of the model */ - for (here = VCCSinstances(model); here != NULL ; - here=VCCSnextInstance(here)) { - - *(here->VCCSposContPosPtr) += here->VCCScoeff ; - *(here->VCCSposContNegPtr) -= here->VCCScoeff ; - *(here->VCCSnegContPosPtr) -= here->VCCScoeff ; - *(here->VCCSnegContNegPtr) += here->VCCScoeff ; - } - } - return(OK); -} diff --git a/src/spicelib/devices/vccs/vccssacl.c b/src/spicelib/devices/vccs/vccssacl.c deleted file mode 100644 index 89087eb99..000000000 --- a/src/spicelib/devices/vccs/vccssacl.c +++ /dev/null @@ -1,55 +0,0 @@ -/********** -Copyright 1990 Regents of the University of California. All rights reserved. -Author: 1985 Thomas L. Quarles -**********/ -/* - */ - -/* actually load the current ac sensitivity information into the - * array previously provided - */ - -#include "ngspice/ngspice.h" -#include "ngspice/smpdefs.h" -#include "ngspice/cktdefs.h" -#include "vccsdefs.h" -#include "ngspice/sperror.h" -#include "ngspice/suffix.h" - - -int -VCCSsAcLoad(GENmodel *inModel, CKTcircuit *ckt) -{ - VCCSmodel *model = (VCCSmodel *)inModel; - VCCSinstance *here; - double vc; - double ivc; - - - /* loop through all the source models */ - for( ; model != NULL; model = VCCSnextModel(model)) { - - /* loop through all the instances of the model */ - for (here = VCCSinstances(model); here != NULL ; - here=VCCSnextInstance(here)) { - - if (here->VCCSsenParmNo){ - vc = *(ckt->CKTrhsOld + here->VCCScontPosNode) - - *(ckt->CKTrhsOld + here->VCCScontNegNode); - ivc = *(ckt->CKTirhsOld + here->VCCScontPosNode) - - *(ckt->CKTirhsOld + here->VCCScontNegNode); - *(ckt->CKTsenInfo->SEN_RHS[here->VCCSposNode] + - here->VCCSsenParmNo) -= vc; - *(ckt->CKTsenInfo->SEN_iRHS[here->VCCSposNode] + - here->VCCSsenParmNo) -= ivc; - *(ckt->CKTsenInfo->SEN_RHS[here->VCCSnegNode] + - here->VCCSsenParmNo) += vc; - *(ckt->CKTsenInfo->SEN_iRHS[here->VCCSnegNode] + - here->VCCSsenParmNo) += ivc; - } - } - } - return(OK); -} - - diff --git a/src/spicelib/devices/vccs/vccsset.c b/src/spicelib/devices/vccs/vccsset.c deleted file mode 100644 index e956708ca..000000000 --- a/src/spicelib/devices/vccs/vccsset.c +++ /dev/null @@ -1,50 +0,0 @@ -/********** -Copyright 1990 Regents of the University of California. All rights reserved. -Author: 1985 Thomas L. Quarles -**********/ -/* - */ - - /* load the current source structure with those pointers needed later - * for fast matrix loading - */ - -#include "ngspice/ngspice.h" -#include "ngspice/smpdefs.h" -#include "ngspice/cktdefs.h" -#include "vccsdefs.h" -#include "ngspice/sperror.h" -#include "ngspice/suffix.h" - - -/*ARGSUSED*/ -int -VCCSsetup(SMPmatrix *matrix, GENmodel *inModel, CKTcircuit *ckt, int *states) -{ - VCCSmodel *model = (VCCSmodel *)inModel; - VCCSinstance *here; - - NG_IGNORE(states); - NG_IGNORE(ckt); - - /* loop through all the current source models */ - for( ; model != NULL; model = VCCSnextModel(model)) { - - /* loop through all the instances of the model */ - for (here = VCCSinstances(model); here != NULL ; - here=VCCSnextInstance(here)) { - -/* macro to make elements with built in test for out of memory */ -#define TSTALLOC(ptr,first,second) \ -do { if((here->ptr = SMPmakeElt(matrix, here->first, here->second)) == NULL){\ - return(E_NOMEM);\ -} } while(0) - - TSTALLOC(VCCSposContPosPtr, VCCSposNode, VCCScontPosNode); - TSTALLOC(VCCSposContNegPtr, VCCSposNode, VCCScontNegNode); - TSTALLOC(VCCSnegContPosPtr, VCCSnegNode, VCCScontPosNode); - TSTALLOC(VCCSnegContNegPtr, VCCSnegNode, VCCScontNegNode); - } - } - return(OK); -} diff --git a/src/spicelib/devices/vccs/vccssld.c b/src/spicelib/devices/vccs/vccssld.c deleted file mode 100644 index 9236ac810..000000000 --- a/src/spicelib/devices/vccs/vccssld.c +++ /dev/null @@ -1,45 +0,0 @@ -/********** -Copyright 1990 Regents of the University of California. All rights reserved. -Author: 1985 Thomas L. Quarles -**********/ -/* - */ - -/* actually load the current sensitivity information into the - * array previously provided - */ - -#include "ngspice/ngspice.h" -#include "ngspice/smpdefs.h" -#include "ngspice/cktdefs.h" -#include "vccsdefs.h" -#include "ngspice/sperror.h" -#include "ngspice/suffix.h" - - -int -VCCSsLoad(GENmodel *inModel, CKTcircuit *ckt) -{ - VCCSmodel *model = (VCCSmodel *)inModel; - VCCSinstance *here; - double vc; - - /* loop through all the source models */ - for( ; model != NULL; model = VCCSnextModel(model)) { - - /* loop through all the instances of the model */ - for (here = VCCSinstances(model); here != NULL ; - here=VCCSnextInstance(here)) { - - if(here->VCCSsenParmNo){ - vc = *(ckt->CKTrhsOld + here->VCCScontPosNode) - - *(ckt->CKTrhsOld + here->VCCScontNegNode); - *(ckt->CKTsenInfo->SEN_RHS[here->VCCSposNode] + - here->VCCSsenParmNo) -= vc; - *(ckt->CKTsenInfo->SEN_RHS[here->VCCSnegNode] + - here->VCCSsenParmNo) += vc; - } - } - } - return(OK); -} diff --git a/src/spicelib/devices/vccs/vccssprt.c b/src/spicelib/devices/vccs/vccssprt.c deleted file mode 100644 index 9d44b92ed..000000000 --- a/src/spicelib/devices/vccs/vccssprt.c +++ /dev/null @@ -1,47 +0,0 @@ -/********** -Copyright 1990 Regents of the University of California. All rights reserved. -Author: 1985 Thomas L. Quarles -**********/ -/* - */ - -/* Pretty print the sensitivity info for - * all the VCCS in the circuit. - */ - -#include "ngspice/ngspice.h" -#include "ngspice/smpdefs.h" -#include "ngspice/cktdefs.h" -#include "vccsdefs.h" -#include "ngspice/sperror.h" -#include "ngspice/suffix.h" - - -void -VCCSsPrint(GENmodel *inModel, CKTcircuit *ckt) -{ - VCCSmodel *model = (VCCSmodel *)inModel; - VCCSinstance *here; - - printf("VOLTAGE CONTROLLED CURRENT SOURCES-----------------\n"); - /* loop through all the source models */ - for( ; model != NULL; model = VCCSnextModel(model)) { - - printf("Model name:%s\n",model->VCCSmodName); - - /* loop through all the instances of the model */ - for (here = VCCSinstances(model); here != NULL ; - here=VCCSnextInstance(here)) { - - printf(" Instance name:%s\n",here->VCCSname); - printf(" Positive, negative nodes: %s, %s\n", - CKTnodName(ckt,here->VCCSposNode), - CKTnodName(ckt,here->VCCSnegNode)); - printf(" Controlling Positive, negative nodes: %s, %s\n", - CKTnodName(ckt,here->VCCScontPosNode), - CKTnodName(ckt,here->VCCScontNegNode)); - printf(" Coefficient: %f\n",here->VCCScoeff); - printf(" VCCSsenParmNo:%d\n",here->VCCSsenParmNo); - } - } -} diff --git a/src/spicelib/devices/vccs/vccssset.c b/src/spicelib/devices/vccs/vccssset.c deleted file mode 100644 index b83f1731c..000000000 --- a/src/spicelib/devices/vccs/vccssset.c +++ /dev/null @@ -1,40 +0,0 @@ -/********** -Copyright 1990 Regents of the University of California. All rights reserved. -Author: 1985 Thomas L. Quarles -**********/ -/* - */ - -/* loop through all the devices and - * allocate parameter #s to design parameters - */ - -#include "ngspice/ngspice.h" -#include "ngspice/smpdefs.h" -#include "ngspice/cktdefs.h" -#include "vccsdefs.h" -#include "ngspice/sperror.h" -#include "ngspice/suffix.h" - - -int -VCCSsSetup(SENstruct *info, GENmodel *inModel) -{ - VCCSmodel *model = (VCCSmodel *)inModel; - VCCSinstance *here; - - /* loop through all the current source models */ - for( ; model != NULL; model = VCCSnextModel(model)) { - - /* loop through all the instances of the model */ - for (here = VCCSinstances(model); here != NULL ; - here=VCCSnextInstance(here)) { - - if(here->VCCSsenParmNo){ - here->VCCSsenParmNo = ++(info->SENparms); - } - - } - } - return(OK); -} diff --git a/src/spicelib/devices/vcvs/Makefile.am b/src/spicelib/devices/vcvs/Makefile.am deleted file mode 100644 index 766be854d..000000000 --- a/src/spicelib/devices/vcvs/Makefile.am +++ /dev/null @@ -1,27 +0,0 @@ -## Process this file with automake to produce Makefile.in - -noinst_LTLIBRARIES = libvcvs.la - -libvcvs_la_SOURCES = \ - vcvs.c \ - vcvsask.c \ - vcvsdefs.h \ - vcvsext.h \ - vcvsfbr.c \ - vcvsinit.c \ - vcvsinit.h \ - vcvsitf.h \ - vcvsload.c \ - vcvspar.c \ - vcvspzld.c \ - vcvssacl.c \ - vcvsset.c \ - vcvssld.c \ - vcvssprt.c \ - vcvssset.c - - - -AM_CPPFLAGS = @AM_CPPFLAGS@ -I$(top_srcdir)/src/include -AM_CFLAGS = $(STATIC) -MAINTAINERCLEANFILES = Makefile.in diff --git a/src/spicelib/devices/vcvs/vcvs.c b/src/spicelib/devices/vcvs/vcvs.c deleted file mode 100644 index 90854d3b8..000000000 --- a/src/spicelib/devices/vcvs/vcvs.c +++ /dev/null @@ -1,44 +0,0 @@ -/********** -Copyright 1990 Regents of the University of California. All rights reserved. -Author: 1987 Thomas L. Quarles -**********/ - -#include "ngspice/ngspice.h" -#include "ngspice/ifsim.h" -#include "ngspice/devdefs.h" -#include "vcvsdefs.h" -#include "ngspice/suffix.h" - -IFparm VCVSpTable[] = { /* parameters */ - IOPU("gain", VCVS_GAIN, IF_REAL,"Voltage gain"), - IP("sens_gain",VCVS_GAIN_SENS,IF_FLAG,"flag to request sensitivity WRT gain"), - OPU("pos_node", VCVS_POS_NODE, IF_INTEGER, "Positive node of source"), - OPU("neg_node", VCVS_NEG_NODE, IF_INTEGER, "Negative node of source"), - OPU("cont_p_node",VCVS_CONT_P_NODE,IF_INTEGER, - "Positive node of contr. source"), - OPU("cont_n_node",VCVS_CONT_N_NODE,IF_INTEGER, - "Negative node of contr. source"), - IP("ic", VCVS_IC, IF_REAL, "Initial condition of controlling source"), - OP("i", VCVS_CURRENT, IF_REAL, "Output current"), - OP("v", VCVS_VOLTS, IF_REAL, "Output voltage"), - OP("p", VCVS_POWER, IF_REAL, "Power"), - OPU("sens_dc", VCVS_QUEST_SENS_DC, IF_REAL, "dc sensitivity "), - OPU("sens_real", VCVS_QUEST_SENS_REAL,IF_REAL, "real part of ac sensitivity"), - OPU("sens_imag", VCVS_QUEST_SENS_IMAG,IF_REAL, "imag part of ac sensitivity"), - OPU("sens_mag", VCVS_QUEST_SENS_MAG, IF_REAL, "sensitivity of ac magnitude"), - OPU("sens_ph", VCVS_QUEST_SENS_PH, IF_REAL, "sensitivity of ac phase"), - OPU("sens_cplx", VCVS_QUEST_SENS_CPLX, IF_COMPLEX, "ac sensitivity") -}; - -char *VCVSnames[] = { - "V+", - "V-", - "VC+", - "VC-" -}; - -int VCVSnSize = NUMELEMS(VCVSnames); -int VCVSpTSize = NUMELEMS(VCVSpTable); -int VCVSmPTSize = 0; -int VCVSiSize = sizeof(VCVSinstance); -int VCVSmSize = sizeof(VCVSmodel); diff --git a/src/spicelib/devices/vcvs/vcvsask.c b/src/spicelib/devices/vcvs/vcvsask.c deleted file mode 100644 index f0c9f1737..000000000 --- a/src/spicelib/devices/vcvs/vcvsask.c +++ /dev/null @@ -1,147 +0,0 @@ -/********** -Copyright 1990 Regents of the University of California. All rights reserved. -Author: 1987 Thomas L. Quarles -**********/ - -/* - * This routine gives access to the internal device parameters - * of Voltage Controlled Voltage Source - */ - -#include "ngspice/ngspice.h" -#include "ngspice/cktdefs.h" -#include "ngspice/devdefs.h" -#include "ngspice/ifsim.h" -#include "vcvsdefs.h" -#include "ngspice/sperror.h" -#include "ngspice/suffix.h" - -/* ARGSUSED */ -int -VCVSask(CKTcircuit *ckt, GENinstance *inst, int which, IFvalue *value, IFvalue *select) -{ - VCVSinstance *here = (VCVSinstance *)inst; - double vr; - double vi; - double sr; - double si; - double vm; - static char *msg = "Current and power not available for ac analysis"; - switch(which) { - case VCVS_POS_NODE: - value->iValue = here->VCVSposNode; - return (OK); - case VCVS_NEG_NODE: - value->iValue = here->VCVSnegNode; - return (OK); - case VCVS_CONT_P_NODE: - value->iValue = here->VCVScontPosNode; - return (OK); - case VCVS_CONT_N_NODE: - value->iValue = here->VCVScontNegNode; - return (OK); - case VCVS_IC: - value->rValue = here->VCVSinitCond; - return (OK); - case VCVS_GAIN: - value->rValue = here->VCVScoeff; - return (OK); - case VCVS_CONT_V_OLD: - value->rValue = *(ckt->CKTstate0 + here->VCVScontVOld); - return (OK); - case VCVS_BR: - value->iValue = here->VCVSbranch; - return (OK); - case VCVS_QUEST_SENS_DC: - if(ckt->CKTsenInfo){ - value->rValue = *(ckt->CKTsenInfo->SEN_Sap[select->iValue + 1]+ - here->VCVSsenParmNo); - } - return(OK); - case VCVS_QUEST_SENS_REAL: - if(ckt->CKTsenInfo){ - value->rValue = *(ckt->CKTsenInfo->SEN_RHS[select->iValue + 1]+ - here->VCVSsenParmNo); - } - return(OK); - case VCVS_QUEST_SENS_IMAG: - if(ckt->CKTsenInfo){ - value->rValue = *(ckt->CKTsenInfo->SEN_iRHS[select->iValue + 1]+ - here->VCVSsenParmNo); - } - return(OK); - case VCVS_QUEST_SENS_MAG: - if(ckt->CKTsenInfo){ - vr = *(ckt->CKTrhsOld + select->iValue + 1); - vi = *(ckt->CKTirhsOld + select->iValue + 1); - vm = sqrt(vr*vr + vi*vi); - if(vm == 0){ - value->rValue = 0; - return(OK); - } - sr = *(ckt->CKTsenInfo->SEN_RHS[select->iValue + 1]+ - here->VCVSsenParmNo); - si = *(ckt->CKTsenInfo->SEN_iRHS[select->iValue + 1]+ - here->VCVSsenParmNo); - value->rValue = (vr * sr + vi * si)/vm; - } - return(OK); - case VCVS_QUEST_SENS_PH: - if(ckt->CKTsenInfo){ - vr = *(ckt->CKTrhsOld + select->iValue + 1); - vi = *(ckt->CKTirhsOld + select->iValue + 1); - vm = vr*vr + vi*vi; - if(vm == 0){ - value->rValue = 0; - return(OK); - } - sr = *(ckt->CKTsenInfo->SEN_RHS[select->iValue + 1]+ - here->VCVSsenParmNo); - si = *(ckt->CKTsenInfo->SEN_iRHS[select->iValue + 1]+ - here->VCVSsenParmNo); - - value->rValue = (vr * si - vi * sr)/vm; - } - - return(OK); - case VCVS_QUEST_SENS_CPLX: - if(ckt->CKTsenInfo){ - value->cValue.real= - *(ckt->CKTsenInfo->SEN_RHS[select->iValue + 1]+ - here->VCVSsenParmNo); - value->cValue.imag= - *(ckt->CKTsenInfo->SEN_iRHS[select->iValue + 1]+ - here->VCVSsenParmNo); - } - return(OK); - case VCVS_CURRENT : - if (ckt->CKTcurrentAnalysis & DOING_AC) { - errMsg = TMALLOC(char, strlen(msg) + 1); - errRtn = "VCVSask"; - strcpy(errMsg,msg); - return(E_ASKCURRENT); - } else { - value->rValue = *(ckt->CKTrhsOld + here->VCVSbranch); - } - return(OK); - case VCVS_VOLTS : - value->rValue = (*(ckt->CKTrhsOld + here->VCVSposNode) - - *(ckt->CKTrhsOld + here->VCVSnegNode)); - return(OK); - case VCVS_POWER : - if (ckt->CKTcurrentAnalysis & DOING_AC) { - errMsg = TMALLOC(char, strlen(msg) + 1); - errRtn = "VCVSask"; - strcpy(errMsg,msg); - return(E_ASKPOWER); - } else { - value->rValue = *(ckt->CKTrhsOld + here->VCVSbranch) * - (*(ckt->CKTrhsOld + here->VCVSposNode) - - *(ckt->CKTrhsOld + here->VCVSnegNode)); - } - return(OK); - default: - return (E_BADPARM); - } - /* NOTREACHED */ -} diff --git a/src/spicelib/devices/vcvs/vcvsdefs.h b/src/spicelib/devices/vcvs/vcvsdefs.h deleted file mode 100644 index 07f0bbdf5..000000000 --- a/src/spicelib/devices/vcvs/vcvsdefs.h +++ /dev/null @@ -1,106 +0,0 @@ -/********** -Copyright 1990 Regents of the University of California. All rights reserved. -Author: 1985 Thomas L. Quarles -**********/ - -#ifndef VCVS -#define VCVS - - -#include "ngspice/ifsim.h" -#include "ngspice/cktdefs.h" -#include "ngspice/gendefs.h" -#include "ngspice/complex.h" - - /* - * structures to describe Voltage Controlled Voltage Sources - */ - -/* information to describe a single instance */ - -typedef struct sVCVSinstance { - - struct GENinstance gen; - -#define VCVSmodPtr(inst) ((struct sVCVSmodel *)((inst)->gen.GENmodPtr)) -#define VCVSnextInstance(inst) ((struct sVCVSinstance *)((inst)->gen.GENnextInstance)) -#define VCVSname gen.GENname -#define VCVSstates gen.GENstate - - const int VCVSposNode; /* number of positive node of source */ - const int VCVSnegNode; /* number of negative node of source */ - const int VCVScontPosNode; /* number of positive node of controlling source */ - const int VCVScontNegNode; /* number of negative node of controlling source */ - int VCVSbranch; /* equation number of branch equation added for v source */ - - double VCVSinitCond; /* initial condition (of controlling source) */ - double VCVScoeff; /* coefficient */ - - double *VCVSposIbrPtr; /* pointer to sparse matrix element at - * (positive node, branch equation) */ - double *VCVSnegIbrPtr; /* pointer to sparse matrix element at - * (negative node, branch equation) */ - double *VCVSibrPosPtr; /* pointer to sparse matrix element at - * (branch equation, positive node) */ - double *VCVSibrNegPtr; /* pointer to sparse matrix element at - * (branch equation, negative node) */ - double *VCVSibrContPosPtr; /* pointer to sparse matrix element at - *(branch equation, control positive node)*/ - double *VCVSibrContNegPtr; /* pointer to sparse matrix element at - *(branch equation, control negative node)*/ - unsigned VCVScoeffGiven :1 ;/* flag to indicate function coeffs given */ - - int VCVSsenParmNo; /* parameter # for sensitivity use; - set equal to 0 if not a design parameter*/ - -} VCVSinstance ; - -#define VCVSvOld VCVSstates -#define VCVScontVOld VCVSstates + 1 - -/* per model data */ - -typedef struct sVCVSmodel { /* model structure for a source */ - - struct GENmodel gen; - -#define VCVSmodType gen.GENmodType -#define VCVSnextModel(inst) ((struct sVCVSmodel *)((inst)->gen.GENnextModel)) -#define VCVSinstances(inst) ((VCVSinstance *)((inst)->gen.GENinstances)) -#define VCVSmodName gen.GENmodName - -} VCVSmodel; - -/* device parameters */ -enum { - VCVS_GAIN = 1, - VCVS_POS_NODE, - VCVS_NEG_NODE, - VCVS_CONT_P_NODE, - VCVS_CONT_N_NODE, - VCVS_BR, - VCVS_IC, - VCVS_CONT_V_OLD, - VCVS_GAIN_SENS, - VCVS_CURRENT, - VCVS_POWER, - VCVS_VOLTS, -}; - -/* model parameters */ - -/* device questions */ -enum { - VCVS_QUEST_SENS_REAL = 201, - VCVS_QUEST_SENS_IMAG, - VCVS_QUEST_SENS_MAG, - VCVS_QUEST_SENS_PH, - VCVS_QUEST_SENS_CPLX, - VCVS_QUEST_SENS_DC, -}; - -/* model questions */ - -#include "vcvsext.h" - -#endif /*VCVS*/ diff --git a/src/spicelib/devices/vcvs/vcvsext.h b/src/spicelib/devices/vcvs/vcvsext.h deleted file mode 100644 index c52d0fdbe..000000000 --- a/src/spicelib/devices/vcvs/vcvsext.h +++ /dev/null @@ -1,17 +0,0 @@ -/********** -Copyright 1990 Regents of the University of California. All rights reserved. -Author: 1985 Thomas L. Quarles -**********/ - -extern int VCVSask(CKTcircuit*,GENinstance*,int,IFvalue*,IFvalue*); -extern int VCVSfindBr(CKTcircuit*,GENmodel*,IFuid); -extern int VCVSload(GENmodel*,CKTcircuit*); -extern int VCVSparam(int,IFvalue*,GENinstance*,IFvalue*); -extern int VCVSpzLoad(GENmodel*,CKTcircuit*,SPcomplex*); -extern int VCVSsAcLoad(GENmodel*,CKTcircuit*); -extern int VCVSsLoad(GENmodel*,CKTcircuit*); -extern int VCVSsSetup(SENstruct*,GENmodel*); -extern void VCVSsPrint(GENmodel*,CKTcircuit*); -extern int VCVSsetup(SMPmatrix*,GENmodel*,CKTcircuit*,int*); -extern int VCVSunsetup(GENmodel*,CKTcircuit*); - diff --git a/src/spicelib/devices/vcvs/vcvsfbr.c b/src/spicelib/devices/vcvs/vcvsfbr.c deleted file mode 100644 index e2ebd588a..000000000 --- a/src/spicelib/devices/vcvs/vcvsfbr.c +++ /dev/null @@ -1,38 +0,0 @@ -/********** -Copyright 1990 Regents of the University of California. All rights reserved. -Author: 1985 Thomas L. Quarles -**********/ -/* - */ - -#include "ngspice/ngspice.h" -#include "ngspice/cktdefs.h" -#include "vcvsdefs.h" -#include "ngspice/trandefs.h" -#include "ngspice/sperror.h" -#include "ngspice/suffix.h" - - -int -VCVSfindBr(CKTcircuit *ckt, GENmodel *inModel, IFuid name) -{ - VCVSmodel *model = (VCVSmodel *)inModel; - VCVSinstance *here; - int error; - CKTnode *tmp; - - for( ; model != NULL; model = VCVSnextModel(model)) { - for (here = VCVSinstances(model); here != NULL; - here = VCVSnextInstance(here)) { - if(here->VCVSname == name) { - if(here->VCVSbranch == 0) { - error = CKTmkCur(ckt,&tmp,here->VCVSname,"branch"); - if(error) return(error); - here->VCVSbranch = tmp->number; - } - return(here->VCVSbranch); - } - } - } - return(0); -} diff --git a/src/spicelib/devices/vcvs/vcvsinit.c b/src/spicelib/devices/vcvs/vcvsinit.c deleted file mode 100644 index 4dc1a37f7..000000000 --- a/src/spicelib/devices/vcvs/vcvsinit.c +++ /dev/null @@ -1,76 +0,0 @@ -#include "ngspice/config.h" - -#include "ngspice/devdefs.h" - -#include "vcvsitf.h" -#include "vcvsext.h" -#include "vcvsinit.h" - - -SPICEdev VCVSinfo = { - .DEVpublic = { - .name = "VCVS", - .description = "Voltage controlled voltage source", - .terms = &VCVSnSize, - .numNames = &VCVSnSize, - .termNames = VCVSnames, - .numInstanceParms = &VCVSpTSize, - .instanceParms = VCVSpTable, - .numModelParms = NULL, - .modelParms = NULL, - .flags = DEV_DEFAULT, - -#ifdef XSPICE - .cm_func = NULL, - .num_conn = 0, - .conn = NULL, - .num_param = 0, - .param = NULL, - .num_inst_var = 0, - .inst_var = NULL, -#endif - }, - - .DEVparam = VCVSparam, - .DEVmodParam = NULL, - .DEVload = VCVSload, - .DEVsetup = VCVSsetup, - .DEVunsetup = VCVSunsetup, - .DEVpzSetup = VCVSsetup, - .DEVtemperature = NULL, - .DEVtrunc = NULL, - .DEVfindBranch = VCVSfindBr, - .DEVacLoad = VCVSload, - .DEVaccept = NULL, - .DEVdestroy = NULL, - .DEVmodDelete = NULL, - .DEVdelete = NULL, - .DEVsetic = NULL, - .DEVask = VCVSask, - .DEVmodAsk = NULL, - .DEVpzLoad = VCVSpzLoad, - .DEVconvTest = NULL, - .DEVsenSetup = VCVSsSetup, - .DEVsenLoad = VCVSsLoad, - .DEVsenUpdate = NULL, - .DEVsenAcLoad = VCVSsAcLoad, - .DEVsenPrint = VCVSsPrint, - .DEVsenTrunc = NULL, - .DEVdisto = NULL, - .DEVnoise = NULL, - .DEVsoaCheck = NULL, - .DEVinstSize = &VCVSiSize, - .DEVmodSize = &VCVSmSize, - -#ifdef CIDER - .DEVdump = NULL, - .DEVacct = NULL, -#endif -}; - - -SPICEdev * -get_vcvs_info(void) -{ - return &VCVSinfo; -} diff --git a/src/spicelib/devices/vcvs/vcvsinit.h b/src/spicelib/devices/vcvs/vcvsinit.h deleted file mode 100644 index 614154846..000000000 --- a/src/spicelib/devices/vcvs/vcvsinit.h +++ /dev/null @@ -1,11 +0,0 @@ -#ifndef _VCVSINIT_H -#define _VCVSINIT_H - -extern IFparm VCVSpTable[ ]; -extern char *VCVSnames[ ]; -extern int VCVSpTSize; -extern int VCVSnSize; -extern int VCVSiSize; -extern int VCVSmSize; - -#endif diff --git a/src/spicelib/devices/vcvs/vcvsitf.h b/src/spicelib/devices/vcvs/vcvsitf.h deleted file mode 100644 index d812d482e..000000000 --- a/src/spicelib/devices/vcvs/vcvsitf.h +++ /dev/null @@ -1,9 +0,0 @@ -/********** -Copyright 1990 Regents of the University of California. All rights reserved. -**********/ -#ifndef DEV_VCVS -#define DEV_VCVS - -SPICEdev *get_vcvs_info(void); - -#endif diff --git a/src/spicelib/devices/vcvs/vcvsload.c b/src/spicelib/devices/vcvs/vcvsload.c deleted file mode 100644 index 13ba3ac74..000000000 --- a/src/spicelib/devices/vcvs/vcvsload.c +++ /dev/null @@ -1,43 +0,0 @@ -/********** -Copyright 1990 Regents of the University of California. All rights reserved. -Author: 1985 Thomas L. Quarles -**********/ -/* - */ - -#include "ngspice/ngspice.h" -#include "ngspice/cktdefs.h" -#include "vcvsdefs.h" -#include "ngspice/sperror.h" -#include "ngspice/suffix.h" - - -/*ARGSUSED*/ -int -VCVSload(GENmodel *inModel, CKTcircuit *ckt) - /* actually load the current voltage value into the - * sparse matrix previously provided - */ -{ - VCVSmodel *model = (VCVSmodel *)inModel; - VCVSinstance *here; - - NG_IGNORE(ckt); - - /* loop through all the voltage source models */ - for( ; model != NULL; model = VCVSnextModel(model)) { - - /* loop through all the instances of the model */ - for (here = VCVSinstances(model); here != NULL ; - here=VCVSnextInstance(here)) { - - *(here->VCVSposIbrPtr) += 1.0 ; - *(here->VCVSnegIbrPtr) -= 1.0 ; - *(here->VCVSibrPosPtr) += 1.0 ; - *(here->VCVSibrNegPtr) -= 1.0 ; - *(here->VCVSibrContPosPtr) -= here->VCVScoeff ; - *(here->VCVSibrContNegPtr) += here->VCVScoeff ; - } - } - return(OK); -} diff --git a/src/spicelib/devices/vcvs/vcvspar.c b/src/spicelib/devices/vcvs/vcvspar.c deleted file mode 100644 index 27121e1f7..000000000 --- a/src/spicelib/devices/vcvs/vcvspar.c +++ /dev/null @@ -1,35 +0,0 @@ -/********** -Copyright 1990 Regents of the University of California. All rights reserved. -Author: 1985 Thomas L. Quarles -**********/ -/* - */ - -#include "ngspice/ngspice.h" -#include "ngspice/ifsim.h" -#include "vcvsdefs.h" -#include "ngspice/sperror.h" -#include "ngspice/suffix.h" - - -/* ARGSUSED */ -int -VCVSparam(int param, IFvalue *value, GENinstance *inst, IFvalue *select) -{ - VCVSinstance *here = (VCVSinstance *)inst; - - NG_IGNORE(select); - - switch(param) { - case VCVS_GAIN: - here->VCVScoeff = value->rValue; - here->VCVScoeffGiven = TRUE; - break; - case VCVS_GAIN_SENS: - here->VCVSsenParmNo = value->iValue; - break; - default: - return(E_BADPARM); - } - return(OK); -} diff --git a/src/spicelib/devices/vcvs/vcvspzld.c b/src/spicelib/devices/vcvs/vcvspzld.c deleted file mode 100644 index 3b8044505..000000000 --- a/src/spicelib/devices/vcvs/vcvspzld.c +++ /dev/null @@ -1,45 +0,0 @@ -/********** -Copyright 1990 Regents of the University of California. All rights reserved. -Author: 1985 Thomas L. Quarles -**********/ -/* - */ - -#include "ngspice/ngspice.h" -#include "ngspice/cktdefs.h" -#include "ngspice/complex.h" -#include "ngspice/sperror.h" -#include "vcvsdefs.h" -#include "ngspice/suffix.h" - - -/*ARGSUSED*/ -int -VCVSpzLoad(GENmodel *inModel, CKTcircuit *ckt, SPcomplex *s) - /* actually load the current voltage value into the - * sparse matrix previously provided - */ -{ - VCVSmodel *model = (VCVSmodel *)inModel; - VCVSinstance *here; - - NG_IGNORE(s); - NG_IGNORE(ckt); - - /* loop through all the voltage source models */ - for( ; model != NULL; model = VCVSnextModel(model)) { - - /* loop through all the instances of the model */ - for (here = VCVSinstances(model); here != NULL ; - here=VCVSnextInstance(here)) { - - *(here->VCVSposIbrPtr) += 1.0 ; - *(here->VCVSnegIbrPtr) -= 1.0 ; - *(here->VCVSibrPosPtr) += 1.0 ; - *(here->VCVSibrNegPtr) -= 1.0 ; - *(here->VCVSibrContPosPtr) -= here->VCVScoeff ; - *(here->VCVSibrContNegPtr) += here->VCVScoeff ; - } - } - return(OK); -} diff --git a/src/spicelib/devices/vcvs/vcvssacl.c b/src/spicelib/devices/vcvs/vcvssacl.c deleted file mode 100644 index c41210507..000000000 --- a/src/spicelib/devices/vcvs/vcvssacl.c +++ /dev/null @@ -1,50 +0,0 @@ -/********** -Copyright 1990 Regents of the University of California. All rights reserved. -Author: 1985 Thomas L. Quarles -**********/ -/* - */ - -/* actually load the current ac sensitivity information into the - * array previously provided - */ - -#include "ngspice/ngspice.h" -#include "ngspice/cktdefs.h" -#include "vcvsdefs.h" -#include "ngspice/sperror.h" -#include "ngspice/suffix.h" - - -int -VCVSsAcLoad(GENmodel *inModel, CKTcircuit *ckt) -{ - VCVSmodel *model = (VCVSmodel *)inModel; - VCVSinstance *here; - double vc; - double ivc; - - /* loop through all the voltage source models */ - for( ; model != NULL; model = VCVSnextModel(model)) { - - /* loop through all the instances of the model */ - for (here = VCVSinstances(model); here != NULL ; - here=VCVSnextInstance(here)) { - - if(here->VCVSsenParmNo){ - - vc = *(ckt->CKTrhsOld + here->VCVScontPosNode) - - *(ckt->CKTrhsOld + here->VCVScontNegNode); - ivc = *(ckt->CKTirhsOld + here->VCVScontPosNode) - - *(ckt->CKTirhsOld + here->VCVScontNegNode); - - *(ckt->CKTsenInfo->SEN_RHS[here->VCVSbranch] + - here->VCVSsenParmNo) += vc; - *(ckt->CKTsenInfo->SEN_iRHS[here->VCVSbranch] + - here->VCVSsenParmNo) += ivc; - } - } - } - return(OK); -} - diff --git a/src/spicelib/devices/vcvs/vcvsset.c b/src/spicelib/devices/vcvs/vcvsset.c deleted file mode 100644 index d3196b4a4..000000000 --- a/src/spicelib/devices/vcvs/vcvsset.c +++ /dev/null @@ -1,82 +0,0 @@ -/********** -Copyright 1990 Regents of the University of California. All rights reserved. -Author: 1985 Thomas L. Quarles -**********/ - -/* load the voltage source structure with those pointers needed later - * for fast matrix loading - */ - -#include "ngspice/ngspice.h" -#include "ngspice/smpdefs.h" -#include "ngspice/cktdefs.h" -#include "vcvsdefs.h" -#include "ngspice/sperror.h" -#include "ngspice/suffix.h" - -/*ARGSUSED*/ -int -VCVSsetup(SMPmatrix *matrix, GENmodel *inModel, CKTcircuit *ckt, int *states) -{ - VCVSmodel *model = (VCVSmodel *)inModel; - VCVSinstance *here; - int error; - CKTnode *tmp; - - NG_IGNORE(states); - - /* loop through all the voltage source models */ - for( ; model != NULL; model = VCVSnextModel(model)) { - - /* loop through all the instances of the model */ - for (here = VCVSinstances(model); here != NULL ; - here=VCVSnextInstance(here)) { - - if(here->VCVSposNode == here->VCVSnegNode) { - SPfrontEnd->IFerrorf (ERR_FATAL, - "instance %s is a shorted VCVS", here->VCVSname); - return(E_UNSUPP); - } - - if(here->VCVSbranch == 0) { - error = CKTmkCur(ckt,&tmp,here->VCVSname,"branch"); - if(error) return(error); - here->VCVSbranch = tmp->number; - } - -/* macro to make elements with built in test for out of memory */ -#define TSTALLOC(ptr,first,second) \ -do { if((here->ptr = SMPmakeElt(matrix, here->first, here->second)) == NULL){\ - return(E_NOMEM);\ -} } while(0) - - TSTALLOC(VCVSposIbrPtr, VCVSposNode, VCVSbranch); - TSTALLOC(VCVSnegIbrPtr, VCVSnegNode, VCVSbranch); - TSTALLOC(VCVSibrPosPtr, VCVSbranch, VCVSposNode); - TSTALLOC(VCVSibrNegPtr, VCVSbranch, VCVSnegNode); - TSTALLOC(VCVSibrContPosPtr, VCVSbranch, VCVScontPosNode); - TSTALLOC(VCVSibrContNegPtr, VCVSbranch, VCVScontNegNode); - } - } - return(OK); -} - -int -VCVSunsetup(GENmodel *inModel, CKTcircuit *ckt) -{ - VCVSmodel *model; - VCVSinstance *here; - - for (model = (VCVSmodel *)inModel; model != NULL; - model = VCVSnextModel(model)) - { - for (here = VCVSinstances(model); here != NULL; - here=VCVSnextInstance(here)) - { - if (here->VCVSbranch > 0) - CKTdltNNum(ckt, here->VCVSbranch); - here->VCVSbranch = 0; - } - } - return OK; -} diff --git a/src/spicelib/devices/vcvs/vcvssld.c b/src/spicelib/devices/vcvs/vcvssld.c deleted file mode 100644 index 97015c92c..000000000 --- a/src/spicelib/devices/vcvs/vcvssld.c +++ /dev/null @@ -1,44 +0,0 @@ -/********** -Copyright 1990 Regents of the University of California. All rights reserved. -Author: 1985 Thomas L. Quarles -**********/ -/* - */ - -/* actually load the current sensitivity information into the - * array previously provided - */ - -#include "ngspice/ngspice.h" -#include "ngspice/cktdefs.h" -#include "vcvsdefs.h" -#include "ngspice/sperror.h" -#include "ngspice/suffix.h" - - -int -VCVSsLoad(GENmodel *inModel, CKTcircuit *ckt) -{ - VCVSmodel *model = (VCVSmodel *)inModel; - VCVSinstance *here; - double vc; - - /* loop through all the voltage source models */ - for( ; model != NULL; model = VCVSnextModel(model)) { - - /* loop through all the instances of the model */ - for (here = VCVSinstances(model); here != NULL ; - here=VCVSnextInstance(here)) { - - if(here->VCVSsenParmNo){ - - vc = *(ckt->CKTrhsOld + here->VCVScontPosNode) - - *(ckt->CKTrhsOld + here->VCVScontNegNode); - - *(ckt->CKTsenInfo->SEN_RHS[here->VCVSbranch] + - here->VCVSsenParmNo) += vc; - } - } - } - return(OK); -} diff --git a/src/spicelib/devices/vcvs/vcvssprt.c b/src/spicelib/devices/vcvs/vcvssprt.c deleted file mode 100644 index 3776bed33..000000000 --- a/src/spicelib/devices/vcvs/vcvssprt.c +++ /dev/null @@ -1,48 +0,0 @@ -/********** -Copyright 1990 Regents of the University of California. All rights reserved. -Author: 1985 Thomas L. Quarles -**********/ -/* - */ - -/* Pretty print the sensitivity info for - * all the VCVS in the circuit. - */ - -#include "ngspice/ngspice.h" -#include "ngspice/cktdefs.h" -#include "vcvsdefs.h" -#include "ngspice/sperror.h" -#include "ngspice/suffix.h" - - -void -VCVSsPrint(GENmodel *inModel, CKTcircuit *ckt) -{ - VCVSmodel *model = (VCVSmodel *)inModel; - VCVSinstance *here; - - printf("VOLTAGE CONTROLLED VOLTAGE SOURCES-----------------\n"); - /* loop through all the voltage source models */ - for( ; model != NULL; model = VCVSnextModel(model)) { - - printf("Model name:%s\n",model->VCVSmodName); - - /* loop through all the instances of the model */ - for (here = VCVSinstances(model); here != NULL ; - here=VCVSnextInstance(here)) { - - printf(" Instance name:%s\n",here->VCVSname); - printf(" Positive, negative nodes: %s, %s\n", - CKTnodName(ckt,here->VCVSposNode), - CKTnodName(ckt,here->VCVSnegNode)); - printf(" Controlling Positive, negative nodes: %s, %s\n", - CKTnodName(ckt,here->VCVScontPosNode), - CKTnodName(ckt,here->VCVScontNegNode)); - printf(" Branch equation number: %s\n", - CKTnodName(ckt,here->VCVSbranch)); - printf(" Coefficient: %f\n",here->VCVScoeff); - printf(" VCVSsenParmNo:%d\n",here->VCVSsenParmNo); - } - } -} diff --git a/src/spicelib/devices/vcvs/vcvssset.c b/src/spicelib/devices/vcvs/vcvssset.c deleted file mode 100644 index 26f07e785..000000000 --- a/src/spicelib/devices/vcvs/vcvssset.c +++ /dev/null @@ -1,40 +0,0 @@ -/********** -Copyright 1990 Regents of the University of California. All rights reserved. -Author: 1985 Thomas L. Quarles -**********/ -/* - */ - -/* loop through all the devices and - * allocate parameter #s to design parameters - */ - -#include "ngspice/ngspice.h" -#include "ngspice/smpdefs.h" -#include "ngspice/cktdefs.h" -#include "vcvsdefs.h" -#include "ngspice/sperror.h" -#include "ngspice/suffix.h" - - -int -VCVSsSetup(SENstruct *info, GENmodel *inModel) -{ - VCVSmodel *model = (VCVSmodel *)inModel; - VCVSinstance *here; - - /* loop through all the voltage source models */ - for( ; model != NULL; model = VCVSnextModel(model)) { - - /* loop through all the instances of the model */ - for (here = VCVSinstances(model); here != NULL ; - here=VCVSnextInstance(here)) { - - if(here->VCVSsenParmNo){ - here->VCVSsenParmNo = ++(info->SENparms); - } - - } - } - return(OK); -} diff --git a/src/spicelib/devices/vdmos/Makefile.am b/src/spicelib/devices/vdmos/Makefile.am deleted file mode 100644 index 0e8da3cfa..000000000 --- a/src/spicelib/devices/vdmos/Makefile.am +++ /dev/null @@ -1,33 +0,0 @@ -## Process this file with automake to produce Makefile.in - -noinst_LTLIBRARIES = libvdmos.la - -libvdmos_la_SOURCES = \ - vdmos.c \ - vdmosacld.c \ - vdmosask.c \ - vdmosconv.c \ - vdmosdefs.h \ - vdmosdist.c \ - vdmosdset.c \ - vdmosext.h \ - vdmosic.c \ - vdmosinit.c \ - vdmosinit.h \ - vdmositf.h \ - vdmosload.c \ - vdmosmask.c \ - vdmosmpar.c \ - vdmosnoi.c \ - vdmospar.c \ - vdmospzld.c \ - vdmosset.c \ - vdmossoachk.c \ - vdmostemp.c \ - vdmostrun.c - - - -AM_CPPFLAGS = @AM_CPPFLAGS@ -I$(top_srcdir)/src/include -AM_CFLAGS = $(STATIC) -MAINTAINERCLEANFILES = Makefile.in diff --git a/src/spicelib/devices/vdmos/vdmos.c b/src/spicelib/devices/vdmos/vdmos.c deleted file mode 100644 index 3fc352631..000000000 --- a/src/spicelib/devices/vdmos/vdmos.c +++ /dev/null @@ -1,161 +0,0 @@ -/********** -Copyright 1990 Regents of the University of California. All rights reserved. -Author: 1987 Thomas L. Quarles -Modified: 2000 AlansFixes -VDMOS: 2018 Holger Vogt, 2020 Dietmar Warning -**********/ - -#include "ngspice/ngspice.h" -#include "ngspice/devdefs.h" -#include "ngspice/ifsim.h" -#include "vdmosdefs.h" -#include "ngspice/suffix.h" - -IFparm VDMOSpTable[] = { /* parameters */ - IOPU("m", VDMOS_M, IF_REAL, "Multiplier"), - IP("off", VDMOS_OFF, IF_FLAG, "Device initially off"), - IOPU("icvds", VDMOS_IC_VDS, IF_REAL, "Initial D-S voltage"), - IOPU("icvgs", VDMOS_IC_VGS, IF_REAL, "Initial G-S voltage"), - IOPU("temp", VDMOS_TEMP, IF_REAL, "Instance temperature"), - IOPU("dtemp", VDMOS_DTEMP, IF_REAL, "Instance temperature difference"), - IP( "ic", VDMOS_IC, IF_REALVEC, "Vector of D-S, G-S voltages"), - - IOP("thermal", VDMOS_THERMAL, IF_FLAG, "Thermal model switch on/off"), - - OP( "id", VDMOS_CD, IF_REAL, "Drain current"), - OP( "is", VDMOS_CS, IF_REAL, "Source current"), - OP( "ig", VDMOS_CG, IF_REAL, "Gate current"), - OP( "vgs", VDMOS_VGS, IF_REAL, "Gate-Source voltage"), - OP( "vds", VDMOS_VDS, IF_REAL, "Drain-Source voltage"), - OP( "cgs", VDMOS_CAPGS, IF_REAL, "Gate-Source capacitance"), - OP( "cgd", VDMOS_CAPGD, IF_REAL, "Gate-Drain capacitance"), - OP( "cds", VDMOS_CAPDS, IF_REAL, "Drain-Source capacitance"), - OP( "idio", VDMOS_CDIO, IF_REAL, "Body diode current"), - - OPU( "dnode", VDMOS_DNODE, IF_INTEGER, "Number of the drain node "), - OPU( "gnode", VDMOS_GNODE, IF_INTEGER, "Number of the gate node "), - OPU( "snode", VDMOS_SNODE, IF_INTEGER, "Number of the source node "), - OPU( "tempnode", VDMOS_TNODE, IF_INTEGER, "Number of temperature node"), - OPU( "tcasenode", VDMOS_TCASE, IF_INTEGER, "Number of 2nd temperature node"), - OPU( "dnodeprime", VDMOS_DNODEPRIME, IF_INTEGER, "Number of int. drain node"), - OPU( "snodeprime", VDMOS_SNODEPRIME, IF_INTEGER, "Number of int. source node "), - - OP( "von", VDMOS_VON, IF_REAL, "Device on state voltage"), - OP( "rs", VDMOS_SOURCERESIST, IF_REAL, "Source resistance"), - OPU("sourceconductance", VDMOS_SOURCECONDUCT, IF_REAL, "Conductance of source"), - OP( "rd", VDMOS_DRAINRESIST, IF_REAL, "Drain conductance"), - OPU("drainconductance", VDMOS_DRAINCONDUCT, IF_REAL, "Conductance of drain"), - - OP( "gm", VDMOS_GM, IF_REAL, "Transconductance"), - OP( "gds", VDMOS_GDS, IF_REAL, "Drain-Source conductance"), - - OPU( "cqgs", VDMOS_CQGS, IF_REAL, "Capacitance due to gate-source charge storage"), - OPU( "cqgd", VDMOS_CQGD, IF_REAL, "Capacitance due to gate-drain charge storage"), - - OPU( "qgs", VDMOS_QGS, IF_REAL, "Gate-Source charge storage"), - OPU( "qgd", VDMOS_QGD, IF_REAL, "Gate-Drain charge storage"), - OPU( "p", VDMOS_POWER, IF_REAL, "Instantaneous power"), -}; - -IFparm VDMOSmPTable[] = { /* model parameters */ - /* basic device */ - OP("type", VDMOS_MOD_TYPE, IF_STRING, "N-channel or P-channel MOS"), - IOP("vto", VDMOS_MOD_VTH, IF_REAL, "Threshold voltage"), - IOPR("vth0", VDMOS_MOD_VTH, IF_REAL, "Threshold voltage"), - IOP("kp", VDMOS_MOD_KP, IF_REAL, "Transconductance parameter"), - IOP("phi", VDMOS_MOD_PHI, IF_REAL, "Surface potential"), - IOP("lambda",VDMOS_MOD_LAMBDA,IF_REAL, "Channel length modulation"), - IOP("theta", VDMOS_MOD_THETA, IF_REAL, "Vgs dependence on mobility"), - IOP("rd", VDMOS_MOD_RD, IF_REAL, "Drain ohmic resistance"), - IOP("rs", VDMOS_MOD_RS, IF_REAL, "Source ohmic resistance"), - IOP("rg", VDMOS_MOD_RG, IF_REAL, "Gate ohmic resistance"), - IOP("tnom", VDMOS_MOD_TNOM, IF_REAL, "Parameter measurement temperature"), - IOP("kf", VDMOS_MOD_KF, IF_REAL, "Flicker noise coefficient"), - IOP("af", VDMOS_MOD_AF, IF_REAL, "Flicker noise exponent"), - IP("vdmosn", VDMOS_MOD_NMOS, IF_FLAG, "N type DMOSfet model"), - IP("vdmosp", VDMOS_MOD_PMOS, IF_FLAG, "P type DMOSfet model"), - IP("vdmos", VDMOS_MOD_DMOS, IF_REAL, "DMOS transistor"), - - /* quasi saturation */ - IOP("rq", VDMOS_MOD_RQ, IF_REAL, "Quasi saturation resistance fitting parameter"), - IOP("vq", VDMOS_MOD_VQ, IF_REAL, "Quasi saturation voltage fitting parameter"), - IOP("mtriode", VDMOS_MOD_MTRIODE, IF_REAL, "Conductance multiplier in triode region"), - - /* temperature dependency */ - IOP( "tcvth", VDMOS_MOD_TCVTH, IF_REAL, "Linear Vth0 temperature coefficient"), - IOPR("vtotc", VDMOS_MOD_TCVTH, IF_REAL, "Linear Vth0 temperature coefficient"), - IOP( "mu", VDMOS_MOD_MU, IF_REAL, "Exponent of gain temperature dependency"), - IOPR("bex", VDMOS_MOD_MU, IF_REAL, "Exponent of gain temperature dependency"), - IOP( "texp0", VDMOS_MOD_TEXP0, IF_REAL, "Drain resistance rd0 temperature exponent"), - IOP( "texp1", VDMOS_MOD_TEXP1, IF_REAL, "Drain resistance rd1 temperature exponent"), - IOP( "trd1", VDMOS_MOD_TRD1, IF_REAL, "Drain resistance linear temperature coefficient"), - IOP( "trd2", VDMOS_MOD_TRD2, IF_REAL, "Drain resistance quadratic temperature coefficient"), - IOP( "trg1", VDMOS_MOD_TRG1, IF_REAL, "Gate resistance linear temperature coefficient"), - IOP( "trg2", VDMOS_MOD_TRG2, IF_REAL, "Gate resistance quadratic temperature coefficient"), - IOP( "trs1", VDMOS_MOD_TRS1, IF_REAL, "Source resistance linear temperature coefficient"), - IOP( "trs2", VDMOS_MOD_TRS2, IF_REAL, "Source resistance quadratic temperature coefficient"), - IOP( "trb1", VDIO_MOD_TRB1, IF_REAL, "Body resistance linear temperature coefficient"), - IOP( "trb2", VDIO_MOD_TRB2, IF_REAL, "Body resistance quadratic temperature coefficient"), - - /* weak inversion */ - IOP("subshift", VDMOS_MOD_SUBSHIFT, IF_REAL, "Shift of weak inversion plot on the vgs axis"), - IOP("ksubthres", VDMOS_MOD_KSUBTHRES, IF_REAL, "Slope of weak inversion log current versus vgs"), - IOP("tksubthres1", VDMOS_MOD_TKSUBTHRES1, IF_REAL, "Linear temperature coefficient of ksubthres"), - IOP("tksubthres2", VDMOS_MOD_TKSUBTHRES2, IF_REAL, "Quadratic temperature coefficient of ksubthres"), - -/* body diode */ - IOP("bv", VDIO_MOD_BV, IF_REAL, "Vds breakdown voltage"), - IOP("ibv", VDIO_MOD_IBV, IF_REAL, "Current at Vds=bv"), - IOP("nbv", VDIO_MOD_NBV, IF_REAL, "Vds breakdown emission coefficient"), - IOP("rds", VDMOS_MOD_RDS, IF_REAL, "Drain-source shunt resistance"), - IOP("rb", VDIO_MOD_RB, IF_REAL, "Body diode ohmic resistance"), - IOP("n", VDIO_MOD_N, IF_REAL, "Body diode emission coefficient"), - IOP("tt", VDIO_MOD_TT, IF_REAL, "Body diode transit time"), - IOP("eg", VDIO_MOD_EG, IF_REAL, "Body diode activation energy for temperature effect on Is"), - IOP("xti", VDIO_MOD_XTI, IF_REAL, "Body diode saturation current temperature exponent"), - IOP("is", VDIO_MOD_IS, IF_REAL, "Body diode saturation current"), - IOP("vj", VDIO_MOD_VJ, IF_REAL, "Body diode junction potential"), - - /* body diode capacitance (e.g. source-drain capacitance) */ - IOPA("cjo", VDIO_MOD_CJ, IF_REAL, "Zero-bias body diode junction capacitance"), - IOP("m", VDIO_MOD_MJ, IF_REAL, "Body diode grading coefficient"), - IOP("fc", VDIO_MOD_FC, IF_REAL, "Body diode coefficient for forward-bias depletion capacitance formula"), - - /* gate-source and gate-drain capacitances */ - IOPA("cgdmin", VDMOS_MOD_CGDMIN, IF_REAL, "Minimum non-linear G-D capacitance"), - IOPA("cgdmax", VDMOS_MOD_CGDMAX, IF_REAL, "Maximum non-linear G-D capacitance"), - IOPA("a", VDMOS_MOD_A, IF_REAL, "Non-linear Cgd capacitance parameter"), - IOPA("cgs", VDMOS_MOD_CGS, IF_REAL, "Gate-source capacitance"), - -/* self heating */ - IOP("rthjc", VDMOS_MOD_RTHJC, IF_REAL, "Self-heating thermal resistance, junction-to-case"), - IOP("rthca", VDMOS_MOD_RTHCA, IF_REAL, "Self-heating thermal resistance, case-to-ambient"), - IOP("cthj", VDMOS_MOD_CTHJ, IF_REAL, "Self-heating thermal capacitance"), - -/* soa check */ - IOP("vgs_max", VDMOS_MOD_VGS_MAX, IF_REAL, "maximum voltage G-S branch"), - IOP("vgd_max", VDMOS_MOD_VGD_MAX, IF_REAL, "maximum voltage G-D branch"), - IOP("vds_max", VDMOS_MOD_VDS_MAX, IF_REAL, "maximum voltage D-S branch"), - IOP("vgsr_max", VDMOS_MOD_VGSR_MAX, IF_REAL, "maximum voltage G-S branch"), - IOP("vgdr_max", VDMOS_MOD_VGDR_MAX, IF_REAL, "maximum voltage G-D branch"), - IOP("pd_max", VDMOS_MOD_PD_MAX, IF_REAL, "maximum device power dissipation"), - IOP("id_max", VDMOS_MOD_ID_MAX, IF_REAL, "maximum drain/source current"), - IOP("idr_max", VDMOS_MOD_IDR_MAX, IF_REAL, "maximum drain/source reverse current"), - IOP("te_max", VDMOS_MOD_TE_MAX, IF_REAL, "maximum temperature"), - IOP("rth_ext", VDMOS_MOD_RTH_EXT, IF_REAL, "thermal resistance case to ambient, incl. heat sink"), - IOP("derating", VDMOS_MOD_DERATING, IF_REAL, "thermal derating for power"), -}; - -char *VDMOSnames[] = { - "Drain", - "Gate", - "Source", - "Temp", - "Tcase" -}; - -int VDMOSnSize = NUMELEMS(VDMOSnames); -int VDMOSpTSize = NUMELEMS(VDMOSpTable); -int VDMOSmPTSize = NUMELEMS(VDMOSmPTable); -int VDMOSiSize = sizeof(VDMOSinstance); -int VDMOSmSize = sizeof(VDMOSmodel); diff --git a/src/spicelib/devices/vdmos/vdmosacld.c b/src/spicelib/devices/vdmos/vdmosacld.c deleted file mode 100644 index b5f5e3138..000000000 --- a/src/spicelib/devices/vdmos/vdmosacld.c +++ /dev/null @@ -1,156 +0,0 @@ -/********** -Copyright 1990 Regents of the University of California. All rights reserved. -Author: 1985 Thomas L. Quarles -Modified: 2000 AlansFixes -VDMOS: 2018 Holger Vogt, 2020 Dietmar Warning -**********/ -/* - */ - -#include "ngspice/ngspice.h" -#include "ngspice/cktdefs.h" -#include "vdmosdefs.h" -#include "ngspice/sperror.h" -#include "ngspice/suffix.h" - - -int -VDMOSacLoad(GENmodel *inModel, CKTcircuit *ckt) -{ - VDMOSmodel *model = (VDMOSmodel*)inModel; - VDMOSinstance *here; - int xnrm; - int xrev; - double xgs, xcgT; - double xgd, xcdT; - double capgs, cgT; - double capgd, cdT; - double cTt, gTtt, gTtg, gTtdp, gTtsp; - double GmT; - double xcsT, xcTt; - - int selfheat; - - for( ; model != NULL; model = VDMOSnextModel(model)) { - for(here = VDMOSinstances(model); here!= NULL; - here = VDMOSnextInstance(here)) { - - selfheat = (here->VDMOSthermal) && (model->VDMOSrthjcGiven); - if (here->VDMOSmode < 0) { - xnrm=0; - xrev=1; - } else { - xnrm=1; - xrev=0; - } - - if (here->VDMOSmode >= 0) { - GmT = model->VDMOStype * here->VDMOSgmT; - cgT = model->VDMOStype * here->VDMOScgT; - cdT = model->VDMOStype * here->VDMOScdT; - cTt = model->VDMOScthj; - gTtg = here->VDMOSgtempg; - gTtdp = here->VDMOSgtempd; - gTtt = here->VDMOSgtempT; - gTtsp = - (gTtg + gTtdp); - } else { - GmT = -model->VDMOStype * here->VDMOSgmT; - cgT = -model->VDMOStype * here->VDMOScgT; - cdT = -model->VDMOStype * here->VDMOScdT; - cTt = -model->VDMOScthj; - gTtg = -here->VDMOSgtempg; - gTtdp = -here->VDMOSgtempd; - gTtt = -here->VDMOSgtempT; - gTtsp = gTtg + gTtdp; - } - - /* - * VDMOS cap model parameters - */ - capgs = ( *(ckt->CKTstate0+here->VDMOScapgs)+ - *(ckt->CKTstate0+here->VDMOScapgs)); - capgd = ( *(ckt->CKTstate0+here->VDMOScapgd)+ - *(ckt->CKTstate0+here->VDMOScapgd)); - xgs = capgs * ckt->CKTomega; - xgd = capgd * ckt->CKTomega; - - xcgT = cgT * ckt->CKTomega; - xcdT = cdT * ckt->CKTomega; - xcsT = -(cgT + cdT) * ckt->CKTomega; - xcTt = cTt * ckt->CKTomega; - - /* body diode */ - double gspr, geq, xceq; - gspr = here->VDIOtConductance; - geq = *(ckt->CKTstate0 + here->VDIOconduct); - xceq= *(ckt->CKTstate0 + here->VDIOcapCurrent) * ckt->CKTomega; - - /* - * load matrix - */ - *(here->VDMOSGPgpPtr +1) += xgd+xgs; - *(here->VDMOSDPdpPtr +1) += xgd; - *(here->VDMOSSPspPtr +1) += xgs; - *(here->VDMOSGPdpPtr +1) -= xgd; - *(here->VDMOSGPspPtr +1) -= xgs; - *(here->VDMOSDPgpPtr +1) -= xgd; - *(here->VDMOSSPgpPtr +1) -= xgs; - - *(here->VDMOSDdPtr) += here->VDMOSdrainConductance; - *(here->VDMOSSsPtr) += here->VDMOSsourceConductance; - *(here->VDMOSDPdpPtr) += here->VDMOSdrainConductance+ - here->VDMOSgds+xrev*(here->VDMOSgm); - *(here->VDMOSSPspPtr) += here->VDMOSsourceConductance+ - here->VDMOSgds+xnrm*(here->VDMOSgm); - *(here->VDMOSDdpPtr) -= here->VDMOSdrainConductance; - *(here->VDMOSSspPtr) -= here->VDMOSsourceConductance; - *(here->VDMOSDPdPtr) -= here->VDMOSdrainConductance; - *(here->VDMOSDPgpPtr) += (xnrm-xrev)*here->VDMOSgm; - *(here->VDMOSDPspPtr) -= here->VDMOSgds+xnrm*(here->VDMOSgm); - *(here->VDMOSSPgpPtr) -= (xnrm-xrev)*here->VDMOSgm; - *(here->VDMOSSPsPtr) -= here->VDMOSsourceConductance; - *(here->VDMOSSPdpPtr) -= here->VDMOSgds+xrev*(here->VDMOSgm); - /* gate resistor */ - *(here->VDMOSGgPtr) += (here->VDMOSgateConductance); - *(here->VDMOSGPgpPtr) += (here->VDMOSgateConductance); - *(here->VDMOSGgpPtr) -= here->VDMOSgateConductance; - *(here->VDMOSGPgPtr) -= here->VDMOSgateConductance; - /* body diode */ - *(here->VDMOSSsPtr) += gspr; - *(here->VDMOSDdPtr) += geq; - *(here->VDMOSDdPtr +1) += xceq; - *(here->VDIORPrpPtr) += geq+gspr; - *(here->VDIORPrpPtr +1) += xceq; - *(here->VDIOSrpPtr) -= gspr; - *(here->VDIODrpPtr) -= geq; - *(here->VDIODrpPtr +1) -= xceq; - *(here->VDIORPsPtr) -= gspr; - *(here->VDIORPdPtr) -= geq; - *(here->VDIORPdPtr +1) -= xceq; - if (selfheat) - { - *(here->VDMOSDPtempPtr) += GmT; - *(here->VDMOSSPtempPtr) += -GmT; - - *(here->VDMOSTemptempPtr) += gTtt + 1/model->VDMOSrthjc; - *(here->VDMOSTempgpPtr) += gTtg; - *(here->VDMOSTempdpPtr) += gTtdp; - *(here->VDMOSTempspPtr) += gTtsp; - *(here->VDMOSTemptcasePtr) += -1/model->VDMOSrthjc; - *(here->VDMOSTcasetempPtr) += -1/model->VDMOSrthjc; - *(here->VDMOSTcasetcasePtr) += 1/model->VDMOSrthjc + 1/model->VDMOSrthca; - *(here->VDMOSTptpPtr) += 1/model->VDMOSrthca; - *(here->VDMOSTptcasePtr) += -1/model->VDMOSrthca; - *(here->VDMOSTcasetpPtr) += -1/model->VDMOSrthca; - *(here->VDMOSCktTtpPtr) += 1.0; - *(here->VDMOSTpcktTPtr) += 1.0; - - *(here->VDMOSTemptempPtr + 1) += xcTt; - *(here->VDMOSDPtempPtr + 1) += xcdT; - *(here->VDMOSSPtempPtr + 1) += xcsT; - *(here->VDMOSGPtempPtr + 1) += xcgT; - } - } - } - return(OK); -} diff --git a/src/spicelib/devices/vdmos/vdmosask.c b/src/spicelib/devices/vdmos/vdmosask.c deleted file mode 100644 index f29ee0d03..000000000 --- a/src/spicelib/devices/vdmos/vdmosask.c +++ /dev/null @@ -1,184 +0,0 @@ -/********** -Copyright 1990 Regents of the University of California. All rights reserved. -Author: 1987 Thomas L. Quarles -Modified: 2000 AlansFixes -**********/ - -#include "ngspice/ngspice.h" -#include "ngspice/const.h" -#include "ngspice/ifsim.h" -#include "ngspice/cktdefs.h" -#include "ngspice/devdefs.h" -#include "vdmosdefs.h" -#include "ngspice/sperror.h" -#include "ngspice/suffix.h" - -/*ARGSUSED*/ -int -VDMOSask(CKTcircuit *ckt, GENinstance *inst, int which, IFvalue *value, - IFvalue *select) -{ - VDMOSinstance *here = (VDMOSinstance*)inst; - static char *msg = "Current and power not available for ac analysis"; - NG_IGNORE(select); - - switch(which) { - case VDMOS_TEMP: - value->rValue = here->VDMOStemp - CONSTCtoK; - return(OK); - case VDMOS_DTEMP: - value->rValue = here->VDMOSdtemp; - return(OK); - case VDMOS_CAPGS: - value->rValue = 2* *(ckt->CKTstate0 + here->VDMOScapgs); - return(OK); - case VDMOS_CAPGD: - value->rValue = 2* *(ckt->CKTstate0 + here->VDMOScapgd); - return(OK); - case VDMOS_CAPDS: - value->rValue = here->VDIOcap; - return(OK); - case VDMOS_M: - value->rValue = here->VDMOSm; - return(OK); - case VDMOS_OFF: - value->iValue = here->VDMOSoff; - return(OK); - case VDMOS_THERMAL: - value->iValue = here->VDMOSthermal; - return(OK); - case VDMOS_IC_VDS: - value->rValue = here->VDMOSicVDS; - return(OK); - case VDMOS_IC_VGS: - value->rValue = here->VDMOSicVGS; - return(OK); - case VDMOS_DNODE: - value->iValue = here->VDMOSdNode; - return(OK); - case VDMOS_GNODE: - value->iValue = here->VDMOSgNode; - return(OK); - case VDMOS_SNODE: - value->iValue = here->VDMOSsNode; - return(OK); - case VDMOS_TNODE: - value->iValue = here->VDMOStempNode; - return(OK); - case VDMOS_SNODEPRIME: - value->iValue = here->VDMOSsNodePrime; - return(OK); - case VDMOS_SOURCECONDUCT: - value->rValue = here->VDMOSsourceConductance; - return(OK); - case VDMOS_SOURCERESIST: - if (here->VDMOSsNodePrime != here->VDMOSsNode) - value->rValue = 1.0 / here->VDMOSsourceConductance; - else - value->rValue = 0.0; - return(OK); - case VDMOS_DRAINCONDUCT: - value->rValue = here->VDMOSdrainConductance; - return(OK); - case VDMOS_DRAINRESIST: - if (here->VDMOSdNodePrime != here->VDMOSdNode) - value->rValue = 1.0 / here->VDMOSdrainConductance; - else - value->rValue = 0.0; - return(OK); - case VDMOS_VON: - value->rValue = here->VDMOSvon; - return(OK); - case VDMOS_CD: - value->rValue = here->VDMOScd; - return(OK); - case VDMOS_GM: - value->rValue = here->VDMOSgm; - return(OK); - case VDMOS_GDS: - value->rValue = here->VDMOSgds; - return(OK); - case VDMOS_VGS: - value->rValue = *(ckt->CKTstate0 + here->VDMOSvgs); - return(OK); - case VDMOS_VDS: - value->rValue = *(ckt->CKTstate0 + here->VDMOSvds); - return(OK); - case VDMOS_QGS: - value->rValue = *(ckt->CKTstate0 + here->VDMOSqgs); - return(OK); - case VDMOS_CQGS: - value->rValue = *(ckt->CKTstate0 + here->VDMOScqgs); - return(OK); - case VDMOS_QGD: - value->rValue = *(ckt->CKTstate0 + here->VDMOSqgd); - return(OK); - case VDMOS_CQGD: - value->rValue = *(ckt->CKTstate0 + here->VDMOScqgd); - return(OK); - case VDMOS_CDIO: - value->rValue = *(ckt->CKTstate0 + here->VDIOcurrent); - return(OK); - case VDMOS_CG : - if (ckt->CKTcurrentAnalysis & DOING_AC) { - errMsg = TMALLOC(char, strlen(msg) + 1); - errRtn = "VDMOSask.c"; - strcpy(errMsg,msg); - return(E_ASKCURRENT); - } else if (ckt->CKTcurrentAnalysis & (DOING_DCOP | DOING_TRCV)) { - value->rValue = 0; - } else if ((ckt->CKTcurrentAnalysis & DOING_TRAN) && - (ckt->CKTmode & MODETRANOP)) { - value->rValue = 0; - } else { - value->rValue = *(ckt->CKTstate0 + here->VDMOScqgd) + *(ckt->CKTstate0 + - here->VDMOScqgs); - } - return(OK); - case VDMOS_CS : - if (ckt->CKTcurrentAnalysis & DOING_AC) { - errMsg = TMALLOC(char, strlen(msg) + 1); - errRtn = "VDMOSask.c"; - strcpy(errMsg,msg); - return(E_ASKCURRENT); - } else { - value->rValue = -here->VDMOScd; - if ((ckt->CKTcurrentAnalysis & DOING_TRAN) && - !(ckt->CKTmode & MODETRANOP)) { - value->rValue -= *(ckt->CKTstate0 + here->VDMOScqgd) + - *(ckt->CKTstate0 + here->VDMOScqgs); - } - } - return(OK); - case VDMOS_POWER : - if (ckt->CKTcurrentAnalysis & DOING_AC) { - errMsg = TMALLOC(char, strlen(msg) + 1); - errRtn = "VDMOSask.c"; - strcpy(errMsg,msg); - return(E_ASKPOWER); - } else { - value->rValue = fabs(here->VDMOScd * - (*(ckt->CKTrhsOld + here->VDMOSdNode) - - *(ckt->CKTrhsOld + here->VDMOSsNode))); - - if ((ckt->CKTcurrentAnalysis & DOING_TRAN) && - !(ckt->CKTmode & MODETRANOP)) { - value->rValue += fabs(*(ckt->CKTstate0 + here->VDMOScqgd) * - (*(ckt->CKTrhsOld + here->VDMOSgNode) - - *(ckt->CKTrhsOld + here->VDMOSdNode))); - value->rValue += fabs(*(ckt->CKTstate0 + here->VDMOScqgs) * - (*(ckt->CKTrhsOld + here->VDMOSgNode) - - *(ckt->CKTrhsOld + here->VDMOSsNode))); - } - - value->rValue += fabs(*(ckt->CKTstate0 + here->VDIOcurrent) * - (*(ckt->CKTrhsOld + here->VDMOSdNode) - - *(ckt->CKTrhsOld + here->VDMOSsNode))); - } - return(OK); - default: - return(E_BADPARM); - } - /* NOTREACHED */ -} - diff --git a/src/spicelib/devices/vdmos/vdmosconv.c b/src/spicelib/devices/vdmos/vdmosconv.c deleted file mode 100644 index c51a94a0a..000000000 --- a/src/spicelib/devices/vdmos/vdmosconv.c +++ /dev/null @@ -1,111 +0,0 @@ -/********** -Copyright 1990 Regents of the University of California. All rights reserved. -Author: 1985 Thomas L. Quarles -**********/ - -#include "ngspice/ngspice.h" -#include "ngspice/cktdefs.h" -#include "vdmosdefs.h" -#include "ngspice/sperror.h" -#include "ngspice/suffix.h" - -int -VDMOSconvTest(GENmodel *inModel, CKTcircuit *ckt) -{ - VDMOSmodel *model = (VDMOSmodel*)inModel; - VDMOSinstance *here; - double delvgs; - double delvds; - double delvgd; - double cdhat; - double vgs; - double vds; - double vgd; - double vgdo; - double tol; - double delvd,vd,cd; - int selfheat; - double delTemp, deldelTemp; - - for( ; model != NULL; model = VDMOSnextModel(model)) { - for(here = VDMOSinstances(model); here!= NULL; - here = VDMOSnextInstance(here)) { - - vgs = model->VDMOStype * ( - *(ckt->CKTrhs+here->VDMOSgNode) - - *(ckt->CKTrhs+here->VDMOSsNodePrime)); - vds = model->VDMOStype * ( - *(ckt->CKTrhs+here->VDMOSdNodePrime) - - *(ckt->CKTrhs+here->VDMOSsNodePrime)); - vgd=vgs-vds; - vgdo = *(ckt->CKTstate0 + here->VDMOSvgs) - - *(ckt->CKTstate0 + here->VDMOSvds); - delvgs = vgs - *(ckt->CKTstate0 + here->VDMOSvgs); - delvds = vds - *(ckt->CKTstate0 + here->VDMOSvds); - delvgd = vgd-vgdo; - - selfheat = (here->VDMOSthermal) && (model->VDMOSrthjcGiven); - if (selfheat) { - delTemp = *(ckt->CKTrhs + here->VDMOStempNode); - deldelTemp = delTemp - *(ckt->CKTstate0 + here->VDMOSdelTemp); - } else { - deldelTemp = 0.0; - } - - /* these are needed for convergence testing */ - - if (here->VDMOSmode >= 0) { - cdhat= - here->VDMOScd - - here->VDMOSgm * delvgs + - here->VDMOSgds * delvds + - here->VDMOSgmT * deldelTemp; - } else { - cdhat= - here->VDMOScd - - here->VDMOSgm * delvgd + - here->VDMOSgds * delvds + - here->VDMOSgmT * deldelTemp; - } - /* - * check convergence - */ - tol=ckt->CKTreltol*MAX(fabs(cdhat),fabs(here->VDMOScd))+ - ckt->CKTabstol; - if (fabs(cdhat-here->VDMOScd) >= tol) { - ckt->CKTnoncon++; - ckt->CKTtroubleElt = (GENinstance *) here; - return(OK); /* no reason to continue, we haven't converged */ - } - - /* - * initialization - */ - - vd = *(ckt->CKTrhsOld+here->VDIOposPrimeNode)- - *(ckt->CKTrhsOld + here->VDMOSdNode); - - delvd=vd- *(ckt->CKTstate0 + here->VDIOvoltage); - - cdhat= *(ckt->CKTstate0 + here->VDIOcurrent) + - *(ckt->CKTstate0 + here->VDIOconduct) * delvd + - *(ckt->CKTstate0 + here->VDIOdIdio_dT) * deldelTemp; - - cd= *(ckt->CKTstate0 + here->VDIOcurrent); - - /* - * check convergence - */ - tol=ckt->CKTreltol* - MAX(fabs(cdhat),fabs(cd))+ckt->CKTabstol; - if (fabs(cdhat-cd) > tol) { - ckt->CKTnoncon++; - ckt->CKTtroubleElt = (GENinstance *) here; - return(OK); /* don't need to check any more device */ - } - - - } - } - return(OK); -} diff --git a/src/spicelib/devices/vdmos/vdmosdefs.h b/src/spicelib/devices/vdmos/vdmosdefs.h deleted file mode 100644 index a7450a98c..000000000 --- a/src/spicelib/devices/vdmos/vdmosdefs.h +++ /dev/null @@ -1,567 +0,0 @@ -/********** -Copyright 1990 Regents of the University of California. All rights reserved. -Author: 1985 Thomas L. Quarles -Modified: 2000 AlansFixes -VDMOS: 2018 Holger Vogt, 2020 Dietmar Warning -**********/ - -#ifndef VDMOS -#define VDMOS - -#include "ngspice/ifsim.h" -#include "ngspice/cktdefs.h" -#include "ngspice/gendefs.h" -#include "ngspice/complex.h" -#include "ngspice/noisedef.h" - -/* declarations for VDMOSFETs */ - -/* indices to the array of MOSFET(1) noise sources */ - -enum { - VDMOSRDNOIZ = 0, - VDMOSRSNOIZ, - VDMOSIDNOIZ, - VDMOSFLNOIZ, - VDMOSTOTNOIZ, - /* finally, the number of noise sources */ - VDMOSNSRCS -}; - -/* information needed for each instance */ - -typedef struct sVDMOSinstance { - - struct GENinstance gen; - -#define VDMOSmodPtr(inst) ((struct sVDMOSmodel *)((inst)->gen.GENmodPtr)) -#define VDMOSnextInstance(inst) ((struct sVDMOSinstance *)((inst)->gen.GENnextInstance)) -#define VDMOSname gen.GENname -#define VDMOSstates gen.GENstate - - const int VDMOSdNode; /* number of the drain node of the mosfet */ - const int VDMOSgNode; /* number of the gate node of the mosfet */ - const int VDMOSsNode; /* number of the source node of the mosfet */ - int VDMOStempNode; /* number of the temperature node of the mosfet */ - int VDMOStcaseNode; /* number of the 2nd temperature node of the mosfet */ - int VDMOSdNodePrime; /* number of the internal drain node of the mosfet */ - int VDMOSsNodePrime; /* number of the internal source node of the mosfet */ - int VDMOSgNodePrime; /* number of the internal gate node of the mosfet */ - int VDMOStNodePrime; /* number of the internal temp node between voltage source and Rthca */ - int VDIOposPrimeNode; /* number of the internal node of the body diode */ - - int VDMOSvcktTbranch; /* equation number of branch equation added for cktTemp source */ - - double VDMOSm; /* parallel device multiplier */ - - double VDMOSsourceConductance; /*conductance of source(or 0):set in setup*/ - double VDMOSdrainConductance; /*conductance of drain(or 0):set in setup*/ - double VDMOSdrainResistance; /*resistance of drain(or 0): set in temp*/ - double VDMOSqsResistance; /*resistance of drain: set in temp*/ - double VDMOSgateConductance; /*conductance of gate(or 0):set in setup*/ - double VDMOSdsConductance; /*conductance of drain to source:set in setup*/ - double VDMOStemp; /* operating temperature of this instance */ - double VDMOSdtemp; /* operating temperature of the instance relative to circuit temperature*/ - int VDMOSthermal; /* flag indicate self heating on */ - - double VDMOStTransconductance; /* temperature corrected transconductance*/ - double VDMOStPhi; /* temperature corrected Phi */ - double VDMOStVth; /* temperature corrected Vth */ - double VDMOStksubthres; /* temperature weak inversion slope */ - - double VDMOSicVDS; /* initial condition D-S voltage */ - double VDMOSicVGS; /* initial condition G-S voltage */ - double VDMOSvon; - double VDMOSvdsat; - double VDMOScd; - double VDMOSgm; - double VDMOSgds; - - double VDIOcap; - double VDIOtSatCur; /* temperature corrected saturation Cur. density */ - double VDIOtSatCur_dT; - double VDIOinitCond; - double VDIOtVcrit; - double VDIOconductance; - double VDIOtConductance; - double VDIOtConductance_dT; - double VDIOtBrkdwnV; - double VDIOtJctCap; - double VDIOtDepCap; /* temperature adjusted transition point in */ - /* the curve matching Fc * Vj */ - double VDIOtJctPot; /* temperature corrected junction potential */ - double VDIOtGradingCoeff; - - double VDIOtTransitTime; - double VDIOtF1; - double VDIOtF2; - double VDIOtF3; - - double VDMOSTempSH; /* for portability of SH temp to noise analysis */ - - double VDMOSgmT; - double VDMOSgtempg; - double VDMOSgtempd; - double VDMOSgtempT; - double VDMOScgT; - double VDMOScdT; - double VDMOScth; /* current alias power */ - -/* - * naming convention: - * x = vgs - * y = vbs - * z = vds - * cdr = cdrain - */ - -#define VDMOSNDCOEFFS 11 - -#ifndef NODISTO - double VDMOSdCoeffs[VDMOSNDCOEFFS]; -#else /* NODISTO */ - double *VDMOSdCoeffs; -#endif /* NODISTO */ - -#ifndef CONFIG - -#define cdr_x2 VDMOSdCoeffs[0] -#define cdr_y2 VDMOSdCoeffs[1] -#define cdr_xy VDMOSdCoeffs[2] -#define cdr_x3 VDMOSdCoeffs[3] -#define cdr_y3 VDMOSdCoeffs[4] -#define cdr_x2y VDMOSdCoeffs[5] -#define cdr_xy2 VDMOSdCoeffs[6] -#define capgs2 VDMOSdCoeffs[7] -#define capgs3 VDMOSdCoeffs[8] -#define capgd2 VDMOSdCoeffs[9] -#define capgd3 VDMOSdCoeffs[10] - -#endif - -#ifndef NONOISE - double VDMOSnVar[NSTATVARS][VDMOSNSRCS]; -#else /* NONOISE */ - double **VDMOSnVar; -#endif /* NONOISE */ - - int VDMOSmode; /* device mode : 1 = normal, -1 = inverse */ - - unsigned VDMOSoff:1; /* non-zero to indicate device is off for dc analysis*/ - unsigned VDMOStempGiven :1; /* instance temperature specified */ - unsigned VDMOSdtempGiven :1; /* instance delta temperature specified */ - unsigned VDMOSmGiven :1; - unsigned VDMOSdNodePrimeSet :1; - unsigned VDMOSsNodePrimeSet :1; - unsigned VDMOSicVDSGiven :1; - unsigned VDMOSicVGSGiven :1; - unsigned VDMOSvonGiven : 1; - unsigned VDMOSvdsatGiven :1; - unsigned VDMOSmodeGiven :1; - - double *VDMOSDdPtr; /* pointer to sparse matrix element at - (Drain node,drain node) */ - double *VDMOSGgPtr; /* pointer to sparse matrix element at - (gate node,gate node) */ - double *VDMOSSsPtr; /* pointer to sparse matrix element at - (source node,source node) */ - double *VDMOSDPdpPtr; /* pointer to sparse matrix element at - (drain prime node,drain prime node) */ - double *VDMOSSPspPtr; /* pointer to sparse matrix element at - (source prime node,source prime node) */ - double *VDMOSDdpPtr; /* pointer to sparse matrix element at - (drain node,drain prime node) */ - double *VDMOSGdpPtr; /* pointer to sparse matrix element at - (gate node,drain prime node) */ - double *VDMOSGspPtr; /* pointer to sparse matrix element at - (gate node,source prime node) */ - double *VDMOSSspPtr; /* pointer to sparse matrix element at - (source node,source prime node) */ - double *VDMOSDPspPtr; /* pointer to sparse matrix element at - (drain prime node,source prime node) */ - double *VDMOSDPdPtr; /* pointer to sparse matrix element at - (drain prime node,drain node) */ - double *VDMOSDPgPtr; /* pointer to sparse matrix element at - (drain prime node,gate node) */ - - double *VDMOSSPgPtr; /* pointer to sparse matrix element at - (source prime node,gate node) */ - double *VDMOSSPsPtr; /* pointer to sparse matrix element at - (source prime node,source node) */ - double *VDMOSSPdpPtr; /* pointer to sparse matrix element at - (source prime node,drain prime node) */ - /* added for VDMOS */ - double *VDMOSGPgpPtr; /* pointer to sparse matrix element at - (gate prime node, gate prime node) */ - double *VDMOSGPdpPtr; /* pointer to sparse matrix element at - (gate prime node, drain prime node) */ - double *VDMOSGPspPtr; /* pointer to sparse matrix element at - (gate prime node, source prime node) */ - double *VDMOSDPgpPtr; /* pointer to sparse matrix element at - (drain prime node, gate prime node) */ - double *VDMOSSPgpPtr; /* pointer to sparse matrix element at - (source prime node, gate prime node) */ - double *VDMOSGgpPtr; /* pointer to sparse matrix element at - (gate node, gate prime node) */ - double *VDMOSGPgPtr; /* pointer to sparse matrix element at - (gate prime node, gate node) */ - double *VDMOSDsPtr; /* pointer to sparse matrix element at - (source node, drain node) */ - double *VDMOSSdPtr; /* pointer to sparse matrix element at - (drain node, source node) */ - /* body diode */ - double *VDIORPdPtr; /* pointer to sparse matrix element at - (diode prime node, drain node) */ - double *VDIODrpPtr; /* pointer to sparse matrix element at - (drain node, diode prime node) */ - double *VDIORPrpPtr; /* pointer to sparse matrix element at - (diode prime node, diode prime node) */ - double *VDIOSrpPtr; /* pointer to sparse matrix element at - (source node, diode prime node) */ - double *VDIORPsPtr; /* pointer to sparse matrix element at - (diode prime node, source node) */ - /* self heating */ - double *VDMOSTemptempPtr; /* Transistor thermal contribution */ - double *VDMOSTempdpPtr; - double *VDMOSTempspPtr; - double *VDMOSTempgpPtr; - double *VDMOSGPtempPtr; - double *VDMOSDPtempPtr; - double *VDMOSSPtempPtr; - - double *VDIOTempposPrimePtr; /* Diode thermal contribution */ - double *VDMOSTempdPtr; - double *VDIOPosPrimetempPtr; - double *VDMOSDtempPtr; - double *VDMOStempSPtr; - double *VDMOSSTempPtr; - - double *VDMOSTcasetcasePtr; /* for Rthjc */ - double *VDMOSTcasetempPtr; - double *VDMOSTemptcasePtr; - double *VDMOSTptpPtr; /* for Rthca */ - double *VDMOSTptcasePtr; - double *VDMOSTcasetpPtr; - double *VDMOSCktTcktTPtr; /* for VcktTemp */ - double *VDMOSCktTtpPtr; - double *VDMOSTpcktTPtr; - -} VDMOSinstance ; - -#define VDMOSvgs VDMOSstates+ 0 /* gate-source voltage */ -#define VDMOSvds VDMOSstates+ 1 /* drain-source voltage */ -#define VDMOSdelTemp VDMOSstates+ 2 /* thermal voltage over rth0 */ - -#define VDMOScapgs VDMOSstates+3 /* gate-source capacitor value */ -#define VDMOSqgs VDMOSstates+ 4 /* gate-source capacitor charge */ -#define VDMOScqgs VDMOSstates+ 5 /* gate-source capacitor current */ - -#define VDMOScapgd VDMOSstates+ 6 /* gate-drain capacitor value */ -#define VDMOSqgd VDMOSstates+ 7 /* gate-drain capacitor charge */ -#define VDMOScqgd VDMOSstates+ 8 /* gate-drain capacitor current */ - -#define VDIOvoltage VDMOSstates+ 9 -#define VDIOcurrent VDMOSstates+ 10 -#define VDIOconduct VDMOSstates+ 11 - -#define VDIOcapCharge VDMOSstates+ 12 -#define VDIOcapCurrent VDMOSstates+ 13 - -#define VDMOScapth VDMOSstates+ 14 /* thermal capacitor value */ -#define VDMOSqth VDMOSstates+ 15 /* thermal capacitor charge */ -#define VDMOScqth VDMOSstates+ 16 /* thermal capacitor current */ - -#define VDIOdIdio_dT VDMOSstates+ 17 - -#define VDMOSnumStates 18 - - -/* per model data */ - - /* NOTE: parameters marked 'input - use xxxx' are parameters for - * which a temperature correction is applied in VDMOStemp, thus - * the VDMOSxxxx value in the per-instance structure should be used - * instead in all calculations - */ - - -typedef struct sVDMOSmodel { /* model structure for a resistor */ - - struct GENmodel gen; - -#define VDMOSmodType gen.GENmodType -#define VDMOSnextModel(inst) ((struct sVDMOSmodel *)((inst)->gen.GENnextModel)) -#define VDMOSinstances(inst) ((VDMOSinstance *)((inst)->gen.GENinstances)) -#define VDMOSmodName gen.GENmodName - - int VDMOStype; /* device type : 1 = nmos, -1 = pmos */ - double VDMOStnom; /* temperature at which parameters measured */ - double VDMOSdrainResistance; - double VDMOSsourceResistance; - double VDMOSgateResistance; - double VDMOSqsResistance; - double VDMOSqsVoltage; - double VDMOStransconductance; /* input - use tTransconductance */ - double VDMOSoxideCapFactor; - double VDMOSvth0; /* input - use tVth */ - double VDMOSphi; /* input - use tPhi */ - double VDMOSlambda; - double VDMOStheta; - double VDMOSfNcoef; - double VDMOSfNexp; - - double VDMOScgdmin; - double VDMOScgdmax; - double VDMOSa; - double VDMOScgs; - double VDMOSsubshift; - double VDMOSksubthres; - double VDMOSmtr; - double VDMOSrds; - - /* body diode */ - double VDIOjunctionCap; /* input - use tCj */ - double VDIOjunctionPot; /* input - use tJctPot */ - double VDIOdepletionCapCoeff; - double VDIOjctSatCur; /* input - use tSatCur */ - double VDIObv; - double VDIOibv; - double VDIObrkdEmissionCoeff; - double VDIOresistance; - double VDIOn; - double VDIOtransitTime; - double VDIOtranTimeTemp1; - double VDIOtranTimeTemp2; - double VDIOeg; - double VDIOxti; - double VDIOgradCoeff; - double VDIOgradCoeffTemp1; - double VDIOgradCoeffTemp2; - double VDIOtrb1; - double VDIOtrb2; - - double VDMOStcvth; - double VDMOSrthjc; - double VDMOSrthca; - double VDMOScthj; - double VDMOSmu; - double VDMOStexp0; - double VDMOStexp1; - double VDMOStrd1; - double VDMOStrd2; - double VDMOStrg1; - double VDMOStrg2; - double VDMOStrs1; - double VDMOStrs2; - double VDMOStksubthres1; - double VDMOStksubthres2; - - double VDMOSvgsMax; - double VDMOSvgdMax; - double VDMOSvdsMax; - double VDMOSvgsrMax; - double VDMOSvgdrMax; - double VDMOSid_max; - double VDMOSidr_max; - double VDMOSpd_max; - double VDMOSrth_ext; - double VDMOSte_max; - double VDMOSderating; - - unsigned VDMOStypeGiven :1; - unsigned VDMOSdrainResistanceGiven :1; - unsigned VDMOSsourceResistanceGiven :1; - unsigned VDMOSgateResistanceGiven :1; - unsigned VDMOSqsResistanceGiven :1; - unsigned VDMOSqsVoltageGiven :1; - unsigned VDMOSqsGiven :1; - unsigned VDMOStransconductanceGiven :1; - unsigned VDMOSvth0Given :1; - unsigned VDMOSphiGiven :1; - unsigned VDMOSlambdaGiven :1; - unsigned VDMOSthetaGiven :1; - unsigned VDMOStnomGiven :1; - unsigned VDMOSfNcoefGiven :1; - unsigned VDMOSfNexpGiven :1; - - unsigned VDMOScgdminGiven :1; - unsigned VDMOScgdmaxGiven :1; - unsigned VDMOScgsGiven :1; - unsigned VDMOSaGiven :1; - unsigned VDMOSsubshiftGiven :1; - unsigned VDMOSksubthresGiven :1; - unsigned VDMOSmtrGiven :1; - unsigned VDMOSrdsGiven :1; - - unsigned VDIOjctSatCurGiven :1; - unsigned VDIOgradCoeffGiven :1; - unsigned VDIOdepletionCapCoeffGiven :1; - unsigned VDIObvGiven :1; - unsigned VDIOibvGiven :1; - unsigned VDIOjunctionCapGiven :1; - unsigned VDIOjunctionPotGiven :1; - unsigned VDIObrkdEmissionCoeffGiven :1; - unsigned VDIOresistanceGiven :1; - unsigned VDIOnGiven :1; - unsigned VDIOtransitTimeGiven :1; - unsigned VDIOegGiven :1; - unsigned VDIOxtiGiven :1; - unsigned VDIOtrb1Given :1; - unsigned VDIOtrb2Given :1; - - unsigned VDMOStcvthGiven :1; - unsigned VDMOSrthjcGiven :1; - unsigned VDMOSrthcaGiven :1; - unsigned VDMOScthjGiven :1; - unsigned VDMOSmuGiven :1; - unsigned VDMOStexp0Given :1; - unsigned VDMOStexp1Given :1; - unsigned VDMOStrd1Given :1; - unsigned VDMOStrd2Given :1; - unsigned VDMOStrg1Given :1; - unsigned VDMOStrg2Given :1; - unsigned VDMOStrs1Given :1; - unsigned VDMOStrs2Given :1; - unsigned VDMOStksubthres1Given :1; - unsigned VDMOStksubthres2Given :1; - - unsigned VDMOSvgsMaxGiven :1; - unsigned VDMOSvgdMaxGiven :1; - unsigned VDMOSvdsMaxGiven :1; - unsigned VDMOSvgsrMaxGiven :1; - unsigned VDMOSvgdrMaxGiven :1; - unsigned VDMOSrth_extGiven :1; - unsigned VDMOSpd_maxGiven :1; - unsigned VDMOSte_maxGiven :1; - unsigned VDMOSid_maxGiven :1; - unsigned VDMOSidr_maxGiven :1; - unsigned VDMOSderatingGiven :1; -} VDMOSmodel; - -#ifndef NMOS -#define NMOS 1 -#define PMOS -1 -#endif /*NMOS*/ - -/* device parameters */ -enum { - VDMOS_OFF = 1, - VDMOS_IC, - VDMOS_IC_VDS, - VDMOS_IC_VGS, - VDMOS_CG, - VDMOS_CS, - VDMOS_POWER, - VDMOS_TEMP, - VDMOS_M, - VDMOS_DTEMP, - VDMOS_THERMAL, -}; - -/* model parameters */ -enum { - VDMOS_MOD_VTH = 101, - VDMOS_MOD_KP, - VDMOS_MOD_PHI, - VDMOS_MOD_LAMBDA, - VDMOS_MOD_THETA, - VDMOS_MOD_RD, - VDMOS_MOD_RS, - VDMOS_MOD_RG, - VDMOS_MOD_RQ, - VDMOS_MOD_VQ, - VDMOS_MOD_NMOS, - VDMOS_MOD_PMOS, - VDMOS_MOD_TNOM, - VDMOS_MOD_KF, - VDMOS_MOD_AF, - VDMOS_MOD_TYPE, - VDMOS_MOD_DMOS, - VDMOS_MOD_CGDMIN, - VDMOS_MOD_CGDMAX, - VDMOS_MOD_A, - VDMOS_MOD_CGS, - VDMOS_MOD_MTRIODE, - VDMOS_MOD_SUBSHIFT, - VDMOS_MOD_KSUBTHRES, - VDMOS_MOD_RDS, - VDIO_MOD_IS, - VDIO_MOD_VJ, - VDIO_MOD_CJ, - VDIO_MOD_MJ, - VDIO_MOD_FC, - VDIO_MOD_RB, - VDIO_MOD_BV, - VDIO_MOD_IBV, - VDIO_MOD_NBV, - VDIO_MOD_N, - VDIO_MOD_TT, - VDIO_MOD_EG, - VDIO_MOD_XTI, - VDIO_MOD_TRB1, - VDIO_MOD_TRB2, - VDMOS_MOD_TCVTH, - VDMOS_MOD_RTHJC, - VDMOS_MOD_RTHCA, - VDMOS_MOD_CTHJ, - VDMOS_MOD_MU, - VDMOS_MOD_TEXP0, - VDMOS_MOD_TEXP1, - VDMOS_MOD_TRD1, - VDMOS_MOD_TRD2, - VDMOS_MOD_TRG1, - VDMOS_MOD_TRG2, - VDMOS_MOD_TRS1, - VDMOS_MOD_TRS2, - VDMOS_MOD_TKSUBTHRES1, - VDMOS_MOD_TKSUBTHRES2, - VDMOS_MOD_VGS_MAX, - VDMOS_MOD_VGD_MAX, - VDMOS_MOD_VDS_MAX, - VDMOS_MOD_VGSR_MAX, - VDMOS_MOD_VGDR_MAX, - VDMOS_MOD_PD_MAX, - VDMOS_MOD_ID_MAX, - VDMOS_MOD_IDR_MAX, - VDMOS_MOD_TE_MAX, - VDMOS_MOD_RTH_EXT, - VDMOS_MOD_DERATING, -}; - -/* device questions */ -enum { - VDMOS_CAPGS = 201, - VDMOS_CAPGD, - VDMOS_CAPDS, - VDMOS_DNODE, - VDMOS_GNODE, - VDMOS_SNODE, - VDMOS_TNODE, - VDMOS_TCASE, - VDMOS_DNODEPRIME, - VDMOS_SNODEPRIME, - VDMOS_SOURCECONDUCT, - VDMOS_DRAINCONDUCT, - VDMOS_VON, - VDMOS_CD, - VDMOS_GM, - VDMOS_GDS, - VDMOS_VGS, - VDMOS_VDS, - VDMOS_QGS, - VDMOS_CQGS, - VDMOS_QGD, - VDMOS_CQGD, - VDMOS_CDIO, - VDMOS_SOURCERESIST, - VDMOS_DRAINRESIST, -}; - -/* model questions */ - -void VDMOStempUpdate(VDMOSmodel *, VDMOSinstance *, double , CKTcircuit *); - -#include "vdmosext.h" - -#endif /*VDMOS*/ - diff --git a/src/spicelib/devices/vdmos/vdmosdist.c b/src/spicelib/devices/vdmos/vdmosdist.c deleted file mode 100644 index 6978c1a3e..000000000 --- a/src/spicelib/devices/vdmos/vdmosdist.c +++ /dev/null @@ -1,708 +0,0 @@ -/********** -Copyright 1990 Regents of the University of California. All rights reserved. -Author: 1988 Jaijeet S Roychowdhury -**********/ - -#include "ngspice/ngspice.h" -#include "ngspice/cktdefs.h" -#include "vdmosdefs.h" -#include "ngspice/sperror.h" -#include "ngspice/distodef.h" -#include "ngspice/suffix.h" - -int -VDMOSdisto(int mode, GENmodel *genmodel, CKTcircuit *ckt) - -/* assuming here that ckt->CKTomega has been initialised to - * the correct value - */ -{ - VDMOSmodel *model = (VDMOSmodel *) genmodel; - DISTOAN* job = (DISTOAN*) ckt->CKTcurJob; - DpassStr pass; - double r1h1x,i1h1x; - double r1h1y,i1h1y; - double r1h2x, i1h2x; - double r1h2y, i1h2y; - double r1hm2x,i1hm2x; - double r1hm2y,i1hm2y; - double r2h11x,i2h11x; - double r2h11y,i2h11y; - double r2h1m2x,i2h1m2x; - double r2h1m2y,i2h1m2y; - double temp, itemp; - VDMOSinstance *here; - - if (mode == D_SETUP) - return(VDMOSdSetup(genmodel,ckt)); - - if ((mode == D_TWOF1) || (mode == D_THRF1) || - (mode == D_F1PF2) || (mode == D_F1MF2) || - (mode == D_2F1MF2)) { - - /* loop through all the VDMOS models */ - for( ; model != NULL; model = VDMOSnextModel(model)) { - - /* loop through all the instances of the model */ - for (here = VDMOSinstances(model); here != NULL ; - here=VDMOSnextInstance(here)) { - - /* loading starts here */ - - switch (mode) { - case D_TWOF1: - /* x = vgs, z = vds */ - - /* getting first order (linear) Volterra kernel */ - r1h1x = *(job->r1H1ptr + (here->VDMOSgNode)) - - *(job->r1H1ptr + (here->VDMOSsNodePrime)); - i1h1x = *(job->i1H1ptr + (here->VDMOSgNode)) - - *(job->i1H1ptr + (here->VDMOSsNodePrime)); - - r1h1y = *(job->r1H1ptr + (here->VDMOSdNodePrime)) - - *(job->r1H1ptr + (here->VDMOSsNodePrime)); - i1h1y = *(job->i1H1ptr + (here->VDMOSdNodePrime)) - - *(job->i1H1ptr + (here->VDMOSsNodePrime)); - - /* loading starts here */ - /* loading cdrain term */ - - temp = DFn2F1(here->cdr_x2, - here->cdr_y2, - 0.0, - here->cdr_xy, - 0.0, - 0.0, - r1h1x, - i1h1x, - r1h1y, - i1h1y, - 0.0, - 0.0); - - itemp = DFi2F1(here->cdr_x2, - here->cdr_y2, - 0.0, - here->cdr_xy, - 0.0, - 0.0, - r1h1x, - i1h1x, - r1h1y, - i1h1y, - 0.0, - 0.0); - - *(ckt->CKTrhs + (here->VDMOSdNodePrime)) -= temp; - *(ckt->CKTirhs + (here->VDMOSdNodePrime)) -= itemp; - *(ckt->CKTrhs + (here->VDMOSsNodePrime)) += temp; - *(ckt->CKTirhs + (here->VDMOSsNodePrime)) += itemp; - - /* cdrain term over */ - - /* loading capgs term */ - - temp = -ckt->CKTomega * - D1i2F1(here->capgs2, - r1h1x, - i1h1x); - - itemp = ckt->CKTomega * - D1n2F1(here->capgs2, - r1h1x, - i1h1x); - - *(ckt->CKTrhs + (here->VDMOSgNode)) -= temp; - *(ckt->CKTirhs + (here->VDMOSgNode)) -= itemp; - *(ckt->CKTrhs + (here->VDMOSsNodePrime)) += temp; - *(ckt->CKTirhs + (here->VDMOSsNodePrime)) += itemp; - - /* capgs over */ - - /* loading capgd term */ - - temp = -ckt->CKTomega * - D1i2F1(here->capgd2, - r1h1x - r1h1y, - i1h1x - i1h1y); - - itemp = ckt->CKTomega * - D1n2F1(here->capgd2, - r1h1x - r1h1y, - i1h1x - i1h1y); - - - *(ckt->CKTrhs + (here->VDMOSgNode)) -= temp; - *(ckt->CKTirhs + (here->VDMOSgNode)) -= itemp; - *(ckt->CKTrhs + (here->VDMOSdNodePrime)) += temp; - *(ckt->CKTirhs + (here->VDMOSdNodePrime)) += itemp; - - /* capgd over */ - - /* all done */ - - break; - - case D_THRF1: - /* x = vgs, y = vds */ - - /* getting first order (linear) Volterra kernel */ - r1h1x = *(job->r1H1ptr + (here->VDMOSgNode)) - - *(job->r1H1ptr + (here->VDMOSsNodePrime)); - i1h1x = *(job->i1H1ptr + (here->VDMOSgNode)) - - *(job->i1H1ptr + (here->VDMOSsNodePrime)); - - r1h1y = *(job->r1H1ptr + (here->VDMOSdNodePrime)) - - *(job->r1H1ptr + (here->VDMOSsNodePrime)); - i1h1y = *(job->i1H1ptr + (here->VDMOSdNodePrime)) - - *(job->i1H1ptr + (here->VDMOSsNodePrime)); - - r2h11x = *(job->r2H11ptr + (here->VDMOSgNode)) - - *(job->r2H11ptr + (here->VDMOSsNodePrime)); - i2h11x = *(job->i2H11ptr + (here->VDMOSgNode)) - - *(job->i2H11ptr + (here->VDMOSsNodePrime)); - - r2h11y = *(job->r2H11ptr + (here->VDMOSdNodePrime)) - - *(job->r2H11ptr + (here->VDMOSsNodePrime)); - i2h11y = *(job->i2H11ptr + (here->VDMOSdNodePrime)) - - *(job->i2H11ptr + (here->VDMOSsNodePrime)); - /* loading starts here */ - /* loading cdrain term */ - - temp = DFn3F1(here->cdr_x2, - here->cdr_y2, - 0.0, - here->cdr_xy, - 0.0, - 0.0, - here->cdr_x3, - here->cdr_y3, - 0.0, - here->cdr_x2y, - 0.0, - here->cdr_xy2, - 0.0, - 0.0, - 0.0, - 0.0, - r1h1x, - i1h1x, - r1h1y, - i1h1y, - 0.0, - 0.0, - r2h11x, - i2h11x, - r2h11y, - i2h11y, - 0.0, - 0.0); - itemp = DFi3F1(here->cdr_x2, - here->cdr_y2, - 0.0, - here->cdr_xy, - 0.0, - 0.0, - here->cdr_x3, - here->cdr_y3, - 0.0, - here->cdr_x2y, - 0.0, - here->cdr_xy2, - 0.0, - 0.0, - 0.0, - 0.0, - r1h1x, - i1h1x, - r1h1y, - i1h1y, - 0.0, - 0.0, - r2h11x, - i2h11x, - r2h11y, - i2h11y, - 0.0, - 0.0); - - - *(ckt->CKTrhs + (here->VDMOSdNodePrime)) -= temp; - *(ckt->CKTirhs + (here->VDMOSdNodePrime)) -= itemp; - *(ckt->CKTrhs + (here->VDMOSsNodePrime)) += temp; - *(ckt->CKTirhs + (here->VDMOSsNodePrime)) += itemp; - - /* cdrain term over */ - - /* loading capgs term */ - - temp = -ckt->CKTomega * - D1i3F1(here->capgs2, - here->capgs3, - r1h1x, - i1h1x, - r2h11x, - i2h11x); - - itemp = ckt->CKTomega * - D1n3F1(here->capgs2, - here->capgs3, - r1h1x, - i1h1x, - r2h11x, - i2h11x); - - *(ckt->CKTrhs + (here->VDMOSgNode)) -= temp; - *(ckt->CKTirhs + (here->VDMOSgNode)) -= itemp; - *(ckt->CKTrhs + (here->VDMOSsNodePrime)) += temp; - *(ckt->CKTirhs + (here->VDMOSsNodePrime)) += itemp; - - /* capgs over */ - - /* loading capgd term */ - - temp = -ckt->CKTomega * - D1i3F1(here->capgd2, - here->capgd3, - r1h1x - r1h1y, - i1h1x - i1h1y, - r2h11x - r2h11y, - i2h11x - i2h11y); - - itemp = ckt->CKTomega * - D1n3F1(here->capgd2, - here->capgd3, - r1h1x - r1h1y, - i1h1x - i1h1y, - r2h11x - r2h11y, - i2h11x - i2h11y); - - - *(ckt->CKTrhs + (here->VDMOSgNode)) -= temp; - *(ckt->CKTirhs + (here->VDMOSgNode)) -= itemp; - *(ckt->CKTrhs + (here->VDMOSdNodePrime)) += temp; - *(ckt->CKTirhs + (here->VDMOSdNodePrime)) += itemp; - - /* capgd over */ - /* all done */ - - break; - case D_F1PF2: - /* x = vgs, y = vds */ - - /* getting first order (linear) Volterra kernel */ - r1h1x = *(job->r1H1ptr + (here->VDMOSgNode)) - - *(job->r1H1ptr + (here->VDMOSsNodePrime)); - i1h1x = *(job->i1H1ptr + (here->VDMOSgNode)) - - *(job->i1H1ptr + (here->VDMOSsNodePrime)); - - r1h1y = *(job->r1H1ptr + (here->VDMOSdNodePrime)) - - *(job->r1H1ptr + (here->VDMOSsNodePrime)); - i1h1y = *(job->i1H1ptr + (here->VDMOSdNodePrime)) - - *(job->i1H1ptr + (here->VDMOSsNodePrime)); - - r1h2x = *(job->r1H2ptr + (here->VDMOSgNode)) - - *(job->r1H2ptr + (here->VDMOSsNodePrime)); - i1h2x = *(job->i1H2ptr + (here->VDMOSgNode)) - - *(job->i1H2ptr + (here->VDMOSsNodePrime)); - - r1h2y = *(job->r1H2ptr + (here->VDMOSdNodePrime)) - - *(job->r1H2ptr + (here->VDMOSsNodePrime)); - i1h2y = *(job->i1H2ptr + (here->VDMOSdNodePrime)) - - *(job->i1H2ptr + (here->VDMOSsNodePrime)); - - /* loading starts here */ - /* loading cdrain term */ - - temp = DFnF12(here->cdr_x2, - here->cdr_y2, - 0.0, - here->cdr_xy, - 0.0, - 0.0, - r1h1x, - i1h1x, - r1h1y, - i1h1y, - 0.0, - 0.0, - r1h2x, - i1h2x, - r1h2y, - i1h2y, - 0.0, - 0.0); - - itemp = DFiF12(here->cdr_x2, - here->cdr_y2, - 0.0, - here->cdr_xy, - 0.0, - 0.0, - r1h1x, - i1h1x, - r1h1y, - i1h1y, - 0.0, - 0.0, - r1h2x, - i1h2x, - r1h2y, - i1h2y, - 0.0, - 0.0); - - *(ckt->CKTrhs + (here->VDMOSdNodePrime)) -= temp; - *(ckt->CKTirhs + (here->VDMOSdNodePrime)) -= itemp; - *(ckt->CKTrhs + (here->VDMOSsNodePrime)) += temp; - *(ckt->CKTirhs + (here->VDMOSsNodePrime)) += itemp; - - /* cdrain term over */ - - /* loading capgs term */ - - temp = -ckt->CKTomega * - D1iF12(here->capgs2, - r1h1x, - i1h1x, - r1h2x, - i1h2x); - - itemp = ckt->CKTomega * - D1nF12(here->capgs2, - r1h1x, - i1h1x, - r1h2x, - i1h2x); - - *(ckt->CKTrhs + (here->VDMOSgNode)) -= temp; - *(ckt->CKTirhs + (here->VDMOSgNode)) -= itemp; - *(ckt->CKTrhs + (here->VDMOSsNodePrime)) += temp; - *(ckt->CKTirhs + (here->VDMOSsNodePrime)) += itemp; - - /* capgs over */ - - /* loading capgd term */ - - temp = -ckt->CKTomega * - D1iF12(here->capgd2, - r1h1x - r1h1y, - i1h1x - i1h1y, - r1h2x - r1h2y, - i1h2x - i1h2y); - - itemp = ckt->CKTomega * - D1nF12(here->capgd2, - r1h1x - r1h1y, - i1h1x - i1h1y, - r1h2x - r1h2y, - i1h2x - i1h2y); - - - *(ckt->CKTrhs + (here->VDMOSgNode)) -= temp; - *(ckt->CKTirhs + (here->VDMOSgNode)) -= itemp; - *(ckt->CKTrhs + (here->VDMOSdNodePrime)) += temp; - *(ckt->CKTirhs + (here->VDMOSdNodePrime)) += itemp; - - /* capgd over */ - /* all done */ - - break; - case D_F1MF2: - /* x = vgs, y = vds */ - - /* getting first order (linear) Volterra kernel */ - r1h1x = *(job->r1H1ptr + (here->VDMOSgNode)) - - *(job->r1H1ptr + (here->VDMOSsNodePrime)); - i1h1x = *(job->i1H1ptr + (here->VDMOSgNode)) - - *(job->i1H1ptr + (here->VDMOSsNodePrime)); - - r1h1y = *(job->r1H1ptr + (here->VDMOSdNodePrime)) - - *(job->r1H1ptr + (here->VDMOSsNodePrime)); - i1h1y = *(job->i1H1ptr + (here->VDMOSdNodePrime)) - - *(job->i1H1ptr + (here->VDMOSsNodePrime)); - - r1hm2x = *(job->r1H2ptr + (here->VDMOSgNode)) - - *(job->r1H2ptr + (here->VDMOSsNodePrime)); - i1hm2x = -(*(job->i1H2ptr + (here->VDMOSgNode)) - - *(job->i1H2ptr + (here->VDMOSsNodePrime))); - - r1hm2y = *(job->r1H2ptr + (here->VDMOSdNodePrime)) - - *(job->r1H2ptr + (here->VDMOSsNodePrime)); - i1hm2y = -(*(job->i1H2ptr + (here->VDMOSdNodePrime)) - - *(job->i1H2ptr + (here->VDMOSsNodePrime))); - - /* loading starts here */ - /* loading cdrain term */ - - temp = DFnF12(here->cdr_x2, - here->cdr_y2, - 0.0, - here->cdr_xy, - 0.0, - 0.0, - r1h1x, - i1h1x, - r1h1y, - i1h1y, - 0.0, - 0.0, - r1hm2x, - i1hm2x, - r1hm2y, - i1hm2y, - 0.0, - 0.0); - - itemp = DFiF12(here->cdr_x2, - here->cdr_y2, - 0.0, - here->cdr_xy, - 0.0, - 0.0, - r1h1x, - i1h1x, - r1h1y, - i1h1y, - 0.0, - 0.0, - r1hm2x, - i1hm2x, - r1hm2y, - i1hm2y, - 0.0, - 0.0); - - *(ckt->CKTrhs + (here->VDMOSdNodePrime)) -= temp; - *(ckt->CKTirhs + (here->VDMOSdNodePrime)) -= itemp; - *(ckt->CKTrhs + (here->VDMOSsNodePrime)) += temp; - *(ckt->CKTirhs + (here->VDMOSsNodePrime)) += itemp; - - /* cdrain term over */ - - /* loading capgs term */ - - temp = -ckt->CKTomega * - D1iF12(here->capgs2, - r1h1x, - i1h1x, - r1hm2x, - i1hm2x); - - itemp = ckt->CKTomega * - D1nF12(here->capgs2, - r1h1x, - i1h1x, - r1hm2x, - i1hm2x); - - *(ckt->CKTrhs + (here->VDMOSgNode)) -= temp; - *(ckt->CKTirhs + (here->VDMOSgNode)) -= itemp; - *(ckt->CKTrhs + (here->VDMOSsNodePrime)) += temp; - *(ckt->CKTirhs + (here->VDMOSsNodePrime)) += itemp; - - /* capgs over */ - - /* loading capgd term */ - - temp = -ckt->CKTomega * - D1iF12(here->capgd2, - r1h1x - r1h1y, - i1h1x - i1h1y, - r1hm2x - r1hm2y, - i1hm2x - i1hm2y); - - itemp = ckt->CKTomega * - D1nF12(here->capgd2, - r1h1x - r1h1y, - i1h1x - i1h1y, - r1hm2x - r1hm2y, - i1hm2x - i1hm2y); - - - *(ckt->CKTrhs + (here->VDMOSgNode)) -= temp; - *(ckt->CKTirhs + (here->VDMOSgNode)) -= itemp; - *(ckt->CKTrhs + (here->VDMOSdNodePrime)) += temp; - *(ckt->CKTirhs + (here->VDMOSdNodePrime)) += itemp; - - /* capgd over */ - /* all done */ - - break; - case D_2F1MF2: - /* x = vgs, y = vds */ - - /* getting first order (linear) Volterra kernel */ - r1h1x = *(job->r1H1ptr + (here->VDMOSgNode)) - - *(job->r1H1ptr + (here->VDMOSsNodePrime)); - i1h1x = *(job->i1H1ptr + (here->VDMOSgNode)) - - *(job->i1H1ptr + (here->VDMOSsNodePrime)); - - r1h1y = *(job->r1H1ptr + (here->VDMOSdNodePrime)) - - *(job->r1H1ptr + (here->VDMOSsNodePrime)); - i1h1y = *(job->i1H1ptr + (here->VDMOSdNodePrime)) - - *(job->i1H1ptr + (here->VDMOSsNodePrime)); - - r1hm2x = *(job->r1H2ptr + (here->VDMOSgNode)) - - *(job->r1H2ptr + (here->VDMOSsNodePrime)); - i1hm2x = -(*(job->i1H2ptr + (here->VDMOSgNode)) - - *(job->i1H2ptr + (here->VDMOSsNodePrime))); - - r1hm2y = *(job->r1H2ptr + (here->VDMOSdNodePrime)) - - *(job->r1H2ptr + (here->VDMOSsNodePrime)); - i1hm2y = -(*(job->i1H2ptr + (here->VDMOSdNodePrime)) - - *(job->i1H2ptr + (here->VDMOSsNodePrime))); - - r2h11x = *(job->r1H1ptr + (here->VDMOSgNode)) - - *(job->r1H1ptr + (here->VDMOSsNodePrime)); - i2h11x = *(job->i1H1ptr + (here->VDMOSgNode)) - - *(job->i1H1ptr + (here->VDMOSsNodePrime)); - - r2h11y = *(job->r1H1ptr + (here->VDMOSdNodePrime)) - - *(job->r1H1ptr + (here->VDMOSsNodePrime)); - i2h11y = *(job->i1H1ptr + (here->VDMOSdNodePrime)) - - *(job->i1H1ptr + (here->VDMOSsNodePrime)); - - r2h1m2x = *(job->r2H1m2ptr + (here->VDMOSgNode)) - - *(job->r2H1m2ptr + (here->VDMOSsNodePrime)); - i2h1m2x = *(job->i2H1m2ptr + (here->VDMOSgNode)) - - *(job->i2H1m2ptr + (here->VDMOSsNodePrime)); - - r2h1m2y = *(job->r2H1m2ptr + (here->VDMOSdNodePrime)) - - *(job->r2H1m2ptr + (here->VDMOSsNodePrime)); - i2h1m2y = *(job->i2H1m2ptr + (here->VDMOSdNodePrime)) - - *(job->i2H1m2ptr + (here->VDMOSsNodePrime)); - - /* loading starts here */ - /* loading cdrain term */ - - pass.cxx = here->cdr_x2; - pass.cyy = here->cdr_y2; - pass.czz = 0.0; - pass.cxy = here->cdr_xy; - pass.cyz = 0.0; - pass.cxz = 0.0; - pass.cxxx = here->cdr_x3; - pass.cyyy = here->cdr_y3; - pass.czzz = 0.0; - pass.cxxy = here->cdr_x2y; - pass.cxxz = 0.0; - pass.cxyy = here->cdr_xy2; - pass.cyyz = 0.0; - pass.cxzz = 0.0; - pass.cyzz = 0.0; - pass.cxyz = 0.0; - pass.r1h1x = r1h1x; - pass.i1h1x = i1h1x; - pass.r1h1y = r1h1y; - pass.i1h1y = i1h1y; - pass.r1h1z = 0.0; - pass.i1h1z = 0.0; - pass.r1h2x = r1hm2x; - pass.i1h2x = i1hm2x; - pass.r1h2y = r1hm2y; - pass.i1h2y = i1hm2y; - pass.r1h2z = 0.0; - pass.i1h2z = 0.0; - pass.r2h11x = r2h11x; - pass.i2h11x = i2h11x; - pass.r2h11y = r2h11y; - pass.i2h11y = i2h11y; - pass.r2h11z = 0.0; - pass.i2h11z = 0.0; - pass.h2f1f2x = r2h1m2x; - pass.ih2f1f2x = i2h1m2x; - pass.h2f1f2y = r2h1m2y; - pass.ih2f1f2y = i2h1m2y; - pass.h2f1f2z = 0.0; - pass.ih2f1f2z = 0.0; - temp = DFn2F12(&pass); - - itemp = DFi2F12(&pass); - - - *(ckt->CKTrhs + (here->VDMOSdNodePrime)) -= temp; - *(ckt->CKTirhs + (here->VDMOSdNodePrime)) -= itemp; - *(ckt->CKTrhs + (here->VDMOSsNodePrime)) += temp; - *(ckt->CKTirhs + (here->VDMOSsNodePrime)) += itemp; - - /* cdrain term over */ - - /* loading capgs term */ - - temp = -ckt->CKTomega * - D1i2F12(here->capgs2, - here->capgs3, - r1h1x, - i1h1x, - r1hm2x, - i1hm2x, - r2h11x, - i2h11x, - r2h1m2x, - i2h1m2x); - - itemp = ckt->CKTomega * - D1n2F12(here->capgs2, - here->capgs3, - r1h1x, - i1h1x, - r1hm2x, - i1hm2x, - r2h11x, - i2h11x, - r2h1m2x, - i2h1m2x); - - *(ckt->CKTrhs + (here->VDMOSgNode)) -= temp; - *(ckt->CKTirhs + (here->VDMOSgNode)) -= itemp; - *(ckt->CKTrhs + (here->VDMOSsNodePrime)) += temp; - *(ckt->CKTirhs + (here->VDMOSsNodePrime)) += itemp; - - /* capgs over */ - - /* loading capgd term */ - - temp = -ckt->CKTomega * - D1i2F12(here->capgd2, - here->capgd3, - r1h1x - r1h1y, - i1h1x - i1h1y, - r1hm2x - r1hm2y, - i1hm2x - i1hm2y, - r2h11x - r2h11y, - i2h11x - i2h11y, - r2h1m2x - r2h1m2y, - i2h1m2x - i2h1m2y); - - itemp = ckt->CKTomega * - D1n2F12(here->capgd2, - here->capgd3, - r1h1x - r1h1y, - i1h1x - i1h1y, - r1hm2x - r1hm2y, - i1hm2x - i1hm2y, - r2h11x - r2h11y, - i2h11x - i2h11y, - r2h1m2x - r2h1m2y, - i2h1m2x - i2h1m2y); - - - *(ckt->CKTrhs + (here->VDMOSgNode)) -= temp; - *(ckt->CKTirhs + (here->VDMOSgNode)) -= itemp; - *(ckt->CKTrhs + (here->VDMOSdNodePrime)) += temp; - *(ckt->CKTirhs + (here->VDMOSdNodePrime)) += itemp; - - /* capgd over */ - /* all done */ - - break; - default: - ; - } - } - } - return(OK); - } else - return(E_BADPARM); -} diff --git a/src/spicelib/devices/vdmos/vdmosdset.c b/src/spicelib/devices/vdmos/vdmosdset.c deleted file mode 100644 index af2378ed5..000000000 --- a/src/spicelib/devices/vdmos/vdmosdset.c +++ /dev/null @@ -1,250 +0,0 @@ -/********** -Copyright 1990 Regents of the University of California. All rights reserved. -Author: 1988 Jaijeet S Roychowdhury -**********/ - -#include "ngspice/ngspice.h" -#include "ngspice/cktdefs.h" -#include "ngspice/devdefs.h" -#include "vdmosdefs.h" -#include "ngspice/distodef.h" -#include "ngspice/const.h" -#include "ngspice/sperror.h" -#include "ngspice/suffix.h" - -int -VDMOSdSetup(GENmodel *inModel, CKTcircuit *ckt) - /* actually load the current value into the - * sparse matrix previously provided - */ -{ - VDMOSmodel *model = (VDMOSmodel *) inModel; - VDMOSinstance *here; - double Beta; - double OxideCap; - double gm; - double gds; - double vgst; - double vds; - double vdsat; - double vgd; - double vgs; - double gm2; - double gds2; - double gmds; - double gm3; - double gds3; - double gm2ds; - double gmds2; - double lcapgs2; - double lcapgs3; - double lcapgd2; - double lcapgd3; - - - /* loop through all the VDMOS device models */ - for( ; model != NULL; model = VDMOSnextModel(model)) { - /* loop through all the instances of the model */ - for (here = VDMOSinstances(model); here != NULL ; - here=VDMOSnextInstance(here)) { - - Beta = here->VDMOStTransconductance; - - OxideCap = model->VDMOSoxideCapFactor * here->VDMOSm; - - vgs = model->VDMOStype * ( - *(ckt->CKTrhsOld+here->VDMOSgNode) - - *(ckt->CKTrhsOld+here->VDMOSsNodePrime)); - vds = model->VDMOStype * ( - *(ckt->CKTrhsOld+here->VDMOSdNodePrime) - - *(ckt->CKTrhsOld+here->VDMOSsNodePrime)); - - /* now some common crunching for some more useful quantities */ - - vgd=vgs-vds; - - - /* now to determine whether the user was able to correctly - * identify the source and drain of his device - */ - if(vds >= 0) { - /* normal mode */ - here->VDMOSmode = 1; - } else { - /* inverse mode */ - here->VDMOSmode = -1; - } - - /* - * this block of code evaluates the drain current and its - * derivatives using the shichman-hodges model and the - * charges associated with the gate and channel for - * mosfets - * - */ - - /* the following variables are local to this code block until - * it is obvious that they can be made global - */ - { - double von = here->VDMOStVth * model->VDMOStype; - vgst = (here->VDMOSmode == 1 ? vgs : vgd) - von; - vdsat = MAX(vgst, 0); - double slope = model->VDMOSksubthres; - double lambda = model->VDMOSlambda; - double theta = model->VDMOStheta; - double shift = model->VDMOSsubshift; - double mtr = model->VDMOSmtr; - - /* scale vds with mtr (except with lambda) */ - double vdss = vds*mtr*here->VDMOSmode; - double t0 = 1 + lambda*vds; - double t1 = 1 + theta*vgs; - double betap = Beta*t0/t1; - double dbetapdvgs = -Beta*theta*t0/(t1*t1); - double dbetapdvds = Beta*lambda/t1; - - double t2 = exp((vgst-shift)/slope); - vgst = slope * log(1 + t2); - double dvgstdvgs = t2/(t2+1); - - if (vgst <= vdss) { - /* saturation region */ - gm = betap*vgst*dvgstdvgs + 0.5*dbetapdvgs*vgst*vgst; - gds = .5*dbetapdvds*vgst*vgst; - gm2 = betap; - gds2 = 0; - gmds = Beta*lambda*vgst; - gm3 = 0; - gds3 = 0; - gm2ds = Beta*lambda; - gmds2 = 0; - } - else { - /* linear region */ - gm = betap*vdss*dvgstdvgs + vdss*dbetapdvgs*(vgst-.5*vdss); - gds = vdss*dbetapdvds*(vgst-.5*vdss) + betap*mtr*(vgst-.5*vdss) - .5*vdss*betap*mtr; - gm2 = 0; - gds2 = 2*Beta * lambda*(vgst - vds*here->VDMOSmode) - betap; - gmds = Beta * lambda * vds * here->VDMOSmode + betap; - gm3=0; - gds3 = -Beta*lambda*3.; - gm2ds=0; - gmds2 = 2*lambda*Beta; - } - /* - * finished - */ - } /* code block */ - - - /* - * COMPUTE EQUIVALENT DRAIN CURRENT SOURCE - */ - /* - * meyer's capacitor model - */ - /* - * the meyer capacitance equations are in DEVqmeyer - * these expressions are derived from those equations. - * these expressions are incorrect; they assume just one - * controlling variable for each charge storage element - * while actually there are several; the VDMOS small - * signal ac linear model is also wrong because it - * ignores controlled capacitive elements. these can be - * corrected (as can the linear ss ac model) if the - * expressions for the charge are available - */ - - { - - double phi; - double cox; - double vddif; - double vddif1; - double vddif2; - /* von, vgst and vdsat have already been adjusted for - possible source-drain interchange */ - phi = here->VDMOStPhi; - cox = OxideCap; /*FIXME: using a guess for the oxide thickness of 1e-07 in vdmostemp.c */ - lcapgs2=lcapgs3=lcapgd2=lcapgd3=0; - if (vgst <= 0) { - lcapgs2 = cox/(3*phi); - } else { /* the VDMOSmodes are around because - vds has not been adjusted */ - if (vdsat <= here->VDMOSmode*vds) { - lcapgs2=lcapgs3=lcapgd2=lcapgd3=0; - } else { - vddif = 2.0*vdsat-here->VDMOSmode*vds; - vddif1 = vdsat-here->VDMOSmode*vds/*-1.0e-12*/; - vddif2 = vddif*vddif; - lcapgd2 = -vdsat*here->VDMOSmode*vds*cox/(3*vddif*vddif2); - lcapgd3 = - here->VDMOSmode*vds*cox*(vddif - 6*vdsat)/(9*vddif2*vddif2); - lcapgs2 = -vddif1*here->VDMOSmode*vds*cox/(3*vddif*vddif2); - lcapgs3 = - here->VDMOSmode*vds*cox*(vddif - 6*vddif1)/(9*vddif2*vddif2); - } - } - } - - /* - * process to get Taylor coefficients, taking into - * account type and mode. - */ - - if (here->VDMOSmode == 1) - { - /* normal mode - no source-drain interchange */ - - here->cdr_x2 = gm2; - here->cdr_y2 = gds2;; - here->cdr_xy = gmds; - here->cdr_x3 = gm3; - here->cdr_y3 = gds3; - here->cdr_x2y = gm2ds; - here->cdr_xy2 = gmds2; - - /* the gate caps have been divided and made into - Taylor coeffs., but not adjusted for type */ - - here->capgs2 = model->VDMOStype*lcapgs2; - here->capgs3 = lcapgs3; - here->capgd2 = model->VDMOStype*lcapgd2; - here->capgd3 = lcapgd3; - } else { - /* - * inverse mode - source and drain interchanged - */ - - here->cdr_x2 = -gm2; - here->cdr_y2 = -(gm2 + gds2 + 2*(gmds)); - here->cdr_xy = gm2 + gmds; - here->cdr_x3 = -gm3; - here->cdr_y3 = gm3 + gds3 + - 3*(gm2ds + gmds2) ; - here->cdr_x2y = gm3 + gm2ds; - here->cdr_xy2 = -(gm3 + 2*(gm2ds) + - gmds2); - - here->capgs2 = model->VDMOStype*lcapgd2; - here->capgs3 = lcapgd3; - - here->capgd2 = model->VDMOStype*lcapgs2; - here->capgd3 = lcapgs3; - - } - - /* now to adjust for type and multiply by factors to convert to Taylor coeffs. */ - - here->cdr_x2 = 0.5*model->VDMOStype*here->cdr_x2; - here->cdr_y2 = 0.5*model->VDMOStype*here->cdr_y2; - here->cdr_xy = model->VDMOStype*here->cdr_xy; - here->cdr_x3 = here->cdr_x3/6.; - here->cdr_y3 = here->cdr_y3/6.; - here->cdr_x2y = 0.5*here->cdr_x2y; - here->cdr_xy2 = 0.5*here->cdr_xy2; - - - } - } - return(OK); -} diff --git a/src/spicelib/devices/vdmos/vdmosext.h b/src/spicelib/devices/vdmos/vdmosext.h deleted file mode 100644 index 877768590..000000000 --- a/src/spicelib/devices/vdmos/vdmosext.h +++ /dev/null @@ -1,23 +0,0 @@ -/********** -Copyright 1990 Regents of the University of California. All rights reserved. -Author: 1985 Thomas L. Quarles -Modified: 2000 AlansFixes -**********/ - -extern int VDMOSacLoad(GENmodel *,CKTcircuit*); -extern int VDMOSask(CKTcircuit*,GENinstance*,int,IFvalue*,IFvalue*); -extern int VDMOSgetic(GENmodel*,CKTcircuit*); -extern int VDMOSload(GENmodel*,CKTcircuit*); -extern int VDMOSmAsk(CKTcircuit *,GENmodel *,int,IFvalue*); -extern int VDMOSmParam(int,IFvalue*,GENmodel*); -extern int VDMOSparam(int,IFvalue*,GENinstance*,IFvalue*); -extern int VDMOSpzLoad(GENmodel*,CKTcircuit*,SPcomplex*); -extern int VDMOSsetup(SMPmatrix*,GENmodel*,CKTcircuit*,int*); -extern int VDMOSunsetup(GENmodel*,CKTcircuit*); -extern int VDMOStemp(GENmodel*,CKTcircuit*); -extern int VDMOStrunc(GENmodel*,CKTcircuit*,double*); -extern int VDMOSconvTest(GENmodel*,CKTcircuit*); -extern int VDMOSdisto(int,GENmodel*,CKTcircuit*); -extern int VDMOSnoise(int,int,GENmodel*,CKTcircuit*,Ndata*,double*); -extern int VDMOSdSetup(GENmodel*,CKTcircuit*); -extern int VDMOSsoaCheck(CKTcircuit *, GENmodel *); diff --git a/src/spicelib/devices/vdmos/vdmosic.c b/src/spicelib/devices/vdmos/vdmosic.c deleted file mode 100644 index 326433fdc..000000000 --- a/src/spicelib/devices/vdmos/vdmosic.c +++ /dev/null @@ -1,41 +0,0 @@ -/********** -Copyright 1990 Regents of the University of California. All rights reserved. -Author: 1985 Thomas L. Quarles -**********/ -/* - */ - -#include "ngspice/ngspice.h" -#include "ngspice/cktdefs.h" -#include "vdmosdefs.h" -#include "ngspice/sperror.h" -#include "ngspice/suffix.h" - - -int -VDMOSgetic(GENmodel *inModel, CKTcircuit *ckt) -{ - VDMOSmodel *model = (VDMOSmodel *)inModel; - VDMOSinstance *here; - /* - * grab initial conditions out of rhs array. User specified, so use - * external nodes to get values - */ - - for( ; model ; model = VDMOSnextModel(model)) { - for(here = VDMOSinstances(model); here ; here = VDMOSnextInstance(here)) { - - if(!here->VDMOSicVDSGiven) { - here->VDMOSicVDS = - *(ckt->CKTrhs + here->VDMOSdNode) - - *(ckt->CKTrhs + here->VDMOSsNode); - } - if(!here->VDMOSicVGSGiven) { - here->VDMOSicVGS = - *(ckt->CKTrhs + here->VDMOSgNode) - - *(ckt->CKTrhs + here->VDMOSsNode); - } - } - } - return(OK); -} diff --git a/src/spicelib/devices/vdmos/vdmosinit.c b/src/spicelib/devices/vdmos/vdmosinit.c deleted file mode 100644 index e0499c659..000000000 --- a/src/spicelib/devices/vdmos/vdmosinit.c +++ /dev/null @@ -1,76 +0,0 @@ -#include "ngspice/config.h" - -#include "ngspice/devdefs.h" - -#include "vdmositf.h" -#include "vdmosext.h" -#include "vdmosinit.h" - - -SPICEdev VDMOSinfo = { - .DEVpublic = { - .name = "VDMOS", - .description = "DMOS model based on Level 1 MOSFET model", - .terms = &VDMOSnSize, - .numNames = &VDMOSnSize, - .termNames = VDMOSnames, - .numInstanceParms = &VDMOSpTSize, - .instanceParms = VDMOSpTable, - .numModelParms = &VDMOSmPTSize, - .modelParms = VDMOSmPTable, - .flags = DEV_DEFAULT, - -#ifdef XSPICE - .cm_func = NULL, - .num_conn = 0, - .conn = NULL, - .num_param = 0, - .param = NULL, - .num_inst_var = 0, - .inst_var = NULL, -#endif - }, - - .DEVparam = VDMOSparam, - .DEVmodParam = VDMOSmParam, - .DEVload = VDMOSload, - .DEVsetup = VDMOSsetup, - .DEVunsetup = VDMOSunsetup, - .DEVpzSetup = VDMOSsetup, - .DEVtemperature = VDMOStemp, - .DEVtrunc = VDMOStrunc, - .DEVfindBranch = NULL, - .DEVacLoad = VDMOSacLoad, - .DEVaccept = NULL, - .DEVdestroy = NULL, - .DEVmodDelete = NULL, - .DEVdelete = NULL, - .DEVsetic = VDMOSgetic, - .DEVask = VDMOSask, - .DEVmodAsk = VDMOSmAsk, - .DEVpzLoad = VDMOSpzLoad, - .DEVconvTest = VDMOSconvTest, - .DEVsenSetup = NULL, - .DEVsenLoad = NULL, - .DEVsenUpdate = NULL, - .DEVsenAcLoad = NULL, - .DEVsenPrint = NULL, - .DEVsenTrunc = NULL, - .DEVdisto = VDMOSdisto, - .DEVnoise = VDMOSnoise, - .DEVsoaCheck = VDMOSsoaCheck, - .DEVinstSize = &VDMOSiSize, - .DEVmodSize = &VDMOSmSize, - -#ifdef CIDER - .DEVdump = NULL, - .DEVacct = NULL, -#endif -}; - - -SPICEdev * -get_vdmos_info(void) -{ - return &VDMOSinfo; -} diff --git a/src/spicelib/devices/vdmos/vdmosinit.h b/src/spicelib/devices/vdmos/vdmosinit.h deleted file mode 100644 index 9329ebe60..000000000 --- a/src/spicelib/devices/vdmos/vdmosinit.h +++ /dev/null @@ -1,13 +0,0 @@ -#ifndef _VDMOSINIT_H -#define _VDMOSINIT_H - -extern IFparm VDMOSpTable[ ]; -extern IFparm VDMOSmPTable[ ]; -extern char *VDMOSnames[ ]; -extern int VDMOSpTSize; -extern int VDMOSmPTSize; -extern int VDMOSnSize; -extern int VDMOSiSize; -extern int VDMOSmSize; - -#endif diff --git a/src/spicelib/devices/vdmos/vdmositf.h b/src/spicelib/devices/vdmos/vdmositf.h deleted file mode 100644 index 77289a6f4..000000000 --- a/src/spicelib/devices/vdmos/vdmositf.h +++ /dev/null @@ -1,9 +0,0 @@ -/********** -Copyright 1990 Regents of the University of California. All rights reserved. -**********/ -#ifndef DEV_VDMOS -#define DEV_VDMOS - -extern SPICEdev *get_vdmos_info(void); - -#endif diff --git a/src/spicelib/devices/vdmos/vdmosload.c b/src/spicelib/devices/vdmos/vdmosload.c deleted file mode 100644 index 69fac79fd..000000000 --- a/src/spicelib/devices/vdmos/vdmosload.c +++ /dev/null @@ -1,929 +0,0 @@ -/********** -Copyright 1990 Regents of the University of California. All rights reserved. -Author: 1985 Thomas L. Quarles -Modified: 2000 AlansFixes -VDMOS: 2018 Holger Vogt, 2020 Dietmar Warning -**********/ - -#include "ngspice/ngspice.h" -#include "ngspice/cktdefs.h" -#include "ngspice/devdefs.h" -#include "vdmosdefs.h" -#include "ngspice/trandefs.h" -#include "ngspice/const.h" -#include "ngspice/sperror.h" -#include "ngspice/suffix.h" - -int -VDMOSload(GENmodel *inModel, CKTcircuit *ckt) -/* actually load the current value into the - * sparse matrix previously provided - */ -{ - VDMOSmodel *model = (VDMOSmodel *)inModel; - VDMOSinstance *here; - double Beta; - double arg; - double cdhat; - double cdrain; - double cdreq; - double ceq; - double ceqgd; - double ceqgs; - double delvds; - double delvgd; - double delvgs; - double gcgd; - double gcgs; - double geq; - double sarg; - double vds; - double vdsat; - double vgd1; - double vgd; - double vgdo; - double vgs1; - double vgs; - double von; - double vt; -#ifndef PREDICTOR - double xfact = 0.0; -#endif - int xnrm, xrev; - double capgs = 0.0; /* total gate-source capacitance */ - double capgd = 0.0; /* total gate-drain capacitance */ - double capth = 0.0; /* total thermal capacitance */ - int Check_th, Check_dio; - int error; - - int selfheat; - double rd0T, rd1T, dBeta_dT, dIds_dT; - double Vrd=0.0, dIth_dVrd=0.0, dIrd_dT=0.0; - double drd0T_dT, drd1T_dT, drd_dT, dgdrain_dT=0.0; - double dIrd_dgdrain; - double deldelTemp=0.0, delTemp, delTemp1, Temp, Vds, Vgs; - double ceqqth=0.0; - double GmT, gTtg, gTtdp, gTtt, gTtsp, gcTt=0.0; - - /* loop through all the VDMOS device models */ - for (; model != NULL; model = VDMOSnextModel(model)) { - /* VDMOS capacitance parameters */ - const double cgdmin = model->VDMOScgdmin; - const double cgdmax = model->VDMOScgdmax; - const double a = model->VDMOSa; - const double cgs = model->VDMOScgs; - - /* loop through all the instances of the model */ - for (here = VDMOSinstances(model); here != NULL; - here = VDMOSnextInstance(here)) { - - Temp = here->VDMOStemp; - selfheat = (here->VDMOSthermal) && (model->VDMOSrthjcGiven); - if (selfheat) - Check_th = 1; - else - Check_th = 0; - - /* first, we compute a few useful values - these could be - * pre-computed, but for historical reasons are still done - * here. They may be moved at the expense of instance size - */ - - if ((ckt->CKTmode & MODEINITSMSIG)) { - vgs = *(ckt->CKTstate0 + here->VDMOSvgs); - vds = *(ckt->CKTstate0 + here->VDMOSvds); - delTemp = *(ckt->CKTstate0 + here->VDMOSdelTemp); - } else if ((ckt->CKTmode & MODEINITTRAN)) { - vgs = *(ckt->CKTstate1 + here->VDMOSvgs); - vds = *(ckt->CKTstate1 + here->VDMOSvds); - delTemp = *(ckt->CKTstate1 + here->VDMOSdelTemp); - } else if ((ckt->CKTmode & MODEINITJCT) && !here->VDMOSoff) { - /* ok - not one of the simple cases, so we have to - * look at all of the possibilities for why we were - * called. We still just initialize the two voltages - */ - vds = model->VDMOStype * here->VDMOSicVDS; - vgs = model->VDMOStype * here->VDMOSicVGS; - delTemp = 0.0; - if ((vds == 0.0) && (vgs == 0.0) && - ((ckt->CKTmode & (MODETRAN | MODEAC|MODEDCOP | - MODEDCTRANCURVE)) || (!(ckt->CKTmode & MODEUIC)))) - { - vgs = model->VDMOStype * model->VDMOSvth0 + 0.1; - vds = 0.0; - } - } else if ((ckt->CKTmode & (MODEINITJCT | MODEINITFIX)) && (here->VDMOSoff)) { - vgs = vds = delTemp = 0.0; - - /* - * ok - now to do the start-up operations - * - * we must get values for vds and vgs from somewhere - * so we either predict them or recover them from last iteration - * These are the two most common cases - either a prediction - * step or the general iteration step and they - * share some code, so we put them first - others later on - */ - } - else - { -#ifndef PREDICTOR - if (ckt->CKTmode & MODEINITPRED) { - - /* predictor step */ - - xfact = ckt->CKTdelta / ckt->CKTdeltaOld[1]; - *(ckt->CKTstate0 + here->VDMOSvgs) = - *(ckt->CKTstate1 + here->VDMOSvgs); - vgs = (1 + xfact)* (*(ckt->CKTstate1 + here->VDMOSvgs)) - - (xfact * (*(ckt->CKTstate2 + here->VDMOSvgs))); - *(ckt->CKTstate0 + here->VDMOSvds) = - *(ckt->CKTstate1 + here->VDMOSvds); - vds = (1 + xfact)* (*(ckt->CKTstate1 + here->VDMOSvds)) - - (xfact * (*(ckt->CKTstate2 + here->VDMOSvds))); - *(ckt->CKTstate0 + here->VDMOSdelTemp) = - *(ckt->CKTstate1 + here->VDMOSdelTemp); - delTemp = (1 + xfact)* (*(ckt->CKTstate1 + here->VDMOSdelTemp)) - - (xfact * (*(ckt->CKTstate2 + here->VDMOSdelTemp))); - } - else - { -#endif /* PREDICTOR */ - - /* general iteration */ - - vgs = model->VDMOStype * ( - *(ckt->CKTrhsOld + here->VDMOSgNodePrime) - - *(ckt->CKTrhsOld + here->VDMOSsNodePrime)); - vds = model->VDMOStype * ( - *(ckt->CKTrhsOld + here->VDMOSdNodePrime) - - *(ckt->CKTrhsOld + here->VDMOSsNodePrime)); - if (selfheat) - delTemp = *(ckt->CKTrhsOld + here->VDMOStempNode); - else - delTemp = 0.0; -#ifndef PREDICTOR - } -#endif /* PREDICTOR */ - - /* now some common crunching for some more useful quantities */ - - vgd = vgs - vds; - vgdo = *(ckt->CKTstate0 + here->VDMOSvgs) - - *(ckt->CKTstate0 + here->VDMOSvds); - delvgs = vgs - *(ckt->CKTstate0 + here->VDMOSvgs); - delvds = vds - *(ckt->CKTstate0 + here->VDMOSvds); - delvgd = vgd - vgdo; - - deldelTemp = delTemp - *(ckt->CKTstate0 + here->VDMOSdelTemp); - - /* these are needed for convergence testing */ - - if (here->VDMOSmode >= 0) { - cdhat = - here->VDMOScd - + here->VDMOSgm * delvgs - + here->VDMOSgds * delvds - + here->VDMOSgmT * deldelTemp; - } else { - cdhat = - here->VDMOScd - - here->VDMOSgm * delvgd - + here->VDMOSgds * delvds - + here->VDMOSgmT * deldelTemp; - } - -#ifndef NOBYPASS - /* now lets see if we can bypass (ugh) */ - if ((!(ckt->CKTmode & MODEINITPRED)) && - (ckt->CKTbypass) && - (fabs(delvgs) < (ckt->CKTreltol * - MAX(fabs(vgs), - fabs(*(ckt->CKTstate0 + - here->VDMOSvgs))) + - ckt->CKTvoltTol)) && - (fabs(delvds) < (ckt->CKTreltol * - MAX(fabs(vds), - fabs(*(ckt->CKTstate0 + - here->VDMOSvds))) + - ckt->CKTvoltTol)) && - (fabs(cdhat - here->VDMOScd) < (ckt->CKTreltol * - MAX(fabs(cdhat), - fabs(here->VDMOScd)) + - ckt->CKTabstol)) && - ((here->VDMOStempNode == 0) || - (fabs(deldelTemp) < (ckt->CKTreltol * MAX(fabs(delTemp), - fabs(*(ckt->CKTstate0+here->VDMOSdelTemp))) - + ckt->CKTvoltTol*1e4)))) - { - /* bypass code */ - /* nothing interesting has changed since last - * iteration on this device, so we just - * copy all the values computed last iteration out - * and keep going - */ - vgs = *(ckt->CKTstate0 + here->VDMOSvgs); - vds = *(ckt->CKTstate0 + here->VDMOSvds); - vgd = vgs - vds; - delTemp = *(ckt->CKTstate0 + here->VDMOSdelTemp); - /* calculate Vds for temperature conductance calculation - in bypass (used later when filling Temp node matrix) */ - cdrain = here->VDMOSmode * (here->VDMOScd); - if (ckt->CKTmode & (MODETRAN | MODETRANOP)) { - capgs = (*(ckt->CKTstate0 + here->VDMOScapgs) + - *(ckt->CKTstate1 + here->VDMOScapgs)); - capgd = (*(ckt->CKTstate0 + here->VDMOScapgd) + - *(ckt->CKTstate1 + here->VDMOScapgd)); - capth = (*(ckt->CKTstate0 + here->VDMOScapth) + - *(ckt->CKTstate1 + here->VDMOScapth)); - } - goto bypass; - } -#endif /*NOBYPASS*/ - - /* ok - bypass is out, do it the hard way */ - - von = model->VDMOStype * here->VDMOSvon; - -#ifndef NODELIMITING - /* - * limiting - * we want to keep device voltages from changing - * so fast that the exponentials churn out overflows - * and similar rudeness - */ - - if (*(ckt->CKTstate0 + here->VDMOSvds) >= 0) { - vgs = DEVfetlim(vgs, *(ckt->CKTstate0 + here->VDMOSvgs) - , von); - vds = vgs - vgd; - vds = DEVlimvds(vds, *(ckt->CKTstate0 + here->VDMOSvds)); - } else { - vgd = DEVfetlim(vgd, vgdo, von); - vds = vgs - vgd; - if (!(ckt->CKTfixLimit)) { - vds = -DEVlimvds(-vds, -(*(ckt->CKTstate0 + - here->VDMOSvds))); - } - vgs = vgd + vds; - } - if (selfheat) - delTemp = DEVlimitlog(delTemp, - *(ckt->CKTstate0 + here->VDMOSdelTemp),30,&Check_th); - else - delTemp = 0.0; -#endif /*NODELIMITING*/ - - } - - if (selfheat) { - Temp = here->VDMOStemp + delTemp; - VDMOStempUpdate(model, here, Temp, ckt); - } else { - Temp = here->VDMOStemp; - } - here->VDMOSTempSH = Temp; /* added for portability of SH Temp for noise analysis */ - - /* Calculate temperature dependent values for self-heating effect */ - if (selfheat) { - double TempRatio = Temp / here->VDMOStemp; - Beta = here->VDMOStTransconductance * pow(TempRatio,model->VDMOSmu); - dBeta_dT = Beta * model->VDMOSmu / Temp; - rd0T = here->VDMOSdrainResistance * pow(TempRatio, model->VDMOStexp0); - drd0T_dT = rd0T * model->VDMOStexp0 / Temp; - rd1T = 0.0; - drd1T_dT = 0.0; - if (model->VDMOSqsGiven) { - rd1T = here->VDMOSqsResistance * pow(TempRatio, model->VDMOStexp1); - drd1T_dT = rd1T * model->VDMOStexp1 / Temp; - } - } else { - Beta = here->VDMOStTransconductance; - dBeta_dT = 0.0; - rd0T = here->VDMOSdrainResistance; - drd0T_dT = 0.0; - rd1T = 0.0; - drd1T_dT = 0.0; - if (model->VDMOSqsGiven) - rd1T = here->VDMOSqsResistance; - } - - /* - * now all the preliminaries are over - we can start doing the - * real work - */ - vgd = vgs - vds; - - /* now to determine whether the user was able to correctly - * identify the source and drain of his device - */ - if (vds >= 0) { - /* normal mode */ - here->VDMOSmode = 1; - Vds = vds; - Vgs = vgs; - } else { - /* inverse mode */ - here->VDMOSmode = -1; - Vds = -vds; - Vgs = vgd; - } - - { - /* - * this block of code evaluates the drain current and its - * derivatives using the shichman-hodges model and the - * charges associated with the gate and channel for - * mosfets - * - */ - - von = here->VDMOStVth * model->VDMOStype; - double vgst = (here->VDMOSmode == 1 ? vgs : vgd) - von; - vdsat = MAX(vgst, 0); - /* Simple weak inversion model, according to https://www.anasoft.co.uk/MOS1Model.htm - * Scale the voltage overdrive vgst logarithmically in weak inversion. - * Best fits LTSPICE curves with shift=0 - */ - double slope = here->VDMOStksubthres; - double lambda = model->VDMOSlambda; - double theta = model->VDMOStheta; - double shift = model->VDMOSsubshift; - double mtr = model->VDMOSmtr; - - /* scale vds with mtr (except with lambda) */ - double vdss = vds*mtr*here->VDMOSmode; - double t0 = 1 + lambda*vds; - double t1 = 1 + theta*vgs; - double betap = Beta*t0/t1; - double dbetapdvgs = -Beta*theta*t0/(t1*t1); - double dbetapdvds = Beta*lambda/t1; - double dbetapdT = dBeta_dT*t0/t1; - - double t2 = exp((vgst-shift)/slope); - vgst = slope * log(1 + t2); - double dvgstdvgs = t2/(t2+1); - - if (vgst <= vdss) { - /* saturation region */ - cdrain = betap * vgst*vgst * .5; - here->VDMOSgm = betap*vgst*dvgstdvgs + 0.5*dbetapdvgs*vgst*vgst; - here->VDMOSgds = .5*dbetapdvds*vgst*vgst; - dIds_dT = dbetapdT * vgst*vgst * .5; - } - else { - /* linear region */ - cdrain = betap * vdss * (vgst - .5 * vdss); - here->VDMOSgm = betap*vdss*dvgstdvgs + vdss*dbetapdvgs*(vgst-.5*vdss); - here->VDMOSgds = vdss*dbetapdvds*(vgst-.5*vdss) + betap*mtr*(vgst-.5*vdss) - .5*vdss*betap*mtr; - dIds_dT = dbetapdT * vdss * (vgst - .5 * vdss); - } - } - - - /* now deal with n vs p polarity */ - - here->VDMOSvon = model->VDMOStype * von; - here->VDMOSvdsat = model->VDMOStype * vdsat; - - /* - * COMPUTE EQUIVALENT DRAIN CURRENT SOURCE - */ - here->VDMOScd = here->VDMOSmode * cdrain; - - /* save things away for next time */ - - *(ckt->CKTstate0 + here->VDMOSvgs) = vgs; - *(ckt->CKTstate0 + here->VDMOSvds) = vds; - *(ckt->CKTstate0 + here->VDMOSdelTemp) = delTemp; - - /* quasi saturation - * according to Vincenzo d'Alessandro's Quasi-Saturation Model, simplified: - V. D'Alessandro, F. Frisina, N. Rinaldi: A New SPICE Model of VDMOS Transistors - Including Thermal and Quasi-saturation Effects, 9th European Conference on Power - Electronics and applications (EPE), Graz, Austria, August 2001, pp. P.1 − P.10. - */ - if (model->VDMOSqsGiven && (here->VDMOSmode == 1)) { - double vdsn = model->VDMOStype * ( - *(ckt->CKTrhsOld + here->VDMOSdNode) - - *(ckt->CKTrhsOld + here->VDMOSsNode)); - double rd = rd0T + rd1T * (vdsn / (vdsn + fabs(model->VDMOSqsVoltage))); - drd_dT = drd0T_dT + drd1T_dT * (vdsn / (vdsn + fabs(model->VDMOSqsVoltage))); - if (rd > 0) { - here->VDMOSdrainConductance = 1 / rd + ckt->CKTgmin; - dgdrain_dT = -drd_dT / (rd*rd); - } else { - here->VDMOSdrainConductance = 1 / rd0T; - dgdrain_dT = -drd0T_dT / (rd0T*rd0T); - } - } else { - if (rd0T > 0) { - here->VDMOSdrainConductance = 1 / rd0T; - dgdrain_dT = -drd0T_dT / (rd0T*rd0T); - } - } - - if (selfheat) { - GmT = dIds_dT; - here->VDMOSgmT = GmT; - } else { - GmT = 0.0; - here->VDMOSgmT = 0.0; - } - - if (selfheat) { - /* power flows from ground into the temperature node. */ - here->VDMOSgtempg = model->VDMOStype*here->VDMOSgm * Vds; - here->VDMOSgtempT = GmT * Vds; - here->VDMOSgtempd = model->VDMOStype* (here->VDMOSgds * Vds + cdrain); - here->VDMOScth = cdrain * Vds - - model->VDMOStype * (here->VDMOSgtempg * Vgs + here->VDMOSgtempd * Vds) - - here->VDMOSgtempT * delTemp; - - Vrd = *(ckt->CKTrhsOld + here->VDMOSdNode) - *(ckt->CKTrhsOld + here->VDMOSdNodePrime); - dIth_dVrd = here->VDMOSdrainConductance * Vrd; - dIrd_dgdrain = Vrd; - dIrd_dT = dIrd_dgdrain * dgdrain_dT; - here->VDMOScth += here->VDMOSdrainConductance * Vrd*Vrd - dIth_dVrd*Vrd - dIrd_dT*Vrd*delTemp; - } - - /* - * vdmos capacitor model - */ - if (ckt->CKTmode & (MODETRAN | MODETRANOP | MODEINITSMSIG)) { - /* - * calculate gate - drain, gate - source capacitors - * drain-source capacitor is evaluated with the body diode below - */ - /* - * this just evaluates at the current time, - * expects you to remember values from previous time - * returns 1/2 of non-constant portion of capacitance - * you must add in the other half from previous time - * and the constant part - */ - DevCapVDMOS(vgd, cgdmin, cgdmax, a, cgs, - (ckt->CKTstate0 + here->VDMOScapgs), - (ckt->CKTstate0 + here->VDMOScapgd)); - *(ckt->CKTstate0 + here->VDMOScapth) = model->VDMOScthj; /* always constant */ - - vgs1 = *(ckt->CKTstate1 + here->VDMOSvgs); - vgd1 = vgs1 - *(ckt->CKTstate1 + here->VDMOSvds); - delTemp1 = *(ckt->CKTstate1 + here->VDMOSdelTemp); - if (ckt->CKTmode & (MODETRANOP | MODEINITSMSIG)) { - capgs = 2 * *(ckt->CKTstate0 + here->VDMOScapgs); - capgd = 2 * *(ckt->CKTstate0 + here->VDMOScapgd); - capth = 2 * *(ckt->CKTstate0 + here->VDMOScapth); - } else { - capgs = (*(ckt->CKTstate0 + here->VDMOScapgs) + - *(ckt->CKTstate1 + here->VDMOScapgs)); - capgd = (*(ckt->CKTstate0 + here->VDMOScapgd) + - *(ckt->CKTstate1 + here->VDMOScapgd)); - capth = (*(ckt->CKTstate0 + here->VDMOScapth) + - *(ckt->CKTstate1 + here->VDMOScapth)); - } - -#ifndef PREDICTOR - if (ckt->CKTmode & (MODEINITPRED | MODEINITTRAN)) { - *(ckt->CKTstate0 + here->VDMOSqgs) = - (1 + xfact) * *(ckt->CKTstate1 + here->VDMOSqgs) - - xfact * *(ckt->CKTstate2 + here->VDMOSqgs); - *(ckt->CKTstate0 + here->VDMOSqgd) = - (1 + xfact) * *(ckt->CKTstate1 + here->VDMOSqgd) - - xfact * *(ckt->CKTstate2 + here->VDMOSqgd); - *(ckt->CKTstate0 + here->VDMOSqth) = - (1 + xfact) * *(ckt->CKTstate1 + here->VDMOSqth) - - xfact * *(ckt->CKTstate2 + here->VDMOSqth); - } else { -#endif /*PREDICTOR*/ - if (ckt->CKTmode & MODETRAN) { - *(ckt->CKTstate0 + here->VDMOSqgs) = (vgs - vgs1)*capgs + - *(ckt->CKTstate1 + here->VDMOSqgs); - *(ckt->CKTstate0 + here->VDMOSqgd) = (vgd - vgd1)*capgd + - *(ckt->CKTstate1 + here->VDMOSqgd); - *(ckt->CKTstate0 + here->VDMOSqth) = (delTemp-delTemp1)*capth + - *(ckt->CKTstate1 + here->VDMOSqth); - } else { - /* TRANOP only */ - *(ckt->CKTstate0 + here->VDMOSqgs) = vgs*capgs; - *(ckt->CKTstate0 + here->VDMOSqgd) = vgd*capgd; - *(ckt->CKTstate0 + here->VDMOSqth) = delTemp*capth; - } -#ifndef PREDICTOR - } -#endif /*PREDICTOR*/ - } -#ifndef NOBYPASS -bypass: -#endif - if ((ckt->CKTmode & (MODEINITTRAN)) || - (!(ckt->CKTmode & (MODETRAN)))) { - /* - * initialize to zero charge conductances - * and current - */ - gcgs = 0; - ceqgs = 0; - gcgd = 0; - ceqgd = 0; - gcTt = 0.0; - ceqqth = 0.0; - } else { - if (capgs == 0) *(ckt->CKTstate0 + here->VDMOScqgs) = 0; - if (capgd == 0) *(ckt->CKTstate0 + here->VDMOScqgd) = 0; - if (capth == 0) *(ckt->CKTstate0 + here->VDMOScqth) = 0; - /* - * calculate equivalent conductances and currents for - * vdmos capacitors - */ - error = NIintegrate(ckt, &gcgs, &ceqgs, capgs, here->VDMOSqgs); - if (error) return(error); - error = NIintegrate(ckt, &gcgd, &ceqgd, capgd, here->VDMOSqgd); - if (error) return(error); - ceqgs = ceqgs - gcgs*vgs + ckt->CKTag[0] * - *(ckt->CKTstate0 + here->VDMOSqgs); - ceqgd = ceqgd - gcgd*vgd + ckt->CKTag[0] * - *(ckt->CKTstate0 + here->VDMOSqgd); - if (selfheat) - { - error = NIintegrate(ckt, &gcTt, &ceqqth, capth, here->VDMOSqth); - if (error) return(error); - ceqqth = ceqqth - gcTt*delTemp + ckt->CKTag[0] * - *(ckt->CKTstate0 + here->VDMOSqth); - } - } - - /* - * load current vector - */ - - if (selfheat) { - if (here->VDMOSmode >= 0) { - GmT = model->VDMOStype * here->VDMOSgmT; - gTtg = here->VDMOSgtempg; - gTtdp = here->VDMOSgtempd; - gTtt = here->VDMOSgtempT; - gTtsp = - (gTtg + gTtdp); - } else { - GmT = -model->VDMOStype * here->VDMOSgmT; - gTtg = here->VDMOSgtempg; - gTtsp = here->VDMOSgtempd; - gTtt = here->VDMOSgtempT; - gTtdp = - (gTtg + gTtsp); - } - } else { - GmT = 0.0; - gTtg = 0.0; - gTtdp = 0.0; - gTtt = 0.0; - gTtsp = 0.0; - } - - if (here->VDMOSmode >= 0) { - xnrm = 1; - xrev = 0; - cdreq = model->VDMOStype*(cdrain - here->VDMOSgds*vds - - here->VDMOSgm*vgs); - } else { - xnrm = 0; - xrev = 1; - cdreq = -(model->VDMOStype)*(cdrain - here->VDMOSgds*(-vds) - - here->VDMOSgm*vgd); - } - - *(ckt->CKTrhs + here->VDMOSgNodePrime) -= (model->VDMOStype * (ceqgs + ceqgd)); - *(ckt->CKTrhs + here->VDMOSdNodePrime) += (-cdreq + model->VDMOStype * ceqgd); - *(ckt->CKTrhs + here->VDMOSsNodePrime) += cdreq + model->VDMOStype * ceqgs; - if (selfheat) { - *(ckt->CKTrhs + here->VDMOSdNode) += dIrd_dT * delTemp; - *(ckt->CKTrhs + here->VDMOSdNodePrime) += GmT * delTemp - dIrd_dT * delTemp; - *(ckt->CKTrhs + here->VDMOSsNodePrime) += -GmT * delTemp; - *(ckt->CKTrhs + here->VDMOStempNode) += here->VDMOScth - ceqqth; - double vCktTemp = (ckt->CKTtemp-CONSTCtoK); /* ckt temperature */ - if (ckt->CKTmode & MODETRANOP) - vCktTemp *= ckt->CKTsrcFact; - *(ckt->CKTrhs + here->VDMOSvcktTbranch)+= vCktTemp; - } - - /* - * load y matrix - */ - *(here->VDMOSDdPtr) += (here->VDMOSdrainConductance + here->VDMOSdsConductance); - *(here->VDMOSGgPtr) += (here->VDMOSgateConductance); - *(here->VDMOSSsPtr) += (here->VDMOSsourceConductance + here->VDMOSdsConductance); - *(here->VDMOSDPdpPtr) += - (here->VDMOSdrainConductance + here->VDMOSgds + - xrev*(here->VDMOSgm) + gcgd); - *(here->VDMOSSPspPtr) += - (here->VDMOSsourceConductance + here->VDMOSgds + - xnrm*(here->VDMOSgm) + gcgs); - *(here->VDMOSGPgpPtr) += - (here->VDMOSgateConductance) + (gcgd + gcgs); - *(here->VDMOSGgpPtr) += (-here->VDMOSgateConductance); - *(here->VDMOSDdpPtr) += (-here->VDMOSdrainConductance); - *(here->VDMOSGPgPtr) += (-here->VDMOSgateConductance); - *(here->VDMOSGPdpPtr) -= gcgd; - *(here->VDMOSGPspPtr) -= gcgs; - *(here->VDMOSSspPtr) += (-here->VDMOSsourceConductance); - *(here->VDMOSDPdPtr) += (-here->VDMOSdrainConductance); - *(here->VDMOSDPgpPtr) += ((xnrm - xrev)*here->VDMOSgm - gcgd); - *(here->VDMOSDPspPtr) += (-here->VDMOSgds - xnrm* - (here->VDMOSgm)); - *(here->VDMOSSPgpPtr) += (-(xnrm - xrev)*here->VDMOSgm - gcgs); - *(here->VDMOSSPsPtr) += (-here->VDMOSsourceConductance); - *(here->VDMOSSPdpPtr) += (-here->VDMOSgds - xrev* - (here->VDMOSgm)); - - *(here->VDMOSDsPtr) += (-here->VDMOSdsConductance); - *(here->VDMOSSdPtr) += (-here->VDMOSdsConductance); - - if (selfheat) - { - - (*(here->VDMOSDtempPtr) += dIrd_dT); - (*(here->VDMOSDPtempPtr) += GmT - dIrd_dT); - (*(here->VDMOSSPtempPtr) += -GmT); - (*(here->VDMOSGPtempPtr) += 0.0); - (*(here->VDMOSTemptempPtr) += -gTtt - dIrd_dT*Vrd + 1/model->VDMOSrthjc + gcTt); - (*(here->VDMOSTempgpPtr) += -gTtg); - (*(here->VDMOSTempdPtr) += -dIth_dVrd); - (*(here->VDMOSTempdpPtr) += -gTtdp + dIth_dVrd); - (*(here->VDMOSTempspPtr) += -gTtsp); - (*(here->VDMOSTemptcasePtr) += -1/model->VDMOSrthjc); - (*(here->VDMOSTcasetempPtr) += -1/model->VDMOSrthjc); - (*(here->VDMOSTcasetcasePtr) += 1/model->VDMOSrthjc + 1/model->VDMOSrthca); - (*(here->VDMOSTptpPtr) += 1/model->VDMOSrthca); - (*(here->VDMOSTptcasePtr) += -1/model->VDMOSrthca); - (*(here->VDMOSTcasetpPtr) += -1/model->VDMOSrthca); - (*(here->VDMOSCktTtpPtr) += 1.0); - (*(here->VDMOSTpcktTPtr) += 1.0); - } - - /* body diode model - * Delivers reverse conduction and forward breakdown - * of VDMOS transistor - */ - double vd, cd; - double vte; - double vtebrk, vbrknp; - double cdb, cdeq; - double capd; - double gd, gdb, gspr; - double delvd; /* change in diode voltage temporary */ - double evrev; - double Ith=0.0, dIth_dT=0.0; - double dIdio_dT=0.0, dIth_dVdio=0.0; - double vrs=0.0, dIrs_dT=0.0, dIth_dVrs=0.0; - -#ifndef NOBYPASS - double tol; /* temporary for tolerance calculations */ -#endif - - gspr = here->VDIOtConductance; - - vt = CONSTKoverQ * Temp; - vte = model->VDIOn * vt; - vtebrk = model->VDIObrkdEmissionCoeff * vt; - vbrknp = here->VDIOtBrkdwnV; - - Check_dio = 1; - if (ckt->CKTmode & MODEINITSMSIG) { - vd = *(ckt->CKTstate0 + here->VDIOvoltage); - } else if (ckt->CKTmode & MODEINITTRAN) { - vd = *(ckt->CKTstate1 + here->VDIOvoltage); - } else if ((ckt->CKTmode & MODEINITJCT) && - (ckt->CKTmode & MODETRANOP) && (ckt->CKTmode & MODEUIC)) { - vd = here->VDIOinitCond; - } else if (ckt->CKTmode & MODEINITJCT) { - vd = here->VDIOtVcrit; - } else { -#ifndef PREDICTOR - if (ckt->CKTmode & MODEINITPRED) { - *(ckt->CKTstate0 + here->VDIOvoltage) = - *(ckt->CKTstate1 + here->VDIOvoltage); - vd = DEVpred(ckt, here->VDIOvoltage); - *(ckt->CKTstate0 + here->VDIOcurrent) = - *(ckt->CKTstate1 + here->VDIOcurrent); - *(ckt->CKTstate0 + here->VDIOconduct) = - *(ckt->CKTstate1 + here->VDIOconduct); - *(ckt->CKTstate0 + here->VDIOdIdio_dT) = - *(ckt->CKTstate1 + here->VDIOdIdio_dT); - } else { -#endif /* PREDICTOR */ - vd = model->VDMOStype * (*(ckt->CKTrhsOld + here->VDIOposPrimeNode) - - *(ckt->CKTrhsOld + here->VDMOSdNode)); -#ifndef PREDICTOR - } -#endif /* PREDICTOR */ - delvd = vd - *(ckt->CKTstate0 + here->VDIOvoltage); - cdhat = *(ckt->CKTstate0 + here->VDIOcurrent) + - *(ckt->CKTstate0 + here->VDIOconduct) * delvd + - *(ckt->CKTstate0 + here->VDIOdIdio_dT) * deldelTemp; - /* - * bypass if solution has not changed - */ -#ifndef NOBYPASS - if ((!(ckt->CKTmode & MODEINITPRED)) && (ckt->CKTbypass)) { - tol = ckt->CKTvoltTol + ckt->CKTreltol* - MAX(fabs(vd), fabs(*(ckt->CKTstate0 + here->VDIOvoltage))); - if (fabs(delvd) < tol) { - tol = ckt->CKTreltol* MAX(fabs(cdhat), - fabs(*(ckt->CKTstate0 + here->VDIOcurrent))) + - ckt->CKTabstol; - if (fabs(cdhat - *(ckt->CKTstate0 + here->VDIOcurrent)) - < tol) { - if ((here->VDMOStempNode == 0) || - (fabs(deldelTemp) < (ckt->CKTreltol * MAX(fabs(delTemp), - fabs(*(ckt->CKTstate0+here->VDMOSdelTemp)))+ - ckt->CKTvoltTol*1e4))) { - vd = *(ckt->CKTstate0 + here->VDIOvoltage); - cd = *(ckt->CKTstate0 + here->VDIOcurrent); - gd = *(ckt->CKTstate0 + here->VDIOconduct); - dIdio_dT= *(ckt->CKTstate0 + here->VDIOdIdio_dT); - goto load; - } - } - } - } -#endif /* NOBYPASS */ - /* - * limit new junction voltage - */ - if ((model->VDIObvGiven) && - (vd < MIN(0, -vbrknp + 10 * vtebrk))) { - double vdtemp; - vdtemp = -(vd + vbrknp); - vdtemp = DEVpnjlim(vdtemp, - -(*(ckt->CKTstate0 + here->VDIOvoltage) + - vbrknp), vtebrk, - here->VDIOtVcrit, &Check_dio); - vd = -(vdtemp + vbrknp); - } else { - vd = DEVpnjlim(vd, *(ckt->CKTstate0 + here->VDIOvoltage), - vte, here->VDIOtVcrit, &Check_dio); - } - } - - /* - * compute dc current and derivatives - */ - if (vd >= -3 * vte) { /* forward current */ - double evd; - - evd = exp(vd / vte); - cdb = here->VDIOtSatCur*(evd - 1); - dIdio_dT = here->VDIOtSatCur_dT * (evd - 1) - here->VDIOtSatCur * vd * evd / (vte * Temp); - gdb = here->VDIOtSatCur*evd / vte; - - } else if ((!(model->VDIObvGiven)) || - vd >= -vbrknp) { /* reverse */ - double arg3, darg3_dT; - - arg = 3 * vte / (vd*CONSTe); - arg3 = arg * arg * arg; - darg3_dT = 3 * arg3 / Temp; - cdb = -here->VDIOtSatCur*(1 + arg3); - dIdio_dT = -here->VDIOtSatCur_dT * (arg3 + 1) - here->VDIOtSatCur * darg3_dT; - gdb = here->VDIOtSatCur * 3 * arg / vd; - - } else { /* breakdown */ - - evrev = exp(-(vbrknp + vd) / vtebrk); - cdb = -here->VDIOtSatCur*evrev; - dIdio_dT = here->VDIOtSatCur * (-vbrknp-vd) * evrev / vtebrk / Temp - here->VDIOtSatCur_dT * evrev; - gdb = here->VDIOtSatCur*evrev / vtebrk; - - } - - cd = cdb + ckt->CKTgmin*vd; - gd = gdb + ckt->CKTgmin; - - if ((ckt->CKTmode & (MODEDCTRANCURVE | MODETRAN | MODEAC | MODEINITSMSIG)) || - ((ckt->CKTmode & MODETRANOP) && (ckt->CKTmode & MODEUIC))) { - /* - * charge storage elements - */ - double czero, diffcharge, deplcharge, diffcap, deplcap; - czero = here->VDIOtJctCap; - if (vd < here->VDIOtDepCap) { - arg = 1 - vd / here->VDIOtJctPot; - sarg = exp(-here->VDIOtGradingCoeff*log(arg)); - deplcharge = here->VDIOtJctPot*czero*(1 - arg*sarg) / (1 - here->VDIOtGradingCoeff); - deplcap = czero*sarg; - } else { - double czof2; - czof2 = czero / here->VDIOtF2; - deplcharge = czero*here->VDIOtF1 + czof2*(here->VDIOtF3*(vd - here->VDIOtDepCap) + - (here->VDIOtGradingCoeff / (here->VDIOtJctPot + here->VDIOtJctPot))*(vd*vd - here->VDIOtDepCap*here->VDIOtDepCap)); - deplcap = czof2*(here->VDIOtF3 + here->VDIOtGradingCoeff*vd / here->VDIOtJctPot); - } - diffcharge = here->VDIOtTransitTime*cdb; - *(ckt->CKTstate0 + here->VDIOcapCharge) = - diffcharge + deplcharge; - - diffcap = here->VDIOtTransitTime*gdb; - capd = diffcap + deplcap; - - here->VDIOcap = capd; - - /* - * store small-signal parameters - */ - if ((!(ckt->CKTmode & MODETRANOP)) || - (!(ckt->CKTmode & MODEUIC))) { - if (ckt->CKTmode & MODEINITSMSIG) { - *(ckt->CKTstate0 + here->VDIOcapCurrent) = capd; - - continue; - } - - /* - * transient analysis - */ - - if (ckt->CKTmode & MODEINITTRAN) { - *(ckt->CKTstate1 + here->VDIOcapCharge) = - *(ckt->CKTstate0 + here->VDIOcapCharge); - } - error = NIintegrate(ckt, &geq, &ceq, capd, here->VDIOcapCharge); - if (error) return(error); - gd = gd + geq; - cd = cd + *(ckt->CKTstate0 + here->VDIOcapCurrent); - if (ckt->CKTmode & MODEINITTRAN) { - *(ckt->CKTstate1 + here->VDIOcapCurrent) = - *(ckt->CKTstate0 + here->VDIOcapCurrent); - } - } - } - - /* - * check convergence - */ - - if ((Check_th == 1) || (Check_dio == 1)) { - ckt->CKTnoncon++; - ckt->CKTtroubleElt = (GENinstance *) here; - } - - *(ckt->CKTstate0 + here->VDIOvoltage) = vd; - *(ckt->CKTstate0 + here->VDIOcurrent) = cd; - *(ckt->CKTstate0 + here->VDIOconduct) = gd; - *(ckt->CKTstate0 + here->VDIOdIdio_dT) = dIdio_dT; - -#ifndef NOBYPASS -load: -#endif - if (selfheat) { - double dIrs_dgspr, dIth_dIrs; - vrs = *(ckt->CKTrhsOld + here->VDMOSsNode) - *(ckt->CKTrhsOld + here->VDIOposPrimeNode); - - Ith = vd*cd + vrs*vrs*gspr; - - dIth_dVdio = cd + vd*gd; - dIth_dVrs = vrs*gspr; - - dIrs_dgspr = vrs; - dIrs_dT = dIrs_dgspr * here->VDIOtConductance_dT; - dIth_dIrs = vrs; - dIth_dT = dIth_dIrs*dIrs_dT + dIdio_dT*vd; - } - /* - * load current vector - */ - cdeq = cd - gd*vd; - if (model->VDMOStype == 1) { - *(ckt->CKTrhs + here->VDMOSdNode) += cdeq; - *(ckt->CKTrhs + here->VDIOposPrimeNode) -= cdeq; - } else { - *(ckt->CKTrhs + here->VDMOSdNode) -= cdeq; - *(ckt->CKTrhs + here->VDIOposPrimeNode) += cdeq; - } - if (selfheat) { - *(ckt->CKTrhs + here->VDIOposPrimeNode) += dIdio_dT*delTemp - dIrs_dT*delTemp; - *(ckt->CKTrhs + here->VDMOSdNode) += -dIdio_dT*delTemp; - *(ckt->CKTrhs + here->VDMOSsNode) += dIrs_dT*delTemp; - *(ckt->CKTrhs + here->VDMOStempNode) += Ith - model->VDMOStype*dIth_dVdio*vd - dIth_dVrs*vrs - dIth_dT*delTemp; - } - /* - * load matrix - */ - *(here->VDMOSSsPtr) += gspr; - *(here->VDMOSDdPtr) += gd; - *(here->VDIORPrpPtr) += (gd + gspr); - *(here->VDIOSrpPtr) -= gspr; - *(here->VDIODrpPtr) -= gd; - *(here->VDIORPsPtr) -= gspr; - *(here->VDIORPdPtr) -= gd; - if (selfheat) { - (*(here->VDMOStempSPtr) += -dIth_dVrs); - (*(here->VDIOTempposPrimePtr) += -dIth_dVdio + dIth_dVrs); - (*(here->VDMOSTempdPtr) += dIth_dVdio); - (*(here->VDMOSTemptempPtr) += -dIth_dT); - (*(here->VDIOPosPrimetempPtr) += dIdio_dT - dIrs_dT); - (*(here->VDMOSSTempPtr) += dIrs_dT); - (*(here->VDMOSDtempPtr) += -dIdio_dT); - } - } - } - return(OK); -} diff --git a/src/spicelib/devices/vdmos/vdmosmask.c b/src/spicelib/devices/vdmos/vdmosmask.c deleted file mode 100644 index 67fd12bf6..000000000 --- a/src/spicelib/devices/vdmos/vdmosmask.c +++ /dev/null @@ -1,225 +0,0 @@ -/********** -Copyright 1990 Regents of the University of California. All rights reserved. -Author: 1987 Thomas L. Quarles -**********/ - -#include "ngspice/ngspice.h" -#include "ngspice/const.h" -#include "ngspice/ifsim.h" -#include "ngspice/cktdefs.h" -#include "ngspice/devdefs.h" -#include "vdmosdefs.h" -#include "ngspice/sperror.h" -#include "ngspice/suffix.h" - -/*ARGSUSED*/ -int -VDMOSmAsk(CKTcircuit *ckt, GENmodel *inst, int which, IFvalue *value) -{ - VDMOSmodel *model = (VDMOSmodel *)inst; - - NG_IGNORE(ckt); - - switch(which) { - case VDMOS_MOD_VTH: - value->rValue = model->VDMOSvth0; - return(OK); - case VDMOS_MOD_KP: - value->rValue = model->VDMOStransconductance; - return(OK); - case VDMOS_MOD_PHI: - value->rValue = model->VDMOSphi; - return(OK); - case VDMOS_MOD_LAMBDA: - value->rValue = model->VDMOSlambda; - return(OK); - case VDMOS_MOD_THETA: - value->rValue = model->VDMOStheta; - return(OK); - case VDMOS_MOD_RD: - value->rValue = model->VDMOSdrainResistance; - return(OK); - case VDMOS_MOD_RS: - value->rValue = model->VDMOSsourceResistance; - return(OK); - case VDMOS_MOD_RG: - value->rValue = model->VDMOSgateResistance; - return(OK); - case VDMOS_MOD_TNOM: - value->rValue = model->VDMOStnom-CONSTCtoK; - return(OK); - case VDMOS_MOD_AF: - value->rValue = model->VDMOSfNcoef; - return(OK); - case VDMOS_MOD_KF: - value->rValue = model->VDMOSfNexp; - return(OK); - case VDMOS_MOD_RQ: - value->rValue = model->VDMOSqsResistance; - return(OK); - case VDMOS_MOD_VQ: - value->rValue = model->VDMOSqsVoltage; - return(OK); - case VDMOS_MOD_MTRIODE: - value->rValue = model->VDMOSmtr; - return(OK); - case VDMOS_MOD_SUBSHIFT: - value->rValue = model->VDMOSsubshift; - return(OK); - case VDMOS_MOD_KSUBTHRES: - value->rValue = model->VDMOSksubthres; - return(OK); - case VDMOS_MOD_TYPE: - if (model->VDMOStype > 0) - value->sValue = "vdmosn"; - else - value->sValue = "vdmosp"; - return(OK); - case VDMOS_MOD_CGDMIN: - value->rValue = model->VDMOScgdmin; - return(OK); - case VDMOS_MOD_CGDMAX: - value->rValue = model->VDMOScgdmax; - return(OK); - case VDMOS_MOD_A: - value->rValue = model->VDMOSa; - return(OK); - case VDMOS_MOD_CGS: - value->rValue = model->VDMOScgs; - return(OK); - - /* body diode */ - case VDIO_MOD_RB: - value->rValue = model->VDIOresistance; - return(OK); - case VDIO_MOD_IS: - value->rValue = model->VDIOjctSatCur; - return(OK); - case VDIO_MOD_N: - value->rValue = model->VDIOn; - return(OK); - case VDIO_MOD_VJ: - value->rValue = model->VDIOjunctionPot; - return(OK); - case VDIO_MOD_CJ: - value->rValue = model->VDIOjunctionCap; - return(OK); - case VDIO_MOD_MJ: - value->rValue = model->VDIOgradCoeff; - return(OK); - case VDIO_MOD_FC: - value->rValue = model->VDIOdepletionCapCoeff; - return(OK); - case VDIO_MOD_BV: - value->rValue = model->VDIObv; - return(OK); - case VDIO_MOD_IBV: - value->rValue = model->VDIOibv; - return(OK); - case VDIO_MOD_NBV: - value->rValue = model->VDIObrkdEmissionCoeff; - return(OK); - case VDMOS_MOD_RDS: - value->rValue = model->VDMOSrds; - return(OK); - case VDIO_MOD_TT: - value->rValue = model->VDIOtransitTime; - return(OK); - case VDIO_MOD_EG: - value->rValue = model->VDIOeg; - return(OK); - case VDIO_MOD_XTI: - value->rValue = model->VDIOxti; - return(OK); - case VDMOS_MOD_TCVTH: - value->rValue = model->VDMOStcvth; - return(OK); - case VDMOS_MOD_RTHJC: - value->rValue = model->VDMOSrthjc; - return(OK); - case VDMOS_MOD_RTHCA: - value->rValue = model->VDMOSrthca; - return(OK); - case VDMOS_MOD_CTHJ: - value->rValue = model->VDMOScthj; - return(OK); - case VDMOS_MOD_MU: - value->rValue = model->VDMOSmu; - return(OK); - case VDMOS_MOD_TEXP0: - value->rValue = model->VDMOStexp0; - return(OK); - case VDMOS_MOD_TEXP1: - value->rValue = model->VDMOStexp1; - return(OK); - case VDMOS_MOD_TRD1: - value->rValue = model->VDMOStrd1; - return(OK); - case VDMOS_MOD_TRD2: - value->rValue = model->VDMOStrd2; - return(OK); - case VDMOS_MOD_TRG1: - value->rValue = model->VDMOStrg1; - return(OK); - case VDMOS_MOD_TRG2: - value->rValue = model->VDMOStrg2; - return(OK); - case VDMOS_MOD_TRS1: - value->rValue = model->VDMOStrs1; - return(OK); - case VDMOS_MOD_TRS2: - value->rValue = model->VDMOStrs2; - return(OK); - case VDIO_MOD_TRB1: - value->rValue = model->VDIOtrb1; - return(OK); - case VDIO_MOD_TRB2: - value->rValue = model->VDIOtrb2; - return(OK); - case VDMOS_MOD_TKSUBTHRES1: - value->rValue = model->VDMOStksubthres1; - return(OK); - case VDMOS_MOD_TKSUBTHRES2: - value->rValue = model->VDMOStksubthres2; - return(OK); - /* SOA */ - case VDMOS_MOD_VGS_MAX: - value->rValue = model->VDMOSvgsMax; - return(OK); - case VDMOS_MOD_VGD_MAX: - value->rValue = model->VDMOSvgdMax; - return(OK); - case VDMOS_MOD_VDS_MAX: - value->rValue = model->VDMOSvdsMax; - return(OK); - case VDMOS_MOD_VGSR_MAX: - value->rValue = model->VDMOSvgsrMax; - return(OK); - case VDMOS_MOD_VGDR_MAX: - value->rValue = model->VDMOSvgdrMax; - return(OK); - case VDMOS_MOD_PD_MAX: - value->rValue = model->VDMOSpd_max; - return(OK); - case VDMOS_MOD_ID_MAX: - value->rValue = model->VDMOSid_max; - return(OK); - case VDMOS_MOD_IDR_MAX: - value->rValue = model->VDMOSidr_max; - return(OK); - case VDMOS_MOD_TE_MAX: - value->rValue = model->VDMOSte_max; - return(OK); - case VDMOS_MOD_RTH_EXT: - value->rValue = model->VDMOSrth_ext; - return(OK); - case VDMOS_MOD_DERATING: - value->rValue = model->VDMOSderating; - return(OK); - - default: - return(E_BADPARM); - } - /* NOTREACHED */ -} - diff --git a/src/spicelib/devices/vdmos/vdmosmpar.c b/src/spicelib/devices/vdmos/vdmosmpar.c deleted file mode 100644 index 20ad96aa6..000000000 --- a/src/spicelib/devices/vdmos/vdmosmpar.c +++ /dev/null @@ -1,293 +0,0 @@ -/********** -Copyright 1990 Regents of the University of California. All rights reserved. -Author: 1985 Thomas L. Quarles -VDMOS: 2018 Holger Vogt, 2020 Dietmar Warning -**********/ - -#include "ngspice/ngspice.h" -#include "ngspice/const.h" -#include "ngspice/ifsim.h" -#include "vdmosdefs.h" -#include "ngspice/sperror.h" -#include "ngspice/suffix.h" - -int -VDMOSmParam(int param, IFvalue *value, GENmodel *inModel) -{ - VDMOSmodel *model = (VDMOSmodel *)inModel; - switch(param) { - case VDMOS_MOD_TNOM: - model->VDMOStnom = value->rValue + CONSTCtoK; - model->VDMOStnomGiven = TRUE; - break; - case VDMOS_MOD_VTH: - model->VDMOSvth0 = value->rValue; - model->VDMOSvth0Given = TRUE; - break; - case VDMOS_MOD_KP: - model->VDMOStransconductance = value->rValue; - model->VDMOStransconductanceGiven = TRUE; - break; - case VDMOS_MOD_PHI: - model->VDMOSphi = value->rValue; - model->VDMOSphiGiven = TRUE; - break; - case VDMOS_MOD_LAMBDA: - model->VDMOSlambda = value->rValue; - model->VDMOSlambdaGiven = TRUE; - break; - case VDMOS_MOD_THETA: - model->VDMOStheta = value->rValue; - model->VDMOSthetaGiven = TRUE; - break; - case VDMOS_MOD_RD: - model->VDMOSdrainResistance = value->rValue; - model->VDMOSdrainResistanceGiven = TRUE; - break; - case VDMOS_MOD_RS: - model->VDMOSsourceResistance = value->rValue; - model->VDMOSsourceResistanceGiven = TRUE; - break; - case VDMOS_MOD_RG: - model->VDMOSgateResistance = value->rValue; - model->VDMOSgateResistanceGiven = TRUE; - break; - case VDMOS_MOD_RQ: - model->VDMOSqsResistance = value->rValue; - model->VDMOSqsResistanceGiven = TRUE; - break; - case VDMOS_MOD_VQ: - model->VDMOSqsVoltage = value->rValue; - model->VDMOSqsVoltageGiven = TRUE; - break; - case VDIO_MOD_RB: - model->VDIOresistance = value->rValue; - model->VDIOresistanceGiven = TRUE; - break; - case VDIO_MOD_IS: - model->VDIOjctSatCur = value->rValue; - model->VDIOjctSatCurGiven = TRUE; - break; - case VDIO_MOD_VJ: - model->VDIOjunctionPot = value->rValue; - model->VDIOjunctionPotGiven = TRUE; - break; - case VDIO_MOD_CJ: - model->VDIOjunctionCap = value->rValue; - model->VDIOjunctionCapGiven = TRUE; - break; - case VDIO_MOD_MJ: - model->VDIOgradCoeff = value->rValue; - model->VDIOgradCoeffGiven = TRUE; - model->VDIOgradCoeffTemp1 = 0; - model->VDIOgradCoeffTemp2 = 0; - break; - case VDIO_MOD_FC: - model->VDIOdepletionCapCoeff = value->rValue; - model->VDIOdepletionCapCoeffGiven = TRUE; - break; - case VDMOS_MOD_NMOS: - if(value->iValue) { - model->VDMOStype = 1; - model->VDMOStypeGiven = TRUE; - } - break; - case VDMOS_MOD_PMOS: - if(value->iValue) { - model->VDMOStype = -1; - model->VDMOStypeGiven = TRUE; - } - break; - case VDMOS_MOD_KF: - model->VDMOSfNcoef = value->rValue; - model->VDMOSfNcoefGiven = TRUE; - break; - case VDMOS_MOD_AF: - model->VDMOSfNexp = value->rValue; - model->VDMOSfNexpGiven = TRUE; - break; - case VDMOS_MOD_DMOS: - if (value->iValue) { - model->VDMOStype = 1; - model->VDMOStypeGiven = TRUE; - } - break; - case VDMOS_MOD_CGDMIN: - model->VDMOScgdmin = value->rValue; - model->VDMOScgdminGiven = TRUE; - break; - case VDMOS_MOD_CGDMAX: - model->VDMOScgdmax = value->rValue; - model->VDMOScgdmaxGiven = TRUE; - break; - case VDMOS_MOD_A: - model->VDMOSa = value->rValue; - model->VDMOSaGiven = TRUE; - break; - case VDMOS_MOD_CGS: - model->VDMOScgs = value->rValue; - model->VDMOScgsGiven = TRUE; - break; - case VDMOS_MOD_MTRIODE: - model->VDMOSmtr = value->rValue; - model->VDMOSmtrGiven = TRUE; - break; - case VDMOS_MOD_SUBSHIFT: - model->VDMOSsubshift = value->rValue; - model->VDMOSsubshiftGiven = TRUE; - break; - case VDMOS_MOD_KSUBTHRES: - model->VDMOSksubthres = value->rValue; - model->VDMOSksubthresGiven = TRUE; - break; - case VDIO_MOD_BV: - model->VDIObv = value->rValue; - model->VDIObvGiven = TRUE; - break; - case VDIO_MOD_IBV: - model->VDIOibv = value->rValue; - model->VDIOibvGiven = TRUE; - break; - case VDIO_MOD_NBV: - model->VDIObrkdEmissionCoeff = value->rValue; - model->VDIObrkdEmissionCoeffGiven = TRUE; - break; - case VDMOS_MOD_RDS: - model->VDMOSrds = value->rValue; - model->VDMOSrdsGiven = TRUE; - break; - case VDIO_MOD_N: - model->VDIOn = value->rValue; - model->VDIOnGiven = TRUE; - break; - case VDIO_MOD_TT: - model->VDIOtransitTime = value->rValue; - model->VDIOtransitTimeGiven = TRUE; - model->VDIOtranTimeTemp1 = 0; - model->VDIOtranTimeTemp2 = 0; - break; - case VDIO_MOD_EG: - model->VDIOeg = value->rValue; - model->VDIOegGiven = TRUE; - break; - case VDIO_MOD_XTI: - model->VDIOxti = value->rValue; - model->VDIOxtiGiven = TRUE; - break; - case VDMOS_MOD_TCVTH: - model->VDMOStcvth = value->rValue; - model->VDMOStcvthGiven = TRUE; - break; - case VDMOS_MOD_RTHJC: - model->VDMOSrthjc = value->rValue; - model->VDMOSrthjcGiven = TRUE; - break; - case VDMOS_MOD_RTHCA: - model->VDMOSrthca = value->rValue; - model->VDMOSrthcaGiven = TRUE; - break; - case VDMOS_MOD_CTHJ: - model->VDMOScthj = value->rValue; - model->VDMOScthjGiven = TRUE; - break; - case VDMOS_MOD_MU: - model->VDMOSmu = value->rValue; - model->VDMOSmuGiven = TRUE; - break; - case VDMOS_MOD_TEXP0: - model->VDMOStexp0 = value->rValue; - model->VDMOStexp0Given = TRUE; - break; - case VDMOS_MOD_TEXP1: - model->VDMOStexp1 = value->rValue; - model->VDMOStexp1Given = TRUE; - break; - case VDMOS_MOD_TRD1: - model->VDMOStrd1 = value->rValue; - model->VDMOStrd1Given = TRUE; - break; - case VDMOS_MOD_TRD2: - model->VDMOStrd2 = value->rValue; - model->VDMOStrd2Given = TRUE; - break; - case VDMOS_MOD_TRG1: - model->VDMOStrg1 = value->rValue; - model->VDMOStrg1Given = TRUE; - break; - case VDMOS_MOD_TRG2: - model->VDMOStrg2 = value->rValue; - model->VDMOStrg2Given = TRUE; - break; - case VDMOS_MOD_TRS1: - model->VDMOStrs1 = value->rValue; - model->VDMOStrs1Given = TRUE; - break; - case VDMOS_MOD_TRS2: - model->VDMOStrs2 = value->rValue; - model->VDMOStrs2Given = TRUE; - break; - case VDIO_MOD_TRB1: - model->VDIOtrb1 = value->rValue; - model->VDIOtrb1Given = TRUE; - break; - case VDIO_MOD_TRB2: - model->VDIOtrb2 = value->rValue; - model->VDIOtrb2Given = TRUE; - break; - case VDMOS_MOD_TKSUBTHRES1: - model->VDMOStksubthres1 = value->rValue; - model->VDMOStksubthres1Given = TRUE; - break; - case VDMOS_MOD_TKSUBTHRES2: - model->VDMOStksubthres2 = value->rValue; - model->VDMOStksubthres2Given = TRUE; - break; - case VDMOS_MOD_VGS_MAX: - model->VDMOSvgsMax = value->rValue; - model->VDMOSvgsMaxGiven = TRUE; - break; - case VDMOS_MOD_VGD_MAX: - model->VDMOSvgdMax = value->rValue; - model->VDMOSvgdMaxGiven = TRUE; - break; - case VDMOS_MOD_VDS_MAX: - model->VDMOSvdsMax = value->rValue; - model->VDMOSvdsMaxGiven = TRUE; - break; - case VDMOS_MOD_VGSR_MAX: - model->VDMOSvgsrMax = value->rValue; - model->VDMOSvgsrMaxGiven = TRUE; - break; - case VDMOS_MOD_VGDR_MAX: - model->VDMOSvgdrMax = value->rValue; - model->VDMOSvgdrMaxGiven = TRUE; - break; - case VDMOS_MOD_PD_MAX: - model->VDMOSpd_max = value->rValue; - model->VDMOSpd_maxGiven = TRUE; - break; - case VDMOS_MOD_ID_MAX: - model->VDMOSid_max = value->rValue; - model->VDMOSid_maxGiven = TRUE; - break; - case VDMOS_MOD_IDR_MAX: - model->VDMOSidr_max = value->rValue; - model->VDMOSidr_maxGiven = TRUE; - break; - case VDMOS_MOD_TE_MAX: - model->VDMOSte_max = value->rValue; - model->VDMOSte_maxGiven = TRUE; - break; - case VDMOS_MOD_RTH_EXT: - model->VDMOSrth_ext = value->rValue; - model->VDMOSrth_extGiven = TRUE; - break; - case VDMOS_MOD_DERATING: - model->VDMOSderating = value->rValue; - model->VDMOSderatingGiven = TRUE; - break; - default: - return(E_BADPARM); - } - return(OK); -} diff --git a/src/spicelib/devices/vdmos/vdmosnoi.c b/src/spicelib/devices/vdmos/vdmosnoi.c deleted file mode 100644 index 273d4f34e..000000000 --- a/src/spicelib/devices/vdmos/vdmosnoi.c +++ /dev/null @@ -1,194 +0,0 @@ -/********** -Copyright 1990 Regents of the University of California. All rights reserved. -Author: 1987 Gary W. Ng -Modified: 2000 AlansFixes -**********/ - -#include "ngspice/ngspice.h" -#include "vdmosdefs.h" -#include "ngspice/cktdefs.h" -#include "ngspice/iferrmsg.h" -#include "ngspice/noisedef.h" -#include "ngspice/suffix.h" - -/* - * VDMOSnoise (mode, operation, firstModel, ckt, data, OnDens) - * This routine names and evaluates all of the noise sources - * associated with MOSFET's. It starts with the model *firstModel and - * traverses all of its insts. It then proceeds to any other models - * on the linked list. The total output noise density generated by - * all of the MOSFET's is summed with the variable "OnDens". - */ - - -int -VDMOSnoise (int mode, int operation, GENmodel *genmodel, CKTcircuit *ckt, - Ndata *data, double *OnDens) -{ - NOISEAN *job = (NOISEAN *) ckt->CKTcurJob; - - VDMOSmodel *firstModel = (VDMOSmodel *) genmodel; - VDMOSmodel *model; - VDMOSinstance *inst; - double coxSquared; - double tempOnoise; - double tempInoise; - double noizDens[VDMOSNSRCS]; - double lnNdens[VDMOSNSRCS]; - int i; - double tempRatioSH; - - /* define the names of the noise sources */ - - static char *VDMOSnNames[VDMOSNSRCS] = { /* Note that we have to keep the order */ - "_rd", /* noise due to rd */ /* consistent with thestrchr definitions */ - "_rs", /* noise due to rs */ /* in VDMOSdefs.h */ - "_id", /* noise due to id */ - "_1overf", /* flicker (1/f) noise */ - "" /* total transistor noise */ - }; - - for (model=firstModel; model != NULL; model=VDMOSnextModel(model)) { - - /* Oxide capacitance can be zero in MOS level 1. Since this will give us problems in our 1/f */ - /* noise model, we ASSUME an actual "tox" of 1e-7 */ - - if (model->VDMOSoxideCapFactor == 0.0) { - coxSquared = 3.9 * 8.854214871e-12 / 1e-7; - } else { - coxSquared = model->VDMOSoxideCapFactor; - } - coxSquared *= coxSquared; - for (inst=VDMOSinstances(model); inst != NULL; inst=VDMOSnextInstance(inst)) { - - switch (operation) { - - case N_OPEN: - - /* see if we have to to produce a summary report */ - /* if so, name all the noise generators */ - - if (job->NStpsSm != 0) { - switch (mode) { - - case N_DENS: - for (i=0; i < VDMOSNSRCS; i++) { - NOISE_ADD_OUTVAR(ckt, data, "onoise_%s%s", inst->VDMOSname, VDMOSnNames[i]); - } - break; - - case INT_NOIZ: - for (i=0; i < VDMOSNSRCS; i++) { - NOISE_ADD_OUTVAR(ckt, data, "onoise_total_%s%s", inst->VDMOSname, VDMOSnNames[i]); - NOISE_ADD_OUTVAR(ckt, data, "inoise_total_%s%s", inst->VDMOSname, VDMOSnNames[i]); - } - break; - } - } - break; - - case N_CALC: - switch (mode) { - - case N_DENS: - if ((inst->VDMOSthermal) && (model->VDMOSrthjcGiven)) - tempRatioSH = inst->VDMOSTempSH / ckt->CKTtemp; - else - tempRatioSH = 1.0; - NevalSrc(&noizDens[VDMOSRDNOIZ],&lnNdens[VDMOSRDNOIZ], - ckt,THERMNOISE,inst->VDMOSdNodePrime,inst->VDMOSdNode, - inst->VDMOSdrainConductance * tempRatioSH); - - NevalSrc(&noizDens[VDMOSRSNOIZ],&lnNdens[VDMOSRSNOIZ], - ckt,THERMNOISE,inst->VDMOSsNodePrime,inst->VDMOSsNode, - inst->VDMOSsourceConductance * tempRatioSH); - - NevalSrc(&noizDens[VDMOSIDNOIZ],&lnNdens[VDMOSIDNOIZ], - ckt,THERMNOISE,inst->VDMOSdNodePrime,inst->VDMOSsNodePrime, - (2.0/3.0 * fabs(inst->VDMOSgm)) * tempRatioSH); - - NevalSrc(&noizDens[VDMOSFLNOIZ], NULL, ckt, - N_GAIN,inst->VDMOSdNodePrime, inst->VDMOSsNodePrime, - (double)0.0); - noizDens[VDMOSFLNOIZ] *= model->VDMOSfNcoef * - exp(model->VDMOSfNexp * - log(MAX(fabs(inst->VDMOScd),N_MINLOG))) / - (data->freq * - inst->VDMOSm * coxSquared); - lnNdens[VDMOSFLNOIZ] = - log(MAX(noizDens[VDMOSFLNOIZ],N_MINLOG)); - - noizDens[VDMOSTOTNOIZ] = noizDens[VDMOSRDNOIZ] + - noizDens[VDMOSRSNOIZ] + - noizDens[VDMOSIDNOIZ] + - noizDens[VDMOSFLNOIZ]; - lnNdens[VDMOSTOTNOIZ] = - log(MAX(noizDens[VDMOSTOTNOIZ], N_MINLOG)); - - *OnDens += noizDens[VDMOSTOTNOIZ]; - - if (data->delFreq == 0.0) { - - /* if we haven't done any previous integration, we need to */ - /* initialize our "history" variables */ - - for (i=0; i < VDMOSNSRCS; i++) { - inst->VDMOSnVar[LNLSTDENS][i] = lnNdens[i]; - } - - /* clear out our integration variables if it's the first pass */ - - if (data->freq == job->NstartFreq) { - for (i=0; i < VDMOSNSRCS; i++) { - inst->VDMOSnVar[OUTNOIZ][i] = 0.0; - inst->VDMOSnVar[INNOIZ][i] = 0.0; - } - } - } else { /* data->delFreq != 0.0 (we have to integrate) */ - for (i=0; i < VDMOSNSRCS; i++) { - if (i != VDMOSTOTNOIZ) { - tempOnoise = Nintegrate(noizDens[i], lnNdens[i], - inst->VDMOSnVar[LNLSTDENS][i], data); - tempInoise = Nintegrate(noizDens[i] * data->GainSqInv , - lnNdens[i] + data->lnGainInv, - inst->VDMOSnVar[LNLSTDENS][i] + data->lnGainInv, - data); - inst->VDMOSnVar[LNLSTDENS][i] = lnNdens[i]; - data->outNoiz += tempOnoise; - data->inNoise += tempInoise; - if (job->NStpsSm != 0) { - inst->VDMOSnVar[OUTNOIZ][i] += tempOnoise; - inst->VDMOSnVar[OUTNOIZ][VDMOSTOTNOIZ] += tempOnoise; - inst->VDMOSnVar[INNOIZ][i] += tempInoise; - inst->VDMOSnVar[INNOIZ][VDMOSTOTNOIZ] += tempInoise; - } - } - } - } - if (data->prtSummary) { - for (i=0; i < VDMOSNSRCS; i++) { /* print a summary report */ - data->outpVector[data->outNumber++] = noizDens[i]; - } - } - break; - - case INT_NOIZ: /* already calculated, just output */ - if (job->NStpsSm != 0) { - for (i=0; i < VDMOSNSRCS; i++) { - data->outpVector[data->outNumber++] = inst->VDMOSnVar[OUTNOIZ][i]; - data->outpVector[data->outNumber++] = inst->VDMOSnVar[INNOIZ][i]; - } - } /* if */ - break; - } /* switch (mode) */ - break; - - case N_CLOSE: - return (OK); /* do nothing, the main calling routine will close */ - break; /* the plots */ - } /* switch (operation) */ - } /* for inst */ - } /* for model */ - -return(OK); -} diff --git a/src/spicelib/devices/vdmos/vdmospar.c b/src/spicelib/devices/vdmos/vdmospar.c deleted file mode 100644 index ba9733164..000000000 --- a/src/spicelib/devices/vdmos/vdmospar.c +++ /dev/null @@ -1,79 +0,0 @@ -/********** -Copyright 1990 Regents of the University of California. All rights reserved. -Author: 1985 Thomas L. Quarles -Modified: 2000 AlansFixes -VDMOS: 2018 Holger Vogt, 2020 Dietmar Warning -**********/ -/* - */ - -#include "ngspice/ngspice.h" -#include "ngspice/const.h" -#include "ngspice/ifsim.h" -#include "vdmosdefs.h" -#include "ngspice/sperror.h" -#include "ngspice/suffix.h" -#include "ngspice/fteext.h" - - -/* ARGSUSED */ -int -VDMOSparam(int param, IFvalue *value, GENinstance *inst, IFvalue *select) -{ - double scale; - - VDMOSinstance *here = (VDMOSinstance *)inst; - - NG_IGNORE(select); - - if (!cp_getvar("scale", CP_REAL, &scale, 0)) - scale = 1; - - switch (param) { - case VDMOS_TEMP: - here->VDMOStemp = value->rValue+CONSTCtoK; - here->VDMOStempGiven = TRUE; - break; - case VDMOS_DTEMP: - here->VDMOSdtemp = value->rValue; - here->VDMOSdtempGiven = TRUE; - break; - case VDMOS_M: - here->VDMOSm = value->rValue; - here->VDMOSmGiven = TRUE; - break; - case VDMOS_OFF: - here->VDMOSoff = (value->iValue != 0); - break; - case VDMOS_IC_VDS: - here->VDMOSicVDS = value->rValue; - here->VDMOSicVDSGiven = TRUE; - break; - case VDMOS_IC_VGS: - here->VDMOSicVGS = value->rValue; - here->VDMOSicVGSGiven = TRUE; - break; - case VDMOS_THERMAL: - here->VDMOSthermal = (value->iValue != 0); - break; - case VDMOS_IC: - /* FALLTHROUGH added to suppress GCC warning due to - * -Wimplicit-fallthrough flag */ - switch (value->v.numValue) { - case 2: - here->VDMOSicVGS = *(value->v.vec.rVec+1); - here->VDMOSicVGSGiven = TRUE; - /* FALLTHROUGH */ - case 1: - here->VDMOSicVDS = *(value->v.vec.rVec); - here->VDMOSicVDSGiven = TRUE; - break; - default: - return(E_BADPARM); - } - break; - default: - return(E_BADPARM); - } - return(OK); -} diff --git a/src/spicelib/devices/vdmos/vdmospzld.c b/src/spicelib/devices/vdmos/vdmospzld.c deleted file mode 100644 index 674ad4ae7..000000000 --- a/src/spicelib/devices/vdmos/vdmospzld.c +++ /dev/null @@ -1,107 +0,0 @@ -/********** -Copyright 1990 Regents of the University of California. All rights reserved. -Author: 1985 Thomas L. Quarles -Modified: 2000 AlansFixes -**********/ -/* - */ - -#include "ngspice/ngspice.h" -#include "ngspice/cktdefs.h" -#include "ngspice/complex.h" -#include "vdmosdefs.h" -#include "ngspice/sperror.h" -#include "ngspice/suffix.h" - - -int -VDMOSpzLoad(GENmodel *inModel, CKTcircuit *ckt, SPcomplex *s) -{ - VDMOSmodel *model = (VDMOSmodel*)inModel; - VDMOSinstance *here; - int xnrm; - int xrev; - double xgs; - double xgd; - double capgs; - double capgd; - - for( ; model != NULL; model = VDMOSnextModel(model)) { - for(here = VDMOSinstances(model); here!= NULL; - here = VDMOSnextInstance(here)) { - - if (here->VDMOSmode < 0) { - xnrm=0; - xrev=1; - } else { - xnrm=1; - xrev=0; - } - /* - * meyer's model parameters - */ - capgs = ( 2* *(ckt->CKTstate0+here->VDMOScapgs)); - capgd = ( 2* *(ckt->CKTstate0+here->VDMOScapgd)); - xgs = capgs; - xgd = capgd; - - /* body diode */ - double gspr, geq, xceq; - gspr = here->VDIOtConductance; - geq = *(ckt->CKTstate0 + here->VDIOconduct); - xceq = *(ckt->CKTstate0 + here->VDIOcapCurrent); - - /* - * load matrix - */ - - *(here->VDMOSGgPtr ) += (xgd+xgs)*s->real; - *(here->VDMOSGgPtr +1) += (xgd+xgs)*s->imag; - *(here->VDMOSDPdpPtr ) += (xgd)*s->real; - *(here->VDMOSDPdpPtr +1) += (xgd)*s->imag; - *(here->VDMOSSPspPtr ) += (xgs)*s->real; - *(here->VDMOSSPspPtr +1) += (xgs)*s->imag; - *(here->VDMOSGdpPtr ) -= xgd*s->real; - *(here->VDMOSGdpPtr +1) -= xgd*s->imag; - *(here->VDMOSGspPtr ) -= xgs*s->real; - *(here->VDMOSGspPtr +1) -= xgs*s->imag; - *(here->VDMOSDPgPtr ) -= xgd*s->real; - *(here->VDMOSDPgPtr +1) -= xgd*s->imag; - *(here->VDMOSSPgPtr ) -= xgs*s->real; - *(here->VDMOSSPgPtr +1) -= xgs*s->imag; - *(here->VDMOSDdPtr) += here->VDMOSdrainConductance; - *(here->VDMOSSsPtr) += here->VDMOSsourceConductance; - *(here->VDMOSDPdpPtr) += here->VDMOSdrainConductance+ - here->VDMOSgds+xrev*(here->VDMOSgm); - *(here->VDMOSSPspPtr) += here->VDMOSsourceConductance+ - here->VDMOSgds+xnrm*(here->VDMOSgm); - *(here->VDMOSDdpPtr) -= here->VDMOSdrainConductance; - *(here->VDMOSSspPtr) -= here->VDMOSsourceConductance; - *(here->VDMOSDPdPtr) -= here->VDMOSdrainConductance; - *(here->VDMOSDPgpPtr) += (xnrm-xrev)*here->VDMOSgm; - *(here->VDMOSDPspPtr) -= here->VDMOSgds+xnrm*(here->VDMOSgm); - *(here->VDMOSSPgpPtr) -= (xnrm-xrev)*here->VDMOSgm; - *(here->VDMOSSPsPtr) -= here->VDMOSsourceConductance; - *(here->VDMOSSPdpPtr) -= here->VDMOSgds+xrev*(here->VDMOSgm); - /* gate resistor */ - *(here->VDMOSGgPtr) += (here->VDMOSgateConductance); - *(here->VDMOSGPgpPtr) += (here->VDMOSgateConductance); - *(here->VDMOSGgpPtr) -= here->VDMOSgateConductance; - *(here->VDMOSGPgPtr) -= here->VDMOSgateConductance; - /* body diode */ - *(here->VDMOSSsPtr) += gspr; - *(here->VDMOSDdPtr) += geq + xceq * s->real; - *(here->VDMOSDdPtr +1 ) += xceq * s->imag; - *(here->VDIORPrpPtr) += geq + gspr + xceq * s->real; - *(here->VDIORPrpPtr +1) += xceq * s->imag; - *(here->VDIOSrpPtr) -= gspr; - *(here->VDIODrpPtr) -= geq + xceq * s->real; - *(here->VDIODrpPtr +1) -= xceq * s->imag; - *(here->VDIORPsPtr) -= gspr; - *(here->VDIORPdPtr) -= geq + xceq * s->real; - *(here->VDIORPdPtr +1 ) -= xceq * s->imag; - - } - } - return(OK); -} diff --git a/src/spicelib/devices/vdmos/vdmosset.c b/src/spicelib/devices/vdmos/vdmosset.c deleted file mode 100644 index 6d7661d11..000000000 --- a/src/spicelib/devices/vdmos/vdmosset.c +++ /dev/null @@ -1,537 +0,0 @@ -/********** -Copyright 1990 Regents of the University of California. All rights reserved. -Author: 1985 Thomas L. Quarles -Modified: 2000 AlansFixes -VDMOS: 2018 Holger Vogt, 2020 Dietmar Warning -**********/ - -/* load the VDMOS device structure with those pointers needed later - * for fast matrix loading - */ - -#include "ngspice/ngspice.h" -#include "ngspice/smpdefs.h" -#include "ngspice/cktdefs.h" -#include "vdmosdefs.h" -#include "ngspice/sperror.h" -#include "ngspice/suffix.h" - -int -VDMOSsetup(SMPmatrix *matrix, GENmodel *inModel, CKTcircuit *ckt, - int *states) -{ - VDMOSmodel *model = (VDMOSmodel *)inModel; - VDMOSinstance *here; - int error; - CKTnode *tmp; - - /* loop through all the VDMOS device models */ - for (; model != NULL; model = VDMOSnextModel(model)) { - - if (!model->VDMOStypeGiven) - model->VDMOStype = NMOS; - - if (!model->VDMOStransconductanceGiven) - model->VDMOStransconductance = 1; - - if (!model->VDMOSvth0Given) - model->VDMOSvth0 = 0; - - if (!model->VDIOjctSatCurGiven) - model->VDIOjctSatCur = 1e-14; - - if (!model->VDIOjunctionPotGiven) - model->VDIOjunctionPot = .8; - - if (!model->VDIOjunctionCapGiven) - model->VDIOjunctionCap = 0.; - - if (!model->VDIOgradCoeffGiven) - model->VDIOgradCoeff = .5; - - if (!model->VDIOdepletionCapCoeffGiven) - model->VDIOdepletionCapCoeff = .5; - - if (!model->VDMOSphiGiven) - model->VDMOSphi = .6; - - if (!model->VDMOSlambdaGiven) - model->VDMOSlambda = 0; - - if (!model->VDMOSthetaGiven) - model->VDMOStheta = 0; - - if (!model->VDMOSfNcoefGiven) - model->VDMOSfNcoef = 0; - - if (!model->VDMOSfNexpGiven) - model->VDMOSfNexp = 1; - - if (!model->VDMOScgdminGiven) - model->VDMOScgdmin = 0; - - if (!model->VDMOScgdmaxGiven) - model->VDMOScgdmax = 0; - - if (!model->VDMOScgsGiven) - model->VDMOScgs = 0; - - if (!model->VDMOSaGiven) - model->VDMOSa = 1.; - - if (!model->VDMOSsubshiftGiven) - model->VDMOSsubshift = 0; - - if (!model->VDMOSksubthresGiven) - model->VDMOSksubthres = 0.1; - - if (!model->VDMOSmtrGiven) - model->VDMOSmtr = 1.; - - if (!model->VDIObvGiven) - model->VDIObv = 1e99; - - if (!model->VDIOibvGiven) - model->VDIOibv = 1.0e-10; - - if (!model->VDIObrkdEmissionCoeffGiven) - model->VDIObrkdEmissionCoeff = 1.; - - if (!model->VDMOSdrainResistanceGiven) - model->VDMOSdrainResistance = 0.0; - - if (!model->VDMOSsourceResistanceGiven) - model->VDMOSsourceResistance = 0.0; - - if (!model->VDMOSgateResistanceGiven) - model->VDMOSgateResistance = 0.0; - - if (!model->VDMOSrdsGiven) - model->VDMOSrds = 1.0e+15; - - if (!model->VDIOresistanceGiven) - model->VDIOresistance = 0.0; - - if (!model->VDIOnGiven) - model->VDIOn = 1.; - - if (!model->VDIOtransitTimeGiven) - model->VDIOtransitTime = 0.; - - if (!model->VDIOegGiven) - model->VDIOeg = 1.11; - - if (!model->VDIOxtiGiven) - model->VDIOxti = 3.0; - - if (!model->VDMOSrthjcGiven) - model->VDMOSrthjc = 1.0; - - if (!model->VDMOSrthcaGiven) - model->VDMOSrthca = 1000; - - if (!model->VDMOScthjGiven) - model->VDMOScthj = 10e-06; - - if (!model->VDMOSmuGiven) - model->VDMOSmu = -1.5; - - if (!model->VDMOStcvthGiven) - model->VDMOStcvth = 0.0; - - if (!model->VDMOStexp0Given) - model->VDMOStexp0 = 1.5; - - if (!model->VDMOStexp1Given) - model->VDMOStexp1 = 0.3; - - if (!model->VDMOStrd1Given) - model->VDMOStrd1 = 0.0; - - if (!model->VDMOStrd2Given) - model->VDMOStrd2 = 0.0; - - if (!model->VDMOStrg1Given) - model->VDMOStrg1 = 0.0; - - if (!model->VDMOStrg2Given) - model->VDMOStrg2 = 0.0; - - if (!model->VDMOStrs1Given) - model->VDMOStrs1 = 0.0; - - if (!model->VDMOStrs2Given) - model->VDMOStrs2 = 0.0; - - if (!model->VDIOtrb1Given) - model->VDIOtrb1 = 0.0; - - if (!model->VDIOtrb2Given) - model->VDIOtrb2 = 0.0; - - if (!model->VDMOStksubthres1Given) - model->VDMOStksubthres1 = 0.0; - - if (!model->VDMOStksubthres2Given) - model->VDMOStksubthres2 = 0.0; - - if (!model->VDMOSvgsMaxGiven) - model->VDMOSvgsMax = 1e99; - - if (!model->VDMOSvgdMaxGiven) - model->VDMOSvgdMax = 1e99; - - if (!model->VDMOSvdsMaxGiven) - model->VDMOSvdsMax = 1e99; - - if (!model->VDMOSvgsrMaxGiven) - model->VDMOSvgsrMax = 1e99; - - if (!model->VDMOSvgdrMaxGiven) - model->VDMOSvgdrMax = 1e99; - - if (!model->VDMOSpd_maxGiven) - model->VDMOSpd_max = 1e99; - - if (!model->VDMOSid_maxGiven) - model->VDMOSpd_max = 1e99; - - if (!model->VDMOSidr_maxGiven) - model->VDMOSidr_max = 1e99; - - if (!model->VDMOSte_maxGiven) - model->VDMOSte_max = 1e99; - - if (!model->VDMOSderatingGiven) - model->VDMOSderating = 0; - - if (!model->VDMOSrth_extGiven) - model->VDMOSrth_ext = model->VDMOSrthca; - - if (!model->VDMOSqsResistanceGiven) - model->VDMOSqsResistance = 0.0; - - if (!model->VDMOSqsVoltageGiven) - model->VDMOSqsVoltage = 0.0; - - if ((model->VDMOSqsResistanceGiven) && (model->VDMOSqsVoltageGiven)) - model->VDMOSqsGiven = 1; - else - model->VDMOSqsGiven = 0; - - if(!model->VDMOStnomGiven) { - model->VDMOStnom = ckt->CKTnomTemp; - } - - /* now model parameter preprocessing */ - if (model->VDMOSphi <= 0.0) { - SPfrontEnd->IFerrorf(ERR_FATAL, - "%s: Phi is not positive.", model->VDMOSmodName); - return(E_BADPARM); - } - - model->VDMOSoxideCapFactor = 3.9 * 8.854214871e-12 / 1e-07; /* use default Tox of 100nm */ - - /* body diode model */ - /* limit activation energy to min of .1 */ - if (model->VDIOeg<.1) { - SPfrontEnd->IFerrorf(ERR_WARNING, - "%s: body diode activation energy too small, limited to 0.1", - model->VDMOSmodName); - model->VDIOeg = .1; - } - /* limit depletion cap coeff to max of .95 */ - if (model->VDIOdepletionCapCoeff>.95) { - SPfrontEnd->IFerrorf(ERR_WARNING, - "%s: coefficient Fc too large, limited to 0.95", - model->VDMOSmodName); - model->VDIOdepletionCapCoeff = .95; - } - /* set lower limit of saturation current */ - if (model->VDIOjctSatCur < ckt->CKTepsmin) - model->VDIOjctSatCur = ckt->CKTepsmin; - - /* loop through all the instances of the model */ - for (here = VDMOSinstances(model); here != NULL; - here = VDMOSnextInstance(here)) { - - /* allocate a chunk of the state vector */ - here->VDMOSstates = *states; - *states += VDMOSnumStates; - - if (!here->VDMOSicVDSGiven) { - here->VDMOSicVDS = 0; - } - if (!here->VDMOSicVGSGiven) { - here->VDMOSicVGS = 0; - } - if (!here->VDMOSvdsatGiven) { - here->VDMOSvdsat = 0; - } - if (!here->VDMOSvonGiven) { - here->VDMOSvon = 0; - } - if(!here->VDMOSmGiven) { - here->VDMOSm = 1; - } - if (model->VDMOSdrainResistance > 0) { - here->VDMOSdrainConductance = here->VDMOSm / model->VDMOSdrainResistance; - } else { - here->VDMOSdrainConductance = 0.0; - } - if (model->VDMOSsourceResistance > 0) { - here->VDMOSsourceConductance = here->VDMOSm / model->VDMOSsourceResistance; - } else { - here->VDMOSsourceConductance = 0.0; - } - if (model->VDMOSgateResistance > 0) { - here->VDMOSgateConductance = here->VDMOSm / model->VDMOSgateResistance; - } else { - here->VDMOSgateConductance = 0.0; - } - if (model->VDMOSrdsGiven) { - if (model->VDMOSrds > 0) { - here->VDMOSdsConductance = here->VDMOSm / model->VDMOSrds; - } else { - here->VDMOSdsConductance = 1e-15; - } - } else { - here->VDMOSdsConductance = 1e-15; - } - if (model->VDIOresistance > 0) { - here->VDIOconductance = here->VDMOSm / model->VDIOresistance; - } else { - here->VDIOconductance = 0.0; - } - - if (model->VDMOSdrainResistance > 0) { - if (here->VDMOSdNodePrime == 0) { - error = CKTmkVolt(ckt, &tmp, here->VDMOSname, "drain"); - if (error) return(error); - here->VDMOSdNodePrime = tmp->number; - - if (ckt->CKTcopyNodesets) { - CKTnode *tmpNode; - IFuid tmpName; - - if (CKTinst2Node(ckt, here, 1, &tmpNode, &tmpName) == OK) { - if (tmpNode->nsGiven) { - tmp->nodeset = tmpNode->nodeset; - tmp->nsGiven = tmpNode->nsGiven; - } - } - } - } - - } - else { - here->VDMOSdNodePrime = here->VDMOSdNode; - } - - if (model->VDMOSgateResistance > 0 ) { - if (here->VDMOSgNodePrime == 0) { - error = CKTmkVolt(ckt, &tmp, here->VDMOSname, "gate"); - if (error) return(error); - here->VDMOSgNodePrime = tmp->number; - - if (ckt->CKTcopyNodesets) { - CKTnode *tmpNode; - IFuid tmpName; - - if (CKTinst2Node(ckt, here, 2, &tmpNode, &tmpName) == OK) { - if (tmpNode->nsGiven) { - tmp->nodeset = tmpNode->nodeset; - tmp->nsGiven = tmpNode->nsGiven; - } - } - } - } - } - else { - here->VDMOSgNodePrime = here->VDMOSgNode; - } - - if (model->VDMOSsourceResistance > 0) { - if (here->VDMOSsNodePrime == 0) { - error = CKTmkVolt(ckt, &tmp, here->VDMOSname, "source"); - if (error) return(error); - here->VDMOSsNodePrime = tmp->number; - - if (ckt->CKTcopyNodesets) { - CKTnode *tmpNode; - IFuid tmpName; - - if (CKTinst2Node(ckt, here, 3, &tmpNode, &tmpName) == OK) { - if (tmpNode->nsGiven) { - tmp->nodeset = tmpNode->nodeset; - tmp->nsGiven = tmpNode->nsGiven; - } - } - } - - } - } - else { - here->VDMOSsNodePrime = here->VDMOSsNode; - } - - if (model->VDIOresistance > 0 ) { - if (here->VDIOposPrimeNode == 0) { - error = CKTmkVolt(ckt, &tmp, here->VDMOSname, "body diode"); - if (error) return(error); - here->VDIOposPrimeNode = tmp->number; - - if (ckt->CKTcopyNodesets) { - CKTnode *tmpNode; - IFuid tmpName; - - if (CKTinst2Node(ckt, here, 3, &tmpNode, &tmpName) == OK) { - if (tmpNode->nsGiven) { - tmp->nodeset = tmpNode->nodeset; - tmp->nsGiven = tmpNode->nsGiven; - } - } - } - } - } - else { - here->VDIOposPrimeNode = here->VDMOSsNode; - } - - if ((here->VDMOSthermal) && (model->VDMOSrthjcGiven)) { - if (here->VDMOStempNode == -1) { - error = CKTmkVolt(ckt,&tmp,here->VDMOSname,"Tj"); - if (error) return(error); - here->VDMOStempNode = tmp->number; - } - if (here->VDMOStcaseNode == -1) { - error = CKTmkVolt(ckt,&tmp,here->VDMOSname,"Tc"); - if (error) return(error); - here->VDMOStcaseNode = tmp->number; - } - if(here->VDMOSvcktTbranch == 0) { - error = CKTmkCur(ckt,&tmp,here->VDMOSname,"VcktTemp"); - if(error) return(error); - here->VDMOSvcktTbranch = tmp->number; - } - if (here->VDMOStNodePrime == 0) { - error = CKTmkVolt(ckt, &tmp, here->VDMOSname, "cktTemp"); - if (error) return(error); - here->VDMOStNodePrime = tmp->number; - } - } else { - here->VDMOStempNode = 0; - here->VDMOStcaseNode = 0; - } - - /* macro to make elements with built in test for out of memory */ -#define TSTALLOC(ptr,first,second) \ -do { if((here->ptr = SMPmakeElt(matrix, here->first, here->second)) == NULL){\ - return(E_NOMEM);\ -} } while(0) - - TSTALLOC(VDMOSDdPtr, VDMOSdNode, VDMOSdNode); - TSTALLOC(VDMOSGgPtr, VDMOSgNode, VDMOSgNode); - TSTALLOC(VDMOSSsPtr, VDMOSsNode, VDMOSsNode); - TSTALLOC(VDMOSDPdpPtr, VDMOSdNodePrime, VDMOSdNodePrime); - TSTALLOC(VDMOSSPspPtr, VDMOSsNodePrime, VDMOSsNodePrime); - TSTALLOC(VDMOSGPgpPtr, VDMOSgNodePrime, VDMOSgNodePrime); - TSTALLOC(VDMOSDdpPtr, VDMOSdNode, VDMOSdNodePrime); - TSTALLOC(VDMOSGPdpPtr, VDMOSgNodePrime, VDMOSdNodePrime); - TSTALLOC(VDMOSGPspPtr, VDMOSgNodePrime, VDMOSsNodePrime); - TSTALLOC(VDMOSSspPtr, VDMOSsNode, VDMOSsNodePrime); - TSTALLOC(VDMOSDPspPtr, VDMOSdNodePrime, VDMOSsNodePrime); - TSTALLOC(VDMOSDPdPtr, VDMOSdNodePrime, VDMOSdNode); - TSTALLOC(VDMOSDPgpPtr, VDMOSdNodePrime, VDMOSgNodePrime); - TSTALLOC(VDMOSSPgpPtr, VDMOSsNodePrime, VDMOSgNodePrime); - TSTALLOC(VDMOSSPsPtr, VDMOSsNodePrime, VDMOSsNode); - TSTALLOC(VDMOSSPdpPtr, VDMOSsNodePrime, VDMOSdNodePrime); - - TSTALLOC(VDMOSGgpPtr, VDMOSgNode, VDMOSgNodePrime); - TSTALLOC(VDMOSGPgPtr, VDMOSgNodePrime, VDMOSgNode); - - TSTALLOC(VDMOSDsPtr, VDMOSdNode, VDMOSsNode); - TSTALLOC(VDMOSSdPtr, VDMOSsNode, VDMOSdNode); - - TSTALLOC(VDIORPdPtr, VDIOposPrimeNode, VDMOSdNode); - TSTALLOC(VDIODrpPtr, VDMOSdNode, VDIOposPrimeNode); - TSTALLOC(VDIOSrpPtr, VDMOSsNode, VDIOposPrimeNode); - TSTALLOC(VDIORPsPtr, VDIOposPrimeNode, VDMOSsNode); - TSTALLOC(VDIORPrpPtr, VDIOposPrimeNode, VDIOposPrimeNode); - - if ((here->VDMOSthermal) && (model->VDMOSrthjcGiven)) { - TSTALLOC(VDMOSTemptempPtr, VDMOStempNode, VDMOStempNode); /* Transistor thermal contribution */ - TSTALLOC(VDMOSTempdpPtr, VDMOStempNode, VDMOSdNodePrime); - TSTALLOC(VDMOSTempspPtr, VDMOStempNode, VDMOSsNodePrime); - TSTALLOC(VDMOSTempgpPtr, VDMOStempNode, VDMOSgNodePrime); - TSTALLOC(VDMOSGPtempPtr, VDMOSgNodePrime, VDMOStempNode); - TSTALLOC(VDMOSDPtempPtr, VDMOSdNodePrime, VDMOStempNode); - TSTALLOC(VDMOSSPtempPtr, VDMOSsNodePrime, VDMOStempNode); - - TSTALLOC(VDIOTempposPrimePtr, VDMOStempNode, VDIOposPrimeNode);/* Diode thermal contribution */ - TSTALLOC(VDMOSTempdPtr, VDMOStempNode, VDMOSdNode); - TSTALLOC(VDIOPosPrimetempPtr, VDIOposPrimeNode, VDMOStempNode); - TSTALLOC(VDMOSDtempPtr, VDMOSdNode, VDMOStempNode); - TSTALLOC(VDMOStempSPtr, VDMOStempNode, VDMOSsNode); - TSTALLOC(VDMOSSTempPtr, VDMOSsNode, VDMOStempNode); - - TSTALLOC(VDMOSTcasetcasePtr, VDMOStcaseNode, VDMOStcaseNode); /* Rthjc between tj and tcase*/ - TSTALLOC(VDMOSTcasetempPtr, VDMOStcaseNode, VDMOStempNode); - TSTALLOC(VDMOSTemptcasePtr, VDMOStempNode, VDMOStcaseNode); - TSTALLOC(VDMOSTptpPtr, VDMOStNodePrime, VDMOStNodePrime); /* Rthca between tcase and Vsrc */ - TSTALLOC(VDMOSTptcasePtr, VDMOStNodePrime, VDMOStempNode); - TSTALLOC(VDMOSTcasetpPtr, VDMOStempNode, VDMOStNodePrime); - TSTALLOC(VDMOSCktTcktTPtr, VDMOSvcktTbranch, VDMOSvcktTbranch); /* Vsrc=cktTemp to gnd */ - TSTALLOC(VDMOSCktTtpPtr, VDMOSvcktTbranch, VDMOStNodePrime); - TSTALLOC(VDMOSTpcktTPtr, VDMOStNodePrime, VDMOSvcktTbranch); - } - } - } - return(OK); -} - -int -VDMOSunsetup(GENmodel *inModel, CKTcircuit *ckt) -{ - VDMOSmodel *model; - VDMOSinstance *here; - - for (model = (VDMOSmodel *)inModel; model != NULL; - model = VDMOSnextModel(model)) - { - for (here = VDMOSinstances(model); here != NULL; - here = VDMOSnextInstance(here)) - { - if (here->VDMOSsNodePrime > 0 - && here->VDMOSsNodePrime != here->VDMOSsNode) - CKTdltNNum(ckt, here->VDMOSsNodePrime); - here->VDMOSsNodePrime = 0; - - if (here->VDMOSdNodePrime > 0 - && here->VDMOSdNodePrime != here->VDMOSdNode) - CKTdltNNum(ckt, here->VDMOSdNodePrime); - here->VDMOSdNodePrime = 0; - - if (here->VDMOSgNodePrime > 0 - && here->VDMOSgNodePrime != here->VDMOSgNode) - CKTdltNNum(ckt, here->VDMOSgNodePrime); - here->VDMOSgNodePrime = 0; - - if (here->VDIOposPrimeNode > 0 - && here->VDIOposPrimeNode != here->VDMOSsNode) - CKTdltNNum(ckt, here->VDIOposPrimeNode); - here->VDIOposPrimeNode = 0; - - if ((here->VDMOSthermal) && (model->VDMOSrthjcGiven)) { - if (here->VDMOStNodePrime > 0) - CKTdltNNum(ckt, here->VDMOStNodePrime); - here->VDMOStNodePrime = 0; - if (here->VDMOSvcktTbranch > 0) - CKTdltNNum(ckt, here->VDMOSvcktTbranch); - here->VDMOSvcktTbranch = 0; - } - - } - } - return OK; -} diff --git a/src/spicelib/devices/vdmos/vdmossoachk.c b/src/spicelib/devices/vdmos/vdmossoachk.c deleted file mode 100644 index e3a6008fb..000000000 --- a/src/spicelib/devices/vdmos/vdmossoachk.c +++ /dev/null @@ -1,237 +0,0 @@ -/********** -Copyright 2013 Dietmar Warning. All rights reserved. -Author: 2013 Dietmar Warning -**********/ - -#include "ngspice/ngspice.h" -#include "ngspice/cktdefs.h" -#include "vdmosdefs.h" -#include "ngspice/trandefs.h" -#include "ngspice/sperror.h" -#include "ngspice/suffix.h" -#include "ngspice/cpdefs.h" - - -int -VDMOSsoaCheck(CKTcircuit *ckt, GENmodel *inModel) -{ - VDMOSmodel *model = (VDMOSmodel *) inModel; - VDMOSinstance *here; - double vgs, vgd, vds; /* actual mos voltages */ - int maxwarns; - static int warns_vgs = 0, warns_vgd = 0, warns_vds = 0, warns_id = 0, warns_idr = 0, warns_pd = 0, warns_te = 0; - double id; /* current VDMOS current */ - double idr; /* current reverse diode current */ - double pd; /* current VDMOS power dissipation */ - double pd_max; /* maximum VDMOS power */ - double te; /* current VDMOS temperature */ - - if (!ckt) { - warns_vgs = 0; - warns_vgd = 0; - warns_vds = 0; - warns_id = 0; - warns_idr = 0; - warns_pd = 0; - warns_te = 0; - return OK; - } - - maxwarns = ckt->CKTsoaMaxWarns; - - for (; model; model = VDMOSnextModel(model)) { - - for (here = VDMOSinstances(model); here; here = VDMOSnextInstance(here)) { - - vgs = ckt->CKTrhsOld [here->VDMOSgNode] - - ckt->CKTrhsOld [here->VDMOSsNode]; - - vgd = ckt->CKTrhsOld [here->VDMOSgNode] - - ckt->CKTrhsOld [here->VDMOSdNode]; - - vds = ckt->CKTrhsOld [here->VDMOSdNode] - - ckt->CKTrhsOld [here->VDMOSsNode]; - - if (!model->VDMOSvgsrMaxGiven) { - if (fabs(vgs) > model->VDMOSvgsMax) - if (warns_vgs < maxwarns) { - soa_printf(ckt, (GENinstance*) here, - "Vgs=%g has exceeded Vgs_max=%g\n", - vgs, model->VDMOSvgsMax); - warns_vgs++; - } - } else { - if (model->VDMOStype > 0) { - if (vgs > model->VDMOSvgsMax) - if (warns_vgs < maxwarns) { - soa_printf(ckt, (GENinstance*) here, - "Vgs=%g has exceeded Vgs_max=%g\n", - vgs, model->VDMOSvgsMax); - warns_vgs++; - } - if (-1*vgs > model->VDMOSvgsrMax) - if (warns_vgs < maxwarns) { - soa_printf(ckt, (GENinstance*) here, - "Vgs=%g has exceeded Vgsr_max=%g\n", - vgs, model->VDMOSvgsrMax); - warns_vgs++; - } - } else { - if (vgs > model->VDMOSvgsrMax) - if (warns_vgs < maxwarns) { - soa_printf(ckt, (GENinstance*) here, - "Vgs=%g has exceeded Vgsr_max=%g\n", - vgs, model->VDMOSvgsrMax); - warns_vgs++; - } - if (-1*vgs > model->VDMOSvgsMax) - if (warns_vgs < maxwarns) { - soa_printf(ckt, (GENinstance*) here, - "Vgs=%g has exceeded Vgs_max=%g\n", - vgs, model->VDMOSvgsMax); - warns_vgs++; - } - } - } - - if (!model->VDMOSvgdrMaxGiven) { - if (fabs(vgd) > model->VDMOSvgdMax) - if (warns_vgd < maxwarns) { - soa_printf(ckt, (GENinstance*) here, - "Vgd=%g has exceeded Vgd_max=%g\n", - vgd, model->VDMOSvgdMax); - warns_vgd++; - } - } else { - if (model->VDMOStype > 0) { - if (vgd > model->VDMOSvgdMax) - if (warns_vgd < maxwarns) { - soa_printf(ckt, (GENinstance*) here, - "Vgd=%g has exceeded Vgd_max=%g\n", - vgd, model->VDMOSvgdMax); - warns_vgd++; - } - if (-1*vgd > model->VDMOSvgdrMax) - if (warns_vgd < maxwarns) { - soa_printf(ckt, (GENinstance*) here, - "Vgd=%g has exceeded Vgdr_max=%g\n", - vgd, model->VDMOSvgdrMax); - warns_vgd++; - } - } else { - if (vgd > model->VDMOSvgdrMax) - if (warns_vgd < maxwarns) { - soa_printf(ckt, (GENinstance*) here, - "Vgd=%g has exceeded Vgdr_max=%g\n", - vgd, model->VDMOSvgdrMax); - warns_vgd++; - } - if (-1*vgd > model->VDMOSvgdMax) - if (warns_vgd < maxwarns) { - soa_printf(ckt, (GENinstance*) here, - "Vgd=%g has exceeded Vgd_max=%g\n", - vgd, model->VDMOSvgdMax); - warns_vgd++; - } - } - } - - if (fabs(vds) > model->VDMOSvdsMax) - if (warns_vds < maxwarns) { - soa_printf(ckt, (GENinstance*) here, - "Vds=%g has exceeded Vds_max=%g\n", - vds, model->VDMOSvdsMax); - warns_vds++; - } - - /* max. drain current */ - id = fabs(here->VDMOScd); - if (model->VDMOSid_maxGiven && id > fabs(model->VDMOSid_max)) - if (warns_id < maxwarns) { - soa_printf(ckt, (GENinstance*)here, - "Id=%.4g A at Vd=%.4g V has exceeded Id_max=%.4g A\n", - id, vds, model->VDMOSid_max); - warns_id++; - } - - /* max. reverse current */ - idr = fabs(*(ckt->CKTstate0 + here->VDIOcurrent) * -1. + here->VDMOScd); - if (model->VDMOSidr_maxGiven && idr > fabs(model->VDMOSidr_max)) - if (warns_idr < maxwarns) { - soa_printf(ckt, (GENinstance*)here, - "Idr=%.4g A at Vd=%.4g V has exceeded Idr_max=%.4g A\n", - fabs(idr), vds, model->VDMOSidr_max); - warns_idr++; - } - - pd = fabs((id + idr) * vds); - pd += fabs(*(ckt->CKTstate0 + here->VDMOScqgd) * - (*(ckt->CKTrhsOld + here->VDMOSgNode) - - *(ckt->CKTrhsOld + here->VDMOSdNode))); - pd += fabs(*(ckt->CKTstate0 + here->VDMOScqgs) * - (*(ckt->CKTrhsOld + here->VDMOSgNode) - - *(ckt->CKTrhsOld + here->VDMOSsNode))); - - /* Calculate max power including derating: - up to tnom the derating is zero, - at maximum temp allowed the derating is 100%. - Device temperature by self-heating or given externally. */ - if (here->VDMOSthermal && model->VDMOSderatingGiven && model->VDMOSpd_maxGiven - && model->VDMOSte_maxGiven && model->VDMOStnomGiven) { - te = ckt->CKTrhsOld[here->VDMOStcaseNode]; - if (te < model->VDMOStnom - CONSTCtoK) - pd_max = model->VDMOSpd_max; - else { - pd_max = model->VDMOSpd_max - (te - model->VDMOStnom + CONSTCtoK) * model->VDMOSderating; - pd_max = (pd_max > 0) ? pd_max : 0.; - } - if (pd > pd_max) - if (warns_pd < maxwarns) { - soa_printf(ckt, (GENinstance*)here, - "Pd=%.4g W at Vd=%.4g V and Te=%.4g C has exceeded Pd_max=%.4g W\n", - pd, vds, te, pd_max); - warns_pd++; - } - if (te > model->VDMOSte_max) - if (warns_te < maxwarns) { - soa_printf(ckt, (GENinstance*)here, - "Te=%.4g C at Vd=%.4g V has exceeded te_max=%.4g C\n", - te, vds, model->VDMOSte_max); - warns_te++; - } - - } - /* Derating of max allowed power dissipation, without self-heating, - external temp given by .temp (global) or instance parameter 'temp', - therefore no temperature limits are calculated */ - else if (!here->VDMOSthermal && model->VDMOSderatingGiven && model->VDMOSpd_maxGiven && model->VDMOStnomGiven) { - if (here->VDMOStemp < model->VDMOStnom) - pd_max = model->VDMOSpd_max; - else { - pd_max = model->VDMOSpd_max - (here->VDMOStemp - model->VDMOStnom) * model->VDMOSderating; - pd_max = (pd_max > 0) ? pd_max : 0.; - } - if (pd > pd_max) - if (warns_pd < maxwarns) { - soa_printf(ckt, (GENinstance*)here, - "Pd=%.4g W at Vd=%.4g V and Te=%.4g C has exceeded Pd_max=%.4g W\n", - pd, vds, here->VDMOStemp - CONSTCtoK, pd_max); - warns_pd++; - } - } - /* No derating, max power is fixed by model parameter pd_max */ - else { - pd_max = model->VDMOSpd_max; - if (pd > pd_max) - if (warns_pd < maxwarns) { - soa_printf(ckt, (GENinstance*)here, - "Pd=%.4g W at Vd=%.4g V has exceeded Pd_max=%.4g W\n", - pd, vds, pd_max); - warns_pd++; - } - } - } - } - - return OK; -} diff --git a/src/spicelib/devices/vdmos/vdmostemp.c b/src/spicelib/devices/vdmos/vdmostemp.c deleted file mode 100644 index 53d92a548..000000000 --- a/src/spicelib/devices/vdmos/vdmostemp.c +++ /dev/null @@ -1,205 +0,0 @@ -/********** -Copyright 1990 Regents of the University of California. All rights reserved. -Author: 1985 Thomas L. Quarles -Modified: 2000 AlansFixes -VDMOS: 2018 Holger Vogt, 2020 Dietmar Warning -**********/ - - /* perform the temperature update to the vdmos */ - -#include "ngspice/ngspice.h" -#include "ngspice/cktdefs.h" -#include "vdmosdefs.h" -#include "ngspice/const.h" -#include "ngspice/sperror.h" -#include "ngspice/suffix.h" - -void VDMOStempUpdate(VDMOSmodel *inModel, VDMOSinstance *here, double Temp, CKTcircuit *ckt) { - - VDMOSmodel *model = (VDMOSmodel*)inModel; - - double egfet,egfet1; - double fact1,fact2; - double kt,kt1; - double arg1; - double ratio; - double phio; - double pbfact1,pbfact; - double vt,vtnom; - double xfc; - - fact1 = model->VDMOStnom/REFTEMP; - vtnom = model->VDMOStnom*CONSTKoverQ; - kt1 = CONSTboltz * model->VDMOStnom; - egfet1 = 1.16-(7.02e-4*model->VDMOStnom*model->VDMOStnom)/ - (model->VDMOStnom+1108); - arg1 = -egfet1/(kt1+kt1)+1.1150877/(CONSTboltz*(REFTEMP+REFTEMP)); - pbfact1 = -2*vtnom *(1.5*log(fact1)+CHARGE*arg1); - - xfc = log(1 - model->VDIOdepletionCapCoeff); - - double arg; /* 1 - fc */ - - double dt = Temp - model->VDMOStnom; - - /* vdmos temperature model */ - ratio = Temp/model->VDMOStnom; - here->VDMOStTransconductance = model->VDMOStransconductance - * here->VDMOSm * pow(ratio, model->VDMOSmu); - - here->VDMOStVth = model->VDMOSvth0 - model->VDMOStype * model->VDMOStcvth * dt; - - here->VDMOStksubthres = model->VDMOSksubthres * (1.0 + (model->VDMOStksubthres1 * dt) + (model->VDMOStksubthres2 * dt * dt)); - - if (model->VDMOStexp0Given) - here->VDMOSdrainResistance = model->VDMOSdrainResistance / here->VDMOSm * pow(ratio, model->VDMOStexp0); - else - here->VDMOSdrainResistance = model->VDMOSdrainResistance / here->VDMOSm * (1.0 + (model->VDMOStrd1 * dt) + (model->VDMOStrd2 * dt * dt)); - - here->VDMOSgateConductance = here->VDMOSgateConductance / (1.0 + (model->VDMOStrg1 * dt) + (model->VDMOStrg2 * dt * dt)); - - here->VDMOSsourceConductance = here->VDMOSsourceConductance / (1.0 + (model->VDMOStrs1 * dt) + (model->VDMOStrs2 * dt * dt)); - - if (model->VDMOSqsGiven) - here->VDMOSqsResistance = model->VDMOSqsResistance / here->VDMOSm * pow(ratio, model->VDMOStexp1); - - vt = Temp * CONSTKoverQ; - fact2 = Temp/REFTEMP; - kt = Temp * CONSTboltz; - egfet = 1.16-(7.02e-4*Temp*Temp)/ - (Temp+1108); - arg = -egfet/(kt+kt)+1.1150877/(CONSTboltz*(REFTEMP+REFTEMP)); - pbfact = -2*vt *(1.5*log(fact2)+CHARGE*arg); - - phio = (model->VDMOSphi - pbfact1) / fact1; - here->VDMOStPhi = fact2 * phio + pbfact; /* needed for distortion analysis */ - - /* body diode temperature model */ - double pbo, gmaold; - double gmanew, factor; - double tBreakdownVoltage, vte, cbv; - double xbv, xcbv, tol, iter; - double arg1_dT, arg2, arg2_dT; - - /* Junction grading temperature adjust */ - factor = 1.0 + (model->VDIOgradCoeffTemp1 * dt) - + (model->VDIOgradCoeffTemp2 * dt * dt); - here->VDIOtGradingCoeff = model->VDIOgradCoeff * factor; - - pbo = (model->VDIOjunctionPot - pbfact1) / fact1; - gmaold = (model->VDIOjunctionPot - pbo) / pbo; - here->VDIOtJctCap = here->VDMOSm * model->VDIOjunctionCap / - (1 + here->VDIOtGradingCoeff* - (400e-6*(model->VDMOStnom - REFTEMP) - gmaold)); - here->VDIOtJctPot = pbfact + fact2*pbo; - gmanew = (here->VDIOtJctPot - pbo) / pbo; - here->VDIOtJctCap *= 1 + here->VDIOtGradingCoeff* - (400e-6*(Temp - REFTEMP) - gmanew); - - vte = model->VDIOn*vt; - - arg1 = ((Temp / model->VDMOStnom) - 1) * model->VDIOeg / vte; - arg1_dT = model->VDIOeg / (vte*model->VDMOStnom) - - model->VDIOeg*(Temp/model->VDMOStnom -1)/(vte*Temp); - arg2 = model->VDIOxti / model->VDIOn * log(Temp / model->VDMOStnom); - arg2_dT = model->VDIOxti / model->VDIOn / Temp; - here->VDIOtSatCur = here->VDMOSm * model->VDIOjctSatCur * exp(arg1 + arg2); - here->VDIOtSatCur_dT = here->VDMOSm * model->VDIOjctSatCur * exp(arg1 + arg2) * (arg1_dT + arg2_dT); - - /* the defintion of f1, just recompute after temperature adjusting - * all the variables used in it */ - here->VDIOtF1 = here->VDIOtJctPot* - (1 - exp((1 - here->VDIOtGradingCoeff)*xfc)) / - (1 - here->VDIOtGradingCoeff); - /* same for Depletion Capacitance */ - here->VDIOtDepCap = model->VDIOdepletionCapCoeff * - here->VDIOtJctPot; - - /* and Vcrit */ - here->VDIOtVcrit = vte * log(vte / (CONSTroot2*here->VDIOtSatCur)); - - /* limit junction potential to max of 1/FC */ - if (here->VDIOtDepCap > 2.5) { - here->VDIOtJctPot = 2.5 / model->VDIOn; - here->VDIOtDepCap = model->VDIOn*here->VDIOtJctPot; - SPfrontEnd->IFerrorf(ERR_WARNING, - "%s: junction potential VJ too large, limited to %f", - model->VDMOSmodName, here->VDIOtJctPot); - } - - /* and now to compute the breakdown voltage, again, using - * temperature adjusted basic parameters */ - if (model->VDIObvGiven) { - /* tlev == 0 */ - tBreakdownVoltage = fabs(model->VDIObv); - - cbv = model->VDIOibv; - - if (cbv < here->VDIOtSatCur * tBreakdownVoltage / vt) { -#ifdef TRACE - cbv = here->VDIOtSatCur * tBreakdownVoltage / vt; - SPfrontEnd->IFerrorf(ERR_WARNING, "%s: breakdown current increased to %g to resolve", here->VDMOSname, cbv); - SPfrontEnd->IFerrorf(ERR_WARNING, - "incompatibility with specified saturation current"); -#endif - xbv = tBreakdownVoltage; - } - else { - tol = ckt->CKTreltol*cbv; - xbv = tBreakdownVoltage - model->VDIObrkdEmissionCoeff*vt*log(1 + cbv / - (here->VDIOtSatCur)); - for (iter = 0; iter < 25; iter++) { - xbv = tBreakdownVoltage - model->VDIObrkdEmissionCoeff*vt*log(cbv / - (here->VDIOtSatCur) + 1 - xbv / vt); - xcbv = here->VDIOtSatCur * - (exp((tBreakdownVoltage - xbv) / (model->VDIObrkdEmissionCoeff*vt)) - 1 + xbv / vt); - if (fabs(xcbv - cbv) <= tol) goto matched; - } -#ifdef TRACE - SPfrontEnd->IFerrorf(ERR_WARNING, "%s: unable to match forward and reverse diode regions: bv = %g, ibv = %g", here->VDMOSname, xbv, xcbv); -#endif - } - matched: - here->VDIOtBrkdwnV = xbv; - } - - /* transit time temperature adjust */ - factor = 1.0 + (model->VDIOtranTimeTemp1 * dt) - + (model->VDIOtranTimeTemp2 * dt * dt); - here->VDIOtTransitTime = model->VDIOtransitTime * factor; - - /* Series resistance temperature adjust */ - factor = 1.0 + (model->VDIOtrb1) * dt - + (model->VDIOtrb2 * dt * dt); - here->VDIOtConductance = here->VDIOconductance / factor; - here->VDIOtConductance_dT = -here->VDIOconductance * (model->VDIOtrb1 + model->VDIOtrb2 * dt) / (factor*factor); - - here->VDIOtF2 = exp((1 + here->VDIOtGradingCoeff)*xfc); - here->VDIOtF3 = 1 - model->VDIOdepletionCapCoeff* - (1 + here->VDIOtGradingCoeff); -} - -int -VDMOStemp(GENmodel *inModel, CKTcircuit *ckt) -{ - VDMOSmodel *model = (VDMOSmodel*)inModel; - VDMOSinstance *here; - - /* loop through all the vdmos models */ - for( ; model != NULL; model = VDMOSnextModel(model)) { - - /* loop through all the instances */ - for(here=VDMOSinstances(model);here;here=VDMOSnextInstance(here)) { - - if(!here->VDMOSdtempGiven) here->VDMOSdtemp = 0.0; - - if(!here->VDMOStempGiven) - here->VDMOStemp = ckt->CKTtemp + here->VDMOSdtemp; - - VDMOStempUpdate(model, here, here->VDMOStemp, ckt); - - } /* instance */ - - } /* model */ - return(OK); -} diff --git a/src/spicelib/devices/vdmos/vdmostrun.c b/src/spicelib/devices/vdmos/vdmostrun.c deleted file mode 100644 index 1b35dfffe..000000000 --- a/src/spicelib/devices/vdmos/vdmostrun.c +++ /dev/null @@ -1,30 +0,0 @@ -/********** -Copyright 1990 Regents of the University of California. All rights reserved. -Author: 1985 Thomas L. Quarles -**********/ -/* - */ - -#include "ngspice/ngspice.h" -#include "ngspice/cktdefs.h" -#include "vdmosdefs.h" -#include "ngspice/sperror.h" -#include "ngspice/suffix.h" - - -int -VDMOStrunc(GENmodel *inModel, CKTcircuit *ckt, double *timeStep) -{ - VDMOSmodel *model = (VDMOSmodel *)inModel; - VDMOSinstance *here; - - for( ; model != NULL; model = VDMOSnextModel(model)) { - for(here=VDMOSinstances(model);here!=NULL;here = VDMOSnextInstance(here)){ - - CKTterr(here->VDMOSqgs,ckt,timeStep); - CKTterr(here->VDMOSqgd,ckt,timeStep); - CKTterr(here->VDIOcapCharge,ckt,timeStep); - } - } - return(OK); -} diff --git a/src/xspice/.gitignore b/src/xspice/.gitignore deleted file mode 100644 index 4985854d5..000000000 --- a/src/xspice/.gitignore +++ /dev/null @@ -1,6 +0,0 @@ -/cmpp/cmpp - -/icm/GNUmakefile -/icm/makedefs - -!/examples/*/Makefile diff --git a/src/xspice/Makefile.am b/src/xspice/Makefile.am deleted file mode 100644 index 2718b4f79..000000000 --- a/src/xspice/Makefile.am +++ /dev/null @@ -1,29 +0,0 @@ -# Process this file with automake - -EXTRA_DIST = README examples icm xspice.c .gitignore - -## This is removed because icm relies upon the existance of all other -## libs. It is currently compiled manually, last. -##SUBDIRS = mif cm enh evt ipc idn icm - -SUBDIRS = mif cm enh evt ipc idn cmpp icm - - -dist-hook: - rm -f "$(distdir)/icm/makedefs" - rm -f "$(distdir)/icm/GNUmakefile" - rm -rf `find $(distdir)/icm -name .deps` - rm -rf `find $(distdir)/icm -name *.o` - rm -rf `find $(distdir)/icm -name *.cm` - for sub in analog digital spice2poly xtradev xtraevt table ; do \ - rm -rf `find $(distdir)/icm/$$sub -name cmextrn.h`; \ - rm -rf `find $(distdir)/icm/$$sub -name cminfo.h`; \ - rm -rf `find $(distdir)/icm/$$sub -name udnextrn.h`; \ - rm -rf `find $(distdir)/icm/$$sub -name udninfo.h`; \ - rm -rf `find $(distdir)/icm/$$sub -name ifspec.c`; \ - rm -rf `find $(distdir)/icm/$$sub -name cfunc.c`; \ - rm -rf `find $(distdir)/icm/$$sub -name dlmain.c`; \ - rm -rf `find $(distdir)/icm/$$sub -name objects.inc`; \ - done - -MAINTAINERCLEANFILES = Makefile.in diff --git a/src/xspice/README b/src/xspice/README deleted file mode 100644 index 5c84d38ec..000000000 --- a/src/xspice/README +++ /dev/null @@ -1,75 +0,0 @@ -ngspice Xspice code model support. -2012 05 06 --------------------------------------- - -Use configure the flag --enable-xspice to compile xspice support in, -when you run the ./configure script. -This creates a new command, "codemodel", which you can -use to load a codemodel. - -The command codemodel attempts to load all the codemodels specified in the -arguments, eg -"ngspice 1 ->codemodel /usr/lib/ngspice/analog.cm /usr/lib/ngspice/spice2poly.cm" - -( note: the codemodel path must begin with ./ or / to work ) - -The codemodels are automatically compiled and then installed in -${prefix}/lib/ngspice/ when ngspice is installed. - -To create your own codemodels: - -* Unpack the ngspice source and compile as normal. - -* cd src/xspice/icm - -* make the directory structure for the new library: - Create the nested library_name and module_name directories and copy the - source code to the module_name directories - - src/xspice/icm/ / - modpath.lst udnpath.lst - / - files: - cfunc.mod ifspec.ifs ( for a device ) - or - udnfunc.c ( or a user defined node ) - -* For each library create the files modpath.lst and udnpath.lst, which - contain a list of the user devices and nodes respectivily, in the location - shown above. - -* Edit src/xspice/icm/makedefs.in and alter the CMDIRS line to include - your library directory. - -* Run make in the src/xspice/icm directory. ( the makefile does the rest ) - -The codemodel can be then found in - src/xspice/icm//.cm - - ------------------------------------------ -SPICE2 POLY codemodel support. - -SPICE2 POLY attributes are now available for controlled sources. - -To use POLY attributes, configure and install ( make install ) -ngspice with the --enable-xspice flag set as described above. - -After compilation of ngspice edit -${prefix}/share/tclspice/scripts/spinit or -${prefix}/share/ngspice/scripts/spinit -( depending if you included tcl support or not ) - -and uncomment the -"* codemodel /usr/lib/spice/spice2poly.cm" -line and edit as required. ( the path to spice2poly.cm may be wrong ) -( alternativily create a ~/.spiceinit file with the above codemodel line ) - -Then read in your SPICE netlist. SPICE 2 POLY attributes in -controlled sources will be translated into .models invoking the -spice2poly codemodel. You should be able to run ngspice and simulate -in the usual way! - -Please direct questions/comments/complaints to the ngspice user's list -or forum. - diff --git a/src/xspice/cm/Makefile.am b/src/xspice/cm/Makefile.am deleted file mode 100644 index aa1b36795..000000000 --- a/src/xspice/cm/Makefile.am +++ /dev/null @@ -1,19 +0,0 @@ -## Process this file with automake to produce Makefile.in -# -# JW 3/9/01 - had a go and makeing an autoconf script. - -noinst_LTLIBRARIES = libcmxsp.la - -libcmxsp_la_SOURCES = \ - cm.c \ - cmevt.c \ - cmmeters.c \ - cmutil.c \ - cmexport.c - - - -AM_CPPFLAGS = @AM_CPPFLAGS@ -I$(top_srcdir)/src/include -I$(top_srcdir)/src/spicelib/devices -AM_CFLAGS = $(STATIC) - -MAINTAINERCLEANFILES = Makefile.in diff --git a/src/xspice/cm/cm.c b/src/xspice/cm/cm.c deleted file mode 100644 index 0b9626bd6..000000000 --- a/src/xspice/cm/cm.c +++ /dev/null @@ -1,804 +0,0 @@ -/* =========================================================================== -FILE CM.c - -MEMBER OF process XSPICE - -Public Domain - -Georgia Tech Research Corporation -Atlanta, Georgia 30332 -PROJECT A-8503 - -AUTHORS - - 9/12/91 Bill Kuhn - -MODIFICATIONS - - - -SUMMARY - - This file contains functions callable from user code models. - -INTERFACES - - cm_analog_alloc() - cm_analog_get_ptr() - cm_analog_integrate() - cm_analog_converge() - cm_analog_set_temp_bkpt() - cm_analog_set_perm_bkpt() - cm_analog_ramp_factor() - cm_analog_not_converged() - cm_analog_auto_partial() - - cm_message_get_errmsg() - cm_message_send() - cm_get_path() - cm_get_circuit() - - cm_get_node_name() - cm_probe_node() - -REFERENCED FILES - - None. - -NON-STANDARD FEATURES - - None. - -=========================================================================== */ -#include "ngspice/ngspice.h" -#include "ngspice/cm.h" -#include "ngspice/evt.h" -#include "ngspice/evtudn.h" -#include "ngspice/enh.h" -#include "ngspice/mif.h" -#include "ngspice/cktdefs.h" -//#include "util.h" - - - - - -static void cm_static_integrate(int byte_index, - double integrand, - double *integral, - double *partial); - -/* - -cm_analog_alloc() - -This function is called from code model C functions to allocate -state storage for a particular instance. It computes the number -of doubles that need to be allocated in SPICE's state storage -vectors from the number of bytes specified in it's argument and -then allocates space for the states. An index into the SPICE -state-vectors is stored in the instance's data structure along -with a ``tag'' variable supplied by the caller so that the location -of the state storage area can be found by cm_analog_get_ptr(). - -*/ - -void cm_analog_alloc( - int tag, /* The user-specified tag for this block of memory */ - int bytes) /* The number of bytes to allocate */ -{ - MIFinstance *here; - CKTcircuit *ckt; - - Mif_State_t *state; - - int doubles_needed; - int i; - - - /* Get the address of the ckt and instance structs from g_mif_info */ - here = g_mif_info.instance; - ckt = g_mif_info.ckt; - - /* Scan states in instance struct and see if tag has already been used */ - for(i = 0; i < here->num_state; i++) { - if(tag == here->state[i].tag) { - g_mif_info.errmsg = "ERROR - cm_analog_alloc() - Tag already used in previous call\n"; - return; - } - } - - /* Compute number of doubles needed and allocate space in ckt->CKTstates[i] */ - doubles_needed = bytes / (int) sizeof(double) + 1; - - /* Allocate space in instance struct for this state descriptor */ - if(here->num_state == 0) { - here->num_state = 1; - here->state = TMALLOC(Mif_State_t, 1); - } - else { - here->num_state++; - here->state = TREALLOC(Mif_State_t, here->state, here->num_state); - } - - /* Fill in the members of the state descriptor struct */ - state = &(here->state[here->num_state - 1]); - state->tag = tag; - state->index = ckt->CKTnumStates; - state->doubles = doubles_needed; - state->bytes = bytes; - - - /* Add the states to the ckt->CKTstates vectors */ - ckt->CKTnumStates += doubles_needed; - for(i=0;i<=ckt->CKTmaxOrder+1;i++) { - if(ckt->CKTnumStates == doubles_needed) - ckt->CKTstates[i] = TMALLOC(double, ckt->CKTnumStates); - else - ckt->CKTstates[i] = TREALLOC(double, ckt->CKTstates[i], ckt->CKTnumStates); - } -} - - -/* -cm_analog_get_ptr() - -This function is called from code model C functions to return a -pointer to state storage allocated with cm_analog_alloc(). A tag -specified in its argument list is used to locate the state in -question. A second argument specifies whether the desired state -is for the current timestep or from a preceding timestep. The -location of the state in memory is then computed and returned. -*/ - -void *cm_analog_get_ptr( - int tag, /* The user-specified tag for this block of memory */ - int timepoint) /* The timepoint of interest - 0=current 1=previous */ -{ - MIFinstance *here; - CKTcircuit *ckt; - - Mif_State_t *state=NULL; - - Mif_Boolean_t got_tag; - - int i; - - - /* Get the address of the ckt and instance structs from g_mif_info */ - here = g_mif_info.instance; - ckt = g_mif_info.ckt; - - /* Scan states in instance struct and see if tag exists */ - for(got_tag = MIF_FALSE, i = 0; i < here->num_state; i++) { - if(tag == here->state[i].tag) { - state = &(here->state[i]); - got_tag = MIF_TRUE; - break; - } - } - - /* Return error if tag not found */ - if(! got_tag) { - g_mif_info.errmsg = "ERROR - cm_analog_get_ptr() - Bad tag\n"; - return(NULL); - } - - /* Return error if timepoint is not 0 or 1 */ - if((timepoint < 0) || (timepoint > 1)) { - g_mif_info.errmsg = "ERROR - cm_analog_get_ptr() - Bad timepoint\n"; - return(NULL); - } - - /* Return address of requested state in ckt->CKTstates[timepoint] vector */ - return( (void *) (ckt->CKTstates[timepoint] + state->index) ); - -} - - -/* -cm_analog_integrate() - -This function performs a numerical integration on the state -supplied in its argument list according to the integrand also -supplied in the argument list. The next value of the integral -and the partial derivative with respect to the integrand input is -returned. The integral argument must be a pointer to memory -previously allocated through a call to cm_analog_alloc(). If this is -the first call to cm_analog_integrate(), information is entered into the -instance structure to mark that the integral should be processed -by MIFtrunc and MIFconvTest. -*/ - -int cm_analog_integrate( - double integrand, /* The integrand */ - double *integral, /* The current and returned value of integral */ - double *partial) /* The partial derivative of integral wrt integrand */ -{ - - MIFinstance *here; - CKTcircuit *ckt; - - Mif_Intgr_t *intgr; - Mif_Boolean_t got_index; - - char *char_state0; - char *char_state; - - int byte_index; - int i; - - - /* Get the address of the ckt and instance structs from g_mif_info */ - here = g_mif_info.instance; - ckt = g_mif_info.ckt; - - /* Check to be sure we're in transient analysis */ - if(g_mif_info.circuit.anal_type != MIF_TRAN) { - g_mif_info.errmsg = - "ERROR - cm_analog_integrate() - Called in non-transient analysis\n"; - *partial = 0.0; - return(MIF_ERROR); - } - - /* Preliminary check to be sure argument was allocated by cm_analog_alloc() */ - if(ckt->CKTnumStates <= 0) { - g_mif_info.errmsg = - "ERROR - cm_analog_integrate() - Integral must be memory allocated by cm_analog_alloc()\n"; - *partial = 0.0; - return(MIF_ERROR); - } - - /* Compute byte offset from start of state0 vector */ - char_state0 = (char *) ckt->CKTstate0; - char_state = (char *) integral; - byte_index = (int) (char_state - char_state0); - - /* Check to be sure argument address is in range of state0 vector */ - if((byte_index < 0) || - (byte_index > (ckt->CKTnumStates - 1) * (int) sizeof(double))) { - g_mif_info.errmsg = - "ERROR - cm_analog_integrate() - Argument must be in state vector 0\n"; - *partial = 0.0; - return(MIF_ERROR); - } - - /* Scan the intgr array in the instance struct to see if already exists */ - for(got_index = MIF_FALSE, i = 0; i < here->num_intgr; i++) { - if(here->intgr[i].byte_index == byte_index) { - got_index = MIF_TRUE; - } - } - - /* Report error if not found and this is not the first load pass in tran analysis */ - if((! got_index) && (! g_mif_info.circuit.anal_init)) { - g_mif_info.errmsg = - "ERROR - cm_analog_integrate() - New integral and not initialization pass\n"; - *partial = 0.0; - return(MIF_ERROR); - } - - /* If new integral state, allocate space in instance */ - /* struct for this intgr descriptor and register it with */ - /* the cm_analog_converge() function */ - if(! got_index) { - if(here->num_intgr == 0) { - here->num_intgr = 1; - here->intgr = TMALLOC(Mif_Intgr_t, 1); - } - else { - here->num_intgr++; - here->intgr = TREALLOC(Mif_Intgr_t, here->intgr, here->num_intgr); - } - intgr = &(here->intgr[here->num_intgr - 1]); - intgr->byte_index = byte_index; - if(cm_analog_converge(integral)) { - printf("%s\n",g_mif_info.errmsg); - g_mif_info.errmsg = "ERROR - cm_analog_integrate() - Failure in cm_analog_converge() call\n"; - return(MIF_ERROR); - } - } - - /* Compute the new integral and the partial */ - cm_static_integrate(byte_index, integrand, integral, partial); - - return(MIF_OK); -} - - -/* -cm_analog_converge() - -This function registers a state variable allocated with -cm_analog_alloc() to be subjected to a convergence test at the end of -each iteration. The state variable must be a double. -Information is entered into the instance structure to mark that -the state variable should be processed by MIFconvTest. -*/ - -int cm_analog_converge( - double *state) /* The state to be converged */ -{ - MIFinstance *here; - CKTcircuit *ckt; - - Mif_Conv_t *conv; - - char *char_state0; - char *char_state; - - int byte_index; - int i; - - - /* Get the address of the ckt and instance structs from g_mif_info */ - here = g_mif_info.instance; - ckt = g_mif_info.ckt; - - /* Preliminary check to be sure argument was allocated by cm_analog_alloc() */ - if(ckt->CKTnumStates <= 0) { - g_mif_info.errmsg = - "ERROR - cm_analog_converge() - Argument must be memory allocated by cm_analog_alloc()\n"; - return(MIF_ERROR); - } - - /* Compute byte offset from start of state0 vector */ - char_state0 = (char *) ckt->CKTstate0; - char_state = (char *) state; - byte_index = (int) (char_state - char_state0); - - /* Check to be sure argument address is in range of state0 vector */ - if((byte_index < 0) || - (byte_index > (ckt->CKTnumStates - 1) * (int) sizeof(double))) { - g_mif_info.errmsg = - "ERROR - cm_analog_converge() - Argument must be in state vector 0\n"; - return(MIF_ERROR); - } - - /* Scan the conv array in the instance struct to see if already registered */ - /* If so, do nothing, just return */ - for(i = 0; i < here->num_conv; i++) { - if(here->conv[i].byte_index == byte_index) - return(MIF_OK); - } - - /* Allocate space in instance struct for this conv descriptor */ - if(here->num_conv == 0) { - here->num_conv = 1; - here->conv = TMALLOC(Mif_Conv_t, 1); - } - else { - here->num_conv++; - here->conv = TREALLOC(Mif_Conv_t, here->conv, here->num_conv); - } - - /* Fill in the conv descriptor data */ - conv = &(here->conv[here->num_conv - 1]); - conv->byte_index = byte_index; - conv->last_value = 1.0e30; /* There should be a better way ... */ - - return(MIF_OK); -} - - - -/* -cm_message_get_errmsg() - -This function returns the address of an error message string set -by a call to some code model support function. -*/ - -char *cm_message_get_errmsg(void) -{ - return(g_mif_info.errmsg); -} - - - - -/* -cm_analog_set_temp_bkpt() - -This function is called by a code model C function to set a -temporary breakpoint. These temporary breakpoints remain in -effect only until the next timestep is taken. A temporary -breakpoint added with a time less than the current time, but -greater than the last successful timestep causes the simulator to -abandon the current timestep and decrease the timestep to hit the -breakpoint. A temporary breakpoint with a time greater than the -current time causes the simulator to make the breakpoint the next -timepoint if the next timestep would produce a time greater than -that of the breakpoint. -*/ - - -int cm_analog_set_temp_bkpt( - double time) /* The time of the breakpoint to be set */ -{ - CKTcircuit *ckt; - - - /* Get the address of the ckt and instance structs from g_mif_info */ - ckt = g_mif_info.ckt; - - /* Make sure breakpoint is not prior to last accepted timepoint */ - if(time < ((ckt->CKTtime - ckt->CKTdelta) + ckt->CKTminBreak)) { - g_mif_info.errmsg = - "ERROR - cm_analog_set_temp_bkpt() - Time < last accepted timepoint\n"; - return(MIF_ERROR); - } - - /* If too close to a permanent breakpoint or the current time, discard it */ - if( (fabs(time - ckt->CKTbreaks[0]) < ckt->CKTminBreak) || - (fabs(time - ckt->CKTbreaks[1]) < ckt->CKTminBreak) || - (fabs(time - ckt->CKTtime) < ckt->CKTminBreak) ) - return(MIF_OK); - - /* If < current dynamic breakpoint, make it the current breakpoint */ - if( time < g_mif_info.breakpoint.current) - g_mif_info.breakpoint.current = time; - - return(MIF_OK); -} - - - - -/* -cm_analog_set_perm_bkpt() - -This function is called by a code model C function to set a -permanent breakpoint. These permanent breakpoints remain in -effect from the time they are introduced until the simulation -time equals or exceeds the breakpoint time. A permanent -breakpoint added with a time less than the current time, but -greater than the last successful timestep causes the simulator to -abandon the current timestep and decrease the timestep to hit the -breakpoint. A permanent breakpoint with a time greater than the -current time causes the simulator to make the breakpoint the next -timepoint if the next timestep would produce a time greater than -that of the breakpoint. -*/ - - -int cm_analog_set_perm_bkpt( - double time) /* The time of the breakpoint to be set */ -{ - CKTcircuit *ckt; - - - /* Get the address of the ckt and instance structs from g_mif_info */ - ckt = g_mif_info.ckt; - - /* Call cm_analog_set_temp_bkpt() to force backup if less than current time */ - if(time < (ckt->CKTtime + ckt->CKTminBreak)) - return(cm_analog_set_temp_bkpt(time)); - else - CKTsetBreak(ckt,time); - - return(MIF_OK); -} - - -/* -cm_analog_ramp_factor() - -This function returns the current value of the ramp factor -associated with the ``ramptime'' option. For this option -to work best, models with analog outputs that may be non-zero at -time zero should call this function and scale their outputs -and partials by the ramp factor. -*/ - - -double cm_analog_ramp_factor(void) -{ - - CKTcircuit *ckt; - - /* Get the address of the ckt and instance structs from g_mif_info */ - ckt = g_mif_info.ckt; - - - /* if ramptime == 0.0, no ramptime option given, so return 1.0 */ - /* this is the most common case, so it goes first */ - if(ckt->enh->ramp.ramptime == 0.0) - return(1.0); - - /* else if not transient analysis, return 1.0 */ - else if( (!(ckt->CKTmode & MODETRANOP)) && (!(ckt->CKTmode & MODETRAN)) ) - return(1.0); - - /* else if time >= ramptime, return 1.0 */ - else if(ckt->CKTtime >= ckt->enh->ramp.ramptime) - return(1.0); - - /* else time < end of ramp, so compute and return factor based on time */ - else - return(ckt->CKTtime / ckt->enh->ramp.ramptime); -} - - -/* ************************************************************ */ - - -/* - * Copyright (c) 1985 Thomas L. Quarles - * - * This is a modified version of the function NIintegrate() - * - */ - -static void cm_static_integrate(int byte_index, - double integrand, - double *integral, - double *partial) -{ - CKTcircuit *ckt; - - double intgr[7]; - double cur=0; - double *double_ptr; - - double ceq; - double geq; - - char *char_ptr; - - int i; - - - /* Get the address of the ckt struct from g_mif_info */ - ckt = g_mif_info.ckt; - - /* Get integral values from current and previous timesteps */ - for(i = 0; i <= ckt->CKTorder; i++) { - char_ptr = (char *) ckt->CKTstates[i]; - char_ptr += byte_index; - double_ptr = (double *) char_ptr; - intgr[i] = *double_ptr; - } - - - /* Do what SPICE3C1 does for its implicit integration */ - - switch(ckt->CKTintegrateMethod) { - - case TRAPEZOIDAL: - - switch(ckt->CKTorder) { - - case 1: - cur = ckt->CKTag[1] * intgr[1]; - break; - - case 2: - /* WARNING - This code needs to be redone. */ - /* The correct code should rely on one previous value */ - /* of cur as done in NIintegrate() */ - cur = -0.5 * ckt->CKTag[0] * intgr[1]; - break; - } - - break; - - case GEAR: - cur = 0.0; - - switch(ckt->CKTorder) { - - case 6: - cur += ckt->CKTag[6] * intgr[6]; - /* fall through */ - case 5: - cur += ckt->CKTag[5] * intgr[5]; - /* fall through */ - case 4: - cur += ckt->CKTag[4] * intgr[4]; - /* fall through */ - case 3: - cur += ckt->CKTag[3] * intgr[3]; - /* fall through */ - case 2: - cur += ckt->CKTag[2] * intgr[2]; - /* fall through */ - case 1: - cur += ckt->CKTag[1] * intgr[1]; - break; - - } - break; - - } - - ceq = cur; - geq = ckt->CKTag[0]; - - /* WARNING: Take this out when the case 2: above is fixed */ - if((ckt->CKTintegrateMethod == TRAPEZOIDAL) && - (ckt->CKTorder == 2)) - geq *= 0.5; - - - /* The following code is equivalent to */ - /* the solution of one matrix iteration to produce the */ - /* integral value. */ - - *integral = (integrand - ceq) / geq; - *partial = 1.0 / geq; - -} - - - - - -/* -cm_analog_not_converged() - -This function tells the simulator not to allow the current -iteration to be the final iteration. It is called when -a code model performs internal limiting on one or more of -its inputs to assist convergence. -*/ - -void cm_analog_not_converged(void) -{ - (g_mif_info.ckt->CKTnoncon)++; -} - - - - -/* -cm_message_send() - -This function prints a message output from a code model, prepending -the instance name. -*/ - - -int cm_message_send( - char *msg) /* The message to output. */ -{ - MIFinstance *here; - - /* Get the address of the instance struct from g_mif_info */ - here = g_mif_info.instance; - - /* Print the name of the instance and the message */ - printf("\nInstance: %s Message: %s\n", here->MIFname, msg); - - return(0); -} - - - - - - -/* -cm_analog_auto_partial() - -This function tells the simulator to automatically compute -approximations of partial derivatives of analog outputs -with respect to analog inputs. When called from a code -model, it sets a flag in the g_mif_info structure -which tells function MIFload() and it's associated -MIFauto_partial() function to perform the necessary -calculations. -*/ - - -void cm_analog_auto_partial(void) -{ - g_mif_info.auto_partial.local = MIF_TRUE; -} - -/* -cm_get_path() - -Return the path of the first file given on the command line -after the command line options or set by the 'source' command. -Will be used in function fopen_with_path(). -*/ - -char *cm_get_path(void) -{ - return Infile_Path; -} - - -/* cm_get_circuit(void) - -To build complex custom-built xspice-models, access to certain -parameters (e.g. maximum step size) may be needed to get reasonable -results of a simulation. In detail, this may be necessary when -spice interacts with an external sensor-simulator and the results -of that external simulator do not have a direct impact on the spice -circuit. Then, modifying the maximum step size on the fly may help -to improve the simulation results. Modifying such parameters has to -be done carefully. The patch enhances the xspice interface with -access to the (fundamental) ckt pointer. -*/ - -CKTcircuit *cm_get_circuit(void) -{ - return(g_mif_info.ckt); -} - -/* Get the name of a circuit node connected to a port. */ - -const char *cm_get_node_name(const char *port_name, unsigned int index) -{ - MIFinstance *instance; - Mif_Conn_Data_t *conn; - Mif_Port_Data_t *port; - int i; - - instance = g_mif_info.instance; - for (i = 0; i < instance->num_conn; ++i) { - conn = instance->conn[i]; - if (!strcmp(port_name, conn->name)) { - if (index >= (unsigned int)conn->size) - return NULL; - port = conn->port[index]; - if (port->type == MIF_DIGITAL || port->type == MIF_USER_DEFINED) { - /* Event node, no name in port data. */ - - i = port->evt_data.node_index; - return g_mif_info.ckt->evt->info.node_table[i]->name; - } - return port->pos_node_str; - } - } - return NULL; -} - -/* Test the resolved value of a connected Digital/UDN node, given - * an assumed value for a particular port. - */ - -bool cm_probe_node(unsigned int conn_index, // Connection index - unsigned int port_index, // Port index within connection - void *value) // Inout UDN value -{ - MIFinstance *instance; - Mif_Conn_Data_t *conn; - Mif_Port_Data_t *port; - Mif_Evt_Data_t *edata; - Evt_Node_Info_t *node_info; - Evt_Node_t *this; - void *hold; - int num_outputs; - - instance = g_mif_info.instance; - if (conn_index >= (unsigned int)instance->num_conn) - return FALSE; - conn = instance->conn[conn_index]; - if (port_index >= (unsigned int)conn->size) - return FALSE; - port = conn->port[port_index]; - if (port->type != MIF_DIGITAL && port->type != MIF_USER_DEFINED) - return FALSE; - edata = &port->evt_data; - node_info = g_mif_info.ckt->evt->info.node_table[edata->node_index]; - num_outputs = node_info->num_outputs; - if (num_outputs <= 1) - return num_outputs == 1; // This should be the only output. - this = g_mif_info.ckt->evt->data.node->rhsold + edata->node_index; - - /* Replace the actual output with the test value and resolve. - * It is assumed that the resolve function will not use its output - * as a working variable. (True for digital, real and integer.) - */ - - hold = this->output_value[edata->output_subindex]; - this->output_value[edata->output_subindex] = value; - g_evt_udn_info[node_info->udn_index]->resolve(num_outputs, - this->output_value, - value); - this->output_value[edata->output_subindex] = hold; - return TRUE; -} diff --git a/src/xspice/cm/cmevt.c b/src/xspice/cm/cmevt.c deleted file mode 100644 index beaf49a96..000000000 --- a/src/xspice/cm/cmevt.c +++ /dev/null @@ -1,255 +0,0 @@ -/* =========================================================================== -FILE CMevt.c - -MEMBER OF process XSPICE - -Public Domain - -Georgia Tech Research Corporation -Atlanta, Georgia 30332 -PROJECT A-8503 - -AUTHORS - - 9/12/91 Bill Kuhn - -MODIFICATIONS - - - -SUMMARY - - This file contains functions callable from user code models - that are associated with the event-driven algorithm. - -INTERFACES - - cm_event_alloc() - cm_event_get_ptr() - cm_event_queue() - -REFERENCED FILES - - None. - -NON-STANDARD FEATURES - - None. - -=========================================================================== */ - -#include "ngspice/ngspice.h" -#include "ngspice/cktdefs.h" - -#include "ngspice/cm.h" -#include "ngspice/mif.h" -#include "ngspice/evt.h" - -#include "ngspice/evtproto.h" - - -/* -cm_event_alloc() - -This function is called from code model C functions to allocate -state storage for a particular event-driven -instance. It is similar to the -function cm_analog_alloc() used by analog models, but allocates states -that are rotated during event-driven 'timesteps' instead of analog -timesteps. -*/ - - -void cm_event_alloc( - int tag, /* The user-specified tag for the memory block */ - int bytes) /* The number of bytes to be allocated */ -{ - - int inst_index; - int num_tags; - - MIFinstance *here; - CKTcircuit *ckt; - - Evt_State_Desc_t **desc_ptr; - Evt_State_Desc_t *desc; - - Evt_State_Data_t *state_data; - Evt_State_t *state; - - - /* Get the address of the ckt and instance structs from g_mif_info */ - here = g_mif_info.instance; - ckt = g_mif_info.ckt; - - - /* If not initialization pass, return error */ - if(here->initialized) { - g_mif_info.errmsg = - "ERROR - cm_event_alloc() - Cannot alloc when not initialization pass\n"; - return; - } - - - /* Get pointers for fast access */ - inst_index = here->inst_index; - state_data = ckt->evt->data.state; - - - /* Scan state descriptor list to determine if tag is present and to */ - /* find the end of the list. Report error if duplicate tag */ - desc_ptr = &(state_data->desc[inst_index]); - desc = *desc_ptr; - num_tags = 1; - while(desc) { - if(desc->tag == tag) { - g_mif_info.errmsg = - "ERROR - cm_event_alloc() - Duplicate tag\n"; - return; - } - desc_ptr = &(desc->next); - desc = *desc_ptr; - num_tags++; - } - - /* Create a new state description structure at end of list */ - /* and fill in the data and update the total size */ - *desc_ptr = TMALLOC(Evt_State_Desc_t, 1); - desc = *desc_ptr; - desc->tag = tag; - desc->size = bytes; - desc->offset = state_data->total_size[inst_index]; - state_data->total_size[inst_index] += bytes; - - /* Create a new state structure if list starting at head is null */ - state = state_data->head[inst_index]; - if(state == NULL) { - state = TMALLOC(Evt_State_t, 1); - state_data->head[inst_index] = state; - } - - /* Create or enlarge the block and set the time */ - if(num_tags == 1) - state->block = tmalloc((size_t) state_data->total_size[inst_index]); - else - state->block = trealloc(state->block, - (size_t) state_data->total_size[inst_index]); - - state->step = g_mif_info.circuit.evt_step; -} - - - - - -/* -cm_event_get_ptr() - -This function is called from code model C functions to return a -pointer to state storage allocated with cm_event_alloc(). A tag -specified in its argument list is used to locate the state in -question. A second argument specifies whether the desired state -is for the current timestep or from a preceding timestep. The -location of the state in memory is then computed and returned. -*/ - - -void *cm_event_get_ptr( - int tag, /* The user-specified tag for the memory block */ - int timepoint) /* The timepoint - 0=current, 1=previous */ -{ - - int i; - int inst_index; - - MIFinstance *here; - CKTcircuit *ckt; - - void *ptr; - - Evt_State_Desc_t *desc; - - Evt_State_Data_t *state_data; - Evt_State_t *state; - - - /* Get the address of the ckt and instance structs from g_mif_info */ - here = g_mif_info.instance; - ckt = g_mif_info.ckt; - - - /* If initialization pass, return error */ - if((! here->initialized) && (timepoint > 0)) { - g_mif_info.errmsg = - "ERROR - cm_event_get_ptr() - Cannot get_ptr(tag,1) during initialization pass\n"; - return(NULL); - } - - /* Get pointers for fast access */ - inst_index = here->inst_index; - state_data = ckt->evt->data.state; - - /* Scan state descriptor list to find the descriptor for this tag. */ - /* Report error if tag not found */ - desc = state_data->desc[inst_index]; - while(desc) { - if(desc->tag == tag) - break; - desc = desc->next; - } - - if(desc == NULL) { - g_mif_info.errmsg = - "ERROR - cm_event_get_ptr() - Specified tag not found\n"; - return(NULL); - } - - /* Get the state pointer from the current array */ - state = *(state_data->tail[inst_index]); - - /* Backup the specified number of timesteps */ - for(i = 0; i < timepoint; i++) - if(state->prev) - state = state->prev; - - /* Return pointer */ - ptr = ((char *) state->block) + desc->offset; - return(ptr); -} - - - - -/* -cm_event_queue() - -This function queues an event for an instance participating -in the event-driven algorithm. -*/ - - -int cm_event_queue( - double time) /* The time of the event to be queued */ -{ - - MIFinstance *here; - CKTcircuit *ckt; - - - /* Get the address of the ckt and instance structs from g_mif_info */ - here = g_mif_info.instance; - ckt = g_mif_info.ckt; - - /* If breakpoint time <= current event time, return error */ - if(time <= g_mif_info.circuit.evt_step) { - g_mif_info.errmsg = - "ERROR - cm_event_queue() - Event time cannot be <= current time\n"; - return(MIF_ERROR); - } - - /* Add the event time to the inst queue */ - EVTqueue_inst(ckt, here->inst_index, g_mif_info.circuit.evt_step, - time); - - return(MIF_OK); -} diff --git a/src/xspice/cm/cmexport.c b/src/xspice/cm/cmexport.c deleted file mode 100644 index e0a98849d..000000000 --- a/src/xspice/cm/cmexport.c +++ /dev/null @@ -1,90 +0,0 @@ -#include "ngspice/ngspice.h" -#include "ngspice/mif.h" -#include "ngspice/cm.h" -#include "ngspice/dllitf.h" - -/*how annoying!, needed for structure below*/ -static void *tcalloc(size_t a, size_t b) { - return tmalloc(a*b); /* FIXME, tcalloc must zero !?!? */ -} - -#ifdef HAVE_LIBGC -static void no_free(const void *p) { - NG_IGNORE(p); -} -#endif - -static FILE * no_file(void) { - return NULL; -} - -struct coreInfo_t coreInfo = -{ - MIF_INP2A, - MIFgetMod, - MIFgetValue, - MIFsetup, - MIFunsetup, - MIFload, - MIFmParam, - MIFask, - MIFmAsk, - MIFtrunc, - MIFconvTest, - MIFdelete, - MIFmDelete, - MIFdestroy, - MIFgettok, - MIFget_token, - MIFget_cntl_src_type, - MIFcopy, - cm_climit_fcn, - cm_smooth_corner, - cm_smooth_discontinuity, - cm_smooth_pwl, - cm_analog_ramp_factor, - cm_analog_alloc, - cm_analog_get_ptr, - cm_analog_integrate, - cm_analog_converge, - cm_analog_set_temp_bkpt, - cm_analog_set_perm_bkpt, - cm_analog_not_converged, - cm_analog_auto_partial, - cm_event_alloc, - cm_event_get_ptr, - cm_event_queue, - cm_message_get_errmsg, - cm_message_send, - cm_netlist_get_c, - cm_netlist_get_l, - cm_get_node_name, - cm_probe_node, - cm_complex_set, - cm_complex_add, - cm_complex_subtract, - cm_complex_multiply, - cm_complex_divide, - cm_get_path, - cm_get_circuit, - no_file, - no_file, - no_file, -#ifndef HAVE_LIBGC - tmalloc, - tcalloc, - trealloc, - txfree, - tmalloc, - trealloc, - txfree -#else - GC_malloc, - tcalloc, - GC_realloc, - no_free, - GC_malloc, - GC_realloc, - no_free -#endif -}; diff --git a/src/xspice/cm/cmmeters.c b/src/xspice/cm/cmmeters.c deleted file mode 100644 index 36f7af70d..000000000 --- a/src/xspice/cm/cmmeters.c +++ /dev/null @@ -1,313 +0,0 @@ -/* =========================================================================== -FILE CMmeters.c - -MEMBER OF process XSPICE - -Public Domain - -Georgia Tech Research Corporation -Atlanta, Georgia 30332 -PROJECT A-8503 - -AUTHORS - - 9/12/91 Bill Kuhn - -MODIFICATIONS - - - -SUMMARY - - This file contains functions callable from code models. - These functions are primarily designed for use by the - "cmeter" and "lmeter" models provided in the XSPICE - code model library. - -INTERFACES - - cm_netlist_get_c() - cm_netlist_get_l() - -REFERENCED FILES - - None. - -NON-STANDARD FEATURES - - None. - -=========================================================================== */ -#include "ngspice/ngspice.h" -#include "ngspice/cm.h" -#include "ngspice/mif.h" - -#include "ngspice/cktdefs.h" - -#include "ngspice/mifdefs.h" -#include "cap/capdefs.h" -#include "ind/inddefs.h" -#include "vsrc/vsrcdefs.h" -#include "ngspice/inpdefs.h" - - - -/* -cm_netlist_get_c() - -This is a special function designed for use with the c_meter -model. It returns the parallel combination of the capacitance -connected to the first port on the instance. -*/ - -double cm_netlist_get_c(void) -{ - CKTcircuit *ckt; - - MIFinstance *cmeter_inst; - CAPinstance *cap_inst; - VSRCinstance *vsrc_inst; - - CAPmodel *cap_head; - CAPmodel *cap_model; - VSRCmodel *vsrc_head; - VSRCmodel *vsrc_model; - - int cap_type; - int vsrc_type; - - int cmeter_node; - int vsrc_node; - - double c; - - - /* Get the circuit data structure and current instance */ - ckt = g_mif_info.ckt; - cmeter_inst = g_mif_info.instance; - - /* Get internal node number for positive node of cmeter input */ - cmeter_node = cmeter_inst->conn[0]->port[0]->smp_data.pos_node; - - /* Initialize total capacitance value to zero */ - c = 0.0; - - - /* ****************************************************** */ - /* Look for capacitors connected directly to cmeter input */ - /* ****************************************************** */ - - /* Get the head of the list of capacitor models in the circuit */ - cap_type = INPtypelook("Capacitor"); - if(cap_type < 0) { - printf("\nERROR - Capacitor type not supported in this binary\n"); - return(0); - } - cap_head = (CAPmodel *) ckt->CKThead[cap_type]; - - /* Scan through all capacitor instances and add in values */ - /* of any capacitors connected to cmeter input */ - - for(cap_model = cap_head; cap_model; cap_model = CAPnextModel(cap_model)) { - for(cap_inst = CAPinstances(cap_model); - cap_inst; - cap_inst = CAPnextInstance(cap_inst)) { - if((cmeter_node == cap_inst->CAPposNode) || - (cmeter_node == cap_inst->CAPnegNode)) { - c += cap_inst->CAPcapac; - } - } - } - - - /* ***************************************************************** */ - /* Look for capacitors connected through zero-valued voltage sources */ - /* ***************************************************************** */ - - /* Get the head of the list of voltage source models in the circuit */ - vsrc_type = INPtypelook("Vsource"); - if(vsrc_type < 0) { - printf("\nERROR - Vsource type not supported in this binary\n"); - return(0); - } - vsrc_head = (VSRCmodel *) ckt->CKThead[vsrc_type]; - - /* Scan through all voltage source instances and add in values */ - /* of any capacitors connected to cmeter input through voltage source */ - - for(vsrc_model = vsrc_head; vsrc_model; vsrc_model = VSRCnextModel(vsrc_model)) { - for(vsrc_inst = VSRCinstances(vsrc_model); - vsrc_inst; - vsrc_inst = VSRCnextInstance(vsrc_inst)) { - - /* Skip to next if not DC source with value = 0.0 */ - if((vsrc_inst->VSRCfunctionType != 0) || - (vsrc_inst->VSRCdcValue != 0.0)) - continue; - - /* See if voltage source is connected to cmeter input */ - /* If so, get other node voltage source is connected to */ - /* If not, skip to next source */ - if(cmeter_node == vsrc_inst->VSRCposNode) - vsrc_node = vsrc_inst->VSRCnegNode; - else if(cmeter_node == vsrc_inst->VSRCnegNode) - vsrc_node = vsrc_inst->VSRCposNode; - else - continue; - - - /* Scan through all capacitor instances and add in values */ - /* of any capacitors connected to the voltage source node */ - - for(cap_model = cap_head; cap_model; cap_model = CAPnextModel(cap_model)) { - for(cap_inst = CAPinstances(cap_model); - cap_inst; - cap_inst = CAPnextInstance(cap_inst)) { - if((vsrc_node == cap_inst->CAPposNode) || - (vsrc_node == cap_inst->CAPnegNode)) { - c += cap_inst->CAPcapac; - } - } - } - - - } /* end for all vsrc instances */ - } /* end for all vsrc models */ - - - /* Return the total capacitance value */ - return(c); -} - - - - -/* -cm_netlist_get_l() - -This is a special function designed for use with the l_meter -model. It returns the equivalent value of inductance -connected to the first port on the instance. -*/ - - -double cm_netlist_get_l(void) -{ - CKTcircuit *ckt; - - MIFinstance *lmeter_inst; - INDinstance *ind_inst; - VSRCinstance *vsrc_inst; - - INDmodel *ind_head; - INDmodel *ind_model; - VSRCmodel *vsrc_head; - VSRCmodel *vsrc_model; - - int ind_type; - int vsrc_type; - - int lmeter_node; - int vsrc_node; - - double l; - - - /* Get the circuit data structure and current instance */ - ckt = g_mif_info.ckt; - lmeter_inst = g_mif_info.instance; - - /* Get internal node number for positive node of lmeter input */ - lmeter_node = lmeter_inst->conn[0]->port[0]->smp_data.pos_node; - - /* Initialize total inductance to infinity */ - l = 1.0e12; - - - /* ****************************************************** */ - /* Look for inductors connected directly to lmeter input */ - /* ****************************************************** */ - - /* Get the head of the list of inductor models in the circuit */ - ind_type = INPtypelook("Inductor"); - if(ind_type < 0) { - printf("\nERROR - Inductor type not supported in this binary\n"); - return(0); - } - ind_head = (INDmodel *) ckt->CKThead[ind_type]; - - /* Scan through all inductor instances and add in values */ - /* of any inductors connected to lmeter input */ - - for(ind_model = ind_head; ind_model; ind_model = INDnextModel(ind_model)) { - for(ind_inst = INDinstances(ind_model); - ind_inst; - ind_inst = INDnextInstance(ind_inst)) { - if((lmeter_node == ind_inst->INDposNode) || - (lmeter_node == ind_inst->INDnegNode)) { - l = 1.0 / ( (1.0 / l) + (1.0 / ind_inst->INDinduct) ); - } - } - } - - - /* ***************************************************************** */ - /* Look for inductors connected through zero-valued voltage sources */ - /* ***************************************************************** */ - - /* Get the head of the list of voltage source models in the circuit */ - vsrc_type = INPtypelook("Vsource"); - if(vsrc_type < 0) { - printf("\nERROR - Vsource type not supported in this binary\n"); - return(0); - } - vsrc_head = (VSRCmodel *) ckt->CKThead[vsrc_type]; - - /* Scan through all voltage source instances and add in values */ - /* of any inductors connected to lmeter input through voltage source */ - - for(vsrc_model = vsrc_head; vsrc_model; vsrc_model = VSRCnextModel(vsrc_model)) { - for(vsrc_inst = VSRCinstances(vsrc_model); - vsrc_inst; - vsrc_inst = VSRCnextInstance(vsrc_inst)) { - - /* Skip to next if not DC source with value = 0.0 */ - if((vsrc_inst->VSRCfunctionType != 0) || - (vsrc_inst->VSRCdcValue != 0.0)) - continue; - - /* See if voltage source is connected to lmeter input */ - /* If so, get other node voltage source is connected to */ - /* If not, skip to next source */ - if(lmeter_node == vsrc_inst->VSRCposNode) - vsrc_node = vsrc_inst->VSRCnegNode; - else if(lmeter_node == vsrc_inst->VSRCnegNode) - vsrc_node = vsrc_inst->VSRCposNode; - else - continue; - - - /* Scan through all inductor instances and add in values */ - /* of any inductors connected to the voltage source node */ - - for(ind_model = ind_head; ind_model; ind_model = INDnextModel(ind_model)) { - for(ind_inst = INDinstances(ind_model); - ind_inst; - ind_inst = INDnextInstance(ind_inst)) { - if((vsrc_node == ind_inst->INDposNode) || - (vsrc_node == ind_inst->INDnegNode)) { - l = 1.0 / ( (1.0 / l) + (1.0 / ind_inst->INDinduct) ); - } - } - } - - - } /* end for all vsrc instances */ - } /* end for all vsrc models */ - - - /* Return the total capacitance value */ - return(l); -} - - diff --git a/src/xspice/cm/cmutil.c b/src/xspice/cm/cmutil.c deleted file mode 100644 index c1953192c..000000000 --- a/src/xspice/cm/cmutil.c +++ /dev/null @@ -1,528 +0,0 @@ -/* =========================================================================== -FILE CMutil.c - -MEMBER OF process XSPICE - -Public Domain - -Georgia Tech Research Corporation -Atlanta, Georgia 30332 -PROJECT A-8503 - -AUTHORS - - 9/12/91 Jeff Murray - -MODIFICATIONS - - - -SUMMARY - - This file contains functions callable from user code models. - These functions were written to support code models in the - XSPICE library, but may be useful in general. - -INTERFACES - - cm_smooth_corner() - cm_smooth_discontinuity() - cm_smooth_pwl() - - cm_climit_fcn() - - cm_complex_set() - cm_complex_add() - cm_complex_subtract() - cm_complex_multiply() - cm_complex_divide() - - -REFERENCED FILES - - None. - -NON-STANDARD FEATURES - - None. - -=========================================================================== */ -#include "ngspice/ngspice.h" /* for NaN */ -#include -#include -#include "ngspice/cm.h" - -/* Corner Smoothing Function ************************************ -* * -* The following function smooths the transition between two * -* slopes into a quadratic (parabolic) curve. The calling * -* function passes an x,y coordinate representing the * -* "breakpoint", a smoothing domain value (d), and the slopes at * -* both endpoints, and the x value itself. The situation is * -* shown below: B C * -* A |<-d->| ^ y * -* ---------*-----* | | * -* lower_slope-^ |<-d->|\ | | * -* \ | | * -* \ | *------>x * -* At Ax * -*****************************************************************/ - -void cm_smooth_discontinuity( - double x_input, /* The x value at which to compute y */ - double x_lower, /* The x value of the lower corner */ - double y_lower, /* The y value of the lower corner */ - double x_upper, /* The x value of the upper corner */ - double y_upper, /* The y value of the upper corner */ - double *y_output, /* The computed smoothed y value */ - double *dy_dx) /* The partial of y wrt x */ -{ - double x_center,y_center,a,b,c,center_slope; - - - /* Derive x_center, y_center & center_slope values */ - x_center = (x_upper + x_lower) / 2.0; - y_center = (y_upper + y_lower) / 2.0; - center_slope = 2.0 * (y_upper - y_lower) / (x_upper - x_lower); - - - if (x_input < x_lower) { /* x_input @ lower level */ - *y_output = y_lower; - *dy_dx = 0.0; - } - else { - if (x_input < x_center) { /* x_input in lower transition */ - a = center_slope / (x_upper - x_lower); - b = center_slope - 2.0 * a * x_center; - c = y_center - a * x_center * x_center - b * x_center; - *y_output = a * x_input * x_input + b * x_input + c; - *dy_dx = 2.0 * a * x_input + b; - } - else { /* x_input in upper transition */ - if (x_input < x_upper) { - a = -center_slope / (x_upper - x_lower); - b = -2.0 * a * x_upper; - c = y_upper - a * x_upper * x_upper - b * x_upper; - *y_output = a * x_input * x_input + b * x_input + c; - *dy_dx = 2.0 * a * x_input + b; - } - else { /* x_input @ upper level */ - *y_output = y_upper; - *dy_dx = 0.0; - } - } - } -} - - - -/* Controlled Limiter Function (modified CLIMIT) */ - -/* -This is a special function created for use with the CLIMIT -controlled limiter model. -*/ - -void cm_climit_fcn( - double in, /* The input value */ - double in_offset, /* The input offset */ - double cntl_upper, /* The upper control input value */ - double cntl_lower, /* The lower control input value */ - double lower_delta, /* The delta from control to limit value */ - double upper_delta, /* The delta from control to limit value */ - double limit_range, /* The limiting range */ - double gain, /* The gain from input to output */ - int percent, /* The fraction vs. absolute range flag */ - double *out_final, /* The output value */ - double *pout_pin_final, /* The partial of output wrt input */ - double *pout_pcntl_lower_final, /* The partial of output wrt lower control input */ - double *pout_pcntl_upper_final) /* The partial of output wrt upper control input */ -{ - -/* Define error message string constants */ - -char *climit_range_error = "\n**** ERROR ****\n* CLIMIT function linear range less than zero. *\n"; - - -double threshold_upper,threshold_lower,linear_range, - out_lower_limit,out_upper_limit,limited_out, - out,pout_pin,pout_pcntl_lower,pout_pcntl_upper,junk; - - /* Find Upper & Lower Limits */ - - out_lower_limit = cntl_lower + lower_delta; - out_upper_limit = cntl_upper - upper_delta; - - - if (percent == TRUE) /* Set range to absolute value */ - limit_range = limit_range * - (out_upper_limit - out_lower_limit); - - - - threshold_upper = out_upper_limit - /* Set Upper Threshold */ - limit_range; - threshold_lower = out_lower_limit + /* Set Lower Threshold */ - limit_range; - linear_range = threshold_upper - threshold_lower; - - - /* Test the linear region & make sure there IS one... */ - if (linear_range < 0.0) { - printf("%s\n",climit_range_error); -/* limited_out = 0.0; - pout_pin = 0.0; - pout_pcntl_lower = 0.0; - pout_pcntl_upper = 0.0; - return; -*/ } - - /* Compute Un-Limited Output */ - out = gain * (in_offset + in); - - - if (out < threshold_lower) { /* Limit Out @ Lower Bound */ - - pout_pcntl_upper= 0.0; - - if (out > (out_lower_limit - limit_range)) { /* Parabolic */ - cm_smooth_corner(out,out_lower_limit,out_lower_limit, - limit_range,0.0,1.0,&limited_out, - &pout_pin); - pout_pin = gain * pout_pin; - cm_smooth_discontinuity(out,out_lower_limit,1.0,threshold_lower, - 0.0,&pout_pcntl_lower,&junk); - } - else { /* Hard-Limited Region */ - limited_out = out_lower_limit; - pout_pin = 0.0; - pout_pcntl_lower = 1.0; - } - } - else { - if (out > threshold_upper) { /* Limit Out @ Upper Bound */ - - pout_pcntl_lower= 0.0; - - if (out < (out_upper_limit+limit_range)) { /* Parabolic */ - cm_smooth_corner(out,out_upper_limit,out_upper_limit, - limit_range,1.0,0.0,&limited_out, - &pout_pin); - pout_pin = gain * pout_pin; - cm_smooth_discontinuity(out,threshold_upper,0.0,out_upper_limit, - 1.0,&pout_pcntl_upper,&junk); - } - else { /* Hard-Limited Region */ - limited_out = out_upper_limit; - pout_pin = 0.0; - pout_pcntl_upper = 1.0; - } - } - else { /* No Limiting Needed */ - limited_out = out; - pout_pin = gain; - pout_pcntl_lower = 0.0; - pout_pcntl_upper = 0.0; - } - } - - - *out_final = limited_out; - *pout_pin_final = pout_pin; - *pout_pcntl_lower_final = pout_pcntl_lower; - *pout_pcntl_upper_final = pout_pcntl_upper; - -} - -/**** End Controlled Limiter Function ****/ - -/*=============================================================================*/ - - -/* Piecewise Linear Smoothing Function ********************* -* The following is a transfer curve function which * -* accepts as input an "x" value, and returns a "y" * -* value. The transfer characteristic is a smoothed * -* piece-wise linear curve described by *x and *y array * -* coordinate pairs. * -* * -* Created 8/14/91 * -* Last Modified 8/14/91 J.P.Murray * -***********************************************************/ - -/*********************************************************** -* * -* ^ x[4] * -* x[1] | * * -* | midpoint /|\ * -* | | / \ * -* | V | / | \ * -* *----*----* \ * -* midpoint /| | | \ * -* | / || * <- midpoint * -* V/ | |x[3] \ * -* <-----------*------------O------------\-------------> * -* | / | \ | | * -* / | \ * -* |/ | \| | * -* * | *-----*---> * -* /| | x[5] x[6] * -* / | * -* / x[0] | * -* / | * -* / | * -* / | * -* V * -* * -***********************************************************/ - -/*********************************************************** -* * -* Note that for the cm_smooth_pwl function, the arguments * -* are as listed below: * -* * -* * -* double x_input; input * * -* double *x; pointer to the x-coordinate * -* array * * -* double *y; pointer to the y-coordinate * -* array * * -* int size; size of the arrays * -* * -* double input_domain; smoothing range * * -* double dout_din; partial derivative of the * -* output w.r.t. the input * * -* * -***********************************************************/ - - -double cm_smooth_pwl(double x_input, double *x, double *y, int size, - double input_domain, double *dout_din) -{ - - int i; /* generic loop counter index */ - - double lower_seg; /* x segment below which input resides */ - double upper_seg; /* x segment above which the input resides */ - double lower_slope; /* slope of the lower segment */ - double upper_slope; /* slope of the upper segment */ - double out; /* output */ - double threshold_lower; /* value below which the output begins smoothing */ - double threshold_upper; /* value above which the output begins smoothing */ - - - /* char *limit_error="\n***ERROR***\nViolation of 50% rule in breakpoints!\n";*/ - - - - - - /* Determine segment boundaries within which x_input resides */ - - if (x_input <= (x[1] + x[0])/2.0) {/*** x_input below lowest midpoint ***/ - *dout_din = (y[1] - y[0])/(x[1] - x[0]); - out = *y + (x_input - *x) * *dout_din; - return out; - } - else { - if (x_input >= (x[size-2] + x[size-1])/2.0) { - /*** x_input above highest midpoint ***/ - *dout_din = (y[size-1] - y[size-2]) / - (x[size-1] - x[size-2]); - out = y[size-1] + (x_input - x[size-1]) * *dout_din; - return out; - } - else { /*** x_input within bounds of end midpoints... ***/ - /*** must determine position progressively & then ***/ - /*** calculate required output. ***/ - - for (i=1; i - -SUMMARY - - This file contains shared constants, type definitions, - and function prototypes used in the cmpp process. - -INTERFACES - - None. - -REFERENCED FILES - - None. - -NON-STANDARD FEATURES - - None. - -============================================================================*/ - - -#include -#include -#include - -#define IFSPEC_FILENAME "ifspec.ifs" -#define UDNFUNC_FILENAME "udnfunc.c" -#define MODPATH_FILENAME "modpath.lst" -#define UDNPATH_FILENAME "udnpath.lst" - -#ifdef _MSC_VER -#include -#include - -/* If CRT debugging is being used so that crtdbg.h is included, strdup will - * be defined to a debug version. In this case, strdup should not be - * redefined to the standard version. */ -#ifndef strdup -#define strdup _strdup -#endif - -#define unlink _unlink -#define isatty _isatty -#define fileno _fileno -#endif /* _MSC_VER */ - -/* *********************************************************************** */ - -#define GET_IFS_TABLE 0 /* Read the entire ifs table */ -#define GET_IFS_NAME 1 /* Get the C function name out of the table only */ - -#define MAX_NAME_LEN 1024 /* Maximum SPICE name length */ - - -/* ******************************************************************** */ -/* Structures used by parser to check for valid connections/parameters */ -/* ******************************************************************** */ - -/* - * The direction of a connector - */ - -typedef enum { - CMPP_IN, - CMPP_OUT, - CMPP_INOUT, -} Dir_t; - - -/* - * The type of a port - */ - -typedef enum { - VOLTAGE, /* v - Single-ended voltage */ - DIFF_VOLTAGE, /* vd - Differential voltage */ - CURRENT, /* i - Single-ended current */ - DIFF_CURRENT, /* id - Differential current */ - VSOURCE_CURRENT, /* vnam - Vsource name for input current */ - CONDUCTANCE, /* g - Single-ended VCIS */ - DIFF_CONDUCTANCE, /* gd - Differential VCIS */ - RESISTANCE, /* h - Single-ended ICVS */ - DIFF_RESISTANCE, /* hd - Differential ICVS */ - DIGITAL, /* d - Digital */ - USER_DEFINED, /* - Any user defined type */ -} Port_Type_t; - - - -/* - * The type of a parameter or Static_Var - */ - -typedef enum { - CMPP_BOOLEAN, - CMPP_INTEGER, - CMPP_REAL, - CMPP_COMPLEX, - CMPP_STRING, - CMPP_POINTER, /* NOTE: CMPP_POINTER should not be used for Parameters - - * only Static_Vars - this is enforced by the cmpp. */ - } Data_Type_t; - - - -/* - * The complex type - */ - -typedef struct { - double real; - double imag; -} Complex_t; - - - -/* - * Values of different types. - * - * Note that a struct is used instead of a union for conformity - * with the use of the Mif_Value_t type in the simulator where - * the type must be statically initialized. ANSI C does not - * support useful initialization of unions. - * - */ - -typedef struct { - - bool bvalue; /* For BOOLEAN parameters */ - int ivalue; /* For INTEGER parameters */ - double rvalue; /* For REAL parameters */ - Complex_t cvalue; /* For COMPLEX parameters */ - char *svalue; /* For STRING parameters */ - -} Value_t; - - - -/* - * Information about the model as a whole - */ - - -typedef struct { - - char *c_fcn_name; /* Name used in the C function */ - char *model_name; /* Name used in a spice deck */ - char *description; /* Description of the model */ - -} Name_Info_t; - - - - -/* - * Information about a connection - */ - - -typedef struct { - - char *name; /* Name of this connection */ - char *description; /* Description of this connection */ - Dir_t direction; /* IN, OUT, or INOUT */ - Port_Type_t default_port_type; /* The default port type */ - char *default_type; /* The default type in string form */ - int num_allowed_types; /* The size of the allowed type arrays */ - Port_Type_t *allowed_port_type; /* Array of allowed types */ - char **allowed_type; /* Array of allowed types in string form */ - bool is_array; /* True if connection is an array */ - bool has_conn_ref; /* True if there is associated with an array conn */ - int conn_ref; /* Subscript of the associated array conn */ - bool has_lower_bound; /* True if there is an array size lower bound */ - int lower_bound; /* Array size lower bound */ - bool has_upper_bound; /* True if there is an array size upper bound */ - int upper_bound; /* Array size upper bound */ - bool null_allowed; /* True if null is allowed for this connection */ - -} Conn_Info_t; - - - - -/* - * Information about a parameter - */ - -typedef struct { - - char *name; /* Name of this parameter */ - char *description; /* Description of this parameter */ - Data_Type_t type; /* Data type, e.g. REAL, INTEGER, ... */ - bool has_default; /* True if there is a default value */ - Value_t default_value; /* The default value */ - bool has_lower_limit; /* True if there is a lower limit */ - Value_t lower_limit; /* The lower limit for this parameter */ - bool has_upper_limit; /* True if there is a upper limit */ - Value_t upper_limit; /* The upper limit for this parameter */ - bool is_array; /* True if parameter is an array */ - bool has_conn_ref; /* True if there is associated with an array conn */ - int conn_ref; /* Subscript of the associated array conn */ - bool has_lower_bound; /* True if there is an array size lower bound */ - int lower_bound; /* Array size lower bound */ - bool has_upper_bound; /* True if there is an array size upper bound */ - int upper_bound; /* Array size upper bound */ - bool null_allowed; /* True if null is allowed for this parameter */ - -} Param_Info_t; - - -/* - * Information about an instance variable - */ - -typedef struct { - - char *name; /* Name of this parameter */ - char *description; /* Description of this parameter */ - Data_Type_t type; /* Data type, e.g. REAL, INTEGER, ... */ - bool is_array; /* True if parameter is an array */ - -} Inst_Var_Info_t; - - - -/* - * The all encompassing structure for the ifs table information - */ - -typedef struct { - - Name_Info_t name; /* The name table entries */ - int num_conn; /* Number of entries in the connection table(s) */ - Conn_Info_t *conn; /* Array of connection info structs */ - int num_param; /* Number of entries in the parameter table(s) */ - Param_Info_t *param; /* Array of parameter info structs */ - int num_inst_var; /* Number of entries in the instance var table(s) */ - Inst_Var_Info_t *inst_var; /* Array of instance variable info structs */ - -} Ifs_Table_t; - - - -/* *********************************************************************** */ - - - -void preprocess_ifs_file(void); - -void preprocess_lst_files(void); - -void preprocess_mod_file(const char *filename); - -int output_paths_from_lst_file(const char *filename); - - -void init_error (char *program_name); - -#ifdef __GNUC__ -void print_error(const char *fmt, ...) __attribute__ ((format (__printf__, 1, 2))); -#else -void print_error(const char *fmt, ...); -#endif -void vprint_error(const char *fmt, va_list p); - -void str_to_lower(char *s); - - -int read_ifs_file(const char *filename, int mode, Ifs_Table_t *ifs_table); - -int write_ifs_c_file(const char *filename, Ifs_Table_t *ifs_table); - - -char *gen_filename(const char *filename, const char *mode); - -void rem_ifs_table(Ifs_Table_t *ifs_table); - -/* - * type safe variants of the functions for char arguments - */ - -#if !defined(isalpha_c) - -inline static int char_to_int(char c) { return (unsigned char) c; } - -#define isalpha_c(x) isalpha(char_to_int(x)) -#define islower_c(x) islower(char_to_int(x)) -#define isdigit_c(x) isdigit(char_to_int(x)) -#define isalnum_c(x) isalnum(char_to_int(x)) -#define isprint_c(x) isprint(char_to_int(x)) -#define isblank_c(x) isblank(char_to_int(x)) -#define isspace_c(x) isspace(char_to_int(x)) -#define isupper_c(x) isupper(char_to_int(x)) - -#define tolower_c(x) ((char) tolower(char_to_int(x))) -#define toupper_c(x) ((char) toupper(char_to_int(x))) - -#endif diff --git a/src/xspice/cmpp/file_buffer.c b/src/xspice/cmpp/file_buffer.c deleted file mode 100644 index 27a9d10ff..000000000 --- a/src/xspice/cmpp/file_buffer.c +++ /dev/null @@ -1,698 +0,0 @@ -#include -#include -#include -#include -#include -#include -#include - -#include "file_buffer.h" -#include "cmpp.h" - -/* Default buffer size */ -#define N_BYTE_FILEBUF_INIT_DFLT 16384 - - -static int fb_fill(FILEBUF *p_fb); -static int fbget_quoted_unescaped_string(FILEBUF *p_fb, - FBTYPE *p_type_found, FBOBJ *p_fbobj); -static size_t fb_make_space_at_end(FILEBUF *p_fb); -static int fbget_quoted_string(FILEBUF *p_fb, - FBTYPE *p_type_found, FBOBJ *p_fbobj); -static int fbget_quoted_escaped_string(FILEBUF *p_fb, - FBTYPE *p_type_found, FBOBJ *p_fbobj); -static int fbget_unquoted_string(FILEBUF *p_fb, - unsigned int n_type_wanted, FBTYPE *p_type_wanted, - FBTYPE *p_type_found, FBOBJ *p_fbobj); -static int fb_return_obj(FILEBUF *p_fb, - unsigned int n_type_wanted, FBTYPE *p_type_wanted, - FBTYPE *p_type_found, FBOBJ *p_fbobj); -static int fb_return_string(FILEBUF *p_fb, - FBTYPE *p_type_found, FBOBJ *p_fbobj); -static int fb_skip_to_eol(FILEBUF *p_fb); -static int fb_skip_whitespace(FILEBUF *p_fb); - - -/* This function initializes a file-buffer read access to the named file. - * - * Parameters - * filename: Name of file to be opened for reading - * n_byte_buf_init: Intial buffer size. May be 0 for default size - * - * Return values - * NULL: Error occurred. The value of errno will provide more details - * Otherwise an initialized structure - */ -FILEBUF *fbopen(const char *filename, size_t n_byte_buf_init) -{ - int xrc = 0; - FILEBUF *p_fb = (FILEBUF *) NULL; - - /* Set default buffer size if requested */ - if (n_byte_buf_init == 0) { - n_byte_buf_init = N_BYTE_FILEBUF_INIT_DFLT; - } - - /* Allocate structure to return */ - if ((p_fb = (FILEBUF *) malloc(sizeof *p_fb)) == (FILEBUF *) NULL) { - xrc = -1; - goto EXITPOINT; - } - - p_fb->is_eof = false; - p_fb->f_skip_to_eol = false; - - /* Init resources for error recovery */ - p_fb->fp = (FILE *) NULL; - p_fb->p_buf = (char *) NULL; - - /* Allocate data buffer */ - if ((p_fb->p_buf = (char *) malloc(n_byte_buf_init)) == (char *) NULL) { - xrc = -1; - goto EXITPOINT; - } - p_fb->n_byte_buf_alloc = n_byte_buf_init; - p_fb->p_data_end = p_fb->p_data_cur = p_fb->p_buf; - p_fb->p_buf_end = p_fb->p_buf + n_byte_buf_init; - - /* p_fb->p_obj_undefined since no object yet */ - - /* Open file. It is opened in binary mode because the scanning will - * handle all EOL chars, so any translations by the OS are almost - * pure overhead. Also, not converting ensures that if fread returns - * fewer than the requested number of chars, that read was to the - * end of the file (if not an error). Otherwise an additional read - * getting a size of 0 would be required. */ - if ((p_fb->fp = fopen(filename, "rb")) == (FILE *) NULL) { - xrc = -1; - goto EXITPOINT; - } - -EXITPOINT: - /* Free resources on error */ - if (xrc != 0) { - if (p_fb != (FILEBUF *) NULL) { - const int errno_save = errno; /* save errno in case fbclose() - * changes it */ - (void) fbclose(p_fb); - errno = errno_save; - p_fb = (FILEBUF *) NULL; - } - } /* end of case of error */ - - return p_fb; -} /* end of function fbopen */ - - - -/* This function frees resources used by a FILEBUF. - * - * Parameter - * p_fb: The address of the FILEBUF to free. This argument may be NULL. - * - * Return values - * 0: OK - * EOF: Error closing file. Details can be found using errno. - */ -int fbclose(FILEBUF *p_fb) -{ - if (p_fb == (FILEBUF *) NULL) { - return 0; - } - - int xrc = 0; - - { - void *p; - if ((p = p_fb->p_buf) != NULL) { - free(p); - } - } - - { - FILE *fp; - if ((fp = p_fb->fp) != (FILE *) NULL) { - xrc = fclose(fp); - } - } - - free(p_fb); - return xrc; -} /* end of function fbclose */ - - - -/* This function gets the next object converting it to the most desired - * type. - * - * Parameters - * p_fb: FILEBUF pointer initialized using fbopen() - * n_type_wanted: number of desired type conversions for data from highest - * priority to lowest. - * p_type_wanted: Desired type conversions for data from highest priority - * to lowest. - * p_type_found: Address to receive the type of the data obtained - * p_fbobj: Address of an FBOBJ structure to receive the data - * - * Return codes - * +1: EOF reached - * 0: Normal return - * -1: Error. Use errno for further details. - * - * Remarks - * Type BUF_TYPE_STRING is always implicitly added to the list of wanted - * types as the final choice, which any data will satisfy - * - * A string may be double-quoted. In this case the quotes are not supplied - * to the caller as part of the data. Double-quoting ensures that a string - * will not be converted to any other type. Within double quotes, a double - * qoute and a backslash are escaped by a backslash, and a final unescaped - * double quote is impilcitly added if EOF is reached when scanning for a - * closing quote. - * - * A "*" or a "#" not within a quoted expression begins a comment that - * extends to the end of the line. - * - * When called p_fb has data from the last get or it is the first call. - * - * Return Codes - * +1: EOF - * 0: Normal - * -1: Error - */ -int fbget(FILEBUF *p_fb, - unsigned int n_type_wanted, FBTYPE *p_type_wanted, - FBTYPE *p_type_found, FBOBJ *p_fbobj) -{ - /* Test for existing EOF */ - if (p_fb->is_eof && p_fb->p_data_cur == p_fb->p_data_end) { /* no data */ - return +1; - } - - /* Init to no object */ - p_fb->p_obj_start = (char *) NULL; - - /* Skip the comment if the initiating character was processed during - * the last call to fbget */ - if (p_fb->f_skip_to_eol) { - const int rc = fb_skip_to_eol(p_fb); - if (rc != 0) { /* EOF or error */ - return rc; - } - } - - { - const int rc = fb_skip_whitespace(p_fb); - if (rc != 0) { /* EOF or error */ - return rc; - } - } - - /* Current char exists and starts the item */ - if (*p_fb->p_data_cur == '"') { /* quoted string */ - return fbget_quoted_string(p_fb, p_type_found, p_fbobj); - } - - /* Else unquoted string */ - return fbget_unquoted_string(p_fb, n_type_wanted, p_type_wanted, - p_type_found, p_fbobj); -} /* end of function fbget */ - - - -/* Get a quoted string given at a quote. On entry p_fb->p_data_cur points - * to the quote starting the quoted string. On return it points to the first - * character after the current item or equals p_fb->p_data_end if the - * current item extens to the end of the current data string. */ -static int fbget_quoted_string(FILEBUF *p_fb, - FBTYPE *p_type_found, FBOBJ *p_fbobj) -{ - /* Advance past the opening quote to the true start of the string */ - if (++p_fb->p_data_cur == p_fb->p_data_end) { - /* The leading quote ended the current data */ - const int rc = fb_fill(p_fb); /* Try to refill buffer */ - if (rc != 0) { /* EOF or error */ - if (rc < 0) { /* error */ - return -1; - } - /* Else EOF. This item is an empty string that ended without the - * closing quote, so add an implicit closing quote, i.e., end - * the string to form "". - * - * Since the object was started at the beginning of the buffer - * and the buffer has at leat 1 byte a NULL to create the - * string "" can be written here */ - *(p_fb->p_obj_end = p_fb->p_obj_start = p_fb->p_buf) = '\0'; - return fb_return_string(p_fb, p_type_found, p_fbobj); - } - /* Else data is now available at p_fb->p_data_cur */ - } /* end of case that at end of data from file */ - - /* Save the start of the string as the current position */ - p_fb->p_obj_start = p_fb->p_data_cur; - - /* Continue processing as an unescaped string, unless the contrary - * is found to be true */ - return fbget_quoted_unescaped_string(p_fb, p_type_found, p_fbobj); -} /* end of function fbget_quoted_string */ - - - -/* Get a quoted string with no escape. The start has already been set on - * entry. If an escape is found, processing continues as an escaped string */ -int fbget_quoted_unescaped_string(FILEBUF *p_fb, - FBTYPE *p_type_found, FBOBJ *p_fbobj) -{ - /* Step through characters until end or escape */ - char *p_data_cur = p_fb->p_data_cur; - char *p_data_end = p_fb->p_data_end; - for ( ; ; ) { /* continue until done */ - for ( ; p_data_cur != p_data_end; ++p_data_cur) { /* current data */ - const char ch_cur = *p_data_cur; - if (ch_cur == '"') { /* Closing quote, so done */ - *(p_fb->p_obj_end = p_data_cur) = '\0'; - p_fb->p_data_cur = p_data_cur + 1; - return fb_return_string(p_fb, p_type_found, p_fbobj); - } - if (ch_cur == '\\') { /* Escape */ - /* After an escape, data must be moved to fill in the gap - * left by the escape character */ - p_fb->p_data_cur = p_data_cur; /* Reprocess the escape */ - return fbget_quoted_escaped_string(p_fb, - p_type_found, p_fbobj); - } - /* Else the character is part of the quoted string */ - } /* end of loop over current text */ - - p_fb->p_data_cur = p_data_cur; /* update current position */ - const int rc = fb_fill(p_fb); /* Try to refill buffer */ - if (rc != 0) { /* EOF or error */ - if (rc < 0) { /* error */ - return -1; - } - /* Else EOF. Ended without closing quote, so add an implicit - * closing quote, i.e., end the string. Since fb_fill() - * did not return -1, there is at least 1 byte at the end of - * the buffer where the read would have gone. */ - *(p_fb->p_obj_end = p_fb->p_data_cur) = '\0'; - return fb_return_string(p_fb, p_type_found, p_fbobj); - } - p_data_cur = p_fb->p_data_cur; /* Update after fill */ - p_data_end = p_fb->p_data_end; - } /* end of loop processing until done or escape */ -} /* end of function fbget_quoted_unescaped_string */ - - - -/* Get a quoted string with an escape. The start has already been set on - * entry */ -static int fbget_quoted_escaped_string(FILEBUF *p_fb, - FBTYPE *p_type_found, FBOBJ *p_fbobj) -{ - /* Step through characters until end */ - char *p_data_src = p_fb->p_data_cur; /* at current char */ - char *p_data_dst = p_data_src; /* at current char */ - char *p_data_end = p_fb->p_data_end; - bool f_escape_in_progress = false; - for ( ; ; ) { /* continue until done */ - for ( ; p_data_src != p_data_end; ++p_data_src) { /* current data */ - const char ch_cur = *p_data_src; - if (f_escape_in_progress) { /* Always copy the char */ - f_escape_in_progress = false; - *p_data_dst++ = ch_cur; - } - else { /* Not an escaped character */ - if (ch_cur == '"') { /* Closing quote, so done */ - p_fb->p_data_cur = p_data_src + 1; - *(p_fb->p_obj_end = p_data_dst) = '\0'; - return fb_return_string(p_fb, p_type_found, p_fbobj); - } - if (ch_cur == '\\') { /* Escape */ - f_escape_in_progress = true; - /* Do not copy the escape or advancd p_data_dst */ - } - else { /* ordinary character */ - *p_data_dst++ = ch_cur; - } - } /* end of case of not an escaped character */ - /* Else the character is part of the quoted string */ - } /* end of loop over current text */ - - /* Indicate that there is no more unprocessed data */ - p_fb->p_data_end = p_fb->p_data_cur = p_data_dst; - - /* If no pending escape, can switch back to unescaped version and - * avoid the moves */ - if (!f_escape_in_progress) { - return fbget_quoted_unescaped_string(p_fb, p_type_found, - p_fbobj); - } - - /* Else escape must be processed, so continue with escaped version */ - const int rc = fb_fill(p_fb); /* Try to refill buffer */ - if (rc != 0) { /* EOF or error */ - if (rc < 0) { /* error */ - return -1; - } - /* Else EOF. Ended without closing quote, so add an implicit - * closing quote, i.e., end the string. Since fb_fill() - * did not return -1, there is at least 1 byte at the end of - * the buffer where the read would have gone. */ - *(p_fb->p_obj_end = p_fb->p_data_cur) = '\0'; - return fb_return_string(p_fb, p_type_found, p_fbobj); - } - p_data_dst = p_data_src = p_fb->p_data_cur; /* Update after fill */ - p_data_end = p_fb->p_data_end; - } /* end of loop processing until done or escape */ -} /* end of function fbget_quoted_escaped_string */ - - - -/* Get an unquoted string starting at the current position */ -static int fbget_unquoted_string(FILEBUF *p_fb, - unsigned int n_type_wanted, FBTYPE *p_type_wanted, - FBTYPE *p_type_found, FBOBJ *p_fbobj) -{ - /* Save the start of the string as the current position */ - p_fb->p_obj_start = p_fb->p_data_cur; - - static const signed char p_map[1 << CHAR_BIT] = { - [(unsigned char ) ' '] = (signed char) +1, - [(unsigned char ) '\t'] = (signed char) +1, - [(unsigned char ) '\n'] = (signed char) +1, - [(unsigned char ) '\r'] = (signed char) +1, - [(unsigned char ) '\v'] = (signed char) +1, - [(unsigned char ) '\f'] = (signed char) +1, - [(unsigned char ) '*'] = (signed char) -1, - [(unsigned char ) '#'] = (signed char) -1 - }; - /* Step through characters until whitespace or comment */ - char *p_data_cur = p_fb->p_data_cur; - char *p_data_end = p_fb->p_data_end; - for ( ; ; ) { /* continue until done */ - for ( ; p_data_cur != p_data_end; ++p_data_cur) { /* current data */ - const char ch_cur = *p_data_cur; - const signed char map_cur = p_map[(unsigned char) ch_cur]; - if (map_cur != 0) { /* ws or comment start, so done */ - *(p_fb->p_obj_end = p_data_cur) = '\0'; - p_fb->p_data_cur = p_data_cur + 1; /* 1st char past string */ - p_fb->f_skip_to_eol = map_cur < 0; - return fb_return_obj(p_fb, n_type_wanted, p_type_wanted, - p_type_found, p_fbobj); - } - /* Else more of the string */ - } /* end of loop over current text */ - - p_fb->p_data_cur = p_data_cur; /* update current position */ - const int rc = fb_fill(p_fb); /* Try to refill buffer */ - if (rc != 0) { /* EOF or error */ - if (rc < 0) { /* error */ - return -1; - } - /* Else EOF. Ended without closing quote, so add an implicit - * closing quote, i.e., end the string. Since fb_fill() - * did not return -1, there is at least 1 byte at the end of - * the buffer where the read would have gone. */ - *(p_fb->p_obj_end = p_fb->p_data_cur) = '\0'; - return fb_return_obj(p_fb, n_type_wanted, p_type_wanted, - p_type_found, p_fbobj); - } - p_data_cur = p_fb->p_data_cur; /* Update after fill */ - p_data_end = p_fb->p_data_end; - } /* end of loop processing until done or escape */ -} /* end of function fbget_unquoted_string */ - - - -/* This function fills the buffer. First it moves all data in the interval - * [start current object, current position) to the beginning of the buffer. - * - * If there is no space left at the end of the buffer after the move (so - * that the move did not occur and data extends to the end), the buffer is - * doubled in size. In either case, the end of the buffer is filled with - * data read from the file. */ -static int fb_fill(FILEBUF *p_fb) -{ - /* Exit if EOF already */ - if (p_fb->is_eof) { - return +1; - } - - /* Move the data in use to the front of the buffer if not already and - * enlarge the buffer if still no space. Returned value is bytes - * available at the end of the buffer at p_data_end */ - const size_t n_byte_read = fb_make_space_at_end(p_fb); - if (n_byte_read == 0) { - return -1; - } - - const size_t n_got = fread(p_fb->p_data_end, 1, n_byte_read, p_fb->fp); - if (n_got < n_byte_read) { /* EOF or error */ - if (ferror(p_fb->fp)) { - return -1; - } - /* Else mark as EOF for subsequent calls */ - p_fb->is_eof = true; - - if (n_got == 0) { /* Nothing to return for this call */ - return +1; - } - /* Else partial buffer to return */ - } - - /* Extend the end of the data by the bytes obtained */ - p_fb->p_data_end += n_got; - return 0; -} /* end of function fb_fill */ - - - -/* Make space at the end of the buffer by moving data of current object - * to the front of the buffer and enlarging if there is still no room - * - * Return value: Number of spaces that are free at the end of p_buf on - * return. If 0, more space could not be obtained. - */ -static size_t fb_make_space_at_end(FILEBUF *p_fb) -{ - const char * const p_obj_start = p_fb->p_obj_start; - const char * const p_src = p_obj_start == (char *) NULL ? - p_fb->p_data_cur : p_obj_start; - char * const p_dst = p_fb->p_buf; - - /* Shift data in use to the front of the buffer if not already */ - if (p_dst != p_src) { /* object is not at start of buffer */ - const size_t n = p_fb->p_data_end - p_src; - if (n > 0) { /* Will be 0 if skipping whitespace and comments */ - (void) memmove(p_dst, p_src, n); - } - - /* Adjust pointers after the move */ - ptrdiff_t delta = p_src - p_dst; - p_fb->p_data_cur -= delta; - p_fb->p_data_end -= delta; - - if (p_obj_start != (char *) NULL) { - p_fb->p_obj_start -= delta; - } - /* never called when p_obj_end is valid */ - } - else { /* already at front */ - if (p_fb->p_buf_end - p_fb->p_data_end == 0) { - const size_t n_alloc_orig = p_fb->n_byte_buf_alloc; - - /* For debugging, this added size can be made very small to - * force many reallocs and to have strings end at "hard" - * locations such as right before where a terminating null - * should be added to a string */ - //const size_t n_added = 1; - const size_t n_added = n_alloc_orig; - - const size_t n_byte_buf_alloc_new = n_alloc_orig + n_added; - void * const p = realloc(p_fb->p_buf, n_byte_buf_alloc_new); - if (p == NULL) { - return 0; - } - /* Else allocation OK, so update buffer and internal pointers */ - ptrdiff_t delta = (char *) p - p_fb->p_buf; - p_fb->p_buf = (char *) p; - p_fb->p_buf_end = (char *) p + n_byte_buf_alloc_new; - p_fb->n_byte_buf_alloc = n_byte_buf_alloc_new; - p_fb->p_data_cur += delta; - p_fb->p_data_end += delta; - - if (p_obj_start != (char *) NULL) { - p_fb->p_obj_start += delta; - } - /* never called when p_obj_end is valid */ - } - } - - return p_fb->p_buf_end - p_fb->p_data_end; -} /* end of function fb_make_space_at_end */ - - - -/* Skip whitespace, including comments starting at the current position */ -static int fb_skip_whitespace(FILEBUF *p_fb) -{ - static const signed char p_map[1 << CHAR_BIT] = { - [(unsigned char ) ' '] = (signed char) +1, - [(unsigned char ) '\t'] = (signed char) +1, - [(unsigned char ) '\n'] = (signed char) +1, - [(unsigned char ) '\r'] = (signed char) +1, - [(unsigned char ) '\v'] = (signed char) +1, - [(unsigned char ) '\f'] = (signed char) +1, - [(unsigned char ) '*'] = (signed char) -1, - [(unsigned char ) '#'] = (signed char) -1 - }; - /* Step through characters until not whitespace (including comments) */ - char *p_data_cur = p_fb->p_data_cur; - char *p_data_end = p_fb->p_data_end; - for ( ; ; ) { /* continue until done */ - for ( ; p_data_cur != p_data_end; ++p_data_cur) { /* current data */ - const char ch_cur = *p_data_cur; - const signed char map_cur = p_map[(unsigned char) ch_cur]; - if (map_cur == 0) { /* not in ws or at comment start, so done */ - p_fb->p_data_cur = p_data_cur; - return 0; - } - if (map_cur == -1) { /* a comment has started */ - p_fb->p_data_cur = p_data_cur + 1; /* after comment start */ - const int rc = fb_skip_to_eol(p_fb); - if (rc != 0) { /* EOF or error */ - return rc; - } - - /* Update local variables. Note that p_fb->p_data_cur is at - * the character after the comment, which is a \n or \r. - * These characters are whitespace that will be skipped, - * so incrementing past it in the ++p_data_cur of the for() - * only skips a character that will be skipped anyhow. - * (A long comment to say that - * p_data_cur = p_fb->p_data_cur - 1 is not necessary.) */ - p_data_cur = p_fb->p_data_cur; - p_data_end = p_fb->p_data_end; - } /* end of comment processing */ - /* Else whitespace, which is skipped */ - } /* end of loop over current text */ - - p_fb->p_data_cur = p_data_cur; /* update current position */ - const int rc = fb_fill(p_fb); /* Try to refill buffer */ - if (rc != 0) { /* EOF or error */ - return rc; - } - /* Else got more text to process */ - p_data_cur = p_fb->p_data_cur; /* Update after fill */ - p_data_end = p_fb->p_data_end; - } /* end of loop over text pieces */ -} /* end of function fb_skip_whitespace */ - - - -/* Skip text to EOL char, starting at the current position */ -static int fb_skip_to_eol(FILEBUF *p_fb) -{ - /* Step through characters until not whitespace (including comments) */ - char *p_data_cur = p_fb->p_data_cur; - char *p_data_end = p_fb->p_data_end; - for ( ; ; ) { /* continue until done */ - for ( ; p_data_cur != p_data_end; ++p_data_cur) { /* current data */ - const char ch_cur = *p_data_cur; - if (ch_cur == '\n' || ch_cur == '\r') { - p_fb->p_data_cur = p_data_cur; - return 0; - } - /* Else not EOL, which is skipped */ - } /* end of loop over current text */ - - p_fb->p_data_cur = p_data_cur; /* update current position */ - const int rc = fb_fill(p_fb); /* Try to refill buffer */ - if (rc != 0) { /* EOF or error */ - return rc; - } - /* Else got more text to process */ - p_data_cur = p_fb->p_data_cur; /* Update after fill */ - p_data_end = p_fb->p_data_end; - } /* end of loop over text pieces */ -} /* end of function fb_skip_to_eol */ - - - -/* Return the data found in the most preferred format possible */ -static int fb_return_obj(FILEBUF *p_fb, - unsigned int n_type_wanted, FBTYPE *p_type_wanted, - FBTYPE *p_type_found, FBOBJ *p_fbobj) -{ - const char * const p_obj_start = p_fb->p_obj_start; /* data to convert */ - const char * const p_obj_end = p_fb->p_obj_end; - - /* Must test for null string separately since strto* does not set - * errno in this case. Aside from that, it can only be returned - * as a string anyhow. */ - if (p_obj_start != p_obj_end) { /* have a string besides "" */ - unsigned int i; - for (i = 0; i < n_type_wanted; ++i) { - FBTYPE type_cur = p_type_wanted[i]; - errno = 0; - if (type_cur == BUF_TYPE_ULONG) { - char *p_end; - unsigned long val = strtoul(p_obj_start, &p_end, 10); - /* Test for processing of full string. Note that checking - * for the end of the string rather than a NULL handles the - * case of an embedded NULL which the latter test would - * not */ - if (errno == 0 && p_end == p_obj_end) { - *p_type_found = BUF_TYPE_ULONG; - p_fbobj->ulong_value = val; - return 0; - } - } - else if (type_cur == BUF_TYPE_LONG) { - char *p_end; - long val = strtol(p_obj_start, &p_end, 10); - if (errno == 0 && p_end == p_obj_end) { - *p_type_found = BUF_TYPE_LONG; - p_fbobj->long_value = val; - return 0; - } - } - else if (type_cur == BUF_TYPE_DOUBLE) { - char *p_end; - double val = strtod(p_obj_start, &p_end); - if (errno == 0 && p_end == p_obj_end) { - *p_type_found = BUF_TYPE_DOUBLE; - p_fbobj->dbl_value = val; - return 0; - } - } - else if (type_cur == BUF_TYPE_STRING) { - break; /* exit loop and use default return of string */ - } - else { /* unknown type */ - print_error("Unknown output data type %d is ignored.", - (int) type_cur); - } - } /* end of loop trying types */ - } /* end of case that string is not "" */ - - /* If no rquested type was converted OK or string requested, return as - * a string */ - return fb_return_string(p_fb, p_type_found, p_fbobj); -} /* end of function fb_return_obj */ - - - -/* Return string */ -static int fb_return_string(FILEBUF *p_fb, - FBTYPE *p_type_found, FBOBJ *p_fbobj) -{ - const char *p_data_start = - p_fbobj->str_value.sz = p_fb->p_obj_start; - p_fbobj->str_value.n_char = p_fb->p_obj_end - p_data_start; - *p_type_found = BUF_TYPE_STRING; - return 0; -} /* end of function fb_return_string */ - - - diff --git a/src/xspice/cmpp/file_buffer.h b/src/xspice/cmpp/file_buffer.h deleted file mode 100644 index bee1f76fc..000000000 --- a/src/xspice/cmpp/file_buffer.h +++ /dev/null @@ -1,58 +0,0 @@ -#ifndef file_buffer_h_included -#define file_buffer_h_included - -#include - - -/* Null-terminated string prefixed by length excluding null */ -typedef struct Filebuf_len_str { - size_t n_char; /* length of string excluding null termination */ - char *sz; /* Start of string */ -} FBSTRING; - -/* Union for returned value */ -typedef union Filebuf_obj { - FBSTRING str_value; - unsigned long ulong_value; - long long_value; - double dbl_value; -} FBOBJ; - -/* Structure for getting file data */ -typedef struct Filebuf { - FILE *fp; /* handle to file */ - bool is_eof; /* flag that EOF reached */ - bool f_skip_to_eol; - /* Flag that text until the next EOL character should be - * skipped before getting the next item from the buffer. - * This flag is set when a comment terminates an item, - * such as "abc# This is a comment." */ - size_t n_byte_buf_alloc; /* Allocated buffer size */ - char *p_buf; /* buffer to receive data from file */ - char *p_obj_start; /* start of object being returned */ - char *p_obj_end; /* byte past object being returned */ - char *p_data_cur; /* current position in buffer. Depending on - * circumstances, it points to either the character - * being processed or the next character to process */ - char *p_data_end; /* byte past end of data in buffer */ - char *p_buf_end; /* byte past end of allocated buffer size, equal to - * p_buf + n_byte_buf_alloc, so it is redundant, but - * convenient to have available */ -} FILEBUF; - -/* Types of data */ -typedef enum FBtype { - BUF_TYPE_STRING, /* value type string (always possible) */ - BUF_TYPE_ULONG, /* value type an unsigned int */ - BUF_TYPE_LONG, /* value type an int */ - BUF_TYPE_DOUBLE /* value type double */ -} FBTYPE; - - -FILEBUF *fbopen(const char *filename, size_t n_byte_buf_init); -int fbget(FILEBUF *p_fb, unsigned int n_type_wanted, FBTYPE *p_type_wanted, - FBTYPE *p_type_found, FBOBJ *p_fbobj); -int fbclose(FILEBUF *fbp); - - -#endif /* include guard */ diff --git a/src/xspice/cmpp/ifs_lex.l b/src/xspice/cmpp/ifs_lex.l deleted file mode 100644 index 51339f0bd..000000000 --- a/src/xspice/cmpp/ifs_lex.l +++ /dev/null @@ -1,181 +0,0 @@ -%option case-insensitive -%option prefix="ifs_yy" -%option yylineno -%option noyywrap -%option noinput -%option nounput -%{ - -/*============================================================================ -FILE ifs_lex.l - -MEMBER OF process cmpp - -Copyright 1991 -Georgia Tech Research Corporation -Atlanta, Georgia 30332 -All Rights Reserved - -PROJECT A-8503 - -AUTHORS - - 9/12/91 Steve Tynor - -MODIFICATIONS - - 12/31/91 Bill Kuhn Change "array" to "vector" and "array_bounds" - to "vector_bounds". - -SUMMARY - - This file defines tokens applicable to parsing the ifspec.ifs - file, and actions to be taken on encountering those tokens. - -INTERFACES - - None. - -REFERENCED FILES - - ifs_yacc.y - -NON-STANDARD FEATURES - - None. - -============================================================================*/ - -#include - -#include "ifs_yacc_y.h" -#include "ifs_yacc.h" - -int yyival; -double yydval; - -/* - * IFS specs are case insensitive: - */ - -/*---------------------------------------------------------------------------*/ - -%} - -%start BOOL CTYPE DIR DTYPE - -%x comment stringl - -%p 5000 - -W [ \t\n] -A [_a-z] -D [0-9] -I [a-z_] -Z [0-9a-z_] -E [eE][+-]?{D}+ - -%% - -"/*" { BEGIN(comment); } - -[^*\n]* /* eat anything that's not a '*' */ - -"*"+[^*/\n]* /* eat up '*'s not followed by '/'s */ - -\n /* new line */ - -<> {ifs_yyerror ("Unterminated comment"); - BEGIN(INITIAL); - yyterminate(); } - -"*"+"/" { BEGIN(INITIAL); } - -"\"" { BEGIN(stringl); } - -[^\"]* { return TOK_STRING_LITERAL; } - -"\"" { BEGIN(INITIAL); } - -<> {ifs_yyerror ("Unterminated string literal"); - BEGIN(INITIAL); - yyterminate(); } - -allowed_types{W}*: {BEGIN CTYPE; return TOK_ALLOWED_TYPES;} -vector{W}*: {BEGIN BOOL; return TOK_ARRAY;} -vector_bounds{W}*: {return TOK_ARRAY_BOUNDS;} -c_function_name{W}*: {return TOK_C_FUNCTION_NAME;} -port_name{W}*: {return TOK_PORT_NAME;} -port_table{W}*: {return TOK_PORT_TABLE;} -data_type{W}*: {BEGIN DTYPE; return TOK_DATA_TYPE;} -default_type{W}*: {BEGIN CTYPE; return TOK_DEFAULT_TYPE;} -default_value{W}*: {return TOK_DEFAULT_VALUE;} -description{W}*: {return TOK_DESCRIPTION;} -direction{W}*: {BEGIN DIR; return TOK_DIRECTION;} -static_var_name{W}*: {return TOK_STATIC_VAR_NAME;} -static_var_table{W}*: {return TOK_STATIC_VAR_TABLE;} -limits{W}*: {return TOK_LIMITS;} -name_table{W}*: {return TOK_NAME_TABLE;} -null_allowed{W}*: {BEGIN BOOL; return TOK_NULL_ALLOWED;} -parameter_name{W}*: {return TOK_PARAMETER_NAME;} -parameter_table{W}*: {return TOK_PARAMETER_TABLE;} -spice_model_name{W}*: {return TOK_SPICE_MODEL_NAME;} - -yes {return TOK_BOOL_YES;} -no {return TOK_BOOL_NO;} -true {return TOK_BOOL_YES;} -false {return TOK_BOOL_NO;} - -v {return TOK_CTYPE_V;} -vd {return TOK_CTYPE_VD;} -vnam {return TOK_CTYPE_VNAM;} -i {return TOK_CTYPE_I;} -id {return TOK_CTYPE_ID;} -g {return TOK_CTYPE_G;} -gd {return TOK_CTYPE_GD;} -h {return TOK_CTYPE_H;} -hd {return TOK_CTYPE_HD;} -d {return TOK_CTYPE_D;} - -in {return TOK_DIR_IN;} -out {return TOK_DIR_OUT;} -inout {return TOK_DIR_INOUT;} - -real {return TOK_DTYPE_REAL;} -int {return TOK_DTYPE_INT;} -boolean {return TOK_DTYPE_BOOLEAN;} -complex {return TOK_DTYPE_COMPLEX;} -string {return TOK_DTYPE_STRING;} -pointer {return TOK_DTYPE_POINTER;} - -"<" {return TOK_LANGLE;} -">" {return TOK_RANGLE;} -"[" {return TOK_LBRACKET;} -"]" {return TOK_RBRACKET;} -"," {return TOK_COMMA;} -"-" {return TOK_DASH;} - - -{I}+{Z}* {return TOK_IDENTIFIER;} - -[+-]?{D}+ {yyival = atoi (yytext); - return TOK_INT_LITERAL;} - -[+-]?{D}+"."{D}*({E})? | -[+-]?{D}*"."{D}+({E})? | -[+-]?{D}+({E})? {yydval = atof (yytext); - return TOK_REAL_LITERAL;} - -. ; /* ignore anything else */ -\n ; /* ignore anything else */ - -%% - -/*--------------------------------------------------------------------------*/ - -#if 0 -void reset_lex_context (void) -{ - BEGIN 0; -} -#endif diff --git a/src/xspice/cmpp/ifs_yacc.y b/src/xspice/cmpp/ifs_yacc.y deleted file mode 100644 index 6bc55a3a7..000000000 --- a/src/xspice/cmpp/ifs_yacc.y +++ /dev/null @@ -1,954 +0,0 @@ -%{ - -/*============================================================================ -FILE ifs_yacc.y - -MEMBER OF process cmpp - -Copyright 1991 -Georgia Tech Research Corporation -Atlanta, Georgia 30332 -All Rights Reserved - -PROJECT A-8503 - -AUTHORS - - 9/12/91 Steve Tynor - -MODIFICATIONS - - 12/31/91 Bill Kuhn Fix bug in usage of strcmp in check_default_type() - -SUMMARY - - This file contains the BNF specification of the language used in - the ifspec.ifs file together with various support functions, - and parses the ifspec.ifs file to get the information from it - and place this information into a data structure - of type Ifs_Table_t. - -INTERFACES - - yyparse() - Generated automatically by UNIX 'yacc' utility. - -REFERENCED FILES - - ifs_lex.l - -NON-STANDARD FEATURES - - None. - -============================================================================*/ - -#include -#include -#include -#include "ifs_yacc_y.h" - -#define yymaxdepth ifs_yymaxdepth -#define yyparse ifs_yyparse -#define yylex ifs_yylex -#define yyerror ifs_yyerror -#define yylval ifs_yylval -#define yychar ifs_yychar -#define yydebug ifs_yydebug -#define yypact ifs_yypact -#define yyr1 ifs_yyr1 -#define yyr2 ifs_yyr2 -#define yydef ifs_yydef -#define yychk ifs_yychk -#define yypgo ifs_yypgo -#define yyact ifs_yyact -#define yyexca ifs_yyexca -#define yyerrflag ifs_yyerrflag -#define yynerrs ifs_yynerrs -#define yyps ifs_yyps -#define yypv ifs_yypv -#define yys ifs_yys -#define yy_yys ifs_yyyys -#define yystate ifs_yystate -#define yytmp ifs_yytmp -#define yyv ifs_yyv -#define yy_yyv ifs_yyyyv -#define yyval ifs_yyval -#define yylloc ifs_yylloc -#define yyreds ifs_yyreds -#define yytoks ifs_yytoks -#define yylhs ifs_yyyylhs -#define yylen ifs_yyyylen -#define yydefred ifs_yyyydefred -#define yydgoto ifs_yyyydgoto -#define yysindex ifs_yyyysindex -#define yyrindex ifs_yyyyrindex -#define yygindex ifs_yyyygindex -#define yytable ifs_yyyytable -#define yycheck ifs_yyyycheck -#define yyname ifs_yyyyname -#define yyrule ifs_yyyyrule - -extern int yylineno; -extern int yyival; -extern double yydval; -extern char *ifs_yytext; - extern int ifs_yylex(void); - -bool parser_just_names; -static bool saw_model_name; -static bool saw_function_name; - -static char *dtype_to_str[] = { - "BOOLEAN", "INTEGER", "REAL", "COMPLEX", "STRING", "POINTER" - }; - -static bool did_default_type; -static bool did_allowed_types; - -static int num_items; -static int item; -static int item_offset; -static bool num_items_fixed; - -Ifs_Table_t *parser_ifs_table; -#define TBL parser_ifs_table - -int ifs_num_errors; - -static size_t alloced_size [4]; - -/* - * !!!!! Make sure these are large enough so that they never get realloced - * !!!!! since that will cause garbage uninitialized data... - * !!!!! (FIX THIS!) - */ -#define DEFAULT_SIZE_CONN 100 -#define DEFAULT_SIZE_PARAM 100 -#define DEFAULT_SIZE_INST_VAR 100 -#define GROW_SIZE 10 - -typedef enum { - TBL_NAME, - TBL_PORT, - TBL_PARAMETER, - TBL_STATIC_VAR, -} Table_t; - -typedef struct { - Table_t table; - int record; -} Context_t; - -Context_t context; - -#define ITEM_BUFFER_SIZE 20 /* number of items that can be put in a table - * before requiring a new xxx_TABLE: keyword - */ -#define FOR_ITEM(i) for (i = item_offset; i < num_items; i++) -#define ITEM_BUF(i) item_buffer[i-item_offset] - -#define ASSIGN_BOUNDS(struct_name, i) \ - if (ITEM_BUF(i).range.is_named) {\ - TBL->struct_name[i].has_conn_ref = true;\ - TBL->struct_name[i].conn_ref = find_conn_ref (ITEM_BUF(i).range.u.name);\ - } else {\ - TBL->struct_name[i].has_conn_ref = false;\ - TBL->struct_name[i].has_lower_bound =\ - ITEM_BUF(i).range.u.bounds.lower.has_bound;\ - TBL->struct_name[i].has_upper_bound =\ - ITEM_BUF(i).range.u.bounds.upper.has_bound;\ - if (TBL->struct_name[i].has_lower_bound) {\ - assert (ITEM_BUF(i).range.u.bounds.lower.bound.kind == CMPP_INTEGER);\ - TBL->struct_name[i].lower_bound =\ - ITEM_BUF(i).range.u.bounds.lower.bound.u.ivalue;\ - }\ - if (TBL->struct_name[i].has_upper_bound) {\ - assert (ITEM_BUF(i).range.u.bounds.upper.bound.kind == CMPP_INTEGER);\ - TBL->struct_name[i].upper_bound =\ - ITEM_BUF(i).range.u.bounds.upper.bound.u.ivalue;\ - }\ - } - -/*---------------------------------------------------------------------------*/ -static void fatal (char *str) -{ - yyerror (str); - exit(1); -} - -/*---------------------------------------------------------------------------*/ -static int -find_conn_ref (char *name) -{ - int i; - char str[130]; - - for (i = 0; i < TBL->num_conn; i++) { - if (strcmp (name, TBL->conn[i].name) == 0) { - return i; - } - } - sprintf (str, "Port `%s' not found", name); - yyerror (str); - ifs_num_errors++; - - return 0; -} - -typedef enum {C_DOUBLE, C_BOOLEAN, C_POINTER, C_UNDEF} Ctype_Class_t; - -/*---------------------------------------------------------------------------*/ -static Ctype_Class_t get_ctype_class (Port_Type_t type) -{ - switch (type) { - case USER_DEFINED: - return C_POINTER; - break; - case DIGITAL: - return C_BOOLEAN; - break; - default: - return C_DOUBLE; - break; - } -} - -/*---------------------------------------------------------------------------*/ -static void check_port_type_direction (Dir_t dir, Port_Type_t port_type) -{ - switch (port_type) { - case VOLTAGE: - case DIFF_VOLTAGE: - case CURRENT: - case DIFF_CURRENT: - if (dir == CMPP_INOUT) { - yyerror ("Port types `v', `vd', `i', `id' are not valid for `inout' ports"); - ifs_num_errors++; - } - break; - case DIGITAL: - case USER_DEFINED: - /* - * anything goes - */ - break; - case VSOURCE_CURRENT: - if (dir != CMPP_IN) { - yyerror ("Port type `vnam' is only valid for `in' ports"); - ifs_num_errors++; - } - break; - case CONDUCTANCE: - case DIFF_CONDUCTANCE: - case RESISTANCE: - case DIFF_RESISTANCE: - if (dir != CMPP_INOUT) { - yyerror ("Port types `g', `gd', `h', `hd' are only valid for `inout' ports"); - ifs_num_errors++; - } - break; - default: - assert (0); - } -} - -/*---------------------------------------------------------------------------*/ -static void check_dtype_not_pointer (Data_Type_t dtype) -{ - if (dtype == CMPP_POINTER) { - yyerror("Invalid parameter type - POINTER type valid only for STATIC_VARs"); - ifs_num_errors++; - } -} - -/*---------------------------------------------------------------------------*/ -static void check_default_type (Conn_Info_t conn) -{ - int i; - - for (i = 0; i < conn.num_allowed_types; i++) { - if (conn.default_port_type == conn.allowed_port_type[i]) { - if ((conn.default_port_type != USER_DEFINED) || - (strcmp (conn.default_type, conn.allowed_type[i]) == 0)) { - return; - } - } - } - yyerror ("Port default type is not an allowed type"); - ifs_num_errors++; -} - -/*---------------------------------------------------------------------------*/ -static void -assign_ctype_list (Conn_Info_t *conn, Ctype_List_t *ctype_list ) -{ - int i; - Ctype_List_t *p; - Ctype_Class_t ctype_class = C_UNDEF; - - conn->num_allowed_types = 0; - for (p = ctype_list; p; p = p->next) { - conn->num_allowed_types++; - } - conn->allowed_type = (char**) calloc ((size_t) conn->num_allowed_types, - sizeof (char*)); - conn->allowed_port_type = (Port_Type_t*) calloc ((size_t) conn->num_allowed_types, - sizeof (Port_Type_t)); - if (! (conn->allowed_type && conn->allowed_port_type)) { - fatal ("Could not allocate memory"); - } - for (i = conn->num_allowed_types-1, p = ctype_list; p; i--, p = p->next) { - if (ctype_class == C_UNDEF) { - ctype_class = get_ctype_class (p->ctype.kind); - } - if (ctype_class != get_ctype_class (p->ctype.kind)) { - yyerror ("Incompatible port types in `allowed_types' clause"); - ifs_num_errors++; - } - check_port_type_direction (conn->direction, p->ctype.kind); - - conn->allowed_port_type[i] = p->ctype.kind; - conn->allowed_type[i] = p->ctype.id; - } -} - -/*---------------------------------------------------------------------------*/ -static void -assign_value (Data_Type_t type, Value_t *dest_value, My_Value_t src_value) -{ - char str[200]; - if ((type == CMPP_REAL) && (src_value.kind == CMPP_INTEGER)) { - dest_value->rvalue = src_value.u.ivalue; - return; - } else if (type != src_value.kind) { - sprintf (str, "Invalid parameter type (saw %s - expected %s)", - dtype_to_str[src_value.kind], - dtype_to_str[type] ); - yyerror (str); - ifs_num_errors++; - } - switch (type) { - case CMPP_BOOLEAN: - dest_value->bvalue = src_value.u.bvalue; - break; - case CMPP_INTEGER: - dest_value->ivalue = src_value.u.ivalue; - break; - case CMPP_REAL: - dest_value->rvalue = src_value.u.rvalue; - break; - case CMPP_COMPLEX: - dest_value->cvalue = src_value.u.cvalue; - break; - case CMPP_STRING: - dest_value->svalue = src_value.u.svalue; - break; - default: - yyerror ("INTERNAL ERROR - unexpected data type in `assign_value'"); - ifs_num_errors++; - } -} - -/*---------------------------------------------------------------------------*/ -static void -assign_limits (Data_Type_t type, Param_Info_t *param, Range_t range) -{ - if (range.is_named) { - yyerror ("Named range not allowed for limits"); - ifs_num_errors++; - } - param->has_lower_limit = range.u.bounds.lower.has_bound; - if (param->has_lower_limit) { - assign_value (type, ¶m->lower_limit, range.u.bounds.lower.bound); - } - param->has_upper_limit = range.u.bounds.upper.has_bound; - if (param->has_upper_limit) { - assign_value (type, ¶m->upper_limit, range.u.bounds.upper.bound); - } -} - -/*---------------------------------------------------------------------------*/ -static void -check_item_num (void) -{ - if (item-item_offset >= ITEM_BUFFER_SIZE) { - fatal ("Too many items in table - split into sub-tables"); - } - if (item > (int) alloced_size [context.table] ) { - switch (context.table) { - case TBL_NAME: - break; - case TBL_PORT: - alloced_size[context.table] += GROW_SIZE; - TBL->conn = (Conn_Info_t*) - realloc (TBL->conn, - alloced_size [context.table] * sizeof (Conn_Info_t)); - if (! TBL->conn) { - fatal ("Error allocating memory for port definition"); - } - break; - case TBL_PARAMETER: - alloced_size [context.table] += GROW_SIZE; - TBL->param = (Param_Info_t*) - realloc (TBL->param, - alloced_size [context.table] * sizeof (Param_Info_t)); - if (! TBL->param) { - fatal ("Error allocating memory for parameter definition"); - } - break; - case TBL_STATIC_VAR: - alloced_size [context.table] += GROW_SIZE; - TBL->inst_var = (Inst_Var_Info_t*) - realloc (TBL->inst_var, - alloced_size [context.table] * sizeof (Inst_Var_Info_t)); - if (! TBL->inst_var) { - fatal ("Error allocating memory for static variable definition"); - } - break; - } - } - item++; -} - -/*---------------------------------------------------------------------------*/ -static void -check_end_item_num (void) -{ - if (num_items_fixed) { - if (item != num_items) { - char buf[200]; - sprintf - (buf, - "Wrong number of elements in sub-table (saw %d - expected %d)", - item - item_offset, - num_items - item_offset); - fatal (buf); - } - } else { - num_items = item; - num_items_fixed = true; - switch (context.table) { - case TBL_NAME: - break; - case TBL_PORT: - TBL->num_conn = num_items; - break; - case TBL_PARAMETER: - TBL->num_param = num_items; - break; - case TBL_STATIC_VAR: - TBL->num_inst_var = num_items; - break; - } - } - item = item_offset; -} - -#define INIT(n) item = (n); item_offset = (n); num_items = (n); num_items_fixed = false -#define ITEM check_item_num() -#define END check_end_item_num() - -%} - -%token TOK_ALLOWED_TYPES -%token TOK_ARRAY -%token TOK_ARRAY_BOUNDS -%token TOK_BOOL_NO -%token TOK_BOOL_YES -%token TOK_COMMA -%token TOK_PORT_NAME -%token TOK_PORT_TABLE -%token TOK_CTYPE_D -%token TOK_CTYPE_G -%token TOK_CTYPE_GD -%token TOK_CTYPE_H -%token TOK_CTYPE_HD -%token TOK_CTYPE_I -%token TOK_CTYPE_ID -%token TOK_CTYPE_V -%token TOK_CTYPE_VD -%token TOK_CTYPE_VNAM -%token TOK_C_FUNCTION_NAME -%token TOK_DASH -%token TOK_DATA_TYPE -%token TOK_DEFAULT_TYPE -%token TOK_DEFAULT_VALUE -%token TOK_DESCRIPTION -%token TOK_DIRECTION -%token TOK_DIR_IN -%token TOK_DIR_INOUT -%token TOK_DIR_OUT -%token TOK_DTYPE_BOOLEAN -%token TOK_DTYPE_COMPLEX -%token TOK_DTYPE_INT -%token TOK_DTYPE_POINTER -%token TOK_DTYPE_REAL -%token TOK_DTYPE_STRING -%token TOK_IDENTIFIER -%token TOK_STATIC_VAR_NAME -%token TOK_STATIC_VAR_TABLE -%token TOK_INT_LITERAL -%token TOK_LANGLE -%token TOK_LBRACKET -%token TOK_LIMITS -%token TOK_NAME_TABLE -%token TOK_NULL_ALLOWED -%token TOK_PARAMETER_NAME -%token TOK_PARAMETER_TABLE -%token TOK_RANGLE -%token TOK_RBRACKET -%token TOK_REAL_LITERAL -%token TOK_SPICE_MODEL_NAME -%token TOK_STRING_LITERAL - -%union { - Ctype_List_t *ctype_list; - Dir_t dir; - bool btype; - Range_t range; - Data_Type_t dtype; - My_Port_Type_t ctype; - My_Value_t value; - char *str; - Bound_t bound; - int ival; - double rval; - Complex_t cval; -} - -%type ctype_list delimited_ctype_list -%type direction -%type ctype -%type dtype -%type range int_range -%type value number integer_value value_or_dash -%type identifier string -%type btype -%type int_or_dash number_or_dash -%type integer -%type real -%type complex - -%start ifs_file - -%{ -/* - * resuse the Yacc union for our buffer: - */ -YYSTYPE item_buffer [ITEM_BUFFER_SIZE]; - -/* - * Shorthand for refering to the current element of the item buffer: - */ -#define BUF ITEM_BUF(item-1) - -%} - -%% - -ifs_file : {TBL->num_conn = 0; - TBL->num_param = 0; - TBL->num_inst_var = 0; - - saw_function_name = false; - saw_model_name = false; - - alloced_size [TBL_PORT] = DEFAULT_SIZE_CONN; - alloced_size [TBL_PARAMETER] = DEFAULT_SIZE_PARAM; - alloced_size [TBL_STATIC_VAR] = DEFAULT_SIZE_INST_VAR; - - TBL->conn = (Conn_Info_t*) - calloc(DEFAULT_SIZE_CONN, sizeof (Conn_Info_t)); - TBL->param = (Param_Info_t*) - calloc (DEFAULT_SIZE_PARAM, sizeof (Param_Info_t)); - TBL->inst_var = (Inst_Var_Info_t*) - calloc (DEFAULT_SIZE_INST_VAR, sizeof (Inst_Var_Info_t)); - if (! (TBL->conn && TBL->param && TBL->inst_var) ) { - fatal ("Could not allocate enough memory"); - } - } - list_of_tables - ; - -list_of_tables : table - | list_of_tables table - ; - -table : TOK_NAME_TABLE - {context.table = TBL_NAME;} - name_table - | TOK_PORT_TABLE - {context.table = TBL_PORT; - did_default_type = false; - did_allowed_types = false; - INIT (TBL->num_conn);} - port_table - {TBL->num_conn = num_items;} - | TOK_PARAMETER_TABLE - {context.table = TBL_PARAMETER; - INIT (TBL->num_param);} - parameter_table - {TBL->num_param = num_items;} - | TOK_STATIC_VAR_TABLE - {context.table = TBL_STATIC_VAR; - INIT (TBL->num_inst_var);} - static_var_table - {TBL->num_inst_var = num_items;} - ; - -name_table : /* empty */ - | name_table name_table_item - ; - -name_table_item : TOK_C_FUNCTION_NAME identifier - {TBL->name.c_fcn_name =strdup (ifs_yytext); - saw_function_name = true; - if (parser_just_names && saw_model_name) return 0;} - | TOK_SPICE_MODEL_NAME identifier - {TBL->name.model_name = strdup (ifs_yytext); - saw_model_name = true; - if (parser_just_names && saw_function_name) return 0;} - | TOK_DESCRIPTION string - {TBL->name.description = strdup (ifs_yytext);} - ; - -port_table : /* empty */ - | port_table port_table_item - ; - -port_table_item : TOK_PORT_NAME list_of_ids - {int i; - END; - FOR_ITEM (i) { - TBL->conn[i].name = ITEM_BUF(i).str; - }} - | TOK_DESCRIPTION list_of_strings - {int i; - END; - FOR_ITEM (i) { - TBL->conn[i].description = ITEM_BUF(i).str; - }} - | TOK_DIRECTION list_of_directions - {int i; - END; - FOR_ITEM (i) { - TBL->conn[i].direction = ITEM_BUF(i).dir; - }} - | TOK_DEFAULT_TYPE list_of_ctypes - {int i; - END; - did_default_type = true; - FOR_ITEM (i) { - TBL->conn[i].default_port_type = - ITEM_BUF(i).ctype.kind; - TBL->conn[i].default_type = ITEM_BUF(i).ctype.id; - if (did_allowed_types) { - check_default_type (TBL->conn[i]); - } - }} - | TOK_ALLOWED_TYPES list_of_ctype_lists - {int i; - END; - did_allowed_types = true; - FOR_ITEM (i) { - assign_ctype_list (&TBL->conn[i], - ITEM_BUF(i).ctype_list); - if (did_default_type) { - check_default_type (TBL->conn[i]); - } - }} - | TOK_ARRAY list_of_bool - {int i; - END; - FOR_ITEM (i) { - TBL->conn[i].is_array = ITEM_BUF(i).btype; - }} - | TOK_ARRAY_BOUNDS list_of_array_bounds - {int i; - END; - FOR_ITEM (i) { - ASSIGN_BOUNDS (conn, i); - assert (!TBL->conn[i].has_conn_ref); - }} - | TOK_NULL_ALLOWED list_of_bool - {int i; - END; - FOR_ITEM (i) { - TBL->conn[i].null_allowed = ITEM_BUF(i).btype; - }} - ; - -parameter_table : /* empty */ - | parameter_table parameter_table_item - ; - -parameter_table_item : TOK_PARAMETER_NAME list_of_ids - {int i; - END; - FOR_ITEM (i) { - TBL->param[i].name = ITEM_BUF(i).str; - }} - | TOK_DESCRIPTION list_of_strings - {int i; - END; - FOR_ITEM (i) { - TBL->param[i].description = ITEM_BUF(i).str; - }} - | TOK_DATA_TYPE list_of_dtypes - {int i; - END; - FOR_ITEM (i) { - check_dtype_not_pointer (ITEM_BUF(i).dtype); - TBL->param[i].type = ITEM_BUF(i).dtype; - }} - | TOK_DEFAULT_VALUE list_of_values - {int i; - END; - FOR_ITEM (i) { - TBL->param[i].has_default = - ITEM_BUF(i).value.has_value; - if (TBL->param[i].has_default) { - assign_value (TBL->param[i].type, - &TBL->param[i].default_value, - ITEM_BUF(i).value); - } - }} - | TOK_LIMITS list_of_ranges - {int i; - END; - FOR_ITEM (i) { - assign_limits (TBL->param[i].type, - &TBL->param[i], - ITEM_BUF(i).range); - }} - | TOK_ARRAY list_of_bool - {int i; - END; - FOR_ITEM (i) { - TBL->param[i].is_array = ITEM_BUF(i).btype; - }} - | TOK_ARRAY_BOUNDS list_of_array_bounds - {int i; - END; - FOR_ITEM (i) { - ASSIGN_BOUNDS (param, i); - }} - | TOK_NULL_ALLOWED list_of_bool - {int i; - END; - FOR_ITEM (i) { - TBL->param[i].null_allowed = ITEM_BUF(i).btype; - }} - ; - -static_var_table : /* empty */ - | static_var_table static_var_table_item - ; - -static_var_table_item : TOK_STATIC_VAR_NAME list_of_ids - {int i; - END; - FOR_ITEM (i) { - TBL->inst_var[i].name = ITEM_BUF(i).str; - }} - | TOK_DESCRIPTION list_of_strings - {int i; - END; - FOR_ITEM (i) { - TBL->inst_var[i].description = ITEM_BUF(i).str; - }} - | TOK_DATA_TYPE list_of_dtypes - {int i; - END; - FOR_ITEM (i) { - TBL->inst_var[i].type = ITEM_BUF(i).dtype; - }} - | TOK_ARRAY list_of_bool - {int i; - END; - FOR_ITEM (i) { - TBL->inst_var[i].is_array = ITEM_BUF(i).btype; - }} - ; - -list_of_ids : /* empty */ - | list_of_ids identifier {ITEM; BUF.str = $2;} - ; - -list_of_array_bounds : /* empty */ - | list_of_array_bounds int_range - {ITEM; - BUF.range = $2;} - | list_of_array_bounds identifier - {ITEM; - BUF.range.is_named = true; - BUF.range.u.name = $2;} - ; - -list_of_strings : /* empty */ - | list_of_strings string {ITEM; BUF.str = $2;} - ; - -list_of_directions : /* empty */ - | list_of_directions direction {ITEM; BUF.dir = $2;} - ; - -direction : TOK_DIR_IN {$$ = CMPP_IN;} - | TOK_DIR_OUT {$$ = CMPP_OUT;} - | TOK_DIR_INOUT {$$ = CMPP_INOUT;} - ; - -list_of_bool : /* empty */ - | list_of_bool btype {ITEM; BUF.btype = $2;} - ; - -list_of_ctypes : /* empty */ - | list_of_ctypes ctype {ITEM; BUF.ctype = $2;} - ; - -ctype : TOK_CTYPE_V {$$.kind = VOLTAGE;} - | TOK_CTYPE_VD {$$.kind = DIFF_VOLTAGE;} - | TOK_CTYPE_VNAM {$$.kind = VSOURCE_CURRENT;} - | TOK_CTYPE_I {$$.kind = CURRENT;} - | TOK_CTYPE_ID {$$.kind = DIFF_CURRENT;} - | TOK_CTYPE_G {$$.kind = CONDUCTANCE;} - | TOK_CTYPE_GD {$$.kind = DIFF_CONDUCTANCE;} - | TOK_CTYPE_H {$$.kind = RESISTANCE;} - | TOK_CTYPE_HD {$$.kind = DIFF_RESISTANCE;} - | TOK_CTYPE_D {$$.kind = DIGITAL;} - | identifier {$$.kind = USER_DEFINED; - $$.id = $1;} - ; - -list_of_dtypes : /* empty */ - | list_of_dtypes dtype {ITEM; BUF.dtype = $2;} - ; - -dtype : TOK_DTYPE_REAL {$$ = CMPP_REAL;} - | TOK_DTYPE_INT {$$ = CMPP_INTEGER;} - | TOK_DTYPE_BOOLEAN {$$ = CMPP_BOOLEAN;} - | TOK_DTYPE_COMPLEX {$$ = CMPP_COMPLEX;} - | TOK_DTYPE_STRING {$$ = CMPP_STRING;} - | TOK_DTYPE_POINTER {$$ = CMPP_POINTER;} - ; - -list_of_ranges : /* empty */ - | list_of_ranges range {ITEM; BUF.range = $2;} - ; - -int_range : TOK_DASH {$$.is_named = false; - $$.u.bounds.lower.has_bound = false; - $$.u.bounds.upper.has_bound = false;} - | TOK_LBRACKET int_or_dash maybe_comma int_or_dash - TOK_RBRACKET - {$$.is_named = false; - $$.u.bounds.lower = $2; - $$.u.bounds.upper = $4;} - ; - -maybe_comma : /* empty */ - | TOK_COMMA - ; - -int_or_dash : TOK_DASH {$$.has_bound = false;} - | integer_value {$$.has_bound = true; - $$.bound = $1;} - ; - -range : TOK_DASH {$$.is_named = false; - $$.u.bounds.lower.has_bound = false; - $$.u.bounds.upper.has_bound = false;} - | TOK_LBRACKET number_or_dash maybe_comma - number_or_dash TOK_RBRACKET - {$$.is_named = false; - $$.u.bounds.lower = $2; - $$.u.bounds.upper = $4;} - ; - -number_or_dash : TOK_DASH {$$.has_bound = false;} - | number {$$.has_bound = true; - $$.bound = $1;} - ; - -list_of_values : /* empty */ - | list_of_values value_or_dash {ITEM; BUF.value = $2;} - ; - -value_or_dash : TOK_DASH {$$.has_value = false;} - | value - ; - -value : string {$$.has_value = true; - $$.kind = CMPP_STRING; - $$.u.svalue = $1;} - | btype {$$.has_value = true; - $$.kind = CMPP_BOOLEAN; - $$.u.bvalue = $1;} - | complex {$$.has_value = true; - $$.kind = CMPP_COMPLEX; - $$.u.cvalue = $1;} - | number - ; - -complex : TOK_LANGLE real maybe_comma real TOK_RANGLE - {$$.real = $2; - $$.imag = $4;} - ; - -list_of_ctype_lists : /* empty */ - | list_of_ctype_lists delimited_ctype_list - {ITEM; BUF.ctype_list = $2;} - ; - -delimited_ctype_list : TOK_LBRACKET ctype_list TOK_RBRACKET {$$ = $2;} - ; - -ctype_list : ctype - {$$ = (Ctype_List_t*)calloc (1, - sizeof (Ctype_List_t)); - if (!$$) { - fatal ("Error allocating memory"); - } - $$->ctype = $1; - $$->next = (Ctype_List_t*)0;} - | ctype_list maybe_comma ctype - {$$ = (Ctype_List_t*)calloc (1, - sizeof (Ctype_List_t)); - if (!$$) { - fatal ("Error allocating memory"); - } - $$->ctype = $3; - $$->next = $1; - /*$$->next = (Ctype_List_t*)0; - assert ($1); - $1->next = $$;*/} - ; - -btype : TOK_BOOL_YES {$$ = true;} - | TOK_BOOL_NO {$$ = false;} - ; - -string : TOK_STRING_LITERAL {$$ = strdup(ifs_yytext);} - ; - -identifier : TOK_IDENTIFIER {$$ = strdup(ifs_yytext);} - ; - -number : real {$$.has_value = true; - $$.kind = CMPP_REAL; - $$.u.rvalue = $1;} - | integer_value - ; - -integer_value : integer {$$.has_value = true; - $$.kind = CMPP_INTEGER; - $$.u.ivalue = $1;} - ; - -real : TOK_REAL_LITERAL {$$ = yydval;} - ; - -integer : TOK_INT_LITERAL {$$ = yyival;} - ; - -%% diff --git a/src/xspice/cmpp/ifs_yacc_y.h b/src/xspice/cmpp/ifs_yacc_y.h deleted file mode 100644 index 745e06cd0..000000000 --- a/src/xspice/cmpp/ifs_yacc_y.h +++ /dev/null @@ -1,81 +0,0 @@ -/*============================================================================ -FILE ifs_yacc.h - -MEMBER OF process cmpp - -Public Domain - -Georgia Tech Research Corporation -Atlanta, Georgia 30332 -PROJECT A-8503 - -AUTHORS - - 9/12/91 Steve Tynor - -MODIFICATIONS - - - -SUMMARY - - Typedefs needed by the YYSTYPE union (%union operator) in the yacc - file. These are only used in the yacc file, but must be defined here since - the generated token.h file includes a definition of the union YYSTYPE. - -INTERFACES - - None. - -REFERENCED FILES - - None. - -NON-STANDARD FEATURES - - None. - -============================================================================*/ - -#include "cmpp.h" - -typedef struct { - bool has_value; - Data_Type_t kind; - union { - bool bvalue; - int ivalue; - double rvalue; - Complex_t cvalue; - char *svalue; - } u; -} My_Value_t; - -typedef struct { - bool has_bound; - My_Value_t bound; -} Bound_t; - -typedef struct { - bool is_named; - union { - char *name; - struct { - Bound_t upper; - Bound_t lower; - } bounds; - } u; -} Range_t; - -typedef struct { - Port_Type_t kind; - char *id; /* undefined unless kind == USER_DEFINED */ -} My_Port_Type_t; - -typedef struct ctype_list_s { - My_Port_Type_t ctype; - struct ctype_list_s *next; -} Ctype_List_t; - - -extern void ifs_yyerror(char*); diff --git a/src/xspice/cmpp/main.c b/src/xspice/cmpp/main.c deleted file mode 100644 index 139d18612..000000000 --- a/src/xspice/cmpp/main.c +++ /dev/null @@ -1,222 +0,0 @@ -/*============================================================================ -FILE main.c - -MEMBER OF process cmpp - -Public Domain - -Georgia Tech Research Corporation -Atlanta, Georgia 30332 -PROJECT A-8503 - -AUTHORS - - 9/12/91 Bill Kuhn - -MODIFICATIONS - - - -SUMMARY - - This file contains the top-level function for the Code Model - PreProcessor (cmpp). It handles reading the command-line - arguments, and then vectors to an appropriate function. - -INTERFACES - - main() - -REFERENCED FILES - - None. - -NON-STANDARD FEATURES - - None. -============================================================================*/ -#ifdef DEBUG_CMPP -#ifdef _WIN32 -#include -#endif -#endif - -#include -#include -#include - -#include "cmpp.h" - - -#define USAGE_MSG \ - "Usage: cmpp [-ifs] | [-mod []] | [-lst] | [-p fn.lst]" -#define TOO_FEW_ARGS "ERROR - Too few arguments" -#define TOO_MANY_ARGS "ERROR - Too many arguments" -#define UNRECOGNIZED_ARGS "ERROR - Unrecognized argument" - - -#ifdef DEBUG_CMPP -#define PRINT_CMPP_INFO(argc, argv) print_cmpp_info(argc, argv); -static void print_cmpp_info(int argc, char **argv); -#else -#define PRINT_CMPP_INFO(argc, argv) -#endif - - - -/* *********************************************************************** */ -/* -main - -Function main checks the validity of the command-line arguments -supplied when the program is invoked and calls one of the three -major functions as appropriate: - - preprocess_ifs_file Process Interface Specification File. - preprocess_mod_file Process Model Definition File. - preprocess_lst_file Process Pathname List Files. - output_paths_from_lst_file Write paths from a list file to stdout - to facilite building the code models - -depending on the argument. -*/ - -int main( - int argc, /* Number of command line arguments */ - char *argv[]) /* Command line argument text */ -{ - init_error (argv[0]); - - PRINT_CMPP_INFO(argc, argv) - - /* Process command line arguments and vector to appropriate function */ - if(argc < 2) { - print_error(TOO_FEW_ARGS); - print_error(USAGE_MSG); - exit(1); - } - - if(strcmp(argv[1],"-ifs") == 0) { - if(argc == 2) { - preprocess_ifs_file(); - } - else { - print_error(TOO_MANY_ARGS); - print_error(USAGE_MSG); - exit(1); - } - } - else if(strcmp(argv[1],"-lst") == 0) { - if(argc == 2) { - preprocess_lst_files(); - } - else { - print_error(TOO_MANY_ARGS); - print_error(USAGE_MSG); - exit(1); - } - } - else if(strcmp(argv[1],"-mod") == 0) { - if(argc == 2) { - preprocess_mod_file("cfunc.mod"); - } - else if(argc == 3) { - preprocess_mod_file(argv[2]); - } - else { - print_error(TOO_MANY_ARGS); - print_error(USAGE_MSG); - exit(1); - } - } - else if (strcmp(argv[1],"-p") == 0) { /* Output paths from a list file */ - if (argc == 3) { - const int n_item = output_paths_from_lst_file(argv[2]); - if (n_item < 0) { - print_error("Unable to print paths to stdout"); - exit(-1); - } - exit(n_item); - } - else { /* Wrong number of arguments */ - if (argc < 3) { - print_error(TOO_FEW_ARGS); - } - else { - print_error(TOO_MANY_ARGS); - } - print_error(USAGE_MSG); - exit(1); - } - } - else { - print_error(UNRECOGNIZED_ARGS); - print_error(USAGE_MSG); - exit(1); - } - - exit(0); -} /* end of function main */ - - - -#ifdef DEBUG_CMPP -/* Print some debugging information for cmpp - * - * With the use of environment variables to locate files, it is helpful - * to know some information about the program when debugging. If the - * build of a code model fails due to cmpp, the macro can be enabled to - * find the information needed to separately debug cmpp */ -static void print_cmpp_info(int argc, char **argv) -{ - /* Print the program and its arguments */ - { - int i; - for (i = 0; i < argc; ++i) { - (void) fprintf(stdout, "%s ", argv[i]); - } - (void) fprintf(stdout, "\n"); - } - -#ifdef _WIN32 - /* Print the current directory */ - { - const DWORD n_char = GetCurrentDirectoryA(0, (char *) NULL); - if (n_char > 0) { - char *p_buf = (char *) malloc(n_char); - if (p_buf != (char *) NULL) { - if (GetCurrentDirectoryA(n_char, p_buf) != 0) { - (void) fprintf(stdout, "Current Directory: \"%s\".\n", - p_buf); - } - free(p_buf); - } - } - } -#endif - - /* Print the CMPP_IDIR environment variable if defined */ - { - const char * const ev = getenv("CMPP_IDIR"); - if (ev) { - (void) fprintf(stdout, "CMPP_IDIR = \"%s\"\n", ev); - } - else { - (void) fprintf(stdout, "CMPP_IDIR is not defined\n"); - } - } - - /* Print the CMPP_ODIR environment variable if defined */ - { - const char * const ev = getenv("CMPP_ODIR"); - if (ev) { - (void) fprintf(stdout, "CMPP_ODIR = \"%s\"\n", ev); - } - else { - (void) fprintf(stdout, "CMPP_ODIR is not defined\n"); - } - } -} /* end of function print_cmpp_info */ -#endif /* #ifdef DEBUG_CMPP */ - - diff --git a/src/xspice/cmpp/mod_lex.l b/src/xspice/cmpp/mod_lex.l deleted file mode 100644 index 444a7d2ba..000000000 --- a/src/xspice/cmpp/mod_lex.l +++ /dev/null @@ -1,137 +0,0 @@ -%option prefix="mod_yy" -%option yylineno -%option noyywrap -%option nounput -%{ - -/*============================================================================ -FILE mod_lex.l - -MEMBER OF process cmpp - -Copyright 1991 -Georgia Tech Research Corporation -Atlanta, Georgia 30332 -All Rights Reserved - -PROJECT A-8503 - -AUTHORS - - 9/12/91 Steve Tynor - -MODIFICATIONS - - - -SUMMARY - - This file defines tokens applicable to parsing the cfunc.mod - file, and actions to be taken on encountering those tokens. - -INTERFACES - - None. - -REFERENCED FILES - - mod_yacc.y - -NON-STANDARD FEATURES - - None. - -============================================================================*/ - -#include "mod_yacc_y.h" -#include "mod_yacc.h" - -%} - -I [A-Za-z_] -Z [0-9A-Za-z_] - -%% - -"/*" {int ch, last_ch; - ECHO; /* a comment - repeat it */ - ch = '\0'; - do { - last_ch = ch; -#ifdef __cplusplus - ch = yyinput(); -#else - ch = input(); -#endif - if(ch == EOF) { - mod_yyerror ("Unterminated comment"); - break; - } - - fputc(ch,mod_yyout); - } while (!((last_ch == '*') && (ch == '/'))); - } - -"//" {int ch; - ECHO; /* a comment - repeat it */ - do { -#ifdef __cplusplus - ch = yyinput(); -#else - ch = input(); -#endif - if(ch == EOF) { - mod_yyerror ("Unterminated comment"); - break; - } - - fputc(ch, mod_yyout); - } while (ch != '\n'); - } - -ARGS {return TOK_ARGS;} -INIT {return TOK_INIT;} -CALLBACK {return TOK_CALLBACK;} -ANALYSIS {return TOK_ANALYSIS;} -NEW_TIMEPOINT {return TOK_NEW_TIMEPOINT;} -CALL_TYPE {return TOK_CALL_TYPE;} -TIME {return TOK_TIME;} -RAD_FREQ {return TOK_RAD_FREQ;} -TEMPERATURE {return TOK_TEMPERATURE;} -T {return TOK_T;} -LOAD {return TOK_LOAD;} -TOTAL_LOAD {return TOK_TOTAL_LOAD;} -MESSAGE {return TOK_MESSAGE;} -PARAM {return TOK_PARAM;} -PARAM_SIZE {return TOK_PARAM_SIZE;} -PARAM_NULL {return TOK_PARAM_NULL;} -PORT_SIZE {return TOK_PORT_SIZE;} -PORT_NULL {return TOK_PORT_NULL;} -PARTIAL {return TOK_PARTIAL;} -AC_GAIN {return TOK_AC_GAIN;} -OUTPUT_DELAY {return TOK_OUTPUT_DELAY;} -STATIC_VAR {return TOK_STATIC_VAR;} -STATIC_VAR_SIZE {return TOK_STATIC_VAR_SIZE;} -STATIC_VAR_INST {return TOK_STATIC_VAR_INST;} -INPUT {return TOK_INPUT;} -INPUT_STATE {return TOK_INPUT_STATE;} -INPUT_TYPE {return TOK_INPUT_TYPE;} -INPUT_STRENGTH {return TOK_INPUT_STRENGTH;} -OUTPUT {return TOK_OUTPUT;} -OUTPUT_STATE {return TOK_OUTPUT_STATE;} -OUTPUT_STRENGTH {return TOK_OUTPUT_STRENGTH;} -OUTPUT_TYPE {return TOK_OUTPUT_TYPE;} -OUTPUT_CHANGED {return TOK_OUTPUT_CHANGED;} - -"(" {return TOK_LPAREN;} -")" {return TOK_RPAREN;} -"[" {return TOK_LBRACKET;} -"]" {return TOK_RBRACKET;} -"," {return TOK_COMMA;} - -{I}+{Z}* {return TOK_IDENTIFIER;} -[ \t] ECHO; /* just eat non-newline whitespace */ -\n ECHO; /* echo newlines */ -. {return TOK_MISC_C;} - -%% diff --git a/src/xspice/cmpp/mod_yacc.y b/src/xspice/cmpp/mod_yacc.y deleted file mode 100644 index 4d3e00aa3..000000000 --- a/src/xspice/cmpp/mod_yacc.y +++ /dev/null @@ -1,614 +0,0 @@ -%{ - -/*============================================================================ -FILE mod_yacc.y - -MEMBER OF process cmpp - -Copyright 1991 -Georgia Tech Research Corporation -Atlanta, Georgia 30332 -All Rights Reserved - -PROJECT A-8503 - -AUTHORS - - 9/12/91 Steve Tynor - -MODIFICATIONS - - - 20050420 Steven Borley Renamed strcmpi() to local_strcmpi() to avoid - clash with strcmpi() in a windows header file. - -SUMMARY - - This file contains a BNF specification of the translation of - cfunc.mod files to cfunc.c files, together with various support - functions. - -INTERFACES - - mod_yyparse() - Function 'yyparse()' is generated automatically - by UNIX 'yacc' utility and then converted to - 'mod_yyparse()' by UNIX 'sed' utility under - direction of Makefile. - -REFERENCED FILES - - mod_lex.l - -NON-STANDARD FEATURES - - Names of functions generated by 'yacc' are translated by 'sed' - under direction of the Makefile to prevent collisions with - functions generated from ifs_yacc.y. - -============================================================================*/ - - -#include -#include -#include -#include -#include "mod_yacc_y.h" - -extern int mod_yylex(void); - -#define yymaxdepth mod_yymaxdepth -#define yyparse mod_yyparse -#define yylex mod_yylex -#define yyerror mod_yyerror -#define yylval mod_yylval -#define yychar mod_yychar -#define yydebug mod_yydebug -#define yypact mod_yypact -#define yyr1 mod_yyr1 -#define yyr2 mod_yyr2 -#define yydef mod_yydef -#define yychk mod_yychk -#define yypgo mod_yypgo -#define yyact mod_yyact -#define yyexca mod_yyexca -#define yyerrflag mod_yyerrflag -#define yynerrs mod_yynerrs -#define yyps mod_yyps -#define yypv mod_yypv -#define yys mod_yys -#define yy_yys mod_yyyys -#define yystate mod_yystate -#define yytmp mod_yytmp -#define yyv mod_yyv -#define yy_yyv mod_yyyyv -#define yyval mod_yyval -#define yylloc mod_yylloc -#define yyreds mod_yyreds -#define yytoks mod_yytoks -#define yylhs mod_yyyylhs -#define yylen mod_yyyylen -#define yydefred mod_yyyydefred -#define yydgoto mod_yyyydgoto -#define yysindex mod_yyyysindex -#define yyrindex mod_yyyyrindex -#define yygindex mod_yyyygindex -#define yytable mod_yyyytable -#define yycheck mod_yyyycheck -#define yyname mod_yyyyname -#define yyrule mod_yyyyrule - -Ifs_Table_t *mod_ifs_table; - -extern char *mod_yytext; -extern FILE* mod_yyout; - -#include -#include - -int mod_num_errors; - -#define BUFFER_SIZE 3000 -static char buffer [BUFFER_SIZE]; -static int buf_len; - -typedef enum {CONN, PARAM, STATIC_VAR} Id_Kind_t; - -/*--------------------------------------------------------------------------*/ -static char *subscript (Sub_Id_t sub_id) -{ - if (sub_id.has_subscript) { - return sub_id.subscript; - } else { - return "0"; - } -} - -/*--------------------------------------------------------------------------*/ -static int -local_strcmpi(char *s, char *t) - /* string compare - case insensitive */ -{ - for (; *s && t && tolower_c(*s) == tolower_c(*t); s++, t++) - ; - if (*s && !*t) { - return 1; - } - if (!*s && *t) { - return -1; - } - if (! (*s || *t)) { - return 0; - } - return tolower((unsigned char) *s) - tolower((unsigned char) *t); -} - -/*---------------------------------------------------------------------------*/ -static void put_type (FILE *fp, Data_Type_t type) -{ - char ch = ' '; - - switch (type) { - case CMPP_INTEGER: - ch = 'i'; - break; - case CMPP_REAL: - ch = 'r'; - break; - case CMPP_COMPLEX: - ch = 'c'; - break; - case CMPP_BOOLEAN: - ch = 'b'; - break; - case CMPP_STRING: - ch = 's'; - break; - case CMPP_POINTER: - ch = 'p'; - break; - } - fprintf (fp, ".%cvalue", ch); -} - -/*---------------------------------------------------------------------------*/ -static void put_conn_type (FILE *fp, Port_Type_t type) -{ - char ch; - - switch (type) { - case USER_DEFINED: - ch = 'p'; - break; - case DIGITAL: - ch = 'p'; - break; - default: - ch = 'r'; - break; - } - fprintf (fp, ".%cvalue", ch); -} - -/*---------------------------------------------------------------------------*/ -static void check_dir (int conn_number, Dir_t dir, char *context) -{ - Dir_t conn_dir; - - if (conn_number >= 0) { - /* - * If negative, this is an invalid port ID and we've already issued - * an error. - */ - conn_dir = mod_ifs_table->conn[conn_number].direction; - if ((conn_dir != dir) && (conn_dir != CMPP_INOUT)) { - char error_str[200]; - - sprintf (error_str, - "Direction of port `%s' in %s() is not %s or INOUT", - mod_ifs_table->conn[conn_number].name, context, - (dir == CMPP_IN) ? "IN" : "OUT"); - yyerror (error_str); - mod_num_errors++; - } - } -} - -/*---------------------------------------------------------------------------*/ -static void check_subscript (bool formal, bool actual, - bool missing_actual_ok, - char *context, char *id) -{ - char error_str[200]; - - if ((formal && !actual) && !missing_actual_ok) { - sprintf (error_str, - "%s `%s' is an array - subscript required", - context, id); - yyerror (error_str); - mod_num_errors++; - return; - } else if (!formal && actual) { - sprintf (error_str, - "%s `%s' is not an array - subscript prohibited", - context, id); - yyerror (error_str); - mod_num_errors++; - return; - } -} - -/*---------------------------------------------------------------------------*/ -static int check_id (Sub_Id_t sub_id, Id_Kind_t kind, bool do_subscript) -{ - int i; - char error_str[200]; - - switch (kind) { - case CONN: - for (i = 0; i < mod_ifs_table->num_conn; i++) { - if (0 == local_strcmpi (sub_id.id, mod_ifs_table->conn[i].name)) { - if (do_subscript) { - check_subscript (mod_ifs_table->conn[i].is_array, - sub_id.has_subscript, false, "Port", - sub_id.id); - } - return i; - } - } - break; - case PARAM: - for (i = 0; i < mod_ifs_table->num_param; i++) { - if (0 == local_strcmpi (sub_id.id, mod_ifs_table->param[i].name)) { - if (do_subscript) { - check_subscript (mod_ifs_table->param[i].is_array, - sub_id.has_subscript, false, "Parameter", - sub_id.id); - } - return i; - } - } - break; - case STATIC_VAR: - for (i = 0; i < mod_ifs_table->num_inst_var; i++) { - if (0 == local_strcmpi (sub_id.id, mod_ifs_table->inst_var[i].name)) { - if (do_subscript) { - check_subscript (mod_ifs_table->inst_var[i].is_array, - sub_id.has_subscript, true, - "Static Variable", - sub_id.id); - } - return i; - } - } - break; - } - - sprintf (error_str, "No %s named '%s'", - ((kind==CONN) - ? "port" - : ((kind==PARAM) - ? "parameter" - :"static variable")), - sub_id.id); - yyerror (error_str); - mod_num_errors++; - return -1; -} - -/*---------------------------------------------------------------------------*/ -static int valid_id (Sub_Id_t sub_id, Id_Kind_t kind) -{ - return check_id (sub_id, kind, false); -} - -/*---------------------------------------------------------------------------*/ -static int valid_subid (Sub_Id_t sub_id, Id_Kind_t kind) -{ - return check_id (sub_id, kind, true); -} - -/*---------------------------------------------------------------------------*/ -static void init_buffer (void) -{ - buf_len = 0; - buffer[0] = '\0'; -} - -/*---------------------------------------------------------------------------*/ -static void append (char *str) -{ - int len = (int) strlen (str); - if (len + buf_len > BUFFER_SIZE) { - yyerror ("Buffer overflow - try reducing the complexity of CM-macro array subscripts"); - exit (1); - } - (void)strcat (buffer,str); -} - -%} - -%union { - char *str; - Sub_Id_t sub_id; -} - -%type buffered_c_code -%type subscriptable_id id - -%token TOK_ARGS -%token TOK_INIT -%token TOK_CALLBACK -%token TOK_ANALYSIS -%token TOK_NEW_TIMEPOINT -%token TOK_TIME -%token TOK_RAD_FREQ -%token TOK_TEMPERATURE -%token TOK_T -%token TOK_PARAM -%token TOK_PARAM_SIZE -%token TOK_PARAM_NULL -%token TOK_PORT_SIZE -%token TOK_PORT_NULL -%token TOK_PARTIAL -%token TOK_AC_GAIN -%token TOK_CHANGED -%token TOK_OUTPUT_DELAY -%token TOK_STATIC_VAR -%token TOK_STATIC_VAR_SIZE -%token TOK_STATIC_VAR_INST -%token TOK_INPUT -%token TOK_INPUT_STRENGTH -%token TOK_INPUT_STATE -%token TOK_INPUT_TYPE -%token TOK_OUTPUT -%token TOK_OUTPUT_CHANGED -%token TOK_OUTPUT_STRENGTH -%token TOK_OUTPUT_STATE -%token TOK_OUTPUT_TYPE -%token TOK_COMMA -%token TOK_LPAREN -%token TOK_RPAREN -%token TOK_LBRACKET -%token TOK_RBRACKET -%token TOK_MISC_C -%token TOK_IDENTIFIER -%token TOK_LOAD -%token TOK_TOTAL_LOAD -%token TOK_MESSAGE -%token TOK_CALL_TYPE - -%start mod_file - -%% - -mod_file : /* empty */ - | mod_file c_code - ; - -c_code : /* empty */ - | c_code c_char - | c_code macro - /*| TOK_RPAREN {yyerror ("Unmatched )"); YYERROR;} - | TOK_RBRACKET {yyerror ("Unmatched ]"); YYERROR;}*/ - ; - -buffered_c_code : {init_buffer();} buffered_c_code2 - {$$ = strdup (buffer);} - ; - -buffered_c_code2 : /* empty */ - | buffered_c_code2 buffered_c_char - ; - -buffered_c_char : TOK_IDENTIFIER {append (mod_yytext);} - | TOK_MISC_C {append (mod_yytext);} - | TOK_COMMA {append (mod_yytext);} - | TOK_LBRACKET - {append("[");} - buffered_c_code2 TOK_RBRACKET - {append("]");} - | TOK_LPAREN - {append("(");} - buffered_c_code2 TOK_RPAREN - {append(")");} - ; - -c_char : TOK_IDENTIFIER {fputs (mod_yytext, mod_yyout);} - | TOK_MISC_C {fputs (mod_yytext, mod_yyout);} - | TOK_COMMA {fputs (mod_yytext, mod_yyout);} - | TOK_LBRACKET - {putc ('[', mod_yyout);} - c_code TOK_RBRACKET - {putc (']', mod_yyout);} - | TOK_LPAREN - {putc ('(', mod_yyout);} - c_code TOK_RPAREN - {putc (')', mod_yyout);} - ; - -macro : TOK_INIT - {fprintf (mod_yyout, "mif_private->circuit.init");} - | TOK_CALLBACK - {fprintf (mod_yyout, "*(mif_private->callback)");} - | TOK_ARGS - {fprintf (mod_yyout, "Mif_Private_t *mif_private");} - | TOK_ANALYSIS - {fprintf (mod_yyout, "mif_private->circuit.anal_type");} - | TOK_NEW_TIMEPOINT - {fprintf (mod_yyout, "mif_private->circuit.anal_init");} - | TOK_CALL_TYPE - {fprintf (mod_yyout, "mif_private->circuit.call_type");} - | TOK_TIME - {fprintf (mod_yyout, "mif_private->circuit.time");} - | TOK_RAD_FREQ - {fprintf (mod_yyout, "mif_private->circuit.frequency");} - | TOK_TEMPERATURE - {fprintf (mod_yyout, "mif_private->circuit.temperature");} - | TOK_T TOK_LPAREN buffered_c_code TOK_RPAREN - {fprintf (mod_yyout, "mif_private->circuit.t[%s]", $3);} - | TOK_PARAM TOK_LPAREN subscriptable_id TOK_RPAREN - {int i = valid_subid ($3, PARAM); - fprintf (mod_yyout, "mif_private->param[%d]->element[%s]", - i, subscript ($3)); - put_type (mod_yyout, mod_ifs_table->param[i].type); - } - | TOK_PARAM_SIZE TOK_LPAREN id TOK_RPAREN - {int i = valid_id ($3, PARAM); - fprintf (mod_yyout, "mif_private->param[%d]->size", i);} - | TOK_PARAM_NULL TOK_LPAREN id TOK_RPAREN - {int i = valid_id ($3, PARAM); - fprintf (mod_yyout, "mif_private->param[%d]->is_null", i);} - | TOK_PORT_SIZE TOK_LPAREN id TOK_RPAREN - {int i = valid_id ($3, CONN); - fprintf (mod_yyout, "mif_private->conn[%d]->size", i);} - | TOK_PORT_NULL TOK_LPAREN id TOK_RPAREN - {int i = valid_id ($3, CONN); - fprintf (mod_yyout, "mif_private->conn[%d]->is_null", i);} - | TOK_PARTIAL TOK_LPAREN subscriptable_id TOK_COMMA - subscriptable_id TOK_RPAREN - {int i = valid_subid ($3, CONN); - int j = valid_subid ($5, CONN); - check_dir (i, CMPP_OUT, "PARTIAL"); - check_dir (j, CMPP_IN, "PARTIAL"); - fprintf (mod_yyout, "mif_private->conn[%d]->port[%s]->partial[%d].port[%s]", - i, subscript($3), j, subscript($5));} - | TOK_AC_GAIN TOK_LPAREN subscriptable_id TOK_COMMA - subscriptable_id TOK_RPAREN - {int i = valid_subid ($3, CONN); - int j = valid_subid ($5, CONN); - check_dir (i, CMPP_OUT, "AC_GAIN"); - check_dir (j, CMPP_IN, "AC_GAIN"); - fprintf (mod_yyout, - "mif_private->conn[%d]->port[%s]->ac_gain[%d].port[%s]", - i, subscript($3), j, subscript($5));} - | TOK_STATIC_VAR TOK_LPAREN subscriptable_id TOK_RPAREN - {int i = valid_subid ($3, STATIC_VAR); - fprintf (mod_yyout, - "mif_private->inst_var[%d]->element[%s]", - i, subscript($3)); - if (mod_ifs_table->inst_var[i].is_array - && !($3.has_subscript)) { - /* null - eg. for malloc lvalue */ - } else { - put_type (mod_yyout, - mod_ifs_table->inst_var[i].type); - } } - | TOK_STATIC_VAR_SIZE TOK_LPAREN id TOK_RPAREN - {int i = valid_subid ($3, STATIC_VAR); - fprintf (mod_yyout, "mif_private->inst_var[%d]->size", - i);} - | TOK_STATIC_VAR_INST TOK_LPAREN id TOK_RPAREN - {int i = valid_subid ($3, STATIC_VAR); - fprintf (mod_yyout, "mif_private->inst_var[%d]", - i);} - | TOK_OUTPUT_DELAY TOK_LPAREN subscriptable_id TOK_RPAREN - {int i = valid_subid ($3, CONN); - check_dir (i, CMPP_OUT, "OUTPUT_DELAY"); - fprintf (mod_yyout, - "mif_private->conn[%d]->port[%s]->delay", i, - subscript($3));} - | TOK_CHANGED TOK_LPAREN subscriptable_id TOK_RPAREN - {int i = valid_subid ($3, CONN); - check_dir (i, CMPP_OUT, "CHANGED"); - fprintf (mod_yyout, - "mif_private->conn[%d]->port[%s]->changed", i, - subscript($3));} - | TOK_INPUT TOK_LPAREN subscriptable_id TOK_RPAREN - {int i = valid_subid ($3, CONN); - check_dir (i, CMPP_IN, "INPUT"); - fprintf (mod_yyout, - "mif_private->conn[%d]->port[%s]->input", - i, subscript($3)); - put_conn_type (mod_yyout, - mod_ifs_table->conn[i].allowed_port_type[0]);} - | TOK_INPUT_TYPE TOK_LPAREN subscriptable_id TOK_RPAREN - {int i = valid_subid ($3, CONN); - check_dir (i, CMPP_IN, "INPUT_TYPE"); - fprintf (mod_yyout, - "mif_private->conn[%d]->port[%s]->type_str", - i, subscript($3)); } - | TOK_OUTPUT_TYPE TOK_LPAREN subscriptable_id TOK_RPAREN - {int i = valid_subid ($3, CONN); - check_dir (i, CMPP_OUT, "OUTPUT_TYPE"); - fprintf (mod_yyout, - "mif_private->conn[%d]->port[%s]->type_str", - i, subscript($3)); } - | TOK_INPUT_STRENGTH TOK_LPAREN subscriptable_id TOK_RPAREN - {int i = valid_subid ($3, CONN); - check_dir (i, CMPP_IN, "INPUT_STRENGTH"); - fprintf (mod_yyout, - "((Digital_t*)(mif_private->conn[%d]->port[%s]->input", - i, subscript($3)); - put_conn_type (mod_yyout, - mod_ifs_table->conn[i].allowed_port_type[0]); - fprintf (mod_yyout, "))->strength");} - | TOK_INPUT_STATE TOK_LPAREN subscriptable_id TOK_RPAREN - {int i = valid_subid ($3, CONN); - check_dir (i, CMPP_IN, "INPUT_STATE"); - fprintf (mod_yyout, - "((Digital_t*)(mif_private->conn[%d]->port[%s]->input", - i, subscript($3)); - put_conn_type (mod_yyout, - mod_ifs_table->conn[i].allowed_port_type[0]); - fprintf (mod_yyout, "))->state");} - | TOK_OUTPUT TOK_LPAREN subscriptable_id TOK_RPAREN - {int i = valid_subid ($3, CONN); - check_dir (i, CMPP_OUT, "OUTPUT"); - fprintf (mod_yyout, - "mif_private->conn[%d]->port[%s]->output", - i, subscript($3)); - put_conn_type (mod_yyout, - mod_ifs_table->conn[i].allowed_port_type[0]);} - | TOK_OUTPUT_STRENGTH TOK_LPAREN subscriptable_id TOK_RPAREN - {int i = valid_subid ($3, CONN); - check_dir (i, CMPP_OUT, "OUTPUT_STRENGTH"); - fprintf (mod_yyout, - "((Digital_t*)(mif_private->conn[%d]->port[%s]->output", - i, subscript($3)); - put_conn_type (mod_yyout, - mod_ifs_table->conn[i].allowed_port_type[0]); - fprintf (mod_yyout, "))->strength");} - | TOK_OUTPUT_STATE TOK_LPAREN subscriptable_id TOK_RPAREN - {int i = valid_subid ($3, CONN); - check_dir (i, CMPP_OUT, "OUTPUT_STATE"); - fprintf (mod_yyout, - "((Digital_t*)(mif_private->conn[%d]->port[%s]->output", - i, subscript($3)); - put_conn_type (mod_yyout, - mod_ifs_table->conn[i].allowed_port_type[0]); - fprintf (mod_yyout, "))->state");} - | TOK_OUTPUT_CHANGED TOK_LPAREN subscriptable_id TOK_RPAREN - {int i = valid_subid ($3, CONN); - fprintf (mod_yyout, - "mif_private->conn[%d]->port[%s]->changed", i, - subscript($3));} - | TOK_LOAD TOK_LPAREN subscriptable_id TOK_RPAREN - {int i = valid_subid ($3, CONN); - fprintf (mod_yyout, - "mif_private->conn[%d]->port[%s]->load", i, - subscript($3));} - | TOK_TOTAL_LOAD TOK_LPAREN subscriptable_id TOK_RPAREN - {int i = valid_subid ($3, CONN); - fprintf (mod_yyout, - "mif_private->conn[%d]->port[%s]->total_load", i, - subscript($3));} - | TOK_MESSAGE TOK_LPAREN subscriptable_id TOK_RPAREN - {int i = valid_subid ($3, CONN); - fprintf (mod_yyout, - "mif_private->conn[%d]->port[%s]->msg", i, - subscript($3));} - ; - -subscriptable_id : id - | id TOK_LBRACKET buffered_c_code TOK_RBRACKET - {$$ = $1; - $$.has_subscript = true; - $$.subscript = $3;} - ; - -id : TOK_IDENTIFIER - {$$.has_subscript = false; - $$.id = strdup (mod_yytext);} - ; - -%% diff --git a/src/xspice/cmpp/mod_yacc_y.h b/src/xspice/cmpp/mod_yacc_y.h deleted file mode 100644 index 7219377af..000000000 --- a/src/xspice/cmpp/mod_yacc_y.h +++ /dev/null @@ -1,49 +0,0 @@ -/*============================================================================ -FILE mod_yacc.h - -MEMBER OF process cmpp - -Public Domain - -Georgia Tech Research Corporation -Atlanta, Georgia 30332 -PROJECT A-8503 - -AUTHORS - - 9/12/91 Steve Tynor - -MODIFICATIONS - - - -SUMMARY - - Typedefs needed by the YYSTYPE union (%union operator) in the yacc - file. These are only used in the yacc file, but must be defined here since - the generated token.h file includes a definition of the union YYSTYPE. - -INTERFACES - - None. - -REFERENCED FILES - - None. - -NON-STANDARD FEATURES - - None. - -============================================================================*/ -#include - -#include "cmpp.h" - -typedef struct { - char *id; - bool has_subscript; - char *subscript; -} Sub_Id_t; - -extern void mod_yyerror(char*); diff --git a/src/xspice/cmpp/pp_ifs.c b/src/xspice/cmpp/pp_ifs.c deleted file mode 100644 index 4bc4fae9a..000000000 --- a/src/xspice/cmpp/pp_ifs.c +++ /dev/null @@ -1,132 +0,0 @@ -/*============================================================================ -FILE pp_ifs.c - -MEMBER OF process cmpp - -Public Domain - -Georgia Tech Research Corporation -Atlanta, Georgia 30332 -PROJECT A-8503 - -AUTHORS - - 9/12/91 Bill Kuhn - -MODIFICATIONS - - - -SUMMARY - - This file contains the main function for processing an Interface Spec - File (ifspec.ifs). - -INTERFACES - - preprocess_ifs_file() - -REFERENCED FILES - - None. - -NON-STANDARD FEATURES - - None. - -============================================================================*/ - -#include -#include "cmpp.h" - - - -/* -preprocess_ifs_file - -Function preprocess_ifs_file is the top-level driver function for -preprocessing an Interface Specification file (ifspec.ifs). This -function calls read_ifs_file() requesting it to read and parse -the Interface Specification file and place the information -contained in it into an internal data structure. Then -write_ifs_c_file() is called to write the information out in a C -file that will be compiled and linked with the simulator. -*/ - - -void preprocess_ifs_file(void) -{ - - Ifs_Table_t ifs_table; /* Repository for info read from ifspec.ifs file */ - - int status; /* Return status */ - - /* Read the entire ifspec.ifs file and load the data into ifs_table */ - - status = read_ifs_file(IFSPEC_FILENAME,GET_IFS_TABLE,&ifs_table); - - if(status != 0) { - exit(1); - } - - - /* Write the ifspec.c file required by the spice simulator */ - - status = write_ifs_c_file("ifspec.c",&ifs_table); - - if(status != 0) { - exit(1); - } - rem_ifs_table(&ifs_table); -} - -void rem_ifs_table(Ifs_Table_t *ifs_table) -{ - /* Remove the ifs_table */ - free(ifs_table->name.c_fcn_name); - free(ifs_table->name.description); - free(ifs_table->name.model_name); - - { - Conn_Info_t * const p_conn = ifs_table->conn; - const int num_conn = ifs_table->num_conn; - int i; - for (i = 0; i < num_conn; ++i) { - Conn_Info_t *p_conn_cur = p_conn + i; - free(p_conn_cur->name); - free(p_conn_cur->description); - free(p_conn_cur->default_type); - } - } - - { - Param_Info_t * const p_param = ifs_table->param; - const int num_param = ifs_table->num_param; - int i; - for (i = 0; i < num_param; ++i) { - Param_Info_t *p_param_cur = p_param + i; - free(p_param_cur->name); - free(p_param_cur->description); - } - } - - { - Inst_Var_Info_t * const p_inst_var = ifs_table->inst_var; - const int num_inst_var = ifs_table->num_inst_var; - int i; - for(i = 0; i < num_inst_var; ++i) { - Inst_Var_Info_t *p_inst_var_cur = p_inst_var + i; - free(p_inst_var_cur->name); - free(p_inst_var_cur->description); - } - } - - free(ifs_table->conn); - free(ifs_table->param); - free(ifs_table->inst_var); -} /* end of function rem_ifs_table */ - - - - - diff --git a/src/xspice/cmpp/pp_lst.c b/src/xspice/cmpp/pp_lst.c deleted file mode 100644 index 31946a825..000000000 --- a/src/xspice/cmpp/pp_lst.c +++ /dev/null @@ -1,1683 +0,0 @@ -/*============================================================================ -FILE pp_lst.c - -MEMBER OF process cmpp - -Public Domain - -Georgia Tech Research Corporation -Atlanta, Georgia 30332 -PROJECT A-8503 - -AUTHORS - - 9/12/91 Bill Kuhn - -MODIFICATIONS - - - -SUMMARY - - This file contains functions used in processing the files: - - modpath.lst - udnpath.lst - - The files 'modpath.lst' and 'udnpath.lst' are read to get - the pathnames to directories containing the models and node types - desired in the simulator to be built. Files in each of these - directories are then examined to get the names of functions and/or - data structures that the simulator must know about. The names - are then checked for uniqueness, and finally, a collection of - files needed in the 'make' for the simulator are written. - -INTERFACES - - preprocess_lst_files() - -REFERENCED FILES - - None. - -NON-STANDARD FEATURES - - None. - -============================================================================*/ - -#include -#include -#include -#include -#include -#include - -#include "cmpp.h" -#include "file_buffer.h" - -/* *********************************************************************** */ - -/* - * Information for processing the pathname files - */ - -typedef struct { - char *path_name; /* Pathname read from model path file */ - char *spice_name; /* Name of model from ifspec.ifs */ - char *cfunc_name; /* Name of C fcn from ifspec.ifs */ - unsigned int version; /* version of the code model */ -} Model_Info_t; - - -typedef struct { - char *path_name; /* Pathname read from udn path file */ - char *node_name; /* Name of node type */ - unsigned int version; /* version of the code model */ -} Node_Info_t; - - -/* Structure for uniqueness testing */ -struct Key_src { - const char *key; /* value to compare */ - const char *src; /* source of value */ -}; - - - - - -/************************************************************************ */ - -static int cmpr_ks(const struct Key_src *ks1, const struct Key_src *ks2); -static void free_model_info(int num_models, Model_Info_t *p_model_info); -static void free_node_info(int num_nodes, Node_Info_t *p_node_info); -static int read_modpath(int *num_models, Model_Info_t **model_info); -static int read_udnpath(int *num_nodes, Node_Info_t **node_info); -static int read_model_names(int num_models, Model_Info_t *model_info); -static int read_node_names(int num_nodes, Node_Info_t *node_info); -static int check_uniqueness(int num_models, Model_Info_t *model_info, - int num_nodes, Node_Info_t *node_info); -static void report_error_spice_name(const struct Key_src *p_ks1, - const struct Key_src *p_ks2); -static void report_error_function_name (const struct Key_src *p_ks1, - const struct Key_src *p_ks2); -static void report_error_udn_name(const struct Key_src *p_ks1, - const struct Key_src *p_ks2); -static bool test_for_duplicates(unsigned int n, struct Key_src *p_ks, - void (*p_error_reporter)(const struct Key_src *p_ks1, - const struct Key_src *p_ks2)); -static inline void trim_slash(size_t *p_n, char *p); -static int write_CMextrn(int num_models, Model_Info_t *model_info); -static int write_CMinfo(int num_models, Model_Info_t *model_info); -static int write_CMinfo2(int num_models, Model_Info_t *model_info); -static int write_UDNextrn(int num_nodes, Node_Info_t *node_info); -static int write_UDNinfo(int num_nodes, Node_Info_t *node_info); -static int write_UDNinfo2(int num_nodes, Node_Info_t *node_info); -static int write_objects_inc(int num_models, Model_Info_t *model_info, - int num_nodes, Node_Info_t *node_info); -static int read_udn_type_name(const char *path, char **node_name); - - -/* *********************************************************************** */ - - -/* -preprocess_lst_files - -Function preprocess_lst_files is the top-level driver function for -preprocessing a simulator model path list file (modpath.lst). -This function calls read_ifs_file() requesting it to read and -parse the Interface Specification file (ifspec.ifs) to extract -the model name and associated C function name and place this -information into an internal data structure. It then calls -check_uniqueness() to verify that the model names and function -names are unique with respect to each other and to the models and -functions internal to SPICE 3C1. Following this check, it calls -write_CMextrn(), write_CMinfo(), and write_make_include() to -write out the C include files CMextrn.h and CMinfo.h required by -SPICE function SPIinit.c to define the models known to the -simulator, and to write out a make include file used by the make -utility to locate the object modules necessary to link the models -into the simulator. -*/ - -void preprocess_lst_files(void) -{ - int status; /* Return status */ - Model_Info_t *model_info; /* Info about each model */ - Node_Info_t *node_info; /* Info about each user-defined node type */ - int num_models; /* The number of models */ - int num_nodes; /* The number of user-defined nodes */ - - /* Get list of models from model pathname file */ - status = read_modpath(&num_models, &model_info); - if (status != 0) { - exit(1); - } - - /* Get list of node types from udn pathname file */ - status = read_udnpath(&num_nodes, &node_info); - if (status < 0) { - exit(1); - } - - /* Get the spice and C function names from the ifspec.ifs files */ - status = read_model_names(num_models, model_info); - if(status != 0) { - exit(1); - } - - /* Get the user-defined node type names */ - status = read_node_names(num_nodes, node_info); - if(status != 0) { - exit(1); - } - - /* Check to be sure the names are unique */ - status = check_uniqueness(num_models, model_info, num_nodes, node_info); - if(status != 0) { - exit(1); - } - - /* Write out the CMextrn.h file used to compile SPIinit.c */ - status = write_CMextrn(num_models, model_info); - if(status != 0) { - exit(1); - } - - /* Write out the CMinfo.h file used to compile SPIinit.c */ - status = write_CMinfo(num_models, model_info); - if(status != 0) { - exit(1); - } - status = write_CMinfo2(num_models, model_info); - if(status != 0) { - exit(1); - } - - /* Write out the UDNextrn.h file used to compile SPIinit.c */ - status = write_UDNextrn(num_nodes, node_info); - if(status != 0) { - exit(1); - } - - /* Write out the UDNinfo.h file used to compile SPIinit.c */ - status = write_UDNinfo(num_nodes, node_info); - if(status != 0) { - exit(1); - } - status = write_UDNinfo2(num_nodes, node_info); - if(status != 0) { - exit(1); - } - - /* Write the make_include file used to link the models and */ - /* user-defined node functions with the simulator */ - status = write_objects_inc(num_models, model_info, - num_nodes, node_info); - if(status != 0) { - exit(1); - } - - /* Free allocations */ - if (model_info != (Model_Info_t *) NULL) { - free_model_info(num_models, model_info); - } - if (node_info != (Node_Info_t *) NULL) { - free_node_info(num_nodes, node_info); - } -} /* end of function preprocess_lst_files */ - - - -/* This function parses the supplied .lst file and outputs the paths to - * stdout */ -int output_paths_from_lst_file(const char *filename) -{ - int xrc = 0; - FILEBUF *fbp = (FILEBUF *) NULL; /* for reading MODPATH_FILENAME */ - unsigned int n_path = 0; - - /* Open the file */ - if ((fbp = fbopen(filename, 0)) == (FILEBUF *) NULL) { - print_error("ERROR - Unable to open file \"%s\" to obtain " - "paths: %s", - filename, strerror(errno)); - xrc = -1; - goto EXITPOINT; - } - - bool f_have_path = false; /* do not have a path to store */ - FBTYPE fbtype; - FBOBJ fbobj; - for ( ; ; ) { /* Read items until end of file */ - /* Get the next path if not found yet */ - if (!f_have_path) { - const int rc = fbget(fbp, 0, (FBTYPE *) NULL, &fbtype, &fbobj); - if (rc != 0) { - if (rc == -1) { /* Error */ - print_error("ERROR - Unable to read item to buffer"); - xrc = -1; - goto EXITPOINT; - } - else { /* +1 -- EOF */ - break; - } - } /* end of abnormal case */ - - /* Remove trailing slash if appended to path */ - trim_slash(&fbobj.str_value.n_char, fbobj.str_value.sz); - } - - /* Output the file that was found */ - if (fprintf(stdout, "%s\n", fbobj.str_value.sz) < 0) { - print_error("ERROR - Unable to output path name to stdout: %s", - strerror(errno)); - xrc = -1; - goto EXITPOINT; - } - ++n_path; /* 1 more path printed OK */ - - /* Try getting a version. If found, it will be discarded */ - FBTYPE type_wanted = BUF_TYPE_ULONG; - const int rc = fbget(fbp, 1, &type_wanted, &fbtype, &fbobj); - if (rc != 0) { - if (rc == -1) { /* Error */ - print_error("ERROR - Unable to read item to buffer"); - xrc = -1; - goto EXITPOINT; - } - else { /* +1 -- EOF */ - break; - } - } /* end of abnormal case */ - - if (fbtype == BUF_TYPE_ULONG) { /* found version number */ - f_have_path = false; - } - else { /* it was a string, so it is the next path */ - f_have_path = true; - - /* Remove trailing slash if appended to path */ - trim_slash(&fbobj.str_value.n_char, fbobj.str_value.sz); - } - } /* end of loop reading items into buffer */ - -EXITPOINT: - /* Close model pathname file and return data read */ - if (fbclose(fbp) != 0) { - print_error("ERROR - Unable to close file with path names: %s", - strerror(errno)); - xrc = -1; - } - - /* Return the path count if no errors */ - if (xrc == 0) { - xrc = (int) n_path; - } - - return xrc; -} /* end of function output_paths_from_lst_file */ - - - - -/* *********************************************************************** */ - - -/* -read_modpath - -This function opens the modpath.lst file, reads the pathnames from the -file, and puts them into an internal data structure for future -processing. -*/ - -/* Structure for retrieving data items from the file. These will be either - * names, such as directory names or unsigned integers that are version - * numbers */ -#define N_MODEL_INIT 10 - -static int read_modpath( - int *p_num_model_info, /* Number of model pathnames found */ - Model_Info_t **pp_model_info) /* Info about each model */ -{ - int xrc = 0; - FILEBUF *fbp = (FILEBUF *) NULL; /* for reading MODPATH_FILENAME */ - Model_Info_t *p_model_info = (Model_Info_t *) NULL; - unsigned int n_model_info = 0; - unsigned int n_model_info_alloc = 0; - char *filename = (char *) NULL; - - /* Open the model pathname file */ - if ((filename = gen_filename(MODPATH_FILENAME, "r")) == (char *) NULL) { - print_error("ERROR - Unable to build mod path file name"); - xrc = -1; - goto EXITPOINT; - } - /* Open the file using the default buffer size. For debugging, a very - * small value can be used, for example by giving the size as 1, to - * force the function do actions that otherwise would be done rarely - * if at all. */ - if ((fbp = fbopen(filename, 0)) == (FILEBUF *) NULL) { - print_error("ERROR - Unable to open mod path file \"%s\": %s", - filename, strerror(errno)); - xrc = -1; - goto EXITPOINT; - } - - /* Allocate initial model info array */ - if ((p_model_info = (Model_Info_t *) malloc(N_MODEL_INIT * - sizeof(Model_Info_t))) == (Model_Info_t *) NULL) { - print_error("ERROR - Unable to allocate initial model array"); - xrc = -1; - goto EXITPOINT; - } - n_model_info_alloc = N_MODEL_INIT; - - bool f_have_path = false; /* do not have a path to store */ - FBTYPE fbtype; - FBOBJ fbobj; - for ( ; ; ) { /* Read items until end of file */ - /* Get the next path if not found yet */ - if (!f_have_path) { - const int rc = fbget(fbp, 0, (FBTYPE *) NULL, &fbtype, &fbobj); - if (rc != 0) { - if (rc == -1) { /* Error */ - print_error("ERROR - Unable to read item to buffer"); - xrc = -1; - goto EXITPOINT; - } - else { /* +1 -- EOF */ - break; - } - } /* end of abnormal case */ - - /* Remove trailing slash if appended to path */ - trim_slash(&fbobj.str_value.n_char, fbobj.str_value.sz); - } - - /* Enlarge model array if full */ - if (n_model_info_alloc == n_model_info) { - n_model_info_alloc *= 2; - void * const p = realloc(p_model_info, - n_model_info_alloc * sizeof(Model_Info_t)); - if (p == NULL) { - print_error("ERROR - Unable to enlarge model array"); - xrc = -1; - goto EXITPOINT; - } - p_model_info = (Model_Info_t *) p; - } - - /* Put pathname into info structure */ - Model_Info_t * const p_model_info_cur = p_model_info + - n_model_info; - - if ((p_model_info_cur->path_name = (char *) malloc( - fbobj.str_value.n_char + 1)) == (char *) NULL) { - print_error("ERROR - Unable to allocate path name"); - xrc = -1; - goto EXITPOINT; - } - - strcpy(p_model_info_cur->path_name, fbobj.str_value.sz); - p_model_info_cur->spice_name = (char *) NULL; - p_model_info_cur->cfunc_name = (char *) NULL; - - /* Must set before returning due to EOF. */ - p_model_info_cur->version = 1; - ++n_model_info; - - /* Try getting a version */ - FBTYPE type_wanted = BUF_TYPE_ULONG; - const int rc = fbget(fbp, 1, &type_wanted, &fbtype, &fbobj); - if (rc != 0) { - if (rc == -1) { /* Error */ - print_error("ERROR - Unable to read item to buffer"); - xrc = -1; - goto EXITPOINT; - } - else { /* +1 -- EOF */ - break; - } - } /* end of abnormal case */ - - if (fbtype == BUF_TYPE_ULONG) { /* found version number */ - f_have_path = false; - p_model_info_cur->version = (unsigned int) fbobj.ulong_value; - } - else { /* it was a string, so it is the next path */ - f_have_path = true; - - /* Remove trailing slash if appended to path */ - trim_slash(&fbobj.str_value.n_char, fbobj.str_value.sz); - } - } /* end of loop reading items into buffer */ - -EXITPOINT: - /* Close model pathname file and return data read */ - if (fbclose(fbp) != 0) { - print_error("ERROR - Unable to close file with model info: %s", - strerror(errno)); - xrc = -1; - } - - /* Free name of file being used */ - if (filename) { - free((void *) filename); - } - - /* If error, free model info */ - if (xrc != 0) { - free_model_info(n_model_info, p_model_info); - n_model_info = 0; - p_model_info = (Model_Info_t *) NULL; - } - - *p_num_model_info = n_model_info; - *pp_model_info = p_model_info; - - return xrc; -} /* end of function read_modpath */ - - - -/* Remove slash at end of path name if present */ -static inline void trim_slash(size_t *p_n, char *p) -{ - size_t n = *p_n; - if (n > 1) { - char * const p_last = p + n - 1; - if (*p_last == '/') { - *p_last = '\0'; - --*p_n; - } - } -} /* end of function trim_slash */ - - - -/* *********************************************************************** */ - - -/* -read_udnpath - -This function opens the udnpath.lst file, reads the pathnames from the -file, and puts them into an internal data structure for future -processing. -*/ - - -#define N_NODE_INIT 5 - -static int read_udnpath( - int *p_num_node_info, /* Addr to receive # node pathnames */ - Node_Info_t **pp_node_info /* Addr to receive node info */ -) -{ - int xrc = 0; - FILEBUF *fbp = (FILEBUF *) NULL; /* For reading Udn pathname */ - Node_Info_t *p_node_info = (Node_Info_t *) NULL; - /* array of node info */ - unsigned int n_node_info = 0; - unsigned int n_node_info_alloc = 0; - char *filename = (char *) NULL; - - - /* Open the node pathname file */ - if ((filename = gen_filename(UDNPATH_FILENAME, "r")) == (char *) NULL) { - print_error("ERROR - Unable to build udn path file name"); - xrc = -1; - goto EXITPOINT; - } - - /* For backward compatibility, return with WARNING only if file - * not found */ - if ((fbp = fbopen(filename, 0)) == (FILEBUF *) NULL) { - print_error("WARNING - File not found: %s", filename); - xrc = +1; - goto EXITPOINT; - } - - /* Allocate initial node info array */ - if ((p_node_info = (Node_Info_t *) malloc(N_NODE_INIT * - sizeof(Node_Info_t))) == (Node_Info_t *) NULL) { - print_error("ERROR - Unable to allocate initial node array"); - xrc = -1; - goto EXITPOINT; - } - n_node_info_alloc = N_NODE_INIT; - - bool f_have_path = false; /* do not have a path to store */ - FBTYPE fbtype; - FBOBJ fbobj; - - for ( ; ; ) { /* Read items until end of file */ - /* Get the next path if not found yet */ - if (!f_have_path) { - const int rc = fbget(fbp, 0, (FBTYPE *) NULL, &fbtype, &fbobj); - if (rc != 0) { - if (rc == -1) { /* Error */ - print_error("ERROR - Unable to read item to buffer"); - xrc = -1; - goto EXITPOINT; - } - else { /* +1 -- EOF */ - break; - } - } /* end of abnormal case */ - - /* Remove trailing slash if appended to path */ - trim_slash(&fbobj.str_value.n_char, fbobj.str_value.sz); - } - - - /* Enlarge node array if full */ - if (n_node_info_alloc == n_node_info) { - n_node_info_alloc *= 2; - void * const p = realloc(p_node_info, - n_node_info_alloc * sizeof(Node_Info_t)); - if (p == NULL) { - print_error("ERROR - Unable to enlarge node array"); - xrc = -1; - goto EXITPOINT; - } - p_node_info = (Node_Info_t *) p; - } - - /* Put pathname into info structure */ - Node_Info_t * const p_node_info_cur = p_node_info + - n_node_info; - - if ((p_node_info_cur->path_name = (char *) malloc( - fbobj.str_value.n_char + 1)) == (char *) NULL) { - print_error("ERROR - Unable to allocate path name"); - xrc = -1; - goto EXITPOINT; - } - - strcpy(p_node_info_cur->path_name, fbobj.str_value.sz); - p_node_info_cur->node_name = NULL; - - /* Must set before returning due to EOF. */ - p_node_info_cur->version = 1; - ++n_node_info; - - /* Try getting a version */ - FBTYPE type_wanted = BUF_TYPE_ULONG; - const int rc = fbget(fbp, 1, &type_wanted, &fbtype, &fbobj); - if (rc != 0) { - if (rc == -1) { /* Error */ - print_error("ERROR - Unable to read item to buffer"); - xrc = -1; - goto EXITPOINT; - } - else { /* +1 -- EOF */ - break; - } - } /* end of abnormal case */ - - if (fbtype == BUF_TYPE_ULONG) { /* found version number */ - f_have_path = false; - p_node_info_cur->version = (unsigned int) fbobj.ulong_value; - } - else { /* it was a string, so it is the next path */ - f_have_path = true; - - /* Remove trailing slash if appended to path */ - trim_slash(&fbobj.str_value.n_char, fbobj.str_value.sz); - } - - } /* end of loop reading items into buffer */ - -EXITPOINT: - /* Close model pathname file and return data read */ - if (fbclose(fbp) != 0) { - print_error("ERROR - Unable to close file with node info: %s", - strerror(errno)); - xrc = -1; - } - - /* Free name of file being used */ - if (filename) { - free((void *) filename); - } - - /* If error, free node info */ - if (xrc != 0) { - free_node_info(n_node_info, p_node_info); - n_node_info = 0; - p_node_info = (Node_Info_t *) NULL; - } - - *p_num_node_info = n_node_info; - *pp_node_info = p_node_info; - - return xrc; -} /* end of function read_udnpath */ - - - -/* *********************************************************************** */ - - -/* -read_model_names - -This function opens each of the models and gets the names of the model -and the C function into the internal model information structure. -*/ - -static int read_model_names( - int num_models, /* Number of model pathnames */ - Model_Info_t *model_info /* Info about each model */ -) -{ - bool all_found = true; /* True if all ifspec files read */ - int i; /* A temporary counter */ - char path_stack[100]; /* full pathname to ifspec file if from stack */ - char *path = path_stack; /* actual path buffer */ - int status; /* Return status */ - - /* Repository for info read from ifspec file.*/ - Ifs_Table_t ifs_table; - - /* Find the required buffer size and allocate if the default buffer - * on the stack is too small */ - { - int j; - size_t n_byte_needed = 0; - for (j = 0; j < num_models; j++) { /* max(model path lengths) */ - const size_t n = strlen(model_info[j].path_name); - if (n_byte_needed < n) { - n_byte_needed = n; - } - } - n_byte_needed += 1 + strlen(IFSPEC_FILENAME) + 1; - if (n_byte_needed > sizeof path_stack) { - if ((path = (char *) malloc(n_byte_needed)) == (char *) NULL) { - print_error("ERROR - Unable to allocate a buffer " - "for model paths"); - return -1; - } - } - } - - - /* For each model found in model pathname file, read the interface */ - /* spec file to get the SPICE and C function names into model_info */ - for(i = 0; i < num_models; i++) { - Model_Info_t *p_model_info_cur = model_info + i; - - /* 0 for error recovery */ - (void) memset(&ifs_table, 0, sizeof ifs_table); - - /* Form the full pathname to the interface spec file. Size has - * been checked to ensure that all strings will fit. */ - { - char *p_dst = path; - - /* Copy path name */ - const char *p_src = model_info[i].path_name; - for ( ; ; ) { - const char ch_cur = *p_src; - if (ch_cur == '\0') { - break; - } - *p_dst++ = ch_cur; - ++p_src; - } - *p_dst++ = '/'; /* add directory separator */ - strcpy(p_dst, IFSPEC_FILENAME); - } - - /* Read the SPICE and C function names from the interface spec file */ - status = read_ifs_file(path, GET_IFS_NAME, &ifs_table); - - /* Transfer the names into the model_info structure */ - if (status == 0) { - if ((p_model_info_cur->spice_name = strdup( - ifs_table.name.model_name)) == (char *) NULL) { - print_error("ERROR - Unable to copy code model name"); - all_found = false; - break; - } - if ((p_model_info_cur->cfunc_name = strdup( - ifs_table.name.c_fcn_name)) == (char *) NULL) { - print_error("ERROR - Unable to copy code model function name"); - all_found = false; - break; - } - } - else { - print_error( - "ERROR - Problems reading \"%s\" in directory \"%s\"", - IFSPEC_FILENAME, p_model_info_cur->path_name); - all_found = false; - break; - } - - /* Remove the ifs_table */ - rem_ifs_table(&ifs_table); - } /* end of loop over models */ - - /* Free buffer if allocated */ - if (path != path_stack) { - free(path); - } - - if (all_found) { - return 0; - } - else { - /* Free allocations of model when failure occurred */ - rem_ifs_table(&ifs_table); - return -1; - } -} /* end of function read_model_names */ - - - -/* *********************************************************************** */ - - -/* -read_node_names - -This function opens each of the user-defined node definition files -and gets the names of the node into the internal information structure. -*/ - - -static int read_node_names( - int num_nodes, /* Number of node pathnames */ - Node_Info_t *node_info /* Info about each node */ -) -{ - bool all_found = true; /* True if all ifspec files read */ - int i; /* A temporary counter */ - char path_stack[100]; /* full pathname to ifspec file if from stack */ - char *path = path_stack; /* actual path buffer */ - int status; /* Return status */ - char *node_name; /* Name of node type read from file */ - - /* Find the required buffer size and allocate if the default buffer - * on the stack is too small */ - { - int j; - size_t n_byte_needed = 0; - for (j = 0; j < num_nodes; j++) { /* max(model path lengths) */ - const size_t n = strlen(node_info[j].path_name); - if (n_byte_needed < n) { - n_byte_needed = n; - } - } - n_byte_needed += 1 + strlen(UDNFUNC_FILENAME) + 1; - if (n_byte_needed > sizeof path_stack) { - if ((path = (char *) malloc(n_byte_needed)) == (char *) NULL) { - print_error("ERROR - Unable to allocate a buffer " - "for user types"); - return -1; - } - } - } - - - /* For each node found in node pathname file, read the udnfunc.c */ - /* file to get the node type names into node_info */ - - for(i = 0, all_found = true; i < num_nodes; i++) { - /* Form the full pathname to the user-defined type file. Size has - * been checked to ensure that all strings will fit. */ - { - char *p_dst = path; - - /* Copy path name */ - const char *p_src = node_info[i].path_name; - for ( ; ; ) { - const char ch_cur = *p_src; - if (ch_cur == '\0') { - break; - } - *p_dst++ = ch_cur; - ++p_src; - } - *p_dst++ = '/'; /* add directory separator */ - strcpy(p_dst, UDNFUNC_FILENAME); - } - - /* Read the udn node type name from the file */ - status = read_udn_type_name(path, &node_name); - - /* Transfer the names into the node_info structure */ - if(status == 0) { - node_info[i].node_name = node_name; - } - else { - all_found = false; - print_error("ERROR - Problems reading %s in directory %s", - UDNFUNC_FILENAME, node_info[i].path_name); - } - } - - if(all_found) - return 0; - else - return -1; -} /* end of function read_node_names */ - - - -/* *********************************************************************** */ - - -/* -check_uniqueness - -Function check_uniqueness determines if model names and function -names are unique with respect to each other and to the models and -functions internal to SPICE 3C1. -*/ - -static int check_uniqueness( - int num_models, /* Number of model pathnames */ - Model_Info_t *model_info, /* Info about each model */ - int num_nodes, /* Number of node type pathnames */ - Node_Info_t *node_info /* Info about each node type */ -) -{ - /* Define a list of model names used internally by XSPICE */ - /* These names (except 'poly') are defined in src/sim/INP/INPdomodel.c and */ - /* are case insensitive */ - static const char *SPICEmodel[] = { - "npn", - "pnp", - "d", - "njf", - "pjf", - "nmf", - "pmf", - "urc", - "nmos", - "pmos", - "r", - "c", - "sw", - "csw", - "poly" }; - static const int numSPICEmodels = sizeof(SPICEmodel) / sizeof(char *); - - - /* Define a list of node type names used internally by the simulator */ - /* These names are defined in src/sim/include/MIFtypes.h and are case */ - /* insensitive */ - static const char *UDNidentifier[] = { - "v", - "vd", - "i", - "id", - "vnam", - "g", - "gd", - "h", - "hd", - "d" }; - static const int numUDNidentifiers = sizeof(UDNidentifier) / sizeof(char *); - - bool f_have_duplicate = false; /* no duplicates found yet */ - - /* First, normalize case of all model and node names to lower since */ - /* SPICE is case insensitive in parsing decks */ - { - int i; - for(i = 0; i < num_models; i++) { - str_to_lower(model_info[i].spice_name); - } - } - { - int i; - for(i = 0; i < num_nodes; i++) { - str_to_lower(node_info[i].node_name); - } - } - - /* Sizes of models and nodes */ - const unsigned int n_model = (unsigned int) numSPICEmodels + num_models; - const unsigned int n_node = (unsigned int) numUDNidentifiers + num_nodes; - const unsigned int n_ks = n_model > n_node ? n_model : n_node; - - /* Allocate structure to compare */ - struct Key_src * const p_ks = (struct Key_src *) malloc( - n_ks * sizeof *p_ks); - if (p_ks == (struct Key_src *) NULL) { - print_error("ERROR - Unable to allocate array to check uniqueness."); - return -1; - } - - /* Set up for test of SPICE name of models and test */ - if (num_models > 0) { /* Have user-defined models */ - { - int i, j; - - /* Fill up with SPICE models */ - for (i = 0; i < numSPICEmodels; ++i) { - struct Key_src *p_ks_cur = p_ks + i; - p_ks_cur->key = SPICEmodel[i]; - p_ks_cur->src = (char *) NULL; /* denotes internal SPICE */ - } - /* Add SPICE model names for code models */ - for (j = 0; j < num_models; ++i, ++j) { - struct Key_src *p_ks_cur = p_ks + i; - Model_Info_t *p_mi_cur = model_info + j; - p_ks_cur->key = p_mi_cur->spice_name; - p_ks_cur->src = p_mi_cur->path_name; - } - - /* Test for duplicates */ - f_have_duplicate |= test_for_duplicates(n_model, p_ks, - &report_error_spice_name); - } - - /* Set up for test of function names */ - { - int i; - - /* Fill up with C function names from code models */ - for (i = 0; i < num_models; ++i) { - struct Key_src *p_ks_cur = p_ks + i; - Model_Info_t *p_mi_cur = model_info + i; - p_ks_cur->key = p_mi_cur->cfunc_name; - p_ks_cur->src = p_mi_cur->path_name; - } - - /* Test for duplicates */ - f_have_duplicate |= test_for_duplicates(num_models, p_ks, - &report_error_function_name); - } - } - - /* Set up for test of node types and test */ - if (num_nodes > 0) { /* Have user-defined types */ - int i, j; - - /* Fill up with SPICE node types */ - for (i = 0; i < numUDNidentifiers; ++i) { - struct Key_src *p_ks_cur = p_ks + i; - p_ks_cur->key = UDNidentifier[i]; - p_ks_cur->src = (char *) NULL; /* denotes internal SPICE */ - } - /* Add user-defined nodes */ - for (j = 0; j < num_nodes; ++i, ++j) { - struct Key_src *p_ks_cur = p_ks + i; - Node_Info_t *p_ni_cur = node_info + j; - p_ks_cur->key = p_ni_cur->node_name; - p_ks_cur->src = p_ni_cur->path_name; - } - - /* Test for duplicates */ - f_have_duplicate |= test_for_duplicates(n_node, p_ks, - &report_error_udn_name); - } - - /* Free allocation for compares */ - free(p_ks); - - /* Return error status */ - return f_have_duplicate ? -1 : 0; -} /* end of function check_uniqueness */ - - - -/* Test for duplicate key values and report using the supplied function - * if found */ -static bool test_for_duplicates(unsigned int n, struct Key_src *p_ks, - void (*p_error_reporter)(const struct Key_src *p_ks1, - const struct Key_src *p_ks2)) -{ - bool f_have_duplicate = false; - - /* Sort to put duplicates together */ - qsort(p_ks, n, sizeof(struct Key_src), - (int (*)(const void *, const void *)) &cmpr_ks); - - unsigned int i; - for (i = 0; i != n; ) { - const struct Key_src * const p_ks_i = p_ks + i; - const char * const p_key_i_val = p_ks_i->key; - unsigned int j; - for (j = i + 1; j != n; ++j) { - const struct Key_src * const p_ks_j = p_ks + j; - const char * const p_key_j_val = p_ks_j->key; - if (strcmp(p_key_i_val, p_key_j_val) != 0) { - break; - } - - /* Duplicate found. Indicate a duplicate was found and report - * the error */ - f_have_duplicate = true; - (*p_error_reporter)(p_ks_i, p_ks_j); - } /* end of loop testing for duplicates */ - i = j; /* advance to next unique value or end of list */ - } /* end of loop over items to test */ - return f_have_duplicate; -} /* end of function test_for_duplicates */ - - - -/* Compare function for struct Key_src. - * - * Remarks - * the src field may be NULL to indicate internal values. These should - * be ordered before values that are not NULL for nicer error messages. - * Note that for a given key, only one src field can be NULL. */ -static int cmpr_ks(const struct Key_src *ks1, const struct Key_src *ks2) -{ - /* First order by the value of the key */ - const int rc = strcmp(ks1->key, ks2->key); - if (rc != 0) { - return rc; - } - - /* Test for NULL src fields. Only one can be NULL for the same key */ - if (ks1->src == (char *) NULL) { - return -1; - } - if (ks2->src == (char *) NULL) { - return +1; - } - - /* Both keys not NULL, so compare */ - return strcmp(ks1->src, ks2->src); -} /* end of function cmpr_ks */ - - - -static void report_error_spice_name(const struct Key_src *p_ks1, - const struct Key_src *p_ks2) -{ - const char * const p_ks1_src = p_ks1->src; - if (p_ks1_src == (char *) NULL) { /* internal SPICE name */ - print_error("ERROR: Model name \"%s\" from directory \"%s\" " - "is the name of an internal SPICE model", - p_ks1->key, p_ks2->src); - } - else { - print_error("ERROR: Model name \"%s\" in directory \"%s\" " - "is also in directory \"%s\".", - p_ks1->key, p_ks1_src, p_ks2->src); - } -} /* end of function report_error_spice_name */ - - - -static void report_error_function_name (const struct Key_src *p_ks1, - const struct Key_src *p_ks2) -{ - print_error("ERROR: C function name \"%s\" in directory \"%s\" " - "is also in directory \"%s\".", - p_ks1->key, p_ks1->src, p_ks2->src); -} /* end of function report_error_spice_name */ - - - -static void report_error_udn_name(const struct Key_src *p_ks1, - const struct Key_src *p_ks2) -{ - const char * const p_ks1_src = p_ks1->src; - if (p_ks1_src == (char *) NULL) { /* internal SPICE name */ - print_error("ERROR: Node type \"%s\" from directory \"%s\" " - "is the name of an internal SPICE node type", - p_ks1->key, p_ks2->src); - } - else { - print_error("ERROR: Node type \"%s\" in directory \"%s\" " - "is also in directory \"%s\".", - p_ks1->key, p_ks1_src, p_ks2->src); - } -} /* end of function report_error_udn_name */ - - - -/* *********************************************************************** */ - - -/* -write_CMextrn - -Function write_CMextrn writes the CMextrn.h file used in -compiling SPIinit.c immediately prior to linking the simulator -and code models. This SPICE source file uses the structures -mentioned in the include file to define the models known to the -simulator. -*/ - -static int write_CMextrn( - int num_models, /* Number of model pathnames */ - Model_Info_t *model_info /* Info about each model */ -) -{ - int i; /* A temporary counter */ - FILE *fp; /* File pointer for writing CMextrn.h */ - - char *filename = (char *) NULL; - - /* Open the file to be written */ - if ((filename = gen_filename("cmextrn.h", "w")) == (char *) NULL) { - print_error("ERROR - Unable to build path to cmextrn.h"); - return -1; - } - fp = fopen(filename, "w"); - if(fp == NULL) { - print_error("ERROR - Problems opening %s for write", filename); - free(filename); - return -1; - } - - /* Write out the data */ - for(i = 0; i < num_models; i++) { - fprintf(fp, "extern SPICEdev %s_info;\n", model_info[i].cfunc_name); - } - - /* Close the file and return */ - if (fclose(fp) != 0) { - print_error("ERROR - Problems closing %s", filename); - free(filename); - return -1; - } - free(filename); - return 0; -} /* end of function write_CMextrn */ - - -/* *********************************************************************** */ - - -/* -write_CMinfo - -Function write_CMinfo writes the CMinfo.h file used in compiling -SPIinit.c immediately prior to linking the simulator and code -models. This SPICE source file uses the structures mentioned in -the include file to define the models known to the simulator. -*/ - - -static int write_CMinfo( - int num_models, /* Number of model pathnames */ - Model_Info_t *model_info /* Info about each model */ -) -{ - int i; /* A temporary counter */ - FILE *fp; /* File pointer for writing CMinfo.h */ - - char *filename = (char *) NULL; - - /* Open the file to be written */ - if ((filename = gen_filename("cminfo.h", "w")) == (char *) NULL) { - print_error("ERROR - Unable to build path to cminfo.h"); - return -1; - } - fp = fopen(filename, "w"); - if(fp == NULL) { - print_error("ERROR - Problems opening %s for write", filename); - free(filename); - return -1; - } - - /* Write out the data */ - for(i = 0; i < num_models; i++) { - Model_Info_t *p_mi_cur = model_info + i; - if (p_mi_cur->version == 1) { - fprintf(fp, "&%s_info,\n", model_info[i].cfunc_name); - } - } - - /* Close the file and return */ - if (fclose(fp) != 0) { - print_error("ERROR - Problems closing %s", filename); - free(filename); - return -1; - } - - free(filename); - return 0; -} /* end of function write_CMinfo */ - - - -static int write_CMinfo2( - int num_models, /* Number of model pathnames */ - Model_Info_t *model_info /* Info about each model */ -) -{ - int i; /* A temporary counter */ - FILE *fp; /* File pointer for writing CMinfo.h */ - - char *filename = (char *) NULL; - - /* Open the file to be written */ - if ((filename = gen_filename("cminfo2.h", "w")) == (char *) NULL) { - print_error("ERROR - Unable to build path to cminfo2.h"); - return -1; - } - fp = fopen(filename, "w"); - if(fp == NULL) { - print_error("ERROR - Problems opening %s for write", filename); - free(filename); - return -1; - } - - /* Write out the data */ - for (i = 0; i < num_models; i++) { - Model_Info_t *p_mi_cur = model_info + i; - if (p_mi_cur->version <= 2) { - fprintf(fp, "&%s_info,\n", model_info[i].cfunc_name); - } - } - - /* Close the file and return */ - if (fclose(fp) != 0) { - print_error("ERROR - Problems closing %s", filename); - free(filename); - return -1; - } - - free(filename); - return 0; -} /* end of function write_CMinfo2 */ - - - -/* *********************************************************************** */ - - - -/* -write_UDNextrn - -Function write_UDNextrn writes the UDNextrn.h file used in -compiling SPIinit.c immediately prior to linking the simulator -and user-defined nodes. This SPICE source file uses the structures -mentioned in the include file to define the node types known to the -simulator. -*/ - - - -static int write_UDNextrn( - int num_nodes, /* Number of node pathnames */ - Node_Info_t *node_info /* Info about each node */ -) -{ - int i; /* A temporary counter */ - FILE *fp; /* File pointer for writing UDNextrn.h */ - - char *filename = (char *) NULL; - - /* Open the file to be written */ - if ((filename = gen_filename("udnextrn.h", "w")) == (char *) NULL) { - print_error("ERROR - Unable to build path to udnextrn.h"); - return -1; - } - fp = fopen(filename, "w"); - if(fp == NULL) { - print_error("ERROR - Problems opening %s for write", filename); - return -1; - } - - /* Write out the data */ - for(i = 0; i < num_nodes; i++) { - fprintf(fp, "extern Evt_Udn_Info_t udn_%s_info;\n", node_info[i].node_name); - } - - /* Close the file and return */ - if (fclose(fp) != 0) { - print_error("ERROR - Problems closing %s", filename); - free(filename); - return -1; - } - - free(filename); - return 0; -} /* end of function write_UDNextrn */ - - - -/* *********************************************************************** */ - - -/* -write_UDNinfo - -Function write_UDNinfo writes the UDNinfo.h file used in -compiling SPIinit.c immediately prior to linking the simulator -and user-defined nodes. This SPICE source file uses the structures -mentioned in the include file to define the node types known to the -simulator. -*/ -static int write_UDNinfo( - int num_nodes, /* Number of node pathnames */ - Node_Info_t *node_info /* Info about each node */ -) -{ - int i; /* A temporary counter */ - FILE *fp; /* File pointer for writing UDNinfo.h */ - - char *filename = (char *) NULL; - - /* Open the file to be written */ - if ((filename = gen_filename("udninfo.h", "w")) == (char *) NULL) { - print_error("ERROR - Unable to build path to udninfo.h"); - return -1; - } - fp = fopen(filename, "w"); - if(fp == NULL) { - print_error("ERROR - Problems opening %s for write", filename); - return -1; - } - - /* Write out the data */ - for(i = 0; i < num_nodes; i++) { - Node_Info_t *p_ni_cur = node_info + i; - if (p_ni_cur->version == 1) { - fprintf(fp, "&udn_%s_info,\n", p_ni_cur->node_name); - } - } - - /* Close the file and return */ - if (fclose(fp) != 0) { - print_error("ERROR - Problems closing %s", filename); - free(filename); - return -1; - } - - free(filename); - return 0; -} /* end of function write_UDNinfo */ - - - -static int write_UDNinfo2( - int num_nodes, /* Number of node pathnames */ - Node_Info_t *node_info /* Info about each node */ -) -{ - int i; /* A temporary counter */ - FILE *fp; /* File pointer for writing UDNinfo.h */ - - char *filename = (char *) NULL; - - /* Open the file to be written */ - if ((filename = gen_filename("udninfo2.h", "w")) == (char *) NULL) { - print_error("ERROR - Unable to build path to udninfo2.h"); - return -1; - } - fp = fopen(filename, "w"); - if(fp == NULL) { - print_error("ERROR - Problems opening %s for write", filename); - return -1; - } - - /* Write out the data */ - for(i = 0; i < num_nodes; i++) { - Node_Info_t *p_ni_cur = node_info + i; - if (p_ni_cur->version <= 2) { - fprintf(fp, "&udn_%s_info,\n", p_ni_cur->node_name); - } - } - - /* Close the file and return */ - if (fclose(fp) != 0) { - print_error("ERROR - Problems closing %s", filename); - free(filename); - return -1; - } - - free(filename); - return 0; -} /* end of function write_UDNinfo */ - - - -/* *********************************************************************** */ - -/* -write_objects_inc - -Function write_objects_inc writes a make include file used by -the make utility to locate the object modules needed to link the -simulator with the code models and user-defined node types. -*/ - -static int write_objects_inc( - int num_models, /* Number of model pathnames */ - Model_Info_t *model_info, /* Info about each model */ - int num_nodes, /* Number of udn pathnames */ - Node_Info_t *node_info /* Info about each node type */ -) -{ - int i; /* A temporary counter */ - FILE *fp; /* File pointer for writing make_include */ - - char *filename = (char *) NULL; - - /* Open the file to be written */ - if ((filename = gen_filename("objects.inc", "w")) == (char *) NULL) { - print_error("ERROR - Unable to build path to objects.inc"); - return -1; - } - fp = fopen(filename, "w"); - if(fp == NULL) { - print_error("ERROR - Problems opening %s for write", filename); - return -1; - } - - /* Write out the data */ - for(i = 0; i < num_models; i++) { - fprintf(fp, "%s/*.o", model_info[i].path_name); - if((i < (num_models - 1)) || (num_nodes > 0)) - fprintf(fp, " \\\n"); - else - fprintf(fp, "\n"); - } - for(i = 0; i < num_nodes; i++) { - fprintf(fp, "%s/*.o", node_info[i].path_name); - if(i < (num_nodes - 1)) - fprintf(fp, " \\\n"); - else - fprintf(fp, "\n"); - } - - /* Close the file and return */ - if (fclose(fp) != 0) { - print_error("ERROR - Problems closing %s", filename); - free(filename); - return -1; - } - - free(filename); - return 0; -} /* end of function write_objects_inc */ - - - -/* -read_udn_type_name - -This function reads a User-Defined Node Definition File until -the definition of the Evt_Udn_Info_t struct -is found, and then gets the name of the node type from the first -member of the structure. -*/ - -static int read_udn_type_name( - const char *path, /* the path to the node definition file */ - char **node_name /* the node type name found in the file */ -) -{ - FILE *fp; /* file pointer for opened file */ - bool found; /* true if name found successfully */ - bool in_struct; /* true if found struct with name */ - char name[MAX_NAME_LEN + 1]; /* temporary storage for name read */ - int c; /* a character read from the file */ - int i; /* a counter */ - - static char *struct_type = "Evt_Udn_Info_t"; - char *filename = (char *) NULL; - - /* Open the file from which the node type name will be read */ - if ((filename = gen_filename(path, "r")) == (char *) NULL) { - print_error("ERROR - Unable to build path to Evt_Udn_Info_t"); - return -1; - } - fp = fopen(filename, "r"); - if(fp == NULL) { - print_error("ERROR - Problems opening %s for reading", filename); - return -1; - } - - /* Read the file until the definition of the Evt_Udn_Info_t struct */ - /* is found, then get the name of the node type from the first */ - /* member of the structure */ - found = false; - do { - /* read the next character */ - c = fgetc(fp); - - /* check for and gobble up comments */ - if(c == '/') { - c = fgetc(fp); - if(c == '*') { - do { - c = fgetc(fp); - if(c == '*') { - c = fgetc(fp); - if((c == '/') || (c == EOF)) - break; - else - ungetc(c, fp); - } - } while(c != EOF); - } - } - if(c == EOF) - break; - - /* read until "Evt_Udn_Info_t" is encountered */ - for(i = 0, in_struct = false; ; i++) { - if(c != struct_type[i]) - break; - else if(i == (sizeof(struct_type) - 2)) { - in_struct = true; - break; - } - else - c = fgetc(fp); - } - /* if found it, read until open quote found */ - /* and then read the name until the closing quote is found */ - if(in_struct) { - do { - c = fgetc(fp); - if(c == '"') { - i = 0; - do { - c = fgetc(fp); - if(c == '"') { - found = true; - if (i >= sizeof name) { - print_error("name too long"); - exit(1); - } - name[i] = '\0'; - } - else if(c != EOF) { - if (i > sizeof name) { - print_error("name too long"); - exit(1); - } - name[i++] = (char) c; - } - } while((c != EOF) && (! found)); - } - } while((c != EOF) && (! found)); - } - - } while((c != EOF) && (! found)); - - /* Close the file and return */ - fclose(fp); - - if(found) { - if ((*node_name = (char *) malloc( - strlen(name) + 1)) == (char *) NULL) { - print_error("ERROR - Unable to allocate node name"); - return -1; - } - strcpy(*node_name, name); - return 0; - } - else { - *node_name = NULL; - return -1; - } -} - - - -/* Free allocations in p_model_info array */ -static void free_model_info(int num_models, Model_Info_t *p_model_info) -{ - /* Return if no structure */ - if (p_model_info == (Model_Info_t *) NULL) { - return; - } - - int i; - for (i = 0; i < num_models; ++i) { - Model_Info_t *p_cur = p_model_info + i; - void *p; - if ((p = p_cur->cfunc_name) != NULL) { - free(p); - } - if ((p = p_cur->path_name) != NULL) { - free(p); - } - if ((p = p_cur->spice_name) != NULL) { - free(p); - } - } - - free(p_model_info); -} /* end of function free_model_info */ - - - -/* Free allocations in p_nod_info array */ -static void free_node_info(int num_nodes, Node_Info_t *p_node_info) -{ - /* Return if no structure */ - if (p_node_info == (Node_Info_t *) NULL) { - return; - } - - int i; - for (i = 0; i < num_nodes; ++i) { - Node_Info_t *p_cur = p_node_info + i; - void *p; - if ((p = p_cur->node_name) != NULL) { - free(p); - } - if ((p = p_cur->path_name) != NULL) { - free(p); - } - } - - free(p_node_info); -} /* end of function free_node_info */ - - - diff --git a/src/xspice/cmpp/pp_mod.c b/src/xspice/cmpp/pp_mod.c deleted file mode 100644 index f823614a5..000000000 --- a/src/xspice/cmpp/pp_mod.c +++ /dev/null @@ -1,220 +0,0 @@ -/*============================================================================ -FILE pp_mod.c - -MEMBER OF process cmpp - -Public Domain - -Georgia Tech Research Corporation -Atlanta, Georgia 30332 -PROJECT A-8503 - -AUTHORS - - 9/12/91 Steve Tynor - -MODIFICATIONS - - - -SUMMARY - - This file contains the top-level driver function for preprocessing the - "cfunc.mod" file. First, the "ifspec.ifs" file is opened and parsed to - get the data that will be needed in the .mod to .c translation (See - read_ifs.c). Then the .mod file is translated. Most of the work of the - translation is handled by the UNIX 'lex' and 'yacc' utilities. This - translation is begun at the call to mod_yyparse() below. See also files: - - mod_lex.l - mod_yacc.y - - Note that to allow lex/yacc to be used twice (once for the ifspec.ifs - file, and then again for the cfunc.mod file), the functions created by - lex/yacc for the latter are translated using the UNIX text editor 'sed' - under the direction of the Makefile and the following 'sed scripts': - - mod_lex.sed - mod_yacc.sed - - Hence the call to 'mod_yyparse()' rather than 'yyparse()' below. - -INTERFACES - - preprocess_mod_file() - -REFERENCED FILES - - None. - -NON-STANDARD FEATURES - - None. - -============================================================================*/ - -#include -#include -#include -#include -#ifndef _MSC_VER -#include -#endif -#include "mod_yacc_y.h" - -extern int mod_yyparse(void); -extern void mod_yyrestart (FILE*); - -extern FILE *mod_yyin; -extern FILE *mod_yyout; -extern int mod_yylineno; -extern char *mod_yytext; - -extern int mod_num_errors; - -extern Ifs_Table_t *mod_ifs_table; - -extern char *current_filename; -extern char *prog_name; - -/*---------------------------------------------------------------------------*/ -/* Allocate and build a file name from the input filename by changing its - * extension (text after the last '.') in filename to ext or append .ext if - * the filename has no extension */ -static char *change_extension(const char *filename, const char *ext) -{ - const char * const p = strrchr(filename, '.'); - const size_t prefix_len = p ? (size_t) (p - filename) : strlen(filename); - const size_t ext_len = strlen(ext); - char * const new_filename = malloc(prefix_len + ext_len + 2); - /* +1 for '.' +1 for '\0' */ - if (new_filename == (char *) NULL) { - return (char *) NULL; - } - - { - char *p_cur = (char *) memcpy(new_filename, filename, prefix_len) + - prefix_len; - *p_cur++ = '.'; - (void) memcpy(p_cur, ext, ext_len + 1); - } - - return new_filename; -} /* end of function change_extension */ - -/*---------------------------------------------------------------------------*/ - -/* -preprocess_mod_file - -Function preprocess_mod_file is the top-level driver function for -preprocessing a code model file (cfunc.mod). This function calls -read_ifs_file() requesting it to read and parse the Interface -Specification file (ifspec.ifs) and place the information -contained in it into an internal data structure. It then calls -mod_yyparse() to read the cfunc.mod file and translate it -according to the Interface Specification information. Function -mod_yyparse() is automatically generated by UNIX lex/yacc -utilities. -*/ - - -void preprocess_mod_file ( - const char *filename) /* The file to read */ -{ - Ifs_Table_t ifs_table; /* info read from ifspec.ifs file */ - int status; /* Return status */ - char *output_filename = (char *) NULL; /* .mod file being written */ - - /* - * Read the entire ifspec.ifs file and load the data into ifs_table - */ - - status = read_ifs_file (IFSPEC_FILENAME, GET_IFS_TABLE, &ifs_table); - - if (status != 0) { - exit(1); - } - - /* Open the cfunc.mod file defining the code model function */ - if ((current_filename = gen_filename(filename, "r")) == (char *) NULL) { - print_error("ERROR - Unable to build mod file name"); - exit(1); - } - if ((mod_yyin = fopen(current_filename, "r")) == (FILE *) NULL) { - print_error("ERROR - Unable to open mod file \"%s\": %s", - current_filename, strerror(errno)); - exit(1); - } - - { - char *output_filename_base = (char *) NULL; - if ((output_filename_base = change_extension( - filename, "c")) == (char *) NULL) { - print_error("ERROR - Could not change extension of " - "\"%s\".", filename); - exit(1); - } - - if ((output_filename = gen_filename( - output_filename_base, "w")) == (char *) NULL) { - print_error("ERROR - Unable to build output file name"); - exit(1); - } - - free(output_filename_base); - } - - if ((mod_yyout = fopen(output_filename, "w")) == (FILE *) NULL) { - /* .c file could not be opened */ - print_error("ERROR - Could not open output .c file\"%s\": %s", - output_filename, strerror(errno)); - exit(1); - } - - mod_ifs_table = &ifs_table; - mod_num_errors = 0; - -/* Define DEBUG_WITH_MOD_FILE to have the compiler use the cfunc.mod file for - * deugging instead of the cfunc.c file. */ -#ifdef DEBUG_WITH_MOD_FILE - fprintf (mod_yyout, "#line 1 \"%s\"\n", current_filename); -#endif - fprintf (mod_yyout, "#include \"ngspice/cm.h\"\n"); - fprintf (mod_yyout, "extern void %s(Mif_Private_t *);\n", - ifs_table.name.c_fcn_name); -#ifdef DEBUG_WITH_MOD_FILE - fprintf (mod_yyout, "#line 1 \"%s\"\n", current_filename); -#endif - - mod_yylineno = 1; - - if (mod_yyparse() || (mod_num_errors > 0)) { - print_error("Error parsing .mod file: \"%s\"", current_filename); - unlink(output_filename); - exit(1); - } - - if (fclose(mod_yyout) != 0) { - print_error("Error closing output file \"%s\": %s", - current_filename, strerror(errno)); - unlink(output_filename); - exit(1); - } - - rem_ifs_table(&ifs_table); - mod_yyrestart(NULL); - free(output_filename); - free(current_filename); -} /* end of function preprocess_mod_file */ - - - -/*---------------------------------------------------------------------------*/ -void -mod_yyerror (char *str) -{ - fprintf (stderr, "%s: Error: \"%s\": line %d (near \'%s\'):\n\t%s.\n", - prog_name, current_filename, mod_yylineno, mod_yytext, str); -} - diff --git a/src/xspice/cmpp/read_ifs.c b/src/xspice/cmpp/read_ifs.c deleted file mode 100644 index 08a5d74de..000000000 --- a/src/xspice/cmpp/read_ifs.c +++ /dev/null @@ -1,190 +0,0 @@ -/*============================================================================ -FILE read_ifs.c - -MEMBER OF process cmpp - -Public Domain - -Georgia Tech Research Corporation -Atlanta, Georgia 30332 -PROJECT A-8503 - -AUTHORS - - 9/12/91 Bill Kuhn and Steve Tynor - -MODIFICATIONS - - - -SUMMARY - - This file contains top-level functions used in reading information - from the ifspec.ifs file and building an internal data structure that - holds the information. Most of the work in parsing of the - ifspec.ifs file and in building the structure is handled by - the UNIX 'lex' and 'yacc' utilities. This processing is begun - at the call to yyparse() in read_ifs_table() below. See also files: - - ifs_lex.l - ifs_yacc.y - -INTERFACES - - read_ifs_file() - yywrap() - yyerror() - -REFERENCED FILES - - None. - -NON-STANDARD FEATURES - - None. - -============================================================================*/ - -#include -#include -#include -#include -#include - -#include "ifs_yacc_y.h" - -extern char *prog_name; -extern int ifs_yyparse (void); -extern void ifs_yyrestart (FILE*); - -extern FILE *ifs_yyin; -extern int ifs_yylineno; -extern char *ifs_yytext; - -extern Ifs_Table_t *parser_ifs_table; -extern bool parser_just_names; - -extern int ifs_num_errors; - -static int read_ifs_table(FILE *fp, int mode, Ifs_Table_t *ifs_table); - -char *current_filename; - -/* *********************************************************************** */ - - -/* - NOTE - - The following function may be called either by cmpp -ifs or cmpp -lst with - mode set to GET_IFS_TABLE or GET_IFS_NAME respectively. - */ - - -/* -read_ifs_file - -Function read_ifs_file() opens the Interface Specification file -(ifspec.ifs) for read access and calls read_ifs_table() with the -assigned file pointer to read and parse the file. Upon return -from read_ifs_table(), the file is closed. -*/ - - - -int read_ifs_file( - const char *filename, /* File to read */ - int mode, /* Get names only or get everything? */ - Ifs_Table_t *ifs_table) /* Table to put info in */ -{ - FILE *fp = (FILE *) NULL; /* Ifs file pointer */ - int status = 0; /* returned status from function */ - - - /* Open the ifs file for read access */ - - /* Open the model pathname file */ - if ((current_filename = gen_filename(filename, "r")) == (char *) NULL) { - print_error("ERROR - Unable to build full file name"); - return -1; - } - if ((fp = fopen(current_filename, "r")) == (FILE *) NULL) { - print_error("ERROR - Unable to open \"%s\": %s", - current_filename, strerror(errno)); - status = -1; - goto EXITPOINT; - } - - /* Get the stuff from the file into the ifs_table struct. Here mode - * defines the data that will be added to the structure */ - status = read_ifs_table(fp, mode, ifs_table); - - EXITPOINT: - /* Close file and return */ - if (fp != (FILE *) NULL) { - if (fclose(fp) != 0) { - print_error("ERROR - Unable to close \"%s\": %s", - current_filename, strerror(errno)); - status = -1; - } - } - - free(current_filename); - current_filename = (char *) NULL; - return status; -} /* end of function read_ifs_file */ - - - - -/* *********************************************************************** */ - - -/* -read_ifs_table - -Function read_ifs_table() calls yyparse() to read and parse the -Interface Specification file contents and place the information -into an internal data structure. Function yyparse() is -automatically generated by UNIX lex/yacc. -*/ - - - -static int read_ifs_table( - FILE *fp, /* File to read from */ - int mode, /* Get names only or get everything? */ - Ifs_Table_t *ifs_table) /* Table to put info in */ -{ - assert (ifs_table); - assert (fp); - - ifs_table->name.description = - ifs_table->name.c_fcn_name = - ifs_table->name.model_name = NULL; - - ifs_yylineno = 1; - ifs_yyin = fp; - parser_just_names = (mode == GET_IFS_NAME) ? true : false; - parser_ifs_table = ifs_table; - - ifs_num_errors = 0; - - if (ifs_yyparse() || (ifs_num_errors > 0)) { - print_error ("Error parsing interface specification file"); - ifs_yyrestart(NULL); - return -1; - } - ifs_yyrestart(NULL); - return 0; -} - -/*---------------------------------------------------------------------------*/ - -void -ifs_yyerror (char *str) -{ - fprintf (stderr, "%s: Error: \"%s\": line %d (near \'%s\'):\n\t%s.\n", - prog_name, current_filename, ifs_yylineno, ifs_yytext, str); -} - diff --git a/src/xspice/cmpp/util.c b/src/xspice/cmpp/util.c deleted file mode 100644 index 0b7f24c49..000000000 --- a/src/xspice/cmpp/util.c +++ /dev/null @@ -1,173 +0,0 @@ -/*============================================================================ -FILE util.c - -MEMBER OF process cmpp - -Public Domain - -Georgia Tech Research Corporation -Atlanta, Georgia 30332 -PROJECT A-8503 - -AUTHORS - - 9/12/91 Bill Kuhn and Steve Tynor - -MODIFICATIONS - - - -SUMMARY - - This file contains miscellaneous utility functions used in cmpp. - -INTERFACES - - init_error() - print_error() - str_to_lower() - -REFERENCED FILES - - None. - -NON-STANDARD FEATURES - - None. - -============================================================================*/ - -#include -#include -#include -#include -#include -#include - -#if defined(_WIN32) -#include /* for definition of PathIsRelativeA() */ -#if defined(_MSC_VER) -#pragma comment(lib, "Shlwapi.lib") -#endif -#endif - -#include "cmpp.h" - - -/* Using only Unix directory separator since it is used to build directory - * paths in include files that must work on any supported operating - * system */ -#define DIR_TERM_UNIX '/' - - -/* *********************************************************************** */ - -char *prog_name; - - -inline static bool is_absolute_pathname(const char *path); - - -/* Initialize external variable prog_name with the name of the program. - * A copy is not made. */ -void init_error(char *program_name) -{ - prog_name = program_name; -} /* end of function init_error */ - - - -/* Print an error message to stderr. The message is prefixed with the - * name of the program and a newline character is added to the end. */ -void print_error(const char *fmt, ...) -{ - va_list ap; - va_start(ap, fmt); - vprint_error(fmt, ap); - va_end(ap); -} /* end of function print_error */ - - - -void vprint_error(const char *fmt, va_list p_arg) -{ - fprintf(stderr, "%s: ", prog_name); - vfprintf(stderr, fmt, p_arg); - fprintf(stderr, "\n"); -} /* end of function vprint_error */ - - - -/* Convert a string to all lower case */ -void str_to_lower(char *s) -{ - int i; - char c; - - for(i = 0; (c = s[i]) != '\0'; i++) { - s[i] = tolower_c(c); - } -} /* end of function str_to_lower */ - - - -/* If *path_p is relative, prefix with the value of the CMPP output or - * input environment variable. Open the file and return the path that - * was used to open it. */ -char *gen_filename(const char *filename, const char *mode) -{ - char *buf = (char *) NULL; - - /* If absoulte path, prefix with CMPP_ODIR/CMPP_IDIR env value */ - if (!is_absolute_pathname(filename)) { /* relative path */ - const char *e = getenv((*mode == 'w' || *mode == 'a') ? - "CMPP_ODIR" : "CMPP_IDIR"); - if (e) { /* have env var */ - const size_t len_prefix = strlen(e); - const size_t len_filename = strlen(filename); - const size_t n_char = len_prefix + len_filename + 1; - - /* Allocate buffer to build full file name */ - if ((buf = (char *) malloc(n_char + 1)) == (char *) NULL) { - return (char *) NULL; - } - - /* Build the full file name */ - { - char *p_cur = buf; - (void) memcpy(p_cur, e, len_prefix); - p_cur += len_prefix; - *p_cur++ = DIR_TERM_UNIX; - (void) memcpy(p_cur, filename, len_filename + 1); - } - } /* end of case that env variable found */ - } /* end of case that path is absolute */ - - /* If did not build full file name yet, make the original - * name of the file the full file name */ - if (buf == (char *) NULL) { - if ((buf = strdup(filename)) == (char *) NULL) { /* failed */ - return (char *) NULL; - } - } - - return buf; -} /* end of function gen_filename */ - - - -/* Returns true if path is an absolute path and false if it is a - * relative path. No check is done for the existance of the path. */ -/*** NOTE: Same as in inpcom.c Currently the cmpp project is "isolated - * from others. It would be good to make into one function used in common */ -inline static bool is_absolute_pathname(const char *path) -{ -#ifdef _WIN32 - return !PathIsRelativeA(path); -#else - return path[0] == DIR_TERM_UNIX; -#endif -} /* end of funciton is_absolute_pathname */ - - - diff --git a/src/xspice/cmpp/writ_ifs.c b/src/xspice/cmpp/writ_ifs.c deleted file mode 100644 index e452e3f62..000000000 --- a/src/xspice/cmpp/writ_ifs.c +++ /dev/null @@ -1,1274 +0,0 @@ -/*============================================================================ -FILE writ_ifs.c - -MEMBER OF process cmpp - -Public Domain - -Georgia Tech Research Corporation -Atlanta, Georgia 30332 -PROJECT A-8503 - -AUTHORS - - 9/12/91 Bill Kuhn - -MODIFICATIONS - - - -SUMMARY - - This file contains functions used to write out the file "ifspec.c" - based on information read from "ifspec.ifs", which is now held in - structure 'ifs_table' passed to write_ifs_c_file(). - -INTERFACES - - write_ifs_c_file() - -REFERENCED FILES - - None. - -NON-STANDARD FEATURES - - None. - -============================================================================*/ - - -#include -#include -#include -#include -#include "cmpp.h" - -/* Local function prototypes */ -static int write_comment(FILE *fp, Ifs_Table_t *ifs_table); -static int write_includes(FILE *fp); -static int write_mPTable(FILE *fp, Ifs_Table_t *ifs_table); -static int write_pTable(FILE *fp, Ifs_Table_t *ifs_table); -static int write_conn_info(FILE *fp, Ifs_Table_t *ifs_table); -static int write_param_info(FILE *fp, Ifs_Table_t *ifs_table); -static int write_inst_var_info(FILE *fp, Ifs_Table_t *ifs_table); -static int write_SPICEdev(FILE *fp, Ifs_Table_t *ifs_table); - - - -static const char *data_type_to_str(Data_Type_t type); -static const char *port_type_to_str(Port_Type_t port); -static const char *dir_to_str(Dir_t dir); -static char *value_to_str(Data_Type_t type, Value_t value); -static const char *no_value_to_str(void); -static const char *boolean_to_str(bool value); -static char *integer_to_str(int value); -static const char *gen_port_type_str(Port_Type_t port); - - - -/* *********************************************************************** */ - - - -/* -write_ifs_c_file - -Function write_ifs_c_file is a top-level driver function for -creating a C file (ifspec.c) that defines the model Interface -Specification in a form usable by the simulator. The ifspec.c -output file is opened for writing, and then each of the following -functions is called in order to write the necessary statements -and data structures into the file: - - write_comment - write_includes - write_mPTable - write_conn_info - write_param_info - write_inst_var_info - write_SPICEdev - -The output file is then closed. -*/ - - - -int write_ifs_c_file( - const char *filename_in, /* File to write to */ - Ifs_Table_t *ifs_table) /* Table of Interface Specification data */ -{ - FILE *fp = (FILE *) NULL; /* File pointer */ - char *filename = (char *) NULL; - int xrc = 0; - - - /* Open the ifspec.c file for write access */ - if ((filename = gen_filename(filename_in, "w")) == (char *) NULL) { - print_error("ERROR - Unable to build path to \"%s\".", filename_in); - xrc = -1; - goto EXITPOINT; - } - fp = fopen(filename, "w"); - if(fp == NULL) { - print_error("ERROR - Problems opening \"%s\" for write", filename); - xrc = -1; - goto EXITPOINT; - } - - /* Write out a comment section at the top of the file */ - if (write_comment(fp, ifs_table) != 0) { - print_error("ERROR - Problems writing comment to \"%s\"", filename); - xrc = -1; - goto EXITPOINT; - } - - /* Put in the # includes */ - if (write_includes(fp) != 0) { - print_error("ERROR - Problems writing includes to \"%s\"", filename); - xrc = -1; - goto EXITPOINT; - } - - /* Write the SPICE3 required XXXmPTable structure */ - if (write_mPTable(fp, ifs_table) != 0) { - print_error("ERROR - Problems writing mPTable to \"%s\"", filename); - xrc = -1; - goto EXITPOINT; - } - - /* Write the SPICE3 required XXXpTable structure */ - if (write_pTable(fp, ifs_table) != 0) { - print_error("ERROR - Problems writing pTable to \"%s\"", filename); - xrc = -1; - goto EXITPOINT; - } - - /* Write out the connector table required for the code model element parser */ - if (write_conn_info(fp, ifs_table) != 0) { - print_error("ERROR - Problems writing includes to \"%s\"", filename); - xrc = -1; - goto EXITPOINT; - } - - /* Write out the parameter table required for the code model element parser */ - if (write_param_info(fp, ifs_table) != 0) { - print_error("ERROR - Problems writing params to \"%s\"", filename); - xrc = -1; - goto EXITPOINT; - } - - /* Write out the instance variable table required for the code model element parser */ - if (write_inst_var_info(fp, ifs_table) != 0) { - print_error("ERROR - Problems writing instaice variables to \"%s\"", - filename); - xrc = -1; - goto EXITPOINT; - } - - /* Write out the externally visible structure for this model */ - if (write_SPICEdev(fp, ifs_table) != 0) { - print_error("ERROR - Problems writing model structureto \"%s\"", - filename); - xrc = -1; - goto EXITPOINT; - } - - -EXITPOINT: - /* Close the ifspec.c file, free allocation, and return */ - if (fp != (FILE *) NULL) { - if (fclose(fp) != 0) { - print_error("ERROR - Problems closing \"%s\": %s.", - filename, strerror(errno)); - xrc = -1; - } - } - - if (filename != (char *) NULL) { - free(filename); - } - - return xrc; -} /* end of function write_ifs_c_file */ - - - -/* *********************************************************************** */ - - -/* -write_comment - -Function write_comment places a comment at the top of the -ifspec.c file warning the user that this file is automatically -generated and should not be edited. -*/ - - -static int write_comment( - FILE *fp, /* File to write to */ - Ifs_Table_t *ifs_table) /* Table of Interface Specification data */ -{ - const int rc = fprintf(fp, - "\n" - "/*\n" - " * Structures for model: %s\n" - " *\n" - " * Automatically generated by cmpp preprocessor\n" - " *\n" - " * !!! DO NOT EDIT !!!\n" - " *\n" - " */\n" - "\n", - ifs_table->name.model_name); - if (rc < 0) { - print_error("Comment writing failed."); - return -1; - } - return 0; -} /* end of function write_comment */ - - - -/* *********************************************************************** */ - -/* -write_includes - -Function write_includes writes the C header files required in -ifspec.c. -*/ - - -static int write_includes( - FILE *fp) /* File to write to */ -{ - const int rc = fprintf(fp, - "\n" - "#include \"ngspice/ngspice.h\"\n" -/* "#include \"ngspice/prefix.h\"\n"*/ - "#include \n" - "#include \"ngspice/devdefs.h\"\n" - "#include \"ngspice/ifsim.h\"\n" - "#include \"ngspice/mifdefs.h\"\n" - "#include \"ngspice/mifproto.h\"\n" - "#include \"ngspice/mifparse.h\"\n" -/* "#include \"ngspice/suffix.h\"\n"*/ - "\n"); - if (rc < 0) { - print_error("Include writing failed."); - return -1; - } - return 0; -} /* end of function write_includes */ - - - -/* *********************************************************************** */ - - - -/* -write_pTable - -Function write_pTable writes the instance parameter information -using SPICE's IFparm structure type. This table defines the -parameters as output only variables using SPICE's ``OP'' macro. -These instance parameters are derived from the Interface -Specification file's STATIC_VAR table and define the parameters -that can be queried using the SPICE 3C1 .save feature. -*/ - - -static int write_pTable( - FILE *fp, /* File to write to */ - Ifs_Table_t *ifs_table) /* Table of Interface Specification data */ -{ - int xrc = 0; - int i; - bool is_array; - Data_Type_t type; - - - /* Only write the pTable if there is something to put in it. */ - /* Otherwise, we will put NULL in the SPICEdev structure in its slot */ - if (ifs_table->num_inst_var == 0) { - return 0; - } - - int rc = 0; - - /* Write the structure beginning */ - rc |= fprintf(fp, - "\n" - "static IFparm MIFpTable[] = {\n"); - - - /* Write out an entry for each instance variable in the table */ - - /* Use the index of the element in the instance variable info array */ - /* ADDED TO the number of parameters as the SPICE3 integer tag. */ - - for (i = 0; i < ifs_table->num_inst_var; i++) { - - /* Use the SPICE3 OP macro since instance vars are output-only */ - - rc |= fprintf(fp, " OP("); - - /* Put in the name of the parameter and the integer tag */ - - rc |= fprintf(fp, "\"%s\", ", ifs_table->inst_var[i].name); - rc |= fprintf(fp, "%d, ", i + ifs_table->num_param); - - /* Format SPICE3 type according to parameter type field */ - - type = ifs_table->inst_var[i].type; - is_array = ifs_table->inst_var[i].is_array; - - if(is_array == true) { - rc |= fprintf(fp, "("); - } - - if(type == CMPP_BOOLEAN) { - rc |= fprintf(fp, "IF_FLAG"); /* no BOOLEAN in SPICE3 */ - } - else if(type == CMPP_INTEGER) { - rc |= fprintf(fp, "IF_INTEGER"); - } - else if(type == CMPP_REAL) { - rc |= fprintf(fp, "IF_REAL"); - } - else if(type == CMPP_COMPLEX) { - rc |= fprintf(fp, "IF_COMPLEX"); - } - else if(type == CMPP_STRING) { - rc |= fprintf(fp, "IF_STRING"); - } - else if(type == CMPP_POINTER) { - rc |= fprintf(fp, "IF_STRING"); - } - else { - print_error("INTERNAL ERROR - write_pTable() - Impossible data type."); - xrc = -1; - rc |= fprintf(fp, "INVALID DATA TYPE"); - } - - if(is_array == true) { - rc |= fprintf(fp, "|IF_VECTOR)"); - } - - - /* Put in the description string and finish this line off */ - rc |= fprintf(fp, ", \"%s\"),\n", ifs_table->inst_var[i].description); - } /* end of loop over instance variables */ - - /* Finish off the structure */ - rc |= fprintf(fp, "};\n\n"); - - /* Check outputs */ - if (rc < 0) { - print_error("pTable writing failed."); - xrc = -1; - } - - return xrc; -} /* end of function write_pTable */ - - - -/* *********************************************************************** */ - - -/* -write_mPTable - -Function write_mPTable writes the model parameter information -using SPICE's IFparm structure type. This table defines the -parameters to be input/output variables using SPICE's ``IOP'' macro -so that these variables can be set or queried from SPICE. These -model parameters are derived from the Interface Specification's -PARAMETER table. -*/ - -static int write_mPTable( - FILE *fp, /* File to write to */ - Ifs_Table_t *ifs_table) /* Table of Interface Specification data */ -{ - int xrc = 0; - int i; - - - /* Only write the mPTable if there is something to put in it. */ - /* Otherwise, we will put NULL in the SPICEdev structure in its slot */ - - if (ifs_table->num_param == 0) { - return 0; - } - - int rc = 0; - - /* Write the structure beginning */ - rc |= fprintf(fp, - "\n" - "static IFparm MIFmPTable[] = {\n"); - - - /* Write out an entry for each parameter in the table */ - - /* Use the index of the element in the parameter info array */ - /* as the SPICE3 integer tag. */ - Param_Info_t *param = ifs_table->param; - for(i = 0; i < ifs_table->num_param; i++) { - Param_Info_t *param_cur = param + i; - - /* Use the SPICE3 IOP macro since model parameters are input/output */ - - rc |= fprintf(fp, " IOP("); - - /* Put in the name of the parameter and the integer tag */ - rc |= fprintf(fp, "\"%s\", ", param_cur->name); - rc |= fprintf(fp, "%d, ", i); - - /* Format SPICE3 type according to parameter type field */ - - const bool is_array = param_cur->is_array; - const Data_Type_t type = param_cur->type; - - if (is_array) { - rc |= fprintf(fp, "("); - } - - if (type == CMPP_BOOLEAN) { - rc |= fprintf(fp, "IF_FLAG"); /* no BOOLEAN in SPICE3 */ - } - else if (type == CMPP_INTEGER) { - rc |= fprintf(fp, "IF_INTEGER"); - } - else if (type == CMPP_REAL) { - rc |= fprintf(fp, "IF_REAL"); - } - else if (type == CMPP_COMPLEX) { - rc |= fprintf(fp, "IF_COMPLEX"); - } - else if (type == CMPP_STRING) { - rc |= fprintf(fp, "IF_STRING"); - } - else { - print_error("INTERNAL ERROR - write_mPTable() - Impossible data type."); - xrc = -1; - } - - if (is_array) { - rc |= fprintf(fp, "|IF_VECTOR)"); - } - - - /* Put in the description string and finish this line off */ - rc |= fprintf(fp, ", \"%s\"),\n", ifs_table->param[i].description); - } /* end of loop over parameters */ - - /* Finish off the structure */ - rc |= fprintf(fp, "};\n\n"); - - /* Check outputs */ - if (rc < 0) { - print_error("mPTable writing failed."); - xrc = -1; - } - - return xrc; -} /* end of function write_mPTable */ - - - -/* *********************************************************************** */ - - -/* -write_conn_info - -Function write_conn_info writes information used by the -Simulator's new MIF package to interpret and error check a -model's connection list in a SPICE deck. This information is -derived from the Interface Specification file's PORT table. -*/ - - - -static int write_conn_info( - FILE *fp, /* File to write to */ - Ifs_Table_t *ifs_table) /* Table of Interface Specification data */ -{ - int xrc = 0; - int i; - int j; - const char *str; - int rc = 0; - - /* Only write the connTable if there is something to put in it. */ - /* Otherwise, we will put NULL in the SPICEdev structure in its slot */ - - if (ifs_table->num_conn == 0) { /* An unlikely condition for sure ... */ - return 0; - } - - /* First, we must define arrays of port types */ - - /* Note that there should be always at least one allowed port type */ - /* so we don't have to worry about arrays with no elements */ - - const Conn_Info_t * const conn = ifs_table->conn; - const int num_conn = ifs_table->num_conn; - for (i = 0; i < num_conn; i++) { - const Conn_Info_t * const p_conn_cur = conn + i; - rc |= fprintf(fp, - "\n" - "static Mif_Port_Type_t MIFportEnum%d[] = {\n", i); - - if (p_conn_cur->num_allowed_types < 1) { - print_error("ERROR - write_conn_info() - " - "Number of allowed types cannot be zero"); - xrc = -1; - } - - const int num_allowed_types = p_conn_cur->num_allowed_types; - for (j = 0; j < num_allowed_types; j++) { - rc |= fprintf(fp, " %s,\n", - port_type_to_str(p_conn_cur->allowed_port_type[j])); - } /* for number of allowed types */ - - rc |= fprintf(fp, - "};\n" - "\n" - "\n" - "static char *MIFportStr%d[] = {\n", i); - - for (j = 0; j < num_allowed_types; j++) { - if (p_conn_cur->allowed_port_type[j] == USER_DEFINED) { - rc |= fprintf(fp, " \"%s\",\n", - p_conn_cur->allowed_type[j]); - } - else { - str = gen_port_type_str(p_conn_cur->allowed_port_type[j]); - rc |= fprintf(fp, " \"%s\",\n", str); - } - } /* for number of allowed types */ - - rc |= fprintf(fp, - "};\n" - "\n"); - } /* for number of connections */ - - - - /* Now write the structure */ - rc |= fprintf(fp, - "\n" - "static Mif_Conn_Info_t MIFconnTable[] = {\n"); - - - /* Write out an entry for each parameter in the table */ - - for (i = 0; i < num_conn; i++) { - const Conn_Info_t * const p_conn_cur = conn + i; - - rc |= fprintf(fp, " {\n"); - rc |= fprintf(fp, " \"%s\",\n", p_conn_cur->name); - rc |= fprintf(fp, " \"%s\",\n", p_conn_cur->description); - - str = dir_to_str(p_conn_cur->direction); - rc |= fprintf(fp, " %s,\n", str); - - rc |= fprintf(fp, " %s,\n", - port_type_to_str(p_conn_cur->default_port_type)); - - rc |= fprintf(fp, " \"%s\",\n", - (p_conn_cur->default_port_type == USER_DEFINED) - ? p_conn_cur->default_type - : gen_port_type_str(p_conn_cur->default_port_type)); - - rc |= fprintf(fp," %d,\n", p_conn_cur->num_allowed_types); - rc |= fprintf(fp, " MIFportEnum%d,\n", i); - rc |= fprintf(fp, " MIFportStr%d,\n", i); - - - str = boolean_to_str(p_conn_cur->is_array); - rc |= fprintf(fp, " %s,\n", str); - - if (p_conn_cur->is_array == false) { - - str = boolean_to_str(false); /* has_lower_bound */ - rc |= fprintf(fp, " %s,\n", str); - - str = integer_to_str(0); /* lower_bound */ - rc |= fprintf(fp, " %s,\n", str); - - str = boolean_to_str(false); /* has_upper_bound */ - rc |= fprintf(fp, " %s,\n", str); - - str = integer_to_str(0); /* upper_bound */ - rc |= fprintf(fp, " %s,\n", str); - } - else { /* is_array == true */ - - str = boolean_to_str(p_conn_cur->has_lower_bound); - rc |= fprintf(fp, " %s,\n", str); - - if (p_conn_cur->has_lower_bound == true) - str = integer_to_str(p_conn_cur->lower_bound); - else - str = integer_to_str(0); - rc |= fprintf(fp, " %s,\n", str); - - str = boolean_to_str(p_conn_cur->has_upper_bound); - rc |= fprintf(fp, " %s,\n", str); - - if (p_conn_cur->has_upper_bound == true) - str = integer_to_str(p_conn_cur->upper_bound); - else - str = integer_to_str(0); - rc |= fprintf(fp, " %s,\n", str); - - } /* if is_array */ - - str = boolean_to_str(p_conn_cur->null_allowed); - rc |= fprintf(fp, " %s,\n", str); - - rc |= fprintf(fp, " },\n"); - - } /* for number of parameters */ - - - /* Finish off the structure */ - rc |= fprintf(fp, - "};\n" - "\n"); - - /* Check outputs */ - if (rc < 0) { - print_error("Writing of connection information failed."); - xrc = -1; - } - - return xrc; -} /* end of function write_conn_info */ - - - -/* *********************************************************************** */ - - -/* -write_param_info - -Function write_param_info writes information used by the -Simulator's new MIF package to interpret and error check a -model's parameter list in an XSPICE deck. This information is -derived from the Interface Specification file's PARAMETER table. -It is essentially a superset of the IFparm information written by -write_mPTable(). The IFparm information written by -write_mPTable() is required to work with SPICE's device set and -query functions. The information written by write_param_info is -more extensive and is required to parse and error check the XSPICE -input deck. -*/ - - - -static int write_param_info( - FILE *fp, /* File to write to */ - Ifs_Table_t *ifs_table) /* Table of Interface Specification data */ -{ - int xrc = 0; - int i; - const char *str; - - - /* Only write the paramTable if there is something to put in it. */ - /* Otherwise, we will put NULL in the SPICEdev structure in its slot */ - - if (ifs_table->num_param == 0) { - return 0; - } - - - /* Write the structure beginning */ - int rc = 0; - rc |= fprintf(fp, - "\n" - "static Mif_Param_Info_t MIFparamTable[] = {\n"); - - - /* Write out an entry for each parameter in the table */ - const Param_Info_t * const param = ifs_table->param; - const int num_param = ifs_table->num_param; - for (i = 0; i < num_param; i++) { - const Param_Info_t * const p_param_cur = param + i; - - rc |= fprintf(fp, " {\n"); - rc |= fprintf(fp, " \"%s\",\n", p_param_cur->name); - rc |= fprintf(fp, " \"%s\",\n", p_param_cur->description); - - rc |= fprintf(fp, " %s,\n", - data_type_to_str(p_param_cur->type)); - - str = boolean_to_str(p_param_cur->has_default); - rc |= fprintf(fp, " %s,\n", str); - - if (p_param_cur->has_default == true) - str = value_to_str(p_param_cur->type, p_param_cur->default_value); - else - str = no_value_to_str(); - rc |= fprintf(fp, " %s,\n", str); - - str = boolean_to_str(p_param_cur->has_lower_limit); - rc |= fprintf(fp, " %s,\n", str); - - if (p_param_cur->has_lower_limit == true) - str = value_to_str(p_param_cur->type, p_param_cur->lower_limit); - else - str = no_value_to_str(); - rc |= fprintf(fp, " %s,\n", str); - - str = boolean_to_str(p_param_cur->has_upper_limit); - rc |= fprintf(fp, " %s,\n", str); - - if (p_param_cur->has_upper_limit == true) - str = value_to_str(p_param_cur->type, p_param_cur->upper_limit); - else - str = no_value_to_str(); - rc |= fprintf(fp, " %s,\n", str); - - str = boolean_to_str(p_param_cur->is_array); - rc |= fprintf(fp, " %s,\n", str); - - if (!p_param_cur->is_array) { - - str = boolean_to_str(false); /* has_conn_ref */ - rc |= fprintf(fp, " %s,\n", str); - - str = integer_to_str(0); /* conn_ref */ - rc |= fprintf(fp, " %s,\n", str); - - str = boolean_to_str(false); /* has_lower_bound */ - rc |= fprintf(fp, " %s,\n", str); - - str = integer_to_str(0); /* lower_bound */ - rc |= fprintf(fp, " %s,\n", str); - - str = boolean_to_str(false); /* has_upper_bound */ - rc |= fprintf(fp, " %s,\n", str); - - str = integer_to_str(0); /* upper_bound */ - rc |= fprintf(fp, " %s,\n", str); - } - else { /* is_array == true */ - - str = boolean_to_str(p_param_cur->has_conn_ref); - rc |= fprintf(fp, " %s,\n", str); - - if (p_param_cur->has_conn_ref) { - - str = integer_to_str(p_param_cur->conn_ref); - rc |= fprintf(fp, " %s,\n", str); - - str = boolean_to_str(false); /* has_lower_bound */ - rc |= fprintf(fp, " %s,\n", str); - - str = integer_to_str(0); /* lower_bound */ - rc |= fprintf(fp, " %s,\n", str); - - str = boolean_to_str(false); /* has_upper_bound */ - rc |= fprintf(fp, " %s,\n", str); - - str = integer_to_str(0); /* upper_bound */ - rc |= fprintf(fp, " %s,\n", str); - } - else { /* has_conn_ref == false */ - - str = integer_to_str(0); /* conn_ref */ - rc |= fprintf(fp, " %s,\n", str); - - str = boolean_to_str(p_param_cur->has_lower_bound); - rc |= fprintf(fp, " %s,\n", str); - - if (p_param_cur->has_lower_bound) - str = integer_to_str(p_param_cur->lower_bound); - else - str = integer_to_str(0); - rc |= fprintf(fp, " %s,\n", str); - - str = boolean_to_str(p_param_cur->has_upper_bound); - rc |= fprintf(fp, " %s,\n", str); - - if (p_param_cur->has_upper_bound) - str = integer_to_str(p_param_cur->upper_bound); - else - str = integer_to_str(0); - rc |= fprintf(fp, " %s,\n", str); - - } /* if has_conn_ref */ - - } /* if is_array */ - - str = boolean_to_str(p_param_cur->null_allowed); - rc |= fprintf(fp, " %s,\n", str); - - rc |= fprintf(fp, " },\n"); - - } /* for number of parameters */ - - - /* Finish off the structure */ - - rc |= fprintf(fp, "};\n\n"); - - /* Check outputs */ - if (rc < 0) { - print_error("Writing of param information failed."); - xrc = -1; - } - - return xrc; -} /* end of function write_param_info */ - - - -/* *********************************************************************** */ - - -/* -write_inst_var_info - -Function write_inst_var_info writes information used by the -Simulator's new MIF package to allocate space for and to output -(using SPICE's .save feature) variables defined in the Interface -Specification file's STATIC_VAR table. It is essentially a -superset of the IFparm information written by write_mPTable(). -The IFparm information written by write_pTable() is required to -work with SPICE's device query functions. The information -written by write_inst_var_info is more extensive. -*/ - - - -static int write_inst_var_info( - FILE *fp, /* File to write to */ - Ifs_Table_t *ifs_table) /* Table of Interface Specification data */ -{ - int xrc = 0; - int i; - const char *str; - - /* Only write the inst_varTable if there is something to put in it. */ - /* Otherwise, we will put NULL in the SPICEdev structure in its slot */ - - if (ifs_table->num_inst_var == 0) - return 0; - - - /* Write the structure beginning */ - int rc = 0; - rc |= fprintf(fp, - "\n" - "static Mif_Inst_Var_Info_t MIFinst_varTable[] = {\n"); - - - /* Write out an entry for each parameter in the table */ - - for(i = 0; i < ifs_table->num_inst_var; i++) { - - rc |= fprintf(fp, " {\n"); - rc |= fprintf(fp, " \"%s\",\n",ifs_table->inst_var[i].name); - rc |= fprintf(fp, " \"%s\",\n",ifs_table->inst_var[i].description); - - rc |= fprintf(fp, " %s,\n", - data_type_to_str(ifs_table->inst_var[i].type)); - - str = boolean_to_str(ifs_table->inst_var[i].is_array); - rc |= fprintf(fp, " %s,\n", str); - - rc |= fprintf(fp, " },\n"); - - } /* for number of parameters */ - - - /* Finish off the structure */ - - rc |= fprintf(fp, "};\n\n"); - - /* Check outputs */ - if (rc < 0) { - print_error("Writing of instance variable information failed."); - xrc = -1; - } - - return xrc; -} /* end of function write_inst_var_info */ - - - -/* *********************************************************************** */ - - -/* -write_SPICEdev - -Function write_SPICEdev writes the global XXX_info structure used -by SPICE to define a model. Here ``XXX'' is the name of the code -model. This structure contains the name of the -model, a pointer to the C function that implements the model, and -pointers to all of the above data structures. -*/ - - - -static int write_SPICEdev( - FILE *fp, /* File to write to */ - Ifs_Table_t *ifs_table) /* Table of Interface Specification data */ -{ - int rc = 0; /* init print rc to nonnegative (no error) */ - int xrc = 0; - - /* Extern the code model function name */ - rc |= fprintf(fp, - "\n" - "extern void %s(Mif_Private_t *);\n", - ifs_table->name.c_fcn_name); - - /* SPICE now needs these static integers */ - rc |= fprintf(fp, - "\n" - "static int val_terms = 0;\n" - "static int val_numNames = 0;\n" - "static int val_numInstanceParms = %d;\n" - "static int val_numModelParms = %d;\n" - "static int val_sizeofMIFinstance = sizeof(MIFinstance);\n" - "static int val_sizeofMIFmodel = sizeof(MIFmodel);\n", - ifs_table->num_inst_var, ifs_table->num_param); - - /* Write out the structure beginning */ - - /* Use the c function external identifier appended with _info as the */ - /* external identifier for the structure. */ - - rc |= fprintf(fp, - "\n" - "SPICEdev %s_info = {\n", ifs_table->name.c_fcn_name); - - /* Write the IFdevice structure */ - - rc |= fprintf(fp, " .DEVpublic = {\n"); - rc |= fprintf(fp, " .name = \"%s\",\n", ifs_table->name.model_name); - rc |= fprintf(fp, " .description = \"%s\",\n", ifs_table->name.description); - rc |= fprintf(fp, - " .terms = &val_terms,\n" - " .numNames = &val_numNames,\n" - " .termNames = NULL,\n" - " .numInstanceParms = &val_numInstanceParms,\n"); - - if(ifs_table->num_inst_var > 0) - rc |= fprintf(fp, " .instanceParms = MIFpTable,\n"); - else - rc |= fprintf(fp, " .instanceParms = NULL,\n"); - - rc |= fprintf(fp, " .numModelParms = &val_numModelParms,\n"); - if(ifs_table->num_param > 0) - rc |= fprintf(fp, " .modelParms = MIFmPTable,\n"); - else - rc |= fprintf(fp, " .modelParms = NULL,\n"); - rc |= fprintf(fp, " .flags = 0,\n\n"); - - rc |= fprintf(fp, " .cm_func = %s,\n", ifs_table->name.c_fcn_name); - - rc |= fprintf(fp, " .num_conn = %d,\n", ifs_table->num_conn); - if(ifs_table->num_conn > 0) - rc |= fprintf(fp, " .conn = MIFconnTable,\n"); - else - rc |= fprintf(fp, " .conn = NULL,\n"); - - rc |= fprintf(fp, " .num_param = %d,\n", ifs_table->num_param); - if(ifs_table->num_param > 0) - rc |= fprintf(fp, " .param = MIFparamTable,\n"); - else - rc |= fprintf(fp, " .param = NULL,\n"); - - rc |= fprintf(fp, " .num_inst_var = %d,\n", ifs_table->num_inst_var); - if(ifs_table->num_inst_var > 0) - rc |= fprintf(fp, " .inst_var = MIFinst_varTable,\n"); - else - rc |= fprintf(fp, " .inst_var = NULL,\n"); - - rc |= fprintf(fp, " },\n\n"); - - /* Write the names of the generic code model functions */ - - rc |= fprintf(fp, - " .DEVparam = NULL,\n" - " .DEVmodParam = MIFmParam,\n" - " .DEVload = MIFload,\n" - " .DEVsetup = MIFsetup,\n" - " .DEVunsetup = MIFunsetup,\n" - " .DEVpzSetup = NULL,\n" - " .DEVtemperature = NULL,\n" - " .DEVtrunc = MIFtrunc,\n" - " .DEVfindBranch = NULL,\n" - " .DEVacLoad = MIFload,\n" - " .DEVaccept = NULL,\n" - " .DEVdestroy = NULL,\n" - " .DEVmodDelete = MIFmDelete,\n" - " .DEVdelete = MIFdelete,\n" - " .DEVsetic = NULL,\n" - " .DEVask = MIFask,\n" - " .DEVmodAsk = MIFmAsk,\n" - " .DEVpzLoad = NULL,\n" - " .DEVconvTest = MIFconvTest,\n" - " .DEVsenSetup = NULL,\n" - " .DEVsenLoad = NULL,\n" - " .DEVsenUpdate = NULL,\n" - " .DEVsenAcLoad = NULL,\n" - " .DEVsenPrint = NULL,\n" - " .DEVsenTrunc = NULL,\n" - " .DEVdisto = NULL,\n" - " .DEVnoise = NULL,\n" - " .DEVsoaCheck = NULL,\n" - " .DEVinstSize = &val_sizeofMIFinstance,\n" - " .DEVmodSize = &val_sizeofMIFmodel,\n" - "\n" - "#ifdef CIDER\n" - " .DEVdump = NULL,\n" - " .DEVacct = NULL,\n" - "#endif\n" - "};\n\n" - ); - - /* Check outputs */ - if (rc < 0) { - print_error("Writing of SPICE device information failed."); - xrc = -1; - } - - return xrc; -} /* end of function write_SPICEdev */ - - - -/* *********************************************************************** */ - - -/* -The following functions are utility routines used to convert internal -enums and data to ASCII form for placing into the .c file -being created. -*/ - - -#define BASE_STR_LEN 80 - - -static const char *data_type_to_str(Data_Type_t type) -{ - switch (type) { - case CMPP_BOOLEAN: - return "MIF_BOOLEAN"; - case CMPP_INTEGER: - return "MIF_INTEGER"; - case CMPP_REAL: - return "MIF_REAL"; - case CMPP_COMPLEX: - return "MIF_COMPLEX"; - case CMPP_STRING: - case CMPP_POINTER: - return "MIF_STRING"; - default: - print_error("INTERNAL ERROR - data_type_to_str() - Impossible data type."); - return "INVALID DATA TYPE"; - } -} - - -/* *********************************************************************** */ - -static const char *port_type_to_str(Port_Type_t port) -{ - switch (port) { - case VOLTAGE: - return "MIF_VOLTAGE"; - case DIFF_VOLTAGE: - return "MIF_DIFF_VOLTAGE"; - case CURRENT: - return "MIF_CURRENT"; - case DIFF_CURRENT: - return "MIF_DIFF_CURRENT"; - case VSOURCE_CURRENT: - return "MIF_VSOURCE_CURRENT"; - case CONDUCTANCE: - return "MIF_CONDUCTANCE"; - case DIFF_CONDUCTANCE: - return "MIF_DIFF_CONDUCTANCE"; - case RESISTANCE: - return "MIF_RESISTANCE"; - case DIFF_RESISTANCE: - return "MIF_DIFF_RESISTANCE"; - case DIGITAL: - return "MIF_DIGITAL"; - case USER_DEFINED: - return "MIF_USER_DEFINED"; - default: - print_error("INTERNAL ERROR - port_type_to_str() - Impossible port type."); - return "INVALID PORT TYPE"; - } -} - -/* *********************************************************************** */ - -static const char *gen_port_type_str(Port_Type_t port) -{ - switch (port) { - case VOLTAGE: - return "v"; - case DIFF_VOLTAGE: - return "vd"; - case CURRENT: - return "i"; - case DIFF_CURRENT: - return "id"; - case VSOURCE_CURRENT: - return "vnam"; - case CONDUCTANCE: - return "g"; - case DIFF_CONDUCTANCE: - return "gd"; - case RESISTANCE: - return "h"; - case DIFF_RESISTANCE: - return "hd"; - case DIGITAL: - return "d"; - case USER_DEFINED: - return ""; - default: - print_error("INTERNAL ERROR - gen_port_type_str() - " - "Impossible port type."); - return "INVALID PORT TYPE"; - } -} /* end of function gen_port_type_str */ - - - -/* *********************************************************************** */ - -static const char *dir_to_str(Dir_t dir) -{ - switch(dir) { - case CMPP_IN: - return "MIF_IN"; - case CMPP_OUT: - return "MIF_OUT"; - case CMPP_INOUT: - return "MIF_INOUT"; - default: - print_error("INTERNAL ERROR - dir_to_str() - Impossible direction type."); - return "MIF_DIRECTION_INVALID"; - } -} - - - -/* *********************************************************************** */ - -static char *value_to_str(Data_Type_t type, Value_t value) -{ - static char *str = NULL; - static int max_len = 0; - - const char *bool_str; - int str_len; - - - if(str == NULL) { - if ((str = (char *) malloc(2 * BASE_STR_LEN + 1)) == (char *) NULL) { - (void) fprintf(stderr, "Unable to allocate string buffer.\n"); - return (char *) NULL; - } - max_len = 2 * BASE_STR_LEN; - } - - switch(type) { - - case CMPP_BOOLEAN: - bool_str = boolean_to_str(value.bvalue); - sprintf(str, "{%s, 0, 0.0, {0.0, 0.0}, NULL}", bool_str); - break; - - case CMPP_INTEGER: - sprintf(str, "{MIF_FALSE, %d, 0.0, {0.0, 0.0}, NULL}", value.ivalue); - break; - - case CMPP_REAL: - sprintf(str, "{MIF_FALSE, 0, %e, {0.0, 0.0}, NULL}", value.rvalue); - break; - - case CMPP_COMPLEX: - sprintf(str, "{MIF_FALSE, 0, 0.0, {%e, %e}, NULL}", - value.cvalue.real, value.cvalue.imag); - break; - - case CMPP_STRING: - /* be careful, the string could conceivably be very long... */ - str_len = (int) strlen(value.svalue); - if ((str_len + BASE_STR_LEN) > max_len) { - int n_byte_alloc = max_len + str_len + 1; - void * const p = realloc(str, n_byte_alloc); - if (p == NULL) { - (void) fprintf(stderr, - "Unable to resize string buffer to size %d.\n", - n_byte_alloc); - free(str); - return (char *) NULL; - } - str = (char *) p; - max_len += str_len; - } /* end of resize */ - - sprintf(str, "{MIF_FALSE, 0, 0.0, {0.0, 0.0}, \"%s\"}", value.svalue); - break; - - default: - print_error("INTERNAL ERROR - value_to_str() - Impossible data type."); - - } /* end of switch */ - - return str; -} /* end of function value_to_string */ - - - -/* *********************************************************************** */ - -static const char *boolean_to_str(bool value) -{ - return value ? "MIF_TRUE" : "MIF_FALSE"; -} - - -/* *********************************************************************** */ - -static char *integer_to_str(int value) -{ - static char str[3 * sizeof(int) + 1]; - sprintf(str, "%d", value); - return str; -} - - -/* *********************************************************************** */ - -static const char *no_value_to_str(void) -{ - return "{MIF_FALSE, 0, 0.0, {0.0, 0.0}, NULL}"; -} - - - diff --git a/src/xspice/enh/Makefile.am b/src/xspice/enh/Makefile.am deleted file mode 100644 index 3660b69eb..000000000 --- a/src/xspice/enh/Makefile.am +++ /dev/null @@ -1,14 +0,0 @@ -## Process this file with automake to produce Makefile.in -# -# JW 3/9/01 - had a go and makeing an autoconf script. - -noinst_LTLIBRARIES = libenhxsp.la - -libenhxsp_la_SOURCES = \ - enh.c \ - enhtrans.c - -AM_CPPFLAGS = @AM_CPPFLAGS@ -I$(top_srcdir)/src/include -AM_CFLAGS = $(STATIC) - -MAINTAINERCLEANFILES = Makefile.in diff --git a/src/xspice/enh/enh.c b/src/xspice/enh/enh.c deleted file mode 100644 index 1c745b244..000000000 --- a/src/xspice/enh/enh.c +++ /dev/null @@ -1,98 +0,0 @@ -/*============================================================================ -FILE ENH.c - -MEMBER OF process XSPICE - -Public Domain - -Georgia Tech Research Corporation -Atlanta, Georgia 30332 -PROJECT A-8503 - -AUTHORS - - 9/12/91 Bill Kuhn - -MODIFICATIONS - - - -SUMMARY - - This file contains routines used for general enhancements made - to the Berkeley SPICE3 core. - -INTERFACES - - ENHreport_conv_prob() - -REFERENCED FILES - - None. - -NON-STANDARD FEATURES - - None. - -============================================================================*/ - -/*=== INCLUDE FILES ===*/ - - -#include -#include "ngspice/enh.h" - -/* -ENHreport_conv_prob() - -Report convergence problem messages from nodes, branch currents, -or instances. This function is setup to allow providing the SI -with information identifying the type of convergence problem. -For now, it simply writes to stdout. -*/ - - -void ENHreport_conv_prob( - Enh_Conv_Source_t type, /* node, branch, or instance */ - char *name, /* the name of the node/branch/instance */ - char *msg) /* an optional message */ -{ - - char *type_str; - char *msg_str; - - /* Convert the type enum to a string for printing */ - switch(type) { - - case ENH_ANALOG_NODE: - case ENH_EVENT_NODE: - type_str = "node"; - break; - - case ENH_ANALOG_BRANCH: - type_str = "branch current"; - break; - - case ENH_ANALOG_INSTANCE: - case ENH_EVENT_INSTANCE: - case ENH_HYBRID_INSTANCE: - type_str = "instance"; - break; - - default: - printf("\nERROR: Internal error in ENHreport_conv_prob - impossible type\n"); - return; - } - - /* Check for msg == NULL and turn into null string */ - if(msg) - msg_str = msg; - else - msg_str = ""; - - /* Print the convergence problem report */ - printf("\nWARNING: Convergence problems at %s (%s). %s\n", - type_str, name, msg_str); - -} /* ENHreport_conv_prob */ - diff --git a/src/xspice/enh/enhtrans.c b/src/xspice/enh/enhtrans.c deleted file mode 100644 index 5e2bf8339..000000000 --- a/src/xspice/enh/enhtrans.c +++ /dev/null @@ -1,551 +0,0 @@ -/* =========================================================================== -FILE ENHtranslate_poly.c - -MEMBER OF process XSPICE - -Public Domain - -Georgia Tech Research Corporation -Atlanta, Georgia 30332 -PROJECT A-8503 - -AUTHORS - - 9/12/91 Bill Kuhn - -MODIFICATIONS - - 7/24/2012 Holger Vogt Update to error messages - -SUMMARY - - This file contains functions used by the simulator in - calling the internal "poly" code model to substitute for - SPICE 2G6 style poly sources found in the input deck. - -INTERFACES - - ENHtranslate_poly() - -REFERENCED FILES - - None. - -NON-STANDARD FEATURES - - None. - -=========================================================================== */ - -/*=== FUNCTION PROTOTYPES ===*/ - -/*=== INCLUDE FILES ===*/ - - -/* #include "prefix.h" */ - -#include "ngspice/ngspice.h" -//#include "misc.h" - -#include "ngspice/fteinp.h" -#include "ngspice/enh.h" -#include "ngspice/cpdefs.h" -#include "ngspice/ftedefs.h" -#include "ngspice/mifproto.h" - -/* #include "suffix.h" */ - - -/*=== FUNCTION PROTOTYPES ===*/ -static int needs_translating(char *card); -static int count_tokens(char *card); -static char *two2three_translate(char *orig_card, char **inst_card, - char **mod_card); -static int get_poly_dimension(char *card); - -/* -ENHtranslate_poly() - -Translate all 2G6 style polynomial controlled sources in the deck -to new polynomial controlled source code model syntax. -*/ - -/*---------------------------------------------------------------------*/ -/* ENHtranslate_poly takes (a pointer to) the SPICE deck as argument. */ -/* It loops through the deck, and translates all POLY statements */ -/* in dependent sources into a .model conformant with the needs of */ -/* XSPICE. It splices the new statements in the deck, and comments */ -/* out the old dependent source. */ -/* It returns (a pointer to) the processed deck. */ -/*---------------------------------------------------------------------*/ -struct card * -ENHtranslate_poly( - struct card *deck) { /* Linked list of lines in input deck */ - struct card *d; - struct card *l1; - struct card *l2; - - char *card; - - /* Iterate through each card in the deck and translate as needed */ - for(d = deck; d; d = d->nextcard) { - -#ifdef TRACE - /* SDB debug statement */ - printf("In ENHtranslate_poly, now examining card %s . . . \n", d->line); -#endif - - /* If doesn't need to be translated, continue to next card */ - if(! needs_translating(d->line)) { - -#ifdef TRACE - /* SDB debug statement */ - /* printf("Card doesn't need translating. Continuing . . . .\n"); */ -#endif - continue; - } - -#ifdef TRACE - /* SDB debug statement */ - printf("Found a card to translate . . . .\n"); -#endif - - /* Create two new line structs and splice into deck */ - l1 = TMALLOC(struct card, 1); - l2 = TMALLOC(struct card, 1); - l2->nextcard = d->nextcard; - l1->nextcard = l2; - d->nextcard = l1; - - /* PN 2004: Add original linenumber to ease the debug process - * for malfromned netlist - */ - - l1->linenum = d->linenum; - l2->linenum = d->linenum; - - /* Create the translated cards */ - d->error = two2three_translate(d->line, &(l1->line), &(l2->line)); - - /* Comment out the original line */ - card = TMALLOC(char, strlen(d->line) + 2); - strcpy(card,"*"); - strcat(card, d->line); - tfree(d->line); - d->line = card; - -#ifdef TRACE - /* SDB debug statement */ - printf("In ENHtranslate_poly, translated card = %s . . . \n", card); -#endif - - /* Advance deck pointer to last line added */ - d = l2; - } - - /* Return head of deck */ - return(deck); - -} /* ENHtranslate_poly */ - - -/*---------------------------------------------------------------------*/ -/* -needs_translating() - -Test to see if card needs translating. Return true if card defines -an e,f,g, or h controlled source, has too many tokens to be -a simple linear dependent source and contains the 'poly' token. -Otherwise return false. -*/ - - -static int needs_translating( - char *card) /* the card text to check */ -{ - -#ifdef TRACE - /* SDB debug statement */ - /* printf("In needs_translating, examining card %s . . . \n", card); */ -#endif - - switch(*card) { - - case 'e': - case 'E': - case 'g': - case 'G': - if(count_tokens(card) > 6) - return(1); - else - return(0); - - case 'f': - case 'F': - case 'h': - case 'H': - if(count_tokens(card) > 5) - return(1); - else - return(0); - - default: - return(0); - } - -} /* needs_translating */ - - - -/*---------------------------------------------------------------------*/ -/* -count_tokens() - -Count and return the number of tokens on the card. -*/ -static int count_tokens( - char *card) /* the card text on which to count tokens */ -{ - int i; - bool has_poly = FALSE; - - /* Get and count tokens until end of line reached and find the "poly" token */ - for(i = 0; *card != '\0'; i++) { - char *newtoken; - newtoken = MIFgettok(&card); - if ((i == 3) && ciprefix(newtoken, "poly")) - has_poly = TRUE; - txfree(newtoken); - } - /* no translation, if 'poly' not in the line */ - if (!has_poly) i=0; - return(i); - -} /* count_tokens */ - - - -/********************************************************************/ -/*==================================================================== - -two2three_translate() - -Do the syntax translation of the 2G6 source to the new code model -syntax. The translation proceeds according to the template below. - --------------------------------------------- -VCVS: -ename N+ N- POLY(dim) NC+ NC- P0 P1 P2 . . . -N+ N- = outputs -NC+ NC- = inputs - -aname %vd[NC+ NC-] %vd[N+ N-] pname -.model pname spice2poly(coef=P0 P1 P2 . . . ) -%vd[NC+ NC-] = inputs -%vd[N+ N-] = outputs --------------------------------------------- -CCCS -fname N+ N- POLY(dim) Vname P0 P1 P2 . . . -N+ N- = outputs -Vname = input voltage source (measures current) - -aname %vnam[Vname] %id[N+ N-] pname -.model pname spice2poly(coef=P0 P1 P2 . . . ) -%vnam[Vname] = input -%id[N+ N-] = output --------------------------------------------- -VCCS -gname N+ N- POLY(dim) NC+ NC- P0 P1 P2 , , , -N+ N- = outputs -NC+ NC- = inputs - -aname %vd[NC+ NC-] %id[N+ N-] pname -.model pname spice2poly(coef=P0 P1 P2 . . . ) -%vd[NC+ NC-] = inputs -%id[N+ N-] = outputs --------------------------------------------- -CCVS -hname N+ N- POLY(dim) Vname P0 P1 P2 . . . -N+ N- = outputs -Vname = input voltage source (measures current) - -aname %vnam[Vname] %vd[N+ N-] pname -.model pname spice2poly(coef=P0 P1 P2 . . . ) -%vnam[Vname] = input -%vd[N+ N-] = output - -====================================================================*/ -/********************************************************************/ - -static char *two2three_translate( - char *orig_card, /* the original untranslated card */ - char **inst_card, /* the instance card created by the translation */ - char **mod_card) /* the model card created by the translation */ -{ - int dim; - int num_tokens; - - int num_conns; - int num_coefs; - size_t inst_card_len; - size_t mod_card_len; - - int i; - - char type; - - char *name; - char **out_conn; - char **in_conn; - char **coef; - - char *card; - - -#ifdef TRACE - /* SDB debug statement */ - printf("In two2three_translate, card to translate = %s . . .\n", orig_card); -#endif - - /* Put the first character into local storage for checking type */ - type = *orig_card; - - /* Count the number of tokens for use in parsing */ - num_tokens = count_tokens(orig_card); - - /* Determine the dimension of the poly source */ - /* Note that get_poly_dimension returns 0 for "no poly", -1 for - invalid dimensiion, otherwise returns numeric value of POLY */ - dim = get_poly_dimension(orig_card); - if(dim == -1) { - char *errmsg; - printf("ERROR in two2three_translate -- Argument to poly() is not an integer\n"); - printf("ERROR while parsing: %s\n", orig_card); - errmsg = copy("ERROR in two2three_translate -- Argument to poly() is not an integer\n"); - *inst_card = copy(" * ERROR Argument to poly() is not an integer"); - *mod_card = copy(" * ERROR Argument to poly() is not an integer"); - return errmsg; - } - - /* Compute number of output connections based on type and dimension */ - switch(type) { - case 'E': - case 'e': - case 'G': - case 'g': - num_conns = 2 * dim; - break; - - default: - num_conns = dim; - } - - /* Compute number of coefficients. Return error if less than one. */ - if(dim == 0) - num_coefs = num_tokens - num_conns - 3; /* no POLY token */ - else - num_coefs = num_tokens - num_conns - 5; /* POLY token present */ - -#ifdef TRACE - /* SDB debug statement */ - printf("In two2three_translate, num_tokens=%d, num_conns=%d, num_coefs=%d . . .\n", num_tokens, num_conns, num_coefs); -#endif - - if(num_coefs < 1) { - char *errmsg; - printf("ERROR - Number of connections differs from poly dimension\n"); - printf("ERROR while parsing: %s\n", orig_card); - errmsg = copy("ERROR in two2three_translate -- Argument to poly() is not an integer\n"); - *inst_card = copy("* ERROR - Number of connections differs from poly dimension\n"); - *mod_card = copy(" * ERROR - Number of connections differs from poly dimension\n"); - return(errmsg); - } - /* Split card into name, output connections, input connections, */ - /* and coefficients */ - - card = orig_card; - name = MIFgettok(&card); - - /* Get output connections (2 netnames) */ - out_conn = TMALLOC(char *, 2); - for(i = 0; i < 2; i++) - out_conn[i] = MIFgettok(&card); - - /* check for POLY, and ignore it if present */ - if (dim > 0) { - -#ifdef TRACE - /* SDB debug statement */ - printf("In two2three_translate, found poly!!! dim = %d \n", dim); -#endif - - txfree(MIFgettok(&card)); /* read and discard POLY */ - txfree(MIFgettok(&card)); /* read and discard dimension */ - } - - - /* Get input connections (2 netnames per dimension) */ - in_conn = TMALLOC(char *, num_conns); - for(i = 0; i < num_conns; i++) - in_conn[i] = MIFgettok(&card); - - /* The remainder of the line are the poly coeffs. */ - coef = TMALLOC(char *, num_coefs); - for(i = 0; i < num_coefs; i++) - coef[i] = MIFgettok(&card); - - /* Compute the size needed for the new cards to be created */ - /* Allow a fair amount of extra space for connection types, etc. */ - /* to be safe... */ - - inst_card_len = 70; - inst_card_len += 2 * (strlen(name) + 1); - for(i = 0; i < 2; i++) - - inst_card_len += strlen(out_conn[i]) + 1; - for(i = 0; i < num_conns; i++) - inst_card_len += strlen(in_conn[i]) + 1; - - mod_card_len = 70; - mod_card_len += strlen(name) + 1; - for(i = 0; i < num_coefs; i++) - mod_card_len += strlen(coef[i]) + 1; - - /* Allocate space for the cards and write them into the strings */ - - *inst_card = TMALLOC(char, inst_card_len); - *mod_card = TMALLOC(char, mod_card_len); - - strcpy(*inst_card, "a$poly$"); - sprintf(*inst_card + strlen(*inst_card), "%s ", name); - - /* Write input nets/sources */ - if((type == 'e') || (type == 'g') || - (type == 'E') || (type == 'G')) /* These input port types are vector & need a [. */ - sprintf(*inst_card + strlen(*inst_card), "%%vd [ "); - else /* This input port type is scalar */ - sprintf(*inst_card + strlen(*inst_card), "%%vnam [ "); - - - for(i = 0; i < num_conns; i++) - sprintf(*inst_card + strlen(*inst_card), "%s ", in_conn[i]); - - - sprintf(*inst_card + strlen(*inst_card), "] "); - - - /* Write output nets */ - if((type == 'e') || (type == 'h') || - (type == 'E') || (type == 'H')) - sprintf(*inst_card + strlen(*inst_card), "%%vd ( "); - else - sprintf(*inst_card + strlen(*inst_card), "%%id ( "); - - for(i = 0; i < 2; i++) - sprintf(*inst_card + strlen(*inst_card), "%s ", out_conn[i]); - - sprintf(*inst_card + strlen(*inst_card), ") "); - - - /* Write model name */ - sprintf(*inst_card + strlen(*inst_card), "a$poly$%s", name); - - - /* Now create model card */ - sprintf(*mod_card, ".model a$poly$%s spice2poly coef = [ ", name); - for(i = 0; i < num_coefs; i++) - sprintf(*mod_card + strlen(*mod_card), "%s ", coef[i]); - sprintf(*mod_card + strlen(*mod_card), "]"); - -#ifdef TRACE - /* SDB debug statement */ - printf("In two2three_translate, translated statements:\n%s \n%s \n", *inst_card, *mod_card); -#endif - - /* Free the temporary space */ - FREE(name); - name = NULL; - - for(i = 0; i < 2; i++) { - FREE(out_conn[i]); - out_conn[i] = NULL; - } - - FREE(out_conn); - out_conn = NULL; - - for(i = 0; i < num_conns; i++) { - FREE(in_conn[i]); - in_conn[i] = NULL; - } - - FREE(in_conn); - in_conn = NULL; - - for(i = 0; i < num_coefs; i++) { - FREE(coef[i]); - coef[i] = NULL; - } - - FREE(coef); - - coef = NULL; - - /* Return NULL to indicate no error */ - return(NULL); - -} /* two2three_translate */ - - - -/*--------------------------------------------------------------------*/ -/* -get_poly_dimension() - -Get the poly source dimension from the token immediately following -the 'poly' if any. Return values changed by SDB on 5.23.2003 to be: -If "poly" is not present, return 0. -If the dimension token following "poly" is invalid, return -1. -Otherwise, return the integer dimension. -*/ - - -static int get_poly_dimension( - char *card) /* the card text */ -{ - - int i; - int dim; - char *local_tok; - - /* Skip over name and output connections */ - for(i = 0; i < 3; i++) - txfree(MIFgettok(&card)); - - /* Check the next token to see if it is "poly" */ - /* If not, return 0 */ - local_tok = MIFgettok(&card); - if( strcmp(local_tok, "poly") && - strcmp(local_tok, "POLY") ) { /* check that local_tok is *not* poly */ - FREE(local_tok); - local_tok = NULL; - return(0); - } - - FREE(local_tok); - - /* Must have been "poly", so next line must be a number */ - /* Try to convert it. If successful, return the number */ - /* else, return -1 to indicate an error... */ - local_tok = MIFgettok(&card); - dim = atoi(local_tok); - FREE(local_tok); - - if (dim > 0) { - return(dim); - } else { - return(-1); - } - -} /* get_poly_dimension */ - diff --git a/src/xspice/evt/Makefile.am b/src/xspice/evt/Makefile.am deleted file mode 100644 index df3cbe270..000000000 --- a/src/xspice/evt/Makefile.am +++ /dev/null @@ -1,31 +0,0 @@ -## Process this file with automake to produce Makefile.in -# -# JW 3/9/01 - had a go and makeing an autoconf script. - -noinst_LTLIBRARIES = libevtxsp.la - -libevtxsp_la_SOURCES = \ - evtaccept.c \ - evtcall_hybrids.c \ - evtdump.c \ - evtiter.c \ - evtnext_time.c \ - evtop.c \ - evtprint.c \ - evtsetup.c \ - evtdest.c \ - evtbackup.c \ - evtdeque.c \ - evtinit.c \ - evtload.c \ - evtnode_copy.c \ - evtplot.c \ - evtqueue.c \ - evttermi.c \ - evtshared.c \ - evtcheck_nodes.c - -AM_CPPFLAGS = @AM_CPPFLAGS@ -I$(top_srcdir)/src/include -AM_CFLAGS = $(STATIC) - -MAINTAINERCLEANFILES = Makefile.in diff --git a/src/xspice/evt/evtaccept.c b/src/xspice/evt/evtaccept.c deleted file mode 100644 index 1d031d7ed..000000000 --- a/src/xspice/evt/evtaccept.c +++ /dev/null @@ -1,240 +0,0 @@ -/*============================================================================ -FILE EVTaccept.c - -MEMBER OF process XSPICE - -Public Domain - -Georgia Tech Research Corporation -Atlanta, Georgia 30332 -PROJECT A-8503 - -AUTHORS - - 9/12/91 Bill Kuhn - -MODIFICATIONS - - - -SUMMARY - - This file contains a function called at the end of a - successful (accepted) analog timepoint. It saves pointers - to the states of the queues and data at this accepted time. - -INTERFACES - - void EVTaccept(CKTcircuit *ckt, double time) - -REFERENCED FILES - - None. - -NON-STANDARD FEATURES - - None. - -============================================================================*/ - -/*=== INCLUDE FILES ===*/ - -#include "ngspice/config.h" -#include -#include "ngspice/cktdefs.h" - -#include "ngspice/mif.h" -#include "ngspice/evt.h" -#include "ngspice/evtproto.h" - - - -/* -EVTaccept() - -This function is called at the end of a successful (accepted) -analog timepoint. It saves pointers to the states of the -queues and data at this accepted time. -*/ - - - -void EVTaccept( - CKTcircuit *ckt, /* main circuit struct */ - double time) /* time at which analog soln was accepted */ -{ - - int i; - int index; - int num_modified; - - Evt_Inst_Queue_t *inst_queue; - Evt_Output_Queue_t *output_queue; - Evt_Node_Info_t **node_table; - Evt_Node_Data_t *node_data; - Evt_State_Data_t *state_data; - Evt_Msg_Data_t *msg_data; - - - /* Exit if no event instances */ - if(ckt->evt->counts.num_insts == 0) - return; - - /* Get often used pointers */ - inst_queue = &(ckt->evt->queue.inst); - output_queue = &(ckt->evt->queue.output); - node_table = ckt->evt->info.node_table; - node_data = ckt->evt->data.node; - state_data = ckt->evt->data.state; - msg_data = ckt->evt->data.msg; - - - /* Process the inst queue */ - num_modified = inst_queue->num_modified; - /* Loop through list of items modified since last time */ - for(i = 0; i < num_modified; i++) { - Evt_Inst_Event_t *stale, *next; - - /* Get the index of the inst modified */ - index = inst_queue->modified_index[i]; - /* Reset the modified flag */ - inst_queue->modified[index] = MIF_FALSE; - /* Move stale entries to the free list. */ - next = inst_queue->head[index]; - while (next) { - if (next->event_time >= time || - &next->next == inst_queue->current[index]) { - break; - } - stale = next; - next = next->next; - stale->next = inst_queue->free[index]; - inst_queue->free[index] = stale; - } - inst_queue->head[index] = next; - if (!next) - inst_queue->current[index] = &inst_queue->head[index]; - /* Update last_step for this index */ - inst_queue->last_step[index] = inst_queue->current[index]; - } - /* Record the new last_time and reset number modified to zero */ - inst_queue->last_time = time; - inst_queue->num_modified = 0; - - - /* Process the output queue */ - num_modified = output_queue->num_modified; - /* Loop through list of items modified since last time */ - for(i = 0; i < num_modified; i++) { - Evt_Output_Event_t *stale, *next; - - /* Get the index of the output modified */ - index = output_queue->modified_index[i]; - /* Reset the modified flag */ - output_queue->modified[index] = MIF_FALSE; - /* Move stale entries to the free list. */ - next = output_queue->head[index]; - while (next) { - if (next->event_time >= time || - &next->next == output_queue->current[index]) { - break; - } - stale = next; - next = next->next; - stale->next = output_queue->free[index]; - output_queue->free[index] = stale; - } - output_queue->head[index] = next; - if (!next) - output_queue->current[index] = &output_queue->head[index]; - /* Update last_step for this index */ - output_queue->last_step[index] = output_queue->current[index]; - } - /* Record the new last_time and reset number modified to zero */ - output_queue->last_time = time; - output_queue->num_modified = 0; - - - /* Process the node data */ - num_modified = node_data->num_modified; - /* Loop through list of items modified since last time */ - for(i = 0; i < num_modified; i++) { - /* Get the index of the node modified */ - index = node_data->modified_index[i]; - /* Reset the modified flag */ - node_data->modified[index] = MIF_FALSE; - - /* Optionally store node values for later examination. - * The test of CKTtime here is copied from dctran.c. - * CKTinitTime is from the tstart parameter of the "tran" - * command or card. - */ - - if (node_table[index]->save && ckt->CKTtime >= ckt->CKTinitTime && - (ckt->CKTtime > 0 || !(ckt->CKTmode & MODEUIC))) { - /* Update last_step for this index */ - node_data->last_step[index] = node_data->tail[index]; - } else { - Evt_Node_t *keep; - - /* If not recording history, discard all but the last item. - * It may be needed to restore the previous state on backup. - */ - keep = *(node_data->tail[index]); - *(node_data->tail[index]) = node_data->free[index]; - node_data->free[index] = node_data->head[index]; - node_data->head[index] = keep; - node_data->last_step[index] = node_data->tail[index] = - &node_data->head[index]; - } - } - /* Reset number modified to zero */ - node_data->num_modified = 0; - - - /* Process the state data */ - num_modified = state_data->num_modified; - /* Loop through list of items modified since last time */ - for(i = 0; i < num_modified; i++) { - Evt_State_t *state; - - /* Get the index of the state modified */ - index = state_data->modified_index[i]; - /* Reset the modified flag */ - state_data->modified[index] = MIF_FALSE; - /* Get the last saved state for this instance. */ - state = *(state_data->tail[index]); - /* Dump everything older on the instance-specific free list, - * recreating the setup after the initial calls to cm_event_alloc(). - */ - if (!state) - continue; - if (state->prev) { - state->prev->next = state_data->free[index]; - state_data->free[index] = state_data->head[index]; - } - state_data->head[index] = state; - state_data->last_step[index] = state_data->tail[index] = - &state_data->head[index]; - } - /* Reset number modified to zero */ - state_data->num_modified = 0; - - - /* Process the msg data */ - num_modified = msg_data->num_modified; - /* Loop through list of items modified since last time */ - for(i = 0; i < num_modified; i++) { - /* Get the index of the msg modified */ - index = msg_data->modified_index[i]; - /* Update last_step for this index */ - msg_data->last_step[index] = msg_data->tail[index]; - /* Reset the modified flag */ - msg_data->modified[index] = MIF_FALSE; - } - /* Reset number modified to zero */ - msg_data->num_modified = 0; - -} /* EVTaccept */ - - diff --git a/src/xspice/evt/evtbackup.c b/src/xspice/evt/evtbackup.c deleted file mode 100644 index 1055deced..000000000 --- a/src/xspice/evt/evtbackup.c +++ /dev/null @@ -1,643 +0,0 @@ -/*============================================================================ -FILE EVTbackup.c - -MEMBER OF process XSPICE - -Public Domain - -Georgia Tech Research Corporation -Atlanta, Georgia 30332 -PROJECT A-8503 - -AUTHORS - - 9/12/91 Bill Kuhn - -MODIFICATIONS - - - -SUMMARY - - This file contains a function that resets the queues and data - structures to their state at the new analog simulation time specified - following the rejection of an analog timestep by the DCtran routine. - -INTERFACES - - void EVTbackup(CKTcircuit *ckt, double new_time) - -REFERENCED FILES - - None. - -NON-STANDARD FEATURES - - None. - -============================================================================*/ - - -/*=== INCLUDE FILES ===*/ -#include "ngspice/ngspice.h" - -#include "ngspice/cktdefs.h" -//#include "util.h" - -#include "ngspice/mif.h" -#include "ngspice/evt.h" - -#include "ngspice/evtproto.h" - - - -/*=== FUNCTION PROTOTYPES ===*/ - - -static void EVTbackup_node_data(CKTcircuit *ckt, double new_time); -static void EVTbackup_state_data(CKTcircuit *ckt, double new_time); -static void EVTbackup_msg_data(CKTcircuit *ckt, double new_time); -static void EVTbackup_inst_queue(CKTcircuit *ckt, double new_time); -static void EVTbackup_output_queue(CKTcircuit *ckt, double new_time); - - - -/* -EVTbackup() - -This function resets the queues and data structures to their state -at the new analog simulation time specified. The algorithms in this file -assume the following timestep coordination between -analog and event-driven algorithms: - - while(not end of analysis) { - - while (next event time <= next analog time) { - do event solution with call_type = event_driven - if any instance set analog breakpoint < next analog time - set next analog time to breakpoint - } - - do analog timestep solution with call_type = analog - call all hybrid models with call_type = event_driven - - if(analog solution doesn't converge) - Call EVTbackup - else - Call EVTaccept - } -*/ - - -void EVTbackup( - CKTcircuit *ckt, /* the main circuit structure */ - double new_time) /* the time to backup to */ -{ - - - /* Backup the node data */ - EVTbackup_node_data(ckt, new_time); - - /* Backup the state data */ - EVTbackup_state_data(ckt, new_time); - - /* Backup the msg data */ - EVTbackup_msg_data(ckt, new_time); - - /* Backup the inst queue */ - EVTbackup_inst_queue(ckt, new_time); - - /* Backup the output queue */ - EVTbackup_output_queue(ckt, new_time); - - /* Record statistics */ - (ckt->evt->data.statistics->tran_time_backups)++; - -} /* EVTbackup */ - - - - -/* -EVTbackup_node_data() - -Reset the node structure data. -*/ - - -static void EVTbackup_node_data( - CKTcircuit *ckt, /* the main circuit structure */ - double new_time) /* the time to backup to */ -{ - - int i; - int j; - - int num_modified; - int node_index; - - Evt_Node_Info_t **node_table; - Evt_Node_Data_t *node_data; - Evt_Node_t **node_ptr; - Evt_Node_t *node; - Evt_Node_t *from_node; - Evt_Node_t *to_node; - Evt_Node_t *head; - Evt_Node_t *tail; - Evt_Node_t *free_head; - - /* Get pointers for quick access */ - node_data = ckt->evt->data.node; - node_table = ckt->evt->info.node_table; - - /* Loop through list of indexes modified since last accepted timepoint */ - num_modified = node_data->num_modified; - for(i = 0; i < num_modified; i++) { - - /* Get the needed node and udn indexes */ - node_index = node_data->modified_index[i]; - - /* Scan data for this node from last_step to determine new setting */ - /* for tail, and splice later data into the free list */ - node_ptr = node_data->last_step[node_index]; - node = *node_ptr; - for (;;) { - if((node->next == NULL) || (node->next->step > new_time)) { - - /* Splice rest of list, if any, into free list */ - head = node->next; - if(head) { - tail = *(node_data->tail[node_index]); - free_head = node_data->free[node_index]; - node_data->free[node_index] = head; - tail->next = free_head; - } - - /* Set the tail */ - node_data->tail[node_index] = node_ptr; - node->next = NULL; - - break; - } - node_ptr = &(node->next); - node = node->next; - } - - /* Copy data from the location at tail to rhs and rhsold */ - from_node = *(node_data->tail[node_index]); - to_node = &(node_data->rhs[node_index]); - EVTnode_copy(ckt, node_index, from_node, &to_node); - to_node = &(node_data->rhsold[node_index]); - EVTnode_copy(ckt, node_index, from_node, &to_node); - - } /* end for number modified */ - - /* Update/compact the modified list */ - for(i = 0, j = 0; i < num_modified; i++) { - node_index = node_data->modified_index[i]; - /* If nothing after last_step, remove this index from the modified list */ - if((*(node_data->last_step[node_index]))->next == NULL) { - node_data->modified[node_index] = MIF_FALSE; - (node_data->num_modified)--; - } - /* else, keep the index */ - else { - node_data->modified_index[j] = node_data->modified_index[i]; - j++; - } - } - -} /* EVTbackup_node_data */ - - - -/* -EVTbackup_state_data() - -Reset the state structure data. -*/ - - -static void EVTbackup_state_data( - CKTcircuit *ckt, /* the main circuit structure */ - double new_time) /* the time to backup to */ -{ - int i; - int j; - - int num_modified; - int inst_index; - - Evt_State_Data_t *state_data; - - Evt_State_t **state_ptr; - Evt_State_t *state; - Evt_State_t *head; - Evt_State_t *tail; - Evt_State_t *free_head; - - /* Get pointers for quick access */ - state_data = ckt->evt->data.state; - - /* Loop through list of indexes modified since last accepted timepoint */ - num_modified = state_data->num_modified; - for(i = 0; i < num_modified; i++) { - - /* Get the inst index */ - inst_index = state_data->modified_index[i]; - - /* Scan data for this inst from last_step to determine new setting */ - /* for tail, and splice later data into the free list */ - state_ptr = state_data->last_step[inst_index]; - state = *state_ptr; - for (;;) { - if((state->next == NULL) || (state->next->step > new_time)) { - - /* Splice rest of list, if any, into free list */ - head = state->next; - if(head) { - tail = *(state_data->tail[inst_index]); - free_head = state_data->free[inst_index]; - state_data->free[inst_index] = head; - tail->next = free_head; - } - - /* Set the tail */ - state_data->tail[inst_index] = state_ptr; - state->next = NULL; - - break; - } - state_ptr = &(state->next); - state = state->next; - } - } /* end for number modified */ - - /* Update/compact the modified list */ - for(i = 0, j = 0; i < num_modified; i++) { - inst_index = state_data->modified_index[i]; - /* If nothing after last_step, remove this index from the modified list */ - if((*(state_data->last_step[inst_index]))->next == NULL) { - state_data->modified[inst_index] = MIF_FALSE; - (state_data->num_modified)--; - } - /* else, keep the index */ - else { - state_data->modified_index[j] = state_data->modified_index[i]; - j++; - } - } - -} /* EVTbackup_state_data */ - - - -/* -EVTbackup_msg_data() - -Backup the message data. -*/ - - -static void EVTbackup_msg_data( - CKTcircuit *ckt, /* the main circuit structure */ - double new_time) /* the time to backup to */ -{ - int i; - int j; - - int num_modified; - int port_index; - - Evt_Msg_Data_t *msg_data; - - Evt_Msg_t **msg_ptr; - Evt_Msg_t *msg; - Evt_Msg_t *head; - Evt_Msg_t *tail; - Evt_Msg_t *free_head; - - /* Get pointers for quick access */ - msg_data = ckt->evt->data.msg; - - /* Loop through list of indexes modified since last accepted timepoint */ - num_modified = msg_data->num_modified; - for(i = 0; i < num_modified; i++) { - - /* Get the port index */ - port_index = msg_data->modified_index[i]; - - /* Scan data for this port from last_step to determine new setting */ - /* for tail, and splice later data into the free list */ - msg_ptr = msg_data->last_step[port_index]; - msg = *msg_ptr; - for (;;) { - if((msg->next == NULL) || (msg->next->step > new_time)) { - - /* Splice rest of list, if any, into free list */ - head = msg->next; - if(head) { - tail = *(msg_data->tail[port_index]); - free_head = msg_data->free[port_index]; - msg_data->free[port_index] = head; - tail->next = free_head; - } - - /* Set the tail */ - msg_data->tail[port_index] = msg_ptr; - msg->next = NULL; - - break; - } - msg_ptr = &(msg->next); - msg = msg->next; - } - - } /* end for number modified */ - - /* Update/compact the modified list */ - for(i = 0, j = 0; i < num_modified; i++) { - port_index = msg_data->modified_index[i]; - /* If nothing after last_step, remove this index from the modified list */ - if((*(msg_data->last_step[port_index]))->next == NULL) { - msg_data->modified[port_index] = MIF_FALSE; - (msg_data->num_modified)--; - } - /* else, keep the index */ - else { - msg_data->modified_index[j] = msg_data->modified_index[i]; - j++; - } - } -} - - - -/* -EVTbackup_inst_queue() - -Backup data in inst queue. -*/ - - -static void EVTbackup_inst_queue( - CKTcircuit *ckt, /* the main circuit structure */ - double new_time) /* the time to backup to */ -{ - - int i; - int j; - - int num_modified; - int num_pending; - int inst_index; - - Evt_Inst_Queue_t *inst_queue; - - Evt_Inst_Event_t **inst_ptr; - Evt_Inst_Event_t *inst; - - double next_time; - double event_time; - - - /* Get pointers for quick access */ - inst_queue = &(ckt->evt->queue.inst); - - /* Loop through list of indexes modified since last accepted timepoint */ - /* and remove events with posted time > new_time */ - num_modified = inst_queue->num_modified; - for(i = 0; i < num_modified; i++) { - - /* Get the inst index */ - inst_index = inst_queue->modified_index[i]; - - /* Scan forward from last_step and cut out data with posted time */ - /* > new_time and add it to the free list */ - - inst_ptr = inst_queue->last_step[inst_index]; - inst = *inst_ptr; - - while(inst) { - if(inst->posted_time > new_time) { - *inst_ptr = inst->next; - inst->next = inst_queue->free[inst_index]; - inst_queue->free[inst_index] = inst; - inst = *inst_ptr; - } - else { - inst_ptr = &(inst->next); - inst = *inst_ptr; - } - } - - /* Scan forward from last_step and set current to first */ - /* event with event_time > new_time */ - - inst_ptr = inst_queue->last_step[inst_index]; - inst = *inst_ptr; - - while(inst) { - if(inst->event_time > new_time) - break; - inst_ptr = &((*inst_ptr)->next); - inst = *inst_ptr; - } - inst_queue->current[inst_index] = inst_ptr; - } - - /* Add set of items modified to set of items pending before updating the */ - /* pending list because things may have been pulled from the pending list */ - for(i = 0; i < num_modified; i++) { - j = inst_queue->modified_index[i]; - if(! inst_queue->pending[j]) { - inst_queue->pending[j] = MIF_TRUE; - inst_queue->pending_index[(inst_queue->num_pending)++] = j; - } - } - - /* Update the pending list and the next time by seeing if there */ - /* is anything at the location pointed to by current */ - next_time = 1e30; - num_pending = inst_queue->num_pending; - for(i = 0, j = 0; i < num_pending; i++) { - inst_index = inst_queue->pending_index[i]; - inst = *(inst_queue->current[inst_index]); - /* If nothing in queue at last_step, remove this index from the pending list */ - if(! inst) { - inst_queue->pending[inst_index] = MIF_FALSE; - (inst_queue->num_pending)--; - } - /* else, keep the index and update the next time */ - else { - inst_queue->pending_index[j] = inst_queue->pending_index[i]; - j++; - event_time = inst->event_time; - if(event_time < next_time) - next_time = event_time; - } - } - inst_queue->next_time = next_time; - - /* Update the modified list by looking for any queued events */ - /* with posted time > last_time */ - for(i = 0, j = 0; i < num_modified; i++) { - - inst_index = inst_queue->modified_index[i]; - inst = *(inst_queue->last_step[inst_index]); - - while(inst) { - if(inst->posted_time > inst_queue->last_time) - break; - inst = inst->next; - } - - if(! inst) { - inst_queue->modified[inst_index] = MIF_FALSE; - (inst_queue->num_modified)--; - } - else { - inst_queue->modified_index[j] = inst_queue->modified_index[i]; - j++; - } - } -} - - - - - -/* -EVTbackup_output_queue() - -Backup data in output queue. -*/ - - - -static void EVTbackup_output_queue( - CKTcircuit *ckt, /* the main circuit structure */ - double new_time) /* the time to backup to */ -{ - - int i; - int j; - - int num_modified; - int num_pending; - - int output_index; - - Evt_Output_Queue_t *output_queue; - - Evt_Output_Event_t **output_ptr; - Evt_Output_Event_t *output; - - double next_time; - double event_time; - - - /* Get pointers for quick access */ - output_queue = &(ckt->evt->queue.output); - - /* Loop through list of indexes modified since last accepted timepoint */ - /* and remove events with posted time > new_time */ - num_modified = output_queue->num_modified; - for(i = 0; i < num_modified; i++) { - - /* Get the output index */ - output_index = output_queue->modified_index[i]; - - /* Scan forward from last_step and cut out data with posted time */ - /* > new_time and add it to the free list */ - /* Also, unremove anything with removed time > new_time */ - - output_ptr = output_queue->last_step[output_index]; - output = *output_ptr; - - while(output) { - if(output->posted_time > new_time) { - *output_ptr = output->next; - output->next = output_queue->free[output_index]; - output_queue->free[output_index] = output; - output = *output_ptr; - } - else { - if(output->removed && (output->removed_time > new_time)) - output->removed = MIF_FALSE; - output_ptr = &(output->next); - output = *output_ptr; - } - } - - /* Scan forward from last_step and set current to first */ - /* event with event_time > new_time */ - - output_ptr = output_queue->last_step[output_index]; - output = *output_ptr; - - while(output) { - if (output->posted_time < new_time) - break; - output_ptr = &((*output_ptr)->next); - output = *output_ptr; - } - output_queue->current[output_index] = output_ptr; - } - - /* Add set of items modified to set of items pending before updating the */ - /* pending list because things may have been pulled from the pending list */ - for(i = 0; i < num_modified; i++) { - j = output_queue->modified_index[i]; - if(! output_queue->pending[j]) { - output_queue->pending[j] = MIF_TRUE; - output_queue->pending_index[(output_queue->num_pending)++] = j; - } - } - - /* Update the pending list and the next time by seeing if there */ - /* is anything at the location pointed to by current */ - next_time = 1e30; - num_pending = output_queue->num_pending; - for(i = 0, j = 0; i < num_pending; i++) { - output_index = output_queue->pending_index[i]; - output = *(output_queue->current[output_index]); - /* If nothing in queue at last_step, remove this index from the pending list */ - if(! output) { - output_queue->pending[output_index] = MIF_FALSE; - (output_queue->num_pending)--; - } - /* else, keep the index and update the next time */ - else { - output_queue->pending_index[j] = output_queue->pending_index[i]; - j++; - event_time = output->event_time; - if(event_time < next_time) - next_time = event_time; - } - } - output_queue->next_time = next_time; - - /* Update the modified list by looking for any queued events */ - /* with posted time > last_time */ - for(i = 0, j = 0; i < num_modified; i++) { - - output_index = output_queue->modified_index[i]; - output = *(output_queue->last_step[output_index]); - - while(output) { - if(output->posted_time > output_queue->last_time) - break; - output = output->next; - } - - if(! output) { - output_queue->modified[output_index] = MIF_FALSE; - (output_queue->num_modified)--; - } - else { - output_queue->modified_index[j] = output_queue->modified_index[i]; - j++; - } - } -} diff --git a/src/xspice/evt/evtcall_hybrids.c b/src/xspice/evt/evtcall_hybrids.c deleted file mode 100644 index f8a82106c..000000000 --- a/src/xspice/evt/evtcall_hybrids.c +++ /dev/null @@ -1,77 +0,0 @@ -/*============================================================================ -FILE EVTcall_hybrids.c - -MEMBER OF process XSPICE - -Public Domain - -Georgia Tech Research Corporation -Atlanta, Georgia 30332 -PROJECT A-8503 - -AUTHORS - - 9/12/91 Bill Kuhn - -MODIFICATIONS - - - -SUMMARY - - This file contains function EVTcall_hybrids which calls all models - which have both analog and event-driven ports. It is called following - successful evaluation of an analog iteration attempt to allow - events to be scheduled by the hybrid models. The 'CALL_TYPE' is set - to 'EVENT_DRIVEN' when the model is called from this function. - -INTERFACES - - void EVTcall_hybrids(CKTcircuit *ckt) - -REFERENCED FILES - - None. - -NON-STANDARD FEATURES - - None. - -============================================================================*/ - - -#include "ngspice/ngspice.h" -#include "ngspice/cktdefs.h" - -#include "ngspice/evt.h" - -#include "ngspice/evtproto.h" - - -/* -EVTcall_hybrids - -This function calls all the hybrid instances. It is called following -the successful evaluation of an analog iteration. -*/ - - -void EVTcall_hybrids( - CKTcircuit *ckt) /* the main circuit structure */ -{ - - int i; - int num_hybrids; - - int *hybrid_index; - - - /* Get needed data for fast access */ - num_hybrids = ckt->evt->counts.num_hybrids; - hybrid_index = ckt->evt->info.hybrid_index; - - /* Call EVTload for all hybrids */ - for(i = 0; i < num_hybrids; i++) - EVTload(ckt, hybrid_index[i]); - -} diff --git a/src/xspice/evt/evtcheck_nodes.c b/src/xspice/evt/evtcheck_nodes.c deleted file mode 100644 index a95e0e82a..000000000 --- a/src/xspice/evt/evtcheck_nodes.c +++ /dev/null @@ -1,759 +0,0 @@ -/* Automatic insertion of XSPICE devices bridging event and analogue nodes. - * Giles Atkinson 2022. - * The contents of this file may belong in src/frontend, except that it is - * part of XSPICE. - */ - -#include -#include - -#include "ngspice/ngspice.h" -#include "ngspice/cktdefs.h" -#include "ngspice/devdefs.h" -#include "ngspice/inpdefs.h" -#include "ngspice/sperror.h" -#include "ngspice/wordlist.h" -#include "ngspice/fteext.h" - -#include "ngspice/mif.h" -#include "ngspice/evt.h" -#include "ngspice/evtudn.h" -#include "ngspice/evtproto.h" -#include "ngspice/mif.h" -#include "../../frontend/inpcom.h" -#include "../../frontend/inp.h" -#include "../../frontend/subckt.h" -#include "../../frontend/variable.h" -#include "../../frontend/numparam/numpaif.h" -#include "../../misc/util.h" - -/* Automatic insertion of bridge devices. - -When using XSPICE to simulate digital devices in a mixed-mode simulation, -bridging devices must be included in the circuit to pass signals between the -analogue simulator and XSPICE. Such devices may be included in the netlist, -or they may can be inserted automatically. Different types of automatic -bridge may exist in the same circuit, depending on signal direction and -characteristics of the connected device, for example digital devices -powered by differing voltages. Non-digital XSPICE nodes are supported. - -Bridging may be disabled by setting command variable "auto_bridge" to zero. -Values greater than one enable diagnostic outputs. - -Automatic insertion works by checking node names; if the same name occurs in -both sides of the simulator, it indicates that a connection between -an analogue and a digital device has been specified. At this point no such -connection exists: it is created by adding the bridging device. Devices are -added by generating netlist lines describing them and then performing some -stages of ngspice's normal input processing. - -To add a bridging device, one or two lines of netlist text are created. -Typically, one specifies the device itself (an XSPICE 'A' "device card") -and the other ("setup card") is the required model definition. Alternatively, -the setup card may use .include to read in a subcircuit definition and the -device card is a subcircuit ('X' card). Setup cards are processed once, -device cards, once per bridged node. - -Inserted or included netlist lines use a restricted set of features. There -may be further includes and subcircuits, but nothing else apart from device -and model cards has been tested. Parameter and expression processing are -available, but parameters defined in the main circuit are inaccessible. -Models defined in the circuit may be used, but subcircuits are inaccessible. -These restictions arise from the fact that missing bridges are detected -after the circuit has been built. Previous parameter and subcircuit -definitions are no longer fully available. - -The device card must be a format string for the C library function sprintf() -with one %d and two %s insertion indicators. The %d insertion makes the -device name unique and the string insertions supply a list of node names -that will be bridged. Optionally a final substitution for a double may be -included that will receive the value of internal variable, vcc (see below). -The results of formatting should be an XSPICE device card or a subcircuit call. - -The setup and device cards to be used are determined by examining the -event node that is to be connected. The rules are a little complex, -but are intended to be very flexible, while easy to use in common -cases. If all XSPICE nodes are digital, using 3.3V supply and good -simulation of the device's electrical characteristics is not needed, -then nothing need be done. Other supply voltages can be handled by: - -.param vcc=5 - -or similar, and the parameter may have different values in subcircuits. -Otherwise, the full rules follow. The third rule is intended to be useful -for device libraries whose devices are defined by subcircuits. - -1: The program looks for a command interpreter variable - "auto_bridge_parm_TTTT" where TTTT is the node type string. So - "auto_bridge_parm_d" for digital nodes. The value should be the name of - a circuit parameter (.param card). If not found, ignore the next step, - except in the case of a digital node where the parameter name is assumed - to be "vcc". Initialise an internal variable, vcc, to zero. - -2: Given that parameter name, find the most deeply-nested (in subcircuits) - XSPICE device that is connected to the node. Search upwards through - the enclosing subcircuits for a definition of the parameter. - If found, set vcc from the parameter. - -3: If a command interpreter variable "no_auto_bridge_family": exists, go to - step 5. Search the connected device instances for a parameter, - "family" with a string value. The first one found will be used. - If the first character of the value is not '*', the setup card will - be ".include bridge_FFFFF_DDD.cir" where FFFFF is the family and - DDD is the signal direction for the XSPICE device: "in", "out" or - "inout". The device card will be "Xauto_bridge%d %s %s - bridge_FFFFF_DDD vcc=%g", so a suitably parameterised subcircuit - must be defined in the included file. - -4: If the first character of "family" was '*', look for a variable - "auto_bridge_FFFFF_TTTT_DDD" where FFFFF is the family without '*', - TTTT is the node type string and DDD is the direction. So this might be - "auto_bridge_74HCT_d_inout" for a digital node. Use the variable's value - as in step 6, proceeding to step 5 if checks fail. - -5: Look for a variable "auto_bridge_TTTT_DDD" where TTTT and DDD are as before. - -6: Check and use the variable's value from step 4 or 5. It must be a list - of two or three elements: the setup card, device card and an optional - third value. If the setup card is not ".include", it is formatted - with multiple copies of vcc (example below). If present, the third - value in the list must be an integer, specifying the maximum number of - nodes handled by a single device. If not present, or zero, there is - no limit. If no variable was found, the circuit fails, except for - digital nodes where defaults are supplied. For digital the defaults - are: - - ( ".model auto_adc adc_bridge(in_low = '%g/2' in_high = '%g/2')" - "auto_adc%d [ %s ] [ %s ] auto_adc" ) - - for a digital input with - - ( ".model auto_dac dac_bridge(out_low = 0 out_high = %g)" - "auto_dac%d [ %s ] [ %s ] auto_dac" ) - - for digital output and - - ( ".model auto_bidi bidi_bridge(out_high=%g in_low='%g/2' in_high='%g/2')" - "auto_bidi%d [ %s ] [ %s ] null auto_bidi" ) - - for a node with a digital inout port or with both inputs and outputs. - Note that single quotes surround expressions to be evaluated during - netlist parsing. They are preferred to braces because braces are stripped - by the "set" command. - - A non-digital example (real to analogue) is: - - set auto_bridge_real_out = ( ".model real_to_v_bridge r_to_v" - + "areal_bridge%d %s null %s real_to_v_bridge" 1 ) - - (The spaces are important.) - - An example of an included subcircuit might be: - - * Subcircuit for digital output buffer with impedance - - .subckt auto_buf dig ana vcc=5 - .model auto_dac dac_bridge(out_low = 0 out_high = {vcc}) - auto_dac [ dig ] [ internal ] auto_dac - rint internal ana 100 - .ends - - and invoked by: - - set auto_bridge_d_out_30 = ( ".include test_sub.cir" - + "xauto_buf%d %s %s auto_buf vcc=%g" - + 1 ) -*/ - -/* Working information about a type of bridge. */ - -struct bridge { - int udn_index; // Node type. - Mif_Dir_t direction; // IN, OUT or INOUT - double vcc; // A .param value used for matching. - const char *family; // Alternative match parameter. - struct bridge *next; // Linked list - int max, count; // How many nodes/device? - char *setup; // For model or inclusion card. - const char *format; // For device card. - int end_index; // Free buffer space - char held[256]; // Buffer with node names. -}; - -/* Enable/verbosity level */ - -#define AB_OFF 0 -#define AB_SILENT 1 -#define AB_DECK 2 // Show generated deck - -#define BIG 999990000 // For fake linenumbers - -/* Expand .include cards and subcircuits in a deck. */ - -static struct card *expand_deck(struct card *head) -{ - struct card *card, *next; - char **pointers; - int i, dico; - - /* Save the current parameter symbol table. */ - - dico = nupa_add_dicoslist(); - - /* Count the cards, allocate and fill a pointer array. */ - - for (i = 0, card = head; card; ++i, card = card->nextcard) - ; - pointers = TMALLOC(char *, i + 1); - for (i = 0, card = head; card; ++i, card = card->nextcard) - pointers[i] = card->line; - pointers[i] = NULL; - - /* Free the card headers. */ - - for (card = head; card; card = next) { - next = card->nextcard; - tfree(card); - } - - /* The cards are passed to _inp_readall() via a global. */ - - circarray = pointers; - card = inp_readall(NULL, Infile_Path, FALSE, TRUE, NULL); - card = inp_subcktexpand(card); - - /* Destroy the parameter table that was created in subcircuit/parameter - * expansion and restore the previous version. - */ - - nupa_del_dicoS(); - nupa_set_dicoslist(dico); - nupa_rem_dicoslist(dico); - return card; -} - -/* Write a completed bridge instance card. */ - -static struct card *flush_card(struct bridge *bridge, int ln, - struct card *last) -{ - char buff[2 * sizeof bridge->held + 128]; - - bridge->held[bridge->end_index] = '\0'; - snprintf(buff, sizeof buff, bridge->format, - ln, bridge->held, bridge->held, bridge->vcc); - bridge->count = 0; - bridge->end_index = 0; - return insert_new_line(last, copy(buff), BIG + ln, 0); -} - - -/* Release memory used. */ - -static void free_bridges(struct bridge *bridge_list) -{ - struct bridge *bridge; - - while (bridge_list) { - /* Free the structure. Setup has gone. */ - - bridge = bridge_list; - bridge_list = bridge->next; - if (bridge->format) - tfree(bridge->format); - tfree(bridge); - } -} - -/* Find an XSPICE device instance given its index number. Uses link chasing - * as at this point the indexable inst_table does not yet exist. - */ - -static MIFinstance *find_inst(CKTcircuit *ckt, int index) -{ - struct Evt_Inst_Info *chase; - int i; - - for (i = 0, chase = ckt->evt->info.inst_list; - i < index && chase; - ++i, chase = chase->next) - ; - return chase ? chase->inst_ptr : NULL; -} - -/* All connected ports are declared as outputs, but some may be INOUT. */ - -static Mif_Dir_t scan_ports(Evt_Node_Info_t *event_node, CKTcircuit *ckt) -{ - Evt_Node_Info_t *chase; - Evt_Inst_Index_t *inst_list; - int index; - - /* Find the node index. */ - - for (index = 0, chase = ckt->evt->info.node_list; - chase && chase != event_node; - ++index, chase= chase->next); - - /* Look for inout ports connected to this node. */ - - for (inst_list = event_node->inst_list; - inst_list; - inst_list = inst_list->next) { - MIFinstance *inst; - int i; - - inst = find_inst(ckt, inst_list->index); - for (i = 0; i < inst->num_conn; ++i) { - Mif_Conn_Data_t *conn; - int j; - - conn = inst->conn[i]; - if (conn->is_null || !conn->is_input || !conn->is_output) - continue; - for (j = 0; j < conn->size; ++j) { - Mif_Port_Data_t *port; - - port = conn->port[j]; - if (port->type != MIF_DIGITAL && - port->type != MIF_USER_DEFINED) { - /* Analogue, ignore. */ - - continue; - } - if (port->evt_data.node_index == index) { - /* An inout connection to this node. */ - - return MIF_INOUT; - } - } - } - } - return MIF_OUT; -} - -/* Examine a device and return its subcircuit nesting depth - * and possibly the value of its "family" parameter, if that exists. - */ - -static int examine_device(MIFinstance *inst, const char **family) -{ - struct MIFmodel *mp; - char *dot; - int i; - - if (!*family) { - Mif_Param_Data_t *pdp; - IFparm *pp; - int type; - - mp = MIFmodPtr(inst); - type = mp->MIFmodType; - pp = ft_sim->devices[type]->modelParms; - for (i = 0; i < inst->num_param; ++i) { - pdp = mp->param[i]; - if (!pdp->is_null && pdp->eltype == IF_STRING && - !strcmp(pp[i].keyword, "family")) { - /* Return value for "family" parameter. */ - - *family = pdp->element->svalue; // May be NULL - if (family && !family[0]) - family = NULL; // Ignore empty string. - break; - } - } - } - - for (i = 0, dot = strchr(inst->MIFname, '.'); dot; dot += 1, ++i) { - dot = strchr(dot, '.'); - if (dot == NULL) - break; - } - return i; -} - -/* Scan devices attached to node. Return the name of the deepest-nested - * one and the first "Family" parameter found. - */ - -static const char *scan_devices(Evt_Node_Info_t *event_node, - CKTcircuit *ckt, - const char **family) -{ - Evt_Inst_Index_t *inst_list; - MIFinstance *best_inst = NULL, *inst; - int best_depth = -1, depth, left; - - /* Scan input connections. */ - - for (inst_list = event_node->inst_list; - inst_list; - inst_list = inst_list->next) { - inst = find_inst(ckt, inst_list->index); - depth = examine_device(inst, family); - if (depth > best_depth) { - best_depth = depth; - best_inst = inst; - } - } - - left = event_node->num_outputs; - if (left) { - Evt_Node_Info_t *node; - Evt_Output_Info_t *oip; - int i, my_index; - - /* Find the index of this node (not stored). */ - - for (my_index = 0, node = ckt->evt->info.node_list; - node != event_node; - ++my_index, node = node->next) - ; - - /* Scan output connections. */ - - for (i = 0, oip = ckt->evt->info.output_list; - oip; - ++i, oip = oip->next) { - if (oip->node_index == my_index) { - inst = find_inst(ckt, oip->inst_index); - depth = examine_device(inst, family); - if (depth > best_depth) { - best_depth = depth; - best_inst = inst; - } - if (--left == 0) - break; - } - } - } - - /* The device name is a.. */ - - return best_inst ? best_inst->MIFname + 2 : NULL; -} - -/* Can a bridge element be inserted? */ - -static struct bridge *find_bridge(Evt_Node_Info_t *event_node, - CKTcircuit *ckt, - struct bridge **bridge_list_p) -{ - static const char * const dirs[] = {"in", "out", "inout"}; - struct bridge *bridge; - Mif_Dir_t direction; - char *setup = NULL; - const char *format = NULL; - const char *type_name, *family, *s_family, *deep; - char *vcc_parm, *dot; - double vcc = 0.0; - int max = 0, ok = 0; - struct variable *cvar = NULL; - char buff[256]; - - /* Find the direction for this node. */ - - if (event_node->num_outputs == 0) { - direction = MIF_IN; - } else if (event_node->num_outputs < event_node->num_ports) { - direction = MIF_INOUT; - } else { - direction = scan_ports(event_node, ckt); // Ugly - } - - /* Find the vcc parameter for this node. */ - - type_name = g_evt_udn_info[event_node->udn_index]->name; - snprintf(buff, sizeof buff, "auto_bridge_parm_%s", type_name); - if (cp_getvar(buff, CP_STRING, buff, sizeof buff)) - vcc_parm = buff; - else if (event_node->udn_index == 0) - vcc_parm = "vcc"; - else - vcc_parm = NULL; - - /* Scan attached XSPICE devices for the deepest nested one and - * a device with a "family" parameter. - */ - - family = NULL; - deep = scan_devices(event_node, ckt, &family); - - /* Look for a real parameter (.param type) in the device's subcircuit - * and those enclosing it. - */ - - snprintf(buff, sizeof buff, "%s", deep); - dot = strrchr(buff, '.'); - while (dot) { - if (!ok) { - snprintf(dot + 1, sizeof buff - (size_t)(dot - buff), "%s", vcc_parm); - vcc = nupa_get_param(buff, &ok); - } - if (ok) - break; - *dot = '\0'; - dot = strrchr(buff, '.'); - } - - if (!ok) { - vcc = nupa_get_param(vcc_parm, &ok); - if (!ok) { - if (event_node->udn_index == 0) - vcc = 3.3; // Fallback default for digital. - else - vcc = 0; - } - } - - if (family && cp_getvar("no_auto_bridge_family", CP_BOOL, NULL, 0)) - family = NULL; - - if (family && *family == '*') { - s_family = family + 1; - family = NULL; // Not used for matching. - } else { - s_family = NULL; - } - - /* Look for an existing entry. */ - - for (bridge = *bridge_list_p; bridge; bridge = bridge->next) { - if (bridge->udn_index == event_node->udn_index && - bridge->direction == direction) { - if (family) { - if (!strcmp(family, bridge->family)) { - /* Return vcc for formatting: requires bridge->max == 1. */ - - bridge->vcc = vcc; - break; - } - } else if (bridge->vcc == vcc) { // Match vcc. - break; - } - } - } - if (bridge) - return bridge; - - /* Determine if a bridging element exists, starting with the node type. */ - - if (family) { - /* Use standard pattern for known parts family. */ - - snprintf(buff, sizeof buff, ".include bridge_%s_%s.cir", - family, dirs[direction]); - setup = copy(buff); - snprintf(buff, sizeof buff, - "Xauto_bridge%%d %%s %%s bridge_%s_%s vcc=%%g", - family, dirs[direction]); - format = copy(buff); - max = 1; - } else if (s_family) { - /* Family variable lookup. */ - - snprintf(buff, sizeof buff, "auto_bridge_%s_%s_%s", - s_family, type_name, dirs[direction]); - cp_getvar(buff, CP_LIST, &cvar, sizeof cvar); - } - - if (!format && !cvar) { - /* General variable lookup. */ - - snprintf(buff, sizeof buff, "auto_bridge_%s_%s", - type_name, dirs[direction]); - cp_getvar(buff, CP_LIST, &cvar, sizeof cvar); - } - if (!format && cvar) { - struct variable *v2, *v3; - - /* The first element of the list is returned. */ - - if (cvar && cvar->va_type == CP_STRING && - cvar->va_string && cvar->va_string[0]) { - v2 = cvar->va_next; - if (v2->va_type == CP_STRING && - v2->va_string && v2->va_string[0]) { - format = copy(v2->va_string); - setup = copy(cvar->va_string); - - v3 = v2->va_next; - if (v3 && v3->va_type == CP_NUM) - max = v3->va_num; - } else { - cvar = NULL; - } - } else { - cvar = NULL; - } - } - - /* Last and probably most common case, default digital bridges. */ - - if (!format && event_node->udn_index == 0) { - if (direction == MIF_IN) { - setup = ".model auto_adc adc_bridge(" - "in_low = '%g/2' in_high = '%g/2')"; - format = "auto_adc%d [ %s ] [ %s ] auto_adc"; - } else if (direction == MIF_OUT) { // MIF_OUT - setup = ".model auto_dac dac_bridge(" - "out_low = 0 out_high = %g)"; - format = "auto_dac%d [ %s ] [ %s ] auto_dac"; - } else { - setup = ".model auto_bidi bidi_bridge(" - "out_high = %g in_low = '%g/2' in_high = '%g/2')"; - format = "auto_bidi%d [ %s ] [ %s ] null auto_bidi"; - } - setup = copy(setup); - format = copy(format); - } - if (!format) - return NULL; - - /* If the setup is not a .include card, format it with vcc. */ - - if (strncmp(setup, ".inc", 4)) { - snprintf(buff, sizeof buff, setup, vcc, vcc, vcc, vcc, vcc); - tfree(setup); - setup = copy(buff); - } - - /* Make a new bridge structure. */ - - bridge = TMALLOC(struct bridge, 1); - bridge->udn_index = event_node->udn_index; - bridge->direction = direction; - bridge->vcc = vcc; - bridge->family = family; - bridge->next = *bridge_list_p; - *bridge_list_p = bridge; - bridge->max = max; - bridge->count = 0; - bridge->setup = setup; - bridge->format = format; - bridge->end_index = 0; - return bridge; -} - -/* Early detection of node type clashes and attempted fix by - * automatic insertion of a bridging device. - */ - -bool Evtcheck_nodes( - CKTcircuit *ckt, /* The circuit structure */ - INPtables *stab) /* Symbol table. */ -{ - struct bridge *bridge_list = NULL, *bridge; - CKTnode *analog_node; - Evt_Node_Info_t *event_node; - struct card *head = NULL, *lastcard = NULL; - int ln = 0, show; - - /* Is auto-bridge enabled? */ - - if (!cp_getvar("auto_bridge", CP_NUM, &show, sizeof show)) - show = AB_SILENT; - - /* Try to create joining device if any analog node name matches - * an event node. Failure is fatal. - */ - - for (event_node = ckt->evt->info.node_list; - event_node; - event_node = event_node->next) { - for (analog_node = ckt->CKTnodes; - analog_node; - analog_node = analog_node->next) { - int nl; - - if (strcmp(event_node->name, analog_node->name) == 0) { - if (show == AB_OFF) - return FALSE; // Auto-bridge disabled - bridge = find_bridge(event_node, ckt, &bridge_list); - if (!bridge) { - /* Fatal, circuit cannot run. */ - - errMsg = tprintf("Can not insert bridge for mixed-type " - "node %s\n", - analog_node->name); - free_bridges(bridge_list); - if (head) - line_free(head, TRUE); - return FALSE; - } - - if (!head) { - /* Add a title card, so it can be skipped over. */ - - head = insert_new_line(lastcard, - copy("* Auto-bridge sub-deck."), - BIG + ln++, 0); - lastcard = head; - } - - if (bridge->setup) { - /* Model/include card for bridge. - * bridge->setup must be dynamic (for tfree()). - */ - - lastcard = insert_new_line(lastcard, bridge->setup, - BIG + ln++, 0); - bridge->setup = NULL; // Output just once. - } - - /* Card buffer full? */ - - nl = (int)strlen(analog_node->name); - if ((bridge->max && bridge->count >= bridge->max) || - bridge->end_index + nl + 2 > (int)(sizeof bridge->held)) { - /* Buffer full, flush card. */ - - lastcard = flush_card(bridge, ln++, lastcard); - } - - /* Copy node name to card contents buffer. */ - - bridge->count++; - if (bridge->end_index) - bridge->held[bridge->end_index++] = ' '; - strcpy(bridge->held + bridge->end_index, analog_node->name); - bridge->end_index += nl; - } - } - } - - /* Flush cards. */ - - for (bridge = bridge_list; bridge; bridge = bridge->next) { - if (bridge->end_index > 0) - lastcard = flush_card(bridge, ln++, lastcard); - } - - if (!head) - return TRUE; // No success, but also no failures - nothing to bridge. - - if (show >= AB_DECK) { - struct card *card; - - for (card = head; card; card = card->nextcard) - printf("%d: %s\n", card->linenum, card->line); - } - - /* Expand .include cards and expressions. */ - - head = expand_deck(head); - if (!head) - return FALSE; - - /* Push the cards into the circuit. */ - - INPpas1(ckt, head, stab); - INPpas2(ckt, head, stab, ft_curckt->ci_defTask); - - /* Store them so that they show in "listing e". */ - - ft_curckt->ci_auto = head; - - free_bridges(bridge_list); - return TRUE; -} diff --git a/src/xspice/evt/evtdeque.c b/src/xspice/evt/evtdeque.c deleted file mode 100644 index 046dd3052..000000000 --- a/src/xspice/evt/evtdeque.c +++ /dev/null @@ -1,363 +0,0 @@ -/*============================================================================ -FILE EVTdequeue.c - -MEMBER OF process XSPICE - -Public Domain - -Georgia Tech Research Corporation -Atlanta, Georgia 30332 -PROJECT A-8503 - -AUTHORS - - 9/12/91 Bill Kuhn - -MODIFICATIONS - - - -SUMMARY - - This file contains function EVTdequeue which removes any items on the - output and instance queues with event times matching the specified - simulation time. - -INTERFACES - - void EVTdequeue(CKTcircuit *ckt, double time) - -REFERENCED FILES - - None. - -NON-STANDARD FEATURES - - None. - -============================================================================*/ - -#include "ngspice/ngspice.h" - -#include "ngspice/cktdefs.h" -//#include "util.h" - -#include "ngspice/mif.h" -#include "ngspice/evt.h" -#include "ngspice/evtudn.h" - -#include "ngspice/evtproto.h" - - -static void EVTdequeue_output(CKTcircuit *ckt, double time); -static void EVTdequeue_inst(CKTcircuit *ckt, double time); - -static void EVTprocess_output( - CKTcircuit *ckt, - int output_index, - void *value); - - -/* -EVTdequeue - -This function removes any items on the output and instance queues -with event times matching the specified simulation time. EVTiter -is then called to determine which instances need to be called. - -*/ - - -void EVTdequeue( - CKTcircuit *ckt, /* The circuit structure */ - double time) /* The event time of the events to dequeue */ -{ - - /* Take all items on output queue with matching time */ - /* and set changed flags in output queue */ - EVTdequeue_output(ckt, time); - - /* Take all items on inst queue with matching time */ - /* and set to_call flags in inst queue */ - EVTdequeue_inst(ckt, time); - -} - - -/* -EVTdequeue_output - -This function de-queues output events with times matching the -specified time. -*/ - -static void EVTdequeue_output( - CKTcircuit *ckt, /* The circuit structure */ - double time) /* The event time of the events to dequeue */ -{ - - int i; - int j; - - int num_pending; - int index; - int output_index; - - double next_time; - double event_time; - - Evt_Output_Queue_t *output_queue; - - Evt_Output_Event_t *output; - Evt_Output_Event_t **output_ptr; - - - /* Get pointers for fast access */ - output_queue = &(ckt->evt->queue.output); - - /* Exit if nothing pending on output queue or if next_time */ - /* != specified time */ - if(output_queue->num_pending == 0) - return; - if(output_queue->next_time != time) - return; - - /* Scan the list of outputs pending */ - num_pending = output_queue->num_pending; - for(i = 0; i < num_pending; i++) { - - /* Get the index of the output */ - index = output_queue->pending_index[i]; - - /* Get pointer to next event in queue at this index */ - output = *(output_queue->current[index]); - - /* If cleaned or event time does not match current time, skip */ - if(!output || output->event_time != time) - continue; - - /* It must match, so pull the event from the queue and process it */ - EVTprocess_output(ckt, index, output->value); - - /* Move current to point to next non-removed item in list */ - output_ptr = &(output->next); - output = *output_ptr; - while(output) { - if(! output->removed) - break; - output_ptr = &(output->next); - output = *output_ptr; - } - output_queue->current[index] = output_ptr; - - /* Mark that this index in the queue has been modified */ - if(! output_queue->modified[index]) { - output_queue->modified[index] = MIF_TRUE; - output_queue->modified_index[(output_queue->num_modified)++] = index; - } - } - - - /* Update/compact the pending list and update the next_time */ - next_time = 1e30; - for(i = 0, j = 0; i < num_pending; i++) { - output_index = output_queue->pending_index[i]; - output = *(output_queue->current[output_index]); - /* If nothing in queue at last_step, remove this index from the pending list */ - if(! output) { - output_queue->pending[output_index] = MIF_FALSE; - (output_queue->num_pending)--; - } - /* else, keep the index and update the next time */ - else { - output_queue->pending_index[j] = output_queue->pending_index[i]; - j++; - event_time = output->event_time; - if(event_time < next_time) - next_time = event_time; - } - } - output_queue->next_time = next_time; - - -} - - - -/* -EVTdequeue_inst - -This function de-queues instance events with times matching the -specified time. -*/ - - -void EVTdequeue_inst( - CKTcircuit *ckt, /* The circuit structure */ - double time) /* The event time of the events to dequeue */ -{ - - int i; - int j; - - int num_pending; - int index; - int inst_index; - - double next_time; - double event_time; - - Evt_Inst_Queue_t *inst_queue; - - Evt_Inst_Event_t *inst; - - - /* Get pointers for fast access */ - inst_queue = &(ckt->evt->queue.inst); - - /* Exit if nothing pending on inst queue or if next_time */ - /* != specified time */ - if(inst_queue->num_pending == 0) - return; - if(inst_queue->next_time != time) - return; - - /* Scan the list of insts pending */ - num_pending = inst_queue->num_pending; - for(i = 0; i < num_pending; i++) { - - /* Get the index of the inst */ - index = inst_queue->pending_index[i]; - - /* Get pointer to next event in queue at this index */ - inst = *(inst_queue->current[index]); - - /* If cleaned or event time does not match current time, skip */ - if(!inst || inst->event_time != time) - continue; - - /* It must match, so pull the event from the queue and process it */ - if(! inst_queue->to_call[index]) { - inst_queue->to_call[index] = MIF_TRUE; - inst_queue->to_call_index[(inst_queue->num_to_call)++] = - index; - } - - /* Move current to point to next item in list */ - inst_queue->current[index] = &(inst->next); - - /* Mark that this index in the queue has been modified */ - if(! inst_queue->modified[index]) { - inst_queue->modified[index] = MIF_TRUE; - inst_queue->modified_index[(inst_queue->num_modified)++] = index; - } - } - - - /* Update/compact the pending list and update the next_time */ - next_time = 1e30; - for(i = 0, j = 0; i < num_pending; i++) { - inst_index = inst_queue->pending_index[i]; - inst = *(inst_queue->current[inst_index]); - /* If nothing in queue at last_step, remove this index from the pending list */ - if(! inst) { - inst_queue->pending[inst_index] = MIF_FALSE; - (inst_queue->num_pending)--; - } - /* else, keep the index and update the next time */ - else { - inst_queue->pending_index[j] = inst_queue->pending_index[i]; - j++; - event_time = inst->event_time; - if(event_time < next_time) - next_time = event_time; - } - } - inst_queue->next_time = next_time; - - - -} - - - -/* -EVTprocess_output - -This function processes a specified output after it is pulled -from the queue. -*/ - - -static void EVTprocess_output( - CKTcircuit *ckt, /* The circuit structure */ - int output_index, /* The index of the output to process */ - void *value) /* The output value */ -{ - - int num_outputs; - int node_index; - int udn_index; - int output_subindex; - - Evt_Output_Info_t **output_table; - Evt_Node_Info_t **node_table; - - Evt_Node_t *rhs; - Evt_Node_t *rhsold; - - Evt_Output_Queue_t *output_queue; - - Mif_Boolean_t equal; - - - output_table = ckt->evt->info.output_table; - node_table = ckt->evt->info.node_table; - - node_index = output_table[output_index]->node_index; - num_outputs = node_table[node_index]->num_outputs; - udn_index = node_table[node_index]->udn_index; - - rhs = ckt->evt->data.node->rhs; - rhsold = ckt->evt->data.node->rhsold; - - /* Determine if output is different from rhsold value */ - /* and copy it to rhs AND rhsold if so */ - /* This is somewhat inefficient, but that's the way */ - /* we have setup the structures (rhs and rhsold must match)... */ - if(num_outputs > 1) { - output_subindex = output_table[output_index]->output_subindex; - g_evt_udn_info[udn_index]->compare - (value, - rhsold[node_index].output_value[output_subindex], - &equal); - if(! equal) { - g_evt_udn_info[udn_index]->copy - (value, rhs[node_index].output_value[output_subindex]); - g_evt_udn_info[udn_index]->copy - (value, rhsold[node_index].output_value[output_subindex]); - } - } - else { - g_evt_udn_info[udn_index]->compare - (value, - rhsold[node_index].node_value, - &equal); - if(! equal) { - g_evt_udn_info[udn_index]->copy - (value, rhs[node_index].node_value); - g_evt_udn_info[udn_index]->copy - (value, rhsold[node_index].node_value); - } - } - - /* If different, put in changed list of output queue */ - if(! equal) { - output_queue = &(ckt->evt->queue.output); - if(! output_queue->changed[output_index]) { - output_queue->changed[output_index] = MIF_TRUE; - output_queue->changed_index[(output_queue->num_changed)++] = - output_index; - } - } -} diff --git a/src/xspice/evt/evtdest.c b/src/xspice/evt/evtdest.c deleted file mode 100644 index 454f1a94e..000000000 --- a/src/xspice/evt/evtdest.c +++ /dev/null @@ -1,340 +0,0 @@ -#include "ngspice/ngspice.h" -#include "ngspice/iferrmsg.h" - -#include "ngspice/evt.h" -#include "ngspice/evtproto.h" - - -static void Evt_Node_destroy(Evt_Node_Info_t *info, Evt_Node_t *node); -static void Evt_Node_Data_destroy(Evt_Ckt_Data_t *evt, Evt_Node_Data_t *node_data); -static void Evt_Msg_Data_destroy(Evt_Ckt_Data_t *evt, Evt_Msg_Data_t *msg_data); -static void Evt_Queue_destroy(Evt_Ckt_Data_t *evt, Evt_Queue_t *queue); -static void Evt_State_Data_destroy(Evt_Ckt_Data_t *evt, Evt_State_Data_t *state_data); -//static void Evt_Data_destroy(Evt_Ckt_Data_t *evt, Evt_Data_t *data); -static void Evt_Job_destroy(Evt_Ckt_Data_t* evt, Evt_Job_t *job); -static void Evt_Info_destroy(Evt_Info_t *info); - - -int -EVTdest(Evt_Ckt_Data_t *evt) -{ - /* Exit immediately if no event-driven instances in circuit */ - if (evt->counts.num_insts == 0) - return OK; - - Evt_Queue_destroy(evt, & evt->queue); - /* evt->data is removed during Evt_Job_destroy() */ - Evt_Job_destroy(evt, & evt->jobs); - Evt_Info_destroy(& evt->info); - - return OK; -} - -static void free_events(Evt_Inst_Event_t *event) -{ - while (event) { - Evt_Inst_Event_t *next = event->next; - tfree(event); - event = next; - } -} - -static void -Evt_Queue_destroy(Evt_Ckt_Data_t *evt, Evt_Queue_t *queue) -{ - Evt_Output_Queue_t *output_queue = &(queue->output); - Evt_Node_Queue_t *node_queue = &(queue->node); - Evt_Inst_Queue_t *inst_queue = &(queue->inst); - - int i; - - for (i = 0; i < evt->counts.num_insts; i++) { - free_events(inst_queue->head[i]); - free_events(inst_queue->free[i]); - } - - tfree(inst_queue->head); - tfree(inst_queue->current); - tfree(inst_queue->last_step); - tfree(inst_queue->free); - - tfree(inst_queue->modified_index); - tfree(inst_queue->modified); - tfree(inst_queue->pending_index); - tfree(inst_queue->pending); - tfree(inst_queue->to_call_index); - tfree(inst_queue->to_call); - - /* node queue */ - - tfree(node_queue->to_eval_index); - tfree(node_queue->to_eval); - tfree(node_queue->changed_index); - tfree(node_queue->changed); - - /* output queue */ - for (i = 0; i < evt->counts.num_outputs; i++) { - Evt_Output_Event_t *event; - event = output_queue->head[i]; - while (event) { - Evt_Output_Event_t *next = event->next; - tfree(event->value); - tfree(event); - event = next; - } - event = output_queue->free[i]; - while (event) { - Evt_Output_Event_t *next = event->next; - tfree(event->value); - tfree(event); - event = next; - } - } - tfree(output_queue->head); - tfree(output_queue->current); - tfree(output_queue->last_step); - tfree(output_queue->free); - - tfree(output_queue->modified_index); - tfree(output_queue->modified); - tfree(output_queue->pending_index); - tfree(output_queue->pending); - tfree(output_queue->changed_index); - tfree(output_queue->changed); -} - -/* -static void -Evt_Data_destroy(Evt_Ckt_Data_t *evt, Evt_Data_t *data) -{ - Evt_State_Data_destroy(evt, data->state); - Evt_Node_Data_destroy(evt, data->node); - Evt_Msg_Data_destroy(evt, data->msg); - - tfree(data->node); - tfree(data->state); - tfree(data->msg); - tfree(data->statistics); -} -*/ - -static void free_state(Evt_State_t *state) -{ - while (state) { - Evt_State_t *next = state->next; - tfree(state->block); - tfree(state); - state = next; - } -} - -static void -Evt_State_Data_destroy(Evt_Ckt_Data_t *evt, Evt_State_Data_t *state_data) -{ - int i; - - if (!state_data) - return; - - for (i = 0; i < evt->counts.num_insts; i++) { - free_state(state_data->head[i]); - free_state(state_data->free[i]); - } - - tfree(state_data->head); - tfree(state_data->tail); - tfree(state_data->last_step); - tfree(state_data->free); - - tfree(state_data->modified); - tfree(state_data->modified_index); - tfree(state_data->total_size); - - for (i = 0; i < evt->counts.num_insts; i++) { - Evt_State_Desc_t *p = state_data->desc[i]; - while (p) { - Evt_State_Desc_t *next_p = p->next; - tfree(p); - p = next_p; - } - } - - tfree(state_data->desc); -} - - -static void -Evt_Node_Data_destroy(Evt_Ckt_Data_t *evt, Evt_Node_Data_t *node_data) -{ - int i; - - if (!node_data) - return; - - for (i = 0; i < evt->counts.num_nodes; i++) { - Evt_Node_Info_t *info = evt->info.node_table[i]; - Evt_Node_t *node; - node = node_data->head[i]; - while (node) { - Evt_Node_t *next = node->next; - Evt_Node_destroy(info, node); - tfree(node); - node = next; - } - node = node_data->free[i]; - while (node) { - Evt_Node_t *next = node->next; - Evt_Node_destroy(info, node); - tfree(node); - node = next; - } - } - tfree(node_data->head); - tfree(node_data->tail); - tfree(node_data->last_step); - tfree(node_data->free); - - tfree(node_data->modified); - tfree(node_data->modified_index); - - for (i = 0; i < evt->counts.num_nodes; i++) { - Evt_Node_Info_t *info = evt->info.node_table[i]; - Evt_Node_destroy(info, &(node_data->rhs[i])); - Evt_Node_destroy(info, &(node_data->rhsold[i])); - } - - tfree(node_data->rhs); - tfree(node_data->rhsold); - tfree(node_data->total_load); -} - - -static void -Evt_Node_destroy(Evt_Node_Info_t *info, Evt_Node_t *node) -{ - tfree(node->node_value); - tfree(node->inverted_value); - - if (node->output_value) { - int k = info->num_outputs; - while (--k >= 0) - tfree(node->output_value[k]); - tfree(node->output_value); - } -} - - -static void -Evt_Msg_Data_destroy(Evt_Ckt_Data_t *evt, Evt_Msg_Data_t *msg_data) -{ - int i; - - if (!msg_data) - return; - - for (i = 0; i < evt->counts.num_ports; i++) { - Evt_Msg_t *msg; - msg = msg_data->head[i]; - while (msg) { - Evt_Msg_t *next = msg->next; - if (msg->text) - tfree(msg->text); - tfree(msg); - msg = next; - } - msg = msg_data->free[i]; - while (msg) { - Evt_Msg_t *next = msg->next; - if (msg->text) - tfree(msg->text); - tfree(msg); - msg = next; - } - } - - tfree(msg_data->head); - tfree(msg_data->tail); - tfree(msg_data->last_step); - tfree(msg_data->free); - - tfree(msg_data->modified); - tfree(msg_data->modified_index); -} - - -static void -Evt_Job_destroy(Evt_Ckt_Data_t* evt, Evt_Job_t *job) -{ - int i; - - for (i = 0; i < job->num_jobs; i++) { - tfree(job->job_name[i]); - tfree(job->job_plot[i]); - - Evt_State_Data_destroy(evt, job->state_data[i]); - Evt_Node_Data_destroy(evt, job->node_data[i]); - Evt_Msg_Data_destroy(evt, job->msg_data[i]); - tfree(job->state_data[i]); - tfree(job->node_data[i]); - tfree(job->msg_data[i]); - tfree(job->statistics[i]); - } - - tfree(job->job_name); - tfree(job->job_plot); - tfree(job->node_data); - tfree(job->state_data); - tfree(job->msg_data); - tfree(job->statistics); -} - - -static void -Evt_Info_destroy(Evt_Info_t *info) -{ - Evt_Inst_Info_t *inst = info->inst_list; - while (inst) { - Evt_Inst_Info_t *next_inst = inst->next; - tfree(inst); - inst = next_inst; - } - tfree(info->inst_table); - - Evt_Node_Info_t *nodei = info->node_list; - while (nodei) { - Evt_Node_Info_t *next_nodei = nodei->next; - tfree(nodei->name); - - Evt_Inst_Index_t *p = nodei->inst_list; - while (p) { - Evt_Inst_Index_t *next_p = p->next; - tfree(p); - p = next_p; - } - - tfree(nodei); - nodei = next_nodei; - } - tfree(info->node_table); - - Evt_Port_Info_t *port = info->port_list; - while (port) { - Evt_Port_Info_t *next_port = port->next; - tfree(port->node_name); - tfree(port->inst_name); - tfree(port->conn_name); - tfree(port); - port = next_port; - } - tfree(info->port_table); - - Evt_Output_Info_t *output = info->output_list; - while (output) { - Evt_Output_Info_t *next_output = output->next; - tfree(output); - output = next_output; - } - tfree(info->output_table); - - tfree(info->hybrid_index); -} diff --git a/src/xspice/evt/evtdump.c b/src/xspice/evt/evtdump.c deleted file mode 100644 index 2f1c6db61..000000000 --- a/src/xspice/evt/evtdump.c +++ /dev/null @@ -1,598 +0,0 @@ -/*============================================================================ -FILE EVTdump.c - -MEMBER OF process XSPICE - -Public Domain - -Georgia Tech Research Corporation -Atlanta, Georgia 30332 -PROJECT A-8503 - -AUTHORS - - 6/15/92 Bill Kuhn - -MODIFICATIONS - - 06/05/17 Holger Vogt Shared ngspice additions - -SUMMARY - - This file contains functions used - to send event-driven node results data to the IPC channel when - the simulator is used with CAE software. - It also sends data to a caller via callback, if shared ngspice - is enabled. - -INTERFACES - - EVTdump() - EVTshareddump() - -REFERENCED FILES - - None. - -NON-STANDARD FEATURES - - None. - -============================================================================*/ - - -#include "ngspice/ngspice.h" -//#include "misc.h" - -#include "ngspice/cktdefs.h" -//#include "util.h" -#include "ngspice/sperror.h" - -#include "ngspice/mif.h" -#include "ngspice/evt.h" -#include "ngspice/evtproto.h" -#include "ngspice/evtudn.h" - -#include "ngspice/ipc.h" -#include "ngspice/ipctiein.h" -#include "ngspice/ipcproto.h" - -#ifdef SHARED_MODULE -/* global flag, TRUE if callback is used */ -extern bool wantevtdata; -extern void shared_send_event(int, double, double, char *, void *, int, int); -extern void shared_send_dict(int, int, char*, char*); -static void EVTshareddump( - CKTcircuit *ckt, /* The circuit structure */ - Ipc_Anal_t mode, /* The analysis mode for this call */ - double step); /* The sweep step for a DCTRCURVE analysis, or */ - /* 0.0 for DCOP and TRAN */ - -static void EVTsharedsend_line( - int ipc_index, /* The index used in the dictionary */ - double step, /* The analysis step */ - void *node_value, /* The node value */ - int udn_index, /* The user-defined node index */ - int mode); /* mode (op, dc, tran) we are in */ -#endif - -static void EVTsend_line( - int ipc_index, /* The index used in the dictionary */ - double step, /* The analysis step */ - void *node_value, /* The node value */ - int udn_index); /* The user-defined node index */ - - - -/* -EVTdump - -This function is called to send event-driven node data to the IPC -channel. A ``mode'' argument determines how the data is located in -the event data structure and what data is sent. - -If the mode is DCOP, then this is necessarily the first call to -the function. In this case, the set of event-driven nodes is -scanned to determine which should be sent. Only nodes that are -not inside subcircuits are sent. Next, the function sends -a ``dictionary'' of node names/types vs. node indexes. -Finally, the function sends the DC operating point solutions -for the event-driven nodes in the dictionary. - -If the mode is DCTRCURVE, it is assumed that the function has -already been called with mode = DCOP. The function scans the solution -vector and sends data for any nodes that have changed. - -If the mode is TRAN, it is assumed that the function has already -been called once with mode = DCOP. The function scans the -event data for nodes that have changed since the last accepted -analog timepoint and sends the new data. - -Note: This function must be called BEFORE calling EVTop_save or -EVTaccept() so that the state of the node data structure will allow -it to determine what has changed. -*/ - - -typedef struct evtdump_s { - Mif_Boolean_t send; /* True if this node should be sent */ - int ipc_index; /* Index for this node in dict sent to CAE system */ - char *node_name_str; /* Node name */ - char *udn_type_str; /* UDN type */ -} evtdump_dict_t; - - - -void EVTdump( - CKTcircuit *ckt, /* The circuit structure */ - Ipc_Anal_t mode, /* The analysis mode for this call */ - double step) /* The sweep step for a DCTRCURVE analysis, or */ - /* 0.0 for DCOP and TRAN */ -{ - static evtdump_dict_t *node_dict = NULL; - static int num_send_nodes; - - int i; - int j; - int num_nodes; - int num_modified; - int index; - - char *name; - int name_len; - - Mif_Boolean_t firstcall; - - Evt_Node_Data_t *node_data; - - Evt_Node_t *rhsold; - Evt_Node_t **head; - Evt_Node_t *here; - - Evt_Node_Info_t **node_table; - - char buff[10000]; - - Mif_Boolean_t equal; - -#ifdef SHARED_MODULE - if((! g_ipc.enabled) && (!wantevtdata)) - return; - if ((!g_ipc.enabled) && (wantevtdata)) { - EVTshareddump(ckt, mode, step); - return; - } -#else - /* Return immediately if IPC is not enabled */ - if(! g_ipc.enabled) - return; -#endif - /* Get number of event-driven nodes */ - num_nodes = ckt->evt->counts.num_nodes; - - /* Exit immediately if no event-driven nodes in circuit */ - if(num_nodes <= 0) - return; - - - /* Get pointers for fast access to event data */ - node_data = ckt->evt->data.node; - node_table = ckt->evt->info.node_table; - rhsold = node_data->rhsold; - head = node_data->head; - - - /* Determine if this is the first call */ - if(node_dict == NULL) - firstcall = MIF_TRUE; - else - firstcall = MIF_FALSE; - - - /* If this is the first call, get the dictionary info */ - if(firstcall) { - - /* Allocate local data structure used to process nodes */ - node_dict = TMALLOC(evtdump_dict_t, num_nodes); - - /* Loop through all nodes to determine which nodes should be sent. */ - /* Only nodes not within subcircuits qualify. */ - - num_send_nodes = 0; - for(i = 0; i < num_nodes; i++) { - - /* Get the name of the node. */ - name = node_table[i]->name; - - /* If name is in a subcircuit, mark that node should not be sent */ - /* and continue to next node. */ - name_len = (int) strlen(name); - for(j = 0; j < name_len; j++) { - if(name[j] == ':') - break; - } - if(j < name_len) { - node_dict[i].send = MIF_FALSE; - continue; - } - - /* Otherwise, fill in info in dictionary. */ - node_dict[i].send = MIF_TRUE; - node_dict[i].ipc_index = num_send_nodes; - node_dict[i].node_name_str = name; - node_dict[i].udn_type_str = g_evt_udn_info[node_table[i]->udn_index]->name; - - /* Increment the count of nodes to be sent. */ - num_send_nodes++; - } /* end for */ - } /* end if first call */ - - - /* Exit if there are no nodes to be sent */ - if(num_send_nodes <= 0) - return; - - - /* If this is the first call, send the dictionary */ - if(firstcall) { - ipc_send_evtdict_prefix(); - for(i = 0; i < num_nodes; i++) { - if(node_dict[i].send) { - sprintf(buff, "%d %s %s", node_dict[i].ipc_index, - node_dict[i].node_name_str, - node_dict[i].udn_type_str); - ipc_send_line(buff); - } - } - ipc_send_evtdict_suffix(); - } - - /* If this is the first call, send the operating point solution */ - /* and return. */ - if(firstcall) { - ipc_send_evtdata_prefix(); - for(i = 0; i < num_nodes; i++) { - if(node_dict[i].send) { - EVTsend_line(node_dict[i].ipc_index, - step, - rhsold[i].node_value, - node_table[i]->udn_index); - } - } - ipc_send_evtdata_suffix(); - return; - } - - /* Otherwise, this must be DCTRCURVE or TRAN mode and we need to */ - /* send only stuff that has changed since the last call. */ - /* The determination of what to send is modeled after code in */ - /* EVTop_save() for DCTRCURVE and EVTaccept() for TRAN. */ - - if(mode == IPC_ANAL_DCTRCURVE) { - /* Send data prefix */ - ipc_send_evtdata_prefix(); - /* Loop through event nodes */ - for(i = 0; i < num_nodes; i++) { - /* If dictionary indicates this node should be sent */ - if(node_dict[i].send) { - /* Locate end of node data */ - here = head[i]; - for(;;) { - if(here->next) - here = here->next; - else - break; - } - /* Compare entry at end of list to rhsold */ - g_evt_udn_info[node_table[i]->udn_index]->compare ( - rhsold[i].node_value, - here->node_value, - &equal); - /* If value in rhsold is different, send it */ - if(!equal) { - EVTsend_line(node_dict[i].ipc_index, - step, - rhsold[i].node_value, - node_table[i]->udn_index); - } - } - } - /* Send data suffix and return */ - ipc_send_evtdata_suffix(); - return; - } - - - if(mode == IPC_ANAL_TRAN) { - /* Send data prefix */ - ipc_send_evtdata_prefix(); - /* Loop through list of nodes modified since last time */ - num_modified = node_data->num_modified; - for(i = 0; i < num_modified; i++) { - /* Get the index of the node modified */ - index = node_data->modified_index[i]; - /* If dictionary indicates this node should be sent */ - if(node_dict[index].send) { - /* Scan through new events and send the data for each event */ - here = *(node_data->last_step[index]); - while((here = here->next) != NULL) { - EVTsend_line(node_dict[index].ipc_index, - here->step, - here->node_value, - node_table[index]->udn_index); - } - } - } - /* Send data suffix and return */ - ipc_send_evtdata_suffix(); - return; - } - -} - - - -/* -EVTsend_line - -This function formats the event node data and sends it to the IPC channel. -*/ - - -static void EVTsend_line( - int ipc_index, /* The index used in the dictionary */ - double step, /* The analysis step */ - void *node_value, /* The node value */ - int udn_index) /* The user-defined node index */ -{ - double dvalue; - char *svalue; - void *pvalue; - int len; - - /* Get the data to send */ - if(g_evt_udn_info[udn_index]->plot_val) - g_evt_udn_info[udn_index]->plot_val (node_value, "", &dvalue); - else - dvalue = 0.0; - - if(g_evt_udn_info[udn_index]->print_val) - g_evt_udn_info[udn_index]->print_val (node_value, "", &svalue); - else - svalue = ""; - - if(g_evt_udn_info[udn_index]->ipc_val) - g_evt_udn_info[udn_index]->ipc_val (node_value, &pvalue, &len); - else { - pvalue = NULL; - len = 0; - } - - /* Send it to the IPC channel */ - ipc_send_event(ipc_index, step, dvalue, svalue, pvalue, len); -} - - -#ifdef SHARED_MODULE -static void EVTshareddump( - CKTcircuit *ckt, /* The circuit structure */ - Ipc_Anal_t mode, /* The analysis mode for this call */ - double step) /* The sweep step for a DCTRCURVE analysis, or */ - /* 0.0 for DCOP and TRAN */ -{ - static evtdump_dict_t *node_dict = NULL; - static int num_send_nodes; - - int i; - int j; - int num_nodes; - int num_modified; - int index; - - char *name; - int name_len; - - Mif_Boolean_t firstcall; - - Evt_Node_Data_t *node_data; - - Evt_Node_t *rhsold; - Evt_Node_t **head; - Evt_Node_t *here; - - Evt_Node_Info_t **node_table; - - Mif_Boolean_t equal; - - /* Get number of event-driven nodes */ - num_nodes = ckt->evt->counts.num_nodes; - - /* Exit immediately if no event-driven nodes in circuit */ - if (num_nodes <= 0) - return; - - - /* Get pointers for fast access to event data */ - node_data = ckt->evt->data.node; - node_table = ckt->evt->info.node_table; - rhsold = node_data->rhsold; - head = node_data->head; - - - /* Determine if this is the first call */ - if (node_dict == NULL) - firstcall = MIF_TRUE; - else - firstcall = MIF_FALSE; - - - /* If this is the first call, get the dictionary info */ - if (firstcall) { - - /* Allocate local data structure used to process nodes */ - node_dict = TMALLOC(evtdump_dict_t, num_nodes); - - /* Loop through all nodes to determine which nodes should be sent. */ - /* Only nodes not within subcircuits qualify. */ - - num_send_nodes = 0; - for (i = 0; i < num_nodes; i++) { - - /* Get the name of the node. */ - name = node_table[i]->name; - - /* If name is in a subcircuit, mark that node should not be sent */ - /* and continue to next node. */ - name_len = (int)strlen(name); - for (j = 0; j < name_len; j++) { - if (name[j] == ':') - break; - } - if (j < name_len) { - node_dict[i].send = MIF_FALSE; - continue; - } - - /* Otherwise, fill in info in dictionary. */ - node_dict[i].send = MIF_TRUE; - node_dict[i].ipc_index = num_send_nodes; - node_dict[i].node_name_str = name; - node_dict[i].udn_type_str = g_evt_udn_info[node_table[i]->udn_index]->name; - - /* Increment the count of nodes to be sent. */ - num_send_nodes++; - } /* end for */ - } /* end if first call */ - - /* Exit if there are no nodes to be sent */ - if (num_send_nodes <= 0) - return; - - /* If this is the first call, send the dictionary (the list of event nodes, line by line) */ - if (firstcall) { - for (i = 0; i < num_nodes; i++) { - if (node_dict[i].send) - shared_send_dict(node_dict[i].ipc_index, num_nodes, node_dict[i].node_name_str, node_dict[i].udn_type_str); - } - } - - /* If this is the first call, send the operating point solution */ - /* and return. */ - if (firstcall) { - for (i = 0; i < num_nodes; i++) { - if (node_dict[i].send) { - EVTsharedsend_line(node_dict[i].ipc_index, - step, - rhsold[i].node_value, - node_table[i]->udn_index, - mode); - } - } - return; - } - - /* Otherwise, this must be DCTRCURVE or TRAN mode and we need to */ - /* send only stuff that has changed since the last call. */ - /* The determination of what to send is modeled after code in */ - /* EVTop_save() for DCTRCURVE and EVTaccept() for TRAN. */ - - if (mode == IPC_ANAL_DCTRCURVE) { - /* Send data prefix */ - /* Loop through event nodes */ - for (i = 0; i < num_nodes; i++) { - /* If dictionary indicates this node should be sent */ - if (node_dict[i].send) { - /* Locate end of node data */ - here = head[i]; - for (;;) { - if (here->next) - here = here->next; - else - break; - } - /* Compare entry at end of list to rhsold */ - g_evt_udn_info[node_table[i]->udn_index]->compare( - rhsold[i].node_value, - here->node_value, - &equal); - /* If value in rhsold is different, send it */ - if (!equal) { - EVTsharedsend_line(node_dict[i].ipc_index, - step, - rhsold[i].node_value, - node_table[i]->udn_index, - mode); - } - } - } - return; - } - - - if (mode == IPC_ANAL_TRAN) { - /* Loop through list of nodes modified since last time */ - num_modified = node_data->num_modified; - for (i = 0; i < num_modified; i++) { - /* Get the index of the node modified */ - index = node_data->modified_index[i]; - /* If dictionary indicates this node should be sent */ - if (node_dict[index].send) { - /* Scan through new events and send the data for each event */ - here = *(node_data->last_step[index]); - while ((here = here->next) != NULL) { - EVTsharedsend_line(node_dict[index].ipc_index, - here->step, - here->node_value, - node_table[index]->udn_index, - mode); - } - } - } - return; - } - -} - -/* -EVTsharedsend_line - -This function formats the event node data and sends it to the caller via sharedspice.c. -*/ - - -static void EVTsharedsend_line( - int dict_index, /* The index used in the dictionary */ - double step, /* The analysis step */ - void *node_value, /* The node value */ - int udn_index, /* The user-defined node index */ - int mode) /* the mode (op, dc, tran) we are in */ -{ - double dvalue; - char *svalue; - void *pvalue; - int len; - - /* Get the data to send */ - if (g_evt_udn_info[udn_index]->plot_val) - g_evt_udn_info[udn_index]->plot_val(node_value, "", &dvalue); - else - dvalue = 0.0; - - if (g_evt_udn_info[udn_index]->print_val) - g_evt_udn_info[udn_index]->print_val(node_value, "", &svalue); - else - svalue = ""; - - if (g_evt_udn_info[udn_index]->ipc_val) - g_evt_udn_info[udn_index]->ipc_val(node_value, &pvalue, &len); - else { - pvalue = NULL; - len = 0; - } - - /* Send it to sharedspice.c */ - shared_send_event(dict_index, step, dvalue, svalue, pvalue, len, mode); -} - - -#endif diff --git a/src/xspice/evt/evtinit.c b/src/xspice/evt/evtinit.c deleted file mode 100644 index 1f2b1a041..000000000 --- a/src/xspice/evt/evtinit.c +++ /dev/null @@ -1,372 +0,0 @@ -/*============================================================================ -FILE EVTinit.c - -MEMBER OF process XSPICE - -Public Domain - -Georgia Tech Research Corporation -Atlanta, Georgia 30332 -PROJECT A-8503 - -AUTHORS - - 9/12/91 Bill Kuhn - -MODIFICATIONS - - - -SUMMARY - - This file contains function EVTinit which allocates and initializes - evt structure elements after the number of instances, nodes, etc. - have been determined in parsing during INPpas2. EVTinit also checks - to be sure no nodes have been used for both analog and event-driven - algorithms simultaneously. - -INTERFACES - - int EVTinit(CKTcircuit *ckt) - -REFERENCED FILES - - None. - -NON-STANDARD FEATURES - - None. - -============================================================================*/ - -#include "ngspice/ngspice.h" -#include "ngspice/cktdefs.h" -//#include "util.h" -#include "ngspice/sperror.h" - -#include "ngspice/evt.h" -#include "ngspice/evtproto.h" - - -static int EVTcount_hybrids(CKTcircuit *ckt); -static int EVTinit_info(CKTcircuit *ckt); -static int EVTinit_queue(CKTcircuit *ckt); -static int EVTinit_limits(CKTcircuit *ckt); - - - -/* Allocation macro with built-in check for out-of-memory */ -/* Adapted from SPICE 3C1 code in CKTsetup.c */ -#define CKALLOC(var,size,type) \ - if(size) { \ - if((var = TMALLOC(type, size)) == NULL) \ - return(E_NOMEM); \ - } - - -/* -EVTinit - -Allocate and initialize additional evt structure elements now that -we can determine the number of instances, nodes, etc. - -Also check to be sure that no nodes have been used in both event-driven -and analog domains. - -In this version, we also report an error if there are no hybrids in the -circuit. This restriction may be removed in the future to allow the -simulator to be used with digital only circuits... -*/ - - -int EVTinit( - CKTcircuit *ckt) /* the circuit structure */ -{ - - int err; /* SPICE error return code 0 = OK */ - - /* Exit immediately if there are no event-driven instances */ - /* but don't complain */ - if(ckt->evt->counts.num_insts == 0) - return(OK); - - /* Count the number of hybrids and hybrid outputs */ - err = EVTcount_hybrids(ckt); - if(err) - return(err); - - /* Create info table arrays */ - err = EVTinit_info(ckt); - if(err) - return(err); - - /* Setup queues */ - err = EVTinit_queue(ckt); - if(err) - return(err); - - /* Initialize limits */ - err = EVTinit_limits(ckt); - if(err) - return(err); - - /* Note: Options were initialized in CKTinit so that INPpas2 */ - /* could set values according to .options cards in deck. The */ - /* structure 'jobs' will be setup immediately prior to each */ - /* simulation job. The results data structure is also */ - /* allocated immediately prior to each simulation job. */ - - /* Return */ - return(OK); -} - - -/* -EVTcount_hybrids - -Count the number of hybrids and the number of outputs on all hybrids. -*/ - -static int EVTcount_hybrids( - CKTcircuit *ckt) /* The circuit structure */ -{ - - int i; - int j; - - int num_hybrids; - int num_hybrid_outputs; - int num_conn; - int num_port; - - MIFinstance *fast; - - Evt_Inst_Info_t *inst; - - - /* Count number of hybrids and hybrid outputs in the inst list */ - /* created during parsing. Note: other counts */ - /* are created during parsing, but these were */ - /* too difficult to do until now... */ - num_hybrids = 0; - num_hybrid_outputs = 0; - inst = ckt->evt->info.inst_list; - while(inst) { - fast = inst->inst_ptr; - if(fast->analog && fast->event_driven) { - num_hybrids++; - num_conn = fast->num_conn; - for(i = 0; i < num_conn; i++) { - if((! fast->conn[i]->is_null) && (fast->conn[i]->is_output)) { - num_port = fast->conn[i]->size; - for(j = 0; j < num_port; j++) - if(! fast->conn[i]->port[j]->is_null) - num_hybrid_outputs++; - } - } - } - inst = inst->next; - } - ckt->evt->counts.num_hybrids = num_hybrids; - ckt->evt->counts.num_hybrid_outputs = num_hybrid_outputs; - - return(OK); -} - - -/* -EVTinit_info - -This function creates the ``info'' pointer tables used in the -event-driven circuit representation. These arrays allow faster -access to data associated with instances, nodes, ports, and -outputs than could be provided by having to scan the linked-list -representations created during parsing. -*/ - - -static int EVTinit_info( - CKTcircuit *ckt) /* the circuit structure */ -{ - - int i; - int j; - - int num_insts; - int num_nodes; - int num_ports; - int num_outputs; - - Evt_Inst_Info_t *inst; - Evt_Node_Info_t *node; - Evt_Port_Info_t *port; - Evt_Output_Info_t *output; - - Evt_Inst_Info_t **inst_table = NULL; - Evt_Node_Info_t **node_table = NULL; - Evt_Port_Info_t **port_table = NULL; - Evt_Output_Info_t **output_table = NULL; - - int *hybrid_index = NULL; - - int num_hybrids; - - - /* Allocate and initialize table of inst pointers */ - num_insts = ckt->evt->counts.num_insts; - CKALLOC(inst_table, num_insts, Evt_Inst_Info_t *) - inst = ckt->evt->info.inst_list; - for(i = 0; i < num_insts; i++) { - inst_table[i] = inst; - inst = inst->next; - } - ckt->evt->info.inst_table = inst_table; - - /* Allocate and initialize table of node pointers */ - num_nodes = ckt->evt->counts.num_nodes; - CKALLOC(node_table, num_nodes, Evt_Node_Info_t *) - node = ckt->evt->info.node_list; - for(i = 0; i < num_nodes; i++) { - node_table[i] = node; - node = node->next; - } - ckt->evt->info.node_table = node_table; - - /* Allocate and initialize table of port pointers */ - num_ports = ckt->evt->counts.num_ports; - CKALLOC(port_table, num_ports, Evt_Port_Info_t *) - port = ckt->evt->info.port_list; - for(i = 0; i < num_ports; i++) { - port_table[i] = port; - port = port->next; - } - ckt->evt->info.port_table = port_table; - - /* Allocate and initialize table of output pointers */ - num_outputs = ckt->evt->counts.num_outputs; - CKALLOC(output_table, num_outputs, Evt_Output_Info_t *) - output = ckt->evt->info.output_list; - for(i = 0; i < num_outputs; i++) { - output_table[i] = output; - output = output->next; - } - ckt->evt->info.output_table = output_table; - - - /* Allocate and create table of indexes into inst_table for hybrids */ - num_hybrids = ckt->evt->counts.num_hybrids; - CKALLOC(hybrid_index, num_hybrids, int) - for(i = 0, j = 0; i < num_insts; i++) { - if(inst_table[i]->inst_ptr->analog) - hybrid_index[j++] = i; - } - ckt->evt->info.hybrid_index = hybrid_index; - - - /* Return */ - return(OK); -} - - - -/* -EVTinit_queue - -This function prepares the event-driven queues for simulation. -*/ - - -static int EVTinit_queue( - CKTcircuit *ckt) /* the circuit structure */ -{ - - int num_insts; - int num_nodes; - int num_outputs; - - Evt_Inst_Queue_t *inst_queue; - Evt_Node_Queue_t *node_queue; - Evt_Output_Queue_t *output_queue; - - - /* Allocate elements in the inst queue */ - - num_insts = ckt->evt->counts.num_insts; - inst_queue = &(ckt->evt->queue.inst); - - CKALLOC(inst_queue->head, num_insts, Evt_Inst_Event_t *) - CKALLOC(inst_queue->current, num_insts, Evt_Inst_Event_t **) - CKALLOC(inst_queue->last_step, num_insts, Evt_Inst_Event_t **) - CKALLOC(inst_queue->free, num_insts, Evt_Inst_Event_t *) - CKALLOC(inst_queue->modified_index, num_insts, int) - CKALLOC(inst_queue->modified, num_insts, Mif_Boolean_t) - CKALLOC(inst_queue->pending_index, num_insts, int) - CKALLOC(inst_queue->pending, num_insts, Mif_Boolean_t) - CKALLOC(inst_queue->to_call_index, num_insts, int) - CKALLOC(inst_queue->to_call, num_insts, Mif_Boolean_t) - - - /* Allocate elements in the node queue */ - - num_nodes = ckt->evt->counts.num_nodes; - node_queue = &(ckt->evt->queue.node); - - CKALLOC(node_queue->to_eval_index, num_nodes, int) - CKALLOC(node_queue->to_eval, num_nodes, Mif_Boolean_t) - CKALLOC(node_queue->changed_index, num_nodes, int) - CKALLOC(node_queue->changed, num_nodes, Mif_Boolean_t) - - - /* Allocate elements in the output queue */ - - num_outputs = ckt->evt->counts.num_outputs; - output_queue = &(ckt->evt->queue.output); - - CKALLOC(output_queue->head, num_outputs, Evt_Output_Event_t *) - CKALLOC(output_queue->current, num_outputs, Evt_Output_Event_t **) - CKALLOC(output_queue->last_step, num_outputs, Evt_Output_Event_t **) - CKALLOC(output_queue->free, num_outputs, Evt_Output_Event_t *) - CKALLOC(output_queue->modified_index, num_outputs, int) - CKALLOC(output_queue->modified, num_outputs, Mif_Boolean_t) - CKALLOC(output_queue->pending_index, num_outputs, int) - CKALLOC(output_queue->pending, num_outputs, Mif_Boolean_t) - CKALLOC(output_queue->changed_index, num_outputs, int) - CKALLOC(output_queue->changed, num_outputs, Mif_Boolean_t) - - - /* Return */ - return(OK); -} - - - - -/* -EVTinit_limits - -This function initializes the iteration limits applicable to the -event-driven algorithm. -*/ - - -static int EVTinit_limits( - CKTcircuit *ckt) /* the circuit structure */ -{ - - /* Set maximum number of event load calls within a single event iteration */ - /* to the number of event outputs. This should allow for the */ - /* maximum possible number of events that can trickle through any */ - /* circuit that does not contain loops. */ - - ckt->evt->limits.max_event_passes = ckt->evt->counts.num_outputs + 1; - - - /* Set maximum number of alternations between analog and event-driven */ - /* iterations to the number of event outputs on hybrids. */ - - ckt->evt->limits.max_op_alternations = ckt->evt->counts.num_hybrid_outputs + 1; - - - /* Return */ - return(OK); -} diff --git a/src/xspice/evt/evtiter.c b/src/xspice/evt/evtiter.c deleted file mode 100644 index 7f906a355..000000000 --- a/src/xspice/evt/evtiter.c +++ /dev/null @@ -1,296 +0,0 @@ -/*============================================================================ -FILE EVTiter.c - -MEMBER OF process XSPICE - -Public Domain - -Georgia Tech Research Corporation -Atlanta, Georgia 30332 -PROJECT A-8503 - -AUTHORS - - 9/12/91 Bill Kuhn - -MODIFICATIONS - - - -SUMMARY - - This file contains function EVTiter which iterates through - event-driven outputs and instances until the outputs no longer change. - - -INTERFACES - - int EVTiter(CKTcircuit *ckt) - -REFERENCED FILES - - None. - -NON-STANDARD FEATURES - - None. - -============================================================================*/ - -#include "ngspice/ngspice.h" -//#include "misc.h" -#include "ngspice/cktdefs.h" -//#include "util.h" -#include "ngspice/sperror.h" - -#include "ngspice/mif.h" -#include "ngspice/evt.h" -#include "ngspice/enh.h" -#include "ngspice/evtudn.h" - -#include "ngspice/evtproto.h" - - -/* -EVTiter - -This function iterates through event-driven outputs and instances -until the outputs no longer change. The general algorithm used -is: - -Do: - - Scan list of changed outputs - Put items on the node queue 'to_eval' list for - each changed output. - - Scan list of changed nodes - Resolve nodes with multiple outputs posted. - Create inverted state for nodes with attached - inverted inputs. - Put items on the instance queue 'to_call' list - for each changed node. - If transient analysis, put state of the node - into the node data structure. - - Scan instance to_call list - Call EVTload for each instance on list. - -While there are changed outputs - -*/ - - -int EVTiter( - CKTcircuit *ckt) /* the circuit structure */ -{ - - int i; - int num_changed; - - int num_to_eval; - int num_to_call; - - int output_index; - /* int output_subindex;*/ - int inst_index; - int node_index; - int port_index; - - int num_outputs; - int udn_index; - - int passes; - - Evt_Ckt_Data_t *evt; - - Evt_Output_Queue_t *output_queue; - Evt_Node_Queue_t *node_queue; - Evt_Inst_Queue_t *inst_queue; - - Evt_Output_Info_t **output_table; - Evt_Node_Info_t **node_table; - Evt_Port_Info_t **port_table; - - Evt_Inst_Index_t *inst_list; - - Evt_Node_Data_t *node_data; - - Evt_Node_t *rhs; - Evt_Node_t *rhsold; - - Evt_Node_t *node; - - Mif_Boolean_t equal; - - char *err_msg; - - - /* Get temporary pointers for fast access */ - evt = ckt->evt; - - output_queue = &(evt->queue.output); - node_queue = &(evt->queue.node); - inst_queue = &(evt->queue.inst); - - output_table = evt->info.output_table; - node_table = evt->info.node_table; - port_table = evt->info.port_table; - - node_data = evt->data.node; - rhs = node_data->rhs; - rhsold = node_data->rhsold; - - - /* Loop until no more output change, or too many passes through loop */ - for(passes = 0; passes < evt->limits.max_event_passes; passes++) { - - - /* Create list of nodes to evaluate from list of changed outputs */ - num_changed = output_queue->num_changed; - for(i = 0; i < num_changed; i++) { - - /* Get index of node that output is connected to */ - output_index = output_queue->changed_index[i]; - node_index = output_table[output_index]->node_index; - - /* If not already on list of nodes to evaluate, add it */ - if(! node_queue->to_eval[node_index]) { - node_queue->to_eval[node_index] = MIF_TRUE; - node_queue->to_eval_index[(node_queue->num_to_eval)++] - = node_index; - } - - /* Reset the changed flag on the output queue */ - output_queue->changed[output_index] = MIF_FALSE; - - } - output_queue->num_changed = 0; - - - - /* Evaluate nodes and for any which have changed, enter */ - /* the instances that receive inputs from them on the list */ - /* of instances to call */ - - num_to_eval = node_queue->num_to_eval; - for(i = 0; i < num_to_eval; i++) { - - /* Get the node index, udn index and number of outputs */ - node_index = node_queue->to_eval_index[i]; - udn_index = node_table[node_index]->udn_index; - num_outputs = node_table[node_index]->num_outputs; - - /* Resolve the node value if multiple outputs on it */ - /* and test if new node value is different than old value */ - if(num_outputs > 1) { - g_evt_udn_info[udn_index]->resolve - (num_outputs, - rhs[node_index].output_value, - rhs[node_index].node_value); - g_evt_udn_info[udn_index]->compare - (rhs[node_index].node_value, - rhsold[node_index].node_value, - &equal); - if(! equal) { - g_evt_udn_info[udn_index]->copy - (rhs[node_index].node_value, - rhsold[node_index].node_value); - } - } - /* Else, load function has already determined that they were */ - /* not equal */ - else - equal = MIF_FALSE; - - /* If not equal, make inverted copy in rhsold if */ - /* needed, and place indexes of instances with inputs connected */ - /* to the node in the to_call list of inst queue */ - if(! equal) { - if(node_table[node_index]->invert) { - g_evt_udn_info[udn_index]->copy - (rhsold[node_index].node_value, - rhsold[node_index].inverted_value); - g_evt_udn_info[udn_index]->invert - (rhsold[node_index].inverted_value); - } - inst_list = node_table[node_index]->inst_list; - while(inst_list) { - inst_index = inst_list->index; - if(! inst_queue->to_call[inst_index]) { - inst_queue->to_call[inst_index] = MIF_TRUE; - inst_queue->to_call_index[(inst_queue->num_to_call)++] - = inst_index; - } - inst_list = inst_list->next; - } /* end while instances with inputs on node */ - } /* end if not equal */ - - /* If transient analysis mode */ - /* Save the node data onto the node results list and mark */ - /* that it has been modified, even if the */ - /* resolved node value has not changed */ - if(g_mif_info.circuit.anal_type == MIF_TRAN) { - - node = *(node_data->tail[node_index]); - node_data->tail[node_index] = &(node->next); - EVTnode_copy(ckt, node_index, &(rhsold[node_index]), &(node->next)); - node->next->step = g_mif_info.circuit.evt_step; - - if(! node_data->modified[node_index]) { - node_data->modified[node_index] = MIF_TRUE; - node_data->modified_index[(node_data->num_modified)++] = node_index; - } - } - - /* Reset the to_eval flag on the node queue */ - node_queue->to_eval[node_index] = MIF_FALSE; - - } /* end for number of nodes to evaluate */ - node_queue->num_to_eval = 0; - - - - /* Call the instances with inputs on nodes that have changed */ - num_to_call = inst_queue->num_to_call; - for(i = 0; i < num_to_call; i++) { - inst_index = inst_queue->to_call_index[i]; - inst_queue->to_call[inst_index] = MIF_FALSE; - EVTload(ckt, inst_index); - } - inst_queue->num_to_call = 0; - - - /* Record statistics */ - if(g_mif_info.circuit.anal_type == MIF_DC) - (ckt->evt->data.statistics->op_event_passes)++; - - - /* If no outputs changed, iteration is over, so return with success! */ - if(output_queue->num_changed == 0) - return(0); - - } /* end for */ - - - /* Too many passes through loop, report problems and exit with error */ - - err_msg = TMALLOC(char, 10000); - for(i = 0; i < output_queue->num_changed; i++) { - output_index = output_queue->changed_index[i]; - port_index = output_table[output_index]->port_index; - sprintf(err_msg, "\n Instance: %s\n Connection: %s\n Port: %d", - port_table[port_index]->inst_name, - port_table[port_index]->conn_name, - port_table[port_index]->port_num); - ENHreport_conv_prob(ENH_EVENT_NODE, - port_table[port_index]->node_name, - err_msg); - } - FREE(err_msg); - - SPfrontEnd->IFerrorf (ERR_WARNING, - "Too many iteration passes in event-driven circuits"); - return(E_ITERLIM); - -} diff --git a/src/xspice/evt/evtload.c b/src/xspice/evt/evtload.c deleted file mode 100644 index f65353743..000000000 --- a/src/xspice/evt/evtload.c +++ /dev/null @@ -1,603 +0,0 @@ -/*============================================================================ -FILE EVTload.c - -MEMBER OF process XSPICE - -Public Domain - -Georgia Tech Research Corporation -Atlanta, Georgia 30332 -PROJECT A-8503 - -AUTHORS - - 9/12/91 Bill Kuhn - -MODIFICATIONS - - - -SUMMARY - - This file contains function EVTload which is used to call a - specified event-driven or hybrid code model during an event-driven - iteration. The 'CALL_TYPE' is set to 'EVENT_DRIVEN' when the - model is called from this function. - -INTERFACES - - int EVTload(CKTcircuit *ckt, int inst_index) - -REFERENCED FILES - - None. - -NON-STANDARD FEATURES - - None. - -============================================================================*/ - -#include "ngspice/ngspice.h" -#include "ngspice/cktdefs.h" -//#include "util.h" -#include "ngspice/devdefs.h" -#include "ngspice/sperror.h" - -#include "ngspice/mif.h" -#include "ngspice/evt.h" -#include "ngspice/evtudn.h" - -#include "ngspice/mifproto.h" -#include "ngspice/evtproto.h" - - -static void EVTcreate_state( - CKTcircuit *ckt, - int inst_index); - -static void EVTadd_msg( - CKTcircuit *ckt, - int port_index, - char *msg_text); - -static void EVTcreate_output_event( - CKTcircuit *ckt, - int node_index, - int output_index, - void **value_ptr); - -static void EVTprocess_output( - CKTcircuit *ckt, - Mif_Boolean_t changed, - int output_index, - Mif_Boolean_t invert, - double delay); - - - -/* -EVTload - -This function calls the code model function for the specified -instance with CALL_TYPE set to EVENT_DRIVEN. Event outputs, -messages, etc. are processed on return from the code model. -Analog outputs, partials, etc. should not be computed by the -code model when the call type is event-driven and are -ignored. -*/ - -int EVTload( - CKTcircuit *ckt, /* The circuit structure */ - int inst_index) /* The instance to call code model for */ -{ - - int i; - int j; - - int num_conn; - int num_port; - int mod_type; - - Mif_Conn_Data_t *conn; - Mif_Port_Data_t *port; - - Mif_Private_t cm_data; - - MIFinstance *inst; - - Evt_Node_Data_t *node_data; - - void *value_ptr; - - - /* ***************************** */ - /* Prepare the code model inputs */ - /* ***************************** */ - - /* Get pointer to instance data structure and other data */ - /* needed for fast access */ - inst = ckt->evt->info.inst_table[inst_index]->inst_ptr; - node_data = ckt->evt->data.node; - - /* Setup circuit data in struct to be passed to code model function */ - - if(inst->initialized) - cm_data.circuit.init = MIF_FALSE; - else - cm_data.circuit.init = MIF_TRUE; - - cm_data.circuit.anal_init = MIF_FALSE; - cm_data.circuit.anal_type = g_mif_info.circuit.anal_type; - - if(g_mif_info.circuit.anal_type == MIF_TRAN) - cm_data.circuit.time = g_mif_info.circuit.evt_step; - else - cm_data.circuit.time = 0.0; - - cm_data.circuit.call_type = MIF_EVENT_DRIVEN; - cm_data.circuit.temperature = ckt->CKTtemp - 273.15; - - - /* Setup data needed by cm_... functions */ - - g_mif_info.ckt = ckt; - g_mif_info.instance = inst; - g_mif_info.errmsg = ""; - g_mif_info.circuit.call_type = MIF_EVENT_DRIVEN; - - if(inst->initialized) - g_mif_info.circuit.init = MIF_FALSE; - else - g_mif_info.circuit.init = MIF_TRUE; - - - /* If after initialization and in transient analysis mode */ - /* create a new state for the instance */ - - if((g_mif_info.circuit.anal_type == MIF_TRAN) && inst->initialized) - EVTcreate_state(ckt, inst_index); - - - /* Loop through all connections on the instance and setup */ - /* load, total_load, and msg on all ports, and changed flag */ - /* and output pointer on all outputs */ - - num_conn = inst->num_conn; - for(i = 0; i < num_conn; i++) { - - conn = inst->conn[i]; - - /* if connection is null, continue to next */ - if(conn->is_null) - continue; - - /* Loop through each port on the connection */ - num_port = conn->size; - for(j = 0; j < num_port; j++) { - - port = conn->port[j]; - - /* Skip if port is null */ - if(port->is_null) - continue; - - /* If port type is Digital or User-Defined */ - if((port->type == MIF_DIGITAL) || (port->type == MIF_USER_DEFINED)) { - - /* Initialize the msg pointer on the port to NULL, */ - /* initialize the load value to zero, and get the total load */ - port->msg = NULL; - port->load = 0.0; - port->total_load = node_data->total_load[port->evt_data.node_index]; - - /* If connection is an output, initialize changed to true */ - /* and create a new output event object in the free list */ - /* if transient analysis mode */ - if(conn->is_output) { - port->changed = MIF_TRUE; - if(g_mif_info.circuit.anal_type == MIF_TRAN) { - EVTcreate_output_event(ckt, - port->evt_data.node_index, - port->evt_data.output_index, - &value_ptr); - port->output.pvalue = value_ptr; - } - } - } - else { - /* Get the analog input value. All we need to do is */ - /* set it to zero if mode is INITJCT. Otherwise, value */ - /* should still be around from last successful analog call */ - if(ckt->CKTmode & MODEINITJCT) - port->input.rvalue = 0.0; - } - - } /* end for number of ports */ - } /* end for number of connections */ - - - /* Prepare the structure to be passed to the code model */ - cm_data.num_conn = inst->num_conn; - cm_data.conn = inst->conn; - cm_data.num_param = inst->num_param; - cm_data.param = inst->param; - cm_data.num_inst_var = inst->num_inst_var; - cm_data.inst_var = inst->inst_var; - cm_data.callback = &(inst->callback); - - - /* ******************* */ - /* Call the code model */ - /* ******************* */ - - mod_type = MIFmodPtr(inst)->MIFmodType; - DEVices[mod_type]->DEVpublic.cm_func (&cm_data); - - - /* ****************************** */ - /* Process the code model outputs */ - /* ****************************** */ - - /* Loop through all connections and ports and process the msgs */ - /* and event outputs */ - - num_conn = inst->num_conn; - for(i = 0; i < num_conn; i++) { - - conn = inst->conn[i]; - if(conn->is_null) - continue; - - /* Loop through each port on the connection */ - num_port = conn->size; - for(j = 0; j < num_port; j++) { - - port = conn->port[j]; - - /* Skip if port is null */ - if(port->is_null) - continue; - - /* Process the message if any */ - if(port->msg) - EVTadd_msg(ckt, port->evt_data.port_index, port->msg); - - /* If this is the initialization pass, process the load factor */ - if(! inst->initialized) { - node_data->total_load[port->evt_data.node_index] += - port->load; - } - - /* If connection is not an event output, continue to next port */ - if(! conn->is_output) - continue; - if((port->type != MIF_DIGITAL) && (port->type != MIF_USER_DEFINED)) - continue; - - /* If output changed, process it */ - EVTprocess_output(ckt, port->changed, - port->evt_data.output_index, - port->invert, port->delay); - - /* And prevent erroneous models from overwriting it during */ - /* analog iterations */ - if(g_mif_info.circuit.anal_type == MIF_TRAN) - port->output.pvalue = NULL; - - } /* end for number of ports */ - } /* end for number of connections */ - - - /* Record statistics */ - if(g_mif_info.circuit.anal_type == MIF_DC) - (ckt->evt->data.statistics->op_load_calls)++; - else if(g_mif_info.circuit.anal_type == MIF_TRAN) - (ckt->evt->data.statistics->tran_load_calls)++; - - /* Mark that the instance has been called once */ - inst->initialized = MIF_TRUE; - - return(OK); -} - - - -/* -EVTcreate_state - -This function creates a new state storage area for a particular instance -during an event-driven simulation. New states must be created so -that old states are saved and can be accessed by code models in the -future. The new state is initialized to the previous state value. -*/ - - -static void EVTcreate_state( - CKTcircuit *ckt, /* The circuit structure */ - int inst_index) /* The instance to create state for */ -{ - size_t total_size; - - Evt_State_Data_t *state_data; - - Evt_State_t *new_state; - Evt_State_t *prev_state; - - /* Get variables for fast access */ - state_data = ckt->evt->data.state; - - /* Exit immediately if no states on this instance */ - if(state_data->desc[inst_index] == NULL) - return; - - /* Get size of state block to be allocated */ - total_size = (size_t) state_data->total_size[inst_index]; - - /* Allocate a new state for the instance */ - if(state_data->free[inst_index]) - { - new_state = state_data->free[inst_index]; - state_data->free[inst_index] = new_state->next; - new_state->next = NULL; // reusing dirty memory: next must be reset - } - else - { - - new_state = TMALLOC(Evt_State_t, 1); - new_state->block = tmalloc(total_size); - - } - - /* Splice the new state into the state data linked list */ - /* and update the tail pointer */ - prev_state = *(state_data->tail[inst_index]); - prev_state->next = new_state; - new_state->prev = prev_state; - state_data->tail[inst_index] = &(prev_state->next); - - /* Copy the old state to the new state and set the step */ - memcpy(new_state->block, prev_state->block, total_size); - new_state->step = g_mif_info.circuit.evt_step; - - /* Mark that the state data on the instance has been modified */ - if(! state_data->modified[inst_index]) { - state_data->modified[inst_index] = MIF_TRUE; - state_data->modified_index[(state_data->num_modified)++] = inst_index; - } -} - - -/* -EVTcreate_output_event - -This function creates a new output event. -*/ - -static void EVTcreate_output_event( - CKTcircuit *ckt, /* The circuit structure */ - int node_index, /* The node type port is on */ - int output_index, /* The output index for this port */ - void **value_ptr) /* The event created */ -{ - int udn_index; - Evt_Node_Info_t **node_table; - Evt_Output_Queue_t *output_queue; - Evt_Output_Event_t *event; - - - /* Check the output queue free list and use the structure */ - /* at the head of the list if non-null. Otherwise, create a new one. */ - output_queue = &(ckt->evt->queue.output); - if(output_queue->free[output_index]) { - *value_ptr = output_queue->free[output_index]->value; - } - else { - /* Create a new event */ - event = TMALLOC(Evt_Output_Event_t, 1); - event->next = NULL; - - /* Initialize the value */ - node_table = ckt->evt->info.node_table; - udn_index = node_table[node_index]->udn_index; - g_evt_udn_info[udn_index]->create (&(event->value)); - - /* Put the event onto the free list and return the value pointer */ - output_queue->free[output_index] = event; - *value_ptr = event->value; - } -} - - - -/* -EVTadd_msg - -This function records a message output by a code model into the -message results data structure. -*/ - - -static void EVTadd_msg( - CKTcircuit *ckt, /* The circuit structure */ - int port_index, /* The port to add message to */ - char *msg_text) /* The message text */ -{ - - Evt_Msg_Data_t *msg_data; - - Evt_Msg_t **msg_ptr; - Evt_Msg_t *msg; - - - /* Get pointers for fast access */ - msg_data = ckt->evt->data.msg; - msg_ptr = msg_data->tail[port_index]; - - /* Set pointer to location at which to add, and update tail */ - if(*msg_ptr != NULL) { - msg_ptr = &((*msg_ptr)->next); - msg_data->tail[port_index] = msg_ptr; - } - - /* Add a new entry in the list of messages for this port */ - if(msg_data->free[port_index]) { - *msg_ptr = msg_data->free[port_index]; - msg_data->free[port_index] = msg_data->free[port_index]->next; - if ((*msg_ptr)->text) - tfree((*msg_ptr)->text); - } - else { - *msg_ptr = TMALLOC(Evt_Msg_t, 1); - } - - /* Fill in the values */ - msg = *msg_ptr; - msg->next = NULL; - if((ckt->CKTmode & MODEDCOP) == MODEDCOP) - msg->op = MIF_TRUE; - else - msg->step = g_mif_info.circuit.evt_step; - msg->text = MIFcopy(msg_text); - - /* Update the modified indexes */ - if(g_mif_info.circuit.anal_type == MIF_TRAN) { - if(! msg_data->modified[port_index]) { - msg_data->modified[port_index] = MIF_TRUE; - msg_data->modified_index[(msg_data->num_modified)++] = port_index; - } - } - -} - - -/* -EVTprocess_output - -This function processes an event-driven output produced by a code -model. If transient analysis mode, the event is placed into the -output queue according to its (non-zero) delay. If DC analysis, -the event is processed immediately. -*/ - - -static void EVTprocess_output( - CKTcircuit *ckt, /* The circuit structure */ - Mif_Boolean_t changed, /* Has output changed? */ - int output_index, /* The output of interest */ - Mif_Boolean_t invert, /* Does output need to be inverted? */ - double delay) /* The output delay in transient analysis */ -{ - - int num_outputs; - int node_index; - int udn_index; - int output_subindex; - - Evt_Output_Info_t **output_table; - Evt_Node_Info_t **node_table; - - Evt_Node_t *rhs; - Evt_Node_t *rhsold; - - Evt_Output_Queue_t *output_queue; - Evt_Output_Event_t *output_event; - - Mif_Boolean_t equal; - - - output_queue = &(ckt->evt->queue.output); - output_table = ckt->evt->info.output_table; - node_table = ckt->evt->info.node_table; - - node_index = output_table[output_index]->node_index; - udn_index = node_table[node_index]->udn_index; - - - /* if transient analysis, just put the output event on the queue */ - /* to be processed at a later time */ - if(g_mif_info.circuit.anal_type == MIF_TRAN) { - /* If model signaled that output was not posted, */ - /* leave the event struct on the free list and return */ - if(!changed) - return; - if(delay <= 0.0) { - printf("\nERROR - Output delay <= 0 not allowed - output ignored!\n"); - printf(" Instance: %s\n Node: %s\n Time: %f \n", - g_mif_info.instance->MIFname, node_table[node_index]->name, g_mif_info.ckt->CKTtime); - return; - } - /* Remove the (now used) struct from the head of the free list */ - output_event = output_queue->free[output_index]; - output_queue->free[output_index] = output_event->next; - /* Invert the output value if necessary */ - if(invert) - g_evt_udn_info[udn_index]->invert - (output_event->value); - /* Add it to the queue */ - EVTqueue_output(ckt, output_index, udn_index, output_event, - g_mif_info.circuit.evt_step, - g_mif_info.circuit.evt_step + delay); - return; - } - /* If not transient analysis, process immediately. */ - /* Determine if output has changed from rhsold value */ - /* and put entry in output queue changed list if so */ - else { - - /* If model signaled that output was not posted, */ - /* just return */ - if(! changed) - return; -/* - if(delay > 0.0) - printf("\nWARNING - Non-zero output delay not allowed in DCOP - delay ignored!\n"); -*/ - rhs = ckt->evt->data.node->rhs; - rhsold = ckt->evt->data.node->rhsold; - - /* Determine if changed */ - num_outputs = node_table[node_index]->num_outputs; - if(num_outputs > 1) { - output_subindex = output_table[output_index]->output_subindex; - if(invert) - g_evt_udn_info[udn_index]->invert - (rhs[node_index].output_value[output_subindex]); - g_evt_udn_info[udn_index]->compare - (rhs[node_index].output_value[output_subindex], - rhsold[node_index].output_value[output_subindex], - &equal); - if(! equal) { - g_evt_udn_info[udn_index]->copy - (rhs[node_index].output_value[output_subindex], - rhsold[node_index].output_value[output_subindex]); - } - } - else { - if(invert) - g_evt_udn_info[udn_index]->invert - (rhs[node_index].node_value); - g_evt_udn_info[udn_index]->compare - (rhs[node_index].node_value, - rhsold[node_index].node_value, - &equal); - if(! equal) { - g_evt_udn_info[udn_index]->copy - (rhs[node_index].node_value, - rhsold[node_index].node_value); - } - } - - /* If changed, put in changed list of output queue */ - if(! equal) { - if(! output_queue->changed[output_index]) { - output_queue->changed[output_index] = MIF_TRUE; - output_queue->changed_index[(output_queue->num_changed)++] = - output_index; - } - } - - return; - - } /* end else process immediately */ -} diff --git a/src/xspice/evt/evtnext_time.c b/src/xspice/evt/evtnext_time.c deleted file mode 100644 index 4d04d5d2b..000000000 --- a/src/xspice/evt/evtnext_time.c +++ /dev/null @@ -1,90 +0,0 @@ -/*============================================================================ -FILE EVTnext_time.c - -MEMBER OF process XSPICE - -Public Domain - -Georgia Tech Research Corporation -Atlanta, Georgia 30332 -PROJECT A-8503 - -AUTHORS - - 9/12/91 Bill Kuhn - -MODIFICATIONS - - - -SUMMARY - - This file contains function EVTnext_time which determines and - returns the time of the next scheduled event on the inst and output - queues. - -INTERFACES - - double EVTnext_time(CKTcircuit *ckt) - -REFERENCED FILES - - None. - -NON-STANDARD FEATURES - - None. - -============================================================================*/ - -#include "ngspice/ngspice.h" -#include "ngspice/cktdefs.h" -//#include "util.h" - -#include "ngspice/mif.h" -#include "ngspice/evt.h" - -#include "ngspice/evtproto.h" - - - -/* -EVTnext_time - -Get the next event time as the minimum of the next times -in the inst and output queues. If no next time in either, -return machine infinity. -*/ - - -double EVTnext_time( - CKTcircuit *ckt) /* The circuit structure */ -{ - - double next_time; - - Evt_Inst_Queue_t *inst_queue; - Evt_Output_Queue_t *output_queue; - - - /* Initialize next time to machine infinity */ - next_time = 1e30; - - /* Get pointers for fast access */ - inst_queue = &(ckt->evt->queue.inst); - output_queue = &(ckt->evt->queue.output); - - /* If anything pending in inst queue, set next time */ - /* to minimum of itself and the inst queue next time */ - if(inst_queue->num_pending) - if(inst_queue->next_time < next_time) - next_time = inst_queue->next_time; - - /* If anything pending in output queue, set next time */ - /* to minimum of itself and the output queue next time */ - if(output_queue->num_pending) - if(output_queue->next_time < next_time) - next_time = output_queue->next_time; - - return(next_time); -} diff --git a/src/xspice/evt/evtnode_copy.c b/src/xspice/evt/evtnode_copy.c deleted file mode 100644 index 220657cc2..000000000 --- a/src/xspice/evt/evtnode_copy.c +++ /dev/null @@ -1,158 +0,0 @@ -/*============================================================================ -FILE EVTnode_copy.c - -MEMBER OF process XSPICE - -Public Domain - -Georgia Tech Research Corporation -Atlanta, Georgia 30332 -PROJECT A-8503 - -AUTHORS - - 9/12/91 Bill Kuhn - -MODIFICATIONS - - - -SUMMARY - - This file contains function EVTnode_copy which copies the state - of a node structure. - -INTERFACES - - void EVTnode_copy(CKTcircuit *ckt, int node_index, Evt_Node_t *from, - Evt_Node_t **to) - -REFERENCED FILES - - None. - -NON-STANDARD FEATURES - - None. - -============================================================================*/ - -#include "ngspice/ngspice.h" -#include "ngspice/cktdefs.h" -//#include "util.h" - -#include "ngspice/mif.h" -#include "ngspice/evt.h" -#include "ngspice/evtudn.h" - -#include "ngspice/mifproto.h" -#include "ngspice/evtproto.h" -#include "ngspice/cm.h" - -/* -EVTnode_copy - -This function copies the state of a node structure. - -If the destination is NULL, it is allocated before the copy. This is the -case when EVTiter copies a node during a transient analysis to -save the state of an element of rhsold into the node data structure -lists. - -If the destination is non-NULL, only the internal elements of the node -structure are copied. This is the case when EVTbackup restores that state -of nodes that existed at a certain timestep back into rhs and rhsold. -*/ - - -void EVTnode_copy( - CKTcircuit *ckt, /* The circuit structure */ - int node_index, /* The node to copy */ - Evt_Node_t *from, /* Location to copy from */ - Evt_Node_t **to) /* Location to copy to */ -{ - - int i; - - int udn_index; - int num_outputs; - Mif_Boolean_t invert; - - Evt_Node_Data_t *node_data; - Evt_Node_Info_t **node_table; - - Evt_Node_t *here; - - /* Digital_t *dummy;*/ - - /* char buff[128];*/ - - /* Get data for fast access */ - node_data = ckt->evt->data.node; - node_table = ckt->evt->info.node_table; - - udn_index = node_table[node_index]->udn_index; - num_outputs = node_table[node_index]->num_outputs; - invert = node_table[node_index]->invert; - - - /* If destination is not allocated, allocate it */ - /* otherwise we just copy into the node struct */ - here = *to; - - if(here == NULL) - { - /* Use allocated structure on free list if available */ - /* Otherwise, allocate a new one */ - here = node_data->free[node_index]; - if(here) - { - *to = here; - node_data->free[node_index] = here->next; - here->next = NULL; - } - else - { - here = TMALLOC(Evt_Node_t, 1); - *to = here; - /* Allocate/initialize the data in the new node struct */ - if(num_outputs > 1) - { - here->output_value = TMALLOC(void *, num_outputs); - - for(i = 0; i < num_outputs; i++) - { - g_evt_udn_info[udn_index]->create - ( &(here->output_value[i]) ); - } - } - - here->node_value = NULL; - - g_evt_udn_info[udn_index]->create ( &(here->node_value) ); - - if(invert) - g_evt_udn_info[udn_index]->create ( &(here->inverted_value) ); - - - } - } - - /* Copy the node data */ - here->op = from->op; - here->step = from->step; - if(num_outputs > 1) - { - for(i = 0; i < num_outputs; i++) - { - g_evt_udn_info[udn_index]->copy (from->output_value[i], - here->output_value[i]); - } - } - g_evt_udn_info[udn_index]->copy (from->node_value, here->node_value); - if(invert) - { - g_evt_udn_info[udn_index]->copy (from->inverted_value, - here->inverted_value); - } -} diff --git a/src/xspice/evt/evtop.c b/src/xspice/evt/evtop.c deleted file mode 100644 index 542c9c60e..000000000 --- a/src/xspice/evt/evtop.c +++ /dev/null @@ -1,319 +0,0 @@ -/*============================================================================ -FILE EVTop.c - -MEMBER OF process XSPICE - -Public Domain - -Georgia Tech Research Corporation -Atlanta, Georgia 30332 -PROJECT A-8503 - -AUTHORS - - 9/12/91 Bill Kuhn - -MODIFICATIONS - - - -SUMMARY - - This file contains function EVTop which is used to perform an - operating point analysis in place of CKTop when there are - event-driven instances in the circuit. It alternates between doing - event-driven iterations with EVTiter and doing analog iterations with - NIiter/CKTop until no more event-driven outputs change. - -INTERFACES - - EVTop() - -REFERENCED FILES - - None. - -NON-STANDARD FEATURES - - None. - -============================================================================*/ - -#include "ngspice/ngspice.h" -#include "ngspice/cktdefs.h" -//#include "util.h" -#include "ngspice/sperror.h" - -#include "ngspice/mif.h" -#include "ngspice/evt.h" -#include "ngspice/enh.h" -#include "ngspice/evtproto.h" -#include "ngspice/evtudn.h" - - -static void EVTnode_compare( - CKTcircuit *ckt, - int node_index, - Evt_Node_t *node1, - Evt_Node_t *node2, - Mif_Boolean_t *equal); - - - -/* -EVTop - -This function is used to perform an operating point analysis -in place of CKTop when there are event-driven instances in the -circuit. It alternates between doing event-driven iterations -with EVTiter and doing analog iterations with NIiter/CKTop -until no more event-driven outputs change. -*/ - - -int EVTop( - CKTcircuit *ckt, /* The circuit structure */ - long firstmode, /* The SPICE 3C1 CKTop() firstmode parameter */ - long continuemode, /* The SPICE 3C1 CKTop() continuemode paramter */ - int max_iter, /* The SPICE 3C1 CKTop() max iteration parameter */ - Mif_Boolean_t first_call) /* Is this the first time through? */ -{ - - int i; - int num_insts; - int converged; - int output_index; - int port_index; - - char *err_msg; - - Mif_Boolean_t firstime; - - Evt_Inst_Queue_t *inst_queue; - Evt_Output_Queue_t *output_queue; - - Evt_Output_Info_t **output_table; - Evt_Port_Info_t **port_table; - - - /* get data to local storage for fast access */ - num_insts = ckt->evt->counts.num_insts; - inst_queue = &(ckt->evt->queue.inst); - - /* Initialize to_call entries in event inst queue */ - /* to force calling all event/hybrid instance the first */ - /* time through */ - - if(first_call) { - for(i = 0; i < num_insts; i++) { - inst_queue->to_call[i] = MIF_TRUE; - inst_queue->to_call_index[i] = i; - } - inst_queue->num_to_call = num_insts; - } - - - /* Alternate between event-driven and analog solutions until */ - /* there are no changed event-driven outputs */ - - firstime = MIF_TRUE; - for(;;) { - - /* Call EVTiter to establish initial outputs from */ - /* event/hybrid instances with states (e.g. flip-flops) */ - - ckt->CKTmode = firstmode; - converged = EVTiter(ckt); - if(converged != 0) - return(converged); - - /* Now do analog solution for current state of hybrid outputs */ - - /* If first analog solution, call CKTop */ - if(firstime) { - firstime = MIF_FALSE; - converged = CKTop(ckt, - firstmode, - continuemode, - max_iter); - if(converged != 0) - return(converged); - } - /* Otherwise attempt to converge with mode = continuemode */ - else { - ckt->CKTmode = continuemode; - converged = NIiter(ckt,max_iter); - if(converged != 0) { - converged = CKTop(ckt, - firstmode, - continuemode, - max_iter); - if(converged != 0) - return(converged); - } - } - - /* Call all hybrids to allow new event outputs to be posted */ - EVTcall_hybrids(ckt); - - /* Increment count of successful alternations */ - (ckt->evt->data.statistics->op_alternations)++; - - /* If .option card specified not to alternate solutions, exit */ - /* immediately with this first pass solution */ - if(! ckt->evt->options.op_alternate) - return(0); - - /* If no hybrid instances produced different event outputs, */ - /* alternation is completed, so exit */ - if(ckt->evt->queue.output.num_changed == 0) - return(0); - - /* If too many alternations, exit with error */ - if(ckt->evt->data.statistics->op_alternations >= - ckt->evt->limits.max_op_alternations) { - - SPfrontEnd->IFerrorf (ERR_WARNING, - "Too many analog/event-driven solution alternations"); - - err_msg = TMALLOC(char, 10000); - output_queue = &(ckt->evt->queue.output); - output_table = ckt->evt->info.output_table; - port_table = ckt->evt->info.port_table; - - for(i = 0; i < output_queue->num_changed; i++) { - output_index = output_queue->changed_index[i]; - port_index = output_table[output_index]->port_index; - sprintf(err_msg, "\n Instance: %s\n Connection: %s\n Port: %d", - port_table[port_index]->inst_name, - port_table[port_index]->conn_name, - port_table[port_index]->port_num); - ENHreport_conv_prob(ENH_EVENT_NODE, - port_table[port_index]->node_name, - err_msg); - } - FREE(err_msg); - - return(E_ITERLIM); - } - - } /* end forever */ -} - - - -/* -EVTop_save - -Save result from operating point iteration into the node data area. -*/ - -void EVTop_save( - CKTcircuit *ckt, /* The circuit structure */ - Mif_Boolean_t op, /* True if from a DCOP analysis, false if TRANOP, etc. */ - double step) -{ - - int i; - int num_nodes; - - Mif_Boolean_t equal; - - Evt_Node_Data_t *node_data; - - Evt_Node_t *rhsold; - Evt_Node_t **head; - Evt_Node_t **here; - - /* char buff[128];*/ - - - /* Get pointers for fast access */ - node_data = ckt->evt->data.node; - rhsold = node_data->rhsold; - head = node_data->head; - - /* For number of event nodes, copy rhsold to node data */ - /* and set the op member if appropriate */ - num_nodes = ckt->evt->counts.num_nodes; - - for(i = 0; i < num_nodes; i++) - { - /* if head is null, just copy there */ - if(head[i] == NULL) - { - EVTnode_copy(ckt, i, &(rhsold[i]), &(head[i])); - - head[i]->op = op; - head[i]->step = step; - - } - /* Otherwise, add to the end of the list */ - else - { - /* Locate end of list */ - here = &(head[i]); - for(;;) - { - if((*here)->next) - here = &((*here)->next); - else - break; - } - /* Compare entry at end of list to rhsold */ - - EVTnode_compare(ckt, i, &(rhsold[i]), *here, &equal); - - /* If new value in rhsold is different, add it to the list */ - if(!equal) - { - here = &((*here)->next); - EVTnode_copy(ckt, i, &(rhsold[i]), here); - (*here)->op = op; - (*here)->step = step; - } - } /* end else add to end of list */ - } /* end for number of nodes */ - -} - - - -/* ************************************************************ */ - - -/* -EVTnode_compare - -This function compares the resolved values of the old and -new states on a node. The actual comparison is done by -calling the appropriate user-defined node compare function. -*/ - - -static void EVTnode_compare( - CKTcircuit *ckt, /* The circuit structure */ - int node_index, /* The index for the node in question */ - Evt_Node_t *node1, /* The first value */ - Evt_Node_t *node2, /* The second value */ - Mif_Boolean_t *equal) /* The computed result */ -{ - - Evt_Node_Data_t *node_data; - Evt_Node_Info_t **node_table; - - int udn_index; - - - /* Get data for fast access */ - node_data = ckt->evt->data.node; - node_table = ckt->evt->info.node_table; - udn_index = node_table[node_index]->udn_index; - - - /* Do compare based on changes in resolved node value only */ - g_evt_udn_info[udn_index]->compare ( - node1->node_value, - node2->node_value, - equal); -} diff --git a/src/xspice/evt/evtplot.c b/src/xspice/evt/evtplot.c deleted file mode 100644 index 7b1106f5f..000000000 --- a/src/xspice/evt/evtplot.c +++ /dev/null @@ -1,215 +0,0 @@ -/*============================================================================ -FILE EVTplot.c - -MEMBER OF process XSPICE - -Copyright 1992 -Georgia Tech Research Corporation -Atlanta, Georgia 30332 -All Rights Reserved - -PROJECT A-8503 - -AUTHORS - - 5/7/92 Bill Kuhn - -MODIFICATIONS - - - -SUMMARY - - This file contains function EVTplot which is used to provide basic - plotting of event driven nodes through SPICE3's 'plot' command. - -INTERFACES - - void EVTplot() - -REFERENCED FILES - - None. - -NON-STANDARD FEATURES - - None. - -============================================================================*/ - -#include "ngspice/ngspice.h" -//nclude "misc.h" -#include "ngspice/evt.h" -#include "ngspice/evtudn.h" -#include "ngspice/evtproto.h" -#include "ngspice/mif.h" -#include "ngspice/mifproto.h" - -/*saj for output */ -#include "ngspice/sim.h" -#include "ngspice/dvec.h" -//#include "ftedata.h" -//#include "fteconstant.h" -//#include "util.h" -#include "ngspice/cpstd.h" - - -/* - -EVTfindvec() - -This function is called from FTE/vectors.c:findvec() when a node specified -for plotting cannot be located in the analog plot data. It scans the -event driven data structures looking for the node, and if found, returns -a new 'dvec' structure holding the data to be plotted. The dvec struct -is created with it's own v_scale member holding the event time vector -for this node since the time vector is not aligned with the analog data -points or with other event vectors. - -The node name supplied as argument can either be a simple node name, or a -name of the form (), where is the member of -the event-driven structure to be plotted. These member names are defined -by the individual "user-defined node" plot_val routines for the node -type in question. If the simple node name form is used, the special -keyword "all" is supplied to the plot_val routine for the member name. - -*/ - - -struct dvec *EVTfindvec( - char *node) /* The node name (and optional member name) */ -{ - char *name; - char *member = "all"; - char *ptr; - - int i; - int num_nodes; - int udn_index; - int num_events; - - Mif_Boolean_t found; - Evt_Node_Info_t **node_table; - Evt_Node_t *head; - Evt_Node_t *event; - - double *anal_point_vec; - double *value_vec; - double value = 0; - - struct dvec *d; - struct dvec *scale; - - /* Exit immediately if event-driven stuff not allocated yet, */ - /* or if number of event nodes is zero. */ - if(! g_mif_info.ckt) - return(NULL); - if(! g_mif_info.ckt->evt) - return(NULL); - if(! g_mif_info.ckt->evt->info.node_table) - return(NULL); - if(g_mif_info.ckt->evt->counts.num_nodes == 0) - return(NULL); - - /* Make a copy of the node name. */ - /* Do not free this string. It is assigned into the dvec structure below. */ - name = MIFcopy(node); - - /* Convert to all lower case */ - strtolower(name); - - /* Divide into the node name and member name */ - for(ptr = name; *ptr != '\0'; ptr++) - if(*ptr == '(') - break; - - if(*ptr == '(') { - *ptr = '\0'; - ptr++; - member = ptr; - for( ; *ptr != '\0'; ptr++) - if(*ptr == ')') - break; - *ptr = '\0'; - } - - /* Look for node name in the event-driven node list */ - num_nodes = g_mif_info.ckt->evt->counts.num_nodes; - node_table = g_mif_info.ckt->evt->info.node_table; - - for(i = 0, found = MIF_FALSE; i < num_nodes; i++) { - if(cieq(name, node_table[i]->name)) { - found = MIF_TRUE; - break; - } - } - - if(! found) { - tfree(name); - return(NULL); - } - - /* Get the UDN type index */ - udn_index = node_table[i]->udn_index; - - if (!g_mif_info.ckt->evt->data.node) { -// fprintf(stderr, "Warning: No event data available! \n Simulation not yet run?\n"); - tfree(name); - return(NULL); - } - - /* Count the number of events */ - head = g_mif_info.ckt->evt->data.node->head[i]; - - for(event = head, num_events = 0; event; event = event->next) - num_events++; - - /* Allocate arrays to hold the analysis point and node value vectors */ - anal_point_vec = TMALLOC(double, 2 * (num_events + 2)); - value_vec = TMALLOC(double, 2 * (num_events + 2)); - - /* Iterate through the events and fill the arrays. */ - /* Note that we create vertical segments every time an event occurs. */ - /* Need to modify this in the future to complete the vector out to the */ - /* last analysis point... */ - for(i = 0, event = head; event; event = event->next) { - - /* If not first point, put the second value of the horizontal line in the vectors */ - if(i > 0) { - anal_point_vec[i] = event->step; - value_vec[i] = value; - i++; - } - - /* Get the next value by calling the appropriate UDN plot_val function */ - value = 0.0; - g_evt_udn_info[udn_index]->plot_val (event->node_value, - member, - &value); - - /* Put the first value of the horizontal line in the vector */ - anal_point_vec[i] = event->step; - value_vec[i] = value; - i++; - - } - - /* Allocate dvec structures and assign the vectors into them. */ - /* See FTE/OUTinterface.c:plotInit() for initialization example. */ - - scale = dvec_alloc(MIFcopy("step"), - SV_TIME, - VF_REAL & ~VF_PERMANENT, - i, anal_point_vec); - - d = dvec_alloc(name, - SV_VOLTAGE, - VF_REAL & ~VF_PERMANENT, - i, value_vec); - - d->v_scale = scale; - - - /* Return the dvec */ - return(d); -} diff --git a/src/xspice/evt/evtprint.c b/src/xspice/evt/evtprint.c deleted file mode 100644 index 624866257..000000000 --- a/src/xspice/evt/evtprint.c +++ /dev/null @@ -1,786 +0,0 @@ -/*============================================================================ -FILE EVTprint.c - -MEMBER OF process XSPICE - -Copyright 1991 -Georgia Tech Research Corporation -Atlanta, Georgia 30332 -All Rights Reserved - -PROJECT A-8503 - -AUTHORS - - 9/12/91 Bill Kuhn - -MODIFICATIONS - - 7/11/2012 Holger Vogt Replace printf by out_printf to allow output redirection - 5/21/2017 Holger Vogt Update 'edisplay': add node type and number of events - 5/26/2018 Uros Platise Update 'EVTprintvcd': stepsize based on tstep - -SUMMARY - - This file contains function EVTprint which is used to provide a simple - tabular output of event-driven node data. This printout is invoked - through a new nutmeg command called 'eprint' which takes event-driven - node names as argument. - -INTERFACES - - void EVTprint(wordlist *wl) - -REFERENCED FILES - - None. - -NON-STANDARD FEATURES - - None. - -============================================================================*/ - -#include "ngspice/ngspice.h" - -#include "ngspice/cpstd.h" -#include "ngspice/cpextern.h" -#include "ngspice/fteext.h" - -#include "ngspice/mif.h" -#include "ngspice/evt.h" -#include "ngspice/evtudn.h" - -#include "ngspice/evtproto.h" - -#include -#include - - -static int get_index(char *node_name); - -static void print_data( - Mif_Boolean_t dcop, - double step, - char **node_value, - int nargs); - -/* -EVTprint - -This function implements the 'eprint' command used to print -event-driven node values and messages from the latest simulation. - -This is a simple prototype implementation of the -eprint command for testing purposes. It is currently lacking -in the following areas: - -1) It accepts only up to 93 nodes. (EPRINT_MAXARGS) - -2) It does not support the selected printing of different - members of a user-defined data struct. - -3) It is dumb in its output formatting - just tries to print - everything on a line with 4 space separators. - -4) It works only for the latest simulation - i.e. it does not - use the evt jobs structure to find old results. - -5) It does not allow a range of timesteps to be selected. - -*/ - - - -#define EPRINT_MAXARGS 93 - - -void EVTprint( - wordlist *wl) /* The command line entered by user */ -{ - - int i; - int nargs; - int num_ports; - - wordlist *w; - - char *node_name[EPRINT_MAXARGS]; - int node_index[EPRINT_MAXARGS]; - int udn_index[EPRINT_MAXARGS]; - Evt_Node_t *node_data[EPRINT_MAXARGS]; - char *node_value[EPRINT_MAXARGS]; - - CKTcircuit *ckt; - - Evt_Node_Info_t **node_table; - Evt_Port_Info_t **port_table; - - Mif_Boolean_t more; - Mif_Boolean_t dcop; - - double step = 0.0; - double next_step; - double this_step; - - char *value; - - Evt_Msg_t *msg_data; - Evt_Statistic_t *statistics; - - - /* Count the number of arguments to the command */ - nargs = 0; - w = wl; - while(w) { - nargs++; - w = w->wl_next; - } - - if(nargs < 1) { - printf("Usage: eprint ...\n"); - return; - } - if(nargs > EPRINT_MAXARGS) { - fprintf(cp_err, "ERROR - eprint currently limited to %d arguments\n", EPRINT_MAXARGS); - return; - } - - /* Get needed pointers */ - ckt = g_mif_info.ckt; - if (!ckt) { - fprintf(cp_err, "Error: no circuit loaded.\n"); - return; - } - node_table = ckt->evt->info.node_table; - - /* Get data for each argument */ - w = wl; - for(i = 0; i < nargs; i++) { - node_name[i] = w->wl_word; - node_index[i] = get_index(node_name[i]); - if(node_index[i] < 0) { - fprintf(cp_err, "ERROR - Node %s is not an event node.\n", node_name[i]); - return; - } - udn_index[i] = node_table[node_index[i]]->udn_index; - if (ckt->evt->data.node) - node_data[i] = ckt->evt->data.node->head[node_index[i]]; - else { - fprintf(cp_err, "ERROR - No node data: simulation not yet run?\n"); - return; - } - node_value[i] = ""; - w = w->wl_next; - } - - out_init(); - - /* Print results data */ - out_printf("\n**** Results Data ****\n\n"); - - /* Print the column identifiers */ - out_printf("Time or Step\n"); - for(i = 0; i < nargs; i++) - out_printf("%s\n",node_name[i]); - out_printf("\n\n"); - - /* Scan the node data and determine if the first vector */ - /* is for a DCOP analysis or the first step in a swept DC */ - /* or transient analysis. Also, determine if there is */ - /* more data following it and if so, what the next step */ - /* is. */ - more = MIF_FALSE; - dcop = MIF_FALSE; - next_step = 1e30; - for(i = 0; i < nargs; i++) { - if(node_data[i]->op) - dcop = MIF_TRUE; - else - step = node_data[i]->step; - (*(g_evt_udn_info[udn_index[i]]->print_val)) - (node_data[i]->node_value, "all", &value); - node_value[i] = value; - node_data[i] = node_data[i]->next; - if(node_data[i]) { - more = MIF_TRUE; - if(node_data[i]->step < next_step) - next_step = node_data[i]->step; - } - } - - /* Print the data */ - print_data(dcop, step, node_value, nargs); - - /* While there is more data, get the next values and print */ - while(more) { - - more = MIF_FALSE; - this_step = next_step; - next_step = 1e30; - - for(i = 0; i < nargs; i++) { - - if(node_data[i]) { - if(node_data[i]->step == this_step) { - (*(g_evt_udn_info[udn_index[i]]->print_val)) - (node_data[i]->node_value, "all", &value); - node_value[i] = value; - node_data[i] = node_data[i]->next; - } - if(node_data[i]) { - more = MIF_TRUE; - if(node_data[i]->step < next_step) - next_step = node_data[i]->step; - } - - } /* end if node_data not NULL */ - - } /* end for number of args */ - - print_data(MIF_FALSE, this_step, node_value, nargs); - - } /* end while there is more data */ - out_printf("\n\n"); - - - /* Print messages for all ports */ - out_printf("\n**** Messages ****\n\n"); - - num_ports = ckt->evt->counts.num_ports; - port_table = ckt->evt->info.port_table; - - for(i = 0; i < num_ports; i++) { - - /* Get pointer to messages for this port */ - msg_data = ckt->evt->data.msg->head[i]; - - /* If no messages on this port, skip */ - if(! msg_data) - continue; - - /* Print the port description */ - out_printf("Node: %s Inst: %s Conn: %s Port: %d\n\n", - port_table[i]->node_name, - port_table[i]->inst_name, - port_table[i]->conn_name, - port_table[i]->port_num); - - /* Print the messages on this port */ - while(msg_data) { - if(msg_data->op) - printf("DCOP "); - else - printf("%-16.9e", msg_data->step); - printf("%s\n", msg_data->text); - msg_data = msg_data->next; - } - out_printf("\n\n"); - - } /* end for number of ports */ - - - /* Print statistics */ - out_printf("\n**** Statistics ****\n\n"); - - statistics = ckt->evt->data.statistics; - out_printf("Operating point analog/event alternations: %d\n", - statistics->op_alternations); - out_printf("Operating point load calls: %d\n", - statistics->op_load_calls); - out_printf("Operating point event passes: %d\n", - statistics->op_event_passes); - out_printf("Transient analysis load calls: %d\n", - statistics->tran_load_calls); - out_printf("Transient analysis timestep backups: %d\n", - statistics->tran_time_backups); - - out_printf("\n\n"); -} - - - - -/* -get_index - -This function determines the index of a specified event-driven node. -*/ - - -static int get_index( - char *node_name /* The name of the node to search for */ -) -{ - - /* Get the event-driven node index for the specified name */ - - int index; - - Mif_Boolean_t found; - Evt_Node_Info_t *node; - CKTcircuit *ckt; - - - /* Scan list of nodes in event structure to see if there */ - - found = MIF_FALSE; - index = 0; - - ckt = g_mif_info.ckt; - if (!ckt) { - fprintf(cp_err, "Error: no circuit loaded.\n"); - return(-1); - } - node = ckt->evt->info.node_list; - - while(node) { - if(strcmp(node_name, node->name) == 0) { - found = MIF_TRUE; - break; - } - else { - index++; - node = node->next; - } - } - - /* Return the index or -1 if not found */ - if(! found) - return(-1); - else - return(index); -} - - - - -/* -print_data - -This function prints the values of one or more nodes to -standard output. -*/ - - -static void print_data( - Mif_Boolean_t dcop, /* Is this the operating point data */ - double step, /* The analysis step if dcop */ - char **node_value, /* The array of values to be printed */ - int nargs) /* The size of the value array */ -{ - - int i, preci; - char step_str[100]; - - /* If option numdgt is set, use it for printout precision. */ - if (cp_numdgt > 0) - preci = cp_numdgt; - else - preci = 9; - - if(dcop) - strcpy(step_str, "DCOP "); - else - sprintf(step_str, "%.*e", preci, step); - - out_printf("%s", step_str); - for(i = 0; i < nargs; i++) - out_printf(" %s", node_value[i]); - out_printf("\n"); -} - - -/* print all event node names */ -void -EVTdisplay(wordlist *wl) -{ - Evt_Node_Info_t *node; - CKTcircuit *ckt; - int node_index, udn_index; - Evt_Node_Info_t **node_table; - - NG_IGNORE(wl); - ckt = g_mif_info.ckt; - if (!ckt) { - fprintf(cp_err, "Error: no circuit loaded.\n"); - return; - } - node = ckt->evt->info.node_list; - node_table = ckt->evt->info.node_table; - - if (!node || !node_table) { - out_printf("No event node available!\n"); - return; - } - out_init(); - if (ckt->evt->jobs.job_plot) { - out_printf("\nList of event nodes in plot %s\n", - ckt->evt->jobs.job_plot[ckt->evt->jobs.cur_job]); - } else { - out_printf("\nList of event nodes\n"); - } - out_printf(" %-20s: %-5s, %s\n\n", - "node name", "type", "number of events"); - - node_index = 0; - while (node) { - Evt_Node_t *node_data = NULL; - int count = 0; - char *type; - - udn_index = node_table[node_index]->udn_index; - if (ckt->evt->data.node) { - node_data = ckt->evt->data.node->head[node_index]; - while (node_data) { - count++; - node_data = node_data->next; - } - } - type = g_evt_udn_info[udn_index]->name; - out_printf(" %-20s: %-5s, %5d\n", node->name, type, count); - - node = node->next; - node_index++; - } -} - - -/* xspice valid 12-state values (idndig.c): - * 0s, 1s, Us, 0r, 1r, Ur, 0z, 1z, Uz, 0u, 1u, Uu - * 0 1 x 0 1 x 0 1 z 0 1 x - * - * tentative vcd translation, return value: - * 0: digital value, 1: real number, 2: unknown - */ - -static int -get_vcdval(char *xspiceval, char **newval) -{ - int i, err; - double retval; - - static char *map[] = { - "0s", "1s", "Us", - "0r", "1r", "Ur", - "0z", "1z", "Uz", - "0u", "1u", "Uu" - }; - static char *returnmap[] = { - "0", "1", "x", - "0", "1", "x", - "0", "1", "z", - "0", "1", "x" - }; - - for (i = 0; i < 12; i++) - if (eq(xspiceval, map[i])) { - *newval = copy(returnmap[i]); - return 0; - } - - /* is it a real number ? */ - retval = INPevaluate(&xspiceval, &err, 1); - if (err) { - *newval = copy("unknown"); - return 2; - } - *newval = tprintf("%.16g", retval); - return 1; -} - - -#ifdef _MSC_VER -#define time _time64 -#define localtime _localtime64 -#endif - -/* - * A simple vcd file printer. - * command 'eprvcd a0 a1 a2 b0 b1 b2 clk > myvcd.vcd' - * prints the event nodes listed to file myvcd.vcd - * which then may be viewed with an vcd viewer, - * for example 'gtkwave' - * Still missing: - * hierarchy, vector variables - */ - -void -EVTprintvcd(wordlist *wl) -{ - int i; - int nargs; - - wordlist *w; - - char *node_name[EPRINT_MAXARGS]; - int node_index[EPRINT_MAXARGS]; - int udn_index[EPRINT_MAXARGS]; - Evt_Node_t *node_data[EPRINT_MAXARGS]; - char *node_value[EPRINT_MAXARGS]; - char *old_node_value[EPRINT_MAXARGS]; - char node_ident[EPRINT_MAXARGS + 1]; - - CKTcircuit *ckt; - - Evt_Node_Info_t **node_table; - - Mif_Boolean_t more; - - double step = 0.0; - double next_step; - double this_step; - - char *value; - - /* Count the number of arguments to the command */ - nargs = 0; - for (w = wl; w; w = w->wl_next) - nargs++; - - if (nargs < 1) { - printf("Usage: eprvcd ...\n"); - return; - } - if (nargs > EPRINT_MAXARGS) { - fprintf(cp_err, "ERROR - eprvcd currently limited to %d arguments\n", EPRINT_MAXARGS); - return; - } - - /* Get needed pointers */ - ckt = g_mif_info.ckt; - if (!ckt) { - fprintf(cp_err, "Error: no circuit loaded.\n"); - return; - } - if (!ckt->evt->data.node) { - fprintf(cp_err, "ERROR - No node data: simulation not yet run?\n"); - return; - } - node_table = ckt->evt->info.node_table; - - /* Get data for each argument */ - w = wl; - for (i = 0; i < nargs; i++) { - node_name[i] = w->wl_word; - node_index[i] = get_index(node_name[i]); - if (node_index[i] < 0) { - fprintf(cp_err, "ERROR - Node %s is not an event node.\n", node_name[i]); - return; - } - udn_index[i] = node_table[node_index[i]]->udn_index; - - node_data[i] = ckt->evt->data.node->head[node_index[i]]; - node_value[i] = ""; - w = w->wl_next; - } - - /* generate the vcd identifier code made of the printable - ASCII character set from ! to ~ (decimal 33 to 126) */ - for (i = 0; i < nargs; i++) - node_ident[i] = (char) ('!' + i); - node_ident[i] = '\0'; - - out_init(); - - - /* for gtkwave, avoid e.g. German Umlaute */ - setlocale(LC_TIME, "en_US"); - - /* get actual time */ - time_t ltime; - char datebuff[80]; - struct tm *my_time; - - time(<ime); - /* Obtain the local time: */ - my_time = localtime(<ime); - /* time output format according to vcd spec */ - strftime(datebuff, sizeof(datebuff), "%B %d, %Y %H:%M:%S", my_time); - out_printf("$date %s $end\n", datebuff); - - /* return to what it was before */ - setlocale(LC_TIME, ""); - - out_printf("$version %s %s $end\n", ft_sim->simulator, ft_sim->version); - - /* get the sim time resolution based on tstep */ - char *unit; - double scale; - double tstep = ckt->CKTstep; - - /* if selected time step is down to [ms] then report time at [us] etc., always with one level higher resolution */ - if (tstep >= 1e-3) { - unit = "us"; - scale = 1e6; - } - else if (tstep >= 1e-6) { - unit = "ns"; - scale = 1e9; - } - else if (tstep >= 1e-9) { - unit = "ps"; - scale = 1e12; - } - else { - unit = "fs"; - scale = 1e15; - } - out_printf("$timescale 1 %s $end\n", unit); - - /* Scan the node data. Go for printing using $dumpvars - for the initial values. Also, determine if there is - more data following it and if so, what the next step is. */ - more = MIF_FALSE; - next_step = 1e30; - for (i = 0; i < nargs; i++) { - step = node_data[i]->step; - g_evt_udn_info[udn_index[i]]->print_val - (node_data[i]->node_value, "all", &value); - old_node_value[i] = node_value[i] = value; - node_data[i] = node_data[i]->next; - if (node_data[i]) { - more = MIF_TRUE; - if (next_step > node_data[i]->step) - next_step = node_data[i]->step; - } - } - - for (i = 0; i < nargs; i++) { - char *buf; - if (get_vcdval(node_value[i], &buf) == 1) - /* real number format */ - out_printf("$var real 1 %c %s $end\n", node_ident[i], node_name[i]); - else - /* digital data format */ - out_printf("$var wire 1 %c %s $end\n", node_ident[i], node_name[i]); - tfree(buf); - } - - out_printf("$enddefinitions $end\n"); - out_printf("#%lld\n", (unsigned long long)(step * scale)); - - /* first set of data for initialization - or if only op has been calculated */ - out_printf("$dumpvars\n"); - for (i = 0; i < nargs; i++) { - char *buf; - if (get_vcdval(node_value[i], &buf) == 1) - /* real number format */ - out_printf("r%s %c\n", buf, node_ident[i]); - else - /* digital data format */ - out_printf("%s%c\n", buf, node_ident[i]); - tfree(buf); - } - out_printf("$end\n"); - - /* While there is more data, get the next values and print */ - while (more) { - - more = MIF_FALSE; - this_step = next_step; - next_step = 1e30; - - for (i = 0; i < nargs; i++) - if (node_data[i]) { - if (node_data[i]->step == this_step) { - g_evt_udn_info[udn_index[i]]->print_val - (node_data[i]->node_value, "all", &value); - node_value[i] = value; - node_data[i] = node_data[i]->next; - } - if (node_data[i]) { - more = MIF_TRUE; - if (next_step > node_data[i]->step) - next_step = node_data[i]->step; - } - } - - /* timestamp */ - out_printf("#%lld\n", (unsigned long long)(this_step * scale)); - /* print only values that have changed */ - for (i = 0; i < nargs; i++) { - if (!eq(old_node_value[i], node_value[i])) { - char *buf; - if (get_vcdval(node_value[i], &buf) == 1) - out_printf("r%s %c\n", buf, node_ident[i]); - else - out_printf("%s%c\n", buf, node_ident[i]); - old_node_value[i] = node_value[i]; - tfree(buf); - } - } - } /* end while there is more data */ - - out_printf("\n\n"); -} - -/* Mark event nodes whose data should be saved for printing. - * By default, all nodes are saved, so initial "none" clears. - */ - -static void set_all(CKTcircuit *ckt, Mif_Boolean_t val) -{ - int i, count; - Evt_Node_Info_t **node_table; - - count = ckt->evt->counts.num_nodes; - node_table = ckt->evt->info.node_table; - if (!node_table) - return; - for (i = 0; i < count; i++) - node_table[i]->save = val; -} - -void -EVTsave(wordlist *wl) -{ - int i; - wordlist *w; - CKTcircuit *ckt; - Evt_Node_Info_t **node_table; - - if (wl == NULL) { - printf("Usage: esave all | none | ...\n"); - return; - } - - /* Get needed pointers. */ - - ckt = g_mif_info.ckt; - if (!ckt) { - fprintf(cp_err, "Error: no circuit loaded.\n"); - return; - } - - node_table = ckt->evt->info.node_table; - if (!node_table) - return; - - /* Deal with "all" and "none". */ - - if (wl->wl_next == NULL) { - if (!strcmp("none", wl->wl_word)) { - set_all(ckt, MIF_FALSE); - return; - } else if (!strcmp("all", wl->wl_word)) { - set_all(ckt, MIF_TRUE); - return; - } - } - - set_all(ckt, MIF_FALSE); /* Clear previous settings. */ - - /* Set save flag for each argument */ - - for (w = wl; w; w = w->wl_next) { - i = get_index(w->wl_word); - if (i < 0) { - fprintf(cp_err, "ERROR - Node %s is not an event node.\n", - w->wl_word); - return; - } - node_table[i]->save = MIF_TRUE; - } -} diff --git a/src/xspice/evt/evtqueue.c b/src/xspice/evt/evtqueue.c deleted file mode 100644 index fb9b16c30..000000000 --- a/src/xspice/evt/evtqueue.c +++ /dev/null @@ -1,251 +0,0 @@ -/*============================================================================ -FILE EVTqueue.c - -MEMBER OF process XSPICE - -Public Domain - -Georgia Tech Research Corporation -Atlanta, Georgia 30332 -PROJECT A-8503 - -AUTHORS - - 9/12/91 Bill Kuhn - -MODIFICATIONS - - - -SUMMARY - - This file contains functions that place new events into the output and - instance queues. - -INTERFACES - - void EVTqueue_output( - CKTcircuit *ckt, - int output_index, - int udn_index, - Evt_Output_Event_t *new_event, - double posted_time, - double event_time) - - void EVTqueue_inst( - CKTcircuit *ckt, - int inst_index, - double posted_time, - double event_time) - -REFERENCED FILES - - None. - -NON-STANDARD FEATURES - - None. - -============================================================================*/ - - -#include "ngspice/ngspice.h" -#include "ngspice/cktdefs.h" -//#include "util.h" - -#include "ngspice/mif.h" -#include "ngspice/evt.h" -#include "ngspice/evtudn.h" - -#include "ngspice/evtproto.h" - - - -/* -EVTqueue_output - -This function places the specified output event onto the output -queue. It is called by EVTload during a transient analysis. - -The linked list in the queue for the specified output is -searched beginning at the current head of the pending events -to find the location at which to insert the new event. The -events are ordered in the list by event_time. If the event -is placed before the end of the list, subsequent events are -removed from the list by marking them as 'removed' and -recording the time of removal. This allows efficient backup -of the state of the queue if a subsequent analog timestep -fails. -*/ - - -void EVTqueue_output( - CKTcircuit *ckt, /* The circuit structure */ - int output_index, /* The output in question */ - int udn_index, /* The associated user-defined node type */ - Evt_Output_Event_t *new_event, /* The event to queue */ - double posted_time, /* The current time */ - double event_time) /* The time the event should happen */ -{ - - Evt_Output_Queue_t *output_queue; - Evt_Output_Event_t **here; - Evt_Output_Event_t *next; - - Mif_Boolean_t splice; - - NG_IGNORE(udn_index); - - /* Get pointers for fast access */ - output_queue = &(ckt->evt->queue.output); - - /* Put the times into the event struct */ - new_event->event_time = event_time; - new_event->posted_time = posted_time; - new_event->removed = MIF_FALSE; - - /* Update next_time in output queue */ - if((output_queue->num_pending <= 0) || - (event_time < output_queue->next_time)) - output_queue->next_time = event_time; - - /* Find location at which to insert event */ - splice = MIF_FALSE; - here = output_queue->current[output_index]; - while(*here) { - if(event_time <= (*here)->event_time) { - splice = MIF_TRUE; - break; - } - here = &((*here)->next); - } - - /* If needs to be spliced into middle of existing list */ - if(splice) { - /* splice it in */ - next = *here; - *here = new_event; - new_event->next = next; - /* mark later events as removed */ - while(next) { - if(! next->removed) { - next->removed = MIF_TRUE; - next->removed_time = posted_time; - } - next = next->next; - } - } - /* else, just put it at the end */ - else { - *here = new_event; - new_event->next = NULL; - } - - /* Add to the list of outputs modified since last accepted timestep */ - if(! output_queue->modified[output_index]) { - output_queue->modified[output_index] = MIF_TRUE; - output_queue->modified_index[(output_queue->num_modified)++] = - output_index; - } - - /* Add to the list of outputs with events pending */ - if(! output_queue->pending[output_index]) { - output_queue->pending[output_index] = MIF_TRUE; - output_queue->pending_index[(output_queue->num_pending)++] = - output_index; - } -} - - - -/* -EVTqueue_inst - -This function places the specified inst event onto the inst -queue. - -The linked list in the queue for the specified inst is -searched beginning at the current head of the pending events -to find the location at which to insert the new event. The -events are ordered in the list by event_time. -*/ - - - - -void EVTqueue_inst( - CKTcircuit *ckt, /* The circuit structure */ - int inst_index, /* The instance in question */ - double posted_time, /* The current time */ - double event_time) /* The time the event should happen */ -{ - - Evt_Inst_Queue_t *inst_queue; - Evt_Inst_Event_t **here; - Evt_Inst_Event_t *new_event; - Evt_Inst_Event_t *next; - - Mif_Boolean_t splice; - - - /* Get pointers for fast access */ - inst_queue = &(ckt->evt->queue.inst); - - /* Update next_time in inst queue */ - if((inst_queue->num_pending <= 0) || - (event_time < inst_queue->next_time)) - inst_queue->next_time = event_time; - - /* Find location at which to insert event */ - splice = MIF_FALSE; - here = inst_queue->current[inst_index]; - while(*here) { - /* If there's an event with the same time, don't duplicate it */ - if(event_time == (*here)->event_time) { - return; - } - else if(event_time < (*here)->event_time) { - splice = MIF_TRUE; - break; - } - here = &((*here)->next); - } - - /* Create a new event or get one from the free list and copy in data */ - if(inst_queue->free[inst_index]) { - new_event = inst_queue->free[inst_index]; - inst_queue->free[inst_index] = new_event->next; - } - else { - new_event = TMALLOC(Evt_Inst_Event_t, 1); - } - new_event->event_time = event_time; - new_event->posted_time = posted_time; - - /* If needs to be spliced into middle of existing list */ - if(splice) { - /* splice it in */ - next = *here; - *here = new_event; - new_event->next = next; - } - /* else, just put it at the end */ - else { - *here = new_event; - new_event->next = NULL; - } - - /* Add to the list of insts modified since last accepted timestep */ - if(! inst_queue->modified[inst_index]) { - inst_queue->modified[inst_index] = MIF_TRUE; - inst_queue->modified_index[(inst_queue->num_modified)++] = - inst_index; - } - - /* Add to the list of insts with events pending */ - if(! inst_queue->pending[inst_index]) { - inst_queue->pending[inst_index] = MIF_TRUE; - inst_queue->pending_index[(inst_queue->num_pending)++] = - inst_index; - } -} diff --git a/src/xspice/evt/evtsetup.c b/src/xspice/evt/evtsetup.c deleted file mode 100644 index 606c7959e..000000000 --- a/src/xspice/evt/evtsetup.c +++ /dev/null @@ -1,657 +0,0 @@ -/*============================================================================ -FILE EVTsetup.c - -MEMBER OF process XSPICE - -Public Domain - -Georgia Tech Research Corporation -Atlanta, Georgia 30332 -PROJECT A-8503 - -AUTHORS - - 9/12/91 Bill Kuhn - -MODIFICATIONS - - - -SUMMARY - - This file contains function EVTsetup which clears/allocates the - event-driven queues and data structures immediately prior to a new - analysis. In addition, it places entries in the job list so that - results data from multiple analysis can be retrieved similar to - SPICE3C1 saving multiple 'plots'. - -INTERFACES - - int EVTsetup(CKTcircuit *ckt) - -REFERENCED FILES - - None. - -NON-STANDARD FEATURES - - None. - -============================================================================*/ - -#include "ngspice/ngspice.h" -//#include "misc.h" - -#include "ngspice/cktdefs.h" -#include "ngspice/sperror.h" -//#include "util.h" - -#include "ngspice/mif.h" -#include "ngspice/evt.h" -#include "ngspice/evtudn.h" -#include "ngspice/mifproto.h" -#include "ngspice/evtproto.h" - - - - -static int EVTsetup_queues(CKTcircuit *ckt); -static int EVTsetup_data(CKTcircuit *ckt); -static int EVTsetup_jobs(CKTcircuit *ckt); -static int EVTsetup_load_ptrs(CKTcircuit *ckt); - -int EVTsetup_plot(CKTcircuit* ckt, char* plottypename); -int EVTswitch_plot(CKTcircuit* ckt, const char* plottypename); - - -/* Allocation macros with built-in check for out-of-memory */ -/* Adapted from SPICE 3C1 code in CKTsetup.c */ - -#define CKALLOC(var,size,type) \ - if(size) { \ - if((var = TMALLOC(type, size)) == NULL) \ - return(E_NOMEM); \ - } - -#define CKREALLOC(var,size,type) \ - if((size) == 1) { \ - if((var = TMALLOC(type, size)) == NULL) \ - return(E_NOMEM); \ - } else if((size) > 1) { \ - if((var = TREALLOC(type, (var), size)) == NULL) \ - return(E_NOMEM); \ - } - - -/* -EVTsetup - -This function clears/allocates the event-driven queues and data structures -immediately prior to a new analysis. In addition, it places entries -in the job list so that results data from multiple analysis can be -retrieved similar to SPICE3C1 saving multiple 'plots'. -*/ - - -int EVTsetup( - CKTcircuit *ckt) /* The circuit structure */ -{ - - int err; - - - /* Exit immediately if no event-driven instances in circuit */ - if(ckt->evt->counts.num_insts == 0) - return(OK); - - /* Clear the inst, node, and output queues, and initialize the to_call */ - /* elements in the instance queue to call all event-driven instances */ - err = EVTsetup_queues(ckt); - if(err) - return(err); - - /* Allocate and initialize the node, state, message, and statistics data */ - err = EVTsetup_data(ckt); - if(err) - return(err); - - /* Set the job pointers to the allocated results, states, messages, */ - /* and statistics so that data will be accessable after run */ - err = EVTsetup_jobs(ckt); - if(err) - return(err); - - /* Setup the pointers in the MIFinstance structure for inputs, outputs, */ - /* and total loads */ - err = EVTsetup_load_ptrs(ckt); - if(err) - return(err); - - /* Initialize additional event data */ - g_mif_info.circuit.evt_step = 0.0; - - /* Return OK */ - return(OK); -} - - -int EVTunsetup( - CKTcircuit* ckt) /* The circuit structure */ -{ - int err; - - /* Exit immediately if no event-driven instances in circuit */ - if (ckt->evt->counts.num_insts == 0) - return(OK); - - /* Clear the inst, node, and output queues, and initialize the to_call */ - /* elements in the instance queue to call all event-driven instances */ - err = EVTsetup_queues(ckt); - if (err) - return(err); - - /* Initialize additional event data */ - g_mif_info.circuit.evt_step = 0.0; - - /* Return OK */ - return(OK); -} - - - - -/* -EVTsetup_queues - -This function clears the event-driven queues in preparation for -a new simulation. -*/ - - -static int EVTsetup_queues( - CKTcircuit *ckt) /* The circuit structure */ -{ - - int i; - int num_insts; - int num_nodes; - int num_outputs; - - Evt_Inst_Queue_t *inst_queue; - Evt_Node_Queue_t *node_queue; - Evt_Output_Queue_t *output_queue; - - Evt_Inst_Event_t *inst_event; - Evt_Output_Event_t *output_event; - - void *ptr; - - /* ************************ */ - /* Clear the instance queue */ - /* ************************ */ - - num_insts = ckt->evt->counts.num_insts; - inst_queue = &(ckt->evt->queue.inst); - - for(i = 0; i < num_insts; i++) { - inst_event = inst_queue->head[i]; - while(inst_event) { - ptr = inst_event; - inst_event = inst_event->next; - FREE(ptr); - } - inst_event = inst_queue->free[i]; - while(inst_event) { - ptr = inst_event; - inst_event = inst_event->next; - FREE(ptr); - } - inst_queue->head[i] = NULL; - inst_queue->current[i] = &(inst_queue->head[i]); - inst_queue->last_step[i] = &(inst_queue->head[i]); - inst_queue->free[i] = NULL; - } - - inst_queue->next_time = 0.0; - inst_queue->last_time = 0.0; - - inst_queue->num_modified = 0; - inst_queue->num_pending = 0; - inst_queue->num_to_call = 0; - - for(i = 0; i < num_insts; i++) { - inst_queue->modified[i] = MIF_FALSE; - inst_queue->pending[i] = MIF_FALSE; - inst_queue->to_call[i] = MIF_FALSE; - } - - - /* ******************** */ - /* Clear the node queue */ - /* ******************** */ - - num_nodes = ckt->evt->counts.num_nodes; - node_queue = &(ckt->evt->queue.node); - - node_queue->num_changed = 0; - node_queue->num_to_eval = 0; - - for(i = 0; i < num_nodes; i++) { - node_queue->changed[i] = MIF_FALSE; - node_queue->to_eval[i] = MIF_FALSE; - } - - /* ********************** */ - /* Clear the output queue */ - /* ********************** */ - - num_outputs = ckt->evt->counts.num_outputs; - output_queue = &(ckt->evt->queue.output); - - for(i = 0; i < num_outputs; i++) { - output_event = output_queue->head[i]; - while(output_event) { - ptr = output_event; - output_event = output_event->next; - FREE(ptr); - } - output_event = output_queue->free[i]; - while(output_event) { - ptr = output_event; - output_event = output_event->next; - FREE(ptr); - } - output_queue->head[i] = NULL; - output_queue->current[i] = &(output_queue->head[i]); - output_queue->last_step[i] = &(output_queue->head[i]); - output_queue->free[i] = NULL; - } - - output_queue->next_time = 0.0; - output_queue->last_time = 0.0; - - output_queue->num_modified = 0; - output_queue->num_pending = 0; - output_queue->num_changed = 0; - - for(i = 0; i < num_outputs; i++) { - output_queue->modified[i] = MIF_FALSE; - output_queue->pending[i] = MIF_FALSE; - output_queue->changed[i] = MIF_FALSE; - } - - return(OK); -} - - - -/* -EVTsetup_data - -This function sets up the event-driven node, state, and -message data runtime structures in preparation for -a new simulation. -*/ - - -static int EVTsetup_data( - CKTcircuit *ckt) /* The circuit structure */ -{ - - Evt_Data_t *data; - - int i; - int j; - - int num_insts; - int num_ports; - int num_nodes; - - int udn_index; - int num_outputs; - - Mif_Boolean_t invert; - - Evt_Node_Data_t *node_data; - Evt_State_Data_t *state_data; - Evt_Msg_Data_t *msg_data; - /* Evt_Statistic_t *statistics_data;*/ - - Evt_Node_t *rhs; - Evt_Node_t *rhsold; - - Evt_Node_Info_t *node_info; - - - /* Allocate main substructures of data */ - /* Note that we don't free any old structures */ - /* since they are pointed to by jobs and need */ - /* to be maintained so that results from multiple */ - /* jobs are kept around like SPICE does */ - - data = &(ckt->evt->data); - CKALLOC(data->node, 1, Evt_Node_Data_t) - CKALLOC(data->state, 1, Evt_State_Data_t) - CKALLOC(data->msg, 1, Evt_Msg_Data_t) - CKALLOC(data->statistics, 1, Evt_Statistic_t) - - /* Allocate node data */ - - num_nodes = ckt->evt->counts.num_nodes; - node_data = data->node; - - CKALLOC(node_data->head, num_nodes, Evt_Node_t *) - CKALLOC(node_data->tail, num_nodes, Evt_Node_t **) - CKALLOC(node_data->last_step, num_nodes, Evt_Node_t **) - CKALLOC(node_data->free, num_nodes, Evt_Node_t *) - CKALLOC(node_data->modified_index, num_nodes, int) - CKALLOC(node_data->modified, num_nodes, Mif_Boolean_t) - CKALLOC(node_data->rhs, num_nodes, Evt_Node_t) - CKALLOC(node_data->rhsold, num_nodes, Evt_Node_t) - CKALLOC(node_data->total_load, num_nodes, double) - - /* Initialize the node data */ - - for(i = 0; i < num_nodes; i++) { - node_data->tail[i] = &(node_data->head[i]); - node_data->last_step[i] = &(node_data->head[i]); - } - - for(i = 0; i < num_nodes; i++) { - - /* Get pointers to rhs & rhsold, the user-defined node type index, */ - /* the number of outputs on the node and the invert flag */ - rhs = &(node_data->rhs[i]); - rhsold = &(node_data->rhsold[i]); - node_info = ckt->evt->info.node_table[i]; - udn_index = node_info->udn_index; - num_outputs = node_info->num_outputs; - invert = node_info->invert; - - /* Initialize the elements within rhs and rhsold */ - rhs->step = 0.0; - rhsold->step = 0.0; - if(num_outputs > 1) { - CKALLOC(rhs->output_value, num_outputs, void *) - CKALLOC(rhsold->output_value, num_outputs, void *) - for(j = 0; j < num_outputs; j++) { - g_evt_udn_info[udn_index]->create (&(rhs->output_value[j])); - g_evt_udn_info[udn_index]->initialize (rhs->output_value[j]); - g_evt_udn_info[udn_index]->create (&(rhsold->output_value[j])); - g_evt_udn_info[udn_index]->initialize (rhsold->output_value[j]); - } - } - g_evt_udn_info[udn_index]->create (&(rhs->node_value)); - g_evt_udn_info[udn_index]->initialize (rhs->node_value); - g_evt_udn_info[udn_index]->create (&(rhsold->node_value)); - g_evt_udn_info[udn_index]->initialize (rhsold->node_value); - if(invert) { - g_evt_udn_info[udn_index]->create (&(rhs->inverted_value)); - g_evt_udn_info[udn_index]->initialize (rhs->inverted_value); - g_evt_udn_info[udn_index]->create (&(rhsold->inverted_value)); - g_evt_udn_info[udn_index]->initialize (rhsold->inverted_value); - } - - /* Initialize the total load value to zero */ - node_data->total_load[i] = 0.0; - } - - - /* Allocate and initialize state data */ - - num_insts = ckt->evt->counts.num_insts; - state_data = data->state; - - CKALLOC(state_data->head, num_insts, Evt_State_t *) - CKALLOC(state_data->tail, num_insts, Evt_State_t **) - CKALLOC(state_data->last_step, num_insts, Evt_State_t **) - CKALLOC(state_data->free, num_insts, Evt_State_t *) - CKALLOC(state_data->modified_index, num_insts, int) - CKALLOC(state_data->modified, num_insts, Mif_Boolean_t) - CKALLOC(state_data->total_size, num_insts, int) - CKALLOC(state_data->desc, num_insts, Evt_State_Desc_t *) - - for(i = 0; i < num_insts; i++) { - state_data->tail[i] = &(state_data->head[i]); - state_data->last_step[i] = &(state_data->head[i]); - } - - - /* Allocate and initialize msg data */ - - num_ports = ckt->evt->counts.num_ports; - msg_data = data->msg; - - CKALLOC(msg_data->head, num_ports, Evt_Msg_t *) - CKALLOC(msg_data->tail, num_ports, Evt_Msg_t **) - CKALLOC(msg_data->last_step, num_ports, Evt_Msg_t **) - CKALLOC(msg_data->free, num_ports, Evt_Msg_t *) - CKALLOC(msg_data->modified_index, num_ports, int) - CKALLOC(msg_data->modified, num_ports, Mif_Boolean_t) - - for(i = 0; i < num_ports; i++) { - msg_data->tail[i] = &(msg_data->head[i]); - msg_data->last_step[i] = &(msg_data->head[i]); - } - - /* Don't need to initialize statistics since they were */ - /* calloc'ed above */ - - return(OK); -} - - - - -/* -EVTsetup_jobs - -This function prepares the jobs data for a new simulation. -*/ - - -static int EVTsetup_jobs( - CKTcircuit *ckt) /* The circuit structure */ -{ - - int i; - int num_jobs; - - Evt_Job_t *jobs; - Evt_Data_t *data; - - - jobs = &(ckt->evt->jobs); - data = &(ckt->evt->data); - - /* Increment the number of jobs */ - num_jobs = ++(jobs->num_jobs); - - /* Allocate/reallocate necessary pointers */ - CKREALLOC(jobs->job_name, num_jobs, char *) - CKREALLOC(jobs->job_plot, num_jobs, char *) - CKREALLOC(jobs->node_data, num_jobs, Evt_Node_Data_t *) - CKREALLOC(jobs->state_data, num_jobs, Evt_State_Data_t *) - CKREALLOC(jobs->msg_data, num_jobs, Evt_Msg_Data_t *) - CKREALLOC(jobs->statistics, num_jobs, Evt_Statistic_t *) - - /* Fill in the pointers, etc. for this new job */ - i = num_jobs - 1; - jobs->job_name[i] = MIFcopy(ckt->CKTcurJob->JOBname); - jobs->job_plot[i] = NULL; /* fill in later */ - jobs->node_data[i] = data->node; - jobs->state_data[i] = data->state; - jobs->msg_data[i] = data->msg; - jobs->statistics[i] = data->statistics; - - return(OK); -} - - - -/* -EVTsetup_load_ptrs - -This function setups up the required data in the MIFinstance -structure of event-driven and hybrid instances. -*/ - - -static int EVTsetup_load_ptrs( - CKTcircuit *ckt) /* The circuit structure */ -{ - - int i; - int j; - int k; - - int num_insts; - int num_conn; - int num_port; - int num_outputs; - - int node_index; - int output_subindex; - - MIFinstance *fast; - - Mif_Conn_Data_t *conn; - - Mif_Port_Type_t type; - Mif_Port_Data_t *port; - - Evt_Node_Data_t *node_data; - - - /* This function setups up the required data in the MIFinstance */ - /* structure of event-driven and hybrid instances */ - - /* Loop through all event-driven and hybrid instances */ - num_insts = ckt->evt->counts.num_insts; - for(i = 0; i < num_insts; i++) { - - /* Get the MIFinstance pointer */ - fast = ckt->evt->info.inst_table[i]->inst_ptr; - - /* Reset init flag, required when any run is called a second time */ - fast->initialized = FALSE; - - /* Loop through all connections */ - num_conn = fast->num_conn; - for(j = 0; j < num_conn; j++) { - - /* Skip if connection is null */ - if(fast->conn[j]->is_null) - continue; - - conn = fast->conn[j]; - - /* Loop through all ports */ - num_port = conn->size; - for(k = 0; k < num_port; k++) { - - /* Get port data pointer for quick access */ - port = conn->port[k]; - - if(port->is_null) - continue; - - /* Skip if port is not digital or user-defined type */ - type = port->type; - if((type != MIF_DIGITAL) && (type != MIF_USER_DEFINED)) - continue; - - /* Set input.pvalue to point to rhsold.node_value or to */ - /* rhsold.inverted_value as appropriate */ - node_index = port->evt_data.node_index; - node_data = ckt->evt->data.node; - if(conn->is_input) { - if(port->invert) { - port->input.pvalue = node_data->rhsold[node_index]. - inverted_value; - } - else { - port->input.pvalue = node_data->rhsold[node_index]. - node_value; - } - } - - /* Set output.pvalue to point to rhs.node_value or rhs.output_value[i] */ - /* where i is given by the output_subindex in output info */ - /* depending on whether more than one output is connected to the node. */ - /* Note that this is only for the DCOP analysis. During a transient */ - /* analysis, new structures will be created and the pointers will */ - /* be set by EVTload */ - if(conn->is_output) { - num_outputs = ckt->evt->info.node_table[node_index]->num_outputs; - if(num_outputs <= 1) { - port->output.pvalue = node_data->rhs[node_index]. - node_value; - } - else { - output_subindex = port->evt_data.output_subindex; - port->output.pvalue = node_data->rhs[node_index]. - output_value[output_subindex]; - } - } - - } /* end for number of ports */ - } /* end for number of connections */ - } /* end for number of insts */ - - return(OK); -} - -/* get the analog plot name and store it into the current event job */ -int EVTsetup_plot(CKTcircuit* ckt, char *plotname) { - if (ckt->evt->counts.num_insts == 0) - return(OK); - - Evt_Job_t* jobs = &(ckt->evt->jobs); - if (jobs) { - jobs->job_plot[jobs->num_jobs - 1] = copy(plotname); - jobs->cur_job = jobs->num_jobs - 1; - return OK; - } - return 1; -} - -/* If command 'setplot' is called, we switch to the corresponding event data. - Their pointers have been stored in the jobs structure. The circuit must - be still available! -*/ -int EVTswitch_plot(CKTcircuit* ckt, const char* plottypename) { - int i; - bool found = FALSE; - - Evt_Job_t* jobs; - Evt_Data_t* data; - - if (!ckt) - return (E_NOTFOUND); - - if (ckt->evt->counts.num_insts == 0) - return(E_NOTFOUND); - - jobs = &(ckt->evt->jobs); - data = &(ckt->evt->data); - - if (jobs) { - /* check for the job with current plot type name , e.g. tran2 */ - for (i = 0; i < jobs->num_jobs; i++) { - if (jobs->job_plot[i] && eq(jobs->job_plot[i], plottypename)) { - found = TRUE; - jobs->cur_job = i; - break; - } - } - if (found) { - data->node = jobs->node_data[i]; - data->state = jobs->state_data[i]; - data->msg = jobs->msg_data[i]; - data->statistics = jobs->statistics[i]; - return OK; - } - } - return 1; -} diff --git a/src/xspice/evt/evtshared.c b/src/xspice/evt/evtshared.c deleted file mode 100644 index c381195b0..000000000 --- a/src/xspice/evt/evtshared.c +++ /dev/null @@ -1,300 +0,0 @@ -/*============================================================================ -FILE EVTshared.c - -MEMBER OF process XSPICE - -This code is in the public domain. - -AUTHORS - - 5/12/17 Holger Vogt - -MODIFICATIONS - - - -SUMMARY - - This file function to prepare event node data for transfer over the - shared ngspice interface. - -INTERFACES - - void EVTprint(wordlist *wl) - -REFERENCED FILES - - None. - -NON-STANDARD FEATURES - - None. - -============================================================================*/ - -#include "ngspice/ngspice.h" -#include "ngspice/sharedspice.h" -#include "ngspice/cpstd.h" -#include "ngspice/cpextern.h" -#include "ngspice/fteext.h" - -#include "ngspice/mif.h" -#include "ngspice/evt.h" -#include "ngspice/evtudn.h" - -#include "ngspice/evtproto.h" -#include "ngspice/evtshared.h" - -#include - - -static int get_index(char *node_name); -/* - -// typedefs are done in sharedspice.h - -typedef struct evt_data { - Mif_Boolean_t dcop; - double step; - char *node_value; -} evt_data, *pevt_data; - -typedef struct evt_shared_data { - pevt_data evt_dect; - int num_steps; -} evt_shared_data, *pevt_shared_data; -*/ - -pevt_data *return_node; -pevt_shared_data return_all; - -/* delete the information return structures */ -static void -delete_ret(void) -{ - int i; - if (return_all) - for (i = 0; i < return_all->num_steps; i++) { - tfree(return_all->evt_dect[i]->node_value); - tfree(return_all->evt_dect[i]); - } - tfree(return_all); -} - -pevt_shared_data -EVTshareddata( - char *node_name) /* The command called by ngGet_EVT_Info(char* nodename) */ -{ - - int i; - int num_points; - - int node_index; - int udn_index; - Evt_Node_t *node_data, *count_data; - char *node_value; - - CKTcircuit *ckt; - - Evt_Node_Info_t **node_table; - - Mif_Boolean_t more; - Mif_Boolean_t dcop; - - double step = 0.0; - double next_step; - double this_step; - - char *value; - - delete_ret(); - - /* just return if only deletion of previous data is requested */ - if (!node_name) - return NULL; - - /* Get needed pointers */ - ckt = g_mif_info.ckt; - if (!ckt) { - fprintf(cp_err, "Error: no circuit loaded.\n"); - return NULL; - } - node_table = ckt->evt->info.node_table; - - /* Get data for the node */ - node_index = get_index(node_name); - if(node_index < 0) { - fprintf(cp_err, "ERROR - Node %s is not an event node.\n", node_name); - return NULL; - } - udn_index = node_table[node_index]->udn_index; - if (ckt->evt->data.node) - node_data = ckt->evt->data.node->head[node_index]; - else { - fprintf(cp_err, "ERROR - No node data: simulation not yet run?\n"); - return NULL; - } - node_value = ""; - - /* Scan the node data and determine if the first vector */ - /* is for a DCOP analysis or the first step in a swept DC */ - /* or transient analysis. Also, determine if there is */ - /* more data following it and if so, what the next step */ - /* is. */ - more = MIF_FALSE; - dcop = MIF_FALSE; - next_step = 1e30; - - if(node_data->op) - dcop = MIF_TRUE; - else - step = node_data->step; - (*(g_evt_udn_info[udn_index]->print_val)) - (node_data->node_value, "all", &value); - node_value = value; - node_data = node_data->next; - if(node_data) { - more = MIF_TRUE; - if(node_data->step < next_step) - next_step = node_data->step; - } - - /* Count the number of data points of this node */ - count_data = node_data; - num_points = 0; - while (count_data) { - num_points++; - count_data = count_data->next; - } - - /* Store the data */ - return_node = TMALLOC(pevt_data, num_points + 1); - pevt_data newnode = TMALLOC(evt_data, 1); - newnode->dcop = dcop; - newnode->node_value = copy(value); - newnode->step = step; - return_node[0] = newnode; - - /* While there is more data, get the next values and print */ - i = 1; - while(more) { - - more = MIF_FALSE; - this_step = next_step; - next_step = 1e30; - - if(node_data) { - if(node_data->step == this_step) { - (*(g_evt_udn_info[udn_index]->print_val)) - (node_data->node_value, "all", &value); - node_value = value; - node_data = node_data->next; - } - if(node_data) { - more = MIF_TRUE; - if(node_data->step < next_step) - next_step = node_data->step; - } - - } /* end if node_data not NULL */ - - newnode = TMALLOC(evt_data, 1); - newnode->dcop = dcop; - newnode->node_value = copy(value); - newnode->step = this_step; - return_node[i] = newnode; - i++; - } /* end while there is more data */ - return_all = TMALLOC(evt_shared_data, 1); - return_all->evt_dect = return_node; - return_all->num_steps = i; - - return return_all; -} - - - - -/* -get_index - -This function determines the index of a specified event-driven node. -*/ - - -static int get_index( - char *node_name /* The name of the node to search for */ -) -{ - - /* Get the event-driven node index for the specified name */ - - int index; - - Mif_Boolean_t found; - Evt_Node_Info_t *node; - CKTcircuit *ckt; - - - /* Scan list of nodes in event structure to see if there */ - - found = MIF_FALSE; - index = 0; - - ckt = g_mif_info.ckt; - if (!ckt) { - fprintf(cp_err, "Error: no circuit loaded.\n"); - return(-1); - } - node = ckt->evt->info.node_list; - - while(node) { - if(strcmp(node_name, node->name) == 0) { - found = MIF_TRUE; - break; - } - else { - index++; - node = node->next; - } - } - - /* Return the index or -1 if not found */ - if(! found) - return(-1); - else - return(index); -} - - -char** EVTallnodes(void) -{ - static char** allnodes; - int len = 0, i = 0; - Evt_Node_Info_t *node; - CKTcircuit *ckt = g_mif_info.ckt; - if (!ckt) { - fprintf(cp_err, "Error: no circuit loaded.\n"); - return NULL; - } - if (allnodes) - tfree(allnodes); - node = ckt->evt->info.node_list; - /* count the event nodes */ - while (node) { - len++; - node = node->next; - } - if (len == 0) { - fprintf(cp_err, "Error: no event nodes found.\n"); - return NULL; - } - allnodes = TMALLOC(char*, len + 1); - node = ckt->evt->info.node_list; - for (i = 0; i < len; i++) { - allnodes[i] = node->name; - node = node->next; - } - allnodes[len] = NULL; - return allnodes; -} diff --git a/src/xspice/evt/evttermi.c b/src/xspice/evt/evttermi.c deleted file mode 100644 index 5f591ccef..000000000 --- a/src/xspice/evt/evttermi.c +++ /dev/null @@ -1,515 +0,0 @@ -/*============================================================================ -FILE EVTtermInsert.c - -MEMBER OF process XSPICE - -Public Domain - -Georgia Tech Research Corporation -Atlanta, Georgia 30332 -PROJECT A-8503 - -AUTHORS - - 9/12/91 Bill Kuhn - -MODIFICATIONS - - - -SUMMARY - - This file contains function EVTtermInsert which is called by - MIF_INP2A during the parsing of the input deck. EVTtermInsert is - similar to SPICE3's INPtermInsert except that it is used when the node - type is event-driven. Calls to this function build the info lists - for instances, nodes, outputs, and ports. The completion of the info - struct is carried out by EVTinit following the parsing of all - instances in the deck. - -INTERFACES - - void EVTtermInsert( - CKTcircuit *ckt, - MIFinstance *fast, - char *node_name, - char *type_name, - int conn_num, - int port_num, - char **err_msg) - -REFERENCED FILES - - None. - -NON-STANDARD FEATURES - - None. - -============================================================================*/ - -#include "ngspice/ngspice.h" -//#include "misc.h" - -#include "ngspice/cktdefs.h" -//#include "util.h" - -#include "ngspice/mif.h" -#include "ngspice/evt.h" -#include "ngspice/evtudn.h" - -#include "ngspice/mifproto.h" -#include "ngspice/evtproto.h" - - -static void EVTinst_insert( - CKTcircuit *ckt, - MIFinstance *fast, - int *inst_index, - char **err_msg); - -static void EVTnode_insert( - CKTcircuit *ckt, - MIFinstance *fast, - int inst_index, - char *node_name, - char *type_name, - int conn_num, - int port_num, - int *node_index, - int *output_subindex, - char **err_msg); - -static void EVTport_insert( - CKTcircuit *ckt, - MIFinstance *fast, - int inst_index, - int node_index, - char *node_name, - int conn_num, - int port_num, - int *port_index, - char **err_msg); - -static void EVToutput_insert( - CKTcircuit *ckt, - MIFinstance *fast, - int inst_index, - int node_index, - int port_index, - int output_subindex, - int conn_num, - int port_num, - char **err_msg); - - -/* -EVTtermInsert - -This function is called by MIF_INP2A during the parsing of the input -deck. EVTtermInsert is similar to 3C1's INPtermInsert except that it is -used when the node type is event-driven. Calls to this function build -the info lists for instances, nodes, outputs, and ports. The -completion of the info struct is carried out by EVTinit following -the parsing of all instances in the deck. -*/ - - -void EVTtermInsert( - CKTcircuit *ckt, /* The circuit structure */ - MIFinstance *fast, /* The instance being parsed */ - char *node_name, /* The node name */ - char *type_name, /* The type of node */ - int conn_num, /* The port connection number */ - int port_num, /* The sub-port number - 0 for scalar ports */ - char **err_msg) /* Returned error message if any */ -{ - - int inst_index; - int node_index; - int port_index; - - int output_subindex; - - - /* Get the instance index and create new entry in inst */ - /* info list if this is a new instance. */ - EVTinst_insert(ckt, fast, &inst_index, err_msg); - if(*err_msg) - return; - - /* Get the node index and create new entry in node info */ - /* list if this is a new node */ - EVTnode_insert(ckt, fast, inst_index, node_name, type_name, - conn_num, port_num, &node_index, &output_subindex, - err_msg); - if(*err_msg) - return; - - /* Create new entry in port info list and return port index */ - EVTport_insert(ckt, fast, inst_index, node_index, node_name, conn_num, - port_num, &port_index, err_msg); - if(*err_msg) - return; - - /* Create new entry in output info list if appropriate */ - if(fast->conn[conn_num]->is_output) { - EVToutput_insert(ckt, fast, inst_index, node_index, port_index, - output_subindex, conn_num, port_num, err_msg); - if(*err_msg) - return; - } -} - - - - -/* -EVTinst_insert - -This function locates or creates a new entry for the specified -instance in the event-driven ``info'' structures during parsing. -*/ - - -static void EVTinst_insert( - CKTcircuit *ckt, /* The circuit structure */ - MIFinstance *fast, /* The instance being parsed */ - int *inst_index, /* The index found or added */ - char **err_msg) /* Error message if any */ -{ - - Mif_Boolean_t found; - int index; - - Evt_Inst_Info_t *inst; - Evt_Inst_Info_t **inst_ptr; - - NG_IGNORE(err_msg); - - - /* Scan list of instances in event structure to see if already there */ - /* and get the index */ - found = MIF_FALSE; - index = 0; - inst = ckt->evt->info.inst_list; - inst_ptr = &(ckt->evt->info.inst_list); - - while(inst) { - if(inst->inst_ptr == fast) { - found = MIF_TRUE; - break; - } - else { - index++; - inst_ptr = &(inst->next); - inst = inst->next; - } - } - - - /* If not found, create a new entry in list and increment the */ - /* instance count in the event structure */ - if(! found) { - *inst_ptr = TMALLOC(Evt_Inst_Info_t, 1); - inst = *inst_ptr; - inst->next = NULL; - inst->inst_ptr = fast; - index = ckt->evt->counts.num_insts; - (ckt->evt->counts.num_insts)++; - } - - /* Record the inst index in the MIFinstance structure and return it */ - fast->inst_index = index; - *inst_index = index; -} - - - -/* -EVTnode_insert - -This function locates or creates a new entry for the specified -node in the event-driven ``info'' structures during parsing. -*/ - - -static void EVTnode_insert( - CKTcircuit *ckt, /* The circuit structure */ - MIFinstance *fast, /* The instance being parsed */ - int inst_index, /* The index of inst in evt structures */ - char *node_name, /* The node name */ - char *type_name, /* The node type specified */ - int conn_num, /* The port connection number */ - int port_num, /* The sub-port number - 0 if scalar port */ - int *node_index, /* The node index found or added */ - int *output_subindex, /* The output number on this node */ - char **err_msg) /* Error message text if any */ -{ - - int i; - int udn_index=0; - Mif_Boolean_t found; - - int index; - - Evt_Node_Info_t *node; - Evt_Node_Info_t **node_ptr; - - Evt_Inst_Index_t *inst; - Evt_Inst_Index_t **inst_ptr; - - - /* *************************************** */ - /* Get and check the node type information */ - /* *************************************** */ - - /* Scan the list of user-defined node types and get the index */ - found = MIF_FALSE; - for(i = 0; i < g_evt_num_udn_types; i++) { - if(strcmp(type_name, g_evt_udn_info[i]->name) == 0) { - udn_index = i; - found = MIF_TRUE; - break; - } - } - - /* Report error if not recognized */ - if(! found) { - *err_msg = "Unrecognized connection type"; - return; - } - - /* If inverted, check to be sure invert function exists for type */ - if(fast->conn[conn_num]->port[port_num]->invert) { - if(g_evt_udn_info[udn_index]->invert == NULL) { - *err_msg = "Connection type cannot be inverted"; - return; - } - } - - - /* ******************************************* */ - /* Find/create entry in event-driven node list */ - /* ******************************************* */ - - /* Scan list of nodes in event structure to see if already there */ - /* and get the index */ - found = MIF_FALSE; - index = 0; - node = ckt->evt->info.node_list; - node_ptr = &(ckt->evt->info.node_list); - - while(node) { - if(strcmp(node_name, node->name) == 0) { - found = MIF_TRUE; - break; - } - else { - index++; - node_ptr = &(node->next); - node = node->next; - } - } - - - /* If found, verify that connection type is same as type of node */ - if(found) { - if(udn_index != node->udn_index) { - *err_msg = "Node cannot have two different types"; - return; - } - } - - /* If not found, create a new entry in list and increment the */ - /* node count in the event structure */ - if(! found) { - *node_ptr = TMALLOC(Evt_Node_Info_t, 1); - node = *node_ptr; - node->next = NULL; - node->name = MIFcopy(node_name); - node->udn_index = udn_index; - node->save = MIF_TRUE; /* Backward compatible behaviour: save all. */ - index = ckt->evt->counts.num_nodes; - (ckt->evt->counts.num_nodes)++; - } - - - /* ******************************************* */ - /* Update remaining items in node list struct */ - /* ******************************************* */ - - /* Update flag on node that indicates if inversion is used by any */ - /* instance inputs */ - if(fast->conn[conn_num]->is_input) - if(! node->invert) - node->invert = fast->conn[conn_num]->port[port_num]->invert; - - /* Increment counts of ports, outputs connected to node */ - (node->num_ports)++; - if(fast->conn[conn_num]->is_output) - (node->num_outputs)++; - - /* If this is an input, add instance to list if not already there */ - if(fast->conn[conn_num]->is_input) { - - found = MIF_FALSE; - inst = node->inst_list; - inst_ptr = &(node->inst_list); - - while(inst) { - if(inst_index == inst->index) { - found = MIF_TRUE; - break; - } - else { - inst_ptr = &(inst->next); - inst = inst->next; - } - } - - if(! found) { - (node->num_insts)++; - *inst_ptr = TMALLOC(Evt_Inst_Index_t, 1); - inst = *inst_ptr; - inst->next = NULL; - inst->index = inst_index; - } - } - - /* Record the node index in the MIFinstance structure */ - fast->conn[conn_num]->port[port_num]->evt_data.node_index = index; - - /* Return the node index */ - *node_index = index; - if(fast->conn[conn_num]->is_output) - *output_subindex = node->num_outputs - 1; - else - *output_subindex = 0; /* just for safety - shouldn't need this */ -} - - - -/* -EVTport_insert - -This function locates or creates a new entry for the specified -port in the event-driven ``info'' structures during parsing. -*/ - - -static void EVTport_insert( - CKTcircuit *ckt, /* The circuit structure */ - MIFinstance *fast, /* The instance being parsed */ - int inst_index, /* The index of inst in evt structures */ - int node_index, /* The index of the node in evt structures */ - char *node_name, /* The node name */ - int conn_num, /* The port connection number */ - int port_num, /* The sub-port number - 0 if scalar port */ - int *port_index, /* The port index found or added */ - char **err_msg) /* Error message text if any */ -{ - - Evt_Port_Info_t *port; - Evt_Port_Info_t **port_ptr; - - int index; - - NG_IGNORE(err_msg); - - /* Find the end of the port info list */ - port = ckt->evt->info.port_list; - port_ptr = &(ckt->evt->info.port_list); - - index = 0; - while(port) { - port_ptr = &(port->next); - port = port->next; - index++; - } - - - /* Update the port count and create a new entry in the list */ - - (ckt->evt->counts.num_ports)++; - - *port_ptr = TMALLOC(Evt_Port_Info_t, 1); - port = *port_ptr; - - /* Fill in the elements */ - port->next = NULL; - port->inst_index = inst_index; - port->node_index = node_index; - port->node_name = MIFcopy(node_name); - port->inst_name = MIFcopy(fast->MIFname); - port->conn_name = MIFcopy(fast->conn[conn_num]->name); - port->port_num = port_num; - - /* Record the port index in the MIFinstance structure */ - fast->conn[conn_num]->port[port_num]->evt_data.port_index = index; - - /* Return the port index */ - *port_index = index; -} - - - - -/* -EVToutput_insert - -This function locates or creates a new entry for the specified -output in the event-driven ``info'' structures during parsing. -*/ - - -static void EVToutput_insert( - CKTcircuit *ckt, /* The circuit structure */ - MIFinstance *fast, /* The instance being parsed */ - int inst_index, /* The index of inst in evt structures */ - int node_index, /* The index of the node in evt structures */ - int port_index, /* The index of the port in the evt structures */ - int output_subindex, /* The output on this node */ - int conn_num, /* The port connection number */ - int port_num, /* The sub-port number - 0 if scalar port */ - char **err_msg) /* Error message text if any */ -{ - Evt_Output_Info_t *output; - Evt_Output_Info_t **output_ptr; - - int index; - - NG_IGNORE(err_msg); - - /* Find the end of the port info list */ - output = ckt->evt->info.output_list; - output_ptr = &(ckt->evt->info.output_list); - - index = 0; - while(output) { - output_ptr = &(output->next); - output = output->next; - index++; - } - - - /* Update the port count and create a new entry in the list */ - - (ckt->evt->counts.num_outputs)++; - - *output_ptr = TMALLOC(Evt_Output_Info_t, 1); - output = *output_ptr; - - /* Fill in the elements */ - output->next = NULL; - output->inst_index = inst_index; - output->node_index = node_index; - output->port_index = port_index; - output->output_subindex = output_subindex; - - /* Record the output index and subindex in the MIFinstance structure */ - fast->conn[conn_num]->port[port_num]->evt_data.output_index = index; - fast->conn[conn_num]->port[port_num]->evt_data.output_subindex - = output_subindex; - -} diff --git a/src/xspice/examples/d_to_real/Makefile b/src/xspice/examples/d_to_real/Makefile deleted file mode 100644 index 40a779e07..000000000 --- a/src/xspice/examples/d_to_real/Makefile +++ /dev/null @@ -1,37 +0,0 @@ -# -# Makefile for Code Model directories -# - -# Include global XSPICE selections for CC and other macros -include /usr/local/xspice-1-0/include/make.include - -INCLUDE = -I. -I$(ROOT)/include/sim - -CFLAGS = -g - -#----------------------------------------------------------------------------- -# Edit the following definition to specify the object files that comprise -# your code model. If your code model is completely specified in the -# cfunc.mod file, there is no need to edit this definition. -# DO NOT include the ifspec.o file. - -CODE_MODEL_OBJECTS = cfunc.o - -#----------------------------------------------------------------------------- -# DO NOT MODIFY THE FOLLOWING DEFINITIONS: - -.SUFFIXES: $(SUFFIXES) .mod .ifs - -.mod.c: - $(BINDIR)/cmpp -mod $< - -.ifs.c: - $(BINDIR)/cmpp -ifs - -.c.o: $*.c - ${CC} ${CFLAGS} ${INCLUDE} -c $*.c - -all : ifspec.o $(CODE_MODEL_OBJECTS) - -cfunc.o : cfunc.c -ifspec.o : ifspec.c diff --git a/src/xspice/examples/d_to_real/cfunc.mod b/src/xspice/examples/d_to_real/cfunc.mod deleted file mode 100644 index be6e0a34d..000000000 --- a/src/xspice/examples/d_to_real/cfunc.mod +++ /dev/null @@ -1,38 +0,0 @@ - -void ucm_d_to_real (ARGS) -{ - - Digital_State_t in; - - double *out; - double delay; - double zero; - double one; - double ena; - - - in = INPUT_STATE(in); - if(PORT_NULL(enable)) - ena = 1.0; - else if(INPUT_STATE(enable) == ONE) - ena = 1.0; - else - ena = 0.0; - out = OUTPUT(out); - - zero = PARAM(zero); - one = PARAM(one); - delay = PARAM(delay); - - - if(in == ZERO) - *out = zero * ena; - else if(in == UNKNOWN) - *out = (zero + one) / 2.0 * ena; - else - *out = one * ena; - - if(TIME > 0.0) - OUTPUT_DELAY(out) = delay; - -} diff --git a/src/xspice/examples/d_to_real/ifspec.ifs b/src/xspice/examples/d_to_real/ifspec.ifs deleted file mode 100644 index 02d110aab..000000000 --- a/src/xspice/examples/d_to_real/ifspec.ifs +++ /dev/null @@ -1,31 +0,0 @@ - -NAME_TABLE: - -Spice_Model_Name: d_to_real -C_Function_Name: ucm_d_to_real -Description: "Node bridge from digital to real with enable" - - -PORT_TABLE: - -Port_Name: in enable out -Description: "input" "enable" "output" -Direction: in in out -Default_Type: d d real -Allowed_Types: [d] [d] [real] -Vector: no no no -Vector_Bounds: - - - -Null_Allowed: no yes no - - -PARAMETER_TABLE: - -Parameter_Name: zero one delay -Description: "value for 0" "value for 1" "delay" -Data_Type: real real real -Default_Value: 0.0 1.0 1e-9 -Limits: - - [1e-15 -] -Vector: no no no -Vector_Bounds: - - - -Null_Allowed: yes yes yes - diff --git a/src/xspice/examples/nco/Makefile b/src/xspice/examples/nco/Makefile deleted file mode 100644 index 40a779e07..000000000 --- a/src/xspice/examples/nco/Makefile +++ /dev/null @@ -1,37 +0,0 @@ -# -# Makefile for Code Model directories -# - -# Include global XSPICE selections for CC and other macros -include /usr/local/xspice-1-0/include/make.include - -INCLUDE = -I. -I$(ROOT)/include/sim - -CFLAGS = -g - -#----------------------------------------------------------------------------- -# Edit the following definition to specify the object files that comprise -# your code model. If your code model is completely specified in the -# cfunc.mod file, there is no need to edit this definition. -# DO NOT include the ifspec.o file. - -CODE_MODEL_OBJECTS = cfunc.o - -#----------------------------------------------------------------------------- -# DO NOT MODIFY THE FOLLOWING DEFINITIONS: - -.SUFFIXES: $(SUFFIXES) .mod .ifs - -.mod.c: - $(BINDIR)/cmpp -mod $< - -.ifs.c: - $(BINDIR)/cmpp -ifs - -.c.o: $*.c - ${CC} ${CFLAGS} ${INCLUDE} -c $*.c - -all : ifspec.o $(CODE_MODEL_OBJECTS) - -cfunc.o : cfunc.c -ifspec.o : ifspec.c diff --git a/src/xspice/examples/nco/cfunc.mod b/src/xspice/examples/nco/cfunc.mod deleted file mode 100644 index a2afa26ae..000000000 --- a/src/xspice/examples/nco/cfunc.mod +++ /dev/null @@ -1,91 +0,0 @@ - -void *malloc(unsigned); - -#define OUT_STATE 0 -#define NXT_TIME 1 -#define NUM_NOTES 128 - - -/* A numerically controlled oscillator. Output frequencies */ -/* are determined according to the MIDI note number at input */ - -void ucm_nco (ARGS) -{ - - double *freq; - - int *output_state; - double *next_time; - - int i; - int index; - int scale_factor; - - double half_period; - - - if(INIT) { - - /* Setup storage for the toggled output state */ - cm_event_alloc(OUT_STATE, sizeof(int)); - cm_event_alloc(NXT_TIME, sizeof(double)); - output_state = (int *) cm_event_get_ptr(OUT_STATE, 0); - next_time = (double *) cm_event_get_ptr(NXT_TIME, 0); - - /* Allocate storage for frequencies */ - STATIC_VAR(freq) = malloc(NUM_NOTES * sizeof(double)); - freq = STATIC_VAR(freq); - - /* Initialize the frequency array */ - for(i = 0; i < NUM_NOTES; i++) { - if(i == 0) - freq[0] = 8.17578 * PARAM(mult_factor); - else - freq[i] = freq[i-1] * 1.059463094; - } - } - else { - - /* Get old output state */ - output_state = (int *) cm_event_get_ptr(OUT_STATE, 0); - next_time = (double *) cm_event_get_ptr(NXT_TIME, 0); - } - - - /* Convert the input bits to an integer */ - index = 0; - scale_factor = 64; - for(i = 0; i < 7; i++) { - if(INPUT_STATE(in[i]) == ONE) - index += scale_factor; - scale_factor /= 2; - } - - /* Look up the frequency and compute half its period */ - freq = STATIC_VAR(freq); - half_period = 1.0 / freq[index]; - - - /* Queue up events and output the new state */ - if(TIME == 0.0) { - *next_time = half_period; - cm_event_queue(*next_time); - OUTPUT_STATE(out) = *output_state; - } - else { - if(TIME == *next_time) { - *next_time = TIME + half_period; - cm_event_queue(*next_time); - *output_state = 1 - *output_state; - OUTPUT_STATE(out) = *output_state; - OUTPUT_DELAY(out) = PARAM(delay); - } - else - OUTPUT_CHANGED(out) = FALSE; - } - -} - - - - diff --git a/src/xspice/examples/nco/ifspec.ifs b/src/xspice/examples/nco/ifspec.ifs deleted file mode 100644 index 4f8729043..000000000 --- a/src/xspice/examples/nco/ifspec.ifs +++ /dev/null @@ -1,37 +0,0 @@ - -NAME_TABLE: - -Spice_Model_Name: nco -C_Function_Name: ucm_nco -Description: "A simple MIDI numerically controlled oscillator" - - -PORT_TABLE: - -Port_Name: in out -Description: "program input" "oscillator output" -Direction: in out -Default_Type: d d -Allowed_Types: [d] [d] -Vector: yes no -Vector_Bounds: [7 7] - -Null_Allowed: no no - - -PARAMETER_TABLE: - -Parameter_Name: delay mult_factor -Description: "output delay" "freq multiplier" -Data_Type: real real -Default_Value: 1e-9 1 -Limits: [1e-15 -] [1e-9 -] -Vector: no no -Vector_Bounds: - - -Null_Allowed: yes yes - - -STATIC_VAR_TABLE: - -Static_Var_Name: freq -Data_Type: pointer -Description: "frequencies of notes" diff --git a/src/xspice/examples/print_param_types/Makefile b/src/xspice/examples/print_param_types/Makefile deleted file mode 100644 index 40a779e07..000000000 --- a/src/xspice/examples/print_param_types/Makefile +++ /dev/null @@ -1,37 +0,0 @@ -# -# Makefile for Code Model directories -# - -# Include global XSPICE selections for CC and other macros -include /usr/local/xspice-1-0/include/make.include - -INCLUDE = -I. -I$(ROOT)/include/sim - -CFLAGS = -g - -#----------------------------------------------------------------------------- -# Edit the following definition to specify the object files that comprise -# your code model. If your code model is completely specified in the -# cfunc.mod file, there is no need to edit this definition. -# DO NOT include the ifspec.o file. - -CODE_MODEL_OBJECTS = cfunc.o - -#----------------------------------------------------------------------------- -# DO NOT MODIFY THE FOLLOWING DEFINITIONS: - -.SUFFIXES: $(SUFFIXES) .mod .ifs - -.mod.c: - $(BINDIR)/cmpp -mod $< - -.ifs.c: - $(BINDIR)/cmpp -ifs - -.c.o: $*.c - ${CC} ${CFLAGS} ${INCLUDE} -c $*.c - -all : ifspec.o $(CODE_MODEL_OBJECTS) - -cfunc.o : cfunc.c -ifspec.o : ifspec.c diff --git a/src/xspice/examples/print_param_types/cfunc.mod b/src/xspice/examples/print_param_types/cfunc.mod deleted file mode 100644 index d9a9b4a73..000000000 --- a/src/xspice/examples/print_param_types/cfunc.mod +++ /dev/null @@ -1,28 +0,0 @@ - -void ucm_print_param_types (ARGS) -{ - int i; - - if(INIT) { - /* Print scalar parameters */ - printf("\nScalar parameters\n\n"); - printf("integer = %d\n", PARAM(integer)); - printf("real = %e\n", PARAM(real)); - printf("complex = <%e %e>\n", PARAM(complex).real, - PARAM(complex).imag); - printf("string = %s\n", PARAM(string)); - - /* Print vector parameters */ - printf("\nVector parameters\n\n"); - for(i = 0; i < PARAM_SIZE(integer_array); i++) - printf("integer = %d\n", PARAM(integer_array[i])); - for(i = 0; i < PARAM_SIZE(real_array); i++) - printf("real = %e\n", PARAM(real_array[i])); - for(i = 0; i < PARAM_SIZE(complex_array); i++) - printf("complex = <%e %e>\n", PARAM(complex_array[i]).real, - PARAM(complex_array[i]).imag); - for(i = 0; i < PARAM_SIZE(string_array); i++) - printf("string = %s\n", PARAM(string_array[i])); - - } -} diff --git a/src/xspice/examples/print_param_types/ifspec.ifs b/src/xspice/examples/print_param_types/ifspec.ifs deleted file mode 100644 index a20b9925c..000000000 --- a/src/xspice/examples/print_param_types/ifspec.ifs +++ /dev/null @@ -1,111 +0,0 @@ - -NAME_TABLE: - -Spice_Model_Name: print_param_types -C_Function_Name: ucm_print_param_types -Description: "ignores its input, but prints its parameters" - - -PORT_TABLE: - - -Port_Name: in -Description: "input" -Direction: in -Default_Type: v -Allowed_Types: [v,vd,i,id,vnam] -Vector: yes -Vector_Bounds: - -Null_Allowed: no - - - -PARAMETER_TABLE: - -Parameter_Name: integer -Description: "integer parameter" -Data_Type: int -Default_Value: 1 -Limits: - -Vector: no -Vector_Bounds: - -Null_Allowed: yes - -PARAMETER_TABLE: - -Parameter_Name: real -Description: "real parameter" -Data_Type: real -Default_Value: 1 -Limits: - -Vector: no -Vector_Bounds: - -Null_Allowed: yes - -PARAMETER_TABLE: - -Parameter_Name: complex -Description: "complex parameter" -Data_Type: complex -Default_Value: <1.0, 1.0> -Limits: - -Vector: no -Vector_Bounds: - -Null_Allowed: yes - -PARAMETER_TABLE: - -Parameter_Name: string -Description: "string parameter" -Data_Type: string -Default_Value: "one" -Limits: - -Vector: no -Vector_Bounds: - -Null_Allowed: yes - -PARAMETER_TABLE: - -Parameter_Name: integer_array -Description: "integer array parameter" -Data_Type: int -Default_Value: 1 -Limits: - -Vector: yes -Vector_Bounds: in -Null_Allowed: yes - -PARAMETER_TABLE: - -Parameter_Name: real_array -Description: "real array parameter" -Data_Type: real -Default_Value: 1 -Limits: - -Vector: yes -Vector_Bounds: in -Null_Allowed: yes - -PARAMETER_TABLE: - -Parameter_Name: complex_array -Description: "complex array parameter" -Data_Type: complex -Default_Value: <1.0 1.0> -Limits: - -Vector: yes -Vector_Bounds: in -Null_Allowed: yes - -PARAMETER_TABLE: - -Parameter_Name: string_array -Description: "string array parameter" -Data_Type: string -Default_Value: "one" -Limits: - -Vector: yes -Vector_Bounds: in -Null_Allowed: yes - - diff --git a/src/xspice/examples/real_delay/Makefile b/src/xspice/examples/real_delay/Makefile deleted file mode 100644 index 40a779e07..000000000 --- a/src/xspice/examples/real_delay/Makefile +++ /dev/null @@ -1,37 +0,0 @@ -# -# Makefile for Code Model directories -# - -# Include global XSPICE selections for CC and other macros -include /usr/local/xspice-1-0/include/make.include - -INCLUDE = -I. -I$(ROOT)/include/sim - -CFLAGS = -g - -#----------------------------------------------------------------------------- -# Edit the following definition to specify the object files that comprise -# your code model. If your code model is completely specified in the -# cfunc.mod file, there is no need to edit this definition. -# DO NOT include the ifspec.o file. - -CODE_MODEL_OBJECTS = cfunc.o - -#----------------------------------------------------------------------------- -# DO NOT MODIFY THE FOLLOWING DEFINITIONS: - -.SUFFIXES: $(SUFFIXES) .mod .ifs - -.mod.c: - $(BINDIR)/cmpp -mod $< - -.ifs.c: - $(BINDIR)/cmpp -ifs - -.c.o: $*.c - ${CC} ${CFLAGS} ${INCLUDE} -c $*.c - -all : ifspec.o $(CODE_MODEL_OBJECTS) - -cfunc.o : cfunc.c -ifspec.o : ifspec.c diff --git a/src/xspice/examples/real_delay/cfunc.mod b/src/xspice/examples/real_delay/cfunc.mod deleted file mode 100644 index 5a7f420c7..000000000 --- a/src/xspice/examples/real_delay/cfunc.mod +++ /dev/null @@ -1,46 +0,0 @@ - - -#define CLK_STATE 0 - - -void ucm_real_delay (ARGS) -{ - - double *in; - double *out; - - Digital_State_t *state; - Digital_State_t *old_state; - - - if(INIT) { - cm_event_alloc(CLK_STATE, sizeof(Digital_State_t)); - state = (void *) cm_event_get_ptr(CLK_STATE, 0); - old_state = state; - *state = INPUT_STATE(clk); - } - else { - state = (void *) cm_event_get_ptr(CLK_STATE, 0); - old_state = (void *) cm_event_get_ptr(CLK_STATE, 1); - } - - if(ANALYSIS != TRANSIENT) - OUTPUT_CHANGED(out) = FALSE; - else { - *state = INPUT_STATE(clk); - if(*state == *old_state) - OUTPUT_CHANGED(out) = FALSE; - else if(*state != ONE) - OUTPUT_CHANGED(out) = FALSE; - else { - in = INPUT(in); - out = OUTPUT(out); - *out = *in; - OUTPUT_DELAY(out) = PARAM(delay); - } - } -} - - - - diff --git a/src/xspice/examples/real_delay/ifspec.ifs b/src/xspice/examples/real_delay/ifspec.ifs deleted file mode 100644 index cd19e8494..000000000 --- a/src/xspice/examples/real_delay/ifspec.ifs +++ /dev/null @@ -1,32 +0,0 @@ - -NAME_TABLE: - -Spice_Model_Name: real_delay -C_Function_Name: ucm_real_delay -Description: "A Z ** -1 block working on real data" - - -PORT_TABLE: - -Port_Name: in clk out -Description: "input" "clock" "output" -Direction: in in out -Default_Type: real d real -Allowed_Types: [real] [d] [real] -Vector: no no no -Vector_Bounds: - - - -Null_Allowed: no no no - - -PARAMETER_TABLE: - -Parameter_Name: delay -Description: "delay from clk to out" -Data_Type: real -Default_Value: 1e-9 -Limits: [1e-15 -] -Vector: no -Vector_Bounds: - -Null_Allowed: yes - - diff --git a/src/xspice/examples/real_gain/Makefile b/src/xspice/examples/real_gain/Makefile deleted file mode 100644 index 40a779e07..000000000 --- a/src/xspice/examples/real_gain/Makefile +++ /dev/null @@ -1,37 +0,0 @@ -# -# Makefile for Code Model directories -# - -# Include global XSPICE selections for CC and other macros -include /usr/local/xspice-1-0/include/make.include - -INCLUDE = -I. -I$(ROOT)/include/sim - -CFLAGS = -g - -#----------------------------------------------------------------------------- -# Edit the following definition to specify the object files that comprise -# your code model. If your code model is completely specified in the -# cfunc.mod file, there is no need to edit this definition. -# DO NOT include the ifspec.o file. - -CODE_MODEL_OBJECTS = cfunc.o - -#----------------------------------------------------------------------------- -# DO NOT MODIFY THE FOLLOWING DEFINITIONS: - -.SUFFIXES: $(SUFFIXES) .mod .ifs - -.mod.c: - $(BINDIR)/cmpp -mod $< - -.ifs.c: - $(BINDIR)/cmpp -ifs - -.c.o: $*.c - ${CC} ${CFLAGS} ${INCLUDE} -c $*.c - -all : ifspec.o $(CODE_MODEL_OBJECTS) - -cfunc.o : cfunc.c -ifspec.o : ifspec.c diff --git a/src/xspice/examples/real_gain/cfunc.mod b/src/xspice/examples/real_gain/cfunc.mod deleted file mode 100644 index fc307961a..000000000 --- a/src/xspice/examples/real_gain/cfunc.mod +++ /dev/null @@ -1,36 +0,0 @@ - -void ucm_real_gain (ARGS) -{ - double *in; - double *out; - - double in_offset; - double gain; - double out_offset; - double delay; - double ic; - - - /* Get the input and output pointers */ - in = INPUT(in); - out = OUTPUT(out); - - /* Get the parameters */ - in_offset = PARAM(in_offset); - gain = PARAM(gain); - out_offset = PARAM(out_offset); - delay = PARAM(delay); - ic = PARAM(ic); - - - /* Assign the output and delay */ - if(ANALYSIS == DC) { - *out = ic; - if(INIT) - cm_event_queue(delay); - } - else { - *out = gain * (*in + in_offset) + out_offset; - OUTPUT_DELAY(out) = delay; - } -} diff --git a/src/xspice/examples/real_gain/ifspec.ifs b/src/xspice/examples/real_gain/ifspec.ifs deleted file mode 100644 index d0d187637..000000000 --- a/src/xspice/examples/real_gain/ifspec.ifs +++ /dev/null @@ -1,44 +0,0 @@ - -NAME_TABLE: - -Spice_Model_Name: real_gain -C_Function_Name: ucm_real_gain -Description: "A gain block for event-driven real data" - - -PORT_TABLE: - -Port_Name: in out -Description: "input" "output" -Direction: in out -Default_Type: real real -Allowed_Types: [real] [real] -Vector: no no -Vector_Bounds: - - -Null_Allowed: no no - - -PARAMETER_TABLE: - -Parameter_Name: in_offset gain out_offset -Description: "input offset" "gain" "output offset" -Data_Type: real real real -Default_Value: 0.0 1.0 0.0 -Limits: - - - -Vector: no no no -Vector_Bounds: - - - -Null_Allowed: yes yes yes - - -PARAMETER_TABLE: - -Parameter_Name: delay ic -Description: "delay" "initial condition" -Data_Type: real real -Default_Value: 1.0e-9 0.0 -Limits: - - -Vector: no no -Vector_Bounds: - - -Null_Allowed: yes yes - - diff --git a/src/xspice/examples/real_to_v/Makefile b/src/xspice/examples/real_to_v/Makefile deleted file mode 100644 index 40a779e07..000000000 --- a/src/xspice/examples/real_to_v/Makefile +++ /dev/null @@ -1,37 +0,0 @@ -# -# Makefile for Code Model directories -# - -# Include global XSPICE selections for CC and other macros -include /usr/local/xspice-1-0/include/make.include - -INCLUDE = -I. -I$(ROOT)/include/sim - -CFLAGS = -g - -#----------------------------------------------------------------------------- -# Edit the following definition to specify the object files that comprise -# your code model. If your code model is completely specified in the -# cfunc.mod file, there is no need to edit this definition. -# DO NOT include the ifspec.o file. - -CODE_MODEL_OBJECTS = cfunc.o - -#----------------------------------------------------------------------------- -# DO NOT MODIFY THE FOLLOWING DEFINITIONS: - -.SUFFIXES: $(SUFFIXES) .mod .ifs - -.mod.c: - $(BINDIR)/cmpp -mod $< - -.ifs.c: - $(BINDIR)/cmpp -ifs - -.c.o: $*.c - ${CC} ${CFLAGS} ${INCLUDE} -c $*.c - -all : ifspec.o $(CODE_MODEL_OBJECTS) - -cfunc.o : cfunc.c -ifspec.o : ifspec.c diff --git a/src/xspice/examples/real_to_v/cfunc.mod b/src/xspice/examples/real_to_v/cfunc.mod deleted file mode 100644 index dd8efd87e..000000000 --- a/src/xspice/examples/real_to_v/cfunc.mod +++ /dev/null @@ -1,76 +0,0 @@ - - -#define TS 0 -#define VS 1 - - -void ucm_real_to_v (ARGS) -{ - - double *t, *v; - double *in; - - double out; - - - in = INPUT(in); - - if(INIT) { - cm_event_alloc(TS, 2 * sizeof(double)); - cm_event_alloc(VS, 2 * sizeof(double)); - t = (void *) cm_event_get_ptr(TS, 0); - v = (void *) cm_event_get_ptr(VS, 0); - t[0] = -2.0; - t[1] = -1.0; - v[0] = *in; - v[1] = *in; - } - else { - t = (void *) cm_event_get_ptr(TS, 0); - v = (void *) cm_event_get_ptr(VS, 0); - } - - switch(CALL_TYPE) { - - case ANALOG: - if(TIME == 0.0) { - OUTPUT(out) = *in; - v[0] = *in; - v[1] = *in; - } - else { - if(TIME <= t[0]) - OUTPUT(out) = v[0]; - else if(TIME >= t[1]) - OUTPUT(out) = v[1]; - else { - OUTPUT(out) = v[0] + (v[1] - v[0]) * - (TIME - t[0]) / (t[1] - t[0]); - } - } - break; - - case EVENT: - if(TIME == 0.0) - return; - if(TIME >= t[1]) { - v[0] = v[1]; - v[1] = *in; - t[0] = TIME; - t[1] = TIME + PARAM(transition_time); - } - else { - v[0] = v[0] + (v[1] - v[0]) * - (TIME - t[0]) / (t[1] - t[0]); - v[1] = *in; - t[0] = TIME; - t[1] = TIME + PARAM(transition_time); - } - break; - - } -} - - - - diff --git a/src/xspice/examples/real_to_v/ifspec.ifs b/src/xspice/examples/real_to_v/ifspec.ifs deleted file mode 100644 index c64f4d631..000000000 --- a/src/xspice/examples/real_to_v/ifspec.ifs +++ /dev/null @@ -1,32 +0,0 @@ - -NAME_TABLE: - -Spice_Model_Name: real_to_v -C_Function_Name: ucm_real_to_v -Description: "Node bridge from real to analog voltage" - - -PORT_TABLE: - -Port_Name: in out -Description: "input" "output" -Direction: in out -Default_Type: real v -Allowed_Types: [real] [v, vd, i, id] -Vector: no no -Vector_Bounds: - - -Null_Allowed: no no - - -PARAMETER_TABLE: - -Parameter_Name: gain transition_time -Description: "gain" "output transition time" -Data_Type: real real -Default_Value: 1.0 1e-9 -Limits: - [1e-15 -] -Vector: no no -Vector_Bounds: - - -Null_Allowed: yes yes - - diff --git a/src/xspice/icm/GNUmakefile.in b/src/xspice/icm/GNUmakefile.in deleted file mode 100644 index 662c4103f..000000000 --- a/src/xspice/icm/GNUmakefile.in +++ /dev/null @@ -1,199 +0,0 @@ -# The master makefile to make spiceopus (TM) like codemodels -# Under the GPLV2 or later license -# 2003 - Stefan Jones - - -include makedefs - - -# The codemodels to make -CMDIRS = spice2poly digital analog xtradev xtraevt table - - -#Invoke $(MAKE) for each of the CMDDIRS -all: dstring.o # One common dstring object file for all code modules - for cm in $(CMDIRS) ; do \ - $(MAKE) cm=$$cm $$cm/$$cm.cm \ - || exit 1; \ - done - - -install: all - $(MKDIR_P) "$(DESTDIR)$(pkglibdir)" - $(MKDIR_P) "$(DESTDIR)$(pkgdatadir)" - for cm in $(CMDIRS) ; do \ - $(INSTALL_PROGRAM) $$cm/$$cm.cm "$(DESTDIR)$(pkglibdir)" \ - || exit 1; \ - done -# $(INSTALL_DATA) $(srcdir)/dlmain.c "$(DESTDIR)$(pkgdatadir)" || exit $$?; - - -uninstall: - for cm in $(CMDIRS) ; do \ - rm -f "$(DESTDIR)$(pkglibdir)/$$cm.cm"; \ - done - - -clean: - rm -f dstring.o - for cm in $(CMDIRS) ; do \ - $(MAKE) cm=$$cm cm-clean \ - || exit 1; \ - done - - -#----------------------------------------------------------------------------- -NGSRCDIR = $(srcdir)/../.. -NGSRCBUILDDIR = $(CURDIR)/../.. - -dstring.o: $(NGSRCDIR)/misc/dstring.c $(NGSRCDIR)/include/ngspice/dstring.h - $(CC) $(CFLAGS) -I$(NGSRCDIR)/include -I$(NGSRCBUILDDIR)/include -fPIC -o $@ -c $< - -ifdef cm - -ifeq ($(OS),Windows_NT) - cmpp = ../cmpp/cmpp.exe -else - cmpp = ../cmpp/cmpp -endif -modlst := $(shell $(cmpp) -p $(srcdir)/$(cm)/modpath.lst) -udnlst := $(shell $(cmpp) -p $(srcdir)/$(cm)/udnpath.lst) - -cm-dirs := $(cm) $(udnlst:%=$(cm)/%) $(modlst:%=$(cm)/%) -cm-dep-dirs := $(cm-dirs:%=%/.deps) - - -cm-gens := \ - $(modlst:%=$(cm)/%/cfunc.c) \ - $(modlst:%=$(cm)/%/ifspec.c) - -cm-objs := \ - $(cm)/dlmain.o \ - dstring.o \ - $(modlst:%=$(cm)/%/cfunc.o) \ - $(modlst:%=$(cm)/%/ifspec.o) \ - $(udnlst:%=$(cm)/%/udnfunc.o) - -cm-deps := \ - $(cm)/.deps/dlmain.P \ - $(modlst:%=$(cm)/%/.deps/cfunc.P) \ - $(modlst:%=$(cm)/%/.deps/ifspec.P) \ - $(udnlst:%=$(cm)/%/.deps/udnfunc.P) - -cm-descr := \ - $(cm)/cmextrn.h \ - $(cm)/cminfo.h \ - $(cm)/cminfo2.h \ - $(cm)/udnextrn.h \ - $(cm)/udninfo.h \ - $(cm)/udninfo2.h \ - $(cm)/objects.inc - - --include $(cm-deps) - - -.SECONDARY : $(cm-gens) - - -cm-clean : - -rm -f $(cm)/$(cm).cm - -rm -f $(cm-descr) $(cm-objs) $(cm-gens) - -rm -f $(cm-deps) - -cm-distclean : - -rm -rf $(cm-dep-dirs) - -#----- - -$(cm)/$(cm).cm : $(cm-objs) - $(CC) $(CFLAGS) $(EXTRA_CFLAGS) $(VIS_CFLAGS) $(LDFLAGS) $^ $(LIBS) -o $@ - -# "order-only" prerequisites -# (info "(make) Prerequisite Types") - -$(cm-gens) $(cm-objs) $(cm-descr) : | cm-dirs - -cm-dirs : $(cm-dirs) $(cm-dep-dirs) - -$(cm-dirs) $(cm-dep-dirs) : - $(MKDIR_P) $(cm-dirs) $(cm-dep-dirs) - -#----- -# cancel builtin rules - -%.o : %.c -%.o : %.mod - -# multiple targets in a pattern group ... -# (info "(make) Pattern Intro") - -%/cmextrn.h %/cminfo.h %/udnextrn.h %/udninfo.h %/objects.inc : $(srcdir)/%/modpath.lst $(srcdir)/%/udnpath.lst - CMPP_IDIR=$(srcdir)/$(@D) CMPP_ODIR=$(@D) $(CMPP) -lst - -%/ifspec.c : $(srcdir)/%/ifspec.ifs - CMPP_IDIR=$(srcdir)/$(@D) CMPP_ODIR=$(@D) $(CMPP) -ifs - -%/cfunc.c : $(srcdir)/%/cfunc.mod - CMPP_IDIR=$(srcdir)/$(@D) CMPP_ODIR=$(@D) $(CMPP) -mod - - -gen_pp = $(DEPFLAGS) $(@D)/.deps/$(basename $(> $$x.P; \ - rm $$x.pp -endef - -COMPILE = $(CC) $(INCLUDES) -I$(cm) -I$(srcdir)/$(cm) $(CFLAGS) $(EXTRA_CFLAGS) $(VIS_CFLAGS) - -$(cm)/dlmain.o : $(srcdir)/dlmain.c $(cm-descr) - $(COMPILE) $(gen_pp) -o $@ -c $< - $(do-deps) - -$(cm)/%/cfunc.o : $(cm)/%/cfunc.c - $(COMPILE) $(gen_pp) -I$(srcdir)/$( codemodel /usr/local/lib/spice/spice2poly.cm - -(Of course, you should point to the location where *you* built -spice2poly.cm!) You might want to put this invocation into your -spinit file (which usually lives in $(top_srcdir)/src/). - -7. Then read in your SPICE netlist. SPICE 2 POLY attributes in -controlled sources will be translated into .models invoking the -spice2poly codemodel. You should be able to run ngspice and simulate -in the usual way! - ----------------------------------------------------------------------- -Please send any comments/questions/bug reports to: - -Stuart Brorson -sdb@cloud9.net - --- SDB 6.19.2003 - diff --git a/src/xspice/icm/analog/.gitignore b/src/xspice/icm/analog/.gitignore deleted file mode 100644 index fda83b3e8..000000000 --- a/src/xspice/icm/analog/.gitignore +++ /dev/null @@ -1,14 +0,0 @@ -/analog.cm - -/cmextrn.h -/cminfo.h -/cminfo2.h -/dlmain.c -/objects.inc -/udnextrn.h -/udninfo.h -/udninfo2.h - -/*/*.c - -!/*/udnfunc.c diff --git a/src/xspice/icm/analog/climit/cfunc.mod b/src/xspice/icm/analog/climit/cfunc.mod deleted file mode 100644 index d14f2a79a..000000000 --- a/src/xspice/icm/analog/climit/cfunc.mod +++ /dev/null @@ -1,265 +0,0 @@ -/*.......1.........2.........3.........4.........5.........6.........7.........8 -================================================================================ - -FILE climit/cfunc.mod - -Public Domain - -Georgia Tech Research Corporation -Atlanta, Georgia 30332 -PROJECT A-8503-405 - - -AUTHORS - - 6 June 1991 Jeffrey P. Murray - - -MODIFICATIONS - - 26 Sept 1991 Jeffrey P. Murray - - -SUMMARY - - This file contains the functional description of the adc_bridge - code model. - - -INTERFACES - - FILE ROUTINE CALLED - - CMutil.c void cm_smooth_corner(); - void cm_smooth_discontinuity(); - - CMmacros.h cm_message_send(); - - -REFERENCED FILES - - Inputs from and outputs to ARGS structure. - - -NON-STANDARD FEATURES - - NONE - -===============================================================================*/ - -/*=== INCLUDE FILES ====================*/ - - - - -/*=== CONSTANTS ========================*/ - - - - -/*=== MACROS ===========================*/ - - - - -/*=== LOCAL VARIABLES & TYPEDEFS =======*/ - - - - -/*=== FUNCTION PROTOTYPE DEFINITIONS ===*/ - - - - - - - -/*============================================================================== - -FUNCTION cm_climit() - -AUTHORS - - 6 June 1991 Jeffrey P. Murray - -MODIFICATIONS - - 26 Sept 1991 Jeffrey P. Murray - -SUMMARY - - This function implements the climit code model. - -INTERFACES - - FILE ROUTINE CALLED - - CMutil.c void cm_smooth_corner(); - void cm_smooth_discontinuity(); - - CMmacros.h cm_message_send(); - -RETURNED VALUE - - Returns inputs and outputs via ARGS structure. - -GLOBAL VARIABLES - - NONE - -NON-STANDARD FEATURES - - NONE - -==============================================================================*/ - -/*=== CM_CLIMIT ROUTINE ===*/ - -void cm_climit(ARGS) /* structure holding parms, - inputs, outputs, etc. */ -{ - /* Define error message string constants */ - - char *climit_range_error = "\n**** ERROR ****\n* CLIMIT function linear range less than zero. *\n"; - - - double lower_delta, /* lower delta value parameter */ - upper_delta, /* upper delta value parameter */ - limit_range, /* range of output below - (out_upper_limit - upper_delta) - or above (out_lower_limit + lower_delta) - within which smoothing will be applied */ - gain, /* gain parameter */ - threshold_upper, /* = out_upper_limit - upper_delta */ - threshold_lower, /* = out_lower_limit + lower_delta */ - linear_range, /* = threshold_upper - threshold_lower */ - out_lower_limit, /* output lower limit parameter */ - out_upper_limit, /* output upper limit parameter */ - out, /* originally-calculated output value */ - limited_out, /* output value after limiting */ - pout_pin, /* partial derivative of output w.r.t.input */ - pout_pcntl_upper, /* partial derivative of output w.r.t. - cntl_upper input */ - pout_pcntl_lower, /* partial derivative of output w.r.t. - cntl_lower input */ - junk; /* dummy variable */ - - Mif_Complex_t ac_gain; /* AC gain */ - - - - /* Retrieve frequently used parameters... */ - - lower_delta = PARAM(lower_delta); - upper_delta = PARAM(upper_delta); - limit_range = PARAM(limit_range); - gain = PARAM(gain); - - - /* Find Upper & Lower Limits */ - - out_lower_limit = INPUT(cntl_lower) + lower_delta; - out_upper_limit = INPUT(cntl_upper) - upper_delta; - - - if (PARAM(fraction) == MIF_TRUE) /* Set range to absolute value */ - limit_range = limit_range * - (out_upper_limit - out_lower_limit); - - - - threshold_upper = out_upper_limit - /* Set Upper Threshold */ - limit_range; - threshold_lower = out_lower_limit + /* Set Lower Threshold */ - limit_range; - linear_range = threshold_upper - threshold_lower; - - - /* Test the linear region & make sure there IS one... */ - if (linear_range < 0.0) { - /* This INIT test keeps the models from outputting - an error message the first time through when all - the inputs are initialized to zero */ - if( (INIT != 1) && (0.0 != TIME) ){ - cm_message_send(climit_range_error); - } - limited_out = 0.0; - pout_pin = 0.0; - pout_pcntl_lower = 0.0; - pout_pcntl_upper = 0.0; - return; - } - - /* Compute Un-Limited Output */ - out = gain * (PARAM(in_offset) + INPUT(in)); - - - if (out < threshold_lower) { /* Limit Out @ Lower Bound */ - - pout_pcntl_upper= 0.0; - - if (out > (out_lower_limit - limit_range)) { /* Parabolic */ - cm_smooth_corner(out,out_lower_limit,out_lower_limit, - limit_range,0.0,1.0,&limited_out, - &pout_pin); - pout_pin = gain * pout_pin; - cm_smooth_discontinuity(out,out_lower_limit,1.0,threshold_lower, - 0.0,&pout_pcntl_lower,&junk); - } - else { /* Hard-Limited Region */ - limited_out = out_lower_limit; - pout_pin = 0.0; - pout_pcntl_lower = 1.0; - } - } - else { - if (out > threshold_upper) { /* Limit Out @ Upper Bound */ - - pout_pcntl_lower= 0.0; - - if (out < (out_upper_limit+limit_range)) { /* Parabolic */ - cm_smooth_corner(out,out_upper_limit,out_upper_limit, - limit_range,1.0,0.0,&limited_out, - &pout_pin); - pout_pin = gain * pout_pin; - cm_smooth_discontinuity(out,threshold_upper,0.0,out_upper_limit, - 1.0,&pout_pcntl_upper,&junk); - } - else { /* Hard-Limited Region */ - limited_out = out_upper_limit; - pout_pin = 0.0; - pout_pcntl_upper = 1.0; - } - } - else { /* No Limiting Needed */ - limited_out = out; - pout_pin = gain; - pout_pcntl_lower = 0.0; - pout_pcntl_upper = 0.0; - } - } - - if (ANALYSIS != MIF_AC) { /* DC & Transient Analyses */ - - OUTPUT(out) = limited_out; - PARTIAL(out,in) = pout_pin; - PARTIAL(out,cntl_lower) = pout_pcntl_lower; - PARTIAL(out,cntl_upper) = pout_pcntl_upper; - - } - else { /* AC Analysis */ - ac_gain.real = pout_pin; - ac_gain.imag= 0.0; - AC_GAIN(out,in) = ac_gain; - - ac_gain.real = pout_pcntl_lower; - ac_gain.imag= 0.0; - AC_GAIN(out,cntl_lower) = ac_gain; - - ac_gain.real = pout_pcntl_upper; - ac_gain.imag= 0.0; - AC_GAIN(out,cntl_upper) = ac_gain; - - } -} diff --git a/src/xspice/icm/analog/climit/ifspec.ifs b/src/xspice/icm/analog/climit/ifspec.ifs deleted file mode 100644 index 5bb7288ae..000000000 --- a/src/xspice/icm/analog/climit/ifspec.ifs +++ /dev/null @@ -1,77 +0,0 @@ - - /* INTERFACE TABLE FOR CODE MODEL CLIMIT */ - - -NAME_TABLE: - - -C_Function_Name: cm_climit -Spice_Model_Name: climit -Description: "controlled limiter block" - - -PORT_TABLE: - - -Port_Name: in cntl_upper -Description: "input" "upper lim. control input" -Direction: in in -Default_Type: v v -Allowed_Types: [v,vd,i,id,vnam] [v,vd,i,id,vnam] -Vector: no no -Vector_Bounds: - - -Null_Allowed: no no - -PORT_TABLE: - -Port_Name: cntl_lower out -Description: "lower limit control input" "output" -Direction: in out -Default_Type: v v -Allowed_Types: [v,vd,i,id,vnam] [v,vd,i,id] -Vector: no no -Vector_Bounds: - - -Null_Allowed: no no - - - - -PARAMETER_TABLE: - - -Parameter_Name: in_offset gain -Description: "input offset" "gain" -Data_Type: real real -Default_Value: 0.0 1.0 -Limits: - - -Vector: no no -Vector_Bounds: - - -Null_Allowed: yes yes - - -PARAMETER_TABLE: - - -Parameter_Name: upper_delta lower_delta -Description: "output upper delta" "output lower delta" -Data_Type: real real -Default_Value: 0.0 0.0 -Limits: - - -Vector: no no -Vector_Bounds: - - -Null_Allowed: yes yes - - - -PARAMETER_TABLE: - - -Parameter_Name: limit_range fraction -Description: "upper & lower sm. range" "smoothing %/abs switch" -Data_Type: real boolean -Default_Value: 1.0e-6 FALSE -Limits: - - -Vector: no no -Vector_Bounds: - - -Null_Allowed: yes yes - diff --git a/src/xspice/icm/analog/d_dt/cfunc.mod b/src/xspice/icm/analog/d_dt/cfunc.mod deleted file mode 100644 index 18153aba2..000000000 --- a/src/xspice/icm/analog/d_dt/cfunc.mod +++ /dev/null @@ -1,246 +0,0 @@ -/*.......1.........2.........3.........4.........5.........6.........7.........8 -================================================================================ - -FILE d_dt/cfunc.mod - -Public Domain - -Georgia Tech Research Corporation -Atlanta, Georgia 30332 -PROJECT A-8503-405 - - -AUTHORS - - 6 June 1991 Jeffrey P. Murray - - -MODIFICATIONS - - 30 Sept 1991 Jeffrey P. Murray - - -SUMMARY - - This file contains the functional description of the d_dt - (differentiator) code model. - - -INTERFACES - - FILE ROUTINE CALLED - - CMutil.c void cm_smooth_corner(); - - CM.c void *cm_analog_alloc() - void *cm_analog_get_ptr() - int cm_analog_integrate() - - - -REFERENCED FILES - - Inputs from and outputs to ARGS structure. - - -NON-STANDARD FEATURES - - NONE - -===============================================================================*/ - -/*=== INCLUDE FILES ====================*/ - - - - -/*=== CONSTANTS ========================*/ - - - - -/*=== MACROS ===========================*/ - - - - -/*=== LOCAL VARIABLES & TYPEDEFS =======*/ - - - - -/*=== FUNCTION PROTOTYPE DEFINITIONS ===*/ - - - - - -/*============================================================================== - -FUNCTION cm_d_dt() - -AUTHORS - - 6 Jun 1991 Jeffrey P. Murray - -MODIFICATIONS - - 30 Sep 1991 Jeffrey P. Murray - -SUMMARY - - This function implements the d_dt code model. - -INTERFACES - - FILE ROUTINE CALLED - - CMutil.c void cm_smooth_corner(); - - CM.c void *cm_analog_alloc() - void *cm_analog_get_ptr() - int cm_analog_integrate() - -RETURNED VALUE - - Returns inputs and outputs via ARGS structure. - -GLOBAL VARIABLES - - NONE - -NON-STANDARD FEATURES - - NONE - -==============================================================================*/ - -/*=== CM_D_DT ROUTINE ===*/ - - -void cm_d_dt(ARGS) - -{ - - double *in, /* current input value */ - *in_old, /* previous input value */ - out, /* output */ - dum, /* fake input value...used for truncation - error checking */ - gain, /* gain parameter */ - out_offset, /* output offset parameter */ - out_lower_limit, /* output mower limit */ - out_upper_limit, /* output upper limit */ - limit_range, /* range of output below out_upper_limit - or above out_lower_limit to which - smoothing will be applied */ - pout_pin, /* partial derivative of output - w.r.t. input */ - dumpout_pin, /* fake partial derivative of output - w.r.t. input (for use with integration */ - delta, /* delta time value = TIME - T(1) */ - pout_gain; /* temporary storage for partial - returned by smoothing function - (subsequently multiplied w/pout_pin) */ - - Mif_Complex_t ac_gain; /* AC gain */ - - - - /** Retrieve frequently used parameters (used by all analyses)... **/ - - gain = PARAM(gain); - - - - if (ANALYSIS != MIF_AC) { /**** DC & Transient Analyses ****/ - - /** Retrieve frequently used parameters... **/ - - out_offset = PARAM(out_offset); - out_lower_limit = PARAM(out_lower_limit); - out_upper_limit = PARAM(out_upper_limit); - limit_range = PARAM(limit_range); - - - /** Test for INIT; if so, allocate storage, otherwise, retrieve - previous timepoint input value... **/ - - if (INIT==1) { /* First pass...allocate storage for previous state. */ - /* Also, calculate roughly where the current output */ - /* will be and use this value to define current state. */ - - cm_analog_alloc(TRUE,sizeof(double)); - - } - /* retrieve previous values */ - - in = (double *) cm_analog_get_ptr(TRUE,0); /* Set out pointer to current - time storage */ - in_old = (double *) cm_analog_get_ptr(TRUE,1); /* Set old-output-state pointer - to previous time storage */ - - - if ( 0.0 == TIME ) { /*** Test to see if this is the first ***/ - /*** timepoint calculation...if ***/ - *in_old = *in = INPUT(in); /*** so, return a zero d/dt value. ***/ - out = 0.0; /*** so, return a zero d/dt value. ***/ - pout_pin = 0.0; - } - else { /*** Calculate value of d_dt.... ***/ - delta = TIME - T(1); - *in = INPUT(in); - out = gain * (*in - *in_old) / delta + out_offset; - pout_pin = gain / delta; - } - - - /*** Smooth output if it is within limit_range of - out_lower_limit or out_upper_limit. ***/ - - if (out < (out_lower_limit - limit_range)) { /* At lower limit. */ - out = out_lower_limit; - pout_pin = 0.0; - } - else { - if (out < (out_lower_limit + limit_range)) { /* Lower smoothing range */ - cm_smooth_corner(out,out_lower_limit,out_lower_limit,limit_range, - 0.0,1.0,&out,&pout_gain); - pout_pin = pout_pin * pout_gain; - } - else { - if (out > (out_upper_limit + limit_range)) { /* At upper limit */ - out = out_upper_limit; - pout_pin = 0.0; - } - else { - if (out > (out_upper_limit - limit_range)) { /* Upper smoothing region */ - cm_smooth_corner(out,out_upper_limit,out_upper_limit,limit_range, - 1.0,0.0,&out,&pout_gain); - pout_pin = pout_pin * pout_gain; - } - } - } - } - - /** Output values for DC & Transient **/ - - OUTPUT(out) = out; - PARTIAL(out,in) = pout_pin; - /* this cm_analog_integrate call is required in order to force - truncation error to be evaluated */ - cm_analog_integrate(out,&dum,&dumpout_pin); - - } - - else { /**** AC Analysis...output (0.0,s*gain) ****/ - ac_gain.real = 0.0; - ac_gain.imag= gain * RAD_FREQ; - AC_GAIN(out,in) = ac_gain; - } -} - - - - - diff --git a/src/xspice/icm/analog/d_dt/ifspec.ifs b/src/xspice/icm/analog/d_dt/ifspec.ifs deleted file mode 100644 index bfaaede0f..000000000 --- a/src/xspice/icm/analog/d_dt/ifspec.ifs +++ /dev/null @@ -1,80 +0,0 @@ -/*.......1.........2.........3.........4.........5.........6.........7.........8 -================================================================================ -Public Domain - -Georgia Tech Research Corporation -Atlanta, Georgia 30332 - - -AUTHORS - - 30 Sept 1991 Jeffrey P. Murray - - -SUMMARY - - This file contains the interface specification file for the - analog d_dt (differentiator) code model. - -===============================================================================*/ - -NAME_TABLE: - - -C_Function_Name: cm_d_dt -Spice_Model_Name: d_dt -Description: "differentiator block" - - -PORT_TABLE: - - -Port_Name: in out -Description: "input" "output" -Direction: in out -Default_Type: v v -Allowed_Types: [v,vd,i,id,vnam] [v,vd,i,id] -Vector: no no -Vector_Bounds: - - -Null_Allowed: no no - - -PARAMETER_TABLE: - - -Parameter_Name: out_offset gain -Description: "output offset" "gain" -Data_Type: real real -Default_Value: 0.0 1.0 -Limits: - - -Vector: no no -Vector_Bounds: - - -Null_Allowed: yes yes - - -PARAMETER_TABLE: - - -Parameter_Name: out_lower_limit out_upper_limit -Description: "output lower limit" "output upper limit" -Data_Type: real real -Default_Value: - - -Limits: - - -Vector: no no -Vector_Bounds: - - -Null_Allowed: yes yes - - - -PARAMETER_TABLE: - - -Parameter_Name: limit_range -Description: "upper & lower sm. range" -Data_Type: real -Default_Value: 1.0e-6 -Limits: - -Vector: no -Vector_Bounds: - -Null_Allowed: yes - diff --git a/src/xspice/icm/analog/delay/cfunc.mod b/src/xspice/icm/analog/delay/cfunc.mod deleted file mode 100644 index a1bd95d83..000000000 --- a/src/xspice/icm/analog/delay/cfunc.mod +++ /dev/null @@ -1,360 +0,0 @@ -/*.......1.........2.........3.........4.........5.........6.........7.........8 -================================================================================ - -FILE delay/cfunc.mod - -3-clause BSD - -Copyright 2021 -The ngspice team - -AUTHORS - - 12 June 2021 Holger Vogt - - -MODIFICATIONS - - - -SUMMARY - - This file contains the functional description of the analog - delay code model. - - -INTERFACES - - FILE ROUTINE CALLED - - CMutil.c void cm_smooth_corner(); - - CM.c void *cm_analog_alloc() - void *cm_analog_get_ptr() - int cm_analog_integrate() - cm_delay_callback() - - - -REFERENCED FILES - - Inputs from and outputs to ARGS structure. - - -NON-STANDARD FEATURES - - NONE - -===============================================================================*/ - -/*=== INCLUDE FILES ====================*/ - -#include - - -/*=== CONSTANTS ========================*/ - - - - -/*=== MACROS ===========================*/ - - - - -/*=== LOCAL VARIABLES & TYPEDEFS =======*/ - -typedef struct { - - double *buffer; /* the storage array for input values */ - int buffer_size; /* size of buffer */ - int buff_write; /* buffer write index */ - int buff_del; /* buffer index, delayed */ - int step_count; /* steps processed */ - double tdelmin; /* min delay, if controlled */ - double tdelmax; /* max delay, if controlled */ - double tdelay; /* time delay */ - double tstep; /* tran step size */ - double tstop; /* tran stop value */ - double tprev; /* previous time value */ - double prev_val; /* previous data value */ - double start_val; /* signal time 0 value */ -} mLocal_Data_t; - - -struct CKTcircuitmin { - -/* This is a minimum re-definition of the circuit structure defined in - cktdefs.h. We are interested in TSTEP and TSTOP */ - - GENmodel **CKThead; - STATistics *CKTstat; /* The STATistics structure */ - double *CKTstates[8]; /* Used as memory of past steps ??? */ - double CKTtime; /* Current transient simulation time */ - double CKTdelta; /* next time step in transient simulation */ - double CKTdeltaOld[7]; /* Memory for the 7 most recent CKTdelta */ - double CKTtemp; /* Actual temperature of CKT, initialzed to 300.15 K in cktinit.c*/ - double CKTnomTemp; /* Reference temperature 300.15 K set in cktinit.c */ - double CKTvt; /* Thernmal voltage at CKTtemp */ - double CKTag[7]; /* the gear variable coefficient matrix */ -#ifdef PREDICTOR - double CKTagp[7]; /* the gear predictor variable coefficient matrix */ -#endif /*PREDICTOR*/ - int CKTorder; /* the integration method order */ - int CKTmaxOrder; /* maximum integration method order */ - int CKTintegrateMethod; /* the integration method to be used */ - double CKTxmu; /* for trapezoidal method */ - int CKTindverbosity; /* control check of inductive couplings */ - SMPmatrix *CKTmatrix; /* pointer to sparse matrix */ - int CKTniState; /* internal state */ - double *CKTrhs; /* current rhs value - being loaded */ - double *CKTrhsOld; /* previous rhs value for convergence testing */ - double *CKTrhsSpare; /* spare rhs value for reordering */ - double *CKTirhs; /* current rhs value - being loaded imag) */ - double *CKTirhsOld; /* previous rhs value (imaginary)*/ - double *CKTirhsSpare; /* spare rhs value (imaginary)*/ -#ifdef PREDICTOR - double *CKTpred; /* predicted solution vector */ - double *CKTsols[8]; /* previous 8 solutions */ -#endif /* PREDICTOR */ - double *CKTrhsOp; /* opearating point values */ - double *CKTsenRhs; /* current sensitivity rhs values */ - double *CKTseniRhs; /* current sensitivity rhs values (imag)*/ - int CKTmaxEqNum; /* And this ? */ - int CKTcurrentAnalysis; /* the analysis in progress (if any) */ - CKTnode *CKTnodes; /* ??? */ - CKTnode *CKTlastNode; /* ??? */ - CKTnode *prev_CKTlastNode; /* just before model setup */ - int CKTnumStates; /* Number of sates effectively valid ??? */ - long CKTmode; /* Mode of operation of the circuit ??? */ - int CKTbypass; /* bypass option, how does it work ? */ - int CKTdcMaxIter; /* iteration limit for dc op. (itl1) */ - int CKTdcTrcvMaxIter; /* iteration limit for dc tran. curv (itl2) */ - int CKTtranMaxIter; /* iteration limit for each timepoint for tran*/ - int CKTbreakSize; /* ??? */ - int CKTbreak; /* ??? */ - double CKTsaveDelta; /* ??? */ - double CKTminBreak; /* ??? */ - double *CKTbreaks; /* List of breakpoints ??? */ - double CKTabstol; /* --- */ - double CKTpivotAbsTol; /* --- */ - double CKTpivotRelTol; /* --- */ - double CKTreltol; /* --- */ - double CKTchgtol; /* --- */ - double CKTvoltTol; /* --- */ - /* What is this define for ? */ -#ifdef NEWTRUNC - double CKTlteReltol; - double CKTlteAbstol; -#endif /* NEWTRUNC */ - double CKTgmin; /* .options GMIN */ - double CKTgshunt; /* .options RSHUNT */ - double CKTcshunt; /* .options CSHUNT */ - double CKTdelmin; /* minimum time step for tran analysis */ - double CKTtrtol; /* .options TRTOL */ - double CKTfinalTime; /* TSTOP */ - double CKTstep; /* TSTEP */ - double CKTmaxStep; /* TMAX */ - double CKTinitTime; /* TSTART */ - /* struct is truncated here */ -}; - -typedef struct CKTcircuitmin CKTcircuitmin; - -/*=== FUNCTION PROTOTYPE DEFINITIONS ===*/ - -static void cm_delay_callback(ARGS, Mif_Callback_Reason_t reason); - -/*=== CM_DELAY ROUTINE ===*/ - -void cm_delay(ARGS) -{ - int buffer_size, delay_step; - double delay, lcntrl; - double delmin, delmax; - - mLocal_Data_t *loc; /* Pointer to local static data, not to be included - in the state vector */ - CKTcircuitmin *ckt; - - - if (ANALYSIS != MIF_AC) { /**** only Transient Analysis and dc ****/ - - /** INIT: allocate storage **/ - - if (INIT==1) { - - CALLBACK = cm_delay_callback; - - ckt = (CKTcircuitmin*)cm_get_circuit(); - - if (PARAM_NULL(buffer_size)) { - /* size depends on TSTOP/TSTEP, if no parameter given */ - buffer_size = (int) (ckt->CKTfinalTime / ckt->CKTstep) + 1; - } - else { - buffer_size = PARAM(buffer_size); - if (buffer_size < 0) { - cm_message_send("Negative buffer size is not allowed " - "in a delay code model"); - return; - } - } - - delay = PARAM(delay); - if (delay < 0.0) { - delay = 0.0; - cm_message_send("Negative delay not allowed, set to 0"); - } - - /*** allocate static storage for *loc ***/ - if ((loc = (mLocal_Data_t *) (STATIC_VAR(locdata) = calloc(1, - sizeof(mLocal_Data_t)))) == (mLocal_Data_t *) NULL) { - cm_message_send("Unable to allocate Local_Data_t " - "in cm_delay()"); - return; - } - /*** allocate static storage for the delay buffer ***/ - loc->buffer = (double *) calloc((size_t)buffer_size, sizeof(double)); - if (loc->buffer == (double *) NULL) { - cm_message_send("Unable to allocate delay buffer " - "in cm_delay()"); - return; - } - loc->buffer_size = buffer_size; - - /* The delay is controlled by input delay_cnt */ - if (PARAM(has_delay_cnt) == MIF_TRUE) { - if (PARAM_NULL(delmin)) - loc->tdelmin = 0.0; - else { - loc->tdelmin = PARAM(delmin); - if (loc->tdelmin < 0) { - loc->tdelmin = 0.0; - cm_message_send("Negative min delay not allowed, set to 0"); - } - else if (loc->tdelmin > ckt->CKTfinalTime) { - loc->tdelmin = ckt->CKTfinalTime; - cm_message_send("min delay greater than final sim time not allowed, set to final time"); - } - } - - if (PARAM_NULL(delmax)) - loc->tdelmax = ckt->CKTfinalTime; - else { - loc->tdelmax = PARAM(delmax); - if (loc->tdelmax < 0) { - loc->tdelmin = 0.0; - cm_message_send("Negative max delay not allowed, set to 0"); - } - else if (loc->tdelmax > ckt->CKTfinalTime) { - loc->tdelmax = ckt->CKTfinalTime; - cm_message_send("max delay greater than final sim time not allowed, set to final time"); - } - } - if (loc->tdelmax < loc->tdelmin) { - loc->tdelmax = loc->tdelmin; - cm_message_send("max delay smaller than min delay, set to min delay"); - } - } - - loc->buff_write = 0; - loc->buff_del = 0; - loc->step_count = 0; - loc->tdelay = delay; - loc->tstop = ckt->CKTfinalTime; - loc->tstep = ckt->CKTstep; - loc->tprev = 0.0; - loc->prev_val = 0.0; - } - /* retrieve previous values */ - - loc = STATIC_VAR (locdata); - - delay = loc->tdelay; - if (delay == 0.0 && !PARAM(has_delay_cnt)) { - OUTPUT(out) = INPUT(in); - return; - } - - if (delay < loc->tstep) { - delay = 0.; - } - - if (TIME == 0.0) - loc->start_val = INPUT(in); - - /* input, simply interpolated to TSTEP */ - double tacct = loc->step_count * loc->tstep; - if (TIME >= tacct) { - loc->buffer[loc->buff_write] = INPUT(in); - /* next buffer location, circular, for writing */ - loc->buff_write = (loc->buff_write + 1) % loc->buffer_size; - loc->step_count++; - loc->tprev = tacct; - loc->prev_val = INPUT(in); - } - - delmin = loc->tdelmin; - delmax = loc->tdelmax; - - lcntrl = INPUT(cntrl); - if (lcntrl < 0) - lcntrl = 0.; - else if (lcntrl > 1.) - lcntrl = 1.; - - if (PARAM(has_delay_cnt) == MIF_TRUE) { - delay = (delmax - delmin) * lcntrl + delmin; - } - - /* time not yet advanced for delay output */ - if (TIME < delay) { - OUTPUT(out) = loc->start_val; - } - else if (delay == 0) - OUTPUT(out) = INPUT(in); - else - OUTPUT(out) = loc->buffer[loc->buff_del]; - - /* add offset to reduce error */ - /* FIXME: may not be needed if (better) interpolation */ - delay += 0.5 * loc->tstep; - - /* delay in steps */ - delay_step = (int)(delay / loc->tstep); - /* FIXME: For whatever reason the model is assessed two times per time step */ - - /* next readout location, delayed after writing */ - if ((loc->buff_write - delay_step) >= 0) - loc->buff_del = loc->buff_write - delay_step; - else - loc->buff_del = loc->buff_write - delay_step + loc->buffer_size; - } - - else { /**** all others ****/ - OUTPUT(out) = INPUT(in); - } -} - -/* free the memory created locally */ -static void cm_delay_callback(ARGS, Mif_Callback_Reason_t reason) -{ - switch (reason) { - case MIF_CB_DESTROY: { - mLocal_Data_t *loc = (mLocal_Data_t *) STATIC_VAR(locdata); - if (loc == (mLocal_Data_t *) NULL) { - break; - } - - if (loc->buffer != (double *) NULL) { - free(loc->buffer); - } - - free(loc); - - STATIC_VAR(locdata) = NULL; - break; - } - } -} /* end of function cm_delay_callback */ diff --git a/src/xspice/icm/analog/delay/ifspec.ifs b/src/xspice/icm/analog/delay/ifspec.ifs deleted file mode 100644 index abe19354f..000000000 --- a/src/xspice/icm/analog/delay/ifspec.ifs +++ /dev/null @@ -1,82 +0,0 @@ -/*.......1.........2.........3.........4.........5.........6.........7.........8 -================================================================================ - -------------------------------------------------------------------------- - Copyright 2021 - The ngspice team - 3 - Clause BSD license - (see COPYING or https://opensource.org/licenses/BSD-3-Clause) -------------------------------------------------------------------------- - -AUTHORS - - 12 June 2021 Holger Vogt - - -SUMMARY - - This file contains the interface specification file for the - delay code model. - -===============================================================================*/ - -NAME_TABLE: - -C_Function_Name: cm_delay -Spice_Model_Name: delay -Description: "analog delay line" - - -PORT_TABLE: - -Port_Name: in out cntrl -Description: "input" "output" "control" -Direction: in out in -Default_Type: v v v -Allowed_Types: [v,vd,vnam] [v,vd] [v,vd,i,id] -Vector: no no no -Vector_Bounds: - - - -Null_Allowed: no no yes - - -PARAMETER_TABLE: - -Parameter_Name: delay buffer_size -Description: "time delay" "size of delay buffer" -Data_Type: real int -Default_Value: 0.0 1024 -Limits: - [1 -] -Vector: no no -Vector_Bounds: - - -Null_Allowed: yes yes - - -PARAMETER_TABLE: - -Parameter_Name: has_delay_cnt -Description: "controlled delay" -Data_Type: boolean -Default_Value: FALSE -Limits: - -Vector: no -Vector_Bounds: - -Null_Allowed: yes - - -PARAMETER_TABLE: - -Parameter_Name: delmin delmax -Description: "min delay" "max delay" -Data_Type: real real -Default_Value: 0 0 -Limits: [0 -] [0 -] -Vector: no no -Vector_Bounds: - - -Null_Allowed: yes yes - - -STATIC_VAR_TABLE: - -Static_Var_Name: locdata -Description: "local static data" -Data_Type: pointer diff --git a/src/xspice/icm/analog/divide/cfunc.mod b/src/xspice/icm/analog/divide/cfunc.mod deleted file mode 100644 index af4cde07c..000000000 --- a/src/xspice/icm/analog/divide/cfunc.mod +++ /dev/null @@ -1,203 +0,0 @@ -/*.......1.........2.........3.........4.........5.........6.........7.........8 -================================================================================ - -FILE divide/cfunc.mod - -Public Domain - -Georgia Tech Research Corporation -Atlanta, Georgia 30332 -PROJECT A-8503-405 - - -AUTHORS - - 6 Jun 1991 Jeffrey P. Murray - - -MODIFICATIONS - - 2 Oct 1991 Jeffrey P. Murray - - -SUMMARY - - This file contains the model-specific routines used to - functionally describe the divide code model. - - -INTERFACES - - FILE ROUTINE CALLED - - CMutil.c void cm_smooth_corner(); - - -REFERENCED FILES - - Inputs from and outputs to ARGS structure. - - -NON-STANDARD FEATURES - - NONE - -===============================================================================*/ - -/*=== INCLUDE FILES ====================*/ - -#include - - - -/*=== CONSTANTS ========================*/ - - - - -/*=== MACROS ===========================*/ - - - - -/*=== LOCAL VARIABLES & TYPEDEFS =======*/ - - - - -/*=== FUNCTION PROTOTYPE DEFINITIONS ===*/ - - - - - -/*============================================================================== - -FUNCTION void cm_divide() - -AUTHORS - - 2 Oct 1991 Jeffrey P. Murray - -MODIFICATIONS - - NONE - -SUMMARY - - This function implements the divide code model. - -INTERFACES - - FILE ROUTINE CALLED - - CMutil.c void cm_smooth_corner(); - -RETURNED VALUE - - Returns inputs and outputs via ARGS structure. - -GLOBAL VARIABLES - - NONE - -NON-STANDARD FEATURES - - NONE - -==============================================================================*/ - - -/*=== CM_DIVIDE ROUTINE ===*/ - - -void cm_divide(ARGS) - -{ - double den_lower_limit; /* denominator lower limit */ - double den_domain; /* smoothing range for the lower limit */ - double threshold_upper; /* value above which smoothing occurs */ - double threshold_lower; /* value below which smoothing occurs */ - double numerator; /* numerator input */ - double denominator; /* denominator input */ - double limited_den; /* denominator value if limiting is needed */ - double den_partial; /* partial of the output wrt denominator */ - double out_gain; /* output gain */ - double num_gain; /* numerator gain */ - double den_gain; /* denominator gain */ - - Mif_Complex_t ac_gain; - - - - /* Retrieve frequently used parameters... */ - - den_lower_limit = PARAM(den_lower_limit); - den_domain = PARAM(den_domain); - out_gain = PARAM(out_gain); - num_gain = PARAM(num_gain); - den_gain = PARAM(den_gain); - - - if (PARAM(fraction) == MIF_TRUE) /* Set domain to absolute value */ - den_domain = den_domain * den_lower_limit; - - threshold_upper = den_lower_limit + /* Set Upper Threshold */ - den_domain; - - threshold_lower = den_lower_limit - /* Set Lower Threshold */ - den_domain; - - numerator = (INPUT(num) + PARAM(num_offset)) * num_gain; - denominator = (INPUT(den) + PARAM(den_offset)) * den_gain; - - if ((denominator < threshold_upper) && (denominator >= 0)) { /* Need to limit den...*/ - - if (denominator > threshold_lower) /* Parabolic Region */ - cm_smooth_corner(denominator,den_lower_limit, - den_lower_limit,den_domain,0.0,1.0, - &limited_den,&den_partial); - - else { /* Hard-Limited Region */ - limited_den = den_lower_limit; - den_partial = 0.0; - } - } - else - if ((denominator > -threshold_upper) && (denominator < 0)) { /* Need to limit den...*/ - if (denominator < -threshold_lower) /* Parabolic Region */ - cm_smooth_corner(denominator,-den_lower_limit, - -den_lower_limit,den_domain,0.0,1.0, - &limited_den,&den_partial); - - else { /* Hard-Limited Region */ - limited_den = -den_lower_limit; - den_partial = 0.0; - } - } - else { /* No limiting needed */ - limited_den = denominator; - den_partial = 1.0; - } - - if (ANALYSIS != MIF_AC) { - - OUTPUT(out) = PARAM(out_offset) + out_gain * - ( numerator/limited_den ); - PARTIAL(out,num) = out_gain * num_gain / limited_den; - PARTIAL(out,den) = -out_gain * numerator * den_gain * - den_partial / (limited_den * limited_den); - - } - else { - ac_gain.real = out_gain * num_gain / limited_den; - ac_gain.imag= 0.0; - AC_GAIN(out,num) = ac_gain; - - ac_gain.real = -out_gain * numerator * den_gain * - den_partial / (limited_den * limited_den); - ac_gain.imag= 0.0; - AC_GAIN(out,den) = ac_gain; - } - -} diff --git a/src/xspice/icm/analog/divide/ifspec.ifs b/src/xspice/icm/analog/divide/ifspec.ifs deleted file mode 100644 index 2ce827d83..000000000 --- a/src/xspice/icm/analog/divide/ifspec.ifs +++ /dev/null @@ -1,109 +0,0 @@ -/*.......1.........2.........3.........4.........5.........6.........7.........8 -================================================================================ -Public Domain - -Georgia Tech Research Corporation -Atlanta, Georgia 30332 - - -AUTHORS - - 2 Oct 1991 Jeffrey P. Murray - - -SUMMARY - - This file contains the interface specification file for the - analog divide code model. - -===============================================================================*/ - -NAME_TABLE: - - -C_Function_Name: cm_divide -Spice_Model_Name: divide -Description: "divider block" - - -PORT_TABLE: - - -Port_Name: num den out -Description: "numerator" "denominator" "output" -Direction: in in out -Default_Type: v v v -Allowed_Types: [v,vd,i,id,vnam] [v,vd,i,id,vnam] [v,vd,i,id] -Vector: no no no -Vector_Bounds: - - - -Null_Allowed: no no no - - - -PARAMETER_TABLE: - - -Parameter_Name: num_offset num_gain -Description: "numerator offset" "numerator gain" -Data_Type: real real -Default_Value: 0.0 1.0 -Limits: - - -Vector: no no -Vector_Bounds: - - -Null_Allowed: yes yes - - -PARAMETER_TABLE: - - -Parameter_Name: den_offset den_gain -Description: "denominator offset" "denominator gain" -Data_Type: real real -Default_Value: 0.0 1.0 -Limits: - - -Vector: no no -Vector_Bounds: - - -Null_Allowed: yes yes - - - -PARAMETER_TABLE: - - -Parameter_Name: den_lower_limit den_domain -Description: "denominator lower limit" "denominator smoothing domain" -Data_Type: real real -Default_Value: 1.0e-10 1.0e-16 -Limits: [1.0e-10 -] - -Vector: no no -Vector_Bounds: - - -Null_Allowed: yes yes - - - -PARAMETER_TABLE: - - -Parameter_Name: fraction -Description: "smoothing fraction/absolute value switch" -Data_Type: boolean -Default_Value: false -Limits: - -Vector: no -Vector_Bounds: - -Null_Allowed: yes - - - -PARAMETER_TABLE: - - -Parameter_Name: out_gain out_offset -Description: "output gain" "output offset" -Data_Type: real real -Default_Value: 1.0 0.0 -Limits: - - -Vector: no no -Vector_Bounds: - - -Null_Allowed: yes yes - diff --git a/src/xspice/icm/analog/file_source/cfunc.mod b/src/xspice/icm/analog/file_source/cfunc.mod deleted file mode 100644 index f140831a5..000000000 --- a/src/xspice/icm/analog/file_source/cfunc.mod +++ /dev/null @@ -1,411 +0,0 @@ -/*.......1.........2.........3.........4.........5.........6.........7.........8 -================================================================================ - -FILE filesource/cfunc.mod - -Copyright 2011 -Thomas Sailer - - - -AUTHORS - - 20 May 2011 Thomas Sailer - 03 Sep 2012 Holger Vogt - 27 Feb 2017 Marcel Hendrix - 23 JUL 2018 Holger Vogt - - -MODIFICATIONS - - -SUMMARY - - This file contains the model-specific routines used to - functionally describe the file source code model used - to read an array from a file containing lines with - time and analog values, and returning them per time step. - - -INTERFACES - - FILE ROUTINE CALLED - - N/A N/A - - -REFERENCED FILES - - Inputs from and outputs to ARGS structure. - - -NON-STANDARD FEATURES - - NONE - -===============================================================================*/ - -/*=== INCLUDE FILES ====================*/ - -#include -#include -#include -#include - -/*=== CONSTANTS ========================*/ - - - - -/*=== MACROS ===========================*/ - -#if defined(__MINGW32__) || defined(_MSC_VER) -#define DIR_PATHSEP "\\" -#else -#define DIR_PATHSEP "/" -#endif - -/* For WIN32, make strdup become _strdup unless it is defined already, - * as it would be if CRT debugging is being used */ -#if defined(_WIN32) && !defined(strdup) -#define strdup _strdup -#endif - -/*=== LOCAL VARIABLES & TYPEDEFS =======*/ - -struct filesource_state { - FILE *fp; - unsigned char atend; -}; - - -struct infiledata { - double *datavec; - size_t vecallocated; - int maxoccupied; - int actpointer; - int size; -}; - -typedef struct { - - double *amplinterval; /* the storage array for the - amplitude offsets */ - - double *timeinterval; /* the storage array for the - time offset */ - - struct filesource_state *state; /* the storage array for the - filesource status. */ - - struct infiledata *indata; /* the storage vector for the input data - sourced from file. */ - -} Local_Data_t; - - -/*=== FUNCTION PROTOTYPE DEFINITIONS ===*/ - - - - - -/*============================================================================== - -FUNCTION void cm_filesource() - -AUTHORS - - 20 May 2011 Thomas Sailer - -MODIFICATIONS - - 07 Sept 2012 Holger Vogt - 27 Feb 2017 Marcel Hendrix - 23 JUL 2018 Holger Vogt - -SUMMARY - - This function implements the filesource code model. - -INTERFACES - - FILE ROUTINE CALLED - - N/A N/A - - -RETURNED VALUE - - Returns inputs and outputs via ARGS structure. - -GLOBAL VARIABLES - - NONE - -NON-STANDARD FEATURES - - NONE - -==============================================================================*/ - - -/*=== CM_FILESOURCE ROUTINE ===*/ - -static void cm_filesource_callback(ARGS, Mif_Callback_Reason_t reason); - -void cm_filesource(ARGS) /* structure holding parms, inputs, outputs, etc. */ -{ - int size = PORT_SIZE(out); - int stepsize = size + 1; - int amplscalesize; - int amploffssize; - int j; - - Local_Data_t *loc; /* Pointer to local static data, not to be included - in the state vector */ - - if(ANALYSIS == MIF_AC) { - return; - } - if (INIT == 1) { - - int count; - - /*** allocate static storage for *loc ***/ - if ((loc = (Local_Data_t *) (STATIC_VAR(locdata) = calloc(1, - sizeof(Local_Data_t)))) == (Local_Data_t *) NULL) { - cm_message_send("Unable to allocate Local_Data_t " - "in cm_filesource()"); - return; - } - - /* Allocate storage for internal state */ - loc->timeinterval = (double *) calloc(2, sizeof(double)); - loc->amplinterval = (double *) calloc(2 * (size_t) size, - sizeof(double)); - loc->state = (struct filesource_state *) calloc(1, - sizeof(struct filesource_state)); /* calloc to null fp */ - loc->indata = (struct infiledata *) malloc( - sizeof(struct infiledata)); - loc->indata->datavec = (double *) malloc(sizeof(double) * - (size_t) (stepsize * 1000)); - - /* Check allocations */ - if (loc->timeinterval == (double *) NULL || - loc->amplinterval == (double *) NULL || - loc->state == (struct filesource_state *) NULL || - loc->indata == (struct infiledata *) NULL || - loc->indata->datavec == (double *) NULL) { - cm_message_send("Unable to allocate Local_Data_t fields " - "in cm_filesource()"); - cm_filesource_callback(mif_private, MIF_CB_DESTROY); - return; - } - - CALLBACK = cm_filesource_callback; - - loc->indata->vecallocated = (size_t) (stepsize * 1000); - loc->indata->maxoccupied = 0; - loc->indata->actpointer = 0; - loc->indata->size = stepsize; - - /* open the file */ - loc->state->fp = fopen_with_path(PARAM(file), "r"); - loc->state->atend = 0; - if (!loc->state->fp) { - char *lbuffer; - lbuffer = getenv("NGSPICE_INPUT_DIR"); - if (lbuffer && *lbuffer) { - char *p; - if ((p = (char *) malloc(strlen(lbuffer) + - strlen(DIR_PATHSEP) + strlen(PARAM(file)) + 1)) == - (char *) NULL) { - cm_message_send("Unable to allocate buffer " - "for building file name in cm_filesource()"); - } - else { - sprintf(p, "%s%s%s", lbuffer, DIR_PATHSEP, PARAM(file)); - loc->state->fp = fopen(p, "r"); - free(p); - } - } - if (!loc->state->fp) { - cm_message_printf("cannot open file %s", PARAM(file)); - loc->state->atend = 1; - } - } - /* read, preprocess and store the data */ - amplscalesize = PARAM_NULL(amplscale) ? 0 : PARAM_SIZE(amplscale); - amploffssize = PARAM_NULL(amploffset) ? 0 : PARAM_SIZE(amploffset); - count = 0; - while (!loc->state->atend) { - char line[512]; - char *cp, *cpdel; - char *cp2; - double t, tprev = 0; - int i; - if (!fgets(line, sizeof(line), loc->state->fp)) { - loc->state->atend = 1; - break; - } - if ((cpdel = cp = strdup(line)) == (char *) NULL) { - cm_message_send("Unable to duplicate string " - "cm_filesource()"); - loc->state->atend = 1; - break; - } - - /* read the time channel; update the time difference */ - while (*cp && isspace_c(*cp)) - ++cp; - if (*cp == '*' || *cp == '#' || *cp == ';') { - free(cpdel); - continue; - } - t = strtod(cp, &cp2); - if (cp2 == cp) { - free(cpdel); - continue; - } - cp = cp2; - if (!PARAM_NULL(timescale)) - t *= PARAM(timescale); - if (!PARAM_NULL(timerelative) && PARAM(timerelative) == MIF_TRUE) - t += tprev; - else if (!PARAM_NULL(timeoffset)) - t += PARAM(timeoffset); - - tprev = t; - - /* before storing, check if vector size is large enough. - If not, add another 1000*size doubles */ - if (count > (int) loc->indata->vecallocated - size) { - loc->indata->vecallocated += (size_t) (size * 1000); - void * const p = realloc(loc->indata->datavec, - sizeof(double) * loc->indata->vecallocated); - if (p == NULL) { - cm_message_printf("cannot allocate enough memory"); - break; // loc->state->atend = 1; - } - loc->indata->datavec = (double *) p; - } - loc->indata->datavec[count++] = t; - - /* read the data channels; update the amplitude difference of each channel */ - for (i = 0; i < size; ++i) { - while (*cp && (isspace_c(*cp) || *cp == ',')) - ++cp; - t = strtod(cp, &cp2); - if (cp2 == cp) - break; - cp = cp2; - if (i < amplscalesize) - t *= PARAM(amplscale[i]); - if (i < amploffssize) - t += PARAM(amploffset[i]); - loc->indata->datavec[count++] = t; - } - free(cpdel); - } - loc->indata->maxoccupied = count; - - if(loc->state->fp) { - fclose(loc->state->fp); - loc->state->fp = NULL; - } - /* set the start time data */ - loc->timeinterval[0] = loc->indata->datavec[loc->indata->actpointer]; - loc->timeinterval[1] = loc->indata->datavec[loc->indata->actpointer + stepsize]; - } - - loc = STATIC_VAR (locdata); - - /* The file pointer is at the same position it was for the last simulator TIME ... - * If TIME steps backward, for example due to a second invocation of a 'tran' analysis - * step back in datavec[loc->indata->actpointer] . - */ - if (TIME < loc->timeinterval[0]) { - while (TIME < loc->indata->datavec[loc->indata->actpointer] && loc->indata->actpointer >= 0) - loc->indata->actpointer -= stepsize; - loc->timeinterval[0] = loc->indata->datavec[loc->indata->actpointer]; - loc->timeinterval[1] = loc->indata->datavec[loc->indata->actpointer + stepsize]; - } - - while (TIME > loc->timeinterval[1]) { - loc->indata->actpointer += stepsize; - if (loc->indata->actpointer > loc->indata->maxoccupied) { - /* we are done */ - return; - } - loc->timeinterval[1] = loc->indata->datavec[loc->indata->actpointer + stepsize]; - loc->timeinterval[0] = loc->indata->datavec[loc->indata->actpointer]; - } - - for (j = 0; j < size; j++) { - loc->amplinterval[2 * j] = loc->indata->datavec[loc->indata->actpointer + j + 1]; - loc->amplinterval[2 * j + 1] = loc->indata->datavec[loc->indata->actpointer + stepsize + j + 1]; - } - - if (loc->timeinterval[0] <= TIME && TIME <= loc->timeinterval[1]) { - if (!PARAM_NULL(amplstep) && PARAM(amplstep) == MIF_TRUE) { - int i; - for (i = 0; i < size; ++i) - OUTPUT(out[i]) = loc->amplinterval[2 * i]; - } else { - double mul0 = (loc->timeinterval[1] - TIME) / (loc->timeinterval[1] - loc->timeinterval[0]); - double mul1 = 1.0 - mul0; - int i; - for (i = 0; i < size; ++i) - OUTPUT(out[i]) = mul0 * loc->amplinterval[2 * i] + mul1 * loc->amplinterval[2 * i + 1]; - } - } else { - int i; - for (i = 0; i < size; ++i) - OUTPUT(out[i]) = loc->amplinterval[2 * i + 1]; - } -} /* end of function cm_filesource */ - - - -static void cm_filesource_callback(ARGS, Mif_Callback_Reason_t reason) -{ - switch (reason) { - case MIF_CB_DESTROY: { - Local_Data_t *loc = (Local_Data_t *) STATIC_VAR(locdata); - if (loc == (Local_Data_t *) NULL) { - break; - } - - if (loc->state != (struct filesource_state *) NULL) { - if (loc->state->fp != (FILE *) NULL) { - fclose(loc->state->fp); - } - free(loc->state); - } - - if (loc->amplinterval != (double *) NULL) { - free(loc->amplinterval); - } - - if (loc->timeinterval != (double *) NULL) { - free(loc->timeinterval); - } - - if (loc->indata) { - if (loc->indata->datavec) { - free(loc->indata->datavec); - } - free(loc->indata); - } - - free(loc); - - STATIC_VAR(locdata) = NULL; - break; - } - } -} /* end of function cm_filesource_callback */ - - - diff --git a/src/xspice/icm/analog/file_source/ifspec.ifs b/src/xspice/icm/analog/file_source/ifspec.ifs deleted file mode 100644 index e5add1675..000000000 --- a/src/xspice/icm/analog/file_source/ifspec.ifs +++ /dev/null @@ -1,93 +0,0 @@ -/*.......1.........2.........3.........4.........5.........6.........7.........8 -================================================================================ - -------------------------------------------------------------------------- - Copyright 2011 Thomas Sailer - 3 - Clause BSD license - (see COPYING or https://opensource.org/licenses/BSD-3-Clause) -------------------------------------------------------------------------- - -AUTHORS - - 19 May 2011 Thomas Sailer - - -SUMMARY - - This file contains the interface specification file for the - filesource code model. - -===============================================================================*/ - -NAME_TABLE: - -C_Function_Name: cm_filesource -Spice_Model_Name: filesource -Description: "File Source" - - -PORT_TABLE: - -Port_Name: out -Description: "output" -Direction: out -Default_Type: v -Allowed_Types: [v,vd,i,id] -Vector: yes -Vector_Bounds: [1 -] -Null_Allowed: no - - -PARAMETER_TABLE: - -Parameter_Name: timeoffset timescale -Description: "time offset" "timescale" -Data_Type: real real -Default_Value: 0.0 1.0 -Limits: - - -Vector: no no -Vector_Bounds: - - -Null_Allowed: yes yes - - -PARAMETER_TABLE: - -Parameter_Name: timerelative amplstep -Description: "relative time" "step amplitude" -Data_Type: boolean boolean -Default_Value: FALSE FALSE -Limits: - - -Vector: no no -Vector_Bounds: - - -Null_Allowed: yes yes - - -PARAMETER_TABLE: - -Parameter_Name: amploffset amplscale -Description: "ampl offset" "amplscale" -Data_Type: real real -Default_Value: - - -Limits: - - -Vector: yes yes -Vector_Bounds: [1 -] [1 -] -Null_Allowed: yes yes - - -PARAMETER_TABLE: - -Parameter_Name: file -Description: "file name" -Data_Type: string -Default_Value: "filesource.txt" -Limits: - -Vector: no -Vector_Bounds: - -Null_Allowed: yes - - -STATIC_VAR_TABLE: - -Static_Var_Name: locdata -Description: "local static data" -Data_Type: pointer diff --git a/src/xspice/icm/analog/gain/cfunc.mod b/src/xspice/icm/analog/gain/cfunc.mod deleted file mode 100644 index db02ec90b..000000000 --- a/src/xspice/icm/analog/gain/cfunc.mod +++ /dev/null @@ -1,129 +0,0 @@ -/*.......1.........2.........3.........4.........5.........6.........7.........8 -================================================================================ - -FILE gain/cfunc.mod - -Public Domain - -Georgia Tech Research Corporation -Atlanta, Georgia 30332 -PROJECT A-8503-405 - - -AUTHORS - - 6 Jun 1991 Jeffrey P. Murray - - -MODIFICATIONS - - 2 Oct 1991 Jeffrey P. Murray - - -SUMMARY - - This file contains the model-specific routines used to - functionally describe the gain code model. - - -INTERFACES - - FILE ROUTINE CALLED - - N/A N/A - - -REFERENCED FILES - - Inputs from and outputs to ARGS structure. - - -NON-STANDARD FEATURES - - NONE - -===============================================================================*/ - -/*=== INCLUDE FILES ====================*/ - - - - -/*=== CONSTANTS ========================*/ - - - - -/*=== MACROS ===========================*/ - - - - -/*=== LOCAL VARIABLES & TYPEDEFS =======*/ - - - - -/*=== FUNCTION PROTOTYPE DEFINITIONS ===*/ - - - - - -/*============================================================================== - -FUNCTION void cm_gain() - -AUTHORS - - 2 Oct 1991 Jeffrey P. Murray - -MODIFICATIONS - - NONE - -SUMMARY - - This function implements the gain code model. - -INTERFACES - - FILE ROUTINE CALLED - - N/A N/A - - -RETURNED VALUE - - Returns inputs and outputs via ARGS structure. - -GLOBAL VARIABLES - - NONE - -NON-STANDARD FEATURES - - NONE - -==============================================================================*/ - - -/*=== CM_GAIN ROUTINE ===*/ - - -void cm_gain(ARGS) /* structure holding parms, inputs, outputs, etc. */ -{ - Mif_Complex_t ac_gain; - - if(ANALYSIS != MIF_AC) { - OUTPUT(out) = PARAM(out_offset) + PARAM(gain) * - ( INPUT(in) + PARAM(in_offset)); - PARTIAL(out,in) = PARAM(gain); - } - else { - ac_gain.real = PARAM(gain); - ac_gain.imag= 0.0; - AC_GAIN(out,in) = ac_gain; - } - -} diff --git a/src/xspice/icm/analog/gain/ifspec.ifs b/src/xspice/icm/analog/gain/ifspec.ifs deleted file mode 100644 index 4abd6c194..000000000 --- a/src/xspice/icm/analog/gain/ifspec.ifs +++ /dev/null @@ -1,55 +0,0 @@ -/*.......1.........2.........3.........4.........5.........6.........7.........8 -================================================================================ -Public Domain - -Georgia Tech Research Corporation -Atlanta, Georgia 30332 - - -AUTHORS - - 2 Oct 1991 Jeffrey P. Murray - - -SUMMARY - - This file contains the interface specification file for the - analog gain code model. - -===============================================================================*/ - -NAME_TABLE: - - -C_Function_Name: cm_gain -Spice_Model_Name: gain -Description: "A simple gain block" - - -PORT_TABLE: - - -Port_Name: in out -Description: "input" "output" -Direction: in out -Default_Type: v v -Allowed_Types: [v,vd,i,id,vnam] [v,vd,i,id] -Vector: no no -Vector_Bounds: - - -Null_Allowed: no no - - - -PARAMETER_TABLE: - - -Parameter_Name: in_offset gain out_offset -Description: "input offset" "gain" "output offset" -Data_Type: real real real -Default_Value: 0.0 1.0 0.0 -Limits: - - - -Vector: no no no -Vector_Bounds: - - - -Null_Allowed: yes yes yes - - diff --git a/src/xspice/icm/analog/hyst/cfunc.mod b/src/xspice/icm/analog/hyst/cfunc.mod deleted file mode 100644 index a67eca001..000000000 --- a/src/xspice/icm/analog/hyst/cfunc.mod +++ /dev/null @@ -1,361 +0,0 @@ -/*.......1.........2.........3.........4.........5.........6.........7.........8 -================================================================================ - -FILE hyst/cfunc.mod - -Public Domain - -Georgia Tech Research Corporation -Atlanta, Georgia 30332 -PROJECT A-8503-405 - - -AUTHORS - - 6 Jun 1991 Jeffrey P. Murray - - -MODIFICATIONS - - 2 Oct 1991 Jeffrey P. Murray - - -SUMMARY - - This file contains the model-specific routines used to - functionally describe the hyst code model. - - -INTERFACES - - FILE ROUTINE CALLED - - CMutil.c void cm_smooth_corner(); - - CM.c void *cm_analog_alloc() - void *cm_analog_get_ptr() - - -REFERENCED FILES - - Inputs from and outputs to ARGS structure. - - -NON-STANDARD FEATURES - - NONE - -===============================================================================*/ - -/*=== INCLUDE FILES ====================*/ - -#include "cm_hyst.h" - - - -/*=== CONSTANTS ========================*/ - - - - -/*=== MACROS ===========================*/ - - - - -/*=== LOCAL VARIABLES & TYPEDEFS =======*/ - - - - -/*=== FUNCTION PROTOTYPE DEFINITIONS ===*/ - - - - -/*============================================================================== - -FUNCTION void hyst() - -AUTHORS - - 2 Oct 1991 Jeffrey P. Murray - -MODIFICATIONS - - NONE - -SUMMARY - - This function implements the hyst code model. - -INTERFACES - - FILE ROUTINE CALLED - - CMutil.c void cm_smooth_corner(); - - CM.c void *cm_analog_alloc() - void *cm_analog_get_ptr() - -RETURNED VALUE - - Returns inputs and outputs via ARGS structure. - -GLOBAL VARIABLES - - NONE - -NON-STANDARD FEATURES - - NONE - -==============================================================================*/ - - -/*=== CM_HYST ROUTINE ===*/ - - -/************************************************************************* -* BEHAVIOR OF HYSTERESIS: * -* out hyst hyst * -* ^ ____/\_____ ____/\_____ * -* | / \/ \ * -* | x_fall_linear x_rise_zero * -* out_upper_limit- - *----<-------------<------*-------> * -* | /| /| /| * -* | / /in_high / * -* | / | / | / | * -* | / / __/ * -* | |/_ | / | /| | * -* | / / / * -* | / | / | / | * -* <------O----/------------/------------/-----------------------> in * -* | | / | / | / * -* | / / / * -* <--------*------->----|---->-------* - - - - out_lower_limit * -* x_fall_zero in_low x_rise_linear * -* V * -* * -* input_domain defines "in" increment below & above the "*" points * -* shown, within which smoothing of the d(out)/d(in) values * -* occurs...this prevents abrupt changes in d(out)/d(in) which * -* could prevent the simulator from reaching convergence during * -* a transient or DC analysis. * -* * -**************************************************************************/ - -/**************************************************************************/ -/* Usage of cm_smooth_corner: */ -/* */ -/* void cm_smooth_corner(double x_input, double x_center, double y_center, */ -/* double domain, double lower_slope, */ -/* double upper_slope,double *y_output, double *dy_dx) */ -/* */ -/**************************************************************************/ - - - -void cm_hyst(ARGS) /* structure holding parms, - inputs, outputs, etc. */ -{ - double in, /* input to hysteresis block */ - out, /* output from hysteresis block */ - in_low, /* lower input value for hyst=0 at which - the transfer curve changes from constant - to linear */ - in_high, /* upper input value for hyst=0 at which - the transfer curve changes from constant - to linear */ - hyst, /* the hysteresis value (see above diagram) */ - out_lower_limit, /* the minimum output value from the block */ - out_upper_limit, /* the maximum output value from the block */ - input_domain, /* the delta value of the input above and - below in_low and in_high within which - smoothing will be applied to the output - in order to maintain continuous first partial - derivatives. */ - slope, /* calculated rise and fall slope for the block */ - pout_pin, /* partial derivative of output w.r.t. input */ - x_rise_linear, /* = in_low + hyst */ - x_rise_zero, /* = in_high + hyst */ - x_fall_linear, /* = in_high - hyst */ - x_fall_zero; /* = in_low - hyst */ - - Boolean_t *hyst_state, /* TRUE => input is on lower leg of - hysteresis curve, between -infinity - and in_high + hyst. - FALSE => input is on upper leg - of hysteresis curve, between - in_low - hyst and +infinity */ - *old_hyst_state; /* previous value of *hyst_state */ - - Mif_Complex_t ac_gain; /* AC gain */ - - - - - - /** Retrieve frequently used parameters... **/ - - in_low = PARAM(in_low); - in_high = PARAM(in_high); - hyst = PARAM(hyst); - out_lower_limit = PARAM(out_lower_limit); - out_upper_limit = PARAM(out_upper_limit); - input_domain = PARAM(input_domain); - - - - - /** Calculate Hysteresis Linear Region Slopes & Derived Values **/ - - - /* Define slope of rise and fall lines when not being smoothed */ - - slope = (out_upper_limit - out_lower_limit)/(in_high - in_low); - - x_rise_linear = in_low + hyst; /* Breakpoint - x rising to - linear region */ - x_rise_zero = in_high + hyst; /* Breakpoint - x rising to - zero-slope (out_upper_limit) */ - x_fall_linear = in_high - hyst; /* Breakpoint - x falling to - linear region */ - x_fall_zero = in_low - hyst; /* Breakpoint - x falling to - zero-slope (out_lower_limit) */ - - if (PARAM(fraction) == MIF_TRUE) /* Set range to absolute value */ - input_domain = input_domain * (in_high - in_low); - - - - - /** Retrieve frequently used inputs... **/ - - in = INPUT(in); - - - - /** Test for INIT; if so, allocate storage, otherwise, retrieve - previous timepoint value for output... **/ - - if (INIT==1) { /* First pass...allocate storage for previous state. */ - /* Also, calculate roughly where the current output */ - /* will be and use this value to define current state. */ - - cm_analog_alloc(TRUE,sizeof(Boolean_t)); - - hyst_state = (Boolean_t *) cm_analog_get_ptr(TRUE,0); - old_hyst_state = (Boolean_t *) cm_analog_get_ptr(TRUE,1); - - if (in < x_rise_zero + input_domain) { /* Set state to X_RISING */ - *old_hyst_state = X_RISING; - } - else { - *old_hyst_state = X_FALLING; - } - } - else { /* Allocation not necessary...retrieve previous values */ - - hyst_state = (Boolean_t *) cm_analog_get_ptr(TRUE,0); /* Set out pointer to current - time storage */ - old_hyst_state = (Boolean_t *) cm_analog_get_ptr(TRUE,1); /* Set old-output-state pointer - to previous time storage */ - } - - - - /** Set *hyst_out = *old_hyst_out, unless changed below... - we don't need the last iteration value of *hyst_state. **/ - - *hyst_state = *old_hyst_state; - - - - - /*** Calculate value of hyst_state, pout_pin.... ***/ - - if (*old_hyst_state == X_RISING) { /* Assume calculations on lower */ - /* hysteresis section (x rising) */ - - if ( in <= x_rise_linear - input_domain ) { /* Output @ lower limit */ - - out = out_lower_limit; - pout_pin = 0.0; - } - else { - if ( in <= x_rise_linear + input_domain ) { /* lower smoothing region */ - cm_smooth_corner(in,x_rise_linear,out_lower_limit,input_domain, - 0.0,slope,&out,&pout_pin); - } - else { - if (in <= x_rise_zero - input_domain) { /* Rising linear region */ - out = (in - x_rise_linear)*slope + out_lower_limit; - pout_pin = slope; - } - else { - if (in <= x_rise_zero + input_domain) { /* Upper smoothing region */ - cm_smooth_corner(in,x_rise_zero,out_upper_limit,input_domain, - slope,0.0,&out,&pout_pin); - } - else { /* input has transitioned to X_FALLING region... */ - out = out_upper_limit; - pout_pin = 0.0; - *hyst_state = X_FALLING; - } - } - } - } - } - else { /* Assume calculations on upper hysteresis section (x falling) */ - - if ( in >= x_fall_linear + input_domain ) { /* Output @ upper limit */ - - out = out_upper_limit; - pout_pin = 0.0; - } - else { - if ( in >= x_fall_linear - input_domain ) { /* Upper smoothing region */ - cm_smooth_corner(in,x_fall_linear,out_upper_limit,input_domain, - slope,0.0,&out,&pout_pin); - } - else { - if (in >= x_fall_zero + input_domain) { /* Falling linear region */ - out = (in - x_fall_zero)*slope + out_lower_limit; - pout_pin = slope; - } - else { - if (in >= x_fall_zero - input_domain) { /* Lower smoothing region */ - cm_smooth_corner(in,x_fall_zero,out_lower_limit,input_domain, - 0.0,slope,&out,&pout_pin); - } - else { /* input has transitioned to X_RISING region... */ - out = out_lower_limit; - pout_pin = 0.0; - *hyst_state = X_RISING; - } - } - } - } - } - - - - if (ANALYSIS != MIF_AC) { /* DC & Transient Analyses */ - - OUTPUT(out) = out; - PARTIAL(out,in) = pout_pin; - - } - else { /* AC Analysis */ - ac_gain.real = pout_pin; - ac_gain.imag= 0.0; - AC_GAIN(out,in) = ac_gain; - - } -} - - - - - diff --git a/src/xspice/icm/analog/hyst/cm_hyst.h b/src/xspice/icm/analog/hyst/cm_hyst.h deleted file mode 100644 index 6ba7d9e9f..000000000 --- a/src/xspice/icm/analog/hyst/cm_hyst.h +++ /dev/null @@ -1,74 +0,0 @@ -/*.......1.........2.........3.........4.........5.........6.........7.........8 -================================================================================ - -FILE hyst/cm_hyst.h - -Public Domain - -Georgia Tech Research Corporation -Atlanta, Georgia 30332 -PROJECT A-8503 405 - - -AUTHORS - - 23 Oct 1990 Jeffrey P. Murray - - -MODIFICATIONS - - 2 Oct 1991 Jeffrey P. Murray - - -SUMMARY - - This file contains additional header information for - the hyst code model. - - -INTERFACES - - FILE ROUTINE CALLED - - N/A N/A - - -REFERENCED FILES - - N/A - - -NON-STANDARD FEATURES - - NONE - -===============================================================================*/ - -/*=== INCLUDE FILES ====================*/ - - - - -/*=== CONSTANTS ========================*/ - -#define HYST 1 -#define X_RISING TRUE -#define X_FALLING FALSE - - - -/*=== MACROS ===========================*/ - - - - -/*=== LOCAL VARIABLES & TYPEDEFS =======*/ - - - - -/*=== FUNCTION PROTOTYPE DEFINITIONS ===*/ - - - - diff --git a/src/xspice/icm/analog/hyst/ifspec.ifs b/src/xspice/icm/analog/hyst/ifspec.ifs deleted file mode 100644 index bcd065ef5..000000000 --- a/src/xspice/icm/analog/hyst/ifspec.ifs +++ /dev/null @@ -1,88 +0,0 @@ -/*.......1.........2.........3.........4.........5.........6.........7.........8 -================================================================================ -Public Domain - -Georgia Tech Research Corporation -Atlanta, Georgia 30332 - - -AUTHORS - - 2 Oct 1991 Jeffrey P. Murray - - -SUMMARY - - This file contains the interface specification file for the - analog hyst code model. - -===============================================================================*/ - -NAME_TABLE: - - -C_Function_Name: cm_hyst -Spice_Model_Name: hyst -Description: "hysteresis block" - - -PORT_TABLE: - - -Port_Name: in out -Description: "input" "output" -Direction: in out -Default_Type: v v -Allowed_Types: [v,vd,i,id,vnam] [v,vd,i,id] -Vector: no no -Vector_Bounds: - - -Null_Allowed: no no - -PARAMETER_TABLE: - -Parameter_Name: in_low in_high -Description: "input low value" "input high value" -Data_Type: real real -Default_Value: 0.0 1.0 -Limits: - - -Vector: no no -Vector_Bounds: - - -Null_Allowed: yes yes - - -PARAMETER_TABLE: - -Parameter_Name: hyst out_lower_limit -Description: "hysteresis" "output lower limit" -Data_Type: real real -Default_Value: 0.1 0.0 -Limits: [0 -] - -Vector: no no -Vector_Bounds: - - -Null_Allowed: yes yes - - -PARAMETER_TABLE: - -Parameter_Name: out_upper_limit input_domain -Description: "output upper limit" "input smoothing domain" -Data_Type: real real -Default_Value: 1.0 0.01 -Limits: - - -Vector: no no -Vector_Bounds: - - -Null_Allowed: yes yes - - -PARAMETER_TABLE: - -Parameter_Name: fraction -Description: "smoothing percent/abs switch" -Data_Type: boolean -Default_Value: TRUE -Limits: - -Vector: no -Vector_Bounds: - -Null_Allowed: yes - - diff --git a/src/xspice/icm/analog/ilimit/cfunc.mod b/src/xspice/icm/analog/ilimit/cfunc.mod deleted file mode 100644 index 1810c79cb..000000000 --- a/src/xspice/icm/analog/ilimit/cfunc.mod +++ /dev/null @@ -1,441 +0,0 @@ -/*.......1.........2.........3.........4.........5.........6.........7.........8 -================================================================================ - -FILE ilimit/cfunc.mod - -Public Domain - -Georgia Tech Research Corporation -Atlanta, Georgia 30332 -PROJECT A-8503-405 - - -AUTHORS - - 6 Jun 1991 Jeffrey P. Murray - - -MODIFICATIONS - - 2 Oct 1991 Jeffrey P. Murray - - -SUMMARY - - This file contains the model-specific routines used to - functionally describe the ilimit code model. - - -INTERFACES - - FILE ROUTINE CALLED - - CMutil.c void cm_smooth_corner(); - void cm_smooth_discontinuity(); - void cm_climit_fcn() - -REFERENCED FILES - - Inputs from and outputs to ARGS structure. - - -NON-STANDARD FEATURES - - NONE - -===============================================================================*/ - -/*=== INCLUDE FILES ====================*/ - - - - -/*=== CONSTANTS ========================*/ - - - - -/*=== MACROS ===========================*/ - - - - -/*=== LOCAL VARIABLES & TYPEDEFS =======*/ - - - - -/*=== FUNCTION PROTOTYPE DEFINITIONS ===*/ - - - - - -/*============================================================================== - -FUNCTION void cm_ilimit() - -AUTHORS - - 6 Jun 1991 Jeffrey P. Murray - -MODIFICATIONS - - 2 Oct 1991 Jeffrey P. Murray - -SUMMARY - - This function implements the ilimit code model. - -INTERFACES - - FILE ROUTINE CALLED - - CMutil.c void cm_smooth_corner(); - void cm_smooth_discontinuity(); - void cm_climit_fcn() - -RETURNED VALUE - - Returns inputs and outputs via ARGS structure. - -GLOBAL VARIABLES - - NONE - -NON-STANDARD FEATURES - - NONE - -==============================================================================*/ - -/*=== CM_ILIMIT ROUTINE ===*/ - -void cm_ilimit(ARGS) /* structure holding parms, - inputs, outputs, etc. */ -{ - double in_offset,gain,r_out_source,r_out_sink,i_limit_source, - i_limit_sink,v_pwr_range,i_source_range,i_sink_range, - r_out_domain,/*out_lower_limit,out_upper_limit,*/veq,pveq_pvin, - pveq_pvpos,pveq_pvneg,r_out,pr_out_px,i_out,i_threshold_lower, - i_threshold_upper,i_pos_pwr,pi_out_pvin,pi_pos_pvneg, - pi_pos_pvpos,pi_pos_pvout,i_neg_pwr,pi_neg_pvin,pi_neg_pvneg, - pi_neg_pvpos,pi_neg_pvout,vout,pi_out_plimit,pi_out_pvout, - pi_out_ppos_pwr,pi_out_pneg_pwr,pi_pos_pvin,pi_neg_plimit, - pi_pos_plimit,pos_pwr_in,neg_pwr_in; - - Mif_Complex_t ac_gain; - - - - - /* Retrieve frequently used parameters... */ - - in_offset = PARAM(in_offset); - gain = PARAM(gain); - r_out_source = PARAM(r_out_source); - r_out_sink = PARAM(r_out_sink); - i_limit_source = PARAM(i_limit_source); - i_limit_sink = PARAM(i_limit_sink); - v_pwr_range = PARAM(v_pwr_range); - i_source_range = PARAM(i_source_range); - i_sink_range = PARAM(i_sink_range); - r_out_domain = PARAM(r_out_domain); - - - - - - /* Retrieve frequently used inputs... */ - - vout = INPUT(out); - - - - /* Test to see if pos_pwr or neg_pwr are connected... */ - /* if not, assign large voltage values to the variables */ - /* pos_pwr andneg_pwr... */ - - if ( PORT_NULL(pos_pwr) ) { - pos_pwr_in = 1.0e6; - } - else { - pos_pwr_in = INPUT(pos_pwr); - } - - if ( PORT_NULL(neg_pwr) ) { - neg_pwr_in = -1.0e6; - } - else { - neg_pwr_in = INPUT(neg_pwr); - } - - - /* Compute Veq plus derivatives using climit_fcn */ - - if(INIT != 1){ - /* If reasonable power and voltage values exist (i.e., not INIT)... */ - /* then calculate expected equivalent voltage values and derivs. */ - - cm_climit_fcn(INPUT(in), in_offset, pos_pwr_in, neg_pwr_in, - 0.0, 0.0, v_pwr_range, gain, MIF_FALSE, &veq, - &pveq_pvin, &pveq_pvneg, &pveq_pvpos); - } - else { - /* Initialization pass...set nominal values */ - - veq = (pos_pwr_in - neg_pwr_in) / 2.0; - pveq_pvin = 0.0; - pveq_pvpos = 0.0; - pveq_pvneg = 0.0; - } - - - /* Calculate Rout */ - - if (r_out_source == r_out_sink) { - /* r_out constant => no calculation necessary */ - - r_out = r_out_source; - pr_out_px = 0.0; - - } - else { /* Interpolate smoothly between sourcing & sinking values */ - cm_smooth_discontinuity(veq - vout, -r_out_domain, r_out_sink, r_out_domain, - r_out_source, &r_out, &pr_out_px); - } - - - - /* Calculate i_out & derivatives */ - - i_threshold_lower = -i_limit_sink + i_sink_range; - i_threshold_upper = i_limit_source - i_source_range; - - i_out = (veq - vout) / r_out; - pi_out_pvin = (pveq_pvin/r_out - veq*pr_out_px*pveq_pvin/ - (r_out*r_out)); - pi_out_pvout = (-1.0/r_out - vout*pr_out_px/(r_out*r_out)); - - pi_out_ppos_pwr = (pveq_pvpos/r_out - veq*pr_out_px*pveq_pvpos/ - (r_out*r_out)); - pi_out_pneg_pwr = (pveq_pvneg/r_out - veq*pr_out_px*pveq_pvneg/ - (r_out*r_out)); - - - /* Preset i_pos_pwr & i_neg_pwr & partials to 0.0 */ - - i_pos_pwr = 0.0; - pi_pos_pvin = 0.0; - pi_pos_pvneg = 0.0; - pi_pos_pvpos = 0.0; - pi_pos_pvout = 0.0; - - - i_neg_pwr = 0.0; - pi_neg_pvin = 0.0; - pi_neg_pvneg = 0.0; - pi_neg_pvpos = 0.0; - pi_neg_pvout = 0.0; - - - - - /* Determine operating point of i_out for limiting */ - - if (i_out < 0.0) { /* i_out sinking */ - if (i_out < i_threshold_lower) { - if (i_out < (-i_limit_sink-i_sink_range)) { /* i_out lower-limited */ - i_out = -i_limit_sink; - i_neg_pwr = -i_out; - pi_out_pvin = 0.0; - pi_out_pvout = 0.0; - pi_out_ppos_pwr = 0.0; - pi_out_pneg_pwr = 0.0; - } - else { /* i_out in lower smoothing region */ - cm_smooth_corner(i_out,-i_limit_sink,-i_limit_sink,i_sink_range, - 0.0,1.0,&i_out,&pi_out_plimit); - pi_out_pvin = pi_out_pvin * pi_out_plimit; - pi_out_pvout = pi_out_pvout * pi_out_plimit; - pi_out_ppos_pwr = pi_out_ppos_pwr * pi_out_plimit; - pi_out_pneg_pwr = pi_out_pneg_pwr * pi_out_plimit; - - i_neg_pwr = -i_out; - pi_neg_pvin = -pi_out_pvin; - pi_neg_pvneg = -pi_out_pneg_pwr; - pi_neg_pvpos = -pi_out_ppos_pwr; - pi_neg_pvout = -pi_out_pvout; - } - } - else { /* i_out in lower linear region...calculate i_neg_pwr */ - if (i_out > -2.0*i_sink_range) { /* i_out near 0.0...smooth i_neg_pwr */ - cm_smooth_corner(i_out,-i_sink_range,0.0,i_sink_range,1.0,0.0, - &i_neg_pwr,&pi_neg_plimit); - i_neg_pwr = -i_neg_pwr; - pi_neg_pvin = -pi_out_pvin * pi_neg_plimit; - pi_neg_pvneg = -pi_out_pneg_pwr * pi_neg_plimit; - pi_neg_pvpos = -pi_out_ppos_pwr * pi_neg_plimit; - pi_neg_pvout = -pi_out_pvout * pi_neg_plimit; - } - else { - i_neg_pwr = -i_out; /* Not near i_out=0.0 => i_neg_pwr=-i_out */ - pi_neg_pvin = -pi_out_pvin; - pi_neg_pvneg = -pi_out_pneg_pwr; - pi_neg_pvpos = -pi_out_ppos_pwr; - pi_neg_pvout = -pi_out_pvout; - } - } - } - else { /* i_out sourcing */ - if (i_out > i_threshold_upper) { - if (i_out > (i_limit_source + i_source_range)) { /* i_out upper-limited */ - i_out = i_limit_source; - i_pos_pwr = -i_out; - pi_out_pvin = 0.0; - pi_out_pvout = 0.0; - pi_out_ppos_pwr = 0.0; - pi_out_pneg_pwr = 0.0; - } - else { /* i_out in upper smoothing region */ - cm_smooth_corner(i_out,i_limit_source,i_limit_source,i_sink_range, - 1.0,0.0,&i_out,&pi_out_plimit); - pi_out_pvin = pi_out_pvin * pi_out_plimit; - pi_out_pvout = pi_out_pvout * pi_out_plimit; - pi_out_ppos_pwr = pi_out_ppos_pwr * pi_out_plimit; - pi_out_pneg_pwr = pi_out_pneg_pwr * pi_out_plimit; - - i_pos_pwr = -i_out; - pi_pos_pvin = -pi_out_pvin; - pi_pos_pvneg = -pi_out_pneg_pwr; - pi_pos_pvpos = -pi_out_ppos_pwr; - pi_pos_pvout = -pi_out_pvout; - } - } - else { /* i_out in upper linear region...calculate i_pos_pwr */ - if (i_out < 2.0*i_source_range) { /* i_out near 0.0...smooth i_pos_pwr */ - cm_smooth_corner(i_out,i_source_range,0.0,i_source_range,0.0,1.0, - &i_pos_pwr,&pi_pos_plimit); - i_pos_pwr = -i_pos_pwr; - pi_pos_pvin = -pi_out_pvin * pi_pos_plimit; - pi_pos_pvneg = -pi_out_pneg_pwr * pi_pos_plimit; - pi_pos_pvpos = -pi_out_ppos_pwr * pi_pos_plimit; - pi_pos_pvout = -pi_out_pvout * pi_pos_plimit; - } - else { /* Not near i_out=0.0 => i_pos_pwr=-i_out */ - i_pos_pwr = -i_out; - pi_pos_pvin = -pi_out_pvin; - pi_pos_pvneg = -pi_out_pneg_pwr; - pi_pos_pvpos = -pi_out_ppos_pwr; - pi_pos_pvout = -pi_out_pvout; - } - } - } - - - - - - if (ANALYSIS != MIF_AC) { /* DC & Transient Analyses */ - - - /* Debug line...REMOVE FOR FINAL VERSION!!! */ - /*OUTPUT(t1) = veq; - OUTPUT(t2) = r_out; - OUTPUT(t3) = pveq_pvin; - OUTPUT(t4) = pveq_pvpos; - OUTPUT(t5) = pveq_pvneg;*/ - - - OUTPUT(out) = -i_out; /* Remember...current polarity must be */ - PARTIAL(out,in) = -pi_out_pvin; /* reversed for SPICE...all previous code */ - PARTIAL(out,out) = -pi_out_pvout; /* assumes i_out positive when EXITING */ - /* the model and negative when entering. */ - /* SPICE assumes the opposite, so a */ - /* minus sign is added to all currents */ - /* and current partials to compensate for */ - /* this fact.... JPM */ - - if ( !PORT_NULL(neg_pwr) ) { - OUTPUT(neg_pwr) = -i_neg_pwr; - PARTIAL(neg_pwr,in) = -pi_neg_pvin; - PARTIAL(neg_pwr,out) = -pi_neg_pvout; - if(!PORT_NULL(pos_pwr)){ - PARTIAL(neg_pwr,pos_pwr) = -pi_neg_pvpos; - } - PARTIAL(neg_pwr,neg_pwr) = -pi_neg_pvneg; - PARTIAL(out,neg_pwr) = -pi_out_pneg_pwr; - } - - if ( !PORT_NULL(pos_pwr) ) { - OUTPUT(pos_pwr) = -i_pos_pwr; - PARTIAL(pos_pwr,in) = -pi_pos_pvin; - PARTIAL(pos_pwr,out) = -pi_pos_pvout; - PARTIAL(pos_pwr,pos_pwr) = -pi_pos_pvpos; - if ( !PORT_NULL(neg_pwr) ) { - PARTIAL(pos_pwr,neg_pwr) = -pi_pos_pvneg; - } - PARTIAL(out,pos_pwr) = -pi_out_ppos_pwr; - } - - } - else { /* AC Analysis */ - ac_gain.real = -pi_out_pvin; - ac_gain.imag= 0.0; - AC_GAIN(out,in) = ac_gain; - - ac_gain.real = -pi_out_pvout; - ac_gain.imag= 0.0; - AC_GAIN(out,out) = ac_gain; - - if ( !PORT_NULL(neg_pwr) ) { - ac_gain.real = -pi_neg_pvin; - ac_gain.imag= 0.0; - AC_GAIN(neg_pwr,in) = ac_gain; - - ac_gain.real = -pi_out_pneg_pwr; - ac_gain.imag= 0.0; - AC_GAIN(out,neg_pwr) = ac_gain; - - ac_gain.real = -pi_neg_pvout; - ac_gain.imag= 0.0; - AC_GAIN(neg_pwr,out) = ac_gain; - - ac_gain.real = -pi_neg_pvpos; - ac_gain.imag= 0.0; - AC_GAIN(neg_pwr,pos_pwr) = ac_gain; - - ac_gain.real = -pi_neg_pvneg; - ac_gain.imag= 0.0; - AC_GAIN(neg_pwr,neg_pwr) = ac_gain; - } - - - if ( !PORT_NULL(pos_pwr) ) { - ac_gain.real = -pi_pos_pvin; - ac_gain.imag= 0.0; - AC_GAIN(pos_pwr,in) = ac_gain; - - ac_gain.real = -pi_out_ppos_pwr; - ac_gain.imag= 0.0; - AC_GAIN(out,pos_pwr) = ac_gain; - - ac_gain.real = -pi_pos_pvout; - ac_gain.imag= 0.0; - AC_GAIN(pos_pwr,out) = ac_gain; - - ac_gain.real = -pi_pos_pvpos; - ac_gain.imag= 0.0; - AC_GAIN(pos_pwr,pos_pwr) = ac_gain; - - ac_gain.real = -pi_pos_pvneg; - ac_gain.imag= 0.0; - AC_GAIN(pos_pwr,neg_pwr) = ac_gain; - } - } -} - - - - - diff --git a/src/xspice/icm/analog/ilimit/ifspec.ifs b/src/xspice/icm/analog/ilimit/ifspec.ifs deleted file mode 100644 index e7ec2be78..000000000 --- a/src/xspice/icm/analog/ilimit/ifspec.ifs +++ /dev/null @@ -1,111 +0,0 @@ -/*.......1.........2.........3.........4.........5.........6.........7.........8 -================================================================================ -Public Domain - -Georgia Tech Research Corporation -Atlanta, Georgia 30332 - - -AUTHORS - - 2 Oct 1991 Jeffrey P. Murray - - -SUMMARY - - This file contains the interface specification file for the - analog ilimit code model. - -===============================================================================*/ - -NAME_TABLE: - - -C_Function_Name: cm_ilimit -Spice_Model_Name: ilimit -Description: "current limiter block" - - -PORT_TABLE: - - -Port_Name: in pos_pwr -Description: "input" "positive power supply" -Direction: in inout -Default_Type: v g -Allowed_Types: [v,vd,i,id,vnam] [g,gd] -Vector: no no -Vector_Bounds: - - -Null_Allowed: no yes - -PORT_TABLE: - -Port_Name: neg_pwr out -Description: "negative power supply" "output" -Direction: inout inout -Default_Type: g g -Allowed_Types: [g,gd] [g,gd] -Vector: no no -Vector_Bounds: - - -Null_Allowed: yes no - - -PARAMETER_TABLE: - -Parameter_Name: in_offset gain -Description: "input offset" "gain" -Data_Type: real real -Default_Value: 0.0 1.0 -Limits: - - -Vector: no no -Vector_Bounds: - - -Null_Allowed: yes yes - - -PARAMETER_TABLE: - - -Parameter_Name: r_out_source r_out_sink -Description: "sourcing resistance" "sinking resistance" -Data_Type: real real -Default_Value: 1.0 1.0 -Limits: [1e-9 1e9] [1e-9 1e9] -Vector: no no -Vector_Bounds: - - -Null_Allowed: yes yes - - - -PARAMETER_TABLE: - - -Parameter_Name: i_limit_source i_limit_sink -Description: "current sourcing limit" "current sinking limit" -Data_Type: real real -Default_Value: 10.0e-3 10.0e-3 -Limits: [1e-12 -] [1e-12 -] -Vector: no no -Vector_Bounds: - - -Null_Allowed: yes yes - -PARAMETER_TABLE: - -Parameter_Name: v_pwr_range i_source_range -Description: "pwr. smoothing range" "sourcing cur sm. rng" -Data_Type: real real -Default_Value: 1e-6 1e-9 -Limits: [1e-15 -] [1e-15 -] -Vector: no no -Vector_Bounds: - - -Null_Allowed: yes yes - -PARAMETER_TABLE: - -Parameter_Name: i_sink_range r_out_domain -Description: "sinking cur sm. rng" "output resistance sm. domain" -Data_Type: real real -Default_Value: 1e-9 1e-9 -Limits: [1e-15 -] [1e-15 -] -Vector: no no -Vector_Bounds: - - -Null_Allowed: yes yes diff --git a/src/xspice/icm/analog/int/cfunc.mod b/src/xspice/icm/analog/int/cfunc.mod deleted file mode 100644 index 2cc66cc7d..000000000 --- a/src/xspice/icm/analog/int/cfunc.mod +++ /dev/null @@ -1,240 +0,0 @@ -/*.......1.........2.........3.........4.........5.........6.........7.........8 -================================================================================ - -FILE int/cfunc.mod - -Public Domain - -Georgia Tech Research Corporation -Atlanta, Georgia 30332 -PROJECT A-8503-405 - - -AUTHORS - - 6 Nov 1991 Jeffrey P. Murray - - -MODIFICATIONS - - 2 Oct 1991 Jeffrey P. Murray - - -SUMMARY - - This file contains the model-specific routines used to - functionally describe the int code model. - - -INTERFACES - - FILE ROUTINE CALLED - - CMutil.c void cm_smooth_corner(); - - CM.c void *cm_analog_alloc() - void *cm_analog_get_ptr() - int cm_analog_integrate() - - -REFERENCED FILES - - Inputs from and outputs to ARGS structure. - - -NON-STANDARD FEATURES - - NONE - -===============================================================================*/ - -/*=== INCLUDE FILES ====================*/ - -#include "int.h" - - - -/*=== CONSTANTS ========================*/ - - - - -/*=== MACROS ===========================*/ - - - - -/*=== LOCAL VARIABLES & TYPEDEFS =======*/ - - - - -/*=== FUNCTION PROTOTYPE DEFINITIONS ===*/ - - - - - -/*============================================================================== - -FUNCTION void cm_int() - -AUTHORS - - 2 Oct 1991 Jeffrey P. Murray - -MODIFICATIONS - - NONE - -SUMMARY - - This function implements the int code model. - -INTERFACES - - FILE ROUTINE CALLED - - CMutil.c void cm_smooth_corner(); - - CM.c void *cm_analog_alloc() - void *cm_analog_get_ptr() - int cm_analog_integrate() - -RETURNED VALUE - - Returns inputs and outputs via ARGS structure. - -GLOBAL VARIABLES - - NONE - -NON-STANDARD FEATURES - - NONE - -==============================================================================*/ - -/*=== CM_INT ROUTINE ===*/ - -void cm_int(ARGS) /* structure holding parms, - inputs, outputs, etc. */ -{ - double *out, /* current output */ - *in, /* input */ - in_offset, /* input offset */ - gain, /* gain parameter */ - out_lower_limit, /* output lower limit */ - out_upper_limit, /* output upper limit */ - limit_range, /* range of output below out_upper_limit - and above out_lower_limit within which - smoothing will take place */ - out_ic, /* output initial condition - initial output value */ - pout_pin, /* partial derivative of output w.r.t. input */ - pout_gain; /* temporary storage variable for partial - value returned by smoothing function - (subsequently multiplied by pout_pin) */ - - Mif_Complex_t ac_gain; /* AC gain */ - - - - /** Retrieve frequently used parameters (used by all analyses)... **/ - - gain = PARAM(gain); - - - - if (ANALYSIS != MIF_AC) { /**** DC & Transient Analyses ****/ - - /** Retrieve frequently used parameters... **/ - - in_offset = PARAM(in_offset); - out_lower_limit = PARAM(out_lower_limit); - out_upper_limit = PARAM(out_upper_limit); - limit_range = PARAM(limit_range); - out_ic = PARAM(out_ic); - - - - /** Test for INIT; if so, allocate storage, otherwise, retrieve - previous timepoint input value... **/ - - if (INIT==1) { /* First pass...allocate storage for previous value. */ - - cm_analog_alloc(INT1,sizeof(double)); - cm_analog_alloc(INT2,sizeof(double)); - } - /* retrieve previous value */ - - in = (double *) cm_analog_get_ptr(INT1,0); /* Set out pointer to input storage location */ - out = (double *) cm_analog_get_ptr(INT2,0); /* Set out pointer to output storage location */ - - - /*** Read input value for current time, and calculate pseudo-input ***/ - /*** which includes input offset and gain.... ***/ - - *in = gain*(INPUT(in)+in_offset); - - /*** Test to see if this is the first timepoint calculation... ***/ - /*** this would imply that TIME equals zero. ***/ - - if ( 0.0 == TIME ) { /*** Test to see if this is the first ***/ - /*** timepoint calculation...if ***/ - *out = out_ic; /*** so, return out_ic. ***/ - pout_pin = 0.0; - } - else { /*** Calculate value of integral.... ***/ - cm_analog_integrate(*in,out,&pout_pin); - } - - - /*** Smooth output if it is within limit_range of - out_lower_limit or out_upper_limit. ***/ - - if (*out < (out_lower_limit - limit_range)) { /* At lower limit. */ - *out = out_lower_limit; - pout_pin = 0.0; - } - else { - if (*out < (out_lower_limit + limit_range)) { /* Lower smoothing range */ - cm_smooth_corner(*out,out_lower_limit,out_lower_limit,limit_range, - 0.0,1.0,out,&pout_gain); - pout_pin = pout_pin * pout_gain; - } - else { - if (*out > (out_upper_limit + limit_range)) { /* At upper limit */ - *out = out_upper_limit; - pout_pin = 0.0; - } - else { - if (*out > (out_upper_limit - limit_range)) { /* Upper smoothing region */ - cm_smooth_corner(*out,out_upper_limit,out_upper_limit,limit_range, - 1.0,0.0,out,&pout_gain); - pout_pin = pout_pin * pout_gain; - } - } - } - } - - - - - /** Output values for DC & Transient **/ - - OUTPUT(out) = *out; - PARTIAL(out,in) = pout_pin; - - } - - else { /**** AC Analysis...output (0.0,gain/s) ****/ - ac_gain.real = 0.0; - ac_gain.imag = -gain / RAD_FREQ; - AC_GAIN(out,in) = ac_gain; - } -} - - - - - diff --git a/src/xspice/icm/analog/int/ifspec.ifs b/src/xspice/icm/analog/int/ifspec.ifs deleted file mode 100644 index e8f957e2e..000000000 --- a/src/xspice/icm/analog/int/ifspec.ifs +++ /dev/null @@ -1,80 +0,0 @@ -/*.......1.........2.........3.........4.........5.........6.........7.........8 -================================================================================ -Public Domain - -Georgia Tech Research Corporation -Atlanta, Georgia 30332 - - -AUTHORS - - 6 Nov 1991 Jeffrey P. Murray - - -SUMMARY - - This file contains the interface specification file for the - analog int code model. - -===============================================================================*/ - -NAME_TABLE: - - -C_Function_Name: cm_int -Spice_Model_Name: int -Description: "integrator block" - - -PORT_TABLE: - - -Port_Name: in out -Description: "input" "output" -Direction: in out -Default_Type: v v -Allowed_Types: [v,vd,i,id,vnam] [v,vd,i,id] -Vector: no no -Vector_Bounds: - - -Null_Allowed: no no - - -PARAMETER_TABLE: - - -Parameter_Name: in_offset gain -Description: "input offset" "gain" -Data_Type: real real -Default_Value: 0.0 1.0 -Limits: - - -Vector: no no -Vector_Bounds: - - -Null_Allowed: yes yes - - -PARAMETER_TABLE: - - -Parameter_Name: out_lower_limit out_upper_limit -Description: "output lower limit" "output upper limit" -Data_Type: real real -Default_Value: - - -Limits: - - -Vector: no no -Vector_Bounds: - - -Null_Allowed: yes yes - - - -PARAMETER_TABLE: - - -Parameter_Name: limit_range out_ic -Description: "upper & lower sm. range" "output initial condition" -Data_Type: real real -Default_Value: 1.0e-6 0.0 -Limits: - - -Vector: no no -Vector_Bounds: - - -Null_Allowed: yes yes - diff --git a/src/xspice/icm/analog/int/int.h b/src/xspice/icm/analog/int/int.h deleted file mode 100644 index 57a319916..000000000 --- a/src/xspice/icm/analog/int/int.h +++ /dev/null @@ -1,74 +0,0 @@ -/*.......1.........2.........3.........4.........5.........6.........7.........8 -================================================================================ - -FILE int/int.h - -Public Domain - -Georgia Tech Research Corporation -Atlanta, Georgia 30332 -PROJECT A-8503-405 - - -AUTHORS - - 6 Nov 1990 Jeffrey P. Murray - - -MODIFICATIONS - - 2 Oct 1991 Jeffrey P. Murray - - -SUMMARY - - This file contains additional header information for - the int code model. - - -INTERFACES - - FILE ROUTINE CALLED - - N/A N/A - -REFERENCED FILES - - NONE - - -NON-STANDARD FEATURES - - NONE - -===============================================================================*/ - -/*=== INCLUDE FILES ====================*/ - - - - -/*=== CONSTANTS ========================*/ - -#define INT1 1 -#define INT2 2 - - - -/*=== MACROS ===========================*/ - - - - -/*=== LOCAL VARIABLES & TYPEDEFS =======*/ - - - - -/*=== FUNCTION PROTOTYPE DEFINITIONS ===*/ - - - - - - diff --git a/src/xspice/icm/analog/limit/cfunc.mod b/src/xspice/icm/analog/limit/cfunc.mod deleted file mode 100644 index d97b43932..000000000 --- a/src/xspice/icm/analog/limit/cfunc.mod +++ /dev/null @@ -1,202 +0,0 @@ -/*.......1.........2.........3.........4.........5.........6.........7.........8 -================================================================================ - -FILE limit/cfunc.mod - -Public Domain - -Georgia Tech Research Corporation -Atlanta, Georgia 30332 -PROJECT A-8503-405 - - -AUTHORS - - 6 Jun 1991 Jeffrey P. Murray - - -MODIFICATIONS - - 2 Oct 1991 Jeffrey P. Murray - - -SUMMARY - - This file contains the model-specific routines used to - functionally describe the limit code model. - - -INTERFACES - - FILE ROUTINE CALLED - - CMutil.c void cm_smooth_corner(); - - -REFERENCED FILES - - Inputs from and outputs to ARGS structure. - - -NON-STANDARD FEATURES - - NONE - -===============================================================================*/ - -/*=== INCLUDE FILES ====================*/ - - - - -/*=== CONSTANTS ========================*/ - - - - -/*=== MACROS ===========================*/ - - - - -/*=== LOCAL VARIABLES & TYPEDEFS =======*/ - - - - -/*=== FUNCTION PROTOTYPE DEFINITIONS ===*/ - - - - - -/*============================================================================== - -FUNCTION void cm_limit() - -AUTHORS - - 2 Oct 1991 Jeffrey P. Murray - -MODIFICATIONS - - NONE - -SUMMARY - - This function implements the limit code model. - -INTERFACES - - FILE ROUTINE CALLED - - CMutil.c void cm_smooth_corner(); - - -RETURNED VALUE - - Returns inputs and outputs via ARGS structure. - -GLOBAL VARIABLES - - NONE - -NON-STANDARD FEATURES - - NONE - -==============================================================================*/ - -/*=== CM_LIMIT ROUTINE ===*/ - -void cm_limit(ARGS) /* structure holding parms, - inputs, outputs, etc. */ -{ - double out_lower_limit; /* output lower limit */ - double out_upper_limit; /* output upper limit */ - double limit_range; /* upper and lower limit smoothing range */ - double gain; /* gain */ - double threshold_upper; /* value above which smoothing takes place */ - double threshold_lower; /* value below which smoothing takes place */ - double out; /* output */ - double limited_out; /* limited output value */ - double out_partial; /* partial of the output wrt input */ - - Mif_Complex_t ac_gain; - - - - /* Retrieve frequently used parameters... */ - - out_lower_limit = PARAM(out_lower_limit); - out_upper_limit = PARAM(out_upper_limit); - limit_range = PARAM(limit_range); - gain = PARAM(gain); - - - if (PARAM(fraction) == MIF_TRUE) /* Set range to absolute value */ - limit_range = limit_range * - (out_upper_limit - out_lower_limit); - - - - threshold_upper = out_upper_limit - /* Set Upper Threshold */ - limit_range; - - threshold_lower = out_lower_limit + /* Set Lower Threshold */ - limit_range; - - - - /* Compute Un-Limited Output */ - - out = gain * (PARAM(in_offset) + INPUT(in)); - - - - if (out < threshold_lower) { /* Limit Out @ Lower Bound */ - - if (out > (out_lower_limit - limit_range)) { /* Parabolic */ - cm_smooth_corner(out,out_lower_limit,out_lower_limit, - limit_range,0.0,1.0,&limited_out, - &out_partial); - out_partial = gain * out_partial; - } - else { /* Hard-Limited Region */ - limited_out = out_lower_limit; - out_partial = 0.0; - } - } - else { - if (out > threshold_upper) { /* Limit Out @ Upper Bound */ - - if (out < (out_upper_limit + limit_range)) { /* Parabolic */ - cm_smooth_corner(out,out_upper_limit,out_upper_limit, - limit_range,1.0,0.0,&limited_out, - &out_partial); - out_partial = gain * out_partial; - } - else { /* Hard-Limited Region */ - limited_out = out_upper_limit; - out_partial = 0.0; - } - } - else { /* No Limiting Needed */ - limited_out = out; - out_partial = gain; - } - } - - if (ANALYSIS != MIF_AC) { /* DC & Transient Analyses */ - - OUTPUT(out) = limited_out; - PARTIAL(out,in) = out_partial; - - } - else { /* AC Analysis */ - ac_gain.real = out_partial; - ac_gain.imag= 0.0; - AC_GAIN(out,in) = ac_gain; - - } -} diff --git a/src/xspice/icm/analog/limit/ifspec.ifs b/src/xspice/icm/analog/limit/ifspec.ifs deleted file mode 100644 index 441f0eb8e..000000000 --- a/src/xspice/icm/analog/limit/ifspec.ifs +++ /dev/null @@ -1,81 +0,0 @@ -/*.......1.........2.........3.........4.........5.........6.........7.........8 -================================================================================ -Public Domain - -Georgia Tech Research Corporation -Atlanta, Georgia 30332 - - -AUTHORS - - 2 Oct 1991 Jeffrey P. Murray - - -SUMMARY - - This file contains the interface specification file for the - analog limit code model. - -===============================================================================*/ - -NAME_TABLE: - - -C_Function_Name: cm_limit -Spice_Model_Name: limit -Description: "limit block" - - -PORT_TABLE: - - -Port_Name: in out -Description: "input" "output" -Direction: in out -Default_Type: v v -Allowed_Types: [v,vd,i,id,vnam] [v,vd,i,id] -Vector: no no -Vector_Bounds: - - -Null_Allowed: no no - - -PARAMETER_TABLE: - - -Parameter_Name: in_offset gain -Description: "input offset" "gain" -Data_Type: real real -Default_Value: 0.0 1.0 -Limits: - - -Vector: no no -Vector_Bounds: - - -Null_Allowed: yes yes - - -PARAMETER_TABLE: - - -Parameter_Name: out_lower_limit out_upper_limit -Description: "output lower limit" "output upper limit" -Data_Type: real real -Default_Value: - - -Limits: - - -Vector: no no -Vector_Bounds: - - -Null_Allowed: yes yes - - - -PARAMETER_TABLE: - - -Parameter_Name: limit_range fraction -Description: "upper & lower sm. range" "smoothing percent/abs switch" -Data_Type: real boolean -Default_Value: 1.0e-6 FALSE -Limits: - - -Vector: no no -Vector_Bounds: - - -Null_Allowed: yes yes - - diff --git a/src/xspice/icm/analog/modpath.lst b/src/xspice/icm/analog/modpath.lst deleted file mode 100644 index 481162718..000000000 --- a/src/xspice/icm/analog/modpath.lst +++ /dev/null @@ -1,21 +0,0 @@ -climit -divide -d_dt -gain -hyst -ilimit -int -limit -mult -multi_input_pwl -oneshot -pwl -sine -slew -square -summer -s_xfer -triangle -file_source -delay -pwlts diff --git a/src/xspice/icm/analog/mult/cfunc.mod b/src/xspice/icm/analog/mult/cfunc.mod deleted file mode 100644 index 93e7a32ae..000000000 --- a/src/xspice/icm/analog/mult/cfunc.mod +++ /dev/null @@ -1,178 +0,0 @@ -/*.......1.........2.........3.........4.........5.........6.........7.........8 -================================================================================ - -FILE mult/cfunc.mod - -Public Domain - -Georgia Tech Research Corporation -Atlanta, Georgia 30332 -PROJECT A-8503-405 - - -AUTHORS - - 20 Mar 1991 Jeffrey P. Murray - - -MODIFICATIONS - - 2 Oct 1991 Jeffrey P. Murray - - -SUMMARY - - This file contains the model-specific routines used to - functionally describe the mult code model. - - -INTERFACES - - FILE ROUTINE CALLED - - N/A N/A - - -REFERENCED FILES - - Inputs from and outputs to ARGS structure. - - -NON-STANDARD FEATURES - - NONE - -===============================================================================*/ - -/*=== INCLUDE FILES ====================*/ - - - - -/*=== CONSTANTS ========================*/ - - - - -/*=== MACROS ===========================*/ - - - - -/*=== LOCAL VARIABLES & TYPEDEFS =======*/ - - - - -/*=== FUNCTION PROTOTYPE DEFINITIONS ===*/ - - - - - -/*============================================================================== - -FUNCTION void cm_mult() - -AUTHORS - - 20 Mar 1991 Jeffrey P. Murray - - -MODIFICATIONS - - 2 Oct 1991 Jeffrey P. Murray - -SUMMARY - - This function implements the mult code model. - -INTERFACES - - FILE ROUTINE CALLED - - N/A N/A - - -RETURNED VALUE - - Returns inputs and outputs via ARGS structure. - -GLOBAL VARIABLES - - NONE - -NON-STANDARD FEATURES - - NONE - -==============================================================================*/ - -/*=== CM_MULT ROUTINE ===*/ - - -void cm_mult(ARGS) - -{ - int i; /* generic loop counter index */ - int size; /* number of input ports */ - - double accumulate_gain; /* product of all the gains */ - double accumulate_in; /* product of all (inputs + offsets) */ - double final_gain; /* output gain */ - - Mif_Complex_t ac_gain; - - - size = PORT_SIZE(in); /* Note that port size */ - final_gain = PARAM(out_gain); /* and out_gain are read only */ - /* once...saves access time. */ - - - /* Calculate multiplication of inputs and gains for */ - /* all types of analyes.... */ - - accumulate_gain = 1.0; - accumulate_in = 1.0; - - for (i=0; i -#include -#include - -static double -get_smallest_input( ARGS ) -{ - double smallest = INPUT(in[0]); - int size = PORT_SIZE(in); - int i; - - for ( i = 1; i < size; i++ ) - if ( INPUT(in[i]) < smallest ) smallest = INPUT(in[i]); - - return smallest; -} - -static double -get_largest_input( ARGS ) -{ - double largest = INPUT(in[0]); - int size = PORT_SIZE(in); - int i; - - for ( i = 1; i < size; i++ ) - if ( INPUT(in[i]) > largest ) largest = INPUT(in[i]); - - return largest; -} - -static double -get_slope( ARGS, int i ) -{ - return ( PARAM(y[i]) - PARAM(y[i-1]) )/( PARAM(x[i]) - PARAM(x[i-1]) ); -} - -static double -y_intercept( ARGS, int i, double slope ) -{ - return ( PARAM(y[i]) - slope*PARAM(x[i]) ); -} - -static double -get_output( ARGS, double x ) -{ - int size = PARAM_SIZE(x); - double result = 0; - double slope = 0; - int i; - - /* check if x beyond specified limits */ - if ( x <= PARAM(x[0]) ) return PARAM(y[0]); - if ( x >= PARAM(x[size-1]) ) return PARAM(y[size-1]); - - for ( i = 1; i < size; i++ ) - if ( x > PARAM(x[i-1]) && x <= PARAM(x[i]) ) - { - slope = get_slope( mif_private, i ); - result = slope*x + y_intercept( mif_private, i, slope ); - break; - } - return result; -} - -void -cm_multi_input_pwl(ARGS) -{ - const char* model = ( PARAM_NULL(model) == 1 ) ? "and" : PARAM(model); - double output; - - if ( ANALYSIS == TRANSIENT || ANALYSIS == DC ) - { - if ( strcmp( model, "and" ) != 0 && strcmp( model, "or" ) != 0 && - strcmp( model, "nand" ) != 0 && strcmp( model, "nor" ) != 0 ) - { - fprintf( stderr, "ERROR(cm_multi_input_pwl): unknown gate model type '%s'; expecting 'and|or|nand|nor'.\n", model ); - exit(-1); - } - if ( PARAM_SIZE(x) != PARAM_SIZE(y) ) - { - fprintf( stderr, "ERROR(cm_multi_input_pwl): 'x' and 'y' input vectors are not the same size!\n" ); - exit(-1); - } - /* - Iterate through each input and find output value - and/nand: controlling input is chosen on the basis of the smallest value - or/nor: controlling input is chosen on the basis of the largest value - */ - if (strstr(model, "and")) output = get_output(mif_private, get_smallest_input(mif_private)); - else output = get_output(mif_private, get_largest_input(mif_private)); - - OUTPUT(out) = output; - } -} diff --git a/src/xspice/icm/analog/multi_input_pwl/ifspec.ifs b/src/xspice/icm/analog/multi_input_pwl/ifspec.ifs deleted file mode 100644 index c87b0e471..000000000 --- a/src/xspice/icm/analog/multi_input_pwl/ifspec.ifs +++ /dev/null @@ -1,51 +0,0 @@ -/*.......1.........2.........3.........4.........5.........6.........7.........8 -================================================================================ - -------------------------------------------------------------------------- - Copyright 2005 - Intrinsity, Inc. Austin, TX 78738 - All Rights Reserved - 3 - Clause BSD license - (see COPYING or https://opensource.org/licenses/BSD-3-Clause) -------------------------------------------------------------------------- - -AUTHORS - - 20 Oct 2005 Phil Barker - -SUMMARY - - This file contains the interface specification file for the - analog multi-input gate pwl code model. - -===============================================================================*/ - -NAME_TABLE: - -C_Function_Name: cm_multi_input_pwl -Spice_Model_Name: multi_input_pwl -Description: "multi_input_pwl block" - - -PORT_TABLE: - -Port_Name: in out -Description: "input array" "output" -Direction: in out -Default_Type: vd vd -Allowed_Types: [vd,id] [vd,id] -Vector: yes no -Vector_Bounds: [2 -] - -Null_Allowed: no no - - -PARAMETER_TABLE: - -Parameter_Name: x y model -Description: "x array" "y array" "model type" -Data_Type: real real string -Default_Value: 0.0 0.0 "and" -Limits: - - - -Vector: yes yes no -Vector_Bounds: [2 -] [2 -] - -Null_Allowed: no no yes diff --git a/src/xspice/icm/analog/oneshot/cfunc.mod b/src/xspice/icm/analog/oneshot/cfunc.mod deleted file mode 100644 index a3e67252a..000000000 --- a/src/xspice/icm/analog/oneshot/cfunc.mod +++ /dev/null @@ -1,564 +0,0 @@ -/*.......1.........2.........3.........4.........5.........6.........7.........8 -================================================================================ - -FILE oneshot/cfunc.mod - -Public Domain - -Georgia Tech Research Corporation -Atlanta, Georgia 30332 -PROJECT A-8503-405 - - -AUTHORS - - 20 Mar 1991 Harry Li - - -MODIFICATIONS - - 17 Sep 1991 Jeffrey P. Murray - 2 Oct 1991 Jeffrey P. Murray - 9 Sep 2012 Holger Vogt - -SUMMARY - - This file contains the model-specific routines used to - functionally describe the oneshot code model. - - -INTERFACES - - FILE ROUTINE CALLED - - CMmacros.h cm_message_send(); - - CM.c void *cm_analog_alloc() - void *cm_analog_get_ptr() - int cm_analog_set_temp_bkpt() - -REFERENCED FILES - - Inputs from and outputs to ARGS structure. - - -NON-STANDARD FEATURES - - NONE - -===============================================================================*/ - -/*=== INCLUDE FILES ====================*/ - -#include "oneshot.h" -#include - - - -/*=== CONSTANTS ========================*/ - - - - -/*=== MACROS ===========================*/ - - - - -/*=== LOCAL VARIABLES & TYPEDEFS =======*/ - - -typedef struct { - - double *control; /* the storage array for the - control vector (cntl_array) */ - - double *pw; /* the storage array for the - pulse width array (pw_array) */ - - int tran_init; /* for initialization of old_clock) */ - -} Local_Data_t; - - - -/*=== FUNCTION PROTOTYPE DEFINITIONS ===*/ - - - -static void -oneshot_callback(ARGS, Mif_Callback_Reason_t reason) -{ - switch (reason) { - case MIF_CB_DESTROY: { - Local_Data_t *loc = STATIC_VAR (locdata); - if (loc) { - free(loc); - STATIC_VAR (locdata) = NULL; - } - break; - } - } -} - - -/*============================================================================== - -FUNCTION void cm_oneshot() - -AUTHORS - - 20 Mar 1991 Harry Li - - -MODIFICATIONS - - 17 Sep 1991 Jeffrey P. Murray - 2 Oct 1991 Jeffrey P. Murray - 9 Sep 2012 Holger Vogt - -SUMMARY - - This function implements the oneshot code model. - -INTERFACES - - FILE ROUTINE CALLED - - CMmacros.h cm_message_send(); - - CM.c void *cm_analog_alloc() - void *cm_analog_get_ptr() - int cm_analog_set_temp_bkpt() - -RETURNED VALUE - - Returns inputs and outputs via ARGS structure. - -GLOBAL VARIABLES - - NONE - -NON-STANDARD FEATURES - - NONE - -==============================================================================*/ - -/*=== CM_ONESHOT ROUTINE ===*/ - -/*************************************************************************************** -* -* This model describes a totally analog oneshot. -* After a rising edge is detected, the model will -* output a pulse width specified by the controling -* voltage. -* HWL 20Mar91 -* -* -* -* ___________________________________ -* /<---pulse width ---> :\ -* / : : : \ -* <---rise_delay--> / : :<-fall_delay->: \ -* ___|________________/ : : : \____________ -* ^ <-->: : :<--> -* Trigger Risetime Falltime -* -* -****************************************************************************************/ - -#include - -void cm_oneshot(ARGS) /* structure holding parms, - inputs, outputs, etc. */ -{ - int i; /* generic loop counter index */ - int *locked; /* pointer used to store the locked1 variable */ - int locked1; /* flag which allows the time points to be - reset. value determined by retrig parameter */ - int cntl_size; /* size of the control array */ - int pw_size; /* size of the pulse-width array */ - int *state; /* pointer used to store state1 variable */ - int state1; /* if state1 = 1, then oneshot has - been triggered. if state1 = 0, no change */ - int *set; /* pointer used to store the state of set1 */ - int set1; /* flag used to set/reset the oneshot */ - int trig_pos_edge; /* flag used to define positive or negative - edge triggering. 1=positive, 0=negative */ - - double *x; /* pointer used to store the control array */ - double *y; /* pointer used to store the pulse-width array */ - double cntl_input; /* the actual value of the control input */ - /*double out;*/ /* value of the output */ - double dout_din; /* slope of the pw wrt the control voltage */ - double output_low; /* output low value */ - double output_hi; /* output high value */ - double pw=0.0; /* actual value of the pulse-width */ - /* double del_out; value of the delay time between triggering - and a change in the output */ - double del_rise; /* value of the delay time between triggering - and a change in the output */ - double del_fall; /* value of the delay time between the end of the - pw and a change in the output */ - double *t1; /* pointer used to store time1 */ - double *t2; /* pointer used to store time2 */ - double *t3; /* pointer used to store time3 */ - double *t4; /* pointer used to store time4 */ - double time1; /* time at which the output first begins to - change (trigger + delay) */ - double time2; /* time2 = time1 + risetime */ - double time3; /* time3 = time2 + pw */ - double time4; /* time4 = time3 + falltime */ - double t_rise; /* risetime */ - double t_fall; /* falltime */ - double *output_old;/* pointer which stores the previous output */ - double *clock; /* pointer which stores the clock */ - double *old_clock; /* pointer which stores the previous clock */ - double trig_clk; /* value at which the clock triggers the oneshot */ - - Mif_Complex_t ac_gain; - - Local_Data_t *loc; /* Pointer to local static data, not to be included - in the state vector */ - - /**** Retrieve frequently used parameters... ****/ - - cntl_size = PARAM_SIZE(cntl_array); - pw_size = PARAM_SIZE(pw_array); - trig_clk = PARAM(clk_trig); - trig_pos_edge = PARAM(pos_edge_trig); - output_low = PARAM(out_low); - output_hi = PARAM(out_high); - /*del_out = PARAM(delay);*/ - del_rise = PARAM(rise_delay); - del_fall = PARAM(fall_delay); - t_rise = PARAM(rise_time); - t_fall = PARAM(fall_time); - - /* set minimum rise and fall_times */ - - if(t_rise < 1e-12) { - t_rise = 1e-12; - } - - if(t_fall < 1e-12) { - t_fall = 1e-12; - } - - /* the control array must be the same size as the pulse-width array */ - - if(cntl_size != pw_size) { - cm_message_send(oneshot_array_error); - return; - } - - if(INIT == 1) { /* first time through, allocate memory */ - - cm_analog_alloc(T1,sizeof(double)); - cm_analog_alloc(T2,sizeof(double)); - cm_analog_alloc(T3,sizeof(double)); - cm_analog_alloc(T4,sizeof(double)); - cm_analog_alloc(SET,sizeof(int)); - cm_analog_alloc(STATE,sizeof(int)); - cm_analog_alloc(CLOCK,sizeof(double)); - cm_analog_alloc(LOCKED,sizeof(int)); - cm_analog_alloc(OUTPUT_OLD,sizeof(double)); - - /*** allocate static storage for *loc ***/ - STATIC_VAR (locdata) = calloc (1 , sizeof ( Local_Data_t )); - loc = STATIC_VAR (locdata); - CALLBACK = oneshot_callback; - - /* Allocate storage for breakpoint domain & pulse width values */ - x = loc->control = (double *) calloc((size_t) cntl_size, sizeof(double)); - if (!x) { - cm_message_send(oneshot_allocation_error); - return; - } - y = loc->pw = (double *) calloc((size_t) pw_size, sizeof(double)); - if (!y) { - cm_message_send(oneshot_allocation_error); - return; - } - - loc->tran_init = FALSE; - - } - - if(ANALYSIS == MIF_DC) { - - /* for DC, initialize values and set the output = output_low */ - - t1 = (double *) cm_analog_get_ptr(T1,0); - t2 = (double *) cm_analog_get_ptr(T2,0); - t3 = (double *) cm_analog_get_ptr(T3,0); - t4 = (double *) cm_analog_get_ptr(T4,0); - set = (int *) cm_analog_get_ptr(SET,0); - state = (int *) cm_analog_get_ptr(STATE,0); - locked = (int *) cm_analog_get_ptr(LOCKED,0); - output_old = (double *) cm_analog_get_ptr(OUTPUT_OLD,0); - - /* initialize time and state values */ - *t1 = -1; - *t2 = -1; - *t3 = -1; - *t4 = -1; - *set = 0; - *locked = 0; - *state = 0; - *output_old = output_low; - - OUTPUT(out) = output_low; - if(PORT_NULL(cntl_in) != 1) { - PARTIAL(out,cntl_in) = 0; - } - if(PORT_NULL(clear) != 1) { - PARTIAL(out,clear) = 0; - } - PARTIAL(out,clk) = 0; - - } else if(ANALYSIS == MIF_TRAN) { - - /* retrieve previous values, set them equal to the variables - Note that these pointer values are immediately dumped into - other variables because the previous values can't change- - can't rewrite the old values */ - - t1 = (double *) cm_analog_get_ptr(T1,1); - t2 = (double *) cm_analog_get_ptr(T2,1); - t3 = (double *) cm_analog_get_ptr(T3,1); - t4 = (double *) cm_analog_get_ptr(T4,1); - set = (int*) cm_analog_get_ptr(SET,1); - state = (int *) cm_analog_get_ptr(STATE,1); - locked = (int *) cm_analog_get_ptr(LOCKED,1); - clock = (double *) cm_analog_get_ptr(CLOCK,0); - old_clock = (double *) cm_analog_get_ptr(CLOCK,1); - output_old = (double *) cm_analog_get_ptr(OUTPUT_OLD,1); - - time1 = *t1; - time2 = *t2; - time3 = *t3; - time4 = *t4; - set1 = *set; - state1 = *state; - locked1 = *locked; - - if((PORT_NULL(clear) != 1) && (INPUT(clear) > trig_clk)) { - time1 = -1; - time2 = -1; - time3 = -1; - time4 = -1; - set1 = 0; - locked1 = 0; - state1 = 0; - - OUTPUT(out) = output_low; - } else { - loc = STATIC_VAR (locdata); - x = loc->control; - y = loc->pw; - - if (!loc->tran_init) { - *old_clock = 0.0; - loc->tran_init = TRUE; - } - - /* Retrieve control and pulse-width values. */ - for (i=0; i= x[cntl_size-1]) { - dout_din = (y[cntl_size-1] - y[cntl_size-2]) / - (x[cntl_size-1] - x[cntl_size-2]); - pw = y[cntl_size-1] + (cntl_input - x[cntl_size-1]) * dout_din; - - } else { - /*** cntl_input within bounds of end midpoints... - must determine position progressively & then - calculate required output. ***/ - - for (i=0; i= x[i])) { - /* Interpolate to get the correct pulse width value */ - pw = ((cntl_input - x[i])/(x[i+1] - x[i]))* - (y[i+1]-y[i]) + y[i]; - } - } - } - - if(trig_pos_edge) { /* for a positive edge trigger */ - - if(!set1) { - /* if set1=0, then look for - 1. a rising edge trigger - 2. the clock to be higher than the trigger value */ - - if((*clock > *old_clock) && (*clock > trig_clk)) { - state1 = 1; - set1 = 1; - } - - } else - /* look for a neg edge before resetting the trigger */ - if((*clock < *old_clock) && (*clock < trig_clk)) { - set1 = 0; - } - } else { - /* This stuff belongs to the case where a negative edge - is needed */ - - if(!set1) { - if((*clock < *old_clock) && (*clock < trig_clk)) { - state1 = 1; - set1 = 1; - } - } else - /* look for a pos edge before resetting the trigger */ - if((*clock > *old_clock) && (*clock > trig_clk)) { - set1 = 0; - } - } - - - /* I can only set the breakpoints if the state1 is high and - the output is low, and locked = 0 */ - if((state1) && (*output_old - output_low < 1e-20) && (!locked1)) { - - /* if state1 is 1, and the output is low, then set the time points - and the temporary breakpoints */ - - time1 = TIME + del_rise; - time2 = time1 + t_rise; - time3 = time2 + pw + del_fall; - time4 = time3 + t_fall; - - if(PARAM(retrig) == MIF_FALSE) { - locked1 = 1; - } - - if((TIME < time1) || (T(1) == 0)) { - cm_analog_set_perm_bkpt(time1); - } - - cm_analog_set_perm_bkpt(time2); - cm_analog_set_perm_bkpt(time3); - cm_analog_set_perm_bkpt(time4); - - /* reset the state value */ - state1 = 0; - OUTPUT(out) = output_low; - - } else - - /* state1 = 1, and the output is high, then just set time3 and time4. - Temporary breakpoints don't do for now, so use permanent breakpoints. - This implies that the oneshot was retriggered */ - - if((state1) && (*output_old - output_hi < 1e-20) && (!locked1)) { - - time3 = TIME + pw + del_rise + del_fall + t_rise; - time4 = time3 + t_fall; - - cm_analog_set_perm_bkpt(time3); - cm_analog_set_perm_bkpt(time4); - - OUTPUT(out) = output_hi; - - state1 = 0; - } - - /* reset the state if it's 1 and the locked flag is 1. This - means that the clock tried to retrigger the oneshot, but - the retrig flag prevented it from doing so */ - - if((state1) && (locked1)) { - state1 = 0; - - } - /* set the value for the output depending on the current time, and - the values of time1, time2, time3, and time4 */ - if(TIME < time1) { - OUTPUT(out) = output_low; - } else if((time1 <= TIME) && (TIME < time2)) { - OUTPUT(out) = output_low + ((TIME - time1)/(time2 - time1))* - (output_hi - output_low); - } else if((time2 <= TIME) && (TIME < time3)) { - - OUTPUT(out) = output_hi; - - } else if((time3 <= TIME) && (TIME < time4)) { - - OUTPUT(out) = output_hi + ((TIME - time3)/(time4 - time3))* - (output_low - output_hi); - - } else { - OUTPUT(out) = output_low; - - /* oneshot can now be retriggered, set locked to 0 */ - if(PARAM(retrig) == MIF_FALSE) { - locked1 = 0; - } - } - } - /* set the variables which need to be stored for the next iteration */ - - t1 = (double *) cm_analog_get_ptr(T1,0); - t2 = (double *) cm_analog_get_ptr(T2,0); - t3 = (double *) cm_analog_get_ptr(T3,0); - t4 = (double *) cm_analog_get_ptr(T4,0); - set = (int *) cm_analog_get_ptr(SET,0); - locked = (int *) cm_analog_get_ptr(LOCKED,0); - state = (int *) cm_analog_get_ptr(STATE,0); - output_old = (double *) cm_analog_get_ptr(OUTPUT_OLD,0); - - *t1 = time1; - *t2 = time2; - *t3 = time3; - *t4 = time4; - *set = set1; - *state = state1; - *output_old = OUTPUT(out); - *locked = locked1; - - if(PORT_NULL(cntl_in) != 1) { - PARTIAL(out,cntl_in) = 0; - } - if(PORT_NULL(clear) != 1) { - PARTIAL(out,clear) = 0; - } - PARTIAL(out,clk) = 0 ; - - } else { /* Output AC Gain */ - - /* This model has no AC capability */ - - ac_gain.real = 0.0; - ac_gain.imag= 0.0; - AC_GAIN(out,clk) = ac_gain; - } -} - diff --git a/src/xspice/icm/analog/oneshot/ifspec.ifs b/src/xspice/icm/analog/oneshot/ifspec.ifs deleted file mode 100644 index b56ac2aa4..000000000 --- a/src/xspice/icm/analog/oneshot/ifspec.ifs +++ /dev/null @@ -1,124 +0,0 @@ -/*.......1.........2.........3.........4.........5.........6.........7.........8 -================================================================================ -Public Domain - -Georgia Tech Research Corporation -Atlanta, Georgia 30332 - - -AUTHORS - - 20 Mar 1991 Harry Li - - -SUMMARY - - This file contains the interface specification file for the - analog oneshot code model. - -===============================================================================*/ - -NAME_TABLE: - - -C_Function_Name: cm_oneshot -Spice_Model_Name: oneshot -Description: "one-shot" - - -PORT_TABLE: - -Port_Name: clk cntl_in -Description: "clock input" "input" -Direction: in in -Default_Type: v v -Allowed_Types: [v,vd,vnam,i,id] [v,vnam,vd,i,id] -Vector: no no -Vector_Bounds: - - -Null_Allowed: no yes - -PORT_TABLE: - -Port_Name: clear out -Description: "clear signal" "output" -Direction: in out -Default_Type: v v -Allowed_Types: [v,vd,vnam,i,id] [v,vd,i,id] -Vector: no no -Vector_Bounds: - - -Null_Allowed: yes no - -PARAMETER_TABLE: - -Parameter_Name: cntl_array pw_array -Description: "control in array" "pulse width array" -Data_Type: real real -Default_Value: 0.0 1.0e-6 -Limits: - [0 -] -Vector: yes yes -Vector_Bounds: [2 -] [2 -] -Null_Allowed: no no - - -PARAMETER_TABLE: - -Parameter_Name: clk_trig pos_edge_trig -Description: "clock trigger value" "pos/neg edge trigger switch" -Data_Type: real boolean -Default_Value: 0.5 TRUE -Limits: - - -Vector: no no -Vector_Bounds: - - -Null_Allowed: no no - - -PARAMETER_TABLE: - -Parameter_Name: out_low out_high -Description: "output low value" "output high value" -Data_Type: real real -Default_Value: 0.0 1.0 -Limits: - - -Vector: no no -Vector_Bounds: - - -Null_Allowed: yes yes - -PARAMETER_TABLE: - -Parameter_Name: rise_time -Description: "output rise time" -Data_Type: real -Default_Value: 1.0e-9 -Limits: - -Vector: no -Vector_Bounds: - -Null_Allowed: yes - -PARAMETER_TABLE: - -Parameter_Name: rise_delay fall_delay -Description: "output delay from trigger" "output delay from pw" -Data_Type: real real -Default_Value: 1.0e-9 1.0e-9 -Limits: - - -Vector: no no -Vector_Bounds: - - -Null_Allowed: yes yes - -PARAMETER_TABLE: - -Parameter_Name: fall_time retrig -Description: "output rise time" "retrigger switch" -Data_Type: real boolean -Default_Value: 1.0e-9 FALSE -Limits: - - -Vector: no no -Vector_Bounds: - - -Null_Allowed: yes yes - - -STATIC_VAR_TABLE: - -Static_Var_Name: locdata -Description: "local static data" -Data_Type: pointer diff --git a/src/xspice/icm/analog/oneshot/oneshot.h b/src/xspice/icm/analog/oneshot/oneshot.h deleted file mode 100644 index a16f474b3..000000000 --- a/src/xspice/icm/analog/oneshot/oneshot.h +++ /dev/null @@ -1,43 +0,0 @@ -/************************************************/ -/****** Structures, etc. for pwl model. ******/ -/****** 10/10/90 JPM ******/ -/************************************************/ - - - -/**** Error Messages ****/ - -char *oneshot_allocation_error = "\n**** Error ****\nONESHOT: Error allocating oneshot block storage \n"; -char *oneshot_array_error = "\n**** Error ****\nONESHOT: Size of control array different than pulse-width array \n"; -char *oneshot_pw_clamp = "\n**** Warning ****\nONESHOT: Extrapolated Pulse-Width Limited to zero \n"; - - -#define T1 1 -#define T2 2 -#define T3 3 -#define T4 4 -#define SET 5 -#define STATE 6 -#define CLOCK 7 -#define OUTPUT_OLD 8 -#define LOCKED 9 - -/***** Define Error Messages **************************************/ - - - - - - -/***** Structure Definitions *************************************/ - - - - - - -/***** Function Definitions ***************************************/ - - - - diff --git a/src/xspice/icm/analog/pwl/cfunc.mod b/src/xspice/icm/analog/pwl/cfunc.mod deleted file mode 100644 index 855859a1d..000000000 --- a/src/xspice/icm/analog/pwl/cfunc.mod +++ /dev/null @@ -1,572 +0,0 @@ -/*.......1.........2.........3.........4.........5.........6.........7.........8 -================================================================================ - -FILE pwl/cfunc.mod - -Public Domain - -Georgia Tech Research Corporation -Atlanta, Georgia 30332 -PROJECT A-8503-405 - - -AUTHORS - - 19 Apr 1991 Jeffrey P. Murray - - -MODIFICATIONS - - 25 Sep 1991 Jeffrey P. Murray - 2 Oct 1991 Jeffrey P. Murray - 1 Nov 2020 Holger Vogt - -SUMMARY - - This file contains the model-specific routines used to - functionally describe the pwl (piece-wise linear) code model. - - -INTERFACES - - FILE ROUTINE CALLED - - CMutil.c void cm_smooth_corner(); - - CMmacros.h cm_message_send(); - - CM.c void cm_analog_not_converged() - - -REFERENCED FILES - - Inputs from and outputs to ARGS structure. - - -NON-STANDARD FEATURES - - NONE - -===============================================================================*/ - -/*=== INCLUDE FILES ====================*/ - -#include - - - -/*=== CONSTANTS ========================*/ - -#define FRACTION 0.30 -#define EPSILON 1.0e-9 - - - -/*=== MACROS ===========================*/ - - - - -/*=== LOCAL VARIABLES & TYPEDEFS =======*/ - - - - -/*=== FUNCTION PROTOTYPE DEFINITIONS ===*/ - - - - - -/*============================================================================== - -FUNCTION double limit_x_value() - -AUTHORS - - 25 Sep 1991 Jeffrey P. Murray - - -MODIFICATIONS - - 2 Oct 1991 Jeffrey P. Murray - -SUMMARY - - Limits a passed input value to some fraction - of the segment length defined by - (x_upper - x_lower). The fractional value in - question is passed as a value to the routine - (fraction). - - -INTERFACES - - FILE ROUTINE CALLED - - CM.c void cm_analog_not_converged() - - -RETURNED VALUE - - Returns a double. - -GLOBAL VARIABLES - - NONE - -NON-STANDARD FEATURES - - NONE - -==============================================================================*/ - -#include - -/*=== Static LIMIT_X_VALUE ROUTINE ================*/ - -/** limit_x_value ******************************************/ -/** **/ -/** Limits a passed input value to some fraction **/ -/** of the segment length defined by **/ -/** (x_upper - x_lower). The fractional value in **/ -/** question is passed as a value to the routine **/ -/** (fraction). **/ -/** **/ -/** 9/25/91 JPM **/ -/***********************************************************/ - -static double limit_x_value(double x_lower,double x_upper, - double x_input,double fraction, - double *last_x_value) -{ - double max_x_delta, /* maximum delta value permissible for - this segment domain. */ - hold; /* Holding variable for previous x_input value */ - - - /** Limit effective change of input to fraction of value of lowest **/ - /** x-segment length... **/ - - /* calculate maximum delta value for this region */ - max_x_delta = fraction * (x_upper - x_lower); - - /* Test new input */ - if ( max_x_delta < fabs(x_input - *last_x_value) ) { - - hold = x_input; - - /* Assign new x_input based of direction of movement */ - /* since last iteration call */ - if ( 0.0 <= (x_input - *last_x_value) ) { - x_input = *last_x_value = *last_x_value + max_x_delta; - } - else { - x_input = *last_x_value = *last_x_value - max_x_delta; - } - - /* Alert the simulator to non-convergence */ - cm_analog_not_converged(); - - /*** Debugging printf statement ***/ - /* printf("Assigning new x_input...\nPrevious value=%e, New value=%e\n\n", - hold,x_input); - */ - - } - else { /* No limiting of x_input required */ - *last_x_value = x_input; - } - - return x_input; - -} - -/*============================================================================== - -FUNCTION void cm_pwl(> - -AUTHORS - - 19 Apr 1991 Jeffrey P. Murray - -MODIFICATIONS - - 25 Sep 1991 Jeffrey P. Murray - 2 Oct 1991 Jeffrey P. Murray - -SUMMARY - - This function implements the pwl code model. - -INTERFACES - - FILE ROUTINE CALLED - - CMutil.c void cm_smooth_corner(); - - CMmacros.h cm_message_send(); - - CM.c void cm_analog_not_converged() - - -RETURNED VALUE - - Returns inputs and outputs via ARGS structure. - -GLOBAL VARIABLES - - NONE - -NON-STANDARD FEATURES - - NONE - -==============================================================================*/ - -static void -cm_pwl_callback(ARGS, Mif_Callback_Reason_t reason) -{ - switch (reason) { - case MIF_CB_DESTROY: { - double *last_x_value = STATIC_VAR (last_x_value); - double *x = STATIC_VAR (x); - double *y = STATIC_VAR (y); - if (last_x_value) - free(last_x_value); - if (x) - free(x); - if (y) - free(y); - STATIC_VAR (last_x_value) = NULL; - STATIC_VAR (x) = NULL; - STATIC_VAR (y) = NULL; - break; - } - } -} - -/*=== CM_PWL ROUTINE ================*/ - -void cm_pwl(ARGS) /* structure holding parms, - inputs, outputs, etc. */ -{ - int i; /* generic loop counter index */ - int size; /* size of the x_array */ - - double input_domain; /* smoothing range */ - double *x; /* pointer to the x-coordinate array */ - double *y; /* pointer to the y-coordinate array */ - double lower_seg; /* x segment below which input resides */ - double upper_seg; /* x segment above which the input resides */ - double lower_slope; /* slope of the lower segment */ - double upper_slope; /* slope of the upper segment */ - double x_input; /* input */ - double out = 0.0; /* output - * Init to 0 to suppress compiler warning */ - double dout_din = 0.0; /* partial derivative of the output wrt input. - * Init to 0 to suppress compiler warning */ - double threshold_lower; /* value below which the output begins smoothing */ - double threshold_upper; /* value above which the output begins smoothing */ - double test1; /* debug testing value */ - double test2; /* debug testing value */ - double *last_x_value; /* static variable for limiting */ - double test; /* temp storage variable for limit testing */ - - Mif_Complex_t ac_gain; - - CALLBACK = cm_pwl_callback; - - char *allocation_error="\n***ERROR***\nPWL: Allocation calloc failed!\n"; - char *limit_error="\n***ERROR***\nPWL: Violation of 50% rule in breakpoints!\n"; - - /* Retrieve frequently used parameters... */ - - input_domain = PARAM(input_domain); - - /* size including space for two additional x,y pairs */ - size = PARAM_SIZE(x_array) + 2; - - - /* First pass: - Allocate storage for previous value. - Allocate storage for x an y input arrays - Read input array and store from - Add additional x,y pair at beginning and end of x, y arrays: - */ - if (INIT==1) { - - /* Allocate storage for last_x_value */ - STATIC_VAR(last_x_value) = (double *) malloc(sizeof(double)); - last_x_value = (double *) STATIC_VAR(last_x_value); - - /* Allocate storage for breakpoint domain & range values */ - STATIC_VAR(x) = (double *) calloc((size_t) size, sizeof(double)); - x = (double *) STATIC_VAR(x); - if (!x) { - cm_message_send(allocation_error); - } - - STATIC_VAR(y) = (double *) calloc((size_t) size, sizeof(double)); - y = (double *) STATIC_VAR(y); - if (!y) { - cm_message_send(allocation_error); - } - - /* Retrieve x and y values. */ - for (i=1; i (x[1] - x[0]) ) { - test = limit_x_value(x_input,x[0],x_input,FRACTION,last_x_value); - } - else { - test = limit_x_value(x[0],x[1],x_input,FRACTION,last_x_value); - } - - /* If the test value is greater than x[0], force to x[0] */ - if ( test >= x[0] ) { - x_input = *last_x_value = x[0]; - - /* Alert the simulator to non-convergence */ - cm_analog_not_converged(); - } - else { - x_input = *last_x_value = test; - } - } - else - if ( *last_x_value >= x[size-1] ) { /** Non-Limited input greater than x[size-1] **/ - - /* Obtain the test value of the input, if it has changed excessively */ - if ( (x_input - x[size-1]) > (x[size-1] - x[size-2]) ) { - test = limit_x_value(x[size-1],x_input,x_input,FRACTION,last_x_value); - } - else { - test = limit_x_value(x[size-2],x[size-1],x_input,FRACTION,last_x_value); - } - - /* If the test value is less than x[size-1], force to x[size-1] */ - /* minus some epsilon value. */ - if ( test < x[size-1] ) { - x_input = *last_x_value = x[size-1] - EPSILON; - - /* Alert the simulator to non-convergence */ - cm_analog_not_converged(); - } - else { - x_input = *last_x_value = test; - } - } - else { - for (i=1; i x[i] ) { - x_input = *last_x_value = x[i]; - - /* Alert the simulator to non-convergence */ - cm_analog_not_converged(); - - break; - } - else - /* If the test value is less than x[i-1], force to x[i-1] */ - /* minus some epsilon value... */ - if ( test < x[i-1] ) { - x_input = *last_x_value = x[i-1] - EPSILON; - - /* Alert the simulator to non-convergence */ - cm_analog_not_converged(); - - break; - } - else { /* Use returned value for next input */ - x_input = *last_x_value = test; - break; - } - } - } - } - - /* Assign new limited value back to the input for */ - /* use in the matrix calculations.... */ - INPUT(in) = x_input; - - - /*** Add debugging printf statement ***/ - /* printf("Limited x_input=%e\n\n", - x_input); - */ - - - /**** End internal limiting ****/ - - - - /* Determine segment boundaries within which x_input resides */ - - if (x_input <= (x[0] + x[1])/2.0) {/*** x_input below lowest midpoint ***/ - dout_din = (y[1] - y[0])/(x[1] - x[0]); - - - /* Compute new output */ - out = y[0] + (x_input - x[0]) * dout_din; - - } - else { - if (x_input >= (x[size-2] + x[size-1])/2.0) { - /*** x_input above highest midpoint ***/ - dout_din = (y[size-1] - y[size-2]) / - (x[size-1] - x[size-2]); - - out = y[size-1] + (x_input - x[size-1]) * dout_din; - } - else { /*** x_input within bounds of end midpoints... ***/ - /*** must determine position progressively & then ***/ - /*** calculate required output. ***/ - - for (i=1; i - - - -/*=== CONSTANTS ========================*/ - -#define FRACTION 0.30 -#define EPSILON 1.0e-9 - - - -/*=== MACROS ===========================*/ - - - - -/*=== LOCAL VARIABLES & TYPEDEFS =======*/ - - - - -/*=== FUNCTION PROTOTYPE DEFINITIONS ===*/ - - - -#include - - -/*============================================================================== - -FUNCTION void cm_pwlts - -AUTHORS - - 9 Sep 2022 Holger Vogt - -MODIFICATIONS - - -SUMMARY - - This function implements the pwlts code model. - -INTERFACES - - FILE ROUTINE CALLED - - CMutil.c void cm_smooth_corner(); - - CMmacros.h cm_message_send(); - - -RETURNED VALUE - - Returns outputs via ARGS structure. - -GLOBAL VARIABLES - - NONE - -NON-STANDARD FEATURES - - NONE - -==============================================================================*/ - -static void -cm_pwlts_callback(ARGS, Mif_Callback_Reason_t reason) -{ - switch (reason) { - case MIF_CB_DESTROY: { - double *last_x_value = STATIC_VAR (last_x_value); - double *x = STATIC_VAR (x); - double *y = STATIC_VAR (y); - if (last_x_value) - free(last_x_value); - if (x) - free(x); - if (y) - free(y); - STATIC_VAR (last_x_value) = NULL; - STATIC_VAR (x) = NULL; - STATIC_VAR (y) = NULL; - break; - } - } -} - -/*=== CM_PWLTS ROUTINE ================*/ - -void cm_pwlts(ARGS) /* structure holding parms, - inputs, outputs, etc. */ -{ - int i; /* generic loop counter index */ - int size; /* size of the x_array */ - - double input_domain; /* smoothing range */ - double *x; /* pointer to the x-coordinate array */ - double *y; /* pointer to the y-coordinate array */ - double lower_seg; /* x segment below which input resides */ - double upper_seg; /* x segment above which the input resides */ - double lower_slope; /* slope of the lower segment */ - double upper_slope; /* slope of the upper segment */ - double x_input; /* input */ - double out = 0.0; /* output - * Init to 0 to suppress compiler warning */ - double dout_din = 0.0; /* partial derivative of the output wrt input. - * Init to 0 to suppress compiler warning */ - double threshold_lower; /* value below which the output begins smoothing */ - double threshold_upper; /* value above which the output begins smoothing */ - double test1; /* debug testing value */ - double test2; /* debug testing value */ - double *last_x_value; /* static variable for limiting */ - double test; /* temp storage variable for limit testing */ - - Mif_Complex_t ac_gain; - - CALLBACK = cm_pwlts_callback; - - char *allocation_error="\n***ERROR***\nPWL: Allocation calloc failed!\n"; - char *limit_error="\n***ERROR***\nPWL: Violation of 50% rule in breakpoints!\n"; - - /* Retrieve frequently used parameters... */ - - input_domain = PARAM(input_domain); - - /* size including space for two additional x,y pairs */ - size = PARAM_SIZE(x_array) + 2; - - - /* First pass: - Allocate storage for previous value. - Allocate storage for x an y input arrays - Read input array and store from - Add additional x,y pair at beginning and end of x, y arrays: - */ - if (INIT==1) { - /* Allocate storage for last_x_value */ - STATIC_VAR(last_x_value) = (double *) malloc(sizeof(double)); - last_x_value = (double *) STATIC_VAR(last_x_value); - - /* Allocate storage for breakpoint domain & range values */ - STATIC_VAR(x) = (double *) calloc((size_t) size, sizeof(double)); - x = (double *) STATIC_VAR(x); - if (!x) { - cm_message_send(allocation_error); - } - - STATIC_VAR(y) = (double *) calloc((size_t) size, sizeof(double)); - y = (double *) STATIC_VAR(y); - if (!y) { - cm_message_send(allocation_error); - } - - /* Retrieve x and y values. */ - for (i=1; i= (x[size-2] + x[size-1])/2.0) { - /*** x_input above highest midpoint ***/ - dout_din = (y[size-1] - y[size-2]) / - (x[size-1] - x[size-2]); - - out = y[size-1] + (x_input - x[size-1]) * dout_din; - } - else { /*** x_input within bounds of end midpoints... ***/ - /*** must determine position progressively & then ***/ - /*** calculate required output. ***/ - - for (i=1; i - - - -/*=== CONSTANTS ========================*/ - - - - - -/*=== MACROS ===========================*/ - - - - -/*=== LOCAL VARIABLES & TYPEDEFS =======*/ - - - - - -/*=== FUNCTION PROTOTYPE DEFINITIONS ===*/ - - - - - -/*============================================================================= - -FUNCTION cm_complex_div - -AUTHORS - - 27 Sept 1991 Jeffrey P. Murray - -MODIFICATIONS - - NONE - -SUMMARY - - Performs a complex division. - -INTERFACES - - FILE ROUTINE CALLED - - N/A N/A - - -RETURNED VALUE - - A Mif_Complex_t value representing the result of the complex division. - -GLOBAL VARIABLES - - NONE - -NON-STANDARD FEATURES - - NONE - -==============================================================================*/ -#include - -/*=== Static CM_COMPLEX_DIV ROUTINE ===*/ - -/**** Cm_complex_div Function - FAKE ***********/ -/* */ -/* Function will not be used in finished */ -/* system...provides a stub for performing */ -/* a simple complex division. */ -/* 12/3/90 JPM */ -/* */ -/***********************************************/ - -static Mif_Complex_t cm_complex_div(Mif_Complex_t x, Mif_Complex_t y) -{ -double mag_x, phase_x, mag_y, phase_y; - -Mif_Complex_t out; - -mag_x = hypot(x.real, x.imag); -phase_x = atan2(x.imag, x.real); - -mag_y = hypot(y.real, y.imag); -phase_y = atan2(y.imag, y.real); - -mag_x = mag_x/mag_y; -phase_x = phase_x - phase_y; - -out.real = mag_x * cos(phase_x); -out.imag = mag_x * sin(phase_x); - -return out; -} - - - -/*============================================================================== - -FUNCTION cm_s_xfer() - -AUTHORS - - 17 Mar 1991 Jeffrey P. Murray - -MODIFICATIONS - - 18 Apr 1991 Harry Li - 27 Sept 1991 Jeffrey P. Murray - -SUMMARY - - This function implements the s_xfer code model. - -INTERFACES - - FILE ROUTINE CALLED - - CMmacros.h cm_message_send(); - - CM.c void *cm_analog_alloc() - void *cm_analog_get_ptr() - int cm_analog_integrate() - -RETURNED VALUE - - Returns inputs and outputs via ARGS structure. - -GLOBAL VARIABLES - - NONE - -NON-STANDARD FEATURES - - NONE - -==============================================================================*/ - -/*=== CM_S_XFER ROUTINE ===*/ - -/**************************************** -* S-Domain Transfer Function - * -* Code Body * -* * -* Last Modified - 9/27/91 JPM * -****************************************/ - -void cm_s_xfer(ARGS) /* structure holding parms, inputs, outputs, etc. */ -{ - double *out; /* pointer to the output */ - double *in; /* pointer to the input */ - double in_offset; /* input offset */ - double *gain; /* pointer to the gain */ - double **den_coefficient; /* dynamic array that holds the denominator - coefficients */ - double **old_den_coefficient;/* dynamic array that holds the old - denonminator coefficients */ - double **num_coefficient; /* dynamic array that holds the numerator - coefficients */ - double **old_num_coefficient;/* dynamic array that holds the old numerator - coefficients */ - double factor; /* gain factor in case the highest - denominator coefficient is not 1 */ - double **integrator; /* outputs of the integrators */ - double **old_integrator; /* previous integrator outputs */ - double null; /* dummy pointer for use with the - integrate function */ - double pout_pin; /* partial out wrt in */ - /*double total_gain;*/ /* not used, currently-used with ITP stuff */ - double temp; /* temporary variable used with the - correct type of AC value */ - double frac; /* holds fractional part of a divide */ - double divide_integer; /* integer part of a modf used in AC */ - double denormalized_freq; /* denormalization constant...the nominal - corner or center frequencies specified - by the model coefficients will be - denormalized by this amount. Thus, if - coefficients were obtained which specified - a 1 rad/sec cornere frequency, specifying - a value of 1000.0 for denormalized_freq - will cause the model to shift the corner - freq. to 2.0 * pi * 1000.0 */ - double *old_gain; /* pointer to the gain if the highest order - denominator coefficient is not factored out */ - - Mif_Complex_t ac_gain, acc_num, acc_den; - - int i; /* generic loop counter index */ - int den_size; /* size of the denominator coefficient array */ - int num_size; /* size of the numerator coefficient array */ - - char *num_size_error="\n***ERROR***\nS_XFER: Numerator coefficient array size greater than\ndenominator coefficiant array size.\n"; - - - - /** Retrieve frequently used parameters (used by all analyses)... **/ - - in_offset = PARAM(in_offset); - num_size = PARAM_SIZE(num_coeff); - den_size = PARAM_SIZE(den_coeff); - if ( PARAM_NULL(denormalized_freq) ) { - denormalized_freq = 1.0; - } - else { - denormalized_freq = PARAM(denormalized_freq); - } - - if ( num_size > den_size ) { - cm_message_send(num_size_error); - return; - } - - /** Test for INIT; if so, allocate storage, otherwise, retrieve previous **/ - /** timepoint input values as necessary in subsequent analysis sections... **/ - - if (INIT==1) { /* First pass...allocate storage for previous values... */ - - /* Allocate rotational storage for integrator outputs, in & out */ - - -/***** The following two lines may be unnecessary in the final version *****/ - -/* We have to allocate memory and use cm_analog_alloc, because the ITP variables - are not functional */ - - integrator = (double **) calloc((size_t) den_size, sizeof(double *)); - old_integrator = (double **) calloc((size_t) den_size, sizeof(double *)); - - /* Allocate storage for coefficient values */ - - den_coefficient = (double **) calloc((size_t) den_size, sizeof(double *)); - old_den_coefficient = (double **) calloc((size_t) den_size, sizeof(double *)); - - num_coefficient = (double **) calloc((size_t) num_size, sizeof(double *)); - old_num_coefficient = (double **) calloc((size_t) num_size, sizeof(double *)); - - for (i=0; i < (2*den_size + num_size + 3); i++) - cm_analog_alloc(i,sizeof(double)); - - /* ITP_VAR_SIZE(den) = den_size; */ - - /* gain = (double *) calloc(1,sizeof(double)); - ITP_VAR(total_gain) = gain; - ITP_VAR_SIZE(total_gain) = 1.0; */ - - // Retrieve pointers - - for (i=0; i0; i--) { - cm_analog_integrate(*(integrator[i]),(integrator[i-1]),&null); - } - - - - /* Calculate the output based on the new integrator values... */ - - *out = 0.0; - for (i=0; i 0.0 ) { /* Negative coefficient */ - /* values for this iteration. */ - if (frac > 0.0 ) { /** Odd Powers of "s" **/ - acc_num.imag = acc_num.imag - *(num_coefficient[i]) * pow(RAD_FREQ,i) * (*gain); - } - else { /** Even Powers of "s" **/ - acc_num.real = acc_num.real - *(num_coefficient[i]) * pow(RAD_FREQ,i) * (*gain); - } - } - else { /* Positive coefficient values for this iteration */ - if (frac> 0.0 ) { /** Odd Powers of "s" **/ - acc_num.imag = acc_num.imag + *(num_coefficient[i]) * pow(RAD_FREQ,i) * (*gain); - } - else { /** Even Powers of "s" **/ - acc_num.real = acc_num.real + *(num_coefficient[i]) * pow(RAD_FREQ,i) * (*gain); - } - } - } - - /*** Calculate Denominator Real & Imaginary Components... ***/ - - acc_den.real = 0.0; - acc_den.imag = 0.0; - - for (i=0; i 0.0 ) { /* Negative coefficient */ - /* values for this iteration. */ - if (frac > 0.0 ) { /** Odd Powers of "s" **/ - acc_den.imag = acc_den.imag - *(den_coefficient[i]) * pow(RAD_FREQ,i); - } - else { /** Even Powers of "s" **/ - acc_den.real = acc_den.real - *(den_coefficient[i]) * pow(RAD_FREQ,i); - } - } - else { /* Positive coefficient values for this iteration */ - if (frac > 0.0 ) { /** Odd Powers of "s" **/ - acc_den.imag = acc_den.imag + *(den_coefficient[i]) * pow(RAD_FREQ,i); - } - else { /** Even Powers of "s" **/ - acc_den.real = acc_den.real + *(den_coefficient[i]) * pow(RAD_FREQ,i); - } - } - } - - /* divide numerator values by denominator values */ - - ac_gain = cm_complex_div(acc_num, acc_den); - - AC_GAIN(out,in) = ac_gain; - } - - /* free all allocated memory */ - if(integrator) free(integrator); - if(old_integrator) free(old_integrator); - if(den_coefficient) free(den_coefficient); - if(old_den_coefficient) free(old_den_coefficient); - if(num_coefficient) free(num_coefficient); - if(old_num_coefficient) free(old_num_coefficient); -} - - - - - - - diff --git a/src/xspice/icm/analog/s_xfer/ifspec.ifs b/src/xspice/icm/analog/s_xfer/ifspec.ifs deleted file mode 100644 index d060ea07d..000000000 --- a/src/xspice/icm/analog/s_xfer/ifspec.ifs +++ /dev/null @@ -1,94 +0,0 @@ -/*.......1.........2.........3.........4.........5.........6.........7.........8 -================================================================================ -Public Domain - -Georgia Tech Research Corporation -Atlanta, Georgia 30332 - - -AUTHORS - - 27 Sept 1991 Jeffrey P. Murray - - -SUMMARY - - This file contains the interface specification file for the - analog s-domain transfer function (s_xfer) code model. - -===============================================================================*/ - -NAME_TABLE: - -Spice_Model_Name: s_xfer -C_Function_Name: cm_s_xfer -Description: "s-domain transfer function block" - - -PORT_TABLE: - - -Port_Name: in out -Description: "input" "output" -Direction: in out -Default_Type: v v -Allowed_Types: [v,vd,i,id] [v,vd,i,id] -Vector: no no -Vector_Bounds: - - -Null_Allowed: no no - - - -PARAMETER_TABLE: - - -Parameter_Name: in_offset gain -Description: "input offset" "gain" -Data_Type: real real -Default_Value: 0.0 1.0 -Limits: - - -Vector: no no -Vector_Bounds: - - -Null_Allowed: yes yes - - -PARAMETER_TABLE: - - -Parameter_Name: num_coeff den_coeff -Description: "numerator poly coef" "denominator poly coef" -Data_Type: real real -Default_Value: - - -Limits: - - -Vector: yes yes -Vector_Bounds: [1 -] [1 -] -Null_Allowed: yes yes - - - -PARAMETER_TABLE: - - -Parameter_Name: int_ic -Description: "int stage init. cond" -Data_Type: real -Default_Value: 0.0 -Limits: - -Vector: yes -Vector_Bounds: - -Null_Allowed: yes - - -PARAMETER_TABLE: - - -Parameter_Name: denormalized_freq -Description: "frequency (radians/second) at which to denormalize coefficients" -Data_Type: real -Default_Value: 1.0 -Limits: - -Vector: no -Vector_Bounds: - -Null_Allowed: yes - - diff --git a/src/xspice/icm/analog/s_xfer/s_xfer.h b/src/xspice/icm/analog/s_xfer/s_xfer.h deleted file mode 100644 index ce433da76..000000000 --- a/src/xspice/icm/analog/s_xfer/s_xfer.h +++ /dev/null @@ -1,24 +0,0 @@ - - -/***************************************************/ -/****** Structures, etc. for int model. ******/ -/****** 11/6/90 JPM ******/ -/***************************************************/ - -/***** Value Definitions ******************************************/ - -#define INT1 1 -#define INT2 2 - - - -/***** Define Macros **************************************/ - - - -/***** Structure Definitions *************************************/ - - - -/***** Function Prototype Definitions ***************************************/ - diff --git a/src/xspice/icm/analog/sine/cfunc.mod b/src/xspice/icm/analog/sine/cfunc.mod deleted file mode 100644 index 95bc6622e..000000000 --- a/src/xspice/icm/analog/sine/cfunc.mod +++ /dev/null @@ -1,229 +0,0 @@ -/*.......1.........2.........3.........4.........5.........6.........7.........8 -================================================================================ - -FILE sine/cfunc.mod - -Public Domain - -Georgia Tech Research Corporation -Atlanta, Georgia 30332 -PROJECT A-8503-405 - - -AUTHORS - - 20 Mar 1991 Harry Li - - -MODIFICATIONS - - 2 Oct 1991 Jeffrey P. Murray - 7 Sep 2012 Holger Vogt - - -SUMMARY - - This file contains the model-specific routines used to - functionally describe the sine (controlled sine-wave - oscillator) code model. - - -INTERFACES - - FILE ROUTINE CALLED - - CMmacros.h cm_message_send(); - - CM.c void *cm_analog_alloc() - void *cm_analog_get_ptr() - - -REFERENCED FILES - - Inputs from and outputs to ARGS structure. - - -NON-STANDARD FEATURES - - NONE - -===============================================================================*/ - -/*=== INCLUDE FILES ====================*/ - -#include -#include - - -/*=== CONSTANTS ========================*/ - -#define INT1 1 - -char *allocation_error = "\n**** Error ****\nSINE: Error allocating sine block storage \n"; -char *limit_error = "\n**** Error ****\nSINE: Smoothing domain value too large \n"; -char *sine_freq_clamp = "\n**** Warning ****\nSINE: Extrapolated frequency limited to 1e-16 Hz \n"; -char *array_error = "\n**** Error ****\nSINE: Size of control array different than frequency array \n"; - - -/*=== MACROS ===========================*/ - - -/*=== LOCAL VARIABLES & TYPEDEFS =======*/ - - -/*=== FUNCTION PROTOTYPE DEFINITIONS ===*/ - - -/*============================================================================== - -FUNCTION void cm_sine() - -AUTHORS - - 20 Mar 1991 Harry Li - -MODIFICATIONS - - 2 Oct 1991 Jeffrey P. Murray - 7 Sep 2012 Holger Vogt - -SUMMARY - - This function implements the sine (controlled sinewave - oscillator) code model. - -INTERFACES - - FILE ROUTINE CALLED - - CMmacros.h cm_message_send(); - - CM.c void *cm_analog_alloc() - void *cm_analog_get_ptr() - -RETURNED VALUE - - Returns inputs and outputs via ARGS structure. - -GLOBAL VARIABLES - - NONE - -NON-STANDARD FEATURES - - NONE - -==============================================================================*/ - -/*=== CM_SINE ROUTINE ===*/ - -void -cm_sine(ARGS) -{ - int i; /* generic loop counter index */ - int cntl_size; /* control array size */ - int freq_size; /* frequency array size */ - - Mif_Value_t *x; /* pointer to the control array values */ - Mif_Value_t *y; /* pointer to the frequency array values */ - double cntl_input; /* control input */ - double dout_din; /* partial derivative of output wrt control in */ - double output_low; /* output low value */ - double output_hi; /* output high value */ - double *phase; /* pointer to the instantaneous phase value */ - double *phase1; /* pointer to the previous value for the phase */ - double freq=0.0; /* frequency of the sine wave */ - double center; /* dc offset for the sine wave */ - double peak; /* peak voltage value for the wave */ - double radian; /* phase value in radians */ - - Mif_Complex_t ac_gain; - - /**** Retrieve frequently used parameters... ****/ - - cntl_size = PARAM_SIZE(cntl_array); - freq_size = PARAM_SIZE(freq_array); - output_low = PARAM(out_low); - output_hi = PARAM(out_high); - - if (cntl_size != freq_size) { - cm_message_send(array_error); - return; - } - - if (INIT == 1) { - - cm_analog_alloc(INT1, sizeof(double)); - - } - - x = (Mif_Value_t*) &PARAM(cntl_array[0]); - y = (Mif_Value_t*) &PARAM(freq_array[0]); - - if (ANALYSIS == MIF_DC) { - - OUTPUT(out) = (output_hi + output_low) / 2; - PARTIAL(out, cntl_in) = 0; - phase = (double *) cm_analog_get_ptr(INT1, 0); - *phase = 0; - - } else if (ANALYSIS == MIF_TRAN) { - - phase = (double *) cm_analog_get_ptr(INT1, 0); - phase1 = (double *) cm_analog_get_ptr(INT1, 1); - - /* Retrieve cntl_input value. */ - cntl_input = INPUT(cntl_in); - - /* Determine segment boundaries within which cntl_input resides */ - if (cntl_input <= x[0].rvalue) { - - /*** cntl_input below lowest cntl_voltage ***/ - dout_din = (y[1].rvalue - y[0].rvalue) / (x[1].rvalue - x[0].rvalue); - freq = y[0].rvalue + (cntl_input - x[0].rvalue) * dout_din; - - if (freq <= 0) { - cm_message_send(sine_freq_clamp); - freq = 1e-16; - } - - } else if (cntl_input >= x[cntl_size-1].rvalue) { - - /*** cntl_input above highest cntl_voltage ***/ - dout_din = (y[cntl_size-1].rvalue - y[cntl_size-2].rvalue) / - (x[cntl_size-1].rvalue - x[cntl_size-2].rvalue); - freq = y[cntl_size-1].rvalue + (cntl_input - x[cntl_size-1].rvalue) * dout_din; - - } else { - - /*** cntl_input within bounds of end midpoints... - must determine position progressively & then - calculate required output. ***/ - - for (i = 0; i < cntl_size - 1; i++) - if ((cntl_input < x[i+1].rvalue) && (cntl_input >= x[i].rvalue)) { - /* Interpolate to the correct frequency value */ - freq = ((cntl_input - x[i].rvalue) / (x[i+1].rvalue - x[i].rvalue)) * - (y[i+1].rvalue - y[i].rvalue) + y[i].rvalue; - } - } - - /* calculate the peak value of the wave, the center of the wave, the - instantaneous phase and the radian value of the phase */ - peak = (output_hi - output_low) / 2; - center = (output_hi + output_low) / 2; - - *phase = *phase1 + freq*(TIME - T(1)); - radian = *phase * 2.0 * M_PI; - - OUTPUT(out) = peak * sin(radian) + center; - PARTIAL(out, cntl_in) = 0; - - } else { /* Output AC Gain */ - - ac_gain.real = 0.0; - ac_gain.imag = 0.0; - AC_GAIN(out, cntl_in) = ac_gain; - - } -} diff --git a/src/xspice/icm/analog/sine/ifspec.ifs b/src/xspice/icm/analog/sine/ifspec.ifs deleted file mode 100644 index 96895294b..000000000 --- a/src/xspice/icm/analog/sine/ifspec.ifs +++ /dev/null @@ -1,62 +0,0 @@ -/*.......1.........2.........3.........4.........5.........6.........7.........8 -================================================================================ -Public Domain - -Georgia Tech Research Corporation -Atlanta, Georgia 30332 - - -AUTHORS - - 20 Mar 1991 Harry Li - - -SUMMARY - - This file contains the interface specification file for the - analog sine (controlled sinewave oscillator) code model. - -===============================================================================*/ - -NAME_TABLE: - - -C_Function_Name: cm_sine -Spice_Model_Name: sine -Description: "controlled sine wave oscillator" - - -PORT_TABLE: - -Port_Name: cntl_in out -Description: "input" "output" -Direction: in out -Default_Type: v v -Allowed_Types: [v,vd,i,id,vnam] [v,vd,i,id] -Vector: no no -Vector_Bounds: - - -Null_Allowed: no no - -PARAMETER_TABLE: - -Parameter_Name: cntl_array freq_array -Description: "control in array" "frequency array" -Data_Type: real real -Default_Value: 0.0 1.0e3 -Limits: - [0 -] -Vector: yes yes -Vector_Bounds: [2 -] [2 -] -Null_Allowed: no no - - -PARAMETER_TABLE: - -Parameter_Name: out_low out_high -Description: "output low value" "output high value" -Data_Type: real real -Default_Value: -1.0 1.0 -Limits: - - -Vector: no no -Vector_Bounds: - - -Null_Allowed: yes yes - diff --git a/src/xspice/icm/analog/slew/cfunc.mod b/src/xspice/icm/analog/slew/cfunc.mod deleted file mode 100644 index 2c6b60795..000000000 --- a/src/xspice/icm/analog/slew/cfunc.mod +++ /dev/null @@ -1,300 +0,0 @@ -/*.......1.........2.........3.........4.........5.........6.........7.........8 -================================================================================ - -FILE slew/cfunc.mod - -Public Domain - -Georgia Tech Research Corporation -Atlanta, Georgia 30332 -PROJECT A-8503-405 - - -AUTHORS - - 15 Apr 1991 Harry Li - - -MODIFICATIONS - - 2 Oct 1991 Jeffrey P. Murray - - -SUMMARY - - This file contains the model-specific routines used to - functionally describe the slew (slew rate) code model. - - -INTERFACES - - FILE ROUTINE CALLED - - CM.c void *cm_analog_alloc() - void *cm_analog_get_ptr() - - -REFERENCED FILES - - Inputs from and outputs to ARGS structure. - - -NON-STANDARD FEATURES - - NONE - -===============================================================================*/ - -/*=== INCLUDE FILES ====================*/ - -#include "slew.h" - - - -/*=== CONSTANTS ========================*/ - - - - -/*=== MACROS ===========================*/ - - - - -/*=== LOCAL VARIABLES & TYPEDEFS =======*/ - - - - -/*=== FUNCTION PROTOTYPE DEFINITIONS ===*/ - - - - - -/*============================================================================== - -FUNCTION void cm_slew() - -AUTHORS - - 15 Apr 1991 Harry Li - - -MODIFICATIONS - - 2 Oct 1991 Jeffrey P. Murray - -SUMMARY - - This function implements the slew code model. - -INTERFACES - - FILE ROUTINE CALLED - - CM.c void *cm_analog_alloc() - void *cm_analog_get_ptr() - - -RETURNED VALUE - - Returns inputs and outputs via ARGS structure. - -GLOBAL VARIABLES - - NONE - -NON-STANDARD FEATURES - - NONE - -==============================================================================*/ - -/*=== CM_SLEW ROUTINE ===*/ - -/**************************************************************** -* * -* This model describes a single input, single output slew * -* rate limited block. The user may specify the positive * -* and negative slew rates. * -* * -* Note that the model makes no provision for output high and * -* low values. That is assumed to be handled by another model. * -* * -****************************************************************/ - -void cm_slew(ARGS) - -{ - double *ins; /* input value */ - double *in_old; /* previous input value */ - double *outs; /* output value */ - double *out_old; /* previous output value */ - double pout_pin; /* partial derivative--output wrt input */ - double delta; /* change in time from previous iteration */ - double slope_rise; /* positive going slew rate */ - double slope_fall; /* negative going slew rate */ - double out_slew; /* "slewed" output value */ - double slope; /* slope of the input wrt time */ - - Mif_Complex_t ac_gain; - - /** Retrieve frequently used parameters (used by all analyses)... **/ - - if (INIT == 1) { - - /* First pass...allocate storage for previous state. */ - - cm_analog_alloc(INT1,sizeof(double)); - cm_analog_alloc(INT4,sizeof(double)); - cm_analog_alloc(INT2,sizeof(double)); - cm_analog_alloc(INT3,sizeof(double)); - - } - - if (ANALYSIS == MIF_DC) { - - /* DC analysis, get old values */ - - ins= (double *) cm_analog_get_ptr(INT1,0); - outs= (double *) cm_analog_get_ptr(INT4,0); - in_old = (double *) cm_analog_get_ptr(INT1,0); - out_old = (double *) cm_analog_get_ptr(INT4,0); - - *ins = *in_old = INPUT(in); - *outs = *out_old = *ins; - - /*** so, return a zero d/dt value. ***/ - pout_pin = 1.0; - - OUTPUT(out) = INPUT(in); - PARTIAL(out,in) = 1; - - }else - - if (ANALYSIS == MIF_TRAN) { /**** DC & Transient Analyses ****/ - - /** Retrieve frequently used parameters... **/ - - slope_rise = PARAM(rise_slope); - slope_fall = PARAM(fall_slope); - - /* Allocation not necessary...retrieve previous values */ - - ins = (double *) cm_analog_get_ptr(INT1,0); /* Set out pointer to current - time storage */ - in_old = (double *) cm_analog_get_ptr(INT1,1); /* Set old-output-state pointer */ - outs = (double *) cm_analog_get_ptr(INT4,0); - out_old = (double *) cm_analog_get_ptr(INT4,1); /* Set old-output-state pointer - previous time storage */ - - - if ( TIME == 0.0 ) { /*** Test to see if this is the first ***/ - /*** timepoint calculation...if ***/ - - *ins = *in_old = INPUT(in); - *outs = *out_old = *ins; /* input = output, d/dt = 1 */ - pout_pin = 1.0; - - }else{ - - /* determine the slope of the input */ - delta = TIME - T(1); - *ins = INPUT(in); - slope = (*ins - *in_old)/delta; - - if(slope >= 0){ - - out_slew = *out_old + slope_rise*delta; - - if(*ins < (*out_old - slope_fall*delta)){ - - /* If the input had a negative slope (and the output - was slewing) and then changed direction to a positive - slope and the "slewed" response hasn't caught up - to the input yet (input < slewed output), then - continue negative slewing until the slewed output - meets the positive sloping input */ - - *outs = *out_old - slope_fall*delta; - pout_pin = 0; - - }else - - /* Two conditions for slewing, if the slope is greater - than the positive slew rate, or if the input slope - is less than the positive slew rate and the slewed output - is less than the input. This second condition occurs - if the input levels off and the slewed output hasn't - caught up to the input yet */ - - if((slope > slope_rise) || ((slope < slope_rise) && (out_slew <= *ins))){ - /* SLEWING ! */ - *outs = out_slew; - pout_pin = 0; - - }else{ - /* No slewing, output=input */ - *outs = *ins; - pout_pin = 1; - - } - - }else{ /* this ends the positive slope stuff */ - - out_slew = *out_old - slope_fall*delta; - - if(*ins > (*out_old + slope_rise*delta)){ - - /* If the input had a positive slope (and the output - was slewing) and then changed direction to a negative - slope and the "slewed" response hasn't caught up - to the input yet (input > slewed output), then - continue positive slewing until the slewed output - meets the negative sloping input */ - - *outs = *out_old + slope_rise*delta; - pout_pin = 0; - - }else - - /* Two conditions for slewing, if the negative slope is - greater than the neg. slew rate, or if the neg. input - slope is less than the negative slew rate and the - slewed output is greater than the input. This second - condition occurs if the input levels off and the - slewed output hasn't caught up to the input yet */ - - if((-slope > slope_fall) || ((-slope < slope_fall) && (out_slew > *ins))){ /* SLEWING ! */ - *outs = out_slew; - pout_pin = 0; - - }else{ - - *outs = *ins; - pout_pin = 1; - - } - - - } - - } - /** Output values for DC & Transient **/ - - OUTPUT(out) = *outs; - PARTIAL(out,in) = pout_pin; - - - }else{ /**** AC Analysis...output (0.0,s*gain) ****/ - ac_gain.real = 1.0; - ac_gain.imag= 0; - AC_GAIN(out,in) = ac_gain; - } -} - - - - - diff --git a/src/xspice/icm/analog/slew/ifspec.ifs b/src/xspice/icm/analog/slew/ifspec.ifs deleted file mode 100644 index 674795c38..000000000 --- a/src/xspice/icm/analog/slew/ifspec.ifs +++ /dev/null @@ -1,55 +0,0 @@ -/*.......1.........2.........3.........4.........5.........6.........7.........8 -================================================================================ -Public Domain - -Georgia Tech Research Corporation -Atlanta, Georgia 30332 - - -AUTHORS - - 15 Apr 1991 Jeffrey P. Murray - - -SUMMARY - - This file contains the interface specification file for the - analog slew (slew rate) code model. - -===============================================================================*/ - -NAME_TABLE: - - -C_Function_Name: cm_slew -Spice_Model_Name: slew -Description: "a simple slew rate follower block" - - -PORT_TABLE: - - -Port_Name: in out -Description: "input" "output" -Direction: in out -Default_Type: v v -Allowed_Types: [v,vd,i,id,vnam] [v,vd,i,id] -Vector: no no -Vector_Bounds: - - -Null_Allowed: no no - - -PARAMETER_TABLE: - - -Parameter_Name: rise_slope fall_slope -Description: "rising slew limit" "falling slew limit" -Data_Type: real real -Default_Value: 1.0e-9 1.0e-9 -Limits: - - -Vector: no no -Vector_Bounds: - - -Null_Allowed: yes yes - - - diff --git a/src/xspice/icm/analog/slew/slew.h b/src/xspice/icm/analog/slew/slew.h deleted file mode 100644 index 957844302..000000000 --- a/src/xspice/icm/analog/slew/slew.h +++ /dev/null @@ -1,76 +0,0 @@ -/*.......1.........2.........3.........4.........5.........6.........7.........8 -================================================================================ - -FILE slew/slew.h - -Public Domain - -Georgia Tech Research Corporation -Atlanta, Georgia 30332 -PROJECT A-8503-405 - - -AUTHORS - - 15 Apr 1991 Harry Li - - -MODIFICATIONS - - 2 Oct 1991 Jeffrey P. Murray - - -SUMMARY - - This file contains additional header information for the - slew code model. - - -INTERFACES - - FILE ROUTINE CALLED - - N/A N/A - - -REFERENCED FILES - - NONE - - -NON-STANDARD FEATURES - - NONE - -===============================================================================*/ - -/*=== INCLUDE FILES ====================*/ - - - - -/*=== CONSTANTS ========================*/ - -#define INT1 1 -#define INT2 2 -#define INT3 3 -#define INT4 4 - - - -/*=== MACROS ===========================*/ - - - - -/*=== LOCAL VARIABLES & TYPEDEFS =======*/ - - - - -/*=== FUNCTION PROTOTYPE DEFINITIONS ===*/ - - - - - diff --git a/src/xspice/icm/analog/square/cfunc.mod b/src/xspice/icm/analog/square/cfunc.mod deleted file mode 100644 index d7b2f58cb..000000000 --- a/src/xspice/icm/analog/square/cfunc.mod +++ /dev/null @@ -1,396 +0,0 @@ -/*.......1.........2.........3.........4.........5.........6.........7.........8 -================================================================================ - -FILE square/cfunc.mod - -Public Domain - -Georgia Tech Research Corporation -Atlanta, Georgia 30332 -PROJECT A-8503-405 - - -AUTHORS - - 12 Apr 1991 Harry Li - - -MODIFICATIONS - - 2 Oct 1991 Jeffrey P. Murray - - -SUMMARY - - This file contains the model-specific routines used to - functionally describe the square (controlled squarewave - oscillator) code model. - - -INTERFACES - - FILE ROUTINE CALLED - - CMmacros.h cm_message_send(); - - CM.c void *cm_analog_alloc() - void *cm_analog_get_ptr() - int cm_analog_set_temp_bkpt() - - -REFERENCED FILES - - Inputs from and outputs to ARGS structure. - - -NON-STANDARD FEATURES - - NONE - -===============================================================================*/ - -/*=== INCLUDE FILES ====================*/ - -#include - - -/*=== CONSTANTS ========================*/ - -char *square_allocation_error = "\n**** Error ****\nSQUARE: Error allocating square block storage \n"; -char *square_limit_error = "\n**** Error ****\nSQUARE: Smoothing domain value too large \n"; -char *square_freq_clamp = "\n**** WARNING ****\nSQUARE: Frequency extrapolation limited to 1e-16 \n"; -char *square_array_error = "\n**** Error ****\nSQUARE: Size of control array different than frequency array \n"; - -#define INT1 1 -#define T1 2 -#define T2 3 -#define T3 4 -#define T4 5 - - -/*=== MACROS ===========================*/ - - -/*=== LOCAL VARIABLES & TYPEDEFS =======*/ - -typedef struct { - Boolean_t tran_init; /* for initialization of phase1) */ -} Local_Data_t; - - -/*=== FUNCTION PROTOTYPE DEFINITIONS ===*/ - -/*============================================================================== - -FUNCTION void cm_square() - -AUTHORS - - 12 Apr 1991 Harry Li - -MODIFICATIONS - - 2 Oct 1991 Jeffrey P. Murray - -SUMMARY - - This function implements the square (controlled squarewave - oscillator) code model. - -INTERFACES - - FILE ROUTINE CALLED - - CMmacros.h cm_message_send(); - - CM.c void *cm_analog_alloc() - void *cm_analog_get_ptr() - int cm_analog_set_temp_bkpt() - - -RETURNED VALUE - - Returns inputs and outputs via ARGS structure. - -GLOBAL VARIABLES - - NONE - -NON-STANDARD FEATURES - - NONE - -==============================================================================*/ - -/*=== CM_SQUARE ROUTINE ===*/ - - -/*********************************************************** -* * -* I <-dutycycle-> * -* I * -* I out_high * -* I t2 | t3 * -* I \____v_____/ * -* I / \ * -* I * -* I / \ * -* I * -* I / \ * -* I * -* I-----------------I I--------------- * -* ^ t1 t4 * -* | * -* out_low * -* t2 = t1 + t_rise * -* t4 = t3 + t_fall * -* * -***********************************************************/ - -void -cm_square(ARGS) -{ - int i; /* generic loop counter index */ - int cntl_size; /* control array size */ - int freq_size; /* frequency array size */ - int int_cycle; /* integer number of cycles */ - - Mif_Value_t *x; /* pointer to the control array values */ - Mif_Value_t *y; /* pointer to the frequency array values */ - double cntl_input; /* control input */ - double dout_din; /* slope of the frequency array wrt the control - array. Used to extrapolate a frequency above - and below the control input high and low level */ - double output_low; /* output low */ - double output_hi; /* output high */ - double dphase; /* fractional part into cycle */ - double *phase; /* pointer to the phase value */ - double *phase1; /* pointer to the old phase value */ - double freq = 0.0; /* frequency of the wave */ - double d_cycle; /* duty cycle */ - double *t1; /* pointer containing the value of time1 */ - double *t2; /* pointer containing the value of time2 */ - double *t3; /* pointer containing the value of time3 */ - double *t4; /* pointer containing the value of time4 */ - double time1; /* time1 = duty_cycle * period of the wave */ - double time2; /* time2 = time1 + risetime */ - double time3; /* time3 = current time+time to end of period*/ - double time4; /* time4 = time3 + falltime */ - double t_rise; /* risetime */ - double t_fall; /* falltime */ - - Mif_Complex_t ac_gain; - - /**** Retrieve frequently used parameters... ****/ - - cntl_size = PARAM_SIZE(cntl_array); - freq_size = PARAM_SIZE(freq_array); - output_low = PARAM(out_low); - output_hi = PARAM(out_high); - d_cycle = PARAM(duty_cycle); - t_rise = PARAM(rise_time); - t_fall = PARAM(fall_time); - - /* check and make sure that the control array is the - same size as the frequency array */ - - if (cntl_size != freq_size) { - cm_message_send(square_array_error); - return; - } - - /* First time throught allocate memory */ - if (INIT == 1) { - cm_analog_alloc(INT1, sizeof(double)); - cm_analog_alloc(T1, sizeof(double)); - cm_analog_alloc(T2, sizeof(double)); - cm_analog_alloc(T3, sizeof(double)); - cm_analog_alloc(T4, sizeof(double)); - - STATIC_VAR(tran_init) = MIF_FALSE; - } - - x = (Mif_Value_t*) &PARAM(cntl_array[0]); - y = (Mif_Value_t*) &PARAM(freq_array[0]); - - if (ANALYSIS == MIF_DC) { - - /* initialize time values */ - t1 = (double *) cm_analog_get_ptr(T1, 0); - t2 = (double *) cm_analog_get_ptr(T2, 0); - t3 = (double *) cm_analog_get_ptr(T3, 0); - t4 = (double *) cm_analog_get_ptr(T4, 0); - - *t1 = -1; - *t2 = -1; - *t3 = -1; - *t4 = -1; - - OUTPUT(out) = output_low; - PARTIAL(out, cntl_in) = 0; - - } else if (ANALYSIS == MIF_TRAN) { - - /* Retrieve previous values */ - - phase = (double *) cm_analog_get_ptr(INT1, 0); - phase1 = (double *) cm_analog_get_ptr(INT1, 1); - - t1 = (double *) cm_analog_get_ptr(T1, 1); - t2 = (double *) cm_analog_get_ptr(T2, 1); - t3 = (double *) cm_analog_get_ptr(T3, 1); - t4 = (double *) cm_analog_get_ptr(T4, 1); - - time1 = *t1; - time2 = *t2; - time3 = *t3; - time4 = *t4; - - if (STATIC_VAR(tran_init) == MIF_FALSE) { - *phase1 = 0.0; - STATIC_VAR(tran_init) = MIF_TRUE; - } - - /* Retrieve cntl_input value. */ - cntl_input = INPUT(cntl_in); - - /* Determine segment boundaries within which cntl_input resides */ - /*** cntl_input below lowest cntl_voltage ***/ - if (cntl_input <= x[0].rvalue) { - dout_din = (y[1].rvalue - y[0].rvalue) / (x[1].rvalue - x[0].rvalue); - freq = y[0].rvalue + (cntl_input - x[0].rvalue) * dout_din; - - if (freq <= 0) { - cm_message_send(square_freq_clamp); - freq = 1e-16; - } - - } else if (cntl_input >= x[cntl_size-1].rvalue) { - /*** cntl_input above highest cntl_voltage ***/ - dout_din = (y[cntl_size-1].rvalue - y[cntl_size-2].rvalue) / - (x[cntl_size-1].rvalue - x[cntl_size-2].rvalue); - freq = y[cntl_size-1].rvalue + (cntl_input - x[cntl_size-1].rvalue) * dout_din; - - } else { - /*** cntl_input within bounds of end midpoints... - must determine position progressively & then - calculate required output. ***/ - - for (i = 0; i < cntl_size - 1; i++) { - - if ((cntl_input < x[i+1].rvalue) && (cntl_input >= x[i].rvalue)) { - - /* Interpolate to the correct frequency value */ - - freq = ((cntl_input - x[i].rvalue)/(x[i+1].rvalue - x[i].rvalue)) * - (y[i+1].rvalue-y[i].rvalue) + y[i].rvalue; - } - - } - - } - - /* calculate the instantaneous phase */ - *phase = *phase1 + freq*(TIME - T(1)); - - /* convert the phase to an integer */ - int_cycle = (int) *phase1; - - /* dphase is the percent into the cycle for - the period */ - dphase = *phase1 - int_cycle; - - /* Calculate the time variables and the output value - for this iteration */ - - if ((time1 <= TIME) && (TIME <= time2)) { - - time3 = T(1) + (1 - dphase) / freq; - time4 = time3 + t_fall; - - if (TIME < time2) - cm_analog_set_temp_bkpt(time2); - - cm_analog_set_temp_bkpt(time3); - cm_analog_set_temp_bkpt(time4); - - OUTPUT(out) = output_low + ((TIME - time1) / (time2 - time1)) * - (output_hi - output_low); - - } else if ((time2 <= TIME) && (TIME <= time3)) { - - time3 = T(1) + (1.0 - dphase) / freq; - time4 = time3 + t_fall; - - if (TIME < time3) - cm_analog_set_temp_bkpt(time3); - - cm_analog_set_temp_bkpt(time4); - - OUTPUT(out) = output_hi; - - } else if ((time3 <= TIME) && (TIME <= time4)) { - - if (dphase > 1 - d_cycle) - dphase = dphase - 1.0; - - /* subtract d_cycle from 1 because my initial definition - of duty cyle was that part of the cycle which the output - is low. The more standard definition is the part of the - cycle where the output is high. */ - time1 = T(1) + ((1-d_cycle) - dphase) / freq; - time2 = time1 + t_rise; - - if (TIME < time4) - cm_analog_set_temp_bkpt(time4); - - cm_analog_set_temp_bkpt(time1); - cm_analog_set_temp_bkpt(time2); - - OUTPUT(out) = output_hi + ((TIME - time3) / (time4 - time3)) * - (output_low - output_hi); - - } else { - - if (dphase > 1 - d_cycle) - dphase = dphase - 1.0; - - /* subtract d_cycle from 1 because my initial definition - of duty cyle was that part of the cycle which the output - is low. The more standard definition is the part of the - cycle where the output is high. */ - time1 = T(1) + ((1-d_cycle) - dphase) / freq; - time2 = time1 + t_rise; - - if ((TIME < time1) || (T(1) == 0)) - cm_analog_set_temp_bkpt(time1); - - cm_analog_set_temp_bkpt(time2); - - OUTPUT(out) = output_low; - - } - - PARTIAL(out, cntl_in) = 0.0; - - /* set the time values for storage */ - - t1 = (double *) cm_analog_get_ptr(T1, 0); - t2 = (double *) cm_analog_get_ptr(T2, 0); - t3 = (double *) cm_analog_get_ptr(T3, 0); - t4 = (double *) cm_analog_get_ptr(T4, 0); - - *t1 = time1; - *t2 = time2; - *t3 = time3; - *t4 = time4; - - } else { /* Output AC Gain */ - - /* This model has no AC capabilities */ - - ac_gain.real = 0.0; - ac_gain.imag = 0.0; - AC_GAIN(out, cntl_in) = ac_gain; - } -} diff --git a/src/xspice/icm/analog/square/ifspec.ifs b/src/xspice/icm/analog/square/ifspec.ifs deleted file mode 100644 index 9a350445e..000000000 --- a/src/xspice/icm/analog/square/ifspec.ifs +++ /dev/null @@ -1,90 +0,0 @@ -/*.......1.........2.........3.........4.........5.........6.........7.........8 -================================================================================ -Public Domain - -Georgia Tech Research Corporation -Atlanta, Georgia 30332 - - -AUTHORS - - 12 Apr 1991 Harry Li - - -SUMMARY - - This file contains the interface specification file for the - analog square (controlled squarewave oscillator) code model. - -===============================================================================*/ - -NAME_TABLE: - - -C_Function_Name: cm_square -Spice_Model_Name: square -Description: "controlled square wave oscillator" - - -PORT_TABLE: - -Port_Name: cntl_in out -Description: "input" "output" -Direction: in out -Default_Type: v v -Allowed_Types: [v,vd,i,id,vnam] [v,vd,i,id] -Vector: no no -Vector_Bounds: - - -Null_Allowed: no no - -PARAMETER_TABLE: - -Parameter_Name: cntl_array freq_array -Description: "control in array" "frequency array" -Data_Type: real real -Default_Value: 0.0 1.0e3 -Limits: - [0 -] -Vector: yes yes -Vector_Bounds: [2 -] [2 -] -Null_Allowed: no no - - -PARAMETER_TABLE: - -Parameter_Name: out_low out_high -Description: "output low value" "output high value" -Data_Type: real real -Default_Value: -1.0 1.0 -Limits: - - -Vector: no no -Vector_Bounds: - - -Null_Allowed: yes yes - -PARAMETER_TABLE: - -Parameter_Name: duty_cycle rise_time -Description: "duty cycle" "rise time" -Data_Type: real real -Default_Value: 0.5 1.0e-9 -Limits: [1e-6 .999999] - -Vector: no no -Vector_Bounds: - - -Null_Allowed: yes yes - -PARAMETER_TABLE: - -Parameter_Name: fall_time -Description: "fall time" -Data_Type: real -Default_Value: 1.0e-9 -Limits: - -Vector: no -Vector_Bounds: - -Null_Allowed: yes - - -STATIC_VAR_TABLE: - -Static_Var_Name: tran_init -Description: "tran initialisation" -Data_Type: boolean diff --git a/src/xspice/icm/analog/summer/cfunc.mod b/src/xspice/icm/analog/summer/cfunc.mod deleted file mode 100644 index 0210b3560..000000000 --- a/src/xspice/icm/analog/summer/cfunc.mod +++ /dev/null @@ -1,149 +0,0 @@ -/*.......1.........2.........3.........4.........5.........6.........7.........8 -================================================================================ - -FILE summer/cfunc.mod - -Public Domain - -Georgia Tech Research Corporation -Atlanta, Georgia 30332 -PROJECT A-8503-405 - - -AUTHORS - - 9 Apr 1991 Jeffrey P. Murray - - -MODIFICATIONS - - 2 Oct 1991 Jeffrey P. Murray - - -SUMMARY - - This file contains the model-specific routines used to - functionally describe the summer code model. - - -INTERFACES - - FILE ROUTINE CALLED - - N/A N/A - - -REFERENCED FILES - - Inputs from and outputs to ARGS structure. - - -NON-STANDARD FEATURES - - NONE - -===============================================================================*/ - -/*=== INCLUDE FILES ====================*/ - - - - -/*=== CONSTANTS ========================*/ - - - - -/*=== MACROS ===========================*/ - - - - -/*=== LOCAL VARIABLES & TYPEDEFS =======*/ - - - - -/*=== FUNCTION PROTOTYPE DEFINITIONS ===*/ - - - - - -/*============================================================================== - -FUNCTION void cm_summer() - -AUTHORS - - 9 Apr 1991 Jeffrey P. Murray - -MODIFICATIONS - - 2 Oct 1991 Jeffrey P. Murray - -SUMMARY - - This function implements the summer code model. - -INTERFACES - - FILE ROUTINE CALLED - - N/A N/A - - -RETURNED VALUE - - Returns inputs and outputs via ARGS structure. - -GLOBAL VARIABLES - - NONE - -NON-STANDARD FEATURES - - NONE - -==============================================================================*/ - -/*=== CM_SUMMER ROUTINE ===*/ - - -void cm_summer(ARGS) - -{ - int i; /* generic loop counter index */ - int size; /* number of inputs */ - - double accumulate; /* sum of all the (inputs times their - respective gains plus their offset). */ - double final_gain; /* output gain stage */ - double in_gain_temp; /* temporary variable used to calculate - accumulate */ - - Mif_Complex_t ac_gain; - - - size = PORT_SIZE(in); /* Note that port size */ - final_gain = PARAM(out_gain); /* and out_gain are read only */ - /* once...saves access time. */ - if(ANALYSIS != MIF_AC) { /* DC & Transient */ - accumulate = 0.0; - for (i=0; i - - -/*=== CONSTANTS ========================*/ - -char *triangle_allocation_error = "\n**** Error ****\nTRIANGLE: Error allocating triangle block storage \n"; -char *triangle_freq_clamp = "\n**** Warning ****\nTRIANGLE: Extrapolated Minimum Frequency Set to 1e-16 Hz \n"; -char *triangle_array_error = "\n**** Error ****\nTRIANGLE: Size of control array different than frequency array \n"; - -#define INT1 1 -#define T1 2 -#define T2 3 -#define T3 4 - - -/*=== MACROS ===========================*/ - - -/*=== LOCAL VARIABLES & TYPEDEFS =======*/ - - -/*=== FUNCTION PROTOTYPE DEFINITIONS ===*/ - -/*============================================================================== - -FUNCTION void cm_triangle() - -AUTHORS - - 12 Apr 1991 Harry Li - -MODIFICATIONS - - 2 Oct 1991 Jeffrey P. Murray - 9 Sep 2012 Holger Vogt - -SUMMARY - - This function implements the triangle (controlled trianglewave - oscillator) code model. - -INTERFACES - - FILE ROUTINE CALLED - - CMmacros.h cm_message_send(); - - CM.c void *cm_analog_alloc() - void *cm_analog_get_ptr() - int cm_analog_set_temp_bkpt() - - -RETURNED VALUE - - Returns inputs and outputs via ARGS structure. - -GLOBAL VARIABLES - - NONE - -NON-STANDARD FEATURES - - NONE - -==============================================================================*/ - -/*=== CM_TRIANGLE ROUTINE ===*/ - -/***************************************************** -* * -* I /\ <- output_high * -* I / \ * -* I / \ * -* I / \ * -* I / \ * -* I / \ * -* I / \ * -* I / \ * -* I / \ * -* I/------------------------------------------ * -* \ / * -* \ / * -* \ / * -* \ / * -* \ / * -* \ / * -* \ / * -* \/ <- output_low * -* * -*****************************************************/ - -void -cm_triangle(ARGS) -{ - int i; /* generic loop counter index */ - int cntl_size; /* size of the control array */ - int freq_size; /* size of the frequency array */ - int int_cycle; /* the number of cycles rounded to the nearest int */ - - Mif_Value_t *x; /* pointer holds the values of the control array */ - Mif_Value_t *y; /* pointer holds the values of the freq array */ - double cntl_input; /* control input */ - - double dout_din; /* partial out wrt to control input */ - double output_low; /* lowest point of the wave */ - double output_hi; /* highest point of the wave */ - double dphase; /* percent into the current phase of the cycle */ - double *phase; /* instantaneous phase value */ - double *phase1; /* pointer to the previous phase value */ - double freq = 0.0; /* actual frequency of the wave */ - double d_cycle; /* duty cycle */ - double *t1; /* pointer which stores time1 */ - double *t2; /* pointer which stores time2 */ - double *t_end; /* pointer which stores t_start */ - double time1; /* time of high peak */ - double time2; /* time of low peak */ - double t_start; /* time of the beginning of each cycle */ - - Mif_Complex_t ac_gain; - - /**** Retrieve frequently used parameters... ****/ - - - cntl_size = PARAM_SIZE(cntl_array); - freq_size = PARAM_SIZE(freq_array); - output_low = PARAM(out_low); - output_hi = PARAM(out_high); - d_cycle = PARAM(duty_cycle); - - if(cntl_size != freq_size) { - cm_message_send(triangle_array_error); - return; - } - - /* Allocate memory */ - - if (INIT == 1) { - cm_analog_alloc(INT1, sizeof(double)); - cm_analog_alloc(T1, sizeof(double)); - cm_analog_alloc(T2, sizeof(double)); - cm_analog_alloc(T3, sizeof(double)); - - STATIC_VAR(tran_init) = MIF_FALSE; - } - - x = (Mif_Value_t*) &PARAM(cntl_array[0]); - y = (Mif_Value_t*) &PARAM(freq_array[0]); - - if (ANALYSIS == MIF_DC) { - - /* initialize time values */ - - t1 = (double *) cm_analog_get_ptr(T1, 0); - t2 = (double *) cm_analog_get_ptr(T2, 0); - t_end = (double *) cm_analog_get_ptr(T3, 0); - - *t1 = -1; - *t2 = -1; - *t_end = 0; - - OUTPUT(out) = output_low; - PARTIAL(out, cntl_in) = 0; - - } else if (ANALYSIS == MIF_TRAN) { - - /* Retrieve previous values and set equal to corresponding variables */ - - phase = (double *) cm_analog_get_ptr(INT1, 0); - phase1 = (double *) cm_analog_get_ptr(INT1, 1); - - t1 = (double *) cm_analog_get_ptr(T1, 1); - t2 = (double *) cm_analog_get_ptr(T2, 1); - t_end = (double *) cm_analog_get_ptr(T3, 1); - - time1 = *t1; - time2 = *t2; - t_start = *t_end; - - if (STATIC_VAR(tran_init) == MIF_FALSE) { - *phase1 = 0.0; - STATIC_VAR(tran_init) = MIF_TRUE; - } - - /* Retrieve cntl_input value. */ - cntl_input = INPUT(cntl_in); - - /* Determine segment boundaries within which cntl_input resides */ - - /*** cntl_input below lowest cntl_voltage ***/ - if (cntl_input <= x[0].rvalue) { - - dout_din = (y[1].rvalue - y[0].rvalue) / (x[1].rvalue - x[0].rvalue); - freq = y[0].rvalue + (cntl_input - x[0].rvalue) * dout_din; - - if (freq <= 0) { - cm_message_send(triangle_freq_clamp); - freq = 1e-16; - } - - } else if (cntl_input >= x[cntl_size-1].rvalue) { - /*** cntl_input above highest cntl_voltage ***/ - dout_din = (y[cntl_size-1].rvalue - y[cntl_size-2].rvalue) / - (x[cntl_size-1].rvalue - x[cntl_size-2].rvalue); - freq = y[cntl_size-1].rvalue + (cntl_input - x[cntl_size-1].rvalue) * dout_din; - /* freq = y[cntl_size-1].rvalue; */ - - } else { - /*** cntl_input within bounds of end midpoints... - must determine position progressively & then - calculate required output. ***/ - - for (i = 0; i < cntl_size - 1; i++) { - - if ((cntl_input < x[i+1].rvalue) && (cntl_input >= x[i].rvalue)) { - - /* Interpolate to the correct frequency value */ - - freq = ((cntl_input - x[i].rvalue) / (x[i+1].rvalue - x[i].rvalue)) * - (y[i+1].rvalue - y[i].rvalue) + y[i].rvalue; - } - } - } - - /* Instantaneous phase is the old phase + frequency/(delta time) - int_cycle is the integer value for the number cycles. */ - - *phase = *phase1 + freq * (TIME - T(1)); - int_cycle = (int) *phase1; - dphase = *phase1 - int_cycle; - - /* if the current time is greater than time1, but less than time2, - calculate time2 and set the temporary breakpoint. */ - if ((time1 <= TIME) && (TIME <= time2)) { - - time2 = T(1) + (1 - dphase) / freq; - - if (TIME < time2) - cm_analog_set_temp_bkpt(time2); - - /* store the time that the next cycle is scheduled to begin */ - t_start = time2; - - /* set output value */ - OUTPUT(out) = output_hi - ((TIME - time1) / (time2 - time1)) * - (output_hi - output_low); - - } else { - - /* otherwise, calculate time1 and time2 and set their respective - breakpoints */ - - if (dphase > d_cycle) - dphase = dphase - 1.0; - - time1 = T(1) + (d_cycle - dphase) / freq; - time2 = T(1) + (1 - dphase) / freq; - - if ((TIME < time1) || (T(1) == 0)) - cm_analog_set_temp_bkpt(time1); - - cm_analog_set_temp_bkpt(time2); - - /* set output value */ - OUTPUT(out) = output_low + ((TIME - t_start) / (time1 - t_start)) * - (output_hi - output_low); - } - - PARTIAL(out, cntl_in) = 0.0; - - /* set the time values for storage */ - - t1 = (double *) cm_analog_get_ptr(T1, 0); - t2 = (double *) cm_analog_get_ptr(T2, 0); - t_end = (double *) cm_analog_get_ptr(T3, 0); - - *t1 = time1; - *t2 = time2; - *t_end = t_start; - - } else { /* Output AC Gain */ - - /* This model has no AC capabilities */ - - ac_gain.real = 0.0; - ac_gain.imag = 0.0; - AC_GAIN(out, cntl_in) = ac_gain; - } -} diff --git a/src/xspice/icm/analog/triangle/ifspec.ifs b/src/xspice/icm/analog/triangle/ifspec.ifs deleted file mode 100644 index ad870f93a..000000000 --- a/src/xspice/icm/analog/triangle/ifspec.ifs +++ /dev/null @@ -1,79 +0,0 @@ -/*.......1.........2.........3.........4.........5.........6.........7.........8 -================================================================================ -Public Domain - -Georgia Tech Research Corporation -Atlanta, Georgia 30332 - - -AUTHORS - - 12 Apr 1991 Jeffrey P. Murray - - -SUMMARY - - This file contains the interface specification file for the - analog triangle (controlled trianglewave oscillator) code model. - -===============================================================================*/ - -NAME_TABLE: - - -C_Function_Name: cm_triangle -Spice_Model_Name: triangle -Description: "controlled triangle wave oscillator" - - -PORT_TABLE: - -Port_Name: cntl_in out -Description: "input" "output" -Direction: in out -Default_Type: v v -Allowed_Types: [v,vd,i,id,vnam] [v,vd,i,id] -Vector: no no -Vector_Bounds: - - -Null_Allowed: no no - -PARAMETER_TABLE: - -Parameter_Name: cntl_array freq_array -Description: "control in array" "frequency array" -Data_Type: real real -Default_Value: 0.0 1.0e3 -Limits: - [0 -] -Vector: yes yes -Vector_Bounds: [2 -] [2 -] -Null_Allowed: no no - - -PARAMETER_TABLE: - -Parameter_Name: out_low out_high -Description: "output low value" "output high value" -Data_Type: real real -Default_Value: -1.0 1.0 -Limits: - - -Vector: no no -Vector_Bounds: - - -Null_Allowed: yes yes - -PARAMETER_TABLE: - -Parameter_Name: duty_cycle -Description: "rise time duty cycle" -Data_Type: real -Default_Value: 0.5 -Limits: [1e-6 .999999] -Vector: no -Vector_Bounds: - -Null_Allowed: yes - - -STATIC_VAR_TABLE: - -Static_Var_Name: tran_init -Description: "tran initialisation" -Data_Type: boolean diff --git a/src/xspice/icm/analog/udnpath.lst b/src/xspice/icm/analog/udnpath.lst deleted file mode 100644 index e69de29bb..000000000 diff --git a/src/xspice/icm/digital/.gitignore b/src/xspice/icm/digital/.gitignore deleted file mode 100644 index 758076c5d..000000000 --- a/src/xspice/icm/digital/.gitignore +++ /dev/null @@ -1,14 +0,0 @@ -/digital.cm - -/cmextrn.h -/cminfo.h -/cminfo2.h -/dlmain.c -/objects.inc -/udnextrn.h -/udninfo.h -/udninfo2.h - -/*/*.c - -!/*/udnfunc.c diff --git a/src/xspice/icm/digital/adc_bridge/cfunc.mod b/src/xspice/icm/digital/adc_bridge/cfunc.mod deleted file mode 100644 index c376d871b..000000000 --- a/src/xspice/icm/digital/adc_bridge/cfunc.mod +++ /dev/null @@ -1,359 +0,0 @@ -/*.......1.........2.........3.........4.........5.........6.........7.........8 -================================================================================ - -FILE adc_bridge/cfunc.mod - -Public Domain - -Georgia Tech Research Corporation -Atlanta, Georgia 30332 -PROJECT A-8503-405 - - -AUTHORS - - 6 June 1991 Jeffrey P. Murray - - -MODIFICATIONS - - 26 Sept 1991 Jeffrey P. Murray - - -SUMMARY - - This file contains the functional description of the adc_bridge - code model. - - -INTERFACES - - FILE ROUTINE CALLED - - CM.c void *cm_analog_alloc() - void *cm_analog_get_ptr() - - CMevt.c void *cm_event_alloc() - void *cm_event_get_ptr() - int cm_event_queue() - - - - -REFERENCED FILES - - Inputs from and outputs to ARGS structure. - - -NON-STANDARD FEATURES - - NONE - -===============================================================================*/ - -/*=== INCLUDE FILES ====================*/ - - - - -/*=== CONSTANTS ========================*/ - - - - -/*=== MACROS ===========================*/ - - - - -/*=== LOCAL VARIABLES & TYPEDEFS =======*/ - - - - -/*=== FUNCTION PROTOTYPE DEFINITIONS ===*/ - - - - - - - -/*============================================================================== - -FUNCTION cm_adc_bridge() - -AUTHORS - - 6 June 1991 Jeffrey P. Murray - -MODIFICATIONS - - 26 Sept 1991 Jeffrey P. Murray - -SUMMARY - - This function implements the adc_bridge code model. - -INTERFACES - - FILE ROUTINE CALLED - - CM.c void *cm_analog_alloc() - void *cm_analog_get_ptr() - - CMevt.c void *cm_event_alloc() - void *cm_event_get_ptr() - int cm_event_queue() - -RETURNED VALUE - - Returns inputs and outputs via ARGS structure. - -GLOBAL VARIABLES - - NONE - -NON-STANDARD FEATURES - - NONE - -==============================================================================*/ - -/*=== CM_ADC_BRIDGE ROUTINE ===*/ - -/************************************************ -* The following is the model for the * -* analog-to-digital nodebridge for the * -* ATESSE Version 2.0 system. * -* * -* Created 6/6/91 * -* Last Modified 7/26/91 J.P.Murray * -************************************************/ - - -void cm_adc_bridge(ARGS) - -{ - double in_low, /* analog output value corresponding to '0' - digital input */ - in_high, /* analog output value corresponding to '1' - digital input */ - current_time, /* the current time value */ - *in, /* base address of array holding all digital output - values plus their previous values */ - *in_old; /* base address of array holding previous - output values */ - - - int i, /* generic loop counter index */ - size; /* number of input & output ports */ - - - - Digital_State_t *out, /* base address of array holding all input - values plus their previous values */ - *out_old, /* base address of array holding previous - input values */ - test; /* temp holding variable for digital states */ - - - - - - /* determine "width" of the node bridge... */ - - size = PORT_SIZE(in); - in_high = PARAM(in_high); - in_low = PARAM(in_low); - - - - - if (INIT) { /*** Test for INIT == TRUE. If so, allocate storage, etc. ***/ - - - /* Allocate storage for inputs */ - cm_analog_alloc(0, size * (int) sizeof(double)); - - /* Allocate storage for outputs */ - cm_event_alloc(1, size * (int) sizeof(Digital_State_t)); - - /* Get analog addresses */ - in = in_old = (double *) cm_analog_get_ptr(0,0); - - /* Get discrete addresses */ - out = out_old = (Digital_State_t *) cm_event_get_ptr(1,0); - } - - else { /*** This is not an initialization pass...retrieve storage - addresses and calculate new outputs, if required. ***/ - - - /** Retrieve previous values... **/ - - /* assign discrete addresses */ - in = (double *) cm_analog_get_ptr(0,0); - in_old = (double *) cm_analog_get_ptr(0,1); - - /* assign analog addresses */ - out = (Digital_State_t *) cm_event_get_ptr(1,0); - out_old = (Digital_State_t *) cm_event_get_ptr(1,1); - - } - - - /* read current input values */ - for (i=0; i= in_high) { /* high output required */ - - test = ONE; - - if ( test != out_old[i] ) { - /* call for event breakpoint... */ - current_time = TIME; - cm_event_queue(current_time); - } - else { - /* no change since last time */ - } - - } - else { /* unknown output required */ - - if ( UNKNOWN != out_old[i] ) { - - /* call for event breakpoint... */ - current_time = TIME; - cm_event_queue(current_time); - } - else { - /* no change since last time */ - } - } - } - } - - break; - - - - case EVENT: /** discrete call...lots to do **/ - - /* loop through all inputs... */ - for (i=0; i= in_high) { /* high output required */ - - out[i] = ONE; - - if ( out[i] != out_old[i] ) { - /* post changed value */ - OUTPUT_STATE(out[i]) = ONE; - OUTPUT_DELAY(out[i]) = PARAM(rise_delay); - } - else { - /* no change since last time */ - OUTPUT_CHANGED(out[i]) = FALSE; - } - - } - else { /* unknown output required */ - - out[i] = UNKNOWN; - - if ( UNKNOWN != out_old[i] ) { - - /* post changed value */ - OUTPUT_STATE(out[i]) = UNKNOWN; - - switch (out_old[i]) { - case ONE: - OUTPUT_DELAY(out[i]) = PARAM(fall_delay); - break; - - case ZERO: - OUTPUT_DELAY(out[i]) = PARAM(rise_delay); - break; - case UNKNOWN: /* should never get here! */ - break; - } - } - else { - /* no change since last time */ - OUTPUT_CHANGED(out[i]) = FALSE; - } - } - } - /* regardless, output the strength */ - OUTPUT_STRENGTH(out[i]) = STRONG; - } - break; - } - } - else { /*** TIME == 0.0 => set outputs to input value... ***/ - /* loop through all inputs... */ - for (i=0; i= in_high) { /* high output required */ - OUTPUT_STATE(out[i]) = out[i] = ONE; - } - else { - OUTPUT_STATE(out[i]) = out[i] = UNKNOWN; - } - OUTPUT_STRENGTH(out[i]) = STRONG; - } - } -} - - - diff --git a/src/xspice/icm/digital/adc_bridge/ifspec.ifs b/src/xspice/icm/digital/adc_bridge/ifspec.ifs deleted file mode 100644 index efcd030d0..000000000 --- a/src/xspice/icm/digital/adc_bridge/ifspec.ifs +++ /dev/null @@ -1,74 +0,0 @@ -/*.......1.........2.........3.........4.........5.........6.........7.........8 -================================================================================ -Public Domain - -Georgia Tech Research Corporation -Atlanta, Georgia 30332 - - -AUTHORS - - 26 Sept 1991 Jeffrey P. Murray - - -SUMMARY - - This file contains the interface specification file for the - hybrid adc_bridge code model. - -===============================================================================*/ - -NAME_TABLE: - -Spice_Model_Name: adc_bridge -C_Function_Name: cm_adc_bridge -Description: "analog-to-digital converter node bridge" - - -PORT_TABLE: - -Port_Name: in out -Description: "input" "output" -Direction: in out -Default_Type: v d -Allowed_Types: [v,vd,i,id,vnam] [d] -Vector: yes yes -Vector_Bounds: - - -Null_Allowed: no no - - - -PARAMETER_TABLE: - -Parameter_Name: in_low -Description: "maximum 0-valued analog input" -Data_Type: real -Default_Value: 0.1 -Limits: - -Vector: no -Vector_Bounds: - -Null_Allowed: yes - - -PARAMETER_TABLE: - -Parameter_Name: in_high -Description: "minimum 1-valued analog input" -Data_Type: real -Default_Value: 0.9 -Limits: - -Vector: no -Vector_Bounds: - -Null_Allowed: yes - - -PARAMETER_TABLE: - -Parameter_Name: rise_delay fall_delay -Description: "rise delay" "fall delay" -Data_Type: real real -Default_Value: 1.0e-9 1.0e-9 -Limits: [1e-12 -] [1e-12 -] -Vector: no no -Vector_Bounds: - - -Null_Allowed: yes yes diff --git a/src/xspice/icm/digital/bidi_bridge/cfunc.mod b/src/xspice/icm/digital/bidi_bridge/cfunc.mod deleted file mode 100644 index 6f9371b4a..000000000 --- a/src/xspice/icm/digital/bidi_bridge/cfunc.mod +++ /dev/null @@ -1,446 +0,0 @@ -/* -*- mode: C;-*- (emacs magic) - * - * Simple bidirectional digital/analog bridge. - * Giles Atkinson 2022 - */ - -#include -#include -#include -#include -#include - -/* These define driver cut-off: use PARAMs? */ - -#define OFF_LOW 0.7 -#define OFF_HIGH 0.3 - -/* Structure for analogue state: input and output. */ - -struct a_data { - Digital_t i; // Previous output drive - double svoc; // Previous scaled open-circuit estimate - double o; // Previous output -}; - -/* Structure for digital state: input and output. */ - -struct d_data { - Digital_t i, n, o; // Input, new output, previous output - double i_changed; // Time of first input change. -}; - -/* Called at end to free memory. */ - -void cm_bidi_bridge(ARGS) -{ - Digital_State_t atod; - struct d_data *d; - struct a_data *a, *olda; - int i, size, dsize, strength, dir_param; - double delta, rise_delay, fall_delay, t_rise, t_fall; - - - size = PORT_SIZE(a); - dsize = PORT_NULL(dir) ? 0 : PORT_SIZE(dir); - - if (INIT) { - /* Allocate storage for previous values on both sides */ - - cm_analog_alloc(0, size * (int) sizeof (struct a_data)); - a = (struct a_data *)cm_analog_get_ptr(0, 1); - cm_event_alloc(0, size * (int) sizeof (struct d_data)); - d = (struct d_data *)cm_event_get_ptr(0, 0); - - for (i = 0; i < size; ++i) { - LOAD(d[i]) = PARAM(input_load); - a[i].o = 0.0; - a[i].i.state = UNKNOWN; - a[i].i.strength = HI_IMPEDANCE; - - /* Force port initialisation on first event call. */ - - d[i].i.state = UNKNOWN; - d[i].i.strength = UNDETERMINED; - d[i].o.state = (Digital_State_t)(UNKNOWN + 1); // Force update - d[i].n.state = UNKNOWN; - d[i].i_changed = -1.0; - OUTPUT_STATE(d[i]) = UNKNOWN; - OUTPUT_STRENGTH(d[i]) = d[i].o.strength = HI_IMPEDANCE; - } - for (i = 0; i < dsize; ++i) - LOAD(dir[i]) = PARAM(input_load); - } - - if (dsize > size) - dsize = size; - strength = PARAM(strength); - dir_param = PARAM(direction); - t_rise = PARAM(t_rise); - t_fall = PARAM(t_fall); - d = (struct d_data *)cm_event_get_ptr(0,0); - - if (CALL_TYPE == ANALOG) { - double in_high, in_low; - double out_high, out_low, drive_high, drive_low, r_high, r_low; - double r_stl, r_sth; - int smooth; // Smoothing level 0-2 (default 0). - - a = (struct a_data *)cm_analog_get_ptr(0,0); - olda = (struct a_data *)cm_analog_get_ptr(0, 1); - in_high = PARAM(in_high); - in_low = PARAM(in_low); - out_high = PARAM(out_high); - out_low = PARAM(out_low); - drive_low = PARAM(drive_low); - r_stl = PARAM(r_stl); - drive_high = PARAM(drive_high); - r_sth = PARAM(r_sth); - r_low = PARAM(r_low); - r_high = PARAM(r_high); - smooth = PARAM(smooth); - - for (i = 0; i < size; ++i) { - double svoc, voc; // Notional open-circuit voltage scaled/actual. - double in, out; - - /* Determine direction. */ - - in = INPUT(a[i]); - atod = (Digital_State_t)dir_param; - if (atod == UNKNOWN) - atod = (i < dsize) ? INPUT_STATE(dir[i]) : UNKNOWN; - - /* Analog to digital. */ - - if (atod != ZERO) { - Digital_State_t new; - - /* Determine digital output state. */ - - if (in_high < in_low) { // Hysteresis - if (in > in_low) - new = ONE; - else if (in < in_high) - new = ZERO; - else - new = d[i].o.state; // Same as before - } else { - if (in < in_low) - new = ZERO; - else if (in > in_high) - new = ONE; - else - new = UNKNOWN; - } - if (new != d[i].n.state) { - /* Output change, schedule EVENT call. */ - - d[i].n.state = new; - cm_event_queue(TIME); - } - } - - /* Digital to analog. */ - - if (atod == ONE) { - out = 0.0; /* AtoD, no analogue output. */ - svoc = 0.5; - } else { - double target, iota, interval[2], range, partial; - int step, step_count; - Digital_t drive, *dp; - - /* Find analogue output current. */ - - if (atod == UNKNOWN) { - /* What is the external drive on the digital node? */ - - drive.state = UNKNOWN; drive.strength = HI_IMPEDANCE; - if (!cm_probe_node(1, (unsigned int)i, &drive)) - cm_message_printf("Can not probe port d[%d].", i); - } else { - drive = *(Digital_t *)INPUT(d[i]); - } - a[i].i = drive; - - /* Has the input changed during this timestep? */ - - iota = (T(0) - T(1)) * 1e-6; // Ignorable - if (T(0) - d[i].i_changed < iota) { - /* Previous input value in force for whole step. */ - - step_count = 1; - step = 0; - interval[0] = T(0) - T(1); - } else if (d[i].i_changed - T(1) < iota) { - /* New input value in force for whole step. - * Includes common no-change case where new == old. - */ - - step_count = 2; - step = 1; - interval[1] = T(0) - T(1); - } else { - /* Calculate both sides of change. */ - - step_count = 2; - step = 0; - interval[0] = d[i].i_changed - T(1); - interval[1] = T(0) - d[i].i_changed; - } - - out = olda[i].o; - svoc = olda[i].svoc; - for (; step < step_count; ++step) { - double change, tv; - double max_high, max_low; - - if (step == 0) { - dp = &olda[i].i; - } else { - dp = &drive; - } - - /* Calculate new value for open-circuit output voltage. */ - - change = T(0) - T(1); - switch (dp->state) { - case ZERO: - svoc -= change / t_fall; - if (svoc < 0.0) - svoc = 0.0; - break; - case ONE: - svoc += change / t_rise; - if (svoc > 1.0) - svoc = 1.0; - break; - default: - if (dp->strength == HI_IMPEDANCE) { - svoc = 0.5; // Keeps compiler happy - } else { - /* Assume both drivers are on. */ - - if (dp->strength == STRONG) { - if (drive_high > drive_low) - tv = 1.0; - else if (drive_high > drive_low) - tv = 0.0; - else - tv = 0.5; - } else { - tv = r_low / (r_low + r_high); - } - if (svoc < tv) { - svoc += change / t_rise; - if (svoc > tv) - svoc = tv; - } else { - svoc -= change / t_fall; - if (svoc < tv) - svoc = tv; - } - } - } - if (smooth > 0) { - cm_smooth_discontinuity(svoc, 0.0, 0.0, 1.0, 1.0, - &voc, &tv); // tv is dummy. - } else { - voc = svoc; - } - - /* Available current depends on svoc (driver cut-off). */ - - max_high = drive_high; - max_high *= (voc - OFF_HIGH) / (1 - OFF_HIGH); - if (max_high < 0.0) - max_high = 0.0; - if (smooth > 1) { - cm_smooth_discontinuity(max_high, 0.0, 0.0, - drive_high, drive_high, - &max_high, &tv); - } - max_low = drive_low * (OFF_LOW - voc) / OFF_LOW; - if (max_low < 0.0) - max_low = 0.0; - if (smooth > 1) { - cm_smooth_discontinuity(max_low, 0.0, 0.0, - drive_low, drive_low, - &max_low, &tv); - } - - /* Convert to voltage. */ - - voc = out_low + (out_high - out_low) * voc; - target = 0.0; - partial = 0.0; - - /* Calculate new value for output current. */ - - switch (dp->strength) { - case STRONG: - range = drive_high + drive_low; - switch (dp->state) { - case ZERO: - target = (in - voc) / r_stl; - partial = 1.0 / r_stl; - break; - case ONE: - target = (in - voc) / r_sth; - partial = 1.0 / r_sth; - break; - case UNKNOWN: - /* Assume both drivers are on. */ - - target = (in - voc) * - ((r_stl + r_sth) / (r_stl * r_sth)); - partial = (r_stl + r_sth) / (r_stl * r_sth); - break; - } - if (target > max_low) { - target = max_low; - partial = 0.0; - } else if (target < -max_high) { - target = -max_high; - partial = 0.0; - } - if (smooth > 2) { - cm_smooth_discontinuity(target, - -max_high, -max_high, - max_low, max_low, - &target, &tv); - } - break; - case RESISTIVE: - case UNDETERMINED: // Who knows? - range = out_high / r_high + out_low / r_low; - switch (dp->state) { - case ZERO: - if (in < voc) { - target = 0.0; - } else { - target = (in - voc) / r_low; - partial = 1.0 / r_low; - } - break; - case ONE: - if (in > voc) { - target = 0.0; - } else { - target = (in - voc) / r_high; - partial = 1.0 / r_high; - } - break; - case UNKNOWN: - if (in < out_low) { - target = (in - out_high) / r_high; - partial = 1.0 / r_high; - } else if (in >= out_high) { - target = (in - out_low) / r_low; - partial = 1.0 / r_low; - } else { - /* Both drivers on. */ - - partial = 1.0 / r_low + 1.0 / r_high; - target = (in - voc ) * partial; - } - break; - } - break; - case HI_IMPEDANCE: - default: - range = fmax(drive_high, drive_low); - target = 0.0; - break; - } - - /* Can the transition complete in available time? */ - - delta = target - out; // Current - delta *= - ((delta > 0) ? t_rise : t_fall) / range; // Time - if (delta < 0) - delta = -delta; - if (delta > interval[step]) { - out += (target - out) * interval[step] / delta; - } else { - /* Transition complete. */ - - out = target; - } - } - if (partial != 0.0) - PARTIAL(a[i], a[i]) = partial; - } - OUTPUT(a[i]) = a[i].o = out; - a[i].svoc = svoc; - } - } else { - /* Digital. */ - - rise_delay = PARAM(rise_delay); - fall_delay = PARAM(fall_delay); - - for (i = 0; i < size; ++i) { - /* Determine direction. */ - - atod = (Digital_State_t)dir_param; - if (atod == UNKNOWN) - atod = (i < dsize) ? INPUT_STATE(dir[i]) : UNKNOWN; - - if (atod != ONE && (INPUT_STATE(d[i]) != d[i].i.state || - INPUT_STRENGTH(d[i]) != d[i].i.strength)) { - double transition; - - /* Digital input changed, request break. */ - - d[i].i = *(Digital_t *)INPUT(d[i]); - cm_analog_set_temp_bkpt(TIME); - d[i].i_changed = TIME; - - /* Do not let big timesteps smear the transition (it could be - * much faster with current output into high impedance. - */ - - transition = (d[i].i.state == ZERO) ? t_fall : - (d[i].i.state == ONE) ? t_rise : fmin(t_rise, t_fall); - cm_analog_set_perm_bkpt(TIME + transition * 1.0001); - } - - /* Check for output change from analogue. */ - - if (atod == ZERO) { - if (d[i].o.strength != HI_IMPEDANCE) { - OUTPUT_STATE(d[i]) = d[i].o.state = UNKNOWN; - OUTPUT_STRENGTH(d[i]) = d[i].o.strength = HI_IMPEDANCE; - OUTPUT_DELAY(d[i]) = fmax(rise_delay, fall_delay); - } else { - OUTPUT_CHANGED(d[i]) = FALSE; - } - } else { - if (d[i].o.state != d[i].n.state) { - double delay; - - OUTPUT_STATE(d[i]) = d[i].o.state = d[i].n.state; - OUTPUT_STRENGTH(d[i]) = d[i].o.strength = strength; - switch (d[i].o.state) { - case ZERO: - delay = fall_delay; - break; - case ONE: - delay = rise_delay; - break; - default: - case UNKNOWN: - delay = fmin(rise_delay, fall_delay); - break; - } - OUTPUT_DELAY(d[i]) = delay; - } else { - OUTPUT_CHANGED(d[i]) = FALSE; - } - } - } - } -} diff --git a/src/xspice/icm/digital/bidi_bridge/ifspec.ifs b/src/xspice/icm/digital/bidi_bridge/ifspec.ifs deleted file mode 100644 index 3994104d4..000000000 --- a/src/xspice/icm/digital/bidi_bridge/ifspec.ifs +++ /dev/null @@ -1,196 +0,0 @@ -/* -AUTHORS - - 24 Apr 2022 Giles Atkinson - -SUMMARY - - This file contains the interface specification file for the - hybrid bidi_bridge code model, a (potentially) bidirectional - analogue/digital bridge. The device has direction inputs - but if they are not driven it tries to behave like a piece of wire. - A parameter may override any direction inputs. - The analogue ports are type "g" as that is bidirectional. -*/ - -NAME_TABLE: - - -C_Function_Name: cm_bidi_bridge -Spice_Model_Name: bidi_bridge -Description: "bidirectional digital/analog node bridge" - - -PORT_TABLE: - -Port_Name: a d -Description: "analog" "digital in/out" -Direction: inout inout -Default_Type: g d -Allowed_Types: [g, gd] [d] -Vector: yes yes -Vector_Bounds: [1 -] [1 -] -Null_Allowed: no no - -/* The direction of the bridge ports may be controlled by digital inputs. - * If null, or the value is UNKNOWN the bridge will be truly bi-directional. - */ - -PORT_TABLE: - -Port_Name: dir -Description: "direction" -Direction: in -Default_Type: d -Allowed_Types: [d] -Vector: yes -Vector_Bounds: - -Null_Allowed: yes - -/* Alternatively, this parameter sets direction: 0-2 for DAC, ADC, ignore. - * Values 0/1 override the direction port. - */ - -PARAMETER_TABLE: - -Parameter_Name: direction input_load -Description: "force direction" "capacitive input load (F)" -Data_Type: int real -Default_Value: 2 1.0e-12 -Limits: [0 2] - -Vector: no no -Vector_Bounds: - - -Null_Allowed: yes yes - -/* Output strength is 0 (strong, default) or 1 (resistive). - * Smooth controls use of smoothing functions, default is 0 (no smoothing). - */ - -PARAMETER_TABLE: - -Parameter_Name: strength smooth -Description: "output strength" "smoothing level" -Data_Type: int int -Default_Value: 0 0 -Limits: [0 2] [0 2] -Vector: no no -Vector_Bounds: - - -Null_Allowed: yes yes - -/* Analog thresholds, in_low may be greater than in-high, enabling hysteresis. -*/ - -PARAMETER_TABLE: - -Parameter_Name: in_low -Description: "maximum 0-valued analog input" -Data_Type: real -Default_Value: 0.1 -Limits: - -Vector: no -Vector_Bounds: - -Null_Allowed: yes - -PARAMETER_TABLE: - -Parameter_Name: in_high -Description: "minimum 1-valued analog input" -Data_Type: real -Default_Value: 0.9 -Limits: - -Vector: no -Vector_Bounds: - -Null_Allowed: yes - -PARAMETER_TABLE: - -/* Analog maximum and minimum output voltages. */ - -Parameter_Name: out_low -Description: "minimum analog output voltage for 'ZERO' digital input" -Data_Type: real -Default_Value: 0.0 -Limits: - -Vector: no -Vector_Bounds: - -Null_Allowed: yes - -PARAMETER_TABLE: - -Parameter_Name: out_high -Description: "maximum analog output voltage for 'ONE' digital input" -Data_Type: real -Default_Value: 3.3 -Limits: - -Vector: no -Vector_Bounds: - -Null_Allowed: yes - -/* Analog maximum current. */ - -PARAMETER_TABLE: - -Parameter_Name: drive_low drive_high -Description: "max current to ground" "max current to ground" -Data_Type: real real -Default_Value: 0.02 0.02 -Limits: - - -Vector: no no -Vector_Bounds: - - -Null_Allowed: yes yes - -/* Strong analog output cuts off smoothly at the voltage limits. - * Let vth = out_high - r_sth * drive_high. - * Then for input voltage v, with drive_high > v > vth, - * the maximum output current is (drive_high - v) / r_sth - */ - -PARAMETER_TABLE: - -Parameter_Name: r_stl r_sth -Description: "low taper resistance" "high taper resistance" -Data_Type: real real -Default_Value: 20 20 -Limits: [1e-6 -] [1e-6 -] -Vector: no no -Vector_Bounds: - - -Null_Allowed: yes yes - -/* Resistive analog drive. */ - -PARAMETER_TABLE: - -Parameter_Name: r_low r_high -Description: "drive resistor to ground" "drive resistor to out_high" -Data_Type: real real -Default_Value: 10000 10000 -Limits: [1e-6 -] [1e-6 -] -Vector: no no -Vector_Bounds: - - -Null_Allowed: yes yes - -/* Analog rise and fall times. */ - -PARAMETER_TABLE: - -Parameter_Name: t_rise t_fall -Description: "rise time 0 -> 1" "fall time 1 -> 0" -Data_Type: real real -Default_Value: 1.0e-9 1.0e-9 -Limits: [1e-12 -] [1e-12 -] -Vector: no no -Vector_Bounds: - - -Null_Allowed: yes yes - -/* Digital rise and fall delays. */ - -PARAMETER_TABLE: - -Parameter_Name: rise_delay fall_delay -Description: "rise delay 0 -> 1" "fall delay 1 -> 0" -Data_Type: real real -Default_Value: 1.0e-9 1.0e-9 -Limits: [1e-12 -] [1e-12 -] -Vector: no no -Vector_Bounds: - - -Null_Allowed: yes yes diff --git a/src/xspice/icm/digital/d_and/cfunc.mod b/src/xspice/icm/digital/d_and/cfunc.mod deleted file mode 100644 index 8945fef48..000000000 --- a/src/xspice/icm/digital/d_and/cfunc.mod +++ /dev/null @@ -1,249 +0,0 @@ -/*.......1.........2.........3.........4.........5.........6.........7.........8 -================================================================================ - -FILE d_and/cfunc.mod - -Public Domain - -Georgia Tech Research Corporation -Atlanta, Georgia 30332 -PROJECT A-8503-405 - - -AUTHORS - - 14 June 1991 Jeffrey P. Murray - - -MODIFICATIONS - - 27 Sept 1991 Jeffrey P. Murray - - -SUMMARY - - This file contains the functional description of the d_and - code model. - - -INTERFACES - - FILE ROUTINE CALLED - - CMevt.c void *cm_event_alloc() - void *cm_event_get_ptr() - - - -REFERENCED FILES - - Inputs from and outputs to ARGS structure. - - -NON-STANDARD FEATURES - - NONE - -===============================================================================*/ - -/*=== INCLUDE FILES ====================*/ - -#include -#include -#include -#include - - - -/*=== CONSTANTS ========================*/ - - - - -/*=== MACROS ===========================*/ - - - - -/*=== LOCAL VARIABLES & TYPEDEFS =======*/ - - - - -/*=== FUNCTION PROTOTYPE DEFINITIONS ===*/ - - - - - -/*============================================================================== - -FUNCTION cm_d_and() - -AUTHORS - - 14 Jun 1991 Jeffrey P. Murray - -MODIFICATIONS - - 27 Sep 1991 Jeffrey P. Murray - -SUMMARY - - This function implements the d_and code model. - -INTERFACES - - FILE ROUTINE CALLED - - CMevt.c void *cm_event_alloc() - void *cm_event_get_ptr() - -RETURNED VALUE - - Returns inputs and outputs via ARGS structure. - -GLOBAL VARIABLES - - NONE - -NON-STANDARD FEATURES - - NONE - -==============================================================================*/ - -/*=== CM_D_AND ROUTINE ===*/ - -/************************************************ -* The following is the model for the * -* digital AND gate for the * -* ATESSE Version 2.0 system. * -* * -* Created 6/14/91 J.P.Murray * -************************************************/ - - -void cm_d_and(ARGS) - -{ - int i, /* generic loop counter index */ - size; /* number of input & output ports */ - - - - Digital_State_t *out, /* temporary output for buffers */ - *out_old, /* previous output for buffers */ - input; /* temp storage for input bits */ - - - /** Retrieve size value... **/ - size = PORT_SIZE(in); - - - - /*** Setup required state variables ***/ - - if(INIT) { /* initial pass */ - - /* allocate storage for the outputs */ - cm_event_alloc(0,sizeof(Digital_State_t)); - - /* set loading for inputs */ - for (i=0; i -#include -#include -#include - - - -/*=== CONSTANTS ========================*/ - - - - -/*=== MACROS ===========================*/ - - - - -/*=== LOCAL VARIABLES & TYPEDEFS =======*/ - - - - -/*=== FUNCTION PROTOTYPE DEFINITIONS ===*/ - - - - - -/*============================================================================== - -FUNCTION cm_d_fdiv() - -AUTHORS - - 10 Jul 1991 Jeffrey P. Murray - -MODIFICATIONS - - 22 Aug 1991 Jeffrey P. Murray - 30 Sep 1991 Jeffrey P. Murray - -SUMMARY - - This function implements the d_fdiv code model. - -INTERFACES - - FILE ROUTINE CALLED - - CMevt.c void *cm_event_alloc() - void *cm_event_get_ptr() - -RETURNED VALUE - - Returns inputs and outputs via ARGS structure. - -GLOBAL VARIABLES - - NONE - -NON-STANDARD FEATURES - - NONE - -==============================================================================*/ - -/*=== CM_D_FDIV ROUTINE ===*/ - -/************************************************ -* The following is the model for the * -* digital frequency divider for the * -* ATESSE Version 2.0 system. * -* * -* Created 7/10/91 J.P.Murray * -************************************************/ - - -void cm_d_fdiv(ARGS) - -{ - int div_factor; /* division factor */ - - - Digital_State_t *freq_in, /* freq_in clock value */ - *freq_in_old, /* previous freq_in value */ - *freq_out, /* current output for fdiv */ - *freq_out_old; /* previous output for fdiv */ - - int *count, /* counter value */ - *count_old; /* previous counter value */ - - - - /*** Setup required state variables ***/ - - if(INIT) { /* initial pass */ - - /* allocate storage */ - cm_event_alloc(0,sizeof(Digital_State_t)); - cm_event_alloc(1,sizeof(Digital_State_t)); - cm_event_alloc(2,sizeof(int)); - - /* declare load values */ - LOAD(freq_in) = PARAM(freq_in_load); - - /* retrieve storage for the outputs */ - freq_in = freq_in_old = (Digital_State_t *) cm_event_get_ptr(0,0); - freq_out = freq_out_old = (Digital_State_t *) cm_event_get_ptr(1,0); - count = count_old = (int *) cm_event_get_ptr(2,0); - - } - else { /* Retrieve previous values */ - - /* retrieve storage for the outputs */ - freq_in = (Digital_State_t *) cm_event_get_ptr(0,0); - freq_in_old = (Digital_State_t *) cm_event_get_ptr(0,1); - freq_out = (Digital_State_t *) cm_event_get_ptr(1,0); - freq_out_old = (Digital_State_t *) cm_event_get_ptr(1,1); - count = (int *) cm_event_get_ptr(2,0); - count_old = (int *) cm_event_get_ptr(2,1); - - } - - - - /*** Output the strength of freq_out (always strong)... ***/ - OUTPUT_STRENGTH(freq_out) = STRONG; - - - /** Retrieve parameters */ - div_factor = PARAM(div_factor); - - - /******* Determine analysis type and output appropriate values *******/ - - if (0.0 == TIME) { /****** DC analysis...output w/o delays ******/ - - - /* read initial count value, normalize, and if it is out of - bounds, set to "zero" equivalent */ - *count = PARAM(i_count); - if ( (div_factor <= *count) || (0 > *count) ) { - *count = 0; - OUTPUT_STATE(freq_out) = *freq_out = *freq_out_old = ZERO; - } - - if ( (0 < *count) && (*count <= PARAM(high_cycles)) ) { - OUTPUT_STATE(freq_out) = *freq_out = *freq_out_old = ONE; - } - - } - - else { /****** Transient Analysis ******/ - - /*** load current input value... ***/ - *freq_in = INPUT_STATE(freq_in); - - - /**** Test to see if the input has provided an edge... ****/ - if ( (*freq_in != *freq_in_old)&&(*freq_in == 1) ) { - - /** An edge has been provided...revise count value **/ - *count = *count_old + 1; - - /* If new count value is equal to the div_factor+1 value, - need to normalize count to "1", and raise output */ - if ( ((div_factor+1) == *count)||(1 == *count) ) { - *count = 1; - OUTPUT_STATE(freq_out) = *freq_out = ONE; - OUTPUT_DELAY(freq_out) = PARAM(rise_delay); - } - else { - /* If new count value is equal to the - high_cycles+1 value, drop the output to ZERO */ - if ( ( PARAM(high_cycles)+1) == *count ) { - OUTPUT_STATE(freq_out) = *freq_out = ZERO; - OUTPUT_DELAY(freq_out) = PARAM(fall_delay); - } - else { - OUTPUT_CHANGED(freq_out) = FALSE; - } - } - } - else { /** Output does not change!! **/ - - OUTPUT_CHANGED(freq_out) = FALSE; - - } - } -} - - - - - diff --git a/src/xspice/icm/digital/d_fdiv/ifspec.ifs b/src/xspice/icm/digital/d_fdiv/ifspec.ifs deleted file mode 100644 index 94a2c4554..000000000 --- a/src/xspice/icm/digital/d_fdiv/ifspec.ifs +++ /dev/null @@ -1,87 +0,0 @@ -/*.......1.........2.........3.........4.........5.........6.........7.........8 -================================================================================ -Public Domain - -Georgia Tech Research Corporation -Atlanta, Georgia 30332 - - -AUTHORS - - 30 Sept 1991 Jeffrey P. Murray - - -SUMMARY - - This file contains the interface specification file for the - digital d_fdiv (frequency divider) code model. - -===============================================================================*/ - -NAME_TABLE: - - -C_Function_Name: cm_d_fdiv -Spice_Model_Name: d_fdiv -Description: "digital frequency divider" - - -PORT_TABLE: - -Port_Name: freq_in freq_out -Description: "frequency input" "frequency output" -Direction: in out -Default_Type: d d -Allowed_Types: [d] [d] -Vector: no no -Vector_Bounds: - - -Null_Allowed: no no - - -PARAMETER_TABLE: - -Parameter_Name: div_factor high_cycles -Description: "divide factor" "number of high clock cycles" -Data_Type: int int -Default_Value: 2 1 -Limits: [1 -] [1 -] -Vector: no no -Vector_Bounds: - - -Null_Allowed: yes yes - - -PARAMETER_TABLE: - -Parameter_Name: i_count -Description: "output initial count value" -Data_Type: int -Default_Value: 0 -Limits: [0 -] -Vector: no -Vector_Bounds: - -Null_Allowed: yes - - -PARAMETER_TABLE: - -Parameter_Name: rise_delay fall_delay -Description: "rise delay" "fall delay" -Data_Type: real real -Default_Value: 1.0e-9 1.0e-9 -Limits: [1e-12 -] [1e-12 -] -Vector: no no -Vector_Bounds: - - -Null_Allowed: yes yes - - -PARAMETER_TABLE: - -Parameter_Name: freq_in_load -Description: "freq_in load value (F)" -Data_Type: real -Default_Value: 1.0e-12 -Limits: - -Vector: no -Vector_Bounds: - -Null_Allowed: yes - diff --git a/src/xspice/icm/digital/d_genlut/cfunc.mod b/src/xspice/icm/digital/d_genlut/cfunc.mod deleted file mode 100644 index ff8cd1424..000000000 --- a/src/xspice/icm/digital/d_genlut/cfunc.mod +++ /dev/null @@ -1,401 +0,0 @@ -/*.......1.........2.........3.........4.........5.........6.........7.........8 -================================================================================ - -FILE d_genlut/cfunc.mod - -AUTHORS - - 25 Aug 2016 Tim Edwards efabless inc., San Jose, CA - -SUMMARY - - This file contains the functional description of the d_genlut - code model. - -LICENSE - - This software is in the public domain. - -INTERFACES - - FILE ROUTINE CALLED - - CMevt.c void *cm_event_alloc() - void *cm_event_get_ptr() - - - -REFERENCED FILES - - Inputs from and outputs to ARGS structure. - - -NON-STANDARD FEATURES - - NONE - -===============================================================================*/ - -/*=== INCLUDE FILES ====================*/ - -#include -#include -#include -#include -#include - - - -/*=== CONSTANTS ========================*/ - - - - -/*=== MACROS ===========================*/ - - - - -/*=== LOCAL VARIABLES & TYPEDEFS =======*/ - - - - -/*=== FUNCTION PROTOTYPE DEFINITIONS ===*/ - - - -static void -genlut_callback(ARGS, Mif_Callback_Reason_t reason) -{ - switch (reason) { - case MIF_CB_DESTROY: { - Digital_t *loc = STATIC_VAR (locdata); - if (loc) { - free(loc); - STATIC_VAR (locdata) = NULL; - } - break; - } - } -} - - -/*============================================================================== - -FUNCTION cm_d_genlut() - -AUTHORS - - 25 Aug 2016 Tim Edwards - -SUMMARY - - This function implements the d_genlut code model. - -INTERFACES - - FILE ROUTINE CALLED - - CMevt.c void *cm_event_alloc() - void *cm_event_get_ptr() - -RETURNED VALUE - - Returns inputs and outputs via ARGS structure. - -GLOBAL VARIABLES - - NONE - -NON-STANDARD FEATURES - - NONE - -==============================================================================*/ - -/*=== CM_D_LUT ROUTINE ===*/ - -/************************************************ -* The following is the model for the * -* digital n-input LUT gate * -* * -* Created 8/25/16 Tim Edwards * -************************************************/ - - -void cm_d_genlut(ARGS) -{ - int i, /* generic loop counter index */ - j, /* lookup index bit value */ - k, /* generic loop counter index */ - idx, /* lookup index */ - ivalid, /* check for valid input */ - isize, /* number of input ports */ - osize, /* number of output ports */ - dsize, /* number of input delay params */ - rsize, /* number of output rise delay params */ - fsize, /* number of output fall delay params */ - lsize, /* number of input load params */ - entrylen, /* length of table per output (2^isize) */ - tablelen; /* length of table (osize * (2^isize)) */ - - char *table_string; - double maxdelay, /* maximum input-to-output delay */ - testdelay; - - Digital_State_t *in, /* temp storage for input bits */ - *in_old; /* previous input for buffers */ - Digital_t *out, /* temporary output for buffers */ - *out_old, /* previous output for buffers */ - *lookup_table; /* lookup table */ - - /** Retrieve size values and compute table length... **/ - isize = PORT_SIZE(in); - osize = PORT_SIZE(out); - - if (PARAM_NULL(input_load)) - lsize = 0; - else - lsize = PARAM_SIZE(input_load); - - if (PARAM_NULL(input_delay)) - dsize = 0; - else - dsize = PARAM_SIZE(input_delay); - - if (PARAM_NULL(rise_delay)) - rsize = 0; - else - rsize = PARAM_SIZE(rise_delay); - - if (PARAM_NULL(fall_delay)) - fsize = 0; - else - fsize = PARAM_SIZE(fall_delay); - - entrylen = (1 << isize); - tablelen = osize * entrylen; - - /*** Setup required state variables ***/ - - if (INIT) { /* initial pass */ - - /* allocate storage for the lookup table */ - STATIC_VAR (locdata) = calloc((size_t) tablelen, sizeof(Digital_t)); - lookup_table = STATIC_VAR (locdata); - CALLBACK = genlut_callback; - - /* allocate storage for the outputs */ - cm_event_alloc(0, osize * (int) sizeof(Digital_t)); - cm_event_alloc(1, isize * (int) sizeof(Digital_State_t)); - - /* set loading for inputs */ - for (i = 0; i < isize; i++) - if (i < lsize) - LOAD(in[i]) = PARAM(input_load[i]); - else if (lsize > 0) - LOAD(in[i]) = PARAM(input_load[lsize - 1]); - else - LOAD(in[i]) = 1.0e-12; - - /* retrieve storage for the outputs */ - out = out_old = (Digital_t *) cm_event_get_ptr(0, 0); - in = in_old = (Digital_State_t *) cm_event_get_ptr(1, 0); - - /* read parameter string into lookup table */ - table_string = PARAM(table_values); - for (idx = 0; idx < (int)strlen(table_string); idx++) { - if (idx == tablelen) - // If string is longer than 2^num_inputs, ignore - // the extra values at the end - break; - if (table_string[idx] == '1') { - lookup_table[idx].state = ONE; - lookup_table[idx].strength = STRONG; - } else if (table_string[idx] == '0') { - lookup_table[idx].state = ZERO; - lookup_table[idx].strength = STRONG; - } else if (table_string[idx] == 'z') { - lookup_table[idx].state = UNKNOWN; - lookup_table[idx].strength = HI_IMPEDANCE; - } else { - lookup_table[idx].state = UNKNOWN; - lookup_table[idx].strength = UNDETERMINED; - } - } - for (; idx < tablelen; idx++) { - // If string is shorter than 2^num_inputs, fill - // the remainder of the lookup table with UNKNOWN - // values. - lookup_table[idx].state = UNKNOWN; - lookup_table[idx].strength = UNDETERMINED; - } - } else { /* Retrieve previous values */ - - /* retrieve lookup table */ - lookup_table = STATIC_VAR (locdata); - - /* retrieve storage for the inputs and outputs */ - out = (Digital_t *) cm_event_get_ptr(0, 0); - out_old = (Digital_t *) cm_event_get_ptr(0, 1); - in = (Digital_State_t *) cm_event_get_ptr(1, 0); - in_old = (Digital_State_t *) cm_event_get_ptr(1, 1); - } - - /*** Calculate new output value based on inputs and table ***/ - - j = 1; - idx = 0; - ivalid = 1; - for (k = 0; k < osize; k++) { - out[k].state = UNKNOWN; - out[k].strength = UNDETERMINED; - } - for (i = 0; i < isize; i++) { - - /* make sure this input isn't floating... */ - if (PORT_NULL(in) == FALSE) { - - /* use inputs to find index into lookup table */ - if ((in[i] = INPUT_STATE(in[i])) == UNKNOWN) { - ivalid = 0; - break; - } else if (in[i] == ONE) { - idx += j; - } - j <<= 1; - } else { - /* at least one port is floating...output is unknown */ - ivalid = 0; - break; - } - } - - if (ivalid) - for (k = 0; k < osize; k++) - out[k] = lookup_table[idx + (k * entrylen)]; - - /*** Determine analysis type and output appropriate values ***/ - - if (ANALYSIS == DC) { /** DC analysis...output w/o delays **/ - - for (i = 0; i < osize; i++) { - OUTPUT_STATE(out[i]) = out[i].state; - OUTPUT_STRENGTH(out[i]) = out[i].strength; - } - } - else { /** Transient Analysis **/ - - /* Determine maximum input-to-output delay */ - maxdelay = 0.0; - for (i = 0; i < isize; i++) - if (in[i] != in_old[i]) { - if (i < dsize) - testdelay = PARAM(input_delay[i]); - else if (dsize > 0) - testdelay = PARAM(input_delay[dsize - 1]); - else - testdelay = 0.0; - if (maxdelay < testdelay) - maxdelay = testdelay; - } - - for (i = 0; i < osize; i++) { - if (out[i].state != out_old[i].state) { /* output value is changing */ - - OUTPUT_DELAY(out[i]) = maxdelay; - switch (out[i].state) { - - /* fall to zero value */ - case ZERO: - OUTPUT_STATE(out[i]) = ZERO; - if (i < fsize) - OUTPUT_DELAY(out[i]) += PARAM(fall_delay[i]); - else if (fsize > 0) - OUTPUT_DELAY(out[i]) += PARAM(fall_delay[fsize - 1]); - else - OUTPUT_DELAY(out[i]) += 1.0e-9; - OUTPUT_STRENGTH(out[i]) = out[i].strength; - break; - - /* rise to one value */ - case ONE: - OUTPUT_STATE(out[i]) = ONE; - if (i < rsize) - OUTPUT_DELAY(out[i]) += PARAM(rise_delay[i]); - else if (rsize > 0) - OUTPUT_DELAY(out[i]) += PARAM(rise_delay[rsize - 1]); - else - OUTPUT_DELAY(out[i]) += 1.0e-9; - OUTPUT_STRENGTH(out[i]) = out[i].strength; - break; - - /* unknown output */ - default: - OUTPUT_STATE(out[i]) = out[i].state = UNKNOWN; - OUTPUT_STRENGTH(out[i]) = out[i].strength; - - /* based on old value, add rise or fall delay */ - if (out_old[i].state == 0) { /* add rising delay */ - if (i < rsize) - OUTPUT_DELAY(out[i]) += PARAM(rise_delay[i]); - else if (rsize > 0) - OUTPUT_DELAY(out[i]) += PARAM(rise_delay[rsize - 1]); - else - OUTPUT_DELAY(out[i]) += 1.0e-9; - } else { /* add falling delay */ - if (i < fsize) - OUTPUT_DELAY(out[i]) += PARAM(fall_delay[i]); - else if (fsize > 0) - OUTPUT_DELAY(out[i]) += PARAM(fall_delay[fsize - 1]); - else - OUTPUT_DELAY(out[i]) += 1.0e-9; - } - break; - } - } else if (out[i].strength != out_old[i].strength) { - /* output strength is changing */ - OUTPUT_STRENGTH(out[i]) = out[i].strength; - switch (out[i].strength) { - case STRONG: - if (out_old[i].state == 0) { /* add falling delay */ - if (i < fsize) - OUTPUT_DELAY(out[i]) += PARAM(fall_delay[i]); - else if (fsize > 0) - OUTPUT_DELAY(out[i]) += PARAM(fall_delay[fsize - 1]); - else - OUTPUT_DELAY(out[i]) += 1.0e-9; - } else { /* add rising delay */ - if (i < rsize) - OUTPUT_DELAY(out[i]) += PARAM(rise_delay[i]); - else if (rsize > 0) - OUTPUT_DELAY(out[i]) += PARAM(rise_delay[rsize - 1]); - else - OUTPUT_DELAY(out[i]) += 1.0e-9; - } - break; - default: - if (out_old[i].state == 0) { /* add rising delay */ - if (i < rsize) - OUTPUT_DELAY(out[i]) += PARAM(rise_delay[i]); - else if (rsize > 0) - OUTPUT_DELAY(out[i]) += PARAM(rise_delay[rsize - 1]); - else - OUTPUT_DELAY(out[i]) += 1.0e-9; - } else { /* add falling delay */ - if (i < fsize) - OUTPUT_DELAY(out[i]) += PARAM(fall_delay[i]); - else if (fsize > 0) - OUTPUT_DELAY(out[i]) += PARAM(fall_delay[fsize - 1]); - else - OUTPUT_DELAY(out[i]) += 1.0e-9; - } - break; - } - } else { /* output value not changing */ - OUTPUT_CHANGED(out[i]) = FALSE; - } - } - } -} diff --git a/src/xspice/icm/digital/d_genlut/ifspec.ifs b/src/xspice/icm/digital/d_genlut/ifspec.ifs deleted file mode 100644 index c29c537be..000000000 --- a/src/xspice/icm/digital/d_genlut/ifspec.ifs +++ /dev/null @@ -1,77 +0,0 @@ -/*.......1.........2.........3.........4.........5.........6.........7.........8 -================================================================================ - -AUTHORS - - 25 Aug 2016 Tim Edwards efabless inc., San Jose, CA - -SUMMARY - - This file contains the interface specification file for the - digital d_genlut code model. - -LICENSE - - This software is in the public domain. - -===============================================================================*/ - -NAME_TABLE: - - -C_Function_Name: cm_d_genlut -Spice_Model_Name: d_genlut -Description: "digital n-input x m-output look-up table gate" - - -PORT_TABLE: - -Port_Name: in out -Description: "input" "output" -Direction: in out -Default_Type: d d -Allowed_Types: [d] [d] -Vector: yes yes -Vector_Bounds: - - -Null_Allowed: no no - - -PARAMETER_TABLE: - -Parameter_Name: rise_delay fall_delay -Description: "rise delay" "fall delay" -Data_Type: real real -Default_Value: 1.0e-9 1.0e-9 -Limits: [1e-12 -] [1e-12 -] -Vector: yes yes -Vector_Bounds: - - -Null_Allowed: yes yes - - -PARAMETER_TABLE: - -Parameter_Name: input_load input_delay -Description: "input load value (F)" "input delay" -Data_Type: real real -Default_Value: 1.0e-12 0.0 -Limits: - - -Vector: yes yes -Vector_Bounds: - - -Null_Allowed: yes yes - -PARAMETER_TABLE: - -Parameter_Name: table_values -Description: "lookup table values" -Data_Type: string -Default_Value: "0" -Limits: - -Vector: no -Vector_Bounds: - -Null_Allowed: no - -STATIC_VAR_TABLE: - -Static_Var_Name: locdata -Description: "lookup table" -Data_Type: pointer diff --git a/src/xspice/icm/digital/d_inverter/cfunc.mod b/src/xspice/icm/digital/d_inverter/cfunc.mod deleted file mode 100644 index 19d38e95a..000000000 --- a/src/xspice/icm/digital/d_inverter/cfunc.mod +++ /dev/null @@ -1,213 +0,0 @@ -/*.......1.........2.........3.........4.........5.........6.........7.........8 -================================================================================ - -FILE d_inverter/cfunc.mod - -Public Domain - -Georgia Tech Research Corporation -Atlanta, Georgia 30332 -PROJECT A-8503-405 - - -AUTHORS - - 14 Jun 1991 Jeffrey P. Murray - - -MODIFICATIONS - - 30 Sep 1991 Jeffrey P. Murray - - -SUMMARY - - This file contains the functional description of the - code model. - - -INTERFACES - - FILE ROUTINE CALLED - - CMevt.c void *cm_event_alloc() - void *cm_event_get_ptr() - - -REFERENCED FILES - - Inputs from and outputs to ARGS structure. - - -NON-STANDARD FEATURES - - NONE - -===============================================================================*/ - -/*=== INCLUDE FILES ====================*/ - -#include -#include -#include -#include - - - -/*=== CONSTANTS ========================*/ - - - - -/*=== MACROS ===========================*/ - - - - -/*=== LOCAL VARIABLES & TYPEDEFS =======*/ - - - - -/*=== FUNCTION PROTOTYPE DEFINITIONS ===*/ - - - - - -/*============================================================================== - -FUNCTION cm_d_inverter() - -AUTHORS - - 14 Jun 1991 Jeffrey P. Murray - -MODIFICATIONS - - 30 Sep 1991 Jeffrey P. Murray - -SUMMARY - - This function implements the d_inverter code model. - -INTERFACES - - FILE ROUTINE CALLED - - CMevt.c void *cm_event_alloc() - void *cm_event_get_ptr() - -RETURNED VALUE - - Returns inputs and outputs via ARGS structure. - -GLOBAL VARIABLES - - NONE - -NON-STANDARD FEATURES - - NONE - -==============================================================================*/ - -/*=== CM_D_INVERTER ROUTINE ===*/ - -/************************************************ -* The following is the model for the * -* digital inverter gate for the * -* ATESSE Version 2.0 system. * -* * -* Created 6/14/91 J.P.Murray * -************************************************/ - - -void cm_d_inverter(ARGS) - -{ - /*int i;*/ /* generic loop counter index */ - - - - Digital_State_t *out, /* temporary output for inverter */ - *out_old; /* previous output for inverter */ - - - /** Setup required state variables **/ - - if(INIT) { /* initial pass */ - - /* allocate storage for the outputs */ - cm_event_alloc(0,sizeof(Digital_State_t)); - - /* define load value on inputs */ - LOAD(in) = PARAM(input_load); - - /* retrieve storage for the outputs */ - out = out_old = (Digital_State_t *) cm_event_get_ptr(0,0); - - } - else { /* Retrieve previous values */ - - /* retrieve storage for the outputs */ - out = (Digital_State_t *) cm_event_get_ptr(0,0); - out_old = (Digital_State_t *) cm_event_get_ptr(0,1); - } - - - /** Check on analysis type **/ - - if (ANALYSIS == DC) { /* DC analysis...output w/o delays */ - - switch ( INPUT_STATE(in) ) { - - case ZERO: - OUTPUT_STATE(out) = *out = *out_old = ONE; - break; - - case ONE: - OUTPUT_STATE(out) = *out = *out_old = ZERO; - break; - - default: - OUTPUT_STATE(out) = *out = *out_old = UNKNOWN; - break; - } - - } - else { /* Transient Analysis */ - - switch ( INPUT_STATE(in) ) { - - /* fall to zero value */ - case 1: OUTPUT_STATE(out) = *out = ZERO; - OUTPUT_DELAY(out) = PARAM(fall_delay); - break; - - /* rise to one value */ - case 0: OUTPUT_STATE(out) = *out = ONE; - OUTPUT_DELAY(out) = PARAM(rise_delay); - break; - - /* unknown output */ - default: - OUTPUT_STATE(out) = *out = UNKNOWN; - - /* based on old value, add rise or fall delay */ - if (0 == *out_old) { /* add rising delay */ - OUTPUT_DELAY(out) = PARAM(rise_delay); - } - else { /* add falling delay */ - OUTPUT_DELAY(out) = PARAM(fall_delay); - } - break; - } - } - - OUTPUT_STRENGTH(out) = STRONG; -} - - - - diff --git a/src/xspice/icm/digital/d_inverter/ifspec.ifs b/src/xspice/icm/digital/d_inverter/ifspec.ifs deleted file mode 100644 index 3d0f9479a..000000000 --- a/src/xspice/icm/digital/d_inverter/ifspec.ifs +++ /dev/null @@ -1,63 +0,0 @@ -/*.......1.........2.........3.........4.........5.........6.........7.........8 -================================================================================ -Public Domain - -Georgia Tech Research Corporation -Atlanta, Georgia 30332 - - -AUTHORS - - 30 Sept 1991 Jeffrey P. Murray - - -SUMMARY - - This file contains the interface specification file for the - digital d_inverter code model. - -===============================================================================*/ - -NAME_TABLE: - - -C_Function_Name: cm_d_inverter -Spice_Model_Name: d_inverter -Description: "digital one-bit-wide inverter" - - -PORT_TABLE: - -Port_Name: in out -Description: "input" "output" -Direction: in out -Default_Type: d d -Allowed_Types: [d] [d] -Vector: no no -Vector_Bounds: - - -Null_Allowed: no no - - -PARAMETER_TABLE: - -Parameter_Name: rise_delay fall_delay -Description: "rise delay" "fall delay" -Data_Type: real real -Default_Value: 1.0e-9 1.0e-9 -Limits: [1e-12 -] [1e-12 -] -Vector: no no -Vector_Bounds: - - -Null_Allowed: yes yes - - -PARAMETER_TABLE: - -Parameter_Name: input_load -Description: "input load value (F)" -Data_Type: real -Default_Value: 1.0e-12 -Limits: - -Vector: no -Vector_Bounds: - -Null_Allowed: yes - diff --git a/src/xspice/icm/digital/d_jkff/cfunc.mod b/src/xspice/icm/digital/d_jkff/cfunc.mod deleted file mode 100644 index 4d500adf9..000000000 --- a/src/xspice/icm/digital/d_jkff/cfunc.mod +++ /dev/null @@ -1,769 +0,0 @@ -/*.......1.........2.........3.........4.........5.........6.........7.........8 -================================================================================ - -FILE d_jkff/cfunc.mod - -Public Domain - -Georgia Tech Research Corporation -Atlanta, Georgia 30332 -PROJECT A-8503-405 - - -AUTHORS - - 21 Jun 1991 Jeffrey P. Murray - - -MODIFICATIONS - - 12 Aug 1991 Jeffrey P. Murray - 30 Sep 1991 Jeffrey P. Murray - 29 Jan 1992 Jeffrey P. Murray - - -SUMMARY - - This file contains the functional description of the d_jkff - code model. - - -INTERFACES - - FILE ROUTINE CALLED - - CMutil.c void cm_toggle_bit(); - - CMevt.c void *cm_event_alloc() - void *cm_event_get_ptr() - - - -REFERENCED FILES - - Inputs from and outputs to ARGS structure. - - -NON-STANDARD FEATURES - - NONE - -===============================================================================*/ - -/*=== INCLUDE FILES ====================*/ - - - - -/*=== CONSTANTS ========================*/ - - - - -/*=== MACROS ===========================*/ - - - - -/*=== LOCAL VARIABLES & TYPEDEFS =======*/ - - - - -/*=== FUNCTION PROTOTYPE DEFINITIONS ===*/ - - - - - -/*============================================================================== - -FUNCTION cm_toggle_bit() - - -AUTHORS - - 27 Sept 1991 Jeffrey P. Murray - - -MODIFICATIONS - - NONE - - -SUMMARY - - Alters the state of a passed digital variable to its - complement. Thus, a ONE changes to a ZERO. A ZERO changes - to a ONE, and an UNKNOWN remains unchanged. - - -INTERFACES - - FILE ROUTINE CALLED - - N/A N/A - - -RETURNED VALUE - - No returned value. Passed pointer to variable is used - to redefine the variable value. - - -GLOBAL VARIABLES - - NONE - - -NON-STANDARD FEATURES - - NONE - - -===============================================================================*/ - -/*=== CM_TOGGLE_BIT ROUTINE ===*/ - -static void cm_toggle_bit(Digital_State_t *bit) - -{ - /* Toggle bit from ONE to ZERO or vice versa, unless the - bit value is UNKNOWN. In the latter case, return - without changing the bit value. */ - - if ( UNKNOWN != *bit ) { - if ( ONE == *bit ) { - *bit = ZERO; - } - else { - *bit = ONE; - } - } - -} - -/*============================================================================== - -FUNCTION cm_eval_jk_result - -AUTHORS - - 30 Sept 1991 Jeffrey P. Murray - -MODIFICATIONS - - NONE - -SUMMARY - - Evaluates the J and K input states, plus the last state of - the flip flop, and returns the expected output value. - -INTERFACES - - FILE ROUTINE CALLED - - CMutil.c void cm_toggle_bit(); - - -RETURNED VALUE - - A Digital_State_t. - -GLOBAL VARIABLES - - NONE - -NON-STANDARD FEATURES - - NONE - -==============================================================================*/ - -/*=== CM_EVAL_JK_RESULT ROUTINE ===*/ - -static Digital_State_t cm_eval_jk_result(Digital_State_t j_input, - Digital_State_t k_input, - Digital_State_t old_output) -{ - Digital_State_t output = UNKNOWN; /* returned output value */ - - - switch (j_input) { - - case ZERO: - switch (k_input) { - case ZERO: - output = old_output; - break; - case ONE: - output = ZERO; - break; - case UNKNOWN: - output = UNKNOWN; - break; - } - break; - - case ONE: - switch (k_input) { - case ZERO: - output = ONE; - break; - case ONE: - output = old_output; - cm_toggle_bit(&output); - break; - case UNKNOWN: - output = UNKNOWN; - break; - } - break; - - - case UNKNOWN: - output = UNKNOWN; - break; - } - - return output; -} - -/*============================================================================== - -FUNCTION cm_d_jkff() - -AUTHORS - - 21 Jun 1991 Jeffrey P. Murray - -MODIFICATIONS - - 12 Aug 1991 Jeffrey P. Murray - 30 Sep 1991 Jeffrey P. Murray - 29 Jan 1992 Jeffrey P. Murray - -SUMMARY - - This function implements the d_jkff code model. - -INTERFACES - - FILE ROUTINE CALLED - - CMutil.c void cm_toggle_bit(); - - CMevt.c void *cm_event_alloc() - void *cm_event_get_ptr() - -RETURNED VALUE - - Returns inputs and outputs via ARGS structure. - -GLOBAL VARIABLES - - NONE - -NON-STANDARD FEATURES - - NONE - -==============================================================================*/ - - -/*=== CM_D_JKFF ROUTINE ===*/ - -/************************************************ -* The following is the model for the * -* digital jk-type flip flop for the * -* ATESSE Version 2.0 system. * -* * -* Created 6/21/91 J.P.Murray * -************************************************/ - - -void cm_d_jkff(ARGS) - -{ - /*int i;*/ /* generic loop counter index */ - - - Digital_State_t *clk, /* current clk value */ - *clk_old, /* previous clk value */ - *set, /* current set value for dff */ - *set_old, /* previous set value for dff */ - *reset, /* current reset value for dff */ - *reset_old, /* previous reset value for dff */ - *out, /* current output for dff */ - *out_old, /* previous output for dff */ - - j_input, /* current j input value */ - k_input, /* current k input value */ - - temp; /* temp storage for state values */ - - - - /*** Setup required state variables ***/ - - if(INIT) { /* initial pass */ - - /* allocate storage */ - cm_event_alloc(0,sizeof(Digital_State_t)); - cm_event_alloc(1,sizeof(Digital_State_t)); - cm_event_alloc(2,sizeof(Digital_State_t)); - cm_event_alloc(3,sizeof(Digital_State_t)); - - /* declare load values */ - LOAD(j) = PARAM(jk_load); - LOAD(k) = PARAM(jk_load); - LOAD(clk) = PARAM(clk_load); - if ( !PORT_NULL(set) ) { - LOAD(set) = PARAM(set_load); - } - if ( !PORT_NULL(reset) ) { - LOAD(reset) = PARAM(reset_load); - } - - /* retrieve storage for the outputs */ - clk = clk_old = (Digital_State_t *) cm_event_get_ptr(0,0); - set = set_old = (Digital_State_t *) cm_event_get_ptr(1,0); - reset = reset_old = (Digital_State_t *) cm_event_get_ptr(2,0); - out = out_old = (Digital_State_t *) cm_event_get_ptr(3,0); - - } - else { /* Retrieve previous values */ - - /* retrieve storage for the outputs */ - clk = (Digital_State_t *) cm_event_get_ptr(0,0); - clk_old = (Digital_State_t *) cm_event_get_ptr(0,1); - set = (Digital_State_t *) cm_event_get_ptr(1,0); - set_old = (Digital_State_t *) cm_event_get_ptr(1,1); - reset = (Digital_State_t *) cm_event_get_ptr(2,0); - reset_old = (Digital_State_t *) cm_event_get_ptr(2,1); - out = (Digital_State_t *) cm_event_get_ptr(3,0); - out_old = (Digital_State_t *) cm_event_get_ptr(3,1); - } - - - - /******** load current input values if set or reset - are not connected, set to zero... ********/ - *clk = INPUT_STATE(clk); - if ( PORT_NULL(set) ) { - *set = *set_old = ZERO; - } - else { - *set = INPUT_STATE(set); - } - if ( PORT_NULL(reset) ) { - *reset = *reset_old = ZERO; - } - else { - *reset = INPUT_STATE(reset); - } - - - - - - /******* Determine analysis type and output appropriate values *******/ - - if (0.0 == TIME) { /****** DC analysis...output w/o delays ******/ - - temp = (Digital_State_t) PARAM(ic); - - /** Modify output if set or reset lines are active **/ - if ( (*set==ONE) && (*reset==ZERO) ) temp = ONE; - if ( (*set==ZERO) && (*reset==ONE) ) temp = ZERO; - if ( (*set==ONE) && (*reset==ONE) ) temp = UNKNOWN; - - *out = *out_old = temp; - - if ( !PORT_NULL(out) ) { - OUTPUT_STATE(out) = temp; - } - - cm_toggle_bit(&temp); - - if ( !PORT_NULL(Nout) ) { - OUTPUT_STATE(Nout) = temp; - } - - } - - else { /****** Transient Analysis ******/ - - - /***** Find input that has changed... *****/ - - /**** Test set value for change ****/ - if ( *set != *set_old ) { /* either set or set release */ - switch ( *set ) { - - case ONE: - if ( ONE != *reset) { - if (*out_old != ONE) { /* set will change output */ - /* output goes to ONE */ - *out = ONE; - - if ( !PORT_NULL(out) ) { - OUTPUT_STATE(out) = ONE; - OUTPUT_DELAY(out) = PARAM(set_delay); - } - if ( !PORT_NULL(Nout) ) { - OUTPUT_STATE(Nout) = ZERO; - OUTPUT_DELAY(Nout) = PARAM(set_delay); - } - } - else { - *out = *out_old; /* output already set */ - if ( !PORT_NULL(out) ) { - OUTPUT_CHANGED(out) = FALSE; - } - if ( !PORT_NULL(Nout) ) { - OUTPUT_CHANGED(Nout) = FALSE; - } - } - } - else { - if (*out_old != UNKNOWN) { /* set will change output */ - /* output goes to UNKNOWN */ - *out = UNKNOWN; - - if ( !PORT_NULL(out) ) { - OUTPUT_STATE(out) = UNKNOWN; - OUTPUT_DELAY(out) = PARAM(set_delay); - } - if ( !PORT_NULL(Nout) ) { - OUTPUT_STATE(Nout) = UNKNOWN; - OUTPUT_DELAY(Nout) = PARAM(set_delay); - } - } - else { - *out = *out_old; /* output already unknown */ - if ( !PORT_NULL(out) ) { - OUTPUT_CHANGED(out) = FALSE; - } - if ( !PORT_NULL(Nout) ) { - OUTPUT_CHANGED(Nout) = FALSE; - } - } - } - break; - - case ZERO: - if ( ONE != *reset) { - /* output remains at current value */ - *out = *out_old; - if ( !PORT_NULL(out) ) { - OUTPUT_CHANGED(out) = FALSE; - } - if ( !PORT_NULL(Nout) ) { - OUTPUT_CHANGED(Nout) = FALSE; - } - } - else { - if (*out_old != ZERO) { /* set will change output */ - /* output returns to reset condition */ - *out = ZERO; - - if ( !PORT_NULL(out) ) { - OUTPUT_STATE(out) = ZERO; - OUTPUT_DELAY(out) = PARAM(set_delay); - } - if ( !PORT_NULL(Nout) ) { - OUTPUT_STATE(Nout) = ONE; - OUTPUT_DELAY(Nout) = PARAM(set_delay); - } - } - else { - *out = *out_old; /* output already reset */ - if ( !PORT_NULL(out) ) { - OUTPUT_CHANGED(out) = FALSE; - } - if ( !PORT_NULL(Nout) ) { - OUTPUT_CHANGED(Nout) = FALSE; - } - } - } - break; - - case UNKNOWN: - - if ( ONE == *reset ) { - /* output goes to ZERO */ - *out = ZERO; - - if ( !PORT_NULL(out) ) { - OUTPUT_STATE(out) = ZERO; - OUTPUT_DELAY(out) = PARAM(set_delay); - } - if ( !PORT_NULL(Nout) ) { - OUTPUT_STATE(Nout) = ONE; - OUTPUT_DELAY(Nout) = PARAM(set_delay); - } - } - else { - *out = *out_old; /* output already unknown */ - if ( !PORT_NULL(out) ) { - OUTPUT_CHANGED(out) = FALSE; - } - if ( !PORT_NULL(Nout) ) { - OUTPUT_CHANGED(Nout) = FALSE; - } - } - break; - } - } - else { - - /**** Test reset value for change ****/ - if ( *reset != *reset_old ) { /* either reset or reset release */ - switch ( *reset ) { - - case ONE: - if ( ONE != *set) { - if (*out_old != ZERO) { /* reset will change output */ - /* output goes to ZERO */ - *out = ZERO; - - if ( !PORT_NULL(out) ) { - OUTPUT_STATE(out) = ZERO; - OUTPUT_DELAY(out) = PARAM(reset_delay); - } - if ( !PORT_NULL(Nout) ) { - OUTPUT_STATE(Nout) = ONE; - OUTPUT_DELAY(Nout) = PARAM(reset_delay); - } - } - else { - *out = *out_old; /* output already reset */ - if ( !PORT_NULL(out) ) { - OUTPUT_CHANGED(out) = FALSE; - } - if ( !PORT_NULL(Nout) ) { - OUTPUT_CHANGED(Nout) = FALSE; - } - } - } - else { - if (*out_old != UNKNOWN) { /* reset will change output */ - /* output goes to UNKNOWN */ - *out = UNKNOWN; - - if ( !PORT_NULL(out) ) { - OUTPUT_STATE(out) = UNKNOWN; - OUTPUT_DELAY(out) = PARAM(reset_delay); - } - if ( !PORT_NULL(Nout) ) { - OUTPUT_STATE(Nout) = UNKNOWN; - OUTPUT_DELAY(Nout) = PARAM(reset_delay); - } - } - else { - *out = *out_old; /* output already unknown */ - if ( !PORT_NULL(out) ) { - OUTPUT_CHANGED(out) = FALSE; - } - if ( !PORT_NULL(Nout) ) { - OUTPUT_CHANGED(Nout) = FALSE; - } - } - } - break; - - case ZERO: - if ( ONE != *set) { - /* output remains at current value */ - *out = *out_old; - if ( !PORT_NULL(out) ) { - OUTPUT_CHANGED(out) = FALSE; - } - if ( !PORT_NULL(Nout) ) { - OUTPUT_CHANGED(Nout) = FALSE; - } - } - else { - if (*out_old != ONE) { /* reset will change output */ - /* output returns to set condition */ - *out = ONE; - - if ( !PORT_NULL(out) ) { - OUTPUT_STATE(out) = ONE; - OUTPUT_DELAY(out) = PARAM(reset_delay); - } - if ( !PORT_NULL(Nout) ) { - OUTPUT_STATE(Nout) = ZERO; - OUTPUT_DELAY(Nout) = PARAM(reset_delay); - } - } - else { - *out = *out_old; /* output already reset */ - if ( !PORT_NULL(out) ) { - OUTPUT_CHANGED(out) = FALSE; - } - if ( !PORT_NULL(Nout) ) { - OUTPUT_CHANGED(Nout) = FALSE; - } - } - } - break; - - case UNKNOWN: - if ( ONE == *set ) { - /* output goes to ONE */ - *out = ONE; - - if ( !PORT_NULL(out) ) { - OUTPUT_STATE(out) = ONE; - OUTPUT_DELAY(out) = PARAM(reset_delay); - } - if ( !PORT_NULL(Nout) ) { - OUTPUT_STATE(Nout) = ZERO; - OUTPUT_DELAY(Nout) = PARAM(reset_delay); - } - } - else { - *out = *out_old; /* output already unknown */ - if ( !PORT_NULL(out) ) { - OUTPUT_CHANGED(out) = FALSE; - } - if ( !PORT_NULL(Nout) ) { - OUTPUT_CHANGED(Nout) = FALSE; - } - } - break; - } - } - else { - - /**** Test clk value for change ****/ - if ( (*clk != *clk_old) && (*reset != ONE) && - (*set != ONE) ) { /* clock or clock release */ - switch ( *clk ) { - - case ONE: - /* active edge...calculate new data output */ - j_input = INPUT_STATE(j); - k_input = INPUT_STATE(k); - temp = cm_eval_jk_result(j_input,k_input,*out_old); - - - if (*out_old != temp) { /* clk will change output */ - *out = temp; - - if ( !PORT_NULL(out) ) { - OUTPUT_STATE(out) = temp; - OUTPUT_DELAY(out) = PARAM(clk_delay); - } - cm_toggle_bit(&temp); - - if ( !PORT_NULL(Nout) ) { - OUTPUT_STATE(Nout) = temp; - OUTPUT_DELAY(Nout) = PARAM(clk_delay); - } - } - else { - *out = *out_old; /* output same as before */ - if ( !PORT_NULL(out) ) { - OUTPUT_CHANGED(out) = FALSE; - } - if ( !PORT_NULL(Nout) ) { - OUTPUT_CHANGED(Nout) = FALSE; - } - } - break; - - case ZERO: - case UNKNOWN: - /* inactive edge...return previous values */ - *out = *out_old; - if ( !PORT_NULL(out) ) { - OUTPUT_CHANGED(out) = FALSE; - } - if ( !PORT_NULL(Nout) ) { - OUTPUT_CHANGED(Nout) = FALSE; - } - break; - } - } - - else { /* data value must have changed... - return previous output value. */ - *out = *out_old; - if ( !PORT_NULL(out) ) { - OUTPUT_CHANGED(out) = FALSE; - } - if ( !PORT_NULL(Nout) ) { - OUTPUT_CHANGED(Nout) = FALSE; - } - } - } - } - - - /***** Add additional rise or fall delays, if appropriate *****/ - - if ( *out != *out_old ) { /*** output value is changing ***/ - - switch ( *out ) { - - /** fall to zero value **/ - case 0: - if ( !PORT_NULL(out) ) { - OUTPUT_DELAY(out) += PARAM(fall_delay); - } - if ( !PORT_NULL(Nout) ) { - OUTPUT_DELAY(Nout) += PARAM(rise_delay); - } - break; - - /** rise to one value **/ - case 1: - if ( !PORT_NULL(out) ) { - OUTPUT_DELAY(out) += PARAM(rise_delay); - } - if ( !PORT_NULL(Nout) ) { - OUTPUT_DELAY(Nout) += PARAM(fall_delay); - } - break; - - /** unknown output **/ - default: - /* based on old value, add rise or fall delay */ - if (0 == *out_old) { /* add rising delay */ - if ( !PORT_NULL(out) ) { - OUTPUT_DELAY(out) += PARAM(rise_delay); - } - if ( !PORT_NULL(Nout) ) { - OUTPUT_DELAY(Nout) += PARAM(fall_delay); - } - } - else { /* add falling delay */ - if ( !PORT_NULL(out) ) { - OUTPUT_DELAY(out) += PARAM(fall_delay); - } - if ( !PORT_NULL(Nout) ) { - OUTPUT_DELAY(Nout) += PARAM(rise_delay); - } - } - break; - } - } - } - - /*** output strength values ***/ - if ( !PORT_NULL(out) ) { - OUTPUT_STRENGTH(out) = STRONG; - } - if ( !PORT_NULL(Nout) ) { - OUTPUT_STRENGTH(Nout) = STRONG; - } -} - - - - - diff --git a/src/xspice/icm/digital/d_jkff/ifspec.ifs b/src/xspice/icm/digital/d_jkff/ifspec.ifs deleted file mode 100644 index c367014c8..000000000 --- a/src/xspice/icm/digital/d_jkff/ifspec.ifs +++ /dev/null @@ -1,136 +0,0 @@ -/*.......1.........2.........3.........4.........5.........6.........7.........8 -================================================================================ -Public Domain - -Georgia Tech Research Corporation -Atlanta, Georgia 30332 - - -AUTHORS - - 30 Sept 1991 Jeffrey P. Murray - - -SUMMARY - - This file contains the interface specification file for the - digital d_jkff code model. - -===============================================================================*/ - -NAME_TABLE: - - -C_Function_Name: cm_d_jkff -Spice_Model_Name: d_jkff -Description: "digital jk-type flip flop" - - -PORT_TABLE: - -Port_Name: j k -Description: "j input" "k input" -Direction: in in -Default_Type: d d -Allowed_Types: [d] [d] -Vector: no no -Vector_Bounds: - - -Null_Allowed: no no - - -PORT_TABLE: - -Port_Name: clk -Description: "clock" -Direction: in -Default_Type: d -Allowed_Types: [d] -Vector: no -Vector_Bounds: - -Null_Allowed: no - - -PORT_TABLE: - -Port_Name: set reset -Description: "asynch. set" "asynch. reset" -Direction: in in -Default_Type: d d -Allowed_Types: [d] [d] -Vector: no no -Vector_Bounds: - - -Null_Allowed: yes yes - - -PORT_TABLE: - -Port_Name: out Nout -Description: "data output" "inverted data output" -Direction: out out -Default_Type: d d -Allowed_Types: [d] [d] -Vector: no no -Vector_Bounds: - - -Null_Allowed: yes yes - - -PARAMETER_TABLE: - -Parameter_Name: clk_delay set_delay -Description: "delay from clk" "delay from set" -Data_Type: real real -Default_Value: 1.0e-9 1.0e-9 -Limits: [1e-12 -] [1e-12 -] -Vector: no no -Vector_Bounds: - - -Null_Allowed: yes yes - - -PARAMETER_TABLE: - -Parameter_Name: reset_delay ic -Description: "delay from reset" "output initial state" -Data_Type: real int -Default_Value: 1.0e-9 0 -Limits: [1e-12 -] [0 2] -Vector: no no -Vector_Bounds: - - -Null_Allowed: yes yes - - -PARAMETER_TABLE: - -Parameter_Name: rise_delay fall_delay -Description: "rise delay" "fall delay" -Data_Type: real real -Default_Value: 1.0e-9 1.0e-9 -Limits: [1e-12 -] [1e-12 -] -Vector: no no -Vector_Bounds: - - -Null_Allowed: yes yes - - -PARAMETER_TABLE: - -Parameter_Name: jk_load clk_load -Description: "j,k load values (F)" "clk load value (F)" -Data_Type: real real -Default_Value: 1.0e-12 1.0e-12 -Limits: - - -Vector: no no -Vector_Bounds: - - -Null_Allowed: yes yes - - -PARAMETER_TABLE: - -Parameter_Name: set_load reset_load -Description: "set load value (F)" "reset load value (F)" -Data_Type: real real -Default_Value: 1.0e-12 1.0e-12 -Limits: - - -Vector: no no -Vector_Bounds: - - -Null_Allowed: yes yes - - diff --git a/src/xspice/icm/digital/d_lut/cfunc.mod b/src/xspice/icm/digital/d_lut/cfunc.mod deleted file mode 100644 index 19c3879eb..000000000 --- a/src/xspice/icm/digital/d_lut/cfunc.mod +++ /dev/null @@ -1,269 +0,0 @@ -/*.......1.........2.........3.........4.........5.........6.........7.........8 -================================================================================ - -FILE d_lut/cfunc.mod - -AUTHORS - - 25 Aug 2016 Tim Edwards efabless inc., San Jose, CA - -SUMMARY - - This file contains the functional description of the d_lut - code model. - -LICENSE - - This software is in the public domain. - -INTERFACES - - FILE ROUTINE CALLED - - CMevt.c void *cm_event_alloc() - void *cm_event_get_ptr() - - - -REFERENCED FILES - - Inputs from and outputs to ARGS structure. - - -NON-STANDARD FEATURES - - NONE - -===============================================================================*/ - -/*=== INCLUDE FILES ====================*/ - -#include -#include -#include -#include -#include - - - -/*=== CONSTANTS ========================*/ - - - - -/*=== MACROS ===========================*/ - - - - -/*=== LOCAL VARIABLES & TYPEDEFS =======*/ - - - - -/*=== FUNCTION PROTOTYPE DEFINITIONS ===*/ - - - -static void -lut_callback(ARGS, Mif_Callback_Reason_t reason) -{ - switch (reason) { - case MIF_CB_DESTROY: { - Digital_State_t *loc = STATIC_VAR (locdata); - if (loc) { - free(loc); - STATIC_VAR (locdata) = NULL; - } - break; - } - } -} - - -/*============================================================================== - -FUNCTION cm_d_lut() - -AUTHORS - - 25 Aug 2016 Tim Edwards - -SUMMARY - - This function implements the d_lut code model. - -INTERFACES - - FILE ROUTINE CALLED - - CMevt.c void *cm_event_alloc() - void *cm_event_get_ptr() - -RETURNED VALUE - - Returns inputs and outputs via ARGS structure. - -GLOBAL VARIABLES - - NONE - -NON-STANDARD FEATURES - - NONE - -==============================================================================*/ - -/*=== CM_D_LUT ROUTINE ===*/ - -/************************************************ -* The following is the model for the * -* digital n-input LUT gate * -* * -* Created 8/25/16 Tim Edwards * -************************************************/ - - -void cm_d_lut(ARGS) -{ - int i, /* generic loop counter index */ - j, /* lookup index bit value */ - idx, /* lookup index */ - size, /* number of input & output ports */ - tablelen; /* length of table (2^size) */ - - char *table_string; - - Digital_State_t *out, /* temporary output for buffers */ - *out_old, /* previous output for buffers */ - input, /* temp storage for input bits */ - *lookup_table; /* lookup table */ - - /** Retrieve size value and compute table length... **/ - size = PORT_SIZE(in); - tablelen = 1 << size; - - /*** Setup required state variables ***/ - - if (INIT) { /* initial pass */ - - /* allocate storage for the lookup table */ - STATIC_VAR (locdata) = calloc((size_t) tablelen, sizeof(Digital_State_t)); - lookup_table = STATIC_VAR (locdata); - CALLBACK = lut_callback; - - /* allocate storage for the outputs */ - cm_event_alloc(0, sizeof(Digital_State_t)); - cm_event_alloc(1, size * (int) sizeof(Digital_State_t)); - - /* set loading for inputs */ - for (i = 0; i < size; i++) - LOAD(in[i]) = PARAM(input_load); - - /* retrieve storage for the outputs */ - out = out_old = (Digital_State_t *) cm_event_get_ptr(0, 0); - - /* read parameter string into lookup table */ - table_string = PARAM(table_values); - for (idx = 0; idx < (int) strlen(table_string); idx++) { - if (idx == tablelen) - // If string is longer than 2^num_inputs, ignore - // the extra values at the end - break; - if (table_string[idx] == '1') - lookup_table[idx] = ONE; - else if (table_string[idx] == '0') - lookup_table[idx] = ZERO; - else - lookup_table[idx] = UNKNOWN; - } - // If string is shorter than 2^num_inputs, fill - // the remainder of the lookup table with UNKNOWN values. - for (; idx < tablelen; idx++) - lookup_table[idx] = UNKNOWN; - } - else { /* Retrieve previous values */ - - /* retrieve lookup table */ - lookup_table = STATIC_VAR (locdata); - - /* retrieve storage for the outputs */ - out = (Digital_State_t *) cm_event_get_ptr(0, 0); - out_old = (Digital_State_t *) cm_event_get_ptr(0, 1); - } - - /*** Calculate new output value based on inputs and table ***/ - - *out = ZERO; - j = 1; - idx = 0; - for (i = 0; i < size; i++) { - - /* make sure this input isn't floating... */ - if (PORT_NULL(in) == FALSE) { - - /* use inputs to find index into lookup table */ - if ((input = INPUT_STATE(in[i])) == UNKNOWN) { - *out = UNKNOWN; - break; - } - else if (input == ONE) { - idx += j; - } - j <<= 1; - } - else { - /* at least one port is floating...output is unknown */ - *out = UNKNOWN; - break; - } - } - - if (*out != UNKNOWN) - *out = lookup_table[idx]; - - /*** Determine analysis type and output appropriate values ***/ - - if (ANALYSIS == DC) { /** DC analysis...output w/o delays **/ - - OUTPUT_STATE(out) = *out; - - } - - else { /** Transient Analysis **/ - - if (*out != *out_old) { /* output value is changing */ - - switch (*out) { - - /* fall to zero value */ - case 0: - OUTPUT_STATE(out) = ZERO; - OUTPUT_DELAY(out) = PARAM(fall_delay); - break; - - /* rise to one value */ - case 1: - OUTPUT_STATE(out) = ONE; - OUTPUT_DELAY(out) = PARAM(rise_delay); - break; - - /* unknown output */ - default: - OUTPUT_STATE(out) = *out = UNKNOWN; - - /* based on old value, add rise or fall delay */ - if (0 == *out_old) - OUTPUT_DELAY(out) = PARAM(rise_delay); - else - OUTPUT_DELAY(out) = PARAM(fall_delay); - break; - } - } - else { /* output value not changing */ - OUTPUT_CHANGED(out) = FALSE; - } - } - - OUTPUT_STRENGTH(out) = STRONG; -} diff --git a/src/xspice/icm/digital/d_lut/ifspec.ifs b/src/xspice/icm/digital/d_lut/ifspec.ifs deleted file mode 100644 index 05f6ca6e0..000000000 --- a/src/xspice/icm/digital/d_lut/ifspec.ifs +++ /dev/null @@ -1,77 +0,0 @@ -/*.......1.........2.........3.........4.........5.........6.........7.........8 -================================================================================ - -AUTHORS - - 25 Aug 2016 Tim Edwards efabless inc., San Jose, CA - -SUMMARY - - This file contains the interface specification file for the - digital d_lut code model. - -LICENSE - - This software is in the public domain. - -===============================================================================*/ - -NAME_TABLE: - - -C_Function_Name: cm_d_lut -Spice_Model_Name: d_lut -Description: "digital n-input look-up table gate" - - -PORT_TABLE: - -Port_Name: in out -Description: "input" "output" -Direction: in out -Default_Type: d d -Allowed_Types: [d] [d] -Vector: yes no -Vector_Bounds: [1 -] - -Null_Allowed: no no - - -PARAMETER_TABLE: - -Parameter_Name: rise_delay fall_delay -Description: "rise delay" "fall delay" -Data_Type: real real -Default_Value: 1.0e-9 1.0e-9 -Limits: [1e-12 -] [1e-12 -] -Vector: no no -Vector_Bounds: - - -Null_Allowed: yes yes - - -PARAMETER_TABLE: - -Parameter_Name: input_load -Description: "input load value (F)" -Data_Type: real -Default_Value: 1.0e-12 -Limits: - -Vector: no -Vector_Bounds: - -Null_Allowed: yes - -PARAMETER_TABLE: - -Parameter_Name: table_values -Description: "lookup table values" -Data_Type: string -Default_Value: "0" -Limits: - -Vector: no -Vector_Bounds: - -Null_Allowed: no - -STATIC_VAR_TABLE: - -Static_Var_Name: locdata -Description: "lookup table" -Data_Type: pointer diff --git a/src/xspice/icm/digital/d_nand/cfunc.mod b/src/xspice/icm/digital/d_nand/cfunc.mod deleted file mode 100644 index 5e277f6b4..000000000 --- a/src/xspice/icm/digital/d_nand/cfunc.mod +++ /dev/null @@ -1,245 +0,0 @@ -/*.......1.........2.........3.........4.........5.........6.........7.........8 -================================================================================ - -FILE d_nand/cfunc.mod - -Public Domain - -Georgia Tech Research Corporation -Atlanta, Georgia 30332 -PROJECT A-8503-405 - - -AUTHORS - - 18 June 1991 Jeffrey P. Murray - - -MODIFICATIONS - - 30 Sept 1991 Jeffrey P. Murray - - -SUMMARY - - This file contains the functional description of the d_nand - code model. - - -INTERFACES - - FILE ROUTINE CALLED - - CMevt.c void *cm_event_alloc() - void *cm_event_get_ptr() - - - -REFERENCED FILES - - Inputs from and outputs to ARGS structure. - - -NON-STANDARD FEATURES - - NONE - -===============================================================================*/ - -/*=== INCLUDE FILES ====================*/ - - - - -/*=== CONSTANTS ========================*/ - - - - -/*=== MACROS ===========================*/ - - - - -/*=== LOCAL VARIABLES & TYPEDEFS =======*/ - - - - -/*=== FUNCTION PROTOTYPE DEFINITIONS ===*/ - - - - -/*============================================================================== - -FUNCTION cm_d_nand() - -AUTHORS - - 18 Jun 1991 Jeffrey P. Murray - -MODIFICATIONS - - 30 Sep 1991 Jeffrey P. Murray - -SUMMARY - - This function implements the d_nand code model. - -INTERFACES - - FILE ROUTINE CALLED - - CMevt.c void *cm_event_alloc() - void *cm_event_get_ptr() - -RETURNED VALUE - - Returns inputs and outputs via ARGS structure. - -GLOBAL VARIABLES - - NONE - -NON-STANDARD FEATURES - - NONE - -==============================================================================*/ - -/*=== CM_D_NAND ROUTINE ===*/ - -/************************************************ -* The following is the model for the * -* digital NAND gate for the * -* ATESSE Version 2.0 system. * -* * -* Created 6/18/91 J.P.Murray * -************************************************/ - - -void cm_d_nand(ARGS) - -{ - int i, /* generic loop counter index */ - size; /* number of input & output ports */ - - - - Digital_State_t *out, /* temporary output for buffers */ - *out_old, /* previous output for buffers */ - input; /* temp storage for input bits */ - - - /** Retrieve size value... **/ - size = PORT_SIZE(in); - - - - /*** Setup required state variables ***/ - - if(INIT) { /* initial pass */ - - /* allocate storage for the outputs */ - cm_event_alloc(0,sizeof(Digital_State_t)); - - for (i=0; i * -* I * -* I t2 t3 * -* I \______________/_____ * -* I | | * -* I | | | | * -* I | | * -* I | | | | * -* I | | * -* I | | | | * -* I-----------------*-----* - - - - - - - - - -*--------- * -* t1 t4 * -* * -* * -* t2 = t1 + rise_delay * -* t4 = t3 + fall_delay * -* * -* Note that for the digital model, unlike for the * -* analog "square" model, t1 and t3 are stored and * -* adjusted values, but t2 & t4 are implied by the * -* rise and fall delays of the model, but are otherwise * -* not stored values. JPM * -* * -*************************************************************/ - -#include - -void cm_d_osc(ARGS) -{ - - double *x, /* analog input value control array */ - *y, /* frequency array */ - cntl_input, /* control input value */ - *phase, /* instantaneous phase of the model */ - *phase_old, /* previous phase of the model */ - *t1, /* pointer to t1 value */ - *t3, /* pointer to t3 value */ - /*time1,*/ /* variable for calculating new time1 value */ - /*time3,*/ /* variable for calculating new time3 value */ - freq = 0.0, /* instantaneous frequency value */ - dphase, /* fractional part into cycle */ - duty_cycle, /* duty_cycle value */ - test_double, /* testing variable */ - slope; /* slope value...used to extrapolate - freq values past endpoints. */ - - - int i, /* generic loop counter index */ - cntl_size, /* control array size */ - freq_size; /* frequency array size */ - - - - - - - /**** Retrieve frequently used parameters... ****/ - - cntl_size = PARAM_SIZE(cntl_array); - freq_size = PARAM_SIZE(freq_array); - duty_cycle = PARAM(duty_cycle); - - - /* check and make sure that the control array is the - same size as the frequency array */ - - if(cntl_size != freq_size){ - cm_message_send(d_osc_array_error); - return; - } - - - if (INIT) { /*** Test for INIT == TRUE. If so, allocate storage, etc. ***/ - - - /* Allocate storage for internal variables */ - cm_analog_alloc(0, sizeof(double)); - cm_analog_alloc(1, sizeof(double)); - cm_analog_alloc(2, sizeof(double)); - - /* assign internal variables */ - phase = phase_old = (double *) cm_analog_get_ptr(0,0); - - t1 = (double *) cm_analog_get_ptr(1,0); - - t3 = (double *) cm_analog_get_ptr(2,0); - - } - - else { /*** This is not an initialization pass...retrieve storage - addresses and calculate new outputs, if required. ***/ - - - /** Retrieve previous values... **/ - - - /* assign internal variables */ - phase = (double *) cm_analog_get_ptr(0,0); - phase_old = (double *) cm_analog_get_ptr(0,1); - - t1 = (double *) cm_analog_get_ptr(1,0); - - t3 = (double *) cm_analog_get_ptr(2,0); - - } - - - - - switch (CALL_TYPE) { - - case ANALOG: /** analog call **/ - - test_double = TIME; - - if ( AC == ANALYSIS ) { /* this model does not function - in AC analysis mode. */ - - return; - - } - else { - - if ( 0.0 == TIME ) { /* DC analysis */ - - /* retrieve & normalize phase value */ - *phase = PARAM(init_phase); - if ( 0 > *phase ) { - *phase = *phase + 360.0; - } - *phase = *phase / 360.0; - - - /* set phase value to init_phase */ - *phase_old = *phase; - - /* preset time values to harmless values... */ - *t1 = -1; - *t3 = -1; - - - } - - - /* Allocate storage for breakpoint domain & freq. range values */ - - x = (double *) calloc((size_t) cntl_size, sizeof(double)); - if (!x) { - cm_message_send(d_osc_allocation_error); - return; - } - - y = (double *) calloc((size_t) freq_size, sizeof(double)); - if (!y) { - cm_message_send(d_osc_allocation_error); - if(x) free(x); - return; - } - - /* Retrieve x and y values. */ - for (i=0; i= x[cntl_size-1]) { - - slope = (y[cntl_size-1] - y[cntl_size-2]) / - (x[cntl_size-1] - x[cntl_size-2]); - freq = y[cntl_size-1] + (cntl_input - x[cntl_size-1]) * slope; - - } - else { /*** cntl_input within bounds of end midpoints... - must determine position progressively & then - calculate required output. ***/ - - for (i=0; i= x[i]) ) { - - /* Interpolate to the correct frequency value */ - - freq = ( (cntl_input - x[i]) / (x[i+1] - x[i]) ) * - ( y[i+1]-y[i] ) + y[i]; - } - } - } - - /*** If freq < 0.0, clamp to 1e-16 & issue a warning ***/ - if ( 0.0 > freq ) { - freq = 1.0e-16; - cm_message_send(d_osc_negative_freq_error); - } - - - /* calculate the instantaneous phase */ - *phase = *phase_old + freq * (TIME - T(1)); - - /* dphase is the percent into the cycle for - the period */ - dphase = *phase_old - floor(*phase_old); - - - /* Calculate the time variables and the output value - for this iteration */ - - if((*t1 <= TIME) && (TIME <= *t3)) { /* output high */ - - *t3 = T(1) + (1 - dphase)/freq; - - if(TIME < *t3) { - cm_event_queue(*t3); - } - - - } - else - - if((*t3 <= TIME) && (TIME <= *t1)) { /* output low */ - - if(dphase > (1.0 - duty_cycle) ) { - dphase = dphase - 1.0; - } - *t1 = T(1) + ( (1.0 - duty_cycle) - dphase)/freq; - - if(TIME < *t1) { - - cm_event_queue(*t1); - - } - } - else { - - if(dphase > (1.0 - duty_cycle) ) { - dphase = dphase - 1.0; - } - *t1 = T(1) + ( (1.0 - duty_cycle) - dphase )/freq; - - if((TIME < *t1) || (T(1) == 0)) { - cm_event_queue(*t1); - } - - *t3 = T(1) + (1 - dphase)/freq; - - - } - - - - if(x) free(x); - if(y) free(y); - - - } - break; - - - case EVENT: /** discrete call...lots to do **/ - - - test_double = TIME; - - if ( 0.0 == TIME ) { /* DC analysis...preset values, - as appropriate.... */ - - /* retrieve & normalize phase value */ - *phase = PARAM(init_phase); - if ( 0 > *phase ) { - *phase = *phase + 360.0; - } - *phase = *phase / 360.0; - - - /* set phase value to init_phase */ - *phase_old = *phase; - - /* preset time values to harmless values... */ - *t1 = -1; - *t3 = -1; - } - - - - /* Calculate the time variables and the output value - for this iteration */ - - /* Output is always set to STRONG */ - OUTPUT_STRENGTH(out) = STRONG; - - - - if( *t1 == TIME ) { /* rising edge */ - - OUTPUT_STATE(out) = ONE; - OUTPUT_DELAY(out) = PARAM(rise_delay); - - } - else { - - if ( *t3 == TIME ) { /* falling edge */ - - OUTPUT_STATE(out) = ZERO; - OUTPUT_DELAY(out) = PARAM(fall_delay); - } - - else { /* no change in output */ - - if ( TIME != 0.0 ) { - OUTPUT_CHANGED(out) = FALSE; - } - - if ( (*t1 < TIME) && (TIME < *t3) ) { - OUTPUT_STATE(out) = ONE; - } - else { - OUTPUT_STATE(out) = ZERO; - } - } - } - - break; - - } -} - - - - - - - diff --git a/src/xspice/icm/digital/d_osc/d_osc.h b/src/xspice/icm/digital/d_osc/d_osc.h deleted file mode 100644 index 40c1c1905..000000000 --- a/src/xspice/icm/digital/d_osc/d_osc.h +++ /dev/null @@ -1,90 +0,0 @@ -/*.......1.........2.........3.........4.........5.........6.........7.........8 -================================================================================ - -FILE d_osc/d_osc.h - -Public Domain - -Georgia Tech Research Corporation -Atlanta, Georgia 30332 -PROJECT A-8503-405 - - -AUTHORS - - 25 Jul 1991 Jeffrey P. Murray - - -MODIFICATIONS - - 30 Sept 1991 Jeffrey P. Murray - - -SUMMARY - - This file contains the header information for the d_osc - code model. - - -INTERFACES - - FILE ROUTINE CALLED - - N/A N/A - - - -REFERENCED FILES - - N/A - - -NON-STANDARD FEATURES - - NONE - -===============================================================================*/ -/* - Structures, etc. for d_osc oscillator model. - 7/25/90 - Last Modified 7/25/91 J.P.Murray */ - -/*=======================================================================*/ - -/*=== INCLUDE FILES =====================================================*/ - -#include -#include -#include -#include - - - - -/*=== CONSTANTS =========================================================*/ - - -/**** Error Messages ****/ -char *d_osc_allocation_error = "\n**** Error ****\nD_OSC: Error allocating VCO block storage \n"; -char *d_osc_array_error = "\n**** Error ****\nD_OSC: Size of control array different than frequency array \n"; -char *d_osc_negative_freq_error = "\n**** Error ****\nD_OSC: The extrapolated value for frequency\nhas been found to be negative... \n Lower frequency level has been clamped to 0.0 Hz \n"; - - - - - - -/*=== MACROS ============================================================*/ - - - -/*=== LOCAL VARIABLES & TYPEDEFS ========================================*/ - - - -/*=== FUNCTION PROTOTYPE DEFINITIONS ====================================*/ - - -/*=======================================================================*/ - - diff --git a/src/xspice/icm/digital/d_osc/ifspec.ifs b/src/xspice/icm/digital/d_osc/ifspec.ifs deleted file mode 100644 index 8d9e56164..000000000 --- a/src/xspice/icm/digital/d_osc/ifspec.ifs +++ /dev/null @@ -1,75 +0,0 @@ -/*.......1.........2.........3.........4.........5.........6.........7.........8 -================================================================================ -Public Domain - -Georgia Tech Research Corporation -Atlanta, Georgia 30332 - - -AUTHORS - - 30 Sept 1991 Jeffrey P. Murray - - -SUMMARY - - This file contains the interface specification file for the - hybrid d_osc code model. - -===============================================================================*/ - -NAME_TABLE: - -Spice_Model_Name: d_osc -C_Function_Name: cm_d_osc -Description: "controlled digital oscillator" - - -PORT_TABLE: - -Port_Name: cntl_in out -Description: "control input" "output" -Direction: in out -Default_Type: v d -Allowed_Types: [v,vd,i,id] [d] -Vector: no no -Vector_Bounds: - - -Null_Allowed: no no - - - -PARAMETER_TABLE: - -Parameter_Name: cntl_array freq_array -Description: "control array" "frequency array" -Data_Type: real real -Default_Value: 0.0 1.0e6 -Limits: - [0 -] -Vector: yes yes -Vector_Bounds: [2 -] [2 -] -Null_Allowed: no no - - -PARAMETER_TABLE: - -Parameter_Name: duty_cycle init_phase -Description: "output duty cycle" "initial phase of output" -Data_Type: real real -Default_Value: 0.5 0 -Limits: [1e-6 0.999999] [-180.0 +360.0] -Vector: no no -Vector_Bounds: - - -Null_Allowed: yes yes - - -PARAMETER_TABLE: - -Parameter_Name: rise_delay fall_delay -Description: "rise delay" "fall delay" -Data_Type: real real -Default_Value: 1e-9 1e-9 -Limits: [0 -] [0 -] -Vector: no no -Vector_Bounds: - - -Null_Allowed: yes yes - diff --git a/src/xspice/icm/digital/d_pulldown/cfunc.mod b/src/xspice/icm/digital/d_pulldown/cfunc.mod deleted file mode 100644 index 5cdf80cff..000000000 --- a/src/xspice/icm/digital/d_pulldown/cfunc.mod +++ /dev/null @@ -1,133 +0,0 @@ -/*.......1.........2.........3.........4.........5.........6.........7.........8 -================================================================================ - -FILE d_pulldown/cfunc.mod - -Public Domain - -Georgia Tech Research Corporation -Atlanta, Georgia 30332 -PROJECT A-8503-405 - - -AUTHORS - - 19 Nov 1991 Jeffrey P. Murray - - -MODIFICATIONS - - 19 Nov 1991 Jeffrey P. Murray - - -SUMMARY - - This file contains the functional description of the d_pulldown - code model. - - -INTERFACES - - FILE ROUTINE CALLED - - CMevt.c void *cm_event_alloc() - void *cm_event_get_ptr() - - - -REFERENCED FILES - - Inputs from and outputs to ARGS structure. - - -NON-STANDARD FEATURES - - NONE - -===============================================================================*/ - -/*=== INCLUDE FILES ====================*/ - - - - -/*=== CONSTANTS ========================*/ - - - - -/*=== MACROS ===========================*/ - - - - -/*=== LOCAL VARIABLES & TYPEDEFS =======*/ - - - - -/*=== FUNCTION PROTOTYPE DEFINITIONS ===*/ - - - - - -/*============================================================================== - -FUNCTION cm_d_pulldown() - -AUTHORS - - 19 Nov 1991 Jeffrey P. Murray - -MODIFICATIONS - - 19 Nov 1991 Jeffrey P. Murray - -SUMMARY - - This function implements the d_pulldown code model. - -INTERFACES - - FILE ROUTINE CALLED - - CMevt.c void *cm_event_alloc() - void *cm_event_get_ptr() - -RETURNED VALUE - - Returns inputs and outputs via ARGS structure. - -GLOBAL VARIABLES - - NONE - -NON-STANDARD FEATURES - - NONE - -==============================================================================*/ - -/*=== CM_D_PULLDOWN ROUTINE ===*/ - -/************************************************ -* The following is the model for the * -* digital pulldown resistor for the * -* ATESSE Version 2.0 system. * -* * -* Created 11/19/91 J.P,Murray * -************************************************/ - - -void cm_d_pulldown(ARGS) - -{ - LOAD(out) = PARAM(load); - OUTPUT_STATE(out) = ZERO; - OUTPUT_STRENGTH(out) = RESISTIVE; -} - - - - diff --git a/src/xspice/icm/digital/d_pulldown/ifspec.ifs b/src/xspice/icm/digital/d_pulldown/ifspec.ifs deleted file mode 100644 index b4d819468..000000000 --- a/src/xspice/icm/digital/d_pulldown/ifspec.ifs +++ /dev/null @@ -1,52 +0,0 @@ -/*.......1.........2.........3.........4.........5.........6.........7.........8 -================================================================================ -Public Domain - -Georgia Tech Research Corporation -Atlanta, Georgia 30332 - - -AUTHORS - - 19 Nov 1991 Jeffrey P. Murray - - -SUMMARY - - This file contains the interface specification file for the - digital d_pulldown code model. - -===============================================================================*/ - - -NAME_TABLE: - -Spice_Model_Name: d_pulldown -C_Function_Name: cm_d_pulldown -Description: "digital pulldown resistor" - - -PORT_TABLE: - -Port_Name: out -Description: "output" -Direction: out -Default_Type: d -Allowed_Types: [d] -Vector: no -Vector_Bounds: - -Null_Allowed: no - - -PARAMETER_TABLE: - -Parameter_Name: load -Description: "load value (F)" -Data_Type: real -Default_Value: 1.0e-12 -Limits: - -Vector: no -Vector_Bounds: - -Null_Allowed: yes - - diff --git a/src/xspice/icm/digital/d_pullup/cfunc.mod b/src/xspice/icm/digital/d_pullup/cfunc.mod deleted file mode 100644 index f64439fe2..000000000 --- a/src/xspice/icm/digital/d_pullup/cfunc.mod +++ /dev/null @@ -1,129 +0,0 @@ -/*.......1.........2.........3.........4.........5.........6.........7.........8 -================================================================================ - -FILE d_pullup/cfunc.mod - -Public Domain - -Georgia Tech Research Corporation -Atlanta, Georgia 30332 -PROJECT A-8503-405 - - -AUTHORS - - 19 Nov 1991 Jeffrey P. Murray - - -MODIFICATIONS - - 19 Nov 1991 Jeffrey P. Murray - - -SUMMARY - - This file contains the functional description of the d_pullup - code model. - - -INTERFACES - - FILE ROUTINE CALLED - - CMevt.c void *cm_event_alloc() - void *cm_event_get_ptr() - - - -REFERENCED FILES - - Inputs from and outputs to ARGS structure. - - -NON-STANDARD FEATURES - - NONE - -===============================================================================*/ - -/*=== INCLUDE FILES ====================*/ - - - - -/*=== CONSTANTS ========================*/ - - - - -/*=== MACROS ===========================*/ - - - - -/*=== LOCAL VARIABLES & TYPEDEFS =======*/ - - - - -/*=== FUNCTION PROTOTYPE DEFINITIONS ===*/ - - - - - -/*============================================================================== - -FUNCTION cm_d_pullup() - -AUTHORS - - 19 Nov 1991 Jeffrey P. Murray - -MODIFICATIONS - - 19 Nov 1991 Jeffrey P. Murray - -SUMMARY - - This function implements the d_pullup code model. - -INTERFACES - - FILE ROUTINE CALLED - - CMevt.c void *cm_event_alloc() - void *cm_event_get_ptr() - -RETURNED VALUE - - Returns inputs and outputs via ARGS structure. - -GLOBAL VARIABLES - - NONE - -NON-STANDARD FEATURES - - NONE - -==============================================================================*/ - -/*=== CM_D_PULLUP ROUTINE ===*/ - -/************************************************ -* The following is the model for the * -* digital pullup resistor for the * -* ATESSE Version 2.0 system. * -* * -* Created 11/19/91 J.P,Murray * -************************************************/ - - -void cm_d_pullup(ARGS) - -{ - LOAD(out) = PARAM(load); - OUTPUT_STATE(out) = ONE; - OUTPUT_STRENGTH(out) = RESISTIVE; -} diff --git a/src/xspice/icm/digital/d_pullup/ifspec.ifs b/src/xspice/icm/digital/d_pullup/ifspec.ifs deleted file mode 100644 index 491607678..000000000 --- a/src/xspice/icm/digital/d_pullup/ifspec.ifs +++ /dev/null @@ -1,52 +0,0 @@ -/*.......1.........2.........3.........4.........5.........6.........7.........8 -================================================================================ -Public Domain - -Georgia Tech Research Corporation -Atlanta, Georgia 30332 - - -AUTHORS - - 19 Nov 1991 Jeffrey P. Murray - - -SUMMARY - - This file contains the interface specification file for the - digital d_pullup code model. - -===============================================================================*/ - - -NAME_TABLE: - -Spice_Model_Name: d_pullup -C_Function_Name: cm_d_pullup -Description: "digital pullup resistor" - - -PORT_TABLE: - -Port_Name: out -Description: "output" -Direction: out -Default_Type: d -Allowed_Types: [d] -Vector: no -Vector_Bounds: - -Null_Allowed: no - - -PARAMETER_TABLE: - -Parameter_Name: load -Description: "load value (F)" -Data_Type: real -Default_Value: 1.0e-12 -Limits: - -Vector: no -Vector_Bounds: - -Null_Allowed: yes - - diff --git a/src/xspice/icm/digital/d_pwm/cfunc.mod b/src/xspice/icm/digital/d_pwm/cfunc.mod deleted file mode 100644 index af6e323c8..000000000 --- a/src/xspice/icm/digital/d_pwm/cfunc.mod +++ /dev/null @@ -1,485 +0,0 @@ -/*.......1.........2.........3.........4.........5.........6.........7.........8 -================================================================================ - -FILE d_pwm/cfunc.mod - -Public Domain - -Georgia Tech Research Corporation -Atlanta, Georgia 30332 -PROJECT A-8503-405 -The ngspice team - -AUTHORS - - 24 Jul 1991 Jeffrey P. Murray - 02 Mar 2022 Holger Vogt - -MODIFICATIONS - - 23 Aug 1991 Jeffrey P. Murray - 30 Sep 1991 Jeffrey P. Murray - - -SUMMARY - - This file contains the model-specific routines used to - functionally describe the d_pwm code model. - - -INTERFACES - - FILE ROUTINE CALLED - - CMmacros.h cm_message_send(); - - CM.c void *cm_analog_alloc() - void *cm_analog_get_ptr() - - CMevt.c void cm_event_queue() - - -REFERENCED FILES - - Inputs from and outputs to ARGS structure. - - -NON-STANDARD FEATURES - - NONE - -===============================================================================*/ - -/*=== INCLUDE FILES ====================*/ - -#include "d_pwm.h" /* ...contains macros & type defns. - for this model. 7/24/91 - JPM */ - - - -/*=== CONSTANTS ========================*/ - - - - -/*=== MACROS ===========================*/ - - - - -/*=== LOCAL VARIABLES & TYPEDEFS =======*/ - - - - -/*=== FUNCTION PROTOTYPE DEFINITIONS ===*/ - - - - - -/*============================================================================== - -FUNCTION cm_d_pwm() - -AUTHORS - - 24 Jul 1991 Jeffrey P. Murray - 02 Mar 2022 Holger Vogt - -MODIFICATIONS - - 30 Sep 1991 Jeffrey P. Murray - -SUMMARY - - This function implements the d_pwm code model. - -INTERFACES - - FILE ROUTINE CALLED - - CMmacros.h cm_message_send(); - - CM.c void *cm_analog_alloc() - void *cm_analog_get_ptr() - - CMevt.c void cm_event_queue() - -RETURNED VALUE - - Returns inputs and outputs via ARGS structure. - -GLOBAL VARIABLES - - NONE - -NON-STANDARD FEATURES - - NONE - -==============================================================================*/ - -/*=== CM_D_PWM ROUTINE ===*/ - -/************************************************************* -* The following is the model for a duty cycle controlled * -* digital oscillator, derived from the controlled digital * -* oscillator d_osc. * -* * -* Created 3/02/2022 H. Vogt * -*************************************************************/ - -/************************************************************* -* * -* * -* <-----duty_cycle-----> * -* I * -* I t2 t3 * -* I \______________/_____ * -* I | | * -* I | | | | * -* I | | * -* I | | | | * -* I | | * -* I | | | | * -* I-----------------*-----* - - - - - - - - - -*--------- * -* t1 t4 * -* * -* * -* t2 = t1 + rise_delay * -* t4 = t3 + fall_delay * -* * -* Note that for the digital model, unlike for the * -* analog "square" model, t1 and t3 are stored and * -* adjusted values, but t2 & t4 are implied by the * -* rise and fall delays of the model, but are otherwise * -* not stored values. JPM * -* * -*************************************************************/ - -#include - -void cm_d_pwm(ARGS) -{ - - double *x, /* analog input value control array */ - *y, /* frequency array */ - cntl_input, /* control input value */ - *phase, /* instantaneous phase of the model */ - *phase_old, /* previous phase of the model */ - *t1, /* pointer to t1 value */ - *t3, /* pointer to t3 value */ - /*time1,*/ /* variable for calculating new time1 value */ - /*time3,*/ /* variable for calculating new time3 value */ - dc = 0.5, /* instantaneous duty cycle value */ - dphase, /* fractional part into cycle */ - frequency, /* frequency value */ - test_double, /* testing variable */ - slope; /* slope value...used to extrapolate - freq values past endpoints. */ - - - int i, /* generic loop counter index */ - cntl_size, /* control array size */ - dc_size; /* duty cycle array size */ - - - - - - - /**** Retrieve frequently used parameters... ****/ - - cntl_size = PARAM_SIZE(cntl_array); - dc_size = PARAM_SIZE(dc_array); - frequency = PARAM(frequency); - - - /* check and make sure that the control array is the - same size as the frequency array */ - - if(cntl_size != dc_size){ - cm_message_send(d_pwm_array_error); - return; - } - - - if (INIT) { /*** Test for INIT == TRUE. If so, allocate storage, etc. ***/ - - - /* Allocate storage for internal variables */ - cm_analog_alloc(0, sizeof(double)); - cm_analog_alloc(1, sizeof(double)); - cm_analog_alloc(2, sizeof(double)); - - /* assign internal variables */ - phase = phase_old = (double *) cm_analog_get_ptr(0,0); - - t1 = (double *) cm_analog_get_ptr(1,0); - - t3 = (double *) cm_analog_get_ptr(2,0); - - } - - else { /*** This is not an initialization pass...retrieve storage - addresses and calculate new outputs, if required. ***/ - - - /** Retrieve previous values... **/ - - - /* assign internal variables */ - phase = (double *) cm_analog_get_ptr(0,0); - phase_old = (double *) cm_analog_get_ptr(0,1); - - t1 = (double *) cm_analog_get_ptr(1,0); - - t3 = (double *) cm_analog_get_ptr(2,0); - - } - - - - - switch (CALL_TYPE) { - - case ANALOG: /** analog call **/ - - test_double = TIME; - - if ( AC == ANALYSIS ) { /* this model does not function - in AC analysis mode. */ - - return; - - } - else { - - if ( 0.0 == TIME ) { /* DC analysis */ - - /* retrieve & normalize phase value */ - *phase = PARAM(init_phase); - if ( 0 > *phase ) { - *phase = *phase + 360.0; - } - *phase = *phase / 360.0; - - - /* set phase value to init_phase */ - *phase_old = *phase; - - /* preset time values to harmless values... */ - *t1 = -1; - *t3 = -1; - - - } - - - /* Allocate storage for breakpoint domain & duty cycle range values */ - - x = (double *) calloc((size_t) cntl_size, sizeof(double)); - if (!x) { - cm_message_send(d_pwm_allocation_error); - return; - } - - y = (double *) calloc((size_t) dc_size, sizeof(double)); - if (!y) { - cm_message_send(d_pwm_allocation_error); - if(x) free(x); - return; - } - - /* Retrieve x and y values. */ - for (i=0; i= x[cntl_size-1]) { - - slope = (y[cntl_size-1] - y[cntl_size-2]) / - (x[cntl_size-1] - x[cntl_size-2]); - dc = y[cntl_size-1] + (cntl_input - x[cntl_size-1]) * slope; - - } - else { /*** cntl_input within bounds of end midpoints... - must determine position progressively & then - calculate required output. ***/ - - for (i=0; i= x[i]) ) { - - /* Interpolate to the correct duty cycle value */ - - dc = ( (cntl_input - x[i]) / (x[i+1] - x[i]) ) * - ( y[i+1]-y[i] ) + y[i]; - } - } - } - - /*** If dc < 0.0, clamp to 0 & issue a warning ***/ - if ( 0.0 > dc ) { - dc = 0; -// cm_message_send(d_pwm_negative_dc_error); - } - /*** If dc > 1.0, clamp to 1 & issue a warning ***/ - if ( 1.0 < dc ) { - dc = 1; -// cm_message_send(d_pwm_positive_dc_error); - } - - - /* calculate the instantaneous phase */ - *phase = *phase_old + frequency * (TIME - T(1)); - - /* dphase is the percent into the cycle for - the period */ - dphase = *phase_old - floor(*phase_old); - - - /* Calculate the time variables and the output value - for this iteration */ - - if((*t1 <= TIME) && (TIME <= *t3)) { /* output high */ - - *t3 = T(1) + (1 - dphase)/frequency; - - if(TIME < *t3) { - cm_event_queue(*t3); - } - - - } - else - - if((*t3 <= TIME) && (TIME <= *t1)) { /* output low */ - - if(dphase > (1.0 - dc) ) { - dphase = dphase - 1.0; - } - *t1 = T(1) + ( (1.0 - dc) - dphase)/frequency; - - if(TIME < *t1) { - - cm_event_queue(*t1); - - } - } - else { - - if(dphase > (1.0 - dc) ) { - dphase = dphase - 1.0; - } - *t1 = T(1) + ( (1.0 - dc) - dphase )/frequency; - - if((TIME < *t1) || (T(1) == 0)) { - cm_event_queue(*t1); - } - - *t3 = T(1) + (1 - dphase)/frequency; - - - } - - - - if(x) free(x); - if(y) free(y); - - - } - break; - - - case EVENT: /** discrete call...lots to do **/ - - - test_double = TIME; - - if ( 0.0 == TIME ) { /* DC analysis...preset values, - as appropriate.... */ - - /* retrieve & normalize phase value */ - *phase = PARAM(init_phase); - if ( 0 > *phase ) { - *phase = *phase + 360.0; - } - *phase = *phase / 360.0; - - - /* set phase value to init_phase */ - *phase_old = *phase; - - /* preset time values to harmless values... */ - *t1 = -1; - *t3 = -1; - } - - - - /* Calculate the time variables and the output value - for this iteration */ - - /* Output is always set to STRONG */ - OUTPUT_STRENGTH(out) = STRONG; - - - - if( *t1 == TIME ) { /* rising edge */ - - OUTPUT_STATE(out) = ONE; - OUTPUT_DELAY(out) = PARAM(rise_delay); - - } - else { - - if ( *t3 == TIME ) { /* falling edge */ - - OUTPUT_STATE(out) = ZERO; - OUTPUT_DELAY(out) = PARAM(fall_delay); - } - - else { /* no change in output */ - - if ( TIME != 0.0 ) { - OUTPUT_CHANGED(out) = FALSE; - } - - if ( (*t1 < TIME) && (TIME < *t3) ) { - OUTPUT_STATE(out) = ONE; - } - else { - OUTPUT_STATE(out) = ZERO; - } - } - } - - break; - - } -} - - - - - - - diff --git a/src/xspice/icm/digital/d_pwm/d_pwm.h b/src/xspice/icm/digital/d_pwm/d_pwm.h deleted file mode 100644 index 8dc88c20d..000000000 --- a/src/xspice/icm/digital/d_pwm/d_pwm.h +++ /dev/null @@ -1,93 +0,0 @@ -/*.......1.........2.........3.........4.........5.........6.........7.........8 -================================================================================ - -FILE d_pwm/d_pwm.h - -Public Domain - -Georgia Tech Research Corporation -Atlanta, Georgia 30332 -PROJECT A-8503-405 -The ngspice team - -AUTHORS - - 25 Jul 1991 Jeffrey P. Murray - 02 Mar 2022 Holger Vogt - - -MODIFICATIONS - - 30 Sept 1991 Jeffrey P. Murray - - -SUMMARY - - This file contains the header information for the d_pwm - code model. - - -INTERFACES - - FILE ROUTINE CALLED - - N/A N/A - - - -REFERENCED FILES - - N/A - - -NON-STANDARD FEATURES - - NONE - -===============================================================================*/ -/* - Structures, etc. for d_pwm oscillator model. - 7/25/90 - Last Modified 7/25/91 J.P.Murray - 3/02/22 H. Vogt */ - -/*=======================================================================*/ - -/*=== INCLUDE FILES =====================================================*/ - -#include -#include -#include -#include - - - - -/*=== CONSTANTS =========================================================*/ - - -/**** Error Messages ****/ -char *d_pwm_allocation_error = "\n**** Error ****\nD_PWM: Error allocating VCO block storage \n"; -char *d_pwm_array_error = "\n**** Error ****\nD_PWM: Size of control array different than duty cycle array \n"; -char *d_pwm_negative_dc_error = "\n**** Error ****\nD_PWM: The extrapolated value for duty cycle\nhas been found to be negative... \n Lower duty cycle level has been clamped to 0.0 \n"; -char *d_pwm_positive_dc_error = "\n**** Error ****\nD_PWM: The extrapolated value for duty cycle\nhas been found to be > 1... \n Upper duty cycle level has been clamped to 1.0 \n"; - - - - - - -/*=== MACROS ============================================================*/ - - - -/*=== LOCAL VARIABLES & TYPEDEFS ========================================*/ - - - -/*=== FUNCTION PROTOTYPE DEFINITIONS ====================================*/ - - -/*=======================================================================*/ - - diff --git a/src/xspice/icm/digital/d_pwm/ifspec.ifs b/src/xspice/icm/digital/d_pwm/ifspec.ifs deleted file mode 100644 index da6ed4da3..000000000 --- a/src/xspice/icm/digital/d_pwm/ifspec.ifs +++ /dev/null @@ -1,77 +0,0 @@ -/*.......1.........2.........3.........4.........5.........6.........7.........8 -================================================================================ -Public Domain - -Georgia Tech Research Corporation -Atlanta, Georgia 30332 -The ngspice team - - -AUTHORS - - 30 Sept 1991 Jeffrey P. Murray - 02 Mar 2022 Holger Vogt - - -SUMMARY - - This file contains the interface specification file for the - hybrid d_pwm code model. - -===============================================================================*/ - -NAME_TABLE: - -Spice_Model_Name: d_pwm -C_Function_Name: cm_d_pwm -Description: "duty cycle controlled digital oscillator" - - -PORT_TABLE: - -Port_Name: cntl_in out -Description: "control input" "output" -Direction: in out -Default_Type: v d -Allowed_Types: [v,vd,i,id] [d] -Vector: no no -Vector_Bounds: - - -Null_Allowed: no no - - - -PARAMETER_TABLE: - -Parameter_Name: cntl_array dc_array -Description: "control array" "duty cycle array" -Data_Type: real real -Default_Value: 0.0 0.5 -Limits: - [0 1] -Vector: yes yes -Vector_Bounds: [2 -] [2 -] -Null_Allowed: no no - - -PARAMETER_TABLE: - -Parameter_Name: frequency init_phase -Description: "oscillator frequency" "initial phase of output" -Data_Type: real real -Default_Value: 1e6 0 -Limits: [1e-6 -] [-180.0 +360.0] -Vector: no no -Vector_Bounds: - - -Null_Allowed: yes yes - - -PARAMETER_TABLE: - -Parameter_Name: rise_delay fall_delay -Description: "rise delay" "fall delay" -Data_Type: real real -Default_Value: 1e-9 1e-9 -Limits: [0 -] [0 -] -Vector: no no -Vector_Bounds: - - -Null_Allowed: yes yes - diff --git a/src/xspice/icm/digital/d_ram/cfunc.mod b/src/xspice/icm/digital/d_ram/cfunc.mod deleted file mode 100644 index 982bab3f5..000000000 --- a/src/xspice/icm/digital/d_ram/cfunc.mod +++ /dev/null @@ -1,944 +0,0 @@ -/*.......1.........2.........3.........4.........5.........6.........7.........8 -================================================================================ - -FILE d_ram/cfunc.mod - -Public Domain - -Georgia Tech Research Corporation -Atlanta, Georgia 30332 -PROJECT A-8503-405 - - -AUTHORS - - 23 Aug 1991 Jeffrey P. Murray - - -MODIFICATIONS - - 30 Sep 1991 Jeffrey P. Murray - - -SUMMARY - - This file contains the model-specific routines used to - functionally describe the d_ram code model. - - -INTERFACES - - FILE ROUTINE CALLED - - CMevt.c void *cm_event_alloc() - void *cm_event_get_ptr() - - - -REFERENCED FILES - - Inputs from and outputs to ARGS structure. - - -NON-STANDARD FEATURES - - NONE - -===============================================================================*/ - -/*=== INCLUDE FILES ====================*/ - -#include -#include -#include -#include - - - -/*=== CONSTANTS ========================*/ - - - - -/*=== MACROS ===========================*/ - - - - -/*=== LOCAL VARIABLES & TYPEDEFS =======*/ - - - - -/*=== FUNCTION PROTOTYPE DEFINITIONS ===*/ - - - - - -/*============================================================================== - -FUNCTION cm_address_to_decimal() - -AUTHORS - - 27 Jun 1991 Jeffrey P. Murray - -MODIFICATIONS - - 8 Jul 1991 Jeffrey P. Murray - 30 Sep 1991 Jeffrey P. Murray - -SUMMARY - - Calculates a decimal value from binary values passed. - -INTERFACES - - FILE ROUTINE CALLED - - N/A N/A - - -RETURNED VALUE - - A pointer containing the total (*total). - -GLOBAL VARIABLES - - NONE - -NON-STANDARD FEATURES - - NONE - -==============================================================================*/ - -/*=== CM_ADDRESS_TO_DECIMAL ROUTINE ===*/ - -/************************************************ -* The following routine calculates a * -* decimal value equivalent to the binary * -* value passed to it on address[i] bits. * -* The determined value is written to the * -* integer *total. * -* * -* Created 6/27/91 J.P.Murray * -************************************************/ - - -static int cm_address_to_decimal(Digital_State_t *address,int address_size,int *total) -{ - int i, /* indexing variable */ - multiplier, /* binary multiplier value */ - err; /* error value: 1 => output is unknown - 0 => output is valid */ - - err = 0; - *total = 0; - multiplier = 1; - - for (i=0; i> (ram_offset * 2)); - - switch (value) { - case 0: return ZERO; - case 1: return ONE; - default: return UNKNOWN; - } -} - - - -/*============================================================================== - -FUNCTION cm_initialize_ram() - -AUTHORS - - 9 Jul 1991 Jeffrey P. Murray - -MODIFICATIONS - - 30 Sep 1991 Jeffrey P. Murray - -SUMMARY - - This function stores digital data into specific short - integer array locations. - -INTERFACES - - FILE ROUTINE CALLED - - N/A N/A - - -RETURNED VALUE - - Returns updated ram[] value. - -GLOBAL VARIABLES - - NONE - -NON-STANDARD FEATURES - - NONE - -==============================================================================*/ - -/*=== CM_INITIALIZE_RAM ROUTINE ===*/ - -/************************************************ -* The following routine stores two-bit * -* data into short integer array "ram". The * -* integers are assumed to be at least two * -* bytes each, so each will hold eight two- * -* bit values. * -* * -* Created 7/9/91 J.P.Murray * -************************************************/ - - -static void cm_initialize_ram(Digital_State_t out,int word_width,int bit_number, - int word_number,short *ram) -{ - int /*err,*/ /* error index value */ - int1, /* temp storage variable */ - /*int2,*/ /* temp storage variable */ - ram_index, /* ram base address at which word bits will - be found */ - ram_offset; /* offset from ram base address at which bit[0] - of the required word can be found */ - - short base; /* variable to hold current base integer for - comparison purposes. */ - - - /* obtain offset value from word_number, word_width & - bit_number */ - int1 = word_number * word_width + bit_number; - - ram_index = int1 >> 3; - ram_offset = int1 & 7; - - /* retrieve entire base_address ram integer... */ - base = ram[ram_index]; - - /* for each offset, mask off the bits and store values */ - cm_mask_and_store(&base,ram_offset,out); - - /* store modified base value */ - ram[ram_index] = base; - -} - - - - -/*============================================================================== - -FUNCTION cm_store_ram_value() - -AUTHORS - - 27 Jun 1991 Jeffrey P. Murray - -MODIFICATIONS - - 9 Jul 1991 Jeffrey P. Murray - 30 Sep 1991 Jeffrey P. Murray - -SUMMARY - - This function stores digital data into specific short - integer array locations, after decoding address bits - passed to it (using cm_address_to_decimal routine). - -INTERFACES - - FILE ROUTINE CALLED - - N/A N/A - - -RETURNED VALUE - - Returns updated ram[] value via *ram pointer. - -GLOBAL VARIABLES - - NONE - -NON-STANDARD FEATURES - - NONE - -==============================================================================*/ - -/*=== CM_STORE_RAM_VALUE ROUTINE ===*/ - -/************************************************ -* The following routine stores two-bit * -* data into short integer array "ram". The * -* integers are assumed to be at least two * -* bytes each, so each will hold eight two- * -* bit values. A sister routine, cm_get_ * -* ram_value is used to retrieve the two- * -* bit values from the "ram" array. * -* * -* Created 6/27/91 J.P.Murray * -************************************************/ - - -static void cm_store_ram_value(Digital_State_t out,int word_width,int bit_number, - Digital_State_t *address,int address_size, - short *ram) -{ - int err, /* error index value */ - int1, /* temp storage variable */ - word_number, /* particular word of interest...this value - is derived from the passed address bits */ - ram_index, /* ram base address at which word bits will - be found */ - ram_offset; /* offset from ram base address at which bit[0] - of the required word can be found */ - - short base; /* variable to hold current base integer for - comparison purposes. */ - - /** first obtain word_number from *address values **/ - err = cm_address_to_decimal(address,address_size,&word_number); - - if ( FALSE == err ) { /** valid data was returned...store value **/ - - /* obtain offset value from word_number, word_width & - bit_number */ - int1 = word_number * word_width + bit_number; - - ram_index = int1 >> 3; - ram_offset = int1 & 7; - - /* retrieve entire base_address ram integer... */ - base = ram[ram_index]; - - /* for each offset, mask off the bits and store values */ - cm_mask_and_store(&base,ram_offset,out); - - /* store modified base value */ - ram[ram_index] = base; - - } -} - - - - - -/*============================================================================== - -FUNCTION cm_get_ram_value() - -AUTHORS - - 27 Jun 1991 Jeffrey P. Murray - -MODIFICATIONS - - 30 Sep 1991 Jeffrey P. Murray - -SUMMARY - - This function retrieves digital data from specific short - integer array locations, after decoding address bits - passed to it (using cm_address_to_decimal routine). This - is a sister routine to cm_store_ram_value. - -INTERFACES - - FILE ROUTINE CALLED - - N/A N/A - - -RETURNED VALUE - - Returns output value via *out pointer. - -GLOBAL VARIABLES - - NONE - -NON-STANDARD FEATURES - - NONE - -==============================================================================*/ - -/*=== CM_GET_RAM_VALUE ROUTINE ===*/ - -/************************************************ -* The following routine retrieves two-bit * -* data from short integer array "ram". The * -* integers are assumed to be at least two * -* bytes each, so each will hold eight two- * -* bit values. A sister routine, cm_store_ * -* ram_value is used to store the two-bit * -* values into the "ram" array. * -* * -* Created 6/27/91 J.P.Murray * -************************************************/ - -static Digital_State_t cm_get_ram_value(int word_width,int bit_number,Digital_State_t *address, - int address_size,short *ram) - -{ - int err, /* error index value */ - int1, /* temp storage variable */ - word_number, /* particular word of interest...this value - is derived from the passed address bits */ - ram_index, /* ram base address at which word bits will - be found */ - ram_offset; /* offset from ram base address at which bit[0] - of the required word can be found */ - - short base; /* variable to hold current base integer for - comparison purposes. */ - - - /** first obtain word_number from *address values **/ - err = cm_address_to_decimal(address,address_size,&word_number); - - if ( FALSE == err ) { /** valid data was returned **/ - - /* obtain offset value from word_number, word_width & - bit_number */ - int1 = word_number * word_width + bit_number; - - ram_index = int1 >> 3; - ram_offset = int1 & 7; - - /* retrieve entire base_address ram integer... */ - base = ram[ram_index]; - - /* for each offset, mask off the bits and determine values */ - - return cm_mask_and_retrieve(base,ram_offset); - - } - else { /** incorrect data returned...return UNKNOWN values **/ - return UNKNOWN; - } -} - - - - -/*============================================================================== - -FUNCTION cm_d_ram() - -AUTHORS - - 26 Jun 1991 Jeffrey P. Murray - -MODIFICATIONS - - 30 Sep 1991 Jeffrey P. Murray - -SUMMARY - - This function implements the d_ram code model. - -INTERFACES - - FILE ROUTINE CALLED - - CMevt.c void *cm_event_alloc() - void *cm_event_get_ptr() - - -RETURNED VALUE - - Returns inputs and outputs via ARGS structure. - -GLOBAL VARIABLES - - NONE - -NON-STANDARD FEATURES - - NONE - -==============================================================================*/ - -/*=== CM_D_RAM ROUTINE ===*/ - -/************************************************ -* The following is the model for the * -* digital M x N random access memory for the * -* ATESSE Version 2.0 system. * -* * -* Created 6/26/91 J.P.Murray * -************************************************/ - - -void cm_d_ram(ARGS) - -{ - int i, /* generic loop counter index */ - j, /* generic loop counter index */ - ram_size, /* total number of words in ram */ - num_of_ram_ints, /* actual number of "short" integer - values necessary to store all of the - ram_size integers */ - address_size, /* total number of address lines */ - select_size, /* total number of address lines */ - select_value, /* decimal value compared with - select inputs to confirm that the - ram has indeed been activated */ - word_width, /* width of each word in bits */ - int_test, /* integer test variable */ - address_changed, /* TRUE if address is different from - that on the previous call...FALSE - otherwise */ - address_unknown; /* TRUE if currently-read address has - at least one line which is an unknown - value. */ - - short int *ram, /* storage words...note that the - total ram data will be stored in the - two-bytes-per-Digital_State_t...since - we require 2 bits per ram bit (for - ZERO, ONE & UNKNOWN), we will store - 8 ram bits per Digital_State_t - location */ - *ram_old; /* previous values of storage words */ - - - - Digital_State_t *address, /* address line values */ - *address_old, /* previous address line values */ - *write_en, /* write_en value */ - *write_en_old, /* previous write_en value */ - *select, /* current selected state of ram... - note that this is derived from all - of the select lines into the ram */ - *select_old, /* previous selected state of ram */ - d_test, /* digital debugging variable */ - out; /* current output bit */ - - - - - - /** retrieve device size values...& other parameters **/ - address_size = PORT_SIZE(address); - - /* calculate ram word size from address size */ - ram_size = 1; - for (i=0; i>1; - } - - - - - - - - /******* Determine analysis type and output appropriate values *******/ - - if (0.0 == TIME) { /****** DC analysis...output w/o delays ******/ - - /** initialize ram to ic value **/ - - out = (Digital_State_t) PARAM(ic); - for (i=0; i code model. - - -INTERFACES - - FILE ROUTINE CALLED - - CMmacros.h cm_message_send(); - - CMevt.c void *cm_event_alloc() - void *cm_event_get_ptr() - int cm_event_queue() - - - -REFERENCED FILES - - Inputs from and outputs to ARGS structure. - - -NON-STANDARD FEATURES - - NONE - -===============================================================================*/ - -/*=== INCLUDE FILES ====================*/ - -#include "d_source.h" /* ...contains macros & type defns. - for this model. 6/13/90 - JPM */ -#include -#include -#include -#include - - -/*=== CONSTANTS ========================*/ - -#define MAX_STRING_SIZE 1024 - - -/*=== MACROS ===========================*/ - -#if defined(__MINGW32__) || defined(_MSC_VER) -#define DIR_PATHSEP "\\" -#else -#define DIR_PATHSEP "/" -#endif - - -/*=== LOCAL VARIABLES & TYPEDEFS =======*/ - -typedef struct { - int width, /* width of table...equal to size of out port */ - depth, /* depth of table...equal to size of - "timepoints" array, and to the total - number of vectors retrieved from the - source.in file. */ - imal; /* array size malloced */ - - double *all_timepoints; /* the storage array for the - timepoints, as read from file. - This will have size equal - to "depth" */ - - char **all_data; /* the storage array for the - output bit representations; - as read from file. This will have size equal - to width*depth, one short will hold a - 12-state bit description. */ - - bool init_ok; /* set to true if init is succeful */ - -} Local_Data_t; - - -/* Type definition for each possible token returned. */ -typedef enum token_type_s {CNV_NO_TOK,CNV_STRING_TOK} Cnv_Token_Type_t; - - - -/*=== FUNCTION PROTOTYPE DEFINITIONS ===*/ - - -static void free_local_data(Local_Data_t *loc); - - - -/*============================================================================== - -FUNCTION *CNVgettok() - -AUTHORS - - 13 Jun 1991 Jeffrey P. Murray - -MODIFICATIONS - - 8 Aug 1991 Jeffrey P. Murray - 30 Sep 1991 Jeffrey P. Murray - -SUMMARY - - This function obtains the next token from an input stream. - -INTERFACES - - FILE ROUTINE CALLED - - N/A N/A - -RETURNED VALUE - - Returns a string value representing the next token. - -GLOBAL VARIABLES - - NONE - -NON-STANDARD FEATURES - - NONE - -==============================================================================*/ - -/*=== Static CNVgettok ROUTINE ================*/ -/* -Get the next token from the input string. The input string pointer -is advanced to the following token and the token from the input -string is copied to malloced storage and a pointer to that storage -is returned. The original input string is undisturbed. -*/ - -#include - -static char *CNVgettok(char **s) - -{ - - char *buf; /* temporary storage to copy token into */ - /*char *temp;*/ /* temporary storage to copy token into */ - char *ret_str; /* storage for returned string */ - - int i; - - /* allocate space big enough for the whole string */ - - buf = (char *) malloc(strlen(*s) + 1); - - /* skip over any white space */ - - while(isspace_c(**s) || (**s == '=') || - (**s == '(') || (**s == ')') || (**s == ',')) - (*s)++; - - /* isolate the next token */ - - switch(**s) { - - case '\0': /* End of string found */ - if(buf) free(buf); - return(NULL); - - - default: /* Otherwise, we are dealing with a */ - /* string representation of a number */ - /* or a mess o' characters. */ - i = 0; - while( (**s != '\0') && - (! ( isspace_c(**s) || (**s == '=') || - (**s == '(') || (**s == ')') || - (**s == ',') - ) ) ) { - buf[i] = **s; - i++; - (*s)++; - } - buf[i] = '\0'; - break; - } - - /* skip over white space up to next token */ - - while(isspace_c(**s) || (**s == '=') || - (**s == '(') || (**s == ')') || (**s == ',')) - (*s)++; - - /* make a copy using only the space needed by the string length */ - - - ret_str = (char *) malloc(strlen(buf) + 1); - ret_str = strcpy(ret_str,buf); - - if(buf) free(buf); - - return(ret_str); -} - - -/*============================================================================== - -FUNCTION *CNVget_token() - -AUTHORS - - 13 Jun 1991 Jeffrey P. Murray - -MODIFICATIONS - - 8 Aug 1991 Jeffrey P. Murray - 30 Sep 1991 Jeffrey P. Murray - -SUMMARY - - This function obtains the next token from an input stream. - -INTERFACES - - FILE ROUTINE CALLED - - N/A N/A - -RETURNED VALUE - - Returns a string value representing the next token. Uses - *CNVget_tok. - -GLOBAL VARIABLES - - NONE - -NON-STANDARD FEATURES - - NONE - -==============================================================================*/ - -/*=== Static CNVget_token ROUTINE =============*/ -/* -Get the next token from the input string together with its type. -The input string pointer -is advanced to the following token and the token from the input -string is copied to malloced storage and a pointer to that storage -is returned. The original input string is undisturbed. -*/ - -static char *CNVget_token(char **s, Cnv_Token_Type_t *type) - -{ - - char *ret_str; /* storage for returned string */ - - /* get the token from the input line */ - - ret_str = CNVgettok(s); - - - /* if no next token, return */ - - if(ret_str == NULL) { - *type = CNV_NO_TOK; - return(NULL); - } - - /* else, determine and return token type */ - - switch(*ret_str) { - - default: - *type = CNV_STRING_TOK; - break; - - } - - return(ret_str); -} - - - - -/*============================================================================== - -FUNCTION cnv_get_spice_value() - -AUTHORS - - ??? Bill Kuhn - -MODIFICATIONS - - 30 Sep 1991 Jeffrey P. Murray - -SUMMARY - - This function takes as input a string token from a SPICE - deck and returns a floating point equivalent value. - -INTERFACES - - FILE ROUTINE CALLED - - N/A N/A - -RETURNED VALUE - - Returns the floating point value in pointer *p_value. Also - returns an integer representing successful completion. - -GLOBAL VARIABLES - - NONE - -NON-STANDARD FEATURES - - NONE - -==============================================================================*/ - -/*=== Static CNV_get_spice_value ROUTINE =============*/ - -/* - Function takes as input a string token from a SPICE -deck and returns a floating point equivalent value. -*/ - - -static int cnv_get_spice_value( -char *str, /* IN - The value text e.g. 1.2K */ -double *p_value ) /* OUT - The numerical value */ -{ - - - /* the following were "int4" devices - jpm */ - size_t len; - size_t i; - int n_matched; - - line_t val_str; - - /*char *suffix;*/ - char c = ' '; - char c1; - - double scale_factor; - double value; - - - /* Scan the input string looking for an alpha character that is not */ - /* 'e' or 'E'. Such a character is assumed to be an engineering */ - /* suffix as defined in the Spice 2G.6 user's manual. */ - - len = strlen(str); - if( len > (sizeof(val_str) - 1)) - len = sizeof(val_str) - 1; - - for(i = 0; i < len; i++) { - c = str[i]; - if( isalpha_c(c) && (c != 'E') && (c != 'e') ) - break; - else if( isspace_c(c) ) - break; - else - val_str[i] = c; - } - val_str[i] = '\0'; - - - /* Determine the scale factor */ - - if( (i >= len) || (! isalpha_c(c)) ) - scale_factor = 1.0; - else { - - if(isupper_c(c)) - c = tolower_c(c); - - switch(c) { - - case 't': - scale_factor = 1.0e12; - break; - - case 'g': - scale_factor = 1.0e9; - break; - - case 'k': - scale_factor = 1.0e3; - break; - - case 'u': - scale_factor = 1.0e-6; - break; - - case 'n': - scale_factor = 1.0e-9; - break; - - case 'p': - scale_factor = 1.0e-12; - break; - - case 'f': - scale_factor = 1.0e-15; - break; - - case 'm': - i++; - if(i >= len) { - scale_factor = 1.0e-3; - break; - } - c1 = str[i]; - if(! isalpha_c(c1)) { - scale_factor = 1.0e-3; - break; - } - if(islower_c(c1)) - c1 = toupper_c(c1); - if(c1 == 'E') - scale_factor = 1.0e6; - else if(c1 == 'I') - scale_factor = 25.4e-6; - else - scale_factor = 1.0e-3; - break; - - default: - scale_factor = 1.0; - } - } - - /* Convert the numeric portion to a float and multiply by the */ - /* scale factor. */ - - n_matched = sscanf(val_str,"%le",&value); - - if(n_matched < 1) { - *p_value = 0.0; - return(FAIL); - } - - *p_value = value * scale_factor; - return(OK); -} - - - - - -/*============================================================================== - -FUNCTION cm_source_retrieve() - -AUTHORS - - 15 Jul 1991 Jeffrey P. Murray - -MODIFICATIONS - - 16 Jul 1991 Jeffrey P. Murray - 30 Sep 1991 Jeffrey P. Murray - 19 Aug 2012 H. Vogt - -SUMMARY - - Retrieves a bit value from a char character - -INTERFACES - - FILE ROUTINE CALLED - - N/A N/A - - -RETURNED VALUE - - Returns a Digital_t value. - -GLOBAL VARIABLES - - NONE - -NON-STANDARD FEATURES - - NONE - -==============================================================================*/ - -/*=== Static CM_SOURCE_RETRIEVE ROUTINE ===*/ - -/************************************************** -* The following routine retrieves * -* the value passed to it by the out value. * -* * -* Created 7/15/91 J.P.Murray * -**************************************************/ - -static void cm_source_retrieve(char val, Digital_t *out) -{ - - - int value = (int)val; - - switch (value) { - - case 0: out->state = ZERO; - out->strength = STRONG; - break; - - case 1: out->state = ONE; - out->strength = STRONG; - break; - - case 2: out->state = UNKNOWN; - out->strength = STRONG; - break; - - case 3: out->state = ZERO; - out->strength = RESISTIVE; - break; - - case 4: out->state = ONE; - out->strength = RESISTIVE; - break; - - case 5: out->state = UNKNOWN; - out->strength = RESISTIVE; - break; - - case 6: out->state = ZERO; - out->strength = HI_IMPEDANCE; - break; - - case 7: out->state = ONE; - out->strength = HI_IMPEDANCE; - break; - - case 8: out->state = UNKNOWN; - out->strength = HI_IMPEDANCE; - break; - - case 9: out->state = ZERO; - out->strength = UNDETERMINED; - break; - - case 10: out->state = ONE; - out->strength = UNDETERMINED; - break; - - case 11: out->state = UNKNOWN; - out->strength = UNDETERMINED; - break; - } -} - - -/*============================================================================== - - -FUNCTION cm_get_source_value() - -AUTHORS - - 15 Jul 1991 Jeffrey P. Murray - -MODIFICATIONS - - 16 Jul 1991 Jeffrey P. Murray - 30 Sep 1991 Jeffrey P. Murray - 19 Aug 2012 H. Vogt - -SUMMARY - - Retrieves a char per bit value from the array "all_data". - -INTERFACES - - FILE ROUTINE CALLED - - N/A N/A - - -RETURNED VALUE - - Returns data via *out pointer. - -GLOBAL VARIABLES - - NONE - -NON-STANDARD FEATURES - - NONE - -==============================================================================*/ - -/*=== Static CM_GET_SOURCE_VALUE ROUTINE ===*/ - -/************************************************ -* The following routine retrieves a bit * -* from all_data and stores them in out * -* * -* Created 8/19/12 H. Vogt * -************************************************/ - -static void cm_get_source_value(int row, int bit_number, char **all_data, Digital_t *out) - -{ - char val; - - val = all_data[row][bit_number]; - - cm_source_retrieve(val,out); - -} - - - -/*============================================================================== - -FUNCTION cm_read_source() - -AUTHORS - - 15 Jul 1991 Jeffrey P. Murray - -MODIFICATIONS - - 19 Jul 1991 Jeffrey P. Murray - 30 Sep 1991 Jeffrey P. Murray - 19 Aug 2012 H. Vogt - -SUMMARY - - This function reads the source file and stores the results - for later output by the model. - -INTERFACES - - FILE ROUTINE CALLED - - N/A N/A - - -RETURNED VALUE - - Returns output bits stored in "all_data" array, - time values in "all_timepoints" array, - return != 0 code if error. - -GLOBAL VARIABLES - - NONE - -NON-STANDARD FEATURES - - NONE - -==============================================================================*/ - -/*=== Static CM_READ_SOURCE ROUTINE ===*/ - - -/************************************************** -* The following routine reads the file * -* *source, parses the file, and stores * -* the values found there into the *bits & * -* *timepoints arrays. * -* * -* Created 7/15/91 J.P.Murray * -**************************************************/ - -static int cm_read_source(FILE *source, Local_Data_t *loc) -{ - int n; /* loop index */ - int i, /* indexing variable */ - j, /* indexing variable */ - num_tokens; /* number of tokens in a given string */ - - Cnv_Token_Type_t type; /* variable for testing token type returned. */ - - char temp[MAX_STRING_SIZE], /* holding string variable for testing - input from source.in */ - *s, /* main string variable */ - *base_address, /* storage location for base address - of string. */ - *token; /* a particular token from the string */ - - - double number; /* holding variable for timepoint values */ - - char bit_value; /* holding variable for value read from - source file which needs to be stored */ - - i = 0; - loc->imal = 0; - s = temp; - while ( fgets(s,MAX_STRING_SIZE,source) != NULL) { - - /* Test this string to see if it is whitespace... */ - - base_address = s; - while(isspace_c(*s) || (*s == '*')) - (s)++; - if ( *s != '\0' ) { /* This is not a blank line, so process... */ - s = base_address; - - if ( '*' != s[0] ) { - - /* Count up total number of tokens including \0... */ - j = 0; - type = CNV_STRING_TOK; - while ( type != CNV_NO_TOK ) { - token = CNVget_token(&s, &type); - if (token) - free(token); - j++; - } - num_tokens = j; - - /* If this number is incorrect, return with an error */ - if ( (loc->width + 2) != num_tokens) { - return 2; - } - - /* reset s to beginning... */ - s = base_address; - - /* set storage space for bits in a row and set them to 0*/ - loc->all_data[i] = (char*)malloc(sizeof(char) * (size_t) loc->width); - loc->imal = i; - for (n = 0; n < loc->width; n++) - loc->all_data[i][n] = 0; - - /** Retrieve each token, analyze, and **/ - /** store the timepoint and bit information **/ - for (j=0; j<(loc->width + 1); j++) { - - token = CNVget_token(&s, &type); - - if (!token) - return 4; - - if ( 0 == j ) { /* obtain timepoint value... */ - - /* convert to a floating point number... */ - cnv_get_spice_value(token,&number); - - loc->all_timepoints[i] = number; - - - /* provided this is not the first timepoint - to be written... */ - if ( 0 != i ) { - - /* if current timepoint value is not greater - than the previous value, then return with - an error message... */ - if ( loc->all_timepoints[i] <= loc->all_timepoints[i-1] ) { - free(token); - return 3; - } - } - - } - else { /* obtain each bit value & set bits entry */ - - /* preset this bit location */ - bit_value = 12; - - if (0 == strcmp(token,"0s")) bit_value = 0; - if (0 == strcmp(token,"1s")) bit_value = 1; - if (0 == strcmp(token,"Us")) bit_value = 2; - if (0 == strcmp(token,"0r")) bit_value = 3; - if (0 == strcmp(token,"1r")) bit_value = 4; - if (0 == strcmp(token,"Ur")) bit_value = 5; - if (0 == strcmp(token,"0z")) bit_value = 6; - if (0 == strcmp(token,"1z")) bit_value = 7; - if (0 == strcmp(token,"Uz")) bit_value = 8; - if (0 == strcmp(token,"0u")) bit_value = 9; - if (0 == strcmp(token,"1u")) bit_value = 10; - if (0 == strcmp(token,"Uu")) bit_value = 11; - - /* if this bit was not recognized, return with an error */ - if (12 == bit_value) { - free(token); - return 4; - } - else { /* need to store this value in the all_data[] array */ - loc->all_data[i][j-1] = bit_value; - } - } - free(token); - } - i++; - } - s = temp; - } - } - return 0; -} - - -static void cm_d_source_callback(ARGS, - Mif_Callback_Reason_t reason) -{ - switch (reason) { - case MIF_CB_DESTROY: { - Local_Data_t *loc = STATIC_VAR(locdata); - if (loc) { - free_local_data(loc); - STATIC_VAR(locdata) = loc = NULL; - } - break; - } /* end of case MIF_CB_DESTROY */ - } /* end of switch over reason being called */ -} /* end of function cm_d_source_callback */ - - - -/*============================================================================== - -FUNCTION cm_d_source() - -AUTHORS - - 13 Jun 1991 Jeffrey P. Murray - -MODIFICATIONS - - 8 Aug 1991 Jeffrey P. Murray - 30 Sep 1991 Jeffrey P. Murray - 19 Aug 2012 H. Vogt - -SUMMARY - - This function implements the d_source code model. - -INTERFACES - - FILE ROUTINE CALLED - - CMmacros.h cm_message_send(); - - CMevt.c void *cm_event_alloc() - void *cm_event_get_ptr() - int cm_event_queue() - - -RETURNED VALUE - - Returns inputs and outputs via ARGS structure. - -GLOBAL VARIABLES - - NONE - -NON-STANDARD FEATURES - - NONE - -==============================================================================*/ - -/*=== CM_D_SOURCE ROUTINE ==============*/ - -/************************************************ -* The following is the new model for * -* the digital source * -* * -* Created 8/19/12 H. Vogt * -************************************************/ - - -void cm_d_source(ARGS) -{ - int i, /* generic loop counter index */ - err; /* integer for storage of error status */ - -/**** the state variables, memory allocation with cm_event_alloc *****/ - char *bits, /* the storage array for the - output bit representations... - this will have size equal to width, - since one short will hold a 12-state - bit description. */ - *bits_old; /* the storage array for old bit values */ - - int *row_index, /* current index into source tables */ - *row_index_old; /* previous index into source tables */ - - double *timepoint, /* the storage array for the - timepoints, a single point */ - *timepoint_old; /* the storage for the old timepoint */ -/*********************************************************************/ - - volatile double /* enforce 64 bit precision, (equality comparison) */ - test_double; /* test variable for doubles */ - - FILE *source; /* pointer to the source.in input - vector file */ - - - Digital_t out; /* storage for each output bit */ - - - char temp[MAX_STRING_SIZE], /* holding string variable for testing - input from source.in */ - *s; /* main string variable */ - - - char *loading_error = "\nERROR **\n D_SOURCE: source.in file was not read successfully. \n"; - - Local_Data_t *loc; /* Pointer to local static data, not to be included - in the state vector (save memory!) */ - - /**** Setup required local and state variables ****/ - /* local data will be setup once during INIT and never change again */ - - if(INIT) { /* initial pass */ - - /*** open file and count the number of vectors in it ***/ - char* filename = PARAM(input_file); - source = fopen_with_path( filename, "r"); - - if (!source) { - char *lbuffer, *p; - lbuffer = getenv("NGSPICE_INPUT_DIR"); - if (lbuffer && *lbuffer) { - p = (char*) malloc(strlen(lbuffer) + strlen(DIR_PATHSEP) + strlen(PARAM(input_file)) + 1); - sprintf(p, "%s%s%s", lbuffer, DIR_PATHSEP, PARAM(input_file)); - source = fopen(p, "r"); - free(p); - } - if (!source) - cm_message_printf("cannot open file %s", PARAM(input_file)); - } - - /* increment counter if not a comment until EOF reached... */ - i = 0; - if (source) { - s = temp; - while ( fgets(s,MAX_STRING_SIZE,source) != NULL) { - if ( '*' != s[0] ) { - while(isspace_c(*s) || (*s == '*')) - (s)++; - if ( *s != '\0' ) i++; - } - s = temp; - } - } - - /*** allocate static storage for *loc ***/ - STATIC_VAR (locdata) = calloc (1 , sizeof ( Local_Data_t )); - loc = STATIC_VAR (locdata); - CALLBACK = cm_d_source_callback; - - /*** allocate storage for *index, *bits & *timepoint ***/ - - cm_event_alloc(0, sizeof(int)); - - cm_event_alloc(1, PORT_SIZE(out) * (int) sizeof(char)); - - cm_event_alloc(2, (int) sizeof(double)); - - /**** Get all pointers again (to avoid realloc problems) ****/ - row_index = row_index_old = (int *) cm_event_get_ptr(0,0); - bits = bits_old = (char *) cm_event_get_ptr(1,0); - timepoint = timepoint_old = (double *) cm_event_get_ptr(2,0); - - /* Initialize info values... */ - *row_index = 0; - loc->depth = i; - - /* Retrieve width of the source */ - loc->width = PORT_SIZE(out); - - /*** allocate storage for **all_data, & *all_timepoints ***/ - loc->all_timepoints = (double*)calloc((size_t) i, sizeof(double)); - loc->all_data = (char**)calloc((size_t) i, sizeof(char*)); - - /* Send file pointer and the two array storage pointers */ - /* to "cm_read_source()". This will return after */ - /* reading the contents of source.in, and if no */ - /* errors have occurred, the "*all_data" and "*all_timepoints" */ - /* vectors will be loaded and the width and depth */ - /* values supplied. */ - - if (source) { - rewind(source); - err = cm_read_source(source, loc); - } else { - err=1; - } - - if (err) { /* problem occurred in load...send error msg. */ - cm_message_send(loading_error); - - switch (err) - { - case 2: - cm_message_send(" d_source word length and number of columns in file differ.\n" ); - break; - case 3: - cm_message_send(" Time values in first column have to increase monotonically.\n"); - break; - case 4: - cm_message_send(" Unknown bit value.\n"); - break; - default: - break; - } - } - - /* close source file */ - if (source) - fclose(source); - - if (err > 0) { - loc->init_ok = FALSE; - cm_message_send(" dsource will return only its initial state.\n"); - return; - } - else - loc->init_ok = TRUE; - } - else { /*** Retrieve previous values ***/ - - /** Retrieve info... **/ - row_index = (int *) cm_event_get_ptr(0,0); - row_index_old = (int *) cm_event_get_ptr(0,1); - - loc = STATIC_VAR (locdata); - - if (!loc->init_ok) - return; - - /* Set old values to new... */ - *row_index = *row_index_old; - - /** Retrieve bits... **/ - bits = (char *) cm_event_get_ptr(1,0); - bits_old = (char *) cm_event_get_ptr(1,1); - - for (i=0; iall_timepoints[*row_index]; - if ( 0.0 == test_double && loc->depth > 0 ) { /* Set DC value */ - - /* reset current breakpoint */ - test_double = loc->all_timepoints[*row_index]; - cm_event_queue( test_double ); - - /* Output new values... */ - for (i=0; iwidth; i++) { - - /* retrieve output value */ - cm_get_source_value(*row_index, i, loc->all_data, &out); - - OUTPUT_STATE(out[i]) = out.state; - OUTPUT_STRENGTH(out[i]) = out.strength; - } - - /* increment breakpoint */ - (*row_index)++; - - - /* set next breakpoint as long as depth - has not been exceeded */ - if ( *row_index < loc->depth ) { - test_double = loc->all_timepoints[*row_index] - 1.0e-10; - cm_event_queue( test_double ); - } - - } - else { /* Set breakpoint for first time index */ - - /* set next breakpoint as long as depth - has not been exceeded */ - if ( *row_index < loc->depth ) { - test_double = loc->all_timepoints[*row_index] - 1.0e-10; - cm_event_queue( test_double ); - } - for(i=0; iwidth; i++) { - OUTPUT_STATE(out[i]) = UNKNOWN; - OUTPUT_STRENGTH(out[i]) = UNDETERMINED; - } - } - } - else { - - /*** Retrieve last index value and branch to appropriate *** - *** routine based on the last breakpoint's relationship *** - *** to the current time value. ***/ - - test_double = loc->all_timepoints[*row_index] - 1.0e-10; - - if ( TIME < test_double ) { /* Breakpoint has not occurred */ - - /** Output hasn't changed...do nothing this time. **/ - for (i=0; iwidth; i++) { - OUTPUT_CHANGED(out[i]) = FALSE; - } - - if ( *row_index < loc->depth ) { - test_double = loc->all_timepoints[*row_index] - 1.0e-10; - cm_event_queue( test_double ); - } - - } - else /* Breakpoint has been reached or exceeded */ - - if ( TIME == test_double ) { /* Breakpoint reached */ - - /* reset current breakpoint */ - test_double = loc->all_timepoints[*row_index] - 1.0e-10; - cm_event_queue( test_double ); - - /* Output new values... */ - for (i=0; iwidth; i++) { - - /* retrieve output value */ - cm_get_source_value(*row_index, i , loc->all_data, &out); - - OUTPUT_STATE(out[i]) = out.state; - OUTPUT_DELAY(out[i]) = 1.0e-10; - OUTPUT_STRENGTH(out[i]) = out.strength; - } - - /* increment breakpoint */ - (*row_index)++; - - /* set next breakpoint as long as depth - has not been exceeded */ - if ( *row_index < loc->depth ) { - test_double = loc->all_timepoints[*row_index] - 1.0e-10; - cm_event_queue( test_double ); - } - } - - else { /* Last source file breakpoint has been exceeded... - do not change the value of the output */ - - for (i=0; iwidth; i++) { - OUTPUT_CHANGED(out[i]) = FALSE; - } - } - } -} - -/* Free memory allocations in Local_Data_t structure */ -static void free_local_data(Local_Data_t *loc) -{ - if (loc == (Local_Data_t *) NULL) { - return; - } - /* Free data table and related values */ - if (loc->all_timepoints) { - free(loc->all_timepoints); - } - if (loc->all_data) { - int i; - for (i = 0; i <= loc->imal; i++) - free(loc->all_data[i]); - free(loc->all_data); - } - free(loc); -} /* end of function free_local_data */ - - diff --git a/src/xspice/icm/digital/d_source/d_source.h b/src/xspice/icm/digital/d_source/d_source.h deleted file mode 100644 index a79d9e7cd..000000000 --- a/src/xspice/icm/digital/d_source/d_source.h +++ /dev/null @@ -1,82 +0,0 @@ -/*.......1.........2.........3.........4.........5.........6.........7.........8 -================================================================================ - -FILE d_source/cfunc.mod - -Public Domain - -Georgia Tech Research Corporation -Atlanta, Georgia 30332 -PROJECT A-8503-405 - - -AUTHORS - - 13 Jun 1991 Jeffrey P. Murray - - -MODIFICATIONS - - 8 Aug 1991 Jeffrey P. Murray - 30 Sep 1991 Jeffrey P. Murray - - -SUMMARY - - This file contains the header information used by the - d_source code model. - - -INTERFACES - - FILE ROUTINE CALLED - - N/A N/A - - - -REFERENCED FILES - - NONE - - -NON-STANDARD FEATURES - - NONE - -===============================================================================*/ - -/*=== INCLUDE FILES ====================*/ - -#include -#include -#include -#include - - - -/*=== CONSTANTS ========================*/ - -#define OK 0 -#define FAIL 1 - - - -/*=== MACROS ===========================*/ - - - - -/*=== LOCAL VARIABLES & TYPEDEFS =======*/ - -typedef char line_t[82]; /* A SPICE size line. <= 80 characters plus '\n\0' */ - - - -/*=== FUNCTION PROTOTYPE DEFINITIONS ===*/ - - - - - -/*=============================================================================*/ diff --git a/src/xspice/icm/digital/d_source/ifspec.ifs b/src/xspice/icm/digital/d_source/ifspec.ifs deleted file mode 100644 index d8cc2778b..000000000 --- a/src/xspice/icm/digital/d_source/ifspec.ifs +++ /dev/null @@ -1,70 +0,0 @@ -/*.......1.........2.........3.........4.........5.........6.........7.........8 -================================================================================ -Public Domain - -Georgia Tech Research Corporation -Atlanta, Georgia 30332 - - -AUTHORS - - 30 Sept 1991 Jeffrey P. Murray - 19 Aug 2012 H. Vogt - - -SUMMARY - - This file contains the interface specification file for the - digital d_source code model. - -===============================================================================*/ - -NAME_TABLE: - -C_Function_Name: cm_d_source -Spice_Model_Name: d_source -Description: "digital signal source" - - -PORT_TABLE: - -Port_Name: out -Description: "output" -Direction: out -Default_Type: d -Allowed_Types: [d] -Vector: yes -Vector_Bounds: - -Null_Allowed: no - - - -PARAMETER_TABLE: - -Parameter_Name: input_file -Description: "digital input vector filename" -Data_Type: string -Default_Value: "source.txt" -Limits: - -Vector: no -Vector_Bounds: - -Null_Allowed: no - - -PARAMETER_TABLE: - -Parameter_Name: input_load -Description: "input loading capacitance (F)" -Data_Type: real -Default_Value: 1.0e-12 -Limits: - -Vector: no -Vector_Bounds: - -Null_Allowed: no - - -STATIC_VAR_TABLE: - -Static_Var_Name: locdata -Description: "local static data" -Data_Type: pointer diff --git a/src/xspice/icm/digital/d_srff/cfunc.mod b/src/xspice/icm/digital/d_srff/cfunc.mod deleted file mode 100644 index 6d6fb8910..000000000 --- a/src/xspice/icm/digital/d_srff/cfunc.mod +++ /dev/null @@ -1,772 +0,0 @@ -/*.......1.........2.........3.........4.........5.........6.........7.........8 -================================================================================ - -FILE d_srff/cfunc.mod - -Public Domain - -Georgia Tech Research Corporation -Atlanta, Georgia 30332 -PROJECT A-8503-405 - - -AUTHORS - - 24 Jun 1991 Jeffrey P. Murray - - -MODIFICATIONS - - 30 Sep 1991 Jeffrey P. Murray - 29 Jan 1992 Jeffrey P. Murray - - -SUMMARY - - This file contains the model-specific routines used to - functionally describe the d_srff code model. - - -INTERFACES - - FILE ROUTINE CALLED - - CMutil.c void cm_toggle_bit(); - - CMevt.c void *cm_event_alloc() - void *cm_event_get_ptr() - - -REFERENCED FILES - - Inputs from and outputs to ARGS structure. - - -NON-STANDARD FEATURES - - NONE - -===============================================================================*/ - -/*=== INCLUDE FILES ====================*/ - - - - -/*=== CONSTANTS ========================*/ - - - - -/*=== MACROS ===========================*/ - - - - -/*=== LOCAL VARIABLES & TYPEDEFS =======*/ - - - - -/*=== FUNCTION PROTOTYPE DEFINITIONS ===*/ - - - - - - -/*============================================================================== - -FUNCTION cm_toggle_bit() - - -AUTHORS - - 27 Sept 1991 Jeffrey P. Murray - - -MODIFICATIONS - - NONE - - -SUMMARY - - Alters the state of a passed digital variable to its - complement. Thus, a ONE changes to a ZERO. A ZERO changes - to a ONE, and an UNKNOWN remains unchanged. - - -INTERFACES - - FILE ROUTINE CALLED - - N/A N/A - - -RETURNED VALUE - - No returned value. Passed pointer to variable is used - to redefine the variable value. - - -GLOBAL VARIABLES - - NONE - - -NON-STANDARD FEATURES - - NONE - -===============================================================================*/ - -/*=== CM_TOGGLE_BIT ROUTINE ===*/ - -static void cm_toggle_bit(Digital_State_t *bit) - -{ - /* Toggle bit from ONE to ZERO or vice versa, unless the - bit value is UNKNOWN. In the latter case, return - without changing the bit value. */ - - if ( UNKNOWN != *bit ) { - if ( ONE == *bit ) { - *bit = ZERO; - } - else { - *bit = ONE; - } - } - -} - - - -/*============================================================================== - -FUNCTION cm_eval_sr_result - -AUTHORS - - 30 Sept 1991 Jeffrey P. Murray - -MODIFICATIONS - - NONE - -SUMMARY - - Evaluates the S and R input states, plus the last state of - the flip flop, and returns the expected output value. - -INTERFACES - - FILE ROUTINE CALLED - - CMutil.c void cm_toggle_bit(); - - -RETURNED VALUE - - A Digital_State_t. - -GLOBAL VARIABLES - - NONE - -NON-STANDARD FEATURES - - NONE - -==============================================================================*/ - -/*=== CM_EVAL_SR_RESULT ROUTINE ===*/ - -static Digital_State_t cm_eval_sr_result(Digital_State_t s_input, - Digital_State_t r_input, - Digital_State_t old_output) -{ - Digital_State_t output = ZERO; - - - switch (s_input) { - - case ZERO: - switch (r_input) { - case ZERO: - output = old_output; - break; - case ONE: - output = ZERO; - break; - case UNKNOWN: - output = UNKNOWN; - break; - } - break; - - case ONE: - switch (r_input) { - case ZERO: - output = ONE; - break; - case ONE: - output = UNKNOWN; - break; - case UNKNOWN: - output = UNKNOWN; - break; - } - break; - - - case UNKNOWN: - output = UNKNOWN; - break; - } - - return output; - -} - - - -/*============================================================================== - -FUNCTION cm_d_srff() - -AUTHORS - - 24 Jun 1991 Jeffrey P. Murray - -MODIFICATIONS - - 24 Sep 1991 Jeffrey P. Murray - 29 Jan 1992 Jeffrey P. Murray - -SUMMARY - - This function implements the d_srff code model. - -INTERFACES - - FILE ROUTINE CALLED - - CMutil.c void cm_toggle_bit(); - - CMevt.c void *cm_event_alloc() - void *cm_event_get_ptr() - -RETURNED VALUE - - Returns inputs and outputs via ARGS structure. - -GLOBAL VARIABLES - - NONE - -NON-STANDARD FEATURES - - NONE - -==============================================================================*/ - -/*=== CM_D_SRFF ROUTINE ===*/ - -/************************************************ -* The following is the model for the * -* digital sr-type flip flop for the * -* ATESSE Version 2.0 system. * -* * -* Created 6/24/91 J.P.Murray * -************************************************/ - - -void cm_d_srff(ARGS) - -{ - /*int i;*/ /* generic loop counter index */ - - - Digital_State_t *clk, /* current clk value */ - *clk_old, /* previous clk value */ - *set, /* current set value for dff */ - *set_old, /* previous set value for dff */ - *reset, /* current reset value for dff */ - *reset_old, /* previous reset value for dff */ - *out, /* current output for dff */ - *out_old, /* previous output for dff */ - - s_input, /* current j input value */ - r_input, /* current k input value */ - - temp; /* temp storage for state values */ - - - - /*** Setup required state variables ***/ - - if(INIT) { /* initial pass */ - - /* allocate storage */ - cm_event_alloc(0,sizeof(Digital_State_t)); - cm_event_alloc(1,sizeof(Digital_State_t)); - cm_event_alloc(2,sizeof(Digital_State_t)); - cm_event_alloc(3,sizeof(Digital_State_t)); - - /* declare load values */ - LOAD(s) = PARAM(sr_load); - LOAD(r) = PARAM(sr_load); - LOAD(clk) = PARAM(clk_load); - if ( !PORT_NULL(set) ) { - LOAD(set) = PARAM(set_load); - } - if ( !PORT_NULL(reset) ) { - LOAD(reset) = PARAM(reset_load); - } - - /* retrieve storage for the outputs */ - clk = clk_old = (Digital_State_t *) cm_event_get_ptr(0,0); - set = set_old = (Digital_State_t *) cm_event_get_ptr(1,0); - reset = reset_old = (Digital_State_t *) cm_event_get_ptr(2,0); - out = out_old = (Digital_State_t *) cm_event_get_ptr(3,0); - - } - else { /* Retrieve previous values */ - - /* retrieve storage for the outputs */ - clk = (Digital_State_t *) cm_event_get_ptr(0,0); - clk_old = (Digital_State_t *) cm_event_get_ptr(0,1); - set = (Digital_State_t *) cm_event_get_ptr(1,0); - set_old = (Digital_State_t *) cm_event_get_ptr(1,1); - reset = (Digital_State_t *) cm_event_get_ptr(2,0); - reset_old = (Digital_State_t *) cm_event_get_ptr(2,1); - out = (Digital_State_t *) cm_event_get_ptr(3,0); - out_old = (Digital_State_t *) cm_event_get_ptr(3,1); - } - - - /******** load current input values if set or reset - are not connected, set to zero... ********/ - *clk = INPUT_STATE(clk); - if ( PORT_NULL(set) ) { - *set = *set_old = ZERO; - } - else { - *set = INPUT_STATE(set); - } - if ( PORT_NULL(reset) ) { - *reset = *reset_old = ZERO; - } - else { - *reset = INPUT_STATE(reset); - } - - - - /******* Determine analysis type and output appropriate values *******/ - - if (0.0 == TIME) { /****** DC analysis...output w/o delays ******/ - - temp = (Digital_State_t) PARAM(ic); - - /** Modify output if set or reset lines are active **/ - if ( (*set==ONE) && (*reset==ZERO) ) temp = ONE; - if ( (*set==ZERO) && (*reset==ONE) ) temp = ZERO; - if ( (*set==ONE) && (*reset==ONE) ) temp = UNKNOWN; - - *out = *out_old = temp; - - - if ( !PORT_NULL(out) ) { - OUTPUT_STATE(out) = temp; - } - - cm_toggle_bit(&temp); - - if ( !PORT_NULL(Nout) ) { - OUTPUT_STATE(Nout) = temp; - } - - } - - else { /****** Transient Analysis ******/ - - - - /***** Find input that has changed... *****/ - - /**** Test set value for change ****/ - if ( *set != *set_old ) { /* either set or set release */ - switch ( *set ) { - - case ONE: - if ( ONE != *reset) { - if (*out_old != ONE) { /* set will change output */ - /* output goes to ONE */ - *out = ONE; - - if ( !PORT_NULL(out) ) { - OUTPUT_STATE(out) = ONE; - OUTPUT_DELAY(out) = PARAM(set_delay); - } - if ( !PORT_NULL(Nout) ) { - OUTPUT_STATE(Nout) = ZERO; - OUTPUT_DELAY(Nout) = PARAM(set_delay); - } - } - else { - *out = *out_old; /* output already set */ - if ( !PORT_NULL(out) ) { - OUTPUT_CHANGED(out) = FALSE; - } - if ( !PORT_NULL(Nout) ) { - OUTPUT_CHANGED(Nout) = FALSE; - } - } - } - else { - if (*out_old != UNKNOWN) { /* set will change output */ - /* output goes to UNKNOWN */ - *out = UNKNOWN; - - if ( !PORT_NULL(out) ) { - OUTPUT_STATE(out) = UNKNOWN; - OUTPUT_DELAY(out) = PARAM(set_delay); - } - if ( !PORT_NULL(Nout) ) { - OUTPUT_STATE(Nout) = UNKNOWN; - OUTPUT_DELAY(Nout) = PARAM(set_delay); - } - } - else { - *out = *out_old; /* output already unknown */ - if ( !PORT_NULL(out) ) { - OUTPUT_CHANGED(out) = FALSE; - } - if ( !PORT_NULL(Nout) ) { - OUTPUT_CHANGED(Nout) = FALSE; - } - } - } - break; - - case ZERO: - if ( ONE != *reset) { - /* output remains at current value */ - *out = *out_old; - if ( !PORT_NULL(out) ) { - OUTPUT_CHANGED(out) = FALSE; - } - if ( !PORT_NULL(Nout) ) { - OUTPUT_CHANGED(Nout) = FALSE; - } - } - else { - if (*out_old != ZERO) { /* set will change output */ - /* output returns to reset condition */ - *out = ZERO; - - if ( !PORT_NULL(out) ) { - OUTPUT_STATE(out) = ZERO; - OUTPUT_DELAY(out) = PARAM(set_delay); - } - if ( !PORT_NULL(Nout) ) { - OUTPUT_STATE(Nout) = ONE; - OUTPUT_DELAY(Nout) = PARAM(set_delay); - } - } - else { - *out = *out_old; /* output already reset */ - if ( !PORT_NULL(out) ) { - OUTPUT_CHANGED(out) = FALSE; - } - if ( !PORT_NULL(Nout) ) { - OUTPUT_CHANGED(Nout) = FALSE; - } - } - } - break; - - case UNKNOWN: - - if ( ONE == *reset ) { - /* output goes to ZERO */ - *out = ZERO; - - if ( !PORT_NULL(out) ) { - OUTPUT_STATE(out) = ZERO; - OUTPUT_DELAY(out) = PARAM(set_delay); - } - if ( !PORT_NULL(Nout) ) { - OUTPUT_STATE(Nout) = ONE; - OUTPUT_DELAY(Nout) = PARAM(set_delay); - } - } - else { - *out = *out_old; /* output already unknown */ - if ( !PORT_NULL(out) ) { - OUTPUT_CHANGED(out) = FALSE; - } - if ( !PORT_NULL(Nout) ) { - OUTPUT_CHANGED(Nout) = FALSE; - } - } - break; - } - } - else { - - /**** Test reset value for change ****/ - if ( *reset != *reset_old ) { /* either reset or reset release */ - switch ( *reset ) { - - case ONE: - if ( ONE != *set) { - if (*out_old != ZERO) { /* reset will change output */ - /* output goes to ZERO */ - *out = ZERO; - - if ( !PORT_NULL(out) ) { - OUTPUT_STATE(out) = ZERO; - OUTPUT_DELAY(out) = PARAM(reset_delay); - } - if ( !PORT_NULL(Nout) ) { - OUTPUT_STATE(Nout) = ONE; - OUTPUT_DELAY(Nout) = PARAM(reset_delay); - } - } - else { - *out = *out_old; /* output already reset */ - if ( !PORT_NULL(out) ) { - OUTPUT_CHANGED(out) = FALSE; - } - if ( !PORT_NULL(Nout) ) { - OUTPUT_CHANGED(Nout) = FALSE; - } - } - } - else { - if (*out_old != UNKNOWN) { /* reset will change output */ - /* output goes to UNKNOWN */ - *out = UNKNOWN; - - if ( !PORT_NULL(out) ) { - OUTPUT_STATE(out) = UNKNOWN; - OUTPUT_DELAY(out) = PARAM(reset_delay); - } - if ( !PORT_NULL(Nout) ) { - OUTPUT_STATE(Nout) = UNKNOWN; - OUTPUT_DELAY(Nout) = PARAM(reset_delay); - } - } - else { - *out = *out_old; /* output already unknown */ - if ( !PORT_NULL(out) ) { - OUTPUT_CHANGED(out) = FALSE; - } - if ( !PORT_NULL(Nout) ) { - OUTPUT_CHANGED(Nout) = FALSE; - } - } - } - break; - - case ZERO: - if ( ONE != *set) { - /* output remains at current value */ - *out = *out_old; - if ( !PORT_NULL(out) ) { - OUTPUT_CHANGED(out) = FALSE; - } - if ( !PORT_NULL(Nout) ) { - OUTPUT_CHANGED(Nout) = FALSE; - } - } - else { - if (*out_old != ONE) { /* reset will change output */ - /* output returns to set condition */ - *out = ONE; - - if ( !PORT_NULL(out) ) { - OUTPUT_STATE(out) = ONE; - OUTPUT_DELAY(out) = PARAM(reset_delay); - } - if ( !PORT_NULL(Nout) ) { - OUTPUT_STATE(Nout) = ZERO; - OUTPUT_DELAY(Nout) = PARAM(reset_delay); - } - } - else { - *out = *out_old; /* output already reset */ - if ( !PORT_NULL(out) ) { - OUTPUT_CHANGED(out) = FALSE; - } - if ( !PORT_NULL(Nout) ) { - OUTPUT_CHANGED(Nout) = FALSE; - } - } - } - break; - - case UNKNOWN: - - if ( ONE == *set ) { - /* output goes to ONE */ - *out = ONE; - - if ( !PORT_NULL(out) ) { - OUTPUT_STATE(out) = ONE; - OUTPUT_DELAY(out) = PARAM(reset_delay); - } - if ( !PORT_NULL(Nout) ) { - OUTPUT_STATE(Nout) = ZERO; - OUTPUT_DELAY(Nout) = PARAM(reset_delay); - } - } - else { - *out = *out_old; /* output already unknown */ - if ( !PORT_NULL(out) ) { - OUTPUT_CHANGED(out) = FALSE; - } - if ( !PORT_NULL(Nout) ) { - OUTPUT_CHANGED(Nout) = FALSE; - } - } - break; - } - } - else { - - /**** Test clk value for change ****/ - if ( (*clk != *clk_old) && (*reset != ONE) && - (*set != ONE) ) { /* clock or clock release */ - switch ( *clk ) { - - case ONE: - /* active edge...calculate new data output */ - s_input = INPUT_STATE(s); - r_input = INPUT_STATE(r); - temp = cm_eval_sr_result(s_input,r_input,*out_old); - - - if (*out_old != temp) { /* clk will change output */ - - *out = temp; - - if ( !PORT_NULL(out) ) { - OUTPUT_STATE(out) = temp; - OUTPUT_DELAY(out) = PARAM(clk_delay); - } - - cm_toggle_bit(&temp); - - if ( !PORT_NULL(Nout) ) { - OUTPUT_STATE(Nout) = temp; - OUTPUT_DELAY(Nout) = PARAM(clk_delay); - } - } - else { - *out = *out_old; /* output same as before */ - if ( !PORT_NULL(out) ) { - OUTPUT_CHANGED(out) = FALSE; - } - if ( !PORT_NULL(Nout) ) { - OUTPUT_CHANGED(Nout) = FALSE; - } - } - break; - - case ZERO: - case UNKNOWN: - /* inactive edge...return previous values */ - *out = *out_old; - if ( !PORT_NULL(out) ) { - OUTPUT_CHANGED(out) = FALSE; - } - if ( !PORT_NULL(Nout) ) { - OUTPUT_CHANGED(Nout) = FALSE; - } - break; - - } - } - - else { /* data value must have changed... - return previous output value. */ - *out = *out_old; - if ( !PORT_NULL(out) ) { - OUTPUT_CHANGED(out) = FALSE; - } - if ( !PORT_NULL(Nout) ) { - OUTPUT_CHANGED(Nout) = FALSE; - } - } - } - } - - - /***** Add additional rise or fall delays, if appropriate *****/ - - if ( *out != *out_old ) { /*** output value is changing ***/ - - switch ( *out ) { - - /** fall to zero value **/ - case 0: - if ( !PORT_NULL(out) ) { - OUTPUT_DELAY(out) += PARAM(fall_delay); - } - if ( !PORT_NULL(Nout) ) { - OUTPUT_DELAY(Nout) += PARAM(rise_delay); - } - break; - - /** rise to one value **/ - case 1: - if ( !PORT_NULL(out) ) { - OUTPUT_DELAY(out) += PARAM(rise_delay); - } - if ( !PORT_NULL(Nout) ) { - OUTPUT_DELAY(Nout) += PARAM(fall_delay); - } - break; - - /** unknown output **/ - default: - /* based on old value, add rise or fall delay */ - if (0 == *out_old) { /* add rising delay */ - if ( !PORT_NULL(out) ) { - OUTPUT_DELAY(out) += PARAM(rise_delay); - } - if ( !PORT_NULL(Nout) ) { - OUTPUT_DELAY(Nout) += PARAM(fall_delay); - } - } - else { /* add falling delay */ - if ( !PORT_NULL(out) ) { - OUTPUT_DELAY(out) += PARAM(fall_delay); - } - if ( !PORT_NULL(Nout) ) { - OUTPUT_DELAY(Nout) += PARAM(rise_delay); - } - } - break; - } - } - } - - /*** output strength values ***/ - if ( !PORT_NULL(out) ) { - OUTPUT_STRENGTH(out) = STRONG; - } - if ( !PORT_NULL(Nout) ) { - OUTPUT_STRENGTH(Nout) = STRONG; - } -} - - - - - diff --git a/src/xspice/icm/digital/d_srff/ifspec.ifs b/src/xspice/icm/digital/d_srff/ifspec.ifs deleted file mode 100644 index a999a25a3..000000000 --- a/src/xspice/icm/digital/d_srff/ifspec.ifs +++ /dev/null @@ -1,136 +0,0 @@ -/*.......1.........2.........3.........4.........5.........6.........7.........8 -================================================================================ -Public Domain - -Georgia Tech Research Corporation -Atlanta, Georgia 30332 - - -AUTHORS - - 30 Sept 1991 Jeffrey P. Murray - - -SUMMARY - - This file contains the interface specification file for the - digital d_srff code model. - -===============================================================================*/ - -NAME_TABLE: - - -C_Function_Name: cm_d_srff -Spice_Model_Name: d_srff -Description: "digital set-reset flip flop" - - -PORT_TABLE: - -Port_Name: s r -Description: "s input" "r input" -Direction: in in -Default_Type: d d -Allowed_Types: [d] [d] -Vector: no no -Vector_Bounds: - - -Null_Allowed: no no - - -PORT_TABLE: - -Port_Name: clk -Description: "clock" -Direction: in -Default_Type: d -Allowed_Types: [d] -Vector: no -Vector_Bounds: - -Null_Allowed: no - - -PORT_TABLE: - -Port_Name: set reset -Description: "asynch. set" "asynch. reset" -Direction: in in -Default_Type: d d -Allowed_Types: [d] [d] -Vector: no no -Vector_Bounds: - - -Null_Allowed: yes yes - - -PORT_TABLE: - -Port_Name: out Nout -Description: "data output" "inverted data output" -Direction: out out -Default_Type: d d -Allowed_Types: [d] [d] -Vector: no no -Vector_Bounds: - - -Null_Allowed: yes yes - - -PARAMETER_TABLE: - -Parameter_Name: clk_delay set_delay -Description: "delay from clk" "delay from set" -Data_Type: real real -Default_Value: 1.0e-9 1.0e-9 -Limits: [1e-12 -] [1e-12 -] -Vector: no no -Vector_Bounds: - - -Null_Allowed: yes yes - - -PARAMETER_TABLE: - -Parameter_Name: reset_delay ic -Description: "delay from reset" "output initial state" -Data_Type: real int -Default_Value: 1.0e-9 0 -Limits: [1e-12 -] [0 2] -Vector: no no -Vector_Bounds: - - -Null_Allowed: yes yes - - -PARAMETER_TABLE: - -Parameter_Name: rise_delay fall_delay -Description: "rise delay" "fall delay" -Data_Type: real real -Default_Value: 1.0e-9 1.0e-9 -Limits: [1e-12 -] [1e-12 -] -Vector: no no -Vector_Bounds: - - -Null_Allowed: yes yes - - -PARAMETER_TABLE: - -Parameter_Name: sr_load clk_load -Description: "s,r load values (F)" "clk load value (F)" -Data_Type: real real -Default_Value: 1.0e-12 1.0e-12 -Limits: - - -Vector: no no -Vector_Bounds: - - -Null_Allowed: yes yes - - -PARAMETER_TABLE: - -Parameter_Name: set_load reset_load -Description: "set load value (F)" "reset load value (F)" -Data_Type: real real -Default_Value: 1.0e-12 1.0e-12 -Limits: - - -Vector: no no -Vector_Bounds: - - -Null_Allowed: yes yes - - diff --git a/src/xspice/icm/digital/d_srlatch/cfunc.mod b/src/xspice/icm/digital/d_srlatch/cfunc.mod deleted file mode 100644 index e46f9eb64..000000000 --- a/src/xspice/icm/digital/d_srlatch/cfunc.mod +++ /dev/null @@ -1,834 +0,0 @@ -/*.......1.........2.........3.........4.........5.........6.........7.........8 -================================================================================ - -FILE /cfunc.mod - -Public Domain - -Georgia Tech Research Corporation -Atlanta, Georgia 30332 -PROJECT A-8503-405 - - -AUTHORS - - 25 Jun 1991 Jeffrey P. Murray - -MODIFICATIONS - - 13 Aug 1991 Jeffrey P. Murray - 30 Sep 1991 Jeffrey P. Murray - 29 Jan 1992 Jeffrey P. Murray - -SUMMARY - - This file contains the model-specific routines used to - functionally describe the code model. - - -INTERFACES - - FILE ROUTINE CALLED - - CMutil.c void cm_toggle_bit(); - - CMevt.c void *cm_event_alloc() - void *cm_event_get_ptr() - - -REFERENCED FILES - - Inputs from and outputs to ARGS structure. - - -NON-STANDARD FEATURES - - NONE - -===============================================================================*/ - -/*=== INCLUDE FILES ====================*/ - - - - -/*=== CONSTANTS ========================*/ - - - - -/*=== MACROS ===========================*/ - - - - -/*=== LOCAL VARIABLES & TYPEDEFS =======*/ - - - - -/*=== FUNCTION PROTOTYPE DEFINITIONS ===*/ - - - - - - -/*============================================================================== - -FUNCTION cm_toggle_bit() - - -AUTHORS - - 27 Sept 1991 Jeffrey P. Murray - - -MODIFICATIONS - - NONE - - -SUMMARY - - Alters the state of a passed digital variable to its - complement. Thus, a ONE changes to a ZERO. A ZERO changes - to a ONE, and an UNKNOWN remains unchanged. - - -INTERFACES - - FILE ROUTINE CALLED - - N/A N/A - - -RETURNED VALUE - - No returned value. Passed pointer to variable is used - to redefine the variable value. - - -GLOBAL VARIABLES - - NONE - - -NON-STANDARD FEATURES - - NONE - - -===============================================================================*/ - -/*=== CM_TOGGLE_BIT ROUTINE ===*/ - -static void cm_toggle_bit(Digital_State_t *bit) - -{ - /* Toggle bit from ONE to ZERO or vice versa, unless the - bit value is UNKNOWN. In the latter case, return - without changing the bit value. */ - - if ( UNKNOWN != *bit ) { - if ( ONE == *bit ) { - *bit = ZERO; - } - else { - *bit = ONE; - } - } - -} - - - -/*============================================================================== - -FUNCTION cm_eval_sr_result - -AUTHORS - - 30 Sept 1991 Jeffrey P. Murray - -MODIFICATIONS - - NONE - -SUMMARY - - Evaluates the S and R input states, plus the last state of - the latch, and returns the expected output value. - -INTERFACES - - FILE ROUTINE CALLED - - CMutil.c void cm_toggle_bit(); - - -RETURNED VALUE - - A Digital_State_t. - -GLOBAL VARIABLES - - NONE - -NON-STANDARD FEATURES - - NONE - -==============================================================================*/ - -/*=== CM_EVAL_SR_RESULT ROUTINE ===*/ - -static Digital_State_t cm_eval_sr_result(Digital_State_t s_input, - Digital_State_t r_input, - Digital_State_t old_output) -{ - Digital_State_t output = ZERO; - - - switch (s_input) { - - case ZERO: - switch (r_input) { - case ZERO: - output = old_output; - break; - case ONE: - output = ZERO; - break; - case UNKNOWN: - output = UNKNOWN; - break; - } - break; - - case ONE: - switch (r_input) { - case ZERO: - output = ONE; - break; - case ONE: - output = UNKNOWN; - break; - case UNKNOWN: - output = UNKNOWN; - break; - } - break; - - - case UNKNOWN: - output = UNKNOWN; - break; - } - - return output; - -} - - - -/*============================================================================== - -FUNCTION cm_d_srlatch() - -AUTHORS - - 25 Jun 1991 Jeffrey P. Murray - -MODIFICATIONS - - 13 Aug 1991 Jeffrey P. Murray - 30 Sep 1991 Jeffrey P. Murray - 29 Jan 1992 Jeffrey P. Murray - -SUMMARY - - This function implements the d_srlatch code model. - -INTERFACES - - FILE ROUTINE CALLED - - CMutil.c void cm_toggle_bit(); - - CMevt.c void *cm_event_alloc() - void *cm_event_get_ptr() - -RETURNED VALUE - - Returns inputs and outputs via ARGS structure. - -GLOBAL VARIABLES - - NONE - -NON-STANDARD FEATURES - - NONE - -==============================================================================*/ - -/*=== CM_D_SRLATCH ROUTINE ===*/ - -/************************************************ -* The following is the model for the * -* digital sr-type latch for the * -* ATESSE Version 2.0 system. * -* * -* Created 6/25/91 J.P.Murray * -************************************************/ - - -void cm_d_srlatch(ARGS) - -{ - /*int i;*/ /* generic loop counter index */ - - - Digital_State_t *s, /* current s-input value */ - *s_old, /* previous s-input value */ - *r, /* current r-input value */ - *r_old, /* previous r-input value */ - *enable, /* current enable value */ - *enable_old, /* previous enable value */ - *set, /* current set value for srlatch */ - *set_old, /* previous set value for srlatch */ - *reset, /* current reset value for srlatch */ - *reset_old, /* previous reset value for srlatch */ - *out, /* current output for srlatch */ - *out_old, /* previous output for srlatch */ - - temp; /* temp storage for state values */ - - - - /*** Setup required state variables ***/ - - if(INIT) { /* initial pass */ - - /* allocate storage */ - cm_event_alloc(0,sizeof(Digital_State_t)); - cm_event_alloc(1,sizeof(Digital_State_t)); - cm_event_alloc(2,sizeof(Digital_State_t)); - cm_event_alloc(3,sizeof(Digital_State_t)); - cm_event_alloc(4,sizeof(Digital_State_t)); - cm_event_alloc(5,sizeof(Digital_State_t)); - - /* declare load values */ - LOAD(s) = PARAM(sr_load); - LOAD(r) = PARAM(sr_load); - LOAD(enable) = PARAM(enable_load); - if ( !PORT_NULL(set) ) { - LOAD(set) = PARAM(set_load); - } - if ( !PORT_NULL(reset) ) { - LOAD(reset) = PARAM(reset_load); - } - - /* retrieve storage for the outputs */ - s = s_old = (Digital_State_t *) cm_event_get_ptr(0,0); - r = r_old = (Digital_State_t *) cm_event_get_ptr(1,0); - enable = enable_old = (Digital_State_t *) cm_event_get_ptr(2,0); - set = set_old = (Digital_State_t *) cm_event_get_ptr(3,0); - reset = reset_old = (Digital_State_t *) cm_event_get_ptr(4,0); - out = out_old = (Digital_State_t *) cm_event_get_ptr(5,0); - - } - else { /* Retrieve previous values */ - - /* retrieve storage for the outputs */ - s = (Digital_State_t *) cm_event_get_ptr(0,0); - s_old = (Digital_State_t *) cm_event_get_ptr(0,1); - r = (Digital_State_t *) cm_event_get_ptr(1,0); - r_old = (Digital_State_t *) cm_event_get_ptr(1,1); - enable = (Digital_State_t *) cm_event_get_ptr(2,0); - enable_old = (Digital_State_t *) cm_event_get_ptr(2,1); - set = (Digital_State_t *) cm_event_get_ptr(3,0); - set_old = (Digital_State_t *) cm_event_get_ptr(3,1); - reset = (Digital_State_t *) cm_event_get_ptr(4,0); - reset_old = (Digital_State_t *) cm_event_get_ptr(4,1); - out = (Digital_State_t *) cm_event_get_ptr(5,0); - out_old = (Digital_State_t *) cm_event_get_ptr(5,1); - } - - - - /******* load current input values if set or reset - are not connected, set to zero... *******/ - *s = INPUT_STATE(s); - *r = INPUT_STATE(r); - *enable = INPUT_STATE(enable); - if ( PORT_NULL(set) ) { - *set = *set_old = ZERO; - } - else { - *set = INPUT_STATE(set); - } - if ( PORT_NULL(reset) ) { - *reset = *reset_old = ZERO; - } - else { - *reset = INPUT_STATE(reset); - } - - - - - /******* Determine analysis type and output appropriate values *******/ - - if (0.0 == TIME) { /****** DC analysis...output w/o delays ******/ - - temp = (Digital_State_t) PARAM(ic); - - /** Modify output if set or reset lines are active **/ - if ( (*enable==ONE) && (*s==ONE) && (*r==ZERO) ) temp = ONE; - if ( (*enable==ONE) && (*s==ZERO) && (*r==ONE) ) temp = ZERO; - if ( (*set==ONE) && (*reset==ZERO) ) temp = ONE; - if ( (*set==ZERO) && (*reset==ONE) ) temp = ZERO; - if ( (*set==ONE) && (*reset==ONE) ) temp = UNKNOWN; - - *out = *out_old = temp; - - if ( !PORT_NULL(out) ) { - OUTPUT_STATE(out) = temp; - } - if ( !PORT_NULL(Nout) ) { - cm_toggle_bit(&temp); - OUTPUT_STATE(Nout) = temp; - } - } - - else { /****** Transient Analysis ******/ - - - /***** Find input that has changed... *****/ - - /**** Test set value for change ****/ - if ( *set != *set_old ) { /* either set or set release */ - switch ( *set ) { - - case ONE: - if ( ONE != *reset) { - if (*out_old != ONE) { /* set will change output */ - *out = ONE; - - /* output goes to ONE */ - if ( !PORT_NULL(out) ) { - OUTPUT_STATE(out) = ONE; - OUTPUT_DELAY(out) = PARAM(set_delay); - } - if ( !PORT_NULL(Nout) ) { - OUTPUT_STATE(Nout) = ZERO; - OUTPUT_DELAY(Nout) = PARAM(set_delay); - } - } - else { - *out = *out_old; /* output already set */ - if ( !PORT_NULL(out) ) { - OUTPUT_CHANGED(out) = FALSE; - } - if ( !PORT_NULL(Nout) ) { - OUTPUT_CHANGED(Nout) = FALSE; - } - } - } - else { - if (*out_old != UNKNOWN) { /* set will change output */ - *out = UNKNOWN; - - /* output goes to UNKNOWN */ - if ( !PORT_NULL(out) ) { - OUTPUT_STATE(out) = UNKNOWN; - OUTPUT_DELAY(out) = PARAM(set_delay); - } - if ( !PORT_NULL(Nout) ) { - OUTPUT_STATE(Nout) = UNKNOWN; - OUTPUT_DELAY(Nout) = PARAM(set_delay); - } - } - else { - *out = *out_old; /* output already unknown */ - if ( !PORT_NULL(out) ) { - OUTPUT_CHANGED(out) = FALSE; - } - if ( !PORT_NULL(Nout) ) { - OUTPUT_CHANGED(Nout) = FALSE; - } - } - } - break; - - case ZERO: - case UNKNOWN: - if ( ONE != *reset) { - if ( ONE == *enable ) { - /* active level...save & output current value */ - temp = cm_eval_sr_result(*s,*r,*out_old); - - if (*out_old != temp) { /* enable will change output */ - *out = temp; - - if ( !PORT_NULL(out) ) { - OUTPUT_STATE(out) = temp; - OUTPUT_DELAY(out) = PARAM(set_delay); - } - if ( !PORT_NULL(Nout) ) { - cm_toggle_bit(&temp); - OUTPUT_STATE(Nout) = temp; - OUTPUT_DELAY(Nout) = PARAM(set_delay); - } - } - else { - *out = *out_old; /* output same as before */ - if ( !PORT_NULL(out) ) { - OUTPUT_CHANGED(out) = FALSE; - } - if ( !PORT_NULL(Nout) ) { - OUTPUT_CHANGED(Nout) = FALSE; - } - } - } - else { - /* output remains at current value */ - *out = *out_old; - if ( !PORT_NULL(out) ) { - OUTPUT_CHANGED(out) = FALSE; - } - if ( !PORT_NULL(Nout) ) { - OUTPUT_CHANGED(Nout) = FALSE; - } - } - } - else { - if (*out_old != ZERO) { /* set will change output */ - /* output returns to reset condition */ - *out = ZERO; - - if ( !PORT_NULL(out) ) { - OUTPUT_STATE(out) = ZERO; - OUTPUT_DELAY(out) = PARAM(set_delay); - } - if ( !PORT_NULL(Nout) ) { - OUTPUT_STATE(Nout) = ONE; - OUTPUT_DELAY(Nout) = PARAM(set_delay); - } - } - else { - *out = *out_old; /* output already reset */ - if ( !PORT_NULL(out) ) { - OUTPUT_CHANGED(out) = FALSE; - } - if ( !PORT_NULL(Nout) ) { - OUTPUT_CHANGED(Nout) = FALSE; - } - } - } - break; - - } - } - else { - - /**** Test reset value for change ****/ - if ( *reset != *reset_old ) { /* either reset or reset release */ - switch ( *reset ) { - - case ONE: - if ( ONE != *set) { - if (*out_old != ZERO) { /* reset will change output */ - /* output goes to ZERO */ - *out = ZERO; - - if ( !PORT_NULL(out) ) { - OUTPUT_STATE(out) = ZERO; - OUTPUT_DELAY(out) = PARAM(reset_delay); - } - if ( !PORT_NULL(Nout) ) { - OUTPUT_STATE(Nout) = ONE; - OUTPUT_DELAY(Nout) = PARAM(reset_delay); - } - } - else { - *out = *out_old; /* output already reset */ - if ( !PORT_NULL(out) ) { - OUTPUT_CHANGED(out) = FALSE; - } - if ( !PORT_NULL(Nout) ) { - OUTPUT_CHANGED(Nout) = FALSE; - } - } - } - else { - if (*out_old != UNKNOWN) { /* reset will change output */ - /* output goes to UNKNOWN */ - *out = UNKNOWN; - - if ( !PORT_NULL(out) ) { - OUTPUT_STATE(out) = UNKNOWN; - OUTPUT_DELAY(out) = PARAM(reset_delay); - } - if ( !PORT_NULL(Nout) ) { - OUTPUT_STATE(Nout) = UNKNOWN; - OUTPUT_DELAY(Nout) = PARAM(reset_delay); - } - } - else { - *out = *out_old; /* output already unknown */ - if ( !PORT_NULL(out) ) { - OUTPUT_CHANGED(out) = FALSE; - } - if ( !PORT_NULL(Nout) ) { - OUTPUT_CHANGED(Nout) = FALSE; - } - } - } - break; - - case ZERO: - case UNKNOWN: - if ( ONE != *set) { - if ( ONE == *enable ) { - /* active level...save & output current value */ - temp = cm_eval_sr_result(*s,*r,*out_old); - - if (*out_old != temp) { /* enable will change output */ - *out = temp; - - if ( !PORT_NULL(out) ) { - OUTPUT_STATE(out) = temp; - OUTPUT_DELAY(out) = PARAM(reset_delay); - } - if ( !PORT_NULL(Nout) ) { - cm_toggle_bit(&temp); - OUTPUT_STATE(Nout) = temp; - OUTPUT_DELAY(Nout) = PARAM(reset_delay); - } - } - else { - *out = *out_old; /* output same as before */ - if ( !PORT_NULL(out) ) { - OUTPUT_CHANGED(out) = FALSE; - } - if ( !PORT_NULL(Nout) ) { - OUTPUT_CHANGED(Nout) = FALSE; - } - } - } - else { - /* output remains at current value */ - *out = *out_old; - if ( !PORT_NULL(out) ) { - OUTPUT_CHANGED(out) = FALSE; - } - if ( !PORT_NULL(Nout) ) { - OUTPUT_CHANGED(Nout) = FALSE; - } - } - } - else { - if (*out_old != ONE) { /* reset will change output */ - /* output returns to set condition */ - *out = ONE; - - if ( !PORT_NULL(out) ) { - OUTPUT_STATE(out) = ONE; - OUTPUT_DELAY(out) = PARAM(reset_delay); - } - if ( !PORT_NULL(Nout) ) { - OUTPUT_STATE(Nout) = ZERO; - OUTPUT_DELAY(Nout) = PARAM(reset_delay); - } - } - else { - *out = *out_old; /* output already reset */ - if ( !PORT_NULL(out) ) { - OUTPUT_CHANGED(out) = FALSE; - } - if ( !PORT_NULL(Nout) ) { - OUTPUT_CHANGED(Nout) = FALSE; - } - } - } - break; - } - } - else { - - /**** Test for enable change... ****/ - if ( (*enable != *enable_old) && (*reset != ONE) && - (*set != ONE) ) { /* enable or enable release */ - switch ( *enable ) { - - case ONE: - /* active edge...save & output current data value */ - temp = cm_eval_sr_result(*s,*r,*out_old); - - if (*out_old != temp) { /* enable will change output */ - *out = temp; - - if ( !PORT_NULL(out) ) { - OUTPUT_STATE(out) = temp; - OUTPUT_DELAY(out) = PARAM(enable_delay); - } - if ( !PORT_NULL(Nout) ) { - cm_toggle_bit(&temp); - OUTPUT_STATE(Nout) = temp; - OUTPUT_DELAY(Nout) = PARAM(enable_delay); - } - } - else { - *out = *out_old; /* output same as before */ - if ( !PORT_NULL(out) ) { - OUTPUT_CHANGED(out) = FALSE; - } - if ( !PORT_NULL(Nout) ) { - OUTPUT_CHANGED(Nout) = FALSE; - } - } - break; - - case ZERO: - case UNKNOWN: - /* inactive edge...return previous values */ - *out = *out_old; - if ( !PORT_NULL(out) ) { - OUTPUT_CHANGED(out) = FALSE; - } - if ( !PORT_NULL(Nout) ) { - OUTPUT_CHANGED(Nout) = FALSE; - } - break; - } - } - - else { /* test data value for change... */ - - if ( ((*s != *s_old) || (*r != *r_old)) && - (*reset != ONE) && (*set != ONE) ) { - /* input values have changed... - test enable, and if active, update - the output...else return w/o change. */ - switch ( *enable ) { - - case ONE: - /* active level...save & output current data value */ - temp = cm_eval_sr_result(*s,*r,*out_old); - - if (*out_old != temp) { /* enable will change output */ - *out = temp; - - if ( !PORT_NULL(out) ) { - OUTPUT_STATE(out) = temp; - OUTPUT_DELAY(out) = PARAM(sr_delay); - } - if ( !PORT_NULL(Nout) ) { - cm_toggle_bit(&temp); - OUTPUT_STATE(Nout) = temp; - OUTPUT_DELAY(Nout) = PARAM(sr_delay); - } - } - else { - *out = *out_old; /* output same as before */ - if ( !PORT_NULL(out) ) { - OUTPUT_CHANGED(out) = FALSE; - } - if ( !PORT_NULL(Nout) ) { - OUTPUT_CHANGED(Nout) = FALSE; - } - } - break; - - case ZERO: - case UNKNOWN: - /* inactive level...return previous values */ - *out = *out_old; - if ( !PORT_NULL(out) ) { - OUTPUT_CHANGED(out) = FALSE; - } - if ( !PORT_NULL(Nout) ) { - OUTPUT_CHANGED(Nout) = FALSE; - } - break; - } - } - else { /* nothing has changed!!! This shouldn't happen! */ - *out = *out_old; - if ( !PORT_NULL(out) ) { - OUTPUT_CHANGED(out) = FALSE; - } - if ( !PORT_NULL(Nout) ) { - OUTPUT_CHANGED(Nout) = FALSE; - } - } - } - } - } - - /***** Add additional rise or fall delays, if appropriate *****/ - - if ( *out != *out_old ) { /*** output value is changing ***/ - - switch ( *out ) { - - /** fall to zero value **/ - case 0: - if ( !PORT_NULL(out) ) { - OUTPUT_DELAY(out) += PARAM(fall_delay); - } - if ( !PORT_NULL(Nout) ) { - OUTPUT_DELAY(Nout) += PARAM(rise_delay); - } - break; - - /** rise to one value **/ - case 1: - if ( !PORT_NULL(out) ) { - OUTPUT_DELAY(out) += PARAM(rise_delay); - } - if ( !PORT_NULL(Nout) ) { - OUTPUT_DELAY(Nout) += PARAM(fall_delay); - } - break; - - /** unknown output **/ - default: - /* based on old value, add rise or fall delay */ - if (0 == *out_old) { /* add rising delay */ - if ( !PORT_NULL(out) ) { - OUTPUT_DELAY(out) += PARAM(rise_delay); - } - if ( !PORT_NULL(Nout) ) { - OUTPUT_DELAY(Nout) += PARAM(fall_delay); - } - } - else { /* add falling delay */ - if ( !PORT_NULL(out) ) { - OUTPUT_DELAY(out) += PARAM(fall_delay); - } - if ( !PORT_NULL(Nout) ) { - OUTPUT_DELAY(Nout) += PARAM(rise_delay); - } - } - break; - } - } - } - - /*** output strength values ***/ - if ( !PORT_NULL(out) ) { - OUTPUT_STRENGTH(out) = STRONG; - } - if ( !PORT_NULL(Nout) ) { - OUTPUT_STRENGTH(Nout) = STRONG; - } -} - - - - - diff --git a/src/xspice/icm/digital/d_srlatch/ifspec.ifs b/src/xspice/icm/digital/d_srlatch/ifspec.ifs deleted file mode 100644 index cb1401ed6..000000000 --- a/src/xspice/icm/digital/d_srlatch/ifspec.ifs +++ /dev/null @@ -1,148 +0,0 @@ -/*.......1.........2.........3.........4.........5.........6.........7.........8 -================================================================================ -Public Domain - -Georgia Tech Research Corporation -Atlanta, Georgia 30332 - - -AUTHORS - - 30 Sept 1991 Jeffrey P. Murray - - -SUMMARY - - This file contains the interface specification file for the - digital d_srlatch code model. - -===============================================================================*/ - -NAME_TABLE: - - -C_Function_Name: cm_d_srlatch -Spice_Model_Name: d_srlatch -Description: "digital sr-type latch" - - -PORT_TABLE: - -Port_Name: s r -Description: "s input" "r input" -Direction: in in -Default_Type: d d -Allowed_Types: [d] [d] -Vector: no no -Vector_Bounds: - - -Null_Allowed: no no - - -PORT_TABLE: - -Port_Name: enable -Description: "enable" -Direction: in -Default_Type: d -Allowed_Types: [d] -Vector: no -Vector_Bounds: - -Null_Allowed: no - - -PORT_TABLE: - -Port_Name: set reset -Description: "asynch. set" "asynch. reset" -Direction: in in -Default_Type: d d -Allowed_Types: [d] [d] -Vector: no no -Vector_Bounds: - - -Null_Allowed: yes yes - - -PORT_TABLE: - -Port_Name: out Nout -Description: "data output" "inverted data output" -Direction: out out -Default_Type: d d -Allowed_Types: [d] [d] -Vector: no no -Vector_Bounds: - - -Null_Allowed: yes yes - - -PARAMETER_TABLE: - -Parameter_Name: sr_delay -Description: "delay from s or r input change" -Data_Type: real -Default_Value: 1.0e-9 -Limits: [1e-12 -] -Vector: no -Vector_Bounds: - -Null_Allowed: yes - - -PARAMETER_TABLE: - -Parameter_Name: enable_delay set_delay -Description: "delay from clk" "delay from set" -Data_Type: real real -Default_Value: 1.0e-9 1.0e-9 -Limits: [1e-12 -] [1e-12 -] -Vector: no no -Vector_Bounds: - - -Null_Allowed: yes yes - - -PARAMETER_TABLE: - -Parameter_Name: reset_delay ic -Description: "delay from reset" "output initial state" -Data_Type: real int -Default_Value: 1.0e-9 0 -Limits: [1e-12 -] [0 2] -Vector: no no -Vector_Bounds: - - -Null_Allowed: yes yes - - -PARAMETER_TABLE: - -Parameter_Name: rise_delay fall_delay -Description: "rise delay" "fall delay" -Data_Type: real real -Default_Value: 1.0e-9 1.0e-9 -Limits: [1e-12 -] [1e-12 -] -Vector: no no -Vector_Bounds: - - -Null_Allowed: yes yes - - -PARAMETER_TABLE: - -Parameter_Name: sr_load enable_load -Description: "s & r load values (F)" "clk load value (F)" -Data_Type: real real -Default_Value: 1.0e-12 1.0e-12 -Limits: - - -Vector: no no -Vector_Bounds: - - -Null_Allowed: yes yes - - -PARAMETER_TABLE: - -Parameter_Name: set_load reset_load -Description: "set load value (F)" "reset load value (F)" -Data_Type: real real -Default_Value: 1.0e-12 1.0e-12 -Limits: - - -Vector: no no -Vector_Bounds: - - -Null_Allowed: yes yes - - diff --git a/src/xspice/icm/digital/d_state/cfunc.mod b/src/xspice/icm/digital/d_state/cfunc.mod deleted file mode 100644 index 472738f98..000000000 --- a/src/xspice/icm/digital/d_state/cfunc.mod +++ /dev/null @@ -1,1997 +0,0 @@ -/*.......1.........2.........3.........4.........5.........6.........7.........8 -================================================================================ - -FILE d_state/cfunc.mod - -Public Domain - -Georgia Tech Research Corporation -Atlanta, Georgia 30332 -PROJECT A-8503-405 - - -AUTHORS - - 6 June 1991 Jeffrey P. Murray - - -MODIFICATIONS - - 30 Sept 1991 Jeffrey P. Murray - - -SUMMARY - - This file contains the model-specific routines used to - functionally describe the code model. - - -INTERFACES - - FILE ROUTINE CALLED - - CMmacros.h cm_message_send(); - - CMevt.c void *cm_event_alloc() - void *cm_event_get_ptr() - - -REFERENCED FILES - - Inputs from and outputs to ARGS structure. - - -NON-STANDARD FEATURES - - NONE - -===============================================================================*/ - -/*=== INCLUDE FILES ====================*/ - -#include -#include -#include -#include -#include - -/*=== CONSTANTS ========================*/ - -#define MAX_STRING_SIZE 200 - -#define HEADER 1 -#define CONTINUATION 2 - -#define OK 0 -#define FAIL 1 - -/*=== MACROS ===========================*/ - -/*=== LOCAL VARIABLES & TYPEDEFS =======*/ - -typedef struct { - int current_state, /* current state of the machine (similar to - current state of the union, current state - of the economy, etc. etc. 8-) */ - index0, /* actual word number (0 to depth-1) in which the - first line of the current_state definition - may be found. */ - indexN; /* word number (0 to depth-1) of the final curren_state - definition line...if a state is defined in only one - line, index0 and indexN will be equal. */ -} Dynamic_State_t; - -typedef struct { - int num_outputs,/* width of bits[] table...equal to size of out port.*/ - num_inputs, /* width of inputs[] table...equal to size of in port*/ - depth, /* depth of table...equal to size of - current_state & next_state arrays, - and to the total number of vectors - retrieved from the state.in file. */ - *state, /* integer array holding the state - index values...note that each state will - have at least one and as many as 2^N - "words" assigned to it, where N = number - of input lines to the state machine. */ - *next_state; /* integer array holding the next state - to jump to given the input values - held by the inputs[] array...note that each - state will have at least one and as many as 2^N - "words" assigned to it, where N = number - of input lines to the state machine. */ - - - short *bits, /* the storage array for the - output bit representations... - this will have size equal to - (width * depth)/4, since one - short will hold four 12-state - bit descriptions. */ - *inputs; /* the storage array for the - input bit representations... - this will have size equal to - (width * depth)/8, since one - short will hold eight 3-state - bit descriptions. */ -} State_Table_t; - -/* Type definition for each possible token returned. */ - -typedef enum token_type_s {CNV_NO_TOK,CNV_STRING_TOK} Cnv_Token_Type_t; -typedef char line_t[82]; /* A SPICE size line. <= 80 characters plus '\n\0' */ - - -/*=== FUNCTION PROTOTYPE DEFINITIONS ===*/ - - -/*============================================================================== - -FUNCTION *CNVgettok() - -AUTHORS - - 13 Jun 1991 Jeffrey P. Murray - -MODIFICATIONS - - 8 Aug 1991 Jeffrey P. Murray - 30 Sep 1991 Jeffrey P. Murray - -SUMMARY - - This function obtains the next token from an input stream. - -INTERFACES - - FILE ROUTINE CALLED - - N/A N/A - -RETURNED VALUE - - Returns a string value representing the next token. - -GLOBAL VARIABLES - - NONE - -NON-STANDARD FEATURES - - NONE - -==============================================================================*/ - - -/*=== Static CNVgettok ROUTINE ================*/ -/* -Get the next token from the input string. The input string pointer -is advanced to the following token and the token from the input -string is copied to malloced storage and a pointer to that storage -is returned. The original input string is undisturbed. -*/ - -static char *CNVgettok(char **s) - -{ - - char *buf; /* temporary storage to copy token into */ - /*char *temp;*/ /* temporary storage to copy token into */ - char *ret_str; /* storage for returned string */ - - int i; - - /* allocate space big enough for the whole string */ - - buf = (char *) malloc(strlen(*s) + 1); - - /* skip over any white space */ - - while(isspace_c(**s) || (**s == '=') || - (**s == '(') || (**s == ')') || (**s == ',')) - (*s)++; - - /* isolate the next token */ - - switch(**s) { - - case '\0': /* End of string found */ - if(buf) free(buf); - return(NULL); - - - default: /* Otherwise, we are dealing with a */ - /* string representation of a number */ - /* or a mess o' characters. */ - i = 0; - while( (**s != '\0') && - (! ( isspace_c(**s) || (**s == '=') || - (**s == '(') || (**s == ')') || - (**s == ',') - ) ) ) { - buf[i] = **s; - i++; - (*s)++; - } - buf[i] = '\0'; - break; - } - - /* skip over white space up to next token */ - - while(isspace_c(**s) || (**s == '=') || - (**s == '(') || (**s == ')') || (**s == ',')) - (*s)++; - - /* make a copy using only the space needed by the string length */ - - - ret_str = (char *) malloc(strlen(buf) + 1); - ret_str = strcpy(ret_str,buf); - - if(buf) free(buf); - - return(ret_str); -} - - -/*============================================================================== - -FUNCTION *CNVget_token() - -AUTHORS - - 13 Jun 1991 Jeffrey P. Murray - -MODIFICATIONS - - 8 Aug 1991 Jeffrey P. Murray - 30 Sep 1991 Jeffrey P. Murray - -SUMMARY - - This function obtains the next token from an input stream. - -INTERFACES - - FILE ROUTINE CALLED - - N/A N/A - -RETURNED VALUE - - Returns a string value representing the next token. Uses - *CNVget_tok. - -GLOBAL VARIABLES - - NONE - -NON-STANDARD FEATURES - - NONE - -==============================================================================*/ - -/*=== Static CNVget_token ROUTINE =============*/ -/* -Get the next token from the input string together with its type. -The input string pointer -is advanced to the following token and the token from the input -string is copied to malloced storage and a pointer to that storage -is returned. The original input string is undisturbed. -*/ - -static char *CNVget_token(char **s, Cnv_Token_Type_t *type) - -{ - - char *ret_str; /* storage for returned string */ - - /* get the token from the input line */ - - ret_str = CNVgettok(s); - - - /* if no next token, return */ - - if(ret_str == NULL) { - *type = CNV_NO_TOK; - return(NULL); - } - - /* else, determine and return token type */ - - switch(*ret_str) { - - default: - *type = CNV_STRING_TOK; - break; - - } - - return(ret_str); -} - - - - -/*============================================================================== - -FUNCTION cnv_get_spice_value() - -AUTHORS - - ??? Bill Kuhn - -MODIFICATIONS - - 30 Sep 1991 Jeffrey P. Murray - -SUMMARY - - This function takes as input a string token from a SPICE - deck and returns a floating point equivalent value. - -INTERFACES - - FILE ROUTINE CALLED - - N/A N/A - -RETURNED VALUE - - Returns the floating point value in pointer *p_value. Also - returns an integer representing successful completion. - -GLOBAL VARIABLES - - NONE - -NON-STANDARD FEATURES - - NONE - -==============================================================================*/ - -/*=== Static CNV_get_spice_value ROUTINE =============*/ - -/* - Function takes as input a string token from a SPICE -deck and returns a floating point equivalent value. -*/ - - -static int cnv_get_spice_value( -char *str, /* IN - The value text e.g. 1.2K */ -double *p_value ) /* OUT - The numerical value */ -{ - - - /* the following were "int4" devices - jpm */ - size_t len; - size_t i; - int n_matched; - - line_t val_str; - - /*char *suffix;*/ - char c = ' '; - char c1; - - double scale_factor; - double value; - - - /* Scan the input string looking for an alpha character that is not */ - /* 'e' or 'E'. Such a character is assumed to be an engineering */ - /* suffix as defined in the Spice 2G.6 user's manual. */ - - len = strlen(str); - if( len > (sizeof(val_str) - 1)) - len = sizeof(val_str) - 1; - - for(i = 0; i < len; i++) { - c = str[i]; - if( isalpha_c(c) && (c != 'E') && (c != 'e') ) - break; - else if( isspace_c(c) ) - break; - else - val_str[i] = c; - } - val_str[i] = '\0'; - - - /* Determine the scale factor */ - - if( (i >= len) || (! isalpha_c(c)) ) - scale_factor = 1.0; - else { - - if(islower_c(c)) - c = tolower_c(c); - - switch(c) { - - case 't': - scale_factor = 1.0e12; - break; - - case 'g': - scale_factor = 1.0e9; - break; - - case 'k': - scale_factor = 1.0e3; - break; - - case 'u': - scale_factor = 1.0e-6; - break; - - case 'n': - scale_factor = 1.0e-9; - break; - - case 'p': - scale_factor = 1.0e-12; - break; - - case 'f': - scale_factor = 1.0e-15; - break; - - case 'm': - i++; - if(i >= len) { - scale_factor = 1.0e-3; - break; - } - c1 = str[i]; - if(! isalpha_c(c1)) { - scale_factor = 1.0e-3; - break; - } - if(islower_c(c1)) - c1 = toupper_c(c1); - if(c1 == 'E') - scale_factor = 1.0e6; - else if(c1 == 'I') - scale_factor = 25.4e-6; - else - scale_factor = 1.0e-3; - break; - - default: - scale_factor = 1.0; - } - } - - /* Convert the numeric portion to a float and multiply by the */ - /* scale factor. */ - - n_matched = sscanf(val_str,"%le",&value); - - if(n_matched < 1) { - *p_value = 0.0; - return(FAIL); - } - - *p_value = value * scale_factor; - return(OK); -} - - -/*============================================================================== - -FUNCTION cm_inputs_mask_and_retrieve() - -AUTHORS - - 23 Jul 1991 Jeffrey P. Murray - -MODIFICATIONS - - 30 Sep 1991 Jeffrey P. Murray - -SUMMARY - - Masks off and retrieves a two-bit value from a short - integer word passed to the function, using an offset value. - This effectively handles retrieval of eight two-bit values - from a single short integer space in order to conserve memory. - -INTERFACES - - FILE ROUTINE CALLED - - N/A N/A - - -RETURNED VALUE - - Returns a Digital_t value. - -GLOBAL VARIABLES - - NONE - -NON-STANDARD FEATURES - - NONE - -==============================================================================*/ - -/*=== Static CM_INPUTS_MASK_AND_RETRIEVE ROUTINE ===*/ - -/************************************************** -* The following routine masks and retrieves * -* the value passed to it by the out value * -* by masking the appropriate bits in the * -* base integer. The particular bit affected * -* is determined by the bit_offset value. * -* * -* Created 7/23/91 J.P.Murray * -**************************************************/ - -static Digital_State_t cm_inputs_mask_and_retrieve(short base, int bit_offset) -{ - - - int value; /* the hexadecimal value of the masked bit */ - - - value = 0x0003 & (base >> (bit_offset * 2)); - - - switch (value) { - case 0: return ZERO; - case 1: return ONE; - default: return UNKNOWN; - } - -} - - -/*============================================================================== - -FUNCTION cm_set_indices() - -AUTHORS - - 23 Jul 1991 Jeffrey P. Murray - -MODIFICATIONS - - 30 Sep 1991 Jeffrey P. Murray - -SUMMARY - - The following routine retrieves the current_state value - from the *states structure. It then searches the entire - state[] array to determine the index0 and indexN values - corresponding to the first and last entries in the - state[] array for the current state. - -INTERFACES - - FILE ROUTINE CALLED - - N/A N/A - - -RETURNED VALUE - - Returns a status int value. - -GLOBAL VARIABLES - - NONE - -NON-STANDARD FEATURES - - NONE - -==============================================================================*/ - -/*=== Static CM_SET_INDICES ROUTINE ===*/ - -/************************************************ -* The following routine retrieves the * -* current_state value from the *states * -* structure. It then searches the entire * -* state[] array to determine the index0 and * -* indexN values corresponding to the first * -* and last entries in the state[] array for * -* the current state. * -* * -* Created 7/23/91 J.P. Murray * -************************************************/ - - -static int cm_set_indices(Dynamic_State_t *states, State_Table_t *table) -{ - int i, /* indexing variable */ - index0_set, /* flag for index0 */ - indexN_set; /* flag for index1 */ - - - states->index0 = 0; - states->indexN = 0; - index0_set = 0; - indexN_set = 0; - - for (i = 0; i < table->depth; i++) { - /* Loop through all states. */ - - if (table->state[i] == states->current_state) { - /* states match... */ - - /* if not already set, set index0... */ - if ( 0 == index0_set ) { - states->index0 = i; - states->indexN = i; - index0_set = 1; - } - - if ( 1 < (i - states->indexN) ) { - /* ERROR!! This means that a state match was - found in a nonn-contiguous portion of the - state.in file...this is not allowed! */ - return TRUE; - } - else { - /* update indexN. */ - states->indexN = i; - } - } - } - return FALSE; -} - - -/*============================================================================== - -FUNCTION cm_compare_to_inputs() - -AUTHORS - - 23 Jul 1991 Jeffrey P. Murray - -MODIFICATIONS - - 30 Sep 1991 Jeffrey P. Murray - -SUMMARY - - The following routine retrieves the - the inputs[] bit value pointed to by - the word_num and bit_num integers, compares - this value with the "in" state value, and - returns a "0" if they match, and a "1" if - they do not match. - -INTERFACES - - FILE ROUTINE CALLED - - N/A N/A - - -RETURNED VALUE - - Returns a status int value. - -GLOBAL VARIABLES - - NONE - -NON-STANDARD FEATURES - - NONE - -==============================================================================*/ - -/*=== Static CM_COMPARE_TO_INPUTS ROUTINE ===*/ - -/************************************************ -* The following routine retrieves the * -* the inputs[] bit value pointed to by * -* the word_num and bit_num integers, compares * -* this value with the "in" state value, and * -* returns a "0" if they match, and a "1" if * -* they do not match. * -* * -* Created 7/23/91 J.P.Murray * -************************************************/ - - -static int cm_compare_to_inputs(State_Table_t *table, int index, - int bit_number, Digital_State_t in) -{ - int int1, /* temp storage variable */ - bit_index, /* bits base address at which word bits will - be found */ - bit_offset; /* offset from ram base address at which bit[0] - of the required word can be found */ - - short base; /* variable to hold current base integer for - comparison purposes. */ - - Digital_State_t out; /* output variable for state retrieved */ - - - /* obtain offset value from index, word_width & bit_number */ - int1 = index * table->num_inputs + bit_number; - - bit_index = int1 >> 3; - bit_offset = int1 & 7; - - /* retrieve entire base_address bits integer... */ - base = table->inputs[bit_index]; - - /* for each offset, mask off the bits and determine values */ - - out = cm_inputs_mask_and_retrieve(base, bit_offset); - - if ( out == in ) { /* bit matches */ - return 0; - } - else - if ( out == UNKNOWN ) { /* bit compared to is a "don't care" */ - return 0; - } - else { /* no match */ - return 1; - } -} - - -/*============================================================================== - -FUNCTION cm_inputs_mask_and_store() - -AUTHORS - - 22 Jul 1991 Jeffrey P. Murray - -MODIFICATIONS - - 30 Sep 1991 Jeffrey P. Murray - -SUMMARY - - The following routine masks and stores - the value passed to it by the out value - by masking the appropriate bits in the - base integer. The particular bit affected - is determined by the bit_offset value. - This routine stores to the inputs[] array. - - -INTERFACES - - FILE ROUTINE CALLED - - N/A N/A - - -RETURNED VALUE - - Returns a status int value. - -GLOBAL VARIABLES - - NONE - -NON-STANDARD FEATURES - - NONE - -==============================================================================*/ - -/*=== Static CM_INPUTS_MASK_AND_STORE ROUTINE ===*/ - -/************************************************ -* The following routine masks and stores * -* the value passed to it by the out value * -* by masking the appropriate bits in the * -* base integer. The particular bit affected * -* is determined by the bit_offset value. * -* This routine stores to the inputs[] array. * -* * -* Created 7/22/91 * -* Last Modified 7/22/91 J.P.Murray * -************************************************/ - -static void cm_inputs_mask_and_store(short *base,int bit_offset,int bit_value) -{ - *base &= (short) ~ (0x0003 << (bit_offset * 2)); - *base |= (short) (bit_value << (bit_offset * 2)); -} - - - - -/*============================================================================== - -FUNCTION cm_store_inputs_value() - -AUTHORS - - 23 Jul 1991 Jeffrey P. Murray - -MODIFICATIONS - - 30 Sep 1991 Jeffrey P. Murray - -SUMMARY - - The following routine retrieves four-bit - data from short integer array "bits". The - integers are assumed to be at least two - bytes each, so each will hold four four- - bit values. - - - -INTERFACES - - FILE ROUTINE CALLED - - N/A N/A - - -RETURNED VALUE - - NONE - -GLOBAL VARIABLES - - NONE - -NON-STANDARD FEATURES - - NONE - -==============================================================================*/ - -/*=== Static CM_STORE_INPUTS_VALUE ROUTINE ===*/ - -/************************************************ -* The following routine retrieves four-bit * -* data from short integer array "bits". The * -* integers are assumed to be at least two * -* bytes each, so each will hold four four- * -* bit values. * -* * -* Created 7/23/91 J.P.Murray * -************************************************/ - -static void cm_store_inputs_value(State_Table_t *table, int index, - int bit_number, int in_val) - -{ - int /*err,*/ /* error index value */ - int1, /* temp storage variable */ - bit_index, /* bits base address at which word bits will - be found */ - bit_offset; /* offset from ram base address at which bit[0] - of the required word can be found */ - - short base; /* variable to hold current base integer for - comparison purposes. */ - - /* obtain offset value from word_number, word_width & bit_number */ - - int1 = index * table->num_inputs + bit_number; - - bit_index = int1 >> 3; - bit_offset = int1 & 7; - - /* retrieve entire base_address bits integer... */ - base = table->inputs[bit_index]; - - /* for each offset, mask off the bits and store values */ - cm_inputs_mask_and_store(&base,bit_offset,in_val); - - /* store modified base value */ - table->inputs[bit_index] = base; -} - - -/*============================================================================== - -FUNCTION cm_bits_mask_and_store() - -AUTHORS - - 22 Jul 1991 Jeffrey P. Murray - -MODIFICATIONS - - 30 Sep 1991 Jeffrey P. Murray - -SUMMARY - - The following routine masks and stores - the value passed to it by the out value - by masking the appropriate bits in the - base integer. The particular bit affected - is determined by the bit_offset value. - This routine stores to the bits[] array. - - -INTERFACES - - FILE ROUTINE CALLED - - N/A N/A - - -RETURNED VALUE - - Returns a status integer. - -GLOBAL VARIABLES - - NONE - -NON-STANDARD FEATURES - - NONE - -==============================================================================*/ - - -/*=== Static CM_BITS_MASK_AND_STORE ROUTINE ===*/ - -/************************************************ -* The following routine masks and stores * -* the value passed to it by the out value * -* by masking the appropriate bits in the * -* base integer. The particular bit affected * -* is determined by the bit_offset value. * -* This routine stores to the bits[] array. * -* * -* Created 7/22/91 * -* Last Modified 7/22/91 J.P.Murray * -************************************************/ - -static void cm_bits_mask_and_store(short *base,int bit_offset,int bit_value) -{ - *base &= (short) ~ (0x000f << (bit_offset * 4)); - *base |= (short) (bit_value << (bit_offset * 4)); -} - - - - -/*============================================================================== - -FUNCTION cm_bits_mask_and_retrieve() - -AUTHORS - - 22 Jul 1991 Jeffrey P. Murray - -MODIFICATIONS - - 30 Sep 1991 Jeffrey P. Murray - -SUMMARY - - The following routine masks and retrieves - the value passed to it by the out value - by masking the appropriate bits in the - base integer. The particular bit affected - is determined by the bit_offset value. - - - -INTERFACES - - FILE ROUTINE CALLED - - N/A N/A - - -RETURNED VALUE - - NONE - -GLOBAL VARIABLES - - NONE - -NON-STANDARD FEATURES - - NONE - -==============================================================================*/ - -/*=== Static CM_BITS_MASK_AND_RETRIEVE ROUTINE ===*/ - -/************************************************** -* The following routine masks and retrieves * -* the value passed to it by the out value * -* by masking the appropriate bits in the * -* base integer. The particular bit affected * -* is determined by the ram_offset value. * -* * -* Created 7/22/91 * -* Last Modified 7/22/91 J.P.Murray * -**************************************************/ - -static void cm_bits_mask_and_retrieve(short base,int bit_offset,Digital_t *out) -{ - - - int value; /* the hexadecimal value of the masked bit */ - - value = 0x000f & (base >> (bit_offset * 4)); - - - switch (value) { - - case 0: out->state = ZERO; - out->strength = STRONG; - break; - - case 1: out->state = ONE; - out->strength = STRONG; - break; - - case 2: out->state = UNKNOWN; - out->strength = STRONG; - break; - - case 3: out->state = ZERO; - out->strength = RESISTIVE; - break; - - case 4: out->state = ONE; - out->strength = RESISTIVE; - break; - - case 5: out->state = UNKNOWN; - out->strength = RESISTIVE; - break; - - case 6: out->state = ZERO; - out->strength = HI_IMPEDANCE; - break; - - case 7: out->state = ONE; - out->strength = HI_IMPEDANCE; - break; - - case 8: out->state = UNKNOWN; - out->strength = HI_IMPEDANCE; - break; - - case 9: out->state = ZERO; - out->strength = UNDETERMINED; - break; - - case 10: out->state = ONE; - out->strength = UNDETERMINED; - break; - - case 11: out->state = UNKNOWN; - out->strength = UNDETERMINED; - break; - } -} - - -/*============================================================================== - -FUNCTION cm_get_bits_value() - -AUTHORS - - 22 Jul 1991 Jeffrey P. Murray - -MODIFICATIONS - - 23 Jul 1991 Jeffrey P. Murray - 30 Sep 1991 Jeffrey P. Murray - -SUMMARY - - The following routine retrieves four-bit - data from short integer array "bits". The - integers are assumed to be at least two - bytes each, so each will hold four four- - bit values. - - - -INTERFACES - - FILE ROUTINE CALLED - - N/A N/A - - -RETURNED VALUE - - NONE - -GLOBAL VARIABLES - - NONE - -NON-STANDARD FEATURES - - NONE - -==============================================================================*/ - -/*=== Static CM_GET_BITS_VALUE ROUTINE ===*/ - -/************************************************ -* The following routine retrieves four-bit * -* data from short integer array "bits". The * -* integers are assumed to be at least two * -* bytes each, so each will hold four four- * -* bit values. * -* * -* Created 7/22/91 * -* Last Modified 7/23/91 J.P.Murray * -************************************************/ - -static void cm_get_bits_value(State_Table_t *table, int index, - int bit_number, Digital_t *out) - -{ - int /*err,*/ /* error index value */ - int1, /* temp storage variable */ - bit_index, /* bits base address at which word bits will - be found */ - bit_offset; /* offset from ram base address at which bit[0] - of the required word can be found */ - - short base; /* variable to hold current base integer for - comparison purposes. */ - - - - /* obtain offset value from index, word_width & bit_number */ - int1 = index * table->num_outputs + bit_number; - - bit_index = int1 >> 2; - bit_offset = int1 & 3; - - /* retrieve entire base_address bits integer... */ - base = table->bits[bit_index]; - - /* for each offset, mask off the bits and determine values */ - - cm_bits_mask_and_retrieve(base,bit_offset,out); - -} - - - -/*============================================================================== - -FUNCTION cm_store_bits_value() - -AUTHORS - - 23 Jul 1991 Jeffrey P. Murray - -MODIFICATIONS - - 30 Sep 1991 Jeffrey P. Murray - -SUMMARY - - The following routine retrieves four-bit - data from short integer array "bits". The - integers are assumed to be at least two - bytes each, so each will hold four four- - bit values. - - - -INTERFACES - - FILE ROUTINE CALLED - - N/A N/A - - -RETURNED VALUE - - NONE - -GLOBAL VARIABLES - - NONE - -NON-STANDARD FEATURES - - NONE - -==============================================================================*/ - -/*=== Static CM_STORE_BITS_VALUE ROUTINE ===*/ - -/************************************************ -* The following routine retrieves four-bit * -* data from short integer array "bits". The * -* integers are assumed to be at least two * -* bytes each, so each will hold four four- * -* bit values. * -* * -* Created 7/23/91 * -* Last Modified 7/23/91 J.P.Murray * -************************************************/ - -static void cm_store_bits_value(State_Table_t *table, int index, - int bit_number, int in_val) - -{ - int /*err,*/ /* error index value */ - int1, /* temp storage variable */ - bit_index, /* bits base address at which word bits will - be found */ - bit_offset; /* offset from ram base address at which bit[0] - of the required word can be found */ - - short base; /* variable to hold current base integer for - comparison purposes. */ - - - /* obtain offset value from word_number, word_width & - bit_number */ - int1 = index * table->num_outputs + bit_number; - - bit_index = int1 >> 2; - bit_offset = int1 & 3; - - /* retrieve entire base_address bits integer... */ - base = table->bits[bit_index]; - - /* for each offset, mask off the bits and store values */ - cm_bits_mask_and_store(&base,bit_offset,in_val); - - /* store modified base value */ - table->bits[bit_index] = base; -} - - - -/*============================================================================== - -FUNCTION cm_read_state_file() - -AUTHORS - - 15 Jul 1991 Jeffrey P. Murray - -MODIFICATIONS - - 23 Jul 1991 Jeffrey P. Murray - 30 Sep 1991 Jeffrey P. Murray - -SUMMARY - - The following routine reads the file - *state_file, parses the file, and stores - the values found there into the *state, - *bits, *inputs and *next_state arrays. - - - -INTERFACES - - FILE ROUTINE CALLED - - N/A N/A - - -RETURNED VALUE - - Returns a status integer value. - -GLOBAL VARIABLES - - NONE - -NON-STANDARD FEATURES - - NONE - -==============================================================================*/ - -/*=== Static CM_READ_STATE_FILE ROUTINE ===*/ - - -/************************************************** -* The following routine reads the file * -* *state_file, parses the file, and stores * -* the values found there into the *state, * -* *bits, *inputs and *next_state arrays. * -* * -* Created 7/15/91 * -* Last Modified 7/23/91 J.P.Murray * -**************************************************/ - -static int cm_read_state_file(FILE *state_file, State_Table_t *table) -{ - int i, /* indexing variable */ - j, /* indexing variable */ - num_tokens, /* number of tokens in a given string */ - /*bit_index,*/ /* index to which bits[] integer we are accessing */ - /*bit_offset,*/ /* index to which bit within the current bits[] - integer we are accessing */ - string_type; /* integer holding value corresponding to the - type of input string obtained: - 1 = HEADER => State Header string - 2 = CONTINUATION => a continuation line... - values of state and - bits must be retreived from - the previous string. */ - /*int1;*/ /* temporary holding variable */ - - - Cnv_Token_Type_t type; /* variable for testing token type returned. */ - - - char temp[MAX_STRING_SIZE], /* holding string variable for testing - input from state.in */ - *s, /* main string variable */ - *base_address, /* storage location for base address - of string. */ - *token; /* a particular token from the string */ - - - double number; /* holding variable for timepoint values */ - - short bit_value=0; /* holding variable for value read from - state.in file which needs to be stored */ - /*base;*/ /* holding variable for existing - non-masked bits[] integer */ - if (!state_file) { - return 2; - } - - i = 0; - s = temp; - while ( fgets(s,MAX_STRING_SIZE,state_file) != NULL) { - /* Test this string to see if it is whitespace... */ - - base_address = s; - while(isspace_c(*s) || (*s == '*')) - (s)++; - if ( *s != '\0' ) { /* This is not a blank line, so process... */ - s = base_address; - - if ( '*' != s[0] ) { - - /* Count up total number of tokens including \0... */ - j = 0; - type = CNV_STRING_TOK; - while ( type != CNV_NO_TOK ) { - token = CNVget_token(&s, &type); - if (token) - free(token); - j++; - } - num_tokens = (j-1); - - /* Test the type of entry this number of - tokens represents. Valid types are: - - a. State Header with state, bits, inputs - and next_state entries...total tokens - equals num_inputs + num_outputs + 3 - (e.g. "5 0s 0s 0s 0 0 -> 6"). - - b. State continuation line with inputs - and next_state only...total tokens - equals num_inputs + 2. - (e.g. " 0 1 -> 7"). - */ - - if (3 + table->num_inputs + table->num_outputs == num_tokens) { - string_type = HEADER; - } - else { - if ( (2 + table->num_inputs) == num_tokens) { - string_type = CONTINUATION; - } - else { /* Number of tokens is incorrect */ - return 1; - } - } - - /* reset s to beginning... */ - s = base_address; - - /** Retrieve each token, analyze, and **/ - /** store the state, bits, inputs & **/ - /** next_state information. **/ - - if ( HEADER == string_type ) { /**** header type loop ****/ - - for (j = 0; - j < table->num_inputs + table->num_outputs + 3; - j++) { - - token = CNVget_token(&s, &type); - - if(!token) - return 1; - - if ( 0 == j ) { /* obtain state value... */ - - /* convert to a floating point number... */ - cnv_get_spice_value(token,&number); - - table->state[i] = (int)number; - - - } - else { /* obtain each bit value & set bits entry */ - - if ( table->num_outputs >= j ) { - - /* preset this bit location */ - bit_value = 12; - - if (0 == strcmp(token,"0s")) bit_value = 0; - if (0 == strcmp(token,"1s")) bit_value = 1; - if (0 == strcmp(token,"Us")) bit_value = 2; - if (0 == strcmp(token,"0r")) bit_value = 3; - if (0 == strcmp(token,"1r")) bit_value = 4; - if (0 == strcmp(token,"Ur")) bit_value = 5; - if (0 == strcmp(token,"0z")) bit_value = 6; - if (0 == strcmp(token,"1z")) bit_value = 7; - if (0 == strcmp(token,"Uz")) bit_value = 8; - if (0 == strcmp(token,"0u")) bit_value = 9; - if (0 == strcmp(token,"1u")) bit_value = 10; - if (0 == strcmp(token,"Uu")) bit_value = 11; - - /* if this bit was not recognized, return with an error */ - if (12 == bit_value) { - free(token); - return 1; - } - else { - /* need to store this value in the bits[] array */ - cm_store_bits_value(table, i, j - 1, - bit_value); - } - } - else { /* obtain inputs info... */ - int idx; - - if (table->num_outputs + table->num_inputs >= j) { - /* preset this bit location */ - bit_value = 3; - - if (0 == strcmp(token,"0")) bit_value = 0; - if (0 == strcmp(token,"1")) bit_value = 1; - if (0 == strcmp(token,"x")) bit_value = 2; - if (0 == strcmp(token,"X")) bit_value = 2; - - /* if this bit was not recognized, return with an error */ - if (3 == bit_value) { - free(token); - return 1; - } - else { - /* need to store this value in the inputs[] array */ - idx = j - 1 - table->num_outputs; - cm_store_inputs_value(table, i, idx, - bit_value); - } - } - else { /* obtain next_state value */ - idx = 1 + table->num_outputs + - table->num_inputs; - if (idx == j) { - /* skip the "->" token */ - } - else { - /* convert to a floating point number... */ - cnv_get_spice_value(token,&number); - - table->next_state[i] = (int) number; - } - } - } - } - free(token); - } - } - else { /**** continuation type loop ****/ - /* set state value to previous state value */ - - table->state[i] = table->state[i - 1]; - - /* set bits values to previous bits values */ - for (j = 0; j < table->num_outputs; j++) { - - /*** Store this bit value ***/ - - cm_store_bits_value(table, i, j, bit_value); - } - - for (j=0; j<(2 + table->num_inputs); j++) { - - token = CNVget_token(&s, &type); - - if(!token) - return 1; - - if ( j < table->num_inputs ) { - - /* preset this bit location */ - bit_value = 3; - - if (0 == strcmp(token,"0")) bit_value = 0; - if (0 == strcmp(token,"1")) bit_value = 1; - if (0 == strcmp(token,"x")) bit_value = 2; - if (0 == strcmp(token,"X")) bit_value = 2; - - /* if this bit was not recognized, return with an error */ - if (3 == bit_value) { - free(token); - return 1; - } - else { - /* need to store this value in the inputs[] array */ - cm_store_inputs_value(table, i, j, bit_value); - } - } - else { /* obtain next_state value */ - if ( table->num_inputs == j ) { - /* skip the "->" token */ - } - else { - /* convert to a floating point number... */ - - cnv_get_spice_value(token,&number); - table->next_state[i] = (int) number; - } - } - free(token); - } - - } - i++; - } - s = temp; - } - } - return 0; -} - -/* Free allocated storage. */ - -static void callback(ARGS, Mif_Callback_Reason_t reason) -{ - if (reason == MIF_CB_DESTROY) { - State_Table_t *table; - - table = (State_Table_t *)STATIC_VAR(table); - if (!table) - return; - if (table->state) - free(table->state); - if (table->bits) - free(table->bits); - if (table->inputs) - free(table->inputs); - if (table->next_state) - free(table->next_state); - free(table); - STATIC_VAR(table) = NULL; - } -} - -/*============================================================================== - -FUNCTION cm_d_state() - -AUTHORS - - 17 Jun 1991 Jeffrey P. Murray - -MODIFICATIONS - - 20 Aug 1991 Jeffrey P. Murray - 30 Sep 1991 Jeffrey P. Murray - -SUMMARY - - This function implements the d_state code model. - -INTERFACES - - FILE ROUTINE CALLED - - CMmacros.h cm_message_send(); - - CMevt.c void *cm_event_alloc() - void *cm_event_get_ptr() - -RETURNED VALUE - - Returns inputs and outputs via ARGS structure. - -GLOBAL VARIABLES - - NONE - -NON-STANDARD FEATURES - - NONE - -==============================================================================*/ - -/*=== CM_D_STATE ROUTINE ==============*/ - -/************************************************ -* The following is the model for the * -* digital state machine for the * -* ATESSE Version 2.0 system. * -* * -* Created 7/17/91 * -* Last Modified 8/20/91 J.P.Murray * -************************************************/ - - -void cm_d_state(ARGS) -{ - int i, j, /* Generic loop counter indices. */ - err=0, /* Integer for storage of error status. */ - test; /* Testing integer. */ - - State_Table_t *table; /* Pointer to base address structure - for all state arrays. *table - contains the pointers to - state[], bits[], input[] - and next_state[] arrays. These - arrays are allocated using - calloc, so they do not take up - rotational storage space...only - the *states structure does that. */ - Dynamic_State_t *states, /* Pointer to dynamic state structure. */ - *states_old; - Digital_t in, out; /* Storage for each input and bit. */ - - Digital_State_t *clk, /* Storage for current and clock value. */ - *clk_old, /* Previous clock value. */ - *reset , /* Current reset value. */ - *reset_old; /* Previous reset value. */ - - static char *index_error = - "\nERROR\n D_STATE: An error exists in the ordering of states " - "values\n in the states->state[] array. This is usually caused\n" - " by non-contiguous state definitions in the state.in file.\n"; - - /****** Setup required state variables ******/ - - if (INIT) { /* initial pass */ - FILE *state_file; /* Pointer to the state.in input vector file. */ - char temp[MAX_STRING_SIZE], /* Holding string variable for testing - input from state.in. */ - *s; /* Main string variable. */ - - static char *open_error = - "\nERROR\n D_STATE: failed to open state file.\n"; - static char *loading_error = - "\nERROR\n D_STATE: state file was not read successfully.\n " - "The most common cause of this problem is a\n " - "trailing blank line in the state.in file.\n"; - - /* Allocate storage for the state transition table. */ - - table = calloc(1, sizeof (State_Table_t)); - STATIC_VAR(table) = table; - - /*** open file and count the number of vectors in it ***/ - state_file = fopen_with_path( PARAM(state_file), "r"); - - /* increment counter if not a comment until EOF reached... */ - i = 0; - s = temp; - if (state_file != NULL) - while (fgets(s, MAX_STRING_SIZE, state_file) != NULL) { - if ( '*' != s[0] ) { - while (isspace_c(*s) || (*s == '*')) - (s)++; - if (*s != '\0') - i++; - } - s = temp; - } - - /* Store depth value */ - table->depth = i; - - /* Retrieve widths for bits[] and inputs[] */ - table->num_inputs = PORT_SIZE(in); - table->num_outputs = PORT_SIZE(out); - - /* Assign storage for arrays to pointers in state table. */ - table->state = (int *)calloc((size_t) (table->depth + 1), sizeof(int)); - table->bits =(short *)calloc( - (size_t)(table->num_outputs * table->depth / 4 + 1), - sizeof (short)); - table->inputs = (short *)calloc( - (size_t)(table->num_inputs * table->depth / 8 + 1), - sizeof (short)); - table->next_state = (int *)calloc((size_t)(table->depth + 1), - sizeof (int)); - CALLBACK = callback; // To free those allocations. - - /*** allocate storage for *states... ***/ - - cm_event_alloc(0, sizeof (Dynamic_State_t)); - - /*** allocate storage for *clk, *clk_old, *reset & *reset_old... ***/ - cm_event_alloc(1, sizeof (Digital_State_t)); - cm_event_alloc(2, sizeof (Digital_State_t)); - - clk = clk_old = (Digital_State_t *)cm_event_get_ptr(1, 0); - *clk = ZERO; - reset = reset_old = (Digital_State_t *)cm_event_get_ptr(2, 0); - *reset = ZERO; - - /*** Send file pointer and the four storage pointers ***/ - /*** to "cm_read_state_file()". This will return after ***/ - /*** reading the contents of state.in, and if no ***/ - /*** errors have occurred, the "*state" and "*bits" ***/ - /*** "*inputs", and "*next_state" vectors will be loaded ***/ - /*** and the num_inputs, num_outputs and depth ***/ - /*** values supplied. ***/ - - if (state_file) { - rewind(state_file); - err = cm_read_state_file(state_file, table); - } else { - err = 2; - } - - if (err == 1) /* Problem occurred in load. */ - cm_message_send(loading_error); - else if (err == 2) /* Problem opening the state file. */ - cm_message_send(open_error); - - if (err > 0) { - /* Reset arrays to zero */ - for (i = 0; i < table->depth; i++) { - table->state[i] = 0; - table->next_state[i] = 0; - } - for (i=0; i<(test=(table->num_outputs * table->depth)/4); i++) - table->bits[i] = 0; - for (i=0; i<(test=(table->num_inputs * table->depth)/8); i++) - table->inputs[i] = 0; - return; - } - - /* close state_file */ - if (state_file) - fclose(state_file); - - /* declare load values */ - - for (i = 0; i < table->num_inputs; i++) { - LOAD(in[i]) = PARAM(input_load); - } - - LOAD(clk) = PARAM(clk_load); - - if ( !PORT_NULL(reset) ) { - LOAD(reset) = PARAM(reset_load); - } - } - else { /**** Retrieve previous values ****/ - - table = (State_Table_t *)STATIC_VAR(table); - clk = (Digital_State_t *)cm_event_get_ptr(1, 0); - clk_old = (Digital_State_t *)cm_event_get_ptr(1, 1); - - reset = (Digital_State_t *)cm_event_get_ptr(2, 0); - reset_old = (Digital_State_t *)cm_event_get_ptr(2, 1); - } - - states = (Dynamic_State_t *)cm_event_get_ptr(0, 0); - states_old = (Dynamic_State_t *)cm_event_get_ptr(0, 1); - - /******* Determine analysis type and output appropriate values *******/ - - if (0.0 == TIME) { /****** DC analysis...output w/o delays ******/ - /* set current state to default */ - states->current_state = PARAM(reset_state); - - /* set indices for this state */ - err = cm_set_indices(states, table); - if (err == TRUE) { - cm_message_send(index_error); - return; - } - - /* Output new values... */ - for (i=0; i < table->num_outputs; i++) { - - /* retrieve output value */ - cm_get_bits_value(table,states->index0,i,&out); - - OUTPUT_STATE(out[i]) = out.state; - OUTPUT_STRENGTH(out[i]) = out.strength; - } - } - - else { /****** Transient Analysis ******/ - - /*** load current input values if reset - is not connected, set to zero... ***/ - *clk = INPUT_STATE(clk); - - if ( PORT_NULL(reset) ) { - *reset = *reset_old = ZERO; - } - else { - *reset = INPUT_STATE(reset); - } - - /***** Find input that has changed... *****/ - - /**** Test reset value for change ****/ - if ( *reset != *reset_old ) { /* either reset or reset release */ - switch ( *reset ) { - - case ONE: - states->current_state = PARAM(reset_state); - - /* set indices for this state */ - err = cm_set_indices(states, table); - if ( err == TRUE ) { - cm_message_send(index_error); - return; - } - - /* Output new values... */ - for (i=0; inum_outputs; i++) { - - /* retrieve output value */ - cm_get_bits_value(table, states->index0, i, &out); - - OUTPUT_STATE(out[i]) = out.state; - OUTPUT_STRENGTH(out[i]) = out.strength; - OUTPUT_DELAY(out[i]) = PARAM(reset_delay); - } - break; - - case ZERO: - case UNKNOWN: - /* output remains at current value */ - for (i=0; inum_outputs; i++) { - OUTPUT_CHANGED(out[i]) = FALSE; - } - break; - - } - } - else { - - if ( ONE != *reset ) { - /**** model is not held to reset value ****/ - /**** Test clk value for change ****/ - if (*clk != *clk_old) { /* clock or clock release */ - switch ( *clk ) { - - case ONE: - - /** active edge...need to find out if a match **/ - /** exists between the current inputs and **/ - /** any of the inputs which drive the state **/ - /** machine to the next state...if so, we **/ - /** will need to retrieve that state value, **/ - /** and set the new index boundaries... **/ - - /* for each of the entries for the current_state... */ - for (i=states->index0; i<=states->indexN; i++) { - - /* first set err to zero... */ - err = 0; - - /* for each bit of the inputs value for this - entry...*/ - for (j = 0; j < table->num_inputs; j++) { - - /* retrieve the current input bit... */ - in.state = INPUT_STATE(in[j]); - - /* ...& compare to the corresponding - inputs[i] value. */ - err = cm_compare_to_inputs(table, i, j, - in.state); - - /* break if comparison was no-good... */ - if (0 != err) - break; - } - - /* if the comparison of the entire input - word was good, break out of this loop too... */ - if ( 0 == err ) break; - } - - /* if err == 0, then a match was found...otherwise, - we will not change states... */ - - if ( 0 == err ) { - /* use "i" to retrieve the next state value: - store this into current_state... */ - - states->current_state = table->next_state[i]; - - /* set indices for this new state */ - err = cm_set_indices(states, table); - if ( err == TRUE ) { - cm_message_send(index_error); - return; - } - - /* Output new values... */ - for (i=0; inum_outputs; i++) { - /* retrieve output value */ - - cm_get_bits_value(table, states->index0, - i, &out); - OUTPUT_STATE(out[i]) = out.state; - OUTPUT_STRENGTH(out[i]) = out.strength; - OUTPUT_DELAY(out[i]) = PARAM(clk_delay); - } - - } - else { /* no change in state or in output */ - - for (i=0; inum_outputs; i++) { - OUTPUT_CHANGED(out[i]) = FALSE; - } - - } - - break; - - case ZERO: - case UNKNOWN: - - /* no change in state or in output */ - for (i=0; inum_outputs; i++) { - OUTPUT_CHANGED(out[i]) = FALSE; - } - - break; - } - } - else { /* input value must have changed... - return previous output value. */ - - for (i=0; inum_outputs; i++) { - OUTPUT_CHANGED(out[i]) = FALSE; - } - } - } - else { /* Reset is active... - return previous output values. */ - - for (i=0; inum_outputs; i++) { - OUTPUT_CHANGED(out[i]) = FALSE; - } - } - } - } -} diff --git a/src/xspice/icm/digital/d_state/d_state.h b/src/xspice/icm/digital/d_state/d_state.h deleted file mode 100644 index 1224de74d..000000000 --- a/src/xspice/icm/digital/d_state/d_state.h +++ /dev/null @@ -1,76 +0,0 @@ -/*.......1.........2.........3.........4.........5.........6.........7.........8 -================================================================================ - -FILE d_state/d_state.h - -Public Domain - -Georgia Tech Research Corporation -Atlanta, Georgia 30332 -PROJECT A-8503-405 - - -AUTHORS - - 13 Jun 1991 Jeffrey P. Murray - - -MODIFICATIONS - - 20 Aug 1991 Jeffrey P. Murray - 30 Sep 1991 Jeffrey P. Murray - - -SUMMARY - - This file contains the header information for the - d_state model. - - -INTERFACES - - FILE ROUTINE CALLED - - N/A N/A - - - -REFERENCED FILES - - N/A - - -NON-STANDARD FEATURES - - NONE - -===============================================================================*/ - -/*=== INCLUDE FILES ====================*/ - - - - -/*=== CONSTANTS ========================*/ - -#define OK 0 -#define FAIL 1 - - - -/*=== MACROS ===========================*/ - - - - -/*=== LOCAL VARIABLES & TYPEDEFS =======*/ - -typedef char line_t[82]; /* A SPICE size line. <= 80 characters plus '\n\0' */ - - - -/*=== FUNCTION PROTOTYPE DEFINITIONS ===*/ - - - - diff --git a/src/xspice/icm/digital/d_state/ifspec.ifs b/src/xspice/icm/digital/d_state/ifspec.ifs deleted file mode 100644 index dcb8efa0c..000000000 --- a/src/xspice/icm/digital/d_state/ifspec.ifs +++ /dev/null @@ -1,136 +0,0 @@ -/*.......1.........2.........3.........4.........5.........6.........7.........8 -================================================================================ -Public Domain - -Georgia Tech Research Corporation -Atlanta, Georgia 30332 - - -AUTHORS - - 30 Sept 1991 Jeffrey P. Murray - - -SUMMARY - - This file contains the interface specification file for the - digital d_state (state machine) code model. - -===============================================================================*/ - - -NAME_TABLE: - - -C_Function_Name: cm_d_state -Spice_Model_Name: d_state -Description: "digital state machine" - - -PORT_TABLE: - - -Port_Name: in clk -Description: "input" "clock" -Direction: in in -Default_Type: d d -Allowed_Types: [d] [d] -Vector: yes no -Vector_Bounds: - - -Null_Allowed: yes no - - -PORT_TABLE: - - -Port_Name: reset out -Description: "reset" "output" -Direction: in out -Default_Type: d d -Allowed_Types: [d] [d] -Vector: no yes -Vector_Bounds: - [1 -] -Null_Allowed: yes no - - - -PARAMETER_TABLE: - - -Parameter_Name: clk_delay reset_delay -Description: "delay from CLK" "delay from reset" -Data_Type: real real -Default_Value: 1.0e-9 1.0e-9 -Limits: - - -Vector: no no -Vector_Bounds: - - -Null_Allowed: yes yes - - -PARAMETER_TABLE: - - -Parameter_Name: state_file -Description: "state transition specification file name" -Data_Type: string -Default_Value: "state.txt" -Limits: - -Vector: no -Vector_Bounds: - -Null_Allowed: no - - -PARAMETER_TABLE: - - -Parameter_Name: reset_state -Description: "default state on RESET & at DC" -Data_Type: int -Default_Value: 0 -Limits: - -Vector: no -Vector_Bounds: - -Null_Allowed: no - - -PARAMETER_TABLE: - - -Parameter_Name: input_load -Description: "input loading capacitance (F)" -Data_Type: real -Default_Value: 1.0e-12 -Limits: - -Vector: no -Vector_Bounds: - -Null_Allowed: no - - -PARAMETER_TABLE: - - -Parameter_Name: clk_load -Description: "clock loading capacitance (F)" -Data_Type: real -Default_Value: 1.0e-12 -Limits: - -Vector: no -Vector_Bounds: - -Null_Allowed: no -PARAMETER_TABLE: - - -Parameter_Name: reset_load -Description: "reset loading capacitance (F)" -Data_Type: real -Default_Value: 1.0e-12 -Limits: - -Vector: no -Vector_Bounds: - -Null_Allowed: no - -STATIC_VAR_TABLE: - -Static_Var_Name: table -Data_Type: pointer -Description: "State transition table" diff --git a/src/xspice/icm/digital/d_tff/cfunc.mod b/src/xspice/icm/digital/d_tff/cfunc.mod deleted file mode 100644 index 801ab9369..000000000 --- a/src/xspice/icm/digital/d_tff/cfunc.mod +++ /dev/null @@ -1,704 +0,0 @@ -/*.......1.........2.........3.........4.........5.........6.........7.........8 -================================================================================ - -FILE d_tff/cfunc.mod - -Public Domain - -Georgia Tech Research Corporation -Atlanta, Georgia 30332 -PROJECT A-8503-405 - - -AUTHORS - - 24 June 1991 Jeffrey P. Murray - - -MODIFICATIONS - - 12 Aug 1991 Jeffrey P. Murray - 2 Oct 1991 Jeffrey P. Murray - 29 Jan 1992 Jeffrey P. Murray - - -SUMMARY - - This file contains the model-specific routines used to - functionally describe the d_tff code model. - - -INTERFACES - - FILE ROUTINE CALLED - - CMutil.c void cm_toggle_bit(); - - CMevt.c void *cm_event_alloc() - void *cm_event_get_ptr() - - -REFERENCED FILES - - Inputs from and outputs to ARGS structure. - - -NON-STANDARD FEATURES - - NONE - -===============================================================================*/ - -/*=== INCLUDE FILES ====================*/ - - - - -/*=== CONSTANTS ========================*/ - - - - -/*=== MACROS ===========================*/ - - - - -/*=== LOCAL VARIABLES & TYPEDEFS =======*/ - - - - -/*=== FUNCTION PROTOTYPE DEFINITIONS ===*/ - - - - - -/*=============================================================================*/ - -/*=== CM ROUTINE ===*/ - - - - -/*============================================================================== - -FUNCTION cm_toggle_bit() - - -AUTHORS - - 27 Sept 1991 Jeffrey P. Murray - - -MODIFICATIONS - - NONE - - -SUMMARY - - Alters the state of a passed digital variable to its - complement. Thus, a ONE changes to a ZERO. A ZERO changes - to a ONE, and an UNKNOWN remains unchanged. - - -INTERFACES - - FILE ROUTINE CALLED - - N/A N/A - - -RETURNED VALUE - - No returned value. Passed pointer to variable is used - to redefine the variable value. - - -GLOBAL VARIABLES - - NONE - - -NON-STANDARD FEATURES - - NONE - -===============================================================================*/ - -/*=== CM_TOGGLE_BIT ROUTINE ===*/ - -static void cm_toggle_bit(Digital_State_t *bit) - -{ - /* Toggle bit from ONE to ZERO or vice versa, unless the - bit value is UNKNOWN. In the latter case, return - without changing the bit value. */ - - if ( UNKNOWN != *bit ) { - if ( ONE == *bit ) { - *bit = ZERO; - } - else { - *bit = ONE; - } - } - -} - - - -/*============================================================================== - -FUNCTION cm_d_tff() - - -AUTHORS - - 24 Jun 1991 Jeffrey P. Murray - - -MODIFICATIONS - - 29 Jan 1992 Jeffrey P. Murray - - -SUMMARY - - This function implements the d_tff code model. - - -INTERFACES - - FILE ROUTINE CALLED - - CMutil.c void cm_toggle_bit(); - - CMevt.c void *cm_event_alloc() - void *cm_event_get_ptr() - - - -RETURNED VALUE - - Returns inputs and outputs via ARGS structure. - - -GLOBAL VARIABLES - - NONE - - -NON-STANDARD FEATURES - - NONE - -===============================================================================*/ - -/*=== CM_D_TFF ROUTINE ===*/ - -/************************************************ -* The following is the model for the * -* digital t-type flip flop for the * -* ATESSE Version 2.0 system. * -* * -* Created 6/24/91 J.P.Murray * -************************************************/ - - -void cm_d_tff(ARGS) - -{ - /*int i;*/ /* generic loop counter index */ - - - Digital_State_t *clk, /* current clk value */ - *clk_old, /* previous clk value */ - *set, /* current set value for dff */ - *set_old, /* previous set value for dff */ - *reset, /* current reset value for dff */ - *reset_old, /* previous reset value for dff */ - *out, /* current output for dff */ - *out_old, /* previous output for dff */ - - toggle_input, /* current toggle input value */ - - temp; /* temp storage for state values */ - - - - /*** Setup required state variables ***/ - - if(INIT) { /* initial pass */ - - /* allocate storage */ - cm_event_alloc(0,sizeof(Digital_State_t)); - cm_event_alloc(1,sizeof(Digital_State_t)); - cm_event_alloc(2,sizeof(Digital_State_t)); - cm_event_alloc(3,sizeof(Digital_State_t)); - - /* declare load values */ - LOAD(t) = PARAM(t_load); - LOAD(clk) = PARAM(clk_load); - if ( !PORT_NULL(set) ) { - LOAD(set) = PARAM(set_load); - } - if ( !PORT_NULL(reset) ) { - LOAD(reset) = PARAM(reset_load); - } - - /* retrieve storage for the outputs */ - clk = clk_old = (Digital_State_t *) cm_event_get_ptr(0,0); - set = set_old = (Digital_State_t *) cm_event_get_ptr(1,0); - reset = reset_old = (Digital_State_t *) cm_event_get_ptr(2,0); - out = out_old = (Digital_State_t *) cm_event_get_ptr(3,0); - - } - else { /* Retrieve previous values */ - - /* retrieve storage for the outputs */ - clk = (Digital_State_t *) cm_event_get_ptr(0,0); - clk_old = (Digital_State_t *) cm_event_get_ptr(0,1); - set = (Digital_State_t *) cm_event_get_ptr(1,0); - set_old = (Digital_State_t *) cm_event_get_ptr(1,1); - reset = (Digital_State_t *) cm_event_get_ptr(2,0); - reset_old = (Digital_State_t *) cm_event_get_ptr(2,1); - out = (Digital_State_t *) cm_event_get_ptr(3,0); - out_old = (Digital_State_t *) cm_event_get_ptr(3,1); - } - - - - /******** load current input values if set or reset - are not connected, set to zero... ********/ - *clk = INPUT_STATE(clk); - if ( PORT_NULL(set) ) { - *set = *set_old = ZERO; - } - else { - *set = INPUT_STATE(set); - } - if ( PORT_NULL(reset) ) { - *reset = *reset_old = ZERO; - } - else { - *reset = INPUT_STATE(reset); - } - - - - - - - /******* Determine analysis type and output appropriate values *******/ - - if (0.0 == TIME) { /****** DC analysis...output w/o delays ******/ - - temp = (Digital_State_t) PARAM(ic); - - /** Modify output if set or reset lines are active **/ - if ( (*set==ONE) && (*reset==ZERO) ) temp = ONE; - if ( (*set==ZERO) && (*reset==ONE) ) temp = ZERO; - if ( (*set==ONE) && (*reset==ONE) ) temp = UNKNOWN; - - *out = *out_old = temp; - - - if ( !PORT_NULL(out) ) { - OUTPUT_STATE(out) = temp; - } - - cm_toggle_bit(&temp); - - if ( !PORT_NULL(Nout) ) { - OUTPUT_STATE(Nout) = temp; - } - } - - else { /****** Transient Analysis ******/ - - - /***** Find input that has changed... *****/ - - /**** Test set value for change ****/ - if ( *set != *set_old ) { /* either set or set release */ - switch ( *set ) { - - case ONE: - if ( ONE != *reset) { - if (*out_old != ONE) { /* set will change output */ - /* output goes to ONE */ - *out = ONE; - - if ( !PORT_NULL(out) ) { - OUTPUT_STATE(out) = ONE; - OUTPUT_DELAY(out) = PARAM(set_delay); - } - if ( !PORT_NULL(Nout) ) { - OUTPUT_STATE(Nout) = ZERO; - OUTPUT_DELAY(Nout) = PARAM(set_delay); - } - } - else { - *out = *out_old; /* output already set */ - if ( !PORT_NULL(out) ) { - OUTPUT_CHANGED(out) = FALSE; - } - if ( !PORT_NULL(Nout) ) { - OUTPUT_CHANGED(Nout) = FALSE; - } - } - } - else { - if (*out_old != UNKNOWN) { /* set will change output */ - /* output goes to UNKNOWN */ - *out = UNKNOWN; - - if ( !PORT_NULL(out) ) { - OUTPUT_STATE(out) = UNKNOWN; - OUTPUT_DELAY(out) = PARAM(set_delay); - } - if ( !PORT_NULL(Nout) ) { - OUTPUT_STATE(Nout) = UNKNOWN; - OUTPUT_DELAY(Nout) = PARAM(set_delay); - } - } - else { - *out = *out_old; /* output already unknown */ - if ( !PORT_NULL(out) ) { - OUTPUT_CHANGED(out) = FALSE; - } - if ( !PORT_NULL(Nout) ) { - OUTPUT_CHANGED(Nout) = FALSE; - } - } - } - break; - - case ZERO: - if ( ONE != *reset) { - /* output remains at current value */ - *out = *out_old; - if ( !PORT_NULL(out) ) { - OUTPUT_CHANGED(out) = FALSE; - } - if ( !PORT_NULL(Nout) ) { - OUTPUT_CHANGED(Nout) = FALSE; - } - } - else { - if (*out_old != ZERO) { /* set will change output */ - /* output returns to reset condition */ - *out = ZERO; - - if ( !PORT_NULL(out) ) { - OUTPUT_STATE(out) = ZERO; - OUTPUT_DELAY(out) = PARAM(set_delay); - } - if ( !PORT_NULL(Nout) ) { - OUTPUT_STATE(Nout) = ONE; - OUTPUT_DELAY(Nout) = PARAM(set_delay); - } - } - else { - *out = *out_old; /* output already reset */ - if ( !PORT_NULL(out) ) { - OUTPUT_CHANGED(out) = FALSE; - } - if ( !PORT_NULL(Nout) ) { - OUTPUT_CHANGED(Nout) = FALSE; - } - } - } - break; - - case UNKNOWN: - if ( ONE == *reset ) { - /* output goes to ZERO */ - *out = ZERO; - - if ( !PORT_NULL(out) ) { - OUTPUT_STATE(out) = ZERO; - OUTPUT_DELAY(out) = PARAM(set_delay); - } - if ( !PORT_NULL(Nout) ) { - OUTPUT_STATE(Nout) = ONE; - OUTPUT_DELAY(Nout) = PARAM(set_delay); - } - } - else { - *out = *out_old; /* output already unknown */ - if ( !PORT_NULL(out) ) { - OUTPUT_CHANGED(out) = FALSE; - } - if ( !PORT_NULL(Nout) ) { - OUTPUT_CHANGED(Nout) = FALSE; - } - } - break; - } - } - else { - - /**** Test reset value for change ****/ - if ( *reset != *reset_old ) { /* either reset or reset release */ - switch ( *reset ) { - - case ONE: - if ( ONE != *set) { - if (*out_old != ZERO) { /* reset will change output */ - /* output goes to ZERO */ - *out = ZERO; - - if ( !PORT_NULL(out) ) { - OUTPUT_STATE(out) = ZERO; - OUTPUT_DELAY(out) = PARAM(reset_delay); - } - if ( !PORT_NULL(Nout) ) { - OUTPUT_STATE(Nout) = ONE; - OUTPUT_DELAY(Nout) = PARAM(reset_delay); - } - } - else { - *out = *out_old; /* output already reset */ - if ( !PORT_NULL(out) ) { - OUTPUT_CHANGED(out) = FALSE; - } - if ( !PORT_NULL(Nout) ) { - OUTPUT_CHANGED(Nout) = FALSE; - } - } - } - else { - if (*out_old != UNKNOWN) { /* reset will change output */ - /* output goes to UNKNOWN */ - *out = UNKNOWN; - - if ( !PORT_NULL(out) ) { - OUTPUT_STATE(out) = UNKNOWN; - OUTPUT_DELAY(out) = PARAM(reset_delay); - } - if ( !PORT_NULL(Nout) ) { - OUTPUT_STATE(Nout) = UNKNOWN; - OUTPUT_DELAY(Nout) = PARAM(reset_delay); - } - } - else { - *out = *out_old; /* output already unknown */ - if ( !PORT_NULL(out) ) { - OUTPUT_CHANGED(out) = FALSE; - } - if ( !PORT_NULL(Nout) ) { - OUTPUT_CHANGED(Nout) = FALSE; - } - } - } - break; - - case ZERO: - if ( ONE != *set) { - /* output remains at current value */ - *out = *out_old; - if ( !PORT_NULL(out) ) { - OUTPUT_CHANGED(out) = FALSE; - } - if ( !PORT_NULL(Nout) ) { - OUTPUT_CHANGED(Nout) = FALSE; - } - } - else { - if (*out_old != ONE) { /* reset will change output */ - /* output returns to set condition */ - *out = ONE; - - if ( !PORT_NULL(out) ) { - OUTPUT_STATE(out) = ONE; - OUTPUT_DELAY(out) = PARAM(reset_delay); - } - if ( !PORT_NULL(Nout) ) { - OUTPUT_STATE(Nout) = ZERO; - OUTPUT_DELAY(Nout) = PARAM(reset_delay); - } - } - else { - *out = *out_old; /* output already reset */ - if ( !PORT_NULL(out) ) { - OUTPUT_CHANGED(out) = FALSE; - } - if ( !PORT_NULL(Nout) ) { - OUTPUT_CHANGED(Nout) = FALSE; - } - } - } - break; - - case UNKNOWN: - if ( ONE == *set ) { - /* output goes to ONE */ - *out = ONE; - - if ( !PORT_NULL(out) ) { - OUTPUT_STATE(out) = ONE; - OUTPUT_DELAY(out) = PARAM(reset_delay); - } - if ( !PORT_NULL(Nout) ) { - OUTPUT_STATE(Nout) = ZERO; - OUTPUT_DELAY(Nout) = PARAM(reset_delay); - } - } - else { - *out = *out_old; /* output already unknown */ - if ( !PORT_NULL(out) ) { - OUTPUT_CHANGED(out) = FALSE; - } - if ( !PORT_NULL(Nout) ) { - OUTPUT_CHANGED(Nout) = FALSE; - } - } - break; - } - } - else { - - /**** Test clk value for change ****/ - if ( (*clk != *clk_old) && (*reset != ONE) && - (*set != ONE) ) { /* clock or clock release */ - switch ( *clk ) { - - case ONE: - /* active edge...calculate new data output */ - toggle_input = INPUT_STATE(t); - - switch (toggle_input) { - case ONE: - temp = *out_old; - cm_toggle_bit(&temp); - break; - case ZERO: - temp = *out_old; - break; - case UNKNOWN: - default: - temp = UNKNOWN; - break; - } - - if (*out_old != temp) { /* clk will change output */ - *out = temp; - if ( !PORT_NULL(out) ) { - OUTPUT_STATE(out) = temp; - OUTPUT_DELAY(out) = PARAM(clk_delay); - } - - cm_toggle_bit(&temp); - - if ( !PORT_NULL(Nout) ) { - OUTPUT_STATE(Nout) = temp; - OUTPUT_DELAY(Nout) = PARAM(clk_delay); - } - } - else { - *out = *out_old; /* output same as before */ - if ( !PORT_NULL(out) ) { - OUTPUT_CHANGED(out) = FALSE; - } - if ( !PORT_NULL(Nout) ) { - OUTPUT_CHANGED(Nout) = FALSE; - } - } - break; - - case ZERO: - case UNKNOWN: - /* inactive edge...return previous values */ - *out = *out_old; - if ( !PORT_NULL(out) ) { - OUTPUT_CHANGED(out) = FALSE; - } - if ( !PORT_NULL(Nout) ) { - OUTPUT_CHANGED(Nout) = FALSE; - } - break; - - } - } - - else { /* data value must have changed... - return previous output value. */ - *out = *out_old; - if ( !PORT_NULL(out) ) { - OUTPUT_CHANGED(out) = FALSE; - } - if ( !PORT_NULL(Nout) ) { - OUTPUT_CHANGED(Nout) = FALSE; - } - } - } - } - - - /***** Add additional rise or fall delays, if appropriate *****/ - - if ( *out != *out_old ) { /*** output value is changing ***/ - - switch ( *out ) { - - /** fall to zero value **/ - case 0: - if ( !PORT_NULL(out) ) { - OUTPUT_DELAY(out) += PARAM(fall_delay); - } - if ( !PORT_NULL(Nout) ) { - OUTPUT_DELAY(Nout) += PARAM(rise_delay); - } - break; - - /** rise to one value **/ - case 1: - if ( !PORT_NULL(out) ) { - OUTPUT_DELAY(out) += PARAM(rise_delay); - } - if ( !PORT_NULL(Nout) ) { - OUTPUT_DELAY(Nout) += PARAM(fall_delay); - } - break; - - /** unknown output **/ - default: - /* based on old value, add rise or fall delay */ - if (0 == *out_old) { /* add rising delay */ - if ( !PORT_NULL(out) ) { - OUTPUT_DELAY(out) += PARAM(rise_delay); - } - if ( !PORT_NULL(Nout) ) { - OUTPUT_DELAY(Nout) += PARAM(fall_delay); - } - } - else { /* add falling delay */ - if ( !PORT_NULL(out) ) { - OUTPUT_DELAY(out) += PARAM(fall_delay); - } - if ( !PORT_NULL(Nout) ) { - OUTPUT_DELAY(Nout) += PARAM(rise_delay); - } - } - break; - } - } - } - - /*** output strength values ***/ - if ( !PORT_NULL(out) ) { - OUTPUT_STRENGTH(out) = STRONG; - } - if ( !PORT_NULL(Nout) ) { - OUTPUT_STRENGTH(Nout) = STRONG; - } -} - - - - - diff --git a/src/xspice/icm/digital/d_tff/ifspec.ifs b/src/xspice/icm/digital/d_tff/ifspec.ifs deleted file mode 100644 index beb4f7fa3..000000000 --- a/src/xspice/icm/digital/d_tff/ifspec.ifs +++ /dev/null @@ -1,124 +0,0 @@ -/*.......1.........2.........3.........4.........5.........6.........7.........8 -================================================================================ -Public Domain - -Georgia Tech Research Corporation -Atlanta, Georgia 30332 - - -AUTHORS - - 2 Oct 1991 Jeffrey P. Murray - - -SUMMARY - - This file contains the interface specification file for the - digital d_tff code model. - -===============================================================================*/ - -NAME_TABLE: - - -C_Function_Name: cm_d_tff -Spice_Model_Name: d_tff -Description: "digital toggle flip flop" - - -PORT_TABLE: - -Port_Name: t clk -Description: "toggle input" "clock" -Direction: in in -Default_Type: d d -Allowed_Types: [d] [d] -Vector: no no -Vector_Bounds: - - -Null_Allowed: no no - - -PORT_TABLE: - -Port_Name: set reset -Description: "asynch. set" "asynch. reset" -Direction: in in -Default_Type: d d -Allowed_Types: [d] [d] -Vector: no no -Vector_Bounds: - - -Null_Allowed: yes yes - - -PORT_TABLE: - -Port_Name: out Nout -Description: "data output" "inverted data output" -Direction: out out -Default_Type: d d -Allowed_Types: [d] [d] -Vector: no no -Vector_Bounds: - - -Null_Allowed: yes yes - - -PARAMETER_TABLE: - -Parameter_Name: clk_delay set_delay -Description: "delay from clk" "delay from set" -Data_Type: real real -Default_Value: 1.0e-9 1.0e-9 -Limits: [1e-12 -] [1e-12 -] -Vector: no no -Vector_Bounds: - - -Null_Allowed: yes yes - - -PARAMETER_TABLE: - -Parameter_Name: reset_delay ic -Description: "delay from reset" "output initial state" -Data_Type: real int -Default_Value: 1.0e-9 0 -Limits: [1e-12 -] [0 2] -Vector: no no -Vector_Bounds: - - -Null_Allowed: yes yes - - -PARAMETER_TABLE: - -Parameter_Name: rise_delay fall_delay -Description: "rise delay" "fall delay" -Data_Type: real real -Default_Value: 1.0e-9 1.0e-9 -Limits: [1e-12 -] [1e-12 -] -Vector: no no -Vector_Bounds: - - -Null_Allowed: yes yes - - -PARAMETER_TABLE: - -Parameter_Name: t_load clk_load -Description: "toggle load value (F)" "clk load value (F)" -Data_Type: real real -Default_Value: 1.0e-12 1.0e-12 -Limits: - - -Vector: no no -Vector_Bounds: - - -Null_Allowed: yes yes - - -PARAMETER_TABLE: - -Parameter_Name: set_load reset_load -Description: "set load value (F)" "reset load value (F)" -Data_Type: real real -Default_Value: 1.0e-12 1.0e-12 -Limits: - - -Vector: no no -Vector_Bounds: - - -Null_Allowed: yes yes - - diff --git a/src/xspice/icm/digital/d_tristate/cfunc.mod b/src/xspice/icm/digital/d_tristate/cfunc.mod deleted file mode 100644 index 74be5e56f..000000000 --- a/src/xspice/icm/digital/d_tristate/cfunc.mod +++ /dev/null @@ -1,165 +0,0 @@ -/*.......1.........2.........3.........4.........5.........6.........7.........8 -================================================================================ - -FILE d_tristate/cfunc.mod - -Public Domain - -Georgia Tech Research Corporation -Atlanta, Georgia 30332 -PROJECT A-8503-405 - - -AUTHORS - - 18 Nov 1991 Jeffrey P. Murray - - -MODIFICATIONS - - 26 Nov 1991 Jeffrey P. Murray - - -SUMMARY - - This file contains the functional description of the d_tristate - code model. - - -INTERFACES - - FILE ROUTINE CALLED - - CMevt.c void *cm_event_alloc() - void *cm_event_get_ptr() - - - -REFERENCED FILES - - Inputs from and outputs to ARGS structure. - - -NON-STANDARD FEATURES - - NONE - -===============================================================================*/ - -/*=== INCLUDE FILES ====================*/ - - - - -/*=== CONSTANTS ========================*/ - - - - -/*=== MACROS ===========================*/ - - - - -/*=== LOCAL VARIABLES & TYPEDEFS =======*/ - - - - -/*=== FUNCTION PROTOTYPE DEFINITIONS ===*/ - - - - - -/*============================================================================== - -FUNCTION cm_d_tristate() - -AUTHORS - - 18 Nov 1991 Jeffrey P. Murray - -MODIFICATIONS - - 26 Nov 1991 Jeffrey P. Murray - -SUMMARY - - This function implements the d_tristate code model. - -INTERFACES - - FILE ROUTINE CALLED - - CMevt.c void *cm_event_alloc() - void *cm_event_get_ptr() - -RETURNED VALUE - - Returns inputs and outputs via ARGS structure. - -GLOBAL VARIABLES - - NONE - -NON-STANDARD FEATURES - - NONE - -==============================================================================*/ - -/*=== CM_D_TRISTATE ROUTINE ===*/ - -/************************************************ -* The following is a model for a simple * -* digital tristate for the ATESSE Version * -* 2.0 system. Note that this version has * -* a single delay for both input and enable... * -* a more realistic model is anticipated in * -* the not-so-distant future. * -* * -* Created 11/18/91 J.P,Murray * -* Last Modified 11/26/91 * -************************************************/ - - -void cm_d_tristate(ARGS) -{ - int enable; /* holding variable for enable input */ - - - - /* Retrieve input values and static variables */ - enable = INPUT_STATE(enable); - - OUTPUT_STATE(out) = INPUT_STATE(in); - OUTPUT_DELAY(out) = PARAM(delay); - - - /* define input loading... */ - LOAD(in) = PARAM(input_load); - LOAD(enable) = PARAM(enable_load); - - - - - if (ZERO == enable) { - - OUTPUT_STRENGTH(out) = HI_IMPEDANCE; - - } - else - if (UNKNOWN == enable) { - - OUTPUT_STRENGTH(out) = UNDETERMINED; - - } - else { - - OUTPUT_STRENGTH(out) = STRONG; - - } -} - - diff --git a/src/xspice/icm/digital/d_tristate/ifspec.ifs b/src/xspice/icm/digital/d_tristate/ifspec.ifs deleted file mode 100644 index fc68e337a..000000000 --- a/src/xspice/icm/digital/d_tristate/ifspec.ifs +++ /dev/null @@ -1,77 +0,0 @@ -/*.......1.........2.........3.........4.........5.........6.........7.........8 -================================================================================ -Public Domain - -Georgia Tech Research Corporation -Atlanta, Georgia 30332 - - -AUTHORS - - 18 Nov 1991 Jeffrey P. Murray - - -SUMMARY - - This file contains the interface specification file for the - digital d_tristate code model. - -===============================================================================*/ - - -NAME_TABLE: - -Spice_Model_Name: d_tristate -C_Function_Name: cm_d_tristate -Description: "digital one-bit-wide tristate buffer" - - -PORT_TABLE: - -Port_Name: in enable out -Description: "input" "enable" "output" -Direction: in in out -Default_Type: d d d -Allowed_Types: [d] [d] [d] -Vector: no no no -Vector_Bounds: - - - -Null_Allowed: no no no - - -PARAMETER_TABLE: - -Parameter_Name: delay -Description: "delay" -Data_Type: real -Default_Value: 1.0e-9 -Limits: [1e-12 -] -Vector: no -Vector_Bounds: - -Null_Allowed: yes - - -PARAMETER_TABLE: - -Parameter_Name: input_load -Description: "input load value (F)" -Data_Type: real -Default_Value: 1.0e-12 -Limits: - -Vector: no -Vector_Bounds: - -Null_Allowed: yes - - -PARAMETER_TABLE: - -Parameter_Name: enable_load -Description: "enable load value (F)" -Data_Type: real -Default_Value: 1.0e-12 -Limits: - -Vector: no -Vector_Bounds: - -Null_Allowed: yes - - - diff --git a/src/xspice/icm/digital/d_xnor/cfunc.mod b/src/xspice/icm/digital/d_xnor/cfunc.mod deleted file mode 100644 index 89c584d9b..000000000 --- a/src/xspice/icm/digital/d_xnor/cfunc.mod +++ /dev/null @@ -1,324 +0,0 @@ -/*.......1.........2.........3.........4.........5.........6.........7.........8 -================================================================================ - -FILE d_xnor/cfunc.mod - -Public Domain - -Georgia Tech Research Corporation -Atlanta, Georgia 30332 -PROJECT A-8503-405 - - -AUTHORS - - 18 Jun 1991 Jeffrey P. Murray - - -MODIFICATIONS - - 7 Aug 1991 Jeffrey P. Murray - 2 Oct 1991 Jeffrey P. Murray - - -SUMMARY - - This file contains the model-specific routines used to - functionally describe the d_xnor code model. - - -INTERFACES - - FILE ROUTINE CALLED - - CMutil.c void cm_toggle_bit(); - - CMevt.c void *cm_event_alloc() - void *cm_event_get_ptr() - - - -REFERENCED FILES - - Inputs from and outputs to ARGS structure. - - -NON-STANDARD FEATURES - - NONE - -===============================================================================*/ - -/*=== INCLUDE FILES ====================*/ - - - - -/*=== CONSTANTS ========================*/ - - - - -/*=== MACROS ===========================*/ - - - - -/*=== LOCAL VARIABLES & TYPEDEFS =======*/ - - - - -/*=== FUNCTION PROTOTYPE DEFINITIONS ===*/ - - - - - -/*============================================================================== - -FUNCTION cm_toggle_bit() - - -AUTHORS - - 27 Sept 1991 Jeffrey P. Murray - - -MODIFICATIONS - - NONE - - -SUMMARY - - Alters the state of a passed digital variable to its - complement. Thus, a ONE changes to a ZERO. A ZERO changes - to a ONE, and an UNKNOWN remains unchanged. - - -INTERFACES - - FILE ROUTINE CALLED - - N/A N/A - - -RETURNED VALUE - - No returned value. Passed pointer to variable is used - to redefine the variable value. - - -GLOBAL VARIABLES - - NONE - - -NON-STANDARD FEATURES - - NONE - -===============================================================================*/ - -/*=== CM_TOGGLE_BIT ROUTINE ===*/ - -static void cm_toggle_bit(Digital_State_t *bit) - -{ - /* Toggle bit from ONE to ZERO or vice versa, unless the - bit value is UNKNOWN. In the latter case, return - without changing the bit value. */ - - if ( UNKNOWN != *bit ) { - if ( ONE == *bit ) { - *bit = ZERO; - } - else { - *bit = ONE; - } - } - -} - - -/*============================================================================== - -FUNCTION cm_d_xnor() - - -AUTHORS - - 18 Jun 1991 Jeffrey P. Murray - - -MODIFICATIONS - - 7 Aug 1991 Jeffrey P. Murray - 2 Oct 1991 Jeffrey P. Murray - - -SUMMARY - - This function implements the d_xnor code model. - - -INTERFACES - - FILE ROUTINE CALLED - - CMutil.c void cm_toggle_bit(); - - CMevt.c void *cm_event_alloc() - void *cm_event_get_ptr() - - -RETURNED VALUE - - Returns inputs and outputs via ARGS structure. - - -GLOBAL VARIABLES - - NONE - - -NON-STANDARD FEATURES - - NONE - -===============================================================================*/ - -/*=== CM_D_XNOR ROUTINE ===*/ - -/************************************************ -* The following is the model for the * -* digital XNOR gate for the * -* ATESSE Version 2.0 system. * -* * -* Created 6/18/91 J.P.Murray * -************************************************/ - - -void cm_d_xnor(ARGS) - -{ - int i, /* generic loop counter index */ - size; /* number of input & output ports */ - - - - Digital_State_t *out, /* temporary output for buffers */ - *out_old, /* previous output for buffers */ - input; /* temp storage for input bits */ - - - /** Retrieve size value... **/ - size = PORT_SIZE(in); - - - - /*** Setup required state variables ***/ - - if(INIT) { /* initial pass */ - - /* allocate storage for the outputs */ - cm_event_alloc(0,sizeof(Digital_State_t)); - - for (i=0; i -#include -#include -#include - - - -/*=== CONSTANTS ========================*/ - - - - -/*=== MACROS ===========================*/ - - - - -/*=== LOCAL VARIABLES & TYPEDEFS =======*/ - - - - -/*=== FUNCTION PROTOTYPE DEFINITIONS ===*/ - - - - - -/*============================================================================== - -FUNCTION cm_dac_bridge() - -AUTHORS - - 3 Jun 1991 Jeffrey P. Murray - -MODIFICATIONS - - 16 Aug 1991 Jeffrey P. Murray - 2 Oct 1991 Jeffrey P. Murray - -SUMMARY - - This function implements the dac_bridge code model. - -INTERFACES - - FILE ROUTINE CALLED - - CM.c void *cm_analog_alloc() - void *cm_analog_get_ptr() - int cm_analog_set_perm_bkpt() - - CMevt.c void *cm_event_alloc() - void *cm_event_get_ptr() - -RETURNED VALUE - - Returns inputs and outputs via ARGS structure. - -GLOBAL VARIABLES - - NONE - -NON-STANDARD FEATURES - - NONE - -==============================================================================*/ - - -/*=== CM_DAC_BRIDGE ROUTINE ===*/ - -/************************************************ -* The following is the model for the * -* digital-to-analog nodebridge for the * -* ATESSE Version 2.0 system. * -* * -* Created 6/3/91 J.P.Murray * -************************************************/ - - -void cm_dac_bridge(ARGS) - -{ - double out_low, /* analog output value corresponding to '0' - digital input */ - out_high, /* analog output value corresponding to '1' - digital input */ - out_undef, /* analog output value corresponding to 'U' - digital input */ - t_rise, /* rise time...used to produce d(out)/d(time) - values for gradual change in analog output. */ - t_fall, /* fall time...used to produce d(out)/d(time) - values for gradual change in analog output. */ - *out, /* array holding all output values */ - *out_old, /* array holding previous output values */ - fraction, /* fraction of total rise or fall time to add to - current time value for breakpoint calculation */ - level_inc, /* incremental level value out_high - out_low */ - rise_slope, /* level_inc divided by t_rise */ - fall_slope, /* level_inc divided by t_fall */ - time_inc, /* time increment since last analog call */ - test; /* testing variable */ - - int i, /* generic loop counter index */ - size; /* number of input & output ports */ - - - - Digital_State_t *in, /* base address of array holding all input - values */ - *in_old; /* array holding previous input values */ - - - /* determine "width" of the node bridge... */ - - size = PORT_SIZE(in); - - - /** Read in remaining model parameters **/ - - out_low = PARAM(out_low); - out_high = PARAM(out_high); - t_rise = PARAM(t_rise); - t_fall = PARAM(t_fall); - - - /* Test to see if out_low and out_high were specified, but */ - /* out_undef was not... */ - /* if so, take out_undef as mean of out_high and out_low. */ - - if (!PARAM_NULL(out_low) && !PARAM_NULL(out_high) && - PARAM_NULL(out_undef) ) { - out_undef = out_low + (out_high - out_low) / 2.0; - } - else { - out_undef = PARAM(out_undef); - } - - - - if (INIT) { /*** Test for INIT == TRUE. If so, allocate storage, etc. ***/ - - - /* Allocate storage for inputs */ - cm_event_alloc(0, size * (int) sizeof(Digital_State_t)); - - - /* Allocate storage for outputs */ - - /* retrieve previously-allocated discrete input and */ - /* allocate storage for analog output values. */ - - /* allocate output space and obtain adresses */ - cm_analog_alloc(0, size * (int) sizeof(double)); - - /* assign discrete addresses */ - in = in_old = (Digital_State_t *) cm_event_get_ptr(0,0); - - /* assign analog addresses */ - out = out_old = (double *) cm_analog_get_ptr(0,0); - - - /* read current input values */ - for (i=0; i out_low) { /* output still dropping */ - - out[i] = out_old[i] - fall_slope*time_inc; - if ( out_low > out[i]) out[i]=out_low; - - } - else { /* output at out_low */ - - out[i] = out_low; - - } - break; - - case ONE: - if (out_old[i] < out_high) { /* output still rising */ - - out[i] = out_old[i] + rise_slope*time_inc; - if ( out_high < out[i]) out[i]=out_high; - - } - else { /* output at out_high */ - - out[i] = out_high; - - } - break; - - - case UNKNOWN: - if (out_old[i] < out_undef) { /* output still rising */ - - out[i] = out_old[i] + (rise_slope * time_inc); - if ( out_undef < out[i]) out[i]=out_undef; - - } - else { - - if (out_old[i] > out_undef) { /* output still falling */ - - out[i] = out_old[i] - fall_slope*time_inc; - if ( out_undef > out[i]) out[i]=out_undef; - } - else { /* output at out_undef */ - - out[i] = out_undef; - } - - } - - break; - - } - } - else { /* There HAS been a change in this digital input - since the last analog access...need to use the - old value of input to complete the breakpoint - slope before changing directions... */ - - - switch (in_old[i]) { - - case ZERO: - if (out_old[i] > out_low) { /* output still dropping */ - - out[i] = out_old[i] - fall_slope*time_inc; - if ( out_low > out[i]) out[i]=out_low; - - } - else { /* output at out_low */ - - out[i] = out_low; - - } - break; - - case ONE: - if (out_old[i] < out_high) { /* output still rising */ - - out[i] = out_old[i] + rise_slope*time_inc; - if ( out_high < out[i]) out[i]=out_high; - - } - else { /* output at out_high */ - - out[i] = out_high; - - } - break; - - - case UNKNOWN: - if (out_old[i] < out_undef) { /* output still rising */ - - out[i] = out_old[i] + (rise_slope * time_inc); - if ( out_undef < out[i]) out[i]=out_undef; - - } - else { - - if (out_old[i] > out_undef) { /* output still falling */ - - out[i] = out_old[i] - fall_slope*time_inc; - if ( out_undef > out[i]) out[i]=out_undef; - } - else { /* output at out_undef */ - - out[i] = out_undef; - } - - } - - break; - - } - - /* determine required new breakpoint for the end of - the output analog transition & post */ - - switch (in[i]) { - - case ONE: /* rising for all outputs */ - fraction = (out_high - out[i]) / (out_high - out_low); - test = TIME + (fraction * t_rise); - cm_analog_set_perm_bkpt(test); - break; - - case UNKNOWN: /* may be rising or falling */ - - if ( out_undef > out[i] ) { /* rising to U */ - fraction = (out_undef - out[i]) / (out_high - out_low); - test = TIME + (fraction * t_rise); - cm_analog_set_perm_bkpt(test); - } - else { /* falling to U */ - fraction = (out[i] - out_undef) / (out_high - out_low); - test = TIME + (fraction * t_fall); - cm_analog_set_perm_bkpt(test); - } - break; - - case ZERO: /* falling for all outputs */ - fraction = (out[i] - out_low) / (out_high - out_low); - test = TIME + (fraction * t_fall); - cm_analog_set_perm_bkpt(test); - break; - } - } - } - - /* Output values... */ - - for (i=0; i 1" "fall time 1 -> 0" -Data_Type: real real -Default_Value: 1.0e-9 1.0e-9 -Limits: [1e-12 -] [1e-12 -] -Vector: no no -Vector_Bounds: - - -Null_Allowed: yes yes diff --git a/src/xspice/icm/digital/modpath.lst b/src/xspice/icm/digital/modpath.lst deleted file mode 100644 index 3b5ee09f5..000000000 --- a/src/xspice/icm/digital/modpath.lst +++ /dev/null @@ -1,30 +0,0 @@ -adc_bridge -dac_bridge -bidi_bridge -d_and -d_buffer -d_dff -d_dlatch -d_fdiv -d_genlut -d_inverter -d_jkff -d_lut -d_nand -d_nor -d_open_c -d_open_e -d_or -d_osc -d_pulldown -d_pullup -d_pwm -d_ram -d_source -d_srff -d_srlatch -d_state -d_tff -d_tristate -d_xnor -d_xor diff --git a/src/xspice/icm/digital/udnpath.lst b/src/xspice/icm/digital/udnpath.lst deleted file mode 100644 index e69de29bb..000000000 diff --git a/src/xspice/icm/dlmain.c b/src/xspice/icm/dlmain.c deleted file mode 100644 index a62713fcd..000000000 --- a/src/xspice/icm/dlmain.c +++ /dev/null @@ -1,536 +0,0 @@ -/* ---------------------------------------------------------------------- - Build cmextrn.h, cminfo.h, udnextrn.h and udninfo.h from udnpath.lst and - modpath.lst using 'cmpp -lst'. Then compile this file and link it with - cm and udn object files to produce a dll that can be loaded by ngspice - at run-time. - Copyright 2000 The ngspice team - 3 - Clause BSD license - (see COPYING or https://opensource.org/licenses/BSD-3-Clause) - Author: Arpad Buermen ------------------------------------------------------------------------- */ - -#include -#include -#include - -#include "ngspice/devdefs.h" -#include "ngspice/dstring.h" -#include "ngspice/dllitf.h" -#include "ngspice/evtudn.h" -#include "ngspice/inpdefs.h" -#include "cmextrn.h" -#include "udnextrn.h" - - - -////////////////////////////////////////////////////////////////////////////// -////////////////////////////////////////////////////////////////////////////// -// Do not modify anything below this line -////////////////////////////////////////////////////////////////////////////// - -SPICEdev *cmDEVices[] = { -#include "cminfo.h" - NULL -}; - -int cmDEVicesCNT = sizeof(cmDEVices)/sizeof(SPICEdev *)-1; - -Evt_Udn_Info_t *cmEVTudns[] = { -#include "udninfo.h" - NULL -}; - -int cmEVTudnCNT = sizeof(cmEVTudns)/sizeof(Evt_Udn_Info_t *)-1; - -/* Instantiation of pointer to core info structure containing pointers - * to core functions. */ -struct coreInfo_t *coreitf = (struct coreInfo_t *) NULL; - -////////////////////////////////////////////////////////////////////////////// -////////////////////////////////////////////////////////////////////////////// -// Functions that return pointers to structures. -////////////////////////////////////////////////////////////////////////////// - -#if defined (__MINGW32__) || defined (__CYGWIN__) || defined (_MSC_VER) -#define CM_EXPORT __declspec(dllexport) -#else - /* use with gcc flag -fvisibility=hidden */ - #if __GNUC__ >= 4 - #define CM_EXPORT __attribute__ ((visibility ("default"))) - #define CM_EXPORT_LOCAL __attribute__ ((visibility ("hidden"))) - #else - #define CM_EXPORT - #define CM_EXPORT_LOCAL - #endif -#endif - -extern CM_EXPORT void *CMdevs(void); -extern CM_EXPORT void *CMdevNum(void); -extern CM_EXPORT void *CMudns(void); -extern CM_EXPORT void *CMudnNum(void); -extern CM_EXPORT void *CMgetCoreItfPtr(void); - - -// This one returns the device table -CM_EXPORT void *CMdevs(void) { - return (void *)cmDEVices; -} - -// This one returns the device count -CM_EXPORT void *CMdevNum(void) { - return (void *)&cmDEVicesCNT; -} - -// This one returns the UDN table -CM_EXPORT void *CMudns(void) { - return (void *)cmEVTudns; -} - -// This one returns the UDN count -CM_EXPORT void *CMudnNum(void) { - return (void *)&cmEVTudnCNT; -} - -// This one returns the pointer to the pointer to the core interface structure -CM_EXPORT void *CMgetCoreItfPtr(void) { - return (void *)(&coreitf); -} - - -////////////////////////////////////////////////////////////////////////////// -////////////////////////////////////////////////////////////////////////////// -// These functions call the real core functions of SPICE OPUS using the -// pointers in coreitf structure. -////////////////////////////////////////////////////////////////////////////// -void MIF_INP2A( - CKTcircuit *ckt, /* circuit structure to put mod/inst structs in */ - INPtables *tab, /* symbol table for node names, etc. */ - struct card *current /* the card we are to parse */ - ) { - (coreitf->dllitf_MIF_INP2A)(ckt,tab,current); -} - -char * MIFgetMod( - CKTcircuit *ckt, - char *name, - INPmodel **model, - INPtables *tab - ) { - return (coreitf->dllitf_MIFgetMod)(ckt,name,model,tab); -} - -IFvalue * MIFgetValue( - CKTcircuit *ckt, - char **line, - int type, - INPtables *tab, - char **err - ) { - return (coreitf->dllitf_MIFgetValue)(ckt,line,type,tab,err); -} - - -int MIFsetup( - SMPmatrix *matrix, - GENmodel *inModel, - CKTcircuit *ckt, - int *state - ) { - return (coreitf->dllitf_MIFsetup)(matrix,inModel,ckt,state); -} - -int MIFunsetup( - GENmodel *inModel, - CKTcircuit *ckt -) { - return (coreitf->dllitf_MIFunsetup)(inModel,ckt); -} - -int MIFload( - GENmodel *inModel, - CKTcircuit *ckt - ) { - return (coreitf->dllitf_MIFload)(inModel,ckt); -} - - -int MIFmParam( - int param_index, - IFvalue *value, - GENmodel *inModel - ) { - return (coreitf->dllitf_MIFmParam)(param_index,value,inModel); -} - -int MIFask( - CKTcircuit *ckt, - GENinstance *inst, - int param_index, - IFvalue *value, - IFvalue *select - ) { - return (coreitf->dllitf_MIFask)(ckt,inst,param_index,value,select); -} - -int MIFmAsk( - CKTcircuit *ckt, - GENmodel *inModel, - int param_index, - IFvalue *value - ) { - return (coreitf->dllitf_MIFmAsk)(ckt,inModel,param_index,value); -} - -int MIFtrunc( - GENmodel *inModel, - CKTcircuit *ckt, - double *timeStep - ) { - return (coreitf->dllitf_MIFtrunc)(inModel,ckt,timeStep); -} - -int MIFconvTest( - GENmodel *inModel, - CKTcircuit *ckt - ) { - return (coreitf->dllitf_MIFconvTest)(inModel,ckt); -} - -int MIFdelete( - GENinstance *inst - ) { - return (coreitf->dllitf_MIFdelete)(inst); -} - -int MIFmDelete( - GENmodel *gen_model - ) { - return (coreitf->dllitf_MIFmDelete)(gen_model); -} - -void MIFdestroy( - void - ) { - (coreitf->dllitf_MIFdestroy)(); -} - -char *MIFgettok( - char **s - ) { - return (coreitf->dllitf_MIFgettok)(s); -} - - -char *MIFget_token( - char **s, - Mif_Token_Type_t *type - ) { - return (coreitf->dllitf_MIFget_token)(s,type); -} - - -Mif_Cntl_Src_Type_t MIFget_cntl_src_type( - Mif_Port_Type_t in_port_type, - Mif_Port_Type_t out_port_type - ) { - return (coreitf->dllitf_MIFget_cntl_src_type)(in_port_type,out_port_type); -} - -char *MIFcopy(char *c) { - return (coreitf->dllitf_MIFcopy)(c); -} - - -void cm_climit_fcn(double in, double in_offset, double cntl_upper, - double cntl_lower, double lower_delta, - double upper_delta, double limit_range, - double gain, int percent, double *out_final, - double *pout_pin_final, double *pout_pcntl_lower_final, - double *pout_pcntl_upper_final) { - (coreitf->dllitf_cm_climit_fcn)(in,in_offset,cntl_upper,cntl_lower,lower_delta, - upper_delta,limit_range,gain,percent,out_final, - pout_pin_final,pout_pcntl_lower_final, - pout_pcntl_upper_final); -} - - - -void cm_smooth_corner(double x_input, double x_center, double y_center, - double domain, double lower_slope, double upper_slope, - double *y_output, double *dy_dx) { - (coreitf->dllitf_cm_smooth_corner)(x_input,x_center,y_center,domain,lower_slope, - upper_slope,y_output,dy_dx); -} - -void cm_smooth_discontinuity(double x_input, double x_lower, double y_lower, - double x_upper, double y_upper, - double *y_output, double *dy_dx) { - (coreitf->dllitf_cm_smooth_discontinuity)(x_input,x_lower,y_lower,x_upper,y_upper, - y_output,dy_dx); -} - -double cm_smooth_pwl(double x_input, double *x, double *y, int size, - double input_domain, double *dout_din) { - return (coreitf->dllitf_cm_smooth_pwl)(x_input,x,y,size,input_domain,dout_din); -} - -double cm_analog_ramp_factor(void) { - return (coreitf->dllitf_cm_analog_ramp_factor)(); -} - -void cm_analog_alloc(int tag, int bytes) { - (coreitf->dllitf_cm_analog_alloc)(tag,bytes); -} - -void *cm_analog_get_ptr(int tag, int timepoint) { - return (coreitf->dllitf_cm_analog_get_ptr)(tag,timepoint); -} - -int cm_analog_integrate(double integrand, double *integral, double *partial) { - return (coreitf->dllitf_cm_analog_integrate)(integrand,integral,partial); -} - -int cm_analog_converge(double *state) { - return (coreitf->dllitf_cm_analog_converge)(state); -} - -int cm_analog_set_temp_bkpt(double time) { - return (coreitf->dllitf_cm_analog_set_temp_bkpt)(time); -} - -int cm_analog_set_perm_bkpt(double time) { - return (coreitf->dllitf_cm_analog_set_perm_bkpt)(time); -} - -void cm_analog_not_converged(void) { - (coreitf->dllitf_cm_analog_not_converged)(); -} - -void cm_analog_auto_partial(void) { - (coreitf->dllitf_cm_analog_auto_partial)(); -} - -void cm_event_alloc(int tag, int bytes){ - (coreitf->dllitf_cm_event_alloc)(tag,bytes); -} - -void *cm_event_get_ptr(int tag, int timepoint) { - return (coreitf->dllitf_cm_event_get_ptr)(tag,timepoint); -} - -int cm_event_queue(double time) { - return (coreitf->dllitf_cm_event_queue)(time); -} - -char *cm_message_get_errmsg(void) { - return (coreitf->dllitf_cm_message_get_errmsg)(); -} - -int cm_message_send(char *msg) { - return (coreitf->dllitf_cm_message_send)(msg); -} - -double cm_netlist_get_c(void) { - return (coreitf->dllitf_cm_netlist_get_c)(); -} - -double cm_netlist_get_l(void) { - return (coreitf->dllitf_cm_netlist_get_l)(); -} - -const char *cm_get_node_name(const char *port, unsigned int index) { - return coreitf->dllitf_cm_get_node_name(port, index); -} - -bool cm_probe_node(unsigned int conn_index, - unsigned int port_index, - void *value) { - return coreitf->dllitf_cm_probe_node(conn_index, port_index, value); -} - -Complex_t cm_complex_set(double real, double imag) { - return (coreitf->dllitf_cm_complex_set)(real,imag); -} - -Complex_t cm_complex_add(Complex_t x, Complex_t y) { - return (coreitf->dllitf_cm_complex_add)(x,y); -} - -Complex_t cm_complex_subtract(Complex_t x, Complex_t y) { - return (coreitf->dllitf_cm_complex_subtract)(x,y); -} - -Complex_t cm_complex_multiply(Complex_t x, Complex_t y) { - return (coreitf->dllitf_cm_complex_multiply)(x,y); -} - -Complex_t cm_complex_divide(Complex_t x, Complex_t y) { - return (coreitf->dllitf_cm_complex_divide)(x,y); -} - -char * cm_get_path(void) { - return (coreitf->dllitf_cm_get_path)(); -} - -CKTcircuit *cm_get_circuit(void) { - return (coreitf->dllitf_cm_get_circuit)(); -} - -FILE * cm_stream_out(void) { - return (coreitf->dllitf_cm_stream_out)(); -} - -FILE * cm_stream_in(void) { - return (coreitf->dllitf_cm_stream_in)(); -} - -FILE * cm_stream_err(void) { - return (coreitf->dllitf_cm_stream_err)(); -} - -void * malloc_pj(size_t s) { - return (coreitf->dllitf_malloc_pj)(s); -} - -void * calloc_pj(size_t s1, size_t s2) { - return (coreitf->dllitf_calloc_pj)(s1,s2); -} - -void * realloc_pj(const void *ptr, size_t s) { - return (coreitf->dllitf_realloc_pj)(ptr,s); -} - -void free_pj(const void *ptr) { - (coreitf->dllitf_free_pj)(ptr); -} - -void * tmalloc(size_t s) { - return (coreitf->dllitf_tmalloc)(s); -} - -void * trealloc(const void *ptr, size_t s) { - return (coreitf->dllitf_trealloc)(ptr,s); -} - -void txfree(const void *ptr) { - (coreitf->dllitf_txfree)(ptr); -} - - -/* -fopen_with_path() -Opens an input file . Called from d_state, file_source, d_source. -Firstly retrieves the path Infile_Path of the ngspice input netlist. -Then searches for (and opens) an a sequence from -Infile_Path/ -NGSPICE_INPUT_DIR/, where the path is given by the environmental variable -, where the path is the current directory -*/ -#define DFLT_BUF_SIZE 256 -FILE *fopen_with_path(const char *path, const char *mode) -{ - FILE *fp; - - if((path[0] != '/') && (path[1] != ':')) { /* path absolue (probably) */ -// const char *x = getenv("ngspice_vpath"); - const char *x = cm_get_path(); - if (x) { - DS_CREATE(ds, DFLT_BUF_SIZE); - - /* Build file /path> */ - if (ds_cat_printf(&ds, "%s/%s", x, path) != 0) { - cm_message_printf( - "Unable to build cm_get_path() path for opening file."); - ds_free(&ds); - return (FILE *) NULL; - } - - /* Try opening file. If fail, try using NGSPICE_INPUT_DIR - * env variable location */ - if ((fp = fopen(ds_get_buf(&ds), mode)) == (FILE *) NULL) { - char *y = getenv("NGSPICE_INPUT_DIR"); - if (y && *y) { /* have env var and not "" */ - int rc_ds = 0; - /* Build /path and try opening. If the env var - * ends with a slash, do not add a second slash */ - ds_clear(&ds); - rc_ds |= ds_cat_str(&ds, y); - - /* Add slash if not present. Note that check for - * length > 0 is done on the remote chance that the - * ds_cat_str() failed. */ - const size_t len = ds_get_length(&ds); - if (len > 0 && ds_get_buf(&ds)[len - 1] != '/') { - rc_ds |= ds_cat_char(&ds, '/'); /* add dir sep */ - } - rc_ds |= ds_cat_str(&ds, path); /* add input path */ - - /* Ensure path built OK */ - if (rc_ds != 0) { - cm_message_printf( - "Unable to build NGSPICE_INPUT_DIR " - "path for opening file."); - ds_free(&ds); - return (FILE *) NULL; - } - - /* Try opening file name that was built */ - if ((fp = fopen(ds_get_buf(&ds), - mode)) != (FILE *) NULL) { - ds_free(&ds); - return fp; - } - } - } /* end of open using prefix from cm_get_path() failed */ - else { /* Opened OK */ - ds_free(&ds); - return fp; - } - ds_free(&ds); /* free dstring resources, if any */ - } - } /* end of case that path is not absolute */ - - /* If not opened yet, try opening exactly as given */ - fp = fopen(path, mode); - - return fp; -} /* end of function fopen_with_path */ - - - -int -cm_message_printf(const char *fmt, ...) -{ - char buf[1024]; - char *p = buf; - int size = sizeof(buf); - int rv; - - for (;;) { - - int nchars; - va_list ap; - - va_start(ap, fmt); - nchars = vsnprintf(p, (size_t) size, fmt, ap); - va_end(ap); - - if (nchars == -1) { // compatibility to old implementations - size *= 2; - } else if (size < nchars + 1) { - size = nchars + 1; - } else { - break; - } - - if (p == buf) - p = tmalloc((size_t) size * sizeof(char)); - else - p = trealloc(p, (size_t) size * sizeof(char)); - } - - rv = cm_message_send(p); - if (p != buf) - txfree(p); - return rv; -} diff --git a/src/xspice/icm/dlmain.h b/src/xspice/icm/dlmain.h deleted file mode 100644 index d2a5c84c0..000000000 --- a/src/xspice/icm/dlmain.h +++ /dev/null @@ -1,17 +0,0 @@ -////////////////////////////////////////////////////////////////////////////// -// Copyright 2000 The ngspice team -// 3 - Clause BSD license -// (see COPYING or https://opensource.org/licenses/BSD-3-Clause) -// Author: Arpad Buermen -////////////////////////////////////////////////////////////////////////////// - -#ifndef dlmain_h_included -#define dlmain_h_included - -#include "ngspice/cmproto.h" -#include "ngspice/mifproto.h" -#include "ngspice/dllitf.h" - -extern struct coreInfo_t *coreitf; - -#endif /* dlmain.h */ diff --git a/src/xspice/icm/makedefs.in b/src/xspice/icm/makedefs.in deleted file mode 100644 index e344507ba..000000000 --- a/src/xspice/icm/makedefs.in +++ /dev/null @@ -1,76 +0,0 @@ -# -*- makefile -*- - -# Edit this file to set global include paths, -# compiler info and subdirs - -# Directory sturcture -SHELL = @SHELL@ -srcdir = @srcdir@ -top_builddir = ../../.. -top_srcdir = @top_srcdir@ -subdir = src/xspice/icm -MKDIR_P = @MKDIR_P@ -uname = $(shell uname) - -# C compiler to use -CC = @CC@ -CFLAGS = @CFLAGS@ -VIS_CFLAGS = @VIS_CFLAGS@ -EXEEXT = @EXEEXT@ -BUILD_EXEEXT = @BUILD_EXEEXT@ - -# Spice header include path -INCLUDES = -I$(top_builddir)/src/include -I$(top_srcdir)/src/include - -# CFLAGS to use here -EXTRA_CFLAGS = -fPIC -DEPFLAGS = -MD -MF -ISMINGW = $(shell uname | grep -c "MINGW32") -ifeq ($(ISMINGW), 1) - EXTRA_CFLAGS = -endif -ISCYGWIN = $(shell uname | grep -c "CYGWIN") -ifeq ($(ISCYGWIN), 1) - EXTRA_CFLAGS = -endif -ISSUNOS = $(shell uname | grep -c "SunOS") -ifeq ($(ISSUNOS), 1) - ifneq "$(CC)" "gcc" - EXTRA_CFLAGS = -KPIC - DEPFLAGS = -xMD -xMF - endif -endif - -# Path to the cmpp utility -CMPP = @CMPP@ - -LIBS = -lm - -# Flags to use when linking shared library -LDFLAGS = -shared -ifeq ($(ISMINGW), 1) - LDFLAGS = -shared @LDFLAGS@ -endif -ifeq "$(strip $(uname))" "Darwin" - LDFLAGS = -bundle -flat_namespace -undefined suppress -endif -ifeq "$(strip $(uname))" "SunOS" - ifneq "$(CC)" "gcc" - LDFLAGS = -G - endif -endif - -# Install instructions - -INSTALL = @INSTALL@ -INSTALL_DATA = @INSTALL_DATA@ -INSTALL_PROGRAM = @INSTALL_PROGRAM@ - -prefix = @prefix@ -exec_prefix = @exec_prefix@ -libdir = @libdir@ -pkglibdir = $(libdir)/@PACKAGE@ -datarootdir = @datarootdir@ -datadir = @datadir@ -pkgdatadir = $(datadir)/@PACKAGE@ - diff --git a/src/xspice/icm/spice2poly/.gitignore b/src/xspice/icm/spice2poly/.gitignore deleted file mode 100644 index 9b60b041f..000000000 --- a/src/xspice/icm/spice2poly/.gitignore +++ /dev/null @@ -1,14 +0,0 @@ -/spice2poly.cm - -/cmextrn.h -/cminfo.h -/cminfo2.h -/dlmain.c -/objects.inc -/udnextrn.h -/udninfo.h -/udninfo2.h - -/*/*.c - -!/*/udnfunc.c diff --git a/src/xspice/icm/spice2poly/icm_spice2poly/README b/src/xspice/icm/spice2poly/icm_spice2poly/README deleted file mode 100644 index c850128a6..000000000 --- a/src/xspice/icm/spice2poly/icm_spice2poly/README +++ /dev/null @@ -1,49 +0,0 @@ -This directory holds a codemodel which enables ngspice to handle SPICE -2 POLY attributes on controlled sources. In short, when a SPICE 2 -netlist is read in, any controlled sources with POLY attributes are -translated into codemodel devices with an associated .model which -invokes spice2poly to evaluate the polynomial. - -To use this model, you need to do the following: - -1. Compile the rest of ngspice/tclspice in the usual way from the -base directory. - -2. Download and install SPICE Opus (available from -http://www.fe.uni-lj.si/ ). From this you need the program cmpp, as -well as some of the include files. - -3. Edit the Makefile in this directory and make the variable CMPPDIR -point to the base location of your Opus installation. - -4. Edit the Makefile in the directory above (..) and make the -variable CMPDIR point to the base location of your Opus installation. - -5. Do "make" in the directory above (..). The makefiles are set up -to do all the necessary stuff to turn the spice2poly sources into a -shared object named spice2poly.cm which you can load into ngspice. -(Alternatively, you can do "make codemodels" from $(top_srcdir); I -have included codemodels as a target which cd's into the directory -below and does "make".) - -6. Read the codemodel into ngspice in the following way: - -ngspice 1 -> codemodel /usr/local/src/tclspice-0.2.10/src/xspice/icm/spice2poly.cm - -(Of course, you should point to the location where *you* built -spice2poly.cm!) You might want to put this invocation into your -spinit file (which usually lives in $(top_srcdir)/src/). - -7. Then read in your SPICE netlist. SPICE 2 POLY attributes in -controlled sources will be translated into .models invoking the -spice2poly codemodel. You should be able to run ngspice and simulate -in the usual way! - ----------------------------------------------------------------------- -Please send any comments/questions/bug reports to: - -Stuart Brorson -sdb@cloud9.net - --- SDB 6.19.2003 - diff --git a/src/xspice/icm/spice2poly/icm_spice2poly/cfunc.mod b/src/xspice/icm/spice2poly/icm_spice2poly/cfunc.mod deleted file mode 100644 index df6fdff20..000000000 --- a/src/xspice/icm/spice2poly/icm_spice2poly/cfunc.mod +++ /dev/null @@ -1,313 +0,0 @@ -/* =========================================================================== -FILE cfunc.mod - -MEMBER OF process XSPICE - -Public Domain - -Georgia Tech Research Corporation -Atlanta, Georgia 30332 -PROJECT A-8503 - - -AUTHORS - - 9/12/91 Bill Kuhn - -MODIFICATIONS - - - -SUMMARY - - This file contains the definition of a code model polynomial controlled - source compatible with SPICE 2G6 poly sources. - -INTERFACES - - spice2poly() - -REFERENCED FILES - - None. - -NON-STANDARD FEATURES - - None. - -=========================================================================== */ - -/* - -This code model implements the non-linear polynomial controlled sources -available in SPICE 2G6. An automatic translator added into the simulator -front end is used to map 2G6 syntax into a call to this model in the -required syntax. - -This model may also be called directly as follows: - - a1 [ ] xxx - .model xxx spice2poly ( coef = [ ] ) - -Refer to the 2G6 User Guide for an explanation of the coefficients. - - -This model is patterned after the FORTRAN code used in the 2G6 simulator. -Function cm_poly() below performs the functions of subroutines NLCSRC and -EVPOLY. Function evterm() performs the function of subroutine EVTERM, -and function nxtpwr() performs the function of subroutine NXTPWR. - -*/ - - - - -#include - -/* SPICE 2G6 type utility functions */ -static double evterm(double x, int n); -static void nxtpwr(int *pwrseq, int pdim); - -static void -cm_spice2poly_callback(ARGS, Mif_Callback_Reason_t reason) -{ - switch (reason) { - case MIF_CB_DESTROY: { - Mif_Inst_Var_Data_t *p = STATIC_VAR_INST(acgains); - if(p->element) { - free(p->element); - p->element = NULL; - } - break; - } - } -} - - - -void spice2poly (ARGS) -{ - int num_inputs; /* Number of inputs to model */ - int num_coefs; /* Number of coefficients */ - int *exp; /* List of exponents in products */ - /* One for each input */ - - int i; /* Counter */ - int j; /* Counter */ - int k; /* Counter */ - - double *in; /* Values of inputs to model */ - double *coef; /* Values of coefficients */ - - double sum; /* Temporary for accumulating sum of terms */ - double product; /* Temporary for accumulating product */ - - - - /* Get number of input values */ - - num_inputs = PORT_SIZE(in); - - /* If this is the first call to the model, allocate the static variable */ - /* array */ - - if(INIT) { - CALLBACK = cm_spice2poly_callback; - Mif_Inst_Var_Data_t *p = STATIC_VAR_INST(acgains); - p -> size = num_inputs; - p -> element = (Mif_Value_t *) malloc((size_t) num_inputs * sizeof(Mif_Value_t)); - for(i = 0; i < num_inputs; i++) - STATIC_VAR(acgains[i]) = 0.0; - } - - /* If analysis type is AC, use the previously computed DC partials */ - /* for the AC gains */ - - if(ANALYSIS == MIF_AC) { - for(i = 0; i < num_inputs; i++) { - AC_GAIN(out,in[i]).real = STATIC_VAR(acgains[i]); - AC_GAIN(out,in[i]).imag = 0.0; - } - return; - } - - /* Get input values and coefficients to local storage for faster access */ - - in = (double *) malloc((size_t) num_inputs * sizeof(double)); - for(i = 0; i < num_inputs; i++) - in[i] = INPUT(in[i]); - - num_coefs = PARAM_SIZE(coef); - - coef = (double *) malloc((size_t) num_coefs * sizeof(double)); - for(i = 0; i < num_coefs; i++) - coef[i] = PARAM(coef[i]); - - - /* Allocate the array of exponents used in computing the poly terms */ - exp = (int *) malloc((size_t) num_inputs * sizeof(int)); - - /* Initialize the exponents to zeros */ - for(i = 0; i < num_inputs; i++) - exp[i] = 0; - - - /* Compute the output of the source by summing the required products */ - for(i = 1, sum = coef[0]; i < num_coefs; i++) { - - /* Get the list of powers for the product terms in this term of the sum */ - nxtpwr(exp, num_inputs); - - /* Form the product of the inputs taken to the required powers */ - for(j = 0, product = 1.0; j < num_inputs; j++) - product *= evterm(in[j], exp[j]); - - /* Add the product times the appropriate coefficient into the sum */ - sum += coef[i] * product; - } - OUTPUT(out) = sum; - - - /* Compute and output the partials for each input */ - for(i = 0; i < num_inputs; i++) { - - /* Reinitialize the exponent list to zeros */ - for(j = 0; j < num_inputs; j++) - exp[j] = 0; - - /* Compute the partials by summing the required products */ - for(j = 1, sum = 0.0; j < num_coefs; j++) { - - /* Get the list of powers for the product terms in this term of the sum */ - nxtpwr(exp, num_inputs); - - /* If power for input for which partial is being evaluated */ - /* is zero, the term is a constant, so the partial is zero */ - if(exp[i] == 0) - continue; - - /* Form the product of the inputs taken to the required powers */ - for(k = 0, product = 1.0; k < num_inputs; k++) { - /* If input is not the one for which the partial is being taken */ - /* take the term to the specified exponent */ - if(k != i) - product *= evterm(in[k], exp[k]); - /* else, take the derivative of this term as n*x**(n-1) */ - else - product *= exp[k] * evterm(in[k], exp[k] - 1); - } - - /* Add the product times the appropriate coefficient into the sum */ - sum += coef[j] * product; - } - - PARTIAL(out,in[i]) = sum; - - /* If this is DC analysis, save the partial for use as AC gain */ - /* value in an AC analysis */ - - if(ANALYSIS == MIF_DC) - STATIC_VAR(acgains[i]) = sum; - } - - /* Free the allocated items and return */ - free(in); - free(coef); - free(exp); - - return; -} - - -/* Function evterm computes the value of x**n */ - -static double evterm( - double x, - int n) -{ - double product; /* Temporary accumlator for forming the product */ - - product = 1.0; - while(n > 0) { - product *= x; - n--; - } - - return(product); -} - - - -/* - -This function is a literal translation of subroutine NXTPWR in SPICE 2G6. -This was done to guarantee compatibility with the ordering of -coefficients used by 2G6. The 2G6 User Guide does not completely define -the algorithm used and the GOTO loaded FORTRAN code is difficult to unravel. -Therefore, a one-to-one translation was deemed the safest approach. - -No attempt is made to document the function statements since no documentaton -is available in the 2G6 code. However, it can be noted that the code -appears to generate the exponents of the product terms in the sum-of-products -produced by the following expansion for two and three dimensional polynomials: - - 2D (a + b) ** n - 3D (a + (b + c)) ** n - -where n begins at 1 and increments as needed for as many terms as there are -coefficients on the polynomial source SPICE deck card, and where terms that -are identical under the laws of associativity are dropped. Thus, for example, -the exponents for the following sums are produced: - - 2D a + b + a**2 + ab + b**2 + c**3 + ... - 3D a + b + c + a**2 + a*b + a*c + b**2 + bc + c**2 + a**3 + ... - -*/ - -/* Define a macro to tranlate between FORTRAN-style array references */ -/* and C-style array references */ - -#define PWRSEQ(x) pwrseq[x - 1] - - -static void nxtpwr( - int *pwrseq, /* Array of exponents */ - int pdim) -{ - int i; - int k; - int km1; - int psum; - - if(pdim == 1) goto stmt80; - k = pdim; -stmt10: if(PWRSEQ(k) != 0) goto stmt20; - k = k - 1; - if(k != 0) goto stmt10; - goto stmt80; -stmt20: if(k == pdim) goto stmt30; - PWRSEQ(k) = PWRSEQ(k) - 1; - PWRSEQ(k+1) = PWRSEQ(k+1) + 1; - goto stmt100; -stmt30: km1 = k - 1; - for(i = 1; i <= km1; i++) - if(PWRSEQ(i) != 0) goto stmt50; -/*stmt40:*/ PWRSEQ(1) = PWRSEQ(pdim) + 1; - PWRSEQ(pdim) = 0; - goto stmt100; -stmt50: psum = 1; - k = pdim; -stmt60: if(PWRSEQ(k-1) >= 1) goto stmt70; - psum = psum + PWRSEQ(k); - PWRSEQ(k) = 0; - k = k - 1; - goto stmt60; -stmt70: PWRSEQ(k) = PWRSEQ(k) + psum; - PWRSEQ(k-1) = PWRSEQ(k-1) - 1; - goto stmt100; -stmt80: PWRSEQ(1) = PWRSEQ(1) + 1; - -stmt100: return; - -} - diff --git a/src/xspice/icm/spice2poly/icm_spice2poly/ifspec.ifs b/src/xspice/icm/spice2poly/icm_spice2poly/ifspec.ifs deleted file mode 100644 index 6aab4de10..000000000 --- a/src/xspice/icm/spice2poly/icm_spice2poly/ifspec.ifs +++ /dev/null @@ -1,76 +0,0 @@ -/* =========================================================================== -FILE ifspec.ifs - -MEMBER OF process XSPICE - -Copyright 1991 -Georgia Tech Research Corporation -Atlanta, Georgia 30332 -All Rights Reserved - -PROJECT A-8503 - -AUTHORS - - 9/12/91 Bill Kuhn - -MODIFICATIONS - - - -SUMMARY - - This file contains the definition of a code model polynomial controlled - source compatible with SPICE 2G6 poly sources. - -INTERFACES - - None. - -REFERENCED FILES - - None. - -NON-STANDARD FEATURES - - None. - -=========================================================================== */ - -NAME_TABLE: - -Spice_Model_Name: spice2poly -C_Function_Name: spice2poly -Description: "2G6 compatible polynomial controlled source" - - -PORT_TABLE: - -Port_Name: in out -Description: "input" "output" -Direction: in out -Default_Type: vd vd -Allowed_Types: [vd,id,vnam] [vd,id] -Vector: yes no -Vector_Bounds: [1 -] - -Null_Allowed: no no - - -PARAMETER_TABLE: - -Parameter_Name: coef -Description: "2G6 compatible spice card coefficient list" -Data_Type: real -Default_Value: - -Limits: - -Vector: yes -Vector_Bounds: [2 -] -Null_Allowed: no - - -STATIC_VAR_TABLE: - -Static_Var_Name: acgains -Data_Type: real -Description: "Partial derivatives from DC analysis used for AC gains" -Vector: yes diff --git a/src/xspice/icm/spice2poly/modpath.lst b/src/xspice/icm/spice2poly/modpath.lst deleted file mode 100644 index eba74545a..000000000 --- a/src/xspice/icm/spice2poly/modpath.lst +++ /dev/null @@ -1 +0,0 @@ -icm_spice2poly diff --git a/src/xspice/icm/spice2poly/udnpath.lst b/src/xspice/icm/spice2poly/udnpath.lst deleted file mode 100644 index e69de29bb..000000000 diff --git a/src/xspice/icm/table/.gitignore b/src/xspice/icm/table/.gitignore deleted file mode 100644 index 00a3641ed..000000000 --- a/src/xspice/icm/table/.gitignore +++ /dev/null @@ -1,11 +0,0 @@ -/table.cm - -/cmextrn.h -/cminfo.h -/cminfo2.h -/objects.inc -/udnextrn.h -/udninfo.h -/udninfo2.h - -/*/*.c diff --git a/src/xspice/icm/table/mada/alloc.c b/src/xspice/icm/table/mada/alloc.c deleted file mode 100644 index aa483a625..000000000 --- a/src/xspice/icm/table/mada/alloc.c +++ /dev/null @@ -1,75 +0,0 @@ -/* Convenience allocation programs. */ -/* - Copyright (C) 2004 University of Texas at Austin - Copyright (C) 2007 Colorado School of Mines - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -*/ - -#include -#include - -#include "alloc.h" -#include "ngspice/cm.h" - - -/*------------------------------------------------------------*/ -void * -sf_alloc(int n /* number of elements */, - size_t size /* size of one element */) -/*< output-checking allocation >*/ -{ - void *ptr; - - if (n < 0) { - cm_message_printf("%s: illegal allocation(%d X %zd bytes)", - __FILE__, n, size); - return NULL; - } - - /* Use calloc so that any internal allocations will be set to NULL to - * facilitate error recovery */ - if ((ptr = calloc((size_t)n, size)) == NULL) { - cm_message_printf("%s: cannot allocate %zd bytes : ", - __FILE__, (size_t)n * size); - return NULL; - } - - return ptr; -} - -/*------------------------------------------------------------*/ -double * -sf_doublealloc(int n /* number of elements */) -/*< float allocation >*/ -{ - return (double*) sf_alloc(n, sizeof(double)); -} - -/*------------------------------------------------------------*/ -double ** -sf_doublealloc2(int n1 /* fast dimension */, - int n2 /* slow dimension */) -/*< float 2-D allocation, out[0] points to a contiguous array >*/ -{ - int i2; - double **ptr = (double**) sf_alloc(n2, sizeof(double*)); - - ptr[0] = sf_doublealloc(n1 * n2); - for (i2 = 1; i2 < n2; i2++) - ptr[i2] = ptr[0] + i2 * n1; - - return ptr; -} diff --git a/src/xspice/icm/table/mada/alloc.h b/src/xspice/icm/table/mada/alloc.h deleted file mode 100644 index 24593e620..000000000 --- a/src/xspice/icm/table/mada/alloc.h +++ /dev/null @@ -1,23 +0,0 @@ -#ifndef _sf_alloc_h -#define _sf_alloc_h - - -#include -#include - - -/*------------------------------------------------------------*/ -void *sf_alloc (int n, /* number of elements */ - size_t size /* size of one element */); -/*< output-checking allocation >*/ - -/*------------------------------------------------------------*/ -double *sf_doublealloc (int n /* number of elements */); -/*< double allocation >*/ - -/*------------------------------------------------------------*/ -double **sf_doublealloc2(int n1, /* fast dimension */ - int n2 /* slow dimension */); -/*< float 2-D allocation, out[0] points to a contiguous array >*/ - -#endif diff --git a/src/xspice/icm/table/mada/eno.c b/src/xspice/icm/table/mada/eno.c deleted file mode 100644 index 36acbe338..000000000 --- a/src/xspice/icm/table/mada/eno.c +++ /dev/null @@ -1,172 +0,0 @@ -/* 1-D ENO interpolation */ -/* - Copyright (C) 2004 University of Texas at Austin - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -*/ - -#include -#include -#include - -#include "../xspice/icm/dlmain.h" -#include "alloc.h" -#include "eno.h" - -#define SF_MAX(a,b) ((a) < (b) ? (b) : (a)) -#define SF_MIN(a,b) ((a) < (b) ? (a) : (b)) - - -struct Eno { - int order, n; - double **diff; -}; -/* concrete data type */ - -sf_eno -sf_eno_init (int order, /* interpolation order */ - int n /* data size */) -/*< Initialize interpolation object. >*/ -{ - int xrc = 0; - sf_eno ent = (sf_eno) NULL; - - if ((ent = (sf_eno) sf_alloc( - 1, sizeof(*ent))) == (sf_eno) NULL) { - cm_message_printf("Unable to allocate sf_eno structure " - "in sf_eno_init"); - xrc = -1; - goto EXITPOINT; - } - - ent->order = order; - ent->n = n; - - if ((ent->diff = (double **) sf_alloc( - order, sizeof(double *))) == (double **) NULL) { - cm_message_printf("Unable to allocate diff field " - "in sf_eno_init"); - xrc = -1; - goto EXITPOINT; - } - - { - int i; - for (i = 0; i < order; i++) { - if ((ent->diff[i] = sf_doublealloc( - n - i)) == (double *) NULL) { - cm_message_printf("Unable to allocate in sf_eno_init " - "at index %d.", - i); - xrc = -1; - goto EXITPOINT; - } - } - } - -EXITPOINT: - if (xrc != 0) { - if (ent != (sf_eno) NULL) { - sf_eno_close(ent); - ent = (sf_eno) NULL; - } - } - return ent; -} - -void -sf_eno_close (sf_eno ent) -/*< Free internal storage >*/ -{ - if (ent == (sf_eno) NULL) { - return; - } - - int i; - const int n = ent->order; - for (i = 0; i < n; i++) { - free (ent->diff[i]); - } - free (ent->diff); - free (ent); -} - -void -sf_eno_set (sf_eno ent, double *c /* data [n] */) -/*< Set the interpolation table. c can be changed or freed afterwords >*/ -{ - int i, j; - - for (i = 0; i < ent->n; i++) { - /* copy the initial data */ - ent->diff[0][i] = c[i]; - } - - for (j = 1; j < ent->order; j++) { - for (i = 0; i < ent->n - j; i++) { - /* compute difference tables */ - ent->diff[j][i] = ent->diff[j - 1][i + 1] - ent->diff[j - 1][i]; - } - } -} - -void sf_eno_apply (sf_eno ent, - int i, /* grid location */ - double x, /* offset from grid */ - double *f, /* output data value */ - double *f1, /* output derivative */ - der what /* flag of what to compute */) -/*< Apply interpolation >*/ -{ - int j, k, i1, i2, n; - double s, s1, y, w, g, g1; - - i2 = SF_MAX (0, SF_MIN(i, ent->n - ent->order)); - i1 = SF_MIN (i2, SF_MAX(0, i - ent->order + 2)); - - w = fabs(ent->diff[ent->order - 1][i1]); - for (j = i1 + 1; j <= i2; j++) { - g = fabs(ent->diff[ent->order - 1][j]); - if (w > g) - w = g; - } - - /* loop over starting points */ - for (g = 0., g1 = 0., n = 0, j = i1; j <= i2; j++) { - if (fabs(ent->diff[ent->order - 1][j]) > w) - continue; - n++; - - y = x + i - j; - - /* loop to compute the polynomial */ - for (s = 1., s1 = 0., k = 0; k < ent->order; k++) { - if (what != FUNC) { - g1 += s1 * ent->diff[k][j]; - s1 = (s + s1 * (y - k)) / (k + 1.); - } - if (what != DER) - g += s * ent->diff[k][j]; - s *= (y - k) / (k + 1.); - } - } - - if (what != DER) - *f = g / n; - if (what != FUNC) - *f1 = g1 / n; -} - -/* $Id: eno.c 8699 2012-07-03 22:10:38Z vovizmus $ */ diff --git a/src/xspice/icm/table/mada/eno.h b/src/xspice/icm/table/mada/eno.h deleted file mode 100644 index e9cc1ffc0..000000000 --- a/src/xspice/icm/table/mada/eno.h +++ /dev/null @@ -1,36 +0,0 @@ -/* This file is automatically generated. DO NOT EDIT! */ - -#ifndef _sf_eno_h -#define _sf_eno_h - - -typedef struct Eno *sf_eno; -/* abstract data type */ - - -typedef enum {FUNC, DER, BOTH} der; -/* flag values */ - - -sf_eno sf_eno_init (int order, /* interpolation order */ - int n /* data size */); -/*< Initialize interpolation object. >*/ - - -void sf_eno_close (sf_eno ent); -/*< Free internal storage >*/ - - -void sf_eno_set (sf_eno ent, double* c /* data [n] */); -/*< Set the interpolation table. c can be changed or freed afterwords >*/ - - -void sf_eno_apply (sf_eno ent, - int i, /* grid location */ - double x, /* offset from grid */ - double *f, /* output data value */ - double *f1, /* output derivative */ - der what /* flag of what to compute */); -/*< Apply interpolation >*/ - -#endif diff --git a/src/xspice/icm/table/mada/eno2.c b/src/xspice/icm/table/mada/eno2.c deleted file mode 100644 index e8a0cc867..000000000 --- a/src/xspice/icm/table/mada/eno2.c +++ /dev/null @@ -1,174 +0,0 @@ -/* ENO interpolation in 2-D */ -/* - Copyright (C) 2004 University of Texas at Austin - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -*/ - -#include "eno.h" -#include "eno2.h" - -#include "alloc.h" -#include "ngspice/cm.h" - - -struct Eno2 { - int order, ng, n1, n2; - sf_eno jnt, *ent; - double *f, *f1; -}; -/* concrete data type */ - -sf_eno2 -sf_eno2_init (int order, /* interpolation order */ - int n1, int n2 /* data dimensions */) -/*< Initialize interpolation object >*/ -{ - int xrc = 0; - sf_eno2 pnt = (sf_eno2) NULL; - - if ((pnt = (sf_eno2) sf_alloc( - 1, sizeof(*pnt))) == (sf_eno2) NULL) { - cm_message_printf("Unable to allocate sf_eno2 structure " - "in sf_eno2_init"); - xrc = -1; - goto EXITPOINT; - } - - pnt->order = order; - pnt->n1 = n1; - pnt->n2 = n2; - pnt->ng = 2 * order - 2; - if (pnt->ng > pnt->n2) { - cm_message_printf("%s: ng=%d is too big", __FILE__, pnt->ng); - xrc = -1; - goto EXITPOINT; - } - - if ((pnt->jnt = sf_eno_init(order, pnt->ng)) == (sf_eno) NULL) { - cm_message_printf("Unable to initialize field jnt " - "in sf_eno2_init"); - xrc = -1; - goto EXITPOINT; - } - - if ((pnt->f = sf_doublealloc (pnt->ng)) == (double *) NULL) { - cm_message_printf("Unable to allocate field f in sf_eno2_init()"); - xrc = -1; - goto EXITPOINT; - } - - if ((pnt->f1 = sf_doublealloc (pnt->ng)) == (double *) NULL) { - cm_message_printf("Unable to allocate field f1 in sf_eno2_init()"); - xrc = -1; - goto EXITPOINT; - } - - if ((pnt->ent = (sf_eno *) sf_alloc( - n2, sizeof(sf_eno))) == (sf_eno *) NULL) { - cm_message_printf("Unable to allocate field ent in sf_eno2_init()"); - xrc = -1; - goto EXITPOINT; - } - - { - int i2; - for (i2 = 0; i2 < n2; i2++) { - if ((pnt->ent[i2] = sf_eno_init( - order, n1)) == (sf_eno) NULL) { - cm_message_printf("Unable to initialize field ent[%d] " - "in sf_eno3_init()", - i2); - xrc = -1; - goto EXITPOINT; - } - } - } - -EXITPOINT: - if (xrc != 0) { - if (pnt != (sf_eno2) NULL) { - sf_eno2_close(pnt); - pnt = (sf_eno2) NULL; - } - } - return pnt; -} - -void -sf_eno2_set (sf_eno2 pnt, double **c /* data [n2][n1] */) -/*< Set the interpolation table. c can be changed or freed afterwords. >*/ -{ - int i2; - - for (i2 = 0; i2 < pnt->n2; i2++) - sf_eno_set (pnt->ent[i2], c[i2]); -} - -void -sf_eno2_close (sf_eno2 pnt) -/*< Free internal storage >*/ -{ - int i2; - - if (!pnt) - return; - - sf_eno_close (pnt->jnt); - for (i2 = 0; i2 < pnt->n2; i2++) - sf_eno_close (pnt->ent[i2]); - free (pnt->f); - free (pnt->f1); - free (pnt->ent); - free (pnt); -} - -void -sf_eno2_apply (sf_eno2 pnt, - int i, int j, /* grid location */ - double x, double y, /* offset from grid */ - double *f, /* output data value */ - double *f1, /* output derivative [2] */ - der what /* what to compute [FUNC,DER,BOTH] */) -/*< Apply interpolation. >*/ -{ - int k, b2; - double g; - - if (j - pnt->order + 2 < 0) - b2 = 0; - else if (j + pnt->order - 1 > pnt->n2 - 1) - b2 = pnt->n2 - pnt->ng; - else - b2 = j - pnt->order + 2; - - j -= b2; - - for (k = 0; k < pnt->ng; k++) - if (what != FUNC) - sf_eno_apply (pnt->ent[b2 + k], i, x, pnt->f + k, pnt->f1 + k, BOTH); - else - sf_eno_apply (pnt->ent[b2 + k], i, x, pnt->f + k, pnt->f1 + k, FUNC); - - sf_eno_set (pnt->jnt, pnt->f); - sf_eno_apply (pnt->jnt, j, y, f, f1 + 1, what); - - if (what != FUNC) { - sf_eno_set (pnt->jnt, pnt->f1); - sf_eno_apply (pnt->jnt, j, y, f1, &g, FUNC); - } -} - -/* $Id: eno2.c 9044 2012-08-13 19:35:59Z vovizmus $ */ diff --git a/src/xspice/icm/table/mada/eno2.h b/src/xspice/icm/table/mada/eno2.h deleted file mode 100644 index 8da227efd..000000000 --- a/src/xspice/icm/table/mada/eno2.h +++ /dev/null @@ -1,35 +0,0 @@ -/* This file is automatically generated. DO NOT EDIT! */ - -#ifndef _sf_eno2_h -#define _sf_eno2_h - - -#include "eno.h" - - -typedef struct Eno2 *sf_eno2; -/* abstract data type */ - - -sf_eno2 sf_eno2_init (int order, /* interpolation order */ - int n1, int n2 /* data dimensions */); -/*< Initialize interpolation object >*/ - - -void sf_eno2_set (sf_eno2 pnt, double **c /* data [n2][n1] */); -/*< Set the interpolation table. c can be changed or freed afterwords. >*/ - - -void sf_eno2_close (sf_eno2 pnt); -/*< Free internal storage >*/ - - -void sf_eno2_apply (sf_eno2 pnt, - int i, int j, /* grid location */ - double x, double y, /* offset from grid */ - double *f, /* output data value */ - double *f1, /* output derivative [2] */ - der what /* what to compute [FUNC,DER,BOTH] */); -/*< Apply interpolation. >*/ - -#endif diff --git a/src/xspice/icm/table/mada/eno3.c b/src/xspice/icm/table/mada/eno3.c deleted file mode 100644 index a5cb76f64..000000000 --- a/src/xspice/icm/table/mada/eno3.c +++ /dev/null @@ -1,206 +0,0 @@ -/* ENO interpolation in 3-D */ -/* - Copyright (C) 2004 University of Texas at Austin - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -*/ - -#include "eno2.h" -#include "eno3.h" - -#include "alloc.h" -#include "ngspice/cm.h" - - -struct Eno3 { - int order, ng, n1, n2, n3; - sf_eno **ent; - sf_eno2 jnt; - double **f, **f1; -}; -/* concrete data type */ - -sf_eno3 -sf_eno3_init(int order, /* interpolation order */ - int n1, int n2, int n3 /* data dimensions */) -/*< Initialize interpolation object >*/ -{ - int xrc = 0; - sf_eno3 pnt = (sf_eno3) NULL; - - /* Allocate base structrue */ - if ((pnt = (sf_eno3) sf_alloc (1, sizeof *pnt)) == (sf_eno3) NULL) { - cm_message_printf("Unable to allocate sf_eno3 structure " - "in sf_eno3_init"); - xrc = -1; - goto EXITPOINT; - } - - pnt->order = order; - pnt->n1 = n1; - pnt->n2 = n2; - pnt->n3 = n3; - pnt->ng = 2 * order - 2; - - if (pnt->ng > n2 || pnt->ng > n3) { - cm_message_printf("%s: ng=%d is too big", __FILE__, pnt->ng); - xrc = -1; - goto EXITPOINT; - } - - if ((pnt->jnt = sf_eno2_init( - order, pnt->ng, pnt->ng)) == (sf_eno2) NULL) { - cm_message_printf("Unable to initialize field jnt " - "in sf_eno3_init"); - xrc = -1; - goto EXITPOINT; - } - - if ((pnt->f = sf_doublealloc2(pnt->ng, pnt->ng)) == (double **) NULL) { - cm_message_printf("Unable to allocate field f in sf_eno3_init()"); - xrc = -1; - goto EXITPOINT; - } - - if ((pnt->f1 = sf_doublealloc2(pnt->ng, pnt->ng)) == (double **) NULL) { - cm_message_printf("Unable to allocate field f1 in sf_eno3_init()"); - xrc = -1; - goto EXITPOINT; - } - - if ((pnt->ent = (sf_eno **) sf_alloc( - n3, sizeof(sf_eno*))) == (sf_eno **) NULL) { - cm_message_printf("Unable to allocate field ent in sf_eno3_init()"); - xrc = -1; - goto EXITPOINT; - } - - { - int i3; - for (i3 = 0; i3 < n3; i3++) { - if ((pnt->ent[i3] = (sf_eno*) sf_alloc( - n2, sizeof(sf_eno))) == (sf_eno *) NULL) { - cm_message_printf("Unable to allocate field ent[%d] " - "in sf_eno3_init()", i3); - xrc = -1; - goto EXITPOINT; - } - int i2; - for (i2 = 0; i2 < n2; i2++) { - if ((pnt->ent[i3][i2] = sf_eno_init( - order, n1)) == (sf_eno) NULL) { - cm_message_printf("Unable to initialize field " - "ent[%d][%d] in sf_eno3_init()", - i2, i3); - xrc = -1; - goto EXITPOINT; - } - } - } - } - -EXITPOINT: - if (xrc != 0) { - if (pnt != (sf_eno3) NULL) { - sf_eno3_close(pnt); - free(pnt); - pnt = (sf_eno3) NULL; - } - } - return pnt; -} - -void -sf_eno3_set(sf_eno3 pnt, double ***c /* data [n3][n2][n1] */) -/*< Set the interpolation table. c can be changed or freed afterwords. >*/ -{ - int i2, i3; - - for (i3 = 0; i3 < pnt->n3; i3++) - for (i2 = 0; i2 < pnt->n2; i2++) - sf_eno_set (pnt->ent[i3][i2], c[i3][i2]); -} - -void -sf_eno3_close(sf_eno3 pnt) -/*< Free internal storage. >*/ -{ - int i2, i3; - - if (!pnt) - return; - - sf_eno2_close (pnt->jnt); - for (i3 = 0; i3 < pnt->n3; i3++) { - for (i2 = 0; i2 < pnt->n2; i2++) - sf_eno_close (pnt->ent[i3][i2]); - free (pnt->ent[i3]); - } - free (pnt->ent); - free (pnt->f[0]); - free (pnt->f); - free (pnt->f1[0]); - free (pnt->f1); - free (pnt); -} - -void -sf_eno3_apply(sf_eno3 pnt, - int i, int j, int k, /* grid location */ - double x, double y, double z, /* offsets from grid */ - double *f, /* output data */ - double *f1, /* output derivative [3] */ - der what /* to compute [FUNC|DER|BOTH] */) -/*< Apply interpolation. >*/ -{ - int i2, i3, b2, b3; - double g; - - if (j - pnt->order + 2 < 0) - b2 = 0; - else if (j + pnt->order - 1 > pnt->n2 - 1) - b2 = pnt->n2 - pnt->ng; - else - b2 = j - pnt->order + 2; - - j -= b2; - - - if (k - pnt->order + 2 < 0) - b3 = 0; - else if (k + pnt->order - 1 > pnt->n3 - 1) - b3 = pnt->n3 - pnt->ng; - else - b3 = k - pnt->order + 2; - - k -= b3; - - for (i3 = 0; i3 < pnt->ng; i3++) - for (i2 = 0; i2 < pnt->ng; i2++) - sf_eno_apply (pnt->ent[b3 + i3][b2 + i2], i, x, - &(pnt->f[i3][i2]), - &(pnt->f1[i3][i2]), - (what==FUNC ? FUNC : BOTH)); - - sf_eno2_set (pnt->jnt, pnt->f); - sf_eno2_apply (pnt->jnt, j, k, y, z, f, f1 + 1, what); - - if (what != FUNC) { - sf_eno2_set (pnt->jnt, pnt->f1); - sf_eno2_apply (pnt->jnt, j, k, y, z, f1, &g, FUNC); - } -} - -/* $Id: eno3.c 4148 2009-02-09 03:55:32Z sfomel $ */ diff --git a/src/xspice/icm/table/mada/eno3.h b/src/xspice/icm/table/mada/eno3.h deleted file mode 100644 index 6fad21b32..000000000 --- a/src/xspice/icm/table/mada/eno3.h +++ /dev/null @@ -1,35 +0,0 @@ -/* This file is automatically generated. DO NOT EDIT! */ - -#ifndef _sf_eno3_h -#define _sf_eno3_h - - -#include "eno2.h" - - -typedef struct Eno3 *sf_eno3; -/* abstract data type */ - - -sf_eno3 sf_eno3_init (int order, /* interpolation order */ - int n1, int n2, int n3 /* data dimensions */); -/*< Initialize interpolation object >*/ - - -void sf_eno3_set (sf_eno3 pnt, double ***c /* data [n3][n2][n1] */); -/*< Set the interpolation table. c can be changed or freed afterwords. >*/ - - -void sf_eno3_close (sf_eno3 pnt); -/*< Free internal storage. >*/ - - -void sf_eno3_apply (sf_eno3 pnt, - int i, int j, int k, /* grid location */ - double x, double y, double z, /* offsets from grid */ - double *f, /* output data */ - double *f1, /* output derivative [3] */ - der what /* to compute [FUNC|DER|BOTH] */); -/*< Apply interpolation. >*/ - -#endif diff --git a/src/xspice/icm/table/modpath.lst b/src/xspice/icm/table/modpath.lst deleted file mode 100644 index 53c945633..000000000 --- a/src/xspice/icm/table/modpath.lst +++ /dev/null @@ -1,2 +0,0 @@ -table2D -table3D diff --git a/src/xspice/icm/table/support/gettokens.c b/src/xspice/icm/table/support/gettokens.c deleted file mode 100644 index 18ff08ea8..000000000 --- a/src/xspice/icm/table/support/gettokens.c +++ /dev/null @@ -1,232 +0,0 @@ -/*=== Static CNVgettok ROUTINE ================*/ -/* -Get the next token from the input string. The input string pointer -is advanced to the following token and the token from the input -string is copied to malloced storage and a pointer to that storage -is returned. The original input string is undisturbed. -*/ - -#include -#include -#include -#include -#include - -#include "gettokens.h" - - - -char *CNVgettok(char **s) -{ - char *buf; /* temporary storage to copy token into */ - /*char *temp;*/ /* temporary storage to copy token into */ - char *ret_str; /* storage for returned string */ - - int i; - - /* allocate space big enough for the whole string */ - - buf = (char *) malloc(strlen(*s) + 1); - - /* skip over any white space */ - - while (isspace_c(**s) || (**s == '=') || - (**s == '(') || (**s == ')') || (**s == ',')) - (*s)++; - - /* isolate the next token */ - - switch (**s) { - - case '\0': /* End of string found */ - if (buf) - free(buf); - return NULL; - - - default: /* Otherwise, we are dealing with a */ - /* string representation of a number */ - /* or a mess o' characters. */ - i = 0; - while ( (**s != '\0') && - (! ( isspace_c(**s) || (**s == '=') || - (**s == '(') || (**s == ')') || - (**s == ',') - ) ) ) { - buf[i] = **s; - i++; - (*s)++; - } - buf[i] = '\0'; - break; - } - - /* skip over white space up to next token */ - - while (isspace_c(**s) || (**s == '=') || - (**s == '(') || (**s == ')') || (**s == ',')) - (*s)++; - - /* make a copy using only the space needed by the string length */ - - - ret_str = (char *) malloc(strlen(buf) + 1); - ret_str = strcpy(ret_str,buf); - - if (buf) free(buf); - - return ret_str; -} /* end of function CNVgettok */ - - - -/* -Get the next token from the input string together with its type. -The input string pointer -is advanced to the following token and the token from the input -string is copied to malloced storage and a pointer to that storage -is returned. The original input string is undisturbed. -*/ -char * CNVget_token(char **s, Cnv_Token_Type_t *type) -{ - char *ret_str; /* storage for returned string */ - - /* get the token from the input line */ - ret_str = CNVgettok(s); - - /* if no next token, return */ - if (ret_str == NULL) { - *type = CNV_NO_TOK; - return NULL; - } - - /* else, determine and return token type */ - switch (*ret_str) { - default: - *type = CNV_STRING_TOK; - break; - } - return ret_str; -} /* end of function CNVget_token */ - - - -/* - Function takes as input a string token from a SPICE - deck and returns a floating point equivalent value. -*/ -int cnv_get_spice_value(char *str, /* IN - The value text e.g. 1.2K */ - double *p_value) /* OUT - The numerical value */ -{ - /* the following were "int4" devices - jpm */ - size_t len; - size_t i; - int n_matched; - - /* A SPICE size line. <= 80 characters plus '\n\0' */ - typedef char line_t[82]; - line_t val_str; - - char c = ' '; - char c1; - - double scale_factor; - double value; - - /* Scan the input string looking for an alpha character that is not */ - /* 'e' or 'E'. Such a character is assumed to be an engineering */ - /* suffix as defined in the Spice 2G.6 user's manual. */ - - len = strlen(str); - if (len > sizeof(val_str) - 1) - len = sizeof(val_str) - 1; - - for (i = 0; i < len; i++) { - c = str[i]; - if (isalpha(c) && (c != 'E') && (c != 'e')) - break; - else if (isspace(c)) - break; - else - val_str[i] = c; - } - val_str[i] = '\0'; - - /* Determine the scale factor */ - - if ((i >= len) || (! isalpha(c))) - scale_factor = 1.0; - else { - c = (char) tolower(c); - - switch (c) { - - case 't': - scale_factor = 1.0e12; - break; - - case 'g': - scale_factor = 1.0e9; - break; - - case 'k': - scale_factor = 1.0e3; - break; - - case 'u': - scale_factor = 1.0e-6; - break; - - case 'n': - scale_factor = 1.0e-9; - break; - - case 'p': - scale_factor = 1.0e-12; - break; - - case 'f': - scale_factor = 1.0e-15; - break; - - case 'm': - i++; - if (i >= len) { - scale_factor = 1.0e-3; - break; - } - c1 = str[i]; - if (!isalpha(c1)) { - scale_factor = 1.0e-3; - break; - } - c1 = (char) toupper(c1); - if (c1 == 'E') - scale_factor = 1.0e6; - else if (c1 == 'I') - scale_factor = 25.4e-6; - else - scale_factor = 1.0e-3; - break; - - default: - scale_factor = 1.0; - } - } - - /* Convert the numeric portion to a float and multiply by the */ - /* scale factor. */ - - n_matched = sscanf(val_str, "%le", &value); - - if (n_matched < 1) { - *p_value = 0.0; - return -1; - } - - *p_value = value * scale_factor; - return 0; -} /* end of function cnv_get_spice_value */ - - - diff --git a/src/xspice/icm/table/support/gettokens.h b/src/xspice/icm/table/support/gettokens.h deleted file mode 100644 index beb6fc649..000000000 --- a/src/xspice/icm/table/support/gettokens.h +++ /dev/null @@ -1,10 +0,0 @@ -#ifndef gettokens_h_included -#define gettokens_h_included - -/* Type definition for each possible token returned. */ -typedef enum token_type_s { CNV_NO_TOK, CNV_STRING_TOK } Cnv_Token_Type_t; - -char * CNVget_token(char **s, Cnv_Token_Type_t *type); -char *CNVgettok(char **s); -int cnv_get_spice_value(char *str, double *p_value); -#endif /* gettokens_h_included */ diff --git a/src/xspice/icm/table/support/interp.c b/src/xspice/icm/table/support/interp.c deleted file mode 100644 index c3c5d2327..000000000 --- a/src/xspice/icm/table/support/interp.c +++ /dev/null @@ -1,200 +0,0 @@ -#include -#include -#include -#include -#include - -/*********************/ -/* 3d geometry types */ -/*********************/ - -typedef struct Point3Struct { /* 3d point */ - double x, y, z; - } Point3; -typedef Point3 Vector3; - - -/* Function to find the cross over point (the point before - which elements are smaller than or equal to x and after - which greater than x) - Returns the highest index of an element in arr whose value is less than - or equal to x or 0 if all elements are greater than x. It is assumed that - arr is sorted in order of increasing values. */ -int findCrossOver(double arr[], int n, double x) -{ - int low = 0; - int high = n; /* 1 more than highest index */ - while (high - low > 1) { - const int mid = (low + high) / 2; - if (arr[mid] > x) { /* search lower */ - high = mid; - } - else { /* search higher */ - low = mid; - } - } /* end of bisecting loop */ - - return low; -} /* end of function findCrossOver */ - - - -#if 0 -/* https://helloacm.com/cc-function-to-compute-the-bilinear-interpolation/ */ -double -BilinearInterpolation(double q11, double q12, double q21, double q22, double x1, double x2, double y1, double y2, double x, double y) -{ - double x2x1, y2y1, x2x, y2y, yy1, xx1; - x2x1 = x2 - x1; - y2y1 = y2 - y1; - x2x = x2 - x; - y2y = y2 - y; - yy1 = y - y1; - xx1 = x - x1; - return 1.0 / (x2x1 * y2y1) * ( - q11 * x2x * y2y + - q21 * xx1 * y2y + - q12 * x2x * yy1 + - q22 * xx1 * yy1 - ); -} - - -/* - * C code from the article - * "Tri-linear Interpolation" - * by Steve Hill, sah@ukc.ac.uk - * in "Graphics Gems IV", Academic Press, 1994 - * - */ - - -double -trilinear(Point3 *p, double *d, int xsize, int ysize, int zsize, double def) -{ -# define DENS(X, Y, Z) d[(X)+xsize*((Y)+ysize*(Z))] - - int x0, y0, z0, - x1, y1, z1; - double *dp, - fx, fy, fz, - d000, d001, d010, d011, - d100, d101, d110, d111, - dx00, dx01, dx10, dx11, - dxy0, dxy1, dxyz; - - x0 = floor(p->x); - fx = p->x - x0; - y0 = floor(p->y); - fy = p->y - y0; - z0 = floor(p->z); - fz = p->z - z0; - - x1 = x0 + 1; - y1 = y0 + 1; - z1 = z0 + 1; - - if (x0 >= 0 && x1 < xsize && - y0 >= 0 && y1 < ysize && - z0 >= 0 && z1 < zsize) { - dp = &DENS(x0, y0, z0); - d000 = dp[0]; - d100 = dp[1]; - dp += xsize; - d010 = dp[0]; - d110 = dp[1]; - dp += xsize*ysize; - d011 = dp[0]; - d111 = dp[1]; - dp -= xsize; - d001 = dp[0]; - d101 = dp[1]; - } else { -# define INRANGE(X, Y, Z) \ - ((X) >= 0 && (X) < xsize && \ - (Y) >= 0 && (Y) < ysize && \ - (Z) >= 0 && (Z) < zsize) - - d000 = INRANGE(x0, y0, z0) ? DENS(x0, y0, z0) : def; - d001 = INRANGE(x0, y0, z1) ? DENS(x0, y0, z1) : def; - d010 = INRANGE(x0, y1, z0) ? DENS(x0, y1, z0) : def; - d011 = INRANGE(x0, y1, z1) ? DENS(x0, y1, z1) : def; - - d100 = INRANGE(x1, y0, z0) ? DENS(x1, y0, z0) : def; - d101 = INRANGE(x1, y0, z1) ? DENS(x1, y0, z1) : def; - d110 = INRANGE(x1, y1, z0) ? DENS(x1, y1, z0) : def; - d111 = INRANGE(x1, y1, z1) ? DENS(x1, y1, z1) : def; - } -/* linear interpolation from l (when a=0) to h (when a=1)*/ -/* (equal to (a*h)+((1-a)*l) */ -#define LERP(a,l,h) ((l)+(((h)-(l))*(a))) - - dx00 = LERP(fx, d000, d100); - dx01 = LERP(fx, d001, d101); - dx10 = LERP(fx, d010, d110); - dx11 = LERP(fx, d011, d111); - - dxy0 = LERP(fy, dx00, dx10); - dxy1 = LERP(fy, dx01, dx11); - - dxyz = LERP(fz, dxy0, dxy1); - - return dxyz; -} - -#endif - - -double BilinearInterpolation(double x, double y, - int xind, int yind, double **td) -{ - double V00, V10, V01, V11, Vxyz; - - V00 = td[yind][xind]; - V10 = td[yind][xind+1]; - V01 = td[yind+1][xind]; - V11 = td[yind+1][xind+1]; - - Vxyz = V00 * (1 - x) * (1 - y) + - V10 * x * (1 - y) + - V01 * (1 - x) * y + - V11 * x * y; - return Vxyz; -} /* end of function BilinearInterpolation */ - - - -/* trilinear interpolation -Paul Bourke -July 1997 -http://paulbourke.net/miscellaneous/interpolation/ */ -double TrilinearInterpolation(double x, double y, double z, - int xind, int yind, int zind, double ***td) -{ - double V000, V100, V010, V001, V101, V011, V110, V111, Vxyz; - - V000 = td[zind][yind][xind]; - V100 = td[zind][yind][xind+1]; - V010 = td[zind][yind+1][xind]; - V001 = td[zind+1][yind][xind]; - V101 = td[zind+1][yind][xind+1]; - V011 = td[zind+1][yind+1][xind]; - V110 = td[zind][yind+1][xind+1]; - V111 = td[zind+1][yind+1][xind+1]; - - Vxyz = V000 * (1 - x) * (1 - y) * (1 - z) + - V100 * x * (1 - y) * (1 - z) + - V010 * (1 - x) * y * (1 - z) + - V001 * (1 - x) * (1 - y) * z + - V101 * x * (1 - y) * z + - V011 * (1 - x) * y * z + - V110 * x * y * (1 - z) + - V111 * x * y * z; - return Vxyz; -} - - - - - - diff --git a/src/xspice/icm/table/support/table_util.h b/src/xspice/icm/table/support/table_util.h deleted file mode 100644 index d95066510..000000000 --- a/src/xspice/icm/table/support/table_util.h +++ /dev/null @@ -1,38 +0,0 @@ -#include "eno2.h" -#include "eno3.h" - -typedef struct { - int ix; /* size of array in x */ - int iy; /* size of array in y */ - int iz; /* size of array in z */ - - sf_eno3 newtable; /* the table, code borrowed from madagascar project */ - - /* Input values corresponding to each index. They define the value - * in the domain at each index value */ - double *xcol; /* array of doubles in x */ - double *ycol; /* array of doubles in y */ - double *zcol; /* array of doubles in z */ - - double ***table; /* f(xi, yj, zk) */ -} Table3_Data_t; - -void free_local_data(Table3_Data_t *loc); - - -Table3_Data_t *init_local_data(const char *filename, int order); - -/* Finds difference between column values */ -static inline double get_local_diff(int n, double *col, int ind) -{ - if (ind >= n - 1) { - return col[n - 1] - col[n - 2]; - } - if (ind <= 0) { - return col[1] - col[0]; - } - return 0.5 * (col[ind + 1] - col[ind - 1]); -} /* end of function get_local_diff */ - - - diff --git a/src/xspice/icm/table/table2D/cfunc.mod b/src/xspice/icm/table/table2D/cfunc.mod deleted file mode 100644 index a5375c3e7..000000000 --- a/src/xspice/icm/table/table2D/cfunc.mod +++ /dev/null @@ -1,780 +0,0 @@ -/*.......1.........2.........3.........4.........5.........6.........7.........8 -================================================================================ - -FILE table2D/cfunc.mod - -------------------------------------------------------------------------- - Copyright 2015 - The ngspice team - All Rights Reserved - GPL - (see COPYING or https://opensource.org/licenses/GPL-2.0) -------------------------------------------------------------------------- - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - - - -AUTHORS - - 03 Nov 2015 Holger Vogt - - -MODIFICATIONS - - 10 Aug 2018 Holger Vogt - -SUMMARY - - This file contains the model-specific routines used to - functionally describe the 2D table code model used - to read and interpolate a value from a 2D table from a file. - - The essentially non-oscillatory (ENO) interpolation in 2-D (eno2.c) is taken from the - Madagascar Project at http://www.ahay.org/wiki/Main_Page - Currently ENO is used only to obtain the derivatives, - the data values are obtained by bilinear interpolation. - This combination allows op convergence for some data tables (no guarantee though). - -INTERFACES - - FILE ROUTINE CALLED - - N/A N/A - - -REFERENCED FILES - - Inputs from and outputs to ARGS structure. - - -NON-STANDARD FEATURES - - NONE - -===============================================================================*/ - -/*=== INCLUDE FILES ====================*/ -#include -#include -#include -#include -#include -#include - -#include -#include - -#include "mada/eno2.h" - -typedef struct { - int ix; /* size of array in x */ - int iy; /* size of array in y */ - - sf_eno2 newtable; /* the table, code borrowed from madagascar project */ - - /* Input values corresponding to each index. They define the value - * in the domain at each index value */ - double *xcol; /* array of doubles in x */ - double *ycol; /* array of doubles in y */ - - double **table; /* f(xi, yj) */ -} Table2_Data_t; - -typedef Table2_Data_t Local_Data_t; - -/*=== MACROS ===========================*/ - -#if defined(__MINGW32__) || defined(_MSC_VER) -#define DIR_PATHSEP "\\" -#else -#define DIR_PATHSEP "/" -#endif - -#if defined(_MSC_VER) -#define strdup _strdup -#endif - -/*=== LOCAL VARIABLES & TYPEDEFS =======*/ - -struct filesource_state { - FILE *fp; - long pos; - unsigned char atend; -}; - - - - - -/*=== FUNCTION PROTOTYPE DEFINITIONS ===*/ - -double BilinearInterpolation(double x, double y, - int xind, int yind, double **td); -extern char *CNVgettok(char **s); -int cnv_get_spice_value(char *str, double *p_value); -extern int findCrossOver(double arr[], int n, double x); - -static void free_local_data(Table2_Data_t *loc); -static inline double get_local_diff(int n, double *col, int ind); -static Table2_Data_t *init_local_data(const char *filename, int order); - - - -/*============================================================================== - -FUNCTION cnv_get_spice_value() - -AUTHORS - - ??? Bill Kuhn - -MODIFICATIONS - - 30 Sep 1991 Jeffrey P. Murray - -SUMMARY - - This function takes as input a string token from a SPICE - deck and returns a floating point equivalent value. - -INTERFACES - - FILE ROUTINE CALLED - - N/A N/A - -RETURNED VALUE - - Returns the floating point value in pointer *p_value. Also - returns an integer representing successful completion. - -GLOBAL VARIABLES - - NONE - -NON-STANDARD FEATURES - - NONE - -==============================================================================*/ - - - - -static void cm_table2D_callback(ARGS, - Mif_Callback_Reason_t reason) -{ - switch (reason) { - case MIF_CB_DESTROY: { - Table2_Data_t *loc = STATIC_VAR(locdata); - if (loc) { - free_local_data(loc); - STATIC_VAR(locdata) = loc = NULL; - } - break; - } /* end of case MIF_CB_DESTROY */ - } /* end of switch over reason being called */ -} /* end of function cm_table2D_callback */ - - - -/*============================================================================== - -FUNCTION void cm_table2D() - -AUTHORS - - 08 Nov 2015 Holger Vogt - -MODIFICATIONS - - - -SUMMARY - - This function implements 2D table code model. - -INTERFACES - - FILE ROUTINE CALLED - - N/A N/A - - -RETURNED VALUE - - Returns inputs and outputs via ARGS structure. - -GLOBAL VARIABLES - - NONE - -NON-STANDARD FEATURES - - NONE - -INPUT FILE SPEC - -* Title (comments preceded by * ignored) -* table size -ix -iy -* x row independent variables -x0 x1 x2 x3 ... xix-1 -* y column independent variables -y0 y1 y2 y3 ... yiy-1 -* table -x0y0 x1y0 x2y0 ... xix-1y0 -... -x0yiy-1 x1yiy-1 x2yiy-1 ... xix-1yiy-1 - - - -==============================================================================*/ - -/* How quickly partial derivative ramps to zero at boundary. */ - -#define RAMP_WIDTH 0.125 - -/*=== CM_table2D ROUTINE ===*/ - -static const char exceed_fmt[] = "%c value %g exceeds table limits,\n" - " please enlarge range of your table."; - -void cm_table2D(ARGS) /* structure holding parms, inputs, outputs, etc. */ -{ - int size, xind, yind; - double xval, yval, xoff, yoff, xdiff, ydiff, xramp, yramp; - double derivval[2], outval; - - Table2_Data_t *loc; /* Pointer to local static data, not to be included - in the state vector */ - - size = PORT_SIZE(out); - if (INIT == 1) { /* Must do initializations */ - STATIC_VAR(locdata) = init_local_data( - PARAM(file), - PARAM(order)); - CALLBACK = cm_table2D_callback; - } - - /* return immediately if there was an initialization error */ - if ((loc = STATIC_VAR(locdata)) == (Table2_Data_t *) NULL) { - return; - } - - /* get input x, y; - find corresponding indices; - get x and y offsets; - call interpolation functions with value and derivative */ - xval = INPUT(inx); - yval = INPUT(iny); - - /* check table ranges */ - if (xval < loc->xcol[0] || xval > loc->xcol[loc->ix - 1]) { - /* x input out of region: use nearest point in region, ramping - * partial derivative to zero at edge. - */ - - if (PARAM(verbose) > 0) - cm_message_printf(exceed_fmt, 'x', xval); - if (xval < loc->xcol[0]) { - xramp = 1 - ((loc->xcol[0] - xval) / - (RAMP_WIDTH * (loc->xcol[1] - loc->xcol[0]))); - if (xramp < 0.0) - xramp = 0.0; - xval = loc->xcol[0]; - } else { - xramp = 1 - ((xval - loc->xcol[loc->ix - 1]) / - (RAMP_WIDTH * (loc->xcol[loc->ix - 1] - - loc->xcol[loc->ix - 2]))); - if (xramp < 0.0) - xramp = 0.0; - xval = loc->xcol[loc->ix - 1]; - } - } else { - xramp = 1.0; - } - if (yval < loc->ycol[0] || yval > loc->ycol[loc->iy - 1]) { - if (PARAM(verbose) > 0) - cm_message_printf(exceed_fmt, 'y', yval); - if (yval < loc->ycol[0]) { - yramp = 1 - ((loc->ycol[0] - yval) / - (RAMP_WIDTH * (loc->ycol[1] - loc->ycol[0]))); - if (yramp < 0.0) - yramp = 0.0; - yval = loc->ycol[0]; - } else { - yramp = 1 - ((yval - loc->ycol[loc->iy - 1]) / - (RAMP_WIDTH * (loc->ycol[loc->iy - 1] - - loc->ycol[loc->iy - 2]))); - if (yramp < 0.0) - yramp = 0.0; - yval = loc->ycol[loc->iy - 1]; - } - } else { - yramp = 1.0; - } - - /*** find indices where interpolation will be done ***/ - /* something like binary search to get the index */ - xind = findCrossOver(loc->xcol, loc->ix, xval); - xoff = xval - loc->xcol[xind]; - yind = findCrossOver(loc->ycol, loc->iy, yval); - yoff = yval - loc->ycol[yind]; - - /* Find local difference around index of independent row and - * column values */ - xdiff = get_local_diff(loc->ix, loc->xcol, xind); - ydiff = get_local_diff(loc->iy, loc->ycol, yind); - - /* Essentially non-oscillatory (ENO) interpolation to obtain the derivatives only. - Using outval for now yields ngspice op non-convergence */ - sf_eno2_apply(loc->newtable, - xind, yind, /* grid location */ - xoff, yoff, /* offset from grid */ - &outval, /* output data value */ - derivval, /* output derivatives [2] */ - DER /* what to compute [FUNC, DER, BOTH] */ - ); - - /* xind may become too large when xval == xcol[loc->ix - 1] */ - if (xind == loc->ix - 1) { - --xind; - xoff += loc->xcol[xind + 1] - loc->xcol[xind]; - } - if (yind == loc->iy - 1) { - --yind; - yoff += loc->ycol[yind + 1] - loc->ycol[yind]; - } - - /* Overwrite outval from sf_eno2_apply by bilinear interpolation */ - outval = BilinearInterpolation( - xoff / (loc->xcol[xind + 1] - loc->xcol[xind]), - yoff / (loc->ycol[yind + 1] - loc->ycol[yind]), - xind, yind, loc->table); - - if (ANALYSIS != MIF_AC) { - double xderiv, yderiv, outv; - outv = PARAM(offset) + PARAM(gain) * outval; - OUTPUT(out) = outv; - xderiv = xramp * PARAM(gain) * derivval[0] / xdiff; - PARTIAL(out, inx) = xderiv; - yderiv = yramp * PARAM(gain) * derivval[1] / ydiff; - PARTIAL(out, iny) = yderiv; - - if (PARAM(verbose) > 1) { - cm_message_printf("\nI: %g, xval: %g, yval: %g, " - "xderiv: %g, yderiv: %g", - outv, xval, yval, xderiv, yderiv); - } - } - else { - Mif_Complex_t ac_gain; - ac_gain.real = xramp * PARAM(gain) * derivval[0] / xdiff; - ac_gain.imag= 0.0; - AC_GAIN(out, inx) = ac_gain; - ac_gain.real = yramp * PARAM(gain) * derivval[1] / ydiff; - ac_gain.imag= 0.0; - AC_GAIN(out, iny) = ac_gain; - } -} /* end of function cm_table2D */ - - - -/* This function initializes local data */ -static Table2_Data_t *init_local_data(const char *filename, int order) -{ - int xrc = 0; - int ix = 0, /* elements in a row */ - iy = 0; /* number of rows */ - - double **table_data; - double tmp; - FILE *fp = (FILE *) NULL; /* Handle to file */ - char *cFile = (char *) NULL; - char *cThisLine = (char *) NULL; - char *cThisPtr, *cThisLinePtr; - size_t lFileLen; /* Length of file */ - size_t lFileRead; /* Length of file read in */ - int lLineCount; /* Current line number */ - size_t lTotalChar; /* Total characters read */ - int interporder; /* order of interpolation for eno */ - Table2_Data_t *loc = (Table2_Data_t *) NULL; /* local data */ - - - /* Allocate static storage for *loc */ - if ((loc = (Table2_Data_t *) calloc(1, - sizeof(Table2_Data_t))) == (Table2_Data_t *) NULL) { - cm_message_printf("cannot allocate memory for lookup table."); - xrc = -1; - goto EXITPOINT; - } - - /* Init row and column counts to 0 (actually already were due - * to calloc) */ - loc->ix = loc->iy = 0; - - /* open file */ - fp = fopen_with_path(filename, "r"); - if (!fp) { /* Standard open attempt failed */ - const char * const lbuffer = getenv("NGSPICE_INPUT_DIR"); - if (lbuffer && *lbuffer) { - char * const p = (char *) malloc(strlen(lbuffer) + - strlen(DIR_PATHSEP) + - strlen(filename) + 1); - if (p == (char *) NULL) { - cm_message_printf("cannot allocate buffer to " - "attempt alternate file open."); - xrc = -1; - goto EXITPOINT; - } - (void) sprintf(p, "%s%s%s", - lbuffer, DIR_PATHSEP, filename); - fp = fopen(p, "r"); - free(p); - } - } - - /* Test for valid file pointer */ - if (!fp) { - cm_message_printf("cannot open file %s", filename); - xrc = -1; - goto EXITPOINT; - } - - /* Find the size of the data file */ - { - struct stat st; - if (fstat(fileno(fp), &st)) { - cm_message_printf("cannot get length of file %s", - filename); - xrc = -1; - goto EXITPOINT; - } - /* Copy file length */ - lFileLen = (size_t) st.st_size; - } - - /* create string to hold the whole file */ - cFile = calloc(lFileLen + 1, sizeof(char)); - /* create another string long enough for file manipulation */ - cThisLine = calloc(lFileLen + 1, sizeof(char)); - if (cFile == NULL || cThisLine == NULL) { - cm_message_printf("Insufficient memory to read file %s", - filename); - xrc = -1; - goto EXITPOINT; - } - - /* read whole file into cFile */ - { - /* Number of chars read may be less than lFileLen, because /r are - * skipped by 'fread' when file opened in text mode */ - lFileRead = fread(cFile, sizeof(char), lFileLen, fp); - const int file_error = ferror(fp); - fclose(fp); /* done with file */ - fp = (FILE *) NULL; - if (file_error) { - cm_message_printf("Error reading data file %s", filename); - xrc = -1; - goto EXITPOINT; - } - } - /* Number of chars read may be less than lFileLen, because /r are - * skipped by 'fread' when file opened in text mode */ - cFile[lFileRead] = '\0'; - - cThisPtr = cFile; - cThisLinePtr = cThisLine; - lLineCount = 0L; - lTotalChar = 0L; - - while (*cThisPtr) { /* Read until reaching null char */ - long lIndex = 0L; /* Index into cThisLine array */ - bool isNewline = false; /* Boolean indicating read a CR or LF */ - - while (*cThisPtr) { /* Read until reaching null char */ - if (!isNewline) { /* Haven't read a LF yet */ - if (*cThisPtr == '\n') { /* This char is a LF */ - isNewline = true; /* Set flag */ - } - } - else if (*cThisPtr != '\n') { /* Already found LF */ - break; /* Done with line */ - } - - /* Add char to output and increment */ - cThisLinePtr[lIndex++] = *cThisPtr++; - lTotalChar++; - } - - cThisLinePtr[lIndex] = '\0'; /* Terminate the string */ - lLineCount++; /* Increment the line counter */ - /* continue if comment or empty */ - if (cThisLinePtr[0] == '*' || cThisLinePtr[0] == '\n') { - lLineCount--; /* we count only real lines */ - continue; - } - - if (lLineCount == 1) { - cnv_get_spice_value(cThisLinePtr, &tmp); - loc->ix = ix = (int) tmp; - /* generate row data structure (x) */ - if ((loc->xcol = (double *) calloc((size_t) ix, - sizeof(double))) == (double *) NULL) { - cm_message_printf("Unable to allocate row structure."); - xrc = -1; - goto EXITPOINT; - } - } - else if (lLineCount == 2) { - cnv_get_spice_value(cThisLinePtr, &tmp); - loc->iy = iy = (int) tmp; - /* generate column data structure (y) */ - if ((loc->ycol = (double *) calloc((size_t) iy, - sizeof(double))) == (double *) NULL) { - cm_message_printf("Unable to allocate column structure."); - xrc = -1; - goto EXITPOINT; - } - } - else if (lLineCount == 3) { - char *token = CNVgettok(&cThisLinePtr); - int i = 0; - while (token) { - if (i == ix) { - cm_message_printf("Too many numbers in x row."); - free(token); - xrc = -1; - goto EXITPOINT; - } - cnv_get_spice_value(token, &loc->xcol[i++]); - free(token); - token = CNVgettok(&cThisLinePtr); - } - if (i < ix) { - cm_message_printf("Not enough numbers in x row."); - xrc = -1; - goto EXITPOINT; - } - } - else if (lLineCount == 4) { - char *token = CNVgettok(&cThisLinePtr); - int i = 0; - while (token) { - if (i == iy) { - cm_message_printf("Too many numbers in y row."); - xrc = -1; - goto EXITPOINT; - } - cnv_get_spice_value(token, &loc->ycol[i++]); - free(token); - token = CNVgettok(&cThisLinePtr); - } - if (i < iy) { - cm_message_printf("Not enough numbers in y row."); - xrc = -1; - goto EXITPOINT; - - } - /* jump out of while loop to read in the table */ - break; - } - } - - /* generate table core */ - interporder = order; - /* boundary limits set to param 'order' aren't recognized, - so limit them here */ - if (interporder < 2) { - cm_message_printf("Parameter Order=%d not possible, " - "set to minimum value 2", - interporder); - interporder = 2; - } - /* int order : interpolation order, - int n1, int n2 : data dimensions */ - if ((loc->newtable = sf_eno2_init( - interporder, ix, iy)) == (sf_eno2) NULL) { - cm_message_printf("eno2 initialization failure."); - xrc = -1; - goto EXITPOINT; - - } - - /* create table_data in memory */ - /* data [n2][n1] */ - if ((loc->table = table_data = (double **) calloc((size_t) iy, - sizeof(double *))) == (double **) NULL) { - cm_message_printf("Unable to allocate data table."); - free(cFile); - free(cThisLine); - free_local_data(loc); - return (Local_Data_t *) NULL; - } - - { - int i; - for (i = 0; i < iy; i++) { - if ((table_data[i] = (double *) calloc((size_t) ix, - sizeof(double))) == (double *) NULL) { - cm_message_printf("Unable to allocate data table " - "row %d", i + 1); - free(cFile); - free(cThisLine); - free_local_data(loc); - return (Local_Data_t *) NULL; - } - } - } - - loc->table = table_data; /* give to local data structure */ - - - /* continue reading f(x,y) values from cFile */ - lLineCount = 0; - while (*cThisPtr) { /* Read until reaching null char */ - char *token; - long int lIndex = 0; /* Index into cThisLine array */ - bool isNewline = 0; - - while (*cThisPtr) { /* Read until reaching null char */ - - if (!isNewline) { /* Haven't read a LF yet */ - if (*cThisPtr == '\n') /* This char is a LF */ - isNewline = 1; /* Set flag */ - } - - else if (*cThisPtr != '\n') { /* Already found LF */ - break; /* Done with line */ - } - - /* Add char to output and increment */ - cThisLinePtr[lIndex++] = *cThisPtr++; - lTotalChar++; - } - - cThisLinePtr[lIndex] = '\0'; /* Terminate the string */ - lLineCount++; /* Increment the line counter */ - /* continue if comment or empty */ - if (cThisLinePtr[0] == '*' || cThisLinePtr[0] == '\0') { - if (lTotalChar >= lFileLen) { - cm_message_printf("Not enough data in file %s", - filename); - free(cFile); - free(cThisLine); - free_local_data(loc); - return (Local_Data_t *) NULL; - } - lLineCount--; /* we count only real lines */ - continue; - } - token = CNVgettok(&cThisLinePtr); - { - int i = 0; - while (token) { - double tmpval; - if (i == ix) { - cm_message_printf("Too many numbers in y row no. %d.", - lLineCount); - xrc = -1; - goto EXITPOINT; - } - - /* read table core from cFile, fill local static table - * structure table_data */ - cnv_get_spice_value(token, &tmpval); - table_data[lLineCount - 1][i++] = tmpval; - free(token); - token = CNVgettok(&cThisLinePtr); - } - if (i < ix) { - cm_message_printf("Not enough numbers in y row no. %d.", - lLineCount); - xrc = -1; - goto EXITPOINT; - } - } - } /* end of loop over characters read from file */ - - /* fill table data into eno2 structure */ - sf_eno2_set(loc->newtable, table_data /* data [n2][n1] */); - -EXITPOINT: - /* free the file and memory allocated */ - if (cFile != (char *) NULL) { - free(cFile); - } - if (cThisLine != (char *) NULL) { - free(cThisLine); - } - if (fp != (FILE *) NULL) { - (void) fclose(fp); - } - - /* On error free any initialization that was started */ - if (xrc != 0) { - if (loc != (Table2_Data_t *) NULL) { - free_local_data(loc); - loc = (Table2_Data_t *) NULL; - } - } - return loc; -} /* end of function init_local_data */ - - - -/* Free memory allocations in Local_Data_t structure */ -static void free_local_data(Table2_Data_t *loc) -{ - if (loc == (Table2_Data_t *) NULL) { - return; - } - - /* Free data table and related values */ - if (loc->table) { - int i; - int n_y = loc->iy; - for (i = 0; i < n_y; i++) { - free(loc->table[i]); - } - - free(loc->table); - } - - free(loc->xcol); - free(loc->ycol); - sf_eno2_close(loc->newtable); - free(loc); -} /* end of function free_local_data */ - - - -/* Finds difference between column values */ -static inline double get_local_diff(int n, double *col, int ind) -{ - if (ind >= n - 1) { - return col[n - 1] - col[n - 2]; - } - if (ind <= 0) { - return col[1] - col[0]; - } - return 0.5 * (col[ind + 1] - col[ind - 1]); -} /* end of function get_local_diff */ - - - diff --git a/src/xspice/icm/table/table2D/ifspec.ifs b/src/xspice/icm/table/table2D/ifspec.ifs deleted file mode 100644 index 45dc814a6..000000000 --- a/src/xspice/icm/table/table2D/ifspec.ifs +++ /dev/null @@ -1,84 +0,0 @@ -/*.......1.........2.........3.........4.........5.........6.........7.........8 -================================================================================ - -------------------------------------------------------------------------- - Copyright 2015 - The ngspice team - All Rights Reserved - GPL - (see COPYING or https://opensource.org/licenses/GPL-2.0) -------------------------------------------------------------------------- - -AUTHORS - - 06 Nov 2015 Holger Vogt - - -SUMMARY - - This file contains the interface specification file for the - 2D table code model. - -===============================================================================*/ - -NAME_TABLE: - -C_Function_Name: cm_table2D -Spice_Model_Name: table2d -Description: "2D table model" - - -PORT_TABLE: - -Port_Name: inx iny out -Description: "inputx" "inputy" "output" -Direction: in in out -Default_Type: v v i -Allowed_Types: [v,vd,i,id,vnam] [v,vd,i,id,vnam] [v,vd,i,id] -Vector: no no no -Vector_Bounds: - - - -Null_Allowed: no no no - - - - -PARAMETER_TABLE: - -Parameter_Name: order verbose -Description: "order" "verbose" -Data_Type: int int -Default_Value: 3 0 -Limits: [2 -] [0 2] -Vector: no no -Vector_Bounds: - - -Null_Allowed: yes yes - -PARAMETER_TABLE: - -Parameter_Name: offset gain -Description: "offset" "gain" -Data_Type: real real -Default_Value: 0.0 1.0 -Limits: - - -Vector: no no -Vector_Bounds: - - -Null_Allowed: yes yes - - -PARAMETER_TABLE: - -Parameter_Name: file -Description: "file name" -Data_Type: string -Default_Value: "2D-table-model.txt" -Limits: - -Vector: no -Vector_Bounds: - -Null_Allowed: yes - - -STATIC_VAR_TABLE: - -Static_Var_Name: locdata -Description: "local static data" -Data_Type: pointer diff --git a/src/xspice/icm/table/table3D/cfunc.mod b/src/xspice/icm/table/table3D/cfunc.mod deleted file mode 100644 index 2792cfdcc..000000000 --- a/src/xspice/icm/table/table3D/cfunc.mod +++ /dev/null @@ -1,865 +0,0 @@ -/*.......1.........2.........3.........4.........5.........6.........7.........8 -================================================================================ - -FILE table3D/cfunc.mod - -------------------------------------------------------------------------- - Copyright 2015 - The ngspice team - All Rights Reserved - GPL - (see COPYING or https://opensource.org/licenses/BSD-3-Clause) -------------------------------------------------------------------------- - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - - - -AUTHORS - - 03 Nov 2015 Holger Vogt - - -MODIFICATIONS - - 10 Aug 2018 Holger Vogt - -SUMMARY - - This file contains the model-specific routines used to - functionally describe the 3D table code model used - to read and interpolate a value from a 3D table from a file. - - The essentially non-oscillatory (ENO) interpolation in 3-D (eno3.c) is taken from the - Madagascar Project at http://www.ahay.org/wiki/Main_Page - Currently ENO is used only to obtain the derivatives, - the data values are obtained by trilinear interpolation. - This combination allows op convergence for some data tables (no guarantee though). - -INTERFACES - - FILE ROUTINE CALLED - - N/A N/A - - -REFERENCED FILES - - Inputs from and outputs to ARGS structure. - - -NON-STANDARD FEATURES - - NONE - -===============================================================================*/ - -/*=== INCLUDE FILES ====================*/ -#include -#include -#include -#include -#include -#include - -#include -#include - -#include "support/gettokens.h" -#include "mada/eno2.h" -#include "mada/eno3.h" - -typedef struct { - int ix; /* size of array in x */ - int iy; /* size of array in y */ - int iz; /* size of array in z */ - - sf_eno3 newtable; /* the table, code borrowed from madagascar project */ - - /* Input values corresponding to each index. They define the value - * in the domain at each index value */ - double *xcol; /* array of doubles in x */ - double *ycol; /* array of doubles in y */ - double *zcol; /* array of doubles in z */ - - double ***table; /* f(xi, yj, zk) */ -} Table3_Data_t; - -typedef Table3_Data_t Local_Data_t; - -/*=== MACROS ===========================*/ - -#if defined(__MINGW32__) || defined(_MSC_VER) -#define DIR_PATHSEP "\\" -#else -#define DIR_PATHSEP "/" -#endif - -#if defined(_MSC_VER) -#define strdup _strdup -#endif - -/*=== LOCAL VARIABLES & TYPEDEFS =======*/ - - - - -/*=== FUNCTION PROTOTYPE DEFINITIONS ===*/ - -extern double BilinearInterpolation(double x, double y, int xind, int yind, double **td); -extern double TrilinearInterpolation(double x, double y, double z, int xind, int yind, int zind, double ***td); -extern int findCrossOver(double arr[], int n, double x); - -static void free_local_data(Table3_Data_t *loc); -static inline double get_local_diff(int n, double *col, int ind); -static Table3_Data_t *init_local_data(const char *filename, int order); - - - -/*============================================================================== - -FUNCTION cnv_get_spice_value() - -AUTHORS - - ??? Bill Kuhn - -MODIFICATIONS - - 30 Sep 1991 Jeffrey P. Murray - -SUMMARY - - This function takes as input a string token from a SPICE - deck and returns a floating point equivalent value. - -INTERFACES - - FILE ROUTINE CALLED - - N/A N/A - -RETURNED VALUE - - Returns the floating point value in pointer *p_value. Also - returns an integer representing successful completion. - -GLOBAL VARIABLES - - NONE - -NON-STANDARD FEATURES - - NONE - -==============================================================================*/ - - - - - -static void cm_table3D_callback(ARGS, - Mif_Callback_Reason_t reason) -{ - switch (reason) { - case MIF_CB_DESTROY: { - Table3_Data_t *loc = STATIC_VAR(locdata); - if (loc) { - free_local_data(loc); - STATIC_VAR(locdata) = loc = NULL; - } - break; - } /* end of case MIF_CB_DESTROY */ - } /* end of switch over reason being called */ -} /* end of function cm_table2D_callback */ - - - -/*============================================================================== - -FUNCTION void cm_table3D() - -AUTHORS - - 08 Nov 2015 Holger Vogt - -MODIFICATIONS - - - -SUMMARY - - This function implements 3D table code model. - -INTERFACES - - FILE ROUTINE CALLED - - N/A N/A - - -RETURNED VALUE - - Returns inputs and outputs via ARGS structure. - -GLOBAL VARIABLES - - NONE - -NON-STANDARD FEATURES - - NONE - -INPUT FILE SPEC - -* Title (comments preceded by * ignored) -* table size -ix -iy -* x row independent variables -x0 x1 x2 x3 ... xix-1 -* y column independent variables -y0 y1 y2 y3 ... yiy-1 -* z column independent variables -z0 z1 z2 z3 ... ziz-1 -* table -x0y0 x1y0 x2y0 ... xix-1y0 -... -x0yiy-1 x1yiy-1 x2yiy-1 ... xix-1yiy-1 - - - -==============================================================================*/ - - -/*=== CM_table3D ROUTINE ===*/ - - -/* How quickly partial derivative ramps to zero at boundary. */ - -#define RAMP_WIDTH 0.125 - -static const char exceed_fmt[] = "%c value %g exceeds table limits,\n" - " please enlarge range of your table."; - -void cm_table3D(ARGS) /* structure holding parms, inputs, outputs, etc. */ -{ - int size, xind, yind, zind; - double xval, yval, zval, xoff, yoff, zoff, xdiff, ydiff, zdiff; - double xramp, yramp, zramp; - double derivval[3], outval; - - Table3_Data_t *loc; /* Pointer to local static data, not to be included - in the state vector */ - - size = PORT_SIZE(out); - if (INIT == 1) { /* Must do initializations */ - STATIC_VAR(locdata) = init_local_data( - PARAM(file), - PARAM(order)); - CALLBACK = cm_table3D_callback; - } - - /* return immediately if there was an initialization error */ - if ((loc = STATIC_VAR(locdata)) == (Table3_Data_t *) NULL) { - return; - } - - /* get input x, y, z; - find corresponding indices; - get x and y offsets; - call interpolation functions with value and derivative */ - xval = INPUT(inx); - yval = INPUT(iny); - zval = INPUT(inz); - - /* check table ranges */ - if (xval < loc->xcol[0] || xval > loc->xcol[loc->ix - 1]) { - /* x input out of region: use nearest point in region, ramping - * partial derivative to zero at edge. - */ - - if (PARAM(verbose) > 0) - cm_message_printf(exceed_fmt, 'x', xval); - if (xval < loc->xcol[0]) { - xramp = 1 - ((loc->xcol[0] - xval) / - (RAMP_WIDTH * (loc->xcol[1] - loc->xcol[0]))); - if (xramp < 0.0) - xramp = 0.0; - xval = loc->xcol[0]; - } else { - xramp = 1 - ((xval - loc->xcol[loc->ix - 1]) / - (RAMP_WIDTH * (loc->xcol[loc->ix - 1] - - loc->xcol[loc->ix - 2]))); - if (xramp < 0.0) - xramp = 0.0; - xval = loc->xcol[loc->ix - 1]; - } - } else { - xramp = 1.0; - } - if (yval < loc->ycol[0] || yval > loc->ycol[loc->iy - 1]) { - if (PARAM(verbose) > 0) - cm_message_printf(exceed_fmt, 'y', yval); - if (yval < loc->ycol[0]) { - yramp = 1 - ((loc->ycol[0] - yval) / - (RAMP_WIDTH * (loc->ycol[1] - loc->ycol[0]))); - if (yramp < 0.0) - yramp = 0.0; - yval = loc->ycol[0]; - } else { - yramp = 1 - ((yval - loc->ycol[loc->iy - 1]) / - (RAMP_WIDTH * (loc->ycol[loc->iy - 1] - - loc->ycol[loc->iy - 2]))); - if (yramp < 0.0) - yramp = 0.0; - yval = loc->ycol[loc->iy - 1]; - } - } else { - yramp = 1.0; - } - if (zval < loc->zcol[0] || zval > loc->zcol[loc->iz - 1]) { - if (PARAM(verbose) > 0) - cm_message_printf(exceed_fmt, 'z', zval); - if (zval < loc->zcol[0]) { - zramp = 1 - ((loc->zcol[0] - zval) / - (RAMP_WIDTH * (loc->zcol[1] - loc->zcol[0]))); - if (zramp < 0.0) - zramp = 0.0; - zval = loc->zcol[0]; - } else { - zramp = 1 - ((zval - loc->zcol[loc->iz - 1]) / - (RAMP_WIDTH * (loc->zcol[loc->iz - 1] - - loc->zcol[loc->iz - 2]))); - if (zramp < 0.0) - zramp = 0.0; - zval = loc->zcol[loc->iz - 1]; - } - } else { - zramp = 1.0; - } - - - /*** find indices where interpolation will be done ***/ - /* something like binary search to get the index */ - xind = findCrossOver(loc->xcol, loc->ix, xval); - xoff = xval - loc->xcol[xind]; - yind = findCrossOver(loc->ycol, loc->iy, yval); - yoff = yval - loc->ycol[yind]; - zind = findCrossOver(loc->zcol, loc->iz, zval); - zoff = zval - loc->zcol[zind]; - - /* Find local difference around index of independent row and - * column values */ - xdiff = get_local_diff(loc->ix, loc->xcol, xind); - ydiff = get_local_diff(loc->iy, loc->ycol, yind); - zdiff = get_local_diff(loc->iz, loc->zcol, zind); - - /* Essentially non-oscillatory (ENO) interpolation to obtain the derivatives only. - Using outval for now yields ngspice op non-convergence */ - sf_eno3_apply(loc->newtable, - xind, yind, zind, /* grid location */ - xoff, yoff, zoff, /* offset from grid */ - &outval, /* output data value */ - derivval, /* output derivatives [3] */ - DER /* what to compute [FUNC, DER, BOTH] */ - ); - - /* xind may become too large when xval == xcol[loc->ix - 1] */ - if (xind == loc->ix - 1) { - --xind; - xoff += loc->xcol[xind + 1] - loc->xcol[xind]; - } - if (yind == loc->iy - 1) { - --yind; - yoff += loc->ycol[yind + 1] - loc->ycol[yind]; - } - if (zind == loc->iz - 1) { - --zind; - zoff += loc->zcol[zind + 1] - loc->zcol[zind]; - } - - /* overwrite outval from sf_eno3_apply by trilinear interpolation */ - outval = TrilinearInterpolation( - xoff / (loc->xcol[xind + 1] - loc->xcol[xind]), - yoff / (loc->ycol[yind + 1] - loc->ycol[yind]), - zoff / (loc->zcol[zind + 1] - loc->zcol[zind]), - xind, yind, zind, loc->table); - - if (ANALYSIS != MIF_AC) { - double xderiv, yderiv, zderiv, outv; - outv = PARAM(offset) + PARAM(gain) * outval; - OUTPUT(out) = outv; - xderiv = xramp * PARAM(gain) * derivval[0] / xdiff; - PARTIAL(out, inx) = xderiv; - yderiv = yramp * PARAM(gain) * derivval[1] / ydiff; - PARTIAL(out, iny) = yderiv; - zderiv = zramp * PARAM(gain) * derivval[2] / zdiff; - PARTIAL(out, inz) = zderiv; - - if (PARAM(verbose) > 1) { - cm_message_printf("\nI: %g, xval: %g, yval: %g, zval: %g, " - "xderiv: %g, yderiv: %g, zderiv: %g", - outv, xval, yval, zval, xderiv, yderiv, zderiv); - } - } - else { - Mif_Complex_t ac_gain; - ac_gain.real = xramp * PARAM(gain) * derivval[0] / xdiff; - ac_gain.imag= 0.0; - AC_GAIN(out, inx) = ac_gain; - ac_gain.real = yramp * PARAM(gain) * derivval[1] / ydiff; - ac_gain.imag= 0.0; - AC_GAIN(out, iny) = ac_gain; - ac_gain.real = zramp * PARAM(gain) * derivval[2] / zdiff; - ac_gain.imag= 0.0; - AC_GAIN(out, iny) = ac_gain; - } -} /* end of function cm_table3D */ - - - -/* This function initializes local data */ -static Table3_Data_t *init_local_data(const char *filename, int interporder) -{ - int xrc = 0; - int ix = 0, /* elements in a row */ - iy = 0, /* number of rows */ - iz = 0; /* number of 2D tables */ - double ***table_data; - double tmp; - FILE *fp = (FILE *) NULL; /* Handle to file */ - char *cFile = (char *) NULL; - char *cThisLine = (char *) NULL; - char *cThisPtr, *cThisLinePtr; - size_t lFileLen; /* Length of file */ - size_t lFileRead; /* Length of file read in */ - int lLineCount; /* Current line number */ - size_t lTotalChar; /* Total characters read */ - int lTableCount; /* Number of tables */ - Table3_Data_t *loc = (Table3_Data_t *) NULL; /* local data */ - - - /* Allocate static storage for *loc */ - if ((loc = (Table3_Data_t *) calloc(1, - sizeof(Table3_Data_t))) == (Table3_Data_t *) NULL) { - cm_message_printf("cannot allocate memory for lookup table."); - xrc = -1; - goto EXITPOINT; - } - - /* Init row and column counts to 0 (actually already were due - * to calloc) */ - loc->ix = loc->iy = loc->iz = 0; - - /* open file */ - fp = fopen_with_path(filename, "r"); - if (!fp) { /* Standard open attempt failed */ - const char * const lbuffer = getenv("NGSPICE_INPUT_DIR"); - if (lbuffer && *lbuffer) { - char * const p = (char *) malloc(strlen(lbuffer) + - strlen(DIR_PATHSEP) + - strlen(filename) + 1); - if (p == (char *) NULL) { - cm_message_printf("cannot allocate buffer to " - "attempt alternate file open."); - xrc = -1; - goto EXITPOINT; - } - (void) sprintf(p, "%s%s%s", - lbuffer, DIR_PATHSEP, filename); - fp = fopen(p, "r"); - free(p); - } - } - - /* Test for valid file pointer */ - if (!fp) { - cm_message_printf("cannot open file %s", filename); - xrc = -1; - goto EXITPOINT; - } - - /* Find the size of the data file */ - { - struct stat st; - if (fstat(fileno(fp), &st)) { - cm_message_printf("cannot get length of file %s", - filename); - xrc = -1; - goto EXITPOINT; - } - /* Copy file length */ - lFileLen = (size_t) st.st_size; - } - - /* create string to hold the whole file */ - cFile = calloc(lFileLen + 1, sizeof(char)); - /* create another string long enough for file manipulation */ - cThisLine = calloc(lFileLen + 1, sizeof(char)); - if (cFile == NULL || cThisLine == NULL) { - cm_message_printf("Insufficient memory to read file %s", - filename); - xrc = -1; - goto EXITPOINT; - } - - /* read whole file into cFile */ - { - /* Number of chars read may be less than lFileLen, because /r are - * skipped by 'fread' when file opened in text mode */ - lFileRead = fread(cFile, sizeof(char), lFileLen, fp); - const int file_error = ferror(fp); - fclose(fp); /* done with file */ - fp = (FILE *) NULL; - if (file_error) { - cm_message_printf("Error reading data file %s", filename); - xrc = -1; - goto EXITPOINT; - } - } - /* Number of chars read may be less than lFileLen, because /r are - * skipped by 'fread' when file opened in text mode */ - cFile[lFileRead] = '\0'; - - cThisPtr = cFile; - cThisLinePtr = cThisLine; - lLineCount = 0L; - lTotalChar = 0L; - - while (*cThisPtr) { /* Read until reaching null char */ - long lIndex = 0L; /* Index into cThisLine array */ - bool isNewline = false; /* Boolean indicating read a CR or LF */ - - while (*cThisPtr) { /* Read until reaching null char */ - if (!isNewline) { /* Haven't read a LF yet */ - if (*cThisPtr == '\n') { /* This char is a LF */ - isNewline = true; /* Set flag */ - } - } - else if (*cThisPtr != '\n') { /* Already found LF */ - break; /* Done with line */ - } - - /* Add char to output and increment */ - cThisLinePtr[lIndex++] = *cThisPtr++; - lTotalChar++; - } - - cThisLinePtr[lIndex] = '\0'; /* Terminate the string */ - lLineCount++; /* Increment the line counter */ - /* continue if comment or empty */ - if (cThisLinePtr[0] == '*' || cThisLinePtr[0] == '\n') { - lLineCount--; /* we count only real lines */ - continue; - } - - if (lLineCount == 1) { - cnv_get_spice_value(cThisLinePtr, &tmp); - loc->ix = ix = (int) tmp; - /* generate row data structure (x) */ - if ((loc->xcol = (double *) calloc((size_t) ix, - sizeof(double))) == (double *) NULL) { - cm_message_printf("Unable to allocate row structure."); - xrc = -1; - goto EXITPOINT; - } - } - else if (lLineCount == 2) { - cnv_get_spice_value(cThisLinePtr, &tmp); - loc->iy = iy = (int) tmp; - /* generate column data structure (y) */ - if ((loc->ycol = (double *) calloc((size_t) iy, - sizeof(double))) == (double *) NULL) { - cm_message_printf("Unable to allocate column structure."); - xrc = -1; - goto EXITPOINT; - } - } - else if (lLineCount == 3) { - cnv_get_spice_value(cThisLinePtr, &tmp); - loc->iz = iz = (int) tmp; - /* generate column data structure (z) */ - if ((loc->zcol = (double *) calloc((size_t) iz, - sizeof(double))) == (double *) NULL) { - cm_message_printf("Unable to allocate \"z\" structure."); - xrc = -1; - goto EXITPOINT; - } - } - else if (lLineCount == 4) { - char *token = CNVgettok(&cThisLinePtr); - int i = 0; - while (token) { - if (i == ix) { - cm_message_printf("Too many numbers in x row."); - xrc = -1; - goto EXITPOINT; - } - cnv_get_spice_value(token, &loc->xcol[i++]); - free(token); - token = CNVgettok(&cThisLinePtr); - } - if (i < ix) { - cm_message_printf("Not enough numbers in x row."); - xrc = -1; - goto EXITPOINT; - } - } - else if (lLineCount == 5) { - char *token = CNVgettok(&cThisLinePtr); - int i = 0; - while (token) { - if (i == iy) { - cm_message_printf("Too many numbers in y row."); - xrc = -1; - goto EXITPOINT; - } - cnv_get_spice_value(token, &loc->ycol[i++]); - free(token); - token = CNVgettok(&cThisLinePtr); - } - if (i < iy) { - cm_message_printf("Not enough numbers in y row."); - xrc = -1; - goto EXITPOINT; - } - } - else if (lLineCount == 6) { - char *token = CNVgettok(&cThisLinePtr); - int i = 0; - while (token) { - if (i == iz) { - cm_message_printf("Too many numbers in z row."); - xrc = -1; - goto EXITPOINT; - } - cnv_get_spice_value(token, &loc->zcol[i++]); - free(token); - token = CNVgettok(&cThisLinePtr); - } - if (i < iz) { - cm_message_printf("Not enough numbers in z row."); - xrc = -1; - goto EXITPOINT; - } - - /* jump out of while loop to read in the table */ - break; - } - } - - /* generate table core */ - /* boundary limits set to param 'order' aren't recognized, - so limit them here */ - if (interporder < 2) { - cm_message_printf("Parameter Order=%d not possible, " - "set to minimum value 2", - interporder); - interporder = 2; - } - /* int order : interpolation order, - int n1, int n2, int n3 : data dimensions */ - if ((loc->newtable = sf_eno3_init( - interporder, ix, iy, iz)) == (sf_eno3) NULL) { - cm_message_printf("eno3 initialization failure."); - xrc = -1; - goto EXITPOINT; - } - - /* create table_data in memory */ - /* data [n3][n2][n1] */ - if ((loc->table = table_data = (double ***) calloc((size_t) iz, - sizeof(double **))) == (double ***) NULL) { - cm_message_printf("Unable to allocate data table."); - xrc = -1; - goto EXITPOINT; - } - - { - int i, j; - for (i = 0; i < iz; i++) { - if ((table_data[i] = (double **) calloc((size_t) iy, - sizeof(double *))) == (double **) NULL) { - cm_message_printf("Unable to allocate data table " - "z=%d", - i); - xrc = -1; - goto EXITPOINT; - } - for (j = 0; j < iy; j++) { - if ((table_data[i][j] = (double *) calloc((size_t) ix, - sizeof(double))) == (double *) NULL) { - cm_message_printf("Unable to allocate data table " - "z=%d y=%d", - i, j); - xrc = -1; - goto EXITPOINT; - } - } - } - } - - - /* continue reading f(x,y,z) values from cFile */ - for (lTableCount = 0; lTableCount < iz; lTableCount++) { - lLineCount = 0; - while (lLineCount < iy) { - char *token; - long int lIndex = 0; /* Index into cThisLine array */ - bool isNewline = 0; - - while (*cThisPtr) { /* Read until reaching null char */ - if (!isNewline) { /* Haven't read a CR or LF yet */ - if (*cThisPtr == '\n') /* This char is LF */ - isNewline = 1; /* Set flag */ - } - - else if (*cThisPtr != '\n') { /* Already found LF */ - break; /* Done with line */ - } - - cThisLinePtr[lIndex++] = *cThisPtr++; /* Add char to output and increment */ - lTotalChar++; - } - - cThisLinePtr[lIndex] = '\0'; /* Terminate the string */ - /* continue if comment or empty */ - if (cThisLinePtr[0] == '*' || cThisLinePtr[0] == '\0') { - if (lTotalChar >= lFileLen) { - cm_message_printf("Not enough data in file %s", - filename); - xrc = -1; - goto EXITPOINT; - } - continue; - } - token = CNVgettok(&cThisLinePtr); - { - int i = 0; - while (token) { - double tmpval; - - if (i == ix) { - cm_message_printf("Too many numbers in y row " - "no. %d of table %d.", - lLineCount, lTableCount); - free(token); - xrc = -1; - goto EXITPOINT; - } - - /* read table core from cFile, fill local static table structure table_data */ - cnv_get_spice_value(token, &tmpval); - - table_data[lTableCount][lLineCount][i++] = tmpval; - - free(token); - token = CNVgettok(&cThisLinePtr); - } - if (i < ix) { - cm_message_printf("Not enough numbers in y row " - "no. %d of table %d.", - lLineCount, lTableCount); - xrc = -1; - goto EXITPOINT; - } - } - lLineCount++; - } - } /* end of loop over characters read from file */ - - /* fill table data into eno3 structure */ - sf_eno3_set(loc->newtable, table_data /* data [n3][n2][n1] */); - -EXITPOINT: - /* free the file and memory allocated */ - if (cFile != (char *) NULL) { - free(cFile); - } - if (cThisLine != (char *) NULL) { - free(cThisLine); - } - if (fp != (FILE *) NULL) { - (void) fclose(fp); - } - - /* On error free any initialization that was started */ - if (xrc != 0) { - if (loc != (Table3_Data_t *) NULL) { - free_local_data(loc); - loc = (Table3_Data_t *) NULL; - } - } - return loc; -} /* end of function init_local_data */ - - - -/* Free memory allocations in Local_Data_t structure */ -static void free_local_data(Table3_Data_t *loc) -{ - if (loc == (Table3_Data_t *) NULL) { - return; - } - - /* Free data table and related values */ - if (loc->table) { - int i, j; - int n_y = loc->iy; - int n_z = loc->iz; - for (i = 0; i < n_z; i++) { - for (j = 0; j < n_y; j++) { - free(loc->table[i][j]); - } - free(loc->table[i]); - } - - free(loc->table); - } - - free(loc->xcol); - free(loc->ycol); - free(loc->zcol); - sf_eno3_close(loc->newtable); - free(loc); -} /* end of function free_local_data */ - - - -/* Finds difference between column values */ -static inline double get_local_diff(int n, double *col, int ind) -{ - if (ind >= n - 1) { - return col[n - 1] - col[n - 2]; - } - if (ind <= 0) { - return col[1] - col[0]; - } - return 0.5 * (col[ind + 1] - col[ind - 1]); -} /* end of function get_local_diff */ - - -/* These includes add functions from extra source code files, - * still using the standard XSPICE procedure of cmpp-ing cfunc.mod - * and then only compiling the resulting *.c file. - */ - -#include "../support/gettokens.c" /* reading tokens */ -#include "../support/interp.c" /* 2D and 3D linear interpolation */ -#include "../mada/alloc.c" /* eno interpolation from madagascar project */ -#include "../mada/eno.c" /* eno interpolation from madagascar project */ -#include "../mada/eno2.c" /* eno interpolation from madagascar project */ -#include "../mada/eno3.c" /* eno interpolation from madagascar project */ diff --git a/src/xspice/icm/table/table3D/ifspec.ifs b/src/xspice/icm/table/table3D/ifspec.ifs deleted file mode 100644 index 977040432..000000000 --- a/src/xspice/icm/table/table3D/ifspec.ifs +++ /dev/null @@ -1,93 +0,0 @@ -/*.......1.........2.........3.........4.........5.........6.........7.........8 -================================================================================ - -------------------------------------------------------------------------- - Copyright 2015 - The ngspice team - All Rights Reserved - GPL - (see COPYING or https://opensource.org/licenses/GPL-2.0) -------------------------------------------------------------------------- - -AUTHORS - - 06 Nov 2015 Holger Vogt - - -SUMMARY - - This file contains the interface specification file for the - 3D table code model. - -===============================================================================*/ - -NAME_TABLE: - -C_Function_Name: cm_table3D -Spice_Model_Name: table3d -Description: "3D table model" - - -PORT_TABLE: - -Port_Name: inx iny inz -Description: "inputx" "inputy" "inputz" -Direction: in in in -Default_Type: v v v -Allowed_Types: [v,vd,i,id,vnam] [v,vd,i,id,vnam] [v,vd,i,id,vnam] -Vector: no no no -Vector_Bounds: - - - -Null_Allowed: no no no - -PORT_TABLE: - -Port_Name: out -Description: "output" -Direction: out -Default_Type: i -Allowed_Types: [v,vd,i,id] -Vector: no -Vector_Bounds: - -Null_Allowed: no - - -PARAMETER_TABLE: - -Parameter_Name: order verbose -Description: "order" "verbose" -Data_Type: int int -Default_Value: 3 0 -Limits: [2 -] [0 2] -Vector: no no -Vector_Bounds: - - -Null_Allowed: yes yes - -PARAMETER_TABLE: - -Parameter_Name: offset gain -Description: "offset" "gain" -Data_Type: real real -Default_Value: 0.0 1.0 -Limits: - - -Vector: no no -Vector_Bounds: - - -Null_Allowed: yes yes - - -PARAMETER_TABLE: - -Parameter_Name: file -Description: "file name" -Data_Type: string -Default_Value: "3D-table-model.txt" -Limits: - -Vector: no -Vector_Bounds: - -Null_Allowed: yes - - -STATIC_VAR_TABLE: - -Static_Var_Name: locdata -Description: "local static data" -Data_Type: pointer diff --git a/src/xspice/icm/table/udnpath.lst b/src/xspice/icm/table/udnpath.lst deleted file mode 100644 index e69de29bb..000000000 diff --git a/src/xspice/icm/xtradev/.gitignore b/src/xspice/icm/xtradev/.gitignore deleted file mode 100644 index b803004ac..000000000 --- a/src/xspice/icm/xtradev/.gitignore +++ /dev/null @@ -1,14 +0,0 @@ -/xtradev.cm - -/cmextrn.h -/cminfo.h -/cminfo2.h -/dlmain.c -/objects.inc -/udnextrn.h -/udninfo.h -/udninfo2.h - -/*/*.c - -!/*/udnfunc.c diff --git a/src/xspice/icm/xtradev/aswitch/cfunc.mod b/src/xspice/icm/xtradev/aswitch/cfunc.mod deleted file mode 100644 index d9143cc1a..000000000 --- a/src/xspice/icm/xtradev/aswitch/cfunc.mod +++ /dev/null @@ -1,198 +0,0 @@ -/*.......1.........2.........3.........4.........5.........6.........7.........8 -================================================================================ - -FILE aswitch/cfunc.mod - -Public Domain - -Georgia Tech Research Corporation -Atlanta, Georgia 30332 -PROJECT A-8503-405 - - -AUTHORS - - 6 June 1991 Jeffrey P. Murray - - -MODIFICATIONS - - 26 Sept 1991 Jeffrey P. Murray - - -SUMMARY - - This file contains the functional description of the aswitch - code model. - - -INTERFACES - - FILE ROUTINE CALLED - - CMmacros.h cm_message_send(); - - -REFERENCED FILES - - Inputs from and outputs to ARGS structure. - - -NON-STANDARD FEATURES - - NONE - -===============================================================================*/ - -/*=== INCLUDE FILES ====================*/ - -#include - - - -/*=== CONSTANTS ========================*/ - - - - -/*=== MACROS ===========================*/ - - - - -/*=== LOCAL VARIABLES & TYPEDEFS =======*/ - - - - -/*=== FUNCTION PROTOTYPE DEFINITIONS ===*/ - - - - - - - -/*============================================================================== - -FUNCTION cm_aswitch() - -AUTHORS - - 6 June 1991 Jeffrey P. Murray - -MODIFICATIONS - - 26 Sept 1991 Jeffrey P. Murray - -SUMMARY - - This function implements the aswitch code model. - -INTERFACES - - FILE ROUTINE CALLED - - CMmacros.h cm_message_send(); - -RETURNED VALUE - - Returns inputs and outputs via ARGS structure. - -GLOBAL VARIABLES - - NONE - -NON-STANDARD FEATURES - - NONE - -==============================================================================*/ - -/*=== CM_ASWITCH ROUTINE ===*/ - - - -void cm_aswitch(ARGS) /* structure holding parms, - inputs, outputs, etc. */ -{ - double cntl_on; /* voltage above which switch come on */ - double cntl_off; /* voltage below the switch has resistance roff */ - double r_on; /* on resistance */ - double r_off; /* off resistance */ - double intermediate; /* intermediate value used to calculate - the resistance of the switch when the - controlling voltage is between cntl_on - and cntl_of */ - double r; /* value of the resistance of the switch */ - double pi_pvout; /* partial of the output wrt input */ - double pi_pcntl; /* partial of the output wrt control input */ - - Mif_Complex_t ac_gain; - - char *cntl_error = "\n*****ERROR*****\nASWITCH: CONTROL voltage delta less than 1.0e-12\n"; - - - /* Retrieve frequently used parameters... */ - - cntl_on = PARAM(cntl_on); - cntl_off = PARAM(cntl_off); - r_on = PARAM(r_on); - r_off = PARAM(r_off); - - if( r_on < 1.0e-3 ) r_on = 1.0e-3; /* Set minimum 'ON' resistance */ - - if( (fabs(cntl_on - cntl_off) < 1.0e-12) ) { - cm_message_send(cntl_error); - return; - } - - if ( PARAM(log) == MIF_TRUE ) { /* Logarithmic Variation in 'R' */ - intermediate = log(r_off / r_on) / (cntl_on - cntl_off); - r = r_on * exp(intermediate * (cntl_on - INPUT(cntl_in))); - - if (PARAM(limit) == MIF_TRUE) { - if(rr_off) r=r_off;/* maximum resistance limiter */ - } - else { - if(r<=1.0e-9) r=1.0e-9;/* minimum resistance limiter */ - } - pi_pvout = 1.0 / r; - pi_pcntl = intermediate * INPUT(out) / r; - } - else { /* Linear Variation in 'R' */ - intermediate = (r_on - r_off) / (cntl_on - cntl_off); - r = INPUT(cntl_in) * intermediate + ((r_off*cntl_on - - r_on*cntl_off) / (cntl_on - cntl_off)); - - if (PARAM(limit) == MIF_TRUE) { - if(rr_off) r=r_off;/* maximum resistance limiter */ - } - else { - if(r<=1.0e-9) r=1.0e-9;/* minimum resistance limiter */ - } - pi_pvout = 1.0 / r; - pi_pcntl = -intermediate * INPUT(out) / (r*r); - } - - if(ANALYSIS != MIF_AC) { /* Output DC & Transient Values */ - OUTPUT(out) = INPUT(out) / r; /* Note that the minus */ - PARTIAL(out,out) = pi_pvout; /* Signs are required */ - PARTIAL(out,cntl_in) = pi_pcntl; /* because current is */ - /* positive flowing INTO */ - /* rather than OUT OF a */ - /* component node. */ - } - else { /* Output AC Gain Values */ - ac_gain.real = -pi_pvout; /* See comment on minus */ - ac_gain.imag= 0.0; /* signs above.... */ - AC_GAIN(out,out) = ac_gain; - - ac_gain.real = -pi_pcntl; - ac_gain.imag= 0.0; - AC_GAIN(out,cntl_in) = ac_gain; - } -} - diff --git a/src/xspice/icm/xtradev/aswitch/ifspec.ifs b/src/xspice/icm/xtradev/aswitch/ifspec.ifs deleted file mode 100644 index 87e8fcb58..000000000 --- a/src/xspice/icm/xtradev/aswitch/ifspec.ifs +++ /dev/null @@ -1,77 +0,0 @@ -/*.......1.........2.........3.........4.........5.........6.........7.........8 -================================================================================ -Public Domain - -Georgia Tech Research Corporation -Atlanta, Georgia 30332 - - -AUTHORS - - 26 Sept 1991 Jeffrey P. Murray - - -SUMMARY - - This file contains the interface specification file for the - analog aswitch code model. - -===============================================================================*/ - -NAME_TABLE: - - -C_Function_Name: cm_aswitch -Spice_Model_Name: aswitch -Description: "analog switch" - - -PORT_TABLE: - - -Port_Name: cntl_in out -Description: "input" "resistive output" -Direction: in inout -Default_Type: v gd -Allowed_Types: [v,vd,i,id,vnam] [gd] -Vector: no no -Vector_Bounds: - - -Null_Allowed: no no - - -PARAMETER_TABLE: - - -Parameter_Name: cntl_off cntl_on -Description: "control 'off' val" "control 'on' val" -Data_Type: real real -Default_Value: 0.0 1.0 -Limits: - - -Vector: no no -Vector_Bounds: - - -Null_Allowed: yes yes - - -PARAMETER_TABLE: - -Parameter_Name: log r_off -Description: "Log-linear switch" "off resistance" -Data_Type: boolean real -Default_Value: TRUE 1.0e12 -Limits: - - -Vector: no no -Vector_Bounds: - - -Null_Allowed: yes yes - - - -PARAMETER_TABLE: - -Parameter_Name: r_on limit -Description: "on resistance" "set upper and lower limits to resistance" -Data_Type: real boolean -Default_Value: 1.0 false -Limits: - - -Vector: no no -Vector_Bounds: - - -Null_Allowed: yes yes diff --git a/src/xspice/icm/xtradev/capacitor/cfunc.mod b/src/xspice/icm/xtradev/capacitor/cfunc.mod deleted file mode 100644 index bdfe885ae..000000000 --- a/src/xspice/icm/xtradev/capacitor/cfunc.mod +++ /dev/null @@ -1,89 +0,0 @@ -/* =========================================================================== -FILE capacitor/cfunc.mod - -MEMBER OF process XSPICE - -Public Domain - -Georgia Tech Research Corporation -Atlanta, Georgia 30332 -PROJECT A-8503 - - -AUTHORS - - 9/12/91 Bill Kuhn - -MODIFICATIONS - - - -SUMMARY - - This file contains the definition of a capacitor code model - with voltage type initial conditions. - -INTERFACES - - cm_capacitor() - -REFERENCED FILES - - None. - -NON-STANDARD FEATURES - - None. - -=========================================================================== */ - - -#define VC 0 - - -void cm_capacitor (ARGS) -{ - Complex_t ac_gain; - double partial; - double ramp_factor; - double *vc; - - - /* Get the ramp factor from the .option ramptime */ - ramp_factor = cm_analog_ramp_factor(); - - /* Initialize/access instance specific storage for capacitor voltage */ - if(INIT) { - cm_analog_alloc(VC, sizeof(double)); - vc = (double *) cm_analog_get_ptr(VC, 0); - *vc = PARAM(ic) * cm_analog_ramp_factor(); - } - else { - vc = (double *) cm_analog_get_ptr(VC, 0); - } - - /* Compute the output */ - if(ANALYSIS == DC) { - OUTPUT(cap) = PARAM(ic) * ramp_factor; - PARTIAL(cap, cap) = 0.0; - } - else if(ANALYSIS == AC) { - ac_gain.real = 0.0; - ac_gain.imag = -1.0 / RAD_FREQ / PARAM(c); - AC_GAIN(cap, cap) = ac_gain; - } - else if(ANALYSIS == TRANSIENT) { - if(ramp_factor < 1.0) { - *vc = PARAM(ic) * ramp_factor; - OUTPUT(cap) = *vc; - PARTIAL(cap, cap) = 0.0; - } - else { - cm_analog_integrate(INPUT(cap) / PARAM(c), vc, &partial); - partial /= PARAM(c); - OUTPUT(cap) = *vc; - PARTIAL(cap, cap) = partial; - } - } -} - diff --git a/src/xspice/icm/xtradev/capacitor/ifspec.ifs b/src/xspice/icm/xtradev/capacitor/ifspec.ifs deleted file mode 100644 index 453296848..000000000 --- a/src/xspice/icm/xtradev/capacitor/ifspec.ifs +++ /dev/null @@ -1,71 +0,0 @@ -/* =========================================================================== -FILE ifspec.ifs - -MEMBER OF process XSPICE - -Public Domain - -Georgia Tech Research Corporation -Atlanta, Georgia 30332 -PROJECT A-8503 - - -AUTHORS - - 9/12/91 Bill Kuhn - -MODIFICATIONS - - - -SUMMARY - - This file contains the definition of a capacitor code model - with voltage type initial conditions. - -INTERFACES - - None. - -REFERENCED FILES - - None. - -NON-STANDARD FEATURES - - None. - -=========================================================================== */ - -NAME_TABLE: - -Spice_Model_Name: capacitoric -C_Function_Name: cm_capacitor -Description: "Capacitor with voltage initial condition" - - -PORT_TABLE: - -Port_Name: cap -Description: "capacitor terminals" -Direction: inout -Default_Type: hd -Allowed_Types: [hd] -Vector: no -Vector_Bounds: - -Null_Allowed: no - - -PARAMETER_TABLE: - -Parameter_Name: c ic -Description: "capacitance" "voltage initial condition" -Data_Type: real real -Default_Value: - 0.0 -Limits: - - -Vector: no no -Vector_Bounds: - - -Null_Allowed: no no - - - diff --git a/src/xspice/icm/xtradev/cmeter/cfunc.mod b/src/xspice/icm/xtradev/cmeter/cfunc.mod deleted file mode 100644 index 44778b727..000000000 --- a/src/xspice/icm/xtradev/cmeter/cfunc.mod +++ /dev/null @@ -1,132 +0,0 @@ -/*.......1.........2.........3.........4.........5.........6.........7.........8 -================================================================================ - -FILE cmeter/cfunc.mod - -Public Domain - -Georgia Tech Research Corporation -Atlanta, Georgia 30332 -PROJECT A-8503-405 - - -AUTHORS - - 30 July 1991 Bill Kuhn - - -MODIFICATIONS - - 26 Sept 1991 Jeffrey P. Murray - - -SUMMARY - - This file contains the functional description of the cmeter - code model. - - -INTERFACES - - FILE ROUTINE CALLED - - CMmeters.c double cm_netlist_get_c() - - - -REFERENCED FILES - - Inputs from and outputs to ARGS structure. - - -NON-STANDARD FEATURES - - NONE - -===============================================================================*/ - -/*=== INCLUDE FILES ====================*/ - - - - -/*=== CONSTANTS ========================*/ - - - - -/*=== MACROS ===========================*/ - - - - -/*=== LOCAL VARIABLES & TYPEDEFS =======*/ - - - - -/*=== FUNCTION PROTOTYPE DEFINITIONS ===*/ - - - - - - - -/*============================================================================== - -FUNCTION cm_cmeter() - -AUTHORS - - 30 July 1991 Bill Kuhn - -MODIFICATIONS - - 26 Sept 1991 Jeffrey P. Murray - -SUMMARY - - This function implements the cmeter code model. - -INTERFACES - - FILE ROUTINE CALLED - - CMmeters.c double cm_netlist_get_c() - -RETURNED VALUE - - Returns inputs and outputs via ARGS structure. - -GLOBAL VARIABLES - - NONE - -NON-STANDARD FEATURES - - NONE - -==============================================================================*/ - -/*=== CM_CMETER ROUTINE ===*/ - -void cm_cmeter (ARGS) -{ - - double ceq; /* holding variable for read capacitance value */ - - if(INIT) { - ceq = cm_netlist_get_c(); - STATIC_VAR(c) = ceq; - } - else - ceq = STATIC_VAR(c); - - OUTPUT(out) = PARAM(gain) * ceq; - -} - - - - diff --git a/src/xspice/icm/xtradev/cmeter/ifspec.ifs b/src/xspice/icm/xtradev/cmeter/ifspec.ifs deleted file mode 100644 index b3da49d4f..000000000 --- a/src/xspice/icm/xtradev/cmeter/ifspec.ifs +++ /dev/null @@ -1,58 +0,0 @@ -/*.......1.........2.........3.........4.........5.........6.........7.........8 -================================================================================ -Public Domain - -Georgia Tech Research Corporation -Atlanta, Georgia 30332 - - -AUTHORS - - 30 July 1991 Bill Kuhn - - -SUMMARY - - This file contains the interface specification file for the - analog cmeter code model. - -===============================================================================*/ - - -NAME_TABLE: - -Spice_Model_Name: cmeter -C_Function_Name: cm_cmeter -Description: "ATESSE 1 compatible capacitance meter" - - -PORT_TABLE: - -Port_Name: in out -Description: "input" "output" -Direction: in out -Default_Type: v v -Allowed_Types: [v, vd] [v, vd, i, id] -Vector: no no -Vector_Bounds: - - -Null_Allowed: no no - - -PARAMETER_TABLE: - -Parameter_Name: gain -Description: "C to voltage conversion factor" -Data_Type: real -Default_Value: 1.0 -Limits: - -Vector: no -Vector_Bounds: - -Null_Allowed: yes - - -STATIC_VAR_TABLE: - -Static_Var_Name: c -Data_Type: real -Description: "capacitance connected to input node" - diff --git a/src/xspice/icm/xtradev/core/cfunc.mod b/src/xspice/icm/xtradev/core/cfunc.mod deleted file mode 100644 index 21ad39487..000000000 --- a/src/xspice/icm/xtradev/core/cfunc.mod +++ /dev/null @@ -1,504 +0,0 @@ -/*.......1.........2.........3.........4.........5.........6.........7.........8 -================================================================================ - -FILE core/cfunc.mod - -Public Domain - -Georgia Tech Research Corporation -Atlanta, Georgia 30332 -PROJECT A-8503-405 - - -AUTHORS - - 24 Apr 1991 Jeffrey P. Murray - - -MODIFICATIONS - - 24 Apr 1991 Jeffrey P. Murray - 26 Sep 1991 Jeffrey P. Murray - - -SUMMARY - - This file contains the functional description of the core - code model. - - -INTERFACES - - FILE ROUTINE CALLED - - CMmacros.h cm_message_send(); - - CMutil.c void cm_smooth_corner(); - - -REFERENCED FILES - - Inputs from and outputs to ARGS structure. - - -NON-STANDARD FEATURES - - NONE - -===============================================================================*/ - -/*=== INCLUDE FILES ====================*/ - -#include - - -/*=== CONSTANTS ========================*/ - -#define HYST 1 -#define X_RISING TRUE -#define X_FALLING FALSE -#define PWL 1 -#define HYSTERESIS 2 - - -/*=== MACROS ===========================*/ - - -/*=== LOCAL VARIABLES & TYPEDEFS =======*/ - - -/*=== FUNCTION PROTOTYPE DEFINITIONS ===*/ - - -/*============================================================================== - -FUNCTION cm_core() - -AUTHORS - - 24 Apr 1991 Jeffrey P. Murray - -MODIFICATIONS - - 24 Apr 1991 Jeffrey P. Murray - 26 Sep 1991 Jeffrey P. Murray - -SUMMARY - - This function implements the core code model. - -INTERFACES - - FILE ROUTINE CALLED - - CMmacros.h cm_message_send(); - - CMutil.c void cm_smooth_corner(); - - -RETURNED VALUE - - Returns inputs and outputs via ARGS structure. - -GLOBAL VARIABLES - - NONE - -NON-STANDARD FEATURES - - NONE - -==============================================================================*/ - -/*=== CM_CORE ROUTINE ===*/ - -/*******************************************************************/ -/* */ -/* CORE Model: */ -/* */ -/* The core model is designed to operate in one of two modes. */ -/* The first of these, and the one most likely to be used by */ -/* the engineer, is a modified version of the pwl model. This */ -/* behavior occurs when the model is in pwl mode (the default). */ -/* If the model is set to hyst mode, its behavior mimics that of */ -/* the hysteresis block. The following provides additional */ -/* detail: */ -/* */ -/* PWL Mode */ -/* */ -/* In pwl mode, the core model is a modified version of the */ -/* PWL model... */ -/* it has a single two-terminal input/output, and accepts as */ -/* input the mmf value, represented by a voltage. Its output is */ -/* a flux value, which is represented as a current. Additional */ -/* inputs include the cross-sectional area of the physical */ -/* core, and the median length of the core, seen from the */ -/* perspective of the flux that traverses it. */ -/* */ -/* The core model in pwl mode DOES NOT include hysteresis... */ -/* current thinking is that such provides */ -/* little benefit to the designer, aside from the ability to */ -/* calculate eddy losses in a modeled device...the nonlinear */ -/* B vs. H behavior, however, is of great importance. */ -/* */ -/* Note that the user must input a piece-wise-linear */ -/* description, in the form of a series of coordinate B vs. H */ -/* values, in order to model a particular core material type. */ -/* Such curves may be found in textbooks, or from manufacturer's */ -/* databooks. In this model, the "x" values are assumed to */ -/* represent the magnetic field (H), and the "y" values are */ -/* assumed to represent the flux density (B). */ -/* */ -/* Hyst Mode */ -/* */ -/* In hyst mode, the core model is a modified version of the */ -/* HYST code model... */ -/* it has a single two-terminal input/output, and accepts as */ -/* input the mmf value, represented by a voltage. Its output is */ -/* a flux value, which is represented as a current. Additional */ -/* inputs include the input high and low values for the */ -/* hysteretic behavior, and the output high and low values. */ -/* Also, a value of hysteresis must be included, as must an */ -/* input_domain value, and a fraction value, which tell the model */ -/* whether to interpret the input_domain as an absolute value */ -/* or as a relative figure. */ -/* */ -/* When the hyst mode is invoked on the core model, the user is */ -/* in the position of having to define reasonable values for the */ -/* upper and lower output limiting values. These can be very */ -/* difficule to nail down accurately. Current thinking is tha */ -/* the hysteresis capability will be of only nominal benefit to */ -/* the engineer, as it will not typically allow for as accurate */ -/* tailoring of the response as is possible in the pwl mode. */ -/* */ -/* 4/24/91 J.P.Murray */ -/* Last modified: 10/24/91 */ -/*******************************************************************/ - -void -cm_core(ARGS) -{ - - /*** The following declarations pertain to PWL mode ***/ - - int i; /* generic loop counter index */ - int size; /* size of the x_array */ - - int mode; /* mode parameter which determines whether - pwl or hyst will be used in analysis. */ - - - double input_domain; /* smoothing range */ - Mif_Value_t *H; /* pointer to the H-field array */ - Mif_Value_t *B; /* pointer to the B-field array */ - double lower_seg; /* x segment below which input resides */ - double upper_seg; /* x segment above which the input resides */ - double lower_slope; /* slope of the lower segment */ - double upper_slope; /* slope of the upper segment */ - double mmf_input; /* input mmf value */ - double H_input; /* calculated input H value */ - double B_out; /* output B value */ - double flux_out; /* calculated output flux */ - double dout_din; /* partial derivative of the output wrt input */ - double threshold_lower; /* value below which the output begins - smoothing */ - double threshold_upper; /* value above which the output begins smoothing */ - double area; /* cross-sectional area of the core (in meters)*/ - double length; /* length of core (in meters) */ - - Mif_Complex_t ac_gain; - - char *limit_error="\n***ERROR***\nCORE: Violation of 50% rule in breakpoints!\n"; - - - /*** The following declarations pertain to HYSTERESIS mode... ***/ - - double - in, /* input to hysteresis block */ - out, /* output from hysteresis block */ - in_low, /* lower input value for hyst=0 at which - the transfer curve changes from constant - to linear */ - in_high, /* upper input value for hyst=0 at which - the transfer curve changes from constant - to linear */ - hyst, /* the hysteresis value (see above diagram) */ - out_lower_limit, /* the minimum output value from the block */ - out_upper_limit, /* the maximum output value from the block */ - slope, /* calculated rise and fall slope for the block */ - pout_pin, /* partial derivative of output w.r.t. input */ - x_rise_linear, /* = in_low + hyst */ - x_rise_zero, /* = in_high + hyst */ - x_fall_linear, /* = in_high - hyst */ - x_fall_zero; /* = in_low - hyst */ - - Boolean_t - *hyst_state, /* TRUE => input is on lower leg of - hysteresis curve, between -infinity - and in_high + hyst. - FALSE => input is on upper leg - of hysteresis curve, between - in_low - hyst and +infinity */ - *old_hyst_state; /* previous value of *hyst_state */ - - /* Retrieve mode parameter... */ - - mode = PARAM(mode); - - - /** Based on mode value, switch to the appropriate model code... **/ - - if (HYSTERESIS != mode) { /******** pwl mode *****************/ - - /* Retrieve frequently used parameters... */ - - input_domain = PARAM(input_domain); - area = PARAM(area); - length = PARAM(length); - - size = PARAM_SIZE(H_array); - - H = (Mif_Value_t*) &PARAM(H_array[0]); - B = (Mif_Value_t*) &PARAM(B_array[0]); - - /* See if input_domain is absolute...if so, test against */ - /* breakpoint segments for violation of 50% rule... */ - if (PARAM(fraction) == MIF_FALSE) - for (i = 0; i < size - 1; i++) - if ((H[i+1].rvalue - H[i].rvalue) < 2.0 * input_domain) { - cm_message_send(limit_error); - return; - } - - /* Retrieve mmf_input value. */ - mmf_input = INPUT(mc); - - /* Calculate H_input value from mmf_input... */ - H_input = mmf_input / length; - - /* Determine segment boundaries within which H_input resides */ - - if (H_input <= (H[1].rvalue + H[0].rvalue) / 2.0) {/*** H_input below lowest midpoint ***/ - - dout_din = (B[1].rvalue - B[0].rvalue) / (H[1].rvalue - H[0].rvalue); - B_out = B[0].rvalue + (H_input - H[0].rvalue) * dout_din; - - } else if (H_input >= (H[size-2].rvalue + H[size-1].rvalue) / 2.0) { - - /*** H_input above highest midpoint ***/ - dout_din = (B[size-1].rvalue - B[size-2].rvalue) / (H[size-1].rvalue - H[size-2].rvalue); - B_out = B[size-1].rvalue + (H_input - H[size-1].rvalue) * dout_din; - - } else { /*** H_input within bounds of end midpoints... ***/ - - /*** must determine position progressively & then ***/ - /*** calculate required output. ***/ - - dout_din = NAN; - B_out = NAN; - - for (i = 1; i < size; i++) - if (H_input < (H[i].rvalue + H[i+1].rvalue) / 2.0) { - /* approximate position known... */ - - lower_seg = (H[i].rvalue - H[i-1].rvalue); - upper_seg = (H[i+1].rvalue - H[i].rvalue); - - /* Calculate input_domain about this region's breakpoint.*/ - - if (PARAM(fraction) == MIF_TRUE) { /* Translate input_domain */ - /* into an absolute.... */ - if (lower_seg <= upper_seg) /* Use lower */ - /* segment */ - /* for % calc.*/ - input_domain = input_domain * lower_seg; - else /* Use upper */ - /* segment */ - /* for % calc.*/ - input_domain = input_domain * upper_seg; - } - - /* Set up threshold values about breakpoint... */ - threshold_lower = H[i].rvalue - input_domain; - threshold_upper = H[i].rvalue + input_domain; - - /* Determine where H_input is within region & determine */ - /* output and partial values.... */ - if (H_input < threshold_lower) { /* Lower linear region */ - - dout_din = (B[i].rvalue - B[i-1].rvalue) / lower_seg; - B_out = B[i].rvalue + (H_input - H[i].rvalue) * dout_din; - - } else if (H_input < threshold_upper) { /* Parabolic region */ - - lower_slope = (B[i].rvalue - B[i-1].rvalue) / lower_seg; - upper_slope = (B[i+1].rvalue - B[i].rvalue) / upper_seg; - cm_smooth_corner(H_input, H[i].rvalue, B[i].rvalue, input_domain, - lower_slope, upper_slope, &B_out, &dout_din); - - } else { /* Upper linear region */ - - dout_din = (B[i+1].rvalue - B[i].rvalue) / upper_seg; - B_out = B[i].rvalue + (H_input - H[i].rvalue) * dout_din; - - } - - break; /* Break search loop...H_input has been found, */ - /* and B_out and dout_din have been assigned. */ - } - } - - /* Calculate value of flux_out... */ - flux_out = B_out * area; - - /* Adjust dout_din value to reflect area and length multipliers... */ - dout_din = dout_din * area / length; - - if (ANALYSIS != MIF_AC) { /* Output DC & Transient Values */ - OUTPUT(mc) = flux_out; - PARTIAL(mc, mc) = dout_din; - } else { /* Output AC Gain */ - ac_gain.real = dout_din; - ac_gain.imag = 0.0; - AC_GAIN(mc, mc) = ac_gain; - } - - } else { /******** hysteresis mode ******************/ - - /** Retrieve frequently used parameters... **/ - - in_low = PARAM(in_low); - in_high = PARAM(in_high); - hyst = PARAM(hyst); - out_lower_limit = PARAM(out_lower_limit); - out_upper_limit = PARAM(out_upper_limit); - input_domain = PARAM(input_domain); - - /** Calculate Hysteresis Linear Region Slopes & Derived Values **/ - - /* Define slope of rise and fall lines when not being smoothed */ - - slope = (out_upper_limit - out_lower_limit) / (in_high - in_low); - - x_rise_linear = in_low + hyst; /* Breakpoint - x rising to - linear region */ - x_rise_zero = in_high + hyst; /* Breakpoint - x rising to - zero-slope (out_upper_limit) */ - x_fall_linear = in_high - hyst; /* Breakpoint - x falling to - linear region */ - x_fall_zero = in_low - hyst; /* Breakpoint - x falling to - zero-slope (out_lower_limit) */ - - /* Set range to absolute value */ - if (PARAM(fraction) == MIF_TRUE) - input_domain = input_domain * (in_high - in_low); - - /** Retrieve frequently used inputs... **/ - - in = INPUT(mc); - - /** Test for INIT; if so, allocate storage, otherwise, retrieve - previous timepoint value for output... **/ - - /* First pass...allocate storage for previous state. */ - /* Also, calculate roughly where the current output */ - /* will be and use this value to define current state. */ - if (INIT == 1) { - - cm_analog_alloc(TRUE, sizeof(Boolean_t)); - - hyst_state = (Boolean_t *) cm_analog_get_ptr(TRUE, 0); - old_hyst_state = (Boolean_t *) cm_analog_get_ptr(TRUE, 1); - - if (in < x_rise_zero + input_domain) /* Set state to X_RISING */ - *old_hyst_state = X_RISING; - else - *old_hyst_state = X_FALLING; - - } else { /* Allocation not necessary...retrieve previous values */ - - hyst_state = (Boolean_t *) cm_analog_get_ptr(TRUE, 0); /* Set out pointer to current - time storage */ - old_hyst_state = (Boolean_t *) cm_analog_get_ptr(TRUE, 1); /* Set old-output-state pointer - to previous time storage */ - } - - /** Set *hyst_out = *old_hyst_out, unless changed below... - we don't need the last iteration value of *hyst_state. **/ - - *hyst_state = *old_hyst_state; - - /*** Calculate value of hyst_state, pout_pin.... ***/ - - if (*old_hyst_state == X_RISING) { /* Assume calculations on lower */ - /* hysteresis section (x rising) */ - - if (in <= x_rise_linear - input_domain) { /* Output @ lower limit */ - - out = out_lower_limit; - pout_pin = 0.0; - - } else if (in <= x_rise_linear + input_domain) { /* lower smoothing region */ - - cm_smooth_corner(in, x_rise_linear, out_lower_limit, input_domain, - 0.0, slope, &out, &pout_pin); - - } else if (in <= x_rise_zero - input_domain) { /* Rising linear region */ - - out = (in - x_rise_linear)*slope + out_lower_limit; - pout_pin = slope; - - } else if (in <= x_rise_zero + input_domain) { /* Upper smoothing region */ - - cm_smooth_corner(in, x_rise_zero, out_upper_limit, input_domain, - slope, 0.0, &out, &pout_pin); - - } else { /* input has transitioned to X_FALLING region... */ - - out = out_upper_limit; - pout_pin = 0.0; - *hyst_state = X_FALLING; - - } - - } else { /* Assume calculations on upper hysteresis section (x falling) */ - - if ( in >= x_fall_linear + input_domain ) { /* Output @ upper limit */ - - out = out_upper_limit; - pout_pin = 0.0; - - } else if ( in >= x_fall_linear - input_domain ) { /* Upper smoothing region */ - - cm_smooth_corner(in, x_fall_linear, out_upper_limit, input_domain, - slope, 0.0, &out, &pout_pin); - - } else if (in >= x_fall_zero + input_domain) { /* Falling linear region */ - - out = (in - x_fall_zero)*slope + out_lower_limit; - pout_pin = slope; - - } else if (in >= x_fall_zero - input_domain) { /* Lower smoothing region */ - - cm_smooth_corner(in, x_fall_zero, out_lower_limit, input_domain, - 0.0, slope, &out, &pout_pin); - - } else { /* input has transitioned to X_RISING region... */ - - out = out_lower_limit; - pout_pin = 0.0; - *hyst_state = X_RISING; - - } - } - - if (ANALYSIS != MIF_AC) { /* DC & Transient Analyses */ - OUTPUT(mc) = out; - PARTIAL(mc, mc) = pout_pin; - } else { /* AC Analysis */ - ac_gain.real = pout_pin; - ac_gain.imag = 0.0; - AC_GAIN(mc, mc) = ac_gain; - } - } -} diff --git a/src/xspice/icm/xtradev/core/ifspec.ifs b/src/xspice/icm/xtradev/core/ifspec.ifs deleted file mode 100644 index 30acbd035..000000000 --- a/src/xspice/icm/xtradev/core/ifspec.ifs +++ /dev/null @@ -1,135 +0,0 @@ -/*.......1.........2.........3.........4.........5.........6.........7.........8 -================================================================================ -Public Domain - -Georgia Tech Research Corporation -Atlanta, Georgia 30332 - - -AUTHORS - - 27 Sept 1991 Jeffrey P. Murray - - -SUMMARY - - This file contains the interface specification file for the - analog core code model. - -===============================================================================*/ - -NAME_TABLE: - - -C_Function_Name: cm_core -Spice_Model_Name: core -Description: "magnetic core" - - -PORT_TABLE: - - -Port_Name: mc -Description: "magnetic core" -Direction: inout -Default_Type: gd -Allowed_Types: [g,gd] -Vector: no -Vector_Bounds: - -Null_Allowed: no - -PARAMETER_TABLE: - -Parameter_Name: h_array b_array -Description: "magnetic field array" "flux density array" -Data_Type: real real -Default_Value: - - -Limits: - - -Vector: yes yes -Vector_Bounds: [2 -] [2 -] -Null_Allowed: no no - - -PARAMETER_TABLE: - -Parameter_Name: area length -Description: "cross-sectional area" "core length" -Data_Type: real real -Default_Value: - - -Limits: - - -Vector: no no -Vector_Bounds: - - -Null_Allowed: no no - - -PARAMETER_TABLE: - -Parameter_Name: input_domain -Description: "input sm. domain" -Data_Type: real -Default_Value: 0.01 -Limits: [1e-12 0.5] -Vector: no -Vector_Bounds: - -Null_Allowed: yes - - -PARAMETER_TABLE: - -Parameter_Name: fraction -Description: "smoothing fractional/abs switch" -Data_Type: boolean -Default_Value: TRUE -Limits: - -Vector: no -Vector_Bounds: - -Null_Allowed: yes - - -PARAMETER_TABLE: - -Parameter_Name: mode -Description: "mode switch (1 = pwl, 2 = hyst)" -Data_Type: int -Default_Value: 1 -Limits: [1 2] -Vector: no -Vector_Bounds: - -Null_Allowed: yes - - -PARAMETER_TABLE: - -Parameter_Name: in_low in_high -Description: "input low value" "input high value" -Data_Type: real real -Default_Value: 0.0 1.0 -Limits: - - -Vector: no no -Vector_Bounds: - - -Null_Allowed: yes yes - - -PARAMETER_TABLE: - -Parameter_Name: hyst out_lower_limit -Description: "hysteresis" "output lower limit" -Data_Type: real real -Default_Value: 0.1 0.0 -Limits: [0 -] - -Vector: no no -Vector_Bounds: - - -Null_Allowed: yes yes - - -PARAMETER_TABLE: - -Parameter_Name: out_upper_limit -Description: "output upper limit" -Data_Type: real -Default_Value: 1.0 -Limits: - -Vector: no -Vector_Bounds: - -Null_Allowed: yes - diff --git a/src/xspice/icm/xtradev/inductor/cfunc.mod b/src/xspice/icm/xtradev/inductor/cfunc.mod deleted file mode 100644 index 8ad1b0cfb..000000000 --- a/src/xspice/icm/xtradev/inductor/cfunc.mod +++ /dev/null @@ -1,87 +0,0 @@ -/* =========================================================================== -FILE cfunc.mod - -MEMBER OF process XSPICE - -Public Domain - -Georgia Tech Research Corporation -Atlanta, Georgia 30332 -PROJECT A-8503 - -AUTHORS - - 9/12/91 Bill Kuhn - -MODIFICATIONS - - - -SUMMARY - - This file contains the definition of an inductor code model - with current initial conditions. - -INTERFACES - - cm_inductor() - -REFERENCED FILES - - None. - -NON-STANDARD FEATURES - - None. - -=========================================================================== */ - - -#define LI 0 - - -void cm_inductor (ARGS) -{ - Complex_t ac_gain; - double partial; - double ramp_factor; - double *li; - - /* Get the ramp factor from the .option ramptime */ - ramp_factor = cm_analog_ramp_factor(); - - /* Initialize/access instance specific storage for capacitor voltage */ - if(INIT) { - cm_analog_alloc(LI, sizeof(double)); - li = (double *) cm_analog_get_ptr(LI, 0); - *li = PARAM(ic) * ramp_factor; - } - else { - li = (double *) cm_analog_get_ptr(LI, 0); - } - - /* Compute the output */ - if(ANALYSIS == DC) { - OUTPUT(ind) = PARAM(ic) * ramp_factor; - PARTIAL(ind, ind) = 0.0; - } - else if(ANALYSIS == AC) { - ac_gain.real = 0.0; - ac_gain.imag = 1.0 * RAD_FREQ * PARAM(l); - AC_GAIN(ind, ind) = ac_gain; - } - else if(ANALYSIS == TRANSIENT) { - if(ramp_factor < 1.0) { - *li = PARAM(ic) * ramp_factor; - OUTPUT(ind) = *li; - PARTIAL(ind, ind) = 0.0; - } - else { - cm_analog_integrate(INPUT(ind) / PARAM(l), li, &partial); - partial /= PARAM(l); - OUTPUT(ind) = *li; - PARTIAL(ind, ind) = partial; - } - } -} - diff --git a/src/xspice/icm/xtradev/inductor/ifspec.ifs b/src/xspice/icm/xtradev/inductor/ifspec.ifs deleted file mode 100644 index 05ea7cf91..000000000 --- a/src/xspice/icm/xtradev/inductor/ifspec.ifs +++ /dev/null @@ -1,70 +0,0 @@ -/* =========================================================================== -FILE ifspec.ifs - -MEMBER OF process XSPICE - -Copyright 1991 -Georgia Tech Research Corporation -Atlanta, Georgia 30332 -All Rights Reserved - -PROJECT A-8503 - -AUTHORS - - 9/12/91 Bill Kuhn - -MODIFICATIONS - - - -SUMMARY - - This file contains the definition of an inductor code model - with current initial conditions. - -INTERFACES - - None. - -REFERENCED FILES - - None. - -NON-STANDARD FEATURES - - None. - -=========================================================================== */ - -NAME_TABLE: - -Spice_Model_Name: inductoric -C_Function_Name: cm_inductor -Description: "Inductor with current initial condition" - - -PORT_TABLE: - -Port_Name: ind -Description: "inductor terminals" -Direction: inout -Default_Type: gd -Allowed_Types: [gd] -Vector: no -Vector_Bounds: - -Null_Allowed: no - - -PARAMETER_TABLE: - -Parameter_Name: l ic -Description: "inductance" "current initial condition" -Data_Type: real real -Default_Value: - 0.0 -Limits: - - -Vector: no no -Vector_Bounds: - - -Null_Allowed: no no - - diff --git a/src/xspice/icm/xtradev/lcouple/cfunc.mod b/src/xspice/icm/xtradev/lcouple/cfunc.mod deleted file mode 100644 index 86b104b02..000000000 --- a/src/xspice/icm/xtradev/lcouple/cfunc.mod +++ /dev/null @@ -1,236 +0,0 @@ -/*.......1.........2.........3.........4.........5.........6.........7.........8 -================================================================================ - -FILE lcouple/cfunc.mod - -Public Domain - -Georgia Tech Research Corporation -Atlanta, Georgia 30332 -PROJECT A-8503-405 - - -AUTHORS - - 6 Jun 1991 Jeffrey P. Murray - - -MODIFICATIONS - - 13 Sep 1991 Jeffrey P. Murray - 2 Oct 1991 Jeffrey P. Murray - - -SUMMARY - - This file contains the model-specific routines used to - functionally describe the lcouple code model. - - -INTERFACES - - FILE ROUTINE CALLED - - CM.c void *cm_analog_alloc() - void *cm_analog_get_ptr() - int cm_analog_integrate() - - -REFERENCED FILES - - Inputs from and outputs to ARGS structure. - - -NON-STANDARD FEATURES - - NONE - -===============================================================================*/ - -/*=== INCLUDE FILES ====================*/ - - - - -/*=== CONSTANTS ========================*/ - - - - -/*=== MACROS ===========================*/ - - - - -/*=== LOCAL VARIABLES & TYPEDEFS =======*/ - - - - -/*=== FUNCTION PROTOTYPE DEFINITIONS ===*/ - - - - - -/*============================================================================== - -FUNCTION void cm_lcouple() - -AUTHORS - - 6 Jun 1991 Jeffrey P. Murray - -MODIFICATIONS - - 13 Sep 1991 Jeffrey P. Murray - 2 Oct 1991 Jeffrey P. Murray - -SUMMARY - - This function implements the lcouple code model. - -INTERFACES - - FILE ROUTINE CALLED - - CM.c void *cm_analog_alloc() - void *cm_analog_get_ptr() - int cm_analog_integrate() - -RETURNED VALUE - - Returns inputs and outputs via ARGS structure. - -GLOBAL VARIABLES - - NONE - -NON-STANDARD FEATURES - - NONE - -==============================================================================*/ - -/*=== CM_LCOUPLE ROUTINE ===*/ - -/*********************************************** -* Note that this model incorporates a fake * -* integration in order to link in truncation * -* error checking...this may be removed at a * -* future date. JPM 9/13/91 * -***********************************************/ - - - -void cm_lcouple(ARGS) /* structure holding parms, - inputs, outputs, etc. */ -{ - double input_current, /* input current from electrical-side windings */ - output_voltage, /* output voltage reflected to electricaL-side */ - *output_voltage_fake, /* fake output voltage for use with - truncation error checking. */ - /*input_flux,*/ /* input flux value from core side (represented - as a current. */ - output_mmf, /* output driving amp-turns to core side. */ - - num_turns, /* number of turns on inductor */ - /*pout_pin_fake,*/ /* fake partial derivative of output - w.r.t. input (for use with integration */ - *in_flux, /* current input flux value from core side - (represented as a current). */ - *in_flux_old, /* previous timestep flux value */ - *in_flux_fake, /* fake input flux value for use with - truncation error checking. */ - delta; /* time delta from previous timepoint to - current value */ - - - Mif_Complex_t ac_gain; /* AC gain */ - - /** Retrieve frequently used parameters... **/ - - num_turns = PARAM(num_turns); - - if (ANALYSIS != MIF_AC) { /**** DC & Transient Analyses ****/ - - /** Test for INIT; if so, allocate storage, otherwise, retrieve - previous timepoint input value... **/ - - if (INIT==1) { /* First pass...allocate storage for previous state. */ - /* Also, calculate roughly where the current output */ - /* will be and use this value to define current state. */ - - cm_analog_alloc(1,sizeof(double)); - cm_analog_alloc(2,sizeof(double)); - cm_analog_alloc(3,sizeof(double)); - } - /* Allocation not necessary...retrieve previous values */ - - in_flux = (double *) cm_analog_get_ptr(1,0); /* Set out pointer to current - time storage */ - in_flux_old = (double *) cm_analog_get_ptr(1,1); /* Set old-output-state pointer - to previous time storage */ - - /* retrieve fake input and output values for truncation - error checking */ - in_flux_fake = (double *) cm_analog_get_ptr(2,0); - output_voltage_fake = (double *) cm_analog_get_ptr(3,0); - - /** Retrieve inputs... **/ - - input_current = INPUT(l); /* input from electrical side is a current */ - *in_flux = -INPUT(mmf_out); /* input from core side is a flux - represented as a current...note - that a negative is introduced, - because current INTO the positive - node would normally result in - a NEGATIVE output_voltage... - the minus sign corrects this. */ - - - /** Calculate output value for mmf... **/ - - output_mmf = num_turns * input_current; - - OUTPUT(mmf_out) = output_mmf; - PARTIAL(mmf_out,l) = num_turns; - - - /** Calculate output value for output_voltage... **/ - - if ( 0.0 == TIME ) { /*** Test to see if this is the first ***/ - /*** timepoint calculation...if ***/ - *in_flux_old = *in_flux; /*** so, return a zero d/dt value. ***/ - output_voltage = *output_voltage_fake = 0.0; - - OUTPUT(l) = output_voltage; - PARTIAL(l,mmf_out) = 0.0; - } - else { /*** Calculate value of d_dt.... ***/ - delta = TIME - T(1); - output_voltage = *output_voltage_fake = - num_turns * (*in_flux - *in_flux_old) / delta; - OUTPUT(l) = output_voltage; - PARTIAL(l,mmf_out) = -num_turns / delta; - - /* add fake cm_analog_integrate for truncation error checks */ - /* not initialized, not used */ - /*cm_analog_integrate(*output_voltage_fake,in_flux_fake,&pout_pin_fake); */ - } - } - - else { /**** AC Analysis...****/ - ac_gain.real = 0.0; - ac_gain.imag= num_turns * RAD_FREQ; - AC_GAIN(l,mmf_out) = ac_gain; - - ac_gain.real= num_turns; - ac_gain.imag= 0.0; - AC_GAIN(mmf_out,l) = ac_gain; - } -} - - - - diff --git a/src/xspice/icm/xtradev/lcouple/ifspec.ifs b/src/xspice/icm/xtradev/lcouple/ifspec.ifs deleted file mode 100644 index d90d007b8..000000000 --- a/src/xspice/icm/xtradev/lcouple/ifspec.ifs +++ /dev/null @@ -1,55 +0,0 @@ -/*.......1.........2.........3.........4.........5.........6.........7.........8 -================================================================================ -Public Domain - -Georgia Tech Research Corporation -Atlanta, Georgia 30332 - - -AUTHORS - - 2 Oct 1991 Jeffrey P. Murray - - -SUMMARY - - This file contains the interface specification file for the - analog lcouple code model. - -===============================================================================*/ - -NAME_TABLE: - - -C_Function_Name: cm_lcouple -Spice_Model_Name: lcouple -Description: "inductive coupling (for use with 'core' model)" - - -PORT_TABLE: - - -Port_Name: l mmf_out -Description: "inductor" "mmf output (in Ampere-turns)" -Direction: inout inout -Default_Type: hd hd -Allowed_Types: [h,hd] [hd] -Vector: no no -Vector_Bounds: - - -Null_Allowed: no no - - - -PARAMETER_TABLE: - - -Parameter_Name: num_turns -Description: "number of inductor turns" -Data_Type: real -Default_Value: 1.0 -Limits: - -Vector: no -Vector_Bounds: - -Null_Allowed: yes - - diff --git a/src/xspice/icm/xtradev/lmeter/cfunc.mod b/src/xspice/icm/xtradev/lmeter/cfunc.mod deleted file mode 100644 index 8b8627a68..000000000 --- a/src/xspice/icm/xtradev/lmeter/cfunc.mod +++ /dev/null @@ -1,132 +0,0 @@ -/*.......1.........2.........3.........4.........5.........6.........7.........8 -================================================================================ - -FILE lmeter/cfunc.mod - -Public Domain - -Georgia Tech Research Corporation -Atlanta, Georgia 30332 -PROJECT A-8503-405 - - -AUTHORS - - 30 Jul 1991 Bill Kuhn - - -MODIFICATIONS - - 2 Oct 1991 Jeffrey P. Murray - - -SUMMARY - - This file contains the model-specific routines used to - functionally describe the lmeter code model. - - -INTERFACES - - FILE ROUTINE CALLED - - CMmeters.c double cm_netlist_get_l() - - - -REFERENCED FILES - - Inputs from and outputs to ARGS structure. - - -NON-STANDARD FEATURES - - NONE - -===============================================================================*/ - -/*=== INCLUDE FILES ====================*/ - - - - -/*=== CONSTANTS ========================*/ - - - - -/*=== MACROS ===========================*/ - - - - -/*=== LOCAL VARIABLES & TYPEDEFS =======*/ - - - - -/*=== FUNCTION PROTOTYPE DEFINITIONS ===*/ - - - - - -/*============================================================================== - -FUNCTION void cm_lmeter() - -AUTHORS - - 30 Jul 1991 Bill Kuhn - - -MODIFICATIONS - - 2 Oct 1991 Jeffrey P. Murray - -SUMMARY - - This function implements the lmeter code model. - -INTERFACES - - FILE ROUTINE CALLED - - CMmeters.c double cm_netlist_get_l() - - -RETURNED VALUE - - Returns inputs and outputs via ARGS structure. - -GLOBAL VARIABLES - - NONE - -NON-STANDARD FEATURES - - NONE - -==============================================================================*/ - -/*=== CM_LMETER ROUTINE ===*/ - - -void cm_lmeter (ARGS) -{ - - double leq; - - if(INIT) { - leq = cm_netlist_get_l(); - STATIC_VAR(l) = leq; - } - else - leq = STATIC_VAR(l); - - OUTPUT(out) = PARAM(gain) * leq; -} - - - - diff --git a/src/xspice/icm/xtradev/lmeter/ifspec.ifs b/src/xspice/icm/xtradev/lmeter/ifspec.ifs deleted file mode 100644 index 4ffb76817..000000000 --- a/src/xspice/icm/xtradev/lmeter/ifspec.ifs +++ /dev/null @@ -1,57 +0,0 @@ -/*.......1.........2.........3.........4.........5.........6.........7.........8 -================================================================================ -Public Domain - -Georgia Tech Research Corporation -Atlanta, Georgia 30332 - - -AUTHORS - - 302 Jul 1991 Bill Kuhn - - -SUMMARY - - This file contains the interface specification file for the - analog lmeter code model. - -===============================================================================*/ - -NAME_TABLE: - -Spice_Model_Name: lmeter -C_Function_Name: cm_lmeter -Description: "ATESSE 1 compatible inductance meter" - - -PORT_TABLE: - -Port_Name: in out -Description: "input" "output" -Direction: in out -Default_Type: v v -Allowed_Types: [v, vd] [v, vd, i, id] -Vector: no no -Vector_Bounds: - - -Null_Allowed: no no - - -PARAMETER_TABLE: - -Parameter_Name: gain -Description: "L to voltage conversion factor" -Data_Type: real -Default_Value: 1.0 -Limits: - -Vector: no -Vector_Bounds: - -Null_Allowed: yes - - -STATIC_VAR_TABLE: - -Static_Var_Name: l -Data_Type: real -Description: "inductance connected to input node" - diff --git a/src/xspice/icm/xtradev/memristor/cfunc.mod b/src/xspice/icm/xtradev/memristor/cfunc.mod deleted file mode 100644 index f04990097..000000000 --- a/src/xspice/icm/xtradev/memristor/cfunc.mod +++ /dev/null @@ -1,118 +0,0 @@ -/* =========================================================================== -FILE memristor/cfunc.mod - -MEMBER OF process XSPICE - -------------------------------------------------------------------------- - Copyright 2012 - The ngspice team - All Rights Reserved - 3 - Clause BSD license - (see COPYING or https://opensource.org/licenses/BSD-3-Clause) -------------------------------------------------------------------------- - - -AUTHORS - - 6/08/2012 Holger Vogt - -MODIFICATIONS - - - -SUMMARY - - This file contains the definition of a memristor code model - with threshold according to - Y. V. Pershin, M. Di Ventra: "SPICE model of memristive devices with threshold", - arXiv:1204.2600v1 [physics.comp-ph] 12 Apr 2012, - http://arxiv.org/pdf/1204.2600.pdf. - - ** Experimental, still to be tested in circuits !! ** - - dc and ac simulation just return rinit. - -INTERFACES - - cm_memristor() - -REFERENCED FILES - - None. - -NON-STANDARD FEATURES - - None. - -=========================================================================== */ - -/*=== INCLUDE FILES ====================*/ - -#include - - -#define RV 0 - -/* model parameters */ -double alpha, beta, vt; -/* forward of window function */ -double f1(double y); - -void cm_memristor (ARGS) -{ - Complex_t ac_gain; - double partial; - double int_value; - double *rval; - double inpdiff; - - /* get the parameters */ - alpha = PARAM(alpha); - beta = PARAM(beta); - vt = PARAM(vt); - - /* Initialize/access instance specific storage for resistance value */ - if(INIT) { - cm_analog_alloc(RV, sizeof(double)); - rval = (double *) cm_analog_get_ptr(RV, 0); - *rval = PARAM(rinit); - } - else { - rval = (double *) cm_analog_get_ptr(RV, 0); - } - - /* Compute the output */ - if(ANALYSIS == TRANSIENT) { - /* input the voltage across the terminals */ - inpdiff = f1(INPUT(memris)); - if ((inpdiff > 0) && (*rval < PARAM(rmax))) - int_value = inpdiff; - else if ((inpdiff < 0) && (*rval > PARAM(rmin))) - int_value = inpdiff; - else - int_value = 0.0; - /* integrate the new resistance */ - cm_analog_integrate(int_value, rval, &partial); - /* output the current */ - OUTPUT(memris) = INPUT(memris) / *rval; - /* This does work, but is questionable */ - PARTIAL(memris, memris) = partial; - /* This may be a (safe?) replacement, but in fact is not - so good at high voltage (at strong non-linearity) - cm_analog_auto_partial();*/ - } - else if(ANALYSIS == AC) { - ac_gain.real = 1/ *rval; - ac_gain.imag = 0.0; - AC_GAIN(memris, memris) = ac_gain; - } - else - OUTPUT(memris) = INPUT(memris) / *rval; -} - -/* the window function */ -double f1(double y) { - return (beta*y+0.5*(alpha-beta)*(fabs(y+vt)-fabs(y-vt))); -} - - diff --git a/src/xspice/icm/xtradev/memristor/ifspec.ifs b/src/xspice/icm/xtradev/memristor/ifspec.ifs deleted file mode 100644 index 7080d7e87..000000000 --- a/src/xspice/icm/xtradev/memristor/ifspec.ifs +++ /dev/null @@ -1,89 +0,0 @@ -/* =========================================================================== -FILE ifspec.ifs - -MEMBER OF process XSPICE - -/* ---------------------------------------------------------------------- - Copyright 2012 - The ngspice team - All Rights Reserved - 3 - Clause BSD license - (see COPYING or https://opensource.org/licenses/BSD-3-Clause) -------------------------------------------------------------------------- - - - -AUTHORS - - 06/08/2012 Holger Vogt - -MODIFICATIONS - - - -SUMMARY - - This file contains the definition of a memristor code model - with threshold according to - Y. V. Pershin, M. Di Ventra: "SPICE model of memristive devices with threshold", - arXiv:1204.2600v1 [physics.comp-ph] 12 Apr 2012, - http://arxiv.org/pdf/1204.2600.pdf. - - ** Experimental, still to be tested in circuits !! ** - -INTERFACES - - None. - -REFERENCED FILES - - None. - -NON-STANDARD FEATURES - - None. - -=========================================================================== */ - -NAME_TABLE: - -Spice_Model_Name: memristor -C_Function_Name: cm_memristor -Description: "Memristor interface" - - -PORT_TABLE: - -Port_Name: memris -Description: "memristor terminals" -Direction: inout -Default_Type: gd -Allowed_Types: [gd] -Vector: no -Vector_Bounds: - -Null_Allowed: no - - -PARAMETER_TABLE: - -Parameter_Name: rmin rmax rinit -Description: "minimum resistance" "maximum resistance" "initial resistance" -Data_Type: real real real -Default_Value: 10.0 10000.0 7000.0 -Limits: - - - -Vector: no no no -Vector_Bounds: - - - -Null_Allowed: no no no - -PARAMETER_TABLE: - -Parameter_Name: alpha beta vt -Description: "model parameter 1" "model parameter 2" "threshold" -Data_Type: real real real -Default_Value: 0.0 1.0 0.0 -Limits: - - - -Vector: no no no -Vector_Bounds: - - - -Null_Allowed: no no no - - diff --git a/src/xspice/icm/xtradev/modpath.lst b/src/xspice/icm/xtradev/modpath.lst deleted file mode 100644 index ec7a2f87f..000000000 --- a/src/xspice/icm/xtradev/modpath.lst +++ /dev/null @@ -1,12 +0,0 @@ -aswitch -capacitor -cmeter -core -inductor -lcouple -lmeter -potentiometer -zener -memristor -sidiode -pswitch diff --git a/src/xspice/icm/xtradev/potentiometer/cfunc.mod b/src/xspice/icm/xtradev/potentiometer/cfunc.mod deleted file mode 100644 index 8b9448c2d..000000000 --- a/src/xspice/icm/xtradev/potentiometer/cfunc.mod +++ /dev/null @@ -1,230 +0,0 @@ -/*.......1.........2.........3.........4.........5.........6.........7.........8 -================================================================================ - -FILE potentiometer/cfunc.mod - -Public Domain - -Georgia Tech Research Corporation -Atlanta, Georgia 30332 -PROJECT A-8503-405 - - -AUTHORS - - 19 June 1992 Jeffrey P. Murray - - -MODIFICATIONS - - 19 June 1992 Jeffrey P. Murray - 22 October 2022 Holger Vogt - - -SUMMARY - - This file contains the functional description of the potentiometer - code model. - - -INTERFACES - - FILE ROUTINE CALLED - - CMmacros.h cm_message_send(); - - -REFERENCED FILES - - Inputs from and outputs to ARGS structure. - - -NON-STANDARD FEATURES - - NONE - -===============================================================================*/ - -/*=== INCLUDE FILES ====================*/ - -#include - - - -/*=== CONSTANTS ========================*/ - - - - -/*=== MACROS ===========================*/ - - - - -/*=== LOCAL VARIABLES & TYPEDEFS =======*/ - - - - -/*=== FUNCTION PROTOTYPE DEFINITIONS ===*/ - - - - - - - -/*============================================================================== - -FUNCTION cm_potentiometer() - -AUTHORS - - 19 June 1992 Jeffrey P. Murray - -MODIFICATIONS - - 19 June 1992 Jeffrey P. Murray - -SUMMARY - - This function implements the potentiometer code model. - -INTERFACES - - FILE ROUTINE CALLED - - CMmacros.h cm_message_send(); - -RETURNED VALUE - - Returns inputs and outputs via ARGS structure. - -GLOBAL VARIABLES - - NONE - -NON-STANDARD FEATURES - - NONE - -==============================================================================*/ - -/*=== CM_POTENTIOMETER ROUTINE ===*/ - - -void cm_potentiometer (ARGS) -{ - double position; /* position of wiper contact */ - double resistance; /* total resistance */ - double r_lower; /* resistance from r0 to wiper */ - double r_upper; /* resistance from wiper to r1 */ - double vr0; /* voltage at r0 */ - double vr1; /* voltage at r1 */ - double vwiper; /* voltage at wiper */ - - - - Mif_Complex_t ac_gain; - - - - /* Retrieve frequently used parameters... */ - - position = PARAM(position); - - /* guard against 0 or 1 - FIXME: checking the parameter limits is not yet implemented */ - if (position <= 0) - position = 1e-9; - else if (position >= 1) - position = 0.999999999; - - resistance = PARAM(r); - - /* Retrieve input voltages... */ - vr0 = INPUT(r0); - vwiper = INPUT(wiper); - vr1 = INPUT(r1); - - - if ( PARAM(log) == FALSE ) { - - /* Linear Variation in resistance w.r.t. position */ - r_lower = position * resistance; - r_upper = resistance - r_lower; - - } - else { - - /* Logarithmic Variation in resistance w.r.t. position */ - r_lower = resistance / - pow(10.0,(position * PARAM(log_multiplier))); - r_upper = resistance - r_lower; - - } - - - - - - /* Output DC & Transient Values */ - - if(ANALYSIS != MIF_AC) { - OUTPUT(r0) = (vr0 - vwiper) / r_lower; - OUTPUT(r1) = (vr1 - vwiper) / r_upper; - OUTPUT(wiper) = ((vwiper - vr0)/r_lower) + ((vwiper - vr1)/r_upper); - - PARTIAL(r0,r0) = 1.0 / r_lower; - PARTIAL(r0,r1) = 0.0; - PARTIAL(r0,wiper) = -1.0 / r_lower; - - PARTIAL(r1,r0) = 0.0; - PARTIAL(r1,r1) = 1.0 / r_upper; - PARTIAL(r1,wiper) = -1.0 / r_upper; - - PARTIAL(wiper,r0) = -1.0 / r_lower; - PARTIAL(wiper,r1) = -1.0 / r_upper; - PARTIAL(wiper,wiper) = (1.0/r_lower) + (1.0/r_upper); - - } - else { - - /* Output AC Gain Values */ - - ac_gain.imag= 0.0; - - ac_gain.real = -1.0 / r_lower; - AC_GAIN(r0,r0) = ac_gain; - - ac_gain.real = 0.0; - AC_GAIN(r0,r1) = ac_gain; - - ac_gain.real = 1.0 / r_lower; - AC_GAIN(r0,wiper) = ac_gain; - - ac_gain.real = 0.0; - AC_GAIN(r1,r0) = ac_gain; - - ac_gain.real = -1.0 / r_upper; - AC_GAIN(r1,r1) = ac_gain; - - ac_gain.real = 1.0 / r_upper; - AC_GAIN(r1,wiper) = ac_gain; - - ac_gain.real = 1.0 / r_lower; - AC_GAIN(wiper,r0) = ac_gain; - - ac_gain.real = 1.0 / r_upper; - AC_GAIN(wiper,r1) = ac_gain; - - ac_gain.real = -(1.0/r_lower) - (1.0/r_upper); - AC_GAIN(wiper,wiper) = ac_gain; - - } - -} - - - - diff --git a/src/xspice/icm/xtradev/potentiometer/ifspec.ifs b/src/xspice/icm/xtradev/potentiometer/ifspec.ifs deleted file mode 100644 index 1c7692fbf..000000000 --- a/src/xspice/icm/xtradev/potentiometer/ifspec.ifs +++ /dev/null @@ -1,94 +0,0 @@ -/*.......1.........2.........3.........4.........5.........6.........7.........8 -================================================================================ -Public Domain - -Georgia Tech Research Corporation -Atlanta, Georgia 30332 - - -AUTHORS - - 19 June 1992 Jeffrey P. Murray - - -SUMMARY - - This file contains the interface specification file for the - analog potentiometer code model. - -===============================================================================*/ - -NAME_TABLE: - -Spice_Model_Name: potentiometer -C_Function_Name: cm_potentiometer -Description: "potentiometer" - - -PORT_TABLE: - -Port_Name: r0 wiper -Description: "pot connection 0" "wiper contact" -Direction: inout inout -Default_Type: g g -Allowed_Types: [g] [g] -Vector: no no -Vector_Bounds: - - -Null_Allowed: no no - - -PORT_TABLE: - -Port_Name: r1 -Description: "pot connection 1" -Direction: inout -Default_Type: g -Allowed_Types: [g] -Vector: no -Vector_Bounds: - -Null_Allowed: no - - -PARAMETER_TABLE: - -Parameter_Name: position -Description: "position of wiper connection (0.0 to 1.0)" -Data_Type: real -Default_Value: 0.5 -Limits: [0.0 1.0] -Vector: no -Vector_Bounds: - -Null_Allowed: yes - - -PARAMETER_TABLE: - -Parameter_Name: log r -Description: "log-linear switch" "total resistance" -Data_Type: boolean real -Default_Value: FALSE 1.0e5 -Limits: - - -Vector: no no -Vector_Bounds: - - -Null_Allowed: yes yes - - - -PARAMETER_TABLE: - -Parameter_Name: log_multiplier -Description: "multiplier constant for log resistance" -Data_Type: real -Default_Value: 1.0 -Limits: - -Vector: no -Vector_Bounds: - -Null_Allowed: yes - - - -STATIC_VAR_TABLE: - -Static_Var_Name: -Data_Type: -Description: diff --git a/src/xspice/icm/xtradev/pswitch/cfunc.mod b/src/xspice/icm/xtradev/pswitch/cfunc.mod deleted file mode 100644 index d0cf2ff43..000000000 --- a/src/xspice/icm/xtradev/pswitch/cfunc.mod +++ /dev/null @@ -1,334 +0,0 @@ -/*.......1.........2.........3.........4.........5.........6.........7.........8 -================================================================================ - -FILE pswitch/cfunc.mod - -3-Clause BSD - -Copyright 2020 The ngspice team - - -AUTHORS - - 27 September 2020 Holger Vogt - - -MODIFICATIONS - - 03 June 2021 Yurii Demchyna - - -SUMMARY - - This file contains the functional description of the pswitch - code model. - - -INTERFACES - - FILE ROUTINE CALLED - - CMmacros.h cm_message_send(); - - -REFERENCED FILES - - Inputs from and outputs to ARGS structure. - - -NON-STANDARD FEATURES - - NONE - -===============================================================================*/ - -/*=== INCLUDE FILES ====================*/ - -#include -#include - - - -/*=== CONSTANTS ========================*/ - - - - -/*=== MACROS ===========================*/ - - - - -/*=== LOCAL VARIABLES & TYPEDEFS =======*/ - -typedef struct { - - double logmean; /* log-mean of resistor values */ - double logratio; /* log-ratio of resistor values */ - double cntl_mean; /* mean of control values */ - double cntl_diff; /* diff of control values */ - double intermediate; /* intermediate value used to calculate - the resistance of the switch when the - controlling voltage is between cntl_on - and cntl_of */ - double cntl_on; /* voltage above which switch come on */ - double cntl_off; /* voltage below the switch has resistance roff */ - double c1; /* some constants */ - double c2; - double c3; -} Local_Data_t; - - -/*=== FUNCTION PROTOTYPE DEFINITIONS ===*/ - -static void -cm_pswitch_callback(ARGS, Mif_Callback_Reason_t reason) -{ - switch (reason) { - case MIF_CB_DESTROY: { - Local_Data_t *loc = STATIC_VAR (locdata); - if (loc) { - free(loc); - STATIC_VAR (locdata) = NULL; - } - break; - } - } -} - - - - - - -/*============================================================================== - -FUNCTION cm_pswitch() - -AUTHORS - - 27 September 2020 Holger Vogt - -MODIFICATIONS - -SUMMARY - - This function implements the pswitch code model. - -INTERFACES - - FILE ROUTINE CALLED - - CMmacros.h cm_message_send(); - -RETURNED VALUE - - Returns inputs and outputs via ARGS structure. - -GLOBAL VARIABLES - - NONE - -NON-STANDARD FEATURES - - NONE - -==============================================================================*/ - -/*=== CM_PSWITCH ROUTINE ===*/ - - - -void cm_pswitch(ARGS) /* structure holding parms, - inputs, outputs, etc. */ -{ - double cntl_on; /* voltage above which switch come on */ - double cntl_off; /* voltage below the switch has resistance roff */ - double r_on; /* on resistance */ - double r_off; /* off resistance */ - double r_cntl_in; /* input resistance for control terminal */ - double logmean; /* log-mean of resistor values */ - double logratio; /* log-ratio of resistor values */ - double cntl_mean; /* mean of control values */ - double cntl_diff; /* diff of control values */ - double intermediate; /* intermediate value used to calculate - the resistance of the switch when the - controlling voltage is between cntl_on - and cntl_of */ - double r; /* value of the resistance of the switch */ - double pi_pvout; /* partial of the output wrt input */ - double pi_pcntl; /* partial of the output wrt control input */ - - Mif_Complex_t ac_gain; - - - - Local_Data_t *loc; /* Pointer to local static data, not to be included - in the state vector */ - - - /* Retrieve frequently used parameters... */ - - r_on = PARAM(r_on); - r_off = PARAM(r_off); - r_cntl_in = PARAM(r_cntl_in); - - r_on = (r_on < 1.0e-3) ? 1.0e-3 : r_on; /* Set minimum 'ON' resistance */ - r_off = (r_off > 1.0e12) ? 1.0e12 : r_off; /* Set maximum 'OFF' resistance */ - - - if(INIT == 1) { /* first time through, allocate memory, set static parameters */ - char *cntl_error = "\n*****ERROR*****\nPSWITCH: CONTROL voltage delta less than 1.0e-12\n"; - - cntl_on = PARAM(cntl_on); - cntl_off = PARAM(cntl_off); - if( (fabs(cntl_on - cntl_off) < 1.0e-12) ) { - cntl_on += 0.001; - cntl_off -= 0.001; - } - - CALLBACK = cm_pswitch_callback; - - /*** allocate static storage for *loc ***/ - STATIC_VAR (locdata) = calloc (1 , sizeof ( Local_Data_t )); - loc = STATIC_VAR (locdata); - - loc->cntl_on = cntl_on; - loc->cntl_off = cntl_off; - - if ( PARAM(log) == MIF_TRUE ) { /* Logarithmic Variation in 'R' */ - if (cntl_on > cntl_off) - { - cntl_on = 1; - cntl_off = 0; - } - else - { - cntl_on = 0; - cntl_off = 1; - } - - loc->logmean = log(sqrt(r_on * r_off)); - loc->logratio = log(r_on / r_off); - loc->cntl_mean = 0.5; - loc->cntl_diff = cntl_on - cntl_off; - loc->intermediate = loc->logratio / loc->cntl_diff; - loc->c1 = 1.5 * loc->logratio / loc->cntl_diff; - loc->c3 = 2. * loc->logratio / (loc->cntl_diff * loc->cntl_diff * loc->cntl_diff); //pow(loc->cntl_diff, 3); - loc->c2 = 3 * loc->c3; - } else { - loc->cntl_diff = cntl_on - cntl_off; - loc->intermediate = (r_on - r_off) / (cntl_on - cntl_off); - } - } - - loc = STATIC_VAR (locdata); - - cntl_on = loc->cntl_on; - cntl_off = loc->cntl_off; - if ( PARAM(log) == MIF_TRUE ) { /* Logarithmic Variation in 'R' */ - logmean = loc->logmean; - logratio = loc->logratio; - cntl_mean = loc->cntl_mean; - cntl_diff = loc->cntl_diff; - intermediate = loc->intermediate; - double inmean;// = INPUT(cntl_in) - cntl_mean; - int outOfLimit = 0; - if (cntl_on > cntl_off) { - inmean = (INPUT(cntl_in) - cntl_off) / (cntl_on - cntl_off) - cntl_mean; - if (INPUT(cntl_in) > cntl_on) { - r = r_on; - outOfLimit = 1; - } - else if (INPUT(cntl_in) < cntl_off) { - r = r_off; - outOfLimit = 1; - } - else { - r = exp(logmean + loc->c1 * inmean - loc->c3 * inmean * inmean * inmean); - if(r cntl_off) { - r = r_off; - outOfLimit = 1; - } - else { - r = exp(logmean + loc->c1 * inmean - loc->c3 * inmean * inmean * inmean); - if(rc2 * inmean * inmean - loc->c1); - if(1 == outOfLimit){ - pi_pcntl = 0; - } - pi_pvout = 1.0 / r; - - } - else { /* Linear Variation in 'R' */ - intermediate = loc->intermediate; - cntl_diff = loc->cntl_diff; - if (cntl_diff >=0) { - if (INPUT(cntl_in) < cntl_off) { - r = r_off; - pi_pcntl = 0; - } - else if (INPUT(cntl_in) > cntl_on) { - r = r_on; - pi_pcntl = 0; - } - else { - r = INPUT(cntl_in) * intermediate + ((r_off*cntl_on - - r_on*cntl_off) / cntl_diff); - pi_pcntl = -intermediate * INPUT(out) / (r*r); - } - } - else { - if (INPUT(cntl_in) > cntl_off) { - r = r_off; - pi_pcntl = 0; - } - else if (INPUT(cntl_in) < cntl_on) { - r = r_on; - pi_pcntl = 0; - } - else { - r = INPUT(cntl_in) * intermediate + ((r_off*cntl_on - - r_on*cntl_off) / cntl_diff); - pi_pcntl = -intermediate * INPUT(out) / (r*r); - } - } - if(r<=1.0e-9) r=1.0e-9;/* minimum resistance limiter */ - pi_pvout = 1.0 / r; - } - - if(ANALYSIS != MIF_AC) { /* Output DC & Transient Values */ - OUTPUT(out) = INPUT(out) / r; - OUTPUT(cntl_in) = INPUT(cntl_in) / r_cntl_in; -// PARTIAL(out,out) = pi_pvout; -// PARTIAL(out,cntl_in) = pi_pcntl; -// PARTIAL(cntl_in,cntl_in) = 1 / r_cntl_in; -// PARTIAL(cntl_in,out) = 0; /* cntl input resistance is -// independent to out port */ - cm_analog_auto_partial(); - - /* Note that the minus signs are required because current is positive - flowing INTO rather than OUT OF a component node. */ - } - else { /* Output AC Gain Values */ - ac_gain.real = -pi_pvout; /* See comment on minus signs above... */ - ac_gain.imag= 0.0; - AC_GAIN(out,out) = ac_gain; - - ac_gain.real = -pi_pcntl; - ac_gain.imag= 0.0; - AC_GAIN(out,cntl_in) = ac_gain; - } -} - diff --git a/src/xspice/icm/xtradev/pswitch/ifspec.ifs b/src/xspice/icm/xtradev/pswitch/ifspec.ifs deleted file mode 100644 index bf66557a9..000000000 --- a/src/xspice/icm/xtradev/pswitch/ifspec.ifs +++ /dev/null @@ -1,83 +0,0 @@ -/*.......1.........2.........3.........4.........5.........6.........7.........8 -================================================================================ -3-Clause BSD - -Copyright 2020 The ngspice team - - -AUTHORS - - 27 September 2020 Holger Vogt - 03 June 2021 Yurii Demchyna - -SUMMARY - - This file contains the interface specification file for the - analog pswitch code model. - -===============================================================================*/ - -NAME_TABLE: - - -C_Function_Name: cm_pswitch -Spice_Model_Name: pswitch -Description: "analog PSPICE compatible switch" - - -PORT_TABLE: - - -Port_Name: cntl_in out -Description: "input" "resistive output" -Direction: inout inout -Default_Type: gd gd -Allowed_Types: [g,gd] [gd] -Vector: no no -Vector_Bounds: - - -Null_Allowed: no no - - -PARAMETER_TABLE: - - -Parameter_Name: cntl_off cntl_on -Description: "control 'off' val" "control 'on' val" -Data_Type: real real -Default_Value: 0.0 1.0 -Limits: - - -Vector: no no -Vector_Bounds: - - -Null_Allowed: yes yes - - -PARAMETER_TABLE: - -Parameter_Name: log r_off -Description: "Log-linear switch" "off resistance" -Data_Type: boolean real -Default_Value: TRUE 1.0e12 -Limits: - - -Vector: no no -Vector_Bounds: - - -Null_Allowed: yes yes - - - -PARAMETER_TABLE: - -Parameter_Name: r_on r_cntl_in -Description: "on resistance" "input resistance for control terminal" -Data_Type: real real -Default_Value: 1.0 1.0e12 -Limits: - - -Vector: no no -Vector_Bounds: - - -Null_Allowed: yes yes - - -STATIC_VAR_TABLE: - -Static_Var_Name: locdata -Description: "local static data" -Data_Type: pointer diff --git a/src/xspice/icm/xtradev/sidiode/cfunc.mod b/src/xspice/icm/xtradev/sidiode/cfunc.mod deleted file mode 100644 index 2b1a955b7..000000000 --- a/src/xspice/icm/xtradev/sidiode/cfunc.mod +++ /dev/null @@ -1,241 +0,0 @@ -/*.......1.........2.........3.........4.........5.........6.........7.........8 -================================================================================ - -FILE sidiode/cfunc.mod - -------------------------------------------------------------------------- - Copyright 2012 - The ngspice team - All Rights Reserved - 3 - Clause BSD license - (see COPYING or https://opensource.org/licenses/BSD-3-Clause) -------------------------------------------------------------------------- - -AUTHORS - - 2 October 2018 Holger Vogt - - -MODIFICATIONS - - - -SUMMARY - - This file contains the model-specific routines used to - functionally describe a simplified diode code model. - - -INTERFACES - - FILE ROUTINE CALLED - - - -REFERENCED FILES - - Inputs from and outputs to ARGS structure. - - -NON-STANDARD FEATURES - - NONE - -===============================================================================*/ - -/*=== INCLUDE FILES ====================*/ - -#include -#include - - - - -/*=== CONSTANTS ========================*/ - - - - -/*=== MACROS ===========================*/ - - - - -/*=== LOCAL VARIABLES & TYPEDEFS =======*/ - -typedef struct { - - double a1; /* parameter of first quadratic equation */ - double a2; /* parameter of first tanh equation */ - double b1; /* parameter of second quadratic equation */ - double b2; /* parameter of second tanh equation */ - double hRevepsilon; /* half delta between Va and Vb */ - double hEpsilon; /* half delta between Vc and Vd */ - double Va; /* voltage limits of the quadratic regions */ - double Vb; - double Vc; - double Vd; - double grev; /* conductance in all three regions */ - double goff; - double gon; - Boolean_t Ili; /* TRUE, if current limits are given */ - Boolean_t Revili; - Boolean_t epsi; /* TRUE, if quadratic overlap */ - Boolean_t revepsi; - -} Local_Data_t; - - - -/*=== FUNCTION PROTOTYPE DEFINITIONS ===*/ - - -static void -cm_sidiode_callback(ARGS, Mif_Callback_Reason_t reason) -{ - switch (reason) { - case MIF_CB_DESTROY: { - Local_Data_t *loc = STATIC_VAR (locdata); - if (loc) { - free(loc); - STATIC_VAR (locdata) = NULL; - } - break; - } - } -} - - - -/*============================================================================== - -FUNCTION void cm_sidiode() - -==============================================================================*/ - -void cm_sidiode(ARGS) /* structure holding parms, - inputs, outputs, etc. */ -{ - - Local_Data_t *loc; /* Pointer to local static data, not to be included - in the state vector */ - - Mif_Complex_t ac_gain; /* AC gain */ - - double Vrev, Vfwd, Vin, Idd, deriv, Ilimit, Revilimit; - - Vrev = -PARAM(vrev); - Vfwd = PARAM(vfwd); - Ilimit = PARAM(ilimit); - Revilimit = -PARAM(revilimit); - - if (INIT==1) { /* First pass...allocate memory and calculate some constants... */ - - double grev, goff, gon, Va, Vb, Vc, Vd; - double lEpsilon = PARAM(epsilon); - double lRevepsilon = PARAM(revepsilon); - - CALLBACK = cm_sidiode_callback; - - /* allocate static storage for *loc */ - STATIC_VAR(locdata) = calloc (1, sizeof(Local_Data_t)); - loc = STATIC_VAR(locdata); - - goff = 1./PARAM(roff); - gon = 1./PARAM(ron); - if (PARAM(rrev) == 0.) - grev = gon; - else - grev = 1./PARAM(rrev); - - loc->Va = Va = Vrev - lRevepsilon; - loc->Vb = Vb = Vrev; - loc->a2 = grev/Revilimit; - if(lRevepsilon > 0.0) { - loc->a1 = (goff - grev)/lRevepsilon; - loc->revepsi = MIF_TRUE; - } - else - loc->revepsi = MIF_FALSE; - - loc->Vc = Vc = Vfwd; - loc->Vd = Vd = Vfwd + lEpsilon; - loc->b2 = gon/Ilimit; - if(lEpsilon > 0.0) { - loc->b1 = (gon - goff)/lEpsilon; - loc->epsi = MIF_TRUE; - } - else - loc->epsi = MIF_FALSE; - - if (Ilimit < 1e29) - loc->Ili = MIF_TRUE; - else - loc->Ili = MIF_FALSE; - if (Revilimit > -1e29) - loc->Revili = MIF_TRUE; - else - loc->Revili = MIF_FALSE; - - - loc->grev = grev; - loc->goff = goff; - loc->gon = gon; - } - else - loc = STATIC_VAR(locdata); - - - /* Calculate diode current Id and its derivative deriv=dId/dVin */ - - Vin = INPUT(ds); - - if (Vin < loc->Va) { - if(loc->Revili) { - double tmp = tanh(loc->a2 * (Vin - loc->Va)); - double ia = loc->goff * loc->Va - + 0.5 * (loc->Va - loc->Vb) * (loc->Va - loc->Vb) * loc->a1; - Idd = (Revilimit - ia) * tmp + ia; - deriv = loc->grev * (1. - tmp * tmp); - } - else { - Idd = Vrev * loc->goff + (Vin - Vrev) * loc->grev; - deriv = loc->grev; - } - } - else if (loc->revepsi && Vin >= loc->Va && Vin < loc->Vb) { - Idd = 0.5 * (Vin -loc->Vb) * (Vin - loc->Vb) * loc->a1 + Vin * loc->goff; - deriv = (Vin - loc->Vb) * loc->a1 + loc->goff; - } - else if (Vin >= loc->Vb && Vin < loc->Vc) { - Idd = Vin * loc->goff; - deriv = loc->goff; - } - else if (loc->epsi && Vin >= loc->Vc && Vin < loc->Vd) { - Idd = 0.5 * (Vin -loc->Vc) * (Vin - loc->Vc) * loc->b1 + Vin * loc->goff; - deriv = (Vin - loc->Vc) * loc->b1 + loc->goff; - } - else { - if(loc->Ili) { - double tmp = tanh(loc->b2 * (Vin - loc->Vd)); - double id = loc->goff * loc->Vd - + 0.5 * (loc->Vd - loc->Vc) * (loc->Vd - loc->Vc) * loc->b1; - Idd = (Ilimit - id) * tmp + id; - deriv = loc->gon * (1. - tmp * tmp); - } - else { - Idd = Vfwd * loc->goff + (Vin - Vfwd) * loc->gon; - deriv = loc->gon; - } - } - - if(ANALYSIS != MIF_AC) { /* Output DC & Transient Values */ - OUTPUT(ds) = Idd; - PARTIAL(ds,ds) = deriv; - } - else { /* Output AC Gain */ - ac_gain.real = deriv; - ac_gain.imag= 0.0; - AC_GAIN(ds,ds) = ac_gain; - } -} diff --git a/src/xspice/icm/xtradev/sidiode/ifspec.ifs b/src/xspice/icm/xtradev/sidiode/ifspec.ifs deleted file mode 100644 index 33614c7f7..000000000 --- a/src/xspice/icm/xtradev/sidiode/ifspec.ifs +++ /dev/null @@ -1,112 +0,0 @@ -/*.......1.........2.........3.........4.........5.........6.........7.........8 -================================================================================ -/* ---------------------------------------------------------------------- - Copyright 2018 - The ngspice team - All Rights Reserved - 3 - Clause BSD license - (see COPYING or https://opensource.org/licenses/BSD-3-Clause) -------------------------------------------------------------------------- - -AUTHORS - - 2 October 2018 Holger Vogt - - -SUMMARY - - This file contains the interface specification file for the - analog simple diode code model. - -===============================================================================*/ - -NAME_TABLE: - - -C_Function_Name: cm_sidiode -Spice_Model_Name: sidiode -Description: "simple diode" - - -PORT_TABLE: - - -Port_Name: ds -Description: "diode port" -Direction: inout -Default_Type: gd -Allowed_Types: [gd] -Vector: no -Vector_Bounds: - -Null_Allowed: no - - -PARAMETER_TABLE: - - -Parameter_Name: ron roff -Description: "resistance on-state" "resistance off-state" -Data_Type: real real -Default_Value: 1 1 -Limits: [1e-6 - ] [1e-12 -] -Vector: no no -Vector_Bounds: - - -Null_Allowed: no no - - -PARAMETER_TABLE: - -Parameter_Name: vfwd vrev -Description: "forward voltage" "reverse breakdown voltage" -Data_Type: real real -Default_Value: 0. 1e30 -Limits: [0. -] [0. -] -Vector: no no -Vector_Bounds: - - -Null_Allowed: yes yes - - - -PARAMETER_TABLE: - -Parameter_Name: ilimit revilimit -Description: "limit of on-current" "limit of breakdown current" -Data_Type: real real -Default_Value: 1e30 1e30 -Limits: [1e-15 -] [1e-15 -] -Vector: no no -Vector_Bounds: - - -Null_Allowed: yes yes - - -PARAMETER_TABLE: - -Parameter_Name: epsilon revepsilon -Description: "width quadrat. r 1" "width quadratic region 2" -Data_Type: real real -Default_Value: 0. 0. -Limits: [0. -] [0. -] -Vector: no no -Vector_Bounds: - - -Null_Allowed: yes yes - - - -PARAMETER_TABLE: - -Parameter_Name: rrev -Description: "resistance in breakdown" -Data_Type: real -Default_Value: 0. -Limits: - -Vector: no -Vector_Bounds: - -Null_Allowed: yes - - - -STATIC_VAR_TABLE: - -Static_Var_Name: locdata -Data_Type: pointer -Description: "table with constants" diff --git a/src/xspice/icm/xtradev/udnpath.lst b/src/xspice/icm/xtradev/udnpath.lst deleted file mode 100644 index e69de29bb..000000000 diff --git a/src/xspice/icm/xtradev/zener/cfunc.mod b/src/xspice/icm/xtradev/zener/cfunc.mod deleted file mode 100644 index 169cc28db..000000000 --- a/src/xspice/icm/xtradev/zener/cfunc.mod +++ /dev/null @@ -1,372 +0,0 @@ -/*.......1.........2.........3.........4.........5.........6.........7.........8 -================================================================================ - -FILE zener/cfunc.mod - -Public Domain - -Georgia Tech Research Corporation -Atlanta, Georgia 30332 -PROJECT A-8503-405 - - -AUTHORS - - 2 May 1991 Jeffrey P. Murray - - -MODIFICATIONS - - 18 Sep 1991 Jeffrey P. Murray - 2 Oct 1991 Jeffrey P. Murray - - -SUMMARY - - This file contains the model-specific routines used to - functionally describe the zener code model. - - -INTERFACES - - FILE ROUTINE CALLED - - CM.c void cm_analog_not_converged() - - -REFERENCED FILES - - Inputs from and outputs to ARGS structure. - - -NON-STANDARD FEATURES - - NONE - -===============================================================================*/ - -/*=== INCLUDE FILES ====================*/ - -#include -#include - - - -/*=== CONSTANTS ========================*/ - - - - -/*=== MACROS ===========================*/ - - - - -/*=== LOCAL VARIABLES & TYPEDEFS =======*/ - - - - -/*=== FUNCTION PROTOTYPE DEFINITIONS ===*/ - - - -static void -cm_zener_callback(ARGS, Mif_Callback_Reason_t reason) -{ - switch (reason) { - case MIF_CB_DESTROY: { - double *loc = STATIC_VAR(previous_voltage); - if (loc) { - free(loc); - STATIC_VAR(previous_voltage) = NULL; - } - break; - } - } -} - - -/*============================================================================== - -FUNCTION void cm_zener() - -AUTHORS - - 2 May 1991 Jeffrey P. Murray - -MODIFICATIONS - - 18 Sep 1991 Jeffrey P. Murray - 2 Oct 1991 Jeffrey P. Murray - -SUMMARY - - This function implements the zener code model. - -INTERFACES - - FILE ROUTINE CALLED - - CM.c void cm_analog_not_converged() - - -RETURNED VALUE - - Returns inputs and outputs via ARGS structure. - -GLOBAL VARIABLES - - NONE - -NON-STANDARD FEATURES - - NONE - -==============================================================================*/ - -#include - -/*=== CM_ZENER ROUTINE ===*/ - - -void cm_zener(ARGS) /* structure holding parms, - inputs, outputs, etc. */ -{ - double v_breakdown, /* breakdown voltage parameter */ - i_breakdown, /* breakdown current parameter */ - r_breakdown, /* breakdown resistance parameter */ - i_rev, /* reverse current parameter */ - i_sat, /* saturation current parameter... - a.k.a. Io in the forward diode - characteristic equation...see below. */ - n_forward, /* forward emission coefficient parameter... - a.k.a. "n" in the forward diode - characteristic equation...see below. */ - vt, /* volt-equivalent of temperature, Vt, - used in conjunction with n = n_forward - value to describe the forward-voltage - diode behavior described as: - - I = Io * (e^(V/n*Vt) - 1.0) */ - - v_1_2, /* Boundary value voltage between region - 1 (forward diode characteristic) and - region 2 (linear region) */ - k, /* intermediate value used to find v_2_3 */ - v_2_3, /* Boundary value voltage between region - 2 (linear region) and region 3 - (reverse breakdown region) */ - slope1, /* Slope of endpoint for a two segment model */ - slope2, /* Slope of endpoint for a two segment model */ - temp, /* temporary variable used to calulate the - derivatives */ - v_zener, /* input voltage across zener */ - i_zener, /* current which is allowed to - flow through zener, for a given voltage */ - i0, - v0, - a, /* coefficient used to calculate "c" */ - b, /* coefficient used to calculate "c" */ - c, /* A constant to match ordinates at - region 2/3 boundary */ - deriv, /* partial derivative of the output - current w.r.t. the input voltage */ - diff, /* difference between slope1 and slope2 */ - ord_1_2, /* Compute ordinate at boundary of regions 1 & 2 */ - *previous_voltage, /* Previous voltage value (used for limiting) */ - increment, /* Increment value calculated from the - previous_input for v_zener input limiting */ - g; /* conductance value equal to - i_rev / v_breakdown. This value is - used to simulate a reverse-leakage - conductance in parallel with the - zener characteristic. */ - - Mif_Complex_t ac_gain; /* AC gain */ - - - if (INIT==1) { /* First pass...allocate storage for previous value... */ - - /* Allocate storage for frequencies */ - STATIC_VAR(previous_voltage) = (double *) malloc(sizeof(double)); - previous_voltage = (double *) STATIC_VAR(previous_voltage); - - /* Set previous_voltage value to zero... */ - *previous_voltage = 0.0; - - CALLBACK = cm_zener_callback; - } - else { - - previous_voltage = (double *) STATIC_VAR(previous_voltage); - - } - - - /* Retrieve frequently used parameters & inputs... */ - - v_breakdown = PARAM(v_breakdown); - i_breakdown = PARAM(i_breakdown); - r_breakdown = PARAM(r_breakdown); - i_rev = PARAM(i_rev); - i_sat = PARAM(i_sat); - n_forward = PARAM(n_forward); - - v_zener = INPUT(z); - - - - - /** If the limit_switch parameter is set, test the **/ - /** current input against previous value for limiting **/ - - if ( MIF_TRUE == PARAM(limit_switch) ) { - /* Check magnitude of v_zener */ - if ( fabs(*previous_voltage) >= 1.0 ) { - increment = 0.1 * *previous_voltage; - } - else { - if (v_zener < 0.0) { - increment = -0.1; - } - else { - increment = 0.1; - } - } - - /* Test v_zener for reasonable change in value since last call.. */ - if ( fabs(v_zener) > ( fabs(*previous_voltage + increment) ) ) { - - /* Apply limiting... */ - *previous_voltage = v_zener = *previous_voltage + increment; - - cm_analog_not_converged(); - - } - else { - - *previous_voltage = v_zener; - - } - } - - - - - - /* Compute voltage at boundary of regions 1 & 2 */ - - vt = 0.026; - v_1_2 = n_forward * vt * log(n_forward * vt / 10.0); - - - /* Compute voltage at boundary of regions 2 & 3 */ - - k = 1.0 / i_breakdown / r_breakdown; - v_2_3 = -v_breakdown + log(10.0/i_sat/r_breakdown)/k; - - - - /* Compare v_1_2 and v_2_3 to determine if a 3 segment model is possible */ - - if (v_2_3 < v_1_2) { /* Use a 3 segment model */ - - /* Compute v0 for region 3... */ - - i0 = 1.e-6; - v0 = -v_breakdown + 1.0/k*log(i_breakdown/i0); - - - /* Compute ordinate at boundary of regions 1 & 2 */ - - ord_1_2 = i_sat * (exp(v_1_2/n_forward/vt) - 1.0); - - - /* Compute a & b coefficients for linear section in region 2 */ - - a = i_sat / 10.0; - b = ord_1_2 - a * v_1_2; - - - /* Compute constant to match ordinates at region 2/3 boundary */ - - c = a*v_2_3 + b + i0*exp(-k * (v_2_3 - v0)); - - - /* Compute zener current */ - - if (v_zener >= v_1_2) { - temp = exp(v_zener / n_forward / vt); - i_zener = i_sat * (temp - 1.0); - deriv = i_sat / n_forward / vt * temp; - } - else { - if (v_zener >= v_2_3) { - i_zener = a * v_zener + b; - deriv = i_sat / 10.0; - } - else { - temp = exp(-k * (v_zener - v0)); - i_zener = -i0 * temp + c; - deriv = k * i0 * temp; - } - } - } - else { /* Must use a 2 segment model */ - - /* Determine i0 for reverse region */ - - i0 = i_breakdown / (exp(k * v_breakdown) - 1.0); - - - /* Determine the slopes at the region endpoints */ - - slope1 = i_sat / n_forward / vt; - slope2 = i0 * k; - - - /* Determine zener current & first partial... */ - /* Use a linear conductance in one region to match */ - /* slopes at the boundary. */ - - if (v_zener >= 0.0) { - temp = exp(v_zener / n_forward / vt); - i_zener = i_sat * (temp - 1.0); - deriv = i_sat / n_forward / vt * temp; - diff = slope2 - slope1; - if (diff > 0.0) { - i_zener = i_zener + diff * v_zener; - deriv = deriv + diff; - } - } - else { - temp = exp(-k * v_zener); - i_zener = -i0 * (temp - 1.0); - deriv = k * i0 * temp; - diff = slope1 - slope2; - if (diff > 0.0) { - i_zener = i_zener + diff * v_zener; - deriv = deriv + diff; - } - } - } - - /* Add resistor in parallel to simulate reverse leakage */ - - g = i_rev / v_breakdown; - i_zener = i_zener + g * v_zener; - deriv = deriv + g; - - - if(ANALYSIS != MIF_AC) { /* Output DC & Transient Values */ - OUTPUT(z) = i_zener; - PARTIAL(z,z) = deriv; - } - else { /* Output AC Gain */ - ac_gain.real = deriv; - ac_gain.imag= 0.0; - AC_GAIN(z,z) = ac_gain; - } -} - diff --git a/src/xspice/icm/xtradev/zener/ifspec.ifs b/src/xspice/icm/xtradev/zener/ifspec.ifs deleted file mode 100644 index 6ea571d5f..000000000 --- a/src/xspice/icm/xtradev/zener/ifspec.ifs +++ /dev/null @@ -1,98 +0,0 @@ -/*.......1.........2.........3.........4.........5.........6.........7.........8 -================================================================================ -Public Domain - -Georgia Tech Research Corporation -Atlanta, Georgia 30332 - - -AUTHORS - - 2 May 1991 Jeffrey P. Murray - - -SUMMARY - - This file contains the interface specification file for the - analog zener code model. - -===============================================================================*/ - -NAME_TABLE: - - -C_Function_Name: cm_zener -Spice_Model_Name: zener -Description: "zener diode" - - -PORT_TABLE: - - -Port_Name: z -Description: "zener" -Direction: inout -Default_Type: gd -Allowed_Types: [gd] -Vector: no -Vector_Bounds: - -Null_Allowed: no - - -PARAMETER_TABLE: - - -Parameter_Name: v_breakdown i_breakdown -Description: "breakdown voltage" "breakdown current" -Data_Type: real real -Default_Value: - 2e-2 -Limits: [1e-6 1e6] [1e-9 -] -Vector: no no -Vector_Bounds: - - -Null_Allowed: no yes - - -PARAMETER_TABLE: - - -Parameter_Name: r_breakdown i_rev -Description: "breakdown resistance" "reverse current" -Data_Type: real real -Default_Value: 1.0 1e-6 -Limits: [1e-12 -] [1e-9 -] -Vector: no no -Vector_Bounds: - - -Null_Allowed: yes yes - - - -PARAMETER_TABLE: - -Parameter_Name: i_sat n_forward -Description: "saturation current" "forward emission co" -Data_Type: real real -Default_Value: 1e-12 1.0 -Limits: [1e-15 -] [.1 10] -Vector: no no -Vector_Bounds: - - -Null_Allowed: yes yes - - -PARAMETER_TABLE: - -Parameter_Name: limit_switch -Description: "switch for on-board limiting (convergence aid)" -Data_Type: boolean -Default_Value: FALSE -Limits: - -Vector: no -Vector_Bounds: - -Null_Allowed: yes - - - -STATIC_VAR_TABLE: - -Static_Var_Name: previous_voltage -Data_Type: pointer -Description: "iteration holding variable for limiting" diff --git a/src/xspice/icm/xtraevt/.gitignore b/src/xspice/icm/xtraevt/.gitignore deleted file mode 100644 index 352f6580d..000000000 --- a/src/xspice/icm/xtraevt/.gitignore +++ /dev/null @@ -1,14 +0,0 @@ -/xtraevt.cm - -/cmextrn.h -/cminfo.h -/cminfo2.h -/dlmain.c -/objects.inc -/udnextrn.h -/udninfo.h -/udninfo2.h - -/*/*.c - -!/*/udnfunc.c diff --git a/src/xspice/icm/xtraevt/d_to_real/cfunc.mod b/src/xspice/icm/xtraevt/d_to_real/cfunc.mod deleted file mode 100644 index ee707f954..000000000 --- a/src/xspice/icm/xtraevt/d_to_real/cfunc.mod +++ /dev/null @@ -1,42 +0,0 @@ - -void ucm_d_to_real (ARGS) -{ - - Digital_State_t in; - - double *out; - double delay; - double zero; - double one; - double ena; - - - in = INPUT_STATE(in); - if(PORT_NULL(enable)) - ena = 1.0; - else if(INPUT_STATE(enable) == ONE) - ena = 1.0; - else - ena = 0.0; - out = (double *) OUTPUT(out); - - zero = PARAM(zero); - one = PARAM(one); - delay = PARAM(delay); - - - if(in == ZERO) - *out = zero * ena; - else if(in == UNKNOWN) - *out = (zero + one) / 2.0 * ena; - else - *out = one * ena; - - if(TIME > 0.0) - OUTPUT_DELAY(out) = delay; - -} - - - - diff --git a/src/xspice/icm/xtraevt/d_to_real/ifspec.ifs b/src/xspice/icm/xtraevt/d_to_real/ifspec.ifs deleted file mode 100644 index 02d110aab..000000000 --- a/src/xspice/icm/xtraevt/d_to_real/ifspec.ifs +++ /dev/null @@ -1,31 +0,0 @@ - -NAME_TABLE: - -Spice_Model_Name: d_to_real -C_Function_Name: ucm_d_to_real -Description: "Node bridge from digital to real with enable" - - -PORT_TABLE: - -Port_Name: in enable out -Description: "input" "enable" "output" -Direction: in in out -Default_Type: d d real -Allowed_Types: [d] [d] [real] -Vector: no no no -Vector_Bounds: - - - -Null_Allowed: no yes no - - -PARAMETER_TABLE: - -Parameter_Name: zero one delay -Description: "value for 0" "value for 1" "delay" -Data_Type: real real real -Default_Value: 0.0 1.0 1e-9 -Limits: - - [1e-15 -] -Vector: no no no -Vector_Bounds: - - - -Null_Allowed: yes yes yes - diff --git a/src/xspice/icm/xtraevt/int/udnfunc.c b/src/xspice/icm/xtraevt/int/udnfunc.c deleted file mode 100644 index 8a279f519..000000000 --- a/src/xspice/icm/xtraevt/int/udnfunc.c +++ /dev/null @@ -1,197 +0,0 @@ -/*============================================================================ -FILE int/udnfunc.c - -MEMBER OF process XSPICE - -Public Domain - -Georgia Tech Research Corporation -Atlanta, Georgia 30332 -PROJECT A-8503 - -AUTHORS - - 9/12/91 Bill Kuhn - -MODIFICATIONS - - - -SUMMARY - - This file contains the definition of the 'int' node type - used by event-driven models that simulate with integer type data. - These functions are called exclusively through function - pointers in an Evt_Udn_Info_t data structure. - -INTERFACES - - Evt_Udn_Info_t udn_int_info - -REFERENCED FILES - - None. - -NON-STANDARD FEATURES - - None. - -============================================================================*/ - -#include - - -#include "ngspice/cm.h" -#include "ngspice/evtudn.h" -#include "ngspice/memory.h" - - -/* macro to ignore unused variables and parameters */ -#define NG_IGNORE(x) (void)x - -/* ************************************************************************ */ - -static void udn_int_create(CREATE_ARGS) -{ - /* Malloc space for an int */ - MALLOCED_PTR = TMALLOC(int, 1); -} - - -/* ************************************************************************ */ - -static void udn_int_dismantle(DISMANTLE_ARGS) -{ - NG_IGNORE(STRUCT_PTR); - - /* Do nothing. There are no internally malloc'ed things to dismantle */ -} - - -/* ************************************************************************ */ - -static void udn_int_initialize(INITIALIZE_ARGS) -{ - int *int_struct = (int *) STRUCT_PTR; - - - /* Initialize to zero */ - *int_struct = 0; -} - - -/* ************************************************************************ */ - -static void udn_int_invert(INVERT_ARGS) -{ - int *int_struct = (int *) STRUCT_PTR; - - - /* Invert the state */ - *int_struct = -(*int_struct); -} - - -/* ************************************************************************ */ - -static void udn_int_copy(COPY_ARGS) -{ - int *int_from_struct = (int *) INPUT_STRUCT_PTR; - int *int_to_struct = (int *) OUTPUT_STRUCT_PTR; - - /* Copy the structure */ - *int_to_struct = *int_from_struct; -} - -/* ************************************************************************ */ - -static void udn_int_resolve(RESOLVE_ARGS) -{ - int **array = (int**)INPUT_STRUCT_PTR_ARRAY; - int *out = (int *) OUTPUT_STRUCT_PTR; - int num_struct = INPUT_STRUCT_PTR_ARRAY_SIZE; - - int sum; - int i; - - /* Sum the values */ - for(i = 0, sum = 0; i < num_struct; i++) - sum += *(array[i]); - - /* Assign the result */ - *out = sum; -} - -/* ************************************************************************ */ - -static void udn_int_compare(COMPARE_ARGS) -{ - int *int_struct1 = (int *) STRUCT_PTR_1; - int *int_struct2 = (int *) STRUCT_PTR_2; - - /* Compare the structures */ - if((*int_struct1) == (*int_struct2)) - EQUAL = TRUE; - else - EQUAL = FALSE; -} - - -/* ************************************************************************ */ - -static void udn_int_plot_val(PLOT_VAL_ARGS) -{ - int *int_struct = (int *) STRUCT_PTR; - - NG_IGNORE(STRUCT_MEMBER_ID); - - /* Output a value for the int struct */ - PLOT_VAL = *int_struct; -} - - -/* ************************************************************************ */ - -static void udn_int_print_val(PRINT_VAL_ARGS) -{ - int *int_struct = (int *) STRUCT_PTR; - - NG_IGNORE(STRUCT_MEMBER_ID); - - /* Allocate space for the printed value */ - PRINT_VAL = TMALLOC(char, 30); - - /* Print the value into the string */ - sprintf(PRINT_VAL, "%8d", *int_struct); -} - - - -/* ************************************************************************ */ - -static void udn_int_ipc_val(IPC_VAL_ARGS) -{ - /* Simply return the structure and its size */ - IPC_VAL = STRUCT_PTR; - IPC_VAL_SIZE = sizeof(int); -} - - - -Evt_Udn_Info_t udn_int_info = { - - "int", - "integer valued data", - - udn_int_create, - udn_int_dismantle, - udn_int_initialize, - udn_int_invert, - udn_int_copy, - udn_int_resolve, - udn_int_compare, - udn_int_plot_val, - udn_int_print_val, - udn_int_ipc_val - -}; diff --git a/src/xspice/icm/xtraevt/modpath.lst b/src/xspice/icm/xtraevt/modpath.lst deleted file mode 100644 index 81dbd3ec7..000000000 --- a/src/xspice/icm/xtraevt/modpath.lst +++ /dev/null @@ -1,4 +0,0 @@ -d_to_real -real_delay -real_gain -real_to_v diff --git a/src/xspice/icm/xtraevt/real/udnfunc.c b/src/xspice/icm/xtraevt/real/udnfunc.c deleted file mode 100644 index baacfad97..000000000 --- a/src/xspice/icm/xtraevt/real/udnfunc.c +++ /dev/null @@ -1,199 +0,0 @@ -/*============================================================================ -FILE real/udnfunc.c - -MEMBER OF process XSPICE - -Public Domain - -Georgia Tech Research Corporation -Atlanta, Georgia 30332 -PROJECT A-8503 - -AUTHORS - - 9/12/91 Bill Kuhn - -MODIFICATIONS - - - -SUMMARY - - This file contains the definition of the 'real' node type - used by event-driven models that simulate with real type data. - These functions are called exclusively through function - pointers in an Evt_Udn_Info_t data structure. - -INTERFACES - - Evt_Udn_Info_t udn_real_info - -REFERENCED FILES - - None. - -NON-STANDARD FEATURES - - None. - -============================================================================*/ - -#include -#include "ngspice/cm.h" - -#include "ngspice/evtudn.h" -#include "ngspice/memory.h" - - - -/* macro to ignore unused variables and parameters */ -#define NG_IGNORE(x) (void)x - -/* ************************************************************************ */ - -static void udn_real_create(CREATE_ARGS) -{ - /* Malloc space for a real struct */ - MALLOCED_PTR = TMALLOC(double, 1); -} - - -/* ************************************************************************ */ - -static void udn_real_dismantle(DISMANTLE_ARGS) -{ - NG_IGNORE(STRUCT_PTR); - - /* Do nothing. There are no internally malloc'ed things to dismantle */ -} - - -/* ************************************************************************ */ - -static void udn_real_initialize(INITIALIZE_ARGS) -{ - double *real_struct = (double *) STRUCT_PTR; - - - /* Initialize to zero */ - *real_struct = 0.0; -} - - -/* ************************************************************************ */ - -static void udn_real_invert(INVERT_ARGS) -{ - double *real_struct = (double *) STRUCT_PTR; - - - /* Invert the state */ - *real_struct = -(*real_struct); -} - - -/* ************************************************************************ */ - -static void udn_real_resolve(RESOLVE_ARGS) -{ - double **array = (double**)INPUT_STRUCT_PTR_ARRAY; - double *out = (double *) OUTPUT_STRUCT_PTR; - int num_struct = INPUT_STRUCT_PTR_ARRAY_SIZE; - - double sum; - int i; - - /* Sum the values */ - for(i = 0, sum = 0.0; i < num_struct; i++) - sum += *(array[i]); - - /* Assign the result */ - *out = sum; -} - -/* ************************************************************************ */ - -static void udn_real_copy(COPY_ARGS) -{ - double *real_from_struct = (double *) INPUT_STRUCT_PTR; - double *real_to_struct = (double *) OUTPUT_STRUCT_PTR; - - /* Copy the structure */ - *real_to_struct = *real_from_struct; -} - - -/* ************************************************************************ */ - -static void udn_real_compare(COMPARE_ARGS) -{ - double *real_struct1 = (double *) STRUCT_PTR_1; - double *real_struct2 = (double *) STRUCT_PTR_2; - - /* Compare the structures */ - if((*real_struct1) == (*real_struct2)) - EQUAL = TRUE; - else - EQUAL = FALSE; -} - - -/* ************************************************************************ */ - -static void udn_real_plot_val(PLOT_VAL_ARGS) -{ - double *real_struct = (double *) STRUCT_PTR; - - NG_IGNORE(STRUCT_MEMBER_ID); - - /* Output a value for the real struct */ - PLOT_VAL = *real_struct; -} - - -/* ************************************************************************ */ - -static void udn_real_print_val(PRINT_VAL_ARGS) -{ - double *real_struct = (double *) STRUCT_PTR; - - NG_IGNORE(STRUCT_MEMBER_ID); - - /* Allocate space for the printed value */ - PRINT_VAL = TMALLOC(char, 30); - - /* Print the value into the string */ - sprintf(PRINT_VAL, "%15.6e", *real_struct); -} - - - -/* ************************************************************************ */ - -static void udn_real_ipc_val(IPC_VAL_ARGS) -{ - /* Simply return the structure and its size */ - IPC_VAL = STRUCT_PTR; - IPC_VAL_SIZE = sizeof(double); -} - - - -Evt_Udn_Info_t udn_real_info = { - - "real", - "real valued data", - - udn_real_create, - udn_real_dismantle, - udn_real_initialize, - udn_real_invert, - udn_real_copy, - udn_real_resolve, - udn_real_compare, - udn_real_plot_val, - udn_real_print_val, - udn_real_ipc_val - -}; - diff --git a/src/xspice/icm/xtraevt/real_delay/cfunc.mod b/src/xspice/icm/xtraevt/real_delay/cfunc.mod deleted file mode 100644 index bedf78a53..000000000 --- a/src/xspice/icm/xtraevt/real_delay/cfunc.mod +++ /dev/null @@ -1,46 +0,0 @@ - - -#define CLK_STATE 0 - - -void ucm_real_delay (ARGS) -{ - - double *in; - double *out; - - Digital_State_t *state; - Digital_State_t *old_state; - - - if(INIT) { - cm_event_alloc(CLK_STATE, sizeof(Digital_State_t)); - state = (Digital_State_t *) cm_event_get_ptr(CLK_STATE, 0); - old_state = state; - *state = INPUT_STATE(clk); - } - else { - state = (Digital_State_t *) cm_event_get_ptr(CLK_STATE, 0); - old_state = (Digital_State_t *) cm_event_get_ptr(CLK_STATE, 1); - } - - if(ANALYSIS != TRANSIENT) - OUTPUT_CHANGED(out) = FALSE; - else { - *state = INPUT_STATE(clk); - if(*state == *old_state) - OUTPUT_CHANGED(out) = FALSE; - else if(*state != ONE) - OUTPUT_CHANGED(out) = FALSE; - else { - in = (double *) INPUT(in); - out = (double *) OUTPUT(out); - *out = *in; - OUTPUT_DELAY(out) = PARAM(delay); - } - } -} - - - - diff --git a/src/xspice/icm/xtraevt/real_delay/ifspec.ifs b/src/xspice/icm/xtraevt/real_delay/ifspec.ifs deleted file mode 100644 index cd19e8494..000000000 --- a/src/xspice/icm/xtraevt/real_delay/ifspec.ifs +++ /dev/null @@ -1,32 +0,0 @@ - -NAME_TABLE: - -Spice_Model_Name: real_delay -C_Function_Name: ucm_real_delay -Description: "A Z ** -1 block working on real data" - - -PORT_TABLE: - -Port_Name: in clk out -Description: "input" "clock" "output" -Direction: in in out -Default_Type: real d real -Allowed_Types: [real] [d] [real] -Vector: no no no -Vector_Bounds: - - - -Null_Allowed: no no no - - -PARAMETER_TABLE: - -Parameter_Name: delay -Description: "delay from clk to out" -Data_Type: real -Default_Value: 1e-9 -Limits: [1e-15 -] -Vector: no -Vector_Bounds: - -Null_Allowed: yes - - diff --git a/src/xspice/icm/xtraevt/real_gain/cfunc.mod b/src/xspice/icm/xtraevt/real_gain/cfunc.mod deleted file mode 100644 index 25e4bc3b4..000000000 --- a/src/xspice/icm/xtraevt/real_gain/cfunc.mod +++ /dev/null @@ -1,38 +0,0 @@ - -void ucm_real_gain (ARGS) -{ - double *in; - double *out; - - double in_offset; - double gain; - double out_offset; - double delay; - double ic; - - - /* Get the input and output pointers */ - in = (double *) INPUT(in); - out = (double *) OUTPUT(out); - - /* Get the parameters */ - in_offset = PARAM(in_offset); - gain = PARAM(gain); - out_offset = PARAM(out_offset); - delay = PARAM(delay); - ic = PARAM(ic); - - - /* Assign the output and delay */ - if(ANALYSIS == DC) { - *out = ic; - if(INIT) - cm_event_queue(delay); - } - else { - *out = gain * (*in + in_offset) + out_offset; - OUTPUT_DELAY(out) = delay; - } -} - - diff --git a/src/xspice/icm/xtraevt/real_gain/ifspec.ifs b/src/xspice/icm/xtraevt/real_gain/ifspec.ifs deleted file mode 100644 index d0d187637..000000000 --- a/src/xspice/icm/xtraevt/real_gain/ifspec.ifs +++ /dev/null @@ -1,44 +0,0 @@ - -NAME_TABLE: - -Spice_Model_Name: real_gain -C_Function_Name: ucm_real_gain -Description: "A gain block for event-driven real data" - - -PORT_TABLE: - -Port_Name: in out -Description: "input" "output" -Direction: in out -Default_Type: real real -Allowed_Types: [real] [real] -Vector: no no -Vector_Bounds: - - -Null_Allowed: no no - - -PARAMETER_TABLE: - -Parameter_Name: in_offset gain out_offset -Description: "input offset" "gain" "output offset" -Data_Type: real real real -Default_Value: 0.0 1.0 0.0 -Limits: - - - -Vector: no no no -Vector_Bounds: - - - -Null_Allowed: yes yes yes - - -PARAMETER_TABLE: - -Parameter_Name: delay ic -Description: "delay" "initial condition" -Data_Type: real real -Default_Value: 1.0e-9 0.0 -Limits: - - -Vector: no no -Vector_Bounds: - - -Null_Allowed: yes yes - - diff --git a/src/xspice/icm/xtraevt/real_to_v/cfunc.mod b/src/xspice/icm/xtraevt/real_to_v/cfunc.mod deleted file mode 100644 index 112c91877..000000000 --- a/src/xspice/icm/xtraevt/real_to_v/cfunc.mod +++ /dev/null @@ -1,76 +0,0 @@ - - -#define TS 0 -#define VS 1 - - -void ucm_real_to_v (ARGS) -{ - - double *t, *v; - double *in; - - /*double out;*/ - - - in = (double *) INPUT(in); - - if(INIT) { - cm_event_alloc(TS, 2 * sizeof(double)); - cm_event_alloc(VS, 2 * sizeof(double)); - t = (double *) cm_event_get_ptr(TS, 0); - v = (double *) cm_event_get_ptr(VS, 0); - t[0] = -2.0; - t[1] = -1.0; - v[0] = *in; - v[1] = *in; - } - else { - t = (double *) cm_event_get_ptr(TS, 0); - v = (double *) cm_event_get_ptr(VS, 0); - } - - switch(CALL_TYPE) { - - case ANALOG: - if(TIME == 0.0) { - OUTPUT(out) = *in * PARAM(gain); - v[0] = *in; - v[1] = *in; - } - else { - if(TIME <= t[0]) - OUTPUT(out) = v[0] * PARAM(gain); - else if(TIME >= t[1]) - OUTPUT(out) = v[1] * PARAM(gain); - else { - OUTPUT(out) = v[0] + (v[1] - v[0]) * - (TIME - t[0]) / (t[1] - t[0]) * PARAM(gain); - } - } - break; - - case EVENT: - if(TIME == 0.0) - return; - if(TIME >= t[1]) { - v[0] = v[1]; - v[1] = *in; - t[0] = TIME; - t[1] = TIME + PARAM(transition_time); - } - else { - v[0] = v[0] + (v[1] - v[0]) * - (TIME - t[0]) / (t[1] - t[0]); - v[1] = *in; - t[0] = TIME; - t[1] = TIME + PARAM(transition_time); - } - break; - - } -} - - - - diff --git a/src/xspice/icm/xtraevt/real_to_v/ifspec.ifs b/src/xspice/icm/xtraevt/real_to_v/ifspec.ifs deleted file mode 100644 index c64f4d631..000000000 --- a/src/xspice/icm/xtraevt/real_to_v/ifspec.ifs +++ /dev/null @@ -1,32 +0,0 @@ - -NAME_TABLE: - -Spice_Model_Name: real_to_v -C_Function_Name: ucm_real_to_v -Description: "Node bridge from real to analog voltage" - - -PORT_TABLE: - -Port_Name: in out -Description: "input" "output" -Direction: in out -Default_Type: real v -Allowed_Types: [real] [v, vd, i, id] -Vector: no no -Vector_Bounds: - - -Null_Allowed: no no - - -PARAMETER_TABLE: - -Parameter_Name: gain transition_time -Description: "gain" "output transition time" -Data_Type: real real -Default_Value: 1.0 1e-9 -Limits: - [1e-15 -] -Vector: no no -Vector_Bounds: - - -Null_Allowed: yes yes - - diff --git a/src/xspice/icm/xtraevt/udnpath.lst b/src/xspice/icm/xtraevt/udnpath.lst deleted file mode 100644 index e5705e826..000000000 --- a/src/xspice/icm/xtraevt/udnpath.lst +++ /dev/null @@ -1,2 +0,0 @@ -int -real diff --git a/src/xspice/idn/Makefile.am b/src/xspice/idn/Makefile.am deleted file mode 100644 index 3f92ee679..000000000 --- a/src/xspice/idn/Makefile.am +++ /dev/null @@ -1,13 +0,0 @@ -## Process this file with automake to produce Makefile.in -# -# JW 3/9/01 - had a go and makeing an autoconf script. - -noinst_LTLIBRARIES = libidnxsp.la - -libidnxsp_la_SOURCES = \ - idndig.c - -AM_CPPFLAGS = @AM_CPPFLAGS@ -I$(top_srcdir)/src/include -AM_CFLAGS = $(STATIC) - -MAINTAINERCLEANFILES = Makefile.in diff --git a/src/xspice/idn/idndig.c b/src/xspice/idn/idndig.c deleted file mode 100644 index 25870229b..000000000 --- a/src/xspice/idn/idndig.c +++ /dev/null @@ -1,360 +0,0 @@ -/*============================================================================ -FILE IDNdig.c - -MEMBER OF process XSPICE - -Public Domain - -Georgia Tech Research Corporation -Atlanta, Georgia 30332 -PROJECT A-8503 - -AUTHORS - - 9/12/91 Bill Kuhn - -MODIFICATIONS - - - -SUMMARY - - This file contains the definition of the 'digital' node type - used by 12-state digital models in the code model library. - These functions are called exclusively through function - pointers in an Evt_Udn_Info_t data structure. - -INTERFACES - - Evt_Udn_Info_t idn_digital_info - -REFERENCED FILES - - None. - -NON-STANDARD FEATURES - - None. - -============================================================================*/ - -#include "ngspice/ngspice.h" - -#include "ngspice/cm.h" - -#include "ngspice/evtudn.h" - -/* ************************************************************************ */ - -static void idn_digital_create(void **evt_struct) -{ - /* Malloc space for a digital struct */ - - *evt_struct = TMALLOC(Digital_t, 1); -} - - -/* ************************************************************************ */ - -static void idn_digital_dismantle(void *evt_struct) -{ - NG_IGNORE(evt_struct); - - /* Do nothing. There are no internally malloc'ed things to dismantle */ -} - - -/* ************************************************************************ */ - -static void idn_digital_initialize(void *evt_struct) -{ - Digital_t *dig_struct = (Digital_t *) evt_struct; - - - /* Initialize to unknown state and strength */ - dig_struct->state = ZERO; - dig_struct->strength = UNDETERMINED; -} - - -/* ************************************************************************ */ - -static void idn_digital_invert(void *evt_struct) -{ - Digital_t *dig_struct = (Digital_t *) evt_struct; - - - /* Invert the state */ - switch(dig_struct->state) { - - case ZERO: - dig_struct->state = ONE; - return; - - case ONE: - dig_struct->state = ZERO; - return; - - default: - return; - } - -} - - -/* ************************************************************************ */ - -static void idn_digital_copy(void *evt_from_struct, void *evt_to_struct) -{ - Digital_t *dig_from_struct = (Digital_t *) evt_from_struct; - Digital_t *dig_to_struct = (Digital_t *) evt_to_struct; - - /* Copy the structure */ - dig_to_struct->state = dig_from_struct->state; - dig_to_struct->strength = dig_from_struct->strength; -} - - -/* ************************************************************************ */ - -static void idn_digital_resolve(int num_struct, - void **evt_struct_array, void *evt_struct) -{ - Digital_t **dig_struct_array; - Digital_t *dig_struct; - -#define e(v, s) (((s) * 3) + (v)) -#define L ZERO -#define H ONE -#define U UNKNOWN -#define s STRONG -#define r RESISTIVE -#define z HI_IMPEDANCE -#define u UNDETERMINED - - static const int map[12][12] = { -// ------------ e(L,s), e(H,s), e(U,s), e(L,r), e(H,r), e(U,r), e(L,z), e(H,z), e(U,z), e(L,u), e(H,u), e(U,u) ----------- - -/* e(L,s) */ { e(L,s), e(U,s), e(U,s), e(L,s), e(L,s), e(L,s), e(L,s), e(L,s), e(L,s), e(L,s), e(U,s), e(U,s)}, // e(L,s) -/* e(H,s) */ { e(U,s), e(H,s), e(U,s), e(H,s), e(H,s), e(H,s), e(H,s), e(H,s), e(H,s), e(U,s), e(H,s), e(U,s)}, // e(H,s) -/* e(U,s) */ { e(U,s), e(U,s), e(U,s), e(U,s), e(U,s), e(U,s), e(U,s), e(U,s), e(U,s), e(U,s), e(U,s), e(U,s)}, // e(U,s) -/* e(L,r) */ { e(L,s), e(H,s), e(U,s), e(L,r), e(U,r), e(U,r), e(L,r), e(L,r), e(L,r), e(L,u), e(U,u), e(U,u)}, // e(L,r) -/* e(H,r) */ { e(L,s), e(H,s), e(U,s), e(U,r), e(H,r), e(U,r), e(H,r), e(H,r), e(H,r), e(U,u), e(H,u), e(U,u)}, // e(H,r) -/* e(U,r) */ { e(L,s), e(H,s), e(U,s), e(U,r), e(U,r), e(U,r), e(U,r), e(U,r), e(U,r), e(U,u), e(U,u), e(U,u)}, // e(H,r) -/* e(L,z) */ { e(L,s), e(H,s), e(U,s), e(L,r), e(H,r), e(U,r), e(L,z), e(U,z), e(U,z), e(L,u), e(U,u), e(U,u)}, // e(L,z) -/* e(H,z) */ { e(L,s), e(H,s), e(U,s), e(L,r), e(H,r), e(U,r), e(U,z), e(H,z), e(U,z), e(U,u), e(H,u), e(U,u)}, // e(H,z) -/* e(U,z) */ { e(L,s), e(H,s), e(U,s), e(L,r), e(H,r), e(U,r), e(U,z), e(U,z), e(U,z), e(U,u), e(U,u), e(U,u)}, // e(U,z) -/* e(L,u) */ { e(L,s), e(U,s), e(U,s), e(L,u), e(U,u), e(U,u), e(L,u), e(U,u), e(U,u), e(L,u), e(U,u), e(U,u)}, // e(L,u) -/* e(H,u) */ { e(U,s), e(H,s), e(U,s), e(U,u), e(H,u), e(U,u), e(U,u), e(H,u), e(U,u), e(U,u), e(H,u), e(U,u)}, // e(H,u) -/* e(U,u) */ { e(U,s), e(U,s), e(U,s), e(U,u), e(U,u), e(U,u), e(U,u), e(U,u), e(U,u), e(U,u), e(U,u), e(U,u)}}; // e(U,u) - -// ----------- e(L,s), e(H,s), e(U,s), e(L,r), e(H,r), e(U,r), e(L,z), e(H,z), e(U,z), e(L,u), e(H,u), e(U,u) ------------ - int i; - int index1; - int index2; - - /* Cast the input void pointers to pointers of the digital type */ - dig_struct = (Digital_t *) evt_struct; - dig_struct_array = (Digital_t **)evt_struct_array; - - if (num_struct < 2) { - /* Copy the first member of the array directly to the output */ - dig_struct->state = dig_struct_array[0]->state; - dig_struct->strength = dig_struct_array[0]->strength; - return; - } - - /* Convert struct to index into map */ - index1 = (int)(dig_struct_array[0]->state + - dig_struct_array[0]->strength * 3); - - /* For the remaining members, perform the resolution algorithm */ - for(i = 1; i < num_struct; i++) { - /* Convert struct to index into map */ - index2 = (int)(dig_struct_array[i]->state + - dig_struct_array[i]->strength * 3); - - /* Compute the result */ - index1 = map[index1][index2]; - } - - /* Convert result back to state and strength */ - dig_struct->state = (Digital_State_t) (index1 % 3); - dig_struct->strength = (Digital_Strength_t) (index1 / 3); -} - - -/* ************************************************************************ */ - -static void idn_digital_compare(void *evt_struct1, void *evt_struct2, - Boolean_t *equal) -{ - Digital_t *dig_struct1 = (Digital_t *) evt_struct1; - Digital_t *dig_struct2 = (Digital_t *) evt_struct2; - - /* Compare the structures in order of most likely differences */ - if(dig_struct1->state != dig_struct2->state) - *equal = FALSE; - else if(dig_struct1->strength != dig_struct2->strength) - *equal = FALSE; - else - *equal = TRUE; -} - - -/* ************************************************************************ */ - -static void idn_digital_plot_val(void *evt_struct, char *member, double *val) -{ - Digital_t *dig_struct = (Digital_t *) evt_struct; - - - /* Output a value for the requested member of the digital struct */ - if(strcmp(member,"strength") == 0) { - - /* Choose values that will not make plots lie on state plots */ - switch(dig_struct->strength) { - - case STRONG: - *val = 0.1; - return; - - case RESISTIVE: - *val = 0.6; - return; - - case HI_IMPEDANCE: - *val = 1.1; - return; - - case UNDETERMINED: - *val = -0.4; - return; - } - } - else { - /* member = "state" or anything else */ - - /* Pick reasonable values */ - switch(dig_struct->state) { - - case ZERO: - *val = 0.0; - return; - - case ONE: - *val = 1.0; - return; - - case UNKNOWN: - *val = 0.5; - return; - } - } -} - - -/* ************************************************************************ */ - -static void idn_digital_print_val(void *evt_struct, char *member, char **val) -{ - Digital_t *dig_struct = (Digital_t *) evt_struct; - - int index; - - static char *map[] = { "0s", "1s", "Us", - "0r", "1r", "Ur", - "0z", "1z", "Uz", - "0u", "1u", "Uu" }; - - - /* Output a value for the requested member of the digital struct */ - - if(strcmp(member,"state") == 0) { - - /* Pick reasonable values */ - switch(dig_struct->state) { - - case ZERO: - *val = "0"; - return; - - case ONE: - *val = "1"; - return; - - case UNKNOWN: - *val = "U"; - return; - - default: - *val = "?"; - return; - } - } - else if(strcmp(member,"strength") == 0) { - - /* Choose values that will not make plots lie on state plots */ - switch(dig_struct->strength) { - - case STRONG: - *val = "s"; - return; - - case RESISTIVE: - *val = "r"; - return; - - case HI_IMPEDANCE: - *val = "z"; - return; - - case UNDETERMINED: - *val = "u"; - return; - - default: - *val = "?"; - return; - } - } - else { - index = (int)(dig_struct->state + dig_struct->strength * 3); - if((index < 0) || (index > 11)) - *val = "??"; - else - *val = map[index]; - return; - } -} - - - -/* ************************************************************************ */ - -static void idn_digital_ipc_val(void *evt_struct, void **ipc_val, int *ipc_val_size) -{ - /* Return the digital data structure and its size */ - *ipc_val = evt_struct; - *ipc_val_size = sizeof(Digital_t); -} - - - -Evt_Udn_Info_t idn_digital_info = { - -"d", -"12 state digital data", -idn_digital_create, -idn_digital_dismantle, -idn_digital_initialize, -idn_digital_invert, -idn_digital_copy, -idn_digital_resolve, -idn_digital_compare, -idn_digital_plot_val, -idn_digital_print_val, -idn_digital_ipc_val - -}; - diff --git a/src/xspice/ipc/Makefile.am b/src/xspice/ipc/Makefile.am deleted file mode 100644 index 40e4650c6..000000000 --- a/src/xspice/ipc/Makefile.am +++ /dev/null @@ -1,17 +0,0 @@ -## Process this file with automake to produce Makefile.in -# -# JW 3/9/01 - had a go and makeing an autoconf script. - -noinst_LTLIBRARIES = libipcxsp.la - -libipcxsp_la_SOURCES = \ - ipcaegis.c \ - ipc.c \ - ipcsockets.c \ - ipcstdio.c \ - ipctiein.c - -AM_CPPFLAGS = @AM_CPPFLAGS@ -I$(top_srcdir)/src/include -I$(top_srcdir)/src/spicelib/devices -AM_CFLAGS = $(STATIC) - -MAINTAINERCLEANFILES = Makefile.in diff --git a/src/xspice/ipc/ipc.c b/src/xspice/ipc/ipc.c deleted file mode 100644 index a689c051b..000000000 --- a/src/xspice/ipc/ipc.c +++ /dev/null @@ -1,978 +0,0 @@ -/*============================================================================ -FILE IPC.c - -MEMBER OF process XSPICE - -Public Domain - -Georgia Tech Research Corporation -Atlanta, Georgia 30332 -PROJECT A-8503 - -AUTHORS - - 9/12/91 Steve Tynor - -MODIFICATIONS - - 6/13/92 Bill Kuhn Added some comments - -SUMMARY - - Provides compatibility for the new SPICE simulator to both the MSPICE user - interface and BCP (via ATESSE v.1 style AEGIS mailboxes) and the new ATESSE - v.2 Simulator Interface and BCP (via Bsd Sockets). - - The Interprocess Communications package provides functions - called to receive XSPICE decks from the ATESSE Simulator Interface - or Batch Control processes, and to return results to those - processes. Functions callable from the simulator packages include: - - ipc_initialize_server - ipc_terminate_server - ipc_get_line - ipc_send_line - ipc_send_data_prefix - ipc_send_data_suffix - ipc_send_dcop_prefix - ipc_send_dcop_suffix - ipc_send_evtdict_prefix - ipc_send_evtdict_suffix - ipc_send_evtdata_prefix - ipc_send_evtdata_suffix - ipc_send_errchk - ipc_send_end - ipc_send_boolean - ipc_send_int - ipc_send_double - ipc_send_complex - ipc_send_event - ipc_flush - - These functions communicate with a set of transport-level functions - that implement the interprocess communications under one of - the following protocol types determined by a compile-time option: - - BSD UNIX Sockets - HP/Apollo Mailboxes - - For each transport protocol, the following functions are written: - - ipc_transport_initialize_server - ipc_transport_get_line - ipc_transport_terminate_server - ipc_transport_send_line - - - -============================================================================*/ - -#include "ngspice/ngspice.h" - -#include -#include "ngspice/memory.h" /* NOTE: I think this is a Sys5ism (there is not man - * page for it under Bsd, but it's in /usr/include - * and it has a BSD copyright header. Go figure. - */ - -#include "ngspice/ipc.h" -#include "ngspice/ipctiein.h" -#include "ngspice/ipcproto.h" - - -/* - * Conditional compilation sanity check: - */ -#if !defined (IPC_AEGIS_MAILBOXES) && !defined (IPC_UNIX_SOCKETS)\ - && !defined (IPC_DEBUG_VIA_STDIO) -" compiler error - must specify a transport mechanism"; -#endif - -/* - * static 'globals' - */ - -/* typedef unsigned char Buffer_Char_t; */ -typedef char Buffer_Char_t; - -#define OUT_BUFFER_SIZE 1000 -#define MAX_NUM_RECORDS 200 -static int end_of_record_index [MAX_NUM_RECORDS]; -static int num_records; -static Buffer_Char_t out_buffer [OUT_BUFFER_SIZE]; -static int fill_count; - -static Ipc_Mode_t mode; -static Ipc_Protocol_t protocol; -static Ipc_Boolean_t end_of_deck_seen; -static int batch_fd; - -#define FMT_BUFFER_SIZE 80 -static char fmt_buffer [FMT_BUFFER_SIZE]; - -/*---------------------------------------------------------------------------*/ -Ipc_Boolean_t -kw_match (char *keyword, char *str) - /* - * returns IPC_TRUE if the first `strlen(keyword)' characters of `str' match - * the ones in `keyword' - case sensitive - */ -{ - char *k = keyword; - char *s = str; - - /* - * quit if we run off the end of either string: - */ - while (*s && *k) { - if (*s != *k) { - return IPC_FALSE; - } - s++; - k++; - } - /* - * if we get this far, it sould be because we ran off the end of the - * keyword else we didn't match: - */ - return (*k == '\0'); -} - -/*---------------------------------------------------------------------------*/ - -/* -ipc_initialize_server - -This function creates the interprocess communication channel -server mailbox or socket. -*/ - - -Ipc_Status_t -ipc_initialize_server ( - char *server_name, /* Mailbox path or host/portnumber pair */ - Ipc_Mode_t m, /* Interactive or batch */ - Ipc_Protocol_t p ) /* Type of IPC protocol */ - /* - * For mailboxes, `server_name' would be the mailbox pathname; for - * sockets, this needs to be a host/portnumber pair. Maybe this should be - * automatically generated by the routine... - */ -{ - Ipc_Status_t status; - char batch_filename [1025]; - - mode = m; - protocol = p; - end_of_deck_seen = IPC_FALSE; - - num_records = 0; - fill_count = 0; - - status = ipc_transport_initialize_server (server_name, m, p, - batch_filename); - - if (status != IPC_STATUS_OK) { - fprintf (stderr, "ERROR: IPC: error initializing server\n"); - return IPC_STATUS_ERROR; - } - - if (mode == IPC_MODE_BATCH) { -#ifdef IPC_AEGIS_MAILBOXES - strcat (batch_filename, ".log"); -#endif - batch_fd = open (batch_filename, O_WRONLY | O_CREAT, 0666); - if (batch_fd < 0) { - /* fprintf (stderr, "ERROR: IPC: Error opening batch output file: %s\n",batch_filename); */ - perror ("IPC"); - return IPC_STATUS_ERROR; - } - } - return status; -} - -/*---------------------------------------------------------------------------*/ - -/* -ipc_terminate_server - -This function deallocates the interprocess communication channel -mailbox or socket. -*/ - - - -Ipc_Status_t -ipc_terminate_server (void) -{ - return ipc_transport_terminate_server (); -} - -/*---------------------------------------------------------------------------*/ - -/* -ipc_get_line - -This function gets a SPICE deck input line from the interprocess -communication channel. Any special control commands in the deck -beginning with a ``>'' or ``#'' character are processed internally by -this function and not returned to SPICE. -*/ - -Ipc_Status_t -ipc_get_line ( - char *str, /* Text retrieved from IPC channel */ - int *len, /* Length of text string */ - Ipc_Wait_t wait ) /* Select blocking or non-blocking */ - /* - * Reads one SPICE line from the connection. Strips any control lines - * which cannot be interpretted by the simulator (e.g. >INQCON) and - * processes them. If such a line is read, it is processed and the next - * line is read. `ipc_get_line' does not return until a non-interceptable - * line is read or end of file. - * - * If `wait' is IPC_NO_WAIT and there is no data available on the - * connection, `ipc_get_line' returns IPC_STATUS_NO_DATA. If `wait' is - * IPC_WAIT, `ipc_get_line' will not return until there is data available - * or and end of file condition is reached or an error occurs. - * - * Intercepts and processes the following commands: - * #RETURNI, #MINTIME, #VTRANS, - * >PAUSE, >CONT, >STOP, >INQCON, >NETLIST, >ENDNET - * Other > records are silently ignored. - * - * Intercepts old-style .TEMP card generated by MSPICE - * - * Returns: - * IPC_STATUS_OK - for successful reads - * IPC_STATUS_NO_DATA - when NO_WAIT and no data available - * IPC_STATUS_END_OF_DECK - at end of deck (>ENDNET seen) - * IPC_STATUS_ERROR - otherwise - */ -{ - Ipc_Status_t status; - Ipc_Boolean_t need_another = IPC_TRUE; - - do { - - status = ipc_transport_get_line (str, len, wait); - - switch (status) { - case IPC_STATUS_NO_DATA: - case IPC_STATUS_ERROR: - need_another = IPC_FALSE; - break; - case IPC_STATUS_END_OF_DECK: - assert (0); /* should never get this from the low-level get-line */ - status = IPC_STATUS_ERROR; - need_another = IPC_FALSE; - break; - case IPC_STATUS_OK: - /* - * Got a good line - check to see if it's one of the ones we need to - * intercept - */ - if (str[0] == '>') { - if (kw_match (">STOP", str)) { - ipc_handle_stop(); - } else if (kw_match (">PAUSE", str)) { - /* assert (need_another); */ - /* - * once more around the loop to do a blocking wait for the >CONT - */ - need_another = IPC_TRUE; - wait = IPC_WAIT; - } else if (kw_match (">INQCON", str)) { - ipc_send_line (">ABRTABL"); - ipc_send_line (">PAUSABL"); - ipc_send_line (">KEEPABL"); - status = ipc_flush (); - if (IPC_STATUS_OK != status) { - need_another = IPC_FALSE; - } - } else if (kw_match (">ENDNET", str)) { - end_of_deck_seen = IPC_TRUE; - need_another = IPC_FALSE; - status = IPC_STATUS_END_OF_DECK; - } else { - /* silently ignore */ - } - } else if (str[0] == '#') { - if (kw_match ("#RETURNI", str)) { - ipc_handle_returni (); - } else if (kw_match ("#MINTIME", str)) { - double d1/*,d2*/; - if (1 != sscanf (&str[8], "%lg", &d1)) { - status = IPC_STATUS_ERROR; - need_another = IPC_FALSE; - } else { - ipc_handle_mintime (d1); - } - } else if (kw_match ("#VTRANS", str)) { - char *tok1; - char *tok2; - char *tok3; - - tok1 = &str[8]; - for (tok2 = tok1; *tok2; tok2++) { - if (isspace_c(*tok2)) { - *tok2 = '\0'; - tok2++; - break; - } - } - for(tok3 = tok2; *tok3; tok3++) { - if(isspace_c(*tok3)) { - *tok3 = '\0'; - break; - } - } - ipc_handle_vtrans (tok1, tok2); - } else { - /* silently ignore */ - } - } else if (str[0] == '.') { - if (kw_match (".TEMP", str)) { - /* don't pass .TEMP card to caller */ - printf("Old-style .TEMP card found - ignored\n"); - } - else { - /* pass all other . cards to the caller */ - need_another = IPC_FALSE; - } - } else { - /* - * Not a '>' or '#' record - let the caller deal with it - */ - need_another = IPC_FALSE; - } - break; - default: - /* - * some unknown status value! - */ - assert (0); - status = IPC_STATUS_ERROR; - need_another = IPC_FALSE; - break; - } - } while (need_another); - - return status; -} - -/*---------------------------------------------------------------------------*/ - -/* -ipc_flush - -This function flushes the interprocess communication channel -buffer contents. -*/ - -Ipc_Status_t -ipc_flush (void) - /* - * Flush all buffered messages out the connection. - */ -{ - Ipc_Status_t status; - int last = 0; - /*int bytes;*/ - int i; - - /* if batch mode */ - if (mode == IPC_MODE_BATCH) { - - assert (batch_fd >= 0); - - /* for number of records in buffer */ - for (i = 0; i < num_records; i++) { - - /* write the records to the .log file */ - if ((end_of_record_index [i] - last) != - write (batch_fd, &out_buffer[last], (size_t) (end_of_record_index [i] - last))) { - /* fprintf (stderr,"ERROR: IPC: Error writing to batch output file\n"); */ - perror ("IPC"); - return IPC_STATUS_ERROR; - } - - /* If the record is one of the batch simulation status messages, */ - /* send it over the ipc channel too */ - if( kw_match("#ERRCHK", &out_buffer[last]) || - kw_match(">ENDANAL", &out_buffer[last]) || - kw_match(">ABORTED", &out_buffer[last]) ) { - - status = ipc_transport_send_line (&out_buffer[last], - end_of_record_index [i] - last); - if (IPC_STATUS_OK != status) { - return status; - } - } - last = end_of_record_index [i]; - } - - /* else, must be interactive mode */ - } else { - /* send the full buffer over the ipc channel */ - status = ipc_transport_send_line (&out_buffer[0], - end_of_record_index [num_records - 1]); - if (IPC_STATUS_OK != status) { - return status; - } - } - - /* reset counts to zero and return */ - num_records = 0; - fill_count = 0; - return IPC_STATUS_OK; -} - -/*---------------------------------------------------------------------------*/ -Ipc_Status_t -ipc_send_line_binary ( - char *str, - int len ) - /* - * Same as `ipc_send_line' except does not expect the str to be null - * terminated. Sends exactly `len' characters. Use this for binary data - * strings that may have embedded nulls. - * - * Modified by wbk to append newlines for compatibility with - * ATESSE 1.0 - * - */ -{ - int length = len + 1; - /*int diff;*/ - Ipc_Status_t status; - - /* - * If we can't add the whole str to the buffer, or if there are no more - * record indices free, flush the buffer: - */ - if (((fill_count + length) >= OUT_BUFFER_SIZE) || - (num_records >= MAX_NUM_RECORDS)) { - status = ipc_flush (); - if (IPC_STATUS_OK != status) { - return status; - } - } - - /* - * make sure that the str will fit: - */ - if (length + fill_count > OUT_BUFFER_SIZE) { - /* fprintf (stderr,"ERROR: IPC: String too long to fit in output buffer (> %d bytes) - truncated\n",OUT_BUFFER_SIZE); */ - length = OUT_BUFFER_SIZE - fill_count; - } - - /* - * finally, concatenate the str to the end of the buffer and add the newline: - */ - memcpy (&out_buffer[fill_count], str, (size_t) len); - fill_count += len; - - out_buffer[fill_count] = '\n'; - fill_count++; - - end_of_record_index [num_records++] = fill_count; - - return IPC_STATUS_OK; -} - -/*---------------------------------------------------------------------------*/ - -/* -ipc_send_line - -This function sends a line of text over the interprocess -communication channel. -*/ - - -Ipc_Status_t -ipc_send_line (char *str ) /* The text to send */ -{ - int len; - int send_len; - - char *s; - - Ipc_Status_t status= IPC_STATUS_OK; - - - len = (int) strlen(str); - - /* if short string, send it immediately */ - if(len < 80) - status = ipc_send_line_binary (str, len); - else { - /* otherwise, we have to send it as multiple strings */ - /* because Mspice cannot handle things longer than 80 chars */ - s = str; - while(len > 0) { - if(len < 80) - send_len = len; - else - send_len = 79; - status = ipc_send_line_binary (str, send_len); - if(status != IPC_STATUS_OK) - break; - s += send_len; - len -= send_len; - } - } - - return(status); -} - -/*---------------------------------------------------------------------------*/ - -/* -ipc_send_data_prefix - -This function sends a ``>DATAB'' line over the interprocess -communication channel to signal that this is the beginning of a -results dump for the current analysis point. -*/ - -Ipc_Status_t -ipc_send_data_prefix (double time ) /* The analysis point for this data set */ -{ - char buffer[40]; - - sprintf (buffer, ">DATAB %.5E", time); - return ipc_send_line (buffer); -} - -/*---------------------------------------------------------------------------*/ - -/* -ipc_send_data_suffix - -This function sends a ``>ENDDATA'' line over the interprocess -communication channel to signal that this is the end of a results -dump from a particular analysis point. -*/ - - -Ipc_Status_t -ipc_send_data_suffix (void) -{ - Ipc_Status_t status; - - status = ipc_send_line (">ENDDATA"); - - if(status != IPC_STATUS_OK) - return(status); - - return(ipc_flush()); -} - -/*---------------------------------------------------------------------------*/ - -/* -ipc_send_dcop_prefix - -This function sends a ``>DCOPB'' line over the interprocess -communication channel to signal that this is the beginning of a -results dump from a DC operating point analysis. -*/ - -Ipc_Status_t -ipc_send_dcop_prefix (void) -{ - return ipc_send_line (">DCOPB"); -} - -/*---------------------------------------------------------------------------*/ - -/* -ipc_send_dcop_suffix - -This function sends a ``>ENDDATA'' line over the interprocess -communication channel to signal that this is the end of a results -dump from a particular analysis point. -*/ - - -Ipc_Status_t -ipc_send_dcop_suffix (void) -{ - Ipc_Status_t status; - - status = ipc_send_line (">ENDDCOP"); - - if(status != IPC_STATUS_OK) - return(status); - - return(ipc_flush()); -} - - -/*---------------------------------------------------------------------------*/ - -/* -ipc_send_evtdict_prefix - -This function sends a ``>EVTDICT'' line over the interprocess -communication channel to signal that this is the beginning of an -event-driven node dictionary. - -The line is sent only if the IPC is configured -for UNIX sockets, indicating use with the V2 ATESSE SI process. -*/ - -Ipc_Status_t -ipc_send_evtdict_prefix (void) -{ -#ifdef IPC_AEGIS_MAILBOXES - return IPC_STATUS_OK; -#else - return ipc_send_line (">EVTDICT"); -#endif -} - -/*---------------------------------------------------------------------------*/ - -/* -ipc_send_evtdict_suffix - -This function sends a ``>ENDDICT'' line over the interprocess -communication channel to signal that this is the end of an -event-driven node dictionary. - -The line is sent only if the IPC is configured -for UNIX sockets, indicating use with the V2 ATESSE SI process. -*/ - - -Ipc_Status_t -ipc_send_evtdict_suffix (void) -{ -#ifdef IPC_AEGIS_MAILBOXES - return IPC_STATUS_OK; -#else - Ipc_Status_t status; - - status = ipc_send_line (">ENDDICT"); - - if(status != IPC_STATUS_OK) - return(status); - - return(ipc_flush()); -#endif -} - - -/*---------------------------------------------------------------------------*/ - -/* -ipc_send_evtdata_prefix - -This function sends a ``>EVTDATA'' line over the interprocess -communication channel to signal that this is the beginning of an -event-driven node data block. - -The line is sent only if the IPC is configured -for UNIX sockets, indicating use with the V2 ATESSE SI process. -*/ - -Ipc_Status_t -ipc_send_evtdata_prefix (void) -{ -#ifdef IPC_AEGIS_MAILBOXES - return IPC_STATUS_OK; -#else - return ipc_send_line (">EVTDATA"); -#endif -} - -/*---------------------------------------------------------------------------*/ - -/* -ipc_send_evtdata_suffix - -This function sends a ``>ENDDATA'' line over the interprocess -communication channel to signal that this is the end of an -event-driven node data block. - -The line is sent only if the IPC is configured -for UNIX sockets, indicating use with the V2 ATESSE SI process. -*/ - - -Ipc_Status_t -ipc_send_evtdata_suffix (void) -{ -#ifdef IPC_AEGIS_MAILBOXES - return IPC_STATUS_OK; -#else - Ipc_Status_t status; - - status = ipc_send_line (">ENDDATA"); - - if(status != IPC_STATUS_OK) - return(status); - - return(ipc_flush()); -#endif -} - - -/*---------------------------------------------------------------------------*/ - -/* -ipc_send_errchk - -This function sends a ``\ERRCHK [GO|NOGO]'' message over the -interprocess communication channel to signal that the initial -parsing of the input deck has been completed and to indicate -whether or not errors were detected. -*/ - - -Ipc_Status_t -ipc_send_errchk(void) -{ - char str[IPC_MAX_LINE_LEN+1]; - Ipc_Status_t status; - - if(g_ipc.errchk_sent) - return(IPC_STATUS_OK); - - if(g_ipc.syntax_error) - sprintf(str, "#ERRCHK NOGO"); - else - sprintf(str, "#ERRCHK GO"); - - g_ipc.errchk_sent = IPC_TRUE; - - status = ipc_send_line(str); - if(status != IPC_STATUS_OK) - return(status); - - return(ipc_flush()); -} - -/*---------------------------------------------------------------------------*/ - -/* -ipc_send_end - -This function sends either an ``>ENDANAL'' or an ``>ABORTED'' message -over the interprocess communication channel together with the -total CPU time used to indicate whether or not the simulation -completed normally. -*/ - - -Ipc_Status_t -ipc_send_end(void) -{ - char str[IPC_MAX_LINE_LEN+1]; - Ipc_Status_t status; - - if(g_ipc.syntax_error || g_ipc.run_error) - sprintf(str, ">ABORTED %.4f", g_ipc.cpu_time); - else - sprintf(str, ">ENDANAL %.4f", g_ipc.cpu_time); - - status = ipc_send_line(str); - if(status != IPC_STATUS_OK) - return(status); - - return(ipc_flush()); -} - - -/*---------------------------------------------------------------------------*/ -int -stuff_binary_v1 ( - double d1, double d2, /* doubles to be stuffed */ - int n, /* how many of d1, d2 ( 1 <= n <= 2 ) */ - char *buf, /* buffer to stuff to */ - int pos ) /* index at which to stuff */ -{ - union { - float float_val[2]; - char ch[32]; - } trick; - int i, j; - - assert (protocol == IPC_PROTOCOL_V1); - assert (sizeof(float) == 4); - assert (sizeof(char) == 1); - assert ((n >= 1) && (n <= 2)); - - trick.float_val[0] = (float)d1; - if (n > 1) { - trick.float_val[1] = (float)d2; - } - for (i = 0, j = pos; i < n * (int) sizeof(float); j++, i++) - buf[j] = trick.ch[i]; - buf[0] = (char) ('A' + j - 1); - return j; -} - -/*---------------------------------------------------------------------------*/ - - -/* -ipc_send_double - -This function sends a double data value over the interprocess -communication channel preceded by a character string that -identifies the simulation variable. -*/ - -Ipc_Status_t -ipc_send_double ( - char *tag, /* The node or instance */ - double value ) /* The data value to send */ -{ - int len = 0; - - switch (protocol) { - case IPC_PROTOCOL_V1: - strcpy (fmt_buffer, " "); /* save room for the length byte */ - strcat (fmt_buffer, tag); - strcat (fmt_buffer, " "); - - /* If talking to Mentor tools, must force upper case for Mspice 7.0 */ - strtoupper(fmt_buffer); - - len = stuff_binary_v1 (value, 0.0, 1, fmt_buffer, (int) strlen(fmt_buffer)); - break; - case IPC_PROTOCOL_V2: - break; - } - return ipc_send_line_binary (fmt_buffer, len); -} - -/*---------------------------------------------------------------------------*/ - -/* -ipc_send_complex - -This function sends a complex data value over the interprocess -communication channel preceded by a character string that -identifies the simulation variable. -*/ - - -Ipc_Status_t -ipc_send_complex ( - char *tag, /* The node or instance */ - Ipc_Complex_t value ) /* The data value to send */ -{ - int len=0; - - switch (protocol) { - case IPC_PROTOCOL_V1: - strcpy (fmt_buffer, " "); /* save room for the length byte */ - strcat (fmt_buffer, tag); - strcat (fmt_buffer, " "); - - /* If talking to Mentor tools, must force upper case for Mspice 7.0 */ - strtoupper(fmt_buffer); - - len = stuff_binary_v1 (value.real, value.imag, 2, fmt_buffer, - (int) strlen(fmt_buffer)); - break; - case IPC_PROTOCOL_V2: - break; - } - return ipc_send_line_binary (fmt_buffer, len); -} - -/*---------------------------------------------------------------------------*/ - -/* -ipc_send_event - -This function sends data from an event-driven node over the interprocess -communication channel. The data is sent only if the IPC is configured -for UNIX sockets, indicating use with the V2 ATESSE SI process. -*/ - - -Ipc_Status_t -ipc_send_event ( - int ipc_index, /* Index used in EVTDICT */ - double step, /* Analysis point or timestep (0.0 for DC) */ - double plot_val, /* The value for plotting purposes */ - char *print_val, /* The value for printing purposes */ - void *ipc_val, /* The binary representation of the node data */ - int len ) /* The length of the binary representation */ -{ -#ifdef IPC_AEGIS_MAILBOXES - return IPC_STATUS_OK; -#else - char buff[OUT_BUFFER_SIZE]; - int i; - int buff_len; - char *buff_ptr; - char *temp_ptr; - float fvalue; - - /* Report error if size of data is too big for IPC channel block size */ - if((len + (int) strlen(print_val) + 100) >= OUT_BUFFER_SIZE) { - printf("ERROR - Size of event-driven data too large for IPC channel\n"); - return IPC_STATUS_ERROR; - } - - /* Place the index into the buffer with a trailing space */ - sprintf(buff, "%d ", ipc_index); - - assert(sizeof(float) == 4); - assert(sizeof(int) == 4); - - /* Put the analysis step bytes in */ - buff_len = (int) strlen(buff); - buff_ptr = buff + buff_len; - fvalue = (float)step; - temp_ptr = (char *) &fvalue; - for(i = 0; i < 4; i++) { - *buff_ptr = temp_ptr[i]; - buff_ptr++; - buff_len++; - } - - /* Put the plot value in */ - fvalue = (float)plot_val; - temp_ptr = (char *) &fvalue; - for(i = 0; i < 4; i++) { - *buff_ptr = temp_ptr[i]; - buff_ptr++; - buff_len++; - } - - /* Put the length of the binary representation in */ - temp_ptr = (char *) &len; - for(i = 0; i < 4; i++) { - *buff_ptr = temp_ptr[i]; - buff_ptr++; - buff_len++; - } - - /* Put the binary representation bytes in last */ - temp_ptr = (char*) ipc_val; - for(i = 0; i < len; i++) - buff_ptr[i] = temp_ptr[i]; - buff_ptr += len; - buff_len += len; - - /* Put the print value in */ - strcpy(buff_ptr, print_val); - buff_ptr += strlen(print_val); - buff_len += (int) strlen(print_val); - - /* Send the data to the IPC channel */ - return ipc_send_line_binary(buff, buff_len); - -#endif -} - - diff --git a/src/xspice/ipc/ipcaegis.c b/src/xspice/ipc/ipcaegis.c deleted file mode 100644 index 2254ee460..000000000 --- a/src/xspice/ipc/ipcaegis.c +++ /dev/null @@ -1,309 +0,0 @@ -/*============================================================================ -FILE IPCaegis.c - -MEMBER OF process XSPICE - -Public Domain - -Georgia Tech Research Corporation -Atlanta, Georgia 30332 -PROJECT A-8503 - -AUTHORS - - 9/12/91 Steve Tynor - -MODIFICATIONS - - - -SUMMARY - - Provides compatibility for the new XSPICE simulator to both the MSPICE user - interface and BCP via ATESSE v.1 style AEGIS mailboxes. - -INTERFACES - - -REFERENCED FILES - - None. - -NON-STANDARD FEATURES - - None. - -============================================================================*/ - -#ifdef IPC_AEGIS_MAILBOXES - -#include -#include -#include -#include -#include "ngspice/memory.h" - -#include "ngspice/ipc.h" - - -typedef unsigned char Buffer_char_t; - -static status_$t status; -typedef enum { - IPC_MBX_UNINITIALIZED, - IPC_MBX_INITIALIZED, - IPC_MBX_CONNECTED_TO_CLIENT, -} Ipc_Mbx_State_t; - -static void *mbx_handle; -static Ipc_Mbx_State_t mbx_state = IPC_MBX_UNINITIALIZED; -static mbx_$server_msg_t mbx_send_msg_buf; -static mbx_$server_msg_t mbx_recieve_msg_buf; -static mbx_$server_msg_t *mbx_ret_ptr; -static int mbx_ret_len; -static short mbx_chan; - -#include "ngspice/ipcproto.h" - -/*---------------------------------------------------------------------------*/ - -/* -ipc_transport_initialize_server - -This function creates an Aegis mailbox, and if successful, -calls ipc_get_line to wait for the first record sent which is -assumed to be the batch output filename. -*/ - - - -Ipc_Status_t ipc_transport_initialize_server (server_name, m, p, - batch_filename) - char *server_name; /* The mailbox pathname */ - Ipc_Mode_t m; /* Mode - interactive or batch */ - Ipc_Protocol_t p; /* Protocol type */ - char *batch_filename; /* Batch filename returned */ -{ - int len; -/* extern void *malloc(); */ - - assert (p == IPC_PROTOCOL_V1); - - mbx_$create_server (server_name, strlen (server_name), mbx_$serv_msg_max, - 1, &mbx_handle, &status); - - if (status.all != status_$ok) { - fprintf (stderr, - "ERROR: IPC: Error creating mailbox server \"%s\"\n", - server_name); - error_$print (status); - mbx_state = IPC_MBX_UNINITIALIZED; - return IPC_STATUS_ERROR; - } else { - mbx_state = IPC_MBX_INITIALIZED; - /* - * First record is the name of the batch filename - whether we're in - * batch mode or not: - */ - return ipc_get_line (batch_filename, &len, IPC_WAIT); - } - /* - * shouldn't get here - */ - assert (0); - return IPC_STATUS_ERROR; -} -/*---------------------------------------------------------------------------*/ -Ipc_Status_t extract_msg (str, len) - char *str; - int *len; -{ - *len = mbx_ret_len - mbx_$serv_msg_hdr_len; - assert (*len >= 0); - - /* - * null terminate before copy: - */ - mbx_ret_ptr->data [*len] = '\0'; - strcpy (str, mbx_ret_ptr->data); - - return IPC_STATUS_OK; -} - -/*---------------------------------------------------------------------------*/ - -/* -ipc_transport_get_line - -This function reads data sent by a client over the mailbox -channel. It also handles the initial opening of the -mailbox channel when requested by a client. -*/ - - - -Ipc_Status_t ipc_transport_get_line (str, len, wait) - char *str; /* The string text read from IPC channel */ - int *len; /* The length of str */ - Ipc_Wait_t wait; /* Blocking or non-blocking */ -{ - if (mbx_state == IPC_MBX_UNINITIALIZED) { - fprintf (stderr, - "ERROR: IPC: Attempted to read from non-initialized mailbox\n"); - return IPC_STATUS_ERROR; - } - - assert ((mbx_state == IPC_MBX_CONNECTED_TO_CLIENT) || - (mbx_state == IPC_MBX_INITIALIZED)); - - for (;;) { - if (wait == IPC_WAIT) { - mbx_$get_rec (mbx_handle, &mbx_recieve_msg_buf, mbx_$serv_msg_max, - &mbx_ret_ptr, &mbx_ret_len, &status); - } else { - mbx_$get_conditional (mbx_handle, &mbx_recieve_msg_buf, - mbx_$serv_msg_max, &mbx_ret_ptr, &mbx_ret_len, - &status); - if (status.all == mbx_$channel_empty) { - return IPC_STATUS_NO_DATA; - } - } - - if (status.all != status_$ok) { - fprintf (stderr, "ERROR: IPC: Error reading from mailbox\n"); - error_$print (status); - return IPC_STATUS_ERROR; - } - - switch (mbx_ret_ptr->mt) { - case mbx_$channel_open_mt: - if (mbx_state == IPC_MBX_CONNECTED_TO_CLIENT) { - /* - * we're already connected to a client... refuse the connection - */ - mbx_send_msg_buf.mt = mbx_$reject_open_mt; - } else { - mbx_send_msg_buf.mt = mbx_$accept_open_mt; - mbx_state = IPC_MBX_CONNECTED_TO_CLIENT; - } - mbx_send_msg_buf.cnt = mbx_$serv_msg_hdr_len; - mbx_chan = mbx_ret_ptr->chan; - mbx_send_msg_buf.chan = mbx_chan; - - mbx_$put_rec (mbx_handle, &mbx_send_msg_buf, mbx_$serv_msg_hdr_len, - &status); - - if (status.all != status_$ok) { - fprintf (stderr, "ERROR: IPC: Error writing to mailbox\n"); - error_$print (status); - return IPC_STATUS_ERROR; - } - - /* - * check to see if there was a message buried in the open request: - */ - if (mbx_ret_len > mbx_$serv_msg_hdr_len) { - return extract_msg (str, len); - } - break; - case mbx_$eof_mt: - mbx_chan = mbx_ret_ptr->chan; - mbx_$deallocate(mbx_handle, mbx_chan, &status); - - if (status.all != status_$ok) { - fprintf (stderr, "ERROR: IPC: Error deallocating mailbox\n"); - error_$print (status); - return IPC_STATUS_ERROR; - } - - mbx_state = IPC_MBX_INITIALIZED; - return IPC_STATUS_EOF; - break; - case mbx_$data_mt: - assert (mbx_state == IPC_MBX_CONNECTED_TO_CLIENT); - return extract_msg (str, len); - break; - case mbx_$data_partial_mt: - fprintf (stderr, "ERROR: IPC: Recieved partial data message - ignored\n"); - break; - default: - fprintf (stderr, "ERROR: IPC: Bad message type (0x%x) recieved\n", - mbx_ret_ptr->mt); - } - } - return IPC_STATUS_ERROR; -} - -/*---------------------------------------------------------------------------*/ - -/* -ipc_transport_terminate_server - -This function calls ipc\_transport\_get\_line until it -receives an EOF from the client, which concludes the -communication. -*/ - - -Ipc_Status_t ipc_transport_terminate_server () -{ - char buffer[300]; - int len; - Ipc_Status_t status; - - do { - status = ipc_transport_get_line (buffer, &len, IPC_WAIT); - } while ((status != IPC_STATUS_ERROR) && - (status != IPC_STATUS_EOF)); - return status; -} - -/*---------------------------------------------------------------------------*/ - -/* -ipc_transport_send_line - -This function sends a message to the current client through -the mailbox channel. -*/ - - -Ipc_Status_t ipc_transport_send_line (str, len) - char *str; /* The bytes to send */ - int len; /* The number of bytes from str to send */ -{ - long cnt; - - if (mbx_state != IPC_MBX_CONNECTED_TO_CLIENT) { - fprintf (stderr, - "ERROR: IPC: Attempted to write to non-open mailbox\n"); - return IPC_STATUS_ERROR; - } - - mbx_send_msg_buf.mt = mbx_$data_mt; - if (mbx_$serv_msg_hdr_len + len > mbx_$serv_msg_max) { - fprintf (stderr, - "ERROR: IPC: send_line message too long - truncating\n"); - len = mbx_$serv_msg_max - mbx_$serv_msg_hdr_len; - } - - mbx_send_msg_buf.cnt = mbx_$serv_msg_hdr_len + len; - mbx_send_msg_buf.chan = mbx_chan; - memcpy (mbx_send_msg_buf.data, str, len); - - cnt = mbx_send_msg_buf.cnt; - mbx_$put_rec (mbx_handle, &mbx_send_msg_buf, cnt, &status); - - if (status.all != status_$ok) { - fprintf (stderr, "ERROR: IPC: Error writing to mailbox\n"); - error_$print (status); - return IPC_STATUS_ERROR; - } - return IPC_STATUS_OK; -} - -#else - -int intDummy1; - -#endif /* IPC_AEGIS_MAILBOXES */ diff --git a/src/xspice/ipc/ipcsockets.c b/src/xspice/ipc/ipcsockets.c deleted file mode 100644 index 54f6303c7..000000000 --- a/src/xspice/ipc/ipcsockets.c +++ /dev/null @@ -1,756 +0,0 @@ -/*============================================================================= - - FILE IPCsockets.c - -Public Domain - -Georgia Tech Research Corporation -Atlanta, Georgia 30332 -PROJECT A-8503 - - AUTHOR - Stefan Roth July 1991 - - MODIFICATIONS - none - - SUMMARY - Generic Interprocess Communication module - Provides compatibility for the new SPICE simulator to both the MSPICE user - interface and BCP (via ATESSE v.1 style AEGIS mailboxes) and the new ATESSE - v.2 Simulator Interface and BCP (via BSD Sockets). This file contains the - BSD sockets version. - The Simulator is the server, while the SI and BCP will be the clients. - - - INTERFACES - - FILE ROUTINE CALLED - - IPC.c ipc_get_line(); - - - REFERENCED FILES - - Outputs to stderr. - - -=============================================================================*/ - - -/*============================================================================= - - DESCRIPTION OF FUNCTIONALITY: - - Outline of Initialize_Server function: - create socket; - bind name to socket; - getsockname; - listen; - sock_state = IPC_SOCK_INITIALIZED; - return ipc_get_line (); - - - Format of a message line: - bytes description - ----- ------------------- - 0 recognition character for beginning of line; value is BOL_CHAR. - 1-4 message length (not including bytes 0-4); 32 bits in htonl - format; - if value = -1, then EOF and socket should be closed. - 5-N+5 message body of length specified in bytes 1-4. - - The bytes before the message body are the message header. The header - length is specified as SOCK_MSG_HDR_LEN bytes. - - - Outline of Get_Line function: - read 5 characters; - verify that first char is BOL_CHAR; - interpret message length (N) from bytes 1-4; - do error checking on message header bytes; - read N characters as message body; - do error checking on message body read; - - - Outline of Send_Line function: - write BOL_CHAR; - write 4-byte message body length - write message body (N bytes) - do error checking after each write operation - - - Outline of Terminate_Server function: - Continue to read lines (with ipc_transport_get_line) and ignore - them until socket EOF is reached; - Close the socket. - - -=============================================================================*/ - -#include "ngspice/ngspice.h" - -#ifdef IPC_UNIX_SOCKETS - -/*=== INCLUDE FILES ===*/ - -#include -#include - -#include "ngspice/ipc.h" -#include "ngspice/ipctiein.h" - - -/*=== TYPE DEFINITIONS ===*/ - -typedef enum { - IPC_SOCK_UNINITIALIZED, - IPC_SOCK_INITIALIZED, - IPC_SOCK_CONNECTED_TO_CLIENT -} Ipc_Sock_State_t; - - -/*=== LOCAL VARIABLES ===*/ - -static int sock_desc; /* socket descriptor */ -static int msg_stream; /* socket stream */ -static Ipc_Sock_State_t sock_state = IPC_SOCK_UNINITIALIZED; - - -/*=== INCLUDE FILES ===*/ - -#include "ngspice/ipcproto.h" - -/*============================================================================= - -FUNCTION ipc_transport_initialize_server - -AUTHORS - - July 1991 Stefan Roth - -MODIFICATIONS - - NONE - -SUMMARY - - Creates and opens the BSD socket of the server. Listens for requests - by a client and then reads the first line message. - -INTERFACES - - Called by: (IPC.c) ipc_initialize_server(); - -RETURNED VALUE - - Ipc_Status_t - returns status of the socket connection. - -GLOBAL VARIABLES - - NONE - -NON-STANDARD FEATURES - - NONE - -=============================================================================*/ - -Ipc_Status_t -ipc_transport_initialize_server ( - char *server_name, /* not used */ - Ipc_Mode_t mode, /* not used */ - Ipc_Protocol_t protocol, /* IN - only used in assert */ - char *batch_filename ) /* OUT - returns a value */ - /* Note that unused parameters are required to maintain compatibility */ - /* with version 1 (mailboxes) functions of the same names. */ -{ - struct sockaddr_in server; /* Server specifications for socket*/ - socklen_t server_length; /* Size of server structure */ - int port_num; /* Port number converted from server_name */ - - NG_IGNORE(mode); - NG_IGNORE(protocol); - - /* assert (protocol == IPC_PROTOCOL_V2); */ /* allow v1 protocol - wbk */ - assert (sock_state == IPC_SOCK_UNINITIALIZED); - - /* convert server_name (from atesse_xspice invocation line) to a port */ - /* number */ - port_num = atoi(server_name); - if((port_num > 0) && (port_num < 1024)) { - /* Reserved port number */ - perror ("ERROR: IPC Port numbers below 1024 are reserved"); - sock_state = IPC_SOCK_UNINITIALIZED; - return IPC_STATUS_ERROR; - } - - - sock_desc = socket (AF_INET, SOCK_STREAM, 0); - - if (sock_desc < 0) { - /* Unsuccessful socket opening */ - perror ("ERROR: IPC Creating socket"); - sock_state = IPC_SOCK_UNINITIALIZED; - return IPC_STATUS_ERROR; - } - - /* Socket opened successfully */ - - server.sin_family = AF_INET; - server.sin_addr.s_addr = INADDR_ANY; - server.sin_port = SOCKET_PORT; - - server_length = sizeof (server); - if (bind (sock_desc, (struct sockaddr *)&server, server_length) - < 0) { - fprintf (stderr, "ERROR: IPC: Bind unsuccessful\n"); - perror ("ERROR: IPC"); - sock_state = IPC_SOCK_UNINITIALIZED; - return IPC_STATUS_ERROR; - } - - if (getsockname (sock_desc, (struct sockaddr *)&server, &server_length) - < 0) { - fprintf (stderr, "ERROR: IPC: getting socket name\n"); - perror ("ERROR: IPC"); - sock_state = IPC_SOCK_UNINITIALIZED; - return IPC_STATUS_ERROR; - } - - fprintf (stderr, "Socket port %d.\n", ntohs(server.sin_port)); - - listen (sock_desc, 5); - - sock_state = IPC_SOCK_INITIALIZED; - - /* Socket ok to use now */ - - /* - * First record is the name of the batch filename if we're in batch mode. - */ - - if(g_ipc.mode == IPC_MODE_BATCH) { - int len; - return ipc_get_line (batch_filename, &len, IPC_WAIT); - } - - /* Return success */ - return IPC_STATUS_OK; - -} /* end ipc_transport_initialize_server */ - - - -/*============================================================================= - -FUNCTION bytes_to_integer - -AUTHORS - - July 1991 Stefan Roth - -MODIFICATIONS - - NONE - -SUMMARY - - Convert four bytes at START in the string STR - to a 32-bit unsigned integer. The string is assumed - to be in network byte order and the returned value - is converted to host byte order (with ntohl). - -INTERFACES - - Local to this file. - Called by: ipc_transport_get_line(); - -RETURNED VALUE - - u_long - unsigned 32 bit integer - -GLOBAL VARIABLES - - NONE - -NON-STANDARD FEATURES - - NONE - -=============================================================================*/ - -/* FIXME, - * this is seriously broken, - * once it was probably based upon htonl(), - * yet with broken types - * then the game has changed and strtoul() was used - * with a ascii representation of the length - * (probably as a hacky workaround, because it proved unreliable) - * but the buffer is not terminated properly - * Fix this when needed, currently this functionality looks like - * an unused ancient artefact - * Fix it with regard to ipc_transport_get_line() and ipc_transport_send_line() - * and in concert with the actual user at the other side of the socket - */ -static u_long -bytes_to_integer ( - char *str, /* IN - string that contains the bytes to convert */ - int start ) /* IN - index into string where bytes are */ -{ - uint32_t u; /* Value to be returned */ - char buff[4]; /* Transfer str into buff to word align reqd data */ - int index; /* Index into str and buff for transfer */ - - /* Get the str+start character and cast it into a u_long and put - the value through the network-to-host-short converter and store - it in the variable u. */ - - index = 0; - while (index < (int) sizeof(u)) { - buff[index] = str[index+start]; - index++; - } -/* u = ntohl (*((u_long *) buff)); */ - u = (uint32_t) strtoul(buff, NULL, 10); - - return u; -} /* end bytes_to_integer */ - - - -/*============================================================================= - -FUNCTION handle_socket_eof - -AUTHORS - - July 1991 Stefan Roth - -MODIFICATIONS - - NONE - -SUMMARY - - Do processing when the socket reaches EOF or when a message from the - client states that EOF has been reached. - -INTERFACES - - Local to this file. - Called by: ipc_transport_get_line(); - -RETURNED VALUE - - Ipc_Status_t - always IPC_STATUS_EOF - -GLOBAL VARIABLES - - NONE - -NON-STANDARD FEATURES - - NONE - -=============================================================================*/ - - -static Ipc_Status_t -handle_socket_eof (void) -{ - close (msg_stream); - close (sock_desc); - - sock_state = IPC_SOCK_UNINITIALIZED; - - return IPC_STATUS_EOF; -} /* handle_socket_eof */ - - - -/*============================================================================= - -FUNCTION read_sock - -AUTHORS - - July 1991 Stefan Roth - -MODIFICATIONS - - NONE - -SUMMARY - - Read N bytes from a socket. Only returns when the read had an error, - when 0 bytes (EOF) could be read, or LENGTH bytes are read. - -INTERFACES - - Local to this file. - Called by: ipc_transport_get_line(); - -RETURNED VALUE - - int - Returns the total number of bytes read. - -GLOBAL VARIABLES - - NONE - -NON-STANDARD FEATURES - - NONE - -=============================================================================*/ - - -static int -read_sock ( - int stream, /* IN - Socket stream */ - char *buffer, /* OUT - buffer to store incoming data */ - int length, /* IN - Number of bytes to be read */ - Ipc_Wait_t wait, /* IN - type of read operation */ - int flags ) /* IN - Original socket flags for blocking read */ -{ - int count; /* Number of bytes read with last `read` */ - int totalcount; /* total number of bytes read */ - char *buf2; - -/* count = 0; */ -/* while (count < length) { */ -/* buffer[count] = 'x'; */ -/* count++; */ -/* } */ - count = (int) read (stream, buffer, (size_t) length); - if (wait == IPC_NO_WAIT) { - fcntl (stream, F_SETFL, flags); /* Revert to blocking read */ - } - if ((count <= 0) || (count == length)) { - /* If error or if read in reqd number of bytes: */ - return count; - } else { - /* Only got some of the bytes requested */ - totalcount = count; - buf2 = &buffer[totalcount]; - length = length - count; - while (length > 0) { - count = (int) read (stream, buf2, (size_t) length); - if (count <= 0) /* EOF or read error */ - break; - totalcount = totalcount + count; - buf2 = &buffer[totalcount]; - length = length - count; - } - if (length != 0) { - fprintf (stderr, "WARNING: READ_SOCK read %d bytes instead of %d\n", - totalcount, totalcount + length); - } - return totalcount; - } -} /* end read_sock */ - - - -/*============================================================================= - -FUNCTION ipc_transport_get_line - -AUTHORS - - July 1991 Stefan Roth - -MODIFICATIONS - - NONE - -SUMMARY - - Main function for reading one line from a socket. Requires that the - socket be open. Lines are mostly SPICE code, but commands may also - be embedded in the socket data and they are interpreted by this function. - Therefore, this function may cause the socket to be closed. - -INTERFACES - - Called by: ipc_transport_terminate_server(); - (IPC.c) ipc_get_line(); - -RETURNED VALUE - - Ipc_Status_t - returns status of the read operation - -GLOBAL VARIABLES - - NONE - -NON-STANDARD FEATURES - - NONE - -=============================================================================*/ - - -Ipc_Status_t -ipc_transport_get_line ( - char *str, /* returns the result, null terminated */ - int *len, /* length of str passed IN and passed OUT */ - Ipc_Wait_t wait ) /* IN - wait or dont wait on incoming msg */ -{ - int count = 0; /* number of bytes read */ - int message_length; /* extracted from message header */ - - if (sock_state == IPC_SOCK_UNINITIALIZED) { - fprintf (stderr, - "ERROR: IPC: Attempted to read from uninitialized socket\n"); - return IPC_STATUS_ERROR; - } - - assert ((sock_state == IPC_SOCK_CONNECTED_TO_CLIENT) || - (sock_state == IPC_SOCK_INITIALIZED)); - - if (sock_state == IPC_SOCK_INITIALIZED) { - /* We have an open socket but have not connected to a client. */ - /* Accept a connection from a client. */ - msg_stream = accept (sock_desc, (struct sockaddr *)0, (socklen_t*)0); - - if (msg_stream == -1) { - fprintf (stderr, "ERROR: IPC: Server accepting request\n"); - perror ("ERROR: IPC"); - return IPC_STATUS_ERROR; - } - sock_state = IPC_SOCK_CONNECTED_TO_CLIENT; - } - /*-----------------------------------------------------------------------*/ - /* First read in the message header. */ - { - int flags; - flags = fcntl(msg_stream, F_GETFL, NULL); /* Blocking read mode */ - - if (wait == IPC_WAIT) { - /* Block here and wait for the next message */ - count = read_sock (msg_stream, str, SOCK_MSG_HDR_LEN, wait, flags); - if (count == 0) { - /* EOF, will this ever happen? */ - /* fprintf (stderr, "WARNING: IPC: Reached eof on socket\n"); */ - return handle_socket_eof (); - } - } else if (wait == IPC_NO_WAIT) { - /* Read message, but do not wait if none available. */ - - fcntl (msg_stream, F_SETFL, flags | O_NDELAY); - count = read_sock (msg_stream, str, SOCK_MSG_HDR_LEN, wait, flags); - - if (count == 0) { - /* EOF, will this ever happen? */ - /* fprintf (stderr, "WARNING: IPC: Reached eof on socket\n"); */ - return handle_socket_eof (); - } else if (count == -1) { - if (errno == EWOULDBLOCK) { - return IPC_STATUS_NO_DATA; - } - } - - } else { - /* Serious problem, since it is not reading anything. */ - fprintf (stderr, - "ERROR: IPC: invalid wait arg to ipc_transport_get_line\n"); - } - } - - /* Do more error checking on the read in values of the message header: */ - if (count == -1) { - fprintf (stderr, "ERROR: IPC: Reading from socket\n"); - perror ("ERROR: IPC"); - return IPC_STATUS_ERROR; - } else if (str[0] != BOL_CHAR) { - fprintf (stderr, - "ERROR: IPC: Did not find beginning of message header (%c)\n", - str[0]); - return IPC_STATUS_ERROR; - } else if ((message_length = (int) bytes_to_integer (str, 1)) == -1) { - /* fprintf (stderr, "WARNING: IPC: Reached eof on socket\n"); */ - return handle_socket_eof (); - } else if (message_length == 0) { - *len = 0; - return IPC_STATUS_NO_DATA; - -/* Invalid test... delete - wbk - } else if (message_length > *len) { - fprintf (stderr, - "ERROR: IPC: Buffer (%d) is too short for message (%d)\n", - *len, message_length); - return IPC_STATUS_ERROR; -*/ - - } - - /*-----------------------------------------------------------------------*/ - /* Now read in the message body. */ - /* Always block here since the message header was already read and */ - /* we must get the body. */ - - *len = message_length; - count = read_sock (msg_stream, str, message_length, IPC_WAIT, 0); - if (count == 0) { - /* EOF, will this ever happen? */ - /* fprintf (stderr, */ - /* "WARNING: IPC: Reached eof in message body on socket\n");*/ - return handle_socket_eof (); - } else if (count == -1) { - fprintf (stderr, "ERROR: IPC: reading message body from socket\n"); - perror ("ERROR: IPC"); - return IPC_STATUS_ERROR; - } - - /* Looks like we have a valid message here. Put in the string terminator. */ - *len = count; - str[count] = '\0'; - - return IPC_STATUS_OK; - -} /* end ipc_transport_get_line */ - - - -/*============================================================================= - -FUNCTION ipc_transport_send_line - -AUTHORS - - July 1991 Stefan Roth - -MODIFICATIONS - - NONE - -SUMMARY - Send a line of information. First sends a message header and - then the actual message body. - Error checking is done to make reasonably sure that the data was sent. - - -INTERFACES - - Called by: (IPC.c) ipc_flush (); - -RETURNED VALUE - - Ipc_Status_t - returns status of the send operation (typically - IPC_STATUS_ERROR or IPC_STATUS_OK). - - -GLOBAL VARIABLES - - NONE - -NON-STANDARD FEATURES - - NONE - -=============================================================================*/ - - -Ipc_Status_t -ipc_transport_send_line ( - char *str, /* IN - String to write */ - int len ) /* IN - Number of characters out of STR to write */ -{ - int count; /* Counts how many bytes were actually written */ - u_long u; /* 32-bit placeholder for transmission of LEN */ - char hdr_buff[5]; /* Buffer for building header message in */ - int i; /* Temporary counter */ - char *char_ptr; /* Pointer for int to bytes conversion */ - - if (sock_state != IPC_SOCK_CONNECTED_TO_CLIENT) { - fprintf (stderr, "ERROR: IPC: Attempt to write to non-open socket\n"); - return IPC_STATUS_ERROR; - } - - /* Write message body header with length: */ - hdr_buff[0] = BOL_CHAR; - u = htonl ((uint32_t) len); - char_ptr = (char *) &u; - for(i = 0; i < 4; i++) - hdr_buff[i+1] = char_ptr[i]; - - count = (int) write (msg_stream, hdr_buff, 5); - if (count != 5) { - fprintf (stderr, "ERROR: IPC: (%d) send line error 1\n", count); - return IPC_STATUS_ERROR; - } - - /* Write message body: */ - count = (int) write (msg_stream, str, (size_t) len); - if (count != len) { - fprintf (stderr, "ERROR: IPC: (%d) send line error 2\n", count); - return IPC_STATUS_ERROR; - } - - return IPC_STATUS_OK; -} /* end ipc_transport_send_line */ - - - -/*============================================================================= - -FUNCTION ipc_transport_terminate_server - -AUTHORS - - July 1991 Stefan Roth - -MODIFICATIONS - - NONE - -SUMMARY - - This function reads all pending incoming messages and discards them. - Reading continues until a read error occurs or EOF is reached, at which - time the socket is closed. - Note that this function does not actually close the socket. This is - done in ipc_transport_get_line, which is called in this function. - - In this function, the incoming line length is limited. See buffer below. - -INTERFACES - - Called by: (IPC.c) ipc_terminate_server(); - -RETURNED VALUE - - Ipc_Status_t - returns status of last read operation (always - IPC_STATUS_ERROR or IPC_STATUS_EOF). - -GLOBAL VARIABLES - - NONE - -NON-STANDARD FEATURES - - NONE - -=============================================================================*/ - - -Ipc_Status_t -ipc_transport_terminate_server (void) -{ - char buffer[17000]; /* temp buffer for incoming data */ - int len; /* placeholder var to as arg to function */ - Ipc_Status_t status; /* value to be returned from function */ - int max_size; /* Max length of buffer */ - - max_size = sizeof (buffer); - do { - len = max_size; - status = ipc_transport_get_line (buffer, &len, IPC_WAIT); - } while ((status != IPC_STATUS_ERROR) && - (status != IPC_STATUS_EOF)); - return status; -} - -#endif /* IPC_UNIX_SOCKETS */ diff --git a/src/xspice/ipc/ipcstdio.c b/src/xspice/ipc/ipcstdio.c deleted file mode 100644 index 229fff3ba..000000000 --- a/src/xspice/ipc/ipcstdio.c +++ /dev/null @@ -1,77 +0,0 @@ -/* - * Steve Tynor - * - * Generic Interprocess Communication module - * - * Used for debugging in absense of IPC interface. - * - */ - -#include "ngspice/ngspice.h" - -#ifdef IPC_DEBUG_VIA_STDIO - -#include - - -#include "ngspice/ipc.h" - -#include "ngspice/ipcproto.h" - -#include /* 12/1/97 jg */ - -/*---------------------------------------------------------------------------*/ -Ipc_Status_t ipc_transport_initialize_server ( - char *server_name, - Ipc_Mode_t m, - Ipc_Protocol_t p, - char *batch_filename ) -{ - NG_IGNORE(server_name); - NG_IGNORE(p); - NG_IGNORE(batch_filename); - - assert (m == IPC_MODE_INTERACTIVE); - printf ("INITIALIZE_SERVER\n"); - return IPC_STATUS_OK; -} - -/*---------------------------------------------------------------------------*/ -Ipc_Status_t ipc_transport_get_line ( - char *str, - int *len, - Ipc_Wait_t wait ) -{ - NG_IGNORE(wait); - - printf ("GET_LINE\n"); - fgets (str, 512, stdin); - char *tmp = strchr(str, '\n'); - if (tmp) - *tmp = '\0'; - *len = (int) strlen (str); - return IPC_STATUS_OK; -} - -/*---------------------------------------------------------------------------*/ -Ipc_Status_t ipc_transport_send_line ( - char *str, - int len ) -{ - int i; - - printf ("SEND_LINE: /"); - for (i = 0; i < len; i++) - putchar (str[i]); - printf ("/\n"); - return IPC_STATUS_OK; -} - -/*---------------------------------------------------------------------------*/ -Ipc_Status_t ipc_transport_terminate_server (void) -{ -return IPC_STATUS_OK; -} - - -#endif /* IPC_DEBUG_VIA_STDIO */ diff --git a/src/xspice/ipc/ipctiein.c b/src/xspice/ipc/ipctiein.c deleted file mode 100644 index d104158bb..000000000 --- a/src/xspice/ipc/ipctiein.c +++ /dev/null @@ -1,520 +0,0 @@ -/*============================================================================ -FILE IPCtiein.c - -MEMBER OF process XSPICE - -Public Domain - -Georgia Tech Research Corporation -Atlanta, Georgia 30332 -PROJECT A-8503 - -AUTHORS - - 9/12/91 Bill Kuhn - -MODIFICATIONS - - - -SUMMARY - - Provides a protocol independent interface between the simulator - and the IPC method used to interface to CAE packages. - -INTERFACES - - g_ipc (global variable) - - ipc_handle_stop() - ipc_handle_returni() - ipc_handle_mintime() - ipc_handle_vtrans() - ipc_send_stdout() - ipc_send_stderr() - ipc_send_std_files() - ipc_screen_name() - ipc_get_devices() - ipc_free_devices() - ipc_check_pause_stop() - -REFERENCED FILES - - None. - -NON-STANDARD FEATURES - - None. - -============================================================================*/ - - -#define CONFIG - -#include "ngspice/ngspice.h" -#include "ngspice/inpdefs.h" -#include "ngspice/gendefs.h" -#include "ngspice/cktdefs.h" -#include "bjt/bjtdefs.h" -#include "jfet/jfetdefs.h" -#include "mos1/mos1defs.h" -#include "mos2/mos2defs.h" -#include "mos3/mos3defs.h" -#include "ngspice/mifproto.h" -#include "ngspice/ipc.h" -#include "ngspice/ipctiein.h" - - - -/* -Global variable g_ipc is used by the SPICE mods that take care of -interprocess communications activities. -*/ - - -Ipc_Tiein_t g_ipc = { - IPC_FALSE, /* enabled */ - IPC_MODE_INTERACTIVE, /* mode */ - IPC_ANAL_DCOP, /* analysis mode */ - IPC_FALSE, /* parse_error */ - IPC_FALSE, /* run_error */ - IPC_FALSE, /* errchk_sent */ - IPC_FALSE, /* returni */ - 0.0, /* mintime */ - 0.0, /* lasttime */ - 0.0, /* cpu time */ - NULL, /* send array */ - NULL, /* log file */ - { /* vtrans struct */ - 0, /* size */ - NULL, /* vsrc_name array */ - NULL, /* device_name array */ - }, - IPC_FALSE, /* stop analysis */ -}; - - - -/* -ipc_handle_stop - -This function sets a flag in the g_ipc variable to signal that -a stop message has been received over the IPC channel. -*/ - -void ipc_handle_stop(void) -{ - g_ipc.stop_analysis = IPC_TRUE; -} - - -/* -ipc_handle_returni - -This function sets a flag in the g_ipc variable to signal that -a message has been received over the IPC channel specifying that -current values are to be returned in the results data sets. -*/ - -void ipc_handle_returni(void) -{ - g_ipc.returni = IPC_TRUE; -} - - -/* -ipc_handle_mintime - -This function sets a value in the g_ipc variable that specifies -how often data is to be returned as it is computed. If the -simulator takes timestep backups, data may still be returned -more often that that specified by 'mintime' so that glitches -are not missed. -*/ - -void ipc_handle_mintime(double time) -{ - g_ipc.mintime = time; -} - - - -/* -ipc_handle_vtrans - -This function processes arguments from a #VTRANS card received over -the IPC channel. The data on the card specifies that a particular -zero-valued voltage source name should be translated to the specified -instance name for which it was setup to monitor currents. -*/ - -void ipc_handle_vtrans( - char *vsrc, /* The name of the voltage source to be translated */ - char *dev) /* The device name the vsource name should be translated to */ -{ - int i; - int size; - - - if(g_ipc.vtrans.size == 0) { - g_ipc.vtrans.size = 1; - g_ipc.vtrans.vsrc_name = TMALLOC(char *, 1); - g_ipc.vtrans.device_name = TMALLOC(char *, 1); - g_ipc.vtrans.vsrc_name[0] = MIFcopy(vsrc); - g_ipc.vtrans.device_name[0] = MIFcopy(dev); - } - else { - g_ipc.vtrans.size++; - - size = g_ipc.vtrans.size; - i = g_ipc.vtrans.size - 1; - - g_ipc.vtrans.vsrc_name = TREALLOC(char *, g_ipc.vtrans.vsrc_name, size); - g_ipc.vtrans.device_name = TREALLOC(char *, g_ipc.vtrans.device_name, size); - g_ipc.vtrans.vsrc_name[i] = MIFcopy(vsrc); - g_ipc.vtrans.device_name[i] = MIFcopy(dev); - } -} - - - -/* -ipc_send_stdout - -This function sends the data written to stdout over the IPC channel. -This stream was previously redirected to a temporary file during -the simulation. -*/ - -void ipc_send_stdout(void) -{ - int c; - int len; - - char buf[IPC_MAX_LINE_LEN+1]; - - /* rewind the redirected stdout stream */ - rewind(stdout); - - /* Begin reading from the top of file and send lines */ - /* over the IPC channel. */ - - /* Don't send newlines. Also, if line is > IPC_MAX_LINE_LEN chars */ - /* we must wrap it because Mspice can't handle it */ - - len = 0; - while( (c=fgetc(stdout)) != EOF) { - if(c != '\n') { - buf[len] = (char) c; - len++; - } - if((c == '\n') || (len == IPC_MAX_LINE_LEN)) { - buf[len] = '\0'; - ipc_send_line(buf); - len = 0; - } - } - if(len > 0) { - buf[len] = '\0'; - ipc_send_line(buf); - } - - /* Finally, rewind file again to discard the data already sent */ - rewind(stdout); -} - - -/* -ipc_send_stderr - -This function sends the data written to stderr over the IPC channel. -This stream was previously redirected to a temporary file during -the simulation. -*/ - -void ipc_send_stderr(void) -{ - int c; - int len; - - char buf[IPC_MAX_LINE_LEN+1]; - - /* rewind the redirected stderr stream */ - rewind(stderr); - - /* Begin reading from the top of file and send lines */ - /* over the IPC channel. */ - - /* Don't send newlines. Also, if line is > IPC_MAX_LINE_LEN chars */ - /* we must wrap it because Mspice can't handle it */ - - len = 0; - while( (c=fgetc(stderr)) != EOF) { - if(c != '\n') { - buf[len] = (char) c; - len++; - } - if((c == '\n') || (len == IPC_MAX_LINE_LEN)) { - buf[len] = '\0'; - ipc_send_line(buf); - len = 0; - } - } - if(len > 0) { - buf[len] = '\0'; - ipc_send_line(buf); - } - - /* Finally, rewind file again to discard the data already sent */ - rewind(stderr); -} - - -/* -ipc_send_std_files - -This function sends the data written to stdout and stderr over the -IPC channel. These streams were previously redirected to temporary -files during the simulation. -*/ - -Ipc_Status_t ipc_send_std_files(void) -{ - ipc_send_stdout(); - ipc_send_stderr(); - - return(ipc_flush()); -} - - - -/* -ipc_screen_name - -This function screens names of instances and nodes to limit the -data returned over the IPC channel. -*/ - -Ipc_Boolean_t ipc_screen_name(char *name, char *mapped_name) -{ - char *endp; - int i; - int len; - long l; - - /* Return FALSE if name is in a subcircuit */ - for(i = 0; name[i] != '\0'; i++) { - if(name[i] == ':') - return(IPC_FALSE); - } - - /* Determine if name is numeric and what value is */ - l = strtol(name, &endp, 10); - - /* If numeric */ - if(*endp == '\0') { - /* Return FALSE if >100,000 -> added by ms_server in ATESSE 1.0 */ - if(l >= 100000) - return(IPC_FALSE); - /* Otherwise, copy name to mapped name and return true */ - else { - strcpy(mapped_name,name); - return(IPC_TRUE); - } - } - - /* If node is an internal node from a semiconductor (indicated by a */ - /* trailing #collector, #source, ...), do not return its current. */ - /* Otherwise, map to upper case and eliminate trailing "#branch" if any. */ - for(i = 0; name[i]; i++) { - if(name[i] == '#') { - if(strcmp(name + i, "#branch") == 0) - break; - else - return(IPC_FALSE); - } - else { - if(islower_c(name[i])) - mapped_name[i] = toupper_c(name[i]); - else - mapped_name[i] = name[i]; - } - } - mapped_name[i] = '\0'; - len = i; - - /* If len != 8 or 6'th char not equal to $, then doesn't need vtrans */ - /* Otherwise, translate to device name that it monitors */ - if(len != 8) - return(IPC_TRUE); - else if(name[5] != '$') - return(IPC_TRUE); - else { - /* Scan list of prefixes in VTRANS table and convert name */ - for(i = 0; i < g_ipc.vtrans.size; i++) { - if(strncmp(mapped_name, g_ipc.vtrans.vsrc_name[i], 5) == 0) { - strcpy(mapped_name, g_ipc.vtrans.device_name[i]); - return(IPC_TRUE); - } - } - return(IPC_TRUE); - } - -} - - - -/* -ipc_get_devices - -This function is used to setup the OUTinterface data structure that -determines what instances will have data returned over the IPC channel. -*/ - - -int ipc_get_devices( - CKTcircuit *ckt, /* The circuit structure */ - char *device, /* The device name as it appears in the info struct */ - char ***names, /* Array of name strings to be built */ - double **modtypes) /* Array of types to be built */ -{ - int index; - int num_instances; - GENmodel *model; - GENinstance *here; - char *inst_name; - int inst_name_len; - int i; - - BJTmodel *BJTmod; - JFETmodel *JFETmod; - MOS1model *MOS1mod; - MOS2model *MOS2mod; - MOS3model *MOS3mod; - - /* Initialize local variables */ - num_instances = 0; - - /* Get the index into the circuit structure linked list of models */ - index = INPtypelook(device); - - /* Iterate through all models of this type */ - for(model = ckt->CKThead[index]; model; model = model->GENnextModel) { - - /* Iterate through all instance of this model */ - for(here = model->GENinstances; here; here = here->GENnextInstance) { - - /* Get the name of the instance */ - inst_name = here->GENname; - inst_name_len = (int) strlen(inst_name); - - /* Skip if it is a inside a subcircuit */ - for(i = 0; i < inst_name_len; i++) - if(inst_name[i] == ':') - break; - if(i < inst_name_len) - continue; - - /* Otherwise, add the name to the list */ - num_instances++; - if(num_instances == 1) - *names = TMALLOC(char *, 1); - else - *names = TREALLOC(char *, *names, num_instances); - (*names)[num_instances-1] = MIFcopy(inst_name); - - /* Then get the type if it is a Q J or M */ - if(num_instances == 1) - *modtypes = TMALLOC(double, 1); - else - *modtypes = TREALLOC(double, *modtypes, num_instances); - - if(strcmp(device,"BJT") == 0) { - BJTmod = (BJTmodel *) model; - (*modtypes)[num_instances-1] = BJTmod->BJTtype; - } - else if(strcmp(device,"JFET") == 0) { - JFETmod = (JFETmodel *) model; - (*modtypes)[num_instances-1] = JFETmod->JFETtype; - } - else if(strcmp(device,"Mos1") == 0) { - MOS1mod = (MOS1model *) model; - (*modtypes)[num_instances-1] = MOS1mod->MOS1type; - } - else if(strcmp(device,"Mos2") == 0) { - MOS2mod = (MOS2model *) model; - (*modtypes)[num_instances-1] = MOS2mod->MOS2type; - } - else if(strcmp(device,"Mos3") == 0) { - MOS3mod = (MOS3model *) model; - (*modtypes)[num_instances-1] = MOS3mod->MOS3type; - } - else { - (*modtypes)[num_instances-1] = 1.0; - } - - } /* end for all instances */ - } /* end for all models */ - - return(num_instances); -} - - - -/* -ipc_free_devices - -This function frees temporary data created by ipc_get_devices(). -*/ - - -void ipc_free_devices( - int num_items, /* Number of things to free */ - char **names, /* Array of name strings to be built */ - double *modtypes) /* Array of types to be built */ -{ - int i; - - for(i = 0; i < num_items; i++) - { - FREE(names[i]); - names[i] = NULL; - } - - if(num_items > 0) - { - FREE(names); - FREE(modtypes); - - names = NULL; - modtypes = NULL; - } -} - - -/* -ipc_check_pause_stop - -This function is called at various times during a simulation to check -for incoming messages of the form >STOP or >PAUSE signaling that -simulation should be stopped or paused. Processing of the messages -is handled by ipc_get_line(). -*/ - -void ipc_check_pause_stop(void) -{ - char buf[1025]; - int len; - - /* If already seen stop analysis, don't call ipc_get_line, just return. */ - /* This is provided so that the function can be called multiple times */ - /* during the process of stopping */ - if(g_ipc.stop_analysis) - return; - - /* Otherwise do a non-blocking call to ipc_get_line() to check for messages. */ - /* We assume that the only possible messages at this point are >PAUSE */ - /* and >STOP, so we don't do anything with the returned text if any */ - ipc_get_line(buf, &len, IPC_NO_WAIT); -} - diff --git a/src/xspice/mif/Makefile.am b/src/xspice/mif/Makefile.am deleted file mode 100644 index 60b1b6fdf..000000000 --- a/src/xspice/mif/Makefile.am +++ /dev/null @@ -1,27 +0,0 @@ -## Process this file with automake to produce Makefile.in -# -# JW 3/9/01 - had a go and makeing an autoconf script. - -noinst_LTLIBRARIES = libmifxsp.la - -libmifxsp_la_SOURCES = \ - mif_inp2.c \ - mifgetmod.c \ - mifgetvalue.c \ - mifload.c \ - mifmpara.c \ - mifsetup.c \ - mifutil.c \ - mifask.c \ - mifmask.c \ - miftrunc.c \ - mifconvt.c \ - mifdelete.c \ - mifmdelete.c \ - mifdestr.c \ - mif.c - -AM_CPPFLAGS = @AM_CPPFLAGS@ -I$(top_srcdir)/src/include -AM_CFLAGS = $(STATIC) - -MAINTAINERCLEANFILES = Makefile.in diff --git a/src/xspice/mif/mif.c b/src/xspice/mif/mif.c deleted file mode 100644 index 6dac61cab..000000000 --- a/src/xspice/mif/mif.c +++ /dev/null @@ -1,59 +0,0 @@ -/*============================================================================ -FILE MIF.c - -MEMBER OF process XSPICE - -Public Domain - -Georgia Tech Research Corporation -Atlanta, Georgia 30332 -PROJECT A-8503 - -AUTHORS - - 9/12/91 Bill Kuhn - -MODIFICATIONS - - - -SUMMARY - - This file allocates globals used by various packages, including MIF. - -INTERFACES - - g_mif_info - -REFERENCED FILES - - None. - -NON-STANDARD FEATURES - - None. - -============================================================================*/ - - -#include "ngspice/mif.h" - -int MIFiSize = sizeof(MIFinstance); -int MIFmSize = sizeof(MIFmodel); - - -/* Allocate global used to pass info on analysis type, etc. from */ -/* SPICE to the MIF load routine */ - - -/* This must be initialized so that EVTfindvec can check for */ -/* NULL pointer in g_mif_info.ckt */ - -Mif_Info_t g_mif_info = { - { MIF_FALSE, MIF_FALSE, MIF_DC, MIF_ANALOG, 0.0,}, - NULL, - NULL, - NULL, - { 0.0, 0.0,}, - { MIF_FALSE, MIF_FALSE,}, -}; diff --git a/src/xspice/mif/mif_inp2.c b/src/xspice/mif/mif_inp2.c deleted file mode 100644 index bb603f78a..000000000 --- a/src/xspice/mif/mif_inp2.c +++ /dev/null @@ -1,1068 +0,0 @@ -/*============================================================================ -FILE MIF_INP2A.c - -MEMBER OF process XSPICE - -Public Domain - -Georgia Tech Research Corporation -Atlanta, Georgia 30332 -PROJECT A-8503 - -AUTHORS - - 9/12/91 Bill Kuhn - -MODIFICATIONS - - 11/19/12 H Vogt patch by Marcel (mhx) added - -SUMMARY - - This file contains the main routine for parsing code model lines - in the SPICE circuit description input deck. - -INTERFACES - - MIF_INP2A() - -REFERENCED FILES - - None. - -NON-STANDARD FEATURES - - None. - -============================================================================*/ - -/* #include "prefix.h" */ /* jgroves */ -#include "ngspice/ngspice.h" -#include -#include "ngspice/fteext.h" -#include "ngspice/ifsim.h" -#include "ngspice/inpdefs.h" -#include "ngspice/devdefs.h" -#include "ngspice/inpmacs.h" -#include "ngspice/fteext.h" - -#include "ngspice/mifproto.h" -#include "ngspice/mifparse.h" -#include "ngspice/mifdefs.h" -#include "ngspice/mifcmdat.h" - -#include "ngspice/evt.h" -#include "ngspice/evtproto.h" - -extern int *DEVicesfl; /*flags for the devices */ - -static void MIFinit_inst(MIFmodel *mdfast, MIFinstance *fast); - -static void MIFget_port_type( - CKTcircuit *ckt, /* circuit structure to put mod/inst structs in */ - INPtables *tab, /* symbol table for node names, etc. */ - struct card *current, /* MUST be named 'current' for spice macros */ - char **line, - char **next_token, - Mif_Token_Type_t *next_token_type, - Mif_Port_Type_t *port_type, - char **port_type_str, - Mif_Conn_Info_t *conn_info, /* for faster access to conn info struct */ - Mif_Status_t *status); - - -static void MIFget_port( - CKTcircuit *ckt, /* circuit structure to put mod/inst structs in */ - INPtables *tab, /* symbol table for node names, etc. */ - struct card *current, /* MUST be named 'current' for spice macros */ - MIFinstance *fast, /* pointer to instance struct */ - char **line, - char **next_token, - Mif_Token_Type_t *next_token_type, - Mif_Port_Type_t def_port_type, - char *def_port_type_str, - Mif_Conn_Info_t *conn_inf, /* for faster access to conn info struct */ - int conn_num, - int port_num, - Mif_Status_t *status); - -/** A local garbage collector ** -The functions copy, MIFgettok, and MIFget_token have been used virtuously, -without caring about memory leaks. This is a test with a local gc. -Add the list of malloced addresses alltokens. -Add a function copy_gc to copy and enter the address. -Add a function MIFgettok_gc like MIFgettok, but entering the address -Add a function MIFget_token_gc like MIFget_token, but entering the address -Add a function gc_end to delete all entries in alltokens. -Beware of addresses deleted elsewhere and use anew by malloc. -Some tokens should not be deleted here, they need another copying. -*/ -static char *MIFgettok_gc(char **line); -static char *MIFget_token_gc(char **s, Mif_Token_Type_t *type); -static char *copy_gc(char *in); -static void gc_start(void); -static void gc_end(void); - -#define MIFgettok MIFgettok_gc -#define MIFget_token MIFget_token_gc - -static char *alltokens[BSIZE_SP]; -static int curtoknr = 0; - -/* ********************************************************************* */ - - - -/* -MIF_INP2A - -This function is called by INPpas2() in SPICE to parse the new -``a'' type element cards and build the required circuit structures -for the associated code model device and instance. It first -checks the model name at the end of the element card to be sure -the model was found in pass 1 of the parser. If so, MIFgetMod is -called to process the .model card, creating the necessary -internal model structure and filling in the parameter value -information. Next, the instance structure is allocated. -Finally, the connections on the element card are scanned and the -connection information is filled-in on the instance structure, -and error checks are performed. -*/ - -/*--------------- Quick summary of algorithm ----------------------- - -1. Get the spice card. Place card string into variable 'line'. -2. Get the name of the instance and add it to the symbol table -3. Locate the last token on the line and assign it to variable 'model' -4. Locate the model from pass 1. If it hasn't been processed yet, - allocate structure in ckt for it, process the parameters, and return a - pointer to its structure in 'thismodel' -5. Get model type. -6. Create a new instance structure in ckt for this instance. ------- Process the connections: here's where it gets interesting. ----- -7. Reset 'line'. Then read instance name again to go over it. -8. Read initial token. -9 Start loop through port tokens: -10. If token is a %, then read next token to get port type - and save this port type. Otherwise, use default port type. -11. Check if connection is null. If so, iterate to next conn. -12. Get next token. Depending upon token type (scalar or array) do - the following: - -- Scalar: Process it, then continue loop. - -- Array: Loop through all tokens until ] is found & process tokens. - If token is a %, then read next token to get port type - Then continue outer loop over port tokens. -13. After looping through connection tokens, do error checks. - At this point, nothing should be left in 'line' - --------------------------------------------------------------------------*/ - -void -MIF_INP2A ( - CKTcircuit *ckt, /* circuit structure to put mod/inst structs in */ - INPtables *tab, /* symbol table for node names, etc. */ - struct card *current ) /* the card we are to parse */ -/* Must be called "current" for compatibility */ -/* with macros */ -{ - - /* parse a code model instance card */ - /* Aname */ - - char *line; /* the text line for this card */ - char *name; /* the name of the instance */ - char *model=NULL; /* the name of the model */ - - char *def_port_type_str = NULL; /* The default port type in string form */ - char *next_token; /* a token string */ - char *tmp_token; /* a token string */ - - int i; /* a loop counter */ - int j; /* a loop counter */ - int type; /* the type of the model for this instance */ - /* int num_conn; number of connections for this model */ - int error; /* for the IFC macro */ - - MIFmodel *mdfast; /* pointer to model struct */ - MIFinstance *fast[1]; /* pointer to instance struct */ - - INPmodel *thismodel; /* pointer to model struct */ - - Mif_Conn_Info_t *conn_info; /* for faster access to conn info struct */ - Mif_Param_Info_t *param_info; /* for faster access to param info struct */ - Mif_Port_Type_t def_port_type = MIF_VOLTAGE; /* the default port type */ - Mif_Status_t status; /* return status */ - Mif_Token_Type_t next_token_type; /* the type of the next token */ - -#ifdef TRACE - /* SDB debug statement */ - printf("In MIF_INP2A, line to process = %s . . . \n", current->line); -#endif - - /* get the line text from the card struct */ - line = current->line; - - /* reset the garbage collector */ - gc_start(); - - /* get the name of the instance and add it to the symbol table */ - name = copy(MIFgettok(&line)); - INPinsert(&name, tab); - - /* locate the last token on the line (i.e. model name) and put it into "model" */ - while(*line != '\0') { - model = MIFgettok(&line); - } - - /* make sure the model name was there. */ - if(model == NULL) { - LITERR("Missing model on A type device"); - gc_end(); - return; - } - - /* Locate model from pass 1. If it hasn't been processed yet, */ - /* allocate a structure in ckt for it, process its parameters */ - /* and return a pointer to its structure in 'thismodel' */ - current->error = MIFgetMod(ckt, model, &thismodel, tab); - if(current->error) { - gc_end(); - return; - } - - /* get the integer index into the DEVices data array for this */ - /* model */ - type = thismodel->INPmodType; - if((type >= DEVmaxnum) || DEVicesfl[type] == 0) { - LITERR("Invalid model type for A type device"); - gc_end(); - return; - } - - /* create a new structure for this instance in ckt */ - mdfast = (MIFmodel*) thismodel->INPmodfast; - IFC(newInstance, (ckt, (GENmodel*)mdfast, (GENinstance **)fast, name)); - - - /* initialize the code model specific elements of the inst struct */ - MIFinit_inst(mdfast, fast[0]); - - - /* *********************** */ - /* Process the connections */ - /* *********************** */ - - /* reset 'line', and then read instance name again. */ - line = current->line; - - tmp_token = MIFgettok(&line); /* read instance name again . . . .*/ - - /* OK -- now &line points to the first token after - the instance name and we are ready to process the connections - (netnames) - */ - - /* now get next token. It should be either a % token, - a [, or a connection (netname) which might be 'null'. - */ - next_token = MIFget_token(&line,&next_token_type); - - /* When we enter the loop, next_token holds the first thing *after* the instance name. - Upon each iteration, we start the iteration with next_token holding - the next *unprocessed* token. - The loop proceeds through the fixed number of connections expected, as defined in the - DEVices struct. - */ - for(i = 0; i < DEVices[type]->DEVpublic.num_conn; i++) { - - /* Check that the line is not finished yet. */ - if(*line == '\0') { - LITERR("Encountered end of line before all connections were found in model."); - gc_end(); - return; - } - - /* At this point, we have one of three possibilities: - 1. next_token holds a %, and &line points to either the port type identifier (id, vd, etc) - 2. next_token holds a netname and &line points to the thing *after* the first netname. - 3. next_token holds a [ indicating the start of an array of ports. - */ - - /* prepare a pointer for fast access to info about this connection */ - conn_info = &(DEVices[type]->DEVpublic.conn[i]); - - /* Now if we had a % token, get actual info about connection type. - Otherwise use default info */ - if(next_token_type == MIF_PERCENT_TOK) { /* we found a % */ - /* get the port type identifier and check it for validity */ - next_token = MIFget_token(&line, &next_token_type); - /* Note that MIFget_port_type eats the next token and advances the token pointer in line */ - MIFget_port_type(ckt, - tab, - current, - &line, - &next_token, - &next_token_type, - &def_port_type, - &def_port_type_str, - conn_info, - &status); - if (status == MIF_ERROR) { - gc_end(); - return; - } - } else { /* use the default port type for this connection */ - def_port_type = conn_info->default_port_type; - def_port_type_str = copy_gc(conn_info->default_type); - } - - /* At this point, next_token should be either a [ char, or should hold - the the first connection (netname) - */ - - /* set analog and event_driven flags on instance and model */ - if((def_port_type == MIF_DIGITAL) || - (def_port_type == MIF_USER_DEFINED)) { - fast[0]->event_driven = MIF_TRUE; - mdfast->event_driven = MIF_TRUE; - } else { - fast[0]->analog = MIF_TRUE; - mdfast->analog = MIF_TRUE; - } - - - /* check for a null connection and continue to next connection if found */ - if(next_token_type == MIF_NULL_TOK) { - /* make sure null is allowed */ - if(! conn_info->null_allowed) { - LITERR("NULL connection found where not allowed"); - gc_end(); - return; - } - - /* set the null flag to true */ - fast[0]->conn[i]->is_null = MIF_TRUE; - fast[0]->conn[i]->size = 0; - - /* eat the null token and continue to next connection */ - next_token = MIFget_token(&line,&next_token_type); - continue; /* iterate */ - } else { - /* set the null flag to false */ - fast[0]->conn[i]->is_null = MIF_FALSE; - } - - - /* ===== process connection as appropriate for scalar or array ====== */ - if(! conn_info->is_array) { /* a scalar connection - the simpler case */ - /* If we get to there, next_token should hold a netname in the port netlist. */ - /* First, do a couple of error checks */ - if(next_token_type == MIF_LARRAY_TOK) { - LITERR("ERROR - Scalar connection expected, [ found"); - printf("ERROR - Scalar connection expected, [ found. Returning . . ."); - gc_end(); - return; - } - if(next_token_type == MIF_RARRAY_TOK) { - LITERR("ERROR - Unexpected ]"); - printf("ERROR - Unexpected ]. Returning . . ."); - gc_end(); - return; - } - - /* If all OK, get the port data into the instance struct */ - /* allocating the port member of the instance struct as needed */ - /* Note that MIFget_port eats next_token, and advances the &line pointer.. */ - MIFget_port(ckt, - tab, - current, - fast[0], - &line, - &next_token, - &next_token_type, - def_port_type, - def_port_type_str, - conn_info, - i, /* connection index */ - 0, /* port index for scalar connection */ - &status); - - if (status == MIF_ERROR) { - gc_end(); - return; - } - - fast[0]->conn[i]->size = 1; - - /* when we leave here, next_token should hold the next, unprocessed netname */ - - } else { /* ====== the connection is an array - much to be done ... ====== */ - /* At this point, the next_token should be a [ */ - /* check for required leading array delim character [ and eat it if found */ - if(next_token_type != MIF_LARRAY_TOK) { - LITERR("Missing [, an array connection was expected"); - printf("Missing [, an array connection was expected. Returning . . ."); - gc_end(); - return; - } else /* eat the [ */ - next_token = MIFget_token(&line,&next_token_type); - - /*------ get and process ports until ] is encountered ------*/ - for(j = 0; - (next_token_type != MIF_RARRAY_TOK) && - (*line != '\0'); - j++) { - /********** mhx Friday, August 19, 2011, 15:08 begin *** - Now if we had a % token, get actual info about connection type, - or else use the port type for this connection that was setup BEFORE the '[' token. - Do NOT use conn_info->default_port_type! */ - if (next_token_type == MIF_PERCENT_TOK) { - next_token = MIFget_token (&line,&next_token_type); - MIFget_port_type(ckt, - tab, - current, - &line, - &next_token, - &next_token_type, - &def_port_type, - &def_port_type_str, - conn_info, - &status); - if (status == MIF_ERROR) { - gc_end(); - return; - } - } - /* At this point, next_token should be either a [ or ] char (not allowed), - or hold a non-null connection (netname) */ - if(next_token_type == MIF_NULL_TOK) { - LITERR("NULL connection found where not allowed"); - printf("NULL connection found where not allowed. Returning . . ."); - gc_end(); - return; - } - if(next_token_type == MIF_LARRAY_TOK) { - LITERR("ERROR - Unexpected [ - Arrays of arrays not allowed"); - printf("ERROR - Unexpected [ - Arrays of arrays not allowed. Returning . . ."); - gc_end(); - return; - } - if(next_token_type == MIF_RARRAY_TOK) { - LITERR("ERROR - Unexpected ]"); - printf("ERROR - Unexpected ]. Returning . . ."); - gc_end(); - return; - } - /********** mhx Friday, August 19, 2011, 15:08 end ***/ - - /* If all OK, get the port nodes into the instance struct */ - /* allocating the port member of the instance struct as needed */ - /* Note that MIFget_port eats next_token and advances &line by one. */ - MIFget_port(ckt, - tab, - current, - fast[0], - &line, - &next_token, - &next_token_type, - def_port_type, - def_port_type_str, - conn_info, - i, /* connection index */ - j, /* port index */ - &status); - - if (status == MIF_ERROR) { - gc_end(); - return; - } - } /*------ end of for loop until ] is encountered ------*/ - - /* At this point, next_token should hold the next token after the - port netnames. This token should be a ]. */ - - /* make sure we exited because the end of the array connection - was reached. - */ - if(*line == '\0') { - LITERR("Missing ] in array connection"); - gc_end(); - return; - } - - /* record the number of ports found for this connection */ - if(j < 1) { - LITERR("Array connection must have at least one port"); - gc_end(); - return; - } - fast[0]->conn[i]->size = j; - - /* At this point, the next time we get_token, we should get a % or a net name. - We'll do that now, since when we enter the loop, we expect next_token - to hold the next unprocessed token. - */ - next_token = MIFget_token(&line, &next_token_type); - - } /* ====== array connection processing ====== */ - - /* be careful about putting stuff here, there is a 'continue' used */ - /* in the processing of NULL connections above */ - /* At this point, next_token should hold the next unprocessed token. */ - - } /******* for number of connections *******/ - - - /* *********************** */ - /* Error Checks */ - /* *********************** */ - - /* check for too many connections */ - - /* At this point, we should have eaten all the net connections, and left - next_token holding the model name. &line should be empty. - */ - - if(strcmp(next_token, model) != 0) { - LITERR("Too many connections -- expecting model name but encountered other tokens."); - gc_end(); - return; - } - - /* check connection constraints */ - - for(i = 0; i < DEVices[type]->DEVpublic.num_conn; i++) { - - conn_info = &(DEVices[type]->DEVpublic.conn[i]); - - if( (fast[0]->conn[i]->is_null) && - (! conn_info->null_allowed) ) { - LITERR("Null found for connection where not allowed"); - gc_end(); - return; - } - - if(conn_info->has_lower_bound) { - if(fast[0]->conn[i]->size < conn_info->lower_bound) { - LITERR("Too few ports in connection"); - gc_end(); - return; - } - } - - if(conn_info->has_upper_bound) { - if(fast[0]->conn[i]->size > conn_info->upper_bound) { - LITERR("Too many ports in connection"); - gc_end(); - return; - } - } - } - - /* check model parameter constraints */ - /* some of these should probably be done in MIFgetMod() */ - /* to prevent multiple error messages */ - - for(i = 0; i < DEVices[type]->DEVpublic.num_param; i++) { - - param_info = &(DEVices[type]->DEVpublic.param[i]); - - if(mdfast->param[i]->is_null) { - if(! param_info->has_default) { - LITERR("Parameter on model has no default"); - gc_end(); - return; - } else if((param_info->is_array) && (! param_info->has_conn_ref)) { - LITERR("Defaulted array parameter must have associated array connection"); - gc_end(); - return; - } - } - if((! mdfast->param[i]->is_null) && (param_info->is_array)) { - if(param_info->has_conn_ref) { - if(fast[0]->conn[param_info->conn_ref]->size != fast[0]->param[i]->size) { - LITERR("Array parameter size on model does not match connection size"); - gc_end(); - return; - } - } - } - } - gc_end(); -} - - - -/* ********************************************************************* */ - - - -/* -MIFinit_inst - -This function initializes the code model specific elements of the inst struct. -*/ - - -static void MIFinit_inst( - MIFmodel *mdfast, /* The model the instance is derived from */ - MIFinstance *fast) /* The instance to initialize */ -{ - - int mod_type; /* type of this model */ - - Mif_Conn_Info_t *conn_info; - - int i; - - - /* get an index into the DEVices information structure */ - - mod_type = mdfast->MIFmodType; - - - /* allocate code model connector data in instance struct */ - - fast->num_conn = DEVices[mod_type]->DEVpublic.num_conn; - fast->conn = TMALLOC(Mif_Conn_Data_t *, fast->num_conn); - - for(i = 0; i < fast->num_conn; i++) - fast->conn[i] = TMALLOC(Mif_Conn_Data_t, 1); - - /* initialize code model connector data */ - for(i = 0; i < fast->num_conn; i++) { - conn_info = &(DEVices[mod_type]->DEVpublic.conn[i]); - fast->conn[i]->name = conn_info->name; - fast->conn[i]->description = conn_info->description; - fast->conn[i]->is_null = MIF_TRUE; - fast->conn[i]->size = 0; - fast->conn[i]->port = NULL; - switch(conn_info->direction) { - case MIF_INOUT: - fast->conn[i]->is_input = MIF_TRUE; - fast->conn[i]->is_output = MIF_TRUE; - break; - case MIF_IN: - fast->conn[i]->is_input = MIF_TRUE; - fast->conn[i]->is_output = MIF_FALSE; - break; - case MIF_OUT: - fast->conn[i]->is_input = MIF_FALSE; - fast->conn[i]->is_output = MIF_TRUE; - break; - default: - printf("\nERROR - Impossible direction type in MIFinit_inst\n"); - controlled_exit(1); - } - } - - - /* allocate and copy instance variable data to the instance */ - - fast->num_inst_var = DEVices[mod_type]->DEVpublic.num_inst_var; - fast->inst_var = TMALLOC(Mif_Inst_Var_Data_t *, fast->num_inst_var); - - for(i = 0; i < fast->num_inst_var; i++) { - - fast->inst_var[i] = TMALLOC(Mif_Inst_Var_Data_t, 1); - - if(DEVices[mod_type]->DEVpublic.inst_var[i].is_array) { - fast->inst_var[i]->size = 0; - fast->inst_var[i]->element = NULL; - /* The code model allocates space for the data and sets the size */ - } else { - fast->inst_var[i]->size = 1; - fast->inst_var[i]->element = TMALLOC(Mif_Value_t, 1); - } - } - - - /* copy model parameter data to the instance */ - - fast->num_param = mdfast->num_param; - fast->param = mdfast->param; - - /* initialize any additional instance data */ - fast->initialized = MIF_FALSE; - fast->analog = MIF_FALSE; - fast->event_driven = MIF_FALSE; - fast->inst_index = 0; - fast->callback = NULL; -} - - - -/* ********************************************************************* */ - - - -/* -MIFget_port_type - -This function gets the port type identifier and checks it for validity. It also -replaces false default information in conn_info with the real info based upon -the discovered port type string. - -When we call it, we expect that the next token type (sent from above) -should be the port type (MIF_STRING_TOK type). That is, we should be sitting right -on the def of the port type (i.e. %vnam, %vd, %id, etc.) Note that the parser -should have stripped the % already. - -Upon return, this fcn should leave next_token holding the token *after* the -port type (i.e. the thing after vnam, v, vd, id, etc). -*/ - - -static void -MIFget_port_type( - CKTcircuit *ckt, /* circuit structure to put mod/inst structs in */ - INPtables *tab, /* symbol table for node names, etc. */ - struct card *current, /* MUST be named 'current' for spice macros */ - char **line, - char **next_token, - Mif_Token_Type_t *next_token_type, - Mif_Port_Type_t *port_type, - char **port_type_str, - Mif_Conn_Info_t *conn_info, /* for faster access to conn info struct */ - Mif_Status_t *status) -{ - - Mif_Boolean_t found_type; - char *temp; - - int i; - - NG_IGNORE(ckt); - NG_IGNORE(tab); - - if(**line == '\0') { - LITERR("Missing connections on A device"); - *status = MIF_ERROR; - return; - } - - if(*next_token_type != MIF_STRING_TOK) { - LITERR("Invalid port type specifier"); - *status = MIF_ERROR; - return; - } - - /* OK, so get the port type string from the token and read next token */ - - temp = *next_token; - *next_token = MIFget_token(line, next_token_type); - - /* check port type for validity */ - - found_type = MIF_FALSE; - - for(i = 0; i < conn_info->num_allowed_types; i++) { - if(strcmp(temp, conn_info->allowed_type_str[i]) == 0) { - found_type = MIF_TRUE; - *port_type = conn_info->allowed_type[i]; - *port_type_str = temp; - break; - } - } - - if(! found_type) { - LITERR("Port type is invalid"); - *status = MIF_ERROR; - } else { - - /* Fix by SDB so that the netlist parser uses the actual nature - of the port instead of the default state to decide if it is an array. */ - /* - if ( (*port_type == MIF_DIFF_VOLTAGE) || - (*port_type == MIF_DIFF_CURRENT) || - (*port_type == MIF_DIFF_CONDUCTANCE) || - (*port_type == MIF_DIFF_RESISTANCE) ) { - conn_info->is_array = 1; - } - */ - - *status = MIF_OK; - } -} - - - - -/* ********************************************************************* */ - - -/* -MIFget_port - -This function processes a port being parsed, either single ended, -or both connections of a differential. - -When we call this fcn, next_token should be the *first* netname in the port -net list. Depending upon the type of port, this fcn should eat the appropriate -number of net tokens. - -When we leave this fcn, next_token should hold the next token after the last -netname processed. -*/ - - - - -static void -MIFget_port( - CKTcircuit *ckt, /* circuit structure to put mod/inst structs in */ - INPtables *tab, /* symbol table for node names, etc. */ - struct card *current, /* MUST be named 'current' for spice macros */ - MIFinstance *fast, /* pointer to instance struct */ - char **line, - char **next_token, - Mif_Token_Type_t *next_token_type, - Mif_Port_Type_t def_port_type, - char *def_port_type_str, - Mif_Conn_Info_t *conn_info, /* for faster access to conn info struct */ - int conn_num, - int port_num, - Mif_Status_t *status) - -{ - - - CKTnode *pos_node[1]; /* positive connection node */ - CKTnode *neg_node[1]; /* negative connection node */ - - char *node; - - - /* allocate space in the instance data struct for this port */ - if(port_num == 0) { - fast->conn[conn_num]->port = TMALLOC(Mif_Port_Data_t *, 1); - fast->conn[conn_num]->port[0] = TMALLOC(Mif_Port_Data_t, 1); - } else { - fast->conn[conn_num]->port = TREALLOC(Mif_Port_Data_t *, fast->conn[conn_num]->port, port_num + 1); - fast->conn[conn_num]->port[port_num] = TMALLOC(Mif_Port_Data_t, 1); - } - - - /* store the port type information in the instance struct */ - fast->conn[conn_num]->port[port_num]->type = def_port_type; - fast->conn[conn_num]->port[port_num]->type_str = copy(def_port_type_str); - - /* check for a leading tilde on digital ports */ - if(*next_token_type == MIF_TILDE_TOK) { - if((def_port_type != MIF_DIGITAL) && (def_port_type != MIF_USER_DEFINED)) { - LITERR("ERROR - Tilde not allowed on analog nodes"); - *status = MIF_ERROR; - return; - } - fast->conn[conn_num]->port[port_num]->invert = MIF_TRUE; - - /* eat the tilde and get the next token */ - *next_token = MIFget_token(line, next_token_type); - if(**line == '\0') { - LITERR("ERROR - Not enough ports"); - *status = MIF_ERROR; - return; - } - } else - fast->conn[conn_num]->port[port_num]->invert = MIF_FALSE; - - - /* check for null port */ - if(*next_token_type == MIF_NULL_TOK) { - - /* make sure null is allowed */ - if(! conn_info->null_allowed) { - LITERR("NULL connection found where not allowed"); - *status = MIF_ERROR; - return; - } - - /* set the (port specific) null flag to true */ - fast->conn[conn_num]->port[port_num]->is_null = MIF_TRUE; - - /* set input value to zero in case user code model refers to it */ - fast->conn[conn_num]->port[port_num]->input.rvalue = 0.0; - - /* eat the null token and return */ - *next_token = MIFget_token(line, next_token_type); - *status = MIF_OK; - return; - } else { - /* set the (port specific) null flag to false */ - fast->conn[conn_num]->port[port_num]->is_null = MIF_FALSE; - } - - - /* next token must be a node/instance identifier ... */ - if(*next_token_type != MIF_STRING_TOK) { - LITERR("ERROR - Expected node/instance identifier"); - *status = MIF_ERROR; - return; - } - - /* Get the first connection or the voltage source name */ - - switch(def_port_type) { - - case MIF_VOLTAGE: - case MIF_DIFF_VOLTAGE: - case MIF_CURRENT: - case MIF_DIFF_CURRENT: - case MIF_CONDUCTANCE: - case MIF_DIFF_CONDUCTANCE: - case MIF_RESISTANCE: - case MIF_DIFF_RESISTANCE: - - *next_token = copy(*next_token); - /* Call the spice3c1 function to put this node in the node list in ckt */ - INPtermInsert(ckt, next_token, tab, pos_node); - - /* store the equation number and node identifier */ - /* This is the equivalent of what CKTbindNode() does in 3C1 */ - fast->conn[conn_num]->port[port_num]->pos_node_str = *next_token; - fast->conn[conn_num]->port[port_num]->smp_data.pos_node = pos_node[0]->number; - - break; - - case MIF_VSOURCE_CURRENT: - *next_token = copy(*next_token); - /* Call the spice3c1 function to put this vsource instance name in */ - /* the symbol table */ - INPinsert(next_token, tab); - - /* Now record the name of the vsource instance for processing */ - /* later by MIFsetup. This is equivalent to what INPpName */ - /* does in 3C1. Checking to see if the source is present in */ - /* the circuit is deferred to MIFsetup as is done in 3C1. */ - fast->conn[conn_num]->port[port_num]->vsource_str = *next_token; - - break; - - case MIF_DIGITAL: - case MIF_USER_DEFINED: - /* Insert data into event-driven info structs */ - EVTtermInsert(ckt, - fast, - *next_token, - def_port_type_str, - conn_num, - port_num, - &(current->error)); - if(current->error) { - *status = MIF_ERROR; - return; - } - break; - - default: - - /* impossible connection type */ - LITERR("INTERNAL ERROR - Impossible connection type"); - *status = MIF_ERROR; - return; - } - - /* get the next token */ - *next_token = MIFget_token(line, next_token_type); - - /* get other node if appropriate */ - switch(def_port_type) { - - case MIF_VOLTAGE: - case MIF_CURRENT: - case MIF_CONDUCTANCE: - case MIF_RESISTANCE: - /* These are single ended types, so default other node to ground */ - // This don't work dickhead, INPtermInsert tries to FREE(&node) K.A. Feb 27, 2000 - // which was not allocted - node = TMALLOC(char, 2);// added by K.A. march 5th 2000 - - *node = '0'; // added by K.A. March 5th 2000 - node[1] ='\0'; // added by K.A. March 5th 2000 - - INPtermInsert(ckt, &node, tab, neg_node); - - fast->conn[conn_num]->port[port_num]->neg_node_str = node; - fast->conn[conn_num]->port[port_num]->smp_data.neg_node = neg_node[0]->number; - break; - - case MIF_DIFF_VOLTAGE: - case MIF_DIFF_CURRENT: - case MIF_DIFF_CONDUCTANCE: - case MIF_DIFF_RESISTANCE: - /* These are differential types, so get the other node */ - if((**line == '\0') || (*next_token_type != MIF_STRING_TOK)) { - LITERR("ERROR - Expected node identifier"); - *status = MIF_ERROR; - return; - } - *next_token = copy(*next_token); - INPtermInsert(ckt, next_token, tab, neg_node); - fast->conn[conn_num]->port[port_num]->neg_node_str = *next_token; - fast->conn[conn_num]->port[port_num]->smp_data.neg_node = neg_node[0]->number; - *next_token = MIFget_token(line, next_token_type); - break; - - default: - /* must be vsource name, digital, or user defined, so there is no other node */ - break; - - } - - *status = MIF_OK; - return; -} - - -#undef MIFgettok -#undef MIFget_token - -static -char *MIFgettok_gc(char **line) -{ - char *newtok = MIFgettok(line); - alltokens[curtoknr++] = newtok; - return newtok; -} - -static -char *MIFget_token_gc(char **s, Mif_Token_Type_t *type) -{ - char *newtok = MIFget_token(s, type); - alltokens[curtoknr++] = newtok; - return newtok; -} - -static -void gc_start(void) -{ - int i; - for (i = 0; i < BSIZE_SP; i++) - alltokens[i] = NULL; - curtoknr = 0; -} - -static -void gc_end(void) -{ - int i, j; - for (i = 0; i < BSIZE_SP; i++) { - /* We have multiple entries with the same address */ - for (j = i + 1; j < curtoknr; j++) - if (alltokens[i] == alltokens[j]) - alltokens[j] = NULL; - tfree(alltokens[i]); - } -} - -char * -copy_gc(char* in) -{ - char *newtok = copy(in); - alltokens[curtoknr++] = newtok; - return newtok; -} - - - - diff --git a/src/xspice/mif/mifask.c b/src/xspice/mif/mifask.c deleted file mode 100644 index 8a9521cac..000000000 --- a/src/xspice/mif/mifask.c +++ /dev/null @@ -1,224 +0,0 @@ -/*============================================================================ -FILE MIFask.c - -MEMBER OF process XSPICE - -Public Domain - -Georgia Tech Research Corporation -Atlanta, Georgia 30332 -PROJECT A-8503 - -AUTHORS - - 9/12/91 Bill Kuhn - -MODIFICATIONS - - - -SUMMARY - - This file contains the function used by nutmeg to request the - value of a code model static var. - -INTERFACES - - MIFask() - -REFERENCED FILES - - None. - -NON-STANDARD FEATURES - - None. - -============================================================================*/ - -/* #include "prefix.h" */ -#include "ngspice/ngspice.h" -#include -//#include "CONST.h" -//#include "util.h" -#include "ngspice/ifsim.h" -#include "ngspice/devdefs.h" -#include "ngspice/sperror.h" - -#include - -#include "ngspice/mifproto.h" -#include "ngspice/mifdefs.h" - -/* #include "suffix.h" */ - - -/* -MIFask - -This function is called by SPICE/Nutmeg to query the value of a -parameter on an instance. It locates the value of the parameter -in the instance structure and converts the value into the IFvalue -structure understood by Nutmeg. For code models, this function -is provided to allow output of Instance Variables defined in the -code model's Interface Specification. -*/ - - -int MIFask( - CKTcircuit *ckt, /* The circuit structure */ - GENinstance *inInst, /* The instance to get the value from */ - int which, /* The parameter to get */ - IFvalue *value, /* The value returned */ - IFvalue *select) /* Unused */ -{ - - MIFinstance *inst; - MIFmodel *model; - int mod_type; - int value_type; - int i; - int size; - - int inst_index; - - Mif_Boolean_t is_array; - - NG_IGNORE(ckt); - NG_IGNORE(select); - - /* Arrange for access to MIF specific data in the instance */ - inst = (MIFinstance *) inInst; - - /* Arrange for access to MIF specific data in the model */ - model = MIFmodPtr(inst); - - - /* Get model type */ - mod_type = model->MIFmodType; - if((mod_type < 0) || (mod_type >= DEVmaxnum)) - return(E_BADPARM); - - /* Adjust parameter tag to actual index into inst info array */ - inst_index = which - model->num_param; - - /* Check instance index for validity */ - if((inst_index < 0) || (inst_index >= inst->num_inst_var)) - return(E_BADPARM); - - /* get value type to know which members of unions to access */ - value_type = DEVices[mod_type]->DEVpublic.instanceParms[inst_index].dataType; - value_type &= IF_VARTYPES; - - - /* determine if the parameter is an array or not */ - is_array = value_type & IF_VECTOR; - - - /* Transfer the values to the SPICE3C1 value union from the param elements */ - /* This is analagous to what SPICE3 does with other device types */ - - - if(! is_array) { - - switch(value_type) { - - case IF_FLAG: - value->iValue = inst->inst_var[inst_index]->element[0].bvalue; - break; - - case IF_INTEGER: - value->iValue = inst->inst_var[inst_index]->element[0].ivalue; - break; - - case IF_REAL: - value->rValue = inst->inst_var[inst_index]->element[0].rvalue; - break; - - case IF_STRING: - /* Make copy of string. We don't trust caller to not free it */ - /* These copies could get expensive! */ - value->sValue = MIFcopy(inst->inst_var[inst_index]->element[0].svalue); - break; - - case IF_COMPLEX: - /* we don't trust the caller to have a parallel complex structure */ - /* so copy the real and imaginary parts explicitly */ - value->cValue.real = inst->inst_var[inst_index]->element[0].cvalue.real; - value->cValue.imag = inst->inst_var[inst_index]->element[0].cvalue.imag; - break; - - default: - return(E_BADPARM); - - } - } - else { /* it is an array */ - - size = inst->inst_var[inst_index]->size; - if(size < 0) - size = 0; - - value->v.numValue = size; - - switch(value_type) { - - /* Note that we malloc space each time this function is called. */ - /* This is what TRAask.c does, so we do it too, even though */ - /* we don't know if it is ever freed... */ - - case IF_FLAGVEC: - if(size <= 0) - break; - value->v.vec.iVec = TMALLOC(int, size); - for(i = 0; i < size; i++) - value->v.vec.iVec[i] = inst->inst_var[inst_index]->element[i].bvalue; - break; - - case IF_INTVEC: - if(size <= 0) - break; - value->v.vec.iVec = TMALLOC(int, size); - for(i = 0; i < size; i++) - value->v.vec.iVec[i] = inst->inst_var[inst_index]->element[i].ivalue; - break; - - case IF_REALVEC: - if(size <= 0) - break; - value->v.vec.rVec = TMALLOC(double, size); - for(i = 0; i < size; i++) - value->v.vec.rVec[i] = inst->inst_var[inst_index]->element[i].rvalue; - break; - - case IF_STRINGVEC: - if(size <= 0) - break; - value->v.vec.sVec = TMALLOC(char *, size); - for(i = 0; i < size; i++) - /* Make copy of string. We don't trust caller to not free it */ - /* These copies could get expensive! */ - value->v.vec.sVec[i] = MIFcopy(inst->inst_var[inst_index]->element[i].svalue); - break; - - case IF_CPLXVEC: - if(size <= 0) - break; - /* we don't trust the caller to have a parallel complex structure */ - /* so copy the real and imaginary parts explicitly */ - value->v.vec.cVec = TMALLOC(IFcomplex, size); - for(i = 0; i < size; i++) { - value->v.vec.cVec[i].real = inst->inst_var[inst_index]->element[i].cvalue.real; - value->v.vec.cVec[i].imag = inst->inst_var[inst_index]->element[i].cvalue.imag; - } - break; - - default: - return(E_BADPARM); - - } /* end switch */ - - } /* end else */ - - return(OK); -} diff --git a/src/xspice/mif/mifconvt.c b/src/xspice/mif/mifconvt.c deleted file mode 100644 index a3b07c017..000000000 --- a/src/xspice/mif/mifconvt.c +++ /dev/null @@ -1,146 +0,0 @@ -/*============================================================================ -FILE MIFconvTest.c - -MEMBER OF process XSPICE - -Public Domain - -Georgia Tech Research Corporation -Atlanta, Georgia 30332 -PROJECT A-8503 - -AUTHORS - - 9/12/91 Bill Kuhn - -MODIFICATIONS - - - -SUMMARY - - This file contains the function used to check that internal - states of a code model have converged. These internal states - are typically integration states. - -INTERFACES - - MIFconvTest() - -REFERENCED FILES - - None. - -NON-STANDARD FEATURES - - None. - -============================================================================*/ - -/* #include "prefix.h" */ -#include "ngspice/ngspice.h" -#include -#include "ngspice/cktdefs.h" -#include "ngspice/sperror.h" - -//#include "util.h" -#include "ngspice/devdefs.h" -//#include "CONST.h" -#include "ngspice/trandefs.h" -#include - -#include "ngspice/enh.h" - -#include "ngspice/mifproto.h" -#include "ngspice/mifparse.h" -#include "ngspice/mifdefs.h" -#include "ngspice/mifcmdat.h" - -/* #include "suffix.h" */ - - - - -/* -MIFconvTest - -This function is called by the CKTconvTest() driver function to -check convergence of any states owned by instances of a -particular code model type. It loops through all models of that -type and all instances of each model. For each instance, it -looks in the instance structure to determine if any variables -allocated by cm_analog_alloc() have been registered by a call to -cm_analog_converge() to have their convergence tested. If so, the value -of the function at the last iteration is compared with the value -at the current iteration to see if it has converged to within the -same delta amount used in node convergence checks (as defined by -SPICE 3C1). -*/ - - -int MIFconvTest( - GENmodel *inModel, /* The head of the model list */ - CKTcircuit *ckt) /* The circuit structure */ -{ - - MIFmodel *model; - MIFinstance *here; - - int i; - - double value; - double last_value; - - char *byte_aligned_double_ptr; - double *double_ptr; - - double tol; - - Mif_Boolean_t gotone = MIF_FALSE; - - - /* Setup for access into MIF specific model data */ - model = (MIFmodel *) inModel; - - /* loop through all models of this type */ - for( ; model != NULL; model = MIFnextModel(model)) { - - /* Loop through all instances of this model */ - for(here = MIFinstances(model); here != NULL; here = MIFnextInstance(here)) { - - /* Loop through all items registered for convergence */ - for(i = 0; i < here->num_conv; i++) { - - /* Get the current value and the last value */ - byte_aligned_double_ptr = (char *) ckt->CKTstate0; - byte_aligned_double_ptr += here->conv[i].byte_index; - double_ptr = (double *) byte_aligned_double_ptr; - value = *double_ptr; - - last_value = here->conv[i].last_value; - - /* If none have failed so far, check convergence */ - if(! gotone) { - - tol = ckt->CKTreltol * MAX(fabs(value), fabs(last_value)) - + ckt->CKTabstol; - if (fabs(value - last_value) > tol) { - if(ckt->enh->conv_debug.report_conv_probs) { - ENHreport_conv_prob(ENH_ANALOG_INSTANCE, - here->MIFname, - ""); - } - ckt->CKTnoncon++; - gotone = MIF_TRUE; - } - } - - /* Rotate the current value to last_value */ - here->conv[i].last_value = value; - - } /* end for number of conv items */ - } /* end for all instances */ - } /* end for all models of this type */ - - return(OK); -} diff --git a/src/xspice/mif/mifdelete.c b/src/xspice/mif/mifdelete.c deleted file mode 100644 index 24291a13d..000000000 --- a/src/xspice/mif/mifdelete.c +++ /dev/null @@ -1,189 +0,0 @@ -/*============================================================================ -FILE MIFdelete.c - -MEMBER OF process XSPICE - -Public Domain - -Georgia Tech Research Corporation -Atlanta, Georgia 30332 -PROJECT A-8503 - -AUTHORS - - 9/12/91 Bill Kuhn - -MODIFICATIONS - - - -SUMMARY - - This file contains the function used by SPICE to delete an - instance and its allocated data structures from the internal - circuit description data structures. - -INTERFACES - - MIFdelete() - -REFERENCED FILES - - None. - -NON-STANDARD FEATURES - - None. - -============================================================================*/ - -#include "ngspice/ngspice.h" -#include "ngspice/sperror.h" -#include "ngspice/gendefs.h" - -#include "ngspice/mifproto.h" -#include "ngspice/mifdefs.h" - -#if defined(_MSC_VER) || defined(__MINGW32__) -#include "ngspice/mifparse.h" -#endif - -#include "ngspice/suffix.h" -#include "ngspice/devdefs.h" - - -/* -MIFdelete - -This function deletes a particular instance from the linked list -of instance structures, freeing all dynamically allocated memory -used by the instance structure. -*/ - -int -MIFdelete(GENinstance *gen_inst) -{ - int i; - int j; - int k; - - int num_conn; - int num_port; - int num_inst_var; - - MIFinstance *here = (MIFinstance *) gen_inst; - - /*******************************************/ - /* instance->callback(..., MIF_CB_DESTROY) */ - /*******************************************/ - - if (here->callback) { - Mif_Private_t cm_data; - - /* Prepare the structure to be passed to the code model */ - cm_data.num_conn = here->num_conn; - cm_data.conn = here->conn; - cm_data.num_param = here->num_param; - cm_data.param = here->param; - cm_data.num_inst_var = here->num_inst_var; - cm_data.inst_var = here->inst_var; - cm_data.callback = &(here->callback); - - here->callback(&cm_data, MIF_CB_DESTROY); - } - - /*******************************/ - /* Free the instance structure */ - /*******************************/ - - /* Loop through all connections on the instance */ - /* and dismantle the stuff allocated during readin/setup */ - /* in MIFinit_inst, MIFget_port, and MIFsetup */ - - num_conn = here->num_conn; - for (i = 0; i < num_conn; i++) { - - /* If connection never used, skip it */ - if (here->conn[i]->is_null) - continue; - - /* If analog output, lots to free... */ - if (here->conn[i]->is_output && here->analog) { - num_port = here->conn[i]->size; - /* For each port on the connector */ - for (j = 0; j < num_port; j++) { - /* Free the partial/ac_gain/smp stuff allocated in MIFsetup */ - for (k = 0; k < num_conn; k++) { - if ((here->conn[k]->is_null) || (! here->conn[k]->is_input)) - continue; - if (here->conn[i]->port[j]->partial) - FREE(here->conn[i]->port[j]->partial[k].port); - if (here->conn[i]->port[j]->ac_gain) - FREE(here->conn[i]->port[j]->ac_gain[k].port); - if (here->conn[i]->port[j]->smp_data.input) - FREE(here->conn[i]->port[j]->smp_data.input[k].port); - } - FREE(here->conn[i]->port[j]->partial); - FREE(here->conn[i]->port[j]->ac_gain); - FREE(here->conn[i]->port[j]->smp_data.input); - /* but don't free strings. They are either not owned */ - /* by the inst or are part of tokens. SPICE3C1 never */ - /* frees tokens, so we don't either... */ - } - } - /* Free the basic port structure allocated in MIFget_port */ - num_port = here->conn[i]->size; - for (j = 0; j < num_port; j++) { - /* Memory allocated in mif_inp2.c */ - FREE(here->conn[i]->port[j]->type_str); - FREE(here->conn[i]->port[j]); - } - FREE(here->conn[i]->port); - } - - /* Free the connector stuff allocated in MIFinit_inst */ - /* Don't free name/description! They are not owned */ - /* by the instance */ - for (i = 0; i < num_conn; i++) { - FREE(here->conn[i]); - } - FREE(here->conn); - - /* Loop through all instance variables on the instance */ - /* and free stuff */ - - num_inst_var = here->num_inst_var; - for (i = 0; i < num_inst_var; i++) { - if (here->inst_var[i]->element != NULL) { - /* Do not delete inst_var[i]->element if MS Windows and is_array==1. - Memory is then allocated in the code model dll, and it cannot be - guaranteed that it can be freed safely here! A small memory leak is created. - FIXME - Finally one has to free the memory in the same module where allocated. */ -#if defined(_MSC_VER) || defined(__MINGW32__) - if (!DEVices[MIFmodPtr(here)->MIFmodType]->DEVpublic.inst_var[i].is_array) -#endif - FREE(here->inst_var[i]->element); - } - FREE(here->inst_var[i]); - } - FREE(here->inst_var); - - /* ************************************************************* */ - /* Dont free params here. They are not currently implemented on */ - /* a per-instance basis, so their allocated space is owned by */ - /* the parent model, not the instance. Param stuff will be freed */ - /* by MIFmDelete */ - /* ************************************************************* */ - - /* Free the stuff used by the cm_... functions */ - - if (here->num_state && here->state) - FREE(here->state); - if (here->num_intgr && here->intgr) - FREE(here->intgr); - if (here->num_conv && here->conv) - FREE(here->conv); - - return OK; -} diff --git a/src/xspice/mif/mifdestr.c b/src/xspice/mif/mifdestr.c deleted file mode 100644 index d81343484..000000000 --- a/src/xspice/mif/mifdestr.c +++ /dev/null @@ -1,55 +0,0 @@ -/*============================================================================ -FILE MIFdestroy.c - -MEMBER OF process XSPICE - -Public Domain - -Georgia Tech Research Corporation -Atlanta, Georgia 30332 -PROJECT A-8503 - -AUTHORS - - 9/12/91 Bill Kuhn - -MODIFICATIONS - - - -SUMMARY - - This file contains a function that deletes all models of a particular - device (code model) type from the circuit description structures. - -INTERFACES - - MIFdestroy() - -REFERENCED FILES - - None. - -NON-STANDARD FEATURES - - None. - -============================================================================*/ - -/* #include "prefix.h" */ -#include "ngspice/ngspice.h" -#include - -#include "ngspice/mifproto.h" - -/* #include "suffix.h" */ - - - -/* -MIFdestroy -*/ - -void MIFdestroy(void) -{ -} diff --git a/src/xspice/mif/mifgetmod.c b/src/xspice/mif/mifgetmod.c deleted file mode 100644 index b38c279dd..000000000 --- a/src/xspice/mif/mifgetmod.c +++ /dev/null @@ -1,249 +0,0 @@ -/*============================================================================ -FILE - -MEMBER OF process XSPICE - -Copyright 1991 -Georgia Tech Research Corporation -Atlanta, Georgia 30332 -All Rights Reserved - - * - * Copyright (c) 1985 Thomas L. Quarles - * - * NOTE: Portions of this code are Copyright Thomas L. Quarles and University of - * California at Berkeley. Other portions are modified and added by - * the Georgia Tech Research Institute. - * - -PROJECT A-8503 - -AUTHORS - - 9/12/91 Bill Kuhn - -MODIFICATIONS - - - -SUMMARY - - This file contains the routine that allocates a new model structure and - parses the .model card parameters. - -INTERFACES - - MIFgetMod() - -REFERENCED FILES - - None. - -NON-STANDARD FEATURES - - None. - -============================================================================*/ - -#include "ngspice/ngspice.h" - -#include -#include "ngspice/inpdefs.h" -#include "ngspice/devdefs.h" -#include "ngspice/ifsim.h" -#include "ngspice/cpstd.h" -#include "ngspice/fteext.h" - -#include "ngspice/mifproto.h" -#include "ngspice/mifdefs.h" -#include "ngspice/mifcmdat.h" - -#include "ngspice/suffix.h" - -/* This is the table of all models known to the program. - It is now defined in inpmkmod.c. */ -extern INPmodel *modtab; - -/* -MIFgetMod - -This function is a modified version of SPICE 3C1 INPgetMod(). -MIFgetMod looks in the table of model information created on the -first pass of the parser to find the text of the .model card. It -then checks to see if the .model card has already been processed -by a previous element card reference. If so, it returns a -pointer to the previously created model structure. If not, it -allocates a new model structure and processes the parameters on -the .model card. Parameter values for parameters not found on -the .model card are not filled in by this function. They are -defaulted later by MIFsetup(). The function returns NULL when -successful, and an error string on failure. -*/ - -char *MIFgetMod( - CKTcircuit *ckt, /* The circuit structure */ - char *name, /* The name of the model to look for */ - INPmodel **model, /* The model found/created */ - INPtables *tab /* Table of model info from first pass */ - ) -{ - INPmodel *modtmp; - IFvalue * val; - register int j; - char * line; - char *parm; - char *err = NULL; - int error; - - int i; - - char *err1; - char *err2; - - MIFmodel *mdfast; - /* Mif_Param_Info_t *param_info;*/ - - - /* =========== First locate the named model in the modtab list ================= */ - -#ifdef TRACE - /* SDB debug statement */ - printf("In MIFgetMod, looking for model name = %s . . .\n", name); -#endif - - /* maschmann : remove : from name - * char *pos; - * if((pos=strchr(name,':'))!=NULL) *pos=0; - */ - - /*------------------------------------ - for (i = &modtab; *i != NULL; i = &((*i)->INPnextModel)) { - if (strcmp((*i)->INPmodName, token) == 0) { - return (OK); - } - } - --------------------------*/ - - /* loop through modtable looking for this model (*name) */ - for (modtmp = modtab; modtmp != NULL; modtmp = modtmp->INPnextModel) { - -#ifdef TRACE - /* SDB debug statement */ - printf("In MIFgetMod, checking model against stored model = %s . . .\n", modtmp->INPmodName); -#endif - - if (strcmp(modtmp->INPmodName, name) == 0) { - -#ifdef TRACE - /* SDB debug statement */ - printf("In MIFgetMod, found model!!!\n"); -#endif - - /* ========= found the model in question - now instantiate if necessary ========== */ - /* ============== and return an appropriate pointer to it ===================== */ - - /* make sure the type is valid before proceeding */ - if(modtmp->INPmodType < 0) { - /* illegal device type, so can't handle */ - *model = NULL; - return tprintf("MIF: Unknown device type for model %s\n", name); - } - - /* check to see if this model's parameters have been processed */ - if(! modtmp->INPmodfast) { - - /* not already processed, so create data struct */ - error = ft_sim->newModel ( ckt, modtmp->INPmodType, - &(modtmp->INPmodfast), modtmp->INPmodName); - if(error) - return(INPerror(error)); - - /* gtri modification: allocate and initialize MIF specific model struct items */ - mdfast = (MIFmodel*) modtmp->INPmodfast; - mdfast->num_param = DEVices[modtmp->INPmodType]->DEVpublic.num_param; - mdfast->param = TMALLOC(Mif_Param_Data_t *, mdfast->num_param); - for(i = 0; i < mdfast->num_param; i++) { - mdfast->param[i] = TMALLOC(Mif_Param_Data_t, 1); - mdfast->param[i]->is_null = MIF_TRUE; - mdfast->param[i]->size = 0; - mdfast->param[i]->element = NULL; - } - /* remaining initializations will be done by MIFmParam() and MIFsetup() */ - - /* parameter isolation, identification, binding */ - line = modtmp->INPmodLine->line; - INPgetTok(&line,&parm,1); /* throw away '.model' */ - tfree(parm); - INPgetNetTok(&line,&parm,1); /* throw away 'modname' */ - tfree(parm); - - /* throw away the modtype - we don't treat it as a parameter */ - /* like SPICE does */ - INPgetTok(&line,&parm,1); /* throw away 'modtype' */ - tfree(parm); - - while(*line != '\0') { - INPgetTok(&line,&parm,1); - for(j=0 ; j < *(ft_sim->devices[modtmp->INPmodType]->numModelParms); j++) { - if (strcmp(parm, ft_sim->devices[modtmp->INPmodType]->modelParms[j].keyword) == 0) { - /* gtri modification: call MIFgetValue instead of INPgetValue */ - err1 = NULL; - val = MIFgetValue(ckt,&line, - ft_sim->devices[modtmp->INPmodType]->modelParms[j].dataType, - tab, &err1); - if(err1) { - err2 = tprintf("MIF-ERROR - model: %s - %s\n", name, err1); - return(err2); - } - error = ft_sim->setModelParm (ckt, - modtmp->INPmodfast, - ft_sim->devices[modtmp->INPmodType]->modelParms[j].id, - val, NULL); - /* free val, allocated by MIFgetValue */ - int vtype = (ft_sim->devices[modtmp->INPmodType]->modelParms[j].dataType & IF_VARTYPES); - if (vtype == IF_FLAGVEC || vtype == IF_INTVEC) - tfree(val->v.vec.iVec); - if (vtype == IF_REALVEC) - tfree(val->v.vec.rVec); - if (vtype == IF_CPLXVEC) - tfree(val->v.vec.cVec); - if (vtype == IF_STRING) - tfree(val->sValue); - if (vtype == IF_STRINGVEC) { - for (i = 0; i < val->v.numValue; i++) - tfree(val->v.vec.sVec[i]); - tfree(val->v.vec.sVec); - } - if(error) - return(INPerror(error)); - break; - } - } - /* gtri modification: processing of special parameter "level" removed */ - if(j >= *(ft_sim->devices[modtmp->INPmodType]->numModelParms)) { - char *temp = tprintf("MIF: unrecognized parameter (%s) - ignored", parm); - err = INPerrCat(err, temp); - } - FREE(parm); - - } /* end while end of line not reached */ - - modtmp->INPmodLine->error = err; - - } /* end if model parameters not processed yet */ - - *model = modtmp; - return(NULL); - - } /* end if name matches */ - - } /* end for all models in modtab linked list */ - - - /* didn't find model - ERROR - return NULL model */ - *model = NULL; - err = tprintf(" MIF-ERROR - unable to find definition of model %s\n", name); - - return(err); -} - diff --git a/src/xspice/mif/mifgetvalue.c b/src/xspice/mif/mifgetvalue.c deleted file mode 100644 index 0198e2160..000000000 --- a/src/xspice/mif/mifgetvalue.c +++ /dev/null @@ -1,375 +0,0 @@ -/*============================================================================ -FILE MIFgetValue.c - -MEMBER OF process XSPICE - -Public Domain - -Georgia Tech Research Corporation -Atlanta, Georgia 30332 -PROJECT A-8503 - -AUTHORS - - 9/12/91 Bill Kuhn - -MODIFICATIONS - - - -SUMMARY - - This file contains the function called to read parameter values from a - .model card. - -INTERFACES - - MIFgetValue() - -REFERENCED FILES - - None. - -NON-STANDARD FEATURES - - None. - -============================================================================*/ - -/* #include "prefix.h" */ -#include "ngspice/ngspice.h" -#include -#include "ngspice/ifsim.h" -//#include "util.h" -#include "ngspice/inpdefs.h" -#include "ngspice/inpptree.h" - -/* #include */ -#include - -#include "ngspice/mifproto.h" -#include "ngspice/mifparse.h" -#include "ngspice/mifdefs.h" -#include "ngspice/mifcmdat.h" - -/* #include "suffix.h" */ - - - -static int MIFget_boolean(char *token, char **err); - -static int MIFget_integer(char *token, char **err); - -static double MIFget_real(char *token, char **err); - -static char *MIFget_string(char *token, char **err); - -static IFcomplex MIFget_complex(char *token, Mif_Token_Type_t token_type, - char **line, char **err); - - - -/* -MIFgetValue - -This function gets a parameter value from the .model text line -into an IFvalue structure. The parameter type is specified in -the argument list and is used to determine how to parse the text -on the .model line. If the parameter is an array, the entire -array is parsed and placed in the IFvalue structure along with -the number of elements found. -*/ - - -IFvalue * -MIFgetValue ( - CKTcircuit *ckt, /* The circuit structure */ - char **line, /* The text line to read value from */ - int type, /* The type of data to read */ - INPtables *tab, /* Unused */ - char **err ) /* Error string text */ -{ - static IFvalue val; - - int btemp; - int itemp; - double rtemp; - char *stemp; - IFcomplex ctemp; - - char *token; - Mif_Token_Type_t token_type; - - int value_type; - int is_array; - - NG_IGNORE(ckt); - NG_IGNORE(tab); - - /* Mask off non-type bits */ - value_type = type & IF_VARTYPES; - - /* Setup array boolean */ - is_array = value_type & IF_VECTOR; - - - /* initialize stuff if array */ - if(is_array) { - token = MIFget_token(line, &token_type); - tfree(token); - if(token_type != MIF_LARRAY_TOK) { - *err = "Array parameter expected - No array delimiter found"; - return(NULL); - } - val.v.numValue = 0; - val.v.vec.iVec = NULL; - } - - - /* now get the values into val */ - - for (;;) { - - token = MIFget_token(line, &token_type); - - /* exit if no more tokens */ - if(token_type == MIF_NO_TOK) { - *err = "Unexpected end of model card"; - return(NULL); - } - - /* exit if end of array found */ - if(is_array && (token_type == MIF_RARRAY_TOK)) { - if(val.v.numValue == 0) { - *err = "Array parameter must have at least one value"; - return(NULL); - } - break; - } - - /* process the token to extract a value */ - switch(value_type) { - - case IF_FLAG: - val.iValue = MIFget_boolean(token, err); - break; - - case IF_INTEGER: - val.iValue = MIFget_integer(token, err); - break; - - case IF_REAL: - val.rValue = MIFget_real(token, err); - break; - - case IF_STRING: - val.sValue = MIFget_string(token, err); - break; - - case IF_COMPLEX: - val.cValue = MIFget_complex(token, token_type, line, err); - break; - - - case IF_FLAGVEC: - btemp = MIFget_boolean(token, err); - val.v.vec.iVec = TREALLOC(int, val.v.vec.iVec, val.v.numValue + 1); - val.v.vec.iVec[val.v.numValue] = btemp; - val.v.numValue++; - break; - - case IF_INTVEC: - itemp = MIFget_integer(token, err); - val.v.vec.iVec = TREALLOC(int, val.v.vec.iVec, val.v.numValue + 1); - val.v.vec.iVec[val.v.numValue] = itemp; - val.v.numValue++; - break; - - case IF_REALVEC: - rtemp = MIFget_real(token, err); - val.v.vec.rVec = TREALLOC(double, val.v.vec.rVec, val.v.numValue + 1); - val.v.vec.rVec[val.v.numValue] = rtemp; - val.v.numValue++; - break; - - case IF_STRINGVEC: - stemp = MIFget_string(token, err); - val.v.vec.sVec = TREALLOC(char *, val.v.vec.sVec, val.v.numValue + 1); - val.v.vec.sVec[val.v.numValue] = stemp; - val.v.numValue++; - break; - - case IF_CPLXVEC: - ctemp = MIFget_complex(token, token_type, line, err); - val.v.vec.cVec = TREALLOC(IFcomplex, val.v.vec.cVec, val.v.numValue + 1); - val.v.vec.cVec[val.v.numValue] = ctemp; - val.v.numValue++; - break; - - - default: - *err = "Internal error - unexpected value type in MIFgetValue()"; - return(NULL); - - } - - if(*err) - return(NULL); - - /* exit after this single pass if not array */ - if(! is_array) - break; - - tfree(token); - - } /* end forever loop */ - - tfree(token); - return(&val); -} - - -/* *************************************************************** */ - - -static int MIFget_boolean(char *token, char **err) -{ - int i; - *err = NULL; - - if((strcmp(token, "t") == 0) || (strcmp(token, "true") == 0)) - return(1); - if((strcmp(token, "f") == 0) || (strcmp(token, "false") == 0)) - return(0); - - i = MIFget_integer(token, err); // Try integer - if(!*err && (i == 1 || i == 0)) - return i; - - *err = "Bad boolean value"; - - return(-1); -} - - -/* *************************************************************** */ - -static int MIFget_integer(char *token, char **err) -{ - int error; - long l; - double dtemp; - char *endp; - - *err = NULL; - - errno = 0; - - l = strtol(token, &endp, 0); /* handles base 8, 10, 16 automatically */ - - if(!errno && (*endp == '\0')) - return((int) l); - - /* if error, probably caused by engineering suffixes, */ - /* so try parsing with INPevaluate */ - - dtemp = INPevaluate(&token, &error, 1); - - if(error) { - *err = "Bad integer, octal, or hex value"; - return(0); - } - - return((int)floor(dtemp + 0.5)); -} - - -/* *************************************************************** */ - -static double MIFget_real(char *token, char **err) -{ - double dtemp; - int error; - - *err = NULL; - - dtemp = INPevaluate(&token, &error, 1); - - if(error) - *err = "Bad real value"; - - return(dtemp); -} - - -/* *************************************************************** */ - -static char *MIFget_string(char *token, char **err) -{ - char* ctoken = MIFcopy(token); - *err = NULL; - return(ctoken); -} - - -/* *************************************************************** */ - -static IFcomplex MIFget_complex(char *token, Mif_Token_Type_t token_type, - char **line, char **err) -{ - static char *msg = "Bad complex value"; - - IFcomplex ctemp; - - double dtemp; - int error; - - *err = NULL; - - ctemp.real = 0.0; - ctemp.imag = 0.0; - - /* Complex values must be of form < > */ - if(token_type != MIF_LCOMPLEX_TOK) { - *err = msg; - return(ctemp); - } - - /* the incoming 'token' is the opening < delimiter - and will not handled furthermore */ - - /* get the real part */ - token = MIFget_token(line, &token_type); - if(token_type != MIF_STRING_TOK) { - *err = msg; - return(ctemp); - } - dtemp = INPevaluate(&token, &error, 1); - if(error) { - *err = msg; - return(ctemp); - } - ctemp.real = dtemp; - - /* get the imaginary part */ - token = MIFget_token(line, &token_type); - if(token_type != MIF_STRING_TOK) { - *err = msg; - return(ctemp); - } - dtemp = INPevaluate(&token, &error, 1); - if(error) { - *err = msg; - return(ctemp); - } - ctemp.imag = dtemp; - - /* eat the closing > delimiter */ - token = MIFget_token(line, &token_type); - if(token_type != MIF_RCOMPLEX_TOK) { - *err = msg; - return(ctemp); - } - - return(ctemp); -} diff --git a/src/xspice/mif/mifload.c b/src/xspice/mif/mifload.c deleted file mode 100644 index cc6c7c016..000000000 --- a/src/xspice/mif/mifload.c +++ /dev/null @@ -1,898 +0,0 @@ -/*============================================================================ -FILE MIFload.c - -MEMBER OF process XSPICE - -Public Domain - -Georgia Tech Research Corporation -Atlanta, Georgia 30332 -PROJECT A-8503 - -AUTHORS - - 9/12/91 Bill Kuhn - -MODIFICATIONS - - - -SUMMARY - - This file contains the driver function for calling code model evaluation - functions. This is one of the most important, complex, and often called - functions in the model interface package. It iterates through all models - and all instances of a specified code model device type, fills in the - inputs for the model, calls the model, and then uses the outputs and - partials returned by the model to load the matrix. - -INTERFACES - - MIFload() - -REFERENCED FILES - - None. - -NON-STANDARD FEATURES - - None. - -============================================================================*/ - - -/* #include "prefix.h" */ -#include "ngspice/ngspice.h" - -#include -#include - -#include "ngspice/cktdefs.h" -#include "ngspice/devdefs.h" -#include "ngspice/sperror.h" - -#include "ngspice/evt.h" - -#include "ngspice/mifproto.h" -#include "ngspice/mifparse.h" -#include "ngspice/mifdefs.h" -#include "ngspice/mifcmdat.h" -#include "ngspice/mif.h" - -#include "ngspice/enh.h" -#include "ngspice/cm.h" - -/* #include "suffix.h" */ - - - -static void MIFauto_partial( - MIFinstance *here, - void (*cm_func) (Mif_Private_t *), - Mif_Private_t *cm_data -); - - - - - - -/* -MIFload - -This function is called by the CKTload() driver function to call -the C function for each instance of a code model type. It loops -through all models of that type and all instances of each model. -For each instance, it prepares the structure that is passed to -the code model by filling it with the input values for that -instance. The code model's C function is then called, and the -outputs and partial derivatives computed by the C function are -used to fill the matrix for the next solution attempt. -*/ - - -int -MIFload( - GENmodel *inModel, /* The head of the model list */ - CKTcircuit *ckt) /* The circuit structure */ -{ - - MIFmodel *model; - MIFinstance *here; - - Mif_Private_t cm_data; /* data to be passed to/from code model */ - Mif_Port_Type_t type; - Mif_Port_Data_t *fast; - - Mif_Smp_Ptr_t *smp_data_out; - - Mif_Port_Ptr_t *smp_ptr; - - Mif_Port_Type_t in_type; - Mif_Port_Type_t out_type; - - Mif_Boolean_t is_input; - Mif_Boolean_t is_output; - - Mif_Cntl_Src_Type_t cntl_src_type; - - Mif_Analysis_t anal_type; - - Mif_Complex_t czero; - Mif_Complex_t ac_gain; - - int mod_type; - int num_conn; - int num_port; - int num_port_k; - int i; - int j; - int k; - int l; - - /*int tag;*/ - - double *rhs; - double *rhsOld; - double partial; - double temp; - - double *double_ptr0; - double *double_ptr1; - - /*double *input;*/ - /* double *oldinput;*/ - - char *byte_ptr0; - char *byte_ptr1; - - double last_input; - double conv_limit; - - double cntl_input; - - - Evt_Node_Data_t *node_data; - - - /* Prepare a zero complex number for AC gain initializations */ - czero.real = 0.0; - czero.imag = 0.0; - - /* Setup for access into MIF specific model data */ - model = (MIFmodel *) inModel; - mod_type = model->MIFmodType; - - /* Setup pointers for fast access to rhs and rhsOld elements of ckt struct */ - rhs = ckt->CKTrhs; - rhsOld = ckt->CKTrhsOld; - - node_data = ckt->evt->data.node; - - /* *********************************************************************** */ - /* Setup the circuit data in the structure to be passed to the code models */ - /* *********************************************************************** */ - - /* anal_init is set if this is the first iteration at any step in */ - /* an analysis */ - if(!(ckt->CKTmode & MODEINITFLOAT)) - g_mif_info.circuit.anal_init = MIF_TRUE; - cm_data.circuit.anal_init = g_mif_info.circuit.anal_init; - - /* anal_type is determined by CKTload */ - anal_type = g_mif_info.circuit.anal_type; - cm_data.circuit.anal_type = anal_type; - - /* get the analysis freq from the ckt struct if this is an AC analysis */ - /* otherwise, set the freq to zero */ - if(anal_type == MIF_AC) - cm_data.circuit.frequency = ckt->CKTomega; - else - cm_data.circuit.frequency = 0.0; - - /* get the analysis times from the ckt struct if this is a transient analysis */ - /* otherwise, set the times to zero */ - if(anal_type == MIF_TRAN) { - cm_data.circuit.time = ckt->CKTtime; - cm_data.circuit.t[0] = ckt->CKTtime; - for(i = 1; i < 8; i++) { - cm_data.circuit.t[i] = cm_data.circuit.t[i-1] - ckt->CKTdeltaOld[i-1]; - if(cm_data.circuit.t[i] < 0.0) - cm_data.circuit.t[i] = 0.0; - } - } - else { - cm_data.circuit.time = 0.0; - for(i = 0; i < 8; i++) { - cm_data.circuit.t[i] = 0.0; - } - } - - cm_data.circuit.call_type = MIF_ANALOG; - cm_data.circuit.temperature = ckt->CKTtemp - 273.15; - - g_mif_info.circuit.call_type = MIF_ANALOG; - g_mif_info.ckt = ckt; - - - /* ***************************************************************** */ - /* loop through all models of this type */ - /* ***************************************************************** */ - for( ; model != NULL; model = MIFnextModel(model)) { - - /* If not an analog or hybrid model, continue to next */ - if(! model->analog) - continue; - - /* ***************************************************************** */ - /* loop through all instances of this model */ - /* ***************************************************************** */ - for(here = MIFinstances(model); here != NULL; here = MIFnextInstance(here)) { - /* If not an analog or hybrid instance, continue to next */ - if(! here->analog) - continue; - - /* ***************************************************************** */ - /* Prepare the data needed by the cm_.. functions */ - /* ***************************************************************** */ - g_mif_info.instance = here; - g_mif_info.errmsg = ""; - - if(here->initialized) { - cm_data.circuit.init = MIF_FALSE; - g_mif_info.circuit.init = MIF_FALSE; - } - else { - cm_data.circuit.init = MIF_TRUE; - g_mif_info.circuit.init = MIF_TRUE; - } - - - /* ***************************************************************** */ - /* if tran analysis and anal_init is true, copy state 1 to state 0 */ - /* Otherwise the data in state 0 would be invalid */ - /* ***************************************************************** */ - - if((anal_type == MIF_TRAN) && g_mif_info.circuit.anal_init) { - for(i = 0; i < here->num_state; i++) { - double_ptr0 = ckt->CKTstate0 + here->state[i].index; - double_ptr1 = ckt->CKTstate1 + here->state[i].index; - byte_ptr0 = (char *) double_ptr0; - byte_ptr1 = (char *) double_ptr1; - for(j = 0; j < here->state[i].bytes; j++) - byte_ptr0[j] = byte_ptr1[j]; - } - } - - /* ***************************************************************** */ - /* If not AC analysis, loop through all connections on this instance */ - /* and load the input values for each input port of each connection */ - /* ***************************************************************** */ - - num_conn = here->num_conn; - for(i = 0; i < num_conn; i++) { - - /* If AC analysis, skip getting input values. The input values */ - /* should stay the same as they were at the last iteration of */ - /* the operating point analysis */ - if(anal_type == MIF_AC) - break; - - /* if the connection is null, skip to next connection */ - if(here->conn[i]->is_null) - continue; - - /* if this connection is not an input, skip to next connection */ - if(! here->conn[i]->is_input) - continue; - - /* Get number of ports on this connection */ - num_port = here->conn[i]->size; - - /* loop through all ports on this connection */ - for(j = 0; j < num_port; j++) { - - /*setup a pointer for fast access to port data */ - fast = here->conn[i]->port[j]; - - /* skip if this port is null */ - if(fast->is_null) - continue; - - /* determine the type of this port */ - type = fast->type; - - /* If port type is Digital or User-Defined, we only need */ - /* to get the total load. The input values are pointers */ - /* already set by EVTsetup() */ - if((type == MIF_DIGITAL) || (type == MIF_USER_DEFINED)) { - fast->total_load = - node_data->total_load[fast->evt_data.node_index]; - } - /* otherwise, it is an analog node and we get the input value */ - else { - /* load the input values based on type and mode */ - if(ckt->CKTmode & MODEINITJCT) - /* first iteration step for DC */ - fast->input.rvalue = 0.0; - else if((ckt->CKTmode & MODEINITTRAN) || - (ckt->CKTmode & MODEINITPRED)) - /* first iteration step at timepoint */ - fast->input.rvalue = ckt->CKTstate1[fast->old_input]; - else { - /* subsequent iterations */ - - /* record last iteration's input value for convergence limiting */ - last_input = fast->input.rvalue; - - /* get the new input value */ - switch(type) { - case MIF_VOLTAGE: - case MIF_DIFF_VOLTAGE: - case MIF_CONDUCTANCE: - case MIF_DIFF_CONDUCTANCE: - fast->input.rvalue = rhsOld[fast->smp_data.pos_node] - - rhsOld[fast->smp_data.neg_node]; - break; - case MIF_CURRENT: - case MIF_DIFF_CURRENT: - case MIF_VSOURCE_CURRENT: - case MIF_RESISTANCE: - case MIF_DIFF_RESISTANCE: - fast->input.rvalue = rhsOld[fast->smp_data.ibranch]; - break; - case MIF_DIGITAL: - case MIF_USER_DEFINED: - break; - } /* end switch on type of port */ - - /* If convergence limiting enabled, limit maximum input change */ - if(ckt->enh->conv_limit.enabled) { - /* compute the maximum the input is allowed to change */ - conv_limit = fabs(last_input) * ckt->enh->conv_limit.step; - if(conv_limit < ckt->enh->conv_limit.abs_step) - conv_limit = ckt->enh->conv_limit.abs_step; - /* if input has changed too much, limit it and signal not converged */ - if(fabs(fast->input.rvalue - last_input) > conv_limit) { - if((fast->input.rvalue - last_input) > 0.0) - fast->input.rvalue = last_input + conv_limit; - else - fast->input.rvalue = last_input - conv_limit; - (ckt->CKTnoncon)++; - /* report convergence problem if last call */ - if(ckt->enh->conv_debug.report_conv_probs) { - ENHreport_conv_prob(ENH_ANALOG_INSTANCE, - here->MIFname, ""); - } - } - } - - } /* end else */ - - /* Save value of input for use with MODEINITTRAN */ - ckt->CKTstate0[fast->old_input] = fast->input.rvalue; - - } /* end else analog type */ - } /* end for number of ports */ - } /* end for number of connections */ - - /* ***************************************************************** */ - /* loop through all connections on this instance and zero out all */ - /* outputs/partials/AC gains for each output port of each connection */ - /* ***************************************************************** */ - num_conn = here->num_conn; - for(i = 0; i < num_conn; i++) { - - /* if the connection is null or is not an output */ - /* skip to next connection */ - if(here->conn[i]->is_null || (! here->conn[i]->is_output)) - continue; - - /* loop through all ports on this connection */ - num_port = here->conn[i]->size; - for(j = 0; j < num_port; j++) { - - /*setup a pointer for fast access to port data */ - fast = here->conn[i]->port[j]; - - /* skip if this port is null */ - if(fast->is_null) - continue; - - /* determine the type of this port */ - type = fast->type; - - /* If not an analog node, continue to next port */ - if((type == MIF_DIGITAL) || (type == MIF_USER_DEFINED)) - continue; - - /* initialize the output to zero */ - fast->output.rvalue = 0.0; - - /* loop through all connections and ports that */ - /* could be inputs for this port and zero the partials */ - for(k = 0; k < num_conn; k++) { - if(here->conn[k]->is_null || (! here->conn[k]->is_input)) - continue; - num_port_k = here->conn[k]->size; - for(l = 0; l < num_port_k; l++) { - /* skip if this port is null */ - if(here->conn[k]->port[l]->is_null) - continue; - fast->partial[k].port[l] = 0.0; - fast->ac_gain[k].port[l] = czero; - } /* end for number of ports */ - } /* end for number of connections */ - } /* end for number of ports */ - } /* end for number of connections */ - - - /* ***************************************************************** */ - /* Prepare the structure to be passed to the code model */ - /* ***************************************************************** */ - cm_data.num_conn = here->num_conn; - cm_data.conn = here->conn; - cm_data.num_param = here->num_param; - cm_data.param = here->param; - cm_data.num_inst_var = here->num_inst_var; - cm_data.inst_var = here->inst_var; - cm_data.callback = &(here->callback); - - /* Initialize the auto_partial flag to false */ - g_mif_info.auto_partial.local = MIF_FALSE; - - /* ******************* */ - /* Call the code model */ - /* ******************* */ - DEVices[mod_type]->DEVpublic.cm_func (&cm_data); - - /* Automatically compute partials if requested by .options auto_partial */ - /* or by model through call to cm_analog_auto_partial() in DC or TRAN analysis */ - if((anal_type != MIF_AC) && - (g_mif_info.auto_partial.global || g_mif_info.auto_partial.local)) - MIFauto_partial(here, DEVices[mod_type]->DEVpublic.cm_func, &cm_data); - - /* ***************************************************************** */ - /* Loop through all connections on this instance and */ - /* load the data into the matrix for each output port */ - /* and for each V source associated with a current input. */ - /* For AC analysis, we only load the +-1s required to satisfy */ - /* KCL and KVL in the matrix equations. */ - /* ***************************************************************** */ - - num_conn = here->num_conn; - for(i = 0; i < num_conn; i++) { - - /* if the connection is null, skip to next connection */ - if(here->conn[i]->is_null) - continue; - - /* prepare things for convenient access later */ - is_input = here->conn[i]->is_input; - is_output = here->conn[i]->is_output; - - /* loop through all ports on this connection */ - num_port = here->conn[i]->size; - for(j = 0; j < num_port; j++) { - - /*setup a pointer for fast access to port data */ - fast = here->conn[i]->port[j]; - - /* skip if this port is null */ - if(fast->is_null) - continue; - - /* determine the type of this port */ - type = fast->type; - - /* If not an analog node, continue to next port */ - if((type == MIF_DIGITAL) || (type == MIF_USER_DEFINED)) - continue; - - /* create a pointer to the smp data for quick access */ - smp_data_out = &(fast->smp_data); - - /* if it is a current input */ - /* load the matrix data needed for the associated zero-valued V source */ - if(is_input && (type == MIF_CURRENT || type == MIF_DIFF_CURRENT)) { - *(smp_data_out->pos_ibranch) += 1.0; - *(smp_data_out->neg_ibranch) -= 1.0; - *(smp_data_out->ibranch_pos) += 1.0; - *(smp_data_out->ibranch_neg) -= 1.0; - /* rhs[smp_data_out->ibranch] += 0.0; */ - } /* end if current input */ - - /* if it has a voltage source output, */ - /* load the matrix with the V source output data */ - if( (is_output && (type == MIF_VOLTAGE || type == MIF_DIFF_VOLTAGE)) || - (type == MIF_RESISTANCE || type == MIF_DIFF_RESISTANCE) ) { - *(smp_data_out->pos_branch) += 1.0; - *(smp_data_out->neg_branch) -= 1.0; - *(smp_data_out->branch_pos) += 1.0; - *(smp_data_out->branch_neg) -= 1.0; - if(anal_type != MIF_AC) - rhs[smp_data_out->branch] += fast->output.rvalue; - } /* end if V source output */ - - /* if it has a current source output, */ - /* load the matrix with the V source output data */ - if( (is_output && (type == MIF_CURRENT || type == MIF_DIFF_CURRENT)) || - (type == MIF_CONDUCTANCE || type == MIF_DIFF_CONDUCTANCE) ) { - if(anal_type != MIF_AC) { - rhs[smp_data_out->pos_node] -= fast->output.rvalue; - rhs[smp_data_out->neg_node] += fast->output.rvalue; - } - } /* end if current output */ - - } /* end for number of ports */ - } /* end for number of connections */ - - - /* ***************************************************************** */ - /* loop through all output connections on this instance and */ - /* load the partials/AC gains into the matrix */ - /* ***************************************************************** */ - for(i = 0; i < num_conn; i++) { - - /* if the connection is null or is not an output */ - /* skip to next connection */ - if((here->conn[i]->is_null) || (! here->conn[i]->is_output)) - continue; - - /* loop through all ports on this connection */ - num_port = here->conn[i]->size; - for(j = 0; j < num_port; j++) { - - /*setup a pointer for fast access to port data */ - fast = here->conn[i]->port[j]; - - /* skip if this port is null */ - if(fast->is_null) - continue; - - /* determine the type of this output port */ - out_type = fast->type; - - /* If not an analog node, continue to next port */ - if((out_type == MIF_DIGITAL) || (out_type == MIF_USER_DEFINED)) - continue; - - /* create a pointer to the smp data for quick access */ - smp_data_out = &(fast->smp_data); - - /* for this port, loop through all connections */ - /* and all ports to touch on each possible input */ - for(k = 0; k < num_conn; k++) { - - /* if the connection is null or is not an input */ - /* skip to next connection */ - if((here->conn[k]->is_null) || (! here->conn[k]->is_input)) - continue; - - num_port_k = here->conn[k]->size; - /* loop through all the ports of this connection */ - for(l = 0; l < num_port_k; l++) { - - /* skip if this port is null */ - if(here->conn[k]->port[l]->is_null) - continue; - - /* determine the type of this input port */ - in_type = here->conn[k]->port[l]->type; - - /* If not an analog node, continue to next port */ - if((in_type == MIF_DIGITAL) || (in_type == MIF_USER_DEFINED)) - continue; - - /* get the partial to local variable for fast access */ - partial = fast->partial[k].port[l]; - ac_gain = fast->ac_gain[k].port[l]; - - /* create a pointer to the matrix pointer data for quick access */ - smp_ptr = &(smp_data_out->input[k].port[l]); - - /* get the input value */ - cntl_input = here->conn[k]->port[l]->input.rvalue; - - /* determine type of controlled source according */ - /* to input and output types */ - cntl_src_type = MIFget_cntl_src_type(in_type, out_type); - - switch(cntl_src_type) { - case MIF_VCVS: - if(anal_type == MIF_AC) { - smp_ptr->e.branch_poscntl[0] -= ac_gain.real; - smp_ptr->e.branch_negcntl[0] += ac_gain.real; - smp_ptr->e.branch_poscntl[1] -= ac_gain.imag; - smp_ptr->e.branch_negcntl[1] += ac_gain.imag; - } - else { - smp_ptr->e.branch_poscntl[0] -= partial; - smp_ptr->e.branch_negcntl[0] += partial; - rhs[smp_data_out->branch] -= partial * cntl_input; - } - break; - case MIF_ICIS: - if(anal_type == MIF_AC) { - smp_ptr->f.pos_ibranchcntl[0] += ac_gain.real; - smp_ptr->f.neg_ibranchcntl[0] -= ac_gain.real; - smp_ptr->f.pos_ibranchcntl[1] += ac_gain.imag; - smp_ptr->f.neg_ibranchcntl[1] -= ac_gain.imag; - } - else { - smp_ptr->f.pos_ibranchcntl[0] += partial; - smp_ptr->f.neg_ibranchcntl[0] -= partial; - temp = partial * cntl_input; - rhs[smp_data_out->pos_node] += temp; - rhs[smp_data_out->neg_node] -= temp; - } - break; - case MIF_VCIS: - if(anal_type == MIF_AC) { - smp_ptr->g.pos_poscntl[0] += ac_gain.real; - smp_ptr->g.pos_negcntl[0] -= ac_gain.real; - smp_ptr->g.neg_poscntl[0] -= ac_gain.real; - smp_ptr->g.neg_negcntl[0] += ac_gain.real; - smp_ptr->g.pos_poscntl[1] += ac_gain.imag; - smp_ptr->g.pos_negcntl[1] -= ac_gain.imag; - smp_ptr->g.neg_poscntl[1] -= ac_gain.imag; - smp_ptr->g.neg_negcntl[1] += ac_gain.imag; - } - else { - smp_ptr->g.pos_poscntl[0] += partial; - smp_ptr->g.pos_negcntl[0] -= partial; - smp_ptr->g.neg_poscntl[0] -= partial; - smp_ptr->g.neg_negcntl[0] += partial; - temp = partial * cntl_input; - rhs[smp_data_out->pos_node] += temp; - rhs[smp_data_out->neg_node] -= temp; - } - break; - case MIF_ICVS: - if(anal_type == MIF_AC) { - smp_ptr->h.branch_ibranchcntl[0] -= ac_gain.real; - smp_ptr->h.branch_ibranchcntl[1] -= ac_gain.imag; - } - else { - smp_ptr->h.branch_ibranchcntl[0] -= partial; - rhs[smp_data_out->branch] -= partial * cntl_input; - } - break; - case MIF_minus_one: - break; - } /* end switch on controlled source type */ - } /* end for number of input ports */ - } /* end for number of input connections */ - } /* end for number of output ports */ - } /* end for number of output connections */ - - here->initialized = MIF_TRUE; - - } /* end for all instances */ - - } /* end for all models */ - - return(OK); -} - - - - -/* -MIFauto_partial - -This function is called by MIFload() when a code model requests -that partial derivatives be computed automatically. It calls -the code model additional times with an individual input to the -model varied by a small amount at each call. Partial -derivatives of each output with respect to the varied input -are then computed by divided differences. -*/ - - -static void MIFauto_partial( - MIFinstance *here, /* The instance structure */ - void (*cm_func) (Mif_Private_t *), /* The code model function to be called */ - Mif_Private_t *cm_data) /* The data to be passed to the code model */ -{ - - Mif_Port_Data_t *fast; - Mif_Port_Data_t *out_fast; - - Mif_Port_Type_t type; - Mif_Port_Type_t out_type; - - int num_conn; - int num_port; - int num_port_k; - - int i; - int j; - int k; - int l; - - double epsilon; - double nominal_input; - - - /* Reset init and anal_init flags before making additional calls */ - /* to the model */ - cm_data->circuit.init = MIF_FALSE; - g_mif_info.circuit.init = MIF_FALSE; - - cm_data->circuit.anal_init = MIF_FALSE; - g_mif_info.circuit.anal_init = MIF_FALSE; - - - /* *************************** */ - /* Save nominal analog outputs */ - /* *************************** */ - - /* loop through all connections */ - num_conn = here->num_conn; - for(i = 0; i < num_conn; i++) { - - /* if the connection is null or is not an output */ - /* skip to next connection */ - if(here->conn[i]->is_null || (! here->conn[i]->is_output)) - continue; - - /* loop through all ports on this connection */ - num_port = here->conn[i]->size; - for(j = 0; j < num_port; j++) { - - /*setup a pointer for fast access to port data */ - fast = here->conn[i]->port[j]; - - /* skip if this port is null */ - if(fast->is_null) - continue; - - /* determine the type of this port */ - type = fast->type; - - /* If not an analog port, continue to next port */ - if((type == MIF_DIGITAL) || (type == MIF_USER_DEFINED)) - continue; - - /* copy the output for use in computing output deltas */ - fast->nominal_output = fast->output.rvalue; - - } /* end for number of output ports */ - } /* end for number of output connections */ - - - /* ***************************************************************** */ - /* Change each analog input by a small amount and call the model to */ - /* compute new outputs. */ - /* ***************************************************************** */ - - /* loop through all connections */ - num_conn = here->num_conn; - for(i = 0; i < num_conn; i++) { - - /* if the connection is null, skip to next connection */ - if(here->conn[i]->is_null) - continue; - - /* if this connection is not an input, skip to next connection */ - if(! here->conn[i]->is_input) - continue; - - /* Get number of ports on this connection */ - num_port = here->conn[i]->size; - - /* loop through all ports on this connection */ - for(j = 0; j < num_port; j++) { - - /*setup a pointer for fast access to port data */ - fast = here->conn[i]->port[j]; - - /* skip if this port is null */ - if(fast->is_null) - continue; - - /* determine the type of this port */ - type = fast->type; - - /* If port type is Digital or User-Defined, skip it */ - if((type == MIF_DIGITAL) || (type == MIF_USER_DEFINED)) - continue; - - /* otherwise, it is an analog port and we need to perturb it and */ - /* then call the model */ - - /* compute the perturbation amount depending on type of input */ - switch(type) { - case MIF_VOLTAGE: - case MIF_DIFF_VOLTAGE: - case MIF_CONDUCTANCE: - case MIF_DIFF_CONDUCTANCE: - epsilon = 1.0e-6; - break; - - case MIF_CURRENT: - case MIF_DIFF_CURRENT: - case MIF_VSOURCE_CURRENT: - case MIF_RESISTANCE: - case MIF_DIFF_RESISTANCE: - epsilon = 1.0e-12; - break; - - default: - printf("INTERNAL ERROR - MIFauto_partial. Invalid port type\n"); - epsilon = 1.0e-30; - break; - } /* end switch on type of port */ - - /* record and perturb input value */ - nominal_input = fast->input.rvalue; - fast->input.rvalue += epsilon; - - - /* call model to compute new outputs */ - cm_func (cm_data); - - - /* ******************************************************* */ - /* Compute the partials of each output with respect to the */ - /* perturbed input by divided differences. */ - /* ******************************************************* */ - - /* loop through all analog output connections */ - for(k = 0; k < num_conn; k++) { - - /* if the connection is null or is not an output */ - /* skip to next connection */ - if((here->conn[k]->is_null) || (! here->conn[k]->is_output)) - continue; - - /* loop through all the ports of this connection */ - num_port_k = here->conn[k]->size; - for(l = 0; l < num_port_k; l++) { - - /*setup a pointer for out_fast access to port data */ - out_fast = here->conn[k]->port[l]; - - /* skip if this port is null */ - if(out_fast->is_null) - continue; - - /* determine the out_type of this port */ - out_type = out_fast->type; - - /* If port type is Digital or User-Defined, skip it */ - if((out_type == MIF_DIGITAL) || (out_type == MIF_USER_DEFINED)) - continue; - - /* compute partial by divided differences */ - out_fast->partial[i].port[j] = - (out_fast->output.rvalue - out_fast->nominal_output) / epsilon; - - /* zero the output in preparation for next call */ - out_fast->output.rvalue = 0.0; - - } /* end for number of output ports */ - } /* end for number of output connections */ - - /* restore nominal input value */ - fast->input.rvalue = nominal_input; - - } /* end for number of input ports */ - } /* end for number of input connections */ - - - /* *************************************************** */ - /* Call model one last time to recompute nominal case. */ - /* *************************************************** */ - - /* This is needed even though the outputs are recorded, because */ - /* the model may compute other state values that cannot be restored */ - /* to the nominal condition from here */ - - cm_func (cm_data); - -} - - - diff --git a/src/xspice/mif/mifmask.c b/src/xspice/mif/mifmask.c deleted file mode 100644 index f47b2dcdc..000000000 --- a/src/xspice/mif/mifmask.c +++ /dev/null @@ -1,213 +0,0 @@ -/*============================================================================ -FILE MIFmAsk.c - -MEMBER OF process XSPICE - -Public Domain - -Georgia Tech Research Corporation -Atlanta, Georgia 30332 -PROJECT A-8503 - -AUTHORS - - 9/12/91 Bill Kuhn - -MODIFICATIONS - - - -SUMMARY - - This file contains the function called by nutmeg to get the value - of a specified code model parameter. - -INTERFACES - - MIFmAsk() - -REFERENCED FILES - - None. - -NON-STANDARD FEATURES - - None. - -============================================================================*/ - -/* #include "prefix.h" */ -#include "ngspice/ngspice.h" -#include -//#include "CONST.h" -//#include "util.h" -#include "ngspice/ifsim.h" -#include "ngspice/devdefs.h" -#include "ngspice/sperror.h" - -#include - -#include "ngspice/mifproto.h" -#include "ngspice/mifdefs.h" - -/* #include "suffix.h" */ - - -/* -MIFmAsk - -This function is called by SPICE/Nutmeg to query the value of a -parameter on a model. It is essentially the opposite of -MIFmParam, taking the index of the parameter, locating the value -of the parameter in the model structure, and converting that -value into the IFvalue structure understood by Nutmeg. -*/ - - -int MIFmAsk( - CKTcircuit *ckt, /* The circuit structure */ - GENmodel *inModel, /* The model to get the value from */ - int param_index, /* The parameter to get */ - IFvalue *value) /* The value returned */ -{ - - MIFmodel *model; - int mod_type; - int value_type; - int i; - int size; - - Mif_Boolean_t is_array; - - NG_IGNORE(ckt); - - /* Arrange for access to MIF specific data in the model */ - model = (MIFmodel *) inModel; - - - /* Get model type */ - mod_type = model->MIFmodType; - if((mod_type < 0) || (mod_type >= DEVmaxnum)) - return(E_BADPARM); - - - /* Check parameter index for validity */ - if((param_index < 0) || (param_index >= model->num_param)) - return(E_BADPARM); - - /* get value type to know which members of unions to access */ - value_type = DEVices[mod_type]->DEVpublic.modelParms[param_index].dataType; - value_type &= IF_VARTYPES; - - - /* determine if the parameter is an array or not */ - is_array = value_type & IF_VECTOR; - - - /* Transfer the values to the SPICE3C1 value union from the param elements */ - /* This is analagous to what SPICE3 does with other device types */ - - - if(! is_array) { - - switch(value_type) { - - case IF_FLAG: - value->iValue = model->param[param_index]->element[0].bvalue; - break; - - case IF_INTEGER: - value->iValue = model->param[param_index]->element[0].ivalue; - break; - - case IF_REAL: - value->rValue = model->param[param_index]->element[0].rvalue; - break; - - case IF_STRING: - /* Make copy of string. We don't trust caller to not free it */ - /* These copies could get expensive! */ - value->sValue = MIFcopy(model->param[param_index]->element[0].svalue); - break; - - case IF_COMPLEX: - /* we don't trust the caller to have a parallel complex structure */ - /* so copy the real and imaginary parts explicitly */ - value->cValue.real = model->param[param_index]->element[0].cvalue.real; - value->cValue.imag = model->param[param_index]->element[0].cvalue.imag; - break; - - default: - return(E_BADPARM); - - } - } - else { /* it is an array */ - - size = model->param[param_index]->size; - if(size < 0) - size = 0; - - value->v.numValue = size; - - switch(value_type) { - - /* Note that we malloc space each time this function is called. */ - /* This is what TRAask.c does, so we do it too, even though */ - /* we don't know if it is ever freed... */ - - case IF_FLAGVEC: - if(size <= 0) - break; - value->v.vec.iVec = TMALLOC(int, size); - for(i = 0; i < size; i++) - value->v.vec.iVec[i] = model->param[param_index]->element[i].bvalue; - break; - - case IF_INTVEC: - if(size <= 0) - break; - value->v.vec.iVec = TMALLOC(int, size); - for(i = 0; i < size; i++) - value->v.vec.iVec[i] = model->param[param_index]->element[i].ivalue; - break; - - case IF_REALVEC: - if(size <= 0) - break; - value->v.vec.rVec = TMALLOC(double, size); - for(i = 0; i < size; i++) - value->v.vec.rVec[i] = model->param[param_index]->element[i].rvalue; - break; - - case IF_STRINGVEC: - if(size <= 0) - break; - value->v.vec.sVec = TMALLOC(char *, size); - for(i = 0; i < size; i++) - /* Make copy of string. We don't trust caller to not free it */ - /* These copies could get expensive! */ - value->v.vec.sVec[i] = MIFcopy(model->param[param_index]->element[i].svalue); - break; - - case IF_CPLXVEC: - if(size <= 0) - break; - /* we don't trust the caller to have a parallel complex structure */ - /* so copy the real and imaginary parts explicitly */ - value->v.vec.cVec = TMALLOC(IFcomplex, size); - for(i = 0; i < size; i++) { - value->v.vec.cVec[i].real = model->param[param_index]->element[i].cvalue.real; - value->v.vec.cVec[i].imag = model->param[param_index]->element[i].cvalue.imag; - } - break; - - default: - return(E_BADPARM); - - } /* end switch */ - - } /* end else */ - - return(OK); -} diff --git a/src/xspice/mif/mifmdelete.c b/src/xspice/mif/mifmdelete.c deleted file mode 100644 index fae57cdcf..000000000 --- a/src/xspice/mif/mifmdelete.c +++ /dev/null @@ -1,84 +0,0 @@ -/*============================================================================ -FILE MIFmDelete.c - -MEMBER OF process XSPICE - -Public Domain - -Georgia Tech Research Corporation -Atlanta, Georgia 30332 -PROJECT A-8503 - -AUTHORS - - 9/12/91 Bill Kuhn - -MODIFICATIONS - - - -SUMMARY - - This file contains the function called by SPICE to delete a model - structure and all instances of that model. - -INTERFACES - - MIFmDelete() - -REFERENCED FILES - - None. - -NON-STANDARD FEATURES - - None. - -============================================================================*/ - -/* #include "prefix.h" */ -#include "ngspice/ngspice.h" -#include -//#include "util.h" -#include "ngspice/sperror.h" -#include "ngspice/gendefs.h" - -#include "ngspice/mifproto.h" -#include "ngspice/mifdefs.h" - -/* #include "suffix.h" */ - - -/* -MIFmDelete - -This function deletes a particular model defined by a .model card -from the linked list of model structures of a particular code -model type, freeing all dynamically allocated memory used by the -model structure. It calls MIFdelete as needed to delete all -instances of the specified model. -*/ - -int -MIFmDelete(GENmodel *gen_model) -{ - MIFmodel *model = (MIFmodel *) gen_model; - int i, j; - - /* Free the model params stuff allocated in MIFget_mod */ - for (i = 0; i < model->num_param; i++) { - /* delete content of union 'element' if it contains a string */ - if (model->param[i]->element) { - if (model->param[i]->eltype == IF_STRING) - FREE(model->param[i]->element[0].svalue); - else if (model->param[i]->eltype == IF_STRINGVEC) - for (j = 0; j < model->param[i]->size; j++) - FREE(model->param[i]->element[j].svalue); - FREE(model->param[i]->element); - } - FREE(model->param[i]); - } - FREE(model->param); - - return OK; -} diff --git a/src/xspice/mif/mifmpara.c b/src/xspice/mif/mifmpara.c deleted file mode 100644 index 5f8656a9d..000000000 --- a/src/xspice/mif/mifmpara.c +++ /dev/null @@ -1,214 +0,0 @@ -/*============================================================================ -FILE MIFmParam.c - -MEMBER OF process XSPICE - -Public Domain - -Georgia Tech Research Corporation -Atlanta, Georgia 30332 -PROJECT A-8503 - -AUTHORS - - 9/12/91 Bill Kuhn - -MODIFICATIONS - - - -SUMMARY - - This file contains the function used to assign the value of a parameter - read from the .model card into the appropriate structure in the model. - -INTERFACES - - MIFmParam() - -REFERENCED FILES - - None. - -NON-STANDARD FEATURES - - None. - -============================================================================*/ - -/* #include "prefix.h" */ -#include "ngspice/ngspice.h" -#include -//#include "CONST.h" -//#include "util.h" -#include "ngspice/ifsim.h" -//#include "resdefs.h" -#include "ngspice/devdefs.h" -#include "ngspice/sperror.h" - -#include - -#include "ngspice/mifproto.h" -#include "ngspice/mifparse.h" -#include "ngspice/mifdefs.h" -#include "ngspice/mifcmdat.h" - -/* #include "suffix.h" */ - - -/* -MIFmParam - -This function is called by SPICE/Nutmeg to set the value of a -parameter on a model according to information parsed from a -.model card or information supplied interactively by a user. It -takes the value of the parameter input in an IFvalue structure -and sets the parameter on the specified model structure. Unlike -the procedure for SPICE 3C1 devices, MIFmParam does not use -enumerations for identifying the parameter to set. Instead, the -parameter is identified directly by the index value of the -parameter in the SPICEdev.DEVpublic.modelParms array. -*/ - -int MIFmParam( - int param_index, /* The parameter to set */ - IFvalue *value, /* The value of the parameter */ - GENmodel *inModel) /* The model structure on which to set the value */ -{ - - MIFmodel *model; - int mod_type; - int value_type; - int i; - - Mif_Boolean_t is_array; - - - /* Arrange for access to MIF specific data in the model */ - model = (MIFmodel *) inModel; - - - /* Get model type */ - mod_type = model->MIFmodType; - if((mod_type < 0) || (mod_type >= DEVmaxnum)) - return(E_BADPARM); - - - /* Check parameter index for validity */ - if((param_index < 0) || (param_index >= model->num_param)) - return(E_BADPARM); - - /* get value type to know which members of unions to access */ - value_type = DEVices[mod_type]->DEVpublic.modelParms[param_index].dataType; - value_type &= IF_VARTYPES; - - - /* determine if the parameter is an array or not */ - is_array = value_type & IF_VECTOR; - - /* initialize the parameter is_null and size elements and allocate elements */ - model->param[param_index]->is_null = MIF_FALSE; - /* element may exist already, if called from 'altermod' */ - FREE(model->param[param_index]->element); - if(is_array) { - model->param[param_index]->size = value->v.numValue; - model->param[param_index]->element = TMALLOC(Mif_Value_t, value->v.numValue); - } - else { - model->param[param_index]->size = 1; - model->param[param_index]->element = TMALLOC(Mif_Value_t, 1); - } - - - /* Transfer the values from the SPICE3C1 value union to the param elements */ - /* This is analagous to what SPICE3 does with other device types */ - - - if(! is_array) { - - switch(value_type) { - - case IF_FLAG: - model->param[param_index]->element[0].bvalue = value->iValue; - model->param[param_index]->eltype = IF_FLAG; - break; - - case IF_INTEGER: - model->param[param_index]->element[0].ivalue = value->iValue; - model->param[param_index]->eltype = IF_INTEGER; - break; - - case IF_REAL: - model->param[param_index]->element[0].rvalue = value->rValue; - model->param[param_index]->eltype = IF_REAL; - break; - - case IF_STRING: - /* we don't trust the caller to keep the string alive, so copy it */ - model->param[param_index]->element[0].svalue = - TMALLOC(char, 1 + strlen(value->sValue)); - strcpy(model->param[param_index]->element[0].svalue, value->sValue); - model->param[param_index]->eltype = IF_STRING; - break; - - case IF_COMPLEX: - /* we don't trust the caller to have a parallel complex structure */ - /* so copy the real and imaginary parts explicitly */ - model->param[param_index]->element[0].cvalue.real = value->cValue.real; - model->param[param_index]->element[0].cvalue.imag = value->cValue.imag; - model->param[param_index]->eltype = IF_COMPLEX; - break; - - default: - return(E_BADPARM); - - } - } - else { /* it is an array */ - - for(i = 0; i < value->v.numValue; i++) { - - switch(value_type) { - - case IF_FLAGVEC: - model->param[param_index]->element[i].bvalue = value->v.vec.iVec[i]; - model->param[param_index]->eltype = IF_FLAGVEC; - break; - - case IF_INTVEC: - model->param[param_index]->element[i].ivalue = value->v.vec.iVec[i]; - model->param[param_index]->eltype = IF_INTVEC; - break; - - case IF_REALVEC: - model->param[param_index]->element[i].rvalue = value->v.vec.rVec[i]; - model->param[param_index]->eltype = IF_REALVEC; - break; - - case IF_STRINGVEC: - /* we don't trust the caller to keep the string alive, so copy it */ - model->param[param_index]->element[i].svalue = - TMALLOC(char, 1 + strlen(value->v.vec.sVec[i])); - strcpy(model->param[param_index]->element[i].svalue, value->v.vec.sVec[i]); - model->param[param_index]->eltype = IF_STRINGVEC; - break; - - case IF_CPLXVEC: - /* we don't trust the caller to have a parallel complex structure */ - /* so copy the real and imaginary parts explicitly */ - model->param[param_index]->element[i].cvalue.real = value->v.vec.cVec[i].real; - model->param[param_index]->element[i].cvalue.imag = value->v.vec.cVec[i].imag; - model->param[param_index]->eltype = IF_CPLXVEC; - break; - - default: - return(E_BADPARM); - - } /* end switch */ - - } /* end for number of elements of vector */ - - } /* end else */ - - return(OK); -} diff --git a/src/xspice/mif/mifsetup.c b/src/xspice/mif/mifsetup.c deleted file mode 100644 index 8bac8705f..000000000 --- a/src/xspice/mif/mifsetup.c +++ /dev/null @@ -1,559 +0,0 @@ -/*============================================================================ -FILE MIFsetup.c - -MEMBER OF process XSPICE - -Public Domain - -Georgia Tech Research Corporation -Atlanta, Georgia 30332 -PROJECT A-8503 - -AUTHORS - - 9/12/91 Bill Kuhn - -MODIFICATIONS - - - -SUMMARY - - This file contains the function called by SPICE to setup data structures - of a code model after parsing, but prior to beginning a simulation. The - major responsibilities of this function are to default values for model - parameters not given on the .model card, create equations in the matrix - for any voltage sources, and setup the matrix pointers used during - simulation to load the matrix. - -INTERFACES - - MIFsetup() - -REFERENCED FILES - - None. - -NON-STANDARD FEATURES - - None. - -============================================================================*/ - - -#include "ngspice/ngspice.h" -#include "ngspice/smpdefs.h" -#include "ngspice/devdefs.h" -#include "ngspice/sperror.h" - -#include "ngspice/mifproto.h" -#include "ngspice/mifparse.h" -#include "ngspice/mifdefs.h" -#include "ngspice/mifcmdat.h" - - - -/* define macro for easy creation of matrix entries/pointers for outputs */ -#define TSTALLOC(ptr,first,second) \ - do { if((smp_data_out->ptr = \ - SMPmakeElt(matrix, smp_data_out->first, smp_data_out->second)) == NULL) { \ - return(E_NOMEM); \ - } } while(0) - -/* define macro for easy creation of matrix entries/pointers for inputs */ -#define CTSTALLOC(ptr,first,second) \ - do { if((smp_data_out->input[k].port[l].ptr = \ - SMPmakeElt(matrix, smp_data_out->first, smp_data_cntl->second)) == NULL) { \ - return(E_NOMEM); \ - } } while(0) - - - -/* -MIFsetup - -This function is called by the CKTsetup() driver function to -prepare all code model structures and all code model instance -structures for simulation. It loops through all models of a -particular code model type and provides defaults for any -parameters not specified on a .model card. It loops through all -instances of the model and prepares the instance structures for -simulation. The most important setup task is the creation of -entries in the SPICE matrix and the storage of pointers to -locations of the matrix used by MIFload during a simulation. -*/ - - -int -MIFsetup( - SMPmatrix *matrix, /* The analog simulation matrix structure */ - GENmodel *inModel, /* The head of the model list */ - CKTcircuit *ckt, /* The circuit structure */ - int *states) /* The states vector */ -{ - MIFmodel *model; - MIFinstance *here; - - int mod_type; - int max_size; - int size; - int error; - - int num_conn; - int num_port; - int num_port_k; - int i; - int j; - int k; - int l; - - Mif_Port_Type_t type; - Mif_Port_Type_t in_type; - Mif_Port_Type_t out_type; - - Mif_Cntl_Src_Type_t cntl_src_type; - - Mif_Smp_Ptr_t *smp_data_out; - Mif_Smp_Ptr_t *smp_data_cntl; - - Mif_Param_Info_t *param_info; - /* Mif_Conn_Info_t *conn_info;*/ - - Mif_Boolean_t is_input; - Mif_Boolean_t is_output; - - char *suffix; - CKTnode *tmp; - - - /* Setup for access into MIF specific model data */ - model = (MIFmodel *) inModel; - mod_type = model->MIFmodType; - - - /* loop through all models of this type */ - - for( ; model != NULL; model = MIFnextModel(model)) { - - - /* For each parameter not given explicitly on the .model */ - /* card, default it */ - - for(i = 0; i < model->num_param; i++) { - - if(model->param[i]->is_null) { - - /* setup a pointer for quick access */ - param_info = &(DEVices[mod_type]->DEVpublic.param[i]); - - /* determine the size and allocate the parameter element(s) */ - if(! param_info->is_array) { - model->param[i]->size = 1; - model->param[i]->element = TMALLOC(Mif_Value_t, 1); - } else { /* parameter is an array */ - /* MIF_INP2A() parser assures that there is an associated array connection */ - /* Since several instances may share this model, we have to create an array */ - /* big enough for the instance with the biggest connection array */ - max_size = 0; - for(here = MIFinstances(model); here != NULL; here = MIFnextInstance(here)) { - size = here->conn[param_info->conn_ref]->size; - if(size > max_size) - max_size = size; - } - model->param[i]->size = max_size; - model->param[i]->element = TMALLOC(Mif_Value_t, max_size); - } /* end if parameter is an array */ - - /* set the parameter element(s) to default value */ - for(j = 0; j < model->param[i]->size; j++) { - - switch(param_info->type) { - - case MIF_BOOLEAN: - model->param[i]->element[j].bvalue = param_info->default_value.bvalue; - break; - - case MIF_INTEGER: - model->param[i]->element[j].ivalue = param_info->default_value.ivalue; - break; - - case MIF_REAL: - model->param[i]->element[j].rvalue = param_info->default_value.rvalue; - break; - - case MIF_COMPLEX: - model->param[i]->element[j].cvalue = param_info->default_value.cvalue; - break; - - case MIF_STRING: - model->param[i]->element[j].svalue = param_info->default_value.svalue; - break; - - default: - return(E_BADPARM); - } - - } /* end for number of elements in param array */ - - } /* end if null */ - - } /* end for number of parameters */ - - - /* For each instance, initialize stuff used by cm_... functions */ - - for(here = MIFinstances(model); here != NULL; here = MIFnextInstance(here)) { - - here->num_state = 0; - here->state = NULL; - - here->num_intgr = 0; - here->intgr = NULL; - - here->num_conv = 0; - here->conv = NULL; - } - - - /* For each instance, allocate runtime structs for output connections/ports */ - /* and grab a place in the state vector for all input connections/ports */ - - for(here = MIFinstances(model); here != NULL; here = MIFnextInstance(here)) { - /* Skip these expensive allocations if the instance is not analog */ - if(! here->analog) - continue; - - num_conn = here->num_conn; - for(i = 0; i < num_conn; i++) { - if((here->conn[i]->is_null) || (! here->conn[i]->is_output) ) - continue; - num_port = here->conn[i]->size; - for(j = 0; j < num_port; j++) { - here->conn[i]->port[j]->partial = - TMALLOC(Mif_Partial_t, num_conn); - here->conn[i]->port[j]->ac_gain = - TMALLOC(Mif_AC_Gain_t, num_conn); - here->conn[i]->port[j]->smp_data.input = - TMALLOC(Mif_Conn_Ptr_t, num_conn); - for(k = 0; k < num_conn; k++) { - if((here->conn[k]->is_null) || (! here->conn[k]->is_input) ) - continue; - num_port_k = here->conn[k]->size; - here->conn[i]->port[j]->partial[k].port = - TMALLOC(double, num_port_k); - here->conn[i]->port[j]->ac_gain[k].port = - TMALLOC(Mif_Complex_t, num_port_k); - here->conn[i]->port[j]->smp_data.input[k].port = - TMALLOC(Mif_Port_Ptr_t, num_port_k); - } - } - } - - num_conn = here->num_conn; - for(i = 0; i < num_conn; i++) { - if((here->conn[i]->is_null) || (! here->conn[i]->is_input) ) - continue; - num_port = here->conn[i]->size; - for(j = 0; j < num_port; j++) { - here->conn[i]->port[j]->old_input = *states; - (*states)++; - } - } - } - - - /* Loop through all instances of this model and for each port of each connection */ - /* create current equations, matrix entries, and matrix pointers as necessary. */ - - for(here = MIFinstances(model); here != NULL; here = MIFnextInstance(here)) { - /* Skip these expensive allocations if the instance is not analog */ - if(! here->analog) - continue; - - num_conn = here->num_conn; - - /* loop through all connections on this instance */ - /* and create matrix data needed for outputs and */ - /* V sources associated with I inputs */ - for(i = 0; i < num_conn; i++) { - - /* if the connection is null, skip to next connection */ - if(here->conn[i]->is_null) - continue; - - /* prepare things for convenient access later */ - is_input = here->conn[i]->is_input; - is_output = here->conn[i]->is_output; - num_port = here->conn[i]->size; - - /* loop through all ports on this connection */ - for(j = 0; j < num_port; j++) { - - /* if port is null, skip to next */ - if(here->conn[i]->port[j]->is_null) - continue; - - /* determine the type of this port */ - type = here->conn[i]->port[j]->type; - - /* create a pointer to the smp data for quick access */ - smp_data_out = &(here->conn[i]->port[j]->smp_data); - - /* if it has a voltage source output, */ - /* create the matrix data needed */ - if( (is_output && (type == MIF_VOLTAGE || type == MIF_DIFF_VOLTAGE)) || - (type == MIF_RESISTANCE || type == MIF_DIFF_RESISTANCE) ) { - - /* first, make the current equation */ - suffix = tprintf("branch_%d_%d", i, j); - error = CKTmkCur(ckt, &tmp, here->MIFname, suffix); - FREE(suffix); - if(error) - return(error); - smp_data_out->branch = tmp->number; - - /* ibranch is needed to find the input equation for RESISTANCE type */ - smp_data_out->ibranch = tmp->number; - - /* then make the matrix pointers */ - TSTALLOC(pos_branch, pos_node, branch); - TSTALLOC(neg_branch, neg_node, branch); - TSTALLOC(branch_pos, branch, pos_node); - TSTALLOC(branch_neg, branch, neg_node); - } /* end if current input */ - - /* if it is a current input */ - /* create the matrix data needed for the associated zero-valued V source */ - if(is_input && (type == MIF_CURRENT || type == MIF_DIFF_CURRENT)) { - - /* first, make the current equation */ - suffix = tprintf("ibranch_%d_%d", i, j); - error = CKTmkCur(ckt, &tmp, here->MIFname, suffix); - FREE(suffix); - if(error) - return(error); - smp_data_out->ibranch = tmp->number; - - /* then make the matrix pointers */ - TSTALLOC(pos_ibranch, pos_node, ibranch); - TSTALLOC(neg_ibranch, neg_node, ibranch); - TSTALLOC(ibranch_pos, ibranch, pos_node); - TSTALLOC(ibranch_neg, ibranch, neg_node); - } /* end if current input */ - - /* if it is a vsource current input (refers to a vsource elsewhere */ - /* in the circuit), locate the source and get its equation number */ - if(is_input && (type == MIF_VSOURCE_CURRENT)) { - smp_data_out->ibranch = CKTfndBranch(ckt, - here->conn[i]->port[j]->vsource_str); - if(smp_data_out->ibranch == 0) { - SPfrontEnd->IFerrorf (ERR_FATAL, - "%s: unknown controlling source %s", here->MIFname, here->conn[i]->port[j]->vsource_str); - return(E_BADPARM); - } - } /* end if vsource current input */ - - } /* end for number of ports */ - } /* end for number of connections */ - - /* now loop through all connections on the instance and create */ - /* matrix data needed for partial derivatives of outputs */ - for(i = 0; i < num_conn; i++) { - - /* if the connection is null or is not an output */ - /* skip to next connection */ - if((here->conn[i]->is_null) || (! here->conn[i]->is_output)) - continue; - - /* loop through all ports on this connection */ - - num_port = here->conn[i]->size; - for(j = 0; j < num_port; j++) { - - /* if port is null, skip to next */ - if(here->conn[i]->port[j]->is_null) - continue; - - /* determine the type of this output port */ - out_type = here->conn[i]->port[j]->type; - - /* create a pointer to the smp data for quick access */ - smp_data_out = &(here->conn[i]->port[j]->smp_data); - - /* for this port, loop through all connections */ - /* and all ports to touch on each possible input */ - for(k = 0; k < num_conn; k++) { - - /* if the connection is null or is not an input */ - /* skip to next connection */ - if((here->conn[k]->is_null) || (! here->conn[k]->is_input)) - continue; - - num_port_k = here->conn[k]->size; - /* loop through all the ports of this connection */ - for(l = 0; l < num_port_k; l++) { - - /* if port is null, skip to next */ - if(here->conn[k]->port[l]->is_null) - continue; - - /* determine the type of this input port */ - in_type = here->conn[k]->port[l]->type; - - /* create a pointer to the smp data for quick access */ - smp_data_cntl = &(here->conn[k]->port[l]->smp_data); - - /* determine type of controlled source according */ - /* to input and output types */ - cntl_src_type = MIFget_cntl_src_type(in_type, out_type); - - switch(cntl_src_type) { - case MIF_VCVS: - CTSTALLOC(e.branch_poscntl, branch, pos_node); - CTSTALLOC(e.branch_negcntl, branch, neg_node); - break; - case MIF_ICIS: - CTSTALLOC(f.pos_ibranchcntl, pos_node, ibranch); - CTSTALLOC(f.neg_ibranchcntl, neg_node, ibranch); - break; - case MIF_VCIS: - CTSTALLOC(g.pos_poscntl, pos_node, pos_node); - CTSTALLOC(g.pos_negcntl, pos_node, neg_node); - CTSTALLOC(g.neg_poscntl, neg_node, pos_node); - CTSTALLOC(g.neg_negcntl, neg_node, neg_node); - break; - case MIF_ICVS: - CTSTALLOC(h.branch_ibranchcntl, branch, ibranch); - break; - case MIF_minus_one: - break; - } /* end switch on controlled source type */ - } /* end for number of input ports */ - } /* end for number of input connections */ - } /* end for number of output ports */ - } /* end for number of output connections */ - - } /* end for all instances */ - - - } /* end for all models of this type */ - - return(OK); -} - -int -MIFunsetup(GENmodel *inModel,CKTcircuit *ckt) -{ - MIFmodel *model; - MIFinstance *here; - Mif_Smp_Ptr_t *smp_data_out; - Mif_Port_Type_t type; - Mif_Boolean_t is_input, is_output; - int num_conn, num_port, i, j, k; - - - for (model = (MIFmodel *)inModel; model != NULL; - model = MIFnextModel(model)) { - for (i = 0; i < model->num_param; i++) - if (model->param[i]->is_null) - tfree(model->param[i]->element); - for(here = MIFinstances(model); here != NULL; here = MIFnextInstance(here)) { - /* Skip these expensive allocations if the instance is not analog */ - if(! here->analog) - continue; - - num_conn = here->num_conn; - - /* loop through all connections on this instance */ - /* and create matrix data needed for outputs and */ - /* V sources associated with I inputs */ - for(i = 0; i < num_conn; i++) { - - /* if the connection is null, skip to next connection */ - if(here->conn[i]->is_null) - continue; - - /* prepare things for convenient access later */ - is_input = here->conn[i]->is_input; - is_output = here->conn[i]->is_output; - num_port = here->conn[i]->size; - - /* loop through all ports on this connection */ - for(j = 0; j < num_port; j++) { - - /* if port is null, skip to next */ - if(here->conn[i]->port[j]->is_null) - continue; - - /* determine the type of this port */ - type = here->conn[i]->port[j]->type; - - /* create a pointer to the smp data for quick access */ - smp_data_out = &(here->conn[i]->port[j]->smp_data); - - /* if it has a voltage source output, */ - /* create the matrix data needed */ - if( (is_output && (type == MIF_VOLTAGE || type == MIF_DIFF_VOLTAGE)) || - (type == MIF_RESISTANCE || type == MIF_DIFF_RESISTANCE) ) { - CKTdltNNum(ckt, smp_data_out->branch); - smp_data_out->branch = 0; - smp_data_out->ibranch = 0; - } /* end if current input */ - - /* if it is a current input */ - /* create the matrix data needed for the associated zero-valued V source */ - if(is_input && (type == MIF_CURRENT || type == MIF_DIFF_CURRENT)) { - CKTdltNNum(ckt, smp_data_out->ibranch); - smp_data_out->ibranch = 0; - } /* end if current input */ - - /* if it is a vsource current input (refers to a vsource elsewhere */ - /* in the circuit), locate the source and get its equation number */ - if(is_input && (type == MIF_VSOURCE_CURRENT)) { - smp_data_out->ibranch = 0; - } /* end if vsource current input */ - - /* free memory allocated in MIFsetup */ - for (k = 0; k < num_conn; k++) { - if ((here->conn[k]->is_null) || (!here->conn[k]->is_input)) - continue; - if (here->conn[i]->port[j]->partial) - tfree(here->conn[i]->port[j]->partial[k].port); - if (here->conn[i]->port[j]->ac_gain) - tfree(here->conn[i]->port[j]->ac_gain[k].port); - if (here->conn[i]->port[j]->smp_data.input) - tfree(here->conn[i]->port[j]->smp_data.input[k].port); - } - tfree(here->conn[i]->port[j]->partial); - tfree(here->conn[i]->port[j]->ac_gain); - tfree(here->conn[i]->port[j]->smp_data.input); - /* free memory allocated in mif_inp2.c */ - tfree(here->conn[i]->port[j]->type_str); - } /* end for number of ports */ - } /* end for number of connections */ - /* free memory allocated by cm_analog_alloc and cm_analog_converge */ - tfree(here->state); - tfree(here->conv); - tfree(here->intgr); - - /* de-allocate the memory that has been allocated locally in the code model during INIT */ - if (here->callback) { - Mif_Private_t cm_data; - /* Prepare the structure to be passed to the code model */ - cm_data.num_conn = here->num_conn; - cm_data.conn = here->conn; - cm_data.num_param = here->num_param; - cm_data.param = here->param; - cm_data.num_inst_var = here->num_inst_var; - cm_data.inst_var = here->inst_var; - cm_data.callback = &(here->callback); - - here->callback(&cm_data, MIF_CB_DESTROY); - } - - here->initialized = MIF_FALSE; - } /* end for all instances */ - } - /* printf("MIFunsetup completed.\n");*/ - return OK; -} diff --git a/src/xspice/mif/miftrunc.c b/src/xspice/mif/miftrunc.c deleted file mode 100644 index cfaf11c72..000000000 --- a/src/xspice/mif/miftrunc.c +++ /dev/null @@ -1,222 +0,0 @@ -/*============================================================================ -FILE MIFtrunc.c - -MEMBER OF process XSPICE - -Public Domain - -Georgia Tech Research Corporation -Atlanta, Georgia 30332 -PROJECT A-8503 - -AUTHORS - - 9/12/91 Bill Kuhn - -MODIFICATIONS - - - -SUMMARY - - This file contains the function called by SPICE to check truncation - error of an integration state used by a code model. - -INTERFACES - - MIFtrunc() - -REFERENCED FILES - - None. - -NON-STANDARD FEATURES - - None. - -============================================================================*/ - -/* #include "prefix.h" */ -#include "ngspice/ngspice.h" -#include -#include "ngspice/cktdefs.h" -#include "ngspice/sperror.h" - -//#include "util.h" -#include - -#include "ngspice/mifproto.h" -#include "ngspice/mifparse.h" -#include "ngspice/mifdefs.h" -#include "ngspice/mifcmdat.h" - -/* #include "suffix.h" */ - - - -static void MIFterr(Mif_Intgr_t *intgr, CKTcircuit *ckt, double *timeStep); - - - -/* -MIFtrunc - -This function is called by the CKTtrunc() driver function to -check numerical integration truncation error of any integrals -associated with instances of a particular code model type. It -traverses all models of that type and all instances of each -model. For each instance, it looks in the instance structure to -determine if any variables allocated by cm_analog_alloc() have been used -in a call to cm_analog_integrate(). If so, the truncation error of that -integration is computed and used to set the maximum delta allowed -for the current timestep. -*/ - - -int -MIFtrunc( - GENmodel *inModel, /* The head of the model list */ - CKTcircuit *ckt, /* The circuit structure */ - double *timeStep) /* The timestep delta */ -{ - - MIFmodel *model; - MIFinstance *here; - - int i; - - - /* Setup for access into MIF specific model data */ - model = (MIFmodel *) inModel; - - - /* loop through all models of this type */ - for( ; model != NULL; model = MIFnextModel(model)) { - - /* Loop through all instances of this model */ - for(here = MIFinstances(model); here != NULL; here = MIFnextInstance(here)) { - - /* Loop through all integration states on the instance */ - for(i = 0; i < here->num_intgr; i++) { - - /* Limit timeStep according to truncation error */ - MIFterr(&(here->intgr[i]), ckt, timeStep); - - } /* end for number of integration states */ - } /* end for all instances */ - } /* end for all models of this type */ - - - return(OK); -} - - - -/* - * - * This is a modified version of the function CKTterr(). It limits - * timeStep according to computed truncation error. - * - * Modifications are Copyright 1991 Georgia Tech Research Institute - * - */ - - -static void MIFterr( - Mif_Intgr_t *intgr, - CKTcircuit *ckt, - double *timeStep) -{ - double volttol; - double chargetol; - double tol; - double del; - double diff[8]; - double deltmp[8]; - double factor; - - int i; - int j; - - static double gearCoeff[] = { - .5, - .2222222222, - .1363636364, - .096, - .07299270073, - .05830903790 - }; - static double trapCoeff[] = { - .5, - .08333333333 - }; - - /* Define new local variables. Dimension = number of states in ckt struct */ - char *byte_aligned_state_ptr; - double *state_ptr[8]; - - - /* Set state pointers to the (possibly byte-aligned) states */ - for(i = 0; i < 8; i++) { - byte_aligned_state_ptr = (char *) ckt->CKTstates[i]; - byte_aligned_state_ptr += intgr->byte_index; - state_ptr[i] = (double *) byte_aligned_state_ptr; - } - - /* Modify computation of volttol to not include current from previous timestep */ - /* which is unavailable in this implementation. Note that this makes the */ - /* the overall trunction error timestep smaller (which is better accuracy) */ - - /* Old code */ -/* - volttol = ckt->CKTabstol + ckt->CKTreltol * - MAX( fabs(ckt->CKTstate0[ccap]), fabs(ckt->CKTstate1[ccap])); -*/ - - /* New code */ - volttol = ckt->CKTabstol + ckt->CKTreltol * fabs(*(state_ptr[0]) - *(state_ptr[1])) - / ckt->CKTdelta; - - /* Modify remaining references to qcap to access byte-aligned MIF state */ - /* Otherwise, remaining code is same as SPICE3C1 ... */ - - chargetol = MAX(fabs(*(state_ptr[0])),fabs(*(state_ptr[1]))); - chargetol = ckt->CKTreltol * MAX(chargetol,ckt->CKTchgtol)/ckt->CKTdelta; - tol = MAX(volttol,chargetol); - /* now divided differences */ - for(i=ckt->CKTorder+1;i>=0;i--) { - diff[i] = *(state_ptr[i]); - } - for(i=0 ; i <= ckt->CKTorder ; i++) { - deltmp[i] = ckt->CKTdeltaOld[i]; - } - j = ckt->CKTorder; - for (;;) { - for(i=0;i <= j;i++) { - diff[i] = (diff[i] - diff[i+1])/deltmp[i]; - } - if (--j < 0) break; - for(i=0;i <= j;i++) { - deltmp[i] = deltmp[i+1] + ckt->CKTdeltaOld[i]; - } - } - switch(ckt->CKTintegrateMethod) { - case GEAR: - default: - factor = gearCoeff[ckt->CKTorder-1]; - break; - - case TRAPEZOIDAL: - factor = trapCoeff[ckt->CKTorder - 1] ; - break; - } - del = ckt->CKTtrtol * tol/MAX(ckt->CKTabstol,factor * fabs(diff[0])); - if(ckt->CKTorder == 2) { - del = sqrt(del); - } else if (ckt->CKTorder > 2) { - del = exp(log(del)/ckt->CKTorder); - } - *timeStep = MIN(*timeStep,del); - return; - -} diff --git a/src/xspice/mif/mifutil.c b/src/xspice/mif/mifutil.c deleted file mode 100644 index 6c9200df4..000000000 --- a/src/xspice/mif/mifutil.c +++ /dev/null @@ -1,401 +0,0 @@ -/*============================================================================ -FILE MIFutil.c - -MEMBER OF process XSPICE - -Public Domain - -Georgia Tech Research Corporation -Atlanta, Georgia 30332 -PROJECT A-8503 - -AUTHORS - - 9/12/91 Bill Kuhn - -MODIFICATIONS - - - -SUMMARY - - This file contains various utility routines used by the MIF package. - -INTERFACES - - MIFgettok() - MIFget_token() - MIFget_cntl_src_type() - MIFcopy() - -REFERENCED FILES - - None. - -NON-STANDARD FEATURES - - None. - -============================================================================*/ - -/* #include "prefix.h" */ -#include "ngspice/ngspice.h" - -//#include "util.h" -#include "ngspice/cpstd.h" -#include -#include "ngspice/miftypes.h" -#include "ngspice/mifproto.h" - -/* #include "suffix.h" */ - - - - -/* - -MIFgettok - -Get the next token from the input string. The input string pointer -is advanced to the following token and the token from the input -string is copied to malloced storage and a pointer to that storage -is returned. The original input string is undisturbed. - -MIFgettok treats ( and ) like whitespace. - -*/ - -char *MIFgettok(char **s) -{ - - char *ret_str; /* storage for returned string */ - char *end; - char *beg; - - /* skip over white spaces, '=', '(', ')', and ',' up to next token */ - while (isspace_c(**s) || (**s == '=') || - (**s == '(') || (**s == ')') || (**s == ',')) - (*s)++; - - /* isolate the next token */ - - switch (**s) { - - case '\0': - return(NULL); - - case '<': - case '>': - case '[': - case ']': - case '~': - case '%': - beg = *s; - (*s)++; - ret_str = copy_substring(beg, *s); - - /* skip over white spaces, '=', '(', ')', and ',' up to next token */ - while (isspace_c(**s) || (**s == '=') || - (**s == '(') || (**s == ')') || (**s == ',')) - (*s)++; - - return ret_str; - break; - - default: - /* if first character is a quote, read until the closing */ - /* quote, or the end of string, discarding the quotes */ - if (**s == '"') { - (*s)++; - ret_str = gettok_char(s, '"', FALSE, FALSE); - - if (**s == '"') - (*s)++; - - /* skip over white spaces, '=', '(', ')', and ',' up to next token */ - while (isspace_c(**s) || (**s == '=') || - (**s == '(') || (**s == ')') || (**s == ',')) - (*s)++; - - return ret_str; - } - /* else, read until the next delimiter */ - else { - beg = *s; - while ((**s != '\0') && - (!(isspace_c(**s) || (**s == '=') || (**s == '%') || - (**s == '(') || (**s == ')') || (**s == ',') || - (**s == '[') || (**s == ']') || - (**s == '<') || (**s == '>') || (**s == '~') - ))) { - (*s)++; - } - end = *s; - - /* skip over white spaces, '=', '(', ')', and ',' up to next token */ - while (isspace_c(**s) || (**s == '=') || - (**s == '(') || (**s == ')') || (**s == ',')) - (*s)++; - - return (copy_substring(beg, end)); - } - break; - } -} - -#if 0 -/* preliminary fix */ -char *MIFgettok(char **s) -{ - - char *buf; /* temporary storage to copy token into */ - char *ret_str; /* storage for returned string */ - - int i; - - /* allocate space big enough for the whole string */ - - buf = TMALLOC(char, strlen(*s) + 2); - /* FIXME, not yet understood why +1 leads to spurious crash in tfree, if optimized code for Windows*/ - - /* skip over any white space */ - - while(isspace_c(**s) || (**s == '=') || - (**s == '(') || (**s == ')') || (**s == ',')) - (*s)++; - - /* isolate the next token */ - - switch(**s) { - - case '\0': - FREE(buf); - return(NULL); - - case '<': - case '>': - case '[': - case ']': - case '~': - case '%': - buf[0] = **s; - buf[1] = '\0'; - (*s)++; - break; - - default: - i = 0; - /* if first character is a quote, read until the closing */ - /* quote, or the end of string, discarding the quotes */ - if(**s == '"') { - (*s)++; - while( (**s != '\0') && (**s != '"') ) { - buf[i] = **s; - i++; - (*s)++; - } - if(**s == '"') - (*s)++; - } - /* else, read until the next delimiter */ - else { - while( (**s != '\0') && - (! ( isspace_c(**s) || (**s == '=') || (**s == '%') || - (**s == '(') || (**s == ')') || (**s == ',') || - (**s == '[') || (**s == ']') || - (**s == '<') || (**s == '>') || (**s == '~') - ) ) ) { - buf[i] = **s; - i++; - (*s)++; - } - } - - buf[i] = '\0'; - break; - } - - /* skip over white space up to next token */ - - while(isspace_c(**s) || (**s == '=') || - (**s == '(') || (**s == ')') || (**s == ',')) - (*s)++; - - /* make a copy using only the space needed by the string length */ - /* Changed from copy to MIFcopy by SDB on 6.22.2003 */ - ret_str = MIFcopy(buf); - FREE(buf); - - return(ret_str); -} -#endif - - - -/* - -MIFget_token - -Get the next token from the input string together with its type. -The input string pointer -is advanced to the following token and the token from the input -string is copied to malloced storage and a pointer to that storage -is returned. The original input string is undisturbed. - -*/ - -char *MIFget_token( - char **s, /* The text line to get the token from */ - Mif_Token_Type_t *type) /* The type of token found */ -{ - - char *ret_str; /* storage for returned string */ - - /* get the token from the input line */ - - ret_str = MIFgettok(s); - - - /* if no next token, return */ - - if(ret_str == NULL) { - *type = MIF_NO_TOK; - return(NULL); - } - - /* else, determine and return token type */ - - switch(*ret_str) { - - case '[': - *type = MIF_LARRAY_TOK; - break; - - case ']': - *type = MIF_RARRAY_TOK; - break; - - case '<': - *type = MIF_LCOMPLEX_TOK; - break; - - case '>': - *type = MIF_RCOMPLEX_TOK; - break; - - case '%': - *type = MIF_PERCENT_TOK; - break; - - case '~': - *type = MIF_TILDE_TOK; - break; - - default: - if(strcmp(ret_str, "null") == 0) - *type = MIF_NULL_TOK; - else - *type = MIF_STRING_TOK; - break; - - } - - return(ret_str); -} - - - -/* -MIFget_cntl_src_type - -This function takes an input connection/port type and an output -connection/port type (MIF_VOLTAGE, MIF_CURRENT, etc.) and maps -this pair to one of the four controlled source types used in -SPICE (VCVS, VCIS, ICVS, ICIS). -*/ - - -Mif_Cntl_Src_Type_t MIFget_cntl_src_type( - Mif_Port_Type_t in_port_type, /* The type of the input port */ - Mif_Port_Type_t out_port_type) /* The type of the output port */ -{ - - switch(in_port_type) { - - case MIF_VOLTAGE: - case MIF_DIFF_VOLTAGE: - case MIF_CONDUCTANCE: - case MIF_DIFF_CONDUCTANCE: - - switch(out_port_type) { - - case MIF_VOLTAGE: - case MIF_DIFF_VOLTAGE: - case MIF_RESISTANCE: - case MIF_DIFF_RESISTANCE: - return(MIF_VCVS); - break; - - case MIF_CURRENT: - case MIF_DIFF_CURRENT: - case MIF_CONDUCTANCE: - case MIF_DIFF_CONDUCTANCE: - return(MIF_VCIS); - break; - - default: - break; - - } - break; - - case MIF_CURRENT: - case MIF_DIFF_CURRENT: - case MIF_VSOURCE_CURRENT: - case MIF_RESISTANCE: - case MIF_DIFF_RESISTANCE: - - switch(out_port_type) { - - case MIF_VOLTAGE: - case MIF_DIFF_VOLTAGE: - case MIF_RESISTANCE: - case MIF_DIFF_RESISTANCE: - return(MIF_ICVS); - break; - - case MIF_CURRENT: - case MIF_DIFF_CURRENT: - case MIF_CONDUCTANCE: - case MIF_DIFF_CONDUCTANCE: - return(MIF_ICIS); - break; - - default: - break; - - } - break; - - default: - break; - - } - - return(MIF_minus_one); -} - - -/* -MIFcopy - -This function allocates a new copy of a string. -*/ - -char *MIFcopy(char *str) -{ - if(str) - return copy(str); - else - return NULL; -} diff --git a/src/xspice/xspice.c b/src/xspice/xspice.c deleted file mode 100644 index 620981b91..000000000 --- a/src/xspice/xspice.c +++ /dev/null @@ -1,86 +0,0 @@ -#include "ngspice/ngspice.h" -#include "ngspice/mif.h" -#include "ngspice/cm.h" -#include "ngspice/dllitf.h" - -/*how annoying!, needed for structure below*/ -static void *tcalloc(size_t a, size_t b) { - return tmalloc(a*b); /* FIXME, tcalloc must zero !?!? */ -} - -static void no_free(const void *p) { - NG_IGNORE(p); -} - -static FILE * no_file(void) { - return NULL; -} - -struct coreInfo_t coreInfo = -{ - MIF_INP2A, - MIFgetMod, - MIFgetValue, - MIFsetup, - MIFunsetup, - MIFload, - MIFmParam, - MIFask, - MIFmAsk, - MIFtrunc, - MIFconvTest, - MIFdelete, - MIFmDelete, - MIFdestroy, - MIFgettok, - MIFget_token, - MIFget_cntl_src_type, - MIFcopy, - cm_climit_fcn, - cm_smooth_corner, - cm_smooth_discontinuity, - cm_smooth_pwl, - cm_analog_ramp_factor, - cm_analog_alloc, - cm_analog_get_ptr, - cm_analog_integrate, - cm_analog_converge, - cm_analog_set_temp_bkpt, - cm_analog_set_perm_bkpt, - cm_analog_not_converged, - cm_analog_auto_partial, - cm_event_alloc, - cm_event_get_ptr, - cm_event_queue, - cm_message_get_errmsg, - cm_message_send, - cm_netlist_get_c, - cm_netlist_get_l, - cm_complex_set, - cm_complex_add, - cm_complex_subtract, - cm_complex_multiply, - cm_complex_divide, - cm_get_path, - cm_get_circuit, - no_file, - no_file, - no_file, -#ifndef HAVE_LIBGC - tmalloc, - tcalloc, - trealloc, - txfree, - tmalloc, - trealloc, - txfree -#else - GC_malloc, - tcalloc, - GC_realloc, - no_free, - GC_malloc, - GC_realloc, - no_free -#endif -}; diff --git a/visualc/src/include/ngspice/config.h b/visualc/src/include/ngspice/config.h index 22b371009..5e220f4ee 100644 --- a/visualc/src/include/ngspice/config.h +++ b/visualc/src/include/ngspice/config.h @@ -30,11 +30,11 @@ /* The xspice enhancements */ /* XSPICE is always included in the Visual Studio compiled executable */ -#define XSPICE 1 +// #define XSPICE 1 /* don't undef XSPICE, otherwise compilation will fail */ /* The CIDER enhancements */ -#define CIDER 1 +// #define CIDER 1 /* don't undef CIDER, otherwise compilation will fail */ /* Support for Verilog-A(MS) models */ diff --git a/visualc/vngspice.sln b/visualc/vngspice.sln index 260d55371..244616060 100644 --- a/visualc/vngspice.sln +++ b/visualc/vngspice.sln @@ -4,47 +4,6 @@ Microsoft Visual Studio Solution File, Format Version 12.00 VisualStudioVersion = 16.0.29806.167 MinimumVisualStudioVersion = 10.0.40219.1 Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "vngspice", "vngspice.vcxproj", "{83E315C7-EDD3-4F6B-AF28-87A92A4FA49A}" - ProjectSection(ProjectDependencies) = postProject - {D701EA0E-B8B0-41D6-A90E-A0D8233F15FB} = {D701EA0E-B8B0-41D6-A90E-A0D8233F15FB} - {4BB60215-9A09-4192-9DB6-1A0CA823AFCA} = {4BB60215-9A09-4192-9DB6-1A0CA823AFCA} - {13500662-AF0B-4AB6-9AF9-BC3E07B5C1C6} = {13500662-AF0B-4AB6-9AF9-BC3E07B5C1C6} - {7C865696-FA10-43AE-A20B-22AE72A165E2} = {7C865696-FA10-43AE-A20B-22AE72A165E2} - {8271FEA2-8AC0-4B6D-BAEA-A503D37B5DB2} = {8271FEA2-8AC0-4B6D-BAEA-A503D37B5DB2} - {9ABEC5F2-F6C6-41DE-88AB-02460A07F46E} = {9ABEC5F2-F6C6-41DE-88AB-02460A07F46E} - {7A6473F5-AFED-4910-88D2-6204DA829832} = {7A6473F5-AFED-4910-88D2-6204DA829832} - EndProjectSection -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "cmpp", "xspice\cmpp\cmpp.vcxproj", "{7C865696-FA10-43AE-A20B-22AE72A165E2}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "analog", "xspice\analog.vcxproj", "{8271FEA2-8AC0-4B6D-BAEA-A503D37B5DB2}" - ProjectSection(ProjectDependencies) = postProject - {7C865696-FA10-43AE-A20B-22AE72A165E2} = {7C865696-FA10-43AE-A20B-22AE72A165E2} - EndProjectSection -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "digital", "xspice\digital.vcxproj", "{9ABEC5F2-F6C6-41DE-88AB-02460A07F46E}" - ProjectSection(ProjectDependencies) = postProject - {7C865696-FA10-43AE-A20B-22AE72A165E2} = {7C865696-FA10-43AE-A20B-22AE72A165E2} - EndProjectSection -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "spice2poly", "xspice\spice2poly.vcxproj", "{D701EA0E-B8B0-41D6-A90E-A0D8233F15FB}" - ProjectSection(ProjectDependencies) = postProject - {7C865696-FA10-43AE-A20B-22AE72A165E2} = {7C865696-FA10-43AE-A20B-22AE72A165E2} - EndProjectSection -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "table", "xspice\table.vcxproj", "{7A6473F5-AFED-4910-88D2-6204DA829832}" - ProjectSection(ProjectDependencies) = postProject - {7C865696-FA10-43AE-A20B-22AE72A165E2} = {7C865696-FA10-43AE-A20B-22AE72A165E2} - EndProjectSection -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "xtradev", "xspice\xtradev.vcxproj", "{4BB60215-9A09-4192-9DB6-1A0CA823AFCA}" - ProjectSection(ProjectDependencies) = postProject - {7C865696-FA10-43AE-A20B-22AE72A165E2} = {7C865696-FA10-43AE-A20B-22AE72A165E2} - EndProjectSection -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "xtraevt", "xspice\xtraevt.vcxproj", "{13500662-AF0B-4AB6-9AF9-BC3E07B5C1C6}" - ProjectSection(ProjectDependencies) = postProject - {7C865696-FA10-43AE-A20B-22AE72A165E2} = {7C865696-FA10-43AE-A20B-22AE72A165E2} - EndProjectSection EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution @@ -86,174 +45,6 @@ Global {83E315C7-EDD3-4F6B-AF28-87A92A4FA49A}.ReleaseOMP|x64.Build.0 = ReleaseOMP|x64 {83E315C7-EDD3-4F6B-AF28-87A92A4FA49A}.ReleaseOMP|x86.ActiveCfg = ReleaseOMP|Win32 {83E315C7-EDD3-4F6B-AF28-87A92A4FA49A}.ReleaseOMP|x86.Build.0 = ReleaseOMP|Win32 - {7C865696-FA10-43AE-A20B-22AE72A165E2}.console_debug|x64.ActiveCfg = Debug|x64 - {7C865696-FA10-43AE-A20B-22AE72A165E2}.console_debug|x64.Build.0 = Debug|x64 - {7C865696-FA10-43AE-A20B-22AE72A165E2}.console_debug|x86.ActiveCfg = Debug|Win32 - {7C865696-FA10-43AE-A20B-22AE72A165E2}.console_debug|x86.Build.0 = Debug|Win32 - {7C865696-FA10-43AE-A20B-22AE72A165E2}.console_release_omp|x64.ActiveCfg = Release|x64 - {7C865696-FA10-43AE-A20B-22AE72A165E2}.console_release_omp|x64.Build.0 = Release|x64 - {7C865696-FA10-43AE-A20B-22AE72A165E2}.console_release_omp|x86.ActiveCfg = Release|Win32 - {7C865696-FA10-43AE-A20B-22AE72A165E2}.console_release_omp|x86.Build.0 = Release|Win32 - {7C865696-FA10-43AE-A20B-22AE72A165E2}.console_release|x64.ActiveCfg = Release|x64 - {7C865696-FA10-43AE-A20B-22AE72A165E2}.console_release|x64.Build.0 = Release|x64 - {7C865696-FA10-43AE-A20B-22AE72A165E2}.console_release|x86.ActiveCfg = Release|Win32 - {7C865696-FA10-43AE-A20B-22AE72A165E2}.console_release|x86.Build.0 = Release|Win32 - {7C865696-FA10-43AE-A20B-22AE72A165E2}.Debug|x64.ActiveCfg = Debug|x64 - {7C865696-FA10-43AE-A20B-22AE72A165E2}.Debug|x64.Build.0 = Debug|x64 - {7C865696-FA10-43AE-A20B-22AE72A165E2}.Debug|x86.ActiveCfg = Debug|Win32 - {7C865696-FA10-43AE-A20B-22AE72A165E2}.Debug|x86.Build.0 = Debug|Win32 - {7C865696-FA10-43AE-A20B-22AE72A165E2}.Release|x64.ActiveCfg = Release|x64 - {7C865696-FA10-43AE-A20B-22AE72A165E2}.Release|x64.Build.0 = Release|x64 - {7C865696-FA10-43AE-A20B-22AE72A165E2}.Release|x86.ActiveCfg = Release|Win32 - {7C865696-FA10-43AE-A20B-22AE72A165E2}.Release|x86.Build.0 = Release|Win32 - {7C865696-FA10-43AE-A20B-22AE72A165E2}.ReleaseOMP|x64.ActiveCfg = Release|x64 - {7C865696-FA10-43AE-A20B-22AE72A165E2}.ReleaseOMP|x64.Build.0 = Release|x64 - {7C865696-FA10-43AE-A20B-22AE72A165E2}.ReleaseOMP|x86.ActiveCfg = Release|Win32 - {7C865696-FA10-43AE-A20B-22AE72A165E2}.ReleaseOMP|x86.Build.0 = Release|Win32 - {8271FEA2-8AC0-4B6D-BAEA-A503D37B5DB2}.console_debug|x64.ActiveCfg = Debug|x64 - {8271FEA2-8AC0-4B6D-BAEA-A503D37B5DB2}.console_debug|x64.Build.0 = Debug|x64 - {8271FEA2-8AC0-4B6D-BAEA-A503D37B5DB2}.console_debug|x86.ActiveCfg = Debug|Win32 - {8271FEA2-8AC0-4B6D-BAEA-A503D37B5DB2}.console_debug|x86.Build.0 = Debug|Win32 - {8271FEA2-8AC0-4B6D-BAEA-A503D37B5DB2}.console_release_omp|x64.ActiveCfg = Release|x64 - {8271FEA2-8AC0-4B6D-BAEA-A503D37B5DB2}.console_release_omp|x64.Build.0 = Release|x64 - {8271FEA2-8AC0-4B6D-BAEA-A503D37B5DB2}.console_release_omp|x86.ActiveCfg = Release|Win32 - {8271FEA2-8AC0-4B6D-BAEA-A503D37B5DB2}.console_release_omp|x86.Build.0 = Release|Win32 - {8271FEA2-8AC0-4B6D-BAEA-A503D37B5DB2}.console_release|x64.ActiveCfg = Release|x64 - {8271FEA2-8AC0-4B6D-BAEA-A503D37B5DB2}.console_release|x64.Build.0 = Release|x64 - {8271FEA2-8AC0-4B6D-BAEA-A503D37B5DB2}.console_release|x86.ActiveCfg = Release|Win32 - {8271FEA2-8AC0-4B6D-BAEA-A503D37B5DB2}.console_release|x86.Build.0 = Release|Win32 - {8271FEA2-8AC0-4B6D-BAEA-A503D37B5DB2}.Debug|x64.ActiveCfg = Debug|x64 - {8271FEA2-8AC0-4B6D-BAEA-A503D37B5DB2}.Debug|x64.Build.0 = Debug|x64 - {8271FEA2-8AC0-4B6D-BAEA-A503D37B5DB2}.Debug|x86.ActiveCfg = Debug|Win32 - {8271FEA2-8AC0-4B6D-BAEA-A503D37B5DB2}.Debug|x86.Build.0 = Debug|Win32 - {8271FEA2-8AC0-4B6D-BAEA-A503D37B5DB2}.Release|x64.ActiveCfg = Release|x64 - {8271FEA2-8AC0-4B6D-BAEA-A503D37B5DB2}.Release|x64.Build.0 = Release|x64 - {8271FEA2-8AC0-4B6D-BAEA-A503D37B5DB2}.Release|x86.ActiveCfg = Release|Win32 - {8271FEA2-8AC0-4B6D-BAEA-A503D37B5DB2}.Release|x86.Build.0 = Release|Win32 - {8271FEA2-8AC0-4B6D-BAEA-A503D37B5DB2}.ReleaseOMP|x64.ActiveCfg = Release|x64 - {8271FEA2-8AC0-4B6D-BAEA-A503D37B5DB2}.ReleaseOMP|x64.Build.0 = Release|x64 - {8271FEA2-8AC0-4B6D-BAEA-A503D37B5DB2}.ReleaseOMP|x86.ActiveCfg = Release|Win32 - {8271FEA2-8AC0-4B6D-BAEA-A503D37B5DB2}.ReleaseOMP|x86.Build.0 = Release|Win32 - {9ABEC5F2-F6C6-41DE-88AB-02460A07F46E}.console_debug|x64.ActiveCfg = Debug|x64 - {9ABEC5F2-F6C6-41DE-88AB-02460A07F46E}.console_debug|x64.Build.0 = Debug|x64 - {9ABEC5F2-F6C6-41DE-88AB-02460A07F46E}.console_debug|x86.ActiveCfg = Debug|Win32 - {9ABEC5F2-F6C6-41DE-88AB-02460A07F46E}.console_debug|x86.Build.0 = Debug|Win32 - {9ABEC5F2-F6C6-41DE-88AB-02460A07F46E}.console_release_omp|x64.ActiveCfg = Release|x64 - {9ABEC5F2-F6C6-41DE-88AB-02460A07F46E}.console_release_omp|x64.Build.0 = Release|x64 - {9ABEC5F2-F6C6-41DE-88AB-02460A07F46E}.console_release_omp|x86.ActiveCfg = Release|Win32 - {9ABEC5F2-F6C6-41DE-88AB-02460A07F46E}.console_release_omp|x86.Build.0 = Release|Win32 - {9ABEC5F2-F6C6-41DE-88AB-02460A07F46E}.console_release|x64.ActiveCfg = Release|x64 - {9ABEC5F2-F6C6-41DE-88AB-02460A07F46E}.console_release|x64.Build.0 = Release|x64 - {9ABEC5F2-F6C6-41DE-88AB-02460A07F46E}.console_release|x86.ActiveCfg = Release|Win32 - {9ABEC5F2-F6C6-41DE-88AB-02460A07F46E}.console_release|x86.Build.0 = Release|Win32 - {9ABEC5F2-F6C6-41DE-88AB-02460A07F46E}.Debug|x64.ActiveCfg = Debug|x64 - {9ABEC5F2-F6C6-41DE-88AB-02460A07F46E}.Debug|x64.Build.0 = Debug|x64 - {9ABEC5F2-F6C6-41DE-88AB-02460A07F46E}.Debug|x86.ActiveCfg = Debug|Win32 - {9ABEC5F2-F6C6-41DE-88AB-02460A07F46E}.Debug|x86.Build.0 = Debug|Win32 - {9ABEC5F2-F6C6-41DE-88AB-02460A07F46E}.Release|x64.ActiveCfg = Release|x64 - {9ABEC5F2-F6C6-41DE-88AB-02460A07F46E}.Release|x64.Build.0 = Release|x64 - {9ABEC5F2-F6C6-41DE-88AB-02460A07F46E}.Release|x86.ActiveCfg = Release|Win32 - {9ABEC5F2-F6C6-41DE-88AB-02460A07F46E}.Release|x86.Build.0 = Release|Win32 - {9ABEC5F2-F6C6-41DE-88AB-02460A07F46E}.ReleaseOMP|x64.ActiveCfg = Release|x64 - {9ABEC5F2-F6C6-41DE-88AB-02460A07F46E}.ReleaseOMP|x64.Build.0 = Release|x64 - {9ABEC5F2-F6C6-41DE-88AB-02460A07F46E}.ReleaseOMP|x86.ActiveCfg = Release|Win32 - {9ABEC5F2-F6C6-41DE-88AB-02460A07F46E}.ReleaseOMP|x86.Build.0 = Release|Win32 - {D701EA0E-B8B0-41D6-A90E-A0D8233F15FB}.console_debug|x64.ActiveCfg = Debug|x64 - {D701EA0E-B8B0-41D6-A90E-A0D8233F15FB}.console_debug|x64.Build.0 = Debug|x64 - {D701EA0E-B8B0-41D6-A90E-A0D8233F15FB}.console_debug|x86.ActiveCfg = Debug|Win32 - {D701EA0E-B8B0-41D6-A90E-A0D8233F15FB}.console_debug|x86.Build.0 = Debug|Win32 - {D701EA0E-B8B0-41D6-A90E-A0D8233F15FB}.console_release_omp|x64.ActiveCfg = Release|x64 - {D701EA0E-B8B0-41D6-A90E-A0D8233F15FB}.console_release_omp|x64.Build.0 = Release|x64 - {D701EA0E-B8B0-41D6-A90E-A0D8233F15FB}.console_release_omp|x86.ActiveCfg = Release|Win32 - {D701EA0E-B8B0-41D6-A90E-A0D8233F15FB}.console_release_omp|x86.Build.0 = Release|Win32 - {D701EA0E-B8B0-41D6-A90E-A0D8233F15FB}.console_release|x64.ActiveCfg = Release|x64 - {D701EA0E-B8B0-41D6-A90E-A0D8233F15FB}.console_release|x64.Build.0 = Release|x64 - {D701EA0E-B8B0-41D6-A90E-A0D8233F15FB}.console_release|x86.ActiveCfg = Release|Win32 - {D701EA0E-B8B0-41D6-A90E-A0D8233F15FB}.console_release|x86.Build.0 = Release|Win32 - {D701EA0E-B8B0-41D6-A90E-A0D8233F15FB}.Debug|x64.ActiveCfg = Debug|x64 - {D701EA0E-B8B0-41D6-A90E-A0D8233F15FB}.Debug|x64.Build.0 = Debug|x64 - {D701EA0E-B8B0-41D6-A90E-A0D8233F15FB}.Debug|x86.ActiveCfg = Debug|Win32 - {D701EA0E-B8B0-41D6-A90E-A0D8233F15FB}.Debug|x86.Build.0 = Debug|Win32 - {D701EA0E-B8B0-41D6-A90E-A0D8233F15FB}.Release|x64.ActiveCfg = Release|x64 - {D701EA0E-B8B0-41D6-A90E-A0D8233F15FB}.Release|x64.Build.0 = Release|x64 - {D701EA0E-B8B0-41D6-A90E-A0D8233F15FB}.Release|x86.ActiveCfg = Release|Win32 - {D701EA0E-B8B0-41D6-A90E-A0D8233F15FB}.Release|x86.Build.0 = Release|Win32 - {D701EA0E-B8B0-41D6-A90E-A0D8233F15FB}.ReleaseOMP|x64.ActiveCfg = Release|x64 - {D701EA0E-B8B0-41D6-A90E-A0D8233F15FB}.ReleaseOMP|x64.Build.0 = Release|x64 - {D701EA0E-B8B0-41D6-A90E-A0D8233F15FB}.ReleaseOMP|x86.ActiveCfg = Release|Win32 - {D701EA0E-B8B0-41D6-A90E-A0D8233F15FB}.ReleaseOMP|x86.Build.0 = Release|Win32 - {7A6473F5-AFED-4910-88D2-6204DA829832}.console_debug|x64.ActiveCfg = Debug|x64 - {7A6473F5-AFED-4910-88D2-6204DA829832}.console_debug|x64.Build.0 = Debug|x64 - {7A6473F5-AFED-4910-88D2-6204DA829832}.console_debug|x86.ActiveCfg = Debug|Win32 - {7A6473F5-AFED-4910-88D2-6204DA829832}.console_debug|x86.Build.0 = Debug|Win32 - {7A6473F5-AFED-4910-88D2-6204DA829832}.console_release_omp|x64.ActiveCfg = Release|x64 - {7A6473F5-AFED-4910-88D2-6204DA829832}.console_release_omp|x64.Build.0 = Release|x64 - {7A6473F5-AFED-4910-88D2-6204DA829832}.console_release_omp|x86.ActiveCfg = Release|Win32 - {7A6473F5-AFED-4910-88D2-6204DA829832}.console_release_omp|x86.Build.0 = Release|Win32 - {7A6473F5-AFED-4910-88D2-6204DA829832}.console_release|x64.ActiveCfg = Release|x64 - {7A6473F5-AFED-4910-88D2-6204DA829832}.console_release|x64.Build.0 = Release|x64 - {7A6473F5-AFED-4910-88D2-6204DA829832}.console_release|x86.ActiveCfg = Release|Win32 - {7A6473F5-AFED-4910-88D2-6204DA829832}.console_release|x86.Build.0 = Release|Win32 - {7A6473F5-AFED-4910-88D2-6204DA829832}.Debug|x64.ActiveCfg = Debug|x64 - {7A6473F5-AFED-4910-88D2-6204DA829832}.Debug|x64.Build.0 = Debug|x64 - {7A6473F5-AFED-4910-88D2-6204DA829832}.Debug|x86.ActiveCfg = Debug|Win32 - {7A6473F5-AFED-4910-88D2-6204DA829832}.Debug|x86.Build.0 = Debug|Win32 - {7A6473F5-AFED-4910-88D2-6204DA829832}.Release|x64.ActiveCfg = Release|x64 - {7A6473F5-AFED-4910-88D2-6204DA829832}.Release|x64.Build.0 = Release|x64 - {7A6473F5-AFED-4910-88D2-6204DA829832}.Release|x86.ActiveCfg = Release|Win32 - {7A6473F5-AFED-4910-88D2-6204DA829832}.Release|x86.Build.0 = Release|Win32 - {7A6473F5-AFED-4910-88D2-6204DA829832}.ReleaseOMP|x64.ActiveCfg = Release|x64 - {7A6473F5-AFED-4910-88D2-6204DA829832}.ReleaseOMP|x64.Build.0 = Release|x64 - {7A6473F5-AFED-4910-88D2-6204DA829832}.ReleaseOMP|x86.ActiveCfg = Release|Win32 - {7A6473F5-AFED-4910-88D2-6204DA829832}.ReleaseOMP|x86.Build.0 = Release|Win32 - {4BB60215-9A09-4192-9DB6-1A0CA823AFCA}.console_debug|x64.ActiveCfg = Debug|x64 - {4BB60215-9A09-4192-9DB6-1A0CA823AFCA}.console_debug|x64.Build.0 = Debug|x64 - {4BB60215-9A09-4192-9DB6-1A0CA823AFCA}.console_debug|x86.ActiveCfg = Debug|Win32 - {4BB60215-9A09-4192-9DB6-1A0CA823AFCA}.console_debug|x86.Build.0 = Debug|Win32 - {4BB60215-9A09-4192-9DB6-1A0CA823AFCA}.console_release_omp|x64.ActiveCfg = Release|x64 - {4BB60215-9A09-4192-9DB6-1A0CA823AFCA}.console_release_omp|x64.Build.0 = Release|x64 - {4BB60215-9A09-4192-9DB6-1A0CA823AFCA}.console_release_omp|x86.ActiveCfg = Release|Win32 - {4BB60215-9A09-4192-9DB6-1A0CA823AFCA}.console_release_omp|x86.Build.0 = Release|Win32 - {4BB60215-9A09-4192-9DB6-1A0CA823AFCA}.console_release|x64.ActiveCfg = Release|x64 - {4BB60215-9A09-4192-9DB6-1A0CA823AFCA}.console_release|x64.Build.0 = Release|x64 - {4BB60215-9A09-4192-9DB6-1A0CA823AFCA}.console_release|x86.ActiveCfg = Release|Win32 - {4BB60215-9A09-4192-9DB6-1A0CA823AFCA}.console_release|x86.Build.0 = Release|Win32 - {4BB60215-9A09-4192-9DB6-1A0CA823AFCA}.Debug|x64.ActiveCfg = Debug|x64 - {4BB60215-9A09-4192-9DB6-1A0CA823AFCA}.Debug|x64.Build.0 = Debug|x64 - {4BB60215-9A09-4192-9DB6-1A0CA823AFCA}.Debug|x86.ActiveCfg = Debug|Win32 - {4BB60215-9A09-4192-9DB6-1A0CA823AFCA}.Debug|x86.Build.0 = Debug|Win32 - {4BB60215-9A09-4192-9DB6-1A0CA823AFCA}.Release|x64.ActiveCfg = Release|x64 - {4BB60215-9A09-4192-9DB6-1A0CA823AFCA}.Release|x64.Build.0 = Release|x64 - {4BB60215-9A09-4192-9DB6-1A0CA823AFCA}.Release|x86.ActiveCfg = Release|Win32 - {4BB60215-9A09-4192-9DB6-1A0CA823AFCA}.Release|x86.Build.0 = Release|Win32 - {4BB60215-9A09-4192-9DB6-1A0CA823AFCA}.ReleaseOMP|x64.ActiveCfg = Release|x64 - {4BB60215-9A09-4192-9DB6-1A0CA823AFCA}.ReleaseOMP|x64.Build.0 = Release|x64 - {4BB60215-9A09-4192-9DB6-1A0CA823AFCA}.ReleaseOMP|x86.ActiveCfg = Release|Win32 - {4BB60215-9A09-4192-9DB6-1A0CA823AFCA}.ReleaseOMP|x86.Build.0 = Release|Win32 - {13500662-AF0B-4AB6-9AF9-BC3E07B5C1C6}.console_debug|x64.ActiveCfg = Debug|x64 - {13500662-AF0B-4AB6-9AF9-BC3E07B5C1C6}.console_debug|x64.Build.0 = Debug|x64 - {13500662-AF0B-4AB6-9AF9-BC3E07B5C1C6}.console_debug|x86.ActiveCfg = Debug|Win32 - {13500662-AF0B-4AB6-9AF9-BC3E07B5C1C6}.console_debug|x86.Build.0 = Debug|Win32 - {13500662-AF0B-4AB6-9AF9-BC3E07B5C1C6}.console_release_omp|x64.ActiveCfg = Release|x64 - {13500662-AF0B-4AB6-9AF9-BC3E07B5C1C6}.console_release_omp|x64.Build.0 = Release|x64 - {13500662-AF0B-4AB6-9AF9-BC3E07B5C1C6}.console_release_omp|x86.ActiveCfg = Release|Win32 - {13500662-AF0B-4AB6-9AF9-BC3E07B5C1C6}.console_release_omp|x86.Build.0 = Release|Win32 - {13500662-AF0B-4AB6-9AF9-BC3E07B5C1C6}.console_release|x64.ActiveCfg = Release|x64 - {13500662-AF0B-4AB6-9AF9-BC3E07B5C1C6}.console_release|x64.Build.0 = Release|x64 - {13500662-AF0B-4AB6-9AF9-BC3E07B5C1C6}.console_release|x86.ActiveCfg = Release|Win32 - {13500662-AF0B-4AB6-9AF9-BC3E07B5C1C6}.console_release|x86.Build.0 = Release|Win32 - {13500662-AF0B-4AB6-9AF9-BC3E07B5C1C6}.Debug|x64.ActiveCfg = Debug|x64 - {13500662-AF0B-4AB6-9AF9-BC3E07B5C1C6}.Debug|x64.Build.0 = Debug|x64 - {13500662-AF0B-4AB6-9AF9-BC3E07B5C1C6}.Debug|x86.ActiveCfg = Debug|Win32 - {13500662-AF0B-4AB6-9AF9-BC3E07B5C1C6}.Debug|x86.Build.0 = Debug|Win32 - {13500662-AF0B-4AB6-9AF9-BC3E07B5C1C6}.Release|x64.ActiveCfg = Release|x64 - {13500662-AF0B-4AB6-9AF9-BC3E07B5C1C6}.Release|x64.Build.0 = Release|x64 - {13500662-AF0B-4AB6-9AF9-BC3E07B5C1C6}.Release|x86.ActiveCfg = Release|Win32 - {13500662-AF0B-4AB6-9AF9-BC3E07B5C1C6}.Release|x86.Build.0 = Release|Win32 - {13500662-AF0B-4AB6-9AF9-BC3E07B5C1C6}.ReleaseOMP|x64.ActiveCfg = Release|x64 - {13500662-AF0B-4AB6-9AF9-BC3E07B5C1C6}.ReleaseOMP|x64.Build.0 = Release|x64 - {13500662-AF0B-4AB6-9AF9-BC3E07B5C1C6}.ReleaseOMP|x86.ActiveCfg = Release|Win32 - {13500662-AF0B-4AB6-9AF9-BC3E07B5C1C6}.ReleaseOMP|x86.Build.0 = Release|Win32 EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE diff --git a/visualc/vngspice.vcxproj b/visualc/vngspice.vcxproj index d709cfd23..b63abe176 100644 --- a/visualc/vngspice.vcxproj +++ b/visualc/vngspice.vcxproj @@ -311,7 +311,7 @@ Disabled ..\src\maths\poly;..\src\frontend;..\src\spicelib\devices;tmp-bison;src\include;..\src\spicelib\parser;..\src\include;..\src\include\cppduals;.;%(AdditionalIncludeDirectories) - _CRT_SECURE_NO_DEPRECATE;SIMULATOR;XSPICE;_MSC_PLATFORM_TOOLSET=$(PlatformToolsetVersion);NGDEBUG;CONFIG64;%(PreprocessorDefinitions) + _CRT_SECURE_NO_DEPRECATE;SIMULATOR;_MSC_PLATFORM_TOOLSET=$(PlatformToolsetVersion);NGDEBUG;CONFIG64;%(PreprocessorDefinitions) false @@ -363,7 +363,7 @@ Speed true ..\src\maths\poly;..\src\frontend;..\src\spicelib\devices;tmp-bison;src\include;..\src\spicelib\parser;..\src\include;..\src\include\cppduals;.;%(AdditionalIncludeDirectories) - _CRT_SECURE_NO_DEPRECATE;SIMULATOR;XSPICE;_MSC_PLATFORM_TOOLSET=$(PlatformToolsetVersion);CONFIG64;%(PreprocessorDefinitions) + _CRT_SECURE_NO_DEPRECATE;SIMULATOR;_MSC_PLATFORM_TOOLSET=$(PlatformToolsetVersion);CONFIG64;%(PreprocessorDefinitions) false @@ -563,7 +563,7 @@ Speed true ..\src\maths\poly;..\src\frontend;..\src\spicelib\devices;tmp-bison;src\include;..\src\spicelib\parser;..\src\include;..\src\include\cppduals;.;%(AdditionalIncludeDirectories) - _CRT_SECURE_NO_DEPRECATE;SIMULATOR;XSPICE;_MSC_PLATFORM_TOOLSET=$(PlatformToolsetVersion);CONSOLE;CONFIG64;%(PreprocessorDefinitions) + _CRT_SECURE_NO_DEPRECATE;SIMULATOR;_MSC_PLATFORM_TOOLSET=$(PlatformToolsetVersion);CONSOLE;CONFIG64;%(PreprocessorDefinitions) false @@ -669,7 +669,7 @@ Speed true ..\src\maths\poly;..\src\frontend;..\src\spicelib\devices;tmp-bison;src\include;..\src\spicelib\parser;..\src\include;..\src\include\cppduals;.;%(AdditionalIncludeDirectories) - _CRT_SECURE_NO_DEPRECATE;SIMULATOR;XSPICE;_MSC_PLATFORM_TOOLSET=$(PlatformToolsetVersion);USE_OMP;CONFIG64;%(PreprocessorDefinitions) + _CRT_SECURE_NO_DEPRECATE;SIMULATOR;_MSC_PLATFORM_TOOLSET=$(PlatformToolsetVersion);CONFIG64;%(PreprocessorDefinitions) false @@ -821,10 +821,6 @@ - - - - @@ -947,7 +943,6 @@ - @@ -1000,9 +995,6 @@ - - - @@ -1012,15 +1004,8 @@ - - - - - - - @@ -1029,8 +1014,6 @@ - - @@ -1056,8 +1039,6 @@ - - @@ -1092,139 +1073,21 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -1233,108 +1096,14 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -1359,78 +1128,6 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -1733,19 +1430,6 @@ - - - - - - - - - - - - - @@ -1770,251 +1454,6 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -2034,29 +1473,6 @@ - - - - - - - - - - - - - - - - - - - - - - - @@ -2064,29 +1480,6 @@ - - - - - - - - - - - - - - - - - - - - - - - @@ -2112,102 +1505,6 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -2242,79 +1539,7 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -2338,153 +1563,6 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -2501,117 +1579,6 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -2684,52 +1651,6 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -